]> git.proxmox.com Git - ceph.git/commitdiff
import ceph quincy 17.2.6
authorThomas Lamprecht <t.lamprecht@proxmox.com>
Tue, 11 Apr 2023 07:43:51 +0000 (09:43 +0200)
committerThomas Lamprecht <t.lamprecht@proxmox.com>
Tue, 11 Apr 2023 07:43:51 +0000 (09:43 +0200)
Signed-off-by: Thomas Lamprecht <t.lamprecht@proxmox.com>
1065 files changed:
ceph/.github/CODEOWNERS
ceph/.readthedocs.yml
ceph/CMakeLists.txt
ceph/CodingStyle
ceph/PendingReleaseNotes
ceph/admin/rtd-checkout-main [deleted file]
ceph/ceph.spec
ceph/ceph.spec.in
ceph/changelog.upstream
ceph/cmake/modules/BuildFIO.cmake
ceph/debian/control
ceph/doc/_static/css/custom.css
ceph/doc/architecture.rst
ceph/doc/ceph-volume/lvm/activate.rst
ceph/doc/ceph-volume/lvm/encryption.rst
ceph/doc/ceph-volume/lvm/prepare.rst
ceph/doc/cephadm/adoption.rst
ceph/doc/cephadm/compatibility.rst
ceph/doc/cephadm/host-management.rst
ceph/doc/cephadm/index.rst
ceph/doc/cephadm/install.rst
ceph/doc/cephadm/operations.rst
ceph/doc/cephadm/services/index.rst
ceph/doc/cephadm/services/monitoring.rst
ceph/doc/cephadm/services/osd.rst
ceph/doc/cephadm/services/rgw.rst
ceph/doc/cephadm/troubleshooting.rst
ceph/doc/cephadm/upgrade.rst
ceph/doc/cephfs/add-remove-mds.rst
ceph/doc/cephfs/cephfs-top.png
ceph/doc/cephfs/cephfs-top.rst
ceph/doc/cephfs/disaster-recovery-experts.rst
ceph/doc/cephfs/fs-volumes.rst
ceph/doc/cephfs/mount-using-fuse.rst
ceph/doc/cephfs/mount-using-kernel-driver.rst
ceph/doc/cephfs/posix.rst
ceph/doc/cephfs/quota.rst
ceph/doc/cephfs/scrub.rst
ceph/doc/cephfs/snap-schedule.rst
ceph/doc/dev/ceph_krb_auth.rst
ceph/doc/dev/cephadm/developing-cephadm.rst
ceph/doc/dev/cephadm/host-maintenance.rst
ceph/doc/dev/cephfs-snapshots.rst
ceph/doc/dev/deduplication.rst [deleted file]
ceph/doc/dev/developer_guide/basic-workflow.rst
ceph/doc/dev/developer_guide/dash-devel.rst
ceph/doc/dev/developer_guide/essentials.rst
ceph/doc/dev/developer_guide/testing_integration_tests/tests-integration-testing-teuthology-intro.rst
ceph/doc/dev/developer_guide/tests-unit-tests.rst
ceph/doc/dev/documenting.rst
ceph/doc/dev/object-store.rst
ceph/doc/dev/osd_internals/erasure_coding.rst
ceph/doc/glossary.rst
ceph/doc/images/zone-sync.svg
ceph/doc/index.rst
ceph/doc/install/clone-source.rst
ceph/doc/install/containers.rst
ceph/doc/install/get-packages.rst
ceph/doc/install/index.rst
ceph/doc/man/8/ceph-osd.rst
ceph/doc/man/8/ceph-rbdnamer.rst
ceph/doc/man/8/crushtool.rst
ceph/doc/man/8/mount.ceph.rst
ceph/doc/man/8/radosgw-admin.rst
ceph/doc/man/8/rbd-nbd.rst
ceph/doc/man/8/rbd.rst
ceph/doc/mgr/dashboard.rst
ceph/doc/mgr/modules.rst
ceph/doc/mgr/nfs.rst
ceph/doc/mgr/telemetry.rst
ceph/doc/rados/api/index.rst
ceph/doc/rados/api/libcephsqlite.rst
ceph/doc/rados/api/librados-intro.rst
ceph/doc/rados/api/python.rst
ceph/doc/rados/configuration/auth-config-ref.rst
ceph/doc/rados/configuration/bluestore-config-ref.rst
ceph/doc/rados/configuration/ceph-conf.rst
ceph/doc/rados/configuration/index.rst
ceph/doc/rados/configuration/mclock-config-ref.rst
ceph/doc/rados/configuration/mon-config-ref.rst
ceph/doc/rados/configuration/msgr2.rst
ceph/doc/rados/configuration/network-config-ref.rst
ceph/doc/rados/configuration/pool-pg-config-ref.rst
ceph/doc/rados/configuration/storage-devices.rst
ceph/doc/rados/operations/add-or-rm-mons.rst
ceph/doc/rados/operations/add-or-rm-osds.rst
ceph/doc/rados/operations/balancer.rst
ceph/doc/rados/operations/bluestore-migration.rst
ceph/doc/rados/operations/cache-tiering.rst
ceph/doc/rados/operations/change-mon-elections.rst
ceph/doc/rados/operations/control.rst
ceph/doc/rados/operations/crush-map-edits.rst
ceph/doc/rados/operations/crush-map.rst
ceph/doc/rados/operations/devices.rst
ceph/doc/rados/operations/erasure-code-clay.rst
ceph/doc/rados/operations/erasure-code-isa.rst
ceph/doc/rados/operations/erasure-code-jerasure.rst
ceph/doc/rados/operations/erasure-code-lrc.rst
ceph/doc/rados/operations/erasure-code-shec.rst
ceph/doc/rados/operations/erasure-code.rst
ceph/doc/rados/operations/health-checks.rst
ceph/doc/rados/operations/monitoring-osd-pg.rst
ceph/doc/rados/operations/monitoring.rst
ceph/doc/rados/operations/pg-repair.rst
ceph/doc/rados/operations/placement-groups.rst
ceph/doc/rados/operations/pools.rst
ceph/doc/rados/operations/stretch-mode.rst
ceph/doc/rados/operations/upmap.rst
ceph/doc/rados/operations/user-management.rst
ceph/doc/radosgw/STS.rst
ceph/doc/radosgw/STSLite.rst
ceph/doc/radosgw/index.rst
ceph/doc/radosgw/keycloak.rst
ceph/doc/radosgw/layout.rst
ceph/doc/radosgw/multisite-sync-policy.rst
ceph/doc/radosgw/multisite.rst
ceph/doc/radosgw/notifications.rst
ceph/doc/radosgw/placement.rst
ceph/doc/radosgw/s3.rst
ceph/doc/radosgw/session-tags.rst
ceph/doc/rbd/iscsi-initiator-linux.rst
ceph/doc/rbd/iscsi-overview.rst
ceph/doc/rbd/rados-rbd-cmds.rst
ceph/doc/rbd/rbd-exclusive-locks.rst
ceph/doc/rbd/rbd-persistent-read-only-cache.rst
ceph/doc/rbd/rbd-snapshot.rst
ceph/doc/releases/argonaut.rst [deleted file]
ceph/doc/releases/bobtail.rst [deleted file]
ceph/doc/releases/cuttlefish.rst [deleted file]
ceph/doc/releases/dumpling.rst [deleted file]
ceph/doc/releases/emperor.rst [deleted file]
ceph/doc/releases/firefly.rst [deleted file]
ceph/doc/releases/general.rst [deleted file]
ceph/doc/releases/giant.rst [deleted file]
ceph/doc/releases/hammer.rst [deleted file]
ceph/doc/releases/index.rst [deleted file]
ceph/doc/releases/infernalis.rst [deleted file]
ceph/doc/releases/jewel.rst [deleted file]
ceph/doc/releases/kraken.rst [deleted file]
ceph/doc/releases/luminous.rst [deleted file]
ceph/doc/releases/mimic.rst [deleted file]
ceph/doc/releases/nautilus.rst [deleted file]
ceph/doc/releases/octopus.rst [deleted file]
ceph/doc/releases/pacific.rst [deleted file]
ceph/doc/releases/quincy.rst [deleted file]
ceph/doc/security/CVE-2022-0670.rst [new file with mode: 0644]
ceph/doc/security/cves.rst
ceph/doc/security/index.rst
ceph/doc/start/documenting-ceph.rst
ceph/make-dist
ceph/monitoring/ceph-mixin/README.md
ceph/monitoring/ceph-mixin/dashboards/host.libsonnet
ceph/monitoring/ceph-mixin/dashboards/osd.libsonnet
ceph/monitoring/ceph-mixin/dashboards/rgw.libsonnet
ceph/monitoring/ceph-mixin/dashboards_out/ceph-cluster.json
ceph/monitoring/ceph-mixin/dashboards_out/host-details.json
ceph/monitoring/ceph-mixin/dashboards_out/osds-overview.json
ceph/monitoring/ceph-mixin/dashboards_out/radosgw-overview.json
ceph/monitoring/ceph-mixin/jsonnetfile.lock.json
ceph/monitoring/ceph-mixin/prometheus_alerts.libsonnet
ceph/monitoring/ceph-mixin/prometheus_alerts.yml
ceph/monitoring/ceph-mixin/tests_alerts/test_alerts.yml
ceph/monitoring/ceph-mixin/tests_dashboards/features/radosgw_overview.feature
ceph/monitoring/ceph-mixin/tox.ini
ceph/qa/CMakeLists.txt
ceph/qa/cephfs/overrides/ignorelist_health.yaml [new file with mode: 0644]
ceph/qa/cephfs/overrides/ignorelist_wrongly_marked_down.yaml [new file with mode: 0644]
ceph/qa/cephfs/overrides/whitelist_health.yaml [deleted file]
ceph/qa/cephfs/overrides/whitelist_wrongly_marked_down.yaml [deleted file]
ceph/qa/config/rados.yaml
ceph/qa/distros/all/ubuntu_22.04.yaml [new file with mode: 0644]
ceph/qa/distros/container-hosts/centos_8.stream_container_tools.yaml
ceph/qa/distros/container-hosts/centos_8.stream_container_tools_crun.yaml
ceph/qa/distros/container-hosts/rhel_8.4_container_tools_3.0.yaml
ceph/qa/distros/container-hosts/rhel_8.4_container_tools_rhel8.yaml
ceph/qa/distros/podman/centos_8.stream_container_tools.yaml
ceph/qa/distros/podman/rhel_8.4_container_tools_3.0.yaml
ceph/qa/distros/podman/rhel_8.4_container_tools_rhel8.yaml
ceph/qa/overrides/ignorelist_wrongly_marked_down.yaml [new file with mode: 0644]
ceph/qa/overrides/whitelist_wrongly_marked_down.yaml [deleted file]
ceph/qa/run_xfstests-obsolete.sh
ceph/qa/run_xfstests_qemu.sh
ceph/qa/standalone/ceph-helpers.sh
ceph/qa/standalone/erasure-code/test-erasure-eio.sh
ceph/qa/standalone/misc/mclock-config.sh [new file with mode: 0755]
ceph/qa/standalone/misc/test-mclock-profile-switch.sh [deleted file]
ceph/qa/standalone/mon/misc.sh
ceph/qa/standalone/mon/mon-bind.sh
ceph/qa/standalone/mon/mon-handle-forward.sh
ceph/qa/standalone/osd-backfill/osd-backfill-recovery-log.sh
ceph/qa/standalone/osd-backfill/osd-backfill-space.sh
ceph/qa/standalone/osd/osd-recovery-space.sh
ceph/qa/suites/fs/32bits/overrides/ignorelist_health.yaml [new symlink]
ceph/qa/suites/fs/32bits/overrides/ignorelist_wrongly_marked_down.yaml [new symlink]
ceph/qa/suites/fs/32bits/overrides/whitelist_health.yaml [deleted symlink]
ceph/qa/suites/fs/32bits/overrides/whitelist_wrongly_marked_down.yaml [deleted symlink]
ceph/qa/suites/fs/bugs/client_trim_caps/overrides/ignorelist_health.yaml [new symlink]
ceph/qa/suites/fs/bugs/client_trim_caps/overrides/ignorelist_wrongly_marked_down.yaml [new symlink]
ceph/qa/suites/fs/bugs/client_trim_caps/overrides/whitelist_health.yaml [deleted symlink]
ceph/qa/suites/fs/bugs/client_trim_caps/overrides/whitelist_wrongly_marked_down.yaml [deleted symlink]
ceph/qa/suites/fs/cephadm/renamevolume/overrides/ignorelist_health.yaml [new symlink]
ceph/qa/suites/fs/cephadm/renamevolume/overrides/whitelist_health.yaml [deleted symlink]
ceph/qa/suites/fs/full/overrides/ignorelist_health.yaml [new symlink]
ceph/qa/suites/fs/full/overrides/ignorelist_wrongly_marked_down.yaml [new symlink]
ceph/qa/suites/fs/full/overrides/whitelist_health.yaml [deleted symlink]
ceph/qa/suites/fs/full/overrides/whitelist_wrongly_marked_down.yaml [deleted symlink]
ceph/qa/suites/fs/functional/overrides/ignorelist_health.yaml [new symlink]
ceph/qa/suites/fs/functional/overrides/ignorelist_wrongly_marked_down.yaml [new symlink]
ceph/qa/suites/fs/functional/overrides/whitelist_health.yaml [deleted symlink]
ceph/qa/suites/fs/functional/overrides/whitelist_wrongly_marked_down.yaml [deleted symlink]
ceph/qa/suites/fs/libcephfs/overrides/ignorelist_health.yaml [new symlink]
ceph/qa/suites/fs/libcephfs/overrides/ignorelist_wrongly_marked_down.yaml [new symlink]
ceph/qa/suites/fs/libcephfs/overrides/whitelist_health.yaml [deleted symlink]
ceph/qa/suites/fs/libcephfs/overrides/whitelist_wrongly_marked_down.yaml [deleted symlink]
ceph/qa/suites/fs/mixed-clients/distro/$ [new file with mode: 0644]
ceph/qa/suites/fs/mixed-clients/distro/.qa [new symlink]
ceph/qa/suites/fs/mixed-clients/distro/centos_8.yaml [new symlink]
ceph/qa/suites/fs/mixed-clients/distro/rhel_8.yaml [new symlink]
ceph/qa/suites/fs/mixed-clients/distro/ubuntu/+ [new file with mode: 0644]
ceph/qa/suites/fs/mixed-clients/distro/ubuntu/.qa [new symlink]
ceph/qa/suites/fs/mixed-clients/distro/ubuntu/latest.yaml [new symlink]
ceph/qa/suites/fs/mixed-clients/distro/ubuntu/overrides.yaml [new file with mode: 0644]
ceph/qa/suites/fs/mixed-clients/overrides/ignorelist_health.yaml [new symlink]
ceph/qa/suites/fs/mixed-clients/overrides/ignorelist_wrongly_marked_down.yaml [new symlink]
ceph/qa/suites/fs/mixed-clients/overrides/whitelist_health.yaml [deleted symlink]
ceph/qa/suites/fs/mixed-clients/overrides/whitelist_wrongly_marked_down.yaml [deleted symlink]
ceph/qa/suites/fs/multiclient/overrides/ignorelist_health.yaml [new symlink]
ceph/qa/suites/fs/multiclient/overrides/ignorelist_wrongly_marked_down.yaml [new symlink]
ceph/qa/suites/fs/multiclient/overrides/whitelist_health.yaml [deleted symlink]
ceph/qa/suites/fs/multiclient/overrides/whitelist_wrongly_marked_down.yaml [deleted symlink]
ceph/qa/suites/fs/multifs/overrides/ignorelist_health.yaml [new symlink]
ceph/qa/suites/fs/multifs/overrides/ignorelist_wrongly_marked_down.yaml [new symlink]
ceph/qa/suites/fs/multifs/overrides/whitelist_health.yaml [deleted symlink]
ceph/qa/suites/fs/multifs/overrides/whitelist_wrongly_marked_down.yaml [deleted symlink]
ceph/qa/suites/fs/permission/overrides/ignorelist_health.yaml [new symlink]
ceph/qa/suites/fs/permission/overrides/ignorelist_wrongly_marked_down.yaml [new symlink]
ceph/qa/suites/fs/permission/overrides/whitelist_health.yaml [deleted symlink]
ceph/qa/suites/fs/permission/overrides/whitelist_wrongly_marked_down.yaml [deleted symlink]
ceph/qa/suites/fs/shell/overrides/ignorelist_health.yaml [new symlink]
ceph/qa/suites/fs/shell/overrides/ignorelist_wrongly_marked_down.yaml [new symlink]
ceph/qa/suites/fs/shell/overrides/whitelist_health.yaml [deleted symlink]
ceph/qa/suites/fs/shell/overrides/whitelist_wrongly_marked_down.yaml [deleted symlink]
ceph/qa/suites/fs/snaps/overrides/ignorelist_health.yaml [new symlink]
ceph/qa/suites/fs/snaps/overrides/ignorelist_wrongly_marked_down.yaml [new symlink]
ceph/qa/suites/fs/snaps/overrides/whitelist_health.yaml [deleted symlink]
ceph/qa/suites/fs/snaps/overrides/whitelist_wrongly_marked_down.yaml [deleted symlink]
ceph/qa/suites/fs/thrash/multifs/overrides/ignorelist_health.yaml [new symlink]
ceph/qa/suites/fs/thrash/multifs/overrides/ignorelist_wrongly_marked_down.yaml [new symlink]
ceph/qa/suites/fs/thrash/multifs/overrides/whitelist_health.yaml [deleted symlink]
ceph/qa/suites/fs/thrash/multifs/overrides/whitelist_wrongly_marked_down.yaml [deleted symlink]
ceph/qa/suites/fs/thrash/workloads/overrides/ignorelist_health.yaml [new symlink]
ceph/qa/suites/fs/thrash/workloads/overrides/ignorelist_wrongly_marked_down.yaml [new symlink]
ceph/qa/suites/fs/thrash/workloads/overrides/whitelist_health.yaml [deleted symlink]
ceph/qa/suites/fs/thrash/workloads/overrides/whitelist_wrongly_marked_down.yaml [deleted symlink]
ceph/qa/suites/fs/top/overrides/ignorelist_health.yaml [new symlink]
ceph/qa/suites/fs/top/overrides/whitelist_health.yaml [deleted symlink]
ceph/qa/suites/fs/traceless/overrides/ignorelist_health.yaml [new symlink]
ceph/qa/suites/fs/traceless/overrides/ignorelist_wrongly_marked_down.yaml [new symlink]
ceph/qa/suites/fs/traceless/overrides/whitelist_health.yaml [deleted symlink]
ceph/qa/suites/fs/traceless/overrides/whitelist_wrongly_marked_down.yaml [deleted symlink]
ceph/qa/suites/fs/upgrade/featureful_client/old_client/overrides/ignorelist_health.yaml [new symlink]
ceph/qa/suites/fs/upgrade/featureful_client/old_client/overrides/ignorelist_wrongly_marked_down.yaml [new symlink]
ceph/qa/suites/fs/upgrade/featureful_client/old_client/overrides/whitelist_health.yaml [deleted symlink]
ceph/qa/suites/fs/upgrade/featureful_client/old_client/overrides/whitelist_wrongly_marked_down.yaml [deleted symlink]
ceph/qa/suites/fs/upgrade/featureful_client/upgraded_client/overrides/ignorelist_health.yaml [new symlink]
ceph/qa/suites/fs/upgrade/featureful_client/upgraded_client/overrides/ignorelist_wrongly_marked_down.yaml [new symlink]
ceph/qa/suites/fs/upgrade/featureful_client/upgraded_client/overrides/whitelist_health.yaml [deleted symlink]
ceph/qa/suites/fs/upgrade/featureful_client/upgraded_client/overrides/whitelist_wrongly_marked_down.yaml [deleted symlink]
ceph/qa/suites/fs/upgrade/mds_upgrade_sequence/overrides/ignorelist_health.yaml [new symlink]
ceph/qa/suites/fs/upgrade/mds_upgrade_sequence/overrides/ignorelist_wrongly_marked_down.yaml [new symlink]
ceph/qa/suites/fs/upgrade/mds_upgrade_sequence/overrides/whitelist_health.yaml [deleted symlink]
ceph/qa/suites/fs/upgrade/mds_upgrade_sequence/overrides/whitelist_wrongly_marked_down.yaml [deleted symlink]
ceph/qa/suites/fs/upgrade/nofs/overrides/ignorelist_health.yaml [new symlink]
ceph/qa/suites/fs/upgrade/nofs/overrides/ignorelist_wrongly_marked_down.yaml [new symlink]
ceph/qa/suites/fs/upgrade/nofs/overrides/whitelist_health.yaml [deleted symlink]
ceph/qa/suites/fs/upgrade/nofs/overrides/whitelist_wrongly_marked_down.yaml [deleted symlink]
ceph/qa/suites/fs/upgrade/upgraded_client/.qa [new symlink]
ceph/qa/suites/fs/upgrade/upgraded_client/from_nautilus/% [new file with mode: 0644]
ceph/qa/suites/fs/upgrade/upgraded_client/from_nautilus/.qa [new symlink]
ceph/qa/suites/fs/upgrade/upgraded_client/from_nautilus/bluestore-bitmap.yaml [new symlink]
ceph/qa/suites/fs/upgrade/upgraded_client/from_nautilus/centos_latest.yaml [new symlink]
ceph/qa/suites/fs/upgrade/upgraded_client/from_nautilus/clusters/% [new file with mode: 0644]
ceph/qa/suites/fs/upgrade/upgraded_client/from_nautilus/clusters/.qa [new symlink]
ceph/qa/suites/fs/upgrade/upgraded_client/from_nautilus/clusters/1-mds-1-client-micro.yaml [new symlink]
ceph/qa/suites/fs/upgrade/upgraded_client/from_nautilus/conf [new symlink]
ceph/qa/suites/fs/upgrade/upgraded_client/from_nautilus/overrides/% [new file with mode: 0644]
ceph/qa/suites/fs/upgrade/upgraded_client/from_nautilus/overrides/.qa [new symlink]
ceph/qa/suites/fs/upgrade/upgraded_client/from_nautilus/overrides/ignorelist_health.yaml [new symlink]
ceph/qa/suites/fs/upgrade/upgraded_client/from_nautilus/overrides/ignorelist_wrongly_marked_down.yaml [new symlink]
ceph/qa/suites/fs/upgrade/upgraded_client/from_nautilus/overrides/pg-warn.yaml [new file with mode: 0644]
ceph/qa/suites/fs/upgrade/upgraded_client/from_nautilus/tasks/% [new file with mode: 0644]
ceph/qa/suites/fs/upgrade/upgraded_client/from_nautilus/tasks/.qa [new symlink]
ceph/qa/suites/fs/upgrade/upgraded_client/from_nautilus/tasks/0-nautilus.yaml [new file with mode: 0644]
ceph/qa/suites/fs/upgrade/upgraded_client/from_nautilus/tasks/1-client-upgrade.yaml [new file with mode: 0644]
ceph/qa/suites/fs/upgrade/upgraded_client/from_nautilus/tasks/2-client-sanity.yaml [new file with mode: 0644]
ceph/qa/suites/fs/verify/overrides/ignorelist_health.yaml [new symlink]
ceph/qa/suites/fs/verify/overrides/ignorelist_wrongly_marked_down.yaml [new symlink]
ceph/qa/suites/fs/verify/overrides/whitelist_health.yaml [deleted symlink]
ceph/qa/suites/fs/verify/overrides/whitelist_wrongly_marked_down.yaml [deleted symlink]
ceph/qa/suites/fs/volumes/overrides/ignorelist_health.yaml [new symlink]
ceph/qa/suites/fs/volumes/overrides/ignorelist_wrongly_marked_down.yaml [new symlink]
ceph/qa/suites/fs/volumes/overrides/whitelist_health.yaml [deleted symlink]
ceph/qa/suites/fs/volumes/overrides/whitelist_wrongly_marked_down.yaml [deleted symlink]
ceph/qa/suites/fs/workload/overrides/ignorelist_health.yaml [new symlink]
ceph/qa/suites/fs/workload/overrides/ignorelist_wrongly_marked_down.yaml [new symlink]
ceph/qa/suites/fs/workload/overrides/whitelist_health.yaml [deleted symlink]
ceph/qa/suites/fs/workload/overrides/whitelist_wrongly_marked_down.yaml [deleted symlink]
ceph/qa/suites/orch/cephadm/with-work/tasks/rotate-keys.yaml [new file with mode: 0644]
ceph/qa/suites/orch/cephadm/workunits/task/test_iscsi_pids_limit.yaml [new file with mode: 0644]
ceph/qa/suites/orch/cephadm/workunits/task/test_orch_cli_mon.yaml [new file with mode: 0644]
ceph/qa/suites/powercycle/osd/ignorelist_health.yaml [new file with mode: 0644]
ceph/qa/suites/powercycle/osd/whitelist_health.yaml [deleted file]
ceph/qa/suites/rados/dashboard/tasks/dashboard.yaml
ceph/qa/suites/rados/singleton/all/mon-auth-caps.yaml
ceph/qa/suites/rgw-multisite-upgrade/pacific-x/realm.yaml
ceph/qa/suites/rgw/cloud-transition/+ [new file with mode: 0644]
ceph/qa/suites/rgw/cloud-transition/.qa [new symlink]
ceph/qa/suites/rgw/cloud-transition/cluster.yaml [new file with mode: 0644]
ceph/qa/suites/rgw/cloud-transition/overrides.yaml [new file with mode: 0644]
ceph/qa/suites/rgw/cloud-transition/supported-random-distro$ [new symlink]
ceph/qa/suites/rgw/cloud-transition/tasks/cloud_transition_s3tests.yaml [new file with mode: 0644]
ceph/qa/suites/rgw/crypt/2-kms/barbican.yaml
ceph/qa/suites/rgw/multisite/realms/three-zone-plus-pubsub.yaml [deleted file]
ceph/qa/suites/rgw/multisite/realms/three-zones.yaml [new file with mode: 0644]
ceph/qa/suites/rgw/tempest/tasks/rgw_tempest.yaml
ceph/qa/suites/upgrade-clients/client-upgrade-quincy-reef/.qa [new symlink]
ceph/qa/suites/upgrade-clients/client-upgrade-quincy-reef/quincy-client-x/rbd/% [new file with mode: 0644]
ceph/qa/suites/upgrade-clients/client-upgrade-quincy-reef/quincy-client-x/rbd/.qa [new symlink]
ceph/qa/suites/upgrade-clients/client-upgrade-quincy-reef/quincy-client-x/rbd/0-cluster/+ [new file with mode: 0644]
ceph/qa/suites/upgrade-clients/client-upgrade-quincy-reef/quincy-client-x/rbd/0-cluster/.qa [new symlink]
ceph/qa/suites/upgrade-clients/client-upgrade-quincy-reef/quincy-client-x/rbd/0-cluster/openstack.yaml [new file with mode: 0644]
ceph/qa/suites/upgrade-clients/client-upgrade-quincy-reef/quincy-client-x/rbd/0-cluster/start.yaml [new file with mode: 0644]
ceph/qa/suites/upgrade-clients/client-upgrade-quincy-reef/quincy-client-x/rbd/1-install/.qa [new symlink]
ceph/qa/suites/upgrade-clients/client-upgrade-quincy-reef/quincy-client-x/rbd/1-install/quincy-client-x.yaml [new file with mode: 0644]
ceph/qa/suites/upgrade-clients/client-upgrade-quincy-reef/quincy-client-x/rbd/2-workload/.qa [new symlink]
ceph/qa/suites/upgrade-clients/client-upgrade-quincy-reef/quincy-client-x/rbd/2-workload/rbd_notification_tests.yaml [new file with mode: 0644]
ceph/qa/suites/upgrade-clients/client-upgrade-quincy-reef/quincy-client-x/rbd/supported/.qa [new symlink]
ceph/qa/suites/upgrade-clients/client-upgrade-quincy-reef/quincy-client-x/rbd/supported/ubuntu_20.04.yaml [new symlink]
ceph/qa/suites/upgrade/octopus-x/rgw-multisite/realm.yaml
ceph/qa/suites/upgrade/quincy-p2p/quincy-p2p-parallel/% [new file with mode: 0644]
ceph/qa/suites/upgrade/quincy-p2p/quincy-p2p-parallel/point-to-point-upgrade.yaml [new file with mode: 0644]
ceph/qa/suites/upgrade/quincy-p2p/quincy-p2p-parallel/supported-all-distro/centos_8.yaml [new symlink]
ceph/qa/suites/upgrade/quincy-p2p/quincy-p2p-parallel/supported-all-distro/ubuntu_latest.yaml [new file with mode: 0644]
ceph/qa/suites/upgrade/quincy-p2p/quincy-p2p-stress-split/% [new file with mode: 0644]
ceph/qa/suites/upgrade/quincy-p2p/quincy-p2p-stress-split/0-cluster/+ [new file with mode: 0644]
ceph/qa/suites/upgrade/quincy-p2p/quincy-p2p-stress-split/0-cluster/openstack.yaml [new file with mode: 0644]
ceph/qa/suites/upgrade/quincy-p2p/quincy-p2p-stress-split/0-cluster/start.yaml [new file with mode: 0644]
ceph/qa/suites/upgrade/quincy-p2p/quincy-p2p-stress-split/1-ceph-install/quincy.yaml [new file with mode: 0644]
ceph/qa/suites/upgrade/quincy-p2p/quincy-p2p-stress-split/1.1.short_pg_log.yaml [new file with mode: 0644]
ceph/qa/suites/upgrade/quincy-p2p/quincy-p2p-stress-split/2-partial-upgrade/firsthalf.yaml [new file with mode: 0644]
ceph/qa/suites/upgrade/quincy-p2p/quincy-p2p-stress-split/3-thrash/default.yaml [new file with mode: 0644]
ceph/qa/suites/upgrade/quincy-p2p/quincy-p2p-stress-split/4-workload/+ [new file with mode: 0644]
ceph/qa/suites/upgrade/quincy-p2p/quincy-p2p-stress-split/4-workload/fsx.yaml [new file with mode: 0644]
ceph/qa/suites/upgrade/quincy-p2p/quincy-p2p-stress-split/4-workload/radosbench.yaml [new file with mode: 0644]
ceph/qa/suites/upgrade/quincy-p2p/quincy-p2p-stress-split/4-workload/rbd-cls.yaml [new file with mode: 0644]
ceph/qa/suites/upgrade/quincy-p2p/quincy-p2p-stress-split/4-workload/rbd-import-export.yaml [new file with mode: 0644]
ceph/qa/suites/upgrade/quincy-p2p/quincy-p2p-stress-split/4-workload/rbd_api.yaml [new file with mode: 0644]
ceph/qa/suites/upgrade/quincy-p2p/quincy-p2p-stress-split/4-workload/readwrite.yaml [new file with mode: 0644]
ceph/qa/suites/upgrade/quincy-p2p/quincy-p2p-stress-split/4-workload/snaps-few-objects.yaml [new file with mode: 0644]
ceph/qa/suites/upgrade/quincy-p2p/quincy-p2p-stress-split/5-finish-upgrade.yaml [new file with mode: 0644]
ceph/qa/suites/upgrade/quincy-p2p/quincy-p2p-stress-split/6-final-workload/+ [new file with mode: 0644]
ceph/qa/suites/upgrade/quincy-p2p/quincy-p2p-stress-split/6-final-workload/rbd-python.yaml [new file with mode: 0644]
ceph/qa/suites/upgrade/quincy-p2p/quincy-p2p-stress-split/6-final-workload/snaps-many-objects.yaml [new file with mode: 0644]
ceph/qa/suites/upgrade/quincy-p2p/quincy-p2p-stress-split/objectstore/bluestore-bitmap.yaml [new file with mode: 0644]
ceph/qa/suites/upgrade/quincy-p2p/quincy-p2p-stress-split/objectstore/bluestore-comp.yaml [new file with mode: 0644]
ceph/qa/suites/upgrade/quincy-p2p/quincy-p2p-stress-split/objectstore/bluestore-stupid.yaml [new file with mode: 0644]
ceph/qa/suites/upgrade/quincy-p2p/quincy-p2p-stress-split/objectstore/filestore-xfs.yaml [new file with mode: 0644]
ceph/qa/suites/upgrade/quincy-p2p/quincy-p2p-stress-split/supported-all-distro/ubuntu_latest.yaml [new file with mode: 0644]
ceph/qa/suites/upgrade/quincy-p2p/quincy-p2p-stress-split/thrashosds-health.yaml [new file with mode: 0644]
ceph/qa/tasks/barbican.py
ceph/qa/tasks/cephadm.py
ceph/qa/tasks/cephadm_cases/test_cli_mon.py [new file with mode: 0644]
ceph/qa/tasks/cephfs/cephfs_test_case.py
ceph/qa/tasks/cephfs/filesystem.py
ceph/qa/tasks/cephfs/test_fragment.py
ceph/qa/tasks/cephfs/test_full.py
ceph/qa/tasks/cephfs/test_mds_metrics.py
ceph/qa/tasks/cephfs/test_newops.py [new file with mode: 0644]
ceph/qa/tasks/cephfs/test_nfs.py
ceph/qa/tasks/cephfs/test_scrub.py
ceph/qa/tasks/cephfs/test_scrub_checks.py
ceph/qa/tasks/cephfs/test_snap_schedules.py
ceph/qa/tasks/cephfs/test_snapshots.py
ceph/qa/tasks/cephfs/test_volumes.py
ceph/qa/tasks/cephfs/xfstests_dev.py
ceph/qa/tasks/kubeadm.py
ceph/qa/tasks/mgr/dashboard/test_rgw.py
ceph/qa/tasks/rbd_fio.py
ceph/qa/tasks/restart.py
ceph/qa/tasks/rgw.py
ceph/qa/tasks/rgw_cloudtier.py [new file with mode: 0644]
ceph/qa/tasks/rgw_multisite.py
ceph/qa/tasks/rgw_multisite_tests.py
ceph/qa/tasks/s3tests.py
ceph/qa/tox.ini
ceph/qa/valgrind.supp
ceph/qa/workunits/cephadm/test_cephadm.sh
ceph/qa/workunits/cephadm/test_iscsi_pids_limit.sh [new file with mode: 0755]
ceph/qa/workunits/cephtool/test.sh
ceph/qa/workunits/fs/snaps/snaptest-git-ceph.sh
ceph/qa/workunits/libcephfs/test.sh
ceph/qa/workunits/mon/auth_key_rotation.sh [new file with mode: 0755]
ceph/qa/workunits/rados/test_crash.sh
ceph/qa/workunits/rados/test_librados_build.sh
ceph/qa/workunits/rbd/cli_generic.sh
ceph/qa/workunits/rbd/rbd-nbd.sh
ceph/qa/workunits/rbd/rbd_groups.sh
ceph/qa/workunits/rbd/rbd_mirror_bootstrap.sh
ceph/qa/workunits/suites/ffsb.sh
ceph/qa/workunits/suites/fsx.sh
ceph/qa/workunits/windows/run-tests.ps1 [new file with mode: 0644]
ceph/qa/workunits/windows/test_rbd_wnbd.py [new file with mode: 0644]
ceph/src/.git_version
ceph/src/CMakeLists.txt
ceph/src/auth/Auth.h
ceph/src/auth/Crypto.h
ceph/src/auth/KeyRing.cc
ceph/src/auth/KeyRing.h
ceph/src/auth/cephx/CephxKeyServer.cc
ceph/src/auth/cephx/CephxKeyServer.h
ceph/src/auth/cephx/CephxServiceHandler.cc
ceph/src/ceph-crash.in
ceph/src/ceph-volume/ceph_volume/api/lvm.py
ceph/src/ceph-volume/ceph_volume/tests/functional/batch/tox.ini
ceph/src/ceph-volume/ceph_volume/tests/functional/lvm/playbooks/test_filestore.yml
ceph/src/ceph-volume/ceph_volume/tests/functional/lvm/tox.ini
ceph/src/ceph-volume/ceph_volume/tests/functional/simple/tox.ini
ceph/src/ceph-volume/ceph_volume/util/disk.py
ceph/src/ceph-volume/ceph_volume/util/encryption.py
ceph/src/ceph-volume/shell_tox.ini
ceph/src/ceph-volume/tox.ini
ceph/src/ceph_fuse.cc
ceph/src/ceph_mon.cc
ceph/src/ceph_osd.cc
ceph/src/cephadm/box/box.py
ceph/src/cephadm/cephadm
ceph/src/cephadm/tests/fixtures.py
ceph/src/cephadm/tests/test_cephadm.py
ceph/src/cephadm/tox.ini
ceph/src/client/Client.cc
ceph/src/client/Client.h
ceph/src/client/Inode.cc
ceph/src/cls/fifo/cls_fifo.cc
ceph/src/cls/fifo/cls_fifo_ops.h
ceph/src/cls/fifo/cls_fifo_types.h
ceph/src/cls/queue/cls_queue_src.cc
ceph/src/cls/rbd/cls_rbd.cc
ceph/src/cls/rgw/cls_rgw.cc
ceph/src/cls/rgw/cls_rgw_client.cc
ceph/src/cls/rgw/cls_rgw_ops.h
ceph/src/cls/rgw/cls_rgw_types.cc
ceph/src/cls/rgw/cls_rgw_types.h
ceph/src/common/OutputDataSocket.cc
ceph/src/common/admin_socket.cc
ceph/src/common/admin_socket.h
ceph/src/common/ceph_context.cc
ceph/src/common/ceph_strings.cc
ceph/src/common/options/global.yaml.in
ceph/src/common/options/mds-client.yaml.in
ceph/src/common/options/mds.yaml.in
ceph/src/common/options/osd.yaml.in
ceph/src/common/pick_address.cc
ceph/src/common/pick_address.h
ceph/src/common/subsys_types.h
ceph/src/compressor/CMakeLists.txt
ceph/src/crush/CrushTester.cc
ceph/src/crush/CrushTester.h
ceph/src/exporter/DaemonMetricCollector.cc
ceph/src/include/ceph_fs.h
ceph/src/include/rbd/librbd.h
ceph/src/include/rbd/librbd.hpp
ceph/src/librbd/AsioEngine.cc
ceph/src/librbd/Journal.cc
ceph/src/librbd/Journal.h
ceph/src/librbd/LibrbdAdminSocketHook.cc
ceph/src/librbd/LibrbdAdminSocketHook.h
ceph/src/librbd/api/Image.cc
ceph/src/librbd/cache/ObjectCacherObjectDispatch.cc
ceph/src/librbd/cache/pwl/AbstractWriteLog.cc
ceph/src/librbd/io/ImageRequest.cc
ceph/src/librbd/io/ImageRequest.h
ceph/src/librbd/librbd.cc
ceph/src/mds/CDentry.h
ceph/src/mds/CDir.cc
ceph/src/mds/CDir.h
ceph/src/mds/CInode.cc
ceph/src/mds/DamageTable.cc
ceph/src/mds/FSMap.h
ceph/src/mds/Locker.cc
ceph/src/mds/MDCache.cc
ceph/src/mds/MDCache.h
ceph/src/mds/MDLog.cc
ceph/src/mds/MDLog.h
ceph/src/mds/MDSDaemon.cc
ceph/src/mds/PurgeQueue.cc
ceph/src/mds/Server.cc
ceph/src/mds/Server.h
ceph/src/mds/cephfs_features.cc
ceph/src/mds/cephfs_features.h
ceph/src/messages/MClientCaps.h
ceph/src/messages/MDentryUnlink.h
ceph/src/messages/MMonUsedPendingKeys.h [new file with mode: 0644]
ceph/src/mgr/ActivePyModules.cc
ceph/src/mgr/ActivePyModules.h
ceph/src/mgr/BaseMgrModule.cc
ceph/src/mgr/CMakeLists.txt
ceph/src/mgr/ClusterState.cc
ceph/src/mgr/DaemonHealthMetric.h
ceph/src/mgr/DaemonServer.cc
ceph/src/mgr/Mgr.cc
ceph/src/mgr/Mgr.h
ceph/src/mon/AuthMonitor.cc
ceph/src/mon/AuthMonitor.h
ceph/src/mon/ConnectionTracker.cc
ceph/src/mon/ConnectionTracker.h
ceph/src/mon/ElectionLogic.cc
ceph/src/mon/Elector.cc
ceph/src/mon/Elector.h
ceph/src/mon/FSCommands.cc
ceph/src/mon/LogMonitor.cc
ceph/src/mon/MgrMap.h
ceph/src/mon/MonClient.cc
ceph/src/mon/MonClient.h
ceph/src/mon/MonCommands.h
ceph/src/mon/MonMap.cc
ceph/src/mon/Monitor.cc
ceph/src/mon/Monitor.h
ceph/src/mon/MonmapMonitor.cc
ceph/src/mon/OSDMonitor.cc
ceph/src/mon/OSDMonitor.h
ceph/src/mount/mount.ceph.c
ceph/src/msg/Message.cc
ceph/src/msg/Message.h
ceph/src/msg/Messenger.cc
ceph/src/msg/Messenger.h
ceph/src/msg/async/AsyncMessenger.cc
ceph/src/msg/async/AsyncMessenger.h
ceph/src/neorados/CMakeLists.txt
ceph/src/neorados/cls/fifo.cc [deleted file]
ceph/src/neorados/cls/fifo.h [deleted file]
ceph/src/os/ObjectStore.h
ceph/src/os/bluestore/Allocator.cc
ceph/src/os/bluestore/BlueFS.cc
ceph/src/os/bluestore/BlueFS.h
ceph/src/os/bluestore/BlueStore.cc
ceph/src/os/bluestore/BlueStore.h
ceph/src/os/bluestore/FreelistManager.cc
ceph/src/os/bluestore/FreelistManager.h
ceph/src/os/bluestore/bluefs_types.cc
ceph/src/os/bluestore/bluefs_types.h
ceph/src/os/memstore/MemStore.cc
ceph/src/osd/OSD.cc
ceph/src/osd/OSD.h
ceph/src/osd/OSDMapMapping.h
ceph/src/osd/PGBackend.cc
ceph/src/osd/PrimaryLogPG.h
ceph/src/osd/osd_types.h
ceph/src/osd/scheduler/OpScheduler.cc
ceph/src/osd/scheduler/OpScheduler.h
ceph/src/osd/scheduler/mClockScheduler.cc
ceph/src/osd/scheduler/mClockScheduler.h
ceph/src/osd/scrubber/pg_scrubber.cc
ceph/src/osd/scrubber/scrub_machine.cc
ceph/src/osd/scrubber/scrub_machine.h
ceph/src/osdc/Journaler.cc
ceph/src/osdc/Journaler.h
ceph/src/osdc/Objecter.cc
ceph/src/pybind/cephfs/cephfs.pyx
ceph/src/pybind/mgr/balancer/module.py
ceph/src/pybind/mgr/ceph_module.pyi
ceph/src/pybind/mgr/cephadm/agent.py
ceph/src/pybind/mgr/cephadm/inventory.py
ceph/src/pybind/mgr/cephadm/migrations.py
ceph/src/pybind/mgr/cephadm/module.py
ceph/src/pybind/mgr/cephadm/offline_watcher.py
ceph/src/pybind/mgr/cephadm/schedule.py
ceph/src/pybind/mgr/cephadm/serve.py
ceph/src/pybind/mgr/cephadm/services/cephadmservice.py
ceph/src/pybind/mgr/cephadm/services/ingress.py
ceph/src/pybind/mgr/cephadm/services/iscsi.py
ceph/src/pybind/mgr/cephadm/services/monitoring.py
ceph/src/pybind/mgr/cephadm/ssh.py
ceph/src/pybind/mgr/cephadm/templates/services/ingress/haproxy.cfg.j2
ceph/src/pybind/mgr/cephadm/templates/services/prometheus/prometheus.yml.j2
ceph/src/pybind/mgr/cephadm/tests/fixtures.py
ceph/src/pybind/mgr/cephadm/tests/test_agent.py
ceph/src/pybind/mgr/cephadm/tests/test_cephadm.py
ceph/src/pybind/mgr/cephadm/tests/test_migration.py
ceph/src/pybind/mgr/cephadm/tests/test_services.py
ceph/src/pybind/mgr/cephadm/tests/test_ssh.py
ceph/src/pybind/mgr/cephadm/tests/test_tuned_profiles.py
ceph/src/pybind/mgr/cephadm/tests/test_upgrade.py
ceph/src/pybind/mgr/cephadm/tuned_profiles.py
ceph/src/pybind/mgr/cephadm/upgrade.py
ceph/src/pybind/mgr/cephadm/utils.py
ceph/src/pybind/mgr/dashboard/ci/cephadm/bootstrap-cluster.sh
ceph/src/pybind/mgr/dashboard/ci/cephadm/ceph_cluster.yml
ceph/src/pybind/mgr/dashboard/ci/cephadm/run-cephadm-e2e-tests.sh
ceph/src/pybind/mgr/dashboard/ci/cephadm/start-cluster.sh
ceph/src/pybind/mgr/dashboard/constraints.txt
ceph/src/pybind/mgr/dashboard/controllers/_paginate.py [new file with mode: 0644]
ceph/src/pybind/mgr/dashboard/controllers/cephfs.py
ceph/src/pybind/mgr/dashboard/controllers/docs.py
ceph/src/pybind/mgr/dashboard/controllers/host.py
ceph/src/pybind/mgr/dashboard/controllers/nfs.py
ceph/src/pybind/mgr/dashboard/controllers/osd.py
ceph/src/pybind/mgr/dashboard/controllers/prometheus.py
ceph/src/pybind/mgr/dashboard/controllers/rbd.py
ceph/src/pybind/mgr/dashboard/controllers/rbd_mirroring.py
ceph/src/pybind/mgr/dashboard/controllers/rgw.py
ceph/src/pybind/mgr/dashboard/controllers/service.py
ceph/src/pybind/mgr/dashboard/frontend/.eslintrc.json [new file with mode: 0644]
ceph/src/pybind/mgr/dashboard/frontend/CMakeLists.txt
ceph/src/pybind/mgr/dashboard/frontend/angular.json
ceph/src/pybind/mgr/dashboard/frontend/cypress.json
ceph/src/pybind/mgr/dashboard/frontend/cypress/integration/a11y/dashboard.e2e-spec.ts [new file with mode: 0644]
ceph/src/pybind/mgr/dashboard/frontend/cypress/integration/a11y/navigation.e2e-spec.ts [new file with mode: 0644]
ceph/src/pybind/mgr/dashboard/frontend/cypress/integration/block/mirroring.po.ts
ceph/src/pybind/mgr/dashboard/frontend/cypress/integration/cluster/hosts.po.ts
ceph/src/pybind/mgr/dashboard/frontend/cypress/integration/cluster/osds.e2e-spec.ts
ceph/src/pybind/mgr/dashboard/frontend/cypress/integration/cluster/services.po.ts
ceph/src/pybind/mgr/dashboard/frontend/cypress/integration/common/01-global.feature.po.ts
ceph/src/pybind/mgr/dashboard/frontend/cypress/integration/orchestrator/workflow/02-create-cluster-add-host.feature
ceph/src/pybind/mgr/dashboard/frontend/cypress/integration/orchestrator/workflow/03-create-cluster-create-services.e2e-spec.ts
ceph/src/pybind/mgr/dashboard/frontend/cypress/integration/orchestrator/workflow/04-create-cluster-create-osds.e2e-spec.ts
ceph/src/pybind/mgr/dashboard/frontend/cypress/integration/orchestrator/workflow/06-cluster-check.e2e-spec.ts
ceph/src/pybind/mgr/dashboard/frontend/cypress/integration/orchestrator/workflow/08-hosts.e2e-spec.ts
ceph/src/pybind/mgr/dashboard/frontend/cypress/integration/orchestrator/workflow/09-services.e2e-spec.ts
ceph/src/pybind/mgr/dashboard/frontend/cypress/integration/orchestrator/workflow/10-nfs-exports.e2e-spec.ts
ceph/src/pybind/mgr/dashboard/frontend/cypress/integration/page-helper.po.ts
ceph/src/pybind/mgr/dashboard/frontend/cypress/integration/pools/pools.po.ts
ceph/src/pybind/mgr/dashboard/frontend/cypress/integration/ui/login.e2e-spec.ts
ceph/src/pybind/mgr/dashboard/frontend/cypress/plugins/index.js
ceph/src/pybind/mgr/dashboard/frontend/cypress/support/commands.ts
ceph/src/pybind/mgr/dashboard/frontend/cypress/support/index.ts
ceph/src/pybind/mgr/dashboard/frontend/cypress/tsconfig.json
ceph/src/pybind/mgr/dashboard/frontend/dist/en-US/281.7c1918629ff8b413cc76.js [deleted file]
ceph/src/pybind/mgr/dashboard/frontend/dist/en-US/3rdpartylicenses.txt
ceph/src/pybind/mgr/dashboard/frontend/dist/en-US/43.819b1fed46aadf1b.js [new file with mode: 0644]
ceph/src/pybind/mgr/dashboard/frontend/dist/en-US/437.7720eaff4a1def1b.js [new file with mode: 0644]
ceph/src/pybind/mgr/dashboard/frontend/dist/en-US/483.43ef92bcd845cb24eae3.js [deleted file]
ceph/src/pybind/mgr/dashboard/frontend/dist/en-US/585.7d0bcf3a0ac0c40fef3b.js [deleted file]
ceph/src/pybind/mgr/dashboard/frontend/dist/en-US/95.1ae8f43a396d3fea.js [new file with mode: 0644]
ceph/src/pybind/mgr/dashboard/frontend/dist/en-US/Ceph_Logo.487a0001b327fa7f5232.svg [deleted file]
ceph/src/pybind/mgr/dashboard/frontend/dist/en-US/Ceph_Logo.beb815b55d2e7363.svg [new file with mode: 0644]
ceph/src/pybind/mgr/dashboard/frontend/dist/en-US/ceph_background.3fbdf95cd52530d7.gif [new file with mode: 0644]
ceph/src/pybind/mgr/dashboard/frontend/dist/en-US/ceph_background.e82dd79127290ddbe8cb.gif [deleted file]
ceph/src/pybind/mgr/dashboard/frontend/dist/en-US/forkawesome-webfont.23671bdbd055fa7b.woff [new file with mode: 0644]
ceph/src/pybind/mgr/dashboard/frontend/dist/en-US/forkawesome-webfont.2dfb5f36fc148e26e398.woff [deleted file]
ceph/src/pybind/mgr/dashboard/frontend/dist/en-US/forkawesome-webfont.3217b1b06e001045.svg [new file with mode: 0644]
ceph/src/pybind/mgr/dashboard/frontend/dist/en-US/forkawesome-webfont.3b3951dce6cf5d60.ttf [new file with mode: 0644]
ceph/src/pybind/mgr/dashboard/frontend/dist/en-US/forkawesome-webfont.7c20758e3e7c7dff7c8d.woff2 [deleted file]
ceph/src/pybind/mgr/dashboard/frontend/dist/en-US/forkawesome-webfont.86541105409e56d17291.svg [deleted file]
ceph/src/pybind/mgr/dashboard/frontend/dist/en-US/forkawesome-webfont.c0fee260bb6fd5fd.eot [new file with mode: 0644]
ceph/src/pybind/mgr/dashboard/frontend/dist/en-US/forkawesome-webfont.d0a4ad9e6369d510.woff2 [new file with mode: 0644]
ceph/src/pybind/mgr/dashboard/frontend/dist/en-US/forkawesome-webfont.e182ad6df04f9177b326.eot [deleted file]
ceph/src/pybind/mgr/dashboard/frontend/dist/en-US/forkawesome-webfont.ee4d8bfd0af89fc714a2.ttf [deleted file]
ceph/src/pybind/mgr/dashboard/frontend/dist/en-US/index.html
ceph/src/pybind/mgr/dashboard/frontend/dist/en-US/main.86799889c70942fa9a19.js [deleted file]
ceph/src/pybind/mgr/dashboard/frontend/dist/en-US/main.ddd4de0999172734.js [new file with mode: 0644]
ceph/src/pybind/mgr/dashboard/frontend/dist/en-US/polyfills.2068f3f22a496426465b.js [deleted file]
ceph/src/pybind/mgr/dashboard/frontend/dist/en-US/polyfills.4b60b22744014b0b.js [new file with mode: 0644]
ceph/src/pybind/mgr/dashboard/frontend/dist/en-US/prometheus_logo.8057911d27be9bb1.svg [new file with mode: 0644]
ceph/src/pybind/mgr/dashboard/frontend/dist/en-US/prometheus_logo.8b3183e5a2db0e87bb2b.svg [deleted file]
ceph/src/pybind/mgr/dashboard/frontend/dist/en-US/runtime.4fd39655e7ea619b.js [new file with mode: 0644]
ceph/src/pybind/mgr/dashboard/frontend/dist/en-US/runtime.ab6c27cac6d7501e18e8.js [deleted file]
ceph/src/pybind/mgr/dashboard/frontend/dist/en-US/scripts.6bda3fa7e09a87cd4228.js [deleted file]
ceph/src/pybind/mgr/dashboard/frontend/dist/en-US/scripts.cfd741a72b67f696.js [new file with mode: 0644]
ceph/src/pybind/mgr/dashboard/frontend/dist/en-US/styles.8b6796664b673424.css [new file with mode: 0644]
ceph/src/pybind/mgr/dashboard/frontend/dist/en-US/styles.ffb7f665775e3c191fa3.css [deleted file]
ceph/src/pybind/mgr/dashboard/frontend/jest.config.cjs [new file with mode: 0644]
ceph/src/pybind/mgr/dashboard/frontend/package-lock.json
ceph/src/pybind/mgr/dashboard/frontend/package.json
ceph/src/pybind/mgr/dashboard/frontend/src/app/ceph/block/iscsi-tabs/iscsi-tabs.component.html
ceph/src/pybind/mgr/dashboard/frontend/src/app/ceph/block/iscsi-tabs/iscsi-tabs.component.ts
ceph/src/pybind/mgr/dashboard/frontend/src/app/ceph/block/iscsi-target-discovery-modal/iscsi-target-discovery-modal.component.html
ceph/src/pybind/mgr/dashboard/frontend/src/app/ceph/block/iscsi-target-form/iscsi-target-form.component.html
ceph/src/pybind/mgr/dashboard/frontend/src/app/ceph/block/iscsi-target-form/iscsi-target-form.component.ts
ceph/src/pybind/mgr/dashboard/frontend/src/app/ceph/block/iscsi-target-image-settings-modal/iscsi-target-image-settings-modal.component.html
ceph/src/pybind/mgr/dashboard/frontend/src/app/ceph/block/iscsi/iscsi.component.html
ceph/src/pybind/mgr/dashboard/frontend/src/app/ceph/block/mirroring/bootstrap-create-modal/bootstrap-create-modal.component.html
ceph/src/pybind/mgr/dashboard/frontend/src/app/ceph/block/mirroring/image-list/image-list.component.html
ceph/src/pybind/mgr/dashboard/frontend/src/app/ceph/block/mirroring/mirroring.module.ts
ceph/src/pybind/mgr/dashboard/frontend/src/app/ceph/block/mirroring/overview/overview.component.html
ceph/src/pybind/mgr/dashboard/frontend/src/app/ceph/block/mirroring/overview/overview.component.ts
ceph/src/pybind/mgr/dashboard/frontend/src/app/ceph/block/mirroring/pool-edit-mode-modal/pool-edit-mode-modal.component.html
ceph/src/pybind/mgr/dashboard/frontend/src/app/ceph/block/mirroring/pool-list/pool-list.component.html
ceph/src/pybind/mgr/dashboard/frontend/src/app/ceph/block/mirroring/pool-list/pool-list.component.ts
ceph/src/pybind/mgr/dashboard/frontend/src/app/ceph/block/rbd-configuration-form/rbd-configuration-form.component.html
ceph/src/pybind/mgr/dashboard/frontend/src/app/ceph/block/rbd-details/rbd-details.component.html
ceph/src/pybind/mgr/dashboard/frontend/src/app/ceph/block/rbd-form/rbd-form.component.html
ceph/src/pybind/mgr/dashboard/frontend/src/app/ceph/block/rbd-form/rbd-form.component.spec.ts
ceph/src/pybind/mgr/dashboard/frontend/src/app/ceph/block/rbd-form/rbd-form.component.ts
ceph/src/pybind/mgr/dashboard/frontend/src/app/ceph/block/rbd-list/rbd-list.component.html
ceph/src/pybind/mgr/dashboard/frontend/src/app/ceph/block/rbd-list/rbd-list.component.ts
ceph/src/pybind/mgr/dashboard/frontend/src/app/ceph/block/rbd-namespace-form/rbd-namespace-form-modal.component.html
ceph/src/pybind/mgr/dashboard/frontend/src/app/ceph/block/rbd-performance/rbd-performance.component.html
ceph/src/pybind/mgr/dashboard/frontend/src/app/ceph/block/rbd-snapshot-list/rbd-snapshot-list.component.spec.ts
ceph/src/pybind/mgr/dashboard/frontend/src/app/ceph/block/rbd-snapshot-list/rbd-snapshot-list.component.ts
ceph/src/pybind/mgr/dashboard/frontend/src/app/ceph/block/rbd-tabs/rbd-tabs.component.html
ceph/src/pybind/mgr/dashboard/frontend/src/app/ceph/block/rbd-tabs/rbd-tabs.component.ts
ceph/src/pybind/mgr/dashboard/frontend/src/app/ceph/cephfs/cephfs-detail/cephfs-detail.component.html
ceph/src/pybind/mgr/dashboard/frontend/src/app/ceph/cephfs/cephfs-directories/cephfs-directories.component.html
ceph/src/pybind/mgr/dashboard/frontend/src/app/ceph/cephfs/cephfs-directories/cephfs-directories.component.ts
ceph/src/pybind/mgr/dashboard/frontend/src/app/ceph/cephfs/cephfs-tabs/cephfs-tabs.component.html
ceph/src/pybind/mgr/dashboard/frontend/src/app/ceph/cluster/configuration/configuration-details/configuration-details.component.html
ceph/src/pybind/mgr/dashboard/frontend/src/app/ceph/cluster/configuration/configuration-form/configuration-form.component.html
ceph/src/pybind/mgr/dashboard/frontend/src/app/ceph/cluster/configuration/configuration-form/configuration-form.component.spec.ts
ceph/src/pybind/mgr/dashboard/frontend/src/app/ceph/cluster/create-cluster/create-cluster.component.html
ceph/src/pybind/mgr/dashboard/frontend/src/app/ceph/cluster/hosts/host-details/host-details.component.html
ceph/src/pybind/mgr/dashboard/frontend/src/app/ceph/cluster/hosts/hosts.component.html
ceph/src/pybind/mgr/dashboard/frontend/src/app/ceph/cluster/hosts/hosts.component.spec.ts
ceph/src/pybind/mgr/dashboard/frontend/src/app/ceph/cluster/hosts/hosts.component.ts
ceph/src/pybind/mgr/dashboard/frontend/src/app/ceph/cluster/inventory/inventory-devices/inventory-devices.component.spec.ts
ceph/src/pybind/mgr/dashboard/frontend/src/app/ceph/cluster/inventory/inventory-devices/inventory-devices.component.ts
ceph/src/pybind/mgr/dashboard/frontend/src/app/ceph/cluster/logs/logs.component.html
ceph/src/pybind/mgr/dashboard/frontend/src/app/ceph/cluster/mgr-modules/mgr-module-form/mgr-module-form.component.html
ceph/src/pybind/mgr/dashboard/frontend/src/app/ceph/cluster/monitor/monitor.component.html
ceph/src/pybind/mgr/dashboard/frontend/src/app/ceph/cluster/osd/osd-details/osd-details.component.html
ceph/src/pybind/mgr/dashboard/frontend/src/app/ceph/cluster/osd/osd-devices-selection-groups/osd-devices-selection-groups.component.html
ceph/src/pybind/mgr/dashboard/frontend/src/app/ceph/cluster/osd/osd-devices-selection-groups/osd-devices-selection-groups.component.ts
ceph/src/pybind/mgr/dashboard/frontend/src/app/ceph/cluster/osd/osd-devices-selection-modal/osd-devices-selection-modal.component.html
ceph/src/pybind/mgr/dashboard/frontend/src/app/ceph/cluster/osd/osd-devices-selection-modal/osd-devices-selection-modal.component.ts
ceph/src/pybind/mgr/dashboard/frontend/src/app/ceph/cluster/osd/osd-flags-indiv-modal/osd-flags-indiv-modal.component.html
ceph/src/pybind/mgr/dashboard/frontend/src/app/ceph/cluster/osd/osd-form/osd-form.component.html
ceph/src/pybind/mgr/dashboard/frontend/src/app/ceph/cluster/osd/osd-form/osd-form.component.ts
ceph/src/pybind/mgr/dashboard/frontend/src/app/ceph/cluster/osd/osd-list/osd-list.component.html
ceph/src/pybind/mgr/dashboard/frontend/src/app/ceph/cluster/osd/osd-list/osd-list.component.ts
ceph/src/pybind/mgr/dashboard/frontend/src/app/ceph/cluster/osd/osd-recv-speed-modal/osd-recv-speed-modal.component.html
ceph/src/pybind/mgr/dashboard/frontend/src/app/ceph/cluster/prometheus/active-alert-list/active-alert-list.component.ts
ceph/src/pybind/mgr/dashboard/frontend/src/app/ceph/cluster/prometheus/prometheus-tabs/prometheus-tabs.component.html
ceph/src/pybind/mgr/dashboard/frontend/src/app/ceph/cluster/prometheus/prometheus-tabs/prometheus-tabs.component.ts
ceph/src/pybind/mgr/dashboard/frontend/src/app/ceph/cluster/prometheus/rules-list/rules-list.component.ts
ceph/src/pybind/mgr/dashboard/frontend/src/app/ceph/cluster/prometheus/silence-form/silence-form.component.html
ceph/src/pybind/mgr/dashboard/frontend/src/app/ceph/cluster/prometheus/silence-form/silence-form.component.spec.ts
ceph/src/pybind/mgr/dashboard/frontend/src/app/ceph/cluster/prometheus/silence-form/silence-form.component.ts
ceph/src/pybind/mgr/dashboard/frontend/src/app/ceph/cluster/prometheus/silence-list/silence-list.component.spec.ts
ceph/src/pybind/mgr/dashboard/frontend/src/app/ceph/cluster/prometheus/silence-list/silence-list.component.ts
ceph/src/pybind/mgr/dashboard/frontend/src/app/ceph/cluster/prometheus/silence-matcher-modal/silence-matcher-modal.component.html
ceph/src/pybind/mgr/dashboard/frontend/src/app/ceph/cluster/services/service-daemon-list/service-daemon-list.component.html
ceph/src/pybind/mgr/dashboard/frontend/src/app/ceph/cluster/services/service-daemon-list/service-daemon-list.component.spec.ts
ceph/src/pybind/mgr/dashboard/frontend/src/app/ceph/cluster/services/service-daemon-list/service-daemon-list.component.ts
ceph/src/pybind/mgr/dashboard/frontend/src/app/ceph/cluster/services/service-form/service-form.component.html
ceph/src/pybind/mgr/dashboard/frontend/src/app/ceph/cluster/services/service-form/service-form.component.spec.ts
ceph/src/pybind/mgr/dashboard/frontend/src/app/ceph/cluster/services/service-form/service-form.component.ts
ceph/src/pybind/mgr/dashboard/frontend/src/app/ceph/cluster/services/services.component.html
ceph/src/pybind/mgr/dashboard/frontend/src/app/ceph/cluster/services/services.component.spec.ts
ceph/src/pybind/mgr/dashboard/frontend/src/app/ceph/cluster/services/services.component.ts
ceph/src/pybind/mgr/dashboard/frontend/src/app/ceph/dashboard/dashboard/dashboard.component.html
ceph/src/pybind/mgr/dashboard/frontend/src/app/ceph/dashboard/dashboard/dashboard.component.scss
ceph/src/pybind/mgr/dashboard/frontend/src/app/ceph/dashboard/health-pie/health-pie.component.html
ceph/src/pybind/mgr/dashboard/frontend/src/app/ceph/dashboard/health/health.component.html
ceph/src/pybind/mgr/dashboard/frontend/src/app/ceph/dashboard/health/health.component.scss
ceph/src/pybind/mgr/dashboard/frontend/src/app/ceph/dashboard/health/health.component.spec.ts
ceph/src/pybind/mgr/dashboard/frontend/src/app/ceph/dashboard/info-card/info-card-popover.scss
ceph/src/pybind/mgr/dashboard/frontend/src/app/ceph/dashboard/info-card/info-card.component.scss
ceph/src/pybind/mgr/dashboard/frontend/src/app/ceph/dashboard/info-group/info-group.component.html
ceph/src/pybind/mgr/dashboard/frontend/src/app/ceph/dashboard/info-group/info-group.component.scss
ceph/src/pybind/mgr/dashboard/frontend/src/app/ceph/dashboard/info-group/info-group.component.spec.ts
ceph/src/pybind/mgr/dashboard/frontend/src/app/ceph/nfs/nfs-details/nfs-details.component.html
ceph/src/pybind/mgr/dashboard/frontend/src/app/ceph/nfs/nfs-details/nfs-details.component.spec.ts
ceph/src/pybind/mgr/dashboard/frontend/src/app/ceph/nfs/nfs-form-client/nfs-form-client.component.html
ceph/src/pybind/mgr/dashboard/frontend/src/app/ceph/nfs/nfs-form/nfs-form.component.html
ceph/src/pybind/mgr/dashboard/frontend/src/app/ceph/pool/crush-rule-form-modal/crush-rule-form-modal.component.html
ceph/src/pybind/mgr/dashboard/frontend/src/app/ceph/pool/erasure-code-profile-form/erasure-code-profile-form-modal.component.html
ceph/src/pybind/mgr/dashboard/frontend/src/app/ceph/pool/pool-details/pool-details.component.html
ceph/src/pybind/mgr/dashboard/frontend/src/app/ceph/pool/pool-form/pool-form.component.html
ceph/src/pybind/mgr/dashboard/frontend/src/app/ceph/pool/pool-list/pool-list.component.html
ceph/src/pybind/mgr/dashboard/frontend/src/app/ceph/rgw/models/rgw-bucket-encryption.ts [new file with mode: 0644]
ceph/src/pybind/mgr/dashboard/frontend/src/app/ceph/rgw/rgw-bucket-details/rgw-bucket-details.component.html
ceph/src/pybind/mgr/dashboard/frontend/src/app/ceph/rgw/rgw-bucket-form/rgw-bucket-form.component.html
ceph/src/pybind/mgr/dashboard/frontend/src/app/ceph/rgw/rgw-bucket-form/rgw-bucket-form.component.ts
ceph/src/pybind/mgr/dashboard/frontend/src/app/ceph/rgw/rgw-config-modal/rgw-config-modal.component.html [new file with mode: 0644]
ceph/src/pybind/mgr/dashboard/frontend/src/app/ceph/rgw/rgw-config-modal/rgw-config-modal.component.scss [new file with mode: 0644]
ceph/src/pybind/mgr/dashboard/frontend/src/app/ceph/rgw/rgw-config-modal/rgw-config-modal.component.spec.ts [new file with mode: 0644]
ceph/src/pybind/mgr/dashboard/frontend/src/app/ceph/rgw/rgw-config-modal/rgw-config-modal.component.ts [new file with mode: 0644]
ceph/src/pybind/mgr/dashboard/frontend/src/app/ceph/rgw/rgw-daemon-details/rgw-daemon-details.component.html
ceph/src/pybind/mgr/dashboard/frontend/src/app/ceph/rgw/rgw-daemon-list/rgw-daemon-list.component.html
ceph/src/pybind/mgr/dashboard/frontend/src/app/ceph/rgw/rgw-daemon-list/rgw-daemon-list.component.spec.ts
ceph/src/pybind/mgr/dashboard/frontend/src/app/ceph/rgw/rgw-user-capability-modal/rgw-user-capability-modal.component.html
ceph/src/pybind/mgr/dashboard/frontend/src/app/ceph/rgw/rgw-user-details/rgw-user-details.component.html
ceph/src/pybind/mgr/dashboard/frontend/src/app/ceph/rgw/rgw-user-form/rgw-user-form.component.html
ceph/src/pybind/mgr/dashboard/frontend/src/app/ceph/rgw/rgw-user-s3-key-modal/rgw-user-s3-key-modal.component.html
ceph/src/pybind/mgr/dashboard/frontend/src/app/ceph/rgw/rgw-user-subuser-modal/rgw-user-subuser-modal.component.html
ceph/src/pybind/mgr/dashboard/frontend/src/app/ceph/rgw/rgw-user-swift-key-modal/rgw-user-swift-key-modal.component.html
ceph/src/pybind/mgr/dashboard/frontend/src/app/ceph/rgw/rgw.module.ts
ceph/src/pybind/mgr/dashboard/frontend/src/app/ceph/shared/device-list/device-list.component.html
ceph/src/pybind/mgr/dashboard/frontend/src/app/ceph/shared/device-list/device-list.component.ts
ceph/src/pybind/mgr/dashboard/frontend/src/app/ceph/shared/feedback/feedback.component.html
ceph/src/pybind/mgr/dashboard/frontend/src/app/ceph/shared/smart-list/smart-list.component.html
ceph/src/pybind/mgr/dashboard/frontend/src/app/core/auth/login-password-form/login-password-form.component.html
ceph/src/pybind/mgr/dashboard/frontend/src/app/core/auth/login/login.component.html
ceph/src/pybind/mgr/dashboard/frontend/src/app/core/auth/login/login.component.scss
ceph/src/pybind/mgr/dashboard/frontend/src/app/core/auth/user-form/user-form.component.html
ceph/src/pybind/mgr/dashboard/frontend/src/app/core/auth/user-password-form/user-password-form.component.html
ceph/src/pybind/mgr/dashboard/frontend/src/app/core/auth/user-tabs/user-tabs.component.html
ceph/src/pybind/mgr/dashboard/frontend/src/app/core/context/context.component.html
ceph/src/pybind/mgr/dashboard/frontend/src/app/core/layouts/login-layout/login-layout.component.scss
ceph/src/pybind/mgr/dashboard/frontend/src/app/core/navigation/about/about.component.html
ceph/src/pybind/mgr/dashboard/frontend/src/app/core/navigation/administration/administration.component.html
ceph/src/pybind/mgr/dashboard/frontend/src/app/core/navigation/dashboard-help/dashboard-help.component.html
ceph/src/pybind/mgr/dashboard/frontend/src/app/core/navigation/identity/identity.component.html
ceph/src/pybind/mgr/dashboard/frontend/src/app/core/navigation/navigation/navigation.component.html
ceph/src/pybind/mgr/dashboard/frontend/src/app/core/navigation/navigation/navigation.component.scss
ceph/src/pybind/mgr/dashboard/frontend/src/app/core/navigation/navigation/navigation.component.spec.ts
ceph/src/pybind/mgr/dashboard/frontend/src/app/core/navigation/navigation/navigation.component.ts
ceph/src/pybind/mgr/dashboard/frontend/src/app/core/navigation/notifications/notifications.component.scss
ceph/src/pybind/mgr/dashboard/frontend/src/app/shared/api/ceph-service.service.ts
ceph/src/pybind/mgr/dashboard/frontend/src/app/shared/api/host.service.ts
ceph/src/pybind/mgr/dashboard/frontend/src/app/shared/api/osd.service.ts
ceph/src/pybind/mgr/dashboard/frontend/src/app/shared/api/paginate.model.ts [new file with mode: 0644]
ceph/src/pybind/mgr/dashboard/frontend/src/app/shared/api/rbd-mirroring.service.ts
ceph/src/pybind/mgr/dashboard/frontend/src/app/shared/api/rgw-bucket.service.spec.ts
ceph/src/pybind/mgr/dashboard/frontend/src/app/shared/api/rgw-bucket.service.ts
ceph/src/pybind/mgr/dashboard/frontend/src/app/shared/components/cd-label/cd-label.component.html [new file with mode: 0644]
ceph/src/pybind/mgr/dashboard/frontend/src/app/shared/components/cd-label/cd-label.component.scss [new file with mode: 0644]
ceph/src/pybind/mgr/dashboard/frontend/src/app/shared/components/cd-label/cd-label.component.spec.ts [new file with mode: 0644]
ceph/src/pybind/mgr/dashboard/frontend/src/app/shared/components/cd-label/cd-label.component.ts [new file with mode: 0644]
ceph/src/pybind/mgr/dashboard/frontend/src/app/shared/components/cd-label/color-class-from-text.pipe.ts [new file with mode: 0644]
ceph/src/pybind/mgr/dashboard/frontend/src/app/shared/components/components.module.ts
ceph/src/pybind/mgr/dashboard/frontend/src/app/shared/components/config-option/config-option.component.html
ceph/src/pybind/mgr/dashboard/frontend/src/app/shared/components/form-modal/form-modal.component.html
ceph/src/pybind/mgr/dashboard/frontend/src/app/shared/components/grafana/grafana.component.html
ceph/src/pybind/mgr/dashboard/frontend/src/app/shared/components/grafana/grafana.component.spec.ts
ceph/src/pybind/mgr/dashboard/frontend/src/app/shared/components/grafana/grafana.component.ts
ceph/src/pybind/mgr/dashboard/frontend/src/app/shared/components/helper/helper.component.html
ceph/src/pybind/mgr/dashboard/frontend/src/app/shared/components/helper/helper.component.ts
ceph/src/pybind/mgr/dashboard/frontend/src/app/shared/components/language-selector/language-selector.component.html
ceph/src/pybind/mgr/dashboard/frontend/src/app/shared/components/loading-panel/loading-panel.component.html
ceph/src/pybind/mgr/dashboard/frontend/src/app/shared/components/modal/modal.component.html
ceph/src/pybind/mgr/dashboard/frontend/src/app/shared/components/notifications-sidebar/notifications-sidebar.component.html
ceph/src/pybind/mgr/dashboard/frontend/src/app/shared/components/notifications-sidebar/notifications-sidebar.component.scss
ceph/src/pybind/mgr/dashboard/frontend/src/app/shared/components/notifications-sidebar/notifications-sidebar.component.spec.ts
ceph/src/pybind/mgr/dashboard/frontend/src/app/shared/components/notifications-sidebar/notifications-sidebar.component.ts
ceph/src/pybind/mgr/dashboard/frontend/src/app/shared/components/refresh-selector/refresh-selector.component.html
ceph/src/pybind/mgr/dashboard/frontend/src/app/shared/components/select-badges/select-badges.component.html
ceph/src/pybind/mgr/dashboard/frontend/src/app/shared/components/select/select.component.html
ceph/src/pybind/mgr/dashboard/frontend/src/app/shared/components/telemetry-notification/telemetry-notification.component.scss
ceph/src/pybind/mgr/dashboard/frontend/src/app/shared/components/usage-bar/usage-bar.component.html
ceph/src/pybind/mgr/dashboard/frontend/src/app/shared/components/usage-bar/usage-bar.component.ts
ceph/src/pybind/mgr/dashboard/frontend/src/app/shared/datatable/datatable.module.ts
ceph/src/pybind/mgr/dashboard/frontend/src/app/shared/datatable/table-actions/table-actions.component.html
ceph/src/pybind/mgr/dashboard/frontend/src/app/shared/datatable/table-actions/table-actions.component.scss
ceph/src/pybind/mgr/dashboard/frontend/src/app/shared/datatable/table-key-value/table-key-value.component.spec.ts
ceph/src/pybind/mgr/dashboard/frontend/src/app/shared/datatable/table-pagination/table-pagination.component.html [new file with mode: 0644]
ceph/src/pybind/mgr/dashboard/frontend/src/app/shared/datatable/table-pagination/table-pagination.component.scss [new file with mode: 0644]
ceph/src/pybind/mgr/dashboard/frontend/src/app/shared/datatable/table-pagination/table-pagination.component.spec.ts [new file with mode: 0644]
ceph/src/pybind/mgr/dashboard/frontend/src/app/shared/datatable/table-pagination/table-pagination.component.ts [new file with mode: 0644]
ceph/src/pybind/mgr/dashboard/frontend/src/app/shared/datatable/table/table.component.html
ceph/src/pybind/mgr/dashboard/frontend/src/app/shared/datatable/table/table.component.scss
ceph/src/pybind/mgr/dashboard/frontend/src/app/shared/datatable/table/table.component.spec.ts
ceph/src/pybind/mgr/dashboard/frontend/src/app/shared/datatable/table/table.component.ts
ceph/src/pybind/mgr/dashboard/frontend/src/app/shared/directives/auth-storage.directive.ts
ceph/src/pybind/mgr/dashboard/frontend/src/app/shared/directives/autofocus.directive.ts
ceph/src/pybind/mgr/dashboard/frontend/src/app/shared/directives/form-loading.directive.spec.ts
ceph/src/pybind/mgr/dashboard/frontend/src/app/shared/directives/form-loading.directive.ts
ceph/src/pybind/mgr/dashboard/frontend/src/app/shared/directives/ng-bootstrap-form-validation/cd-form-control.directive.ts
ceph/src/pybind/mgr/dashboard/frontend/src/app/shared/directives/ng-bootstrap-form-validation/cd-form-group.directive.ts
ceph/src/pybind/mgr/dashboard/frontend/src/app/shared/directives/ng-bootstrap-form-validation/cd-form-validation.directive.ts
ceph/src/pybind/mgr/dashboard/frontend/src/app/shared/enum/health-label.enum.ts [new file with mode: 0644]
ceph/src/pybind/mgr/dashboard/frontend/src/app/shared/enum/icons.enum.ts
ceph/src/pybind/mgr/dashboard/frontend/src/app/shared/models/alertmanager-silence.ts
ceph/src/pybind/mgr/dashboard/frontend/src/app/shared/models/cd-notification.ts
ceph/src/pybind/mgr/dashboard/frontend/src/app/shared/models/cd-table-fetch-data-context.ts
ceph/src/pybind/mgr/dashboard/frontend/src/app/shared/models/devices.ts
ceph/src/pybind/mgr/dashboard/frontend/src/app/shared/pipes/health-label.pipe.spec.ts [new file with mode: 0644]
ceph/src/pybind/mgr/dashboard/frontend/src/app/shared/pipes/health-label.pipe.ts [new file with mode: 0644]
ceph/src/pybind/mgr/dashboard/frontend/src/app/shared/pipes/pipes.module.ts
ceph/src/pybind/mgr/dashboard/frontend/src/app/shared/services/notification.service.spec.ts
ceph/src/pybind/mgr/dashboard/frontend/src/app/shared/services/notification.service.ts
ceph/src/pybind/mgr/dashboard/frontend/src/app/shared/services/prometheus-silence-matcher.service.ts
ceph/src/pybind/mgr/dashboard/frontend/src/main.ts
ceph/src/pybind/mgr/dashboard/frontend/src/polyfills.ts
ceph/src/pybind/mgr/dashboard/frontend/src/setupJest.ts
ceph/src/pybind/mgr/dashboard/frontend/src/styles.scss
ceph/src/pybind/mgr/dashboard/frontend/src/styles/bootstrap-extends.scss
ceph/src/pybind/mgr/dashboard/frontend/src/styles/ceph-custom/_basics.scss
ceph/src/pybind/mgr/dashboard/frontend/src/styles/ceph-custom/_buttons.scss
ceph/src/pybind/mgr/dashboard/frontend/src/styles/ceph-custom/_forms.scss
ceph/src/pybind/mgr/dashboard/frontend/src/styles/defaults/_bootstrap-defaults.scss
ceph/src/pybind/mgr/dashboard/frontend/src/testing/unit-test-helper.ts
ceph/src/pybind/mgr/dashboard/frontend/tsconfig.json
ceph/src/pybind/mgr/dashboard/frontend/tslint.json [deleted file]
ceph/src/pybind/mgr/dashboard/module.py
ceph/src/pybind/mgr/dashboard/openapi.yaml
ceph/src/pybind/mgr/dashboard/services/_paginate.py [new file with mode: 0644]
ceph/src/pybind/mgr/dashboard/services/ceph_service.py
ceph/src/pybind/mgr/dashboard/services/orchestrator.py
ceph/src/pybind/mgr/dashboard/services/rbd.py
ceph/src/pybind/mgr/dashboard/services/rgw_client.py
ceph/src/pybind/mgr/dashboard/services/tcmu_service.py
ceph/src/pybind/mgr/dashboard/tests/__init__.py
ceph/src/pybind/mgr/dashboard/tests/test_host.py
ceph/src/pybind/mgr/dashboard/tests/test_rbd_mirroring.py
ceph/src/pybind/mgr/dashboard/tox.ini
ceph/src/pybind/mgr/mgr_module.py
ceph/src/pybind/mgr/mgr_util.py
ceph/src/pybind/mgr/nfs/cluster.py
ceph/src/pybind/mgr/nfs/export.py
ceph/src/pybind/mgr/nfs/ganesha_conf.py
ceph/src/pybind/mgr/nfs/module.py
ceph/src/pybind/mgr/nfs/tests/test_nfs.py
ceph/src/pybind/mgr/object_format.py
ceph/src/pybind/mgr/orchestrator/_interface.py
ceph/src/pybind/mgr/orchestrator/module.py
ceph/src/pybind/mgr/pg_autoscaler/module.py
ceph/src/pybind/mgr/pg_autoscaler/tests/test_cal_final_pg_target.py
ceph/src/pybind/mgr/pg_autoscaler/tests/test_overlapping_roots.py
ceph/src/pybind/mgr/progress/test_progress.py
ceph/src/pybind/mgr/prometheus/module.py
ceph/src/pybind/mgr/rbd_support/mirror_snapshot_schedule.py
ceph/src/pybind/mgr/rbd_support/schedule.py
ceph/src/pybind/mgr/rbd_support/task.py
ceph/src/pybind/mgr/rbd_support/trash_purge_schedule.py
ceph/src/pybind/mgr/requirements-required.txt
ceph/src/pybind/mgr/rook/rook_cluster.py
ceph/src/pybind/mgr/snap_schedule/fs/schedule_client.py
ceph/src/pybind/mgr/snap_schedule/module.py
ceph/src/pybind/mgr/stats/fs/perf_stats.py
ceph/src/pybind/mgr/telemetry/module.py
ceph/src/pybind/mgr/test_orchestrator/dummy_data.json
ceph/src/pybind/mgr/tests/test_object_format.py
ceph/src/pybind/mgr/tox.ini
ceph/src/pybind/mgr/volumes/fs/volume.py
ceph/src/pybind/mgr/volumes/module.py
ceph/src/python-common/ceph/deployment/drive_group.py
ceph/src/python-common/ceph/deployment/drive_selection/matchers.py
ceph/src/python-common/ceph/deployment/drive_selection/selector.py
ceph/src/python-common/ceph/deployment/hostspec.py
ceph/src/python-common/ceph/deployment/inventory.py
ceph/src/python-common/ceph/deployment/service_spec.py
ceph/src/python-common/ceph/deployment/translate.py
ceph/src/python-common/ceph/tests/test_disk_selector.py
ceph/src/python-common/ceph/tests/test_drive_group.py
ceph/src/python-common/ceph/tests/test_inventory.py
ceph/src/python-common/ceph/tests/test_service_spec.py
ceph/src/rgw/CMakeLists.txt
ceph/src/rgw/cls_fifo_legacy.cc
ceph/src/rgw/cls_fifo_legacy.h
ceph/src/rgw/librgw.cc
ceph/src/rgw/rgw_admin.cc
ceph/src/rgw/rgw_asio_client.cc
ceph/src/rgw/rgw_asio_client.h
ceph/src/rgw/rgw_asio_frontend.cc
ceph/src/rgw/rgw_asio_frontend_timer.h
ceph/src/rgw/rgw_auth_s3.cc
ceph/src/rgw/rgw_auth_s3.h
ceph/src/rgw/rgw_bucket.cc
ceph/src/rgw/rgw_bucket.h
ceph/src/rgw/rgw_common.cc
ceph/src/rgw/rgw_common.h
ceph/src/rgw/rgw_coroutine.cc
ceph/src/rgw/rgw_coroutine.h
ceph/src/rgw/rgw_gc.cc
ceph/src/rgw/rgw_gc.h
ceph/src/rgw/rgw_lc.cc
ceph/src/rgw/rgw_lc_tier.cc
ceph/src/rgw/rgw_lc_tier.h
ceph/src/rgw/rgw_log.cc
ceph/src/rgw/rgw_log.h
ceph/src/rgw/rgw_lua_request.cc
ceph/src/rgw/rgw_lua_request.h
ceph/src/rgw/rgw_metadata.h
ceph/src/rgw/rgw_op.cc
ceph/src/rgw/rgw_op.h
ceph/src/rgw/rgw_process.cc
ceph/src/rgw/rgw_putobj_processor.cc
ceph/src/rgw/rgw_rados.cc
ceph/src/rgw/rgw_rados.h
ceph/src/rgw/rgw_reshard.cc
ceph/src/rgw/rgw_rest_client.cc
ceph/src/rgw/rgw_rest_client.h
ceph/src/rgw/rgw_rest_conn.cc
ceph/src/rgw/rgw_rest_conn.h
ceph/src/rgw/rgw_rest_iam.cc
ceph/src/rgw/rgw_rest_iam.h
ceph/src/rgw/rgw_rest_role.cc
ceph/src/rgw/rgw_rest_role.h
ceph/src/rgw/rgw_rest_s3.cc
ceph/src/rgw/rgw_role.cc
ceph/src/rgw/rgw_role.h
ceph/src/rgw/rgw_sal.h
ceph/src/rgw/rgw_sal_dbstore.cc
ceph/src/rgw/rgw_sal_dbstore.h
ceph/src/rgw/rgw_sal_rados.cc
ceph/src/rgw/rgw_sal_rados.h
ceph/src/rgw/rgw_service.cc
ceph/src/rgw/rgw_service.h
ceph/src/rgw/rgw_sync.cc
ceph/src/rgw/rgw_sync_trace.cc
ceph/src/rgw/rgw_sync_trace.h
ceph/src/rgw/rgw_tools.cc
ceph/src/rgw/rgw_tools.h
ceph/src/rgw/rgw_user.cc
ceph/src/rgw/rgw_zone.cc
ceph/src/rgw/rgw_zone.h
ceph/src/rgw/services/svc_meta_be.cc
ceph/src/rgw/services/svc_meta_be.h
ceph/src/rgw/services/svc_meta_be_otp.cc
ceph/src/rgw/services/svc_meta_be_otp.h
ceph/src/rgw/services/svc_meta_be_sobj.cc
ceph/src/rgw/services/svc_meta_be_sobj.h
ceph/src/rgw/services/svc_role_rados.cc [new file with mode: 0644]
ceph/src/rgw/services/svc_role_rados.h [new file with mode: 0644]
ceph/src/rgw/services/svc_sys_obj_cache.cc
ceph/src/rgw/services/svc_user_rados.cc
ceph/src/script/cpatch
ceph/src/test/CMakeLists.txt
ceph/src/test/admin_socket.cc
ceph/src/test/cli/radosgw-admin/help.t
ceph/src/test/cli/rbd/help.t
ceph/src/test/client/CMakeLists.txt
ceph/src/test/client/TestClient.h
ceph/src/test/client/ops.cc [new file with mode: 0644]
ceph/src/test/cls_fifo/CMakeLists.txt [deleted file]
ceph/src/test/cls_fifo/bench_cls_fifo.cc [deleted file]
ceph/src/test/cls_fifo/test_cls_fifo.cc [deleted file]
ceph/src/test/cls_rbd/test_cls_rbd.cc
ceph/src/test/cls_rgw/test_cls_rgw.cc
ceph/src/test/libcephfs/CMakeLists.txt
ceph/src/test/libcephfs/acl.cc
ceph/src/test/libcephfs/newops.cc [new file with mode: 0644]
ceph/src/test/libcephfs/test.cc
ceph/src/test/librbd/io/test_mock_ImageRequest.cc
ceph/src/test/librbd/test_librbd.cc
ceph/src/test/librbd/test_mock_Journal.cc
ceph/src/test/mon/test_election.cc
ceph/src/test/objectstore/store_test.cc
ceph/src/test/objectstore/test_bluefs.cc
ceph/src/test/objectstore/test_bluestore_types.cc
ceph/src/test/osd/TestMClockScheduler.cc
ceph/src/test/pybind/test_rados.py
ceph/src/test/rgw/rgw_multi/conn.py
ceph/src/test/rgw/rgw_multi/multisite.py
ceph/src/test/rgw/rgw_multi/tests.py
ceph/src/test/rgw/rgw_multi/tests_ps.py [deleted file]
ceph/src/test/rgw/rgw_multi/zone_cloud.py
ceph/src/test/rgw/rgw_multi/zone_es.py
ceph/src/test/rgw/rgw_multi/zone_ps.py [deleted file]
ceph/src/test/rgw/rgw_multi/zone_rados.py
ceph/src/test/rgw/test_cls_fifo_legacy.cc
ceph/src/test/rgw/test_multi.md
ceph/src/test/rgw/test_multi.py
ceph/src/test/rgw/test_rgw_lua.cc
ceph/src/tools/ceph-dencoder/CMakeLists.txt
ceph/src/tools/cephfs/DataScan.cc
ceph/src/tools/cephfs/top/cephfs-top
ceph/src/tools/cephfs_mirror/FSMirror.cc
ceph/src/tools/cephfs_mirror/PeerReplayer.cc
ceph/src/tools/crushtool.cc
ceph/src/tools/rbd/Utils.cc
ceph/src/tools/rbd/Utils.h
ceph/src/tools/rbd/action/Device.cc
ceph/src/tools/rbd/action/Ggate.cc
ceph/src/tools/rbd/action/Nbd.cc
ceph/src/tools/rbd/action/Wnbd.cc
ceph/src/tools/rbd_mirror/ImageDeleter.cc
ceph/src/tools/rbd_mirror/ImageReplayer.cc
ceph/src/tools/rbd_mirror/Mirror.cc
ceph/src/tools/rbd_mirror/PoolReplayer.cc
ceph/src/tools/rbd_mirror/image_replayer/snapshot/Replayer.cc
ceph/src/tools/rbd_mirror/image_replayer/snapshot/Replayer.h
ceph/src/tools/rbd_nbd/rbd-nbd.cc
ceph/src/tools/rbd_wnbd/wnbd_handler.cc
ceph/src/tools/rbd_wnbd/wnbd_handler.h

index f80f4b7486709aa2086b99367bcd47a147441a89..cda890f59961121d0dad543944b6c566ee578770 100644 (file)
@@ -110,6 +110,7 @@ README*                                         @ceph/doc-writers
 /qa/workunits/cls/test_cls_lock.sh              @ceph/rbd
 /qa/workunits/cls/test_cls_rbd.sh               @ceph/rbd
 /qa/workunits/rbd                               @ceph/rbd
 /qa/workunits/cls/test_cls_lock.sh              @ceph/rbd
 /qa/workunits/cls/test_cls_rbd.sh               @ceph/rbd
 /qa/workunits/rbd                               @ceph/rbd
+/qa/workunits/windows                           @ceph/rbd
 /src/ceph-rbdnamer                              @ceph/rbd
 /src/cls/journal                                @ceph/rbd
 /src/cls/lock                                   @ceph/rbd
 /src/ceph-rbdnamer                              @ceph/rbd
 /src/cls/journal                                @ceph/rbd
 /src/cls/lock                                   @ceph/rbd
index 361c664fa22cd3864522af8e91c11e9722fd0cb0..f51969084f0cf644839abb173012290f38854ec6 100644 (file)
@@ -1,10 +1,6 @@
 ---
 # Read the Docs configuration file
 # See https://docs.readthedocs.io/en/stable/config-file/v2.html for details
 ---
 # Read the Docs configuration file
 # See https://docs.readthedocs.io/en/stable/config-file/v2.html for details
-#
-# The pre_build command checks if we're building a named branch (i.e., not a PR).
-# If so, check out doc/releases from the main branch before building so
-# it's always up to date on docs.ceph.com/en/*.
 
 version: 2
 formats: []
 
 version: 2
 formats: []
@@ -14,9 +10,7 @@ build:
     python: "3.8"
   apt_packages:
     - ditaa
     python: "3.8"
   apt_packages:
     - ditaa
-  jobs:
-    pre_build:
-      - bash admin/rtd-checkout-main
+    - graphviz
 python:
   install:
     - requirements: admin/doc-requirements.txt
 python:
   install:
     - requirements: admin/doc-requirements.txt
index 7ffe1065d5c44ca23a85c97d564ccc98e2f003f8..b52e8f82f8e8bc2053aa34ead52724c7c43e5c2d 100644 (file)
@@ -1,7 +1,7 @@
 cmake_minimum_required(VERSION 3.16)
 
 project(ceph
 cmake_minimum_required(VERSION 3.16)
 
 project(ceph
-  VERSION 17.2.5
+  VERSION 17.2.6
   LANGUAGES CXX C ASM)
 
 cmake_policy(SET CMP0028 NEW)
   LANGUAGES CXX C ASM)
 
 cmake_policy(SET CMP0028 NEW)
@@ -344,9 +344,11 @@ and then jemalloc. If neither of then is found. use the one in libc.")
 if(ALLOCATOR)
   if(${ALLOCATOR} MATCHES "tcmalloc(_minimal)?")
     find_package(gperftools 2.6.2 REQUIRED)
 if(ALLOCATOR)
   if(${ALLOCATOR} MATCHES "tcmalloc(_minimal)?")
     find_package(gperftools 2.6.2 REQUIRED)
+    set(ALLOC_LIBS gperftools::${ALLOCATOR})
     set(HAVE_LIBTCMALLOC ON)
   elseif(${ALLOCATOR} STREQUAL "jemalloc")
     find_package(JeMalloc REQUIRED)
     set(HAVE_LIBTCMALLOC ON)
   elseif(${ALLOCATOR} STREQUAL "jemalloc")
     find_package(JeMalloc REQUIRED)
+    set(ALLOC_LIBS JeMalloc::JeMalloc)
     set(HAVE_JEMALLOC 1)
   elseif(NOT ALLOCATOR STREQUAL "libc")
     message(FATAL_ERROR "Unsupported allocator selected: ${ALLOCATOR}")
     set(HAVE_JEMALLOC 1)
   elseif(NOT ALLOCATOR STREQUAL "libc")
     message(FATAL_ERROR "Unsupported allocator selected: ${ALLOCATOR}")
@@ -359,8 +361,10 @@ else(ALLOCATOR)
   endif()
   if(gperftools_FOUND)
     set(ALLOCATOR tcmalloc)
   endif()
   if(gperftools_FOUND)
     set(ALLOCATOR tcmalloc)
+    set(ALLOC_LIBS gperftools::tcmalloc)
   elseif(JeMalloc_FOUND)
     set(ALLOCATOR jemalloc)
   elseif(JeMalloc_FOUND)
     set(ALLOCATOR jemalloc)
+    set(ALLOC_LIBS JeMalloc::JeMalloc)
   else()
     if(NOT FREEBSD)
       # FreeBSD already has jemalloc as its default allocator
   else()
     if(NOT FREEBSD)
       # FreeBSD already has jemalloc as its default allocator
@@ -369,6 +373,13 @@ else(ALLOCATOR)
     set(ALLOCATOR "libc")
   endif(gperftools_FOUND)
 endif(ALLOCATOR)
     set(ALLOCATOR "libc")
   endif(gperftools_FOUND)
 endif(ALLOCATOR)
+if(NOT ALLOCATOR STREQUAL "libc")
+  add_compile_options(
+    $<$<COMPILE_LANGUAGE:CXX>:-fno-builtin-malloc>
+    $<$<COMPILE_LANGUAGE:CXX>:-fno-builtin-calloc>
+    $<$<COMPILE_LANGUAGE:CXX>:-fno-builtin-realloc>
+    $<$<COMPILE_LANGUAGE:CXX>:-fno-builtin-free>)
+endif()
 
 # Mingw generates incorrect entry points when using "-pie".
 if(WIN32 OR (HAVE_LIBTCMALLOC AND WITH_STATIC_LIBSTDCXX))
 
 # Mingw generates incorrect entry points when using "-pie".
 if(WIN32 OR (HAVE_LIBTCMALLOC AND WITH_STATIC_LIBSTDCXX))
index 8b819bf896edb1bbc5984ca89c0dc8d52065a73e..659298f0e5ae497d4a0480ae409015d6b7299e37 100644 (file)
@@ -156,9 +156,9 @@ For Angular code, we follow the official Angular style guide:
     https://angular.io/guide/styleguide
 
 To check whether your code is conformant with the style guide, we use a
     https://angular.io/guide/styleguide
 
 To check whether your code is conformant with the style guide, we use a
-combination of TSLint, Codelyzer and Prettier:
+combination of ESLint, Codelyzer and Prettier:
 
 
-    https://palantir.github.io/tslint/
+    https://eslint.org/
     http://codelyzer.com/
     https://prettier.io/
 
     http://codelyzer.com/
     https://prettier.io/
 
index 873c3e7ca18c5360e738d1b8ba5403d300365607..be4de4eadf8d662a4bb29c9f27a65e764aed21e1 100644 (file)
@@ -1,3 +1,34 @@
+>=17.2.6
+--------
+
+* `ceph mgr dump` command now outputs `last_failure_osd_epoch` and
+  `active_clients` fields at the top level.  Previously, these fields were
+  output under `always_on_modules` field.
+
+>=17.2.5
+--------
+
+* RBD: The semantics of compare-and-write C++ API (`Image::compare_and_write`
+  and `Image::aio_compare_and_write` methods) now match those of C API.  Both
+  compare and write steps operate only on `len` bytes even if the respective
+  buffers are larger. The previous behavior of comparing up to the size of
+  the compare buffer was prone to subtle breakage upon straddling a stripe
+  unit boundary.
+* RBD: compare-and-write operation is no longer limited to 512-byte sectors.
+  Assuming proper alignment, it now allows operating on stripe units (4M by
+  default).
+* RBD: New `rbd_aio_compare_and_writev` API method to support scatter/gather
+  on both compare and write buffers.  This compliments existing `rbd_aio_readv`
+  and `rbd_aio_writev` methods.
+* RBD: `rbd device unmap` command gained `--namespace` option.  Support for
+  namespaces was added to RBD in Nautilus 14.2.0 and it has been possible to
+  map and unmap images in namespaces using the `image-spec` syntax since then
+  but the corresponding option available in most other commands was missing.
+* CEPHFS: Rename the `mds_max_retries_on_remount_failure` option to
+  `client_max_retries_on_remount_failure` and move it from mds.yaml.in to
+  mds-client.yaml.in because this option was only used by MDS client from its
+  birth.
+
 >=17.2.4
 --------
 
 >=17.2.4
 --------
 
@@ -8,6 +39,15 @@
 * OSD: The issue of high CPU utilization during recovery/backfill operations
   has been fixed. For more details, see: https://tracker.ceph.com/issues/56530.
 
 * OSD: The issue of high CPU utilization during recovery/backfill operations
   has been fixed. For more details, see: https://tracker.ceph.com/issues/56530.
 
+* Trimming of PGLog dups is now controlled by the size instead of the version.
+  This fixes the PGLog inflation issue that was happening when the on-line
+  (in OSD) trimming got jammed after a PG split operation. Also, a new off-line
+  mechanism has been added: `ceph-objectstore-tool` got `trim-pg-log-dups` op
+  that targets situations where OSD is unable to boot due to those inflated dups.
+  If that is the case, in OSD logs the "You can be hit by THE DUPS BUG" warning
+  will be visible.
+  Relevant tracker: https://tracker.ceph.com/issues/53729
+
 >=17.2.1
 
 * The "BlueStore zero block detection" feature (first introduced to Quincy in
 >=17.2.1
 
 * The "BlueStore zero block detection" feature (first introduced to Quincy in
diff --git a/ceph/admin/rtd-checkout-main b/ceph/admin/rtd-checkout-main
deleted file mode 100755 (executable)
index 829d7c3..0000000
+++ /dev/null
@@ -1,10 +0,0 @@
-# See .readthedocs.yml
-set -ex
-re='^[0-9]+$'
-if [[ $READTHEDOCS_VERSION =~ $re ]]; then
-  echo "Building docs for PR $READTHEDOCS_VERSION.  Will not check out doc/releases from main branch."
-else
-  echo "Building docs for $READTHEDOCS_VERSION branch.  Will check out doc/releases from main branch."
-  git checkout origin/main -- doc/releases
-fi
-git status
index 0e19cd6546ebbfa5f6dd9d854bb79e629563c4a2..afe6fe92f6a34efae4d71a551ffc7912d6ee011b 100644 (file)
 %global _remote_tarball_prefix https://download.ceph.com/tarballs/
 %endif
 %if 0%{?suse_version}
 %global _remote_tarball_prefix https://download.ceph.com/tarballs/
 %endif
 %if 0%{?suse_version}
+%ifarch s390x
+%bcond_with system_pmdk
+%else
 %bcond_without system_pmdk
 %bcond_without system_pmdk
+%endif
 %bcond_with amqp_endpoint
 %bcond_with cephfs_java
 %bcond_with kafka_endpoint
 %bcond_with amqp_endpoint
 %bcond_with cephfs_java
 %bcond_with kafka_endpoint
 # main package definition
 #################################################################################
 Name:          ceph
 # main package definition
 #################################################################################
 Name:          ceph
-Version:       17.2.5
+Version:       17.2.6
 Release:       0%{?dist}
 %if 0%{?fedora} || 0%{?rhel}
 Epoch:         2
 Release:       0%{?dist}
 %if 0%{?fedora} || 0%{?rhel}
 Epoch:         2
@@ -178,7 +182,7 @@ License:    LGPL-2.1 and LGPL-3.0 and CC-BY-SA-3.0 and GPL-2.0 and BSL-1.0 and BSD-
 Group:         System/Filesystems
 %endif
 URL:           http://ceph.com/
 Group:         System/Filesystems
 %endif
 URL:           http://ceph.com/
-Source0:       %{?_remote_tarball_prefix}ceph-17.2.5.tar.bz2
+Source0:       %{?_remote_tarball_prefix}ceph-17.2.6.tar.bz2
 %if 0%{?suse_version}
 # _insert_obs_source_lines_here
 ExclusiveArch:  x86_64 aarch64 ppc64le s390x
 %if 0%{?suse_version}
 # _insert_obs_source_lines_here
 ExclusiveArch:  x86_64 aarch64 ppc64le s390x
@@ -202,9 +206,12 @@ BuildRequires:     selinux-policy-devel
 BuildRequires: gperf
 BuildRequires:  cmake > 3.5
 BuildRequires: fuse-devel
 BuildRequires: gperf
 BuildRequires:  cmake > 3.5
 BuildRequires: fuse-devel
-%if 0%{?fedora} || 0%{?suse_version} || 0%{?rhel} == 9
+%if 0%{?fedora} || 0%{?suse_version} > 1500 || 0%{?rhel} == 9
 BuildRequires: gcc-c++ >= 11
 %endif
 BuildRequires: gcc-c++ >= 11
 %endif
+%if 0%{?suse_version} == 1500
+BuildRequires: gcc11-c++
+%endif
 %if 0%{?rhel} == 8
 BuildRequires: %{gts_prefix}-gcc-c++
 BuildRequires: %{gts_prefix}-build
 %if 0%{?rhel} == 8
 BuildRequires: %{gts_prefix}-gcc-c++
 BuildRequires: %{gts_prefix}-build
@@ -648,6 +655,7 @@ Requires:       python%{python3_pkgversion}-pecan
 Requires:       python%{python3_pkgversion}-pyOpenSSL
 Requires:       python%{python3_pkgversion}-requests
 Requires:       python%{python3_pkgversion}-dateutil
 Requires:       python%{python3_pkgversion}-pyOpenSSL
 Requires:       python%{python3_pkgversion}-requests
 Requires:       python%{python3_pkgversion}-dateutil
+Requires:       python%{python3_pkgversion}-setuptools
 %if 0%{?fedora} || 0%{?rhel} >= 8
 Requires:       python%{python3_pkgversion}-cherrypy
 Requires:       python%{python3_pkgversion}-pyyaml
 %if 0%{?fedora} || 0%{?rhel} >= 8
 Requires:       python%{python3_pkgversion}-cherrypy
 Requires:       python%{python3_pkgversion}-pyyaml
@@ -1266,7 +1274,7 @@ This package provides Ceph default alerts for Prometheus.
 # common
 #################################################################################
 %prep
 # common
 #################################################################################
 %prep
-%autosetup -p1 -n ceph-17.2.5
+%autosetup -p1 -n ceph-17.2.6
 
 %build
 # Disable lto on systems that do not support symver attribute
 
 %build
 # Disable lto on systems that do not support symver attribute
@@ -1307,6 +1315,10 @@ env | sort
 mkdir -p %{_vpath_builddir}
 pushd %{_vpath_builddir}
 cmake .. \
 mkdir -p %{_vpath_builddir}
 pushd %{_vpath_builddir}
 cmake .. \
+%if 0%{?suse_version} == 1500
+    -DCMAKE_C_COMPILER=gcc-11 \
+    -DCMAKE_CXX_COMPILER=g++-11 \
+%endif
     -DCMAKE_INSTALL_PREFIX=%{_prefix} \
     -DCMAKE_INSTALL_LIBDIR:PATH=%{_libdir} \
     -DCMAKE_INSTALL_LIBEXECDIR:PATH=%{_libexecdir} \
     -DCMAKE_INSTALL_PREFIX=%{_prefix} \
     -DCMAKE_INSTALL_LIBDIR:PATH=%{_libdir} \
     -DCMAKE_INSTALL_LIBEXECDIR:PATH=%{_libexecdir} \
@@ -1461,7 +1473,7 @@ touch %{buildroot}%{_sharedstatedir}/cephadm/.ssh/authorized_keys
 chmod 0600 %{buildroot}%{_sharedstatedir}/cephadm/.ssh/authorized_keys
 
 # firewall templates and /sbin/mount.ceph symlink
 chmod 0600 %{buildroot}%{_sharedstatedir}/cephadm/.ssh/authorized_keys
 
 # firewall templates and /sbin/mount.ceph symlink
-%if 0%{?suse_version} && !0%{?usrmerged}
+%if 0%{?suse_version} && 0%{?suse_version} < 1550
 mkdir -p %{buildroot}/sbin
 ln -sf %{_sbindir}/mount.ceph %{buildroot}/sbin/mount.ceph
 %endif
 mkdir -p %{buildroot}/sbin
 ln -sf %{_sbindir}/mount.ceph %{buildroot}/sbin/mount.ceph
 %endif
@@ -1637,7 +1649,7 @@ exit 0
 %{_bindir}/rbd-replay-many
 %{_bindir}/rbdmap
 %{_sbindir}/mount.ceph
 %{_bindir}/rbd-replay-many
 %{_bindir}/rbdmap
 %{_sbindir}/mount.ceph
-%if 0%{?suse_version} && !0%{?usrmerged}
+%if 0%{?suse_version} && 0%{?suse_version} < 1550
 /sbin/mount.ceph
 %endif
 %if %{with lttng}
 /sbin/mount.ceph
 %endif
 %if %{with lttng}
index 5c5e390f4ae8eeaaaf9d9e6b4058c36551590415..e1575c0668a55efc28068c8a98e8a3413b322de5 100644 (file)
 %global _remote_tarball_prefix https://download.ceph.com/tarballs/
 %endif
 %if 0%{?suse_version}
 %global _remote_tarball_prefix https://download.ceph.com/tarballs/
 %endif
 %if 0%{?suse_version}
+%ifarch s390x
+%bcond_with system_pmdk
+%else
 %bcond_without system_pmdk
 %bcond_without system_pmdk
+%endif
 %bcond_with amqp_endpoint
 %bcond_with cephfs_java
 %bcond_with kafka_endpoint
 %bcond_with amqp_endpoint
 %bcond_with cephfs_java
 %bcond_with kafka_endpoint
@@ -202,9 +206,12 @@ BuildRequires:     selinux-policy-devel
 BuildRequires: gperf
 BuildRequires:  cmake > 3.5
 BuildRequires: fuse-devel
 BuildRequires: gperf
 BuildRequires:  cmake > 3.5
 BuildRequires: fuse-devel
-%if 0%{?fedora} || 0%{?suse_version} || 0%{?rhel} == 9
+%if 0%{?fedora} || 0%{?suse_version} > 1500 || 0%{?rhel} == 9
 BuildRequires: gcc-c++ >= 11
 %endif
 BuildRequires: gcc-c++ >= 11
 %endif
+%if 0%{?suse_version} == 1500
+BuildRequires: gcc11-c++
+%endif
 %if 0%{?rhel} == 8
 BuildRequires: %{gts_prefix}-gcc-c++
 BuildRequires: %{gts_prefix}-build
 %if 0%{?rhel} == 8
 BuildRequires: %{gts_prefix}-gcc-c++
 BuildRequires: %{gts_prefix}-build
@@ -648,6 +655,7 @@ Requires:       python%{python3_pkgversion}-pecan
 Requires:       python%{python3_pkgversion}-pyOpenSSL
 Requires:       python%{python3_pkgversion}-requests
 Requires:       python%{python3_pkgversion}-dateutil
 Requires:       python%{python3_pkgversion}-pyOpenSSL
 Requires:       python%{python3_pkgversion}-requests
 Requires:       python%{python3_pkgversion}-dateutil
+Requires:       python%{python3_pkgversion}-setuptools
 %if 0%{?fedora} || 0%{?rhel} >= 8
 Requires:       python%{python3_pkgversion}-cherrypy
 Requires:       python%{python3_pkgversion}-pyyaml
 %if 0%{?fedora} || 0%{?rhel} >= 8
 Requires:       python%{python3_pkgversion}-cherrypy
 Requires:       python%{python3_pkgversion}-pyyaml
@@ -1307,6 +1315,10 @@ env | sort
 mkdir -p %{_vpath_builddir}
 pushd %{_vpath_builddir}
 cmake .. \
 mkdir -p %{_vpath_builddir}
 pushd %{_vpath_builddir}
 cmake .. \
+%if 0%{?suse_version} == 1500
+    -DCMAKE_C_COMPILER=gcc-11 \
+    -DCMAKE_CXX_COMPILER=g++-11 \
+%endif
     -DCMAKE_INSTALL_PREFIX=%{_prefix} \
     -DCMAKE_INSTALL_LIBDIR:PATH=%{_libdir} \
     -DCMAKE_INSTALL_LIBEXECDIR:PATH=%{_libexecdir} \
     -DCMAKE_INSTALL_PREFIX=%{_prefix} \
     -DCMAKE_INSTALL_LIBDIR:PATH=%{_libdir} \
     -DCMAKE_INSTALL_LIBEXECDIR:PATH=%{_libexecdir} \
@@ -1461,7 +1473,7 @@ touch %{buildroot}%{_sharedstatedir}/cephadm/.ssh/authorized_keys
 chmod 0600 %{buildroot}%{_sharedstatedir}/cephadm/.ssh/authorized_keys
 
 # firewall templates and /sbin/mount.ceph symlink
 chmod 0600 %{buildroot}%{_sharedstatedir}/cephadm/.ssh/authorized_keys
 
 # firewall templates and /sbin/mount.ceph symlink
-%if 0%{?suse_version} && !0%{?usrmerged}
+%if 0%{?suse_version} && 0%{?suse_version} < 1550
 mkdir -p %{buildroot}/sbin
 ln -sf %{_sbindir}/mount.ceph %{buildroot}/sbin/mount.ceph
 %endif
 mkdir -p %{buildroot}/sbin
 ln -sf %{_sbindir}/mount.ceph %{buildroot}/sbin/mount.ceph
 %endif
@@ -1637,7 +1649,7 @@ exit 0
 %{_bindir}/rbd-replay-many
 %{_bindir}/rbdmap
 %{_sbindir}/mount.ceph
 %{_bindir}/rbd-replay-many
 %{_bindir}/rbdmap
 %{_sbindir}/mount.ceph
-%if 0%{?suse_version} && !0%{?usrmerged}
+%if 0%{?suse_version} && 0%{?suse_version} < 1550
 /sbin/mount.ceph
 %endif
 %if %{with lttng}
 /sbin/mount.ceph
 %endif
 %if %{with lttng}
index 01109229871249009fc44f823838079281d9b44f..d4a23a0788d9f5697d006c1f90d717b7ac9747da 100644 (file)
@@ -1,3 +1,9 @@
+ceph (17.2.6-1) stable; urgency=medium
+
+  * New upstream release
+
+ -- Ceph Release Team <ceph-maintainers@ceph.io>  Wed, 05 Apr 2023 15:09:49 +0000
+
 ceph (17.2.5-1) stable; urgency=medium
 
   * New upstream release
 ceph (17.2.5-1) stable; urgency=medium
 
   * New upstream release
index 481f3edf09d228a20a2317df4cf809e5f0526de5..3a0694b543eed3e2ad4ed8c6be15bcc22d4a48f5 100644 (file)
@@ -2,8 +2,14 @@ function(build_fio)
   # we use an external project and copy the sources to bin directory to ensure
   # that object files are built outside of the source tree.
   include(ExternalProject)
   # we use an external project and copy the sources to bin directory to ensure
   # that object files are built outside of the source tree.
   include(ExternalProject)
-  if(ALLOCATOR)
-    set(FIO_EXTLIBS EXTLIBS=-l${ALLOCATOR})
+  if(ALLOC_LIBS)
+    get_target_property(alloc_lib_path
+      ${ALLOC_LIBS} IMPORTED_LOCATION)
+    get_filename_component(alloc_lib_dir
+      ${alloc_lib_path} DIRECTORY)
+    get_filename_component(alloc_lib_name
+      ${alloc_lib_path} NAME)
+    set(FIO_EXTLIBS "EXTLIBS='-L${alloc_lib_dir} -l:${alloc_lib_name}'")
   endif()
 
   include(FindMake)
   endif()
 
   include(FindMake)
@@ -20,7 +26,7 @@ function(build_fio)
     SOURCE_DIR ${source_dir}
     BUILD_IN_SOURCE 1
     CONFIGURE_COMMAND <SOURCE_DIR>/configure
     SOURCE_DIR ${source_dir}
     BUILD_IN_SOURCE 1
     CONFIGURE_COMMAND <SOURCE_DIR>/configure
-    BUILD_COMMAND ${make_cmd} fio EXTFLAGS=-Wno-format-truncation ${FIO_EXTLIBS}
+    BUILD_COMMAND ${make_cmd} fio EXTFLAGS=-Wno-format-truncation "${FIO_EXTLIBS}"
     INSTALL_COMMAND cp <BINARY_DIR>/fio ${CMAKE_BINARY_DIR}/bin
     LOG_CONFIGURE ON
     LOG_BUILD ON
     INSTALL_COMMAND cp <BINARY_DIR>/fio ${CMAKE_BINARY_DIR}/bin
     LOG_CONFIGURE ON
     LOG_BUILD ON
index cbb5ccaa4d850219bc7747e07e3385b38d9cdfd4..bc5ac8dd014aeed75190cc21717ce63bab313e93 100644 (file)
@@ -93,6 +93,7 @@ Build-Depends: automake,
                tox <pkg.ceph.check>,
                python3-coverage <pkg.ceph.check>,
                python3-dateutil <pkg.ceph.check>,
                tox <pkg.ceph.check>,
                python3-coverage <pkg.ceph.check>,
                python3-dateutil <pkg.ceph.check>,
+               python3-pkg-resources <pkg.ceph.check>,
                python3-openssl <pkg.ceph.check>,
                python3-prettytable <pkg.ceph.check>,
                python3-requests <pkg.ceph.check>,
                python3-openssl <pkg.ceph.check>,
                python3-prettytable <pkg.ceph.check>,
                python3-requests <pkg.ceph.check>,
index c44ccb450b5ec6a3a1ecbe697f91f6cd14f23583..2a37cab999590d2189f8ceaa8b9d5cb2ffe626f6 100644 (file)
@@ -1,3 +1,23 @@
+dt { 
+    scroll-margin-top: 3em; 
+}
+
+h2 {
+    scroll-margin-top: 4em; 
+}
+
+h3 {
+    scroll-margin-top: 4em; 
+}
+
+section {
+    scroll-margin-top: 4em; 
+}
+
+span {
+    scroll-margin-top: 2em; 
+}
+
 ul.simple > li > ul > li:last-child {
     margin-block-end : 1em;
 }
 ul.simple > li > ul > li:last-child {
     margin-block-end : 1em;
 }
index 33558c0a877a5b6fac7779d06b71ce4fbfa97c6f..46be74603cf318e847e51de63866d7df237fffd7 100644 (file)
@@ -13,6 +13,7 @@ replicate and redistribute data dynamically.
 
 .. image:: images/stack.png
 
 
 .. image:: images/stack.png
 
+.. _arch-ceph-storage-cluster:
 
 The Ceph Storage Cluster
 ========================
 
 The Ceph Storage Cluster
 ========================
@@ -59,7 +60,7 @@ service interfaces built on top of ``librados``.
 Storing Data
 ------------
 
 Storing Data
 ------------
 
-The Ceph Storage Cluster receives data from :term:`Ceph Clients`--whether it
+The Ceph Storage Cluster receives data from :term:`Ceph Client`\s--whether it
 comes through a :term:`Ceph Block Device`, :term:`Ceph Object Storage`, the
 :term:`Ceph File System` or a custom implementation you create using
 ``librados``-- which is stored as RADOS objects. Each object is stored on an
 comes through a :term:`Ceph Block Device`, :term:`Ceph Object Storage`, the
 :term:`Ceph File System` or a custom implementation you create using
 ``librados``-- which is stored as RADOS objects. Each object is stored on an
@@ -80,7 +81,7 @@ stored in a monolithic database-like fashion.
 Ceph OSD Daemons store data as objects in a flat namespace (e.g., no
 hierarchy of directories). An object has an identifier, binary data, and
 metadata consisting of a set of name/value pairs. The semantics are completely
 Ceph OSD Daemons store data as objects in a flat namespace (e.g., no
 hierarchy of directories). An object has an identifier, binary data, and
 metadata consisting of a set of name/value pairs. The semantics are completely
-up to :term:`Ceph Clients`. For example, CephFS uses metadata to store file
+up to :term:`Ceph Client`\s. For example, CephFS uses metadata to store file
 attributes such as the file owner, created date, last modified date, and so
 forth.
 
 attributes such as the file owner, created date, last modified date, and so
 forth.
 
@@ -135,6 +136,8 @@ Placement of Replicated Data`_.
 
 .. index:: architecture; cluster map
 
 
 .. index:: architecture; cluster map
 
+.. _architecture_cluster_map:
+
 Cluster Map
 ~~~~~~~~~~~
 
 Cluster Map
 ~~~~~~~~~~~
 
@@ -581,7 +584,7 @@ objects.
 Peering and Sets
 ~~~~~~~~~~~~~~~~
 
 Peering and Sets
 ~~~~~~~~~~~~~~~~
 
-In previous sections, we noted that Ceph OSD Daemons check each others
+In previous sections, we noted that Ceph OSD Daemons check each other's
 heartbeats and report back to the Ceph Monitor. Another thing Ceph OSD daemons
 do is called 'peering', which is the process of bringing all of the OSDs that
 store a Placement Group (PG) into agreement about the state of all of the
 heartbeats and report back to the Ceph Monitor. Another thing Ceph OSD daemons
 do is called 'peering', which is the process of bringing all of the OSDs that
 store a Placement Group (PG) into agreement about the state of all of the
@@ -1619,13 +1622,13 @@ instance for high availability.
 
 
 
 
 
 
-.. _RADOS - A Scalable, Reliable Storage Service for Petabyte-scale Storage Clusters: https://ceph.com/wp-content/uploads/2016/08/weil-rados-pdsw07.pdf
+.. _RADOS - A Scalable, Reliable Storage Service for Petabyte-scale Storage Clusters: https://ceph.io/assets/pdfs/weil-rados-pdsw07.pdf
 .. _Paxos: https://en.wikipedia.org/wiki/Paxos_(computer_science)
 .. _Monitor Config Reference: ../rados/configuration/mon-config-ref
 .. _Monitoring OSDs and PGs: ../rados/operations/monitoring-osd-pg
 .. _Heartbeats: ../rados/configuration/mon-osd-interaction
 .. _Monitoring OSDs: ../rados/operations/monitoring-osd-pg/#monitoring-osds
 .. _Paxos: https://en.wikipedia.org/wiki/Paxos_(computer_science)
 .. _Monitor Config Reference: ../rados/configuration/mon-config-ref
 .. _Monitoring OSDs and PGs: ../rados/operations/monitoring-osd-pg
 .. _Heartbeats: ../rados/configuration/mon-osd-interaction
 .. _Monitoring OSDs: ../rados/operations/monitoring-osd-pg/#monitoring-osds
-.. _CRUSH - Controlled, Scalable, Decentralized Placement of Replicated Data: https://ceph.com/wp-content/uploads/2016/08/weil-crush-sc06.pdf
+.. _CRUSH - Controlled, Scalable, Decentralized Placement of Replicated Data: https://ceph.io/assets/pdfs/weil-crush-sc06.pdf
 .. _Data Scrubbing: ../rados/configuration/osd-config-ref#scrubbing
 .. _Report Peering Failure: ../rados/configuration/mon-osd-interaction#osds-report-peering-failure
 .. _Troubleshooting Peering Failure: ../rados/troubleshooting/troubleshooting-pg#placement-group-down-peering-failure
 .. _Data Scrubbing: ../rados/configuration/osd-config-ref#scrubbing
 .. _Report Peering Failure: ../rados/configuration/mon-osd-interaction#osds-report-peering-failure
 .. _Troubleshooting Peering Failure: ../rados/troubleshooting/troubleshooting-pg#placement-group-down-peering-failure
index eef5a0101fdbfd832bd41a574152e4a9612a37db..9faf1f74ebd724ed79c2c08828f97d4251e0919a 100644 (file)
@@ -2,7 +2,7 @@
 
 ``activate``
 ============
 
 ``activate``
 ============
-          
+
 Once :ref:`ceph-volume-lvm-prepare` is completed, and all the various steps
 that entails are done, the volume is ready to get "activated".
 
 Once :ref:`ceph-volume-lvm-prepare` is completed, and all the various steps
 that entails are done, the volume is ready to get "activated".
 
@@ -13,7 +13,7 @@ understand what OSD is enabled and needs to be mounted.
 .. note:: The execution of this call is fully idempotent, and there is no
           side-effects when running multiple times
 
 .. note:: The execution of this call is fully idempotent, and there is no
           side-effects when running multiple times
 
-For OSDs deployed by cephadm, please refer to :ref:cephadm-osd-activate: 
+For OSDs deployed by cephadm, please refer to :ref:`cephadm-osd-activate`
 instead.
 
 New OSDs
 instead.
 
 New OSDs
@@ -29,7 +29,7 @@ need to be supplied. For example::
 Activating all OSDs
 -------------------
 
 Activating all OSDs
 -------------------
 
-.. note:: For OSDs deployed by cephadm, please refer to :ref:cephadm-osd-activate: 
+.. note:: For OSDs deployed by cephadm, please refer to :ref:`cephadm-osd-activate`
           instead.
 
 It is possible to activate all existing OSDs at once by using the ``--all``
           instead.
 
 It is possible to activate all existing OSDs at once by using the ``--all``
index 1483ef32e6c88a42c805450b9266c3624ee4eeb8..66f4ee182b16055c7d08413bad19cb70215d5f97 100644 (file)
@@ -4,45 +4,41 @@ Encryption
 ==========
 
 Logical volumes can be encrypted using ``dmcrypt`` by specifying the
 ==========
 
 Logical volumes can be encrypted using ``dmcrypt`` by specifying the
-``--dmcrypt`` flag when creating OSDs. Encryption can be done in different ways,
-specially with LVM. ``ceph-volume`` is somewhat opinionated with the way it
-sets up encryption with logical volumes so that the process is consistent and
+``--dmcrypt`` flag when creating OSDs. When using LVM, logical volumes can be
+encrypted in different ways. ``ceph-volume`` does not offer as many options as
+LVM does, but it encrypts logical volumes in a way that  is consistent and
 robust.
 
 robust.
 
-In this case, ``ceph-volume lvm`` follows these constraints:
+In this case, ``ceph-volume lvm`` follows this constraint:
 
 
-* only LUKS (version 1) is used
-* Logical Volumes are encrypted, while their underlying PVs (physical volumes)
-  aren't
-* Non-LVM devices like partitions are also encrypted with the same OSD key
+* Non-LVM devices (such as partitions) are encrypted with the same OSD key.
 
 
 LUKS
 ----
 
 
 LUKS
 ----
-There are currently two versions of LUKS, 1 and 2. Version 2 is a bit easier
-to implement but not widely available in all distros Ceph supports. LUKS 1 is
-not going to be deprecated in favor of LUKS 2, so in order to have as wide
-support as possible, ``ceph-volume`` uses LUKS version 1.
+There are currently two versions of LUKS, 1 and 2. Version 2 is a bit easier to
+implement but not widely available in all Linux distributions supported by
+Ceph. 
 
 
-.. note:: Version 1 of LUKS is just referenced as "LUKS" whereas version 2 is
-          referred to as LUKS2
+.. note:: Version 1 of LUKS is referred to in this documentation as "LUKS".
+   Version 2 is of LUKS is referred to in this documentation as "LUKS2".
 
 
 LUKS on LVM
 -----------
 
 
 LUKS on LVM
 -----------
-Encryption is done on top of existing logical volumes (unlike encrypting the
-physical device). Any single logical volume can be encrypted while other
-volumes can remain unencrypted. This method also allows for flexible logical
+Encryption is done on top of existing logical volumes (this is not the same as
+encrypting the physical device). Any single logical volume can be encrypted,
+leaving other volumes unencrypted. This method also allows for flexible logical
 volume setups, since encryption will happen once the LV is created.
 
 
 Workflow
 --------
 volume setups, since encryption will happen once the LV is created.
 
 
 Workflow
 --------
-When setting up the OSD, a secret key will be created, that will be passed
-along to the monitor in JSON format as ``stdin`` to prevent the key from being
+When setting up the OSD, a secret key is created. That secret key is passed
+to the monitor in JSON format as ``stdin`` to prevent the key from being
 captured in the logs.
 
 captured in the logs.
 
-The JSON payload looks something like::
+The JSON payload looks something like this::
 
         {
             "cephx_secret": CEPHX_SECRET,
 
         {
             "cephx_secret": CEPHX_SECRET,
@@ -51,36 +47,38 @@ The JSON payload looks something like::
         }
 
 The naming convention for the keys is **strict**, and they are named like that
         }
 
 The naming convention for the keys is **strict**, and they are named like that
-for the hardcoded (legacy) names ceph-disk used.
+for the hardcoded (legacy) names used by ceph-disk.
 
 * ``cephx_secret`` : The cephx key used to authenticate
 * ``dmcrypt_key`` : The secret (or private) key to unlock encrypted devices
 * ``cephx_lockbox_secret`` : The authentication key used to retrieve the
   ``dmcrypt_key``. It is named *lockbox* because ceph-disk used to have an
 
 * ``cephx_secret`` : The cephx key used to authenticate
 * ``dmcrypt_key`` : The secret (or private) key to unlock encrypted devices
 * ``cephx_lockbox_secret`` : The authentication key used to retrieve the
   ``dmcrypt_key``. It is named *lockbox* because ceph-disk used to have an
-  unencrypted partition named after it, used to store public keys and other
-  OSD metadata.
+  unencrypted partition named after it, which was used to store public keys and
+  other OSD metadata.
 
 The naming convention is strict because Monitors supported the naming
 
 The naming convention is strict because Monitors supported the naming
-convention by ceph-disk, which used these key names. In order to keep
-compatibility and prevent ceph-disk from breaking, ceph-volume will use the same
-naming convention *although they don't make sense for the new encryption
+convention of ceph-disk, which used these key names. In order to maintain 
+compatibility and prevent ceph-disk from breaking, ceph-volume uses the same
+naming convention *although it does not make sense for the new encryption
 workflow*.
 
 workflow*.
 
-After the common steps of setting up the OSD during the prepare stage, either
-with :term:`filestore` or :term:`bluestore`, the logical volume is left ready
-to be activated, regardless of the state of the device (encrypted or decrypted).
+After the common steps of setting up the OSD during the "prepare stage" (either
+with :term:`filestore` or :term:`bluestore`), the logical volume is left ready
+to be activated, regardless of the state of the device (encrypted or
+decrypted).
 
 
-At activation time, the logical volume will get decrypted and the OSD started
-once the process completes correctly.
+At the time of its activation, the logical volume is decrypted. The OSD starts
+after the process completes correctly.
 
 
-Summary of the encryption workflow for creating a new OSD:
+Summary of the encryption workflow for creating a new OSD
+----------------------------------------------------------
 
 
-#. OSD is created, both lockbox and dmcrypt keys are created, and sent along
-   with JSON to the monitors, indicating an encrypted OSD.
+#. OSD is created. Both lockbox and dmcrypt keys are created and sent to the
+   monitors in JSON format, indicating an encrypted OSD.
 
 #. All complementary devices (like journal, db, or wal) get created and
    encrypted with the same OSD key. Key is stored in the LVM metadata of the
 
 #. All complementary devices (like journal, db, or wal) get created and
    encrypted with the same OSD key. Key is stored in the LVM metadata of the
-   OSD
+   OSD.
 
 #. Activation continues by ensuring devices are mounted, retrieving the dmcrypt
 
 #. Activation continues by ensuring devices are mounted, retrieving the dmcrypt
-   secret key from the monitors and decrypting before the OSD gets started.
+   secret key from the monitors, and decrypting before the OSD gets started.
index 21cae4ee5004bf41c6eabf4939b0b520affaf0e5..ae6aac414cdda6567874d82fe3faabb2e8ff14d8 100644 (file)
@@ -2,25 +2,22 @@
 
 ``prepare``
 ===========
 
 ``prepare``
 ===========
-This subcommand allows a :term:`filestore` or :term:`bluestore` setup. It is
-recommended to pre-provision a logical volume before using it with
-``ceph-volume lvm``.
+Before you run ``ceph-volume lvm prepare``, we recommend that you provision a
+logical volume. Then you can run ``prepare`` on that logical volume. 
 
 
-Logical volumes are not altered except for adding extra metadata.
+``prepare`` adds metadata to logical volumes but does not alter them in any
+other way. 
 
 
-.. note:: This is part of a two step process to deploy an OSD. If looking for
-          a single-call way, please see :ref:`ceph-volume-lvm-create`
+.. note:: This is part of a two-step process to deploy an OSD. If you prefer 
+   to deploy an OSD by using only one command, see :ref:`ceph-volume-lvm-create`.
 
 
-To help identify volumes, the process of preparing a volume (or volumes) to
-work with Ceph, the tool will assign a few pieces of metadata information using
-:term:`LVM tags`.
-
-:term:`LVM tags` makes volumes easy to discover later, and help identify them as
-part of a Ceph system, and what role they have (journal, filestore, bluestore,
-etc...)
-
-Although :term:`bluestore` is the default, the back end can be specified with:
+``prepare`` uses :term:`LVM tags` to assign several pieces of metadata to a
+logical volume. Volumes tagged in this way are easier to identify and easier to
+use with Ceph. :term:`LVM tags` identify logical volumes by the role that they
+play in the Ceph cluster (for example: BlueStore data or BlueStore WAL+DB).
 
 
+:term:`BlueStore<bluestore>` is the default backend. Ceph permits changing
+the backend, which can be done by using the following flags and arguments:
 
 * :ref:`--filestore <ceph-volume-lvm-prepare_filestore>`
 * :ref:`--bluestore <ceph-volume-lvm-prepare_bluestore>`
 
 * :ref:`--filestore <ceph-volume-lvm-prepare_filestore>`
 * :ref:`--bluestore <ceph-volume-lvm-prepare_bluestore>`
@@ -29,50 +26,58 @@ Although :term:`bluestore` is the default, the back end can be specified with:
 
 ``bluestore``
 -------------
 
 ``bluestore``
 -------------
-The :term:`bluestore` objectstore is the default for new OSDs. It offers a bit
-more flexibility for devices compared to :term:`filestore`.
-Bluestore supports the following configurations:
-
-* A block device, a block.wal, and a block.db device
-* A block device and a block.wal device
-* A block device and a block.db device
-* A single block device
-
-The bluestore subcommand accepts physical block devices, partitions on
-physical block devices or logical volumes as arguments for the various device parameters
-If a physical device is provided, a logical volume will be created. A volume group will
-either be created or reused it its name begins with ``ceph``.
-This allows a simpler approach at using LVM but at the cost of flexibility:
-there are no options or configurations to change how the LV is created.
+:term:`Bluestore<bluestore>` is the default backend for new OSDs. It
+offers more flexibility for devices than :term:`filestore` does.  Bluestore
+supports the following configurations:
+
+* a block device, a block.wal device, and a block.db device
+* a block device and a block.wal device
+* a block device and a block.db device
+* a single block device
+
+The ``bluestore`` subcommand accepts physical block devices, partitions on physical
+block devices, or logical volumes as arguments for the various device
+parameters. If a physical block device is provided, a logical volume will be
+created. If the provided volume group's name begins with `ceph`, it will be
+created if it does not yet exist and it will be clobbered and reused if it
+already exists. This allows for a simpler approach to using LVM but at the
+cost of flexibility: no option or configuration can be used to change how the
+logical volume is created.
 
 The ``block`` is specified with the ``--data`` flag, and in its simplest use
 
 The ``block`` is specified with the ``--data`` flag, and in its simplest use
-case it looks like::
+case it looks like:
+
+.. prompt:: bash #
 
     ceph-volume lvm prepare --bluestore --data vg/lv
 
 
     ceph-volume lvm prepare --bluestore --data vg/lv
 
-A raw device can be specified in the same way::
+A raw device can be specified in the same way:
+
+.. prompt:: bash #
 
     ceph-volume lvm prepare --bluestore --data /path/to/device
 
 
     ceph-volume lvm prepare --bluestore --data /path/to/device
 
-For enabling :ref:`encryption <ceph-volume-lvm-encryption>`, the ``--dmcrypt`` flag is required::
+For enabling :ref:`encryption <ceph-volume-lvm-encryption>`, the ``--dmcrypt`` flag is required:
+
+.. prompt:: bash #
 
     ceph-volume lvm prepare --bluestore --dmcrypt --data vg/lv
 
 
     ceph-volume lvm prepare --bluestore --dmcrypt --data vg/lv
 
-If a ``block.db`` or a ``block.wal`` is needed (they are optional for
-bluestore) they can be specified with ``--block.db`` and ``--block.wal``
-accordingly. These can be a physical device, a partition  or
-a logical volume.
+If a ``block.db`` device or a ``block.wal`` device is needed, it can be
+specified with ``--block.db`` or ``--block.wal``. These can be physical
+devices, partitions, or logical volumes. ``block.db`` and ``block.wal`` are
+optional for bluestore.
 
 
-For both ``block.db`` and ``block.wal`` partitions aren't made logical volumes
-because they can be used as-is.
+For both ``block.db`` and ``block.wal``, partitions can be used as-is, and 
+therefore are not made into logical volumes.
 
 
-While creating the OSD directory, the process will use a ``tmpfs`` mount to
-place all the files needed for the OSD. These files are initially created by
-``ceph-osd --mkfs`` and are fully ephemeral.
+While creating the OSD directory, the process uses a ``tmpfs`` mount to hold
+the files needed for the OSD. These files are created by ``ceph-osd --mkfs``
+and are ephemeral.
 
 
-A symlink is always created for the ``block`` device, and optionally for
-``block.db`` and ``block.wal``. For a cluster with a default name, and an OSD
-id of 0, the directory could look like::
+A symlink is created for the ``block`` device, and is optional for ``block.db``
+and ``block.wal``. For a cluster with a default name and an OSD ID of 0, the
+directory looks like this::
 
     # ls -l /var/lib/ceph/osd/ceph-0
     lrwxrwxrwx. 1 ceph ceph 93 Oct 20 13:05 block -> /dev/ceph-be2b6fbd-bcf2-4c51-b35d-a35a162a02f0/osd-block-25cf0a05-2bc6-44ef-9137-79d65bd7ad62
 
     # ls -l /var/lib/ceph/osd/ceph-0
     lrwxrwxrwx. 1 ceph ceph 93 Oct 20 13:05 block -> /dev/ceph-be2b6fbd-bcf2-4c51-b35d-a35a162a02f0/osd-block-25cf0a05-2bc6-44ef-9137-79d65bd7ad62
@@ -85,11 +90,11 @@ id of 0, the directory could look like::
     -rw-------. 1 ceph ceph 10 Oct 20 13:05 type
     -rw-------. 1 ceph ceph  2 Oct 20 13:05 whoami
 
     -rw-------. 1 ceph ceph 10 Oct 20 13:05 type
     -rw-------. 1 ceph ceph  2 Oct 20 13:05 whoami
 
-In the above case, a device was used for ``block`` so ``ceph-volume`` create
-a volume group and a logical volume using the following convention:
+In the above case, a device was used for ``block``, so ``ceph-volume`` created
+a volume group and a logical volume using the following conventions:
 
 
-* volume group name: ``ceph-{cluster fsid}`` or if the vg exists already
-  ``ceph-{random uuid}``
+* volume group name: ``ceph-{cluster fsid}`` (or if the volume group already
+  exists: ``ceph-{random uuid}``)
 
 * logical volume name: ``osd-block-{osd_fsid}``
 
 
 * logical volume name: ``osd-block-{osd_fsid}``
 
@@ -98,78 +103,100 @@ a volume group and a logical volume using the following convention:
 
 ``filestore``
 -------------
 
 ``filestore``
 -------------
-This is the OSD backend that allows preparation of logical volumes for
-a :term:`filestore` objectstore OSD.
+``Filestore<filestore>`` is the OSD backend that prepares logical volumes for a
+:term:`filestore`-backed object-store OSD.
+
+
+``Filestore<filestore>`` uses a logical volume to store OSD data and it uses
+physical devices, partitions, or logical volumes to store the journal.  If a
+physical device is used to create a filestore backend, a logical volume will be
+created on that physical device. If the provided volume group's name begins
+with `ceph`, it will be created if it does not yet exist and it will be
+clobbered and reused if it already exists. No special preparation is needed for
+these volumes, but be sure to meet the minimum size requirements for OSD data and
+for the journal.
+
+Use the following command to create a basic filestore OSD:
 
 
-It can use a logical volume for the OSD data and a physical device, a partition
-or logical volume for the journal. A physical device will have a logical volume
-created on it. A volume group will either be created or reused it its name begins
-with ``ceph``.  No special preparation is needed for these volumes other than
-following the minimum size requirements for data and journal.
+.. prompt:: bash #
 
 
-The CLI call looks like this of a basic standalone filestore OSD::
+   ceph-volume lvm prepare --filestore --data <data block device>
 
 
-    ceph-volume lvm prepare --filestore --data <data block device>
+Use this command to deploy filestore with an external journal:
 
 
-To deploy file store with an external journal::
+.. prompt:: bash #
 
 
-    ceph-volume lvm prepare --filestore --data <data block device> --journal <journal block device>
+   ceph-volume lvm prepare --filestore --data <data block device> --journal <journal block device>
 
 
-For enabling :ref:`encryption <ceph-volume-lvm-encryption>`, the ``--dmcrypt`` flag is required::
+Use this command to enable :ref:`encryption <ceph-volume-lvm-encryption>`, and note that the ``--dmcrypt`` flag is required:
 
 
-    ceph-volume lvm prepare --filestore --dmcrypt --data <data block device> --journal <journal block device>
+.. prompt:: bash #
 
 
-Both the journal and data block device can take three forms:
+   ceph-volume lvm prepare --filestore --dmcrypt --data <data block device> --journal <journal block device>
+
+The data block device and the journal can each take one of three forms: 
 
 * a physical block device
 * a partition on a physical block device
 * a logical volume
 
 
 * a physical block device
 * a partition on a physical block device
 * a logical volume
 
-When using logical volumes the value *must* be of the format
-``volume_group/logical_volume``. Since logical volume names
-are not enforced for uniqueness, this prevents accidentally 
-choosing the wrong volume.
+If you use a logical volume to deploy filestore, the value that you pass in the
+command *must* be of the format ``volume_group/logical_volume_name``. Since logical
+volume names are not enforced for uniqueness, using this format is an important 
+safeguard against accidentally choosing the wrong volume (and clobbering its data).
+
+If you use a partition to deploy filestore, the partition *must* contain a
+``PARTUUID`` that can be discovered by ``blkid``. This ensures that the
+partition can be identified correctly regardless of the device's name (or path).
 
 
-When using a partition, it *must* contain a ``PARTUUID``, that can be 
-discovered by ``blkid``. THis ensure it can later be identified correctly
-regardless of the device name (or path).
+For example, to use a logical volume for OSD data and a partition
+(``/dev/sdc1``) for the journal, run a command of this form:
 
 
-For example: passing a logical volume for data and a partition ``/dev/sdc1`` for
-the journal::
+.. prompt:: bash #
 
 
-    ceph-volume lvm prepare --filestore --data volume_group/lv_name --journal /dev/sdc1
+   ceph-volume lvm prepare --filestore --data volume_group/logical_volume_name --journal /dev/sdc1
 
 
-Passing a bare device for data and a logical volume ias the journal::
+Or, to use a bare device for data and a logical volume for the journal:
 
 
-    ceph-volume lvm prepare --filestore --data /dev/sdc --journal volume_group/journal_lv
+.. prompt:: bash #
 
 
-A generated uuid is used to ask the cluster for a new OSD. These two pieces are
-crucial for identifying an OSD and will later be used throughout the
-:ref:`ceph-volume-lvm-activate` process.
+   ceph-volume lvm prepare --filestore --data /dev/sdc --journal volume_group/journal_lv
+
+A generated UUID is used when asking the cluster for a new OSD. These two
+pieces of information (the OSD ID and the OSD UUID) are necessary for
+identifying a given OSD and will later be used throughout the
+:ref:`activation<ceph-volume-lvm-activate>` process.
 
 The OSD data directory is created using the following convention::
 
     /var/lib/ceph/osd/<cluster name>-<osd id>
 
 
 The OSD data directory is created using the following convention::
 
     /var/lib/ceph/osd/<cluster name>-<osd id>
 
-At this point the data volume is mounted at this location, and the journal
-volume is linked::
+To link the journal volume to the mounted data volume, use this command:
+
+.. prompt:: bash #
+
+   ln -s /path/to/journal /var/lib/ceph/osd/<cluster_name>-<osd-id>/journal
+
+To fetch the monmap by using the bootstrap key from the OSD, use this command:
+
+.. prompt:: bash #
 
 
-      ln -s /path/to/journal /var/lib/ceph/osd/<cluster_name>-<osd-id>/journal
+   /usr/bin/ceph --cluster ceph --name client.bootstrap-osd --keyring
+   /var/lib/ceph/bootstrap-osd/ceph.keyring mon getmap -o
+   /var/lib/ceph/osd/<cluster name>-<osd id>/activate.monmap
 
 
-The monmap is fetched using the bootstrap key from the OSD::
+To populate the OSD directory (which has already been mounted), use this ``ceph-osd`` command:  
+.. prompt:: bash #
 
 
-      /usr/bin/ceph --cluster ceph --name client.bootstrap-osd
-      --keyring /var/lib/ceph/bootstrap-osd/ceph.keyring
-      mon getmap -o /var/lib/ceph/osd/<cluster name>-<osd id>/activate.monmap
+   ceph-osd --cluster ceph --mkfs --mkkey -i <osd id> \ --monmap
+   /var/lib/ceph/osd/<cluster name>-<osd id>/activate.monmap --osd-data \
+   /var/lib/ceph/osd/<cluster name>-<osd id> --osd-journal
+   /var/lib/ceph/osd/<cluster name>-<osd id>/journal \ --osd-uuid <osd uuid>
+   --keyring /var/lib/ceph/osd/<cluster name>-<osd id>/keyring \ --setuser ceph
+   --setgroup ceph
 
 
-``ceph-osd`` will be called to populate the OSD directory, that is already
-mounted, re-using all the pieces of information from the initial steps::
+All of the information from the previous steps is used in the above command.      
 
 
-      ceph-osd --cluster ceph --mkfs --mkkey -i <osd id> \
-      --monmap /var/lib/ceph/osd/<cluster name>-<osd id>/activate.monmap --osd-data \
-      /var/lib/ceph/osd/<cluster name>-<osd id> --osd-journal /var/lib/ceph/osd/<cluster name>-<osd id>/journal \
-      --osd-uuid <osd uuid> --keyring /var/lib/ceph/osd/<cluster name>-<osd id>/keyring \
-      --setuser ceph --setgroup ceph
 
 
 .. _ceph-volume-lvm-partitions:
 
 
 .. _ceph-volume-lvm-partitions:
index 6d9ec1251591ece393f392bc5dbe6456c16919c2..2b38d42d279f40daabd84432a57dcf9bb450efa2 100644 (file)
@@ -113,15 +113,15 @@ Adoption process
       ssh-copy-id -f -i ~/ceph.pub root@<host>
 
    .. note::
       ssh-copy-id -f -i ~/ceph.pub root@<host>
 
    .. note::
-     It is also possible to import an existing ssh key. See
-     :ref:`ssh errors <cephadm-ssh-errors>` in the troubleshooting
+     It is also possible to import an existing SSH key. See
+     :ref:`SSH errors <cephadm-ssh-errors>` in the troubleshooting
      document for instructions that describe how to import existing
      document for instructions that describe how to import existing
-     ssh keys.
+     SSH keys.
 
    .. note::
 
    .. note::
-     It is also possible to have cephadm use a non-root user to ssh
+     It is also possible to have cephadm use a non-root user to SSH 
      into cluster hosts. This user needs to have passwordless sudo access.
      into cluster hosts. This user needs to have passwordless sudo access.
-     Use ``ceph cephadm set-user <user>`` and copy the ssh key to that user.
+     Use ``ceph cephadm set-user <user>`` and copy the SSH key to that user.
      See :ref:`cephadm-ssh-user`
 
 #. Tell cephadm which hosts to manage:
      See :ref:`cephadm-ssh-user`
 
 #. Tell cephadm which hosts to manage:
index 7c75b7445114b66b673456beeb4f1b4b44d5cef6..46ab62a62726f1661980f08f3a08850d210abcb3 100644 (file)
@@ -8,27 +8,40 @@ Compatibility and Stability
 Compatibility with Podman Versions
 ----------------------------------
 
 Compatibility with Podman Versions
 ----------------------------------
 
-Podman and Ceph have different end-of-life strategies that
-might make it challenging to find compatible Podman and Ceph 
-versions
+Podman and Ceph have different end-of-life strategies. This means that care
+must be taken in finding a version of Podman that is compatible with Ceph.
 
 
-Those versions are expected to work:
+This table shows which version pairs are expected to work or not work together:
 
 
 
 
-+-----------+---------------------------------------+
-|  Ceph     |                 Podman                |
-+-----------+-------+-------+-------+-------+-------+
-|           | 1.9   |  2.0  |  2.1  |  2.2  |  3.0  |
-+===========+=======+=======+=======+=======+=======+
-| <= 15.2.5 | True  | False | False | False | False |
-+-----------+-------+-------+-------+-------+-------+
-| >= 15.2.6 | True  | True  | True  | False | False |
-+-----------+-------+-------+-------+-------+-------+
-| >= 16.2.1 | False | True  | True  | False | True  |
-+-----------+-------+-------+-------+-------+-------+
++-----------+-----------------------------------------------+
+|  Ceph     |                 Podman                        |
++-----------+-------+-------+-------+-------+-------+-------+
+|           | 1.9   |  2.0  |  2.1  |  2.2  |  3.0  | > 3.0 |
++===========+=======+=======+=======+=======+=======+=======+
+| <= 15.2.5 | True  | False | False | False | False | False |
++-----------+-------+-------+-------+-------+-------+-------+
+| >= 15.2.6 | True  | True  | True  | False | False | False |
++-----------+-------+-------+-------+-------+-------+-------+
+| >= 16.2.1 | False | True  | True  | False | True  | True  |
++-----------+-------+-------+-------+-------+-------+-------+
+| >= 17.2.0 | False | True  | True  | False | True  | True  |
++-----------+-------+-------+-------+-------+-------+-------+
+
+.. note::
+
+  While not all podman versions have been actively tested against
+  all Ceph versions, there are no known issues with using podman
+  version 3.0 or greater with Ceph Quincy and later releases.
 
 .. warning:: 
 
 .. warning:: 
-  Only podman versions that are 2.0.0 and higher work with Ceph Pacific, with the exception of podman version 2.2.1, which does not work with Ceph Pacific. kubic stable is known to work with Ceph Pacific, but it must be run with a newer kernel.
+
+   To use Podman with Ceph Pacific, you must use **a version of Podman that
+   is 2.0.0 or higher**. However, **Podman version 2.2.1 does not work with
+   Ceph Pacific**.
+   
+   "Kubic stable" is known to work with Ceph Pacific, but it must be run
+   with a newer kernel.
 
 
 .. _cephadm-stability:
 
 
 .. _cephadm-stability:
@@ -36,19 +49,18 @@ Those versions are expected to work:
 Stability
 ---------
 
 Stability
 ---------
 
-Cephadm is actively in development. Please be aware that some
-functionality is still rough around the edges. Especially the 
-following components are working with cephadm, but the
-documentation is not as complete as we would like, and there may be some
-changes in the near future:
-
-- RGW
+Cephadm is relatively stable but new functionality is still being
+added and bugs are occasionally discovered. If issues are found, please
+open a tracker issue under the Orchestrator component (https://tracker.ceph.com/projects/orchestrator/issues)
 
 
-Cephadm support for the following features is still under development and may see breaking
-changes in future releases:
+Cephadm support remains under development for the following features:
 
 
-- Ingress
-- Cephadm exporter daemon
-- cephfs-mirror
+- ceph-exporter deployment
+- stretch mode integration
+- monitoring stack (moving towards prometheus service discover and providing TLS)
+- RGW multisite deployment support (requires lots of manual steps currently)
+- cephadm agent
 
 
-In case you encounter issues, see also :ref:`cephadm-pause`.
+If a cephadm command fails or a service stops running properly, see
+:ref:`cephadm-pause` for instructions on how to pause the Ceph cluster's
+background activity and how to disable cephadm.
index fee286e3a72a225aaf4936928aeb63f2eb1dc8bf..b2c514c8ca704eee3f3aa73fb34d7ac04493f4f9 100644 (file)
@@ -4,17 +4,26 @@
 Host Management
 ===============
 
 Host Management
 ===============
 
-To list hosts associated with the cluster:
+Listing Hosts
+=============
+
+Run a command of this form to list hosts associated with the cluster:
 
 .. prompt:: bash #
 
 
 .. prompt:: bash #
 
-    ceph orch host ls [--format yaml] [--host-pattern <name>] [--label <label>] [--host-status <status>]
+   ceph orch host ls [--format yaml] [--host-pattern <name>] [--label <label>] [--host-status <status>]
+
+In commands of this form, the arguments "host-pattern", "label" and
+"host-status" are optional and are used for filtering. 
 
 
-where the optional arguments "host-pattern", "label" and "host-status" are used for filtering.
-"host-pattern" is a regex that will match against hostnames and will only return matching hosts
-"label" will only return hosts with the given label
-"host-status" will only return hosts with the given status (currently "offline" or "maintenance")
-Any combination of these filtering flags is valid. You may filter against name, label and/or status simultaneously
+- "host-pattern" is a regex that matches against hostnames and returns only
+  matching hosts.
+- "label" returns only hosts with the specified label.
+- "host-status" returns only hosts with the specified status (currently
+  "offline" or "maintenance").
+- Any combination of these filtering flags is valid. It is possible to filter
+  against name, label and status simultaneously, or to filter against any
+  proper subset of name, label and status.
 
 .. _cephadm-adding-hosts:    
     
 
 .. _cephadm-adding-hosts:    
     
@@ -30,7 +39,7 @@ To add each new host to the cluster, perform two steps:
 
    .. prompt:: bash #
 
 
    .. prompt:: bash #
 
-    ssh-copy-id -f -i /etc/ceph/ceph.pub root@*<new-host>*
+      ssh-copy-id -f -i /etc/ceph/ceph.pub root@*<new-host>*
 
    For example:
 
 
    For example:
 
@@ -43,7 +52,7 @@ To add each new host to the cluster, perform two steps:
 
    .. prompt:: bash #
 
 
    .. prompt:: bash #
 
-     ceph orch host add *<newhost>* [*<ip>*] [*<label1> ...*]
+      ceph orch host add *<newhost>* [*<ip>*] [*<label1> ...*]
 
    For example:
 
 
    For example:
 
@@ -63,54 +72,60 @@ To add each new host to the cluster, perform two steps:
 
    .. prompt:: bash #
 
 
    .. prompt:: bash #
 
-       ceph orch host add host4 10.10.0.104 --labels _admin
+      ceph orch host add host4 10.10.0.104 --labels _admin
 
 .. _cephadm-removing-hosts:
 
 Removing Hosts
 ==============
 
 
 .. _cephadm-removing-hosts:
 
 Removing Hosts
 ==============
 
-A host can safely be removed from a the cluster once all daemons are removed from it.
+A host can safely be removed from the cluster after all daemons are removed
+from it.
 
 
-To drain all daemons from a host do the following:
+To drain all daemons from a host, run a command of the following form:
 
 .. prompt:: bash #
 
 
 .. prompt:: bash #
 
-  ceph orch host drain *<host>*
+   ceph orch host drain *<host>*
 
 
-The '_no_schedule' label will be applied to the host. See :ref:`cephadm-special-host-labels`
+The ``_no_schedule`` label will be applied to the host. See
+:ref:`cephadm-special-host-labels`.
 
 
-All osds on the host will be scheduled to be removed. You can check osd removal progress with the following:
+All OSDs on the host will be scheduled to be removed. You can check the progress of the OSD removal operation with the following command:
 
 .. prompt:: bash #
 
 
 .. prompt:: bash #
 
-  ceph orch osd rm status
+   ceph orch osd rm status
 
 
-see :ref:`cephadm-osd-removal` for more details about osd removal
+See :ref:`cephadm-osd-removal` for more details about OSD removal.
 
 
-You can check if there are no daemons left on the host with the following:
+Use the following command to determine whether any daemons are still on the
+host:
 
 .. prompt:: bash #
 
 
 .. prompt:: bash #
 
-  ceph orch ps <host> 
+   ceph orch ps <host> 
 
 
-Once all daemons are removed you can remove the host with the following:
+After all daemons have been removed from the host, remove the host from the
+cluster by running the following command: 
 
 .. prompt:: bash #
 
 
 .. prompt:: bash #
 
-  ceph orch host rm <host>
+   ceph orch host rm <host>
 
 Offline host removal
 --------------------
 
 
 Offline host removal
 --------------------
 
-If a host is offline and can not be recovered it can still be removed from the cluster with the following:
+Even if a host is offline and can not be recovered, it can be removed from the
+cluster by running a command of the following form:
 
 .. prompt:: bash #
 
 
 .. prompt:: bash #
 
-  ceph orch host rm <host> --offline --force
+   ceph orch host rm <host> --offline --force
 
 
-This can potentially cause data loss as osds will be forcefully purged from the cluster by calling ``osd purge-actual`` for each osd.
-Service specs that still contain this host should be manually updated.
+.. warning:: This can potentially cause data loss. This command forcefully
+   purges OSDs from the cluster by calling ``osd purge-actual`` for each OSD.
+   Any service specs that still contain this host should be manually updated.
 
 .. _orchestrator-host-labels:
 
 
 .. _orchestrator-host-labels:
 
@@ -122,18 +137,24 @@ are free form and have no particular meaning by itself and each host
 can have multiple labels. They can be used to specify placement
 of daemons. See :ref:`orch-placement-by-labels`
 
 can have multiple labels. They can be used to specify placement
 of daemons. See :ref:`orch-placement-by-labels`
 
-Labels can be added when adding a host with the ``--labels`` flag::
+Labels can be added when adding a host with the ``--labels`` flag:
+
+.. prompt:: bash #
 
 
-  ceph orch host add my_hostname --labels=my_label1
-  ceph orch host add my_hostname --labels=my_label1,my_label2
+   ceph orch host add my_hostname --labels=my_label1
+   ceph orch host add my_hostname --labels=my_label1,my_label2
 
 
-To add a label a existing host, run::
+To add a label a existing host, run:
 
 
-  ceph orch host label add my_hostname my_label
+.. prompt:: bash #
 
 
-To remove a label, run::
+   ceph orch host label add my_hostname my_label
 
 
-  ceph orch host label rm my_hostname my_label
+To remove a label, run:
+
+.. prompt:: bash #
+
+   ceph orch host label rm my_hostname my_label
 
 
 .. _cephadm-special-host-labels:
 
 
 .. _cephadm-special-host-labels:
@@ -168,10 +189,12 @@ The following host labels have a special meaning to cephadm.  All start with ``_
 Maintenance Mode
 ================
 
 Maintenance Mode
 ================
 
-Place a host in and out of maintenance mode (stops all Ceph daemons on host)::
+Place a host in and out of maintenance mode (stops all Ceph daemons on host):
 
 
-    ceph orch host maintenance enter <hostname> [--force]
-    ceph orch host maintenance exit <hostname>
+.. prompt:: bash #
+
+   ceph orch host maintenance enter <hostname> [--force]
+   ceph orch host maintenance exit <hostname>
 
 Where the force flag when entering maintenance allows the user to bypass warnings (but not alerts)
 
 
 Where the force flag when entering maintenance allows the user to bypass warnings (but not alerts)
 
@@ -182,15 +205,22 @@ Rescanning Host Devices
 
 Some servers and external enclosures may not register device removal or insertion with the
 kernel. In these scenarios, you'll need to perform a host rescan. A rescan is typically
 
 Some servers and external enclosures may not register device removal or insertion with the
 kernel. In these scenarios, you'll need to perform a host rescan. A rescan is typically
-non-disruptive, and can be performed with the following CLI command.::
+non-disruptive, and can be performed with the following CLI command:
+
+.. prompt:: bash #
 
 
-    ceph orch host rescan <hostname> [--with-summary]
+   ceph orch host rescan <hostname> [--with-summary]
 
 The ``with-summary`` flag provides a breakdown of the number of HBAs found and scanned, together
 
 The ``with-summary`` flag provides a breakdown of the number of HBAs found and scanned, together
-with any that failed.::
+with any that failed:
+
+.. prompt:: bash [ceph:root@rh9-ceph1/]#
+
+   ceph orch host rescan rh9-ceph1 --with-summary
+   
+::
 
 
-    [ceph: root@rh9-ceph1 /]# ceph orch host rescan rh9-ceph1 --with-summary
-    Ok. 2 adapters detected: 2 rescanned, 0 skipped, 0 failed (0.32s)
+   Ok. 2 adapters detected: 2 rescanned, 0 skipped, 0 failed (0.32s)
 
 Creating many hosts at once
 ===========================
 
 Creating many hosts at once
 ===========================
@@ -217,9 +247,10 @@ Many hosts can be added at once using
     hostname: node-02
     addr: 192.168.0.12
 
     hostname: node-02
     addr: 192.168.0.12
 
-This can be combined with service specifications (below) to create a cluster spec
-file to deploy a whole cluster in one command.  see ``cephadm bootstrap --apply-spec``
-also to do this during bootstrap. Cluster SSH Keys must be copied to hosts prior to adding them.
+This can be combined with :ref:`service specifications<orchestrator-cli-service-spec>`
+to create a cluster spec file to deploy a whole cluster in one command.  see
+``cephadm bootstrap --apply-spec`` also to do this during bootstrap. Cluster
+SSH Keys must be copied to hosts prior to adding them.
 
 Setting the initial CRUSH location of host
 ==========================================
 
 Setting the initial CRUSH location of host
 ==========================================
@@ -246,8 +277,10 @@ See also :ref:`crush_map_default_types`.
 OS Tuning Profiles
 ==================
 
 OS Tuning Profiles
 ==================
 
-Cephadm can manage operating system tuning profiles that apply a set of sysctl settings
-to a given set of hosts. First create a YAML spec file in the following format
+Cephadm can be used to manage operating-system-tuning profiles that apply sets
+of sysctl settings to sets of hosts. 
+
+Create a YAML spec file in the following format:
 
 .. code-block:: yaml
 
 
 .. code-block:: yaml
 
@@ -260,77 +293,90 @@ to a given set of hosts. First create a YAML spec file in the following format
       fs.file-max: 1000000
       vm.swappiness: '13'
 
       fs.file-max: 1000000
       vm.swappiness: '13'
 
-Then apply the tuning profile with::
+Apply the tuning profile with the following command:
 
 
-    ceph orch tuned-profile apply -i <tuned-profile-file-name>
+.. prompt:: bash #
 
 
-This profile will then be written to ``/etc/sysctl.d/`` on each host matching the
-given placement and `sysctl --system` will be run on the host.
+   ceph orch tuned-profile apply -i <tuned-profile-file-name>
+
+This profile is written to ``/etc/sysctl.d/`` on each host that matches the
+hosts specified in the placement block of the yaml, and ``sysctl --system`` is
+run on the host.
 
 .. note::
 
 
 .. note::
 
-  The exact filename the profile will be written to is within ``/etc/sysctl.d/`` is
-  ``<profile-name>-cephadm-tuned-profile.conf`` where <profile-name>
-  is the `profile_name` setting specified in the provided YAML spec. Since sysctl
-  settings are applied in lexicographical order by the filename the setting is
-  specified in, you may want to set the `profile_name` in your spec so
-  that it is applied before or after other conf files that may exist.
+  The exact filename that the profile is written to within ``/etc/sysctl.d/``
+  is ``<profile-name>-cephadm-tuned-profile.conf``, where ``<profile-name>`` is
+  the ``profile_name`` setting that you specify in the YAML spec. Because
+  sysctl settings are applied in lexicographical order (sorted by the filename
+  in which the setting is specified), you may want to set the ``profile_name``
+  in your spec so that it is applied before or after other conf files.
 
 .. note::
 
   These settings are applied only at the host level, and are not specific
 
 .. note::
 
   These settings are applied only at the host level, and are not specific
-  to any certain daemon or container
+  to any particular daemon or container.
 
 .. note::
 
 
 .. note::
 
-  Applying tuned profiles is idempotent when the ``--no-overwrite`` option is passed.
-  In this case existing profiles with the same name are not overwritten.
+  Applying tuned profiles is idempotent when the ``--no-overwrite`` option is
+  passed. Moreover, if the ``--no-overwrite`` option is passed, existing
+  profiles with the same name are not overwritten.
 
 
 Viewing Profiles
 ----------------
 
 
 
 Viewing Profiles
 ----------------
 
-To view all current profiles cephadm is managing::
+Run the following command to view all the profiles that cephadm currently manages:
+
+.. prompt:: bash #
 
 
-    ceph orch tuned-profile ls
+   ceph orch tuned-profile ls
 
 .. note:: 
 
 
 .. note:: 
 
-  If you'd like to make modifications and re-apply a profile passing `--format yaml` to the
-  ``tuned-profile ls`` command will present the profiles in a format where they can be copied
-  and re-applied.
+  To make modifications and re-apply a profile, pass ``--format yaml`` to the
+  ``tuned-profile ls`` command. The ``tuned-profile ls --format yaml`` command
+  presents the profiles in a format that is easy to copy and re-apply.
 
 
 Removing Profiles
 -----------------
 
 
 
 Removing Profiles
 -----------------
 
-If you no longer want one of the previously applied profiles, it can be removed with::
+To remove a previously applied profile, run this command:
+
+.. prompt:: bash #
 
 
-    ceph orch tuned-profile rm <profile-name>
+   ceph orch tuned-profile rm <profile-name>
 
 
-When a profile is removed, cephadm will clean up the file previously written to /etc/sysctl.d
+When a profile is removed, cephadm cleans up the file previously written to ``/etc/sysctl.d``.
 
 
 Modifying Profiles
 ------------------
 
 
 
 Modifying Profiles
 ------------------
 
-While you can modify a profile by simply re-applying a YAML spec with the same profile name,
-you may also want to adjust a setting within a given profile, so there are commands
-for this purpose.
+Profiles can be modified by re-applying a YAML spec with the same name as the
+profile that you want to modify, but settings within existing profiles can be
+adjusted with the following commands.
 
 
-To add or modify a setting for an existing profile::
+To add or modify a setting in an existing profile:
 
 
-    ceph orch tuned-profile add-setting <setting-name> <value>
+.. prompt:: bash #
+
+   ceph orch tuned-profile add-setting <profile-name> <setting-name> <value>
+
+To remove a setting from an existing profile:
 
 
-To remove a setting from an existing profile::
+.. prompt:: bash #
 
 
-    ceph orch tuned-profile rm-setting <setting-name>
+   ceph orch tuned-profile rm-setting <profile-name> <setting-name>
 
 .. note:: 
 
 
 .. note:: 
 
-  Modifying the placement will require re-applying a profile with the same name. Keep
-  in mind that profiles are tracked by their name, so whenever a profile with the same
-  name as an existing profile is applied, it will overwrite the old profile.
+  Modifying the placement requires re-applying a profile with the same name.
+  Remember that profiles are tracked by their names, so when a profile with the
+  same name as an existing profile is applied, it overwrites the old profile
+  unless the ``--no-overwrite`` flag is passed.
 
 SSH Configuration
 =================
 
 SSH Configuration
 =================
@@ -347,26 +393,36 @@ connect to remote hosts.  When the cluster is bootstrapped, this SSH
 key is generated automatically and no additional configuration
 is necessary.
 
 key is generated automatically and no additional configuration
 is necessary.
 
-A *new* SSH key can be generated with::
+A *new* SSH key can be generated with:
+
+.. prompt:: bash #
+
+   ceph cephadm generate-key
+
+The public portion of the SSH key can be retrieved with:
+
+.. prompt:: bash #
+
+   ceph cephadm get-pub-key
 
 
-  ceph cephadm generate-key
+The currently stored SSH key can be deleted with:
 
 
-The public portion of the SSH key can be retrieved with::
+.. prompt:: bash #
 
 
-  ceph cephadm get-pub-key
+   ceph cephadm clear-key
 
 
-The currently stored SSH key can be deleted with::
+You can make use of an existing key by directly importing it with:
 
 
-  ceph cephadm clear-key
+.. prompt:: bash #
 
 
-You can make use of an existing key by directly importing it with::
+   ceph config-key set mgr/cephadm/ssh_identity_key -i <key>
+   ceph config-key set mgr/cephadm/ssh_identity_pub -i <pub>
 
 
-  ceph config-key set mgr/cephadm/ssh_identity_key -i <key>
-  ceph config-key set mgr/cephadm/ssh_identity_pub -i <pub>
+You will then need to restart the mgr daemon to reload the configuration with:
 
 
-You will then need to restart the mgr daemon to reload the configuration with::
+.. prompt:: bash #
 
 
-  ceph mgr fail
+   ceph mgr fail
 
 .. _cephadm-ssh-user:
 
 
 .. _cephadm-ssh-user:
 
@@ -378,11 +434,13 @@ that has enough privileges to download container images, start containers
 and execute commands without prompting for a password. If you do not want
 to use the "root" user (default option in cephadm), you must provide
 cephadm the name of the user that is going to be used to perform all the
 and execute commands without prompting for a password. If you do not want
 to use the "root" user (default option in cephadm), you must provide
 cephadm the name of the user that is going to be used to perform all the
-cephadm operations. Use the command::
+cephadm operations. Use the command:
 
 
-  ceph cephadm set-user <user>
+.. prompt:: bash #
+
+   ceph cephadm set-user <user>
 
 
-Prior to running this the cluster ssh key needs to be added to this users
+Prior to running this the cluster SSH key needs to be added to this users
 authorized_keys file and non-root users must have passwordless sudo access.
 
 
 authorized_keys file and non-root users must have passwordless sudo access.
 
 
@@ -401,17 +459,23 @@ something like this::
 There are two ways to customize this configuration for your environment:
 
 #. Import a customized configuration file that will be stored
 There are two ways to customize this configuration for your environment:
 
 #. Import a customized configuration file that will be stored
-   by the monitor with::
+   by the monitor with:
 
 
-     ceph cephadm set-ssh-config -i <ssh_config_file>
+   .. prompt:: bash #
 
 
-   To remove a customized SSH config and revert back to the default behavior::
+      ceph cephadm set-ssh-config -i <ssh_config_file>
 
 
-     ceph cephadm clear-ssh-config
+   To remove a customized SSH config and revert back to the default behavior:
 
 
-#. You can configure a file location for the SSH configuration file with::
+   .. prompt:: bash #
+
+      ceph cephadm clear-ssh-config
+
+#. You can configure a file location for the SSH configuration file with:
+
+   .. prompt:: bash #
 
 
-     ceph config set mgr mgr/cephadm/ssh_config_file <path>
+      ceph config set mgr mgr/cephadm/ssh_config_file <path>
 
    We do *not recommend* this approach.  The path name must be
    visible to *any* mgr daemon, and cephadm runs all daemons as
 
    We do *not recommend* this approach.  The path name must be
    visible to *any* mgr daemon, and cephadm runs all daemons as
@@ -476,4 +540,4 @@ requires the bare host name when adding a host to the cluster:
 
 ..
   TODO: This chapter needs to provide way for users to configure
 
 ..
   TODO: This chapter needs to provide way for users to configure
-  Grafana in the dashboard, as this is right no very hard to do.
+  Grafana in the dashboard, as this is right now very hard to do.
index d57fe288a01d6a8be810b926bca600f4a168b010..bfa3a4bb23b6306f8e478c8dcb50fa0ebcb26d23 100644 (file)
@@ -4,21 +4,36 @@
 Cephadm
 =======
 
 Cephadm
 =======
 
-``cephadm`` deploys and manages a Ceph cluster. It does this by connecting the
-manager daemon to hosts via SSH. The manager daemon is able to add, remove, and
-update Ceph containers. ``cephadm`` does not rely on external configuration
-tools such as Ansible, Rook, and Salt.
-
-``cephadm`` manages the full lifecycle of a Ceph cluster. This lifecycle
-starts with the bootstrapping process, when ``cephadm`` creates a tiny
-Ceph cluster on a single node. This cluster consists of one monitor and
-one manager. ``cephadm`` then uses the orchestration interface ("day 2"
-commands) to expand the cluster, adding all hosts and provisioning all
-Ceph daemons and services. Management of this lifecycle can be performed
-either via the Ceph command-line interface (CLI) or via the dashboard (GUI).
-
-``cephadm`` is new in Ceph release v15.2.0 (Octopus) and does not support older
-versions of Ceph.
+``cephadm`` is a utility that is used to manage a Ceph cluster. 
+
+Here is a list of some of the things that ``cephadm`` can do:
+
+- ``cephadm`` can add a Ceph container to the cluster.
+- ``cephadm`` can remove a Ceph container from the cluster.
+- ``cephadm`` can update Ceph containers.
+
+``cephadm`` does not rely on external configuration tools like Ansible, Rook,
+or Salt. However, those external configuration tools can be used to automate
+operations not performed by cephadm itself. To learn more about these external
+configuration tools, visit their pages:
+
+ * https://github.com/ceph/cephadm-ansible
+ * https://rook.io/docs/rook/v1.10/Getting-Started/intro/
+ * https://github.com/ceph/ceph-salt
+
+``cephadm`` manages the full lifecycle of a Ceph cluster. This lifecycle starts
+with the bootstrapping process, when ``cephadm`` creates a tiny Ceph cluster on
+a single node. This cluster consists of one monitor and one manager.
+``cephadm`` then uses the orchestration interface to expand the cluster, adding
+hosts and provisioning Ceph daemons and services. Management of this lifecycle
+can be performed either via the Ceph command-line interface (CLI) or via the
+dashboard (GUI).
+
+To use ``cephadm`` to get started with Ceph, follow the instructions in
+:ref:`cephadm_deploying_new_cluster`.
+
+``cephadm`` was introduced in Ceph release v15.2.0 (Octopus) and does not
+support older versions of Ceph.
 
 .. toctree::
     :maxdepth: 2
 
 .. toctree::
     :maxdepth: 2
index 845297fa20c1aba0e62dec9a178394c0958f4a5b..5ce84e008106e51e7afe8212885e191b828ce5bf 100644 (file)
@@ -1,3 +1,5 @@
+.. _cephadm_deploying_new_cluster:
+
 ============================
 Deploying a new Ceph cluster
 ============================
 ============================
 Deploying a new Ceph cluster
 ============================
@@ -8,7 +10,6 @@ then deploying the needed services.
 
 .. highlight:: console
 
 
 .. highlight:: console
 
-
 .. _cephadm-host-requirements:
 
 Requirements
 .. _cephadm-host-requirements:
 
 Requirements
@@ -35,25 +36,20 @@ Ceph.
 Install cephadm
 ===============
 
 Install cephadm
 ===============
 
-The ``cephadm`` command can 
-
-#. bootstrap a new cluster
-#. launch a containerized shell with a working Ceph CLI
-#. aid in debugging containerized Ceph daemons
-
 There are two ways to install ``cephadm``:
 
 #. a :ref:`curl-based installation<cephadm_install_curl>` method
 #. :ref:`distribution-specific installation methods<cephadm_install_distros>`
 
 There are two ways to install ``cephadm``:
 
 #. a :ref:`curl-based installation<cephadm_install_curl>` method
 #. :ref:`distribution-specific installation methods<cephadm_install_distros>`
 
+
 .. _cephadm_install_curl:
 
 curl-based installation
 -----------------------
 
 * Use ``curl`` to fetch the most recent version of the
 .. _cephadm_install_curl:
 
 curl-based installation
 -----------------------
 
 * Use ``curl`` to fetch the most recent version of the
-  standalone script. 
-  
+  standalone script.
+
   .. prompt:: bash #
      :substitutions:
 
   .. prompt:: bash #
      :substitutions:
 
@@ -154,7 +150,7 @@ Running the bootstrap command
 
 Run the ``ceph bootstrap`` command:
 
 
 Run the ``ceph bootstrap`` command:
 
-.. prompt:: bash # 
+.. prompt:: bash #
 
    cephadm bootstrap --mon-ip *<mon-ip>*
 
 
    cephadm bootstrap --mon-ip *<mon-ip>*
 
@@ -173,11 +169,11 @@ This command will:
   with this label will (also) get a copy of ``/etc/ceph/ceph.conf`` and
   ``/etc/ceph/ceph.client.admin.keyring``.
 
   with this label will (also) get a copy of ``/etc/ceph/ceph.conf`` and
   ``/etc/ceph/ceph.client.admin.keyring``.
 
-Further information about cephadm bootstrap 
+Further information about cephadm bootstrap
 -------------------------------------------
 
 The default bootstrap behavior will work for most users. But if you'd like
 -------------------------------------------
 
 The default bootstrap behavior will work for most users. But if you'd like
-immediately to know more about ``cephadm bootstrap``, read the list below.  
+immediately to know more about ``cephadm bootstrap``, read the list below.
 
 Also, you can run ``cephadm bootstrap -h`` to see all of ``cephadm``'s
 available options.
 
 Also, you can run ``cephadm bootstrap -h`` to see all of ``cephadm``'s
 available options.
@@ -216,20 +212,20 @@ available options.
       EOF
       $ ./cephadm bootstrap --config initial-ceph.conf ...
 
       EOF
       $ ./cephadm bootstrap --config initial-ceph.conf ...
 
-* The ``--ssh-user *<user>*`` option makes it possible to choose which ssh
-  user cephadm will use to connect to hosts. The associated ssh key will be
-  added to ``/home/*<user>*/.ssh/authorized_keys``. The user that you 
+* The ``--ssh-user *<user>*`` option makes it possible to choose which SSH
+  user cephadm will use to connect to hosts. The associated SSH key will be
+  added to ``/home/*<user>*/.ssh/authorized_keys``. The user that you
   designate with this option must have passwordless sudo access.
 
 * If you are using a container on an authenticated registry that requires
   login, you may add the argument:
 
   designate with this option must have passwordless sudo access.
 
 * If you are using a container on an authenticated registry that requires
   login, you may add the argument:
 
-  * ``--registry-json <path to json file>`` 
+  * ``--registry-json <path to json file>``
 
   example contents of JSON file with login info::
 
       {"url":"REGISTRY_URL", "username":"REGISTRY_USERNAME", "password":"REGISTRY_PASSWORD"}
 
   example contents of JSON file with login info::
 
       {"url":"REGISTRY_URL", "username":"REGISTRY_USERNAME", "password":"REGISTRY_PASSWORD"}
-  
+
   Cephadm will attempt to log in to this registry so it can pull your container
   and then store the login info in its config database. Other hosts added to
   the cluster will then also be able to make use of the authenticated registry.
   Cephadm will attempt to log in to this registry so it can pull your container
   and then store the login info in its config database. Other hosts added to
   the cluster will then also be able to make use of the authenticated registry.
@@ -278,7 +274,7 @@ command.  There are several ways to do this:
 Confirm that the ``ceph`` command is accessible with:
 
 .. prompt:: bash #
 Confirm that the ``ceph`` command is accessible with:
 
 .. prompt:: bash #
+
   ceph -v
 
 
   ceph -v
 
 
@@ -298,7 +294,7 @@ By default, a ``ceph.conf`` file and a copy of the ``client.admin`` keyring
 are maintained in ``/etc/ceph`` on all hosts with the ``_admin`` label, which is initially
 applied only to the bootstrap host. We usually recommend that one or more other hosts be
 given the ``_admin`` label so that the Ceph CLI (e.g., via ``cephadm shell``) is easily
 are maintained in ``/etc/ceph`` on all hosts with the ``_admin`` label, which is initially
 applied only to the bootstrap host. We usually recommend that one or more other hosts be
 given the ``_admin`` label so that the Ceph CLI (e.g., via ``cephadm shell``) is easily
-accessible on multiple hosts.  To add the ``_admin`` label to additional host(s),
+accessible on multiple hosts. To add the ``_admin`` label to additional host(s):
 
   .. prompt:: bash #
 
 
   .. prompt:: bash #
 
@@ -316,8 +312,8 @@ Please follow :ref:`deploy_additional_monitors` to deploy additional MONs.
 Adding Storage
 ==============
 
 Adding Storage
 ==============
 
-To add storage to the cluster, either tell Ceph to consume any
-available and unused device:
+To add storage to the cluster, you can tell Ceph to consume any
+available and unused device(s):
 
   .. prompt:: bash #
 
 
   .. prompt:: bash #
 
@@ -368,7 +364,9 @@ Different deployment scenarios
 Single host
 -----------
 
 Single host
 -----------
 
-To configure a Ceph cluster to run on a single host, use the ``--single-host-defaults`` flag when bootstrapping. For use cases of this, see :ref:`one-node-cluster`.
+To configure a Ceph cluster to run on a single host, use the
+``--single-host-defaults`` flag when bootstrapping. For use cases of this, see
+:ref:`one-node-cluster`.
 
 The ``--single-host-defaults`` flag sets the following configuration options::
 
 
 The ``--single-host-defaults`` flag sets the following configuration options::
 
@@ -376,30 +374,68 @@ The ``--single-host-defaults`` flag sets the following configuration options::
   global/osd_pool_default_size = 2
   mgr/mgr_standby_modules = False
 
   global/osd_pool_default_size = 2
   mgr/mgr_standby_modules = False
 
-For more information on these options, see :ref:`one-node-cluster` and ``mgr_standby_modules`` in :ref:`mgr-administrator-guide`.
+For more information on these options, see :ref:`one-node-cluster` and
+``mgr_standby_modules`` in :ref:`mgr-administrator-guide`.
+
+.. _cephadm-airgap:
 
 Deployment in an isolated environment
 -------------------------------------
 
 
 Deployment in an isolated environment
 -------------------------------------
 
-You can install Cephadm in an isolated environment by using a custom container registry. You can either configure Podman or Docker to use an insecure registry, or make the registry secure. Ensure your container image is inside the registry and that you have access to all hosts you wish to add to the cluster.
+You might need to install cephadm in an environment that is not connected
+directly to the internet (such an environment is also called an "isolated
+environment"). This can be done if a custom container registry is used. Either
+of two kinds of custom container registry can be used in this scenario: (1) a
+Podman-based or Docker-based insecure registry, or (2) a secure registry.
 
 
-Run a local container registry:
+The practice of installing software on systems that are not connected directly
+to the internet is called "airgapping" and registries that are not connected
+directly to the internet are referred to as "airgapped".
 
 
-.. prompt:: bash #
+Make sure that your container image is inside the registry. Make sure that you
+have access to all hosts that you plan to add to the cluster.
 
 
-   podman run --privileged -d --name registry -p 5000:5000 -v /var/lib/registry:/var/lib/registry --restart=always registry:2
+#. Run a local container registry:
 
 
-If you are using an insecure registry, configure Podman or Docker with the hostname and port where the registry is running.
+   .. prompt:: bash #
 
 
-.. note:: For every host which accesses the local insecure registry, you will need to repeat this step on the host.
+      podman run --privileged -d --name registry -p 5000:5000 -v /var/lib/registry:/var/lib/registry --restart=always registry:2
 
 
-Next, push your container image to your local registry.
+#. If you are using an insecure registry, configure Podman or Docker with the
+   hostname and port where the registry is running.
 
 
-Then run bootstrap using the ``--image`` flag with your container image. For example:
+   .. note:: You must repeat this step for every host that accesses the local
+             insecure registry.
 
 
-.. prompt:: bash #
+#. Push your container image to your local registry. Here are some acceptable
+   kinds of container images:
+
+   * Ceph container image. See :ref:`containers`.
+   * Prometheus container image
+   * Node exporter container image
+   * Grafana container image
+   * Alertmanager container image
+
+#. Create a temporary configuration file to store the names of the monitoring
+   images. (See :ref:`cephadm_monitoring-images`):
+
+   .. prompt:: bash $
+
+      cat <<EOF > initial-ceph.conf
+
+   ::
+
+      [mgr]
+      mgr/cephadm/container_image_prometheus *<hostname>*:5000/prometheus
+      mgr/cephadm/container_image_node_exporter *<hostname>*:5000/node_exporter
+      mgr/cephadm/container_image_grafana *<hostname>*:5000/grafana
+      mgr/cephadm/container_image_alertmanager *<hostname>*:5000/alertmanger
+
+#. Run bootstrap using the ``--image`` flag and pass the name of your
+   container image as the argument of the image flag. For example:
 
 
-   cephadm --image *<hostname>*:5000/ceph/ceph bootstrap --mon-ip *<mon-ip>*
+   .. prompt:: bash #
 
 
+      cephadm --image *<hostname>*:5000/ceph/ceph bootstrap --mon-ip *<mon-ip>*
 
 .. _cluster network: ../rados/configuration/network-config-ref#cluster-network
 
 .. _cluster network: ../rados/configuration/network-config-ref#cluster-network
index 9ec8371c89ad0805bbc9657e47cd173ce3444ba3..adc795d21e4e617805c2fd7675f4b8788f89aa37 100644 (file)
@@ -40,6 +40,68 @@ monitor hosts as well as to the monitor daemons' stderr.
 
 .. _cephadm-logs:
 
 
 .. _cephadm-logs:
 
+
+Ceph daemon control
+===================
+
+Starting and stopping daemons
+-----------------------------
+
+You can stop, start, or restart a daemon with:
+
+.. prompt:: bash #
+
+   ceph orch daemon stop <name>
+   ceph orch daemon start <name>
+   ceph orch daemon restart <name>
+
+You can also do the same for all daemons for a service with:   
+
+.. prompt:: bash #
+
+   ceph orch stop <name>
+   ceph orch start <name>
+   ceph orch restart <name>
+
+
+Redeploying or reconfiguring a daemon
+-------------------------------------
+
+The container for a daemon can be stopped, recreated, and restarted with
+the ``redeploy`` command:
+
+.. prompt:: bash #
+
+   ceph orch daemon redeploy <name> [--image <image>]
+
+A container image name can optionally be provided to force a
+particular image to be used (instead of the image specified by the
+``container_image`` config value).
+
+If only the ceph configuration needs to be regenerated, you can also
+issue a ``reconfig`` command, which will rewrite the ``ceph.conf``
+file but will not trigger a restart of the daemon.
+
+.. prompt:: bash #
+
+   ceph orch daemon reconfig <name>
+
+
+Rotating a daemon's authenticate key
+------------------------------------
+
+All Ceph and gateway daemons in the cluster have a secret key that is used to connect
+to and authenticate with the cluster.  This key can be rotated (i.e., replaced with a
+new key) with the following command:
+
+.. prompt:: bash #
+
+   ceph orch daemon rotate-key <name>
+
+For MDS, OSD, and MGR daemons, this does not require a daemon restart.  For other
+daemons, however (e.g., RGW), the daemon may be restarted to switch to the new key.
+
+
 Ceph daemon logs
 ================
 
 Ceph daemon logs
 ================
 
index d6520ea407f8fe6c5e0a41fc52f8ae0cf682ac5d..605a0215239a247f6867df5ce04e3a13b6251158 100644 (file)
@@ -496,11 +496,20 @@ candidate hosts.
    If there are fewer hosts selected by the placement specification than
    demanded by ``count``, cephadm will deploy only on the selected hosts.
 
    If there are fewer hosts selected by the placement specification than
    demanded by ``count``, cephadm will deploy only on the selected hosts.
 
+.. _cephadm-extra-container-args:
+
 Extra Container Arguments
 =========================
 
 .. warning:: 
 Extra Container Arguments
 =========================
 
 .. warning:: 
-  The arguments provided for extra container args are limited to whatever arguments are available for a `run` command from whichever container engine you are using. Providing any arguments the `run` command does not support (or invalid values for arguments) will cause the daemon to fail to start.
+  The arguments provided for extra container args are limited to whatever arguments are available for
+  a `run` command from whichever container engine you are using. Providing any arguments the `run`
+  command does not support (or invalid values for arguments) will cause the daemon to fail to start.
+
+.. note::
+
+  For arguments passed to the process running inside the container rather than the for
+  the container runtime itself, see :ref:`cephadm-extra-entrypoint-args`
 
 
 Cephadm supports providing extra miscellaneous container arguments for
 
 
 Cephadm supports providing extra miscellaneous container arguments for
@@ -518,10 +527,56 @@ a spec like
         - host2
         - host3
     extra_container_args:
         - host2
         - host3
     extra_container_args:
-      -  "--cpus=2"
+      - "--cpus=2"
 
 which would cause each mon daemon to be deployed with `--cpus=2`.
 
 
 which would cause each mon daemon to be deployed with `--cpus=2`.
 
+Mounting Files with Extra Container Arguments
+---------------------------------------------
+
+A common use case for extra container arguments is to mount additional
+files within the container. However, some intuitive formats for doing
+so can cause deployment to fail (see https://tracker.ceph.com/issues/57338).
+The recommended syntax for mounting a file with extra container arguments is:
+
+.. code-block:: yaml
+
+    extra_container_args:
+      - "-v"
+      - "/absolute/file/path/on/host:/absolute/file/path/in/container"
+
+For example:
+
+.. code-block:: yaml
+
+    extra_container_args:
+      - "-v"
+      - "/opt/ceph_cert/host.cert:/etc/grafana/certs/cert_file:ro"
+
+.. _cephadm-extra-entrypoint-args:
+
+Extra Entrypoint Arguments
+==========================
+
+.. note::
+
+  For arguments intended for the container runtime rather than the process inside
+  it, see :ref:`cephadm-extra-container-args`
+
+Similar to extra container args for the container runtime, Cephadm supports
+appending to args passed to the entrypoint process running
+within a container. For example, to set the collector textfile directory for
+the node-exporter service , one could apply a service spec like
+
+.. code-block:: yaml
+
+  service_type: node-exporter
+  service_name: node-exporter
+  placement:
+    host_pattern: '*'
+  extra_entrypoint_args:
+    - "--collector.textfile.directory=/var/lib/node_exporter/textfile_collector2"
+
 Custom Config Files
 ===================
 
 Custom Config Files
 ===================
 
index 08ccd94821e081006b6aaf503482531ed812c0cc..2b989a3a95c4dcb940014674f8448665cded2e7b 100644 (file)
@@ -125,6 +125,8 @@ example spec file:
     spec:
       port: 4200
 
     spec:
       port: 4200
 
+.. _cephadm_monitoring-images:
+
 Using custom images
 ~~~~~~~~~~~~~~~~~~~
 
 Using custom images
 ~~~~~~~~~~~~~~~~~~~
 
@@ -183,6 +185,8 @@ For example, if you had changed the prometheus image
 
           ceph config rm mgr mgr/cephadm/container_image_prometheus
 
 
           ceph config rm mgr mgr/cephadm/container_image_prometheus
 
+See also :ref:`cephadm-airgap`.
+
 .. _cephadm-overwrite-jinja2-templates:
 
 Using custom configuration files
 .. _cephadm-overwrite-jinja2-templates:
 
 Using custom configuration files
@@ -314,6 +318,36 @@ Due to performance reasons, monitoring of RBD images is disabled by default. For
 :ref:`prometheus-rbd-io-statistics`. If disabled, the overview and details dashboards will stay empty in Grafana
 and the metrics will not be visible in Prometheus.
 
 :ref:`prometheus-rbd-io-statistics`. If disabled, the overview and details dashboards will stay empty in Grafana
 and the metrics will not be visible in Prometheus.
 
+Setting up Prometheus
+-----------------------
+
+Setting Prometheus Retention Size and Time
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+Cephadm can configure Prometheus TSDB retention by specifying ``retention_time``
+and ``retention_size`` values in the Prometheus service spec.
+The retention time value defaults to 15 days (15d). Users can set a different value/unit where
+supported units are: 'y', 'w', 'd', 'h', 'm' and 's'. The retention size value defaults
+to 0 (disabled). Supported units in this case are: 'B', 'KB', 'MB', 'GB', 'TB', 'PB' and 'EB'.
+
+In the following example spec we set the retention time to 1 year and the size to 1GB.
+
+.. code-block:: yaml
+
+    service_type: prometheus
+    placement:
+      count: 1
+    spec:
+      retention_time: "1y"
+      retention_size: "1GB"
+
+.. note::
+
+  If you already had Prometheus daemon(s) deployed before and are updating an
+  existent spec as opposed to doing a fresh Prometheus deployment, you must also
+  tell cephadm to redeploy the Prometheus daemon(s) to put this change into effect.
+  This can be done with a ``ceph orch redeploy prometheus`` command.
+
 Setting up Grafana
 ------------------
 
 Setting up Grafana
 ------------------
 
index 70a4ad0cd13d71323ed6d43e32a01c185a6c5e2d..d9554006c1a69ecbcb9d9d7183973aba9fe26b37 100644 (file)
@@ -301,6 +301,7 @@ Expected output::
 
 This resets the initial state of the OSD and takes it off the removal queue.
 
 
 This resets the initial state of the OSD and takes it off the removal queue.
 
+.. _cephadm-replacing-an-osd:
 
 Replacing an OSD
 ----------------
 
 Replacing an OSD
 ----------------
@@ -913,6 +914,57 @@ It is also possible to specify directly device paths in specific hosts like the
 
 This can easily be done with other filters, like `size` or `vendor` as well.
 
 
 This can easily be done with other filters, like `size` or `vendor` as well.
 
+It's possible to specify the `crush_device_class` parameter within the
+DriveGroup spec, and it's applied to all the devices defined by the `paths`
+keyword:
+
+.. code-block:: yaml
+
+    service_type: osd
+    service_id: osd_using_paths
+    placement:
+      hosts:
+        - Node01
+        - Node02
+    crush_device_class: ssd
+    spec:
+      data_devices:
+        paths:
+        - /dev/sdb
+        - /dev/sdc
+      db_devices:
+        paths:
+        - /dev/sdd
+      wal_devices:
+        paths:
+        - /dev/sde
+
+The `crush_device_class` parameter, however, can be defined for each OSD passed
+using the `paths` keyword with the following syntax:
+
+.. code-block:: yaml
+
+    service_type: osd
+    service_id: osd_using_paths
+    placement:
+      hosts:
+        - Node01
+        - Node02
+    crush_device_class: ssd
+    spec:
+      data_devices:
+        paths:
+        - path: /dev/sdb
+          crush_device_class: ssd
+        - path: /dev/sdc
+          crush_device_class: nvme
+      db_devices:
+        paths:
+        - /dev/sdd
+      wal_devices:
+        paths:
+        - /dev/sde
+
 .. _cephadm-osd-activate:
 
 Activate existing OSDs
 .. _cephadm-osd-activate:
 
 Activate existing OSDs
index 58318b727e14562819b6da56f93b6dbce306fa59..d0a58000130c04fc10be4d66d19357d5c2e01614 100644 (file)
@@ -164,8 +164,10 @@ for RGW with a minimum set of configuration options.  The orchestrator will
 deploy and manage a combination of haproxy and keepalived to provide load
 balancing on a floating virtual IP.
 
 deploy and manage a combination of haproxy and keepalived to provide load
 balancing on a floating virtual IP.
 
-If SSL is used, then SSL must be configured and terminated by the ingress service
-and not RGW itself.
+If the RGW service is configured with SSL enabled, then the ingress service
+will use the `ssl` and `verify none` options in the backend configuration.
+Trust verification is disabled because the backends are accessed by IP 
+address instead of FQDN.
 
 .. image:: ../../images/HAProxy_for_RGW.svg
 
 
 .. image:: ../../images/HAProxy_for_RGW.svg
 
@@ -186,8 +188,7 @@ between all the RGW daemons available.
 Prerequisites
 -------------
 
 Prerequisites
 -------------
 
-* An existing RGW service, without SSL.  (If you want SSL service, the certificate
-  should be configured on the ingress service, not the RGW service.)
+* An existing RGW service.
 
 Deploying
 ---------
 
 Deploying
 ---------
index b7d295b1296c3d9167e92a397353e7e625e88cd4..5ec692881661a76721fcd259ef63296d704f6f10 100644 (file)
@@ -1,22 +1,19 @@
 Troubleshooting
 ===============
 
 Troubleshooting
 ===============
 
-You might need to investigate why a cephadm command failed
+You may wish to investigate why a cephadm command failed
 or why a certain service no longer runs properly.
 
 or why a certain service no longer runs properly.
 
-Cephadm deploys daemons as containers. This means that
-troubleshooting those containerized daemons might work
-differently than you expect (and that is certainly true if
-you expect this troubleshooting to work the way that
-troubleshooting does when the daemons involved aren't
-containerized). 
+Cephadm deploys daemons within containers. This means that
+troubleshooting those containerized daemons will require
+a different process than traditional package-install daemons.
 
 Here are some tools and commands to help you troubleshoot
 your Ceph environment.
 
 .. _cephadm-pause:
 
 
 Here are some tools and commands to help you troubleshoot
 your Ceph environment.
 
 .. _cephadm-pause:
 
-Pausing or disabling cephadm
+Pausing or Disabling cephadm
 ----------------------------
 
 If something goes wrong and cephadm is behaving badly, you can
 ----------------------------
 
 If something goes wrong and cephadm is behaving badly, you can
@@ -45,16 +42,15 @@ See :ref:`cephadm-spec-unmanaged` for information on disabling
 individual services.
 
 
 individual services.
 
 
-Per-service and per-daemon events
+Per-service and Per-daemon Events
 ---------------------------------
 
 ---------------------------------
 
-In order to help with the process of debugging failed daemon
-deployments, cephadm stores events per service and per daemon.
+In order to facilitate debugging failed daemons,
+cephadm stores events per service and per daemon.
 These events often contain information relevant to
 These events often contain information relevant to
-troubleshooting
-your Ceph cluster. 
+troubleshooting your Ceph cluster. 
 
 
-Listing service events
+Listing Service Events
 ~~~~~~~~~~~~~~~~~~~~~~
 
 To see the events associated with a certain service, run a
 ~~~~~~~~~~~~~~~~~~~~~~
 
 To see the events associated with a certain service, run a
@@ -82,7 +78,7 @@ This will return something in the following form:
   - '2021-02-01T12:09:25.264584 service:alertmanager [ERROR] "Failed to apply: Cannot
     place <AlertManagerSpec for service_name=alertmanager> on unknown_host: Unknown hosts"'
 
   - '2021-02-01T12:09:25.264584 service:alertmanager [ERROR] "Failed to apply: Cannot
     place <AlertManagerSpec for service_name=alertmanager> on unknown_host: Unknown hosts"'
 
-Listing daemon events
+Listing Daemon Events
 ~~~~~~~~~~~~~~~~~~~~~
 
 To see the events associated with a certain daemon, run a
 ~~~~~~~~~~~~~~~~~~~~~
 
 To see the events associated with a certain daemon, run a
@@ -106,16 +102,16 @@ This will return something in the following form:
     mds.cephfs.hostname.ppdhsz on host 'hostname'"
 
 
     mds.cephfs.hostname.ppdhsz on host 'hostname'"
 
 
-Checking cephadm logs
+Checking Cephadm Logs
 ---------------------
 
 ---------------------
 
-To learn how to monitor the cephadm logs as they are generated, read :ref:`watching_cephadm_logs`.
+To learn how to monitor cephadm logs as they are generated, read :ref:`watching_cephadm_logs`.
 
 
-If your Ceph cluster has been configured to log events to files, there will exist a
-cephadm log file called ``ceph.cephadm.log`` on all monitor hosts (see
-:ref:`cephadm-logs` for a more complete explanation of this).
+If your Ceph cluster has been configured to log events to files, there will be a
+``ceph.cephadm.log`` file on all monitor hosts (see
+:ref:`cephadm-logs` for a more complete explanation).
 
 
-Gathering log files
+Gathering Log Files
 -------------------
 
 Use journalctl to gather the log files of all daemons:
 -------------------
 
 Use journalctl to gather the log files of all daemons:
@@ -140,7 +136,7 @@ To fetch all log files of all daemons on a given host, run::
       cephadm logs --fsid <fsid> --name "$name" > $name;
     done
 
       cephadm logs --fsid <fsid> --name "$name" > $name;
     done
 
-Collecting systemd status
+Collecting Systemd Status
 -------------------------
 
 To print the state of a systemd unit, run::
 -------------------------
 
 To print the state of a systemd unit, run::
@@ -156,7 +152,7 @@ To fetch all state of all daemons of a given host, run::
     done
 
 
     done
 
 
-List all downloaded container images
+List all Downloaded Container Images
 ------------------------------------
 
 To list all container images that are downloaded on a host:
 ------------------------------------
 
 To list all container images that are downloaded on a host:
@@ -170,16 +166,16 @@ To list all container images that are downloaded on a host:
     "registry.opensuse.org/opensuse/leap:15.2"
 
 
     "registry.opensuse.org/opensuse/leap:15.2"
 
 
-Manually running containers
+Manually Running Containers
 ---------------------------
 
 ---------------------------
 
-Cephadm writes small wrappers that run a containers. Refer to
+Cephadm uses small wrappers when running containers. Refer to
 ``/var/lib/ceph/<cluster-fsid>/<service-name>/unit.run`` for the
 container execution command.
 
 .. _cephadm-ssh-errors:
 
 ``/var/lib/ceph/<cluster-fsid>/<service-name>/unit.run`` for the
 container execution command.
 
 .. _cephadm-ssh-errors:
 
-ssh errors
+SSH Errors
 ----------
 
 Error message::
 ----------
 
 Error message::
@@ -191,7 +187,7 @@ Error message::
   Please make sure that the host is reachable and accepts connections using the cephadm SSH key
   ...
 
   Please make sure that the host is reachable and accepts connections using the cephadm SSH key
   ...
 
-Things users can do:
+Things Ceph administrators can do:
 
 1. Ensure cephadm has an SSH identity key::
 
 
 1. Ensure cephadm has an SSH identity key::
 
@@ -208,7 +204,7 @@ Things users can do:
 
      [root@mon1 ~]# cat ~/cephadm_private_key | cephadm shell -- ceph cephadm set-ssk-key -i -
 
 
      [root@mon1 ~]# cat ~/cephadm_private_key | cephadm shell -- ceph cephadm set-ssk-key -i -
 
-2. Ensure that the ssh config is correct::
+2. Ensure that the SSH config is correct::
 
      [root@mon1 ~]# cephadm shell -- ceph cephadm get-ssh-config > config
 
 
      [root@mon1 ~]# cephadm shell -- ceph cephadm get-ssh-config > config
 
@@ -224,7 +220,7 @@ To verify that the public key is in the authorized_keys file, run the following
      [root@mon1 ~]# cephadm shell -- ceph cephadm get-pub-key > ~/ceph.pub
      [root@mon1 ~]# grep "`cat ~/ceph.pub`"  /root/.ssh/authorized_keys
 
      [root@mon1 ~]# cephadm shell -- ceph cephadm get-pub-key > ~/ceph.pub
      [root@mon1 ~]# grep "`cat ~/ceph.pub`"  /root/.ssh/authorized_keys
 
-Failed to infer CIDR network error
+Failed to Infer CIDR network error
 ----------------------------------
 
 If you see this error::
 ----------------------------------
 
 If you see this error::
@@ -241,7 +237,7 @@ This means that you must run a command of this form::
 
 For more detail on operations of this kind, see :ref:`deploy_additional_monitors`
 
 
 For more detail on operations of this kind, see :ref:`deploy_additional_monitors`
 
-Accessing the admin socket
+Accessing the Admin Socket
 --------------------------
 
 Each Ceph daemon provides an admin socket that bypasses the
 --------------------------
 
 Each Ceph daemon provides an admin socket that bypasses the
@@ -252,12 +248,12 @@ To access the admin socket, first enter the daemon container on the host::
     [root@mon1 ~]# cephadm enter --name <daemon-name>
     [ceph: root@mon1 /]# ceph --admin-daemon /var/run/ceph/ceph-<daemon-name>.asok config show
 
     [root@mon1 ~]# cephadm enter --name <daemon-name>
     [ceph: root@mon1 /]# ceph --admin-daemon /var/run/ceph/ceph-<daemon-name>.asok config show
 
-Calling miscellaneous ceph tools
+Running Various Ceph Tools
 --------------------------------
 
 --------------------------------
 
-To call miscellaneous like ``ceph-objectstore-tool`` or 
-``ceph-monstore-tool``, you can run them by calling 
-``cephadm shell --name <daemon-name>`` like so::
+To run Ceph tools like ``ceph-objectstore-tool`` or 
+``ceph-monstore-tool``, invoke the cephadm CLI with
+``cephadm shell --name <daemon-name>``.  For example::
 
     root@myhostname # cephadm unit --name mon.myhostname stop
     root@myhostname # cephadm shell --name mon.myhostname
 
     root@myhostname # cephadm unit --name mon.myhostname stop
     root@myhostname # cephadm shell --name mon.myhostname
@@ -272,21 +268,21 @@ To call miscellaneous like ``ceph-objectstore-tool`` or
     election_strategy: 1
     0: [v2:127.0.0.1:3300/0,v1:127.0.0.1:6789/0] mon.myhostname
 
     election_strategy: 1
     0: [v2:127.0.0.1:3300/0,v1:127.0.0.1:6789/0] mon.myhostname
 
-This command sets up the environment in a way that is suitable
-for extended daemon maintenance and running the daemon interactively. 
+The cephadm shell sets up the environment in a way that is suitable
+for extended daemon maintenance and running daemons interactively. 
 
 .. _cephadm-restore-quorum:
 
 
 .. _cephadm-restore-quorum:
 
-Restoring the MON quorum
-------------------------
+Restoring the Monitor Quorum
+----------------------------
 
 
-In case the Ceph MONs cannot form a quorum, cephadm is not able
-to manage the cluster, until the quorum is restored.
+If the Ceph monitor daemons (mons) cannot form a quorum, cephadm will not be
+able to manage the cluster until quorum is restored.
 
 
-In order to restore the MON quorum, remove unhealthy MONs
+In order to restore the quorum, remove unhealthy monitors
 form the monmap by following these steps:
 
 form the monmap by following these steps:
 
-1. Stop all MONs. For each MON host::
+1. Stop all mons. For each mon host::
 
     ssh {mon-host}
     cephadm unit --name mon.`hostname` stop
 
     ssh {mon-host}
     cephadm unit --name mon.`hostname` stop
@@ -301,18 +297,19 @@ form the monmap by following these steps:
 
 .. _cephadm-manually-deploy-mgr:
 
 
 .. _cephadm-manually-deploy-mgr:
 
-Manually deploying a MGR daemon
--------------------------------
-cephadm requires a MGR daemon in order to manage the cluster. In case the cluster
-the last MGR of a cluster was removed, follow these steps in order to deploy 
-a MGR ``mgr.hostname.smfvfd`` on a random host of your cluster manually. 
+Manually Deploying a Manager Daemon
+-----------------------------------
+At least one manager (mgr) daemon is required by cephadm in order to manage the
+cluster. If the last mgr in a cluster has been removed, follow these steps in
+order to deploy a manager called (for example)
+``mgr.hostname.smfvfd`` on a random host of your cluster manually. 
 
 Disable the cephadm scheduler, in order to prevent cephadm from removing the new 
 
 Disable the cephadm scheduler, in order to prevent cephadm from removing the new 
-MGR. See :ref:`cephadm-enable-cli`::
+manager. See :ref:`cephadm-enable-cli`::
 
   ceph config-key set mgr/cephadm/pause true
 
 
   ceph config-key set mgr/cephadm/pause true
 
-Then get or create the auth entry for the new MGR::
+Then get or create the auth entry for the new manager::
 
   ceph auth get-or-create mgr.hostname.smfvfd mon "profile mgr" osd "allow *" mds "allow *"
 
 
   ceph auth get-or-create mgr.hostname.smfvfd mon "profile mgr" osd "allow *" mds "allow *"
 
@@ -338,26 +335,26 @@ Deploy the daemon::
 
   cephadm --image <container-image> deploy --fsid <fsid> --name mgr.hostname.smfvfd --config-json config-json.json
 
 
   cephadm --image <container-image> deploy --fsid <fsid> --name mgr.hostname.smfvfd --config-json config-json.json
 
-Analyzing core dumps
+Analyzing Core Dumps
 ---------------------
 
 ---------------------
 
-In case a Ceph daemon crashes, cephadm supports analyzing core dumps. To enable core dumps, run
+When a Ceph daemon crashes, cephadm supports analyzing core dumps. To enable core dumps, run
 
 .. prompt:: bash #
 
   ulimit -c unlimited
 
 
 .. prompt:: bash #
 
   ulimit -c unlimited
 
-core dumps will now be written to ``/var/lib/systemd/coredump``.
+Core dumps will now be written to ``/var/lib/systemd/coredump``.
 
 .. note::
 
 
 .. note::
 
-  core dumps are not namespaced by the kernel, which means
+  Core dumps are not namespaced by the kernel, which means
   they will be written to ``/var/lib/systemd/coredump`` on
   the container host. 
 
   they will be written to ``/var/lib/systemd/coredump`` on
   the container host. 
 
-Now, wait for the crash to happen again. (To simulate the crash of a daemon, run e.g. ``killall -3 ceph-mon``)
+Now, wait for the crash to happen again. To simulate the crash of a daemon, run e.g. ``killall -3 ceph-mon``.
 
 
-Install debug packages by entering the cephadm shell and install ``ceph-debuginfo``::
+Install debug packages including ``ceph-debuginfo`` by entering the cephadm shelll::
 
   # cephadm shell --mount /var/lib/systemd/coredump
   [ceph: root@host1 /]# dnf install ceph-debuginfo gdb zstd
 
   # cephadm shell --mount /var/lib/systemd/coredump
   [ceph: root@host1 /]# dnf install ceph-debuginfo gdb zstd
index 221f212449f792df0ffbceec5b94831910f37212..2bbfc30e5dc0843bf23076aa665adc66588dcaea 100644 (file)
@@ -2,29 +2,6 @@
 Upgrading Ceph
 ==============
 
 Upgrading Ceph
 ==============
 
-.. DANGER:: DATE: 01 NOV 2021. 
-
-   DO NOT UPGRADE TO CEPH PACIFIC FROM AN OLDER VERSION.  
-
-   A recently-discovered bug (https://tracker.ceph.com/issues/53062) can cause
-   data corruption. This bug occurs during OMAP format conversion for
-   clusters that are updated to Pacific. New clusters are not affected by this
-   bug.
-
-   The trigger for this bug is BlueStore's repair/quick-fix functionality. This
-   bug can be triggered in two known ways: 
-
-    (1) manually via the ceph-bluestore-tool, or 
-    (2) automatically, by OSD if ``bluestore_fsck_quick_fix_on_mount`` is set 
-        to true.
-
-   The fix for this bug is expected to be available in Ceph v16.2.7.
-
-   DO NOT set ``bluestore_quick_fix_on_mount`` to true. If it is currently
-   set to true in your configuration, immediately set it to false.
-
-   DO NOT run ``ceph-bluestore-tool``'s repair/quick-fix commands.
-
 Cephadm can safely upgrade Ceph from one bugfix release to the next.  For
 example, you can upgrade from v15.2.0 (the first Octopus release) to the next
 point release, v15.2.1.
 Cephadm can safely upgrade Ceph from one bugfix release to the next.  For
 example, you can upgrade from v15.2.0 (the first Octopus release) to the next
 point release, v15.2.1.
@@ -199,7 +176,7 @@ Staggered Upgrade
 =================
 
 Some users may prefer to upgrade components in phases rather than all at once.
 =================
 
 Some users may prefer to upgrade components in phases rather than all at once.
-The upgrade command, starting in 16.2.10 and 17.2.1 allows parameters
+The upgrade command, starting in 16.2.11 and 17.2.1 allows parameters
 to limit which daemons are upgraded by a single upgrade command. The options in
 include ``daemon_types``, ``services``, ``hosts`` and ``limit``. ``daemon_types``
 takes a comma-separated list of daemon types and will only upgrade daemons of those
 to limit which daemons are upgraded by a single upgrade command. The options in
 include ``daemon_types``, ``services``, ``hosts`` and ``limit``. ``daemon_types``
 takes a comma-separated list of daemon types and will only upgrade daemons of those
index 12e4576a07aa9be31764671800db601dc5f1c19a..4f5ee06aa8b72f20ed362de20db8a5346f5b252f 100644 (file)
@@ -1,3 +1,5 @@
+.. _cephfs_add_remote_mds:
+
 .. note::
    It is highly recommended to use :doc:`/cephadm/index` or another Ceph
    orchestrator for setting up the ceph cluster. Use this approach only if you
 .. note::
    It is highly recommended to use :doc:`/cephadm/index` or another Ceph
    orchestrator for setting up the ceph cluster. Use this approach only if you
index 807029d00703effe49032b6f7d2d6f46492f7cb6..7299c82fbcffabb01e569373900bd7db808c4f27 100644 (file)
Binary files a/ceph/doc/cephfs/cephfs-top.png and b/ceph/doc/cephfs/cephfs-top.png differ
index 824fb9d06f72b5d7611d23490eedb10a81b79f2c..74853a446521a6f7f96a49918be0b381b18603cf 100644 (file)
@@ -9,7 +9,7 @@ in realtime. `cephfs-top` is a curses based python script which makes use of `st
 plugin in Ceph Manager to fetch (and display) metrics.
 
 Manager Plugin
 plugin in Ceph Manager to fetch (and display) metrics.
 
 Manager Plugin
---------------
+==============
 
 Ceph Filesystem clients periodically forward various metrics to Ceph Metadata Servers (MDS)
 which in turn get forwarded to Ceph Manager by MDS rank zero. Each active MDS forward its
 
 Ceph Filesystem clients periodically forward various metrics to Ceph Metadata Servers (MDS)
 which in turn get forwarded to Ceph Manager by MDS rank zero. Each active MDS forward its
@@ -29,9 +29,8 @@ metrics are for a particular MDS rank (e.g., number of subtrees handled by an MD
 Once enabled, Ceph Filesystem metrics can be fetched via::
 
   $ ceph fs perf stats
 Once enabled, Ceph Filesystem metrics can be fetched via::
 
   $ ceph fs perf stats
-  {"version": 1, "global_counters": ["cap_hit", "read_latency", "write_latency", "metadata_latency", "dentry_lease", "opened_files", "pinned_icaps", "opened_inodes", "avg_read_latency", "stdev_read_latency", "avg_write_latency", "stdev_write_latency", "avg_metadata_latency", "stdev_metadata_latency"], "counters": [], "client_metadata": {"client.324130": {"IP": "192.168.1.100", "hostname": "ceph-host1", "root": "/", "mount_point": "/mnt/cephfs", "valid_metrics": ["cap_hit", "read_latency", "write_latency", "metadata_latency", "dentry_lease, "opened_files", "pinned_icaps", "opened_inodes", "avg_read_latency", "stdev_read_latency", "avg_write_latency", "stdev_write_latency", "avg_metadata_latency", "stdev_metadata_latency"]}}, "global_metrics": {"client.324130": [[309785, 1280], [0, 0], [197, 519015022], [88, 279074768], [12, 70147], [0, 3], [3, 3], [0, 3], [0, 0], [0, 0], [0, 11699223], [0, 88245], [0, 6596951], [0, 9539]]}, "metrics": {"delayed_ranks": [], "mds.0": {"client.324130": []}}}
 
 
-Details of the JSON command output are as follows:
+The output format is JSON and contains fields as follows:
 
 - `version`: Version of stats output
 - `global_counters`: List of global performance metrics
 
 - `version`: Version of stats output
 - `global_counters`: List of global performance metrics
@@ -54,7 +53,7 @@ To fetch metrics only for a subset of active MDSs (e.g., MDS rank 1 and 2)::
   $ ceph fs perf stats --mds_rank=1,2
 
 `cephfs-top`
   $ ceph fs perf stats --mds_rank=1,2
 
 `cephfs-top`
-------------
+============
 
 `cephfs-top` utility relies on `stats` plugin to fetch performance metrics and display in
 `top(1)` like format. `cephfs-top` is available as part of `cephfs-top` package.
 
 `cephfs-top` utility relies on `stats` plugin to fetch performance metrics and display in
 `top(1)` like format. `cephfs-top` is available as part of `cephfs-top` package.
@@ -64,6 +63,9 @@ By default, `cephfs-top` uses `client.fstop` user to connect to a Ceph cluster::
   $ ceph auth get-or-create client.fstop mon 'allow r' mds 'allow r' osd 'allow r' mgr 'allow r'
   $ cephfs-top
 
   $ ceph auth get-or-create client.fstop mon 'allow r' mds 'allow r' osd 'allow r' mgr 'allow r'
   $ cephfs-top
 
+Command-Line Options
+--------------------
+
 To use a non-default user (other than `client.fstop`) use::
 
   $ cephfs-top --id <name>
 To use a non-default user (other than `client.fstop`) use::
 
   $ cephfs-top --id <name>
@@ -78,8 +80,27 @@ By default, `cephfs-top` connects to cluster name `ceph`. To use a non-default c
 
 Interval should be greater than or equal to 0.5 seconds. Fractional seconds are honoured.
 
 
 Interval should be greater than or equal to 0.5 seconds. Fractional seconds are honoured.
 
-Sample screenshot running `cephfs-top` with 2 clients:
+Interactive Commands
+--------------------
 
 
-.. image:: cephfs-top.png
+1. m : Filesystem selection
+      Displays a menu of filesystems for selection.
+
+2. s : Sort field selection
+      Designates the sort field.  'cap_hit' is the default.
+
+3. l : Client limit
+      Sets the limit on the number of clients to be displayed.
+
+4. r : Reset
+      Resets the sort field and limit value to the default.
 
 
-.. note:: As of now, `cephfs-top` does not reliably work with multiple Ceph Filesystems.
+5. q : Quit
+      Exit the utility if you are at the home screen (all filesystem info),
+      otherwise escape back to the home screen.
+
+The metrics display can be scrolled using the Arrow Keys, PgUp/PgDn, Home/End and mouse.
+
+Sample screenshot running `cephfs-top` with 2 filesystems:
+
+.. image:: cephfs-top.png
index 343ecfc0bffbbaa979a5abb6896d1105643110b1..1326dc195a8815aef48bb7e3cd29f47f94864e6f 100644 (file)
@@ -300,9 +300,8 @@ Ensure you have an MDS running and issue:
 
 .. note::
 
 
 .. note::
 
-   Symbolic links are recovered as empty regular files. `Symbolic link recovery
-   <https://tracker.ceph.com/issues/46166>`_ is scheduled to be supported in
-   Pacific.
+   The `Symbolic link recovery <https://tracker.ceph.com/issues/46166>`_ is supported from Quincy.
+   Symbolic links were recovered as empty regular files before.
 
 It is recommended to migrate any data from the recovery file system as soon as
 possible. Do not restore the old file system while the recovery file system is
 
 It is recommended to migrate any data from the recovery file system as soon as
 possible. Do not restore the old file system while the recovery file system is
index f52f0589e2d4580771392753c1edbc81dc36a59d..7bee4a89f621beaf4e30eda6da5cc2ab864a88cb 100644 (file)
@@ -99,32 +99,11 @@ expected to be disabled on the volume.
 
 Fetch the information of a CephFS volume using::
 
 
 Fetch the information of a CephFS volume using::
 
-    $ ceph fs volume info vol_name
-    {
-        "mon_addrs": [
-            "192.168.1.7:40977"
-        ],
-        "pending_subvolume_deletions": 0,
-        "pools": {
-            "data": [
-                {
-                    "avail": 106288709632,
-                    "name": "cephfs.vol_name.data",
-                    "used": 4096
-                }
-            ],
-            "metadata": [
-                {
-                    "avail": 106288709632,
-                    "name": "cephfs.vol_name.meta",
-                    "used": 155648
-                }
-            ]
-        },
-        "used_size": 0
-    }
+    $ ceph fs volume info vol_name [--human_readable]
 
 
-The output format is json and contains fields as follows.
+The ``--human_readable`` flag shows used and available pool capacities in KB/MB/GB.
+
+The output format is JSON and contains fields as follows:
 
 * pools: Attributes of data and metadata pools
         * avail: The amount of free space available in bytes
 
 * pools: Attributes of data and metadata pools
         * avail: The amount of free space available in bytes
@@ -134,6 +113,33 @@ The output format is json and contains fields as follows.
 * used_size: Current used size of the CephFS volume in bytes
 * pending_subvolume_deletions: Number of subvolumes pending deletion
 
 * used_size: Current used size of the CephFS volume in bytes
 * pending_subvolume_deletions: Number of subvolumes pending deletion
 
+Sample output of volume info command::
+
+  $ ceph fs volume info vol_name
+  {
+      "mon_addrs": [
+          "192.168.1.7:40977"
+      ],
+      "pending_subvolume_deletions": 0,
+      "pools": {
+          "data": [
+              {
+                  "avail": 106288709632,
+                  "name": "cephfs.vol_name.data",
+                  "used": 4096
+              }
+          ],
+          "metadata": [
+              {
+                  "avail": 106288709632,
+                  "name": "cephfs.vol_name.meta",
+                  "used": 155648
+              }
+          ]
+      },
+      "used_size": 0
+  }
+
 FS Subvolume groups
 -------------------
 
 FS Subvolume groups
 -------------------
 
@@ -194,8 +200,9 @@ Check the presence of any subvolume group using::
     $ ceph fs subvolumegroup exist <vol_name>
 
 The strings returned by the 'exist' command:
     $ ceph fs subvolumegroup exist <vol_name>
 
 The strings returned by the 'exist' command:
-    * "subvolumegroup exists": if any subvolumegroup is present
-    * "no subvolumegroup exists": if no subvolumegroup is present
+
+* "subvolumegroup exists": if any subvolumegroup is present
+* "no subvolumegroup exists": if no subvolumegroup is present
 
 .. note:: It checks for the presence of custom groups and not the default one. To validate the emptiness of the volume, subvolumegroup existence check alone is not sufficient. The subvolume existence also needs to be checked as there might be subvolumes in the default group.
 
 
 .. note:: It checks for the presence of custom groups and not the default one. To validate the emptiness of the volume, subvolumegroup existence check alone is not sufficient. The subvolume existence also needs to be checked as there might be subvolumes in the default group.
 
@@ -344,8 +351,9 @@ Check the presence of any subvolume using::
     $ ceph fs subvolume exist <vol_name> [--group_name <subvol_group_name>]
 
 The strings returned by the 'exist' command:
     $ ceph fs subvolume exist <vol_name> [--group_name <subvol_group_name>]
 
 The strings returned by the 'exist' command:
-    * "subvolume exists": if any subvolume of given group_name is present
-    * "no subvolume exists": if no subvolume of given group_name is present
+
+* "subvolume exists": if any subvolume of given group_name is present
+* "no subvolume exists": if no subvolume of given group_name is present
 
 Set custom metadata on the subvolume as a key-value pair using::
 
 
 Set custom metadata on the subvolume as a key-value pair using::
 
index 27768f5034a93bc1b63db9fa97fc03d623cdaaa6..bd098dc91de32fc2505aa8a7e0a259b8f54a1dc6 100644 (file)
@@ -53,7 +53,8 @@ If you have more than one FS on your Ceph cluster, use the option
 
     ceph-fuse --id foo --client_fs mycephfs2 /mnt/mycephfs2
 
 
     ceph-fuse --id foo --client_fs mycephfs2 /mnt/mycephfs2
 
-You may also add a ``client_fs`` setting to your ``ceph.conf``
+You may also add a ``client_fs`` setting to your ``ceph.conf``. Alternatively, the option
+``--client_mds_namespace`` is supported for backward compatibility.
 
 Unmounting CephFS
 =================
 
 Unmounting CephFS
 =================
index 3130f4f3efd936eac96e604f76dda4f8a5eb5b65..9d9a4a683bae71c8221006bb6ac1529b79a4f165 100644 (file)
@@ -103,6 +103,28 @@ To mount a subtree of the CephFS root, append the path to the device string::
 
   mount -t ceph cephuser@.cephfs=/subvolume/dir1/dir2 /mnt/mycephfs -o secretfile=/etc/ceph/cephuser.secret
 
 
   mount -t ceph cephuser@.cephfs=/subvolume/dir1/dir2 /mnt/mycephfs -o secretfile=/etc/ceph/cephuser.secret
 
+Backward Compatibility
+======================
+The old syntax is supported for backward compatibility.
+
+To mount CephFS with the kernel driver::
+
+    mkdir /mnt/mycephfs
+    mount -t ceph :/ /mnt/mycephfs -o name=admin
+
+The key-value argument right after option ``-o`` is CephX credential;
+``name`` is the username of the CephX user we are using to mount CephFS.
+
+To mount a non-default FS ``cephfs2``, in case the cluster has multiple FSs::
+
+    mount -t ceph :/ /mnt/mycephfs -o name=admin,fs=cephfs2
+
+    or
+
+    mount -t ceph :/ /mnt/mycephfs -o name=admin,mds_namespace=cephfs2
+
+.. note:: The option ``mds_namespace`` is deprecated. Use ``fs=`` instead when using the old syntax for mounting.
+
 Unmounting CephFS
 =================
 To unmount the Ceph file system, use the ``umount`` command as usual::
 Unmounting CephFS
 =================
 To unmount the Ceph file system, use the ``umount`` command as usual::
index a2c9c2017c72b671e24e7650f8c70826f8867ae7..d80cbe67e9c4f28d77cc1ee2de51f2c8904a38e2 100644 (file)
@@ -31,7 +31,7 @@ POSIX semantics for various reasons:
   writes are not coherently propagated to other clients' caches.  That
   is, if a page is cached on host A, and then updated on host B, host
   A's page is not coherently invalidated.  (Shared writable mmap
   writes are not coherently propagated to other clients' caches.  That
   is, if a page is cached on host A, and then updated on host B, host
   A's page is not coherently invalidated.  (Shared writable mmap
-  appears to be quite rare--we have yet to here any complaints about this
+  appears to be quite rare--we have yet to hear any complaints about this
   behavior, and implementing cache coherency properly is complex.)
 - CephFS clients present a hidden ``.snap`` directory that is used to
   access, create, delete, and rename snapshots.  Although the virtual
   behavior, and implementing cache coherency properly is complex.)
 - CephFS clients present a hidden ``.snap`` directory that is used to
   access, create, delete, and rename snapshots.  Although the virtual
@@ -62,17 +62,15 @@ as client data may not even be flushed to the server until the file is
 closed (and more generally writes will be significantly more
 time-shifted than CephFS, leading to less predictable results).
 
 closed (and more generally writes will be significantly more
 time-shifted than CephFS, leading to less predictable results).
 
-However, all of there are very close to POSIX, and most of the time
-applications don't notice too much.  Many other storage systems (e.g.,
-HDFS) claim to be "POSIX-like" but diverge significantly from the
-standard by dropping support for things like in-place file
-modifications, truncate, or directory renames.
-
+Regardless, these are all similar enough to POSIX, and applications still work
+most of the time. Many other storage systems (e.g., HDFS) claim to be
+"POSIX-like" but diverge significantly from the standard by dropping support
+for things like in-place file modifications, truncate, or directory renames.
 
 Bottom line
 -----------
 
 
 Bottom line
 -----------
 
-CephFS relaxes more than local Linux kernel file systems (e.g., writes
+CephFS relaxes more than local Linux kernel file systems (for example, writes
 spanning object boundaries may be torn).  It relaxes strictly less
 than NFS when it comes to multiclient consistency, and generally less
 than NFS when it comes to write atomicity.
 spanning object boundaries may be torn).  It relaxes strictly less
 than NFS when it comes to multiclient consistency, and generally less
 than NFS when it comes to write atomicity.
index 777298f911cd116f2646b0b2ee7053cb2a83dc3d..e5a846118ab835ec55d0d6ff7f39a16dcf567781 100644 (file)
@@ -5,6 +5,60 @@ CephFS allows quotas to be set on any directory in the system.  The
 quota can restrict the number of *bytes* or the number of *files*
 stored beneath that point in the directory hierarchy.
 
 quota can restrict the number of *bytes* or the number of *files*
 stored beneath that point in the directory hierarchy.
 
+Like most other things in CephFS, quotas are configured using virtual
+extended attributes:
+
+ * ``ceph.quota.max_files`` -- file limit
+ * ``ceph.quota.max_bytes`` -- byte limit
+
+If the extended attributes appear on a directory that means a quota is
+configured there. If they are not present then no quota is set on that
+directory (although one may still be configured on a parent directory).
+
+To set a quota, set the extended attribute on a CephFS directory with a
+value::
+
+  setfattr -n ceph.quota.max_bytes -v 100000000 /some/dir     # 100 MB
+  setfattr -n ceph.quota.max_files -v 10000 /some/dir         # 10,000 files
+
+To view quota limit::
+
+  $ getfattr -n ceph.quota.max_bytes /some/dir
+  # file: dir1/
+  ceph.quota.max_bytes="100000000"
+  $
+  $ getfattr -n ceph.quota.max_files /some/dir
+  # file: dir1/
+  ceph.quota.max_files="10000"
+
+.. note:: Running ``getfattr /some/dir -d -m -`` for a CephFS directory will
+   print none of the CephFS extended attributes. This is because the CephFS
+   kernel and FUSE clients hide this information from the ``listxattr(2)``
+   system call. Instead, a specific CephFS extended attribute can be viewed by
+   running ``getfattr /some/dir -n ceph.<some-xattr>``.
+
+To remove a quota, set the value of extended attribute to ``0``::
+
+  $ setfattr -n ceph.quota.max_bytes -v 0 /some/dir
+  $ getfattr /some/dir -n ceph.quota.max_bytes
+  dir1/: ceph.quota.max_bytes: No such attribute
+  $
+  $ setfattr -n ceph.quota.max_files -v 0 /some/dir
+  $ getfattr dir1/ -n ceph.quota.max_files
+  dir1/: ceph.quota.max_files: No such attribute
+
+Space Usage Reporting and CephFS Quotas
+---------------------------------------
+When the root directory of the CephFS mount has quota set on it, the available
+space on the CephFS reported by space usage report tools (like ``df``) is
+based on quota limit. That is, ``available space = quota limit - used space``
+instead of ``available space = total space - used space``.
+
+This behaviour can be disabled by setting following option in client section
+of ``ceph.conf``::
+
+    client quota df = false
+
 Limitations
 -----------
 
 Limitations
 -----------
 
@@ -86,3 +140,11 @@ To remove a quota::
 
   setfattr -n ceph.quota.max_bytes -v 0 /some/dir
   setfattr -n ceph.quota.max_files -v 0 /some/dir
 
   setfattr -n ceph.quota.max_bytes -v 0 /some/dir
   setfattr -n ceph.quota.max_files -v 0 /some/dir
+
+
+.. note:: In cases where CephFS extended attributes are set on a CephFS
+   directory (for example, ``/some/dir``), running ``getfattr /some/dir -d -m
+   -`` will not print those CephFS extended attributes. This is because CephFS
+   kernel and FUSE clients hide this information from the ``listxattr(2)``
+   system call. You can access a specific CephFS extended attribute by running
+   ``getfattr /some/dir -n ceph.<some-xattr>`` instead.
index 7f55df9503073e36954da9522b1f31e2a89b8908..114f7580a400561ea3d90c96748314aa7b2e5abe 100644 (file)
@@ -131,3 +131,15 @@ Control (ongoing) File System Scrubs
    {
        "return_code": 0
    }
    {
        "return_code": 0
    }
+
+Damages
+=======
+
+The types of damage that can be reported and repaired by File System Scrub are:
+
+* DENTRY : Inode's dentry is missing.
+
+* DIR_FRAG : Inode's directory fragment(s) is missing.
+
+* BACKTRACE : Inode's backtrace in the data pool is corrupted.
+
index ba7c378f54eb16730c94b8f833c985fb65a35fe1..2728203f49c58e924b8452b2e8fb6433def55281 100644 (file)
@@ -49,10 +49,9 @@ The following time periods are recognized: `h(our), d(ay), w(eek), m(onth),
 y(ear)` and `n`. The latter is a special modifier where e.g. `10n` means keep
 the last 10 snapshots regardless of timing,
 
 y(ear)` and `n`. The latter is a special modifier where e.g. `10n` means keep
 the last 10 snapshots regardless of timing,
 
-All subcommands take optional `fs` and `subvol` arguments to specify paths in
+All subcommands take optional `fs` argument to specify paths in
 multi-fs setups and :doc:`/cephfs/fs-volumes` managed setups. If not
 multi-fs setups and :doc:`/cephfs/fs-volumes` managed setups. If not
-passed `fs` defaults to the first file system listed in the fs_map, `subvolume`
-defaults to nothing.
+passed `fs` defaults to the first file system listed in the fs_map.
 When using :doc:`/cephfs/fs-volumes` the argument `fs` is equivalent to a
 `volume`.
 
 When using :doc:`/cephfs/fs-volumes` the argument `fs` is equivalent to a
 `volume`.
 
@@ -66,16 +65,21 @@ When no subcommand is supplied a synopsis is printed::
 
   #> ceph fs snap-schedule
   no valid command found; 8 closest matches:
 
   #> ceph fs snap-schedule
   no valid command found; 8 closest matches:
-  fs snap-schedule status [<path>] [<subvol>] [<fs>] [<format>]
-  fs snap-schedule list <path> [<subvol>] [--recursive] [<fs>] [<format>]
-  fs snap-schedule add <path> <snap_schedule> [<start>] [<fs>] [<subvol>]
-  fs snap-schedule remove <path> [<repeat>] [<start>] [<subvol>] [<fs>]
-  fs snap-schedule retention add <path> <retention_spec_or_period> [<retention_count>] [<fs>] [<subvol>]
-  fs snap-schedule retention remove <path> <retention_spec_or_period> [<retention_count>] [<fs>] [<subvol>]
-  fs snap-schedule activate <path> [<repeat>] [<start>] [<subvol>] [<fs>]
-  fs snap-schedule deactivate <path> [<repeat>] [<start>] [<subvol>] [<fs>]
+  fs snap-schedule status [<path>] [<fs>] [<format>]
+  fs snap-schedule list <path> [--recursive] [<fs>] [<format>]
+  fs snap-schedule add <path> <snap_schedule> [<start>] [<fs>]
+  fs snap-schedule remove <path> [<repeat>] [<start>] [<fs>]
+  fs snap-schedule retention add <path> <retention_spec_or_period> [<retention_count>] [<fs>]
+  fs snap-schedule retention remove <path> <retention_spec_or_period> [<retention_count>] [<fs>]
+  fs snap-schedule activate <path> [<repeat>] [<start>] [<fs>]
+  fs snap-schedule deactivate <path> [<repeat>] [<start>] [<fs>]
   Error EINVAL: invalid command
 
   Error EINVAL: invalid command
 
+Note:
+^^^^^
+A `subvolume` argument is no longer accepted by the commands.
+
+
 Inspect snapshot schedules
 --------------------------
 
 Inspect snapshot schedules
 --------------------------
 
index 6a865bc6add18a3a123ae8c516bdc43d1baccc66..0c84602aebb77a2f594bc94ed91800345f1832ac 100644 (file)
@@ -554,7 +554,7 @@ In order to configure connections (from Ceph nodes) to the KDC:
         ...
 
 
         ...
 
 
-6. A new *set parameter* was added in Ceph, ``gss ktab client file`` which
+6. A new *set parameter* was added in Ceph, ``gss_ktab_client_file`` which
    points to the keytab file related to the Ceph node *(or principal)* in
    question.
 
    points to the keytab file related to the Ceph node *(or principal)* in
    question.
 
@@ -614,10 +614,10 @@ In order to configure connections (from Ceph nodes) to the KDC:
         /etc/ceph/ceph.conf
         [global]
             ...
         /etc/ceph/ceph.conf
         [global]
             ...
-            auth cluster required = gss
-            auth service required = gss
-            auth client required = gss
-            gss ktab client file = /{$my_new_location}/{$my_new_ktab_client_file.keytab}
+            auth_cluster_required = gss
+            auth_service_required = gss
+            auth_client_required = gss
+            gss_ktab_client_file = /{$my_new_location}/{$my_new_ktab_client_file.keytab}
             ...
 
 
             ...
 
 
index 64f29c9a1f69ce3e10b239182a7549e7b0216531..fdef8da1d7096404545395aa1962a9de3c64ec59 100644 (file)
@@ -32,7 +32,7 @@ cephadm/cephadm script into memory.)
   for mon or mgr.
 - You'll see health warnings from cephadm about stray daemons--that's because
   the vstart-launched daemons aren't controlled by cephadm.
   for mon or mgr.
 - You'll see health warnings from cephadm about stray daemons--that's because
   the vstart-launched daemons aren't controlled by cephadm.
-- The default image is ``quay.io/ceph-ci/ceph:master``, but you can change
+- The default image is ``quay.io/ceph-ci/ceph:main``, but you can change
   this by passing ``-o container_image=...`` or ``ceph config set global container_image ...``.
 
 
   this by passing ``-o container_image=...`` or ``ceph config set global container_image ...``.
 
 
index 2bbbd15896812c3204a95a28234f0f9b7e8310da..006fb2bd7ed5aedb367364e778e4db9c884f0645 100644 (file)
@@ -32,8 +32,8 @@ The ceph orch command will be extended to support maintenance.
 
 .. code-block::
 
 
 .. code-block::
 
-    ceph orch host enter-maintenance <host> [ --check ]
-    ceph orch host exit-maintenance <host> 
+    ceph orch host maintenance enter <host> [ --force ]
+    ceph orch host maintenance exit <host>
 
 .. note:: In addition, the host's status should be updated to reflect whether it
    is in maintenance or not. 
 
 .. note:: In addition, the host's status should be updated to reflect whether it
    is in maintenance or not. 
index 423240b9775cf8f2263ba6601c7f7a9a6b6a776c..c67771bb9076ed9c3e2b7c965b3d5c1b16684719 100644 (file)
@@ -131,3 +131,8 @@ sharing a single pool (via namespaces), their snapshots *will* collide and
 deleting one will result in missing file data for others. (This may even be
 invisible, not throwing errors to the user.) If each FS gets its own
 pool things probably work, but this isn't tested and may not be true.
 deleting one will result in missing file data for others. (This may even be
 invisible, not throwing errors to the user.) If each FS gets its own
 pool things probably work, but this isn't tested and may not be true.
+
+.. Note:: To avoid snap id collision between mon-managed snapshots and file system
+   snapshots, pools with mon-managed snapshots are not allowed to be attached
+   to a file system. Also, mon-managed snapshots can't be created in pools
+   already attached to a file system either.
diff --git a/ceph/doc/dev/deduplication.rst b/ceph/doc/dev/deduplication.rst
deleted file mode 100644 (file)
index b715896..0000000
+++ /dev/null
@@ -1,151 +0,0 @@
-===============
- Deduplication
-===============
-
-
-Introduction
-============
-
-Applying data deduplication on an existing software stack is not easy 
-due to additional metadata management and original data processing 
-procedure. 
-
-In a typical deduplication system, the input source as a data
-object is split into multiple chunks by a chunking algorithm.
-The deduplication system then compares each chunk with
-the existing data chunks, stored in the storage previously.
-To this end, a fingerprint index that stores the hash value
-of each chunk is employed by the deduplication system
-in order to easily find the existing chunks by comparing
-hash value rather than searching all contents that reside in
-the underlying storage.
-
-There are many challenges in order to implement deduplication on top
-of Ceph. Among them, two issues are essential for deduplication.
-First is managing scalability of fingerprint index; Second is
-it is complex to ensure compatibility between newly applied
-deduplication metadata and existing metadata.
-
-Key Idea
-========
-1. Content hashing (Double hashing): Each client can find an object data 
-for an object ID using CRUSH. With CRUSH, a client knows object's location
-in Base tier. 
-By hashing object's content at Base tier, a new OID (chunk ID) is generated.
-Chunk tier stores in the new OID that has a partial content of original object.
-
- Client 1 -> OID=1 -> HASH(1's content)=K -> OID=K -> 
- CRUSH(K) -> chunk's location
-
-
-2. Self-contained object: The external metadata design
-makes difficult for integration with storage feature support
-since existing storage features cannot recognize the
-additional external data structures. If we can design data
-deduplication system without any external component, the
-original storage features can be reused.
-
-More details in https://ieeexplore.ieee.org/document/8416369
-
-Design
-======
-
-.. ditaa::
-
-           +-------------+
-           | Ceph Client |
-           +------+------+
-                  ^
-     Tiering is   |  
-    Transparent   |               Metadata
-        to Ceph   |           +---------------+
-     Client Ops   |           |               |   
-                  |    +----->+   Base Pool   |
-                  |    |      |               |
-                  |    |      +-----+---+-----+
-                  |    |            |   ^ 
-                  v    v            |   |   Dedup metadata in Base Pool
-           +------+----+--+         |   |   (Dedup metadata contains chunk offsets
-           |   Objecter   |         |   |    and fingerprints)
-           +-----------+--+         |   |
-                       ^            |   |   Data in Chunk Pool
-                       |            v   |
-                       |      +-----+---+-----+
-                       |      |               |
-                       +----->|  Chunk Pool   |
-                              |               |
-                              +---------------+
-                                    Data
-
-
-Pool-based object management:
-We define two pools.
-The metadata pool stores metadata objects and the chunk pool stores
-chunk objects. Since these two pools are divided based on
-the purpose and usage, each pool can be managed more
-efficiently according to its different characteristics. Base
-pool and the chunk pool can separately select a redundancy
-scheme between replication and erasure coding depending on
-its usage and each pool can be placed in a different storage
-location depending on the required performance.
-
-Regarding how to use, please see ``osd_internals/manifest.rst``
-
-Usage Patterns
-==============
-
-The different Ceph interface layers present potentially different oportunities
-and costs for deduplication and tiering in general.
-
-RadosGW
--------
-
-S3 big data workloads seem like a good opportunity for deduplication.  These
-objects tend to be write once, read mostly objects which don't see partial
-overwrites.  As such, it makes sense to fingerprint and dedup up front.
-
-Unlike cephfs and rbd, radosgw has a system for storing
-explicit metadata in the head object of a logical s3 object for
-locating the remaining pieces.  As such, radosgw could use the
-refcounting machinery (``osd_internals/refcount.rst``) directly without
-needing direct support from rados for manifests.
-
-RBD/Cephfs
-----------
-
-RBD and CephFS both use deterministic naming schemes to partition
-block devices/file data over rados objects.  As such, the redirection
-metadata would need to be included as part of rados, presumably
-transparently.
-
-Moreover, unlike radosgw, rbd/cephfs rados objects can see overwrites.
-For those objects, we don't really want to perform dedup, and we don't
-want to pay a write latency penalty in the hot path to do so anyway.
-As such, performing tiering and dedup on cold objects in the background
-is likely to be preferred.
-   
-One important wrinkle, however, is that both rbd and cephfs workloads
-often feature usage of snapshots.  This means that the rados manifest
-support needs robust support for snapshots.
-
-RADOS Machinery
-===============
-
-For more information on rados redirect/chunk/dedup support, see ``osd_internals/manifest.rst``.
-For more information on rados refcount support, see ``osd_internals/refcount.rst``.
-
-Status and Future Work
-======================
-
-At the moment, there exists some preliminary support for manifest
-objects within the OSD as well as a dedup tool.
-
-RadosGW data warehouse workloads probably represent the largest
-opportunity for this feature, so the first priority is probably to add
-direct support for fingerprinting and redirects into the refcount pool
-to radosgw.
-
-Aside from radosgw, completing work on manifest object support in the
-OSD particularly as it relates to snapshots would be the next step for
-rbd and cephfs workloads.
-
index eddc2fe7bb7772c9c30bb0075fd55a1ba6dfdee3..53c9c18e8244065e94532881ca5a7ce31bb2d9cd 100644 (file)
@@ -87,7 +87,7 @@ The procedure for making changes to the Ceph repository is as follows:
    
    #. :ref:`Push the changes in your local working copy to your fork<push_changes>`.
 
    
    #. :ref:`Push the changes in your local working copy to your fork<push_changes>`.
 
-#. Create a Pull Request to push the change upstream
+#. Create a Pull Request to push the change upstream.
 
    #. Create a Pull Request that asks for your changes to be added into the
       "upstream Ceph" repository.
 
    #. Create a Pull Request that asks for your changes to be added into the
       "upstream Ceph" repository.
@@ -133,8 +133,8 @@ Configuring Your Local Environment
 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
 
 The commands in this section configure your local git environment so that it
 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
 
 The commands in this section configure your local git environment so that it
-generates "Signed-off-by:" tags. They also set up your local environment so
-that it can stay synchronized with the upstream repository.
+generates "Signed-off-by:" tags. These commands also set up your local
+environment so that it can stay synchronized with the upstream repository.
 
 These commands are necessary only during the initial setup of your local
 working copy. Another way to say that is "These commands are necessary
 
 These commands are necessary only during the initial setup of your local
 working copy. Another way to say that is "These commands are necessary
@@ -172,7 +172,7 @@ Fixing the Bug
 Synchronizing Local Main with Upstream Main
 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
 
 Synchronizing Local Main with Upstream Main
 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
 
-In your local git environment, there is a copy of the ``main`` branch in
+In your local working copy, there is a copy of the ``main`` branch in
 ``remotes/origin/main``. This is called "local main". This copy of the
 main branch (https://github.com/your_github_id/ceph.git) is "frozen in time"
 at the moment that you cloned it, but the upstream repo
 ``remotes/origin/main``. This is called "local main". This copy of the
 main branch (https://github.com/your_github_id/ceph.git) is "frozen in time"
 at the moment that you cloned it, but the upstream repo
@@ -184,9 +184,8 @@ Because upstream main is continually receiving updates from other
 contributors, your fork will drift farther and farther from the state of the
 upstream repo when you cloned it.
 
 contributors, your fork will drift farther and farther from the state of the
 upstream repo when you cloned it.
 
-You must keep your fork's main branch synchronized with upstream main in
-order to reduce drift between your fork's main branch and the upstream main
-branch.
+Keep your fork's ``main`` branch synchronized with upstream main to reduce drift
+between your fork's main branch and the upstream main branch.
 
 Here are the commands for keeping your fork synchronized with the
 upstream repository:
 
 Here are the commands for keeping your fork synchronized with the
 upstream repository:
@@ -198,8 +197,11 @@ upstream repository:
    git reset --hard ceph/main
    git push -u origin main
 
    git reset --hard ceph/main
    git push -u origin main
 
-This procedure should be followed often, in order to keep your local ``main``
-in sync with upstream ``main``.
+Follow this procedure often to keep your local ``main`` in sync with upstream
+``main``.
+
+If the command ``git status`` returns a line that reads "Untracked files", see
+:ref:`the procedure on updating submodules <update-submodules>`.
 
 .. _bugfix_branch:
 
 
 .. _bugfix_branch:
 
@@ -230,15 +232,15 @@ your local working repository to your fork of the upstream repository.
 Fixing the bug in the local working copy
 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
 
 Fixing the bug in the local working copy
 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
 
-#. Updating the tracker 
+#. **Updating the tracker**
 
    In the `Ceph issue tracker <https://tracker.ceph.com>`_, change the status
    of the tracker issue to "In progress".  This communicates to other Ceph
    contributors that you have begun working on a fix, which helps to avoid
    duplication of effort. If you don't have permission to change that field,
 
    In the `Ceph issue tracker <https://tracker.ceph.com>`_, change the status
    of the tracker issue to "In progress".  This communicates to other Ceph
    contributors that you have begun working on a fix, which helps to avoid
    duplication of effort. If you don't have permission to change that field,
-   your comment that you are working on the issue is sufficient.
+   just comment that you are working on the issue. 
 
 
-#. Fixing the bug itself
+#. **Fixing the bug itself**
 
    This guide cannot tell you how to fix the bug that you have chosen to fix.
    This guide assumes that you know what required improvement, and that you
 
    This guide cannot tell you how to fix the bug that you have chosen to fix.
    This guide assumes that you know what required improvement, and that you
@@ -280,13 +282,13 @@ believe that it works.
    
    .. note::
 
    
    .. note::
 
-      In the command `git push origin fix_1`, `origin` is the name of your fork
-      of the upstream Ceph repository, and can be thought of as a nickname for
-      `git@github.com:username/ceph.git`, where `username` is your GitHub
-      username.
+      In the command ``git push origin fix_1``, ``origin`` is the name of your
+      fork of the upstream Ceph repository, and can be thought of as a nickname
+      for ``git@github.com:username/ceph.git``, where ``username`` is your
+      GitHub username.
 
 
-      It is possible that `origin` is not the name of your fork. Discover the
-      name of your fork by running `git remote -v`, as shown here:
+      It is possible that ``origin`` is not the name of your fork. Discover the
+      name of your fork by running ``git remote -v``, as shown here:
 
       .. code-block:: bash
 
 
       .. code-block:: bash
 
@@ -296,9 +298,16 @@ believe that it works.
          origin        git@github.com:username/ceph.git (fetch)
          origin        git@github.com:username/ceph.git (push)
 
          origin        git@github.com:username/ceph.git (fetch)
          origin        git@github.com:username/ceph.git (push)
 
-       The line "origin git@github.com:username/ceph.git (fetch)" and the line
-       "origin git@github.com:username/ceph.git (push)" provide the information
-       that "origin" is the name of your fork of the Ceph repository.
+      The line::
+     
+         origin git@github.com:username/ceph.git (fetch) 
+      
+      and the line:: 
+        
+         origin git@github.com:username/ceph.git (push) 
+         
+      provide the information that "origin" is the name of your fork of the
+      Ceph repository.
 
 
 Opening a GitHub pull request
 
 
 Opening a GitHub pull request
@@ -507,3 +516,58 @@ the **ptl-tool** have the following form::
              client: move client_lock to _unmount()
              client: add timer_lock support
      Reviewed-by: Patrick Donnelly <pdonnell@redhat.com>
              client: move client_lock to _unmount()
              client: add timer_lock support
      Reviewed-by: Patrick Donnelly <pdonnell@redhat.com>
+
+Miscellaneous
+-------------
+
+--set-upstream
+^^^^^^^^^^^^^^
+
+If you forget to include the ``--set-upstream origin x`` option in your ``git
+push`` command, you will see the following error message:
+
+::
+
+   fatal: The current branch {x} has no upstream branch.
+   To push the current branch and set the remote as upstream, use
+      git push --set-upstream origin {x}
+
+To set up git to automatically create the upstream branch that corresponds to
+the branch in your local working copy, run this command from within the
+``ceph/`` directory:
+
+.. prompt:: bash $
+
+   git config --global push.autoSetupRemote true
+
+Deleting a Branch Locally
+^^^^^^^^^^^^^^^^^^^^^^^^^
+
+To delete the branch named ``localBranchName`` from the local working copy, run
+a command of this form:
+
+.. prompt:: bash $
+
+   git branch -d localBranchName
+
+Deleting a Branch Remotely
+^^^^^^^^^^^^^^^^^^^^^^^^^^
+
+To delete the branch named ``remoteBranchName`` from the remote upstream branch
+(which is also your fork of ``ceph/ceph``, as described in :ref:`forking`), run
+a command of this form:
+
+.. prompt:: bash $
+
+   git push origin --delete remoteBranchName
+
+Searching a File Longitudinally for a String
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
+To search for the commit that introduced a given string (in this example, that
+string is ``foo``) into a given file (in this example, that file is
+``file.rst``), run a command of this form:
+
+.. prompt:: bash $
+
+   git log -S 'foo' file.rst
index a1639fb2e9f3a23bd4f841e81ae0096e76a9d227..76d078f33af60ad5c0e62c6fda24955ea9970826 100644 (file)
@@ -215,8 +215,8 @@ The build process is based on `Node.js <https://nodejs.org/>`_ and requires the
 Prerequisites
 ~~~~~~~~~~~~~
 
 Prerequisites
 ~~~~~~~~~~~~~
 
- * Node 12.18.2 or higher
- * NPM 6.13.4 or higher
+ * Node 14.15.0 or higher
+ * NPM 6.14.9 or higher
 
 nodeenv:
   During Ceph's build we create a virtualenv with ``node`` and ``npm``
 
 nodeenv:
   During Ceph's build we create a virtualenv with ``node`` and ``npm``
@@ -290,7 +290,7 @@ HTML files:
 - `html-linter <https://github.com/chinchiheather/html-linter>`_
 - `htmllint-cli <https://github.com/htmllint/htmllint-cli>`_
 - `Prettier <https://prettier.io/>`_
 - `html-linter <https://github.com/chinchiheather/html-linter>`_
 - `htmllint-cli <https://github.com/htmllint/htmllint-cli>`_
 - `Prettier <https://prettier.io/>`_
-- `TSLint <https://palantir.github.io/tslint/>`_
+- `ESLint <https://eslint.org/>`_
 - `stylelint <https://stylelint.io/>`_
 
 We added 2 npm scripts to help run these tools:
 - `stylelint <https://stylelint.io/>`_
 
 We added 2 npm scripts to help run these tools:
@@ -1039,8 +1039,8 @@ scenarios.
 
 For example - ``throw new DashboardNotFoundError()``.
 
 
 For example - ``throw new DashboardNotFoundError()``.
 
-I18N
-----
+Internationalization (i18n)
+---------------------------
 
 How to extract messages from source code?
 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 
 How to extract messages from source code?
 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
@@ -1204,6 +1204,92 @@ Keep elements that affect the sentence:
   <!-- recommended -->
   <span i18n>Profile <b>foo</b> will be removed.</span>
 
   <!-- recommended -->
   <span i18n>Profile <b>foo</b> will be removed.</span>
 
+
+.. _accessibility:
+
+Accessibility
+-------------
+
+Many parts of the Ceph Dashboard are modeled on `Web Content Accessibility Guidelines (WCAG) 2.1 <https://www.w3.org/TR/WCAG21/>`_  level A accessibility conformance guidelines. 
+By implementing accessibility best practices, you are improving the usability of the Ceph Dashboard for blind and visually impaired users.
+
+Summary
+~~~~~~~
+
+A few things you should check before introducing a new code change include:
+
+1) Add `ARIA labels and descriptions <https://www.w3.org/TR/wai-aria/>`_ to actionable HTML elements.
+2) Don't forget to tag ARIA labels/descriptions or any user-readable text for translation (i18n-title, i18n-aria-label...).
+3) Add `ARIA roles <https://www.w3.org/TR/wai-aria/#usage_intro>`_ to tag HTML elements that behave different from their intended behaviour (<a> tags behaving as <buttons>) or that provide extended behaviours (roles).
+4) Avoid poor `color contrast choices <https://www.w3.org/TR/WCAG21/#contrast-minimum>`_ (foreground-background) when styling a component. Here are some :ref:`tools <color-contrast-checkers>` you can use.
+5) When testing menus or dropdowns, be sure to scan them with an :ref:`accessibility checker <accessibility-checkers>` in both opened and closed states. Sometimes issues are hidden when menus are closed.
+
+.. _accessibility-checkers:
+
+Accessibility checkers
+~~~~~~~~~~~~~~~~~~~~~~
+
+During development, you can test the accessibility compliance of your features using one of the tools below:
+
+- `Accessibility insights plugin <https://accessibilityinsights.io/downloads/>`_
+- `Site Improve plugin <https://www.siteimprove.com/integrations/browser-extensions/>`_
+- `Axe devtools <https://www.deque.com/axe/devtools/>`_
+
+Testing with two or more of these tools can greatly improve the detection of accessibility violations.
+
+.. _color-contrast-checkers:
+
+Color contrast checkers
+~~~~~~~~~~~~~~~~~~~~~~~
+
+When adding new colors, making sure they are accessible is also important. Here are some tools which can help with color contrast testing:
+
+- `Accessible web color-contrast checker <https://accessibleweb.com/color-contrast-checker/>`_
+- `Colorsafe generator <https://colorsafe.co/>`_
+
+Accessibility linters
+~~~~~~~~~~~~~~~~~~~~~
+
+If you use VSCode, you may install the `axe accessibility linter <https://marketplace.visualstudio.com/items?itemName=deque-systems.vscode-axe-linter>`_,
+which can help you catch and fix potential issues during development.
+
+Accessibility testing
+~~~~~~~~~~~~~~~~~~~~~
+
+Our e2e testing suite, which is based on Cypress, supports the addition of accessibility tests using `axe-core <https://github.com/dequelabs/axe-core>`_ 
+and `cypress-axe <https://github.com/component-driven/cypress-axe>`_. A custom Cypress command, `cy.checkAccessibility`, can also be used directly. 
+This is a great way to prevent accessibility regressions on high impact components.
+
+Tests can be found under the `a11y folder <./src/pybind/mgr/dashboard/frontend/cypress/integration/a11y>`_ in the dashboard. Here is an example:
+
+.. code:: TypeScript
+
+  describe('Navigation accessibility', { retries: 0 }, () => {
+    const shared = new NavigationPageHelper();
+  
+    beforeEach(() => {
+      cy.login();
+      Cypress.Cookies.preserveOnce('token');
+      shared.navigateTo();
+    });
+  
+    it('top-nav should have no accessibility violations', () => {
+      cy.injectAxe();
+      cy.checkAccessibility('.cd-navbar-top');
+    });
+  
+    it('sidebar should have no accessibility violations', () => {
+      cy.injectAxe();
+      cy.checkAccessibility('nav[id=sidebar]');
+    });
+  
+  });
+
+Additional guidelines
+~~~~~~~~~~~~~~~~~~~~~
+
+If you're unsure about which UI pattern to follow in order to implement an accessibility fix, `patternfly <https://www.patternfly.org/v4/accessibility/accessibility-fundamentals>`_ guidelines can be used.
+
 Backend Development
 -------------------
 
 Backend Development
 -------------------
 
index 91ae42e9cb5145c760ed5c22c673693d169088be..ced4dc5afe07d62e3e5818c8059ead47e080c2ee 100644 (file)
@@ -89,6 +89,11 @@ click on `New issue`_.
 .. _`jump to the Ceph project`: http://tracker.ceph.com/projects/ceph
 .. _`New issue`: http://tracker.ceph.com/projects/ceph/issues/new
 
 .. _`jump to the Ceph project`: http://tracker.ceph.com/projects/ceph
 .. _`New issue`: http://tracker.ceph.com/projects/ceph/issues/new
 
+Slack
+-----
+
+Ceph's Slack is https://ceph-storage.slack.com/.
+
 .. _mailing-list:
 
 Mailing lists
 .. _mailing-list:
 
 Mailing lists
index 9c926f071c6b1e879b368c02278d82b734e3e6eb..7078a83c02b881640050591a3c8dbf79b800a632 100644 (file)
@@ -135,7 +135,7 @@ integration tests for all the Ceph components.
     - verify that teuthology can run integration tests, with and without OpenStack
 
   * - `upgrade <https://github.com/ceph/ceph/tree/master/qa/suites/upgrade>`_
     - verify that teuthology can run integration tests, with and without OpenStack
 
   * - `upgrade <https://github.com/ceph/ceph/tree/master/qa/suites/upgrade>`_
-    - for various versions of Ceph, verify that upgrades can happen without disrupting an ongoing workload
+    - for various versions of Ceph, verify that upgrades can happen without disrupting an ongoing workload (`Upgrade Testing`_)
 
 teuthology-describe
 -------------------
 
 teuthology-describe
 -------------------
@@ -449,6 +449,109 @@ A single test from the rbd/thrash suite can be run by adding the
       --suite rbd/thrash \
       --filter 'rbd/thrash/{clusters/fixed-2.yaml clusters/openstack.yaml workloads/rbd_api_tests_copy_on_read.yaml}'
 
       --suite rbd/thrash \
       --filter 'rbd/thrash/{clusters/fixed-2.yaml clusters/openstack.yaml workloads/rbd_api_tests_copy_on_read.yaml}'
 
+.. _upgrade-testing:
+
+Upgrade Testing
+^^^^^^^^^^^^^^^
+
+Using the upgrade suite we are able to verify that upgrades from earlier releases can complete
+successfully without disrupting any ongoing workload.
+Each Release branch upgrade directory includes 2-x upgrade testing.
+Meaning, we are able to test the upgrade from 2 preceding releases to the current one.
+The upgrade sequence is done in `parallel <https://github.com/ceph/teuthology/blob/main/teuthology/task/parallel.py>`_
+with other given workloads.
+
+For instance, the upgrade test directory from the Quincy release branch is as follows:
+
+.. code-block:: none
+
+  .
+  ├── octopus-x
+  └── pacific-x
+
+It is possible to test upgrades from Octopus (2-x) or from Pacific (1-x) to Quincy (x).
+A simple upgrade test consists the following order:
+
+.. code-block:: none
+
+  ├── 0-start.yaml
+  ├── 1-tasks.yaml
+  ├── upgrade-sequence.yaml
+  └── workload
+
+After starting the cluster with the older release we begin running the given ``workload``
+and the ``upgrade-sequnce`` in parallel.
+
+.. code-block:: yaml
+
+  - print: "**** done start parallel"
+  - parallel:
+      - workload
+      - upgrade-sequence
+  - print: "**** done end parallel"
+
+While the ``workload`` directory consists regular yaml files just as in any other suite,
+the ``upgrade-sequnce`` is resposible for running the upgrade and awaitng its completion:
+
+.. code-block:: yaml
+
+  - print: "**** done start upgrade, wait"
+  ...
+    mon.a:
+      - ceph orch upgrade start --image quay.ceph.io/ceph-ci/ceph:$sha1
+      - while ceph orch upgrade status | jq '.in_progress' | grep true ; do ceph orch ps ; ceph versions ; sleep 30 ; done\
+  ...
+  - print: "**** done end upgrade, wait..."
+
+
+It is also possible to upgrade in stages while running workloads in between those:
+
+.. code-block:: none
+
+  ├── %
+  ├── 0-cluster
+  ├── 1-ceph-install
+  ├── 2-partial-upgrade
+  ├── 3-thrash
+  ├── 4-workload
+  ├── 5-finish-upgrade.yaml
+  ├── 6-quincy.yaml
+  └── 8-final-workload
+
+After starting a cluster we upgrade only 2/3 of the cluster (``2-partial-upgrade``).
+The next stage is running thrash tests and given workload tests. Later on, continuing to upgrade the
+rest of the cluster (``5-finish-upgrade.yaml``).
+The last stage is requiring the updated release (``ceph require-osd-release quincy``,
+``ceph osd set-require-min-compat-client quincy``) and running the ``final-workload``.
+
+Position Independent Linking
+----------------------------
+
+Under the ``qa/suites`` directory are ``.qa`` symbolic links in every
+directory. Each link is recursive by always linking to ``../.qa/``. The final
+terminating link is in the ``qa/`` directory itself as ``qa/.qa -> .``. This
+layout of symbolic links allows a suite to be easily copied or moved without
+breaking a number of symbolic links. For example::
+
+    qa/suites/fs/upgrade/nofs/centos_latest.yaml -> .qa/distros/supported/centos_latest.yaml
+
+If we copy the ``nofs`` suite somewhere else, add a parent directory above
+``nofs``, or move the ``centos_latest.yaml`` fragment into a sub-directory, the
+link will not break. Compare to::
+
+    qa/suites/fs/upgrade/nofs/centos_latest.yaml -> ../../../../distros/supported/centos_latest.yaml
+
+If the link is moved, it is very likely it will break because the number of
+parent directories to reach the ``distros`` directory may change.
+
+When adding new directories or suites, it is recommended to also remember
+adding ``.qa`` symbolic links. A trivial find command may do this for you:
+
+.. prompt:: bash $
+
+   find qa/suites/ -type d -execdir ln -sfT ../.qa/ {}/.qa \;
+
+
 Filtering tests by their description
 ------------------------------------
 
 Filtering tests by their description
 ------------------------------------
 
index 21db9bf9f4cba33f4b353189b0bd205f37526f81..72d724d981ed617b8ec64dd81b93b8415efbc9a0 100644 (file)
@@ -166,5 +166,12 @@ Unit test caveats
    explicitly linked against something else. This enables tools such as
    **valgrind** to be used in the tests.
 
    explicitly linked against something else. This enables tools such as
    **valgrind** to be used in the tests.
 
+#. Google Test unit testing library hides the client output from the shell.
+   In order to debug the client after setting the desired debug level
+   (e.g ``ceph config set client debug_rbd 20``), the debug log file can
+   be found at ``build/out/client.admin.<pid>.log``.
+   This can also be handy when examining teuthology failed unit test
+   jobs, the job's debug level can be set at the relevant yaml file.
+
 .. _make check:
 .. _teuthology framework: https://github.com/ceph/teuthology
 .. _make check:
 .. _teuthology framework: https://github.com/ceph/teuthology
index e6c05ee2a44ff096fe49ab31f97faba3bc216d9b..7eb9e1214de1e618a85bd8677644c4cc240c954e 100644 (file)
@@ -88,6 +88,10 @@ separate file, like this::
 
   .. graphviz:: myfile.dot
 
 
   .. graphviz:: myfile.dot
 
+See the `Dot User's Manual <https://www.graphviz.org/pdf/dotguide.pdf>`_ by
+Emden R. Gansner, Eleftherios Koutsofios, and Stephen North for examples of
+digraphs. This is especially useful if this is your first time encountering
+GraphViz.
 
 Ditaa
 -----
 
 Ditaa
 -----
index 355f51548329eb1b095b9411331d4647364d30e0..2d9a7d8fafb78cf470310a059a8ffe52a2b1d34b 100644 (file)
@@ -4,11 +4,7 @@
 
 .. graphviz::
 
 
 .. graphviz::
 
-  /*
-   * Rough outline of object store module dependencies
-   */
-
-  digraph object_store {
+   digraph object_store {
     size="7,7";
     node [color=lightblue2, style=filled, fontname="Serif"];
 
     size="7,7";
     node [color=lightblue2, style=filled, fontname="Serif"];
 
@@ -68,3 +64,4 @@
 
 
 .. todo:: write more here
 
 
 .. todo:: write more here
+
index 7263cc35b67152194dcde112d1143f3467d1b20c..40064961bbaf7a765fb5f2f56f54f7b21ee01a79 100644 (file)
@@ -6,47 +6,52 @@ Glossary
 --------
 
 *chunk* 
 --------
 
 *chunk* 
-   when the encoding function is called, it returns chunks of the same
-   size. Data chunks which can be concatenated to reconstruct the original
-   object and coding chunks which can be used to rebuild a lost chunk.
+   When the encoding function is called, it returns chunks of the same
+   size as each other. There are two kinds of chunks: (1) *data
+   chunks*, which can be concatenated to reconstruct the original
+   object, and (2) *coding chunks*, which can be used to rebuild a
+   lost chunk.
 
 *chunk rank*
 
 *chunk rank*
-   the index of a chunk when returned by the encoding function. The
-   rank of the first chunk is 0, the rank of the second chunk is 1
-   etc.
-
-*stripe* 
-   when an object is too large to be encoded with a single call,
-   each set of chunks created by a call to the encoding function is
-   called a stripe.
-
-*shard|strip*
-   an ordered sequence of chunks of the same rank from the same
-   object.  For a given placement group, each OSD contains shards of
-   the same rank. When dealing with objects that are encoded with a
-   single operation, *chunk* is sometime used instead of *shard*
-   because the shard is made of a single chunk. The *chunks* in a
-   *shard* are ordered according to the rank of the stripe they belong
-   to.
+   The index of a chunk, as determined by the encoding function. The
+   rank of the first chunk is 0, the rank of the second chunk is 1,
+   and so on.
 
 *K*
 
 *K*
-   the number of data *chunks*, i.e. the number of *chunks* in which the
-   original object is divided. For instance if *K* = 2 a 10KB object
-   will be divided into *K* objects of 5KB each.
+   The number of data chunks into which an object is divided. For
+   example, if *K* = 2, then a 10KB object is divided into two objects
+   of 5KB each.
 
 *M* 
 
 *M* 
-   the number of coding *chunks*, i.e. the number of additional *chunks*
-   computed by the encoding functions. If there are 2 coding *chunks*, 
-   it means 2 OSDs can be out without losing data.
+   The number of coding chunks computed by the encoding function. *M*
+   is equal to the number of OSDs that can be missing from the cluster
+   without the cluster suffering data loss. For example, if there are
+   two coding chunks, then two OSDs can be missing without data loss.
 
 *N*
 
 *N*
-   the number of data *chunks* plus the number of coding *chunks*, 
-   i.e. *K+M*.
+   The number of data chunks plus the number of coding chunks: that
+   is, *K* + *M*.
 
 *rate*
 
 *rate*
-   the proportion of the *chunks* that contains useful information, i.e. *K/N*.
-   For instance, for *K* = 9 and *M* = 3 (i.e. *K+M* = *N* = 12) the rate is 
-   *K* = 9 / *N* = 12 = 0.75, i.e. 75% of the chunks contain useful information.
+   The proportion of the total chunks containing useful information:
+   that is, *K* divided by *N*. For example, suppose that *K* = 9 and
+   *M* = 3. This would mean that *N* = 12 (because *K* + *M* = 9 + 3).
+   Therefore, the *rate* (*K* / *N*) would be 9 / 12 = 0.75. In other
+   words, 75% of the chunks would contain useful information.
+
+*shard* (also called *strip*)
+   An ordered sequence of chunks of the same rank from the same object. For a
+   given placement group, each OSD contains shards of the same rank. In the
+   special case in which an object is encoded with only one call to the
+   encoding function, the term *chunk* may be used instead of *shard* because
+   the shard is made of a single chunk. The chunks in a shard are ordered
+   according to the rank of the stripe (see *stripe* below) they belong to.
+
+
+*stripe* 
+   If an object is so large that encoding it requires more than one
+   call to the encoding function, each of these calls creates a set of
+   chunks called a *stripe*.
 
 The definitions are illustrated as follows (PG stands for placement group):
 ::
 
 The definitions are illustrated as follows (PG stands for placement group):
 ::
@@ -71,8 +76,8 @@ The definitions are illustrated as follows (PG stands for placement group):
        |         ...             | |         ...             |
        +-------------------------+ +-------------------------+
 
        |         ...             | |         ...             |
        +-------------------------+ +-------------------------+
 
-Table of content
-----------------
+Table of contents
+-----------------
 
 .. toctree::
    :maxdepth: 1
 
 .. toctree::
    :maxdepth: 1
index e473895762ea1ad8b760eee7e0d7fc771e603ffd..07547c40c5eec6ffc91763c8cbffd466027afc3c 100644 (file)
  Ceph Glossary
 ===============
 
  Ceph Glossary
 ===============
 
-Ceph is growing rapidly. As firms deploy Ceph, the technical terms such as
-"RADOS", "RBD," "RGW" and so forth require corresponding marketing terms
-that explain what each component does. The terms in this glossary are
-intended to complement the existing technical terminology.
+.. glossary::
 
 
-Sometimes more than one term applies to a definition. Generally, the first
-term reflects a term consistent with Ceph's marketing, and secondary terms
-reflect either technical terms or legacy ways of referring to Ceph systems.
+        Application
+                More properly called a :term:`client`, an application is any program
+                external to Ceph that uses a Ceph Cluster to store and
+                replicate data.
+
+       :ref:`BlueStore<rados_config_storage_devices_bluestore>`
+                OSD BlueStore is a storage back end used by OSD daemons, and
+                was designed specifically for use with Ceph. BlueStore was
+                introduced in the Ceph Kraken release. In the Ceph Luminous
+                release, BlueStore became Ceph's default storage back end,
+                supplanting FileStore. Unlike :term:`filestore`, BlueStore
+                stores objects directly on Ceph block devices without any file
+                system interface. Since Luminous (12.2), BlueStore has been
+                Ceph's default and recommended storage back end.
+
+        Bucket
+                In the context of :term:`RGW`, a bucket is a group of objects.
+                In a filesystem-based analogy in which objects are the
+                counterpart of files, buckets are the counterpart of
+                directories. :ref:`Multisite sync
+                policies<radosgw-multisite-sync-policy>` can be set on buckets,
+                to provide fine-grained control of data movement from one zone
+                to another zone. 
+                
+                The concept of the bucket has been taken from AWS S3. See also
+                `the AWS S3 page on creating buckets <https://docs.aws.amazon.com/AmazonS3/latest/userguide/creating-buckets-s3.html>`_
+                and `the AWS S3 'Buckets Overview' page <https://docs.aws.amazon.com/AmazonS3/latest/userguide/UsingBucket.html>`_.
+
+                OpenStack Swift uses the term "containers" for what RGW and AWS call "buckets". 
+                See `the OpenStack Storage API overview page <https://docs.openstack.org/swift/latest/api/object_api_v1_overview.html>`_.
+                
+       Ceph
+                Ceph is a distributed network storage and file system with
+                distributed metadata management and POSIX semantics.
 
 
+       Ceph Block Device
+                A software instrument that orchestrates the storage of
+                block-based data in Ceph. Ceph Block Device (also called "RBD",
+                or "RADOS block device") splits block-based application data
+                into "chunks". RADOS stores these chunks as objects. Ceph Block
+                Device orchestrates the storage of those objects across the
+                storage cluster. See also :term:`RBD`.
 
 
-.. glossary::
+       Ceph Block Storage
+                One of the three kinds of storage supported by Ceph (the other
+                two are object storage and file storage). Ceph Block Storage is
+                the block storage "product", which refers to block-storage
+                related services and capabilities when used in conjunction with
+                the collection of (1) ``librbd`` (a python module that provides
+                file-like access to :term:`RBD` images), (2) a hypervisor such
+                as QEMU or Xen, and (3) a hypervisor abstraction layer such as
+                ``libvirt``.
 
 
-       Ceph Project
-               The aggregate term for the people, software, mission and infrastructure
-               of Ceph.
+       Ceph Client
+                Any of the Ceph components that can access a Ceph Storage
+                Cluster. This includes the Ceph Object Gateway, the Ceph Block
+                Device, the Ceph File System, and their corresponding
+                libraries. It also includes kernel modules, and FUSEs
+                (Filesystems in USERspace).
 
 
-       cephx
-               The Ceph authentication protocol. Cephx operates like Kerberos, but it
-               has no single point of failure.
+       Ceph Client Libraries
+                The collection of libraries that can be used to interact with
+                components of the Ceph Cluster.
 
 
-       Ceph
-       Ceph Platform
-               All Ceph software, which includes any piece of code hosted at
-               `https://github.com/ceph`_.
+       Ceph Cluster Map
+                See :term:`Cluster Map`
 
 
-       Ceph System
-       Ceph Stack
-               A collection of two or more components of Ceph.
+       Ceph Dashboard
+                :ref:`The Ceph Dashboard<mgr-dashboard>` is a built-in
+                web-based Ceph management and monitoring application through
+                which you can inspect and administer various resources within
+                the cluster. It is implemented as a :ref:`ceph-manager-daemon`
+                module.
+
+       Ceph File System
+                See :term:`CephFS`
+
+       :ref:`CephFS<ceph-file-system>`
+                The **Ceph F**\ile **S**\ystem, or CephFS, is a
+                POSIX-compliant file system built on top of Ceph’s distributed
+                object store, RADOS.  See :ref:`CephFS Architecture
+                <arch-cephfs>` for more details.
+
+       Ceph Interim Release
+                See :term:`Releases`.
+
+       Ceph Kernel Modules
+                The collection of kernel modules that can be used to interact
+                with the Ceph Cluster (for example: ``ceph.ko``, ``rbd.ko``).
+
+       :ref:`Ceph Manager<ceph-manager-daemon>`
+                The Ceph manager daemon (ceph-mgr) is a daemon that runs
+                alongside monitor daemons to provide monitoring and interfacing
+                to external monitoring and management systems. Since the
+                Luminous release (12.x), no Ceph cluster functions properly
+                unless it contains a running ceph-mgr daemon. 
+
+       Ceph Manager Dashboard
+                See :term:`Ceph Dashboard`.
+
+       Ceph Metadata Server
+                See :term:`MDS`.
+
+       Ceph Monitor
+                A daemon that maintains a map of the state of the cluster. This
+                "cluster state" includes the monitor map, the manager map, the
+                OSD map, and the CRUSH map. A Ceph cluster must contain a
+                minimum of three running monitors in order to be both redundant
+                and highly-available. Ceph monitors and the nodes on which they
+                run are often referred to as "mon"s. See :ref:`Monitor Config
+                Reference <monitor-config-reference>`.
 
        Ceph Node
 
        Ceph Node
-       Node
-       Host
-               Any single machine or server in a Ceph System.
+               A Ceph node is a unit of the Ceph Cluster that communicates with
+               other nodes in the Ceph Cluster in order to replicate and
+               redistribute data. All of the nodes together are called the
+               :term:`Ceph Storage Cluster`. Ceph nodes include :term:`OSD`\s,
+               :term:`Ceph Monitor`\s, :term:`Ceph Manager`\s, and
+               :term:`MDS`\es. The term "node" is usually equivalent to "host"
+               in the Ceph documentation. If you have a running Ceph Cluster,
+               you can list all of the nodes in it by running the command
+               ``ceph node ls all``.
+                
+       :ref:`Ceph Object Gateway<object-gateway>`
+                An object storage interface built on top of librados. Ceph
+                Object Gateway provides a RESTful gateway between applications
+                and Ceph storage clusters.
+
+       Ceph Object Storage
+                See :term:`Ceph Object Store`.
 
 
-       Ceph Storage Cluster
        Ceph Object Store
        Ceph Object Store
-       RADOS
-       RADOS Cluster
-       Reliable Autonomic Distributed Object Store
-               The core set of storage software which stores the user's data (MON+OSD).
+                A Ceph Object Store consists of a :term:`Ceph Storage Cluster`
+                and a :term:`Ceph Object Gateway` (RGW).
+
+       :ref:`Ceph OSD<rados_configuration_storage-devices_ceph_osd>`
+                Ceph **O**\bject **S**\torage **D**\aemon. The Ceph OSD
+                software, which interacts with logical disks (:term:`OSD`).
+                Around 2013, there was an attempt by "research and industry"
+                (Sage's own words) to insist on using the term "OSD" to mean
+                only "Object Storage Device", but the Ceph community has always
+                persisted in using the term to mean "Object Storage Daemon" and
+                no less an authority than Sage Weil himself confirms in
+                November of 2022 that "Daemon is more accurate for how Ceph is
+                built" (private correspondence between Zac Dover and Sage Weil,
+                07 Nov 2022). 
 
 
-       Ceph Cluster Map
-       Cluster Map
-               The set of maps comprising the monitor map, OSD map, PG map, MDS map and
-               CRUSH map. See `Cluster Map`_ for details.
+       Ceph OSD Daemon
+                See :term:`Ceph OSD`.
 
 
-       Ceph Object Storage
-               The object storage "product", service or capabilities, which consists
-               essentially of a Ceph Storage Cluster and a Ceph Object Gateway.
+       Ceph OSD Daemons
+                See :term:`Ceph OSD`.
 
 
-       Ceph Object Gateway
-       RADOS Gateway
-       RGW
-               The S3/Swift gateway component of Ceph.
+       Ceph Platform
+                All Ceph software, which includes any piece of code hosted at
+                `https://github.com/ceph`_.
 
 
-       Ceph Block Device
-       RBD
-               The block storage component of Ceph.
+       Ceph Point Release
+                See :term:`Releases`.
 
 
-       Ceph Block Storage
-               The block storage "product," service or capabilities when used in
-               conjunction with ``librbd``, a hypervisor such as QEMU or Xen, and a
-               hypervisor abstraction layer such as ``libvirt``.
+       Ceph Project
+                The aggregate term for the people, software, mission and
+                infrastructure of Ceph.
 
 
-       Ceph File System
-       CephFS
-       Ceph FS
-               The POSIX filesystem components of Ceph. Refer
-               :ref:`CephFS Architecture <arch-cephfs>` and :ref:`ceph-file-system` for
-               more details.
+       Ceph Release
+                See :term:`Releases`.
+
+       Ceph Release Candidate
+                See :term:`Releases`.
+
+       Ceph Stable Release
+                See :term:`Releases`.
+
+       Ceph Stack
+               A collection of two or more components of Ceph.
+
+       :ref:`Ceph Storage Cluster<arch-ceph-storage-cluster>`
+                The collection of :term:`Ceph Monitor`\s, :term:`Ceph
+                Manager`\s, :term:`Ceph Metadata Server`\s, and :term:`OSD`\s
+                that work together to store and replicate data for use by
+                applications, Ceph Users, and :term:`Ceph Client`\s. Ceph
+                Storage Clusters receive data from :term:`Ceph Client`\s.
+
+       cephx
+                The Ceph authentication protocol. Cephx operates like Kerberos,
+                but it has no single point of failure.
+
+       Client
+                A client is any program external to Ceph that uses a Ceph
+                Cluster to store and replicate data. 
 
        Cloud Platforms
        Cloud Stacks
 
        Cloud Platforms
        Cloud Stacks
-               Third party cloud provisioning platforms such as OpenStack, CloudStack,
-               OpenNebula, Proxmox VE, etc.
+                Third party cloud provisioning platforms such as OpenStack,
+                CloudStack, OpenNebula, and Proxmox VE.
 
 
-       Object Storage Device
-       OSD
-               A physical or logical storage unit (*e.g.*, LUN).
-               Sometimes, Ceph users use the
-               term "OSD" to refer to :term:`Ceph OSD Daemon`, though the
-               proper term is "Ceph OSD".
+       Cluster Map
+                The set of maps consisting of the monitor map, OSD map, PG map,
+                MDS map, and CRUSH map, which together report the state of the
+                Ceph cluster. See :ref:`the "Cluster Map" section of the
+                Architecture document<architecture_cluster_map>` for details.
 
 
-       Ceph OSD Daemon
-       Ceph OSD Daemons
-       Ceph OSD
-               The Ceph OSD software, which interacts with a logical
-               disk (:term:`OSD`). Sometimes, Ceph users use the
-               term "OSD" to refer to "Ceph OSD Daemon", though the
-               proper term is "Ceph OSD".
+       CRUSH
+                Controlled Replication Under Scalable Hashing. It is the
+                algorithm Ceph uses to compute object storage locations.
 
 
-       OSD id
-               The integer that defines an OSD. It is generated by the monitors as part
-               of the creation of a new OSD.
+       CRUSH rule
+                The CRUSH data placement rule that applies to a particular
+                pool(s).
 
 
-       OSD fsid
-               This is a unique identifier used to further improve the uniqueness of an
-               OSD and it is found in the OSD path in a file called ``osd_fsid``. This
-               ``fsid`` term is used interchangeably with ``uuid``
+        DAS
+                **D**\irect-\ **A**\ttached **S**\torage. Storage that is
+                attached directly to the computer accessing it, without passing
+                through a network.  Contrast with NAS and SAN.
 
 
-       OSD uuid
-               Just like the OSD fsid, this is the OSD unique identifier and is used
-               interchangeably with ``fsid``
+       :ref:`Dashboard<mgr-dashboard>`
+                A built-in web-based Ceph management and monitoring application
+                to administer various aspects and objects of the cluster. The
+                dashboard is implemented as a Ceph Manager module. See
+                :ref:`mgr-dashboard` for more details.
 
 
-       bluestore
-               OSD BlueStore is a new back end for OSD daemons (kraken and newer
-               versions). Unlike :term:`filestore` it stores objects directly on the
-               Ceph block devices without any file system interface.
+       Dashboard Module
+                Another name for :term:`Dashboard`.
 
 
+       Dashboard Plugin
        filestore
        filestore
-               A back end for OSD daemons, where a Journal is needed and files are
-               written to the filesystem.
+                A back end for OSD daemons, where a Journal is needed and files
+                are written to the filesystem.
+
+        FQDN
+                **F**\ully **Q**\ualified **D**\omain **N**\ame. A domain name
+                that is applied to a node in a network and that specifies the
+                node's exact location in the tree hierarchy of the DNS.
+
+                In the context of Ceph cluster administration, FQDNs are often
+                applied to hosts. In this documentation, the term "FQDN" is
+                used mostly to distinguish between FQDNs and relatively simpler
+                hostnames, which do not specify the exact location of the host
+                in the tree hierarchy of the DNS but merely name the host.
+
+       Host
+                Any single machine or server in a Ceph Cluster. See :term:`Ceph
+                Node`.
+
+       LVM tags
+                Extensible metadata for LVM volumes and groups. It is used to
+                store Ceph-specific information about devices and its
+                relationship with OSDs.
+
+       :ref:`MDS<cephfs_add_remote_mds>`
+                The Ceph **M**\eta\ **D**\ata **S**\erver daemon. Also referred
+                to as "ceph-mds". The Ceph metadata server daemon must be
+                running in any Ceph cluster that runs the CephFS file system.
+                The MDS stores all filesystem metadata. 
+
+       MGR
+                The Ceph manager software, which collects all the state from
+                the whole cluster in one place.
 
 
-       Ceph Monitor
        MON
                The Ceph monitor software.
 
        MON
                The Ceph monitor software.
 
-       Ceph Manager
-       MGR
-               The Ceph manager software, which collects all the state from the whole
-               cluster in one place.
+       Node
+                See :term:`Ceph Node`.
 
 
-       Ceph Manager Dashboard
-       Ceph Dashboard
-       Dashboard Module
-       Dashboard Plugin
-       Dashboard
-               A built-in web-based Ceph management and monitoring application to
-               administer various aspects and objects of the cluster. The dashboard is
-               implemented as a Ceph Manager module. See :ref:`mgr-dashboard` for more
-               details.
+       Object Storage Device
+                See :term:`OSD`.
 
 
-       Ceph Metadata Server
-       MDS
-               The Ceph metadata software.
+       OSD
+                Probably :term:`Ceph OSD`, but not necessarily. Sometimes
+                (especially in older correspondence, and especially in
+                documentation that is not written specifically for Ceph), "OSD"
+                means "**O**\bject **S**\torage **D**\evice", which refers to a
+                physical or logical storage unit (for example: LUN). The Ceph
+                community has always used the term "OSD" to refer to
+                :term:`Ceph OSD Daemon` despite an industry push in the
+                mid-2010s to insist that "OSD" should refer to "Object Storage
+                Device", so it is important to know which meaning is intended. 
 
 
-       Ceph Clients
-       Ceph Client
-               The collection of Ceph components which can access a Ceph Storage
-               Cluster. These include the Ceph Object Gateway, the Ceph Block Device,
-               the Ceph File System, and their corresponding libraries, kernel modules,
-               and FUSEs.
+       OSD fsid
+                This is a unique identifier used to identify an OSD. It is
+                found in the OSD path in a file called ``osd_fsid``. The
+                term ``fsid`` is used interchangeably with ``uuid``
 
 
-       Ceph Kernel Modules
-               The collection of kernel modules which can be used to interact with the
-               Ceph System (e.g., ``ceph.ko``, ``rbd.ko``).
+       OSD id
+                The integer that defines an OSD. It is generated by the
+                monitors during the creation of each OSD.
 
 
-       Ceph Client Libraries
-               The collection of libraries that can be used to interact with components
-               of the Ceph System.
+       OSD uuid
+                This is the unique identifier of an OSD. This term is used
+                interchangeably with ``fsid``
 
 
-       Ceph Release
-               Any distinct numbered version of Ceph.
+        Period
+                In the context of :term:`RGW`, a period is the configuration
+                state of the :term:`Realm`. The period stores the configuration
+                state of a multi-site configuration. When the period is updated,
+                the "epoch" is said thereby to have been changed.
 
 
-       Ceph Point Release
-               Any ad-hoc release that includes only bug or security fixes.
+       :ref:`Pool<rados_pools>`
+               A pool is a logical partition used to store objects.
 
 
-       Ceph Interim Release
-               Versions of Ceph that have not yet been put through quality assurance
-               testing, but may contain new features.
+       Pools
+                See :term:`pool`.
 
 
-       Ceph Release Candidate
-               A major version of Ceph that has undergone initial quality assurance
-               testing and is ready for beta testers.
+       RADOS
+                **R**\eliable **A**\utonomic **D**\istributed **O**\bject
+                **S**\tore. RADOS is the object store that provides a scalable
+                service for variably-sized objects. The RADOS object store is
+                the core component of a Ceph cluster.  `This blog post from
+                2009
+                <https://ceph.io/en/news/blog/2009/the-rados-distributed-object-store/>`_
+                provides a beginner's introduction to RADOS. Readers interested
+                in a deeper understanding of RADOS are directed to `RADOS: A
+                Scalable, Reliable Storage Service for Petabyte-scale Storage
+                Clusters <https://ceph.io/assets/pdfs/weil-rados-pdsw07.pdf>`_.
 
 
-       Ceph Stable Release
-               A major version of Ceph where all features from the preceding interim
-               releases have been put through quality assurance testing successfully.
+       RADOS Cluster
+                A proper subset of the Ceph Cluster consisting of
+                :term:`OSD`\s, :term:`Ceph Monitor`\s, and :term:`Ceph
+                Manager`\s.
+                
+       RADOS Gateway
+                See :term:`RGW`.
 
 
-       Ceph Test Framework
-       Teuthology
-               The collection of software that performs scripted tests on Ceph.
+       RBD
+                The block storage component of Ceph. Also called "RADOS Block
+                Device" or :term:`Ceph Block Device`.
 
 
-       CRUSH
-               Controlled Replication Under Scalable Hashing. It is the algorithm
-               Ceph uses to compute object storage locations.
+        :ref:`Realm<rgw-realms>`
+                In the context of RADOS Gateway (RGW), a realm is a globally
+                unique namespace that consists of one or more zonegroups.
 
 
-       CRUSH rule
-               The CRUSH data placement rule that applies to a particular pool(s).
+        Releases
 
 
-       Pool
-       Pools
-               Pools are logical partitions for storing objects.
+               Ceph Interim Release
+                        A version of Ceph that has not yet been put through
+                        quality assurance testing. May contain new features.
+
+                Ceph Point Release
+                        Any ad hoc release that includes only bug fixes and
+                        security fixes.
+
+                Ceph Release
+                        Any distinct numbered version of Ceph.
+
+                Ceph Release Candidate
+                        A major version of Ceph that has undergone initial
+                        quality assurance testing and is ready for beta
+                        testers.
+
+                Ceph Stable Release
+                        A major version of Ceph where all features from the
+                        preceding interim releases have been put through
+                        quality assurance testing successfully.
+
+       Reliable Autonomic Distributed Object Store
+                The core set of storage software which stores the user's data
+                (MON+OSD). See also :term:`RADOS`.
+
+       :ref:`RGW<object-gateway>`
+                **R**\ADOS **G**\ate **W**\ay.
+
+                The component of Ceph that provides a gateway to both the
+                Amazon S3 RESTful API and the OpenStack Swift API. Also called
+                "RADOS Gateway" and "Ceph Object Gateway".
+
+        secrets
+                Secrets are credentials used to perform digital authentication
+                whenever privileged users must access systems that require
+                authentication. Secrets can be passwords, API keys, tokens, SSH
+                keys, private certificates, or encryption keys.
+
+        SDS
+                Software-defined storage.
 
        systemd oneshot
 
        systemd oneshot
-               A systemd ``type`` where a command is defined in ``ExecStart`` which will
-               exit upon completion (it is not intended to daemonize)
+                A systemd ``type`` where a command is defined in ``ExecStart``
+                which will exit upon completion (it is not intended to
+                daemonize)
 
 
-       LVM tags
-               Extensible metadata for LVM volumes and groups. It is used to store
-               Ceph-specific information about devices and its relationship with
-               OSDs.
+       Teuthology
+               The collection of software that performs scripted tests on Ceph.
+
+        Zone
+                In the context of :term:`RGW`, a zone is a logical group that
+                consists of one or more :term:`RGW` instances.  A zone's
+                configuration state is stored in the :term:`period`. See
+                :ref:`Zones<radosgw-zones>`.
 
 .. _https://github.com/ceph: https://github.com/ceph
 
 .. _https://github.com/ceph: https://github.com/ceph
-.. _Cluster Map: ../architecture#cluster-map
+.. _Cluster Map: ../architecture#cluster-map   
index e0bcb0c5bb89daef77fb9ac11f19c0b603d25181..b73302f5c039138969f6d57d580ef8fac5cbea0c 100644 (file)
@@ -2,24 +2,24 @@
 <!-- Created with Inkscape (http://www.inkscape.org/) -->
 
 <svg
 <!-- Created with Inkscape (http://www.inkscape.org/) -->
 
 <svg
-   xmlns:osb="http://www.openswatchbook.org/uri/2009/osb"
-   xmlns:dc="http://purl.org/dc/elements/1.1/"
-   xmlns:cc="http://creativecommons.org/ns#"
-   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
-   xmlns:svg="http://www.w3.org/2000/svg"
-   xmlns="http://www.w3.org/2000/svg"
-   xmlns:xlink="http://www.w3.org/1999/xlink"
-   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
-   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
-   width="744.09448819"
-   height="1052.3622047"
+   width="379.63181"
+   height="638.90717"
    id="svg104536"
    version="1.1"
    id="svg104536"
    version="1.1"
-   inkscape:version="0.48.4 r9939"
+   inkscape:version="1.2.2 (b0a8486541, 2022-12-01)"
    sodipodi:docname="zone-sync.svg"
    inkscape:export-filename="/home/john/Pictures/zone-sync.png"
    inkscape:export-xdpi="90"
    sodipodi:docname="zone-sync.svg"
    inkscape:export-filename="/home/john/Pictures/zone-sync.png"
    inkscape:export-xdpi="90"
-   inkscape:export-ydpi="90">
+   inkscape:export-ydpi="90"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:xlink="http://www.w3.org/1999/xlink"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:osb="http://www.openswatchbook.org/uri/2009/osb">
   <defs
      id="defs104538">
     <linearGradient
   <defs
      id="defs104538">
     <linearGradient
          overflow="visible"
          id="use99499" />
     </clipPath>
          overflow="visible"
          id="use99499" />
     </clipPath>
-    <clipPath
-       id="SVGID_4875_">
-      <use
-         height="1052.3622"
-         width="744.09448"
-         y="0"
-         x="0"
-         style="overflow:visible"
-         xlink:href="#SVGID_4874_"
-         overflow="visible"
-         id="use84810" />
-    </clipPath>
     <linearGradient
        id="SVGID_4878_"
        gradientUnits="userSpaceOnUse"
     <linearGradient
        id="SVGID_4878_"
        gradientUnits="userSpaceOnUse"
          overflow="visible"
          id="use99513" />
     </clipPath>
          overflow="visible"
          id="use99513" />
     </clipPath>
-    <clipPath
-       id="SVGID_4880_">
-      <use
-         height="1052.3622"
-         width="744.09448"
-         y="0"
-         x="0"
-         style="overflow:visible"
-         xlink:href="#SVGID_4879_"
-         overflow="visible"
-         id="use84841" />
-    </clipPath>
     <clipPath
        id="SVGID_4882_">
       <use
     <clipPath
        id="SVGID_4882_">
       <use
     <clipPath
        id="SVGID_4860_">
       <polygon
     <clipPath
        id="SVGID_4860_">
       <polygon
-         points="-521.64,278.632 -507.673,278.632 -507.673,273.567 -521.64,273.567 -523.432,276.108 "
+         points="-507.673,273.567 -521.64,273.567 -523.432,276.108 -521.64,278.632 -507.673,278.632 "
          id="use84693" />
     </clipPath>
     <clipPath
          id="use84693" />
     </clipPath>
     <clipPath
     <clipPath
        id="SVGID_4855_">
       <polygon
     <clipPath
        id="SVGID_4855_">
       <polygon
-         points="-521.64,208.524 -507.673,208.524 -507.673,203.458 -521.64,203.458 -523.432,206 "
+         points="-507.673,203.458 -521.64,203.458 -523.432,206 -521.64,208.524 -507.673,208.524 "
          id="use84656" />
     </clipPath>
     <clipPath
          id="use84656" />
     </clipPath>
     <clipPath
     <clipPath
        id="SVGID_4850_">
       <polygon
     <clipPath
        id="SVGID_4850_">
       <polygon
-         points="-588.288,203.458 -590.081,206 -588.288,208.524 -574.322,208.524 -574.322,203.458 "
+         points="-588.288,208.524 -574.322,208.524 -574.322,203.458 -588.288,203.458 -590.081,206 "
          id="use84619" />
     </clipPath>
     <clipPath
          id="use84619" />
     </clipPath>
     <clipPath
     <clipPath
        id="SVGID_4845_">
       <polygon
     <clipPath
        id="SVGID_4845_">
       <polygon
-         points="-654.922,203.458 -656.715,206 -654.922,208.524 -640.956,208.524 -640.956,203.458 "
+         points="-654.922,208.524 -640.956,208.524 -640.956,203.458 -654.922,203.458 -656.715,206 "
          id="use84582" />
     </clipPath>
     <clipPath
          id="use84582" />
     </clipPath>
     <clipPath
     <clipPath
        id="SVGID_4821_">
       <polygon
     <clipPath
        id="SVGID_4821_">
       <polygon
-         points="-503.122,251.283 -503.124,231.934 -548.973,231.929 -548.973,251.221 -526.108,256.788 "
+         points="-548.973,231.929 -548.973,251.221 -526.108,256.788 -503.122,251.283 -503.124,231.934 "
          id="use84264" />
     </clipPath>
     <clipPath
          id="use84264" />
     </clipPath>
     <clipPath
     <clipPath
        id="SVGID_4541_">
       <polygon
     <clipPath
        id="SVGID_4541_">
       <polygon
-         points="-547.185,267.353 -504.831,267.32 -504.824,253.133 -526.362,258.293 -547.178,253.224 "
+         points="-504.824,253.133 -526.362,258.293 -547.178,253.224 -547.185,267.353 -504.831,267.32 "
          id="use82258" />
     </clipPath>
          id="use82258" />
     </clipPath>
-    <clipPath
-       id="SVGID_4525_">
-      <use
-         height="1052.3622"
-         width="744.09448"
-         y="0"
-         x="0"
-         style="overflow:visible"
-         xlink:href="#SVGID_4524_"
-         overflow="visible"
-         id="use82164" />
-    </clipPath>
-    <clipPath
-       id="SVGID_4527_">
-      <use
-         height="1052.3622"
-         width="744.09448"
-         y="0"
-         x="0"
-         style="overflow:visible"
-         xlink:href="#SVGID_4526_"
-         overflow="visible"
-         id="use82174" />
-    </clipPath>
     <linearGradient
        id="SVGID_4530_"
        gradientUnits="userSpaceOnUse"
     <linearGradient
        id="SVGID_4530_"
        gradientUnits="userSpaceOnUse"
          overflow="visible"
          id="use101344" />
     </clipPath>
          overflow="visible"
          id="use101344" />
     </clipPath>
-    <clipPath
-       id="SVGID_4534_">
-      <use
-         height="1052.3622"
-         width="744.09448"
-         y="0"
-         x="0"
-         style="overflow:visible"
-         xlink:href="#SVGID_4533_"
-         overflow="visible"
-         id="use82209" />
-    </clipPath>
     <linearGradient
        id="SVGID_4537_"
        gradientUnits="userSpaceOnUse"
     <linearGradient
        id="SVGID_4537_"
        gradientUnits="userSpaceOnUse"
     <clipPath
        id="SVGID_4520_">
       <polygon
     <clipPath
        id="SVGID_4520_">
       <polygon
-         points="-547.302,196.684 -528.257,196.685 -526.139,198.478 -524.02,196.685 -504.975,196.685 -504.975,188.287 -547.302,188.287 "
+         points="-526.139,198.478 -524.02,196.685 -504.975,196.685 -504.975,188.287 -547.302,188.287 -547.302,196.684 -528.257,196.685 "
          id="use82113" />
     </clipPath>
     <clipPath
          id="use82113" />
     </clipPath>
     <clipPath
     <clipPath
        id="SVGID_4515_">
       <polygon
     <clipPath
        id="SVGID_4515_">
       <polygon
-         points="-590.704,196.685 -571.658,196.685 -571.658,188.287 -613.986,188.287 -613.986,196.684 -594.94,196.685 -592.822,198.478 "
+         points="-571.658,188.287 -613.986,188.287 -613.986,196.684 -594.94,196.685 -592.822,198.478 -590.704,196.685 -571.658,196.685 "
          id="use82064" />
     </clipPath>
     <clipPath
          id="use82064" />
     </clipPath>
     <clipPath
     <clipPath
        id="SVGID_4508_">
       <polygon
     <clipPath
        id="SVGID_4508_">
       <polygon
-         points="-657.048,196.685 -638.002,196.685 -638.002,188.287 -680.33,188.287 -680.33,196.684 -661.285,196.685 -659.167,198.478 "
+         points="-638.002,188.287 -680.33,188.287 -680.33,196.684 -661.285,196.685 -659.167,198.478 -657.048,196.685 -638.002,196.685 "
          id="use81991" />
     </clipPath>
     <linearGradient
          id="use81991" />
     </clipPath>
     <linearGradient
     <clipPath
        id="SVGID_4870_-6">
       <polygon
     <clipPath
        id="SVGID_4870_-6">
       <polygon
-         points="-654.922,273.567 -656.715,276.108 -654.922,278.632 -640.956,278.632 -640.956,273.567 "
+         points="-654.922,278.632 -640.956,278.632 -640.956,273.567 -654.922,273.567 -656.715,276.108 "
          id="use84771-5" />
     </clipPath>
     <clipPath
          id="use84771-5" />
     </clipPath>
     <clipPath
     <clipPath
        id="SVGID_4865_-6">
       <polygon
     <clipPath
        id="SVGID_4865_-6">
       <polygon
-         points="-588.288,273.567 -590.081,276.108 -588.288,278.632 -574.322,278.632 -574.322,273.567 "
+         points="-588.288,278.632 -574.322,278.632 -574.322,273.567 -588.288,273.567 -590.081,276.108 "
          id="use84732-8" />
     </clipPath>
     <clipPath
          id="use84732-8" />
     </clipPath>
     <clipPath
     <clipPath
        id="SVGID_4850_-1">
       <polygon
     <clipPath
        id="SVGID_4850_-1">
       <polygon
-         points="-588.288,203.458 -590.081,206 -588.288,208.524 -574.322,208.524 -574.322,203.458 "
+         points="-588.288,208.524 -574.322,208.524 -574.322,203.458 -588.288,203.458 -590.081,206 "
          id="use84619-3" />
     </clipPath>
     <clipPath
          id="use84619-3" />
     </clipPath>
     <clipPath
     <clipPath
        id="SVGID_4845_-3">
       <polygon
     <clipPath
        id="SVGID_4845_-3">
       <polygon
-         points="-654.922,203.458 -656.715,206 -654.922,208.524 -640.956,208.524 -640.956,203.458 "
+         points="-654.922,208.524 -640.956,208.524 -640.956,203.458 -654.922,203.458 -656.715,206 "
          id="use84582-2" />
     </clipPath>
     <clipPath
          id="use84582-2" />
     </clipPath>
     <clipPath
     <clipPath
        id="SVGID_4827_-3">
       <polygon
     <clipPath
        id="SVGID_4827_-3">
       <polygon
-         points="-682.208,251.221 -659.342,256.788 -636.356,251.283 -636.358,231.934 -682.207,231.929 "
+         points="-636.356,251.283 -636.358,231.934 -682.207,231.929 -682.208,251.221 -659.342,256.788 "
          id="use84326-6" />
     </clipPath>
     <linearGradient
          id="use84326-6" />
     </clipPath>
     <linearGradient
     <clipPath
        id="SVGID_4824_-9">
       <polygon
     <clipPath
        id="SVGID_4824_-9">
       <polygon
-         points="-615.653,251.221 -592.788,256.788 -569.802,251.283 -569.804,231.934 -615.653,231.929 "
+         points="-569.802,251.283 -569.804,231.934 -615.653,231.929 -615.653,251.221 -592.788,256.788 "
          id="use84295-9" />
     </clipPath>
     <linearGradient
          id="use84295-9" />
     </clipPath>
     <linearGradient
     <clipPath
        id="SVGID_4547_-4">
       <polygon
     <clipPath
        id="SVGID_4547_-4">
       <polygon
-         points="-659.18,258.293 -679.997,253.224 -680.004,267.353 -637.65,267.32 -637.642,253.133 "
+         points="-680.004,267.353 -637.65,267.32 -637.642,253.133 -659.18,258.293 -679.997,253.224 "
          id="use82316-8" />
     </clipPath>
     <linearGradient
          id="use82316-8" />
     </clipPath>
     <linearGradient
     <clipPath
        id="SVGID_4544_-2">
       <polygon
     <clipPath
        id="SVGID_4544_-2">
       <polygon
-         points="-593.085,258.293 -613.901,253.224 -613.908,267.353 -571.554,267.32 -571.547,253.133 "
+         points="-613.908,267.353 -571.554,267.32 -571.547,253.133 -593.085,258.293 -613.901,253.224 "
          id="use82287-1" />
     </clipPath>
     <clipPath
          id="use82287-1" />
     </clipPath>
     <clipPath
     <clipPath
        id="SVGID_4515_-1">
       <polygon
     <clipPath
        id="SVGID_4515_-1">
       <polygon
-         points="-613.986,188.287 -613.986,196.684 -594.94,196.685 -592.822,198.478 -590.704,196.685 -571.658,196.685 -571.658,188.287 "
+         points="-594.94,196.685 -592.822,198.478 -590.704,196.685 -571.658,196.685 -571.658,188.287 -613.986,188.287 -613.986,196.684 "
          id="use82064-3" />
     </clipPath>
     <clipPath
          id="use82064-3" />
     </clipPath>
     <clipPath
     <clipPath
        id="SVGID_4508_-0">
       <polygon
     <clipPath
        id="SVGID_4508_-0">
       <polygon
-         points="-680.33,188.287 -680.33,196.684 -661.285,196.685 -659.167,198.478 -657.048,196.685 -638.002,196.685 -638.002,188.287 "
+         points="-661.285,196.685 -659.167,198.478 -657.048,196.685 -638.002,196.685 -638.002,188.287 -680.33,188.287 -680.33,196.684 "
          id="use81991-1" />
     </clipPath>
     <linearGradient
          id="use81991-1" />
     </clipPath>
     <linearGradient
     <clipPath
        id="SVGID_4870_-2">
       <polygon
     <clipPath
        id="SVGID_4870_-2">
       <polygon
-         points="-654.922,278.632 -640.956,278.632 -640.956,273.567 -654.922,273.567 -656.715,276.108 "
+         points="-640.956,273.567 -654.922,273.567 -656.715,276.108 -654.922,278.632 -640.956,278.632 "
          id="use84771-1" />
     </clipPath>
     <clipPath
          id="use84771-1" />
     </clipPath>
     <clipPath
     <clipPath
        id="SVGID_4865_-0">
       <polygon
     <clipPath
        id="SVGID_4865_-0">
       <polygon
-         points="-588.288,278.632 -574.322,278.632 -574.322,273.567 -588.288,273.567 -590.081,276.108 "
+         points="-574.322,273.567 -588.288,273.567 -590.081,276.108 -588.288,278.632 -574.322,278.632 "
          id="use84732-6" />
     </clipPath>
     <clipPath
          id="use84732-6" />
     </clipPath>
     <clipPath
     <clipPath
        id="SVGID_4850_-19">
       <polygon
     <clipPath
        id="SVGID_4850_-19">
       <polygon
-         points="-588.288,208.524 -574.322,208.524 -574.322,203.458 -588.288,203.458 -590.081,206 "
+         points="-574.322,203.458 -588.288,203.458 -590.081,206 -588.288,208.524 -574.322,208.524 "
          id="use84619-38" />
     </clipPath>
     <clipPath
          id="use84619-38" />
     </clipPath>
     <clipPath
     <clipPath
        id="SVGID_4845_-4">
       <polygon
     <clipPath
        id="SVGID_4845_-4">
       <polygon
-         points="-654.922,208.524 -640.956,208.524 -640.956,203.458 -654.922,203.458 -656.715,206 "
+         points="-640.956,203.458 -654.922,203.458 -656.715,206 -654.922,208.524 -640.956,208.524 "
          id="use84582-3" />
     </clipPath>
     <clipPath
          id="use84582-3" />
     </clipPath>
     <clipPath
     <clipPath
        id="SVGID_4827_-8">
       <polygon
     <clipPath
        id="SVGID_4827_-8">
       <polygon
-         points="-636.356,251.283 -636.358,231.934 -682.207,231.929 -682.208,251.221 -659.342,256.788 "
+         points="-682.207,231.929 -682.208,251.221 -659.342,256.788 -636.356,251.283 -636.358,231.934 "
          id="use84326-1" />
     </clipPath>
     <linearGradient
          id="use84326-1" />
     </clipPath>
     <linearGradient
     <clipPath
        id="SVGID_4824_-6">
       <polygon
     <clipPath
        id="SVGID_4824_-6">
       <polygon
-         points="-569.802,251.283 -569.804,231.934 -615.653,231.929 -615.653,251.221 -592.788,256.788 "
+         points="-615.653,231.929 -615.653,251.221 -592.788,256.788 -569.802,251.283 -569.804,231.934 "
          id="use84295-8" />
     </clipPath>
     <linearGradient
          id="use84295-8" />
     </clipPath>
     <linearGradient
     <clipPath
        id="SVGID_4547_-3">
       <polygon
     <clipPath
        id="SVGID_4547_-3">
       <polygon
-         points="-680.004,267.353 -637.65,267.32 -637.642,253.133 -659.18,258.293 -679.997,253.224 "
+         points="-637.642,253.133 -659.18,258.293 -679.997,253.224 -680.004,267.353 -637.65,267.32 "
          id="use82316-0" />
     </clipPath>
     <linearGradient
          id="use82316-0" />
     </clipPath>
     <linearGradient
     <clipPath
        id="SVGID_4544_-1">
       <polygon
     <clipPath
        id="SVGID_4544_-1">
       <polygon
-         points="-613.908,267.353 -571.554,267.32 -571.547,253.133 -593.085,258.293 -613.901,253.224 "
+         points="-571.547,253.133 -593.085,258.293 -613.901,253.224 -613.908,267.353 -571.554,267.32 "
          id="use82287-5" />
     </clipPath>
     <clipPath
          id="use82287-5" />
     </clipPath>
     <clipPath
     <clipPath
        id="SVGID_4515_-11">
       <polygon
     <clipPath
        id="SVGID_4515_-11">
       <polygon
-         points="-590.704,196.685 -571.658,196.685 -571.658,188.287 -613.986,188.287 -613.986,196.684 -594.94,196.685 -592.822,198.478 "
+         points="-571.658,188.287 -613.986,188.287 -613.986,196.684 -594.94,196.685 -592.822,198.478 -590.704,196.685 -571.658,196.685 "
          id="use82064-1" />
     </clipPath>
     <clipPath
          id="use82064-1" />
     </clipPath>
     <clipPath
     <clipPath
        id="SVGID_4508_-3">
       <polygon
     <clipPath
        id="SVGID_4508_-3">
       <polygon
-         points="-657.048,196.685 -638.002,196.685 -638.002,188.287 -680.33,188.287 -680.33,196.684 -661.285,196.685 -659.167,198.478 "
+         points="-638.002,188.287 -680.33,188.287 -680.33,196.684 -661.285,196.685 -659.167,198.478 -657.048,196.685 -638.002,196.685 "
          id="use81991-0" />
     </clipPath>
     <linearGradient
          id="use81991-0" />
     </clipPath>
     <linearGradient
     <clipPath
        id="SVGID_4855_-2-2">
       <polygon
     <clipPath
        id="SVGID_4855_-2-2">
       <polygon
-         points="-507.673,203.458 -521.64,203.458 -523.432,206 -521.64,208.524 -507.673,208.524 "
+         points="-523.432,206 -521.64,208.524 -507.673,208.524 -507.673,203.458 -521.64,203.458 "
          id="use84656-1-4" />
     </clipPath>
     <clipPath
          id="use84656-1-4" />
     </clipPath>
     <clipPath
     <clipPath
        id="SVGID_4520_-5-3">
       <polygon
     <clipPath
        id="SVGID_4520_-5-3">
       <polygon
-         points="-524.02,196.685 -504.975,196.685 -504.975,188.287 -547.302,188.287 -547.302,196.684 -528.257,196.685 -526.139,198.478 "
+         points="-504.975,188.287 -547.302,188.287 -547.302,196.684 -528.257,196.685 -526.139,198.478 -524.02,196.685 -504.975,196.685 "
          id="use82113-2-8" />
     </clipPath>
     <linearGradient
          id="use82113-2-8" />
     </clipPath>
     <linearGradient
        xlink:href="#linearGradient126200-2-0"
        id="linearGradient9382"
        gradientUnits="userSpaceOnUse"
        xlink:href="#linearGradient126200-2-0"
        id="linearGradient9382"
        gradientUnits="userSpaceOnUse"
-       gradientTransform="translate(28.50002,64.927434)"
+       gradientTransform="translate(164.46193,28.435994)"
        x1="111"
        y1="442.86218"
        x2="219"
        x1="111"
        y1="442.86218"
        x2="219"
          overflow="visible"
          id="use82447-2-1-6-0" />
     </clipPath>
          overflow="visible"
          id="use82447-2-1-6-0" />
     </clipPath>
-  </defs>
-  <sodipodi:namedview
-     id="base"
-     pagecolor="#ffffff"
-     bordercolor="#666666"
-     borderopacity="1.0"
-     inkscape:pageopacity="0.0"
-     inkscape:pageshadow="2"
-     inkscape:zoom="1.0729879"
-     inkscape:cx="202.21003"
-     inkscape:cy="536.61458"
-     inkscape:document-units="px"
-     inkscape:current-layer="layer1"
-     showgrid="false"
-     inkscape:window-width="1535"
-     inkscape:window-height="876"
-     inkscape:window-x="65"
-     inkscape:window-y="24"
-     inkscape:window-maximized="1" />
-  <metadata
-     id="metadata104541">
-    <rdf:RDF>
-      <cc:Work
-         rdf:about="">
-        <dc:format>image/svg+xml</dc:format>
-        <dc:type
-           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
-        <dc:title></dc:title>
-      </cc:Work>
-    </rdf:RDF>
-  </metadata>
-  <g
-     inkscape:label="Layer 1"
-     inkscape:groupmode="layer"
-     id="layer1">
-    <line
-       style="fill:none;stroke:#5e6a71;stroke-width:1.0268178;stroke-miterlimit:10;stroke-dasharray:3.07565499, 3.07565499"
-       stroke-miterlimit="10"
-       x1="277.38089"
-       y1="315.69797"
-       x2="277.38089"
-       y2="533.44318"
-       id="line84244" />
-    <rect
-       style="fill:none;stroke:#5e6a71;stroke-width:0.48500001;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0"
-       id="rect125410-1-2"
-       width="94.101288"
-       height="87.10128"
-       x="151.94936"
-       y="418.6185" />
-    <rect
-       style="fill:url(#linearGradient9382);fill-opacity:1;stroke:none"
-       id="rect126198-3-8"
-       width="108"
-       height="27"
-       x="139.50002"
-       y="494.28964" />
-    <rect
-       style="fill:#f15d57"
-       x="75.523293"
-       y="574.69031"
-       width="95.778"
-       height="3.0712502"
-       id="rect82236"
-       inkscape:transform-center-x="586.0074"
-       inkscape:transform-center-y="-79.564828" />
-    <rect
-       style="fill:#f15d57"
-       x="224.23932"
-       y="574.69031"
-       width="95.793755"
-       height="3.0712502"
-       id="rect82238"
-       inkscape:transform-center-x="437.28349"
-       inkscape:transform-center-y="-79.564828" />
-    <line
-       style="fill:none;stroke:#5e6a71;stroke-width:0.48150003;stroke-miterlimit:10;stroke-dasharray:1.44225, 1.44225"
-       stroke-miterlimit="10"
-       x1="272.20041"
-       y1="577.34521"
-       x2="272.20041"
-       y2="631.72772"
-       id="line82244"
-       inkscape:transform-center-x="437.21928"
-       inkscape:transform-center-y="-51.254289" />
-    <polyline
-       style="fill:none;stroke:#5e6a71;stroke-width:0.214;stroke-miterlimit:10;stroke-dasharray:0.641, 0.641"
-       transform="matrix(2.25,0,0,2.25,1605.7731,-25.560183)"
-       stroke-miterlimit="10"
-       points="  -603.212,292.128 -603.212,283.832 -582.187,283.832 -582.187,292.128 "
-       id="polyline82246"
-       inkscape:transform-center-x="437.22048"
-       inkscape:transform-center-y="-33.395941" />
-    <g
-       transform="matrix(2.25,0,0,2.25,1605.7731,-25.560183)"
-       id="g82281"
-       inkscape:transform-center-x="437.2835"
-       inkscape:transform-center-y="-95.804196">
-      <defs
-         id="defs82283">
-        <polygon
-           id="SVGID_4543_"
-           points="-613.901,253.224 -613.908,267.353 -571.554,267.32 -571.547,253.133 -593.085,258.293 " />
-      </defs>
-      <clipPath
-         id="clipPath101684">
-        <use
-           height="1052.3622"
-           width="744.09448"
-           y="0"
-           x="0"
-           style="overflow:visible"
-           xlink:href="#SVGID_4543_"
-           overflow="visible"
-           id="use101686" />
-      </clipPath>
-      <linearGradient
-         id="linearGradient101688"
-         gradientUnits="userSpaceOnUse"
-         x1="76.3899"
-         y1="97.785698"
-         x2="77.3899"
-         y2="97.785698"
-         gradientTransform="matrix(0,-19.5733,-19.5733,0,1321.2666,1762.5587)">
-        <stop
-           offset="0"
-           style="stop-color:#55AEB9"
-           id="stop101690" />
-        <stop
-           offset="0.0507"
-           style="stop-color:#68B4BF"
-           id="stop101692" />
-        <stop
-           offset="0.2116"
-           style="stop-color:#96C6CF"
-           id="stop101694" />
-        <stop
-           offset="0.3736"
-           style="stop-color:#BAD8DD"
-           id="stop101696" />
-        <stop
-           offset="0.5342"
-           style="stop-color:#D7E6EA"
-           id="stop101698" />
-        <stop
-           offset="0.693"
-           style="stop-color:#EBF2F3"
-           id="stop101700" />
-        <stop
-           offset="0.8492"
-           style="stop-color:#F8FBFB"
-           id="stop101702" />
-        <stop
-           offset="1"
-           style="stop-color:#FFFFFF"
-           id="stop101704" />
-      </linearGradient>
-      <rect
-         style="fill:url(#SVGID_4545_)"
-         x="-613.90802"
-         y="253.133"
-         clip-path="url(#SVGID_4544_)"
-         width="42.361"
-         height="14.22"
-         id="rect82306" />
-    </g>
-    <path
-       style="fill:#e6e8e8"
-       inkscape:connector-curvature="0"
-       d="m 319.54934,544.29505 -0.0157,31.37625 -94.815,0.072 0.0157,-31.2435 46.48275,11.31975 0.1125,0.027 0.11475,-0.027 48.105,-11.5245 z m 0.4815,-0.60975 -48.699,11.66625 -47.079,-11.46375 -0.0135,32.337 95.77575,-0.0743 0.0158,-32.46525 z"
-       id="path82308"
-       inkscape:transform-center-x="437.28456"
-       inkscape:transform-center-y="-95.835733" />
-    <g
-       transform="matrix(2.25,0,0,2.25,1605.7731,-25.560183)"
-       id="g82310"
-       inkscape:transform-center-x="585.9972"
-       inkscape:transform-center-y="-95.804196">
-      <defs
-         id="defs82312">
-        <polygon
-           id="SVGID_4546_"
-           points="-679.997,253.224 -680.004,267.353 -637.65,267.32 -637.642,253.133 -659.18,258.293 " />
-      </defs>
-      <clipPath
-         id="clipPath101711">
-        <use
-           height="1052.3622"
-           width="744.09448"
-           y="0"
-           x="0"
-           style="overflow:visible"
-           xlink:href="#SVGID_4546_"
-           overflow="visible"
-           id="use101713" />
-      </clipPath>
-      <linearGradient
-         id="linearGradient101715"
-         gradientUnits="userSpaceOnUse"
-         x1="76.3899"
-         y1="97.785698"
-         x2="77.3899"
-         y2="97.785698"
-         gradientTransform="matrix(0,-19.5733,-19.5733,0,1255.1711,1762.5587)">
-        <stop
-           offset="0"
-           style="stop-color:#55AEB9"
-           id="stop101717" />
-        <stop
-           offset="0.0507"
-           style="stop-color:#68B4BF"
-           id="stop101719" />
-        <stop
-           offset="0.2116"
-           style="stop-color:#96C6CF"
-           id="stop101721" />
-        <stop
-           offset="0.3736"
-           style="stop-color:#BAD8DD"
-           id="stop101723" />
-        <stop
-           offset="0.5342"
-           style="stop-color:#D7E6EA"
-           id="stop101725" />
-        <stop
-           offset="0.693"
-           style="stop-color:#EBF2F3"
-           id="stop101727" />
-        <stop
-           offset="0.8492"
-           style="stop-color:#F8FBFB"
-           id="stop101729" />
-        <stop
-           offset="1"
-           style="stop-color:#FFFFFF"
-           id="stop101731" />
-      </linearGradient>
-      <rect
-         style="fill:url(#SVGID_4548_)"
-         x="-680.00299"
-         y="253.133"
-         clip-path="url(#SVGID_4547_)"
-         width="42.361"
-         height="14.22"
-         id="rect82335" />
-    </g>
-    <path
-       style="fill:#e6e8e8"
-       inkscape:connector-curvature="0"
-       d="m 170.83559,544.29505 -0.0157,31.37625 -94.814996,0.072 0.01575,-31.2435 46.482736,11.31975 0.1125,0.027 0.11475,-0.027 48.10501,-11.5245 z m 0.4815,-0.60975 -48.699,11.66625 -47.078996,-11.46375 -0.0135,32.337 95.775746,-0.0743 0.0157,-32.46525 z"
-       id="path82337"
-       inkscape:transform-center-x="585.99834"
-       inkscape:transform-center-y="-95.835733" />
-    <text
-       y="567.99066"
-       x="104.52653"
-       id="text84236"
-       inkscape:transform-center-x="587.42372"
-       inkscape:transform-center-y="-90.601429"
-       style="font-size:27px">
-      <tspan
-         style="font-size:8px;fill:#37424b;font-family:ApexSans-Medium"
-         x="104.52653"
-         y="567.99066"
-         font-size="3.4203"
-         id="tspan84238">US-WEST</tspan>
-    </text>
-    <text
-       y="567.99066"
-       x="255.24185"
-       id="text84246"
-       inkscape:transform-center-x="438.70839"
-       inkscape:transform-center-y="-90.601429"
-       style="font-size:27px"
-       inkscape:export-xdpi="90"
-       inkscape:export-ydpi="90"
-       inkscape:export-filename="/home/john/Pictures/zone-sync.png">
-      <tspan
-         style="font-size:8px;fill:#37424b;font-family:ApexSans-Medium"
-         x="255.24185"
-         y="567.99066"
-         font-size="3.4203"
-         id="tspan84248">US-EAST</tspan>
-    </text>
-    <rect
-       style="fill:#f15d57"
-       x="220.3154"
-       y="492.99048"
-       width="103.6395"
-       height="3.8114998"
-       id="rect84287"
-       inkscape:transform-center-x="437.28453"
-       inkscape:transform-center-y="-160.89453" />
-    <g
-       transform="matrix(2.25,0,0,2.25,1605.7731,-25.560183)"
-       id="g84289"
-       inkscape:transform-center-x="437.28348"
-       inkscape:transform-center-y="-131.54432">
-      <defs
-         id="defs84291">
-        <polygon
-           id="SVGID_4823_"
-           points="-592.788,256.788 -569.802,251.283 -569.804,231.934 -615.653,231.929 -615.653,251.221 " />
-      </defs>
-      <clipPath
-         id="clipPath103235">
-        <use
-           height="1052.3622"
-           width="744.09448"
-           y="0"
-           x="0"
-           style="overflow:visible"
-           xlink:href="#SVGID_4823_"
-           overflow="visible"
-           id="use103237" />
-      </clipPath>
-      <linearGradient
-         id="linearGradient103239"
-         gradientUnits="userSpaceOnUse"
-         x1="145.3168"
-         y1="2.8518"
-         x2="146.3168"
-         y2="2.8518"
-         gradientTransform="matrix(0.0299,24.8865,24.8865,-0.0299,-668.057,-3384.4426)">
-        <stop
-           offset="0"
-           style="stop-color:#FFFFFF"
-           id="stop103241" />
-        <stop
-           offset="0.23"
-           style="stop-color:#FFFFFF"
-           id="stop103243" />
-        <stop
-           offset="0.5671"
-           style="stop-color:#F9F9F9"
-           id="stop103245" />
-        <stop
-           offset="0.8674"
-           style="stop-color:#EDEEEE"
-           id="stop103247" />
-        <stop
-           offset="1"
-           style="stop-color:#E6E8E7"
-           id="stop103249" />
-      </linearGradient>
-      <polygon
-         style="fill:url(#SVGID_4825_)"
-         clip-path="url(#SVGID_4824_)"
-         points="-615.683,231.929 -569.802,231.874 -569.772,256.788 -615.653,256.843 "
-         id="polygon84308" />
-    </g>
-    <path
-       style="fill:#e6e8e8"
-       inkscape:connector-curvature="0"
-       d="m 220.79459,496.5208 102.67875,0.009 10e-4,43.1055 -51.4755,12.33 -51.20775,-12.46725 0.003,-42.97725 z m -0.4815,-0.4815 v 43.83675 l 51.687,12.58425 51.957,-12.44475 -0.005,-43.96725 -103.6395,-0.009 z"
-       id="path84310"
-       inkscape:transform-center-x="437.28484"
-       inkscape:transform-center-y="-131.54096" />
-    <text
-       y="513.2843"
-       x="243.95297"
-       id="text84312"
-       inkscape:transform-center-x="437.86922"
-       inkscape:transform-center-y="-134.7035"
-       style="font-size:27px">
-      <tspan
-         style="font-size:11px;fill:#37424b;font-family:ApexSans-Book"
-         x="243.95297"
-         y="513.2843"
-         font-size="5.1244"
-         id="tspan84314">RADOSGW</tspan>
-    </text>
-    <rect
-       style="fill:#f15d57"
-       x="70.568871"
-       y="492.99048"
-       width="103.6395"
-       height="3.8114998"
-       id="rect84318"
-       inkscape:transform-center-x="587.03108"
-       inkscape:transform-center-y="-160.89453" />
-    <g
-       id="g9328">
-      <line
-         id="line84244-3"
-         y2="533.36865"
-         x2="121.81088"
-         y1="315.62341"
-         x1="121.81088"
-         stroke-miterlimit="10"
-         style="fill:none;stroke:#5e6a71;stroke-width:1.0268178;stroke-miterlimit:10;stroke-dasharray:3.07565499, 3.07565499" />
+    <clipPath
+       clipPathUnits="userSpaceOnUse"
+       id="clipPath26747">
       <g
       <g
-         id="g82107-4"
-         transform="matrix(3.375,0,0,3.375,1898.5131,-334.69083)">
-        <defs
-           id="defs82109-6">
-          <polygon
-             points="-547.302,188.287 -547.302,196.684 -528.257,196.685 -526.139,198.478 -524.02,196.685 -504.975,196.685 -504.975,188.287 "
-             id="SVGID_4519_-5" />
-        </defs>
-        <clipPath
-           id="clipPath126820-6">
-          <use
-             id="use126822-8"
-             overflow="visible"
-             xlink:href="#SVGID_4519_-5"
-             style="overflow:visible"
-             x="0"
-             y="0"
-             width="744.09448"
-             height="1052.3622" />
-        </clipPath>
-        <linearGradient
-           gradientTransform="matrix(0,-10.1906,-10.1906,0,968.7597,614.6687)"
-           y2="146.6937"
-           x2="41.840599"
-           y1="146.6937"
-           x1="40.840599"
-           gradientUnits="userSpaceOnUse"
-           id="linearGradient126824-4">
-          <stop
-             id="stop126826-2"
-             style="stop-color:#37424B"
-             offset="0" />
-          <stop
-             id="stop126828-3"
-             style="stop-color:#37424B"
-             offset="0.12" />
-          <stop
-             id="stop126830-7"
-             style="stop-color:#5E6A71"
-             offset="0.88" />
-          <stop
-             id="stop126832-6"
-             style="stop-color:#5E6A71"
-             offset="1" />
-        </linearGradient>
+         id="g26751">
         <rect
         <rect
-           id="rect82124-4"
-           height="10.191"
-           width="42.327"
-           clip-path="url(#SVGID_4520_-5-6)"
-           y="188.287"
-           x="-547.302"
-           style="fill:url(#linearGradient126904-61)" />
+           style="opacity:0.61;fill:#000000;stroke-width:1.00094"
+           id="rect26749"
+           width="439.00146"
+           height="696.97461"
+           x="122.01721"
+           y="152.74527" />
       </g>
       </g>
+    </clipPath>
+    <clipPath
+       clipPathUnits="userSpaceOnUse"
+       id="clipPath28686">
       <g
       <g
-         id="g82126-0"
-         transform="matrix(3.375,0,0,3.375,1898.5131,-334.69083)">
-        <defs
-           id="defs82128-8">
-          <rect
-             height="205.44099"
-             width="200.271"
-             y="181.315"
-             x="-682.31403"
-             id="SVGID_4522_-8" />
-        </defs>
-        <clipPath
-           id="clipPath126838-9">
-          <use
-             id="use126840-87"
-             overflow="visible"
-             xlink:href="#SVGID_4522_-8"
-             style="overflow:visible"
-             x="0"
-             y="0"
-             width="744.09448"
-             height="1052.3622" />
-        </clipPath>
-        <path
-           id="path82134-5"
-           d="m -539.397,191.908 c -0.353,0 -0.64,-0.286 -0.64,-0.639 0,-0.354 0.287,-0.642 0.64,-0.641 0.354,0 0.639,0.287 0.639,0.641 0,0.353 -0.285,0.639 -0.639,0.639"
-           clip-path="url(#SVGID_4523_-1-5)"
-           inkscape:connector-curvature="0"
-           style="fill:#ffffff" />
-        <path
-           id="path82136-0"
-           d="m -539.397,194.263 c -0.353,0 -0.64,-0.286 -0.64,-0.639 0,-0.355 0.287,-0.642 0.64,-0.642 0.354,0 0.639,0.287 0.639,0.642 0,0.353 -0.285,0.639 -0.639,0.639"
-           clip-path="url(#SVGID_4523_-1-5)"
-           inkscape:connector-curvature="0"
-           style="fill:#ffffff" />
-        <circle
-           id="circle82138-2"
-           r="0.63999999"
-           cy="191.26801"
-           cx="-541.625"
-           stroke-miterlimit="10"
-           clip-path="url(#SVGID_4523_-1-5)"
-           d="m -540.985,191.26801 c 0,0.35346 -0.28654,0.64 -0.64,0.64 -0.35346,0 -0.64,-0.28654 -0.64,-0.64 0,-0.35347 0.28654,-0.64 0.64,-0.64 0.35346,0 0.64,0.28653 0.64,0.64 z"
-           sodipodi:cx="-541.625"
-           sodipodi:cy="191.26801"
-           sodipodi:rx="0.63999999"
-           sodipodi:ry="0.63999999"
-           style="fill:none;stroke:#ffffff;stroke-width:0.32100001;stroke-miterlimit:10" />
-        <circle
-           id="circle82140-3"
-           r="0.63999999"
-           cy="193.623"
-           cx="-541.625"
-           stroke-miterlimit="10"
-           clip-path="url(#SVGID_4523_-1-5)"
-           d="m -540.985,193.623 c 0,0.35346 -0.28654,0.64 -0.64,0.64 -0.35346,0 -0.64,-0.28654 -0.64,-0.64 0,-0.35346 0.28654,-0.64 0.64,-0.64 0.35346,0 0.64,0.28654 0.64,0.64 z"
-           sodipodi:cx="-541.625"
-           sodipodi:cy="193.623"
-           sodipodi:rx="0.63999999"
-           sodipodi:ry="0.63999999"
-           style="fill:none;stroke:#ffffff;stroke-width:0.32100001;stroke-miterlimit:10" />
-        <circle
-           id="circle82142-3"
-           r="0.63999999"
-           cy="191.26801"
-           cx="-543.85303"
-           stroke-miterlimit="10"
-           clip-path="url(#SVGID_4523_-1-5)"
-           d="m -543.21303,191.26801 c 0,0.35346 -0.28654,0.64 -0.64,0.64 -0.35346,0 -0.64,-0.28654 -0.64,-0.64 0,-0.35347 0.28654,-0.64 0.64,-0.64 0.35346,0 0.64,0.28653 0.64,0.64 z"
-           sodipodi:cx="-543.85303"
-           sodipodi:cy="191.26801"
-           sodipodi:rx="0.63999999"
-           sodipodi:ry="0.63999999"
-           style="fill:none;stroke:#ffffff;stroke-width:0.32100001;stroke-miterlimit:10" />
-        <circle
-           id="circle82144-4"
-           r="0.63999999"
-           cy="193.623"
-           cx="-543.854"
-           stroke-miterlimit="10"
-           clip-path="url(#SVGID_4523_-1-5)"
-           d="m -543.214,193.623 c 0,0.35346 -0.28654,0.64 -0.64,0.64 -0.35347,0 -0.64,-0.28654 -0.64,-0.64 0,-0.35346 0.28653,-0.64 0.64,-0.64 0.35346,0 0.64,0.28654 0.64,0.64 z"
-           sodipodi:cx="-543.854"
-           sodipodi:cy="193.623"
-           sodipodi:rx="0.63999999"
-           sodipodi:ry="0.63999999"
-           style="fill:none;stroke:#ffffff;stroke-width:0.32100001;stroke-miterlimit:10" />
-        <path
-           id="path82146-1"
-           d="m -537.169,191.908 c -0.354,0 -0.64,-0.286 -0.64,-0.639 0,-0.354 0.286,-0.642 0.64,-0.641 0.354,0 0.64,0.287 0.64,0.641 0,0.353 -0.286,0.639 -0.64,0.639"
-           clip-path="url(#SVGID_4523_-1-5)"
-           inkscape:connector-curvature="0"
-           style="fill:#ffffff" />
-        <path
-           id="path82148-5"
-           d="m -537.169,194.263 c -0.354,0 -0.64,-0.286 -0.64,-0.639 0,-0.355 0.286,-0.642 0.64,-0.642 0.354,0 0.64,0.287 0.64,0.642 0,0.353 -0.286,0.639 -0.64,0.639"
-           clip-path="url(#SVGID_4523_-1-5)"
-           inkscape:connector-curvature="0"
-           style="fill:#ffffff" />
+         id="g28694"
+         transform="matrix(0.2962963,0,0,0.2962963,-648.90222,109.95785)">
+        <g
+           id="g28692">
+          <g
+             id="g28690">
+            <rect
+               style="opacity:0.61;fill:#000000;stroke-width:1.00094"
+               id="rect28688"
+               width="439.00146"
+               height="696.97461"
+               x="122.01721"
+               y="152.74527" />
+          </g>
+        </g>
       </g>
       </g>
-      <text
-         style="font-size:40.5px"
-         id="text82150-7"
-         x="112.11884"
-         y="319.30515">
-        <tspan
-           id="tspan82152-4"
-           font-size="3.2027"
-           y="319.30515"
-           x="112.11884"
-           style="font-size:10.80911255px;fill:#ffffff;font-family:ApexSans-Medium">AP</tspan>
-        <tspan
-           id="tspan82154-9"
-           font-size="3.2027"
-           y="319.30515"
-           x="125.80093"
-           style="font-size:10.80911255px;fill:#ffffff;font-family:ApexSans-Medium">P</tspan>
-      </text>
+    </clipPath>
+    <clipPath
+       clipPathUnits="userSpaceOnUse"
+       id="clipPath28716">
       <g
       <g
-         id="g84638-4"
-         transform="matrix(3.375,0,0,3.375,1898.5131,-334.69083)">
-        <defs
-           id="defs84640-9">
-          <rect
-             height="205.44099"
-             width="200.271"
-             y="181.315"
-             x="-682.31403"
-             id="SVGID_4852_-4" />
-        </defs>
-        <clipPath
-           id="clipPath126879-0">
-          <use
-             id="use126881-7"
-             overflow="visible"
-             xlink:href="#SVGID_4852_-4"
-             style="overflow:visible"
-             x="0"
-             y="0"
-             width="744.09448"
-             height="1052.3622" />
-        </clipPath>
-        <path
-           id="path84646-0"
-           d="m -526.673,205.991 c 0,-0.349 0.282,-0.632 0.632,-0.632 0.349,0 0.632,0.283 0.632,0.632 0,0.35 -0.283,0.633 -0.632,0.633 -0.35,0 -0.632,-0.283 -0.632,-0.633"
-           clip-path="url(#SVGID_4853_-8-0)"
-           inkscape:connector-curvature="0"
-           style="fill:#5e6a71" />
-        <line
-           id="line84648-6"
-           y2="205.991"
-           x2="-523.14398"
-           y1="205.991"
-           x1="-526.03998"
-           stroke-miterlimit="10"
-           clip-path="url(#SVGID_4853_-8-0)"
-           style="fill:none;stroke:#5e6a71;stroke-width:0.214;stroke-miterlimit:10" />
+         id="g28724"
+         transform="matrix(0.44444444,0,0,0.44444444,-797.73062,91.646227)">
+        <g
+           id="g28722">
+          <g
+             id="g28720">
+            <rect
+               style="opacity:0.61;fill:#000000;stroke-width:1.00094"
+               id="rect28718"
+               width="439.00146"
+               height="696.97461"
+               x="122.01721"
+               y="152.74527" />
+          </g>
+        </g>
       </g>
       </g>
+    </clipPath>
+    <clipPath
+       clipPathUnits="userSpaceOnUse"
+       id="clipPath28726">
       <g
       <g
-         id="g84650-5"
-         transform="matrix(3.375,0,0,3.375,1898.5131,-334.69083)">
-        <defs
-           id="defs84652-4">
-          <polygon
-             points="-521.64,203.458 -523.432,206 -521.64,208.524 -507.673,208.524 -507.673,203.458 "
-             id="SVGID_4854_-1" />
-        </defs>
-        <clipPath
-           id="clipPath126888-1">
-          <use
-             id="use126890-4"
-             overflow="visible"
-             xlink:href="#SVGID_4854_-1"
-             style="overflow:visible"
-             x="0"
-             y="0"
-             width="744.09448"
-             height="1052.3622" />
-        </clipPath>
-        <linearGradient
-           gradientTransform="matrix(0,-5.065,-5.065,0,750.4031,35.2731)"
-           y2="249.94031"
-           x2="-33.205101"
-           y1="249.94031"
-           x1="-34.205299"
-           gradientUnits="userSpaceOnUse"
-           id="linearGradient126892-7">
-          <stop
-             id="stop126894-5"
-             style="stop-color:#E6E8E7"
-             offset="0" />
-          <stop
-             id="stop126896-6"
-             style="stop-color:#FFFFFF"
-             offset="1" />
-        </linearGradient>
-        <rect
-           id="rect84663-7"
-           height="5.066"
-           width="15.759"
-           clip-path="url(#SVGID_4855_-2-24)"
-           y="203.45799"
-           x="-523.43201"
-           style="fill:url(#SVGID_4856_-4-1)" />
+         id="g28734"
+         transform="matrix(0.44444444,0,0,0.44444444,-774.10444,27.578499)">
+        <g
+           id="g28732">
+          <g
+             id="g28730">
+            <rect
+               style="opacity:0.61;fill:#000000;stroke-width:1.00094"
+               id="rect28728"
+               width="439.00146"
+               height="696.97461"
+               x="122.01721"
+               y="152.74527" />
+          </g>
+        </g>
       </g>
       </g>
-      <polygon
-         id="polygon84665-6"
-         points="-521.64,203.459 -523.433,206 -521.64,208.524 -507.674,208.524 -507.674,203.459 "
-         stroke-miterlimit="10"
-         transform="matrix(3.375,0,0,3.375,1898.5131,-334.69083)"
-         style="fill:none;stroke:#e6e8e8;stroke-width:0.214;stroke-miterlimit:10" />
-      <text
-         style="font-size:40.5px"
-         id="text84667-5"
-         x="151.0986"
-         y="363.4711">
-        <tspan
-           id="tspan84669-5"
-           font-size="2.5652"
-           y="363.4711"
-           x="151.0986"
-           style="font-size:8.65755081px;fill:#5e6a71;font-family:ApexSans-Book">RE</tspan>
-        <tspan
-           id="tspan84671-5"
-           font-size="2.5652"
-           y="363.4711"
-           x="160.27521"
-           style="font-size:8.65755081px;fill:#5e6a71;font-family:ApexSans-Book">S</tspan>
-        <tspan
-           id="tspan84673-2"
-           font-size="2.5652"
-           y="363.4711"
-           x="164.41296"
-           style="font-size:8.65755081px;fill:#5e6a71;font-family:ApexSans-Book">T</tspan>
-      </text>
-    </g>
-    <g
-       transform="matrix(2.25,0,0,2.25,1605.7731,-25.560183)"
-       id="g84320"
-       inkscape:transform-center-x="587.03111"
-       inkscape:transform-center-y="-131.54432">
-      <defs
-         id="defs84322">
-        <polygon
-           id="SVGID_4826_"
-           points="-659.342,256.788 -636.356,251.283 -636.358,231.934 -682.207,231.929 -682.208,251.221 " />
-      </defs>
-      <clipPath
-         id="clipPath103260">
-        <use
-           height="1052.3622"
-           width="744.09448"
-           y="0"
-           x="0"
-           style="overflow:visible"
-           xlink:href="#SVGID_4826_"
-           overflow="visible"
-           id="use103262" />
-      </clipPath>
-      <linearGradient
-         id="linearGradient103264"
-         gradientUnits="userSpaceOnUse"
-         x1="145.3168"
-         y1="2.8518"
-         x2="146.3168"
-         y2="2.8518"
-         gradientTransform="matrix(0.0299,24.8865,24.8865,-0.0299,-734.6116,-3384.4426)">
-        <stop
-           offset="0"
-           style="stop-color:#FFFFFF"
-           id="stop103266" />
-        <stop
-           offset="0.23"
-           style="stop-color:#FFFFFF"
-           id="stop103268" />
-        <stop
-           offset="0.5671"
-           style="stop-color:#F9F9F9"
-           id="stop103270" />
-        <stop
-           offset="0.8674"
-           style="stop-color:#EDEEEE"
-           id="stop103272" />
-        <stop
-           offset="1"
-           style="stop-color:#E6E8E7"
-           id="stop103274" />
-      </linearGradient>
-      <polygon
-         style="fill:url(#SVGID_4828_)"
-         clip-path="url(#SVGID_4827_)"
-         points="-682.238,231.929 -636.356,231.874 -636.326,256.788 -682.208,256.843 "
-         id="polygon84339" />
-    </g>
-    <path
-       style="fill:#e6e8e8"
-       inkscape:connector-curvature="0"
-       d="m 71.048094,496.5208 102.678746,0.009 10e-4,43.1055 -51.4755,12.33 -51.207746,-12.46725 0.0023,-42.97725 z m -0.4815,-0.4815 v 43.83675 l 51.686996,12.58425 51.957,-12.44475 -0.005,-43.96725 -103.639496,-0.009 z"
-       id="path84341"
-       inkscape:transform-center-x="587.03109"
-       inkscape:transform-center-y="-131.54096" />
-    <text
-       y="513.2843"
-       x="94.206009"
-       id="text84343"
-       inkscape:transform-center-x="587.62742"
-       inkscape:transform-center-y="-134.7035"
-       style="font-size:27px">
-      <tspan
-         style="font-size:11px;fill:#37424b;font-family:ApexSans-Book"
-         x="94.206009"
-         y="513.2843"
-         font-size="5.1244"
-         id="tspan84345">RADOSGW</tspan>
-    </text>
-    <line
-       style="fill:none;stroke:#5e6a71;stroke-width:0.48150003;stroke-miterlimit:10;stroke-dasharray:1.44225, 1.44225"
-       stroke-miterlimit="10"
-       x1="122.29416"
-       y1="577.34521"
-       x2="122.29416"
-       y2="631.72772"
-       id="line84349"
-       inkscape:transform-center-x="587.12555"
-       inkscape:transform-center-y="-51.254289" />
-    <polyline
-       style="fill:none;stroke:#5e6a71;stroke-width:0.214;stroke-miterlimit:10;stroke-dasharray:0.641, 0.641"
-       transform="matrix(2.25,0,0,2.25,1605.7731,-25.560183)"
-       stroke-miterlimit="10"
-       points="  -669.837,292.128 -669.837,283.832 -648.812,283.832 -648.812,292.128 "
-       id="polyline84351"
-       inkscape:transform-center-x="587.12673"
-       inkscape:transform-center-y="-33.395941" />
-    <polygon
-       style="fill:#81d0db"
-       transform="matrix(2.25,0,0,2.25,1605.7731,-25.560183)"
-       points="-659.319,269.217 -657.251,267.424 -661.37,267.424 "
-       id="polygon84353"
-       inkscape:transform-center-x="587.09523"
-       inkscape:transform-center-y="-77.629816" />
-    <polygon
-       style="fill:#81d0db"
-       transform="matrix(2.25,0,0,2.25,1605.7731,-25.560183)"
-       points="-592.696,269.217 -590.628,267.424 -594.747,267.424 "
-       id="polygon84355"
-       inkscape:transform-center-x="437.19348"
-       inkscape:transform-center-y="-77.629816" />
-    <path
-       id="path84524"
-       d="m -365.856,302.434 c 0,-2.331 1.892,-4.222 4.225,-4.222 2.334,0 4.223,1.891 4.223,4.222 0,2.334 -1.889,4.226 -4.223,4.226 -2.333,0 -4.225,-1.892 -4.225,-4.226"
-       clip-path="url(#SVGID_4843_)"
-       inkscape:connector-curvature="0"
-       style="fill:#f15d57"
-       transform="matrix(1.5,0,0,1.5,1063.2832,192.41394)" />
-    <path
-       id="path84526"
-       d="m -361.631,301.547 c 0.488,0 0.888,0.398 0.888,0.887 0,0.493 -0.4,0.892 -0.888,0.89 -0.491,0 -0.888,-0.397 -0.888,-0.89 0,-0.489 0.397,-0.887 0.888,-0.887"
-       clip-path="url(#SVGID_4843_)"
-       inkscape:connector-curvature="0"
-       style="fill:#ffffff"
-       transform="matrix(1.5,0,0,1.5,1063.2832,192.41394)" />
-    <path
-       id="path84528"
-       d="m -347.575,299.54 c 0.487,0 0.886,0.395 0.886,0.886 0,0.494 -0.399,0.891 -0.886,0.891 -0.493,0 -0.888,-0.397 -0.888,-0.891 0,-0.491 0.395,-0.886 0.888,-0.886"
-       clip-path="url(#SVGID_4843_)"
-       inkscape:connector-curvature="0"
-       style="fill:#ffffff"
-       transform="matrix(1.5,0,0,1.5,1063.2832,192.41394)" />
-    <path
-       id="path84530"
-       d="m -350.839,302.809 c 0.49,0 0.886,0.397 0.886,0.886 0,0.494 -0.396,0.893 -0.886,0.893 -0.491,0 -0.889,-0.399 -0.889,-0.893 0,-0.489 0.398,-0.886 0.889,-0.886"
-       clip-path="url(#SVGID_4843_)"
-       inkscape:connector-curvature="0"
-       style="fill:#ffffff"
-       transform="matrix(1.5,0,0,1.5,1063.2832,192.41394)" />
-    <path
-       id="path84532"
-       d="m -350.838,299.54 c 0.489,0 0.885,0.395 0.885,0.886 0,0.494 -0.396,0.891 -0.885,0.891 -0.492,0 -0.89,-0.397 -0.89,-0.891 0,-0.491 0.398,-0.886 0.89,-0.886"
-       clip-path="url(#SVGID_4843_)"
-       inkscape:connector-curvature="0"
-       style="fill:#ffffff"
-       transform="matrix(1.5,0,0,1.5,1063.2832,192.41394)" />
-    <path
-       id="path84534"
-       d="m -347.576,302.809 c 0.488,0 0.888,0.397 0.888,0.886 0,0.494 -0.4,0.893 -0.888,0.893 -0.491,0 -0.888,-0.399 -0.888,-0.893 0,-0.489 0.397,-0.886 0.888,-0.886"
-       clip-path="url(#SVGID_4843_)"
-       inkscape:connector-curvature="0"
-       style="fill:#ffffff"
-       transform="matrix(1.5,0,0,1.5,1063.2832,192.41394)" />
-    <path
-       id="path84536"
-       d="m -344.311,302.809 c 0.488,0 0.886,0.397 0.886,0.886 0,0.494 -0.398,0.893 -0.886,0.893 -0.491,0 -0.888,-0.399 -0.888,-0.893 0,-0.489 0.397,-0.886 0.888,-0.886"
-       clip-path="url(#SVGID_4843_)"
-       inkscape:connector-curvature="0"
-       style="fill:#ffffff"
-       transform="matrix(1.5,0,0,1.5,1063.2832,192.41394)" />
-    <path
-       id="path84538"
-       d="m -344.31,299.54 c 0.487,0 0.885,0.395 0.885,0.886 0,0.494 -0.398,0.891 -0.885,0.891 -0.492,0 -0.888,-0.397 -0.888,-0.891 0,-0.491 0.396,-0.886 0.888,-0.886"
-       clip-path="url(#SVGID_4843_)"
-       inkscape:connector-curvature="0"
-       style="fill:#ffffff"
-       transform="matrix(1.5,0,0,1.5,1063.2832,192.41394)" />
-    <line
-       id="line84540"
-       y2="308.98499"
-       x2="-343.42499"
-       y1="308.98499"
-       x1="-365.664"
-       stroke-miterlimit="10"
-       clip-path="url(#SVGID_4843_)"
-       style="fill:none;stroke:#ffffff;stroke-width:0.428;stroke-miterlimit:10"
-       transform="matrix(1.5,0,0,1.5,1063.2832,192.41394)" />
-    <line
-       id="line84542"
-       y2="311.16699"
-       x2="-343.42499"
-       y1="311.16699"
-       x1="-365.664"
-       stroke-miterlimit="10"
-       clip-path="url(#SVGID_4843_)"
-       style="fill:none;stroke:#ffffff;stroke-width:0.428;stroke-miterlimit:10"
-       transform="matrix(1.5,0,0,1.5,1063.2832,192.41394)" />
-    <line
-       id="line84544"
-       y2="313.35001"
-       x2="-343.42499"
-       y1="313.35001"
-       x1="-365.664"
-       stroke-miterlimit="10"
-       clip-path="url(#SVGID_4843_)"
-       style="fill:none;stroke:#ffffff;stroke-width:0.428;stroke-miterlimit:10"
-       transform="matrix(1.5,0,0,1.5,1063.2832,192.41394)" />
-    <polygon
-       id="polygon84564"
-       points="-436.6,208.359 -434.532,206.566 -438.651,206.566 "
-       clip-path="url(#SVGID_4843_)"
-       style="fill:#f15d57"
-       transform="matrix(1.5,0,0,1.5,1063.2832,192.41394)" />
-    <polygon
-       id="polygon84566"
-       points="-426.089,208.359 -424.021,206.566 -428.14,206.566 "
-       clip-path="url(#SVGID_4843_)"
-       style="fill:#f15d57"
-       transform="matrix(1.5,0,0,1.5,1063.2832,192.41394)" />
-    <polygon
-       id="polygon84568"
-       points="-415.575,208.359 -413.507,206.566 -417.626,206.566 "
-       clip-path="url(#SVGID_4843_)"
-       style="fill:#f15d57"
-       transform="matrix(1.5,0,0,1.5,1063.2832,192.41394)" />
-    <polygon
-       id="polygon84570"
-       points="-296.627,290.885 -294.559,289.091 -298.678,289.091 "
-       clip-path="url(#SVGID_4843_)"
-       style="fill:#f15d57"
-       transform="matrix(1.5,0,0,1.5,1063.2832,192.41394)" />
-    <g
-       transform="matrix(2.25,0,0,2.25,1605.7731,-25.560183)"
-       id="g84714"
-       inkscape:transform-center-x="434.5295"
-       inkscape:transform-center-y="-60.127066">
-      <defs
-         id="defs84716">
-        <rect
-           id="SVGID_4862_"
-           x="-682.31403"
-           y="181.315"
-           width="200.271"
-           height="205.44099" />
-      </defs>
-      <clipPath
-         id="clipPath103539">
-        <use
-           height="1052.3622"
-           width="744.09448"
-           y="0"
-           x="0"
-           style="overflow:visible"
-           xlink:href="#SVGID_4862_"
-           overflow="visible"
-           id="use103541" />
-      </clipPath>
-      <path
-         style="fill:#5e6a71"
-         inkscape:connector-curvature="0"
-         clip-path="url(#SVGID_4863_)"
-         d="m -593.321,276.099 c 0,-0.349 0.282,-0.632 0.632,-0.632 0.349,0 0.632,0.283 0.632,0.632 0,0.35 -0.283,0.633 -0.632,0.633 -0.35,0 -0.632,-0.283 -0.632,-0.633"
-         id="path84722" />
-      <line
-         style="fill:none;stroke:#5e6a71;stroke-width:0.214;stroke-miterlimit:10"
-         clip-path="url(#SVGID_4863_)"
-         stroke-miterlimit="10"
-         x1="-592.68903"
-         y1="276.099"
-         x2="-589.79303"
-         y2="276.099"
-         id="line84724" />
-    </g>
-    <g
-       transform="matrix(2.25,0,0,2.25,1605.7731,-25.560183)"
-       id="g84726"
-       inkscape:transform-center-x="413.59995"
-       inkscape:transform-center-y="-60.127083">
-      <defs
-         id="defs84728">
-        <polygon
-           id="SVGID_4864_"
-           points="-590.081,276.108 -588.288,278.632 -574.322,278.632 -574.322,273.567 -588.288,273.567 " />
-      </defs>
-      <clipPath
-         id="clipPath103548">
-        <use
-           height="1052.3622"
-           width="744.09448"
-           y="0"
-           x="0"
-           style="overflow:visible"
-           xlink:href="#SVGID_4864_"
-           overflow="visible"
-           id="use103550" />
-      </clipPath>
-      <linearGradient
-         id="linearGradient103552"
-         gradientUnits="userSpaceOnUse"
-         x1="-34.205299"
-         y1="249.9404"
-         x2="-33.205299"
-         y2="249.9404"
-         gradientTransform="matrix(0,-5.065,-5.065,0,683.7546,105.3813)">
-        <stop
-           offset="0"
-           style="stop-color:#E6E8E7"
-           id="stop103554" />
-        <stop
-           offset="1"
-           style="stop-color:#FFFFFF"
-           id="stop103556" />
-      </linearGradient>
-      <rect
-         style="fill:url(#SVGID_4866_)"
-         x="-590.08099"
-         y="273.56699"
-         clip-path="url(#SVGID_4865_)"
-         width="15.759"
-         height="5.0650001"
-         id="rect84739" />
-    </g>
-    <polygon
-       style="fill:none;stroke:#e6e8e8;stroke-width:0.214;stroke-miterlimit:10"
-       transform="matrix(2.25,0,0,2.25,1605.7731,-25.560183)"
-       stroke-miterlimit="10"
-       points="-590.082,276.108 -588.289,278.632 -574.323,278.632 -574.323,273.567 -588.289,273.567 "
-       id="polygon84741"
-       inkscape:transform-center-x="413.60223"
-       inkscape:transform-center-y="-60.127066" />
-    <text
-       y="597.62451"
-       x="287.82977"
-       id="text84743"
-       inkscape:transform-center-x="412.33742"
-       inkscape:transform-center-y="-60.270044"
-       style="font-size:27px">
-      <tspan
-         style="font-size:5.77170038px;fill:#5e6a71;font-family:ApexSans-Book"
-         x="287.82977"
-         y="597.62451"
-         font-size="2.5652"
-         id="tspan84745">N</tspan>
-      <tspan
-         style="font-size:5.77170038px;fill:#5e6a71;font-family:ApexSans-Book"
-         x="291.70874"
-         y="597.62451"
-         font-size="2.5652"
-         id="tspan84747">A</tspan>
-      <tspan
-         style="font-size:5.77170038px;fill:#5e6a71;font-family:ApexSans-Book"
-         x="294.77774"
-         y="597.62451"
-         font-size="2.5652"
-         id="tspan84749">TIV</tspan>
-      <tspan
-         style="font-size:5.77170038px;fill:#5e6a71;font-family:ApexSans-Book"
-         x="302.49078"
-         y="597.62451"
-         font-size="2.5652"
-         id="tspan84751">E</tspan>
-    </text>
-    <g
-       transform="matrix(2.25,0,0,2.25,1605.7731,-25.560183)"
-       id="g84753"
-       inkscape:transform-center-x="584.45598"
-       inkscape:transform-center-y="-60.127066">
-      <defs
-         id="defs84755">
-        <rect
-           id="SVGID_4867_"
-           x="-682.31403"
-           y="181.315"
-           width="200.271"
-           height="205.44099" />
-      </defs>
-      <clipPath
-         id="clipPath103568">
-        <use
-           height="1052.3622"
-           width="744.09448"
-           y="0"
-           x="0"
-           style="overflow:visible"
-           xlink:href="#SVGID_4867_"
-           overflow="visible"
-           id="use103570" />
-      </clipPath>
-      <path
-         style="fill:#5e6a71"
-         inkscape:connector-curvature="0"
-         clip-path="url(#SVGID_4868_)"
-         d="m -659.955,276.099 c 0,-0.349 0.282,-0.632 0.632,-0.632 0.349,0 0.632,0.283 0.632,0.632 0,0.35 -0.283,0.633 -0.632,0.633 -0.35,0 -0.632,-0.283 -0.632,-0.633"
-         id="path84761" />
-      <line
-         style="fill:none;stroke:#5e6a71;stroke-width:0.214;stroke-miterlimit:10"
-         clip-path="url(#SVGID_4868_)"
-         stroke-miterlimit="10"
-         x1="-659.323"
-         y1="276.099"
-         x2="-656.427"
-         y2="276.099"
-         id="line84763" />
-    </g>
-    <g
-       transform="matrix(2.25,0,0,2.25,1605.7731,-25.560183)"
-       id="g84765"
-       inkscape:transform-center-x="563.5265"
-       inkscape:transform-center-y="-60.127083">
-      <defs
-         id="defs84767">
-        <polygon
-           id="SVGID_4869_"
-           points="-656.715,276.108 -654.922,278.632 -640.956,278.632 -640.956,273.567 -654.922,273.567 " />
-      </defs>
-      <clipPath
-         id="clipPath103577">
-        <use
-           height="1052.3622"
-           width="744.09448"
-           y="0"
-           x="0"
-           style="overflow:visible"
-           xlink:href="#SVGID_4869_"
-           overflow="visible"
-           id="use103579" />
-      </clipPath>
-      <linearGradient
-         id="linearGradient103581"
-         gradientUnits="userSpaceOnUse"
-         x1="-34.205299"
-         y1="249.94051"
-         x2="-33.205299"
-         y2="249.94051"
-         gradientTransform="matrix(0,-5.065,-5.065,0,617.1209,105.3813)">
-        <stop
-           offset="0"
-           style="stop-color:#E6E8E7"
-           id="stop103583" />
-        <stop
-           offset="1"
-           style="stop-color:#FFFFFF"
-           id="stop103585" />
-      </linearGradient>
-      <rect
-         style="fill:url(#SVGID_4871_)"
-         x="-656.71503"
-         y="273.56699"
-         clip-path="url(#SVGID_4870_)"
-         width="15.759"
-         height="5.0650001"
-         id="rect84778" />
-    </g>
-    <polygon
-       style="fill:none;stroke:#e6e8e8;stroke-width:0.214;stroke-miterlimit:10"
-       transform="matrix(2.25,0,0,2.25,1605.7731,-25.560183)"
-       stroke-miterlimit="10"
-       points="-656.715,276.108 -654.922,278.632 -640.956,278.632 -640.956,273.567 -654.922,273.567 "
-       id="polygon84780"
-       inkscape:transform-center-x="563.52648"
-       inkscape:transform-center-y="-60.127066" />
-    <text
-       y="597.62451"
-       x="137.9046"
-       id="text84782"
-       inkscape:transform-center-x="562.26258"
-       inkscape:transform-center-y="-60.270044"
-       style="font-size:27px">
-      <tspan
-         style="font-size:5.77170038px;fill:#5e6a71;font-family:ApexSans-Book"
-         x="137.9046"
-         y="597.62451"
-         font-size="2.5652"
-         id="tspan84784">N</tspan>
-      <tspan
-         style="font-size:5.77170038px;fill:#5e6a71;font-family:ApexSans-Book"
-         x="141.7836"
-         y="597.62451"
-         font-size="2.5652"
-         id="tspan84786">A</tspan>
-      <tspan
-         style="font-size:5.77170038px;fill:#5e6a71;font-family:ApexSans-Book"
-         x="144.85263"
-         y="597.62451"
-         font-size="2.5652"
-         id="tspan84788">TIV</tspan>
-      <tspan
-         style="font-size:5.77170038px;fill:#5e6a71;font-family:ApexSans-Book"
-         x="152.56561"
-         y="597.62451"
-         font-size="2.5652"
-         id="tspan84790">E</tspan>
-    </text>
-    <text
-       xml:space="preserve"
-       style="font-size:8px;font-style:normal;font-weight:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans"
-       x="285.86542"
-       y="577.40869"
-       id="text113406"
-       sodipodi:linespacing="125%"><tspan
-         sodipodi:role="line"
-         id="tspan113408"
-         x="285.86542"
-         y="577.40869" /></text>
-    <text
-       y="832.10559"
-       x="242.41013"
-       id="text84343-2"
-       inkscape:transform-center-x="587.62742"
-       inkscape:transform-center-y="-134.7035"
-       style="font-size:27px;text-align:center;text-anchor:middle">
-      <tspan
-         style="font-size:11px;text-align:center;text-anchor:middle;fill:#37424b;font-family:ApexSans-Book"
-         x="197.43796"
-         y="832.10559"
-         font-size="5.1244"
-         id="tspan84345-2">MASTER REGION</tspan>
-    </text>
-    <text
-       y="926.36633"
-       x="288.45654"
-       id="text84343-2-6"
-       inkscape:transform-center-x="587.62742"
-       inkscape:transform-center-y="-134.7035"
-       style="font-size:27px;text-align:center;text-anchor:middle">
-      <tspan
-         style="font-size:11px;text-align:center;text-anchor:middle;fill:#37424b;font-family:ApexSans-Book"
-         x="249.24219"
-         y="926.36633"
-         font-size="5.1244"
-         id="tspan84345-2-5" />
-    </text>
-    <flowRoot
-       xml:space="preserve"
-       id="flowRoot126352"
-       style="fill:black;stroke:none;stroke-opacity:1;stroke-width:1px;stroke-linejoin:miter;stroke-linecap:butt;fill-opacity:1;font-family:Sans;font-style:normal;font-weight:normal;font-size:9px;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:middle;text-align:center"><flowRegion
-         id="flowRegion126354"><rect
-           id="rect126356"
-           width="0"
-           height="51"
-           x="247"
-           y="928.36218" /></flowRegion><flowPara
-         id="flowPara126358" /></flowRoot>    <flowRoot
-       xml:space="preserve"
-       id="flowRoot126403"
-       style="fill:black;stroke:none;stroke-opacity:1;stroke-width:1px;stroke-linejoin:miter;stroke-linecap:butt;fill-opacity:1;font-family:Sans;font-style:normal;font-weight:normal;font-size:9px;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:middle;text-align:center"><flowRegion
-         id="flowRegion126405"><rect
-           id="rect126407"
-           width="185"
-           height="81"
-           x="286"
-           y="941.36218" /></flowRegion><flowPara
-         id="flowPara126409" /></flowRoot>    <flowRoot
-       xml:space="preserve"
-       id="flowRoot126411"
-       style="fill:black;stroke:none;stroke-opacity:1;stroke-width:1px;stroke-linejoin:miter;stroke-linecap:butt;fill-opacity:1;font-family:Sans;font-style:normal;font-weight:normal;font-size:9px;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:middle;text-align:center"><flowRegion
-         id="flowRegion126413"><rect
-           id="rect126415"
-           width="89"
-           height="64"
-           x="285"
-           y="943.36218" /></flowRegion><flowPara
-         id="flowPara126417" /></flowRoot>    <text
-       xml:space="preserve"
-       style="font-size:9px;font-style:normal;font-weight:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans"
-       x="272"
-       y="529.64587"
-       id="text126456"
-       sodipodi:linespacing="125%"><tspan
-         sodipodi:role="line"
-         id="tspan126458"
-         x="272"
-         y="529.64587">MASTER</tspan><tspan
-         sodipodi:role="line"
-         x="272"
-         y="540.89587"
-         id="tspan126460">ZONE</tspan></text>
-    <polygon
-       id="polygon84546-9-3"
-       points="-667.777,292.47 -671.896,292.47 -669.845,294.263 "
-       clip-path="url(#SVGID_4843_-9-6)"
-       style="fill:#f15d57"
-       transform="matrix(2.25,0,0,2.25,1658.932,-169.71257)" />
-    <text
-       xml:space="preserve"
-       style="font-size:9px;font-style:normal;font-weight:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans"
-       x="122.23143"
-       y="529.64587"
-       id="text126655-6"
-       sodipodi:linespacing="125%"><tspan
-         sodipodi:role="line"
-         id="tspan126657-2"
-         x="122.23143"
-         y="529.64587">SECONDARY</tspan><tspan
-         sodipodi:role="line"
-         x="122.23143"
-         y="540.89587"
-         id="tspan126659-4">ZONE</tspan></text>
-    <g
-       transform="matrix(3.375,0,0,3.375,2054.0831,-334.61629)"
-       id="g82107">
-      <defs
-         id="defs82109">
-        <polygon
-           id="SVGID_4519_"
-           points="-504.975,196.685 -504.975,188.287 -547.302,188.287 -547.302,196.684 -528.257,196.685 -526.139,198.478 -524.02,196.685 " />
-      </defs>
-      <clipPath
-         id="clipPath126820">
-        <use
-           height="1052.3622"
-           width="744.09448"
-           y="0"
-           x="0"
-           style="overflow:visible"
-           xlink:href="#SVGID_4519_"
-           overflow="visible"
-           id="use126822" />
-      </clipPath>
-      <linearGradient
-         id="linearGradient126824"
-         gradientUnits="userSpaceOnUse"
-         x1="40.840599"
-         y1="146.6937"
-         x2="41.840599"
-         y2="146.6937"
-         gradientTransform="matrix(0,-10.1906,-10.1906,0,968.7597,614.6687)">
-        <stop
-           offset="0"
-           style="stop-color:#37424B"
-           id="stop126826" />
-        <stop
-           offset="0.12"
-           style="stop-color:#37424B"
-           id="stop126828" />
-        <stop
-           offset="0.88"
-           style="stop-color:#5E6A71"
-           id="stop126830" />
-        <stop
-           offset="1"
-           style="stop-color:#5E6A71"
-           id="stop126832" />
-      </linearGradient>
-      <rect
-         style="fill:url(#linearGradient126904)"
-         x="-547.302"
-         y="188.287"
-         clip-path="url(#SVGID_4520_-5)"
-         width="42.327"
-         height="10.191"
-         id="rect82124" />
-    </g>
-    <g
-       transform="matrix(3.375,0,0,3.375,2054.0831,-334.61629)"
-       id="g82126">
-      <defs
-         id="defs82128">
-        <rect
-           id="SVGID_4522_"
-           x="-682.31403"
-           y="181.315"
-           width="200.271"
-           height="205.44099" />
-      </defs>
-      <clipPath
-         id="clipPath126838">
-        <use
-           height="1052.3622"
-           width="744.09448"
-           y="0"
-           x="0"
-           style="overflow:visible"
-           xlink:href="#SVGID_4522_"
-           overflow="visible"
-           id="use126840" />
-      </clipPath>
-      <path
-         style="fill:#ffffff"
-         inkscape:connector-curvature="0"
-         clip-path="url(#SVGID_4523_-1)"
-         d="m -539.397,191.908 c -0.353,0 -0.64,-0.286 -0.64,-0.639 0,-0.354 0.287,-0.642 0.64,-0.641 0.354,0 0.639,0.287 0.639,0.641 0,0.353 -0.285,0.639 -0.639,0.639"
-         id="path82134" />
-      <path
-         style="fill:#ffffff"
-         inkscape:connector-curvature="0"
-         clip-path="url(#SVGID_4523_-1)"
-         d="m -539.397,194.263 c -0.353,0 -0.64,-0.286 -0.64,-0.639 0,-0.355 0.287,-0.642 0.64,-0.642 0.354,0 0.639,0.287 0.639,0.642 0,0.353 -0.285,0.639 -0.639,0.639"
-         id="path82136" />
-      <circle
-         style="fill:none;stroke:#ffffff;stroke-width:0.32100001;stroke-miterlimit:10"
-         sodipodi:ry="0.63999999"
-         sodipodi:rx="0.63999999"
-         sodipodi:cy="191.26801"
-         sodipodi:cx="-541.625"
-         d="m -540.985,191.26801 c 0,0.35346 -0.28654,0.64 -0.64,0.64 -0.35346,0 -0.64,-0.28654 -0.64,-0.64 0,-0.35347 0.28654,-0.64 0.64,-0.64 0.35346,0 0.64,0.28653 0.64,0.64 z"
-         clip-path="url(#SVGID_4523_-1)"
-         stroke-miterlimit="10"
-         cx="-541.625"
-         cy="191.26801"
-         r="0.63999999"
-         id="circle82138" />
-      <circle
-         style="fill:none;stroke:#ffffff;stroke-width:0.32100001;stroke-miterlimit:10"
-         sodipodi:ry="0.63999999"
-         sodipodi:rx="0.63999999"
-         sodipodi:cy="193.623"
-         sodipodi:cx="-541.625"
-         d="m -540.985,193.623 c 0,0.35346 -0.28654,0.64 -0.64,0.64 -0.35346,0 -0.64,-0.28654 -0.64,-0.64 0,-0.35346 0.28654,-0.64 0.64,-0.64 0.35346,0 0.64,0.28654 0.64,0.64 z"
-         clip-path="url(#SVGID_4523_-1)"
-         stroke-miterlimit="10"
-         cx="-541.625"
-         cy="193.623"
-         r="0.63999999"
-         id="circle82140" />
-      <circle
-         style="fill:none;stroke:#ffffff;stroke-width:0.32100001;stroke-miterlimit:10"
-         sodipodi:ry="0.63999999"
-         sodipodi:rx="0.63999999"
-         sodipodi:cy="191.26801"
-         sodipodi:cx="-543.85303"
-         d="m -543.21303,191.26801 c 0,0.35346 -0.28654,0.64 -0.64,0.64 -0.35346,0 -0.64,-0.28654 -0.64,-0.64 0,-0.35347 0.28654,-0.64 0.64,-0.64 0.35346,0 0.64,0.28653 0.64,0.64 z"
-         clip-path="url(#SVGID_4523_-1)"
-         stroke-miterlimit="10"
-         cx="-543.85303"
-         cy="191.26801"
-         r="0.63999999"
-         id="circle82142" />
-      <circle
-         style="fill:none;stroke:#ffffff;stroke-width:0.32100001;stroke-miterlimit:10"
-         sodipodi:ry="0.63999999"
-         sodipodi:rx="0.63999999"
-         sodipodi:cy="193.623"
-         sodipodi:cx="-543.854"
-         d="m -543.214,193.623 c 0,0.35346 -0.28654,0.64 -0.64,0.64 -0.35347,0 -0.64,-0.28654 -0.64,-0.64 0,-0.35346 0.28653,-0.64 0.64,-0.64 0.35346,0 0.64,0.28654 0.64,0.64 z"
-         clip-path="url(#SVGID_4523_-1)"
-         stroke-miterlimit="10"
-         cx="-543.854"
-         cy="193.623"
-         r="0.63999999"
-         id="circle82144" />
-      <path
-         style="fill:#ffffff"
-         inkscape:connector-curvature="0"
-         clip-path="url(#SVGID_4523_-1)"
-         d="m -537.169,191.908 c -0.354,0 -0.64,-0.286 -0.64,-0.639 0,-0.354 0.286,-0.642 0.64,-0.641 0.354,0 0.64,0.287 0.64,0.641 0,0.353 -0.286,0.639 -0.64,0.639"
-         id="path82146" />
-      <path
-         style="fill:#ffffff"
-         inkscape:connector-curvature="0"
-         clip-path="url(#SVGID_4523_-1)"
-         d="m -537.169,194.263 c -0.354,0 -0.64,-0.286 -0.64,-0.639 0,-0.355 0.286,-0.642 0.64,-0.642 0.354,0 0.64,0.287 0.64,0.642 0,0.353 -0.286,0.639 -0.64,0.639"
-         id="path82148" />
-    </g>
-    <text
-       y="319.3797"
-       x="267.68884"
-       id="text82150"
-       style="font-size:40.5px">
-      <tspan
-         style="font-size:10.80911255px;fill:#ffffff;font-family:ApexSans-Medium"
-         x="267.68884"
-         y="319.3797"
-         font-size="3.2027"
-         id="tspan82152">AP</tspan>
-      <tspan
-         style="font-size:10.80911255px;fill:#ffffff;font-family:ApexSans-Medium"
-         x="281.37094"
-         y="319.3797"
-         font-size="3.2027"
-         id="tspan82154">P</tspan>
-    </text>
-    <g
-       transform="matrix(3.375,0,0,3.375,2054.0831,-334.61629)"
-       id="g84638">
-      <defs
-         id="defs84640">
-        <rect
-           id="SVGID_4852_"
-           x="-682.31403"
-           y="181.315"
-           width="200.271"
-           height="205.44099" />
-      </defs>
-      <clipPath
-         id="clipPath126879">
-        <use
-           height="1052.3622"
-           width="744.09448"
-           y="0"
-           x="0"
-           style="overflow:visible"
-           xlink:href="#SVGID_4852_"
-           overflow="visible"
-           id="use126881" />
-      </clipPath>
-      <path
-         style="fill:#5e6a71"
-         inkscape:connector-curvature="0"
-         clip-path="url(#SVGID_4853_-8)"
-         d="m -526.673,205.991 c 0,-0.349 0.282,-0.632 0.632,-0.632 0.349,0 0.632,0.283 0.632,0.632 0,0.35 -0.283,0.633 -0.632,0.633 -0.35,0 -0.632,-0.283 -0.632,-0.633"
-         id="path84646" />
-      <line
-         style="fill:none;stroke:#5e6a71;stroke-width:0.214;stroke-miterlimit:10"
-         clip-path="url(#SVGID_4853_-8)"
-         stroke-miterlimit="10"
-         x1="-526.03998"
-         y1="205.991"
-         x2="-523.14398"
-         y2="205.991"
-         id="line84648" />
-    </g>
-    <g
-       transform="matrix(3.375,0,0,3.375,2054.0831,-334.61629)"
-       id="g84650">
-      <defs
-         id="defs84652">
-        <polygon
-           id="SVGID_4854_"
-           points="-507.673,203.458 -521.64,203.458 -523.432,206 -521.64,208.524 -507.673,208.524 " />
-      </defs>
-      <clipPath
-         id="clipPath126888">
-        <use
-           height="1052.3622"
-           width="744.09448"
-           y="0"
-           x="0"
-           style="overflow:visible"
-           xlink:href="#SVGID_4854_"
-           overflow="visible"
-           id="use126890" />
-      </clipPath>
-      <linearGradient
-         id="linearGradient126892"
-         gradientUnits="userSpaceOnUse"
-         x1="-34.205299"
-         y1="249.94031"
-         x2="-33.205101"
-         y2="249.94031"
-         gradientTransform="matrix(0,-5.065,-5.065,0,750.4031,35.2731)">
-        <stop
-           offset="0"
-           style="stop-color:#E6E8E7"
-           id="stop126894" />
-        <stop
-           offset="1"
-           style="stop-color:#FFFFFF"
-           id="stop126896" />
-      </linearGradient>
-      <rect
-         style="fill:url(#SVGID_4856_-4)"
-         x="-523.43201"
-         y="203.45799"
-         clip-path="url(#SVGID_4855_-2)"
-         width="15.759"
-         height="5.066"
-         id="rect84663" />
-    </g>
-    <polygon
-       style="fill:none;stroke:#e6e8e8;stroke-width:0.214;stroke-miterlimit:10"
-       transform="matrix(3.375,0,0,3.375,2054.0831,-334.61629)"
-       stroke-miterlimit="10"
-       points="-507.674,203.459 -521.64,203.459 -523.433,206 -521.64,208.524 -507.674,208.524 "
-       id="polygon84665" />
-    <text
-       y="363.54565"
-       x="306.66861"
-       id="text84667"
-       style="font-size:40.5px">
-      <tspan
-         style="font-size:8.65755081px;fill:#5e6a71;font-family:ApexSans-Book"
-         x="306.66861"
-         y="363.54565"
-         font-size="2.5652"
-         id="tspan84669">RE</tspan>
-      <tspan
-         style="font-size:8.65755081px;fill:#5e6a71;font-family:ApexSans-Book"
-         x="315.84521"
-         y="363.54565"
-         font-size="2.5652"
-         id="tspan84671">S</tspan>
-      <tspan
-         style="font-size:8.65755081px;fill:#5e6a71;font-family:ApexSans-Book"
-         x="319.98297"
-         y="363.54565"
-         font-size="2.5652"
-         id="tspan84673">T</tspan>
-    </text>
-    <text
-       xml:space="preserve"
-       style="font-size:9px;font-style:normal;font-weight:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans"
-       x="197.07527"
-       y="438.16864"
-       id="text127418"
-       sodipodi:linespacing="125%"><tspan
-         sodipodi:role="line"
-         id="tspan127420"
-         x="197.07527"
-         y="438.16864">DATA</tspan><tspan
-         sodipodi:role="line"
-         x="197.07527"
-         y="449.41864"
-         id="tspan127422">SYNC</tspan></text>
-    <text
-       xml:space="preserve"
-       style="font-size:9px;font-style:normal;font-weight:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans"
-       x="232.25806"
-       y="178.16862"
-       id="text127482"
-       sodipodi:linespacing="125%"><tspan
-         sodipodi:role="line"
-         id="tspan127484"
-         x="232.25806"
-         y="178.16862" /></text>
-    <text
-       y="247.60512"
-       x="242.41013"
-       id="text84343-2-0"
-       inkscape:transform-center-x="587.62742"
-       inkscape:transform-center-y="-134.7035"
-       style="font-size:27px;text-align:center;text-anchor:middle">
-      <tspan
-         style="font-size:11px;text-align:center;text-anchor:middle;fill:#37424b;font-family:ApexSans-Book"
-         x="197.43796"
-         y="247.60512"
-         font-size="5.1244"
-         id="tspan84345-2-6">MASTER REGION</tspan>
-    </text>
-    <g
-       id="g17978">
+    </clipPath>
+    <clipPath
+       clipPathUnits="userSpaceOnUse"
+       id="clipPath28746">
       <g
       <g
-         inkscape:transform-center-y="50.765304"
-         inkscape:transform-center-x="262.3321"
-         id="g82158"
-         transform="matrix(1.3542118,0,0,2.25,996.72494,-25.560183)">
-        <defs
-           id="defs82160">
-          <rect
-             height="205.44099"
-             width="200.271"
-             y="181.315"
-             x="-682.31403"
-             id="SVGID_4524_" />
-        </defs>
-        <clipPath
-           id="clipPath101582">
-          <use
-             id="use101584"
-             overflow="visible"
-             xlink:href="#SVGID_4524_"
-             style="overflow:visible"
-             x="0"
-             y="0"
-             width="744.09448"
-             height="1052.3622" />
-        </clipPath>
+         id="g28754"
+         transform="matrix(0.44444444,0,0,0.44444444,-774.10444,27.578499)">
         <g
         <g
-           id="g82166"
-           clip-path="url(#SVGID_4525_)">
+           id="g28752">
           <g
           <g
-             id="g82168">
-            <defs
-               id="defs82170">
-              <rect
-                 height="64.251999"
-                 width="175.168"
-                 y="293.259"
-                 x="-679.67902"
-                 id="SVGID_4526_" />
-            </defs>
-            <clipPath
-               id="clipPath101590">
-              <use
-                 id="use101592"
-                 overflow="visible"
-                 xlink:href="#SVGID_4526_"
-                 style="overflow:visible"
-                 x="0"
-                 y="0"
-                 width="744.09448"
-                 height="1052.3622" />
-            </clipPath>
-            <g
-               id="g82176"
-               clip-path="url(#SVGID_4527_)">
-              <defs
-                 id="defs82178">
-                <rect
-                   height="64.037003"
-                   width="174.953"
-                   y="293.367"
-                   x="-679.57202"
-                   id="SVGID_4528_" />
-              </defs>
-              <clipPath
-                 id="clipPath101597">
-                <use
-                   id="use101599"
-                   overflow="visible"
-                   xlink:href="#SVGID_4528_"
-                   style="overflow:visible"
-                   x="0"
-                   y="0"
-                   width="744.09448"
-                   height="1052.3622" />
-              </clipPath>
-              <linearGradient
-                 gradientTransform="matrix(0,64.0388,-64.0388,0,3308.0217,-7826.8223)"
-                 y2="60.902401"
-                 x2="127.8011"
-                 y1="60.902401"
-                 x1="126.8011"
-                 gradientUnits="userSpaceOnUse"
-                 id="linearGradient101601">
-                <stop
-                   id="stop101603"
-                   style="stop-color:#E6E8E7"
-                   offset="0" />
-                <stop
-                   id="stop101605"
-                   style="stop-color:#FFFFFF"
-                   offset="1" />
-              </linearGradient>
-              <rect
-                 id="rect82189"
-                 height="64.038002"
-                 width="174.953"
-                 clip-path="url(#SVGID_4529_)"
-                 y="293.366"
-                 x="-679.57202"
-                 style="fill:url(#SVGID_4530_)" />
-            </g>
-            <g
-               id="g82191"
-               clip-path="url(#SVGID_4527_)">
-              <defs
-                 id="defs82193">
-                <rect
-                   height="64.251999"
-                   width="175.168"
-                   y="293.259"
-                   x="-679.67902"
-                   id="SVGID_4531_" />
-              </defs>
-              <clipPath
-                 id="clipPath101611">
-                <use
-                   id="use101613"
-                   overflow="visible"
-                   xlink:href="#SVGID_4531_"
-                   style="overflow:visible"
-                   x="0"
-                   y="0"
-                   width="744.09448"
-                   height="1052.3622" />
-              </clipPath>
-              <rect
-                 id="rect82199"
-                 height="64.038002"
-                 width="174.953"
-                 stroke-miterlimit="10"
-                 clip-path="url(#SVGID_4532_)"
-                 y="293.366"
-                 x="-679.57202"
-                 style="fill:none;stroke:#f15d57;stroke-width:0.214;stroke-miterlimit:10" />
-            </g>
+             id="g28750">
+            <rect
+               style="opacity:0.61;fill:#000000;stroke-width:1.00094"
+               id="rect28748"
+               width="439.00146"
+               height="696.97461"
+               x="122.01721"
+               y="152.74527" />
           </g>
         </g>
           </g>
         </g>
+      </g>
+    </clipPath>
+    <clipPath
+       clipPathUnits="userSpaceOnUse"
+       id="clipPath28766">
+      <g
+         id="g28774"
+         transform="matrix(0.44444444,0,0,0.44444444,-774.10444,27.578499)">
         <g
         <g
-           id="g82201"
-           clip-path="url(#SVGID_4525_)">
+           id="g28772">
           <g
           <g
-             id="g82203">
-            <defs
-               id="defs82205">
-              <rect
-                 height="64.251999"
-                 width="45.873001"
-                 y="293.259"
-                 x="-441.56699"
-                 id="SVGID_4533_" />
-            </defs>
-            <clipPath
-               id="clipPath101620">
-              <use
-                 id="use101622"
-                 overflow="visible"
-                 xlink:href="#SVGID_4533_"
-                 style="overflow:visible"
-                 x="0"
-                 y="0"
-                 width="744.09448"
-                 height="1052.3622" />
-            </clipPath>
-            <g
-               id="g82211"
-               clip-path="url(#SVGID_4534_)">
-              <defs
-                 id="defs82213">
-                <rect
-                   height="64.037003"
-                   width="45.659"
-                   y="293.367"
-                   x="-441.45999"
-                   id="SVGID_4535_" />
-              </defs>
-              <clipPath
-                 id="clipPath101627">
-                <use
-                   id="use101629"
-                   overflow="visible"
-                   xlink:href="#SVGID_4535_"
-                   style="overflow:visible"
-                   x="0"
-                   y="0"
-                   width="744.09448"
-                   height="1052.3622" />
-              </clipPath>
-              <linearGradient
-                 gradientTransform="matrix(0,64.0388,-64.0388,0,3481.4861,-7826.8223)"
-                 y2="60.902401"
-                 x2="127.8011"
-                 y1="60.902401"
-                 x1="126.8011"
-                 gradientUnits="userSpaceOnUse"
-                 id="linearGradient101631">
-                <stop
-                   id="stop101633"
-                   style="stop-color:#E6E8E7"
-                   offset="0" />
-                <stop
-                   id="stop101635"
-                   style="stop-color:#FFFFFF"
-                   offset="1" />
-              </linearGradient>
-              <rect
-                 id="rect82224"
-                 height="64.038002"
-                 width="45.659"
-                 clip-path="url(#SVGID_4536_)"
-                 y="293.366"
-                 x="-441.45999"
-                 style="fill:url(#SVGID_4537_)" />
-            </g>
-            <g
-               id="g82226"
-               clip-path="url(#SVGID_4534_)">
-              <defs
-                 id="defs82228">
-                <rect
-                   height="64.251999"
-                   width="45.873001"
-                   y="293.259"
-                   x="-441.56699"
-                   id="SVGID_4538_" />
-              </defs>
-              <clipPath
-                 id="clipPath101641">
-                <use
-                   id="use101643"
-                   overflow="visible"
-                   xlink:href="#SVGID_4538_"
-                   style="overflow:visible"
-                   x="0"
-                   y="0"
-                   width="744.09448"
-                   height="1052.3622" />
-              </clipPath>
-              <rect
-                 id="rect82234"
-                 height="64.038002"
-                 width="45.659"
-                 stroke-miterlimit="10"
-                 clip-path="url(#SVGID_4539_)"
-                 y="293.366"
-                 x="-441.45999"
-                 style="fill:none;stroke:#f15d57;stroke-width:0.214;stroke-miterlimit:10" />
-            </g>
+             id="g28770">
+            <rect
+               style="opacity:0.61;fill:#000000;stroke-width:1.00094"
+               id="rect28768"
+               width="439.00146"
+               height="696.97461"
+               x="122.01721"
+               y="152.74527" />
           </g>
         </g>
       </g>
           </g>
         </g>
       </g>
+    </clipPath>
+    <clipPath
+       clipPathUnits="userSpaceOnUse"
+       id="clipPath28776">
       <g
       <g
-         inkscape:transform-center-y="45.666809"
-         inkscape:transform-center-x="449.81598"
-         id="g82339"
-         transform="matrix(2.25,0,0,2.25,1605.7731,-25.560183)">
-        <defs
-           id="defs82341">
-          <rect
-             height="205.44099"
-             width="200.271"
-             y="181.315"
-             x="-682.31403"
-             id="SVGID_4549_" />
-        </defs>
-        <clipPath
-           id="clipPath101738">
-          <use
-             id="use101740"
-             overflow="visible"
-             xlink:href="#SVGID_4549_"
-             style="overflow:visible"
-             x="0"
-             y="0"
-             width="744.09448"
-             height="1052.3622" />
-        </clipPath>
-        <path
-           id="path82347"
-           d="m -602.031,326.467 c 0,0.212 0.172,0.385 0.385,0.385 h 6.697 c 0.212,0 0.385,-0.173 0.385,-0.385 v -6.696 c 0,-0.213 -0.173,-0.385 -0.385,-0.385 h -6.697 c -0.213,0 -0.385,0.172 -0.385,0.385 v 6.696 z"
-           clip-path="url(#SVGID_4550_)"
-           inkscape:connector-curvature="0"
-           style="fill:#f15d57" />
-        <path
-           id="path82349"
-           d="m -602.031,326.467 c 0,0.212 0.172,0.385 0.385,0.385 h 6.697 c 0.212,0 0.385,-0.173 0.385,-0.385 v -6.696 c 0,-0.213 -0.173,-0.385 -0.385,-0.385 h -6.697 c -0.213,0 -0.385,0.172 -0.385,0.385 v 6.696 z"
-           stroke-miterlimit="10"
-           clip-path="url(#SVGID_4550_)"
-           inkscape:connector-curvature="0"
-           style="fill:none;stroke:#ffffff;stroke-width:0.32100001;stroke-miterlimit:10" />
+         id="g28784"
+         transform="matrix(0.44444444,0,0,0.44444444,-774.10444,27.578499)">
+        <g
+           id="g28782">
+          <g
+             id="g28780">
+            <rect
+               style="opacity:0.61;fill:#000000;stroke-width:1.00094"
+               id="rect28778"
+               width="439.00146"
+               height="696.97461"
+               x="122.01721"
+               y="152.74527" />
+          </g>
+        </g>
       </g>
       </g>
-      <text
-         inkscape:transform-center-y="45.543285"
-         inkscape:transform-center-x="450.06672"
-         id="text82351"
-         font-size="4.3343"
-         style="font-size:9.75217533px;fill:#ffffff;font-family:ApexSans-Medium"
-         x="275.14355"
-         y="704.88873">M</text>
+    </clipPath>
+    <clipPath
+       clipPathUnits="userSpaceOnUse"
+       id="clipPath28786">
       <g
       <g
-         inkscape:transform-center-y="71.647559"
-         inkscape:transform-center-x="503.22873"
-         id="g82353"
-         transform="matrix(2.25,0,0,2.25,1605.7731,-25.560183)">
-        <defs
-           id="defs82355">
-          <rect
-             height="205.44099"
-             width="200.271"
-             y="181.315"
-             x="-682.31403"
-             id="SVGID_4551_" />
-        </defs>
-        <clipPath
-           id="clipPath101748">
-          <use
-             id="use101750"
-             overflow="visible"
-             xlink:href="#SVGID_4551_"
-             style="overflow:visible"
-             x="0"
-             y="0"
-             width="744.09448"
-             height="1052.3622" />
-        </clipPath>
-        <path
-           id="path82361"
-           d="m -625.77,338.014 c 0,0.213 0.172,0.385 0.385,0.385 h 6.697 c 0.212,0 0.385,-0.172 0.385,-0.385 v -6.696 c 0,-0.213 -0.173,-0.385 -0.385,-0.385 h -6.697 c -0.213,0 -0.385,0.172 -0.385,0.385 v 6.696 z"
-           clip-path="url(#SVGID_4552_)"
-           inkscape:connector-curvature="0"
-           style="fill:#f15d57" />
-        <path
-           id="path82363"
-           d="m -625.77,338.014 c 0,0.213 0.172,0.385 0.385,0.385 h 6.697 c 0.212,0 0.385,-0.172 0.385,-0.385 v -6.696 c 0,-0.213 -0.173,-0.385 -0.385,-0.385 h -6.697 c -0.213,0 -0.385,0.172 -0.385,0.385 v 6.696 z"
-           stroke-miterlimit="10"
-           clip-path="url(#SVGID_4552_)"
-           inkscape:connector-curvature="0"
-           style="fill:none;stroke:#ffffff;stroke-width:0.32100001;stroke-miterlimit:10" />
+         id="g28794"
+         transform="matrix(0.44444444,0,0,0.44444444,-774.10444,27.578499)">
+        <g
+           id="g28792">
+          <g
+             id="g28790">
+            <rect
+               style="opacity:0.61;fill:#000000;stroke-width:1.00094"
+               id="rect28788"
+               width="439.00146"
+               height="696.97461"
+               x="122.01721"
+               y="152.74527" />
+          </g>
+        </g>
       </g>
       </g>
-      <text
-         inkscape:transform-center-y="71.524915"
-         inkscape:transform-center-x="503.47899"
-         id="text82365"
-         font-size="4.3343"
-         style="font-size:9.75217533px;fill:#ffffff;font-family:ApexSans-Medium"
-         x="201.73129"
-         y="730.87036">M</text>
-      <rect
-         inkscape:transform-center-y="19.597191"
-         inkscape:transform-center-x="610.96881"
-         id="rect82381"
-         height="21.584251"
-         width="21.581999"
-         y="664.59583"
-         x="87.659889"
-         style="fill:#ffffff" />
-      <rect
-         inkscape:transform-center-y="19.597191"
-         inkscape:transform-center-x="610.96881"
-         id="rect82383"
-         height="21.584251"
-         width="21.581999"
-         stroke-miterlimit="10"
-         y="664.59583"
-         x="87.659889"
-         style="fill:none;stroke:#81d0db;stroke-width:0.96300006;stroke-miterlimit:10" />
-      <rect
-         inkscape:transform-center-y="19.598295"
-         inkscape:transform-center-x="610.97115"
-         id="rect82385"
-         height="18.553501"
-         width="18.557999"
-         y="666.1123"
-         x="89.169548"
-         style="fill:#81d0db" />
-      <rect
-         inkscape:transform-center-y="19.597131"
-         inkscape:transform-center-x="610.96883"
-         id="rect82387"
-         height="15.594751"
-         width="15.592501"
-         y="667.59052"
-         x="90.654625"
-         style="fill:#ffffff" />
-      <rect
-         inkscape:transform-center-y="19.595982"
-         inkscape:transform-center-x="610.97103"
-         id="rect82389"
-         height="10.278"
-         width="10.282501"
-         y="670.24774"
-         x="93.307411"
-         style="fill:#ffffff" />
+    </clipPath>
+    <clipPath
+       clipPathUnits="userSpaceOnUse"
+       id="clipPath28796">
       <g
       <g
-         inkscape:transform-center-y="19.598312"
-         inkscape:transform-center-x="610.97111"
-         id="g82391"
-         transform="matrix(2.25,0,0,2.25,1605.7731,-25.560183)">
-        <defs
-           id="defs82393">
-          <path
-             d="m -672.614,311.531 c 0,1.487 1.206,2.694 2.692,2.694 1.488,0 2.692,-1.207 2.692,-2.694 0,-1.485 -1.204,-2.69 -2.692,-2.69 -1.486,0 -2.692,1.205 -2.692,2.69"
-             id="SVGID_4555_"
-             inkscape:connector-curvature="0" />
-        </defs>
-        <clipPath
-           id="clipPath101773">
-          <use
-             id="use101775"
-             overflow="visible"
-             xlink:href="#SVGID_4555_"
-             style="overflow:visible"
-             x="0"
-             y="0"
-             width="744.09448"
-             height="1052.3622" />
-        </clipPath>
-        <linearGradient
-           gradientTransform="matrix(0,5.3836,5.3836,0,129.3288,-1066.0031)"
-           y2="-148.46021"
-           x2="256.3761"
-           y1="-148.46021"
-           x1="255.3761"
-           gradientUnits="userSpaceOnUse"
-           id="linearGradient101777">
-          <stop
-             id="stop101779"
-             style="stop-color:#55AEB9"
-             offset="0" />
-          <stop
-             id="stop101781"
-             style="stop-color:#81D1DB"
-             offset="1" />
-        </linearGradient>
-        <rect
-           id="rect82404"
-           height="5.3839998"
-           width="5.3839998"
-           clip-path="url(#SVGID_4556_)"
-           y="308.841"
-           x="-672.61401"
-           style="fill:url(#SVGID_4557_)" />
+         id="g28804">
+        <g
+           id="g28802">
+          <g
+             id="g28800">
+            <rect
+               style="opacity:0.61;fill:#000000;stroke-width:1.00094"
+               id="rect28798"
+               width="439.00146"
+               height="696.97461"
+               x="122.01721"
+               y="152.74527" />
+          </g>
+        </g>
       </g>
       </g>
-      <rect
-         transform="matrix(2.25,0,0,2.25,1605.7731,-25.560183)"
-         style="fill:#ffffff"
-         x="-650.77399"
-         y="306.73599"
-         clip-path="url(#SVGID_4564_)"
-         width="9.592"
-         height="9.5930004"
-         id="rect82451" />
-      <rect
-         transform="matrix(2.25,0,0,2.25,1605.7731,-25.560183)"
-         style="fill:none;stroke:#81d0db;stroke-width:0.428;stroke-miterlimit:10"
-         x="-650.77399"
-         y="306.73599"
-         clip-path="url(#SVGID_4564_)"
-         stroke-miterlimit="10"
-         width="9.592"
-         height="9.5930004"
-         id="rect82453" />
-      <rect
-         transform="matrix(2.25,0,0,2.25,1605.7731,-25.560183)"
-         style="fill:#81d0db"
-         x="-650.10303"
-         y="307.41"
-         clip-path="url(#SVGID_4564_)"
-         width="8.2480001"
-         height="8.2460003"
-         id="rect82455" />
-      <rect
-         transform="matrix(2.25,0,0,2.25,1605.7731,-25.560183)"
-         style="fill:#ffffff"
-         x="-649.44299"
-         y="308.06699"
-         clip-path="url(#SVGID_4564_)"
-         width="6.9299998"
-         height="6.9310002"
-         id="rect82457" />
-      <rect
-         transform="matrix(2.25,0,0,2.25,1605.7731,-25.560183)"
-         style="fill:#ffffff"
-         x="-648.26398"
-         y="309.24799"
-         clip-path="url(#SVGID_4564_)"
-         width="4.5700002"
-         height="4.5679998"
-         id="rect82459" />
+    </clipPath>
+    <clipPath
+       clipPathUnits="userSpaceOnUse"
+       id="clipPath28806">
       <g
       <g
-         inkscape:transform-center-y="19.598312"
-         inkscape:transform-center-x="557.09937"
-         id="g82461"
-         transform="matrix(2.25,0,0,2.25,1605.7731,-25.560183)">
-        <defs
-           id="defs82463">
-          <path
-             d="m -648.671,311.531 c 0,1.487 1.206,2.694 2.692,2.694 1.488,0 2.692,-1.207 2.692,-2.694 0,-1.485 -1.204,-2.69 -2.692,-2.69 -1.486,0 -2.692,1.205 -2.692,2.69"
-             id="SVGID_4565_"
-             inkscape:connector-curvature="0" />
-        </defs>
-        <clipPath
-           id="clipPath101827">
-          <use
-             id="use101829"
-             overflow="visible"
-             xlink:href="#SVGID_4565_"
-             style="overflow:visible"
-             x="0"
-             y="0"
-             width="744.09448"
-             height="1052.3622" />
-        </clipPath>
-        <linearGradient
-           gradientTransform="matrix(0,5.3836,5.3836,0,153.2715,-1066.0031)"
-           y2="-148.4601"
-           x2="256.3761"
-           y1="-148.4601"
-           x1="255.3761"
-           gradientUnits="userSpaceOnUse"
-           id="linearGradient101831">
-          <stop
-             id="stop101833"
-             style="stop-color:#55AEB9"
-             offset="0" />
-          <stop
-             id="stop101835"
-             style="stop-color:#81D1DB"
-             offset="1" />
-        </linearGradient>
-        <rect
-           id="rect82474"
-           height="5.3839998"
-           width="5.3839998"
-           clip-path="url(#SVGID_4566_)"
-           y="308.841"
-           x="-648.67102"
-           style="fill:url(#SVGID_4567_)" />
+         id="g28814">
+        <g
+           id="g28812">
+          <g
+             id="g28810">
+            <rect
+               style="opacity:0.61;fill:#000000;stroke-width:1.00094"
+               id="rect28808"
+               width="439.00146"
+               height="696.97461"
+               x="122.01721"
+               y="152.74527" />
+          </g>
+        </g>
       </g>
       </g>
-      <path
-         transform="matrix(2.25,0,0,2.25,1605.7731,-25.560183)"
-         style="fill:#ffffff"
-         inkscape:connector-curvature="0"
-         clip-path="url(#SVGID_4569_)"
-         d="m -646.611,311.532 c 0,-0.349 0.283,-0.631 0.632,-0.631 0.351,0 0.634,0.282 0.634,0.631 0,0.35 -0.283,0.633 -0.634,0.633 -0.349,0 -0.632,-0.283 -0.632,-0.633"
-         id="path82484" />
-      <rect
-         transform="matrix(2.25,0,0,2.25,1605.7731,-25.560183)"
-         style="fill:#ffffff"
-         x="-638.80298"
-         y="306.73599"
-         clip-path="url(#SVGID_4569_)"
-         width="9.592"
-         height="9.5930004"
-         id="rect82486" />
-      <rect
-         transform="matrix(2.25,0,0,2.25,1605.7731,-25.560183)"
-         style="fill:none;stroke:#81d0db;stroke-width:0.428;stroke-miterlimit:10"
-         x="-638.80298"
-         y="306.73599"
-         clip-path="url(#SVGID_4569_)"
-         stroke-miterlimit="10"
-         width="9.592"
-         height="9.5930004"
-         id="rect82488" />
-      <rect
-         transform="matrix(2.25,0,0,2.25,1605.7731,-25.560183)"
-         style="fill:#81d0db"
-         x="-638.13202"
-         y="307.41"
-         clip-path="url(#SVGID_4569_)"
-         width="8.2480001"
-         height="8.2460003"
-         id="rect82490" />
-      <rect
-         transform="matrix(2.25,0,0,2.25,1605.7731,-25.560183)"
-         style="fill:#ffffff"
-         x="-637.47198"
-         y="308.06699"
-         clip-path="url(#SVGID_4569_)"
-         width="6.9299998"
-         height="6.9310002"
-         id="rect82492" />
-      <rect
-         transform="matrix(2.25,0,0,2.25,1605.7731,-25.560183)"
-         style="fill:#ffffff"
-         x="-636.29199"
-         y="309.24799"
-         clip-path="url(#SVGID_4569_)"
-         width="4.5700002"
-         height="4.5679998"
-         id="rect82494" />
+    </clipPath>
+    <clipPath
+       clipPathUnits="userSpaceOnUse"
+       id="clipPath28836">
       <g
       <g
-         inkscape:transform-center-y="19.598312"
-         inkscape:transform-center-x="530.16231"
-         id="g82496"
-         transform="matrix(2.25,0,0,2.25,1605.7731,-25.560183)">
-        <defs
-           id="defs82498">
-          <path
-             d="m -636.699,311.531 c 0,1.487 1.206,2.694 2.692,2.694 1.487,0 2.692,-1.207 2.692,-2.694 0,-1.485 -1.205,-2.69 -2.692,-2.69 -1.486,0 -2.692,1.205 -2.692,2.69"
-             id="SVGID_4570_"
-             inkscape:connector-curvature="0" />
-        </defs>
-        <clipPath
-           id="clipPath101854">
-          <use
-             id="use101856"
-             overflow="visible"
-             xlink:href="#SVGID_4570_"
-             style="overflow:visible"
-             x="0"
-             y="0"
-             width="744.09448"
-             height="1052.3622" />
-        </clipPath>
-        <linearGradient
-           gradientTransform="matrix(0,5.3836,5.3836,0,165.2429,-1066.0031)"
-           y2="-148.46001"
-           x2="256.3761"
-           y1="-148.46001"
-           x1="255.3761"
-           gradientUnits="userSpaceOnUse"
-           id="linearGradient101858">
-          <stop
-             id="stop101860"
-             style="stop-color:#55AEB9"
-             offset="0" />
-          <stop
-             id="stop101862"
-             style="stop-color:#81D1DB"
-             offset="1" />
-        </linearGradient>
-        <rect
-           id="rect82509"
-           height="5.3839998"
-           width="5.3839998"
-           clip-path="url(#SVGID_4571_)"
-           y="308.841"
-           x="-636.69897"
-           style="fill:url(#SVGID_4572_)" />
+         id="g28844">
+        <g
+           id="g28842">
+          <g
+             id="g28840">
+            <rect
+               style="opacity:0.61;fill:#000000;stroke-width:1.00094"
+               id="rect28838"
+               width="439.00146"
+               height="696.97461"
+               x="122.01721"
+               y="152.74527" />
+          </g>
+        </g>
       </g>
       </g>
+    </clipPath>
+    <clipPath
+       clipPathUnits="userSpaceOnUse"
+       id="clipPath28846">
       <g
       <g
-         inkscape:transform-center-y="19.597166"
-         inkscape:transform-center-x="511.76858"
-         id="g82511"
-         transform="matrix(2.25,0,0,2.25,1605.7731,-25.560183)">
-        <defs
-           id="defs82513">
-          <rect
-             height="205.44099"
-             width="200.271"
-             y="181.315"
-             x="-682.31403"
-             id="SVGID_4573_" />
-        </defs>
-        <clipPath
-           id="clipPath101868">
-          <use
-             id="use101870"
-             overflow="visible"
-             xlink:href="#SVGID_4573_"
-             style="overflow:visible"
-             x="0"
-             y="0"
-             width="744.09448"
-             height="1052.3622" />
-        </clipPath>
-        <path
-           id="path82519"
-           d="m -634.639,311.532 c 0,-0.349 0.283,-0.631 0.632,-0.631 0.351,0 0.634,0.282 0.634,0.631 0,0.35 -0.283,0.633 -0.634,0.633 -0.349,0 -0.632,-0.283 -0.632,-0.633"
-           clip-path="url(#SVGID_4574_)"
-           inkscape:connector-curvature="0"
-           style="fill:#ffffff" />
-        <rect
-           id="rect82521"
-           height="9.5930004"
-           width="9.592"
-           clip-path="url(#SVGID_4574_)"
-           y="306.73599"
-           x="-626.83099"
-           style="fill:#ffffff" />
-        <rect
-           id="rect82523"
-           height="9.5930004"
-           width="9.592"
-           stroke-miterlimit="10"
-           clip-path="url(#SVGID_4574_)"
-           y="306.73599"
-           x="-626.83099"
-           style="fill:none;stroke:#81d0db;stroke-width:0.428;stroke-miterlimit:10" />
-        <rect
-           id="rect82525"
-           height="8.2460003"
-           width="8.2480001"
-           clip-path="url(#SVGID_4574_)"
-           y="307.41"
-           x="-626.15997"
-           style="fill:#81d0db" />
-        <rect
-           id="rect82527"
-           height="6.9310002"
-           width="6.9299998"
-           clip-path="url(#SVGID_4574_)"
-           y="308.06699"
-           x="-625.5"
-           style="fill:#ffffff" />
-        <rect
-           id="rect82529"
-           height="4.5679998"
-           width="4.5700002"
-           clip-path="url(#SVGID_4574_)"
-           y="309.24799"
-           x="-624.32098"
-           style="fill:#ffffff" />
+         id="g28854">
+        <g
+           id="g28852">
+          <g
+             id="g28850">
+            <rect
+               style="opacity:0.61;fill:#000000;stroke-width:1.00094"
+               id="rect28848"
+               width="439.00146"
+               height="696.97461"
+               x="122.01721"
+               y="152.74527" />
+          </g>
+        </g>
       </g>
       </g>
+    </clipPath>
+    <clipPath
+       clipPathUnits="userSpaceOnUse"
+       id="clipPath28866">
       <g
       <g
-         inkscape:transform-center-y="19.598312"
-         inkscape:transform-center-x="503.22762"
-         id="g82531"
-         transform="matrix(2.25,0,0,2.25,1605.7731,-25.560183)">
-        <defs
-           id="defs82533">
-          <path
-             d="m -624.728,311.531 c 0,1.487 1.206,2.694 2.693,2.694 1.487,0 2.691,-1.207 2.691,-2.694 0,-1.485 -1.204,-2.69 -2.691,-2.69 -1.487,0 -2.693,1.205 -2.693,2.69"
-             id="SVGID_4575_"
-             inkscape:connector-curvature="0" />
-        </defs>
-        <clipPath
-           id="clipPath101881">
-          <use
-             id="use101883"
-             overflow="visible"
-             xlink:href="#SVGID_4575_"
-             style="overflow:visible"
-             x="0"
-             y="0"
-             width="744.09448"
-             height="1052.3622" />
-        </clipPath>
-        <linearGradient
-           gradientTransform="matrix(0,5.3836,5.3836,0,177.2143,-1066.0031)"
-           y2="-148.4601"
-           x2="256.3761"
-           y1="-148.4601"
-           x1="255.3761"
-           gradientUnits="userSpaceOnUse"
-           id="linearGradient101885">
-          <stop
-             id="stop101887"
-             style="stop-color:#55AEB9"
-             offset="0" />
-          <stop
-             id="stop101889"
-             style="stop-color:#81D1DB"
-             offset="1" />
-        </linearGradient>
-        <rect
-           id="rect82544"
-           height="5.3839998"
-           width="5.3839998"
-           clip-path="url(#SVGID_4576_)"
-           y="308.841"
-           x="-624.72803"
-           style="fill:url(#SVGID_4577_)" />
+         id="g28874">
+        <g
+           id="g28872">
+          <g
+             id="g28870">
+            <rect
+               style="opacity:0.61;fill:#000000;stroke-width:1.00094"
+               id="rect28868"
+               width="439.00146"
+               height="696.97461"
+               x="122.01721"
+               y="152.74527" />
+          </g>
+        </g>
       </g>
       </g>
+    </clipPath>
+    <clipPath
+       clipPathUnits="userSpaceOnUse"
+       id="clipPath28876">
       <g
       <g
-         inkscape:transform-center-y="19.597166"
-         inkscape:transform-center-x="484.83387"
-         id="g82546"
-         transform="matrix(2.25,0,0,2.25,1605.7731,-25.560183)">
-        <defs
-           id="defs82548">
-          <rect
-             height="205.44099"
-             width="200.271"
-             y="181.315"
-             x="-682.31403"
-             id="SVGID_4578_" />
-        </defs>
-        <clipPath
-           id="clipPath101895">
-          <use
-             id="use101897"
-             overflow="visible"
-             xlink:href="#SVGID_4578_"
-             style="overflow:visible"
-             x="0"
-             y="0"
-             width="744.09448"
-             height="1052.3622" />
-        </clipPath>
-        <path
-           id="path82554"
-           d="m -622.668,311.532 c 0,-0.349 0.283,-0.631 0.632,-0.631 0.351,0 0.634,0.282 0.634,0.631 0,0.35 -0.283,0.633 -0.634,0.633 -0.349,0 -0.632,-0.283 -0.632,-0.633"
-           clip-path="url(#SVGID_4579_)"
-           inkscape:connector-curvature="0"
-           style="fill:#ffffff" />
-        <rect
-           id="rect82556"
-           height="9.5930004"
-           width="9.5930004"
-           clip-path="url(#SVGID_4579_)"
-           y="306.73599"
-           x="-614.85999"
-           style="fill:#ffffff" />
-        <rect
-           id="rect82558"
-           height="9.5930004"
-           width="9.5930004"
-           stroke-miterlimit="10"
-           clip-path="url(#SVGID_4579_)"
-           y="306.73599"
-           x="-614.86102"
-           style="fill:none;stroke:#81d0db;stroke-width:0.428;stroke-miterlimit:10" />
-        <rect
-           id="rect82560"
-           height="8.2460003"
-           width="8.2480001"
-           clip-path="url(#SVGID_4579_)"
-           y="307.41"
-           x="-614.18799"
-           style="fill:#81d0db" />
-        <rect
-           id="rect82562"
-           height="6.9310002"
-           width="6.9310002"
-           clip-path="url(#SVGID_4579_)"
-           y="308.06699"
-           x="-613.52899"
-           style="fill:#ffffff" />
-        <rect
-           id="rect82564"
-           height="4.5679998"
-           width="4.5700002"
-           clip-path="url(#SVGID_4579_)"
-           y="309.24799"
-           x="-612.349"
-           style="fill:#ffffff" />
+         id="g28884">
+        <g
+           id="g28882">
+          <g
+             id="g28880">
+            <rect
+               style="opacity:0.61;fill:#000000;stroke-width:1.00094"
+               id="rect28878"
+               width="439.00146"
+               height="696.97461"
+               x="122.01721"
+               y="152.74527" />
+          </g>
+        </g>
       </g>
       </g>
+    </clipPath>
+    <clipPath
+       clipPathUnits="userSpaceOnUse"
+       id="clipPath28896">
       <g
       <g
-         inkscape:transform-center-y="19.598312"
-         inkscape:transform-center-x="476.2917"
-         id="g82566"
-         transform="matrix(2.25,0,0,2.25,1605.7731,-25.560183)">
-        <defs
-           id="defs82568">
-          <path
-             d="m -612.756,311.531 c 0,1.487 1.206,2.694 2.692,2.694 1.487,0 2.691,-1.207 2.691,-2.694 0,-1.485 -1.204,-2.69 -2.691,-2.69 -1.486,0 -2.692,1.205 -2.692,2.69"
-             id="SVGID_4580_"
-             inkscape:connector-curvature="0" />
-        </defs>
-        <clipPath
-           id="clipPath101908">
-          <use
-             id="use101910"
-             overflow="visible"
-             xlink:href="#SVGID_4580_"
-             style="overflow:visible"
-             x="0"
-             y="0"
-             width="744.09448"
-             height="1052.3622" />
-        </clipPath>
-        <linearGradient
-           gradientTransform="matrix(0,5.3836,5.3836,0,189.1858,-1066.0031)"
-           y2="-148.4601"
-           x2="256.3761"
-           y1="-148.4601"
-           x1="255.3761"
-           gradientUnits="userSpaceOnUse"
-           id="linearGradient101912">
-          <stop
-             id="stop101914"
-             style="stop-color:#55AEB9"
-             offset="0" />
-          <stop
-             id="stop101916"
-             style="stop-color:#81D1DB"
-             offset="1" />
-        </linearGradient>
-        <rect
-           id="rect82579"
-           height="5.3839998"
-           width="5.3829999"
-           clip-path="url(#SVGID_4581_)"
-           y="308.841"
-           x="-612.75598"
-           style="fill:url(#SVGID_4582_)" />
+         id="g28904">
+        <g
+           id="g28902">
+          <g
+             id="g28900">
+            <rect
+               style="opacity:0.61;fill:#000000;stroke-width:1.00094"
+               id="rect28898"
+               width="439.00146"
+               height="696.97461"
+               x="122.01721"
+               y="152.74527" />
+          </g>
+        </g>
       </g>
       </g>
+    </clipPath>
+    <clipPath
+       clipPathUnits="userSpaceOnUse"
+       id="clipPath28916">
       <g
       <g
-         inkscape:transform-center-y="19.597166"
-         inkscape:transform-center-x="457.89686"
-         id="g82581"
-         transform="matrix(2.25,0,0,2.25,1605.7731,-25.560183)">
-        <defs
-           id="defs82583">
-          <rect
-             height="205.44099"
-             width="200.271"
-             y="181.315"
-             x="-682.31403"
-             id="SVGID_4583_" />
-        </defs>
-        <clipPath
-           id="clipPath101922">
-          <use
-             id="use101924"
-             overflow="visible"
-             xlink:href="#SVGID_4583_"
-             style="overflow:visible"
-             x="0"
-             y="0"
-             width="744.09448"
-             height="1052.3622" />
-        </clipPath>
-        <path
-           id="path82589"
-           d="m -610.696,311.532 c 0,-0.349 0.283,-0.631 0.632,-0.631 0.351,0 0.634,0.282 0.634,0.631 0,0.35 -0.283,0.633 -0.634,0.633 -0.349,0 -0.632,-0.283 -0.632,-0.633"
-           clip-path="url(#SVGID_4584_)"
-           inkscape:connector-curvature="0"
-           style="fill:#ffffff" />
-        <rect
-           id="rect82591"
-           height="9.5930004"
-           width="9.592"
-           clip-path="url(#SVGID_4584_)"
-           y="306.73599"
-           x="-602.888"
-           style="fill:#ffffff" />
-        <rect
-           id="rect82593"
-           height="9.5930004"
-           width="9.592"
-           stroke-miterlimit="10"
-           clip-path="url(#SVGID_4584_)"
-           y="306.73599"
-           x="-602.888"
-           style="fill:none;stroke:#81d0db;stroke-width:0.428;stroke-miterlimit:10" />
-        <rect
-           id="rect82595"
-           height="8.2460003"
-           width="8.2480001"
-           clip-path="url(#SVGID_4584_)"
-           y="307.41"
-           x="-602.21698"
-           style="fill:#81d0db" />
-        <rect
-           id="rect82597"
-           height="6.9310002"
-           width="6.9299998"
-           clip-path="url(#SVGID_4584_)"
-           y="308.06699"
-           x="-601.55701"
-           style="fill:#ffffff" />
-        <rect
-           id="rect82599"
-           height="4.5679998"
-           width="4.5700002"
-           clip-path="url(#SVGID_4584_)"
-           y="309.24799"
-           x="-600.37799"
-           style="fill:#ffffff" />
-      </g>
-      <g
-         inkscape:transform-center-y="19.598312"
-         inkscape:transform-center-x="449.35694"
-         id="g82601"
-         transform="matrix(2.25,0,0,2.25,1605.7731,-25.560183)">
-        <defs
-           id="defs82603">
-          <path
-             d="m -600.785,311.531 c 0,1.487 1.206,2.694 2.692,2.694 1.488,0 2.691,-1.207 2.691,-2.694 0,-1.485 -1.203,-2.69 -2.691,-2.69 -1.486,0 -2.692,1.205 -2.692,2.69"
-             id="SVGID_4585_"
-             inkscape:connector-curvature="0" />
-        </defs>
-        <clipPath
-           id="clipPath101935">
-          <use
-             id="use101937"
-             overflow="visible"
-             xlink:href="#SVGID_4585_"
-             style="overflow:visible"
-             x="0"
-             y="0"
-             width="744.09448"
-             height="1052.3622" />
-        </clipPath>
-        <linearGradient
-           gradientTransform="matrix(0,5.3836,5.3836,0,201.1574,-1066.0031)"
-           y2="-148.46021"
-           x2="256.3761"
-           y1="-148.46021"
-           x1="255.3761"
-           gradientUnits="userSpaceOnUse"
-           id="linearGradient101939">
-          <stop
-             id="stop101941"
-             style="stop-color:#55AEB9"
-             offset="0" />
-          <stop
-             id="stop101943"
-             style="stop-color:#81D1DB"
-             offset="1" />
-        </linearGradient>
-        <rect
-           id="rect82614"
-           height="5.3839998"
-           width="5.3829999"
-           clip-path="url(#SVGID_4586_)"
-           y="308.841"
-           x="-600.78497"
-           style="fill:url(#SVGID_4587_)" />
-      </g>
-      <g
-         inkscape:transform-center-y="19.597166"
-         inkscape:transform-center-x="430.96208"
-         id="g82616"
-         transform="matrix(2.25,0,0,2.25,1605.7731,-25.560183)">
-        <defs
-           id="defs82618">
-          <rect
-             height="205.44099"
-             width="200.271"
-             y="181.315"
-             x="-682.31403"
-             id="SVGID_4588_" />
-        </defs>
-        <clipPath
-           id="clipPath101949">
-          <use
-             id="use101951"
-             overflow="visible"
-             xlink:href="#SVGID_4588_"
-             style="overflow:visible"
-             x="0"
-             y="0"
-             width="744.09448"
-             height="1052.3622" />
-        </clipPath>
-        <path
-           id="path82624"
-           d="m -598.725,311.532 c 0,-0.349 0.283,-0.631 0.632,-0.631 0.351,0 0.634,0.282 0.634,0.631 0,0.35 -0.283,0.633 -0.634,0.633 -0.349,0 -0.632,-0.283 -0.632,-0.633"
-           clip-path="url(#SVGID_4589_)"
-           inkscape:connector-curvature="0"
-           style="fill:#ffffff" />
-        <rect
-           id="rect82626"
-           height="9.5930004"
-           width="9.592"
-           clip-path="url(#SVGID_4589_)"
-           y="306.73599"
-           x="-590.91699"
-           style="fill:#ffffff" />
-        <rect
-           id="rect82628"
-           height="9.5930004"
-           width="9.592"
-           stroke-miterlimit="10"
-           clip-path="url(#SVGID_4589_)"
-           y="306.73599"
-           x="-590.91699"
-           style="fill:none;stroke:#81d0db;stroke-width:0.428;stroke-miterlimit:10" />
-        <rect
-           id="rect82630"
-           height="8.2460003"
-           width="8.2480001"
-           clip-path="url(#SVGID_4589_)"
-           y="307.41"
-           x="-590.24597"
-           style="fill:#81d0db" />
-        <rect
-           id="rect82632"
-           height="6.9310002"
-           width="6.9299998"
-           clip-path="url(#SVGID_4589_)"
-           y="308.06699"
-           x="-589.586"
-           style="fill:#ffffff" />
-        <rect
-           id="rect82634"
-           height="4.5679998"
-           width="4.5700002"
-           clip-path="url(#SVGID_4589_)"
-           y="309.24799"
-           x="-588.40698"
-           style="fill:#ffffff" />
+         id="g28924"
+         transform="matrix(0.44444444,0,0,0.44444444,-774.10444,27.578499)">
+        <g
+           id="g28922">
+          <g
+             id="g28920">
+            <rect
+               style="opacity:0.61;fill:#000000;stroke-width:1.00094"
+               id="rect28918"
+               width="439.00146"
+               height="696.97461"
+               x="122.01721"
+               y="152.74527" />
+          </g>
+        </g>
       </g>
       </g>
+    </clipPath>
+    <clipPath
+       clipPathUnits="userSpaceOnUse"
+       id="clipPath28926">
       <g
       <g
-         inkscape:transform-center-y="19.598312"
-         inkscape:transform-center-x="422.41995"
-         id="g82636"
-         transform="matrix(2.25,0,0,2.25,1605.7731,-25.560183)">
-        <defs
-           id="defs82638">
-          <path
-             d="m -588.813,311.531 c 0,1.487 1.205,2.694 2.692,2.694 1.487,0 2.691,-1.207 2.691,-2.694 0,-1.485 -1.204,-2.69 -2.691,-2.69 -1.487,0 -2.692,1.205 -2.692,2.69"
-             id="SVGID_4590_"
-             inkscape:connector-curvature="0" />
-        </defs>
-        <clipPath
-           id="clipPath101962">
-          <use
-             id="use101964"
-             overflow="visible"
-             xlink:href="#SVGID_4590_"
-             style="overflow:visible"
-             x="0"
-             y="0"
-             width="744.09448"
-             height="1052.3622" />
-        </clipPath>
-        <linearGradient
-           gradientTransform="matrix(0,5.3836,5.3836,0,213.1288,-1066.0031)"
-           y2="-148.4601"
-           x2="256.3761"
-           y1="-148.4601"
-           x1="255.3761"
-           gradientUnits="userSpaceOnUse"
-           id="linearGradient101966">
-          <stop
-             id="stop101968"
-             style="stop-color:#55AEB9"
-             offset="0" />
-          <stop
-             id="stop101970"
-             style="stop-color:#81D1DB"
-             offset="1" />
-        </linearGradient>
-        <rect
-           id="rect82649"
-           height="5.3839998"
-           width="5.3829999"
-           clip-path="url(#SVGID_4591_)"
-           y="308.841"
-           x="-588.81299"
-           style="fill:url(#SVGID_4592_)" />
+         id="g28934">
+        <g
+           id="g28932">
+          <g
+             id="g28930">
+            <rect
+               style="opacity:0.61;fill:#000000;stroke-width:1.00094"
+               id="rect28928"
+               width="439.00146"
+               height="696.97461"
+               x="122.01721"
+               y="152.74527" />
+          </g>
+        </g>
       </g>
       </g>
+    </clipPath>
+    <clipPath
+       clipPathUnits="userSpaceOnUse"
+       id="clipPath28936">
       <g
       <g
-         inkscape:transform-center-y="37.558931"
-         inkscape:transform-center-x="440.81033"
-         id="g82861"
-         transform="matrix(2.25,0,0,2.25,1605.7731,-25.560183)">
-        <defs
-           id="defs82863">
-          <rect
-             height="205.44099"
-             width="200.271"
-             y="181.315"
-             x="-682.31403"
-             id="SVGID_4623_" />
-        </defs>
-        <clipPath
-           id="clipPath102138">
-          <use
-             id="use102140"
-             overflow="visible"
-             xlink:href="#SVGID_4623_"
-             style="overflow:visible"
-             x="0"
-             y="0"
-             width="744.09448"
-             height="1052.3622" />
-        </clipPath>
-        <path
-           id="path82869"
-           d="m -514.925,311.532 c 0,-0.349 0.283,-0.631 0.632,-0.631 0.351,0 0.634,0.282 0.634,0.631 0,0.35 -0.283,0.633 -0.634,0.633 -0.349,0 -0.632,-0.283 -0.632,-0.633"
-           clip-path="url(#SVGID_4624_)"
-           inkscape:connector-curvature="0"
-           style="fill:#ffffff" />
-        <rect
-           id="rect82871"
-           height="9.5930004"
-           width="9.592"
-           clip-path="url(#SVGID_4624_)"
-           y="318.323"
-           x="-674.71698"
-           style="fill:#ffffff" />
-        <rect
-           id="rect82873"
-           height="9.5930004"
-           width="9.592"
-           stroke-miterlimit="10"
-           clip-path="url(#SVGID_4624_)"
-           y="318.323"
-           x="-674.71698"
-           style="fill:none;stroke:#81d0db;stroke-width:0.428;stroke-miterlimit:10" />
-        <rect
-           id="rect82875"
-           height="8.2460003"
-           width="8.2480001"
-           clip-path="url(#SVGID_4624_)"
-           y="318.99701"
-           x="-674.04602"
-           style="fill:#81d0db" />
-        <rect
-           id="rect82877"
-           height="6.9310002"
-           width="6.9299998"
-           clip-path="url(#SVGID_4624_)"
-           y="319.65399"
-           x="-673.38599"
-           style="fill:#ffffff" />
-        <rect
-           id="rect82879"
-           height="4.5679998"
-           width="4.5700002"
-           clip-path="url(#SVGID_4624_)"
-           y="320.83499"
-           x="-672.20697"
-           style="fill:#ffffff" />
+         id="g28944">
+        <g
+           id="g28942">
+          <g
+             id="g28940">
+            <rect
+               style="opacity:0.61;fill:#000000;stroke-width:1.00094"
+               id="rect28938"
+               width="439.00146"
+               height="696.97461"
+               x="122.01721"
+               y="152.74527" />
+          </g>
+        </g>
       </g>
       </g>
+    </clipPath>
+    <clipPath
+       clipPathUnits="userSpaceOnUse"
+       id="clipPath28946">
       <g
       <g
-         inkscape:transform-center-y="45.671291"
-         inkscape:transform-center-x="610.97111"
-         id="g82881"
-         transform="matrix(2.25,0,0,2.25,1605.7731,-25.560183)">
-        <defs
-           id="defs82883">
-          <path
-             d="m -672.614,323.119 c 0,1.487 1.206,2.694 2.692,2.694 1.488,0 2.692,-1.207 2.692,-2.694 0,-1.486 -1.204,-2.69 -2.692,-2.69 -1.486,0 -2.692,1.204 -2.692,2.69"
-             id="SVGID_4625_"
-             inkscape:connector-curvature="0" />
-        </defs>
-        <clipPath
-           id="clipPath102151">
-          <use
-             id="use102153"
-             overflow="visible"
-             xlink:href="#SVGID_4625_"
-             style="overflow:visible"
-             x="0"
-             y="0"
-             width="744.09448"
-             height="1052.3622" />
-        </clipPath>
-        <linearGradient
-           gradientTransform="matrix(0,5.3836,5.3836,0,129.3288,-1054.4158)"
-           y2="-148.46021"
-           x2="256.37631"
-           y1="-148.46021"
-           x1="255.37621"
-           gradientUnits="userSpaceOnUse"
-           id="linearGradient102155">
-          <stop
-             id="stop102157"
-             style="stop-color:#55AEB9"
-             offset="0" />
-          <stop
-             id="stop102159"
-             style="stop-color:#81D1DB"
-             offset="1" />
-        </linearGradient>
-        <rect
-           id="rect82894"
-           height="5.3839998"
-           width="5.3839998"
-           clip-path="url(#SVGID_4626_)"
-           y="320.42899"
-           x="-672.61401"
-           style="fill:url(#SVGID_4627_)" />
+         id="g28954">
+        <g
+           id="g28952">
+          <g
+             id="g28950">
+            <rect
+               style="opacity:0.61;fill:#000000;stroke-width:1.00094"
+               id="rect28948"
+               width="439.00146"
+               height="696.97461"
+               x="122.01721"
+               y="152.74527" />
+          </g>
+        </g>
       </g>
       </g>
+    </clipPath>
+    <clipPath
+       clipPathUnits="userSpaceOnUse"
+       id="clipPath28956">
       <g
       <g
-         inkscape:transform-center-y="45.667929"
-         inkscape:transform-center-x="592.57619"
-         id="g82896"
-         transform="matrix(2.25,0,0,2.25,1605.7731,-25.560183)">
-        <defs
-           id="defs82898">
-          <rect
-             height="205.44099"
-             width="200.271"
-             y="181.315"
-             x="-682.31403"
-             id="SVGID_4628_" />
-        </defs>
-        <clipPath
-           id="clipPath102165">
-          <use
-             id="use102167"
-             overflow="visible"
-             xlink:href="#SVGID_4628_"
-             style="overflow:visible"
-             x="0"
-             y="0"
-             width="744.09448"
-             height="1052.3622" />
-        </clipPath>
-        <path
-           id="path82904"
-           d="m -670.553,323.119 c 0,-0.349 0.283,-0.631 0.632,-0.631 0.351,0 0.634,0.282 0.634,0.631 0,0.35 -0.283,0.633 -0.634,0.633 -0.349,0 -0.632,-0.283 -0.632,-0.633"
-           clip-path="url(#SVGID_4629_)"
-           inkscape:connector-curvature="0"
-           style="fill:#ffffff" />
-        <rect
-           id="rect82906"
-           height="9.5930004"
-           width="9.592"
-           clip-path="url(#SVGID_4629_)"
-           y="318.323"
-           x="-662.745"
-           style="fill:#ffffff" />
-        <rect
-           id="rect82908"
-           height="9.5930004"
-           width="9.592"
-           stroke-miterlimit="10"
-           clip-path="url(#SVGID_4629_)"
-           y="318.323"
-           x="-662.74597"
-           style="fill:none;stroke:#81d0db;stroke-width:0.428;stroke-miterlimit:10" />
-        <rect
-           id="rect82910"
-           height="8.2460003"
-           width="8.2480001"
-           clip-path="url(#SVGID_4629_)"
-           y="318.99701"
-           x="-662.07397"
-           style="fill:#81d0db" />
-        <rect
-           id="rect82912"
-           height="6.9310002"
-           width="6.9299998"
-           clip-path="url(#SVGID_4629_)"
-           y="319.65399"
-           x="-661.414"
-           style="fill:#ffffff" />
-        <rect
-           id="rect82914"
-           height="4.5679998"
-           width="4.5700002"
-           clip-path="url(#SVGID_4629_)"
-           y="320.83499"
-           x="-660.23499"
-           style="fill:#ffffff" />
+         id="g28964">
+        <g
+           id="g28962">
+          <g
+             id="g28960">
+            <rect
+               style="opacity:0.61;fill:#000000;stroke-width:1.00094"
+               id="rect28958"
+               width="439.00146"
+               height="696.97461"
+               x="122.01721"
+               y="152.74527" />
+          </g>
+        </g>
       </g>
       </g>
+    </clipPath>
+    <clipPath
+       clipPathUnits="userSpaceOnUse"
+       id="clipPath28966">
       <g
       <g
-         inkscape:transform-center-y="45.671291"
-         inkscape:transform-center-x="584.03412"
-         id="g82916"
-         transform="matrix(2.25,0,0,2.25,1605.7731,-25.560183)">
-        <defs
-           id="defs82918">
-          <path
-             d="m -660.642,323.119 c 0,1.487 1.206,2.694 2.692,2.694 1.488,0 2.692,-1.207 2.692,-2.694 0,-1.486 -1.204,-2.69 -2.692,-2.69 -1.486,0 -2.692,1.204 -2.692,2.69"
-             id="SVGID_4630_"
-             inkscape:connector-curvature="0" />
-        </defs>
-        <clipPath
-           id="clipPath102178">
-          <use
-             id="use102180"
-             overflow="visible"
-             xlink:href="#SVGID_4630_"
-             style="overflow:visible"
-             x="0"
-             y="0"
-             width="744.09448"
-             height="1052.3622" />
-        </clipPath>
-        <linearGradient
-           gradientTransform="matrix(0,5.3836,5.3836,0,141.3002,-1054.4158)"
-           y2="-148.4601"
-           x2="256.37631"
-           y1="-148.4601"
-           x1="255.37621"
-           gradientUnits="userSpaceOnUse"
-           id="linearGradient102182">
-          <stop
-             id="stop102184"
-             style="stop-color:#55AEB9"
-             offset="0" />
-          <stop
-             id="stop102186"
-             style="stop-color:#81D1DB"
-             offset="1" />
-        </linearGradient>
-        <rect
-           id="rect82929"
-           height="5.3839998"
-           width="5.3839998"
-           clip-path="url(#SVGID_4631_)"
-           y="320.42899"
-           x="-660.64203"
-           style="fill:url(#SVGID_4632_)" />
+         id="g28974">
+        <g
+           id="g28972">
+          <g
+             id="g28970">
+            <rect
+               style="opacity:0.61;fill:#000000;stroke-width:1.00094"
+               id="rect28968"
+               width="439.00146"
+               height="696.97461"
+               x="122.01721"
+               y="152.74527" />
+          </g>
+        </g>
       </g>
       </g>
+    </clipPath>
+    <clipPath
+       clipPathUnits="userSpaceOnUse"
+       id="clipPath28976">
       <g
       <g
-         inkscape:transform-center-y="45.667929"
-         inkscape:transform-center-x="565.64033"
-         id="g82931"
-         transform="matrix(2.25,0,0,2.25,1605.7731,-25.560183)">
-        <defs
-           id="defs82933">
-          <rect
-             height="205.44099"
-             width="200.271"
-             y="181.315"
-             x="-682.31403"
-             id="SVGID_4633_" />
-        </defs>
-        <clipPath
-           id="clipPath102192">
-          <use
-             id="use102194"
-             overflow="visible"
-             xlink:href="#SVGID_4633_"
-             style="overflow:visible"
-             x="0"
-             y="0"
-             width="744.09448"
-             height="1052.3622" />
-        </clipPath>
-        <path
-           id="path82939"
-           d="m -658.582,323.119 c 0,-0.349 0.283,-0.631 0.632,-0.631 0.351,0 0.634,0.282 0.634,0.631 0,0.35 -0.283,0.633 -0.634,0.633 -0.349,0 -0.632,-0.283 -0.632,-0.633"
-           clip-path="url(#SVGID_4634_)"
-           inkscape:connector-curvature="0"
-           style="fill:#ffffff" />
-        <rect
-           id="rect82941"
-           height="9.5930004"
-           width="9.592"
-           clip-path="url(#SVGID_4634_)"
-           y="318.323"
-           x="-650.77399"
-           style="fill:#ffffff" />
-        <rect
-           id="rect82943"
-           height="9.5930004"
-           width="9.592"
-           stroke-miterlimit="10"
-           clip-path="url(#SVGID_4634_)"
-           y="318.323"
-           x="-650.77399"
-           style="fill:none;stroke:#81d0db;stroke-width:0.428;stroke-miterlimit:10" />
-        <rect
-           id="rect82945"
-           height="8.2460003"
-           width="8.2480001"
-           clip-path="url(#SVGID_4634_)"
-           y="318.99701"
-           x="-650.10303"
-           style="fill:#81d0db" />
-        <rect
-           id="rect82947"
-           height="6.9310002"
-           width="6.9299998"
-           clip-path="url(#SVGID_4634_)"
-           y="319.65399"
-           x="-649.44299"
-           style="fill:#ffffff" />
-        <rect
-           id="rect82949"
-           height="4.5679998"
-           width="4.5700002"
-           clip-path="url(#SVGID_4634_)"
-           y="320.83499"
-           x="-648.26398"
-           style="fill:#ffffff" />
+         id="g28984">
+        <g
+           id="g28982">
+          <g
+             id="g28980">
+            <rect
+               style="opacity:0.61;fill:#000000;stroke-width:1.00094"
+               id="rect28978"
+               width="439.00146"
+               height="696.97461"
+               x="122.01721"
+               y="152.74527" />
+          </g>
+        </g>
       </g>
       </g>
+    </clipPath>
+    <defs
+       id="defs84716">
+      <rect
+         id="SVGID_4862_"
+         x="-682.31403"
+         y="181.315"
+         width="200.271"
+         height="205.44099" />
+    </defs>
+    <clipPath
+       id="clipPath103539">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4862_"
+         overflow="visible"
+         id="use103541" />
+    </clipPath>
+    <defs
+       id="defs84767">
+      <polygon
+         id="SVGID_4869_"
+         points="-654.922,278.632 -640.956,278.632 -640.956,273.567 -654.922,273.567 -656.715,276.108 " />
+    </defs>
+    <clipPath
+       id="clipPath103577">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4869_"
+         overflow="visible"
+         id="use103579" />
+    </clipPath>
+    <linearGradient
+       id="linearGradient103581"
+       gradientUnits="userSpaceOnUse"
+       x1="-34.205299"
+       y1="249.94051"
+       x2="-33.205299"
+       y2="249.94051"
+       gradientTransform="matrix(0,-5.065,-5.065,0,617.1209,105.3813)">
+      <stop
+         offset="0"
+         style="stop-color:#E6E8E7"
+         id="stop103583" />
+      <stop
+         offset="1"
+         style="stop-color:#FFFFFF"
+         id="stop103585" />
+    </linearGradient>
+    <clipPath
+       clipPathUnits="userSpaceOnUse"
+       id="clipPath29010">
       <g
       <g
-         inkscape:transform-center-y="45.671291"
-         inkscape:transform-center-x="557.09937"
-         id="g82951"
-         transform="matrix(2.25,0,0,2.25,1605.7731,-25.560183)">
-        <defs
-           id="defs82953">
-          <path
-             d="m -648.671,323.119 c 0,1.487 1.206,2.694 2.692,2.694 1.488,0 2.692,-1.207 2.692,-2.694 0,-1.486 -1.204,-2.69 -2.692,-2.69 -1.486,0 -2.692,1.204 -2.692,2.69"
-             id="SVGID_4635_"
-             inkscape:connector-curvature="0" />
-        </defs>
-        <clipPath
-           id="clipPath102205">
-          <use
-             id="use102207"
-             overflow="visible"
-             xlink:href="#SVGID_4635_"
-             style="overflow:visible"
-             x="0"
-             y="0"
-             width="744.09448"
-             height="1052.3622" />
-        </clipPath>
-        <linearGradient
-           gradientTransform="matrix(0,5.3836,5.3836,0,153.2715,-1054.4158)"
-           y2="-148.4601"
-           x2="256.37631"
-           y1="-148.4601"
-           x1="255.37621"
-           gradientUnits="userSpaceOnUse"
-           id="linearGradient102209">
-          <stop
-             id="stop102211"
-             style="stop-color:#55AEB9"
-             offset="0" />
-          <stop
-             id="stop102213"
-             style="stop-color:#81D1DB"
-             offset="1" />
-        </linearGradient>
-        <rect
-           id="rect82964"
-           height="5.3839998"
-           width="5.3839998"
-           clip-path="url(#SVGID_4636_)"
-           y="320.42899"
-           x="-648.67102"
-           style="fill:url(#SVGID_4637_)" />
+         id="g29020"
+         transform="matrix(0.44444444,0,0,0.44444444,-774.10444,27.578499)">
+        <g
+           id="g29018"
+           transform="translate(1e-5)">
+          <g
+             id="g29016">
+            <g
+               id="g29014">
+              <rect
+                 style="opacity:0.61;fill:#000000;stroke-width:1.00094"
+                 id="rect29012"
+                 width="439.00146"
+                 height="696.97461"
+                 x="122.01721"
+                 y="152.74527" />
+            </g>
+          </g>
+        </g>
       </g>
       </g>
+    </clipPath>
+    <defs
+       id="defs84728">
+      <polygon
+         id="SVGID_4864_"
+         points="-588.288,278.632 -574.322,278.632 -574.322,273.567 -588.288,273.567 -590.081,276.108 " />
+    </defs>
+    <clipPath
+       id="clipPath103548">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4864_"
+         overflow="visible"
+         id="use103550" />
+    </clipPath>
+    <linearGradient
+       id="linearGradient103552"
+       gradientUnits="userSpaceOnUse"
+       x1="-34.205299"
+       y1="249.9404"
+       x2="-33.205299"
+       y2="249.9404"
+       gradientTransform="matrix(0,-5.065,-5.065,0,683.7546,105.3813)">
+      <stop
+         offset="0"
+         style="stop-color:#E6E8E7"
+         id="stop103554" />
+      <stop
+         offset="1"
+         style="stop-color:#FFFFFF"
+         id="stop103556" />
+    </linearGradient>
+    <clipPath
+       clipPathUnits="userSpaceOnUse"
+       id="clipPath29040">
       <g
       <g
-         inkscape:transform-center-y="45.667929"
-         inkscape:transform-center-x="538.70558"
-         id="g82966"
-         transform="matrix(2.25,0,0,2.25,1605.7731,-25.560183)">
-        <defs
-           id="defs82968">
-          <rect
-             height="205.44099"
-             width="200.271"
-             y="181.315"
-             x="-682.31403"
-             id="SVGID_4638_" />
-        </defs>
-        <clipPath
-           id="clipPath102219">
-          <use
-             id="use102221"
-             overflow="visible"
-             xlink:href="#SVGID_4638_"
-             style="overflow:visible"
-             x="0"
-             y="0"
-             width="744.09448"
-             height="1052.3622" />
-        </clipPath>
-        <path
-           id="path82974"
-           d="m -646.611,323.119 c 0,-0.349 0.283,-0.631 0.632,-0.631 0.351,0 0.634,0.282 0.634,0.631 0,0.35 -0.283,0.633 -0.634,0.633 -0.349,0 -0.632,-0.283 -0.632,-0.633"
-           clip-path="url(#SVGID_4639_)"
-           inkscape:connector-curvature="0"
-           style="fill:#ffffff" />
-        <rect
-           id="rect82976"
-           height="9.5930004"
-           width="9.592"
-           clip-path="url(#SVGID_4639_)"
-           y="318.323"
-           x="-638.80298"
-           style="fill:#ffffff" />
-        <rect
-           id="rect82978"
-           height="9.5930004"
-           width="9.592"
-           stroke-miterlimit="10"
-           clip-path="url(#SVGID_4639_)"
-           y="318.323"
-           x="-638.80298"
-           style="fill:none;stroke:#81d0db;stroke-width:0.428;stroke-miterlimit:10" />
-        <rect
-           id="rect82980"
-           height="8.2460003"
-           width="8.2480001"
-           clip-path="url(#SVGID_4639_)"
-           y="318.99701"
-           x="-638.13202"
-           style="fill:#81d0db" />
-        <rect
-           id="rect82982"
-           height="6.9310002"
-           width="6.9299998"
-           clip-path="url(#SVGID_4639_)"
-           y="319.65399"
-           x="-637.47198"
-           style="fill:#ffffff" />
-        <rect
-           id="rect82984"
-           height="4.5679998"
-           width="4.5700002"
-           clip-path="url(#SVGID_4639_)"
-           y="320.83499"
-           x="-636.29199"
-           style="fill:#ffffff" />
+         id="g29050"
+         transform="matrix(0.44444444,0,0,0.44444444,-774.10444,27.578499)">
+        <g
+           id="g29048"
+           transform="translate(1e-5)">
+          <g
+             id="g29046">
+            <g
+               id="g29044">
+              <rect
+                 style="opacity:0.61;fill:#000000;stroke-width:1.00094"
+                 id="rect29042"
+                 width="439.00146"
+                 height="696.97461"
+                 x="122.01721"
+                 y="152.74527" />
+            </g>
+          </g>
+        </g>
       </g>
       </g>
+    </clipPath>
+    <defs
+       id="defs82283">
+      <polygon
+         id="SVGID_4543_"
+         points="-613.908,267.353 -571.554,267.32 -571.547,253.133 -593.085,258.293 -613.901,253.224 " />
+    </defs>
+    <clipPath
+       id="clipPath101684">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4543_"
+         overflow="visible"
+         id="use101686" />
+    </clipPath>
+    <linearGradient
+       id="linearGradient101688"
+       gradientUnits="userSpaceOnUse"
+       x1="76.3899"
+       y1="97.785698"
+       x2="77.3899"
+       y2="97.785698"
+       gradientTransform="matrix(0,-19.5733,-19.5733,0,1321.2666,1762.5587)">
+      <stop
+         offset="0"
+         style="stop-color:#55AEB9"
+         id="stop101690" />
+      <stop
+         offset="0.0507"
+         style="stop-color:#68B4BF"
+         id="stop101692" />
+      <stop
+         offset="0.2116"
+         style="stop-color:#96C6CF"
+         id="stop101694" />
+      <stop
+         offset="0.3736"
+         style="stop-color:#BAD8DD"
+         id="stop101696" />
+      <stop
+         offset="0.5342"
+         style="stop-color:#D7E6EA"
+         id="stop101698" />
+      <stop
+         offset="0.693"
+         style="stop-color:#EBF2F3"
+         id="stop101700" />
+      <stop
+         offset="0.8492"
+         style="stop-color:#F8FBFB"
+         id="stop101702" />
+      <stop
+         offset="1"
+         style="stop-color:#FFFFFF"
+         id="stop101704" />
+    </linearGradient>
+    <clipPath
+       clipPathUnits="userSpaceOnUse"
+       id="clipPath29076">
       <g
       <g
-         inkscape:transform-center-y="45.671291"
-         inkscape:transform-center-x="530.16231"
-         id="g82986"
-         transform="matrix(2.25,0,0,2.25,1605.7731,-25.560183)">
-        <defs
-           id="defs82988">
-          <path
-             d="m -636.699,323.119 c 0,1.487 1.206,2.694 2.692,2.694 1.487,0 2.692,-1.207 2.692,-2.694 0,-1.486 -1.205,-2.69 -2.692,-2.69 -1.486,0 -2.692,1.204 -2.692,2.69"
-             id="SVGID_4640_"
-             inkscape:connector-curvature="0" />
-        </defs>
-        <clipPath
-           id="clipPath102232">
-          <use
-             id="use102234"
-             overflow="visible"
-             xlink:href="#SVGID_4640_"
-             style="overflow:visible"
-             x="0"
-             y="0"
-             width="744.09448"
-             height="1052.3622" />
-        </clipPath>
-        <linearGradient
-           gradientTransform="matrix(0,5.3836,5.3836,0,165.2429,-1054.4158)"
-           y2="-148.46001"
-           x2="256.37631"
-           y1="-148.46001"
-           x1="255.37621"
-           gradientUnits="userSpaceOnUse"
-           id="linearGradient102236">
-          <stop
-             id="stop102238"
-             style="stop-color:#55AEB9"
-             offset="0" />
-          <stop
-             id="stop102240"
-             style="stop-color:#81D1DB"
-             offset="1" />
-        </linearGradient>
-        <rect
-           id="rect82999"
-           height="5.3839998"
-           width="5.3839998"
-           clip-path="url(#SVGID_4641_)"
-           y="320.42899"
-           x="-636.69897"
-           style="fill:url(#SVGID_4642_)" />
+         id="g29086"
+         transform="matrix(0.44444444,0,0,0.44444444,-774.10444,27.578499)">
+        <g
+           id="g29084"
+           transform="translate(1e-5)">
+          <g
+             id="g29082">
+            <g
+               id="g29080">
+              <rect
+                 style="opacity:0.61;fill:#000000;stroke-width:1.00094"
+                 id="rect29078"
+                 width="439.00146"
+                 height="696.97461"
+                 x="122.01721"
+                 y="152.74527" />
+            </g>
+          </g>
+        </g>
       </g>
       </g>
+    </clipPath>
+    <clipPath
+       clipPathUnits="userSpaceOnUse"
+       id="clipPath29143">
       <g
       <g
-         inkscape:transform-center-y="45.667929"
-         inkscape:transform-center-x="511.76858"
-         id="g83001"
-         transform="matrix(2.25,0,0,2.25,1605.7731,-25.560183)">
-        <defs
-           id="defs83003">
-          <rect
-             height="205.44099"
-             width="200.271"
-             y="181.315"
-             x="-682.31403"
-             id="SVGID_4643_" />
-        </defs>
-        <clipPath
-           id="clipPath102246">
-          <use
-             id="use102248"
-             overflow="visible"
-             xlink:href="#SVGID_4643_"
-             style="overflow:visible"
-             x="0"
-             y="0"
-             width="744.09448"
-             height="1052.3622" />
-        </clipPath>
-        <path
-           id="path83009"
-           d="m -634.639,323.119 c 0,-0.349 0.283,-0.631 0.632,-0.631 0.351,0 0.634,0.282 0.634,0.631 0,0.35 -0.283,0.633 -0.634,0.633 -0.349,0 -0.632,-0.283 -0.632,-0.633"
-           clip-path="url(#SVGID_4644_)"
-           inkscape:connector-curvature="0"
-           style="fill:#ffffff" />
-        <rect
-           id="rect83011"
-           height="9.5930004"
-           width="9.592"
-           clip-path="url(#SVGID_4644_)"
-           y="318.323"
-           x="-626.83099"
-           style="fill:#ffffff" />
-        <rect
-           id="rect83013"
-           height="9.5930004"
-           width="9.592"
-           stroke-miterlimit="10"
-           clip-path="url(#SVGID_4644_)"
-           y="318.323"
-           x="-626.83099"
-           style="fill:none;stroke:#81d0db;stroke-width:0.428;stroke-miterlimit:10" />
-        <rect
-           id="rect83015"
-           height="8.2460003"
-           width="8.2480001"
-           clip-path="url(#SVGID_4644_)"
-           y="318.99701"
-           x="-626.15997"
-           style="fill:#81d0db" />
-        <rect
-           id="rect83017"
-           height="6.9310002"
-           width="6.9299998"
-           clip-path="url(#SVGID_4644_)"
-           y="319.65399"
-           x="-625.5"
-           style="fill:#ffffff" />
-        <rect
-           id="rect83019"
-           height="4.5679998"
-           width="4.5700002"
-           clip-path="url(#SVGID_4644_)"
-           y="320.83499"
-           x="-624.32098"
-           style="fill:#ffffff" />
+         id="g29153"
+         transform="matrix(0.2962963,0,0,0.2962963,-602.80741,109.97993)">
+        <g
+           id="g29151">
+          <g
+             id="g29149">
+            <g
+               id="g29147">
+              <rect
+                 style="opacity:0.61;fill:#000000;stroke-width:1.00094"
+                 id="rect29145"
+                 width="439.00146"
+                 height="696.97461"
+                 x="122.01721"
+                 y="152.74527" />
+            </g>
+          </g>
+        </g>
       </g>
       </g>
+    </clipPath>
+    <clipPath
+       clipPathUnits="userSpaceOnUse"
+       id="clipPath29179">
       <g
       <g
-         inkscape:transform-center-y="45.671291"
-         inkscape:transform-center-x="503.22762"
-         id="g83021"
-         transform="matrix(2.25,0,0,2.25,1605.7731,-25.560183)">
-        <defs
-           id="defs83023">
-          <path
-             d="m -624.728,323.119 c 0,1.487 1.206,2.694 2.693,2.694 1.487,0 2.691,-1.207 2.691,-2.694 0,-1.486 -1.204,-2.69 -2.691,-2.69 -1.487,0 -2.693,1.204 -2.693,2.69"
-             id="SVGID_4645_"
-             inkscape:connector-curvature="0" />
-        </defs>
-        <clipPath
-           id="clipPath102259">
-          <use
-             id="use102261"
-             overflow="visible"
-             xlink:href="#SVGID_4645_"
-             style="overflow:visible"
-             x="0"
-             y="0"
-             width="744.09448"
-             height="1052.3622" />
-        </clipPath>
-        <linearGradient
-           gradientTransform="matrix(0,5.3836,5.3836,0,177.2143,-1054.4158)"
-           y2="-148.4601"
-           x2="256.37631"
-           y1="-148.4601"
-           x1="255.37621"
-           gradientUnits="userSpaceOnUse"
-           id="linearGradient102263">
-          <stop
-             id="stop102265"
-             style="stop-color:#55AEB9"
-             offset="0" />
-          <stop
-             id="stop102267"
-             style="stop-color:#81D1DB"
-             offset="1" />
-        </linearGradient>
-        <rect
-           id="rect83034"
-           height="5.3839998"
-           width="5.3839998"
-           clip-path="url(#SVGID_4646_)"
-           y="320.42899"
-           x="-624.72803"
-           style="fill:url(#SVGID_4647_)" />
-      </g>
-      <g
-         inkscape:transform-center-y="45.667929"
-         inkscape:transform-center-x="484.83387"
-         id="g83036"
-         transform="matrix(2.25,0,0,2.25,1605.7731,-25.560183)">
-        <defs
-           id="defs83038">
-          <rect
-             height="205.44099"
-             width="200.271"
-             y="181.315"
-             x="-682.31403"
-             id="SVGID_4648_" />
-        </defs>
-        <clipPath
-           id="clipPath102273">
-          <use
-             id="use102275"
-             overflow="visible"
-             xlink:href="#SVGID_4648_"
-             style="overflow:visible"
-             x="0"
-             y="0"
-             width="744.09448"
-             height="1052.3622" />
-        </clipPath>
-        <path
-           id="path83044"
-           d="m -622.668,323.119 c 0,-0.349 0.283,-0.631 0.632,-0.631 0.351,0 0.634,0.282 0.634,0.631 0,0.35 -0.283,0.633 -0.634,0.633 -0.349,0 -0.632,-0.283 -0.632,-0.633"
-           clip-path="url(#SVGID_4649_)"
-           inkscape:connector-curvature="0"
-           style="fill:#ffffff" />
-        <rect
-           id="rect83046"
-           height="9.5930004"
-           width="9.5930004"
-           clip-path="url(#SVGID_4649_)"
-           y="318.323"
-           x="-614.85999"
-           style="fill:#ffffff" />
-        <rect
-           id="rect83048"
-           height="9.5930004"
-           width="9.5930004"
-           stroke-miterlimit="10"
-           clip-path="url(#SVGID_4649_)"
-           y="318.323"
-           x="-614.86102"
-           style="fill:none;stroke:#81d0db;stroke-width:0.428;stroke-miterlimit:10" />
-        <rect
-           id="rect83050"
-           height="8.2460003"
-           width="8.2480001"
-           clip-path="url(#SVGID_4649_)"
-           y="318.99701"
-           x="-614.18799"
-           style="fill:#81d0db" />
-        <rect
-           id="rect83052"
-           height="6.9310002"
-           width="6.9310002"
-           clip-path="url(#SVGID_4649_)"
-           y="319.65399"
-           x="-613.52899"
-           style="fill:#ffffff" />
-        <rect
-           id="rect83054"
-           height="4.5679998"
-           width="4.5700002"
-           clip-path="url(#SVGID_4649_)"
-           y="320.83499"
-           x="-612.349"
-           style="fill:#ffffff" />
-      </g>
-      <g
-         inkscape:transform-center-y="45.671291"
-         inkscape:transform-center-x="476.2917"
-         id="g83056"
-         transform="matrix(2.25,0,0,2.25,1605.7731,-25.560183)">
-        <defs
-           id="defs83058">
-          <path
-             d="m -612.756,323.119 c 0,1.487 1.206,2.694 2.692,2.694 1.487,0 2.691,-1.207 2.691,-2.694 0,-1.486 -1.204,-2.69 -2.691,-2.69 -1.486,0 -2.692,1.204 -2.692,2.69"
-             id="SVGID_4650_"
-             inkscape:connector-curvature="0" />
-        </defs>
-        <clipPath
-           id="clipPath102286">
-          <use
-             id="use102288"
-             overflow="visible"
-             xlink:href="#SVGID_4650_"
-             style="overflow:visible"
-             x="0"
-             y="0"
-             width="744.09448"
-             height="1052.3622" />
-        </clipPath>
-        <linearGradient
-           gradientTransform="matrix(0,5.3836,5.3836,0,189.1858,-1054.4158)"
-           y2="-148.4601"
-           x2="256.37631"
-           y1="-148.4601"
-           x1="255.37621"
-           gradientUnits="userSpaceOnUse"
-           id="linearGradient102290">
-          <stop
-             id="stop102292"
-             style="stop-color:#55AEB9"
-             offset="0" />
-          <stop
-             id="stop102294"
-             style="stop-color:#81D1DB"
-             offset="1" />
-        </linearGradient>
-        <rect
-           id="rect83069"
-           height="5.3839998"
-           width="5.3829999"
-           clip-path="url(#SVGID_4651_)"
-           y="320.42899"
-           x="-612.75598"
-           style="fill:url(#SVGID_4652_)" />
+         id="g29189">
+        <g
+           id="g29187">
+          <g
+             id="g29185">
+            <g
+               id="g29183">
+              <rect
+                 style="opacity:0.61;fill:#000000;stroke-width:1.00094"
+                 id="rect29181"
+                 width="439.00146"
+                 height="696.97461"
+                 x="122.01721"
+                 y="152.74527" />
+            </g>
+          </g>
+        </g>
       </g>
       </g>
+    </clipPath>
+    <defs
+       id="defs84291">
+      <polygon
+         id="SVGID_4823_"
+         points="-569.802,251.283 -569.804,231.934 -615.653,231.929 -615.653,251.221 -592.788,256.788 " />
+    </defs>
+    <clipPath
+       id="clipPath103235">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4823_"
+         overflow="visible"
+         id="use103237" />
+    </clipPath>
+    <linearGradient
+       id="linearGradient103239"
+       gradientUnits="userSpaceOnUse"
+       x1="145.3168"
+       y1="2.8518"
+       x2="146.3168"
+       y2="2.8518"
+       gradientTransform="matrix(0.0299,24.8865,24.8865,-0.0299,-668.057,-3384.4426)">
+      <stop
+         offset="0"
+         style="stop-color:#FFFFFF"
+         id="stop103241" />
+      <stop
+         offset="0.23"
+         style="stop-color:#FFFFFF"
+         id="stop103243" />
+      <stop
+         offset="0.5671"
+         style="stop-color:#F9F9F9"
+         id="stop103245" />
+      <stop
+         offset="0.8674"
+         style="stop-color:#EDEEEE"
+         id="stop103247" />
+      <stop
+         offset="1"
+         style="stop-color:#E6E8E7"
+         id="stop103249" />
+    </linearGradient>
+    <clipPath
+       clipPathUnits="userSpaceOnUse"
+       id="clipPath29212">
       <g
       <g
-         inkscape:transform-center-y="45.667929"
-         inkscape:transform-center-x="444.42945"
-         id="g83071"
-         transform="matrix(2.25,0,0,2.25,1605.7731,-25.560183)">
-        <defs
-           id="defs83073">
-          <rect
-             height="205.44099"
-             width="200.271"
-             y="181.315"
-             x="-682.31403"
-             id="SVGID_4653_" />
-        </defs>
-        <clipPath
-           id="clipPath102300">
-          <use
-             id="use102302"
-             overflow="visible"
-             xlink:href="#SVGID_4653_"
-             style="overflow:visible"
-             x="0"
-             y="0"
-             width="744.09448"
-             height="1052.3622" />
-        </clipPath>
-        <path
-           id="path83079"
-           d="m -610.696,323.119 c 0,-0.349 0.283,-0.631 0.632,-0.631 0.351,0 0.634,0.282 0.634,0.631 0,0.35 -0.283,0.633 -0.634,0.633 -0.349,0 -0.632,-0.283 -0.632,-0.633"
-           clip-path="url(#SVGID_4654_)"
-           inkscape:connector-curvature="0"
-           style="fill:#ffffff" />
-        <rect
-           id="rect83081"
-           height="9.5930004"
-           width="9.592"
-           clip-path="url(#SVGID_4654_)"
-           y="318.323"
-           x="-590.91699"
-           style="fill:#ffffff" />
-        <rect
-           id="rect83083"
-           height="9.5930004"
-           width="9.592"
-           stroke-miterlimit="10"
-           clip-path="url(#SVGID_4654_)"
-           y="318.323"
-           x="-590.91699"
-           style="fill:none;stroke:#81d0db;stroke-width:0.428;stroke-miterlimit:10" />
-        <rect
-           id="rect83085"
-           height="8.2460003"
-           width="8.2480001"
-           clip-path="url(#SVGID_4654_)"
-           y="318.99701"
-           x="-590.24597"
-           style="fill:#81d0db" />
-        <rect
-           id="rect83087"
-           height="6.9310002"
-           width="6.9299998"
-           clip-path="url(#SVGID_4654_)"
-           y="319.65399"
-           x="-589.586"
-           style="fill:#ffffff" />
-        <rect
-           id="rect83089"
-           height="4.5679998"
-           width="4.5700002"
-           clip-path="url(#SVGID_4654_)"
-           y="320.83499"
-           x="-588.40698"
-           style="fill:#ffffff" />
+         id="g29222"
+         transform="matrix(0.44444444,0,0,0.44444444,-774.10444,27.578499)">
+        <g
+           id="g29220"
+           transform="translate(1e-5)">
+          <g
+             id="g29218">
+            <g
+               id="g29216">
+              <rect
+                 style="opacity:0.61;fill:#000000;stroke-width:1.00094"
+                 id="rect29214"
+                 width="439.00146"
+                 height="696.97461"
+                 x="122.01721"
+                 y="152.74527" />
+            </g>
+          </g>
+        </g>
       </g>
       </g>
+    </clipPath>
+    <defs
+       id="defs84755">
+      <rect
+         id="SVGID_4867_"
+         x="-682.31403"
+         y="181.315"
+         width="200.271"
+         height="205.44099" />
+    </defs>
+    <clipPath
+       id="clipPath103568">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4867_"
+         overflow="visible"
+         id="use103570" />
+    </clipPath>
+    <defs
+       id="defs84652">
+      <polygon
+         id="SVGID_4854_"
+         points="-521.64,203.458 -523.432,206 -521.64,208.524 -507.673,208.524 -507.673,203.458 " />
+    </defs>
+    <clipPath
+       id="clipPath126888">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4854_"
+         overflow="visible"
+         id="use126890" />
+    </clipPath>
+    <linearGradient
+       id="linearGradient126892"
+       gradientUnits="userSpaceOnUse"
+       x1="-34.205299"
+       y1="249.94031"
+       x2="-33.205101"
+       y2="249.94031"
+       gradientTransform="matrix(0,-5.065,-5.065,0,750.4031,35.2731)">
+      <stop
+         offset="0"
+         style="stop-color:#E6E8E7"
+         id="stop126894" />
+      <stop
+         offset="1"
+         style="stop-color:#FFFFFF"
+         id="stop126896" />
+    </linearGradient>
+    <clipPath
+       clipPathUnits="userSpaceOnUse"
+       id="clipPath29248">
       <g
       <g
-         inkscape:transform-center-y="45.671291"
-         inkscape:transform-center-x="422.41995"
-         id="g83091"
-         transform="matrix(2.25,0,0,2.25,1605.7731,-25.560183)">
-        <defs
-           id="defs83093">
-          <path
-             d="m -588.813,323.119 c 0,1.487 1.205,2.694 2.692,2.694 1.487,0 2.691,-1.207 2.691,-2.694 0,-1.486 -1.204,-2.69 -2.691,-2.69 -1.487,0 -2.692,1.204 -2.692,2.69"
-             id="SVGID_4655_"
-             inkscape:connector-curvature="0" />
-        </defs>
-        <clipPath
-           id="clipPath102313">
-          <use
-             id="use102315"
-             overflow="visible"
-             xlink:href="#SVGID_4655_"
-             style="overflow:visible"
-             x="0"
-             y="0"
-             width="744.09448"
-             height="1052.3622" />
-        </clipPath>
-        <linearGradient
-           gradientTransform="matrix(0,5.3836,5.3836,0,213.1288,-1054.4158)"
-           y2="-148.4601"
-           x2="256.37631"
-           y1="-148.4601"
-           x1="255.37621"
-           gradientUnits="userSpaceOnUse"
-           id="linearGradient102317">
-          <stop
-             id="stop102319"
-             style="stop-color:#55AEB9"
-             offset="0" />
-          <stop
-             id="stop102321"
-             style="stop-color:#81D1DB"
-             offset="1" />
-        </linearGradient>
-        <rect
-           id="rect83104"
-           height="5.3839998"
-           width="5.3829999"
-           clip-path="url(#SVGID_4656_)"
-           y="320.42899"
-           x="-588.81299"
-           style="fill:url(#SVGID_4657_)" />
+         id="g29258"
+         transform="matrix(0.2962963,0,0,0.2962963,-648.90222,109.95785)">
+        <g
+           id="g29256"
+           transform="translate(7.4999998e-6,1.375e-5)">
+          <g
+             id="g29254">
+            <g
+               id="g29252">
+              <rect
+                 style="opacity:0.61;fill:#000000;stroke-width:1.00094"
+                 id="rect29250"
+                 width="439.00146"
+                 height="696.97461"
+                 x="122.01721"
+                 y="152.74527" />
+            </g>
+          </g>
+        </g>
       </g>
       </g>
+    </clipPath>
+    <clipPath
+       clipPathUnits="userSpaceOnUse"
+       id="clipPath29955">
       <g
       <g
-         inkscape:transform-center-y="63.583551"
-         inkscape:transform-center-x="440.81033"
-         id="g83316"
-         transform="matrix(2.25,0,0,2.25,1605.7731,-25.560183)">
-        <defs
-           id="defs83318">
-          <rect
-             height="205.44099"
-             width="200.271"
-             y="181.315"
-             x="-682.31403"
-             id="SVGID_4688_" />
-        </defs>
-        <clipPath
-           id="clipPath102489">
-          <use
-             id="use102491"
-             overflow="visible"
-             xlink:href="#SVGID_4688_"
-             style="overflow:visible"
-             x="0"
-             y="0"
-             width="744.09448"
-             height="1052.3622" />
-        </clipPath>
-        <path
-           id="path83324"
-           d="m -514.925,323.119 c 0,-0.349 0.283,-0.631 0.632,-0.631 0.351,0 0.634,0.282 0.634,0.631 0,0.35 -0.283,0.633 -0.634,0.633 -0.349,0 -0.632,-0.283 -0.632,-0.633"
-           clip-path="url(#SVGID_4689_)"
-           inkscape:connector-curvature="0"
-           style="fill:#ffffff" />
-        <rect
-           id="rect83326"
-           height="9.592"
-           width="9.592"
-           clip-path="url(#SVGID_4689_)"
-           y="329.87"
-           x="-674.71698"
-           style="fill:#ffffff" />
-        <rect
-           id="rect83328"
-           height="9.592"
-           width="9.592"
-           stroke-miterlimit="10"
-           clip-path="url(#SVGID_4689_)"
-           y="329.87"
-           x="-674.71698"
-           style="fill:none;stroke:#81d0db;stroke-width:0.428;stroke-miterlimit:10" />
-        <rect
-           id="rect83330"
-           height="8.2469997"
-           width="8.2480001"
-           clip-path="url(#SVGID_4689_)"
-           y="330.543"
-           x="-674.04602"
-           style="fill:#81d0db" />
-        <rect
-           id="rect83332"
-           height="6.9299998"
-           width="6.9299998"
-           clip-path="url(#SVGID_4689_)"
-           y="331.20099"
-           x="-673.38599"
-           style="fill:#ffffff" />
-        <rect
-           id="rect83334"
-           height="4.5679998"
-           width="4.5700002"
-           clip-path="url(#SVGID_4689_)"
-           y="332.38199"
-           x="-672.20697"
-           style="fill:#ffffff" />
+         id="g29965"
+         transform="matrix(0.44444444,0,0,0.44444444,-846.09071,-7.425108)">
+        <g
+           id="g29963">
+          <g
+             id="g29961">
+            <g
+               id="g29959">
+              <rect
+                 style="opacity:0.61;fill:#000000;stroke-width:1.00094"
+                 id="rect29957"
+                 width="439.00146"
+                 height="696.97461"
+                 x="122.01721"
+                 y="152.74527" />
+            </g>
+          </g>
+        </g>
       </g>
       </g>
+    </clipPath>
+    <clipPath
+       clipPathUnits="userSpaceOnUse"
+       id="clipPath29967">
       <g
       <g
-         inkscape:transform-center-y="71.649806"
-         inkscape:transform-center-x="610.97111"
-         id="g83336"
-         transform="matrix(2.25,0,0,2.25,1605.7731,-25.560183)">
-        <defs
-           id="defs83338">
-          <path
-             d="m -672.614,334.666 c 0,1.488 1.206,2.694 2.692,2.694 1.488,0 2.692,-1.206 2.692,-2.694 0,-1.486 -1.204,-2.692 -2.692,-2.692 -1.486,0 -2.692,1.206 -2.692,2.692"
-             id="SVGID_4690_"
-             inkscape:connector-curvature="0" />
-        </defs>
-        <clipPath
-           id="clipPath102502">
-          <use
-             id="use102504"
-             overflow="visible"
-             xlink:href="#SVGID_4690_"
-             style="overflow:visible"
-             x="0"
-             y="0"
-             width="744.09448"
-             height="1052.3622" />
-        </clipPath>
-        <linearGradient
-           gradientTransform="matrix(0,5.3844,5.3844,0,129.2913,-1042.9659)"
-           y2="-148.4301"
-           x2="256.3544"
-           y1="-148.4301"
-           x1="255.3541"
-           gradientUnits="userSpaceOnUse"
-           id="linearGradient102506">
-          <stop
-             id="stop102508"
-             style="stop-color:#55AEB9"
-             offset="0" />
-          <stop
-             id="stop102510"
-             style="stop-color:#81D1DB"
-             offset="1" />
-        </linearGradient>
-        <rect
-           id="rect83349"
-           height="5.3860002"
-           width="5.3839998"
-           clip-path="url(#SVGID_4691_)"
-           y="331.974"
-           x="-672.61401"
-           style="fill:url(#SVGID_4692_)" />
+         id="g29977"
+         transform="matrix(0.44444444,0,0,0.44444444,-846.0464,4.3971142)">
+        <g
+           id="g29975">
+          <g
+             id="g29973">
+            <g
+               id="g29971">
+              <rect
+                 style="opacity:0.61;fill:#000000;stroke-width:1.00094"
+                 id="rect29969"
+                 width="439.00146"
+                 height="696.97461"
+                 x="122.01721"
+                 y="152.74527" />
+            </g>
+          </g>
+        </g>
       </g>
       </g>
+    </clipPath>
+    <clipPath
+       clipPathUnits="userSpaceOnUse"
+       id="clipPath29979">
       <g
       <g
-         inkscape:transform-center-y="71.647547"
-         inkscape:transform-center-x="592.57619"
-         id="g83351"
-         transform="matrix(2.25,0,0,2.25,1605.7731,-25.560183)">
-        <defs
-           id="defs83353">
-          <rect
-             height="205.44099"
-             width="200.271"
-             y="181.315"
-             x="-682.31403"
-             id="SVGID_4693_" />
-        </defs>
-        <clipPath
-           id="clipPath102516">
-          <use
-             id="use102518"
-             overflow="visible"
-             xlink:href="#SVGID_4693_"
-             style="overflow:visible"
-             x="0"
-             y="0"
-             width="744.09448"
-             height="1052.3622" />
-        </clipPath>
-        <path
-           id="path83359"
-           d="m -670.553,334.666 c 0,-0.349 0.283,-0.632 0.632,-0.632 0.351,0 0.634,0.283 0.634,0.632 0,0.35 -0.283,0.633 -0.634,0.633 -0.349,0 -0.632,-0.283 -0.632,-0.633"
-           clip-path="url(#SVGID_4694_)"
-           inkscape:connector-curvature="0"
-           style="fill:#ffffff" />
-        <rect
-           id="rect83361"
-           height="9.592"
-           width="9.592"
-           clip-path="url(#SVGID_4694_)"
-           y="329.87"
-           x="-662.745"
-           style="fill:#ffffff" />
-        <rect
-           id="rect83363"
-           height="9.592"
-           width="9.592"
-           stroke-miterlimit="10"
-           clip-path="url(#SVGID_4694_)"
-           y="329.87"
-           x="-662.74597"
-           style="fill:none;stroke:#81d0db;stroke-width:0.428;stroke-miterlimit:10" />
-        <rect
-           id="rect83365"
-           height="8.2469997"
-           width="8.2480001"
-           clip-path="url(#SVGID_4694_)"
-           y="330.543"
-           x="-662.07397"
-           style="fill:#81d0db" />
-        <rect
-           id="rect83367"
-           height="6.9299998"
-           width="6.9299998"
-           clip-path="url(#SVGID_4694_)"
-           y="331.20099"
-           x="-661.414"
-           style="fill:#ffffff" />
-        <rect
-           id="rect83369"
-           height="4.5679998"
-           width="4.5700002"
-           clip-path="url(#SVGID_4694_)"
-           y="332.38199"
-           x="-660.23499"
-           style="fill:#ffffff" />
+         id="g29989"
+         transform="matrix(0.44444444,0,0,0.44444444,-846.00196,15.95267)">
+        <g
+           id="g29987">
+          <g
+             id="g29985">
+            <g
+               id="g29983">
+              <rect
+                 style="opacity:0.61;fill:#000000;stroke-width:1.00094"
+                 id="rect29981"
+                 width="439.00146"
+                 height="696.97461"
+                 x="122.01721"
+                 y="152.74527" />
+            </g>
+          </g>
+        </g>
       </g>
       </g>
+    </clipPath>
+    <clipPath
+       clipPathUnits="userSpaceOnUse"
+       id="clipPath29991">
       <g
       <g
-         inkscape:transform-center-y="71.648681"
-         inkscape:transform-center-x="584.03412"
-         id="g83371"
-         transform="matrix(2.25,0,0,2.25,1605.7731,-25.560183)">
-        <defs
-           id="defs83373">
-          <path
-             d="m -660.642,334.666 c 0,1.488 1.206,2.694 2.692,2.694 1.488,0 2.692,-1.206 2.692,-2.694 0,-1.486 -1.204,-2.692 -2.692,-2.692 -1.486,0 -2.692,1.206 -2.692,2.692"
-             id="SVGID_4695_"
-             inkscape:connector-curvature="0" />
-        </defs>
-        <clipPath
-           id="clipPath102529">
-          <use
-             id="use102531"
-             overflow="visible"
-             xlink:href="#SVGID_4695_"
-             style="overflow:visible"
-             x="0"
-             y="0"
-             width="744.09448"
-             height="1052.3622" />
-        </clipPath>
-        <linearGradient
-           gradientTransform="matrix(0,5.3844,5.3844,0,141.2627,-1042.9659)"
-           y2="-148.4299"
-           x2="256.35419"
-           y1="-148.4299"
-           x1="255.3541"
-           gradientUnits="userSpaceOnUse"
-           id="linearGradient102533">
-          <stop
-             id="stop102535"
-             style="stop-color:#55AEB9"
-             offset="0" />
-          <stop
-             id="stop102537"
-             style="stop-color:#81D1DB"
-             offset="1" />
-        </linearGradient>
-        <rect
-           id="rect83384"
-           height="5.3850002"
-           width="5.3839998"
-           clip-path="url(#SVGID_4696_)"
-           y="331.974"
-           x="-660.64203"
-           style="fill:url(#SVGID_4697_)" />
+         id="g30001"
+         transform="matrix(0.44444444,0,0,0.44444444,-762.07813,27.363123)">
+        <g
+           id="g29999">
+          <g
+             id="g29997">
+            <g
+               id="g29995">
+              <rect
+                 style="opacity:0.61;fill:#000000;stroke-width:1.00094"
+                 id="rect29993"
+                 width="439.00146"
+                 height="696.97461"
+                 x="122.01721"
+                 y="152.74527" />
+            </g>
+          </g>
+        </g>
       </g>
       </g>
+    </clipPath>
+    <clipPath
+       clipPathUnits="userSpaceOnUse"
+       id="clipPath30003">
       <g
       <g
-         inkscape:transform-center-y="71.647547"
-         inkscape:transform-center-x="565.64033"
-         id="g83386"
-         transform="matrix(2.25,0,0,2.25,1605.7731,-25.560183)">
-        <defs
-           id="defs83388">
-          <rect
-             height="205.44099"
-             width="200.271"
-             y="181.315"
-             x="-682.31403"
-             id="SVGID_4698_" />
-        </defs>
-        <clipPath
-           id="clipPath102543">
-          <use
-             id="use102545"
-             overflow="visible"
-             xlink:href="#SVGID_4698_"
-             style="overflow:visible"
-             x="0"
-             y="0"
-             width="744.09448"
-             height="1052.3622" />
-        </clipPath>
-        <path
-           id="path83394"
-           d="m -658.582,334.666 c 0,-0.349 0.283,-0.632 0.632,-0.632 0.351,0 0.634,0.283 0.634,0.632 0,0.35 -0.283,0.633 -0.634,0.633 -0.349,0 -0.632,-0.283 -0.632,-0.633"
-           clip-path="url(#SVGID_4699_)"
-           inkscape:connector-curvature="0"
-           style="fill:#ffffff" />
-        <rect
-           id="rect83396"
-           height="9.592"
-           width="9.592"
-           clip-path="url(#SVGID_4699_)"
-           y="329.87"
-           x="-650.77399"
-           style="fill:#ffffff" />
-        <rect
-           id="rect83398"
-           height="9.592"
-           width="9.592"
-           stroke-miterlimit="10"
-           clip-path="url(#SVGID_4699_)"
-           y="329.87"
-           x="-650.77399"
-           style="fill:none;stroke:#81d0db;stroke-width:0.428;stroke-miterlimit:10" />
-        <rect
-           id="rect83400"
-           height="8.2469997"
-           width="8.2480001"
-           clip-path="url(#SVGID_4699_)"
-           y="330.543"
-           x="-650.10303"
-           style="fill:#81d0db" />
-        <rect
-           id="rect83402"
-           height="6.9299998"
-           width="6.9299998"
-           clip-path="url(#SVGID_4699_)"
-           y="331.20099"
-           x="-649.44299"
-           style="fill:#ffffff" />
-        <rect
-           id="rect83404"
-           height="4.5679998"
-           width="4.5700002"
-           clip-path="url(#SVGID_4699_)"
-           y="332.38199"
-           x="-648.26398"
-           style="fill:#ffffff" />
+         id="g30013"
+         transform="matrix(0.44444444,0,0,0.44444444,-846.00196,27.53667)">
+        <g
+           id="g30011">
+          <g
+             id="g30009">
+            <g
+               id="g30007">
+              <rect
+                 style="opacity:0.61;fill:#000000;stroke-width:1.00094"
+                 id="rect30005"
+                 width="439.00146"
+                 height="696.97461"
+                 x="122.01721"
+                 y="152.74527" />
+            </g>
+          </g>
+        </g>
       </g>
       </g>
+    </clipPath>
+    <clipPath
+       clipPathUnits="userSpaceOnUse"
+       id="clipPath30015">
       <g
       <g
-         inkscape:transform-center-y="71.649806"
-         inkscape:transform-center-x="557.09937"
-         id="g83406"
-         transform="matrix(2.25,0,0,2.25,1605.7731,-25.560183)">
-        <defs
-           id="defs83408">
-          <path
-             d="m -648.671,334.666 c 0,1.488 1.206,2.694 2.692,2.694 1.488,0 2.692,-1.206 2.692,-2.694 0,-1.486 -1.204,-2.692 -2.692,-2.692 -1.486,0 -2.692,1.206 -2.692,2.692"
-             id="SVGID_4700_"
-             inkscape:connector-curvature="0" />
-        </defs>
-        <clipPath
-           id="clipPath102556">
-          <use
-             id="use102558"
-             overflow="visible"
-             xlink:href="#SVGID_4700_"
-             style="overflow:visible"
-             x="0"
-             y="0"
-             width="744.09448"
-             height="1052.3622" />
-        </clipPath>
-        <linearGradient
-           gradientTransform="matrix(0,5.3844,5.3844,0,153.234,-1042.9659)"
-           y2="-148.42999"
-           x2="256.3544"
-           y1="-148.42999"
-           x1="255.3541"
-           gradientUnits="userSpaceOnUse"
-           id="linearGradient102560">
-          <stop
-             id="stop102562"
-             style="stop-color:#55AEB9"
-             offset="0" />
-          <stop
-             id="stop102564"
-             style="stop-color:#81D1DB"
-             offset="1" />
-        </linearGradient>
-        <rect
-           id="rect83419"
-           height="5.3860002"
-           width="5.3839998"
-           clip-path="url(#SVGID_4701_)"
-           y="331.974"
-           x="-648.67102"
-           style="fill:url(#SVGID_4702_)" />
+         id="g30025"
+         transform="matrix(0.44444444,0,0,0.44444444,-774.10444,27.578499)">
+        <g
+           id="g30023">
+          <g
+             id="g30021">
+            <g
+               id="g30019">
+              <rect
+                 style="opacity:0.61;fill:#000000;stroke-width:1.00094"
+                 id="rect30017"
+                 width="439.00146"
+                 height="696.97461"
+                 x="122.01721"
+                 y="152.74527" />
+            </g>
+          </g>
+        </g>
       </g>
       </g>
+    </clipPath>
+    <clipPath
+       clipPathUnits="userSpaceOnUse"
+       id="clipPath30027">
       <g
       <g
-         inkscape:transform-center-y="71.647547"
-         inkscape:transform-center-x="538.70558"
-         id="g83421"
-         transform="matrix(2.25,0,0,2.25,1605.7731,-25.560183)">
-        <defs
-           id="defs83423">
-          <rect
-             height="205.44099"
-             width="200.271"
-             y="181.315"
-             x="-682.31403"
-             id="SVGID_4703_" />
-        </defs>
-        <clipPath
-           id="clipPath102570">
-          <use
-             id="use102572"
-             overflow="visible"
-             xlink:href="#SVGID_4703_"
-             style="overflow:visible"
-             x="0"
-             y="0"
-             width="744.09448"
-             height="1052.3622" />
-        </clipPath>
-        <path
-           id="path83429"
-           d="m -646.611,334.666 c 0,-0.349 0.283,-0.632 0.632,-0.632 0.351,0 0.634,0.283 0.634,0.632 0,0.35 -0.283,0.633 -0.634,0.633 -0.349,0 -0.632,-0.283 -0.632,-0.633"
-           clip-path="url(#SVGID_4704_)"
-           inkscape:connector-curvature="0"
-           style="fill:#ffffff" />
-        <rect
-           id="rect83431"
-           height="9.592"
-           width="9.592"
-           clip-path="url(#SVGID_4704_)"
-           y="329.87"
-           x="-638.80298"
-           style="fill:#ffffff" />
-        <rect
-           id="rect83433"
-           height="9.592"
-           width="9.592"
-           stroke-miterlimit="10"
-           clip-path="url(#SVGID_4704_)"
-           y="329.87"
-           x="-638.80298"
-           style="fill:none;stroke:#81d0db;stroke-width:0.428;stroke-miterlimit:10" />
-        <rect
-           id="rect83435"
-           height="8.2469997"
-           width="8.2480001"
-           clip-path="url(#SVGID_4704_)"
-           y="330.543"
-           x="-638.13202"
-           style="fill:#81d0db" />
-        <rect
-           id="rect83437"
-           height="6.9299998"
-           width="6.9299998"
-           clip-path="url(#SVGID_4704_)"
-           y="331.20099"
-           x="-637.47198"
-           style="fill:#ffffff" />
-        <rect
-           id="rect83439"
-           height="4.5679998"
-           width="4.5700002"
-           clip-path="url(#SVGID_4704_)"
-           y="332.38199"
-           x="-636.29199"
-           style="fill:#ffffff" />
+         id="g30037"
+         transform="matrix(0.44444444,0,0,0.44444444,-774.10444,27.578499)">
+        <g
+           id="g30035">
+          <g
+             id="g30033">
+            <g
+               id="g30031">
+              <rect
+                 style="opacity:0.61;fill:#000000;stroke-width:1.00094"
+                 id="rect30029"
+                 width="439.00146"
+                 height="696.97461"
+                 x="122.01721"
+                 y="152.74527" />
+            </g>
+          </g>
+        </g>
       </g>
       </g>
+    </clipPath>
+    <clipPath
+       clipPathUnits="userSpaceOnUse"
+       id="clipPath30039">
       <g
       <g
-         inkscape:transform-center-y="71.649806"
-         inkscape:transform-center-x="530.16231"
-         id="g83441"
-         transform="matrix(2.25,0,0,2.25,1605.7731,-25.560183)">
-        <defs
-           id="defs83443">
-          <path
-             d="m -636.699,334.666 c 0,1.488 1.206,2.694 2.692,2.694 1.487,0 2.692,-1.206 2.692,-2.694 0,-1.486 -1.205,-2.692 -2.692,-2.692 -1.486,0 -2.692,1.206 -2.692,2.692"
-             id="SVGID_4705_"
-             inkscape:connector-curvature="0" />
-        </defs>
-        <clipPath
-           id="clipPath102583">
-          <use
-             id="use102585"
-             overflow="visible"
-             xlink:href="#SVGID_4705_"
-             style="overflow:visible"
-             x="0"
-             y="0"
-             width="744.09448"
-             height="1052.3622" />
-        </clipPath>
-        <linearGradient
-           gradientTransform="matrix(0,5.3844,5.3844,0,165.2054,-1042.9659)"
-           y2="-148.4299"
-           x2="256.3544"
-           y1="-148.4299"
-           x1="255.3541"
-           gradientUnits="userSpaceOnUse"
-           id="linearGradient102587">
-          <stop
-             id="stop102589"
-             style="stop-color:#55AEB9"
-             offset="0" />
-          <stop
-             id="stop102591"
-             style="stop-color:#81D1DB"
-             offset="1" />
-        </linearGradient>
-        <rect
-           id="rect83454"
-           height="5.3860002"
-           width="5.3839998"
-           clip-path="url(#SVGID_4706_)"
-           y="331.974"
-           x="-636.69897"
-           style="fill:url(#SVGID_4707_)" />
+         id="g30049"
+         transform="matrix(0.44444444,0,0,0.44444444,-774.10444,27.578499)">
+        <g
+           id="g30047">
+          <g
+             id="g30045">
+            <g
+               id="g30043">
+              <rect
+                 style="opacity:0.61;fill:#000000;stroke-width:1.00094"
+                 id="rect30041"
+                 width="439.00146"
+                 height="696.97461"
+                 x="122.01721"
+                 y="152.74527" />
+            </g>
+          </g>
+        </g>
       </g>
       </g>
+    </clipPath>
+    <clipPath
+       clipPathUnits="userSpaceOnUse"
+       id="clipPath30051">
       <g
       <g
-         inkscape:transform-center-y="71.647547"
-         inkscape:transform-center-x="498.30125"
-         id="g83456"
-         transform="matrix(2.25,0,0,2.25,1605.7731,-25.560183)">
-        <defs
-           id="defs83458">
-          <rect
-             height="205.44099"
-             width="200.271"
-             y="181.315"
-             x="-682.31403"
-             id="SVGID_4708_" />
-        </defs>
-        <clipPath
-           id="clipPath102597">
-          <use
-             id="use102599"
-             overflow="visible"
-             xlink:href="#SVGID_4708_"
-             style="overflow:visible"
-             x="0"
-             y="0"
-             width="744.09448"
-             height="1052.3622" />
-        </clipPath>
-        <path
-           id="path83464"
-           d="m -634.639,334.666 c 0,-0.349 0.283,-0.632 0.632,-0.632 0.351,0 0.634,0.283 0.634,0.632 0,0.35 -0.283,0.633 -0.634,0.633 -0.349,0 -0.632,-0.283 -0.632,-0.633"
-           clip-path="url(#SVGID_4709_)"
-           inkscape:connector-curvature="0"
-           style="fill:#ffffff" />
-        <rect
-           id="rect83466"
-           height="9.592"
-           width="9.5930004"
-           clip-path="url(#SVGID_4709_)"
-           y="329.87"
-           x="-614.85999"
-           style="fill:#ffffff" />
-        <rect
-           id="rect83468"
-           height="9.592"
-           width="9.5930004"
-           stroke-miterlimit="10"
-           clip-path="url(#SVGID_4709_)"
-           y="329.87"
-           x="-614.86102"
-           style="fill:none;stroke:#81d0db;stroke-width:0.428;stroke-miterlimit:10" />
-        <rect
-           id="rect83470"
-           height="8.2469997"
-           width="8.2480001"
-           clip-path="url(#SVGID_4709_)"
-           y="330.543"
-           x="-614.18799"
-           style="fill:#81d0db" />
-        <rect
-           id="rect83472"
-           height="6.9299998"
-           width="6.9310002"
-           clip-path="url(#SVGID_4709_)"
-           y="331.20099"
-           x="-613.52899"
-           style="fill:#ffffff" />
-        <rect
-           id="rect83474"
-           height="4.5679998"
-           width="4.5700002"
-           clip-path="url(#SVGID_4709_)"
-           y="332.38199"
-           x="-612.349"
-           style="fill:#ffffff" />
+         id="g30061"
+         transform="matrix(0.44444444,0,0,0.44444444,-774.10444,27.578499)">
+        <g
+           id="g30059">
+          <g
+             id="g30057">
+            <g
+               id="g30055">
+              <rect
+                 style="opacity:0.61;fill:#000000;stroke-width:1.00094"
+                 id="rect30053"
+                 width="439.00146"
+                 height="696.97461"
+                 x="122.01721"
+                 y="152.74527" />
+            </g>
+          </g>
+        </g>
       </g>
       </g>
+    </clipPath>
+    <clipPath
+       clipPathUnits="userSpaceOnUse"
+       id="clipPath30063">
       <g
       <g
-         inkscape:transform-center-y="71.649806"
-         inkscape:transform-center-x="476.2917"
-         id="g83476"
-         transform="matrix(2.25,0,0,2.25,1605.7731,-25.560183)">
-        <defs
-           id="defs83478">
-          <path
-             d="m -612.756,334.666 c 0,1.488 1.206,2.694 2.692,2.694 1.487,0 2.691,-1.206 2.691,-2.694 0,-1.486 -1.204,-2.692 -2.691,-2.692 -1.486,0 -2.692,1.206 -2.692,2.692"
-             id="SVGID_4710_"
-             inkscape:connector-curvature="0" />
-        </defs>
-        <clipPath
-           id="clipPath102610">
-          <use
-             id="use102612"
-             overflow="visible"
-             xlink:href="#SVGID_4710_"
-             style="overflow:visible"
-             x="0"
-             y="0"
-             width="744.09448"
-             height="1052.3622" />
-        </clipPath>
-        <linearGradient
-           gradientTransform="matrix(0,5.3844,5.3844,0,189.1483,-1042.9659)"
-           y2="-148.42999"
-           x2="256.3544"
-           y1="-148.42999"
-           x1="255.3541"
-           gradientUnits="userSpaceOnUse"
-           id="linearGradient102614">
-          <stop
-             id="stop102616"
-             style="stop-color:#55AEB9"
-             offset="0" />
-          <stop
-             id="stop102618"
-             style="stop-color:#81D1DB"
-             offset="1" />
-        </linearGradient>
-        <rect
-           id="rect83489"
-           height="5.3860002"
-           width="5.3829999"
-           clip-path="url(#SVGID_4711_)"
-           y="331.974"
-           x="-612.75598"
-           style="fill:url(#SVGID_4712_)" />
+         id="g30073"
+         transform="matrix(0.44444444,0,0,0.44444444,-774.10444,27.578499)">
+        <g
+           id="g30071">
+          <g
+             id="g30069">
+            <g
+               id="g30067">
+              <rect
+                 style="opacity:0.61;fill:#000000;stroke-width:1.00094"
+                 id="rect30065"
+                 width="439.00146"
+                 height="696.97461"
+                 x="122.01721"
+                 y="152.74527" />
+            </g>
+          </g>
+        </g>
       </g>
       </g>
+    </clipPath>
+    <clipPath
+       clipPathUnits="userSpaceOnUse"
+       id="clipPath30075">
       <g
       <g
-         inkscape:transform-center-y="71.647547"
-         inkscape:transform-center-x="457.89686"
-         id="g83491"
-         transform="matrix(2.25,0,0,2.25,1605.7731,-25.560183)">
-        <defs
-           id="defs83493">
-          <rect
-             height="205.44099"
-             width="200.271"
-             y="181.315"
-             x="-682.31403"
-             id="SVGID_4713_" />
-        </defs>
-        <clipPath
-           id="clipPath102624">
-          <use
-             id="use102626"
-             overflow="visible"
-             xlink:href="#SVGID_4713_"
-             style="overflow:visible"
-             x="0"
-             y="0"
-             width="744.09448"
-             height="1052.3622" />
-        </clipPath>
-        <path
-           id="path83499"
-           d="m -610.696,334.666 c 0,-0.349 0.283,-0.632 0.632,-0.632 0.351,0 0.634,0.283 0.634,0.632 0,0.35 -0.283,0.633 -0.634,0.633 -0.349,0 -0.632,-0.283 -0.632,-0.633"
-           clip-path="url(#SVGID_4714_)"
-           inkscape:connector-curvature="0"
-           style="fill:#ffffff" />
-        <rect
-           id="rect83501"
-           height="9.592"
-           width="9.592"
-           clip-path="url(#SVGID_4714_)"
-           y="329.87"
-           x="-602.888"
-           style="fill:#ffffff" />
-        <rect
-           id="rect83503"
-           height="9.592"
-           width="9.592"
-           stroke-miterlimit="10"
-           clip-path="url(#SVGID_4714_)"
-           y="329.87"
-           x="-602.888"
-           style="fill:none;stroke:#81d0db;stroke-width:0.428;stroke-miterlimit:10" />
-        <rect
-           id="rect83505"
-           height="8.2469997"
-           width="8.2480001"
-           clip-path="url(#SVGID_4714_)"
-           y="330.543"
-           x="-602.21698"
-           style="fill:#81d0db" />
-        <rect
-           id="rect83507"
-           height="6.9299998"
-           width="6.9299998"
-           clip-path="url(#SVGID_4714_)"
-           y="331.20099"
-           x="-601.55701"
-           style="fill:#ffffff" />
-        <rect
-           id="rect83509"
-           height="4.5679998"
-           width="4.5700002"
-           clip-path="url(#SVGID_4714_)"
-           y="332.38199"
-           x="-600.37799"
-           style="fill:#ffffff" />
+         id="g30085"
+         transform="matrix(0.44444444,0,0,0.44444444,-774.10444,27.578499)">
+        <g
+           id="g30083">
+          <g
+             id="g30081">
+            <g
+               id="g30079">
+              <rect
+                 style="opacity:0.61;fill:#000000;stroke-width:1.00094"
+                 id="rect30077"
+                 width="439.00146"
+                 height="696.97461"
+                 x="122.01721"
+                 y="152.74527" />
+            </g>
+          </g>
+        </g>
       </g>
       </g>
+    </clipPath>
+    <clipPath
+       clipPathUnits="userSpaceOnUse"
+       id="clipPath30411">
       <g
       <g
-         inkscape:transform-center-y="71.649806"
-         inkscape:transform-center-x="449.35694"
-         id="g83511"
-         transform="matrix(2.25,0,0,2.25,1605.7731,-25.560183)">
-        <defs
-           id="defs83513">
-          <path
-             d="m -600.785,334.666 c 0,1.488 1.206,2.694 2.692,2.694 1.488,0 2.691,-1.206 2.691,-2.694 0,-1.486 -1.203,-2.692 -2.691,-2.692 -1.486,0 -2.692,1.206 -2.692,2.692"
-             id="SVGID_4715_"
-             inkscape:connector-curvature="0" />
-        </defs>
-        <clipPath
-           id="clipPath102637">
-          <use
-             id="use102639"
-             overflow="visible"
-             xlink:href="#SVGID_4715_"
-             style="overflow:visible"
-             x="0"
-             y="0"
-             width="744.09448"
-             height="1052.3622" />
-        </clipPath>
-        <linearGradient
-           gradientTransform="matrix(0,5.3844,5.3844,0,201.1199,-1042.9659)"
-           y2="-148.4301"
-           x2="256.3544"
-           y1="-148.4301"
-           x1="255.3541"
-           gradientUnits="userSpaceOnUse"
-           id="linearGradient102641">
-          <stop
-             id="stop102643"
-             style="stop-color:#55AEB9"
-             offset="0" />
-          <stop
-             id="stop102645"
-             style="stop-color:#81D1DB"
-             offset="1" />
-        </linearGradient>
-        <rect
-           id="rect83524"
-           height="5.3860002"
-           width="5.3829999"
-           clip-path="url(#SVGID_4716_)"
-           y="331.974"
-           x="-600.78497"
-           style="fill:url(#SVGID_4717_)" />
+         id="g30421"
+         transform="matrix(0.44444444,0,0,0.44444444,-774.10444,27.578499)">
+        <g
+           id="g30419">
+          <g
+             id="g30417">
+            <g
+               id="g30415">
+              <rect
+                 style="opacity:0.61;fill:#000000;stroke-width:1.00094"
+                 id="rect30413"
+                 width="439.00146"
+                 height="696.97461"
+                 x="122.01721"
+                 y="152.74527" />
+            </g>
+          </g>
+        </g>
       </g>
       </g>
+    </clipPath>
+    <clipPath
+       clipPathUnits="userSpaceOnUse"
+       id="clipPath30423">
       <g
       <g
-         inkscape:transform-center-y="71.647547"
-         inkscape:transform-center-x="430.96208"
-         id="g83526"
-         transform="matrix(2.25,0,0,2.25,1605.7731,-25.560183)">
-        <defs
-           id="defs83528">
-          <rect
-             height="205.44099"
-             width="200.271"
-             y="181.315"
-             x="-682.31403"
-             id="SVGID_4718_" />
-        </defs>
-        <clipPath
-           id="clipPath102651">
-          <use
-             id="use102653"
-             overflow="visible"
-             xlink:href="#SVGID_4718_"
-             style="overflow:visible"
-             x="0"
-             y="0"
-             width="744.09448"
-             height="1052.3622" />
-        </clipPath>
-        <path
-           id="path83534"
-           d="m -598.725,334.666 c 0,-0.349 0.283,-0.632 0.632,-0.632 0.351,0 0.634,0.283 0.634,0.632 0,0.35 -0.283,0.633 -0.634,0.633 -0.349,0 -0.632,-0.283 -0.632,-0.633"
-           clip-path="url(#SVGID_4719_)"
-           inkscape:connector-curvature="0"
-           style="fill:#ffffff" />
-        <rect
-           id="rect83536"
-           height="9.592"
-           width="9.592"
-           clip-path="url(#SVGID_4719_)"
-           y="329.87"
-           x="-590.91699"
-           style="fill:#ffffff" />
-        <rect
-           id="rect83538"
-           height="9.592"
-           width="9.592"
-           stroke-miterlimit="10"
-           clip-path="url(#SVGID_4719_)"
-           y="329.87"
-           x="-590.91699"
-           style="fill:none;stroke:#81d0db;stroke-width:0.428;stroke-miterlimit:10" />
-        <rect
-           id="rect83540"
-           height="8.2469997"
-           width="8.2480001"
-           clip-path="url(#SVGID_4719_)"
-           y="330.543"
-           x="-590.24597"
-           style="fill:#81d0db" />
-        <rect
-           id="rect83542"
-           height="6.9299998"
-           width="6.9299998"
-           clip-path="url(#SVGID_4719_)"
-           y="331.20099"
-           x="-589.586"
-           style="fill:#ffffff" />
-        <rect
-           id="rect83544"
-           height="4.5679998"
-           width="4.5700002"
-           clip-path="url(#SVGID_4719_)"
-           y="332.38199"
-           x="-588.40698"
-           style="fill:#ffffff" />
-      </g>
-      <g
-         inkscape:transform-center-y="71.649806"
-         inkscape:transform-center-x="422.41995"
-         id="g83546"
-         transform="matrix(2.25,0,0,2.25,1605.7731,-25.560183)">
-        <defs
-           id="defs83548">
-          <path
-             d="m -588.813,334.666 c 0,1.488 1.205,2.694 2.692,2.694 1.487,0 2.691,-1.206 2.691,-2.694 0,-1.486 -1.204,-2.692 -2.691,-2.692 -1.487,0 -2.692,1.206 -2.692,2.692"
-             id="SVGID_4720_"
-             inkscape:connector-curvature="0" />
-        </defs>
-        <clipPath
-           id="clipPath102664">
-          <use
-             id="use102666"
-             overflow="visible"
-             xlink:href="#SVGID_4720_"
-             style="overflow:visible"
-             x="0"
-             y="0"
-             width="744.09448"
-             height="1052.3622" />
-        </clipPath>
-        <linearGradient
-           gradientTransform="matrix(0,5.3844,5.3844,0,213.0913,-1042.9659)"
-           y2="-148.42999"
-           x2="256.3544"
-           y1="-148.42999"
-           x1="255.3541"
-           gradientUnits="userSpaceOnUse"
-           id="linearGradient102668">
-          <stop
-             id="stop102670"
-             style="stop-color:#55AEB9"
-             offset="0" />
-          <stop
-             id="stop102672"
-             style="stop-color:#81D1DB"
-             offset="1" />
-        </linearGradient>
-        <rect
-           id="rect83559"
-           height="5.3860002"
-           width="5.3829999"
-           clip-path="url(#SVGID_4721_)"
-           y="331.974"
-           x="-588.81299"
-           style="fill:url(#SVGID_4722_)" />
-      </g>
-      <g
-         inkscape:transform-center-y="89.828699"
-         inkscape:transform-center-x="440.81033"
-         id="g83736"
-         transform="matrix(2.25,0,0,2.25,1605.7731,-25.560183)">
-        <defs
-           id="defs83738">
-          <rect
-             height="205.44099"
-             width="200.271"
-             y="181.315"
-             x="-682.31403"
-             id="SVGID_4748_" />
-        </defs>
-        <clipPath
-           id="clipPath102813">
-          <use
-             id="use102815"
-             overflow="visible"
-             xlink:href="#SVGID_4748_"
-             style="overflow:visible"
-             x="0"
-             y="0"
-             width="744.09448"
-             height="1052.3622" />
-        </clipPath>
-        <path
-           id="path83744"
-           d="m -514.925,334.666 c 0,-0.349 0.283,-0.632 0.632,-0.632 0.351,0 0.634,0.283 0.634,0.632 0,0.35 -0.283,0.633 -0.634,0.633 -0.349,0 -0.632,-0.283 -0.632,-0.633"
-           clip-path="url(#SVGID_4749_)"
-           inkscape:connector-curvature="0"
-           style="fill:#ffffff" />
-        <rect
-           id="rect83746"
-           height="9.592"
-           width="9.592"
-           clip-path="url(#SVGID_4749_)"
-           y="341.65302"
-           x="-674.71698"
-           style="fill:#ffffff" />
-        <rect
-           id="rect83748"
-           height="9.592"
-           width="9.592"
-           stroke-miterlimit="10"
-           clip-path="url(#SVGID_4749_)"
-           y="341.65302"
-           x="-674.71698"
-           style="fill:none;stroke:#81d0db;stroke-width:0.428;stroke-miterlimit:10" />
-        <rect
-           id="rect83750"
-           height="8.2469997"
-           width="8.2480001"
-           clip-path="url(#SVGID_4749_)"
-           y="342.32599"
-           x="-674.04602"
-           style="fill:#81d0db" />
-        <rect
-           id="rect83752"
-           height="6.9299998"
-           width="6.9299998"
-           clip-path="url(#SVGID_4749_)"
-           y="342.98401"
-           x="-673.38599"
-           style="fill:#ffffff" />
-        <rect
-           id="rect83754"
-           height="4.5679998"
-           width="4.5700002"
-           clip-path="url(#SVGID_4749_)"
-           y="344.164"
-           x="-672.20697"
-           style="fill:#ffffff" />
+         id="g30433"
+         transform="matrix(0.44444444,0,0,0.44444444,-774.10444,27.578499)">
+        <g
+           id="g30431">
+          <g
+             id="g30429">
+            <g
+               id="g30427">
+              <rect
+                 style="opacity:0.61;fill:#000000;stroke-width:1.00094"
+                 id="rect30425"
+                 width="439.00146"
+                 height="696.97461"
+                 x="122.01721"
+                 y="152.74527" />
+            </g>
+          </g>
+        </g>
       </g>
       </g>
+    </clipPath>
+    <clipPath
+       clipPathUnits="userSpaceOnUse"
+       id="clipPath30435">
       <g
       <g
-         inkscape:transform-center-y="98.159295"
-         inkscape:transform-center-x="610.97111"
-         id="g83756"
-         transform="matrix(2.25,0,0,2.25,1605.7731,-25.560183)">
-        <defs
-           id="defs83758">
-          <path
-             d="m -672.614,346.449 c 0,1.487 1.206,2.692 2.692,2.692 1.488,0 2.692,-1.205 2.692,-2.692 0,-1.486 -1.204,-2.692 -2.692,-2.692 -1.486,0 -2.692,1.206 -2.692,2.692"
-             id="SVGID_4750_"
-             inkscape:connector-curvature="0" />
-        </defs>
-        <clipPath
-           id="clipPath102826">
-          <use
-             id="use102828"
-             overflow="visible"
-             xlink:href="#SVGID_4750_"
-             style="overflow:visible"
-             x="0"
-             y="0"
-             width="744.09448"
-             height="1052.3622" />
-        </clipPath>
-        <linearGradient
-           gradientTransform="matrix(0,5.3844,5.3844,0,129.2913,-1031.1833)"
-           y2="-148.4301"
-           x2="256.3541"
-           y1="-148.4301"
-           x1="255.3541"
-           gradientUnits="userSpaceOnUse"
-           id="linearGradient102830">
-          <stop
-             id="stop102832"
-             style="stop-color:#55AEB9"
-             offset="0" />
-          <stop
-             id="stop102834"
-             style="stop-color:#81D1DB"
-             offset="1" />
-        </linearGradient>
-        <rect
-           id="rect83769"
-           height="5.3839998"
-           width="5.3839998"
-           clip-path="url(#SVGID_4751_)"
-           y="343.75699"
-           x="-672.61401"
-           style="fill:url(#SVGID_4752_)" />
+         id="g30445"
+         transform="matrix(0.44444444,0,0,0.44444444,-774.10444,27.578499)">
+        <g
+           id="g30443">
+          <g
+             id="g30441">
+            <g
+               id="g30439">
+              <rect
+                 style="opacity:0.61;fill:#000000;stroke-width:1.00094"
+                 id="rect30437"
+                 width="439.00146"
+                 height="696.97461"
+                 x="122.01721"
+                 y="152.74527" />
+            </g>
+          </g>
+        </g>
       </g>
       </g>
+    </clipPath>
+    <clipPath
+       clipPathUnits="userSpaceOnUse"
+       id="clipPath30447">
       <g
       <g
-         inkscape:transform-center-y="98.159342"
-         inkscape:transform-center-x="592.57619"
-         id="g83771"
-         transform="matrix(2.25,0,0,2.25,1605.7731,-25.560183)">
-        <defs
-           id="defs83773">
-          <rect
-             height="205.44099"
-             width="200.271"
-             y="181.315"
-             x="-682.31403"
-             id="SVGID_4753_" />
-        </defs>
-        <clipPath
-           id="clipPath102840">
-          <use
-             id="use102842"
-             overflow="visible"
-             xlink:href="#SVGID_4753_"
-             style="overflow:visible"
-             x="0"
-             y="0"
-             width="744.09448"
-             height="1052.3622" />
-        </clipPath>
-        <path
-           id="path83779"
-           d="m -670.553,346.449 c 0,-0.349 0.283,-0.632 0.632,-0.632 0.351,0 0.634,0.283 0.634,0.632 0,0.35 -0.283,0.633 -0.634,0.633 -0.349,0 -0.632,-0.283 -0.632,-0.633"
-           clip-path="url(#SVGID_4754_)"
-           inkscape:connector-curvature="0"
-           style="fill:#ffffff" />
-        <rect
-           id="rect83781"
-           height="9.592"
-           width="9.592"
-           clip-path="url(#SVGID_4754_)"
-           y="341.65302"
-           x="-662.745"
-           style="fill:#ffffff" />
-        <rect
-           id="rect83783"
-           height="9.592"
-           width="9.592"
-           stroke-miterlimit="10"
-           clip-path="url(#SVGID_4754_)"
-           y="341.65302"
-           x="-662.74597"
-           style="fill:none;stroke:#81d0db;stroke-width:0.428;stroke-miterlimit:10" />
-        <rect
-           id="rect83785"
-           height="8.2469997"
-           width="8.2480001"
-           clip-path="url(#SVGID_4754_)"
-           y="342.32599"
-           x="-662.07397"
-           style="fill:#81d0db" />
-        <rect
-           id="rect83787"
-           height="6.9299998"
-           width="6.9299998"
-           clip-path="url(#SVGID_4754_)"
-           y="342.98401"
-           x="-661.414"
-           style="fill:#ffffff" />
-        <rect
-           id="rect83789"
-           height="4.5679998"
-           width="4.5700002"
-           clip-path="url(#SVGID_4754_)"
-           y="344.164"
-           x="-660.23499"
-           style="fill:#ffffff" />
+         id="g30457"
+         transform="matrix(0.44444444,0,0,0.44444444,-774.10444,27.578499)">
+        <g
+           id="g30455">
+          <g
+             id="g30453">
+            <g
+               id="g30451">
+              <rect
+                 style="opacity:0.61;fill:#000000;stroke-width:1.00094"
+                 id="rect30449"
+                 width="439.00146"
+                 height="696.97461"
+                 x="122.01721"
+                 y="152.74527" />
+            </g>
+          </g>
+        </g>
       </g>
       </g>
+    </clipPath>
+    <clipPath
+       clipPathUnits="userSpaceOnUse"
+       id="clipPath30459">
       <g
       <g
-         inkscape:transform-center-y="98.159295"
-         inkscape:transform-center-x="584.03412"
-         id="g83791"
-         transform="matrix(2.25,0,0,2.25,1605.7731,-25.560183)">
-        <defs
-           id="defs83793">
-          <path
-             d="m -660.642,346.449 c 0,1.487 1.206,2.692 2.692,2.692 1.488,0 2.692,-1.205 2.692,-2.692 0,-1.486 -1.204,-2.692 -2.692,-2.692 -1.486,0 -2.692,1.206 -2.692,2.692"
-             id="SVGID_4755_"
-             inkscape:connector-curvature="0" />
-        </defs>
-        <clipPath
-           id="clipPath102853">
-          <use
-             id="use102855"
-             overflow="visible"
-             xlink:href="#SVGID_4755_"
-             style="overflow:visible"
-             x="0"
-             y="0"
-             width="744.09448"
-             height="1052.3622" />
-        </clipPath>
-        <linearGradient
-           gradientTransform="matrix(0,5.3844,5.3844,0,141.2627,-1031.1833)"
-           y2="-148.4299"
-           x2="256.3541"
-           y1="-148.4299"
-           x1="255.3541"
-           gradientUnits="userSpaceOnUse"
-           id="linearGradient102857">
-          <stop
-             id="stop102859"
-             style="stop-color:#55AEB9"
-             offset="0" />
-          <stop
-             id="stop102861"
-             style="stop-color:#81D1DB"
-             offset="1" />
-        </linearGradient>
-        <rect
-           id="rect83804"
-           height="5.3839998"
-           width="5.3839998"
-           clip-path="url(#SVGID_4756_)"
-           y="343.75699"
-           x="-660.64203"
-           style="fill:url(#SVGID_4757_)" />
+         id="g30469"
+         transform="matrix(0.44444444,0,0,0.44444444,-774.10444,27.578499)">
+        <g
+           id="g30467">
+          <g
+             id="g30465">
+            <g
+               id="g30463">
+              <rect
+                 style="opacity:0.61;fill:#000000;stroke-width:1.00094"
+                 id="rect30461"
+                 width="439.00146"
+                 height="696.97461"
+                 x="122.01721"
+                 y="152.74527" />
+            </g>
+          </g>
+        </g>
       </g>
       </g>
+    </clipPath>
+    <clipPath
+       clipPathUnits="userSpaceOnUse"
+       id="clipPath30471">
       <g
       <g
-         inkscape:transform-center-y="98.159342"
-         inkscape:transform-center-x="565.64033"
-         id="g83806"
-         transform="matrix(2.25,0,0,2.25,1605.7731,-25.560183)">
-        <defs
-           id="defs83808">
-          <rect
-             height="205.44099"
-             width="200.271"
-             y="181.315"
-             x="-682.31403"
-             id="SVGID_4758_" />
-        </defs>
-        <clipPath
-           id="clipPath102867">
-          <use
-             id="use102869"
-             overflow="visible"
-             xlink:href="#SVGID_4758_"
-             style="overflow:visible"
-             x="0"
-             y="0"
-             width="744.09448"
-             height="1052.3622" />
-        </clipPath>
-        <path
-           id="path83814"
-           d="m -658.582,346.449 c 0,-0.349 0.283,-0.632 0.632,-0.632 0.351,0 0.634,0.283 0.634,0.632 0,0.35 -0.283,0.633 -0.634,0.633 -0.349,0 -0.632,-0.283 -0.632,-0.633"
-           clip-path="url(#SVGID_4759_)"
-           inkscape:connector-curvature="0"
-           style="fill:#ffffff" />
-        <rect
-           id="rect83816"
-           height="9.592"
-           width="9.592"
-           clip-path="url(#SVGID_4759_)"
-           y="341.65302"
-           x="-650.77399"
-           style="fill:#ffffff" />
-        <rect
-           id="rect83818"
-           height="9.592"
-           width="9.592"
-           stroke-miterlimit="10"
-           clip-path="url(#SVGID_4759_)"
-           y="341.65302"
-           x="-650.77399"
-           style="fill:none;stroke:#81d0db;stroke-width:0.428;stroke-miterlimit:10" />
-        <rect
-           id="rect83820"
-           height="8.2469997"
-           width="8.2480001"
-           clip-path="url(#SVGID_4759_)"
-           y="342.32599"
-           x="-650.10303"
-           style="fill:#81d0db" />
-        <rect
-           id="rect83822"
-           height="6.9299998"
-           width="6.9299998"
-           clip-path="url(#SVGID_4759_)"
-           y="342.98401"
-           x="-649.44299"
-           style="fill:#ffffff" />
-        <rect
-           id="rect83824"
-           height="4.5679998"
-           width="4.5700002"
-           clip-path="url(#SVGID_4759_)"
-           y="344.164"
-           x="-648.26398"
-           style="fill:#ffffff" />
+         id="g30481"
+         transform="matrix(0.44444444,0,0,0.44444444,-774.10444,27.578499)">
+        <g
+           id="g30479">
+          <g
+             id="g30477">
+            <g
+               id="g30475">
+              <rect
+                 style="opacity:0.61;fill:#000000;stroke-width:1.00094"
+                 id="rect30473"
+                 width="439.00146"
+                 height="696.97461"
+                 x="122.01721"
+                 y="152.74527" />
+            </g>
+          </g>
+        </g>
       </g>
       </g>
+    </clipPath>
+    <clipPath
+       clipPathUnits="userSpaceOnUse"
+       id="clipPath30495">
       <g
       <g
-         inkscape:transform-center-y="98.159295"
-         inkscape:transform-center-x="557.09937"
-         id="g83826"
-         transform="matrix(2.25,0,0,2.25,1605.7731,-25.560183)">
-        <defs
-           id="defs83828">
-          <path
-             d="m -648.671,346.449 c 0,1.487 1.206,2.692 2.692,2.692 1.488,0 2.692,-1.205 2.692,-2.692 0,-1.486 -1.204,-2.692 -2.692,-2.692 -1.486,0 -2.692,1.206 -2.692,2.692"
-             id="SVGID_4760_"
-             inkscape:connector-curvature="0" />
-        </defs>
-        <clipPath
-           id="clipPath102880">
-          <use
-             id="use102882"
-             overflow="visible"
-             xlink:href="#SVGID_4760_"
-             style="overflow:visible"
-             x="0"
-             y="0"
-             width="744.09448"
-             height="1052.3622" />
-        </clipPath>
-        <linearGradient
-           gradientTransform="matrix(0,5.3844,5.3844,0,153.234,-1031.1833)"
-           y2="-148.42999"
-           x2="256.3541"
-           y1="-148.42999"
-           x1="255.3541"
-           gradientUnits="userSpaceOnUse"
-           id="linearGradient102884">
-          <stop
-             id="stop102886"
-             style="stop-color:#55AEB9"
-             offset="0" />
-          <stop
-             id="stop102888"
-             style="stop-color:#81D1DB"
-             offset="1" />
-        </linearGradient>
-        <rect
-           id="rect83839"
-           height="5.3839998"
-           width="5.3839998"
-           clip-path="url(#SVGID_4761_)"
-           y="343.75699"
-           x="-648.67102"
-           style="fill:url(#SVGID_4762_)" />
+         id="g30505"
+         transform="matrix(0.44444444,0,0,0.44444444,-774.10444,27.578499)">
+        <g
+           id="g30503">
+          <g
+             id="g30501">
+            <g
+               id="g30499">
+              <rect
+                 style="opacity:0.61;fill:#000000;stroke-width:1.00094"
+                 id="rect30497"
+                 width="439.00146"
+                 height="696.97461"
+                 x="122.01721"
+                 y="152.74527" />
+            </g>
+          </g>
+        </g>
       </g>
       </g>
+    </clipPath>
+    <clipPath
+       clipPathUnits="userSpaceOnUse"
+       id="clipPath30507">
       <g
       <g
-         inkscape:transform-center-y="98.159342"
-         inkscape:transform-center-x="538.70558"
-         id="g83841"
-         transform="matrix(2.25,0,0,2.25,1605.7731,-25.560183)">
-        <defs
-           id="defs83843">
-          <rect
-             height="205.44099"
-             width="200.271"
-             y="181.315"
-             x="-682.31403"
-             id="SVGID_4763_" />
-        </defs>
-        <clipPath
-           id="clipPath102894">
-          <use
-             id="use102896"
-             overflow="visible"
-             xlink:href="#SVGID_4763_"
-             style="overflow:visible"
-             x="0"
-             y="0"
-             width="744.09448"
-             height="1052.3622" />
-        </clipPath>
-        <path
-           id="path83849"
-           d="m -646.611,346.449 c 0,-0.349 0.283,-0.632 0.632,-0.632 0.351,0 0.634,0.283 0.634,0.632 0,0.35 -0.283,0.633 -0.634,0.633 -0.349,0 -0.632,-0.283 -0.632,-0.633"
-           clip-path="url(#SVGID_4764_)"
-           inkscape:connector-curvature="0"
-           style="fill:#ffffff" />
-        <rect
-           id="rect83851"
-           height="9.592"
-           width="9.592"
-           clip-path="url(#SVGID_4764_)"
-           y="341.65302"
-           x="-638.80298"
-           style="fill:#ffffff" />
-        <rect
-           id="rect83853"
-           height="9.592"
-           width="9.592"
-           stroke-miterlimit="10"
-           clip-path="url(#SVGID_4764_)"
-           y="341.65302"
-           x="-638.80298"
-           style="fill:none;stroke:#81d0db;stroke-width:0.428;stroke-miterlimit:10" />
-        <rect
-           id="rect83855"
-           height="8.2469997"
-           width="8.2480001"
-           clip-path="url(#SVGID_4764_)"
-           y="342.32599"
-           x="-638.13202"
-           style="fill:#81d0db" />
-        <rect
-           id="rect83857"
-           height="6.9299998"
-           width="6.9299998"
-           clip-path="url(#SVGID_4764_)"
-           y="342.98401"
-           x="-637.47198"
-           style="fill:#ffffff" />
-        <rect
-           id="rect83859"
-           height="4.5679998"
-           width="4.5700002"
-           clip-path="url(#SVGID_4764_)"
-           y="344.164"
-           x="-636.29199"
-           style="fill:#ffffff" />
+         id="g30517"
+         transform="matrix(0.44444444,0,0,0.44444444,-774.10444,27.578499)">
+        <g
+           id="g30515">
+          <g
+             id="g30513">
+            <g
+               id="g30511">
+              <rect
+                 style="opacity:0.61;fill:#000000;stroke-width:1.00094"
+                 id="rect30509"
+                 width="439.00146"
+                 height="696.97461"
+                 x="122.01721"
+                 y="152.74527" />
+            </g>
+          </g>
+        </g>
       </g>
       </g>
+    </clipPath>
+    <clipPath
+       clipPathUnits="userSpaceOnUse"
+       id="clipPath30519">
       <g
       <g
-         inkscape:transform-center-y="98.159295"
-         inkscape:transform-center-x="530.16231"
-         id="g83861"
-         transform="matrix(2.25,0,0,2.25,1605.7731,-25.560183)">
-        <defs
-           id="defs83863">
-          <path
-             d="m -636.699,346.449 c 0,1.487 1.206,2.692 2.692,2.692 1.487,0 2.692,-1.205 2.692,-2.692 0,-1.486 -1.205,-2.692 -2.692,-2.692 -1.486,0 -2.692,1.206 -2.692,2.692"
-             id="SVGID_4765_"
-             inkscape:connector-curvature="0" />
-        </defs>
-        <clipPath
-           id="clipPath102907">
-          <use
-             id="use102909"
-             overflow="visible"
-             xlink:href="#SVGID_4765_"
-             style="overflow:visible"
-             x="0"
-             y="0"
-             width="744.09448"
-             height="1052.3622" />
-        </clipPath>
-        <linearGradient
-           gradientTransform="matrix(0,5.3844,5.3844,0,165.2054,-1031.1833)"
-           y2="-148.4299"
-           x2="256.3541"
-           y1="-148.4299"
-           x1="255.3541"
-           gradientUnits="userSpaceOnUse"
-           id="linearGradient102911">
-          <stop
-             id="stop102913"
-             style="stop-color:#55AEB9"
-             offset="0" />
-          <stop
-             id="stop102915"
-             style="stop-color:#81D1DB"
-             offset="1" />
-        </linearGradient>
-        <rect
-           id="rect83874"
-           height="5.3839998"
-           width="5.3839998"
-           clip-path="url(#SVGID_4766_)"
-           y="343.75699"
-           x="-636.69897"
-           style="fill:url(#SVGID_4767_)" />
+         id="g30529"
+         transform="matrix(0.44444444,0,0,0.44444444,-774.10444,27.578499)">
+        <g
+           id="g30527">
+          <g
+             id="g30525">
+            <g
+               id="g30523">
+              <rect
+                 style="opacity:0.61;fill:#000000;stroke-width:1.00094"
+                 id="rect30521"
+                 width="439.00146"
+                 height="696.97461"
+                 x="122.01721"
+                 y="152.74527" />
+            </g>
+          </g>
+        </g>
       </g>
       </g>
+    </clipPath>
+    <clipPath
+       clipPathUnits="userSpaceOnUse"
+       id="clipPath30531">
       <g
       <g
-         inkscape:transform-center-y="98.159342"
-         inkscape:transform-center-x="511.76858"
-         id="g83876"
-         transform="matrix(2.25,0,0,2.25,1605.7731,-25.560183)">
-        <defs
-           id="defs83878">
-          <rect
-             height="205.44099"
-             width="200.271"
-             y="181.315"
-             x="-682.31403"
-             id="SVGID_4768_" />
-        </defs>
-        <clipPath
-           id="clipPath102921">
-          <use
-             id="use102923"
-             overflow="visible"
-             xlink:href="#SVGID_4768_"
-             style="overflow:visible"
-             x="0"
-             y="0"
-             width="744.09448"
-             height="1052.3622" />
-        </clipPath>
-        <path
-           id="path83884"
-           d="m -634.639,346.449 c 0,-0.349 0.283,-0.632 0.632,-0.632 0.351,0 0.634,0.283 0.634,0.632 0,0.35 -0.283,0.633 -0.634,0.633 -0.349,0 -0.632,-0.283 -0.632,-0.633"
-           clip-path="url(#SVGID_4769_)"
-           inkscape:connector-curvature="0"
-           style="fill:#ffffff" />
-        <rect
-           id="rect83886"
-           height="9.592"
-           width="9.592"
-           clip-path="url(#SVGID_4769_)"
-           y="341.65302"
-           x="-626.83099"
-           style="fill:#ffffff" />
-        <rect
-           id="rect83888"
-           height="9.592"
-           width="9.592"
-           stroke-miterlimit="10"
-           clip-path="url(#SVGID_4769_)"
-           y="341.65302"
-           x="-626.83099"
-           style="fill:none;stroke:#81d0db;stroke-width:0.428;stroke-miterlimit:10" />
-        <rect
-           id="rect83890"
-           height="8.2469997"
-           width="8.2480001"
-           clip-path="url(#SVGID_4769_)"
-           y="342.32599"
-           x="-626.15997"
-           style="fill:#81d0db" />
-        <rect
-           id="rect83892"
-           height="6.9299998"
-           width="6.9299998"
-           clip-path="url(#SVGID_4769_)"
-           y="342.98401"
-           x="-625.5"
-           style="fill:#ffffff" />
-        <rect
-           id="rect83894"
-           height="4.5679998"
-           width="4.5700002"
-           clip-path="url(#SVGID_4769_)"
-           y="344.164"
-           x="-624.32098"
-           style="fill:#ffffff" />
+         id="g30541"
+         transform="matrix(0.44444444,0,0,0.44444444,-774.10444,27.578499)">
+        <g
+           id="g30539">
+          <g
+             id="g30537">
+            <g
+               id="g30535">
+              <rect
+                 style="opacity:0.61;fill:#000000;stroke-width:1.00094"
+                 id="rect30533"
+                 width="439.00146"
+                 height="696.97461"
+                 x="122.01721"
+                 y="152.74527" />
+            </g>
+          </g>
+        </g>
       </g>
       </g>
+    </clipPath>
+    <clipPath
+       clipPathUnits="userSpaceOnUse"
+       id="clipPath30543">
       <g
       <g
-         inkscape:transform-center-y="98.159295"
-         inkscape:transform-center-x="503.22762"
-         id="g83896"
-         transform="matrix(2.25,0,0,2.25,1605.7731,-25.560183)">
-        <defs
-           id="defs83898">
-          <path
-             d="m -624.728,346.449 c 0,1.487 1.206,2.692 2.693,2.692 1.487,0 2.691,-1.205 2.691,-2.692 0,-1.486 -1.204,-2.692 -2.691,-2.692 -1.487,0 -2.693,1.206 -2.693,2.692"
-             id="SVGID_4770_"
-             inkscape:connector-curvature="0" />
-        </defs>
-        <clipPath
-           id="clipPath102934">
-          <use
-             id="use102936"
-             overflow="visible"
-             xlink:href="#SVGID_4770_"
-             style="overflow:visible"
-             x="0"
-             y="0"
-             width="744.09448"
-             height="1052.3622" />
-        </clipPath>
-        <linearGradient
-           gradientTransform="matrix(0,5.3844,5.3844,0,177.1768,-1031.1833)"
-           y2="-148.42999"
-           x2="256.3541"
-           y1="-148.42999"
-           x1="255.3541"
-           gradientUnits="userSpaceOnUse"
-           id="linearGradient102938">
-          <stop
-             id="stop102940"
-             style="stop-color:#55AEB9"
-             offset="0" />
-          <stop
-             id="stop102942"
-             style="stop-color:#81D1DB"
-             offset="1" />
-        </linearGradient>
-        <rect
-           id="rect83909"
-           height="5.3839998"
-           width="5.3839998"
-           clip-path="url(#SVGID_4771_)"
-           y="343.75699"
-           x="-624.72803"
-           style="fill:url(#SVGID_4772_)" />
+         id="g30553"
+         transform="matrix(0.44444444,0,0,0.44444444,-774.10444,27.578499)">
+        <g
+           id="g30551">
+          <g
+             id="g30549">
+            <g
+               id="g30547">
+              <rect
+                 style="opacity:0.61;fill:#000000;stroke-width:1.00094"
+                 id="rect30545"
+                 width="439.00146"
+                 height="696.97461"
+                 x="122.01721"
+                 y="152.74527" />
+            </g>
+          </g>
+        </g>
       </g>
       </g>
+    </clipPath>
+    <clipPath
+       clipPathUnits="userSpaceOnUse"
+       id="clipPath30567">
       <g
       <g
-         inkscape:transform-center-y="98.159342"
-         inkscape:transform-center-x="484.83387"
-         id="g83911"
-         transform="matrix(2.25,0,0,2.25,1605.7731,-25.560183)">
-        <defs
-           id="defs83913">
-          <rect
-             height="205.44099"
-             width="200.271"
-             y="181.315"
-             x="-682.31403"
-             id="SVGID_4773_" />
-        </defs>
-        <clipPath
-           id="clipPath102948">
-          <use
-             id="use102950"
-             overflow="visible"
-             xlink:href="#SVGID_4773_"
-             style="overflow:visible"
-             x="0"
-             y="0"
-             width="744.09448"
-             height="1052.3622" />
-        </clipPath>
-        <path
-           id="path83919"
-           d="m -622.668,346.449 c 0,-0.349 0.283,-0.632 0.632,-0.632 0.351,0 0.634,0.283 0.634,0.632 0,0.35 -0.283,0.633 -0.634,0.633 -0.349,0 -0.632,-0.283 -0.632,-0.633"
-           clip-path="url(#SVGID_4774_)"
-           inkscape:connector-curvature="0"
-           style="fill:#ffffff" />
-        <rect
-           id="rect83921"
-           height="9.592"
-           width="9.5930004"
-           clip-path="url(#SVGID_4774_)"
-           y="341.65302"
-           x="-614.85999"
-           style="fill:#ffffff" />
-        <rect
-           id="rect83923"
-           height="9.592"
-           width="9.5930004"
-           stroke-miterlimit="10"
-           clip-path="url(#SVGID_4774_)"
-           y="341.65302"
-           x="-614.86102"
-           style="fill:none;stroke:#81d0db;stroke-width:0.428;stroke-miterlimit:10" />
-        <rect
-           id="rect83925"
-           height="8.2469997"
-           width="8.2480001"
-           clip-path="url(#SVGID_4774_)"
-           y="342.32599"
-           x="-614.18799"
-           style="fill:#81d0db" />
-        <rect
-           id="rect83927"
-           height="6.9299998"
-           width="6.9310002"
-           clip-path="url(#SVGID_4774_)"
-           y="342.98401"
-           x="-613.52899"
-           style="fill:#ffffff" />
-        <rect
-           id="rect83929"
-           height="4.5679998"
-           width="4.5700002"
-           clip-path="url(#SVGID_4774_)"
-           y="344.164"
-           x="-612.349"
-           style="fill:#ffffff" />
+         id="g30577">
+        <g
+           id="g30575">
+          <g
+             id="g30573">
+            <g
+               id="g30571">
+              <rect
+                 style="opacity:0.61;fill:#000000;stroke-width:1.00094"
+                 id="rect30569"
+                 width="439.00146"
+                 height="696.97461"
+                 x="122.01721"
+                 y="152.74527" />
+            </g>
+          </g>
+        </g>
       </g>
       </g>
+    </clipPath>
+    <clipPath
+       clipPathUnits="userSpaceOnUse"
+       id="clipPath30579">
       <g
       <g
-         inkscape:transform-center-y="98.159295"
-         inkscape:transform-center-x="476.2917"
-         id="g83931"
-         transform="matrix(2.25,0,0,2.25,1605.7731,-25.560183)">
-        <defs
-           id="defs83933">
-          <path
-             d="m -612.756,346.449 c 0,1.487 1.206,2.692 2.692,2.692 1.487,0 2.691,-1.205 2.691,-2.692 0,-1.486 -1.204,-2.692 -2.691,-2.692 -1.486,0 -2.692,1.206 -2.692,2.692"
-             id="SVGID_4775_"
-             inkscape:connector-curvature="0" />
-        </defs>
-        <clipPath
-           id="clipPath102961">
-          <use
-             id="use102963"
-             overflow="visible"
-             xlink:href="#SVGID_4775_"
-             style="overflow:visible"
-             x="0"
-             y="0"
-             width="744.09448"
-             height="1052.3622" />
-        </clipPath>
-        <linearGradient
-           gradientTransform="matrix(0,5.3844,5.3844,0,189.1483,-1031.1833)"
-           y2="-148.42999"
-           x2="256.3541"
-           y1="-148.42999"
-           x1="255.3541"
-           gradientUnits="userSpaceOnUse"
-           id="linearGradient102965">
-          <stop
-             id="stop102967"
-             style="stop-color:#55AEB9"
-             offset="0" />
-          <stop
-             id="stop102969"
-             style="stop-color:#81D1DB"
-             offset="1" />
-        </linearGradient>
-        <rect
-           id="rect83944"
-           height="5.3839998"
-           width="5.3829999"
-           clip-path="url(#SVGID_4776_)"
-           y="343.75699"
-           x="-612.75598"
-           style="fill:url(#SVGID_4777_)" />
+         id="g30589">
+        <g
+           id="g30587">
+          <g
+             id="g30585">
+            <g
+               id="g30583">
+              <rect
+                 style="opacity:0.61;fill:#000000;stroke-width:1.00094"
+                 id="rect30581"
+                 width="439.00146"
+                 height="696.97461"
+                 x="122.01721"
+                 y="152.74527" />
+            </g>
+          </g>
+        </g>
       </g>
       </g>
+    </clipPath>
+    <clipPath
+       clipPathUnits="userSpaceOnUse"
+       id="clipPath30591">
       <g
       <g
-         inkscape:transform-center-y="98.159342"
-         inkscape:transform-center-x="457.89686"
-         id="g83946"
-         transform="matrix(2.25,0,0,2.25,1605.7731,-25.560183)">
-        <defs
-           id="defs83948">
-          <rect
-             height="205.44099"
-             width="200.271"
-             y="181.315"
-             x="-682.31403"
-             id="SVGID_4778_" />
-        </defs>
-        <clipPath
-           id="clipPath102975">
-          <use
-             id="use102977"
-             overflow="visible"
-             xlink:href="#SVGID_4778_"
-             style="overflow:visible"
-             x="0"
-             y="0"
-             width="744.09448"
-             height="1052.3622" />
-        </clipPath>
-        <path
-           id="path83954"
-           d="m -610.696,346.449 c 0,-0.349 0.283,-0.632 0.632,-0.632 0.351,0 0.634,0.283 0.634,0.632 0,0.35 -0.283,0.633 -0.634,0.633 -0.349,0 -0.632,-0.283 -0.632,-0.633"
-           clip-path="url(#SVGID_4779_)"
-           inkscape:connector-curvature="0"
-           style="fill:#ffffff" />
-        <rect
-           id="rect83956"
-           height="9.592"
-           width="9.592"
-           clip-path="url(#SVGID_4779_)"
-           y="341.65302"
-           x="-602.888"
-           style="fill:#ffffff" />
-        <rect
-           id="rect83958"
-           height="9.592"
-           width="9.592"
-           stroke-miterlimit="10"
-           clip-path="url(#SVGID_4779_)"
-           y="341.65302"
-           x="-602.888"
-           style="fill:none;stroke:#81d0db;stroke-width:0.428;stroke-miterlimit:10" />
-        <rect
-           id="rect83960"
-           height="8.2469997"
-           width="8.2480001"
-           clip-path="url(#SVGID_4779_)"
-           y="342.32599"
-           x="-602.21698"
-           style="fill:#81d0db" />
-        <rect
-           id="rect83962"
-           height="6.9299998"
-           width="6.9299998"
-           clip-path="url(#SVGID_4779_)"
-           y="342.98401"
-           x="-601.55701"
-           style="fill:#ffffff" />
-        <rect
-           id="rect83964"
-           height="4.5679998"
-           width="4.5700002"
-           clip-path="url(#SVGID_4779_)"
-           y="344.164"
-           x="-600.37799"
-           style="fill:#ffffff" />
+         id="g30601">
+        <g
+           id="g30599">
+          <g
+             id="g30597">
+            <g
+               id="g30595">
+              <rect
+                 style="opacity:0.61;fill:#000000;stroke-width:1.00094"
+                 id="rect30593"
+                 width="439.00146"
+                 height="696.97461"
+                 x="122.01721"
+                 y="152.74527" />
+            </g>
+          </g>
+        </g>
       </g>
       </g>
+    </clipPath>
+    <clipPath
+       clipPathUnits="userSpaceOnUse"
+       id="clipPath30603">
       <g
       <g
-         inkscape:transform-center-y="98.159295"
-         inkscape:transform-center-x="449.35694"
-         id="g83966"
-         transform="matrix(2.25,0,0,2.25,1605.7731,-25.560183)">
-        <defs
-           id="defs83968">
-          <path
-             d="m -600.785,346.449 c 0,1.487 1.206,2.692 2.692,2.692 1.488,0 2.691,-1.205 2.691,-2.692 0,-1.486 -1.203,-2.692 -2.691,-2.692 -1.486,0 -2.692,1.206 -2.692,2.692"
-             id="SVGID_4780_"
-             inkscape:connector-curvature="0" />
-        </defs>
-        <clipPath
-           id="clipPath102988">
-          <use
-             id="use102990"
-             overflow="visible"
-             xlink:href="#SVGID_4780_"
-             style="overflow:visible"
-             x="0"
-             y="0"
-             width="744.09448"
-             height="1052.3622" />
-        </clipPath>
-        <linearGradient
-           gradientTransform="matrix(0,5.3844,5.3844,0,201.1199,-1031.1833)"
-           y2="-148.4301"
-           x2="256.3541"
-           y1="-148.4301"
-           x1="255.3541"
-           gradientUnits="userSpaceOnUse"
-           id="linearGradient102992">
-          <stop
-             id="stop102994"
-             style="stop-color:#55AEB9"
-             offset="0" />
-          <stop
-             id="stop102996"
-             style="stop-color:#81D1DB"
-             offset="1" />
-        </linearGradient>
-        <rect
-           id="rect83979"
-           height="5.3839998"
-           width="5.3829999"
-           clip-path="url(#SVGID_4781_)"
-           y="343.75699"
-           x="-600.78497"
-           style="fill:url(#SVGID_4782_)" />
+         id="g30613">
+        <g
+           id="g30611">
+          <g
+             id="g30609">
+            <g
+               id="g30607">
+              <rect
+                 style="opacity:0.61;fill:#000000;stroke-width:1.00094"
+                 id="rect30605"
+                 width="439.00146"
+                 height="696.97461"
+                 x="122.01721"
+                 y="152.74527" />
+            </g>
+          </g>
+        </g>
       </g>
       </g>
+    </clipPath>
+    <clipPath
+       clipPathUnits="userSpaceOnUse"
+       id="clipPath30615">
       <g
       <g
-         inkscape:transform-center-y="98.159342"
-         inkscape:transform-center-x="430.96208"
-         id="g83981"
-         transform="matrix(2.25,0,0,2.25,1605.7731,-25.560183)">
-        <defs
-           id="defs83983">
-          <rect
-             height="205.44099"
-             width="200.271"
-             y="181.315"
-             x="-682.31403"
-             id="SVGID_4783_" />
-        </defs>
-        <clipPath
-           id="clipPath103002">
-          <use
-             id="use103004"
-             overflow="visible"
-             xlink:href="#SVGID_4783_"
-             style="overflow:visible"
-             x="0"
-             y="0"
-             width="744.09448"
-             height="1052.3622" />
-        </clipPath>
-        <path
-           id="path83989"
-           d="m -598.725,346.449 c 0,-0.349 0.283,-0.632 0.632,-0.632 0.351,0 0.634,0.283 0.634,0.632 0,0.35 -0.283,0.633 -0.634,0.633 -0.349,0 -0.632,-0.283 -0.632,-0.633"
-           clip-path="url(#SVGID_4784_)"
-           inkscape:connector-curvature="0"
-           style="fill:#ffffff" />
-        <rect
-           id="rect83991"
-           height="9.592"
-           width="9.592"
-           clip-path="url(#SVGID_4784_)"
-           y="341.65302"
-           x="-590.91699"
-           style="fill:#ffffff" />
-        <rect
-           id="rect83993"
-           height="9.592"
-           width="9.592"
-           stroke-miterlimit="10"
-           clip-path="url(#SVGID_4784_)"
-           y="341.65302"
-           x="-590.91699"
-           style="fill:none;stroke:#81d0db;stroke-width:0.428;stroke-miterlimit:10" />
-        <rect
-           id="rect83995"
-           height="8.2469997"
-           width="8.2480001"
-           clip-path="url(#SVGID_4784_)"
-           y="342.32599"
-           x="-590.24597"
-           style="fill:#81d0db" />
-        <rect
-           id="rect83997"
-           height="6.9299998"
-           width="6.9299998"
-           clip-path="url(#SVGID_4784_)"
-           y="342.98401"
-           x="-589.586"
-           style="fill:#ffffff" />
-        <rect
-           id="rect83999"
-           height="4.5679998"
-           width="4.5700002"
-           clip-path="url(#SVGID_4784_)"
-           y="344.164"
-           x="-588.40698"
-           style="fill:#ffffff" />
+         id="g30625">
+        <g
+           id="g30623">
+          <g
+             id="g30621">
+            <g
+               id="g30619">
+              <rect
+                 style="opacity:0.61;fill:#000000;stroke-width:1.00094"
+                 id="rect30617"
+                 width="439.00146"
+                 height="696.97461"
+                 x="122.01721"
+                 y="152.74527" />
+            </g>
+          </g>
+        </g>
       </g>
       </g>
+    </clipPath>
+    <defs
+       id="defs82128">
+      <rect
+         id="SVGID_4522_"
+         x="-682.31403"
+         y="181.315"
+         width="200.271"
+         height="205.44099" />
+    </defs>
+    <clipPath
+       id="clipPath126838">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4522_"
+         overflow="visible"
+         id="use126840" />
+    </clipPath>
+    <defs
+       id="defs84322">
+      <polygon
+         id="SVGID_4826_"
+         points="-636.356,251.283 -636.358,231.934 -682.207,231.929 -682.208,251.221 -659.342,256.788 " />
+    </defs>
+    <clipPath
+       id="clipPath103260">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4826_"
+         overflow="visible"
+         id="use103262" />
+    </clipPath>
+    <linearGradient
+       id="linearGradient103264"
+       gradientUnits="userSpaceOnUse"
+       x1="145.3168"
+       y1="2.8518"
+       x2="146.3168"
+       y2="2.8518"
+       gradientTransform="matrix(0.0299,24.8865,24.8865,-0.0299,-734.6116,-3384.4426)">
+      <stop
+         offset="0"
+         style="stop-color:#FFFFFF"
+         id="stop103266" />
+      <stop
+         offset="0.23"
+         style="stop-color:#FFFFFF"
+         id="stop103268" />
+      <stop
+         offset="0.5671"
+         style="stop-color:#F9F9F9"
+         id="stop103270" />
+      <stop
+         offset="0.8674"
+         style="stop-color:#EDEEEE"
+         id="stop103272" />
+      <stop
+         offset="1"
+         style="stop-color:#E6E8E7"
+         id="stop103274" />
+    </linearGradient>
+    <clipPath
+       clipPathUnits="userSpaceOnUse"
+       id="clipPath30660">
       <g
       <g
-         inkscape:transform-center-y="98.159295"
-         inkscape:transform-center-x="422.41995"
-         id="g84001"
-         transform="matrix(2.25,0,0,2.25,1605.7731,-25.560183)">
-        <defs
-           id="defs84003">
-          <path
-             d="m -588.813,346.449 c 0,1.487 1.205,2.692 2.692,2.692 1.487,0 2.691,-1.205 2.691,-2.692 0,-1.486 -1.204,-2.692 -2.691,-2.692 -1.487,0 -2.692,1.206 -2.692,2.692"
-             id="SVGID_4785_"
-             inkscape:connector-curvature="0" />
-        </defs>
-        <clipPath
-           id="clipPath103015">
-          <use
-             id="use103017"
-             overflow="visible"
-             xlink:href="#SVGID_4785_"
-             style="overflow:visible"
-             x="0"
-             y="0"
-             width="744.09448"
-             height="1052.3622" />
-        </clipPath>
-        <linearGradient
-           gradientTransform="matrix(0,5.3844,5.3844,0,213.0913,-1031.1833)"
-           y2="-148.42999"
-           x2="256.3541"
-           y1="-148.42999"
-           x1="255.3541"
-           gradientUnits="userSpaceOnUse"
-           id="linearGradient103019">
-          <stop
-             id="stop103021"
-             style="stop-color:#55AEB9"
-             offset="0" />
-          <stop
-             id="stop103023"
-             style="stop-color:#81D1DB"
-             offset="1" />
-        </linearGradient>
-        <rect
-           id="rect84014"
-           height="5.3839998"
-           width="5.3829999"
-           clip-path="url(#SVGID_4786_)"
-           y="343.75699"
-           x="-588.81299"
-           style="fill:url(#SVGID_4787_)" />
+         id="g30670"
+         transform="matrix(0.44444444,0,0,0.44444444,-774.10444,27.578499)">
+        <g
+           id="g30668"
+           transform="translate(1e-5)">
+          <g
+             id="g30666">
+            <g
+               id="g30664">
+              <rect
+                 style="opacity:0.61;fill:#000000;stroke-width:1.00094"
+                 id="rect30662"
+                 width="439.00146"
+                 height="696.97461"
+                 x="122.01721"
+                 y="152.74527" />
+            </g>
+          </g>
+        </g>
       </g>
       </g>
+    </clipPath>
+    <defs
+       id="defs82109">
+      <polygon
+         id="SVGID_4519_"
+         points="-504.975,196.685 -504.975,188.287 -547.302,188.287 -547.302,196.684 -528.257,196.685 -526.139,198.478 -524.02,196.685 " />
+    </defs>
+    <clipPath
+       id="clipPath126820">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4519_"
+         overflow="visible"
+         id="use126822" />
+    </clipPath>
+    <linearGradient
+       id="linearGradient126824"
+       gradientUnits="userSpaceOnUse"
+       x1="40.840599"
+       y1="146.6937"
+       x2="41.840599"
+       y2="146.6937"
+       gradientTransform="matrix(0,-10.1906,-10.1906,0,968.7597,614.6687)">
+      <stop
+         offset="0"
+         style="stop-color:#37424B"
+         id="stop126826" />
+      <stop
+         offset="0.12"
+         style="stop-color:#37424B"
+         id="stop126828" />
+      <stop
+         offset="0.88"
+         style="stop-color:#5E6A71"
+         id="stop126830" />
+      <stop
+         offset="1"
+         style="stop-color:#5E6A71"
+         id="stop126832" />
+    </linearGradient>
+    <clipPath
+       clipPathUnits="userSpaceOnUse"
+       id="clipPath30692">
+      <g
+         id="g30702"
+         transform="matrix(0.2962963,0,0,0.2962963,-648.90222,109.95785)">
+        <g
+           id="g30700"
+           transform="translate(7.4999998e-6,1.375e-5)">
+          <g
+             id="g30698">
+            <g
+               id="g30696">
+              <rect
+                 style="opacity:0.61;fill:#000000;stroke-width:1.00094"
+                 id="rect30694"
+                 width="439.00146"
+                 height="696.97461"
+                 x="122.01721"
+                 y="152.74527" />
+            </g>
+          </g>
+        </g>
+      </g>
+    </clipPath>
+    <defs
+       id="defs84640">
+      <rect
+         id="SVGID_4852_"
+         x="-682.31403"
+         y="181.315"
+         width="200.271"
+         height="205.44099" />
+    </defs>
+    <clipPath
+       id="clipPath126879">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4852_"
+         overflow="visible"
+         id="use126881" />
+    </clipPath>
+    <defs
+       id="defs82312">
+      <polygon
+         id="SVGID_4546_"
+         points="-680.004,267.353 -637.65,267.32 -637.642,253.133 -659.18,258.293 -679.997,253.224 " />
+    </defs>
+    <clipPath
+       id="clipPath101711">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4546_"
+         overflow="visible"
+         id="use101713" />
+    </clipPath>
+    <linearGradient
+       id="linearGradient101715"
+       gradientUnits="userSpaceOnUse"
+       x1="76.3899"
+       y1="97.785698"
+       x2="77.3899"
+       y2="97.785698"
+       gradientTransform="matrix(0,-19.5733,-19.5733,0,1255.1711,1762.5587)">
+      <stop
+         offset="0"
+         style="stop-color:#55AEB9"
+         id="stop101717" />
+      <stop
+         offset="0.0507"
+         style="stop-color:#68B4BF"
+         id="stop101719" />
+      <stop
+         offset="0.2116"
+         style="stop-color:#96C6CF"
+         id="stop101721" />
+      <stop
+         offset="0.3736"
+         style="stop-color:#BAD8DD"
+         id="stop101723" />
+      <stop
+         offset="0.5342"
+         style="stop-color:#D7E6EA"
+         id="stop101725" />
+      <stop
+         offset="0.693"
+         style="stop-color:#EBF2F3"
+         id="stop101727" />
+      <stop
+         offset="0.8492"
+         style="stop-color:#F8FBFB"
+         id="stop101729" />
+      <stop
+         offset="1"
+         style="stop-color:#FFFFFF"
+         id="stop101731" />
+    </linearGradient>
+    <clipPath
+       clipPathUnits="userSpaceOnUse"
+       id="clipPath30734">
+      <g
+         id="g30744"
+         transform="matrix(0.44444444,0,0,0.44444444,-774.10444,27.578499)">
+        <g
+           id="g30742"
+           transform="translate(1e-5)">
+          <g
+             id="g30740">
+            <g
+               id="g30738">
+              <rect
+                 style="opacity:0.61;fill:#000000;stroke-width:1.00094"
+                 id="rect30736"
+                 width="439.00146"
+                 height="696.97461"
+                 x="122.01721"
+                 y="152.74527" />
+            </g>
+          </g>
+        </g>
+      </g>
+    </clipPath>
+    <defs
+       id="defs82128-8">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="SVGID_4522_-8" />
+    </defs>
+    <clipPath
+       id="clipPath126838-9">
+      <use
+         id="use126840-87"
+         overflow="visible"
+         xlink:href="#SVGID_4522_-8"
+         style="overflow:visible"
+         x="0"
+         y="0"
+         width="744.09448"
+         height="1052.3622" />
+    </clipPath>
+    <defs
+       id="defs83793">
+      <path
+         d="m -660.642,346.449 c 0,1.487 1.206,2.692 2.692,2.692 1.488,0 2.692,-1.205 2.692,-2.692 0,-1.486 -1.204,-2.692 -2.692,-2.692 -1.486,0 -2.692,1.206 -2.692,2.692"
+         id="SVGID_4755_"
+         inkscape:connector-curvature="0" />
+    </defs>
+    <clipPath
+       id="clipPath102853">
+      <use
+         id="use102855"
+         overflow="visible"
+         xlink:href="#SVGID_4755_"
+         style="overflow:visible"
+         x="0"
+         y="0"
+         width="744.09448"
+         height="1052.3622" />
+    </clipPath>
+    <linearGradient
+       gradientTransform="matrix(0,5.3844,5.3844,0,141.2627,-1031.1833)"
+       y2="-148.4299"
+       x2="256.3541"
+       y1="-148.4299"
+       x1="255.3541"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient102857">
+      <stop
+         id="stop102859"
+         style="stop-color:#55AEB9"
+         offset="0" />
+      <stop
+         id="stop102861"
+         style="stop-color:#81D1DB"
+         offset="1" />
+    </linearGradient>
+    <clipPath
+       clipPathUnits="userSpaceOnUse"
+       id="clipPath30778">
+      <g
+         id="g30790"
+         transform="matrix(0.44444444,0,0,0.44444444,-774.10444,27.578499)">
+        <g
+           id="g30788"
+           transform="translate(1e-5)">
+          <g
+             id="g30786">
+            <g
+               id="g30784">
+              <g
+                 id="g30782">
+                <rect
+                   style="opacity:0.61;fill:#000000;stroke-width:1.00094"
+                   id="rect30780"
+                   width="439.00146"
+                   height="696.97461"
+                   x="122.01721"
+                   y="152.74527" />
+              </g>
+            </g>
+          </g>
+        </g>
+      </g>
+    </clipPath>
+    <defs
+       id="defs83933">
+      <path
+         d="m -612.756,346.449 c 0,1.487 1.206,2.692 2.692,2.692 1.487,0 2.691,-1.205 2.691,-2.692 0,-1.486 -1.204,-2.692 -2.691,-2.692 -1.486,0 -2.692,1.206 -2.692,2.692"
+         id="SVGID_4775_"
+         inkscape:connector-curvature="0" />
+    </defs>
+    <clipPath
+       id="clipPath102961">
+      <use
+         id="use102963"
+         overflow="visible"
+         xlink:href="#SVGID_4775_"
+         style="overflow:visible"
+         x="0"
+         y="0"
+         width="744.09448"
+         height="1052.3622" />
+    </clipPath>
+    <linearGradient
+       gradientTransform="matrix(0,5.3844,5.3844,0,189.1483,-1031.1833)"
+       y2="-148.42999"
+       x2="256.3541"
+       y1="-148.42999"
+       x1="255.3541"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient102965">
+      <stop
+         id="stop102967"
+         style="stop-color:#55AEB9"
+         offset="0" />
+      <stop
+         id="stop102969"
+         style="stop-color:#81D1DB"
+         offset="1" />
+    </linearGradient>
+    <clipPath
+       clipPathUnits="userSpaceOnUse"
+       id="clipPath30812">
+      <g
+         id="g30824"
+         transform="matrix(0.44444444,0,0,0.44444444,-774.10444,27.578499)">
+        <g
+           id="g30822"
+           transform="translate(1e-5)">
+          <g
+             id="g30820">
+            <g
+               id="g30818">
+              <g
+                 id="g30816">
+                <rect
+                   style="opacity:0.61;fill:#000000;stroke-width:1.00094"
+                   id="rect30814"
+                   width="439.00146"
+                   height="696.97461"
+                   x="122.01721"
+                   y="152.74527" />
+              </g>
+            </g>
+          </g>
+        </g>
+      </g>
+    </clipPath>
+    <defs
+       id="defs83758">
+      <path
+         d="m -672.614,346.449 c 0,1.487 1.206,2.692 2.692,2.692 1.488,0 2.692,-1.205 2.692,-2.692 0,-1.486 -1.204,-2.692 -2.692,-2.692 -1.486,0 -2.692,1.206 -2.692,2.692"
+         id="SVGID_4750_"
+         inkscape:connector-curvature="0" />
+    </defs>
+    <clipPath
+       id="clipPath102826">
+      <use
+         id="use102828"
+         overflow="visible"
+         xlink:href="#SVGID_4750_"
+         style="overflow:visible"
+         x="0"
+         y="0"
+         width="744.09448"
+         height="1052.3622" />
+    </clipPath>
+    <linearGradient
+       gradientTransform="matrix(0,5.3844,5.3844,0,129.2913,-1031.1833)"
+       y2="-148.4301"
+       x2="256.3541"
+       y1="-148.4301"
+       x1="255.3541"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient102830">
+      <stop
+         id="stop102832"
+         style="stop-color:#55AEB9"
+         offset="0" />
+      <stop
+         id="stop102834"
+         style="stop-color:#81D1DB"
+         offset="1" />
+    </linearGradient>
+    <clipPath
+       clipPathUnits="userSpaceOnUse"
+       id="clipPath30846">
+      <g
+         id="g30858"
+         transform="matrix(0.44444444,0,0,0.44444444,-774.10444,27.578499)">
+        <g
+           id="g30856"
+           transform="translate(1e-5)">
+          <g
+             id="g30854">
+            <g
+               id="g30852">
+              <g
+                 id="g30850">
+                <rect
+                   style="opacity:0.61;fill:#000000;stroke-width:1.00094"
+                   id="rect30848"
+                   width="439.00146"
+                   height="696.97461"
+                   x="122.01721"
+                   y="152.74527" />
+              </g>
+            </g>
+          </g>
+        </g>
+      </g>
+    </clipPath>
+    <defs
+       id="defs83478">
+      <path
+         d="m -612.756,334.666 c 0,1.488 1.206,2.694 2.692,2.694 1.487,0 2.691,-1.206 2.691,-2.694 0,-1.486 -1.204,-2.692 -2.691,-2.692 -1.486,0 -2.692,1.206 -2.692,2.692"
+         id="SVGID_4710_"
+         inkscape:connector-curvature="0" />
+    </defs>
+    <clipPath
+       id="clipPath102610">
+      <use
+         id="use102612"
+         overflow="visible"
+         xlink:href="#SVGID_4710_"
+         style="overflow:visible"
+         x="0"
+         y="0"
+         width="744.09448"
+         height="1052.3622" />
+    </clipPath>
+    <linearGradient
+       gradientTransform="matrix(0,5.3844,5.3844,0,189.1483,-1042.9659)"
+       y2="-148.42999"
+       x2="256.3544"
+       y1="-148.42999"
+       x1="255.3541"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient102614">
+      <stop
+         id="stop102616"
+         style="stop-color:#55AEB9"
+         offset="0" />
+      <stop
+         id="stop102618"
+         style="stop-color:#81D1DB"
+         offset="1" />
+    </linearGradient>
+    <clipPath
+       clipPathUnits="userSpaceOnUse"
+       id="clipPath30880">
+      <g
+         id="g30892"
+         transform="matrix(0.44444444,0,0,0.44444444,-774.10444,27.578499)">
+        <g
+           id="g30890"
+           transform="translate(1e-5)">
+          <g
+             id="g30888">
+            <g
+               id="g30886">
+              <g
+                 id="g30884">
+                <rect
+                   style="opacity:0.61;fill:#000000;stroke-width:1.00094"
+                   id="rect30882"
+                   width="439.00146"
+                   height="696.97461"
+                   x="122.01721"
+                   y="152.74527" />
+              </g>
+            </g>
+          </g>
+        </g>
+      </g>
+    </clipPath>
+    <defs
+       id="defs83058">
+      <path
+         d="m -612.756,323.119 c 0,1.487 1.206,2.694 2.692,2.694 1.487,0 2.691,-1.207 2.691,-2.694 0,-1.486 -1.204,-2.69 -2.691,-2.69 -1.486,0 -2.692,1.204 -2.692,2.69"
+         id="SVGID_4650_"
+         inkscape:connector-curvature="0" />
+    </defs>
+    <clipPath
+       id="clipPath102286">
+      <use
+         id="use102288"
+         overflow="visible"
+         xlink:href="#SVGID_4650_"
+         style="overflow:visible"
+         x="0"
+         y="0"
+         width="744.09448"
+         height="1052.3622" />
+    </clipPath>
+    <linearGradient
+       gradientTransform="matrix(0,5.3836,5.3836,0,189.1858,-1054.4158)"
+       y2="-148.4601"
+       x2="256.37631"
+       y1="-148.4601"
+       x1="255.37621"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient102290">
+      <stop
+         id="stop102292"
+         style="stop-color:#55AEB9"
+         offset="0" />
+      <stop
+         id="stop102294"
+         style="stop-color:#81D1DB"
+         offset="1" />
+    </linearGradient>
+    <clipPath
+       clipPathUnits="userSpaceOnUse"
+       id="clipPath30914">
+      <g
+         id="g30926"
+         transform="matrix(0.44444444,0,0,0.44444444,-774.10444,27.578499)">
+        <g
+           id="g30924"
+           transform="translate(1e-5)">
+          <g
+             id="g30922">
+            <g
+               id="g30920">
+              <g
+                 id="g30918">
+                <rect
+                   style="opacity:0.61;fill:#000000;stroke-width:1.00094"
+                   id="rect30916"
+                   width="439.00146"
+                   height="696.97461"
+                   x="122.01721"
+                   y="152.74527" />
+              </g>
+            </g>
+          </g>
+        </g>
+      </g>
+    </clipPath>
+    <defs
+       id="defs82393">
+      <path
+         d="m -672.614,311.531 c 0,1.487 1.206,2.694 2.692,2.694 1.488,0 2.692,-1.207 2.692,-2.694 0,-1.485 -1.204,-2.69 -2.692,-2.69 -1.486,0 -2.692,1.205 -2.692,2.69"
+         id="SVGID_4555_"
+         inkscape:connector-curvature="0" />
+    </defs>
+    <clipPath
+       id="clipPath101773">
+      <use
+         id="use101775"
+         overflow="visible"
+         xlink:href="#SVGID_4555_"
+         style="overflow:visible"
+         x="0"
+         y="0"
+         width="744.09448"
+         height="1052.3622" />
+    </clipPath>
+    <linearGradient
+       gradientTransform="matrix(0,5.3836,5.3836,0,129.3288,-1066.0031)"
+       y2="-148.46021"
+       x2="256.3761"
+       y1="-148.46021"
+       x1="255.3761"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient101777">
+      <stop
+         id="stop101779"
+         style="stop-color:#55AEB9"
+         offset="0" />
+      <stop
+         id="stop101781"
+         style="stop-color:#81D1DB"
+         offset="1" />
+    </linearGradient>
+    <clipPath
+       clipPathUnits="userSpaceOnUse"
+       id="clipPath30948">
+      <g
+         id="g30960"
+         transform="matrix(0.44444444,0,0,0.44444444,-774.10444,27.578499)">
+        <g
+           id="g30958"
+           transform="translate(1e-5)">
+          <g
+             id="g30956">
+            <g
+               id="g30954">
+              <g
+                 id="g30952">
+                <rect
+                   style="opacity:0.61;fill:#000000;stroke-width:1.00094"
+                   id="rect30950"
+                   width="439.00146"
+                   height="696.97461"
+                   x="122.01721"
+                   y="152.74527" />
+              </g>
+            </g>
+          </g>
+        </g>
+      </g>
+    </clipPath>
+    <defs
+       id="defs82918">
+      <path
+         d="m -660.642,323.119 c 0,1.487 1.206,2.694 2.692,2.694 1.488,0 2.692,-1.207 2.692,-2.694 0,-1.486 -1.204,-2.69 -2.692,-2.69 -1.486,0 -2.692,1.204 -2.692,2.69"
+         id="SVGID_4630_"
+         inkscape:connector-curvature="0" />
+    </defs>
+    <clipPath
+       id="clipPath102178">
+      <use
+         id="use102180"
+         overflow="visible"
+         xlink:href="#SVGID_4630_"
+         style="overflow:visible"
+         x="0"
+         y="0"
+         width="744.09448"
+         height="1052.3622" />
+    </clipPath>
+    <linearGradient
+       gradientTransform="matrix(0,5.3836,5.3836,0,141.3002,-1054.4158)"
+       y2="-148.4601"
+       x2="256.37631"
+       y1="-148.4601"
+       x1="255.37621"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient102182">
+      <stop
+         id="stop102184"
+         style="stop-color:#55AEB9"
+         offset="0" />
+      <stop
+         id="stop102186"
+         style="stop-color:#81D1DB"
+         offset="1" />
+    </linearGradient>
+    <clipPath
+       clipPathUnits="userSpaceOnUse"
+       id="clipPath30982">
+      <g
+         id="g30994"
+         transform="matrix(0.44444444,0,0,0.44444444,-774.10444,27.578499)">
+        <g
+           id="g30992"
+           transform="translate(1e-5)">
+          <g
+             id="g30990">
+            <g
+               id="g30988">
+              <g
+                 id="g30986">
+                <rect
+                   style="opacity:0.61;fill:#000000;stroke-width:1.00094"
+                   id="rect30984"
+                   width="439.00146"
+                   height="696.97461"
+                   x="122.01721"
+                   y="152.74527" />
+              </g>
+            </g>
+          </g>
+        </g>
+      </g>
+    </clipPath>
+    <defs
+       id="defs84640-9">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="SVGID_4852_-4" />
+    </defs>
+    <clipPath
+       id="clipPath126879-0">
+      <use
+         id="use126881-7"
+         overflow="visible"
+         xlink:href="#SVGID_4852_-4"
+         style="overflow:visible"
+         x="0"
+         y="0"
+         width="744.09448"
+         height="1052.3622" />
+    </clipPath>
+    <defs
+       id="defs83738">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="SVGID_4748_" />
+    </defs>
+    <clipPath
+       id="clipPath102813">
+      <use
+         id="use102815"
+         overflow="visible"
+         xlink:href="#SVGID_4748_"
+         style="overflow:visible"
+         x="0"
+         y="0"
+         width="744.09448"
+         height="1052.3622" />
+    </clipPath>
+    <defs
+       id="defs83948">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="SVGID_4778_" />
+    </defs>
+    <clipPath
+       id="clipPath102975">
+      <use
+         id="use102977"
+         overflow="visible"
+         xlink:href="#SVGID_4778_"
+         style="overflow:visible"
+         x="0"
+         y="0"
+         width="744.09448"
+         height="1052.3622" />
+    </clipPath>
+    <defs
+       id="defs82533">
+      <path
+         d="m -624.728,311.531 c 0,1.487 1.206,2.694 2.693,2.694 1.487,0 2.691,-1.207 2.691,-2.694 0,-1.485 -1.204,-2.69 -2.691,-2.69 -1.487,0 -2.693,1.205 -2.693,2.69"
+         id="SVGID_4575_"
+         inkscape:connector-curvature="0" />
+    </defs>
+    <clipPath
+       id="clipPath101881">
+      <use
+         id="use101883"
+         overflow="visible"
+         xlink:href="#SVGID_4575_"
+         style="overflow:visible"
+         x="0"
+         y="0"
+         width="744.09448"
+         height="1052.3622" />
+    </clipPath>
+    <linearGradient
+       gradientTransform="matrix(0,5.3836,5.3836,0,177.2143,-1066.0031)"
+       y2="-148.4601"
+       x2="256.3761"
+       y1="-148.4601"
+       x1="255.3761"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient101885">
+      <stop
+         id="stop101887"
+         style="stop-color:#55AEB9"
+         offset="0" />
+      <stop
+         id="stop101889"
+         style="stop-color:#81D1DB"
+         offset="1" />
+    </linearGradient>
+    <clipPath
+       clipPathUnits="userSpaceOnUse"
+       id="clipPath31042">
+      <g
+         id="g31054"
+         transform="matrix(0.44444444,0,0,0.44444444,-774.10444,27.578499)">
+        <g
+           id="g31052"
+           transform="translate(1e-5)">
+          <g
+             id="g31050">
+            <g
+               id="g31048">
+              <g
+                 id="g31046">
+                <rect
+                   style="opacity:0.61;fill:#000000;stroke-width:1.00094"
+                   id="rect31044"
+                   width="439.00146"
+                   height="696.97461"
+                   x="122.01721"
+                   y="152.74527" />
+              </g>
+            </g>
+          </g>
+        </g>
+      </g>
+    </clipPath>
+    <defs
+       id="defs83878">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="SVGID_4768_" />
+    </defs>
+    <clipPath
+       id="clipPath102921">
+      <use
+         id="use102923"
+         overflow="visible"
+         xlink:href="#SVGID_4768_"
+         style="overflow:visible"
+         x="0"
+         y="0"
+         width="744.09448"
+         height="1052.3622" />
+    </clipPath>
+    <defs
+       id="defs82568">
+      <path
+         d="m -612.756,311.531 c 0,1.487 1.206,2.694 2.692,2.694 1.487,0 2.691,-1.207 2.691,-2.694 0,-1.485 -1.204,-2.69 -2.691,-2.69 -1.486,0 -2.692,1.205 -2.692,2.69"
+         id="SVGID_4580_"
+         inkscape:connector-curvature="0" />
+    </defs>
+    <clipPath
+       id="clipPath101908">
+      <use
+         id="use101910"
+         overflow="visible"
+         xlink:href="#SVGID_4580_"
+         style="overflow:visible"
+         x="0"
+         y="0"
+         width="744.09448"
+         height="1052.3622" />
+    </clipPath>
+    <linearGradient
+       gradientTransform="matrix(0,5.3836,5.3836,0,189.1858,-1066.0031)"
+       y2="-148.4601"
+       x2="256.3761"
+       y1="-148.4601"
+       x1="255.3761"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient101912">
+      <stop
+         id="stop101914"
+         style="stop-color:#55AEB9"
+         offset="0" />
+      <stop
+         id="stop101916"
+         style="stop-color:#81D1DB"
+         offset="1" />
+    </linearGradient>
+    <clipPath
+       clipPathUnits="userSpaceOnUse"
+       id="clipPath31086">
+      <g
+         id="g31098"
+         transform="matrix(0.44444444,0,0,0.44444444,-774.10444,27.578499)">
+        <g
+           id="g31096"
+           transform="translate(1e-5)">
+          <g
+             id="g31094">
+            <g
+               id="g31092">
+              <g
+                 id="g31090">
+                <rect
+                   style="opacity:0.61;fill:#000000;stroke-width:1.00094"
+                   id="rect31088"
+                   width="439.00146"
+                   height="696.97461"
+                   x="122.01721"
+                   y="152.74527" />
+              </g>
+            </g>
+          </g>
+        </g>
+      </g>
+    </clipPath>
+    <defs
+       id="defs82109-6">
+      <polygon
+         points="-528.257,196.685 -526.139,198.478 -524.02,196.685 -504.975,196.685 -504.975,188.287 -547.302,188.287 -547.302,196.684 "
+         id="SVGID_4519_-5" />
+    </defs>
+    <clipPath
+       id="clipPath126820-6">
+      <use
+         id="use126822-8"
+         overflow="visible"
+         xlink:href="#SVGID_4519_-5"
+         style="overflow:visible"
+         x="0"
+         y="0"
+         width="744.09448"
+         height="1052.3622" />
+    </clipPath>
+    <linearGradient
+       gradientTransform="matrix(0,-10.1906,-10.1906,0,968.7597,614.6687)"
+       y2="146.6937"
+       x2="41.840599"
+       y1="146.6937"
+       x1="40.840599"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient126824-4">
+      <stop
+         id="stop126826-2"
+         style="stop-color:#37424B"
+         offset="0" />
+      <stop
+         id="stop126828-3"
+         style="stop-color:#37424B"
+         offset="0.12" />
+      <stop
+         id="stop126830-7"
+         style="stop-color:#5E6A71"
+         offset="0.88" />
+      <stop
+         id="stop126832-6"
+         style="stop-color:#5E6A71"
+         offset="1" />
+    </linearGradient>
+    <clipPath
+       clipPathUnits="userSpaceOnUse"
+       id="clipPath31122">
+      <g
+         id="g31134"
+         transform="matrix(0.2962963,0,0,0.2962963,-602.80741,109.97993)">
+        <g
+           id="g31132">
+          <g
+             id="g31130">
+            <g
+               id="g31128">
+              <g
+                 id="g31126">
+                <rect
+                   style="opacity:0.61;fill:#000000;stroke-width:1.00094"
+                   id="rect31124"
+                   width="439.00146"
+                   height="696.97461"
+                   x="122.01721"
+                   y="152.74527" />
+              </g>
+            </g>
+          </g>
+        </g>
+      </g>
+    </clipPath>
+    <defs
+       id="defs82355">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="SVGID_4551_" />
+    </defs>
+    <clipPath
+       id="clipPath101748">
+      <use
+         id="use101750"
+         overflow="visible"
+         xlink:href="#SVGID_4551_"
+         style="overflow:visible"
+         x="0"
+         y="0"
+         width="744.09448"
+         height="1052.3622" />
+    </clipPath>
+    <defs
+       id="defs83458">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="SVGID_4708_" />
+    </defs>
+    <clipPath
+       id="clipPath102597">
+      <use
+         id="use102599"
+         overflow="visible"
+         xlink:href="#SVGID_4708_"
+         style="overflow:visible"
+         x="0"
+         y="0"
+         width="744.09448"
+         height="1052.3622" />
+    </clipPath>
+    <defs
+       id="defs83073">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="SVGID_4653_" />
+    </defs>
+    <clipPath
+       id="clipPath102300">
+      <use
+         id="use102302"
+         overflow="visible"
+         xlink:href="#SVGID_4653_"
+         style="overflow:visible"
+         x="0"
+         y="0"
+         width="744.09448"
+         height="1052.3622" />
+    </clipPath>
+    <defs
+       id="defs82953">
+      <path
+         d="m -648.671,323.119 c 0,1.487 1.206,2.694 2.692,2.694 1.488,0 2.692,-1.207 2.692,-2.694 0,-1.486 -1.204,-2.69 -2.692,-2.69 -1.486,0 -2.692,1.204 -2.692,2.69"
+         id="SVGID_4635_"
+         inkscape:connector-curvature="0" />
+    </defs>
+    <clipPath
+       id="clipPath102205">
+      <use
+         id="use102207"
+         overflow="visible"
+         xlink:href="#SVGID_4635_"
+         style="overflow:visible"
+         x="0"
+         y="0"
+         width="744.09448"
+         height="1052.3622" />
+    </clipPath>
+    <linearGradient
+       gradientTransform="matrix(0,5.3836,5.3836,0,153.2715,-1054.4158)"
+       y2="-148.4601"
+       x2="256.37631"
+       y1="-148.4601"
+       x1="255.37621"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient102209">
+      <stop
+         id="stop102211"
+         style="stop-color:#55AEB9"
+         offset="0" />
+      <stop
+         id="stop102213"
+         style="stop-color:#81D1DB"
+         offset="1" />
+    </linearGradient>
+    <clipPath
+       clipPathUnits="userSpaceOnUse"
+       id="clipPath31182">
+      <g
+         id="g31194"
+         transform="matrix(0.44444444,0,0,0.44444444,-774.10444,27.578499)">
+        <g
+           id="g31192"
+           transform="translate(1e-5)">
+          <g
+             id="g31190">
+            <g
+               id="g31188">
+              <g
+                 id="g31186">
+                <rect
+                   style="opacity:0.61;fill:#000000;stroke-width:1.00094"
+                   id="rect31184"
+                   width="439.00146"
+                   height="696.97461"
+                   x="122.01721"
+                   y="152.74527" />
+              </g>
+            </g>
+          </g>
+        </g>
+      </g>
+    </clipPath>
+    <defs
+       id="defs82603">
+      <path
+         d="m -600.785,311.531 c 0,1.487 1.206,2.694 2.692,2.694 1.488,0 2.691,-1.207 2.691,-2.694 0,-1.485 -1.203,-2.69 -2.691,-2.69 -1.486,0 -2.692,1.205 -2.692,2.69"
+         id="SVGID_4585_"
+         inkscape:connector-curvature="0" />
+    </defs>
+    <clipPath
+       id="clipPath101935">
+      <use
+         id="use101937"
+         overflow="visible"
+         xlink:href="#SVGID_4585_"
+         style="overflow:visible"
+         x="0"
+         y="0"
+         width="744.09448"
+         height="1052.3622" />
+    </clipPath>
+    <linearGradient
+       gradientTransform="matrix(0,5.3836,5.3836,0,201.1574,-1066.0031)"
+       y2="-148.46021"
+       x2="256.3761"
+       y1="-148.46021"
+       x1="255.3761"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient101939">
+      <stop
+         id="stop101941"
+         style="stop-color:#55AEB9"
+         offset="0" />
+      <stop
+         id="stop101943"
+         style="stop-color:#81D1DB"
+         offset="1" />
+    </linearGradient>
+    <clipPath
+       clipPathUnits="userSpaceOnUse"
+       id="clipPath31216">
+      <g
+         id="g31228"
+         transform="matrix(0.44444444,0,0,0.44444444,-774.10444,27.578499)">
+        <g
+           id="g31226"
+           transform="translate(1e-5)">
+          <g
+             id="g31224">
+            <g
+               id="g31222">
+              <g
+                 id="g31220">
+                <rect
+                   style="opacity:0.61;fill:#000000;stroke-width:1.00094"
+                   id="rect31218"
+                   width="439.00146"
+                   height="696.97461"
+                   x="122.01721"
+                   y="152.74527" />
+              </g>
+            </g>
+          </g>
+        </g>
+      </g>
+    </clipPath>
+    <defs
+       id="defs82341">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="SVGID_4549_" />
+    </defs>
+    <clipPath
+       id="clipPath101738">
+      <use
+         id="use101740"
+         overflow="visible"
+         xlink:href="#SVGID_4549_"
+         style="overflow:visible"
+         x="0"
+         y="0"
+         width="744.09448"
+         height="1052.3622" />
+    </clipPath>
+    <defs
+       id="defs82513">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="SVGID_4573_" />
+    </defs>
+    <clipPath
+       id="clipPath101868">
+      <use
+         id="use101870"
+         overflow="visible"
+         xlink:href="#SVGID_4573_"
+         style="overflow:visible"
+         x="0"
+         y="0"
+         width="744.09448"
+         height="1052.3622" />
+    </clipPath>
+    <defs
+       id="defs83423">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="SVGID_4703_" />
+    </defs>
+    <clipPath
+       id="clipPath102570">
+      <use
+         id="use102572"
+         overflow="visible"
+         xlink:href="#SVGID_4703_"
+         style="overflow:visible"
+         x="0"
+         y="0"
+         width="744.09448"
+         height="1052.3622" />
+    </clipPath>
+    <defs
+       id="defs83843">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="SVGID_4763_" />
+    </defs>
+    <clipPath
+       id="clipPath102894">
+      <use
+         id="use102896"
+         overflow="visible"
+         xlink:href="#SVGID_4763_"
+         style="overflow:visible"
+         x="0"
+         y="0"
+         width="744.09448"
+         height="1052.3622" />
+    </clipPath>
+    <defs
+       id="defs83388">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="SVGID_4698_" />
+    </defs>
+    <clipPath
+       id="clipPath102543">
+      <use
+         id="use102545"
+         overflow="visible"
+         xlink:href="#SVGID_4698_"
+         style="overflow:visible"
+         x="0"
+         y="0"
+         width="744.09448"
+         height="1052.3622" />
+    </clipPath>
+    <defs
+       id="defs82898">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="SVGID_4628_" />
+    </defs>
+    <clipPath
+       id="clipPath102165">
+      <use
+         id="use102167"
+         overflow="visible"
+         xlink:href="#SVGID_4628_"
+         style="overflow:visible"
+         x="0"
+         y="0"
+         width="744.09448"
+         height="1052.3622" />
+    </clipPath>
+    <defs
+       id="defs82583">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="SVGID_4583_" />
+    </defs>
+    <clipPath
+       id="clipPath101922">
+      <use
+         id="use101924"
+         overflow="visible"
+         xlink:href="#SVGID_4583_"
+         style="overflow:visible"
+         x="0"
+         y="0"
+         width="744.09448"
+         height="1052.3622" />
+    </clipPath>
+    <defs
+       id="defs83773">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="SVGID_4753_" />
+    </defs>
+    <clipPath
+       id="clipPath102840">
+      <use
+         id="use102842"
+         overflow="visible"
+         xlink:href="#SVGID_4753_"
+         style="overflow:visible"
+         x="0"
+         y="0"
+         width="744.09448"
+         height="1052.3622" />
+    </clipPath>
+    <defs
+       id="defs84652-4">
+      <polygon
+         points="-507.673,208.524 -507.673,203.458 -521.64,203.458 -523.432,206 -521.64,208.524 "
+         id="SVGID_4854_-1" />
+    </defs>
+    <clipPath
+       id="clipPath126888-1">
+      <use
+         id="use126890-4"
+         overflow="visible"
+         xlink:href="#SVGID_4854_-1"
+         style="overflow:visible"
+         x="0"
+         y="0"
+         width="744.09448"
+         height="1052.3622" />
+    </clipPath>
+    <linearGradient
+       gradientTransform="matrix(0,-5.065,-5.065,0,750.4031,35.2731)"
+       y2="249.94031"
+       x2="-33.205101"
+       y1="249.94031"
+       x1="-34.205299"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient126892-7">
+      <stop
+         id="stop126894-5"
+         style="stop-color:#E6E8E7"
+         offset="0" />
+      <stop
+         id="stop126896-6"
+         style="stop-color:#FFFFFF"
+         offset="1" />
+    </linearGradient>
+    <clipPath
+       clipPathUnits="userSpaceOnUse"
+       id="clipPath31334">
+      <g
+         id="g31346"
+         transform="matrix(0.2962963,0,0,0.2962963,-602.80741,109.97993)">
+        <g
+           id="g31344">
+          <g
+             id="g31342">
+            <g
+               id="g31340">
+              <g
+                 id="g31338">
+                <rect
+                   style="opacity:0.61;fill:#000000;stroke-width:1.00094"
+                   id="rect31336"
+                   width="439.00146"
+                   height="696.97461"
+                   x="122.01721"
+                   y="152.74527" />
+              </g>
+            </g>
+          </g>
+        </g>
+      </g>
+    </clipPath>
+    <defs
+       id="defs82498">
+      <path
+         d="m -636.699,311.531 c 0,1.487 1.206,2.694 2.692,2.694 1.487,0 2.692,-1.207 2.692,-2.694 0,-1.485 -1.205,-2.69 -2.692,-2.69 -1.486,0 -2.692,1.205 -2.692,2.69"
+         id="SVGID_4570_"
+         inkscape:connector-curvature="0" />
+    </defs>
+    <clipPath
+       id="clipPath101854">
+      <use
+         id="use101856"
+         overflow="visible"
+         xlink:href="#SVGID_4570_"
+         style="overflow:visible"
+         x="0"
+         y="0"
+         width="744.09448"
+         height="1052.3622" />
+    </clipPath>
+    <linearGradient
+       gradientTransform="matrix(0,5.3836,5.3836,0,165.2429,-1066.0031)"
+       y2="-148.46001"
+       x2="256.3761"
+       y1="-148.46001"
+       x1="255.3761"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient101858">
+      <stop
+         id="stop101860"
+         style="stop-color:#55AEB9"
+         offset="0" />
+      <stop
+         id="stop101862"
+         style="stop-color:#81D1DB"
+         offset="1" />
+    </linearGradient>
+    <clipPath
+       clipPathUnits="userSpaceOnUse"
+       id="clipPath31368">
+      <g
+         id="g31380"
+         transform="matrix(0.44444444,0,0,0.44444444,-774.10444,27.578499)">
+        <g
+           id="g31378"
+           transform="translate(1e-5)">
+          <g
+             id="g31376">
+            <g
+               id="g31374">
+              <g
+                 id="g31372">
+                <rect
+                   style="opacity:0.61;fill:#000000;stroke-width:1.00094"
+                   id="rect31370"
+                   width="439.00146"
+                   height="696.97461"
+                   x="122.01721"
+                   y="152.74527" />
+              </g>
+            </g>
+          </g>
+        </g>
+      </g>
+    </clipPath>
+    <defs
+       id="defs83808">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="SVGID_4758_" />
+    </defs>
+    <clipPath
+       id="clipPath102867">
+      <use
+         id="use102869"
+         overflow="visible"
+         xlink:href="#SVGID_4758_"
+         style="overflow:visible"
+         x="0"
+         y="0"
+         width="744.09448"
+         height="1052.3622" />
+    </clipPath>
+    <defs
+       id="defs83093">
+      <path
+         d="m -588.813,323.119 c 0,1.487 1.205,2.694 2.692,2.694 1.487,0 2.691,-1.207 2.691,-2.694 0,-1.486 -1.204,-2.69 -2.691,-2.69 -1.487,0 -2.692,1.204 -2.692,2.69"
+         id="SVGID_4655_"
+         inkscape:connector-curvature="0" />
+    </defs>
+    <clipPath
+       id="clipPath102313">
+      <use
+         id="use102315"
+         overflow="visible"
+         xlink:href="#SVGID_4655_"
+         style="overflow:visible"
+         x="0"
+         y="0"
+         width="744.09448"
+         height="1052.3622" />
+    </clipPath>
+    <linearGradient
+       gradientTransform="matrix(0,5.3836,5.3836,0,213.1288,-1054.4158)"
+       y2="-148.4601"
+       x2="256.37631"
+       y1="-148.4601"
+       x1="255.37621"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient102317">
+      <stop
+         id="stop102319"
+         style="stop-color:#55AEB9"
+         offset="0" />
+      <stop
+         id="stop102321"
+         style="stop-color:#81D1DB"
+         offset="1" />
+    </linearGradient>
+    <clipPath
+       clipPathUnits="userSpaceOnUse"
+       id="clipPath31412">
+      <g
+         id="g31424"
+         transform="matrix(0.44444444,0,0,0.44444444,-774.10444,27.578499)">
+        <g
+           id="g31422"
+           transform="translate(1e-5)">
+          <g
+             id="g31420">
+            <g
+               id="g31418">
+              <g
+                 id="g31416">
+                <rect
+                   style="opacity:0.61;fill:#000000;stroke-width:1.00094"
+                   id="rect31414"
+                   width="439.00146"
+                   height="696.97461"
+                   x="122.01721"
+                   y="152.74527" />
+              </g>
+            </g>
+          </g>
+        </g>
+      </g>
+    </clipPath>
+    <defs
+       id="defs83863">
+      <path
+         d="m -636.699,346.449 c 0,1.487 1.206,2.692 2.692,2.692 1.487,0 2.692,-1.205 2.692,-2.692 0,-1.486 -1.205,-2.692 -2.692,-2.692 -1.486,0 -2.692,1.206 -2.692,2.692"
+         id="SVGID_4765_"
+         inkscape:connector-curvature="0" />
+    </defs>
+    <clipPath
+       id="clipPath102907">
+      <use
+         id="use102909"
+         overflow="visible"
+         xlink:href="#SVGID_4765_"
+         style="overflow:visible"
+         x="0"
+         y="0"
+         width="744.09448"
+         height="1052.3622" />
+    </clipPath>
+    <linearGradient
+       gradientTransform="matrix(0,5.3844,5.3844,0,165.2054,-1031.1833)"
+       y2="-148.4299"
+       x2="256.3541"
+       y1="-148.4299"
+       x1="255.3541"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient102911">
+      <stop
+         id="stop102913"
+         style="stop-color:#55AEB9"
+         offset="0" />
+      <stop
+         id="stop102915"
+         style="stop-color:#81D1DB"
+         offset="1" />
+    </linearGradient>
+    <clipPath
+       clipPathUnits="userSpaceOnUse"
+       id="clipPath31446">
+      <g
+         id="g31458"
+         transform="matrix(0.44444444,0,0,0.44444444,-774.10444,27.578499)">
+        <g
+           id="g31456"
+           transform="translate(1e-5)">
+          <g
+             id="g31454">
+            <g
+               id="g31452">
+              <g
+                 id="g31450">
+                <rect
+                   style="opacity:0.61;fill:#000000;stroke-width:1.00094"
+                   id="rect31448"
+                   width="439.00146"
+                   height="696.97461"
+                   x="122.01721"
+                   y="152.74527" />
+              </g>
+            </g>
+          </g>
+        </g>
+      </g>
+    </clipPath>
+    <defs
+       id="defs82463">
+      <path
+         d="m -648.671,311.531 c 0,1.487 1.206,2.694 2.692,2.694 1.488,0 2.692,-1.207 2.692,-2.694 0,-1.485 -1.204,-2.69 -2.692,-2.69 -1.486,0 -2.692,1.205 -2.692,2.69"
+         id="SVGID_4565_"
+         inkscape:connector-curvature="0" />
+    </defs>
+    <clipPath
+       id="clipPath101827">
+      <use
+         id="use101829"
+         overflow="visible"
+         xlink:href="#SVGID_4565_"
+         style="overflow:visible"
+         x="0"
+         y="0"
+         width="744.09448"
+         height="1052.3622" />
+    </clipPath>
+    <linearGradient
+       gradientTransform="matrix(0,5.3836,5.3836,0,153.2715,-1066.0031)"
+       y2="-148.4601"
+       x2="256.3761"
+       y1="-148.4601"
+       x1="255.3761"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient101831">
+      <stop
+         id="stop101833"
+         style="stop-color:#55AEB9"
+         offset="0" />
+      <stop
+         id="stop101835"
+         style="stop-color:#81D1DB"
+         offset="1" />
+    </linearGradient>
+    <clipPath
+       clipPathUnits="userSpaceOnUse"
+       id="clipPath31480">
+      <g
+         id="g31492"
+         transform="matrix(0.44444444,0,0,0.44444444,-774.10444,27.578499)">
+        <g
+           id="g31490"
+           transform="translate(1e-5)">
+          <g
+             id="g31488">
+            <g
+               id="g31486">
+              <g
+                 id="g31484">
+                <rect
+                   style="opacity:0.61;fill:#000000;stroke-width:1.00094"
+                   id="rect31482"
+                   width="439.00146"
+                   height="696.97461"
+                   x="122.01721"
+                   y="152.74527" />
+              </g>
+            </g>
+          </g>
+        </g>
+      </g>
+    </clipPath>
+    <defs
+       id="defs83023">
+      <path
+         d="m -624.728,323.119 c 0,1.487 1.206,2.694 2.693,2.694 1.487,0 2.691,-1.207 2.691,-2.694 0,-1.486 -1.204,-2.69 -2.691,-2.69 -1.487,0 -2.693,1.204 -2.693,2.69"
+         id="SVGID_4645_"
+         inkscape:connector-curvature="0" />
+    </defs>
+    <clipPath
+       id="clipPath102259">
+      <use
+         id="use102261"
+         overflow="visible"
+         xlink:href="#SVGID_4645_"
+         style="overflow:visible"
+         x="0"
+         y="0"
+         width="744.09448"
+         height="1052.3622" />
+    </clipPath>
+    <linearGradient
+       gradientTransform="matrix(0,5.3836,5.3836,0,177.2143,-1054.4158)"
+       y2="-148.4601"
+       x2="256.37631"
+       y1="-148.4601"
+       x1="255.37621"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient102263">
+      <stop
+         id="stop102265"
+         style="stop-color:#55AEB9"
+         offset="0" />
+      <stop
+         id="stop102267"
+         style="stop-color:#81D1DB"
+         offset="1" />
+    </linearGradient>
+    <clipPath
+       clipPathUnits="userSpaceOnUse"
+       id="clipPath31514">
+      <g
+         id="g31526"
+         transform="matrix(0.44444444,0,0,0.44444444,-774.10444,27.578499)">
+        <g
+           id="g31524"
+           transform="translate(1e-5)">
+          <g
+             id="g31522">
+            <g
+               id="g31520">
+              <g
+                 id="g31518">
+                <rect
+                   style="opacity:0.61;fill:#000000;stroke-width:1.00094"
+                   id="rect31516"
+                   width="439.00146"
+                   height="696.97461"
+                   x="122.01721"
+                   y="152.74527" />
+              </g>
+            </g>
+          </g>
+        </g>
+      </g>
+    </clipPath>
+    <defs
+       id="defs82618">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="SVGID_4588_" />
+    </defs>
+    <clipPath
+       id="clipPath101949">
+      <use
+         id="use101951"
+         overflow="visible"
+         xlink:href="#SVGID_4588_"
+         style="overflow:visible"
+         x="0"
+         y="0"
+         width="744.09448"
+         height="1052.3622" />
+    </clipPath>
+    <defs
+       id="defs83443">
+      <path
+         d="m -636.699,334.666 c 0,1.488 1.206,2.694 2.692,2.694 1.487,0 2.692,-1.206 2.692,-2.694 0,-1.486 -1.205,-2.692 -2.692,-2.692 -1.486,0 -2.692,1.206 -2.692,2.692"
+         id="SVGID_4705_"
+         inkscape:connector-curvature="0" />
+    </defs>
+    <clipPath
+       id="clipPath102583">
+      <use
+         id="use102585"
+         overflow="visible"
+         xlink:href="#SVGID_4705_"
+         style="overflow:visible"
+         x="0"
+         y="0"
+         width="744.09448"
+         height="1052.3622" />
+    </clipPath>
+    <linearGradient
+       gradientTransform="matrix(0,5.3844,5.3844,0,165.2054,-1042.9659)"
+       y2="-148.4299"
+       x2="256.3544"
+       y1="-148.4299"
+       x1="255.3541"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient102587">
+      <stop
+         id="stop102589"
+         style="stop-color:#55AEB9"
+         offset="0" />
+      <stop
+         id="stop102591"
+         style="stop-color:#81D1DB"
+         offset="1" />
+    </linearGradient>
+    <clipPath
+       clipPathUnits="userSpaceOnUse"
+       id="clipPath31558">
+      <g
+         id="g31570"
+         transform="matrix(0.44444444,0,0,0.44444444,-774.10444,27.578499)">
+        <g
+           id="g31568"
+           transform="translate(1e-5)">
+          <g
+             id="g31566">
+            <g
+               id="g31564">
+              <g
+                 id="g31562">
+                <rect
+                   style="opacity:0.61;fill:#000000;stroke-width:1.00094"
+                   id="rect31560"
+                   width="439.00146"
+                   height="696.97461"
+                   x="122.01721"
+                   y="152.74527" />
+              </g>
+            </g>
+          </g>
+        </g>
+      </g>
+    </clipPath>
+    <defs
+       id="defs83318">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="SVGID_4688_" />
+    </defs>
+    <clipPath
+       id="clipPath102489">
+      <use
+         id="use102491"
+         overflow="visible"
+         xlink:href="#SVGID_4688_"
+         style="overflow:visible"
+         x="0"
+         y="0"
+         width="744.09448"
+         height="1052.3622" />
+    </clipPath>
+    <defs
+       id="defs82968">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="SVGID_4638_" />
+    </defs>
+    <clipPath
+       id="clipPath102219">
+      <use
+         id="use102221"
+         overflow="visible"
+         xlink:href="#SVGID_4638_"
+         style="overflow:visible"
+         x="0"
+         y="0"
+         width="744.09448"
+         height="1052.3622" />
+    </clipPath>
+    <defs
+       id="defs83983">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="SVGID_4783_" />
+    </defs>
+    <clipPath
+       id="clipPath103002">
+      <use
+         id="use103004"
+         overflow="visible"
+         xlink:href="#SVGID_4783_"
+         style="overflow:visible"
+         x="0"
+         y="0"
+         width="744.09448"
+         height="1052.3622" />
+    </clipPath>
+    <defs
+       id="defs82933">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="SVGID_4633_" />
+    </defs>
+    <clipPath
+       id="clipPath102192">
+      <use
+         id="use102194"
+         overflow="visible"
+         xlink:href="#SVGID_4633_"
+         style="overflow:visible"
+         x="0"
+         y="0"
+         width="744.09448"
+         height="1052.3622" />
+    </clipPath>
+    <defs
+       id="defs83373">
+      <path
+         d="m -660.642,334.666 c 0,1.488 1.206,2.694 2.692,2.694 1.488,0 2.692,-1.206 2.692,-2.694 0,-1.486 -1.204,-2.692 -2.692,-2.692 -1.486,0 -2.692,1.206 -2.692,2.692"
+         id="SVGID_4695_"
+         inkscape:connector-curvature="0" />
+    </defs>
+    <clipPath
+       id="clipPath102529">
+      <use
+         id="use102531"
+         overflow="visible"
+         xlink:href="#SVGID_4695_"
+         style="overflow:visible"
+         x="0"
+         y="0"
+         width="744.09448"
+         height="1052.3622" />
+    </clipPath>
+    <linearGradient
+       gradientTransform="matrix(0,5.3844,5.3844,0,141.2627,-1042.9659)"
+       y2="-148.4299"
+       x2="256.35419"
+       y1="-148.4299"
+       x1="255.3541"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient102533">
+      <stop
+         id="stop102535"
+         style="stop-color:#55AEB9"
+         offset="0" />
+      <stop
+         id="stop102537"
+         style="stop-color:#81D1DB"
+         offset="1" />
+    </linearGradient>
+    <clipPath
+       clipPathUnits="userSpaceOnUse"
+       id="clipPath31632">
+      <g
+         id="g31644"
+         transform="matrix(0.44444444,0,0,0.44444444,-774.10444,27.578499)">
+        <g
+           id="g31642"
+           transform="translate(1e-5)">
+          <g
+             id="g31640">
+            <g
+               id="g31638">
+              <g
+                 id="g31636">
+                <rect
+                   style="opacity:0.61;fill:#000000;stroke-width:1.00094"
+                   id="rect31634"
+                   width="439.00146"
+                   height="696.97461"
+                   x="122.01721"
+                   y="152.74527" />
+              </g>
+            </g>
+          </g>
+        </g>
+      </g>
+    </clipPath>
+    <defs
+       id="defs83353">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="SVGID_4693_" />
+    </defs>
+    <clipPath
+       id="clipPath102516">
+      <use
+         id="use102518"
+         overflow="visible"
+         xlink:href="#SVGID_4693_"
+         style="overflow:visible"
+         x="0"
+         y="0"
+         width="744.09448"
+         height="1052.3622" />
+    </clipPath>
+    <defs
+       id="defs82160">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="SVGID_4524_" />
+    </defs>
+    <clipPath
+       id="clipPath101582">
+      <use
+         id="use101584"
+         overflow="visible"
+         xlink:href="#SVGID_4524_"
+         style="overflow:visible"
+         x="0"
+         y="0"
+         width="744.09448"
+         height="1052.3622" />
+    </clipPath>
+    <defs
+       id="defs83828">
+      <path
+         d="m -648.671,346.449 c 0,1.487 1.206,2.692 2.692,2.692 1.488,0 2.692,-1.205 2.692,-2.692 0,-1.486 -1.204,-2.692 -2.692,-2.692 -1.486,0 -2.692,1.206 -2.692,2.692"
+         id="SVGID_4760_"
+         inkscape:connector-curvature="0" />
+    </defs>
+    <clipPath
+       id="clipPath102880">
+      <use
+         id="use102882"
+         overflow="visible"
+         xlink:href="#SVGID_4760_"
+         style="overflow:visible"
+         x="0"
+         y="0"
+         width="744.09448"
+         height="1052.3622" />
+    </clipPath>
+    <linearGradient
+       gradientTransform="matrix(0,5.3844,5.3844,0,153.234,-1031.1833)"
+       y2="-148.42999"
+       x2="256.3541"
+       y1="-148.42999"
+       x1="255.3541"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient102884">
+      <stop
+         id="stop102886"
+         style="stop-color:#55AEB9"
+         offset="0" />
+      <stop
+         id="stop102888"
+         style="stop-color:#81D1DB"
+         offset="1" />
+    </linearGradient>
+    <clipPath
+       clipPathUnits="userSpaceOnUse"
+       id="clipPath31722">
+      <g
+         id="g31734"
+         transform="matrix(0.44444444,0,0,0.44444444,-774.10444,27.578499)">
+        <g
+           id="g31732"
+           transform="translate(1e-5)">
+          <g
+             id="g31730">
+            <g
+               id="g31728">
+              <g
+                 id="g31726">
+                <rect
+                   style="opacity:0.61;fill:#000000;stroke-width:1.00094"
+                   id="rect31724"
+                   width="439.00146"
+                   height="696.97461"
+                   x="122.01721"
+                   y="152.74527" />
+              </g>
+            </g>
+          </g>
+        </g>
+      </g>
+    </clipPath>
+    <defs
+       id="defs84003">
+      <path
+         d="m -588.813,346.449 c 0,1.487 1.205,2.692 2.692,2.692 1.487,0 2.691,-1.205 2.691,-2.692 0,-1.486 -1.204,-2.692 -2.691,-2.692 -1.487,0 -2.692,1.206 -2.692,2.692"
+         id="SVGID_4785_"
+         inkscape:connector-curvature="0" />
+    </defs>
+    <clipPath
+       id="clipPath103015">
+      <use
+         id="use103017"
+         overflow="visible"
+         xlink:href="#SVGID_4785_"
+         style="overflow:visible"
+         x="0"
+         y="0"
+         width="744.09448"
+         height="1052.3622" />
+    </clipPath>
+    <linearGradient
+       gradientTransform="matrix(0,5.3844,5.3844,0,213.0913,-1031.1833)"
+       y2="-148.42999"
+       x2="256.3541"
+       y1="-148.42999"
+       x1="255.3541"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient103019">
+      <stop
+         id="stop103021"
+         style="stop-color:#55AEB9"
+         offset="0" />
+      <stop
+         id="stop103023"
+         style="stop-color:#81D1DB"
+         offset="1" />
+    </linearGradient>
+    <clipPath
+       clipPathUnits="userSpaceOnUse"
+       id="clipPath31756">
+      <g
+         id="g31768"
+         transform="matrix(0.44444444,0,0,0.44444444,-774.10444,27.578499)">
+        <g
+           id="g31766"
+           transform="translate(1e-5)">
+          <g
+             id="g31764">
+            <g
+               id="g31762">
+              <g
+                 id="g31760">
+                <rect
+                   style="opacity:0.61;fill:#000000;stroke-width:1.00094"
+                   id="rect31758"
+                   width="439.00146"
+                   height="696.97461"
+                   x="122.01721"
+                   y="152.74527" />
+              </g>
+            </g>
+          </g>
+        </g>
+      </g>
+    </clipPath>
+    <defs
+       id="defs83548">
+      <path
+         d="m -588.813,334.666 c 0,1.488 1.205,2.694 2.692,2.694 1.487,0 2.691,-1.206 2.691,-2.694 0,-1.486 -1.204,-2.692 -2.691,-2.692 -1.487,0 -2.692,1.206 -2.692,2.692"
+         id="SVGID_4720_"
+         inkscape:connector-curvature="0" />
+    </defs>
+    <clipPath
+       id="clipPath102664">
+      <use
+         id="use102666"
+         overflow="visible"
+         xlink:href="#SVGID_4720_"
+         style="overflow:visible"
+         x="0"
+         y="0"
+         width="744.09448"
+         height="1052.3622" />
+    </clipPath>
+    <linearGradient
+       gradientTransform="matrix(0,5.3844,5.3844,0,213.0913,-1042.9659)"
+       y2="-148.42999"
+       x2="256.3544"
+       y1="-148.42999"
+       x1="255.3541"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient102668">
+      <stop
+         id="stop102670"
+         style="stop-color:#55AEB9"
+         offset="0" />
+      <stop
+         id="stop102672"
+         style="stop-color:#81D1DB"
+         offset="1" />
+    </linearGradient>
+    <clipPath
+       clipPathUnits="userSpaceOnUse"
+       id="clipPath31790">
+      <g
+         id="g31802"
+         transform="matrix(0.44444444,0,0,0.44444444,-774.10444,27.578499)">
+        <g
+           id="g31800"
+           transform="translate(1e-5)">
+          <g
+             id="g31798">
+            <g
+               id="g31796">
+              <g
+                 id="g31794">
+                <rect
+                   style="opacity:0.61;fill:#000000;stroke-width:1.00094"
+                   id="rect31792"
+                   width="439.00146"
+                   height="696.97461"
+                   x="122.01721"
+                   y="152.74527" />
+              </g>
+            </g>
+          </g>
+        </g>
+      </g>
+    </clipPath>
+    <defs
+       id="defs82638">
+      <path
+         d="m -588.813,311.531 c 0,1.487 1.205,2.694 2.692,2.694 1.487,0 2.691,-1.207 2.691,-2.694 0,-1.485 -1.204,-2.69 -2.691,-2.69 -1.487,0 -2.692,1.205 -2.692,2.69"
+         id="SVGID_4590_"
+         inkscape:connector-curvature="0" />
+    </defs>
+    <clipPath
+       id="clipPath101962">
+      <use
+         id="use101964"
+         overflow="visible"
+         xlink:href="#SVGID_4590_"
+         style="overflow:visible"
+         x="0"
+         y="0"
+         width="744.09448"
+         height="1052.3622" />
+    </clipPath>
+    <linearGradient
+       gradientTransform="matrix(0,5.3836,5.3836,0,213.1288,-1066.0031)"
+       y2="-148.4601"
+       x2="256.3761"
+       y1="-148.4601"
+       x1="255.3761"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient101966">
+      <stop
+         id="stop101968"
+         style="stop-color:#55AEB9"
+         offset="0" />
+      <stop
+         id="stop101970"
+         style="stop-color:#81D1DB"
+         offset="1" />
+    </linearGradient>
+    <clipPath
+       clipPathUnits="userSpaceOnUse"
+       id="clipPath31824">
+      <g
+         id="g31836"
+         transform="matrix(0.44444444,0,0,0.44444444,-774.10444,27.578499)">
+        <g
+           id="g31834"
+           transform="translate(1e-5)">
+          <g
+             id="g31832">
+            <g
+               id="g31830">
+              <g
+                 id="g31828">
+                <rect
+                   style="opacity:0.61;fill:#000000;stroke-width:1.00094"
+                   id="rect31826"
+                   width="439.00146"
+                   height="696.97461"
+                   x="122.01721"
+                   y="152.74527" />
+              </g>
+            </g>
+          </g>
+        </g>
+      </g>
+    </clipPath>
+    <defs
+       id="defs82883">
+      <path
+         d="m -672.614,323.119 c 0,1.487 1.206,2.694 2.692,2.694 1.488,0 2.692,-1.207 2.692,-2.694 0,-1.486 -1.204,-2.69 -2.692,-2.69 -1.486,0 -2.692,1.204 -2.692,2.69"
+         id="SVGID_4625_"
+         inkscape:connector-curvature="0" />
+    </defs>
+    <clipPath
+       id="clipPath102151">
+      <use
+         id="use102153"
+         overflow="visible"
+         xlink:href="#SVGID_4625_"
+         style="overflow:visible"
+         x="0"
+         y="0"
+         width="744.09448"
+         height="1052.3622" />
+    </clipPath>
+    <linearGradient
+       gradientTransform="matrix(0,5.3836,5.3836,0,129.3288,-1054.4158)"
+       y2="-148.46021"
+       x2="256.37631"
+       y1="-148.46021"
+       x1="255.37621"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient102155">
+      <stop
+         id="stop102157"
+         style="stop-color:#55AEB9"
+         offset="0" />
+      <stop
+         id="stop102159"
+         style="stop-color:#81D1DB"
+         offset="1" />
+    </linearGradient>
+    <clipPath
+       clipPathUnits="userSpaceOnUse"
+       id="clipPath31858">
+      <g
+         id="g31870"
+         transform="matrix(0.44444444,0,0,0.44444444,-774.10444,27.578499)">
+        <g
+           id="g31868"
+           transform="translate(1e-5)">
+          <g
+             id="g31866">
+            <g
+               id="g31864">
+              <g
+                 id="g31862">
+                <rect
+                   style="opacity:0.61;fill:#000000;stroke-width:1.00094"
+                   id="rect31860"
+                   width="439.00146"
+                   height="696.97461"
+                   x="122.01721"
+                   y="152.74527" />
+              </g>
+            </g>
+          </g>
+        </g>
+      </g>
+    </clipPath>
+    <defs
+       id="defs83038">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="SVGID_4648_" />
+    </defs>
+    <clipPath
+       id="clipPath102273">
+      <use
+         id="use102275"
+         overflow="visible"
+         xlink:href="#SVGID_4648_"
+         style="overflow:visible"
+         x="0"
+         y="0"
+         width="744.09448"
+         height="1052.3622" />
+    </clipPath>
+    <defs
+       id="defs82988">
+      <path
+         d="m -636.699,323.119 c 0,1.487 1.206,2.694 2.692,2.694 1.487,0 2.692,-1.207 2.692,-2.694 0,-1.486 -1.205,-2.69 -2.692,-2.69 -1.486,0 -2.692,1.204 -2.692,2.69"
+         id="SVGID_4640_"
+         inkscape:connector-curvature="0" />
+    </defs>
+    <clipPath
+       id="clipPath102232">
+      <use
+         id="use102234"
+         overflow="visible"
+         xlink:href="#SVGID_4640_"
+         style="overflow:visible"
+         x="0"
+         y="0"
+         width="744.09448"
+         height="1052.3622" />
+    </clipPath>
+    <linearGradient
+       gradientTransform="matrix(0,5.3836,5.3836,0,165.2429,-1054.4158)"
+       y2="-148.46001"
+       x2="256.37631"
+       y1="-148.46001"
+       x1="255.37621"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient102236">
+      <stop
+         id="stop102238"
+         style="stop-color:#55AEB9"
+         offset="0" />
+      <stop
+         id="stop102240"
+         style="stop-color:#81D1DB"
+         offset="1" />
+    </linearGradient>
+    <clipPath
+       clipPathUnits="userSpaceOnUse"
+       id="clipPath31902">
+      <g
+         id="g31914"
+         transform="matrix(0.44444444,0,0,0.44444444,-774.10444,27.578499)">
+        <g
+           id="g31912"
+           transform="translate(1e-5)">
+          <g
+             id="g31910">
+            <g
+               id="g31908">
+              <g
+                 id="g31906">
+                <rect
+                   style="opacity:0.61;fill:#000000;stroke-width:1.00094"
+                   id="rect31904"
+                   width="439.00146"
+                   height="696.97461"
+                   x="122.01721"
+                   y="152.74527" />
+              </g>
+            </g>
+          </g>
+        </g>
+      </g>
+    </clipPath>
+    <defs
+       id="defs83408">
+      <path
+         d="m -648.671,334.666 c 0,1.488 1.206,2.694 2.692,2.694 1.488,0 2.692,-1.206 2.692,-2.694 0,-1.486 -1.204,-2.692 -2.692,-2.692 -1.486,0 -2.692,1.206 -2.692,2.692"
+         id="SVGID_4700_"
+         inkscape:connector-curvature="0" />
+    </defs>
+    <clipPath
+       id="clipPath102556">
+      <use
+         id="use102558"
+         overflow="visible"
+         xlink:href="#SVGID_4700_"
+         style="overflow:visible"
+         x="0"
+         y="0"
+         width="744.09448"
+         height="1052.3622" />
+    </clipPath>
+    <linearGradient
+       gradientTransform="matrix(0,5.3844,5.3844,0,153.234,-1042.9659)"
+       y2="-148.42999"
+       x2="256.3544"
+       y1="-148.42999"
+       x1="255.3541"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient102560">
+      <stop
+         id="stop102562"
+         style="stop-color:#55AEB9"
+         offset="0" />
+      <stop
+         id="stop102564"
+         style="stop-color:#81D1DB"
+         offset="1" />
+    </linearGradient>
+    <clipPath
+       clipPathUnits="userSpaceOnUse"
+       id="clipPath31936">
+      <g
+         id="g31948"
+         transform="matrix(0.44444444,0,0,0.44444444,-774.10444,27.578499)">
+        <g
+           id="g31946"
+           transform="translate(1e-5)">
+          <g
+             id="g31944">
+            <g
+               id="g31942">
+              <g
+                 id="g31940">
+                <rect
+                   style="opacity:0.61;fill:#000000;stroke-width:1.00094"
+                   id="rect31938"
+                   width="439.00146"
+                   height="696.97461"
+                   x="122.01721"
+                   y="152.74527" />
+              </g>
+            </g>
+          </g>
+        </g>
+      </g>
+    </clipPath>
+    <defs
+       id="defs82863">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="SVGID_4623_" />
+    </defs>
+    <clipPath
+       id="clipPath102138">
+      <use
+         id="use102140"
+         overflow="visible"
+         xlink:href="#SVGID_4623_"
+         style="overflow:visible"
+         x="0"
+         y="0"
+         width="744.09448"
+         height="1052.3622" />
+    </clipPath>
+    <defs
+       id="defs82548">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="SVGID_4578_" />
+    </defs>
+    <clipPath
+       id="clipPath101895">
+      <use
+         id="use101897"
+         overflow="visible"
+         xlink:href="#SVGID_4578_"
+         style="overflow:visible"
+         x="0"
+         y="0"
+         width="744.09448"
+         height="1052.3622" />
+    </clipPath>
+    <defs
+       id="defs84794">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="SVGID_4872_" />
+    </defs>
+    <clipPath
+       id="clipPath103597">
+      <use
+         id="use103599"
+         overflow="visible"
+         xlink:href="#SVGID_4872_"
+         style="overflow:visible"
+         x="0"
+         y="0"
+         width="744.09448"
+         height="1052.3622" />
+    </clipPath>
+    <defs
+       id="defs83968">
+      <path
+         d="m -600.785,346.449 c 0,1.487 1.206,2.692 2.692,2.692 1.488,0 2.691,-1.205 2.691,-2.692 0,-1.486 -1.203,-2.692 -2.691,-2.692 -1.486,0 -2.692,1.206 -2.692,2.692"
+         id="SVGID_4780_"
+         inkscape:connector-curvature="0" />
+    </defs>
+    <clipPath
+       id="clipPath102988">
+      <use
+         id="use102990"
+         overflow="visible"
+         xlink:href="#SVGID_4780_"
+         style="overflow:visible"
+         x="0"
+         y="0"
+         width="744.09448"
+         height="1052.3622" />
+    </clipPath>
+    <linearGradient
+       gradientTransform="matrix(0,5.3844,5.3844,0,201.1199,-1031.1833)"
+       y2="-148.4301"
+       x2="256.3541"
+       y1="-148.4301"
+       x1="255.3541"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient102992">
+      <stop
+         id="stop102994"
+         style="stop-color:#55AEB9"
+         offset="0" />
+      <stop
+         id="stop102996"
+         style="stop-color:#81D1DB"
+         offset="1" />
+    </linearGradient>
+    <clipPath
+       clipPathUnits="userSpaceOnUse"
+       id="clipPath32027">
+      <g
+         id="g32039"
+         transform="matrix(0.44444444,0,0,0.44444444,-774.10444,27.578499)">
+        <g
+           id="g32037"
+           transform="translate(1e-5)">
+          <g
+             id="g32035">
+            <g
+               id="g32033">
+              <g
+                 id="g32031">
+                <rect
+                   style="opacity:0.61;fill:#000000;stroke-width:1.00094"
+                   id="rect32029"
+                   width="439.00146"
+                   height="696.97461"
+                   x="122.01721"
+                   y="152.74527" />
+              </g>
+            </g>
+          </g>
+        </g>
+      </g>
+    </clipPath>
+    <defs
+       id="defs83003">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="SVGID_4643_" />
+    </defs>
+    <clipPath
+       id="clipPath102246">
+      <use
+         id="use102248"
+         overflow="visible"
+         xlink:href="#SVGID_4643_"
+         style="overflow:visible"
+         x="0"
+         y="0"
+         width="744.09448"
+         height="1052.3622" />
+    </clipPath>
+    <defs
+       id="defs83913">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="SVGID_4773_" />
+    </defs>
+    <clipPath
+       id="clipPath102948">
+      <use
+         id="use102950"
+         overflow="visible"
+         xlink:href="#SVGID_4773_"
+         style="overflow:visible"
+         x="0"
+         y="0"
+         width="744.09448"
+         height="1052.3622" />
+    </clipPath>
+    <defs
+       id="defs83528">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="SVGID_4718_" />
+    </defs>
+    <clipPath
+       id="clipPath102651">
+      <use
+         id="use102653"
+         overflow="visible"
+         xlink:href="#SVGID_4718_"
+         style="overflow:visible"
+         x="0"
+         y="0"
+         width="744.09448"
+         height="1052.3622" />
+    </clipPath>
+    <defs
+       id="defs83898">
+      <path
+         d="m -624.728,346.449 c 0,1.487 1.206,2.692 2.693,2.692 1.487,0 2.691,-1.205 2.691,-2.692 0,-1.486 -1.204,-2.692 -2.691,-2.692 -1.487,0 -2.693,1.206 -2.693,2.692"
+         id="SVGID_4770_"
+         inkscape:connector-curvature="0" />
+    </defs>
+    <clipPath
+       id="clipPath102934">
+      <use
+         id="use102936"
+         overflow="visible"
+         xlink:href="#SVGID_4770_"
+         style="overflow:visible"
+         x="0"
+         y="0"
+         width="744.09448"
+         height="1052.3622" />
+    </clipPath>
+    <linearGradient
+       gradientTransform="matrix(0,5.3844,5.3844,0,177.1768,-1031.1833)"
+       y2="-148.42999"
+       x2="256.3541"
+       y1="-148.42999"
+       x1="255.3541"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient102938">
+      <stop
+         id="stop102940"
+         style="stop-color:#55AEB9"
+         offset="0" />
+      <stop
+         id="stop102942"
+         style="stop-color:#81D1DB"
+         offset="1" />
+    </linearGradient>
+    <clipPath
+       clipPathUnits="userSpaceOnUse"
+       id="clipPath32091">
+      <g
+         id="g32103"
+         transform="matrix(0.44444444,0,0,0.44444444,-774.10444,27.578499)">
+        <g
+           id="g32101"
+           transform="translate(1e-5)">
+          <g
+             id="g32099">
+            <g
+               id="g32097">
+              <g
+                 id="g32095">
+                <rect
+                   style="opacity:0.61;fill:#000000;stroke-width:1.00094"
+                   id="rect32093"
+                   width="439.00146"
+                   height="696.97461"
+                   x="122.01721"
+                   y="152.74527" />
+              </g>
+            </g>
+          </g>
+        </g>
+      </g>
+    </clipPath>
+    <defs
+       id="defs83493">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="SVGID_4713_" />
+    </defs>
+    <clipPath
+       id="clipPath102624">
+      <use
+         id="use102626"
+         overflow="visible"
+         xlink:href="#SVGID_4713_"
+         style="overflow:visible"
+         x="0"
+         y="0"
+         width="744.09448"
+         height="1052.3622" />
+    </clipPath>
+    <defs
+       id="defs83513">
+      <path
+         d="m -600.785,334.666 c 0,1.488 1.206,2.694 2.692,2.694 1.488,0 2.691,-1.206 2.691,-2.694 0,-1.486 -1.203,-2.692 -2.691,-2.692 -1.486,0 -2.692,1.206 -2.692,2.692"
+         id="SVGID_4715_"
+         inkscape:connector-curvature="0" />
+    </defs>
+    <clipPath
+       id="clipPath102637">
+      <use
+         id="use102639"
+         overflow="visible"
+         xlink:href="#SVGID_4715_"
+         style="overflow:visible"
+         x="0"
+         y="0"
+         width="744.09448"
+         height="1052.3622" />
+    </clipPath>
+    <linearGradient
+       gradientTransform="matrix(0,5.3844,5.3844,0,201.1199,-1042.9659)"
+       y2="-148.4301"
+       x2="256.3544"
+       y1="-148.4301"
+       x1="255.3541"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient102641">
+      <stop
+         id="stop102643"
+         style="stop-color:#55AEB9"
+         offset="0" />
+      <stop
+         id="stop102645"
+         style="stop-color:#81D1DB"
+         offset="1" />
+    </linearGradient>
+    <clipPath
+       clipPathUnits="userSpaceOnUse"
+       id="clipPath32135">
+      <g
+         id="g32147"
+         transform="matrix(0.44444444,0,0,0.44444444,-774.10444,27.578499)">
+        <g
+           id="g32145"
+           transform="translate(1e-5)">
+          <g
+             id="g32143">
+            <g
+               id="g32141">
+              <g
+                 id="g32139">
+                <rect
+                   style="opacity:0.61;fill:#000000;stroke-width:1.00094"
+                   id="rect32137"
+                   width="439.00146"
+                   height="696.97461"
+                   x="122.01721"
+                   y="152.74527" />
+              </g>
+            </g>
+          </g>
+        </g>
+      </g>
+    </clipPath>
+    <defs
+       id="defs83338">
+      <path
+         d="m -672.614,334.666 c 0,1.488 1.206,2.694 2.692,2.694 1.488,0 2.692,-1.206 2.692,-2.694 0,-1.486 -1.204,-2.692 -2.692,-2.692 -1.486,0 -2.692,1.206 -2.692,2.692"
+         id="SVGID_4690_"
+         inkscape:connector-curvature="0" />
+    </defs>
+    <clipPath
+       id="clipPath102502">
+      <use
+         id="use102504"
+         overflow="visible"
+         xlink:href="#SVGID_4690_"
+         style="overflow:visible"
+         x="0"
+         y="0"
+         width="744.09448"
+         height="1052.3622" />
+    </clipPath>
+    <linearGradient
+       gradientTransform="matrix(0,5.3844,5.3844,0,129.2913,-1042.9659)"
+       y2="-148.4301"
+       x2="256.3544"
+       y1="-148.4301"
+       x1="255.3541"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient102506">
+      <stop
+         id="stop102508"
+         style="stop-color:#55AEB9"
+         offset="0" />
+      <stop
+         id="stop102510"
+         style="stop-color:#81D1DB"
+         offset="1" />
+    </linearGradient>
+    <clipPath
+       clipPathUnits="userSpaceOnUse"
+       id="clipPath32169">
+      <g
+         id="g32181"
+         transform="matrix(0.44444444,0,0,0.44444444,-774.10444,27.578499)">
+        <g
+           id="g32179"
+           transform="translate(1e-5)">
+          <g
+             id="g32177">
+            <g
+               id="g32175">
+              <g
+                 id="g32173">
+                <rect
+                   style="opacity:0.61;fill:#000000;stroke-width:1.00094"
+                   id="rect32171"
+                   width="439.00146"
+                   height="696.97461"
+                   x="122.01721"
+                   y="152.74527" />
+              </g>
+            </g>
+          </g>
+        </g>
+      </g>
+    </clipPath>
+    <defs
+       id="defs82341-9">
+      <rect
+         id="SVGID_4549_-8"
+         x="-682.31403"
+         y="181.315"
+         width="200.271"
+         height="205.44099" />
+    </defs>
+    <clipPath
+       id="clipPath101738-3">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4549_-8"
+         overflow="visible"
+         id="use101740-3" />
+    </clipPath>
+    <defs
+       id="defs82205">
+      <rect
+         height="64.251999"
+         width="45.873001"
+         y="293.259"
+         x="-441.56699"
+         id="SVGID_4533_" />
+    </defs>
+    <clipPath
+       id="clipPath101620">
+      <use
+         id="use101622"
+         overflow="visible"
+         xlink:href="#SVGID_4533_"
+         style="overflow:visible"
+         x="0"
+         y="0"
+         width="744.09448"
+         height="1052.3622" />
+    </clipPath>
+    <defs
+       id="defs82170">
+      <rect
+         height="64.251999"
+         width="175.168"
+         y="293.259"
+         x="-679.67902"
+         id="SVGID_4526_" />
+    </defs>
+    <clipPath
+       id="clipPath101590">
+      <use
+         id="use101592"
+         overflow="visible"
+         xlink:href="#SVGID_4526_"
+         style="overflow:visible"
+         x="0"
+         y="0"
+         width="744.09448"
+         height="1052.3622" />
+    </clipPath>
+    <defs
+       id="defs84837">
+      <rect
+         height="10.152"
+         width="174.94701"
+         y="360.13901"
+         x="-679.88898"
+         id="SVGID_4879_" />
+    </defs>
+    <clipPath
+       id="clipPath103634">
+      <use
+         id="use103636"
+         overflow="visible"
+         xlink:href="#SVGID_4879_"
+         style="overflow:visible"
+         x="0"
+         y="0"
+         width="744.09448"
+         height="1052.3622" />
+    </clipPath>
+    <defs
+       id="defs84806">
+      <rect
+         height="10.152"
+         width="174.95799"
+         y="360.13901"
+         x="-679.90002"
+         id="SVGID_4874_" />
+    </defs>
+    <clipPath
+       id="clipPath103606">
+      <use
+         id="use103608"
+         overflow="visible"
+         xlink:href="#SVGID_4874_"
+         style="overflow:visible"
+         x="0"
+         y="0"
+         width="744.09448"
+         height="1052.3622" />
+    </clipPath>
+    <defs
+       id="defs82213">
+      <rect
+         height="64.037003"
+         width="45.659"
+         y="293.367"
+         x="-441.45999"
+         id="SVGID_4535_" />
+    </defs>
+    <clipPath
+       id="clipPath101627">
+      <use
+         id="use101629"
+         overflow="visible"
+         xlink:href="#SVGID_4535_"
+         style="overflow:visible"
+         x="0"
+         y="0"
+         width="744.09448"
+         height="1052.3622" />
+    </clipPath>
+    <linearGradient
+       gradientTransform="matrix(0,64.0388,-64.0388,0,3481.4861,-7826.8223)"
+       y2="60.902401"
+       x2="127.8011"
+       y1="60.902401"
+       x1="126.8011"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient101631">
+      <stop
+         id="stop101633"
+         style="stop-color:#E6E8E7"
+         offset="0" />
+      <stop
+         id="stop101635"
+         style="stop-color:#FFFFFF"
+         offset="1" />
+    </linearGradient>
+    <defs
+       id="defs82193">
+      <rect
+         height="64.251999"
+         width="175.168"
+         y="293.259"
+         x="-679.67902"
+         id="SVGID_4531_" />
+    </defs>
+    <clipPath
+       id="clipPath101611">
+      <use
+         id="use101613"
+         overflow="visible"
+         xlink:href="#SVGID_4531_"
+         style="overflow:visible"
+         x="0"
+         y="0"
+         width="744.09448"
+         height="1052.3622" />
+    </clipPath>
+    <defs
+       id="defs82228">
+      <rect
+         height="64.251999"
+         width="45.873001"
+         y="293.259"
+         x="-441.56699"
+         id="SVGID_4538_" />
+    </defs>
+    <clipPath
+       id="clipPath101641">
+      <use
+         id="use101643"
+         overflow="visible"
+         xlink:href="#SVGID_4538_"
+         style="overflow:visible"
+         x="0"
+         y="0"
+         width="744.09448"
+         height="1052.3622" />
+    </clipPath>
+    <defs
+       id="defs82178">
+      <rect
+         height="64.037003"
+         width="174.953"
+         y="293.367"
+         x="-679.57202"
+         id="SVGID_4528_" />
+    </defs>
+    <clipPath
+       id="clipPath101597">
+      <use
+         id="use101599"
+         overflow="visible"
+         xlink:href="#SVGID_4528_"
+         style="overflow:visible"
+         x="0"
+         y="0"
+         width="744.09448"
+         height="1052.3622" />
+    </clipPath>
+    <linearGradient
+       gradientTransform="matrix(0,64.0388,-64.0388,0,3308.0217,-7826.8223)"
+       y2="60.902401"
+       x2="127.8011"
+       y1="60.902401"
+       x1="126.8011"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient101601">
+      <stop
+         id="stop101603"
+         style="stop-color:#E6E8E7"
+         offset="0" />
+      <stop
+         id="stop101605"
+         style="stop-color:#FFFFFF"
+         offset="1" />
+    </linearGradient>
+    <defs
+       id="defs84814">
+      <rect
+         height="10.152"
+         width="174.95799"
+         y="360.13901"
+         x="-679.90002"
+         id="SVGID_4876_" />
+    </defs>
+    <clipPath
+       id="clipPath103613">
+      <use
+         id="use103615"
+         overflow="visible"
+         xlink:href="#SVGID_4876_"
+         style="overflow:visible"
+         x="0"
+         y="0"
+         width="744.09448"
+         height="1052.3622" />
+    </clipPath>
+    <linearGradient
+       gradientTransform="matrix(0,-10.1526,-10.1526,0,900.78,782.1111)"
+       y2="147.0757"
+       x2="41.563"
+       y1="147.0757"
+       x1="40.563"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient103617">
+      <stop
+         id="stop103619"
+         style="stop-color:#55AEB9"
+         offset="0" />
+      <stop
+         id="stop103621"
+         style="stop-color:#B0D2D9"
+         offset="0.486" />
+      <stop
+         id="stop103623"
+         style="stop-color:#E6EFF1"
+         offset="0.8287" />
+      <stop
+         id="stop103625"
+         style="stop-color:#FFFFFF"
+         offset="0.9939" />
+      <stop
+         id="stop103627"
+         style="stop-color:#FFFFFF"
+         offset="1" />
+    </linearGradient>
+    <defs
+       id="defs84845">
+      <rect
+         height="10.153"
+         width="174.94701"
+         y="360.138"
+         x="-679.88898"
+         id="SVGID_4881_" />
+    </defs>
+    <clipPath
+       id="clipPath103641">
+      <use
+         id="use103643"
+         overflow="visible"
+         xlink:href="#SVGID_4881_"
+         style="overflow:visible"
+         x="0"
+         y="0"
+         width="744.09448"
+         height="1052.3622" />
+    </clipPath>
+    <clipPath
+       clipPathUnits="userSpaceOnUse"
+       id="clipPath60681">
+      <rect
+         style="opacity:1;fill:none;fill-opacity:1;stroke:#000000;stroke-width:7;stroke-linejoin:round;stroke-dasharray:none"
+         id="rect60683"
+         width="379.63181"
+         height="647.18188"
+         x="147.96869"
+         y="178.99452" />
+    </clipPath>
+    <clipPath
+       clipPathUnits="userSpaceOnUse"
+       id="clipPath60685">
+      <rect
+         style="opacity:1;fill:none;fill-opacity:1;stroke:#000000;stroke-width:7;stroke-linejoin:round;stroke-dasharray:none"
+         id="rect60687"
+         width="379.63181"
+         height="647.18188"
+         x="25.31588"
+         y="-9.4916677" />
+    </clipPath>
+    <clipPath
+       clipPathUnits="userSpaceOnUse"
+       id="clipPath60689">
+      <rect
+         style="opacity:1;fill:none;fill-opacity:1;stroke:#000000;stroke-width:7;stroke-linejoin:round;stroke-dasharray:none"
+         id="rect60691"
+         width="379.63181"
+         height="647.18188"
+         x="25.31588"
+         y="-9.4916677" />
+    </clipPath>
+    <clipPath
+       clipPathUnits="userSpaceOnUse"
+       id="clipPath60693">
+      <rect
+         style="opacity:1;fill:none;fill-opacity:1;stroke:#000000;stroke-width:7;stroke-linejoin:round;stroke-dasharray:none"
+         id="rect60695"
+         width="379.63181"
+         height="647.18188"
+         x="25.31588"
+         y="-9.4916677" />
+    </clipPath>
+    <clipPath
+       clipPathUnits="userSpaceOnUse"
+       id="clipPath60697">
+      <rect
+         style="opacity:1;fill:none;fill-opacity:1;stroke:#000000;stroke-width:7;stroke-linejoin:round;stroke-dasharray:none"
+         id="rect60699"
+         width="379.63181"
+         height="647.18188"
+         x="25.31588"
+         y="-9.4916677" />
+    </clipPath>
+    <clipPath
+       clipPathUnits="userSpaceOnUse"
+       id="clipPath60701">
+      <rect
+         style="opacity:1;fill:none;fill-opacity:1;stroke:#000000;stroke-width:7;stroke-linejoin:round;stroke-dasharray:none"
+         id="rect60703"
+         width="379.63181"
+         height="647.18188"
+         x="25.31588"
+         y="-9.4916677" />
+    </clipPath>
+    <clipPath
+       clipPathUnits="userSpaceOnUse"
+       id="clipPath60705">
+      <rect
+         style="opacity:1;fill:none;fill-opacity:1;stroke:#000000;stroke-width:7;stroke-linejoin:round;stroke-dasharray:none"
+         id="rect60707"
+         width="379.63181"
+         height="647.18188"
+         x="25.31588"
+         y="-9.4916677" />
+    </clipPath>
+    <clipPath
+       clipPathUnits="userSpaceOnUse"
+       id="clipPath60709">
+      <rect
+         style="opacity:1;fill:none;fill-opacity:1;stroke:#000000;stroke-width:7;stroke-linejoin:round;stroke-dasharray:none"
+         id="rect60711"
+         width="379.63181"
+         height="647.18188"
+         x="147.96869"
+         y="178.99452" />
+    </clipPath>
+    <clipPath
+       clipPathUnits="userSpaceOnUse"
+       id="clipPath60713">
+      <rect
+         style="opacity:1;fill:none;fill-opacity:1;stroke:#000000;stroke-width:7;stroke-linejoin:round;stroke-dasharray:none"
+         id="rect60715"
+         width="379.63181"
+         height="647.18188"
+         x="147.96869"
+         y="178.99452" />
+    </clipPath>
+    <clipPath
+       clipPathUnits="userSpaceOnUse"
+       id="clipPath60717">
+      <rect
+         style="opacity:1;fill:none;fill-opacity:1;stroke:#000000;stroke-width:7;stroke-linejoin:round;stroke-dasharray:none"
+         id="rect60719"
+         width="379.63181"
+         height="647.18188"
+         x="147.96869"
+         y="178.99452" />
+    </clipPath>
+    <clipPath
+       clipPathUnits="userSpaceOnUse"
+       id="clipPath60721">
+      <rect
+         style="opacity:1;fill:none;fill-opacity:1;stroke:#000000;stroke-width:7;stroke-linejoin:round;stroke-dasharray:none"
+         id="rect60723"
+         width="379.63181"
+         height="647.18188"
+         x="147.96869"
+         y="178.99452" />
+    </clipPath>
+    <clipPath
+       clipPathUnits="userSpaceOnUse"
+       id="clipPath60725">
+      <rect
+         style="opacity:1;fill:none;fill-opacity:1;stroke:#000000;stroke-width:7;stroke-linejoin:round;stroke-dasharray:none"
+         id="rect60727"
+         width="379.63181"
+         height="647.18188"
+         x="147.96869"
+         y="178.99452" />
+    </clipPath>
+    <clipPath
+       clipPathUnits="userSpaceOnUse"
+       id="clipPath60729">
+      <rect
+         style="opacity:1;fill:none;fill-opacity:1;stroke:#000000;stroke-width:7;stroke-linejoin:round;stroke-dasharray:none"
+         id="rect60731"
+         width="379.63181"
+         height="647.18188"
+         x="147.96869"
+         y="178.99452" />
+    </clipPath>
+    <clipPath
+       clipPathUnits="userSpaceOnUse"
+       id="clipPath60733">
+      <rect
+         style="opacity:1;fill:none;fill-opacity:1;stroke:#000000;stroke-width:7;stroke-linejoin:round;stroke-dasharray:none"
+         id="rect60735"
+         width="379.63181"
+         height="647.18188"
+         x="147.96869"
+         y="178.99452" />
+    </clipPath>
+    <clipPath
+       clipPathUnits="userSpaceOnUse"
+       id="clipPath60737">
+      <rect
+         style="opacity:1;fill:none;fill-opacity:1;stroke:#000000;stroke-width:3.11111;stroke-linejoin:round;stroke-dasharray:none"
+         id="rect60739"
+         width="168.72525"
+         height="287.63638"
+         x="-780.32684"
+         y="72.128014" />
+    </clipPath>
+    <clipPath
+       clipPathUnits="userSpaceOnUse"
+       id="clipPath60741">
+      <rect
+         style="opacity:1;fill:none;fill-opacity:1;stroke:#000000;stroke-width:3.11111;stroke-linejoin:round;stroke-dasharray:none"
+         id="rect60743"
+         width="168.72525"
+         height="287.63638"
+         x="-780.28253"
+         y="83.950233" />
+    </clipPath>
+    <clipPath
+       clipPathUnits="userSpaceOnUse"
+       id="clipPath60745">
+      <rect
+         style="opacity:1;fill:none;fill-opacity:1;stroke:#000000;stroke-width:3.11111;stroke-linejoin:round;stroke-dasharray:none"
+         id="rect60747"
+         width="168.72525"
+         height="287.63638"
+         x="-780.2381"
+         y="95.505791" />
+    </clipPath>
+    <clipPath
+       clipPathUnits="userSpaceOnUse"
+       id="clipPath60749">
+      <rect
+         style="opacity:1;fill:none;fill-opacity:1;stroke:#000000;stroke-width:3.11111;stroke-linejoin:round;stroke-dasharray:none"
+         id="rect60751"
+         width="168.72525"
+         height="287.63638"
+         x="-696.31427"
+         y="106.91624" />
+    </clipPath>
+    <clipPath
+       clipPathUnits="userSpaceOnUse"
+       id="clipPath60753">
+      <rect
+         style="opacity:1;fill:none;fill-opacity:1;stroke:#000000;stroke-width:3.11111;stroke-linejoin:round;stroke-dasharray:none"
+         id="rect60755"
+         width="168.72525"
+         height="287.63638"
+         x="-780.2381"
+         y="107.08979" />
+    </clipPath>
+    <clipPath
+       clipPathUnits="userSpaceOnUse"
+       id="clipPath60757">
+      <rect
+         style="opacity:1;fill:none;fill-opacity:1;stroke:#000000;stroke-width:7;stroke-linejoin:round;stroke-dasharray:none"
+         id="rect60759"
+         width="379.63181"
+         height="647.18188"
+         x="147.96869"
+         y="178.99452" />
+    </clipPath>
+    <clipPath
+       clipPathUnits="userSpaceOnUse"
+       id="clipPath60761">
+      <rect
+         style="opacity:1;fill:none;fill-opacity:1;stroke:#000000;stroke-width:3.11111;stroke-linejoin:round;stroke-dasharray:none"
+         id="rect60763"
+         width="168.72525"
+         height="287.63638"
+         x="-648.44501"
+         y="118.52407" />
+    </clipPath>
+    <clipPath
+       clipPathUnits="userSpaceOnUse"
+       id="clipPath60765">
+      <rect
+         style="opacity:1;fill:none;fill-opacity:1;stroke:#000000;stroke-width:3.11111;stroke-linejoin:round;stroke-dasharray:none"
+         id="rect60767"
+         width="168.72525"
+         height="287.63638"
+         x="-648.44501"
+         y="118.52407" />
+    </clipPath>
+    <clipPath
+       clipPathUnits="userSpaceOnUse"
+       id="clipPath60769">
+      <rect
+         style="opacity:1;fill:none;fill-opacity:1;stroke:#000000;stroke-width:7;stroke-linejoin:round;stroke-dasharray:none"
+         id="rect60771"
+         width="379.63181"
+         height="647.18188"
+         x="147.96869"
+         y="178.99452" />
+    </clipPath>
+    <clipPath
+       clipPathUnits="userSpaceOnUse"
+       id="clipPath60773">
+      <rect
+         style="opacity:1;fill:none;fill-opacity:1;stroke:#000000;stroke-width:4.01018;stroke-linejoin:round;stroke-dasharray:none"
+         id="rect60775"
+         width="280.33414"
+         height="287.63638"
+         x="-727.15228"
+         y="109.79829" />
+    </clipPath>
+    <clipPath
+       clipPathUnits="userSpaceOnUse"
+       id="clipPath60777">
+      <rect
+         style="opacity:1;fill:none;fill-opacity:1;stroke:#000000;stroke-width:4.01018;stroke-linejoin:round;stroke-dasharray:none"
+         id="rect60779"
+         width="280.33414"
+         height="287.63638"
+         x="-727.15228"
+         y="109.79829" />
+    </clipPath>
+    <clipPath
+       clipPathUnits="userSpaceOnUse"
+       id="clipPath60781">
+      <rect
+         style="opacity:1;fill:none;fill-opacity:1;stroke:#000000;stroke-width:4.01018;stroke-linejoin:round;stroke-dasharray:none"
+         id="rect60783"
+         width="280.33414"
+         height="287.63638"
+         x="-727.15228"
+         y="109.79829" />
+    </clipPath>
+    <clipPath
+       clipPathUnits="userSpaceOnUse"
+       id="clipPath60785">
+      <rect
+         style="opacity:1;fill:none;fill-opacity:1;stroke:#000000;stroke-width:4.01018;stroke-linejoin:round;stroke-dasharray:none"
+         id="rect60787"
+         width="280.33414"
+         height="287.63638"
+         x="-727.15228"
+         y="109.79829" />
+    </clipPath>
+    <clipPath
+       clipPathUnits="userSpaceOnUse"
+       id="clipPath60789">
+      <rect
+         style="opacity:1;fill:none;fill-opacity:1;stroke:#000000;stroke-width:3.11111;stroke-linejoin:round;stroke-dasharray:none"
+         id="rect60791"
+         width="168.72525"
+         height="287.63638"
+         x="-708.34058"
+         y="107.13162" />
+    </clipPath>
+    <clipPath
+       clipPathUnits="userSpaceOnUse"
+       id="clipPath60793">
+      <rect
+         style="opacity:1;fill:none;fill-opacity:1;stroke:#000000;stroke-width:3.11111;stroke-linejoin:round;stroke-dasharray:none"
+         id="rect60795"
+         width="168.72525"
+         height="287.63638"
+         x="-708.34058"
+         y="107.13162" />
+    </clipPath>
+    <clipPath
+       clipPathUnits="userSpaceOnUse"
+       id="clipPath60797">
+      <rect
+         style="opacity:1;fill:none;fill-opacity:1;stroke:#000000;stroke-width:3.11111;stroke-linejoin:round;stroke-dasharray:none"
+         id="rect60799"
+         width="168.72525"
+         height="287.63638"
+         x="-708.34058"
+         y="107.13162" />
+    </clipPath>
+    <clipPath
+       clipPathUnits="userSpaceOnUse"
+       id="clipPath60801">
+      <rect
+         style="opacity:1;fill:none;fill-opacity:1;stroke:#000000;stroke-width:3.11111;stroke-linejoin:round;stroke-dasharray:none"
+         id="rect60803"
+         width="168.72525"
+         height="287.63638"
+         x="-708.34058"
+         y="107.13162" />
+    </clipPath>
+    <clipPath
+       clipPathUnits="userSpaceOnUse"
+       id="clipPath60805">
+      <rect
+         style="opacity:1;fill:none;fill-opacity:1;stroke:#000000;stroke-width:3.11111;stroke-linejoin:round;stroke-dasharray:none"
+         id="rect60807"
+         width="168.72525"
+         height="287.63638"
+         x="-708.34058"
+         y="107.13162" />
+    </clipPath>
+    <clipPath
+       clipPathUnits="userSpaceOnUse"
+       id="clipPath60809">
+      <rect
+         style="opacity:1;fill:none;fill-opacity:1;stroke:#000000;stroke-width:3.11111;stroke-linejoin:round;stroke-dasharray:none"
+         id="rect60811"
+         width="168.72525"
+         height="287.63638"
+         x="-708.34058"
+         y="107.13162" />
+    </clipPath>
+    <clipPath
+       clipPathUnits="userSpaceOnUse"
+       id="clipPath60813">
+      <rect
+         style="opacity:1;fill:none;fill-opacity:1;stroke:#000000;stroke-width:3.11111;stroke-linejoin:round;stroke-dasharray:none"
+         id="rect60815"
+         width="168.72525"
+         height="287.63638"
+         x="-708.34058"
+         y="107.13162" />
+    </clipPath>
+    <clipPath
+       clipPathUnits="userSpaceOnUse"
+       id="clipPath60817">
+      <rect
+         style="opacity:1;fill:none;fill-opacity:1;stroke:#000000;stroke-width:3.11111;stroke-linejoin:round;stroke-dasharray:none"
+         id="rect60819"
+         width="168.72525"
+         height="287.63638"
+         x="-708.34058"
+         y="107.13162" />
+    </clipPath>
+    <clipPath
+       clipPathUnits="userSpaceOnUse"
+       id="clipPath60821">
+      <rect
+         style="opacity:1;fill:none;fill-opacity:1;stroke:#000000;stroke-width:3.11111;stroke-linejoin:round;stroke-dasharray:none"
+         id="rect60823"
+         width="168.72525"
+         height="287.63638"
+         x="-708.34058"
+         y="107.13162" />
+    </clipPath>
+    <clipPath
+       clipPathUnits="userSpaceOnUse"
+       id="clipPath60825">
+      <rect
+         style="opacity:1;fill:none;fill-opacity:1;stroke:#000000;stroke-width:3.11111;stroke-linejoin:round;stroke-dasharray:none"
+         id="rect60827"
+         width="168.72525"
+         height="287.63638"
+         x="-708.34058"
+         y="107.13162" />
+    </clipPath>
+    <clipPath
+       clipPathUnits="userSpaceOnUse"
+       id="clipPath60829">
+      <rect
+         style="opacity:1;fill:none;fill-opacity:1;stroke:#000000;stroke-width:3.11111;stroke-linejoin:round;stroke-dasharray:none"
+         id="rect60831"
+         width="168.72525"
+         height="287.63638"
+         x="-708.34058"
+         y="107.13162" />
+    </clipPath>
+    <clipPath
+       clipPathUnits="userSpaceOnUse"
+       id="clipPath60833">
+      <rect
+         style="opacity:1;fill:none;fill-opacity:1;stroke:#000000;stroke-width:3.11111;stroke-linejoin:round;stroke-dasharray:none"
+         id="rect60835"
+         width="168.72525"
+         height="287.63638"
+         x="-708.34058"
+         y="107.13162" />
+    </clipPath>
+    <clipPath
+       clipPathUnits="userSpaceOnUse"
+       id="clipPath60837">
+      <rect
+         style="opacity:1;fill:none;fill-opacity:1;stroke:#000000;stroke-width:3.11111;stroke-linejoin:round;stroke-dasharray:none"
+         id="rect60839"
+         width="168.72525"
+         height="287.63638"
+         x="-708.34058"
+         y="107.13162" />
+    </clipPath>
+    <clipPath
+       clipPathUnits="userSpaceOnUse"
+       id="clipPath60841">
+      <rect
+         style="opacity:1;fill:none;fill-opacity:1;stroke:#000000;stroke-width:3.11111;stroke-linejoin:round;stroke-dasharray:none"
+         id="rect60843"
+         width="168.72525"
+         height="287.63638"
+         x="-708.34058"
+         y="107.13162" />
+    </clipPath>
+    <clipPath
+       clipPathUnits="userSpaceOnUse"
+       id="clipPath60845">
+      <rect
+         style="opacity:1;fill:none;fill-opacity:1;stroke:#000000;stroke-width:3.11111;stroke-linejoin:round;stroke-dasharray:none"
+         id="rect60847"
+         width="168.72525"
+         height="287.63638"
+         x="-708.34058"
+         y="107.13162" />
+    </clipPath>
+    <clipPath
+       clipPathUnits="userSpaceOnUse"
+       id="clipPath60849">
+      <rect
+         style="opacity:1;fill:none;fill-opacity:1;stroke:#000000;stroke-width:3.11111;stroke-linejoin:round;stroke-dasharray:none"
+         id="rect60851"
+         width="168.72525"
+         height="287.63638"
+         x="-708.34058"
+         y="107.13162" />
+    </clipPath>
+    <clipPath
+       clipPathUnits="userSpaceOnUse"
+       id="clipPath60853">
+      <rect
+         style="opacity:1;fill:none;fill-opacity:1;stroke:#000000;stroke-width:3.11111;stroke-linejoin:round;stroke-dasharray:none"
+         id="rect60855"
+         width="168.72525"
+         height="287.63638"
+         x="-708.34058"
+         y="107.13162" />
+    </clipPath>
+    <clipPath
+       clipPathUnits="userSpaceOnUse"
+       id="clipPath60857">
+      <rect
+         style="opacity:1;fill:none;fill-opacity:1;stroke:#000000;stroke-width:3.11111;stroke-linejoin:round;stroke-dasharray:none"
+         id="rect60859"
+         width="168.72525"
+         height="287.63638"
+         x="-708.34058"
+         y="107.13162" />
+    </clipPath>
+    <clipPath
+       clipPathUnits="userSpaceOnUse"
+       id="clipPath60861">
+      <rect
+         style="opacity:1;fill:none;fill-opacity:1;stroke:#000000;stroke-width:3.11111;stroke-linejoin:round;stroke-dasharray:none"
+         id="rect60863"
+         width="168.72525"
+         height="287.63638"
+         x="-708.34058"
+         y="107.13162" />
+    </clipPath>
+    <clipPath
+       clipPathUnits="userSpaceOnUse"
+       id="clipPath60865">
+      <rect
+         style="opacity:1;fill:none;fill-opacity:1;stroke:#000000;stroke-width:3.11111;stroke-linejoin:round;stroke-dasharray:none"
+         id="rect60867"
+         width="168.72525"
+         height="287.63638"
+         x="-708.34058"
+         y="107.13162" />
+    </clipPath>
+    <clipPath
+       clipPathUnits="userSpaceOnUse"
+       id="clipPath60869">
+      <rect
+         style="opacity:1;fill:none;fill-opacity:1;stroke:#000000;stroke-width:3.11111;stroke-linejoin:round;stroke-dasharray:none"
+         id="rect60871"
+         width="168.72525"
+         height="287.63638"
+         x="-708.34058"
+         y="107.13162" />
+    </clipPath>
+    <clipPath
+       clipPathUnits="userSpaceOnUse"
+       id="clipPath60873">
+      <rect
+         style="opacity:1;fill:none;fill-opacity:1;stroke:#000000;stroke-width:3.11111;stroke-linejoin:round;stroke-dasharray:none"
+         id="rect60875"
+         width="168.72525"
+         height="287.63638"
+         x="-708.34058"
+         y="107.13162" />
+    </clipPath>
+    <clipPath
+       clipPathUnits="userSpaceOnUse"
+       id="clipPath60877">
+      <rect
+         style="opacity:1;fill:none;fill-opacity:1;stroke:#000000;stroke-width:3.11111;stroke-linejoin:round;stroke-dasharray:none"
+         id="rect60879"
+         width="168.72525"
+         height="287.63638"
+         x="-708.34058"
+         y="107.13162" />
+    </clipPath>
+    <clipPath
+       clipPathUnits="userSpaceOnUse"
+       id="clipPath60881">
+      <rect
+         style="opacity:1;fill:none;fill-opacity:1;stroke:#000000;stroke-width:3.11111;stroke-linejoin:round;stroke-dasharray:none"
+         id="rect60883"
+         width="168.72525"
+         height="287.63638"
+         x="-708.34058"
+         y="107.13162" />
+    </clipPath>
+    <clipPath
+       clipPathUnits="userSpaceOnUse"
+       id="clipPath60885">
+      <rect
+         style="opacity:1;fill:none;fill-opacity:1;stroke:#000000;stroke-width:3.11111;stroke-linejoin:round;stroke-dasharray:none"
+         id="rect60887"
+         width="168.72525"
+         height="287.63638"
+         x="-708.34058"
+         y="107.13162" />
+    </clipPath>
+    <clipPath
+       clipPathUnits="userSpaceOnUse"
+       id="clipPath60889">
+      <rect
+         style="opacity:1;fill:none;fill-opacity:1;stroke:#000000;stroke-width:3.11111;stroke-linejoin:round;stroke-dasharray:none"
+         id="rect60891"
+         width="168.72525"
+         height="287.63638"
+         x="-708.34058"
+         y="107.13162" />
+    </clipPath>
+    <clipPath
+       clipPathUnits="userSpaceOnUse"
+       id="clipPath60893">
+      <rect
+         style="opacity:1;fill:none;fill-opacity:1;stroke:#000000;stroke-width:3.11111;stroke-linejoin:round;stroke-dasharray:none"
+         id="rect60895"
+         width="168.72525"
+         height="287.63638"
+         x="-708.34058"
+         y="107.13162" />
+    </clipPath>
+    <clipPath
+       clipPathUnits="userSpaceOnUse"
+       id="clipPath60897">
+      <rect
+         style="opacity:1;fill:none;fill-opacity:1;stroke:#000000;stroke-width:3.11111;stroke-linejoin:round;stroke-dasharray:none"
+         id="rect60899"
+         width="168.72525"
+         height="287.63638"
+         x="-708.34058"
+         y="107.13162" />
+    </clipPath>
+    <clipPath
+       clipPathUnits="userSpaceOnUse"
+       id="clipPath60901">
+      <rect
+         style="opacity:1;fill:none;fill-opacity:1;stroke:#000000;stroke-width:3.11111;stroke-linejoin:round;stroke-dasharray:none"
+         id="rect60903"
+         width="168.72525"
+         height="287.63638"
+         x="-708.34058"
+         y="107.13162" />
+    </clipPath>
+    <clipPath
+       clipPathUnits="userSpaceOnUse"
+       id="clipPath60905">
+      <rect
+         style="opacity:1;fill:none;fill-opacity:1;stroke:#000000;stroke-width:3.11111;stroke-linejoin:round;stroke-dasharray:none"
+         id="rect60907"
+         width="168.72525"
+         height="287.63638"
+         x="-708.34058"
+         y="107.13162" />
+    </clipPath>
+    <clipPath
+       clipPathUnits="userSpaceOnUse"
+       id="clipPath60909">
+      <rect
+         style="opacity:1;fill:none;fill-opacity:1;stroke:#000000;stroke-width:3.11111;stroke-linejoin:round;stroke-dasharray:none"
+         id="rect60911"
+         width="168.72525"
+         height="287.63638"
+         x="-708.34058"
+         y="107.13162" />
+    </clipPath>
+    <clipPath
+       clipPathUnits="userSpaceOnUse"
+       id="clipPath60913">
+      <rect
+         style="opacity:1;fill:none;fill-opacity:1;stroke:#000000;stroke-width:3.11111;stroke-linejoin:round;stroke-dasharray:none"
+         id="rect60915"
+         width="168.72525"
+         height="287.63638"
+         x="-708.34058"
+         y="107.13162" />
+    </clipPath>
+    <clipPath
+       clipPathUnits="userSpaceOnUse"
+       id="clipPath60917">
+      <rect
+         style="opacity:1;fill:none;fill-opacity:1;stroke:#000000;stroke-width:3.11111;stroke-linejoin:round;stroke-dasharray:none"
+         id="rect60919"
+         width="168.72525"
+         height="287.63638"
+         x="-708.34058"
+         y="107.13162" />
+    </clipPath>
+    <clipPath
+       clipPathUnits="userSpaceOnUse"
+       id="clipPath60921">
+      <rect
+         style="opacity:1;fill:none;fill-opacity:1;stroke:#000000;stroke-width:3.11111;stroke-linejoin:round;stroke-dasharray:none"
+         id="rect60923"
+         width="168.72525"
+         height="287.63638"
+         x="-708.34058"
+         y="107.13162" />
+    </clipPath>
+    <clipPath
+       clipPathUnits="userSpaceOnUse"
+       id="clipPath60925">
+      <rect
+         style="opacity:1;fill:none;fill-opacity:1;stroke:#000000;stroke-width:3.11111;stroke-linejoin:round;stroke-dasharray:none"
+         id="rect60927"
+         width="168.72525"
+         height="287.63638"
+         x="-708.34058"
+         y="107.13162" />
+    </clipPath>
+    <clipPath
+       clipPathUnits="userSpaceOnUse"
+       id="clipPath60929">
+      <rect
+         style="opacity:1;fill:none;fill-opacity:1;stroke:#000000;stroke-width:3.11111;stroke-linejoin:round;stroke-dasharray:none"
+         id="rect60931"
+         width="168.72525"
+         height="287.63638"
+         x="-708.34058"
+         y="107.13162" />
+    </clipPath>
+    <clipPath
+       clipPathUnits="userSpaceOnUse"
+       id="clipPath60933">
+      <rect
+         style="opacity:1;fill:none;fill-opacity:1;stroke:#000000;stroke-width:3.11111;stroke-linejoin:round;stroke-dasharray:none"
+         id="rect60935"
+         width="168.72525"
+         height="287.63638"
+         x="-708.34058"
+         y="107.13162" />
+    </clipPath>
+    <clipPath
+       clipPathUnits="userSpaceOnUse"
+       id="clipPath60937">
+      <rect
+         style="opacity:1;fill:none;fill-opacity:1;stroke:#000000;stroke-width:3.11111;stroke-linejoin:round;stroke-dasharray:none"
+         id="rect60939"
+         width="168.72525"
+         height="287.63638"
+         x="-708.34058"
+         y="107.13162" />
+    </clipPath>
+    <clipPath
+       clipPathUnits="userSpaceOnUse"
+       id="clipPath60941">
+      <rect
+         style="opacity:1;fill:none;fill-opacity:1;stroke:#000000;stroke-width:3.11111;stroke-linejoin:round;stroke-dasharray:none"
+         id="rect60943"
+         width="168.72525"
+         height="287.63638"
+         x="-708.34058"
+         y="107.13162" />
+    </clipPath>
+    <clipPath
+       clipPathUnits="userSpaceOnUse"
+       id="clipPath60945">
+      <rect
+         style="opacity:1;fill:none;fill-opacity:1;stroke:#000000;stroke-width:3.11111;stroke-linejoin:round;stroke-dasharray:none"
+         id="rect60947"
+         width="168.72525"
+         height="287.63638"
+         x="-708.34058"
+         y="107.13162" />
+    </clipPath>
+    <clipPath
+       clipPathUnits="userSpaceOnUse"
+       id="clipPath60949">
+      <rect
+         style="opacity:1;fill:none;fill-opacity:1;stroke:#000000;stroke-width:3.11111;stroke-linejoin:round;stroke-dasharray:none"
+         id="rect60951"
+         width="168.72525"
+         height="287.63638"
+         x="-708.34058"
+         y="107.13162" />
+    </clipPath>
+    <clipPath
+       clipPathUnits="userSpaceOnUse"
+       id="clipPath60953">
+      <rect
+         style="opacity:1;fill:none;fill-opacity:1;stroke:#000000;stroke-width:3.11111;stroke-linejoin:round;stroke-dasharray:none"
+         id="rect60955"
+         width="168.72525"
+         height="287.63638"
+         x="-708.34058"
+         y="107.13162" />
+    </clipPath>
+    <clipPath
+       clipPathUnits="userSpaceOnUse"
+       id="clipPath60957">
+      <rect
+         style="opacity:1;fill:none;fill-opacity:1;stroke:#000000;stroke-width:3.11111;stroke-linejoin:round;stroke-dasharray:none"
+         id="rect60959"
+         width="168.72525"
+         height="287.63638"
+         x="-708.34058"
+         y="107.13162" />
+    </clipPath>
+    <clipPath
+       clipPathUnits="userSpaceOnUse"
+       id="clipPath60961">
+      <rect
+         style="opacity:1;fill:none;fill-opacity:1;stroke:#000000;stroke-width:3.11111;stroke-linejoin:round;stroke-dasharray:none"
+         id="rect60963"
+         width="168.72525"
+         height="287.63638"
+         x="-708.34058"
+         y="107.13162" />
+    </clipPath>
+    <clipPath
+       clipPathUnits="userSpaceOnUse"
+       id="clipPath60965">
+      <rect
+         style="opacity:1;fill:none;fill-opacity:1;stroke:#000000;stroke-width:3.11111;stroke-linejoin:round;stroke-dasharray:none"
+         id="rect60967"
+         width="168.72525"
+         height="287.63638"
+         x="-708.34058"
+         y="107.13162" />
+    </clipPath>
+    <clipPath
+       clipPathUnits="userSpaceOnUse"
+       id="clipPath60969">
+      <rect
+         style="opacity:1;fill:none;fill-opacity:1;stroke:#000000;stroke-width:3.11111;stroke-linejoin:round;stroke-dasharray:none"
+         id="rect60971"
+         width="168.72525"
+         height="287.63638"
+         x="-708.34058"
+         y="107.13162" />
+    </clipPath>
+    <clipPath
+       clipPathUnits="userSpaceOnUse"
+       id="clipPath60973">
+      <rect
+         style="opacity:1;fill:none;fill-opacity:1;stroke:#000000;stroke-width:3.11111;stroke-linejoin:round;stroke-dasharray:none"
+         id="rect60975"
+         width="168.72525"
+         height="287.63638"
+         x="-708.34058"
+         y="107.13162" />
+    </clipPath>
+    <clipPath
+       clipPathUnits="userSpaceOnUse"
+       id="clipPath60977">
+      <rect
+         style="opacity:1;fill:none;fill-opacity:1;stroke:#000000;stroke-width:3.11111;stroke-linejoin:round;stroke-dasharray:none"
+         id="rect60979"
+         width="168.72525"
+         height="287.63638"
+         x="-708.34058"
+         y="107.13162" />
+    </clipPath>
+    <clipPath
+       clipPathUnits="userSpaceOnUse"
+       id="clipPath60981">
+      <rect
+         style="opacity:1;fill:none;fill-opacity:1;stroke:#000000;stroke-width:3.11111;stroke-linejoin:round;stroke-dasharray:none"
+         id="rect60983"
+         width="168.72525"
+         height="287.63638"
+         x="-708.34058"
+         y="107.13162" />
+    </clipPath>
+    <clipPath
+       clipPathUnits="userSpaceOnUse"
+       id="clipPath60985">
+      <rect
+         style="opacity:1;fill:none;fill-opacity:1;stroke:#000000;stroke-width:3.11111;stroke-linejoin:round;stroke-dasharray:none"
+         id="rect60987"
+         width="168.72525"
+         height="287.63638"
+         x="-708.34058"
+         y="107.13162" />
+    </clipPath>
+    <clipPath
+       clipPathUnits="userSpaceOnUse"
+       id="clipPath60989">
+      <rect
+         style="opacity:1;fill:none;fill-opacity:1;stroke:#000000;stroke-width:3.11111;stroke-linejoin:round;stroke-dasharray:none"
+         id="rect60991"
+         width="168.72525"
+         height="287.63638"
+         x="-708.34058"
+         y="107.13162" />
+    </clipPath>
+    <clipPath
+       clipPathUnits="userSpaceOnUse"
+       id="clipPath60993">
+      <rect
+         style="opacity:1;fill:none;fill-opacity:1;stroke:#000000;stroke-width:3.11111;stroke-linejoin:round;stroke-dasharray:none"
+         id="rect60995"
+         width="168.72525"
+         height="287.63638"
+         x="-708.34058"
+         y="107.13162" />
+    </clipPath>
+    <clipPath
+       clipPathUnits="userSpaceOnUse"
+       id="clipPath60997">
+      <rect
+         style="opacity:1;fill:none;fill-opacity:1;stroke:#000000;stroke-width:3.11111;stroke-linejoin:round;stroke-dasharray:none"
+         id="rect60999"
+         width="168.72525"
+         height="287.63638"
+         x="-708.34058"
+         y="107.13162" />
+    </clipPath>
+    <clipPath
+       clipPathUnits="userSpaceOnUse"
+       id="clipPath61001">
+      <rect
+         style="opacity:1;fill:none;fill-opacity:1;stroke:#000000;stroke-width:3.11111;stroke-linejoin:round;stroke-dasharray:none"
+         id="rect61003"
+         width="168.72525"
+         height="287.63638"
+         x="-708.34058"
+         y="107.13162" />
+    </clipPath>
+    <clipPath
+       clipPathUnits="userSpaceOnUse"
+       id="clipPath61005">
+      <rect
+         style="opacity:1;fill:none;fill-opacity:1;stroke:#000000;stroke-width:3.11111;stroke-linejoin:round;stroke-dasharray:none"
+         id="rect61007"
+         width="168.72525"
+         height="287.63638"
+         x="-708.34058"
+         y="107.13162" />
+    </clipPath>
+    <clipPath
+       clipPathUnits="userSpaceOnUse"
+       id="clipPath61009">
+      <rect
+         style="opacity:1;fill:none;fill-opacity:1;stroke:#000000;stroke-width:3.11111;stroke-linejoin:round;stroke-dasharray:none"
+         id="rect61011"
+         width="168.72525"
+         height="287.63638"
+         x="-708.34058"
+         y="107.13162" />
+    </clipPath>
+    <clipPath
+       clipPathUnits="userSpaceOnUse"
+       id="clipPath61013">
+      <rect
+         style="opacity:1;fill:none;fill-opacity:1;stroke:#000000;stroke-width:3.11111;stroke-linejoin:round;stroke-dasharray:none"
+         id="rect61015"
+         width="168.72525"
+         height="287.63638"
+         x="-708.34058"
+         y="107.13162" />
+    </clipPath>
+    <clipPath
+       clipPathUnits="userSpaceOnUse"
+       id="clipPath61017">
+      <rect
+         style="opacity:1;fill:none;fill-opacity:1;stroke:#000000;stroke-width:3.11111;stroke-linejoin:round;stroke-dasharray:none"
+         id="rect61019"
+         width="168.72525"
+         height="287.63638"
+         x="-708.34058"
+         y="107.13162" />
+    </clipPath>
+    <clipPath
+       clipPathUnits="userSpaceOnUse"
+       id="clipPath61021">
+      <rect
+         style="opacity:1;fill:none;fill-opacity:1;stroke:#000000;stroke-width:3.11111;stroke-linejoin:round;stroke-dasharray:none"
+         id="rect61023"
+         width="168.72525"
+         height="287.63638"
+         x="-708.34058"
+         y="107.13162" />
+    </clipPath>
+    <clipPath
+       clipPathUnits="userSpaceOnUse"
+       id="clipPath61025">
+      <rect
+         style="opacity:1;fill:none;fill-opacity:1;stroke:#000000;stroke-width:3.11111;stroke-linejoin:round;stroke-dasharray:none"
+         id="rect61027"
+         width="168.72525"
+         height="287.63638"
+         x="-708.34058"
+         y="107.13162" />
+    </clipPath>
+    <clipPath
+       clipPathUnits="userSpaceOnUse"
+       id="clipPath61029">
+      <rect
+         style="opacity:1;fill:none;fill-opacity:1;stroke:#000000;stroke-width:3.11111;stroke-linejoin:round;stroke-dasharray:none"
+         id="rect61031"
+         width="168.72525"
+         height="287.63638"
+         x="-708.34058"
+         y="107.13162" />
+    </clipPath>
+    <clipPath
+       clipPathUnits="userSpaceOnUse"
+       id="clipPath61033">
+      <rect
+         style="opacity:1;fill:none;fill-opacity:1;stroke:#000000;stroke-width:3.11111;stroke-linejoin:round;stroke-dasharray:none"
+         id="rect61035"
+         width="168.72525"
+         height="287.63638"
+         x="-708.34058"
+         y="107.13162" />
+    </clipPath>
+    <clipPath
+       clipPathUnits="userSpaceOnUse"
+       id="clipPath61037">
+      <rect
+         style="opacity:1;fill:none;fill-opacity:1;stroke:#000000;stroke-width:3.11111;stroke-linejoin:round;stroke-dasharray:none"
+         id="rect61039"
+         width="168.72525"
+         height="287.63638"
+         x="-708.34058"
+         y="107.13162" />
+    </clipPath>
+    <clipPath
+       clipPathUnits="userSpaceOnUse"
+       id="clipPath61041">
+      <rect
+         style="opacity:1;fill:none;fill-opacity:1;stroke:#000000;stroke-width:3.11111;stroke-linejoin:round;stroke-dasharray:none"
+         id="rect61043"
+         width="168.72525"
+         height="287.63638"
+         x="-708.34058"
+         y="107.13162" />
+    </clipPath>
+    <clipPath
+       clipPathUnits="userSpaceOnUse"
+       id="clipPath61045">
+      <rect
+         style="opacity:1;fill:none;fill-opacity:1;stroke:#000000;stroke-width:3.11111;stroke-linejoin:round;stroke-dasharray:none"
+         id="rect61047"
+         width="168.72525"
+         height="287.63638"
+         x="-708.34058"
+         y="107.13162" />
+    </clipPath>
+    <clipPath
+       clipPathUnits="userSpaceOnUse"
+       id="clipPath61049">
+      <rect
+         style="opacity:1;fill:none;fill-opacity:1;stroke:#000000;stroke-width:3.11111;stroke-linejoin:round;stroke-dasharray:none"
+         id="rect61051"
+         width="168.72525"
+         height="287.63638"
+         x="-708.34058"
+         y="107.13162" />
+    </clipPath>
+    <clipPath
+       clipPathUnits="userSpaceOnUse"
+       id="clipPath61053">
+      <rect
+         style="opacity:1;fill:none;fill-opacity:1;stroke:#000000;stroke-width:3.11111;stroke-linejoin:round;stroke-dasharray:none"
+         id="rect61055"
+         width="168.72525"
+         height="287.63638"
+         x="-708.34058"
+         y="107.13162" />
+    </clipPath>
+    <clipPath
+       clipPathUnits="userSpaceOnUse"
+       id="clipPath61057">
+      <rect
+         style="opacity:1;fill:none;fill-opacity:1;stroke:#000000;stroke-width:3.11111;stroke-linejoin:round;stroke-dasharray:none"
+         id="rect61059"
+         width="168.72525"
+         height="287.63638"
+         x="-708.34058"
+         y="107.13162" />
+    </clipPath>
+    <clipPath
+       clipPathUnits="userSpaceOnUse"
+       id="clipPath61061">
+      <rect
+         style="opacity:1;fill:none;fill-opacity:1;stroke:#000000;stroke-width:3.11111;stroke-linejoin:round;stroke-dasharray:none"
+         id="rect61063"
+         width="168.72525"
+         height="287.63638"
+         x="-708.34058"
+         y="107.13162" />
+    </clipPath>
+    <clipPath
+       clipPathUnits="userSpaceOnUse"
+       id="clipPath61065">
+      <rect
+         style="opacity:1;fill:none;fill-opacity:1;stroke:#000000;stroke-width:3.11111;stroke-linejoin:round;stroke-dasharray:none"
+         id="rect61067"
+         width="168.72525"
+         height="287.63638"
+         x="-708.34058"
+         y="107.13162" />
+    </clipPath>
+    <clipPath
+       clipPathUnits="userSpaceOnUse"
+       id="clipPath61069">
+      <rect
+         style="opacity:1;fill:none;fill-opacity:1;stroke:#000000;stroke-width:3.11111;stroke-linejoin:round;stroke-dasharray:none"
+         id="rect61071"
+         width="168.72525"
+         height="287.63638"
+         x="-708.34058"
+         y="107.13162" />
+    </clipPath>
+    <clipPath
+       clipPathUnits="userSpaceOnUse"
+       id="clipPath61073">
+      <rect
+         style="opacity:1;fill:none;fill-opacity:1;stroke:#000000;stroke-width:3.11111;stroke-linejoin:round;stroke-dasharray:none"
+         id="rect61075"
+         width="168.72525"
+         height="287.63638"
+         x="-708.34058"
+         y="107.13162" />
+    </clipPath>
+    <clipPath
+       clipPathUnits="userSpaceOnUse"
+       id="clipPath61077">
+      <rect
+         style="opacity:1;fill:none;fill-opacity:1;stroke:#000000;stroke-width:3.11111;stroke-linejoin:round;stroke-dasharray:none"
+         id="rect61079"
+         width="168.72525"
+         height="287.63638"
+         x="-708.34058"
+         y="107.13162" />
+    </clipPath>
+    <clipPath
+       clipPathUnits="userSpaceOnUse"
+       id="clipPath61081">
+      <rect
+         style="opacity:1;fill:none;fill-opacity:1;stroke:#000000;stroke-width:3.11111;stroke-linejoin:round;stroke-dasharray:none"
+         id="rect61083"
+         width="168.72525"
+         height="287.63638"
+         x="-708.34058"
+         y="107.13162" />
+    </clipPath>
+    <clipPath
+       clipPathUnits="userSpaceOnUse"
+       id="clipPath61085">
+      <rect
+         style="opacity:1;fill:none;fill-opacity:1;stroke:#000000;stroke-width:3.11111;stroke-linejoin:round;stroke-dasharray:none"
+         id="rect61087"
+         width="168.72525"
+         height="287.63638"
+         x="-708.34058"
+         y="107.13162" />
+    </clipPath>
+    <clipPath
+       clipPathUnits="userSpaceOnUse"
+       id="clipPath61089">
+      <rect
+         style="opacity:1;fill:none;fill-opacity:1;stroke:#000000;stroke-width:3.11111;stroke-linejoin:round;stroke-dasharray:none"
+         id="rect61091"
+         width="168.72525"
+         height="287.63638"
+         x="-708.34058"
+         y="107.13162" />
+    </clipPath>
+    <clipPath
+       clipPathUnits="userSpaceOnUse"
+       id="clipPath61093">
+      <rect
+         style="opacity:1;fill:none;fill-opacity:1;stroke:#000000;stroke-width:3.11111;stroke-linejoin:round;stroke-dasharray:none"
+         id="rect61095"
+         width="168.72525"
+         height="287.63638"
+         x="-708.34058"
+         y="107.13162" />
+    </clipPath>
+    <clipPath
+       clipPathUnits="userSpaceOnUse"
+       id="clipPath61097">
+      <rect
+         style="opacity:1;fill:none;fill-opacity:1;stroke:#000000;stroke-width:3.11111;stroke-linejoin:round;stroke-dasharray:none"
+         id="rect61099"
+         width="168.72525"
+         height="287.63638"
+         x="-708.34058"
+         y="107.13162" />
+    </clipPath>
+    <clipPath
+       clipPathUnits="userSpaceOnUse"
+       id="clipPath61101">
+      <rect
+         style="opacity:1;fill:none;fill-opacity:1;stroke:#000000;stroke-width:3.11111;stroke-linejoin:round;stroke-dasharray:none"
+         id="rect61103"
+         width="168.72525"
+         height="287.63638"
+         x="-708.34058"
+         y="107.13162" />
+    </clipPath>
+    <clipPath
+       clipPathUnits="userSpaceOnUse"
+       id="clipPath61105">
+      <rect
+         style="opacity:1;fill:none;fill-opacity:1;stroke:#000000;stroke-width:3.11111;stroke-linejoin:round;stroke-dasharray:none"
+         id="rect61107"
+         width="168.72525"
+         height="287.63638"
+         x="-708.34058"
+         y="107.13162" />
+    </clipPath>
+    <clipPath
+       clipPathUnits="userSpaceOnUse"
+       id="clipPath61109">
+      <rect
+         style="opacity:1;fill:none;fill-opacity:1;stroke:#000000;stroke-width:3.11111;stroke-linejoin:round;stroke-dasharray:none"
+         id="rect61111"
+         width="168.72525"
+         height="287.63638"
+         x="-708.34058"
+         y="107.13162" />
+    </clipPath>
+    <clipPath
+       clipPathUnits="userSpaceOnUse"
+       id="clipPath61113">
+      <rect
+         style="opacity:1;fill:none;fill-opacity:1;stroke:#000000;stroke-width:3.11111;stroke-linejoin:round;stroke-dasharray:none"
+         id="rect61115"
+         width="168.72525"
+         height="287.63638"
+         x="-708.34058"
+         y="107.13162" />
+    </clipPath>
+    <clipPath
+       clipPathUnits="userSpaceOnUse"
+       id="clipPath61117">
+      <rect
+         style="opacity:1;fill:none;fill-opacity:1;stroke:#000000;stroke-width:3.11111;stroke-linejoin:round;stroke-dasharray:none"
+         id="rect61119"
+         width="168.72525"
+         height="287.63638"
+         x="-708.34058"
+         y="107.13162" />
+    </clipPath>
+    <clipPath
+       clipPathUnits="userSpaceOnUse"
+       id="clipPath61121">
+      <rect
+         style="opacity:1;fill:none;fill-opacity:1;stroke:#000000;stroke-width:3.11111;stroke-linejoin:round;stroke-dasharray:none"
+         id="rect61123"
+         width="168.72525"
+         height="287.63638"
+         x="-708.34058"
+         y="107.13162" />
+    </clipPath>
+    <clipPath
+       clipPathUnits="userSpaceOnUse"
+       id="clipPath61125">
+      <rect
+         style="opacity:1;fill:none;fill-opacity:1;stroke:#000000;stroke-width:3.11111;stroke-linejoin:round;stroke-dasharray:none"
+         id="rect61127"
+         width="168.72525"
+         height="287.63638"
+         x="-708.34058"
+         y="107.13162" />
+    </clipPath>
+    <clipPath
+       clipPathUnits="userSpaceOnUse"
+       id="clipPath61129">
+      <rect
+         style="opacity:1;fill:none;fill-opacity:1;stroke:#000000;stroke-width:3.11111;stroke-linejoin:round;stroke-dasharray:none"
+         id="rect61131"
+         width="168.72525"
+         height="287.63638"
+         x="-708.34058"
+         y="107.13162" />
+    </clipPath>
+    <clipPath
+       clipPathUnits="userSpaceOnUse"
+       id="clipPath61133">
+      <rect
+         style="opacity:1;fill:none;fill-opacity:1;stroke:#000000;stroke-width:3.11111;stroke-linejoin:round;stroke-dasharray:none"
+         id="rect61135"
+         width="168.72525"
+         height="287.63638"
+         x="-708.34058"
+         y="107.13162" />
+    </clipPath>
+    <clipPath
+       clipPathUnits="userSpaceOnUse"
+       id="clipPath61137">
+      <rect
+         style="opacity:1;fill:none;fill-opacity:1;stroke:#000000;stroke-width:3.11111;stroke-linejoin:round;stroke-dasharray:none"
+         id="rect61139"
+         width="168.72525"
+         height="287.63638"
+         x="-708.34058"
+         y="107.13162" />
+    </clipPath>
+    <clipPath
+       clipPathUnits="userSpaceOnUse"
+       id="clipPath61141">
+      <rect
+         style="opacity:1;fill:none;fill-opacity:1;stroke:#000000;stroke-width:3.11111;stroke-linejoin:round;stroke-dasharray:none"
+         id="rect61143"
+         width="168.72525"
+         height="287.63638"
+         x="-708.34058"
+         y="107.13162" />
+    </clipPath>
+    <clipPath
+       clipPathUnits="userSpaceOnUse"
+       id="clipPath61145">
+      <rect
+         style="opacity:1;fill:none;fill-opacity:1;stroke:#000000;stroke-width:3.11111;stroke-linejoin:round;stroke-dasharray:none"
+         id="rect61147"
+         width="168.72525"
+         height="287.63638"
+         x="-708.34058"
+         y="107.13162" />
+    </clipPath>
+    <clipPath
+       clipPathUnits="userSpaceOnUse"
+       id="clipPath61149">
+      <rect
+         style="opacity:1;fill:none;fill-opacity:1;stroke:#000000;stroke-width:3.11111;stroke-linejoin:round;stroke-dasharray:none"
+         id="rect61151"
+         width="168.72525"
+         height="287.63638"
+         x="-708.34058"
+         y="107.13162" />
+    </clipPath>
+    <clipPath
+       clipPathUnits="userSpaceOnUse"
+       id="clipPath61153">
+      <rect
+         style="opacity:1;fill:none;fill-opacity:1;stroke:#000000;stroke-width:3.11111;stroke-linejoin:round;stroke-dasharray:none"
+         id="rect61155"
+         width="168.72525"
+         height="287.63638"
+         x="-708.34058"
+         y="107.13162" />
+    </clipPath>
+    <clipPath
+       clipPathUnits="userSpaceOnUse"
+       id="clipPath61157">
+      <rect
+         style="opacity:1;fill:none;fill-opacity:1;stroke:#000000;stroke-width:3.11111;stroke-linejoin:round;stroke-dasharray:none"
+         id="rect61159"
+         width="168.72525"
+         height="287.63638"
+         x="-708.34058"
+         y="107.13162" />
+    </clipPath>
+    <clipPath
+       clipPathUnits="userSpaceOnUse"
+       id="clipPath61161">
+      <rect
+         style="opacity:1;fill:none;fill-opacity:1;stroke:#000000;stroke-width:3.11111;stroke-linejoin:round;stroke-dasharray:none"
+         id="rect61163"
+         width="168.72525"
+         height="287.63638"
+         x="-708.34058"
+         y="107.13162" />
+    </clipPath>
+    <clipPath
+       clipPathUnits="userSpaceOnUse"
+       id="clipPath61165">
+      <rect
+         style="opacity:1;fill:none;fill-opacity:1;stroke:#000000;stroke-width:3.11111;stroke-linejoin:round;stroke-dasharray:none"
+         id="rect61167"
+         width="168.72525"
+         height="287.63638"
+         x="-708.34058"
+         y="107.13162" />
+    </clipPath>
+    <clipPath
+       clipPathUnits="userSpaceOnUse"
+       id="clipPath61169">
+      <rect
+         style="opacity:1;fill:none;fill-opacity:1;stroke:#000000;stroke-width:3.11111;stroke-linejoin:round;stroke-dasharray:none"
+         id="rect61171"
+         width="168.72525"
+         height="287.63638"
+         x="-708.34058"
+         y="107.13162" />
+    </clipPath>
+    <clipPath
+       clipPathUnits="userSpaceOnUse"
+       id="clipPath61173">
+      <rect
+         style="opacity:1;fill:none;fill-opacity:1;stroke:#000000;stroke-width:3.11111;stroke-linejoin:round;stroke-dasharray:none"
+         id="rect61175"
+         width="168.72525"
+         height="287.63638"
+         x="-708.34058"
+         y="107.13162" />
+    </clipPath>
+    <clipPath
+       clipPathUnits="userSpaceOnUse"
+       id="clipPath61177">
+      <rect
+         style="opacity:1;fill:none;fill-opacity:1;stroke:#000000;stroke-width:3.11111;stroke-linejoin:round;stroke-dasharray:none"
+         id="rect61179"
+         width="168.72525"
+         height="287.63638"
+         x="-708.34058"
+         y="107.13162" />
+    </clipPath>
+    <clipPath
+       clipPathUnits="userSpaceOnUse"
+       id="clipPath61181">
+      <rect
+         style="opacity:1;fill:none;fill-opacity:1;stroke:#000000;stroke-width:3.11111;stroke-linejoin:round;stroke-dasharray:none"
+         id="rect61183"
+         width="168.72525"
+         height="287.63638"
+         x="-708.34058"
+         y="107.13162" />
+    </clipPath>
+    <clipPath
+       clipPathUnits="userSpaceOnUse"
+       id="clipPath61185">
+      <rect
+         style="opacity:1;fill:none;fill-opacity:1;stroke:#000000;stroke-width:3.11111;stroke-linejoin:round;stroke-dasharray:none"
+         id="rect61187"
+         width="168.72525"
+         height="287.63638"
+         x="-708.34058"
+         y="107.13162" />
+    </clipPath>
+    <clipPath
+       clipPathUnits="userSpaceOnUse"
+       id="clipPath61189">
+      <rect
+         style="opacity:1;fill:none;fill-opacity:1;stroke:#000000;stroke-width:3.11111;stroke-linejoin:round;stroke-dasharray:none"
+         id="rect61191"
+         width="168.72525"
+         height="287.63638"
+         x="-708.34058"
+         y="107.13162" />
+    </clipPath>
+    <clipPath
+       clipPathUnits="userSpaceOnUse"
+       id="clipPath61193">
+      <rect
+         style="opacity:1;fill:none;fill-opacity:1;stroke:#000000;stroke-width:3.11111;stroke-linejoin:round;stroke-dasharray:none"
+         id="rect61195"
+         width="168.72525"
+         height="287.63638"
+         x="-708.34058"
+         y="107.13162" />
+    </clipPath>
+    <clipPath
+       clipPathUnits="userSpaceOnUse"
+       id="clipPath61197">
+      <rect
+         style="opacity:1;fill:none;fill-opacity:1;stroke:#000000;stroke-width:3.11111;stroke-linejoin:round;stroke-dasharray:none"
+         id="rect61199"
+         width="168.72525"
+         height="287.63638"
+         x="-708.34058"
+         y="107.13162" />
+    </clipPath>
+    <clipPath
+       clipPathUnits="userSpaceOnUse"
+       id="clipPath61201">
+      <rect
+         style="opacity:1;fill:none;fill-opacity:1;stroke:#000000;stroke-width:3.11111;stroke-linejoin:round;stroke-dasharray:none"
+         id="rect61203"
+         width="168.72525"
+         height="287.63638"
+         x="-708.34058"
+         y="107.13162" />
+    </clipPath>
+    <clipPath
+       clipPathUnits="userSpaceOnUse"
+       id="clipPath61205">
+      <rect
+         style="opacity:1;fill:none;fill-opacity:1;stroke:#000000;stroke-width:3.11111;stroke-linejoin:round;stroke-dasharray:none"
+         id="rect61207"
+         width="168.72525"
+         height="287.63638"
+         x="-708.34058"
+         y="107.13162" />
+    </clipPath>
+    <clipPath
+       clipPathUnits="userSpaceOnUse"
+       id="clipPath61209">
+      <rect
+         style="opacity:1;fill:none;fill-opacity:1;stroke:#000000;stroke-width:3.11111;stroke-linejoin:round;stroke-dasharray:none"
+         id="rect61211"
+         width="168.72525"
+         height="287.63638"
+         x="-708.34058"
+         y="107.13162" />
+    </clipPath>
+    <clipPath
+       clipPathUnits="userSpaceOnUse"
+       id="clipPath61213">
+      <rect
+         style="opacity:1;fill:none;fill-opacity:1;stroke:#000000;stroke-width:3.11111;stroke-linejoin:round;stroke-dasharray:none"
+         id="rect61215"
+         width="168.72525"
+         height="287.63638"
+         x="-708.34058"
+         y="107.13162" />
+    </clipPath>
+    <clipPath
+       clipPathUnits="userSpaceOnUse"
+       id="clipPath61217">
+      <rect
+         style="opacity:1;fill:none;fill-opacity:1;stroke:#000000;stroke-width:3.11111;stroke-linejoin:round;stroke-dasharray:none"
+         id="rect61219"
+         width="168.72525"
+         height="287.63638"
+         x="-708.34058"
+         y="107.13162" />
+    </clipPath>
+    <clipPath
+       clipPathUnits="userSpaceOnUse"
+       id="clipPath61221">
+      <rect
+         style="opacity:1;fill:none;fill-opacity:1;stroke:#000000;stroke-width:3.11111;stroke-linejoin:round;stroke-dasharray:none"
+         id="rect61223"
+         width="168.72525"
+         height="287.63638"
+         x="-708.34058"
+         y="107.13162" />
+    </clipPath>
+    <clipPath
+       clipPathUnits="userSpaceOnUse"
+       id="clipPath61225">
+      <rect
+         style="opacity:1;fill:none;fill-opacity:1;stroke:#000000;stroke-width:3.11111;stroke-linejoin:round;stroke-dasharray:none"
+         id="rect61227"
+         width="168.72525"
+         height="287.63638"
+         x="-708.34058"
+         y="107.13162" />
+    </clipPath>
+    <clipPath
+       clipPathUnits="userSpaceOnUse"
+       id="clipPath61229">
+      <rect
+         style="opacity:1;fill:none;fill-opacity:1;stroke:#000000;stroke-width:3.11111;stroke-linejoin:round;stroke-dasharray:none"
+         id="rect61231"
+         width="168.72525"
+         height="287.63638"
+         x="-708.34058"
+         y="107.13162" />
+    </clipPath>
+    <clipPath
+       clipPathUnits="userSpaceOnUse"
+       id="clipPath61233">
+      <rect
+         style="opacity:1;fill:none;fill-opacity:1;stroke:#000000;stroke-width:3.11111;stroke-linejoin:round;stroke-dasharray:none"
+         id="rect61235"
+         width="168.72525"
+         height="287.63638"
+         x="-708.34058"
+         y="107.13162" />
+    </clipPath>
+    <clipPath
+       clipPathUnits="userSpaceOnUse"
+       id="clipPath61237">
+      <rect
+         style="opacity:1;fill:none;fill-opacity:1;stroke:#000000;stroke-width:3.11111;stroke-linejoin:round;stroke-dasharray:none"
+         id="rect61239"
+         width="168.72525"
+         height="287.63638"
+         x="-708.34058"
+         y="107.13162" />
+    </clipPath>
+    <clipPath
+       clipPathUnits="userSpaceOnUse"
+       id="clipPath61241">
+      <rect
+         style="opacity:1;fill:none;fill-opacity:1;stroke:#000000;stroke-width:3.11111;stroke-linejoin:round;stroke-dasharray:none"
+         id="rect61243"
+         width="168.72525"
+         height="287.63638"
+         x="-708.34058"
+         y="107.13162" />
+    </clipPath>
+    <clipPath
+       clipPathUnits="userSpaceOnUse"
+       id="clipPath61245">
+      <rect
+         style="opacity:1;fill:none;fill-opacity:1;stroke:#000000;stroke-width:3.11111;stroke-linejoin:round;stroke-dasharray:none"
+         id="rect61247"
+         width="168.72525"
+         height="287.63638"
+         x="-708.34058"
+         y="107.13162" />
+    </clipPath>
+    <clipPath
+       clipPathUnits="userSpaceOnUse"
+       id="clipPath61249">
+      <rect
+         style="opacity:1;fill:none;fill-opacity:1;stroke:#000000;stroke-width:3.11111;stroke-linejoin:round;stroke-dasharray:none"
+         id="rect61251"
+         width="168.72525"
+         height="287.63638"
+         x="-708.34058"
+         y="107.13162" />
+    </clipPath>
+    <clipPath
+       clipPathUnits="userSpaceOnUse"
+       id="clipPath61253">
+      <rect
+         style="opacity:1;fill:none;fill-opacity:1;stroke:#000000;stroke-width:3.11111;stroke-linejoin:round;stroke-dasharray:none"
+         id="rect61255"
+         width="168.72525"
+         height="287.63638"
+         x="-708.34058"
+         y="107.13162" />
+    </clipPath>
+    <clipPath
+       clipPathUnits="userSpaceOnUse"
+       id="clipPath61257">
+      <rect
+         style="opacity:1;fill:none;fill-opacity:1;stroke:#000000;stroke-width:3.11111;stroke-linejoin:round;stroke-dasharray:none"
+         id="rect61259"
+         width="168.72525"
+         height="287.63638"
+         x="-708.34058"
+         y="107.13162" />
+    </clipPath>
+    <clipPath
+       clipPathUnits="userSpaceOnUse"
+       id="clipPath61261">
+      <rect
+         style="opacity:1;fill:none;fill-opacity:1;stroke:#000000;stroke-width:3.11111;stroke-linejoin:round;stroke-dasharray:none"
+         id="rect61263"
+         width="168.72525"
+         height="287.63638"
+         x="-708.34058"
+         y="107.13162" />
+    </clipPath>
+    <clipPath
+       clipPathUnits="userSpaceOnUse"
+       id="clipPath61265">
+      <rect
+         style="opacity:1;fill:none;fill-opacity:1;stroke:#000000;stroke-width:3.11111;stroke-linejoin:round;stroke-dasharray:none"
+         id="rect61267"
+         width="168.72525"
+         height="287.63638"
+         x="-708.34058"
+         y="107.13162" />
+    </clipPath>
+    <clipPath
+       clipPathUnits="userSpaceOnUse"
+       id="clipPath61269">
+      <rect
+         style="opacity:1;fill:none;fill-opacity:1;stroke:#000000;stroke-width:3.11111;stroke-linejoin:round;stroke-dasharray:none"
+         id="rect61271"
+         width="168.72525"
+         height="287.63638"
+         x="-708.34058"
+         y="107.13162" />
+    </clipPath>
+    <clipPath
+       clipPathUnits="userSpaceOnUse"
+       id="clipPath61273">
+      <rect
+         style="opacity:1;fill:none;fill-opacity:1;stroke:#000000;stroke-width:3.11111;stroke-linejoin:round;stroke-dasharray:none"
+         id="rect61275"
+         width="168.72525"
+         height="287.63638"
+         x="-708.34058"
+         y="107.13162" />
+    </clipPath>
+    <clipPath
+       clipPathUnits="userSpaceOnUse"
+       id="clipPath61277">
+      <rect
+         style="opacity:1;fill:none;fill-opacity:1;stroke:#000000;stroke-width:3.11111;stroke-linejoin:round;stroke-dasharray:none"
+         id="rect61279"
+         width="168.72525"
+         height="287.63638"
+         x="-708.34058"
+         y="107.13162" />
+    </clipPath>
+    <clipPath
+       clipPathUnits="userSpaceOnUse"
+       id="clipPath61281">
+      <rect
+         style="opacity:1;fill:none;fill-opacity:1;stroke:#000000;stroke-width:3.11111;stroke-linejoin:round;stroke-dasharray:none"
+         id="rect61283"
+         width="168.72525"
+         height="287.63638"
+         x="-708.34058"
+         y="107.13162" />
+    </clipPath>
+    <clipPath
+       clipPathUnits="userSpaceOnUse"
+       id="clipPath61285">
+      <rect
+         style="opacity:1;fill:none;fill-opacity:1;stroke:#000000;stroke-width:3.11111;stroke-linejoin:round;stroke-dasharray:none"
+         id="rect61287"
+         width="168.72525"
+         height="287.63638"
+         x="-708.34058"
+         y="107.13162" />
+    </clipPath>
+    <clipPath
+       clipPathUnits="userSpaceOnUse"
+       id="clipPath61289">
+      <rect
+         style="opacity:1;fill:none;fill-opacity:1;stroke:#000000;stroke-width:3.11111;stroke-linejoin:round;stroke-dasharray:none"
+         id="rect61291"
+         width="168.72525"
+         height="287.63638"
+         x="-708.34058"
+         y="107.13162" />
+    </clipPath>
+    <clipPath
+       clipPathUnits="userSpaceOnUse"
+       id="clipPath61293">
+      <rect
+         style="opacity:1;fill:none;fill-opacity:1;stroke:#000000;stroke-width:3.11111;stroke-linejoin:round;stroke-dasharray:none"
+         id="rect61295"
+         width="168.72525"
+         height="287.63638"
+         x="-708.34058"
+         y="107.13162" />
+    </clipPath>
+    <clipPath
+       clipPathUnits="userSpaceOnUse"
+       id="clipPath61297">
+      <rect
+         style="opacity:1;fill:none;fill-opacity:1;stroke:#000000;stroke-width:3.11111;stroke-linejoin:round;stroke-dasharray:none"
+         id="rect61299"
+         width="168.72525"
+         height="287.63638"
+         x="-708.34058"
+         y="107.13162" />
+    </clipPath>
+    <clipPath
+       clipPathUnits="userSpaceOnUse"
+       id="clipPath61301">
+      <rect
+         style="opacity:1;fill:none;fill-opacity:1;stroke:#000000;stroke-width:3.11111;stroke-linejoin:round;stroke-dasharray:none"
+         id="rect61303"
+         width="168.72525"
+         height="287.63638"
+         x="-708.34058"
+         y="107.13162" />
+    </clipPath>
+    <clipPath
+       clipPathUnits="userSpaceOnUse"
+       id="clipPath61305">
+      <rect
+         style="opacity:1;fill:none;fill-opacity:1;stroke:#000000;stroke-width:3.11111;stroke-linejoin:round;stroke-dasharray:none"
+         id="rect61307"
+         width="168.72525"
+         height="287.63638"
+         x="-708.34058"
+         y="107.13162" />
+    </clipPath>
+    <clipPath
+       clipPathUnits="userSpaceOnUse"
+       id="clipPath61309">
+      <rect
+         style="opacity:1;fill:none;fill-opacity:1;stroke:#000000;stroke-width:3.11111;stroke-linejoin:round;stroke-dasharray:none"
+         id="rect61311"
+         width="168.72525"
+         height="287.63638"
+         x="-708.34058"
+         y="107.13162" />
+    </clipPath>
+    <clipPath
+       clipPathUnits="userSpaceOnUse"
+       id="clipPath61313">
+      <rect
+         style="opacity:1;fill:none;fill-opacity:1;stroke:#000000;stroke-width:3.11111;stroke-linejoin:round;stroke-dasharray:none"
+         id="rect61315"
+         width="168.72525"
+         height="287.63638"
+         x="-708.34058"
+         y="107.13162" />
+    </clipPath>
+    <clipPath
+       clipPathUnits="userSpaceOnUse"
+       id="clipPath61317">
+      <rect
+         style="opacity:1;fill:none;fill-opacity:1;stroke:#000000;stroke-width:3.11111;stroke-linejoin:round;stroke-dasharray:none"
+         id="rect61319"
+         width="168.72525"
+         height="287.63638"
+         x="-708.34058"
+         y="107.13162" />
+    </clipPath>
+    <clipPath
+       clipPathUnits="userSpaceOnUse"
+       id="clipPath61321">
+      <rect
+         style="opacity:1;fill:none;fill-opacity:1;stroke:#000000;stroke-width:3.11111;stroke-linejoin:round;stroke-dasharray:none"
+         id="rect61323"
+         width="168.72525"
+         height="287.63638"
+         x="-708.34058"
+         y="107.13162" />
+    </clipPath>
+    <clipPath
+       clipPathUnits="userSpaceOnUse"
+       id="clipPath61325">
+      <rect
+         style="opacity:1;fill:none;fill-opacity:1;stroke:#000000;stroke-width:3.11111;stroke-linejoin:round;stroke-dasharray:none"
+         id="rect61327"
+         width="168.72525"
+         height="287.63638"
+         x="-708.34058"
+         y="107.13162" />
+    </clipPath>
+    <clipPath
+       clipPathUnits="userSpaceOnUse"
+       id="clipPath61329">
+      <rect
+         style="opacity:1;fill:none;fill-opacity:1;stroke:#000000;stroke-width:3.11111;stroke-linejoin:round;stroke-dasharray:none"
+         id="rect61331"
+         width="168.72525"
+         height="287.63638"
+         x="-708.34058"
+         y="107.13162" />
+    </clipPath>
+    <clipPath
+       clipPathUnits="userSpaceOnUse"
+       id="clipPath61333">
+      <rect
+         style="opacity:1;fill:none;fill-opacity:1;stroke:#000000;stroke-width:3.11111;stroke-linejoin:round;stroke-dasharray:none"
+         id="rect61335"
+         width="168.72525"
+         height="287.63638"
+         x="-708.34058"
+         y="107.13162" />
+    </clipPath>
+    <clipPath
+       clipPathUnits="userSpaceOnUse"
+       id="clipPath61337">
+      <rect
+         style="opacity:1;fill:none;fill-opacity:1;stroke:#000000;stroke-width:3.11111;stroke-linejoin:round;stroke-dasharray:none"
+         id="rect61339"
+         width="168.72525"
+         height="287.63638"
+         x="-708.34058"
+         y="107.13162" />
+    </clipPath>
+    <clipPath
+       clipPathUnits="userSpaceOnUse"
+       id="clipPath61341">
+      <rect
+         style="opacity:1;fill:none;fill-opacity:1;stroke:#000000;stroke-width:3.11111;stroke-linejoin:round;stroke-dasharray:none"
+         id="rect61343"
+         width="168.72525"
+         height="287.63638"
+         x="-708.34058"
+         y="107.13162" />
+    </clipPath>
+    <clipPath
+       clipPathUnits="userSpaceOnUse"
+       id="clipPath61345">
+      <rect
+         style="opacity:1;fill:none;fill-opacity:1;stroke:#000000;stroke-width:3.11111;stroke-linejoin:round;stroke-dasharray:none"
+         id="rect61347"
+         width="168.72525"
+         height="287.63638"
+         x="-708.34058"
+         y="107.13162" />
+    </clipPath>
+    <clipPath
+       clipPathUnits="userSpaceOnUse"
+       id="clipPath61349">
+      <rect
+         style="opacity:1;fill:none;fill-opacity:1;stroke:#000000;stroke-width:3.11111;stroke-linejoin:round;stroke-dasharray:none"
+         id="rect61351"
+         width="168.72525"
+         height="287.63638"
+         x="-708.34058"
+         y="107.13162" />
+    </clipPath>
+    <clipPath
+       clipPathUnits="userSpaceOnUse"
+       id="clipPath61353">
+      <rect
+         style="opacity:1;fill:none;fill-opacity:1;stroke:#000000;stroke-width:3.11111;stroke-linejoin:round;stroke-dasharray:none"
+         id="rect61355"
+         width="168.72525"
+         height="287.63638"
+         x="-708.34058"
+         y="107.13162" />
+    </clipPath>
+    <clipPath
+       clipPathUnits="userSpaceOnUse"
+       id="clipPath61357">
+      <rect
+         style="opacity:1;fill:none;fill-opacity:1;stroke:#000000;stroke-width:3.11111;stroke-linejoin:round;stroke-dasharray:none"
+         id="rect61359"
+         width="168.72525"
+         height="287.63638"
+         x="-708.34058"
+         y="107.13162" />
+    </clipPath>
+    <clipPath
+       clipPathUnits="userSpaceOnUse"
+       id="clipPath61361">
+      <rect
+         style="opacity:1;fill:none;fill-opacity:1;stroke:#000000;stroke-width:3.11111;stroke-linejoin:round;stroke-dasharray:none"
+         id="rect61363"
+         width="168.72525"
+         height="287.63638"
+         x="-708.34058"
+         y="107.13162" />
+    </clipPath>
+    <clipPath
+       clipPathUnits="userSpaceOnUse"
+       id="clipPath61365">
+      <rect
+         style="opacity:1;fill:none;fill-opacity:1;stroke:#000000;stroke-width:3.11111;stroke-linejoin:round;stroke-dasharray:none"
+         id="rect61367"
+         width="168.72525"
+         height="287.63638"
+         x="-708.34058"
+         y="107.13162" />
+    </clipPath>
+    <clipPath
+       clipPathUnits="userSpaceOnUse"
+       id="clipPath61369">
+      <rect
+         style="opacity:1;fill:none;fill-opacity:1;stroke:#000000;stroke-width:3.11111;stroke-linejoin:round;stroke-dasharray:none"
+         id="rect61371"
+         width="168.72525"
+         height="287.63638"
+         x="-708.34058"
+         y="107.13162" />
+    </clipPath>
+    <clipPath
+       clipPathUnits="userSpaceOnUse"
+       id="clipPath61373">
+      <rect
+         style="opacity:1;fill:none;fill-opacity:1;stroke:#000000;stroke-width:3.11111;stroke-linejoin:round;stroke-dasharray:none"
+         id="rect61375"
+         width="168.72525"
+         height="287.63638"
+         x="-708.34058"
+         y="107.13162" />
+    </clipPath>
+    <clipPath
+       clipPathUnits="userSpaceOnUse"
+       id="clipPath61377">
+      <rect
+         style="opacity:1;fill:none;fill-opacity:1;stroke:#000000;stroke-width:3.11111;stroke-linejoin:round;stroke-dasharray:none"
+         id="rect61379"
+         width="168.72525"
+         height="287.63638"
+         x="-708.34058"
+         y="107.13162" />
+    </clipPath>
+    <clipPath
+       clipPathUnits="userSpaceOnUse"
+       id="clipPath61381">
+      <rect
+         style="opacity:1;fill:none;fill-opacity:1;stroke:#000000;stroke-width:3.11111;stroke-linejoin:round;stroke-dasharray:none"
+         id="rect61383"
+         width="168.72525"
+         height="287.63638"
+         x="-708.34058"
+         y="107.13162" />
+    </clipPath>
+    <clipPath
+       clipPathUnits="userSpaceOnUse"
+       id="clipPath61385">
+      <rect
+         style="opacity:1;fill:none;fill-opacity:1;stroke:#000000;stroke-width:3.11111;stroke-linejoin:round;stroke-dasharray:none"
+         id="rect61387"
+         width="168.72525"
+         height="287.63638"
+         x="-708.34058"
+         y="107.13162" />
+    </clipPath>
+    <clipPath
+       clipPathUnits="userSpaceOnUse"
+       id="clipPath61389">
+      <rect
+         style="opacity:1;fill:none;fill-opacity:1;stroke:#000000;stroke-width:3.11111;stroke-linejoin:round;stroke-dasharray:none"
+         id="rect61391"
+         width="168.72525"
+         height="287.63638"
+         x="-708.34058"
+         y="107.13162" />
+    </clipPath>
+    <clipPath
+       clipPathUnits="userSpaceOnUse"
+       id="clipPath61393">
+      <rect
+         style="opacity:1;fill:none;fill-opacity:1;stroke:#000000;stroke-width:3.11111;stroke-linejoin:round;stroke-dasharray:none"
+         id="rect61395"
+         width="168.72525"
+         height="287.63638"
+         x="-708.34058"
+         y="107.13162" />
+    </clipPath>
+    <clipPath
+       clipPathUnits="userSpaceOnUse"
+       id="clipPath61397">
+      <rect
+         style="opacity:1;fill:none;fill-opacity:1;stroke:#000000;stroke-width:3.11111;stroke-linejoin:round;stroke-dasharray:none"
+         id="rect61399"
+         width="168.72525"
+         height="287.63638"
+         x="-708.34058"
+         y="107.13162" />
+    </clipPath>
+    <clipPath
+       clipPathUnits="userSpaceOnUse"
+       id="clipPath61401">
+      <rect
+         style="opacity:1;fill:none;fill-opacity:1;stroke:#000000;stroke-width:3.11111;stroke-linejoin:round;stroke-dasharray:none"
+         id="rect61403"
+         width="168.72525"
+         height="287.63638"
+         x="-708.34058"
+         y="107.13162" />
+    </clipPath>
+    <clipPath
+       clipPathUnits="userSpaceOnUse"
+       id="clipPath61405">
+      <rect
+         style="opacity:1;fill:none;fill-opacity:1;stroke:#000000;stroke-width:3.11111;stroke-linejoin:round;stroke-dasharray:none"
+         id="rect61407"
+         width="168.72525"
+         height="287.63638"
+         x="-708.34058"
+         y="107.13162" />
+    </clipPath>
+    <clipPath
+       clipPathUnits="userSpaceOnUse"
+       id="clipPath61409">
+      <rect
+         style="opacity:1;fill:none;fill-opacity:1;stroke:#000000;stroke-width:3.11111;stroke-linejoin:round;stroke-dasharray:none"
+         id="rect61411"
+         width="168.72525"
+         height="287.63638"
+         x="-708.34058"
+         y="107.13162" />
+    </clipPath>
+    <clipPath
+       clipPathUnits="userSpaceOnUse"
+       id="clipPath61413">
+      <rect
+         style="opacity:1;fill:none;fill-opacity:1;stroke:#000000;stroke-width:3.11111;stroke-linejoin:round;stroke-dasharray:none"
+         id="rect61415"
+         width="168.72525"
+         height="287.63638"
+         x="-708.34058"
+         y="107.13162" />
+    </clipPath>
+    <clipPath
+       clipPathUnits="userSpaceOnUse"
+       id="clipPath61417">
+      <rect
+         style="opacity:1;fill:none;fill-opacity:1;stroke:#000000;stroke-width:3.11111;stroke-linejoin:round;stroke-dasharray:none"
+         id="rect61419"
+         width="168.72525"
+         height="287.63638"
+         x="-708.34058"
+         y="107.13162" />
+    </clipPath>
+    <clipPath
+       clipPathUnits="userSpaceOnUse"
+       id="clipPath61421">
+      <rect
+         style="opacity:1;fill:none;fill-opacity:1;stroke:#000000;stroke-width:3.11111;stroke-linejoin:round;stroke-dasharray:none"
+         id="rect61423"
+         width="168.72525"
+         height="287.63638"
+         x="-708.34058"
+         y="107.13162" />
+    </clipPath>
+    <clipPath
+       clipPathUnits="userSpaceOnUse"
+       id="clipPath61425">
+      <rect
+         style="opacity:1;fill:none;fill-opacity:1;stroke:#000000;stroke-width:3.11111;stroke-linejoin:round;stroke-dasharray:none"
+         id="rect61427"
+         width="168.72525"
+         height="287.63638"
+         x="-708.34058"
+         y="107.13162" />
+    </clipPath>
+    <clipPath
+       clipPathUnits="userSpaceOnUse"
+       id="clipPath61429">
+      <rect
+         style="opacity:1;fill:none;fill-opacity:1;stroke:#000000;stroke-width:3.11111;stroke-linejoin:round;stroke-dasharray:none"
+         id="rect61431"
+         width="168.72525"
+         height="287.63638"
+         x="-708.34058"
+         y="107.13162" />
+    </clipPath>
+    <clipPath
+       clipPathUnits="userSpaceOnUse"
+       id="clipPath61433">
+      <rect
+         style="opacity:1;fill:none;fill-opacity:1;stroke:#000000;stroke-width:3.11111;stroke-linejoin:round;stroke-dasharray:none"
+         id="rect61435"
+         width="168.72525"
+         height="287.63638"
+         x="-708.34058"
+         y="107.13162" />
+    </clipPath>
+    <clipPath
+       clipPathUnits="userSpaceOnUse"
+       id="clipPath61437">
+      <rect
+         style="opacity:1;fill:none;fill-opacity:1;stroke:#000000;stroke-width:3.11111;stroke-linejoin:round;stroke-dasharray:none"
+         id="rect61439"
+         width="168.72525"
+         height="287.63638"
+         x="-708.34058"
+         y="107.13162" />
+    </clipPath>
+    <clipPath
+       clipPathUnits="userSpaceOnUse"
+       id="clipPath61441">
+      <rect
+         style="opacity:1;fill:none;fill-opacity:1;stroke:#000000;stroke-width:3.11111;stroke-linejoin:round;stroke-dasharray:none"
+         id="rect61443"
+         width="168.72525"
+         height="287.63638"
+         x="-708.34058"
+         y="107.13162" />
+    </clipPath>
+    <clipPath
+       clipPathUnits="userSpaceOnUse"
+       id="clipPath61445">
+      <rect
+         style="opacity:1;fill:none;fill-opacity:1;stroke:#000000;stroke-width:3.11111;stroke-linejoin:round;stroke-dasharray:none"
+         id="rect61447"
+         width="168.72525"
+         height="287.63638"
+         x="-708.34058"
+         y="107.13162" />
+    </clipPath>
+    <clipPath
+       clipPathUnits="userSpaceOnUse"
+       id="clipPath61449">
+      <rect
+         style="opacity:1;fill:none;fill-opacity:1;stroke:#000000;stroke-width:3.11111;stroke-linejoin:round;stroke-dasharray:none"
+         id="rect61451"
+         width="168.72525"
+         height="287.63638"
+         x="-708.34058"
+         y="107.13162" />
+    </clipPath>
+    <clipPath
+       clipPathUnits="userSpaceOnUse"
+       id="clipPath61453">
+      <rect
+         style="opacity:1;fill:none;fill-opacity:1;stroke:#000000;stroke-width:3.11111;stroke-linejoin:round;stroke-dasharray:none"
+         id="rect61455"
+         width="168.72525"
+         height="287.63638"
+         x="-708.34058"
+         y="107.13162" />
+    </clipPath>
+    <clipPath
+       clipPathUnits="userSpaceOnUse"
+       id="clipPath61457">
+      <rect
+         style="opacity:1;fill:none;fill-opacity:1;stroke:#000000;stroke-width:3.11111;stroke-linejoin:round;stroke-dasharray:none"
+         id="rect61459"
+         width="168.72525"
+         height="287.63638"
+         x="-708.34058"
+         y="107.13162" />
+    </clipPath>
+    <clipPath
+       clipPathUnits="userSpaceOnUse"
+       id="clipPath61461">
+      <rect
+         style="opacity:1;fill:none;fill-opacity:1;stroke:#000000;stroke-width:3.11111;stroke-linejoin:round;stroke-dasharray:none"
+         id="rect61463"
+         width="168.72525"
+         height="287.63638"
+         x="-708.34058"
+         y="107.13162" />
+    </clipPath>
+    <clipPath
+       clipPathUnits="userSpaceOnUse"
+       id="clipPath61465">
+      <rect
+         style="opacity:1;fill:none;fill-opacity:1;stroke:#000000;stroke-width:3.11111;stroke-linejoin:round;stroke-dasharray:none"
+         id="rect61467"
+         width="168.72525"
+         height="287.63638"
+         x="-708.34058"
+         y="107.13162" />
+    </clipPath>
+    <clipPath
+       clipPathUnits="userSpaceOnUse"
+       id="clipPath61469">
+      <rect
+         style="opacity:1;fill:none;fill-opacity:1;stroke:#000000;stroke-width:3.11111;stroke-linejoin:round;stroke-dasharray:none"
+         id="rect61471"
+         width="168.72525"
+         height="287.63638"
+         x="-708.34058"
+         y="107.13162" />
+    </clipPath>
+    <clipPath
+       clipPathUnits="userSpaceOnUse"
+       id="clipPath61473">
+      <rect
+         style="opacity:1;fill:none;fill-opacity:1;stroke:#000000;stroke-width:3.11111;stroke-linejoin:round;stroke-dasharray:none"
+         id="rect61475"
+         width="168.72525"
+         height="287.63638"
+         x="-708.34058"
+         y="107.13162" />
+    </clipPath>
+    <clipPath
+       clipPathUnits="userSpaceOnUse"
+       id="clipPath61477">
+      <rect
+         style="opacity:1;fill:none;fill-opacity:1;stroke:#000000;stroke-width:3.11111;stroke-linejoin:round;stroke-dasharray:none"
+         id="rect61479"
+         width="168.72525"
+         height="287.63638"
+         x="-708.34058"
+         y="107.13162" />
+    </clipPath>
+    <clipPath
+       clipPathUnits="userSpaceOnUse"
+       id="clipPath61481">
+      <rect
+         style="opacity:1;fill:none;fill-opacity:1;stroke:#000000;stroke-width:3.11111;stroke-linejoin:round;stroke-dasharray:none"
+         id="rect61483"
+         width="168.72525"
+         height="287.63638"
+         x="-708.34058"
+         y="107.13162" />
+    </clipPath>
+    <clipPath
+       clipPathUnits="userSpaceOnUse"
+       id="clipPath61485">
+      <rect
+         style="opacity:1;fill:none;fill-opacity:1;stroke:#000000;stroke-width:3.11111;stroke-linejoin:round;stroke-dasharray:none"
+         id="rect61487"
+         width="168.72525"
+         height="287.63638"
+         x="-708.34058"
+         y="107.13162" />
+    </clipPath>
+    <clipPath
+       clipPathUnits="userSpaceOnUse"
+       id="clipPath61489">
+      <rect
+         style="opacity:1;fill:none;fill-opacity:1;stroke:#000000;stroke-width:3.11111;stroke-linejoin:round;stroke-dasharray:none"
+         id="rect61491"
+         width="168.72525"
+         height="287.63638"
+         x="-708.34058"
+         y="107.13162" />
+    </clipPath>
+    <clipPath
+       clipPathUnits="userSpaceOnUse"
+       id="clipPath61493">
+      <rect
+         style="opacity:1;fill:none;fill-opacity:1;stroke:#000000;stroke-width:3.11111;stroke-linejoin:round;stroke-dasharray:none"
+         id="rect61495"
+         width="168.72525"
+         height="287.63638"
+         x="-708.34058"
+         y="107.13162" />
+    </clipPath>
+    <clipPath
+       clipPathUnits="userSpaceOnUse"
+       id="clipPath61497">
+      <rect
+         style="opacity:1;fill:none;fill-opacity:1;stroke:#000000;stroke-width:3.11111;stroke-linejoin:round;stroke-dasharray:none"
+         id="rect61499"
+         width="168.72525"
+         height="287.63638"
+         x="-708.34058"
+         y="107.13162" />
+    </clipPath>
+    <clipPath
+       clipPathUnits="userSpaceOnUse"
+       id="clipPath61501">
+      <rect
+         style="opacity:1;fill:none;fill-opacity:1;stroke:#000000;stroke-width:3.11111;stroke-linejoin:round;stroke-dasharray:none"
+         id="rect61503"
+         width="168.72525"
+         height="287.63638"
+         x="-708.34058"
+         y="107.13162" />
+    </clipPath>
+    <clipPath
+       clipPathUnits="userSpaceOnUse"
+       id="clipPath61505">
+      <rect
+         style="opacity:1;fill:none;fill-opacity:1;stroke:#000000;stroke-width:3.11111;stroke-linejoin:round;stroke-dasharray:none"
+         id="rect61507"
+         width="168.72525"
+         height="287.63638"
+         x="-708.34058"
+         y="107.13162" />
+    </clipPath>
+    <clipPath
+       clipPathUnits="userSpaceOnUse"
+       id="clipPath61509">
+      <rect
+         style="opacity:1;fill:none;fill-opacity:1;stroke:#000000;stroke-width:3.11111;stroke-linejoin:round;stroke-dasharray:none"
+         id="rect61511"
+         width="168.72525"
+         height="287.63638"
+         x="-708.34058"
+         y="107.13162" />
+    </clipPath>
+    <clipPath
+       clipPathUnits="userSpaceOnUse"
+       id="clipPath61513">
+      <rect
+         style="opacity:1;fill:none;fill-opacity:1;stroke:#000000;stroke-width:3.11111;stroke-linejoin:round;stroke-dasharray:none"
+         id="rect61515"
+         width="168.72525"
+         height="287.63638"
+         x="-708.34058"
+         y="107.13162" />
+    </clipPath>
+    <clipPath
+       clipPathUnits="userSpaceOnUse"
+       id="clipPath61517">
+      <rect
+         style="opacity:1;fill:none;fill-opacity:1;stroke:#000000;stroke-width:3.11111;stroke-linejoin:round;stroke-dasharray:none"
+         id="rect61519"
+         width="168.72525"
+         height="287.63638"
+         x="-708.34058"
+         y="107.13162" />
+    </clipPath>
+    <clipPath
+       clipPathUnits="userSpaceOnUse"
+       id="clipPath61521">
+      <rect
+         style="opacity:1;fill:none;fill-opacity:1;stroke:#000000;stroke-width:3.11111;stroke-linejoin:round;stroke-dasharray:none"
+         id="rect61523"
+         width="168.72525"
+         height="287.63638"
+         x="-708.34058"
+         y="107.13162" />
+    </clipPath>
+    <clipPath
+       clipPathUnits="userSpaceOnUse"
+       id="clipPath61525">
+      <rect
+         style="opacity:1;fill:none;fill-opacity:1;stroke:#000000;stroke-width:3.11111;stroke-linejoin:round;stroke-dasharray:none"
+         id="rect61527"
+         width="168.72525"
+         height="287.63638"
+         x="-708.34058"
+         y="107.13162" />
+    </clipPath>
+    <clipPath
+       clipPathUnits="userSpaceOnUse"
+       id="clipPath61529">
+      <rect
+         style="opacity:1;fill:none;fill-opacity:1;stroke:#000000;stroke-width:3.11111;stroke-linejoin:round;stroke-dasharray:none"
+         id="rect61531"
+         width="168.72525"
+         height="287.63638"
+         x="-708.34058"
+         y="107.13162" />
+    </clipPath>
+    <clipPath
+       clipPathUnits="userSpaceOnUse"
+       id="clipPath61533">
+      <rect
+         style="opacity:1;fill:none;fill-opacity:1;stroke:#000000;stroke-width:3.11111;stroke-linejoin:round;stroke-dasharray:none"
+         id="rect61535"
+         width="168.72525"
+         height="287.63638"
+         x="-708.34058"
+         y="107.13162" />
+    </clipPath>
+    <clipPath
+       clipPathUnits="userSpaceOnUse"
+       id="clipPath61537">
+      <rect
+         style="opacity:1;fill:none;fill-opacity:1;stroke:#000000;stroke-width:3.11111;stroke-linejoin:round;stroke-dasharray:none"
+         id="rect61539"
+         width="168.72525"
+         height="287.63638"
+         x="-708.34058"
+         y="107.13162" />
+    </clipPath>
+    <clipPath
+       clipPathUnits="userSpaceOnUse"
+       id="clipPath61541">
+      <rect
+         style="opacity:1;fill:none;fill-opacity:1;stroke:#000000;stroke-width:3.11111;stroke-linejoin:round;stroke-dasharray:none"
+         id="rect61543"
+         width="168.72525"
+         height="287.63638"
+         x="-708.34058"
+         y="107.13162" />
+    </clipPath>
+    <clipPath
+       clipPathUnits="userSpaceOnUse"
+       id="clipPath61545">
+      <rect
+         style="opacity:1;fill:none;fill-opacity:1;stroke:#000000;stroke-width:3.11111;stroke-linejoin:round;stroke-dasharray:none"
+         id="rect61547"
+         width="168.72525"
+         height="287.63638"
+         x="-708.34058"
+         y="107.13162" />
+    </clipPath>
+    <clipPath
+       clipPathUnits="userSpaceOnUse"
+       id="clipPath61549">
+      <rect
+         style="opacity:1;fill:none;fill-opacity:1;stroke:#000000;stroke-width:3.11111;stroke-linejoin:round;stroke-dasharray:none"
+         id="rect61551"
+         width="168.72525"
+         height="287.63638"
+         x="-708.34058"
+         y="107.13162" />
+    </clipPath>
+    <clipPath
+       clipPathUnits="userSpaceOnUse"
+       id="clipPath61553">
+      <rect
+         style="opacity:1;fill:none;fill-opacity:1;stroke:#000000;stroke-width:3.11111;stroke-linejoin:round;stroke-dasharray:none"
+         id="rect61555"
+         width="168.72525"
+         height="287.63638"
+         x="-708.34058"
+         y="107.13162" />
+    </clipPath>
+    <clipPath
+       clipPathUnits="userSpaceOnUse"
+       id="clipPath61557">
+      <rect
+         style="opacity:1;fill:none;fill-opacity:1;stroke:#000000;stroke-width:3.11111;stroke-linejoin:round;stroke-dasharray:none"
+         id="rect61559"
+         width="168.72525"
+         height="287.63638"
+         x="-708.34058"
+         y="107.13162" />
+    </clipPath>
+    <clipPath
+       clipPathUnits="userSpaceOnUse"
+       id="clipPath61561">
+      <rect
+         style="opacity:1;fill:none;fill-opacity:1;stroke:#000000;stroke-width:3.11111;stroke-linejoin:round;stroke-dasharray:none"
+         id="rect61563"
+         width="168.72525"
+         height="287.63638"
+         x="-708.34058"
+         y="107.13162" />
+    </clipPath>
+    <clipPath
+       clipPathUnits="userSpaceOnUse"
+       id="clipPath61565">
+      <rect
+         style="opacity:1;fill:none;fill-opacity:1;stroke:#000000;stroke-width:3.11111;stroke-linejoin:round;stroke-dasharray:none"
+         id="rect61567"
+         width="168.72525"
+         height="287.63638"
+         x="-708.34058"
+         y="107.13162" />
+    </clipPath>
+    <clipPath
+       clipPathUnits="userSpaceOnUse"
+       id="clipPath61569">
+      <rect
+         style="opacity:1;fill:none;fill-opacity:1;stroke:#000000;stroke-width:3.11111;stroke-linejoin:round;stroke-dasharray:none"
+         id="rect61571"
+         width="168.72525"
+         height="287.63638"
+         x="-708.34058"
+         y="107.13162" />
+    </clipPath>
+    <clipPath
+       clipPathUnits="userSpaceOnUse"
+       id="clipPath61573">
+      <rect
+         style="opacity:1;fill:none;fill-opacity:1;stroke:#000000;stroke-width:3.11111;stroke-linejoin:round;stroke-dasharray:none"
+         id="rect61575"
+         width="168.72525"
+         height="287.63638"
+         x="-708.34058"
+         y="107.13162" />
+    </clipPath>
+    <clipPath
+       clipPathUnits="userSpaceOnUse"
+       id="clipPath61577">
+      <rect
+         style="opacity:1;fill:none;fill-opacity:1;stroke:#000000;stroke-width:3.11111;stroke-linejoin:round;stroke-dasharray:none"
+         id="rect61579"
+         width="168.72525"
+         height="287.63638"
+         x="-708.34058"
+         y="107.13162" />
+    </clipPath>
+    <clipPath
+       clipPathUnits="userSpaceOnUse"
+       id="clipPath61581">
+      <rect
+         style="opacity:1;fill:none;fill-opacity:1;stroke:#000000;stroke-width:3.11111;stroke-linejoin:round;stroke-dasharray:none"
+         id="rect61583"
+         width="168.72525"
+         height="287.63638"
+         x="-708.34058"
+         y="107.13162" />
+    </clipPath>
+    <clipPath
+       clipPathUnits="userSpaceOnUse"
+       id="clipPath61585">
+      <rect
+         style="opacity:1;fill:none;fill-opacity:1;stroke:#000000;stroke-width:7;stroke-linejoin:round;stroke-dasharray:none"
+         id="rect61587"
+         width="379.63181"
+         height="647.18188"
+         x="147.96869"
+         y="178.99452" />
+    </clipPath>
+    <clipPath
+       clipPathUnits="userSpaceOnUse"
+       id="clipPath61589">
+      <rect
+         style="opacity:1;fill:none;fill-opacity:1;stroke:#000000;stroke-width:7;stroke-linejoin:round;stroke-dasharray:none"
+         id="rect61591"
+         width="379.63181"
+         height="647.18188"
+         x="147.96869"
+         y="178.99452" />
+    </clipPath>
+    <clipPath
+       clipPathUnits="userSpaceOnUse"
+       id="clipPath61593">
+      <rect
+         style="opacity:1;fill:none;fill-opacity:1;stroke:#000000;stroke-width:7;stroke-linejoin:round;stroke-dasharray:none"
+         id="rect61595"
+         width="379.63181"
+         height="647.18188"
+         x="147.96869"
+         y="178.99452" />
+    </clipPath>
+    <clipPath
+       clipPathUnits="userSpaceOnUse"
+       id="clipPath61597">
+      <rect
+         style="opacity:1;fill:none;fill-opacity:1;stroke:#000000;stroke-width:7;stroke-linejoin:round;stroke-dasharray:none"
+         id="rect61599"
+         width="379.63181"
+         height="647.18188"
+         x="147.96869"
+         y="178.99452" />
+    </clipPath>
+    <clipPath
+       clipPathUnits="userSpaceOnUse"
+       id="clipPath61601">
+      <rect
+         style="opacity:1;fill:none;fill-opacity:1;stroke:#000000;stroke-width:7;stroke-linejoin:round;stroke-dasharray:none"
+         id="rect61603"
+         width="379.63181"
+         height="647.18188"
+         x="147.96869"
+         y="178.99452" />
+    </clipPath>
+    <clipPath
+       clipPathUnits="userSpaceOnUse"
+       id="clipPath61605">
+      <rect
+         style="opacity:1;fill:none;fill-opacity:1;stroke:#000000;stroke-width:7;stroke-linejoin:round;stroke-dasharray:none"
+         id="rect61607"
+         width="379.63181"
+         height="647.18188"
+         x="147.96869"
+         y="178.99452" />
+    </clipPath>
+    <clipPath
+       clipPathUnits="userSpaceOnUse"
+       id="clipPath61609">
+      <rect
+         style="opacity:1;fill:none;fill-opacity:1;stroke:#000000;stroke-width:3.11111;stroke-linejoin:round;stroke-dasharray:none"
+         id="rect61611"
+         width="168.72525"
+         height="287.63638"
+         x="-708.34058"
+         y="107.13162" />
+    </clipPath>
+    <clipPath
+       clipPathUnits="userSpaceOnUse"
+       id="clipPath61613">
+      <rect
+         style="opacity:1;fill:none;fill-opacity:1;stroke:#000000;stroke-width:3.11111;stroke-linejoin:round;stroke-dasharray:none"
+         id="rect61615"
+         width="168.72525"
+         height="287.63638"
+         x="-708.34058"
+         y="107.13162" />
+    </clipPath>
+    <clipPath
+       clipPathUnits="userSpaceOnUse"
+       id="clipPath61617">
+      <rect
+         style="opacity:1;fill:none;fill-opacity:1;stroke:#000000;stroke-width:7;stroke-linejoin:round;stroke-dasharray:none"
+         id="rect61619"
+         width="379.63181"
+         height="647.18188"
+         x="147.96869"
+         y="178.99452" />
+    </clipPath>
+    <clipPath
+       clipPathUnits="userSpaceOnUse"
+       id="clipPath61621">
+      <rect
+         style="opacity:1;fill:none;fill-opacity:1;stroke:#000000;stroke-width:3.11111;stroke-linejoin:round;stroke-dasharray:none"
+         id="rect61623"
+         width="168.72525"
+         height="287.63638"
+         x="-708.34058"
+         y="107.13162" />
+    </clipPath>
+    <clipPath
+       clipPathUnits="userSpaceOnUse"
+       id="clipPath61625">
+      <rect
+         style="opacity:1;fill:none;fill-opacity:1;stroke:#000000;stroke-width:3.11111;stroke-linejoin:round;stroke-dasharray:none"
+         id="rect61627"
+         width="168.72525"
+         height="287.63638"
+         x="-708.34058"
+         y="107.13162" />
+    </clipPath>
+    <clipPath
+       clipPathUnits="userSpaceOnUse"
+       id="clipPath61629">
+      <rect
+         style="opacity:1;fill:none;fill-opacity:1;stroke:#000000;stroke-width:4.01018;stroke-linejoin:round;stroke-dasharray:none"
+         id="rect61631"
+         width="280.33414"
+         height="287.63638"
+         x="-727.15228"
+         y="107.13162" />
+    </clipPath>
+    <clipPath
+       clipPathUnits="userSpaceOnUse"
+       id="clipPath61633">
+      <rect
+         style="opacity:1;fill:none;fill-opacity:1;stroke:#000000;stroke-width:4.01018;stroke-linejoin:round;stroke-dasharray:none"
+         id="rect61635"
+         width="280.33414"
+         height="287.63638"
+         x="-727.15228"
+         y="107.13162" />
+    </clipPath>
+    <clipPath
+       clipPathUnits="userSpaceOnUse"
+       id="clipPath61637">
+      <rect
+         style="opacity:1;fill:none;fill-opacity:1;stroke:#000000;stroke-width:7;stroke-linejoin:round;stroke-dasharray:none"
+         id="rect61639"
+         width="379.63181"
+         height="647.18188"
+         x="147.96869"
+         y="178.99452" />
+    </clipPath>
+    <clipPath
+       clipPathUnits="userSpaceOnUse"
+       id="clipPath61641">
+      <rect
+         style="opacity:1;fill:none;fill-opacity:1;stroke:#000000;stroke-width:7;stroke-linejoin:round;stroke-dasharray:none"
+         id="rect61643"
+         width="379.63181"
+         height="647.18188"
+         x="147.96869"
+         y="178.99452" />
+    </clipPath>
+    <clipPath
+       clipPathUnits="userSpaceOnUse"
+       id="clipPath61645">
+      <rect
+         style="opacity:1;fill:none;fill-opacity:1;stroke:#000000;stroke-width:2.07407;stroke-linejoin:round;stroke-dasharray:none"
+         id="rect61647"
+         width="112.4835"
+         height="191.7576"
+         x="-605.36768"
+         y="163.00008" />
+    </clipPath>
+    <clipPath
+       clipPathUnits="userSpaceOnUse"
+       id="clipPath61649">
+      <rect
+         style="opacity:1;fill:none;fill-opacity:1;stroke:#000000;stroke-width:2.07407;stroke-linejoin:round;stroke-dasharray:none"
+         id="rect61651"
+         width="112.4835"
+         height="191.7576"
+         x="-605.05963"
+         y="162.99326" />
+    </clipPath>
+    <clipPath
+       clipPathUnits="userSpaceOnUse"
+       id="clipPath61653">
+      <rect
+         style="opacity:1;fill:none;fill-opacity:1;stroke:#000000;stroke-width:2.07407;stroke-linejoin:round;stroke-dasharray:none"
+         id="rect61655"
+         width="112.4835"
+         height="191.7576"
+         x="-605.05963"
+         y="162.99326" />
+    </clipPath>
+    <clipPath
+       clipPathUnits="userSpaceOnUse"
+       id="clipPath61657">
+      <rect
+         style="opacity:1;fill:none;fill-opacity:1;stroke:#000000;stroke-width:7;stroke-linejoin:round;stroke-dasharray:none"
+         id="rect61659"
+         width="379.63181"
+         height="647.18188"
+         x="147.96869"
+         y="178.99452" />
+    </clipPath>
+    <clipPath
+       clipPathUnits="userSpaceOnUse"
+       id="clipPath61661">
+      <rect
+         style="opacity:1;fill:none;fill-opacity:1;stroke:#000000;stroke-width:2.07407;stroke-linejoin:round;stroke-dasharray:none"
+         id="rect61663"
+         width="112.4835"
+         height="191.7576"
+         x="-605.05963"
+         y="162.99326" />
+    </clipPath>
+    <clipPath
+       clipPathUnits="userSpaceOnUse"
+       id="clipPath61665">
+      <rect
+         style="opacity:1;fill:none;fill-opacity:1;stroke:#000000;stroke-width:2.07407;stroke-linejoin:round;stroke-dasharray:none"
+         id="rect61667"
+         width="112.4835"
+         height="191.7576"
+         x="-605.05963"
+         y="162.99326" />
+    </clipPath>
+    <clipPath
+       clipPathUnits="userSpaceOnUse"
+       id="clipPath61669">
+      <rect
+         style="opacity:1;fill:none;fill-opacity:1;stroke:#000000;stroke-width:2.07407;stroke-linejoin:round;stroke-dasharray:none"
+         id="rect61671"
+         width="112.4835"
+         height="191.7576"
+         x="-605.05963"
+         y="162.99326" />
+    </clipPath>
+    <clipPath
+       clipPathUnits="userSpaceOnUse"
+       id="clipPath61673">
+      <rect
+         style="opacity:1;fill:none;fill-opacity:1;stroke:#000000;stroke-width:2.07407;stroke-linejoin:round;stroke-dasharray:none"
+         id="rect61675"
+         width="112.4835"
+         height="191.7576"
+         x="-605.05963"
+         y="162.99326" />
+    </clipPath>
+    <clipPath
+       clipPathUnits="userSpaceOnUse"
+       id="clipPath61677">
+      <rect
+         style="opacity:1;fill:none;fill-opacity:1;stroke:#000000;stroke-width:2.07407;stroke-linejoin:round;stroke-dasharray:none"
+         id="rect61679"
+         width="112.4835"
+         height="191.7576"
+         x="-605.05963"
+         y="162.99326" />
+    </clipPath>
+    <clipPath
+       clipPathUnits="userSpaceOnUse"
+       id="clipPath61681">
+      <rect
+         style="opacity:1;fill:none;fill-opacity:1;stroke:#000000;stroke-width:2.07407;stroke-linejoin:round;stroke-dasharray:none"
+         id="rect61683"
+         width="112.4835"
+         height="191.7576"
+         x="-605.05963"
+         y="162.99326" />
+    </clipPath>
+    <clipPath
+       clipPathUnits="userSpaceOnUse"
+       id="clipPath61685">
+      <rect
+         style="opacity:1;fill:none;fill-opacity:1;stroke:#000000;stroke-width:2.07407;stroke-linejoin:round;stroke-dasharray:none"
+         id="rect61687"
+         width="112.4835"
+         height="191.7576"
+         x="-605.05963"
+         y="162.99326" />
+    </clipPath>
+    <clipPath
+       clipPathUnits="userSpaceOnUse"
+       id="clipPath61689">
+      <rect
+         style="opacity:1;fill:none;fill-opacity:1;stroke:#000000;stroke-width:2.07407;stroke-linejoin:round;stroke-dasharray:none"
+         id="rect61691"
+         width="112.4835"
+         height="191.7576"
+         x="-605.05963"
+         y="162.99326" />
+    </clipPath>
+    <clipPath
+       clipPathUnits="userSpaceOnUse"
+       id="clipPath61693">
+      <rect
+         style="opacity:1;fill:none;fill-opacity:1;stroke:#000000;stroke-width:2.07407;stroke-linejoin:round;stroke-dasharray:none"
+         id="rect61695"
+         width="112.4835"
+         height="191.7576"
+         x="-605.05963"
+         y="162.99326" />
+    </clipPath>
+    <clipPath
+       clipPathUnits="userSpaceOnUse"
+       id="clipPath61697">
+      <rect
+         style="opacity:1;fill:none;fill-opacity:1;stroke:#000000;stroke-width:7;stroke-linejoin:round;stroke-dasharray:none"
+         id="rect61699"
+         width="379.63181"
+         height="647.18188"
+         x="147.96869"
+         y="178.99452" />
+    </clipPath>
+    <clipPath
+       clipPathUnits="userSpaceOnUse"
+       id="clipPath61701">
+      <rect
+         style="opacity:1;fill:none;fill-opacity:1;stroke:#000000;stroke-width:3.11111;stroke-linejoin:round;stroke-dasharray:none"
+         id="rect61703"
+         width="168.72525"
+         height="287.63638"
+         x="-731.96674"
+         y="171.19934" />
+    </clipPath>
+    <clipPath
+       clipPathUnits="userSpaceOnUse"
+       id="clipPath61705">
+      <rect
+         style="opacity:1;fill:none;fill-opacity:1;stroke:#000000;stroke-width:7;stroke-linejoin:round;stroke-dasharray:none"
+         id="rect61707"
+         width="379.63181"
+         height="647.18188"
+         x="147.96869"
+         y="178.99452" />
+    </clipPath>
+    <clipPath
+       clipPathUnits="userSpaceOnUse"
+       id="clipPath61709">
+      <rect
+         style="opacity:1;fill:none;fill-opacity:1;stroke:#000000;stroke-width:7;stroke-linejoin:round;stroke-dasharray:none"
+         id="rect61711"
+         width="379.63181"
+         height="647.18188"
+         x="147.96869"
+         y="178.99452" />
+    </clipPath>
+    <clipPath
+       clipPathUnits="userSpaceOnUse"
+       id="clipPath61713">
+      <rect
+         style="opacity:1;fill:none;fill-opacity:1;stroke:#000000;stroke-width:3.11111;stroke-linejoin:round;stroke-dasharray:none"
+         id="rect61715"
+         width="168.72525"
+         height="287.63638"
+         x="-708.34058"
+         y="107.13162" />
+    </clipPath>
+    <clipPath
+       clipPathUnits="userSpaceOnUse"
+       id="clipPath61717">
+      <rect
+         style="opacity:1;fill:none;fill-opacity:1;stroke:#000000;stroke-width:3.11111;stroke-linejoin:round;stroke-dasharray:none"
+         id="rect61719"
+         width="168.72525"
+         height="287.63638"
+         x="-708.34058"
+         y="107.13162" />
+    </clipPath>
+    <clipPath
+       clipPathUnits="userSpaceOnUse"
+       id="clipPath61721">
+      <rect
+         style="opacity:1;fill:none;fill-opacity:1;stroke:#000000;stroke-width:3.11111;stroke-linejoin:round;stroke-dasharray:none"
+         id="rect61723"
+         width="168.72525"
+         height="287.63638"
+         x="-708.34058"
+         y="107.13162" />
+    </clipPath>
+    <clipPath
+       clipPathUnits="userSpaceOnUse"
+       id="clipPath61725">
+      <rect
+         style="opacity:1;fill:none;fill-opacity:1;stroke:#000000;stroke-width:3.11111;stroke-linejoin:round;stroke-dasharray:none"
+         id="rect61727"
+         width="168.72525"
+         height="287.63638"
+         x="-708.34058"
+         y="107.13162" />
+    </clipPath>
+    <clipPath
+       clipPathUnits="userSpaceOnUse"
+       id="clipPath61729">
+      <rect
+         style="opacity:1;fill:none;fill-opacity:1;stroke:#000000;stroke-width:3.11111;stroke-linejoin:round;stroke-dasharray:none"
+         id="rect61731"
+         width="168.72525"
+         height="287.63638"
+         x="-708.34058"
+         y="107.13162" />
+    </clipPath>
+    <clipPath
+       clipPathUnits="userSpaceOnUse"
+       id="clipPath61733">
+      <rect
+         style="opacity:1;fill:none;fill-opacity:1;stroke:#000000;stroke-width:3.11111;stroke-linejoin:round;stroke-dasharray:none"
+         id="rect61735"
+         width="168.72525"
+         height="287.63638"
+         x="-708.34058"
+         y="107.13162" />
+    </clipPath>
+    <clipPath
+       clipPathUnits="userSpaceOnUse"
+       id="clipPath61737">
+      <rect
+         style="opacity:1;fill:none;fill-opacity:1;stroke:#000000;stroke-width:3.11111;stroke-linejoin:round;stroke-dasharray:none"
+         id="rect61739"
+         width="168.72525"
+         height="287.63638"
+         x="-708.34058"
+         y="107.13162" />
+    </clipPath>
+    <clipPath
+       clipPathUnits="userSpaceOnUse"
+       id="clipPath61741">
+      <rect
+         style="opacity:1;fill:none;fill-opacity:1;stroke:#000000;stroke-width:3.11111;stroke-linejoin:round;stroke-dasharray:none"
+         id="rect61743"
+         width="168.72525"
+         height="287.63638"
+         x="-708.34058"
+         y="107.13162" />
+    </clipPath>
+    <clipPath
+       clipPathUnits="userSpaceOnUse"
+       id="clipPath61745">
+      <rect
+         style="opacity:1;fill:none;fill-opacity:1;stroke:#000000;stroke-width:3.11111;stroke-linejoin:round;stroke-dasharray:none"
+         id="rect61747"
+         width="168.72525"
+         height="287.63638"
+         x="-708.34058"
+         y="107.13162" />
+    </clipPath>
+    <clipPath
+       clipPathUnits="userSpaceOnUse"
+       id="clipPath61749">
+      <rect
+         style="opacity:1;fill:none;fill-opacity:1;stroke:#000000;stroke-width:3.11111;stroke-linejoin:round;stroke-dasharray:none"
+         id="rect61751"
+         width="168.72525"
+         height="287.63638"
+         x="-708.34058"
+         y="107.13162" />
+    </clipPath>
+    <clipPath
+       clipPathUnits="userSpaceOnUse"
+       id="clipPath61753">
+      <rect
+         style="opacity:1;fill:none;fill-opacity:1;stroke:#000000;stroke-width:3.11111;stroke-linejoin:round;stroke-dasharray:none"
+         id="rect61755"
+         width="168.72525"
+         height="287.63638"
+         x="-708.34058"
+         y="107.13162" />
+    </clipPath>
+    <clipPath
+       clipPathUnits="userSpaceOnUse"
+       id="clipPath61757">
+      <rect
+         style="opacity:1;fill:none;fill-opacity:1;stroke:#000000;stroke-width:7;stroke-linejoin:round;stroke-dasharray:none"
+         id="rect61759"
+         width="379.63181"
+         height="647.18188"
+         x="147.96869"
+         y="178.99452" />
+    </clipPath>
+    <clipPath
+       clipPathUnits="userSpaceOnUse"
+       id="clipPath61761">
+      <rect
+         style="opacity:1;fill:none;fill-opacity:1;stroke:#000000;stroke-width:7;stroke-linejoin:round;stroke-dasharray:none"
+         id="rect61763"
+         width="379.63181"
+         height="647.18188"
+         x="147.96869"
+         y="178.99452" />
+    </clipPath>
+    <clipPath
+       clipPathUnits="userSpaceOnUse"
+       id="clipPath61765">
+      <rect
+         style="opacity:1;fill:none;fill-opacity:1;stroke:#000000;stroke-width:7;stroke-linejoin:round;stroke-dasharray:none"
+         id="rect61767"
+         width="379.63181"
+         height="647.18188"
+         x="147.96869"
+         y="178.99452" />
+    </clipPath>
+    <clipPath
+       clipPathUnits="userSpaceOnUse"
+       id="clipPath61769">
+      <rect
+         style="opacity:1;fill:none;fill-opacity:1;stroke:#000000;stroke-width:3.11111;stroke-linejoin:round;stroke-dasharray:none"
+         id="rect61771"
+         width="168.72525"
+         height="287.63638"
+         x="-708.34058"
+         y="107.13162" />
+    </clipPath>
+    <clipPath
+       clipPathUnits="userSpaceOnUse"
+       id="clipPath61773">
+      <rect
+         style="opacity:1;fill:none;fill-opacity:1;stroke:#000000;stroke-width:2.07407;stroke-linejoin:round;stroke-dasharray:none"
+         id="rect61775"
+         width="112.4835"
+         height="191.7576"
+         x="-559.32135"
+         y="163.02754" />
+    </clipPath>
+    <clipPath
+       clipPathUnits="userSpaceOnUse"
+       id="clipPath61777">
+      <rect
+         style="opacity:1;fill:none;fill-opacity:1;stroke:#000000;stroke-width:2.07407;stroke-linejoin:round;stroke-dasharray:none"
+         id="rect61779"
+         width="112.4835"
+         height="191.7576"
+         x="-558.96484"
+         y="163.01535" />
+    </clipPath>
+    <clipPath
+       clipPathUnits="userSpaceOnUse"
+       id="clipPath61781">
+      <rect
+         style="opacity:1;fill:none;fill-opacity:1;stroke:#000000;stroke-width:2.07407;stroke-linejoin:round;stroke-dasharray:none"
+         id="rect61783"
+         width="112.4835"
+         height="191.7576"
+         x="-558.96484"
+         y="163.01535" />
+    </clipPath>
+    <clipPath
+       clipPathUnits="userSpaceOnUse"
+       id="clipPath61785">
+      <rect
+         style="opacity:1;fill:none;fill-opacity:1;stroke:#000000;stroke-width:7;stroke-linejoin:round;stroke-dasharray:none"
+         id="rect61787"
+         width="379.63181"
+         height="647.18188"
+         x="147.96869"
+         y="178.99452" />
+    </clipPath>
+    <clipPath
+       clipPathUnits="userSpaceOnUse"
+       id="clipPath61789">
+      <rect
+         style="opacity:1;fill:none;fill-opacity:1;stroke:#000000;stroke-width:2.07407;stroke-linejoin:round;stroke-dasharray:none"
+         id="rect61791"
+         width="112.4835"
+         height="191.7576"
+         x="-558.96484"
+         y="163.01535" />
+    </clipPath>
+    <clipPath
+       clipPathUnits="userSpaceOnUse"
+       id="clipPath61793">
+      <rect
+         style="opacity:1;fill:none;fill-opacity:1;stroke:#000000;stroke-width:2.07407;stroke-linejoin:round;stroke-dasharray:none"
+         id="rect61795"
+         width="112.4835"
+         height="191.7576"
+         x="-558.96484"
+         y="163.01535" />
+    </clipPath>
+    <clipPath
+       clipPathUnits="userSpaceOnUse"
+       id="clipPath61797">
+      <rect
+         style="opacity:1;fill:none;fill-opacity:1;stroke:#000000;stroke-width:2.07407;stroke-linejoin:round;stroke-dasharray:none"
+         id="rect61799"
+         width="112.4835"
+         height="191.7576"
+         x="-558.96484"
+         y="163.01535" />
+    </clipPath>
+    <clipPath
+       clipPathUnits="userSpaceOnUse"
+       id="clipPath61801">
+      <rect
+         style="opacity:1;fill:none;fill-opacity:1;stroke:#000000;stroke-width:2.07407;stroke-linejoin:round;stroke-dasharray:none"
+         id="rect61803"
+         width="112.4835"
+         height="191.7576"
+         x="-558.96484"
+         y="163.01535" />
+    </clipPath>
+    <clipPath
+       clipPathUnits="userSpaceOnUse"
+       id="clipPath61805">
+      <rect
+         style="opacity:1;fill:none;fill-opacity:1;stroke:#000000;stroke-width:2.07407;stroke-linejoin:round;stroke-dasharray:none"
+         id="rect61807"
+         width="112.4835"
+         height="191.7576"
+         x="-558.96484"
+         y="163.01535" />
+    </clipPath>
+    <clipPath
+       clipPathUnits="userSpaceOnUse"
+       id="clipPath61809">
+      <rect
+         style="opacity:1;fill:none;fill-opacity:1;stroke:#000000;stroke-width:2.07407;stroke-linejoin:round;stroke-dasharray:none"
+         id="rect61811"
+         width="112.4835"
+         height="191.7576"
+         x="-558.96484"
+         y="163.01535" />
+    </clipPath>
+    <clipPath
+       clipPathUnits="userSpaceOnUse"
+       id="clipPath61813">
+      <rect
+         style="opacity:1;fill:none;fill-opacity:1;stroke:#000000;stroke-width:2.07407;stroke-linejoin:round;stroke-dasharray:none"
+         id="rect61815"
+         width="112.4835"
+         height="191.7576"
+         x="-558.96484"
+         y="163.01535" />
+    </clipPath>
+    <clipPath
+       clipPathUnits="userSpaceOnUse"
+       id="clipPath61817">
+      <rect
+         style="opacity:1;fill:none;fill-opacity:1;stroke:#000000;stroke-width:2.07407;stroke-linejoin:round;stroke-dasharray:none"
+         id="rect61819"
+         width="112.4835"
+         height="191.7576"
+         x="-558.96484"
+         y="163.01535" />
+    </clipPath>
+    <clipPath
+       clipPathUnits="userSpaceOnUse"
+       id="clipPath61821">
+      <rect
+         style="opacity:1;fill:none;fill-opacity:1;stroke:#000000;stroke-width:2.07407;stroke-linejoin:round;stroke-dasharray:none"
+         id="rect61823"
+         width="112.4835"
+         height="191.7576"
+         x="-558.96484"
+         y="163.01535" />
+    </clipPath>
+    <clipPath
+       clipPathUnits="userSpaceOnUse"
+       id="clipPath61825">
+      <rect
+         style="opacity:1;fill:none;fill-opacity:1;stroke:#000000;stroke-width:7;stroke-linejoin:round;stroke-dasharray:none"
+         id="rect61827"
+         width="379.63181"
+         height="647.18188"
+         x="147.96869"
+         y="178.99452" />
+    </clipPath>
+    <clipPath
+       clipPathUnits="userSpaceOnUse"
+       id="clipPath61829">
+      <rect
+         style="opacity:1;fill:none;fill-opacity:1;stroke:#000000;stroke-width:7;stroke-linejoin:round;stroke-dasharray:none"
+         id="rect61831"
+         width="379.63181"
+         height="647.18188"
+         x="147.96869"
+         y="178.99452" />
+    </clipPath>
+    <clipPath
+       clipPathUnits="userSpaceOnUse"
+       id="clipPath61833">
+      <rect
+         style="opacity:1;fill:none;fill-opacity:1;stroke:#000000;stroke-width:7;stroke-linejoin:round;stroke-dasharray:none"
+         id="rect61835"
+         width="379.63181"
+         height="647.18188"
+         x="147.96869"
+         y="178.99452" />
+    </clipPath>
+    <clipPath
+       clipPathUnits="userSpaceOnUse"
+       id="clipPath61837">
+      <rect
+         style="opacity:1;fill:none;fill-opacity:1;stroke:#000000;stroke-width:7;stroke-linejoin:round;stroke-dasharray:none"
+         id="rect61839"
+         width="379.63181"
+         height="647.18188"
+         x="147.96869"
+         y="178.99452" />
+    </clipPath>
+    <clipPath
+       clipPathUnits="userSpaceOnUse"
+       id="clipPath61841">
+      <rect
+         style="opacity:1;fill:none;fill-opacity:1;stroke:#000000;stroke-width:3.11111;stroke-linejoin:round;stroke-dasharray:none"
+         id="rect61843"
+         width="168.72525"
+         height="287.63638"
+         x="-708.34058"
+         y="107.13162" />
+    </clipPath>
+    <clipPath
+       clipPathUnits="userSpaceOnUse"
+       id="clipPath61845">
+      <rect
+         style="opacity:1;fill:none;fill-opacity:1;stroke:#000000;stroke-width:7;stroke-linejoin:round;stroke-dasharray:none"
+         id="rect61847"
+         width="379.63181"
+         height="647.18188"
+         x="147.96869"
+         y="178.99452" />
+    </clipPath>
+    <clipPath
+       clipPathUnits="userSpaceOnUse"
+       id="clipPath61849">
+      <rect
+         style="opacity:1;fill:none;fill-opacity:1;stroke:#000000;stroke-width:7;stroke-linejoin:round;stroke-dasharray:none"
+         id="rect61851"
+         width="379.63181"
+         height="647.18188"
+         x="147.96869"
+         y="178.99452" />
+    </clipPath>
+    <clipPath
+       clipPathUnits="userSpaceOnUse"
+       id="clipPath61853">
+      <rect
+         style="opacity:1;fill:none;fill-opacity:1;stroke:#000000;stroke-width:7;stroke-linejoin:round;stroke-dasharray:none"
+         id="rect61855"
+         width="379.63181"
+         height="647.18188"
+         x="147.96869"
+         y="178.99452" />
+    </clipPath>
+    <clipPath
+       clipPathUnits="userSpaceOnUse"
+       id="clipPath61857">
+      <rect
+         style="opacity:1;fill:none;fill-opacity:1;stroke:#000000;stroke-width:7;stroke-linejoin:round;stroke-dasharray:none"
+         id="rect61859"
+         width="379.63181"
+         height="647.18188"
+         x="147.96869"
+         y="178.99452" />
+    </clipPath>
+    <clipPath
+       clipPathUnits="userSpaceOnUse"
+       id="clipPath61861">
+      <rect
+         style="opacity:1;fill:none;fill-opacity:1;stroke:#000000;stroke-width:3.11111;stroke-linejoin:round;stroke-dasharray:none"
+         id="rect61863"
+         width="168.72525"
+         height="287.63638"
+         x="-708.34058"
+         y="107.13162" />
+    </clipPath>
+    <clipPath
+       clipPathUnits="userSpaceOnUse"
+       id="clipPath61865">
+      <rect
+         style="opacity:1;fill:none;fill-opacity:1;stroke:#000000;stroke-width:7;stroke-linejoin:round;stroke-dasharray:none"
+         id="rect61867"
+         width="379.63181"
+         height="647.18188"
+         x="147.96869"
+         y="178.99452" />
+    </clipPath>
+    <clipPath
+       clipPathUnits="userSpaceOnUse"
+       id="clipPath61869">
+      <rect
+         style="opacity:1;fill:none;fill-opacity:1;stroke:#000000;stroke-width:3.11111;stroke-linejoin:round;stroke-dasharray:none"
+         id="rect61871"
+         width="168.72525"
+         height="287.63638"
+         x="-708.34058"
+         y="107.13162" />
+    </clipPath>
+    <clipPath
+       clipPathUnits="userSpaceOnUse"
+       id="clipPath61873">
+      <rect
+         style="opacity:1;fill:none;fill-opacity:1;stroke:#000000;stroke-width:3.11111;stroke-linejoin:round;stroke-dasharray:none"
+         id="rect61875"
+         width="168.72525"
+         height="287.63638"
+         x="-708.34058"
+         y="107.13162" />
+    </clipPath>
+    <clipPath
+       clipPathUnits="userSpaceOnUse"
+       id="clipPath61877">
+      <rect
+         style="opacity:1;fill:none;fill-opacity:1;stroke:#000000;stroke-width:7;stroke-linejoin:round;stroke-dasharray:none"
+         id="rect61879"
+         width="379.63181"
+         height="647.18188"
+         x="147.96869"
+         y="178.99452" />
+    </clipPath>
+    <clipPath
+       clipPathUnits="userSpaceOnUse"
+       id="clipPath61881">
+      <rect
+         style="opacity:1;fill:none;fill-opacity:1;stroke:#000000;stroke-width:7;stroke-linejoin:round;stroke-dasharray:none"
+         id="rect61883"
+         width="379.63181"
+         height="647.18188"
+         x="147.96869"
+         y="178.99452" />
+    </clipPath>
+    <clipPath
+       clipPathUnits="userSpaceOnUse"
+       id="clipPath61885">
+      <rect
+         style="opacity:1;fill:none;fill-opacity:1;stroke:#000000;stroke-width:7;stroke-linejoin:round;stroke-dasharray:none"
+         id="rect61887"
+         width="379.63181"
+         height="647.18188"
+         x="147.96869"
+         y="178.99452" />
+    </clipPath>
+    <clipPath
+       clipPathUnits="userSpaceOnUse"
+       id="clipPath61889">
+      <rect
+         style="opacity:1;fill:none;fill-opacity:1;stroke:#000000;stroke-width:7;stroke-linejoin:round;stroke-dasharray:none"
+         id="rect61891"
+         width="379.63181"
+         height="647.18188"
+         x="147.96869"
+         y="178.99452" />
+    </clipPath>
+    <clipPath
+       clipPathUnits="userSpaceOnUse"
+       id="clipPath61893">
+      <rect
+         style="opacity:1;fill:none;fill-opacity:1;stroke:#000000;stroke-width:7;stroke-linejoin:round;stroke-dasharray:none"
+         id="rect61895"
+         width="379.63181"
+         height="647.18188"
+         x="147.96869"
+         y="178.99452" />
+    </clipPath>
+    <clipPath
+       clipPathUnits="userSpaceOnUse"
+       id="clipPath61897">
+      <rect
+         style="opacity:1;fill:none;fill-opacity:1;stroke:#000000;stroke-width:7;stroke-linejoin:round;stroke-dasharray:none"
+         id="rect61899"
+         width="379.63181"
+         height="647.18188"
+         x="147.96869"
+         y="178.99452" />
+    </clipPath>
+    <clipPath
+       clipPathUnits="userSpaceOnUse"
+       id="clipPath61901">
+      <rect
+         style="opacity:1;fill:none;fill-opacity:1;stroke:#000000;stroke-width:7;stroke-linejoin:round;stroke-dasharray:none"
+         id="rect61903"
+         width="379.63181"
+         height="647.18188"
+         x="147.96869"
+         y="178.99452" />
+    </clipPath>
+  </defs>
+  <sodipodi:namedview
+     id="base"
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1.0"
+     inkscape:pageopacity="0.0"
+     inkscape:pageshadow="2"
+     inkscape:zoom="1.0729879"
+     inkscape:cx="355.54921"
+     inkscape:cy="235.79017"
+     inkscape:document-units="px"
+     inkscape:current-layer="layer1"
+     showgrid="false"
+     inkscape:window-width="1920"
+     inkscape:window-height="1011"
+     inkscape:window-x="0"
+     inkscape:window-y="32"
+     inkscape:window-maximized="1"
+     inkscape:showpageshadow="2"
+     inkscape:pagecheckerboard="0"
+     inkscape:deskcolor="#d1d1d1" />
+  <metadata
+     id="metadata104541">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <g
+     inkscape:label="Layer 1"
+     inkscape:groupmode="layer"
+     id="layer1"
+     transform="translate(-147.96869,-187.26927)">
+    <g
+       id="g93021">
+      <rect
+         style="fill:#ffffff"
+         id="rect6353"
+         width="445.59259"
+         height="660.79095"
+         x="122.65281"
+         y="188.48619"
+         clip-path="url(#clipPath61901)" />
+      <line
+         style="fill:none;stroke:#5e6a71;stroke-width:1.02682;stroke-miterlimit:10;stroke-dasharray:3.07565, 3.07565"
+         stroke-miterlimit="10"
+         x1="413.3428"
+         y1="279.20651"
+         x2="413.3428"
+         y2="496.95172"
+         id="line84244"
+         clip-path="url(#clipPath61897)" />
+      <rect
+         style="fill:none;stroke:#5e6a71;stroke-width:0.485;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+         id="rect125410-1-2"
+         width="94.101288"
+         height="87.10128"
+         x="287.91125"
+         y="382.12704"
+         clip-path="url(#clipPath61893)" />
+      <rect
+         style="fill:url(#linearGradient9382);fill-opacity:1;stroke:none"
+         id="rect126198-3-8"
+         width="108"
+         height="27"
+         x="275.46191"
+         y="457.79819"
+         clip-path="url(#clipPath61889)" />
+      <rect
+         style="fill:#f15d57"
+         x="211.4852"
+         y="538.19885"
+         width="95.778"
+         height="3.0712502"
+         id="rect82236"
+         inkscape:transform-center-x="586.0074"
+         inkscape:transform-center-y="-79.564828"
+         clip-path="url(#clipPath61885)" />
+      <rect
+         style="fill:#f15d57"
+         x="360.20123"
+         y="538.19885"
+         width="95.793755"
+         height="3.0712502"
+         id="rect82238"
+         inkscape:transform-center-x="437.28349"
+         inkscape:transform-center-y="-79.564828"
+         clip-path="url(#clipPath61881)" />
+      <line
+         style="fill:none;stroke:#5e6a71;stroke-width:0.4815;stroke-miterlimit:10;stroke-dasharray:1.44225, 1.44225"
+         stroke-miterlimit="10"
+         x1="408.16232"
+         y1="540.85376"
+         x2="408.16232"
+         y2="595.23627"
+         id="line82244"
+         inkscape:transform-center-x="437.21928"
+         inkscape:transform-center-y="-51.254289"
+         clip-path="url(#clipPath61877)" />
+      <polyline
+         style="fill:none;stroke:#5e6a71;stroke-width:0.214;stroke-miterlimit:10;stroke-dasharray:0.641, 0.641"
+         transform="matrix(2.25,0,0,2.25,1741.735,-62.051623)"
+         stroke-miterlimit="10"
+         points="  -603.212,292.128 -603.212,283.832 -582.187,283.832 -582.187,292.128 "
+         id="polyline82246"
+         inkscape:transform-center-x="437.22048"
+         inkscape:transform-center-y="-33.395941"
+         clip-path="url(#clipPath61873)" />
+      <rect
+         style="fill:url(#SVGID_4545_)"
+         x="-613.90802"
+         y="253.133"
+         clip-path="url(#clipPath61869)"
+         width="42.361"
+         height="14.22"
+         id="rect82306"
+         transform="matrix(2.25,0,0,2.25,1741.735,-62.051623)" />
+      <path
+         style="fill:#e6e8e8"
+         inkscape:connector-curvature="0"
+         d="m 455.51125,507.80361 -0.0157,31.37625 -94.815,0.072 0.0157,-31.2435 46.48275,11.31975 0.1125,0.027 0.11475,-0.027 z m 0.4815,-0.60975 -48.699,11.66625 -47.079,-11.46375 -0.0135,32.337 95.77575,-0.0743 0.0158,-32.46525 z"
+         id="path82308"
+         inkscape:transform-center-x="437.28456"
+         inkscape:transform-center-y="-95.835733"
+         clip-path="url(#clipPath61865)" />
+      <rect
+         style="fill:url(#SVGID_4548_)"
+         x="-680.00299"
+         y="253.133"
+         clip-path="url(#clipPath61861)"
+         width="42.361"
+         height="14.22"
+         id="rect82335"
+         transform="matrix(2.25,0,0,2.25,1741.735,-62.051623)" />
+      <path
+         style="fill:#e6e8e8"
+         inkscape:connector-curvature="0"
+         d="m 306.7975,507.80361 -0.0157,31.37625 -94.815,0.072 0.0157,-31.2435 46.48274,11.31975 0.1125,0.027 0.11475,-0.027 z m 0.4815,-0.60975 -48.699,11.66625 -47.079,-11.46375 -0.0135,32.337 95.77575,-0.0743 0.0157,-32.46525 z"
+         id="path82337"
+         inkscape:transform-center-x="585.99834"
+         inkscape:transform-center-y="-95.835733"
+         clip-path="url(#clipPath61857)" />
+      <text
+         y="531.49921"
+         x="240.48843"
+         id="text84236"
+         inkscape:transform-center-x="587.42372"
+         inkscape:transform-center-y="-90.601429"
+         style="font-size:27px"
+         clip-path="url(#clipPath61853)"><tspan
+           style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:8px;font-family:'DejaVu Sans';-inkscape-font-specification:'DejaVu Sans';fill:#37424b"
+           x="240.48843"
+           y="531.49921"
+           font-size="3.4203"
+           id="tspan84238">US-WEST</tspan></text>
+      <text
+         y="531.49921"
+         x="391.20377"
+         id="text84246"
+         inkscape:transform-center-x="438.70839"
+         inkscape:transform-center-y="-90.601429"
+         style="font-size:27px"
+         inkscape:export-xdpi="90"
+         inkscape:export-ydpi="90"
+         inkscape:export-filename="/home/john/Pictures/zone-sync.png"
+         clip-path="url(#clipPath61849)"><tspan
+           style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:8px;font-family:'DejaVu Sans';-inkscape-font-specification:'DejaVu Sans';fill:#37424b"
+           x="391.20377"
+           y="531.49921"
+           font-size="3.4203"
+           id="tspan84248">US-EAST</tspan></text>
+      <rect
+         style="fill:#f15d57"
+         x="356.27731"
+         y="456.49902"
+         width="103.6395"
+         height="3.8114998"
+         id="rect84287"
+         inkscape:transform-center-x="437.28453"
+         inkscape:transform-center-y="-160.89453"
+         clip-path="url(#clipPath61845)" />
+      <polygon
+         style="fill:url(#SVGID_4825_)"
+         clip-path="url(#clipPath61841)"
+         points="-615.683,231.929 -569.802,231.874 -569.772,256.788 -615.653,256.843 "
+         id="polygon84308"
+         transform="matrix(2.25,0,0,2.25,1741.735,-62.051623)" />
+      <path
+         style="fill:#e6e8e8"
+         inkscape:connector-curvature="0"
+         d="m 356.7565,460.02936 102.67875,0.009 10e-4,43.1055 -51.4755,12.33 -51.20775,-12.46725 0.003,-42.97725 z m -0.4815,-0.4815 v 43.83675 l 51.687,12.58425 51.957,-12.44475 -0.005,-43.96725 -103.6395,-0.009 z"
+         id="path84310"
+         inkscape:transform-center-x="437.28484"
+         inkscape:transform-center-y="-131.54096"
+         clip-path="url(#clipPath61837)" />
+      <text
+         y="476.79285"
+         x="379.91489"
+         id="text84312"
+         inkscape:transform-center-x="437.86922"
+         inkscape:transform-center-y="-134.7035"
+         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:27px;font-family:'DejaVu Sans';-inkscape-font-specification:'DejaVu Sans'"
+         clip-path="url(#clipPath61833)"><tspan
+           style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:11px;font-family:'DejaVu Sans';-inkscape-font-specification:'DejaVu Sans';fill:#37424b"
+           x="379.91489"
+           y="476.79285"
+           font-size="5.1244"
+           id="tspan84314">RADOSGW</tspan></text>
+      <rect
+         style="fill:#f15d57"
+         x="206.53078"
+         y="456.49902"
+         width="103.6395"
+         height="3.8114998"
+         id="rect84318"
+         inkscape:transform-center-x="587.03108"
+         inkscape:transform-center-y="-160.89453"
+         clip-path="url(#clipPath61829)" />
+      <line
+         id="line84244-3"
+         y2="496.8772"
+         x2="257.7728"
+         y1="279.13196"
+         x1="257.7728"
+         stroke-miterlimit="10"
+         style="fill:none;stroke:#5e6a71;stroke-width:1.02682;stroke-miterlimit:10;stroke-dasharray:3.07565, 3.07565"
+         clip-path="url(#clipPath61825)" />
+      <rect
+         id="rect82124-4"
+         height="10.191"
+         width="42.327"
+         clip-path="url(#clipPath61821)"
+         y="188.287"
+         x="-547.302"
+         style="fill:url(#linearGradient126904-61)"
+         transform="matrix(3.375,0,0,3.375,2034.475,-371.18227)" />
+      <path
+         id="path82134-5"
+         d="m -539.397,191.908 c -0.353,0 -0.64,-0.286 -0.64,-0.639 0,-0.354 0.287,-0.642 0.64,-0.641 0.354,0 0.639,0.287 0.639,0.641 0,0.353 -0.285,0.639 -0.639,0.639"
+         clip-path="url(#clipPath61817)"
+         inkscape:connector-curvature="0"
+         style="fill:#ffffff"
+         transform="matrix(3.375,0,0,3.375,2034.475,-371.18227)" />
+      <path
+         id="path82136-0"
+         d="m -539.397,194.263 c -0.353,0 -0.64,-0.286 -0.64,-0.639 0,-0.355 0.287,-0.642 0.64,-0.642 0.354,0 0.639,0.287 0.639,0.642 0,0.353 -0.285,0.639 -0.639,0.639"
+         clip-path="url(#clipPath61813)"
+         inkscape:connector-curvature="0"
+         style="fill:#ffffff"
+         transform="matrix(3.375,0,0,3.375,2034.475,-371.18227)" />
+      <circle
+         id="circle82138-2"
+         r="0.63999999"
+         cy="191.26801"
+         cx="-541.625"
+         stroke-miterlimit="10"
+         clip-path="url(#clipPath61809)"
+         style="fill:none;stroke:#ffffff;stroke-width:0.321;stroke-miterlimit:10"
+         transform="matrix(3.375,0,0,3.375,2034.475,-371.18227)" />
+      <circle
+         id="circle82140-3"
+         r="0.63999999"
+         cy="193.623"
+         cx="-541.625"
+         stroke-miterlimit="10"
+         clip-path="url(#clipPath61805)"
+         style="fill:none;stroke:#ffffff;stroke-width:0.321;stroke-miterlimit:10"
+         transform="matrix(3.375,0,0,3.375,2034.475,-371.18227)" />
+      <circle
+         id="circle82142-3"
+         r="0.63999999"
+         cy="191.26801"
+         cx="-543.85303"
+         stroke-miterlimit="10"
+         clip-path="url(#clipPath61801)"
+         style="fill:none;stroke:#ffffff;stroke-width:0.321;stroke-miterlimit:10"
+         transform="matrix(3.375,0,0,3.375,2034.475,-371.18227)" />
+      <circle
+         id="circle82144-4"
+         r="0.63999999"
+         cy="193.623"
+         cx="-543.854"
+         stroke-miterlimit="10"
+         clip-path="url(#clipPath61797)"
+         style="fill:none;stroke:#ffffff;stroke-width:0.321;stroke-miterlimit:10"
+         transform="matrix(3.375,0,0,3.375,2034.475,-371.18227)" />
+      <path
+         id="path82146-1"
+         d="m -537.169,191.908 c -0.354,0 -0.64,-0.286 -0.64,-0.639 0,-0.354 0.286,-0.642 0.64,-0.641 0.354,0 0.64,0.287 0.64,0.641 0,0.353 -0.286,0.639 -0.64,0.639"
+         clip-path="url(#clipPath61793)"
+         inkscape:connector-curvature="0"
+         style="fill:#ffffff"
+         transform="matrix(3.375,0,0,3.375,2034.475,-371.18227)" />
+      <path
+         id="path82148-5"
+         d="m -537.169,194.263 c -0.354,0 -0.64,-0.286 -0.64,-0.639 0,-0.355 0.286,-0.642 0.64,-0.642 0.354,0 0.64,0.287 0.64,0.642 0,0.353 -0.286,0.639 -0.64,0.639"
+         clip-path="url(#clipPath61789)"
+         inkscape:connector-curvature="0"
+         style="fill:#ffffff"
+         transform="matrix(3.375,0,0,3.375,2034.475,-371.18227)" />
+      <text
+         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:40.5px;font-family:'DejaVu Sans';-inkscape-font-specification:'DejaVu Sans'"
+         id="text82150-7"
+         x="248.08075"
+         y="282.81369"
+         clip-path="url(#clipPath61785)"><tspan
+           id="tspan82152-4"
+           font-size="3.2027"
+           y="282.81369"
+           x="248.08075"
+           style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:10.8091px;font-family:'DejaVu Sans';-inkscape-font-specification:'DejaVu Sans';fill:#ffffff">AP</tspan><tspan
+           id="tspan82154-9"
+           font-size="3.2027"
+           y="282.81369"
+           x="261.76285"
+           style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:10.8091px;font-family:'DejaVu Sans';-inkscape-font-specification:'DejaVu Sans';fill:#ffffff">P</tspan></text>
+      <path
+         id="path84646-0"
+         d="m -526.673,205.991 c 0,-0.349 0.282,-0.632 0.632,-0.632 0.349,0 0.632,0.283 0.632,0.632 0,0.35 -0.283,0.633 -0.632,0.633 -0.35,0 -0.632,-0.283 -0.632,-0.633"
+         clip-path="url(#clipPath61781)"
+         inkscape:connector-curvature="0"
+         style="fill:#5e6a71"
+         transform="matrix(3.375,0,0,3.375,2034.475,-371.18227)" />
+      <line
+         id="line84648-6"
+         y2="205.991"
+         x2="-523.14398"
+         y1="205.991"
+         x1="-526.03998"
+         stroke-miterlimit="10"
+         clip-path="url(#clipPath61777)"
+         style="fill:none;stroke:#5e6a71;stroke-width:0.214;stroke-miterlimit:10"
+         transform="matrix(3.375,0,0,3.375,2034.475,-371.18227)" />
+      <polygon
+         id="polygon84665-6"
+         points="-523.433,206 -521.64,208.524 -507.674,208.524 -507.674,203.459 -521.64,203.459 "
+         stroke-miterlimit="10"
+         transform="matrix(3.375,0,0,3.375,2035.6783,-371.22344)"
+         style="fill:none;stroke:#e6e8e8;stroke-width:0.214;stroke-miterlimit:10"
+         clip-path="url(#clipPath61773)" />
+      <polygon
+         style="fill:url(#SVGID_4828_)"
+         clip-path="url(#clipPath61769)"
+         points="-682.238,231.929 -636.356,231.874 -636.326,256.788 -682.208,256.843 "
+         id="polygon84339"
+         transform="matrix(2.25,0,0,2.25,1741.735,-62.051623)" />
+      <path
+         style="fill:#e6e8e8"
+         inkscape:connector-curvature="0"
+         d="m 207.01,460.02936 102.67875,0.009 10e-4,43.1055 -51.4755,12.33 -51.20775,-12.46725 0.002,-42.97725 z m -0.4815,-0.4815 v 43.83675 l 51.687,12.58425 51.957,-12.44475 -0.005,-43.96725 -103.6395,-0.009 z"
+         id="path84341"
+         inkscape:transform-center-x="587.03109"
+         inkscape:transform-center-y="-131.54096"
+         clip-path="url(#clipPath61765)" />
+      <text
+         y="476.79285"
+         x="230.16792"
+         id="text84343"
+         inkscape:transform-center-x="587.62742"
+         inkscape:transform-center-y="-134.7035"
+         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:27px;font-family:'DejaVu Sans';-inkscape-font-specification:'DejaVu Sans'"
+         clip-path="url(#clipPath61761)"><tspan
+           style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:11px;font-family:'DejaVu Sans';-inkscape-font-specification:'DejaVu Sans';fill:#37424b"
+           x="230.16792"
+           y="476.79285"
+           font-size="5.1244"
+           id="tspan84345">RADOSGW</tspan></text>
+      <line
+         style="fill:none;stroke:#5e6a71;stroke-width:0.4815;stroke-miterlimit:10;stroke-dasharray:1.44225, 1.44225"
+         stroke-miterlimit="10"
+         x1="258.25607"
+         y1="540.85376"
+         x2="258.25607"
+         y2="595.23627"
+         id="line84349"
+         inkscape:transform-center-x="587.12555"
+         inkscape:transform-center-y="-51.254289"
+         clip-path="url(#clipPath61757)" />
+      <polyline
+         style="fill:none;stroke:#5e6a71;stroke-width:0.214;stroke-miterlimit:10;stroke-dasharray:0.641, 0.641"
+         transform="matrix(2.25,0,0,2.25,1741.735,-62.051623)"
+         stroke-miterlimit="10"
+         points="  -669.837,292.128 -669.837,283.832 -648.812,283.832 -648.812,292.128 "
+         id="polyline84351"
+         inkscape:transform-center-x="587.12673"
+         inkscape:transform-center-y="-33.395941"
+         clip-path="url(#clipPath61753)" />
+      <polygon
+         style="fill:#81d0db"
+         transform="matrix(2.25,0,0,2.25,1741.735,-62.051623)"
+         points="-661.37,267.424 -659.319,269.217 -657.251,267.424 "
+         id="polygon84353"
+         inkscape:transform-center-x="587.09523"
+         inkscape:transform-center-y="-77.629816"
+         clip-path="url(#clipPath61749)" />
+      <polygon
+         style="fill:#81d0db"
+         transform="matrix(2.25,0,0,2.25,1741.735,-62.051623)"
+         points="-594.747,267.424 -592.696,269.217 -590.628,267.424 "
+         id="polygon84355"
+         inkscape:transform-center-x="437.19348"
+         inkscape:transform-center-y="-77.629816"
+         clip-path="url(#clipPath61745)" />
+      <path
+         id="path84524"
+         d="m -365.856,302.434 c 0,-2.331 1.892,-4.222 4.225,-4.222 2.334,0 4.223,1.891 4.223,4.222 0,2.334 -1.889,4.226 -4.223,4.226 -2.333,0 -4.225,-1.892 -4.225,-4.226"
+         clip-path="url(#SVGID_4843_)"
+         inkscape:connector-curvature="0"
+         style="fill:#f15d57"
+         transform="matrix(1.5,0,0,1.5,1199.2451,155.9225)" />
+      <path
+         id="path84526"
+         d="m -361.631,301.547 c 0.488,0 0.888,0.398 0.888,0.887 0,0.493 -0.4,0.892 -0.888,0.89 -0.491,0 -0.888,-0.397 -0.888,-0.89 0,-0.489 0.397,-0.887 0.888,-0.887"
+         clip-path="url(#SVGID_4843_)"
+         inkscape:connector-curvature="0"
+         style="fill:#ffffff"
+         transform="matrix(1.5,0,0,1.5,1199.2451,155.9225)" />
+      <path
+         id="path84528"
+         d="m -347.575,299.54 c 0.487,0 0.886,0.395 0.886,0.886 0,0.494 -0.399,0.891 -0.886,0.891 -0.493,0 -0.888,-0.397 -0.888,-0.891 0,-0.491 0.395,-0.886 0.888,-0.886"
+         clip-path="url(#SVGID_4843_)"
+         inkscape:connector-curvature="0"
+         style="fill:#ffffff"
+         transform="matrix(1.5,0,0,1.5,1199.2451,155.9225)" />
+      <path
+         id="path84530"
+         d="m -350.839,302.809 c 0.49,0 0.886,0.397 0.886,0.886 0,0.494 -0.396,0.893 -0.886,0.893 -0.491,0 -0.889,-0.399 -0.889,-0.893 0,-0.489 0.398,-0.886 0.889,-0.886"
+         clip-path="url(#SVGID_4843_)"
+         inkscape:connector-curvature="0"
+         style="fill:#ffffff"
+         transform="matrix(1.5,0,0,1.5,1199.2451,155.9225)" />
+      <path
+         id="path84532"
+         d="m -350.838,299.54 c 0.489,0 0.885,0.395 0.885,0.886 0,0.494 -0.396,0.891 -0.885,0.891 -0.492,0 -0.89,-0.397 -0.89,-0.891 0,-0.491 0.398,-0.886 0.89,-0.886"
+         clip-path="url(#SVGID_4843_)"
+         inkscape:connector-curvature="0"
+         style="fill:#ffffff"
+         transform="matrix(1.5,0,0,1.5,1199.2451,155.9225)" />
+      <path
+         id="path84534"
+         d="m -347.576,302.809 c 0.488,0 0.888,0.397 0.888,0.886 0,0.494 -0.4,0.893 -0.888,0.893 -0.491,0 -0.888,-0.399 -0.888,-0.893 0,-0.489 0.397,-0.886 0.888,-0.886"
+         clip-path="url(#SVGID_4843_)"
+         inkscape:connector-curvature="0"
+         style="fill:#ffffff"
+         transform="matrix(1.5,0,0,1.5,1199.2451,155.9225)" />
+      <path
+         id="path84536"
+         d="m -344.311,302.809 c 0.488,0 0.886,0.397 0.886,0.886 0,0.494 -0.398,0.893 -0.886,0.893 -0.491,0 -0.888,-0.399 -0.888,-0.893 0,-0.489 0.397,-0.886 0.888,-0.886"
+         clip-path="url(#SVGID_4843_)"
+         inkscape:connector-curvature="0"
+         style="fill:#ffffff"
+         transform="matrix(1.5,0,0,1.5,1199.2451,155.9225)" />
+      <path
+         id="path84538"
+         d="m -344.31,299.54 c 0.487,0 0.885,0.395 0.885,0.886 0,0.494 -0.398,0.891 -0.885,0.891 -0.492,0 -0.888,-0.397 -0.888,-0.891 0,-0.491 0.396,-0.886 0.888,-0.886"
+         clip-path="url(#SVGID_4843_)"
+         inkscape:connector-curvature="0"
+         style="fill:#ffffff"
+         transform="matrix(1.5,0,0,1.5,1199.2451,155.9225)" />
+      <line
+         id="line84540"
+         y2="308.98499"
+         x2="-343.42499"
+         y1="308.98499"
+         x1="-365.664"
+         stroke-miterlimit="10"
+         clip-path="url(#SVGID_4843_)"
+         style="fill:none;stroke:#ffffff;stroke-width:0.428;stroke-miterlimit:10"
+         transform="matrix(1.5,0,0,1.5,1199.2451,155.9225)" />
+      <line
+         id="line84542"
+         y2="311.16699"
+         x2="-343.42499"
+         y1="311.16699"
+         x1="-365.664"
+         stroke-miterlimit="10"
+         clip-path="url(#SVGID_4843_)"
+         style="fill:none;stroke:#ffffff;stroke-width:0.428;stroke-miterlimit:10"
+         transform="matrix(1.5,0,0,1.5,1199.2451,155.9225)" />
+      <line
+         id="line84544"
+         y2="313.35001"
+         x2="-343.42499"
+         y1="313.35001"
+         x1="-365.664"
+         stroke-miterlimit="10"
+         clip-path="url(#SVGID_4843_)"
+         style="fill:none;stroke:#ffffff;stroke-width:0.428;stroke-miterlimit:10"
+         transform="matrix(1.5,0,0,1.5,1199.2451,155.9225)" />
+      <polygon
+         id="polygon84564"
+         points="-438.651,206.566 -436.6,208.359 -434.532,206.566 "
+         clip-path="url(#SVGID_4843_)"
+         style="fill:#f15d57"
+         transform="matrix(1.5,0,0,1.5,1199.2451,155.9225)" />
+      <polygon
+         id="polygon84566"
+         points="-428.14,206.566 -426.089,208.359 -424.021,206.566 "
+         clip-path="url(#SVGID_4843_)"
+         style="fill:#f15d57"
+         transform="matrix(1.5,0,0,1.5,1199.2451,155.9225)" />
+      <polygon
+         id="polygon84568"
+         points="-417.626,206.566 -415.575,208.359 -413.507,206.566 "
+         clip-path="url(#SVGID_4843_)"
+         style="fill:#f15d57"
+         transform="matrix(1.5,0,0,1.5,1199.2451,155.9225)" />
+      <polygon
+         id="polygon84570"
+         points="-298.678,289.091 -296.627,290.885 -294.559,289.091 "
+         clip-path="url(#SVGID_4843_)"
+         style="fill:#f15d57"
+         transform="matrix(1.5,0,0,1.5,1199.2451,155.9225)" />
+      <path
+         style="fill:#5e6a71"
+         inkscape:connector-curvature="0"
+         clip-path="url(#clipPath61741)"
+         d="m -593.321,276.099 c 0,-0.349 0.282,-0.632 0.632,-0.632 0.349,0 0.632,0.283 0.632,0.632 0,0.35 -0.283,0.633 -0.632,0.633 -0.35,0 -0.632,-0.283 -0.632,-0.633"
+         id="path84722"
+         transform="matrix(2.25,0,0,2.25,1741.735,-62.051623)" />
+      <line
+         style="fill:none;stroke:#5e6a71;stroke-width:0.214;stroke-miterlimit:10"
+         clip-path="url(#clipPath61737)"
+         stroke-miterlimit="10"
+         x1="-592.68903"
+         y1="276.099"
+         x2="-589.79303"
+         y2="276.099"
+         id="line84724"
+         transform="matrix(2.25,0,0,2.25,1741.735,-62.051623)" />
+      <rect
+         style="fill:url(#SVGID_4866_)"
+         x="-590.08099"
+         y="273.56699"
+         clip-path="url(#clipPath61733)"
+         width="15.759"
+         height="5.0650001"
+         id="rect84739"
+         transform="matrix(2.25,0,0,2.25,1741.735,-62.051623)" />
+      <polygon
+         style="fill:none;stroke:#e6e8e8;stroke-width:0.214;stroke-miterlimit:10"
+         transform="matrix(2.25,0,0,2.25,1741.735,-62.051623)"
+         stroke-miterlimit="10"
+         points="-588.289,278.632 -574.323,278.632 -574.323,273.567 -588.289,273.567 -590.082,276.108 "
+         id="polygon84741"
+         inkscape:transform-center-x="413.60223"
+         inkscape:transform-center-y="-60.127066"
+         clip-path="url(#clipPath61729)" />
+      <path
+         style="fill:#5e6a71"
+         inkscape:connector-curvature="0"
+         clip-path="url(#clipPath61725)"
+         d="m -659.955,276.099 c 0,-0.349 0.282,-0.632 0.632,-0.632 0.349,0 0.632,0.283 0.632,0.632 0,0.35 -0.283,0.633 -0.632,0.633 -0.35,0 -0.632,-0.283 -0.632,-0.633"
+         id="path84761"
+         transform="matrix(2.25,0,0,2.25,1741.735,-62.051623)" />
+      <line
+         style="fill:none;stroke:#5e6a71;stroke-width:0.214;stroke-miterlimit:10"
+         clip-path="url(#clipPath61721)"
+         stroke-miterlimit="10"
+         x1="-659.323"
+         y1="276.099"
+         x2="-656.427"
+         y2="276.099"
+         id="line84763"
+         transform="matrix(2.25,0,0,2.25,1741.735,-62.051623)" />
+      <rect
+         style="fill:url(#SVGID_4871_)"
+         x="-656.71503"
+         y="273.56699"
+         clip-path="url(#clipPath61717)"
+         width="15.759"
+         height="5.0650001"
+         id="rect84778"
+         transform="matrix(2.25,0,0,2.25,1741.735,-62.051623)" />
+      <polygon
+         style="fill:none;stroke:#e6e8e8;stroke-width:0.214;stroke-miterlimit:10"
+         transform="matrix(2.25,0,0,2.25,1741.735,-62.051623)"
+         stroke-miterlimit="10"
+         points="-654.922,278.632 -640.956,278.632 -640.956,273.567 -654.922,273.567 -656.715,276.108 "
+         id="polygon84780"
+         inkscape:transform-center-x="563.52648"
+         inkscape:transform-center-y="-60.127066"
+         clip-path="url(#clipPath61713)" />
+      <text
+         xml:space="preserve"
+         style="font-style:normal;font-weight:normal;font-size:8px;line-height:125%;font-family:Sans;text-align:center;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none"
+         x="421.82733"
+         y="540.91724"
+         id="text113406"><tspan
+           sodipodi:role="line"
+           id="tspan113408"
+           x="421.82733"
+           y="540.91724" /></text>
+      <text
+         y="795.61414"
+         x="378.37204"
+         id="text84343-2"
+         inkscape:transform-center-x="587.62742"
+         inkscape:transform-center-y="-134.7035"
+         style="font-size:27px;text-align:center;text-anchor:middle"
+         clip-path="url(#clipPath61709)"><tspan
+           style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:11px;font-family:'DejaVu Sans';-inkscape-font-specification:'DejaVu Sans';text-align:center;text-anchor:middle;fill:#37424b"
+           x="333.39987"
+           y="795.61414"
+           font-size="5.1244"
+           id="tspan84345-2">MASTER ZONEGROUP</tspan></text>
+      <text
+         y="889.87488"
+         x="424.41846"
+         id="text84343-2-6"
+         inkscape:transform-center-x="587.62742"
+         inkscape:transform-center-y="-134.7035"
+         style="font-size:27px;text-align:center;text-anchor:middle"><tspan
+           style="font-size:11px;font-family:ApexSans-Book;text-align:center;text-anchor:middle;fill:#37424b"
+           x="385.2041"
+           y="889.87488"
+           font-size="5.1244"
+           id="tspan84345-2-5" /></text>
+      <flowRoot
+         xml:space="preserve"
+         id="flowRoot126352"
+         style="font-style:normal;font-weight:normal;font-size:9px;line-height:125%;font-family:Sans;text-align:center;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+         transform="translate(135.96191,-36.49144)"><flowRegion
+           id="flowRegion126354"><rect
+             id="rect126356"
+             width="0"
+             height="51"
+             x="247"
+             y="928.36218" /></flowRegion><flowPara
+           id="flowPara126358" /></flowRoot>
+      <flowRoot
+         xml:space="preserve"
+         id="flowRoot126403"
+         style="font-style:normal;font-weight:normal;font-size:9px;line-height:125%;font-family:Sans;text-align:center;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+         transform="translate(135.96191,-36.49144)"><flowRegion
+           id="flowRegion126405"><rect
+             id="rect126407"
+             width="185"
+             height="81"
+             x="286"
+             y="941.36218" /></flowRegion><flowPara
+           id="flowPara126409" /></flowRoot>
+      <flowRoot
+         xml:space="preserve"
+         id="flowRoot126411"
+         style="font-style:normal;font-weight:normal;font-size:9px;line-height:125%;font-family:Sans;text-align:center;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+         transform="translate(135.96191,-36.49144)"><flowRegion
+           id="flowRegion126413"><rect
+             id="rect126415"
+             width="89"
+             height="64"
+             x="285"
+             y="943.36218" /></flowRegion><flowPara
+           id="flowPara126417" /></flowRoot>
+      <text
+         xml:space="preserve"
+         style="font-style:normal;font-weight:normal;font-size:9px;line-height:125%;font-family:Sans;text-align:center;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none"
+         x="407.96191"
+         y="493.15442"
+         id="text126456"
+         clip-path="url(#clipPath61705)"><tspan
+           sodipodi:role="line"
+           id="tspan126458"
+           x="407.96191"
+           y="493.15442"
+           style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:'DejaVu Sans';-inkscape-font-specification:'DejaVu Sans'">MASTER</tspan><tspan
+           sodipodi:role="line"
+           x="407.96191"
+           y="504.40442"
+           id="tspan126460"
+           style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:'DejaVu Sans';-inkscape-font-specification:'DejaVu Sans'">ZONE</tspan></text>
+      <polygon
+         id="polygon84546-9-3"
+         points="-669.845,294.263 -667.777,292.47 -671.896,292.47 "
+         clip-path="url(#clipPath61701)"
+         style="fill:#f15d57"
+         transform="matrix(2.25,0,0,2.25,1794.8939,-206.20401)" />
+      <text
+         xml:space="preserve"
+         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:9px;line-height:125%;font-family:'DejaVu Sans';-inkscape-font-specification:'DejaVu Sans';text-align:center;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none"
+         x="258.19333"
+         y="493.15442"
+         id="text126655-6"
+         clip-path="url(#clipPath61697)"><tspan
+           sodipodi:role="line"
+           id="tspan126657-2"
+           x="258.19333"
+           y="493.15442">SECONDARY</tspan><tspan
+           sodipodi:role="line"
+           x="258.19333"
+           y="504.40442"
+           id="tspan126659-4">ZONE</tspan></text>
+      <rect
+         style="fill:url(#linearGradient126904)"
+         x="-547.302"
+         y="188.287"
+         clip-path="url(#clipPath61693)"
+         width="42.327"
+         height="10.191"
+         id="rect82124"
+         transform="matrix(3.375,0,0,3.375,2190.045,-371.10773)" />
+      <path
+         style="fill:#ffffff"
+         inkscape:connector-curvature="0"
+         clip-path="url(#clipPath61689)"
+         d="m -539.397,191.908 c -0.353,0 -0.64,-0.286 -0.64,-0.639 0,-0.354 0.287,-0.642 0.64,-0.641 0.354,0 0.639,0.287 0.639,0.641 0,0.353 -0.285,0.639 -0.639,0.639"
+         id="path82134"
+         transform="matrix(3.375,0,0,3.375,2190.045,-371.10773)" />
+      <path
+         style="fill:#ffffff"
+         inkscape:connector-curvature="0"
+         clip-path="url(#clipPath61685)"
+         d="m -539.397,194.263 c -0.353,0 -0.64,-0.286 -0.64,-0.639 0,-0.355 0.287,-0.642 0.64,-0.642 0.354,0 0.639,0.287 0.639,0.642 0,0.353 -0.285,0.639 -0.639,0.639"
+         id="path82136"
+         transform="matrix(3.375,0,0,3.375,2190.045,-371.10773)" />
+      <circle
+         style="fill:none;stroke:#ffffff;stroke-width:0.321;stroke-miterlimit:10"
+         clip-path="url(#clipPath61681)"
+         stroke-miterlimit="10"
+         cx="-541.625"
+         cy="191.26801"
+         r="0.63999999"
+         id="circle82138"
+         transform="matrix(3.375,0,0,3.375,2190.045,-371.10773)" />
+      <circle
+         style="fill:none;stroke:#ffffff;stroke-width:0.321;stroke-miterlimit:10"
+         clip-path="url(#clipPath61677)"
+         stroke-miterlimit="10"
+         cx="-541.625"
+         cy="193.623"
+         r="0.63999999"
+         id="circle82140"
+         transform="matrix(3.375,0,0,3.375,2190.045,-371.10773)" />
+      <circle
+         style="fill:none;stroke:#ffffff;stroke-width:0.321;stroke-miterlimit:10"
+         clip-path="url(#clipPath61673)"
+         stroke-miterlimit="10"
+         cx="-543.85303"
+         cy="191.26801"
+         r="0.63999999"
+         id="circle82142"
+         transform="matrix(3.375,0,0,3.375,2190.045,-371.10773)" />
+      <circle
+         style="fill:none;stroke:#ffffff;stroke-width:0.321;stroke-miterlimit:10"
+         clip-path="url(#clipPath61669)"
+         stroke-miterlimit="10"
+         cx="-543.854"
+         cy="193.623"
+         r="0.63999999"
+         id="circle82144"
+         transform="matrix(3.375,0,0,3.375,2190.045,-371.10773)" />
+      <path
+         style="fill:#ffffff"
+         inkscape:connector-curvature="0"
+         clip-path="url(#clipPath61665)"
+         d="m -537.169,191.908 c -0.354,0 -0.64,-0.286 -0.64,-0.639 0,-0.354 0.286,-0.642 0.64,-0.641 0.354,0 0.64,0.287 0.64,0.641 0,0.353 -0.286,0.639 -0.64,0.639"
+         id="path82146"
+         transform="matrix(3.375,0,0,3.375,2190.045,-371.10773)" />
+      <path
+         style="fill:#ffffff"
+         inkscape:connector-curvature="0"
+         clip-path="url(#clipPath61661)"
+         d="m -537.169,194.263 c -0.354,0 -0.64,-0.286 -0.64,-0.639 0,-0.355 0.286,-0.642 0.64,-0.642 0.354,0 0.64,0.287 0.64,0.642 0,0.353 -0.286,0.639 -0.64,0.639"
+         id="path82148"
+         transform="matrix(3.375,0,0,3.375,2190.045,-371.10773)" />
+      <text
+         y="282.88824"
+         x="403.65076"
+         id="text82150"
+         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:40.5px;font-family:'DejaVu Sans';-inkscape-font-specification:'DejaVu Sans'"
+         clip-path="url(#clipPath61657)"><tspan
+           style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:10.8091px;font-family:'DejaVu Sans';-inkscape-font-specification:'DejaVu Sans';fill:#ffffff"
+           x="403.65076"
+           y="282.88824"
+           font-size="3.2027"
+           id="tspan82152">AP</tspan><tspan
+           style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:10.8091px;font-family:'DejaVu Sans';-inkscape-font-specification:'DejaVu Sans';fill:#ffffff"
+           x="417.33286"
+           y="282.88824"
+           font-size="3.2027"
+           id="tspan82154">P</tspan></text>
+      <path
+         style="fill:#5e6a71"
+         inkscape:connector-curvature="0"
+         clip-path="url(#clipPath61653)"
+         d="m -526.673,205.991 c 0,-0.349 0.282,-0.632 0.632,-0.632 0.349,0 0.632,0.283 0.632,0.632 0,0.35 -0.283,0.633 -0.632,0.633 -0.35,0 -0.632,-0.283 -0.632,-0.633"
+         id="path84646"
+         transform="matrix(3.375,0,0,3.375,2190.045,-371.10773)" />
+      <line
+         style="fill:none;stroke:#5e6a71;stroke-width:0.214;stroke-miterlimit:10"
+         clip-path="url(#clipPath61649)"
+         stroke-miterlimit="10"
+         x1="-526.03998"
+         y1="205.991"
+         x2="-523.14398"
+         y2="205.991"
+         id="line84648"
+         transform="matrix(3.375,0,0,3.375,2190.045,-371.10773)" />
+      <polygon
+         style="fill:none;stroke:#e6e8e8;stroke-width:0.214;stroke-miterlimit:10"
+         transform="matrix(3.375,0,0,3.375,2191.0846,-371.13073)"
+         stroke-miterlimit="10"
+         points="-523.433,206 -521.64,208.524 -507.674,208.524 -507.674,203.459 -521.64,203.459 "
+         id="polygon84665"
+         clip-path="url(#clipPath61645)" />
+      <text
+         xml:space="preserve"
+         style="font-style:normal;font-weight:normal;font-size:9px;line-height:125%;font-family:Sans;text-align:center;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none"
+         x="333.03717"
+         y="401.67719"
+         id="text127418"
+         clip-path="url(#clipPath61641)"><tspan
+           sodipodi:role="line"
+           id="tspan127420"
+           x="333.03717"
+           y="401.67719">DATA</tspan><tspan
+           sodipodi:role="line"
+           x="333.03717"
+           y="412.92719"
+           id="tspan127422">SYNC</tspan></text>
+      <text
+         xml:space="preserve"
+         style="font-style:normal;font-weight:normal;font-size:9px;line-height:125%;font-family:Sans;text-align:center;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none"
+         x="368.21997"
+         y="141.67719"
+         id="text127482"><tspan
+           sodipodi:role="line"
+           id="tspan127484"
+           x="368.21997"
+           y="141.67719" /></text>
+      <text
+         y="211.11368"
+         x="378.37204"
+         id="text84343-2-0"
+         inkscape:transform-center-x="587.62742"
+         inkscape:transform-center-y="-134.7035"
+         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:27px;font-family:'DejaVu Sans';-inkscape-font-specification:'DejaVu Sans';text-align:center;text-anchor:middle"
+         clip-path="url(#clipPath61637)"><tspan
+           style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:11px;font-family:'DejaVu Sans';-inkscape-font-specification:'DejaVu Sans';text-align:center;text-anchor:middle;fill:#37424b"
+           x="333.39987"
+           y="211.11368"
+           font-size="5.1244"
+           id="tspan84345-2-6">MASTER ZONEGROUP</tspan></text>
+      <rect
+         id="rect82189"
+         height="64.038002"
+         width="174.953"
+         clip-path="url(#clipPath61633)"
+         y="293.366"
+         x="-679.57202"
+         style="fill:url(#SVGID_4530_)"
+         transform="matrix(1.3542118,0,0,2.25,1132.6869,-62.051623)" />
+      <rect
+         id="rect82199"
+         height="64.038002"
+         width="174.953"
+         stroke-miterlimit="10"
+         clip-path="url(#clipPath61629)"
+         y="293.366"
+         x="-679.57202"
+         style="fill:none;stroke:#f15d57;stroke-width:0.214;stroke-miterlimit:10"
+         transform="matrix(1.3542118,0,0,2.25,1132.6869,-62.051623)" />
+      <path
+         id="path82347"
+         d="m -602.031,326.467 c 0,0.212 0.172,0.385 0.385,0.385 h 6.697 c 0.212,0 0.385,-0.173 0.385,-0.385 v -6.696 c 0,-0.213 -0.173,-0.385 -0.385,-0.385 h -6.697 c -0.213,0 -0.385,0.172 -0.385,0.385 z"
+         clip-path="url(#clipPath61625)"
+         inkscape:connector-curvature="0"
+         style="fill:#f15d57"
+         transform="matrix(2.25,0,0,2.25,1741.735,-62.051623)" />
+      <path
+         id="path82349"
+         d="m -602.031,326.467 c 0,0.212 0.172,0.385 0.385,0.385 h 6.697 c 0.212,0 0.385,-0.173 0.385,-0.385 v -6.696 c 0,-0.213 -0.173,-0.385 -0.385,-0.385 h -6.697 c -0.213,0 -0.385,0.172 -0.385,0.385 z"
+         stroke-miterlimit="10"
+         clip-path="url(#clipPath61621)"
+         inkscape:connector-curvature="0"
+         style="fill:none;stroke:#ffffff;stroke-width:0.321;stroke-miterlimit:10"
+         transform="matrix(2.25,0,0,2.25,1741.735,-62.051623)" />
+      <text
+         inkscape:transform-center-y="45.543285"
+         inkscape:transform-center-x="450.06672"
+         id="text82351"
+         font-size="4.3343"
+         style="font-size:9.75218px;font-family:ApexSans-Medium;fill:#ffffff"
+         x="411.10547"
+         y="668.39728"
+         clip-path="url(#clipPath61617)">M</text>
+      <path
+         id="path82361"
+         d="m -625.77,338.014 c 0,0.213 0.172,0.385 0.385,0.385 h 6.697 c 0.212,0 0.385,-0.172 0.385,-0.385 v -6.696 c 0,-0.213 -0.173,-0.385 -0.385,-0.385 h -6.697 c -0.213,0 -0.385,0.172 -0.385,0.385 z"
+         clip-path="url(#clipPath61613)"
+         inkscape:connector-curvature="0"
+         style="fill:#f15d57"
+         transform="matrix(2.25,0,0,2.25,1741.735,-62.051623)" />
+      <path
+         id="path82363"
+         d="m -625.77,338.014 c 0,0.213 0.172,0.385 0.385,0.385 h 6.697 c 0.212,0 0.385,-0.172 0.385,-0.385 v -6.696 c 0,-0.213 -0.173,-0.385 -0.385,-0.385 h -6.697 c -0.213,0 -0.385,0.172 -0.385,0.385 z"
+         stroke-miterlimit="10"
+         clip-path="url(#clipPath61609)"
+         inkscape:connector-curvature="0"
+         style="fill:none;stroke:#ffffff;stroke-width:0.321;stroke-miterlimit:10"
+         transform="matrix(2.25,0,0,2.25,1741.735,-62.051623)" />
+      <text
+         inkscape:transform-center-y="71.524915"
+         inkscape:transform-center-x="503.47899"
+         id="text82365"
+         font-size="4.3343"
+         style="font-size:9.75218px;font-family:ApexSans-Medium;fill:#ffffff"
+         x="337.69321"
+         y="694.37891"
+         clip-path="url(#clipPath61605)">M</text>
+      <rect
+         inkscape:transform-center-y="19.597191"
+         inkscape:transform-center-x="610.96881"
+         id="rect82381"
+         height="21.584251"
+         width="21.581999"
+         y="628.10437"
+         x="223.6218"
+         style="fill:#ffffff"
+         clip-path="url(#clipPath61601)" />
+      <rect
+         inkscape:transform-center-y="19.597191"
+         inkscape:transform-center-x="610.96881"
+         id="rect82383"
+         height="21.584251"
+         width="21.581999"
+         stroke-miterlimit="10"
+         y="628.10437"
+         x="223.6218"
+         style="fill:none;stroke:#81d0db;stroke-width:0.963;stroke-miterlimit:10"
+         clip-path="url(#clipPath61597)" />
+      <rect
+         inkscape:transform-center-y="19.598295"
+         inkscape:transform-center-x="610.97115"
+         id="rect82385"
+         height="18.553501"
+         width="18.557999"
+         y="629.62085"
+         x="225.13145"
+         style="fill:#81d0db"
+         clip-path="url(#clipPath61593)" />
+      <rect
+         inkscape:transform-center-y="19.597131"
+         inkscape:transform-center-x="610.96883"
+         id="rect82387"
+         height="15.594751"
+         width="15.592501"
+         y="631.09906"
+         x="226.61653"
+         style="fill:#ffffff"
+         clip-path="url(#clipPath61589)" />
+      <rect
+         inkscape:transform-center-y="19.595982"
+         inkscape:transform-center-x="610.97103"
+         id="rect82389"
+         height="10.278"
+         width="10.282501"
+         y="633.75629"
+         x="229.26932"
+         style="fill:#ffffff"
+         clip-path="url(#clipPath61585)" />
+      <rect
+         id="rect82404"
+         height="5.3839998"
+         width="5.3839998"
+         clip-path="url(#clipPath61581)"
+         y="308.841"
+         x="-672.61401"
+         style="fill:url(#SVGID_4557_)"
+         transform="matrix(2.25,0,0,2.25,1741.735,-62.051623)" />
+      <rect
+         transform="matrix(2.25,0,0,2.25,1741.735,-62.051623)"
+         style="fill:#ffffff"
+         x="-650.77399"
+         y="306.73599"
+         clip-path="url(#clipPath61577)"
+         width="9.592"
+         height="9.5930004"
+         id="rect82451" />
+      <rect
+         transform="matrix(2.25,0,0,2.25,1741.735,-62.051623)"
+         style="fill:none;stroke:#81d0db;stroke-width:0.428;stroke-miterlimit:10"
+         x="-650.77399"
+         y="306.73599"
+         clip-path="url(#clipPath61573)"
+         stroke-miterlimit="10"
+         width="9.592"
+         height="9.5930004"
+         id="rect82453" />
+      <rect
+         transform="matrix(2.25,0,0,2.25,1741.735,-62.051623)"
+         style="fill:#81d0db"
+         x="-650.10303"
+         y="307.41"
+         clip-path="url(#clipPath61569)"
+         width="8.2480001"
+         height="8.2460003"
+         id="rect82455" />
+      <rect
+         transform="matrix(2.25,0,0,2.25,1741.735,-62.051623)"
+         style="fill:#ffffff"
+         x="-649.44299"
+         y="308.06699"
+         clip-path="url(#clipPath61565)"
+         width="6.9299998"
+         height="6.9310002"
+         id="rect82457" />
+      <rect
+         transform="matrix(2.25,0,0,2.25,1741.735,-62.051623)"
+         style="fill:#ffffff"
+         x="-648.26398"
+         y="309.24799"
+         clip-path="url(#clipPath61561)"
+         width="4.5700002"
+         height="4.5679998"
+         id="rect82459" />
+      <rect
+         id="rect82474"
+         height="5.3839998"
+         width="5.3839998"
+         clip-path="url(#clipPath61557)"
+         y="308.841"
+         x="-648.67102"
+         style="fill:url(#SVGID_4567_)"
+         transform="matrix(2.25,0,0,2.25,1741.735,-62.051623)" />
+      <path
+         transform="matrix(2.25,0,0,2.25,1741.735,-62.051623)"
+         style="fill:#ffffff"
+         inkscape:connector-curvature="0"
+         clip-path="url(#clipPath61553)"
+         d="m -646.611,311.532 c 0,-0.349 0.283,-0.631 0.632,-0.631 0.351,0 0.634,0.282 0.634,0.631 0,0.35 -0.283,0.633 -0.634,0.633 -0.349,0 -0.632,-0.283 -0.632,-0.633"
+         id="path82484" />
+      <rect
+         transform="matrix(2.25,0,0,2.25,1741.735,-62.051623)"
+         style="fill:#ffffff"
+         x="-638.80298"
+         y="306.73599"
+         clip-path="url(#clipPath61549)"
+         width="9.592"
+         height="9.5930004"
+         id="rect82486" />
+      <rect
+         transform="matrix(2.25,0,0,2.25,1741.735,-62.051623)"
+         style="fill:none;stroke:#81d0db;stroke-width:0.428;stroke-miterlimit:10"
+         x="-638.80298"
+         y="306.73599"
+         clip-path="url(#clipPath61545)"
+         stroke-miterlimit="10"
+         width="9.592"
+         height="9.5930004"
+         id="rect82488" />
+      <rect
+         transform="matrix(2.25,0,0,2.25,1741.735,-62.051623)"
+         style="fill:#81d0db"
+         x="-638.13202"
+         y="307.41"
+         clip-path="url(#clipPath61541)"
+         width="8.2480001"
+         height="8.2460003"
+         id="rect82490" />
+      <rect
+         transform="matrix(2.25,0,0,2.25,1741.735,-62.051623)"
+         style="fill:#ffffff"
+         x="-637.47198"
+         y="308.06699"
+         clip-path="url(#clipPath61537)"
+         width="6.9299998"
+         height="6.9310002"
+         id="rect82492" />
+      <rect
+         transform="matrix(2.25,0,0,2.25,1741.735,-62.051623)"
+         style="fill:#ffffff"
+         x="-636.29199"
+         y="309.24799"
+         clip-path="url(#clipPath61533)"
+         width="4.5700002"
+         height="4.5679998"
+         id="rect82494" />
+      <rect
+         id="rect82509"
+         height="5.3839998"
+         width="5.3839998"
+         clip-path="url(#clipPath61529)"
+         y="308.841"
+         x="-636.69897"
+         style="fill:url(#SVGID_4572_)"
+         transform="matrix(2.25,0,0,2.25,1741.735,-62.051623)" />
+      <path
+         id="path82519"
+         d="m -634.639,311.532 c 0,-0.349 0.283,-0.631 0.632,-0.631 0.351,0 0.634,0.282 0.634,0.631 0,0.35 -0.283,0.633 -0.634,0.633 -0.349,0 -0.632,-0.283 -0.632,-0.633"
+         clip-path="url(#clipPath61525)"
+         inkscape:connector-curvature="0"
+         style="fill:#ffffff"
+         transform="matrix(2.25,0,0,2.25,1741.735,-62.051623)" />
+      <rect
+         id="rect82521"
+         height="9.5930004"
+         width="9.592"
+         clip-path="url(#clipPath61521)"
+         y="306.73599"
+         x="-626.83099"
+         style="fill:#ffffff"
+         transform="matrix(2.25,0,0,2.25,1741.735,-62.051623)" />
+      <rect
+         id="rect82523"
+         height="9.5930004"
+         width="9.592"
+         stroke-miterlimit="10"
+         clip-path="url(#clipPath61517)"
+         y="306.73599"
+         x="-626.83099"
+         style="fill:none;stroke:#81d0db;stroke-width:0.428;stroke-miterlimit:10"
+         transform="matrix(2.25,0,0,2.25,1741.735,-62.051623)" />
+      <rect
+         id="rect82525"
+         height="8.2460003"
+         width="8.2480001"
+         clip-path="url(#clipPath61513)"
+         y="307.41"
+         x="-626.15997"
+         style="fill:#81d0db"
+         transform="matrix(2.25,0,0,2.25,1741.735,-62.051623)" />
+      <rect
+         id="rect82527"
+         height="6.9310002"
+         width="6.9299998"
+         clip-path="url(#clipPath61509)"
+         y="308.06699"
+         x="-625.5"
+         style="fill:#ffffff"
+         transform="matrix(2.25,0,0,2.25,1741.735,-62.051623)" />
+      <rect
+         id="rect82529"
+         height="4.5679998"
+         width="4.5700002"
+         clip-path="url(#clipPath61505)"
+         y="309.24799"
+         x="-624.32098"
+         style="fill:#ffffff"
+         transform="matrix(2.25,0,0,2.25,1741.735,-62.051623)" />
+      <rect
+         id="rect82544"
+         height="5.3839998"
+         width="5.3839998"
+         clip-path="url(#clipPath61501)"
+         y="308.841"
+         x="-624.72803"
+         style="fill:url(#SVGID_4577_)"
+         transform="matrix(2.25,0,0,2.25,1741.735,-62.051623)" />
+      <path
+         id="path82554"
+         d="m -622.668,311.532 c 0,-0.349 0.283,-0.631 0.632,-0.631 0.351,0 0.634,0.282 0.634,0.631 0,0.35 -0.283,0.633 -0.634,0.633 -0.349,0 -0.632,-0.283 -0.632,-0.633"
+         clip-path="url(#clipPath61497)"
+         inkscape:connector-curvature="0"
+         style="fill:#ffffff"
+         transform="matrix(2.25,0,0,2.25,1741.735,-62.051623)" />
+      <rect
+         id="rect82556"
+         height="9.5930004"
+         width="9.5930004"
+         clip-path="url(#clipPath61493)"
+         y="306.73599"
+         x="-614.85999"
+         style="fill:#ffffff"
+         transform="matrix(2.25,0,0,2.25,1741.735,-62.051623)" />
+      <rect
+         id="rect82558"
+         height="9.5930004"
+         width="9.5930004"
+         stroke-miterlimit="10"
+         clip-path="url(#clipPath61489)"
+         y="306.73599"
+         x="-614.86102"
+         style="fill:none;stroke:#81d0db;stroke-width:0.428;stroke-miterlimit:10"
+         transform="matrix(2.25,0,0,2.25,1741.735,-62.051623)" />
+      <rect
+         id="rect82560"
+         height="8.2460003"
+         width="8.2480001"
+         clip-path="url(#clipPath61485)"
+         y="307.41"
+         x="-614.18799"
+         style="fill:#81d0db"
+         transform="matrix(2.25,0,0,2.25,1741.735,-62.051623)" />
+      <rect
+         id="rect82562"
+         height="6.9310002"
+         width="6.9310002"
+         clip-path="url(#clipPath61481)"
+         y="308.06699"
+         x="-613.52899"
+         style="fill:#ffffff"
+         transform="matrix(2.25,0,0,2.25,1741.735,-62.051623)" />
+      <rect
+         id="rect82564"
+         height="4.5679998"
+         width="4.5700002"
+         clip-path="url(#clipPath61477)"
+         y="309.24799"
+         x="-612.349"
+         style="fill:#ffffff"
+         transform="matrix(2.25,0,0,2.25,1741.735,-62.051623)" />
+      <rect
+         id="rect82579"
+         height="5.3839998"
+         width="5.3829999"
+         clip-path="url(#clipPath61473)"
+         y="308.841"
+         x="-612.75598"
+         style="fill:url(#SVGID_4582_)"
+         transform="matrix(2.25,0,0,2.25,1741.735,-62.051623)" />
+      <path
+         id="path82589"
+         d="m -610.696,311.532 c 0,-0.349 0.283,-0.631 0.632,-0.631 0.351,0 0.634,0.282 0.634,0.631 0,0.35 -0.283,0.633 -0.634,0.633 -0.349,0 -0.632,-0.283 -0.632,-0.633"
+         clip-path="url(#clipPath61469)"
+         inkscape:connector-curvature="0"
+         style="fill:#ffffff"
+         transform="matrix(2.25,0,0,2.25,1741.735,-62.051623)" />
+      <rect
+         id="rect82591"
+         height="9.5930004"
+         width="9.592"
+         clip-path="url(#clipPath61465)"
+         y="306.73599"
+         x="-602.888"
+         style="fill:#ffffff"
+         transform="matrix(2.25,0,0,2.25,1741.735,-62.051623)" />
+      <rect
+         id="rect82593"
+         height="9.5930004"
+         width="9.592"
+         stroke-miterlimit="10"
+         clip-path="url(#clipPath61461)"
+         y="306.73599"
+         x="-602.888"
+         style="fill:none;stroke:#81d0db;stroke-width:0.428;stroke-miterlimit:10"
+         transform="matrix(2.25,0,0,2.25,1741.735,-62.051623)" />
+      <rect
+         id="rect82595"
+         height="8.2460003"
+         width="8.2480001"
+         clip-path="url(#clipPath61457)"
+         y="307.41"
+         x="-602.21698"
+         style="fill:#81d0db"
+         transform="matrix(2.25,0,0,2.25,1741.735,-62.051623)" />
+      <rect
+         id="rect82597"
+         height="6.9310002"
+         width="6.9299998"
+         clip-path="url(#clipPath61453)"
+         y="308.06699"
+         x="-601.55701"
+         style="fill:#ffffff"
+         transform="matrix(2.25,0,0,2.25,1741.735,-62.051623)" />
+      <rect
+         id="rect82599"
+         height="4.5679998"
+         width="4.5700002"
+         clip-path="url(#clipPath61449)"
+         y="309.24799"
+         x="-600.37799"
+         style="fill:#ffffff"
+         transform="matrix(2.25,0,0,2.25,1741.735,-62.051623)" />
+      <rect
+         id="rect82614"
+         height="5.3839998"
+         width="5.3829999"
+         clip-path="url(#clipPath61445)"
+         y="308.841"
+         x="-600.78497"
+         style="fill:url(#SVGID_4587_)"
+         transform="matrix(2.25,0,0,2.25,1741.735,-62.051623)" />
+      <path
+         id="path82624"
+         d="m -598.725,311.532 c 0,-0.349 0.283,-0.631 0.632,-0.631 0.351,0 0.634,0.282 0.634,0.631 0,0.35 -0.283,0.633 -0.634,0.633 -0.349,0 -0.632,-0.283 -0.632,-0.633"
+         clip-path="url(#clipPath61441)"
+         inkscape:connector-curvature="0"
+         style="fill:#ffffff"
+         transform="matrix(2.25,0,0,2.25,1741.735,-62.051623)" />
+      <rect
+         id="rect82626"
+         height="9.5930004"
+         width="9.592"
+         clip-path="url(#clipPath61437)"
+         y="306.73599"
+         x="-590.91699"
+         style="fill:#ffffff"
+         transform="matrix(2.25,0,0,2.25,1741.735,-62.051623)" />
+      <rect
+         id="rect82628"
+         height="9.5930004"
+         width="9.592"
+         stroke-miterlimit="10"
+         clip-path="url(#clipPath61433)"
+         y="306.73599"
+         x="-590.91699"
+         style="fill:none;stroke:#81d0db;stroke-width:0.428;stroke-miterlimit:10"
+         transform="matrix(2.25,0,0,2.25,1741.735,-62.051623)" />
+      <rect
+         id="rect82630"
+         height="8.2460003"
+         width="8.2480001"
+         clip-path="url(#clipPath61429)"
+         y="307.41"
+         x="-590.24597"
+         style="fill:#81d0db"
+         transform="matrix(2.25,0,0,2.25,1741.735,-62.051623)" />
+      <rect
+         id="rect82632"
+         height="6.9310002"
+         width="6.9299998"
+         clip-path="url(#clipPath61425)"
+         y="308.06699"
+         x="-589.586"
+         style="fill:#ffffff"
+         transform="matrix(2.25,0,0,2.25,1741.735,-62.051623)" />
+      <rect
+         id="rect82634"
+         height="4.5679998"
+         width="4.5700002"
+         clip-path="url(#clipPath61421)"
+         y="309.24799"
+         x="-588.40698"
+         style="fill:#ffffff"
+         transform="matrix(2.25,0,0,2.25,1741.735,-62.051623)" />
+      <rect
+         id="rect82649"
+         height="5.3839998"
+         width="5.3829999"
+         clip-path="url(#clipPath61417)"
+         y="308.841"
+         x="-588.81299"
+         style="fill:url(#SVGID_4592_)"
+         transform="matrix(2.25,0,0,2.25,1741.735,-62.051623)" />
+      <rect
+         id="rect82871"
+         height="9.5930004"
+         width="9.592"
+         clip-path="url(#clipPath61413)"
+         y="318.323"
+         x="-674.71698"
+         style="fill:#ffffff"
+         transform="matrix(2.25,0,0,2.25,1741.735,-62.051623)" />
+      <rect
+         id="rect82873"
+         height="9.5930004"
+         width="9.592"
+         stroke-miterlimit="10"
+         clip-path="url(#clipPath61409)"
+         y="318.323"
+         x="-674.71698"
+         style="fill:none;stroke:#81d0db;stroke-width:0.428;stroke-miterlimit:10"
+         transform="matrix(2.25,0,0,2.25,1741.735,-62.051623)" />
+      <rect
+         id="rect82875"
+         height="8.2460003"
+         width="8.2480001"
+         clip-path="url(#clipPath61405)"
+         y="318.99701"
+         x="-674.04602"
+         style="fill:#81d0db"
+         transform="matrix(2.25,0,0,2.25,1741.735,-62.051623)" />
+      <rect
+         id="rect82877"
+         height="6.9310002"
+         width="6.9299998"
+         clip-path="url(#clipPath61401)"
+         y="319.65399"
+         x="-673.38599"
+         style="fill:#ffffff"
+         transform="matrix(2.25,0,0,2.25,1741.735,-62.051623)" />
+      <rect
+         id="rect82879"
+         height="4.5679998"
+         width="4.5700002"
+         clip-path="url(#clipPath61397)"
+         y="320.83499"
+         x="-672.20697"
+         style="fill:#ffffff"
+         transform="matrix(2.25,0,0,2.25,1741.735,-62.051623)" />
+      <rect
+         id="rect82894"
+         height="5.3839998"
+         width="5.3839998"
+         clip-path="url(#clipPath61393)"
+         y="320.42899"
+         x="-672.61401"
+         style="fill:url(#SVGID_4627_)"
+         transform="matrix(2.25,0,0,2.25,1741.735,-62.051623)" />
+      <path
+         id="path82904"
+         d="m -670.553,323.119 c 0,-0.349 0.283,-0.631 0.632,-0.631 0.351,0 0.634,0.282 0.634,0.631 0,0.35 -0.283,0.633 -0.634,0.633 -0.349,0 -0.632,-0.283 -0.632,-0.633"
+         clip-path="url(#clipPath61389)"
+         inkscape:connector-curvature="0"
+         style="fill:#ffffff"
+         transform="matrix(2.25,0,0,2.25,1741.735,-62.051623)" />
+      <rect
+         id="rect82906"
+         height="9.5930004"
+         width="9.592"
+         clip-path="url(#clipPath61385)"
+         y="318.323"
+         x="-662.745"
+         style="fill:#ffffff"
+         transform="matrix(2.25,0,0,2.25,1741.735,-62.051623)" />
+      <rect
+         id="rect82908"
+         height="9.5930004"
+         width="9.592"
+         stroke-miterlimit="10"
+         clip-path="url(#clipPath61381)"
+         y="318.323"
+         x="-662.74597"
+         style="fill:none;stroke:#81d0db;stroke-width:0.428;stroke-miterlimit:10"
+         transform="matrix(2.25,0,0,2.25,1741.735,-62.051623)" />
+      <rect
+         id="rect82910"
+         height="8.2460003"
+         width="8.2480001"
+         clip-path="url(#clipPath61377)"
+         y="318.99701"
+         x="-662.07397"
+         style="fill:#81d0db"
+         transform="matrix(2.25,0,0,2.25,1741.735,-62.051623)" />
+      <rect
+         id="rect82912"
+         height="6.9310002"
+         width="6.9299998"
+         clip-path="url(#clipPath61373)"
+         y="319.65399"
+         x="-661.414"
+         style="fill:#ffffff"
+         transform="matrix(2.25,0,0,2.25,1741.735,-62.051623)" />
+      <rect
+         id="rect82914"
+         height="4.5679998"
+         width="4.5700002"
+         clip-path="url(#clipPath61369)"
+         y="320.83499"
+         x="-660.23499"
+         style="fill:#ffffff"
+         transform="matrix(2.25,0,0,2.25,1741.735,-62.051623)" />
+      <rect
+         id="rect82929"
+         height="5.3839998"
+         width="5.3839998"
+         clip-path="url(#clipPath61365)"
+         y="320.42899"
+         x="-660.64203"
+         style="fill:url(#SVGID_4632_)"
+         transform="matrix(2.25,0,0,2.25,1741.735,-62.051623)" />
+      <path
+         id="path82939"
+         d="m -658.582,323.119 c 0,-0.349 0.283,-0.631 0.632,-0.631 0.351,0 0.634,0.282 0.634,0.631 0,0.35 -0.283,0.633 -0.634,0.633 -0.349,0 -0.632,-0.283 -0.632,-0.633"
+         clip-path="url(#clipPath61361)"
+         inkscape:connector-curvature="0"
+         style="fill:#ffffff"
+         transform="matrix(2.25,0,0,2.25,1741.735,-62.051623)" />
+      <rect
+         id="rect82941"
+         height="9.5930004"
+         width="9.592"
+         clip-path="url(#clipPath61357)"
+         y="318.323"
+         x="-650.77399"
+         style="fill:#ffffff"
+         transform="matrix(2.25,0,0,2.25,1741.735,-62.051623)" />
+      <rect
+         id="rect82943"
+         height="9.5930004"
+         width="9.592"
+         stroke-miterlimit="10"
+         clip-path="url(#clipPath61353)"
+         y="318.323"
+         x="-650.77399"
+         style="fill:none;stroke:#81d0db;stroke-width:0.428;stroke-miterlimit:10"
+         transform="matrix(2.25,0,0,2.25,1741.735,-62.051623)" />
+      <rect
+         id="rect82945"
+         height="8.2460003"
+         width="8.2480001"
+         clip-path="url(#clipPath61349)"
+         y="318.99701"
+         x="-650.10303"
+         style="fill:#81d0db"
+         transform="matrix(2.25,0,0,2.25,1741.735,-62.051623)" />
+      <rect
+         id="rect82947"
+         height="6.9310002"
+         width="6.9299998"
+         clip-path="url(#clipPath61345)"
+         y="319.65399"
+         x="-649.44299"
+         style="fill:#ffffff"
+         transform="matrix(2.25,0,0,2.25,1741.735,-62.051623)" />
+      <rect
+         id="rect82949"
+         height="4.5679998"
+         width="4.5700002"
+         clip-path="url(#clipPath61341)"
+         y="320.83499"
+         x="-648.26398"
+         style="fill:#ffffff"
+         transform="matrix(2.25,0,0,2.25,1741.735,-62.051623)" />
+      <rect
+         id="rect82964"
+         height="5.3839998"
+         width="5.3839998"
+         clip-path="url(#clipPath61337)"
+         y="320.42899"
+         x="-648.67102"
+         style="fill:url(#SVGID_4637_)"
+         transform="matrix(2.25,0,0,2.25,1741.735,-62.051623)" />
+      <path
+         id="path82974"
+         d="m -646.611,323.119 c 0,-0.349 0.283,-0.631 0.632,-0.631 0.351,0 0.634,0.282 0.634,0.631 0,0.35 -0.283,0.633 -0.634,0.633 -0.349,0 -0.632,-0.283 -0.632,-0.633"
+         clip-path="url(#clipPath61333)"
+         inkscape:connector-curvature="0"
+         style="fill:#ffffff"
+         transform="matrix(2.25,0,0,2.25,1741.735,-62.051623)" />
+      <rect
+         id="rect82976"
+         height="9.5930004"
+         width="9.592"
+         clip-path="url(#clipPath61329)"
+         y="318.323"
+         x="-638.80298"
+         style="fill:#ffffff"
+         transform="matrix(2.25,0,0,2.25,1741.735,-62.051623)" />
+      <rect
+         id="rect82978"
+         height="9.5930004"
+         width="9.592"
+         stroke-miterlimit="10"
+         clip-path="url(#clipPath61325)"
+         y="318.323"
+         x="-638.80298"
+         style="fill:none;stroke:#81d0db;stroke-width:0.428;stroke-miterlimit:10"
+         transform="matrix(2.25,0,0,2.25,1741.735,-62.051623)" />
+      <rect
+         id="rect82980"
+         height="8.2460003"
+         width="8.2480001"
+         clip-path="url(#clipPath61321)"
+         y="318.99701"
+         x="-638.13202"
+         style="fill:#81d0db"
+         transform="matrix(2.25,0,0,2.25,1741.735,-62.051623)" />
+      <rect
+         id="rect82982"
+         height="6.9310002"
+         width="6.9299998"
+         clip-path="url(#clipPath61317)"
+         y="319.65399"
+         x="-637.47198"
+         style="fill:#ffffff"
+         transform="matrix(2.25,0,0,2.25,1741.735,-62.051623)" />
+      <rect
+         id="rect82984"
+         height="4.5679998"
+         width="4.5700002"
+         clip-path="url(#clipPath61313)"
+         y="320.83499"
+         x="-636.29199"
+         style="fill:#ffffff"
+         transform="matrix(2.25,0,0,2.25,1741.735,-62.051623)" />
+      <rect
+         id="rect82999"
+         height="5.3839998"
+         width="5.3839998"
+         clip-path="url(#clipPath61309)"
+         y="320.42899"
+         x="-636.69897"
+         style="fill:url(#SVGID_4642_)"
+         transform="matrix(2.25,0,0,2.25,1741.735,-62.051623)" />
+      <path
+         id="path83009"
+         d="m -634.639,323.119 c 0,-0.349 0.283,-0.631 0.632,-0.631 0.351,0 0.634,0.282 0.634,0.631 0,0.35 -0.283,0.633 -0.634,0.633 -0.349,0 -0.632,-0.283 -0.632,-0.633"
+         clip-path="url(#clipPath61305)"
+         inkscape:connector-curvature="0"
+         style="fill:#ffffff"
+         transform="matrix(2.25,0,0,2.25,1741.735,-62.051623)" />
+      <rect
+         id="rect83011"
+         height="9.5930004"
+         width="9.592"
+         clip-path="url(#clipPath61301)"
+         y="318.323"
+         x="-626.83099"
+         style="fill:#ffffff"
+         transform="matrix(2.25,0,0,2.25,1741.735,-62.051623)" />
+      <rect
+         id="rect83013"
+         height="9.5930004"
+         width="9.592"
+         stroke-miterlimit="10"
+         clip-path="url(#clipPath61297)"
+         y="318.323"
+         x="-626.83099"
+         style="fill:none;stroke:#81d0db;stroke-width:0.428;stroke-miterlimit:10"
+         transform="matrix(2.25,0,0,2.25,1741.735,-62.051623)" />
+      <rect
+         id="rect83015"
+         height="8.2460003"
+         width="8.2480001"
+         clip-path="url(#clipPath61293)"
+         y="318.99701"
+         x="-626.15997"
+         style="fill:#81d0db"
+         transform="matrix(2.25,0,0,2.25,1741.735,-62.051623)" />
+      <rect
+         id="rect83017"
+         height="6.9310002"
+         width="6.9299998"
+         clip-path="url(#clipPath61289)"
+         y="319.65399"
+         x="-625.5"
+         style="fill:#ffffff"
+         transform="matrix(2.25,0,0,2.25,1741.735,-62.051623)" />
+      <rect
+         id="rect83019"
+         height="4.5679998"
+         width="4.5700002"
+         clip-path="url(#clipPath61285)"
+         y="320.83499"
+         x="-624.32098"
+         style="fill:#ffffff"
+         transform="matrix(2.25,0,0,2.25,1741.735,-62.051623)" />
+      <rect
+         id="rect83034"
+         height="5.3839998"
+         width="5.3839998"
+         clip-path="url(#clipPath61281)"
+         y="320.42899"
+         x="-624.72803"
+         style="fill:url(#SVGID_4647_)"
+         transform="matrix(2.25,0,0,2.25,1741.735,-62.051623)" />
+      <path
+         id="path83044"
+         d="m -622.668,323.119 c 0,-0.349 0.283,-0.631 0.632,-0.631 0.351,0 0.634,0.282 0.634,0.631 0,0.35 -0.283,0.633 -0.634,0.633 -0.349,0 -0.632,-0.283 -0.632,-0.633"
+         clip-path="url(#clipPath61277)"
+         inkscape:connector-curvature="0"
+         style="fill:#ffffff"
+         transform="matrix(2.25,0,0,2.25,1741.735,-62.051623)" />
+      <rect
+         id="rect83046"
+         height="9.5930004"
+         width="9.5930004"
+         clip-path="url(#clipPath61273)"
+         y="318.323"
+         x="-614.85999"
+         style="fill:#ffffff"
+         transform="matrix(2.25,0,0,2.25,1741.735,-62.051623)" />
+      <rect
+         id="rect83048"
+         height="9.5930004"
+         width="9.5930004"
+         stroke-miterlimit="10"
+         clip-path="url(#clipPath61269)"
+         y="318.323"
+         x="-614.86102"
+         style="fill:none;stroke:#81d0db;stroke-width:0.428;stroke-miterlimit:10"
+         transform="matrix(2.25,0,0,2.25,1741.735,-62.051623)" />
+      <rect
+         id="rect83050"
+         height="8.2460003"
+         width="8.2480001"
+         clip-path="url(#clipPath61265)"
+         y="318.99701"
+         x="-614.18799"
+         style="fill:#81d0db"
+         transform="matrix(2.25,0,0,2.25,1741.735,-62.051623)" />
+      <rect
+         id="rect83052"
+         height="6.9310002"
+         width="6.9310002"
+         clip-path="url(#clipPath61261)"
+         y="319.65399"
+         x="-613.52899"
+         style="fill:#ffffff"
+         transform="matrix(2.25,0,0,2.25,1741.735,-62.051623)" />
+      <rect
+         id="rect83054"
+         height="4.5679998"
+         width="4.5700002"
+         clip-path="url(#clipPath61257)"
+         y="320.83499"
+         x="-612.349"
+         style="fill:#ffffff"
+         transform="matrix(2.25,0,0,2.25,1741.735,-62.051623)" />
+      <rect
+         id="rect83069"
+         height="5.3839998"
+         width="5.3829999"
+         clip-path="url(#clipPath61253)"
+         y="320.42899"
+         x="-612.75598"
+         style="fill:url(#SVGID_4652_)"
+         transform="matrix(2.25,0,0,2.25,1741.735,-62.051623)" />
+      <path
+         id="path83079"
+         d="m -610.696,323.119 c 0,-0.349 0.283,-0.631 0.632,-0.631 0.351,0 0.634,0.282 0.634,0.631 0,0.35 -0.283,0.633 -0.634,0.633 -0.349,0 -0.632,-0.283 -0.632,-0.633"
+         clip-path="url(#clipPath61249)"
+         inkscape:connector-curvature="0"
+         style="fill:#ffffff"
+         transform="matrix(2.25,0,0,2.25,1741.735,-62.051623)" />
+      <rect
+         id="rect83081"
+         height="9.5930004"
+         width="9.592"
+         clip-path="url(#clipPath61245)"
+         y="318.323"
+         x="-590.91699"
+         style="fill:#ffffff"
+         transform="matrix(2.25,0,0,2.25,1741.735,-62.051623)" />
+      <rect
+         id="rect83083"
+         height="9.5930004"
+         width="9.592"
+         stroke-miterlimit="10"
+         clip-path="url(#clipPath61241)"
+         y="318.323"
+         x="-590.91699"
+         style="fill:none;stroke:#81d0db;stroke-width:0.428;stroke-miterlimit:10"
+         transform="matrix(2.25,0,0,2.25,1741.735,-62.051623)" />
+      <rect
+         id="rect83085"
+         height="8.2460003"
+         width="8.2480001"
+         clip-path="url(#clipPath61237)"
+         y="318.99701"
+         x="-590.24597"
+         style="fill:#81d0db"
+         transform="matrix(2.25,0,0,2.25,1741.735,-62.051623)" />
+      <rect
+         id="rect83087"
+         height="6.9310002"
+         width="6.9299998"
+         clip-path="url(#clipPath61233)"
+         y="319.65399"
+         x="-589.586"
+         style="fill:#ffffff"
+         transform="matrix(2.25,0,0,2.25,1741.735,-62.051623)" />
+      <rect
+         id="rect83089"
+         height="4.5679998"
+         width="4.5700002"
+         clip-path="url(#clipPath61229)"
+         y="320.83499"
+         x="-588.40698"
+         style="fill:#ffffff"
+         transform="matrix(2.25,0,0,2.25,1741.735,-62.051623)" />
+      <rect
+         id="rect83104"
+         height="5.3839998"
+         width="5.3829999"
+         clip-path="url(#clipPath61225)"
+         y="320.42899"
+         x="-588.81299"
+         style="fill:url(#SVGID_4657_)"
+         transform="matrix(2.25,0,0,2.25,1741.735,-62.051623)" />
+      <rect
+         id="rect83326"
+         height="9.592"
+         width="9.592"
+         clip-path="url(#clipPath61221)"
+         y="329.87"
+         x="-674.71698"
+         style="fill:#ffffff"
+         transform="matrix(2.25,0,0,2.25,1741.735,-62.051623)" />
+      <rect
+         id="rect83328"
+         height="9.592"
+         width="9.592"
+         stroke-miterlimit="10"
+         clip-path="url(#clipPath61217)"
+         y="329.87"
+         x="-674.71698"
+         style="fill:none;stroke:#81d0db;stroke-width:0.428;stroke-miterlimit:10"
+         transform="matrix(2.25,0,0,2.25,1741.735,-62.051623)" />
+      <rect
+         id="rect83330"
+         height="8.2469997"
+         width="8.2480001"
+         clip-path="url(#clipPath61213)"
+         y="330.543"
+         x="-674.04602"
+         style="fill:#81d0db"
+         transform="matrix(2.25,0,0,2.25,1741.735,-62.051623)" />
+      <rect
+         id="rect83332"
+         height="6.9299998"
+         width="6.9299998"
+         clip-path="url(#clipPath61209)"
+         y="331.20099"
+         x="-673.38599"
+         style="fill:#ffffff"
+         transform="matrix(2.25,0,0,2.25,1741.735,-62.051623)" />
+      <rect
+         id="rect83334"
+         height="4.5679998"
+         width="4.5700002"
+         clip-path="url(#clipPath61205)"
+         y="332.38199"
+         x="-672.20697"
+         style="fill:#ffffff"
+         transform="matrix(2.25,0,0,2.25,1741.735,-62.051623)" />
+      <rect
+         id="rect83349"
+         height="5.3860002"
+         width="5.3839998"
+         clip-path="url(#clipPath61201)"
+         y="331.974"
+         x="-672.61401"
+         style="fill:url(#SVGID_4692_)"
+         transform="matrix(2.25,0,0,2.25,1741.735,-62.051623)" />
+      <path
+         id="path83359"
+         d="m -670.553,334.666 c 0,-0.349 0.283,-0.632 0.632,-0.632 0.351,0 0.634,0.283 0.634,0.632 0,0.35 -0.283,0.633 -0.634,0.633 -0.349,0 -0.632,-0.283 -0.632,-0.633"
+         clip-path="url(#clipPath61197)"
+         inkscape:connector-curvature="0"
+         style="fill:#ffffff"
+         transform="matrix(2.25,0,0,2.25,1741.735,-62.051623)" />
+      <rect
+         id="rect83361"
+         height="9.592"
+         width="9.592"
+         clip-path="url(#clipPath61193)"
+         y="329.87"
+         x="-662.745"
+         style="fill:#ffffff"
+         transform="matrix(2.25,0,0,2.25,1741.735,-62.051623)" />
+      <rect
+         id="rect83363"
+         height="9.592"
+         width="9.592"
+         stroke-miterlimit="10"
+         clip-path="url(#clipPath61189)"
+         y="329.87"
+         x="-662.74597"
+         style="fill:none;stroke:#81d0db;stroke-width:0.428;stroke-miterlimit:10"
+         transform="matrix(2.25,0,0,2.25,1741.735,-62.051623)" />
+      <rect
+         id="rect83365"
+         height="8.2469997"
+         width="8.2480001"
+         clip-path="url(#clipPath61185)"
+         y="330.543"
+         x="-662.07397"
+         style="fill:#81d0db"
+         transform="matrix(2.25,0,0,2.25,1741.735,-62.051623)" />
+      <rect
+         id="rect83367"
+         height="6.9299998"
+         width="6.9299998"
+         clip-path="url(#clipPath61181)"
+         y="331.20099"
+         x="-661.414"
+         style="fill:#ffffff"
+         transform="matrix(2.25,0,0,2.25,1741.735,-62.051623)" />
+      <rect
+         id="rect83369"
+         height="4.5679998"
+         width="4.5700002"
+         clip-path="url(#clipPath61177)"
+         y="332.38199"
+         x="-660.23499"
+         style="fill:#ffffff"
+         transform="matrix(2.25,0,0,2.25,1741.735,-62.051623)" />
+      <rect
+         id="rect83384"
+         height="5.3850002"
+         width="5.3839998"
+         clip-path="url(#clipPath61173)"
+         y="331.974"
+         x="-660.64203"
+         style="fill:url(#SVGID_4697_)"
+         transform="matrix(2.25,0,0,2.25,1741.735,-62.051623)" />
+      <path
+         id="path83394"
+         d="m -658.582,334.666 c 0,-0.349 0.283,-0.632 0.632,-0.632 0.351,0 0.634,0.283 0.634,0.632 0,0.35 -0.283,0.633 -0.634,0.633 -0.349,0 -0.632,-0.283 -0.632,-0.633"
+         clip-path="url(#clipPath61169)"
+         inkscape:connector-curvature="0"
+         style="fill:#ffffff"
+         transform="matrix(2.25,0,0,2.25,1741.735,-62.051623)" />
+      <rect
+         id="rect83396"
+         height="9.592"
+         width="9.592"
+         clip-path="url(#clipPath61165)"
+         y="329.87"
+         x="-650.77399"
+         style="fill:#ffffff"
+         transform="matrix(2.25,0,0,2.25,1741.735,-62.051623)" />
+      <rect
+         id="rect83398"
+         height="9.592"
+         width="9.592"
+         stroke-miterlimit="10"
+         clip-path="url(#clipPath61161)"
+         y="329.87"
+         x="-650.77399"
+         style="fill:none;stroke:#81d0db;stroke-width:0.428;stroke-miterlimit:10"
+         transform="matrix(2.25,0,0,2.25,1741.735,-62.051623)" />
+      <rect
+         id="rect83400"
+         height="8.2469997"
+         width="8.2480001"
+         clip-path="url(#clipPath61157)"
+         y="330.543"
+         x="-650.10303"
+         style="fill:#81d0db"
+         transform="matrix(2.25,0,0,2.25,1741.735,-62.051623)" />
+      <rect
+         id="rect83402"
+         height="6.9299998"
+         width="6.9299998"
+         clip-path="url(#clipPath61153)"
+         y="331.20099"
+         x="-649.44299"
+         style="fill:#ffffff"
+         transform="matrix(2.25,0,0,2.25,1741.735,-62.051623)" />
+      <rect
+         id="rect83404"
+         height="4.5679998"
+         width="4.5700002"
+         clip-path="url(#clipPath61149)"
+         y="332.38199"
+         x="-648.26398"
+         style="fill:#ffffff"
+         transform="matrix(2.25,0,0,2.25,1741.735,-62.051623)" />
+      <rect
+         id="rect83419"
+         height="5.3860002"
+         width="5.3839998"
+         clip-path="url(#clipPath61145)"
+         y="331.974"
+         x="-648.67102"
+         style="fill:url(#SVGID_4702_)"
+         transform="matrix(2.25,0,0,2.25,1741.735,-62.051623)" />
+      <path
+         id="path83429"
+         d="m -646.611,334.666 c 0,-0.349 0.283,-0.632 0.632,-0.632 0.351,0 0.634,0.283 0.634,0.632 0,0.35 -0.283,0.633 -0.634,0.633 -0.349,0 -0.632,-0.283 -0.632,-0.633"
+         clip-path="url(#clipPath61141)"
+         inkscape:connector-curvature="0"
+         style="fill:#ffffff"
+         transform="matrix(2.25,0,0,2.25,1741.735,-62.051623)" />
+      <rect
+         id="rect83431"
+         height="9.592"
+         width="9.592"
+         clip-path="url(#clipPath61137)"
+         y="329.87"
+         x="-638.80298"
+         style="fill:#ffffff"
+         transform="matrix(2.25,0,0,2.25,1741.735,-62.051623)" />
+      <rect
+         id="rect83433"
+         height="9.592"
+         width="9.592"
+         stroke-miterlimit="10"
+         clip-path="url(#clipPath61133)"
+         y="329.87"
+         x="-638.80298"
+         style="fill:none;stroke:#81d0db;stroke-width:0.428;stroke-miterlimit:10"
+         transform="matrix(2.25,0,0,2.25,1741.735,-62.051623)" />
+      <rect
+         id="rect83435"
+         height="8.2469997"
+         width="8.2480001"
+         clip-path="url(#clipPath61129)"
+         y="330.543"
+         x="-638.13202"
+         style="fill:#81d0db"
+         transform="matrix(2.25,0,0,2.25,1741.735,-62.051623)" />
+      <rect
+         id="rect83437"
+         height="6.9299998"
+         width="6.9299998"
+         clip-path="url(#clipPath61125)"
+         y="331.20099"
+         x="-637.47198"
+         style="fill:#ffffff"
+         transform="matrix(2.25,0,0,2.25,1741.735,-62.051623)" />
+      <rect
+         id="rect83439"
+         height="4.5679998"
+         width="4.5700002"
+         clip-path="url(#clipPath61121)"
+         y="332.38199"
+         x="-636.29199"
+         style="fill:#ffffff"
+         transform="matrix(2.25,0,0,2.25,1741.735,-62.051623)" />
+      <rect
+         id="rect83454"
+         height="5.3860002"
+         width="5.3839998"
+         clip-path="url(#clipPath61117)"
+         y="331.974"
+         x="-636.69897"
+         style="fill:url(#SVGID_4707_)"
+         transform="matrix(2.25,0,0,2.25,1741.735,-62.051623)" />
+      <path
+         id="path83464"
+         d="m -634.639,334.666 c 0,-0.349 0.283,-0.632 0.632,-0.632 0.351,0 0.634,0.283 0.634,0.632 0,0.35 -0.283,0.633 -0.634,0.633 -0.349,0 -0.632,-0.283 -0.632,-0.633"
+         clip-path="url(#clipPath61113)"
+         inkscape:connector-curvature="0"
+         style="fill:#ffffff"
+         transform="matrix(2.25,0,0,2.25,1741.735,-62.051623)" />
+      <rect
+         id="rect83466"
+         height="9.592"
+         width="9.5930004"
+         clip-path="url(#clipPath61109)"
+         y="329.87"
+         x="-614.85999"
+         style="fill:#ffffff"
+         transform="matrix(2.25,0,0,2.25,1741.735,-62.051623)" />
+      <rect
+         id="rect83468"
+         height="9.592"
+         width="9.5930004"
+         stroke-miterlimit="10"
+         clip-path="url(#clipPath61105)"
+         y="329.87"
+         x="-614.86102"
+         style="fill:none;stroke:#81d0db;stroke-width:0.428;stroke-miterlimit:10"
+         transform="matrix(2.25,0,0,2.25,1741.735,-62.051623)" />
+      <rect
+         id="rect83470"
+         height="8.2469997"
+         width="8.2480001"
+         clip-path="url(#clipPath61101)"
+         y="330.543"
+         x="-614.18799"
+         style="fill:#81d0db"
+         transform="matrix(2.25,0,0,2.25,1741.735,-62.051623)" />
+      <rect
+         id="rect83472"
+         height="6.9299998"
+         width="6.9310002"
+         clip-path="url(#clipPath61097)"
+         y="331.20099"
+         x="-613.52899"
+         style="fill:#ffffff"
+         transform="matrix(2.25,0,0,2.25,1741.735,-62.051623)" />
+      <rect
+         id="rect83474"
+         height="4.5679998"
+         width="4.5700002"
+         clip-path="url(#clipPath61093)"
+         y="332.38199"
+         x="-612.349"
+         style="fill:#ffffff"
+         transform="matrix(2.25,0,0,2.25,1741.735,-62.051623)" />
+      <rect
+         id="rect83489"
+         height="5.3860002"
+         width="5.3829999"
+         clip-path="url(#clipPath61089)"
+         y="331.974"
+         x="-612.75598"
+         style="fill:url(#SVGID_4712_)"
+         transform="matrix(2.25,0,0,2.25,1741.735,-62.051623)" />
+      <path
+         id="path83499"
+         d="m -610.696,334.666 c 0,-0.349 0.283,-0.632 0.632,-0.632 0.351,0 0.634,0.283 0.634,0.632 0,0.35 -0.283,0.633 -0.634,0.633 -0.349,0 -0.632,-0.283 -0.632,-0.633"
+         clip-path="url(#clipPath61085)"
+         inkscape:connector-curvature="0"
+         style="fill:#ffffff"
+         transform="matrix(2.25,0,0,2.25,1741.735,-62.051623)" />
+      <rect
+         id="rect83501"
+         height="9.592"
+         width="9.592"
+         clip-path="url(#clipPath61081)"
+         y="329.87"
+         x="-602.888"
+         style="fill:#ffffff"
+         transform="matrix(2.25,0,0,2.25,1741.735,-62.051623)" />
+      <rect
+         id="rect83503"
+         height="9.592"
+         width="9.592"
+         stroke-miterlimit="10"
+         clip-path="url(#clipPath61077)"
+         y="329.87"
+         x="-602.888"
+         style="fill:none;stroke:#81d0db;stroke-width:0.428;stroke-miterlimit:10"
+         transform="matrix(2.25,0,0,2.25,1741.735,-62.051623)" />
+      <rect
+         id="rect83505"
+         height="8.2469997"
+         width="8.2480001"
+         clip-path="url(#clipPath61073)"
+         y="330.543"
+         x="-602.21698"
+         style="fill:#81d0db"
+         transform="matrix(2.25,0,0,2.25,1741.735,-62.051623)" />
+      <rect
+         id="rect83507"
+         height="6.9299998"
+         width="6.9299998"
+         clip-path="url(#clipPath61069)"
+         y="331.20099"
+         x="-601.55701"
+         style="fill:#ffffff"
+         transform="matrix(2.25,0,0,2.25,1741.735,-62.051623)" />
+      <rect
+         id="rect83509"
+         height="4.5679998"
+         width="4.5700002"
+         clip-path="url(#clipPath61065)"
+         y="332.38199"
+         x="-600.37799"
+         style="fill:#ffffff"
+         transform="matrix(2.25,0,0,2.25,1741.735,-62.051623)" />
+      <rect
+         id="rect83524"
+         height="5.3860002"
+         width="5.3829999"
+         clip-path="url(#clipPath61061)"
+         y="331.974"
+         x="-600.78497"
+         style="fill:url(#SVGID_4717_)"
+         transform="matrix(2.25,0,0,2.25,1741.735,-62.051623)" />
+      <path
+         id="path83534"
+         d="m -598.725,334.666 c 0,-0.349 0.283,-0.632 0.632,-0.632 0.351,0 0.634,0.283 0.634,0.632 0,0.35 -0.283,0.633 -0.634,0.633 -0.349,0 -0.632,-0.283 -0.632,-0.633"
+         clip-path="url(#clipPath61057)"
+         inkscape:connector-curvature="0"
+         style="fill:#ffffff"
+         transform="matrix(2.25,0,0,2.25,1741.735,-62.051623)" />
+      <rect
+         id="rect83536"
+         height="9.592"
+         width="9.592"
+         clip-path="url(#clipPath61053)"
+         y="329.87"
+         x="-590.91699"
+         style="fill:#ffffff"
+         transform="matrix(2.25,0,0,2.25,1741.735,-62.051623)" />
+      <rect
+         id="rect83538"
+         height="9.592"
+         width="9.592"
+         stroke-miterlimit="10"
+         clip-path="url(#clipPath61049)"
+         y="329.87"
+         x="-590.91699"
+         style="fill:none;stroke:#81d0db;stroke-width:0.428;stroke-miterlimit:10"
+         transform="matrix(2.25,0,0,2.25,1741.735,-62.051623)" />
+      <rect
+         id="rect83540"
+         height="8.2469997"
+         width="8.2480001"
+         clip-path="url(#clipPath61045)"
+         y="330.543"
+         x="-590.24597"
+         style="fill:#81d0db"
+         transform="matrix(2.25,0,0,2.25,1741.735,-62.051623)" />
+      <rect
+         id="rect83542"
+         height="6.9299998"
+         width="6.9299998"
+         clip-path="url(#clipPath61041)"
+         y="331.20099"
+         x="-589.586"
+         style="fill:#ffffff"
+         transform="matrix(2.25,0,0,2.25,1741.735,-62.051623)" />
+      <rect
+         id="rect83544"
+         height="4.5679998"
+         width="4.5700002"
+         clip-path="url(#clipPath61037)"
+         y="332.38199"
+         x="-588.40698"
+         style="fill:#ffffff"
+         transform="matrix(2.25,0,0,2.25,1741.735,-62.051623)" />
+      <rect
+         id="rect83559"
+         height="5.3860002"
+         width="5.3829999"
+         clip-path="url(#clipPath61033)"
+         y="331.974"
+         x="-588.81299"
+         style="fill:url(#SVGID_4722_)"
+         transform="matrix(2.25,0,0,2.25,1741.735,-62.051623)" />
+      <rect
+         id="rect83746"
+         height="9.592"
+         width="9.592"
+         clip-path="url(#clipPath61029)"
+         y="341.65302"
+         x="-674.71698"
+         style="fill:#ffffff"
+         transform="matrix(2.25,0,0,2.25,1741.735,-62.051623)" />
+      <rect
+         id="rect83748"
+         height="9.592"
+         width="9.592"
+         stroke-miterlimit="10"
+         clip-path="url(#clipPath61025)"
+         y="341.65302"
+         x="-674.71698"
+         style="fill:none;stroke:#81d0db;stroke-width:0.428;stroke-miterlimit:10"
+         transform="matrix(2.25,0,0,2.25,1741.735,-62.051623)" />
+      <rect
+         id="rect83750"
+         height="8.2469997"
+         width="8.2480001"
+         clip-path="url(#clipPath61021)"
+         y="342.32599"
+         x="-674.04602"
+         style="fill:#81d0db"
+         transform="matrix(2.25,0,0,2.25,1741.735,-62.051623)" />
+      <rect
+         id="rect83752"
+         height="6.9299998"
+         width="6.9299998"
+         clip-path="url(#clipPath61017)"
+         y="342.98401"
+         x="-673.38599"
+         style="fill:#ffffff"
+         transform="matrix(2.25,0,0,2.25,1741.735,-62.051623)" />
+      <rect
+         id="rect83754"
+         height="4.5679998"
+         width="4.5700002"
+         clip-path="url(#clipPath61013)"
+         y="344.164"
+         x="-672.20697"
+         style="fill:#ffffff"
+         transform="matrix(2.25,0,0,2.25,1741.735,-62.051623)" />
+      <rect
+         id="rect83769"
+         height="5.3839998"
+         width="5.3839998"
+         clip-path="url(#clipPath61009)"
+         y="343.75699"
+         x="-672.61401"
+         style="fill:url(#SVGID_4752_)"
+         transform="matrix(2.25,0,0,2.25,1741.735,-62.051623)" />
+      <path
+         id="path83779"
+         d="m -670.553,346.449 c 0,-0.349 0.283,-0.632 0.632,-0.632 0.351,0 0.634,0.283 0.634,0.632 0,0.35 -0.283,0.633 -0.634,0.633 -0.349,0 -0.632,-0.283 -0.632,-0.633"
+         clip-path="url(#clipPath61005)"
+         inkscape:connector-curvature="0"
+         style="fill:#ffffff"
+         transform="matrix(2.25,0,0,2.25,1741.735,-62.051623)" />
+      <rect
+         id="rect83781"
+         height="9.592"
+         width="9.592"
+         clip-path="url(#clipPath61001)"
+         y="341.65302"
+         x="-662.745"
+         style="fill:#ffffff"
+         transform="matrix(2.25,0,0,2.25,1741.735,-62.051623)" />
+      <rect
+         id="rect83783"
+         height="9.592"
+         width="9.592"
+         stroke-miterlimit="10"
+         clip-path="url(#clipPath60997)"
+         y="341.65302"
+         x="-662.74597"
+         style="fill:none;stroke:#81d0db;stroke-width:0.428;stroke-miterlimit:10"
+         transform="matrix(2.25,0,0,2.25,1741.735,-62.051623)" />
+      <rect
+         id="rect83785"
+         height="8.2469997"
+         width="8.2480001"
+         clip-path="url(#clipPath60993)"
+         y="342.32599"
+         x="-662.07397"
+         style="fill:#81d0db"
+         transform="matrix(2.25,0,0,2.25,1741.735,-62.051623)" />
+      <rect
+         id="rect83787"
+         height="6.9299998"
+         width="6.9299998"
+         clip-path="url(#clipPath60989)"
+         y="342.98401"
+         x="-661.414"
+         style="fill:#ffffff"
+         transform="matrix(2.25,0,0,2.25,1741.735,-62.051623)" />
+      <rect
+         id="rect83789"
+         height="4.5679998"
+         width="4.5700002"
+         clip-path="url(#clipPath60985)"
+         y="344.164"
+         x="-660.23499"
+         style="fill:#ffffff"
+         transform="matrix(2.25,0,0,2.25,1741.735,-62.051623)" />
+      <rect
+         id="rect83804"
+         height="5.3839998"
+         width="5.3839998"
+         clip-path="url(#clipPath60981)"
+         y="343.75699"
+         x="-660.64203"
+         style="fill:url(#SVGID_4757_)"
+         transform="matrix(2.25,0,0,2.25,1741.735,-62.051623)" />
+      <path
+         id="path83814"
+         d="m -658.582,346.449 c 0,-0.349 0.283,-0.632 0.632,-0.632 0.351,0 0.634,0.283 0.634,0.632 0,0.35 -0.283,0.633 -0.634,0.633 -0.349,0 -0.632,-0.283 -0.632,-0.633"
+         clip-path="url(#clipPath60977)"
+         inkscape:connector-curvature="0"
+         style="fill:#ffffff"
+         transform="matrix(2.25,0,0,2.25,1741.735,-62.051623)" />
+      <rect
+         id="rect83816"
+         height="9.592"
+         width="9.592"
+         clip-path="url(#clipPath60973)"
+         y="341.65302"
+         x="-650.77399"
+         style="fill:#ffffff"
+         transform="matrix(2.25,0,0,2.25,1741.735,-62.051623)" />
+      <rect
+         id="rect83818"
+         height="9.592"
+         width="9.592"
+         stroke-miterlimit="10"
+         clip-path="url(#clipPath60969)"
+         y="341.65302"
+         x="-650.77399"
+         style="fill:none;stroke:#81d0db;stroke-width:0.428;stroke-miterlimit:10"
+         transform="matrix(2.25,0,0,2.25,1741.735,-62.051623)" />
+      <rect
+         id="rect83820"
+         height="8.2469997"
+         width="8.2480001"
+         clip-path="url(#clipPath60965)"
+         y="342.32599"
+         x="-650.10303"
+         style="fill:#81d0db"
+         transform="matrix(2.25,0,0,2.25,1741.735,-62.051623)" />
+      <rect
+         id="rect83822"
+         height="6.9299998"
+         width="6.9299998"
+         clip-path="url(#clipPath60961)"
+         y="342.98401"
+         x="-649.44299"
+         style="fill:#ffffff"
+         transform="matrix(2.25,0,0,2.25,1741.735,-62.051623)" />
+      <rect
+         id="rect83824"
+         height="4.5679998"
+         width="4.5700002"
+         clip-path="url(#clipPath60957)"
+         y="344.164"
+         x="-648.26398"
+         style="fill:#ffffff"
+         transform="matrix(2.25,0,0,2.25,1741.735,-62.051623)" />
+      <rect
+         id="rect83839"
+         height="5.3839998"
+         width="5.3839998"
+         clip-path="url(#clipPath60953)"
+         y="343.75699"
+         x="-648.67102"
+         style="fill:url(#SVGID_4762_)"
+         transform="matrix(2.25,0,0,2.25,1741.735,-62.051623)" />
+      <path
+         id="path83849"
+         d="m -646.611,346.449 c 0,-0.349 0.283,-0.632 0.632,-0.632 0.351,0 0.634,0.283 0.634,0.632 0,0.35 -0.283,0.633 -0.634,0.633 -0.349,0 -0.632,-0.283 -0.632,-0.633"
+         clip-path="url(#clipPath60949)"
+         inkscape:connector-curvature="0"
+         style="fill:#ffffff"
+         transform="matrix(2.25,0,0,2.25,1741.735,-62.051623)" />
+      <rect
+         id="rect83851"
+         height="9.592"
+         width="9.592"
+         clip-path="url(#clipPath60945)"
+         y="341.65302"
+         x="-638.80298"
+         style="fill:#ffffff"
+         transform="matrix(2.25,0,0,2.25,1741.735,-62.051623)" />
+      <rect
+         id="rect83853"
+         height="9.592"
+         width="9.592"
+         stroke-miterlimit="10"
+         clip-path="url(#clipPath60941)"
+         y="341.65302"
+         x="-638.80298"
+         style="fill:none;stroke:#81d0db;stroke-width:0.428;stroke-miterlimit:10"
+         transform="matrix(2.25,0,0,2.25,1741.735,-62.051623)" />
+      <rect
+         id="rect83855"
+         height="8.2469997"
+         width="8.2480001"
+         clip-path="url(#clipPath60937)"
+         y="342.32599"
+         x="-638.13202"
+         style="fill:#81d0db"
+         transform="matrix(2.25,0,0,2.25,1741.735,-62.051623)" />
+      <rect
+         id="rect83857"
+         height="6.9299998"
+         width="6.9299998"
+         clip-path="url(#clipPath60933)"
+         y="342.98401"
+         x="-637.47198"
+         style="fill:#ffffff"
+         transform="matrix(2.25,0,0,2.25,1741.735,-62.051623)" />
+      <rect
+         id="rect83859"
+         height="4.5679998"
+         width="4.5700002"
+         clip-path="url(#clipPath60929)"
+         y="344.164"
+         x="-636.29199"
+         style="fill:#ffffff"
+         transform="matrix(2.25,0,0,2.25,1741.735,-62.051623)" />
+      <rect
+         id="rect83874"
+         height="5.3839998"
+         width="5.3839998"
+         clip-path="url(#clipPath60925)"
+         y="343.75699"
+         x="-636.69897"
+         style="fill:url(#SVGID_4767_)"
+         transform="matrix(2.25,0,0,2.25,1741.735,-62.051623)" />
+      <path
+         id="path83884"
+         d="m -634.639,346.449 c 0,-0.349 0.283,-0.632 0.632,-0.632 0.351,0 0.634,0.283 0.634,0.632 0,0.35 -0.283,0.633 -0.634,0.633 -0.349,0 -0.632,-0.283 -0.632,-0.633"
+         clip-path="url(#clipPath60921)"
+         inkscape:connector-curvature="0"
+         style="fill:#ffffff"
+         transform="matrix(2.25,0,0,2.25,1741.735,-62.051623)" />
+      <rect
+         id="rect83886"
+         height="9.592"
+         width="9.592"
+         clip-path="url(#clipPath60917)"
+         y="341.65302"
+         x="-626.83099"
+         style="fill:#ffffff"
+         transform="matrix(2.25,0,0,2.25,1741.735,-62.051623)" />
+      <rect
+         id="rect83888"
+         height="9.592"
+         width="9.592"
+         stroke-miterlimit="10"
+         clip-path="url(#clipPath60913)"
+         y="341.65302"
+         x="-626.83099"
+         style="fill:none;stroke:#81d0db;stroke-width:0.428;stroke-miterlimit:10"
+         transform="matrix(2.25,0,0,2.25,1741.735,-62.051623)" />
+      <rect
+         id="rect83890"
+         height="8.2469997"
+         width="8.2480001"
+         clip-path="url(#clipPath60909)"
+         y="342.32599"
+         x="-626.15997"
+         style="fill:#81d0db"
+         transform="matrix(2.25,0,0,2.25,1741.735,-62.051623)" />
+      <rect
+         id="rect83892"
+         height="6.9299998"
+         width="6.9299998"
+         clip-path="url(#clipPath60905)"
+         y="342.98401"
+         x="-625.5"
+         style="fill:#ffffff"
+         transform="matrix(2.25,0,0,2.25,1741.735,-62.051623)" />
+      <rect
+         id="rect83894"
+         height="4.5679998"
+         width="4.5700002"
+         clip-path="url(#clipPath60901)"
+         y="344.164"
+         x="-624.32098"
+         style="fill:#ffffff"
+         transform="matrix(2.25,0,0,2.25,1741.735,-62.051623)" />
+      <rect
+         id="rect83909"
+         height="5.3839998"
+         width="5.3839998"
+         clip-path="url(#clipPath60897)"
+         y="343.75699"
+         x="-624.72803"
+         style="fill:url(#SVGID_4772_)"
+         transform="matrix(2.25,0,0,2.25,1741.735,-62.051623)" />
+      <path
+         id="path83919"
+         d="m -622.668,346.449 c 0,-0.349 0.283,-0.632 0.632,-0.632 0.351,0 0.634,0.283 0.634,0.632 0,0.35 -0.283,0.633 -0.634,0.633 -0.349,0 -0.632,-0.283 -0.632,-0.633"
+         clip-path="url(#clipPath60893)"
+         inkscape:connector-curvature="0"
+         style="fill:#ffffff"
+         transform="matrix(2.25,0,0,2.25,1741.735,-62.051623)" />
+      <rect
+         id="rect83921"
+         height="9.592"
+         width="9.5930004"
+         clip-path="url(#clipPath60889)"
+         y="341.65302"
+         x="-614.85999"
+         style="fill:#ffffff"
+         transform="matrix(2.25,0,0,2.25,1741.735,-62.051623)" />
+      <rect
+         id="rect83923"
+         height="9.592"
+         width="9.5930004"
+         stroke-miterlimit="10"
+         clip-path="url(#clipPath60885)"
+         y="341.65302"
+         x="-614.86102"
+         style="fill:none;stroke:#81d0db;stroke-width:0.428;stroke-miterlimit:10"
+         transform="matrix(2.25,0,0,2.25,1741.735,-62.051623)" />
+      <rect
+         id="rect83925"
+         height="8.2469997"
+         width="8.2480001"
+         clip-path="url(#clipPath60881)"
+         y="342.32599"
+         x="-614.18799"
+         style="fill:#81d0db"
+         transform="matrix(2.25,0,0,2.25,1741.735,-62.051623)" />
+      <rect
+         id="rect83927"
+         height="6.9299998"
+         width="6.9310002"
+         clip-path="url(#clipPath60877)"
+         y="342.98401"
+         x="-613.52899"
+         style="fill:#ffffff"
+         transform="matrix(2.25,0,0,2.25,1741.735,-62.051623)" />
+      <rect
+         id="rect83929"
+         height="4.5679998"
+         width="4.5700002"
+         clip-path="url(#clipPath60873)"
+         y="344.164"
+         x="-612.349"
+         style="fill:#ffffff"
+         transform="matrix(2.25,0,0,2.25,1741.735,-62.051623)" />
+      <rect
+         id="rect83944"
+         height="5.3839998"
+         width="5.3829999"
+         clip-path="url(#clipPath60869)"
+         y="343.75699"
+         x="-612.75598"
+         style="fill:url(#SVGID_4777_)"
+         transform="matrix(2.25,0,0,2.25,1741.735,-62.051623)" />
+      <path
+         id="path83954"
+         d="m -610.696,346.449 c 0,-0.349 0.283,-0.632 0.632,-0.632 0.351,0 0.634,0.283 0.634,0.632 0,0.35 -0.283,0.633 -0.634,0.633 -0.349,0 -0.632,-0.283 -0.632,-0.633"
+         clip-path="url(#clipPath60865)"
+         inkscape:connector-curvature="0"
+         style="fill:#ffffff"
+         transform="matrix(2.25,0,0,2.25,1741.735,-62.051623)" />
+      <rect
+         id="rect83956"
+         height="9.592"
+         width="9.592"
+         clip-path="url(#clipPath60861)"
+         y="341.65302"
+         x="-602.888"
+         style="fill:#ffffff"
+         transform="matrix(2.25,0,0,2.25,1741.735,-62.051623)" />
+      <rect
+         id="rect83958"
+         height="9.592"
+         width="9.592"
+         stroke-miterlimit="10"
+         clip-path="url(#clipPath60857)"
+         y="341.65302"
+         x="-602.888"
+         style="fill:none;stroke:#81d0db;stroke-width:0.428;stroke-miterlimit:10"
+         transform="matrix(2.25,0,0,2.25,1741.735,-62.051623)" />
+      <rect
+         id="rect83960"
+         height="8.2469997"
+         width="8.2480001"
+         clip-path="url(#clipPath60853)"
+         y="342.32599"
+         x="-602.21698"
+         style="fill:#81d0db"
+         transform="matrix(2.25,0,0,2.25,1741.735,-62.051623)" />
+      <rect
+         id="rect83962"
+         height="6.9299998"
+         width="6.9299998"
+         clip-path="url(#clipPath60849)"
+         y="342.98401"
+         x="-601.55701"
+         style="fill:#ffffff"
+         transform="matrix(2.25,0,0,2.25,1741.735,-62.051623)" />
+      <rect
+         id="rect83964"
+         height="4.5679998"
+         width="4.5700002"
+         clip-path="url(#clipPath60845)"
+         y="344.164"
+         x="-600.37799"
+         style="fill:#ffffff"
+         transform="matrix(2.25,0,0,2.25,1741.735,-62.051623)" />
+      <rect
+         id="rect83979"
+         height="5.3839998"
+         width="5.3829999"
+         clip-path="url(#clipPath60841)"
+         y="343.75699"
+         x="-600.78497"
+         style="fill:url(#SVGID_4782_)"
+         transform="matrix(2.25,0,0,2.25,1741.735,-62.051623)" />
+      <path
+         id="path83989"
+         d="m -598.725,346.449 c 0,-0.349 0.283,-0.632 0.632,-0.632 0.351,0 0.634,0.283 0.634,0.632 0,0.35 -0.283,0.633 -0.634,0.633 -0.349,0 -0.632,-0.283 -0.632,-0.633"
+         clip-path="url(#clipPath60837)"
+         inkscape:connector-curvature="0"
+         style="fill:#ffffff"
+         transform="matrix(2.25,0,0,2.25,1741.735,-62.051623)" />
+      <rect
+         id="rect83991"
+         height="9.592"
+         width="9.592"
+         clip-path="url(#clipPath60833)"
+         y="341.65302"
+         x="-590.91699"
+         style="fill:#ffffff"
+         transform="matrix(2.25,0,0,2.25,1741.735,-62.051623)" />
+      <rect
+         id="rect83993"
+         height="9.592"
+         width="9.592"
+         stroke-miterlimit="10"
+         clip-path="url(#clipPath60829)"
+         y="341.65302"
+         x="-590.91699"
+         style="fill:none;stroke:#81d0db;stroke-width:0.428;stroke-miterlimit:10"
+         transform="matrix(2.25,0,0,2.25,1741.735,-62.051623)" />
+      <rect
+         id="rect83995"
+         height="8.2469997"
+         width="8.2480001"
+         clip-path="url(#clipPath60825)"
+         y="342.32599"
+         x="-590.24597"
+         style="fill:#81d0db"
+         transform="matrix(2.25,0,0,2.25,1741.735,-62.051623)" />
+      <rect
+         id="rect83997"
+         height="6.9299998"
+         width="6.9299998"
+         clip-path="url(#clipPath60821)"
+         y="342.98401"
+         x="-589.586"
+         style="fill:#ffffff"
+         transform="matrix(2.25,0,0,2.25,1741.735,-62.051623)" />
+      <rect
+         id="rect83999"
+         height="4.5679998"
+         width="4.5700002"
+         clip-path="url(#clipPath60817)"
+         y="344.164"
+         x="-588.40698"
+         style="fill:#ffffff"
+         transform="matrix(2.25,0,0,2.25,1741.735,-62.051623)" />
+      <rect
+         id="rect84014"
+         height="5.3839998"
+         width="5.3829999"
+         clip-path="url(#clipPath60813)"
+         y="343.75699"
+         x="-588.81299"
+         style="fill:url(#SVGID_4787_)"
+         transform="matrix(2.25,0,0,2.25,1741.735,-62.051623)" />
       <polygon
       <polygon
-         transform="matrix(2.25,0,0,2.25,1605.7731,-25.560183)"
+         transform="matrix(2.25,0,0,2.25,1741.735,-62.051623)"
          style="fill:#f15d57"
          style="fill:#f15d57"
-         clip-path="url(#SVGID_4843_)"
-         points="-667.777,292.47 -671.896,292.47 -669.845,294.263 "
+         clip-path="url(#clipPath60809)"
+         points="-671.896,292.47 -669.845,294.263 -667.777,292.47 "
          id="polygon84546" />
       <polygon
          id="polygon84546" />
       <polygon
-         transform="matrix(2.25,0,0,2.25,1605.7731,-25.560183)"
+         transform="matrix(2.25,0,0,2.25,1741.735,-62.051623)"
          style="fill:#f15d57"
          style="fill:#f15d57"
-         clip-path="url(#SVGID_4843_)"
-         points="-657.265,292.47 -661.384,292.47 -659.333,294.263 "
+         clip-path="url(#clipPath60805)"
+         points="-661.384,292.47 -659.333,294.263 -657.265,292.47 "
          id="polygon84548" />
       <polygon
          id="polygon84548" />
       <polygon
-         transform="matrix(2.25,0,0,2.25,1605.7731,-25.560183)"
+         transform="matrix(2.25,0,0,2.25,1741.735,-62.051623)"
          style="fill:#f15d57"
          style="fill:#f15d57"
-         clip-path="url(#SVGID_4843_)"
-         points="-646.752,292.47 -650.871,292.47 -648.82,294.263 "
+         clip-path="url(#clipPath60801)"
+         points="-650.871,292.47 -648.82,294.263 -646.752,292.47 "
          id="polygon84550" />
       <polygon
          id="polygon84550" />
       <polygon
-         transform="matrix(2.25,0,0,2.25,1605.7731,-25.560183)"
+         transform="matrix(2.25,0,0,2.25,1741.735,-62.051623)"
          style="fill:#f15d57"
          style="fill:#f15d57"
-         clip-path="url(#SVGID_4843_)"
-         points="-601.13,292.47 -605.249,292.47 -603.198,294.263 "
+         clip-path="url(#clipPath60797)"
+         points="-605.249,292.47 -603.198,294.263 -601.13,292.47 "
          id="polygon84552" />
       <polygon
          id="polygon84552" />
       <polygon
-         transform="matrix(2.25,0,0,2.25,1605.7731,-25.560183)"
+         transform="matrix(2.25,0,0,2.25,1741.735,-62.051623)"
          style="fill:#f15d57"
          style="fill:#f15d57"
-         clip-path="url(#SVGID_4843_)"
-         points="-590.618,292.47 -594.737,292.47 -592.686,294.263 "
+         clip-path="url(#clipPath60793)"
+         points="-594.737,292.47 -592.686,294.263 -590.618,292.47 "
          id="polygon84554" />
       <polygon
          id="polygon84554" />
       <polygon
-         transform="matrix(2.25,0,0,2.25,1605.7731,-25.560183)"
+         transform="matrix(2.25,0,0,2.25,1741.735,-62.051623)"
          style="fill:#f15d57"
          style="fill:#f15d57"
-         clip-path="url(#SVGID_4843_)"
-         points="-580.105,292.47 -584.224,292.47 -582.173,294.263 "
+         clip-path="url(#clipPath60789)"
+         points="-584.224,292.47 -582.173,294.263 -580.105,292.47 "
          id="polygon84556" />
          id="polygon84556" />
-      <g
-         inkscape:transform-center-y="141.90493"
-         inkscape:transform-center-x="262.77489"
-         id="g84792"
-         transform="matrix(1.3542118,0,0,2.25,996.72494,-31.560183)">
-        <defs
-           id="defs84794">
-          <rect
-             height="205.44099"
-             width="200.271"
-             y="181.315"
-             x="-682.31403"
-             id="SVGID_4872_" />
-        </defs>
-        <clipPath
-           id="clipPath103597">
-          <use
-             id="use103599"
-             overflow="visible"
-             xlink:href="#SVGID_4872_"
-             style="overflow:visible"
-             x="0"
-             y="0"
-             width="744.09448"
-             height="1052.3622" />
-        </clipPath>
-        <path
-           id="path84800"
-           d="m -438.652,188.287 c 0,0.349 -0.282,0.632 -0.632,0.632 -0.349,0 -0.632,-0.283 -0.632,-0.632 0,-0.35 0.283,-0.633 0.632,-0.633 0.35,0 0.632,0.284 0.632,0.633"
-           clip-path="url(#SVGID_4873_)"
-           inkscape:connector-curvature="0"
-           style="fill:#5e6a71" />
-        <g
-           id="g84802"
-           clip-path="url(#SVGID_4873_)">
-          <g
-             id="g84804">
-            <defs
-               id="defs84806">
-              <rect
-                 height="10.152"
-                 width="174.95799"
-                 y="360.13901"
-                 x="-679.90002"
-                 id="SVGID_4874_" />
-            </defs>
-            <clipPath
-               id="clipPath103606">
-              <use
-                 id="use103608"
-                 overflow="visible"
-                 xlink:href="#SVGID_4874_"
-                 style="overflow:visible"
-                 x="0"
-                 y="0"
-                 width="744.09448"
-                 height="1052.3622" />
-            </clipPath>
-            <g
-               id="g84812"
-               clip-path="url(#SVGID_4875_)">
-              <defs
-                 id="defs84814">
-                <rect
-                   height="10.152"
-                   width="174.95799"
-                   y="360.13901"
-                   x="-679.90002"
-                   id="SVGID_4876_" />
-              </defs>
-              <clipPath
-                 id="clipPath103613">
-                <use
-                   id="use103615"
-                   overflow="visible"
-                   xlink:href="#SVGID_4876_"
-                   style="overflow:visible"
-                   x="0"
-                   y="0"
-                   width="744.09448"
-                   height="1052.3622" />
-              </clipPath>
-              <linearGradient
-                 gradientTransform="matrix(0,-10.1526,-10.1526,0,900.78,782.1111)"
-                 y2="147.0757"
-                 x2="41.563"
-                 y1="147.0757"
-                 x1="40.563"
-                 gradientUnits="userSpaceOnUse"
-                 id="linearGradient103617">
-                <stop
-                   id="stop103619"
-                   style="stop-color:#55AEB9"
-                   offset="0" />
-                <stop
-                   id="stop103621"
-                   style="stop-color:#B0D2D9"
-                   offset="0.486" />
-                <stop
-                   id="stop103623"
-                   style="stop-color:#E6EFF1"
-                   offset="0.8287" />
-                <stop
-                   id="stop103625"
-                   style="stop-color:#FFFFFF"
-                   offset="0.9939" />
-                <stop
-                   id="stop103627"
-                   style="stop-color:#FFFFFF"
-                   offset="1" />
-              </linearGradient>
-              <rect
-                 id="rect84831"
-                 height="10.153"
-                 width="174.95799"
-                 clip-path="url(#SVGID_4877_)"
-                 y="360.138"
-                 x="-679.90002"
-                 style="fill:url(#SVGID_4878_)" />
-            </g>
-          </g>
-        </g>
-        <g
-           id="g84833"
-           clip-path="url(#SVGID_4873_)">
-          <g
-             id="g84835">
-            <defs
-               id="defs84837">
-              <rect
-                 height="10.152"
-                 width="174.94701"
-                 y="360.13901"
-                 x="-679.88898"
-                 id="SVGID_4879_" />
-            </defs>
-            <clipPath
-               id="clipPath103634">
-              <use
-                 id="use103636"
-                 overflow="visible"
-                 xlink:href="#SVGID_4879_"
-                 style="overflow:visible"
-                 x="0"
-                 y="0"
-                 width="744.09448"
-                 height="1052.3622" />
-            </clipPath>
-            <g
-               id="g84843"
-               clip-path="url(#SVGID_4880_)">
-              <defs
-                 id="defs84845">
-                <rect
-                   height="10.153"
-                   width="174.94701"
-                   y="360.138"
-                   x="-679.88898"
-                   id="SVGID_4881_" />
-              </defs>
-              <clipPath
-                 id="clipPath103641">
-                <use
-                   id="use103643"
-                   overflow="visible"
-                   xlink:href="#SVGID_4881_"
-                   style="overflow:visible"
-                   x="0"
-                   y="0"
-                   width="744.09448"
-                   height="1052.3622" />
-              </clipPath>
-              <polygon
-                 id="polygon84851"
-                 points="-679.89,364.81 -679.89,367.139 -679.89,370.291 -504.943,370.291 -504.943,360.138 -679.89,360.139 "
-                 clip-path="url(#SVGID_4882_)"
-                 style="fill:#f15d57" />
-            </g>
-          </g>
-        </g>
-        <rect
-           id="rect84853"
-           height="2.641"
-           width="174.96001"
-           clip-path="url(#SVGID_4873_)"
-           y="360.267"
-           x="-679.90198"
-           style="fill:#f15d57" />
-        <rect
-           id="rect84855"
-           height="1.352"
-           width="174.94701"
-           clip-path="url(#SVGID_4873_)"
-           y="370.29199"
-           x="-679.88898"
-           style="fill:#55aeb9" />
-      </g>
+      <path
+         id="path84800"
+         d="m -438.652,188.287 c 0,0.349 -0.282,0.632 -0.632,0.632 -0.349,0 -0.632,-0.283 -0.632,-0.632 0,-0.35 0.283,-0.633 0.632,-0.633 0.35,0 0.632,0.284 0.632,0.633"
+         clip-path="url(#SVGID_4873_)"
+         inkscape:connector-curvature="0"
+         style="fill:#5e6a71"
+         transform="matrix(1.3542118,0,0,2.25,1132.6869,-68.051623)" />
+      <rect
+         id="rect84831"
+         height="10.153"
+         width="174.95799"
+         clip-path="url(#clipPath60785)"
+         y="360.138"
+         x="-679.90002"
+         style="fill:url(#SVGID_4878_)"
+         transform="matrix(1.3542118,0,0,2.25,1132.6869,-68.051623)" />
+      <polygon
+         id="polygon84851"
+         points="-679.89,364.81 -679.89,367.139 -679.89,370.291 -504.943,370.291 -504.943,360.138 -679.89,360.139 "
+         clip-path="url(#clipPath60781)"
+         style="fill:#f15d57"
+         transform="matrix(1.3542118,0,0,2.25,1132.6869,-68.051623)" />
+      <rect
+         id="rect84853"
+         height="2.641"
+         width="174.96001"
+         clip-path="url(#clipPath60777)"
+         y="360.267"
+         x="-679.90198"
+         style="fill:#f15d57"
+         transform="matrix(1.3542118,0,0,2.25,1132.6869,-68.051623)" />
+      <rect
+         id="rect84855"
+         height="1.352"
+         width="174.94701"
+         clip-path="url(#clipPath60773)"
+         y="370.29199"
+         x="-679.88898"
+         style="fill:#55aeb9"
+         transform="matrix(1.3542118,0,0,2.25,1132.6869,-68.051623)" />
       <text
          inkscape:transform-center-y="45.543285"
          inkscape:transform-center-x="450.06672"
          id="text82351-9"
          font-size="4.3343"
       <text
          inkscape:transform-center-y="45.543285"
          inkscape:transform-center-x="450.06672"
          id="text82351-9"
          font-size="4.3343"
-         style="font-size:9.75217533px;fill:#ffffff;font-family:ApexSans-Medium"
-         x="255.23141"
-         y="705.37921">M</text>
-      <g
-         transform="translate(-230,34)"
-         id="g9504">
-        <g
-           transform="matrix(2.25,0,0,2.25,1701.0081,-85.193202)"
-           id="g82339-6"
-           inkscape:transform-center-x="449.81598"
-           inkscape:transform-center-y="45.666809">
-          <defs
-             id="defs82341-9">
-            <rect
-               id="SVGID_4549_-8"
-               x="-682.31403"
-               y="181.315"
-               width="200.271"
-               height="205.44099" />
-          </defs>
-          <clipPath
-             id="clipPath101738-3">
-            <use
-               height="1052.3622"
-               width="744.09448"
-               y="0"
-               x="0"
-               style="overflow:visible"
-               xlink:href="#SVGID_4549_-8"
-               overflow="visible"
-               id="use101740-3" />
-          </clipPath>
-          <path
-             style="fill:#f15d57"
-             inkscape:connector-curvature="0"
-             clip-path="url(#SVGID_4550_-6)"
-             d="m -602.031,326.467 c 0,0.212 0.172,0.385 0.385,0.385 h 6.697 c 0.212,0 0.385,-0.173 0.385,-0.385 v -6.696 c 0,-0.213 -0.173,-0.385 -0.385,-0.385 h -6.697 c -0.213,0 -0.385,0.172 -0.385,0.385 v 6.696 z"
-             id="path82347-9" />
-          <path
-             style="fill:none;stroke:#ffffff;stroke-width:0.32100001;stroke-miterlimit:10"
-             inkscape:connector-curvature="0"
-             clip-path="url(#SVGID_4550_-6)"
-             stroke-miterlimit="10"
-             d="m -602.031,326.467 c 0,0.212 0.172,0.385 0.385,0.385 h 6.697 c 0.212,0 0.385,-0.173 0.385,-0.385 v -6.696 c 0,-0.213 -0.173,-0.385 -0.385,-0.385 h -6.697 c -0.213,0 -0.385,0.172 -0.385,0.385 v 6.696 z"
-             id="path82349-9" />
-        </g>
-        <text
-           y="645.37921"
-           x="350.6293"
-           style="font-size:9.75217533px;fill:#ffffff;font-family:ApexSans-Medium"
-           font-size="4.3343"
-           id="text82351-9-4"
-           inkscape:transform-center-x="450.06672"
-           inkscape:transform-center-y="45.543285">M</text>
-      </g>
+         style="font-size:9.75218px;font-family:ApexSans-Medium;fill:#ffffff"
+         x="391.19333"
+         y="668.88776"
+         clip-path="url(#clipPath60769)">M</text>
+      <path
+         style="fill:#f15d57"
+         inkscape:connector-curvature="0"
+         clip-path="url(#clipPath60765)"
+         d="m -602.031,326.467 c 0,0.212 0.172,0.385 0.385,0.385 h 6.697 c 0.212,0 0.385,-0.173 0.385,-0.385 v -6.696 c 0,-0.213 -0.173,-0.385 -0.385,-0.385 h -6.697 c -0.213,0 -0.385,0.172 -0.385,0.385 z"
+         id="path82347-9"
+         transform="matrix(2.25,0,0,2.25,1606.97,-87.684642)" />
+      <path
+         style="fill:none;stroke:#ffffff;stroke-width:0.321;stroke-miterlimit:10"
+         inkscape:connector-curvature="0"
+         clip-path="url(#clipPath60761)"
+         stroke-miterlimit="10"
+         d="m -602.031,326.467 c 0,0.212 0.172,0.385 0.385,0.385 h 6.697 c 0.212,0 0.385,-0.173 0.385,-0.385 v -6.696 c 0,-0.213 -0.173,-0.385 -0.385,-0.385 h -6.697 c -0.213,0 -0.385,0.172 -0.385,0.385 z"
+         id="path82349-9"
+         transform="matrix(2.25,0,0,2.25,1606.97,-87.684642)" />
+      <text
+         y="642.88776"
+         x="256.59122"
+         style="font-size:9.75218px;font-family:ApexSans-Medium;fill:#ffffff"
+         font-size="4.3343"
+         id="text82351-9-4"
+         inkscape:transform-center-x="450.06672"
+         inkscape:transform-center-y="45.543285"
+         clip-path="url(#clipPath60757)">M</text>
       <path
       <path
-         transform="matrix(2.25,0,0,2.25,1767.5425,-25.466067)"
+         transform="matrix(2.25,0,0,2.25,1903.5044,-61.957507)"
          style="fill:#ffffff"
          inkscape:connector-curvature="0"
          style="fill:#ffffff"
          inkscape:connector-curvature="0"
-         clip-path="url(#SVGID_4564_-7)"
+         clip-path="url(#clipPath60753)"
          d="m -658.582,311.532 c 0,-0.349 0.283,-0.631 0.632,-0.631 0.351,0 0.634,0.282 0.634,0.631 0,0.35 -0.283,0.633 -0.634,0.633 -0.349,0 -0.632,-0.283 -0.632,-0.633"
          id="path82449-2" />
       <path
          d="m -658.582,311.532 c 0,-0.349 0.283,-0.631 0.632,-0.631 0.351,0 0.634,0.282 0.634,0.631 0,0.35 -0.283,0.633 -0.634,0.633 -0.349,0 -0.632,-0.283 -0.632,-0.633"
          id="path82449-2" />
       <path
-         transform="matrix(2.25,0,0,2.25,1578.7139,-25.075587)"
+         transform="matrix(2.25,0,0,2.25,1714.6758,-61.567027)"
          style="fill:#ffffff"
          inkscape:connector-curvature="0"
          style="fill:#ffffff"
          inkscape:connector-curvature="0"
-         clip-path="url(#SVGID_4564_-7-3)"
+         clip-path="url(#clipPath60749)"
          d="m -658.582,311.532 c 0,-0.349 0.283,-0.631 0.632,-0.631 0.351,0 0.634,0.282 0.634,0.631 0,0.35 -0.283,0.633 -0.634,0.633 -0.349,0 -0.632,-0.283 -0.632,-0.633"
          id="path82449-2-2" />
       <path
          d="m -658.582,311.532 c 0,-0.349 0.283,-0.631 0.632,-0.631 0.351,0 0.634,0.282 0.634,0.631 0,0.35 -0.283,0.633 -0.634,0.633 -0.349,0 -0.632,-0.283 -0.632,-0.633"
          id="path82449-2-2" />
       <path
-         transform="matrix(2.25,0,0,2.25,1767.5425,0.59793262)"
+         transform="matrix(2.25,0,0,2.25,1903.5044,-35.893507)"
          style="fill:#ffffff"
          inkscape:connector-curvature="0"
          style="fill:#ffffff"
          inkscape:connector-curvature="0"
-         clip-path="url(#SVGID_4564_-7-9)"
+         clip-path="url(#clipPath60745)"
          d="m -658.582,311.532 c 0,-0.349 0.283,-0.631 0.632,-0.631 0.351,0 0.634,0.282 0.634,0.631 0,0.35 -0.283,0.633 -0.634,0.633 -0.349,0 -0.632,-0.283 -0.632,-0.633"
          id="path82449-2-0" />
       <path
          d="m -658.582,311.532 c 0,-0.349 0.283,-0.631 0.632,-0.631 0.351,0 0.634,0.282 0.634,0.631 0,0.35 -0.283,0.633 -0.634,0.633 -0.349,0 -0.632,-0.283 -0.632,-0.633"
          id="path82449-2-0" />
       <path
-         transform="matrix(2.25,0,0,2.25,1767.6425,26.597933)"
+         transform="matrix(2.25,0,0,2.25,1903.6044,-9.893507)"
          style="fill:#ffffff"
          inkscape:connector-curvature="0"
          style="fill:#ffffff"
          inkscape:connector-curvature="0"
-         clip-path="url(#SVGID_4564_-7-9-3)"
+         clip-path="url(#clipPath60741)"
          d="m -658.582,311.532 c 0,-0.349 0.283,-0.631 0.632,-0.631 0.351,0 0.634,0.282 0.634,0.631 0,0.35 -0.283,0.633 -0.634,0.633 -0.349,0 -0.632,-0.283 -0.632,-0.633"
          id="path82449-2-0-1" />
       <path
          d="m -658.582,311.532 c 0,-0.349 0.283,-0.631 0.632,-0.631 0.351,0 0.634,0.282 0.634,0.631 0,0.35 -0.283,0.633 -0.634,0.633 -0.349,0 -0.632,-0.283 -0.632,-0.633"
          id="path82449-2-0-1" />
       <path
-         transform="matrix(2.25,0,0,2.25,1767.7422,53.197933)"
+         transform="matrix(2.25,0,0,2.25,1903.7041,16.706493)"
          style="fill:#ffffff"
          inkscape:connector-curvature="0"
          style="fill:#ffffff"
          inkscape:connector-curvature="0"
-         clip-path="url(#SVGID_4564_-7-9-3-4)"
+         clip-path="url(#clipPath60737)"
          d="m -658.582,311.532 c 0,-0.349 0.283,-0.631 0.632,-0.631 0.351,0 0.634,0.282 0.634,0.631 0,0.35 -0.283,0.633 -0.634,0.633 -0.349,0 -0.632,-0.283 -0.632,-0.633"
          id="path82449-2-0-1-5" />
          d="m -658.582,311.532 c 0,-0.349 0.283,-0.631 0.632,-0.631 0.351,0 0.634,0.282 0.634,0.631 0,0.35 -0.283,0.633 -0.634,0.633 -0.349,0 -0.632,-0.283 -0.632,-0.633"
          id="path82449-2-0-1-5" />
+      <text
+         y="256.97998"
+         x="304.05688"
+         id="text84343-2-0-4"
+         inkscape:transform-center-x="587.62742"
+         inkscape:transform-center-y="-134.7035"
+         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:27px;font-family:'DejaVu Sans';-inkscape-font-specification:'DejaVu Sans';text-align:center;text-anchor:middle"
+         clip-path="url(#clipPath60733)"><tspan
+           style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:11px;font-family:'DejaVu Sans';-inkscape-font-specification:'DejaVu Sans';text-align:center;text-anchor:middle;fill:#37424b"
+           x="259.08472"
+           y="256.97998"
+           font-size="5.1244"
+           id="tspan84345-2-6-5">READ ONLY</tspan></text>
+      <text
+         y="256.4751"
+         x="457.74365"
+         id="text84343-2-0-4-3"
+         inkscape:transform-center-x="587.62742"
+         inkscape:transform-center-y="-134.7035"
+         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:27px;font-family:'DejaVu Sans';-inkscape-font-specification:'DejaVu Sans';text-align:center;text-anchor:middle"
+         clip-path="url(#clipPath60729)"><tspan
+           style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:11px;font-family:'DejaVu Sans';-inkscape-font-specification:'DejaVu Sans';text-align:center;text-anchor:middle;fill:#37424b"
+           x="412.77148"
+           y="256.4751"
+           font-size="5.1244"
+           id="tspan84345-2-6-5-3">WRITE / READ</tspan></text>
+      <g
+         id="g87377">
+        <text
+           y="225.89268"
+           x="378.15988"
+           id="text84343-2-0-4-6"
+           inkscape:transform-center-x="587.62742"
+           inkscape:transform-center-y="-134.7035"
+           style="font-size:27px;text-align:center;text-anchor:middle"
+           clip-path="url(#clipPath60725)"><tspan
+             style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:11px;font-family:'DejaVu Sans';-inkscape-font-specification:'DejaVu Sans';text-align:center;text-anchor:middle;fill:#37424b"
+             x="333.18771"
+             y="225.89268"
+             font-size="5.1244"
+             id="tspan84345-2-6-5-6">(United States)</tspan></text>
+      </g>
+      <text
+         xml:space="preserve"
+         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:8.2259px;font-family:sans-serif;-inkscape-font-specification:sans-serif;text-align:center;text-anchor:middle;fill:#000000;stroke-width:0.685492"
+         x="282.56839"
+         y="561.89795"
+         id="text18066"
+         clip-path="url(#clipPath60721)"><tspan
+           sodipodi:role="line"
+           id="tspan18064"
+           x="282.56839"
+           y="561.89795"
+           style="stroke-width:0.685492">NATIVE</tspan></text>
+      <text
+         xml:space="preserve"
+         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:8.2259px;font-family:sans-serif;-inkscape-font-specification:sans-serif;text-align:center;text-anchor:middle;fill:#000000;stroke-width:0.685492"
+         x="432.63998"
+         y="562.07495"
+         id="text18066-2"
+         clip-path="url(#clipPath60717)"><tspan
+           sodipodi:role="line"
+           id="tspan18064-0"
+           x="432.63998"
+           y="562.07495"
+           style="stroke-width:0.685492">NATIVE</tspan></text>
+      <text
+         xml:space="preserve"
+         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:12px;font-family:'DejaVu Sans';-inkscape-font-specification:'DejaVu Sans';text-align:center;text-anchor:middle;fill:#000000"
+         x="295.58789"
+         y="328.13101"
+         id="text18255"
+         clip-path="url(#clipPath60713)"><tspan
+           sodipodi:role="line"
+           id="tspan18253"
+           x="295.58789"
+           y="328.13101">REST</tspan></text>
+      <text
+         xml:space="preserve"
+         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:12px;font-family:'DejaVu Sans';-inkscape-font-specification:'DejaVu Sans';text-align:center;text-anchor:middle;fill:#000000"
+         x="454.07568"
+         y="328.0863"
+         id="text18255-2"
+         clip-path="url(#clipPath60709)"><tspan
+           sodipodi:role="line"
+           id="tspan18253-3"
+           x="454.07568"
+           y="328.0863">REST</tspan></text>
+      <path
+         style="fill:#f0f1f1;fill-opacity:1;stroke-width:0.116497"
+         d="m 305.33447,139.83555 c -1.5353,-2.15705 -2.83148,-3.9885 -2.88041,-4.06989 -0.0572,-0.0951 0.9412,-1.60821 2.7929,-4.2329 l 2.88186,-4.08491 h 23.27333 23.27333 v 8.1548 8.1548 H 331.4007 308.12591 Z m 32.24668,-0.42818 c 0.93699,-0.45843 1.30385,-1.08769 1.29904,-2.22817 -0.004,-0.9312 -0.18777,-1.37911 -0.76567,-1.86538 -0.48036,-0.4042 -0.68807,-0.4842 -2.30641,-0.88843 -1.48115,-0.36996 -1.74005,-0.54291 -1.83075,-1.22296 -0.0474,-0.35547 -0.003,-0.52653 0.2031,-0.78845 0.6608,-0.83835 2.11899,-0.88633 3.98156,-0.131 0.17963,0.0728 0.20387,0.006 0.20387,-0.56505 v -0.64772 l -0.43687,-0.12566 c -0.86722,-0.24944 -2.2724,-0.35278 -3.02226,-0.22226 -1.40688,0.24488 -2.15797,1.02245 -2.22618,2.30468 -0.0797,1.49771 0.67598,2.23462 2.71463,2.64726 0.96518,0.19536 1.65494,0.48012 1.91134,0.78906 0.24888,0.29988 0.28986,1.04242 0.0799,1.44837 -0.30027,0.58066 -0.78831,0.77633 -1.93302,0.775 -0.98365,-10e-4 -1.10221,-0.0331 -2.65031,-0.71487 -0.10741,-0.0473 -0.14562,0.1186 -0.14562,0.63218 v 0.69631 l 0.49511,0.13292 c 1.15073,0.30893 1.48493,0.35104 2.59352,0.32678 1.0115,-0.0221 1.25523,-0.069 1.83499,-0.35261 z m -19.13627,-1.60589 v -1.87856 l 0.99237,0.0521 c 0.93496,0.0491 1.0155,0.0745 1.39206,0.43948 0.21983,0.21307 0.73,1.03436 1.1337,1.82509 l 0.73401,1.4377 0.66986,0.001 c 0.36842,8.1e-4 0.66986,-0.0284 0.66986,-0.0648 0,-0.24918 -1.7292,-3.40276 -2.03171,-3.70527 l -0.37593,-0.37593 0.48783,-0.42436 c 0.59108,-0.51417 0.81828,-1.18732 0.7205,-2.13471 -0.0793,-0.76797 -0.36408,-1.29608 -0.89023,-1.65066 -0.6134,-0.41337 -1.11056,-0.49538 -3.00721,-0.49607 l -1.77658,-6.5e-4 v 4.42689 4.42689 h 0.64073 0.64074 z m 12.69818,1.29608 v -0.58248 h -2.21344 -2.21345 v -1.51447 -1.51446 h 2.09695 2.09695 v -0.52424 -0.52423 h -2.09695 -2.09695 v -1.28147 -1.28147 h 2.21345 2.21344 v -0.52424 -0.52423 h -2.85418 -2.85417 v 4.42689 4.42689 h 2.85417 2.85418 z m 12.69819,-3.32017 v -3.90265 h 1.57271 1.57271 v -0.52424 -0.52423 h -3.78615 -3.78616 v 0.52423 0.52424 h 1.57271 1.57271 v 3.90265 3.90266 h 0.64074 0.64073 z"
+         id="path49149"
+         transform="translate(122.65281,188.48619)"
+         clip-path="url(#clipPath60705)" />
+      <path
+         style="fill:#5e6a71;fill-opacity:1;stroke-width:0.041188"
+         d="m 149.80537,139.62238 c -1.5788,-2.22265 -2.87445,-4.05418 -2.87924,-4.07006 -0.005,-0.0159 1.28826,-1.86719 2.87345,-4.11402 l 2.88216,-4.08515 h 23.28249 23.28249 v 8.15521 8.15522 H 175.96131 152.6759 Z m 28.45609,0.0935 c 1.14799,-0.24773 1.79588,-0.80698 2.03981,-1.76075 0.15965,-0.62424 0.0825,-1.42191 -0.18945,-1.95857 -0.0613,-0.12096 -0.23419,-0.34268 -0.38422,-0.49271 -0.2173,-0.21729 -0.36062,-0.31534 -0.70471,-0.48211 -0.45685,-0.22141 -0.75797,-0.30949 -1.7271,-0.50521 -0.7467,-0.15081 -0.98724,-0.21988 -1.27692,-0.36672 -0.42219,-0.214 -0.57645,-0.48452 -0.57788,-1.01343 -8e-4,-0.29058 0.0153,-0.36562 0.12557,-0.58634 0.25339,-0.50708 0.75307,-0.76152 1.60341,-0.81648 0.66672,-0.0431 1.39515,0.0981 2.18297,0.42298 0.19255,0.0794 0.38253,0.15465 0.42217,0.1672 0.0664,0.021 0.0721,-0.0244 0.0721,-0.57454 v -0.59734 l -0.46336,-0.12664 c -0.87625,-0.23947 -1.1287,-0.27249 -2.0697,-0.27074 -0.75933,0.001 -0.90457,0.0126 -1.18943,0.0915 -0.56136,0.15551 -0.91399,0.35221 -1.26228,0.70413 -0.47857,0.48354 -0.6562,0.94146 -0.65737,1.6946 -0.001,0.91579 0.35417,1.53769 1.10151,1.9265 0.44431,0.23116 0.82089,0.34948 1.65748,0.52078 1.33967,0.27431 1.73789,0.46989 2.01108,0.98765 0.098,0.18576 0.11003,0.25358 0.11006,0.62044 3e-5,0.36705 -0.0124,0.43725 -0.11446,0.64502 -0.19885,0.40492 -0.62148,0.69315 -1.20352,0.82078 -0.3428,0.0752 -1.24166,0.0639 -1.62343,-0.0203 -0.45495,-0.10039 -1.00181,-0.29248 -1.47596,-0.51843 l -0.42218,-0.20119 v 0.6341 0.63409 l 0.32876,0.10385 c 0.4758,0.15031 1.08693,0.29834 1.44232,0.34937 0.1699,0.0244 0.35525,0.0525 0.41188,0.0624 0.25954,0.0453 1.47675,-0.017 1.83287,-0.0938 z m -18.39042,-1.90095 v -1.85346 l 0.75168,7.2e-4 c 1.09909,0.001 1.45393,0.0953 1.82867,0.48557 0.26165,0.27251 0.49727,0.68143 1.17342,2.03647 l 0.59088,1.18416 h 0.64905 c 0.35697,-10e-6 0.64904,-0.0103 0.64904,-0.023 0,-0.0615 -1.38249,-2.76002 -1.56667,-3.05805 -0.24349,-0.39401 -0.62713,-0.82154 -0.84011,-0.93624 -0.0808,-0.0435 -0.1465,-0.0888 -0.14605,-0.10062 4.5e-4,-0.0118 0.12637,-0.0805 0.27982,-0.15253 0.30847,-0.14484 0.63615,-0.43956 0.80044,-0.71993 0.20691,-0.35308 0.29634,-0.74691 0.29313,-1.29084 -0.006,-1.05405 -0.36649,-1.73924 -1.12368,-2.13713 -0.59787,-0.31417 -0.70622,-0.32785 -2.7321,-0.34496 l -1.80198,-0.0152 v 4.38923 4.38923 h 0.59723 0.59723 z m 12.80945,1.33861 v -0.51485 h -2.22415 -2.22415 v -1.56515 -1.56514 h 2.07999 2.07999 v -0.51485 -0.51485 h -2.07999 -2.07999 v -1.27682 -1.27683 h 2.16237 2.16236 v -0.51485 -0.51485 h -2.78018 -2.78019 v 4.38652 4.38651 h 2.84197 2.84197 z m 12.6447,-3.35682 v -3.87167 h 1.54455 1.54455 v -0.51485 -0.51485 h -3.70692 -3.70692 v 0.51485 0.51485 h 1.54455 1.54455 v 3.87167 3.87166 h 0.61782 0.61782 z"
+         id="path49151"
+         transform="translate(122.65281,188.48619)"
+         clip-path="url(#clipPath60701)" />
+      <path
+         style="fill:#5e6a71;fill-opacity:1;stroke-width:0.041188"
+         d="m 305.12035,140.83505 c -1.42717,-2.00868 -2.84073,-4.00065 -3.14127,-4.42659 l -0.54642,-0.77444 0.13817,-0.19669 c 0.076,-0.10818 1.48767,-2.11039 3.13707,-4.44935 l 2.9989,-4.25265 h 23.84172 23.84172 v 8.876 8.87601 l -23.83752,-9e-5 -23.83753,-8e-5 -2.59484,-3.65215 z m 49.5595,-5.23402 0.0104,-8.20669 h -23.30527 -23.30527 l -2.89037,4.09471 c -1.5897,2.25209 -2.89037,4.11616 -2.89037,4.14238 0,0.0511 5.71289,8.11468 5.78503,8.1654 0.0237,0.0166 10.5151,0.0259 23.31426,0.0206 l 23.27119,-0.01 z"
+         id="path54026"
+         transform="translate(122.65281,188.48619)"
+         clip-path="url(#clipPath60697)" />
+      <path
+         style="fill:#ffffff;fill-opacity:1;stroke-width:0.116497"
+         d="m 151.27151,141.5739 c -0.80092,-1.13346 -2.08979,-2.95668 -2.86417,-4.05158 l -1.40795,-1.99073 0.25302,-0.34309 c 0.13917,-0.1887 1.42247,-2.00754 2.85179,-4.04187 l 2.59876,-3.69878 h 23.22444 23.22443 v 8.09655 8.09655 l -23.21205,-0.003 -23.21206,-0.003 z m 27.50437,-1.956 c 1.1133,-0.3928 1.61991,-1.13291 1.61991,-2.36657 0,-1.56133 -0.76954,-2.2893 -2.91243,-2.75509 -1.6059,-0.34908 -1.98045,-0.60836 -1.98045,-1.37096 0,-0.34239 0.0808,-0.53382 0.33108,-0.78407 0.63872,-0.63871 1.73088,-0.7162 3.18587,-0.22605 0.36828,0.12406 0.72367,0.22557 0.78977,0.22557 0.0678,0 0.12017,-0.27526 0.12017,-0.6314 v -0.63139 l -0.80935,-0.18409 c -1.04889,-0.23856 -2.60092,-0.23847 -3.30137,1.9e-4 -0.81156,0.27652 -1.43659,0.96219 -1.60158,1.75693 -0.14511,0.69897 -0.0293,1.44993 0.30156,1.95482 0.2656,0.40536 1.19477,0.85185 2.33611,1.12256 1.8003,0.42702 2.14266,0.67846 2.14266,1.57372 0,0.57618 -0.3286,1.05099 -0.88955,1.28537 -0.78583,0.32834 -2.33171,0.1325 -3.44997,-0.43707 l -0.43687,-0.22252 v 0.70424 c 0,0.80635 -0.0206,0.7898 1.36503,1.09928 0.9109,0.20346 2.44591,0.14885 3.18941,-0.11347 z m -18.88358,-1.75515 v -1.8173 l 1.04097,0.0407 c 0.97132,0.038 1.06531,0.064 1.40476,0.38939 0.20008,0.19176 0.68838,0.991 1.0851,1.77608 l 0.72131,1.4274 0.73211,4.7e-4 0.7321,4.7e-4 -0.8132,-1.60266 c -0.44726,-0.88146 -0.99978,-1.82064 -1.22783,-2.08706 l -0.41464,-0.48441 0.39596,-0.24472 c 0.55668,-0.34405 0.81508,-0.94633 0.80906,-1.88576 -0.006,-0.92118 -0.26227,-1.51371 -0.86136,-1.99085 -0.5313,-0.42315 -1.33214,-0.55677 -3.34222,-0.55765 l -1.54359,-6e-4 v 4.42689 4.42689 h 0.64073 0.64074 z m 12.81468,1.29306 v -0.52424 h -2.21344 -2.21345 v -1.51446 -1.51446 h 2.09695 2.09695 v -0.58249 -0.58248 h -2.09695 -2.09695 v -1.22322 -1.22322 h 2.1552 2.15519 v -0.58456 -0.58456 l -2.82505,0.0312 -2.82506,0.0312 -0.0305,4.39777 -0.0305,4.39777 h 2.91383 2.91383 z m 12.69819,-3.32017 v -3.8444 h 1.51446 1.51446 v -0.58249 -0.58248 h -3.72791 -3.7279 v 0.58248 0.58249 h 1.51446 1.51446 v 3.8444 3.84441 h 0.69898 0.69899 z"
+         id="path54381"
+         transform="translate(122.65281,188.48619)"
+         clip-path="url(#clipPath60693)" />
+      <path
+         style="fill:#f0f1f1;fill-opacity:1;stroke-width:0.164752"
+         d="m 150.00652,139.62291 c -1.49512,-2.12602 -2.7184,-3.96474 -2.7184,-4.08604 0,-0.1213 1.22328,-1.97102 2.7184,-4.11049 l 2.71841,-3.88993 23.18881,-0.009 23.18882,-0.009 v 7.99046 7.99046 l -23.18882,-0.005 -23.18881,-0.005 z m 29.09805,-0.0639 c 1.11701,-0.50725 1.52891,-1.41935 1.30756,-2.89543 -0.14766,-0.98464 -0.81293,-1.63717 -2.03332,-1.99436 -2.22759,-0.65198 -2.51775,-0.76912 -2.68658,-1.08459 -0.24965,-0.46648 -0.0637,-1.03434 0.44873,-1.37008 0.55104,-0.36105 1.67651,-0.36896 2.85059,-0.02 0.49217,0.14627 0.91847,0.26594 0.94733,0.26594 0.0289,0 0.0525,-0.32748 0.0525,-0.72773 v -0.72773 l -0.83187,-0.1784 c -1.1475,-0.2461 -2.86016,-0.22347 -3.50585,0.0463 -1.55434,0.64944 -2.11573,2.94348 -0.97829,3.99762 0.23654,0.21923 1.06236,0.59169 1.84263,0.83108 2.14843,0.65913 2.32012,0.77103 2.32012,1.51216 0,1.47736 -1.76738,1.87645 -3.99692,0.90255 -0.34072,-0.14884 -0.66666,-0.22345 -0.7243,-0.16581 -0.0576,0.0576 -0.0381,0.42141 0.0435,0.80835 0.12737,0.60428 0.22957,0.73129 0.72431,0.90019 0.94021,0.32097 3.42236,0.26212 4.2199,-0.10006 z m -19.21294,-1.6779 v -1.82845 l 1.0297,0.11621 c 0.56633,0.0639 1.15649,0.22829 1.31146,0.36528 0.15497,0.13699 0.62182,0.9075 1.03745,1.71224 l 0.7557,1.46316 h 0.816 c 0.4488,0 0.816,-0.0495 0.816,-0.11002 0,-0.19458 -1.50546,-2.92002 -1.91197,-3.46138 l -0.3931,-0.5235 0.46605,-0.46605 c 0.81682,-0.81682 0.82586,-2.54094 0.0187,-3.56708 -0.46413,-0.59004 -1.24843,-0.76657 -3.41055,-0.76765 l -1.85346,-9.2e-4 v 4.4483 4.4483 h 0.65901 0.65901 z m 12.85064,1.25181 v -0.57663 h -2.22415 -2.22415 v -1.40039 -1.40039 h 2.14177 2.14178 v -0.65901 -0.65901 h -2.14178 -2.14177 v -1.15326 -1.15326 h 2.22415 2.22415 v -0.65901 -0.65901 h -2.96553 -2.96554 v 4.4483 4.4483 h 2.96554 2.96553 z m 12.68589,-3.21266 v -3.78929 h 1.56514 1.56514 v -0.65901 -0.65901 h -3.78929 -3.78929 v 0.65901 0.65901 h 1.48277 1.48276 v 3.78929 3.78929 h 0.74139 0.74138 z"
+         id="path54383"
+         transform="translate(122.65281,188.48619)"
+         clip-path="url(#clipPath60689)" />
+      <path
+         style="fill:none;fill-opacity:1;stroke:#000000;stroke-width:0.0582486"
+         d="m 149.29106,140.13447 c -1.66591,-2.34503 -3.0761,-4.33989 -3.13375,-4.43303 -0.12884,-0.20815 -0.52452,0.39541 3.18945,-4.86503 l 2.96812,-4.20404 h 23.81165 23.81165 v 8.88291 8.8829 l -23.8091,-1e-5 -23.8091,-1e-5 z m 50.00639,-4.55618 c 0,-4.4665 -0.0159,-8.16237 -0.0354,-8.21305 -0.0322,-0.0838 -2.13894,-0.0921 -23.29453,-0.0921 h -23.25917 l -0.17964,0.22682 c -0.0988,0.12475 -0.17964,0.25581 -0.17964,0.29124 0,0.0354 -0.0221,0.0644 -0.0491,0.0644 -0.027,0 -0.0985,0.0917 -0.15886,0.20387 -0.0604,0.11213 -0.12592,0.20387 -0.14563,0.20387 -0.0197,0 -0.0852,0.0917 -0.14562,0.20387 -0.0604,0.11213 -0.13004,0.20387 -0.15479,0.20387 -0.0248,0 -0.045,0.0393 -0.045,0.0874 0,0.0481 -0.0245,0.0874 -0.0543,0.0874 -0.0299,0 -0.069,0.0459 -0.087,0.10194 -0.018,0.0561 -0.0984,0.17808 -0.17864,0.27115 -0.0803,0.0931 -0.27046,0.3546 -0.42265,0.58119 -0.15219,0.22659 -0.32258,0.46337 -0.37865,0.52619 -0.0561,0.0628 -0.10193,0.13361 -0.10193,0.15732 0,0.0237 -0.0352,0.0783 -0.0783,0.12137 -0.043,0.043 -0.15181,0.19564 -0.2417,0.33909 -0.0899,0.14345 -0.17933,0.27393 -0.19875,0.28995 -0.0834,0.0688 -0.35501,0.46319 -0.35501,0.51549 0,0.0315 -0.0197,0.066 -0.0437,0.0767 -0.0679,0.0302 -0.36405,0.44161 -0.36405,0.50579 0,0.0315 -0.0222,0.066 -0.0494,0.0767 -0.0683,0.0269 -1.05736,1.4269 -1.05736,1.49674 0,0.0311 -0.0231,0.0653 -0.0514,0.076 -0.0641,0.0242 -1.11356,1.50651 -1.11356,1.57285 0,0.0266 0.0524,0.10082 0.1165,0.1649 0.0641,0.0641 0.1165,0.13249 0.1165,0.15204 0,0.0537 0.59474,0.86441 0.65048,0.88672 0.0267,0.0107 0.0485,0.0463 0.0485,0.0792 0,0.0706 0.57986,0.88271 0.65049,0.91099 0.0267,0.0107 0.0485,0.0503 0.0485,0.088 0,0.0377 0.0655,0.13923 0.14563,0.2256 0.0801,0.0864 0.14562,0.17305 0.14562,0.1926 0,0.0317 0.27462,0.42007 0.34916,0.49377 0.0162,0.016 0.15418,0.21541 0.30664,0.44309 0.15245,0.22769 0.32938,0.47416 0.39317,0.54771 0.0638,0.0736 0.116,0.15101 0.116,0.1721 0,0.0211 0.0472,0.0892 0.10485,0.15127 0.0577,0.0621 0.15506,0.19811 0.21643,0.30223 0.0614,0.10412 0.12618,0.18931 0.14402,0.18931 0.0178,0 0.0819,0.0917 0.14223,0.20387 0.0604,0.11212 0.13188,0.20387 0.15887,0.20387 0.027,0 0.0491,0.028 0.0491,0.0621 0,0.0516 0.24627,0.41862 0.34916,0.52035 0.0162,0.016 0.12984,0.17824 0.25252,0.36049 0.12269,0.18225 0.27341,0.3894 0.33493,0.46034 0.0615,0.0709 0.11186,0.14623 0.11186,0.16733 0,0.0211 0.0493,0.0912 0.10946,0.15584 0.0602,0.0646 0.18225,0.23339 0.27121,0.37504 0.089,0.14165 0.2263,0.34273 0.30519,0.44685 l 0.14345,0.18931 h 23.32163 23.32164 z"
+         id="path55282"
+         transform="translate(122.65281,188.48619)"
+         clip-path="url(#clipPath60685)" />
+      <rect
+         style="fill:none;fill-opacity:1;stroke:#000000;stroke-width:5.96092;stroke-linejoin:round;stroke-dasharray:none"
+         id="rect60677"
+         width="362.13153"
+         height="625.22229"
+         x="156.51996"
+         y="190.24973"
+         clip-path="url(#clipPath60681)" />
     </g>
     </g>
-    <text
-       y="293.47144"
-       x="168.09497"
-       id="text84343-2-0-4"
-       inkscape:transform-center-x="587.62742"
-       inkscape:transform-center-y="-134.7035"
-       style="font-size:27px;text-align:center;text-anchor:middle">
-      <tspan
-         style="font-size:11px;text-align:center;text-anchor:middle;fill:#37424b;font-family:ApexSans-Book"
-         x="123.1228"
-         y="293.47144"
-         font-size="5.1244"
-         id="tspan84345-2-6-5">READ ONLY</tspan>
-    </text>
-    <text
-       y="292.96655"
-       x="321.78174"
-       id="text84343-2-0-4-3"
-       inkscape:transform-center-x="587.62742"
-       inkscape:transform-center-y="-134.7035"
-       style="font-size:27px;text-align:center;text-anchor:middle">
-      <tspan
-         style="font-size:11px;text-align:center;text-anchor:middle;fill:#37424b;font-family:ApexSans-Book"
-         x="276.80957"
-         y="292.96655"
-         font-size="5.1244"
-         id="tspan84345-2-6-5-3">WRITE / READ</tspan>
-    </text>
-    <text
-       y="262.38412"
-       x="242.19797"
-       id="text84343-2-0-4-6"
-       inkscape:transform-center-x="587.62742"
-       inkscape:transform-center-y="-134.7035"
-       style="font-size:27px;text-align:center;text-anchor:middle">
-      <tspan
-         style="font-size:11px;text-align:center;text-anchor:middle;fill:#37424b;font-family:ApexSans-Book"
-         x="197.2258"
-         y="262.38412"
-         font-size="5.1244"
-         id="tspan84345-2-6-5-6">(United States)</tspan>
-    </text>
   </g>
 </svg>
   </g>
 </svg>
index b9323c452648e5b6f4775a9f6bb0c62eaf68c3e9..c6e68e3e61e2f338982370e8dd846011a0da6a0b 100644 (file)
@@ -2,8 +2,7 @@
  Welcome to Ceph
 =================
 
  Welcome to Ceph
 =================
 
-Ceph uniquely delivers **object, block, and file storage in one unified
-system**.
+Ceph delivers **object, block, and file storage in one unified system**.
 
 .. warning:: 
 
 
 .. warning:: 
 
@@ -112,8 +111,8 @@ about Ceph, see our `Architecture`_ section.
    governance
    foundation
    ceph-volume/index
    governance
    foundation
    ceph-volume/index
-   releases/general
-   releases/index
+   Ceph Releases (general) <https://docs.ceph.com/en/latest/releases/general/>
+   Ceph Releases (index) <https://docs.ceph.com/en/latest/releases/>
    security/index
    Glossary <glossary>
    Tracing <jaegertracing/index>
    security/index
    Glossary <glossary>
    Tracing <jaegertracing/index>
index da62ee93fa679c47bb2dca9468b5f418173a5c55..2d09ef9ebabe3add55e50e10a311b0ea22781686 100644 (file)
@@ -2,33 +2,37 @@
  Cloning the Ceph Source Code Repository
 =========================================
 
  Cloning the Ceph Source Code Repository
 =========================================
 
-You may clone a Ceph branch of the Ceph source code by going to `github Ceph
-Repository`_,  selecting a branch (``master`` by default), and clicking the
-**Download ZIP** button.
+To clone a Ceph branch of the Ceph source code, go to `github Ceph
+Repository`_, select a branch (``main`` by default), and click the **Download
+ZIP** button.
 
 .. _github Ceph Repository: https://github.com/ceph/ceph
 
 
 .. _github Ceph Repository: https://github.com/ceph/ceph
 
+To clone the entire git repository, :ref:`install <install-git>` and configure
+``git``.
 
 
-To clone the entire git repository, install and configure ``git``.
-
+.. _install-git:
 
 Install Git
 ===========
 
 
 Install Git
 ===========
 
-To install ``git`` on Debian/Ubuntu, execute::
+To install ``git`` on Debian/Ubuntu, run the following command:
+
+.. prompt:: bash $
 
 
-       sudo apt-get install git
+   sudo apt-get install git
 
 
 
 
-To install ``git`` on CentOS/RHEL, execute::
+To install ``git`` on CentOS/RHEL, run the following command:
 
 
-       sudo yum install git
+.. prompt:: bash $
 
 
+   sudo yum install git
 
 
-You must also have a ``github`` account. If you do not have a
-``github`` account, go to `github.com`_ and register.
-Follow the directions for setting up git at 
-`Set Up Git`_.
+
+You must have a ``github`` account. If you do not have a ``github``
+account, go to `github.com`_ and register.  Follow the directions for setting
+up git at `Set Up Git`_.
 
 .. _github.com: https://github.com
 .. _Set Up Git: https://help.github.com/linux-set-up-git
 
 .. _github.com: https://github.com
 .. _Set Up Git: https://help.github.com/linux-set-up-git
@@ -37,26 +41,31 @@ Follow the directions for setting up git at
 Add SSH Keys (Optional)
 =======================
 
 Add SSH Keys (Optional)
 =======================
 
-If you intend to commit code to Ceph or to clone using SSH
+To commit code to Ceph or to clone the respository by using SSH
 (``git@github.com:ceph/ceph.git``), you must generate SSH keys for github. 
 
 (``git@github.com:ceph/ceph.git``), you must generate SSH keys for github. 
 
-.. tip:: If you only intend to clone the repository, you may 
+.. tip:: If you want only to clone the repository, you can 
    use ``git clone --recursive https://github.com/ceph/ceph.git`` 
    without generating SSH keys.
 
    use ``git clone --recursive https://github.com/ceph/ceph.git`` 
    without generating SSH keys.
 
-To generate SSH keys for ``github``, execute::
+To generate SSH keys for ``github``, run the following command:
+
+.. prompt:: bash $
 
 
-       ssh-keygen
+   ssh-keygen
 
 
-Get the key to add to your ``github`` account (the following example
-assumes you used the default file path)::
+To print the SSH key that you just generated and that you will add to your
+``github`` account, use the ``cat`` command. (The following example assumes you
+used the default file path.):
 
 
-       cat .ssh/id_rsa.pub
+.. prompt:: bash $
+
+   cat .ssh/id_rsa.pub
 
 Copy the public key.
 
 
 Copy the public key.
 
-Go to your ``github`` account, click on "Account Settings" (i.e., the
-'tools' icon); then, click "SSH Keys" on the left side navbar.
+Go to your ``github`` account, click "Account Settings" (represented by the
+'tools' icon), and click "SSH Keys" on the left side navbar.
 
 Click "Add SSH key" in the "SSH Keys" list, enter a name for the key, paste the
 key you generated, and press the "Add key" button.
 
 Click "Add SSH key" in the "SSH Keys" list, enter a name for the key, paste the
 key you generated, and press the "Add key" button.
@@ -65,37 +74,122 @@ key you generated, and press the "Add key" button.
 Clone the Source
 ================
 
 Clone the Source
 ================
 
-To clone the Ceph source code repository, execute::
+To clone the Ceph source code repository, run the following command:
+
+.. prompt:: bash $
 
 
-       git clone --recursive https://github.com/ceph/ceph.git
+   git clone --recursive https://github.com/ceph/ceph.git
 
 
-Once ``git clone`` executes, you should have a full copy of the Ceph 
+After ``git clone`` has run, you should have a full copy of the Ceph 
 repository.
 
 repository.
 
-.. tip:: Make sure you maintain the latest copies of the submodules
-   included in the repository. Running ``git status`` will tell you if
-   the submodules are out of date.
+.. tip:: Make sure you maintain the latest copies of the submodules included in
+   the repository. Running ``git status`` will tell you whether the submodules
+   are out of date. See :ref:`update-submodules` for more information.
 
 
-::
 
 
-       cd ceph
-       git status
+.. prompt:: bash $
+
+   cd ceph
+   git status
+
+.. _update-submodules:
+
+Updating Submodules
+-------------------
+
+#. Determine whether your submodules are out of date:
+
+   .. prompt:: bash $
+
+      git status
+
+   A. If your submodules are up to date 
+         If your submodules are up to date, the following console output will
+         appear: 
 
 
-If your submodules are out of date, run::
+         ::
+   
+           On branch main
+           Your branch is up to date with 'origin/main'.
+           
+           nothing to commit, working tree clean
+   
+         If you see this console output, then your submodules are up to date.
+         You do not need this procedure.
 
 
-       git submodule update --force --init --recursive
+
+   B. If your submodules are not up to date 
+         If your submodules are not up to date, you will see a message that
+         includes a list of "untracked files". The example here shows such a
+         list, which was generated from a real situation in which the
+         submodules were no longer current. Your list of files will not be the
+         same as this list of files, but this list is provided as an example.
+         If in your case any untracked files are listed, then you should
+         continue to the next step of this procedure.
+
+         ::
+
+            On branch main
+            Your branch is up to date with 'origin/main'.
+            
+            Untracked files:
+              (use "git add <file>..." to include in what will be committed)
+            src/pybind/cephfs/build/
+            src/pybind/cephfs/cephfs.c
+            src/pybind/cephfs/cephfs.egg-info/
+            src/pybind/rados/build/
+            src/pybind/rados/rados.c
+            src/pybind/rados/rados.egg-info/
+            src/pybind/rbd/build/
+            src/pybind/rbd/rbd.c
+            src/pybind/rbd/rbd.egg-info/
+            src/pybind/rgw/build/
+            src/pybind/rgw/rgw.c
+            src/pybind/rgw/rgw.egg-info/
+            
+            nothing added to commit but untracked files present (use "git add" to track)
+
+#. If your submodules are out of date, run the following commands:
+
+   .. prompt:: bash $
+
+      git submodule update --force --init --recursive
+      git clean -fdx
+      git submodule foreach git clean -fdx
+
+   If you still have problems with a submodule directory, use ``rm -rf
+   [directory name]`` to remove the directory. Then run ``git submodule update
+   --init --recursive`` again.
+
+#. Run ``git status`` again:
+
+   .. prompt:: bash $
+
+      git status
+   
+   Your submodules are up to date if you see the following message:
+
+   ::
+
+     On branch main
+     Your branch is up to date with 'origin/main'.
+     
+     nothing to commit, working tree clean
 
 Choose a Branch
 ===============
 
 Once you clone the source code and submodules, your Ceph repository 
 
 Choose a Branch
 ===============
 
 Once you clone the source code and submodules, your Ceph repository 
-will be on the ``master`` branch by default, which is the unstable 
+will be on the ``main`` branch by default, which is the unstable 
 development branch. You may choose other branches too.
 
 development branch. You may choose other branches too.
 
-- ``master``: The unstable development branch.
-- ``stable``: The bugfix branch.
+- ``main``: The unstable development branch.
+- ``stable-release-name``: The name of the stable, `Active Releases`_. e.g. ``Pacific``
 - ``next``: The release candidate branch.
 
 ::
 
 - ``next``: The release candidate branch.
 
 ::
 
-       git checkout master
+       git checkout main
+
+.. _Active Releases: https://docs.ceph.com/en/latest/releases/#active-releases
index dd15cd3c4494c138851608ab8b329f907685c0c5..41bf59c7d62dc69e60fecd9de2ebb82189fda666 100644 (file)
@@ -19,7 +19,7 @@ Ceph Container Images
 Official Releases
 -----------------
 
 Official Releases
 -----------------
 
-Ceph Container images are available from both Quay and Docker Hub::
+Ceph Container images are available from Quay:
 
   https://quay.io/repository/ceph/ceph
   https://hub.docker.com/r/ceph
 
   https://quay.io/repository/ceph/ceph
   https://hub.docker.com/r/ceph
index ed2f5476047dde3f275c740f0e21eb72d14b53a5..c3c40b015cda36fce6e0d743d5baa50a01568952 100644 (file)
@@ -120,7 +120,7 @@ For RPMs::
 
   https://download.ceph.com/rpm-{version}
 
 
   https://download.ceph.com/rpm-{version}
 
-The major releases of Ceph are summarized at: :ref:`ceph-releases-general`
+The major releases of Ceph are summarized at: `Releases`_
 
 .. tip:: For non-US users: There might be a mirror close to you where
          to download Ceph from. For more information see: `Ceph Mirrors`_.
 
 .. tip:: For non-US users: There might be a mirror close to you where
          to download Ceph from. For more information see: `Ceph Mirrors`_.
@@ -376,6 +376,7 @@ line to get the short codename.
 
 
 
 
 
 
+.. _Releases: https://docs.ceph.com/en/latest/releases/
 .. _the testing Debian repository: https://download.ceph.com/debian-testing/dists
 .. _the shaman page: https://shaman.ceph.com
 .. _Ceph Mirrors: ../mirrors
 .. _the testing Debian repository: https://download.ceph.com/debian-testing/dists
 .. _the shaman page: https://shaman.ceph.com
 .. _Ceph Mirrors: ../mirrors
index 8f76477d12369d32a4159b760a397d894e817b47..58ef92a270c1963a53bee7ae5cc3480bea554f47 100644 (file)
@@ -4,33 +4,32 @@
 Installing Ceph
 ===============
 
 Installing Ceph
 ===============
 
-There are several different ways to install Ceph.  Choose the
-method that best suits your needs.
+There are multiple ways to install Ceph.  
 
 Recommended methods
 ~~~~~~~~~~~~~~~~~~~
 
 
 Recommended methods
 ~~~~~~~~~~~~~~~~~~~
 
-:ref:`Cephadm <cephadm>` installs and manages a Ceph cluster using containers and
-systemd, with tight integration with the CLI and dashboard GUI.
+:ref:`Cephadm <cephadm_deploying_new_cluster>` installs and manages a Ceph
+cluster that uses containers and systemd and is tightly integrated with the CLI
+and dashboard GUI.
 
 
-* cephadm only supports Octopus and newer releases.
-* cephadm is fully integrated with the new orchestration API and
-  fully supports the new CLI and dashboard features to manage
-  cluster deployment.
-* cephadm requires container support (podman or docker) and
+* cephadm supports only Octopus and newer releases.
+* cephadm is fully integrated with the orchestration API and fully supports the
+  CLI and dashboard features that are used to manage cluster deployment.
+* cephadm requires container support (in the form of Podman or Docker) and
   Python 3.
 
 `Rook <https://rook.io/>`_ deploys and manages Ceph clusters running
 in Kubernetes, while also enabling management of storage resources and
   Python 3.
 
 `Rook <https://rook.io/>`_ deploys and manages Ceph clusters running
 in Kubernetes, while also enabling management of storage resources and
-provisioning via Kubernetes APIs.  We recommend Rook as the way to run Ceph in
+provisioning via Kubernetes APIs. We recommend Rook as the way to run Ceph in
 Kubernetes or to connect an existing Ceph storage cluster to Kubernetes.
 
 Kubernetes or to connect an existing Ceph storage cluster to Kubernetes.
 
-* Rook only supports Nautilus and newer releases of Ceph.
+* Rook supports only Nautilus and newer releases of Ceph.
 * Rook is the preferred method for running Ceph on Kubernetes, or for
   connecting a Kubernetes cluster to an existing (external) Ceph
   cluster.
 * Rook is the preferred method for running Ceph on Kubernetes, or for
   connecting a Kubernetes cluster to an existing (external) Ceph
   cluster.
-* Rook supports the new orchestrator API. New management features
-  in the CLI and dashboard are fully supported.
+* Rook supports the orchestrator API. Management features in the CLI and
+  dashboard are fully supported.
 
 Other methods
 ~~~~~~~~~~~~~
 
 Other methods
 ~~~~~~~~~~~~~
@@ -39,16 +38,20 @@ Other methods
 Ceph clusters using Ansible.
 
 * ceph-ansible is widely deployed.
 Ceph clusters using Ansible.
 
 * ceph-ansible is widely deployed.
-* ceph-ansible is not integrated with the new orchestrator APIs,
-  introduced in Nautlius and Octopus, which means that newer
-  management features and dashboard integration are not available.
+* ceph-ansible is not integrated with the orchestrator APIs that were
+  introduced in Nautilus and Octopus, which means that the management features
+  and dashboard integration introduced in Nautilus and Octopus are not
+  available in Ceph clusters deployed by means of ceph-ansible.
 
 
 
 
-`ceph-deploy <https://docs.ceph.com/projects/ceph-deploy/en/latest/>`_ is a tool for quickly deploying clusters.
+`ceph-deploy <https://docs.ceph.com/projects/ceph-deploy/en/latest/>`_ is a
+tool that can be used to quickly deploy clusters. It is deprecated.
 
   .. IMPORTANT::
 
 
   .. IMPORTANT::
 
-   ceph-deploy is no longer actively maintained. It is not tested on versions of Ceph newer than Nautilus. It does not support RHEL8, CentOS 8, or newer operating systems.
+   ceph-deploy is not actively maintained. It is not tested on versions of Ceph
+   newer than Nautilus. It does not support RHEL8, CentOS 8, or newer operating
+   systems.
 
 `ceph-salt <https://github.com/ceph/ceph-salt>`_ installs Ceph using Salt and cephadm.
 
 
 `ceph-salt <https://github.com/ceph/ceph-salt>`_ installs Ceph using Salt and cephadm.
 
@@ -67,7 +70,7 @@ Ceph can also be :ref:`installed manually <install-manual>`.
 Windows
 ~~~~~~~
 
 Windows
 ~~~~~~~
 
-For Windows installations, please consult this document:
+For Windows installations, consult this document:
 `Windows installation guide`_.
 
 .. _Windows installation guide: ./windows-install
 `Windows installation guide`_.
 
 .. _Windows installation guide: ./windows-install
index 2536a7721e7132a4a33b409ad4169f65457731bd..5b631eeff744b3931196e7c45b40eb07a5ff5d65 100644 (file)
@@ -1,5 +1,7 @@
 :orphan:
 
 :orphan:
 
+.. _ceph_osd-daemon:
+
 ========================================
  ceph-osd -- ceph object storage daemon
 ========================================
 ========================================
  ceph-osd -- ceph object storage daemon
 ========================================
index ccbb6a8050f40c46432180118813f0f95931af20..fbf235e0662e8a5cb27171721dcbe045aa9fb89b 100644 (file)
@@ -16,15 +16,10 @@ Synopsis
 Description
 ===========
 
 Description
 ===========
 
-**ceph-rbdnamer** prints the pool and image name for the given RBD devices
-to stdout. It is used by `udev` (using a rule like the one below) to
-set up a device symlink.
-
-
-::
-
-        KERNEL=="rbd[0-9]*", PROGRAM="/usr/bin/ceph-rbdnamer %n", SYMLINK+="rbd/%c{1}/%c{2}"
-
+**ceph-rbdnamer** prints the pool, namespace, image and snapshot names
+for a given RBD device to stdout. It is used by `udev` device manager
+to set up RBD device symlinks. The appropriate `udev` rules are
+provided in a file named `50-rbd.rules`.
 
 Availability
 ============
 
 Availability
 ============
index 80c25ca2653fb70225e642bc90cc701abe636977..4c848659655d0cee9bc80789b42ca749fa29c0c2 100644 (file)
@@ -108,6 +108,16 @@ pools; it only runs simulations by mapping values in the range
    shows that value **24** is mapped to devices **[11,6]** by rule
    **1**.
 
    shows that value **24** is mapped to devices **[11,6]** by rule
    **1**.
 
+   One of the following is required when using the ``--show-mappings`` option:
+   
+        (a) ``--num-rep`` 
+        (b) both ``--min-rep`` and ``--max-rep``
+
+   ``--num-rep`` stands for "number of replicas, indicates the number of
+   replicas in a pool, and is used to specify an exact number of replicas (for
+   example ``--num-rep 5``). ``--min-rep`` and ``--max-rep`` are used together
+   to specify a range of replicas (for example, ``--min-rep 1 --max-rep 10``).
+
 .. option:: --show-bad-mappings
 
    Displays which value failed to be mapped to the required number of
 .. option:: --show-bad-mappings
 
    Displays which value failed to be mapped to the required number of
index 5c9052aaa875319976868b39828fd2cf96c9efae..fbe8790ddbdca11f53126fe4628994d16928784c 100644 (file)
@@ -22,6 +22,9 @@ the real work. To mount a Ceph file system use::
 
   mount.ceph name@07fe3187-00d9-42a3-814b-72a4d5e7d5be.fs_name=/ /mnt/mycephfs -o mon_addr=1.2.3.4
 
 
   mount.ceph name@07fe3187-00d9-42a3-814b-72a4d5e7d5be.fs_name=/ /mnt/mycephfs -o mon_addr=1.2.3.4
 
+where "name" is the RADOS client name (referred to hereafter as "RADOS user",
+and meaning any individual or system actor such as an application). 
+
 Mount helper can fill in the cluster FSID by reading the ceph configuration file.
 Its recommended to call the mount helper via mount(8) as per::
 
 Mount helper can fill in the cluster FSID by reading the ceph configuration file.
 Its recommended to call the mount helper via mount(8) as per::
 
@@ -113,6 +116,12 @@ Basic
       them. If an inode contains any stale file locks, read/write on the inode
       is not allowed until applications release all stale file locks.
 
       them. If an inode contains any stale file locks, read/write on the inode
       is not allowed until applications release all stale file locks.
 
+:command: `fs=<fs-name>`
+    Specify the non-default file system to be mounted, when using the old syntax.
+
+:command: `mds_namespace=<fs-name>`
+    A synonym of "fs=" (Deprecated).
+
 Advanced
 --------
 :command:`cap_release_safety`
 Advanced
 --------
 :command:`cap_release_safety`
@@ -226,6 +235,10 @@ If authentication is disabled on Ceph cluster, omit the credential related optio
 
     mount.ceph fs_user@.mycephfs2=/ /mnt/mycephfs
 
 
     mount.ceph fs_user@.mycephfs2=/ /mnt/mycephfs
 
+To mount using the old syntax::
+
+    mount -t ceph 192.168.0.1:/ /mnt/mycephfs
+
 Availability
 ============
 
 Availability
 ============
 
index 57d7fcfc902384dbbbdcf0355113de0a01a2b5d6..e099bba074df0753ca62ccfbb60614aa37b320e9 100644 (file)
@@ -743,6 +743,10 @@ Options
 
    The placement target index type (normal, indexless, or #id).
 
 
    The placement target index type (normal, indexless, or #id).
 
+.. option:: --placement-inline-data=<true>
+
+   Whether the placement target is configured to store a data chunk inline in head objects.
+
 .. option:: --tier-type=<type>
 
    The zone tier type.
 .. option:: --tier-type=<type>
 
    The zone tier type.
index 7876829dbe902c4f5fc2e0005fe73f7a77af075e..08686c9d34dd971ba60e5cb1ec52ab3f2c4c0dea 100644 (file)
@@ -9,7 +9,7 @@
 Synopsis
 ========
 
 Synopsis
 ========
 
-| **rbd-nbd** [-c conf] [--read-only] [--device *nbd device*] [--nbds_max *limit*] [--max_part *limit*] [--exclusive] [--notrim] [--encryption-format *format*] [--encryption-passphrase-file *passphrase-file*] [--io-timeout *seconds*] [--reattach-timeout *seconds*] map *image-spec* | *snap-spec*
+| **rbd-nbd** [-c conf] [--read-only] [--device *nbd device*] [--snap-id *snap-id*] [--nbds_max *limit*] [--max_part *limit*] [--exclusive] [--notrim] [--encryption-format *format*] [--encryption-passphrase-file *passphrase-file*] [--io-timeout *seconds*] [--reattach-timeout *seconds*] map *image-spec* | *snap-spec*
 | **rbd-nbd** unmap *nbd device* | *image-spec* | *snap-spec*
 | **rbd-nbd** list-mapped
 | **rbd-nbd** attach --device *nbd device* *image-spec* | *snap-spec*
 | **rbd-nbd** unmap *nbd device* | *image-spec* | *snap-spec*
 | **rbd-nbd** list-mapped
 | **rbd-nbd** attach --device *nbd device* *image-spec* | *snap-spec*
@@ -71,6 +71,10 @@ Options
    attached after the old process is detached. The default is 30
    second.
 
    attached after the old process is detached. The default is 30
    second.
 
+.. option:: --snap-id *snapid*
+
+   Specify a snapshot to map/unmap/attach/detach by ID instead of by name.
+
 Image and snap specs
 ====================
 
 Image and snap specs
 ====================
 
index 28ab9dcf9e129785a702281e94ddd70e37028d78..227cef16646cd6272c27ece847ba12eee8a83879 100644 (file)
@@ -258,7 +258,7 @@ Commands
   Show the rbd images that are mapped via the rbd kernel module
   (default) or other supported device.
 
   Show the rbd images that are mapped via the rbd kernel module
   (default) or other supported device.
 
-:command:`device map` [-t | --device-type *device-type*] [--cookie *device-cookie*] [--show-cookie] [--read-only] [--exclusive] [-o | --options *device-options*] *image-spec* | *snap-spec*
+:command:`device map` [-t | --device-type *device-type*] [--cookie *device-cookie*] [--show-cookie] [--snap-id *snap-id*] [--read-only] [--exclusive] [-o | --options *device-options*] *image-spec* | *snap-spec*
   Map the specified image to a block device via the rbd kernel module
   (default) or other supported device (*nbd* on Linux or *ggate* on
   FreeBSD).
   Map the specified image to a block device via the rbd kernel module
   (default) or other supported device (*nbd* on Linux or *ggate* on
   FreeBSD).
@@ -266,14 +266,14 @@ Commands
   The --options argument is a comma separated list of device type
   specific options (opt1,opt2=val,...).
 
   The --options argument is a comma separated list of device type
   specific options (opt1,opt2=val,...).
 
-:command:`device unmap` [-t | --device-type *device-type*] [-o | --options *device-options*] *image-spec* | *snap-spec* | *device-path*
+:command:`device unmap` [-t | --device-type *device-type*] [-o | --options *device-options*] [--snap-id *snap-id*] *image-spec* | *snap-spec* | *device-path*
   Unmap the block device that was mapped via the rbd kernel module
   (default) or other supported device.
 
   The --options argument is a comma separated list of device type
   specific options (opt1,opt2=val,...).
 
   Unmap the block device that was mapped via the rbd kernel module
   (default) or other supported device.
 
   The --options argument is a comma separated list of device type
   specific options (opt1,opt2=val,...).
 
-:command:`device attach` [-t | --device-type *device-type*] --device *device-path* [--cookie *device-cookie*] [--show-cookie] [--read-only] [--exclusive] [--force] [-o | --options *device-options*] *image-spec* | *snap-spec*
+:command:`device attach` [-t | --device-type *device-type*] --device *device-path* [--cookie *device-cookie*] [--show-cookie] [--snap-id *snap-id*] [--read-only] [--exclusive] [--force] [-o | --options *device-options*] *image-spec* | *snap-spec*
   Attach the specified image to the specified block device (currently only
   `nbd` on Linux). This operation is unsafe and should not be normally used.
   In particular, specifying the wrong image or the wrong block device may
   Attach the specified image to the specified block device (currently only
   `nbd` on Linux). This operation is unsafe and should not be normally used.
   In particular, specifying the wrong image or the wrong block device may
@@ -282,7 +282,7 @@ Commands
   The --options argument is a comma separated list of device type
   specific options (opt1,opt2=val,...).
 
   The --options argument is a comma separated list of device type
   specific options (opt1,opt2=val,...).
 
-:command:`device detach` [-t | --device-type *device-type*] [-o | --options *device-options*] *image-spec* | *snap-spec* | *device-path*
+:command:`device detach` [-t | --device-type *device-type*] [-o | --options *device-options*] [--snap-id *snap-id*] *image-spec* | *snap-spec* | *device-path*
   Detach the block device that was mapped or attached (currently only `nbd`
   on Linux). This operation is unsafe and should not be normally used.
 
   Detach the block device that was mapped or attached (currently only `nbd`
   on Linux). This operation is unsafe and should not be normally used.
 
index 3f3e92520e87b21c7aeb567a7f4b2d8e0a76ab52..faf4b4a1e6d3973a656e387def975a251242612d 100644 (file)
@@ -561,8 +561,10 @@ on appropriate hosts, proceed with the following steps.
       services run on a manager host will be restarted automatically on a different
       manager host if one Ceph Manager goes down.
 
       services run on a manager host will be restarted automatically on a different
       manager host if one Ceph Manager goes down.
 
-#.  Add Prometheus as data source to Grafana `using the Grafana Web UI
-    <https://grafana.com/docs/grafana/latest/features/datasources/add-a-data-source/>`_.
+#. Add Prometheus as data source to Grafana `using the Grafana Web UI <https://grafana.com/docs/grafana/latest/features/datasources/add-a-data-source/>`_.
+
+   .. IMPORTANT:: 
+      The data source must be named "Dashboard1".
 
 #.  Install the `vonage-status-panel and grafana-piechart-panel` plugins using:
 
 
 #.  Install the `vonage-status-panel and grafana-piechart-panel` plugins using:
 
@@ -1233,6 +1235,23 @@ code of standby dashboards. To do so you need to run the command:
 
    ceph config set mgr mgr/dashboard/standby_error_status_code 503
 
 
    ceph config set mgr mgr/dashboard/standby_error_status_code 503
 
+Resolve IP address to hostname before redirect
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
+The redirect from a standby to the active dashboard is done via the IP
+address. This is done because resolving IP addresses to hostnames can be error
+prone in containerized environments. It is also the reason why the option is
+disabled by default.
+However, in some situations it might be helpful to redirect via the hostname.
+For example if the configured TLS certificate matches only the hostnames. To
+activate the redirection via the hostname run the following command::
+
+  $ ceph config set mgr mgr/dashboard/redirect_resolve_ip_addr True
+
+You can disable it again by::
+
+  $ ceph config set mgr mgr/dashboard/redirect_resolve_ip_addr False
+
 HAProxy example configuration
 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
 
 HAProxy example configuration
 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
 
index 9fb3b87ae3f3e7afa0ca95f29bcd9a56a337dbc0..667664139739fef67e3a0eb44567039dd40f0af9 100644 (file)
@@ -108,9 +108,13 @@ following commands::
 Exposing commands
 -----------------
 
 Exposing commands
 -----------------
 
-There are two approaches for exposing a command. The first one is to
-use the ``@CLICommand`` decorator to decorate the method which handles
-the command. like this
+There are two approaches for exposing a command. The first method involves using
+the ``@CLICommand`` decorator to decorate the methods needed to handle a command.
+The second method uses a ``COMMANDS`` attribute defined for the module class.
+
+
+The CLICommand approach
+~~~~~~~~~~~~~~~~~~~~~~~
 
 .. code:: python
 
 
 .. code:: python
 
@@ -131,7 +135,7 @@ the command. like this
        else:
            location = blackhole
        self.send_object_to(obj, location)
        else:
            location = blackhole
        self.send_object_to(obj, location)
-       return HandleCommandResult(stdout=f'the black hole swallowed '{oid}'")
+       return HandleCommandResult(stdout=f"the black hole swallowed '{oid}'")
 
 The first parameter passed to ``CLICommand`` is the "name" of the command.
 Since there are lots of commands in Ceph, we tend to group related commands
 
 The first parameter passed to ``CLICommand`` is the "name" of the command.
 Since there are lots of commands in Ceph, we tend to group related commands
@@ -164,7 +168,11 @@ In addition to ``@CLICommand``, you could also use ``@CLIReadCommand`` or
 ``@CLIWriteCommand`` if your command only requires read permissions or
 write permissions respectively.
 
 ``@CLIWriteCommand`` if your command only requires read permissions or
 write permissions respectively.
 
-The second one is to set the ``COMMANDS`` class attribute of your module to
+
+The COMMANDS Approach
+~~~~~~~~~~~~~~~~~~~~~
+
+This method uses the ``COMMANDS`` class attribute of your module to define
 a list of dicts like this::
 
     COMMANDS = [
 a list of dicts like this::
 
     COMMANDS = [
@@ -197,6 +205,192 @@ when they are sent:
 .. py:currentmodule:: mgr_module
 .. automethod:: MgrModule.handle_command
 
 .. py:currentmodule:: mgr_module
 .. automethod:: MgrModule.handle_command
 
+
+Responses and Formatting
+~~~~~~~~~~~~~~~~~~~~~~~~
+
+Functions that handle manager commands are expected to return a three element
+tuple with the type signature ``Tuple[int, str, str]``. The first element is a
+return value/error code, where zero indicates no error and a negative `errno`_
+is typically used for error conditions.  The second element corresponds to the
+command's "output". The third element corresponds to the command's "error
+output" (akin to stderr) and is frequently used to report textual error details
+when the return code is non-zero. The ``mgr_module.HandleCommandResult`` type
+can also be used in lieu of a response tuple.
+
+.. _`errno`: https://man7.org/linux/man-pages/man3/errno.3.html
+
+When the implementation of a command raises an exception one of two possible
+approaches to handling the exception exist. First, the command function can do
+nothing and let the exception bubble up to the manager.  When this happens the
+manager will automatically set a return code to -EINVAL and record a trace-back
+in the error output. This trace-back can be very long in some cases. The second
+approach is to handle an exception within a try-except block and convert the
+exception to an error code that better fits the exception (converting a
+KeyError to -ENOENT, for example).  In this case the error output may also be
+set to something more specific and actionable by the one calling the command.
+
+In many cases, especially in more recent versions of Ceph, manager commands are
+designed to return structured output to the caller. Structured output includes
+machine-parsable data such as JSON, YAML, XML, etc. JSON is the most common
+structured output format returned by manager commands. As of Ceph Reef, there
+are a number of new decorators available from the ``object_format`` module that
+help manage formatting output and handling exceptions automatically.  The
+intent is that most of the implementation of a manager command can be written in
+an idiomatic (aka "Pythonic") style and the decorators will take care of most of
+the work needed to format the output and return manager response tuples.
+
+In most cases, net new code should use the ``Responder`` decorator. Example:
+
+.. code:: python
+
+   @CLICommand('antigravity list wormholes', perm='r')
+   @Responder()
+   def list_wormholes(self, oid: str, details: bool = False) -> List[Dict[str, Any]]:
+       '''List wormholes associated with the supplied oid.
+       '''
+       with self.open_wormhole_db() as db:
+           wormholes = db.query(oid=oid)
+       if not details:
+           return [{'name': wh.name} for wh in wormholes]
+       return [{'name': wh.name, 'age': wh.get_age(), 'destination': wh.dest}
+               for wh in wormholes]
+
+Formatting
+++++++++++
+
+The ``Responder`` decorator automatically takes care of converting Python
+objects into a response tuple with formatted output. By default, this decorator
+can automatically return JSON and YAML. When invoked from the command line the
+``--format`` flag can be used to select the response format. If left
+unspecified, JSON will be returned. The automatic formatting can be applied to
+any basic Python type: lists, dicts, str, int, etc. Other objects can be
+formatted automatically if they meet the ``SimpleDataProvider`` protocol - they
+provide a ``to_simplified`` method. The ``to_simplified`` function must return
+a simplified representation of the object made out of basic types.
+
+.. code:: python
+
+   class MyCleverObject:
+       def to_simplified(self) -> Dict[str, int]:
+           # returns a python object(s) made up from basic types
+           return {"gravitons": 999, "tachyons": 404}
+
+   @CLICommand('antigravity list wormholes', perm='r')
+   @Responder()
+   def list_wormholes(self, oid: str, details: bool = False) -> MyCleverObject:
+       '''List wormholes associated with the supplied oid.
+       '''
+       ...
+
+The behavior of the automatic output formatting can be customized and extednted
+to other types of formatting (XML, Plain Text, etc). As this is a complex
+topic, please refer to the module documentation for the ``object_format``
+module.
+
+
+
+Error Handling
+++++++++++++++
+
+Additionally, the ``Responder`` decorator can automatically handle converting
+some  exceptions into response tuples. Any raised exception inheriting from
+``ErrorResponseBase`` will be automatically converted into a response tuple.
+The common approach will be to use ``ErrorResponse``, an exception type that
+can be used directly and has arguments for the error output and return value or
+it can be constructed from an existing exception using the ``wrap``
+classmethod. The wrap classmethod will automatically use the exception text and
+if available the ``errno`` property of other exceptions.
+
+Converting our previous example to use this exception handling approach:
+
+.. code:: python
+
+   @CLICommand('antigravity list wormholes', perm='r')
+   @Responder()
+   def list_wormholes(self, oid: str, details: bool = False) -> List[Dict[str, Any]]:
+       '''List wormholes associated with the supplied oid.
+       '''
+       try:
+           with self.open_wormhole_db() as db:
+               wormholes = db.query(oid=oid)
+       except UnknownOIDError:
+            raise ErrorResponse(f"Unknown oid: {oid}", return_value=-errno.ENOENT)
+       except WormholeDBError as err:
+           raise ErrorResponse.wrap(err)
+       if not details:
+           return [{'name': wh.name} for wh in wormholes]
+       return [{'name': wh.name, 'age': wh.get_age(), 'destination': wh.dest}
+               for wh in wormholes]
+
+
+.. note:: Because the decorator can not determine the difference between a
+   programming mistake and an expected error condition it does not try to
+   catch all exceptions.
+
+
+
+Additional Decorators
++++++++++++++++++++++
+
+The ``object_format`` module provides additional decorators to complement
+``Responder`` but for cases where ``Responder`` is insufficient or too "heavy
+weight".
+
+The ``ErrorResponseHandler`` decorator exists for cases where you *must* still
+return a manager response tuple but want to handle errors as exceptions (as in
+typical Python code). In short, it works like ``Responder`` but only with
+regards to exceptions. Just like ``Responder`` it handles exceptions that
+inherit from ``ErrorResponseBase``. This can be useful in cases where you need
+to return raw data in the output. Example:
+
+.. code:: python
+
+   @CLICommand('antigravity dump config', perm='r')
+   @ErrorResponseHandler()
+   def dump_config(self, oid: str) -> Tuple[int, str, str]:
+       '''Dump configuration
+       '''
+       # we have no control over what data is inside the blob!
+       try:
+            blob = self.fetch_raw_config_blob(oid)
+            return 0, blob, ''
+       except KeyError:
+            raise ErrorResponse("Blob does not exist", return_value=-errno.ENOENT)
+
+
+The ``EmptyResponder`` decorator exists for cases where, on a success
+condition, no output should be generated at all. If you used ``Responder`` and
+default JSON formatting you may always see outputs like ``{}`` or ``[]`` if the
+command completes without error. Instead, ``EmptyResponder`` helps you create
+manager commands that obey the `Rule of Silence`_ when the command has no
+interesting output to emit on success. The functions that ``EmptyResponder``
+decorate should always return ``None``. Like both ``Responder`` and
+``ErrorResponseHandler`` exceptions that inhert from ``ErrorResponseBase`` will
+be automatically processed. Example:
+
+.. code:: python
+
+   @CLICommand('antigravity create wormhole', perm='rw')
+   @EmptyResponder()
+   def create_wormhole(self, oid: str, name: str) -> None:
+       '''Create a new wormhole.
+       '''
+       try:
+           with self.open_wormhole_db() as db:
+               wh = Wormhole(name)
+               db.insert(oid=oid, wormhole=wh)
+       except UnknownOIDError:
+           raise ErrorResponse(f"Unknown oid: {oid}", return_value=-errno.ENOENT)
+       except InvalidWormholeError as err:
+           raise ErrorResponse.wrap(err)
+       except WormholeDBError as err:
+           raise ErrorResponse.wrap(err)
+
+
+.. _`Rule of Silence`: http://www.linfo.org/rule_of_silence.html
+
+
 Configuration options
 ---------------------
 
 Configuration options
 ---------------------
 
@@ -314,6 +508,7 @@ function. This will result in a circular locking exception.
 .. automethod:: MgrModule.get_perf_schema
 .. automethod:: MgrModule.get_counter
 .. automethod:: MgrModule.get_mgr_id
 .. automethod:: MgrModule.get_perf_schema
 .. automethod:: MgrModule.get_counter
 .. automethod:: MgrModule.get_mgr_id
+.. automethod:: MgrModule.get_daemon_health_metrics
 
 Exposing health checks
 ----------------------
 
 Exposing health checks
 ----------------------
index 777e2ee8173b20cda0e62f59d47d7eaed6de52c4..a79d994ddb3818cfdd9da628607e23b9c5179262 100644 (file)
@@ -239,7 +239,7 @@ Create CephFS Export
 
 .. code:: bash
 
 
 .. code:: bash
 
-    $ ceph nfs export create cephfs --cluster-id <cluster_id> --pseudo-path <pseudo_path> --fsname <fsname> [--readonly] [--path=/path/in/cephfs] [--client_addr <value>...] [--squash <value>]
+    $ ceph nfs export create cephfs --cluster-id <cluster_id> --pseudo-path <pseudo_path> --fsname <fsname> [--readonly] [--path=/path/in/cephfs] [--client_addr <value>...] [--squash <value>] [--sectype <value>...]
 
 This creates export RADOS objects containing the export block, where
 
 
 This creates export RADOS objects containing the export block, where
 
@@ -266,6 +266,18 @@ for permissible values.
 value is `no_root_squash`. See the `NFS-Ganesha Export Sample`_ for
 permissible values.
 
 value is `no_root_squash`. See the `NFS-Ganesha Export Sample`_ for
 permissible values.
 
+``<sectype>`` specifies which authentication methods will be used when
+connecting to the export. Valid values include "krb5p", "krb5i", "krb5", "sys",
+and "none". More than one value can be supplied. The flag may be specified
+multiple times (example: ``--sectype=krb5p --sectype=krb5i``) or multiple
+values may be separated by a comma (example: ``--sectype krb5p,krb5i``). The
+server will negotatiate a supported security type with the client preferring
+the supplied methods left-to-right.
+
+.. note:: Specifying values for sectype that require Kerberos will only function on servers
+          that are configured to support Kerberos. Setting up NFS-Ganesha to support Kerberos
+          is outside the scope of this document.
+
 .. note:: Export creation is supported only for NFS Ganesha clusters deployed using nfs interface.
 
 Create RGW Export
 .. note:: Export creation is supported only for NFS Ganesha clusters deployed using nfs interface.
 
 Create RGW Export
@@ -285,7 +297,7 @@ To export a *bucket*:
 
 .. code::
 
 
 .. code::
 
-   $ ceph nfs export create rgw --cluster-id <cluster_id> --pseudo-path <pseudo_path> --bucket <bucket_name> [--user-id <user-id>] [--readonly] [--client_addr <value>...] [--squash <value>]
+   $ ceph nfs export create rgw --cluster-id <cluster_id> --pseudo-path <pseudo_path> --bucket <bucket_name> [--user-id <user-id>] [--readonly] [--client_addr <value>...] [--squash <value>] [--sectype <value>...]
 
 For example, to export *mybucket* via NFS cluster *mynfs* at the pseudo-path */bucketdata* to any host in the ``192.168.10.0/24`` network
 
 
 For example, to export *mybucket* via NFS cluster *mynfs* at the pseudo-path */bucketdata* to any host in the ``192.168.10.0/24`` network
 
@@ -316,6 +328,18 @@ for permissible values.
 value is `no_root_squash`. See the `NFS-Ganesha Export Sample`_ for
 permissible values.
 
 value is `no_root_squash`. See the `NFS-Ganesha Export Sample`_ for
 permissible values.
 
+``<sectype>`` specifies which authentication methods will be used when
+connecting to the export. Valid values include "krb5p", "krb5i", "krb5", "sys",
+and "none". More than one value can be supplied. The flag may be specified
+multiple times (example: ``--sectype=krb5p --sectype=krb5i``) or multiple
+values may be separated by a comma (example: ``--sectype krb5p,krb5i``). The
+server will negotatiate a supported security type with the client preferring
+the supplied methods left-to-right.
+
+.. note:: Specifying values for sectype that require Kerberos will only function on servers
+          that are configured to support Kerberos. Setting up NFS-Ganesha to support Kerberos
+          is outside the scope of this document.
+
 RGW user export
 ^^^^^^^^^^^^^^^
 
 RGW user export
 ^^^^^^^^^^^^^^^
 
index bed07746d2514f71c97e462ae2e19b1f98f7f79b..388353b84adcfdf6121bec4064896d731760b790 100644 (file)
@@ -183,17 +183,18 @@ List all collections with::
 
   ceph telemetry collection ls
 
 
   ceph telemetry collection ls
 
-  NAME                  STATUS                                               DESC
-  basic_base            REPORTING                                            Basic information about the cluster (capacity, number and type of daemons, version, etc.)
-  basic_mds_metadata    NOT REPORTING: NOT OPTED-IN                          MDS metadata
-  basic_pool_usage      NOT REPORTING: NOT OPTED-IN                          Default pool application and usage statistics
-  basic_usage_by_class  NOT REPORTING: NOT OPTED-IN                          Default device class usage statistics
-  crash_base            REPORTING                                            Information about daemon crashes (daemon type and version, backtrace, etc.)
-  device_base           REPORTING                                            Information about device health metrics
-  ident_base            NOT REPORTING: CHANNEL ident IS OFF                  User-provided identifying information about the cluster
-  perf_memory_metrics   NOT REPORTING: NOT OPTED-IN, CHANNEL perf IS OFF     Heap stats and mempools for mon and mds
-  perf_perf             NOT REPORTING: NOT OPTED-IN, CHANNEL perf IS OFF     Information about performance counters of the cluster
-
+  NAME                            STATUS                                               DESC
+  basic_base                      NOT REPORTING: NOT OPTED-IN                          Basic information about the cluster (capacity, number and type of daemons, version, etc.)
+  basic_mds_metadata              NOT REPORTING: NOT OPTED-IN                          MDS metadata
+  basic_pool_options_bluestore    NOT REPORTING: NOT OPTED-IN                          Per-pool bluestore config options
+  basic_pool_usage                NOT REPORTING: NOT OPTED-IN                          Default pool application and usage statistics
+  basic_rook_v01                  NOT REPORTING: NOT OPTED-IN                          Basic Rook deployment data
+  basic_usage_by_class            NOT REPORTING: NOT OPTED-IN                          Default device class usage statistics
+  crash_base                      NOT REPORTING: NOT OPTED-IN                          Information about daemon crashes (daemon type and version, backtrace, etc.)
+  device_base                     NOT REPORTING: NOT OPTED-IN                          Information about device health metrics
+  ident_base                      NOT REPORTING: NOT OPTED-IN, CHANNEL ident IS OFF    User-provided identifying information about the cluster
+  perf_memory_metrics             NOT REPORTING: NOT OPTED-IN, CHANNEL perf IS OFF     Heap stats and mempools for mon and mds
+  perf_perf                       NOT REPORTING: NOT OPTED-IN, CHANNEL perf IS OFF     Information about performance counters of the cluster
 
 Where:
 
 
 Where:
 
index 51de06d98a8507368d8f92539d7c56b8bc3d90ee..5422ce8717b56b84d59ee03f914dc24b69cc84d5 100644 (file)
@@ -6,7 +6,7 @@
 
 The :term:`Ceph Storage Cluster` has a messaging layer protocol that enables
 clients to interact with a :term:`Ceph Monitor` and a :term:`Ceph OSD Daemon`.
 
 The :term:`Ceph Storage Cluster` has a messaging layer protocol that enables
 clients to interact with a :term:`Ceph Monitor` and a :term:`Ceph OSD Daemon`.
-``librados`` provides this functionality to :term:`Ceph Clients` in the form of
+``librados`` provides this functionality to :term:`Ceph Client`\s in the form of
 a library.  All Ceph Clients either use ``librados`` or the same functionality
 encapsulated in ``librados`` to interact with the object store.  For example,
 ``librbd`` and ``libcephfs`` leverage this functionality. You may use
 a library.  All Ceph Clients either use ``librados`` or the same functionality
 encapsulated in ``librados`` to interact with the object store.  For example,
 ``librbd`` and ``libcephfs`` leverage this functionality. You may use
index 76ab306bb1b53a135df2674bb183287a809c75c3..beee4a466a34e840cce6f5b926c71c7739b2a3af 100644 (file)
@@ -426,6 +426,22 @@ the asynchronous writes as well as an asynchronous update to the size of the
 striped file.
 
 
 striped file.
 
 
+Debugging
+^^^^^^^^^
+
+Debugging libcephsqlite can be turned on via::
+
+    debug_cephsqlite
+
+If running the ``sqlite3`` command-line tool, use:
+
+.. code:: sh
+
+   env CEPH_ARGS='--log_to_file true --log-file sqlite3.log --debug_cephsqlite 20 --debug_ms 1' sqlite3 ...
+
+This will save all the usual Ceph debugging to a file ``sqlite3.log`` for inspection.
+
+
 .. _SQLite: https://sqlite.org/index.html
 .. _SQLite VFS: https://www.sqlite.org/vfs.html
 .. _SQLite Backup: https://www.sqlite.org/backup.html
 .. _SQLite: https://sqlite.org/index.html
 .. _SQLite VFS: https://www.sqlite.org/vfs.html
 .. _SQLite Backup: https://www.sqlite.org/backup.html
index 01ed49b92dd123e99caf35bd99757aadf1a77e6c..ed60f97b137965b47491b981085b20612554afe4 100644 (file)
@@ -43,19 +43,25 @@ Getting librados for C/C++
 --------------------------
 
 To install ``librados`` development support files for C/C++ on Debian/Ubuntu
 --------------------------
 
 To install ``librados`` development support files for C/C++ on Debian/Ubuntu
-distributions, execute the following::
+distributions, execute the following:
 
 
-       sudo apt-get install librados-dev
+.. prompt:: bash $
+
+   sudo apt-get install librados-dev
 
 To install ``librados`` development support files for C/C++ on RHEL/CentOS
 
 To install ``librados`` development support files for C/C++ on RHEL/CentOS
-distributions, execute the following::
+distributions, execute the following:
+
+.. prompt:: bash $
 
 
-       sudo yum install librados2-devel
+   sudo yum install librados2-devel
 
 Once you install ``librados`` for developers, you can find the required 
 
 Once you install ``librados`` for developers, you can find the required 
-headers for C/C++ under ``/usr/include/rados``. ::
+headers for C/C++ under ``/usr/include/rados``:
+
+.. prompt:: bash $
 
 
-       ls /usr/include/rados
+   ls /usr/include/rados
 
 
 Getting librados for Python
 
 
 Getting librados for Python
@@ -68,14 +74,25 @@ and the ``librados2-devel`` package for RHEL/CentOS will install the
 directly too.
 
 To install ``librados`` development support files for Python on Debian/Ubuntu
 directly too.
 
 To install ``librados`` development support files for Python on Debian/Ubuntu
-distributions, execute the following::
+distributions, execute the following:
 
 
-       sudo apt-get install python-rados
+.. prompt:: bash $
+
+   sudo apt-get install python3-rados
 
 To install ``librados`` development support files for Python on RHEL/CentOS
 
 To install ``librados`` development support files for Python on RHEL/CentOS
-distributions, execute the following::
+distributions, execute the following:
+
+.. prompt:: bash $
+
+   sudo yum install python-rados
 
 
-       sudo yum install python-rados
+To install ``librados`` development support files for Python on SLE/openSUSE
+distributions, execute the following:
+
+.. prompt:: bash $
+
+   sudo zypper install python3-rados
 
 You can find the module under ``/usr/share/pyshared`` on Debian systems,
 or under ``/usr/lib/python*/site-packages`` on CentOS/RHEL systems.
 
 You can find the module under ``/usr/share/pyshared`` on Debian systems,
 or under ``/usr/lib/python*/site-packages`` on CentOS/RHEL systems.
@@ -86,37 +103,49 @@ Getting librados for Java
 
 To install ``librados`` for Java, you need to execute the following procedure:
 
 
 To install ``librados`` for Java, you need to execute the following procedure:
 
-#. Install ``jna.jar``. For Debian/Ubuntu, execute:: 
+#. Install ``jna.jar``. For Debian/Ubuntu, execute:
+
+   .. prompt:: bash $
 
 
-       sudo apt-get install libjna-java
+      sudo apt-get install libjna-java
 
 
-   For CentOS/RHEL, execute::
+   For CentOS/RHEL, execute:
 
 
-       sudo yum install jna
+   .. prompt:: bash $
+
+      sudo yum install jna
 
    The JAR files are located in ``/usr/share/java``.
 
 
    The JAR files are located in ``/usr/share/java``.
 
-#. Clone the ``rados-java`` repository::
+#. Clone the ``rados-java`` repository:
+
+   .. prompt:: bash $
 
 
-       git clone --recursive https://github.com/ceph/rados-java.git
+      git clone --recursive https://github.com/ceph/rados-java.git
 
 
-#. Build the ``rados-java`` repository:
+#. Build the ``rados-java`` repository:
 
 
-       cd rados-java
-       ant
+   .. prompt:: bash $
+
+      cd rados-java
+      ant
 
    The JAR file is located under ``rados-java/target``.
 
 #. Copy the JAR for RADOS to a common location (e.g., ``/usr/share/java``) and 
 
    The JAR file is located under ``rados-java/target``.
 
 #. Copy the JAR for RADOS to a common location (e.g., ``/usr/share/java``) and 
-   ensure that it and the JNA JAR are in your JVM's classpath. For example::
+   ensure that it and the JNA JAR are in your JVM's classpath. For example:
+
+   .. prompt:: bash $
+
+      sudo cp target/rados-0.1.3.jar /usr/share/java/rados-0.1.3.jar
+      sudo ln -s /usr/share/java/jna-3.2.7.jar /usr/lib/jvm/default-java/jre/lib/ext/jna-3.2.7.jar  
+      sudo ln -s /usr/share/java/rados-0.1.3.jar  /usr/lib/jvm/default-java/jre/lib/ext/rados-0.1.3.jar
 
 
-       sudo cp target/rados-0.1.3.jar /usr/share/java/rados-0.1.3.jar
-       sudo ln -s /usr/share/java/jna-3.2.7.jar /usr/lib/jvm/default-java/jre/lib/ext/jna-3.2.7.jar  
-       sudo ln -s /usr/share/java/rados-0.1.3.jar  /usr/lib/jvm/default-java/jre/lib/ext/rados-0.1.3.jar
+To build the documentation, execute the following:
 
 
-To build the documentation, execute the following::
+.. prompt:: bash $
 
 
-       ant docs
+   ant docs
 
 
 Getting librados for PHP
 
 
 Getting librados for PHP
@@ -124,29 +153,37 @@ Getting librados for PHP
 
 To install the ``librados`` extension for PHP, you need to execute the following procedure:
 
 
 To install the ``librados`` extension for PHP, you need to execute the following procedure:
 
-#. Install php-dev. For Debian/Ubuntu, execute::
+#. Install php-dev. For Debian/Ubuntu, execute:
+
+   .. prompt:: bash $
+
+      sudo apt-get install php5-dev build-essential
+
+   For CentOS/RHEL, execute:
 
 
-       sudo apt-get install php5-dev build-essential
+   .. prompt:: bash $
 
 
-   For CentOS/RHEL, execute::
+      sudo yum install php-devel
 
 
-       sudo yum install php-devel
+#. Clone the ``phprados`` repository:
 
 
-#. Clone the ``phprados`` repository::
+   .. prompt:: bash $
 
 
-       git clone https://github.com/ceph/phprados.git
+      git clone https://github.com/ceph/phprados.git
 
 
-#. Build ``phprados``::
+#. Build ``phprados``:
 
 
-       cd phprados
-       phpize
-       ./configure
-       make
-       sudo make install
+   .. prompt:: bash $
 
 
-#. Enable ``phprados`` in php.ini by adding::
+      cd phprados
+      phpize
+      ./configure
+      make
+      sudo make install
 
 
-       extension=rados.so
+#. Enable ``phprados`` by adding the following line to ``php.ini``::
+   
+      extension=rados.so
 
 
 Step 2: Configuring a Cluster Handle
 
 
 Step 2: Configuring a Cluster Handle
@@ -321,9 +358,11 @@ it and connecting to the cluster might look something like this:
 
        }
 
 
        }
 
-Compile your client and link to ``librados`` using ``-lrados``. For example:
+Compile your client and link to ``librados`` using ``-lrados``. For example:
 
 
-       gcc ceph-client.c -lrados -o ceph-client
+.. prompt:: bash $
+
+   gcc ceph-client.c -lrados -o ceph-client
 
 
 C++ Example
 
 
 C++ Example
@@ -399,10 +438,12 @@ you to initialize a ``librados::Rados`` cluster handle object:
        
 
 Compile the source; then, link ``librados`` using ``-lrados``. 
        
 
 Compile the source; then, link ``librados`` using ``-lrados``. 
-For example::
+For example:
+
+.. prompt:: bash $
 
 
-       g++ -g -c ceph-client.cc -o ceph-client.o
-       g++ -g ceph-client.o -lrados -o ceph-client
+   g++ -g -c ceph-client.cc -o ceph-client.o
+   g++ -g ceph-client.o -lrados -o ceph-client
 
 
 
 
 
 
@@ -436,9 +477,11 @@ into exceptions.
                print("Connected to the cluster.")
 
 
                print("Connected to the cluster.")
 
 
-Execute the example to verify that it connects to your cluster. ::
+Execute the example to verify that it connects to your cluster:
+
+.. prompt:: bash $
 
 
-       python ceph-client.py
+   python ceph-client.py
 
 
 Java Example
 
 
 Java Example
@@ -478,10 +521,12 @@ binding converts C++-based errors into exceptions.
 
 Compile the source; then, run it. If you have copied the JAR to
 ``/usr/share/java`` and sym linked from your ``ext`` directory, you won't need
 
 Compile the source; then, run it. If you have copied the JAR to
 ``/usr/share/java`` and sym linked from your ``ext`` directory, you won't need
-to specify the classpath. For example::
+to specify the classpath. For example:
 
 
-       javac CephClient.java
-       java CephClient
+.. prompt:: bash $
+
+   javac CephClient.java
+   java CephClient
 
 
 PHP Example
 
 
 PHP Example
@@ -502,9 +547,11 @@ With the RADOS extension enabled in PHP you can start creating a new cluster han
        }
 
 
        }
 
 
-Save this as rados.php and run the code::
+Save this as rados.php and run the code:
+
+.. prompt:: bash $
 
 
-       php rados.php
+   php rados.php
 
 
 Step 3: Creating an I/O Context
 
 
 Step 3: Creating an I/O Context
index 00c04e83f97c06f9fc585a062ca94c77cb3c2312..d252da01c404335225463fb2c873cf45109b6f5c 100644 (file)
@@ -68,7 +68,7 @@ Your Python client also requires a client keyring. For this example, we use the
 ``client.admin`` key by default. If you would like to specify the keyring when
 creating the cluster handle, you may use the ``conf`` argument. Alternatively,
 you may specify the keyring path in your Ceph configuration file. For example,
 ``client.admin`` key by default. If you would like to specify the keyring when
 creating the cluster handle, you may use the ``conf`` argument. Alternatively,
 you may specify the keyring path in your Ceph configuration file. For example,
-you may add something like the following line to you Ceph configuration file::
+you may add something like the following line to your Ceph configuration file::
 
        keyring = /path/to/ceph.client.admin.keyring
 
 
        keyring = /path/to/ceph.client.admin.keyring
 
index 5abb5dc4ea7ee9ec42262ea2a17d69ebd4c5c03f..0e5455d11c235281eaf80db880a329166e18a1e1 100644 (file)
@@ -166,9 +166,11 @@ specify a ``keyring`` entry in your Ceph configuration file.
 We recommend copying the Ceph Storage Cluster's keyring file to nodes where you
 will run administrative commands, because it contains the ``client.admin`` key.
 
 We recommend copying the Ceph Storage Cluster's keyring file to nodes where you
 will run administrative commands, because it contains the ``client.admin`` key.
 
-To perform this step manually, execute the following::
+To perform this step manually, execute the following:
 
 
-       sudo scp {user}@{ceph-cluster-host}:/etc/ceph/ceph.client.admin.keyring /etc/ceph/ceph.client.admin.keyring
+.. prompt:: bash $
+
+   sudo scp {user}@{ceph-cluster-host}:/etc/ceph/ceph.client.admin.keyring /etc/ceph/ceph.client.admin.keyring
 
 .. tip:: Ensure the ``ceph.keyring`` file has appropriate permissions set
    (e.g., ``chmod 644``) on your client machine.
 
 .. tip:: Ensure the ``ceph.keyring`` file has appropriate permissions set
    (e.g., ``chmod 644``) on your client machine.
index cf6f63c20aedd377f05d41030f1a6e3ad972fcb7..c927066bef79f5b5580a0c4647a10808092a4eed 100644 (file)
@@ -42,13 +42,17 @@ it will fit).  This means that if a DB device is specified but an explicit
 WAL device is not, the WAL will be implicitly colocated with the DB on the faster
 device.
 
 WAL device is not, the WAL will be implicitly colocated with the DB on the faster
 device.
 
-A single-device (colocated) BlueStore OSD can be provisioned with::
+A single-device (colocated) BlueStore OSD can be provisioned with:
 
 
-  ceph-volume lvm prepare --bluestore --data <device>
+.. prompt:: bash $
 
 
-To specify a WAL device and/or DB device, ::
+   ceph-volume lvm prepare --bluestore --data <device>
 
 
-  ceph-volume lvm prepare --bluestore --data <device> --block.wal <wal-device> --block.db <db-device>
+To specify a WAL device and/or DB device:
+   
+.. prompt:: bash $
+
+   ceph-volume lvm prepare --bluestore --data <device> --block.wal <wal-device> --block.db <db-device>
 
 .. note:: ``--data`` can be a Logical Volume using  *vg/lv* notation. Other
           devices can be existing logical volumes or GPT partitions.
 
 .. note:: ``--data`` can be a Logical Volume using  *vg/lv* notation. Other
           devices can be existing logical volumes or GPT partitions.
@@ -66,15 +70,19 @@ the deployment strategy:
 If all devices are the same type, for example all rotational drives, and
 there are no fast devices to use for metadata, it makes sense to specify the
 block device only and to not separate ``block.db`` or ``block.wal``. The
 If all devices are the same type, for example all rotational drives, and
 there are no fast devices to use for metadata, it makes sense to specify the
 block device only and to not separate ``block.db`` or ``block.wal``. The
-:ref:`ceph-volume-lvm` command for a single ``/dev/sda`` device looks like::
+:ref:`ceph-volume-lvm` command for a single ``/dev/sda`` device looks like:
+
+.. prompt:: bash $
 
 
-    ceph-volume lvm create --bluestore --data /dev/sda
+   ceph-volume lvm create --bluestore --data /dev/sda
 
 If logical volumes have already been created for each device, (a single LV
 using 100% of the device), then the :ref:`ceph-volume-lvm` call for an LV named
 
 If logical volumes have already been created for each device, (a single LV
 using 100% of the device), then the :ref:`ceph-volume-lvm` call for an LV named
-``ceph-vg/block-lv`` would look like::
+``ceph-vg/block-lv`` would look like:
+
+.. prompt:: bash $
 
 
-    ceph-volume lvm create --bluestore --data ceph-vg/block-lv
+   ceph-volume lvm create --bluestore --data ceph-vg/block-lv
 
 .. _bluestore-mixed-device-config:
 
 
 .. _bluestore-mixed-device-config:
 
@@ -88,35 +96,43 @@ You must create these volume groups and logical volumes manually as
 the ``ceph-volume`` tool is currently not able to do so automatically.
 
 For the below example, let us assume four rotational (``sda``, ``sdb``, ``sdc``, and ``sdd``)
 the ``ceph-volume`` tool is currently not able to do so automatically.
 
 For the below example, let us assume four rotational (``sda``, ``sdb``, ``sdc``, and ``sdd``)
-and one (fast) solid state drive (``sdx``). First create the volume groups::
+and one (fast) solid state drive (``sdx``). First create the volume groups:
 
 
-    $ vgcreate ceph-block-0 /dev/sda
-    $ vgcreate ceph-block-1 /dev/sdb
-    $ vgcreate ceph-block-2 /dev/sdc
-    $ vgcreate ceph-block-3 /dev/sdd
+.. prompt:: bash $
 
 
-Now create the logical volumes for ``block``::
+   vgcreate ceph-block-0 /dev/sda
+   vgcreate ceph-block-1 /dev/sdb
+   vgcreate ceph-block-2 /dev/sdc
+   vgcreate ceph-block-3 /dev/sdd
 
 
-    $ lvcreate -l 100%FREE -n block-0 ceph-block-0
-    $ lvcreate -l 100%FREE -n block-1 ceph-block-1
-    $ lvcreate -l 100%FREE -n block-2 ceph-block-2
-    $ lvcreate -l 100%FREE -n block-3 ceph-block-3
+Now create the logical volumes for ``block``:
+
+.. prompt:: bash $
+
+   lvcreate -l 100%FREE -n block-0 ceph-block-0
+   lvcreate -l 100%FREE -n block-1 ceph-block-1
+   lvcreate -l 100%FREE -n block-2 ceph-block-2
+   lvcreate -l 100%FREE -n block-3 ceph-block-3
 
 We are creating 4 OSDs for the four slow spinning devices, so assuming a 200GB
 
 We are creating 4 OSDs for the four slow spinning devices, so assuming a 200GB
-SSD in ``/dev/sdx`` we will create 4 logical volumes, each of 50GB::
+SSD in ``/dev/sdx`` we will create 4 logical volumes, each of 50GB:
+
+.. prompt:: bash $
 
 
-    $ vgcreate ceph-db-0 /dev/sdx
-    $ lvcreate -L 50GB -n db-0 ceph-db-0
-    $ lvcreate -L 50GB -n db-1 ceph-db-0
-    $ lvcreate -L 50GB -n db-2 ceph-db-0
-    $ lvcreate -L 50GB -n db-3 ceph-db-0
+   vgcreate ceph-db-0 /dev/sdx
+   lvcreate -L 50GB -n db-0 ceph-db-0
+   lvcreate -L 50GB -n db-1 ceph-db-0
+   lvcreate -L 50GB -n db-2 ceph-db-0
+   lvcreate -L 50GB -n db-3 ceph-db-0
 
 
-Finally, create the 4 OSDs with ``ceph-volume``::
+Finally, create the 4 OSDs with ``ceph-volume``:
 
 
-    $ ceph-volume lvm create --bluestore --data ceph-block-0/block-0 --block.db ceph-db-0/db-0
-    $ ceph-volume lvm create --bluestore --data ceph-block-1/block-1 --block.db ceph-db-0/db-1
-    $ ceph-volume lvm create --bluestore --data ceph-block-2/block-2 --block.db ceph-db-0/db-2
-    $ ceph-volume lvm create --bluestore --data ceph-block-3/block-3 --block.db ceph-db-0/db-3
+.. prompt:: bash $
+
+   ceph-volume lvm create --bluestore --data ceph-block-0/block-0 --block.db ceph-db-0/db-0
+   ceph-volume lvm create --bluestore --data ceph-block-1/block-1 --block.db ceph-db-0/db-1
+   ceph-volume lvm create --bluestore --data ceph-block-2/block-2 --block.db ceph-db-0/db-2
+   ceph-volume lvm create --bluestore --data ceph-block-3/block-3 --block.db ceph-db-0/db-3
 
 These operations should end up creating four OSDs, with ``block`` on the slower
 rotational drives with a 50 GB logical volume (DB) for each on the solid state
 
 These operations should end up creating four OSDs, with ``block`` on the slower
 rotational drives with a 50 GB logical volume (DB) for each on the solid state
@@ -239,9 +255,11 @@ The smaller checksum values can be used by selecting `crc32c_16` or
 `crc32c_8` as the checksum algorithm.
 
 The *checksum algorithm* can be set either via a per-pool
 `crc32c_8` as the checksum algorithm.
 
 The *checksum algorithm* can be set either via a per-pool
-``csum_type`` property or the global config option.  For example, ::
+``csum_type`` property or the global config option.  For example:
+
+.. prompt:: bash $
 
 
-  ceph osd pool set <pool-name> csum_type <algorithm>
+   ceph osd pool set <pool-name> csum_type <algorithm>
 
 .. confval:: bluestore_csum_type
 
 
 .. confval:: bluestore_csum_type
 
@@ -275,13 +293,15 @@ must be 70% of the size of the original (or smaller).
 The *compression mode*, *compression algorithm*, *compression required
 ratio*, *min blob size*, and *max blob size* can be set either via a
 per-pool property or a global config option.  Pool properties can be
 The *compression mode*, *compression algorithm*, *compression required
 ratio*, *min blob size*, and *max blob size* can be set either via a
 per-pool property or a global config option.  Pool properties can be
-set with::
+set with:
+
+.. prompt:: bash $
 
 
-  ceph osd pool set <pool-name> compression_algorithm <algorithm>
-  ceph osd pool set <pool-name> compression_mode <mode>
-  ceph osd pool set <pool-name> compression_required_ratio <ratio>
-  ceph osd pool set <pool-name> compression_min_blob_size <size>
-  ceph osd pool set <pool-name> compression_max_blob_size <size>
+   ceph osd pool set <pool-name> compression_algorithm <algorithm>
+   ceph osd pool set <pool-name> compression_mode <mode>
+   ceph osd pool set <pool-name> compression_required_ratio <ratio>
+   ceph osd pool set <pool-name> compression_min_blob_size <size>
+   ceph osd pool set <pool-name> compression_max_blob_size <size>
 
 .. confval:: bluestore_compression_algorithm
 .. confval:: bluestore_compression_mode
 
 .. confval:: bluestore_compression_algorithm
 .. confval:: bluestore_compression_mode
@@ -342,16 +362,20 @@ Refer to `SPDK document`__ for more details.
 .. __: http://www.spdk.io/doc/getting_started.html#getting_started_examples
 
 SPDK offers a script to configure the device automatically. Users can run the
 .. __: http://www.spdk.io/doc/getting_started.html#getting_started_examples
 
 SPDK offers a script to configure the device automatically. Users can run the
-script as root::
+script as root:
 
 
-  $ sudo src/spdk/scripts/setup.sh
+.. prompt:: bash $
+
+   sudo src/spdk/scripts/setup.sh
 
 You will need to specify the subject NVMe device's device selector with
 the "spdk:" prefix for ``bluestore_block_path``.
 
 
 You will need to specify the subject NVMe device's device selector with
 the "spdk:" prefix for ``bluestore_block_path``.
 
-For example, you can find the device selector of an Intel PCIe SSD with::
+For example, you can find the device selector of an Intel PCIe SSD with:
+
+.. prompt:: bash $
 
 
-  $ lspci -mm -n -D -d 8086:0953
+   lspci -mm -n -D -d 8086:0953
 
 The device selector always has the form of ``DDDD:BB:DD.FF`` or ``DDDD.BB.DD.FF``.
 
 
 The device selector always has the form of ``DDDD:BB:DD.FF`` or ``DDDD.BB.DD.FF``.
 
@@ -377,3 +401,118 @@ settings to ensure that all IOs are issued through SPDK.::
 
 Otherwise, the current implementation will populate the SPDK map files with
 kernel file system symbols and will use the kernel driver to issue DB/WAL IO.
 
 Otherwise, the current implementation will populate the SPDK map files with
 kernel file system symbols and will use the kernel driver to issue DB/WAL IO.
+
+Minimum Allocation Size
+========================
+
+There is a configured minimum amount of storage that BlueStore will allocate on
+an OSD.  In practice, this is the least amount of capacity that a RADOS object
+can consume.  The value of :confval:`bluestore_min_alloc_size` is derived from the
+value of :confval:`bluestore_min_alloc_size_hdd` or :confval:`bluestore_min_alloc_size_ssd`
+depending on the OSD's ``rotational`` attribute.  This means that when an OSD
+is created on an HDD, BlueStore will be initialized with the current value
+of :confval:`bluestore_min_alloc_size_hdd`, and SSD OSDs (including NVMe devices)
+with the value of :confval:`bluestore_min_alloc_size_ssd`.
+
+Through the Mimic release, the default values were 64KB and 16KB for rotational
+(HDD) and non-rotational (SSD) media respectively.  Octopus changed the default
+for SSD (non-rotational) media to 4KB, and Pacific changed the default for HDD
+(rotational) media to 4KB as well.
+
+These changes were driven by space amplification experienced by Ceph RADOS
+GateWay (RGW) deployments that host large numbers of small files
+(S3/Swift objects).
+
+For example, when an RGW client stores a 1KB S3 object, it is written to a
+single RADOS object.  With the default :confval:`min_alloc_size` value, 4KB of
+underlying drive space is allocated.  This means that roughly
+(4KB - 1KB) == 3KB is allocated but never used, which corresponds to 300%
+overhead or 25% efficiency. Similarly, a 5KB user object will be stored
+as one 4KB and one 1KB RADOS object, again stranding 4KB of device capacity,
+though in this case the overhead is a much smaller percentage.  Think of this
+in terms of the remainder from a modulus operation. The overhead *percentage*
+thus decreases rapidly as user object size increases.
+
+An easily missed additional subtlety is that this
+takes place for *each* replica.  So when using the default three copies of
+data (3R), a 1KB S3 object actually consumes roughly 9KB of storage device
+capacity.  If erasure coding (EC) is used instead of replication, the
+amplification may be even higher: for a ``k=4,m=2`` pool, our 1KB S3 object
+will allocate (6 * 4KB) = 24KB of device capacity.
+
+When an RGW bucket pool contains many relatively large user objects, the effect
+of this phenomenon is often negligible, but should be considered for deployments
+that expect a significant fraction of relatively small objects.
+
+The 4KB default value aligns well with conventional HDD and SSD devices.  Some
+new coarse-IU (Indirection Unit) QLC SSDs however perform and wear best
+when :confval:`bluestore_min_alloc_size_ssd`
+is set at OSD creation to match the device's IU:. 8KB, 16KB, or even 64KB.
+These novel storage drives allow one to achieve read performance competitive
+with conventional TLC SSDs and write performance faster than HDDs, with
+high density and lower cost than TLC SSDs.
+
+Note that when creating OSDs on these devices, one must carefully apply the
+non-default value only to appropriate devices, and not to conventional SSD and
+HDD devices.  This may be done through careful ordering of OSD creation, custom
+OSD device classes, and especially by the use of central configuration _masks_.
+
+Quincy and later releases add
+the :confval:`bluestore_use_optimal_io_size_for_min_alloc_size`
+option that enables automatic discovery of the appropriate value as each OSD is
+created.  Note that the use of ``bcache``, ``OpenCAS``, ``dmcrypt``,
+``ATA over Ethernet``, `iSCSI`, or other device layering / abstraction
+technologies may confound the determination of appropriate values. OSDs
+deployed on top of VMware storage have been reported to also
+sometimes report a ``rotational`` attribute that does not match the underlying
+hardware.
+
+We suggest inspecting such OSDs at startup via logs and admin sockets to ensure that
+behavior is appropriate.  Note that this also may not work as desired with
+older kernels.  You can check for this by examining the presence and value
+of ``/sys/block/<drive>/queue/optimal_io_size``.
+
+You may also inspect a given OSD:
+
+.. prompt:: bash #
+
+   ceph osd metadata osd.1701 | grep rotational
+
+This space amplification may manifest as an unusually high ratio of raw to
+stored data reported by ``ceph df``.  ``ceph osd df`` may also report
+anomalously high ``%USE`` / ``VAR`` values when
+compared to other, ostensibly identical OSDs.  A pool using OSDs with
+mismatched ``min_alloc_size`` values may experience unexpected balancer
+behavior as well.
+
+Note that this BlueStore attribute takes effect *only* at OSD creation; if
+changed later, a given OSD's behavior will not change unless / until it is
+destroyed and redeployed with the appropriate option value(s).  Upgrading
+to a later Ceph release will *not* change the value used by OSDs deployed
+under older releases or with other settings.
+
+
+.. confval:: bluestore_min_alloc_size
+.. confval:: bluestore_min_alloc_size_hdd
+.. confval:: bluestore_min_alloc_size_ssd
+.. confval:: bluestore_use_optimal_io_size_for_min_alloc_size
+
+DSA (Data Streaming Accelerator Usage)
+======================================
+
+If you want to use the DML library to drive DSA device for offloading
+read/write operations on Persist memory in Bluestore. You need to install
+`DML`_ and `idxd-config`_ library in your machine with SPR (Sapphire Rapids) CPU.
+
+.. _DML: https://github.com/intel/DML
+.. _idxd-config: https://github.com/intel/idxd-config
+
+After installing the DML software, you need to configure the shared
+work queues (WQs) with the following WQ configuration example via accel-config tool:
+
+.. prompt:: bash $
+
+   accel-config config-wq --group-id=1 --mode=shared --wq-size=16 --threshold=15 --type=user --name="MyApp1" --priority=10 --block-on-fault=1 dsa0/wq0.1
+   accel-config config-engine dsa0/engine0.1 --group-id=1
+   accel-config enable-device dsa0
+   accel-config enable-wq dsa0/wq0.1
index 3e11bcc19ab05b3f8cb9ba1f312a8d5effde6e70..a026f46ddc27b55214ca9853148c10a7696a56be 100644 (file)
@@ -486,17 +486,26 @@ The following CLI commands are used to configure the cluster:
 Help
 ====
 
 Help
 ====
 
-You can get help for a particular option with::
+You can get help for a particular option with:
 
 
-  ceph config help <option>
+.. prompt:: bash $
 
 
-Note that this will use the configuration schema that is compiled into the running monitors.  If you have a mixed-version cluster (e.g., during an upgrade), you might also want to query the option schema from a specific running daemon::
+   ceph config help <option>
 
 
-  ceph daemon <name> config help [option]
+Note that this will use the configuration schema that is compiled into the running monitors.  If you have a mixed-version cluster (e.g., during an upgrade), you might also want to query the option schema from a specific running daemon:
 
 
-For example,::
+.. prompt:: bash $
+
+   ceph daemon <name> config help [option]
+
+For example:
+
+.. prompt:: bash $
+
+   ceph config help log_file
+
+:: 
 
 
-  $ ceph config help log_file
   log_file - path to log file
     (std::string, basic)
     Default (non-daemon):
   log_file - path to log file
     (std::string, basic)
     Default (non-daemon):
@@ -504,9 +513,14 @@ For example,::
     Can update at runtime: false
     See also: [log_to_stderr,err_to_stderr,log_to_syslog,err_to_syslog]
 
     Can update at runtime: false
     See also: [log_to_stderr,err_to_stderr,log_to_syslog,err_to_syslog]
 
-or::
+or:
+
+.. prompt:: bash $
+
+   ceph config help log_file -f json-pretty
+
+::
 
 
-  $ ceph config help log_file -f json-pretty
   {
       "name": "log_file",
       "type": "std::string",
   {
       "name": "log_file",
       "type": "std::string",
@@ -537,83 +551,109 @@ testing purposes, and are not recommended for use by operators.
 Runtime Changes
 ===============
 
 Runtime Changes
 ===============
 
-In most cases, Ceph allows you to make changes to the configuration of
-a daemon at runtime. This capability is quite useful for
-increasing/decreasing logging output, enabling/disabling debug
-settings, and even for runtime optimization.
+In most cases, Ceph permits changes to the configuration of a daemon at
+runtime. This can be used for increasing or decreasing the amount of logging
+output, for enabling or disabling debug settings, and for runtime optimization.
 
 
-Generally speaking, configuration options can be updated in the usual
-way via the ``ceph config set`` command.  For example, do enable the debug log level on a specific OSD,::
+Configuration options can be updated via the ``ceph config set`` command.  For
+example, to enable the debug log level on a specific OSD, run a command of this form:
 
 
-  ceph config set osd.123 debug_ms 20
+.. prompt:: bash $
 
 
-Note that if the same option is also customized in a local
-configuration file, the monitor setting will be ignored (it has a
-lower priority than the local config file).
+   ceph config set osd.123 debug_ms 20
+
+.. note:: If an option has been customized in a local configuration file, the
+   `central config
+   <https://ceph.io/en/news/blog/2018/new-mimic-centralized-configuration-management/>`_
+   setting will be ignored (it has a lower priority than the local
+   configuration file).
 
 Override values
 ---------------
 
 
 Override values
 ---------------
 
-You can also temporarily set an option using the `tell` or `daemon`
-interfaces on the Ceph CLI.  These *override* values are ephemeral in
-that they only affect the running process and are discarded/lost if
-the daemon or process restarts.
+Options can be set temporarily by using the `tell` or `daemon` interfaces on
+the Ceph CLI. These *override* values are ephemeral, which means that they
+affect only the current instance of the daemon and revert to persistently
+configured values when the daemon restarts.
 
 Override values can be set in two ways:
 
 
 Override values can be set in two ways:
 
-#. From any host, we can send a message to a daemon over the network with::
+#. From any host, send a message to a daemon with a command of the following
+   form:
+   
+   .. prompt:: bash $
+
+      ceph tell <name> config set <option> <value>
 
 
-     ceph tell <name> config set <option> <value>
+   For example:
+   
+   .. prompt:: bash $
 
 
-   For example,::
+      ceph tell osd.123 config set debug_osd 20
 
 
-     ceph tell osd.123 config set debug_osd 20
+   The ``tell`` command can also accept a wildcard as the daemon identifier.
+   For example, to adjust the debug level on all OSD daemons, run a command of
+   this form:
+   
+   .. prompt:: bash $
 
 
-   The `tell` command can also accept a wildcard for the daemon
-   identifier.  For example, to adjust the debug level on all OSD
-   daemons,::
+      ceph tell osd.* config set debug_osd 20
 
 
-     ceph tell osd.* config set debug_osd 20
+#. On the host where the daemon is running, connect to the daemon via a socket
+   in ``/var/run/ceph`` by running a command of this form:
 
 
-#. From the host the process is running on, we can connect directly to
-   the process via a socket in ``/var/run/ceph`` with::
+   .. prompt:: bash $
 
 
-     ceph daemon <name> config set <option> <value>
+      ceph daemon <name> config set <option> <value>
 
 
-   For example,::
+   For example:
+   
+   .. prompt:: bash $
 
 
-     ceph daemon osd.4 config set debug_osd 20
+      ceph daemon osd.4 config set debug_osd 20
 
 
-Note that in the ``ceph config show`` command output these temporary
-values will be shown with a source of ``override``.
+.. note:: In the output of the ``ceph config show`` command, these temporary
+   values are shown with a source of ``override``.
 
 
 Viewing runtime settings
 ========================
 
 
 
 Viewing runtime settings
 ========================
 
-You can see the current options set for a running daemon with the ``ceph config show`` command.  For example,::
+You can see the current options set for a running daemon with the ``ceph config show`` command.  For example:
+
+.. prompt:: bash $
+
+   ceph config show osd.0
+
+will show you the (non-default) options for that daemon.  You can also look at a specific option with:
+
+.. prompt:: bash $
+
+   ceph config show osd.0 debug_osd
+
+or view all options (even those with default values) with:
 
 
-  ceph config show osd.0
+.. prompt:: bash $
 
 
-will show you the (non-default) options for that daemon.  You can also look at a specific option with::
+   ceph config show-with-defaults osd.0
 
 
-  ceph config show osd.0 debug_osd
+You can also observe settings for a running daemon by connecting to it from the local host via the admin socket.  For example:
 
 
-or view all options (even those with default values) with::
+.. prompt:: bash $
 
 
-  ceph config show-with-defaults osd.0
+   ceph daemon osd.0 config show
 
 
-You can also observe settings for a running daemon by connecting to it from the local host via the admin socket.  For example,::
+will dump all current settings:
 
 
-  ceph daemon osd.0 config show
+.. prompt:: bash $
 
 
-will dump all current settings,::
+   ceph daemon osd.0 config diff
 
 
-  ceph daemon osd.0 config diff
+will show only non-default settings (as well as where the value came from: a config file, the monitor, an override, etc.), and:
 
 
-will show only non-default settings (as well as where the value came from: a config file, the monitor, an override, etc.), and::
+.. prompt:: bash $
 
 
-  ceph daemon osd.0 config get debug_osd
+   ceph daemon osd.0 config get debug_osd
 
 will report the value of a single option.
 
 
 will report the value of a single option.
 
index 871f12afaab3c837a143b20f6a35b26cb670c93c..715b999d1869d970dc2ebff9986669bc919b3cc5 100644 (file)
@@ -2,12 +2,13 @@
  Configuration
 ===============
 
  Configuration
 ===============
 
-Each Ceph process, daemon, or utility draws its configuration from
-several sources on startup, include a local configuration, the
-monitors, the command line, or environment variables.  Configuration
-options may be set globally such that they apply to all daemons, to
-all daemons or services of a particular type, or only to a specific
-daemon, process, or client.
+Each Ceph process, daemon, or utility draws its configuration from several
+sources on startup. Such sources can include (1) a local configuration, (2) the
+monitors, (3) the command line, and (4) environment variables.
+
+Configuration options can be set globally so that they apply (1) to all
+daemons, (2) to all daemons or services of a particular type, or (3) to only a
+specific daemon, process, or client.
 
 .. raw:: html
 
 
 .. raw:: html
 
index 1040b2e66c2eb166606f6d7b0836179c4ebc0f61..f2a1603b5dc84eb5d56a9c18bc4c5b03afdc7682 100644 (file)
@@ -88,6 +88,14 @@ Users can choose between the following built-in profile types:
 .. note:: The values mentioned in the tables below represent the percentage
           of the total IOPS capacity of the OSD allocated for the service type.
 
 .. note:: The values mentioned in the tables below represent the percentage
           of the total IOPS capacity of the OSD allocated for the service type.
 
+By default, the *high_client_ops* profile is enabled to ensure that a larger
+chunk of the bandwidth allocation goes to client ops. Background recovery ops
+are given lower allocation (and therefore take a longer time to complete). But
+there might be instances that necessitate giving higher allocations to either
+client ops or recovery ops. In order to deal with such a situation, the
+alternate built-in profiles may be enabled by following the steps mentioned
+in next sections.
+
 high_client_ops (*default*)
 ^^^^^^^^^^^^^^^^^^^^^^^^^^^
 This profile optimizes client performance over background activities by
 high_client_ops (*default*)
 ^^^^^^^^^^^^^^^^^^^^^^^^^^^
 This profile optimizes client performance over background activities by
@@ -143,10 +151,7 @@ within the OSD.
 +------------------------+-------------+--------+-------+
 
 .. note:: Across the built-in profiles, internal background best-effort clients
 +------------------------+-------------+--------+-------+
 
 .. note:: Across the built-in profiles, internal background best-effort clients
-          of mclock ("scrub", "snap trim", and "pg deletion") are given lower
-          reservations but no limits(MAX). This ensures that requests from such
-          clients are able to complete quickly if there are no other competing
-          operations.
+          of mclock include "scrub", "snap trim", and "pg deletion" operations.
 
 
 Custom Profile
 
 
 Custom Profile
@@ -158,9 +163,13 @@ users, who understand mclock and Ceph related configuration options.
 
 .. index:: mclock; built-in profiles
 
 
 .. index:: mclock; built-in profiles
 
-mClock Built-in Profiles
-========================
+mClock Built-in Profiles -  Locked Config Options
+=================================================
+The below sections describe the config options that are locked to certain values
+in order to ensure mClock scheduler is able to provide predictable QoS.
 
 
+mClock Config Options
+---------------------
 When a built-in profile is enabled, the mClock scheduler calculates the low
 level mclock parameters [*reservation*, *weight*, *limit*] based on the profile
 enabled for each client type. The mclock parameters are calculated based on
 When a built-in profile is enabled, the mClock scheduler calculates the low
 level mclock parameters [*reservation*, *weight*, *limit*] based on the profile
 enabled for each client type. The mclock parameters are calculated based on
@@ -177,24 +186,40 @@ config parameters cannot be modified when using any of the built-in profiles:
 - :confval:`osd_mclock_scheduler_background_best_effort_wgt`
 - :confval:`osd_mclock_scheduler_background_best_effort_lim`
 
 - :confval:`osd_mclock_scheduler_background_best_effort_wgt`
 - :confval:`osd_mclock_scheduler_background_best_effort_lim`
 
-The following Ceph options will not be modifiable by the user:
+Recovery/Backfill Options
+-------------------------
+The following recovery and backfill related Ceph options are set to new defaults
+for mClock:
 
 - :confval:`osd_max_backfills`
 - :confval:`osd_recovery_max_active`
 
 - :confval:`osd_max_backfills`
 - :confval:`osd_recovery_max_active`
-
-This is because the above options are internally modified by the mclock
-scheduler in order to maximize the impact of the set profile.
-
-By default, the *high_client_ops* profile is enabled to ensure that a larger
-chunk of the bandwidth allocation goes to client ops. Background recovery ops
-are given lower allocation (and therefore take a longer time to complete). But
-there might be instances that necessitate giving higher allocations to either
-client ops or recovery ops. In order to deal with such a situation, the
-alternate built-in profiles may be enabled by following the steps mentioned
-in the next section.
-
+- :confval:`osd_recovery_max_active_hdd`
+- :confval:`osd_recovery_max_active_ssd`
+
+The following table shows the new mClock defaults. This is done to maximize the
+impact of the built-in profile:
+
++----------------------------------------+------------------+----------------+
+|  Config Option                         | Original Default | mClock Default |
++========================================+==================+================+
+| :confval:`osd_max_backfills`           | 1                | 10             |
++----------------------------------------+------------------+----------------+
+| :confval:`osd_recovery_max_active`     | 0                | 0              |
++----------------------------------------+------------------+----------------+
+| :confval:`osd_recovery_max_active_hdd` | 3                | 10             |
++----------------------------------------+------------------+----------------+
+| :confval:`osd_recovery_max_active_ssd` | 10               | 20             |
++----------------------------------------+------------------+----------------+
+
+The above mClock defaults, can be modified if necessary by enabling
+:confval:`osd_mclock_override_recovery_settings` (default: false). The
+steps for this is discussed in the
+`Steps to Modify mClock Max Backfills/Recovery Limits`_ section.
+
+Sleep Options
+-------------
 If any mClock profile (including "custom") is active, the following Ceph config
 If any mClock profile (including "custom") is active, the following Ceph config
-sleep options will be disabled,
+sleep options are disabled (set to 0),
 
 - :confval:`osd_recovery_sleep`
 - :confval:`osd_recovery_sleep_hdd`
 
 - :confval:`osd_recovery_sleep`
 - :confval:`osd_recovery_sleep_hdd`
@@ -386,6 +411,70 @@ The individual QoS-related config options for the *custom* profile can also be
 modified ephemerally using the above commands.
 
 
 modified ephemerally using the above commands.
 
 
+Steps to Modify mClock Max Backfills/Recovery Limits
+====================================================
+
+This section describes the steps to modify the default max backfills or recovery
+limits if the need arises.
+
+.. warning:: This section is for advanced users or for experimental testing. The
+   recommendation is to retain the defaults as is on a running cluster as
+   modifying them could have unexpected performance outcomes. The values may
+   be modified only if the cluster is unable to cope/showing poor performance
+   with the default settings or for performing experiments on a test cluster.
+
+.. important:: The max backfill/recovery options that can be modified are listed
+   in section `Recovery/Backfill Options`_. The modification of the mClock
+   default backfills/recovery limit is gated by the
+   :confval:`osd_mclock_override_recovery_settings` option, which is set to
+   *false* by default. Attempting to modify any default recovery/backfill
+   limits without setting the gating option will reset that option back to the
+   mClock defaults along with a warning message logged in the cluster log. Note
+   that it may take a few seconds for the default value to come back into
+   effect. Verify the limit using the *config show* command as shown below.
+
+#. Set the :confval:`osd_mclock_override_recovery_settings` config option on all
+   osds to *true* using:
+
+   .. prompt:: bash #
+
+     ceph config set osd osd_mclock_override_recovery_settings true
+
+#. Set the desired max backfill/recovery option using:
+
+   .. prompt:: bash #
+
+     ceph config set osd osd_max_backfills <value>
+
+   For example, the following command modifies the :confval:`osd_max_backfills`
+   option on all osds to 5.
+
+   .. prompt:: bash #
+
+     ceph config set osd osd_max_backfills 5
+
+#. Wait for a few seconds and verify the running configuration for a specific
+   OSD using:
+
+   .. prompt:: bash #
+
+     ceph config show osd.N | grep osd_max_backfills
+
+   For example, the following command shows the running configuration of
+   :confval:`osd_max_backfills` on osd.0.
+
+   .. prompt:: bash #
+
+     ceph config show osd.0 | grep osd_max_backfills
+
+#. Reset the :confval:`osd_mclock_override_recovery_settings` config option on
+   all osds to *false* using:
+
+   .. prompt:: bash #
+
+     ceph config set osd osd_mclock_override_recovery_settings false
+
+
 OSD Capacity Determination (Automated)
 ======================================
 
 OSD Capacity Determination (Automated)
 ======================================
 
@@ -413,6 +502,46 @@ node whose underlying device type is SSD:
 
     ceph config show osd.0 osd_mclock_max_capacity_iops_ssd
 
 
     ceph config show osd.0 osd_mclock_max_capacity_iops_ssd
 
+Mitigation of Unrealistic OSD Capacity From Automated Test
+----------------------------------------------------------
+In certain conditions, the OSD bench tool may show unrealistic/inflated result
+depending on the drive configuration and other environment related conditions.
+To mitigate the performance impact due to this unrealistic capacity, a couple
+of threshold config options depending on the osd's device type are defined and
+used:
+
+- :confval:`osd_mclock_iops_capacity_threshold_hdd` = 500
+- :confval:`osd_mclock_iops_capacity_threshold_ssd` = 80000
+
+The following automated step is performed:
+
+Fallback to using default OSD capacity (automated)
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+If OSD bench reports a measurement that exceeds the above threshold values
+depending on the underlying device type, the fallback mechanism reverts to the
+default value of :confval:`osd_mclock_max_capacity_iops_hdd` or
+:confval:`osd_mclock_max_capacity_iops_ssd`. The threshold config options
+can be reconfigured based on the type of drive used. Additionally, a cluster
+warning is logged in case the measurement exceeds the threshold. For example, ::
+
+    2022-10-27T15:30:23.270+0000 7f9b5dbe95c0  0 log_channel(cluster) log [WRN]
+    : OSD bench result of 39546.479392 IOPS exceeded the threshold limit of
+    25000.000000 IOPS for osd.1. IOPS capacity is unchanged at 21500.000000
+    IOPS. The recommendation is to establish the osd's IOPS capacity using other
+    benchmark tools (e.g. Fio) and then override
+    osd_mclock_max_capacity_iops_[hdd|ssd].
+
+If the default capacity doesn't accurately represent the OSD's capacity, the
+following additional step is recommended to address this:
+
+Run custom drive benchmark if defaults are not accurate (manual)
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+If the default OSD capacity is not accurate, the recommendation is to run a
+custom benchmark using your preferred tool (e.g. Fio) on the drive and then
+override the ``osd_mclock_max_capacity_iops_[hdd, ssd]`` option as described
+in the `Specifying  Max OSD Capacity`_ section.
+
+This step is highly recommended until an alternate mechansim is worked upon.
 
 Steps to Manually Benchmark an OSD (Optional)
 =============================================
 
 Steps to Manually Benchmark an OSD (Optional)
 =============================================
@@ -426,9 +555,10 @@ Steps to Manually Benchmark an OSD (Optional)
          `Specifying  Max OSD Capacity`_.
 
 
          `Specifying  Max OSD Capacity`_.
 
 
-Any existing benchmarking tool can be used for this purpose. In this case, the
-steps use the *Ceph OSD Bench* command described in the next section. Regardless
-of the tool/command used, the steps outlined further below remain the same.
+Any existing benchmarking tool (e.g. Fio) can be used for this purpose. In this
+case, the steps use the *Ceph OSD Bench* command described in the next section.
+Regardless of the tool/command used, the steps outlined further below remain the
+same.
 
 As already described in the :ref:`dmclock-qos` section, the number of
 shards and the bluestore's throttle parameters have an impact on the mclock op
 
 As already described in the :ref:`dmclock-qos` section, the number of
 shards and the bluestore's throttle parameters have an impact on the mclock op
@@ -551,5 +681,8 @@ mClock Config Options
 .. confval:: osd_mclock_cost_per_byte_usec_ssd
 .. confval:: osd_mclock_force_run_benchmark_on_init
 .. confval:: osd_mclock_skip_benchmark
 .. confval:: osd_mclock_cost_per_byte_usec_ssd
 .. confval:: osd_mclock_force_run_benchmark_on_init
 .. confval:: osd_mclock_skip_benchmark
+.. confval:: osd_mclock_override_recovery_settings
+.. confval:: osd_mclock_iops_capacity_threshold_hdd
+.. confval:: osd_mclock_iops_capacity_threshold_ssd
 
 .. _the dmClock algorithm: https://www.usenix.org/legacy/event/osdi10/tech/full_papers/Gulati.pdf
 
 .. _the dmClock algorithm: https://www.usenix.org/legacy/event/osdi10/tech/full_papers/Gulati.pdf
index ab4bffae350e796ff2e954afc92ba0b3da7e91f5..a36293cddca0b9373e5783d2e05cc98839ca244c 100644 (file)
@@ -1,3 +1,5 @@
+.. _monitor-config-reference:
+
 ==========================
  Monitor Config Reference
 ==========================
 ==========================
  Monitor Config Reference
 ==========================
index e1beaf5dc4cc3a55ee977cdeecef4b990920cbfc..3e5e055b6a39af6f31f9806cc02f8da81dc4eb13 100644 (file)
@@ -188,16 +188,21 @@ By default, ``ms_bind_msgr2`` is true starting with Nautilus 14.2.z.
 However, until the monitors start using v2, only limited services will
 start advertising v2 addresses.
 
 However, until the monitors start using v2, only limited services will
 start advertising v2 addresses.
 
-For most users, the monitors are binding to the default legacy port ``6789`` for the v1 protocol.  When this is the case, enabling v2 is as simple as::
+For most users, the monitors are binding to the default legacy port ``6789``
+for the v1 protocol.  When this is the case, enabling v2 is as simple as:
 
 
-  ceph mon enable-msgr2
+.. prompt:: bash $
+
+   ceph mon enable-msgr2
 
 If the monitors are bound to non-standard ports, you will need to
 specify an additional port for v2 explicitly.  For example, if your
 monitor ``mon.a`` binds to ``1.2.3.4:1111``, and you want to add v2 on
 
 If the monitors are bound to non-standard ports, you will need to
 specify an additional port for v2 explicitly.  For example, if your
 monitor ``mon.a`` binds to ``1.2.3.4:1111``, and you want to add v2 on
-port ``1112``,::
+port ``1112``:
+
+.. prompt:: bash $
 
 
-  ceph mon set-addrs a [v2:1.2.3.4:1112,v1:1.2.3.4:1111]
+   ceph mon set-addrs a [v2:1.2.3.4:1112,v1:1.2.3.4:1111]
 
 Once the monitors bind to v2, each daemon will start advertising a v2
 address when it is next restarted.
 
 Once the monitors bind to v2, each daemon will start advertising a v2
 address when it is next restarted.
index 16f3192c7bd65dd7e8ff4f975aa32f81f3390bfe..02d37d346d2aeab22d7b6100b8d60530d8dadeaa 100644 (file)
@@ -60,7 +60,9 @@ By default, daemons `bind`_ to ports within the ``6800:7300`` range. You may
 configure this range at your discretion. Before configuring your IP tables,
 check the default ``iptables`` configuration.
 
 configure this range at your discretion. Before configuring your IP tables,
 check the default ``iptables`` configuration.
 
-       sudo iptables -L
+.. prompt:: bash $
+
+   sudo iptables -L
 
 Some Linux distributions include rules that reject all inbound requests
 except SSH from all network interfaces. For example:: 
 
 Some Linux distributions include rules that reject all inbound requests
 except SSH from all network interfaces. For example:: 
@@ -80,7 +82,9 @@ default. Additionally, Ceph Monitors always operate on the public
 network. When you add the rule using the example below, make sure you
 replace ``{iface}`` with the public network interface (e.g., ``eth0``,
 ``eth1``, etc.), ``{ip-address}`` with the IP address of the public
 network. When you add the rule using the example below, make sure you
 replace ``{iface}`` with the public network interface (e.g., ``eth0``,
 ``eth1``, etc.), ``{ip-address}`` with the IP address of the public
-network and ``{netmask}`` with the netmask for the public network. ::
+network and ``{netmask}`` with the netmask for the public network. :
+
+.. prompt:: bash $
 
    sudo iptables -A INPUT -i {iface} -p tcp -s {ip-address}/{netmask} --dport 6789 -j ACCEPT
 
 
    sudo iptables -A INPUT -i {iface} -p tcp -s {ip-address}/{netmask} --dport 6789 -j ACCEPT
 
@@ -98,9 +102,11 @@ you replace ``{iface}`` with the public network interface (e.g., ``eth0``,
 ``eth1``, etc.), ``{ip-address}`` with the IP address of the public network
 and ``{netmask}`` with the netmask of the public network.
 
 ``eth1``, etc.), ``{ip-address}`` with the IP address of the public network
 and ``{netmask}`` with the netmask of the public network.
 
-For example:
+For example:
 
 
-       sudo iptables -A INPUT -i {iface} -m multiport -p tcp -s {ip-address}/{netmask} --dports 6800:7300 -j ACCEPT
+.. prompt:: bash $
+
+   sudo iptables -A INPUT -i {iface} -m multiport -p tcp -s {ip-address}/{netmask} --dports 6800:7300 -j ACCEPT
 
 
 OSD IP Tables
 
 
 OSD IP Tables
@@ -139,9 +145,11 @@ the public network and other Ceph OSD Daemons will connect using the cluster
 network. When you add the rule using the example below, make sure you replace
 ``{iface}`` with the network interface (e.g., ``eth0``, ``eth1``, etc.),
 ``{ip-address}`` with the IP address and ``{netmask}`` with the netmask of the
 network. When you add the rule using the example below, make sure you replace
 ``{iface}`` with the network interface (e.g., ``eth0``, ``eth1``, etc.),
 ``{ip-address}`` with the IP address and ``{netmask}`` with the netmask of the
-public or cluster network. For example:: 
+public or cluster network. For example:
+
+.. prompt:: bash $
 
 
-       sudo iptables -A INPUT -i {iface}  -m multiport -p tcp -s {ip-address}/{netmask} --dports 6800:7300 -j ACCEPT
+   sudo iptables -A INPUT -i {iface}  -m multiport -p tcp -s {ip-address}/{netmask} --dports 6800:7300 -j ACCEPT
 
 .. tip:: If you run Ceph Metadata Servers on the same Ceph Node as the 
    Ceph OSD Daemons, you can consolidate the public network configuration step. 
 
 .. tip:: If you run Ceph Metadata Servers on the same Ceph Node as the 
    Ceph OSD Daemons, you can consolidate the public network configuration step. 
index b6ec9a4d2e4c2a2151e976d06ce70a3d6d44b61b..6fedd7c78c58d4a6f1dbdb2d4bba87c066879ecd 100644 (file)
@@ -4,13 +4,12 @@
 
 .. index:: pools; configuration
 
 
 .. index:: pools; configuration
 
-When you create pools and set the number of placement groups (PGs) for each, Ceph
-uses default values when you don't specifically override the defaults. **We
-recommend** overriding some of the defaults. Specifically, we recommend setting
-a pool's replica size and overriding the default number of placement groups. You
-can specifically set these values when running `pool`_ commands. You can also
-override the defaults by adding new ones in the ``[global]`` section of  your
-Ceph configuration file.
+Ceph uses default values to determine how many placement groups (PGs) will be
+assigned to each pool. We recommend overriding some of the defaults.
+Specifically, we recommend setting a pool's replica size and overriding the
+default number of placement groups. You can set these values when running
+`pool`_ commands. You can also override the defaults by adding new ones in the
+``[global]`` section of your Ceph configuration file.
 
 
 .. literalinclude:: pool-pg.conf
 
 
 .. literalinclude:: pool-pg.conf
index 2663b09a2d4eb13fcafe1ace3262f7395207989e..660a2906a75f84a5829d80346f520016f75128ef 100644 (file)
@@ -4,6 +4,8 @@
 
 There are several Ceph daemons in a storage cluster:
 
 
 There are several Ceph daemons in a storage cluster:
 
+.. _rados_configuration_storage-devices_ceph_osd:
+
 * **Ceph OSDs** (Object Storage Daemons) store most of the data
   in Ceph. Usually each OSD is backed by a single storage device.
   This can be a traditional hard disk (HDD) or a solid state disk
 * **Ceph OSDs** (Object Storage Daemons) store most of the data
   in Ceph. Usually each OSD is backed by a single storage device.
   This can be a traditional hard disk (HDD) or a solid state disk
@@ -24,18 +26,19 @@ There are several Ceph daemons in a storage cluster:
   monitoring and management systems.
 
 
   monitoring and management systems.
 
 
-OSD Backends
-============
+OSD Back Ends
+=============
+
+There are two ways that OSDs manage the data they store.  As of the Luminous
+12.2.z release, the default (and recommended) back end is *BlueStore*.  Prior
+to the Luminous release, the default (and only) back end was *Filestore*.
 
 
-There are two ways that OSDs manage the data they store. 
-As of the Luminous 12.2.z release, the default (and recommended) backend is
-*BlueStore*.  Prior to the Luminous release, the default (and only option) was
-*Filestore*.
+.. _rados_config_storage_devices_bluestore:
 
 BlueStore
 ---------
 
 
 BlueStore
 ---------
 
-BlueStore is a special-purpose storage backend designed specifically for
+BlueStore is a special-purpose storage back end designed specifically for
 managing data on disk for Ceph OSD workloads.  BlueStore's design is based on
 a decade of experience of supporting and managing Filestore OSDs. 
 
 managing data on disk for Ceph OSD workloads.  BlueStore's design is based on
 a decade of experience of supporting and managing Filestore OSDs. 
 
index 124076d6e4aeead6a8f94ea32d8b85d4acbcd2e7..359fa767642a6b7c6ebf5d0e71cdf8b4bec7648e 100644 (file)
@@ -95,7 +95,9 @@ without the ``mon.`` prefix (i.e., ``{mon-id}`` should be the ``a``
 on ``mon.a``).
 
 #. Create the default directory on the machine that will host your 
 on ``mon.a``).
 
 #. Create the default directory on the machine that will host your 
-   new monitor. :: 
+   new monitor:
+
+   .. prompt:: bash $
 
        ssh {new-mon-host}
        sudo mkdir /var/lib/ceph/mon/ceph-{mon-id}
 
        ssh {new-mon-host}
        sudo mkdir /var/lib/ceph/mon/ceph-{mon-id}
@@ -103,36 +105,46 @@ on ``mon.a``).
 #. Create a temporary directory ``{tmp}`` to keep the files needed during 
    this process. This directory should be different from the monitor's default 
    directory created in the previous step, and can be removed after all the 
 #. Create a temporary directory ``{tmp}`` to keep the files needed during 
    this process. This directory should be different from the monitor's default 
    directory created in the previous step, and can be removed after all the 
-   steps are executed. :: 
+   steps are executed:
+
+   .. prompt:: bash $
 
        mkdir {tmp}
 
 #. Retrieve the keyring for your monitors, where ``{tmp}`` is the path to 
    the retrieved keyring, and ``{key-filename}`` is the name of the file 
 
        mkdir {tmp}
 
 #. Retrieve the keyring for your monitors, where ``{tmp}`` is the path to 
    the retrieved keyring, and ``{key-filename}`` is the name of the file 
-   containing the retrieved monitor key. :: 
+   containing the retrieved monitor key:
+
+   .. prompt:: bash $
 
 
-       ceph auth get mon. -o {tmp}/{key-filename}
+      ceph auth get mon. -o {tmp}/{key-filename}
 
 #. Retrieve the monitor map, where ``{tmp}`` is the path to 
    the retrieved monitor map, and ``{map-filename}`` is the name of the file 
 
 #. Retrieve the monitor map, where ``{tmp}`` is the path to 
    the retrieved monitor map, and ``{map-filename}`` is the name of the file 
-   containing the retrieved monitor map. :: 
+   containing the retrieved monitor map:
 
 
-       ceph mon getmap -o {tmp}/{map-filename}
+   .. prompt:: bash $
+
+      ceph mon getmap -o {tmp}/{map-filename}
 
 #. Prepare the monitor's data directory created in the first step. You must 
    specify the path to the monitor map so that you can retrieve the 
    information about a quorum of monitors and their ``fsid``. You must also 
 
 #. Prepare the monitor's data directory created in the first step. You must 
    specify the path to the monitor map so that you can retrieve the 
    information about a quorum of monitors and their ``fsid``. You must also 
-   specify a path to the monitor keyring:: 
+   specify a path to the monitor keyring:
+   
+   .. prompt:: bash $
 
 
-       sudo ceph-mon -i {mon-id} --mkfs --monmap {tmp}/{map-filename} --keyring {tmp}/{key-filename}
+      sudo ceph-mon -i {mon-id} --mkfs --monmap {tmp}/{map-filename} --keyring {tmp}/{key-filename}
        
 
 #. Start the new monitor and it will automatically join the cluster.
    The daemon needs to know which address to bind to, via either the
    ``--public-addr {ip}`` or ``--public-network {network}`` argument.
        
 
 #. Start the new monitor and it will automatically join the cluster.
    The daemon needs to know which address to bind to, via either the
    ``--public-addr {ip}`` or ``--public-network {network}`` argument.
-   For example::
+   For example:
+   
+   .. prompt:: bash $
 
 
-       ceph-mon -i {mon-id} --public-addr {ip:port}
+      ceph-mon -i {mon-id} --public-addr {ip:port}
 
 .. _removing-monitors:
 
 
 .. _removing-monitors:
 
@@ -154,13 +166,17 @@ procedure results in only two monitor daemons, you may add or remove another
 monitor until you have a number of ``ceph-mon`` daemons that can achieve a 
 quorum.
 
 monitor until you have a number of ``ceph-mon`` daemons that can achieve a 
 quorum.
 
-#. Stop the monitor. ::
+#. Stop the monitor:
+
+   .. prompt:: bash $
 
 
-       service ceph -a stop mon.{mon-id}
+      service ceph -a stop mon.{mon-id}
        
        
-#. Remove the monitor from the cluster. ::
+#. Remove the monitor from the cluster:
 
 
-       ceph mon remove {mon-id}
+   .. prompt:: bash $
+
+      ceph mon remove {mon-id}
        
 #. Remove the monitor entry from ``ceph.conf``. 
 
        
 #. Remove the monitor entry from ``ceph.conf``. 
 
@@ -174,38 +190,61 @@ cluster, for example a cluster where the monitors cannot form a
 quorum.
 
 
 quorum.
 
 
-#. Stop all ``ceph-mon`` daemons on all monitor hosts. ::
+#. Stop all ``ceph-mon`` daemons on all monitor hosts:
+
+   .. prompt:: bash $
+
+      ssh {mon-host}
+      systemctl stop ceph-mon.target
+
+   Repeat for all monitor hosts.
 
 
-       ssh {mon-host}
-       systemctl stop ceph-mon.target
-       # and repeat for all mons
+#. Identify a surviving monitor and log in to that host:
 
 
-#. Identify a surviving monitor and log in to that host. :: 
+   .. prompt:: bash $
 
 
-       ssh {mon-host}
+      ssh {mon-host}
 
 
-#. Extract a copy of the monmap file.  ::
+#. Extract a copy of the monmap file:
 
 
-        ceph-mon -i {mon-id} --extract-monmap {map-path}
-        # in most cases, that's
-        ceph-mon -i `hostname` --extract-monmap /tmp/monmap
+   .. prompt:: bash $
+
+      ceph-mon -i {mon-id} --extract-monmap {map-path}
+
+   In most cases, this command will be:
+
+   .. prompt:: bash $
+
+      ceph-mon -i `hostname` --extract-monmap /tmp/monmap
 
 #. Remove the non-surviving or problematic monitors.  For example, if
    you have three monitors, ``mon.a``, ``mon.b``, and ``mon.c``, where
 
 #. Remove the non-surviving or problematic monitors.  For example, if
    you have three monitors, ``mon.a``, ``mon.b``, and ``mon.c``, where
-   only ``mon.a`` will survive, follow the example below::
+   only ``mon.a`` will survive, follow the example below:
+
+   .. prompt:: bash $
 
 
-       monmaptool {map-path} --rm {mon-id}
-       # for example,
-       monmaptool /tmp/monmap --rm b
-       monmaptool /tmp/monmap --rm c
+      monmaptool {map-path} --rm {mon-id}
+
+   For example,
+
+   .. prompt:: bash $
+
+      monmaptool /tmp/monmap --rm b
+      monmaptool /tmp/monmap --rm c
        
 #. Inject the surviving map with the removed monitors into the
    surviving monitor(s).  For example, to inject a map into monitor
        
 #. Inject the surviving map with the removed monitors into the
    surviving monitor(s).  For example, to inject a map into monitor
-   ``mon.a``, follow the example below::
+   ``mon.a``, follow the example below:
+
+   .. prompt:: bash $
 
 
-       ceph-mon -i {mon-id} --inject-monmap {map-path}
-       # for example,
-       ceph-mon -i a --inject-monmap /tmp/monmap
+      ceph-mon -i {mon-id} --inject-monmap {map-path}
+
+   For example:
+
+   .. prompt:: bash $
+
+      ceph-mon -i a --inject-monmap /tmp/monmap
 
 #. Start only the surviving monitors.
 
 
 #. Start only the surviving monitors.
 
@@ -316,14 +355,20 @@ networks  are unable to communicate.  Use the following procedure:
 
 #. Retrieve the monitor map, where ``{tmp}`` is the path to 
    the retrieved monitor map, and ``{filename}`` is the name of the file 
 
 #. Retrieve the monitor map, where ``{tmp}`` is the path to 
    the retrieved monitor map, and ``{filename}`` is the name of the file 
-   containing the retrieved monitor map. :: 
+   containing the retrieved monitor map:
 
 
-       ceph mon getmap -o {tmp}/{filename}
+   .. prompt:: bash $
 
 
-#. The following example demonstrates the contents of the monmap. ::
+      ceph mon getmap -o {tmp}/{filename}
+
+#. The following example demonstrates the contents of the monmap:
+
+   .. prompt:: bash $
+
+      monmaptool --print {tmp}/{filename}
+
+   ::  
 
 
-       $ monmaptool --print {tmp}/{filename}
-       
        monmaptool: monmap file {tmp}/{filename}
        epoch 1
        fsid 224e376d-c5fe-4504-96bb-ea6332a19e61
        monmaptool: monmap file {tmp}/{filename}
        epoch 1
        fsid 224e376d-c5fe-4504-96bb-ea6332a19e61
@@ -333,27 +378,41 @@ networks  are unable to communicate.  Use the following procedure:
        1: 10.0.0.2:6789/0 mon.b
        2: 10.0.0.3:6789/0 mon.c
 
        1: 10.0.0.2:6789/0 mon.b
        2: 10.0.0.3:6789/0 mon.c
 
-#. Remove the existing monitors. ::
+#. Remove the existing monitors:
+
+   .. prompt:: bash $
 
 
-       $ monmaptool --rm a --rm b --rm c {tmp}/{filename}
+      monmaptool --rm a --rm b --rm c {tmp}/{filename}
        
        
+
+   ::
+
        monmaptool: monmap file {tmp}/{filename}
        monmaptool: removing a
        monmaptool: removing b
        monmaptool: removing c
        monmaptool: writing epoch 1 to {tmp}/{filename} (0 monitors)
 
        monmaptool: monmap file {tmp}/{filename}
        monmaptool: removing a
        monmaptool: removing b
        monmaptool: removing c
        monmaptool: writing epoch 1 to {tmp}/{filename} (0 monitors)
 
-#. Add the new monitor locations. ::
+#. Add the new monitor locations:
+
+   .. prompt:: bash $
+
+      monmaptool --add a 10.1.0.1:6789 --add b 10.1.0.2:6789 --add c 10.1.0.3:6789 {tmp}/{filename}
+
 
 
-       $ monmaptool --add a 10.1.0.1:6789 --add b 10.1.0.2:6789 --add c 10.1.0.3:6789 {tmp}/{filename}
+   ::
        
        
-       monmaptool: monmap file {tmp}/{filename}
-       monmaptool: writing epoch 1 to {tmp}/{filename} (3 monitors)
+      monmaptool: monmap file {tmp}/{filename}
+      monmaptool: writing epoch 1 to {tmp}/{filename} (3 monitors)
+
+#. Check new contents:
 
 
-#. Check new contents. ::
+   .. prompt:: bash $
 
 
-       monmaptool --print {tmp}/{filename}
+       monmaptool --print {tmp}/{filename}
        
        
+   ::
+
        monmaptool: monmap file {tmp}/{filename}
        epoch 1
        fsid 224e376d-c5fe-4504-96bb-ea6332a19e61
        monmaptool: monmap file {tmp}/{filename}
        epoch 1
        fsid 224e376d-c5fe-4504-96bb-ea6332a19e61
@@ -370,9 +429,11 @@ monitors, and inject the modified monmap into each new monitor.
 #. First, make sure to stop all your monitors.  Injection must be done while 
    the daemon is not running.
 
 #. First, make sure to stop all your monitors.  Injection must be done while 
    the daemon is not running.
 
-#. Inject the monmap. ::
+#. Inject the monmap: 
+
+   .. prompt:: bash $
 
 
-       ceph-mon -i {mon-id} --inject-monmap {tmp}/{filename}
+      ceph-mon -i {mon-id} --inject-monmap {tmp}/{filename}
 
 #. Restart the monitors.
 
 
 #. Restart the monitors.
 
index 9213c4bc735cef1e221dd81c6e405c97c68edb44..3155528597aa420484186540fa85c94ddb000f8b 100644 (file)
@@ -71,9 +71,11 @@ weight).
 
 #. Create the OSD. If no UUID is given, it will be set automatically when the
    OSD starts up. The following command will output the OSD number, which you
 
 #. Create the OSD. If no UUID is given, it will be set automatically when the
    OSD starts up. The following command will output the OSD number, which you
-   will need for subsequent steps. ::
+   will need for subsequent steps:
 
 
-       ceph osd create [{uuid} [{id}]]
+   .. prompt:: bash $
+
+      ceph osd create [{uuid} [{id}]]
 
    If the optional parameter {id} is given it will be used as the OSD id.
    Note, in this case the command may fail if the number is already in use.
 
    If the optional parameter {id} is given it will be used as the OSD id.
    Note, in this case the command may fail if the number is already in use.
@@ -84,33 +86,38 @@ weight).
       clusters are large. If {id} is not specified, the smallest available is
       used.
 
       clusters are large. If {id} is not specified, the smallest available is
       used.
 
-#. Create the default directory on your new OSD. ::
+#. Create the default directory on your new OSD:
 
 
-       ssh {new-osd-host}
-       sudo mkdir /var/lib/ceph/osd/ceph-{osd-number}
+   .. prompt:: bash $
 
 
+      ssh {new-osd-host}
+      sudo mkdir /var/lib/ceph/osd/ceph-{osd-number}
 
 #. If the OSD is for a drive other than the OS drive, prepare it
 
 #. If the OSD is for a drive other than the OS drive, prepare it
-   for use with Ceph, and mount it to the directory you just created::
+   for use with Ceph, and mount it to the directory you just created:
+
+   .. prompt:: bash $
 
 
-       ssh {new-osd-host}
-       sudo mkfs -t {fstype} /dev/{drive}
-       sudo mount -o user_xattr /dev/{hdd} /var/lib/ceph/osd/ceph-{osd-number}
+      ssh {new-osd-host}
+      sudo mkfs -t {fstype} /dev/{drive}
+      sudo mount -o user_xattr /dev/{hdd} /var/lib/ceph/osd/ceph-{osd-number}
 
 
+#. Initialize the OSD data directory:
 
 
-#. Initialize the OSD data directory. ::
+   .. prompt:: bash $
 
 
-       ssh {new-osd-host}
-       ceph-osd -i {osd-num} --mkfs --mkkey
+      ssh {new-osd-host}
+      ceph-osd -i {osd-num} --mkfs --mkkey
 
    The directory must be empty before you can run ``ceph-osd``.
 
 #. Register the OSD authentication key. The value of ``ceph`` for
    ``ceph-{osd-num}`` in the path is the ``$cluster-$id``.  If your
 
    The directory must be empty before you can run ``ceph-osd``.
 
 #. Register the OSD authentication key. The value of ``ceph`` for
    ``ceph-{osd-num}`` in the path is the ``$cluster-$id``.  If your
-   cluster name differs from ``ceph``, use your cluster name instead.::
+   cluster name differs from ``ceph``, use your cluster name instead:
 
 
-       ceph auth add osd.{osd-num} osd 'allow *' mon 'allow rwx' -i /var/lib/ceph/osd/ceph-{osd-num}/keyring
+   .. prompt:: bash $
 
 
+      ceph auth add osd.{osd-num} osd 'allow *' mon 'allow rwx' -i /var/lib/ceph/osd/ceph-{osd-num}/keyring
 
 #. Add the OSD to the CRUSH map so that the OSD can begin receiving data. The
    ``ceph osd crush add`` command allows you to add OSDs to the CRUSH hierarchy
 
 #. Add the OSD to the CRUSH map so that the OSD can begin receiving data. The
    ``ceph osd crush add`` command allows you to add OSDs to the CRUSH hierarchy
@@ -120,9 +127,11 @@ weight).
    you specify only the root bucket, the command will attach the OSD directly
    to the root, but CRUSH rules expect OSDs to be inside of hosts.
 
    you specify only the root bucket, the command will attach the OSD directly
    to the root, but CRUSH rules expect OSDs to be inside of hosts.
 
-   Execute the following::
+   Execute the following:
 
 
-       ceph osd crush add {id-or-name} {weight}  [{bucket-type}={bucket-name} ...]
+   .. prompt:: bash $
+
+      ceph osd crush add {id-or-name} {weight}  [{bucket-type}={bucket-name} ...]
 
    You may also decompile the CRUSH map, add the OSD to the device list, add the
    host as a bucket (if it's not already in the CRUSH map), add the device as an
 
    You may also decompile the CRUSH map, add the OSD to the device list, add the
    host as a bucket (if it's not already in the CRUSH map), add the device as an
@@ -135,36 +144,51 @@ weight).
 Replacing an OSD
 ----------------
 
 Replacing an OSD
 ----------------
 
+.. note:: If the instructions in this section do not work for you, try the
+   instructions in the cephadm documentation: :ref:`cephadm-replacing-an-osd`.
+
 When disks fail, or if an administrator wants to reprovision OSDs with a new
 backend, for instance, for switching from FileStore to BlueStore, OSDs need to
 be replaced. Unlike `Removing the OSD`_, replaced OSD's id and CRUSH map entry
 need to be keep intact after the OSD is destroyed for replacement.
 
 When disks fail, or if an administrator wants to reprovision OSDs with a new
 backend, for instance, for switching from FileStore to BlueStore, OSDs need to
 be replaced. Unlike `Removing the OSD`_, replaced OSD's id and CRUSH map entry
 need to be keep intact after the OSD is destroyed for replacement.
 
-#. Make sure it is safe to destroy the OSD::
+#. Make sure it is safe to destroy the OSD:
 
 
-     while ! ceph osd safe-to-destroy osd.{id} ; do sleep 10 ; done
+   .. prompt:: bash $
 
 
-#. Destroy the OSD first::
+      while ! ceph osd safe-to-destroy osd.{id} ; do sleep 10 ; done
 
 
-     ceph osd destroy {id} --yes-i-really-mean-it
+#. Destroy the OSD first:
+
+   .. prompt:: bash $
+
+      ceph osd destroy {id} --yes-i-really-mean-it
 
 #. Zap a disk for the new OSD, if the disk was used before for other purposes.
 
 #. Zap a disk for the new OSD, if the disk was used before for other purposes.
-   It's not necessary for a new disk::
+   It's not necessary for a new disk:
+
+   .. prompt:: bash $
 
 
-     ceph-volume lvm zap /dev/sdX
+      ceph-volume lvm zap /dev/sdX
 
 
-#. Prepare the disk for replacement by using the previously destroyed OSD id::
+#. Prepare the disk for replacement by using the previously destroyed OSD id:
 
 
-     ceph-volume lvm prepare --osd-id {id} --data /dev/sdX
+   .. prompt:: bash $
 
 
-#. And activate the OSD::
+      ceph-volume lvm prepare --osd-id {id} --data /dev/sdX
 
 
-     ceph-volume lvm activate {id} {fsid}
+#. And activate the OSD:
+
+   .. prompt:: bash $
+
+      ceph-volume lvm activate {id} {fsid}
 
 Alternatively, instead of preparing and activating, the device can be recreated
 
 Alternatively, instead of preparing and activating, the device can be recreated
-in one call, like::
+in one call, like:
+
+   .. prompt:: bash $
 
 
-     ceph-volume lvm create --osd-id {id} --data /dev/sdX
+      ceph-volume lvm create --osd-id {id} --data /dev/sdX
 
 
 Starting the OSD
 
 
 Starting the OSD
@@ -174,9 +198,11 @@ After you add an OSD to Ceph, the OSD is in your configuration. However,
 it is not yet running. The OSD is ``down`` and ``in``. You must start
 your new OSD before it can begin receiving data. You may use
 ``service ceph`` from your admin host or start the OSD from its host
 it is not yet running. The OSD is ``down`` and ``in``. You must start
 your new OSD before it can begin receiving data. You may use
 ``service ceph`` from your admin host or start the OSD from its host
-machine::
+machine:
 
 
-       sudo systemctl start ceph-osd@{osd-num}
+   .. prompt:: bash $
+
+      sudo systemctl start ceph-osd@{osd-num}
 
 
 Once you start your OSD, it is ``up`` and ``in``.
 
 
 Once you start your OSD, it is ``up`` and ``in``.
@@ -187,15 +213,16 @@ Observe the Data Migration
 
 Once you have added your new OSD to the CRUSH map, Ceph  will begin rebalancing
 the server by migrating placement groups to your new OSD. You can observe this
 
 Once you have added your new OSD to the CRUSH map, Ceph  will begin rebalancing
 the server by migrating placement groups to your new OSD. You can observe this
-process with  the `ceph`_ tool. ::
+process with  the `ceph`_ tool. :
+
+   .. prompt:: bash $
 
 
-       ceph -w
+      ceph -w
 
 You should see the placement group states change from ``active+clean`` to
 ``active, some degraded objects``, and finally ``active+clean`` when migration
 completes. (Control-c to exit.)
 
 
 You should see the placement group states change from ``active+clean`` to
 ``active, some degraded objects``, and finally ``active+clean`` when migration
 completes. (Control-c to exit.)
 
-
 .. _Add/Move an OSD: ../crush-map#addosd
 .. _ceph: ../monitoring
 
 .. _Add/Move an OSD: ../crush-map#addosd
 .. _ceph: ../monitoring
 
@@ -222,9 +249,11 @@ Take the OSD out of the Cluster
 
 Before you remove an OSD, it is usually ``up`` and ``in``.  You need to take it
 out of the cluster so that Ceph can begin rebalancing and copying its data to
 
 Before you remove an OSD, it is usually ``up`` and ``in``.  You need to take it
 out of the cluster so that Ceph can begin rebalancing and copying its data to
-other OSDs. ::
+other OSDs. :
 
 
-       ceph osd out {osd-num}
+   .. prompt:: bash $
+
+      ceph osd out {osd-num}
 
 
 Observe the Data Migration
 
 
 Observe the Data Migration
@@ -232,9 +261,11 @@ Observe the Data Migration
 
 Once you have taken your OSD ``out`` of the cluster, Ceph  will begin
 rebalancing the cluster by migrating placement groups out of the OSD you
 
 Once you have taken your OSD ``out`` of the cluster, Ceph  will begin
 rebalancing the cluster by migrating placement groups out of the OSD you
-removed. You can observe  this process with  the `ceph`_ tool. ::
+removed. You can observe  this process with  the `ceph`_ tool. :
+
+   .. prompt:: bash $
 
 
-       ceph -w
+      ceph -w
 
 You should see the placement group states change from ``active+clean`` to
 ``active, some degraded objects``, and finally ``active+clean`` when migration
 
 You should see the placement group states change from ``active+clean`` to
 ``active, some degraded objects``, and finally ``active+clean`` when migration
@@ -246,12 +277,16 @@ completes. (Control-c to exit.)
    ``active+remapped`` state. If you are in this case, you should mark
    the OSD ``in`` with:
 
    ``active+remapped`` state. If you are in this case, you should mark
    the OSD ``in`` with:
 
-       ``ceph osd in {osd-num}``
+   .. prompt:: bash $
+
+      ceph osd in {osd-num}
 
    to come back to the initial state and then, instead of marking ``out``
    the OSD, set its weight to 0 with:
 
 
    to come back to the initial state and then, instead of marking ``out``
    the OSD, set its weight to 0 with:
 
-       ``ceph osd crush reweight osd.{osd-num} 0``
+   .. prompt:: bash $
+
+      ceph osd crush reweight osd.{osd-num} 0
 
    After that, you can observe the data migration which should come to its
    end. The difference between marking ``out`` the OSD and reweighting it
 
    After that, you can observe the data migration which should come to its
    end. The difference between marking ``out`` the OSD and reweighting it
@@ -267,10 +302,12 @@ Stopping the OSD
 
 After you take an OSD out of the cluster, it may still be running.
 That is, the OSD may be ``up`` and ``out``. You must stop
 
 After you take an OSD out of the cluster, it may still be running.
 That is, the OSD may be ``up`` and ``out``. You must stop
-your OSD before you remove it from the configuration. ::
+your OSD before you remove it from the configuration: 
+
+   .. prompt:: bash $
 
 
-       ssh {osd-host}
-       sudo systemctl stop ceph-osd@{osd-num}
+      ssh {osd-host}
+      sudo systemctl stop ceph-osd@{osd-num}
 
 Once you stop your OSD, it is ``down``.
 
 
 Once you stop your OSD, it is ``down``.
 
@@ -286,50 +323,64 @@ OSD for each drive by repeating this procedure.
 #. Let the cluster forget the OSD first. This step removes the OSD from the CRUSH
    map, removes its authentication key. And it is removed from the OSD map as
    well. Please note the :ref:`purge subcommand <ceph-admin-osd>` is introduced in Luminous, for older
 #. Let the cluster forget the OSD first. This step removes the OSD from the CRUSH
    map, removes its authentication key. And it is removed from the OSD map as
    well. Please note the :ref:`purge subcommand <ceph-admin-osd>` is introduced in Luminous, for older
-   versions, please see below ::
+   versions, please see below:
+
+   .. prompt:: bash $
 
 
-    ceph osd purge {id} --yes-i-really-mean-it
+      ceph osd purge {id} --yes-i-really-mean-it
 
 #. Navigate to the host where you keep the master copy of the cluster's
 
 #. Navigate to the host where you keep the master copy of the cluster's
-   ``ceph.conf`` file. ::
+   ``ceph.conf`` file:
 
 
-       ssh {admin-host}
-       cd /etc/ceph
-       vim ceph.conf
+   .. prompt:: bash $
 
 
-#. Remove the OSD entry from your ``ceph.conf`` file (if it exists). ::
+      ssh {admin-host}
+      cd /etc/ceph
+      vim ceph.conf
+
+#. Remove the OSD entry from your ``ceph.conf`` file (if it exists)::
 
        [osd.1]
                host = {hostname}
 
 
        [osd.1]
                host = {hostname}
 
-#. From the host where you keep the master copy of the cluster's ``ceph.conf`` file,
-   copy the updated ``ceph.conf`` file to the ``/etc/ceph`` directory of other
-   hosts in your cluster.
+#. From the host where you keep the master copy of the cluster's ``ceph.conf``
+   file, copy the updated ``ceph.conf`` file to the ``/etc/ceph`` directory of
+   other hosts in your cluster.
 
 
-If your Ceph cluster is older than Luminous, instead of using ``ceph osd purge``,
-you need to perform this step manually:
+If your Ceph cluster is older than Luminous, instead of using ``ceph osd
+purge``, you need to perform this step manually:
 
 
 #. Remove the OSD from the CRUSH map so that it no longer receives data. You may
    also decompile the CRUSH map, remove the OSD from the device list, remove the
    device as an item in the host bucket or remove the host  bucket (if it's in the
    CRUSH map and you intend to remove the host), recompile the map and set it.
 
 
 #. Remove the OSD from the CRUSH map so that it no longer receives data. You may
    also decompile the CRUSH map, remove the OSD from the device list, remove the
    device as an item in the host bucket or remove the host  bucket (if it's in the
    CRUSH map and you intend to remove the host), recompile the map and set it.
-   See `Remove an OSD`_ for details. ::
+   See `Remove an OSD`_ for details:
+
+   .. prompt:: bash $
+
+      ceph osd crush remove {name}
+
+#. Remove the OSD authentication key:
+
+   .. prompt:: bash $
+
+      ceph auth del osd.{osd-num}
 
 
-       ceph osd crush remove {name}
+   The value of ``ceph`` for ``ceph-{osd-num}`` in the path is the
+   ``$cluster-$id``.  If your cluster name differs from ``ceph``, use your
+   cluster name instead.
 
 
-#. Remove the OSD authentication key. ::
+#. Remove the OSD:
 
 
-       ceph auth del osd.{osd-num}
+   .. prompt:: bash $
 
 
-   The value of ``ceph`` for ``ceph-{osd-num}`` in the path is the ``$cluster-$id``.
-   If your cluster name differs from ``ceph``, use your cluster name instead.
+      ceph osd rm {osd-num}
 
 
-#. Remove the OSD. ::
+   for example:
 
 
-       ceph osd rm {osd-num}
-       #for example
-       ceph osd rm 1
+   .. prompt:: bash $
 
 
+      ceph osd rm 1
 
 .. _Remove an OSD: ../crush-map#removeosd
 
 .. _Remove an OSD: ../crush-map#removeosd
index 76ae9830da97902182a94a79801371877fc1365e..b02a8914d520c28150cfe81394b89a71f122a9db 100644 (file)
@@ -1,4 +1,3 @@
-
 .. _balancer:
 
 Balancer
 .. _balancer:
 
 Balancer
@@ -11,9 +10,11 @@ supervised fashion.
 Status
 ------
 
 Status
 ------
 
-The current status of the balancer can be checked at any time with::
+The current status of the balancer can be checked at any time with:
+
+   .. prompt:: bash $
 
 
-  ceph balancer status
+      ceph balancer status
 
 
 Automatic balancing
 
 
 Automatic balancing
@@ -21,9 +22,11 @@ Automatic balancing
 
 The automatic balancing feature is enabled by default in ``upmap``
 mode. Please refer to :ref:`upmap` for more details. The balancer can be
 
 The automatic balancing feature is enabled by default in ``upmap``
 mode. Please refer to :ref:`upmap` for more details. The balancer can be
-turned off with::
+turned off with:
+
+   .. prompt:: bash $
 
 
-  ceph balancer off
+      ceph balancer off
 
 The balancer mode can be changed to ``crush-compat`` mode, which is
 backward compatible with older clients, and will make small changes to
 
 The balancer mode can be changed to ``crush-compat`` mode, which is
 backward compatible with older clients, and will make small changes to
@@ -40,37 +43,51 @@ healed itself).
 When the cluster is healthy, the balancer will throttle its changes
 such that the percentage of PGs that are misplaced (i.e., that need to
 be moved) is below a threshold of (by default) 5%.  The
 When the cluster is healthy, the balancer will throttle its changes
 such that the percentage of PGs that are misplaced (i.e., that need to
 be moved) is below a threshold of (by default) 5%.  The
-``target_max_misplaced_ratio`` threshold can be adjusted with::
+``target_max_misplaced_ratio`` threshold can be adjusted with:
+
+   .. prompt:: bash $
+
+      ceph config set mgr target_max_misplaced_ratio .07   # 7%
+
+Set the number of seconds to sleep in between runs of the automatic balancer:
 
 
-  ceph config set mgr target_max_misplaced_ratio .07   # 7%
+   .. prompt:: bash $
 
 
-Set the number of seconds to sleep in between runs of the automatic balancer::
+      ceph config set mgr mgr/balancer/sleep_interval 60
 
 
-  ceph config set mgr mgr/balancer/sleep_interval 60
+Set the time of day to begin automatic balancing in HHMM format:
 
 
-Set the time of day to begin automatic balancing in HHMM format::
+   .. prompt:: bash $
 
 
-  ceph config set mgr mgr/balancer/begin_time 0000
+      ceph config set mgr mgr/balancer/begin_time 0000
 
 
-Set the time of day to finish automatic balancing in HHMM format::
+Set the time of day to finish automatic balancing in HHMM format:
 
 
-  ceph config set mgr mgr/balancer/end_time 2400
+   .. prompt:: bash $
+
+      ceph config set mgr mgr/balancer/end_time 2359
 
 Restrict automatic balancing to this day of the week or later. 
 
 Restrict automatic balancing to this day of the week or later. 
-Uses the same conventions as crontab, 0 or 7 is Sunday, 1 is Monday, and so on::
+Uses the same conventions as crontab, 0 is Sunday, 1 is Monday, and so on:
+
+   .. prompt:: bash $
 
 
-  ceph config set mgr mgr/balancer/begin_weekday 0
+      ceph config set mgr mgr/balancer/begin_weekday 0
 
 Restrict automatic balancing to this day of the week or earlier. 
 
 Restrict automatic balancing to this day of the week or earlier. 
-Uses the same conventions as crontab, 0 or 7 is Sunday, 1 is Monday, and so on::
+Uses the same conventions as crontab, 0 is Sunday, 1 is Monday, and so on:
+
+   .. prompt:: bash $
 
 
-  ceph config set mgr mgr/balancer/end_weekday 7
+      ceph config set mgr mgr/balancer/end_weekday 6
 
 Pool IDs to which the automatic balancing will be limited. 
 The default for this is an empty string, meaning all pools will be balanced. 
 
 Pool IDs to which the automatic balancing will be limited. 
 The default for this is an empty string, meaning all pools will be balanced. 
-The numeric pool IDs can be gotten with the :command:`ceph osd pool ls detail` command::
+The numeric pool IDs can be gotten with the :command:`ceph osd pool ls detail` command:
 
 
-  ceph config set mgr mgr/balancer/pool_ids 1,2,3
+   .. prompt:: bash $
+
+      ceph config set mgr mgr/balancer/pool_ids 1,2,3
 
 
 Modes
 
 
 Modes
@@ -112,9 +129,11 @@ There are currently two supported balancer modes:
 
    Note that using upmap requires that all clients be Luminous or newer.
 
 
    Note that using upmap requires that all clients be Luminous or newer.
 
-The default mode is ``upmap``.  The mode can be adjusted with::
+The default mode is ``upmap``.  The mode can be adjusted with:
+
+   .. prompt:: bash $
 
 
-  ceph balancer mode crush-compat
+      ceph balancer mode crush-compat
 
 Supervised optimization
 -----------------------
 
 Supervised optimization
 -----------------------
@@ -125,43 +144,63 @@ The balancer operation is broken into a few distinct phases:
 #. evaluating the quality of the data distribution, either for the current PG distribution, or the PG distribution that would result after executing a *plan*
 #. executing the *plan*
 
 #. evaluating the quality of the data distribution, either for the current PG distribution, or the PG distribution that would result after executing a *plan*
 #. executing the *plan*
 
-To evaluate and score the current distribution::
+To evaluate and score the current distribution:
 
 
-  ceph balancer eval
+   .. prompt:: bash $
 
 
-You can also evaluate the distribution for a single pool with::
+      ceph balancer eval
 
 
-  ceph balancer eval <pool-name>
+You can also evaluate the distribution for a single pool with:
 
 
-Greater detail for the evaluation can be seen with::
+   .. prompt:: bash $
 
 
-  ceph balancer eval-verbose ...
+      ceph balancer eval <pool-name>
+
+Greater detail for the evaluation can be seen with:
+
+   .. prompt:: bash $
+
+      ceph balancer eval-verbose ...
   
   
-The balancer can generate a plan, using the currently configured mode, with::
+The balancer can generate a plan, using the currently configured mode, with:
+
+   .. prompt:: bash $
+
+      ceph balancer optimize <plan-name>
+
+The name is provided by the user and can be any useful identifying string.  The contents of a plan can be seen with:
+
+   .. prompt:: bash $
+
+      ceph balancer show <plan-name>
+
+All plans can be shown with:
+
+   .. prompt:: bash $
 
 
-  ceph balancer optimize <plan-name>
+      ceph balancer ls
 
 
-The name is provided by the user and can be any useful identifying string.  The contents of a plan can be seen with::
+Old plans can be discarded with:
 
 
-  ceph balancer show <plan-name>
+   .. prompt:: bash $
 
 
-All plans can be shown with::
+      ceph balancer rm <plan-name>
 
 
-  ceph balancer ls
+Currently recorded plans are shown as part of the status command:
 
 
-Old plans can be discarded with::
+   .. prompt:: bash $
 
 
-  ceph balancer rm <plan-name>
+      ceph balancer status
 
 
-Currently recorded plans are shown as part of the status command::
+The quality of the distribution that would result after executing a plan can be calculated with:
 
 
-  ceph balancer status
+   .. prompt:: bash $
 
 
-The quality of the distribution that would result after executing a plan can be calculated with::
+      ceph balancer eval <plan-name>
 
 
-  ceph balancer eval <plan-name>
+Assuming the plan is expected to improve the distribution (i.e., it has a lower score than the current cluster state), the user can execute that plan with:
 
 
-Assuming the plan is expected to improve the distribution (i.e., it has a lower score than the current cluster state), the user can execute that plan with::
+   .. prompt:: bash $
 
 
-  ceph balancer execute <plan-name>
+      ceph balancer execute <plan-name>
 
 
index e1abf68059b94e84f017507aa1be38b7b1ca19ad..24026ac9325ead3aa8941229375ed80ca401c35d 100644 (file)
@@ -2,28 +2,29 @@
  BlueStore Migration
 =====================
 
  BlueStore Migration
 =====================
 
-Each OSD can run either BlueStore or FileStore, and a single Ceph
+Each OSD can run either BlueStore or Filestore, and a single Ceph
 cluster can contain a mix of both.  Users who have previously deployed
 cluster can contain a mix of both.  Users who have previously deployed
-FileStore are likely to want to transition to BlueStore in order to
-take advantage of the improved performance and robustness.  There are
+Filestore OSDs should transition to BlueStore in order to
+take advantage of the improved performance and robustness.  Moreover,
+Ceph releases beginning with Reef do not support Filestore. There are
 several strategies for making such a transition.
 
 several strategies for making such a transition.
 
-An individual OSD cannot be converted in place in isolation, however:
-BlueStore and FileStore are simply too different for that to be
-practical.  "Conversion" will rely either on the cluster's normal
+An individual OSD cannot be converted in place;
+BlueStore and Filestore are simply too different for that to be
+feasible.  The conversion process uses either the cluster's normal
 replication and healing support or tools and strategies that copy OSD
 replication and healing support or tools and strategies that copy OSD
-content from an old (FileStore) device to a new (BlueStore) one.
+content from an old (Filestore) device to a new (BlueStore) one.
 
 
 Deploy new OSDs with BlueStore
 ==============================
 
 
 
 Deploy new OSDs with BlueStore
 ==============================
 
-Any new OSDs (e.g., when the cluster is expanded) can be deployed
+New OSDs (e.g., when the cluster is expanded) should be deployed
 using BlueStore.  This is the default behavior so no specific change
 is needed.
 
 Similarly, any OSDs that are reprovisioned after replacing a failed drive
 using BlueStore.  This is the default behavior so no specific change
 is needed.
 
 Similarly, any OSDs that are reprovisioned after replacing a failed drive
-can use BlueStore.
+should use BlueStore.
 
 Convert existing OSDs
 =====================
 
 Convert existing OSDs
 =====================
@@ -31,69 +32,96 @@ Convert existing OSDs
 Mark out and replace
 --------------------
 
 Mark out and replace
 --------------------
 
-The simplest approach is to mark out each device in turn, wait for the
+The simplest approach is to ensure that the cluster is healthy,
+then mark ``out`` each device in turn, wait for
 data to replicate across the cluster, reprovision the OSD, and mark
 data to replicate across the cluster, reprovision the OSD, and mark
-it back in again.  It is simple and easy to automate.  However, it requires
-more data migration than should be necessary, so it is not optimal.
+it back ``in`` again.  Proceed to the next OSD when recovery is complete.
+This is easy to automate but results in more data migration than
+is strictly necessary, which in turn presents additional wear to SSDs and takes
+longer to complete.
 
 
-#. Identify a FileStore OSD to replace::
+#. Identify a Filestore OSD to replace::
 
      ID=<osd-id-number>
      DEVICE=<disk-device>
 
 
      ID=<osd-id-number>
      DEVICE=<disk-device>
 
-   You can tell whether a given OSD is FileStore or BlueStore with::
+   You can tell whether a given OSD is Filestore or BlueStore with:
 
 
-     ceph osd metadata $ID | grep osd_objectstore
+   .. prompt:: bash $
 
 
-   You can get a current count of filestore vs bluestore with::
+      ceph osd metadata $ID | grep osd_objectstore
 
 
-     ceph osd count-metadata osd_objectstore
+   You can get a current count of Filestore and BlueStore OSDs with:
 
 
-#. Mark the filestore OSD out::
+   .. prompt:: bash $
 
 
-     ceph osd out $ID
+      ceph osd count-metadata osd_objectstore
 
 
-#. Wait for the data to migrate off the OSD in question::
+#. Mark the Filestore OSD ``out``:
 
 
-     while ! ceph osd safe-to-destroy $ID ; do sleep 60 ; done
+   .. prompt:: bash $
 
 
-#. Stop the OSD::
+      ceph osd out $ID
 
 
-     systemctl kill ceph-osd@$ID
+#. Wait for the data to migrate off the OSD in question:
 
 
-#. Make note of which device this OSD is using::
+   .. prompt:: bash $
 
 
-     mount | grep /var/lib/ceph/osd/ceph-$ID
+      while ! ceph osd safe-to-destroy $ID ; do sleep 60 ; done
 
 
-#. Unmount the OSD::
+#. Stop the OSD:
 
 
-     umount /var/lib/ceph/osd/ceph-$ID
+   .. prompt:: bash $
+
+      systemctl kill ceph-osd@$ID
+
+#. Note which device this OSD is using:
+
+   .. prompt:: bash $
+
+      mount | grep /var/lib/ceph/osd/ceph-$ID
+
+#. Unmount the OSD:
+
+   .. prompt:: bash $
+
+      umount /var/lib/ceph/osd/ceph-$ID
 
 #. Destroy the OSD data. Be *EXTREMELY CAREFUL* as this will destroy
    the contents of the device; be certain the data on the device is
 
 #. Destroy the OSD data. Be *EXTREMELY CAREFUL* as this will destroy
    the contents of the device; be certain the data on the device is
-   not needed (i.e., that the cluster is healthy) before proceeding. ::
+   not needed (i.e., that the cluster is healthy) before proceeding:
 
 
-     ceph-volume lvm zap $DEVICE
+   .. prompt:: bash $
+
+      ceph-volume lvm zap $DEVICE
 
 #. Tell the cluster the OSD has been destroyed (and a new OSD can be
 
 #. Tell the cluster the OSD has been destroyed (and a new OSD can be
-   reprovisioned with the same ID)::
+   reprovisioned with the same ID):
+
+   .. prompt:: bash $
 
 
-     ceph osd destroy $ID --yes-i-really-mean-it
+      ceph osd destroy $ID --yes-i-really-mean-it
 
 
-#. Reprovision a BlueStore OSD in its place with the same OSD ID.
+#. Provision a BlueStore OSD in its place with the same OSD ID.
    This requires you do identify which device to wipe based on what you saw
    This requires you do identify which device to wipe based on what you saw
-   mounted above. BE CAREFUL! ::
+   mounted above. BE CAREFUL! Also note that hybrid OSDs may require
+   adjustments to these commands:
+
+   .. prompt:: bash $
 
 
-     ceph-volume lvm create --bluestore --data $DEVICE --osd-id $ID
+      ceph-volume lvm create --bluestore --data $DEVICE --osd-id $ID
 
 #. Repeat.
 
 
 #. Repeat.
 
-You can allow the refilling of the replacement OSD to happen
+You can allow balancing of the replacement OSD to happen
 concurrently with the draining of the next OSD, or follow the same
 procedure for multiple OSDs in parallel, as long as you ensure the
 cluster is fully clean (all data has all replicas) before destroying
 concurrently with the draining of the next OSD, or follow the same
 procedure for multiple OSDs in parallel, as long as you ensure the
 cluster is fully clean (all data has all replicas) before destroying
-any OSDs.  Failure to do so will reduce the redundancy of your data
-and increase the risk of (or potentially even cause) data loss.
+any OSDs.  If you reprovision multiple OSDs in parallel, be **very** careful to
+only zap / destroy OSDs within a single CRUSH failure domain, e.g. ``host`` or
+``rack``.  Failure to do so will reduce the redundancy and availability of
+your data and increase the risk of (or even cause) data loss.
+
 
 Advantages:
 
 
 Advantages:
 
@@ -116,40 +144,49 @@ to evacuate an entire host in order to use it as a spare, then the
 conversion can be done on a host-by-host basis with each stored copy of
 the data migrating only once.
 
 conversion can be done on a host-by-host basis with each stored copy of
 the data migrating only once.
 
-First, you need have empty host that has no data.  There are two ways to do this: either by starting with a new, empty host that isn't yet part of the cluster, or by offloading data from an existing host that in the cluster.
+First, you need an empty host that has no OSDs provisioned.  There are two
+ways to do this: either by starting with a new, empty host that isn't yet
+part of the cluster, or by offloading data from an existing host in the cluster.
 
 Use a new, empty host
 ^^^^^^^^^^^^^^^^^^^^^
 
 Ideally the host should have roughly the
 
 Use a new, empty host
 ^^^^^^^^^^^^^^^^^^^^^
 
 Ideally the host should have roughly the
-same capacity as other hosts you will be converting (although it
-doesn't strictly matter). ::
-
-  NEWHOST=<empty-host-name>
+same capacity as other hosts you will be converting.
+Add the host to the CRUSH hierarchy, but do not attach it to the root:
 
 
-Add the host to the CRUSH hierarchy, but do not attach it to the root::
+.. prompt:: bash $
 
 
-  ceph osd crush add-bucket $NEWHOST host
+   NEWHOST=<empty-host-name>
+   ceph osd crush add-bucket $NEWHOST host
 
 
-Make sure the ceph packages are installed.
+Make sure that Ceph packages are installed on the new host.
 
 Use an existing host
 ^^^^^^^^^^^^^^^^^^^^
 
 If you would like to use an existing host
 that is already part of the cluster, and there is sufficient free
 
 Use an existing host
 ^^^^^^^^^^^^^^^^^^^^
 
 If you would like to use an existing host
 that is already part of the cluster, and there is sufficient free
-space on that host so that all of its data can be migrated off,
-then you can instead do::
+space on that host so that all of its data can be migrated off to
+other cluster hosts, you can instead do::
+
 
 
-  OLDHOST=<existing-cluster-host-to-offload>
-  ceph osd crush unlink $OLDHOST default
+.. prompt:: bash $ 
+   
+   OLDHOST=<existing-cluster-host-to-offload>
+   ceph osd crush unlink $OLDHOST default
 
 where "default" is the immediate ancestor in the CRUSH map. (For
 smaller clusters with unmodified configurations this will normally
 be "default", but it might also be a rack name.)  You should now
 
 where "default" is the immediate ancestor in the CRUSH map. (For
 smaller clusters with unmodified configurations this will normally
 be "default", but it might also be a rack name.)  You should now
-see the host at the top of the OSD tree output with no parent::
+see the host at the top of the OSD tree output with no parent:
+
+.. prompt:: bash $
+
+   bin/ceph osd tree
+
+::
 
 
-  $ bin/ceph osd tree
   ID CLASS WEIGHT  TYPE NAME     STATUS REWEIGHT PRI-AFF
   -5             0 host oldhost
   10   ssd 1.00000     osd.10        up  1.00000 1.00000
   ID CLASS WEIGHT  TYPE NAME     STATUS REWEIGHT PRI-AFF
   -5             0 host oldhost
   10   ssd 1.00000     osd.10        up  1.00000 1.00000
@@ -172,13 +209,17 @@ Migration process
 If you're using a new host, start at step #1.  For an existing host,
 jump to step #5 below.
 
 If you're using a new host, start at step #1.  For an existing host,
 jump to step #5 below.
 
-#. Provision new BlueStore OSDs for all devices::
+#. Provision new BlueStore OSDs for all devices:
 
 
-     ceph-volume lvm create --bluestore --data /dev/$DEVICE
+   .. prompt:: bash $
 
 
-#. Verify OSDs join the cluster with::
+      ceph-volume lvm create --bluestore --data /dev/$DEVICE
 
 
-     ceph osd tree
+#. Verify OSDs join the cluster with:
+
+   .. prompt:: bash $
+
+      ceph osd tree
 
    You should see the new host ``$NEWHOST`` with all of the OSDs beneath
    it, but the host should *not* be nested beneath any other node in
 
    You should see the new host ``$NEWHOST`` with all of the OSDs beneath
    it, but the host should *not* be nested beneath any other node in
@@ -198,13 +239,17 @@ jump to step #5 below.
       2   ssd 1.00000         osd.2     up  1.00000 1.00000
      ...
 
       2   ssd 1.00000         osd.2     up  1.00000 1.00000
      ...
 
-#. Identify the first target host to convert ::
+#. Identify the first target host to convert :
+
+   .. prompt:: bash $
 
 
-     OLDHOST=<existing-cluster-host-to-convert>
+      OLDHOST=<existing-cluster-host-to-convert>
 
 
-#. Swap the new host into the old host's position in the cluster::
+#. Swap the new host into the old host's position in the cluster:
 
 
-     ceph osd crush swap-bucket $NEWHOST $OLDHOST
+   .. prompt:: bash $
+
+      ceph osd crush swap-bucket $NEWHOST $OLDHOST
 
    At this point all data on ``$OLDHOST`` will start migrating to OSDs
    on ``$NEWHOST``.  If there is a difference in the total capacity of
 
    At this point all data on ``$OLDHOST`` will start migrating to OSDs
    on ``$NEWHOST``.  If there is a difference in the total capacity of
@@ -212,30 +257,40 @@ jump to step #5 below.
    other nodes in the cluster, but as long as the hosts are similarly
    sized this will be a relatively small amount of data.
 
    other nodes in the cluster, but as long as the hosts are similarly
    sized this will be a relatively small amount of data.
 
-#. Wait for data migration to complete::
+#. Wait for data migration to complete:
+
+   .. prompt:: bash $
+
+      while ! ceph osd safe-to-destroy $(ceph osd ls-tree $OLDHOST); do sleep 60 ; done
 
 
-     while ! ceph osd safe-to-destroy $(ceph osd ls-tree $OLDHOST); do sleep 60 ; done
+#. Stop all old OSDs on the now-empty ``$OLDHOST``:
 
 
-#. Stop all old OSDs on the now-empty ``$OLDHOST``::
+   .. prompt:: bash $
 
 
-     ssh $OLDHOST
-     systemctl kill ceph-osd.target
-     umount /var/lib/ceph/osd/ceph-*
+      ssh $OLDHOST
+      systemctl kill ceph-osd.target
+      umount /var/lib/ceph/osd/ceph-*
 
 
-#. Destroy and purge the old OSDs::
+#. Destroy and purge the old OSDs:
 
 
-     for osd in `ceph osd ls-tree $OLDHOST`; do
+   .. prompt:: bash $
+
+      for osd in `ceph osd ls-tree $OLDHOST`; do
          ceph osd purge $osd --yes-i-really-mean-it
          ceph osd purge $osd --yes-i-really-mean-it
-     done
+      done
 
 #. Wipe the old OSD devices. This requires you do identify which
 
 #. Wipe the old OSD devices. This requires you do identify which
-   devices are to be wiped manually (BE CAREFUL!). For each device,::
+   devices are to be wiped manually (BE CAREFUL!). For each device:
+
+   .. prompt:: bash $
 
 
-     ceph-volume lvm zap $DEVICE
+      ceph-volume lvm zap $DEVICE
 
 #. Use the now-empty host as the new host, and repeat::
 
 
 #. Use the now-empty host as the new host, and repeat::
 
-     NEWHOST=$OLDHOST
+   .. prompt:: bash $
+
+      NEWHOST=$OLDHOST
 
 Advantages:
 
 
 Advantages:
 
@@ -248,7 +303,7 @@ Disadvantages:
 
 * A spare host is required.
 * An entire host's worth of OSDs will be migrating data at a time.  This
 
 * A spare host is required.
 * An entire host's worth of OSDs will be migrating data at a time.  This
-  is like likely to impact overall cluster performance.
+  is likely to impact overall cluster performance.
 * All migrated data still makes one full hop over the network.
 
 
 * All migrated data still makes one full hop over the network.
 
 
@@ -258,13 +313,13 @@ Per-OSD device copy
 A single logical OSD can be converted by using the ``copy`` function
 of ``ceph-objectstore-tool``.  This requires that the host have a free
 device (or devices) to provision a new, empty BlueStore OSD.  For
 A single logical OSD can be converted by using the ``copy`` function
 of ``ceph-objectstore-tool``.  This requires that the host have a free
 device (or devices) to provision a new, empty BlueStore OSD.  For
-example, if each host in your cluster has 12 OSDs, then you'd need a
-13th available device so that each OSD can be converted in turn before the
+example, if each host in your cluster has twelve OSDs, then you'd need a
+thirteenth unused device so that each OSD can be converted in turn before the
 old device is reclaimed to convert the next OSD.
 
 Caveats:
 
 old device is reclaimed to convert the next OSD.
 
 Caveats:
 
-* This strategy requires that a blank BlueStore OSD be prepared
+* This strategy requires that an empty BlueStore OSD be prepared
   without allocating a new OSD ID, something that the ``ceph-volume``
   tool doesn't support.  More importantly, the setup of *dmcrypt* is
   closely tied to the OSD identity, which means that this approach
   without allocating a new OSD ID, something that the ``ceph-volume``
   tool doesn't support.  More importantly, the setup of *dmcrypt* is
   closely tied to the OSD identity, which means that this approach
index 8dec0ced6544329c1d1c1524f2318b14d83accc2..8056ace4743bd628a8b6296c693bb08bd3230a2e 100644 (file)
@@ -45,16 +45,22 @@ and the backing storage tier automatically. However, admins have the ability to
 configure how this migration takes place by setting the ``cache-mode``. There are
 two main scenarios:
 
 configure how this migration takes place by setting the ``cache-mode``. There are
 two main scenarios:
 
-- **writeback** mode: When admins configure tiers with ``writeback`` mode, Ceph
-  clients write data to the cache tier and receive an ACK from the cache tier.
-  In time, the data written to the cache tier migrates to the storage tier
-  and gets flushed from the cache tier. Conceptually, the cache tier is 
-  overlaid "in front" of the backing storage tier. When a Ceph client needs 
-  data that resides in the storage tier, the cache tiering agent migrates the
-  data to the cache tier on read, then it is sent to the Ceph client. 
-  Thereafter, the Ceph client can perform I/O using the cache tier, until the 
-  data becomes inactive. This is ideal for mutable data (e.g., photo/video 
-  editing, transactional data, etc.).
+- **writeback** mode: If the base tier and the cache tier are configured in
+  ``writeback`` mode, Ceph clients receive an ACK from the base tier every time
+  they write data to it. Then the cache tiering agent determines whether
+  ``osd_tier_default_cache_min_write_recency_for_promote`` has been set. If it
+  has been set and the data has been written more than a specified number of
+  times per interval, the data is promoted to the cache tier.
+
+  When Ceph clients need access to data stored in the base tier, the cache
+  tiering agent reads the data from the base tier and returns it to the client.
+  While data is being read from the base tier, the cache tiering agent consults
+  the value of ``osd_tier_default_cache_min_read_recency_for_promote`` and
+  decides whether to promote that data from the base tier to the cache tier.
+  When data has been promoted from the base tier to the cache tier, the Ceph
+  client is able to perform I/O operations on it using the cache tier. This is
+  well-suited for mutable data (for example, photo/video editing, transactional
+  data).
 
 - **readproxy** mode: This mode will use any objects that already
   exist in the cache tier, but if an object is not present in the
 
 - **readproxy** mode: This mode will use any objects that already
   exist in the cache tier, but if an object is not present in the
@@ -199,62 +205,82 @@ Creating a Cache Tier
 =====================
 
 Setting up a cache tier involves associating a backing storage pool with
 =====================
 
 Setting up a cache tier involves associating a backing storage pool with
-a cache pool ::
+a cache pool:
 
 
-       ceph osd tier add {storagepool} {cachepool}
+.. prompt:: bash $
 
 
-For example ::
+   ceph osd tier add {storagepool} {cachepool}
 
 
-       ceph osd tier add cold-storage hot-storage
+For example:
 
 
-To set the cache mode, execute the following::
+.. prompt:: bash $
 
 
-       ceph osd tier cache-mode {cachepool} {cache-mode}
+   ceph osd tier add cold-storage hot-storage
 
 
-For example:: 
+To set the cache mode, execute the following:
 
 
-       ceph osd tier cache-mode hot-storage writeback
+.. prompt:: bash $
+
+   ceph osd tier cache-mode {cachepool} {cache-mode}
+
+For example:
+
+.. prompt:: bash $
+
+   ceph osd tier cache-mode hot-storage writeback
 
 The cache tiers overlay the backing storage tier, so they require one
 additional step: you must direct all client traffic from the storage pool to 
 the cache pool. To direct client traffic directly to the cache pool, execute 
 
 The cache tiers overlay the backing storage tier, so they require one
 additional step: you must direct all client traffic from the storage pool to 
 the cache pool. To direct client traffic directly to the cache pool, execute 
-the following:: 
+the following:
+
+.. prompt:: bash $
 
 
-       ceph osd tier set-overlay {storagepool} {cachepool}
+   ceph osd tier set-overlay {storagepool} {cachepool}
 
 
-For example:
+For example:
 
 
-       ceph osd tier set-overlay cold-storage hot-storage
+.. prompt:: bash $
+
+   ceph osd tier set-overlay cold-storage hot-storage
 
 
 Configuring a Cache Tier
 ========================
 
 Cache tiers have several configuration options. You may set
 
 
 Configuring a Cache Tier
 ========================
 
 Cache tiers have several configuration options. You may set
-cache tier configuration options with the following usage:
+cache tier configuration options with the following usage:
 
 
-       ceph osd pool set {cachepool} {key} {value}
+.. prompt:: bash $
 
 
+   ceph osd pool set {cachepool} {key} {value}
+   
 See `Pools - Set Pool Values`_ for details.
 
 
 Target Size and Type
 --------------------
 
 See `Pools - Set Pool Values`_ for details.
 
 
 Target Size and Type
 --------------------
 
-Ceph's production cache tiers use a `Bloom Filter`_ for the ``hit_set_type``::
+Ceph's production cache tiers use a `Bloom Filter`_ for the ``hit_set_type``:
+
+.. prompt:: bash $
 
 
-       ceph osd pool set {cachepool} hit_set_type bloom
+   ceph osd pool set {cachepool} hit_set_type bloom
 
 
-For example::
+For example:
 
 
-       ceph osd pool set hot-storage hit_set_type bloom
+.. prompt:: bash $
+
+   ceph osd pool set hot-storage hit_set_type bloom
 
 The ``hit_set_count`` and ``hit_set_period`` define how many such HitSets to
 
 The ``hit_set_count`` and ``hit_set_period`` define how many such HitSets to
-store, and how much time each HitSet should cover. ::
+store, and how much time each HitSet should cover:
+
+.. prompt:: bash $
 
 
-       ceph osd pool set {cachepool} hit_set_count 12
-       ceph osd pool set {cachepool} hit_set_period 14400
-       ceph osd pool set {cachepool} target_max_bytes 1000000000000
+   ceph osd pool set {cachepool} hit_set_count 12
+   ceph osd pool set {cachepool} hit_set_period 14400
+   ceph osd pool set {cachepool} target_max_bytes 1000000000000
 
 .. note:: A larger ``hit_set_count`` results in more RAM consumed by
           the ``ceph-osd`` process.
 
 .. note:: A larger ``hit_set_count`` results in more RAM consumed by
           the ``ceph-osd`` process.
@@ -273,10 +299,12 @@ number of archive HitSets are checked. The object is promoted if the object is
 found in any of the most recent ``min_read_recency_for_promote`` HitSets.
 
 A similar parameter can be set for the write operation, which is
 found in any of the most recent ``min_read_recency_for_promote`` HitSets.
 
 A similar parameter can be set for the write operation, which is
-``min_write_recency_for_promote``. ::
+``min_write_recency_for_promote``:
 
 
-       ceph osd pool set {cachepool} min_read_recency_for_promote 2
-       ceph osd pool set {cachepool} min_write_recency_for_promote 2
+.. prompt:: bash $
+
+   ceph osd pool set {cachepool} min_read_recency_for_promote 2
+   ceph osd pool set {cachepool} min_write_recency_for_promote 2
 
 .. note:: The longer the period and the higher the
    ``min_read_recency_for_promote`` and
 
 .. note:: The longer the period and the higher the
    ``min_read_recency_for_promote`` and
@@ -303,22 +331,29 @@ Absolute Sizing
 
 The cache tiering agent can flush or evict objects based upon the total number
 of bytes or the total number of objects. To specify a maximum number of bytes,
 
 The cache tiering agent can flush or evict objects based upon the total number
 of bytes or the total number of objects. To specify a maximum number of bytes,
-execute the following::
+execute the following:
+
+.. prompt:: bash $
+
+   ceph osd pool set {cachepool} target_max_bytes {#bytes}
+
+For example, to flush or evict at 1 TB, execute the following:
 
 
-       ceph osd pool set {cachepool} target_max_bytes {#bytes}
+.. prompt:: bash $
 
 
-For example, to flush or evict at 1 TB, execute the following::
+   ceph osd pool set hot-storage target_max_bytes 1099511627776
 
 
-       ceph osd pool set hot-storage target_max_bytes 1099511627776
+To specify the maximum number of objects, execute the following:
 
 
+.. prompt:: bash $
 
 
-To specify the maximum number of objects, execute the following::
+   ceph osd pool set {cachepool} target_max_objects {#objects}
 
 
-       ceph osd pool set {cachepool} target_max_objects {#objects}
+For example, to flush or evict at 1M objects, execute the following:
 
 
-For example, to flush or evict at 1M objects, execute the following::
+.. prompt:: bash $
 
 
-       ceph osd pool set hot-storage target_max_objects 1000000
+   ceph osd pool set hot-storage target_max_objects 1000000
 
 .. note:: Ceph is not able to determine the size of a cache pool automatically, so
    the configuration on the absolute size is required here, otherwise the
 
 .. note:: Ceph is not able to determine the size of a cache pool automatically, so
    the configuration on the absolute size is required here, otherwise the
@@ -335,59 +370,79 @@ The cache tiering agent can flush or evict objects relative to the size of the
 cache pool(specified by ``target_max_bytes`` / ``target_max_objects`` in
 `Absolute sizing`_).  When the cache pool consists of a certain percentage of
 modified (or dirty) objects, the cache tiering agent will flush them to the
 cache pool(specified by ``target_max_bytes`` / ``target_max_objects`` in
 `Absolute sizing`_).  When the cache pool consists of a certain percentage of
 modified (or dirty) objects, the cache tiering agent will flush them to the
-storage pool. To set the ``cache_target_dirty_ratio``, execute the following::
+storage pool. To set the ``cache_target_dirty_ratio``, execute the following:
 
 
-       ceph osd pool set {cachepool} cache_target_dirty_ratio {0.0..1.0}
+.. prompt:: bash $
+
+   ceph osd pool set {cachepool} cache_target_dirty_ratio {0.0..1.0}
 
 For example, setting the value to ``0.4`` will begin flushing modified
 
 For example, setting the value to ``0.4`` will begin flushing modified
-(dirty) objects when they reach 40% of the cache pool's capacity:: 
+(dirty) objects when they reach 40% of the cache pool's capacity:
+
+.. prompt:: bash $
 
 
-       ceph osd pool set hot-storage cache_target_dirty_ratio 0.4
+   ceph osd pool set hot-storage cache_target_dirty_ratio 0.4
 
 When the dirty objects reaches a certain percentage of its capacity, flush dirty
 
 When the dirty objects reaches a certain percentage of its capacity, flush dirty
-objects with a higher speed. To set the ``cache_target_dirty_high_ratio``::
+objects with a higher speed. To set the ``cache_target_dirty_high_ratio``:
+
+.. prompt:: bash $
+
+   ceph osd pool set {cachepool} cache_target_dirty_high_ratio {0.0..1.0}
 
 
-       ceph osd pool set {cachepool} cache_target_dirty_high_ratio {0.0..1.0}
+For example, setting the value to ``0.6`` will begin aggressively flush dirty
+objects when they reach 60% of the cache pool's capacity. obviously, we'd
+better set the value between dirty_ratio and full_ratio:
 
 
-For example, setting the value to ``0.6`` will begin aggressively flush dirty objects
-when they reach 60% of the cache pool's capacity. obviously, we'd better set the value
-between dirty_ratio and full_ratio::
+.. prompt:: bash $
 
 
-       ceph osd pool set hot-storage cache_target_dirty_high_ratio 0.6
+   ceph osd pool set hot-storage cache_target_dirty_high_ratio 0.6
 
 When the cache pool reaches a certain percentage of its capacity, the cache
 tiering agent will evict objects to maintain free capacity. To set the 
 
 When the cache pool reaches a certain percentage of its capacity, the cache
 tiering agent will evict objects to maintain free capacity. To set the 
-``cache_target_full_ratio``, execute the following:
+``cache_target_full_ratio``, execute the following:
 
 
-       ceph osd pool set {cachepool} cache_target_full_ratio {0.0..1.0}
+.. prompt:: bash $
+
+   ceph osd pool set {cachepool} cache_target_full_ratio {0.0..1.0}
 
 For example, setting the value to ``0.8`` will begin flushing unmodified
 
 For example, setting the value to ``0.8`` will begin flushing unmodified
-(clean) objects when they reach 80% of the cache pool's capacity:: 
+(clean) objects when they reach 80% of the cache pool's capacity:
+
+.. prompt:: bash $
 
 
-       ceph osd pool set hot-storage cache_target_full_ratio 0.8
+   ceph osd pool set hot-storage cache_target_full_ratio 0.8
 
 
 Cache Age
 ---------
 
 You can specify the minimum age of an object before the cache tiering agent 
 
 
 Cache Age
 ---------
 
 You can specify the minimum age of an object before the cache tiering agent 
-flushes a recently modified (or dirty) object to the backing storage pool::
+flushes a recently modified (or dirty) object to the backing storage pool:
+
+.. prompt:: bash $
+
+   ceph osd pool set {cachepool} cache_min_flush_age {#seconds}
+
+For example, to flush modified (or dirty) objects after 10 minutes, execute the
+following:
 
 
-       ceph osd pool set {cachepool} cache_min_flush_age {#seconds}
+.. prompt:: bash $
 
 
-For example, to flush modified (or dirty) objects after 10 minutes, execute 
-the following:: 
+   ceph osd pool set hot-storage cache_min_flush_age 600
 
 
-       ceph osd pool set hot-storage cache_min_flush_age 600
+You can specify the minimum age of an object before it will be evicted from the
+cache tier:
 
 
-You can specify the minimum age of an object before it will be evicted from
-the cache tier::
+.. prompt:: bash $
 
 
-       ceph osd pool {cache-tier} cache_min_evict_age {#seconds}
+   ceph osd pool {cache-tier} cache_min_evict_age {#seconds}
 
 
-For example, to evict objects after 30 minutes, execute the following:
+For example, to evict objects after 30 minutes, execute the following:
 
 
-       ceph osd pool set hot-storage cache_min_evict_age 1800
+.. prompt:: bash $
+
+   ceph osd pool set hot-storage cache_min_evict_age 1800
 
 
 Removing a Cache Tier
 
 
 Removing a Cache Tier
@@ -403,22 +458,29 @@ Removing a Read-Only Cache
 Since a read-only cache does not have modified data, you can disable
 and remove it without losing any recent changes to objects in the cache. 
 
 Since a read-only cache does not have modified data, you can disable
 and remove it without losing any recent changes to objects in the cache. 
 
-#. Change the cache-mode to ``none`` to disable it. :: 
+#. Change the cache-mode to ``none`` to disable it.:
+
+   .. prompt:: bash 
+
+      ceph osd tier cache-mode {cachepool} none
+
+   For example:
 
 
-       ceph osd tier cache-mode {cachepool} none
+   .. prompt:: bash $
 
 
-   For example:: 
+      ceph osd tier cache-mode hot-storage none
 
 
-       ceph osd tier cache-mode hot-storage none
+#. Remove the cache pool from the backing pool.:
 
 
-#. Remove the cache pool from the backing pool. ::
+   .. prompt:: bash $
 
 
-       ceph osd tier remove {storagepool} {cachepool}
+      ceph osd tier remove {storagepool} {cachepool}
 
 
-   For example::
+   For example:
 
 
-       ceph osd tier remove cold-storage hot-storage
+   .. prompt:: bash $
 
 
+      ceph osd tier remove cold-storage hot-storage
 
 
 Removing a Writeback Cache
 
 
 Removing a Writeback Cache
@@ -430,41 +492,57 @@ disable and remove it.
 
 
 #. Change the cache mode to ``proxy`` so that new and modified objects will 
 
 
 #. Change the cache mode to ``proxy`` so that new and modified objects will 
-   flush to the backing storage pool. ::
+   flush to the backing storage pool.:
 
 
-       ceph osd tier cache-mode {cachepool} proxy
+   .. prompt:: bash $
 
 
-   For example:: 
+      ceph osd tier cache-mode {cachepool} proxy
 
 
-       ceph osd tier cache-mode hot-storage proxy
+   For example: 
 
 
+   .. prompt:: bash $
 
 
-#. Ensure that the cache pool has been flushed. This may take a few minutes::
+      ceph osd tier cache-mode hot-storage proxy
 
 
-       rados -p {cachepool} ls
+
+#. Ensure that the cache pool has been flushed. This may take a few minutes:
+
+   .. prompt:: bash $
+
+      rados -p {cachepool} ls
 
    If the cache pool still has objects, you can flush them manually. 
 
    If the cache pool still has objects, you can flush them manually. 
-   For example::
+   For example:
+
+   .. prompt:: bash $
+
+      rados -p {cachepool} cache-flush-evict-all
+
+
+#. Remove the overlay so that clients will not direct traffic to the cache.:
+
+   .. prompt:: bash $
 
 
-       rados -p {cachepool} cache-flush-evict-all
+      ceph osd tier remove-overlay {storagetier}
 
 
+   For example:
 
 
-#. Remove the overlay so that clients will not direct traffic to the cache. ::
+   .. prompt:: bash $
 
 
-       ceph osd tier remove-overlay {storagetier}
+      ceph osd tier remove-overlay cold-storage
 
 
-   For example::
 
 
-       ceph osd tier remove-overlay cold-storage
+#. Finally, remove the cache tier pool from the backing storage pool.:
 
 
+   .. prompt:: bash $
 
 
-#. Finally, remove the cache tier pool from the backing storage pool. ::
+      ceph osd tier remove {storagepool} {cachepool} 
 
 
-       ceph osd tier remove {storagepool} {cachepool} 
+   For example:
 
 
-   For example::
+   .. prompt:: bash $
 
 
-       ceph osd tier remove cold-storage hot-storage
+      ceph osd tier remove cold-storage hot-storage
 
 
 .. _Create a Pool: ../pools#create-a-pool
 
 
 .. _Create a Pool: ../pools#create-a-pool
index 558e7d85b78fa7bca8c3248bf4712797445ddc84..eba730bdccae4be82d977cd4bacfec718fd5a2b4 100644 (file)
@@ -30,18 +30,24 @@ This mode lets you mark monitors as disallowd, in which case they will
 participate in the quorum and serve clients, but cannot be elected leader. You
 may wish to use this if you have some monitors which are known to be far away
 from clients.
 participate in the quorum and serve clients, but cannot be elected leader. You
 may wish to use this if you have some monitors which are known to be far away
 from clients.
-You can disallow a leader by running ::
+You can disallow a leader by running:
 
 
-  $ ceph mon add disallowed_leader {name}
+.. prompt:: bash $
+
+   ceph mon add disallowed_leader {name}
 
 You can remove a monitor from the disallowed list, and allow it to become
 
 You can remove a monitor from the disallowed list, and allow it to become
-a leader again, by running ::
+a leader again, by running:
+
+.. prompt:: bash $
+
+   ceph mon rm disallowed_leader {name}
 
 
-  $ ceph mon rm disallowed_leader {name}
+The list of disallowed_leaders is included when you run:
 
 
-The list of disallowed_leaders is included when you run ::
+.. prompt:: bash $
 
 
-  $ ceph mon dump
+   ceph mon dump
 
 The connectivity Mode
 =====================
 
 The connectivity Mode
 =====================
@@ -58,9 +64,11 @@ Examining connectivity scores
 =============================
 The monitors maintain connection scores even if they aren't in
 the connectivity election mode. You can examine the scores a monitor
 =============================
 The monitors maintain connection scores even if they aren't in
 the connectivity election mode. You can examine the scores a monitor
-has by running ::
+has by running:
 
 
-  ceph daemon mon.{name} connection scores dump
+.. prompt:: bash $
+
+   ceph daemon mon.{name} connection scores dump
 
 Scores for individual connections range from 0-1 inclusive, and also
 include whether the connection is considered alive or dead (determined by
 
 Scores for individual connections range from 0-1 inclusive, and also
 include whether the connection is considered alive or dead (determined by
@@ -68,9 +76,11 @@ whether it returned its latest ping within the timeout).
 
 While this would be an unexpected occurrence, if for some reason you experience
 problems and troubleshooting makes you think your scores have become invalid,
 
 While this would be an unexpected occurrence, if for some reason you experience
 problems and troubleshooting makes you think your scores have become invalid,
-you can forget history and reset them by running ::
+you can forget history and reset them by running:
+
+.. prompt:: bash $
 
 
-  ceph daemon mon.{name} connection scores reset
+   ceph daemon mon.{name} connection scores reset
 
 While resetting scores has low risk (monitors will still quickly determine
 if a connection is alive or dead, and trend back to the previous scores if they
 
 While resetting scores has low risk (monitors will still quickly determine
 if a connection is alive or dead, and trend back to the previous scores if they
index ebe38a1d2c633d9e03541f5ad9f9bab769da2d2d..839165ebee41bee4776edc9d08408e16abd1e500 100644 (file)
@@ -8,38 +8,50 @@
 Monitor Commands
 ================
 
 Monitor Commands
 ================
 
-Monitor commands are issued using the ``ceph`` utility::
+Monitor commands are issued using the ``ceph`` utility:
 
 
-       ceph [-m monhost] {command}
+.. prompt:: bash $
 
 
-The command is usually (though not always) of the form::
+   ceph [-m monhost] {command}
 
 
-       ceph {subsystem} {command}
+The command is usually (though not always) of the form:
+
+.. prompt:: bash $
+
+   ceph {subsystem} {command}
 
 
 System Commands
 ===============
 
 
 
 System Commands
 ===============
 
-Execute the following to display the current cluster status.  ::
+Execute the following to display the current cluster status.  :
 
 
-       ceph -s
-       ceph status
+.. prompt:: bash $
+
+   ceph -s
+   ceph status
 
 Execute the following to display a running summary of cluster status
 
 Execute the following to display a running summary of cluster status
-and major events. ::
+and major events. :
+
+.. prompt:: bash $
 
 
-       ceph -w
+   ceph -w
 
 Execute the following to show the monitor quorum, including which monitors are
 
 Execute the following to show the monitor quorum, including which monitors are
-participating and which one is the leader. ::
+participating and which one is the leader. :
 
 
-       ceph mon stat
-       ceph quorum_status
+.. prompt:: bash $
+
+   ceph mon stat
+   ceph quorum_status
 
 Execute the following to query the status of a single monitor, including whether
 
 Execute the following to query the status of a single monitor, including whether
-or not it is in the quorum. ::
+or not it is in the quorum. :
+
+.. prompt:: bash $
 
 
-       ceph tell mon.[id] mon_status
+   ceph tell mon.[id] mon_status
 
 where the value of ``[id]`` can be determined, e.g., from ``ceph -s``.
 
 
 where the value of ``[id]`` can be determined, e.g., from ``ceph -s``.
 
@@ -47,21 +59,27 @@ where the value of ``[id]`` can be determined, e.g., from ``ceph -s``.
 Authentication Subsystem
 ========================
 
 Authentication Subsystem
 ========================
 
-To add a keyring for an OSD, execute the following::
+To add a keyring for an OSD, execute the following:
+
+.. prompt:: bash $
 
 
-       ceph auth add {osd} {--in-file|-i} {path-to-osd-keyring}
+   ceph auth add {osd} {--in-file|-i} {path-to-osd-keyring}
 
 
-To list the cluster's keys and their capabilities, execute the following::
+To list the cluster's keys and their capabilities, execute the following:
 
 
-       ceph auth ls
+.. prompt:: bash $
+
+   ceph auth ls
 
 
 Placement Group Subsystem
 =========================
 
 
 
 Placement Group Subsystem
 =========================
 
-To display the statistics for all placement groups (PGs), execute the following:: 
+To display the statistics for all placement groups (PGs), execute the following: 
+
+.. prompt:: bash $
 
 
-       ceph pg dump [--format {format}]
+   ceph pg dump [--format {format}]
 
 The valid formats are ``plain`` (default), ``json`` ``json-pretty``, ``xml``, and ``xml-pretty``.
 When implementing monitoring and other tools, it is best to use ``json`` format.
 
 The valid formats are ``plain`` (default), ``json`` ``json-pretty``, ``xml``, and ``xml-pretty``.
 When implementing monitoring and other tools, it is best to use ``json`` format.
@@ -70,9 +88,11 @@ less variable from release to release.  The ``jq`` utility can be invaluable whe
 data from JSON output.
 
 To display the statistics for all placement groups stuck in a specified state, 
 data from JSON output.
 
 To display the statistics for all placement groups stuck in a specified state, 
-execute the following:: 
+execute the following: 
 
 
-       ceph pg dump_stuck inactive|unclean|stale|undersized|degraded [--format {format}] [-t|--threshold {seconds}]
+.. prompt:: bash $
+
+   ceph pg dump_stuck inactive|unclean|stale|undersized|degraded [--format {format}] [-t|--threshold {seconds}]
 
 
 ``--format`` may be ``plain`` (default), ``json``, ``json-pretty``, ``xml``, or ``xml-pretty``.
 
 
 ``--format`` may be ``plain`` (default), ``json``, ``json-pretty``, ``xml``, or ``xml-pretty``.
@@ -90,9 +110,11 @@ reported to the monitor cluster in a while (configured by
 ``mon_osd_report_timeout``).
 
 Delete "lost" objects or revert them to their prior state, either a previous version
 ``mon_osd_report_timeout``).
 
 Delete "lost" objects or revert them to their prior state, either a previous version
-or delete them if they were just created. ::
+or delete them if they were just created. :
+
+.. prompt:: bash $
 
 
-       ceph pg {pgid} mark_unfound_lost revert|delete
+   ceph pg {pgid} mark_unfound_lost revert|delete
 
 
 .. _osd-subsystem:
 
 
 .. _osd-subsystem:
@@ -100,105 +122,149 @@ or delete them if they were just created. ::
 OSD Subsystem
 =============
 
 OSD Subsystem
 =============
 
-Query OSD subsystem status. ::
+Query OSD subsystem status. :
 
 
-       ceph osd stat
+.. prompt:: bash $
+
+   ceph osd stat
 
 Write a copy of the most recent OSD map to a file. See
 
 Write a copy of the most recent OSD map to a file. See
-:ref:`osdmaptool <osdmaptool>`. ::
+:ref:`osdmaptool <osdmaptool>`. :
+
+.. prompt:: bash $
 
 
-       ceph osd getmap -o file
+   ceph osd getmap -o file
 
 Write a copy of the crush map from the most recent OSD map to
 
 Write a copy of the crush map from the most recent OSD map to
-file. ::
+file. :
+
+.. prompt:: bash $
 
 
-       ceph osd getcrushmap -o file
+   ceph osd getcrushmap -o file
 
 
-The foregoing is functionally equivalent to ::
+The foregoing is functionally equivalent to :
 
 
-       ceph osd getmap -o /tmp/osdmap
-       osdmaptool /tmp/osdmap --export-crush file
+.. prompt:: bash $
+
+   ceph osd getmap -o /tmp/osdmap
+   osdmaptool /tmp/osdmap --export-crush file
 
 Dump the OSD map. Valid formats for ``-f`` are ``plain``, ``json``, ``json-pretty``,
 ``xml``, and ``xml-pretty``. If no ``--format`` option is given, the OSD map is 
 
 Dump the OSD map. Valid formats for ``-f`` are ``plain``, ``json``, ``json-pretty``,
 ``xml``, and ``xml-pretty``. If no ``--format`` option is given, the OSD map is 
-dumped as plain text.  As above, JSON format is best for tools, scripting, and other automation. ::
+dumped as plain text.  As above, JSON format is best for tools, scripting, and other automation. :
+
+.. prompt:: bash $
 
 
-       ceph osd dump [--format {format}]
+   ceph osd dump [--format {format}]
 
 Dump the OSD map as a tree with one line per OSD containing weight
 
 Dump the OSD map as a tree with one line per OSD containing weight
-and state. ::
+and state. :
+
+.. prompt:: bash $
+
+   ceph osd tree [--format {format}]
 
 
-       ceph osd tree [--format {format}]
+Find out where a specific object is or would be stored in the system:
 
 
-Find out where a specific object is or would be stored in the system::
+.. prompt:: bash $
 
 
-       ceph osd map <pool-name> <object-name>
+   ceph osd map <pool-name> <object-name>
 
 Add or move a new item (OSD) with the given id/name/weight at the specified
 
 Add or move a new item (OSD) with the given id/name/weight at the specified
-location. ::
+location. :
+
+.. prompt:: bash $
+
+   ceph osd crush set {id} {weight} [{loc1} [{loc2} ...]]
+
+Remove an existing item (OSD) from the CRUSH map. :
 
 
-       ceph osd crush set {id} {weight} [{loc1} [{loc2} ...]]
+.. prompt:: bash $
 
 
-Remove an existing item (OSD) from the CRUSH map. ::
+   ceph osd crush remove {name}
 
 
-       ceph osd crush remove {name}
+Remove an existing bucket from the CRUSH map. :
 
 
-Remove an existing bucket from the CRUSH map. ::
+.. prompt:: bash $
 
 
-       ceph osd crush remove {bucket-name}
+   ceph osd crush remove {bucket-name}
 
 
-Move an existing bucket from one position in the hierarchy to another.  ::
+Move an existing bucket from one position in the hierarchy to another.  :
 
 
-       ceph osd crush move {id} {loc1} [{loc2} ...]
+.. prompt:: bash $
 
 
-Set the weight of the item given by ``{name}`` to ``{weight}``. ::
+   ceph osd crush move {id} {loc1} [{loc2} ...]
 
 
-       ceph osd crush reweight {name} {weight}
+Set the weight of the item given by ``{name}`` to ``{weight}``. :
 
 
-Mark an OSD as ``lost``. This may result in permanent data loss. Use with caution. ::
+.. prompt:: bash $
 
 
-       ceph osd lost {id} [--yes-i-really-mean-it]
+   ceph osd crush reweight {name} {weight}
+
+Mark an OSD as ``lost``. This may result in permanent data loss. Use with caution. :
+
+.. prompt:: bash $
+
+   ceph osd lost {id} [--yes-i-really-mean-it]
 
 Create a new OSD. If no UUID is given, it will be set automatically when the OSD
 
 Create a new OSD. If no UUID is given, it will be set automatically when the OSD
-starts up. ::
+starts up. :
+
+.. prompt:: bash $
+
+   ceph osd create [{uuid}]
+
+Remove the given OSD(s). :
+
+.. prompt:: bash $
 
 
-       ceph osd create [{uuid}]
+   ceph osd rm [{id}...]
 
 
-Remove the given OSD(s). ::
+Query the current ``max_osd`` parameter in the OSD map. :
 
 
-       ceph osd rm [{id}...]
+.. prompt:: bash $
 
 
-Query the current ``max_osd`` parameter in the OSD map. ::
+   ceph osd getmaxosd
 
 
-       ceph osd getmaxosd
+Import the given crush map. :
 
 
-Import the given crush map. ::
+.. prompt:: bash $
 
 
-       ceph osd setcrushmap -i file
+   ceph osd setcrushmap -i file
 
 Set the ``max_osd`` parameter in the OSD map. This defaults to 10000 now so
 
 Set the ``max_osd`` parameter in the OSD map. This defaults to 10000 now so
-most admins will never need to adjust this. ::
+most admins will never need to adjust this. :
 
 
-       ceph osd setmaxosd
+.. prompt:: bash $
 
 
-Mark OSD ``{osd-num}`` down. ::
+   ceph osd setmaxosd
 
 
-       ceph osd down {osd-num}
+Mark OSD ``{osd-num}`` down. :
 
 
-Mark OSD ``{osd-num}`` out of the distribution (i.e. allocated no data). ::
+.. prompt:: bash $
 
 
-       ceph osd out {osd-num}
+   ceph osd down {osd-num}
 
 
-Mark ``{osd-num}`` in the distribution (i.e. allocated data). ::
+Mark OSD ``{osd-num}`` out of the distribution (i.e. allocated no data). :
 
 
-       ceph osd in {osd-num}
+.. prompt:: bash $
+
+   ceph osd out {osd-num}
+
+Mark ``{osd-num}`` in the distribution (i.e. allocated data). :
+
+.. prompt:: bash $
+
+   ceph osd in {osd-num}
 
 Set or clear the pause flags in the OSD map. If set, no IO requests
 will be sent to any OSD. Clearing the flags via unpause results in
 
 Set or clear the pause flags in the OSD map. If set, no IO requests
 will be sent to any OSD. Clearing the flags via unpause results in
-resending pending requests. ::
+resending pending requests. :
 
 
-       ceph osd pause
-       ceph osd unpause
+.. prompt:: bash $
+
+   ceph osd pause
+   ceph osd unpause
 
 Set the override weight (reweight) of ``{osd-num}`` to ``{weight}``. Two OSDs with the
 same weight will receive roughly the same number of I/O requests and
 
 Set the override weight (reweight) of ``{osd-num}`` to ``{weight}``. Two OSDs with the
 same weight will receive roughly the same number of I/O requests and
@@ -209,9 +275,11 @@ otherwise live on this drive. It does not change weights assigned
 to the buckets above the OSD in the crush map, and is a corrective
 measure in case the normal CRUSH distribution is not working out quite
 right. For instance, if one of your OSDs is at 90% and the others are
 to the buckets above the OSD in the crush map, and is a corrective
 measure in case the normal CRUSH distribution is not working out quite
 right. For instance, if one of your OSDs is at 90% and the others are
-at 50%, you could reduce this weight to compensate. ::
+at 50%, you could reduce this weight to compensate. :
+
+.. prompt:: bash $
 
 
-       ceph osd reweight {osd-num} {weight}
+   ceph osd reweight {osd-num} {weight}
 
 Balance OSD fullness by reducing the override weight of OSDs which are
 overly utilized.  Note that these override aka ``reweight`` values
 
 Balance OSD fullness by reducing the override weight of OSDs which are
 overly utilized.  Note that these override aka ``reweight`` values
@@ -219,9 +287,11 @@ default to 1.00000 and are relative only to each other; they not absolute.
 It is crucial to distinguish them from CRUSH weights, which reflect the
 absolute capacity of a bucket in TiB.  By default this command adjusts
 override weight on OSDs which have + or - 20% of the average utilization,
 It is crucial to distinguish them from CRUSH weights, which reflect the
 absolute capacity of a bucket in TiB.  By default this command adjusts
 override weight on OSDs which have + or - 20% of the average utilization,
-but if you include a ``threshold`` that percentage will be used instead. ::
+but if you include a ``threshold`` that percentage will be used instead. :
+
+.. prompt:: bash $
 
 
-       ceph osd reweight-by-utilization [threshold [max_change [max_osds]]] [--no-increasing]
+   ceph osd reweight-by-utilization [threshold [max_change [max_osds]]] [--no-increasing]
 
 To limit the step by which any OSD's reweight will be changed, specify
 ``max_change`` which defaults to 0.05.  To limit the number of OSDs that will
 
 To limit the step by which any OSD's reweight will be changed, specify
 ``max_change`` which defaults to 0.05.  To limit the number of OSDs that will
@@ -230,9 +300,11 @@ parameters can speed leveling of OSD utilization, at the potential cost of
 greater impact on client operations due to more data moving at once.
 
 To determine which and how many PGs and OSDs will be affected by a given invocation
 greater impact on client operations due to more data moving at once.
 
 To determine which and how many PGs and OSDs will be affected by a given invocation
-you can test before executing. ::
+you can test before executing. :
 
 
-       ceph osd test-reweight-by-utilization [threshold [max_change max_osds]] [--no-increasing]
+.. prompt:: bash $
+
+   ceph osd test-reweight-by-utilization [threshold [max_change max_osds]] [--no-increasing]
 
 Adding ``--no-increasing`` to either command prevents increasing any
 override weights that are currently < 1.00000.  This can be useful when
 
 Adding ``--no-increasing`` to either command prevents increasing any
 override weights that are currently < 1.00000.  This can be useful when
@@ -256,25 +328,33 @@ including the ``range`` keyword.
 
 These commands are mostly only useful for failure testing, as
 blocklists are normally maintained automatically and shouldn't need
 
 These commands are mostly only useful for failure testing, as
 blocklists are normally maintained automatically and shouldn't need
-manual intervention. ::
+manual intervention. :
+
+.. prompt:: bash $
+
+   ceph osd blocklist ["range"] add ADDRESS[:source_port][/netmask_bits] [TIME]
+   ceph osd blocklist ["range"] rm ADDRESS[:source_port][/netmask_bits]
+
+Creates/deletes a snapshot of a pool. :
 
 
-       ceph osd blocklist ["range"] add ADDRESS[:source_port][/netmask_bits] [TIME]
-       ceph osd blocklist ["range"] rm ADDRESS[:source_port][/netmask_bits]
+.. prompt:: bash $
 
 
-Creates/deletes a snapshot of a pool. ::
+   ceph osd pool mksnap {pool-name} {snap-name}
+   ceph osd pool rmsnap {pool-name} {snap-name}
 
 
-       ceph osd pool mksnap {pool-name} {snap-name}
-       ceph osd pool rmsnap {pool-name} {snap-name}
+Creates/deletes/renames a storage pool. :
 
 
-Creates/deletes/renames a storage pool. ::
+.. prompt:: bash $
 
 
-       ceph osd pool create {pool-name} [pg_num [pgp_num]]
-       ceph osd pool delete {pool-name} [{pool-name} --yes-i-really-really-mean-it]
-       ceph osd pool rename {old-name} {new-name}
+   ceph osd pool create {pool-name} [pg_num [pgp_num]]
+   ceph osd pool delete {pool-name} [{pool-name} --yes-i-really-really-mean-it]
+   ceph osd pool rename {old-name} {new-name}
 
 
-Changes a pool setting. :: 
+Changes a pool setting. : 
 
 
-       ceph osd pool set {pool-name} {field} {value}
+.. prompt:: bash $
+
+   ceph osd pool set {pool-name} {field} {value}
 
 Valid fields are:
 
 
 Valid fields are:
 
@@ -283,9 +363,11 @@ Valid fields are:
        * ``pgp_num``: Effective number when calculating pg placement.
        * ``crush_rule``: rule number for mapping placement.
 
        * ``pgp_num``: Effective number when calculating pg placement.
        * ``crush_rule``: rule number for mapping placement.
 
-Get the value of a pool setting. ::
+Get the value of a pool setting. :
+
+.. prompt:: bash $
 
 
-       ceph osd pool get {pool-name} {field}
+   ceph osd pool get {pool-name} {field}
 
 Valid fields are:
 
 
 Valid fields are:
 
@@ -293,49 +375,67 @@ Valid fields are:
        * ``pgp_num``: Effective number of placement groups when calculating placement.
 
 
        * ``pgp_num``: Effective number of placement groups when calculating placement.
 
 
-Sends a scrub command to OSD ``{osd-num}``. To send the command to all OSDs, use ``*``. ::
+Sends a scrub command to OSD ``{osd-num}``. To send the command to all OSDs, use ``*``. :
+
+.. prompt:: bash $
 
 
-       ceph osd scrub {osd-num}
+   ceph osd scrub {osd-num}
 
 
-Sends a repair command to OSD.N. To send the command to all OSDs, use ``*``. ::
+Sends a repair command to OSD.N. To send the command to all OSDs, use ``*``. :
 
 
-       ceph osd repair N
+.. prompt:: bash $
+
+   ceph osd repair N
 
 Runs a simple throughput benchmark against OSD.N, writing ``TOTAL_DATA_BYTES``
 in write requests of ``BYTES_PER_WRITE`` each. By default, the test
 writes 1 GB in total in 4-MB increments.
 The benchmark is non-destructive and will not overwrite existing live
 OSD data, but might temporarily affect the performance of clients
 
 Runs a simple throughput benchmark against OSD.N, writing ``TOTAL_DATA_BYTES``
 in write requests of ``BYTES_PER_WRITE`` each. By default, the test
 writes 1 GB in total in 4-MB increments.
 The benchmark is non-destructive and will not overwrite existing live
 OSD data, but might temporarily affect the performance of clients
-concurrently accessing the OSD. ::
+concurrently accessing the OSD. :
+
+.. prompt:: bash $
+
+   ceph tell osd.N bench [TOTAL_DATA_BYTES] [BYTES_PER_WRITE]
+
+To clear an OSD's caches between benchmark runs, use the 'cache drop' command :
 
 
-       ceph tell osd.N bench [TOTAL_DATA_BYTES] [BYTES_PER_WRITE]
+.. prompt:: bash $
 
 
-To clear an OSD's caches between benchmark runs, use the 'cache drop' command ::
+   ceph tell osd.N cache drop
 
 
-       ceph tell osd.N cache drop
+To get the cache statistics of an OSD, use the 'cache status' command :
 
 
-To get the cache statistics of an OSD, use the 'cache status' command ::
+.. prompt:: bash $
 
 
-       ceph tell osd.N cache status
+   ceph tell osd.N cache status
 
 MDS Subsystem
 =============
 
 
 MDS Subsystem
 =============
 
-Change configuration parameters on a running mds. ::
+Change configuration parameters on a running mds. :
+
+.. prompt:: bash $
+
+   ceph tell mds.{mds-id} config set {setting} {value}
+
+Example:
 
 
-       ceph tell mds.{mds-id} config set {setting} {value}
+.. prompt:: bash $
 
 
-Example::
+   ceph tell mds.0 config set debug_ms 1
 
 
-       ceph tell mds.0 config set debug_ms 1
+Enables debug messages. :
 
 
-Enables debug messages. ::
+.. prompt:: bash $
 
 
-       ceph mds stat
+   ceph mds stat
 
 
-Displays the status of all metadata servers. ::
+Displays the status of all metadata servers. :
 
 
-       ceph mds fail 0
+.. prompt:: bash $
+
+   ceph mds fail 0
 
 Marks the active MDS as failed, triggering failover to a standby if present.
 
 
 Marks the active MDS as failed, triggering failover to a standby if present.
 
@@ -345,18 +445,24 @@ Marks the active MDS as failed, triggering failover to a standby if present.
 Mon Subsystem
 =============
 
 Mon Subsystem
 =============
 
-Show monitor stats::
+Show monitor stats:
+
+.. prompt:: bash $
 
 
-       ceph mon stat
+   ceph mon stat
+
+::
 
        e2: 3 mons at {a=127.0.0.1:40000/0,b=127.0.0.1:40001/0,c=127.0.0.1:40002/0}, election epoch 6, quorum 0,1,2 a,b,c
 
 
 The ``quorum`` list at the end lists monitor nodes that are part of the current quorum.
 
 
        e2: 3 mons at {a=127.0.0.1:40000/0,b=127.0.0.1:40001/0,c=127.0.0.1:40002/0}, election epoch 6, quorum 0,1,2 a,b,c
 
 
 The ``quorum`` list at the end lists monitor nodes that are part of the current quorum.
 
-This is also available more directly::
+This is also available more directly:
+
+.. prompt:: bash $
 
 
-       ceph quorum_status -f json-pretty
+   ceph quorum_status -f json-pretty
        
 .. code-block:: javascript     
 
        
 .. code-block:: javascript     
 
@@ -410,9 +516,11 @@ This is also available more directly::
 
 The above will block until a quorum is reached.
 
 
 The above will block until a quorum is reached.
 
-For a status of just a single monitor::
+For a status of just a single monitor:
 
 
-       ceph tell mon.[name] mon_status
+.. prompt:: bash $
+
+   ceph tell mon.[name] mon_status
        
 where the value of ``[name]`` can be taken from ``ceph quorum_status``. Sample
 output::
        
 where the value of ``[name]`` can be taken from ``ceph quorum_status``. Sample
 output::
@@ -474,9 +582,13 @@ output::
            }
        }
 
            }
        }
 
-A dump of the monitor state::
+A dump of the monitor state:
+
+.. prompt:: bash $
+
+   ceph mon dump
 
 
-       ceph mon dump
+::
 
        dumped monmap epoch 2
        epoch 2
 
        dumped monmap epoch 2
        epoch 2
index eaed1c709026e8a7918d9bb14803e053b0cd1c9b..bb7ba0b2e92f9f45e9bb4f9363837f04a4a5b638 100644 (file)
@@ -35,7 +35,9 @@ Pool Values`_.
 Get a CRUSH Map
 ---------------
 
 Get a CRUSH Map
 ---------------
 
-To get the CRUSH map for your cluster, execute the following::
+To get the CRUSH map for your cluster, execute the following:
+
+.. prompt:: bash $
 
        ceph osd getcrushmap -o {compiled-crushmap-filename}
 
 
        ceph osd getcrushmap -o {compiled-crushmap-filename}
 
@@ -48,7 +50,9 @@ edit it.
 Decompile a CRUSH Map
 ---------------------
 
 Decompile a CRUSH Map
 ---------------------
 
-To decompile a CRUSH map, execute the following::
+To decompile a CRUSH map, execute the following:
+
+.. prompt:: bash $
 
        crushtool -d {compiled-crushmap-filename} -o {decompiled-crushmap-filename}
 
 
        crushtool -d {compiled-crushmap-filename} -o {decompiled-crushmap-filename}
 
@@ -57,7 +61,9 @@ To decompile a CRUSH map, execute the following::
 Recompile a CRUSH Map
 ---------------------
 
 Recompile a CRUSH Map
 ---------------------
 
-To compile a CRUSH map, execute the following::
+To compile a CRUSH map, execute the following:
+
+.. prompt:: bash $
 
        crushtool -c {decompiled-crushmap-filename} -o {compiled-crushmap-filename}
 
 
        crushtool -c {decompiled-crushmap-filename} -o {compiled-crushmap-filename}
 
@@ -66,7 +72,9 @@ To compile a CRUSH map, execute the following::
 Set the CRUSH Map
 -----------------
 
 Set the CRUSH Map
 -----------------
 
-To set the CRUSH map for your cluster, execute the following::
+To set the CRUSH map for your cluster, execute the following:
+
+.. prompt:: bash $
 
        ceph osd setcrushmap -i {compiled-crushmap-filename}
 
 
        ceph osd setcrushmap -i {compiled-crushmap-filename}
 
@@ -118,14 +126,22 @@ Devices may also have a *device class* associated with them (e.g.,
 ``hdd`` or ``ssd``), allowing them to be conveniently targeted by a
 crush rule.
 
 ``hdd`` or ``ssd``), allowing them to be conveniently targeted by a
 crush rule.
 
+.. prompt:: bash #
+
+       devices
+
 ::
 
 ::
 
-       # devices
        device {num} {osd.name} [class {class}]
 
        device {num} {osd.name} [class {class}]
 
-For example::
+For example:
+
+.. prompt:: bash #
+
+       devices
+
+::
 
 
-       # devices
        device 0 osd.0 class ssd
        device 1 osd.1 class hdd
        device 2 osd.2
        device 0 osd.0 class ssd
        device 1 osd.1 class hdd
        device 2 osd.2
@@ -136,10 +152,6 @@ is normally a single storage device, a pair of devices (for example,
 one for data and one for a journal or metadata), or in some cases a
 small RAID device.
 
 one for data and one for a journal or metadata), or in some cases a
 small RAID device.
 
-
-
-
-
 CRUSH Map Bucket Types
 ----------------------
 
 CRUSH Map Bucket Types
 ----------------------
 
@@ -157,9 +169,9 @@ media.
 To add a bucket type to the CRUSH map, create a new line under your list of
 bucket types. Enter ``type`` followed by a unique numeric ID and a bucket name.
 By convention, there is one leaf bucket and it is ``type 0``;  however, you may
 To add a bucket type to the CRUSH map, create a new line under your list of
 bucket types. Enter ``type`` followed by a unique numeric ID and a bucket name.
 By convention, there is one leaf bucket and it is ``type 0``;  however, you may
-give it any name you like (e.g., osd, disk, drive, storage, etc.)::
+give it any name you like (e.g., osd, disk, drive, storage)::
 
 
-       #types
+       # types
        type {num} {bucket-name}
 
 For example::
        type {num} {bucket-name}
 
 For example::
@@ -199,8 +211,8 @@ distribution units, pods, rows, rooms, and data centers. With the exception of
 the leaf nodes representing OSDs, the rest of the hierarchy is arbitrary, and
 you may define it according to your own needs.
 
 the leaf nodes representing OSDs, the rest of the hierarchy is arbitrary, and
 you may define it according to your own needs.
 
-We recommend adapting your CRUSH map to your firms's hardware naming conventions
-and using instances names that reflect the physical hardware. Your naming
+We recommend adapting your CRUSH map to your firm's hardware naming conventions
+and using instance names that reflect the physical hardware. Your naming
 practice can make it easier to administer the cluster and troubleshoot
 problems when an OSD and/or other hardware malfunctions and the administrator
 need access to physical hardware.
 practice can make it easier to administer the cluster and troubleshoot
 problems when an OSD and/or other hardware malfunctions and the administrator
 need access to physical hardware.
@@ -651,29 +663,38 @@ There are three types of transformations possible:
    single bucket.  For example, in the previous example, we want the
    ``ssd`` bucket to be mapped to the ``default`` bucket.
 
    single bucket.  For example, in the previous example, we want the
    ``ssd`` bucket to be mapped to the ``default`` bucket.
 
-The final command to convert the map comprised of the above fragments would be something like::
+The final command to convert the map comprising the above fragments would be something like:
+
+.. prompt:: bash $
 
 
-  ceph osd getcrushmap -o original
-  crushtool -i original --reclassify \
-      --set-subtree-class default hdd \
-      --reclassify-root default hdd \
-      --reclassify-bucket %-ssd ssd default \
-      --reclassify-bucket ssd ssd default \
-      -o adjusted
+  ceph osd getcrushmap -o original
+  crushtool -i original --reclassify \
+    --set-subtree-class default hdd \
+    --reclassify-root default hdd \
+    --reclassify-bucket %-ssd ssd default \
+    --reclassify-bucket ssd ssd default \
+    -o adjusted
 
 
-In order to ensure that the conversion is correct, there is a ``--compare`` command that will test a large sample of inputs to the CRUSH map and ensure that the same result comes back out.  These inputs are controlled by the same options that apply to the ``--test`` command.  For the above example,::
+In order to ensure that the conversion is correct, there is a ``--compare`` command that will test a large sample of inputs against the CRUSH map and check that the same result is output. These inputs are controlled by the same options that apply to the ``--test`` command.  For the above example,:
+
+.. prompt:: bash $
+
+   crushtool -i original --compare adjusted
+
+::
 
 
-  $ crushtool -i original --compare adjusted
   rule 0 had 0/10240 mismatched mappings (0)
   rule 1 had 0/10240 mismatched mappings (0)
   maps appear equivalent
 
   rule 0 had 0/10240 mismatched mappings (0)
   rule 1 had 0/10240 mismatched mappings (0)
   maps appear equivalent
 
-If there were difference, you'd see what ratio of inputs are remapped
-in the parentheses.
+If there were differences, the ratio of remapped inputs would be reported in
+the parentheses.
+
+When you are satisfied with the adjusted map, apply it to the cluster with a command of the form:
 
 
-If you are satisfied with the adjusted map, you can apply it to the cluster with something like::
+.. prompt:: bash $
 
 
-  ceph osd setcrushmap -i adjusted
+   ceph osd setcrushmap -i adjusted
 
 Tuning CRUSH, the hard way
 --------------------------
 
 Tuning CRUSH, the hard way
 --------------------------
@@ -682,7 +703,9 @@ If you can ensure that all clients are running recent code, you can
 adjust the tunables by extracting the CRUSH map, modifying the values,
 and reinjecting it into the cluster.
 
 adjust the tunables by extracting the CRUSH map, modifying the values,
 and reinjecting it into the cluster.
 
-* Extract the latest CRUSH map::
+* Extract the latest CRUSH map:
+
+  .. prompt:: bash $
 
        ceph osd getcrushmap -o /tmp/crush
 
 
        ceph osd getcrushmap -o /tmp/crush
 
@@ -690,19 +713,25 @@ and reinjecting it into the cluster.
   for both large and small clusters we tested with.  You will need to
   additionally specify the ``--enable-unsafe-tunables`` argument to
   ``crushtool`` for this to work.  Please use this option with
   for both large and small clusters we tested with.  You will need to
   additionally specify the ``--enable-unsafe-tunables`` argument to
   ``crushtool`` for this to work.  Please use this option with
-  extreme care.::
+  extreme care.:
 
 
-       crushtool -i /tmp/crush --set-choose-local-tries 0 --set-choose-local-fallback-tries 0 --set-choose-total-tries 50 -o /tmp/crush.new
+  .. prompt:: bash $
 
 
-* Reinject modified map::
+     crushtool -i /tmp/crush --set-choose-local-tries 0 --set-choose-local-fallback-tries 0 --set-choose-total-tries 50 -o /tmp/crush.new
 
 
-       ceph osd setcrushmap -i /tmp/crush.new
+* Reinject modified map:
+
+  .. prompt:: bash $
+
+     ceph osd setcrushmap -i /tmp/crush.new
 
 Legacy values
 -------------
 
 For reference, the legacy values for the CRUSH tunables can be set
 
 Legacy values
 -------------
 
 For reference, the legacy values for the CRUSH tunables can be set
-with::
+with:
+
+.. prompt:: bash $
 
    crushtool -i /tmp/crush --set-choose-local-tries 2 --set-choose-local-fallback-tries 5 --set-choose-total-tries 19 --set-chooseleaf-descend-once 0 --set-chooseleaf-vary-r 0 -o /tmp/crush.legacy
 
 
    crushtool -i /tmp/crush --set-choose-local-tries 2 --set-choose-local-fallback-tries 5 --set-choose-total-tries 19 --set-chooseleaf-descend-once 0 --set-chooseleaf-vary-r 0 -o /tmp/crush.legacy
 
@@ -711,4 +740,4 @@ Further, as noted above, be careful running old versions of the
 ``ceph-osd`` daemon after reverting to legacy values as the feature
 bit is not perfectly enforced.
 
 ``ceph-osd`` daemon after reverting to legacy values as the feature
 bit is not perfectly enforced.
 
-.. _CRUSH - Controlled, Scalable, Decentralized Placement of Replicated Data: https://ceph.com/wp-content/uploads/2016/08/weil-crush-sc06.pdf
+.. _CRUSH - Controlled, Scalable, Decentralized Placement of Replicated Data: https://ceph.io/assets/pdfs/weil-crush-sc06.pdf
index 792bbcdf219ed9caed5873d70e1b48b3e42b7098..dcb82b4226670655ee7aff4a660d7949167ce615 100644 (file)
@@ -184,9 +184,11 @@ will be the total of all devices contained beneath it.  Normally
 weights are in units of terabytes (TB).
 
 You can get a simple view the of CRUSH hierarchy for your cluster,
 weights are in units of terabytes (TB).
 
 You can get a simple view the of CRUSH hierarchy for your cluster,
-including weights, with::
+including weights, with:
 
 
-  ceph osd tree
+.. prompt:: bash $
+
+   ceph osd tree
 
 Rules
 -----
 
 Rules
 -----
@@ -208,13 +210,17 @@ erasure coded), the *failure domain*, and optionally a *device class*.
 In rare cases rules must be written by hand by manually editing the
 CRUSH map.
 
 In rare cases rules must be written by hand by manually editing the
 CRUSH map.
 
-You can see what rules are defined for your cluster with::
+You can see what rules are defined for your cluster with:
+
+.. prompt:: bash $
+
+   ceph osd crush rule ls
 
 
-  ceph osd crush rule ls
+You can view the contents of the rules with:
 
 
-You can view the contents of the rules with::
+.. prompt:: bash $
 
 
-  ceph osd crush rule dump
+   ceph osd crush rule dump
 
 Device classes
 --------------
 
 Device classes
 --------------
@@ -224,34 +230,44 @@ default, OSDs automatically set their class at startup to
 `hdd`, `ssd`, or `nvme` based on the type of device they are backed
 by.
 
 `hdd`, `ssd`, or `nvme` based on the type of device they are backed
 by.
 
-The device class for one or more OSDs can be explicitly set with::
+The device class for one or more OSDs can be explicitly set with:
 
 
-  ceph osd crush set-device-class <class> <osd-name> [...]
+.. prompt:: bash $
+
+   ceph osd crush set-device-class <class> <osd-name> [...]
 
 Once a device class is set, it cannot be changed to another class
 
 Once a device class is set, it cannot be changed to another class
-until the old class is unset with::
+until the old class is unset with:
+
+.. prompt:: bash $
 
 
-  ceph osd crush rm-device-class <osd-name> [...]
+   ceph osd crush rm-device-class <osd-name> [...]
 
 This allows administrators to set device classes without the class
 being changed on OSD restart or by some other script.
 
 
 This allows administrators to set device classes without the class
 being changed on OSD restart or by some other script.
 
-A placement rule that targets a specific device class can be created with::
+A placement rule that targets a specific device class can be created with:
 
 
-  ceph osd crush rule create-replicated <rule-name> <root> <failure-domain> <class>
+.. prompt:: bash $
 
 
-A pool can then be changed to use the new rule with::
+   ceph osd crush rule create-replicated <rule-name> <root> <failure-domain> <class>
 
 
-  ceph osd pool set <pool-name> crush_rule <rule-name>
+A pool can then be changed to use the new rule with:
+
+.. prompt:: bash $
+
+   ceph osd pool set <pool-name> crush_rule <rule-name>
 
 Device classes are implemented by creating a "shadow" CRUSH hierarchy
 for each device class in use that contains only devices of that class.
 CRUSH rules can then distribute data over the shadow hierarchy.
 This approach is fully backward compatible with
 old Ceph clients.  You can view the CRUSH hierarchy with shadow items
 
 Device classes are implemented by creating a "shadow" CRUSH hierarchy
 for each device class in use that contains only devices of that class.
 CRUSH rules can then distribute data over the shadow hierarchy.
 This approach is fully backward compatible with
 old Ceph clients.  You can view the CRUSH hierarchy with shadow items
-with::
+with:
+
+.. prompt:: bash $
 
 
-  ceph osd crush tree --show-shadow
+   ceph osd crush tree --show-shadow
 
 For older clusters created before Luminous that relied on manually
 crafted CRUSH maps to maintain per-device-type hierarchies, there is a
 
 For older clusters created before Luminous that relied on manually
 crafted CRUSH maps to maintain per-device-type hierarchies, there is a
@@ -295,9 +311,11 @@ There are two types of weight sets supported:
 
 When weight sets are in use, the weights associated with each node in
 the hierarchy is visible as a separate column (labeled either
 
 When weight sets are in use, the weights associated with each node in
 the hierarchy is visible as a separate column (labeled either
-``(compat)`` or the pool name) from the command::
+``(compat)`` or the pool name) from the command:
 
 
-  ceph osd tree
+.. prompt:: bash $
+
+   ceph osd tree
 
 When both *compat* and *per-pool* weight sets are in use, data
 placement for a particular pool will use its own per-pool weight set
 
 When both *compat* and *per-pool* weight sets are in use, data
 placement for a particular pool will use its own per-pool weight set
@@ -320,9 +338,11 @@ Add/Move an OSD
 .. note: OSDs are normally automatically added to the CRUSH map when
          the OSD is created.  This command is rarely needed.
 
 .. note: OSDs are normally automatically added to the CRUSH map when
          the OSD is created.  This command is rarely needed.
 
-To add or move an OSD in the CRUSH map of a running cluster::
+To add or move an OSD in the CRUSH map of a running cluster:
+
+.. prompt:: bash $
 
 
-  ceph osd crush set {name} {weight} root={root} [{bucket-type}={bucket-name} ...]
+   ceph osd crush set {name} {weight} root={root} [{bucket-type}={bucket-name} ...]
 
 Where:
 
 
 Where:
 
@@ -359,9 +379,11 @@ Where:
 
 
 The following example adds ``osd.0`` to the hierarchy, or moves the
 
 
 The following example adds ``osd.0`` to the hierarchy, or moves the
-OSD from a previous location. ::
+OSD from a previous location:
 
 
-  ceph osd crush set osd.0 1.0 root=default datacenter=dc1 room=room1 row=foo rack=bar host=foo-bar-1
+.. prompt:: bash $
+
+   ceph osd crush set osd.0 1.0 root=default datacenter=dc1 room=room1 row=foo rack=bar host=foo-bar-1
 
 
 Adjust OSD weight
 
 
 Adjust OSD weight
@@ -372,9 +394,11 @@ Adjust OSD weight
          is rarely needed.
 
 To adjust an OSD's CRUSH weight in the CRUSH map of a running cluster, execute
          is rarely needed.
 
 To adjust an OSD's CRUSH weight in the CRUSH map of a running cluster, execute
-the following::
+the following:
+
+.. prompt:: bash $
 
 
-  ceph osd crush reweight {name} {weight}
+   ceph osd crush reweight {name} {weight}
 
 Where:
 
 
 Where:
 
@@ -403,9 +427,11 @@ Remove an OSD
    ``ceph osd purge`` command.  This command is rarely needed.
 
 To remove an OSD from the CRUSH map of a running cluster, execute the
    ``ceph osd purge`` command.  This command is rarely needed.
 
 To remove an OSD from the CRUSH map of a running cluster, execute the
-following::
+following:
+
+.. prompt:: bash $
 
 
-  ceph osd crush remove {name}
+   ceph osd crush remove {name}
 
 Where:
 
 
 Where:
 
@@ -431,9 +457,11 @@ Add a Bucket
    ``default`` or other root as described below.
 
 To add a bucket in the CRUSH map of a running cluster, execute the
    ``default`` or other root as described below.
 
 To add a bucket in the CRUSH map of a running cluster, execute the
-``ceph osd crush add-bucket`` command::
+``ceph osd crush add-bucket`` command:
 
 
-  ceph osd crush add-bucket {bucket-name} {bucket-type}
+.. prompt:: bash $
+
+   ceph osd crush add-bucket {bucket-name} {bucket-type}
 
 Where:
 
 
 Where:
 
@@ -453,17 +481,21 @@ Where:
 :Example: ``rack``
 
 
 :Example: ``rack``
 
 
-The following example adds the ``rack12`` bucket to the hierarchy::
+The following example adds the ``rack12`` bucket to the hierarchy:
+
+.. prompt:: bash $
 
 
-  ceph osd crush add-bucket rack12 rack
+   ceph osd crush add-bucket rack12 rack
 
 Move a Bucket
 -------------
 
 To move a bucket to a different location or position in the CRUSH map
 
 Move a Bucket
 -------------
 
 To move a bucket to a different location or position in the CRUSH map
-hierarchy, execute the following::
+hierarchy, execute the following:
 
 
-  ceph osd crush move {bucket-name} {bucket-type}={bucket-name}, [...]
+.. prompt:: bash $
+
+   ceph osd crush move {bucket-name} {bucket-type}={bucket-name}, [...]
 
 Where:
 
 
 Where:
 
@@ -484,9 +516,11 @@ Where:
 Remove a Bucket
 ---------------
 
 Remove a Bucket
 ---------------
 
-To remove a bucket from the CRUSH hierarchy, execute the following::
+To remove a bucket from the CRUSH hierarchy, execute the following:
+
+.. prompt:: bash $
 
 
-  ceph osd crush remove {bucket-name}
+   ceph osd crush remove {bucket-name}
 
 .. note:: A bucket must be empty before removing it from the CRUSH hierarchy.
 
 
 .. note:: A bucket must be empty before removing it from the CRUSH hierarchy.
 
@@ -499,9 +533,11 @@ Where:
 :Required: Yes
 :Example: ``rack12``
 
 :Required: Yes
 :Example: ``rack12``
 
-The following example removes the ``rack12`` bucket from the hierarchy::
+The following example removes the ``rack12`` bucket from the hierarchy:
 
 
-  ceph osd crush remove rack12
+.. prompt:: bash $
+
+   ceph osd crush remove rack12
 
 Creating a compat weight set
 ----------------------------
 
 Creating a compat weight set
 ----------------------------
@@ -509,24 +545,32 @@ Creating a compat weight set
 .. note: This step is normally done automatically by the ``balancer``
    module when enabled.
 
 .. note: This step is normally done automatically by the ``balancer``
    module when enabled.
 
-To create a *compat* weight set::
+To create a *compat* weight set:
+
+.. prompt:: bash $
 
 
-  ceph osd crush weight-set create-compat
+   ceph osd crush weight-set create-compat
 
 
-Weights for the compat weight set can be adjusted with::
+Weights for the compat weight set can be adjusted with:
 
 
-  ceph osd crush weight-set reweight-compat {name} {weight}
+.. prompt:: bash $
 
 
-The compat weight set can be destroyed with::
+   ceph osd crush weight-set reweight-compat {name} {weight}
 
 
-  ceph osd crush weight-set rm-compat
+The compat weight set can be destroyed with:
+
+.. prompt:: bash $
+
+   ceph osd crush weight-set rm-compat
 
 Creating per-pool weight sets
 -----------------------------
 
 
 Creating per-pool weight sets
 -----------------------------
 
-To create a weight set for a specific pool,::
+To create a weight set for a specific pool:
+
+.. prompt:: bash $
 
 
-  ceph osd crush weight-set create {pool-name} {mode}
+   ceph osd crush weight-set create {pool-name} {mode}
 
 .. note:: Per-pool weight sets require that all servers and daemons
           run Luminous v12.2.z or later.
 
 .. note:: Per-pool weight sets require that all servers and daemons
           run Luminous v12.2.z or later.
@@ -553,17 +597,23 @@ Where:
 :Required: Yes
 :Example: ``flat``
 
 :Required: Yes
 :Example: ``flat``
 
-To adjust the weight of an item in a weight set::
+To adjust the weight of an item in a weight set:
+
+.. prompt:: bash $
+
+   ceph osd crush weight-set reweight {pool-name} {item-name} {weight [...]}
 
 
-  ceph osd crush weight-set reweight {pool-name} {item-name} {weight [...]}
+To list existing weight sets:
 
 
-To list existing weight sets,::
+.. prompt:: bash $
 
 
-  ceph osd crush weight-set ls
+   ceph osd crush weight-set ls
 
 
-To remove a weight set,::
+To remove a weight set:
 
 
-  ceph osd crush weight-set rm {pool-name}
+.. prompt:: bash $
+
+   ceph osd crush weight-set rm {pool-name}
 
 Creating a rule for a replicated pool
 -------------------------------------
 
 Creating a rule for a replicated pool
 -------------------------------------
@@ -588,9 +638,11 @@ classify themselves as either ``hdd`` or ``ssd``, depending on the
 underlying type of device being used.  These classes can also be
 customized.
 
 underlying type of device being used.  These classes can also be
 customized.
 
-To create a replicated rule,::
+To create a replicated rule:
+
+.. prompt:: bash $
 
 
-  ceph osd crush rule create-replicated {name} {root} {failure-domain-type} [{class}]
+   ceph osd crush rule create-replicated {name} {root} {failure-domain-type} [{class}]
 
 Where:
 
 
 Where:
 
@@ -635,13 +687,17 @@ you must include this information in the *erasure code profile*.  A CRUSH
 rule will then be created from that either explicitly or automatically when
 the profile is used to create a pool.
 
 rule will then be created from that either explicitly or automatically when
 the profile is used to create a pool.
 
-The erasure code profiles can be listed with::
+The erasure code profiles can be listed with:
+
+.. prompt:: bash $
+
+   ceph osd erasure-code-profile ls
 
 
-  ceph osd erasure-code-profile ls
+An existing profile can be viewed with:
 
 
-An existing profile can be viewed with::
+.. prompt:: bash $
 
 
-  ceph osd erasure-code-profile get {profile-name}
+   ceph osd erasure-code-profile get {profile-name}
 
 Normally profiles should never be modified; instead, a new profile
 should be created and used when creating a new pool or creating a new
 
 Normally profiles should never be modified; instead, a new profile
 should be created and used when creating a new pool or creating a new
@@ -659,9 +715,11 @@ The erasure code profile properties of interest are:
  * **crush-device-class**: the device class on which to place data [default: none, meaning all devices are used].
  * **k** and **m** (and, for the ``lrc`` plugin, **l**): these determine the number of erasure code shards, affecting the resulting CRUSH rule.
 
  * **crush-device-class**: the device class on which to place data [default: none, meaning all devices are used].
  * **k** and **m** (and, for the ``lrc`` plugin, **l**): these determine the number of erasure code shards, affecting the resulting CRUSH rule.
 
-Once a profile is defined, you can create a CRUSH rule with::
+Once a profile is defined, you can create a CRUSH rule with:
 
 
-  ceph osd crush rule create-erasure {name} {profile-name}
+.. prompt:: bash $
+
+   ceph osd crush rule create-erasure {name} {profile-name}
 
 .. note: When creating a new pool, it is not actually necessary to
    explicitly create the rule.  If the erasure code profile alone is
 
 .. note: When creating a new pool, it is not actually necessary to
    explicitly create the rule.  If the erasure code profile alone is
@@ -671,9 +729,11 @@ Once a profile is defined, you can create a CRUSH rule with::
 Deleting rules
 --------------
 
 Deleting rules
 --------------
 
-Rules that are not in use by pools can be deleted with::
+Rules that are not in use by pools can be deleted with:
+
+.. prompt:: bash $
 
 
-  ceph osd crush rule rm {rule-name}
+   ceph osd crush rule rm {rule-name}
 
 
 .. _crush-map-tunables:
 
 
 .. _crush-map-tunables:
@@ -882,14 +942,18 @@ To make this warning go away, you have two options:
    result in some data movement (possibly as much as 10%).  This is the
    preferred route, but should be taken with care on a production cluster
    where the data movement may affect performance.  You can enable optimal
    result in some data movement (possibly as much as 10%).  This is the
    preferred route, but should be taken with care on a production cluster
    where the data movement may affect performance.  You can enable optimal
-   tunables with::
+   tunables with:
+
+   .. prompt:: bash $
 
       ceph osd crush tunables optimal
 
    If things go poorly (e.g., too much load) and not very much
    progress has been made, or there is a client compatibility problem
    (old kernel CephFS or RBD clients, or pre-Bobtail ``librados``
 
       ceph osd crush tunables optimal
 
    If things go poorly (e.g., too much load) and not very much
    progress has been made, or there is a client compatibility problem
    (old kernel CephFS or RBD clients, or pre-Bobtail ``librados``
-   clients), you can switch back with::
+   clients), you can switch back with:
+
+   .. prompt:: bash $
 
       ceph osd crush tunables legacy
 
 
       ceph osd crush tunables legacy
 
@@ -899,7 +963,9 @@ To make this warning go away, you have two options:
       mon warn on legacy crush tunables = false
 
    For the change to take effect, you will need to restart the monitors, or
       mon warn on legacy crush tunables = false
 
    For the change to take effect, you will need to restart the monitors, or
-   apply the option to running monitors with::
+   apply the option to running monitors with:
+
+   .. prompt:: bash $
 
       ceph tell mon.\* config set mon_warn_on_legacy_crush_tunables false
 
 
       ceph tell mon.\* config set mon_warn_on_legacy_crush_tunables false
 
@@ -936,7 +1002,7 @@ sets known as *profiles*.  As of the Octopus release these are:
  * ``firefly``: the values supported by the firefly release
  * ``hammer``: the values supported by the hammer release
  * ``jewel``: the values supported by the jewel release
  * ``firefly``: the values supported by the firefly release
  * ``hammer``: the values supported by the hammer release
  * ``jewel``: the values supported by the jewel release
- * ``optimal``: the best (ie optimal) values of the current version of Ceph
+ * ``optimal``: the best (i.e. optimal) values of the current version of Ceph
  * ``default``: the default values of a new cluster installed from
    scratch. These values, which depend on the current version of Ceph,
    are hardcoded and are generally a mix of optimal and legacy values.
  * ``default``: the default values of a new cluster installed from
    scratch. These values, which depend on the current version of Ceph,
    are hardcoded and are generally a mix of optimal and legacy values.
@@ -944,17 +1010,18 @@ sets known as *profiles*.  As of the Octopus release these are:
    LTS release, or the most recent release for which we generally expect
    most users to have up-to-date clients for.
 
    LTS release, or the most recent release for which we generally expect
    most users to have up-to-date clients for.
 
-You can apply a profile to a running cluster with the command::
+You can apply a profile to a running cluster with the command:
 
 
- ceph osd crush tunables {PROFILE}
+.. prompt:: bash $
+
+   ceph osd crush tunables {PROFILE}
 
 Note that this may result in data movement, potentially quite a bit.  Study
 release notes and documentation carefully before changing the profile on a
 running cluster, and consider throttling recovery/backfill parameters to
 limit the impact of a bolus of backfill.
 
 
 Note that this may result in data movement, potentially quite a bit.  Study
 release notes and documentation carefully before changing the profile on a
 running cluster, and consider throttling recovery/backfill parameters to
 limit the impact of a bolus of backfill.
 
-
-.. _CRUSH - Controlled, Scalable, Decentralized Placement of Replicated Data: https://ceph.com/wp-content/uploads/2016/08/weil-crush-sc06.pdf
+.. _CRUSH - Controlled, Scalable, Decentralized Placement of Replicated Data: https://ceph.io/assets/pdfs/weil-crush-sc06.pdf
 
 
 Primary Affinity
 
 
 Primary Affinity
@@ -987,19 +1054,20 @@ interface bandwidth and CPU cycles more evenly.
 By default, all ceph OSDs have primary affinity of ``1``, which indicates that
 any OSD may act as a primary with equal probability.
 
 By default, all ceph OSDs have primary affinity of ``1``, which indicates that
 any OSD may act as a primary with equal probability.
 
-You can reduce a Ceph OSD's primary affinity so that CRUSH is less likely to choose
-the OSD as primary in a PG's acting set.::
+You can reduce a Ceph OSD's primary affinity so that CRUSH is less likely to
+choose the OSD as primary in a PG's acting set.:
 
 
-       ceph osd primary-affinity <osd-id> <weight>
+.. prompt:: bash $
 
 
-You may set an OSD's primary affinity to a real number in the range
-``[0-1]``, where ``0`` indicates that the OSD may **NOT** be used as a primary
-and ``1`` indicates that an OSD may be used as a primary.  When the weight is
-between these extremes, it is less likely that
-CRUSH will select that OSD as a primary.  The process for
-selecting the lead OSD is more nuanced than a simple probability based on
-relative affinity values, but measurable results can be achieved even with
-first-order approximations of desirable values.
+   ceph osd primary-affinity <osd-id> <weight>
+
+You may set an OSD's primary affinity to a real number in the range ``[0-1]``,
+where ``0`` indicates that the OSD may **NOT** be used as a primary and ``1``
+indicates that an OSD may be used as a primary.  When the weight is between
+these extremes, it is less likely that CRUSH will select that OSD as a primary.
+The process for selecting the lead OSD is more nuanced than a simple
+probability based on relative affinity values, but measurable results can be
+achieved even with first-order approximations of desirable values.
 
 Custom CRUSH Rules
 ------------------
 
 Custom CRUSH Rules
 ------------------
@@ -1052,7 +1120,6 @@ must not contain the same servers::
         }
 
 
         }
 
 
-
 Note also that on failure of an SSD, requests to a PG will be served temporarily
 from a (slower) HDD OSD until the PG's data has been replicated onto the replacement
 primary SSD OSD.
 Note also that on failure of an SSD, requests to a PG will be served temporarily
 from a (slower) HDD OSD until the PG's data has been replicated onto the replacement
 primary SSD OSD.
index d404c3f10e776dca9bc12a94ae993b7a039aa6ce..1b6eaebdea069194ce8a1663c5af3377f853a92a 100644 (file)
@@ -1,4 +1,3 @@
-
 .. _devices:
 
 Device Management
 .. _devices:
 
 Device Management
@@ -11,19 +10,25 @@ provide tools to predict and/or automatically respond to hardware failure.
 Device tracking
 ---------------
 
 Device tracking
 ---------------
 
-You can query which storage devices are in use with::
+You can query which storage devices are in use with:
+
+.. prompt:: bash $
+
+   ceph device ls
 
 
-  ceph device ls
+You can also list devices by daemon or by host:
 
 
-You can also list devices by daemon or by host::
+.. prompt:: bash $
 
 
-  ceph device ls-by-daemon <daemon>
-  ceph device ls-by-host <host>
+   ceph device ls-by-daemon <daemon>
+   ceph device ls-by-host <host>
 
 For any individual device, you can query information about its
 
 For any individual device, you can query information about its
-location and how it is being consumed with::
+location and how it is being consumed with:
 
 
-  ceph device info <devid>
+.. prompt:: bash $
+
+   ceph device info <devid>
 
 Identifying physical devices
 ----------------------------
 
 Identifying physical devices
 ----------------------------
@@ -34,18 +39,22 @@ failed disks easy and less error-prone.  Use the following command::
   device light on|off <devid> [ident|fault] [--force]
 
 The ``<devid>`` parameter is the device identification. You can obtain this
   device light on|off <devid> [ident|fault] [--force]
 
 The ``<devid>`` parameter is the device identification. You can obtain this
-information using the following command::
+information using the following command:
+
+.. prompt:: bash $
 
 
-  ceph device ls
+   ceph device ls
 
 The ``[ident|fault]`` parameter is used to set the kind of light to blink.
 By default, the `identification` light is used.
 
 .. note::
    This command needs the Cephadm or the Rook `orchestrator <https://docs.ceph.com/docs/master/mgr/orchestrator/#orchestrator-cli-module>`_ module enabled.
 
 The ``[ident|fault]`` parameter is used to set the kind of light to blink.
 By default, the `identification` light is used.
 
 .. note::
    This command needs the Cephadm or the Rook `orchestrator <https://docs.ceph.com/docs/master/mgr/orchestrator/#orchestrator-cli-module>`_ module enabled.
-   The orchestrator module enabled is shown by executing the following command::
+   The orchestrator module enabled is shown by executing the following command:
 
 
-     ceph orch status
+   .. prompt:: bash $
+
+      ceph orch status
 
 The command behind the scene to blink the drive LEDs is `lsmcli`. If you need
 to customize this command you can configure this via a Jinja2 template::
 
 The command behind the scene to blink the drive LEDs is `lsmcli`. If you need
 to customize this command you can configure this via a Jinja2 template::
@@ -77,40 +86,54 @@ or unrecoverable read errors.  Other device types like SAS and NVMe
 implement a similar set of metrics (via slightly different standards).
 All of these can be collected by Ceph via the ``smartctl`` tool.
 
 implement a similar set of metrics (via slightly different standards).
 All of these can be collected by Ceph via the ``smartctl`` tool.
 
-You can enable or disable health monitoring with::
+You can enable or disable health monitoring with:
+
+.. prompt:: bash $
 
 
-  ceph device monitoring on
+   ceph device monitoring on
 
 
-or::
+or:
 
 
-  ceph device monitoring off
+.. prompt:: bash $
+
+   ceph device monitoring off
 
 
 Scraping
 --------
 
 
 
 Scraping
 --------
 
-If monitoring is enabled, metrics will automatically be scraped at regular intervals.  That interval can be configured with::
+If monitoring is enabled, metrics will automatically be scraped at regular intervals.  That interval can be configured with:
+
+.. prompt:: bash $
 
 
-  ceph config set mgr mgr/devicehealth/scrape_frequency <seconds>
+   ceph config set mgr mgr/devicehealth/scrape_frequency <seconds>
 
 The default is to scrape once every 24 hours.
 
 
 The default is to scrape once every 24 hours.
 
-You can manually trigger a scrape of all devices with::
+You can manually trigger a scrape of all devices with:
+   
+.. prompt:: bash $
 
 
-  ceph device scrape-health-metrics
+   ceph device scrape-health-metrics
 
 
-A single device can be scraped with::
+A single device can be scraped with:
 
 
-  ceph device scrape-health-metrics <device-id>
+.. prompt:: bash $
 
 
-Or a single daemon's devices can be scraped with::
+   ceph device scrape-health-metrics <device-id>
 
 
-  ceph device scrape-daemon-health-metrics <who>
+Or a single daemon's devices can be scraped with:
+
+.. prompt:: bash $
+
+   ceph device scrape-daemon-health-metrics <who>
 
 The stored health metrics for a device can be retrieved (optionally
 
 The stored health metrics for a device can be retrieved (optionally
-for a specific timestamp) with::
+for a specific timestamp) with:
+
+.. prompt:: bash $
 
 
-  ceph device get-health-metrics <devid> [sample-timestamp]
+   ceph device get-health-metrics <devid> [sample-timestamp]
 
 Failure prediction
 ------------------
 
 Failure prediction
 ------------------
@@ -121,29 +144,39 @@ health metrics it collects.  There are three modes:
 * *none*: disable device failure prediction.
 * *local*: use a pre-trained prediction model from the ceph-mgr daemon
 
 * *none*: disable device failure prediction.
 * *local*: use a pre-trained prediction model from the ceph-mgr daemon
 
-The prediction mode can be configured with::
+The prediction mode can be configured with:
 
 
-  ceph config set global device_failure_prediction_mode <mode>
+.. prompt:: bash $
+
+   ceph config set global device_failure_prediction_mode <mode>
 
 Prediction normally runs in the background on a periodic basis, so it
 may take some time before life expectancy values are populated.  You
 
 Prediction normally runs in the background on a periodic basis, so it
 may take some time before life expectancy values are populated.  You
-can see the life expectancy of all devices in output from::
+can see the life expectancy of all devices in output from:
+
+.. prompt:: bash $
 
 
-  ceph device ls
+   ceph device ls
 
 
-You can also query the metadata for a specific device with::
+You can also query the metadata for a specific device with:
 
 
-  ceph device info <devid>
+.. prompt:: bash $
 
 
-You can explicitly force prediction of a device's life expectancy with::
+   ceph device info <devid>
 
 
-  ceph device predict-life-expectancy <devid>
+You can explicitly force prediction of a device's life expectancy with:
+
+.. prompt:: bash $
+
+   ceph device predict-life-expectancy <devid>
 
 If you are not using Ceph's internal device failure prediction but
 have some external source of information about device failures, you
 
 If you are not using Ceph's internal device failure prediction but
 have some external source of information about device failures, you
-can inform Ceph of a device's life expectancy with::
+can inform Ceph of a device's life expectancy with:
 
 
-  ceph device set-life-expectancy <devid> <from> [<to>]
+.. prompt:: bash $
+
+   ceph device set-life-expectancy <devid> <from> [<to>]
 
 Life expectancies are expressed as a time interval so that
 uncertainty can be expressed in the form of a wide interval. The
 
 Life expectancies are expressed as a time interval so that
 uncertainty can be expressed in the form of a wide interval. The
@@ -156,9 +189,11 @@ The ``mgr/devicehealth/warn_threshold`` controls how soon an expected
 device failure must be before we generate a health warning.
 
 The stored life expectancy of all devices can be checked, and any
 device failure must be before we generate a health warning.
 
 The stored life expectancy of all devices can be checked, and any
-appropriate health alerts generated, with::
+appropriate health alerts generated, with:
+
+.. prompt:: bash $
 
 
-  ceph device check-health
+   ceph device check-health
 
 Automatic Mitigation
 --------------------
 
 Automatic Mitigation
 --------------------
index 5d9e3f63156943f65fbef774f09caf342d0edf11..1cffa32f56efa858ac474d1c24f267c86ca5a968 100644 (file)
@@ -38,31 +38,35 @@ to achieve recovery from an OSD failure.
 Erasure-code profile examples
 =============================
 
 Erasure-code profile examples
 =============================
 
-An example configuration that can be used to observe reduced bandwidth usage::
+An example configuration that can be used to observe reduced bandwidth usage:
 
 
-        $ ceph osd erasure-code-profile set CLAYprofile \
-             plugin=clay \
-             k=4 m=2 d=5 \
-             crush-failure-domain=host
-        $ ceph osd pool create claypool erasure CLAYprofile
+.. prompt:: bash $
+
+   ceph osd erasure-code-profile set CLAYprofile \
+      plugin=clay \
+      k=4 m=2 d=5 \
+      crush-failure-domain=host
+   ceph osd pool create claypool erasure CLAYprofile
 
 
 Creating a clay profile
 =======================
 
 
 
 Creating a clay profile
 =======================
 
-To create a new clay code profile::
-
-        ceph osd erasure-code-profile set {name} \
-             plugin=clay \
-             k={data-chunks} \
-             m={coding-chunks} \
-             [d={helper-chunks}] \
-             [scalar_mds={plugin-name}] \
-             [technique={technique-name}] \
-             [crush-failure-domain={bucket-type}] \
-             [crush-device-class={device-class}] \
-             [directory={directory}] \
-             [--force]
+To create a new clay code profile:
+
+.. prompt:: bash $
+
+   ceph osd erasure-code-profile set {name} \
+        plugin=clay \
+        k={data-chunks} \
+        m={coding-chunks} \
+        [d={helper-chunks}] \
+        [scalar_mds={plugin-name}] \
+        [technique={technique-name}] \
+        [crush-failure-domain={bucket-type}] \
+        [crush-device-class={device-class}] \
+        [directory={directory}] \
+        [--force]
 
 Where:
 
 
 Where:
 
index 79584619bd631d95ac84b6b40c730ec8404b0e0c..9a43f89a2cbbe7fc501cc2f34c35689360bef790 100644 (file)
@@ -9,18 +9,20 @@ library.
 Create an isa profile
 =====================
 
 Create an isa profile
 =====================
 
-To create a new *isa* erasure code profile::
-
-        ceph osd erasure-code-profile set {name} \
-             plugin=isa \
-             technique={reed_sol_van|cauchy} \
-             [k={data-chunks}] \
-             [m={coding-chunks}] \
-             [crush-root={root}] \
-             [crush-failure-domain={bucket-type}] \
-             [crush-device-class={device-class}] \
-             [directory={directory}] \
-             [--force]
+To create a new *isa* erasure code profile:
+
+.. prompt:: bash $
+
+   ceph osd erasure-code-profile set {name} \
+     plugin=isa \
+     technique={reed_sol_van|cauchy} \
+     [k={data-chunks}] \
+     [m={coding-chunks}] \
+     [crush-root={root}] \
+     [crush-failure-domain={bucket-type}] \
+     [crush-device-class={device-class}] \
+     [directory={directory}] \
+     [--force]
 
 Where:
 
 
 Where:
 
index 878bcac5cb633b4c441e81365694a1774bfd1319..553afa09d27e2d7eab5d8db46a9c850bc26ee650 100644 (file)
@@ -13,18 +13,20 @@ understanding of the parameters.
 Create a jerasure profile
 =========================
 
 Create a jerasure profile
 =========================
 
-To create a new *jerasure* erasure code profile::
-
-        ceph osd erasure-code-profile set {name} \
-             plugin=jerasure \
-             k={data-chunks} \
-             m={coding-chunks} \
-             technique={reed_sol_van|reed_sol_r6_op|cauchy_orig|cauchy_good|liberation|blaum_roth|liber8tion} \
-             [crush-root={root}] \
-             [crush-failure-domain={bucket-type}] \
-             [crush-device-class={device-class}] \
-             [directory={directory}] \
-             [--force]
+To create a new *jerasure* erasure code profile:
+.. prompt:: bash $
+
+   ceph osd erasure-code-profile set {name} \
+     plugin=jerasure \
+     k={data-chunks} \
+     m={coding-chunks} \
+     technique={reed_sol_van|reed_sol_r6_op|cauchy_orig|cauchy_good|liberation|blaum_roth|liber8tion} \
+     [crush-root={root}] \
+     [crush-failure-domain={bucket-type}] \
+     [crush-device-class={device-class}] \
+     [directory={directory}] \
+     [--force]
 
 Where:
 
 
 Where:
 
index b481b3d44c11aa4e3239a52b2c37f55c96314525..5329603b9cb779ace02de62bb3030c5615a6204c 100644 (file)
@@ -22,45 +22,51 @@ Reduce recovery bandwidth between hosts
 
 Although it is probably not an interesting use case when all hosts are
 connected to the same switch, reduced bandwidth usage can actually be
 
 Although it is probably not an interesting use case when all hosts are
 connected to the same switch, reduced bandwidth usage can actually be
-observed.::
+observed.:
 
 
-        $ ceph osd erasure-code-profile set LRCprofile \
-             plugin=lrc \
-             k=4 m=2 l=3 \
-             crush-failure-domain=host
-        $ ceph osd pool create lrcpool erasure LRCprofile
+.. prompt:: bash $
+
+   ceph osd erasure-code-profile set LRCprofile \
+      plugin=lrc \
+      k=4 m=2 l=3 \
+      crush-failure-domain=host
+   ceph osd pool create lrcpool erasure LRCprofile
 
 
 Reduce recovery bandwidth between racks
 ---------------------------------------
 
 In Firefly the bandwidth reduction will only be observed if the primary
 
 
 Reduce recovery bandwidth between racks
 ---------------------------------------
 
 In Firefly the bandwidth reduction will only be observed if the primary
-OSD is in the same rack as the lost chunk.::
+OSD is in the same rack as the lost chunk.:
+
+.. prompt:: bash $
 
 
-        $ ceph osd erasure-code-profile set LRCprofile \
-             plugin=lrc \
-             k=4 m=2 l=3 \
-             crush-locality=rack \
-             crush-failure-domain=host
-        $ ceph osd pool create lrcpool erasure LRCprofile
+   ceph osd erasure-code-profile set LRCprofile \
+      plugin=lrc \
+      k=4 m=2 l=3 \
+      crush-locality=rack \
+      crush-failure-domain=host
+   ceph osd pool create lrcpool erasure LRCprofile
 
 
 Create an lrc profile
 =====================
 
 
 
 Create an lrc profile
 =====================
 
-To create a new lrc erasure code profile::
+To create a new lrc erasure code profile:
 
 
-        ceph osd erasure-code-profile set {name} \
-             plugin=lrc \
-             k={data-chunks} \
-             m={coding-chunks} \
-             l={locality} \
-             [crush-root={root}] \
-             [crush-locality={bucket-type}] \
-             [crush-failure-domain={bucket-type}] \
-             [crush-device-class={device-class}] \
-             [directory={directory}] \
-             [--force]
+.. prompt:: bash $
+
+   ceph osd erasure-code-profile set {name} \
+       plugin=lrc \
+       k={data-chunks} \
+       m={coding-chunks} \
+       l={locality} \
+       [crush-root={root}] \
+       [crush-locality={bucket-type}] \
+       [crush-failure-domain={bucket-type}] \
+       [crush-device-class={device-class}] \
+       [directory={directory}] \
+       [--force]
 
 Where:
 
 
 Where:
 
@@ -190,13 +196,15 @@ Minimal testing
 
 It is strictly equivalent to using a *K=2* *M=1* erasure code profile. The *DD*
 implies *K=2*, the *c* implies *M=1* and the *jerasure* plugin is used
 
 It is strictly equivalent to using a *K=2* *M=1* erasure code profile. The *DD*
 implies *K=2*, the *c* implies *M=1* and the *jerasure* plugin is used
-by default.::
+by default.:
 
 
-        $ ceph osd erasure-code-profile set LRCprofile \
-             plugin=lrc \
-             mapping=DD_ \
-             layers='[ [ "DDc", "" ] ]'
-        $ ceph osd pool create lrcpool erasure LRCprofile
+.. prompt:: bash $
+   
+   ceph osd erasure-code-profile set LRCprofile \
+      plugin=lrc \
+      mapping=DD_ \
+      layers='[ [ "DDc", "" ] ]'
+   ceph osd pool create lrcpool erasure LRCprofile
 
 Reduce recovery bandwidth between hosts
 ---------------------------------------
 
 Reduce recovery bandwidth between hosts
 ---------------------------------------
@@ -204,38 +212,43 @@ Reduce recovery bandwidth between hosts
 Although it is probably not an interesting use case when all hosts are
 connected to the same switch, reduced bandwidth usage can actually be
 observed. It is equivalent to **k=4**, **m=2** and **l=3** although
 Although it is probably not an interesting use case when all hosts are
 connected to the same switch, reduced bandwidth usage can actually be
 observed. It is equivalent to **k=4**, **m=2** and **l=3** although
-the layout of the chunks is different::
+the layout of the chunks is different. **WARNING: PROMPTS ARE SELECTABLE**
+
+::
 
 
-        $ ceph osd erasure-code-profile set LRCprofile \
-             plugin=lrc \
-             mapping=__DD__DD \
-             layers='[
-                       [ "_cDD_cDD", "" ],
-                       [ "cDDD____", "" ],
-                       [ "____cDDD", "" ],
-                     ]'
-        $ ceph osd pool create lrcpool erasure LRCprofile
+   $ ceph osd erasure-code-profile set LRCprofile \
+        plugin=lrc \
+        mapping=__DD__DD \
+        layers='[
+                  [ "_cDD_cDD", "" ],
+                  [ "cDDD____", "" ],
+                  [ "____cDDD", "" ],
+                ]'
+   $ ceph osd pool create lrcpool erasure LRCprofile
 
 
 Reduce recovery bandwidth between racks
 ---------------------------------------
 
 
 
 Reduce recovery bandwidth between racks
 ---------------------------------------
 
-In Firefly the reduced bandwidth will only be observed if the primary
-OSD is in the same rack as the lost chunk.::
-
-        $ ceph osd erasure-code-profile set LRCprofile \
-             plugin=lrc \
-             mapping=__DD__DD \
-             layers='[
-                       [ "_cDD_cDD", "" ],
-                       [ "cDDD____", "" ],
-                       [ "____cDDD", "" ],
-                     ]' \
-             crush-steps='[
-                             [ "choose", "rack", 2 ],
-                             [ "chooseleaf", "host", 4 ],
-                            ]'
-        $ ceph osd pool create lrcpool erasure LRCprofile
+In Firefly the reduced bandwidth will only be observed if the primary OSD is in
+the same rack as the lost chunk. **WARNING: PROMPTS ARE SELECTABLE**
+
+::
+
+   $ ceph osd erasure-code-profile set LRCprofile \
+       plugin=lrc \
+       mapping=__DD__DD \
+       layers='[
+                 [ "_cDD_cDD", "" ],
+                 [ "cDDD____", "" ],
+                 [ "____cDDD", "" ],
+               ]' \
+       crush-steps='[
+                       [ "choose", "rack", 2 ],
+                       [ "chooseleaf", "host", 4 ],
+                      ]'
+  
+   $ ceph osd pool create lrcpool erasure LRCprofile
 
 Testing with different Erasure Code backends
 --------------------------------------------
 
 Testing with different Erasure Code backends
 --------------------------------------------
@@ -245,26 +258,30 @@ specify the EC backend/algorithm on a per layer basis using the low
 level configuration. The second argument in layers='[ [ "DDc", "" ] ]'
 is actually an erasure code profile to be used for this level. The
 example below specifies the ISA backend with the cauchy technique to
 level configuration. The second argument in layers='[ [ "DDc", "" ] ]'
 is actually an erasure code profile to be used for this level. The
 example below specifies the ISA backend with the cauchy technique to
-be used in the lrcpool.::
-
-        $ ceph osd erasure-code-profile set LRCprofile \
-             plugin=lrc \
-             mapping=DD_ \
-             layers='[ [ "DDc", "plugin=isa technique=cauchy" ] ]'
-        $ ceph osd pool create lrcpool erasure LRCprofile
-
-You could also use a different erasure code profile for for each
-layer.::
-
-        $ ceph osd erasure-code-profile set LRCprofile \
-             plugin=lrc \
-             mapping=__DD__DD \
-             layers='[
-                       [ "_cDD_cDD", "plugin=isa technique=cauchy" ],
-                       [ "cDDD____", "plugin=isa" ],
-                       [ "____cDDD", "plugin=jerasure" ],
-                     ]'
-        $ ceph osd pool create lrcpool erasure LRCprofile
+be used in the lrcpool.:
+
+.. prompt:: bash $
+
+   ceph osd erasure-code-profile set LRCprofile \
+      plugin=lrc \
+      mapping=DD_ \
+      layers='[ [ "DDc", "plugin=isa technique=cauchy" ] ]'
+   ceph osd pool create lrcpool erasure LRCprofile
+
+You could also use a different erasure code profile for each
+layer. **WARNING: PROMPTS ARE SELECTABLE**
+
+::
+
+   $ ceph osd erasure-code-profile set LRCprofile \
+        plugin=lrc \
+        mapping=__DD__DD \
+        layers='[
+                  [ "_cDD_cDD", "plugin=isa technique=cauchy" ],
+                  [ "cDDD____", "plugin=isa" ],
+                  [ "____cDDD", "plugin=jerasure" ],
+                ]'
+   $ ceph osd pool create lrcpool erasure LRCprofile
 
 
 
 
 
 
index b2157f780dd7cf380d8b98886d2aea83d75b0a21..4e8f59b0b54bab6ad1879a66045591fd11bc62a4 100644 (file)
@@ -9,7 +9,9 @@ library. It allows ceph to recover data more efficiently than Reed Solomon codes
 Create an SHEC profile
 ======================
 
 Create an SHEC profile
 ======================
 
-To create a new *shec* erasure code profile::
+To create a new *shec* erasure code profile:
+
+.. prompt:: bash $
 
         ceph osd erasure-code-profile set {name} \
              plugin=shec \
 
         ceph osd erasure-code-profile set {name} \
              plugin=shec \
@@ -133,10 +135,11 @@ but at least increasing m without increasing c achieves improvement of recovery
 Erasure code profile examples
 =============================
 
 Erasure code profile examples
 =============================
 
-::
 
 
-        $ ceph osd erasure-code-profile set SHECprofile \
+.. prompt:: bash $
+
+          ceph osd erasure-code-profile set SHECprofile \
              plugin=shec \
              k=8 m=4 c=3 \
              crush-failure-domain=host
              plugin=shec \
              k=8 m=4 c=3 \
              crush-failure-domain=host
-        $ ceph osd pool create shecpool erasure SHECprofile
+          ceph osd pool create shecpool erasure SHECprofile
index ddbea214ba5dab7b03434b1579982496ef93a483..e4e404574f6ae9048eccb884ff876bc82e76f7b5 100644 (file)
  Erasure code
 =============
 
  Erasure code
 =============
 
-A Ceph pool is associated to a type to sustain the loss of an OSD
-(i.e. a disk since most of the time there is one OSD per disk). The
-default choice when `creating a pool <../pools>`_ is *replicated*,
-meaning every object is copied on multiple disks. The `Erasure Code
-<https://en.wikipedia.org/wiki/Erasure_code>`_ pool type can be used
-instead to save space.
+By default, Ceph `pools <../pools>`_ are created with the type "replicated". In
+replicated-type pools, every object is copied to multiple disks (this
+multiple copying is the "replication").
+
+In contrast, `erasure-coded <https://en.wikipedia.org/wiki/Erasure_code>`_
+pools use a method of data protection that is different from replication. In
+erasure coding, data is broken into fragments of two kinds: data blocks and
+parity blocks. If a drive fails or becomes corrupted, the parity blocks are
+used to rebuild the data. At scale, erasure coding saves space relative to
+replication.
+
+In this documentation, data blocks are referred to as "data chunks"
+and parity blocks are referred to as "encoding chunks".
+
+Erasure codes are also called "forward error correction codes". The
+first forward error correction code was developed in 1950 by Richard
+Hamming at Bell Laboratories.
+
 
 Creating a sample erasure coded pool
 ------------------------------------
 
 The simplest erasure coded pool is equivalent to `RAID5
 <https://en.wikipedia.org/wiki/Standard_RAID_levels#RAID_5>`_ and
 
 Creating a sample erasure coded pool
 ------------------------------------
 
 The simplest erasure coded pool is equivalent to `RAID5
 <https://en.wikipedia.org/wiki/Standard_RAID_levels#RAID_5>`_ and
-requires at least three hosts::
+requires at least three hosts:
 
 
-    $ ceph osd pool create ecpool erasure
-    pool 'ecpool' created
-    $ echo ABCDEFGHI | rados --pool ecpool put NYAN -
-    $ rados --pool ecpool get NYAN -
-    ABCDEFGHI
+.. prompt:: bash $
+
+   ceph osd pool create ecpool erasure
+
+::
+
+   pool 'ecpool' created
+
+.. prompt:: bash $
+
+   echo ABCDEFGHI | rados --pool ecpool put NYAN -
+   rados --pool ecpool get NYAN -
+   
+::
+
+   ABCDEFGHI
 
 Erasure code profiles
 ---------------------
 
 
 Erasure code profiles
 ---------------------
 
-The default erasure code profile sustains the loss of a two OSDs. It
-is equivalent to a replicated pool of size three but requires 2TB
-instead of 3TB to store 1TB of data. The default profile can be
-displayed with::
+The default erasure code profile can sustain the loss of two OSDs. This erasure
+code profile is equivalent to a replicated pool of size three, but requires
+2TB to store 1TB of data instead of 3TB to store 1TB of data. The default
+profile can be displayed with this command:
 
 
-    $ ceph osd erasure-code-profile get default
-    k=2
-    m=2
-    plugin=jerasure
-    crush-failure-domain=host
-    technique=reed_sol_van
+.. prompt:: bash $
 
 
-Choosing the right profile is important because it cannot be modified
-after the pool is created: a new pool with a different profile needs
-to be created and all objects from the previous pool moved to the new.
+   ceph osd erasure-code-profile get default
+   
+::
+
+   k=2
+   m=2
+   plugin=jerasure
+   crush-failure-domain=host
+   technique=reed_sol_van
+
+.. note::
+   The default erasure-coded pool, the profile of which is displayed here, is
+   not the same as the simplest erasure-coded pool. 
+   
+   The default erasure-coded pool has two data chunks (k) and two coding chunks
+   (m). The profile of the default erasure-coded pool is "k=2 m=2".
+
+   The simplest erasure-coded pool has two data chunks (k) and one coding chunk
+   (m). The profile of the simplest erasure-coded pool is "k=2 m=1".
+
+Choosing the right profile is important because the profile cannot be modified
+after the pool is created. If you find that you need an erasure-coded pool with
+a profile different than the one you have created, you must create a new pool
+with a different (and presumably more carefully-considered) profile. When the
+new pool is created, all objects from the wrongly-configured pool must be moved
+to the newly-created pool. There is no way to alter the profile of a pool after its creation.
 
 The most important parameters of the profile are *K*, *M* and
 *crush-failure-domain* because they define the storage overhead and
 
 The most important parameters of the profile are *K*, *M* and
 *crush-failure-domain* because they define the storage overhead and
-the data durability. For instance, if the desired architecture must
+the data durability. For example, if the desired architecture must
 sustain the loss of two racks with a storage overhead of 67% overhead,
 sustain the loss of two racks with a storage overhead of 67% overhead,
-the following profile can be defined::
+the following profile can be defined:
+
+.. prompt:: bash $
 
 
-    $ ceph osd erasure-code-profile set myprofile \
+   ceph osd erasure-code-profile set myprofile \
        k=3 \
        m=2 \
        crush-failure-domain=rack
        k=3 \
        m=2 \
        crush-failure-domain=rack
-    $ ceph osd pool create ecpool erasure myprofile
-    $ echo ABCDEFGHI | rados --pool ecpool put NYAN -
-    $ rados --pool ecpool get NYAN -
+   ceph osd pool create ecpool erasure myprofile
+   echo ABCDEFGHI | rados --pool ecpool put NYAN -
+   rados --pool ecpool get NYAN -
+
+::
+
     ABCDEFGHI
 
 The *NYAN* object will be divided in three (*K=3*) and two additional
     ABCDEFGHI
 
 The *NYAN* object will be divided in three (*K=3*) and two additional
@@ -121,19 +167,23 @@ perform full object writes and appends.
 
 Since Luminous, partial writes for an erasure coded pool may be
 enabled with a per-pool setting. This lets RBD and CephFS store their
 
 Since Luminous, partial writes for an erasure coded pool may be
 enabled with a per-pool setting. This lets RBD and CephFS store their
-data in an erasure coded pool::
+data in an erasure coded pool:
+
+.. prompt:: bash $
 
     ceph osd pool set ec_pool allow_ec_overwrites true
 
 
     ceph osd pool set ec_pool allow_ec_overwrites true
 
-This can only be enabled on a pool residing on bluestore OSDs, since
-bluestore's checksumming is used to detect bitrot or other corruption
-during deep-scrub. In addition to being unsafe, using filestore with
-ec overwrites yields low performance compared to bluestore.
+This can be enabled only on a pool residing on BlueStore OSDs, since
+BlueStore's checksumming is used during deep scrubs to detect bitrot
+or other corruption. In addition to being unsafe, using Filestore with
+EC overwrites results in lower performance compared to BlueStore.
 
 Erasure coded pools do not support omap, so to use them with RBD and
 
 Erasure coded pools do not support omap, so to use them with RBD and
-CephFS you must instruct them to store their data in an ec pool, and
+CephFS you must instruct them to store their data in an EC pool, and
 their metadata in a replicated pool. For RBD, this means using the
 their metadata in a replicated pool. For RBD, this means using the
-erasure coded pool as the ``--data-pool`` during image creation::
+erasure coded pool as the ``--data-pool`` during image creation:
+
+.. prompt:: bash $
 
     rbd create --size 1G --data-pool ec_pool replicated_pool/image_name
 
 
     rbd create --size 1G --data-pool ec_pool replicated_pool/image_name
 
@@ -145,37 +195,41 @@ Erasure coded pool and cache tiering
 ------------------------------------
 
 Erasure coded pools require more resources than replicated pools and
 ------------------------------------
 
 Erasure coded pools require more resources than replicated pools and
-lack some functionalities such as omap. To overcome these
+lack some functionality such as omap. To overcome these
 limitations, one can set up a `cache tier <../cache-tiering>`_
 before the erasure coded pool.
 
 limitations, one can set up a `cache tier <../cache-tiering>`_
 before the erasure coded pool.
 
-For instance, if the pool *hot-storage* is made of fast storage::
+For instance, if the pool *hot-storage* is made of fast storage:
+
+.. prompt:: bash $
 
 
-    $ ceph osd tier add ecpool hot-storage
-    $ ceph osd tier cache-mode hot-storage writeback
-    $ ceph osd tier set-overlay ecpool hot-storage
+   ceph osd tier add ecpool hot-storage
+   ceph osd tier cache-mode hot-storage writeback
+   ceph osd tier set-overlay ecpool hot-storage
 
 will place the *hot-storage* pool as tier of *ecpool* in *writeback*
 mode so that every write and read to the *ecpool* are actually using
 the *hot-storage* and benefit from its flexibility and speed.
 
 More information can be found in the `cache tiering
 
 will place the *hot-storage* pool as tier of *ecpool* in *writeback*
 mode so that every write and read to the *ecpool* are actually using
 the *hot-storage* and benefit from its flexibility and speed.
 
 More information can be found in the `cache tiering
-<../cache-tiering>`_ documentation.
+<../cache-tiering>`_ documentation.  Note however that cache tiering
+is deprecated and may be removed completely in a future release.
 
 Erasure coded pool recovery
 ---------------------------
 
 Erasure coded pool recovery
 ---------------------------
-If an erasure coded pool loses some shards, it must recover them from the others.
-This generally involves reading from the remaining shards, reconstructing the data, and
-writing it to the new peer.
-In Octopus, erasure coded pools can recover as long as there are at least *K* shards
+If an erasure coded pool loses some data shards, it must recover them from others.
+This involves reading from the remaining shards, reconstructing the data, and
+writing new shards.
+In Octopus and later releases, erasure-coded pools can recover as long as there are at least *K* shards
 available. (With fewer than *K* shards, you have actually lost data!)
 
 available. (With fewer than *K* shards, you have actually lost data!)
 
-Prior to Octopus, erasure coded pools required at least *min_size* shards to be
-available, even if *min_size* is greater than *K*. (We generally recommend min_size
-be *K+2* or more to prevent loss of writes and data.)
-This conservative decision was made out of an abundance of caution when designing the new pool
-mode but also meant pools with lost OSDs but no data loss were unable to recover and go active
-without manual intervention to change the *min_size*.
+Prior to Octopus, erasure coded pools required at least ``min_size`` shards to be
+available, even if ``min_size`` is greater than ``K``. We recommend ``min_size``
+be ``K+2`` or more to prevent loss of writes and data.
+This conservative decision was made out of an abundance of caution when
+designing the new pool mode.  As a result pools with lost OSDs but without
+complete loss of any data were unable to recover and go active
+without manual intervention to temporarily change the ``min_size`` setting.
 
 Glossary
 --------
 
 Glossary
 --------
index d177fe5922d96e2fd5cc70ee7c755e0e8f1d69be..1075673e6d2e1319a1ebb092f7d091d756fb25d7 100644 (file)
@@ -73,9 +73,11 @@ not configured to bind to a v2 port in the cluster's monmap.  This
 means that features specific to the msgr2 protocol (e.g., encryption)
 are not available on some or all connections.
 
 means that features specific to the msgr2 protocol (e.g., encryption)
 are not available on some or all connections.
 
-In most cases this can be corrected by issuing the command::
+In most cases this can be corrected by issuing the command:
 
 
-  ceph mon enable-msgr2
+.. prompt:: bash $
+
+   ceph mon enable-msgr2
 
 That command will change any monitor configured for the old default
 port 6789 to continue to listen for v1 connections on 6789 and also
 
 That command will change any monitor configured for the old default
 port 6789 to continue to listen for v1 connections on 6789 and also
@@ -130,9 +132,11 @@ This warning may also indicate that the monitor has a bug that is
 preventing it from pruning the cluster metadata it stores.  If the
 problem persists, please report a bug.
 
 preventing it from pruning the cluster metadata it stores.  If the
 problem persists, please report a bug.
 
-The warning threshold may be adjusted with::
+The warning threshold may be adjusted with:
+
+.. prompt:: bash $
 
 
-  ceph config set global mon_data_size_warn <size>
+   ceph config set global mon_data_size_warn <size>
 
 AUTH_INSECURE_GLOBAL_ID_RECLAIM
 _______________________________
 
 AUTH_INSECURE_GLOBAL_ID_RECLAIM
 _______________________________
@@ -147,33 +151,43 @@ be necessary until all ceph clients have been upgraded), and the
 allows monitors to detect clients with insecure reclaim early by forcing them to
 reconnect right after they first authenticate).
 
 allows monitors to detect clients with insecure reclaim early by forcing them to
 reconnect right after they first authenticate).
 
-You can identify which client(s) are using unpatched ceph client code with::
+You can identify which client(s) are using unpatched ceph client code with:
+
+.. prompt:: bash $
 
 
-  ceph health detail
+   ceph health detail
 
 Clients global_id reclaim rehavior can also seen in the
 ``global_id_status`` field in the dump of clients connected to an
 individual monitor (``reclaim_insecure`` means the client is
 
 Clients global_id reclaim rehavior can also seen in the
 ``global_id_status`` field in the dump of clients connected to an
 individual monitor (``reclaim_insecure`` means the client is
-unpatched and is contributing to this health alert)::
+unpatched and is contributing to this health alert):
 
 
-  ceph tell mon.\* sessions
+.. prompt:: bash $
+
+   ceph tell mon.\* sessions
 
 We strongly recommend that all clients in the system are upgraded to a
 newer version of Ceph that correctly reclaims global_id values.  Once
 all clients have been updated, you can stop allowing insecure reconnections
 
 We strongly recommend that all clients in the system are upgraded to a
 newer version of Ceph that correctly reclaims global_id values.  Once
 all clients have been updated, you can stop allowing insecure reconnections
-with::
+with:
+
+.. prompt:: bash $
 
 
-  ceph config set mon auth_allow_insecure_global_id_reclaim false
+   ceph config set mon auth_allow_insecure_global_id_reclaim false
 
 If it is impractical to upgrade all clients immediately, you can silence
 
 If it is impractical to upgrade all clients immediately, you can silence
-this warning temporarily with::
+this warning temporarily with:
 
 
-  ceph health mute AUTH_INSECURE_GLOBAL_ID_RECLAIM 1w   # 1 week
+.. prompt:: bash $
 
 
-Although we do NOT recommend doing so, you can also disable this warning indefinitely
-with::
+   ceph health mute AUTH_INSECURE_GLOBAL_ID_RECLAIM 1w   # 1 week
 
 
-  ceph config set mon mon_warn_on_insecure_global_id_reclaim false
+Although we do NOT recommend doing so, you can also disable this warning
+indefinitely with:
+
+.. prompt:: bash $
+
+   ceph config set mon mon_warn_on_insecure_global_id_reclaim false
 
 AUTH_INSECURE_GLOBAL_ID_RECLAIM_ALLOWED
 _______________________________________
 
 AUTH_INSECURE_GLOBAL_ID_RECLAIM_ALLOWED
 _______________________________________
@@ -187,19 +201,25 @@ versions of Ceph that correctly and securely reclaim their global_id.
 If the ``AUTH_INSECURE_GLOBAL_ID_RECLAIM`` health alert has not also been raised and
 the ``auth_expose_insecure_global_id_reclaim`` setting has not been disabled (it is
 on by default), then there are currently no clients connected that need to be
 If the ``AUTH_INSECURE_GLOBAL_ID_RECLAIM`` health alert has not also been raised and
 the ``auth_expose_insecure_global_id_reclaim`` setting has not been disabled (it is
 on by default), then there are currently no clients connected that need to be
-upgraded, and it is safe to disallow insecure global_id reclaim with::
+upgraded, and it is safe to disallow insecure global_id reclaim with:
+
+.. prompt:: bash $
 
 
-  ceph config set mon auth_allow_insecure_global_id_reclaim false
+   ceph config set mon auth_allow_insecure_global_id_reclaim false
 
 If there are still clients that need to be upgraded, then this alert can be
 
 If there are still clients that need to be upgraded, then this alert can be
-silenced temporarily with::
+silenced temporarily with:
 
 
-  ceph health mute AUTH_INSECURE_GLOBAL_ID_RECLAIM_ALLOWED 1w   # 1 week
+.. prompt:: bash $
+
+   ceph health mute AUTH_INSECURE_GLOBAL_ID_RECLAIM_ALLOWED 1w   # 1 week
 
 Although we do NOT recommend doing so, you can also disable this warning indefinitely
 
 Although we do NOT recommend doing so, you can also disable this warning indefinitely
-with::
+with:
+
+.. prompt:: bash $
 
 
-  ceph config set mon mon_warn_on_insecure_global_id_reclaim_allowed false
+   ceph config set mon mon_warn_on_insecure_global_id_reclaim_allowed false
 
 
 Manager
 
 
 Manager
@@ -281,9 +301,11 @@ __________
 
 An OSD is referenced in the CRUSH map hierarchy but does not exist.
 
 
 An OSD is referenced in the CRUSH map hierarchy but does not exist.
 
-The OSD can be removed from the CRUSH hierarchy with::
+The OSD can be removed from the CRUSH hierarchy with:
+
+.. prompt:: bash $
 
 
-  ceph osd crush rm osd.<id>
+   ceph osd crush rm osd.<id>
 
 OSD_OUT_OF_ORDER_FULL
 _____________________
 
 OSD_OUT_OF_ORDER_FULL
 _____________________
@@ -293,11 +315,13 @@ and/or `failsafe_full` are not ascending.  In particular, we expect
 `nearfull < backfillfull`, `backfillfull < full`, and `full <
 failsafe_full`.
 
 `nearfull < backfillfull`, `backfillfull < full`, and `full <
 failsafe_full`.
 
-The thresholds can be adjusted with::
+The thresholds can be adjusted with:
 
 
-  ceph osd set-nearfull-ratio <ratio>
-  ceph osd set-backfillfull-ratio <ratio>
-  ceph osd set-full-ratio <ratio>
+.. prompt:: bash $
+
+   ceph osd set-nearfull-ratio <ratio>
+   ceph osd set-backfillfull-ratio <ratio>
+   ceph osd set-full-ratio <ratio>
 
 
 OSD_FULL
 
 
 OSD_FULL
@@ -306,18 +330,24 @@ ________
 One or more OSDs has exceeded the `full` threshold and is preventing
 the cluster from servicing writes.
 
 One or more OSDs has exceeded the `full` threshold and is preventing
 the cluster from servicing writes.
 
-Utilization by pool can be checked with::
+Utilization by pool can be checked with:
+
+.. prompt:: bash $
+
+   ceph df
 
 
-  ceph df
+The currently defined `full` ratio can be seen with:
 
 
-The currently defined `full` ratio can be seen with::
+.. prompt:: bash $
 
 
-  ceph osd dump | grep full_ratio
+   ceph osd dump | grep full_ratio
 
 A short-term workaround to restore write availability is to raise the full
 
 A short-term workaround to restore write availability is to raise the full
-threshold by a small amount::
+threshold by a small amount:
 
 
-  ceph osd set-full-ratio <ratio>
+.. prompt:: bash $
+
+   ceph osd set-full-ratio <ratio>
 
 New storage should be added to the cluster by deploying more OSDs or
 existing data should be deleted in order to free up space.
 
 New storage should be added to the cluster by deploying more OSDs or
 existing data should be deleted in order to free up space.
@@ -325,14 +355,16 @@ existing data should be deleted in order to free up space.
 OSD_BACKFILLFULL
 ________________
 
 OSD_BACKFILLFULL
 ________________
 
-One or more OSDs has exceeded the `backfillfull` threshold, which will
-prevent data from being allowed to rebalance to this device.  This is
-an early warning that rebalancing may not be able to complete and that
-the cluster is approaching full.
+One or more OSDs has exceeded the `backfillfull` threshold or *would* exceed
+when the currently mapped backfills finish, which will prevent data from being
+allowed to rebalance to this device.  This is an early warning that rebalancing
+may not be able to complete and that the cluster is approaching full.
+
+Utilization by pool can be checked with:
 
 
-Utilization by pool can be checked with::
+.. prompt:: bash $
 
 
-  ceph df
+   ceph df
 
 OSD_NEARFULL
 ____________
 
 OSD_NEARFULL
 ____________
@@ -340,9 +372,11 @@ ____________
 One or more OSDs has exceeded the `nearfull` threshold.  This is an early
 warning that the cluster is approaching full.
 
 One or more OSDs has exceeded the `nearfull` threshold.  This is an early
 warning that the cluster is approaching full.
 
-Utilization by pool can be checked with::
+Utilization by pool can be checked with:
+
+.. prompt:: bash $
 
 
-  ceph df
+   ceph df
 
 OSDMAP_FLAGS
 ____________
 
 OSDMAP_FLAGS
 ____________
@@ -363,10 +397,12 @@ One or more cluster flags of interest has been set.  These flags include:
 * *noscrub*, *nodeep_scrub* - scrubbing is disabled
 * *notieragent* - cache tiering activity is suspended
 
 * *noscrub*, *nodeep_scrub* - scrubbing is disabled
 * *notieragent* - cache tiering activity is suspended
 
-With the exception of *full*, these flags can be set or cleared with::
+With the exception of *full*, these flags can be set or cleared with:
 
 
-  ceph osd set <flag>
-  ceph osd unset <flag>
+.. prompt:: bash $
+
+   ceph osd set <flag>
+   ceph osd unset <flag>
 
 OSD_FLAGS
 _________
 
 OSD_FLAGS
 _________
@@ -381,19 +417,23 @@ These flags include:
 * *noout*: if these OSDs are down they will not automatically be marked
   `out` after the configured interval
 
 * *noout*: if these OSDs are down they will not automatically be marked
   `out` after the configured interval
 
-These flags can be set and cleared in batch with::
+These flags can be set and cleared in batch with:
+
+.. prompt:: bash $
+
+   ceph osd set-group <flags> <who>
+   ceph osd unset-group <flags> <who>
 
 
-  ceph osd set-group <flags> <who>
-  ceph osd unset-group <flags> <who>
+For example:
 
 
-For example, ::
+.. prompt:: bash $
 
 
-  ceph osd set-group noup,noout osd.0 osd.1
-  ceph osd unset-group noup,noout osd.0 osd.1
-  ceph osd set-group noup,noout host-foo
-  ceph osd unset-group noup,noout host-foo
-  ceph osd set-group noup,noout class-hdd
-  ceph osd unset-group noup,noout class-hdd
+   ceph osd set-group noup,noout osd.0 osd.1
+   ceph osd unset-group noup,noout osd.0 osd.1
+   ceph osd set-group noup,noout host-foo
+   ceph osd unset-group noup,noout host-foo
+   ceph osd set-group noup,noout class-hdd
+   ceph osd unset-group noup,noout class-hdd
 
 OLD_CRUSH_TUNABLES
 __________________
 
 OLD_CRUSH_TUNABLES
 __________________
@@ -421,56 +461,73 @@ One or more cache pools is not configured with a *hit set* to track
 utilization, which will prevent the tiering agent from identifying
 cold objects to flush and evict from the cache.
 
 utilization, which will prevent the tiering agent from identifying
 cold objects to flush and evict from the cache.
 
-Hit sets can be configured on the cache pool with::
+Hit sets can be configured on the cache pool with:
 
 
-  ceph osd pool set <poolname> hit_set_type <type>
-  ceph osd pool set <poolname> hit_set_period <period-in-seconds>
-  ceph osd pool set <poolname> hit_set_count <number-of-hitsets>
-  ceph osd pool set <poolname> hit_set_fpp <target-false-positive-rate>
+.. prompt:: bash $
+
+   ceph osd pool set <poolname> hit_set_type <type>
+   ceph osd pool set <poolname> hit_set_period <period-in-seconds>
+   ceph osd pool set <poolname> hit_set_count <number-of-hitsets>
+   ceph osd pool set <poolname> hit_set_fpp <target-false-positive-rate>
 
 OSD_NO_SORTBITWISE
 __________________
 
 
 OSD_NO_SORTBITWISE
 __________________
 
-No pre-luminous v12.y.z OSDs are running but the ``sortbitwise`` flag has not
+No pre-Luminous v12.y.z OSDs are running but the ``sortbitwise`` flag has not
 been set.
 
 been set.
 
-The ``sortbitwise`` flag must be set before luminous v12.y.z or newer
-OSDs can start.  You can safely set the flag with::
+The ``sortbitwise`` flag must be set before OSDs running Luminous v12.y.z or newer
+can start.  You can safely set the flag with:
+
+.. prompt:: bash $
 
 
-  ceph osd set sortbitwise
+   ceph osd set sortbitwise
 
 OSD_FILESTORE
 __________________
 
 
 OSD_FILESTORE
 __________________
 
-Filestore has been deprecated, considering that Bluestore has been the default
-objectstore for quite some time. Warn if OSDs are running Filestore.
+The Filestore OSD back end has been deprecated; the BlueStore back end has been
+the default objectstore for quite some time. Warn if OSDs are running Filestore.
 
 
-The 'mclock_scheduler' is not supported for filestore OSDs. Therefore, the
-default 'osd_op_queue' is set to 'wpq' for filestore OSDs and is enforced
+The 'mclock_scheduler' is not supported for Filestore OSDs. Therefore, the
+default 'osd_op_queue' is set to 'wpq' for Filestore OSDs and is enforced
 even if the user attempts to change it.
 
 even if the user attempts to change it.
 
-Filestore OSDs can be listed with::
+Filestore OSDs can be listed with:
 
 
-  ceph report | jq -c '."osd_metadata" | .[] | select(.osd_objectstore | contains("filestore")) | {id, osd_objectstore}'
+.. prompt:: bash $
 
 
-If it is not feasible to migrate Filestore OSDs to Bluestore immediately, you can silence
-this warning temporarily with::
+   ceph report | jq -c '."osd_metadata" | .[] | select(.osd_objectstore | contains("filestore")) | {id, osd_objectstore}'
 
 
-  ceph health mute OSD_FILESTORE
+In order to upgrade to Reef or later releases, any Filestore OSDs must first be
+migrated to BlueStore.
+When upgrading a release prior to Reef to Reef or later: if it is not feasible to migrate Filestore OSDs to
+BlueStore immediately, you can silence this warning temporarily with:
+
+.. prompt:: bash $
+
+   ceph health mute OSD_FILESTORE
+
+Since this migration can take considerable time to complete, we recommend that you
+begin the process well in advance of an update to Reef or later releases.
 
 POOL_FULL
 _________
 
 One or more pools has reached its quota and is no longer allowing writes.
 
 
 POOL_FULL
 _________
 
 One or more pools has reached its quota and is no longer allowing writes.
 
-Pool quotas and utilization can be seen with::
+Pool quotas and utilization can be seen with:
 
 
-  ceph df detail
+.. prompt:: bash $
 
 
-You can either raise the pool quota with::
+   ceph df detail
 
 
-  ceph osd pool set-quota <poolname> max_objects <num-objects>
-  ceph osd pool set-quota <poolname> max_bytes <num-bytes>
+You can either raise the pool quota with:
+
+.. prompt:: bash $
+
+   ceph osd pool set-quota <poolname> max_objects <num-objects>
+   ceph osd pool set-quota <poolname> max_bytes <num-bytes>
 
 or delete some existing data to reduce utilization.
 
 
 or delete some existing data to reduce utilization.
 
@@ -485,29 +542,37 @@ condition or even unexpected, but if the administrator's expectation
 was that all metadata would fit on the faster device, it indicates
 that not enough space was provided.
 
 was that all metadata would fit on the faster device, it indicates
 that not enough space was provided.
 
-This warning can be disabled on all OSDs with::
+This warning can be disabled on all OSDs with:
+
+.. prompt:: bash $
 
 
-  ceph config set osd bluestore_warn_on_bluefs_spillover false
+   ceph config set osd bluestore_warn_on_bluefs_spillover false
 
 
-Alternatively, it can be disabled on a specific OSD with::
+Alternatively, it can be disabled on a specific OSD with:
 
 
-  ceph config set osd.123 bluestore_warn_on_bluefs_spillover false
+.. prompt:: bash $
+
+   ceph config set osd.123 bluestore_warn_on_bluefs_spillover false
 
 To provide more metadata space, the OSD in question could be destroyed and
 reprovisioned.  This will involve data migration and recovery.
 
 It may also be possible to expand the LVM logical volume backing the
 `db` storage.  If the underlying LV has been expanded, the OSD daemon
 
 To provide more metadata space, the OSD in question could be destroyed and
 reprovisioned.  This will involve data migration and recovery.
 
 It may also be possible to expand the LVM logical volume backing the
 `db` storage.  If the underlying LV has been expanded, the OSD daemon
-needs to be stopped and BlueFS informed of the device size change with::
+needs to be stopped and BlueFS informed of the device size change with:
+
+.. prompt:: bash $
 
 
-  ceph-bluestore-tool bluefs-bdev-expand --path /var/lib/ceph/osd/ceph-$ID
+   ceph-bluestore-tool bluefs-bdev-expand --path /var/lib/ceph/osd/ceph-$ID
 
 BLUEFS_AVAILABLE_SPACE
 ______________________
 
 
 BLUEFS_AVAILABLE_SPACE
 ______________________
 
-To check how much space is free for BlueFS do::
+To check how much space is free for BlueFS do:
+
+.. prompt:: bash $
 
 
-  ceph daemon osd.123 bluestore bluefs available
+   ceph daemon osd.123 bluestore bluefs available
 
 This will output up to 3 values: `BDEV_DB free`, `BDEV_SLOW free` and
 `available_from_bluestore`. `BDEV_DB` and `BDEV_SLOW` report amount of space that
 
 This will output up to 3 values: `BDEV_DB free`, `BDEV_SLOW free` and
 `available_from_bluestore`. `BDEV_DB` and `BDEV_SLOW` report amount of space that
@@ -522,18 +587,22 @@ _________________
 
 If BlueFS is running low on available free space and there is little
 `available_from_bluestore` one can consider reducing BlueFS allocation unit size.
 
 If BlueFS is running low on available free space and there is little
 `available_from_bluestore` one can consider reducing BlueFS allocation unit size.
-To simulate available space when allocation unit is different do::
+To simulate available space when allocation unit is different do:
 
 
-  ceph daemon osd.123 bluestore bluefs available <alloc-unit-size>
+.. prompt:: bash $
+
+   ceph daemon osd.123 bluestore bluefs available <alloc-unit-size>
 
 BLUESTORE_FRAGMENTATION
 _______________________
 
 As BlueStore works free space on underlying storage will get fragmented.
 This is normal and unavoidable but excessive fragmentation will cause slowdown.
 
 BLUESTORE_FRAGMENTATION
 _______________________
 
 As BlueStore works free space on underlying storage will get fragmented.
 This is normal and unavoidable but excessive fragmentation will cause slowdown.
-To inspect BlueStore fragmentation one can do::
+To inspect BlueStore fragmentation one can do:
+
+.. prompt:: bash $
 
 
-  ceph daemon osd.123 bluestore allocator score block
+   ceph daemon osd.123 bluestore allocator score block
 
 Score is given in [0-1] range.
 [0.0 .. 0.4] tiny fragmentation
 
 Score is given in [0-1] range.
 [0.0 .. 0.4] tiny fragmentation
@@ -541,19 +610,25 @@ Score is given in [0-1] range.
 [0.7 .. 0.9] considerable, but safe fragmentation
 [0.9 .. 1.0] severe fragmentation, may impact BlueFS ability to get space from BlueStore
 
 [0.7 .. 0.9] considerable, but safe fragmentation
 [0.9 .. 1.0] severe fragmentation, may impact BlueFS ability to get space from BlueStore
 
-If detailed report of free fragments is required do::
+If detailed report of free fragments is required do:
+
+.. prompt:: bash $
 
 
-  ceph daemon osd.123 bluestore allocator dump block
+   ceph daemon osd.123 bluestore allocator dump block
 
 In case when handling OSD process that is not running fragmentation can be
 inspected with `ceph-bluestore-tool`.
 
 In case when handling OSD process that is not running fragmentation can be
 inspected with `ceph-bluestore-tool`.
-Get fragmentation score::
+Get fragmentation score:
 
 
-  ceph-bluestore-tool --path /var/lib/ceph/osd/ceph-123 --allocator block free-score
+.. prompt:: bash $
 
 
-And dump detailed free chunks::
+   ceph-bluestore-tool --path /var/lib/ceph/osd/ceph-123 --allocator block free-score
 
 
-  ceph-bluestore-tool --path /var/lib/ceph/osd/ceph-123 --allocator block free-dump
+And dump detailed free chunks:
+
+.. prompt:: bash $
+
+   ceph-bluestore-tool --path /var/lib/ceph/osd/ceph-123 --allocator block free-dump
 
 BLUESTORE_LEGACY_STATFS
 _______________________
 
 BLUESTORE_LEGACY_STATFS
 _______________________
@@ -566,15 +641,19 @@ not available.  However, if there is a mix of pre-Nautilus and
 post-Nautilus OSDs, the cluster usage statistics reported by ``ceph
 df`` will not be accurate.
 
 post-Nautilus OSDs, the cluster usage statistics reported by ``ceph
 df`` will not be accurate.
 
-The old OSDs can be updated to use the new usage tracking scheme by stopping each OSD, running a repair operation, and the restarting it.  For example, if ``osd.123`` needed to be updated,::
+The old OSDs can be updated to use the new usage tracking scheme by stopping each OSD, running a repair operation, and the restarting it.  For example, if ``osd.123`` needed to be updated,:
+
+.. prompt:: bash $
 
 
-  systemctl stop ceph-osd@123
-  ceph-bluestore-tool repair --path /var/lib/ceph/osd/ceph-123
-  systemctl start ceph-osd@123
+   systemctl stop ceph-osd@123
+   ceph-bluestore-tool repair --path /var/lib/ceph/osd/ceph-123
+   systemctl start ceph-osd@123
 
 
-This warning can be disabled with::
+This warning can be disabled with:
 
 
-  ceph config set global bluestore_warn_on_legacy_statfs false
+.. prompt:: bash $
+
+   ceph config set global bluestore_warn_on_legacy_statfs false
 
 BLUESTORE_NO_PER_POOL_OMAP
 __________________________
 
 BLUESTORE_NO_PER_POOL_OMAP
 __________________________
@@ -587,15 +666,19 @@ based on the most recent deep-scrub.
 
 The old OSDs can be updated to track by pool by stopping each OSD,
 running a repair operation, and the restarting it.  For example, if
 
 The old OSDs can be updated to track by pool by stopping each OSD,
 running a repair operation, and the restarting it.  For example, if
-``osd.123`` needed to be updated,::
+``osd.123`` needed to be updated,:
+
+.. prompt:: bash $
+
+   systemctl stop ceph-osd@123
+   ceph-bluestore-tool repair --path /var/lib/ceph/osd/ceph-123
+   systemctl start ceph-osd@123
 
 
-  systemctl stop ceph-osd@123
-  ceph-bluestore-tool repair --path /var/lib/ceph/osd/ceph-123
-  systemctl start ceph-osd@123
+This warning can be disabled with:
 
 
-This warning can be disabled with::
+.. prompt:: bash $
 
 
-  ceph config set global bluestore_warn_on_no_per_pool_omap false
+   ceph config set global bluestore_warn_on_no_per_pool_omap false
 
 BLUESTORE_NO_PER_PG_OMAP
 __________________________
 
 BLUESTORE_NO_PER_PG_OMAP
 __________________________
@@ -606,15 +689,19 @@ Pacific.  Per-PG omap enables faster PG removal when PGs migrate.
 
 The older OSDs can be updated to track by PG by stopping each OSD,
 running a repair operation, and the restarting it.  For example, if
 
 The older OSDs can be updated to track by PG by stopping each OSD,
 running a repair operation, and the restarting it.  For example, if
-``osd.123`` needed to be updated,::
+``osd.123`` needed to be updated,:
 
 
-  systemctl stop ceph-osd@123
-  ceph-bluestore-tool repair --path /var/lib/ceph/osd/ceph-123
-  systemctl start ceph-osd@123
+.. prompt:: bash $
 
 
-This warning can be disabled with::
+   systemctl stop ceph-osd@123
+   ceph-bluestore-tool repair --path /var/lib/ceph/osd/ceph-123
+   systemctl start ceph-osd@123
 
 
-  ceph config set global bluestore_warn_on_no_per_pg_omap false
+This warning can be disabled with:
+
+.. prompt:: bash $
+
+   ceph config set global bluestore_warn_on_no_per_pg_omap false
 
 
 BLUESTORE_DISK_SIZE_MISMATCH
 
 
 BLUESTORE_DISK_SIZE_MISMATCH
@@ -626,13 +713,15 @@ the OSD crashing in the future.
 
 The OSDs in question should be destroyed and reprovisioned.  Care should be
 taken to do this one OSD at a time, and in a way that doesn't put any data at
 
 The OSDs in question should be destroyed and reprovisioned.  Care should be
 taken to do this one OSD at a time, and in a way that doesn't put any data at
-risk.  For example, if osd ``$N`` has the error,::
+risk.  For example, if osd ``$N`` has the error:
+
+.. prompt:: bash $
 
 
-  ceph osd out osd.$N
-  while ! ceph osd safe-to-destroy osd.$N ; do sleep 1m ; done
-  ceph osd destroy osd.$N
-  ceph-volume lvm zap /path/to/device
-  ceph-volume lvm create --osd-id $N --data /path/to/device
+   ceph osd out osd.$N
+   while ! ceph osd safe-to-destroy osd.$N ; do sleep 1m ; done
+   ceph osd destroy osd.$N
+   ceph-volume lvm zap /path/to/device
+   ceph-volume lvm create --osd-id $N --data /path/to/device
 
 BLUESTORE_NO_COMPRESSION
 ________________________
 
 BLUESTORE_NO_COMPRESSION
 ________________________
@@ -662,13 +751,17 @@ This alert doesn't require immediate response but corresponding host might need
 additional attention, e.g. upgrading to the latest OS/kernel versions and
 H/W resource utilization monitoring.
 
 additional attention, e.g. upgrading to the latest OS/kernel versions and
 H/W resource utilization monitoring.
 
-This warning can be disabled on all OSDs with::
+This warning can be disabled on all OSDs with:
+
+.. prompt:: bash $
+
+   ceph config set osd bluestore_warn_on_spurious_read_errors false
 
 
-  ceph config set osd bluestore_warn_on_spurious_read_errors false
+Alternatively, it can be disabled on a specific OSD with:
 
 
-Alternatively, it can be disabled on a specific OSD with::
+.. prompt:: bash $
 
 
-  ceph config set osd.123 bluestore_warn_on_spurious_read_errors false
+   ceph config set osd.123 bluestore_warn_on_spurious_read_errors false
 
 
 Device health
 
 
 Device health
@@ -688,14 +781,18 @@ hardware from the system.  Note that the marking out is normally done
 automatically if ``mgr/devicehealth/self_heal`` is enabled based on
 the ``mgr/devicehealth/mark_out_threshold``.
 
 automatically if ``mgr/devicehealth/self_heal`` is enabled based on
 the ``mgr/devicehealth/mark_out_threshold``.
 
-Device health can be checked with::
+Device health can be checked with:
 
 
-  ceph device info <device-id>
+.. prompt:: bash $
+
+   ceph device info <device-id>
 
 Device life expectancy is set by a prediction model run by
 
 Device life expectancy is set by a prediction model run by
-the mgr or an by external tool via the command::
+the mgr or an by external tool via the command:
+
+.. prompt:: bash $
 
 
-  ceph device set-life-expectancy <device-id> <from> <to>
+   ceph device set-life-expectancy <device-id> <from> <to>
 
 You can change the stored life expectancy manually, but that usually
 doesn't accomplish anything as whatever tool originally set it will
 
 You can change the stored life expectancy manually, but that usually
 doesn't accomplish anything as whatever tool originally set it will
@@ -750,16 +847,20 @@ requests to be serviced.  Problematic PG states include *peering*,
 *stale*, *incomplete*, and the lack of *active* (if those conditions do not clear
 quickly).
 
 *stale*, *incomplete*, and the lack of *active* (if those conditions do not clear
 quickly).
 
-Detailed information about which PGs are affected is available from::
+Detailed information about which PGs are affected is available from:
+
+.. prompt:: bash $
 
 
-  ceph health detail
+   ceph health detail
 
 In most cases the root cause is that one or more OSDs is currently
 down; see the discussion for ``OSD_DOWN`` above.
 
 
 In most cases the root cause is that one or more OSDs is currently
 down; see the discussion for ``OSD_DOWN`` above.
 
-The state of specific problematic PGs can be queried with::
+The state of specific problematic PGs can be queried with:
 
 
-  ceph tell <pgid> query
+.. prompt:: bash $
+
+   ceph tell <pgid> query
 
 PG_DEGRADED
 ___________
 
 PG_DEGRADED
 ___________
@@ -773,16 +874,20 @@ Specifically, one or more PGs:
   enough instances of that placement group in the cluster;
 * has not had the *clean* flag set for some time.
 
   enough instances of that placement group in the cluster;
 * has not had the *clean* flag set for some time.
 
-Detailed information about which PGs are affected is available from::
+Detailed information about which PGs are affected is available from:
+
+.. prompt:: bash $
 
 
-  ceph health detail
+   ceph health detail
 
 In most cases the root cause is that one or more OSDs is currently
 down; see the discussion for ``OSD_DOWN`` above.
 
 
 In most cases the root cause is that one or more OSDs is currently
 down; see the discussion for ``OSD_DOWN`` above.
 
-The state of specific problematic PGs can be queried with::
+The state of specific problematic PGs can be queried with:
+
+.. prompt:: bash $
 
 
-  ceph tell <pgid> query
+   ceph tell <pgid> query
 
 
 PG_RECOVERY_FULL
 
 
 PG_RECOVERY_FULL
@@ -851,10 +956,12 @@ can be caused by RGW bucket index objects that do not have automatic resharding
 enabled. Please see :ref:`RGW Dynamic Bucket Index Resharding
 <rgw_dynamic_bucket_index_resharding>` for more information on resharding.
 
 enabled. Please see :ref:`RGW Dynamic Bucket Index Resharding
 <rgw_dynamic_bucket_index_resharding>` for more information on resharding.
 
-The thresholds can be adjusted with::
+The thresholds can be adjusted with:
 
 
-  ceph config set osd osd_deep_scrub_large_omap_object_key_threshold <keys>
-  ceph config set osd osd_deep_scrub_large_omap_object_value_sum_threshold <bytes>
+.. prompt:: bash $
+
+   ceph config set osd osd_deep_scrub_large_omap_object_key_threshold <keys>
+   ceph config set osd osd_deep_scrub_large_omap_object_value_sum_threshold <bytes>
 
 CACHE_POOL_NEAR_FULL
 ____________________
 
 CACHE_POOL_NEAR_FULL
 ____________________
@@ -866,10 +973,12 @@ requests to the pool may block while data is flushed and evicted
 from the cache, a state that normally leads to very high latencies and
 poor performance.
 
 from the cache, a state that normally leads to very high latencies and
 poor performance.
 
-The cache pool target size can be adjusted with::
+The cache pool target size can be adjusted with:
+
+.. prompt:: bash $
 
 
-  ceph osd pool set <cache-pool-name> target_max_bytes <bytes>
-  ceph osd pool set <cache-pool-name> target_max_objects <objects>
+   ceph osd pool set <cache-pool-name> target_max_bytes <bytes>
+   ceph osd pool set <cache-pool-name> target_max_objects <objects>
 
 Normal cache flush and evict activity may also be throttled due to reduced
 availability or performance of the base tier, or overall cluster load.
 
 Normal cache flush and evict activity may also be throttled due to reduced
 availability or performance of the base tier, or overall cluster load.
@@ -898,13 +1007,17 @@ balanced distribution of data because some PGs have roughly twice as
 much data as others.
 
 This is easily corrected by setting the ``pg_num`` value for the
 much data as others.
 
 This is easily corrected by setting the ``pg_num`` value for the
-affected pool(s) to a nearby power of two::
+affected pool(s) to a nearby power of two:
+
+.. prompt:: bash $
 
 
-  ceph osd pool set <pool-name> pg_num <value>
+   ceph osd pool set <pool-name> pg_num <value>
 
 
-This health warning can be disabled with::
+This health warning can be disabled with:
 
 
-  ceph config set global mon_warn_on_pool_pg_num_not_power_of_two false
+.. prompt:: bash $
+
+   ceph config set global mon_warn_on_pool_pg_num_not_power_of_two false
 
 POOL_TOO_FEW_PGS
 ________________
 
 POOL_TOO_FEW_PGS
 ________________
@@ -917,18 +1030,24 @@ generated if the ``pg_autoscale_mode`` property on the pool is set to
 ``warn``.
 
 To disable the warning, you can disable auto-scaling of PGs for the
 ``warn``.
 
 To disable the warning, you can disable auto-scaling of PGs for the
-pool entirely with::
+pool entirely with:
+
+.. prompt:: bash $
+
+   ceph osd pool set <pool-name> pg_autoscale_mode off
 
 
-  ceph osd pool set <pool-name> pg_autoscale_mode off
+To allow the cluster to automatically adjust the number of PGs,:
 
 
-To allow the cluster to automatically adjust the number of PGs,::
+.. prompt:: bash $
 
 
-  ceph osd pool set <pool-name> pg_autoscale_mode on
+   ceph osd pool set <pool-name> pg_autoscale_mode on
 
 You can also manually set the number of PGs for the pool to the
 
 You can also manually set the number of PGs for the pool to the
-recommended amount with::
+recommended amount with:
 
 
-  ceph osd pool set <pool-name> pg_num <new-pg-num>
+.. prompt:: bash $
+
+   ceph osd pool set <pool-name> pg_num <new-pg-num>
 
 Please refer to :ref:`choosing-number-of-placement-groups` and
 :ref:`pg-autoscaler` for more information.
 
 Please refer to :ref:`choosing-number-of-placement-groups` and
 :ref:`pg-autoscaler` for more information.
@@ -948,9 +1067,11 @@ higher load on the Manager and Monitor daemons.
 The simplest way to mitigate the problem is to increase the number of
 OSDs in the cluster by adding more hardware.  Note that the OSD count
 used for the purposes of this health check is the number of "in" OSDs,
 The simplest way to mitigate the problem is to increase the number of
 OSDs in the cluster by adding more hardware.  Note that the OSD count
 used for the purposes of this health check is the number of "in" OSDs,
-so marking "out" OSDs "in" (if there are any) can also help::
+so marking "out" OSDs "in" (if there are any) can also help:
+
+.. prompt:: bash $
 
 
-  ceph osd in <osd id(s)>
+   ceph osd in <osd id(s)>
 
 Please refer to :ref:`choosing-number-of-placement-groups` for more
 information.
 
 Please refer to :ref:`choosing-number-of-placement-groups` for more
 information.
@@ -966,18 +1087,24 @@ on the Manager and Monitor daemons.  This warning is generated if the
 ``pg_autoscale_mode`` property on the pool is set to ``warn``.
 
 To disable the warning, you can disable auto-scaling of PGs for the
 ``pg_autoscale_mode`` property on the pool is set to ``warn``.
 
 To disable the warning, you can disable auto-scaling of PGs for the
-pool entirely with::
+pool entirely with:
+
+.. prompt:: bash $
 
 
-  ceph osd pool set <pool-name> pg_autoscale_mode off
+   ceph osd pool set <pool-name> pg_autoscale_mode off
 
 
-To allow the cluster to automatically adjust the number of PGs,::
+To allow the cluster to automatically adjust the number of PGs,:
 
 
-  ceph osd pool set <pool-name> pg_autoscale_mode on
+.. prompt:: bash $
+
+   ceph osd pool set <pool-name> pg_autoscale_mode on
 
 You can also manually set the number of PGs for the pool to the
 
 You can also manually set the number of PGs for the pool to the
-recommended amount with::
+recommended amount with:
+
+.. prompt:: bash $
 
 
-  ceph osd pool set <pool-name> pg_num <new-pg-num>
+   ceph osd pool set <pool-name> pg_num <new-pg-num>
 
 Please refer to :ref:`choosing-number-of-placement-groups` and
 :ref:`pg-autoscaler` for more information.
 
 Please refer to :ref:`choosing-number-of-placement-groups` and
 :ref:`pg-autoscaler` for more information.
@@ -991,9 +1118,11 @@ but the value(s) exceed the total available storage (either by
 themselves or in combination with other pools' actual usage).
 
 This is usually an indication that the ``target_size_bytes`` value for
 themselves or in combination with other pools' actual usage).
 
 This is usually an indication that the ``target_size_bytes`` value for
-the pool is too large and should be reduced or set to zero with::
+the pool is too large and should be reduced or set to zero with:
+
+.. prompt:: bash $
 
 
-  ceph osd pool set <pool-name> target_size_bytes 0
+   ceph osd pool set <pool-name> target_size_bytes 0
 
 For more information, see :ref:`specifying_pool_target_size`.
 
 
 For more information, see :ref:`specifying_pool_target_size`.
 
@@ -1006,9 +1135,11 @@ Only one of these properties should be non-zero. If both are set,
 ``target_size_ratio`` takes precedence and ``target_size_bytes`` is
 ignored.
 
 ``target_size_ratio`` takes precedence and ``target_size_bytes`` is
 ignored.
 
-To reset ``target_size_bytes`` to zero::
+To reset ``target_size_bytes`` to zero:
 
 
-  ceph osd pool set <pool-name> target_size_bytes 0
+.. prompt:: bash $
+
+   ceph osd pool set <pool-name> target_size_bytes 0
 
 For more information, see :ref:`specifying_pool_target_size`.
 
 
 For more information, see :ref:`specifying_pool_target_size`.
 
@@ -1030,9 +1161,11 @@ when the PG count is adjusted from the data migration that is needed
 when ``pgp_num`` is changed.
 
 This is normally resolved by setting ``pgp_num`` to match ``pg_num``,
 when ``pgp_num`` is changed.
 
 This is normally resolved by setting ``pgp_num`` to match ``pg_num``,
-triggering the data migration, with::
+triggering the data migration, with:
+
+.. prompt:: bash $
 
 
-  ceph osd pool set <pool> pgp_num <pg-num-value>
+   ceph osd pool set <pool> pgp_num <pg-num-value>
 
 MANY_OBJECTS_PER_PG
 ___________________
 
 MANY_OBJECTS_PER_PG
 ___________________
@@ -1060,14 +1193,18 @@ A pool exists that contains one or more objects but has not been
 tagged for use by a particular application.
 
 Resolve this warning by labeling the pool for use by an application.  For
 tagged for use by a particular application.
 
 Resolve this warning by labeling the pool for use by an application.  For
-example, if the pool is used by RBD,::
+example, if the pool is used by RBD,:
+
+.. prompt:: bash $
 
 
-  rbd pool init <poolname>
+   rbd pool init <poolname>
 
 If the pool is being used by a custom application 'foo', you can also label
 
 If the pool is being used by a custom application 'foo', you can also label
-via the low-level command::
+via the low-level command:
 
 
-  ceph osd pool application enable foo
+.. prompt:: bash $
+
+   ceph osd pool application enable foo
 
 For more information, see :ref:`associate-pool-to-application`.
 
 
 For more information, see :ref:`associate-pool-to-application`.
 
@@ -1078,10 +1215,12 @@ One or more pools has reached (or is very close to reaching) its
 quota.  The threshold to trigger this error condition is controlled by
 the ``mon_pool_quota_crit_threshold`` configuration option.
 
 quota.  The threshold to trigger this error condition is controlled by
 the ``mon_pool_quota_crit_threshold`` configuration option.
 
-Pool quotas can be adjusted up or down (or removed) with::
+Pool quotas can be adjusted up or down (or removed) with:
+
+.. prompt:: bash $
 
 
-  ceph osd pool set-quota <pool> max_bytes <bytes>
-  ceph osd pool set-quota <pool> max_objects <objects>
+   ceph osd pool set-quota <pool> max_bytes <bytes>
+   ceph osd pool set-quota <pool> max_objects <objects>
 
 Setting the quota value to 0 will disable the quota.
 
 
 Setting the quota value to 0 will disable the quota.
 
@@ -1093,10 +1232,12 @@ One or more pools is approaching a configured fullness threshold.
 One threshold that can trigger this warning condition is the
 ``mon_pool_quota_warn_threshold`` configuration option.
 
 One threshold that can trigger this warning condition is the
 ``mon_pool_quota_warn_threshold`` configuration option.
 
-Pool quotas can be adjusted up or down (or removed) with::
+Pool quotas can be adjusted up or down (or removed) with:
 
 
-  ceph osd pool set-quota <pool> max_bytes <bytes>
-  ceph osd pool set-quota <pool> max_objects <objects>
+.. prompt:: bash $
+
+   ceph osd pool set-quota <pool> max_bytes <bytes>
+   ceph osd pool set-quota <pool> max_objects <objects>
 
 Setting the quota value to 0 will disable the quota.
 
 
 Setting the quota value to 0 will disable the quota.
 
@@ -1129,9 +1270,11 @@ Read or write requests to unfound objects will block.
 
 Ideally, a down OSD can be brought back online that has the more
 recent copy of the unfound object.  Candidate OSDs can be identified from the
 
 Ideally, a down OSD can be brought back online that has the more
 recent copy of the unfound object.  Candidate OSDs can be identified from the
-peering state for the PG(s) responsible for the unfound object::
+peering state for the PG(s) responsible for the unfound object:
+
+.. prompt:: bash $
 
 
-  ceph tell <pgid> query
+   ceph tell <pgid> query
 
 If the latest copy of the object is not available, the cluster can be
 told to roll back to a previous version of the object. See
 
 If the latest copy of the object is not available, the cluster can be
 told to roll back to a previous version of the object. See
@@ -1145,17 +1288,23 @@ be an indication of extreme load, a slow storage device, or a software
 bug.
 
 The request queue for the daemon in question can be queried with the
 bug.
 
 The request queue for the daemon in question can be queried with the
-following command, executed from the daemon's host::
+following command, executed from the daemon's host:
+
+.. prompt:: bash $
 
 
-  ceph daemon osd.<id> ops
+   ceph daemon osd.<id> ops
 
 
-A summary of the slowest recent requests can be seen with::
+A summary of the slowest recent requests can be seen with:
 
 
-  ceph daemon osd.<id> dump_historic_ops
+.. prompt:: bash $
 
 
-The location of an OSD can be found with::
+   ceph daemon osd.<id> dump_historic_ops
 
 
-  ceph osd find osd.<id>
+The location of an OSD can be found with:
+
+.. prompt:: bash $
+
+   ceph osd find osd.<id>
 
 PG_NOT_SCRUBBED
 _______________
 
 PG_NOT_SCRUBBED
 _______________
@@ -1188,9 +1337,11 @@ PGs will not (deep) scrub if they are not flagged as *clean*, which may
 happen if they are misplaced or degraded (see *PG_AVAILABILITY* and
 *PG_DEGRADED* above).
 
 happen if they are misplaced or degraded (see *PG_AVAILABILITY* and
 *PG_DEGRADED* above).
 
-You can manually initiate a scrub of a clean PG with::
+You can manually initiate a scrub of a clean PG with:
 
 
-  ceph pg deep-scrub <pgid>
+.. prompt:: bash $
+
+   ceph pg deep-scrub <pgid>
 
 
 PG_SLOW_SNAP_TRIMMING
 
 
 PG_SLOW_SNAP_TRIMMING
@@ -1224,23 +1375,31 @@ yet been archived (acknowledged) by the administrator.  This may
 indicate a software bug, a hardware problem (e.g., a failing disk), or
 some other problem.
 
 indicate a software bug, a hardware problem (e.g., a failing disk), or
 some other problem.
 
-New crashes can be listed with::
+New crashes can be listed with:
+
+.. prompt:: bash $
+
+   ceph crash ls-new
 
 
-  ceph crash ls-new
+Information about a specific crash can be examined with:
 
 
-Information about a specific crash can be examined with::
+.. prompt:: bash $
 
 
-  ceph crash info <crash-id>
+   ceph crash info <crash-id>
 
 This warning can be silenced by "archiving" the crash (perhaps after
 being examined by an administrator) so that it does not generate this
 
 This warning can be silenced by "archiving" the crash (perhaps after
 being examined by an administrator) so that it does not generate this
-warning::
+warning:
 
 
-  ceph crash archive <crash-id>
+.. prompt:: bash $
 
 
-Similarly, all new crashes can be archived with::
+   ceph crash archive <crash-id>
 
 
-  ceph crash archive-all
+Similarly, all new crashes can be archived with:
+
+.. prompt:: bash $
+
+   ceph crash archive-all
 
 Archived crashes will still be visible via ``ceph crash ls`` but not
 ``ceph crash ls-new``.
 
 Archived crashes will still be visible via ``ceph crash ls`` but not
 ``ceph crash ls-new``.
@@ -1248,9 +1407,11 @@ Archived crashes will still be visible via ``ceph crash ls`` but not
 The time period for what "recent" means is controlled by the option
 ``mgr/crash/warn_recent_interval`` (default: two weeks).
 
 The time period for what "recent" means is controlled by the option
 ``mgr/crash/warn_recent_interval`` (default: two weeks).
 
-These warnings can be disabled entirely with::
+These warnings can be disabled entirely with:
+
+.. prompt:: bash $
 
 
-  ceph config set mgr/crash/warn_recent_interval 0
+   ceph config set mgr/crash/warn_recent_interval 0
 
 RECENT_MGR_MODULE_CRASH
 _______________________
 
 RECENT_MGR_MODULE_CRASH
 _______________________
@@ -1262,19 +1423,25 @@ inside the ceph-mgr daemon.  Although the module that experienced the
 problem maybe be disabled as a result, the function of other modules
 is normally unaffected.
 
 problem maybe be disabled as a result, the function of other modules
 is normally unaffected.
 
-As with the *RECENT_CRASH* health alert, the crash can be inspected with::
+As with the *RECENT_CRASH* health alert, the crash can be inspected with:
 
 
-    ceph crash info <crash-id>
+.. prompt:: bash $
+
+   ceph crash info <crash-id>
 
 This warning can be silenced by "archiving" the crash (perhaps after
 being examined by an administrator) so that it does not generate this
 
 This warning can be silenced by "archiving" the crash (perhaps after
 being examined by an administrator) so that it does not generate this
-warning::
+warning:
+
+.. prompt:: bash $
+
+   ceph crash archive <crash-id>
 
 
-  ceph crash archive <crash-id>
+Similarly, all new crashes can be archived with:
 
 
-Similarly, all new crashes can be archived with::
+.. prompt:: bash $
 
 
-  ceph crash archive-all
+   ceph crash archive-all
 
 Archived crashes will still be visible via ``ceph crash ls`` but not
 ``ceph crash ls-new``.
 
 Archived crashes will still be visible via ``ceph crash ls`` but not
 ``ceph crash ls-new``.
@@ -1282,9 +1449,11 @@ Archived crashes will still be visible via ``ceph crash ls`` but not
 The time period for what "recent" means is controlled by the option
 ``mgr/crash/warn_recent_interval`` (default: two weeks).
 
 The time period for what "recent" means is controlled by the option
 ``mgr/crash/warn_recent_interval`` (default: two weeks).
 
-These warnings can be disabled entirely with::
+These warnings can be disabled entirely with:
 
 
-  ceph config set mgr/crash/warn_recent_interval 0
+.. prompt:: bash $
+
+   ceph config set mgr/crash/warn_recent_interval 0
 
 TELEMETRY_CHANGED
 _________________
 
 TELEMETRY_CHANGED
 _________________
@@ -1299,21 +1468,27 @@ report, Ceph will require the administrator to re-enable telemetry to
 ensure they have an opportunity to (re)review what information will be
 shared.
 
 ensure they have an opportunity to (re)review what information will be
 shared.
 
-To review the contents of the telemetry report,::
+To review the contents of the telemetry report:
+
+.. prompt:: bash $
 
 
-  ceph telemetry show
+   ceph telemetry show
 
 Note that the telemetry report consists of several optional channels
 that may be independently enabled or disabled.  For more information, see
 :ref:`telemetry`.
 
 
 Note that the telemetry report consists of several optional channels
 that may be independently enabled or disabled.  For more information, see
 :ref:`telemetry`.
 
-To re-enable telemetry (and make this warning go away),::
+To re-enable telemetry (and make this warning go away):
+
+.. prompt:: bash $
 
 
-  ceph telemetry on
+   ceph telemetry on
 
 
-To disable telemetry (and make this warning go away),::
+To disable telemetry (and make this warning go away):
 
 
-  ceph telemetry off
+.. prompt:: bash $
+
+   ceph telemetry off
 
 AUTH_BAD_CAPS
 _____________
 
 AUTH_BAD_CAPS
 _____________
@@ -1327,16 +1502,20 @@ capabilities were set with an older version of Ceph that did not
 properly validate their syntax, or if the syntax of the capabilities
 has changed.
 
 properly validate their syntax, or if the syntax of the capabilities
 has changed.
 
-The user in question can be removed with::
+The user in question can be removed with:
+
+.. prompt:: bash $
 
 
-  ceph auth rm <entity-name>
+   ceph auth rm <entity-name>
 
 (This will resolve the health alert, but obviously clients will not be
 able to authenticate as that user.)
 
 
 (This will resolve the health alert, but obviously clients will not be
 able to authenticate as that user.)
 
-Alternatively, the capabilities for the user can be updated with::
+Alternatively, the capabilities for the user can be updated with:
+
+.. prompt:: bash $
 
 
-  ceph auth <entity-name> <daemon-type> <caps> [<daemon-type> <caps> ...]
+   ceph auth <entity-name> <daemon-type> <caps> [<daemon-type> <caps> ...]
 
 For more information about auth capabilities, see :ref:`user-management`.
 
 
 For more information about auth capabilities, see :ref:`user-management`.
 
@@ -1353,9 +1532,11 @@ This option is normally set to five or ten minutes--enough time for a
 host to power-cycle or reboot.
 
 This warning can silenced by setting the
 host to power-cycle or reboot.
 
 This warning can silenced by setting the
-``mon_warn_on_osd_down_out_interval_zero`` to false::
+``mon_warn_on_osd_down_out_interval_zero`` to false:
 
 
-  ceph config global mon mon_warn_on_osd_down_out_interval_zero false
+.. prompt:: bash $
+
+   ceph config global mon mon_warn_on_osd_down_out_interval_zero false
 
 DASHBOARD_DEBUG
 _______________
 
 DASHBOARD_DEBUG
 _______________
@@ -1366,6 +1547,8 @@ a Python traceback. This behaviour should be disabled in production
 environments because such a traceback might contain and expose sensible
 information.
 
 environments because such a traceback might contain and expose sensible
 information.
 
-The debug mode can be disabled with::
+The debug mode can be disabled with:
+
+.. prompt:: bash $
 
 
-  ceph dashboard debug disable
+   ceph dashboard debug disable
index 86b85e7b48d574d53b852902f99a2b70028d0221..3b997bfb4abf8f717187874aa8fd3fa0c0f3345d 100644 (file)
@@ -64,7 +64,9 @@ echo   ``HEALTH OK`` in a few expected circumstances:
 
 An important aspect of monitoring OSDs is to ensure that when the cluster
 is up and running that all OSDs that are ``in`` the cluster are ``up`` and
 
 An important aspect of monitoring OSDs is to ensure that when the cluster
 is up and running that all OSDs that are ``in`` the cluster are ``up`` and
-running, too. To see if all OSDs are running, execute:: 
+running, too. To see if all OSDs are running, execute:
+
+.. prompt:: bash $
 
        ceph osd stat
 
 
        ceph osd stat
 
@@ -75,7 +77,9 @@ how many are ``up`` (y), how many are ``in`` (z) and the map epoch (eNNNN). ::
 
 If the number of OSDs that are ``in`` the cluster is more than the number of
 OSDs that are ``up``, execute the following command to identify the ``ceph-osd``
 
 If the number of OSDs that are ``in`` the cluster is more than the number of
 OSDs that are ``up``, execute the following command to identify the ``ceph-osd``
-daemons that are not running:: 
+daemons that are not running:
+
+.. prompt:: bash $
 
        ceph osd tree
 
 
        ceph osd tree
 
@@ -91,7 +95,9 @@ daemons that are not running::
 .. tip:: The ability to search through a well-designed CRUSH hierarchy may help
    you troubleshoot your cluster by identifying the physical locations faster.
 
 .. tip:: The ability to search through a well-designed CRUSH hierarchy may help
    you troubleshoot your cluster by identifying the physical locations faster.
 
-If an OSD is ``down``, start it:: 
+If an OSD is ``down``, start it:
+
+.. prompt:: bash $
 
        sudo systemctl start ceph-osd@1
 
 
        sudo systemctl start ceph-osd@1
 
@@ -133,18 +139,22 @@ it may indicate that Ceph is migrating the PG (it's remapped), an OSD is
 recovering, or that there is a problem (i.e., Ceph usually echoes a "HEALTH
 WARN" state with a "stuck stale" message in such scenarios).
 
 recovering, or that there is a problem (i.e., Ceph usually echoes a "HEALTH
 WARN" state with a "stuck stale" message in such scenarios).
 
-To retrieve a list of placement groups, execute:: 
+To retrieve a list of placement groups, execute:
+
+.. prompt:: bash $
 
        ceph pg dump
        
 To view which OSDs are within the Acting Set or the Up Set for a given placement
 
        ceph pg dump
        
 To view which OSDs are within the Acting Set or the Up Set for a given placement
-group, execute:: 
+group, execute:
+
+.. prompt:: bash $
 
        ceph pg map {pg-num}
 
 The result should tell you the osdmap epoch (eNNN), the placement group number
 
        ceph pg map {pg-num}
 
 The result should tell you the osdmap epoch (eNNN), the placement group number
-({pg-num}),  the OSDs in the Up Set (up[]), and the OSDs in the acting set
-(acting[])::
+({pg-num}), the OSDs in the Up Set (up[]), and the OSDs in the acting set
+(acting[])::
 
        osdmap eNNN pg {raw-pg-num} ({pg-num}) -> up [0,1,2] acting [0,1,2]
 
 
        osdmap eNNN pg {raw-pg-num} ({pg-num}) -> up [0,1,2] acting [0,1,2]
 
@@ -209,7 +219,9 @@ panic. In many cases, the cluster will recover on its own. In some cases, you
 may need to take action. An important aspect of monitoring placement groups is
 to ensure that when the cluster is up and running that all placement groups are
 ``active``, and preferably in the ``clean`` state. To see the status of all
 may need to take action. An important aspect of monitoring placement groups is
 to ensure that when the cluster is up and running that all placement groups are
 ``active``, and preferably in the ``clean`` state. To see the status of all
-placement groups, execute:: 
+placement groups, execute:
+
+.. prompt:: bash $
 
        ceph pg stat
 
 
        ceph pg stat
 
@@ -247,15 +259,21 @@ few cases:
        1.1f
    
 
        1.1f
    
 
-To retrieve a list of placement groups, execute the following:: 
+To retrieve a list of placement groups, execute the following:
+
+.. prompt:: bash $
 
        ceph pg dump
        
 
        ceph pg dump
        
-You can also format the output in JSON format and save it to a file:: 
+You can also format the output in JSON format and save it to a file:
+
+.. prompt:: bash $
 
        ceph pg dump -o {filename} --format=json
 
 
        ceph pg dump -o {filename} --format=json
 
-To query a particular placement group, execute the following:: 
+To query a particular placement group, execute the following:
+
+.. prompt:: bash $
 
        ceph pg {poolnum}.{pg-id} query
        
 
        ceph pg {poolnum}.{pg-id} query
        
@@ -455,7 +473,9 @@ include:
   host them have not reported to the monitor cluster in a while (configured 
   by ``mon osd report timeout``).
 
   host them have not reported to the monitor cluster in a while (configured 
   by ``mon osd report timeout``).
 
-To identify stuck placement groups, execute the following:: 
+To identify stuck placement groups, execute the following:
+
+.. prompt:: bash $
 
        ceph pg dump_stuck [unclean|inactive|stale|undersized|degraded]
 
 
        ceph pg dump_stuck [unclean|inactive|stale|undersized|degraded]
 
@@ -474,36 +494,47 @@ To store object data in the Ceph Object Store, a Ceph client must:
 The Ceph client retrieves the latest cluster map and the CRUSH algorithm
 calculates how to map the object to a `placement group`_, and then calculates
 how to assign the placement group to an OSD dynamically. To find the object
 The Ceph client retrieves the latest cluster map and the CRUSH algorithm
 calculates how to map the object to a `placement group`_, and then calculates
 how to assign the placement group to an OSD dynamically. To find the object
-location, all you need is the object name and the pool name. For example:: 
+location, all you need is the object name and the pool name. For example:
+
+.. prompt:: bash $
 
        ceph osd map {poolname} {object-name} [namespace]
 
 .. topic:: Exercise: Locate an Object
 
 
        ceph osd map {poolname} {object-name} [namespace]
 
 .. topic:: Exercise: Locate an Object
 
-       As an exercise, lets create an object. Specify an object name, a path to a
-       test file containing some object data and a pool name using the 
-       ``rados put`` command on the command line. For example::
+        As an exercise, let's create an object. Specify an object name, a path
+        to a test file containing some object data and a pool name using the
+        ``rados put`` command on the command line. For example:
+
+        .. prompt:: bash $
    
                rados put {object-name} {file-path} --pool=data         
                rados put test-object-1 testfile.txt --pool=data
    
    
                rados put {object-name} {file-path} --pool=data         
                rados put test-object-1 testfile.txt --pool=data
    
-       To verify that the Ceph Object Store stored the object, execute the following::
+        To verify that the Ceph Object Store stored the object, execute the
+        following:
    
    
-               rados -p data ls
+        .. prompt:: bash $
+
+           rados -p data ls
    
    
-       Now, identify the object location::     
+       Now, identify the object location:
+
+        .. prompt:: bash $
 
 
-               ceph osd map {pool-name} {object-name}
-               ceph osd map data test-object-1
+           ceph osd map {pool-name} {object-name}
+           ceph osd map data test-object-1
    
        Ceph should output the object's location. For example:: 
    
                osdmap e537 pool 'data' (1) object 'test-object-1' -> pg 1.d1743484 (1.4) -> up ([0,1], p0) acting ([0,1], p0)
    
    
        Ceph should output the object's location. For example:: 
    
                osdmap e537 pool 'data' (1) object 'test-object-1' -> pg 1.d1743484 (1.4) -> up ([0,1], p0) acting ([0,1], p0)
    
-       To remove the test object, simply delete it using the ``rados rm`` command.
-       For example:: 
+        To remove the test object, simply delete it using the ``rados rm``
+        command.  For example:
+
+        .. prompt:: bash $
    
    
-               rados rm test-object-1 --pool=data
+           rados rm test-object-1 --pool=data
    
 
 As the cluster evolves, the object location may change dynamically. One benefit
    
 
 As the cluster evolves, the object location may change dynamically. One benefit
index ebfe17159aa7c73a89f3f8c2d9aa9ddfb881d5d6..3e4dd2c9ad8924d47e1152dadccb75cabb9e9c8a 100644 (file)
@@ -13,19 +13,27 @@ Interactive mode
 ----------------
 
 To run the ``ceph`` tool in interactive mode, type ``ceph`` at the command line
 ----------------
 
 To run the ``ceph`` tool in interactive mode, type ``ceph`` at the command line
-with no arguments.  For example:: 
+with no arguments.  For example:
+
+.. prompt:: bash $
 
        ceph
 
        ceph
-       ceph> health
-       ceph> status
-       ceph> quorum_status
-       ceph> mon stat
+
+.. prompt:: ceph>
+    :prompts: ceph>
+
+    health
+    status
+    quorum_status
+    mon stat
 
 Non-default paths
 -----------------
 
 If you specified non-default locations for your configuration or keyring,
 
 Non-default paths
 -----------------
 
 If you specified non-default locations for your configuration or keyring,
-you may specify their locations::
+you may specify their locations:
+
+.. prompt:: bash $
 
    ceph -c /path/to/conf -k /path/to/keyring health
 
 
    ceph -c /path/to/conf -k /path/to/keyring health
 
@@ -35,17 +43,24 @@ Checking a Cluster's Status
 After you start your cluster, and before you start reading and/or
 writing data, check your cluster's status first.
 
 After you start your cluster, and before you start reading and/or
 writing data, check your cluster's status first.
 
-To check a cluster's status, execute the following:: 
+To check a cluster's status, execute the following:
+
+.. prompt:: bash $
 
 
-       ceph status
+   ceph status
        
        
-Or:
+Or:
 
 
-       ceph -s
+.. prompt:: bash $
 
 
-In interactive mode, type ``status`` and press **Enter**. ::
+   ceph -s
 
 
-       ceph> status
+In interactive mode, type ``status`` and press **Enter**:
+
+.. prompt:: ceph>
+    :prompts: ceph>
+   
+    status
 
 Ceph will print the cluster status. For example, a tiny Ceph demonstration
 cluster with one of each service may print the following:
 
 Ceph will print the cluster status. For example, a tiny Ceph demonstration
 cluster with one of each service may print the following:
@@ -88,14 +103,14 @@ a *cluster log* that records high level events about the whole system.
 This is logged to disk on monitor servers (as ``/var/log/ceph/ceph.log`` by
 default), but can also be monitored via the command line.
 
 This is logged to disk on monitor servers (as ``/var/log/ceph/ceph.log`` by
 default), but can also be monitored via the command line.
 
-To follow the cluster log, use the following command
+To follow the cluster log, use the following command:
 
 
-:: 
+.. prompt:: bash $
 
 
-       ceph -w
+   ceph -w
 
 Ceph will print the status of the system, followed by each log message as it
 
 Ceph will print the status of the system, followed by each log message as it
-is emitted.  For example:
+is emitted. For example:
 
 :: 
 
 
 :: 
 
@@ -190,9 +205,12 @@ sent to a mgr, but it can be limited to a particular OSD's interactions by issui
 
 The following command will show all gathered network performance data by specifying a threshold of 0 and sending to the mgr.
 
 
 The following command will show all gathered network performance data by specifying a threshold of 0 and sending to the mgr.
 
+.. prompt:: bash $
+
+   ceph daemon /var/run/ceph/ceph-mgr.x.asok dump_osd_network 0
+
 ::
 
 ::
 
-    $ ceph daemon /var/run/ceph/ceph-mgr.x.asok dump_osd_network 0
     {
         "threshold": 0,
         "entries": [
     {
         "threshold": 0,
         "entries": [
@@ -274,50 +292,73 @@ Muting health checks
 
 Health checks can be muted so that they do not affect the overall
 reported status of the cluster.  Alerts are specified using the health
 
 Health checks can be muted so that they do not affect the overall
 reported status of the cluster.  Alerts are specified using the health
-check code (see :ref:`health-checks`)::
+check code (see :ref:`health-checks`):
+
+.. prompt:: bash $
 
 
-  ceph health mute <code>
+   ceph health mute <code>
 
 For example, if there is a health warning, muting it will make the
 cluster report an overall status of ``HEALTH_OK``.  For example, to
 
 For example, if there is a health warning, muting it will make the
 cluster report an overall status of ``HEALTH_OK``.  For example, to
-mute an ``OSD_DOWN`` alert,::
+mute an ``OSD_DOWN`` alert,:
+
+.. prompt:: bash $
 
 
-  ceph health mute OSD_DOWN
+   ceph health mute OSD_DOWN
 
 Mutes are reported as part of the short and long form of the ``ceph health`` command.
 
 Mutes are reported as part of the short and long form of the ``ceph health`` command.
-For example, in the above scenario, the cluster would report::
+For example, in the above scenario, the cluster would report:
 
 
-  $ ceph health
-  HEALTH_OK (muted: OSD_DOWN)
-  $ ceph health detail
-  HEALTH_OK (muted: OSD_DOWN)
-  (MUTED) OSD_DOWN 1 osds down
-      osd.1 is down
+.. prompt:: bash $
 
 
-A mute can be explicitly removed with::
+   ceph health
+
+::
 
 
-  ceph health unmute <code>
+   HEALTH_OK (muted: OSD_DOWN)
+
+.. prompt:: bash $
+
+   ceph health detail
+
+::
 
 
-For example,::
+   HEALTH_OK (muted: OSD_DOWN)
+   (MUTED) OSD_DOWN 1 osds down
+       osd.1 is down
 
 
-  ceph health unmute OSD_DOWN
+A mute can be explicitly removed with:
+
+.. prompt:: bash $
+
+   ceph health unmute <code>
+
+For example:
+
+.. prompt:: bash $
+
+   ceph health unmute OSD_DOWN
 
 A health check mute may optionally have a TTL (time to live)
 associated with it, such that the mute will automatically expire
 after the specified period of time has elapsed.  The TTL is specified as an optional
 
 A health check mute may optionally have a TTL (time to live)
 associated with it, such that the mute will automatically expire
 after the specified period of time has elapsed.  The TTL is specified as an optional
-duration argument, e.g.::
+duration argument, e.g.:
 
 
-  ceph health mute OSD_DOWN 4h    # mute for 4 hours
-  ceph health mute MON_DOWN 15m   # mute for 15  minutes
+.. prompt:: bash $
+
+   ceph health mute OSD_DOWN 4h    # mute for 4 hours
+   ceph health mute MON_DOWN 15m   # mute for 15  minutes
 
 Normally, if a muted health alert is resolved (e.g., in the example
 above, the OSD comes back up), the mute goes away.  If the alert comes
 back later, it will be reported in the usual way.
 
 It is possible to make a mute "sticky" such that the mute will remain even if the
 
 Normally, if a muted health alert is resolved (e.g., in the example
 above, the OSD comes back up), the mute goes away.  If the alert comes
 back later, it will be reported in the usual way.
 
 It is possible to make a mute "sticky" such that the mute will remain even if the
-alert clears.  For example,::
+alert clears.  For example:
+
+.. prompt:: bash $
 
 
-  ceph health mute OSD_DOWN 1h --sticky   # ignore any/all down OSDs for next hour
+   ceph health mute OSD_DOWN 1h --sticky   # ignore any/all down OSDs for next hour
 
 Most health mutes also disappear if the extent of an alert gets worse.  For example,
 if there is one OSD down, and the alert is muted, the mute will disappear if one
 
 Most health mutes also disappear if the extent of an alert gets worse.  For example,
 if there is one OSD down, and the alert is muted, the mute will disappear if one
@@ -341,9 +382,11 @@ Checking a Cluster's Usage Stats
 
 To check a cluster's data usage and data distribution among pools, you can
 use the ``df`` option. It is similar to Linux ``df``. Execute 
 
 To check a cluster's data usage and data distribution among pools, you can
 use the ``df`` option. It is similar to Linux ``df``. Execute 
-the following::
+the following:
 
 
-       ceph df
+.. prompt:: bash $
+
+   ceph df
 
 The output of ``ceph df`` looks like this::
 
 
 The output of ``ceph df`` looks like this::
 
@@ -476,17 +519,23 @@ quorum status after you start the cluster and before reading and/or writing data
 quorum must be present when multiple monitors are running. You should also check
 monitor status periodically to ensure that they are running.
 
 quorum must be present when multiple monitors are running. You should also check
 monitor status periodically to ensure that they are running.
 
-To see display the monitor map, execute the following::
+To see display the monitor map, execute the following:
+
+.. prompt:: bash $
 
 
-       ceph mon stat
+   ceph mon stat
        
        
-Or:
+Or:
 
 
-       ceph mon dump
+.. prompt:: bash $
+
+   ceph mon dump
        
        
-To check the quorum status for the monitor cluster, execute the following:
+To check the quorum status for the monitor cluster, execute the following:
        
        
-       ceph quorum_status
+.. prompt:: bash $
+
+   ceph quorum_status
 
 Ceph will return the quorum status. For example, a Ceph  cluster consisting of
 three monitors may return the following:
 
 Ceph will return the quorum status. For example, a Ceph  cluster consisting of
 three monitors may return the following:
@@ -535,13 +584,17 @@ Checking MDS Status
 
 Metadata servers provide metadata services for  CephFS. Metadata servers have
 two sets of states: ``up | down`` and ``active | inactive``. To ensure your
 
 Metadata servers provide metadata services for  CephFS. Metadata servers have
 two sets of states: ``up | down`` and ``active | inactive``. To ensure your
-metadata servers are ``up`` and ``active``,  execute the following:
+metadata servers are ``up`` and ``active``,  execute the following:
 
 
-       ceph mds stat
+.. prompt:: bash $
+
+   ceph mds stat
        
        
-To display details of the metadata cluster, execute the following:: 
+To display details of the metadata cluster, execute the following:
+
+.. prompt:: bash $
 
 
-       ceph fs dump
+   ceph fs dump
 
 
 Checking Placement Group States
 
 
 Checking Placement Group States
@@ -561,19 +614,25 @@ Using the Admin Socket
 The Ceph admin socket allows you to query a daemon via a socket interface. 
 By default, Ceph sockets reside under ``/var/run/ceph``. To access a daemon
 via the admin socket, login to the host running the daemon and use the 
 The Ceph admin socket allows you to query a daemon via a socket interface. 
 By default, Ceph sockets reside under ``/var/run/ceph``. To access a daemon
 via the admin socket, login to the host running the daemon and use the 
-following command:: 
+following command:
+
+.. prompt:: bash $
+
+   ceph daemon {daemon-name}
+   ceph daemon {path-to-socket-file}
+
+For example, the following are equivalent:
 
 
-       ceph daemon {daemon-name}
-       ceph daemon {path-to-socket-file}
+.. prompt:: bash $
 
 
-For example, the following are equivalent::
+   ceph daemon osd.0 foo
+   ceph daemon /var/run/ceph/ceph-osd.0.asok foo
 
 
-    ceph daemon osd.0 foo
-    ceph daemon /var/run/ceph/ceph-osd.0.asok foo
+To view the available admin socket commands, execute the following command:
 
 
-To view the available admin socket commands, execute the following command:: 
+.. prompt:: bash $
 
 
-       ceph daemon {daemon-name} help
+   ceph daemon {daemon-name} help
 
 The admin socket command enables you to show and set your configuration at
 runtime. See `Viewing a Configuration at Runtime`_ for details.
 
 The admin socket command enables you to show and set your configuration at
 runtime. See `Viewing a Configuration at Runtime`_ for details.
index 5dcfe63ad055c1d8ee5a2f8e51b9272c010515e4..e318c1d503a1a8ee68b5476a5d3f3ae2756ceee1 100644 (file)
@@ -14,52 +14,68 @@ Commands for Diagnosing Placement-group Problems
 ================================================
 The commands in this section provide various ways of diagnosing broken placement groups.
 
 ================================================
 The commands in this section provide various ways of diagnosing broken placement groups.
 
-The following command provides a high-level (low detail) overview of the health of the ceph cluster::
+The following command provides a high-level (low detail) overview of the health of the ceph cluster:
 
 
-   # ceph health detail
+.. prompt:: bash #
 
 
-The following command provides more detail on the status of the placement groups::
+   ceph health detail
 
 
-   # ceph pg dump --format=json-pretty
+The following command provides more detail on the status of the placement groups:
 
 
-The following command lists inconsistent placement groups::
+.. prompt:: bash #
 
 
-   # rados list-inconsistent-pg {pool}
+   ceph pg dump --format=json-pretty
 
 
-The following command lists inconsistent rados objects::
+The following command lists inconsistent placement groups:
 
 
-   # rados list-inconsistent-obj {pgid}
+.. prompt:: bash #
 
 
-The following command lists inconsistent snapsets in the given placement group::
+   rados list-inconsistent-pg {pool}
 
 
-   # rados list-inconsistent-snapset {pgid}
+The following command lists inconsistent rados objects:
+
+.. prompt:: bash #
+
+   rados list-inconsistent-obj {pgid}
+
+The following command lists inconsistent snapsets in the given placement group:
+
+.. prompt:: bash #
+
+   rados list-inconsistent-snapset {pgid}
 
 
 Commands for Repairing Placement Groups
 =======================================
 
 
 Commands for Repairing Placement Groups
 =======================================
-The form of the command to repair a broken placement group is::
+The form of the command to repair a broken placement group is:
+
+.. prompt:: bash #
 
 
-   ceph pg repair {pgid}
+   ceph pg repair {pgid}
 
 Where ``{pgid}`` is the id of the affected placement group.
 
 
 Where ``{pgid}`` is the id of the affected placement group.
 
-For example::
+For example:
+
+.. prompt:: bash #
 
 
-   ceph pg repair 1.4
+   ceph pg repair 1.4
 
 More Information on Placement Group Repair
 ==========================================
 Ceph stores and updates the checksums of objects stored in the cluster. When a scrub is performed on a placement group, the OSD attempts to choose an authoritative copy from among its replicas. Among all of the possible cases, only one case is consistent. After a deep scrub, Ceph calculates the checksum of an object read from the disk and compares it to the checksum previously recorded. If the current checksum and the previously recorded checksums do not match, that is an inconsistency. In the case of replicated pools, any mismatch between the checksum of any replica of an object and the checksum of the authoritative copy means that there is an inconsistency.
 
 
 More Information on Placement Group Repair
 ==========================================
 Ceph stores and updates the checksums of objects stored in the cluster. When a scrub is performed on a placement group, the OSD attempts to choose an authoritative copy from among its replicas. Among all of the possible cases, only one case is consistent. After a deep scrub, Ceph calculates the checksum of an object read from the disk and compares it to the checksum previously recorded. If the current checksum and the previously recorded checksums do not match, that is an inconsistency. In the case of replicated pools, any mismatch between the checksum of any replica of an object and the checksum of the authoritative copy means that there is an inconsistency.
 
-The "pg repair" command attempts to fix inconsistencies of various kinds. If "pg repair" finds an inconsistent placement group, it attempts to overwrite the digest of the inconsistent copy with the digest of the authoritative copy. If "pg repair" finds an inconsistent replicated pool, it marks the inconsistent copy as missing. Recovery, in the case of replicated pools, is beyond the scope of "pg repair".
+The ``pg repair`` command attempts to fix inconsistencies of various kinds. If ``pg repair`` finds an inconsistent placement group, it attempts to overwrite the digest of the inconsistent copy with the digest of the authoritative copy. If ``pg repair`` finds an inconsistent replicated pool, it marks the inconsistent copy as missing. Recovery, in the case of replicated pools, is beyond the scope of ``pg repair``.
 
 
-For erasure coded and bluestore pools, Ceph will automatically repair if osd_scrub_auto_repair (configuration default "false") is set to true and at most osd_scrub_auto_repair_num_errors (configuration default 5) errors are found.
+For erasure coded and BlueStore pools, Ceph will automatically repair
+if ``osd_scrub_auto_repair`` (default ``false`) is set to ``true`` and
+at most ``osd_scrub_auto_repair_num_errors`` (default ``5``) errors are found.
 
 
-"pg repair" will not solve every problem. Ceph does not automatically repair placement groups when inconsistencies are found in them.
+``pg repair`` will not solve every problem. Ceph does not automatically repair placement groups when inconsistencies are found in them.
 
 
-The checksum of an object or an omap is not always available. Checksums are calculated incrementally. If a replicated object is updated non-sequentially, the write operation involved in the update changes the object and invalidates its checksum. The whole object is not read while recalculating the checksum. "ceph pg repair" is able to repair things even when checksums are not available to it, as in the case of filestore. When replicated filestore pools are in question, users might prefer manual repair to "ceph pg repair". 
+The checksum of a RADOS object or an omap is not always available. Checksums are calculated incrementally. If a replicated object is updated non-sequentially, the write operation involved in the update changes the object and invalidates its checksum. The whole object is not read while recalculating the checksum. "ceph pg repair" is able to repair things even when checksums are not available to it, as in the case of Filestore. When replicated Filestore pools are in play, users might prefer manual repair over ``ceph pg repair``.
 
 
-The material in this paragraph is relevant for filestore, and bluestore has its own internal checksums. The matched-record checksum and the calculated checksum cannot prove that the authoritative copy is in fact authoritative. In the case that there is no checksum available, "pg repair" favors the data on the primary. this might or might not be the uncorrupted replica. This is why human intervention is necessary when an inconsistency is discovered. Human intervention sometimes means using the "ceph-objectstore-tool".
+The material in this paragraph is relevant for Filestore, and BlueStore has its own internal checksums. The matched-record checksum and the calculated checksum cannot prove that the authoritative copy is in fact authoritative. In the case that there is no checksum available, ``pg repair`` favors the data on the primary. this might or might not be the uncorrupted replica. This is why human intervention is necessary when an inconsistency is discovered. Human intervention sometimes means using the ``eph-objectstore-tool``.
 
 External Links
 ==============
 
 External Links
 ==============
index c471ff8bcd94e726ce61c4b8d0b01ec0154bf03d..e106a29759f745a9970eded96176c8d52dc02c6a 100644 (file)
@@ -20,40 +20,54 @@ Each pool has a ``pg_autoscale_mode`` property that can be set to ``off``, ``on`
 * ``on``: Enable automated adjustments of the PG count for the given pool.
 * ``warn``: Raise health alerts when the PG count should be adjusted
 
 * ``on``: Enable automated adjustments of the PG count for the given pool.
 * ``warn``: Raise health alerts when the PG count should be adjusted
 
-To set the autoscaling mode for an existing pool::
+To set the autoscaling mode for an existing pool:
 
 
-  ceph osd pool set <pool-name> pg_autoscale_mode <mode>
+.. prompt:: bash #
 
 
-For example to enable autoscaling on pool ``foo``::
+   ceph osd pool set <pool-name> pg_autoscale_mode <mode>
 
 
-  ceph osd pool set foo pg_autoscale_mode on
+For example to enable autoscaling on pool ``foo``:
+
+.. prompt:: bash #
+
+   ceph osd pool set foo pg_autoscale_mode on
 
 You can also configure the default ``pg_autoscale_mode`` that is
 
 You can also configure the default ``pg_autoscale_mode`` that is
-set on any pools that are subsequently created::
+set on any pools that are subsequently created:
 
 
-  ceph config set global osd_pool_default_pg_autoscale_mode <mode>
+.. prompt:: bash #
+
+   ceph config set global osd_pool_default_pg_autoscale_mode <mode>
 
 You can disable or enable the autoscaler for all pools with
 the ``noautoscale`` flag. By default this flag is set to  be ``off``,
 
 You can disable or enable the autoscaler for all pools with
 the ``noautoscale`` flag. By default this flag is set to  be ``off``,
-but you can turn it ``on`` by using the command::
+but you can turn it ``on`` by using the command:
+
+.. prompt:: bash $
 
 
-  ceph osd pool set noautoscale
+   ceph osd pool set noautoscale
 
 
-You can turn it ``off`` using the command::
+You can turn it ``off`` using the command:
 
 
-  ceph osd pool unset noautoscale
+.. prompt:: bash #
 
 
-To ``get`` the value of the flag use the command::
+   ceph osd pool unset noautoscale
 
 
-  ceph osd pool get noautoscale
+To ``get`` the value of the flag use the command:
+
+.. prompt:: bash #
+
+   ceph osd pool get noautoscale
 
 Viewing PG scaling recommendations
 ----------------------------------
 
 You can view each pool, its relative utilization, and any suggested changes to
 
 Viewing PG scaling recommendations
 ----------------------------------
 
 You can view each pool, its relative utilization, and any suggested changes to
-the PG count with this command::
+the PG count with this command:
 
 
-  ceph osd pool autoscale-status
+.. prompt:: bash #
+
+   ceph osd pool autoscale-status
 
 Output will be something like::
 
 
 Output will be something like::
 
@@ -103,7 +117,9 @@ change is in progress).  **NEW PG_NUM**, if present, is what the
 system believes the pool's ``pg_num`` should be changed to.  It is
 always a power of 2, and will only be present if the "ideal" value
 varies from the current value by more than a factor of 3 by default.
 system believes the pool's ``pg_num`` should be changed to.  It is
 always a power of 2, and will only be present if the "ideal" value
 varies from the current value by more than a factor of 3 by default.
-This factor can be be adjusted with::
+This factor can be be adjusted with:
+
+.. prompt:: bash #
 
   ceph osd pool set threshold 2.0
 
 
   ceph osd pool set threshold 2.0
 
@@ -131,9 +147,11 @@ than a factor of 3 off from what it thinks it should be.
 
 The target number of PGs per OSD is based on the
 ``mon_target_pg_per_osd`` configurable (default: 100), which can be
 
 The target number of PGs per OSD is based on the
 ``mon_target_pg_per_osd`` configurable (default: 100), which can be
-adjusted with::
+adjusted with:
 
 
-  ceph config set global mon_target_pg_per_osd 100
+.. prompt:: bash #
+
+   ceph config set global mon_target_pg_per_osd 100
 
 The autoscaler analyzes pools and adjusts on a per-subtree basis.
 Because each pool may map to a different CRUSH rule, and each rule may
 
 The autoscaler analyzes pools and adjusts on a per-subtree basis.
 Because each pool may map to a different CRUSH rule, and each rule may
@@ -158,17 +176,23 @@ scales down when the usage ratio across the pool is not even.
 However, if the pool doesn't have the `bulk` flag, the pool will
 start out with minimal PGs and only when there is more usage in the pool.
 
 However, if the pool doesn't have the `bulk` flag, the pool will
 start out with minimal PGs and only when there is more usage in the pool.
 
-To create pool with `bulk` flag::
+To create pool with `bulk` flag:
+
+.. prompt:: bash #
+
+   ceph osd pool create <pool-name> --bulk
+
+To set/unset `bulk` flag of existing pool:
 
 
-  ceph osd pool create <pool-name> --bulk
+.. prompt:: bash #
 
 
-To set/unset `bulk` flag of existing pool::
+   ceph osd pool set <pool-name> bulk <true/false/1/0>
 
 
-  ceph osd pool set <pool-name> bulk <true/false/1/0>
+To get `bulk` flag of existing pool:
 
 
-To get `bulk` flag of existing pool::
+.. prompt:: bash #
 
 
-  ceph osd pool get <pool-name> bulk
+   ceph osd pool get <pool-name> bulk
 
 .. _specifying_pool_target_size:
 
 
 .. _specifying_pool_target_size:
 
@@ -189,14 +213,18 @@ The *target size* of a pool can be specified in two ways: either in
 terms of the absolute size of the pool (i.e., bytes), or as a weight
 relative to other pools with a ``target_size_ratio`` set.
 
 terms of the absolute size of the pool (i.e., bytes), or as a weight
 relative to other pools with a ``target_size_ratio`` set.
 
-For example::
+For example:
 
 
-  ceph osd pool set mypool target_size_bytes 100T
+.. prompt:: bash #
+
+   ceph osd pool set mypool target_size_bytes 100T
 
 will tell the system that `mypool` is expected to consume 100 TiB of
 
 will tell the system that `mypool` is expected to consume 100 TiB of
-space.  Alternatively::
+space.  Alternatively:
+
+.. prompt:: bash # 
 
 
-  ceph osd pool set mypool target_size_ratio 1.0
+   ceph osd pool set mypool target_size_ratio 1.0
 
 will tell the system that `mypool` is expected to consume 1.0 relative
 to the other pools with ``target_size_ratio`` set. If `mypool` is the
 
 will tell the system that `mypool` is expected to consume 1.0 relative
 to the other pools with ``target_size_ratio`` set. If `mypool` is the
@@ -223,10 +251,12 @@ parallelism client will see when doing IO, even when a pool is mostly
 empty.  Setting the lower bound prevents Ceph from reducing (or
 recommending you reduce) the PG number below the configured number.
 
 empty.  Setting the lower bound prevents Ceph from reducing (or
 recommending you reduce) the PG number below the configured number.
 
-You can set the minimum or maximum number of PGs for a pool with::
+You can set the minimum or maximum number of PGs for a pool with:
 
 
-  ceph osd pool set <pool-name> pg_num_min <num>
-  ceph osd pool set <pool-name> pg_num_max <num>
+.. prompt:: bash #
+
+   ceph osd pool set <pool-name> pg_num_min <num>
+   ceph osd pool set <pool-name> pg_num_max <num>
 
 You can also specify the minimum or maximum PG count at pool creation
 time with the optional ``--pg-num-min <num>`` or ``--pg-num-max
 
 You can also specify the minimum or maximum PG count at pool creation
 time with the optional ``--pg-num-min <num>`` or ``--pg-num-max
@@ -237,9 +267,11 @@ time with the optional ``--pg-num-min <num>`` or ``--pg-num-max
 A preselection of pg_num
 ========================
 
 A preselection of pg_num
 ========================
 
-When creating a new pool with::
+When creating a new pool with:
+
+.. prompt:: bash #
 
 
-        ceph osd pool create {pool-name} [pg_num]
+   ceph osd pool create {pool-name} [pg_num]
 
 it is optional to choose the value of ``pg_num``.  If you do not
 specify ``pg_num``, the cluster can (by default) automatically tune it
 
 it is optional to choose the value of ``pg_num``.  If you do not
 specify ``pg_num``, the cluster can (by default) automatically tune it
@@ -248,7 +280,7 @@ for you based on how much data is stored in the pool (see above, :ref:`pg-autosc
 Alternatively, ``pg_num`` can be explicitly provided.  However,
 whether you specify a ``pg_num`` value or not does not affect whether
 the value is automatically tuned by the cluster after the fact.  To
 Alternatively, ``pg_num`` can be explicitly provided.  However,
 whether you specify a ``pg_num`` value or not does not affect whether
 the value is automatically tuned by the cluster after the fact.  To
-enable or disable auto-tuning::
+enable or disable auto-tuning:
 
   ceph osd pool set {pool-name} pg_autoscale_mode (on|off|warn)
 
 
   ceph osd pool set {pool-name} pg_autoscale_mode (on|off|warn)
 
@@ -540,9 +572,11 @@ Set the Number of Placement Groups
 
 To set the number of placement groups in a pool, you must specify the
 number of placement groups at the time you create the pool.
 
 To set the number of placement groups in a pool, you must specify the
 number of placement groups at the time you create the pool.
-See `Create a Pool`_ for details.  Even after a pool is created you can also change the number of placement groups with::
+See `Create a Pool`_ for details.  Even after a pool is created you can also change the number of placement groups with:
 
 
-        ceph osd pool set {pool-name} pg_num {pg_num}
+.. prompt:: bash # 
+
+   ceph osd pool set {pool-name} pg_num {pg_num}
 
 After you increase the number of placement groups, you must also
 increase the number of placement groups for placement (``pgp_num``)
 
 After you increase the number of placement groups, you must also
 increase the number of placement groups for placement (``pgp_num``)
@@ -552,9 +586,11 @@ algorithm. Increasing ``pg_num`` splits the placement groups but data
 will not be migrated to the newer placement groups until placement
 groups for placement, ie. ``pgp_num`` is increased. The ``pgp_num``
 should be equal to the ``pg_num``.  To increase the number of
 will not be migrated to the newer placement groups until placement
 groups for placement, ie. ``pgp_num`` is increased. The ``pgp_num``
 should be equal to the ``pg_num``.  To increase the number of
-placement groups for placement, execute the following::
+placement groups for placement, execute the following:
+
+.. prompt:: bash #
 
 
-        ceph osd pool set {pool-name} pgp_num {pgp_num}
+   ceph osd pool set {pool-name} pgp_num {pgp_num}
 
 When decreasing the number of PGs, ``pgp_num`` is adjusted
 automatically for you.
 
 When decreasing the number of PGs, ``pgp_num`` is adjusted
 automatically for you.
@@ -562,17 +598,21 @@ automatically for you.
 Get the Number of Placement Groups
 ==================================
 
 Get the Number of Placement Groups
 ==================================
 
-To get the number of placement groups in a pool, execute the following::
+To get the number of placement groups in a pool, execute the following:
 
 
-        ceph osd pool get {pool-name} pg_num
+.. prompt:: bash #
+   
+   ceph osd pool get {pool-name} pg_num
 
 
 Get a Cluster's PG Statistics
 =============================
 
 
 
 Get a Cluster's PG Statistics
 =============================
 
-To get the statistics for the placement groups in your cluster, execute the following::
+To get the statistics for the placement groups in your cluster, execute the following:
 
 
-        ceph pg dump [--format {format}]
+.. prompt:: bash #
+
+   ceph pg dump [--format {format}]
 
 Valid formats are ``plain`` (default) and ``json``.
 
 
 Valid formats are ``plain`` (default) and ``json``.
 
@@ -581,9 +621,11 @@ Get Statistics for Stuck PGs
 ============================
 
 To get the statistics for all placement groups stuck in a specified state,
 ============================
 
 To get the statistics for all placement groups stuck in a specified state,
-execute the following::
+execute the following:
+
+.. prompt:: bash #
 
 
-        ceph pg dump_stuck inactive|unclean|stale|undersized|degraded [--format <format>] [-t|--threshold <seconds>]
+   ceph pg dump_stuck inactive|unclean|stale|undersized|degraded [--format <format>] [-t|--threshold <seconds>]
 
 **Inactive** Placement groups cannot process reads or writes because they are waiting for an OSD
 with the most up-to-date data to come up and in.
 
 **Inactive** Placement groups cannot process reads or writes because they are waiting for an OSD
 with the most up-to-date data to come up and in.
@@ -602,33 +644,43 @@ of seconds the placement group is stuck before including it in the returned stat
 Get a PG Map
 ============
 
 Get a PG Map
 ============
 
-To get the placement group map for a particular placement group, execute the following::
+To get the placement group map for a particular placement group, execute the following:
 
 
-        ceph pg map {pg-id}
+.. prompt:: bash #
 
 
-For example::
+   ceph pg map {pg-id}
 
 
-        ceph pg map 1.6c
+For example: 
 
 
-Ceph will return the placement group map, the placement group, and the OSD status::
+.. prompt:: bash #
 
 
-        osdmap e13 pg 1.6c (1.6c) -> up [1,0] acting [1,0]
+   ceph pg map 1.6c
+
+Ceph will return the placement group map, the placement group, and the OSD status:
+
+.. prompt:: bash #
+
+   osdmap e13 pg 1.6c (1.6c) -> up [1,0] acting [1,0]
 
 
 Get a PGs Statistics
 ====================
 
 
 
 Get a PGs Statistics
 ====================
 
-To retrieve statistics for a particular placement group, execute the following::
+To retrieve statistics for a particular placement group, execute the following:
+
+.. prompt:: bash #
 
 
-        ceph pg {pg-id} query
+   ceph pg {pg-id} query
 
 
 Scrub a Placement Group
 =======================
 
 
 
 Scrub a Placement Group
 =======================
 
-To scrub a placement group, execute the following::
+To scrub a placement group, execute the following:
 
 
-        ceph pg scrub {pg-id}
+.. prompt:: bash #
+
+   ceph pg scrub {pg-id}
 
 Ceph checks the primary and any replica nodes, generates a catalog of all objects
 in the placement group and compares them to ensure that no objects are missing
 
 Ceph checks the primary and any replica nodes, generates a catalog of all objects
 in the placement group and compares them to ensure that no objects are missing
@@ -636,9 +688,11 @@ or mismatched, and their contents are consistent.  Assuming the replicas all
 match, a final semantic sweep ensures that all of the snapshot-related object
 metadata is consistent. Errors are reported via logs.
 
 match, a final semantic sweep ensures that all of the snapshot-related object
 metadata is consistent. Errors are reported via logs.
 
-To scrub all placement groups from a specific pool, execute the following::
+To scrub all placement groups from a specific pool, execute the following:
+
+.. prompt:: bash #
 
 
-        ceph osd pool scrub {pool-name}
+   ceph osd pool scrub {pool-name}
 
 Prioritize backfill/recovery of a Placement Group(s)
 ====================================================
 
 Prioritize backfill/recovery of a Placement Group(s)
 ====================================================
@@ -650,19 +704,23 @@ machines and other PGs may be used by inactive machines/less relevant data).
 In that case, you may want to prioritize recovery of those groups so
 performance and/or availability of data stored on those groups is restored
 earlier. To do this (mark particular placement group(s) as prioritized during
 In that case, you may want to prioritize recovery of those groups so
 performance and/or availability of data stored on those groups is restored
 earlier. To do this (mark particular placement group(s) as prioritized during
-backfill or recovery), execute the following::
+backfill or recovery), execute the following:
 
 
-        ceph pg force-recovery {pg-id} [{pg-id #2}] [{pg-id #3} ...]
-        ceph pg force-backfill {pg-id} [{pg-id #2}] [{pg-id #3} ...]
+.. prompt:: bash #
+
+   ceph pg force-recovery {pg-id} [{pg-id #2}] [{pg-id #3} ...]
+   ceph pg force-backfill {pg-id} [{pg-id #2}] [{pg-id #3} ...]
 
 This will cause Ceph to perform recovery or backfill on specified placement
 groups first, before other placement groups. This does not interrupt currently
 ongoing backfills or recovery, but causes specified PGs to be processed
 as soon as possible. If you change your mind or prioritize wrong groups,
 
 This will cause Ceph to perform recovery or backfill on specified placement
 groups first, before other placement groups. This does not interrupt currently
 ongoing backfills or recovery, but causes specified PGs to be processed
 as soon as possible. If you change your mind or prioritize wrong groups,
-use::
+use:
+
+.. prompt:: bash #
 
 
-        ceph pg cancel-force-recovery {pg-id} [{pg-id #2}] [{pg-id #3} ...]
-        ceph pg cancel-force-backfill {pg-id} [{pg-id #2}] [{pg-id #3} ...]
+   ceph pg cancel-force-recovery {pg-id} [{pg-id #2}] [{pg-id #3} ...]
+   ceph pg cancel-force-backfill {pg-id} [{pg-id #2}] [{pg-id #3} ...]
 
 This will remove "force" flag from those PGs and they will be processed
 in default order. Again, this doesn't affect currently processed placement
 
 This will remove "force" flag from those PGs and they will be processed
 in default order. Again, this doesn't affect currently processed placement
@@ -672,15 +730,19 @@ The "force" flag is cleared automatically after recovery or backfill of group
 is done.
 
 Similarly, you may use the following commands to force Ceph to perform recovery
 is done.
 
 Similarly, you may use the following commands to force Ceph to perform recovery
-or backfill on all placement groups from a specified pool first::
+or backfill on all placement groups from a specified pool first:
 
 
-        ceph osd pool force-recovery {pool-name}
-        ceph osd pool force-backfill {pool-name}
+.. prompt:: bash #
 
 
-or::
+   ceph osd pool force-recovery {pool-name}
+   ceph osd pool force-backfill {pool-name}
 
 
-        ceph osd pool cancel-force-recovery {pool-name}
-        ceph osd pool cancel-force-backfill {pool-name}
+or:
+
+.. prompt:: bash #
+
+   ceph osd pool cancel-force-recovery {pool-name}
+   ceph osd pool cancel-force-backfill {pool-name}
 
 to restore to the default recovery or backfill priority if you change your mind.
 
 
 to restore to the default recovery or backfill priority if you change your mind.
 
@@ -689,9 +751,11 @@ priority computations, so use them with caution!
 Especially, if you have multiple pools that are currently sharing the same
 underlying OSDs, and some particular pools hold data more important than others,
 we recommend you use the following command to re-arrange all pools's
 Especially, if you have multiple pools that are currently sharing the same
 underlying OSDs, and some particular pools hold data more important than others,
 we recommend you use the following command to re-arrange all pools's
-recovery/backfill priority in a better order::
+recovery/backfill priority in a better order:
 
 
-        ceph osd pool set {pool-name} recovery_priority {value}
+.. prompt:: bash #
+
+   ceph osd pool set {pool-name} recovery_priority {value}
 
 For example, if you have 10 pools you could make the most important one priority 10,
 next 9, etc. Or you could leave most pools alone and have say 3 important pools
 
 For example, if you have 10 pools you could make the most important one priority 10,
 next 9, etc. Or you could leave most pools alone and have say 3 important pools
@@ -712,9 +776,11 @@ are recovered.
 
 Currently the only supported option is "revert", which will either roll back to
 a previous version of the object or (if it was a new object) forget about it
 
 Currently the only supported option is "revert", which will either roll back to
 a previous version of the object or (if it was a new object) forget about it
-entirely. To mark the "unfound" objects as "lost", execute the following::
+entirely. To mark the "unfound" objects as "lost", execute the following:
+
+.. prompt:: bash #
 
 
-        ceph pg {pg-id} mark_unfound_lost revert|delete
+   ceph pg {pg-id} mark_unfound_lost revert|delete
 
 .. important:: Use this feature with caution, because it may confuse
    applications that expect the object(s) to exist.
 
 .. important:: Use this feature with caution, because it may confuse
    applications that expect the object(s) to exist.
index 3b6d227aad741f4928a5bb832c009de9b589bbf4..12f1c1b1bb13c4233b88da0defb1d6a344c2e761 100644 (file)
@@ -1,38 +1,38 @@
+.. _rados_pools:
+
 =======
  Pools
 =======
 =======
  Pools
 =======
-Pools are logical partitions for storing objects.
-
-When you first deploy a cluster without creating a pool, Ceph uses the default
-pools for storing data. A pool provides you with:
-
-- **Resilience**: You can set how many OSD are allowed to fail without losing data.
-  For replicated pools, it is the desired number of copies/replicas of an object.
-  A typical configuration stores an object and two additional copies
-  (i.e., ``size = 3``), but you can configure the number of copies/replicas at
-  pool granularity.
-  For `erasure coded pools <../erasure-code>`_, it is the number of coding chunks
-  (i.e. ``m=2`` in the **erasure code profile**)
-
-- **Placement Groups**: You can set the number of placement groups for the pool.
-  A typical configuration targets approximately 100 placement groups per OSD to
-  provide optimal balancing without using up too many computing resources. When
-  setting up multiple pools, be careful to set a reasonable number of
-  placement groups for each pool and for the cluster as a whole.  Note that each PG
-  belongs to a specific pool, so when multiple pools use the same OSDs, you must
-  take care that the **sum** of PG replicas per OSD is in the desired PG per OSD
-  target range.
-
-- **CRUSH Rules**: When you store data in a pool, placement of the object
-  and its replicas (or chunks for erasure coded pools) in your cluster is governed
-  by CRUSH rules. You can create a custom CRUSH rule for your pool if the default
-  rule is not appropriate for your use case.
-
-- **Snapshots**: When you create snapshots with ``ceph osd pool mksnap``,
-  you effectively take a snapshot of a particular pool.
-
-To organize data into pools, you can list, create, and remove pools.
-You can also view the utilization statistics for each pool.
+Pools are logical partitions that are used to store objects.
+
+Pools provide:
+
+- **Resilience**: It is possible to set the number of OSDs that are allowed to
+  fail without any data being lost. If your cluster uses replicated pools, the
+  number of OSDs that can fail without data loss is the number of replicas.
+  For example: a typical configuration stores an object and two additional
+  copies (that is: ``size = 3``), but you can configure the number of replicas
+  on a per-pool basis. For `erasure coded pools <../erasure-code>`_, resilience
+  is defined as the number of coding chunks (for example, ``m = 2`` in the
+  **erasure code profile**).
+
+- **Placement Groups**: You can set the number of placement groups for the
+  pool. A typical configuration targets approximately 100 placement groups per
+  OSD, providing optimal balancing without consuming many computing resources.
+  When setting up multiple pools, be careful to set a reasonable number of
+  placement groups for each pool and for the cluster as a whole. Note that each
+  PG belongs to a specific pool: when multiple pools use the same OSDs, make
+  sure that the **sum** of PG replicas per OSD is in the desired PG per OSD
+  target range. Use the `pgcalc`_ tool to calculate the number of placement
+  groups to set for your pool.
+
+- **CRUSH Rules**: When data is stored in a pool, the placement of the object
+  and its replicas (or chunks, in the case of erasure-coded pools) in your
+  cluster is governed by CRUSH rules. Custom CRUSH rules can be created for a
+  pool if the default rule does not fit your use case.
+
+- **Snapshots**: The command ``ceph osd pool mksnap`` creates a snapshot of a
+  pool. 
 
 Pool Names
 ==========
 
 Pool Names
 ==========
@@ -41,14 +41,14 @@ Pool names beginning with ``.`` are reserved for use by Ceph's internal
 operations. Please do not create or manipulate pools with these names.
 
 
 operations. Please do not create or manipulate pools with these names.
 
 
-
 List Pools
 ==========
 
 List Pools
 ==========
 
-To list your cluster's pools, execute::
+To list your cluster's pools, execute:
 
 
-       ceph osd lspools
+.. prompt:: bash $
 
 
+   ceph osd lspools
 
 .. _createpool:
 
 
 .. _createpool:
 
@@ -64,12 +64,16 @@ For details on placement group numbers refer to `setting the number of placement
    application using the pool. See `Associate Pool to Application`_ below for
    more information.
 
    application using the pool. See `Associate Pool to Application`_ below for
    more information.
 
-For example::
+For example:
+
+.. prompt:: bash $
 
        osd_pool_default_pg_num = 128
        osd_pool_default_pgp_num = 128
 
 
        osd_pool_default_pg_num = 128
        osd_pool_default_pgp_num = 128
 
-To create a pool, execute::
+To create a pool, execute:
+
+.. prompt:: bash $
 
        ceph osd pool create {pool-name} [{pg-num} [{pgp-num}]] [replicated] \
              [crush-rule-name] [expected-num-objects]
 
        ceph osd pool create {pool-name} [{pg-num} [{pgp-num}]] [replicated] \
              [crush-rule-name] [expected-num-objects]
@@ -179,9 +183,11 @@ initialized using the ``rbd`` tool (see `Block Device Commands`_ for more
 information).
 
 For other cases, you can manually associate a free-form application name to
 information).
 
 For other cases, you can manually associate a free-form application name to
-a pool.::
+a pool.:
+
+.. prompt:: bash $
 
 
-        ceph osd pool application enable {pool-name} {application-name}
+   ceph osd pool application enable {pool-name} {application-name}
 
 .. note:: CephFS uses the application name ``cephfs``, RBD uses the
    application name ``rbd``, and RGW uses the application name ``rgw``.
 
 .. note:: CephFS uses the application name ``cephfs``, RBD uses the
    application name ``rbd``, and RGW uses the application name ``rgw``.
@@ -190,13 +196,17 @@ Set Pool Quotas
 ===============
 
 You can set pool quotas for the maximum number of bytes and/or the maximum
 ===============
 
 You can set pool quotas for the maximum number of bytes and/or the maximum
-number of objects per pool. ::
+number of objects per pool:
+
+.. prompt:: bash $
 
 
-       ceph osd pool set-quota {pool-name} [max_objects {obj-count}] [max_bytes {bytes}]
+   ceph osd pool set-quota {pool-name} [max_objects {obj-count}] [max_bytes {bytes}]
 
 
-For example::
+For example:
 
 
-       ceph osd pool set-quota data max_objects 10000
+.. prompt:: bash $
+
+   ceph osd pool set-quota data max_objects 10000
 
 To remove a quota, set its value to ``0``.
 
 
 To remove a quota, set its value to ``0``.
 
@@ -204,9 +214,11 @@ To remove a quota, set its value to ``0``.
 Delete a Pool
 =============
 
 Delete a Pool
 =============
 
-To delete a pool, execute::
+To delete a pool, execute:
+
+.. prompt:: bash $
 
 
-       ceph osd pool delete {pool-name} [{pool-name} --yes-i-really-really-mean-it]
+   ceph osd pool delete {pool-name} [{pool-name} --yes-i-really-really-mean-it]
 
 
 To remove a pool the mon_allow_pool_delete flag must be set to true in the Monitor's
 
 
 To remove a pool the mon_allow_pool_delete flag must be set to true in the Monitor's
@@ -217,11 +229,15 @@ See `Monitor Configuration`_ for more information.
 .. _Monitor Configuration: ../../configuration/mon-config-ref
 
 If you created your own rules for a pool you created, you should consider
 .. _Monitor Configuration: ../../configuration/mon-config-ref
 
 If you created your own rules for a pool you created, you should consider
-removing them when you no longer need your pool::
+removing them when you no longer need your pool:
+
+.. prompt:: bash $
 
 
-       ceph osd pool get {pool-name} crush_rule
+   ceph osd pool get {pool-name} crush_rule
 
 
-If the rule was "123", for example, you can check the other pools like so::
+If the rule was "123", for example, you can check the other pools like so:
+
+.. prompt:: bash $
 
        ceph osd dump | grep "^pool" | grep "crush_rule 123"
 
 
        ceph osd dump | grep "^pool" | grep "crush_rule 123"
 
@@ -229,7 +245,10 @@ If no other pools use that custom rule, then it's safe to delete that
 rule from the cluster.
 
 If you created users with permissions strictly for a pool that no longer
 rule from the cluster.
 
 If you created users with permissions strictly for a pool that no longer
-exists, you should consider deleting those users too::
+exists, you should consider deleting those users too:
+
+
+.. prompt:: bash $
 
        ceph auth ls | grep -C 5 {pool-name}
        ceph auth del {user}
 
        ceph auth ls | grep -C 5 {pool-name}
        ceph auth del {user}
@@ -238,9 +257,11 @@ exists, you should consider deleting those users too::
 Rename a Pool
 =============
 
 Rename a Pool
 =============
 
-To rename a pool, execute::
+To rename a pool, execute:
 
 
-       ceph osd pool rename {current-pool-name} {new-pool-name}
+.. prompt:: bash $
+
+   ceph osd pool rename {current-pool-name} {new-pool-name}
 
 If you rename a pool and you have per-pool capabilities for an authenticated
 user, you must update the user's capabilities (i.e., caps) with the new pool
 
 If you rename a pool and you have per-pool capabilities for an authenticated
 user, you must update the user's capabilities (i.e., caps) with the new pool
@@ -249,28 +270,36 @@ name.
 Show Pool Statistics
 ====================
 
 Show Pool Statistics
 ====================
 
-To show a pool's utilization statistics, execute::
+To show a pool's utilization statistics, execute:
+
+.. prompt:: bash $
+
+   rados df
 
 
-       rados df
+Additionally, to obtain I/O information for a specific pool or all, execute:
 
 
-Additionally, to obtain I/O information for a specific pool or all, execute::
+.. prompt:: bash $
 
 
-        ceph osd pool stats [{pool-name}]
+   ceph osd pool stats [{pool-name}]
 
 
 Make a Snapshot of a Pool
 =========================
 
 
 
 Make a Snapshot of a Pool
 =========================
 
-To make a snapshot of a pool, execute::
+To make a snapshot of a pool, execute:
 
 
-       ceph osd pool mksnap {pool-name} {snap-name}
+.. prompt:: bash $
+
+   ceph osd pool mksnap {pool-name} {snap-name}
 
 Remove a Snapshot of a Pool
 ===========================
 
 
 Remove a Snapshot of a Pool
 ===========================
 
-To remove a snapshot of a pool, execute::
+To remove a snapshot of a pool, execute:
+
+.. prompt:: bash $
 
 
-       ceph osd pool rmsnap {pool-name} {snap-name}
+   ceph osd pool rmsnap {pool-name} {snap-name}
 
 .. _setpoolvalues:
 
 
 .. _setpoolvalues:
 
@@ -278,9 +307,11 @@ To remove a snapshot of a pool, execute::
 Set Pool Values
 ===============
 
 Set Pool Values
 ===============
 
-To set a value to a pool, execute the following::
+To set a value to a pool, execute the following:
+
+.. prompt:: bash $
 
 
-       ceph osd pool set {pool-name} {key} {value}
+   ceph osd pool set {pool-name} {key} {value}
 
 You may set values for the following keys:
 
 
 You may set values for the following keys:
 
@@ -662,9 +693,11 @@ You may set values for the following keys:
 Get Pool Values
 ===============
 
 Get Pool Values
 ===============
 
-To get a value from a pool, execute the following::
+To get a value from a pool, execute the following:
 
 
-       ceph osd pool get {pool-name} {key}
+.. prompt:: bash $
+
+   ceph osd pool get {pool-name} {key}
 
 You may get values for the following keys:
 
 
 You may get values for the following keys:
 
@@ -830,24 +863,30 @@ You may get values for the following keys:
 Set the Number of Object Replicas
 =================================
 
 Set the Number of Object Replicas
 =================================
 
-To set the number of object replicas on a replicated pool, execute the following::
+To set the number of object replicas on a replicated pool, execute the following:
+
+.. prompt:: bash $
 
 
-       ceph osd pool set {poolname} size {num-replicas}
+   ceph osd pool set {poolname} size {num-replicas}
 
 .. important:: The ``{num-replicas}`` includes the object itself.
    If you want the object and two copies of the object for a total of
    three instances of the object, specify ``3``.
 
 
 .. important:: The ``{num-replicas}`` includes the object itself.
    If you want the object and two copies of the object for a total of
    three instances of the object, specify ``3``.
 
-For example::
+For example:
+
+.. prompt:: bash $
 
 
-       ceph osd pool set data size 3
+   ceph osd pool set data size 3
 
 You may execute this command for each pool. **Note:** An object might accept
 I/Os in degraded mode with fewer than ``pool size`` replicas.  To set a minimum
 number of required replicas for I/O, you should use the ``min_size`` setting.
 
 You may execute this command for each pool. **Note:** An object might accept
 I/Os in degraded mode with fewer than ``pool size`` replicas.  To set a minimum
 number of required replicas for I/O, you should use the ``min_size`` setting.
-For example::
+For example:
 
 
-  ceph osd pool set data min_size 2
+.. prompt:: bash $
+
+   ceph osd pool set data min_size 2
 
 This ensures that no object in the data pool will receive I/O with fewer than
 ``min_size`` replicas.
 
 This ensures that no object in the data pool will receive I/O with fewer than
 ``min_size`` replicas.
@@ -856,16 +895,18 @@ This ensures that no object in the data pool will receive I/O with fewer than
 Get the Number of Object Replicas
 =================================
 
 Get the Number of Object Replicas
 =================================
 
-To get the number of object replicas, execute the following::
+To get the number of object replicas, execute the following:
+
+.. prompt:: bash $
 
 
-       ceph osd dump | grep 'replicated size'
+   ceph osd dump | grep 'replicated size'
 
 Ceph will list the pools, with the ``replicated size`` attribute highlighted.
 By default, ceph creates two replicas of an object (a total of three copies, or
 a size of 3).
 
 
 
 Ceph will list the pools, with the ``replicated size`` attribute highlighted.
 By default, ceph creates two replicas of an object (a total of three copies, or
 a size of 3).
 
 
-
+.. _pgcalc: https://old.ceph.com/pgcalc/
 .. _Pool, PG and CRUSH Config Reference: ../../configuration/pool-pg-config-ref
 .. _Bloom Filter: https://en.wikipedia.org/wiki/Bloom_filter
 .. _setting the number of placement groups: ../placement-groups#set-the-number-of-placement-groups
 .. _Pool, PG and CRUSH Config Reference: ../../configuration/pool-pg-config-ref
 .. _Bloom Filter: https://en.wikipedia.org/wiki/Bloom_filter
 .. _setting the number of placement groups: ../placement-groups#set-the-number-of-placement-groups
index 2870623742b1f65f5bccf3fee8d2dc84df88677e..9fdeb843626c1eba6f0d7fd16299bfd7643e8a0f 100644 (file)
@@ -65,15 +65,19 @@ just as susceptible to netsplit issues, but are much more tolerant of
 component availability outages than 2-site clusters are.
 
 To enter stretch mode, you must set the location of each monitor, matching
 component availability outages than 2-site clusters are.
 
 To enter stretch mode, you must set the location of each monitor, matching
-your CRUSH map. For instance, to place ``mon.a`` in your first data center ::
+your CRUSH map. For instance, to place ``mon.a`` in your first data center:
 
 
-  $ ceph mon set_location a datacenter=site1
+.. prompt:: bash $
+
+   ceph mon set_location a datacenter=site1
 
 Next, generate a CRUSH rule which will place 2 copies in each data center. This
 
 Next, generate a CRUSH rule which will place 2 copies in each data center. This
-will require editing the CRUSH map directly::
+will require editing the CRUSH map directly:
+
+.. prompt:: bash $
 
 
-  $ ceph osd getcrushmap > crush.map.bin
-  $ crushtool -d crush.map.bin -o crush.map.txt
+   ceph osd getcrushmap > crush.map.bin
+   crushtool -d crush.map.bin -o crush.map.txt
 
 Now edit the ``crush.map.txt`` file to add a new rule. Here
 there is only one other rule, so this is ID 1, but you may need
 
 Now edit the ``crush.map.txt`` file to add a new rule. Here
 there is only one other rule, so this is ID 1, but you may need
@@ -93,10 +97,12 @@ named ``site1`` and ``site2``::
           step emit
   }
 
           step emit
   }
 
-Finally, inject the CRUSH map to make the rule available to the cluster::
+Finally, inject the CRUSH map to make the rule available to the cluster:
 
 
-  $ crushtool -c crush.map.txt -o crush2.map.bin
-  $ ceph osd setcrushmap -i crush2.map.bin
+.. prompt:: bash $
+
+   crushtool -c crush.map.txt -o crush2.map.bin
+   ceph osd setcrushmap -i crush2.map.bin
 
 If you aren't already running your monitors in connectivity mode, do so with
 the instructions in `Changing Monitor Elections`_.
 
 If you aren't already running your monitors in connectivity mode, do so with
 the instructions in `Changing Monitor Elections`_.
@@ -107,10 +113,12 @@ And lastly, tell the cluster to enter stretch mode. Here, ``mon.e`` is the
 tiebreaker and we are splitting across data centers. ``mon.e`` should be also
 set a datacenter, that will differ from ``site1`` and ``site2``. For this
 purpose you can create another datacenter bucket named ```site3`` in your
 tiebreaker and we are splitting across data centers. ``mon.e`` should be also
 set a datacenter, that will differ from ``site1`` and ``site2``. For this
 purpose you can create another datacenter bucket named ```site3`` in your
-CRUSH and place ``mon.e`` there ::
+CRUSH and place ``mon.e`` there:
+
+.. prompt:: bash $
 
 
-  $ ceph mon set_location e datacenter=site3
-  $ ceph mon enable_stretch_mode e stretch_rule datacenter
+   ceph mon set_location e datacenter=site3
+   ceph mon enable_stretch_mode e stretch_rule datacenter
 
 When stretch mode is enabled, the OSDs will only take PGs active when
 they peer across data centers (or whatever other CRUSH bucket type
 
 When stretch mode is enabled, the OSDs will only take PGs active when
 they peer across data centers (or whatever other CRUSH bucket type
@@ -163,9 +171,11 @@ running with more than 2 full sites.
 Other commands
 ==============
 If your tiebreaker monitor fails for some reason, you can replace it. Turn on
 Other commands
 ==============
 If your tiebreaker monitor fails for some reason, you can replace it. Turn on
-a new monitor and run ::
+a new monitor and run:
 
 
-  $ ceph mon set_new_tiebreaker mon.<new_mon_name>
+.. prompt:: bash $
+
+   ceph mon set_new_tiebreaker mon.<new_mon_name>
 
 This command will protest if the new monitor is in the same location as existing
 non-tiebreaker monitors. This command WILL NOT remove the previous tiebreaker
 
 This command will protest if the new monitor is in the same location as existing
 non-tiebreaker monitors. This command WILL NOT remove the previous tiebreaker
@@ -180,9 +190,11 @@ bucket type you specified when running ``enable_stretch_mode``.
 
 When in stretch degraded mode, the cluster will go into "recovery" mode automatically
 when the disconnected data center comes back. If that doesn't work, or you want to
 
 When in stretch degraded mode, the cluster will go into "recovery" mode automatically
 when the disconnected data center comes back. If that doesn't work, or you want to
-enable recovery mode early, you can invoke ::
+enable recovery mode early, you can invoke:
+
+.. prompt:: bash $
 
 
-  $ ceph osd force_recovery_stretch_mode --yes-i-really-mean-it
+   ceph osd force_recovery_stretch_mode --yes-i-really-mean-it
 
 But this command should not be necessary; it is included to deal with
 unanticipated situations.
 
 But this command should not be necessary; it is included to deal with
 unanticipated situations.
@@ -191,9 +203,11 @@ When in recovery mode, the cluster should go back into normal stretch mode
 when the PGs are healthy. If this doesn't happen, or you want to force the
 cross-data-center peering early and are willing to risk data downtime (or have
 verified separately that all the PGs can peer, even if they aren't fully
 when the PGs are healthy. If this doesn't happen, or you want to force the
 cross-data-center peering early and are willing to risk data downtime (or have
 verified separately that all the PGs can peer, even if they aren't fully
-recovered), you can invoke ::
+recovered), you can invoke:
+
+.. prompt:: bash $
 
 
-  $ ceph osd force_healthy_stretch_mode --yes-i-really-mean-it
+   ceph osd force_healthy_stretch_mode --yes-i-really-mean-it
 
 This command should not be necessary; it is included to deal with
 unanticipated situations. But you might wish to invoke it to remove
 
 This command should not be necessary; it is included to deal with
 unanticipated situations. But you might wish to invoke it to remove
index 6e7ce5f639457f29982008b58df3516bca8b8bfa..366356d16e770d287ebe020945ffebb85875f745 100644 (file)
@@ -14,21 +14,27 @@ clients understand the new *pg-upmap* structure in the OSDMap.
 Enabling
 --------
 
 Enabling
 --------
 
-New clusters will have this module on by default. The cluster must only
-have luminous (and newer) clients. You can the turn the balancer off with::
+New clusters will by default enable the `balancer module`. The cluster must only
+have Luminous (and newer) clients. You can turn the balancer off with:
 
 
-  ceph balancer off
+.. prompt:: bash $
+
+   ceph balancer off
 
 To allow use of the feature on existing clusters, you must tell the
 
 To allow use of the feature on existing clusters, you must tell the
-cluster that it only needs to support luminous (and newer) clients with::
+cluster that it only needs to support Luminous (and newer) clients with:
+
+.. prompt:: bash $
 
 
-  ceph osd set-require-min-compat-client luminous
+   ceph osd set-require-min-compat-client luminous
 
 
-This command will fail if any pre-luminous clients or daemons are
+This command will fail if any pre-Luminous clients or daemons are
 connected to the monitors.  You can see what client versions are in
 connected to the monitors.  You can see what client versions are in
-use with::
+use with:
+
+.. prompt:: bash $
 
 
-  ceph features
+   ceph features
 
 Balancer module
 -----------------
 
 Balancer module
 -----------------
@@ -42,15 +48,20 @@ Offline optimization
 
 Upmap entries are updated with an offline optimizer built into ``osdmaptool``.
 
 
 Upmap entries are updated with an offline optimizer built into ``osdmaptool``.
 
-#. Grab the latest copy of your osdmap::
+#. Grab the latest copy of your osdmap:
 
 
-     ceph osd getmap -o om
+   .. prompt:: bash $
 
 
-#. Run the optimizer::
+      ceph osd getmap -o om
 
 
-     osdmaptool om --upmap out.txt [--upmap-pool <pool>]
-              [--upmap-max <max-optimizations>] [--upmap-deviation <max-deviation>]
-              [--upmap-active]
+#. Run the optimizer:
+
+   .. prompt:: bash $
+
+      osdmaptool om --upmap out.txt [--upmap-pool <pool>] \ 
+      [--upmap-max <max-optimizations>] \ 
+      [--upmap-deviation <max-deviation>] \ 
+      [--upmap-active]
 
    It is highly recommended that optimization be done for each pool
    individually, or for sets of similarly-utilized pools.  You can
 
    It is highly recommended that optimization be done for each pool
    individually, or for sets of similarly-utilized pools.  You can
@@ -75,9 +86,11 @@ Upmap entries are updated with an offline optimizer built into ``osdmaptool``.
    elapsed time for rounds indicates the CPU load ceph-mgr will be
    consuming when it tries to compute the next optimization plan.
 
    elapsed time for rounds indicates the CPU load ceph-mgr will be
    consuming when it tries to compute the next optimization plan.
 
-#. Apply the changes::
+#. Apply the changes:
+
+   .. prompt:: bash $
 
 
-     source out.txt
+      source out.txt
 
    The proposed changes are written to the output file ``out.txt`` in
    the example above.  These are normal ceph CLI commands that can be
 
    The proposed changes are written to the output file ``out.txt`` in
    the example above.  These are normal ceph CLI commands that can be
index 4e487a18f9a61de262091bcfbe07c24f3acfcbb9..9ce94a95f4f29dec56dad82b2a5a576d4f6be4d8 100644 (file)
@@ -30,13 +30,17 @@ of the specified user (usually via the command line). If you do not specify a
 user name, Ceph will use ``client.admin`` as the default user name. If you do
 not specify a keyring, Ceph will look for a keyring via the ``keyring`` setting
 in the Ceph configuration. For example, if you execute the ``ceph health``
 user name, Ceph will use ``client.admin`` as the default user name. If you do
 not specify a keyring, Ceph will look for a keyring via the ``keyring`` setting
 in the Ceph configuration. For example, if you execute the ``ceph health``
-command without specifying a user or keyring::
+command without specifying a user or keyring:
 
 
-       ceph health
+.. prompt:: bash $
 
 
-Ceph interprets the command like this::
+   ceph health
 
 
-       ceph -n client.admin --keyring=/etc/ceph/ceph.client.admin.keyring health
+Ceph interprets the command like this:
+
+.. prompt:: bash $
+
+   ceph -n client.admin --keyring=/etc/ceph/ceph.client.admin.keyring health
 
 Alternatively, you may use the ``CEPH_ARGS`` environment variable to avoid
 re-entry of the user name and secret.
 
 Alternatively, you may use the ``CEPH_ARGS`` environment variable to avoid
 re-entry of the user name and secret.
@@ -349,7 +353,8 @@ by users who have access to the namespace.
 
 .. note:: Namespaces are primarily useful for applications written on top of
    ``librados`` where the logical grouping can alleviate the need to create
 
 .. note:: Namespaces are primarily useful for applications written on top of
    ``librados`` where the logical grouping can alleviate the need to create
-   different pools. Ceph Object Gateway (from ``luminous``) uses namespaces for various
+   different pools. Ceph Object Gateway (in releases beginning with
+   Luminous) uses namespaces for various
    metadata objects.
 
 The rationale for namespaces is that pools can be a computationally expensive
    metadata objects.
 
 The rationale for namespaces is that pools can be a computationally expensive
@@ -381,7 +386,9 @@ Management`_ for details.
 List Users
 ----------
 
 List Users
 ----------
 
-To list the users in your cluster, execute the following::
+To list the users in your cluster, execute the following:
+
+.. prompt:: bash $
 
        ceph auth ls
 
 
        ceph auth ls
 
@@ -426,18 +433,24 @@ Get a User
 ----------
 
 To retrieve a specific user, key and capabilities, execute the
 ----------
 
 To retrieve a specific user, key and capabilities, execute the
-following::
+following:
+
+.. prompt:: bash $
 
 
-       ceph auth get {TYPE.ID}
+   ceph auth get {TYPE.ID}
 
 
-For example::
+For example:
 
 
-       ceph auth get client.admin
+.. prompt:: bash $
+
+   ceph auth get client.admin
 
 You may also use the ``-o {filename}`` option with ``ceph auth get`` to
 
 You may also use the ``-o {filename}`` option with ``ceph auth get`` to
-save the output to a file. Developers may also execute the following::
+save the output to a file. Developers may also execute the following:
+
+.. prompt:: bash $
 
 
-       ceph auth export {TYPE.ID}
+   ceph auth export {TYPE.ID}
 
 The ``auth export`` command is identical to ``auth get``.
 
 
 The ``auth export`` command is identical to ``auth get``.
 
@@ -476,12 +489,14 @@ the ``ceph auth caps`` command.
 
 A typical user has at least read capabilities on the Ceph monitor and
 read and write capability on Ceph OSDs. Additionally, a user's OSD permissions
 
 A typical user has at least read capabilities on the Ceph monitor and
 read and write capability on Ceph OSDs. Additionally, a user's OSD permissions
-are often restricted to accessing a particular pool. ::
+are often restricted to accessing a particular pool:
+
+.. prompt:: bash $
 
 
-       ceph auth add client.john mon 'allow r' osd 'allow rw pool=liverpool'
-       ceph auth get-or-create client.paul mon 'allow r' osd 'allow rw pool=liverpool'
-       ceph auth get-or-create client.george mon 'allow r' osd 'allow rw pool=liverpool' -o george.keyring
-       ceph auth get-or-create-key client.ringo mon 'allow r' osd 'allow rw pool=liverpool' -o ringo.key
+   ceph auth add client.john mon 'allow r' osd 'allow rw pool=liverpool'
+   ceph auth get-or-create client.paul mon 'allow r' osd 'allow rw pool=liverpool'
+   ceph auth get-or-create client.george mon 'allow r' osd 'allow rw pool=liverpool' -o george.keyring
+   ceph auth get-or-create-key client.ringo mon 'allow r' osd 'allow rw pool=liverpool' -o ringo.key
 
 
 .. important:: If you provide a user with capabilities to OSDs, but you DO NOT
 
 
 .. important:: If you provide a user with capabilities to OSDs, but you DO NOT
@@ -497,25 +512,31 @@ Modify User Capabilities
 The ``ceph auth caps`` command allows you to specify a user and change the
 user's capabilities. Setting new capabilities will overwrite current capabilities.
 To view current capabilities run ``ceph auth get USERTYPE.USERID``.  To add
 The ``ceph auth caps`` command allows you to specify a user and change the
 user's capabilities. Setting new capabilities will overwrite current capabilities.
 To view current capabilities run ``ceph auth get USERTYPE.USERID``.  To add
-capabilities, you should also specify the existing capabilities when using the form::
+capabilities, you should also specify the existing capabilities when using the form:
 
 
-       ceph auth caps USERTYPE.USERID {daemon} 'allow [r|w|x|*|...] [pool={pool-name}] [namespace={namespace-name}]' [{daemon} 'allow [r|w|x|*|...] [pool={pool-name}] [namespace={namespace-name}]']
+.. prompt:: bash $
 
 
-For example::
+   ceph auth caps USERTYPE.USERID {daemon} 'allow [r|w|x|*|...] [pool={pool-name}] [namespace={namespace-name}]' [{daemon} 'allow [r|w|x|*|...] [pool={pool-name}] [namespace={namespace-name}]']
 
 
-       ceph auth get client.john
-       ceph auth caps client.john mon 'allow r' osd 'allow rw pool=liverpool'
-       ceph auth caps client.paul mon 'allow rw' osd 'allow rwx pool=liverpool'
-       ceph auth caps client.brian-manager mon 'allow *' osd 'allow *'
+For example:
+
+.. prompt:: bash $
+
+   ceph auth get client.john
+   ceph auth caps client.john mon 'allow r' osd 'allow rw pool=liverpool'
+   ceph auth caps client.paul mon 'allow rw' osd 'allow rwx pool=liverpool'
+   ceph auth caps client.brian-manager mon 'allow *' osd 'allow *'
 
 See `Authorization (Capabilities)`_ for additional details on capabilities.
 
 Delete a User
 -------------
 
 
 See `Authorization (Capabilities)`_ for additional details on capabilities.
 
 Delete a User
 -------------
 
-To delete a user, use ``ceph auth del``::
+To delete a user, use ``ceph auth del``:
+
+.. prompt:: bash $
 
 
-       ceph auth del {TYPE}.{ID}
+   ceph auth del {TYPE}.{ID}
 
 Where ``{TYPE}`` is one of ``client``, ``osd``, ``mon``, or ``mds``,
 and ``{ID}`` is the user name or ID of the daemon.
 
 Where ``{TYPE}`` is one of ``client``, ``osd``, ``mon``, or ``mds``,
 and ``{ID}`` is the user name or ID of the daemon.
@@ -524,29 +545,37 @@ and ``{ID}`` is the user name or ID of the daemon.
 Print a User's Key
 ------------------
 
 Print a User's Key
 ------------------
 
-To print a user's authentication key to standard output, execute the following::
+To print a user's authentication key to standard output, execute the following:
 
 
-       ceph auth print-key {TYPE}.{ID}
+.. prompt:: bash $
+
+   ceph auth print-key {TYPE}.{ID}
 
 Where ``{TYPE}`` is one of ``client``, ``osd``, ``mon``, or ``mds``,
 and ``{ID}`` is the user name or ID of the daemon.
 
 Printing a user's key is useful when you need to populate client
 
 Where ``{TYPE}`` is one of ``client``, ``osd``, ``mon``, or ``mds``,
 and ``{ID}`` is the user name or ID of the daemon.
 
 Printing a user's key is useful when you need to populate client
-software with a user's key  (e.g., libvirt). ::
+software with a user's key  (e.g., libvirt):
+
+.. prompt:: bash $
 
 
-       mount -t ceph serverhost:/ mountpoint -o name=client.user,secret=`ceph auth print-key client.user`
+   mount -t ceph serverhost:/ mountpoint -o name=client.user,secret=`ceph auth print-key client.user`
 
 Import a User(s)
 ----------------
 
 To import one or more users, use ``ceph auth import`` and
 
 Import a User(s)
 ----------------
 
 To import one or more users, use ``ceph auth import`` and
-specify a keyring::
+specify a keyring:
+
+.. prompt:: bash $
 
 
-       ceph auth import -i /path/to/keyring
+   ceph auth import -i /path/to/keyring
 
 
-For example::
+For example:
 
 
-       sudo ceph auth import -i /etc/ceph/ceph.keyring
+.. prompt:: bash $
+
+   sudo ceph auth import -i /etc/ceph/ceph.keyring
 
 
 .. note:: The Ceph storage cluster will add new users, their keys and their
 
 
 .. note:: The Ceph storage cluster will add new users, their keys and their
@@ -592,18 +621,22 @@ Storage Cluster. Ceph Clients access keyrings to lookup a user name and
 retrieve the user's key.
 
 The ``ceph-authtool`` utility allows you to create a keyring. To create an
 retrieve the user's key.
 
 The ``ceph-authtool`` utility allows you to create a keyring. To create an
-empty keyring, use ``--create-keyring`` or ``-C``. For example::
+empty keyring, use ``--create-keyring`` or ``-C``. For example:
+
+.. prompt:: bash $
 
 
-       ceph-authtool --create-keyring /path/to/keyring
+   ceph-authtool --create-keyring /path/to/keyring
 
 When creating a keyring with multiple users, we recommend using the cluster name
 (e.g., ``$cluster.keyring``) for the keyring filename and saving it in the
 ``/etc/ceph`` directory so that the ``keyring`` configuration default setting
 will pick up the filename without requiring you to specify it in the local copy
 of your Ceph configuration file. For example, create ``ceph.keyring`` by
 
 When creating a keyring with multiple users, we recommend using the cluster name
 (e.g., ``$cluster.keyring``) for the keyring filename and saving it in the
 ``/etc/ceph`` directory so that the ``keyring`` configuration default setting
 will pick up the filename without requiring you to specify it in the local copy
 of your Ceph configuration file. For example, create ``ceph.keyring`` by
-executing the following::
+executing the following:
 
 
-       sudo ceph-authtool -C /etc/ceph/ceph.keyring
+.. prompt:: bash $
+
+   sudo ceph-authtool -C /etc/ceph/ceph.keyring
 
 When creating a keyring with a single user, we recommend using the cluster name,
 the user type and the user name and saving it in the ``/etc/ceph`` directory.
 
 When creating a keyring with a single user, we recommend using the cluster name,
 the user type and the user name and saving it in the ``/etc/ceph`` directory.
@@ -625,17 +658,21 @@ keyring.
 
 When you only want to use one user per keyring, the `Get a User`_ procedure with
 the ``-o`` option will save the output in the keyring file format. For example,
 
 When you only want to use one user per keyring, the `Get a User`_ procedure with
 the ``-o`` option will save the output in the keyring file format. For example,
-to create a keyring for the ``client.admin`` user, execute the following::
+to create a keyring for the ``client.admin`` user, execute the following:
+
+.. prompt:: bash $
 
 
-       sudo ceph auth get client.admin -o /etc/ceph/ceph.client.admin.keyring
+   sudo ceph auth get client.admin -o /etc/ceph/ceph.client.admin.keyring
 
 Notice that we use the recommended file format for an individual user.
 
 When you want to import users to a keyring, you can use ``ceph-authtool``
 to specify the destination keyring and the source keyring.
 
 Notice that we use the recommended file format for an individual user.
 
 When you want to import users to a keyring, you can use ``ceph-authtool``
 to specify the destination keyring and the source keyring.
-For example::
+For example:
 
 
-       sudo ceph-authtool /etc/ceph/ceph.keyring --import-keyring /etc/ceph/ceph.client.admin.keyring
+.. prompt:: bash $
+
+   sudo ceph-authtool /etc/ceph/ceph.keyring --import-keyring /etc/ceph/ceph.client.admin.keyring
 
 Create a User
 -------------
 
 Create a User
 -------------
@@ -643,35 +680,45 @@ Create a User
 Ceph provides the `Add a User`_ function to create a user directly in the Ceph
 Storage Cluster. However, you can also create a user, keys and capabilities
 directly on a Ceph client keyring. Then, you can import the user to the Ceph
 Ceph provides the `Add a User`_ function to create a user directly in the Ceph
 Storage Cluster. However, you can also create a user, keys and capabilities
 directly on a Ceph client keyring. Then, you can import the user to the Ceph
-Storage Cluster. For example::
+Storage Cluster. For example:
+
+.. prompt:: bash $
 
 
-       sudo ceph-authtool -n client.ringo --cap osd 'allow rwx' --cap mon 'allow rwx' /etc/ceph/ceph.keyring
+   sudo ceph-authtool -n client.ringo --cap osd 'allow rwx' --cap mon 'allow rwx' /etc/ceph/ceph.keyring
 
 See `Authorization (Capabilities)`_ for additional details on capabilities.
 
 You can also create a keyring and add a new user to the keyring simultaneously.
 
 See `Authorization (Capabilities)`_ for additional details on capabilities.
 
 You can also create a keyring and add a new user to the keyring simultaneously.
-For example::
+For example:
+
+.. prompt:: bash $
 
 
-       sudo ceph-authtool -C /etc/ceph/ceph.keyring -n client.ringo --cap osd 'allow rwx' --cap mon 'allow rwx' --gen-key
+   sudo ceph-authtool -C /etc/ceph/ceph.keyring -n client.ringo --cap osd 'allow rwx' --cap mon 'allow rwx' --gen-key
 
 In the foregoing scenarios, the new user ``client.ringo`` is only in the
 keyring. To add the new user to the Ceph Storage Cluster, you must still add
 
 In the foregoing scenarios, the new user ``client.ringo`` is only in the
 keyring. To add the new user to the Ceph Storage Cluster, you must still add
-the new user to the Ceph Storage Cluster. ::
+the new user to the Ceph Storage Cluster:
 
 
-       sudo ceph auth add client.ringo -i /etc/ceph/ceph.keyring
+.. prompt:: bash $
+
+   sudo ceph auth add client.ringo -i /etc/ceph/ceph.keyring
 
 Modify a User
 -------------
 
 To modify the capabilities of a user record in a keyring, specify the keyring,
 
 Modify a User
 -------------
 
 To modify the capabilities of a user record in a keyring, specify the keyring,
-and the user followed by the capabilities. For example::
+and the user followed by the capabilities. For example:
+
+.. prompt:: bash $
 
 
-       sudo ceph-authtool /etc/ceph/ceph.keyring -n client.ringo --cap osd 'allow rwx' --cap mon 'allow rwx'
+   sudo ceph-authtool /etc/ceph/ceph.keyring -n client.ringo --cap osd 'allow rwx' --cap mon 'allow rwx'
 
 To update the user to the Ceph Storage Cluster, you must update the user
 
 To update the user to the Ceph Storage Cluster, you must update the user
-in the keyring to the user entry in the Ceph Storage Cluster. ::
+in the keyring to the user entry in the Ceph Storage Cluster:
+
+.. prompt:: bash $
 
 
-       sudo ceph auth import -i /etc/ceph/ceph.keyring
+   sudo ceph auth import -i /etc/ceph/ceph.keyring
 
 See `Import a User(s)`_ for details on updating a Ceph Storage Cluster user
 from a keyring.
 
 See `Import a User(s)`_ for details on updating a Ceph Storage Cluster user
 from a keyring.
@@ -692,10 +739,12 @@ Ceph supports the following usage for user name and secret:
               ``-n`` options enable you to specify the ID portion of the user
               name (e.g., ``admin``, ``user1``, ``foo``, etc.). You can specify
               the user with the ``--id`` and omit the type. For example,
               ``-n`` options enable you to specify the ID portion of the user
               name (e.g., ``admin``, ``user1``, ``foo``, etc.). You can specify
               the user with the ``--id`` and omit the type. For example,
-              to specify user ``client.foo`` enter the following::
+              to specify user ``client.foo`` enter the following:
 
 
-               ceph --id foo --keyring /path/to/keyring health
-               ceph --user foo --keyring /path/to/keyring health
+              .. prompt:: bash $
+
+                 ceph --id foo --keyring /path/to/keyring health
+                 ceph --user foo --keyring /path/to/keyring health
 
 
 ``--name`` | ``-n``
 
 
 ``--name`` | ``-n``
@@ -704,10 +753,12 @@ Ceph supports the following usage for user name and secret:
               ``client.admin``, ``client.user1``). The ``--name`` and ``-n``
               options enables you to specify the fully qualified user name.
               You must specify the user type (typically ``client``) with the
               ``client.admin``, ``client.user1``). The ``--name`` and ``-n``
               options enables you to specify the fully qualified user name.
               You must specify the user type (typically ``client``) with the
-              user ID. For example::
+              user ID. For example:
+
+              .. prompt:: bash $
 
 
-               ceph --name client.foo --keyring /path/to/keyring health
-               ceph -n client.foo --keyring /path/to/keyring health
+                 ceph --name client.foo --keyring /path/to/keyring health
+                 ceph -n client.foo --keyring /path/to/keyring health
 
 
 ``--keyring``
 
 
 ``--keyring``
@@ -718,9 +769,11 @@ Ceph supports the following usage for user name and secret:
               ``--secret`` for another purpose. You may retrieve a keyring with
               ``ceph auth get-or-create`` and store it locally. This is a
               preferred approach, because you can switch user names without
               ``--secret`` for another purpose. You may retrieve a keyring with
               ``ceph auth get-or-create`` and store it locally. This is a
               preferred approach, because you can switch user names without
-              switching the keyring path. For example::
+              switching the keyring path. For example:
+
+              .. prompt:: bash $
 
 
-               sudo rbd map --id foo --keyring /path/to/keyring mypool/myimage
+                 sudo rbd map --id foo --keyring /path/to/keyring mypool/myimage
 
 
 .. _pools: ../pools
 
 
 .. _pools: ../pools
index f0729680b7d56af4459075ed6cf7d57e16810765..de48bd35ec8b00e13f40e1b8123b6d2b619547fe 100644 (file)
@@ -92,20 +92,28 @@ STS Configuration
 
 The following configurable options have to be added for STS integration::
 
 
 The following configurable options have to be added for STS integration::
 
-  [client.radosgw.gateway]
-  rgw sts key = {sts key for encrypting the session token}
-  rgw s3 auth use sts = true
+  [client.{your-rgw-name}]
+  rgw_sts_key = {sts key for encrypting the session token}
+  rgw_s3_auth_use_sts = true
 
 
-Note: By default, STS and S3 APIs co-exist in the same namespace, and both S3
-and STS APIs can be accessed via the same endpoint in Ceph Object Gateway.
+Notes: 
+
+* By default, STS and S3 APIs co-exist in the same namespace, and both S3
+  and STS APIs can be accessed via the same endpoint in Ceph Object Gateway.
+* The ``rgw_sts_key`` needs to be a hex-string consisting of exactly 16 characters.
 
 Examples
 ========
 
 Examples
 ========
+1. In order to get the example to work, make sure that the user TESTER has the ``roles`` capability assigned:
+
+.. code-block:: console
 
 
-1. The following is an example of AssumeRole API call, which shows steps to create a role, assign a policy to it
-(that allows access to S3 resources), assuming a role to get temporary credentials and accessing s3 resources using
-those credentials. In this example, TESTER1 assumes a role created by TESTER, to access S3 resources owned by TESTER,
-according to the permission policy attached to the role.
+   radosgw-admin caps add --uid="TESTER" --caps="roles=*"
+
+2. The following is an example of AssumeRole API call, which shows steps to create a role, assign a policy to it
+   (that allows access to S3 resources), assuming a role to get temporary credentials and accessing s3 resources using
+   those credentials. In this example, TESTER1 assumes a role created by TESTER, to access S3 resources owned by TESTER,
+   according to the permission policy attached to the role.
 
 .. code-block:: console
 
 
 .. code-block:: console
 
index f5dae7050a17342dd4ff83086dfe8a09fceacdad..7880e373f462857aea64356b7bc30f608ae8980c 100644 (file)
@@ -60,9 +60,9 @@ The above STS configurables can be used with the Keystone configurables if one
 needs to use STS Lite in conjunction with Keystone. The complete set of
 configurable options will be::
 
 needs to use STS Lite in conjunction with Keystone. The complete set of
 configurable options will be::
 
-  [client.radosgw.gateway]
-  rgw sts key = {sts key for encrypting/ decrypting the session token}
-  rgw s3 auth use sts = true
+  [client.{your-rgw-name}]
+  rgw_sts_key = {sts key for encrypting/ decrypting the session token, exactly 16 hex characters}
+  rgw_s3_auth_use_sts = true
 
   rgw keystone url = {keystone server url:keystone server admin port}
   rgw keystone admin project = {keystone admin project name}
 
   rgw keystone url = {keystone server url:keystone server admin port}
   rgw keystone admin project = {keystone admin project name}
@@ -81,9 +81,9 @@ The details of the integrating ldap with Ceph Object Gateway can be found here:
 
 The complete set of configurables to use STS Lite with LDAP are::
 
 
 The complete set of configurables to use STS Lite with LDAP are::
 
-  [client.radosgw.gateway]
-  rgw sts key = {sts key for encrypting/ decrypting the session token}
-  rgw s3 auth use sts = true
+  [client.{your-rgw-name}]
+  rgw_sts_key = {sts key for encrypting/ decrypting the session token, exactly 16 hex characters}
+  rgw_s3_auth_use_sts = true
 
   rgw_s3_auth_use_ldap = true
   rgw_ldap_uri = {LDAP server to use}
 
   rgw_s3_auth_use_ldap = true
   rgw_ldap_uri = {LDAP server to use}
index 256172b8de9674ad3f87e87fcf52470ea970bbc0..2677e7a2f9e2391dd88307ffce189ad13ffe885b 100644 (file)
@@ -5,8 +5,8 @@
 =====================
 
 :term:`Ceph Object Gateway` is an object storage interface built on top of
 =====================
 
 :term:`Ceph Object Gateway` is an object storage interface built on top of
-``librados`` to provide applications with a RESTful gateway to
-Ceph Storage Clusters. :term:`Ceph Object Storage` supports two interfaces:
+``librados``. It provides a RESTful gateway between applications and Ceph
+Storage Clusters. :term:`Ceph Object Storage` supports two interfaces:
 
 #. **S3-compatible:** Provides object storage functionality with an interface
    that is compatible with a large subset of the Amazon S3 RESTful API.
 
 #. **S3-compatible:** Provides object storage functionality with an interface
    that is compatible with a large subset of the Amazon S3 RESTful API.
@@ -14,13 +14,14 @@ Ceph Storage Clusters. :term:`Ceph Object Storage` supports two interfaces:
 #. **Swift-compatible:** Provides object storage functionality with an interface
    that is compatible with a large subset of the OpenStack Swift API.
 
 #. **Swift-compatible:** Provides object storage functionality with an interface
    that is compatible with a large subset of the OpenStack Swift API.
 
-Ceph Object Storage uses the Ceph Object Gateway daemon (``radosgw``), which is
-an HTTP server for interacting with a Ceph Storage Cluster. Since it
-provides interfaces compatible with OpenStack Swift and Amazon S3, the Ceph
-Object Gateway has its own user management. Ceph Object Gateway can store data
-in the same Ceph Storage Cluster used to store data from Ceph File System clients
-or Ceph Block Device clients. The S3 and Swift APIs share a common namespace, so
-you may write data with one API and retrieve it with the other.
+Ceph Object Storage uses the Ceph Object Gateway daemon (``radosgw``), an HTTP
+server designed for interacting with a Ceph Storage Cluster. The Ceph Object
+Gateway provides interfaces that are compatible with both Amazon S3 and
+OpenStack Swift, and it has its own user management. Ceph Object Gateway can
+store data in the same Ceph Storage Cluster in which data from Ceph File System
+clients and Ceph Block Device clients is stored. The S3 API and the Swift API
+share a common namespace, which makes it possible to write data to a Ceph
+Storage Cluster with one API and then retrieve that data with the other API.
 
 .. ditaa::
 
 
 .. ditaa::
 
index 534c4733abb46136dd5b7612052c62868c9d1a26..ec285a62f3f0c0da81225ed333b3f920cf105714 100644 (file)
@@ -1,32 +1,40 @@
+.. _radosgw_keycloak:
+
 =================================
 =================================
-Keycloak integration with RadosGW
+Integrating Keycloak with RadosGW
 =================================
 
 =================================
 
-Keycloak can be setup as an OpenID Connect Identity Provider, which can be used by mobile/ web apps
-to authenticate their users. The Web token returned as a result of authentication can be used by the
-mobile/ web app to call AssumeRoleWithWebIdentity to get back a set of temporary S3 credentials,
-which can be used by the app to make S3 calls.
+If Keycloak is set up as an OpenID Connect Identity Provider, it can be used by
+mobile apps and web apps to authenticate their users. By using the web token
+returned by the authentication process, a mobile app or web app can call
+AssumeRoleWithWebIdentity, receive a set of temporary S3 credentials, and use
+those credentials to make S3 calls.
 
 Setting up Keycloak
 
 Setting up Keycloak
-====================
+===================
 
 
-Installing and bringing up Keycloak can be found here: https://www.keycloak.org/docs/latest/server_installation/.
+Documentation for installing and operating Keycloak can be found here:
+https://www.keycloak.org/guides.
 
 Configuring Keycloak to talk to RGW
 ===================================
 
 
 Configuring Keycloak to talk to RGW
 ===================================
 
-The following configurables have to be added for RGW to talk to Keycloak::
+To configure Keycloak to talk to RGW, add the following configurables::
 
   [client.radosgw.gateway]
   rgw sts key = {sts key for encrypting/ decrypting the session token}
   rgw s3 auth use sts = true
 
 
   [client.radosgw.gateway]
   rgw sts key = {sts key for encrypting/ decrypting the session token}
   rgw s3 auth use sts = true
 
-Example showing how to fetch a web token from Keycloak
-======================================================
+Fetching a web token with Keycloak
+==================================
+
+Several examples of apps authenticating with Keycloak can be found here:
+https://github.com/keycloak/keycloak-quickstarts/blob/latest/docs/getting-started.md.
 
 
-Several examples of apps authenticating with Keycloak are given here: https://github.com/keycloak/keycloak-quickstarts/blob/latest/docs/getting-started.md
-Taking the example of app-profile-jee-jsp app given in the link above, its client id and client secret, can be used to fetch the
-access token (web token) for an application using grant type 'client_credentials' as given below::
+Here you might consider the example of the app-profile-jee-jsp app (in the link
+above). To fetch the access token (web token) for such an application using the
+grant type 'client_credentials', one can use client id and client secret as
+follows::
 
     KC_REALM=demo
     KC_CLIENT=<client id>
 
     KC_REALM=demo
     KC_CLIENT=<client id>
@@ -48,8 +56,9 @@ access token (web token) for an application using grant type 'client_credentials
 
     KC_ACCESS_TOKEN=$(echo $KC_RESPONSE| jq -r .access_token)
 
 
     KC_ACCESS_TOKEN=$(echo $KC_RESPONSE| jq -r .access_token)
 
-An access token can also be fetched for a particular user with grant type 'password', using client id, client secret, username and its password
-as given below::
+It is also possible to fetch an access token for a particular user with the
+grant type 'password'. To fetch such an access token, use client id, client
+secret, username, and password as follows::
 
     KC_REALM=demo
     KC_USERNAME=<username>
 
     KC_REALM=demo
     KC_USERNAME=<username>
@@ -75,43 +84,45 @@ as given below::
 
     KC_ACCESS_TOKEN=$(echo $KC_RESPONSE| jq -r .access_token)
 
 
     KC_ACCESS_TOKEN=$(echo $KC_RESPONSE| jq -r .access_token)
 
-
-KC_ACCESS_TOKEN can be used to invoke AssumeRoleWithWebIdentity as given in
+``KC_ACCESS_TOKEN`` can be used to invoke ``AssumeRoleWithWebIdentity``: see
 :doc:`STS`.
 
 :doc:`STS`.
 
-Attaching tags to a user in Keycloak
-====================================
+Adding tags to a user in Keycloak
+=================================
 
 
-We need to create a user in keycloak, and add tags to it as its attributes.
+To create a user in Keycloak and add tags to it as its attributes, follow these
+steps:
 
 
-Add a user as shown below:
+#. Add a user:
 
 
-.. image:: ../images/keycloak-adduser.png
-   :align: center
+   .. image:: ../images/keycloak-adduser.png
+      :align: center
 
 
-Add user details as shown below:
+#. Add user details:
 
 
-.. image:: ../images/keycloak-userdetails.png
-   :align: center
+   .. image:: ../images/keycloak-userdetails.png
+      :align: center
 
 
-Add user credentials as shown below:
+#. Add user credentials:
 
 
-.. image:: ../images/keycloak-usercredentials.png
-   :align: center
+   .. image:: ../images/keycloak-usercredentials.png
+      :align: center
 
 
-Add tags to the 'attributes' tab of the user as shown below:
+#. Add tags to the 'attributes' tab of the user:
 
 
-.. image:: ../images/keycloak-usertags.png
-   :align: center
+   .. image:: ../images/keycloak-usertags.png
+      :align: center
 
 
-Add a protocol mapper for the user attribute to a client as shown below:
+#. Add a protocol mapper that maps the user attribute to a client:
 
 
-.. image:: ../images/keycloak-userclientmapper.png
-   :align: center
+   .. image:: ../images/keycloak-userclientmapper.png
+      :align: center
 
 
+After these steps have been completed, the tag 'Department' will appear in the
+JWT (web token), under the 'https://aws.amazon.com/tags' namespace.
 
 
-After following the steps shown above, the tag 'Department' will appear in the JWT (web token), under 'https://aws.amazon.com/tags' namespace.
-The tags can be verified using token introspection of the JWT. The command to introspect a token using client id and client secret is shown below::
+Tags can be verified by performing token introspection on a JWT. To introspect
+a token, use ``client id`` and ``client secret`` as follows::
 
     KC_REALM=demo
     KC_CLIENT=<client id>
 
     KC_REALM=demo
     KC_CLIENT=<client id>
index e861519f6cf81acede73481f2f8691ec0e6e1547..723adf827124f6f870611d7cce56df5af15e1a61 100644 (file)
@@ -71,7 +71,7 @@ Objects data is kept in one or more RADOS objects for each rgw object.
 Object Lookup Path
 ------------------
 
 Object Lookup Path
 ------------------
 
-When accessing objects, ReST APIs come to RGW with three parameters:
+When accessing objects, REST APIs come to RGW with three parameters:
 account information (access key in S3 or account name in Swift),
 bucket or container name, and object name (or key). At present, RGW only
 uses account information to find out the user ID and for access control.
 account information (access key in S3 or account name in Swift),
 bucket or container name, and object name (or key). At present, RGW only
 uses account information to find out the user ID and for access control.
index befef4279ee2090e03d6f9c327b080958bde8332..7a6e7105ce637d820d9a8a21550b3ba80ab7f95d 100644 (file)
@@ -1,3 +1,5 @@
+.. _radosgw-multisite-sync-policy:
+
 =====================
 Multisite Sync Policy
 =====================
 =====================
 Multisite Sync Policy
 =====================
index b216164d5d3606ffe87a56340fbf64349a568d48..55771d6baefc38739ec2a5574001e9d8779ef551 100644 (file)
 Multi-Site
 ==========
 
 Multi-Site
 ==========
 
+Single-zone Configurations and Multi-site Configurations
+========================================================
+
+Single-zone Configurations
+--------------------------
+
+A single-zone configuration typically consists of two things:
+
+#. One "zonegroup", which contains one zone. 
+#. One or more `ceph-radosgw` instances that have `ceph-radosgw` client
+   requests load-balanced between them. 
+
+In a typical single-zone configuration, there are multiple `ceph-radosgw`
+instances that make use of a single Ceph storage cluster.  
+
+Varieties of Multi-site Configuration
+-------------------------------------
+
 .. versionadded:: Jewel
 
 .. versionadded:: Jewel
 
-A single zone configuration typically consists of one zone group containing one
-zone and one or more `ceph-radosgw` instances where you may load-balance gateway
-client requests between the instances. In a single zone configuration, typically
-multiple gateway instances point to a single Ceph storage cluster. However, Kraken
-supports several multi-site configuration options for the Ceph Object Gateway:
-
-- **Multi-zone:** A more advanced configuration consists of one zone group and
-  multiple zones, each zone with one or more `ceph-radosgw` instances. Each zone
-  is backed by its own Ceph Storage Cluster. Multiple zones in a zone group
-  provides disaster recovery for the zone group should one of the zones experience
-  a significant failure. In Kraken, each zone is active and may receive write
-  operations. In addition to disaster recovery, multiple active zones may also
-  serve as a foundation for content delivery networks.
-
-- **Multi-zone-group:** Formerly called 'regions', Ceph Object Gateway can also
-  support multiple zone groups, each zone group with one or more zones. Objects
-  stored to zones in one zone group within the same realm as another zone
-  group will share a global object namespace, ensuring unique object IDs across
-  zone groups and zones.
-
-- **Multiple Realms:** In Kraken, the Ceph Object Gateway supports the notion
-  of realms, which can be a single zone group or multiple zone groups and
-  a globally unique namespace for the realm. Multiple realms provide the ability
-  to support numerous configurations and namespaces.
-
-Replicating object data between zones within a zone group looks something
-like this:
-
-.. image:: ../images/zone-sync2.png
+Beginning with the Kraken release, Ceph supports several multi-site
+configurations for the Ceph Object Gateway:
+
+- **Multi-zone:** A more advanced topology, the "multi-zone" configuration, is
+  possible. A multi-zone configuration consists of one zonegroup and
+  multiple zones, with each zone consisting of one or more `ceph-radosgw`
+  instances. **Each zone is backed by its own Ceph Storage Cluster.**
+  
+  The presence of multiple zones in a given zonegroup provides disaster
+  recovery for that zonegroup in the event that one of the zones experiences a
+  significant failure. Beginning with the Kraken release, each zone is active
+  and can receive write operations. A multi-zone configuration that contains
+  multiple active zones enhances disaster recovery and can also be used as a
+  foundation for content delivery networks. 
+
+- **Multi-zonegroups:** Ceph Object Gateway supports multiple zonegroups (which
+  were formerly called "regions"). Each zonegroup contains one or more zones.
+  If two zones are in the same zonegroup, and if that zonegroup is in the same
+  realm as a second zonegroup, then the objects stored in the two zones share
+  a global object namespace. This global object namespace ensures unique
+  object IDs across zonegroups and zones.
+
+- **Multiple Realms:** Beginning with the Kraken release, the Ceph Object
+  Gateway supports "realms", which are containers for zonegroups. Realms make
+  it possible to set policies that apply to multiple zonegroups. Realms have a
+  globally unique namespace and can contain either a single zonegroup or
+  multiple zonegroups. If you choose to make use of multiple realms, you can
+  define multiple namespaces and multiple configurations (this means that each
+  realm can have a configuration that is distinct from the configuration of
+  other realms).
+
+Diagram - Replication of Object Data Between Zones
+--------------------------------------------------
+
+The replication of object data between zones within a zonegroup looks
+something like this:
+
+.. image:: ../images/zone-sync.svg
    :align: center
 
    :align: center
 
+At the top of this diagram, we see two applications (also known as "clients").
+The application on the right is both writing and reading data from the Ceph
+Cluster, by means of the RADOS Gateway (RGW). The application on the left is
+only *reading* data from the Ceph Cluster, by means of an instance of RADOS
+Gateway (RGW). In both cases (read-and-write and read-only), the transmssion of
+data is handled RESTfully.
+
+In the middle of this diagram, we see two zones, each of which contains an
+instance of RADOS Gateway (RGW). These instances of RGW are handling the
+movement of data from the applications to the zonegroup. The arrow from the
+master zone (US-EAST) to the secondary zone (US-WEST) represents an act of data
+synchronization.
+
+At the bottom of this diagram, we see the data distributed into the Ceph
+Storage Cluster.
+
 For additional details on setting up a cluster, see `Ceph Object Gateway for
 Production <https://access.redhat.com/documentation/en-us/red_hat_ceph_storage/3/html/ceph_object_gateway_for_production/index/>`__.
 
 Functional Changes from Infernalis
 ==================================
 
 For additional details on setting up a cluster, see `Ceph Object Gateway for
 Production <https://access.redhat.com/documentation/en-us/red_hat_ceph_storage/3/html/ceph_object_gateway_for_production/index/>`__.
 
 Functional Changes from Infernalis
 ==================================
 
-In Kraken, you can configure each Ceph Object Gateway to
-work in an active-active zone configuration, allowing for writes to
-non-master zones.
+Beginning with Kraken, each Ceph Object Gateway can be configured to work in an
+active-active zone mode. This makes it possible to write to non-master zones.
 
 
-The multi-site configuration is stored within a container called a
-"realm." The realm stores zone groups, zones, and a time "period" with
-multiple epochs for tracking changes to the configuration. In Kraken,
-the ``ceph-radosgw`` daemons handle the synchronization,
-eliminating the need for a separate synchronization agent. Additionally,
-the new approach to synchronization allows the Ceph Object Gateway to
-operate with an "active-active" configuration instead of
-"active-passive".
+The multi-site configuration is stored within a container called a "realm". The
+realm stores zonegroups, zones, and a time "period" with multiple epochs (which
+(the epochs) are used for tracking changes to the configuration). 
+
+Beginning with Kraken, the ``ceph-radosgw`` daemons handle the synchronization
+of data across zones, which eliminates the need for a separate synchronization
+agent. This new approach to synchronization allows the Ceph Object Gateway to
+operate with an "active-active" configuration instead of with an
+"active-passive" configuration.
 
 Requirements and Assumptions
 ============================
 
 
 Requirements and Assumptions
 ============================
 
-A multi-site configuration requires at least two Ceph storage clusters,
-preferably given a distinct cluster name. At least two Ceph object
-gateway instances, one for each Ceph storage cluster.
+A multi-site configuration requires at least two Ceph storage clusters. The
+multi-site configuration must have at least two Ceph object gateway instances
+(one for each Ceph storage cluster).
 
 
-This guide assumes at least two Ceph storage clusters are in geographically
-separate locations; however, the configuration can work on the same
-site. This guide also assumes two Ceph object gateway servers named
+This guide assumes that at least two Ceph storage clusters are in
+geographically separate locations; however, the configuration can work on the
+same site. This guide also assumes two Ceph object gateway servers named
 ``rgw1`` and ``rgw2``.
 
 ``rgw1`` and ``rgw2``.
 
-.. important:: Running a single Ceph storage cluster is NOT recommended unless you have 
-               low latency WAN connections.
+.. important:: Running a single geographically-distributed Ceph storage cluster
+   is NOT recommended unless you have low latency WAN connections.
 
 
-A multi-site configuration requires a master zone group and a master
-zone. Additionally, each zone group requires a master zone. Zone groups
-may have one or more secondary or non-master zones.
+A multi-site configuration requires a master zonegroup and a master zone. Each
+zonegroup requires a master zone. Zonegroups may have one or more secondary
+or non-master zones.
 
 
-In this guide, the ``rgw1`` host will serve as the master zone of the
-master zone group; and, the ``rgw2`` host will serve as the secondary zone
-of the master zone group.
+In this guide, the ``rgw1`` host will serve as the master zone of the master
+zonegroup; and, the ``rgw2`` host will serve as the secondary zone of the
+master zonegroup.
 
 
-See `Pools`_ for instructions on creating and tuning pools for Ceph
-Object Storage.
+See `Pools`_ for instructions on creating and tuning pools for Ceph Object
+Storage.
 
 
-See `Sync Policy Config`_ for instructions on defining fine grained bucket sync
+See `Sync Policy Config`_ for instructions on defining fine-grained bucket sync
 policy rules.
 
 .. _master-zone-label:
 policy rules.
 
 .. _master-zone-label:
@@ -90,205 +133,197 @@ policy rules.
 Configuring a Master Zone
 =========================
 
 Configuring a Master Zone
 =========================
 
-All gateways in a multi-site configuration will retrieve their
-configuration from a ``ceph-radosgw`` daemon on a host within the master
-zone group and master zone. To configure your gateways in a multi-site
-configuration, choose a ``ceph-radosgw`` instance to configure the
-master zone group and master zone.
+All gateways in a multi-site configuration retrieve their configurations from a
+``ceph-radosgw`` daemon that is on a host within both the master zonegroup and
+the master zone. To configure your gateways in a multi-site configuration,
+choose a ``ceph-radosgw`` instance to configure the master zonegroup and
+master zone.
 
 Create a Realm
 --------------
 
 
 Create a Realm
 --------------
 
-A realm contains the multi-site configuration of zone groups and zones
-and also serves to enforce a globally unique namespace within the realm.
+A realm contains the multi-site configuration of zonegroups and zones. The
+realm enforces a globally unique namespace within itself.
 
 
-Create a new realm for the multi-site configuration by opening a command
-line interface on a host identified to serve in the master zone group
-and zone. Then, execute the following:
+#. Create a new realm for the multi-site configuration by opening a command
+   line interface on a host that will serve in the master zonegroup and zone.
+   Then run the following command:
 
 
-::
+   .. prompt:: bash #
 
 
-    # radosgw-admin realm create --rgw-realm={realm-name} [--default]
+      radosgw-admin realm create --rgw-realm={realm-name} [--default]
 
 
-For example:
+   For example:
 
 
-::
+   .. prompt:: bash #
 
 
-    # radosgw-admin realm create --rgw-realm=movies --default
+      radosgw-admin realm create --rgw-realm=movies --default
 
 
-If the cluster will have a single realm, specify the ``--default`` flag.
-If ``--default`` is specified, ``radosgw-admin`` will use this realm by
-default. If ``--default`` is not specified, adding zone-groups and zones
-requires specifying either the ``--rgw-realm`` flag or the
-``--realm-id`` flag to identify the realm when adding zone groups and
-zones.
+   .. note:: If you intend the cluster to have a single realm, specify the ``--default`` flag.  
 
 
-After creating the realm, ``radosgw-admin`` will echo back the realm
-configuration. For example:
+      If ``--default`` is specified, ``radosgw-admin`` uses this realm by default. 
+      
+      If ``--default`` is not specified, you must specify either the ``--rgw-realm`` flag or the ``--realm-id`` flag to identify the realm when adding zonegroups and zones.
 
 
-::
+#. After the realm has been created, ``radosgw-admin`` echoes back the realm
+   configuration. For example:
 
 
-    {
-        "id": "0956b174-fe14-4f97-8b50-bb7ec5e1cf62",
-        "name": "movies",
-        "current_period": "1950b710-3e63-4c41-a19e-46a715000980",
-        "epoch": 1
-    }
+   ::
 
 
-.. note:: Ceph generates a unique ID for the realm, which allows the renaming
-          of a realm if the need arises.
+       {
+           "id": "0956b174-fe14-4f97-8b50-bb7ec5e1cf62",
+           "name": "movies",
+           "current_period": "1950b710-3e63-4c41-a19e-46a715000980",
+           "epoch": 1
+       }
 
 
-Create a Master Zone Group
+   .. note:: Ceph generates a unique ID for the realm, which can be used to rename the realm if the need arises.
+
+Create a Master Zonegroup
 --------------------------
 
 --------------------------
 
-A realm must have at least one zone group, which will serve as the
-master zone group for the realm.
+A realm must have at least one zonegroup which serves as the master zonegroup
+for the realm.
 
 
-Create a new master zone group for the multi-site configuration by
-opening a command line interface on a host identified to serve in the
-master zone group and zone. Then, execute the following:
+#. To create a new master zonegroup for the multi-site configuration, open a
+   command-line interface on a host in the master zonegroup and zone. Then
+   run the following command:
 
 
-::
+   .. prompt:: bash #
 
 
-    # radosgw-admin zonegroup create --rgw-zonegroup={name} --endpoints={url} [--rgw-realm={realm-name}|--realm-id={realm-id}] --master --default
+      radosgw-admin zonegroup create --rgw-zonegroup={name} --endpoints={url} [--rgw-realm={realm-name}|--realm-id={realm-id}] --master --default
 
 
-For example:
+   For example:
 
 
-::
+   .. prompt:: bash #
 
 
-    # radosgw-admin zonegroup create --rgw-zonegroup=us --endpoints=http://rgw1:80 --rgw-realm=movies --master --default
+      radosgw-admin zonegroup create --rgw-zonegroup=us --endpoints=http://rgw1:80 --rgw-realm=movies --master --default
 
 
-If the realm will only have a single zone group, specify the
-``--default`` flag. If ``--default`` is specified, ``radosgw-admin``
-will use this zone group by default when adding new zones. If
-``--default`` is not specified, adding zones will require either the
-``--rgw-zonegroup`` flag or the ``--zonegroup-id`` flag to identify the
-zone group when adding or modifying zones.
+   .. note:: If the realm will have only a single zonegroup, specify the ``--default`` flag. 
 
 
-After creating the master zone group, ``radosgw-admin`` will echo back
-the zone group configuration. For example:
+      If ``--default`` is specified, ``radosgw-admin`` uses this zonegroup by default when adding new zones. 
+      
+      If ``--default`` is not specified, you must use either the ``--rgw-zonegroup`` flag or the ``--zonegroup-id`` flag to identify the zonegroup when adding or modifying zones.
 
 
-::
+#. After creating the master zonegroup, ``radosgw-admin`` echoes back the
+   zonegroup configuration. For example:
 
 
-    {
-        "id": "f1a233f5-c354-4107-b36c-df66126475a6",
-        "name": "us",
-        "api_name": "us",
-        "is_master": "true",
-        "endpoints": [
-            "http:\/\/rgw1:80"
-        ],
-        "hostnames": [],
-        "hostnames_s3website": [],
-        "master_zone": "",
-        "zones": [],
-        "placement_targets": [],
-        "default_placement": "",
-        "realm_id": "0956b174-fe14-4f97-8b50-bb7ec5e1cf62"
-    }
+   ::
+   
+       {
+           "id": "f1a233f5-c354-4107-b36c-df66126475a6",
+           "name": "us",
+           "api_name": "us",
+           "is_master": "true",
+           "endpoints": [
+               "http:\/\/rgw1:80"
+           ],
+           "hostnames": [],
+           "hostnames_s3website": [],
+           "master_zone": "",
+           "zones": [],
+           "placement_targets": [],
+           "default_placement": "",
+           "realm_id": "0956b174-fe14-4f97-8b50-bb7ec5e1cf62"
+       }
 
 Create a Master Zone
 --------------------
 
 .. important:: Zones must be created on a Ceph Object Gateway node that will be
 
 Create a Master Zone
 --------------------
 
 .. important:: Zones must be created on a Ceph Object Gateway node that will be
-               within the zone.
+   within the zone.
 
 
-Create a new master zone for the multi-site configuration by opening a
-command line interface on a host identified to serve in the master zone
-group and zone. Then, execute the following:
+Create a new master zone for the multi-site configuration by opening a command
+line interface on a host that serves in the master zonegroup and zone. Then
+run the following command:
 
 
-::
-
-    # radosgw-admin zone create --rgw-zonegroup={zone-group-name} \
-                                --rgw-zone={zone-name} \
-                                --master --default \
-                                --endpoints={http://fqdn}[,{http://fqdn}]
+.. prompt:: bash #
 
 
+   radosgw-admin zone create --rgw-zonegroup={zone-group-name} \
+                               --rgw-zone={zone-name} \
+                               --master --default \
+                               --endpoints={http://fqdn}[,{http://fqdn}]
 
 For example:
 
 
 For example:
 
-::
+.. prompt:: bash #
 
 
-    # radosgw-admin zone create --rgw-zonegroup=us --rgw-zone=us-east \
-                                --master --default \
-                                --endpoints={http://fqdn}[,{http://fqdn}]
+   radosgw-admin zone create --rgw-zonegroup=us --rgw-zone=us-east \
+                               --master --default \
+                               --endpoints={http://fqdn}[,{http://fqdn}]
 
 
 .. note:: The ``--access-key`` and ``--secret`` aren’t specified. These
           settings will be added to the zone once the user is created in the
           next section.
 
 
 
 .. note:: The ``--access-key`` and ``--secret`` aren’t specified. These
           settings will be added to the zone once the user is created in the
           next section.
 
-.. important:: The following steps assume a multi-site configuration using newly
-               installed systems that aren’t storing data yet. DO NOT DELETE the
-               ``default`` zone and its pools if you are already using it to store
-               data, or the data will be deleted and unrecoverable.
+.. important:: The following steps assume a multi-site configuration that uses
+   newly installed systems that aren’t storing data yet. DO NOT DELETE the
+   ``default`` zone and its pools if you are already using the zone to store
+   data, or the data will be deleted and unrecoverable.
 
 
-Delete Default Zone Group and Zone
+Delete Default Zonegroup and Zone
 ----------------------------------
 
 ----------------------------------
 
-Delete the ``default`` zone if it exists. Make sure to remove it from
-the default zone group first.
+#. Delete the ``default`` zone if it exists. Remove it from the default
+   zonegroup first.
 
 
-::
-
-    # radosgw-admin zonegroup remove --rgw-zonegroup=default --rgw-zone=default
-    # radosgw-admin period update --commit
-    # radosgw-admin zone rm --rgw-zone=default
-    # radosgw-admin period update --commit
-    # radosgw-admin zonegroup delete --rgw-zonegroup=default
-    # radosgw-admin period update --commit
+   .. prompt:: bash #
 
 
-Finally, delete the ``default`` pools in your Ceph storage cluster if
-they exist.
+      radosgw-admin zonegroup delete --rgw-zonegroup=default --rgw-zone=default
+      radosgw-admin period update --commit
+      radosgw-admin zone delete --rgw-zone=default
+      radosgw-admin period update --commit
+      radosgw-admin zonegroup delete --rgw-zonegroup=default
+      radosgw-admin period update --commit
 
 
-.. important:: The following step assumes a multi-site configuration using newly
-               installed systems that aren’t currently storing data. DO NOT DELETE
-               the ``default`` zone group if you are already using it to store
-               data.
+#. Delete the ``default`` pools in your Ceph storage cluster if they exist.
 
 
-::
+   .. important:: The following step assumes a multi-site configuration that uses newly installed systems that aren’t currently storing data. DO NOT DELETE the ``default`` zonegroup if you are already using it to store data.
 
 
-    # ceph osd pool rm default.rgw.control default.rgw.control --yes-i-really-really-mean-it
-    # ceph osd pool rm default.rgw.data.root default.rgw.data.root --yes-i-really-really-mean-it
-    # ceph osd pool rm default.rgw.gc default.rgw.gc --yes-i-really-really-mean-it
-    # ceph osd pool rm default.rgw.log default.rgw.log --yes-i-really-really-mean-it
-    # ceph osd pool rm default.rgw.users.uid default.rgw.users.uid --yes-i-really-really-mean-it
+   .. prompt:: bash #
+   
+      ceph osd pool rm default.rgw.control default.rgw.control --yes-i-really-really-mean-it
+      ceph osd pool rm default.rgw.data.root default.rgw.data.root --yes-i-really-really-mean-it
+      ceph osd pool rm default.rgw.gc default.rgw.gc --yes-i-really-really-mean-it
+      ceph osd pool rm default.rgw.log default.rgw.log --yes-i-really-really-mean-it
+      ceph osd pool rm default.rgw.users.uid default.rgw.users.uid --yes-i-really-really-mean-it
 
 Create a System User
 --------------------
 
 
 Create a System User
 --------------------
 
-The ``ceph-radosgw`` daemons must authenticate before pulling realm and
-period information. In the master zone, create a system user to
-facilitate authentication between daemons.
+#. The ``ceph-radosgw`` daemons must authenticate before pulling realm and
+   period information. In the master zone, create a "system user" to facilitate
+   authentication between daemons.
 
 
-::
+   .. prompt:: bash #
 
 
-    # radosgw-admin user create --uid="{user-name}" --display-name="{Display Name}" --system
+      radosgw-admin user create --uid="{user-name}" --display-name="{Display Name}" --system
 
 
-For example:
+   For example:
 
 
-::
+   .. prompt:: bash #
 
 
-    # radosgw-admin user create --uid="synchronization-user" --display-name="Synchronization User" --system
+      radosgw-admin user create --uid="synchronization-user" --display-name="Synchronization User" --system
 
 
-Make a note of the ``access_key`` and ``secret_key``, as the secondary
-zones will require them to authenticate with the master zone.
+#. Make a note of the ``access_key`` and ``secret_key``. The secondary zones
+   require them to authenticate against the master zone.
 
 
-Finally, add the system user to the master zone.
+#. Add the system user to the master zone:
 
 
-::
+   .. prompt:: bash #
 
 
-    # radosgw-admin zone modify --rgw-zone=us-east --access-key={access-key} --secret={secret}
-    # radosgw-admin period update --commit
+      radosgw-admin zone modify --rgw-zone={zone-name} --access-key={access-key} --secret={secret}
+      radosgw-admin period update --commit
 
 Update the Period
 -----------------
 
 After updating the master zone configuration, update the period.
 
 
 Update the Period
 -----------------
 
 After updating the master zone configuration, update the period.
 
-::
+.. prompt:: bash #
 
 
-    # radosgw-admin period update --commit
+   radosgw-admin period update --commit
 
 .. note:: Updating the period changes the epoch, and ensures that other zones
           will receive the updated configuration.
 
 .. note:: Updating the period changes the epoch, and ensures that other zones
           will receive the updated configuration.
@@ -321,114 +356,120 @@ Start the Gateway
 On the object gateway host, start and enable the Ceph Object Gateway
 service:
 
 On the object gateway host, start and enable the Ceph Object Gateway
 service:
 
-::
+.. prompt:: bash #
 
 
-    # systemctl start ceph-radosgw@rgw.`hostname -s`
-    # systemctl enable ceph-radosgw@rgw.`hostname -s`
+   systemctl start ceph-radosgw@rgw.`hostname -s`
+   systemctl enable ceph-radosgw@rgw.`hostname -s`
 
 .. _secondary-zone-label:
 
 
 .. _secondary-zone-label:
 
-Configure Secondary Zones
-=========================
-
-Zones within a zone group replicate all data to ensure that each zone
-has the same data. When creating the secondary zone, execute all of the
-following operations on a host identified to serve the secondary zone.
+Configuring Secondary Zones
+===========================
 
 
-.. note:: To add a third zone, follow the same procedures as for adding the
-          secondary zone. Use different zone name.
+Zones that are within a zonegroup replicate all data in order to ensure that
+every zone has the same data. When creating a secondary zone, run the following
+operations on a host identified to serve the secondary zone.
 
 
-.. important:: You must execute metadata operations, such as user creation, on a
-               host within the master zone. The master zone and the secondary zone
-               can receive bucket operations, but the secondary zone redirects
-               bucket operations to the master zone. If the master zone is down,
-               bucket operations will fail.
+.. note:: To add a second secondary zone (that is, a second non-master zone
+   within a zonegroup that already contains a secondary zone), follow :ref:`the
+   same procedures that are used for adding a secondary
+   zone<radosgw-multisite-secondary-zone-creating>`. Be sure to specify a
+   different zone name than the name of the first secondary zone.
 
 
-Pull the Realm
---------------
+.. important:: Metadata operations (for example, user creation) must be
+   run on a host within the master zone. Bucket operations can be received
+   by the master zone or the secondary zone, but the secondary zone will
+   redirect bucket operations to the master zone. If the master zone is down,
+   bucket operations will fail.
 
 
-Using the URL path, access key and secret of the master zone in the
-master zone group, pull the realm configuration to the host. To pull a
-non-default realm, specify the realm using the ``--rgw-realm`` or
-``--realm-id`` configuration options.
+Pulling the Realm Configuration
+-------------------------------
 
 
-::
+The URL path, access key, and secret of the master zone in the master zone
+group are used to pull the realm configuration to the host. When pulling the
+configuration of a non-default realm, specify the realm using the
+``--rgw-realm`` or ``--realm-id`` configuration options.
 
 
-    # radosgw-admin realm pull --url={url-to-master-zone-gateway} --access-key={access-key} --secret={secret}
+.. prompt:: bash #
 
 
-.. note:: Pulling the realm also retrieves the remote's current period
-          configuration, and makes it the current period on this host as well.
+   radosgw-admin realm pull --url={url-to-master-zone-gateway}
+   --access-key={access-key} --secret={secret}
 
 
-If this realm is the default realm or the only realm, make the realm the
-default realm.
+.. note:: Pulling the realm configuration also retrieves the remote's current
+   period configuration, and makes it the current period on this host as well.
 
 
-::
+If this realm is the only realm, run the following command to make it the
+default realm:
 
 
-    # radosgw-admin realm default --rgw-realm={realm-name}
+.. prompt:: bash #
 
 
-Create a Secondary Zone
------------------------
+   radosgw-admin realm default --rgw-realm={realm-name}
 
 
-.. important:: Zones must be created on a Ceph Object Gateway node that will be
-               within the zone.
+.. _radosgw-multisite-secondary-zone-creating:
 
 
-Create a secondary zone for the multi-site configuration by opening a
-command line interface on a host identified to serve the secondary zone.
-Specify the zone group ID, the new zone name and an endpoint for the
-zone. **DO NOT** use the ``--master`` or ``--default`` flags. In Kraken,
-all zones run in an active-active configuration by
-default; that is, a gateway client may write data to any zone and the
-zone will replicate the data to all other zones within the zone group.
-If the secondary zone should not accept write operations, specify the
-``--read-only`` flag to create an active-passive configuration between
-the master zone and the secondary zone. Additionally, provide the
-``access_key`` and ``secret_key`` of the generated system user stored in
-the master zone of the master zone group. Execute the following:
+Creating a Secondary Zone
+-------------------------
 
 
-::
+.. important:: When a zone is created, it must be on a Ceph Object Gateway node
+   within the zone.
 
 
-    # radosgw-admin zone create --rgw-zonegroup={zone-group-name}\
-                                --rgw-zone={zone-name} --endpoints={url} \
-                                --access-key={system-key} --secret={secret}\
+In order to create a secondary zone for the multi-site configuration, open a
+command line interface on a host identified to serve the secondary zone.
+Specify the zonegroup ID, the new zone name, and an endpoint for the zone.
+**DO NOT** use the ``--master`` or ``--default`` flags. Beginning in Kraken,
+all zones run in an active-active configuration by default, which means that a
+gateway client may write data to any zone and the zone will replicate the data
+to all other zones within the zonegroup.  If you want to prevent the secondary
+zone from accepting write operations, include the ``--read-only`` flag in the
+command in order to create an active-passive configuration between the master
+zone and the secondary zone. In any case, don't forget to provide the
+``access_key`` and ``secret_key`` of the generated system user that is stored
+in the master zone of the master zonegroup. Run the following command:
+
+.. prompt:: bash #
+
+   radosgw-admin zone create --rgw-zonegroup={zone-group-name} \
+                                --rgw-zone={zone-name} \
+                                --access-key={system-key} --secret={secret} \
                                 --endpoints=http://{fqdn}:80 \
                                 [--read-only]
 
 For example:
                                 --endpoints=http://{fqdn}:80 \
                                 [--read-only]
 
 For example:
+    
+    
+.. prompt:: bash #
 
 
-::
-
-    # radosgw-admin zone create --rgw-zonegroup=us --rgw-zone=us-west \
+   radosgw-admin zone create --rgw-zonegroup=us --rgw-zone=us-west \
                                 --access-key={system-key} --secret={secret} \
                                 --endpoints=http://rgw2:80
 
                                 --access-key={system-key} --secret={secret} \
                                 --endpoints=http://rgw2:80
 
-.. important:: The following steps assume a multi-site configuration using newly
-               installed systems that aren’t storing data. **DO NOT DELETE** the
-               ``default`` zone and its pools if you are already using it to store
-               data, or the data will be lost and unrecoverable.
+.. important:: The following steps assume a multi-site configuration that uses
+   newly installed systems that have not yet begun storing data. **DO NOT
+   DELETE the ``default`` zone or its pools** if you are already using it to
+   store data, or the data will be irretrievably lost.
 
 
-Delete the default zone if needed.
+Delete the default zone if needed:
 
 
-::
-
-    # radosgw-admin zone rm --rgw-zone=default
+.. prompt:: bash #
 
 
-Finally, delete the default pools in your Ceph storage cluster if
-needed.
+   radosgw-admin zone delete --rgw-zone=default
 
 
-::
+Finally, delete the default pools in your Ceph storage cluster if needed:
 
 
-    # ceph osd pool rm default.rgw.control default.rgw.control --yes-i-really-really-mean-it
-    # ceph osd pool rm default.rgw.data.root default.rgw.data.root --yes-i-really-really-mean-it
-    # ceph osd pool rm default.rgw.gc default.rgw.gc --yes-i-really-really-mean-it
-    # ceph osd pool rm default.rgw.log default.rgw.log --yes-i-really-really-mean-it
-    # ceph osd pool rm default.rgw.users.uid default.rgw.users.uid --yes-i-really-really-mean-it
+.. prompt:: bash #
 
 
-Update the Ceph Configuration File
-----------------------------------
+   ceph osd pool rm default.rgw.control default.rgw.control --yes-i-really-really-mean-it
+   ceph osd pool rm default.rgw.data.root default.rgw.data.root --yes-i-really-really-mean-it
+   ceph osd pool rm default.rgw.gc default.rgw.gc --yes-i-really-really-mean-it
+   ceph osd pool rm default.rgw.log default.rgw.log --yes-i-really-really-mean-it
+   ceph osd pool rm default.rgw.users.uid default.rgw.users.uid --yes-i-really-really-mean-it
+   
+Updating the Ceph Configuration File
+------------------------------------
 
 
-Update the Ceph configuration file on the secondary zone hosts by adding
-the ``rgw_zone`` configuration option and the name of the secondary zone
-to the instance entry.
+To update the Ceph configuration file on the secondary zone hosts, add the
+``rgw_zone`` configuration option and the name of the secondary zone to the
+instance entry.
 
 ::
 
 
 ::
 
@@ -445,42 +486,41 @@ For example:
     rgw frontends = "civetweb port=80"
     rgw_zone=us-west
 
     rgw frontends = "civetweb port=80"
     rgw_zone=us-west
 
-Update the Period
------------------
+Updating the Period
+-------------------
 
 
-After updating the master zone configuration, update the period.
+After updating the master zone configuration, update the period:
 
 
-::
+.. prompt:: bash #
 
 
-    # radosgw-admin period update --commit
+   radosgw-admin period update --commit
 
 .. note:: Updating the period changes the epoch, and ensures that other zones
 
 .. note:: Updating the period changes the epoch, and ensures that other zones
-          will receive the updated configuration.
-
-Start the Gateway
------------------
+   will receive the updated configuration.
+          
+Starting the Gateway
+--------------------
 
 
-On the object gateway host, start and enable the Ceph Object Gateway
-service:
+To start the gateway, start and enable the Ceph Object Gateway service by
+running the following commands on the object gateway host:
 
 
-::
+.. prompt:: bash #
 
 
-    # systemctl start ceph-radosgw@rgw.`hostname -s`
-    # systemctl enable ceph-radosgw@rgw.`hostname -s`
+   systemctl start ceph-radosgw@rgw.`hostname -s`
+   systemctl enable ceph-radosgw@rgw.`hostname -s`
 
 
-Check Synchronization Status
-----------------------------
+Checking Synchronization Status
+-------------------------------
 
 
-Once the secondary zone is up and running, check the synchronization
-status. Synchronization copies users and buckets created in the master
-zone to the secondary zone.
+After the secondary zone is up and running, you can check the synchronization
+status. The process of synchronization will copy users and buckets that were
+created in the master zone from the master zone to the secondary zone.
 
 
-::
+.. prompt:: bash #
 
 
-    # radosgw-admin sync status
+   radosgw-admin sync status
 
 
-The output will provide the status of synchronization operations. For
-example:
+The output reports the status of synchronization operations. For example:
 
 ::
 
 
 ::
 
@@ -498,21 +538,23 @@ example:
                           data is caught up with source
 
 .. note:: Secondary zones accept bucket operations; however, secondary zones
                           data is caught up with source
 
 .. note:: Secondary zones accept bucket operations; however, secondary zones
-          redirect bucket operations to the master zone and then synchronize
-          with the master zone to receive the result of the bucket operations.
-          If the master zone is down, bucket operations executed on the
-          secondary zone will fail, but object operations should succeed.
-
-Verification of an Object
--------------------------
-
-By default, the objects are not verified again after the synchronization of an
-object was successful. To enable that, you can set :confval:`rgw_sync_obj_etag_verify`
-to ``true``. After enabling the optional objects that will be synchronized
-going forward, an additional MD5 checksum will verify that it is computed on
-the source and the destination. This is to ensure the integrity of the objects
-fetched from a remote server over HTTP including multisite sync. This option
-can decrease the performance of your RGW as more computation is needed.
+   redirect bucket operations to the master zone and then synchronize with the
+   master zone to receive the result of the bucket operations. If the master
+   zone is down, bucket operations executed on the secondary zone will fail,
+   but object operations should succeed.
+          
+          
+Verifying an Object
+-------------------
+
+By default, after the successful synchronization of an object there is no
+subsequent verification of the object. However, you can enable verification by
+setting :confval:`rgw_sync_obj_etag_verify` to ``true``. After this value is
+set to true, an MD5 checksum is used to verify the integrity of the data that
+was transferred from the source to the destination. This ensures the integrity
+of any object that has been fetched from a remote server over HTTP (including
+multisite sync). This option may decrease the performance of your RGW because
+it requires more computation.
 
 
 Maintenance
 
 
 Maintenance
@@ -521,9 +563,14 @@ Maintenance
 Checking the Sync Status
 ------------------------
 
 Checking the Sync Status
 ------------------------
 
-Information about the replication status of a zone can be queried with::
+Information about the replication status of a zone can be queried with:
+
+.. prompt:: bash $
+
+   radosgw-admin sync status
+
+::
 
 
-    $ radosgw-admin sync status
             realm b3bc1c37-9c44-4b89-a03b-04c269bea5da (earth)
         zonegroup f54f9b22-b4b6-4a0e-9211-fa6ac1693f49 (us)
              zone adce11c9-b8ed-4a90-8bc5-3fc029ff0816 (us-2)
             realm b3bc1c37-9c44-4b89-a03b-04c269bea5da (earth)
         zonegroup f54f9b22-b4b6-4a0e-9211-fa6ac1693f49 (us)
              zone adce11c9-b8ed-4a90-8bc5-3fc029ff0816 (us-2)
@@ -543,247 +590,262 @@ Information about the replication status of a zone can be queried with::
                           incremental sync: 128/128 shards
                           data is caught up with source
 
                           incremental sync: 128/128 shards
                           data is caught up with source
 
-The output can differ depending on the sync status. The shards are described
-as two different types during sync:
+The output might be different, depending on the sync status. During sync, the
+shards are of two types:
 
 
-- **Behind shards** are shards that need a full data sync and shards needing
-  an incremental data sync because they are not up-to-date.
+- **Behind shards** are shards that require a data sync (either a full data
+  sync or an incremental data sync) in order to be brought up to date.
 
 
-- **Recovery shards** are shards that encountered an error during sync and marked
-  for retry. The error mostly occurs on minor issues like acquiring a lock on
-  a bucket. This will typically resolve itself.
+- **Recovery shards** are shards that encountered an error during sync and have
+  been marked for retry. The error occurs mostly on minor issues, such as
+  acquiring a lock on a bucket. Errors of this kind typically resolve on their
+  own.
 
 Check the logs
 --------------
 
 
 Check the logs
 --------------
 
-For multi-site only, you can check out the metadata log (``mdlog``),
-the bucket index log (``bilog``) and the data log (``datalog``).
-You can list them and also trim them which is not needed in most cases as
-:confval:`rgw_sync_log_trim_interval` is set to 20 minutes as default. If it isn't manually
-set to 0, you shouldn't have to trim it at any time as it could cause side effects otherwise.
+For multi-site deployments only, you can examine the metadata log (``mdlog``),
+the bucket index log (``bilog``), and the data log (``datalog``).  You can list
+them and also trim them. Trimming is not needed in most cases because
+:confval:`rgw_sync_log_trim_interval` is set to 20 minutes by default. It
+should not be necessary to trim the logs unless
+:confval:`rgw_sync_log_trim_interval` has been manually set to 0.
 
 Changing the Metadata Master Zone
 ---------------------------------
 
 
 Changing the Metadata Master Zone
 ---------------------------------
 
-.. important:: Care must be taken when changing which zone is the metadata
-               master. If a zone has not finished syncing metadata from the current master
-               zone, it will be unable to serve any remaining entries when promoted to
-               master and those changes will be lost. For this reason, waiting for a
-               zone's ``radosgw-admin sync status`` to catch up on metadata sync before
-               promoting it to master is recommended.
+.. important:: Care must be taken when changing the metadata master zone by
+   promoting a zone to master. A zone that isn't finished syncing metadata from
+   the current master zone will be unable to serve any remaining entries if it
+   is promoted to master, and those metadata changes will be lost. For this
+   reason, we recommend waiting for a zone's ``radosgw-admin sync status`` to
+   complete the process of synchronizing the metadata before promoting the zone
+   to master.
 
 
-               Similarly, if changes to metadata are being processed by the current master
-               zone while another zone is being promoted to master, those changes are
-               likely to be lost. To avoid this, shutting down any ``radosgw`` instances
-               on the previous master zone is recommended. After promoting another zone,
-               its new period can be fetched with ``radosgw-admin period pull`` and the
-               gateway(s) can be restarted.
+Similarly, if the current master zone is processing changes to metadata at the
+same time that another zone is being promoted to master, these changes are
+likely to be lost. To avoid losing these changes, we recommend shutting down
+any ``radosgw`` instances on the previous master zone. After the new master
+zone has been promoted, the previous master zone's new period can be fetched
+with ``radosgw-admin period pull`` and the gateway(s) can be restarted.
 
 
-To promote a zone (for example, zone ``us-2`` in zonegroup ``us``) to metadata
-master, run the following commands on that zone::
+To promote a zone to metadata master, run the following commands on that zone
+(in this example, the zone is zone ``us-2`` in zonegroup ``us``):
 
 
-  $ radosgw-admin zone modify --rgw-zone=us-2 --master
-  $ radosgw-admin zonegroup modify --rgw-zonegroup=us --master
-  $ radosgw-admin period update --commit
+.. prompt:: bash $
 
 
-This will generate a new period, and the radosgw instance(s) in zone ``us-2``
-will send this period to other zones.
+   radosgw-admin zone modify --rgw-zone=us-2 --master
+   radosgw-admin zonegroup modify --rgw-zonegroup=us --master
+   radosgw-admin period update --commit
+
+This generates a new period, and the radosgw instance(s) in zone ``us-2`` sends
+this period to other zones.
 
 Failover and Disaster Recovery
 ==============================
 
 
 Failover and Disaster Recovery
 ==============================
 
-If the master zone should fail, failover to the secondary zone for
-disaster recovery.
+Setting Up Failover to the Secondary Zone
+-----------------------------------------
 
 
-1. Make the secondary zone the master and default zone. For example:
+If the master zone fails, you can fail over to the secondary zone for
+disaster recovery by following these steps:
 
 
-   ::
+#. Make the secondary zone the master and default zone. For example:
 
 
-       # radosgw-admin zone modify --rgw-zone={zone-name} --master --default
+   .. prompt:: bash #
 
 
-   By default, Ceph Object Gateway will run in an active-active
-   configuration. If the cluster was configured to run in an
+      radosgw-admin zone modify --rgw-zone={zone-name} --master --default
+
+   By default, Ceph Object Gateway runs in an active-active
+   configuration. However, if the cluster is configured to run in an
    active-passive configuration, the secondary zone is a read-only zone.
    active-passive configuration, the secondary zone is a read-only zone.
-   Remove the ``--read-only`` status to allow the zone to receive write
-   operations. For example:
+   To allow the secondary zone to receive write
+   operations, remove its ``--read-only`` status. For example:
 
 
-   ::
+   .. prompt:: bash #
 
 
-       # radosgw-admin zone modify --rgw-zone={zone-name} --master --default \
+      radosgw-admin zone modify --rgw-zone={zone-name} --master --default \
                                    --read-only=false
 
                                    --read-only=false
 
-2. Update the period to make the changes take effect.
+#. Update the period to make the changes take effect.
 
 
-   ::
+   .. prompt:: bash #
 
 
-       # radosgw-admin period update --commit
+      radosgw-admin period update --commit
 
 
-3. Finally, restart the Ceph Object Gateway.
+#. Finally, restart the Ceph Object Gateway.
 
 
-   ::
+   .. prompt:: bash #
 
 
-       # systemctl restart ceph-radosgw@rgw.`hostname -s`
+      systemctl restart ceph-radosgw@rgw.`hostname -s`
 
 
-If the former master zone recovers, revert the operation.
+Reverting from Failover
+-----------------------
 
 
-1. From the recovered zone, pull the latest realm configuration
-   from the current master zone.
+If the former master zone recovers, you can revert the failover operation by following these steps:
 
 
-   ::
+#. From within the recovered zone, pull the latest realm configuration
+   from the current master zone:
 
 
-       # radosgw-admin realm pull --url={url-to-master-zone-gateway} \
+   .. prompt:: bash #
+
+      radosgw-admin realm pull --url={url-to-master-zone-gateway} \
                                   --access-key={access-key} --secret={secret}
 
                                   --access-key={access-key} --secret={secret}
 
-2. Make the recovered zone the master and default zone.
+#. Make the recovered zone the master and default zone:
 
 
-   ::
+   .. prompt:: bash #
 
 
-       # radosgw-admin zone modify --rgw-zone={zone-name} --master --default
+      radosgw-admin zone modify --rgw-zone={zone-name} --master --default
 
 
-3. Update the period to make the changes take effect.
+#. Update the period so that the changes take effect:
 
 
-   ::
+   .. prompt:: bash #
 
 
-       # radosgw-admin period update --commit
+      radosgw-admin period update --commit
 
 
-4. Then, restart the Ceph Object Gateway in the recovered zone.
+#. Restart the Ceph Object Gateway in the recovered zone:
 
 
-   ::
+   .. prompt:: bash #
 
 
-       systemctl restart ceph-radosgw@rgw.`hostname -s`
+       systemctl restart ceph-radosgw@rgw.`hostname -s`
 
 
-5. If the secondary zone needs to be a read-only configuration, update
-   the secondary zone.
+#. If the secondary zone needs to be a read-only configuration, update
+   the secondary zone:
 
 
-   ::
+   .. prompt:: bash #
 
 
-       # radosgw-admin zone modify --rgw-zone={zone-name} --read-only
+      radosgw-admin zone modify --rgw-zone={zone-name} --read-only
 
 
-6. Update the period to make the changes take effect.
+#. Update the period so that the changes take effect:
 
 
-   ::
+   .. prompt:: bash #
 
 
-       # radosgw-admin period update --commit
+      radosgw-admin period update --commit
 
 
-7. Finally, restart the Ceph Object Gateway in the secondary zone.
+#. Restart the Ceph Object Gateway in the secondary zone:
 
 
-   ::
+   .. prompt:: bash #
 
 
-       # systemctl restart ceph-radosgw@rgw.`hostname -s`
+      systemctl restart ceph-radosgw@rgw.`hostname -s`
 
 .. _rgw-multisite-migrate-from-single-site:
 
 
 .. _rgw-multisite-migrate-from-single-site:
 
-Migrating a Single Site System to Multi-Site
-============================================
+Migrating a Single-Site Deployment to Multi-Site
+=================================================
 
 
-To migrate from a single site system with a ``default`` zone group and
-zone to a multi site system, use the following steps:
+To migrate from a single-site deployment with a ``default`` zonegroup and zone
+to a multi-site system, follow these steps:
 
 
-1. Create a realm. Replace ``<name>`` with the realm name.
+1. Create a realm. Replace ``<name>`` with the realm name:
 
 
-   ::
+   .. prompt:: bash #
 
 
-       # radosgw-admin realm create --rgw-realm=<name> --default
+      radosgw-admin realm create --rgw-realm=<name> --default
 
 
-2. Rename the default zone and zonegroup. Replace ``<name>`` with the
-   zonegroup or zone name.
+2. Rename the default zonegroup and zone. Replace ``<name>`` with the zone name
+   or zonegroup name:
 
 
-   ::
+   .. prompt:: bash #
 
 
-       # radosgw-admin zonegroup rename --rgw-zonegroup default --zonegroup-new-name=<name>
-       # radosgw-admin zone rename --rgw-zone default --zone-new-name us-east-1 --rgw-zonegroup=<name>
+      radosgw-admin zonegroup rename --rgw-zonegroup default --zonegroup-new-name=<name>
+      radosgw-admin zone rename --rgw-zone default --zone-new-name us-east-1 --rgw-zonegroup=<name>
 
 
-3. Configure the master zonegroup. Replace ``<name>`` with the realm or
-   zonegroup name. Replace ``<fqdn>`` with the fully qualified domain
-   name(s) in the zonegroup.
+3. Configure the master zonegroup. Replace ``<name>`` with the realm name or
+   zonegroup name. Replace ``<fqdn>`` with the fully qualified domain name(s)
+   in the zonegroup:
 
 
-   ::
+   .. prompt:: bash #
 
 
-       # radosgw-admin zonegroup modify --rgw-realm=<name> --rgw-zonegroup=<name> --endpoints http://<fqdn>:80 --master --default
+      radosgw-admin zonegroup modify --rgw-realm=<name> --rgw-zonegroup=<name> --endpoints http://<fqdn>:80 --master --default
 
 
-4. Configure the master zone. Replace ``<name>`` with the realm,
-   zonegroup or zone name. Replace ``<fqdn>`` with the fully qualified
-   domain name(s) in the zonegroup.
+4. Configure the master zone. Replace ``<name>`` with the realm name, zone
+   name, or zonegroup name. Replace ``<fqdn>`` with the fully qualified domain
+   name(s) in the zonegroup:
 
 
-   ::
+   .. prompt:: bash #
 
 
-       # radosgw-admin zone modify --rgw-realm=<name> --rgw-zonegroup=<name> \
-                                   --rgw-zone=<name> --endpoints http://<fqdn>:80 \
-                                   --access-key=<access-key> --secret=<secret-key> \
-                                   --master --default
+      radosgw-admin zone modify --rgw-realm=<name> --rgw-zonegroup=<name> \
+                                --rgw-zone=<name> --endpoints http://<fqdn>:80 \
+                                --access-key=<access-key> --secret=<secret-key> \
+                                --master --default
 
 
-5. Create a system user. Replace ``<user-id>`` with the username.
-   Replace ``<display-name>`` with a display name. It may contain
-   spaces.
+5. Create a system user. Replace ``<user-id>`` with the username.  Replace
+   ``<display-name>`` with a display name. The display name is allowed to
+   contain spaces:
 
 
-   ::
+   .. prompt:: bash #
 
 
-       # radosgw-admin user create --uid=<user-id> --display-name="<display-name>"\
-                                   --access-key=<access-key> --secret=<secret-key> --system
+      radosgw-admin user create --uid=<user-id> \
+      --display-name="<display-name>" \ 
+      --access-key=<access-key> \ 
+      --secret=<secret-key> --system
 
 
-6. Commit the updated configuration.
+6. Commit the updated configuration:
 
 
-   ::
+   .. prompt:: bash #
 
 
-       # radosgw-admin period update --commit
+      radosgw-admin period update --commit
 
 
-7. Finally, restart the Ceph Object Gateway.
+7. Restart the Ceph Object Gateway:
 
 
-   ::
+   .. prompt:: bash #
 
 
-       # systemctl restart ceph-radosgw@rgw.`hostname -s`
+      systemctl restart ceph-radosgw@rgw.`hostname -s`
 
 After completing this procedure, proceed to `Configure a Secondary
 
 After completing this procedure, proceed to `Configure a Secondary
-Zone <#configure-secondary-zones>`__ to create a secondary zone
-in the master zone group.
-
+Zone <#configure-secondary-zones>`_ and create a secondary zone
+in the master zonegroup.
 
 Multi-Site Configuration Reference
 ==================================
 
 The following sections provide additional details and command-line
 
 Multi-Site Configuration Reference
 ==================================
 
 The following sections provide additional details and command-line
-usage for realms, periods, zone groups and zones.
+usage for realms, periods, zonegroups and zones.
+
+For more details on every available configuration option, see
+``src/common/options/rgw.yaml.in``.  
 
 
-For more details on every available configuration option, please check out
-``src/common/options/rgw.yaml.in`` or go to the more comfortable :ref:`mgr-dashboard`
-configuration page (found under `Cluster`) where you can view and set all
-options easily. On the page, set the level to ``advanced`` and search for RGW,
-to see all basic and advanced configuration options with a short description.
-Expand the details of an option to reveal a longer description.
+Alternatively, go to the :ref:`mgr-dashboard` configuration page (found under
+`Cluster`), where you can view and set all of the options. While on the page,
+set the level to ``advanced`` and search for RGW to see all basic and advanced
+configuration options. 
+
+.. _rgw-realms:
 
 Realms
 ------
 
 
 Realms
 ------
 
-A realm represents a globally unique namespace consisting of one or more
-zonegroups containing one or more zones, and zones containing buckets,
-which in turn contain objects. A realm enables the Ceph Object Gateway
-to support multiple namespaces and their configuration on the same
-hardware.
+A realm is a globally unique namespace that consists of one or more zonegroups.
+Zonegroups contain one or more zones. Zones contain buckets. Buckets contain
+objects. 
+
+Realms make it possible for the Ceph Object Gateway to support multiple
+namespaces and their configurations on the same hardware.
 
 
-A realm contains the notion of periods. Each period represents the state
-of the zone group and zone configuration in time. Each time you make a
-change to a zonegroup or zone, update the period and commit it.
+Each realm is associated with a "period". A period represents the state
+of the zonegroup and zone configuration in time. Each time you make a
+change to a zonegroup or zone, you should update and commit the period.
 
 
-By default, the Ceph Object Gateway does not create a realm
-for backward compatibility with Infernalis and earlier releases.
-However, as a best practice, we recommend creating realms for new
-clusters.
+To ensure backward compatibility with Infernalis and earlier releases, the Ceph
+Object Gateway does not by default create a realm. However, as a best practice,
+we recommend that you create realms when creating new clusters.
 
 Create a Realm
 ~~~~~~~~~~~~~~
 
 
 Create a Realm
 ~~~~~~~~~~~~~~
 
-To create a realm, execute ``realm create`` and specify the realm name.
+To create a realm, run ``realm create`` and specify the realm name.
 If the realm is the default, specify ``--default``.
 
 If the realm is the default, specify ``--default``.
 
-::
+.. prompt:: bash #
 
 
-    # radosgw-admin realm create --rgw-realm={realm-name} [--default]
+   radosgw-admin realm create --rgw-realm={realm-name} [--default]
 
 For example:
 
 
 For example:
 
-::
+.. prompt:: bash #
 
 
-    # radosgw-admin realm create --rgw-realm=movies --default
+   radosgw-admin realm create --rgw-realm=movies --default
 
 By specifying ``--default``, the realm will be called implicitly with
 each ``radosgw-admin`` call unless ``--rgw-realm`` and the realm name
 
 By specifying ``--default``, the realm will be called implicitly with
 each ``radosgw-admin`` call unless ``--rgw-realm`` and the realm name
@@ -792,14 +854,14 @@ are explicitly provided.
 Make a Realm the Default
 ~~~~~~~~~~~~~~~~~~~~~~~~
 
 Make a Realm the Default
 ~~~~~~~~~~~~~~~~~~~~~~~~
 
-One realm in the list of realms should be the default realm. There may
-be only one default realm. If there is only one realm and it wasn’t
-specified as the default realm when it was created, make it the default
-realm. Alternatively, to change which realm is the default, execute:
+One realm in the list of realms should be the default realm. There may be only
+one default realm. If there is only one realm and it wasn’t specified as the
+default realm when it was created, make it the default realm. Alternatively, to
+change which realm is the default, run the following command:
 
 
-::
+.. prompt:: bash #
 
 
-    # radosgw-admin realm default --rgw-realm=movies
+   radosgw-admin realm default --rgw-realm=movies
 
 .. note:: When the realm is default, the command line assumes
    ``--rgw-realm=<realm-name>`` as an argument.
 
 .. note:: When the realm is default, the command line assumes
    ``--rgw-realm=<realm-name>`` as an argument.
@@ -807,34 +869,32 @@ realm. Alternatively, to change which realm is the default, execute:
 Delete a Realm
 ~~~~~~~~~~~~~~
 
 Delete a Realm
 ~~~~~~~~~~~~~~
 
-To delete a realm, execute ``realm rm`` and specify the realm name.
+To delete a realm, run ``realm rm`` and specify the realm name:
 
 
-::
+.. prompt:: bash #
 
 
-    # radosgw-admin realm rm --rgw-realm={realm-name}
+   radosgw-admin realm rm --rgw-realm={realm-name}
 
 For example:
 
 
 For example:
 
-::
-
-    # radosgw-admin realm rm --rgw-realm=movies
+.. prompt:: bash #
+   
+   radosgw-admin realm rm --rgw-realm=movies
 
 Get a Realm
 ~~~~~~~~~~~
 
 
 Get a Realm
 ~~~~~~~~~~~
 
-To get a realm, execute ``realm get`` and specify the realm name.
+To get a realm, run ``realm get`` and specify the realm name:
 
 
-::
+.. prompt:: bash #
 
 
-    #radosgw-admin realm get --rgw-realm=<name>
+   radosgw-admin realm get --rgw-realm=<name>
 
 For example:
 
 
 For example:
 
-::
-
-    # radosgw-admin realm get --rgw-realm=movies [> filename.json]
+.. prompt:: bash #
 
 
-The CLI will echo a JSON object with the realm properties.
+   radosgw-admin realm get --rgw-realm=movies [> filename.json]
 
 ::
 
 
 ::
 
@@ -845,192 +905,202 @@ The CLI will echo a JSON object with the realm properties.
         "epoch": 1
     }
 
         "epoch": 1
     }
 
-Use ``>`` and an output file name to output the JSON object to a file.
-
 Set a Realm
 ~~~~~~~~~~~
 
 Set a Realm
 ~~~~~~~~~~~
 
-To set a realm, execute ``realm set``, specify the realm name, and
-``--infile=`` with an input file name.
+To set a realm, run ``realm set``, specify the realm name, and use the
+``--infile=`` option (make sure that  the ``--infile`` option has an input file
+name as an argument):
 
 
-::
+.. prompt:: bash #
 
 
-    #radosgw-admin realm set --rgw-realm=<name> --infile=<infilename>
+   radosgw-admin realm set --rgw-realm=<name> --infile=<infilename>
 
 For example:
 
 
 For example:
 
-::
+.. prompt:: bash #
 
 
-    # radosgw-admin realm set --rgw-realm=movies --infile=filename.json
+   radosgw-admin realm set --rgw-realm=movies --infile=filename.json
 
 List Realms
 ~~~~~~~~~~~
 
 
 List Realms
 ~~~~~~~~~~~
 
-To list realms, execute ``realm list``.
+To list realms, run ``realm list``:
 
 
-::
+.. prompt:: bash #
 
 
-    # radosgw-admin realm list
+   radosgw-admin realm list
 
 List Realm Periods
 ~~~~~~~~~~~~~~~~~~
 
 
 List Realm Periods
 ~~~~~~~~~~~~~~~~~~
 
-To list realm periods, execute ``realm list-periods``.
+To list realm periods, run ``realm list-periods``:
 
 
-::
+.. prompt:: bash #
 
 
-    # radosgw-admin realm list-periods
+   radosgw-admin realm list-periods
 
 Pull a Realm
 ~~~~~~~~~~~~
 
 
 Pull a Realm
 ~~~~~~~~~~~~
 
-To pull a realm from the node containing the master zone group and
-master zone to a node containing a secondary zone group or zone, execute
-``realm pull`` on the node that will receive the realm configuration.
+To pull a realm from the node that contains both the master zonegroup and
+master zone to a node that contains a secondary zonegroup or zone, run ``realm
+pull`` on the node that will receive the realm configuration:
 
 
-::
+.. prompt:: bash #
 
 
-    # radosgw-admin realm pull --url={url-to-master-zone-gateway} --access-key={access-key} --secret={secret}
+   radosgw-admin realm pull --url={url-to-master-zone-gateway} --access-key={access-key} --secret={secret}
 
 Rename a Realm
 ~~~~~~~~~~~~~~
 
 
 Rename a Realm
 ~~~~~~~~~~~~~~
 
-A realm is not part of the period. Consequently, renaming the realm is
-only applied locally, and will not get pulled with ``realm pull``. When
-renaming a realm with multiple zones, run the command on each zone. To
-rename a realm, execute the following:
+A realm is not part of the period. Consequently, any renaming of the realm is
+applied only locally, and will therefore not get pulled when you run ``realm
+pull``. If you are renaming a realm that contains multiple zones, run the
+``rename`` command on each zone. 
 
 
-::
+To rename a realm, run the following:
 
 
-    # radosgw-admin realm rename --rgw-realm=<current-name> --realm-new-name=<new-realm-name>
+.. prompt:: bash #
 
 
-.. note:: DO NOT use ``realm set`` to change the ``name`` parameter. That
-          changes the internal name only. Specifying ``--rgw-realm`` would
-          still use the old realm name.
+   radosgw-admin realm rename --rgw-realm=<current-name> --realm-new-name=<new-realm-name>
 
 
-Zone Groups
+.. note:: DO NOT use ``realm set`` to change the ``name`` parameter. Doing so
+   changes the internal name only. If you use ``realm set`` to change the
+   ``name`` parameter, then ``--rgw-realm`` still expects the realm's old name.
+
+Zonegroups
 -----------
 
 -----------
 
-The Ceph Object Gateway supports multi-site deployments and a global
-namespace by using the notion of zone groups. Formerly called a region
-in Infernalis, a zone group defines the geographic location of one or more Ceph
-Object Gateway instances within one or more zones.
+Zonegroups make it possible for the Ceph Object Gateway to support multi-site
+deployments and a global namespace. Zonegroups were formerly called "regions"
+(in releases prior to and including Infernalis). 
 
 
-Configuring zone groups differs from typical configuration procedures,
-because not all of the settings end up in a Ceph configuration file. You
-can list zone groups, get a zone group configuration, and set a zone
-group configuration.
+A zonegroup defines the geographic location of one or more Ceph Object Gateway
+instances within one or more zones.
 
 
-Create a Zone Group
-~~~~~~~~~~~~~~~~~~~
+The configuration of zonegroups differs from typical configuration procedures,
+because not all of the zonegroup configuration settings are stored to a
+configuration file. 
 
 
-Creating a zone group consists of specifying the zone group name.
-Creating a zone assumes it will live in the default realm unless
-``--rgw-realm=<realm-name>`` is specified. If the zonegroup is the
-default zonegroup, specify the ``--default`` flag. If the zonegroup is
-the master zonegroup, specify the ``--master`` flag. For example:
+You can list zonegroups, get a zonegroup configuration, and set a zonegroup
+configuration.
 
 
-::
+Creating a Zonegroup
+~~~~~~~~~~~~~~~~~~~~
 
 
-    # radosgw-admin zonegroup create --rgw-zonegroup=<name> [--rgw-realm=<name>][--master] [--default]
+Creating a zonegroup consists of specifying the zonegroup name. Newly created
+zones reside in the default realm unless a different realm is specified by
+using the option ``--rgw-realm=<realm-name>``. 
 
 
+If the zonegroup is the default zonegroup, specify the ``--default`` flag. If
+the zonegroup is the master zonegroup, specify the ``--master`` flag. For
+example:
 
 
-.. note:: Use ``zonegroup modify --rgw-zonegroup=<zonegroup-name>`` to modify
-          an existing zone group’s settings.
+.. prompt:: bash #
 
 
-Make a Zone Group the Default
-~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+   radosgw-admin zonegroup create --rgw-zonegroup=<name> [--rgw-realm=<name>][--master] [--default]
 
 
-One zonegroup in the list of zonegroups should be the default zonegroup.
-There may be only one default zonegroup. If there is only one zonegroup
-and it wasn’t specified as the default zonegroup when it was created,
-make it the default zonegroup. Alternatively, to change which zonegroup
-is the default, execute:
 
 
-::
+.. note:: Use ``zonegroup modify --rgw-zonegroup=<zonegroup-name>`` to modify
+          an existing zonegroup’s settings.
 
 
-    # radosgw-admin zonegroup default --rgw-zonegroup=comedy
+Making a Zonegroup the Default
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 
 
-.. note:: When the zonegroup is default, the command line assumes
-          ``--rgw-zonegroup=<zonegroup-name>`` as an argument.
+One zonegroup in the list of zonegroups must be the default zonegroup.  There
+can be only one default zonegroup. In the case that there is only one zonegroup
+which was not designated the default zonegroup when it was created, use the
+folloiwng command to make it the default zonegroup. Commands of this form can
+be used to change which zonegroup is the default. 
 
 
-Then, update the period:
+#. Designate a zonegroup as the default zonegroup:
 
 
-::
+   .. prompt:: bash #
 
 
-    # radosgw-admin period update --commit
+      radosgw-admin zonegroup default --rgw-zonegroup=comedy
 
 
-Add a Zone to a Zone Group
-~~~~~~~~~~~~~~~~~~~~~~~~~~
+   .. note:: When the zonegroup is default, the command line assumes that the name of the zonegroup will be the argument of the ``--rgw-zonegroup=<zonegroup-name>`` option. (In this example, ``<zonegroup-name>`` has been retained for the sake of consistency and legibility.)
 
 
-To add a zone to a zonegroup, execute the following:
+#. Update the period:
 
 
-::
+   .. prompt:: bash #
 
 
-    # radosgw-admin zonegroup add --rgw-zonegroup=<name> --rgw-zone=<name>
+      radosgw-admin period update --commit
 
 
-Then, update the period:
+Adding a Zone to a Zonegroup
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 
 
-::
+This procedure explains how to add a zone to a zonegroup.
 
 
-    # radosgw-admin period update --commit
+#. Run the following command to add a zone to a zonegroup: 
 
 
-Remove a Zone from a Zone Group
-~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+   .. prompt:: bash #
 
 
-To remove a zone from a zonegroup, execute the following:
+      radosgw-admin zonegroup add --rgw-zonegroup=<name> --rgw-zone=<name>
 
 
-::
+#. Update the period:
 
 
-    # radosgw-admin zonegroup remove --rgw-zonegroup=<name> --rgw-zone=<name>
+   .. prompt:: bash #
 
 
-Then, update the period:
+      radosgw-admin period update --commit
 
 
-::
+Removing a Zone from a Zonegroup
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 
 
-    # radosgw-admin period update --commit
+#. Run this command to remove a zone from a zonegroup:
 
 
-Rename a Zone Group
-~~~~~~~~~~~~~~~~~~~
+   .. prompt:: bash #
 
 
-To rename a zonegroup, execute the following:
+      radosgw-admin zonegroup remove --rgw-zonegroup=<name> --rgw-zone=<name>
 
 
-::
+#. Update the period:
 
 
-    # radosgw-admin zonegroup rename --rgw-zonegroup=<name> --zonegroup-new-name=<name>
+   .. prompt:: bash #
 
 
-Then, update the period:
+      radosgw-admin period update --commit
 
 
-::
+Renaming a Zonegroup
+~~~~~~~~~~~~~~~~~~~~
 
 
-    # radosgw-admin period update --commit
+#. Run this command to rename the zonegroup:
 
 
-Delete a Zone Group
-~~~~~~~~~~~~~~~~~~~
+   .. prompt:: bash #
 
 
-To delete a zonegroup, execute the following:
+      radosgw-admin zonegroup rename --rgw-zonegroup=<name> --zonegroup-new-name=<name>
 
 
-::
+#. Update the period:
 
 
-    # radosgw-admin zonegroup delete --rgw-zonegroup=<name>
+   .. prompt:: bash #
+   
+      radosgw-admin period update --commit
 
 
-Then, update the period:
+Deleting a Zonegroup
+~~~~~~~~~~~~~~~~~~~~
 
 
-::
+#. To delete a zonegroup, run the following command:
 
 
-    # radosgw-admin period update --commit
+   .. prompt:: bash #
+   
+      radosgw-admin zonegroup delete --rgw-zonegroup=<name>
 
 
-List Zone Groups
-~~~~~~~~~~~~~~~~
+#. Update the period:
 
 
-A Ceph cluster contains a list of zone groups. To list the zone groups,
-execute:
+   .. prompt:: bash #
+   
+      radosgw-admin period update --commit
 
 
-::
+Listing Zonegroups
+~~~~~~~~~~~~~~~~~~
+
+A Ceph cluster contains a list of zonegroup. To list the zonegroups, run
+this command:
 
 
-    # radosgw-admin zonegroup list
+.. prompt:: bash #
+   
+   radosgw-admin zonegroup list
 
 
-The ``radosgw-admin`` returns a JSON formatted list of zone groups.
+The ``radosgw-admin`` returns a JSON formatted list of zonegroups.
 
 ::
 
 
 ::
 
@@ -1041,28 +1111,28 @@ The ``radosgw-admin`` returns a JSON formatted list of zone groups.
         ]
     }
 
         ]
     }
 
-Get a Zone Group Map
-~~~~~~~~~~~~~~~~~~~~
-
-To list the details of each zone group, execute:
+Getting a Zonegroup Map
+~~~~~~~~~~~~~~~~~~~~~~~~
 
 
-::
+To list the details of each zonegroup, run this command:
 
 
-    # radosgw-admin zonegroup-map get
+.. prompt:: bash #
+   
+   radosgw-admin zonegroup-map get
 
 .. note:: If you receive a ``failed to read zonegroup map`` error, run
 
 .. note:: If you receive a ``failed to read zonegroup map`` error, run
-          ``radosgw-admin zonegroup-map update`` as ``root`` first.
-
-Get a Zone Group
-~~~~~~~~~~~~~~~~
+   ``radosgw-admin zonegroup-map update`` as ``root`` first.
 
 
-To view the configuration of a zone group, execute:
+Getting a Zonegroup
+~~~~~~~~~~~~~~~~~~~~
 
 
-::
+To view the configuration of a zonegroup, run this command:
 
 
-    radosgw-admin zonegroup get [--rgw-zonegroup=<zonegroup>]
+.. prompt:: bash #
+   
+   dosgw-admin zonegroup get [--rgw-zonegroup=<zonegroup>]
 
 
-The zone group configuration looks like this:
+The zonegroup configuration looks like this:
 
 ::
 
 
 ::
 
@@ -1111,85 +1181,82 @@ The zone group configuration looks like this:
         "realm_id": "ae031368-8715-4e27-9a99-0c9468852cfe"
     }
 
         "realm_id": "ae031368-8715-4e27-9a99-0c9468852cfe"
     }
 
-Set a Zone Group
-~~~~~~~~~~~~~~~~
+Setting a Zonegroup
+~~~~~~~~~~~~~~~~~~~~
 
 
-Defining a zone group consists of creating a JSON object, specifying at
-least the required settings:
+The process of defining a zonegroup consists of creating a JSON object and, at
+a minimum, specifying the required settings:
 
 
-1. ``name``: The name of the zone group. Required.
+1. ``name``: The name of the zonegroup. Required.
 
 
-2. ``api_name``: The API name for the zone group. Optional.
+2. ``api_name``: The API name for the zonegroup. Optional.
 
 
-3. ``is_master``: Determines if the zone group is the master zone group.
-   Required. **note:** You can only have one master zone group.
+3. ``is_master``: Determines whether the zonegroup is the master zonegroup.
+   Required. **note:** You can only have one master zonegroup.
 
 
-4. ``endpoints``: A list of all the endpoints in the zone group. For
-   example, you may use multiple domain names to refer to the same zone
-   group. Remember to escape the forward slashes (``\/``). You may also
-   specify a port (``fqdn:port``) for each endpoint. Optional.
+4. ``endpoints``: A list of all the endpoints in the zonegroup. For example,
+   you may use multiple domain names to refer to the same zonegroup. Remember
+   to escape the forward slashes (``\/``). You may also specify a port
+   (``fqdn:port``) for each endpoint. Optional.
 
 
-5. ``hostnames``: A list of all the hostnames in the zone group. For
-   example, you may use multiple domain names to refer to the same zone
-   group. Optional. The ``rgw dns name`` setting will automatically be
-   included in this list. You should restart the gateway daemon(s) after
-   changing this setting.
+5. ``hostnames``: A list of all the hostnames in the zonegroup. For example,
+   you may use multiple domain names to refer to the same zonegroup. Optional.
+   The ``rgw dns name`` setting will be included in this list automatically.
+   Restart the gateway daemon(s) after changing this setting.
 
 
-6. ``master_zone``: The master zone for the zone group. Optional. Uses
+6. ``master_zone``: The master zone for the zonegroup. Optional. Uses
    the default zone if not specified. **note:** You can only have one
    the default zone if not specified. **note:** You can only have one
-   master zone per zone group.
+   master zone per zonegroup.
 
 
-7. ``zones``: A list of all zones within the zone group. Each zone has a
-   name (required), a list of endpoints (optional), and whether or not
-   the gateway will log metadata and data operations (false by default).
+7. ``zones``: A list of all zones within the zonegroup. Each zone has a name
+   (required), a list of endpoints (optional), and a setting that determines
+   whether the gateway will log metadata and data operations (false by
+   default).
 
 8. ``placement_targets``: A list of placement targets (optional). Each
    placement target contains a name (required) for the placement target
    and a list of tags (optional) so that only users with the tag can use
 
 8. ``placement_targets``: A list of placement targets (optional). Each
    placement target contains a name (required) for the placement target
    and a list of tags (optional) so that only users with the tag can use
-   the placement target (i.e., the user’s ``placement_tags`` field in
+   the placement target (that is, the user’s ``placement_tags`` field in
    the user info).
 
    the user info).
 
-9. ``default_placement``: The default placement target for the object
-   index and object data. Set to ``default-placement`` by default. You
-   may also set a per-user default placement in the user info for each
-   user.
+9. ``default_placement``: The default placement target for the object index and
+   object data. Set to ``default-placement`` by default. It is  also possible
+   to set a per-user default placement in the user info for each user.
 
 
-To set a zone group, create a JSON object consisting of the required
-fields, save the object to a file (e.g., ``zonegroup.json``); then,
-execute the following command:
+To set a zonegroup, create a JSON object that contains the required fields,
+save the object to a file (e.g., ``zonegroup.json``), and run the following
+command:
 
 
-::
-
-    # radosgw-admin zonegroup set --infile zonegroup.json
+.. prompt:: bash #
+   
+   radosgw-admin zonegroup set --infile zonegroup.json
 
 Where ``zonegroup.json`` is the JSON file you created.
 
 
 Where ``zonegroup.json`` is the JSON file you created.
 
-.. important:: The ``default`` zone group ``is_master`` setting is ``true`` by
-               default. If you create a new zone group and want to make it the
-               master zone group, you must either set the ``default`` zone group
-               ``is_master`` setting to ``false``, or delete the ``default`` zone
-               group.
+.. important:: The ``default`` zonegroup ``is_master`` setting is ``true`` by
+   default. If you create a new zonegroup and want to make it the master
+   zonegroup, you must either set the ``default`` zonegroup ``is_master``
+   setting to ``false``, or delete the ``default`` zonegroup.
 
 Finally, update the period:
 
 
 Finally, update the period:
 
-::
-
-    # radosgw-admin period update --commit
+.. prompt:: bash #
+   
+   radosgw-admin period update --commit
 
 
-Set a Zone Group Map
-~~~~~~~~~~~~~~~~~~~~
+Setting a Zonegroup Map
+~~~~~~~~~~~~~~~~~~~~~~~~
 
 
-Setting a zone group map consists of creating a JSON object consisting
-of one or more zone groups, and setting the ``master_zonegroup`` for the
-cluster. Each zone group in the zone group map consists of a key/value
-pair, where the ``key`` setting is equivalent to the ``name`` setting
-for an individual zone group configuration, and the ``val`` is a JSON
-object consisting of an individual zone group configuration.
+The process of setting a zonegroup map comprises (1) creating a JSON object
+that consists of one or more zonegroups, and (2) setting the
+``master_zonegroup`` for the cluster. Each zonegroup in the zonegroup map
+consists of a key/value pair where the ``key`` setting is equivalent to the
+``name`` setting for an individual zonegroup configuration and the ``val`` is
+a JSON object consisting of an individual zonegroup configuration.
 
 
-You may only have one zone group with ``is_master`` equal to ``true``,
-and it must be specified as the ``master_zonegroup`` at the end of the
-zone group map. The following JSON object is an example of a default
-zone group map.
+You may only have one zonegroup with ``is_master`` equal to ``true``, and it
+must be specified as the ``master_zonegroup`` at the end of the zonegroup map.
+The following JSON object is an example of a default zonegroup map:
 
 ::
 
 
 ::
 
@@ -1256,112 +1323,120 @@ zone group map.
         }
     }
 
         }
     }
 
-To set a zone group map, execute the following:
+#. To set a zonegroup map, run the following command:
 
 
-::
+   .. prompt:: bash #
+   
+      radosgw-admin zonegroup-map set --infile zonegroupmap.json
 
 
-    # radosgw-admin zonegroup-map set --infile zonegroupmap.json
+   In this command, ``zonegroupmap.json`` is the JSON file you created. Ensure
+   that you have zones created for the ones specified in the zonegroup map.
 
 
-Where ``zonegroupmap.json`` is the JSON file you created. Ensure that
-you have zones created for the ones specified in the zone group map.
-Finally, update the period.
+#. Update the period:
 
 
-::
+   .. prompt:: bash #
+   
+      radosgw-admin period update --commit
 
 
-    # radosgw-admin period update --commit
+.. _radosgw-zones:
 
 Zones
 -----
 
 
 Zones
 -----
 
-Ceph Object Gateway supports the notion of zones. A zone defines a
-logical group consisting of one or more Ceph Object Gateway instances.
+A zone defines a logical group that consists of one or more Ceph Object Gateway
+instances. Ceph Object Gateway supports zones.
 
 
-Configuring zones differs from typical configuration procedures, because
-not all of the settings end up in a Ceph configuration file. You can
-list zones, get a zone configuration and set a zone configuration.
+The procedure for configuring zones differs from typical configuration
+procedures, because not all of the settings end up in a Ceph configuration
+file. 
 
 
-Create a Zone
-~~~~~~~~~~~~~
+Zones can be listed. You can "get" a zone configuration and "set" a zone
+configuration.
 
 
-To create a zone, specify a zone name. If it is a master zone, specify
-the ``--master`` option. Only one zone in a zone group may be a master
-zone. To add the zone to a zonegroup, specify the ``--rgw-zonegroup``
-option with the zonegroup name.
+Creating a Zone
+~~~~~~~~~~~~~~~
 
 
-::
+To create a zone, specify a zone name. If you are creating a master zone,
+specify the ``--master`` flag. Only one zone in a zonegroup may be a master
+zone. To add the zone to a zonegroup, specify the ``--rgw-zonegroup`` option
+with the zonegroup name.
 
 
-    # radosgw-admin zone create --rgw-zone=<name> \
+.. prompt:: bash #
+   
+   radosgw-admin zone create --rgw-zone=<name> \
                     [--zonegroup=<zonegroup-name]\
                     [--endpoints=<endpoint>[,<endpoint>] \
                     [--master] [--default] \
                     --access-key $SYSTEM_ACCESS_KEY --secret $SYSTEM_SECRET_KEY
 
                     [--zonegroup=<zonegroup-name]\
                     [--endpoints=<endpoint>[,<endpoint>] \
                     [--master] [--default] \
                     --access-key $SYSTEM_ACCESS_KEY --secret $SYSTEM_SECRET_KEY
 
-Then, update the period:
-
-::
-
-    # radosgw-admin period update --commit
+After you have created the zone, update the period:
 
 
-Delete a Zone
-~~~~~~~~~~~~~
+.. prompt:: bash #
+   
+   radosgw-admin period update --commit
 
 
-To delete zone, first remove it from the zonegroup.
+Deleting a Zone
+~~~~~~~~~~~~~~~
 
 
-::
+To delete a zone, first remove it from the zonegroup:
 
 
-    # radosgw-admin zonegroup remove --zonegroup=<name>\
+.. prompt:: bash #
+   
+   radosgw-admin zonegroup remove --zonegroup=<name>\
                                      --zone=<name>
 
 Then, update the period:
 
                                      --zone=<name>
 
 Then, update the period:
 
-::
-
-    # radosgw-admin period update --commit
+.. prompt:: bash #
+   
+   radosgw-admin period update --commit
 
 
-Next, delete the zone. Execute the following:
-
-::
+Next, delete the zone:
 
 
-    # radosgw-admin zone rm --rgw-zone<name>
+.. prompt:: bash #
+   
+   radosgw-admin zone delete --rgw-zone<name>
 
 Finally, update the period:
 
 
 Finally, update the period:
 
-::
-
-    # radosgw-admin period update --commit
+.. prompt:: bash #
+   
+   radosgw-admin period update --commit
 
 
-.. important:: Do not delete a zone without removing it from a zone group first.
+.. important:: Do not delete a zone without removing it from a zonegroup first.
                Otherwise, updating the period will fail.
 
 If the pools for the deleted zone will not be used anywhere else,
 consider deleting the pools. Replace ``<del-zone>`` in the example below
 with the deleted zone’s name.
 
                Otherwise, updating the period will fail.
 
 If the pools for the deleted zone will not be used anywhere else,
 consider deleting the pools. Replace ``<del-zone>`` in the example below
 with the deleted zone’s name.
 
-.. important:: Only delete the pools with prepended zone names. Deleting the root
-               pool, such as, ``.rgw.root`` will remove all of the system’s
-               configuration.
-
-.. important:: Once the pools are deleted, all of the data within them are deleted
-               in an unrecoverable manner. Only delete the pools if the pool
-               contents are no longer needed.
-
-::
-
-    # ceph osd pool rm <del-zone>.rgw.control <del-zone>.rgw.control --yes-i-really-really-mean-it
-    # ceph osd pool rm <del-zone>.rgw.data.root <del-zone>.rgw.data.root --yes-i-really-really-mean-it
-    # ceph osd pool rm <del-zone>.rgw.gc <del-zone>.rgw.gc --yes-i-really-really-mean-it
-    # ceph osd pool rm <del-zone>.rgw.log <del-zone>.rgw.log --yes-i-really-really-mean-it
-    # ceph osd pool rm <del-zone>.rgw.users.uid <del-zone>.rgw.users.uid --yes-i-really-really-mean-it
-
-Modify a Zone
-~~~~~~~~~~~~~
+.. important:: Only delete the pools with prepended zone names. Deleting the
+   root pool (for example, ``.rgw.root``) will remove all of the system’s
+   configuration.
+
+.. important:: When the pools are deleted, all of the data within them are
+   deleted in an unrecoverable manner. Delete the pools only if the pool's
+   contents are no longer needed.
+
+.. prompt:: bash #
+   
+   ceph osd pool rm <del-zone>.rgw.control <del-zone>.rgw.control --yes-i-really-really-mean-it
+   ceph osd pool rm <del-zone>.rgw.meta <del-zone>.rgw.meta --yes-i-really-really-mean-it
+   ceph osd pool rm <del-zone>.rgw.log <del-zone>.rgw.log --yes-i-really-really-mean-it
+   ceph osd pool rm <del-zone>.rgw.otp <del-zone>.rgw.otp --yes-i-really-really-mean-it
+   ceph osd pool rm <del-zone>.rgw.buckets.index <del-zone>.rgw.buckets.index --yes-i-really-really-mean-it
+   ceph osd pool rm <del-zone>.rgw.buckets.non-ec <del-zone>.rgw.buckets.non-ec --yes-i-really-really-mean-it
+   ceph osd pool rm <del-zone>.rgw.buckets.data <del-zone>.rgw.buckets.data --yes-i-really-really-mean-it
+
+Modifying a Zone
+~~~~~~~~~~~~~~~~
 
 To modify a zone, specify the zone name and the parameters you wish to
 modify.
 
 
 To modify a zone, specify the zone name and the parameters you wish to
 modify.
 
-::
-
-    # radosgw-admin zone modify [options]
+.. prompt:: bash #
+   
+   radosgw-admin zone modify [options]
 
 Where ``[options]``:
 
 
 Where ``[options]``:
 
@@ -1373,27 +1448,27 @@ Where ``[options]``:
 
 Then, update the period:
 
 
 Then, update the period:
 
-::
-
-    # radosgw-admin period update --commit
-
-List Zones
-~~~~~~~~~~
-
-As ``root``, to list the zones in a cluster, execute:
+.. prompt:: bash #
+   
+   radosgw-admin period update --commit
 
 
-::
+Listing Zones
+~~~~~~~~~~~~~
 
 
-    # radosgw-admin zone list
+As ``root``, to list the zones in a cluster, run the following command:
 
 
-Get a Zone
-~~~~~~~~~~
+.. prompt:: bash #
+   
+   radosgw-admin zone list
 
 
-As ``root``, to get the configuration of a zone, execute:
+Getting a Zone
+~~~~~~~~~~~~~~
 
 
-::
+As ``root``, to get the configuration of a zone, run the following command:
 
 
-    # radosgw-admin zone get [--rgw-zone=<zone>]
+.. prompt:: bash #
+   
+   radosgw-admin zone get [--rgw-zone=<zone>]
 
 The ``default`` zone looks like this:
 
 
 The ``default`` zone looks like this:
 
@@ -1418,8 +1493,8 @@ The ``default`` zone looks like this:
         ]
       }
 
         ]
       }
 
-Set a Zone
-~~~~~~~~~~
+Setting a Zone
+~~~~~~~~~~~~~~
 
 Configuring a zone involves specifying a series of Ceph Object Gateway
 pools. For consistency, we recommend using a pool prefix that is the
 
 Configuring a zone involves specifying a series of Ceph Object Gateway
 pools. For consistency, we recommend using a pool prefix that is the
@@ -1428,40 +1503,40 @@ same as the zone name. See
 for details of configuring pools.
 
 To set a zone, create a JSON object consisting of the pools, save the
 for details of configuring pools.
 
 To set a zone, create a JSON object consisting of the pools, save the
-object to a file (e.g., ``zone.json``); then, execute the following
+object to a file (e.g., ``zone.json``); then, run the following
 command, replacing ``{zone-name}`` with the name of the zone:
 
 command, replacing ``{zone-name}`` with the name of the zone:
 
-::
-
-    # radosgw-admin zone set --rgw-zone={zone-name} --infile zone.json
+.. prompt:: bash #
+   
+   radosgw-admin zone set --rgw-zone={zone-name} --infile zone.json
 
 Where ``zone.json`` is the JSON file you created.
 
 Then, as ``root``, update the period:
 
 
 Where ``zone.json`` is the JSON file you created.
 
 Then, as ``root``, update the period:
 
-::
-
-    # radosgw-admin period update --commit
+.. prompt:: bash #
+   
+   radosgw-admin period update --commit
 
 
-Rename a Zone
-~~~~~~~~~~~~~
+Renaming a Zone
+~~~~~~~~~~~~~~~
 
 To rename a zone, specify the zone name and the new zone name.
 
 
 To rename a zone, specify the zone name and the new zone name.
 
-::
-
-    # radosgw-admin zone rename --rgw-zone=<name> --zone-new-name=<name>
+.. prompt:: bash #
+   
+   radosgw-admin zone rename --rgw-zone=<name> --zone-new-name=<name>
 
 Then, update the period:
 
 
 Then, update the period:
 
-::
-
-    # radosgw-admin period update --commit
+.. prompt:: bash #
+   
+   radosgw-admin period update --commit
 
 
-Zone Group and Zone Settings
+Zonegroup and Zone Settings
 ----------------------------
 
 ----------------------------
 
-When configuring a default zone group and zone, the pool name includes
+When configuring a default zonegroup and zone, the pool name includes
 the zone name. For example:
 
 -  ``default.rgw.control``
 the zone name. For example:
 
 -  ``default.rgw.control``
@@ -1476,18 +1551,87 @@ instance.
 | ``rgw_zone``                        | The name of the zone for the      | String  | None                  |
 |                                     | gateway instance.                 |         |                       |
 +-------------------------------------+-----------------------------------+---------+-----------------------+
 | ``rgw_zone``                        | The name of the zone for the      | String  | None                  |
 |                                     | gateway instance.                 |         |                       |
 +-------------------------------------+-----------------------------------+---------+-----------------------+
-| ``rgw_zonegroup``                   | The name of the zone group for    | String  | None                  |
+| ``rgw_zonegroup``                   | The name of the zonegroup for     | String  | None                  |
 |                                     | the gateway instance.             |         |                       |
 +-------------------------------------+-----------------------------------+---------+-----------------------+
 |                                     | the gateway instance.             |         |                       |
 +-------------------------------------+-----------------------------------+---------+-----------------------+
-| ``rgw_zonegroup_root_pool``         | The root pool for the zone group. | String  | ``.rgw.root``         |
+| ``rgw_zonegroup_root_pool``         | The root pool for the zonegroup.  | String  | ``.rgw.root``         |
 +-------------------------------------+-----------------------------------+---------+-----------------------+
 | ``rgw_zone_root_pool``              | The root pool for the zone.       | String  | ``.rgw.root``         |
 +-------------------------------------+-----------------------------------+---------+-----------------------+
 | ``rgw_default_zone_group_info_oid`` | The OID for storing the default   | String  | ``default.zonegroup`` |
 +-------------------------------------+-----------------------------------+---------+-----------------------+
 | ``rgw_zone_root_pool``              | The root pool for the zone.       | String  | ``.rgw.root``         |
 +-------------------------------------+-----------------------------------+---------+-----------------------+
 | ``rgw_default_zone_group_info_oid`` | The OID for storing the default   | String  | ``default.zonegroup`` |
-|                                     | zone group. We do not recommend   |         |                       |
+|                                     | zonegroup. We do not recommend    |         |                       |
 |                                     | changing this setting.            |         |                       |
 +-------------------------------------+-----------------------------------+---------+-----------------------+
 
 
 |                                     | changing this setting.            |         |                       |
 +-------------------------------------+-----------------------------------+---------+-----------------------+
 
 
+Zone Features
+=============
+
+Some multisite features require support from all zones before they can be enabled. Each zone lists its ``supported_features``, and each zonegroup lists its ``enabled_features``. Before a feature can be enabled in the zonegroup, it must be supported by all of its zones.
+
+On creation of new zones and zonegroups, all known features are supported/enabled. After upgrading an existing multisite configuration, however, new features must be enabled manually.
+
+Supported Features
+------------------
+
++---------------------------+---------+
+| Feature                   | Release |
++===========================+=========+
+| :ref:`feature_resharding` | Quincy  |
++---------------------------+---------+
+
+.. _feature_resharding:
+
+resharding
+~~~~~~~~~~
+
+Allows buckets to be resharded in a multisite configuration without interrupting the replication of their objects. When ``rgw_dynamic_resharding`` is enabled, it runs on each zone independently, and zones may choose different shard counts for the same bucket. When buckets are resharded manually with ``radosgw-admin bucket reshard``, only that zone's bucket is modified. A zone feature should only be marked as supported after all of its radosgws and osds have upgraded.
+
+
+Commands
+-----------------
+
+Add support for a zone feature
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+On the cluster that contains the given zone:
+
+.. prompt:: bash $
+
+   radosgw-admin zone modify --rgw-zone={zone-name} --enable-feature={feature-name}
+   radosgw-admin period update --commit
+
+
+Remove support for a zone feature
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+On the cluster that contains the given zone:
+
+.. prompt:: bash $
+
+   radosgw-admin zone modify --rgw-zone={zone-name} --disable-feature={feature-name}
+   radosgw-admin period update --commit
+
+Enable a zonegroup feature
+~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+On any cluster in the realm:
+
+.. prompt:: bash $
+
+   radosgw-admin zonegroup modify --rgw-zonegroup={zonegroup-name} --enable-feature={feature-name}
+   radosgw-admin period update --commit
+
+Disable a zonegroup feature
+~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+On any cluster in the realm:
+
+.. prompt:: bash $
+
+   radosgw-admin zonegroup modify --rgw-zonegroup={zonegroup-name} --disable-feature={feature-name}
+   radosgw-admin period update --commit
+
+
 .. _`Pools`: ../pools
 .. _`Sync Policy Config`: ../multisite-sync-policy
 .. _`Pools`: ../pools
 .. _`Sync Policy Config`: ../multisite-sync-policy
index f9fc8173910d9536baa88a6251dba65f347b1a25..e1d576d517f0f42f73d854de8cc74fc73500f69a 100644 (file)
@@ -6,23 +6,29 @@ Bucket Notifications
 
 .. contents::
 
 
 .. contents::
 
-Bucket notifications provide a mechanism for sending information out of the radosgw when certain events are happening on the bucket.
-Currently, notifications could be sent to: HTTP, AMQP0.9.1 and Kafka endpoints.
-
-Note, that if the events should be stored in Ceph, in addition, or instead of being pushed to an endpoint,
-the `PubSub Module`_ should be used instead of the bucket notification mechanism.
-
-A user can create different topics. A topic entity is defined by its name and is per tenant. A
-user can only associate its topics (via notification configuration) with buckets it owns.
-
-In order to send notifications for events for a specific bucket, a notification entity needs to be created. A
-notification can be created on a subset of event types, or for all event types (default).
-The notification may also filter out events based on prefix/suffix and/or regular expression matching of the keys. As well as,
-on the metadata attributes attached to the object, or the object tags.
-There can be multiple notifications for any specific topic, and the same topic could be used for multiple notifications.
-
-REST API has been defined to provide configuration and control interfaces for the bucket notification
-mechanism. This API is similar to the one defined as the S3-compatible API of the pubsub sync module.
+Bucket notifications provide a mechanism for sending information out of radosgw
+when certain events happen on the bucket. Notifications can be sent to HTTP
+endpoints, AMQP0.9.1 endpoints, and Kafka endpoints.
+
+The `PubSub Module`_ (and *not* the bucket-notification mechanism) should be
+used for events stored in Ceph. 
+
+A user can create topics. A topic entity is defined by its name and is "per
+tenant". A user can associate its topics (via notification configuration) only
+with buckets it owns.
+
+A notification entity must be created in order to send event notifications for
+a specific bucket. A notification entity can be created either for a subset
+of event types or for all event types (which is the default). The
+notification may also filter out events based on matches of the prefixes and
+suffixes of (1) the keys, (2) the metadata attributes attached to the object,
+or (3) the object tags. Regular-expression matching can also be used on these
+to create filters. There can be multiple notifications for any specific topic,
+and the same topic can used for multiple notifications.
+
+REST API has been defined so as to provide configuration and control interfaces
+for the bucket notification mechanism. This API is similar to the one defined
+as the S3-compatible API of the `PubSub Module`_.
 
 .. toctree::
    :maxdepth: 1
 
 .. toctree::
    :maxdepth: 1
@@ -34,18 +40,36 @@ mechanism. This API is similar to the one defined as the S3-compatible API of th
 Notification Reliability
 ------------------------
 
 Notification Reliability
 ------------------------
 
-Notifications may be sent synchronously, as part of the operation that triggered them.
-In this mode, the operation is acked only after the notification is sent to the topic's configured endpoint, which means that the
-round trip time of the notification is added to the latency of the operation itself.
+Notifications can be sent synchronously or asynchronously. This section
+describes the latency and reliability that you should expect for synchronous
+and asynchronous notifications.
+
+Synchronous Notifications
+~~~~~~~~~~~~~~~~~~~~~~~~~
+
+Notifications can be sent synchronously, as part of the operation that
+triggered them. In this mode, the operation is acknowledged (acked) only after
+the notification is sent to the topic's configured endpoint. This means that
+the round trip time of the notification (the time it takes to send the
+notification to the topic's endpoint plus the time it takes to receive the
+acknowledgement) is added to the latency of the operation itself.
+
+.. note:: The original triggering operation is considered successful even if
+   the notification fails with an error, cannot be delivered, or times out.
 
 
-.. note:: The original triggering operation will still be considered as successful even if the notification fail with an error, cannot be deliverd or times out
+Asynchronous Notifications
+~~~~~~~~~~~~~~~~~~~~~~~~~~
 
 
-Notifications may also be sent asynchronously. They will be committed into persistent storage and then asynchronously sent to the topic's configured endpoint.
-In this case, the only latency added to the original operation is of committing the notification to persistent storage.
+Notifications can be sent asynchronously. They are committed into persistent
+storage and then asynchronously sent to the topic's configured endpoint. In
+this case, the only latency added to the original operation is the latency
+added when the notification is committed to persistent storage.
 
 
-.. note:: If the notification fail with an error, cannot be deliverd or times out, it will be retried until successfully acked
+.. note:: If the notification fails with an error, cannot be delivered, or
+   times out, it is retried until it is successfully acknowledged.
 
 
-.. tip:: To minimize the added latency in case of asynchronous notifications, it is recommended to place the "log" pool on fast media
+.. tip:: To minimize the latency added by asynchronous notification, we 
+   recommended placing the "log" pool on fast media.
 
 
 Topic Management via CLI
 
 
 Topic Management via CLI
@@ -53,23 +77,23 @@ Topic Management via CLI
 
 Configuration of all topics, associated with a tenant, could be fetched using the following command:
 
 
 Configuration of all topics, associated with a tenant, could be fetched using the following command:
 
-::
+.. prompt:: bash #
 
 
-   radosgw-admin topic list [--tenant={tenant}]
+   radosgw-admin topic list [--tenant={tenant}]
 
 
 Configuration of a specific topic could be fetched using:
 
 
 
 Configuration of a specific topic could be fetched using:
 
-::
+.. prompt:: bash #
 
 
-   radosgw-admin topic get --topic={topic-name} [--tenant={tenant}]
+   radosgw-admin topic get --topic={topic-name} [--tenant={tenant}]
 
 
 And removed using:
 
 
 
 And removed using:
 
-::
+.. prompt:: bash #
 
 
-   radosgw-admin topic rm --topic={topic-name} [--tenant={tenant}]
+   radosgw-admin topic rm --topic={topic-name} [--tenant={tenant}]
 
 
 Notification Performance Stats
 
 
 Notification Performance Stats
@@ -95,17 +119,27 @@ Topics
 
 .. note::
 
 
 .. note::
 
-    In all topic actions, the parameters are URL encoded, and sent in the message body using ``application/x-www-form-urlencoded`` content type
+    In all topic actions, the parameters are URL-encoded and sent in the
+    message body using this content type:
+    ``application/x-www-form-urlencoded``.
+   
 
 Create a Topic
 ``````````````
 
 
 Create a Topic
 ``````````````
 
-This will create a new topic. The topic should be provided with push endpoint parameters that would be used later
-when a notification is created.
-Upon a successful request, the response will include the topic ARN that could be later used to reference this topic in the notification request.
-To update a topic, use the same command used for topic creation, with the topic name of an existing topic and different endpoint values.
+This creates a new topic. Provide the topic with push endpoint parameters,
+which will be used later when a notification is created. A response is
+generated. A successful response includes the the topic's `ARN
+<https://docs.aws.amazon.com/general/latest/gr/aws-arns-and-namespaces.html>`_
+(the "Amazon Resource Name", a unique identifier used to reference the topic).
+To update a topic, use the same command that you used to create it (but when
+updating, use the name of an existing topic and different endpoint values).
+
+.. tip:: Any notification already associated with the topic must be re-created
+   in order for the topic to update.
 
 
-.. tip:: Any notification already associated with the topic needs to be re-created for the topic update to take effect
+.. note:: For rabbitmq, ``push-endpoint`` (with a hyphen in the middle) must be
+   changed to ``push_endpoint`` (with an underscore in the middle).
 
 ::
 
 
 ::
 
@@ -126,55 +160,83 @@ To update a topic, use the same command used for topic creation, with the topic
 
 Request parameters:
 
 
 Request parameters:
 
-- push-endpoint: URI of an endpoint to send push notification to
-- OpaqueData: opaque data is set in the topic configuration and added to all notifications triggered by the topic
-- persistent: indication whether notifications to this endpoint are persistent (=asynchronous) or not ("false" by default)
+- push-endpoint: This is the URI of an endpoint to send push notifications to.
+- OpaqueData: Opaque data is set in the topic configuration and added to all
+  notifications that are triggered by the topic.
+- persistent: This indicates whether notifications to this endpoint are
+  persistent (=asynchronous) or not persistent. (This is "false" by default.)
 
 - HTTP endpoint
 
  - URI: ``http[s]://<fqdn>[:<port]``
 
 - HTTP endpoint
 
  - URI: ``http[s]://<fqdn>[:<port]``
- - port defaults to: 80/443 for HTTP/S accordingly
- - verify-ssl: indicate whether the server certificate is validated by the client or not ("true" by default)
- - cloudevents: indicate whether the HTTP header should contain attributes according to the `S3 CloudEvents Spec`_ ("false" by default)
+ - port: This defaults to 80 for HTTP and 443 for HTTPS.
+ - verify-ssl: This indicates whether the server certificate is validated by
+   the client. (This is "true" by default.)
+ - cloudevents: This indicates whether the HTTP header should contain
+   attributes according to the `S3 CloudEvents Spec`_. (This is "false" by
+   default.)
 
 - AMQP0.9.1 endpoint
 
  - URI: ``amqp[s]://[<user>:<password>@]<fqdn>[:<port>][/<vhost>]``
 
 - AMQP0.9.1 endpoint
 
  - URI: ``amqp[s]://[<user>:<password>@]<fqdn>[:<port>][/<vhost>]``
- - user/password defaults to: guest/guest
- - user/password may only be provided over HTTPS. If not, topic creation request will be rejected.
- - port defaults to: 5672/5671 for unencrypted/SSL-encrypted connections
- - vhost defaults to: "/"
- - verify-ssl: indicate whether the server certificate is validated by the client or not ("true" by default)
- - if ``ca-location`` is provided, and secure connection is used, the specified CA will be used, instead of the default one, to authenticate the broker
- - amqp-exchange: the exchanges must exist and be able to route messages based on topics (mandatory parameter for AMQP0.9.1). Different topics pointing to the same endpoint must use the same exchange
- - amqp-ack-level: no end2end acking is required, as messages may persist in the broker before delivered into their final destination. Three ack methods exist:
-
-  - "none": message is considered "delivered" if sent to broker
-  - "broker": message is considered "delivered" if acked by broker (default)
-  - "routable": message is considered "delivered" if broker can route to a consumer
-
-.. tip:: The topic-name (see :ref:`radosgw-create-a-topic`) is used for the AMQP topic ("routing key" for a topic exchange)
+ - user/password: This defaults to "guest/guest".
+ - user/password: This must be provided only over HTTPS. Topic creation
+   requests will otherwise be rejected.
+ - port: This defaults to 5672 for unencrypted connections and 5671 for
+   SSL-encrypted connections.
+ - vhost: This defaults to "/".
+ - verify-ssl: This indicates whether the server certificate is validated by
+   the client. (This is "true" by default.)
+ - If ``ca-location`` is provided and a secure connection is used, the
+   specified CA will be used to authenticate the broker. The default CA will
+   not be used.  
+ - amqp-exchange: The exchanges must exist and must be able to route messages
+   based on topics. This parameter is mandatory.  Different topics that point
+   to the same endpoint must use the same exchange.
+ - amqp-ack-level: No end2end acking is required. Messages may persist in the
+   broker before being delivered to their final destinations. Three ack methods
+   exist:
+
+  - "none": The message is considered "delivered" if it is sent to the broker.
+  - "broker": The message is considered "delivered" if it is acked by the broker (default).
+  - "routable": The message is considered "delivered" if the broker can route to a consumer.
+
+.. tip:: The topic-name (see :ref:`radosgw-create-a-topic`) is used for the
+   AMQP topic ("routing key" for a topic exchange).
 
 - Kafka endpoint
 
  - URI: ``kafka://[<user>:<password>@]<fqdn>[:<port]``
 
 - Kafka endpoint
 
  - URI: ``kafka://[<user>:<password>@]<fqdn>[:<port]``
- - if ``use-ssl`` is set to "true", secure connection will be used for connecting with the broker ("false" by default)
- - if ``ca-location`` is provided, and secure connection is used, the specified CA will be used, instead of the default one, to authenticate the broker
- - user/password may only be provided over HTTPS. If not, topic creation request will be rejected.
- - user/password may only be provided together with ``use-ssl``, if not, the connection to the broker would fail.
- - port defaults to: 9092
- - kafka-ack-level: no end2end acking is required, as messages may persist in the broker before delivered into their final destination. Two ack methods exist:
-
-  - "none": message is considered "delivered" if sent to broker
-  - "broker": message is considered "delivered" if acked by broker (default)
+ - ``use-ssl``: If this is set to "true", a secure connection is used to
+   connect to the broker. (This is "false" by default.)
+ - ``ca-location``: If this is provided and a secure connection is used, the
+   specified CA will be used insted of the default CA to authenticate the
+   broker. 
+ - user/password: This must be provided only over HTTPS. Topic creation
+   requests will otherwise be rejected.
+ - user/password: This must be provided along with ``use-ssl``. Connections to
+   the broker will otherwise fail.
+ - port: This defaults to 9092.
+ - kafka-ack-level: No end2end acking is required. Messages may persist in the
+   broker before being delivered to their final destinations. Two ack methods
+   exist:
+
+  - "none": Messages are considered "delivered" if sent to the broker.
+  - "broker": Messages are considered "delivered" if acked by the broker. (This
+    is the default.)
 
 .. note::
 
 
 .. note::
 
-    - The key/value of a specific parameter does not have to reside in the same line, or in any specific order, but must use the same index
-    - Attribute indexing does not need to be sequential or start from any specific value
-    - `AWS Create Topic`_ has a detailed explanation of the endpoint attributes format. However, in our case different keys and values are used
+    - The key-value pair of a specific parameter need not reside in the same
+      line as the parameter, and need not appear in any specific order, but it
+      must use the same index.
+    - Attribute indexing need not be sequential and need not start from any
+      specific value.
+    - `AWS Create Topic`_ provides a detailed explanation of the endpoint
+      attributes format. In our case, however, different keys and values are
+      used.
 
 
-The response will have the following format:
+The response has the following format:
 
 ::
 
 
 ::
 
@@ -187,7 +249,9 @@ The response will have the following format:
         </ResponseMetadata>
     </CreateTopicResponse>
 
         </ResponseMetadata>
     </CreateTopicResponse>
 
-The topic ARN in the response will have the following format:
+The topic `ARN
+<https://docs.aws.amazon.com/general/latest/gr/aws-arns-and-namespaces.html>`_
+in the response has the following format:
 
 ::
 
 
 ::
 
@@ -196,7 +260,8 @@ The topic ARN in the response will have the following format:
 Get Topic Attributes
 ````````````````````
 
 Get Topic Attributes
 ````````````````````
 
-Returns information about a specific topic. This includes push-endpoint information, if provided.
+This returns information about a specific topic. This includes push-endpoint
+information, if provided.
 
 ::
 
 
 ::
 
@@ -205,7 +270,7 @@ Returns information about a specific topic. This includes push-endpoint informat
    Action=GetTopicAttributes
    &TopicArn=<topic-arn>
 
    Action=GetTopicAttributes
    &TopicArn=<topic-arn>
 
-Response will have the following format:
+The response has the following format:
 
 ::
 
 
 ::
 
@@ -239,22 +304,27 @@ Response will have the following format:
         </ResponseMetadata>
     </GetTopicAttributesResponse>
 
         </ResponseMetadata>
     </GetTopicAttributesResponse>
 
-- User: name of the user that created the topic
-- Name: name of the topic
-- EndPoint: JSON formatted endpoint parameters, including:
-   - EndpointAddress: the push-endpoint URL
-   - EndpointArgs: the push-endpoint args
-   - EndpointTopic: the topic name that should be sent to the endpoint (may be different than the above topic name)
-   - HasStoredSecret: "true" if if endpoint URL contain user/password information. In this case request must be made over HTTPS. If not, topic get request will be rejected 
-   - Persistent: "true" is topic is persistent
-- TopicArn: topic ARN
-- OpaqueData: the opaque data set on the topic
+- User: the name of the user that created the topic.
+- Name: the name of the topic.
+- EndPoint: The JSON-formatted endpoint parameters, including:
+   - EndpointAddress: The push-endpoint URL.
+   - EndpointArgs: The push-endpoint args.
+   - EndpointTopic: The topic name to be sent to the endpoint (can be different
+     than the above topic name).
+   - HasStoredSecret: This is "true" if the endpoint URL contains user/password 
+     information. In this case, the request must be made over HTTPS. The "topic
+     get" request will otherwise be rejected.
+   - Persistent: This is "true" if the topic is persistent.
+- TopicArn: topic `ARN
+  <https://docs.aws.amazon.com/general/latest/gr/aws-arns-and-namespaces.html>`_.
+- OpaqueData: The opaque data set on the topic.
 
 Get Topic Information
 `````````````````````
 
 
 Get Topic Information
 `````````````````````
 
-Returns information about specific topic. This includes push-endpoint information, if provided.
-Note that this API is now deprecated in favor of the AWS compliant `GetTopicAttributes` API.
+This returns information about a specific topic. This includes push-endpoint
+information, if provided.  Note that this API is now deprecated in favor of the
+AWS compliant `GetTopicAttributes` API.
 
 ::
 
 
 ::
 
@@ -263,7 +333,7 @@ Note that this API is now deprecated in favor of the AWS compliant `GetTopicAttr
    Action=GetTopic
    &TopicArn=<topic-arn>
 
    Action=GetTopic
    &TopicArn=<topic-arn>
 
-Response will have the following format:
+The response has the following format:
 
 ::
 
 
 ::
 
@@ -288,15 +358,19 @@ Response will have the following format:
         </ResponseMetadata>
     </GetTopicResponse>
 
         </ResponseMetadata>
     </GetTopicResponse>
 
-- User: name of the user that created the topic
-- Name: name of the topic
-- EndpointAddress: the push-endpoint URL
-- EndpointArgs: the push-endpoint args
-- EndpointTopic: the topic name that should be sent to the endpoint (may be different than the above topic name)
-- HasStoredSecret: "true" if endpoint URL contain user/password information. In this case request must be made over HTTPS. If not, topic get request will be rejected 
-- Persistent: "true" is topic is persistent
-- TopicArn: topic ARN
-- OpaqueData: the opaque data set on the topic
+- User: The name of the user that created the topic.
+- Name: The name of the topic.
+- EndpointAddress: The push-endpoint URL.
+- EndpointArgs: The push-endpoint args.
+- EndpointTopic: The topic name to be sent to the endpoint (which can be
+  different than the above topic name).
+- HasStoredSecret: This is "true" if the endpoint URL contains user/password
+  information. In this case, the request must be made over HTTPS. The "topic
+  get" request will otherwise be rejected.
+- Persistent: "true" if topic is persistent.
+- TopicArn: topic `ARN
+  <https://docs.aws.amazon.com/general/latest/gr/aws-arns-and-namespaces.html>`_.
+- OpaqueData: the opaque data set on the topic.
 
 Delete Topic
 ````````````
 
 Delete Topic
 ````````````
@@ -308,14 +382,16 @@ Delete Topic
    Action=DeleteTopic
    &TopicArn=<topic-arn>
 
    Action=DeleteTopic
    &TopicArn=<topic-arn>
 
-Delete the specified topic.
+This deletes the specified topic.
 
 .. note::
 
 
 .. note::
 
-  - Deleting an unknown notification (e.g. double delete) is not considered an error
-  - Deleting a topic does not automatically delete all notifications associated with it
+  - Deleting an unknown notification (for example, double delete) is not
+    considered an error.
+  - Deleting a topic does not automatically delete all notifications associated
+    with it.
 
 
-The response will have the following format:
+The response has the following format:
 
 ::
 
 
 ::
 
@@ -336,7 +412,7 @@ List all topics associated with a tenant.
 
    Action=ListTopics
 
 
    Action=ListTopics
 
-Response will have the following format:
+The response has the following format:
 
 ::
 
 
 ::
 
@@ -361,7 +437,9 @@ Response will have the following format:
         </ResponseMetadata>
     </ListTopicsResponse>
 
         </ResponseMetadata>
     </ListTopicsResponse>
 
-- if endpoint URL contain user/password information, in any of the topic, request must be made over HTTPS. If not, topic list request will be rejected.
+- If the endpoint URL contains user/password information in any part of the
+  topic, the request must be made over HTTPS. The "topic list" request will
+  otherwise be rejected.
 
 Notifications
 ~~~~~~~~~~~~~
 
 Notifications
 ~~~~~~~~~~~~~
@@ -376,8 +454,9 @@ Detailed under: `Bucket Operations`_.
 Events
 ~~~~~~
 
 Events
 ~~~~~~
 
-The events are in JSON format (regardless of the actual endpoint), and share the same structure as the S3-compatible events
-pushed or pulled using the pubsub sync module. For example:
+Events are in JSON format (regardless of the actual endpoint), and share the
+same structure as S3-compatible events that are pushed or pulled using the
+pubsub sync module. For example:
 
 ::
 
 
 ::
 
@@ -424,29 +503,39 @@ pushed or pulled using the pubsub sync module. For example:
        }
    ]}
 
        }
    ]}
 
-- awsRegion: zonegroup
-- eventTime: timestamp indicating when the event was triggered
-- eventName: for list of supported events see: `S3 Notification Compatibility`_. Note that the eventName values do not start with the `s3:` prefix.
-- userIdentity.principalId: user that triggered the change
+- awsRegion: The zonegroup.
+- eventTime: The timestamp, indicating when the event was triggered.
+- eventName: For the list of supported events see: `S3 Notification
+  Compatibility`_. Note that eventName values do not start with the `s3:`
+  prefix.
+- userIdentity.principalId: The user that triggered the change.
 - requestParameters.sourceIPAddress: not supported
 - requestParameters.sourceIPAddress: not supported
-- responseElements.x-amz-request-id: request ID of the original change
-- responseElements.x_amz_id_2: RGW on which the change was made
-- s3.configurationId: notification ID that created the event
-- s3.bucket.name: name of the bucket
-- s3.bucket.ownerIdentity.principalId: owner of the bucket
-- s3.bucket.arn: ARN of the bucket
-- s3.bucket.id: Id of the bucket (an extension to the S3 notification API)
-- s3.object.key: object key
-- s3.object.size: object size
-- s3.object.eTag: object etag
-- s3.object.versionId: object version in case of versioned bucket. 
-  When doing a copy, it would include the version of the target object. 
-  When creating a delete marker, it would include the version of the delete marker.
-- s3.object.sequencer: monotonically increasing identifier of the change per object (hexadecimal format)
-- s3.object.metadata: any metadata set on the object sent as: ``x-amz-meta-`` (an extension to the S3 notification API)
-- s3.object.tags: any tags set on the object (an extension to the S3 notification API)
-- s3.eventId: unique ID of the event, that could be used for acking (an extension to the S3 notification API)
-- s3.opaqueData: opaque data is set in the topic configuration and added to all notifications triggered by the topic (an extension to the S3 notification API)
+- responseElements.x-amz-request-id: The request ID of the original change.
+- responseElements.x_amz_id_2: The RGW on which the change was made.
+- s3.configurationId: The notification ID that created the event.
+- s3.bucket.name: The name of the bucket.
+- s3.bucket.ownerIdentity.principalId: The owner of the bucket.
+- s3.bucket.arn: The ARN of the bucket.
+- s3.bucket.id: The ID of the bucket. (This is an extension to the S3
+  notification API.)
+- s3.object.key: The object key.
+- s3.object.size: The object size.
+- s3.object.eTag: The object etag.
+- s3.object.versionId: The object version, if the bucket is versioned. When a
+  copy is made, it includes the version of the target object. When a delete
+  marker is created, it includes the version of the delete marker.
+- s3.object.sequencer: The monotonically-increasing identifier of the "change
+  per object" (hexadecimal format).
+- s3.object.metadata: Any metadata set on the object that is sent as
+  ``x-amz-meta-`` (that is, any metadata set on the object that is sent as an
+  extension to the S3 notification API).
+- s3.object.tags: Any tags set on the object. (This is an extension to the S3
+  notification API.)
+- s3.eventId: The unique ID of the event, which could be used for acking. (This
+  is an extension to the S3 notification API.)
+- s3.opaqueData: This means that "opaque data" is set in the topic configuration
+  and is added to all notifications triggered by the topic. (This is an
+  extension to the S3 notification API.)
 
 .. _PubSub Module : ../pubsub-module
 .. _S3 Notification Compatibility: ../s3-notification-compatibility
 
 .. _PubSub Module : ../pubsub-module
 .. _S3 Notification Compatibility: ../s3-notification-compatibility
index 595fde2947040ddc74b09d22bd10786cf7adfb9e..ae4316524d94a062d91f711f3c3f7be66dfed868 100644 (file)
@@ -86,7 +86,8 @@ The zone placement configuration can be queried with:
                       }
                   },
                   "data_extra_pool": "default.rgw.buckets.non-ec",
                       }
                   },
                   "data_extra_pool": "default.rgw.buckets.non-ec",
-                  "index_type": 0
+                  "index_type": 0,
+                  "inline_data": true
               }
           }
       ],
               }
           }
       ],
@@ -123,6 +124,15 @@ Then provide the zone placement info for that target:
         --index-pool default.rgw.temporary.index \
         --data-extra-pool default.rgw.temporary.non-ec
 
         --index-pool default.rgw.temporary.index \
         --data-extra-pool default.rgw.temporary.non-ec
 
+.. note:: With default placement target settings, RGW stores an object's first data chunk in the RADOS "head" object along
+          with xattr metadata. The `--placement-inline-data=false` flag may be passed with the `zone placement add` or
+          `zone placement modify` commands to change this behavior for new objects stored on the target.
+          When data is stored inline (default), it may provide an advantage for read/write workloads since the first chunk of
+          an object's data can be retrieved/stored in a single librados call along with object metadata. On the other hand, a
+          target that does not store data inline can provide a performance benefit for RGW client delete requests when
+          the BlueStore DB is located on faster storage than bucket data since it eliminates the need to access
+          slower devices synchronously while processing the client request. In that case, data associated with the deleted
+          objects is removed asynchronously in the background by garbage collection.                                          
 .. _adding_a_storage_class:
 
 Adding a Storage Class
 .. _adding_a_storage_class:
 
 Adding a Storage Class
index 2a19245a5941d89e0902fb97477049fa50b3d136..694f89167556a98c6634ec3da371ad7cef79f597 100644 (file)
@@ -42,7 +42,7 @@ The following table describes the support status for current Amazon S3 functiona
 +---------------------------------+-----------------+----------------------------------------+
 | **Bucket Lifecycle**            | Supported       |                                        |
 +---------------------------------+-----------------+----------------------------------------+
 +---------------------------------+-----------------+----------------------------------------+
 | **Bucket Lifecycle**            | Supported       |                                        |
 +---------------------------------+-----------------+----------------------------------------+
-| **Bucket Replication**          | Partial         | Only permitted across zones            |
+| **Bucket Replication**          | Partial         | Permitted only across zones            |
 +---------------------------------+-----------------+----------------------------------------+
 | **Policy (Buckets, Objects)**   | Supported       | ACLs & bucket policies are supported   |
 +---------------------------------+-----------------+----------------------------------------+
 +---------------------------------+-----------------+----------------------------------------+
 | **Policy (Buckets, Objects)**   | Supported       | ACLs & bucket policies are supported   |
 +---------------------------------+-----------------+----------------------------------------+
index abfb89e87cfc057d4d214e462146991a1326383a..bc3545966b4dc51f91f5e3e7f5bf1c1cd9da8cac 100644 (file)
@@ -43,10 +43,13 @@ An example of the session tags that are passed in by the IDP in the web token is
         "active": true
     }
 
         "active": true
     }
 
-Steps to configure Keycloak to pass tags in the web token are described here:doc:`keycloak`.
+Steps to configure Keycloak to pass tags in the web token are described here:
+:ref:`radosgw_keycloak`.
 
 
-The trust policy must have 'sts:TagSession' permission if the web token passed in by the federated user contains session tags, otherwise
-the AssumeRoleWithWebIdentity action will fail. An example of the trust policy with sts:TagSession is as follows:
+The trust policy must have 'sts:TagSession' permission if the web token passed
+in by the federated user contains session tags, otherwise the
+AssumeRoleWithWebIdentity action will fail. An example of the trust policy with
+sts:TagSession is as follows:
 
 .. code-block:: python
 
 
 .. code-block:: python
 
@@ -421,4 +424,4 @@ JWT (access token) by the IDP
     eq(s3_put_obj['ResponseMetadata']['HTTPStatusCode'],200)
 
     s3_get_obj = s3client2.get_object(Bucket=bucket_name, Key=key)
     eq(s3_put_obj['ResponseMetadata']['HTTPStatusCode'],200)
 
     s3_get_obj = s3client2.get_object(Bucket=bucket_name, Key=key)
-    eq(s3_get_obj['ResponseMetadata']['HTTPStatusCode'],200)
\ No newline at end of file
+    eq(s3_get_obj['ResponseMetadata']['HTTPStatusCode'],200)
index e15e81bb98554dac2974c742890475097fdbe3fd..bf8c930f30c7b150122f9f540fadf931e38f6eb0 100644 (file)
@@ -12,21 +12,21 @@ iSCSI Initiator for Linux
 
 Install the iSCSI initiator and multipath tools:
 
 
 Install the iSCSI initiator and multipath tools:
 
-   ::
+.. prompt:: bash #
 
 
-       # yum install iscsi-initiator-utils
-       # yum install device-mapper-multipath
+   yum install iscsi-initiator-utils
+   yum install device-mapper-multipath
 
 **Configuring:**
 
 #. Create the default ``/etc/multipath.conf`` file and enable the
    ``multipathd`` service:
 
 
 **Configuring:**
 
 #. Create the default ``/etc/multipath.conf`` file and enable the
    ``multipathd`` service:
 
-   ::
+   .. prompt:: bash #
 
 
-       # mpathconf --enable --with_multipathd y
+      mpathconf --enable --with_multipathd y
 
 
-#. Add the following to ``/etc/multipath.conf`` file:
+#. Add the following to the ``/etc/multipath.conf`` file:
 
    ::
 
 
    ::
 
@@ -48,51 +48,72 @@ Install the iSCSI initiator and multipath tools:
 
 #. Restart the ``multipathd`` service:
 
 
 #. Restart the ``multipathd`` service:
 
-   ::
+   .. prompt:: bash #
 
 
-       # systemctl reload multipathd
+      systemctl reload multipathd
 
 **iSCSI Discovery and Setup:**
 
 
 **iSCSI Discovery and Setup:**
 
-#. If CHAP was setup on the iSCSI gateway, provide a CHAP username and
-   password by updating the ``/etc/iscsi/iscsid.conf`` file accordingly.
+#. Enable CHAP authentication and provide the initiator CHAP username
+   and password by uncommenting and setting the following options in
+   the ``/etc/iscsi/iscsid.conf`` file:
+
+   ::
+
+       node.session.auth.authmethod = CHAP
+       node.session.auth.username = myusername
+       node.session.auth.password = mypassword
+
+   If you intend to use mutual (bidirectional) authentication, provide the
+   target CHAP username and password:
+
+   ::
+
+       node.session.auth.username_in = mytgtusername
+       node.session.auth.password_in = mytgtpassword
 
 #. Discover the target portals:
 
 
 #. Discover the target portals:
 
+   .. prompt:: bash #
+
+      iscsiadm -m discovery -t st -p 192.168.56.101
+
    ::
 
    ::
 
-       # iscsiadm -m discovery -t st -p 192.168.56.101
        192.168.56.101:3260,1 iqn.2003-01.org.linux-iscsi.rheln1
        192.168.56.102:3260,2 iqn.2003-01.org.linux-iscsi.rheln1
 
        192.168.56.101:3260,1 iqn.2003-01.org.linux-iscsi.rheln1
        192.168.56.102:3260,2 iqn.2003-01.org.linux-iscsi.rheln1
 
-#. Login to target:
+#. Log in to the target:
 
 
-   ::
+   .. prompt:: bash #
 
 
-       # iscsiadm -m node -T iqn.2003-01.org.linux-iscsi.rheln1 -l
+      iscsiadm -m node -T iqn.2003-01.org.linux-iscsi.rheln1 -l
 
 **Multipath IO Setup:**
 
 
 **Multipath IO Setup:**
 
-The multipath daemon (``multipathd``), will set up devices automatically
-based on the ``multipath.conf`` settings. Running the ``multipath``
-command show devices setup in a failover configuration with a priority
-group for each path.
+#. The multipath daemon (``multipathd``) uses the ``multipath.conf`` settings
+   to set up devices automatically. Running the ``multipath`` command shows
+   that the devices have been set up in a failover configuration. Notice that
+   each path has been placed into its own priority group: 
 
 
-::
+   .. prompt:: bash #
 
 
-    # multipath -ll
-    mpathbt (360014059ca317516a69465c883a29603) dm-1 LIO-ORG ,IBLOCK
-    size=1.0G features='0' hwhandler='1 alua' wp=rw
-    |-+- policy='queue-length 0' prio=50 status=active
-    | `- 28:0:0:1 sde  8:64  active ready running
-    `-+- policy='queue-length 0' prio=10 status=enabled
-      `- 29:0:0:1 sdc  8:32  active ready running
+      multipath -ll
 
 
-You should now be able to use the RBD image like you would a normal
-multipath’d iSCSI disk.
+   ::
 
 
-4. Logout from target:
+       mpathbt (360014059ca317516a69465c883a29603) dm-1 LIO-ORG ,IBLOCK
+       size=1.0G features='0' hwhandler='1 alua' wp=rw
+       |-+- policy='queue-length 0' prio=50 status=active
+       | `- 28:0:0:1 sde  8:64  active ready running
+       `-+- policy='queue-length 0' prio=10 status=enabled
+         `- 29:0:0:1 sdc  8:32  active ready running
 
 
-   ::
+   You should now be able to use the RBD image in the same way that you would
+   use a normal multipath iSCSI disk.
+
+#. Log out of the target:
+
+   .. prompt:: bash #
 
 
-      iscsiadm -m node -T iqn.2003-01.org.linux-iscsi.rheln1 -u
+      iscsiadm -m node -T iqn.2003-01.org.linux-iscsi.rheln1 -u
index 69085ddc3b841f38c664a3aab59d0a48dbe1c0de..879083c3f671b614ac66057dd33d751cb224095f 100644 (file)
@@ -4,19 +4,18 @@
 Ceph iSCSI Gateway
 ==================
 
 Ceph iSCSI Gateway
 ==================
 
-The iSCSI Gateway presents
-a Highly Available (HA) iSCSI target that exports RADOS Block Device (RBD) images
-as SCSI disks. The iSCSI protocol allows clients (initiators) to send SCSI commands
-to storage devices (targets) over a TCP/IP network, enabling clients without
-native Ceph client support to access Ceph block storage.  These include
-Microsoft Windows and even BIOS.
-
-Each iSCSI gateway exploits the Linux IO target kernel subsystem (LIO) to provide
-iSCSI protocol support. LIO utilizes userspace passthrough (TCMU) to interact
-with Ceph's librbd library and expose RBD images to iSCSI clients. With Ceph’s
-iSCSI gateway you can provision a fully integrated block-storage
-infrastructure with all the features and benefits of a conventional Storage Area
-Network (SAN).
+The iSCSI Gateway presents a Highly Available (HA) iSCSI target that exports
+RADOS Block Device (RBD) images as SCSI disks. The iSCSI protocol allows
+clients (initiators) to send SCSI commands to storage devices (targets) over a
+TCP/IP network, enabling clients without native Ceph client support to access
+Ceph block storage.  
+
+Each iSCSI gateway exploits the Linux IO target kernel subsystem (LIO) to
+provide iSCSI protocol support. LIO utilizes userspace passthrough (TCMU) to
+interact with Ceph's librbd library and expose RBD images to iSCSI clients.
+With Ceph’s iSCSI gateway you can provision a fully integrated block-storage
+infrastructure with all the features and benefits of a conventional Storage
+Area Network (SAN).
 
 .. ditaa::
                   Cluster Network (optional)
 
 .. ditaa::
                   Cluster Network (optional)
@@ -43,6 +42,11 @@ Network (SAN).
                              |   +-----------+   |
                              +-------------------+
 
                              |   +-----------+   |
                              +-------------------+
 
+.. warning::
+
+   The iSCSI gateway is in maintenance as of November 2022. This means that
+   it is no longer in active development and will not be updated to add
+   new features. 
 
 .. toctree::
   :maxdepth: 1
 
 .. toctree::
   :maxdepth: 1
index d74efe7099f5769a6c130c9d46fdfb124b0aece2..0bbcb261160dd56a888c6f3c49490db537932165 100644 (file)
@@ -16,206 +16,308 @@ details.
 Create a Block Device Pool
 ==========================
 
 Create a Block Device Pool
 ==========================
 
-#. On the admin node, use the ``ceph`` tool to `create a pool`_.
+#. Use the ``ceph`` tool to `create a pool`_.
 
 
-#. On the admin node, use the ``rbd`` tool to initialize the pool for use by RBD::
+#. Use the ``rbd`` tool to initialize the pool for use by RBD:
 
 
-        rbd pool init <pool-name>
+   .. prompt:: bash $
+
+      rbd pool init <pool-name>
+
+   .. note:: The ``rbd`` tool assumes a default pool name of 'rbd' if no pool
+      name is specified in the command.
 
 
-.. note:: The ``rbd`` tool assumes a default pool name of 'rbd' when not
-   provided.
 
 Create a Block Device User
 ==========================
 
 
 Create a Block Device User
 ==========================
 
-Unless specified, the ``rbd`` command will access the Ceph cluster using the ID
-``admin``. This ID allows full administrative access to the cluster. It is
-recommended that you utilize a more restricted user wherever possible.
+Unless otherwise specified, the ``rbd`` command uses the Ceph user ID ``admin``
+to access the Ceph cluster. The ``admin`` Ceph user ID allows full
+administrative access to the cluster. We recommend that you acess the Ceph
+cluster with a Ceph user ID that has fewer permissions than the ``admin`` Ceph
+user ID does. We call this non-``admin`` Ceph user ID a "block device user" or
+"Ceph user".
+
+To `create a Ceph user`_, use the ``ceph auth get-or-create`` command to
+specify the Ceph user ID name, monitor caps (capabilities), and OSD caps
+(capabilities):
 
 
-To `create a Ceph user`_, with ``ceph`` specify the ``auth get-or-create``
-command, user name, monitor caps, and OSD caps::
+.. prompt:: bash $
 
 
-        ceph auth get-or-create client.{ID} mon 'profile rbd' osd 'profile {profile name} [pool={pool-name}][, profile ...]' mgr 'profile rbd [pool={pool-name}]'
+   ceph auth get-or-create client.{ID} mon 'profile rbd' osd 'profile {profile name} [pool={pool-name}][, profile ...]' mgr 'profile rbd [pool={pool-name}]'
 
 
-For example, to create a user ID named ``qemu`` with read-write access to the
-pool ``vms`` and read-only access to the pool ``images``, execute the
-following::
+For example: to create a Ceph user ID named ``qemu`` that has read-write access
+to the pool ``vms`` and read-only access to the pool ``images``, run the
+following command:
 
 
-       ceph auth get-or-create client.qemu mon 'profile rbd' osd 'profile rbd pool=vms, profile rbd-read-only pool=images' mgr 'profile rbd pool=images'
+.. prompt:: bash $
 
 
-The output from the ``ceph auth get-or-create`` command will be the keyring for
-the specified user, which can be written to ``/etc/ceph/ceph.client.{ID}.keyring``.
+   ceph auth get-or-create client.qemu mon 'profile rbd' osd 'profile rbd pool=vms, profile rbd-read-only pool=images' mgr 'profile rbd pool=images'
 
 
-.. note:: The user ID can be specified when using the ``rbd`` command by
-        providing the ``--id {id}`` optional argument.
+The output from the ``ceph auth get-or-create`` command is the keyring for the
+specified Ceph user ID, which can be written to
+``/etc/ceph/ceph.client.{ID}.keyring``.
+
+.. note:: Specify the Ceph user ID by providing the ``--id {id} argument when
+   using the ``rbd`` command. This argument is optional. 
 
 Creating a Block Device Image
 =============================
 
 Before you can add a block device to a node, you must create an image for it in
 
 Creating a Block Device Image
 =============================
 
 Before you can add a block device to a node, you must create an image for it in
-the :term:`Ceph Storage Cluster` first. To create a block device image, execute
-the  following::
+the :term:`Ceph Storage Cluster`. To create a block device image, run a command of this form: 
+
+.. prompt:: bash $
 
 
-       rbd create --size {megabytes} {pool-name}/{image-name}
+   rbd create --size {megabytes} {pool-name}/{image-name}
 
 For example, to create a 1GB image named ``bar`` that stores information in a
 
 For example, to create a 1GB image named ``bar`` that stores information in a
-pool named ``swimmingpool``, execute the following::
+pool named ``swimmingpool``, run this command:
+
+.. prompt:: bash $
 
 
-       rbd create --size 1024 swimmingpool/bar
+   rbd create --size 1024 swimmingpool/bar
 
 
-If you don't specify pool when creating an image, it will be stored in the
-default pool ``rbd``. For example, to create a 1GB image named ``foo`` stored in
-the default pool ``rbd``, execute the following::
+If you don't specify a pool when you create an image, then the image will be
+stored in the default pool ``rbd``. For example, if you ran this command, you
+would create a 1GB image named ``foo`` that is stored in the default pool
+``rbd``:
 
 
-       rbd create --size 1024 foo
+.. prompt:: bash $
 
 
-.. note:: You must create a pool first before you can specify it as a 
-   source. See `Storage Pools`_ for details.
+   rbd create --size 1024 foo
+
+.. note:: You must create a pool before you can specify it as a source. See
+   `Storage Pools`_ for details.
 
 Listing Block Device Images
 ===========================
 
 
 Listing Block Device Images
 ===========================
 
-To list block devices in the ``rbd`` pool, execute the following
-(i.e., ``rbd`` is the default pool name):: 
+To list block devices in the ``rbd`` pool, run the following command:
+
+.. prompt:: bash $
+
+   rbd ls
 
 
-       rbd ls
+.. note:: ``rbd`` is the default pool name, and ``rbd ls`` lists the commands
+   in the default pool.
 
 
-To list block devices in a particular pool, execute the following,
-but replace ``{poolname}`` with the name of the pool:
+To list block devices in a particular pool, run the following command, but
+replace ``{poolname}`` with the name of the pool
 
 
-       rbd ls {poolname}
+.. prompt:: bash $
+
+   rbd ls {poolname}
        
        
-For example::
+For example:
+
+.. prompt:: bash $
 
 
-       rbd ls swimmingpool
+   rbd ls swimmingpool
 
 
-To list deferred delete block devices in the ``rbd`` pool, execute the 
-following:: 
+To list "deferred delete" block devices in the ``rbd`` pool, run the
+following command:
 
 
-        rbd trash ls
+.. prompt:: bash $
 
 
-To list deferred delete block devices in a particular pool, execute the 
-following, but replace ``{poolname}`` with the name of the pool:: 
+   rbd trash ls
 
 
-        rbd trash ls {poolname}
+To list "deferred delete" block devices in a particular pool, run the 
+following command, but replace ``{poolname}`` with the name of the pool:
 
 
-For example::
+.. prompt:: bash $
 
 
-        rbd trash ls swimmingpool
+   rbd trash ls {poolname}
+
+For example:
+
+.. prompt:: bash $
+
+   rbd trash ls swimmingpool
 
 Retrieving Image Information
 ============================
 
 
 Retrieving Image Information
 ============================
 
-To retrieve information from a particular image, execute the following,
-but replace ``{image-name}`` with the name for the image:: 
+To retrieve information from a particular image, run the following command, but
+replace ``{image-name}`` with the name for the image:
 
 
-       rbd info {image-name}
+.. prompt:: bash $
+
+   rbd info {image-name}
        
        
-For example::
+For example:
+
+.. prompt:: bash $
 
 
-       rbd info foo
+   rbd info foo
        
        
-To retrieve information from an image within a pool, execute the following,
-but replace ``{image-name}`` with the name of the image and replace ``{pool-name}``
-with the name of the pool:: 
+To retrieve information from an image within a pool, run the following command,
+but replace ``{image-name}`` with the name of the image and replace
+``{pool-name}`` with the name of the pool:
 
 
-       rbd info {pool-name}/{image-name}
+.. prompt:: bash $
 
 
-For example:: 
+   rbd info {pool-name}/{image-name}
 
 
-       rbd info swimmingpool/bar
+For example:
+
+.. prompt:: bash $
+
+   rbd info swimmingpool/bar
+
+.. note:: Other naming conventions are possible, and might conflict with the
+   naming convention described here. For example, ``userid/<uuid>`` is a
+   possible name for an RBD image, and such a name might (at the least) be
+   confusing. 
 
 Resizing a Block Device Image
 =============================
 
 :term:`Ceph Block Device` images are thin provisioned. They don't actually use
 
 Resizing a Block Device Image
 =============================
 
 :term:`Ceph Block Device` images are thin provisioned. They don't actually use
-any physical storage  until you begin saving data to them. However, they do have
-a maximum capacity  that you set with the ``--size`` option. If you want to
-increase (or decrease) the maximum size of a Ceph Block Device image, execute
-the following:: 
+any physical storage until you begin saving data to them. However, they do have
+a maximum capacity that you set with the ``--size`` option. If you want to
+increase (or decrease) the maximum size of a Ceph Block Device image, run one
+of the following commands:
+
+Increasing the Size of a Block Device Image
+-------------------------------------------
+
+.. prompt:: bash $
 
 
-       rbd resize --size 2048 foo (to increase)
-       rbd resize --size 2048 foo --allow-shrink (to decrease)
+   rbd resize --size 2048 foo
+
+Decreasing the Size of a Block Device Image
+-------------------------------------------
+
+.. prompt:: bash $
+
+   rbd resize --size 2048 foo --allow-shrink
 
 
 Removing a Block Device Image
 =============================
 
 
 
 Removing a Block Device Image
 =============================
 
-To remove a block device, execute the following, but replace ``{image-name}``
-with the name of the image you want to remove:: 
+To remove a block device, run the following command, but replace
+``{image-name}`` with the name of the image you want to remove:
+
+.. prompt:: bash $
+
+   rbd rm {image-name}
+
+For example:
+
+.. prompt:: bash $
+
+   rbd rm foo
+
+Removing a Block Device from a Pool
+-----------------------------------
+
+To remove a block device from a pool, run the following command but replace
+``{image-name}`` with the name of the image to be removed, and replace
+``{pool-name}`` with the name of the pool from which the image is to be
+removed:
+
+.. prompt:: bash $
 
 
-       rbd rm {image-name}
+   rbd rm {pool-name}/{image-name}
 
 
-For example:
+For example:
 
 
-       rbd rm foo
-To remove a block device from a pool, execute the following, but replace 
-``{image-name}`` with the name of the image to remove and replace 
-``{pool-name}`` with the name of the pool:: 
+.. prompt:: bash $
 
 
-       rbd rm {pool-name}/{image-name}
+   rbd rm swimmingpool/bar
 
 
-For example:: 
+"Defer Deleting" a Block Device from a Pool
+-------------------------------------------
 
 
-       rbd rm swimmingpool/bar
+To defer delete a block device from a pool (which entails moving it to the
+"trash" and deleting it later), run the following command but replace
+``{image-name}`` with the name of the image to be moved to the trash and
+replace ``{pool-name}`` with the name of the pool:
 
 
-To defer delete a block device from a pool, execute the following, but 
-replace ``{image-name}`` with the name of the image to move and replace 
-``{pool-name}`` with the name of the pool:: 
+.. prompt:: bash $
 
 
-        rbd trash mv {pool-name}/{image-name}
+   rbd trash mv {pool-name}/{image-name}
 
 
-For example:
+For example:
 
 
-        rbd trash mv swimmingpool/bar
+.. prompt:: bash $
 
 
-To remove a deferred block device from a pool, execute the following, but 
-replace ``{image-id}`` with the id of the image to remove and replace 
-``{pool-name}`` with the name of the pool:: 
+   rbd trash mv swimmingpool/bar
 
 
-        rbd trash rm {pool-name}/{image-id}
+Removing a Deferred Block Device from a Pool
+--------------------------------------------
 
 
-For example:: 
+To remove a deferred block device from a pool, run the following command but
+replace ``{image-}`` with the ID of the image to be removed, and replace
+``{pool-name}`` with the name of the pool from which the image is to be
+removed:
 
 
-        rbd trash rm swimmingpool/2bf4474b0dc51
+.. prompt:: bash $
+
+   rbd trash rm {pool-name}/{image-}
+
+For example:
+
+.. prompt:: bash $
+   
+   rbd trash rm swimmingpool/2bf4474b0dc51
 
 .. note::
 
 
 .. note::
 
-  * You can move an image to the trash even it has snapshot(s) or actively 
-    in-use by clones, but can not be removed from trash.
+  * You can move an image to the trash even if it has snapshot(s) or is
+    actively in use by clones. However, you cannot remove it from the trash
+    under those conditions.
 
 
-  * You can use *--expires-at* to set the defer time (default is ``now``), 
-    and if its deferment time has not expired, it can not be removed unless 
-    you use *--force*.
+  * You can use ``--expires-at`` to set the deferment time (default is
+    ``now``). If the deferment time has not yet arrived, you cannot remove the
+    image unless you use ``--force``.
 
 Restoring a Block Device Image
 ==============================
 
 
 Restoring a Block Device Image
 ==============================
 
-To restore a deferred delete block device in the rbd pool, execute the 
-following, but replace ``{image-id}`` with the id of the image::
+To restore a deferred delete block device in the rbd pool, run the 
+following command but replace ``{image-id}`` with the ID of the image:
+
+.. prompt:: bash $
+
+   rbd trash restore {image-id}
+
+For example:
+
+.. prompt:: bash $
+
+   rbd trash restore 2bf4474b0dc51
+
+Restoring a Block Device Image in a Specific Pool
+-------------------------------------------------
+
+To restore a deferred delete block device in a particular pool, run the
+following command but replace ``{image-id}`` with the ID of the image and
+replace ``{pool-name}`` with the name of the pool:
 
 
-        rbd trash restore {image-id}
+.. prompt:: bash $
 
 
-For example:: 
+  rbd trash restore {pool-name}/{image-id}
 
 
-        rbd trash restore 2bf4474b0dc51
+For example:
 
 
-To restore a deferred delete block device in a particular pool, execute 
-the following, but replace ``{image-id}`` with the id of the image and 
-replace ``{pool-name}`` with the name of the pool::
+.. prompt:: bash $
 
 
-        rbd trash restore {pool-name}/{image-id}
+   rbd trash restore swimmingpool/2bf4474b0dc51
 
 
-For example:: 
 
 
-        rbd trash restore swimmingpool/2bf4474b0dc51
+Renaming an Image While Restoring It
+------------------------------------
 
 You can also use ``--image`` to rename the image while restoring it. 
 
 
 You can also use ``--image`` to rename the image while restoring it. 
 
-For example::
+For example:
 
 
-        rbd trash restore swimmingpool/2bf4474b0dc51 --image new-name
+.. prompt:: bash $
+   
+   rbd trash restore swimmingpool/2bf4474b0dc51 --image new-name
 
 
 .. _create a pool: ../../rados/operations/pools/#create-a-pool
 
 
 .. _create a pool: ../../rados/operations/pools/#create-a-pool
index 81a6ce9d760a2b6499b50403d96ecf9d167ec635..f9b99dfb44305c7235f4595a13cdb1e2bbf61ec8 100644 (file)
@@ -6,78 +6,99 @@
 
 .. index:: Ceph Block Device; RBD exclusive locks; exclusive-lock
 
 
 .. index:: Ceph Block Device; RBD exclusive locks; exclusive-lock
 
-Exclusive locks are a mechanism designed to prevent multiple processes
-from accessing the same Rados Block Device (RBD) in an uncoordinated
-fashion. Exclusive locks are heavily used in virtualization (where
-they prevent VMs from clobbering each others' writes), and also in RBD
-mirroring (where they are a prerequisite for journaling).
-
-Exclusive locks are enabled on newly created images by default, unless
-overridden via the ``rbd_default_features`` configuration option or
-the ``--image-feature`` flag for ``rbd create``.
-
-In order to ensure proper exclusive locking operations, any client
-using an RBD image whose ``exclusive-lock`` feature is enabled should
-be using a CephX identity whose capabilities include ``profile rbd``.
-
-Exclusive locking is mostly transparent to the user.
-
-#. Whenever any ``librbd`` client process or kernel RBD client
-   starts using an RBD image on which exclusive locking has been
-   enabled, it obtains an exclusive lock on the image before the first
-   write.
-
-#. Whenever any such client process gracefully terminates, it
-   automatically relinquishes the lock.
-
-#. This subsequently enables another process to acquire the lock, and
-   write to the image.
-
-Note that it is perfectly possible for two or more concurrently
-running processes to merely open the image, and also to read from
-it. The client acquires the exclusive lock only when attempting to
-write to the image. To disable transparent lock transitions between
-multiple clients, it needs to acquire the lock specifically with
-``RBD_LOCK_MODE_EXCLUSIVE``.
+Exclusive locks are mechanisms designed to prevent multiple processes from
+accessing the same Rados Block Device (RBD) in an uncoordinated fashion.
+Exclusive locks are used heavily in virtualization (where they prevent VMs from
+clobbering each other's writes) and in `RBD mirroring`_ (where they are a
+prerequisite for journaling in journal-based mirroring and fast generation of
+incremental diffs in snapshot-based mirroring).
+
+The ``exclusive-lock`` feature is enabled on newly created images. This default
+can be overridden via the ``rbd_default_features`` configuration option or the
+``--image-feature`` and ``--image-shared`` options for ``rbd create`` command.
+
+.. note::
+   Many image features, including ``object-map`` and ``fast-diff``, depend upon
+   exclusive locking. Disabling the ``exclusive-lock`` feature will negatively
+   affect the performance of some operations.
+
+To maintain multi-client access, the ``exclusive-lock`` feature implements
+automatic cooperative lock transitions between clients. It ensures that only
+a single client can write to an RBD image at any given time and thus protects
+internal image structures such as the object map, the journal or the `PWL
+cache`_ from concurrent modification.
+
+Exclusive locking is mostly transparent to the user:
+
+* Whenever a client (a ``librbd`` process or, in case of a ``krbd`` client,
+  a client node's kernel) needs to handle a write to an RBD image on which
+  exclusive locking has been enabled, it first acquires an exclusive lock on
+  the image. If the lock is already held by some other client, that client is
+  requested to release it.
+
+* Whenever a client that holds an exclusive lock on an RBD image gets
+  a request to release the lock, it stops handling writes, flushes its caches
+  and releases the lock.
+
+* Whenever a client that holds an exclusive lock on an RBD image terminates
+  gracefully, the lock is also released gracefully.
+
+* A graceful release of an exclusive lock on an RBD image (whether by request
+  or due to client termination) enables another, subsequent, client to acquire
+  the lock and start handling writes.
+
+.. warning::
+   By default, the ``exclusive-lock`` feature does not prevent two or more
+   concurrently running clients from opening the same RBD image and writing to
+   it in turns (whether on the same node or not). In effect, their writes just
+   get linearized as the lock is automatically transitioned back and forth in
+   a cooperative fashion.
+
+.. note::
+   To disable automatic lock transitions between clients, the
+   ``RBD_LOCK_MODE_EXCLUSIVE`` flag may be specified when acquiring the
+   exclusive lock. This is exposed by the ``--exclusive`` option for ``rbd
+   device map`` command.
 
 
 Blocklisting
 ============
 
 
 
 Blocklisting
 ============
 
-Sometimes, a client process (or, in case of a krbd client, a client
-node's kernel thread) that previously held an exclusive lock on an
-image does not terminate gracefully, but dies abruptly. This may be
-due to having received a ``KILL`` or ``ABRT`` signal, for example, or
-a hard reboot or power failure of the client node. In that case, the
-exclusive lock is never gracefully released. Thus, when a new process
-starts and attempts to use the device, it needs a way to break the
-previously held exclusive lock.
-
-However, a process (or kernel thread) may also hang, or merely lose
-network connectivity to the Ceph cluster for some amount of time. In
-that case, simply breaking the lock would be potentially catastrophic:
-the hung process or connectivity issue may resolve itself, and the old
-process may then compete with one that has started in the interim,
-accessing RBD data in an uncoordinated and destructive manner.
-
-Thus, in the event that a lock cannot be acquired in the standard
-graceful manner, the overtaking process not only breaks the lock, but
-also blocklists the previous lock holder. This is negotiated between
-the new client process and the Ceph Mon: upon receiving the blocklist
-request,
-
-* the Mon instructs the relevant OSDs to no longer serve requests from
-  the old client process;
-* once the associated OSD map update is complete, the Mon grants the
-  lock to the new client;
-* once the new client has acquired the lock, it can commence writing
+Sometimes a client that previously held an exclusive lock on an RBD image does
+not terminate gracefully, but dies abruptly. This may be because the client
+process received a ``KILL`` or ``ABRT`` signal, or because the client node
+underwent a hard reboot or suffered a power failure. In cases like this, the
+lock is never gracefully released. This means that any new client that comes up
+and attempts to write to the image must break the previously held exclusive
+lock.
+
+However, a process (or kernel thread) may hang or merely lose network
+connectivity to the Ceph cluster for some amount of time. In that case,
+breaking the lock would be potentially catastrophic: the hung process or
+connectivity issue could resolve itself and the original process might then
+compete with one that started in the interim, thus accessing RBD data in an
+uncoordinated and destructive manner.
+
+In the event that a lock cannot be acquired in the standard graceful manner,
+the overtaking process not only breaks the lock but also blocklists the
+previous lock holder. This is negotiated between the new client process and the
+Ceph Monitor. 
+
+* Upon receiving the blocklist request, the monitor instructs the relevant OSDs
+  to no longer serve requests from the old client process;
+* after the associated OSD map update is complete, the new client can break the
+  previously held lock;
+* after the new client has acquired the lock, it can commence writing
   to the image.
 
 Blocklisting is thus a form of storage-level resource `fencing`_.
 
   to the image.
 
 Blocklisting is thus a form of storage-level resource `fencing`_.
 
-In order for blocklisting to work, the client must have the ``osd
-blocklist`` capability. This capability is included in the ``profile
-rbd`` capability profile, which should generally be set on all Ceph
-:ref:`client identities <user-management>` using RBD.
+.. note::
+   In order for blocklisting to work, the client must have the ``osd
+   blocklist`` capability. This capability is included in the ``profile
+   rbd`` capability profile, which should be set generally on all Ceph
+   :ref:`client identities <user-management>` using RBD.
 
 
+.. _RBD mirroring: ../rbd-mirroring
+.. _PWL cache: ../rbd-persistent-write-log-cache
 .. _fencing: https://en.wikipedia.org/wiki/Fencing_(computing)
 .. _fencing: https://en.wikipedia.org/wiki/Fencing_(computing)
index 589b8af7fc3ab8d51135d4b51fe2cec6a78e6037..5bef7f592008cc00a2eb905c4b1cd4836206c530 100644 (file)
@@ -50,29 +50,30 @@ Introduction and Generic Settings
 ---------------------------------
 
 The ``ceph-immutable-object-cache`` daemon is responsible for caching parent
 ---------------------------------
 
 The ``ceph-immutable-object-cache`` daemon is responsible for caching parent
-image content within its local caching directory. For better performance it's
-recommended to use SSDs as the underlying storage.
+image content within its local caching directory. Using SSDs as the underlying
+storage is recommended because doing so provides better performance. 
 
 The key components of the daemon are:
 
 
 The key components of the daemon are:
 
-#. **Domain socket based IPC:** The daemon will listen on a local domain
-   socket on start up and wait for connections from librbd clients.
-
-#. **LRU based promotion/demotion policy:** The daemon will maintain
-   in-memory statistics of cache-hits on each cache file. It will demote the
-   cold cache if capacity reaches to the configured threshold.
-
-#. **File-based caching store:** The daemon will maintain a simple file
-   based cache store. On promotion the RADOS objects will be fetched from
-   RADOS cluster and stored in the local caching directory.
-
-On opening each cloned rbd image, ``librbd`` will try to connect to the
-cache daemon through its Unix domain socket. Once successfully connected,
-``librbd`` will coordinate with the daemon on the subsequent reads.
-If there's a read that's not cached, the daemon will promote the RADOS object
-to local caching directory, so the next read on that object will be serviced
-from cache. The daemon also maintains simple LRU statistics so that under
-capacity pressure it will evict cold cache files as needed.
+#. **Domain socket based IPC:** The daemon listens on a local domain socket at 
+   startup and waits for connections from librbd clients.
+
+#. **LRU based promotion/demotion policy:** The daemon maintains in-memory
+   statistics of cache hits for each cache file. It demotes the cold cache
+   if capacity reaches the configured threshold.
+
+#. **File-based caching store:** The daemon maintains a simple file-based cache
+   store. On promotion, the RADOS objects are fetched from RADOS cluster and
+   stored in the local caching directory.
+
+When each cloned RBD image is opened, ``librbd`` tries to connect to the cache
+daemon through its Unix domain socket. After ``librbd`` is successfully
+connected, it coordinates with the daemon upon every subsequent read. In the
+case of an uncached read, the daemon promotes the RADOS object to the local
+caching directory and the next read of the object is serviced from the cache.
+The daemon maintains simple LRU statistics, which are used to evict cold cache
+files when required (for example, when the cache is at capacity and under
+pressure). 
 
 Here are some important cache configuration settings:
 
 
 Here are some important cache configuration settings:
 
index 96dec81c87c32fa6ac596e0ca1c8df39797239e7..120dd8ec1256c98290a96e16bdd1e07bf27719b2 100644 (file)
@@ -5,26 +5,29 @@
 .. index:: Ceph Block Device; snapshots
 
 A snapshot is a read-only logical copy of an image at a particular point in
 .. index:: Ceph Block Device; snapshots
 
 A snapshot is a read-only logical copy of an image at a particular point in
-time: a checkpoint. One of the advanced features of Ceph block devices is
-that you can create snapshots of images to retain point-in-time state history.
-Ceph also supports snapshot layering, which allows you to clone images (e.g., a
-VM image) quickly and easily. Ceph block device snapshots are managed using the
-``rbd``  command and multiple higher level interfaces, including `QEMU`_,
-`libvirt`_, `OpenStack`_ and `CloudStack`_.
+time: a checkpoint. One of the advanced features of Ceph block devices is that
+you can create snapshots of images to retain point-in-time state history.  Ceph
+also supports snapshot layering, which allows you to clone images (for example,
+VM images) quickly and easily. Ceph block device snapshots are managed using
+the ``rbd`` command and several higher-level interfaces, including `QEMU`_,
+`libvirt`_, `OpenStack`_, and `CloudStack`_.
 
 .. important:: To use RBD snapshots, you must have a running Ceph cluster.
 
 
 .. important:: To use RBD snapshots, you must have a running Ceph cluster.
 
-.. note:: Because RBD does not know about any filesystem within an image
-          (volume), snapshots are only `crash-consistent` unless they are
-          coordinated within the mounting (attaching) operating system.
-          We therefore recommend that you pause or stop I/O before taking a snapshot.
-          If the volume contains a filesystem, it should be in an internally
-          consistent state before taking a snapshot.  Snapshots taken without
-          write quiescing may need an `fsck` pass before subsequent
-          mounting.  To quiesce `I/O` you can use `fsfreeze` command. See
-         `fsfreeze(8)` man page for more details.
-         For virtual machines, `qemu-guest-agent` can be used to automatically
-         freeze file systems when creating a snapshot.
+
+.. note:: Because RBD is unaware of any file system within an image (volume),
+   snapshots are merely `crash-consistent` unless they are coordinated within
+   the mounting (attaching) operating system. We therefore recommend that you
+   pause or stop I/O before taking a snapshot.  
+   
+   If the volume contains a file system, the file system should be in an
+   internally consistent state before a snapshot is taken. Snapshots taken
+   without write quiescing could need an `fsck` pass before they are mounted
+   again. To quiesce I/O you can use `fsfreeze` command. See the `fsfreeze(8)`
+   man page for more details. 
+   
+   For virtual machines, `qemu-guest-agent` can be used to automatically freeze
+   file systems when creating a snapshot.
 
 .. ditaa::
 
 
 .. ditaa::
 
@@ -41,19 +44,22 @@ Cephx Notes
 
 When `cephx`_ authentication is enabled (it is by default), you must specify a
 user name or ID and a path to the keyring containing the corresponding key. See
 
 When `cephx`_ authentication is enabled (it is by default), you must specify a
 user name or ID and a path to the keyring containing the corresponding key. See
-:ref:`User Management <user-management>` for details. You may also set the
-``CEPH_ARGS`` environment variable to avoid re-entry of these parameters. ::
+:ref:`User Management <user-management>` for details. 
+
+.. prompt:: bash $
+
+       rbd --id {user-ID} --keyring /path/to/secret [commands]
+       rbd --name {username} --keyring /path/to/secret [commands]
 
 
-       rbd --id {user-ID} --keyring=/path/to/secret [commands]
-       rbd --name {username} --keyring=/path/to/secret [commands]
+For example:
 
 
-For example:: 
+.. prompt:: bash $
 
 
-       rbd --id admin --keyring=/etc/ceph/ceph.keyring [commands]
-       rbd --name client.admin --keyring=/etc/ceph/ceph.keyring [commands]
+       rbd --id admin --keyring /etc/ceph/ceph.keyring [commands]
+       rbd --name client.admin --keyring /etc/ceph/ceph.keyring [commands]
 
 
-.. tip:: Add the user and secret to the ``CEPH_ARGS`` environment 
-   variable so that you don't need to enter them each time.
+.. tip:: Add the user and secret to the ``CEPH_ARGS`` environment variable to
+   avoid re-entry of these parameters.
 
 
 Snapshot Basics
 
 
 Snapshot Basics
@@ -65,76 +71,97 @@ snapshots using the ``rbd`` command.
 Create Snapshot
 ---------------
 
 Create Snapshot
 ---------------
 
-To create a snapshot with ``rbd``, specify the ``snap create`` option, the pool
-name and the image name.  ::
+To create a snapshot, use the ``rbd snap create`` command and specify the pool
+name, the image name, and the snap name:
 
 
-       rbd snap create {pool-name}/{image-name}@{snap-name}
+.. prompt:: bash $
 
 
-For example:: 
+   rbd snap create {pool-name}/{image-name}@{snap-name}
 
 
-       rbd snap create rbd/foo@snapname
+For example:
+
+.. prompt:: bash $
+
+   rbd snap create rbd/foo@snapname
        
 
 List Snapshots
 --------------
 
        
 
 List Snapshots
 --------------
 
-To list snapshots of an image, specify the pool name and the image name. ::
+To list the snapshots of an image, use the ``rbd snap ls`` command and specify
+the pool name and the image name:
 
 
-       rbd snap ls {pool-name}/{image-name}
+.. prompt:: bash $
 
 
-For example::
+   rbd snap ls {pool-name}/{image-name}
 
 
-       rbd snap ls rbd/foo
+For example:
 
 
+.. prompt:: bash $
 
 
-Rollback Snapshot
------------------
+   rbd snap ls rbd/foo
 
 
-To rollback to a snapshot with ``rbd``, specify the ``snap rollback`` option, the
-pool name, the image name and the snap name. ::
 
 
-       rbd snap rollback {pool-name}/{image-name}@{snap-name}
+Roll back Snapshot
+------------------
 
 
-For example::
+To roll back to a snapshot,  use the ``rbd snap rollback`` command and specify
+the pool name, the image name, and the snap name:
 
 
-       rbd snap rollback rbd/foo@snapname
+.. prompt:: bash $
 
 
+   rbd snap rollback {pool-name}/{image-name}@{snap-name}
 
 
-.. note:: Rolling back an image to a snapshot means overwriting 
-   the current version of the image with data from a snapshot. The 
-   time it takes to execute a rollback increases with the size of the 
-   image. It is **faster to clone** from a snapshot **than to rollback** 
-   an image to a snapshot, and is the preferred method of returning
-   to a pre-existing state.
+For example:
+
+.. prompt:: bash $
+
+   rbd snap rollback rbd/foo@snapname
+
+
+.. note:: Rolling back an image to a snapshot means overwriting the current
+   version of the image with data from a snapshot. The time it takes to execute
+   a rollback increases with the size of the image. It is **faster to clone**
+   from a snapshot **than to roll back** an image to a snapshot. Cloning from a
+   snapshot is the preferred method of returning to a pre-existing state.
 
 
 Delete a Snapshot
 -----------------
 
 
 
 Delete a Snapshot
 -----------------
 
-To delete a snapshot with ``rbd``, specify the ``snap rm`` subcommand, the pool
-name, the image name and the snap name. ::
+To delete a snapshot, use the ``rbd snap rm`` command and specify the pool
+name, the image name, and the snap name:
 
 
-       rbd snap rm {pool-name}/{image-name}@{snap-name}
+.. prompt:: bash $
+
+   rbd snap rm {pool-name}/{image-name}@{snap-name}
        
        
-For example:: 
+For example:
+
+.. prompt:: bash $
 
 
-       rbd snap rm rbd/foo@snapname
+   rbd snap rm rbd/foo@snapname
 
 
 
 
-.. note:: Ceph OSDs delete data asynchronously, so deleting a snapshot 
-   doesn't immediately free up the underlying OSDs' capacity.
+.. note:: Ceph OSDs delete data asynchronously, so deleting a snapshot  does
+   not immediately free up the capacity of the underlying OSDs. This process is
+   known as "snaptrim", and is referred to as such in ``ceph status`` output.
 
 Purge Snapshots
 ---------------
 
 
 Purge Snapshots
 ---------------
 
-To delete all snapshots for an image with ``rbd``, specify the ``snap purge``
-subcommand and the image name. ::
+To delete all snapshots, use the ``rbd snap purge`` command and specify the
+pool name and the image name:
+
+.. prompt:: bash $
+
+   rbd snap purge {pool-name}/{image-name}
 
 
-       rbd snap purge {pool-name}/{image-name}
+For example:
 
 
-For example:: 
+.. prompt:: bash $
 
 
-       rbd snap purge rbd/foo
+   rbd snap purge rbd/foo
 
 
 .. index:: Ceph Block Device; snapshot layering
 
 
 .. index:: Ceph Block Device; snapshot layering
@@ -145,10 +172,9 @@ Layering
 Ceph supports the ability to create many copy-on-write (COW) clones of a block
 device snapshot. Snapshot layering enables Ceph block device clients to create
 images very quickly. For example, you might create a block device image with a
 Ceph supports the ability to create many copy-on-write (COW) clones of a block
 device snapshot. Snapshot layering enables Ceph block device clients to create
 images very quickly. For example, you might create a block device image with a
-Linux VM written to it; then, snapshot the image, protect the snapshot, and
-create as many copy-on-write clones as you like. A snapshot is read-only, 
-so cloning a snapshot simplifies semantics--making it possible to create
-clones rapidly.
+Linux VM written to it, snapshot the image, protect the snapshot, and create as
+many copy-on-write clones as you like. A snapshot is read-only, so cloning a
+snapshot simplifies semantics, making it possible to create clones rapidly.
 
 
 .. ditaa::
 
 
 .. ditaa::
@@ -163,29 +189,30 @@ clones rapidly.
            
                Parent                        Child
 
            
                Parent                        Child
 
-.. note:: The terms "parent" and "child" refer to a Ceph block device snapshot (parent),
-   and the corresponding image cloned from the snapshot (child). These terms are
-   important for the command line usage below.
+.. note:: The terms "parent" and "child" refer to a Ceph block device snapshot
+   (parent) and the corresponding image cloned from the snapshot (child).
+   These terms are important for the command line usage below.
    
 Each cloned image (child) stores a reference to its parent image, which enables
    
 Each cloned image (child) stores a reference to its parent image, which enables
-the cloned image to open the parent snapshot and read it.   
+the cloned image to open the parent snapshot and read it.
 
 
-A COW clone of a snapshot behaves exactly like any other Ceph block device
-image. You can read to, write from, clone, and resize cloned images. There are
-no special restrictions with cloned images. However, the copy-on-write clone of
-a snapshot depends on the snapshot, so you **MUST** protect the snapshot before
-you clone it. The following diagram depicts the process.
+A copy-on-write clone of a snapshot behaves exactly like any other Ceph
+block device image. You can read to, write from, clone, and resize cloned
+images. There are no special restrictions with cloned images. However, the
+copy-on-write clone of a snapshot depends on the snapshot, so you must 
+protect the snapshot before you clone it. The diagram below depicts this
+process.
 
 
-.. note:: Ceph only supports cloning of RBD format 2 images (i.e., created with
-   ``rbd create --image-format 2``).  The kernel client supports cloned images
-   beginning with the 3.10 release.
+.. note:: Ceph supports the cloning of only "RBD format 2" images (that is,
+   images created without specifying ``--image-format 1``). The Linux kernel
+   client supports cloned images beginning with the 3.10 release.
 
 Getting Started with Layering
 -----------------------------
 
 
 Getting Started with Layering
 -----------------------------
 
-Ceph block device layering is a simple process. You must have an image. You must
-create a snapshot of the image. You must protect the snapshot. Once you have 
-performed these steps, you can begin cloning the snapshot.
+Ceph block device layering is a simple process. You must have an image. You
+must create a snapshot of the image. You must protect the snapshot. After you
+have performed these steps, you can begin cloning the snapshot.
 
 .. ditaa::
 
 
 .. ditaa::
 
@@ -206,107 +233,132 @@ performed these steps, you can begin cloning the snapshot.
 
 
 The cloned image has a reference to the parent snapshot, and includes the pool
 
 
 The cloned image has a reference to the parent snapshot, and includes the pool
-ID,  image ID and snapshot ID. The inclusion of the pool ID means that you may
-clone snapshots  from one pool to images in another pool.
-
-
-#. **Image Template:** A common use case for block device layering is to create a
-   master image and a snapshot that serves as a template for clones. For example, 
-   a user may create an image for a Linux distribution (e.g., Ubuntu 12.04), and 
-   create a snapshot for it. Periodically, the user may update the image and create
-   a new snapshot (e.g., ``sudo apt-get update``, ``sudo apt-get upgrade``,
-   ``sudo apt-get dist-upgrade`` followed by ``rbd snap create``). As the image
-   matures, the user can clone any one of the snapshots.
-
-#. **Extended Template:** A more advanced use case includes extending a template
-   image that provides more information than a base image. For example, a user may
-   clone an image (e.g., a VM template) and install other software (e.g., a database,
-   a content management system, an analytics system, etc.) and then snapshot the 
-   extended image, which itself may be updated just like the base image.
-
-#. **Template Pool:** One way to use block device layering is to create a 
-   pool that contains master images that act as templates, and snapshots of those
-   templates. You may then extend read-only privileges to users so that they 
-   may clone the snapshots without the ability to write or execute within the pool.
-
-#. **Image Migration/Recovery:** One way to use block device layering is to migrate
-   or recover data from one pool into another pool.
+ID, the image ID, and the snapshot ID. The inclusion of the pool ID means that
+you may clone snapshots from one pool to images in another pool.
+
+#. **Image Template:** A common use case for block device layering is to create
+   a base image and a snapshot that serves as a template for clones. For
+   example: a user may create an image for a Linux distribution (for example,
+   Ubuntu 22.04) and create a snapshot of it. The user may occasionally update
+   the image and create a new snapshot (by using such commands as ``sudo
+   apt-get update``, ``sudo apt-get upgrade``, or ``sudo apt-get dist-upgrade``
+   followed by ``rbd snap create``). As the image matures, the user can clone
+   any one of the snapshots.
+
+#. **Extended Template:** A more advanced use case includes extending a
+   template image to provide more information than a base image. For
+   example, a user may clone an image (for example, a VM template) and install
+   other software (for example, a database, a content management system, an
+   analytics system) and then snapshot the extended image, which may itself be
+   updated just like the base image.
+
+#. **Template Pool:** One way to use block device layering is to create a pool
+   that contains (1) base images that act as templates and (2) snapshots of
+   those templates. You may then extend read-only privileges to users so that
+   they may clone the snapshots even though they do not have permissions that
+   allow them to write or execute within the pool.
+
+#. **Image Migration/Recovery:** One way to use block device layering is to
+   migrate or recover data from one pool into another pool.
 
 Protecting a Snapshot
 ---------------------
 
 
 Protecting a Snapshot
 ---------------------
 
-Clones access the parent snapshots. All clones would break if a user inadvertently 
-deleted the parent snapshot. To prevent data loss, you **MUST** protect the
-snapshot before you can clone it. ::
+Clones access the parent snapshots. All clones would break if a user
+inadvertently deleted the parent snapshot. To prevent data loss, you must 
+protect the snapshot before you can clone it:
+
+.. prompt:: bash $
 
 
-       rbd snap protect {pool-name}/{image-name}@{snapshot-name}
+   rbd snap protect {pool-name}/{image-name}@{snapshot-name}
 
 
-For example::
+For example:
 
 
-       rbd snap protect rbd/my-image@my-snapshot
+.. prompt:: bash $
+
+   rbd snap protect rbd/foo@snapname
 
 .. note:: You cannot delete a protected snapshot.
 
 Cloning a Snapshot
 ------------------
 
 
 .. note:: You cannot delete a protected snapshot.
 
 Cloning a Snapshot
 ------------------
 
-To clone a snapshot, specify you need to specify the parent pool, image and
-snapshot; and, the child pool and image name. You must protect the snapshot
-before  you can clone it. ::
+To clone a snapshot, specify the parent pool, the parent image, and the parent
+snapshot; and also the child pool together with the image name. You must
+protect the snapshot before you can clone it:
+
+.. prompt:: bash $
 
 
-       rbd clone {pool-name}/{parent-image}@{snap-name} {pool-name}/{child-image-name}
+   rbd clone {pool-name}/{parent-image-name}@{snap-name} {pool-name}/{child-image-name}
        
        
-For example:
+For example:
 
 
-       rbd clone rbd/my-image@my-snapshot rbd/new-image
+.. prompt:: bash $
+
+   rbd clone rbd/foo@snapname rbd/bar
        
        
-.. note:: You may clone a snapshot from one pool to an image in another pool. For example, 
-   you may maintain read-only images and snapshots as templates in one pool, and writeable
-   clones in another pool.
+
+.. note:: You may clone a snapshot from one pool to an image in another pool.
+   For example, you may maintain read-only images and snapshots as templates in
+   one pool, and writeable clones in another pool.
 
 Unprotecting a Snapshot
 -----------------------
 
 
 Unprotecting a Snapshot
 -----------------------
 
-Before you can delete a snapshot, you must unprotect it first. Additionally,
+Before you can delete a snapshot, you must first unprotect it. Additionally,
 you may *NOT* delete snapshots that have references from clones. You must
 you may *NOT* delete snapshots that have references from clones. You must
-flatten each clone of a snapshot, before you can delete the snapshot. :: 
+flatten or delete each clone of a snapshot before you can unprotect the
+snapshot:
+
+.. prompt:: bash $
+
+   rbd snap unprotect {pool-name}/{image-name}@{snapshot-name}
 
 
-       rbd snap unprotect {pool-name}/{image-name}@{snapshot-name}
+For example:
 
 
-For example::
+.. prompt:: bash $
 
 
-       rbd snap unprotect rbd/my-image@my-snapshot
+   rbd snap unprotect rbd/foo@snapname
 
 
 Listing Children of a Snapshot
 ------------------------------
 
 
 
 Listing Children of a Snapshot
 ------------------------------
 
-To list the children of a snapshot, execute the following::
+To list the children of a snapshot, use the ``rbd children`` command and
+specify the pool name, the image name, and the snap name:
 
 
-       rbd children {pool-name}/{image-name}@{snapshot-name}
+.. prompt:: bash $
 
 
-For example::
+   rbd children {pool-name}/{image-name}@{snapshot-name}
 
 
-       rbd children rbd/my-image@my-snapshot
+For example:
+
+.. prompt:: bash $
+
+   rbd children rbd/foo@snapname
 
 
 Flattening a Cloned Image
 -------------------------
 
 Cloned images retain a reference to the parent snapshot. When you remove the
 
 
 Flattening a Cloned Image
 -------------------------
 
 Cloned images retain a reference to the parent snapshot. When you remove the
-reference from the child clone to the parent snapshot, you effectively "flatten"
-the image by copying the information from the snapshot to the clone. The time
-it takes to flatten a clone increases with the size of the snapshot. To delete 
-a snapshot, you must flatten the child images first. ::
+reference to the parent snapshot from the clone, you effectively "flatten" the
+clone by copying the data stored in the snapshot to the clone.  The time it
+takes to flatten a clone increases with the size of the snapshot.  To delete a
+snapshot, you must first flatten the child images (or delete them):
+
+.. prompt:: bash $
+
+   rbd flatten {pool-name}/{image-name}
 
 
-       rbd flatten {pool-name}/{image-name}
+For example:
 
 
-For example:: 
+.. prompt:: bash $
 
 
-       rbd flatten rbd/new-image
+   rbd flatten rbd/bar
 
 
-.. note:: Since a flattened image contains all the information from the snapshot, 
-   a flattened image will take up more storage space than a layered clone.
+.. note:: Since a flattened image contains all the data stored in the snapshot,
+   a flattened image takes up more storage space than a layered clone does.
 
 
 .. _cephx: ../../rados/configuration/auth-config-ref/
 
 
 .. _cephx: ../../rados/configuration/auth-config-ref/
diff --git a/ceph/doc/releases/argonaut.rst b/ceph/doc/releases/argonaut.rst
deleted file mode 100644 (file)
index 409d1af..0000000
+++ /dev/null
@@ -1,185 +0,0 @@
-========
-Argonaut
-========
-
-Argonaut is the first stable release of Ceph.  It is named after a
-genus of octopuses, sometimes also referred to as paper nautiluses.
-
-
-v0.48.3 "argonaut"
-==================
-
-This release contains a critical fix that can prevent data loss or
-corruption after a power loss or kernel panic event.  Please upgrade
-immediately.
-
-Upgrading
----------
-
-* If you are using the undocumented ``ceph-disk-prepare`` and
-  ``ceph-disk-activate`` tools, they have several new features and
-  some additional functionality.  Please review the changes in
-  behavior carefully before upgrading.
-* The .deb packages now require xfsprogs.
-
-Notable changes
----------------
-
-* filestore: fix op_seq write order (fixes journal replay after power loss)
-* osd: fix occasional indefinitely hung "slow" request
-* osd: fix encoding for pool_snap_info_t when talking to pre-v0.48 clients
-* osd: fix heartbeat check
-* osd: reduce log noise about rbd watch
-* log: fixes for deadlocks in the internal logging code
-* log: make log buffer size adjustable
-* init script: fix for 'ceph status' across machines
-* radosgw: fix swift error handling
-* radosgw: fix swift authentication concurrency bug
-* radosgw: don't cache large objects
-* radosgw: fix some memory leaks
-* radosgw: fix timezone conversion on read
-* radosgw: relax date format restrictions
-* radosgw: fix multipart overwrite
-* radosgw: stop processing requests on client disconnect
-* radosgw: avoid adding port to url that already has a port
-* radosgw: fix copy to not override ETAG
-* common: make parsing of ip address lists more forgiving
-* common: fix admin socket compatibility with old protocol (for collectd plugin)
-* mon: drop dup commands on paxos reset
-* mds: fix loner selection for multiclient workloads
-* mds: fix compat bit checks
-* ceph-fuse: fix segfault on startup when keyring is missing
-* ceph-authtool: fix usage
-* ceph-disk-activate: misc backports
-* ceph-disk-prepare: misc backports
-* debian: depend on xfsprogs (we use xfs by default)
-* rpm: build rpms, some related Makefile changes
-
-For more detailed information, see :download:`the complete changelog <../changelog/v0.48.3argonaut.txt>`.
-
-v0.48.2 "argonaut"
-==================
-
-Upgrading
----------
-
-* The default search path for keyring files now includes /etc/ceph/ceph.$name.keyring.  If such files are present on your cluster, be aware that by default they may now be used.
-
-* There are several changes to the upstart init files.  These have not been previously documented or recommended.  Any existing users should review the changes before upgrading.
-
-* The ceph-disk-prepare and ceph-disk-active scripts have been updated significantly.  These have not been previously documented or recommended.  Any existing users should review the changes before upgrading.
-
-Notable changes
----------------
-
-* mkcephfs: fix keyring generation for mds, osd when default paths are used
-* radosgw: fix bug causing occasional corruption of per-bucket stats
-* radosgw: workaround to avoid previously corrupted stats from going negative
-* radosgw: fix bug in usage stats reporting on busy buckets
-* radosgw: fix Content-Range: header for objects bigger than 2 GB.
-* rbd: avoid leaving watch acting when command line tool errors out (avoids 30s delay on subsequent operations)
-* rbd: friendlier use of --pool/--image options for import (old calling convention still works)
-* librbd: fix rare snapshot creation race (could "lose" a snap when creation is concurrent)
-* librbd: fix discard handling when spanning holes
-* librbd: fix memory leak on discard when caching is enabled
-* objecter: misc fixes for op reordering
-* objecter: fix for rare startup-time deadlock waiting for osdmap
-* ceph: fix usage
-* mon: reduce log noise about "check_sub"
-* ceph-disk-activate: misc fixes, improvements
-* ceph-disk-prepare: partition and format osd disks automatically
-* upstart: start everyone on a reboot
-* upstart: always update the osd crush location on start if specified in the config
-* config: add /etc/ceph/ceph.$name.keyring to default keyring search path
-* ceph.spec: don't package crush headers
-
-For more detailed information, see :download:`the complete changelog <../changelog/v0.48.2argonaut.txt>`.
-
-v0.48.1 "argonaut"
-==================
-
-Upgrading
----------
-
-* The radosgw usage trim function was effectively broken in v0.48.  Earlier it would remove more usage data than what was requested.  This is fixed in v0.48.1, but the fix is incompatible.  The v0.48 radosgw-admin tool cannot be used to initiate the trimming; please use the v0.48.1 version.
-
-* v0.48.1 now explicitly indicates support for the CRUSH_TUNABLES feature.  No other version of Ceph requires this, yet, but future versions will when the tunables are adjusted from their historical defaults.
-
-* There are no other compatibility changes between v0.48.1 and v0.48.
-
-Notable changes
----------------
-
-* mkcephfs: use default 'keyring', 'osd data', 'osd journal' paths when not specified in conf
-* msgr: various fixes to socket error handling
-* osd: reduce scrub overhead
-* osd: misc peering fixes (past_interval sharing, pgs stuck in 'peering' states)
-* osd: fail on EIO in read path (do not silently ignore read errors from failing disks)
-* osd: avoid internal heartbeat errors by breaking some large transactions into pieces
-* osd: fix osdmap catch-up during startup (catch up and then add daemon to osdmap)
-* osd: fix spurious 'misdirected op' messages
-* osd: report scrub status via 'pg ... query'
-* rbd: fix race when watch registrations are resent
-* rbd: fix rbd image id assignment scheme (new image data objects have slightly different names)
-* rbd: fix perf stats for cache hit rate
-* rbd tool: fix off-by-one in key name (crash when empty key specified)
-* rbd: more robust udev rules
-* rados tool: copy object, pool commands
-* radosgw: fix in usage stats trimming
-* radosgw: misc API compatibility fixes (date strings, ETag quoting, swift headers, etc.)
-* ceph-fuse: fix locking in read/write paths
-* mon: fix rare race corrupting on-disk data
-* config: fix admin socket 'config set' command
-* log: fix in-memory log event gathering
-* debian: remove crush headers, include librados-config
-* rpm: add ceph-disk-{activate, prepare}
-
-For more detailed information, see :download:`the complete changelog <../changelog/v0.48.1argonaut.txt>`.
-
-v0.48 "argonaut"
-================
-
-Upgrading
----------
-
-* This release includes a disk format upgrade.  Each ceph-osd daemon, upon startup, will migrate its locally stored data to the new format.  This process can take a while (for large object counts, even hours), especially on non-btrfs file systems.
-
-* To keep the cluster available while the upgrade is in progress, we recommend you upgrade a storage node or rack at a time, and wait for the cluster to recover each time.  To prevent the cluster from moving data around in response to the OSD daemons being down for minutes or hours, you may want to::
-
-    ceph osd set noout
-
-  This will prevent the cluster from marking down OSDs as "out" and re-replicating the data elsewhere. If you do this, be sure to clear the flag when the upgrade is complete::
-
-    ceph osd unset noout
-
-* There is a encoding format change internal to the monitor cluster. The monitor daemons are careful to switch to the new format only when all members of the quorum support it.  However, that means that a partial quorum with new code may move to the new format, and a recovering monitor running old code will be unable to join (it will crash).  If this occurs, simply upgrading the remaining monitor will resolve the problem.
-
-* The ceph tool's -s and -w commands from previous versions are incompatible with this version. Upgrade your client tools at the same time you upgrade the monitors if you rely on those commands.
-
-* It is not possible to downgrade from v0.48 to a previous version.
-
-Notable changes
----------------
-
-* osd: stability improvements
-* osd: capability model simplification
-* osd: simpler/safer --mkfs (no longer removes all files; safe to re-run on active osd)
-* osd: potentially buggy FIEMAP behavior disabled by default
-* rbd: caching improvements
-* rbd: improved instrumentation
-* rbd: bug fixes
-* radosgw: new, scalable usage logging infrastructure
-* radosgw: per-user bucket limits
-* mon: streamlined process for setting up authentication keys
-* mon: stability improvements
-* mon: log message throttling
-* doc: improved documentation (ceph, rbd, radosgw, chef, etc.)
-* config: new default locations for daemon keyrings
-* config: arbitrary variable substitutions
-* improved 'admin socket' daemon admin interface (ceph --admin-daemon ...)
-* chef: support for multiple monitor clusters
-* upstart: basic support for monitors, mds, radosgw; osd support still a work in progress.
-
-The new default keyring locations mean that when enabling authentication (``auth supported = cephx``), keyring locations do not need to be specified if the keyring file is located inside the daemon's data directory (``/var/lib/ceph/$type/ceph-$id`` by default).
-
-There is also a lot of librbd code in this release that is laying the groundwork for the upcoming layering functionality, but is not actually used. Likewise, the upstart support is still incomplete and not recommended; we will backport that functionality later if it turns out to be non-disruptive.
diff --git a/ceph/doc/releases/bobtail.rst b/ceph/doc/releases/bobtail.rst
deleted file mode 100644 (file)
index a6695bf..0000000
+++ /dev/null
@@ -1,546 +0,0 @@
-=======
-Bobtail
-=======
-
-Bobtail is the second stable release of Ceph.  It is named after the
-bobtail squid (order Sepiolida), a group of cephalopods closely related to cuttlefish.
-
-v0.56.7 "bobtail"
-=================
-
-This bobtail update fixes a range of radosgw bugs (including an easily
-triggered crash from multi-delete), a possible data corruption issue
-with power failure on XFS, and several OSD problems, including a
-memory "leak" that will affect aged clusters.
-
-Notable changes
----------------
-
-* ceph-fuse: create finisher flags after fork()
-* debian: fix prerm/postinst hooks; do not restart daemons on upgrade
-* librados: fix async aio completion wakeup (manifests as rbd hang)
-* librados: fix hang when osd becomes full and then not full
-* librados: fix locking for aio completion refcounting
-* librbd python bindings: fix stripe_unit, stripe_count
-* librbd: make image creation default configurable
-* mon: fix validation of mds ids in mon commands
-* osd: avoid excessive disk updates during peering
-* osd: avoid excessive memory usage on scrub
-* osd: avoid heartbeat failure/suicide when scrubbing
-* osd: misc minor bug fixes
-* osd: use fdatasync instead of sync_file_range (may avoid xfs power-loss corruption)
-* rgw: escape prefix correctly when listing objects
-* rgw: fix copy attrs
-* rgw: fix crash on multi delete
-* rgw: fix locking/crash when using ops log socket
-* rgw: fix usage logging
-* rgw: handle deep uri resources
-
-For more detailed information, see :download:`the complete changelog <../changelog/v0.56.7.txt>`.
-
-
-v0.56.6 "bobtail"
-=================
-
-Notable changes
----------------
-
-* rgw: fix garbage collection
-* rpm: fix package dependencies
-
-For more detailed information, see :download:`the complete changelog <../changelog/v0.56.6.txt>`.
-
-
-v0.56.5 "bobtail"
-=================
-
-Upgrading
----------
-
-* ceph-disk[-prepare,-activate] behavior has changed in various ways.
-  There should not be any compatibility issues, but chef users should
-  be aware.
-
-Notable changes
----------------
-
-* mon: fix recording of quorum feature set (important for argonaut -> bobtail -> cuttlefish mon upgrades)
-* osd: minor peering bug fixes
-* osd: fix a few bugs when pools are renamed
-* osd: fix occasionally corrupted pg stats
-* osd: fix behavior when broken v0.56[.0] clients connect
-* rbd: avoid FIEMAP ioctl on import (it is broken on some kernels)
-* librbd: fixes for several request/reply ordering bugs
-* librbd: only set STRIPINGV2 feature on new images when needed
-* librbd: new async flush method to resolve qemu hangs (requires QEMU update as well)
-* librbd: a few fixes to flatten
-* ceph-disk: support for dm-crypt
-* ceph-disk: many backports to allow bobtail deployments with ceph-deploy, chef
-* sysvinit: do not stop starting daemons on first failure
-* udev: fixed rules for redhat-based distros
-* build fixes for raring
-
-For more detailed information, see :download:`the complete changelog <../changelog/v0.56.5.txt>`.
-
-v0.56.4 "bobtail"
-=================
-
-Upgrading
----------
-
-* There is a fix in the syntax for the output of 'ceph osd tree --format=json'.
-
-* The MDS disk format has changed from prior releases *and* from v0.57.  In particular,
-  upgrades to v0.56.4 are safe, but you cannot move from v0.56.4 to v0.57 if you are using
-  the MDS for CephFS; you must upgrade directly to v0.58 (or later) instead.
-
-Notable changes
----------------
-
-* mon: fix bug in bringup with IPv6
-* reduce default memory utilization by internal logging (all daemons)
-* rgw: fix for bucket removal
-* rgw: reopen logs after log rotation
-* rgw: fix multipat upload listing
-* rgw: don't copy object when copied onto self
-* osd: fix caps parsing for pools with - or _
-* osd: allow pg log trimming when degraded, scrubbing, recoverying (reducing memory consumption)
-* osd: fix potential deadlock when 'journal aio = true'
-* osd: various fixes for collection creation/removal, rename, temp collections
-* osd: various fixes for PG split
-* osd: deep-scrub omap key/value data
-* osd: fix rare bug in journal replay
-* osd: misc fixes for snapshot tracking
-* osd: fix leak in recovery reservations on pool deletion
-* osd: fix bug in connection management
-* osd: fix for op ordering when rebalancing
-* ceph-fuse: report file system size with correct units
-* mds: get and set directory layout policies via virtual xattrs
-* mds: on-disk format revision (see upgrading note above)
-* mkcephfs, init-ceph: close potential security issues with predictable filenames
-
-For more detailed information, see :download:`the complete changelog <../changelog/v0.56.4.txt>`.
-
-v0.56.3 "bobtail"
-=================
-
-This release has several bug fixes surrounding OSD stability.  Most
-significantly, an issue with OSDs being unresponsive shortly after
-startup (and occasionally crashing due to an internal heartbeat check)
-is resolved.  Please upgrade.
-
-Upgrading
----------
-
-* A bug was fixed in which the OSDMap epoch for PGs without any IO
-  requests was not recorded.  If there are pools in the cluster that
-  are completely idle (for example, the ``data`` and ``metadata``
-  pools normally used by CephFS), and a large number of OSDMap epochs
-  have elapsed since the ``ceph-osd`` daemon was last restarted, those
-  maps will get reprocessed when the daemon restarts.  This process
-  can take a while if there are a lot of maps.  A workaround is to
-  'touch' any idle pools with IO prior to restarting the daemons after
-  packages are upgraded::
-
-   rados bench 10 write -t 1 -b 4096 -p {POOLNAME}
-
-  This will typically generate enough IO to touch every PG in the pool
-  without generating significant cluster load, and also cleans up any
-  temporary objects it creates.
-
-Notable changes
----------------
-
-* osd: flush peering work queue prior to start
-* osd: persist osdmap epoch for idle PGs
-* osd: fix and simplify connection handling for heartbeats
-* osd: avoid crash on invalid admin command
-* mon: fix rare races with monitor elections and commands
-* mon: enforce that OSD reweights be between 0 and 1 (NOTE: not CRUSH weights)
-* mon: approximate client, recovery bandwidth logging
-* radosgw: fixed some XML formatting to conform to Swift API inconsistency
-* radosgw: fix usage accounting bug; add repair tool
-* radosgw: make fallback URI configurable (necessary on some web servers)
-* librbd: fix handling for interrupted 'unprotect' operations
-* mds, ceph-fuse: allow file and directory layouts to be modified via virtual xattrs
-
-For more detailed information, see :download:`the complete changelog <../changelog/v0.56.3.txt>`.
-
-
-v0.56.2 "bobtail"
-=================
-
-This release has a wide range of bug fixes, stability improvements, and some performance improvements.  Please upgrade.
-
-Upgrading
----------
-
-* The meaning of the 'osd scrub min interval' and 'osd scrub max
-  interval' has changed slightly.  The min interval used to be
-  meaningless, while the max interval would only trigger a scrub if
-  the load was sufficiently low.  Now, the min interval option works
-  the way the old max interval did (it will trigger a scrub after this
-  amount of time if the load is low), while the max interval will
-  force a scrub regardless of load.  The default options have been
-  adjusted accordingly.  If you have customized these in ceph.conf,
-  please review their values when upgrading.
-
-* CRUSH maps that are generated by default when calling ``ceph-mon
-  --mkfs`` directly now distribute replicas across hosts instead of
-  across OSDs.  Any provisioning tools that are being used by Ceph may
-  be affected, although probably for the better, as distributing across
-  hosts is a much more commonly sought behavior.  If you use
-  ``mkcephfs`` to create the cluster, the default CRUSH rule is still
-  inferred by the number of hosts and/or racks in the initial ceph.conf.
-
-Notable changes
----------------
-
-* osd: snapshot trimming fixes
-* osd: scrub snapshot metadata
-* osd: fix osdmap trimming
-* osd: misc peering fixes
-* osd: stop heartbeating with peers if internal threads are stuck/hung
-* osd: PG removal is friendlier to other workloads
-* osd: fix recovery start delay (was causing very slow recovery)
-* osd: fix scheduling of explicitly requested scrubs
-* osd: fix scrub interval config options
-* osd: improve recovery vs client io tuning
-* osd: improve 'slow request' warning detail for better diagnosis
-* osd: default CRUSH map now distributes across hosts, not OSDs
-* osd: fix crash on 32-bit hosts triggered by librbd clients
-* librbd: fix error handling when talking to older OSDs
-* mon: fix a few rare crashes
-* ceph command: ability to easily adjust CRUSH tunables
-* radosgw: object copy does not copy source ACLs
-* rados command: fix omap command usage
-* sysvinit script: set ulimit -n properly on remote hosts
-* msgr: fix narrow race with message queuing
-* fixed compilation on some old distros (e.g., RHEL 5.x)
-
-For more detailed information, see :download:`the complete changelog <../changelog/v0.56.2.txt>`.
-
-
-v0.56.1 "bobtail"
-=================
-
-This release has two critical fixes.  Please upgrade.
-
-Upgrading
----------
-
-* There is a protocol compatibility problem between v0.56 and any
-  other version that is now fixed.  If your radosgw or RBD clients are
-  running v0.56, they will need to be upgraded too.  If they are
-  running a version prior to v0.56, they can be left as is.
-
-Notable changes
----------------
-* osd: fix commit sequence for XFS, ext4 (or any other non-btrfs) to prevent data loss on power cycle or kernel panic
-* osd: fix compatibility for CALL operation
-* osd: process old osdmaps prior to joining cluster (fixes slow startup)
-* osd: fix a couple of recovery-related crashes
-* osd: fix large io requests when journal is in (non-default) aio mode
-* log: fix possible deadlock in logging code
-
-For more detailed information, see :download:`the complete changelog <../changelog/v0.56.1.txt>`.
-
-v0.56 "bobtail"
-===============
-
-Bobtail is the second stable release of Ceph, named in honor of the
-`Bobtail Squid`: https://en.wikipedia.org/wiki/Bobtail_squid.
-
-Key features since v0.48 "argonaut"
------------------------------------
-
-* Object Storage Daemon (OSD): improved threading, small-io performance, and performance during recovery
-* Object Storage Daemon (OSD): regular "deep" scrubbing of all stored data to detect latent disk errors
-* RADOS Block Device (RBD): support for copy-on-write clones of images.
-* RADOS Block Device (RBD): better client-side caching.
-* RADOS Block Device (RBD): advisory image locking
-* Rados Gateway (RGW): support for efficient usage logging/scraping (for billing purposes)
-* Rados Gateway (RGW): expanded S3 and Swift API coverage (e.g., POST, multi-object delete)
-* Rados Gateway (RGW): improved striping for large objects
-* Rados Gateway (RGW): OpenStack Keystone integration
-* RPM packages for Fedora, RHEL/CentOS, OpenSUSE, and SLES
-* mkcephfs: support for automatically formatting and mounting XFS and ext4 (in addition to btrfs)
-
-Upgrading
----------
-
-Please refer to the document `Upgrading from Argonaut to Bobtail`_ for details.
-
-.. _Upgrading from Argonaut to Bobtail: ../install/upgrading-ceph/#upgrading-from-argonaut-to-bobtail
-
-* Cephx authentication is now enabled by default (since v0.55).
-  Upgrading a cluster without adjusting the Ceph configuration will
-  likely prevent the system from starting up on its own.  We recommend
-  first modifying the configuration to indicate that authentication is
-  disabled, and only then upgrading to the latest version::
-
-     auth client required = none
-     auth service required = none
-     auth cluster required = none
-
-* Ceph daemons can be upgraded one-by-one while the cluster is online
-  and in service.
-
-* The ``ceph-osd`` daemons must be upgraded and restarted *before* any
-  ``radosgw`` daemons are restarted, as they depend on some new
-  ceph-osd functionality.  (The ``ceph-mon``, ``ceph-osd``, and
-  ``ceph-mds`` daemons can be upgraded and restarted in any order.)
-
-* Once each individual daemon has been upgraded and restarted, it
-  cannot be downgraded.
-
-* The cluster of ``ceph-mon`` daemons will migrate to a new internal
-  on-wire protocol once all daemons in the quorum have been upgraded.
-  Upgrading only a majority of the nodes (e.g., two out of three) may
-  expose the cluster to a situation where a single additional failure
-  may compromise availability (because the non-upgraded daemon cannot
-  participate in the new protocol).  We recommend not waiting for an
-  extended period of time between ``ceph-mon`` upgrades.
-
-* The ops log and usage log for radosgw are now off by default.  If
-  you need these logs (e.g., for billing purposes), you must enable
-  them explicitly.  For logging of all operations to objects in the
-  ``.log`` pool (see ``radosgw-admin log ...``)::
-
-    rgw enable ops log = true
-
-  For usage logging of aggregated bandwidth usage (see ``radosgw-admin
-  usage ...``)::
-
-    rgw enable usage log = true
-
-* You should not create or use "format 2" RBD images until after all
-  ``ceph-osd`` daemons have been upgraded.  Note that "format 1" is
-  still the default.  You can use the new ``ceph osd ls`` and
-  ``ceph tell osd.N version`` commands to doublecheck your cluster.
-  ``ceph osd ls`` will give a list of all OSD IDs that are part of the
-  cluster, and you can use that to write a simple shell loop to display
-  all the OSD version strings: ::
-
-      for i in $(ceph osd ls); do
-          ceph tell osd.${i} version
-      done
-
-
-Compatibility changes
----------------------
-
-* The 'ceph osd create [<uuid>]' command now rejects an argument that
-  is not a UUID.  (Previously it would take take an optional integer
-  OSD id.)  This correct syntax has been 'ceph osd create [<uuid>]'
-  since v0.47, but the older calling convention was being silently
-  ignored.
-
-* The CRUSH map root nodes now have type ``root`` instead of type
-  ``pool``.  This avoids confusion with RADOS pools, which are not
-  directly related.  Any scripts or tools that use the ``ceph osd
-  crush ...`` commands may need to be adjusted accordingly.
-
-* The ``ceph osd pool create <poolname> <pgnum>`` command now requires
-  the ``pgnum`` argument. Previously this was optional, and would
-  default to 8, which was almost never a good number.
-
-* Degraded mode (when there fewer than the desired number of replicas)
-  is now more configurable on a per-pool basis, with the min_size
-  parameter. By default, with min_size 0, this allows I/O to objects
-  with N - floor(N/2) replicas, where N is the total number of
-  expected copies. Argonaut behavior was equivalent to having min_size
-  = 1, so I/O would always be possible if any completely up to date
-  copy remained. min_size = 1 could result in lower overall
-  availability in certain cases, such as flapping network partitions.
-
-* The sysvinit start/stop script now defaults to adjusting the max
-  open files ulimit to 16384.  On most systems the default is 1024, so
-  this is an increase and won't break anything.  If some system has a
-  higher initial value, however, this change will lower the limit.
-  The value can be adjusted explicitly by adding an entry to the
-  ``ceph.conf`` file in the appropriate section.  For example::
-
-     [global]
-             max open files = 32768
-
-* 'rbd lock list' and 'rbd showmapped' no longer use tabs as
-  separators in their output.
-
-* There is configurable limit on the number of PGs when creating a new
-  pool, to prevent a user from accidentally specifying a ridiculous
-  number for pg_num.  It can be adjusted via the 'mon max pool pg num'
-  option on the monitor, and defaults to 65536 (the current max
-  supported by the Linux kernel client).
-
-* The osd capabilities associated with a rados user have changed
-  syntax since 0.48 argonaut. The new format is mostly backwards
-  compatible, but there are two backwards-incompatible changes:
-
-  * specifying a list of pools in one grant, i.e.
-    'allow r pool=foo,bar' is now done in separate grants, i.e.
-    'allow r pool=foo, allow r pool=bar'.
-
-  * restricting pool access by pool owner ('allow r uid=foo') is
-    removed. This feature was not very useful and unused in practice.
-
-  The new format is documented in the ceph-authtool man page.
-
-* 'rbd cp' and 'rbd rename' use rbd as the default destination pool,
-  regardless of what pool the source image is in. Previously they
-  would default to the same pool as the source image.
-
-* 'rbd export' no longer prints a message for each object written. It
-  just reports percent complete like other long-lasting operations.
-
-* 'ceph osd tree' now uses 4 decimal places for weight so output is
-  nicer for humans
-
-* Several monitor operations are now idempotent:
-
-  * ceph osd pool create
-  * ceph osd pool delete
-  * ceph osd pool mksnap
-  * ceph osd rm
-  * ceph pg <pgid> revert
-
-Notable changes
----------------
-
-* auth: enable cephx by default
-* auth: expanded authentication settings for greater flexibility
-* auth: sign messages when using cephx
-* build fixes for Fedora 18, CentOS/RHEL 6
-* ceph: new 'osd ls' and 'osd tell <osd.N> version' commands
-* ceph-debugpack: misc improvements
-* ceph-disk-prepare: creates and labels GPT partitions
-* ceph-disk-prepare: support for external journals, default mount/mkfs options, etc.
-* ceph-fuse/libcephfs: many misc fixes, admin socket debugging
-* ceph-fuse: fix handling for .. in root directory
-* ceph-fuse: many fixes (including memory leaks, hangs)
-* ceph-fuse: mount helper (mount.fuse.ceph) for use with /etc/fstab
-* ceph.spec: misc packaging fixes
-* common: thread pool sizes can now be adjusted at runtime
-* config: $pid is now available as a metavariable
-* crush: default root of tree type is now 'root' instead of 'pool' (to avoid confusiong wrt rados pools)
-* crush: fixed retry behavior with chooseleaf via tunable
-* crush: tunables documented; feature bit now present and enforced
-* libcephfs: java wrapper
-* librados: several bug fixes (rare races, locking errors)
-* librados: some locking fixes
-* librados: watch/notify fixes, misc memory leaks
-* librbd: a few fixes to 'discard' support
-* librbd: fine-grained striping feature
-* librbd: fixed memory leaks
-* librbd: fully functional and documented image cloning
-* librbd: image (advisory) locking
-* librbd: improved caching (of object non-existence)
-* librbd: 'flatten' command to sever clone parent relationship
-* librbd: 'protect'/'unprotect' commands to prevent clone parent from being deleted
-* librbd: clip requests past end-of-image.
-* librbd: fixes an issue with some windows guests running in qemu (remove floating point usage)
-* log: fix in-memory buffering behavior (to only write log messages on crash)
-* mds: fix ino release on abort session close, relative getattr path, mds shutdown, other misc items
-* mds: misc fixes
-* mkcephfs: fix for default keyring, osd data/journal locations
-* mkcephfs: support for formatting xfs, ext4 (as well as btrfs)
-* init: support for automatically mounting xfs and ext4 osd data directories
-* mon, radosgw, ceph-fuse: fixed memory leaks
-* mon: improved ENOSPC, fs error checking
-* mon: less-destructive ceph-mon --mkfs behavior
-* mon: misc fixes
-* mon: more informative info about stuck PGs in 'health detail'
-* mon: information about recovery and backfill in 'pg <pgid> query'
-* mon: new 'osd crush create-or-move ...' command
-* mon: new 'osd crush move ...' command lets you rearrange your CRUSH hierarchy
-* mon: optionally dump 'osd tree' in json
-* mon: configurable cap on maximum osd number (mon max osd)
-* mon: many bug fixes (various races causing ceph-mon crashes)
-* mon: new on-disk metadata to facilitate future mon changes (post-bobtail)
-* mon: election bug fixes
-* mon: throttle client messages (limit memory consumption)
-* mon: throttle osd flapping based on osd history (limits osdmap ΄thrashing' on overloaded or unhappy clusters)
-* mon: 'report' command for dumping detailed cluster status (e.g., for use when reporting bugs)
-* mon: osdmap flags like noup, noin now cause a health warning
-* msgr: improved failure handling code
-* msgr: many bug fixes
-* osd, mon: honor new 'nobackfill' and 'norecover' osdmap flags
-* osd, mon: use feature bits to lock out clients lacking CRUSH tunables when they are in use
-* osd: backfill reservation framework (to avoid flooding new osds with backfill data)
-* osd: backfill target reservations (improve performance during recovery)
-* osd: better tracking of recent slow operations
-* osd: capability grammar improvements, bug fixes
-* osd: client vs recovery io prioritization
-* osd: crush performance improvements
-* osd: default journal size to 5 GB
-* osd: experimental support for PG "splitting" (pg_num adjustment for existing pools)
-* osd: fix memory leak on certain error paths
-* osd: fixed detection of EIO errors from fs on read
-* osd: major refactor of PG peering and threading
-* osd: many bug fixes
-* osd: more/better dump info about in-progress operations
-* osd: new caps structure (see compatibility notes)
-* osd: new 'deep scrub' will compare object content across replicas (once per week by default)
-* osd: new 'lock' rados class for generic object locking
-* osd: optional 'min' pg size
-* osd: recovery reservations
-* osd: scrub efficiency improvement
-* osd: several out of order reply bug fixes
-* osd: several rare peering cases fixed
-* osd: some performance improvements related to request queuing
-* osd: use entire device if journal is a block device
-* osd: use syncfs(2) when kernel supports it, even if glibc does not
-* osd: various fixes for out-of-order op replies
-* rados: ability to copy, rename pools
-* rados: bench command now cleans up after itself
-* rados: 'cppool' command to copy rados pools
-* rados: 'rm' now accepts a list of objects to be removed
-* radosgw: POST support
-* radosgw: REST API for managing usage stats
-* radosgw: fix bug in bucket stat updates
-* radosgw: fix copy-object vs attributes
-* radosgw: fix range header for large objects, ETag quoting, GMT dates, other compatibility fixes
-* radosgw: improved garbage collection framework
-* radosgw: many small fixes, cleanups
-* radosgw: openstack keystone integration
-* radosgw: stripe large (non-multipart) objects
-* radosgw: support for multi-object deletes
-* radosgw: support for swift manifest objects
-* radosgw: vanity bucket dns names
-* radosgw: various API compatibility fixes
-* rbd: import from stdin, export to stdout
-* rbd: new 'ls -l' option to view images with metadata
-* rbd: use generic id and keyring options for 'rbd map'
-* rbd: don't issue usage on errors
-* udev: fix symlink creation for rbd images containing partitions
-* upstart: job files for all daemon types (not enabled by default)
-* wireshark: ceph protocol dissector patch updated
-
-
-v0.54
-=====
-
-Upgrading
----------
-
-* The osd capabilities associated with a rados user have changed
-  syntax since 0.48 argonaut. The new format is mostly backwards
-  compatible, but there are two backwards-incompatible changes:
-
-  * specifying a list of pools in one grant, i.e.
-    'allow r pool=foo,bar' is now done in separate grants, i.e.
-    'allow r pool=foo, allow r pool=bar'.
-
-  * restricting pool access by pool owner ('allow r uid=foo') is
-    removed. This feature was not very useful and unused in practice.
-
-  The new format is documented in the ceph-authtool man page.
-
-* Bug fixes to the new osd capability format parsing properly validate
-  the allowed operations. If an existing rados user gets permissions
-  errors after upgrading, its capabilities were probably
-  misconfigured. See the ceph-authtool man page for details on osd
-  capabilities.
-
-* 'rbd lock list' and 'rbd showmapped' no longer use tabs as
-  separators in their output.
diff --git a/ceph/doc/releases/cuttlefish.rst b/ceph/doc/releases/cuttlefish.rst
deleted file mode 100644 (file)
index 01758e7..0000000
+++ /dev/null
@@ -1,720 +0,0 @@
-==========
-Cuttlefish
-==========
-
-Cuttlefish is the 3rd stable release of Ceph. It is named after a type
-of cephalopod (order Sepiida) characterized by a unique internal shell, the
-cuttlebone, which is used for control of buoyancy.
-
-v0.61.9 "Cuttlefish"
-====================
-
-This point release resolves several low to medium-impact bugs across
-the code base, and fixes a performance problem (CPU utilization) with
-radosgw.  We recommend that all production cuttlefish users upgrade.
-
-Notable Changes
----------------
-
-* ceph, ceph-authtool: fix help (Danny Al-Gaaf)
-* ceph-disk: partprobe after creating journal partition
-* ceph-disk: specific fs type when mounting (Alfredo Deza)
-* ceph-fuse: fix bug when compiled against old versions
-* ceph-fuse: fix use-after-free in caching code (Yan, Zheng)
-* ceph-fuse: misc caching bugs
-* ceph.spec: remove incorrect mod_fcgi dependency (Gary Lowell)
-* crush: fix name caching
-* librbd: fix bug when unpausing cluster (Josh Durgin)
-* mds: fix LAZYIO lock hang
-* mds: fix bug in file size recovery (after client crash)
-* mon: fix paxos recovery corner case
-* osd: fix exponential backoff for slow request warnings (Loic Dachary)
-* osd: fix readdir_r usage
-* osd: fix startup for long-stopped OSDs
-* rgw: avoid std::list::size() to avoid wasting CPU cycles (Yehuda Sadeh)
-* rgw: drain pending requests during write (fixes data safety issue) (Yehuda Sadeh)
-* rgw: fix authenticated users group ACL check (Yehuda Sadeh)
-* rgw: fix bug in POST (Yehuda Sadeh)
-* rgw: fix sysvinit script 'status' command, return value (Danny Al-Gaaf)
-* rgw: reduce default log level (Yehuda Sadeh)
-
-For more detailed information, see :download:`the complete changelog <../changelog/v0.61.9.txt>`.
-
-v0.61.8 "Cuttlefish"
-====================
-
-This release includes a number of important issues, including rare
-race conditions in the OSD, a few monitor bugs, and fixes for RBD
-flush behavior.  We recommend that production users upgrade at their
-convenience.
-
-Notable Changes
----------------
-
-* librados: fix async aio completion wakeup
-* librados: fix aio completion locking
-* librados: fix rare deadlock during shutdown
-* osd: fix race when queueing recovery operations
-* osd: fix possible race during recovery
-* osd: optionally preload rados classes on startup (disabled by default)
-* osd: fix journal replay corner condition
-* osd: limit size of peering work queue batch (to speed up peering)
-* mon: fix paxos recovery corner case
-* mon: fix rare hang when monmap updates during an election
-* mon: make 'osd pool mksnap ...' avoid exposing uncommitted state
-* mon: make 'osd pool rmsnap ...' not racy, avoid exposing uncommitted state
-* mon: fix bug during mon cluster expansion
-* rgw: fix crash during multi delete operation
-* msgr: fix race conditions during osd network reinitialization
-* ceph-disk: apply mount options when remounting
-
-For more detailed information, see :download:`the complete changelog <../changelog/v0.61.8.txt>`.
-
-
-v0.61.7 "Cuttlefish"
-====================
-
-This release fixes another regression preventing monitors to start after
-undergoing certain upgrade sequences, as well as some corner cases with
-Paxos and support for unusual device names in ceph-disk/ceph-deploy.
-
-Notable Changes
----------------
-
-* mon: fix regression in latest full osdmap retrieval
-* mon: fix a long-standing bug in a paxos corner case
-* ceph-disk: improved support for unusual device names (e.g., /dev/cciss/c0d0)
-
-For more detailed information, see :download:`the complete changelog <../changelog/v0.61.7.txt>`.
-
-
-v0.61.6 "Cuttlefish"
-====================
-
-This release fixes a regression in v0.61.5 that could prevent monitors
-from restarting.  This affects any cluster that was upgraded from a
-previous version of Ceph (and not freshly created with v0.61.5).
-
-All users are strongly recommended to upgrade.
-
-Notable Changes
----------------
-
-* mon: record latest full osdmap
-* mon: work around previous bug in which latest full osdmap is not recorded
-* mon: avoid scrub while updating
-
-For more detailed information, see :download:`the complete changelog <../changelog/v0.61.6.txt>`.
-
-
-v0.61.5 "Cuttlefish"
-====================
-
-This release most improves stability of the monitor and fixes a few
-bugs with the ceph-disk utility (used by ceph-deploy).  We recommend
-that all v0.61.x users upgrade.
-
-Upgrading
----------
-
-* This release fixes a 32-bit vs 64-bit arithmetic bug with the
-  feature bits.  An unfortunate consequence of the fix is that 0.61.4
-  (or earlier) ceph-mon daemons can't form a quorum with 0.61.5 (or
-  later) monitors.  To avoid the possibility of service disruption, we
-  recommend you upgrade all monitors at once.
-
-Notable Changes
----------------
-
-* mon: misc sync improvements (faster, more reliable, better tuning)
-* mon: enable leveldb cache by default (big performance improvement)
-* mon: new scrub feature (primarily for diagnostic, testing purposes)
-* mon: fix occasional leveldb assertion on startup
-* mon: prevent reads until initial state is committed
-* mon: improved logic for trimming old osdmaps
-* mon: fix pick_addresses bug when expanding mon cluster
-* mon: several small paxos fixes, improvements
-* mon: fix bug osdmap trim behavior
-* osd: fix several bugs with PG stat reporting
-* osd: limit number of maps shared with peers (which could cause domino failures)
-* rgw: fix radosgw-admin buckets list (for all buckets)
-* mds: fix occasional client failure to reconnect
-* mds: fix bad list traversal after unlink
-* mds: fix underwater dentry cleanup (occasional crash after mds restart)
-* libcephfs, ceph-fuse: fix occasional hangs on umount
-* libcephfs, ceph-fuse: fix old bug with O_LAZY vs O_NOATIME confusion
-* ceph-disk: more robust journal device detection on RHEL/CentOS
-* ceph-disk: better, simpler locking
-* ceph-disk: do not inadvertantely mount over existing osd mounts
-* ceph-disk: better handling for unusual device names
-* sysvinit, upstart: handle symlinks in /var/lib/ceph/*
-
-For more detailed information, see :download:`the complete changelog <../changelog/v0.61.5.txt>`.
-
-
-v0.61.4 "Cuttlefish"
-====================
-
-This release resolves a possible data corruption on power-cycle when
-using XFS, a few outstanding problems with monitor sync, several
-problems with ceph-disk and ceph-deploy operation, and a problem with
-OSD memory usage during scrub.
-
-Upgrading
----------
-
-* No issues.
-
-Notable Changes
----------------
-
-* mon: fix daemon exit behavior when error is encountered on startup
-* mon: more robust sync behavior
-* osd: do not use sync_file_range(2), posix_fadvise(...DONTNEED) (can cause data corruption on power loss on XFS)
-* osd: avoid unnecessary log rewrite (improves peering speed)
-* osd: fix scrub efficiency bug (problematic on old clusters)
-* rgw: fix listing objects that start with underscore
-* rgw: fix deep URI resource, CORS bugs
-* librados python binding: fix truncate on 32-bit architectures
-* ceph-disk: fix udev rules
-* rpm: install sysvinit script on package install
-* ceph-disk: fix OSD start on machine reboot on Debian wheezy
-* ceph-disk: activate OSD when journal device appears second
-* ceph-disk: fix various bugs on RHEL/CentOS 6.3
-* ceph-disk: add 'zap' command
-* ceph-disk: add '[un]suppress-activate' command for preparing spare disks
-* upstart: start on runlevel [2345] (instead of after the first network interface starts)
-* ceph-fuse, libcephfs: handle mds session reset during session open
-* ceph-fuse, libcephfs: fix two capability revocation bugs
-* ceph-fuse: fix thread creation on startup
-* all daemons: create /var/run/ceph directory on startup if missing
-
-For more detailed information, see :download:`the complete changelog <../changelog/v0.61.4.txt>`.
-
-
-v0.61.3 "Cuttlefish"
-====================
-
-This release resolves a number of problems with the monitors and leveldb that users have
-been seeing.  Please upgrade.
-
-Upgrading
----------
-
-* There is one known problem with mon upgrades from bobtail.  If the
-  ceph-mon conversion on startup is aborted or fails for some reason, we
-  do not correctly error out, but instead continue with (in certain cases)
-  odd results.  Please be careful if you have to restart the mons during
-  the upgrade.  A 0.61.4 release with a fix will be out shortly.
-
-* In the meantime, for current cuttlefish users, v0.61.3 is safe to use.
-
-
-Notable Changes
----------------
-
-* mon: paxos state trimming fix (resolves runaway disk usage)
-* mon: finer-grained compaction on trim
-* mon: discard messages from disconnected clients (lowers load)
-* mon: leveldb compaction and other stats available via admin socket
-* mon: async compaction (lower overhead)
-* mon: fix bug incorrectly marking osds down with insufficient failure reports
-* osd: fixed small bug in pg request map
-* osd: avoid rewriting pg info on every osdmap
-* osd: avoid internal heartbeta timeouts when scrubbing very large objects
-* osd: fix narrow race with journal replay
-* mon: fixed narrow pg split race
-* rgw: fix leaked space when copying object
-* rgw: fix iteration over large/untrimmed usage logs
-* rgw: fix locking issue with ops log socket
-* rgw: require matching version of librados
-* librbd: make image creation defaults configurable (e.g., create format 2 images via qemu-img)
-* fix units in 'ceph df' output
-* debian: fix prerm/postinst hooks to start/stop daemons appropriately
-* upstart: allow uppercase daemons names (and thus hostnames)
-* sysvinit: fix enumeration of local daemons by type
-* sysvinit: fix osd weight calcuation when using -a
-* fix build on unsigned char platforms (e.g., arm)
-
-For more detailed information, see :download:`the complete changelog <../changelog/v0.61.3.txt>`.
-
-
-v0.61.2 "Cuttlefish"
-====================
-
-This release disables a monitor debug log that consumes disk space and
-fixes a bug when upgrade some monitors from bobtail to cuttlefish.
-
-Notable Changes
----------------
-
-* mon: fix conversion of stores with duplicated GV values
-* mon: disable 'mon debug dump transactions' by default
-
-For more detailed information, see :download:`the complete changelog <../changelog/v0.61.2.txt>`.
-
-
-v0.61.1 "Cuttlefish"
-====================
-
-This release fixes a problem when upgrading a bobtail cluster that had
-snapshots to cuttlefish.
-
-Notable Changes
----------------
-
-* osd: handle upgrade when legacy snap collections are present; repair from previous failed restart
-* ceph-create-keys: fix race with ceph-mon startup (which broke 'ceph-deploy gatherkeys ...')
-* ceph-create-keys: gracefully handle bad response from ceph-osd
-* sysvinit: do not assume default osd_data when automatically weighting OSD
-* osd: avoid crash from ill-behaved classes using getomapvals
-* debian: fix squeeze dependency
-* mon: debug options to log or dump leveldb transactions
-
-For more detailed information, see :download:`the complete changelog <../changelog/v0.61.1.txt>`.
-
-v0.61 "Cuttlefish"
-==================
-
-Upgrading from v0.60
---------------------
-
-* The ceph-deploy tool is now the preferred method of provisioning
-  new clusters.  For existing clusters created via mkcephfs that
-  would like to transition to the new tool, there is a migration
-  path, documented at `Transitioning to ceph-deploy`_.
-
-
-* The sysvinit script (/etc/init.d/ceph) will now verify (and, if
-  necessary, update) the OSD's position in the CRUSH map on startup.
-  (The upstart script has always worked this way.) By default, this
-  ensures that the OSD is under a 'host' with a name that matches the
-  hostname (``hostname -s``).  Legacy clusters create with mkcephfs do
-  this by default, so this should not cause any problems, but legacy
-  clusters with customized CRUSH maps with an alternate structure
-  should set ``osd crush update on start = false``.
-
-* radosgw-admin now uses the term zone instead of cluster to describe
-  each instance of the radosgw data store (and corresponding
-  collection of radosgw daemons).  The usage for the radosgw-admin
-  command and the 'rgw zone root pool' config options have changed
-  accordingly.
-
-* rbd progress indicators now go to standard error instead of standard
-  out.  (You can disable progress with --no-progress.)
-
-* The 'rbd resize ...' command now requires the --allow-shrink option
-  when resizing to a smaller size.  Expanding images to a larger size
-  is unchanged.
-
-* Please review the changes going back to 0.56.4 if you are upgrading
-  all the way from bobtail.
-
-* The old 'ceph stop_cluster' command has been removed.
-
-* The sysvinit script now uses the ceph.conf file on the remote host
-  when starting remote daemons via the '-a' option.  Note that if '-a'
-  is used in conjunction with '-c path', the path must also be present
-  on the remote host (it is not copied to a temporary file, as it was
-  previously).
-
-
-Upgrading from v0.56.4 "Bobtail"
---------------------------------
-
-Please see `Upgrading from Bobtail to Cuttlefish`_ for details.
-
-.. _Upgrading from Bobtail to Cuttlefish: ../install/upgrading-ceph/#upgrading-from-bobtail-to-cuttlefish
-
-* The ceph-deploy tool is now the preferred method of provisioning
-  new clusters.  For existing clusters created via mkcephfs that
-  would like to transition to the new tool, there is a migration
-  path, documented at `Transitioning to ceph-deploy`_.
-
-.. _Transitioning to ceph-deploy: ../rados/deployment/ceph-deploy-transition
-
-* The sysvinit script (/etc/init.d/ceph) will now verify (and, if
-  necessary, update) the OSD's position in the CRUSH map on startup.
-  (The upstart script has always worked this way.) By default, this
-  ensures that the OSD is under a 'host' with a name that matches the
-  hostname (``hostname -s``).  Legacy clusters create with mkcephfs do
-  this by default, so this should not cause any problems, but legacy
-  clusters with customized CRUSH maps with an alternate structure
-  should set ``osd crush update on start = false``.
-
-* radosgw-admin now uses the term zone instead of cluster to describe
-  each instance of the radosgw data store (and corresponding
-  collection of radosgw daemons).  The usage for the radosgw-admin
-  command and the 'rgw zone root pool' config options have changed
-  accordingly.
-
-* rbd progress indicators now go to standard error instead of standard
-  out.  (You can disable progress with --no-progress.)
-
-* The 'rbd resize ...' command now requires the --allow-shrink option
-  when resizing to a smaller size.  Expanding images to a larger size
-  is unchanged.
-
-* Please review the changes going back to 0.56.4 if you are upgrading
-  all the way from bobtail.
-
-* The old 'ceph stop_cluster' command has been removed.
-
-* The sysvinit script now uses the ceph.conf file on the remote host
-  when starting remote daemons via the '-a' option.  Note that if '-a'
-  is used in conjunction with '-c path', the path must also be present
-  on the remote host (it is not copied to a temporary file, as it was
-  previously).
-
-* The monitor is using a completely new storage strategy and
-  intra-cluster protocol.  This means that cuttlefish and bobtail
-  monitors do not talk to each other.  When you upgrade each one, it
-  will convert its local data store to the new format.  Once you
-  upgrade a majority, the quorum will be formed using the new protocol
-  and the old monitors will be blocked out until they too get
-  upgraded.  For this reason, we recommend not running a mixed-version
-  cluster for very long.
-
-* ceph-mon now requires the creation of its data directory prior to
-  --mkfs, similarly to what happens on ceph-osd.  This directory is no
-  longer automatically created, and custom scripts should be adjusted to
-  reflect just that.
-
-* The monitor now enforces that MDS names be unique.  If you have
-  multiple daemons start with with the same id (e.g., ``mds.a``) the
-  second one will implicitly mark the first as failed.  This makes
-  things less confusing and makes a daemon restart faster (we no
-  longer wait for the stopped daemon to time out) but existing
-  multi-mds configurations may need to be adjusted accordingly to give
-  daemons unique names.
-
-* The 'ceph osd pool delete <poolname>' and 'rados rmpool <poolname>'
-  now have safety interlocks with loud warnings that make you confirm
-  pool removal.  Any scripts currently rely on these functions zapping
-  data without confirmation need to be adjusted accordingly.
-
-
-Notable Changes from v0.60
---------------------------
-
-* rbd: incremental backups
-* rbd: only set STRIPINGV2 feature if striping parameters are incompatible with old versions
-* rbd: require --allow-shrink for resizing images down
-* librbd: many bug fixes
-* rgw: management REST API
-* rgw: fix object corruption on COPY to self
-* rgw: new sysvinit script for rpm-based systems
-* rgw: allow buckets with '_'
-* rgw: CORS support
-* mon: many fixes
-* mon: improved trimming behavior
-* mon: fix data conversion/upgrade problem (from bobtail)
-* mon: ability to tune leveldb
-* mon: config-keys service to store arbitrary data on monitor
-* mon: 'osd crush add|link|unlink|add-bucket ...' commands
-* mon: trigger leveldb compaction on trim
-* osd: per-rados pool quotas (objects, bytes)
-* osd: tool to export, import, and delete PGs from an individual OSD data store
-* osd: notify mon on clean shutdown to avoid IO stall
-* osd: improved detection of corrupted journals
-* osd: ability to tune leveldb
-* osd: improve client request throttling
-* osd, librados: fixes to the LIST_SNAPS operation
-* osd: improvements to scrub error repair
-* osd: better prevention of wedging OSDs with ENOSPC
-* osd: many small fixes
-* mds: fix xattr handling on root inode
-* mds: fixed bugs in journal replay
-* mds: many fixes
-* librados: clean up snapshot constant definitions
-* libcephfs: calls to query CRUSH topology (used by Hadoop)
-* ceph-fuse, libcephfs: misc fixes to mds session management
-* ceph-fuse: disabled cache invalidation (again) due to potential deadlock with kernel
-* sysvinit: try to start all daemons despite early failures
-* ceph-disk: new 'list' command
-* ceph-disk: hotplug fixes for RHEL/CentOS
-* ceph-disk: fix creation of OSD data partitions on >2TB disks
-* osd: fix udev rules for RHEL/CentOS systems
-* fix daemon logging during initial startup
-
-Notable changes from v0.56 "Bobtail"
-------------------------------------
-* always use installed system leveldb (Gary Lowell)
-* auth: ability to require new cephx signatures on messages (still off by default)
-* buffer unit testing (Loic Dachary)
-* ceph tool: some CLI interface cleanups
-* ceph-disk: improve multicluster support, error handling (Sage Weil)
-* ceph-disk: support for dm-crypt (Alexandre Marangone)
-* ceph-disk: support for sysvinit, directories or partitions (not full disks)
-* ceph-disk: fix mkfs args on old distros (Alexandre Marangone)
-* ceph-disk: fix creation of OSD data partitions on >2TB disks
-* ceph-disk: hotplug fixes for RHEL/CentOS
-* ceph-disk: new 'list' command
-* ceph-fuse, libcephfs: misc fixes to mds session management
-* ceph-fuse: disabled cache invalidation (again) due to potential deadlock with kernel
-* ceph-fuse: enable kernel cache invalidation (Sam Lang)
-* ceph-fuse: fix statfs(2) reporting
-* ceph-fuse: session handling cleanup, bug fixes (Sage Weil)
-* crush: ability to create, remove rules via CLI
-* crush: update weights for all instances of an item, not just the first (Sage Weil)
-* fix daemon logging during initial startup
-* fixed log rotation (Gary Lowell)
-* init-ceph, mkcephfs: close a few security holes with -a  (Sage Weil)
-* libcephfs: calls to query CRUSH topology (used by Hadoop)
-* libcephfs: many fixes, cleanups with the Java bindings
-* libcephfs: new topo API requests for Hadoop (Noah Watkins)
-* librados: clean up snapshot constant definitions
-* librados: fix linger bugs (Josh Durgin)
-* librbd: fixed flatten deadlock (Josh Durgin)
-* librbd: fixed some locking issues with flatten (Josh Durgin)
-* librbd: many bug fixes
-* librbd: optionally wait for flush before enabling writeback (Josh Durgin)
-* many many cleanups (Danny Al-Gaaf)
-* mds, ceph-fuse: fix bugs with replayed requests after MDS restart (Sage Weil)
-* mds, ceph-fuse: manage layouts via xattrs
-* mds: allow xattrs on root
-* mds: fast failover between MDSs (enforce unique mds names)
-* mds: fix xattr handling on root inode
-* mds: fixed bugs in journal replay
-* mds: improve session cleanup (Sage Weil)
-* mds: many fixes (Yan Zheng)
-* mds: misc bug fixes with clustered MDSs and failure recovery
-* mds: misc bug fixes with readdir
-* mds: new encoding for all data types (to allow forward/backward compatibility) (Greg Farnum)
-* mds: store and update backpointers/traces on directory, file objects (Sam Lang)
-* mon: 'osd crush add|link|unlink|add-bucket ...' commands
-* mon: ability to tune leveldb
-* mon: approximate recovery, IO workload stats
-* mon: avoid marking entire CRUSH subtrees out (e.g., if an entire rack goes offline)
-* mon: config-keys service to store arbitrary data on monitor
-* mon: easy adjustment of crush tunables via 'ceph osd crush tunables ...'
-* mon: easy creation of crush rules vai 'ceph osd rule ...'
-* mon: fix data conversion/upgrade problem (from bobtail)
-* mon: improved trimming behavior
-* mon: many fixes
-* mon: new 'ceph df [detail]' command
-* mon: new checks for identifying and reporting clock drift
-* mon: rearchitected to utilize single instance of paxos and a key/value store (Joao Luis)
-* mon: safety check for pool deletion
-* mon: shut down safely if disk approaches full (Joao Luis)
-* mon: trigger leveldb compaction on trim
-* msgr: fix comparison of IPv6 addresses (fixes monitor bringup via ceph-deploy, chef)
-* msgr: fixed race in connection reset
-* msgr: optionally tune TCP buffer size to avoid throughput collapse (Jim Schutt)
-* much code cleanup and optimization (Danny Al-Gaaf)
-* osd, librados: ability to list watchers (David Zafman)
-* osd, librados: fixes to the LIST_SNAPS operation
-* osd, librados: new listsnaps command (David Zafman)
-* osd: a few journaling bug fixes
-* osd: ability to tune leveldb
-* osd: add 'noscrub', 'nodeepscrub' osdmap flags (David Zafman)
-* osd: better prevention of wedging OSDs with ENOSPC
-* osd: ceph-filestore-dump tool for debugging
-* osd: connection handling bug fixes
-* osd: deep-scrub omap keys/values
-* osd: default to libaio for the journal (some performance boost)
-* osd: fix hang in 'journal aio = true' mode (Sage Weil)
-* osd: fix pg log trimming (avoids memory bloat on degraded clusters)
-* osd: fix udev rules for RHEL/CentOS systems
-* osd: fixed bug in journal checksums (Sam Just)
-* osd: improved client request throttling
-* osd: improved handling when disk fills up (David Zafman)
-* osd: improved journal corruption detection (Sam Just)
-* osd: improved detection of corrupted journals
-* osd: improvements to scrub error repair
-* osd: make tracking of object snapshot metadata more efficient (Sam Just)
-* osd: many small fixes
-* osd: misc fixes to PG split (Sam Just)
-* osd: move pg info, log into leveldb (== better performance) (David Zafman)
-* osd: notify mon on clean shutdown to avoid IO stall
-* osd: per-rados pool quotas (objects, bytes)
-* osd: refactored watch/notify infrastructure (fixes protocol, removes many bugs) (Sam Just)
-* osd: support for improved hashing of PGs across OSDs via HASHPSPOOL pool flag and feature
-* osd: tool to export, import, and delete PGs from an individual OSD data store
-* osd: trim log more aggressively, avoid appearance of leak memory
-* osd: validate snap collections on startup
-* osd: verify snap collections on startup (Sam Just)
-* radosgw: ACL grants in headers (Caleb Miles)
-* radosgw: ability to listen to fastcgi via a port (Guilhem Lettron)
-* radosgw: fix object copy onto self (Yehuda Sadeh)
-* radosgw: misc fixes
-* rbd-fuse: new tool, package
-* rbd: avoid FIEMAP when importing from file (it can be buggy)
-* rbd: incremental backups
-* rbd: only set STRIPINGV2 feature if striping parameters are incompatible with old versions
-* rbd: require --allow-shrink for resizing images down
-* rbd: udevadm settle on map/unmap to avoid various races (Dan Mick)
-* rbd: wait for udev to settle in strategic places (avoid spurious errors, failures)
-* rgw: CORS support
-* rgw: allow buckets with '_'
-* rgw: fix Content-Length on 32-bit machines (Jan Harkes)
-* rgw: fix log rotation
-* rgw: fix object corruption on COPY to self
-* rgw: fixed >4MB range requests (Jan Harkes)
-* rgw: new sysvinit script for rpm-based systems
-* rpm/deb: do not remove /var/lib/ceph on purge (v0.59 was the only release to do so)
-* sysvinit: try to start all daemons despite early failures
-* upstart: automatically set osd weight based on df (Guilhem Lettron)
-* use less memory for logging by default
-
-
-v0.60
-=====
-
-Upgrading
----------
-
-* Please note that the recently added librados 'list_snaps' function
-  call is in a state of flux and is changing slightly in v0.61.  You
-  are advised not to make use of it in v0.59 or v0.60.
-
-Notable Changes
----------------
-
-* osd: make tracking of object snapshot metadata more efficient (Sam Just)
-* osd: misc fixes to PG split (Sam Just)
-* osd: improve journal corruption detection (Sam Just)
-* osd: improve handling when disk fills up (David Zafman)
-* osd: add 'noscrub', 'nodeepscrub' osdmap flags (David Zafman)
-* osd: fix hang in 'journal aio = true' mode (Sage Weil)
-* ceph-disk-prepare: fix mkfs args on old distros (Alexandre Marangone)
-* ceph-disk-activate: improve multicluster support, error handling (Sage Weil)
-* librbd: optionally wait for flush before enabling writeback (Josh Durgin)
-* crush: update weights for all instances of an item, not just the first (Sage Weil)
-* mon: shut down safely if disk approaches full (Joao Luis)
-* rgw: fix Content-Length on 32-bit machines (Jan Harkes)
-* mds: store and update backpointers/traces on directory, file objects (Sam Lang)
-* mds: improve session cleanup (Sage Weil)
-* mds, ceph-fuse: fix bugs with replayed requests after MDS restart (Sage Weil)
-* ceph-fuse: enable kernel cache invalidation (Sam Lang)
-* libcephfs: new topo API requests for Hadoop (Noah Watkins)
-* ceph-fuse: session handling cleanup, bug fixes (Sage Weil)
-* much code cleanup and optimization (Danny Al-Gaaf)
-* use less memory for logging by default
-* upstart: automatically set osd weight based on df (Guilhem Lettron)
-* init-ceph, mkcephfs: close a few security holes with -a  (Sage Weil)
-* rpm/deb: do not remove /var/lib/ceph on purge (v0.59 was the only release to do so)
-
-
-v0.59
-=====
-
-Upgrading
----------
-
-* The monitor is using a completely new storage strategy and
-  intra-cluster protocol.  This means that v0.59 and pre-v0.59
-  monitors do not talk to each other.  When you upgrade each one, it
-  will convert its local data store to the new format.  Once you
-  upgrade a majority, the quorum will be formed using the new protocol
-  and the old monitors will be blocked out until they too get
-  upgraded.  For this reason, we recommend not running a mixed-version
-  cluster for very long.
-
-* ceph-mon now requires the creation of its data directory prior to
-  --mkfs, similarly to what happens on ceph-osd.  This directory is no
-  longer automatically created, and custom scripts should be adjusted to
-  reflect just that.
-
-
-Notable Changes
----------------
-
- * mon: rearchitected to utilize single instance of paxos and a key/value store (Joao Luis)
- * mon: new 'ceph df [detail]' command
- * osd: support for improved hashing of PGs across OSDs via HASHPSPOOL pool flag and feature
- * osd: refactored watch/notify infrastructure (fixes protocol, removes many bugs) (Sam Just)
- * osd, librados: ability to list watchers (David Zafman)
- * osd, librados: new listsnaps command (David Zafman)
- * osd: trim log more aggressively, avoid appearance of leak memory
- * osd: misc split fixes
- * osd: a few journaling bug fixes
- * osd: connection handling bug fixes
- * rbd: avoid FIEMAP when importing from file (it can be buggy)
- * librados: fix linger bugs (Josh Durgin)
- * librbd: fixed flatten deadlock (Josh Durgin)
- * rgw: fixed >4MB range requests (Jan Harkes)
- * rgw: fix log rotation
- * mds: allow xattrs on root
- * ceph-fuse: fix statfs(2) reporting
- * msgr: optionally tune TCP buffer size to avoid throughput collapse (Jim Schutt)
- * consume less memory for logging by default
- * always use system leveldb (Gary Lowell)
-
-
-
-v0.58
-=====
-
-Upgrading
----------
-
-* The monitor now enforces that MDS names be unique.  If you have
-  multiple daemons start with with the same id (e.g., ``mds.a``) the
-  second one will implicitly mark the first as failed.  This makes
-  things less confusing and makes a daemon restart faster (we no
-  longer wait for the stopped daemon to time out) but existing
-  multi-mds configurations may need to be adjusted accordingly to give
-  daemons unique names.
-
-Notable Changes
----------------
-
- * librbd: fixed some locking issues with flatten (Josh Durgin)
- * rbd: udevadm settle on map/unmap to avoid various races (Dan Mick)
- * osd: move pg info, log into leveldb (== better performance) (David Zafman)
- * osd: fix pg log trimming (avoids memory bloat on degraded clusters)
- * osd: fixed bug in journal checksums (Sam Just)
- * osd: verify snap collections on startup (Sam Just)
- * ceph-disk-prepare/activate: support for dm-crypt (Alexandre Marangone)
- * ceph-disk-prepare/activate: support for sysvinit, directories or partitions (not full disks)
- * msgr: fixed race in connection reset
- * msgr: fix comparison of IPv6 addresses (fixes monitor bringup via ceph-deploy, chef)
- * radosgw: fix object copy onto self (Yehuda Sadeh)
- * radosgw: ACL grants in headers (Caleb Miles)
- * radosgw: ability to listen to fastcgi via a port (Guilhem Lettron)
- * mds: new encoding for all data types (to allow forward/backward compatibility) (Greg Farnum)
- * mds: fast failover between MDSs (enforce unique mds names)
- * crush: ability to create, remove rules via CLI
- * many many cleanups (Danny Al-Gaaf)
- * buffer unit testing (Loic Dachary)
- * fixed log rotation (Gary Lowell)
-
-v0.57
-=====
-
-This development release has a lot of additional functionality
-accumulated over the last couple months.  Most of the bug fixes (with
-the notable exception of the MDS related work) has already been
-backported to v0.56.x, and is not mentioned here.
-
-Upgrading
----------
-
-* The 'ceph osd pool delete <poolname>' and 'rados rmpool <poolname>'
-  now have safety interlocks with loud warnings that make you confirm
-  pool removal.  Any scripts currently rely on these functions zapping
-  data without confirmation need to be adjusted accordingly.
-
-Notable Changes
----------------
-
-* osd: default to libaio for the journal (some performance boost)
-* osd: validate snap collections on startup
-* osd: ceph-filestore-dump tool for debugging
-* osd: deep-scrub omap keys/values
-* ceph tool: some CLI interface cleanups
-* mon: easy adjustment of crush tunables via 'ceph osd crush tunables ...'
-* mon: easy creation of crush rules vai 'ceph osd rule ...'
-* mon: approximate recovery, IO workload stats
-* mon: avoid marking entire CRUSH subtrees out (e.g., if an entire rack goes offline)
-* mon: safety check for pool deletion
-* mon: new checks for identifying and reporting clock drift
-* radosgw: misc fixes
-* rbd: wait for udev to settle in strategic places (avoid spurious errors, failures)
-* rbd-fuse: new tool, package
-* mds, ceph-fuse: manage layouts via xattrs
-* mds: misc bug fixes with clustered MDSs and failure recovery
-* mds: misc bug fixes with readdir
-* libcephfs: many fixes, cleanups with the Java bindings
-* auth: ability to require new cephx signatures on messages (still off by default)
diff --git a/ceph/doc/releases/dumpling.rst b/ceph/doc/releases/dumpling.rst
deleted file mode 100644 (file)
index 95e9988..0000000
+++ /dev/null
@@ -1,947 +0,0 @@
-========
-Dumpling
-========
-
-Dumpling is the 4th stable release of Ceph.  It is named after the
-dumpling squid (Euprymna tasmanica).
-
-v0.67.12 "Dumpling" (draft)
-===========================
-
-This stable update for Dumpling fixes a few longstanding issues with
-backfill in the OSD that can lead to stalled IOs.  There is also a fix
-for memory utilization for reads in librbd when caching is enabled,
-and then several other small fixes across the rest of the system.
-
-Dumpling users who have encountered IO stalls during backfill and who
-do not expect to upgrade to Firefly soon should upgrade.  Everyone
-else should upgrade to Firefly already.  This is likely to be the last stable
-release for the 0.67.x Dumpling series.
-
-
-Notable Changes
----------------
-
-* buffer: fix buffer rebuild alignment corner case (#6614 #6003 Loic Dachary, Samuel Just)
-* ceph-disk: reprobe partitions after zap (#9665 #9721 Loic Dachary)
-* ceph-disk: use partx instead of partprobe when appropriate (Loic Dachary)
-* common: add $cctid meta variable (#6228 Adam Crume)
-* crush: fix get_full_location_ordered (Sage Weil)
-* crush: pick ruleset id that matches rule_id (#9675 Xiaoxi Chen)
-* libcephfs: fix tid wrap bug (#9869 Greg Farnum)
-* libcephfs: get osd location on -1 should return EINVAL (Sage Weil)
-* librados: fix race condition with C API and op timeouts (#9582 Sage Weil)
-* librbd: constrain max number of in-flight read requests (#9854 Jason Dillaman)
-* librbd: enforce cache size on read requests (Jason Dillaman)
-* librbd: fix invalid close in image open failure path (#10030 Jason Dillaman)
-* librbd: fix read hang on sparse files (Jason Dillaman)
-* librbd: gracefully handle deleted/renamed pools (#10270 #10122 Jason Dillaman)
-* librbd: protect list_children from invalid child pool ioctxs (#10123 Jason Dillaman)
-* mds: fix ctime updates from clients without dirty caps (#9514 Greg Farnum)
-* mds: fix rare NULL dereference in cap update path (Greg Farnum)
-* mds: fix assertion caused by system clock backwards (#11053 Yan, Zheng)
-* mds: store backtrace on straydir (Yan, Zheng)
-* osd: fix journal committed_thru update after replay (#6756 Samuel Just)
-* osd: fix memory leak, busy loop on snap trim (#9113 Samuel Just)
-* osd: fix misc peering, recovery bugs (#10168 Samuel Just)
-* osd: fix purged_snap field on backfill start (#9487 Sage Weil, Samuel Just)
-* osd: handle no-op write with snapshot corner case (#10262 Sage Weil, Loic Dachary)
-* osd: respect RWORDERED rados flag (Sage Weil)
-* osd: several backfill fixes and refactors (Samuel Just, David Zafman)
-* rgw: send http status reason explicitly in fastcgi (Yehuda Sadeh)
-
-v0.67.11 "Dumpling"
-===================
-
-This stable update for Dumpling fixes several important bugs that
-affect a small set of users.
-
-We recommend that all Dumpling users upgrade at their convenience.  If
-none of these issues are affecting your deployment there is no
-urgency.
-
-
-Notable Changes
----------------
-
-* common: fix sending dup cluster log items (#9080 Sage Weil)
-* doc: several doc updates (Alfredo Deza)
-* libcephfs-java: fix build against older JNI headesr (Greg Farnum)
-* librados: fix crash in op timeout path (#9362 Matthias Kiefer, Sage Weil)
-* librbd: fix crash using clone of flattened image (#8845 Josh Durgin)
-* librbd: fix error path cleanup when failing to open image (#8912 Josh Durgin)
-* mon: fix crash when adjusting pg_num before any OSDs are added (#9052 Sage Weil)
-* mon: reduce log noise from paxos (Aanchal Agrawal, Sage Weil)
-* osd: allow scrub and snap trim thread pool IO priority to be adjusted (Sage Weil)
-* osd: fix mount/remount sync race (#9144 Sage Weil)
-
-
-v0.67.10 "Dumpling"
-===================
-
-This stable update release for Dumpling includes primarily fixes for
-RGW, including several issues with bucket listings and a potential
-data corruption problem when multiple multi-part uploads race.  There is also
-some throttling capability added in the OSD for scrub that can mitigate the
-performance impact on production clusters.
-
-We recommend that all Dumpling users upgrade at their convenience.
-
-Notable Changes
----------------
-
-* ceph-disk: partprobe befoere settle, fixing dm-crypt (#6966, Eric Eastman)
-* librbd: add invalidate cache interface (Josh Durgin)
-* librbd: close image if remove_child fails (Ilya Dryomov)
-* librbd: fix potential null pointer dereference (Danny Al-Gaaf)
-* librbd: improve writeback checks, performance (Haomai Wang)
-* librbd: skip zeroes when copying image (#6257, Josh Durgin)
-* mon: fix rule(set) check on 'ceph pool set ... crush_ruleset ...' (#8599, John Spray)
-* mon: shut down if mon is removed from cluster (#6789, Joao Eduardo Luis)
-* osd: fix filestore perf reports to mon (Sage Weil)
-* osd: force any new or updated xattr into leveldb if E2BIG from XFS (#7779, Sage Weil)
-* osd: lock snapdir object during write to fix race with backfill (Samuel Just)
-* osd: option sleep during scrub (Sage Weil)
-* osd: set io priority on scrub and snap trim threads (Sage Weil)
-* osd: 'status' admin socket command (Sage Weil)
-* rbd: tolerate missing NULL terminator on block_name_prefix (#7577, Dan Mick)
-* rgw: calculate user manifest (#8169, Yehuda Sadeh)
-* rgw: fix abort on chunk read error, avoid using extra memory (#8289, Yehuda Sadeh)
-* rgw: fix buffer overflow on bucket instance id (#8608, Yehuda Sadeh)
-* rgw: fix crash in swift CORS preflight request (#8586, Yehuda Sadeh)
-* rgw: fix implicit removal of old objects on object creation (#8972, Patrycja Szablowska, Yehuda Sadeh)
-* rgw: fix MaxKeys in bucket listing (Yehuda Sadeh)
-* rgw: fix race with multiple updates to a single multipart object (#8269, Yehuda Sadeh)
-* rgw: improve bucket listing with delimiter (Yehuda Sadeh)
-* rgw: include NextMarker in bucket listing (#8858, Yehuda Sadeh)
-* rgw: return error early on non-existent bucket (#7064, Yehuda Sadeh)
-* rgw: set truncation flag correctly in bucket listing (Yehuda Sadeh)
-* sysvinit: continue starting daemons after pre-mount error (#8554, Sage Weil)
-
-For more detailed information, see :download:`the complete changelog <../changelog/v0.67.10.txt>`.
-
-
-v0.67.9 "Dumpling"
-==================
-
-This Dumpling point release fixes several minor bugs. The most
-prevalent in the field is one that occasionally prevents OSDs from
-starting on recently created clusters.
-
-We recommend that all Dumpling users upgrade at their convenience.
-
-Notable Changes
----------------
-
-* ceph-fuse, libcephfs: client admin socket command to kick and inspect MDS sessions (#8021, Zheng Yan)
-* monclient: fix failure detection during mon handshake (#8278, Sage Weil)
-* mon: set tid on no-op PGStatsAck messages (#8280, Sage Weil)
-* msgr: fix a rare bug with connection negotiation between OSDs (Guang Yang)
-* osd: allow snap trim throttling with simple delay (#6278, Sage Weil)
-* osd: check for splitting when processing recover/backfill reservations (#6565, Samuel Just)
-* osd: fix backfill position tracking (#8162, Samuel Just)
-* osd: fix bug in backfill stats (Samuel Just)
-* osd: fix bug preventing OSD startup for infant clusters (#8162, Greg Farnum)
-* osd: fix rare PG resurrection race causing an incomplete PG (#7740, Samuel Just)
-* osd: only complete replicas count toward min_size (#7805, Samuel Just)
-* rgw: allow setting ACLs with empty owner (#6892, Yehuda Sadeh)
-* rgw: send user manifest header field (#8170, Yehuda Sadeh)
-
-For more detailed information, see :download:`the complete changelog <../changelog/v0.67.9.txt>`.
-
-
-v0.67.8 "Dumpling"
-==================
-
-This Dumpling point release fixes several non-critical issues since
-v0.67.7.  The most notable bug fixes are an auth fix in librbd
-(observed as an occasional crash from KVM), an improvement in the
-network failure detection with the monitor, and several hard to hit
-OSD crashes or hangs.
-
-We recommend that all users upgrade at their convenience.
-
-Upgrading
----------
-
-* The 'rbd ls' function now returns success and returns an empty when a pool
-  does not store any rbd images.  Previously it would return an ENOENT error.
-
-* Ceph will now issue a health warning if the 'mon osd down out
-  interval' config option is set to zero.  This warning can be
-  disabled by adding 'mon warn on osd down out interval zero = false'
-  to ceph.conf.
-
-Notable Changes
----------------
-
-* all: improve keepalive detection of failed monitor connections (#7888, Sage Weil)
-* ceph-fuse, libcephfs: pin inodes during readahead, fixing rare crash (#7867, Sage Weil)
-* librbd: make cache writeback a bit less aggressive (Sage Weil)
-* librbd: make symlink for qemu to detect librbd in RPM (#7293, Josh Durgin)
-* mon: allow 'hashpspool' pool flag to be set and unset (Loic Dachary)
-* mon: commit paxos state only after entire quorum acks, fixing rare race where prior round state is readable (#7736, Sage Weil)
-* mon: make elections and timeouts a bit more robust (#7212, Sage Weil)
-* mon: prevent extreme pool split operations (Greg Farnum)
-* mon: wait for quorum for get_version requests to close rare pool creation race (#7997, Sage Weil)
-* mon: warn on 'mon osd down out interval = 0' (#7784, Joao Luis)
-* msgr: fix byte-order for auth challenge, fixing auth errors on big-endian clients (#7977, Dan Mick)
-* msgr: fix occasional crash in authentication code (usually triggered by librbd) (#6840, Josh Durgin)
-* msgr: fix rebind() race (#6992, Xihui He)
-* osd: avoid timeouts during slow PG deletion (#6528, Samuel Just)
-* osd: fix bug in pool listing during recovery (#6633, Samuel Just)
-* osd: fix queue limits, fixing recovery stalls (#7706, Samuel Just)
-* osd: fix rare peering crashes (#6722, #6910, Samuel Just)
-* osd: fix rare recovery hang (#6681, Samuel Just)
-* osd: improve error handling on journal errors (#7738, Sage Weil)
-* osd: reduce load on the monitor from OSDMap subscriptions (Greg Farnum)
-* osd: rery GetLog on peer osd startup, fixing some rare peering stalls (#6909, Samuel Just)
-* osd: reset journal state on remount to fix occasional crash on OSD startup (#8019, Sage Weil)
-* osd: share maps with peers more aggressively (Greg Farnum)
-* rbd: make it harder to delete an rbd image that is currently in use (#7076, Ilya Drymov)
-* rgw: deny writes to secondary zone by non-system users (#6678, Yehuda Sadeh)
-* rgw: do'nt log system requests in usage log (#6889, Yehuda Sadeh)
-* rgw: fix bucket recreation (#6951, Yehuda Sadeh)
-* rgw: fix Swift range response (#7099, Julien Calvet, Yehuda Sadeh)
-* rgw: fix URL escaping (#8202, Yehuda Sadeh)
-* rgw: fix whitespace trimming in http headers (#7543, Yehuda Sadeh)
-* rgw: make multi-object deletion idempotent (#7346, Yehuda Sadeh)
-
-For more detailed information, see :download:`the complete changelog <../changelog/v0.67.8.txt>`.
-
-v0.67.7 "Dumpling"
-==================
-
-This Dumpling point release fixes a few critical issues in v0.67.6.
-
-All v0.67.6 users are urgently encouraged to upgrade.  We also
-recommend that all v0.67.5 (or older) users upgrade.
-
-Upgrading
----------
-
-* Once you have upgraded a radosgw instance or OSD to v0.67.7, you should not
-  downgrade to a previous version.
-
-Notable Changes
----------------
-
-* ceph-disk: additional unit tests
-* librbd: revert caching behavior change in v0.67.6
-* osd: fix problem reading xattrs due to incomplete backport in v0.67.6
-* radosgw-admin: fix reading object policy
-
-For more detailed information, see :download:`the complete changelog <../changelog/v0.67.7.txt>`.
-
-
-v0.67.6 "Dumpling"
-==================
-
-.. note: This release contains a librbd bug that is fixed in v0.67.7.  Please upgrade to v0.67.7 and do not use v0.67.6.
-
-This Dumpling point release contains a number of important fixed for
-the OSD, monitor, and radosgw.  Most significantly, a change that
-forces large object attributes to spill over into leveldb has been
-backported that can prevent objects and the cluster from being damaged
-by large attributes (which can be induced via the radosgw).  There is
-also a set of fixes that improves data safety and RADOS semantics when
-the cluster becomes full and then non-full.
-
-We recommend that all 0.67.x Dumpling users skip this release and upgrade to v0.67.7.
-
-Upgrading
----------
-
-* The OSD has long contained a feature that allows large xattrs to
-  spill over into the leveldb backing store in situations where not
-  all local file systems are able to store them reliably.  This option
-  is now enabled unconditionally in order to avoid rare cases where
-  storing large xattrs renders the object unreadable. This is known to
-  be triggered by very large multipart objects, but could be caused by
-  other workloads as well.  Although there is some small risk that
-  performance for certain workloads will degrade, it is more important
-  that data be retrievable.  Note that newer versions of Ceph (e.g.,
-  firefly) do some additional work to avoid the potential performance
-  regression in this case, but that is current considered too complex
-  for backport to the Dumpling stable series.
-
-* It is very dangerous to downgrade from v0.67.6 to a prior version of
-  Dumpling.  If the old version does not have 'filestore xattr use
-  omap = true' it may not be able to read all xattrs for an object and
-  can cause undefined behavior.
-
-Notable changes
----------------
-
-* ceph-disk: misc bug fixes, particularly on RHEL (Loic Dachary, Alfredo Deza, various)
-* ceph-fuse, libcephfs: fix crash from read over certain sparseness patterns (Sage Weil)
-* ceph-fuse, libcephfs: fix integer overflow for sync reads racing with appends (Sage Weil)
-* ceph.spec: fix udev rule when building RPM under RHEL (Derek Yarnell)
-* common: fix crash from bad format from admin socket (Loic Dachary)
-* librados: add optional timeouts (Josh Durgin)
-* librados: do not leak budget when resending localized or redirected ops (Josh Durgin)
-* librados, osd: fix and improve full cluster handling (Josh Durgin)
-* librbd: fix use-after-free when updating perfcounters during image close (Josh Durgin)
-* librbd: remove limit on objects in cache (Josh Durgin)
-* mon: avoid on-disk full OSDMap corruption from pg_temp removal (Sage Weil)
-* mon: avoid stray pg_temp entries from pool deletion race (Joao Eduardo Luis)
-* mon: do not generate spurious MDSMaps from laggy daemons (Joao Eduardo Luis)
-* mon: fix error code from 'osd rm|down|out|in ...' commands (Loic Dachary)
-* mon: include all health items in summary output (John Spray)
-* osd: fix occasional race/crash during startup (Sage Weil)
-* osd: ignore stray OSDMap messages during init (Sage Weil)
-* osd: unconditionally let xattrs overflow into leveldb (David Zafman)
-* rados: fix a few error checks for the CLI (Josh Durgin)
-* rgw: convert legacy bucket info objects on demand (Yehuda Sadeh)
-* rgw: fix bug causing system users to lose privileges (Yehuda Sadeh)
-* rgw: fix CORS bugs related to headers and case sensitivity (Robin H. Johnson)
-* rgw: fix multipart object listing (Yehuda Sadeh)
-* rgw: fix racing object creations (Yehuda Sadeh)
-* rgw: fix racing object put and delete (Yehuda Sadeh)
-* rgw: fix S3 auth when using response-* query string params (Sylvain Munaut)
-* rgw: use correct secret key for POST authentication (Robin H. Johnson)
-
-For more detailed information, see :download:`the complete changelog <../changelog/v0.67.6.txt>`.
-
-
-v0.67.5 "Dumpling"
-==================
-
-This release includes a few critical bug fixes for the radosgw,
-including a fix for hanging operations on large objects.  There are also
-several bug fixes for radosgw multi-site replications, and a few
-backported features.  Also, notably, the 'osd perf' command (which dumps
-recent performance information about active OSDs) has been backported.
-
-We recommend that all 0.67.x Dumpling users upgrade.
-
-Notable changes
----------------
-
-* ceph-fuse: fix crash in caching code
-* mds: fix looping in populate_mydir()
-* mds: fix standby-replay race
-* mon: accept 'osd pool set ...' as string
-* mon: backport: 'osd perf' command to dump recent OSD performance stats
-* osd: add feature compat check for upcoming object sharding
-* osd: fix osd bench block size argument
-* rbd.py: increase parent name size limit
-* rgw: backport: allow wildcard in supported keystone roles
-* rgw: backport: improve swift COPY behavior
-* rgw: backport: log and open admin socket by default
-* rgw: backport: validate S3 tokens against keystone
-* rgw: fix bucket removal
-* rgw: fix client error code for chunked PUT failure
-* rgw: fix hang on large object GET
-* rgw: fix rare use-after-free
-* rgw: various DR bug fixes
-* sysvinit, upstart: prevent starting daemons using both init systems
-
-For more detailed information, see :download:`the complete changelog <../changelog/v0.67.5.txt>`.
-
-
-v0.67.4 "Dumpling"
-==================
-
-This point release fixes an important performance issue with radosgw,
-keystone authentication token caching, and CORS.  All users
-(especially those of rgw) are encouraged to upgrade.
-
-Notable changes
----------------
-
-* crush: fix invalidation of cached names
-* crushtool: do not crash on non-unique bucket ids
-* mds: be more careful when decoding LogEvents
-* mds: fix heap check debugging commands
-* mon: avoid rebuilding old full osdmaps
-* mon: fix 'ceph crush move ...'
-* mon: fix 'ceph osd crush reweight ...'
-* mon: fix writeout of full osdmaps during trim
-* mon: limit size of transactions
-* mon: prevent both unmanaged and pool snaps
-* osd: disable xattr size limit (prevents upload of large rgw objects)
-* osd: fix recovery op throttling
-* osd: fix throttling of log messages for very slow requests
-* rgw: drain pending requests before completing write
-* rgw: fix CORS
-* rgw: fix inefficient list::size() usage
-* rgw: fix keystone token expiration
-* rgw: fix minor memory leaks
-* rgw: fix null termination of buffer
-
-For more detailed information, see :download:`the complete changelog <../changelog/v0.67.4.txt>`.
-
-
-v0.67.3 "Dumpling"
-==================
-
-This point release fixes a few important performance regressions with
-the OSD (both with CPU and disk utilization), as well as several other
-important but less common problems.  We recommend that all production users
-upgrade.
-
-Notable Changes
----------------
-
-* ceph-disk: partprobe after creation journal partition
-* ceph-disk: specify fs type when mounting
-* ceph-post-file: new utility to help share logs and other files with ceph developers
-* libcephfs: fix truncate vs readahead race (crash)
-* mds: fix flock/fcntl lock deadlock
-* mds: fix rejoin loop when encountering pre-dumpling backpointers
-* mon: allow name and addr discovery during election stage
-* mon: always refresh after Paxos store_state (fixes recovery corner case)
-* mon: fix off-by-4x bug with osd byte counts
-* osd: add and disable 'pg log keys debug' by default
-* osd: add option to disable throttling
-* osd: avoid leveldb iterators for pg log append and trim
-* osd: fix readdir_r invocations
-* osd: use fdatasync instead of sync
-* radosgw: fix sysvinit script return status
-* rbd: relicense as LGPL2
-* rgw: flush pending data on multipart upload
-* rgw: recheck object name during S3 POST
-* rgw: reorder init/startup
-* rpm: fix debuginfo package build
-
-For more detailed information, see :download:`the complete changelog <../changelog/v0.67.3.txt>`.
-
-
-v0.67.2 "Dumpling"
-==================
-
-This is an important point release for Dumpling.  Most notably, it
-fixes a problem when upgrading directly from v0.56.x Bobtail to
-v0.67.x Dumpling (without stopping at v0.61.x Cuttlefish along the
-way).  It also fixes a problem with the CLI parsing of the CEPH_ARGS
-environment variable, high CPU utilization by the ceph-osd daemons,
-and cleans up the radosgw shutdown sequence.
-
-Notable Changes
----------------
-
-* objecter: resend linger requests when cluster goes from full to non-full
-* ceph: parse CEPH_ARGS environment variable
-* librados: fix small memory leak
-* osd: remove old log objects on upgrade (fixes bobtail -> dumpling jump)
-* osd: disable PGLog::check() via config option (fixes CPU burn)
-* rgw: drain requests on shutdown
-* rgw: misc memory leaks on shutdown
-
-For more detailed information, see :download:`the complete changelog <../changelog/v0.67.2.txt>`.
-
-
-v0.67.1 "Dumpling"
-==================
-
-This is a minor point release for Dumpling that fixes problems with
-OpenStack and librbd hangs when caching is disabled.
-
-Notable changes
----------------
-
-* librados, librbd: fix constructor for python bindings with certain
-  usages (in particular, that used by OpenStack)
-* librados, librbd: fix aio_flush wakeup when cache is disabled
-* librados: fix locking for aio completion refcounting
-* fixes 'ceph --admin-daemon ...' command error code on error
-* fixes 'ceph daemon ... config set ...' command for boolean config
-  options.
-
-For more detailed information, see :download:`the complete changelog <../changelog/v0.67.1.txt>`.
-
-v0.67 "Dumpling"
-================
-
-This is the fourth major release of Ceph, code-named "Dumpling."  The
-headline features for this release include:
-
-* Multi-site support for radosgw.  This includes the ability to set up
-  separate "regions" in the same or different Ceph clusters that share
-  a single S3/Swift bucket/container namespace.
-
-* RESTful API endpoint for Ceph cluster administration.
-  ceph-rest-api, a wrapper around ceph_rest_api.py, can be used to
-  start up a test single-threaded HTTP server that provides access to
-  cluster information and administration in very similar ways to the
-  ceph commandline tool.  ceph_rest_api.py can be used as a WSGI
-  application for deployment in a more-capable web server.  See
-  ceph-rest-api.8 for more.
-
-* Object namespaces in librados.
-
-
-.. _dumpling-upgrade:
-
-Upgrade Sequencing
-------------------
-
-It is possible to do a rolling upgrade from Cuttlefish to Dumpling.
-
-#. Upgrade ceph-common on all nodes that will use the command line
-   'ceph' utility.
-#. Upgrade all monitors (upgrade ceph package, restart ceph-mon
-   daemons).  This can happen one daemon or host at a time.  Note that
-   because cuttlefish and dumpling monitors can't talk to each other,
-   all monitors should be upgraded in relatively short succession to
-   minimize the risk that an a untimely failure will reduce
-   availability.
-#. Upgrade all osds (upgrade ceph package, restart ceph-osd daemons).
-   This can happen one daemon or host at a time.
-#. Upgrade radosgw (upgrade radosgw package, restart radosgw daemons).
-
-
-Upgrading from v0.66
---------------------
-
-* There is monitor internal protocol change, which means that v0.67
-  ceph-mon daemons cannot talk to v0.66 or older daemons.  We
-  recommend upgrading all monitors at once (or in relatively quick
-  succession) to minimize the possibility of downtime.
-
-* The output of 'ceph status --format=json' or 'ceph -s --format=json'
-  has changed to return status information in a more structured and
-  usable format.
-
-* The 'ceph pg dump_stuck [threshold]' command used to require a
-  --threshold or -t prefix to the threshold argument, but now does
-  not.
-
-* Many more ceph commands now output formatted information; select
-  with '--format=<format>', where <format> can be 'json', 'json-pretty',
-  'xml', or 'xml-pretty'.
-
-* The 'ceph pg <pgid> ...' commands (like 'ceph pg <pgid> query') are
-  deprecated in favor of 'ceph tell <pgid> ...'.  This makes the
-  distinction between 'ceph pg <command> <pgid>' and 'ceph pg <pgid>
-  <command>' less awkward by making it clearer that the 'tell'
-  commands are talking to the OSD serving the placement group, not the
-  monitor.
-
-* The 'ceph --admin-daemon <path> <command ...>' used to accept the
-  command and arguments as either a single string or as separate
-  arguments.  It will now only accept the command spread across
-  multiple arguments.  This means that any script which does something
-  like::
-
-    ceph --admin-daemon /var/run/ceph/ceph-osd.0.asok 'config set debug_ms 1'
-
-  needs to remove the quotes.  Also, note that the above can now be
-  shortened to::
-
-    ceph daemon osd.0 config set debug_ms 1
-
-* The radosgw caps were inconsistently documented to be either 'mon =
-  allow r' or 'mon = allow rw'.  The 'mon = allow rw' is required for
-  radosgw to create its own pools.  All documentation has been updated
-  accordingly.
-
-* The radosgw copy object operation may return extra progress info
-  during the operation. At this point it will only happen when doing
-  cross zone copy operations. The S3 response will now return extra
-  <Progress> field under the <CopyResult> container. The Swift
-  response will now send the progress as a json array.
-
-* In v0.66 and v0.65 the HASHPSPOOL pool flag was enabled by default
-  for new pools, but has been disabled again until Linux kernel client
-  support reaches more distributions and users.
-
-* ceph-osd now requires a max file descriptor limit (e.g., ``ulimit -n
-  ...``) of at least
-  filestore_wbthrottle_(xfs|btrfs)_inodes_hard_limit (5000 by default)
-  in order to accommodate the new write back throttle system.  On
-  Ubuntu, upstart now sets the fd limit to 32k.  On other platforms,
-  the sysvinit script will set it to 32k by default (still
-  overrideable via max_open_files).  If this field has been customized
-  in ceph.conf it should likely be adjusted upwards.
-
-Upgrading from v0.61 "Cuttlefish"
----------------------------------
-
-In addition to the above notes about upgrading from v0.66:
-
-* There has been a huge revamp of the 'ceph' command-line interface
-  implementation.  The ``ceph-common`` client library needs to be
-  upgrade before ``ceph-mon`` is restarted in order to avoid problems
-  using the CLI (the old ``ceph`` client utility cannot talk to the
-  new ``ceph-mon``).
-
-* The CLI is now very careful about sending the 'status' one-liner
-  output to stderr and command output to stdout.  Scripts relying on
-  output should take care.
-
-* The 'ceph osd tell ...' and 'ceph mon tell ...' commands are no
-  longer supported.  Any callers should use::
-
-   ceph tell osd.<id or *> ...
-   ceph tell mon.<id or name or *> ...
-
-  The 'ceph mds tell ...' command is still there, but will soon also
-  transition to 'ceph tell mds.<id or name or \*> ...'
-
-* The 'ceph osd crush add ...' command used to take one of two forms::
-
-    ceph osd crush add 123 osd.123 <weight> <location ...>
-    ceph osd crush add osd.123 <weight> <location ...>
-
-  This is because the id and crush name are redundant.  Now only the
-  simple form is supported, where the osd name/id can either be a bare
-  id (integer) or name (osd.<id>)::
-
-    ceph osd crush add osd.123 <weight> <location ...>
-    ceph osd crush add 123 <weight> <location ...>
-
-* There is now a maximum RADOS object size, configurable via 'osd max
-  object size', defaulting to 100 GB.  Note that this has no effect on
-  RBD, CephFS, or radosgw, which all stripe over objects. If you are
-  using librados and storing objects larger than that, you will need
-  to adjust 'osd max object size', and should consider using smaller
-  objects instead.
-
-* The 'osd min down {reporters|reports}' config options have been
-  renamed to 'mon osd min down {reporters|reports}', and the
-  documentation has been updated to reflect that these options apply
-  to the monitors (who process failure reports) and not OSDs.  If you
-  have adjusted these settings, please update your ``ceph.conf``
-  accordingly.
-
-
-Notable changes since v0.66
----------------------------
-
-* mon: sync improvements (performance and robustness)
-* mon: many bug fixes (paxos and services)
-* mon: fixed bugs in recovery and io rate reporting (negative/large values)
-* mon: collect metadata on osd performance
-* mon: generate health warnings from slow or stuck requests
-* mon: expanded --format=<json|xml|...> support for monitor commands
-* mon: scrub function for verifying data integrity
-* mon, osd: fix old osdmap trimming logic
-* mon: enable leveldb caching by default
-* mon: more efficient storage of PG metadata
-* ceph-rest-api: RESTful endpoint for administer cluster (mirrors CLI)
-* rgw: multi-region support
-* rgw: infrastructure to support georeplication of bucket and user metadata
-* rgw: infrastructure to support georeplication of bucket data
-* rgw: COPY object support between regions
-* rbd: /etc/ceph/rbdmap file for mapping rbd images on startup
-* osd: many bug fixes
-* osd: limit number of incremental osdmaps sent to peers (could cause osds to be wrongly marked down)
-* osd: more efficient small object recovery
-* osd, librados: support for object namespaces
-* osd: automatically enable xattrs on leveldb as necessary
-* mds: fix bug in LOOKUPINO (used by nfs reexport)
-* mds: fix O_TRUNC locking
-* msgr: fixed race condition in inter-osd network communication
-* msgr: fixed various memory leaks related to network sessions
-* ceph-disk: fixes for unusual device names, partition detection
-* hypertable: fixes for hypertable CephBroker bindings
-* use SSE4.2 crc32c instruction if present
-
-
-Notable changes since v0.61 "Cuttlefish"
-----------------------------------------
-
-* add 'config get' admin socket command
-* ceph-conf: --show-config-value now reflects daemon defaults
-* ceph-disk: add '[un]suppress-active DEV' command
-* ceph-disk: avoid mounting over an existing osd in /var/lib/ceph/osd/*
-* ceph-disk: fixes for unusual device names, partition detection
-* ceph-disk: improved handling of odd device names
-* ceph-disk: many fixes for RHEL/CentOS, Fedora, wheezy
-* ceph-disk: simpler, more robust locking
-* ceph-fuse, libcephfs: fix a few caps revocation bugs
-* ceph-fuse, libcephfs: fix read zeroing at EOF
-* ceph-fuse, libcephfs: fix request refcounting bug (hang on shutdown)
-* ceph-fuse, libcephfs: fix truncatation bug on >4MB files (Yan, Zheng)
-* ceph-fuse, libcephfs: fix for cap release/hang
-* ceph-fuse: add ioctl support
-* ceph-fuse: fixed long-standing O_NOATIME vs O_LAZY bug
-* ceph-rest-api: RESTful endpoint for administer cluster (mirrors CLI)
-* ceph, librados: fix resending of commands on mon reconnect
-* daemons: create /var/run/ceph as needed
-* debian wheezy: fix udev rules
-* debian, specfile: packaging cleanups
-* debian: fix upstart behavior with upgrades
-* debian: rgw: stop daemon on uninstall
-* debian: stop daemons on uninstall; fix dependencies
-* hypertable: fixes for hypertable CephBroker bindings
-* librados python binding cleanups
-* librados python: fix xattrs > 4KB (Josh Durgin)
-* librados: configurable max object size (default 100 GB)
-* librados: new calls to administer the cluster
-* librbd: ability to read from local replicas
-* librbd: locking tests (Josh Durgin)
-* librbd: make default options/features for newly created images (e.g., via qemu-img) configurable
-* librbd: parallelize delete, rollback, flatten, copy, resize
-* many many fixes from static code analysis (Danny Al-Gaaf)
-* mds: fix O_TRUNC locking
-* mds: fix bug in LOOKUPINO (used by nfs reexport)
-* mds: fix rare hang after client restart
-* mds: fix several bugs (Yan, Zheng)
-* mds: many backpointer improvements (Yan, Zheng)
-* mds: many fixes for mds clustering
-* mds: misc stability fixes (Yan, Zheng, Greg Farnum)
-* mds: new robust open-by-ino support (Yan, Zheng)
-* mds: support robust lookup by ino number (good for NFS) (Yan, Zheng)
-* mon, ceph: huge revamp of CLI and internal admin API. (Dan Mick)
-* mon, osd: fix old osdmap trimming logic
-* mon, osd: many memory leaks fixed
-* mon: better trim/compaction behavior
-* mon: collect metadata on osd performance
-* mon: enable leveldb caching by default
-* mon: expanded --format=<json|xml|...> support for monitor commands
-* mon: fix election timeout
-* mon: fix leveldb compression, trimming
-* mon: fix start fork behavior
-* mon: fix units in 'ceph df' output
-* mon: fix validation of mds ids from CLI commands
-* mon: fixed bugs in recovery and io rate reporting (negative/large values)
-* mon: generate health warnings from slow or stuck requests
-* mon: many bug fixes (paxos and services, sync)
-* mon: many stability fixes (Joao Luis)
-* mon: more efficient storage of PG metadata
-* mon: new --extract-monmap to aid disaster recovery
-* mon: new capability syntax
-* mon: scrub function for verifying data integrity
-* mon: simplify PaxosService vs Paxos interaction, fix readable/writeable checks
-* mon: sync improvements (performance and robustness)
-* mon: tuning, performance improvements
-* msgr: fix various memory leaks
-* msgr: fixed race condition in inter-osd network communication
-* msgr: fixed various memory leaks related to network sessions
-* osd, librados: support for object namespaces
-* osd, mon: optionally dump leveldb transactions to a log
-* osd: automatically enable xattrs on leveldb as necessary
-* osd: avoid osd flapping from asymmetric network failure
-* osd: break blacklisted client watches (David Zafman)
-* osd: close narrow journal race
-* osd: do not use fadvise(DONTNEED) on XFS (data corruption on power cycle)
-* osd: fix for an op ordering bug
-* osd: fix handling for split after upgrade from bobtail
-* osd: fix incorrect mark-down of osds
-* osd: fix internal heartbeart timeouts when scrubbing very large objects
-* osd: fix memory/network inefficiency during deep scrub
-* osd: fixed problem with front-side heartbeats and mixed clusters (David Zafman)
-* osd: limit number of incremental osdmaps sent to peers (could cause osds to be wrongly marked down)
-* osd: many bug fixes
-* osd: monitor both front and back interfaces
-* osd: more efficient small object recovery
-* osd: new writeback throttling (for less bursty write performance) (Sam Just)
-* osd: pg log (re)writes are now vastly more efficient (faster peering) (Sam Just)
-* osd: ping/heartbeat on public and private interfaces
-* osd: prioritize recovery for degraded PGs
-* osd: re-use partially deleted PG contents when present (Sam Just)
-* osd: recovery and peering performance improvements
-* osd: resurrect partially deleted PGs
-* osd: verify both front and back network are working before rejoining cluster
-* rados: clonedata command for cli
-* radosgw-admin: create keys for new users by default
-* rbd: /etc/ceph/rbdmap file for mapping rbd images on startup
-* rgw: COPY object support between regions
-* rgw: fix CORS bugs
-* rgw: fix locking issue, user operation mask,
-* rgw: fix radosgw-admin buckets list (Yehuda Sadeh)
-* rgw: fix usage log scanning for large, untrimmed logs
-* rgw: handle deep uri resources
-* rgw: infrastructure to support georeplication of bucket and user metadata
-* rgw: infrastructure to support georeplication of bucket data
-* rgw: multi-region support
-* sysvinit: fix enumeration of local daemons
-* sysvinit: fix osd crush weight calculation when using -a
-* sysvinit: handle symlinks in /var/lib/ceph/osd/*
-* use SSE4.2 crc32c instruction if present
-
-
-v0.66
-=====
-
-Upgrading
----------
-
-* There is now a configurable maximum rados object size, defaulting to 100 GB.  If you
-  are using librados and storing objects larger than that, you will need to adjust
-  'osd max object size', and should consider using smaller objects instead.
-
-Notable changes
----------------
-
-* osd: pg log (re)writes are now vastly more efficient (faster peering) (Sam Just)
-* osd: fixed problem with front-side heartbeats and mixed clusters (David Zafman)
-* mon: tuning, performance improvements
-* mon: simplify PaxosService vs Paxos interaction, fix readable/writeable checks
-* rgw: fix radosgw-admin buckets list (Yehuda Sadeh)
-* mds: support robust lookup by ino number (good for NFS) (Yan, Zheng)
-* mds: fix several bugs (Yan, Zheng)
-* ceph-fuse, libcephfs: fix truncatation bug on >4MB files (Yan, Zheng)
-* ceph/librados: fix resending of commands on mon reconnect
-* librados python: fix xattrs > 4KB (Josh Durgin)
-* librados: configurable max object size (default 100 GB)
-* msgr: fix various memory leaks
-* ceph-fuse: fixed long-standing O_NOATIME vs O_LAZY bug
-* ceph-fuse, libcephfs: fix request refcounting bug (hang on shutdown)
-* ceph-fuse, libcephfs: fix read zeroing at EOF
-* ceph-conf: --show-config-value now reflects daemon defaults
-* ceph-disk: simpler, more robust locking
-* ceph-disk: avoid mounting over an existing osd in /var/lib/ceph/osd/*
-* sysvinit: handle symlinks in /var/lib/ceph/osd/*
-
-
-v0.65
-=====
-
-Upgrading
----------
-
-* Huge revamp of the 'ceph' command-line interface implementation.
-  The ``ceph-common`` client library needs to be upgrade before
-  ``ceph-mon`` is restarted in order to avoid problems using the CLI
-  (the old ``ceph`` client utility cannot talk to the new
-  ``ceph-mon``).
-
-* The CLI is now very careful about sending the 'status' one-liner
-  output to stderr and command output to stdout.  Scripts relying on
-  output should take care.
-
-* The 'ceph osd tell ...' and 'ceph mon tell ...' commands are no
-  longer supported.  Any callers should use::
-
-    ceph tell osd.<id or *> ...
-    ceph tell mon.<id or name or *> ...
-
-  The 'ceph mds tell ...' command is still there, but will soon also
-  transition to 'ceph tell mds.<id or name or \*> ...'
-
-* The 'ceph osd crush add ...' command used to take one of two forms::
-
-    ceph osd crush add 123 osd.123 <weight> <location ...>
-    ceph osd crush add osd.123 <weight> <location ...>
-
-  This is because the id and crush name are redundant.  Now only the
-  simple form is supported, where the osd name/id can either be a bare
-  id (integer) or name (osd.<id>)::
-
-    ceph osd crush add osd.123 <weight> <location ...>
-    ceph osd crush add 123 <weight> <location ...>
-
-* There is now a maximum RADOS object size, configurable via 'osd max
-  object size', defaulting to 100 GB.  Note that this has no effect on
-  RBD, CephFS, or radosgw, which all stripe over objects.
-
-
-Notable changes
----------------
-
-* mon, ceph: huge revamp of CLI and internal admin API. (Dan Mick)
-* mon: new capability syntax
-* osd: do not use fadvise(DONTNEED) on XFS (data corruption on power cycle)
-* osd: recovery and peering performance improvements
-* osd: new writeback throttling (for less bursty write performance) (Sam Just)
-* osd: ping/heartbeat on public and private interfaces
-* osd: avoid osd flapping from asymmetric network failure
-* osd: re-use partially deleted PG contents when present (Sam Just)
-* osd: break blacklisted client watches (David Zafman)
-* mon: many stability fixes (Joao Luis)
-* mon, osd: many memory leaks fixed
-* mds: misc stability fixes (Yan, Zheng, Greg Farnum)
-* mds: many backpointer improvements (Yan, Zheng)
-* mds: new robust open-by-ino support (Yan, Zheng)
-* ceph-fuse, libcephfs: fix a few caps revocation bugs
-* librados: new calls to administer the cluster
-* librbd: locking tests (Josh Durgin)
-* ceph-disk: improved handling of odd device names
-* ceph-disk: many fixes for RHEL/CentOS, Fedora, wheezy
-* many many fixes from static code analysis (Danny Al-Gaaf)
-* daemons: create /var/run/ceph as needed
-
-
-v0.64
-=====
-
-Upgrading
----------
-
-* New pools now have the HASHPSPOOL flag set by default to provide
-  better distribution over OSDs.  Support for this feature was
-  introduced in v0.59 and Linux kernel version v3.9.  If you wish to
-  access the cluster from an older kernel, set the 'osd pool default
-  flag hashpspool = false' option in your ceph.conf prior to creating
-  the cluster or creating new pools.  Note that the presence of any
-  pool in the cluster with the flag enabled will make the OSD require
-  support from all clients.
-
-Notable changes
----------------
-
-* osd: monitor both front and back interfaces
-* osd: verify both front and back network are working before rejoining cluster
-* osd: fix memory/network inefficiency during deep scrub
-* osd: fix incorrect mark-down of osds
-* mon: fix start fork behavior
-* mon: fix election timeout
-* mon: better trim/compaction behavior
-* mon: fix units in 'ceph df' output
-* mon, osd: misc memory leaks
-* librbd: make default options/features for newly created images (e.g., via qemu-img) configurable
-* mds: many fixes for mds clustering
-* mds: fix rare hang after client restart
-* ceph-fuse: add ioctl support
-* ceph-fuse/libcephfs: fix for cap release/hang
-* rgw: handle deep uri resources
-* rgw: fix CORS bugs
-* ceph-disk: add '[un]suppress-active DEV' command
-* debian: rgw: stop daemon on uninstall
-* debian: fix upstart behavior with upgrades
-
-
-v0.63
-=====
-
-Upgrading
----------
-
-* The 'osd min down {reporters|reports}' config options have been
-  renamed to 'mon osd min down {reporters|reports}', and the
-  documentation has been updated to reflect that these options apply
-  to the monitors (who process failure reports) and not OSDs.  If you
-  have adjusted these settings, please update your ``ceph.conf``
-  accordingly.
-
-Notable Changes
----------------
-
-* librbd: parallelize delete, rollback, flatten, copy, resize
-* librbd: ability to read from local replicas
-* osd: resurrect partially deleted PGs
-* osd: prioritize recovery for degraded PGs
-* osd: fix internal heartbeart timeouts when scrubbing very large objects
-* osd: close narrow journal race
-* rgw: fix usage log scanning for large, untrimmed logs
-* rgw: fix locking issue, user operation mask,
-* initscript: fix osd crush weight calculation when using -a
-* initscript: fix enumeration of local daemons
-* mon: several fixes to paxos, sync
-* mon: new --extract-monmap to aid disaster recovery
-* mon: fix leveldb compression, trimming
-* add 'config get' admin socket command
-* rados: clonedata command for cli
-* debian: stop daemons on uninstall; fix dependencies
-* debian wheezy: fix udev rules
-* many many small fixes from coverity scan
-
-
-v0.62
-=====
-
-Notable Changes
----------------
-
-* mon: fix validation of mds ids from CLI commands
-* osd: fix for an op ordering bug
-* osd, mon: optionally dump leveldb transactions to a log
-* osd: fix handling for split after upgrade from bobtail
-* debian, specfile: packaging cleanups
-* radosgw-admin: create keys for new users by default
-* librados python binding cleanups
-* misc code cleanups
diff --git a/ceph/doc/releases/emperor.rst b/ceph/doc/releases/emperor.rst
deleted file mode 100644 (file)
index 3c0bcb7..0000000
+++ /dev/null
@@ -1,654 +0,0 @@
-=======
-Emperor
-=======
-
-Emperor is the 5th stable release of Ceph.  It is named after the emperor squid.
-
-
-v0.72.3 Emperor (pending release)
-=================================
-
-Upgrading
----------
-
-* Monitor 'auth' read-only commands now expect the user to have 'rx' caps.
-  This is the same behavior that was present in dumpling, but in emperor
-  and more recent development releases the 'r' cap was sufficient.  Note that
-  this backported security fix will break mon keys that are using the following
-  commands but do not have the 'x' bit in the mon capability::
-
-    ceph auth export
-    ceph auth get
-    ceph auth get-key
-    ceph auth print-key
-    ceph auth list
-
-
-v0.72.2 Emperor
-===============
-
-This is the second bugfix release for the v0.72.x Emperor series.  We
-have fixed a hang in radosgw, and fixed (again) a problem with monitor
-CLI compatibility with mixed version monitors.  (In the future this
-will no longer be a problem.)
-
-Upgrading
----------
-
-* The JSON schema for the 'osd pool set ...' command changed slightly.  Please
-  avoid issuing this particular command via the CLI while there is a mix of
-  v0.72.1 and v0.72.2 monitor daemons running.
-
-* As part of fix for #6796, 'ceph osd pool set <pool> <var> <arg>' now
-  receives <arg> as an integer instead of a string.  This affects how
-  'hashpspool' flag is set/unset: instead of 'true' or 'false', it now
-  must be '0' or '1'.
-
-
-Changes
--------
-
-* mon: 'osd pool set ...' syntax change
-* osd: added test for missing on-disk HEAD object
-* osd: fix osd bench block size argument
-* rgw: fix hang on large object GET
-* rgw: fix rare use-after-free
-* rgw: various DR bug fixes
-* rgw: do not return error on empty owner when setting ACL
-* sysvinit, upstart: prevent starting daemons using both init systems
-
-For more detailed information, see :download:`the complete changelog <../changelog/v0.72.2.txt>`.
-
-v0.72.1 Emperor
-===============
-
-Important Note
---------------
-
-When you are upgrading from Dumpling to Emperor, do not run any of the
-"ceph osd pool set" commands while your monitors are running separate versions.
-Doing so could result in inadvertently changing cluster configuration settings
-that exhaust compute resources in your OSDs.
-
-Changes
--------
-
-* osd: fix upgrade bug #6761
-* ceph_filestore_tool: introduced tool to repair errors caused by #6761
-
-This release addresses issue #6761.  Upgrading to Emperor can cause
-reads to begin returning ENFILE (too many open files).  v0.72.1 fixes
-that upgrade issue and adds a tool ceph_filestore_tool to repair osd
-stores affected by this bug.
-
-To repair a cluster affected by this bug:
-
-#. Upgrade all osd machines to v0.72.1
-#. Install the ceph-test package on each osd machine to get ceph_filestore_tool
-#. Stop all osd processes
-#. To see all lost objects, run the following on each osd with the osd stopped and
-   the osd data directory mounted::
-
-     ceph_filestore_tool --list-lost-objects=true --filestore-path=<path-to-osd-filestore> --journal-path=<path-to-osd-journal>
-
-#. To fix all lost objects, run the following on each osd with the
-   osd stopped and the osd data directory mounted::
-
-     ceph_filestore_tool --fix-lost-objects=true --list-lost-objects=true --filestore-path=<path-to-osd-filestore> --journal-path=<path-to-osd-journal>
-
-#. Once lost objects have been repaired on each osd, you can restart
-   the cluster.
-
-Note, the ceph_filestore_tool performs a scan of all objects on the
-osd and may take some time.
-
-
-v0.72 Emperor
-=============
-
-This is the fifth major release of Ceph, the fourth since adopting a
-3-month development cycle.  This release brings several new features,
-including multi-datacenter replication for the radosgw, improved
-usability, and lands a lot of incremental performance and internal
-refactoring work to support upcoming features in Firefly.
-
-Important Note
---------------
-
-When you are upgrading from Dumpling to Emperor, do not run any of the
-"ceph osd pool set" commands while your monitors are running separate versions.
-Doing so could result in inadvertently changing cluster configuration settings
-that exhaust compute resources in your OSDs.
-
-Highlights
-----------
-
-* common: improved crc32c performance
-* librados: new example client and class code
-* mds: many bug fixes and stability improvements
-* mon: health warnings when pool pg_num values are not reasonable
-* mon: per-pool performance stats
-* osd, librados: new object copy primitives
-* osd: improved interaction with backend file system to reduce latency
-* osd: much internal refactoring to support ongoing erasure coding and tiering support
-* rgw: bucket quotas
-* rgw: improved CORS support
-* rgw: performance improvements
-* rgw: validate S3 tokens against Keystone
-
-Coincident with core Ceph, the Emperor release also brings:
-
-* radosgw-agent: support for multi-datacenter replication for disaster recovery
-* tgt: improved support for iSCSI via upstream tgt
-
-Packages for both are available on ceph.com.
-
-Upgrade sequencing
-------------------
-
-There are no specific upgrade restrictions on the order or sequence of
-upgrading from 0.67.x Dumpling. However, you cannot run any of the
-"ceph osd pool set" commands while your monitors are running separate versions.
-Doing so could result in inadvertently changing cluster configuration settings
-and exhausting compute resources in your OSDs.
-
-It is also possible to do a rolling upgrade from 0.61.x Cuttlefish,
-but there are ordering restrictions.  (This is the same set of
-restrictions for Cuttlefish to Dumpling.)
-
-#. Upgrade ceph-common on all nodes that will use the command line 'ceph' utility.
-#. Upgrade all monitors (upgrade ceph package, restart ceph-mon
-   daemons).  This can happen one daemon or host at a time.  Note that
-   because cuttlefish and dumpling monitors can't talk to each other,
-   all monitors should be upgraded in relatively short succession to
-   minimize the risk that an a untimely failure will reduce
-   availability.
-#. Upgrade all osds (upgrade ceph package, restart ceph-osd daemons).
-   This can happen one daemon or host at a time.
-#. Upgrade radosgw (upgrade radosgw package, restart radosgw daemons).
-
-
-Upgrading from v0.71
---------------------
-
-* ceph-fuse and radosgw now use the same default values for the admin
-  socket and log file paths that the other daemons (ceph-osd,
-  ceph-mon, etc.) do.  If you run these daemons as non-root, you may
-  need to adjust your ceph.conf to disable these options or to adjust
-  the permissions on /var/run/ceph and /var/log/ceph.
-
-Upgrading from v0.67 Dumpling
------------------------------
-
-* ceph-fuse and radosgw now use the same default values for the admin
-  socket and log file paths that the other daemons (ceph-osd,
-  ceph-mon, etc.) do.  If you run these daemons as non-root, you may
-  need to adjust your ceph.conf to disable these options or to adjust
-  the permissions on /var/run/ceph and /var/log/ceph.
-
-* The MDS now disallows snapshots by default as they are not
-  considered stable.  The command 'ceph mds set allow_snaps' will
-  enable them.
-
-* For clusters that were created before v0.44 (pre-argonaut, Spring
-  2012) and store radosgw data, the auto-upgrade from TMAP to OMAP
-  objects has been disabled.  Before upgrading, make sure that any
-  buckets created on pre-argonaut releases have been modified (e.g.,
-  by PUTing and then DELETEing an object from each bucket).  Any
-  cluster created with argonaut (v0.48) or a later release or not
-  using radosgw never relied on the automatic conversion and is not
-  affected by this change.
-
-* Any direct users of the 'tmap' portion of the librados API should be
-  aware that the automatic tmap -> omap conversion functionality has
-  been removed.
-
-* Most output that used K or KB (e.g., for kilobyte) now uses a
-  lower-case k to match the official SI convention.  Any scripts that
-  parse output and check for an upper-case K will need to be modified.
-
-* librados::Rados::pool_create_async() and librados::Rados::pool_delete_async()
-  don't drop a reference to the completion object on error, caller needs to take
-  care of that. This has never really worked correctly and we were leaking an
-  object
-
-* 'ceph osd crush set <id> <weight> <loc..>' no longer adds the osd to the
-  specified location, as that's a job for 'ceph osd crush add'.  It will
-  however continue to work just the same as long as the osd already exists
-  in the crush map.
-
-* The OSD now enforces that class write methods cannot both mutate an
-  object and return data.  The rbd.assign_bid method, the lone
-  offender, has been removed.  This breaks compatibility with
-  pre-bobtail librbd clients by preventing them from creating new
-  images.
-
-* librados now returns on commit instead of ack for synchronous calls.
-  This is a bit safer in the case where both OSDs and the client crash, and
-  is probably how it should have been acting from the beginning. Users are
-  unlikely to notice but it could result in lower performance in some
-  circumstances. Those who care should switch to using the async interfaces,
-  which let you specify safety semantics precisely.
-
-* The C++ librados AioComplete::get_version() method was incorrectly
-  returning an int (usually 32-bits).  To avoid breaking library
-  compatibility, a get_version64() method is added that returns the
-  full-width value.  The old method is deprecated and will be removed
-  in a future release.  Users of the C++ librados API that make use of
-  the get_version() method should modify their code to avoid getting a
-  value that is truncated from 64 to to 32 bits.
-
-
-Notable Changes since v0.71
----------------------------
-
-* build: fix [/usr]/sbin locations (Alan Somers)
-* ceph-fuse, radosgw: enable admin socket and logging by default
-* ceph: make -h behave when monitors are down
-* common: cache crc32c values where possible
-* common: fix looping on BSD (Alan Somers)
-* librados, mon: ability to query/ping out-of-quorum monitor status (Joao Luis)
-* librbd python bindings: fix parent image name limit (Josh Durgin)
-* mds: avoid leaking objects when deleting truncated files (Yan, Zheng)
-* mds: fix F_GETLK (Yan, Zheng)
-* mds: fix many bugs with stray (unlinked) inodes (Yan, Zheng)
-* mds: fix many directory fragmentation bugs (Yan, Zheng)
-* mon: allow (un)setting HASHPSPOOL flag on existing pools (Joao Luis)
-* mon: make 'osd pool rename' idempotent (Joao Luis)
-* osd: COPY_GET on-wire encoding improvements (Greg Farnum)
-* osd: bloom_filter encodability, fixes, cleanups (Loic Dachary, Sage Weil)
-* osd: fix handling of racing read vs write (Samuel Just)
-* osd: reduce blocking on backing fs (Samuel Just)
-* radosgw-agent: multi-region replication/DR
-* rgw: fix/improve swift COPY support (Yehuda Sadeh)
-* rgw: misc fixes to support DR (Josh Durgin, Yehuda Sadeh)
-* rgw: per-bucket quota (Yehuda Sadeh)
-* rpm: fix junit dependencies (Alan Grosskurth)
-
-Notable Changes since v0.67 Dumpling
-------------------------------------
-
-* build cleanly under clang (Christophe Courtaut)
-* build: Makefile refactor (Roald J. van Loon)
-* build: fix [/usr]/sbin locations (Alan Somers)
-* ceph-disk: fix journal preallocation
-* ceph-fuse, radosgw: enable admin socket and logging by default
-* ceph-fuse: fix problem with readahead vs truncate race (Yan, Zheng)
-* ceph-fuse: trim deleted inodes from cache (Yan, Zheng)
-* ceph-fuse: use newer fuse api (Jianpeng Ma)
-* ceph-kvstore-tool: new tool for working with leveldb (copy, crc) (Joao Luis)
-* ceph-post-file: new command to easily share logs or other files with ceph devs
-* ceph: improve parsing of CEPH_ARGS (Benoit Knecht)
-* ceph: make -h behave when monitors are down
-* ceph: parse CEPH_ARGS env variable
-* common: bloom_filter improvements, cleanups
-* common: cache crc32c values where possible
-* common: correct SI is kB not KB (Dan Mick)
-* common: fix looping on BSD (Alan Somers)
-* common: migrate SharedPtrRegistry to use boost::shared_ptr<> (Loic Dachary)
-* common: misc portability fixes (Noah Watkins)
-* crc32c: fix optimized crc32c code (it now detects arch support properly)
-* crc32c: improved intel-optimized crc32c support (~8x faster on my laptop!)
-* crush: fix name caching
-* doc: erasure coding design notes (Loic Dachary)
-* hadoop: removed old version of shim to avoid confusing users (Noah Watkins)
-* librados, mon: ability to query/ping out-of-quorum monitor status (Joao Luis)
-* librados: fix async aio completion wakeup
-* librados: fix installed header #includes (Dan Mick)
-* librados: get_version64() method for C++ API
-* librados: hello_world example (Greg Farnum)
-* librados: sync calls now return on commit (instead of ack) (Greg Farnum)
-* librbd python bindings: fix parent image name limit (Josh Durgin)
-* librbd, ceph-fuse: avoid some sources of ceph-fuse, rbd cache stalls
-* mds: avoid leaking objects when deleting truncated files (Yan, Zheng)
-* mds: fix F_GETLK (Yan, Zheng)
-* mds: fix LOOKUPSNAP bug
-* mds: fix heap profiler commands (Joao Luis)
-* mds: fix locking deadlock (David Disseldorp)
-* mds: fix many bugs with stray (unlinked) inodes (Yan, Zheng)
-* mds: fix many directory fragmentation bugs (Yan, Zheng)
-* mds: fix mds rejoin with legacy parent backpointer xattrs (Alexandre Oliva)
-* mds: fix rare restart/failure race during fs creation
-* mds: fix standby-replay when we fall behind (Yan, Zheng)
-* mds: fix stray directory purging (Yan, Zheng)
-* mds: notify clients about deleted files (so they can release from their cache) (Yan, Zheng)
-* mds: several bug fixes with clustered mds (Yan, Zheng)
-* mon, osd: improve osdmap trimming logic (Samuel Just)
-* mon, osd: initial CLI for configuring tiering
-* mon: a few 'ceph mon add' races fixed (command is now idempotent) (Joao Luis)
-* mon: allow (un)setting HASHPSPOOL flag on existing pools (Joao Luis)
-* mon: allow cap strings with . to be unquoted
-* mon: allow logging level of cluster log (/var/log/ceph/ceph.log) to be adjusted
-* mon: avoid rewriting full osdmaps on restart (Joao Luis)
-* mon: continue to discover peer addr info during election phase
-* mon: disallow CephFS snapshots until 'ceph mds set allow_new_snaps' (Greg Farnum)
-* mon: do not expose uncommitted state from 'osd crush {add,set} ...' (Joao Luis)
-* mon: fix 'ceph osd crush reweight ...' (Joao Luis)
-* mon: fix 'osd crush move ...' command for buckets (Joao Luis)
-* mon: fix byte counts (off by factor of 4) (Dan Mick, Joao Luis)
-* mon: fix paxos corner case
-* mon: kv properties for pools to support EC (Loic Dachary)
-* mon: make 'osd pool rename' idempotent (Joao Luis)
-* mon: modify 'auth add' semantics to make a bit more sense (Joao Luis)
-* mon: new 'osd perf' command to dump recent performance information (Samuel Just)
-* mon: new and improved 'ceph -s' or 'ceph status' command (more info, easier to read)
-* mon: some auth check cleanups (Joao Luis)
-* mon: track per-pool stats (Joao Luis)
-* mon: warn about pools with bad pg_num
-* mon: warn when mon data stores grow very large (Joao Luis)
-* monc: fix small memory leak
-* new wireshark patches pulled into the tree (Kevin Jones)
-* objecter, librados: redirect requests based on cache tier config
-* objecter: fix possible hang when cluster is unpaused (Josh Durgin)
-* osd, librados: add new COPY_FROM rados operation
-* osd, librados: add new COPY_GET rados operations (used by COPY_FROM)
-* osd: 'osd recover clone overlap limit' option to limit cloning during recovery (Samuel Just)
-* osd: COPY_GET on-wire encoding improvements (Greg Farnum)
-* osd: add 'osd heartbeat min healthy ratio' configurable (was hard-coded at 33%)
-* osd: add option to disable pg log debug code (which burns CPU)
-* osd: allow cap strings with . to be unquoted
-* osd: automatically detect proper xattr limits (David Zafman)
-* osd: avoid extra copy in erasure coding reference implementation (Loic Dachary)
-* osd: basic cache pool redirects (Greg Farnum)
-* osd: basic whiteout, dirty flag support (not yet used)
-* osd: bloom_filter encodability, fixes, cleanups (Loic Dachary, Sage Weil)
-* osd: clean up and generalize copy-from code (Greg Farnum)
-* osd: cls_hello OSD class example
-* osd: erasure coding doc updates (Loic Dachary)
-* osd: erasure coding plugin infrastructure, tests (Loic Dachary)
-* osd: experiemental support for ZFS (zfsonlinux.org) (Yan, Zheng)
-* osd: fix RWORDER flags
-* osd: fix exponential backoff of slow request warnings (Loic Dachary)
-* osd: fix handling of racing read vs write (Samuel Just)
-* osd: fix version value returned by various operations (Greg Farnum)
-* osd: generalized temp object infrastructure
-* osd: ghobject_t infrastructure for EC (David Zafman)
-* osd: improvements for compatset support and storage (David Zafman)
-* osd: infrastructure to copy objects from other OSDs
-* osd: instrument peering states (David Zafman)
-* osd: misc copy-from improvements
-* osd: opportunistic crc checking on stored data (off by default)
-* osd: properly enforce RD/WR flags for rados classes
-* osd: reduce blocking on backing fs (Samuel Just)
-* osd: refactor recovery using PGBackend (Samuel Just)
-* osd: remove old magical tmap->omap conversion
-* osd: remove old pg log on upgrade (Samuel Just)
-* osd: revert xattr size limit (fixes large rgw uploads)
-* osd: use fdatasync(2) instead of fsync(2) to improve performance (Sam Just)
-* pybind: fix blacklisting nonce (Loic Dachary)
-* radosgw-agent: multi-region replication/DR
-* rgw: complete in-progress requests before shutting down
-* rgw: default log level is now more reasonable (Yehuda Sadeh)
-* rgw: fix S3 auth with response-* query string params (Sylvain Munaut, Yehuda Sadeh)
-* rgw: fix a few minor memory leaks (Yehuda Sadeh)
-* rgw: fix acl group check (Yehuda Sadeh)
-* rgw: fix inefficient use of std::list::size() (Yehuda Sadeh)
-* rgw: fix major CPU utilization bug with internal caching (Yehuda Sadeh, Mark Nelson)
-* rgw: fix ordering of write operations (preventing data loss on crash) (Yehuda Sadeh)
-* rgw: fix ordering of writes for mulitpart upload (Yehuda Sadeh)
-* rgw: fix various CORS bugs (Yehuda Sadeh)
-* rgw: fix/improve swift COPY support (Yehuda Sadeh)
-* rgw: improve help output (Christophe Courtaut)
-* rgw: misc fixes to support DR (Josh Durgin, Yehuda Sadeh)
-* rgw: per-bucket quota (Yehuda Sadeh)
-* rgw: validate S3 tokens against keystone (Roald J. van Loon)
-* rgw: wildcard support for keystone roles (Christophe Courtaut)
-* rpm: fix junit dependencies (Alan Grosskurth)
-* sysvinit radosgw: fix status return code (Danny Al-Gaaf)
-* sysvinit rbdmap: fix error 'service rbdmap stop' (Laurent Barbe)
-* sysvinit: add condrestart command (Dan van der Ster)
-* sysvinit: fix shutdown order (mons last) (Alfredo Deza)
-
-
-
-v0.71
-=====
-
-This development release includes a significant amount of new code and
-refactoring, as well as a lot of preliminary functionality that will be needed
-for erasure coding and tiering support.  There are also several significant
-patch sets improving this with the MDS.
-
-Upgrading
----------
-
-* The MDS now disallows snapshots by default as they are not
-  considered stable.  The command 'ceph mds set allow_snaps' will
-  enable them.
-
-* For clusters that were created before v0.44 (pre-argonaut, Spring
-  2012) and store radosgw data, the auto-upgrade from TMAP to OMAP
-  objects has been disabled.  Before upgrading, make sure that any
-  buckets created on pre-argonaut releases have been modified (e.g.,
-  by PUTing and then DELETEing an object from each bucket).  Any
-  cluster created with argonaut (v0.48) or a later release or not
-  using radosgw never relied on the automatic conversion and is not
-  affected by this change.
-
-* Any direct users of the 'tmap' portion of the librados API should be
-  aware that the automatic tmap -> omap conversion functionality has
-  been removed.
-
-* Most output that used K or KB (e.g., for kilobyte) now uses a
-  lower-case k to match the official SI convention.  Any scripts that
-  parse output and check for an upper-case K will need to be modified.
-
-Notable Changes
----------------
-
-* build: Makefile refactor (Roald J. van Loon)
-* ceph-disk: fix journal preallocation
-* ceph-fuse: trim deleted inodes from cache (Yan, Zheng)
-* ceph-fuse: use newer fuse api (Jianpeng Ma)
-* ceph-kvstore-tool: new tool for working with leveldb (copy, crc) (Joao Luis)
-* common: bloom_filter improvements, cleanups
-* common: correct SI is kB not KB (Dan Mick)
-* common: misc portability fixes (Noah Watkins)
-* hadoop: removed old version of shim to avoid confusing users (Noah Watkins)
-* librados: fix installed header #includes (Dan Mick)
-* librbd, ceph-fuse: avoid some sources of ceph-fuse, rbd cache stalls
-* mds: fix LOOKUPSNAP bug
-* mds: fix standby-replay when we fall behind (Yan, Zheng)
-* mds: fix stray directory purging (Yan, Zheng)
-* mon: disallow CephFS snapshots until 'ceph mds set allow_new_snaps' (Greg Farnum)
-* mon, osd: improve osdmap trimming logic (Samuel Just)
-* mon: kv properties for pools to support EC (Loic Dachary)
-* mon: some auth check cleanups (Joao Luis)
-* mon: track per-pool stats (Joao Luis)
-* mon: warn about pools with bad pg_num
-* osd: automatically detect proper xattr limits (David Zafman)
-* osd: avoid extra copy in erasure coding reference implementation (Loic Dachary)
-* osd: basic cache pool redirects (Greg Farnum)
-* osd: basic whiteout, dirty flag support (not yet used)
-* osd: clean up and generalize copy-from code (Greg Farnum)
-* osd: erasure coding doc updates (Loic Dachary)
-* osd: erasure coding plugin infrastructure, tests (Loic Dachary)
-* osd: fix RWORDER flags
-* osd: fix exponential backoff of slow request warnings (Loic Dachary)
-* osd: generalized temp object infrastructure
-* osd: ghobject_t infrastructure for EC (David Zafman)
-* osd: improvements for compatset support and storage (David Zafman)
-* osd: misc copy-from improvements
-* osd: opportunistic crc checking on stored data (off by default)
-* osd: refactor recovery using PGBackend (Samuel Just)
-* osd: remove old magical tmap->omap conversion
-* pybind: fix blacklisting nonce (Loic Dachary)
-* rgw: default log level is now more reasonable (Yehuda Sadeh)
-* rgw: fix acl group check (Yehuda Sadeh)
-* sysvinit: fix shutdown order (mons last) (Alfredo Deza)
-
-v0.70
-=====
-
-Upgrading
----------
-
-* librados::Rados::pool_create_async() and librados::Rados::pool_delete_async()
-  don't drop a reference to the completion object on error, caller needs to take
-  care of that. This has never really worked correctly and we were leaking an
-  object
-
-* 'ceph osd crush set <id> <weight> <loc..>' no longer adds the osd to the
-  specified location, as that's a job for 'ceph osd crush add'.  It will
-  however continue to work just the same as long as the osd already exists
-  in the crush map.
-
-Notable Changes
----------------
-
-* mon: a few 'ceph mon add' races fixed (command is now idempotent) (Joao Luis)
-* crush: fix name caching
-* rgw: fix a few minor memory leaks (Yehuda Sadeh)
-* ceph: improve parsing of CEPH_ARGS (Benoit Knecht)
-* mon: avoid rewriting full osdmaps on restart (Joao Luis)
-* crc32c: fix optimized crc32c code (it now detects arch support properly)
-* mon: fix 'ceph osd crush reweight ...' (Joao Luis)
-* osd: revert xattr size limit (fixes large rgw uploads)
-* mds: fix heap profiler commands (Joao Luis)
-* rgw: fix inefficient use of std::list::size() (Yehuda Sadeh)
-
-
-v0.69
-=====
-
-Upgrading
----------
-
-* The sysvinit /etc/init.d/ceph script will, by default, update the
-  CRUSH location of an OSD when it starts.  Previously, if the
-  monitors were not available, this command would hang indefinitely.
-  Now, that step will time out after 10 seconds and the ceph-osd daemon
-  will not be started.
-
-* Users of the librados C++ API should replace users of get_version()
-  with get_version64() as the old method only returns a 32-bit value
-  for a 64-bit field.  The existing 32-bit get_version() method is now
-  deprecated.
-
-* The OSDs are now more picky that request payload match their
-  declared size.  A write operation across N bytes that includes M
-  bytes of data will now be rejected.  No known clients do this, but
-  the because the server-side behavior has changed it is possible that
-  an application misusing the interface may now get errors.
-
-* The OSD now enforces that class write methods cannot both mutate an
-  object and return data.  The rbd.assign_bid method, the lone
-  offender, has been removed.  This breaks compatibility with
-  pre-bobtail librbd clients by preventing them from creating new
-  images.
-
-* librados now returns on commit instead of ack for synchronous calls.
-  This is a bit safer in the case where both OSDs and the client crash, and
-  is probably how it should have been acting from the beginning. Users are
-  unlikely to notice but it could result in lower performance in some
-  circumstances. Those who care should switch to using the async interfaces,
-  which let you specify safety semantics precisely.
-
-* The C++ librados AioComplete::get_version() method was incorrectly
-  returning an int (usually 32-bits).  To avoid breaking library
-  compatibility, a get_version64() method is added that returns the
-  full-width value.  The old method is deprecated and will be removed
-  in a future release.  Users of the C++ librados API that make use of
-  the get_version() method should modify their code to avoid getting a
-  value that is truncated from 64 to to 32 bits.
-
-
-Notable Changes
----------------
-
-* build cleanly under clang (Christophe Courtaut)
-* common: migrate SharedPtrRegistry to use boost::shared_ptr<> (Loic Dachary)
-* doc: erasure coding design notes (Loic Dachary)
-* improved intel-optimized crc32c support (~8x faster on my laptop!)
-* librados: get_version64() method for C++ API
-* mds: fix locking deadlock (David Disseldorp)
-* mon, osd: initial CLI for configuring tiering
-* mon: allow cap strings with . to be unquoted
-* mon: continue to discover peer addr info during election phase
-* mon: fix 'osd crush move ...' command for buckets (Joao Luis)
-* mon: warn when mon data stores grow very large (Joao Luis)
-* objecter, librados: redirect requests based on cache tier config
-* osd, librados: add new COPY_FROM rados operation
-* osd, librados: add new COPY_GET rados operations (used by COPY_FROM)
-* osd: add 'osd heartbeat min healthy ratio' configurable (was hard-coded at 33%)
-* osd: add option to disable pg log debug code (which burns CPU)
-* osd: allow cap strings with . to be unquoted
-* osd: fix version value returned by various operations (Greg Farnum)
-* osd: infrastructure to copy objects from other OSDs
-* osd: use fdatasync(2) instead of fsync(2) to improve performance (Sam Just)
-* rgw: fix major CPU utilization bug with internal caching (Yehuda Sadeh, Mark Nelson)
-* rgw: fix ordering of write operations (preventing data loss on crash) (Yehuda Sadeh)
-* rgw: fix ordering of writes for mulitpart upload (Yehuda Sadeh)
-* rgw: fix various CORS bugs (Yehuda Sadeh)
-* rgw: improve help output (Christophe Courtaut)
-* rgw: validate S3 tokens against keystone (Roald J. van Loon)
-* rgw: wildcard support for keystone roles (Christophe Courtaut)
-* sysvinit radosgw: fix status return code (Danny Al-Gaaf)
-* sysvinit rbdmap: fix error 'service rbdmap stop' (Laurent Barbe)
-
-v0.68
-=====
-
-Upgrading
----------
-
-* 'ceph osd crush set <id> <weight> <loc..>' no longer adds the osd to the
-  specified location, as that's a job for 'ceph osd crush add'.  It will
-  however continue to work just the same as long as the osd already exists
-  in the crush map.
-
-* The OSD now enforces that class write methods cannot both mutate an
-  object and return data.  The rbd.assign_bid method, the lone
-  offender, has been removed.  This breaks compatibility with
-  pre-bobtail librbd clients by preventing them from creating new
-  images.
-
-* librados now returns on commit instead of ack for synchronous calls.
-  This is a bit safer in the case where both OSDs and the client crash, and
-  is probably how it should have been acting from the beginning. Users are
-  unlikely to notice but it could result in lower performance in some
-  circumstances. Those who care should switch to using the async interfaces,
-  which let you specify safety semantics precisely.
-
-* The C++ librados AioComplete::get_version() method was incorrectly
-  returning an int (usually 32-bits).  To avoid breaking library
-  compatibility, a get_version64() method is added that returns the
-  full-width value.  The old method is deprecated and will be removed
-  in a future release.  Users of the C++ librados API that make use of
-  the get_version() method should modify their code to avoid getting a
-  value that is truncated from 64 to to 32 bits.
-
-
-
-Notable Changes
----------------
-
-* ceph-fuse: fix problem with readahead vs truncate race (Yan, Zheng)
-* ceph-post-file: new command to easily share logs or other files with ceph devs
-* ceph: parse CEPH_ARGS env variable
-* librados: fix async aio completion wakeup
-* librados: hello_world example (Greg Farnum)
-* librados: sync calls now return on commit (instead of ack) (Greg Farnum)
-* mds: fix mds rejoin with legacy parent backpointer xattrs (Alexandre Oliva)
-* mds: fix rare restart/failure race during fs creation
-* mds: notify clients about deleted files (so they can release from their cache) (Yan, Zheng)
-* mds: several bug fixes with clustered mds (Yan, Zheng)
-* mon: allow logging level of cluster log (/var/log/ceph/ceph.log) to be adjusted
-* mon: do not expose uncommitted state from 'osd crush {add,set} ...' (Joao Luis)
-* mon: fix byte counts (off by factor of 4) (Dan Mick, Joao Luis)
-* mon: fix paxos corner case
-* mon: modify 'auth add' semantics to make a bit more sense (Joao Luis)
-* mon: new 'osd perf' command to dump recent performance information (Samuel Just)
-* mon: new and improved 'ceph -s' or 'ceph status' command (more info, easier to read)
-* monc: fix small memory leak
-* new wireshark patches pulled into the tree (Kevin Jones)
-* objecter: fix possible hang when cluster is unpaused (Josh Durgin)
-* osd: 'osd recover clone overlap limit' option to limit cloning during recovery (Samuel Just)
-* osd: cls_hello OSD class example
-* osd: experiemental support for ZFS (zfsonlinux.org) (Yan, Zheng)
-* osd: instrument peering states (David Zafman)
-* osd: properly enforce RD/WR flags for rados classes
-* osd: remove old pg log on upgrade (Samuel Just)
-* rgw: complete in-progress requests before shutting down
-* rgw: fix S3 auth with response-* query string params (Sylvain Munaut, Yehuda Sadeh)
-* sysvinit: add condrestart command (Dan van der Ster)
diff --git a/ceph/doc/releases/firefly.rst b/ceph/doc/releases/firefly.rst
deleted file mode 100644 (file)
index 6244600..0000000
+++ /dev/null
@@ -1,1787 +0,0 @@
-=======
-Firefly
-=======
-
-Firefly is the 6th stable release of Ceph. It is named after the
-firefly squid (Watasenia scintillans).
-
-v0.80.11 Firefly
-================
-
-This is a bugfix release for Firefly.  This Firefly 0.80.x is nearing
-its planned end of life in January 2016 it may also be the last.
-
-We recommend that all Firefly users upgrade.
-
-For more detailed information, see :download:`the complete changelog
-<../changelog/v0.80.11.txt>`.
-
-Notable Changes
----------------
-
-* build/ops: /etc/init.d/radosgw restart does not work correctly (`issue#11140 <http://tracker.ceph.com/issues/11140>`_, `pr#5831 <http://github.com/ceph/ceph/pull/5831>`_, Dmitry Yatsushkevich)
-* build/ops: Fix -Wno-format and -Werror=format-security options clash  (`issue#13417 <http://tracker.ceph.com/issues/13417>`_, `pr#6207 <http://github.com/ceph/ceph/pull/6207>`_, Boris Ranto)
-* build/ops: ceph-common needs python-argparse on older distros, but doesn't require it (`issue#12034 <http://tracker.ceph.com/issues/12034>`_, `pr#5217 <http://github.com/ceph/ceph/pull/5217>`_, Nathan Cutler)
-* build/ops: ceph.spec.in running fdupes unnecessarily (`issue#12301 <http://tracker.ceph.com/issues/12301>`_, `pr#5224 <http://github.com/ceph/ceph/pull/5224>`_, Nathan Cutler)
-* build/ops: ceph.spec.in: 50-rbd.rules conditional is wrong (`issue#12166 <http://tracker.ceph.com/issues/12166>`_, `pr#5225 <http://github.com/ceph/ceph/pull/5225>`_, Nathan Cutler)
-* build/ops: ceph.spec.in: useless %py_requires breaks SLE11-SP3 build (`issue#12351 <http://tracker.ceph.com/issues/12351>`_, `pr#5394 <http://github.com/ceph/ceph/pull/5394>`_, Nathan Cutler)
-* build/ops: fedora21 has junit, not junit4  (`issue#10728 <http://tracker.ceph.com/issues/10728>`_, `pr#6203 <http://github.com/ceph/ceph/pull/6203>`_, Ken Dreyer, Loic Dachary)
-* build/ops: upstart: configuration is too generous on restarts (`issue#11798 <http://tracker.ceph.com/issues/11798>`_, `pr#5992 <http://github.com/ceph/ceph/pull/5992>`_, Sage Weil)
-* common: Client admin socket leaks file descriptors (`issue#11535 <http://tracker.ceph.com/issues/11535>`_, `pr#4633 <http://github.com/ceph/ceph/pull/4633>`_, Jon Bernard)
-* common: FileStore calls syncfs(2) even it is not supported (`issue#12512 <http://tracker.ceph.com/issues/12512>`_, `pr#5529 <http://github.com/ceph/ceph/pull/5529>`_, Danny Al-Gaaf, Kefu Chai, Jianpeng Ma)
-* common: HeartBeat: include types (`issue#13088 <http://tracker.ceph.com/issues/13088>`_, `pr#6038 <http://github.com/ceph/ceph/pull/6038>`_, Sage Weil)
-* common: Malformed JSON command output when non-ASCII strings are present  (`issue#7387 <http://tracker.ceph.com/issues/7387>`_, `pr#4635 <http://github.com/ceph/ceph/pull/4635>`_, Kefu Chai, Tim Serong)
-* common: Memory leak in Mutex.cc, pthread_mutexattr_init without pthread_mutexattr_destroy (`issue#11762 <http://tracker.ceph.com/issues/11762>`_, `pr#5403 <http://github.com/ceph/ceph/pull/5403>`_, Ketor Meng)
-* common: Thread:pthread_attr_destroy(thread_attr) when done with it (`issue#12570 <http://tracker.ceph.com/issues/12570>`_, `pr#6325 <http://github.com/ceph/ceph/pull/6325>`_, Piotr Dałek, Zheng Qiankun)
-* common: ThreadPool add/remove work queue methods not thread safe (`issue#12662 <http://tracker.ceph.com/issues/12662>`_, `pr#5991 <http://github.com/ceph/ceph/pull/5991>`_, Jason Dillaman)
-* common: buffer: critical bufferlist::zero bug (`issue#12252 <http://tracker.ceph.com/issues/12252>`_, `pr#5388 <http://github.com/ceph/ceph/pull/5388>`_, Haomai Wang)
-* common: log: take mutex while opening fd (`issue#12465 <http://tracker.ceph.com/issues/12465>`_, `pr#5406 <http://github.com/ceph/ceph/pull/5406>`_, Samuel Just)
-* common: recursive lock of md_config_t (0) (`issue#12614 <http://tracker.ceph.com/issues/12614>`_, `pr#5814 <http://github.com/ceph/ceph/pull/5814>`_, Josh Durgin)
-* crush: take crashes due to invalid arg (`issue#11602 <http://tracker.ceph.com/issues/11602>`_, `pr#4769 <http://github.com/ceph/ceph/pull/4769>`_, Sage Weil)
-* doc: backport v0.80.10 release notes to firefly (`issue#11090 <http://tracker.ceph.com/issues/11090>`_, `pr#5307 <http://github.com/ceph/ceph/pull/5307>`_, Loic Dachary, Sage Weil)
-* doc: update docs to point to download.ceph.com (`issue#13162 <http://tracker.ceph.com/issues/13162>`_, `pr#5993 <http://github.com/ceph/ceph/pull/5993>`_, Alfredo Deza)
-* fs: MDSMonitor: handle MDSBeacon messages properly (`issue#11590 <http://tracker.ceph.com/issues/11590>`_, `pr#5199 <http://github.com/ceph/ceph/pull/5199>`_, Kefu Chai)
-* fs: client nonce collision due to unshared pid namespaces (`issue#13032 <http://tracker.ceph.com/issues/13032>`_, `pr#6087 <http://github.com/ceph/ceph/pull/6087>`_, Josh Durgin, Sage Weil)
-* librbd: Objectcacher setting max object counts too low (`issue#7385 <http://tracker.ceph.com/issues/7385>`_, `pr#4639 <http://github.com/ceph/ceph/pull/4639>`_, Jason Dillaman)
-* librbd: aio calls may block (`issue#11056 <http://tracker.ceph.com/issues/11056>`_, `pr#4854 <http://github.com/ceph/ceph/pull/4854>`_, Haomai Wang, Sage Weil, Jason Dillaman)
-* librbd: internal.cc: 1967: FAILED assert(watchers.size() == 1) (`issue#12176 <http://tracker.ceph.com/issues/12176>`_, `pr#5171 <http://github.com/ceph/ceph/pull/5171>`_, Jason Dillaman)
-* mon: Clock skew causes missing summary and confuses Calamari (`issue#11877 <http://tracker.ceph.com/issues/11877>`_, `pr#4867 <http://github.com/ceph/ceph/pull/4867>`_, Thorsten Behrens)
-* mon: EC pools are not allowed as cache pools, disallow in the mon (`issue#11650 <http://tracker.ceph.com/issues/11650>`_, `pr#5389 <http://github.com/ceph/ceph/pull/5389>`_, Samuel Just)
-* mon: Make it more difficult to delete pools in firefly (`issue#11800 <http://tracker.ceph.com/issues/11800>`_, `pr#4788 <http://github.com/ceph/ceph/pull/4788>`_, Sage Weil)
-* mon: MonitorDBStore: get_next_key() only if prefix matches (`issue#11786 <http://tracker.ceph.com/issues/11786>`_, `pr#5360 <http://github.com/ceph/ceph/pull/5360>`_, Joao Eduardo Luis)
-* mon: PaxosService: call post_refresh() instead of post_paxos_update() (`issue#11470 <http://tracker.ceph.com/issues/11470>`_, `pr#5358 <http://github.com/ceph/ceph/pull/5358>`_, Joao Eduardo Luis)
-* mon: add a cache layer over MonitorDBStore (`issue#12638 <http://tracker.ceph.com/issues/12638>`_, `pr#5698 <http://github.com/ceph/ceph/pull/5698>`_, Kefu Chai)
-* mon: adding exsting pool as tier with --force-nonempty clobbers removed_snaps (`issue#11493 <http://tracker.ceph.com/issues/11493>`_, `pr#5236 <http://github.com/ceph/ceph/pull/5236>`_, Sage Weil, Samuel Just)
-* mon: ceph fails to compile with boost 1.58 (`issue#11576 <http://tracker.ceph.com/issues/11576>`_, `pr#5129 <http://github.com/ceph/ceph/pull/5129>`_, Kefu Chai)
-* mon: does not check for IO errors on every transaction (`issue#13089 <http://tracker.ceph.com/issues/13089>`_, `pr#6091 <http://github.com/ceph/ceph/pull/6091>`_, Sage Weil)
-* mon: get pools health'info have error (`issue#12402 <http://tracker.ceph.com/issues/12402>`_, `pr#5410 <http://github.com/ceph/ceph/pull/5410>`_, renhwztetecs)
-* mon: increase globalid default for firefly (`issue#13255 <http://tracker.ceph.com/issues/13255>`_, `pr#6010 <http://github.com/ceph/ceph/pull/6010>`_, Sage Weil)
-* mon: pgmonitor: wrong at/near target max“ reporting (`issue#12401 <http://tracker.ceph.com/issues/12401>`_, `pr#5409 <http://github.com/ceph/ceph/pull/5409>`_, huangjun)
-* mon: register_new_pgs() should check ruleno instead of its index (`issue#12210 <http://tracker.ceph.com/issues/12210>`_, `pr#5404 <http://github.com/ceph/ceph/pull/5404>`_, Xinze Chi)
-* mon: scrub error (osdmap encoding mismatch?) upgrading from 0.80 to ~0.80.2 (`issue#8815 <http://tracker.ceph.com/issues/8815>`_, `issue#8674 <http://tracker.ceph.com/issues/8674>`_, `issue#9064 <http://tracker.ceph.com/issues/9064>`_, `pr#5200 <http://github.com/ceph/ceph/pull/5200>`_, Sage Weil, Zhiqiang Wang, Samuel Just)
-* mon: the output is wrong when runing ceph osd reweight (`issue#12251 <http://tracker.ceph.com/issues/12251>`_, `pr#5408 <http://github.com/ceph/ceph/pull/5408>`_, Joao Eduardo Luis)
-* objecter: can get stuck in redirect loop if osdmap epoch == last_force_op_resend (`issue#11026 <http://tracker.ceph.com/issues/11026>`_, `pr#4597 <http://github.com/ceph/ceph/pull/4597>`_, Jianpeng Ma, Sage Weil)
-* objecter: pg listing can deadlock when throttling is in use (`issue#9008 <http://tracker.ceph.com/issues/9008>`_, `pr#5043 <http://github.com/ceph/ceph/pull/5043>`_, Guang Yang)
-* objecter: resend linger ops on split (`issue#9806 <http://tracker.ceph.com/issues/9806>`_, `pr#5062 <http://github.com/ceph/ceph/pull/5062>`_, Josh Durgin, Samuel Just)
-* osd: Cleanup boost optionals for boost 1.56 (`issue#9983 <http://tracker.ceph.com/issues/9983>`_, `pr#5039 <http://github.com/ceph/ceph/pull/5039>`_, William A. Kennington III)
-* osd: LibRadosTwoPools[EC]PP.PromoteSnap failure (`issue#10052 <http://tracker.ceph.com/issues/10052>`_, `pr#5050 <http://github.com/ceph/ceph/pull/5050>`_, Sage Weil)
-* osd: Mutex Assert from PipeConnection::try_get_pipe (`issue#12437 <http://tracker.ceph.com/issues/12437>`_, `pr#5815 <http://github.com/ceph/ceph/pull/5815>`_, David Zafman)
-* osd: PG stuck with remapped (`issue#9614 <http://tracker.ceph.com/issues/9614>`_, `pr#5044 <http://github.com/ceph/ceph/pull/5044>`_, Guang Yang)
-* osd: PG::handle_advance_map: on_pool_change after handling the map change (`issue#12809 <http://tracker.ceph.com/issues/12809>`_, `pr#5988 <http://github.com/ceph/ceph/pull/5988>`_, Samuel Just)
-* osd: PGLog: split divergent priors as well (`issue#11069 <http://tracker.ceph.com/issues/11069>`_, `pr#4631 <http://github.com/ceph/ceph/pull/4631>`_, Samuel Just)
-* osd: PGLog::proc_replica_log: correctly handle case where entries between olog.head and log.tail were split out (`issue#11358 <http://tracker.ceph.com/issues/11358>`_, `pr#5287 <http://github.com/ceph/ceph/pull/5287>`_, Samuel Just)
-* osd: WBThrottle::clear_object: signal on cond when we reduce throttle values (`issue#12223 <http://tracker.ceph.com/issues/12223>`_, `pr#5822 <http://github.com/ceph/ceph/pull/5822>`_, Samuel Just)
-* osd: cache full mode still skips young objects (`issue#10006 <http://tracker.ceph.com/issues/10006>`_, `pr#5051 <http://github.com/ceph/ceph/pull/5051>`_, Xinze Chi, Zhiqiang Wang)
-* osd: crash creating/deleting pools (`issue#12429 <http://tracker.ceph.com/issues/12429>`_, `pr#5526 <http://github.com/ceph/ceph/pull/5526>`_, John Spray)
-* osd: explicitly specify OSD features in MOSDBoot (`issue#10911 <http://tracker.ceph.com/issues/10911>`_, `pr#4960 <http://github.com/ceph/ceph/pull/4960>`_, Sage Weil)
-* osd: is_new_interval() fixes (`issue#11771 <http://tracker.ceph.com/issues/11771>`_, `issue#10399 <http://tracker.ceph.com/issues/10399>`_, `pr#5726 <http://github.com/ceph/ceph/pull/5726>`_, Samuel Just, Jason Dillaman)
-* osd: make the all osd/filestore thread pool suicide timeouts separately configurable (`issue#11439 <http://tracker.ceph.com/issues/11439>`_, `pr#5823 <http://github.com/ceph/ceph/pull/5823>`_, Samuel Just)
-* osd: object creation by write cannot use an offset on an erasure coded pool (`issue#11507 <http://tracker.ceph.com/issues/11507>`_, `pr#4632 <http://github.com/ceph/ceph/pull/4632>`_, Jianpeng Ma, Loic Dachary)
-* osd: os/FileJournal: Fix journal write fail, align for direct io (`issue#12943 <http://tracker.ceph.com/issues/12943>`_, `pr#5619 <http://github.com/ceph/ceph/pull/5619>`_, Xie Rui)
-* osd: osd/PGLog.cc: 732: FAILED assert(log.log.size() == log_keys_debug.size()) (`issue#12652 <http://tracker.ceph.com/issues/12652>`_, `pr#5820 <http://github.com/ceph/ceph/pull/5820>`_, Sage Weil)
-* osd: read on chunk-aligned xattr not handled (`issue#12309 <http://tracker.ceph.com/issues/12309>`_, `pr#5235 <http://github.com/ceph/ceph/pull/5235>`_, Sage Weil)
-* rgw: Change variable length array of std::strings (not legal in C++) to std::vector<std::string> (`issue#12467 <http://tracker.ceph.com/issues/12467>`_, `pr#4583 <http://github.com/ceph/ceph/pull/4583>`_, Daniel J. Hofmann)
-* rgw: Civetweb RGW appears to report full size of object as downloaded when only partially downloaded (`issue#11851 <http://tracker.ceph.com/issues/11851>`_, `pr#5234 <http://github.com/ceph/ceph/pull/5234>`_, Yehuda Sadeh)
-* rgw: Keystone PKI token expiration is not enforced (`issue#11367 <http://tracker.ceph.com/issues/11367>`_, `pr#4765 <http://github.com/ceph/ceph/pull/4765>`_, Anton Aksola)
-* rgw: Object copy bug (`issue#11639 <http://tracker.ceph.com/issues/11639>`_, `pr#4762 <http://github.com/ceph/ceph/pull/4762>`_, Javier M. Mellid)
-* rgw: RGW returns requested bucket name raw in "Bucket" response header (`issue#11860 <http://tracker.ceph.com/issues/11860>`_, `issue#12537 <http://tracker.ceph.com/issues/12537>`_, `pr#5730 <http://github.com/ceph/ceph/pull/5730>`_, Yehuda Sadeh, Wido den Hollander)
-* rgw: Swift API: response for PUT on /container does not contain the mandatory Content-Length header when FCGI is used (`issue#11036 <http://tracker.ceph.com/issues/11036>`_, `pr#5170 <http://github.com/ceph/ceph/pull/5170>`_, Radoslaw Zarzynski)
-* rgw: content length parsing calls strtol() instead of strtoll() (`issue#10701 <http://tracker.ceph.com/issues/10701>`_, `pr#5997 <http://github.com/ceph/ceph/pull/5997>`_, Yehuda Sadeh)
-* rgw: delete bucket does not remove .bucket.meta file (`issue#11149 <http://tracker.ceph.com/issues/11149>`_, `pr#4641 <http://github.com/ceph/ceph/pull/4641>`_, Orit Wasserman)
-* rgw: doesn't return 'x-timestamp' in header which is used by 'View Details' of OpenStack (`issue#8911 <http://tracker.ceph.com/issues/8911>`_, `pr#4584 <http://github.com/ceph/ceph/pull/4584>`_, Yehuda Sadeh)
-* rgw: init some manifest fields when handling explicit objs (`issue#11455 <http://tracker.ceph.com/issues/11455>`_, `pr#5729 <http://github.com/ceph/ceph/pull/5729>`_, Yehuda Sadeh)
-* rgw: logfile does not get chowned properly (`issue#12073 <http://tracker.ceph.com/issues/12073>`_, `pr#5233 <http://github.com/ceph/ceph/pull/5233>`_, Thorsten Behrens)
-* rgw: logrotate.conf calls service with wrong init script name (`issue#12043 <http://tracker.ceph.com/issues/12043>`_, `pr#5390 <http://github.com/ceph/ceph/pull/5390>`_, wuxingyi)
-* rgw: quota not respected in POST object (`issue#11323 <http://tracker.ceph.com/issues/11323>`_, `pr#4642 <http://github.com/ceph/ceph/pull/4642>`_, Sergey Arkhipov)
-* rgw: swift smoke test fails on TestAccountUTF8 (`issue#11091 <http://tracker.ceph.com/issues/11091>`_, `issue#11438 <http://tracker.ceph.com/issues/11438>`_, `issue#12939 <http://tracker.ceph.com/issues/12939>`_, `issue#12157 <http://tracker.ceph.com/issues/12157>`_, `issue#12158 <http://tracker.ceph.com/issues/12158>`_, `issue#12363 <http://tracker.ceph.com/issues/12363>`_, `pr#5532 <http://github.com/ceph/ceph/pull/5532>`_, Radoslaw Zarzynski, Orit Wasserman, Robin H. Johnson)
-* rgw: use correct objv_tracker for bucket instance (`issue#11416 <http://tracker.ceph.com/issues/11416>`_, `pr#4535 <http://github.com/ceph/ceph/pull/4535>`_, Yehuda Sadeh)
-* tests: ceph-fuse crash in test_client_recovery (`issue#12673 <http://tracker.ceph.com/issues/12673>`_, `pr#5813 <http://github.com/ceph/ceph/pull/5813>`_, Loic Dachary)
-* tests: kernel_untar_build fails on EL7 (`issue#11758 <http://tracker.ceph.com/issues/11758>`_, `pr#6000 <http://github.com/ceph/ceph/pull/6000>`_, Greg Farnum)
-* tests: qemu workunit refers to apt-mirror.front.sepia.ceph.com (`issue#13420 <http://tracker.ceph.com/issues/13420>`_, `pr#6328 <http://github.com/ceph/ceph/pull/6328>`_, Yuan Zhou, Sage Weil)
-* tools:  src/ceph-disk : disk zap sgdisk invocation (`issue#11143 <http://tracker.ceph.com/issues/11143>`_, `pr#4636 <http://github.com/ceph/ceph/pull/4636>`_, Thorsten Behrens, Owen Synge)
-* tools: ceph-disk: sometimes the journal symlink is not created (`issue#10146 <http://tracker.ceph.com/issues/10146>`_, `pr#5541 <http://github.com/ceph/ceph/pull/5541>`_, Dan van der Ster)
-* tools: ceph-disk: support NVMe device partitions (`issue#11612 <http://tracker.ceph.com/issues/11612>`_, `pr#4771 <http://github.com/ceph/ceph/pull/4771>`_, Ilja Slepnev)
-* tools: ceph-post-file fails on rhel7 (`issue#11836 <http://tracker.ceph.com/issues/11836>`_, `pr#5037 <http://github.com/ceph/ceph/pull/5037>`_, Joseph McDonald, Sage Weil)
-* tools: ceph_argparse_flag has no regular 3rd parameter (`issue#11543 <http://tracker.ceph.com/issues/11543>`_, `pr#4582 <http://github.com/ceph/ceph/pull/4582>`_, Thorsten Behrens)
-* tools: use a new disk as journal disk,ceph-disk prepare fail (`issue#10983 <http://tracker.ceph.com/issues/10983>`_, `pr#4630 <http://github.com/ceph/ceph/pull/4630>`_, Loic Dachary)
-
-
-v0.80.10 Firefly
-================
-
-This is a bugfix release for Firefly.
-
-We recommend that all Firefly users upgrade.
-
-For more detailed information, see :download:`the complete changelog <../changelog/v0.80.10.txt>`.
-
-Notable Changes
----------------
-
-* build/ops: ceph.spec.in: package mkcephfs on EL6 (`issue#11955 <http://tracker.ceph.com/issues/11955>`_, `pr#4924 <http://github.com/ceph/ceph/pull/4924>`_, Ken Dreyer)
-* build/ops: debian: ceph-test and rest-bench debug packages should require their respective binary packages (`issue#11673 <http://tracker.ceph.com/issues/11673>`_, `pr#4766 <http://github.com/ceph/ceph/pull/4766>`_, Ken Dreyer)
-* build/ops: run RGW as root (`issue#11453 <http://tracker.ceph.com/issues/11453>`_, `pr#4638 <http://github.com/ceph/ceph/pull/4638>`_, Ken Dreyer)
-* common: messages/MWatchNotify: include an error code in the message (`issue#9193 <http://tracker.ceph.com/issues/9193>`_, `pr#3944 <http://github.com/ceph/ceph/pull/3944>`_, Sage Weil)
-* common: Rados.shutdown() dies with Illegal instruction (core dumped) (`issue#10153 <http://tracker.ceph.com/issues/10153>`_, `pr#3963 <http://github.com/ceph/ceph/pull/3963>`_, Federico Simoncelli)
-* common: SimpleMessenger: allow RESETSESSION whenever we forget an endpoint (`issue#10080 <http://tracker.ceph.com/issues/10080>`_, `pr#3915 <http://github.com/ceph/ceph/pull/3915>`_, Greg Farnum)
-* common: WorkQueue: make wait timeout on empty queue configurable (`issue#10817 <http://tracker.ceph.com/issues/10817>`_, `pr#3941 <http://github.com/ceph/ceph/pull/3941>`_, Samuel Just)
-* crush: set_choose_tries = 100 for erasure code rulesets (`issue#10353 <http://tracker.ceph.com/issues/10353>`_, `pr#3824 <http://github.com/ceph/ceph/pull/3824>`_, Loic Dachary)
-* doc: backport ceph-disk man page to Firefly (`issue#10724 <http://tracker.ceph.com/issues/10724>`_, `pr#3936 <http://github.com/ceph/ceph/pull/3936>`_, Nilamdyuti Goswami)
-* doc: Fix ceph command manpage to match ceph -h (`issue#10676 <http://tracker.ceph.com/issues/10676>`_, `pr#3996 <http://github.com/ceph/ceph/pull/3996>`_, David Zafman)
-* fs: mount.ceph: avoid spurious error message (`issue#10351 <http://tracker.ceph.com/issues/10351>`_, `pr#3927 <http://github.com/ceph/ceph/pull/3927>`_, Yan, Zheng)
-* librados: Fix memory leak in python rados bindings (`issue#10723 <http://tracker.ceph.com/issues/10723>`_, `pr#3935 <http://github.com/ceph/ceph/pull/3935>`_, Josh Durgin)
-* librados: fix resources leakage in RadosClient::connect() (`issue#10425 <http://tracker.ceph.com/issues/10425>`_, `pr#3828 <http://github.com/ceph/ceph/pull/3828>`_, Radoslaw Zarzynski)
-* librados: Translate operation flags from C APIs (`issue#10497 <http://tracker.ceph.com/issues/10497>`_, `pr#3930 <http://github.com/ceph/ceph/pull/3930>`_, Matt Richards)
-* librbd: acquire cache_lock before refreshing parent (`issue#5488 <http://tracker.ceph.com/issues/5488>`_, `pr#4206 <http://github.com/ceph/ceph/pull/4206>`_, Jason Dillaman)
-* librbd: snap_remove should ignore -ENOENT errors (`issue#11113 <http://tracker.ceph.com/issues/11113>`_, `pr#4245 <http://github.com/ceph/ceph/pull/4245>`_, Jason Dillaman)
-* mds: fix assertion caused by system clock backwards (`issue#11053 <http://tracker.ceph.com/issues/11053>`_, `pr#3970 <http://github.com/ceph/ceph/pull/3970>`_, Yan, Zheng)
-* mon: ignore osd failures from before up_from (`issue#10762 <http://tracker.ceph.com/issues/10762>`_, `pr#3937 <http://github.com/ceph/ceph/pull/3937>`_, Sage Weil)
-* mon: MonCap: take EntityName instead when expanding profiles (`issue#10844 <http://tracker.ceph.com/issues/10844>`_, `pr#3942 <http://github.com/ceph/ceph/pull/3942>`_, Joao Eduardo Luis)
-* mon: Monitor: fix timecheck rounds period (`issue#10546 <http://tracker.ceph.com/issues/10546>`_, `pr#3932 <http://github.com/ceph/ceph/pull/3932>`_, Joao Eduardo Luis)
-* mon: OSDMonitor: do not trust small values in osd epoch cache (`issue#10787 <http://tracker.ceph.com/issues/10787>`_, `pr#3823 <http://github.com/ceph/ceph/pull/3823>`_, Sage Weil)
-* mon: OSDMonitor: fallback to json-pretty in case of invalid formatter (`issue#9538 <http://tracker.ceph.com/issues/9538>`_, `pr#4475 <http://github.com/ceph/ceph/pull/4475>`_, Loic Dachary)
-* mon: PGMonitor: several stats output error fixes (`issue#10257 <http://tracker.ceph.com/issues/10257>`_, `pr#3826 <http://github.com/ceph/ceph/pull/3826>`_, Joao Eduardo Luis)
-* objecter: fix map skipping (`issue#9986 <http://tracker.ceph.com/issues/9986>`_, `pr#3952 <http://github.com/ceph/ceph/pull/3952>`_, Ding Dinghua)
-* osd: cache tiering: fix the atime logic of the eviction (`issue#9915 <http://tracker.ceph.com/issues/9915>`_, `pr#3949 <http://github.com/ceph/ceph/pull/3949>`_, Zhiqiang Wang)
-* osd: cancel_pull: requeue waiters (`issue#11244 <http://tracker.ceph.com/issues/11244>`_, `pr#4415 <http://github.com/ceph/ceph/pull/4415>`_, Samuel Just)
-* osd: check that source OSD is valid for MOSDRepScrub (`issue#9555 <http://tracker.ceph.com/issues/9555>`_, `pr#3947 <http://github.com/ceph/ceph/pull/3947>`_, Sage Weil)
-* osd: DBObjectMap: lock header_lock on sync() (`issue#9891 <http://tracker.ceph.com/issues/9891>`_, `pr#3948 <http://github.com/ceph/ceph/pull/3948>`_, Samuel Just)
-* osd: do not ignore deleted pgs on startup (`issue#10617 <http://tracker.ceph.com/issues/10617>`_, `pr#3933 <http://github.com/ceph/ceph/pull/3933>`_, Sage Weil)
-* osd: ENOENT on clone (`issue#11199 <http://tracker.ceph.com/issues/11199>`_, `pr#4385 <http://github.com/ceph/ceph/pull/4385>`_, Samuel Just)
-* osd: erasure-code-profile set races with erasure-code-profile rm (`issue#11144 <http://tracker.ceph.com/issues/11144>`_, `pr#4383 <http://github.com/ceph/ceph/pull/4383>`_, Loic Dachary)
-* osd: FAILED assert(soid < scrubber.start || soid >= scrubber.end) (`issue#11156 <http://tracker.ceph.com/issues/11156>`_, `pr#4185 <http://github.com/ceph/ceph/pull/4185>`_, Samuel Just)
-* osd: FileJournal: fix journalq population in do_read_entry() (`issue#6003 <http://tracker.ceph.com/issues/6003>`_, `pr#3960 <http://github.com/ceph/ceph/pull/3960>`_, Samuel Just)
-* osd: fix negative degraded objects during backfilling (`issue#7737 <http://tracker.ceph.com/issues/7737>`_, `pr#4021 <http://github.com/ceph/ceph/pull/4021>`_, Guang Yang)
-* osd: get the currently atime of the object in cache pool for eviction (`issue#9985 <http://tracker.ceph.com/issues/9985>`_, `pr#3950 <http://github.com/ceph/ceph/pull/3950>`_, Sage Weil)
-* osd: load_pgs: we need to handle the case where an upgrade from earlier versions which ignored non-existent pgs resurrects a pg with a prehistoric osdmap (`issue#11429 <http://tracker.ceph.com/issues/11429>`_, `pr#4556 <http://github.com/ceph/ceph/pull/4556>`_, Samuel Just)
-* osd: ObjectStore: Don't use largest_data_off to calc data_align. (`issue#10014 <http://tracker.ceph.com/issues/10014>`_, `pr#3954 <http://github.com/ceph/ceph/pull/3954>`_, Jianpeng Ma)
-* osd: osd_types: op_queue_age_hist and fs_perf_stat should be in osd_stat_t::o... (`issue#10259 <http://tracker.ceph.com/issues/10259>`_, `pr#3827 <http://github.com/ceph/ceph/pull/3827>`_, Samuel Just)
-* osd: PG::actingset should be used when checking the number of acting OSDs for... (`issue#11454 <http://tracker.ceph.com/issues/11454>`_, `pr#4453 <http://github.com/ceph/ceph/pull/4453>`_, Guang Yang)
-* osd: PG::all_unfound_are_queried_or_lost for non-existent osds (`issue#10976 <http://tracker.ceph.com/issues/10976>`_, `pr#4416 <http://github.com/ceph/ceph/pull/4416>`_, Mykola Golub)
-* osd: PG: always clear_primary_state (`issue#10059 <http://tracker.ceph.com/issues/10059>`_, `pr#3955 <http://github.com/ceph/ceph/pull/3955>`_, Samuel Just)
-* osd: PGLog.h: 279: FAILED assert(log.log.size() == log_keys_debug.size()) (`issue#10718 <http://tracker.ceph.com/issues/10718>`_, `pr#4382 <http://github.com/ceph/ceph/pull/4382>`_, Samuel Just)
-* osd: PGLog: include rollback_info_trimmed_to in (read|write)_log (`issue#10157 <http://tracker.ceph.com/issues/10157>`_, `pr#3964 <http://github.com/ceph/ceph/pull/3964>`_, Samuel Just)
-* osd: pg stuck stale after create with activation delay (`issue#11197 <http://tracker.ceph.com/issues/11197>`_, `pr#4384 <http://github.com/ceph/ceph/pull/4384>`_, Samuel Just)
-* osd: ReplicatedPG: fail a non-blocking flush if the object is being scrubbed (`issue#8011 <http://tracker.ceph.com/issues/8011>`_, `pr#3943 <http://github.com/ceph/ceph/pull/3943>`_, Samuel Just)
-* osd: ReplicatedPG::on_change: clean up callbacks_for_degraded_object (`issue#8753 <http://tracker.ceph.com/issues/8753>`_, `pr#3940 <http://github.com/ceph/ceph/pull/3940>`_, Samuel Just)
-* osd: ReplicatedPG::scan_range: an object can disappear between the list and t... (`issue#10150 <http://tracker.ceph.com/issues/10150>`_, `pr#3962 <http://github.com/ceph/ceph/pull/3962>`_, Samuel Just)
-* osd: requeue blocked op before flush it was blocked on (`issue#10512 <http://tracker.ceph.com/issues/10512>`_, `pr#3931 <http://github.com/ceph/ceph/pull/3931>`_, Sage Weil)
-* rgw: check for timestamp for s3 keystone auth (`issue#10062 <http://tracker.ceph.com/issues/10062>`_, `pr#3958 <http://github.com/ceph/ceph/pull/3958>`_, Abhishek Lekshmanan)
-* rgw: civetweb should use unique request id (`issue#11720 <http://tracker.ceph.com/issues/11720>`_, `pr#4780 <http://github.com/ceph/ceph/pull/4780>`_, Orit Wasserman)
-* rgw: don't allow negative / invalid content length (`issue#11890 <http://tracker.ceph.com/issues/11890>`_, `pr#4829 <http://github.com/ceph/ceph/pull/4829>`_, Yehuda Sadeh)
-* rgw: fail s3 POST auth if keystone not configured (`issue#10698 <http://tracker.ceph.com/issues/10698>`_, `pr#3966 <http://github.com/ceph/ceph/pull/3966>`_, Yehuda Sadeh)
-* rgw: flush xml header on get acl request (`issue#10106 <http://tracker.ceph.com/issues/10106>`_, `pr#3961 <http://github.com/ceph/ceph/pull/3961>`_, Yehuda Sadeh)
-* rgw: generate new tag for object when setting object attrs (`issue#11256 <http://tracker.ceph.com/issues/11256>`_, `pr#4571 <http://github.com/ceph/ceph/pull/4571>`_, Yehuda Sadeh)
-* rgw: generate the "Date" HTTP header for civetweb. (`issue#11871,11891 <http://tracker.ceph.com/issues/11871,11891>`_, `pr#4851 <http://github.com/ceph/ceph/pull/4851>`_, Radoslaw Zarzynski)
-* rgw: keystone token cache does not work correctly (`issue#11125 <http://tracker.ceph.com/issues/11125>`_, `pr#4414 <http://github.com/ceph/ceph/pull/4414>`_, Yehuda Sadeh)
-* rgw: merge manifests correctly when there's prefix override (`issue#11622 <http://tracker.ceph.com/issues/11622>`_, `pr#4697 <http://github.com/ceph/ceph/pull/4697>`_, Yehuda Sadeh)
-* rgw: send appropriate op to cancel bucket index pending operation (`issue#10770 <http://tracker.ceph.com/issues/10770>`_, `pr#3938 <http://github.com/ceph/ceph/pull/3938>`_, Yehuda Sadeh)
-* rgw: shouldn't need to disable rgw_socket_path if frontend is configured (`issue#11160 <http://tracker.ceph.com/issues/11160>`_, `pr#4275 <http://github.com/ceph/ceph/pull/4275>`_, Yehuda Sadeh)
-* rgw: Swift API. Dump container's custom metadata. (`issue#10665 <http://tracker.ceph.com/issues/10665>`_, `pr#3934 <http://github.com/ceph/ceph/pull/3934>`_, Dmytro Iurchenko)
-* rgw: Swift API. Support for X-Remove-Container-Meta-{key} header. (`issue#10475 <http://tracker.ceph.com/issues/10475>`_, `pr#3929 <http://github.com/ceph/ceph/pull/3929>`_, Dmytro Iurchenko)
-* rgw: use correct objv_tracker for bucket instance (`issue#11416 <http://tracker.ceph.com/issues/11416>`_, `pr#4379 <http://github.com/ceph/ceph/pull/4379>`_, Yehuda Sadeh)
-* tests: force checkout of submodules (`issue#11157 <http://tracker.ceph.com/issues/11157>`_, `pr#4079 <http://github.com/ceph/ceph/pull/4079>`_, Loic Dachary)
-* tools: Backport ceph-objectstore-tool changes to firefly (`issue#12327 <http://tracker.ceph.com/issues/12327>`_, `pr#3866 <http://github.com/ceph/ceph/pull/3866>`_, David Zafman)
-* tools: ceph-objectstore-tool: Output only unsupported features when incomatible (`issue#11176 <http://tracker.ceph.com/issues/11176>`_, `pr#4126 <http://github.com/ceph/ceph/pull/4126>`_, David Zafman)
-* tools: ceph-objectstore-tool: Use exit status 11 for incompatible import attemp... (`issue#11139 <http://tracker.ceph.com/issues/11139>`_, `pr#4129 <http://github.com/ceph/ceph/pull/4129>`_, David Zafman)
-* tools: Fix do_autogen.sh so that -L is allowed (`issue#11303 <http://tracker.ceph.com/issues/11303>`_, `pr#4247 <http://github.com/ceph/ceph/pull/4247>`_, Alfredo Deza)
-
-v0.80.9 Firefly
-===============
-
-This is a bugfix release for firefly.  It fixes a performance
-regression in librbd, an important CRUSH misbehavior (see below), and
-several RGW bugs.  We have also backported support for flock/fcntl
-locks to ceph-fuse and libcephfs.
-
-We recommend that all Firefly users upgrade.
-
-For more detailed information, see :download:`the complete changelog <../changelog/v0.80.9.txt>`.
-
-Adjusting CRUSH maps
---------------------
-
-* This point release fixes several issues with CRUSH that trigger
-  excessive data migration when adjusting OSD weights.  These are most
-  obvious when a very small weight change (e.g., a change from 0 to
-  .01) triggers a large amount of movement, but the same set of bugs
-  can also lead to excessive (though less noticeable) movement in
-  other cases.
-
-  However, because the bug may already have affected your cluster,
-  fixing it may trigger movement *back* to the more correct location.
-  For this reason, you must manually opt-in to the fixed behavior.
-
-  In order to set the new tunable to correct the behavior::
-
-     ceph osd crush set-tunable straw_calc_version 1
-
-  Note that this change will have no immediate effect.  However, from
-  this point forward, any 'straw' bucket in your CRUSH map that is
-  adjusted will get non-buggy internal weights, and that transition
-  may trigger some rebalancing.
-
-  You can estimate how much rebalancing will eventually be necessary
-  on your cluster with::
-
-     ceph osd getcrushmap -o /tmp/cm
-     crushtool -i /tmp/cm --num-rep 3 --test --show-mappings > /tmp/a 2>&1
-     crushtool -i /tmp/cm --set-straw-calc-version 1 -o /tmp/cm2
-     crushtool -i /tmp/cm2 --reweight -o /tmp/cm2
-     crushtool -i /tmp/cm2 --num-rep 3 --test --show-mappings > /tmp/b 2>&1
-     wc -l /tmp/a                          # num total mappings
-     diff -u /tmp/a /tmp/b | grep -c ^+    # num changed mappings
-
-   Divide the number of changed lines by the total number of lines in
-   /tmp/a.  We've found that most clusters are under 10%.
-
-   You can force all of this rebalancing to happen at once with::
-
-     ceph osd crush reweight-all
-
-   Otherwise, it will happen at some unknown point in the future when
-   CRUSH weights are next adjusted.
-
-Notable Changes
----------------
-
-* ceph-fuse: flock, fcntl lock support (Yan, Zheng, Greg Farnum)
-* crush: fix straw bucket weight calculation, add straw_calc_version tunable (#10095 Sage Weil)
-* crush: fix tree bucket (Rongzu Zhu)
-* crush: fix underflow of tree weights (Loic Dachary, Sage Weil)
-* crushtool: add --reweight (Sage Weil)
-* librbd: complete pending operations before losing image (#10299 Jason Dillaman)
-* librbd: fix read caching performance regression (#9854 Jason Dillaman)
-* librbd: gracefully handle deleted/renamed pools (#10270 Jason Dillaman)
-* mon: fix dump of chooseleaf_vary_r tunable (Sage Weil)
-* osd: fix PG ref leak in snaptrimmer on peering (#10421 Kefu Chai)
-* osd: handle no-op write with snapshot (#10262 Sage Weil)
-* radosgw-admin: create subuser when creating user (#10103 Yehuda Sadeh)
-* rgw: change multipart uplaod id magic (#10271 Georgio Dimitrakakis, Yehuda Sadeh)
-* rgw: don't overwrite bucket/object owner when setting ACLs (#10978 Yehuda Sadeh)
-* rgw: enable IPv6 for embedded civetweb (#10965 Yehuda Sadeh)
-* rgw: fix partial swift GET (#10553 Yehuda Sadeh)
-* rgw: fix quota disable (#9907 Dong Lei)
-* rgw: index swift keys appropriately (#10471 Hemant Burman, Yehuda Sadeh)
-* rgw: make setattrs update bucket index (#5595 Yehuda Sadeh)
-* rgw: pass civetweb configurables (#10907 Yehuda Sadeh)
-* rgw: remove swift user manifest (DLO) hash calculation (#9973 Yehuda Sadeh)
-* rgw: return correct len for 0-len objects (#9877 Yehuda Sadeh)
-* rgw: S3 object copy content-type fix (#9478 Yehuda Sadeh)
-* rgw: send ETag on S3 object copy (#9479 Yehuda Sadeh)
-* rgw: send HTTP status reason explicitly in fastcgi (Yehuda Sadeh)
-* rgw: set ulimit -n from sysvinit (el6) init script (#9587 Sage Weil)
-* rgw: update swift subuser permission masks when authenticating (#9918 Yehuda Sadeh)
-* rgw: URL decode query params correctly (#10271 Georgio Dimitrakakis, Yehuda Sadeh)
-* rgw: use attrs when reading object attrs (#10307 Yehuda Sadeh)
-* rgw: use \r\n for http headers (#9254 Benedikt Fraunhofer, Yehuda Sadeh)
-
-
-v0.80.8 Firefly
-===============
-
-This is a long-awaited bugfix release for firefly.  It has several
-important (but relatively rare) OSD peering fixes, performance issues
-when snapshots are trimmed, several RGW fixes, a paxos corner case
-fix, and some packaging updates.
-
-We recommend that all users for v0.80.x firefly upgrade when it is
-convenient to do so.
-
-For more detailed information, see :download:`the complete changelog <../changelog/v0.80.8.txt>`.
-
-Notable Changes
----------------
-
-* build: remove stack-execute bit from assembled code sections (#10114 Dan Mick)
-* ceph-disk: fix dmcrypt key permissions (#9785 Loic Dachary)
-* ceph-disk: fix keyring location (#9653 Loic Dachary)
-* ceph-disk: make partition checks more robust (#9721 #9665 Loic Dachary)
-* ceph: cleanly shut down librados context on shutdown (#8797 Dan Mick)
-* common: add $cctid config metavariable (#6228 Adam Crume)
-* crush: align rule and ruleset ids (#9675 Xiaoxi Chen)
-* crush: fix negative weight bug during create_or_move_item (#9998 Pawel Sadowski)
-* crush: fix potential buffer overflow in erasure rules (#9492 Johnu George)
-* debian: fix python-ceph -> ceph file movement (Sage Weil)
-* libcephfs,ceph-fuse: fix flush tid wraparound bug (#9869 Greg Farnum, Yan, Zheng)
-* libcephfs: close fd befure umount (#10415 Yan, Zheng)
-* librados: fix crash from C API when read timeout is enabled (#9582 Sage Weil)
-* librados: handle reply race with pool deletion (#10372 Sage Weil)
-* librbd: cap memory utilization for read requests (Jason Dillaman)
-* librbd: do not close a closed parent image on failure (#10030 Jason Dillaman)
-* librbd: fix diff tests (#10002 Josh Durgin)
-* librbd: protect list_children from invalid pools (#10123 Jason Dillaman)
-* make check improvemens (Loic Dachary)
-* mds: fix ctime updates (#9514 Greg Farnum)
-* mds: fix journal import tool (#10025 John Spray)
-* mds: fix rare NULL deref in cap flush handler (Greg Farnum)
-* mds: handle unknown lock messages (Yan, Zheng)
-* mds: store backtrace for straydir (Yan, Zheng)
-* mon: abort startup if disk is full (#9502 Joao Eduardo Luis)
-* mon: add paxos instrumentation (Sage Weil)
-* mon: fix double-free in rare OSD startup path (Sage Weil)
-* mon: fix osdmap trimming (#9987 Sage Weil)
-* mon: fix paxos corner cases (#9301 #9053 Sage Weil)
-* osd: cancel callback on blacklisted watchers (#8315 Samuel Just)
-* osd: cleanly abort set-alloc-hint operations during upgrade (#9419 David Zafman)
-* osd: clear rollback PG metadata on PG deletion (#9293 Samuel Just)
-* osd: do not abort deep scrub if hinfo is missing (#10018 Loic Dachary)
-* osd: erasure-code regression tests (Loic Dachary)
-* osd: fix distro metadata reporting for SUSE (#8654 Danny Al-Gaaf)
-* osd: fix full OSD checks during backfill (#9574 Samuel Just)
-* osd: fix ioprio parsing (#9677 Loic Dachary)
-* osd: fix journal direct-io shutdown (#9073 Mark Kirkwood, Ma Jianpeng, Somnath Roy)
-* osd: fix journal dump (Ma Jianpeng)
-* osd: fix occasional stall during peering or activation (Sage Weil)
-* osd: fix past_interval display bug (#9752 Loic Dachary)
-* osd: fix rare crash triggered by admin socket dump_ops_in_filght (#9916 Dong Lei)
-* osd: fix snap trimming performance issues (#9487 #9113 Samuel Just, Sage Weil, Dan van der Ster, Florian Haas)
-* osd: fix snapdir handling on cache eviction (#8629 Sage Weil)
-* osd: handle map gaps in map advance code (Sage Weil)
-* osd: handle undefined CRUSH results in interval check (#9718 Samuel Just)
-* osd: include shard in JSON dump of ghobject (#10063 Loic Dachary)
-* osd: make backfill reservation denial handling more robust (#9626 Samuel Just)
-* osd: make misdirected op checks handle EC + primary affinity (#9835 Samuel Just, Sage Weil)
-* osd: mount XFS with inode64 by default (Sage Weil)
-* osd: other misc bugs (#9821 #9875 Samuel Just)
-* rgw: add .log to default log path (#9353 Alexandre Marangone)
-* rgw: clean up fcgi request context (#10194 Yehuda Sadeh)
-* rgw: convet header underscores to dashes (#9206 Yehuda Sadeh)
-* rgw: copy object data if copy target is in different pool (#9039 Yehuda Sadeh)
-* rgw: don't try to authenticate CORS peflight request (#8718 Robert Hubbard, Yehuda Sadeh)
-* rgw: fix civetweb URL decoding (#8621 Yehuda Sadeh)
-* rgw: fix hash calculation during PUT (Yehuda Sadeh)
-* rgw: fix misc bugs (#9089 #9201 Yehuda Sadeh)
-* rgw: fix object tail test (#9226 Sylvain Munaut, Yehuda Sadeh)
-* rgw: make sysvinit script run rgw under systemd context as needed (#10125 Loic Dachary)
-* rgw: separate civetweb log from rgw log (Yehuda Sadeh)
-* rgw: set length for keystone token validations (#7796 Mark Kirkwood, Yehuda Sadeh)
-* rgw: subuser creation fixes (#8587 Yehuda Sadeh)
-* rpm: misc packaging improvements (Sandon Van Ness, Dan Mick, Erik Logthenberg, Boris Ranto)
-* rpm: use standard udev rules for CentOS7/RHEL7 (#9747 Loic Dachary)
-
-
-v0.80.7 Firefly
-===============
-
-This release fixes a few critical issues with v0.80.6, particularly
-with clusters running mixed versions.
-
-We recommend that all v0.80.x Firefly users upgrade to this release.
-
-For more detailed information, see :download:`the complete changelog <../changelog/v0.80.7.txt>`.
-
-Notable Changes
----------------
-
-* osd: fix invalid memory reference in log trimming (#9731 Samuel Just)
-* osd: fix use-after-free in cache tiering code (#7588 Sage Weil)
-* osd: remove bad backfill assertion for mixed-version clusters (#9696 Samuel Just)
-
-
-
-v0.80.6 Firefly
-===============
-
-This is a major bugfix release for firefly, fixing a range of issues
-in the OSD and monitor, particularly with cache tiering.  There are
-also important fixes in librados, with the watch/notify mechanism used
-by librbd, and in radosgw.
-
-A few pieces of new functionality of been backported, including improved
-'ceph df' output (view amount of writeable space per pool), support for
-non-default cluster names when using sysvinit or systemd, and improved
-(and fixed) support for dmcrypt.
-
-We recommend that all v0.80.x Firefly users upgrade to this release.
-
-For more detailed information, see :download:`the complete changelog <../changelog/v0.80.6.txt>`.
-
-Notable Changes
----------------
-
-* build: fix atomic64_t on i386 (#8969 Sage Weil)
-* build: fix build on alpha (Michael Cree, Dmitry Smirnov)
-* build: fix build on hppa (Dmitry Smirnov)
-* build: fix yasm detection on x32 arch (Sage Weil)
-* ceph-disk: fix 'list' function with dmcrypt (Sage Weil)
-* ceph-disk: fix dmcrypt support (Alfredo Deza)
-* ceph: allow non-default cluster to be specified (#8944)
-* common: fix dup log messages to mon (#9080 Sage Weil)
-* global: write pid file when -f is used (systemd, upstart) (Alexandre Oliva)
-* librados: fix crash when read timeout is enabled (#9362 Matthias Kiefer, Sage Weil)
-* librados: fix lock leaks in error paths (#9022 Pavan Rallabhandi)
-* librados: fix watch resend on PG acting set change (#9220 Samuel Just)
-* librados: python: fix aio_read handling with \0 (Mohammad Salehe)
-* librbd: add interface to invalidate cached data (Josh Durgin)
-* librbd: fix crash when using clone of flattened image (#8845 Josh Durgin)
-* librbd: fix error path cleanup on open (#8912 Josh Durgin)
-* librbd: fix null pointer check (Danny Al-Gaaf)
-* librbd: limit dirty object count (Haomai Wang)
-* mds: fix rstats for root and mdsdir (Yan, Zheng)
-* mon: add 'get' command for new cache tier pool properties (Joao Eduardo Luis)
-* mon: add 'osd pool get-quota' (#8523 Joao Eduardo Luis)
-* mon: add cluster fingerprint (Sage Weil)
-* mon: disallow nonsensical cache-mode transitions (#8155 Joao Eduardo Luis)
-* mon: fix cache tier rounding error on i386 (Sage Weil)
-* mon: fix occasional memory leak (#9176 Sage Weil)
-* mon: fix reported latency for 'osd perf' (#9269 Samuel Just)
-* mon: include 'max avail' in 'ceph df' output (Sage Weil, Xioaxi Chen)
-* mon: persistently mark pools where scrub may find incomplete clones (#8882 Sage Weil)
-* mon: preload erasure plugins (Loic Dachary)
-* mon: prevent cache-specific settings on non-tier pools (#8696 Joao Eduardo Luis)
-* mon: reduce log spam (Aanchal Agrawal, Sage Weil)
-* mon: warn when cache pools have no hit_sets enabled (Sage Weil)
-* msgr: fix trivial memory leak (Sage Weil)
-* osd: automatically scrub PGs with invalid stats (#8147 Sage Weil)
-* osd: avoid sharing PG metadata that is not durable (Samuel Just)
-* osd: cap hit_set size (#9339 Samuel Just)
-* osd: create default erasure profile if needed (#8601 Loic Dachary)
-* osd: dump tid as JSON int (not string)  where appropriate (Joao Eduardo Luis)
-* osd: encode blacklist in deterministic order (#9211 Sage Weil)
-* osd: fix behavior when cache tier has no hit_sets enabled (#8982 Sage Weil)
-* osd: fix cache tier flushing of snapshots (#9054 Samuel Just)
-* osd: fix cache tier op ordering when going from full to non-full (#8931 Sage Weil)
-* osd: fix crash on dup recovery reservation (#8863 Sage Weil)
-* osd: fix division by zero when pg_num adjusted with no OSDs (#9052 Sage Weil)
-* osd: fix hint crash in experimental keyvaluestore_dev backend (Hoamai Wang)
-* osd: fix leak in copyfrom cancellation (#8894 Samuel Just)
-* osd: fix locking for copyfrom finish (#8889 Sage Weil)
-* osd: fix long filename handling in backend (#8701 Sage Weil)
-* osd: fix min_size check with backfill (#9497 Samuel Just)
-* osd: fix mount/remount sync race (#9144 Sage Weil)
-* osd: fix object listing + erasure code bug (Guang Yang)
-* osd: fix race on reconnect to failed OSD (#8944 Greg Farnum)
-* osd: fix recovery reservation deadlock (Samuel Just)
-* osd: fix tiering agent arithmetic for negative values (#9082 Karan Singh)
-* osd: improve shutdown order (#9218 Sage Weil)
-* osd: improve subop discard logic (#9259 Samuel Just)
-* osd: introduce optional sleep, io priority for scrub and snap trim (Sage Weil)
-* osd: make scrub check for and remove stale erasure-coded objects (Samuel Just)
-* osd: misc fixes (#9481 #9482 #9179 Sameul Just)
-* osd: mix keyvaluestore_dev improvements (Haomai Wang)
-* osd: only require CRUSH features for rules that are used (#8963 Sage Weil)
-* osd: preload erasure plugins on startup (Loic Dachary)
-* osd: prevent PGs from falling behind when consuming OSDMaps (#7576 Sage Weil)
-* osd: prevent old clients from using tiered pools (#8714 Sage Weil)
-* osd: set min_size on erasure pools to data chunk count (Sage Weil)
-* osd: trim old erasure-coded objects more aggressively (Samuel Just)
-* rados: enforce erasure code alignment (Lluis Pamies-Juarez)
-* rgw: align object stripes with erasure pool alignment (#8442 Yehuda Sadeh)
-* rgw: don't send error body on HEAD for civetweb (#8539 Yehuda Sadeh)
-* rgw: fix crash in CORS preflight request (Yehuda Sadeh)
-* rgw: fix decoding of + in URL (#8702 Brian Rak)
-* rgw: fix object removal on object create (#8972 Patrycja Szabowska, Yehuda Sadeh)
-* systemd: use systemd-run when starting radosgw (JuanJose Galvez)
-* sysvinit: support non-default cluster name (Alfredo Deza)
-
-
-v0.80.5 Firefly
-===============
-
-This release fixes a few important bugs in the radosgw and fixes
-several packaging and environment issues, including OSD log rotation,
-systemd environments, and daemon restarts on upgrade.
-
-We recommend that all v0.80.x Firefly users upgrade, particularly if they
-are using upstart, systemd, or radosgw.
-
-Notable Changes
----------------
-
-* ceph-dencoder: do not needlessly link to librgw, librados, etc. (Sage Weil)
-* do not needlessly link binaries to leveldb (Sage Weil)
-* mon: fix mon crash when no auth keys are present (#8851, Joao Eduardo Luis)
-* osd: fix cleanup (and avoid occasional crash) during shutdown (#7981, Sage Weil)
-* osd: fix log rotation under upstart (Sage Weil)
-* rgw: fix multipart upload when object has irregular size (#8846, Yehuda Sadeh, Sylvain Munaut)
-* rgw: improve bucket listing S3 compatibility (#8858, Yehuda Sadeh)
-* rgw: improve delimited bucket listing (Yehuda Sadeh)
-* rpm: do not restart daemons on upgrade (#8849, Alfredo Deza)
-
-For more detailed information, see :download:`the complete changelog <../changelog/v0.80.5.txt>`.
-
-v0.80.4 Firefly
-===============
-
-This Firefly point release fixes an potential data corruption problem
-when ceph-osd daemons run on top of XFS and service Firefly librbd
-clients.  A recently added allocation hint that RBD utilizes triggers
-an XFS bug on some kernels (Linux 3.2, and likely others) that leads
-to data corruption and deep-scrub errors (and inconsistent PGs).  This
-release avoids the situation by disabling the allocation hint until we
-can validate which kernels are affected and/or are known to be safe to
-use the hint on.
-
-We recommend that all v0.80.x Firefly users urgently upgrade,
-especially if they are using RBD.
-
-Notable Changes
----------------
-
-* osd: disable XFS extsize hint by default (#8830, Samuel Just)
-* rgw: fix extra data pool default name (Yehuda Sadeh)
-
-For more detailed information, see :download:`the complete changelog <../changelog/v0.80.4.txt>`.
-
-
-v0.80.3 Firefly
-===============
-
-This is the third Firefly point release.  It includes a single fix
-for a radosgw regression that was discovered in v0.80.2 right after it
-was released.
-
-We recommend that all v0.80.x Firefly users upgrade.
-
-Notable Changes
----------------
-
-* radosgw: fix regression in manifest decoding (#8804, Sage Weil)
-
-For more detailed information, see :download:`the complete changelog <../changelog/v0.80.3.txt>`.
-
-
-v0.80.2 Firefly
-===============
-
-This is the second Firefly point release.  It contains a range of
-important fixes, including several bugs in the OSD cache tiering, some
-compatibility checks that affect upgrade situations, several radosgw
-bugs, and an irritating and unnecessary feature bit check that
-prevents older clients from communicating with a cluster with any
-erasure coded pools.
-
-One someone large change in this point release is that the ceph RPM
-package is separated into a ceph and ceph-common package, similar to
-Debian.  The ceph-common package contains just the client libraries
-without any of the server-side daemons.
-
-We recommend that all v0.80.x Firefly users skip this release and use
-v0.80.3.
-
-Notable Changes
----------------
-
-* ceph-disk: better debug logging (Alfredo Deza)
-* ceph-disk: fix preparation of OSDs with dmcrypt (#6700, Stephen F Taylor)
-* ceph-disk: partprobe on prepare to fix dm-crypt (#6966, Eric Eastman)
-* do not require ERASURE_CODE feature from clients (#8556, Sage Weil)
-* libcephfs-java: build with older JNI headers (Greg Farnum)
-* libcephfs-java: fix build with gcj-jdk (Dmitry Smirnov)
-* librados: fix osd op tid for redirected ops (#7588, Samuel Just)
-* librados: fix rados_pool_list buffer bounds checks (#8447, Sage Weil)
-* librados: resend ops when pool overlay changes (#8305, Sage Weil)
-* librbd, ceph-fuse: reduce CPU overhead for clean object check in cache (Haomai Wang)
-* mon: allow deletion of cephfs pools (John Spray)
-* mon: fix default pool ruleset choice (#8373, John Spray)
-* mon: fix health summary for mon low disk warning (Sage Weil)
-* mon: fix 'osd pool set <pool> cache_target_full_ratio' (Geoffrey Hartz)
-* mon: fix quorum feature check (Greg Farnum)
-* mon: fix request forwarding in mixed firefly+dumpling clusters 9#8727, Joao Eduardo Luis)
-* mon: fix rule vs ruleset check in 'osd pool set ... crush_ruleset' command (John Spray)
-* mon: make osd 'down' count accurate (Sage Weil)
-* mon: set 'next commit' in primary-affinity reply (Ilya Dryomov)
-* mon: verify CRUSH features are supported by all mons (#8738, Greg Farnum)
-* msgr: fix sequence negotiation during connection reset (Guang Yang)
-* osd: block scrub on blocked objects (#8011, Samuel Just)
-* osd: call XFS hint ioctl less often (#8241, Ilya Dryomov)
-* osd: copy xattr spill out marker on clone (Haomai Wang)
-* osd: fix flush of snapped objects (#8334, Samuel Just)
-* osd: fix hashindex restart of merge operation (#8332, Samuel Just)
-* osd: fix osdmap subscription bug causing startup hang (Greg Farnum)
-* osd: fix potential null deref (#8328, Sage Weil)
-* osd: fix shutdown race (#8319, Sage Weil)
-* osd: handle 'none' in CRUSH results properly during peering (#8507, Samuel Just)
-* osd: set no spill out marker on new objects (Greg Farnum)
-* osd: skip op ordering debug checks on tiered pools (#8380, Sage Weil)
-* rados: enforce 'put' alignment (Lluis Pamies-Juarez)
-* rest-api: fix for 'rx' commands (Ailing Zhang)
-* rgw: calc user manifest etag and fix check (#8169, #8436, Yehuda Sadeh)
-* rgw: fetch attrs on multipart completion (#8452, Yehuda Sadeh, Sylvain Munaut)
-* rgw: fix buffer overflow for long instance ids (#8608, Yehuda Sadeh)
-* rgw: fix entity permission check on metadata put (#8428, Yehuda Sadeh)
-* rgw: fix multipart retry race (#8269, Yehuda Sadeh)
-* rpm: split ceph into ceph and ceph-common RPMs (Sandon Van Ness, Dan Mick)
-* sysvinit: continue startin daemons after failure doing mount (#8554, Sage Weil)
-
-For more detailed information, see :download:`the complete changelog <../changelog/v0.80.2.txt>`.
-
-v0.80.1 Firefly
-===============
-
-This first Firefly point release fixes a few bugs, the most visible
-being a problem that prevents scrub from completing in some cases.
-
-Notable Changes
----------------
-
-* osd: revert incomplete scrub fix (Samuel Just)
-* rgw: fix stripe calculation for manifest objects (Yehuda Sadeh)
-* rgw: improve handling, memory usage for abort reads (Yehuda Sadeh)
-* rgw: send Swift user manifest HTTP header (Yehuda Sadeh)
-* libcephfs, ceph-fuse: expose MDS session state via admin socket (Yan, Zheng)
-* osd: add simple throttle for snap trimming (Sage Weil)
-* monclient: fix possible hang from ill-timed monitor connection failure (Sage Weil)
-* osd: fix trimming of past HitSets (Sage Weil)
-* osd: fix whiteouts for non-writeback cache modes (Sage Weil)
-* osd: prevent divide by zero in tiering agent (David Zafman)
-* osd: prevent busy loop when tiering agent can do no work (David Zafman)
-
-For more detailed information, see :download:`the complete changelog <../changelog/v0.80.1.txt>`.
-
-
-v0.80 Firefly
-=============
-
-This release will form the basis for our long-term supported release
-Firefly, v0.80.x.  The big new features are support for erasure coding
-and cache tiering, although a broad range of other features, fixes,
-and improvements have been made across the code base.  Highlights include:
-
-* *Erasure coding*: support for a broad range of erasure codes for lower
-  storage overhead and better data durability.
-* *Cache tiering*: support for creating 'cache pools' that store hot,
-  recently accessed objects with automatic demotion of colder data to
-  a base tier.  Typically the cache pool is backed by faster storage
-  devices like SSDs.
-* *Primary affinity*: Ceph now has the ability to skew selection of
-  OSDs as the "primary" copy, which allows the read workload to be
-  cheaply skewed away from parts of the cluster without migrating any
-  data.
-* *Key/value OSD backend* (experimental): An alternative storage backend
-  for Ceph OSD processes that puts all data in a key/value database like
-  leveldb.  This provides better performance for workloads dominated by
-  key/value operations (like radosgw bucket indices).
-* *Standalone radosgw* (experimental): The radosgw process can now run
-  in a standalone mode without an apache (or similar) web server or
-  fastcgi.  This simplifies deployment and can improve performance.
-
-We expect to maintain a series of stable releases based on v0.80
-Firefly for as much as a year.  In the meantime, development of Ceph
-continues with the next release, Giant, which will feature work on the
-CephFS distributed file system, more alternative storage backends
-(like RocksDB and f2fs), RDMA support, support for pyramid erasure
-codes, and additional functionality in the block device (RBD) like
-copy-on-read and multisite mirroring.
-
-
-Upgrade Sequencing
-------------------
-
-* If your existing cluster is running a version older than v0.67
-  Dumpling, please first upgrade to the latest Dumpling release before
-  upgrading to v0.80 Firefly.  Please refer to the :ref:`dumpling-upgrade`
-  documentation.
-
-* We recommend adding the following to the [mon] section of your
-  ceph.conf prior to upgrade::
-
-    mon warn on legacy crush tunables = false
-
-  This will prevent health warnings due to the use of legacy CRUSH
-  placement.  Although it is possible to rebalance existing data
-  across your cluster (see the upgrade notes below), we do not
-  normally recommend it for production environments as a large amount
-  of data will move and there is a significant performance impact from
-  the rebalancing.
-
-* Upgrade daemons in the following order:
-
-    #. Monitors
-    #. OSDs
-    #. MDSs and/or radosgw
-
-  If the ceph-mds daemon is restarted first, it will wait until all
-  OSDs have been upgraded before finishing its startup sequence.  If
-  the ceph-mon daemons are not restarted prior to the ceph-osd
-  daemons, they will not correctly register their new capabilities
-  with the cluster and new features may not be usable until they are
-  restarted a second time.
-
-* Upgrade radosgw daemons together.  There is a subtle change in behavior
-  for multipart uploads that prevents a multipart request that was initiated
-  with a new radosgw from being completed by an old radosgw.
-
-
-Upgrading from v0.79
---------------------
-
-* OSDMap's json-formatted dump changed for keys 'full' and 'nearfull'.
-  What was previously being outputted as 'true' or 'false' strings are
-  now being outputted 'true' and 'false' booleans according to json syntax.
-
-* HEALTH_WARN on 'mon osd down out interval == 0'. Having this option set
-  to zero on the leader acts much like having the 'noout' flag set.  This
-  warning will only be reported if the monitor getting the 'health' or
-  'status' request has this option set to zero.
-
-* Monitor 'auth' commands now require the mon 'x' capability.  This matches
-  dumpling v0.67.x and earlier, but differs from emperor v0.72.x.
-
-* A librados WATCH operation on a non-existent object now returns ENOENT;
-  previously it did not.
-
-* Librados interface change:  As there are no partial writes, the rados_write()
-  and rados_append() operations now return 0 on success like rados_write_full()
-  always has.  This includes the C++ interface equivalents and AIO return
-  values for the aio variants.
-
-* The radosgw init script (sysvinit) how requires that the 'host = ...' line in
-  ceph.conf, if present, match the short hostname (the output of 'hostname -s'),
-  not the fully qualified hostname or the (occasionally non-short) output of
-  'hostname'.  Failure to adjust this when upgrading from emperor or dumpling
-  may prevent the radosgw daemon from starting.
-
-Upgrading from v0.72 Emperor
-----------------------------
-
-* See notes above.
-
-* The 'ceph -s' or 'ceph status' command's 'num_in_osds' field in the
-  JSON and XML output has been changed from a string to an int.
-
-* The recently added 'ceph mds set allow_new_snaps' command's syntax
-  has changed slightly; it is now 'ceph mds set allow_new_snaps true'.
-  The 'unset' command has been removed; instead, set the value to
-  'false'.
-
-* The syntax for allowing snapshots is now 'mds set allow_new_snaps
-  <true|false>' instead of 'mds <set,unset> allow_new_snaps'.
-
-* 'rbd ls' on a pool which never held rbd images now exits with code
-  0. It outputs nothing in plain format, or an empty list in
-  non-plain format. This is consistent with the behavior for a pool
-  which used to hold images, but contains none. Scripts relying on
-  this behavior should be updated.
-
-* The MDS requires a new OSD operation TMAP2OMAP, added in this release.  When
-  upgrading, be sure to upgrade and restart the ceph-osd daemons before the
-  ceph-mds daemon.  The MDS will refuse to start if any up OSDs do not support
-  the new feature.
-
-* The 'ceph mds set_max_mds N' command is now deprecated in favor of
-  'ceph mds set max_mds N'.
-
-* The 'osd pool create ...' syntax has changed for erasure pools.
-
-* The default CRUSH rules and layouts are now using the 'bobtail'
-  tunables and defaults.  Upgaded clusters using the old values will
-  now present with a health WARN state.  This can be disabled by
-  adding 'mon warn on legacy crush tunables = false' to ceph.conf and
-  restarting the monitors.  Alternatively, you can switch to the new
-  tunables with 'ceph osd crush tunables firefly,' but keep in mind
-  that this will involve moving a *significant* portion of the data
-  already stored in the cluster and in a large cluster may take
-  several days to complete.  We do not recommend adjusting tunables on a
-  production cluster.
-
-* We now default to the 'bobtail' CRUSH tunable values that are first supported
-  by Ceph clients in bobtail (v0.56) and Linux kernel version v3.9.  If you
-  plan to access a newly created Ceph cluster with an older kernel client, you
-  should use 'ceph osd crush tunables legacy' to switch back to the legacy
-  behavior.  Note that making that change will likely result in some data
-  movement in the system, so adjust the setting before populating the new
-  cluster with data.
-
-* We now set the HASHPSPOOL flag on newly created pools (and new
-  clusters) by default.  Support for this flag first appeared in
-  v0.64; v0.67 Dumpling is the first major release that supports it.
-  It is first supported by the Linux kernel version v3.9.  If you plan
-  to access a newly created Ceph cluster with an older kernel or
-  clients (e.g, librados, librbd) from a pre-dumpling Ceph release,
-  you should add 'osd pool default flag hashpspool = false' to the
-  '[global]' section of your 'ceph.conf' prior to creating your
-  monitors (e.g., after 'ceph-deploy new' but before 'ceph-deploy mon
-  create ...').
-
-* The configuration option 'osd pool default crush rule' is deprecated
-  and replaced with 'osd pool default crush replicated ruleset'. 'osd
-  pool default crush rule' takes precedence for backward compatibility
-  and a deprecation warning is displayed when it is used.
-
-* As part of fix for #6796, 'ceph osd pool set <pool> <var> <arg>' now
-  receives <arg> as an integer instead of a string.  This affects how
-  'hashpspool' flag is set/unset: instead of 'true' or 'false', it now
-  must be '0' or '1'.
-
-* The behavior of the CRUSH 'indep' choose mode has been changed.  No
-  ceph cluster should have been using this behavior unless someone has
-  manually extracted a crush map, modified a CRUSH rule to replace
-  'firstn' with 'indep', recompiled, and reinjected the new map into
-  the cluster.  If the 'indep' mode is currently in use on a cluster,
-  the rule should be modified to use 'firstn' instead, and the
-  administrator should wait until any data movement completes before
-  upgrading.
-
-* The 'osd dump' command now dumps pool snaps as an array instead of an
-  object.
-
-
-Upgrading from v0.67 Dumpling
------------------------------
-
-* See notes above.
-
-* ceph-fuse and radosgw now use the same default values for the admin
-  socket and log file paths that the other daemons (ceph-osd,
-  ceph-mon, etc.) do.  If you run these daemons as non-root, you may
-  need to adjust your ceph.conf to disable these options or to adjust
-  the permissions on /var/run/ceph and /var/log/ceph.
-
-* The MDS now disallows snapshots by default as they are not
-  considered stable.  The command 'ceph mds set allow_snaps' will
-  enable them.
-
-* For clusters that were created before v0.44 (pre-argonaut, Spring
-  2012) and store radosgw data, the auto-upgrade from TMAP to OMAP
-  objects has been disabled.  Before upgrading, make sure that any
-  buckets created on pre-argonaut releases have been modified (e.g.,
-  by PUTing and then DELETEing an object from each bucket).  Any
-  cluster created with argonaut (v0.48) or a later release or not
-  using radosgw never relied on the automatic conversion and is not
-  affected by this change.
-
-* Any direct users of the 'tmap' portion of the librados API should be
-  aware that the automatic tmap -> omap conversion functionality has
-  been removed.
-
-* Most output that used K or KB (e.g., for kilobyte) now uses a
-  lower-case k to match the official SI convention.  Any scripts that
-  parse output and check for an upper-case K will need to be modified.
-
-* librados::Rados::pool_create_async() and librados::Rados::pool_delete_async()
-  don't drop a reference to the completion object on error, caller needs to take
-  care of that. This has never really worked correctly and we were leaking an
-  object
-
-* 'ceph osd crush set <id> <weight> <loc..>' no longer adds the osd to the
-  specified location, as that's a job for 'ceph osd crush add'.  It will
-  however continue to work just the same as long as the osd already exists
-  in the crush map.
-
-* The OSD now enforces that class write methods cannot both mutate an
-  object and return data.  The rbd.assign_bid method, the lone
-  offender, has been removed.  This breaks compatibility with
-  pre-bobtail librbd clients by preventing them from creating new
-  images.
-
-* librados now returns on commit instead of ack for synchronous calls.
-  This is a bit safer in the case where both OSDs and the client crash, and
-  is probably how it should have been acting from the beginning. Users are
-  unlikely to notice but it could result in lower performance in some
-  circumstances. Those who care should switch to using the async interfaces,
-  which let you specify safety semantics precisely.
-
-* The C++ librados AioComplete::get_version() method was incorrectly
-  returning an int (usually 32-bits).  To avoid breaking library
-  compatibility, a get_version64() method is added that returns the
-  full-width value.  The old method is deprecated and will be removed
-  in a future release.  Users of the C++ librados API that make use of
-  the get_version() method should modify their code to avoid getting a
-  value that is truncated from 64 to to 32 bits.
-
-
-Notable changes since v0.79
----------------------------
-
-* ceph-fuse, libcephfs: fix several caching bugs (Yan, Zheng)
-* ceph-fuse: trim inodes in response to mds memory pressure (Yan, Zheng)
-* librados: fix inconsistencies in API error values (David Zafman)
-* librados: fix watch operations with cache pools (Sage Weil)
-* librados: new snap rollback operation (David Zafman)
-* mds: fix respawn (John Spray)
-* mds: misc bugs (Yan, Zheng)
-* mds: misc multi-mds fixes (Yan, Zheng)
-* mds: use shared_ptr for requests (Greg Farnum)
-* mon: fix peer feature checks (Sage Weil)
-* mon: require 'x' mon caps for auth operations (Joao Luis)
-* mon: shutdown when removed from mon cluster (Joao Luis)
-* msgr: fix locking bug in authentication (Josh Durgin)
-* osd: fix bug in journal replay/restart (Sage Weil)
-* osd: many many many bug fixes with cache tiering (Samuel Just)
-* osd: track omap and hit_set objects in pg stats (Samuel Just)
-* osd: warn if agent cannot enable due to invalid (post-split) stats (Sage Weil)
-* rados bench: track metadata for multiple runs separately (Guang Yang)
-* rgw: fixed subuser modify (Yehuda Sadeh)
-* rpm: fix redhat-lsb dependency (Sage Weil, Alfredo Deza)
-
-
-Notable changes since v0.72 Emperor
------------------------------------
-
-* buffer: some zero-copy groundwork (Josh Durgin)
-* build: misc improvements (Ken Dreyer)
-* ceph-conf: stop creating bogus log files (Josh Durgin, Sage Weil)
-* ceph-crush-location: new hook for setting CRUSH location of osd daemons on start)
-* ceph-disk: avoid fd0 (Loic Dachary)
-* ceph-disk: generalize path names, add tests (Loic Dachary)
-* ceph-disk: misc improvements for puppet (Loic Dachary)
-* ceph-disk: several bug fixes (Loic Dachary)
-* ceph-fuse: fix race for sync reads (Sage Weil)
-* ceph-fuse, libcephfs: fix several caching bugs (Yan, Zheng)
-* ceph-fuse: trim inodes in response to mds memory pressure (Yan, Zheng)
-* ceph-kvstore-tool: expanded command set and capabilities (Joao Eduardo Luis)
-* ceph.spec: fix build dependency (Loic Dachary)
-* common: bloom filter improvements (Sage Weil)
-* common: check preexisting admin socket for active daemon before removing (Loic Dachary)
-* common: fix aligned buffer allocation (Loic Dachary)
-* common: fix authentication on big-endian architectures (Dan Mick)
-* common: fix config variable substitution (Loic Dachary)
-* common: portability changes to support libc++ (Noah Watkins)
-* common: switch to unordered_map from hash_map (Noah Watkins)
-* config: recursive metavariable expansion (Loic Dachary)
-* crush: default to bobtail tunables (Sage Weil)
-* crush: fix off-by-one error in recent refactor (Sage Weil)
-* crush: many additional tests (Loic Dachary)
-* crush: misc fixes, cleanups (Loic Dachary)
-* crush: new rule steps to adjust retry attempts (Sage Weil)
-* crush, osd: s/rep/replicated/ for less confusion (Loic Dachary)
-* crush: refactor descend_once behavior; support set_choose*_tries for replicated rules (Sage Weil)
-* crush: usability and test improvements (Loic Dachary)
-* debian: change directory ownership between ceph and ceph-common (Sage Weil)
-* debian: integrate misc fixes from downstream packaging (James Page)
-* doc: big update to install docs (John Wilkins)
-* doc: many many install doc improvements (John Wilkins)
-* doc: many many updates (John Wilkins)
-* doc: misc fixes (David Moreau Simard, Kun Huang)
-* erasure-code: improve buffer alignment (Loic Dachary)
-* erasure-code: rewrite region-xor using vector operations (Andreas Peters)
-* init: fix startup ordering/timeout problem with OSDs (Dmitry Smirnov)
-* libcephfs: fix resource leak (Zheng Yan)
-* librados: add C API coverage for atomic write operations (Christian Marie)
-* librados: fix inconsistencies in API error values (David Zafman)
-* librados: fix throttle leak (and eventual deadlock) (Josh Durgin)
-* librados: fix watch operations with cache pools (Sage Weil)
-* librados: new snap rollback operation (David Zafman)
-* librados, osd: new TMAP2OMAP operation (Yan, Zheng)
-* librados: read directly into user buffer (Rutger ter Borg)
-* librbd: fix use-after-free aio completion bug #5426 (Josh Durgin)
-* librbd: localize/distribute parent reads (Sage Weil)
-* librbd: skip zeroes/holes when copying sparse images (Josh Durgin)
-* mailmap: affiliation updates (Loic Dachary)
-* mailmap updates (Loic Dachary)
-* many portability improvements (Noah Watkins)
-* many unit test improvements (Loic Dachary)
-* mds: always store backtrace in default pool (Yan, Zheng)
-* mds: cope with MDS failure during creation (John Spray)
-* mds: fix cap migration behavior (Yan, Zheng)
-* mds: fix client session flushing (Yan, Zheng)
-* mds: fix crash from client sleep/resume (Zheng Yan)
-* mds: fix many many multi-mds bugs (Yan, Zheng)
-* mds: fix readdir end check (Zheng Yan)
-* mds: fix Resetter locking (Alexandre Oliva)
-* mds: fix respawn (John Spray)
-* mds: inline data support (Li Wang, Yunchuan Wen)
-* mds: misc bugs (Yan, Zheng)
-* mds: misc fixes for directory fragments (Zheng Yan)
-* mds: misc fixes for larger directories (Zheng Yan)
-* mds: misc fixes for multiple MDSs (Zheng Yan)
-* mds: misc multi-mds fixes (Yan, Zheng)
-* mds: remove .ceph directory (John Spray)
-* mds: store directories in omap instead of tmap (Yan, Zheng)
-* mds: update old-format backtraces opportunistically (Zheng Yan)
-* mds: use shared_ptr for requests (Greg Farnum)
-* misc cleanups from coverity (Xing Lin)
-* misc coverity fixes, cleanups (Danny Al-Gaaf)
-* misc coverity fixes (Xing Lin, Li Wang, Danny Al-Gaaf)
-* misc portability fixes (Noah Watkins, Alan Somers)
-* misc portability fixes (Noah Watkins, Christophe Courtaut, Alan Somers, huanjun)
-* misc portability work (Noah Watkins)
-* mon: add erasure profiles and improve erasure pool creation (Loic Dachary)
-* mon: add 'mon getmap EPOCH' (Joao Eduardo Luis)
-* mon: allow adjustment of cephfs max file size via 'ceph mds set max_file_size' (Sage Weil)
-* mon: allow debug quorum_{enter,exit} commands via admin socket
-* mon: 'ceph osd pg-temp ...' and primary-temp commands (Ilya Dryomov)
-* mon: change mds allow_new_snaps syntax to be more consistent (Sage Weil)
-* mon: clean up initial crush rule creation (Loic Dachary)
-* mon: collect misc metadata about osd (os, kernel, etc.), new 'osd metadata' command (Sage Weil)
-* mon: do not create erasure rules by default (Sage Weil)
-* mon: do not generate spurious MDSMaps in certain cases (Sage Weil)
-* mon: do not use keyring if auth = none (Loic Dachary)
-* mon: fix peer feature checks (Sage Weil)
-* mon: fix pg_temp leaks (Joao Eduardo Luis)
-* mon: fix pool count in 'ceph -s' output (Sage Weil)
-* mon: handle more whitespace (newline, tab) in mon capabilities (Sage Weil)
-* mon: improve (replicate or erasure) pool creation UX (Loic Dachary)
-* mon: infrastructure to handle mixed-version mon cluster and cli/rest API (Greg Farnum)
-* mon: MForward tests (Loic Dachary)
-* mon: mkfs now idempotent (Loic Dachary)
-* mon: only seed new osdmaps to current OSDs (Sage Weil)
-* mon, osd: create erasure style crush rules (Loic Dachary, Sage Weil)
-* mon: 'osd crush show-tunables' (Sage Weil)
-* mon: 'osd dump' dumps pool snaps as array, not object (Dan Mick)
-* mon, osd: new 'erasure' pool type (still not fully supported)
-* mon: persist quorum features to disk (Greg Farnum)
-* mon: prevent extreme changes in pool pg_num (Greg Farnum)
-* mon: require 'x' mon caps for auth operations (Joao Luis)
-* mon: shutdown when removed from mon cluster (Joao Luis)
-* mon: take 'osd pool set ...' value as an int, not string (Joao Eduardo Luis)
-* mon: track osd features in OSDMap (Joao Luis, David Zafman)
-* mon: trim MDSMaps (Joao Eduardo Luis)
-* mon: warn if crush has non-optimal tunables (Sage Weil)
-* mount.ceph: add -n for autofs support (Steve Stock)
-* msgr: fix locking bug in authentication (Josh Durgin)
-* msgr: fix messenger restart race (Xihui He)
-* msgr: improve connection error detection between clients and monitors (Greg Farnum, Sage Weil)
-* osd: add/fix CPU feature detection for jerasure (Loic Dachary)
-* osd: add HitSet tracking for read ops (Sage Weil, Greg Farnum)
-* osd: avoid touching leveldb for some xattrs (Haomai Wang, Sage Weil)
-* osd: backfill to multiple targets (David Zafman)
-* osd: backfill to osds not in acting set (David Zafman)
-* osd: cache pool support for snapshots (Sage Weil)
-* osd: client IO path changes for EC (Samuel Just)
-* osd: default to 3x replication
-* osd: do not include backfill targets in acting set (David Zafman)
-* osd: enable new hashpspool layout by default (Sage Weil)
-* osd: erasure plugin benchmarking tool (Loic Dachary)
-* osd: fix and cleanup misc backfill issues (David Zafman)
-* osd: fix bug in journal replay/restart (Sage Weil)
-* osd: fix copy-get omap bug (Sage Weil)
-* osd: fix linux kernel version detection (Ilya Dryomov)
-* osd: fix memstore segv (Haomai Wang)
-* osd: fix object_info_t encoding bug from emperor (Sam Just)
-* osd: fix omap_clear operation to not zap xattrs (Sam Just, Yan, Zheng)
-* osd: fix several bugs with tier infrastructure
-* osd: fix throttle thread (Haomai Wang)
-* osd: fix XFS detection (Greg Farnum, Sushma Gurram)
-* osd: generalize scrubbing infrastructure to allow EC (David Zafman)
-* osd: handle more whitespace (newline, tab) in osd capabilities (Sage Weil)
-* osd: ignore num_objects_dirty on scrub for old pools (Sage Weil)
-* osd: improved scrub checks on clones (Sage Weil, Sam Just)
-* osd: improve locking in fd lookup cache (Samuel Just, Greg Farnum)
-* osd: include more info in pg query result (Sage Weil)
-* osd, librados: fix full cluster handling (Josh Durgin)
-* osd: many erasure fixes (Sam Just)
-* osd: many many many bug fixes with cache tiering (Samuel Just)
-* osd: move to jerasure2 library (Loic Dachary)
-* osd: new 'chassis' type in default crush hierarchy (Sage Weil)
-* osd: new keyvaluestore-dev backend based on leveldb (Haomai Wang)
-* osd: new OSDMap encoding (Greg Farnum)
-* osd: new tests for erasure pools (David Zafman)
-* osd: preliminary cache pool support (no snaps) (Greg Farnum, Sage Weil)
-* osd: reduce scrub lock contention (Guang Yang)
-* osd: requery unfound on stray notify (#6909) (Samuel Just)
-* osd: some PGBackend infrastructure (Samuel Just)
-* osd: support for new 'memstore' (memory-backed) backend (Sage Weil)
-* osd: track erasure compatibility (David Zafman)
-* osd: track omap and hit_set objects in pg stats (Samuel Just)
-* osd: warn if agent cannot enable due to invalid (post-split) stats (Sage Weil)
-* rados: add 'crush location', smart replica selection/balancing (Sage Weil)
-* rados bench: track metadata for multiple runs separately (Guang Yang)
-* rados: some performance optimizations (Yehuda Sadeh)
-* rados tool: fix listomapvals (Josh Durgin)
-* rbd: add 'rbdmap' init script for mapping rbd images on book (Adam Twardowski)
-* rbd: add rbdmap support for upstart (Laurent Barbe)
-* rbd: expose kernel rbd client options via 'rbd map' (Ilya Dryomov)
-* rbd: fix bench-write command (Hoamai Wang)
-* rbd: make 'rbd list' return empty list and success on empty pool (Josh Durgin)
-* rbd: prevent deletion of images with watchers (Ilya Dryomov)
-* rbd: support for 4096 mapped devices, up from ~250 (Ilya Dryomov)
-* rest-api: do not fail when no OSDs yet exist (Dan Mick)
-* rgw: add 'status' command to sysvinit script (David Moreau Simard)
-* rgw: allow multiple frontends (Yehuda Sadeh)
-* rgw: allow use of an erasure data pool (Yehuda Sadeh)
-* rgw: convert bucket info to new format on demand (Yehuda Sadeh)
-* rgw: fixed subuser modify (Yehuda Sadeh)
-* rgw: fix error setting empty owner on ACLs (Yehuda Sadeh)
-* rgw: fix fastcgi deadlock (do not return data from librados callback) (Yehuda Sadeh)
-* rgw: fix many-part multipart uploads (Yehuda Sadeh)
-* rgw: fix misc CORS bugs (Robin H. Johnson)
-* rgw: fix object placement read op (Yehuda Sadeh)
-* rgw: fix reading bucket policy (#6940)
-* rgw: fix read_user_buckets 'max' behavior (Yehuda Sadeh)
-* rgw: fix several CORS bugs (Robin H. Johnson)
-* rgw: fix use-after-free when releasing completion handle (Yehuda Sadeh)
-* rgw: improve swift temp URL support (Yehuda Sadeh)
-* rgw: make multi-object delete idempotent (Yehuda Sadeh)
-* rgw: optionally defer to bucket ACLs instead of object ACLs (Liam Monahan)
-* rgw: prototype mongoose frontend (Yehuda Sadeh)
-* rgw: several doc fixes (Alexandre Marangone)
-* rgw: support for password (instead of admin token) for keystone authentication (Christophe Courtaut)
-* rgw: switch from mongoose to civetweb (Yehuda Sadeh)
-* rgw: user quotas (Yehuda Sadeh)
-* rpm: fix redhat-lsb dependency (Sage Weil, Alfredo Deza)
-* specfile: fix RPM build on RHEL6 (Ken Dreyer, Derek Yarnell)
-* specfile: ship libdir/ceph (Key Dreyer)
-* sysvinit, upstart: prevent both init systems from starting the same daemons (Josh Durgin)
-
-
-Notable changes since v0.67 Dumpling
-------------------------------------
-
-* build cleanly under clang (Christophe Courtaut)
-* build: Makefile refactor (Roald J. van Loon)
-* build: fix [/usr]/sbin locations (Alan Somers)
-* ceph-disk: fix journal preallocation
-* ceph-fuse, radosgw: enable admin socket and logging by default
-* ceph-fuse: fix problem with readahead vs truncate race (Yan, Zheng)
-* ceph-fuse: trim deleted inodes from cache (Yan, Zheng)
-* ceph-fuse: use newer fuse api (Jianpeng Ma)
-* ceph-kvstore-tool: new tool for working with leveldb (copy, crc) (Joao Luis)
-* ceph-post-file: new command to easily share logs or other files with ceph devs
-* ceph: improve parsing of CEPH_ARGS (Benoit Knecht)
-* ceph: make -h behave when monitors are down
-* ceph: parse CEPH_ARGS env variable
-* common: bloom_filter improvements, cleanups
-* common: cache crc32c values where possible
-* common: correct SI is kB not KB (Dan Mick)
-* common: fix looping on BSD (Alan Somers)
-* common: migrate SharedPtrRegistry to use boost::shared_ptr<> (Loic Dachary)
-* common: misc portability fixes (Noah Watkins)
-* crc32c: fix optimized crc32c code (it now detects arch support properly)
-* crc32c: improved intel-optimized crc32c support (~8x faster on my laptop!)
-* crush: fix name caching
-* doc: erasure coding design notes (Loic Dachary)
-* hadoop: removed old version of shim to avoid confusing users (Noah Watkins)
-* librados, mon: ability to query/ping out-of-quorum monitor status (Joao Luis)
-* librados: fix async aio completion wakeup
-* librados: fix installed header #includes (Dan Mick)
-* librados: get_version64() method for C++ API
-* librados: hello_world example (Greg Farnum)
-* librados: sync calls now return on commit (instead of ack) (Greg Farnum)
-* librbd python bindings: fix parent image name limit (Josh Durgin)
-* librbd, ceph-fuse: avoid some sources of ceph-fuse, rbd cache stalls
-* mds: avoid leaking objects when deleting truncated files (Yan, Zheng)
-* mds: fix F_GETLK (Yan, Zheng)
-* mds: fix LOOKUPSNAP bug
-* mds: fix heap profiler commands (Joao Luis)
-* mds: fix locking deadlock (David Disseldorp)
-* mds: fix many bugs with stray (unlinked) inodes (Yan, Zheng)
-* mds: fix many directory fragmentation bugs (Yan, Zheng)
-* mds: fix mds rejoin with legacy parent backpointer xattrs (Alexandre Oliva)
-* mds: fix rare restart/failure race during fs creation
-* mds: fix standby-replay when we fall behind (Yan, Zheng)
-* mds: fix stray directory purging (Yan, Zheng)
-* mds: notify clients about deleted files (so they can release from their cache) (Yan, Zheng)
-* mds: several bug fixes with clustered mds (Yan, Zheng)
-* mon, osd: improve osdmap trimming logic (Samuel Just)
-* mon, osd: initial CLI for configuring tiering
-* mon: a few 'ceph mon add' races fixed (command is now idempotent) (Joao Luis)
-* mon: allow (un)setting HASHPSPOOL flag on existing pools (Joao Luis)
-* mon: allow cap strings with . to be unquoted
-* mon: allow logging level of cluster log (/var/log/ceph/ceph.log) to be adjusted
-* mon: avoid rewriting full osdmaps on restart (Joao Luis)
-* mon: continue to discover peer addr info during election phase
-* mon: disallow CephFS snapshots until 'ceph mds set allow_new_snaps' (Greg Farnum)
-* mon: do not expose uncommitted state from 'osd crush {add,set} ...' (Joao Luis)
-* mon: fix 'ceph osd crush reweight ...' (Joao Luis)
-* mon: fix 'osd crush move ...' command for buckets (Joao Luis)
-* mon: fix byte counts (off by factor of 4) (Dan Mick, Joao Luis)
-* mon: fix paxos corner case
-* mon: kv properties for pools to support EC (Loic Dachary)
-* mon: make 'osd pool rename' idempotent (Joao Luis)
-* mon: modify 'auth add' semantics to make a bit more sense (Joao Luis)
-* mon: new 'osd perf' command to dump recent performance information (Samuel Just)
-* mon: new and improved 'ceph -s' or 'ceph status' command (more info, easier to read)
-* mon: some auth check cleanups (Joao Luis)
-* mon: track per-pool stats (Joao Luis)
-* mon: warn about pools with bad pg_num
-* mon: warn when mon data stores grow very large (Joao Luis)
-* monc: fix small memory leak
-* new wireshark patches pulled into the tree (Kevin Jones)
-* objecter, librados: redirect requests based on cache tier config
-* objecter: fix possible hang when cluster is unpaused (Josh Durgin)
-* osd, librados: add new COPY_FROM rados operation
-* osd, librados: add new COPY_GET rados operations (used by COPY_FROM)
-* osd: 'osd recover clone overlap limit' option to limit cloning during recovery (Samuel Just)
-* osd: COPY_GET on-wire encoding improvements (Greg Farnum)
-* osd: add 'osd heartbeat min healthy ratio' configurable (was hard-coded at 33%)
-* osd: add option to disable pg log debug code (which burns CPU)
-* osd: allow cap strings with . to be unquoted
-* osd: automatically detect proper xattr limits (David Zafman)
-* osd: avoid extra copy in erasure coding reference implementation (Loic Dachary)
-* osd: basic cache pool redirects (Greg Farnum)
-* osd: basic whiteout, dirty flag support (not yet used)
-* osd: bloom_filter encodability, fixes, cleanups (Loic Dachary, Sage Weil)
-* osd: clean up and generalize copy-from code (Greg Farnum)
-* osd: cls_hello OSD class example
-* osd: erasure coding doc updates (Loic Dachary)
-* osd: erasure coding plugin infrastructure, tests (Loic Dachary)
-* osd: experiemental support for ZFS (zfsonlinux.org) (Yan, Zheng)
-* osd: fix RWORDER flags
-* osd: fix exponential backoff of slow request warnings (Loic Dachary)
-* osd: fix handling of racing read vs write (Samuel Just)
-* osd: fix version value returned by various operations (Greg Farnum)
-* osd: generalized temp object infrastructure
-* osd: ghobject_t infrastructure for EC (David Zafman)
-* osd: improvements for compatset support and storage (David Zafman)
-* osd: infrastructure to copy objects from other OSDs
-* osd: instrument peering states (David Zafman)
-* osd: misc copy-from improvements
-* osd: opportunistic crc checking on stored data (off by default)
-* osd: properly enforce RD/WR flags for rados classes
-* osd: reduce blocking on backing fs (Samuel Just)
-* osd: refactor recovery using PGBackend (Samuel Just)
-* osd: remove old magical tmap->omap conversion
-* osd: remove old pg log on upgrade (Samuel Just)
-* osd: revert xattr size limit (fixes large rgw uploads)
-* osd: use fdatasync(2) instead of fsync(2) to improve performance (Sam Just)
-* pybind: fix blacklisting nonce (Loic Dachary)
-* radosgw-agent: multi-region replication/DR
-* rgw: complete in-progress requests before shutting down
-* rgw: default log level is now more reasonable (Yehuda Sadeh)
-* rgw: fix S3 auth with response-* query string params (Sylvain Munaut, Yehuda Sadeh)
-* rgw: fix a few minor memory leaks (Yehuda Sadeh)
-* rgw: fix acl group check (Yehuda Sadeh)
-* rgw: fix inefficient use of std::list::size() (Yehuda Sadeh)
-* rgw: fix major CPU utilization bug with internal caching (Yehuda Sadeh, Mark Nelson)
-* rgw: fix ordering of write operations (preventing data loss on crash) (Yehuda Sadeh)
-* rgw: fix ordering of writes for mulitpart upload (Yehuda Sadeh)
-* rgw: fix various CORS bugs (Yehuda Sadeh)
-* rgw: fix/improve swift COPY support (Yehuda Sadeh)
-* rgw: improve help output (Christophe Courtaut)
-* rgw: misc fixes to support DR (Josh Durgin, Yehuda Sadeh)
-* rgw: per-bucket quota (Yehuda Sadeh)
-* rgw: validate S3 tokens against keystone (Roald J. van Loon)
-* rgw: wildcard support for keystone roles (Christophe Courtaut)
-* rpm: fix junit dependencies (Alan Grosskurth)
-* sysvinit radosgw: fix status return code (Danny Al-Gaaf)
-* sysvinit rbdmap: fix error 'service rbdmap stop' (Laurent Barbe)
-* sysvinit: add condrestart command (Dan van der Ster)
-* sysvinit: fix shutdown order (mons last) (Alfredo Deza)
-
-
-v0.79
-=====
-
-This release is intended to serve as a release candidate for firefly,
-which will hopefully be v0.80.  No changes are being made to the code
-base at this point except those that fix bugs.  Please test this
-release if you intend to make use of the new erasure-coded pools or
-cache tiers in firefly.
-
-This release fixes a range of bugs found in v0.78 and streamlines the
-user experience when creating erasure-coded pools.  There is also a
-raft of fixes for the MDS (multi-mds, directory fragmentation, and
-large directories).  The main notable new piece of functionality is a
-small change to allow radosgw to use an erasure-coded pool for object
-data.
-
-
-Upgrading
----------
-* Erasure pools created with v0.78 will no longer function with v0.79.  You
-  will need to delete the old pool and create a new one.
-
-* A bug was fixed in the authentication handshake with big-endian
-  architectures that prevent authentication between big- and
-  little-endian machines in the same cluster.  If you have a cluster
-  that consists entirely of big-endian machines, you will need to
-  upgrade all daemons and clients and restart.
-
-* The 'ceph.file.layout' and 'ceph.dir.layout' extended attributes are
-  no longer included in the listxattr(2) results to prevent problems with
-  'cp -a' and similar tools.
-
-* Monitor 'auth' read-only commands now expect the user to have 'rx' caps.
-  This is the same behavior that was present in dumpling, but in emperor
-  and more recent development releases the 'r' cap was sufficient.  The
-  affected commands are::
-
-    ceph auth export
-    ceph auth get
-    ceph auth get-key
-    ceph auth print-key
-    ceph auth list
-
-Notable Changes
----------------
-* ceph-conf: stop creating bogus log files (Josh Durgin, Sage Weil)
-* common: fix authentication on big-endian architectures (Dan Mick)
-* debian: change directory ownership between ceph and ceph-common (Sage Weil)
-* init: fix startup ordering/timeout problem with OSDs (Dmitry Smirnov)
-* librbd: skip zeroes/holes when copying sparse images (Josh Durgin)
-* mds: cope with MDS failure during creation (John Spray)
-* mds: fix crash from client sleep/resume (Zheng Yan)
-* mds: misc fixes for directory fragments (Zheng Yan)
-* mds: misc fixes for larger directories (Zheng Yan)
-* mds: misc fixes for multiple MDSs (Zheng Yan)
-* mds: remove .ceph directory (John Spray)
-* misc coverity fixes, cleanups (Danny Al-Gaaf)
-* mon: add erasure profiles and improve erasure pool creation (Loic Dachary)
-* mon: 'ceph osd pg-temp ...' and primary-temp commands (Ilya Dryomov)
-* mon: fix pool count in 'ceph -s' output (Sage Weil)
-* msgr: improve connection error detection between clients and monitors (Greg Farnum, Sage Weil)
-* osd: add/fix CPU feature detection for jerasure (Loic Dachary)
-* osd: improved scrub checks on clones (Sage Weil, Sam Just)
-* osd: many erasure fixes (Sam Just)
-* osd: move to jerasure2 library (Loic Dachary)
-* osd: new tests for erasure pools (David Zafman)
-* osd: reduce scrub lock contention (Guang Yang)
-* rgw: allow use of an erasure data pool (Yehuda Sadeh)
-
-
-v0.78
-=====
-
-This development release includes two key features: erasure coding and
-cache tiering.  A huge amount of code was merged for this release and
-several additional weeks were spent stabilizing the code base, and it
-is now in a state where it is ready to be tested by a broader user
-base.
-
-This is *not* the firefly release.  Firefly will be delayed for at
-least another sprint so that we can get some operational experience
-with the new code and do some additional testing before committing to
-long term support.
-
-.. note:: Please note that while it is possible to create and test
-          erasure coded pools in this release, the pools will not be
-          usable when you upgrade to v0.79 as the OSDMap encoding will
-          subtlely change.  Please do not populate your test pools
-          with important data that can't be reloaded.
-
-Upgrading
----------
-
-* Upgrade daemons in the following order:
-
-    #. Monitors
-    #. OSDs
-    #. MDSs and/or radosgw
-
-  If the ceph-mds daemon is restarted first, it will wait until all
-  OSDs have been upgraded before finishing its startup sequence.  If
-  the ceph-mon daemons are not restarted prior to the ceph-osd
-  daemons, they will not correctly register their new capabilities
-  with the cluster and new features may not be usable until they are
-  restarted a second time.
-
-* Upgrade radosgw daemons together.  There is a subtle change in behavior
-  for multipart uploads that prevents a multipart request that was initiated
-  with a new radosgw from being completed by an old radosgw.
-
-* CephFS recently added support for a new 'backtrace' attribute on
-  file data objects that is used for lookup by inode number (i.e., NFS
-  reexport and hard links), and will later be used by fsck repair.
-  This replaces the existing anchor table mechanism that is used for
-  hard link resolution.  In order to completely phase that out, any
-  inode that has an outdated backtrace attribute will get updated when
-  the inode itself is modified.  This will result in some extra workload
-  after a legacy CephFS file system is upgraded.
-
-* The per-op return code in librados' ObjectWriteOperation interface
-  is now filled in.
-
-* The librados cmpxattr operation now handles xattrs containing null bytes as
-  data rather than null-terminated strings.
-
-* Compound operations in librados that create and then delete the same object
-  are now explicitly disallowed (they fail with -EINVAL).
-
-* The default leveldb cache size for the ceph-osd daemon has been
-  increased from 4 MB to 128 MB.  This will increase the memory
-  footprint of that process but tends to increase performance of omap
-  (key/value) objects (used for CephFS and the radosgw).  If memory in your
-  deployment is tight, you can preserve the old behavio by adding::
-
-    leveldb write buffer size = 0
-    leveldb cache size = 0
-
-  to your ceph.conf to get back the (leveldb) defaults.
-
-Notable Changes
----------------
-* ceph-brag: new client and server tools (Sebastien Han, Babu Shanmugam)
-* ceph-disk: use partx on RHEL or CentOS instead of partprobe (Alfredo Deza)
-* ceph: fix combination of 'tell' and interactive mode (Joao Eduardo Luis)
-* ceph-fuse: fix bugs with inline data and multiple MDSs (Zheng Yan)
-* client: fix getcwd() to use new LOOKUPPARENT operation (Zheng Yan)
-* common: fall back to json-pretty for admin socket (Loic Dachary)
-* common: fix 'config dump' debug prefix (Danny Al-Gaaf)
-* common: misc coverity fixes (Danny Al-Gaaf)
-* common: throtller, shared_cache performance improvements, TrackedOp (Greg Farnum, Samuel Just)
-* crush: fix JSON schema for dump (John Spray)
-* crush: misc cleanups, tests (Loic Dachary)
-* crush: new vary_r tunable (Sage Weil)
-* crush: prevent invalid buckets of type 0 (Sage Weil)
-* keyvaluestore: add perfcounters, misc bug fixes (Haomai Wang)
-* keyvaluestore: portability improvements (Noah Watkins)
-* libcephfs: API changes to better support NFS reexport via Ganesha (Matt Benjamin, Adam Emerson, Andrey Kuznetsov, Casey Bodley, David Zafman)
-* librados: API documentation improvements (John Wilkins, Josh Durgin)
-* librados: fix object enumeration bugs; allow iterator assignment (Josh Durgin)
-* librados: streamline tests (Josh Durgin)
-* librados: support for atomic read and omap operations for C API (Josh Durgin)
-* librados: support for osd and mon command timeouts (Josh Durgin)
-* librbd: pass allocation hints to OSD (Ilya Dryomov)
-* logrotate: fix bug that prevented rotation for some daemons (Loic Dachary)
-* mds: avoid duplicated discovers during recovery (Zheng Yan)
-* mds: fix file lock owner checks (Zheng Yan)
-* mds: fix LOOKUPPARENT, new LOOKUPNAME ops for reliable NFS reexport (Zheng Yan)
-* mds: fix xattr handling on setxattr (Zheng Yan)
-* mds: fix xattrs in getattr replies (Sage Weil)
-* mds: force backtrace updates for old inodes on update (Zheng Yan)
-* mds: several multi-mds and dirfrag bug fixes (Zheng Yan)
-* mon: encode erasure stripe width in pool metadata (Loic Dachary)
-* mon: erasure code crush rule creation (Loic Dachary)
-* mon: erasure code plugin support (Loic Dachary)
-* mon: fix bugs in initial post-mkfs quorum creation (Sage Weil)
-* mon: fix error output to terminal during startup (Joao Eduardo Luis)
-* mon: fix legacy CRUSH tunables warning (Sage Weil)
-* mon: fix osd_epochs lower bound tracking for map trimming (Sage Weil)
-* mon: fix OSDMap encoding features (Sage Weil, Aaron Ten Clay)
-* mon: fix 'pg dump' JSON output (John Spray)
-* mon: include dirty stats in 'ceph df detail' (Sage Weil)
-* mon: list quorum member names in quorum order (Sage Weil)
-* mon: prevent addition of non-empty cache tier (Sage Weil)
-* mon: prevent deletion of CephFS pools (John Spray)
-* mon: warn when cache tier approaches 'full' (Sage Weil)
-* osd: allocation hint, with XFS support (Ilya Dryomov)
-* osd: erasure coded pool support (Samuel Just)
-* osd: fix bug causing slow/stalled recovery (#7706) (Samuel Just)
-* osd: fix bugs in log merging (Samuel Just)
-* osd: fix/clarify end-of-object handling on read (Loic Dachary)
-* osd: fix impolite mon session backoff, reconnect behavior (Greg Farnum)
-* osd: fix SnapContext cache id bug (Samuel Just)
-* osd: increase default leveldb cache size and write buffer (Sage Weil, Dmitry Smirnov)
-* osd: limit size of 'osd bench ...' arguments (Joao Eduardo Luis)
-* osdmaptool: new --test-map-pgs mode (Sage Weil, Ilya Dryomov)
-* osd, mon: add primary-affinity to adjust selection of primaries (Sage Weil)
-* osd: new 'status' admin socket command (Sage Weil)
-* osd: simple tiering agent (Sage Weil)
-* osd: store checksums for erasure coded object stripes (Samuel Just)
-* osd: tests for objectstore backends (Haomai Wang)
-* osd: various refactoring and bug fixes (Samuel Just, David Zafman)
-* rados: add 'set-alloc-hint' command (Ilya Dryomov)
-* rbd-fuse: fix enumerate_images overflow, memory leak (Ilya Dryomov)
-* rbdmap: fix upstart script (Stephan Renatus)
-* rgw: avoid logging system events to usage log (Yehuda Sadeh)
-* rgw: fix Swift range reponse (Yehuda Sadeh)
-* rgw: improve scalability for manifest objects (Yehuda Sadeh)
-* rgw: misc fixes for multipart objects, policies (Yehuda Sadeh)
-* rgw: support non-standard MultipartUpload command (Yehuda Sadeh)
-
-
-
-v0.77
-=====
-
-This is the final development release before the Firefly feature
-freeze.  The main items in this release include some additional
-refactoring work in the OSD IO path (include some locking
-improvements), per-user quotas for the radosgw, a switch to civetweb
-from mongoose for the prototype radosgw standalone mode, and a
-prototype leveldb-based backend for the OSD.  The C librados API also
-got support for atomic write operations (read side transactions will
-appear in v0.78).
-
-Upgrading
----------
-
-* The 'ceph -s' or 'ceph status' command's 'num_in_osds' field in the
-  JSON and XML output has been changed from a string to an int.
-
-* The recently added 'ceph mds set allow_new_snaps' command's syntax
-  has changed slightly; it is now 'ceph mds set allow_new_snaps true'.
-  The 'unset' command has been removed; instead, set the value to
-  'false'.
-
-* The syntax for allowing snapshots is now 'mds set allow_new_snaps
-  <true|false>' instead of 'mds <set,unset> allow_new_snaps'.
-
-Notable Changes
----------------
-
-* osd: client IO path changes for EC (Samuel Just)
-* common: portability changes to support libc++ (Noah Watkins)
-* common: switch to unordered_map from hash_map (Noah Watkins)
-* rgw: switch from mongoose to civetweb (Yehuda Sadeh)
-* osd: improve locking in fd lookup cache (Samuel Just, Greg Farnum)
-* doc: many many updates (John Wilkins)
-* rgw: user quotas (Yehuda Sadeh)
-* mon: persist quorum features to disk (Greg Farnum)
-* mon: MForward tests (Loic Dachary)
-* mds: inline data support (Li Wang, Yunchuan Wen)
-* rgw: fix many-part multipart uploads (Yehuda Sadeh)
-* osd: new keyvaluestore-dev backend based on leveldb (Haomai Wang)
-* rbd: prevent deletion of images with watchers (Ilya Dryomov)
-* osd: avoid touching leveldb for some xattrs (Haomai Wang, Sage Weil)
-* mailmap: affiliation updates (Loic Dachary)
-* osd: new OSDMap encoding (Greg Farnum)
-* osd: generalize scrubbing infrastructure to allow EC (David Zafman)
-* rgw: several doc fixes (Alexandre Marangone)
-* librados: add C API coverage for atomic write operations (Christian Marie)
-* rgw: improve swift temp URL support (Yehuda Sadeh)
-* rest-api: do not fail when no OSDs yet exist (Dan Mick)
-* common: check preexisting admin socket for active daemon before removing (Loic Dachary)
-* osd: handle more whitespace (newline, tab) in osd capabilities (Sage Weil)
-* mon: handle more whitespace (newline, tab) in mon capabilities (Sage Weil)
-* rgw: make multi-object delete idempotent (Yehuda Sadeh)
-* crush: fix off-by-one error in recent refactor (Sage Weil)
-* rgw: fix read_user_buckets 'max' behavior (Yehuda Sadeh)
-* mon: change mds allow_new_snaps syntax to be more consistent (Sage Weil)
-
-
-v0.76
-=====
-
-This release includes another batch of updates for firefly
-functionality.  Most notably, the cache pool infrastructure now
-support snapshots, the OSD backfill functionality has been generalized
-to include multiple targets (necessary for the coming erasure pools),
-and there were performance improvements to the erasure code plugin on
-capable processors.  The MDS now properly utilizes (and seamlessly
-migrates to) the OSD key/value interface (aka omap) for storing directory
-objects.  There continue to be many other fixes and improvements for
-usability and code portability across the tree.
-
-Upgrading
----------
-
-* 'rbd ls' on a pool which never held rbd images now exits with code
-  0. It outputs nothing in plain format, or an empty list in
-  non-plain format. This is consistent with the behavior for a pool
-  which used to hold images, but contains none. Scripts relying on
-  this behavior should be updated.
-
-* The MDS requires a new OSD operation TMAP2OMAP, added in this release.  When
-  upgrading, be sure to upgrade and restart the ceph-osd daemons before the
-  ceph-mds daemon.  The MDS will refuse to start if any up OSDs do not support
-  the new feature.
-
-* The 'ceph mds set_max_mds N' command is now deprecated in favor of
-  'ceph mds set max_mds N'.
-
-Notable Changes
----------------
-
-* build: misc improvements (Ken Dreyer)
-* ceph-disk: generalize path names, add tests (Loic Dachary)
-* ceph-disk: misc improvements for puppet (Loic Dachary)
-* ceph-disk: several bug fixes (Loic Dachary)
-* ceph-fuse: fix race for sync reads (Sage Weil)
-* config: recursive metavariable expansion (Loic Dachary)
-* crush: usability and test improvements (Loic Dachary)
-* doc: misc fixes (David Moreau Simard, Kun Huang)
-* erasure-code: improve buffer alignment (Loic Dachary)
-* erasure-code: rewrite region-xor using vector operations (Andreas Peters)
-* librados, osd: new TMAP2OMAP operation (Yan, Zheng)
-* mailmap updates (Loic Dachary)
-* many portability improvements (Noah Watkins)
-* many unit test improvements (Loic Dachary)
-* mds: always store backtrace in default pool (Yan, Zheng)
-* mds: store directories in omap instead of tmap (Yan, Zheng)
-* mon: allow adjustment of cephfs max file size via 'ceph mds set max_file_size' (Sage Weil)
-* mon: do not create erasure rules by default (Sage Weil)
-* mon: do not generate spurious MDSMaps in certain cases (Sage Weil)
-* mon: do not use keyring if auth = none (Loic Dachary)
-* mon: fix pg_temp leaks (Joao Eduardo Luis)
-* osd: backfill to multiple targets (David Zafman)
-* osd: cache pool support for snapshots (Sage Weil)
-* osd: fix and cleanup misc backfill issues (David Zafman)
-* osd: fix omap_clear operation to not zap xattrs (Sam Just, Yan, Zheng)
-* osd: ignore num_objects_dirty on scrub for old pools (Sage Weil)
-* osd: include more info in pg query result (Sage Weil)
-* osd: track erasure compatibility (David Zafman)
-* rbd: make 'rbd list' return empty list and success on empty pool (Josh Durgin)
-* rgw: fix object placement read op (Yehuda Sadeh)
-* rgw: fix several CORS bugs (Robin H. Johnson)
-* specfile: fix RPM build on RHEL6 (Ken Dreyer, Derek Yarnell)
-* specfile: ship libdir/ceph (Key Dreyer)
-
-
-v0.75
-=====
-
-This is a big release, with lots of infrastructure going in for
-firefly.  The big items include a prototype standalone frontend for
-radosgw (which does not require apache or fastcgi), tracking for read
-activity on the osds (to inform tiering decisions), preliminary cache
-pool support (no snapshots yet), and lots of bug fixes and other work
-across the tree to get ready for the next batch of erasure coding
-patches.
-
-For comparison, here are the diff stats for the last few versions::
-
- v0.75 291 files changed, 82713 insertions(+), 33495 deletions(-)
- v0.74 192 files changed, 17980 insertions(+), 1062 deletions(-)
- v0.73 148 files changed, 4464 insertions(+), 2129 deletions(-)
-
-Upgrading
----------
-
-- The 'osd pool create ...' syntax has changed for erasure pools.
-
-- The default CRUSH rules and layouts are now using the latest and
-  greatest tunables and defaults.  Clusters using the old values will
-  now present with a health WARN state.  This can be disabled by
-  adding 'mon warn on legacy crush tunables = false' to ceph.conf.
-
-
-Notable Changes
----------------
-
-* common: bloom filter improvements (Sage Weil)
-* common: fix config variable substitution (Loic Dachary)
-* crush, osd: s/rep/replicated/ for less confusion (Loic Dachary)
-* crush: refactor descend_once behavior; support set_choose*_tries for replicated rules (Sage Weil)
-* librados: fix throttle leak (and eventual deadlock) (Josh Durgin)
-* librados: read directly into user buffer (Rutger ter Borg)
-* librbd: fix use-after-free aio completion bug #5426 (Josh Durgin)
-* librbd: localize/distribute parent reads (Sage Weil)
-* mds: fix Resetter locking (Alexandre Oliva)
-* mds: fix cap migration behavior (Yan, Zheng)
-* mds: fix client session flushing (Yan, Zheng)
-* mds: fix many many multi-mds bugs (Yan, Zheng)
-* misc portability work (Noah Watkins)
-* mon, osd: create erasure style crush rules (Loic Dachary, Sage Weil)
-* mon: 'osd crush show-tunables' (Sage Weil)
-* mon: clean up initial crush rule creation (Loic Dachary)
-* mon: improve (replicate or erasure) pool creation UX (Loic Dachary)
-* mon: infrastructure to handle mixed-version mon cluster and cli/rest API (Greg Farnum)
-* mon: mkfs now idempotent (Loic Dachary)
-* mon: only seed new osdmaps to current OSDs (Sage Weil)
-* mon: track osd features in OSDMap (Joao Luis, David Zafman)
-* mon: warn if crush has non-optimal tunables (Sage Weil)
-* mount.ceph: add -n for autofs support (Steve Stock)
-* msgr: fix messenger restart race (Xihui He)
-* osd, librados: fix full cluster handling (Josh Durgin)
-* osd: add HitSet tracking for read ops (Sage Weil, Greg Farnum)
-* osd: backfill to osds not in acting set (David Zafman)
-* osd: enable new hashpspool layout by default (Sage Weil)
-* osd: erasure plugin benchmarking tool (Loic Dachary)
-* osd: fix XFS detection (Greg Farnum, Sushma Gurram)
-* osd: fix copy-get omap bug (Sage Weil)
-* osd: fix linux kernel version detection (Ilya Dryomov)
-* osd: fix memstore segv (Haomai Wang)
-* osd: fix several bugs with tier infrastructure
-* osd: fix throttle thread (Haomai Wang)
-* osd: preliminary cache pool support (no snaps) (Greg Farnum, Sage Weil)
-* rados tool: fix listomapvals (Josh Durgin)
-* rados: add 'crush location', smart replica selection/balancing (Sage Weil)
-* rados: some performance optimizations (Yehuda Sadeh)
-* rbd: add rbdmap support for upstart (Laurent Barbe)
-* rbd: expose kernel rbd client options via 'rbd map' (Ilya Dryomov)
-* rbd: fix bench-write command (Hoamai Wang)
-* rbd: support for 4096 mapped devices, up from ~250 (Ilya Dryomov)
-* rgw: allow multiple frontends (Yehuda Sadeh)
-* rgw: convert bucket info to new format on demand (Yehuda Sadeh)
-* rgw: fix misc CORS bugs (Robin H. Johnson)
-* rgw: prototype mongoose frontend (Yehuda Sadeh)
-
-
-
-v0.74
-=====
-
-This release includes a few substantial pieces for Firefly, including
-a long-overdue switch to 3x replication by default and a switch to the
-"new" CRUSH tunables by default (supported since bobtail).  There is
-also a fix for a long-standing radosgw bug (stalled GET) that has
-already been backported to emperor and dumpling.
-
-Upgrading
----------
-
-* We now default to the 'bobtail' CRUSH tunable values that are first supported
-  by Ceph clients in bobtail (v0.56) and Linux kernel version v3.9.  If you
-  plan to access a newly created Ceph cluster with an older kernel client, you
-  should use 'ceph osd crush tunables legacy' to switch back to the legacy
-  behavior.  Note that making that change will likely result in some data
-  movement in the system, so adjust the setting before populating the new
-  cluster with data.
-
-* We now set the HASHPSPOOL flag on newly created pools (and new
-  clusters) by default.  Support for this flag first appeared in
-  v0.64; v0.67 Dumpling is the first major release that supports it.
-  It is first supported by the Linux kernel version v3.9.  If you plan
-  to access a newly created Ceph cluster with an older kernel or
-  clients (e.g, librados, librbd) from a pre-dumpling Ceph release,
-  you should add 'osd pool default flag hashpspool = false' to the
-  '[global]' section of your 'ceph.conf' prior to creating your
-  monitors (e.g., after 'ceph-deploy new' but before 'ceph-deploy mon
-  create ...').
-
-* The configuration option 'osd pool default crush rule' is deprecated
-  and replaced with 'osd pool default crush replicated ruleset'. 'osd
-  pool default crush rule' takes precedence for backward compatibility
-  and a deprecation warning is displayed when it is used.
-
-Notable Changes
----------------
-
-* buffer: some zero-copy groundwork (Josh Durgin)
-* ceph-disk: avoid fd0 (Loic Dachary)
-* crush: default to bobtail tunables (Sage Weil)
-* crush: many additional tests (Loic Dachary)
-* crush: misc fixes, cleanups (Loic Dachary)
-* crush: new rule steps to adjust retry attempts (Sage Weil)
-* debian: integrate misc fixes from downstream packaging (James Page)
-* doc: big update to install docs (John Wilkins)
-* libcephfs: fix resource leak (Zheng Yan)
-* misc coverity fixes (Xing Lin, Li Wang, Danny Al-Gaaf)
-* misc portability fixes (Noah Watkins, Alan Somers)
-* mon, osd: new 'erasure' pool type (still not fully supported)
-* mon: add 'mon getmap EPOCH' (Joao Eduardo Luis)
-* mon: collect misc metadata about osd (os, kernel, etc.), new 'osd metadata' command (Sage Weil)
-* osd: default to 3x replication
-* osd: do not include backfill targets in acting set (David Zafman)
-* osd: new 'chassis' type in default crush hierarchy (Sage Weil)
-* osd: requery unfound on stray notify (#6909) (Samuel Just)
-* osd: some PGBackend infrastructure (Samuel Just)
-* osd: support for new 'memstore' (memory-backed) backend (Sage Weil)
-* rgw: fix fastcgi deadlock (do not return data from librados callback) (Yehuda Sadeh)
-* rgw: fix reading bucket policy (#6940)
-* rgw: fix use-after-free when releasing completion handle (Yehuda Sadeh)
-
-
-v0.73
-=====
-
-This release, the first development release after emperor, includes
-many bug fixes and a few additional pieces of functionality.  The
-first batch of larger changes will be landing in the next version,
-v0.74.
-
-Upgrading
----------
-
-- As part of fix for #6796, 'ceph osd pool set <pool> <var> <arg>' now
-  receives <arg> as an integer instead of a string.  This affects how
-  'hashpspool' flag is set/unset: instead of 'true' or 'false', it now
-  must be '0' or '1'.
-
-- The behavior of the CRUSH 'indep' choose mode has been changed.  No
-  ceph cluster should have been using this behavior unless someone has
-  manually extracted a crush map, modified a CRUSH rule to replace
-  'firstn' with 'indep', recompiled, and reinjected the new map into
-  the cluster.  If the 'indep' mode is currently in use on a cluster,
-  the rule should be modified to use 'firstn' instead, and the
-  administrator should wait until any data movement completes before
-  upgrading.
-
-- The 'osd dump' command now dumps pool snaps as an array instead of an
-  object.
-
-- The radosgw init script (sysvinit) how requires that the 'host = ...' line in
-  ceph.conf, if present, match the short hostname (the output of 'hostname -s'),
-  not the fully qualified hostname or the (occasionally non-short) output of
-  'hostname'.  Failure to adjust this when upgrading from emperor or dumpling
-  may prevent the radosgw daemon from starting.
-
-
-Notable Changes
----------------
-
-* ceph-crush-location: new hook for setting CRUSH location of osd daemons on start
-* ceph-kvstore-tool: expanded command set and capabilities (Joao Eduardo Luis)
-* ceph.spec: fix build dependency (Loic Dachary)
-* common: fix aligned buffer allocation (Loic Dachary)
-* doc: many many install doc improvements (John Wilkins)
-* mds: fix readdir end check (Zheng Yan)
-* mds: update old-format backtraces opportunistically (Zheng Yan)
-* misc cleanups from coverity (Xing Lin)
-* misc portability fixes (Noah Watkins, Christophe Courtaut, Alan Somers, huanjun)
-* mon: 'osd dump' dumps pool snaps as array, not object (Dan Mick)
-* mon: allow debug quorum_{enter,exit} commands via admin socket
-* mon: prevent extreme changes in pool pg_num (Greg Farnum)
-* mon: take 'osd pool set ...' value as an int, not string (Joao Eduardo Luis)
-* mon: trim MDSMaps (Joao Eduardo Luis)
-* osd: fix object_info_t encoding bug from emperor (Sam Just)
-* rbd: add 'rbdmap' init script for mapping rbd images on book (Adam Twardowski)
-* rgw: add 'status' command to sysvinit script (David Moreau Simard)
-* rgw: fix error setting empty owner on ACLs (Yehuda Sadeh)
-* rgw: optionally defer to bucket ACLs instead of object ACLs (Liam Monahan)
-* rgw: support for password (instead of admin token) for keystone authentication (Christophe Courtaut)
-* sysvinit, upstart: prevent both init systems from starting the same daemons (Josh Durgin)
diff --git a/ceph/doc/releases/general.rst b/ceph/doc/releases/general.rst
deleted file mode 100644 (file)
index b7fdbb3..0000000
+++ /dev/null
@@ -1,78 +0,0 @@
-.. _ceph-releases-general:
-
-=======================
-Ceph Releases (general)
-=======================
-
-.. toctree::
-    :maxdepth: 1
-
-Understanding the release cycle
--------------------------------
-
-Starting with the Nautilus release (14.2.0), there is a new stable release cycle
-every year, targeting the month of March. Each stable release series will receive a name
-(e.g., 'Mimic') and a major release number (e.g., 13 for Mimic because 'M' is
-the 13th letter of the alphabet).
-
-Releases are named after a species of cephalopod (usually the common
-name, since the latin names are harder to remember or pronounce).
-
-Version numbers have three components, *x.y.z*.  *x* identifies the release
-cycle (e.g., 13 for Mimic).  *y* identifies the release type:
-
-* x.0.z - development versions
-* x.1.z - release candidates (for test clusters, brave users)
-* x.2.z - stable/bugfix releases (for users)
-
-Release candidates (x.1.z)
-^^^^^^^^^^^^^^^^^^^^^^^^^^
-
-There is a feature freeze roughly two months prior to the planned
-initial stable release, after which focus shifts to stabilization and
-bug fixes only.
-
-* Release candidate release every 1-2 weeks
-* Intended for final testing and validation of the upcoming stable release
-
-Stable releases (x.2.z)
-^^^^^^^^^^^^^^^^^^^^^^^
-
-Once the initial stable release is made (x.2.0), there are
-semi-regular bug-fix point releases with bug fixes and (occasionally)
-feature backports.  Bug fixes are accumulated and included in
-the next point release.
-
-* Stable point release every 4 to 6 weeks
-* Intended for production deployments
-* Bug fix backports for 2 full release cycles (2 years).
-* Online, rolling upgrade support and testing from the last two (2)
-  stable release(s) (starting from Luminous).
-* Online, rolling upgrade support and testing from prior stable point
-  releases
-
-For each stable release:
-
-* `Integration and upgrade tests
-  <https://github.com/ceph/ceph/tree/master/qa/suites/>`_ are run on a regular basis
-  and `their results <http://pulpito.ceph.com/>`_ analyzed by Ceph
-  developers.
-* `Issues <http://tracker.ceph.com/projects/ceph/issues?query_id=27>`_
-  fixed in the development branch (master) are scheduled to be backported.
-* When an issue found in the stable release is `reported
-  <http://tracker.ceph.com/projects/ceph/issues/new>`_, it is
-  triaged by Ceph developers.
-* The `stable releases and backport team <http://tracker.ceph.com/projects/ceph-releases/wiki>`_
-  publishes ``point releases`` including fixes that have been backported to the stable release.
-
-Lifetime of stable releases
----------------------------
-
-The lifetime of a stable release series is calculated to be approximately 24
-months (i.e., two 12 month release cycles) after the month of the first release.
-For example, Mimic (13.2.z) will reach end of life (EOL) shortly after Octopus
-(15.2.0) is released. The lifetime of a release may vary because it depends on
-how quickly the stable releases are published.
-
-Detailed information on all releases, past and present, can be found at :ref:`ceph-releases-index`
-
diff --git a/ceph/doc/releases/giant.rst b/ceph/doc/releases/giant.rst
deleted file mode 100644 (file)
index da330f1..0000000
+++ /dev/null
@@ -1,1286 +0,0 @@
-=====
-Giant
-=====
-
-Giant is the 7th stable release of Ceph.  It is named after the giant
-squid (Architeuthis dux).
-
-
-v0.87.2 Giant
-=============
-
-This is the second (and possibly final) point release for Giant.
-
-We recommend all v0.87.x Giant users upgrade to this release.
-
-Notable Changes
----------------
-
-* ceph-objectstore-tool: only output unsupported features when incompatible (#11176 David Zafman)
-* common: do not implicitly unlock rwlock on destruction (Federico Simoncelli)
-* common: make wait timeout on empty queue configurable (#10818 Samuel Just)
-* crush: pick ruleset id that matches and rule id (Xiaoxi Chen)
-* crush: set_choose_tries = 100 for new erasure code rulesets (#10353 Loic Dachary)
-* librados: check initialized atomic safely (#9617 Josh Durgin)
-* librados: fix failed tick_event assert (#11183 Zhiqiang Wang)
-* librados: fix looping on skipped maps (#9986 Ding Dinghua)
-* librados: fix op submit with timeout (#10340 Samuel Just)
-* librados: pybind: fix memory leak (#10723 Billy Olsen)
-* librados: pybind: keep reference to callbacks (#10775 Josh Durgin)
-* librados: translate operation flags from C APIs (Matthew Richards)
-* libradosstriper: fix write_full on ENOENT (#10758 Sebastien Ponce)
-* libradosstriper: use strtoll instead of strtol (Dongmao Zhang)
-* mds: fix assertion caused by system time moving backwards (#11053 Yan, Zheng)
-* mon: allow injection of random delays on writes (Joao Eduardo Luis)
-* mon: do not trust small osd epoch cache values (#10787 Sage Weil)
-* mon: fail non-blocking flush if object is being scrubbed (#8011 Samuel Just)
-* mon: fix division by zero in stats dump (Joao Eduardo Luis)
-* mon: fix get_rule_avail when no osds (#10257 Joao Eduardo Luis)
-* mon: fix timeout rounds period (#10546 Joao Eduardo Luis)
-* mon: ignore osd failures before up_from (#10762 Dan van der Ster, Sage Weil)
-* mon: paxos: reset accept timeout before writing to store (#10220 Joao Eduardo Luis)
-* mon: return if fs exists on 'fs new' (Joao Eduardo Luis)
-* mon: use EntityName when expanding profiles (#10844 Joao Eduardo Luis)
-* mon: verify cross-service proposal preconditions (#10643 Joao Eduardo Luis)
-* mon: wait for osdmon to be writeable when requesting proposal (#9794 Joao Eduardo Luis)
-* mount.ceph: avoid spurious error message about /etc/mtab (#10351 Yan, Zheng)
-* msg/simple: allow RESETSESSION when we forget an endpoint (#10080 Greg Farnum)
-* msg/simple: discard delay queue before incoming queue (#9910 Sage Weil)
-* osd: clear_primary_state when leaving Primary (#10059 Samuel Just)
-* osd: do not ignore deleted pgs on startup (#10617 Sage Weil)
-* osd: fix FileJournal wrap to get header out first (#10883 David Zafman)
-* osd: fix PG leak in SnapTrimWQ (#10421 Kefu Chai)
-* osd: fix journalq population in do_read_entry (#6003 Samuel Just)
-* osd: fix operator== for op_queue_age_hit and fs_perf_stat (#10259 Samuel Just)
-* osd: fix rare assert after split (#10430 David Zafman)
-* osd: get pgid ancestor from last_map when building past intervals (#10430 David Zafman)
-* osd: include rollback_info_trimmed_to in {read,write}_log (#10157 Samuel Just)
-* osd: lock header_lock in DBObjectMap::sync (#9891 Samuel Just)
-* osd: requeue blocked op before flush it was blocked on (#10512 Sage Weil)
-* osd: tolerate missing object between list and attr get on backfill (#10150 Samuel Just)
-* osd: use correct atime for eviction decision (Xinze Chi)
-* rgw: flush XML header on get ACL request (#10106 Yehuda Sadeh)
-* rgw: index swift keys appropriately (#10471 Hemant Bruman, Yehuda Sadeh)
-* rgw: send cancel for bucket index pending ops (#10770 Baijiaruo, Yehuda Sadeh)
-* rgw: swift: support X_Remove_Container-Meta-{key} (#01475 Dmytro Iurchenko)
-
-For more detailed information, see :download:`the complete changelog <../changelog/v0.87.2.txt>`.
-
-v0.87.1 Giant
-=============
-
-This is the first (and possibly final) point release for Giant.  Our focus
-on stability fixes will be directed towards Hammer and Firefly.
-
-We recommend that all v0.87 Giant users upgrade to this release.
-
-Upgrading
----------
-
-* Due to a change in the Linux kernel version 3.18 and the limits of the FUSE
-  interface, ceph-fuse needs be mounted as root on at least some systems. See
-  issues #9997, #10277, and #10542 for details.
-
-Notable Changes
----------------
-
-* build: disable stack-execute bit on assembler objects (#10114 Dan Mick)
-* build: support boost 1.57.0 (#10688 Ken Dreyer)
-* ceph-disk: fix dmcrypt file permissions (#9785 Loic Dachary)
-* ceph-disk: run partprobe after zap, behave with partx or partprobe (#9665 #9721 Loic Dachary)
-* cephfs-journal-tool: fix import for aged journals (#9977 John Spray)
-* cephfs-journal-tool: fix journal import (#10025 John Spray)
-* ceph-fuse: use remount to trim kernel dcache (#10277 Yan, Zheng)
-* common: add cctid meta variable (#6228 Adam Crume)
-* common: fix dump of shard for ghobject_t (#10063 Loic Dachary)
-* crush: fix bucket weight underflow (#9998 Pawel Sadowski)
-* erasure-code: enforce chunk size alignment (#10211 Loic Dachary)
-* erasure-code: regression test suite (#9420 Loic Dachary)
-* erasure-code: relax caucy w restrictions (#10325 Loic Dachary)
-* libcephfs,ceph-fuse: allow xattr caps on inject_release_failure (#9800 John Spray)
-* libcephfs,ceph-fuse: fix cap flush tid comparison (#9869 Greg Farnum)
-* libcephfs,ceph-fuse: new flag to indicated sorted dcache (#9178 Yan, Zheng)
-* libcephfs,ceph-fuse: prune cache before reconnecting to MDS (Yan, Zheng)
-* librados: limit number of in-flight read requests (#9854 Jason Dillaman)
-* libradospy: fix thread shutdown (#8797 Dan Mick)
-* libradosstriper: fix locking issue in truncate (#10129 Sebastien Ponce)
-* librbd: complete pending ops before closing mage (#10299 Jason Dillaman)
-* librbd: fix error path on image open failure (#10030 Jason Dillaman)
-* librbd: gracefully handle deleted/renamed pools (#10270 Jason Dillaman)
-* librbd: handle errors when creating ioctx while listing children (#10123 Jason Dillaman)
-* mds: fix compat version in MClientSession (#9945 John Spray)
-* mds: fix journaler write error handling (#10011 John Spray)
-* mds: fix locking for file size recovery (#10229 Yan, Zheng)
-* mds: handle heartbeat_reset during shutdown (#10382 John Spray)
-* mds: store backtrace for straydir (Yan, Zheng)
-* mon: allow tiers for FS pools (#10135 John Spray)
-* mon: fix caching of last_epoch_clean, osdmap trimming (#9987 Sage Weil)
-* mon: fix 'fs ls' on peons (#10288 John Spray)
-* mon: fix MDS health status from peons (#10151 John Spray)
-* mon: fix paxos off-by-one (#9301 Sage Weil)
-* msgr: simple: do not block on takeover while holding global lock (#9921 Greg Farnum)
-* osd: deep scrub must not abort if hinfo is missing (#10018 Loic Dachary)
-* osd: fix misdirected op detection (#9835 Sage Weil)
-* osd: fix past_interval display for acting (#9752 Loic Dachary)
-* osd: fix PG peering backoff when behind on osdmaps (#10431 Sage Weil)
-* osd: handle no-op write with snapshot case (#10262 Ssage Weil)
-* osd: use fast-dispatch (Sage Weil, Greg Farnum)
-* rados: fix write to /dev/null (Loic Dachary)
-* radosgw-admin: create subuser when needed (#10103 Yehuda Sadeh)
-* rbd: avoid invalidating aio_write buffer during image import (#10590 Jason Dillaman)
-* rbd: fix export with images > 2GB (Vicente Cheng)
-* rgw: change multipart upload id magic (#10271 Georgios Dimitrakakis, Yehuda Sadeh)
-* rgw: check keystone auth for S3 POST (#10062 Abhishek Lekshmanan)
-* rgw: check timestamp for S3 keystone auth (#10062 Abhishek Lekshmanan)
-* rgw: fix partial GET with swift (#10553 Yehuda Sadeh)
-* rgw: fix quota disable (#9907 Dong Lei)
-* rgw: fix rare corruption of object metadata on put (#9576 Yehuda Sadeh)
-* rgw: fix S3 object copy content-type (#9478 Yehuda Sadeh)
-* rgw: headers end with \r\n (#9254 Benedikt Fraunhofer, Yehuda Sadeh)
-* rgw: remove swift user manifest DLO hash calculation (#9973 Yehuda Sadeh)
-* rgw: return correct len when len is 0 (#9877 Yehuda Sadeh)
-* rgw: return X-Timestamp field (#8911 Yehuda Sadeh)
-* rgw: run radosgw as apache with systemd (#10125)
-* rgw: sent ETag on S3 object copy (#9479 Yehuda Sadeh)
-* rgw: sent HTTP status reason explicitly in fastcgi (Yehuda Sadeh)
-* rgw: set length for keystone token validation (#7796 Mark Kirkwood, Yehuda Sadeh)
-* rgw: set ulimit -n on sysvinit before starting daemon (#9587 Sage Weil)
-* rgw: update bucket index on set_attrs (#5595 Yehuda Sadeh)
-* rgw: update swift subuser permission masks when authenticating (#9918 Yehuda Sadeh)
-* rgw: URL decode HTTP query params correction (#10271 Georgios Dimitrakakis, Yehuda Sadeh)
-* rgw: use cached attrs while reading object attrs (#10307 Yehuda Sadeh)
-* rgw: use strict_strtoll for content length (#10701 Axel Dunkel, Yehuda Sadeh)
-
-For more detailed information, see :download:`the complete changelog <../changelog/v0.87.1.txt>`.
-
-
-
-v0.87 Giant
-===========
-
-This release will form the basis for the stable release Giant,
-v0.87.x.  Highlights for Giant include:
-
-* *RADOS Performance*: a range of improvements have been made in the
-  OSD and client-side librados code that improve the throughput on
-  flash backends and improve parallelism and scaling on fast machines.
-* *CephFS*: we have fixed a raft of bugs in CephFS and built some
-  basic journal recovery and diagnostic tools.  Stability and
-  performance of single-MDS systems is vastly improved in Giant.
-  Although we do not yet recommend CephFS for production deployments,
-  we do encourage testing for non-critical workloads so that we can
-  better gauge the feature, usability, performance, and stability
-  gaps.
-* *Local Recovery Codes*: the OSDs now support an erasure-coding scheme
-  that stores some additional data blocks to reduce the IO required to
-  recover from single OSD failures.
-* *Degraded vs misplaced*: the Ceph health reports from 'ceph -s' and
-  related commands now make a distinction between data that is
-  degraded (there are fewer than the desired number of copies) and
-  data that is misplaced (stored in the wrong location in the
-  cluster).  The distinction is important because the latter does not
-  compromise data safety.
-* *Tiering improvements*: we have made several improvements to the
-  cache tiering implementation that improve performance.  Most
-  notably, objects are not promoted into the cache tier by a single
-  read; they must be found to be sufficiently hot before that happens.
-* *Monitor performance*: the monitors now perform writes to the local
-  data store asynchronously, improving overall responsiveness.
-* *Recovery tools*: the ceph_objectstore_tool is greatly expanded to
-  allow manipulation of an individual OSDs data store for debugging
-  and repair purposes.  This is most heavily used by our QA
-  infrastructure to exercise recovery code.
-
-Upgrade Sequencing
-------------------
-
-* If your existing cluster is running a version older than v0.80.x
-  Firefly, please first upgrade to the latest Firefly release before
-  moving on to Giant.  We have not tested upgrades directly from
-  Emperor, Dumpling, or older releases.
-
-  We *have* tested:
-
-   * Firefly to Giant
-   * Dumpling to Firefly to Giant
-
-* Please upgrade daemons in the following order:
-
-   #. Monitors
-   #. OSDs
-   #. MDSs and/or radosgw
-
-  Note that the relative ordering of OSDs and monitors should not matter, but
-  we primarily tested upgrading monitors first.
-
-Upgrading from v0.80x Firefly
------------------------------
-
-* The client-side caching for librbd is now enabled by default (rbd
-  cache = true).  A safety option (rbd cache writethrough until flush
-  = true) is also enabled so that writeback caching is not used until
-  the library observes a 'flush' command, indicating that the librbd
-  users is passing that operation through from the guest VM.  This
-  avoids potential data loss when used with older versions of qemu
-  that do not support flush.
-
-    leveldb_write_buffer_size = 8*1024*1024  = 33554432   // 8MB
-    leveldb_cache_size        = 512*1024*1204 = 536870912 // 512MB
-    leveldb_block_size        = 64*1024       = 65536     // 64KB
-    leveldb_compression       = false
-    leveldb_log               = ""
-
-  OSDs will still maintain the following osd-specific defaults:
-
-    leveldb_log               = ""
-
-* The 'rados getxattr ...' command used to add a gratuitous newline to the attr
-  value; it now does not.
-
-* The ``*_kb perf`` counters on the monitor have been removed.  These are
-  replaced with a new set of ``*_bytes`` counters (e.g., ``cluster_osd_kb`` is
-  replaced by ``cluster_osd_bytes``).
-
-* The ``rd_kb`` and ``wr_kb`` fields in the JSON dumps for pool stats (accessed
-  via the ``ceph df detail -f json-pretty`` and related commands) have been
-  replaced with corresponding ``*_bytes`` fields.  Similarly, the
-  ``total_space``, ``total_used``, and ``total_avail`` fields are replaced with
-  ``total_bytes``, ``total_used_bytes``,  and ``total_avail_bytes`` fields.
-
-* The ``rados df --format=json`` output ``read_bytes`` and ``write_bytes``
-  fields were incorrectly reporting ops; this is now fixed.
-
-* The ``rados df --format=json`` output previously included ``read_kb`` and
-  ``write_kb`` fields; these have been removed.  Please use ``read_bytes`` and
-  ``write_bytes`` instead (and divide by 1024 if appropriate).
-
-* The experimental keyvaluestore-dev OSD backend had an on-disk format
-  change that prevents existing OSD data from being upgraded.  This
-  affects developers and testers only.
-
-* mon-specific and osd-specific leveldb options have been removed.
-  From this point onward users should use the `leveldb_*` generic
-  options and add the options in the appropriate sections of their
-  configuration files.  Monitors will still maintain the following
-  monitor-specific defaults:
-
-    leveldb_write_buffer_size = 8*1024*1024  = 33554432   // 8MB
-    leveldb_cache_size        = 512*1024*1204 = 536870912 // 512MB
-    leveldb_block_size        = 64*1024       = 65536     // 64KB
-    leveldb_compression       = false
-    leveldb_log               = ""
-
-  OSDs will still maintain the following osd-specific defaults:
-
-    leveldb_log               = ""
-
-* CephFS support for the legacy anchor table has finally been removed.
-  Users with file systems created before firefly should ensure that inodes
-  with multiple hard links are modified *prior* to the upgrade to ensure that
-  the backtraces are written properly.  For example::
-
-    sudo find /mnt/cephfs -type f -links +1 -exec touch \{\} \;
-
-* We disallow nonsensical 'tier cache-mode' transitions.  From this point
-  onward, 'writeback' can only transition to 'forward' and 'forward'
-  can transition to 1) 'writeback' if there are dirty objects, or 2) any if
-  there are no dirty objects.
-
-Notable Changes since v0.86
----------------------------
-
-* ceph-disk: use new udev rules for centos7/rhel7 (#9747 Loic Dachary)
-* libcephfs-java: fix fstat mode (Noah Watkins)
-* librados: fix deadlock when listing PG contents (Guang Yang)
-* librados: misc fixes to the new threading model (#9582 #9706 #9845 #9873 Sage Weil)
-* mds: fix inotable initialization (Henry C Chang)
-* mds: gracefully handle unknown lock type in flock requests (Yan, Zheng)
-* mon: add read-only, read-write, and role-definer rols (Joao Eduardo Luis)
-* mon: fix mon cap checks (Joao Eduardo Luis)
-* mon: misc fixes for new paxos async writes (#9635 Sage Weil)
-* mon: set scrub timestamps on PG creation (#9496 Joao Eduardo Luis)
-* osd: erasure code: fix buffer alignment (Janne Grunau, Loic Dachary)
-* osd: fix alloc hint induced crashes on mixed clusters (#9419 David Zafman)
-* osd: fix backfill reservation release on rejection (#9626, Samuel Just)
-* osd: fix ioprio option parsing (#9676 #9677 Loic Dachary)
-* osd: fix memory leak during snap trimming (#9113 Samuel Just)
-* osd: misc peering and recovery fixes (#9614 #9696 #9731 #9718 #9821 #9875 Samuel Just, Guang Yang)
-
-Notable Changes since v0.80.x Firefly
--------------------------------------
-
-* bash completion improvements (Wido den Hollander)
-* brag: fixes, improvements (Loic Dachary)
-* buffer: improve rebuild_page_aligned (Ma Jianpeng)
-* build: fix build on alpha (Michael Cree, Dmitry Smirnov)
-* build: fix CentOS 5 (Gerben Meijer)
-* build: fix yasm check for x32 (Daniel Schepler, Sage Weil)
-* ceph-brag: add tox tests (Alfredo Deza)
-* ceph-conf: flush log on exit (Sage Weil)
-* ceph.conf: update sample (Sebastien Han)
-* ceph-dencoder: refactor build a bit to limit dependencies (Sage Weil, Dan Mick)
-* ceph-disk: add Scientific Linux support (Dan van der Ster)
-* ceph-disk: do not inadvertantly create directories (Owne Synge)
-* ceph-disk: fix dmcrypt support (Sage Weil)
-* ceph-disk: fix dmcrypt support (Stephen Taylor)
-* ceph-disk: handle corrupt volumes (Stuart Longlang)
-* ceph-disk: linter cleanup, logging improvements (Alfredo Deza)
-* ceph-disk: partprobe as needed (Eric Eastman)
-* ceph-disk: show information about dmcrypt in 'ceph-disk list' output (Sage Weil)
-* ceph-disk: use partition type UUIDs and blkid (Sage Weil)
-* ceph: fix for non-default cluster names (#8944, Dan Mick)
-* ceph-fuse, libcephfs: asok hooks for handling session resets, timeouts (Yan, Zheng)
-* ceph-fuse, libcephfs: fix crash in trim_caps (John Spray)
-* ceph-fuse, libcephfs: improve cap trimming (John Spray)
-* ceph-fuse, libcephfs: improve traceless reply handling (Sage Weil)
-* ceph-fuse, libcephfs: virtual xattrs for rstat (Yan, Zheng)
-* ceph_objectstore_tool: vastly improved and extended tool for working offline with OSD data stores (David Zafman)
-* ceph.spec: many fixes (Erik Logtenberg, Boris Ranto, Dan Mick, Sandon Van Ness)
-* ceph.spec: split out ceph-common package, other fixes (Sandon Van Ness)
-* ceph_test_librbd_fsx: fix RNG, make deterministic (Ilya Dryomov)
-* cephtool: fix help (Yilong Zhao)
-* cephtool: refactor and improve CLI tests (Joao Eduardo Luis)
-* cephtool: test cleanup (Joao Eduardo Luis)
-* clang build fixes (John Spray, Danny Al-Gaaf)
-* client: improved MDS session dumps (John Spray)
-* common: add config diff admin socket command (Joao Eduardo Luis)
-* common: add rwlock assertion checks (Yehuda Sadeh)
-* common: fix dup log messages (#9080, Sage Weil)
-* common: perfcounters now use atomics and go faster (Sage Weil)
-* config: support G, M, K, etc. suffixes (Joao Eduardo Luis)
-* coverity cleanups (Danny Al-Gaaf)
-* crush: clean up CrushWrapper interface (Xioaxi Chen)
-* crush: include new tunables in dump (Sage Weil)
-* crush: make ruleset ids unique (Xiaoxi Chen, Loic Dachary)
-* crush: only require rule features if the rule is used (#8963, Sage Weil)
-* crushtool: send output to stdout, not stderr (Wido den Hollander)
-* doc: cache tiering (John Wilkins)
-* doc: CRUSH updates (John Wilkins)
-* doc: document new upstream wireshark dissector (Kevin Cox)
-* doc: improve manual install docs (Francois Lafont)
-* doc: keystone integration docs (John Wilkins)
-* doc: librados example fixes (Kevin Dalley)
-* doc: many doc updates (John Wilkins)
-* doc: many install doc updates (John Wilkins)
-* doc: misc updates (John Wilkins, Loic Dachary, David Moreau Simard, Wido den Hollander. Volker Voigt, Alfredo Deza, Stephen Jahl, Dan van der Ster)
-* doc: osd primary affinity (John Wilkins)
-* doc: pool quotas (John Wilkins)
-* doc: pre-flight doc improvements (Kevin Dalley)
-* doc: switch to an unencumbered font (Ross Turk)
-* doc: updated simple configuration guides (John Wilkins)
-* doc: update erasure docs (Loic Dachary, Venky Shankar)
-* doc: update openstack docs (Josh Durgin)
-* filestore: disable use of XFS hint (buggy on old kernels) (Samuel Just)
-* filestore: fix xattr spillout (Greg Farnum, Haomai Wang)
-* fix hppa arch build (Dmitry Smirnov)
-* fix i386 builds (Sage Weil)
-* fix struct vs class inconsistencies (Thorsten Behrens)
-* global: write pid file even when running in foreground (Alexandre Oliva)
-* hadoop: improve tests (Huamin Chen, Greg Farnum, John Spray)
-* hadoop: update hadoop tests for Hadoop 2.0 (Haumin Chen)
-* init-ceph: continue starting other daemons on crush or mount failure (#8343, Sage Weil)
-* journaler: fix locking (Zheng, Yan)
-* keyvaluestore: fix hint crash (#8381, Haomai Wang)
-* keyvaluestore: header cache (Haomai Wang)
-* libcephfs-java: build against older JNI headers (Greg Farnum)
-* libcephfs-java: fix gcj-jdk build (Dmitry Smirnov)
-* librados: fix crash on read op timeout (#9362 Matthias Kiefer, Sage Weil)
-* librados: fix lock leaks in error paths (#9022, Paval Rallabhandi)
-* librados: fix pool existence check (#8835, Pavan Rallabhandi)
-* librados: fix rados_pool_list bounds checks (Sage Weil)
-* librados: fix shutdown race (#9130 Sage Weil)
-* librados: fix watch/notify test (#7934 David Zafman)
-* librados: fix watch reregistration on acting set change (#9220 Samuel Just)
-* librados: give Objecter fine-grained locks (Yehuda Sadeh, Sage Weil, John Spray)
-* librados: lttng tracepoitns (Adam Crume)
-* librados, osd: return ETIMEDOUT on failed notify (Sage Weil)
-* librados: pybind: fix reads when \0 is present (#9547 Mohammad Salehe)
-* librados_striper: striping library for librados (Sebastien Ponce)
-* librbd, ceph-fuse: reduce cache flush overhead (Haomai Wang)
-* librbd: check error code on cache invalidate (Josh Durgin)
-* librbd: enable caching by default (Sage Weil)
-* librbd: enforce cache size on read requests (Jason Dillaman)
-* librbd: fix crash using clone of flattened image (#8845, Josh Durgin)
-* librbd: fix error path when opening image (#8912, Josh Durgin)
-* librbd: handle blacklisting during shutdown (#9105 John Spray)
-* librbd: lttng tracepoints (Adam Crume)
-* librbd: new libkrbd library for kernel map/unmap/showmapped (Ilya Dryomov)
-* librbd: store and retrieve snapshot metadata based on id (Josh Durgin)
-* libs3: update to latest (Danny Al-Gaaf)
-* log: fix derr level (Joao Eduardo Luis)
-* logrotate: fix osd log rotation on ubuntu (Sage Weil)
-* lttng: tracing infrastructure (Noah Watkins, Adam Crume)
-* mailmap: many updates (Loic Dachary)
-* mailmap: updates (Loic Dachary, Abhishek Lekshmanan, M Ranga Swami Reddy)
-* Makefile: fix out of source builds (Stefan Eilemann)
-* many many coverity fixes, cleanups (Danny Al-Gaaf)
-* mds: adapt to new Objecter locking, give types to all Contexts (John Spray)
-* mds: add file system name, enabled flag (John Spray)
-* mds: add internal health checks (John Spray)
-* mds: add min/max UID for snapshot creation/deletion (#9029, Wido den Hollander)
-* mds: avoid tight mon reconnect loop (#9428 Sage Weil)
-* mds: boot refactor, cleanup (John Spray)
-* mds: cephfs-journal-tool (John Spray)
-* mds: fix crash killing sessions (#9173 John Spray)
-* mds: fix ctime updates (#9514 Greg Farnum)
-* mds: fix journal conversion with standby-replay (John Spray)
-* mds: fix replay locking (Yan, Zheng)
-* mds: fix standby-replay cache trimming (#8648 Zheng, Yan)
-* mds: fix xattr bug triggered by ACLs (Yan, Zheng)
-* mds: give perfcounters meaningful names (Sage Weil)
-* mds: improve health reporting to monitor (John Spray)
-* mds: improve Journaler on-disk format (John Spray)
-* mds: improve journal locking (Zheng, Yan)
-* mds, libcephfs: use client timestamp for mtime/ctime (Sage Weil)
-* mds: make max file recoveries tunable (Sage Weil)
-* mds: misc encoding improvements (John Spray)
-* mds: misc fixes for multi-mds (Yan, Zheng)
-* mds: multi-mds fixes (Yan, Zheng)
-* mds: OPTracker integration, dump_ops_in_flight (Greg Farnum)
-* mds: prioritize file recovery when appropriate (Sage Weil)
-* mds: refactor beacon, improve reliability (John Spray)
-* mds: remove legacy anchor table (Yan, Zheng)
-* mds: remove legacy discover ino (Yan, Zheng)
-* mds: restart on EBLACKLISTED (John Spray)
-* mds: separate inode recovery queue (John Spray)
-* mds: session ls, evict commands (John Spray)
-* mds: submit log events in async thread (Yan, Zheng)
-* mds: track RECALL progress, report failure (#9284 John Spray)
-* mds: update segment references during journal write (John Spray, Greg Farnum)
-* mds: use client-provided timestamp for user-visible file metadata (Yan, Zheng)
-* mds: use meaningful names for clients (John Spray)
-* mds: validate journal header on load and save (John Spray)
-* mds: warn clients which aren't revoking caps (Zheng, Yan, John Spray)
-* misc build errors/warnings for Fedora 20 (Boris Ranto)
-* misc build fixes for OS X (John Spray)
-* misc cleanup (Christophe Courtaut)
-* misc integer size cleanups (Kevin Cox)
-* misc memory leaks, cleanups, fixes (Danny Al-Gaaf, Sahid Ferdjaoui)
-* misc suse fixes (Danny Al-Gaaf)
-* misc word size fixes (Kevin Cox)
-* mon: add audit log for all admin commands (Joao Eduardo Luis)
-* mon: add cluster fingerprint (Sage Weil)
-* mon: add get-quota commands (Joao Eduardo Luis)
-* mon: add 'osd blocked-by' command to easily see which OSDs are blocking peering progress (Sage Weil)
-* mon: add 'osd reweight-by-pg' command (Sage Weil, Guang Yang)
-* mon: add perfcounters for paxos operations (Sage Weil)
-* mon: avoid creating unnecessary rule on pool create (#9304 Loic Dachary)
-* monclient: fix hang (Sage Weil)
-* mon: create default EC profile if needed (Loic Dachary)
-* mon: do not create file system by default (John Spray)
-* mon: do not spam log (Aanchal Agrawal, Sage Weil)
-* mon: drop mon- and osd- specific leveldb options (Joao Eduardo Luis)
-* mon: ec pool profile fixes (Loic Dachary)
-* mon: fix bug when no auth keys are present (#8851, Joao Eduardo Luis)
-* mon: fix 'ceph df' output for available space (Xiaoxi Chen)
-* mon: fix compat version for MForward (Joao Eduardo Luis)
-* mon: fix crash on loopback messages and paxos timeouts (#9062, Sage Weil)
-* mon: fix default replication pool ruleset choice (#8373, John Spray)
-* mon: fix divide by zero when pg_num is adjusted before OSDs are added (#9101, Sage Weil)
-* mon: fix double-free of old MOSDBoot (Sage Weil)
-* mon: fix health down messages (Sage Weil)
-* mon: fix occasional memory leak after session reset (#9176, Sage Weil)
-* mon: fix op write latency perfcounter (#9217 Xinxin Shu)
-* mon: fix 'osd perf' reported latency (#9269 Samuel Just)
-* mon: fix quorum feature check (#8738, Greg Farnum)
-* mon: fix ruleset/ruleid bugs (#9044, Loic Dachary)
-* mon: fix set cache_target_full_ratio (#8440, Geoffrey Hartz)
-* mon: fix store check on startup (Joao Eduardo Luis)
-* mon: include per-pool 'max avail' in df output (Sage Weil)
-* mon: make paxos transaction commits asynchronous (Sage Weil)
-* mon: make usage dumps in terms of bytes, not kB (Sage Weil)
-* mon: 'osd crush reweight-subtree ...' (Sage Weil)
-* mon, osd: relax client EC support requirements (Sage Weil)
-* mon: preload erasure plugins (#9153 Loic Dachary)
-* mon: prevent cache pools from being used directly by CephFS (#9435 John Spray)
-* mon: prevent EC pools from being used with cephfs (Joao Eduardo Luis)
-* mon: prevent implicit destruction of OSDs with 'osd setmaxosd ...' (#8865, Anand Bhat)
-* mon: prevent nonsensical cache-mode transitions (Joao Eduardo Luis)
-* mon: restore original weight when auto-marked out OSDs restart (Sage Weil)
-* mon: restrict some pool properties to tiered pools (Joao Eduardo Luis)
-* mon: some instrumentation (Sage Weil)
-* mon: use msg header tid for MMonGetVersionReply (Ilya Dryomov)
-* mon: use user-provided ruleset for replicated pool (Xiaoxi Chen)
-* mon: verify all quorum members are contiguous at end of Paxos round (#9053, Sage Weil)
-* mon: verify available disk space on startup (#9502 Joao Eduardo Luis)
-* mon: verify erasure plugin version on load (Loic Dachary)
-* msgr: avoid big lock when sending (most) messages (Greg Farnum)
-* msgr: fix logged address (Yongyue Sun)
-* msgr: misc locking fixes for fast dispatch (#8891, Sage Weil)
-* msgr: refactor to cleanly separate SimpleMessenger implemenetation, move toward Connection-based calls (Matt Benjamin, Sage Wei)
-* objecter: flag operations that are redirected by caching (Sage Weil)
-* objectstore: clean up KeyValueDB interface for key/value backends (Sage Weil)
-* osd: account for hit_set_archive bytes (Sage Weil)
-* osd: add ability to prehash filestore directories (Guang Yang)
-* osd: add 'dump_reservations' admin socket command (Sage Weil)
-* osd: add feature bit for erasure plugins (Loic Dachary)
-* osd: add header cache for KeyValueStore (Haomai Wang)
-* osd: add ISA erasure plugin table cache (Andreas-Joachim Peters)
-* osd: add local_mtime for use by cache agent (Zhiqiang Wang)
-* osd: add local recovery code (LRC) erasure plugin (Loic Dachary)
-* osd: add prototype KineticStore based on Seagate Kinetic (Josh Durgin)
-* osd: add READFORWARD caching mode (Luis Pabon)
-* osd: add superblock for KeyValueStore backend (Haomai Wang)
-* osd: add support for Intel ISA-L erasure code library (Andreas-Joachim Peters)
-* osd: allow map cache size to be adjusted at runtime (Sage Weil)
-* osd: avoid refcounting overhead by passing a few things by ref (Somnath Roy)
-* osd: avoid sharing PG info that is not durable (Samuel Just)
-* osd: bound osdmap epoch skew between PGs (Sage Weil)
-* osd: cache tier flushing fixes for snapped objects (Samuel Just)
-* osd: cap hit_set size (#9339 Samuel Just)
-* osd: clean up shard_id_t, shard_t (Loic Dachary)
-* osd: clear FDCache on unlink (#8914 Loic Dachary)
-* osd: clear slow request latency info on osd up/down (Sage Weil)
-* osd: do not evict blocked objects (#9285 Zhiqiang Wang)
-* osd: do not skip promote for write-ordered reads (#9064, Samuel Just)
-* osd: fix agent early finish looping (David Zafman)
-* osd: fix ambigous encoding order for blacklisted clients (#9211, Sage Weil)
-* osd: fix bogus assert during OSD shutdown (Sage Weil)
-* osd: fix bug with long object names and rename (#8701, Sage Weil)
-* osd: fix cache flush corner case for snapshotted objects (#9054, Samuel Just)
-* osd: fix cache full -> not full requeueing (#8931, Sage Weil)
-* osd: fix clone deletion case (#8334, Sam Just)
-* osd: fix clone vs cache_evict bug (#8629 Sage Weil)
-* osd: fix connection reconnect race (Greg Farnum)
-* osd: fix crash from duplicate backfill reservation (#8863 Sage Weil)
-* osd: fix dead peer connection checks (#9295 Greg Farnum, Sage Weil)
-* osd: fix discard of old/obsolete subop replies (#9259, Samuel Just)
-* osd: fix discard of peer messages from previous intervals (Greg Farnum)
-* osd: fix dump of open fds on EMFILE (Sage Weil)
-* osd: fix dumps (Joao Eduardo Luis)
-* osd: fix erasure-code lib initialization (Loic Dachary)
-* osd: fix extent normalization (Adam Crume)
-* osd: fix filestore removal corner case (#8332, Sam Just)
-* osd: fix flush vs OpContext (Samuel Just)
-* osd: fix gating of messages from old OSD instances (Greg Farnum)
-* osd: fix hang waiting for osdmap (#8338, Greg Farnum)
-* osd: fix interval check corner case during peering (#8104, Sam Just)
-* osd: fix ISA erasure alignment (Loic Dachary, Andreas-Joachim Peters)
-* osd: fix journal dump (Ma Jianpeng)
-* osd: fix journal-less operation (Sage Weil)
-* osd: fix keyvaluestore scrub (#8589 Haomai Wang)
-* osd: fix keyvaluestore upgrade (Haomai Wang)
-* osd: fix loopback msgr issue (Ma Jianpeng)
-* osd: fix LSB release parsing (Danny Al-Gaaf)
-* osd: fix MarkMeDown and other shutdown races (Sage Weil)
-* osd: fix memstore bugs with collection_move_rename, lock ordering (Sage Weil)
-* osd: fix min_read_recency_for_promote default on upgrade (Zhiqiang Wang)
-* osd: fix mon feature bit requirements bug and resulting log spam (Sage Weil)
-* osd: fix mount/remount sync race (#9144 Sage Weil)
-* osd: fix PG object listing/ordering bug (Guang Yang)
-* osd: fix PG stat errors with tiering (#9082, Sage Weil)
-* osd: fix purged_snap initialization on backfill (Sage Weil, Samuel Just, Dan van der Ster, Florian Haas)
-* osd: fix race condition on object deletion (#9480 Somnath Roy)
-* osd: fix recovery chunk size usage during EC recovery (Ma Jianpeng)
-* osd: fix recovery reservation deadlock for EC pools (Samuel Just)
-* osd: fix removal of old xattrs when overwriting chained xattrs (Ma Jianpeng)
-* osd: fix requesting queueing on PG split (Samuel Just)
-* osd: fix scrub vs cache bugs (Samuel Just)
-* osd: fix snap object writeback from cache tier (#9054 Samuel Just)
-* osd: fix trim of hitsets (Sage Weil)
-* osd: force new xattrs into leveldb if fs returns E2BIG (#7779, Sage Weil)
-* osd: implement alignment on chunk sizes (Loic Dachary)
-* osd: improved backfill priorities (Sage Weil)
-* osd: improve journal shutdown (Ma Jianpeng, Mark Kirkwood)
-* osd: improve locking for KeyValueStore (Haomai Wang)
-* osd: improve locking in OpTracker (Pavan Rallabhandi, Somnath Roy)
-* osd: improve prioritization of recovery of degraded over misplaced objects (Sage Weil)
-* osd: improve tiering agent arithmetic (Zhiqiang Wang, Sage Weil, Samuel Just)
-* osd: include backend information in metadata reported to mon (Sage Weil)
-* osd: locking, sharding, caching improvements in FileStore's FDCache (Somnath Roy, Greg Farnum)
-* osd: lttng tracepoints for filestore (Noah Watkins)
-* osd: make blacklist encoding deterministic (#9211 Sage Weil)
-* osd: make tiering behave if hit_sets aren't enabled (Sage Weil)
-* osd: many important bug fixes (Samuel Just)
-* osd: many many core fixes (Samuel Just)
-* osd: many many important fixes (#8231 #8315 #9113 #9179 #9293 #9294 #9326 #9453 #9481 #9482 #9497 #9574 Samuel Just)
-* osd: mark pools with incomplete clones (Sage Weil)
-* osd: misc erasure code plugin fixes (Loic Dachary)
-* osd: misc locking fixes for fast dispatch (Samuel Just, Ma Jianpeng)
-* osd, mon: add rocksdb support (Xinxin Shu, Sage Weil)
-* osd, mon: config sanity checks on start (Sage Weil, Joao Eduardo Luis)
-* osd, mon: distinguish between "misplaced" and "degraded" objects in cluster health and PG state reporting (Sage Weil)
-* osd, msgr: fast-dispatch of OSD ops (Greg Farnum, Samuel Just)
-* osd, objecter: resend ops on last_force_op_resend barrier; fix cache overlay op ordering (Sage Weil)
-* osd: preload erasure plugins (#9153 Loic Dachary)
-* osd: prevent old rados clients from using tiered pools (#8714, Sage Weil)
-* osd: reduce OpTracker overhead (Somnath Roy)
-* osd: refactor some ErasureCode functionality into command parent class (Loic Dachary)
-* osd: remove obsolete classic scrub code (David Zafman)
-* osd: scrub PGs with invalid stats (Sage Weil)
-* osd: set configurable hard limits on object and xattr names (Sage Weil, Haomai Wang)
-* osd: set rollback_info_completed on create (#8625, Samuel Just)
-* osd: sharded threadpool to improve parallelism (Somnath Roy)
-* osd: shard OpTracker to improve performance (Somnath Roy)
-* osd: simple io prioritization for scrub (Sage Weil)
-* osd: simple scrub throttling (Sage Weil)
-* osd: simple snap trimmer throttle (Sage Weil)
-* osd: tests for bench command (Loic Dachary)
-* osd: trim old EC objects quickly; verify on scrub (Samuel Just)
-* osd: use FIEMAP to inform copy_range (Haomai Wang)
-* osd: use local time for tiering decisions (Zhiqiang Wang)
-* osd: use xfs hint less frequently (Ilya Dryomov)
-* osd: verify erasure plugin version on load (Loic Dachary)
-* osd: work around GCC 4.8 bug in journal code (Matt Benjamin)
-* pybind/rados: fix small timeouts (John Spray)
-* qa: xfstests updates (Ilya Dryomov)
-* rados: allow setxattr value to be read from stdin (Sage Weil)
-* rados bench: fix arg order (Kevin Dalley)
-* rados: drop gratuitous \n from getxattr command (Sage Weil)
-* rados: fix bench write arithmetic (Jiangheng)
-* rados: fix {read,write}_ops values for df output (Sage Weil)
-* rbd: add rbdmap pre- and post post- hooks, fix misc bugs (Dmitry Smirnov)
-* rbd-fuse: allow exposing single image (Stephen Taylor)
-* rbd-fuse: fix unlink (Josh Durgin)
-* rbd: improve option default behavior (Josh Durgin)
-* rbd: parallelize rbd import, export (Jason Dillaman)
-* rbd: rbd-replay utility to replay captured rbd workload traces (Adam Crume)
-* rbd: use write-back (not write-through) when caching is enabled (Jason Dillaman)
-* removed mkcephfs (deprecated since dumpling)
-* rest-api: fix help (Ailing Zhang)
-* rgw: add civetweb as default frontent on port 7490 (#9013 Yehuda Sadeh)
-* rgw: add --min-rewrite-stripe-size for object restriper (Yehuda Sadeh)
-* rgw: add powerdns hook for dynamic DNS for global clusters (Wido den Hollander)
-* rgw: add S3 bucket get location operation (Abhishek Lekshmanan)
-* rgw: allow : in S3 access key (Roman Haritonov)
-* rgw: automatically align writes to EC pool (#8442, Yehuda Sadeh)
-* rgw: bucket link uses instance id (Yehuda Sadeh)
-* rgw: cache bucket info (Yehuda Sadeh)
-* rgw: cache decoded user info (Yehuda Sadeh)
-* rgw: check entity permission for put_metadata (#8428, Yehuda Sadeh)
-* rgw: copy object data is target bucket is in a different pool (#9039, Yehuda Sadeh)
-* rgw: do not try to authenticate CORS preflight requests (#8718, Robert Hubbard, Yehuda Sadeh)
-* rgw: fix admin create user op (#8583 Ray Lv)
-* rgw: fix civetweb URL decoding (#8621, Yehuda Sadeh)
-* rgw: fix crash on swift CORS preflight request (#8586, Yehuda Sadeh)
-* rgw: fix log filename suffix (#9353 Alexandre Marangone)
-* rgw: fix memory leak following chunk read error (Yehuda Sadeh)
-* rgw: fix memory leaks (Andrey Kuznetsov)
-* rgw: fix multipart object attr regression (#8452, Yehuda Sadeh)
-* rgw: fix multipart upload (#8846, Silvain Munaut, Yehuda Sadeh)
-* rgw: fix radosgw-admin 'show log' command (#8553, Yehuda Sadeh)
-* rgw: fix removal of objects during object creation (Patrycja Szablowska, Yehuda Sadeh)
-* rgw: fix striping for copied objects (#9089, Yehuda Sadeh)
-* rgw: fix test for identify whether an object has a tail (#9226, Yehuda Sadeh)
-* rgw: fix URL decoding (#8702, Brian Rak)
-* rgw: fix URL escaping (Yehuda Sadeh)
-* rgw: fix usage (Abhishek Lekshmanan)
-* rgw: fix user manifest (Yehuda Sadeh)
-* rgw: fix when stripe size is not a multiple of chunk size (#8937, Yehuda Sadeh)
-* rgw: handle empty extra pool name (Yehuda Sadeh)
-* rgw: improve civetweb logging (Yehuda Sadeh)
-* rgw: improve delimited listing of bucket, misc fixes (Yehuda Sadeh)
-* rgw: improve -h (Abhishek Lekshmanan)
-* rgw: many fixes for civetweb (Yehuda Sadeh)
-* rgw: misc civetweb fixes (Yehuda Sadeh)
-* rgw: misc civetweb frontend fixes (Yehuda Sadeh)
-* rgw: object and bucket rewrite functions to allow restriping old objects (Yehuda Sadeh)
-* rgw: powerdns backend for global namespaces (Wido den Hollander)
-* rgw: prevent multiobject PUT race (Yehuda Sadeh)
-* rgw: send user manifest header (Yehuda Sadeh)
-* rgw: subuser creation fixes (#8587 Yehuda Sadeh)
-* rgw: use systemd-run from sysvinit script (JuanJose Galvez)
-* rpm: do not restart daemons on upgrade (Alfredo Deza)
-* rpm: misc packaging fixes for rhel7 (Sandon Van Ness)
-* rpm: split ceph-common from ceph (Sandon Van Ness)
-* systemd: initial systemd config files (Federico Simoncelli)
-* systemd: wrap started daemons in new systemd environment (Sage Weil, Dan Mick)
-* sysvinit: add support for non-default cluster names (Alfredo Deza)
-* sysvinit: less sensitive to failures (Sage Weil)
-* test_librbd_fsx: test krbd as well as librbd (Ilya Dryomov)
-* unit test improvements (Loic Dachary)
-* upstart: increase max open files limit (Sage Weil)
-* vstart.sh: fix/improve rgw support (Luis Pabon, Abhishek Lekshmanan)
-
-
-
-
-v0.86
-=====
-
-This is a release candidate for Giant, which will hopefully be out
-in another week or two.  We did a feature freeze about a month ago
-and since then have been doing only stabilization and bug fixing (and
-a handful on low-risk enhancements).  A fair bit of new functionality
-went into the final sprint, but it's baked for quite a while now and
-we're feeling pretty good about it.
-
-Major items include:
-
-* librados locking refactor to improve scaling and client performance
-* local recovery code (LRC) erasure code plugin to trade some
-  additional storage overhead for improved recovery performance
-* LTTNG tracing framework, with initial tracepoints in librados,
-  librbd, and the OSD FileStore backend
-* separate monitor audit log for all administrative commands
-* asynchronous monitor transaction commits to reduce the impact on
-  monitor read requests while processing updates
-* low-level tool for working with individual OSD data stores for
-  debugging, recovery, and testing
-* many MDS improvements (bug fixes, health reporting)
-
-There are still a handful of known bugs in this release, but nothing
-severe enough to prevent a release.  By and large we are pretty
-pleased with the stability and expect the final Giant release to be
-quite reliable.
-
-Please try this out on your non-production clusters for a preview
-
-Notable Changes
----------------
-
-* buffer: improve rebuild_page_aligned (Ma Jianpeng)
-* build: fix CentOS 5 (Gerben Meijer)
-* build: fix build on alpha (Michael Cree, Dmitry Smirnov)
-* build: fix yasm check for x32 (Daniel Schepler, Sage Weil)
-* ceph-disk: add Scientific Linux support (Dan van der Ster)
-* ceph-fuse, libcephfs: fix crash in trim_caps (John Spray)
-* ceph-fuse, libcephfs: improve cap trimming (John Spray)
-* ceph-fuse, libcephfs: virtual xattrs for rstat (Yan, Zheng)
-* ceph.conf: update sample (Sebastien Han)
-* ceph.spec: many fixes (Erik Logtenberg, Boris Ranto, Dan Mick, Sandon Van Ness)
-* ceph_objectstore_tool: vastly improved and extended tool for working offline with OSD data stores (David Zafman)
-* common: add config diff admin socket command (Joao Eduardo Luis)
-* common: add rwlock assertion checks (Yehuda Sadeh)
-* crush: clean up CrushWrapper interface (Xioaxi Chen)
-* crush: make ruleset ids unique (Xiaoxi Chen, Loic Dachary)
-* doc: improve manual install docs (Francois Lafont)
-* doc: misc updates (John Wilkins, Loic Dachary, David Moreau Simard, Wido den Hollander. Volker Voigt, Alfredo Deza, Stephen Jahl, Dan van der Ster)
-* global: write pid file even when running in foreground (Alexandre Oliva)
-* hadoop: improve tests (Huamin Chen, Greg Farnum, John Spray)
-* journaler: fix locking (Zheng, Yan)
-* librados, osd: return ETIMEDOUT on failed notify (Sage Weil)
-* librados: fix crash on read op timeout (#9362 Matthias Kiefer, Sage Weil)
-* librados: fix shutdown race (#9130 Sage Weil)
-* librados: fix watch reregistration on acting set change (#9220 Samuel Just)
-* librados: fix watch/notify test (#7934 David Zafman)
-* librados: give Objecter fine-grained locks (Yehuda Sadeh, Sage Weil, John Spray)
-* librados: lttng tracepoitns (Adam Crume)
-* librados: pybind: fix reads when \0 is present (#9547 Mohammad Salehe)
-* librbd: enforce cache size on read requests (Jason Dillaman)
-* librbd: handle blacklisting during shutdown (#9105 John Spray)
-* librbd: lttng tracepoints (Adam Crume)
-* lttng: tracing infrastructure (Noah Watkins, Adam Crume)
-* mailmap: updates (Loic Dachary, Abhishek Lekshmanan, M Ranga Swami Reddy)
-* many many coverity fixes, cleanups (Danny Al-Gaaf)
-* mds: adapt to new Objecter locking, give types to all Contexts (John Spray)
-* mds: add internal health checks (John Spray)
-* mds: avoid tight mon reconnect loop (#9428 Sage Weil)
-* mds: fix crash killing sessions (#9173 John Spray)
-* mds: fix ctime updates (#9514 Greg Farnum)
-* mds: fix replay locking (Yan, Zheng)
-* mds: fix standby-replay cache trimming (#8648 Zheng, Yan)
-* mds: give perfcounters meaningful names (Sage Weil)
-* mds: improve health reporting to monitor (John Spray)
-* mds: improve journal locking (Zheng, Yan)
-* mds: make max file recoveries tunable (Sage Weil)
-* mds: prioritize file recovery when appropriate (Sage Weil)
-* mds: refactor beacon, improve reliability (John Spray)
-* mds: restart on EBLACKLISTED (John Spray)
-* mds: track RECALL progress, report failure (#9284 John Spray)
-* mds: update segment references during journal write (John Spray, Greg Farnum)
-* mds: use meaningful names for clients (John Spray)
-* mds: warn clients which aren't revoking caps (Zheng, Yan, John Spray)
-* mon: add 'osd reweight-by-pg' command (Sage Weil, Guang Yang)
-* mon: add audit log for all admin commands (Joao Eduardo Luis)
-* mon: add cluster fingerprint (Sage Weil)
-* mon: avoid creating unnecessary rule on pool create (#9304 Loic Dachary)
-* mon: do not spam log (Aanchal Agrawal, Sage Weil)
-* mon: fix 'osd perf' reported latency (#9269 Samuel Just)
-* mon: fix double-free of old MOSDBoot (Sage Weil)
-* mon: fix op write latency perfcounter (#9217 Xinxin Shu)
-* mon: fix store check on startup (Joao Eduardo Luis)
-* mon: make paxos transaction commits asynchronous (Sage Weil)
-* mon: preload erasure plugins (#9153 Loic Dachary)
-* mon: prevent cache pools from being used directly by CephFS (#9435 John Spray)
-* mon: use user-provided ruleset for replicated pool (Xiaoxi Chen)
-* mon: verify available disk space on startup (#9502 Joao Eduardo Luis)
-* mon: verify erasure plugin version on load (Loic Dachary)
-* msgr: fix logged address (Yongyue Sun)
-* osd: account for hit_set_archive bytes (Sage Weil)
-* osd: add ISA erasure plugin table cache (Andreas-Joachim Peters)
-* osd: add ability to prehash filestore directories (Guang Yang)
-* osd: add feature bit for erasure plugins (Loic Dachary)
-* osd: add local recovery code (LRC) erasure plugin (Loic Dachary)
-* osd: cap hit_set size (#9339 Samuel Just)
-* osd: clear FDCache on unlink (#8914 Loic Dachary)
-* osd: do not evict blocked objects (#9285 Zhiqiang Wang)
-* osd: fix ISA erasure alignment (Loic Dachary, Andreas-Joachim Peters)
-* osd: fix clone vs cache_evict bug (#8629 Sage Weil)
-* osd: fix crash from duplicate backfill reservation (#8863 Sage Weil)
-* osd: fix dead peer connection checks (#9295 Greg Farnum, Sage Weil)
-* osd: fix keyvaluestore scrub (#8589 Haomai Wang)
-* osd: fix keyvaluestore upgrade (Haomai Wang)
-* osd: fix min_read_recency_for_promote default on upgrade (Zhiqiang Wang)
-* osd: fix mount/remount sync race (#9144 Sage Weil)
-* osd: fix purged_snap initialization on backfill (Sage Weil, Samuel Just, Dan van der Ster, Florian Haas)
-* osd: fix race condition on object deletion (#9480 Somnath Roy)
-* osd: fix snap object writeback from cache tier (#9054 Samuel Just)
-* osd: improve journal shutdown (Ma Jianpeng, Mark Kirkwood)
-* osd: improve locking in OpTracker (Pavan Rallabhandi, Somnath Roy)
-* osd: improve tiering agent arithmetic (Zhiqiang Wang, Sage Weil, Samuel Just)
-* osd: lttng tracepoints for filestore (Noah Watkins)
-* osd: make blacklist encoding deterministic (#9211 Sage Weil)
-* osd: many many important fixes (#8231 #8315 #9113 #9179 #9293 #9294 #9326 #9453 #9481 #9482 #9497 #9574 Samuel Just)
-* osd: misc erasure code plugin fixes (Loic Dachary)
-* osd: preload erasure plugins (#9153 Loic Dachary)
-* osd: shard OpTracker to improve performance (Somnath Roy)
-* osd: use local time for tiering decisions (Zhiqiang Wang)
-* osd: verify erasure plugin version on load (Loic Dachary)
-* rados: fix bench write arithmetic (Jiangheng)
-* rbd: parallelize rbd import, export (Jason Dillaman)
-* rbd: rbd-replay utility to replay captured rbd workload traces (Adam Crume)
-* rbd: use write-back (not write-through) when caching is enabled (Jason Dillaman)
-* rgw: add S3 bucket get location operation (Abhishek Lekshmanan)
-* rgw: add civetweb as default frontent on port 7490 (#9013 Yehuda Sadeh)
-* rgw: allow : in S3 access key (Roman Haritonov)
-* rgw: fix admin create user op (#8583 Ray Lv)
-* rgw: fix log filename suffix (#9353 Alexandre Marangone)
-* rgw: fix usage (Abhishek Lekshmanan)
-* rgw: many fixes for civetweb (Yehuda Sadeh)
-* rgw: subuser creation fixes (#8587 Yehuda Sadeh)
-* rgw: use systemd-run from sysvinit script (JuanJose Galvez)
-* unit test improvements (Loic Dachary)
-* vstart.sh: fix/improve rgw support (Luis Pabon, Abhishek Lekshmanan)
-
-v0.85
-=====
-
-This is the second-to-last development release before Giant that
-contains new functionality.  The big items to land during this cycle
-are the messenger refactoring from Matt Benjmain that lays some
-groundwork for RDMA support, a performance improvement series from
-SanDisk that improves performance on SSDs, lots of improvements to our
-new standalone civetweb-based RGW frontend, and a new 'osd blocked-by'
-mon command that allows admins to easily identify which OSDs are
-blocking peering progress.  The other big change is that the OSDs and
-Monitors now distinguish between "misplaced" and "degraded" objects:
-the latter means there are fewer copies than we'd like, while the
-former simply means the are not stored in the locations where we want
-them to be.
-
-Also of note is a change to librbd that enables client-side caching by
-default.  This is coupled with another option that makes the cache
-write-through until a "flush" operations is observed: this implies
-that the librbd user (usually a VM guest OS) supports barriers and
-flush and that it is safe for the cache to switch into writeback mode
-without compromising data safety or integrity.  It has long been
-recommended practice that these options be enabled (e.g., in OpenStack
-environments) but until now it has not been the default.
-
-We have frozen the tree for the looming Giant release, and the next
-development release will be a release candidate with a final batch of
-new functionality.
-
-Upgrading
----------
-
-* The client-side caching for librbd is now enabled by default (rbd
-  cache = true).  A safety option (rbd cache writethrough until flush
-  = true) is also enabled so that writeback caching is not used until
-  the library observes a 'flush' command, indicating that the librbd
-  users is passing that operation through from the guest VM.  This
-  avoids potential data loss when used with older versions of qemu
-  that do not support flush.
-
-    leveldb_write_buffer_size = 32*1024*1024  = 33554432  // 32MB
-    leveldb_cache_size        = 512*1024*1204 = 536870912 // 512MB
-    leveldb_block_size        = 64*1024       = 65536     // 64KB
-    leveldb_compression       = false
-    leveldb_log               = ""
-
-  OSDs will still maintain the following osd-specific defaults:
-
-    leveldb_log               = ""
-
-* The 'rados getxattr ...' command used to add a gratuitous newline to the attr
-  value; it now does not.
-
-Notable Changes
----------------
-
-* ceph-disk: do not inadvertantly create directories (Owne Synge)
-* ceph-disk: fix dmcrypt support (Sage Weil)
-* ceph-disk: linter cleanup, logging improvements (Alfredo Deza)
-* ceph-disk: show information about dmcrypt in 'ceph-disk list' output (Sage Weil)
-* ceph-disk: use partition type UUIDs and blkid (Sage Weil)
-* ceph: fix for non-default cluster names (#8944, Dan Mick)
-* doc: document new upstream wireshark dissector (Kevin Cox)
-* doc: many install doc updates (John Wilkins)
-* librados: fix lock leaks in error paths (#9022, Paval Rallabhandi)
-* librados: fix pool existence check (#8835, Pavan Rallabhandi)
-* librbd: enable caching by default (Sage Weil)
-* librbd: fix crash using clone of flattened image (#8845, Josh Durgin)
-* librbd: store and retrieve snapshot metadata based on id (Josh Durgin)
-* mailmap: many updates (Loic Dachary)
-* mds: add min/max UID for snapshot creation/deletion (#9029, Wido den Hollander)
-* misc build errors/warnings for Fedora 20 (Boris Ranto)
-* mon: add 'osd blocked-by' command to easily see which OSDs are blocking peering progress (Sage Weil)
-* mon: add perfcounters for paxos operations (Sage Weil)
-* mon: create default EC profile if needed (Loic Dachary)
-* mon: fix crash on loopback messages and paxos timeouts (#9062, Sage Weil)
-* mon: fix divide by zero when pg_num is adjusted before OSDs are added (#9101, Sage Weil)
-* mon: fix occasional memory leak after session reset (#9176, Sage Weil)
-* mon: fix ruleset/ruleid bugs (#9044, Loic Dachary)
-* mon: make usage dumps in terms of bytes, not kB (Sage Weil)
-* mon: prevent implicit destruction of OSDs with 'osd setmaxosd ...' (#8865, Anand Bhat)
-* mon: verify all quorum members are contiguous at end of Paxos round (#9053, Sage Weil)
-* msgr: refactor to cleanly separate SimpleMessenger implemenetation, move toward Connection-based calls (Matt Benjamin, Sage Wei)
-* objectstore: clean up KeyValueDB interface for key/value backends (Sage Weil)
-* osd: add local_mtime for use by cache agent (Zhiqiang Wang)
-* osd: add superblock for KeyValueStore backend (Haomai Wang)
-* osd: add support for Intel ISA-L erasure code library (Andreas-Joachim Peters)
-* osd: do not skip promote for write-ordered reads (#9064, Samuel Just)
-* osd: fix ambigous encoding order for blacklisted clients (#9211, Sage Weil)
-* osd: fix cache flush corner case for snapshotted objects (#9054, Samuel Just)
-* osd: fix discard of old/obsolete subop replies (#9259, Samuel Just)
-* osd: fix discard of peer messages from previous intervals (Greg Farnum)
-* osd: fix dump of open fds on EMFILE (Sage Weil)
-* osd: fix journal dump (Ma Jianpeng)
-* osd: fix mon feature bit requirements bug and resulting log spam (Sage Weil)
-* osd: fix recovery chunk size usage during EC recovery (Ma Jianpeng)
-* osd: fix recovery reservation deadlock for EC pools (Samuel Just)
-* osd: fix removal of old xattrs when overwriting chained xattrs (Ma Jianpeng)
-* osd: fix requesting queueing on PG split (Samuel Just)
-* osd: force new xattrs into leveldb if fs returns E2BIG (#7779, Sage Weil)
-* osd: implement alignment on chunk sizes (Loic Dachary)
-* osd: improve prioritization of recovery of degraded over misplaced objects (Sage Weil)
-* osd: locking, sharding, caching improvements in FileStore's FDCache (Somnath Roy, Greg Farnum)
-* osd: many important bug fixes (Samuel Just)
-* osd, mon: add rocksdb support (Xinxin Shu, Sage Weil)
-* osd, mon: distinguish between "misplaced" and "degraded" objects in cluster health and PG state reporting (Sage Weil)
-* osd: refactor some ErasureCode functionality into command parent class (Loic Dachary)
-* osd: set rollback_info_completed on create (#8625, Samuel Just)
-* rados: allow setxattr value to be read from stdin (Sage Weil)
-* rados: drop gratuitous \n from getxattr command (Sage Weil)
-* rgw: add --min-rewrite-stripe-size for object restriper (Yehuda Sadeh)
-* rgw: add powerdns hook for dynamic DNS for global clusters (Wido den Hollander)
-* rgw: copy object data is target bucket is in a different pool (#9039, Yehuda Sadeh)
-* rgw: do not try to authenticate CORS preflight requests (#8718, Robert Hubbard, Yehuda Sadeh)
-* rgw: fix civetweb URL decoding (#8621, Yehuda Sadeh)
-* rgw: fix removal of objects during object creation (Patrycja Szablowska, Yehuda Sadeh)
-* rgw: fix striping for copied objects (#9089, Yehuda Sadeh)
-* rgw: fix test for identify whether an object has a tail (#9226, Yehuda Sadeh)
-* rgw: fix when stripe size is not a multiple of chunk size (#8937, Yehuda Sadeh)
-* rgw: improve civetweb logging (Yehuda Sadeh)
-* rgw: misc civetweb frontend fixes (Yehuda Sadeh)
-* sysvinit: add support for non-default cluster names (Alfredo Deza)
-
-
-v0.84
-=====
-
-The next Ceph development release is here!  This release contains
-several meaty items, including some MDS improvements for journaling,
-the ability to remove the CephFS file system (and name it), several
-mon cleanups with tiered pools, several OSD performance branches, a
-new "read forward" RADOS caching mode, a prototype Kinetic OSD
-backend, and various radosgw improvements (especially with the new
-standalone civetweb frontend).  And there are a zillion OSD bug
-fixes. Things are looking pretty good for the Giant release that is
-coming up in the next month.
-
-Upgrading
----------
-
-* The ``*_kb perf`` counters on the monitor have been removed.  These are
-  replaced with a new set of ``*_bytes`` counters (e.g., ``cluster_osd_kb`` is
-  replaced by ``cluster_osd_bytes``).
-
-* The ``rd_kb`` and ``wr_kb`` fields in the JSON dumps for pool stats (accessed
-  via the ``ceph df detail -f json-pretty`` and related commands) have been
-  replaced with corresponding ``*_bytes`` fields.  Similarly, the
-  ``total_space``, ``total_used``, and ``total_avail`` fields are replaced with
-  ``total_bytes``, ``total_used_bytes``,  and ``total_avail_bytes`` fields.
-
-* The ``rados df --format=json`` output ``read_bytes`` and ``write_bytes``
-  fields were incorrectly reporting ops; this is now fixed.
-
-* The ``rados df --format=json`` output previously included ``read_kb`` and
-  ``write_kb`` fields; these have been removed.  Please use ``read_bytes`` and
-  ``write_bytes`` instead (and divide by 1024 if appropriate).
-
-Notable Changes
----------------
-
-* ceph-conf: flush log on exit (Sage Weil)
-* ceph-dencoder: refactor build a bit to limit dependencies (Sage Weil, Dan Mick)
-* ceph.spec: split out ceph-common package, other fixes (Sandon Van Ness)
-* ceph_test_librbd_fsx: fix RNG, make deterministic (Ilya Dryomov)
-* cephtool: refactor and improve CLI tests (Joao Eduardo Luis)
-* client: improved MDS session dumps (John Spray)
-* common: fix dup log messages (#9080, Sage Weil)
-* crush: include new tunables in dump (Sage Weil)
-* crush: only require rule features if the rule is used (#8963, Sage Weil)
-* crushtool: send output to stdout, not stderr (Wido den Hollander)
-* fix i386 builds (Sage Weil)
-* fix struct vs class inconsistencies (Thorsten Behrens)
-* hadoop: update hadoop tests for Hadoop 2.0 (Haumin Chen)
-* librbd, ceph-fuse: reduce cache flush overhead (Haomai Wang)
-* librbd: fix error path when opening image (#8912, Josh Durgin)
-* mds: add file system name, enabled flag (John Spray)
-* mds: boot refactor, cleanup (John Spray)
-* mds: fix journal conversion with standby-replay (John Spray)
-* mds: separate inode recovery queue (John Spray)
-* mds: session ls, evict commands (John Spray)
-* mds: submit log events in async thread (Yan, Zheng)
-* mds: use client-provided timestamp for user-visible file metadata (Yan, Zheng)
-* mds: validate journal header on load and save (John Spray)
-* misc build fixes for OS X (John Spray)
-* misc integer size cleanups (Kevin Cox)
-* mon: add get-quota commands (Joao Eduardo Luis)
-* mon: do not create file system by default (John Spray)
-* mon: fix 'ceph df' output for available space (Xiaoxi Chen)
-* mon: fix bug when no auth keys are present (#8851, Joao Eduardo Luis)
-* mon: fix compat version for MForward (Joao Eduardo Luis)
-* mon: restrict some pool properties to tiered pools (Joao Eduardo Luis)
-* msgr: misc locking fixes for fast dispatch (#8891, Sage Weil)
-* osd: add 'dump_reservations' admin socket command (Sage Weil)
-* osd: add READFORWARD caching mode (Luis Pabon)
-* osd: add header cache for KeyValueStore (Haomai Wang)
-* osd: add prototype KineticStore based on Seagate Kinetic (Josh Durgin)
-* osd: allow map cache size to be adjusted at runtime (Sage Weil)
-* osd: avoid refcounting overhead by passing a few things by ref (Somnath Roy)
-* osd: avoid sharing PG info that is not durable (Samuel Just)
-* osd: clear slow request latency info on osd up/down (Sage Weil)
-* osd: fix PG object listing/ordering bug (Guang Yang)
-* osd: fix PG stat errors with tiering (#9082, Sage Weil)
-* osd: fix bug with long object names and rename (#8701, Sage Weil)
-* osd: fix cache full -> not full requeueing (#8931, Sage Weil)
-* osd: fix gating of messages from old OSD instances (Greg Farnum)
-* osd: fix memstore bugs with collection_move_rename, lock ordering (Sage Weil)
-* osd: improve locking for KeyValueStore (Haomai Wang)
-* osd: make tiering behave if hit_sets aren't enabled (Sage Weil)
-* osd: mark pools with incomplete clones (Sage Weil)
-* osd: misc locking fixes for fast dispatch (Samuel Just, Ma Jianpeng)
-* osd: prevent old rados clients from using tiered pools (#8714, Sage Weil)
-* osd: reduce OpTracker overhead (Somnath Roy)
-* osd: set configurable hard limits on object and xattr names (Sage Weil, Haomai Wang)
-* osd: trim old EC objects quickly; verify on scrub (Samuel Just)
-* osd: work around GCC 4.8 bug in journal code (Matt Benjamin)
-* rados bench: fix arg order (Kevin Dalley)
-* rados: fix {read,write}_ops values for df output (Sage Weil)
-* rbd: add rbdmap pre- and post post- hooks, fix misc bugs (Dmitry Smirnov)
-* rbd: improve option default behavior (Josh Durgin)
-* rgw: automatically align writes to EC pool (#8442, Yehuda Sadeh)
-* rgw: fix crash on swift CORS preflight request (#8586, Yehuda Sadeh)
-* rgw: fix memory leaks (Andrey Kuznetsov)
-* rgw: fix multipart upload (#8846, Silvain Munaut, Yehuda Sadeh)
-* rgw: improve -h (Abhishek Lekshmanan)
-* rgw: improve delimited listing of bucket, misc fixes (Yehuda Sadeh)
-* rgw: misc civetweb fixes (Yehuda Sadeh)
-* rgw: powerdns backend for global namespaces (Wido den Hollander)
-* systemd: initial systemd config files (Federico Simoncelli)
-
-
-v0.83
-=====
-
-Another Ceph development release!  This has been a longer cycle, so
-there has been quite a bit of bug fixing and stabilization in this
-round.  There is also a bunch of packaging fixes for RPM distros
-(RHEL/CentOS, Fedora, and SUSE) and for systemd.  We've also added a new
-librados-striper library from Sebastien Ponce that provides a generic
-striping API for applications to code to.
-
-Upgrading
----------
-
-* The experimental keyvaluestore-dev OSD backend had an on-disk format
-  change that prevents existing OSD data from being upgraded.  This
-  affects developers and testers only.
-
-* mon-specific and osd-specific leveldb options have been removed.
-  From this point onward users should use the `leveldb_*` generic
-  options and add the options in the appropriate sections of their
-  configuration files.  Monitors will still maintain the following
-  monitor-specific defaults:
-
-    leveldb_write_buffer_size = 32*1024*1024  = 33554432  // 32MB
-    leveldb_cache_size        = 512*1024*1204 = 536870912 // 512MB
-    leveldb_block_size        = 64*1024       = 65536     // 64KB
-    leveldb_compression       = false
-    leveldb_log               = ""
-
-  OSDs will still maintain the following osd-specific defaults:
-
-    leveldb_log               = ""
-
-Notable Changes
----------------
-
-* ceph-disk: fix dmcrypt support (Stephen Taylor)
-* cephtool: fix help (Yilong Zhao)
-* cephtool: test cleanup (Joao Eduardo Luis)
-* doc: librados example fixes (Kevin Dalley)
-* doc: many doc updates (John Wilkins)
-* doc: update erasure docs (Loic Dachary, Venky Shankar)
-* filestore: disable use of XFS hint (buggy on old kernels) (Samuel Just)
-* filestore: fix xattr spillout (Greg Farnum, Haomai Wang)
-* keyvaluestore: header cache (Haomai Wang)
-* librados_striper: striping library for librados (Sebastien Ponce)
-* libs3: update to latest (Danny Al-Gaaf)
-* log: fix derr level (Joao Eduardo Luis)
-* logrotate: fix osd log rotation on ubuntu (Sage Weil)
-* mds: fix xattr bug triggered by ACLs (Yan, Zheng)
-* misc memory leaks, cleanups, fixes (Danny Al-Gaaf, Sahid Ferdjaoui)
-* misc suse fixes (Danny Al-Gaaf)
-* misc word size fixes (Kevin Cox)
-* mon: drop mon- and osd- specific leveldb options (Joao Eduardo Luis)
-* mon: ec pool profile fixes (Loic Dachary)
-* mon: fix health down messages (Sage Weil)
-* mon: fix quorum feature check (#8738, Greg Farnum)
-* mon: 'osd crush reweight-subtree ...' (Sage Weil)
-* mon, osd: relax client EC support requirements (Sage Weil)
-* mon: some instrumentation (Sage Weil)
-* objecter: flag operations that are redirected by caching (Sage Weil)
-* osd: clean up shard_id_t, shard_t (Loic Dachary)
-* osd: fix connection reconnect race (Greg Farnum)
-* osd: fix dumps (Joao Eduardo Luis)
-* osd: fix erasure-code lib initialization (Loic Dachary)
-* osd: fix extent normalization (Adam Crume)
-* osd: fix loopback msgr issue (Ma Jianpeng)
-* osd: fix LSB release parsing (Danny Al-Gaaf)
-* osd: improved backfill priorities (Sage Weil)
-* osd: many many core fixes (Samuel Just)
-* osd, mon: config sanity checks on start (Sage Weil, Joao Eduardo Luis)
-* osd: sharded threadpool to improve parallelism (Somnath Roy)
-* osd: simple io prioritization for scrub (Sage Weil)
-* osd: simple scrub throttling (Sage Weil)
-* osd: tests for bench command (Loic Dachary)
-* osd: use xfs hint less frequently (Ilya Dryomov)
-* pybind/rados: fix small timeouts (John Spray)
-* qa: xfstests updates (Ilya Dryomov)
-* rgw: cache bucket info (Yehuda Sadeh)
-* rgw: cache decoded user info (Yehuda Sadeh)
-* rgw: fix multipart object attr regression (#8452, Yehuda Sadeh)
-* rgw: fix radosgw-admin 'show log' command (#8553, Yehuda Sadeh)
-* rgw: fix URL decoding (#8702, Brian Rak)
-* rgw: handle empty extra pool name (Yehuda Sadeh)
-* rpm: do not restart daemons on upgrade (Alfredo Deza)
-* rpm: misc packaging fixes for rhel7 (Sandon Van Ness)
-* rpm: split ceph-common from ceph (Sandon Van Ness)
-* systemd: wrap started daemons in new systemd environment (Sage Weil, Dan Mick)
-* sysvinit: less sensitive to failures (Sage Weil)
-* upstart: increase max open files limit (Sage Weil)
-
-v0.82
-=====
-
-This is the second post-firefly development release.  It includes a range
-of bug fixes and some usability improvements.  There are some MDS debugging
-and diagnostic tools, an improved 'ceph df', and some OSD backend refactoring
-and cleanup.
-
-Notable Changes
----------------
-
-* ceph-brag: add tox tests (Alfredo Deza)
-* common: perfcounters now use atomics and go faster (Sage Weil)
-* doc: CRUSH updates (John Wilkins)
-* doc: osd primary affinity (John Wilkins)
-* doc: pool quotas (John Wilkins)
-* doc: pre-flight doc improvements (Kevin Dalley)
-* doc: switch to an unencumbered font (Ross Turk)
-* doc: update openstack docs (Josh Durgin)
-* fix hppa arch build (Dmitry Smirnov)
-* init-ceph: continue starting other daemons on crush or mount failure (#8343, Sage Weil)
-* keyvaluestore: fix hint crash (#8381, Haomai Wang)
-* libcephfs-java: build against older JNI headers (Greg Farnum)
-* librados: fix rados_pool_list bounds checks (Sage Weil)
-* mds: cephfs-journal-tool (John Spray)
-* mds: improve Journaler on-disk format (John Spray)
-* mds, libcephfs: use client timestamp for mtime/ctime (Sage Weil)
-* mds: misc encoding improvements (John Spray)
-* mds: misc fixes for multi-mds (Yan, Zheng)
-* mds: OPTracker integration, dump_ops_in_flight (Greg Farnum)
-* misc cleanup (Christophe Courtaut)
-* mon: fix default replication pool ruleset choice (#8373, John Spray)
-* mon: fix set cache_target_full_ratio (#8440, Geoffrey Hartz)
-* mon: include per-pool 'max avail' in df output (Sage Weil)
-* mon: prevent EC pools from being used with cephfs (Joao Eduardo Luis)
-* mon: restore original weight when auto-marked out OSDs restart (Sage Weil)
-* mon: use msg header tid for MMonGetVersionReply (Ilya Dryomov)
-* osd: fix bogus assert during OSD shutdown (Sage Weil)
-* osd: fix clone deletion case (#8334, Sam Just)
-* osd: fix filestore removal corner case (#8332, Sam Just)
-* osd: fix hang waiting for osdmap (#8338, Greg Farnum)
-* osd: fix interval check corner case during peering (#8104, Sam Just)
-* osd: fix journal-less operation (Sage Weil)
-* osd: include backend information in metadata reported to mon (Sage Weil)
-* rest-api: fix help (Ailing Zhang)
-* rgw: check entity permission for put_metadata (#8428, Yehuda Sadeh)
-
-
-v0.81
-=====
-
-This is the first development release since Firefly.  It includes a
-lot of work that we delayed merging while stabilizing things.  Lots of
-new functionality, as well as several fixes that are baking a bit before
-getting backported.
-
-Upgrading
----------
-
-* CephFS support for the legacy anchor table has finally been removed.
-  Users with file systems created before firefly should ensure that inodes
-  with multiple hard links are modified *prior* to the upgrade to ensure that
-  the backtraces are written properly.  For example::
-
-    sudo find /mnt/cephfs -type f -links +1 -exec touch \{\} \;
-
-* Disallow nonsensical 'tier cache-mode' transitions.  From this point
-  onward, 'writeback' can only transition to 'forward' and 'forward'
-  can transition to 1) 'writeback' if there are dirty objects, or 2) any if
-  there are no dirty objects.
-
-Notable Changes
----------------
-
-* bash completion improvements (Wido den Hollander)
-* brag: fixes, improvements (Loic Dachary)
-* ceph-disk: handle corrupt volumes (Stuart Longlang)
-* ceph-disk: partprobe as needed (Eric Eastman)
-* ceph-fuse, libcephfs: asok hooks for handling session resets, timeouts (Yan, Zheng)
-* ceph-fuse, libcephfs: improve traceless reply handling (Sage Weil)
-* clang build fixes (John Spray, Danny Al-Gaaf)
-* config: support G, M, K, etc. suffixes (Joao Eduardo Luis)
-* coverity cleanups (Danny Al-Gaaf)
-* doc: cache tiering (John Wilkins)
-* doc: keystone integration docs (John Wilkins)
-* doc: updated simple configuration guides (John Wilkins)
-* libcephfs-java: fix gcj-jdk build (Dmitry Smirnov)
-* librbd: check error code on cache invalidate (Josh Durgin)
-* librbd: new libkrbd library for kernel map/unmap/showmapped (Ilya Dryomov)
-* Makefile: fix out of source builds (Stefan Eilemann)
-* mds: multi-mds fixes (Yan, Zheng)
-* mds: remove legacy anchor table (Yan, Zheng)
-* mds: remove legacy discover ino (Yan, Zheng)
-* monclient: fix hang (Sage Weil)
-* mon: prevent nonsensical cache-mode transitions (Joao Eduardo Luis)
-* msgr: avoid big lock when sending (most) messages (Greg Farnum)
-* osd: bound osdmap epoch skew between PGs (Sage Weil)
-* osd: cache tier flushing fixes for snapped objects (Samuel Just)
-* osd: fix agent early finish looping (David Zafman)
-* osd: fix flush vs OpContext (Samuel Just)
-* osd: fix MarkMeDown and other shutdown races (Sage Weil)
-* osd: fix scrub vs cache bugs (Samuel Just)
-* osd: fix trim of hitsets (Sage Weil)
-* osd, msgr: fast-dispatch of OSD ops (Greg Farnum, Samuel Just)
-* osd, objecter: resend ops on last_force_op_resend barrier; fix cache overlay op ordering (Sage Weil)
-* osd: remove obsolete classic scrub code (David Zafman)
-* osd: scrub PGs with invalid stats (Sage Weil)
-* osd: simple snap trimmer throttle (Sage Weil)
-* osd: use FIEMAP to inform copy_range (Haomai Wang)
-* rbd-fuse: allow exposing single image (Stephen Taylor)
-* rbd-fuse: fix unlink (Josh Durgin)
-* removed mkcephfs (deprecated since dumpling)
-* rgw: bucket link uses instance id (Yehuda Sadeh)
-* rgw: fix memory leak following chunk read error (Yehuda Sadeh)
-* rgw: fix URL escaping (Yehuda Sadeh)
-* rgw: fix user manifest (Yehuda Sadeh)
-* rgw: object and bucket rewrite functions to allow restriping old objects (Yehuda Sadeh)
-* rgw: prevent multiobject PUT race (Yehuda Sadeh)
-* rgw: send user manifest header (Yehuda Sadeh)
-* test_librbd_fsx: test krbd as well as librbd (Ilya Dryomov)
diff --git a/ceph/doc/releases/hammer.rst b/ceph/doc/releases/hammer.rst
deleted file mode 100644 (file)
index 785d0c2..0000000
+++ /dev/null
@@ -1,2325 +0,0 @@
-======
-Hammer
-======
-
-Hammer is the 8th stable release of Ceph.  It is named after the
-hammer octopus (Octopus australis).
-
-v0.94.10 Hammer
-===============
-
-This Hammer point release fixes several bugs and adds two new features.
-
-We recommend that all hammer v0.94.x users upgrade.
-
-For more detailed information, see :download:`the complete changelog <../changelog/v0.94.10.txt>`.
-
-New Features
-------------
-
-ceph-objectstore-tool and ceph-monstore-tool now enable user to
-rebuild the monitor database from OSDs. (This feature is especially useful when
-all monitors fail to boot due to leveldb corruption.)
-
-In RADOS Gateway, it is now possible to reshard an existing bucket's index
-using an off-line tool.
-
-Usage:
-
-$ radosgw-admin bucket reshard --bucket=<bucket_name> --num_shards=<num_shards>
-
-This will create a new linked bucket instance that points to the newly created
-index objects. The old bucket instance still exists and currently it's up to
-the user to manually remove the old bucket index objects. (Note that bucket
-resharding currently requires that all IO (especially writes) to the specific
-bucket is quiesced.)
-
-Other Notable Changes
----------------------
-
-* build/ops: ceph-create-keys loops forever (`issue#17753 <http://tracker.ceph.com/issues/17753>`_, `pr#12805 <http://github.com/ceph/ceph/pull/12805>`_, Alfredo Deza)
-* build/ops: improve ceph.in error message (`issue#11101 <http://tracker.ceph.com/issues/11101>`_, `pr#10905 <http://github.com/ceph/ceph/pull/10905>`_, Kefu Chai)
-* build/ops: make stop.sh more portable (`issue#16918 <http://tracker.ceph.com/issues/16918>`_, `pr#10569 <http://github.com/ceph/ceph/pull/10569>`_, Mykola Golub)
-* build/ops: remove SYSTEMD_RUN from initscript (`issue#16440 <http://tracker.ceph.com/issues/16440>`_, `issue#7627 <http://tracker.ceph.com/issues/7627>`_, `pr#9873 <http://github.com/ceph/ceph/pull/9873>`_, Vladislav Odintsov)
-* cephx: Fix multiple segfaults due to attempts to encrypt or decrypt (`issue#16266 <http://tracker.ceph.com/issues/16266>`_, `pr#11930 <http://github.com/ceph/ceph/pull/11930>`_, Brad Hubbard)
-* common: SIGABRT in TrackedOp::dump() via dump_ops_in_flight() (`issue#8885 <http://tracker.ceph.com/issues/8885>`_, `pr#12121 <http://github.com/ceph/ceph/pull/12121>`_, Jianpeng Ma, Zhiqiang Wang, David Zafman)
-* common: os/ObjectStore: fix _update_op for split dest_cid (`issue#15345 <http://tracker.ceph.com/issues/15345>`_, `pr#12071 <http://github.com/ceph/ceph/pull/12071>`_, Sage Weil)
-* crush: reset bucket->h.items[i] when removing tree item (`issue#16525 <http://tracker.ceph.com/issues/16525>`_, `pr#10724 <http://github.com/ceph/ceph/pull/10724>`_, Kefu Chai)
-* doc: add "Upgrading to Hammer" section (`issue#17386 <http://tracker.ceph.com/issues/17386>`_, `pr#11372 <http://github.com/ceph/ceph/pull/11372>`_, Kefu Chai)
-* doc: add orphan options to radosgw-admin --help and man page (`issue#17281 <http://tracker.ceph.com/issues/17281>`_, `issue#17280 <http://tracker.ceph.com/issues/17280>`_, `pr#11140 <http://github.com/ceph/ceph/pull/11140>`_, Abhishek Lekshmanan, Casey Bodley, Ken Dreyer, Thomas Serlin)
-* doc: clarify that RGW bucket object versioning is supported (`issue#16574 <http://tracker.ceph.com/issues/16574>`_, `pr#10437 <http://github.com/ceph/ceph/pull/10437>`_, Yuan Zhou, shawn chen)
-* librados: bad flags can crash the osd (`issue#16012 <http://tracker.ceph.com/issues/16012>`_, `pr#11936 <http://github.com/ceph/ceph/pull/11936>`_, Jianpeng Ma, Sage Weil)
-* librbd: ceph 10.2.2 rbd status on image format 2 returns "(2) No such file or directory" (`issue#16887 <http://tracker.ceph.com/issues/16887>`_, `pr#10987 <http://github.com/ceph/ceph/pull/10987>`_, Jason Dillaman)
-* librbd: diffs to clone's first snapshot should include parent diffs (`issue#18068 <http://tracker.ceph.com/issues/18068>`_, `pr#12446 <http://github.com/ceph/ceph/pull/12446>`_, Jason Dillaman)
-* librbd: image.stat() call in librbdpy fails sometimes (`issue#17310 <http://tracker.ceph.com/issues/17310>`_, `pr#11949 <http://github.com/ceph/ceph/pull/11949>`_, Jason Dillaman)
-* librbd: request exclusive lock if current owner cannot execute op (`issue#16171 <http://tracker.ceph.com/issues/16171>`_, `pr#12018 <http://github.com/ceph/ceph/pull/12018>`_, Mykola Golub)
-* mds: fix cephfs-java ftruncate unit test failure (`issue#11258 <http://tracker.ceph.com/issues/11258>`_, `pr#11939 <http://github.com/ceph/ceph/pull/11939>`_, Yan, Zheng)
-* mon: %USED of ceph df is wrong (`issue#16933 <http://tracker.ceph.com/issues/16933>`_, `pr#11934 <http://github.com/ceph/ceph/pull/11934>`_, Kefu Chai)
-* mon: MonmapMonitor should return success when MON will be removed (`issue#17725 <http://tracker.ceph.com/issues/17725>`_, `pr#12006 <http://github.com/ceph/ceph/pull/12006>`_, Joao Eduardo Luis)
-* mon: OSDMonitor: Missing nearfull flag set (`issue#17390 <http://tracker.ceph.com/issues/17390>`_, `pr#11273 <http://github.com/ceph/ceph/pull/11273>`_, Igor Podoski)
-* mon: OSDs marked OUT wrongly after monitor failover (`issue#17719 <http://tracker.ceph.com/issues/17719>`_, `pr#11946 <http://github.com/ceph/ceph/pull/11946>`_, Dong Wu)
-* mon: fix memory leak in prepare_beacon (`issue#17285 <http://tracker.ceph.com/issues/17285>`_, `pr#10238 <http://github.com/ceph/ceph/pull/10238>`_, Igor Podoski)
-* mon: osd flag health message is misleading (`issue#18175 <http://tracker.ceph.com/issues/18175>`_, `pr#12687 <http://github.com/ceph/ceph/pull/12687>`_, Sage Weil)
-* mon: prepare_pgtemp needs to only update up_thru if newer than the existing one (`issue#16185 <http://tracker.ceph.com/issues/16185>`_, `pr#11937 <http://github.com/ceph/ceph/pull/11937>`_, Samuel Just)
-* mon: return size_t from MonitorDBStore::Transaction::size() (`issue#14217 <http://tracker.ceph.com/issues/14217>`_, `pr#10904 <http://github.com/ceph/ceph/pull/10904>`_, Kefu Chai)
-* mon: send updated monmap to its subscribers (`issue#17558 <http://tracker.ceph.com/issues/17558>`_, `pr#11457 <http://github.com/ceph/ceph/pull/11457>`_, Kefu Chai)
-* msgr: OpTracker needs to release the message throttle in _unregistered (`issue#14248 <http://tracker.ceph.com/issues/14248>`_, `pr#11938 <http://github.com/ceph/ceph/pull/11938>`_, Samuel Just)
-* msgr: simple/Pipe: error decoding addr (`issue#18072 <http://tracker.ceph.com/issues/18072>`_, `pr#12266 <http://github.com/ceph/ceph/pull/12266>`_, Sage Weil)
-* osd: PG::_update_calc_stats wrong for CRUSH_ITEM_NONE up set items (`issue#16998 <http://tracker.ceph.com/issues/16998>`_, `pr#11933 <http://github.com/ceph/ceph/pull/11933>`_, Samuel Just)
-* osd: PG::choose_acting valgrind error or ./common/hobject.h: 182: FAILED assert(!max || (\*this == hobject_t(hobject_t::get_max()))) (`issue#13967 <http://tracker.ceph.com/issues/13967>`_, `pr#11932 <http://github.com/ceph/ceph/pull/11932>`_, Tao Chang)
-* osd: ReplicatedBackend::build_push_op: add a second config to limit omap entries/chunk independently of object data (`issue#16128 <http://tracker.ceph.com/issues/16128>`_, `pr#12417 <http://github.com/ceph/ceph/pull/12417>`_, Wanlong Gao)
-* osd: crash on EIO during deep-scrubbing (`issue#16034 <http://tracker.ceph.com/issues/16034>`_, `pr#11935 <http://github.com/ceph/ceph/pull/11935>`_, Nathan Cutler)
-* osd: filestore: FALLOC_FL_PUNCH_HOLE must be used with FALLOC_FL_KEEP_SIZE (`issue#18446 <http://tracker.ceph.com/issues/18446>`_, `pr#13041 <http://github.com/ceph/ceph/pull/13041>`_, xinxin shu)
-* osd: fix cached_removed_snaps bug in PGPool::update after map gap (`issue#18628 <http://tracker.ceph.com/issues/18628>`_, `issue#15943 <http://tracker.ceph.com/issues/15943>`_, `pr#12906 <http://github.com/ceph/ceph/pull/12906>`_, Samuel Just)
-* osd: fix collection_list shadow return value (`issue#17713 <http://tracker.ceph.com/issues/17713>`_, `pr#11927 <http://github.com/ceph/ceph/pull/11927>`_, Haomai Wang)
-* osd: fix fiemap issue in xfs when #extents > 1364 (`issue#17610 <http://tracker.ceph.com/issues/17610>`_, `pr#11615 <http://github.com/ceph/ceph/pull/11615>`_, Kefu Chai, Ning Yao)
-* osd: update PGPool to detect map gaps and reset cached_removed_snaps (`issue#15943 <http://tracker.ceph.com/issues/15943>`_, `pr#11676 <http://github.com/ceph/ceph/pull/11676>`_, Samuel Just)
-* rbd: export diff should open image as read-only (`issue#17671 <http://tracker.ceph.com/issues/17671>`_, `pr#11948 <http://github.com/ceph/ceph/pull/11948>`_, liyankun)
-* rbd: fix parameter check (`issue#18237 <http://tracker.ceph.com/issues/18237>`_, `pr#12312 <http://github.com/ceph/ceph/pull/12312>`_, Yankun Li)
-* rbd: fix possible rbd data corruption (`issue#16002 <http://tracker.ceph.com/issues/16002>`_, `pr#11618 <http://github.com/ceph/ceph/pull/11618>`_, Yan, Zheng, Greg Farnum)
-* rgw: Anonymous user is able to read bucket with authenticated read ACL (`issue#13207 <http://tracker.ceph.com/issues/13207>`_, `pr#11045 <http://github.com/ceph/ceph/pull/11045>`_, rahul.1aggarwal@gmail.com)
-* rgw: COPY broke multipart files uploaded under dumpling (`issue#16435 <http://tracker.ceph.com/issues/16435>`_, `pr#11950 <http://github.com/ceph/ceph/pull/11950>`_, Yehuda Sadeh)
-* rgw: TempURL in radosgw behaves now like its Swift's counterpart.  (`issue#18316 <http://tracker.ceph.com/issues/18316>`_, `pr#12619 <http://github.com/ceph/ceph/pull/12619>`_, Radoslaw Zarzynski)
-* rgw: default quota fixes (`issue#16410 <http://tracker.ceph.com/issues/16410>`_, `pr#10839 <http://github.com/ceph/ceph/pull/10839>`_, Pavan Rallabhandi, Daniel Gryniewicz)
-* rgw: do not abort when accept a CORS request with short origin (`issue#18187 <http://tracker.ceph.com/issues/18187>`_, `pr#12398 <http://github.com/ceph/ceph/pull/12398>`_, LiuYang)
-* rgw: do not omap_getvals with (u64)-1 max (`issue#17985 <http://tracker.ceph.com/issues/17985>`_, `pr#12418 <http://github.com/ceph/ceph/pull/12418>`_, Yehuda Sadeh, Sage Weil)
-* rgw: fix crash when client posts object with null condition (`issue#17635 <http://tracker.ceph.com/issues/17635>`_, `pr#11809 <http://github.com/ceph/ceph/pull/11809>`_, Yehuda Sadeh)
-* rgw: fix inconsistent uid/email handling in radosgw-admin (`issue#13598 <http://tracker.ceph.com/issues/13598>`_, `pr#11952 <http://github.com/ceph/ceph/pull/11952>`_, Matt Benjamin)
-* rgw: implement offline resharding command (`issue#17745 <http://tracker.ceph.com/issues/17745>`_, `pr#12227 <http://github.com/ceph/ceph/pull/12227>`_, Yehuda Sadeh, Orit Wasserman, weiqiaomiao)
-* rgw: swift: ranged request on a DLO provides wrong values in Content-Range HTTP header (`issue#13452 <http://tracker.ceph.com/issues/13452>`_, `pr#11951 <http://github.com/ceph/ceph/pull/11951>`_, Radoslaw Zarzynski)
-* rgw: the value of total_time is wrong in the result of 'radosgw-admin log show' opt (`issue#17598 <http://tracker.ceph.com/issues/17598>`_, `pr#11899 <http://github.com/ceph/ceph/pull/11899>`_, weiqiaomiao)
-* tests: Cannot clone ceph/s3-tests.git (missing branch) (`issue#18384 <http://tracker.ceph.com/issues/18384>`_, `pr#12744 <http://github.com/ceph/ceph/pull/12744>`_, Orit Wasserman)
-* tests: Cannot reserve CentOS 7.2 smithi machines (`issue#18401 <http://tracker.ceph.com/issues/18401>`_, `pr#12762 <http://github.com/ceph/ceph/pull/12762>`_, Nathan Cutler)
-* tests: OSDs commit suicide in rbd suite when testing on btrfs (`issue#18397 <http://tracker.ceph.com/issues/18397>`_, `pr#12758 <http://github.com/ceph/ceph/pull/12758>`_, Nathan Cutler)
-* tests: Workunits needlessly wget from git.ceph.com (`issue#18336 <http://tracker.ceph.com/issues/18336>`_, `issue#18271 <http://tracker.ceph.com/issues/18271>`_, `issue#18388 <http://tracker.ceph.com/issues/18388>`_, `pr#12685 <http://github.com/ceph/ceph/pull/12685>`_, Sage Weil, Nathan Cutler)
-* tests: cephfs test failures (ceph.com/qa is broken, should be download.ceph.com/qa) (`issue#18574 <http://tracker.ceph.com/issues/18574>`_, `pr#13022 <http://github.com/ceph/ceph/pull/13022>`_, John Spray)
-* tests: merge ceph-qa-suite (`pr#12455 <http://github.com/ceph/ceph/pull/12455>`_, Sage Weil)
-* tests: objecter_requests workunit fails on wip branches (`issue#18393 <http://tracker.ceph.com/issues/18393>`_, `pr#12759 <http://github.com/ceph/ceph/pull/12759>`_, Sage Weil)
-* tests: populate mnt_point in qa/tasks/ceph.py (`issue#18383 <http://tracker.ceph.com/issues/18383>`_, `pr#12743 <http://github.com/ceph/ceph/pull/12743>`_, Nathan Cutler)
-* tests: qemu/tests/qemu-iotests/077 fails in dumpling, hammer, and jewel (`issue#10773 <http://tracker.ceph.com/issues/10773>`_, `pr#12423 <http://github.com/ceph/ceph/pull/12423>`_, Jason Dillaman)
-* tests: run fs/thrash on xfs instead of btrfs (`issue#17151 <http://tracker.ceph.com/issues/17151>`_, `pr#13039 <http://github.com/ceph/ceph/pull/13039>`_, Nathan Cutler)
-* tests: update Ubuntu image url after ceph.com refactor (`issue#18542 <http://tracker.ceph.com/issues/18542>`_, `pr#12957 <http://github.com/ceph/ceph/pull/12957>`_, Jason Dillaman)
-* tests: update rbd/singleton/all/formatted-output.yaml to support ceph-ci * (`issue#18440 <http://tracker.ceph.com/issues/18440>`_, `pr#12824 * <http://github.com/ceph/ceph/pull/12824>`_, Venky Shankar, Nathan Cutler)
-* tools: add a tool to rebuild mon store from OSD (`issue#17179 <http://tracker.ceph.com/issues/17179>`_, `issue#17400 <http://tracker.ceph.com/issues/17400>`_, `pr#11125 <http://github.com/ceph/ceph/pull/11125>`_, Kefu Chai, xie xingguo)
-* tools: ceph-objectstore-tool crashes if --journal-path <a-directory> (`issue#17307 <http://tracker.ceph.com/issues/17307>`_, `pr#11929 <http://github.com/ceph/ceph/pull/11929>`_, Kefu Chai)
-* tools: ceph-objectstore-tool: add a way to split filestore directories offline (`issue#17220 <http://tracker.ceph.com/issues/17220>`_, `pr#11253 <http://github.com/ceph/ceph/pull/11253>`_, Josh Durgin)
-* tools: crushtool --compile generates output despite missing item (`issue#17306 <http://tracker.ceph.com/issues/17306>`_, `pr#11931 <http://github.com/ceph/ceph/pull/11931>`_, Kefu Chai)
-
-
-v0.94.9 Hammer
-==============
-
-This Hammer point release fixes a build issue present in 0.94.8 that prevented us
-from generating packages for Ubuntu Precise and CentOS 6.x.
-
-We recommend all users of v0.94.7 or older upgrade.
-
-For more detailed information, see :download:`the complete changelog <../changelog/v0.94.9.txt>`.
-
-Notable Changes
----------------
-
-* build/ops: revert: boost uuid makes valgrind complain (`pr#10913 <http://github.com/ceph/ceph/pull/10913>`_, Sage Weil)
-
-
-v0.94.8 Hammer
-==============
-
-This Hammer point release fixes several bugs.
-
-We recommend that all hammer v0.94.x users upgrade.
-
-For more detailed information, see :download:`the complete changelog <../changelog/v0.94.8.txt>`.
-
-Notable Changes
----------------
-
-* build/ops: rocksdb do not link against tcmalloc if it's disabled (`issue#14799 <http://tracker.ceph.com/issues/14799>`_, `pr#10750 <http://github.com/ceph/ceph/pull/10750>`_, Sage Weil, Kefu Chai)
-* build/ops: Add -D_LARGEFILE64_SOURCE to Linux build. (`issue#16611 <http://tracker.ceph.com/issues/16611>`_, `pr#10182 <http://github.com/ceph/ceph/pull/10182>`_, Ira Cooper)
-* build/ops: boost uuid makes valgrind complain (`issue#12736 <http://tracker.ceph.com/issues/12736>`_, `pr#9741 <http://github.com/ceph/ceph/pull/9741>`_, Sage Weil, Rohan Mars)
-* build/ops: ceph-disk s/by-parttype-uuid/by-parttypeuuid/ (`issue#15867 <http://tracker.ceph.com/issues/15867>`_, `pr#9107 <http://github.com/ceph/ceph/pull/9107>`_, Nathan Cutler)
-* common: add units to rados bench output and clean up formatting (`issue#12248 <http://tracker.ceph.com/issues/12248>`_, `pr#8960 <http://github.com/ceph/ceph/pull/8960>`_, Dmitry Yatsushkevich, Brad Hubbard, Gu Zhongyan)
-* common: config set with negative value results in "error setting 'filestore_merge_threshold' to '-40': (22) Invalid argument" (`issue#13829 <http://tracker.ceph.com/issues/13829>`_, `pr#10291 <http://github.com/ceph/ceph/pull/10291>`_, Brad Hubbard, Kefu Chai)
-* common: linking to -lrbd causes process startup times to balloon (`issue#15225 <http://tracker.ceph.com/issues/15225>`_, `pr#8538 <http://github.com/ceph/ceph/pull/8538>`_, Richard W.M. Jones)
-* doc: fix by-parttypeuuid in ceph-disk(8) nroff (`issue#15867 <http://tracker.ceph.com/issues/15867>`_, `pr#10699 <http://github.com/ceph/ceph/pull/10699>`_, Ken Dreyer)
-* fs: double decreased the count to trim caps which will cause failing to respond to cache pressure (`issue#14319 <http://tracker.ceph.com/issues/14319>`_, `pr#8804 <http://github.com/ceph/ceph/pull/8804>`_, Zhi Zhang)
-* log: do not repeat errors to stderr (`issue#14616 <http://tracker.ceph.com/issues/14616>`_, `pr#10227 <http://github.com/ceph/ceph/pull/10227>`_, Sage Weil)
-* mds: failing file operations on kernel based cephfs mount point leaves unaccessible file behind on hammer 0.94.7 (`issue#16013 <http://tracker.ceph.com/issues/16013>`_, `pr#10198 <http://github.com/ceph/ceph/pull/10198>`_, Yan, Zheng)
-* mds: fix stray purging in 'stripe_count > 1' case (`issue#15050 <http://tracker.ceph.com/issues/15050>`_, `pr#8042 <http://github.com/ceph/ceph/pull/8042>`_, Yan, Zheng)
-* mds: wrongly treat symlink inode as normal file/dir when symlink inode is stale on kcephfs (`issue#15702 <http://tracker.ceph.com/issues/15702>`_, `pr#9404 <http://github.com/ceph/ceph/pull/9404>`_, Zhi Zhang)
-* mon: LibRadosMiscConnectFailure.ConnectFailure (not so intermittent) failure in upgrade/hammer-x  (`issue#13992 <http://tracker.ceph.com/issues/13992>`_, `pr#8806 <http://github.com/ceph/ceph/pull/8806>`_, Sage Weil)
-* mon: Monitor: validate prefix on handle_command() (`issue#16297 <http://tracker.ceph.com/issues/16297>`_, `pr#10038 <http://github.com/ceph/ceph/pull/10038>`_, You Ji)
-* mon: drop pg temps from not the current primary in OSDMonitor (`issue#16127 <http://tracker.ceph.com/issues/16127>`_, `pr#9893 <http://github.com/ceph/ceph/pull/9893>`_, Samuel Just)
-* mon: fix calculation of %USED (`issue#15641 <http://tracker.ceph.com/issues/15641>`_, `pr#9125 <http://github.com/ceph/ceph/pull/9125>`_, Ruifeng Yang, David Zafman)
-* mon: improve reweight_by_utilization() logic (`issue#15686 <http://tracker.ceph.com/issues/15686>`_, `pr#9416 <http://github.com/ceph/ceph/pull/9416>`_, xie xingguo)
-* mon: pool quota alarm is not in effect  (`issue#15478 <http://tracker.ceph.com/issues/15478>`_, `pr#8593 <http://github.com/ceph/ceph/pull/8593>`_, Danny Al-Gaaf)
-* mon: wrong ceph get mdsmap assertion (`issue#14681 <http://tracker.ceph.com/issues/14681>`_, `pr#7542 <http://github.com/ceph/ceph/pull/7542>`_, Vicente Cheng)
-* msgr: ceph-osd valgrind invalid reads/writes (`issue#15870 <http://tracker.ceph.com/issues/15870>`_, `pr#9238 <http://github.com/ceph/ceph/pull/9238>`_, Samuel Just)
-* objecter: LibRadosWatchNotifyPPTests/LibRadosWatchNotifyPP.WatchNotify2Timeout/1 segv (`issue#15760 <http://tracker.ceph.com/issues/15760>`_, `pr#9400 <http://github.com/ceph/ceph/pull/9400>`_, Sage Weil)
-* osd: OSD reporting ENOTEMPTY and crashing (`issue#14766 <http://tracker.ceph.com/issues/14766>`_, `pr#9277 <http://github.com/ceph/ceph/pull/9277>`_, Samuel Just)
-* osd: When generating past intervals due to an import end at pg epoch and fix build_past_intervals_parallel (`issue#12387 <http://tracker.ceph.com/issues/12387>`_, `issue#14438 <http://tracker.ceph.com/issues/14438>`_, `pr#8464 <http://github.com/ceph/ceph/pull/8464>`_, David Zafman)
-* osd: acting_primary not updated on split (`issue#15523 <http://tracker.ceph.com/issues/15523>`_, `pr#9001 <http://github.com/ceph/ceph/pull/9001>`_, Sage Weil)
-* osd: assert(!actingbackfill.empty()): old watch timeout tries to queue repop on replica (`issue#15391 <http://tracker.ceph.com/issues/15391>`_, `pr#8665 <http://github.com/ceph/ceph/pull/8665>`_, Sage Weil)
-* osd: assert(rollback_info_trimmed_to == head) in PGLog (`issue#13965 <http://tracker.ceph.com/issues/13965>`_, `pr#8849 <http://github.com/ceph/ceph/pull/8849>`_, Samuel Just)
-* osd: delete one of the repeated op->mark_started in ReplicatedBackend::sub_op_modify_impl (`issue#16572 <http://tracker.ceph.com/issues/16572>`_, `pr#9977 <http://github.com/ceph/ceph/pull/9977>`_, shun-s)
-* osd: fix omap digest compare when scrub (`issue#16000 <http://tracker.ceph.com/issues/16000>`_, `pr#9271 <http://github.com/ceph/ceph/pull/9271>`_, Xinze Chi)
-* osd: is_split crash in handle_pg_create (`issue#15426 <http://tracker.ceph.com/issues/15426>`_, `pr#8805 <http://github.com/ceph/ceph/pull/8805>`_, Kefu Chai)
-* osd: objects unfound after repair (fixed by repeering the pg) (`issue#15006 <http://tracker.ceph.com/issues/15006>`_, `pr#7961 <http://github.com/ceph/ceph/pull/7961>`_, Jianpeng Ma, Loic Dachary, Kefu Chai)
-* osd: rados cppool omap to ec pool crashes osd (`issue#14695 <http://tracker.ceph.com/issues/14695>`_, `pr#8845 <http://github.com/ceph/ceph/pull/8845>`_, Jianpeng Ma)
-* osd: remove all stale osdmaps in handle_osd_map() (`issue#13990 <http://tracker.ceph.com/issues/13990>`_, `pr#9090 <http://github.com/ceph/ceph/pull/9090>`_, Kefu Chai)
-* osd: send write and read sub ops on behalf of client ops at normal priority in ECBackend (`issue#14313 <http://tracker.ceph.com/issues/14313>`_, `pr#8573 <http://github.com/ceph/ceph/pull/8573>`_, Samuel Just)
-* rbd: snap rollback: restore the link to parent (`issue#14512 <http://tracker.ceph.com/issues/14512>`_, `pr#8535 <http://github.com/ceph/ceph/pull/8535>`_, Alexey Sheplyakov)
-* rgw: S3: set EncodingType in ListBucketResult (`issue#15896 <http://tracker.ceph.com/issues/15896>`_, `pr#8987 <http://github.com/ceph/ceph/pull/8987>`_, Victor Makarov, Robin H. Johnson)
-* rgw: backport rgwx-copy-if-newer for radosgw-agent (`issue#16262 <http://tracker.ceph.com/issues/16262>`_, `pr#9671 <http://github.com/ceph/ceph/pull/9671>`_, Yehuda Sadeh)
-* rgw: bucket listing following object delete is partial (`issue#14826 <http://tracker.ceph.com/issues/14826>`_, `pr#10555 <http://github.com/ceph/ceph/pull/10555>`_, Orit Wasserman)
-* rgw: convert plain object to versioned (with null version) when removing (`issue#15243 <http://tracker.ceph.com/issues/15243>`_, `pr#8755 <http://github.com/ceph/ceph/pull/8755>`_, Yehuda Sadeh)
-* rgw: fix multi-delete query param parsing. (`issue#16618 <http://tracker.ceph.com/issues/16618>`_, `pr#10189 <http://github.com/ceph/ceph/pull/10189>`_, Robin H. Johnson)
-* rgw: have a flavor of bucket deletion to bypass GC and to trigger (`issue#15557 <http://tracker.ceph.com/issues/15557>`_, `pr#10509 <http://github.com/ceph/ceph/pull/10509>`_, Pavan Rallabhandi)
-* rgw: keep track of written_objs correctly (`issue#15886 <http://tracker.ceph.com/issues/15886>`_, `pr#9240 <http://github.com/ceph/ceph/pull/9240>`_, Yehuda Sadeh)
-* rgw: multipart ListPartsResult has missing quotes on ETag (`issue#15334 <http://tracker.ceph.com/issues/15334>`_, `pr#8475 <http://github.com/ceph/ceph/pull/8475>`_, xie xingguo, Robin H. Johnson)
-* rgw: no Last-Modified, Content-Size and X-Object-Manifest headers if no segments in DLO manifest (`issue#15812 <http://tracker.ceph.com/issues/15812>`_, `pr#9402 <http://github.com/ceph/ceph/pull/9402>`_, Radoslaw Zarzynski)
-* rgw: radosgw server abort when user passed bad parameters to set quota (`issue#14190 <http://tracker.ceph.com/issues/14190>`_, `issue#14191 <http://tracker.ceph.com/issues/14191>`_, `pr#8313 <http://github.com/ceph/ceph/pull/8313>`_, Dunrong Huang)
-* rgw: radosgw-admin region-map set is not reporting the bucket quota correctly (`issue#16815 <http://tracker.ceph.com/issues/16815>`_, `pr#10554 <http://github.com/ceph/ceph/pull/10554>`_, Yehuda Sadeh, Orit Wasserman)
-* rgw: refrain from sending Content-Type/Content-Length for 304 responses (`issue#16327 <http://tracker.ceph.com/issues/16327>`_, `issue#13582 <http://tracker.ceph.com/issues/13582>`_, `issue#15119 <http://tracker.ceph.com/issues/15119>`_, `issue#14005 <http://tracker.ceph.com/issues/14005>`_, `pr#8379 <http://github.com/ceph/ceph/pull/8379>`_, Yehuda Sadeh, Nathan Cutler, Wido den Hollander)
-* rgw: remove bucket index objects when deleting the bucket (`issue#16412 <http://tracker.ceph.com/issues/16412>`_, `pr#10530 <http://github.com/ceph/ceph/pull/10530>`_, Orit Wasserman)
-* rgw: set Access-Control-Allow-Origin to an asterisk if allowed in a rule (`issue#15348 <http://tracker.ceph.com/issues/15348>`_, `pr#8528 <http://github.com/ceph/ceph/pull/8528>`_, Wido den Hollander)
-* rgw: subset of uploaded objects via radosgw are unretrievable when using EC pool (`issue#15745 <http://tracker.ceph.com/issues/15745>`_, `pr#9407 <http://github.com/ceph/ceph/pull/9407>`_, Yehuda Sadeh)
-* rgw: subuser rm fails with status 125 (`issue#14375 <http://tracker.ceph.com/issues/14375>`_, `pr#9961 <http://github.com/ceph/ceph/pull/9961>`_, Orit Wasserman)
-* rgw: the swift key remains after removing a subuser (`issue#12890 <http://tracker.ceph.com/issues/12890>`_, `issue#14375 <http://tracker.ceph.com/issues/14375>`_, `pr#10718 <http://github.com/ceph/ceph/pull/10718>`_, Orit Wasserman, Sangdi Xu)
-* rgw: user quota may not adjust on bucket removal (`issue#14507 <http://tracker.ceph.com/issues/14507>`_, `pr#8113 <http://github.com/ceph/ceph/pull/8113>`_, Edward Yang)
-* tests: be more generous with test timeout (`issue#15403 <http://tracker.ceph.com/issues/15403>`_, `pr#8470 <http://github.com/ceph/ceph/pull/8470>`_, Loic Dachary)
-* tests: qa/workunits/rbd: respect RBD_CREATE_ARGS environment variable (`issue#16289 <http://tracker.ceph.com/issues/16289>`_, `pr#9722 <http://github.com/ceph/ceph/pull/9722>`_, Mykola Golub)
-
-v0.94.7 Hammer
-==============
-
-This Hammer point release fixes several minor bugs.  It also includes
-a backport of an improved 'ceph osd reweight-by-utilization' command
-for handling OSDs with higher-than-average utilizations.
-
-We recommend that all hammer v0.94.x users upgrade.
-
-For more detailed information, see :download:`the complete changelog <../changelog/v0.94.7.txt>`.
-
-Notable Changes
----------------
-
-* auth: keyring permisions for mon deamon (`issue#14950 <http://tracker.ceph.com/issues/14950>`_, `pr#8049 <http://github.com/ceph/ceph/pull/8049>`_, Owen Synge)
-* auth: PK11_DestroyContext() is called twice if PK11_DigestFinal() fails (`issue#14958 <http://tracker.ceph.com/issues/14958>`_, `pr#7922 <http://github.com/ceph/ceph/pull/7922>`_, Brad Hubbard, Dunrong Huang)
-* auth: use libnss more safely (`issue#14620 <http://tracker.ceph.com/issues/14620>`_, `pr#7488 <http://github.com/ceph/ceph/pull/7488>`_, Sage Weil)
-* ceph-disk: use blkid instead of sgdisk -i (`issue#14080 <http://tracker.ceph.com/issues/14080>`_, `issue#14094 <http://tracker.ceph.com/issues/14094>`_, `pr#7475 <http://github.com/ceph/ceph/pull/7475>`_, Ilya Dryomov, Loic Dachary)
-* ceph-fuse: fix ceph-fuse writing to stale log file after log rotation (`issue#12350 <http://tracker.ceph.com/issues/12350>`_, `pr#7110 <http://github.com/ceph/ceph/pull/7110>`_, Zhi Zhang)
-* ceph init script unconditionally sources /lib/lsb/init-functions (`issue#14402 <http://tracker.ceph.com/issues/14402>`_, `pr#7797 <http://github.com/ceph/ceph/pull/7797>`_, Yan, Zheng)
-* ceph.in: Notify user that 'tell' can't be used in interactive mode (`issue#14773 <http://tracker.ceph.com/issues/14773>`_, `pr#7656 <http://github.com/ceph/ceph/pull/7656>`_, David Zafman)
-* ceph-objectstore-tool, osd: Fix import handling (`issue#10794 <http://tracker.ceph.com/issues/10794>`_, `issue#13382 <http://tracker.ceph.com/issues/13382>`_, `pr#7917 <http://github.com/ceph/ceph/pull/7917>`_, Sage Weil, David Zafman)
-* client: added permission check based on getgrouplist (`issue#13268 <http://tracker.ceph.com/issues/13268>`_, `pr#6604 <http://github.com/ceph/ceph/pull/6604>`_, Yan, Zheng, Danny Al-Gaaf)
-* client: inoderef (`issue#13729 <http://tracker.ceph.com/issues/13729>`_, `pr#6551 <http://github.com/ceph/ceph/pull/6551>`_, Yan, Zheng)
-* common: clock skew report is incorrect by ceph health detail command (`issue#14175 <http://tracker.ceph.com/issues/14175>`_, `pr#8051 <http://github.com/ceph/ceph/pull/8051>`_, Joao Eduardo Luis)
-* global/pidfile: do not start two daemons with a single pid-file (`issue#13422 <http://tracker.ceph.com/issues/13422>`_, `pr#7671 <http://github.com/ceph/ceph/pull/7671>`_, Loic Dachary, shun song)
-* librados: segfault in Objecter::handle_watch_notify (`issue#13805 <http://tracker.ceph.com/issues/13805>`_, `pr#7992 <http://github.com/ceph/ceph/pull/7992>`_, Sage Weil)
-* librbd: flattening an rbd image with active IO can lead to hang (`issue#14092 <http://tracker.ceph.com/issues/14092>`_, `issue#14483 <http://tracker.ceph.com/issues/14483>`_, `pr#7485 <http://github.com/ceph/ceph/pull/7485>`_, Jason Dillaman)
-* librbd: possible QEMU deadlock after creating image snapshots (`issue#14988 <http://tracker.ceph.com/issues/14988>`_, `pr#8011 <http://github.com/ceph/ceph/pull/8011>`_, Jason Dillaman)
-* mon: Bucket owner isn't changed after unlink/link (`issue#11076 <http://tracker.ceph.com/issues/11076>`_, `pr#8583 <http://github.com/ceph/ceph/pull/8583>`_, Zengran Zhang)
-* monclient: avoid key renew storm on clock skew (`issue#12065 <http://tracker.ceph.com/issues/12065>`_, `pr#8398 <http://github.com/ceph/ceph/pull/8398>`_, Alexey Sheplyakov)
-* mon: implement reweight-by-utilization feature (`issue#15054 <http://tracker.ceph.com/issues/15054>`_, `pr#8026 <http://github.com/ceph/ceph/pull/8026>`_, Kefu Chai, Dan van der Ster, Sage Weil)
-* mon/LogMonitor: use the configured facility if log to syslog (`issue#13748 <http://tracker.ceph.com/issues/13748>`_, `pr#7648 <http://github.com/ceph/ceph/pull/7648>`_, Kefu Chai)
-* mon: mon sync does not copy config-key (`issue#14577 <http://tracker.ceph.com/issues/14577>`_, `pr#7576 <http://github.com/ceph/ceph/pull/7576>`_, Xiaowei Chen)
-* mon/OSDMonitor: avoid underflow in reweight-by-utilization if max_change=1 (`issue#15655 <http://tracker.ceph.com/issues/15655>`_, `pr#8979 <http://github.com/ceph/ceph/pull/8979>`_, Samuel Just)
-* osd: consume_maps clearing of waiting_for_pg needs to check the spg_t shard for acting set membership (`issue#14278 <http://tracker.ceph.com/issues/14278>`_, `pr#7577 <http://github.com/ceph/ceph/pull/7577>`_, Samuel Just)
-* osd: log inconsistent shard sizes (`issue#14009 <http://tracker.ceph.com/issues/14009>`_, `pr#6946 <http://github.com/ceph/ceph/pull/6946>`_, Loic Dachary)
-* osd: OSD coredumps with leveldb compact on mount = true (`issue#14748 <http://tracker.ceph.com/issues/14748>`_, `pr#7645 <http://github.com/ceph/ceph/pull/7645>`_, Xiaoxi Chen)
-* osd/OSDMap: reset osd_primary_affinity shared_ptr when deepish_copy_from (`issue#14686 <http://tracker.ceph.com/issues/14686>`_, `pr#7590 <http://github.com/ceph/ceph/pull/7590>`_, Xinze Chi)
-* osd: Protect against excessively large object map sizes (`issue#15121 <http://tracker.ceph.com/issues/15121>`_, `pr#8401 <http://github.com/ceph/ceph/pull/8401>`_, Jason Dillaman)
-* osd/ReplicatedPG: do not proxy read *and* process op locally (`issue#15171 <http://tracker.ceph.com/issues/15171>`_, `pr#8187 <http://github.com/ceph/ceph/pull/8187>`_, Sage Weil)
-* osd: scrub bogus results when missing a clone (`issue#14875 <http://tracker.ceph.com/issues/14875>`_, `issue#14874 <http://tracker.ceph.com/issues/14874>`_, `issue#14877 <http://tracker.ceph.com/issues/14877>`_, `issue#10098 <http://tracker.ceph.com/issues/10098>`_, `issue#14878 <http://tracker.ceph.com/issues/14878>`_, `issue#14881 <http://tracker.ceph.com/issues/14881>`_, `issue#14882 <http://tracker.ceph.com/issues/14882>`_, `issue#14883 <http://tracker.ceph.com/issues/14883>`_, `issue#14879 <http://tracker.ceph.com/issues/14879>`_, `issue#10290 <http://tracker.ceph.com/issues/10290>`_, `issue#12740 <http://tracker.ceph.com/issues/12740>`_, `issue#12738 <http://tracker.ceph.com/issues/12738>`_, `issue#14880 <http://tracker.ceph.com/issues/14880>`_, `issue#11135 <http://tracker.ceph.com/issues/11135>`_, `issue#14876 <http://tracker.ceph.com/issues/14876>`_, `issue#10809 <http://tracker.ceph.com/issues/10809>`_, `issue#12193 <http://tracker.ceph.com/issues/12193>`_, `issue#11237 <http://tracker.ceph.com/issues/11237>`_, `pr#7702 <http://github.com/ceph/ceph/pull/7702>`_, Xinze Chi, Sage Weil, John Spray, Kefu Chai, Mykola Golub, David Zafman)
-* osd: Unable to bring up OSD's after dealing with FULL cluster (OSD assert with /include/interval_set.h: 386: FAILED assert(_size >= 0)) (`issue#14428 <http://tracker.ceph.com/issues/14428>`_, `pr#7415 <http://github.com/ceph/ceph/pull/7415>`_, Alexey Sheplyakov)
-* osd: use GMT time for the object name of hitsets (`issue#13192 <http://tracker.ceph.com/issues/13192>`_, `issue#9732 <http://tracker.ceph.com/issues/9732>`_, `issue#12968 <http://tracker.ceph.com/issues/12968>`_, `pr#7883 <http://github.com/ceph/ceph/pull/7883>`_, Kefu Chai, David Zafman)
-* qa/workunits/post-file.sh: sudo (`issue#14586 <http://tracker.ceph.com/issues/14586>`_, `pr#7456 <http://github.com/ceph/ceph/pull/7456>`_, Sage Weil)
-* qa/workunits: remove 'mds setmap' from workunits (`pr#8123 <http://github.com/ceph/ceph/pull/8123>`_, Sage Weil)
-* rgw: default quota params (`issue#12997 <http://tracker.ceph.com/issues/12997>`_, `pr#7188 <http://github.com/ceph/ceph/pull/7188>`_, Daniel Gryniewicz)
-* rgw: make rgw_fronends more forgiving of whitespace (`issue#12038 <http://tracker.ceph.com/issues/12038>`_, `pr#7414 <http://github.com/ceph/ceph/pull/7414>`_, Matt Benjamin)
-* rgw: radosgw-admin bucket check --fix not work (`issue#14215 <http://tracker.ceph.com/issues/14215>`_, `pr#7185 <http://github.com/ceph/ceph/pull/7185>`_, Weijun Duan)
-* rpm package building fails if the build machine has lttng and babeltrace development packages installed locally (`issue#14844 <http://tracker.ceph.com/issues/14844>`_, `pr#8440 <http://github.com/ceph/ceph/pull/8440>`_, Kefu Chai)
-* rpm: redhat-lsb-core dependency was dropped, but is still needed (`issue#14906 <http://tracker.ceph.com/issues/14906>`_, `pr#7876 <http://github.com/ceph/ceph/pull/7876>`_, Nathan Cutler)
-* test_bit_vector.cc uses magic numbers against #defines that vary (`issue#14747 <http://tracker.ceph.com/issues/14747>`_, `pr#7672 <http://github.com/ceph/ceph/pull/7672>`_, Jason Dillaman)
-* test/librados/tier.cc doesn't completely clean up EC pools (`issue#13878 <http://tracker.ceph.com/issues/13878>`_, `pr#8052 <http://github.com/ceph/ceph/pull/8052>`_, Loic Dachary, Dan Mick)
-* tests: bufferlist: do not expect !is_page_aligned() after unaligned rebuild (`issue#15305 <http://tracker.ceph.com/issues/15305>`_, `pr#8272 <http://github.com/ceph/ceph/pull/8272>`_, Kefu Chai)
-* tools: fix race condition in seq/rand bench (part 1) (`issue#14968 <http://tracker.ceph.com/issues/14968>`_, `issue#14873 <http://tracker.ceph.com/issues/14873>`_, `pr#7896 <http://github.com/ceph/ceph/pull/7896>`_, Alexey Sheplyakov, Piotr Dałek)
-* tools: fix race condition in seq/rand bench (part 2) (`issue#14873 <http://tracker.ceph.com/issues/14873>`_, `pr#7817 <http://github.com/ceph/ceph/pull/7817>`_, Alexey Sheplyakov)
-* tools/rados: add bench smoke tests (`issue#14971 <http://tracker.ceph.com/issues/14971>`_, `pr#7903 <http://github.com/ceph/ceph/pull/7903>`_, Piotr Dałek)
-* tools, test: Add ceph-objectstore-tool to operate on the meta collection (`issue#14977 <http://tracker.ceph.com/issues/14977>`_, `pr#7911 <http://github.com/ceph/ceph/pull/7911>`_, David Zafman)
-* unittest_crypto: benchmark 100,000 CryptoKey::encrypt() calls (`issue#14863 <http://tracker.ceph.com/issues/14863>`_, `pr#7801 <http://github.com/ceph/ceph/pull/7801>`_, Sage Weil)
-
-
-v0.94.6 Hammer
-======================
-
-This Hammer point release fixes a range of bugs, most notably a fix
-for unbounded growth of the monitor's leveldb store, and a workaround
-in the OSD to keep most xattrs small enough to be stored inline in XFS
-inodes.
-
-We recommend that all hammer v0.94.x users upgrade.
-
-For more detailed information, see :download:`the complete changelog <../changelog/v0.94.6.txt>`.
-
-Notable Changes
----------------
-* build/ops: Ceph daemon failed to start, because the service name was already used. (`issue#13474 <http://tracker.ceph.com/issues/13474>`_, `pr#6832 <http://github.com/ceph/ceph/pull/6832>`_, Chuanhong Wang)
-* build/ops: LTTng-UST tracing should be dynamically enabled (`issue#13274 <http://tracker.ceph.com/issues/13274>`_, `pr#6415 <http://github.com/ceph/ceph/pull/6415>`_, Jason Dillaman)
-* build/ops: ceph upstart script rbdmap.conf incorrectly processes parameters (`issue#13214 <http://tracker.ceph.com/issues/13214>`_, `pr#6159 <http://github.com/ceph/ceph/pull/6159>`_, Sage Weil)
-* build/ops: ceph.spec.in License line does not reflect COPYING (`issue#12935 <http://tracker.ceph.com/issues/12935>`_, `pr#6680 <http://github.com/ceph/ceph/pull/6680>`_, Nathan Cutler)
-* build/ops: ceph.spec.in libcephfs_jni1 has no %post and %postun  (`issue#12927 <http://tracker.ceph.com/issues/12927>`_, `pr#5789 <http://github.com/ceph/ceph/pull/5789>`_, Owen Synge)
-* build/ops: configure.ac: no use to add "+" before ac_ext=c (`issue#14330 <http://tracker.ceph.com/issues/14330>`_, `pr#6973 <http://github.com/ceph/ceph/pull/6973>`_, Kefu Chai, Robin H. Johnson)
-* build/ops: deb: strip tracepoint libraries from Wheezy/Precise builds (`issue#14801 <http://tracker.ceph.com/issues/14801>`_, `pr#7316 <http://github.com/ceph/ceph/pull/7316>`_, Jason Dillaman)
-* build/ops: init script reload doesn't work on EL7 (`issue#13709 <http://tracker.ceph.com/issues/13709>`_, `pr#7187 <http://github.com/ceph/ceph/pull/7187>`_, Hervé Rousseau)
-* build/ops: init-rbdmap uses distro-specific functions (`issue#12415 <http://tracker.ceph.com/issues/12415>`_, `pr#6528 <http://github.com/ceph/ceph/pull/6528>`_, Boris Ranto)
-* build/ops: logrotate reload error on Ubuntu 14.04 (`issue#11330 <http://tracker.ceph.com/issues/11330>`_, `pr#5787 <http://github.com/ceph/ceph/pull/5787>`_, Sage Weil)
-* build/ops: miscellaneous spec file fixes (`issue#12931 <http://tracker.ceph.com/issues/12931>`_, `issue#12994 <http://tracker.ceph.com/issues/12994>`_, `issue#12924 <http://tracker.ceph.com/issues/12924>`_, `issue#12360 <http://tracker.ceph.com/issues/12360>`_, `pr#5790 <http://github.com/ceph/ceph/pull/5790>`_, Boris Ranto, Nathan Cutler, Owen Synge, Travis Rhoden, Ken Dreyer)
-* build/ops: pass tcmalloc env through to ceph-os (`issue#14802 <http://tracker.ceph.com/issues/14802>`_, `pr#7365 <http://github.com/ceph/ceph/pull/7365>`_, Sage Weil)
-* build/ops: rbd-replay-* moved from ceph-test-dbg to ceph-common-dbg as well (`issue#13785 <http://tracker.ceph.com/issues/13785>`_, `pr#6580 <http://github.com/ceph/ceph/pull/6580>`_, Loic Dachary)
-* build/ops: unknown argument --quiet in udevadm settle (`issue#13560 <http://tracker.ceph.com/issues/13560>`_, `pr#6530 <http://github.com/ceph/ceph/pull/6530>`_, Jason Dillaman)
-* common: Objecter: pool op callback may hang forever. (`issue#13642 <http://tracker.ceph.com/issues/13642>`_, `pr#6588 <http://github.com/ceph/ceph/pull/6588>`_, xie xingguo)
-* common: Objecter: potential null pointer access when do pool_snap_list. (`issue#13639 <http://tracker.ceph.com/issues/13639>`_, `pr#6839 <http://github.com/ceph/ceph/pull/6839>`_, xie xingguo)
-* common: ThreadPool add/remove work queue methods not thread safe (`issue#12662 <http://tracker.ceph.com/issues/12662>`_, `pr#5889 <http://github.com/ceph/ceph/pull/5889>`_, Jason Dillaman)
-* common: auth/cephx: large amounts of log are produced by osd (`issue#13610 <http://tracker.ceph.com/issues/13610>`_, `pr#6835 <http://github.com/ceph/ceph/pull/6835>`_, Qiankun Zheng)
-* common: client nonce collision due to unshared pid namespaces (`issue#13032 <http://tracker.ceph.com/issues/13032>`_, `pr#6151 <http://github.com/ceph/ceph/pull/6151>`_, Josh Durgin)
-* common: common/Thread:pthread_attr_destroy(thread_attr) when done with it (`issue#12570 <http://tracker.ceph.com/issues/12570>`_, `pr#6157 <http://github.com/ceph/ceph/pull/6157>`_, Piotr Dałek)
-* common: log: Log.cc: Assign LOG_DEBUG priority to syslog calls (`issue#13993 <http://tracker.ceph.com/issues/13993>`_, `pr#6994 <http://github.com/ceph/ceph/pull/6994>`_, Brad Hubbard)
-* common: objecter: cancellation bugs (`issue#13071 <http://tracker.ceph.com/issues/13071>`_, `pr#6155 <http://github.com/ceph/ceph/pull/6155>`_, Jianpeng Ma)
-* common: pure virtual method called (`issue#13636 <http://tracker.ceph.com/issues/13636>`_, `pr#6587 <http://github.com/ceph/ceph/pull/6587>`_, Jason Dillaman)
-* common: small probability sigabrt when setting rados_osd_op_timeout (`issue#13208 <http://tracker.ceph.com/issues/13208>`_, `pr#6143 <http://github.com/ceph/ceph/pull/6143>`_, Ruifeng Yang)
-* common: wrong conditional for boolean function KeyServer::get_auth() (`issue#9756 <http://tracker.ceph.com/issues/9756>`_, `issue#13424 <http://tracker.ceph.com/issues/13424>`_, `pr#6213 <http://github.com/ceph/ceph/pull/6213>`_, Nathan Cutler)
-* crush: crash if we see CRUSH_ITEM_NONE in early rule step (`issue#13477 <http://tracker.ceph.com/issues/13477>`_, `pr#6430 <http://github.com/ceph/ceph/pull/6430>`_, Sage Weil)
-* doc: man: document listwatchers cmd in "rados" manpage (`issue#14556 <http://tracker.ceph.com/issues/14556>`_, `pr#7434 <http://github.com/ceph/ceph/pull/7434>`_, Kefu Chai)
-* doc: regenerate man pages, add orphans commands to radosgw-admin(8) (`issue#14637 <http://tracker.ceph.com/issues/14637>`_, `pr#7524 <http://github.com/ceph/ceph/pull/7524>`_, Ken Dreyer)
-* fs: CephFS restriction on removing cache tiers is overly strict (`issue#11504 <http://tracker.ceph.com/issues/11504>`_, `pr#6402 <http://github.com/ceph/ceph/pull/6402>`_, John Spray)
-* fs: fsstress.sh fails (`issue#12710 <http://tracker.ceph.com/issues/12710>`_, `pr#7454 <http://github.com/ceph/ceph/pull/7454>`_, Yan, Zheng)
-* librados: LibRadosWatchNotify.WatchNotify2Timeout (`issue#13114 <http://tracker.ceph.com/issues/13114>`_, `pr#6336 <http://github.com/ceph/ceph/pull/6336>`_, Sage Weil)
-* librbd: ImageWatcher shouldn't block the notification thread (`issue#14373 <http://tracker.ceph.com/issues/14373>`_, `pr#7407 <http://github.com/ceph/ceph/pull/7407>`_, Jason Dillaman)
-* librbd: diff_iterate needs to handle holes in parent images (`issue#12885 <http://tracker.ceph.com/issues/12885>`_, `pr#6097 <http://github.com/ceph/ceph/pull/6097>`_, Jason Dillaman)
-* librbd: fix merge-diff for >2GB diff-files (`issue#14030 <http://tracker.ceph.com/issues/14030>`_, `pr#6980 <http://github.com/ceph/ceph/pull/6980>`_, Jason Dillaman)
-* librbd: invalidate object map on error even w/o holding lock (`issue#13372 <http://tracker.ceph.com/issues/13372>`_, `pr#6289 <http://github.com/ceph/ceph/pull/6289>`_, Jason Dillaman)
-* librbd: reads larger than cache size hang (`issue#13164 <http://tracker.ceph.com/issues/13164>`_, `pr#6354 <http://github.com/ceph/ceph/pull/6354>`_, Lu Shi)
-* mds: ceph mds add_data_pool check for EC pool is wrong (`issue#12426 <http://tracker.ceph.com/issues/12426>`_, `pr#5766 <http://github.com/ceph/ceph/pull/5766>`_, John Spray)
-* mon: MonitorDBStore: get_next_key() only if prefix matches (`issue#11786 <http://tracker.ceph.com/issues/11786>`_, `pr#5361 <http://github.com/ceph/ceph/pull/5361>`_, Joao Eduardo Luis)
-* mon: OSDMonitor: do not assume a session exists in send_incremental() (`issue#14236 <http://tracker.ceph.com/issues/14236>`_, `pr#7150 <http://github.com/ceph/ceph/pull/7150>`_, Joao Eduardo Luis)
-* mon: check for store writeablility before participating in election (`issue#13089 <http://tracker.ceph.com/issues/13089>`_, `pr#6144 <http://github.com/ceph/ceph/pull/6144>`_, Sage Weil)
-* mon: compact full epochs also (`issue#14537 <http://tracker.ceph.com/issues/14537>`_, `pr#7446 <http://github.com/ceph/ceph/pull/7446>`_, Kefu Chai)
-* mon: include min_last_epoch_clean as part of PGMap::print_summary and PGMap::dump (`issue#13198 <http://tracker.ceph.com/issues/13198>`_, `pr#6152 <http://github.com/ceph/ceph/pull/6152>`_, Guang Yang)
-* mon: map_cache can become inaccurate if osd does not receive the osdmaps (`issue#10930 <http://tracker.ceph.com/issues/10930>`_, `pr#5773 <http://github.com/ceph/ceph/pull/5773>`_, Kefu Chai)
-* mon: should not set isvalid = true when cephx_verify_authorizer return false (`issue#13525 <http://tracker.ceph.com/issues/13525>`_, `pr#6391 <http://github.com/ceph/ceph/pull/6391>`_, Ruifeng Yang)
-* osd: Ceph Pools' MAX AVAIL is 0 if some OSDs' weight is 0 (`issue#13840 <http://tracker.ceph.com/issues/13840>`_, `pr#6834 <http://github.com/ceph/ceph/pull/6834>`_, Chengyuan Li)
-* osd: FileStore calls syncfs(2) even it is not supported (`issue#12512 <http://tracker.ceph.com/issues/12512>`_, `pr#5530 <http://github.com/ceph/ceph/pull/5530>`_, Kefu Chai)
-* osd: FileStore: potential memory leak if getattrs fails. (`issue#13597 <http://tracker.ceph.com/issues/13597>`_, `pr#6420 <http://github.com/ceph/ceph/pull/6420>`_, xie xingguo)
-* osd: IO error on kvm/rbd with an erasure coded pool tier (`issue#12012 <http://tracker.ceph.com/issues/12012>`_, `pr#5897 <http://github.com/ceph/ceph/pull/5897>`_, Kefu Chai)
-* osd: OSD::build_past_intervals_parallel() shall reset primary and up_primary when begin a new past_interval. (`issue#13471 <http://tracker.ceph.com/issues/13471>`_, `pr#6398 <http://github.com/ceph/ceph/pull/6398>`_, xiexingguo)
-* osd: ReplicatedBackend: populate recovery_info.size for clone (bug symptom is size mismatch on replicated backend on a clone in scrub) (`issue#12828 <http://tracker.ceph.com/issues/12828>`_, `pr#6153 <http://github.com/ceph/ceph/pull/6153>`_, Samuel Just)
-* osd: ReplicatedPG: wrong result code checking logic during sparse_read (`issue#14151 <http://tracker.ceph.com/issues/14151>`_, `pr#7179 <http://github.com/ceph/ceph/pull/7179>`_, xie xingguo)
-* osd: ReplicatedPG::hit_set_trim osd/ReplicatedPG.cc: 11006: FAILED assert(obc) (`issue#13192 <http://tracker.ceph.com/issues/13192>`_, `issue#9732 <http://tracker.ceph.com/issues/9732>`_, `issue#12968 <http://tracker.ceph.com/issues/12968>`_, `pr#5825 <http://github.com/ceph/ceph/pull/5825>`_, Kefu Chai, Zhiqiang Wang, Samuel Just, David Zafman)
-* osd: avoid multi set osd_op.outdata in tier pool (`issue#12540 <http://tracker.ceph.com/issues/12540>`_, `pr#6060 <http://github.com/ceph/ceph/pull/6060>`_, Xinze Chi)
-* osd: bug with cache/tiering and snapshot reads (`issue#12748 <http://tracker.ceph.com/issues/12748>`_, `pr#6589 <http://github.com/ceph/ceph/pull/6589>`_, Kefu Chai)
-* osd: ceph osd pool stats broken in hammer (`issue#13843 <http://tracker.ceph.com/issues/13843>`_, `pr#7180 <http://github.com/ceph/ceph/pull/7180>`_, BJ Lougee)
-* osd: ceph-disk prepare fails if device is a symlink (`issue#13438 <http://tracker.ceph.com/issues/13438>`_, `pr#7176 <http://github.com/ceph/ceph/pull/7176>`_, Joe Julian)
-* osd: check for full before changing the cached obc (hammer) (`issue#13098 <http://tracker.ceph.com/issues/13098>`_, `pr#6918 <http://github.com/ceph/ceph/pull/6918>`_, Alexey Sheplyakov)
-* osd: config_opts: increase suicide timeout to 300 to match recovery (`issue#14376 <http://tracker.ceph.com/issues/14376>`_, `pr#7236 <http://github.com/ceph/ceph/pull/7236>`_, Samuel Just)
-* osd: disable filestore_xfs_extsize by default (`issue#14397 <http://tracker.ceph.com/issues/14397>`_, `pr#7411 <http://github.com/ceph/ceph/pull/7411>`_, Ken Dreyer)
-* osd: do not cache unused memory in attrs (`issue#12565 <http://tracker.ceph.com/issues/12565>`_, `pr#6499 <http://github.com/ceph/ceph/pull/6499>`_, Xinze Chi, Ning Yao)
-* osd: dumpling incrementals do not work properly on hammer and newer (`issue#13234 <http://tracker.ceph.com/issues/13234>`_, `pr#6132 <http://github.com/ceph/ceph/pull/6132>`_, Samuel Just)
-* osd: filestore: fix peek_queue for OpSequencer (`issue#13209 <http://tracker.ceph.com/issues/13209>`_, `pr#6145 <http://github.com/ceph/ceph/pull/6145>`_, Xinze Chi)
-* osd: hit set clear repops fired in same epoch as map change -- segfault since they fall into the new interval even though the repops are cleared (`issue#12809 <http://tracker.ceph.com/issues/12809>`_, `pr#5890 <http://github.com/ceph/ceph/pull/5890>`_, Samuel Just)
-* osd: object_info_t::decode() has wrong version (`issue#13462 <http://tracker.ceph.com/issues/13462>`_, `pr#6335 <http://github.com/ceph/ceph/pull/6335>`_, David Zafman)
-* osd: osd/OSD.cc: 2469: FAILED assert(pg_stat_queue.empty()) on shutdown (`issue#14212 <http://tracker.ceph.com/issues/14212>`_, `pr#7178 <http://github.com/ceph/ceph/pull/7178>`_, Sage Weil)
-* osd: osd/PG.cc: 288: FAILED assert(info.last_epoch_started >= info.history.last_epoch_started) (`issue#14015 <http://tracker.ceph.com/issues/14015>`_, `pr#7177 <http://github.com/ceph/ceph/pull/7177>`_, David Zafman)
-* osd: osd/PG.cc: 3837: FAILED assert(0 == "Running incompatible OSD") (`issue#11661 <http://tracker.ceph.com/issues/11661>`_, `pr#7206 <http://github.com/ceph/ceph/pull/7206>`_, David Zafman)
-* osd: osd/ReplicatedPG: Recency fix (`issue#14320 <http://tracker.ceph.com/issues/14320>`_, `pr#7207 <http://github.com/ceph/ceph/pull/7207>`_, Sage Weil, Robert LeBlanc)
-* osd: pg stuck in replay (`issue#13116 <http://tracker.ceph.com/issues/13116>`_, `pr#6401 <http://github.com/ceph/ceph/pull/6401>`_, Sage Weil)
-* osd: race condition detected during send_failures (`issue#13821 <http://tracker.ceph.com/issues/13821>`_, `pr#6755 <http://github.com/ceph/ceph/pull/6755>`_, Sage Weil)
-* osd: randomize scrub times (`issue#10973 <http://tracker.ceph.com/issues/10973>`_, `pr#6199 <http://github.com/ceph/ceph/pull/6199>`_, Kefu Chai)
-* osd: requeue_scrub when kick_object_context_blocked (`issue#12515 <http://tracker.ceph.com/issues/12515>`_, `pr#5891 <http://github.com/ceph/ceph/pull/5891>`_, Xinze Chi)
-* osd: revert: use GMT time for hitsets (`issue#13812 <http://tracker.ceph.com/issues/13812>`_, `pr#6644 <http://github.com/ceph/ceph/pull/6644>`_, Loic Dachary)
-* osd: segfault in agent_work (`issue#13199 <http://tracker.ceph.com/issues/13199>`_, `pr#6146 <http://github.com/ceph/ceph/pull/6146>`_, Samuel Just)
-* osd: should recalc the min_last_epoch_clean when decode PGMap (`issue#13112 <http://tracker.ceph.com/issues/13112>`_, `pr#6154 <http://github.com/ceph/ceph/pull/6154>`_, Kefu Chai)
-* osd: smaller object_info_t xattrs (`issue#14803 <http://tracker.ceph.com/issues/14803>`_, `pr#6544 <http://github.com/ceph/ceph/pull/6544>`_, Sage Weil)
-* osd: we do not ignore notify from down osds (`issue#12990 <http://tracker.ceph.com/issues/12990>`_, `pr#6158 <http://github.com/ceph/ceph/pull/6158>`_, Samuel Just)
-* rbd: QEMU hangs after creating snapshot and stopping VM (`issue#13726 <http://tracker.ceph.com/issues/13726>`_, `pr#6586 <http://github.com/ceph/ceph/pull/6586>`_, Jason Dillaman)
-* rbd: TaskFinisher::cancel should remove event from SafeTimer (`issue#14476 <http://tracker.ceph.com/issues/14476>`_, `pr#7417 <http://github.com/ceph/ceph/pull/7417>`_, Douglas Fuller)
-* rbd: avoid re-writing old-format image header on resize (`issue#13674 <http://tracker.ceph.com/issues/13674>`_, `pr#6585 <http://github.com/ceph/ceph/pull/6585>`_, Jason Dillaman)
-* rbd: fix bench-write (`issue#14225 <http://tracker.ceph.com/issues/14225>`_, `pr#7183 <http://github.com/ceph/ceph/pull/7183>`_, Sage Weil)
-* rbd: rbd-replay does not check for EOF and goes to endless loop (`issue#14452 <http://tracker.ceph.com/issues/14452>`_, `pr#7416 <http://github.com/ceph/ceph/pull/7416>`_, Mykola Golub)
-* rbd: rbd-replay-prep and rbd-replay improvements (`issue#13221 <http://tracker.ceph.com/issues/13221>`_, `issue#13220 <http://tracker.ceph.com/issues/13220>`_, `issue#13378 <http://tracker.ceph.com/issues/13378>`_, `pr#6286 <http://github.com/ceph/ceph/pull/6286>`_, Jason Dillaman)
-* rbd: verify self-managed snapshot functionality on image create (`issue#13633 <http://tracker.ceph.com/issues/13633>`_, `pr#7182 <http://github.com/ceph/ceph/pull/7182>`_, Jason Dillaman)
-* rgw: Make RGW_MAX_PUT_SIZE configurable (`issue#6999 <http://tracker.ceph.com/issues/6999>`_, `pr#7441 <http://github.com/ceph/ceph/pull/7441>`_, Vladislav Odintsov, Yuan Zhou)
-* rgw: Setting ACL on Object removes ETag (`issue#12955 <http://tracker.ceph.com/issues/12955>`_, `pr#6620 <http://github.com/ceph/ceph/pull/6620>`_, Brian Felton)
-* rgw: backport content-type casing (`issue#12939 <http://tracker.ceph.com/issues/12939>`_, `pr#5910 <http://github.com/ceph/ceph/pull/5910>`_, Robin H. Johnson)
-* rgw: bucket listing hangs on versioned buckets (`issue#12913 <http://tracker.ceph.com/issues/12913>`_, `pr#6352 <http://github.com/ceph/ceph/pull/6352>`_, Yehuda Sadeh)
-* rgw: fix wrong etag calculation during POST on S3 bucket. (`issue#11241 <http://tracker.ceph.com/issues/11241>`_, `pr#7442 <http://github.com/ceph/ceph/pull/7442>`_, Vladislav Odintsov, Radoslaw Zarzynski)
-* rgw: get bucket location returns region name, not region api name (`issue#13458 <http://tracker.ceph.com/issues/13458>`_, `pr#6349 <http://github.com/ceph/ceph/pull/6349>`_, Yehuda Sadeh)
-* rgw: missing handling of encoding-type=url when listing keys in bucket (`issue#12735 <http://tracker.ceph.com/issues/12735>`_, `pr#6527 <http://github.com/ceph/ceph/pull/6527>`_, Jeff Weber)
-* rgw: orphan tool should be careful about removing head objects (`issue#12958 <http://tracker.ceph.com/issues/12958>`_, `pr#6351 <http://github.com/ceph/ceph/pull/6351>`_, Yehuda Sadeh)
-* rgw: orphans finish segfaults (`issue#13824 <http://tracker.ceph.com/issues/13824>`_, `pr#7186 <http://github.com/ceph/ceph/pull/7186>`_, Igor Fedotov)
-* rgw: rgw-admin: document orphans commands in usage (`issue#14516 <http://tracker.ceph.com/issues/14516>`_, `pr#7526 <http://github.com/ceph/ceph/pull/7526>`_, Yehuda Sadeh)
-* rgw: swift API returns more than real object count and bytes used when retrieving account metadata (`issue#13140 <http://tracker.ceph.com/issues/13140>`_, `pr#6512 <http://github.com/ceph/ceph/pull/6512>`_, Sangdi Xu)
-* rgw: swift use Civetweb ssl can not get right url (`issue#13628 <http://tracker.ceph.com/issues/13628>`_, `pr#6491 <http://github.com/ceph/ceph/pull/6491>`_, Weijun Duan)
-* rgw: value of Swift API's X-Object-Manifest header is not url_decoded during segment look up (`issue#12728 <http://tracker.ceph.com/issues/12728>`_, `pr#6353 <http://github.com/ceph/ceph/pull/6353>`_, Radoslaw Zarzynski)
-* tests: fixed broken Makefiles after integration of ttng into rados (`issue#13210 <http://tracker.ceph.com/issues/13210>`_, `pr#6322 <http://github.com/ceph/ceph/pull/6322>`_, Sebastien Ponce)
-* tests: fsx failed to compile (`issue#14384 <http://tracker.ceph.com/issues/14384>`_, `pr#7501 <http://github.com/ceph/ceph/pull/7501>`_, Greg Farnum)
-* tests: notification slave needs to wait for master (`issue#13810 <http://tracker.ceph.com/issues/13810>`_, `pr#7226 <http://github.com/ceph/ceph/pull/7226>`_, Jason Dillaman)
-* tests: qa: remove legacy OS support from rbd/qemu-iotests (`issue#13483 <http://tracker.ceph.com/issues/13483>`_, `issue#14385 <http://tracker.ceph.com/issues/14385>`_, `pr#7252 <http://github.com/ceph/ceph/pull/7252>`_, Vasu Kulkarni, Jason Dillaman)
-* tests: testprofile must be removed before it is re-created (`issue#13664 <http://tracker.ceph.com/issues/13664>`_, `pr#6450 <http://github.com/ceph/ceph/pull/6450>`_, Loic Dachary)
-* tools: ceph-monstore-tool must do out_store.close() (`issue#10093 <http://tracker.ceph.com/issues/10093>`_, `pr#7347 <http://github.com/ceph/ceph/pull/7347>`_, huangjun)
-* tools: heavy memory shuffling in rados bench (`issue#12946 <http://tracker.ceph.com/issues/12946>`_, `pr#5810 <http://github.com/ceph/ceph/pull/5810>`_, Piotr Dałek)
-* tools: race condition in rados bench (`issue#12947 <http://tracker.ceph.com/issues/12947>`_, `pr#6791 <http://github.com/ceph/ceph/pull/6791>`_, Piotr Dałek)
-* tools: tool for artificially inflate the leveldb of the mon store for testing purposes  (`issue#10093 <http://tracker.ceph.com/issues/10093>`_, `issue#11815 <http://tracker.ceph.com/issues/11815>`_, `issue#14217 <http://tracker.ceph.com/issues/14217>`_, `pr#7412 <http://github.com/ceph/ceph/pull/7412>`_, Cilang Zhao, Bo Cai, Kefu Chai, huangjun, Joao Eduardo Luis)
-
-v0.94.5 Hammer
-==============
-
-This Hammer point release fixes a critical regression in librbd that can cause
-QEMU/KVM to crash when caching is enabled on images that have been cloned.
-
-All v0.94.4 Hammer users are strongly encouraged to upgrade.
-
-Notable Changes
----------------
-* librbd: potential assertion failure during cache read (`issue#13559 <http://tracker.ceph.com/issues/13559>`_, `pr#6348 <http://github.com/ceph/ceph/pull/6348>`_, Jason Dillaman)
-* osd: osd/ReplicatedPG: remove stray debug line (`issue#13455 <http://tracker.ceph.com/issues/13455>`_, `pr#6362 <http://github.com/ceph/ceph/pull/6362>`_, Sage Weil)
-* tests: qemu workunit refers to apt-mirror.front.sepia.ceph.com (`issue#13420 <http://tracker.ceph.com/issues/13420>`_, `pr#6330 <http://github.com/ceph/ceph/pull/6330>`_, Yuan Zhou)
-
-For more detailed information, see :download:`the complete changelog <../changelog/v0.94.5.txt>`.
-
-v0.94.4 Hammer
-==============
-
-This Hammer point release fixes several important bugs in Hammer, as well as
-fixing interoperability issues that are required before an upgrade to
-Infernalis. That is, all users of earlier version of Hammer or any
-version of Firefly will first need to upgrade to hammer v0.94.4 or
-later before upgrading to Infernalis (or future releases).
-
-All v0.94.x Hammer users are strongly encouraged to upgrade.
-
-Notable Changes
----------------
-* build/ops: ceph.spec.in: 50-rbd.rules conditional is wrong (`issue#12166 <http://tracker.ceph.com/issues/12166>`_, `pr#5207 <http://github.com/ceph/ceph/pull/5207>`_, Nathan Cutler)
-* build/ops: ceph.spec.in: ceph-common needs python-argparse on older distros, but doesn't require it (`issue#12034 <http://tracker.ceph.com/issues/12034>`_, `pr#5216 <http://github.com/ceph/ceph/pull/5216>`_, Nathan Cutler)
-* build/ops: ceph.spec.in: radosgw requires apache for SUSE only -- makes no sense (`issue#12358 <http://tracker.ceph.com/issues/12358>`_, `pr#5411 <http://github.com/ceph/ceph/pull/5411>`_, Nathan Cutler)
-* build/ops: ceph.spec.in: rpm: cephfs_java not fully conditionalized (`issue#11991 <http://tracker.ceph.com/issues/11991>`_, `pr#5202 <http://github.com/ceph/ceph/pull/5202>`_, Nathan Cutler)
-* build/ops: ceph.spec.in: rpm: not possible to turn off Java (`issue#11992 <http://tracker.ceph.com/issues/11992>`_, `pr#5203 <http://github.com/ceph/ceph/pull/5203>`_, Owen Synge)
-* build/ops: ceph.spec.in: running fdupes unnecessarily (`issue#12301 <http://tracker.ceph.com/issues/12301>`_, `pr#5223 <http://github.com/ceph/ceph/pull/5223>`_, Nathan Cutler)
-* build/ops: ceph.spec.in: snappy-devel for all supported distros (`issue#12361 <http://tracker.ceph.com/issues/12361>`_, `pr#5264 <http://github.com/ceph/ceph/pull/5264>`_, Nathan Cutler)
-* build/ops: ceph.spec.in: SUSE/openSUSE builds need libbz2-devel (`issue#11629 <http://tracker.ceph.com/issues/11629>`_, `pr#5204 <http://github.com/ceph/ceph/pull/5204>`_, Nathan Cutler)
-* build/ops: ceph.spec.in: useless %py_requires breaks SLE11-SP3 build (`issue#12351 <http://tracker.ceph.com/issues/12351>`_, `pr#5412 <http://github.com/ceph/ceph/pull/5412>`_, Nathan Cutler)
-* build/ops: error in ext_mime_map_init() when /etc/mime.types is missing (`issue#11864 <http://tracker.ceph.com/issues/11864>`_, `pr#5385 <http://github.com/ceph/ceph/pull/5385>`_, Ken Dreyer)
-* build/ops: upstart: limit respawn to 3 in 30 mins (instead of 5 in 30s) (`issue#11798 <http://tracker.ceph.com/issues/11798>`_, `pr#5930 <http://github.com/ceph/ceph/pull/5930>`_, Sage Weil)
-* build/ops: With root as default user, unable to have multiple RGW instances running (`issue#10927 <http://tracker.ceph.com/issues/10927>`_, `pr#6161 <http://github.com/ceph/ceph/pull/6161>`_, Sage Weil)
-* build/ops: With root as default user, unable to have multiple RGW instances running (`issue#11140 <http://tracker.ceph.com/issues/11140>`_, `pr#6161 <http://github.com/ceph/ceph/pull/6161>`_, Sage Weil)
-* build/ops: With root as default user, unable to have multiple RGW instances running (`issue#11686 <http://tracker.ceph.com/issues/11686>`_, `pr#6161 <http://github.com/ceph/ceph/pull/6161>`_, Sage Weil)
-* build/ops: With root as default user, unable to have multiple RGW instances running (`issue#12407 <http://tracker.ceph.com/issues/12407>`_, `pr#6161 <http://github.com/ceph/ceph/pull/6161>`_, Sage Weil)
-* cli: ceph: cli throws exception on unrecognized errno (`issue#11354 <http://tracker.ceph.com/issues/11354>`_, `pr#5368 <http://github.com/ceph/ceph/pull/5368>`_, Kefu Chai)
-* cli: ceph tell: broken error message / misleading hinting (`issue#11101 <http://tracker.ceph.com/issues/11101>`_, `pr#5371 <http://github.com/ceph/ceph/pull/5371>`_, Kefu Chai)
-* common: arm: all programs that link to librados2 hang forever on startup (`issue#12505 <http://tracker.ceph.com/issues/12505>`_, `pr#5366 <http://github.com/ceph/ceph/pull/5366>`_, Boris Ranto)
-* common: buffer: critical bufferlist::zero bug (`issue#12252 <http://tracker.ceph.com/issues/12252>`_, `pr#5365 <http://github.com/ceph/ceph/pull/5365>`_, Haomai Wang)
-* common: ceph-object-corpus: add 0.94.2-207-g88e7ee7 hammer objects (`issue#13070 <http://tracker.ceph.com/issues/13070>`_, `pr#5551 <http://github.com/ceph/ceph/pull/5551>`_, Sage Weil)
-* common: do not insert emtpy ptr when rebuild emtpy bufferlist (`issue#12775 <http://tracker.ceph.com/issues/12775>`_, `pr#5764 <http://github.com/ceph/ceph/pull/5764>`_, Xinze Chi)
-* common: [  FAILED  ] TestLibRBD.BlockingAIO (`issue#12479 <http://tracker.ceph.com/issues/12479>`_, `pr#5768 <http://github.com/ceph/ceph/pull/5768>`_, Jason Dillaman)
-* common: LibCephFS.GetPoolId failure (`issue#12598 <http://tracker.ceph.com/issues/12598>`_, `pr#5887 <http://github.com/ceph/ceph/pull/5887>`_, Yan, Zheng)
-* common: Memory leak in Mutex.cc, pthread_mutexattr_init without pthread_mutexattr_destroy (`issue#11762 <http://tracker.ceph.com/issues/11762>`_, `pr#5378 <http://github.com/ceph/ceph/pull/5378>`_, Ketor Meng)
-* common: object_map_update fails with -EINVAL return code (`issue#12611 <http://tracker.ceph.com/issues/12611>`_, `pr#5559 <http://github.com/ceph/ceph/pull/5559>`_, Jason Dillaman)
-* common: Pipe: Drop connect_seq increase line (`issue#13093 <http://tracker.ceph.com/issues/13093>`_, `pr#5908 <http://github.com/ceph/ceph/pull/5908>`_, Haomai Wang)
-* common: recursive lock of md_config_t (0) (`issue#12614 <http://tracker.ceph.com/issues/12614>`_, `pr#5759 <http://github.com/ceph/ceph/pull/5759>`_, Josh Durgin)
-* crush: ceph osd crush reweight-subtree does not reweight parent node (`issue#11855 <http://tracker.ceph.com/issues/11855>`_, `pr#5374 <http://github.com/ceph/ceph/pull/5374>`_, Sage Weil)
-* doc: update docs to point to download.ceph.com (`issue#13162 <http://tracker.ceph.com/issues/13162>`_, `pr#6156 <http://github.com/ceph/ceph/pull/6156>`_, Alfredo Deza)
-* fs: ceph-fuse 0.94.2-1trusty segfaults / aborts (`issue#12297 <http://tracker.ceph.com/issues/12297>`_, `pr#5381 <http://github.com/ceph/ceph/pull/5381>`_, Greg Farnum)
-* fs: segfault launching ceph-fuse with bad --name (`issue#12417 <http://tracker.ceph.com/issues/12417>`_, `pr#5382 <http://github.com/ceph/ceph/pull/5382>`_, John Spray)
-* librados: Change radosgw pools default crush ruleset (`issue#11640 <http://tracker.ceph.com/issues/11640>`_, `pr#5754 <http://github.com/ceph/ceph/pull/5754>`_, Yuan Zhou)
-* librbd: correct issues discovered via lockdep / helgrind (`issue#12345 <http://tracker.ceph.com/issues/12345>`_, `pr#5296 <http://github.com/ceph/ceph/pull/5296>`_, Jason Dillaman)
-* librbd: Crash during TestInternal.MultipleResize (`issue#12664 <http://tracker.ceph.com/issues/12664>`_, `pr#5769 <http://github.com/ceph/ceph/pull/5769>`_, Jason Dillaman)
-* librbd: deadlock during cooperative exclusive lock transition (`issue#11537 <http://tracker.ceph.com/issues/11537>`_, `pr#5319 <http://github.com/ceph/ceph/pull/5319>`_, Jason Dillaman)
-* librbd: Possible crash while concurrently writing and shrinking an image (`issue#11743 <http://tracker.ceph.com/issues/11743>`_, `pr#5318 <http://github.com/ceph/ceph/pull/5318>`_, Jason Dillaman)
-* mon: add a cache layer over MonitorDBStore (`issue#12638 <http://tracker.ceph.com/issues/12638>`_, `pr#5697 <http://github.com/ceph/ceph/pull/5697>`_, Kefu Chai)
-* mon: fix crush testing for new pools (`issue#13400 <http://tracker.ceph.com/issues/13400>`_, `pr#6192 <http://github.com/ceph/ceph/pull/6192>`_, Sage Weil)
-* mon: get pools health'info have error (`issue#12402 <http://tracker.ceph.com/issues/12402>`_, `pr#5369 <http://github.com/ceph/ceph/pull/5369>`_, renhwztetecs)
-* mon: implicit erasure code crush ruleset is not validated (`issue#11814 <http://tracker.ceph.com/issues/11814>`_, `pr#5276 <http://github.com/ceph/ceph/pull/5276>`_, Loic Dachary)
-* mon: PaxosService: call post_refresh() instead of post_paxos_update() (`issue#11470 <http://tracker.ceph.com/issues/11470>`_, `pr#5359 <http://github.com/ceph/ceph/pull/5359>`_, Joao Eduardo Luis)
-* mon: pgmonitor: wrong at/near target max“ reporting (`issue#12401 <http://tracker.ceph.com/issues/12401>`_, `pr#5370 <http://github.com/ceph/ceph/pull/5370>`_, huangjun)
-* mon: register_new_pgs() should check ruleno instead of its index (`issue#12210 <http://tracker.ceph.com/issues/12210>`_, `pr#5377 <http://github.com/ceph/ceph/pull/5377>`_, Xinze Chi)
-* mon: Show osd as NONE in ceph osd map <pool> <object>  output (`issue#11820 <http://tracker.ceph.com/issues/11820>`_, `pr#5376 <http://github.com/ceph/ceph/pull/5376>`_, Shylesh Kumar)
-* mon: the output is wrong when runing ceph osd reweight (`issue#12251 <http://tracker.ceph.com/issues/12251>`_, `pr#5372 <http://github.com/ceph/ceph/pull/5372>`_, Joao Eduardo Luis)
-* osd: allow peek_map_epoch to return an error (`issue#13060 <http://tracker.ceph.com/issues/13060>`_, `pr#5892 <http://github.com/ceph/ceph/pull/5892>`_, Sage Weil)
-* osd: cache agent is idle although one object is left in the cache (`issue#12673 <http://tracker.ceph.com/issues/12673>`_, `pr#5765 <http://github.com/ceph/ceph/pull/5765>`_, Loic Dachary)
-* osd: copy-from doesn't preserve truncate_{seq,size} (`issue#12551 <http://tracker.ceph.com/issues/12551>`_, `pr#5885 <http://github.com/ceph/ceph/pull/5885>`_, Samuel Just)
-* osd: crash creating/deleting pools (`issue#12429 <http://tracker.ceph.com/issues/12429>`_, `pr#5527 <http://github.com/ceph/ceph/pull/5527>`_, John Spray)
-* osd: fix repair when recorded digest is wrong (`issue#12577 <http://tracker.ceph.com/issues/12577>`_, `pr#5468 <http://github.com/ceph/ceph/pull/5468>`_, Sage Weil)
-* osd: include/ceph_features: define HAMMER_0_94_4 feature (`issue#13026 <http://tracker.ceph.com/issues/13026>`_, `pr#5687 <http://github.com/ceph/ceph/pull/5687>`_, Sage Weil)
-* osd: is_new_interval() fixes (`issue#10399 <http://tracker.ceph.com/issues/10399>`_, `pr#5691 <http://github.com/ceph/ceph/pull/5691>`_, Jason Dillaman)
-* osd: is_new_interval() fixes (`issue#11771 <http://tracker.ceph.com/issues/11771>`_, `pr#5691 <http://github.com/ceph/ceph/pull/5691>`_, Jason Dillaman)
-* osd: long standing slow requests: connection->session->waiting_for_map->connection ref cycle (`issue#12338 <http://tracker.ceph.com/issues/12338>`_, `pr#5761 <http://github.com/ceph/ceph/pull/5761>`_, Samuel Just)
-* osd: Mutex Assert from PipeConnection::try_get_pipe (`issue#12437 <http://tracker.ceph.com/issues/12437>`_, `pr#5758 <http://github.com/ceph/ceph/pull/5758>`_, David Zafman)
-* osd: pg_interval_t::check_new_interval - for ec pool, should not rely on min_size to determine if the PG was active at the interval (`issue#12162 <http://tracker.ceph.com/issues/12162>`_, `pr#5373 <http://github.com/ceph/ceph/pull/5373>`_, Guang G Yang)
-* osd: PGLog.cc: 732: FAILED assert(log.log.size() == log_keys_debug.size()) (`issue#12652 <http://tracker.ceph.com/issues/12652>`_, `pr#5763 <http://github.com/ceph/ceph/pull/5763>`_, Sage Weil)
-* osd: PGLog::proc_replica_log: correctly handle case where entries between olog.head and log.tail were split out (`issue#11358 <http://tracker.ceph.com/issues/11358>`_, `pr#5380 <http://github.com/ceph/ceph/pull/5380>`_, Samuel Just)
-* osd: read on chunk-aligned xattr not handled (`issue#12309 <http://tracker.ceph.com/issues/12309>`_, `pr#5367 <http://github.com/ceph/ceph/pull/5367>`_, Sage Weil)
-* osd: suicide timeout during peering - search for missing objects (`issue#12523 <http://tracker.ceph.com/issues/12523>`_, `pr#5762 <http://github.com/ceph/ceph/pull/5762>`_, Guang G Yang)
-* osd: WBThrottle::clear_object: signal on cond when we reduce throttle values (`issue#12223 <http://tracker.ceph.com/issues/12223>`_, `pr#5757 <http://github.com/ceph/ceph/pull/5757>`_, Samuel Just)
-* rbd: crash during shutdown after writeback blocked by IO errors (`issue#12597 <http://tracker.ceph.com/issues/12597>`_, `pr#5767 <http://github.com/ceph/ceph/pull/5767>`_, Jianpeng Ma)
-* rgw: add delimiter to prefix only when path is specified (`issue#12960 <http://tracker.ceph.com/issues/12960>`_, `pr#5860 <http://github.com/ceph/ceph/pull/5860>`_, Sylvain Baubeau)
-* rgw: create a tool for orphaned objects cleanup (`issue#9604 <http://tracker.ceph.com/issues/9604>`_, `pr#5717 <http://github.com/ceph/ceph/pull/5717>`_, Yehuda Sadeh)
-* rgw: don't preserve acls when copying object (`issue#11563 <http://tracker.ceph.com/issues/11563>`_, `pr#6039 <http://github.com/ceph/ceph/pull/6039>`_, Yehuda Sadeh)
-* rgw: don't preserve acls when copying object (`issue#12370 <http://tracker.ceph.com/issues/12370>`_, `pr#6039 <http://github.com/ceph/ceph/pull/6039>`_, Yehuda Sadeh)
-* rgw: don't preserve acls when copying object (`issue#13015 <http://tracker.ceph.com/issues/13015>`_, `pr#6039 <http://github.com/ceph/ceph/pull/6039>`_, Yehuda Sadeh)
-* rgw: Ensure that swift keys don't include backslashes (`issue#7647 <http://tracker.ceph.com/issues/7647>`_, `pr#5716 <http://github.com/ceph/ceph/pull/5716>`_, Yehuda Sadeh)
-* rgw: GWWatcher::handle_error -> common/Mutex.cc: 95: FAILED assert(r == 0) (`issue#12208 <http://tracker.ceph.com/issues/12208>`_, `pr#6164 <http://github.com/ceph/ceph/pull/6164>`_, Yehuda Sadeh)
-* rgw: HTTP return code is not being logged by CivetWeb  (`issue#12432 <http://tracker.ceph.com/issues/12432>`_, `pr#5498 <http://github.com/ceph/ceph/pull/5498>`_, Yehuda Sadeh)
-* rgw: init_rados failed leads to repeated delete (`issue#12978 <http://tracker.ceph.com/issues/12978>`_, `pr#6165 <http://github.com/ceph/ceph/pull/6165>`_, Xiaowei Chen)
-* rgw: init some manifest fields when handling explicit objs (`issue#11455 <http://tracker.ceph.com/issues/11455>`_, `pr#5732 <http://github.com/ceph/ceph/pull/5732>`_, Yehuda Sadeh)
-* rgw: Keystone Fernet tokens break auth (`issue#12761 <http://tracker.ceph.com/issues/12761>`_, `pr#6162 <http://github.com/ceph/ceph/pull/6162>`_, Abhishek Lekshmanan)
-* rgw: region data still exist in region-map after region-map update (`issue#12964 <http://tracker.ceph.com/issues/12964>`_, `pr#6163 <http://github.com/ceph/ceph/pull/6163>`_, dwj192)
-* rgw: remove trailing :port from host for purposes of subdomain matching (`issue#12353 <http://tracker.ceph.com/issues/12353>`_, `pr#6042 <http://github.com/ceph/ceph/pull/6042>`_, Yehuda Sadeh)
-* rgw: rest-bench common/WorkQueue.cc: 54: FAILED assert(_threads.empty()) (`issue#3896 <http://tracker.ceph.com/issues/3896>`_, `pr#5383 <http://github.com/ceph/ceph/pull/5383>`_, huangjun)
-* rgw: returns requested bucket name raw in Bucket response header (`issue#12537 <http://tracker.ceph.com/issues/12537>`_, `pr#5715 <http://github.com/ceph/ceph/pull/5715>`_, Yehuda Sadeh)
-* rgw: segmentation fault when rgw_gc_max_objs > HASH_PRIME (`issue#12630 <http://tracker.ceph.com/issues/12630>`_, `pr#5719 <http://github.com/ceph/ceph/pull/5719>`_, Ruifeng Yang)
-* rgw: segments are read during HEAD on Swift DLO (`issue#12780 <http://tracker.ceph.com/issues/12780>`_, `pr#6160 <http://github.com/ceph/ceph/pull/6160>`_, Yehuda Sadeh)
-* rgw: setting max number of buckets for user via ceph.conf option  (`issue#12714 <http://tracker.ceph.com/issues/12714>`_, `pr#6166 <http://github.com/ceph/ceph/pull/6166>`_, Vikhyat Umrao)
-* rgw: Swift API: X-Trans-Id header is wrongly formatted (`issue#12108 <http://tracker.ceph.com/issues/12108>`_, `pr#5721 <http://github.com/ceph/ceph/pull/5721>`_, Radoslaw Zarzynski)
-* rgw: testGetContentType and testHead failed (`issue#11091 <http://tracker.ceph.com/issues/11091>`_, `pr#5718 <http://github.com/ceph/ceph/pull/5718>`_, Radoslaw Zarzynski)
-* rgw: testGetContentType and testHead failed (`issue#11438 <http://tracker.ceph.com/issues/11438>`_, `pr#5718 <http://github.com/ceph/ceph/pull/5718>`_, Radoslaw Zarzynski)
-* rgw: testGetContentType and testHead failed (`issue#12157 <http://tracker.ceph.com/issues/12157>`_, `pr#5718 <http://github.com/ceph/ceph/pull/5718>`_, Radoslaw Zarzynski)
-* rgw: testGetContentType and testHead failed (`issue#12158 <http://tracker.ceph.com/issues/12158>`_, `pr#5718 <http://github.com/ceph/ceph/pull/5718>`_, Radoslaw Zarzynski)
-* rgw: testGetContentType and testHead failed (`issue#12363 <http://tracker.ceph.com/issues/12363>`_, `pr#5718 <http://github.com/ceph/ceph/pull/5718>`_, Radoslaw Zarzynski)
-* rgw: the arguments 'domain' should not be assigned when return false (`issue#12629 <http://tracker.ceph.com/issues/12629>`_, `pr#5720 <http://github.com/ceph/ceph/pull/5720>`_, Ruifeng Yang)
-* tests: qa/workunits/cephtool/test.sh: don't assume crash_replay_interval=45 (`issue#13406 <http://tracker.ceph.com/issues/13406>`_, `pr#6172 <http://github.com/ceph/ceph/pull/6172>`_, Sage Weil)
-* tests: TEST_crush_rule_create_erasure consistently fails on i386 builder (`issue#12419 <http://tracker.ceph.com/issues/12419>`_, `pr#6201 <http://github.com/ceph/ceph/pull/6201>`_, Loic Dachary)
-* tools: ceph-disk zap should ensure block device (`issue#11272 <http://tracker.ceph.com/issues/11272>`_, `pr#5755 <http://github.com/ceph/ceph/pull/5755>`_, Loic Dachary)
-
-For more detailed information, see :download:`the complete changelog <../changelog/v0.94.4.txt>`.
-
-
-v0.94.3 Hammer
-==============
-
-This Hammer point release fixes a critical (though rare) data
-corruption bug that could be triggered when logs are rotated via
-SIGHUP.  It also fixes a range of other important bugs in the OSD,
-monitor, RGW, RGW, and CephFS.
-
-All v0.94.x Hammer users are strongly encouraged to upgrade.
-
-Upgrading
----------
-
-* The ``pg ls-by-{pool,primary,osd}`` commands and ``pg ls`` now take
-  the argument ``recovering`` instead of ``recovery`` in order to
-  include the recovering pgs in the listed pgs.
-
-Notable Changes
----------------
-* librbd: aio calls may block (`issue#11770 <http://tracker.ceph.com/issues/11770>`_, `pr#4875 <http://github.com/ceph/ceph/pull/4875>`_, Jason Dillaman)
-* osd: make the all osd/filestore thread pool suicide timeouts separately configurable (`issue#11701 <http://tracker.ceph.com/issues/11701>`_, `pr#5159 <http://github.com/ceph/ceph/pull/5159>`_, Samuel Just)
-* mon: ceph fails to compile with boost 1.58 (`issue#11982 <http://tracker.ceph.com/issues/11982>`_, `pr#5122 <http://github.com/ceph/ceph/pull/5122>`_, Kefu Chai)
-* tests: TEST_crush_reject_empty must not run a mon (`issue#12285,11975 <http://tracker.ceph.com/issues/12285,11975>`_, `pr#5208 <http://github.com/ceph/ceph/pull/5208>`_, Kefu Chai)
-* osd: FAILED assert(!old_value.deleted()) in upgrade:giant-x-hammer-distro-basic-multi run (`issue#11983 <http://tracker.ceph.com/issues/11983>`_, `pr#5121 <http://github.com/ceph/ceph/pull/5121>`_, Samuel Just)
-* build/ops: linking ceph to tcmalloc causes segfault on SUSE SLE11-SP3 (`issue#12368 <http://tracker.ceph.com/issues/12368>`_, `pr#5265 <http://github.com/ceph/ceph/pull/5265>`_, Thorsten Behrens)
-* common: utf8 and old gcc breakage on RHEL6.5 (`issue#7387 <http://tracker.ceph.com/issues/7387>`_, `pr#4687 <http://github.com/ceph/ceph/pull/4687>`_, Kefu Chai)
-* crush: take crashes due to invalid arg (`issue#11740 <http://tracker.ceph.com/issues/11740>`_, `pr#4891 <http://github.com/ceph/ceph/pull/4891>`_, Sage Weil)
-* rgw: need conversion tool to handle fixes following #11974 (`issue#12502 <http://tracker.ceph.com/issues/12502>`_, `pr#5384 <http://github.com/ceph/ceph/pull/5384>`_, Yehuda Sadeh)
-* rgw: Swift API: support for 202 Accepted response code on container creation (`issue#12299 <http://tracker.ceph.com/issues/12299>`_, `pr#5214 <http://github.com/ceph/ceph/pull/5214>`_, Radoslaw Zarzynski)
-* common: Log::reopen_log_file: take m_flush_mutex (`issue#12520 <http://tracker.ceph.com/issues/12520>`_, `pr#5405 <http://github.com/ceph/ceph/pull/5405>`_, Samuel Just)
-* rgw: Properly respond to the Connection header with Civetweb (`issue#12398 <http://tracker.ceph.com/issues/12398>`_, `pr#5284 <http://github.com/ceph/ceph/pull/5284>`_, Wido den Hollander)
-* rgw: multipart list part response returns incorrect field (`issue#12399 <http://tracker.ceph.com/issues/12399>`_, `pr#5285 <http://github.com/ceph/ceph/pull/5285>`_, Henry Chang)
-* build/ops: ceph.spec.in: 95-ceph-osd.rules, mount.ceph, and mount.fuse.ceph not installed properly on SUSE (`issue#12397 <http://tracker.ceph.com/issues/12397>`_, `pr#5283 <http://github.com/ceph/ceph/pull/5283>`_, Nathan Cutler)
-* rgw: radosgw-admin dumps user info twice (`issue#12400 <http://tracker.ceph.com/issues/12400>`_, `pr#5286 <http://github.com/ceph/ceph/pull/5286>`_, guce)
-* doc: fix doc build (`issue#12180 <http://tracker.ceph.com/issues/12180>`_, `pr#5095 <http://github.com/ceph/ceph/pull/5095>`_, Kefu Chai)
-* tests: backport 11493 fixes, and test, preventing ec cache pools (`issue#12314 <http://tracker.ceph.com/issues/12314>`_, `pr#4961 <http://github.com/ceph/ceph/pull/4961>`_, Samuel Just)
-* rgw: does not send Date HTTP header when civetweb frontend is used (`issue#11872 <http://tracker.ceph.com/issues/11872>`_, `pr#5228 <http://github.com/ceph/ceph/pull/5228>`_, Radoslaw Zarzynski)
-* mon: pg ls is broken (`issue#11910 <http://tracker.ceph.com/issues/11910>`_, `pr#5160 <http://github.com/ceph/ceph/pull/5160>`_, Kefu Chai)
-* librbd: A client opening an image mid-resize can result in the object map being invalidated (`issue#12237 <http://tracker.ceph.com/issues/12237>`_, `pr#5279 <http://github.com/ceph/ceph/pull/5279>`_, Jason Dillaman)
-* doc: missing man pages for ceph-create-keys, ceph-disk-* (`issue#11862 <http://tracker.ceph.com/issues/11862>`_, `pr#4846 <http://github.com/ceph/ceph/pull/4846>`_, Nathan Cutler)
-* tools: ceph-post-file fails on rhel7 (`issue#11876 <http://tracker.ceph.com/issues/11876>`_, `pr#5038 <http://github.com/ceph/ceph/pull/5038>`_, Sage Weil)
-* build/ops: rcceph script is buggy (`issue#12090 <http://tracker.ceph.com/issues/12090>`_, `pr#5028 <http://github.com/ceph/ceph/pull/5028>`_, Owen Synge)
-* rgw: Bucket header is enclosed by quotes (`issue#11874 <http://tracker.ceph.com/issues/11874>`_, `pr#4862 <http://github.com/ceph/ceph/pull/4862>`_, Wido den Hollander)
-* build/ops: packaging: add SuSEfirewall2 service files (`issue#12092 <http://tracker.ceph.com/issues/12092>`_, `pr#5030 <http://github.com/ceph/ceph/pull/5030>`_, Tim Serong)
-* rgw: Keystone PKI token expiration is not enforced (`issue#11722 <http://tracker.ceph.com/issues/11722>`_, `pr#4884 <http://github.com/ceph/ceph/pull/4884>`_, Anton Aksola)
-* build/ops: debian/control: ceph-common (>> 0.94.2) must be >= 0.94.2-2 (`issue#12529,11998 <http://tracker.ceph.com/issues/12529,11998>`_, `pr#5417 <http://github.com/ceph/ceph/pull/5417>`_, Loic Dachary)
-* mon: Clock skew causes missing summary and confuses Calamari (`issue#11879 <http://tracker.ceph.com/issues/11879>`_, `pr#4868 <http://github.com/ceph/ceph/pull/4868>`_, Thorsten Behrens)
-* rgw: rados objects wronly deleted (`issue#12099 <http://tracker.ceph.com/issues/12099>`_, `pr#5117 <http://github.com/ceph/ceph/pull/5117>`_, wuxingyi)
-* tests: kernel_untar_build fails on EL7 (`issue#12098 <http://tracker.ceph.com/issues/12098>`_, `pr#5119 <http://github.com/ceph/ceph/pull/5119>`_, Greg Farnum)
-* fs: Fh ref count will leak if readahead does not need to do read from osd (`issue#12319 <http://tracker.ceph.com/issues/12319>`_, `pr#5427 <http://github.com/ceph/ceph/pull/5427>`_, Zhi Zhang)
-* mon: OSDMonitor: allow addition of cache pool with non-empty snaps with co… (`issue#12595 <http://tracker.ceph.com/issues/12595>`_, `pr#5252 <http://github.com/ceph/ceph/pull/5252>`_, Samuel Just)
-* mon: MDSMonitor: handle MDSBeacon messages properly (`issue#11979 <http://tracker.ceph.com/issues/11979>`_, `pr#5123 <http://github.com/ceph/ceph/pull/5123>`_, Kefu Chai)
-* tools: ceph-disk: get_partition_type fails on /dev/cciss... (`issue#11760 <http://tracker.ceph.com/issues/11760>`_, `pr#4892 <http://github.com/ceph/ceph/pull/4892>`_, islepnev)
-* build/ops: max files open limit for OSD daemon is too low (`issue#12087 <http://tracker.ceph.com/issues/12087>`_, `pr#5026 <http://github.com/ceph/ceph/pull/5026>`_, Owen Synge)
-* mon: add an "osd crush tree" command (`issue#11833 <http://tracker.ceph.com/issues/11833>`_, `pr#5248 <http://github.com/ceph/ceph/pull/5248>`_, Kefu Chai)
-* mon: mon crashes when "ceph osd tree 85 --format json" (`issue#11975 <http://tracker.ceph.com/issues/11975>`_, `pr#4936 <http://github.com/ceph/ceph/pull/4936>`_, Kefu Chai)
-* build/ops: ceph / ceph-dbg steal ceph-objecstore-tool from ceph-test / ceph-test-dbg (`issue#11806 <http://tracker.ceph.com/issues/11806>`_, `pr#5069 <http://github.com/ceph/ceph/pull/5069>`_, Loic Dachary)
-* rgw: DragonDisk fails to create directories via S3: MissingContentLength (`issue#12042 <http://tracker.ceph.com/issues/12042>`_, `pr#5118 <http://github.com/ceph/ceph/pull/5118>`_, Yehuda Sadeh)
-* build/ops: /usr/bin/ceph from ceph-common is broken without installing ceph (`issue#11998 <http://tracker.ceph.com/issues/11998>`_, `pr#5206 <http://github.com/ceph/ceph/pull/5206>`_, Ken Dreyer)
-* build/ops: systemd: Increase max files open limit for OSD daemon (`issue#11964 <http://tracker.ceph.com/issues/11964>`_, `pr#5040 <http://github.com/ceph/ceph/pull/5040>`_, Owen Synge)
-* build/ops: rgw/logrotate.conf calls service with wrong init script name (`issue#12044 <http://tracker.ceph.com/issues/12044>`_, `pr#5055 <http://github.com/ceph/ceph/pull/5055>`_, wuxingyi)
-* common: OPT_INT option interprets 3221225472 as -1073741824, and crashes in Throttle::Throttle() (`issue#11738 <http://tracker.ceph.com/issues/11738>`_, `pr#4889 <http://github.com/ceph/ceph/pull/4889>`_, Kefu Chai)
-* doc: doc/release-notes: v0.94.2 (`issue#11492 <http://tracker.ceph.com/issues/11492>`_, `pr#4934 <http://github.com/ceph/ceph/pull/4934>`_, Sage Weil)
-* common: admin_socket: close socket descriptor in destructor (`issue#11706 <http://tracker.ceph.com/issues/11706>`_, `pr#4657 <http://github.com/ceph/ceph/pull/4657>`_, Jon Bernard)
-* rgw: Object copy bug (`issue#11755 <http://tracker.ceph.com/issues/11755>`_, `pr#4885 <http://github.com/ceph/ceph/pull/4885>`_, Javier M. Mellid)
-* rgw: empty json response when getting user quota (`issue#12245 <http://tracker.ceph.com/issues/12245>`_, `pr#5237 <http://github.com/ceph/ceph/pull/5237>`_, wuxingyi)
-* fs: cephfs Dumper tries to load whole journal into memory at once (`issue#11999 <http://tracker.ceph.com/issues/11999>`_, `pr#5120 <http://github.com/ceph/ceph/pull/5120>`_, John Spray)
-* rgw: Fix tool for #11442 does not correctly fix objects created via multipart uploads (`issue#12242 <http://tracker.ceph.com/issues/12242>`_, `pr#5229 <http://github.com/ceph/ceph/pull/5229>`_, Yehuda Sadeh)
-* rgw: Civetweb RGW appears to report full size of object as downloaded when only partially downloaded (`issue#12243 <http://tracker.ceph.com/issues/12243>`_, `pr#5231 <http://github.com/ceph/ceph/pull/5231>`_, Yehuda Sadeh)
-* osd: stuck incomplete (`issue#12362 <http://tracker.ceph.com/issues/12362>`_, `pr#5269 <http://github.com/ceph/ceph/pull/5269>`_, Samuel Just)
-* osd: start_flush: filter out removed snaps before determining snapc's (`issue#11911 <http://tracker.ceph.com/issues/11911>`_, `pr#4899 <http://github.com/ceph/ceph/pull/4899>`_, Samuel Just)
-* librbd: internal.cc: 1967: FAILED assert(watchers.size() == 1) (`issue#12239 <http://tracker.ceph.com/issues/12239>`_, `pr#5243 <http://github.com/ceph/ceph/pull/5243>`_, Jason Dillaman)
-* librbd: new QA client upgrade tests (`issue#12109 <http://tracker.ceph.com/issues/12109>`_, `pr#5046 <http://github.com/ceph/ceph/pull/5046>`_, Jason Dillaman)
-* librbd: [  FAILED  ] TestLibRBD.ExclusiveLockTransition (`issue#12238 <http://tracker.ceph.com/issues/12238>`_, `pr#5241 <http://github.com/ceph/ceph/pull/5241>`_, Jason Dillaman)
-* rgw: Swift API: XML document generated in response for GET on account does not contain account name (`issue#12323 <http://tracker.ceph.com/issues/12323>`_, `pr#5227 <http://github.com/ceph/ceph/pull/5227>`_, Radoslaw Zarzynski)
-* rgw: keystone does not support chunked input (`issue#12322 <http://tracker.ceph.com/issues/12322>`_, `pr#5226 <http://github.com/ceph/ceph/pull/5226>`_, Hervé Rousseau)
-* mds: MDS is crashed (mds/CDir.cc: 1391: FAILED assert(!is_complete())) (`issue#11737 <http://tracker.ceph.com/issues/11737>`_, `pr#4886 <http://github.com/ceph/ceph/pull/4886>`_, Yan, Zheng)
-* cli: ceph: cli interactive mode does not understand quotes (`issue#11736 <http://tracker.ceph.com/issues/11736>`_, `pr#4776 <http://github.com/ceph/ceph/pull/4776>`_, Kefu Chai)
-* librbd: add valgrind memory checks for unit tests (`issue#12384 <http://tracker.ceph.com/issues/12384>`_, `pr#5280 <http://github.com/ceph/ceph/pull/5280>`_, Zhiqiang Wang)
-* build/ops: admin/build-doc: script fails silently under certain circumstances (`issue#11902 <http://tracker.ceph.com/issues/11902>`_, `pr#4877 <http://github.com/ceph/ceph/pull/4877>`_, John Spray)
-* osd: Fixes for rados ops with snaps (`issue#11908 <http://tracker.ceph.com/issues/11908>`_, `pr#4902 <http://github.com/ceph/ceph/pull/4902>`_, Samuel Just)
-* build/ops: ceph.spec.in: ceph-common subpackage def needs tweaking for SUSE/openSUSE (`issue#12308 <http://tracker.ceph.com/issues/12308>`_, `pr#4883 <http://github.com/ceph/ceph/pull/4883>`_, Nathan Cutler)
-* fs: client: reference counting 'struct Fh' (`issue#12088 <http://tracker.ceph.com/issues/12088>`_, `pr#5222 <http://github.com/ceph/ceph/pull/5222>`_, Yan, Zheng)
-* build/ops: ceph.spec: update OpenSUSE BuildRequires  (`issue#11611 <http://tracker.ceph.com/issues/11611>`_, `pr#4667 <http://github.com/ceph/ceph/pull/4667>`_, Loic Dachary)
-
-For more detailed information, see :download:`the complete changelog <../changelog/v0.94.3.txt>`.
-
-
-
-v0.94.2 Hammer
-==============
-
-This Hammer point release fixes a few critical bugs in RGW that can
-prevent objects starting with underscore from behaving properly and
-that prevent garbage collection of deleted objects when using the
-Civetweb standalone mode.
-
-All v0.94.x Hammer users are strongly encouraged to upgrade, and to
-make note of the repair procedure below if RGW is in use.
-
-Upgrading from previous Hammer release
---------------------------------------
-
-Bug #11442 introduced a change that made rgw objects that start with underscore
-incompatible with previous versions. The fix to that bug reverts to the
-previous behavior. In order to be able to access objects that start with an
-underscore and were created in prior Hammer releases, following the upgrade it
-is required to run (for each affected bucket)::
-
-    $ radosgw-admin bucket check --check-head-obj-locator \
-                                 --bucket=<bucket> [--fix]
-
-Notable changes
----------------
-
-* build: compilation error: No high-precision counter available  (armhf, powerpc..) (#11432, James Page)
-* ceph-dencoder links to libtcmalloc, and shouldn't (#10691, Boris Ranto)
-* ceph-disk: disk zap sgdisk invocation (#11143, Owen Synge)
-* ceph-disk: use a new disk as journal disk,ceph-disk prepare fail (#10983, Loic Dachary)
-* ceph-objectstore-tool should be in the ceph server package (#11376, Ken Dreyer)
-* librados: can get stuck in redirect loop if osdmap epoch == last_force_op_resend (#11026, Jianpeng Ma)
-* librbd: A retransmit of proxied flatten request can result in -EINVAL (Jason Dillaman)
-* librbd: ImageWatcher should cancel in-flight ops on watch error (#11363, Jason Dillaman)
-* librbd: Objectcacher setting max object counts too low (#7385, Jason Dillaman)
-* librbd: Periodic failure of TestLibRBD.DiffIterateStress (#11369, Jason Dillaman)
-* librbd: Queued AIO reference counters not properly updated (#11478, Jason Dillaman)
-* librbd: deadlock in image refresh (#5488, Jason Dillaman)
-* librbd: notification race condition on snap_create (#11342, Jason Dillaman)
-* mds: Hammer uclient checking (#11510, John Spray)
-* mds: remove caps from revoking list when caps are voluntarily released (#11482, Yan, Zheng)
-* messenger: double clear of pipe in reaper (#11381, Haomai Wang)
-* mon: Total size of OSDs is a maginitude less than it is supposed to be. (#11534, Zhe Zhang)
-* osd: don't check order in finish_proxy_read (#11211, Zhiqiang Wang)
-* osd: handle old semi-deleted pgs after upgrade (#11429, Samuel Just)
-* osd: object creation by write cannot use an offset on an erasure coded pool (#11507, Jianpeng Ma)
-* rgw: Improve rgw HEAD request by avoiding read the body of the first chunk (#11001, Guang Yang)
-* rgw: civetweb is hitting a limit (number of threads 1024) (#10243, Yehuda Sadeh)
-* rgw: civetweb should use unique request id (#10295, Orit Wasserman)
-* rgw: critical fixes for hammer (#11447, #11442, Yehuda Sadeh)
-* rgw: fix swift COPY headers (#10662, #10663, #11087, #10645, Radoslaw Zarzynski)
-* rgw: improve performance for large object  (multiple chunks) GET (#11322, Guang Yang)
-* rgw: init-radosgw: run RGW as root (#11453, Ken Dreyer)
-* rgw: keystone token cache does not work correctly (#11125, Yehuda Sadeh)
-* rgw: make quota/gc thread configurable for starting (#11047, Guang Yang)
-* rgw: make swift responses of RGW return last-modified, content-length, x-trans-id headers.(#10650, Radoslaw Zarzynski)
-* rgw: merge manifests correctly when there's prefix override (#11622, Yehuda Sadeh)
-* rgw: quota not respected in POST object (#11323, Sergey Arkhipov)
-* rgw: restore buffer of multipart upload after EEXIST (#11604, Yehuda Sadeh)
-* rgw: shouldn't need to disable rgw_socket_path if frontend is configured (#11160, Yehuda Sadeh)
-* rgw: swift: Response header of GET request for container does not contain X-Container-Object-Count, X-Container-Bytes-Used and x-trans-id headers (#10666, Dmytro Iurchenko)
-* rgw: swift: Response header of POST request for object does not contain content-length and x-trans-id headers (#10661, Radoslaw Zarzynski)
-* rgw: swift: response for GET/HEAD on container does not contain the X-Timestamp header (#10938, Radoslaw Zarzynski)
-* rgw: swift: response for PUT on /container does not contain the mandatory Content-Length header when FCGI is used (#11036, #10971, Radoslaw Zarzynski)
-* rgw: swift: wrong handling of empty metadata on Swift container (#11088, Radoslaw Zarzynski)
-* tests: TestFlatIndex.cc races with TestLFNIndex.cc (#11217, Xinze Chi)
-* tests: ceph-helpers kill_daemons fails when kill fails (#11398, Loic Dachary)
-
-For more detailed information, see :download:`the complete changelog <../changelog/v0.94.2.txt>`.
-
-
-v0.94.1 Hammer
-==============
-
-This bug fix release fixes a few critical issues with CRUSH.  The most
-important addresses a bug in feature bit enforcement that may prevent
-pre-hammer clients from communicating with the cluster during an
-upgrade.  This only manifests in some cases (for example, when the
-'rack' type is in use in the CRUSH map, and possibly other cases), but for
-safety we strongly recommend that all users use 0.94.1 instead of 0.94 when
-upgrading.
-
-There is also a fix in the new straw2 buckets when OSD weights are 0.
-
-We recommend that all v0.94 users upgrade.
-
-Notable changes
----------------
-
-* crush: fix divide-by-0 in straw2 (#11357 Sage Weil)
-* crush: fix has_v4_buckets (#11364 Sage Weil)
-* osd: fix negative degraded objects during backfilling (#7737 Guang Yang)
-
-For more detailed information, see :download:`the complete changelog <../changelog/v0.94.1.txt>`.
-
-
-v0.94 Hammer
-============
-
-This major release is expected to form the basis of the next long-term
-stable series.  It is intended to supersede v0.80.x Firefly.
-
-Highlights since Giant include:
-
-* *RADOS Performance*: a range of improvements have been made in the
-  OSD and client-side librados code that improve the throughput on
-  flash backends and improve parallelism and scaling on fast machines.
-* *Simplified RGW deployment*: the ceph-deploy tool now has a new
-  'ceph-deploy rgw create HOST' command that quickly deploys a
-  instance of the S3/Swift gateway using the embedded Civetweb server.
-  This is vastly simpler than the previous Apache-based deployment.
-  There are a few rough edges (e.g., around SSL support) but we
-  encourage users to try `the new method`_.
-* *RGW object versioning*: RGW now supports the S3 object versioning
-  API, which preserves old version of objects instead of overwriting
-  them.
-* *RGW bucket sharding*: RGW can now shard the bucket index for large
-  buckets across, improving performance for very large buckets.
-* *RBD object maps*: RBD now has an object map function that tracks
-  which parts of the image are allocating, improving performance for
-  clones and for commands like export and delete.
-* *RBD mandatory locking*: RBD has a new mandatory locking framework
-  (still disabled by default) that adds additional safeguards to
-  prevent multiple clients from using the same image at the same time.
-* *RBD copy-on-read*: RBD now supports copy-on-read for image clones,
-  improving performance for some workloads.
-* *CephFS snapshot improvements*: Many many bugs have been fixed with
-  CephFS snapshots.  Although they are still disabled by default,
-  stability has improved significantly.
-* *CephFS Recovery tools*: We have built some journal recovery and
-  diagnostic tools. Stability and performance of single-MDS systems is
-  vastly improved in Giant, and more improvements have been made now
-  in Hammer.  Although we still recommend caution when storing
-  important data in CephFS, we do encourage testing for non-critical
-  workloads so that we can better gauge the feature, usability,
-  performance, and stability gaps.
-* *CRUSH improvements*: We have added a new straw2 bucket algorithm
-  that reduces the amount of data migration required when changes are
-  made to the cluster.
-* *Shingled erasure codes (SHEC)*: The OSDs now have experimental
-  support for shingled erasure codes, which allow a small amount of
-  additional storage to be traded for improved recovery performance.
-* *RADOS cache tiering*: A series of changes have been made in the
-  cache tiering code that improve performance and reduce latency.
-* *RDMA support*: There is now experimental support the RDMA via the
-  Accelio (libxio) library.
-* *New administrator commands*: The 'ceph osd df' command shows
-  pertinent details on OSD disk utilizations.  The 'ceph pg ls ...'
-  command makes it much simpler to query PG states while diagnosing
-  cluster issues.
-
-.. _the new method: ../start/quick-ceph-deploy/#add-an-rgw-instance
-
-Other highlights since Firefly include:
-
-* *CephFS*: we have fixed a raft of bugs in CephFS and built some
-  basic journal recovery and diagnostic tools.  Stability and
-  performance of single-MDS systems is vastly improved in Giant.
-  Although we do not yet recommend CephFS for production deployments,
-  we do encourage testing for non-critical workloads so that we can
-  better gauge the feature, usability, performance, and stability
-  gaps.
-* *Local Recovery Codes*: the OSDs now support an erasure-coding scheme
-  that stores some additional data blocks to reduce the IO required to
-  recover from single OSD failures.
-* *Degraded vs misplaced*: the Ceph health reports from 'ceph -s' and
-  related commands now make a distinction between data that is
-  degraded (there are fewer than the desired number of copies) and
-  data that is misplaced (stored in the wrong location in the
-  cluster).  The distinction is important because the latter does not
-  compromise data safety.
-* *Tiering improvements*: we have made several improvements to the
-  cache tiering implementation that improve performance.  Most
-  notably, objects are not promoted into the cache tier by a single
-  read; they must be found to be sufficiently hot before that happens.
-* *Monitor performance*: the monitors now perform writes to the local
-  data store asynchronously, improving overall responsiveness.
-* *Recovery tools*: the ceph-objectstore-tool is greatly expanded to
-  allow manipulation of an individual OSDs data store for debugging
-  and repair purposes.  This is most heavily used by our QA
-  infrastructure to exercise recovery code.
-
-I would like to take this opportunity to call out the amazing growth
-in contributors to Ceph beyond the core development team from Inktank.
-Hammer features major new features and improvements from Intel, Fujitsu,
-UnitedStack, Yahoo, UbuntuKylin, CohortFS, Mellanox, CERN, Deutsche
-Telekom, Mirantis, and SanDisk.
-
-Dedication
-----------
-
-This release is dedicated in memoriam to Sandon Van Ness, aka
-Houkouonchi, who unexpectedly passed away a few weeks ago.  Sandon was
-responsible for maintaining the large and complex Sepia lab that
-houses the Ceph project's build and test infrastructure.  His efforts
-have made an important impact on our ability to reliably test Ceph
-with a relatively small group of people.  He was a valued member of
-the team and we will miss him.  H is also for Houkouonchi.
-
-Upgrading
----------
-
-* If your existing cluster is running a version older than v0.80.x
-  Firefly, please first upgrade to the latest Firefly release before
-  moving on to Giant.  We have not tested upgrades directly from
-  Emperor, Dumpling, or older releases.
-
-  We *have* tested:
-
-   * Firefly to Hammer
-   * Giant to Hammer
-   * Dumpling to Firefly to Hammer
-
-* Please upgrade daemons in the following order:
-
-   #. Monitors
-   #. OSDs
-   #. MDSs and/or radosgw
-
-  Note that the relative ordering of OSDs and monitors should not matter, but
-  we primarily tested upgrading monitors first.
-
-* The ceph-osd daemons will perform a disk-format upgrade improve the
-  PG metadata layout and to repair a minor bug in the on-disk format.
-  It may take a minute or two for this to complete, depending on how
-  many objects are stored on the node; do not be alarmed if they do
-  not marked "up" by the cluster immediately after starting.
-
-* If upgrading from v0.93, set
-   osd enable degraded writes = false
-
-  on all osds prior to upgrading.  The degraded writes feature has
-  been reverted due to 11155.
-
-* The LTTNG tracing in librbd and librados is disabled in the release packages
-  until we find a way to avoid violating distro security policies when linking
-  libust.
-
-Upgrading from v0.87.x Giant
-----------------------------
-
-* librbd and librados include lttng tracepoints on distros with
-  liblttng 2.4 or later (only Ubuntu Trusty for the ceph.com
-  packages). When running a daemon that uses these libraries, i.e. an
-  application that calls fork(2) or clone(2) without exec(3), you must
-  set LD_PRELOAD=liblttng-ust-fork.so.0 to prevent a crash in the
-  lttng atexit handler when the process exits. The only ceph tool that
-  requires this is rbd-fuse.
-
-* If rgw_socket_path is defined and rgw_frontends defines a
-  socket_port and socket_host, we now allow the rgw_frontends settings
-  to take precedence.  This change should only affect users who have
-  made non-standard changes to their radosgw configuration.
-
-* If you are upgrading specifically from v0.92, you must stop all OSD
-  daemons and flush their journals (``ceph-osd -i NNN
-  --flush-journal``) before upgrading.  There was a transaction
-  encoding bug in v0.92 that broke compatibility.  Upgrading from v0.93,
-  v0.91, or anything earlier is safe.
-
-* The experimental 'keyvaluestore-dev' OSD backend has been renamed
-  'keyvaluestore' (for simplicity) and marked as experimental.  To
-  enable this untested feature and acknowledge that you understand
-  that it is untested and may destroy data, you need to add the
-  following to your ceph.conf::
-
-    enable experimental unrecoverable data corrupting features = keyvaluestore
-
-* The following librados C API function calls take a 'flags' argument whose value
-  is now correctly interpreted:
-
-     rados_write_op_operate()
-     rados_aio_write_op_operate()
-     rados_read_op_operate()
-     rados_aio_read_op_operate()
-
-  The flags were not correctly being translated from the librados constants to the
-  internal values.  Now they are.  Any code that is passing flags to these methods
-  should be audited to ensure that they are using the correct LIBRADOS_OP_FLAG_*
-  constants.
-
-* The 'rados' CLI 'copy' and 'cppool' commands now use the copy-from operation,
-  which means the latest CLI cannot run these commands against pre-firefly OSDs.
-
-* The librados watch/notify API now includes a watch_flush() operation to flush
-  the async queue of notify operations.  This should be called by any watch/notify
-  user prior to rados_shutdown().
-
-* The 'category' field for objects has been removed.  This was originally added
-  to track PG stat summations over different categories of objects for use by
-  radosgw.  It is no longer has any known users and is prone to abuse because it
-  can lead to a pg_stat_t structure that is unbounded.  The librados API calls
-  that accept this field now ignore it, and the OSD no longer tracks the
-  per-category summations.
-
-* The output for 'rados df' has changed.  The 'category' level has been
-  eliminated, so there is now a single stat object per pool.  The structure of
-  the JSON output is different, and the plaintext output has one less column.
-
-* The 'rados create <objectname> [category]' optional category argument is no
-  longer supported or recognized.
-
-* rados.py's Rados class no longer has a __del__ method; it was causing
-  problems on interpreter shutdown and use of threads.  If your code has
-  Rados objects with limited lifetimes and you're concerned about locked
-  resources, call Rados.shutdown() explicitly.
-
-* There is a new version of the librados watch/notify API with vastly
-  improved semantics.  Any applications using this interface are
-  encouraged to migrate to the new API.  The old API calls are marked
-  as deprecated and will eventually be removed.
-
-* The librados rados_unwatch() call used to be safe to call on an
-  invalid handle.  The new version has undefined behavior when passed
-  a bogus value (for example, when rados_watch() returns an error and
-  handle is not defined).
-
-* The structure of the formatted 'pg stat' command is changed for the
-  portion that counts states by name to avoid using the '+' character
-  (which appears in state names) as part of the XML token (it is not
-  legal).
-
-* Previously, the formatted output of 'ceph pg stat -f ...' was a full
-  pg dump that included all metadata about all PGs in the system.  It
-  is now a concise summary of high-level PG stats, just like the
-  unformatted 'ceph pg stat' command.
-
-* All JSON dumps of floating point values were incorrecting surrounding the
-  value with quotes.  These quotes have been removed.  Any consumer of structured
-  JSON output that was consuming the floating point values was previously having
-  to interpret the quoted string and will most likely need to be fixed to take
-  the unquoted number.
-
-* New ability to list all objects from all namespaces that can fail or
-  return incomplete results when not all OSDs have been upgraded.
-  Features rados --all ls, rados cppool, rados export, rados
-  cache-flush-evict-all and rados cache-try-flush-evict-all can also
-  fail or return incomplete results.
-
-* Due to a change in the Linux kernel version 3.18 and the limits of the FUSE
-  interface, ceph-fuse needs be mounted as root on at least some systems. See
-  issues #9997, #10277, and #10542 for details.
-
-Upgrading from v0.80x Firefly (additional notes)
-------------------------------------------------
-
-* The client-side caching for librbd is now enabled by default (rbd
-  cache = true).  A safety option (rbd cache writethrough until flush
-  = true) is also enabled so that writeback caching is not used until
-  the library observes a 'flush' command, indicating that the librbd
-  users is passing that operation through from the guest VM.  This
-  avoids potential data loss when used with older versions of qemu
-  that do not support flush.
-
-    leveldb_write_buffer_size = 8*1024*1024  = 33554432   // 8MB
-    leveldb_cache_size        = 512*1024*1204 = 536870912 // 512MB
-    leveldb_block_size        = 64*1024       = 65536     // 64KB
-    leveldb_compression       = false
-    leveldb_log               = ""
-
-  OSDs will still maintain the following osd-specific defaults:
-
-    leveldb_log               = ""
-
-* The 'rados getxattr ...' command used to add a gratuitous newline to the attr
-  value; it now does not.
-
-* The ``*_kb perf`` counters on the monitor have been removed.  These are
-  replaced with a new set of ``*_bytes`` counters (e.g., ``cluster_osd_kb`` is
-  replaced by ``cluster_osd_bytes``).
-
-* The ``rd_kb`` and ``wr_kb`` fields in the JSON dumps for pool stats (accessed
-  via the ``ceph df detail -f json-pretty`` and related commands) have been
-  replaced with corresponding ``*_bytes`` fields.  Similarly, the
-  ``total_space``, ``total_used``, and ``total_avail`` fields are replaced with
-  ``total_bytes``, ``total_used_bytes``,  and ``total_avail_bytes`` fields.
-
-* The ``rados df --format=json`` output ``read_bytes`` and ``write_bytes``
-  fields were incorrectly reporting ops; this is now fixed.
-
-* The ``rados df --format=json`` output previously included ``read_kb`` and
-  ``write_kb`` fields; these have been removed.  Please use ``read_bytes`` and
-  ``write_bytes`` instead (and divide by 1024 if appropriate).
-
-* The experimental keyvaluestore-dev OSD backend had an on-disk format
-  change that prevents existing OSD data from being upgraded.  This
-  affects developers and testers only.
-
-* mon-specific and osd-specific leveldb options have been removed.
-  From this point onward users should use the `leveldb_*` generic
-  options and add the options in the appropriate sections of their
-  configuration files.  Monitors will still maintain the following
-  monitor-specific defaults:
-
-    leveldb_write_buffer_size = 8*1024*1024  = 33554432   // 8MB
-    leveldb_cache_size        = 512*1024*1204 = 536870912 // 512MB
-    leveldb_block_size        = 64*1024       = 65536     // 64KB
-    leveldb_compression       = false
-    leveldb_log               = ""
-
-  OSDs will still maintain the following osd-specific defaults:
-
-    leveldb_log               = ""
-
-* CephFS support for the legacy anchor table has finally been removed.
-  Users with file systems created before firefly should ensure that inodes
-  with multiple hard links are modified *prior* to the upgrade to ensure that
-  the backtraces are written properly.  For example::
-
-    sudo find /mnt/cephfs -type f -links +1 -exec touch \{\} \;
-
-* We disallow nonsensical 'tier cache-mode' transitions.  From this point
-  onward, 'writeback' can only transition to 'forward' and 'forward'
-  can transition to 1) 'writeback' if there are dirty objects, or 2) any if
-  there are no dirty objects.
-
-
-Notable changes since v0.93
----------------------------
-
-* build: a few cmake fixes (Matt Benjamin)
-* build: fix build on RHEL/CentOS 5.9 (Rohan Mars)
-* build: reorganize Makefile to allow modular builds (Boris Ranto)
-* ceph-fuse: be more forgiving on remount (#10982 Greg Farnum)
-* ceph: improve CLI parsing (#11093 David Zafman)
-* common: fix cluster logging to default channel (#11177 Sage Weil)
-* crush: fix parsing of straw2 buckets (#11015 Sage Weil)
-* doc: update man pages (David Zafman)
-* librados: fix leak in C_TwoContexts (Xiong Yiliang)
-* librados: fix leak in watch/notify path (Sage Weil)
-* librbd: fix and improve AIO cache invalidation (#10958 Jason Dillaman)
-* librbd: fix memory leak (Jason Dillaman)
-* librbd: fix ordering/queueing of resize operations (Jason Dillaman)
-* librbd: validate image is r/w on resize/flatten (Jason Dillaman)
-* librbd: various internal locking fixes (Jason Dillaman)
-* lttng: tracing is disabled until we streamline dependencies (Josh Durgin)
-* mon: add bootstrap-rgw profile (Sage Weil)
-* mon: do not pollute mon dir with CSV files from CRUSH check (Loic Dachary)
-* mon: fix clock drift time check interval (#10546 Joao Eduardo Luis)
-* mon: fix units in store stats (Joao Eduardo Luis)
-* mon: improve error handling on erasure code profile set (#10488, #11144 Loic Dachary)
-* mon: set {read,write}_tier on 'osd tier add-cache ...' (Jianpeng Ma)
-* ms: xio: fix misc bugs (Matt Benjamin, Vu Pham)
-* osd: DBObjectMap: fix locking to prevent rare crash (#9891 Samuel Just)
-* osd: fix and document last_epoch_started semantics (Samuel Just)
-* osd: fix divergent entry handling on PG split (Samuel Just)
-* osd: fix leak on shutdown (Kefu Chai)
-* osd: fix recording of digest on scrub (Samuel Just)
-* osd: fix whiteout handling (Sage Weil)
-* rbd: allow v2 striping parameters for clones and imports (Jason Dillaman)
-* rbd: fix formatted output of image features (Jason Dillaman)
-* rbd: updat eman page (Ilya Dryomov)
-* rgw: don't overwrite bucket/object owner when setting ACLs (#10978 Yehuda Sadeh)
-* rgw: enable IPv6 for civetweb (#10965 Yehuda Sadeh)
-* rgw: fix sysvinit script when rgw_socket_path is not defined (#11159 Yehuda Sadeh, Dan Mick)
-* rgw: pass civetweb configurables through (#10907 Yehuda Sadeh)
-* rgw: use new watch/notify API (Yehuda Sadeh, Sage Weil)
-* osd: reverted degraded writes feature due to 11155
-
-Notable changes since v0.87.x Giant
------------------------------------
-
-* add experimental features option (Sage Weil)
-* arch: fix NEON feaeture detection (#10185 Loic Dachary)
-* asyncmsgr: misc fixes (Haomai Wang)
-* buffer: add 'shareable' construct (Matt Benjamin)
-* buffer: add list::get_contiguous (Sage Weil)
-* buffer: avoid rebuild if buffer already contiguous (Jianpeng Ma)
-* build: CMake support (Ali Maredia, Casey Bodley, Adam Emerson, Marcus Watts, Matt Benjamin)
-* build: a few cmake fixes (Matt Benjamin)
-* build: aarch64 build fixes (Noah Watkins, Haomai Wang)
-* build: adjust build deps for yasm, virtualenv (Jianpeng Ma)
-* build: fix 'make check' races (#10384 Loic Dachary)
-* build: fix build on RHEL/CentOS 5.9 (Rohan Mars)
-* build: fix pkg names when libkeyutils is missing (Pankag Garg, Ken Dreyer)
-* build: improve build dependency tooling (Loic Dachary)
-* build: reorganize Makefile to allow modular builds (Boris Ranto)
-* build: support for jemalloc (Shishir Gowda)
-* ceph-disk: Scientific Linux support (Dan van der Ster)
-* ceph-disk: allow journal partition re-use (#10146 Loic Dachary, Dav van der Ster)
-* ceph-disk: call partx/partprobe consistency (#9721 Loic Dachary)
-* ceph-disk: do not re-use partition if encryption is required (Loic Dachary)
-* ceph-disk: fix dmcrypt key permissions (Loic Dachary)
-* ceph-disk: fix umount race condition (#10096 Blaine Gardner)
-* ceph-disk: improved systemd support (Owen Synge)
-* ceph-disk: init=none option (Loic Dachary)
-* ceph-disk: misc fixes (Christos Stavrakakis)
-* ceph-disk: respect --statedir for keyring (Loic Dachary)
-* ceph-disk: set guid if reusing journal partition (Dan van der Ster)
-* ceph-disk: support LUKS for encrypted partitions (Andrew Bartlett, Loic Dachary)
-* ceph-fuse, libcephfs: POSIX file lock support (Yan, Zheng)
-* ceph-fuse, libcephfs: allow xattr caps in inject_release_failure (#9800 John Spray)
-* ceph-fuse, libcephfs: fix I_COMPLETE_ORDERED checks (#9894 Yan, Zheng)
-* ceph-fuse, libcephfs: fix cap flush overflow (Greg Farnum, Yan, Zheng)
-* ceph-fuse, libcephfs: fix root inode xattrs (Yan, Zheng)
-* ceph-fuse, libcephfs: preserve dir ordering (#9178 Yan, Zheng)
-* ceph-fuse, libcephfs: trim inodes before reconnecting to MDS (Yan, Zheng)
-* ceph-fuse,libcephfs: add support for O_NOFOLLOW and O_PATH (Greg Farnum)
-* ceph-fuse,libcephfs: resend requests before completing cap reconnect (#10912 Yan, Zheng)
-* ceph-fuse: be more forgiving on remount (#10982 Greg Farnum)
-* ceph-fuse: fix dentry invalidation on 3.18+ kernels (#9997 Yan, Zheng)
-* ceph-fuse: fix kernel cache trimming (#10277 Yan, Zheng)
-* ceph-fuse: select kernel cache invalidation mechanism based on kernel version (Greg Farnum)
-* ceph-monstore-tool: fix shutdown (#10093 Loic Dachary)
-* ceph-monstore-tool: fix/improve CLI (Joao Eduardo Luis)
-* ceph-objectstore-tool: fix import (#10090 David Zafman)
-* ceph-objectstore-tool: improved import (David Zafman)
-* ceph-objectstore-tool: many improvements and tests (David Zafman)
-* ceph-objectstore-tool: many many improvements (David Zafman)
-* ceph-objectstore-tool: misc improvements, fixes (#9870 #9871 David Zafman)
-* ceph.spec: package rbd-replay-prep (Ken Dreyer)
-* ceph: add 'ceph osd df [tree]' command (#10452 Mykola Golub)
-* ceph: do not parse injectargs twice (Loic Dachary)
-* ceph: fix 'ceph tell ...' command validation (#10439 Joao Eduardo Luis)
-* ceph: improve 'ceph osd tree' output (Mykola Golub)
-* ceph: improve CLI parsing (#11093 David Zafman)
-* ceph: make 'ceph -s' output more readable (Sage Weil)
-* ceph: make 'ceph -s' show PG state counts in sorted order (Sage Weil)
-* ceph: make 'ceph tell mon.* version' work (Mykola Golub)
-* ceph: new 'ceph tell mds.$name_or_rank_or_gid' (John Spray)
-* ceph: show primary-affinity in 'ceph osd tree' (Mykola Golub)
-* ceph: test robustness (Joao Eduardo Luis)
-* ceph_objectstore_tool: behave with sharded flag (#9661 David Zafman)
-* cephfs-journal-tool: add recover_dentries function (#9883 John Spray)
-* cephfs-journal-tool: fix journal import (#10025 John Spray)
-* cephfs-journal-tool: skip up to expire_pos (#9977 John Spray)
-* cleanup rados.h definitions with macros (Ilya Dryomov)
-* common: add 'perf reset ...' admin command (Jianpeng Ma)
-* common: add TableFormatter (Andreas Peters)
-* common: add newline to flushed json output (Sage Weil)
-* common: check syncfs() return code (Jianpeng Ma)
-* common: do not unlock rwlock on destruction (Federico Simoncelli)
-* common: filtering for 'perf dump' (John Spray)
-* common: fix Formatter factory breakage (#10547 Loic Dachary)
-* common: fix block device discard check (#10296 Sage Weil)
-* common: make json-pretty output prettier (Sage Weil)
-* common: remove broken CEPH_LOCKDEP optoin (Kefu Chai)
-* common: shared_cache unit tests (Cheng Cheng)
-* common: support new gperftools header locations (Key Dreyer)
-* config: add $cctid meta variable (Adam Crume)
-* crush: fix buffer overrun for poorly formed rules (#9492 Johnu George)
-* crush: fix detach_bucket (#10095 Sage Weil)
-* crush: fix parsing of straw2 buckets (#11015 Sage Weil)
-* crush: fix several bugs in adjust_item_weight (Rongze Zhu)
-* crush: fix tree bucket behavior (Rongze Zhu)
-* crush: improve constness (Loic Dachary)
-* crush: new and improved straw2 bucket type (Sage Weil, Christina Anderson, Xiaoxi Chen)
-* crush: straw bucket weight calculation fixes (#9998 Sage Weil)
-* crush: update tries stats for indep rules (#10349 Loic Dachary)
-* crush: use larger choose_tries value for erasure code rulesets (#10353 Loic Dachary)
-* crushtool: add --location <id> command (Sage Weil, Loic Dachary)
-* debian,rpm: move RBD udev rules to ceph-common (#10864 Ken Dreyer)
-* debian: split python-ceph into python-{rbd,rados,cephfs} (Boris Ranto)
-* default to libnss instead of crypto++ (Federico Gimenez)
-* doc: CephFS disaster recovery guidance (John Spray)
-* doc: CephFS for early adopters (John Spray)
-* doc: add build-doc guidlines for Fedora and CentOS/RHEL (Nilamdyuti Goswami)
-* doc: add dumpling to firefly upgrade section (#7679 John Wilkins)
-* doc: ceph osd reweight vs crush weight (Laurent Guerby)
-* doc: do not suggest dangerous XFS nobarrier option (Dan van der Ster)
-* doc: document erasure coded pool operations (#9970 Loic Dachary)
-* doc: document the LRC per-layer plugin configuration (Yuan Zhou)
-* doc: enable rbd cache on openstack deployments (Sebastien Han)
-* doc: erasure code doc updates (Loic Dachary)
-* doc: file system osd config settings (Kevin Dalley)
-* doc: fix OpenStack Glance docs (#10478 Sebastien Han)
-* doc: improved installation nots on CentOS/RHEL installs (John Wilkins)
-* doc: key/value store config reference (John Wilkins)
-* doc: misc cleanups (Adam Spiers, Sebastien Han, Nilamdyuti Goswami, Ken Dreyer, John Wilkins)
-* doc: misc improvements (Nilamdyuti Goswami, John Wilkins, Chris Holcombe)
-* doc: misc updates (#9793 #9922 #10204 #10203 Travis Rhoden, Hazem, Ayari, Florian Coste, Andy Allan, Frank Yu, Baptiste Veuillez-Mainard, Yuan Zhou, Armando Segnini, Robert Jansen, Tyler Brekke, Viktor Suprun)
-* doc: misc updates (Alfredo Deza, VRan Liu)
-* doc: misc updates (Nilamdyuti Goswami, John Wilkins)
-* doc: new man pages (Nilamdyuti Goswami)
-* doc: preflight doc fixes (John Wilkins)
-* doc: replace cloudfiles with swiftclient Python Swift example (Tim Freund)
-* doc: update PG count guide (Gerben Meijer, Laurent Guerby, Loic Dachary)
-* doc: update man pages (David Zafman)
-* doc: update openstack docs for Juno (Sebastien Han)
-* doc: update release descriptions (Ken Dreyer)
-* doc: update sepia hardware inventory (Sandon Van Ness)
-* erasure-code: add mSHEC erasure code support (Takeshi Miyamae)
-* erasure-code: improved docs (#10340 Loic Dachary)
-* erasure-code: set max_size to 20 (#10363 Loic Dachary)
-* fix cluster logging from non-mon daemons (Sage Weil)
-* init-ceph: check for systemd-run before using it (Boris Ranto)
-* install-deps.sh: do not require sudo when root (Loic Dachary)
-* keyvaluestore: misc fixes (Haomai Wang)
-* keyvaluestore: performance improvements (Haomai Wang)
-* libcephfs,ceph-fuse: add 'status' asok (John Spray)
-* libcephfs,ceph-fuse: fix getting zero-length xattr (#10552 Yan, Zheng)
-* libcephfs: fix dirfrag trimming (#10387 Yan, Zheng)
-* libcephfs: fix mount timeout (#10041 Yan, Zheng)
-* libcephfs: fix test (#10415 Yan, Zheng)
-* libcephfs: fix use-afer-free on umount (#10412 Yan, Zheng)
-* libcephfs: include ceph and git version in client metadata (Sage Weil)
-* librados, osd: new watch/notify implementation (Sage Weil)
-* librados: add blacklist_add convenience method (Jason Dillaman)
-* librados: add rados_pool_get_base_tier() call (Adam Crume)
-* librados: add watch_flush() operation (Sage Weil, Haomai Wang)
-* librados: avoid memcpy on getxattr, read (Jianpeng Ma)
-* librados: cap buffer length (Loic Dachary)
-* librados: create ioctx by pool id (Jason Dillaman)
-* librados: do notify completion in fast-dispatch (Sage Weil)
-* librados: drop 'category' feature (Sage Weil)
-* librados: expose rados_{read|write}_op_assert_version in C API (Kim Vandry)
-* librados: fix infinite loop with skipped map epochs (#9986 Ding Dinghua)
-* librados: fix iterator operator= bugs (#10082 David Zafman, Yehuda Sadeh)
-* librados: fix leak in C_TwoContexts (Xiong Yiliang)
-* librados: fix leak in watch/notify path (Sage Weil)
-* librados: fix null deref when pool DNE (#9944 Sage Weil)
-* librados: fix objecter races (#9617 Josh Durgin)
-* librados: fix pool deletion handling (#10372 Sage Weil)
-* librados: fix pool name caching (#10458 Radoslaw Zarzynski)
-* librados: fix resource leak, misc bugs (#10425 Radoslaw Zarzynski)
-* librados: fix some watch/notify locking (Jason Dillaman, Josh Durgin)
-* librados: fix timer race from recent refactor (Sage Weil)
-* librados: new fadvise API (Ma Jianpeng)
-* librados: only export public API symbols (Jason Dillaman)
-* librados: remove shadowed variable (Kefu Chain)
-* librados: translate op flags from C APIs (Matthew Richards)
-* libradosstriper: fix remove() (Dongmao Zhang)
-* libradosstriper: fix shutdown hang (Dongmao Zhang)
-* libradosstriper: fix stat strtoll (Dongmao Zhang)
-* libradosstriper: fix trunc method (#10129 Sebastien Ponce)
-* libradosstriper: fix write_full when ENOENT (#10758 Sebastien Ponce)
-* libradosstriper: misc fixes (Sebastien Ponce)
-* librbd: CRC protection for RBD image map (Jason Dillaman)
-* librbd: add missing python docstrings (Jason Dillaman)
-* librbd: add per-image object map for improved performance (Jason Dillaman)
-* librbd: add readahead (Adam Crume)
-* librbd: add support for an "object map" indicating which objects exist (Jason Dillaman)
-* librbd: adjust internal locking (Josh Durgin, Jason Dillaman)
-* librbd: better handling of watch errors (Jason Dillaman)
-* librbd: complete pending ops before closing image (#10299 Josh Durgin)
-* librbd: coordinate maint operations through lock owner (Jason Dillaman)
-* librbd: copy-on-read (Min Chen, Li Wang, Yunchuan Wen, Cheng Cheng, Jason Dillaman)
-* librbd: differentiate between R/O vs R/W features (Jason Dillaman)
-* librbd: don't close a closed parent in failure path (#10030 Jason Dillaman)
-* librbd: enforce write ordering with a snapshot (Jason Dillaman)
-* librbd: exclusive image locking (Jason Dillaman)
-* librbd: fadvise API (Ma Jianpeng)
-* librbd: fadvise-style hints; add misc hints for certain operations (Jianpeng Ma)
-* librbd: fix and improve AIO cache invalidation (#10958 Jason Dillaman)
-* librbd: fix cache tiers in list_children and snap_unprotect (Adam Crume)
-* librbd: fix coverity false-positives (Jason Dillaman)
-* librbd: fix diff test (#10002 Josh Durgin)
-* librbd: fix list_children from invalid pool ioctxs (#10123 Jason Dillaman)
-* librbd: fix locking for readahead (#10045 Jason Dillaman)
-* librbd: fix memory leak (Jason Dillaman)
-* librbd: fix ordering/queueing of resize operations (Jason Dillaman)
-* librbd: fix performance regression in ObjectCacher (#9513 Adam Crume)
-* librbd: fix snap create races (Jason Dillaman)
-* librbd: fix write vs import race (#10590 Jason Dillaman)
-* librbd: flush AIO operations asynchronously (#10714 Jason Dillaman)
-* librbd: gracefully handle deleted/renamed pools (#10270 Jason Dillaman)
-* librbd: lttng tracepoints (Adam Crume)
-* librbd: make async versions of long-running maint operations (Jason Dillaman)
-* librbd: misc fixes (Xinxin Shu, Jason Dillaman)
-* librbd: mock tests (Jason Dillaman)
-* librbd: only export public API symbols (Jason Dillaman)
-* librbd: optionally blacklist clients before breaking locks (#10761 Jason Dillaman)
-* librbd: prevent copyup during shrink (Jason Dillaman)
-* librbd: refactor unit tests to use fixtures (Jason Dillaman)
-* librbd: validate image is r/w on resize/flatten (Jason Dillaman)
-* librbd: various internal locking fixes (Jason Dillaman)
-* many coverity fixes (Danny Al-Gaaf)
-* many many coverity cleanups (Danny Al-Gaaf)
-* mds: 'flush journal' admin command (John Spray)
-* mds: ENOSPC and OSDMap epoch barriers (#7317 John Spray)
-* mds: a whole bunch of initial scrub infrastructure (Greg Farnum)
-* mds: add cephfs-table-tool (John Spray)
-* mds: asok command for fetching subtree map (John Spray)
-* mds: avoid sending traceless replies in most cases (Yan, Zheng)
-* mds: constify MDSCacheObjects (John Spray)
-* mds: dirfrag buf fix (Yan, Zheng)
-* mds: disallow most commands on inactive MDS's (Greg Farnum)
-* mds: drop dentries, leases on deleted directories (#10164 Yan, Zheng)
-* mds: export dir asok command (John Spray)
-* mds: fix MDLog IO callback deadlock (John Spray)
-* mds: fix compat_version for MClientSession (#9945 John Spray)
-* mds: fix deadlock during journal probe vs purge (#10229 Yan, Zheng)
-* mds: fix race trimming log segments (Yan, Zheng)
-* mds: fix reply snapbl (Yan, Zheng)
-* mds: fix sessionmap lifecycle bugs (Yan, Zheng)
-* mds: fix stray/purge perfcounters (#10388 John Spray)
-* mds: handle heartbeat_reset during shutdown (#10382 John Spray)
-* mds: handle zero-size xattr (#10335 Yan, Zheng)
-* mds: initialize root inode xattr version (Yan, Zheng)
-* mds: introduce auth caps (John Spray)
-* mds: many many snapshot-related fixes (Yan, Zheng)
-* mds: misc bugs (Greg Farnum, John Spray, Yan, Zheng, Henry Change)
-* mds: refactor, improve Session storage (John Spray)
-* mds: store backtrace for stray dir (Yan, Zheng)
-* mds: subtree quota support (Yunchuan Wen)
-* mds: verify backtrace when fetching dirfrag (#9557 Yan, Zheng)
-* memstore: free space tracking (John Spray)
-* misc cleanup (Danny Al-Gaaf, David Anderson)
-* misc coverity fixes (Danny Al-Gaaf)
-* misc coverity fixes (Danny Al-Gaaf)
-* misc: various valgrind fixes and cleanups (Danny Al-Gaaf)
-* mon: 'osd crush reweight-all' command (Sage Weil)
-* mon: add 'ceph osd rename-bucket ...' command (Loic Dachary)
-* mon: add bootstrap-rgw profile (Sage Weil)
-* mon: add max pgs per osd warning (Sage Weil)
-* mon: add noforward flag for some mon commands (Mykola Golub)
-* mon: allow adding tiers to fs pools (#10135 John Spray)
-* mon: allow full flag to be manually cleared (#9323 Sage Weil)
-* mon: clean up auth list output (Loic Dachary)
-* mon: delay failure injection (Joao Eduardo Luis)
-* mon: disallow empty pool names (#10555 Wido den Hollander)
-* mon: do not deactivate last mds (#10862 John Spray)
-* mon: do not pollute mon dir with CSV files from CRUSH check (Loic Dachary)
-* mon: drop old ceph_mon_store_converter (Sage Weil)
-* mon: fix 'ceph pg dump_stuck degraded' (Xinxin Shu)
-* mon: fix 'mds fail' for standby MDSs (John Spray)
-* mon: fix 'osd crush link' id resolution (John Spray)
-* mon: fix 'profile osd' use of config-key function on mon (#10844 Joao Eduardo Luis)
-* mon: fix *_ratio* units and types (Sage Weil)
-* mon: fix JSON dumps to dump floats as flots and not strings (Sage Weil)
-* mon: fix MDS health status from peons (#10151 John Spray)
-* mon: fix caching for min_last_epoch_clean (#9987 Sage Weil)
-* mon: fix clock drift time check interval (#10546 Joao Eduardo Luis)
-* mon: fix compatset initalization during mkfs (Joao Eduardo Luis)
-* mon: fix error output for add_data_pool (#9852 Joao Eduardo Luis)
-* mon: fix feature tracking during elections (Joao Eduardo Luis)
-* mon: fix formatter 'pg stat' command output (Sage Weil)
-* mon: fix mds gid/rank/state parsing (John Spray)
-* mon: fix misc error paths (Joao Eduardo Luis)
-* mon: fix paxos off-by-one corner case (#9301 Sage Weil)
-* mon: fix paxos timeouts (#10220 Joao Eduardo Luis)
-* mon: fix stashed monmap encoding (#5203 Xie Rui)
-* mon: fix units in store stats (Joao Eduardo Luis)
-* mon: get canonical OSDMap from leader (#10422 Sage Weil)
-* mon: ignore failure reports from before up_from (#10762 Dan van der Ster, Sage Weil)
-* mon: implement 'fs reset' command (John Spray)
-* mon: improve error handling on erasure code profile set (#10488, #11144 Loic Dachary)
-* mon: improved corrupt CRUSH map detection (Joao Eduardo Luis)
-* mon: include entity name in audit log for forwarded requests (#9913 Joao Eduardo Luis)
-* mon: include pg_temp count in osdmap summary (Sage Weil)
-* mon: log health summary to cluster log (#9440 Joao Eduardo Luis)
-* mon: make 'mds fail' idempotent (John Spray)
-* mon: make pg dump {sum,pgs,pgs_brief} work for format=plain (#5963 #6759 Mykola Golub)
-* mon: new 'ceph pool ls [detail]' command (Sage Weil)
-* mon: new pool safety flags nodelete, nopgchange, nosizechange (#9792 Mykola Golub)
-* mon: new, friendly 'ceph pg ls ...' command (Xinxin Shu)
-* mon: paxos: allow reads while proposing (#9321 #9322 Joao Eduardo Luis)
-* mon: prevent MDS transition from STOPPING (#10791 Greg Farnum)
-* mon: propose all pending work in one transaction (Sage Weil)
-* mon: remove pg_temps for nonexistent pools (Joao Eduardo Luis)
-* mon: require mon_allow_pool_delete option to remove pools (Sage Weil)
-* mon: respect down flag when promoting standbys (John Spray)
-* mon: set globalid prealloc to larger value (Sage Weil)
-* mon: set {read,write}_tier on 'osd tier add-cache ...' (Jianpeng Ma)
-* mon: skip zeroed osd stats in get_rule_avail (#10257 Joao Eduardo Luis)
-* mon: validate min_size range (Jianpeng Ma)
-* mon: wait for writeable before cross-proposing (#9794 Joao Eduardo Luis)
-* mount.ceph: fix suprious error message (#10351 Yan, Zheng)
-* ms: xio: fix misc bugs (Matt Benjamin, Vu Pham)
-* msgr: async: bind threads to CPU cores, improved poll (Haomai Wang)
-* msgr: async: many fixes, unit tests (Haomai Wang)
-* msgr: async: several fixes (Haomai Wang)
-* msgr: asyncmessenger: add kqueue support (#9926 Haomai Wang)
-* msgr: avoid useless new/delete (Haomai Wang)
-* msgr: fix RESETSESSION bug (#10080 Greg Farnum)
-* msgr: fix crc configuration (Mykola Golub)
-* msgr: fix delay injection bug (#9910 Sage Weil, Greg Farnum)
-* msgr: misc unit tests (Haomai Wang)
-* msgr: new AsymcMessenger alternative implementation (Haomai Wang)
-* msgr: prefetch data when doing recv (Yehuda Sadeh)
-* msgr: simple: fix rare deadlock (Greg Farnum)
-* msgr: simple: retry binding to port on failure (#10029 Wido den Hollander)
-* msgr: xio: XioMessenger RDMA support (Casey Bodley, Vu Pham, Matt Benjamin)
-* objectstore: deprecate collection attrs (Sage Weil)
-* osd, librados: fadvise-style librados hints (Jianpeng Ma)
-* osd, librados: fix xattr_cmp_u64 (Dongmao Zhang)
-* osd, librados: revamp PG listing API to handle namespaces (#9031 #9262 #9438 David Zafman)
-* osd, mds: 'ops' as shorthand for 'dump_ops_in_flight' on asok (Sage Weil)
-* osd, mon: add checksums to all OSDMaps (Sage Weil)
-* osd, mon: send intiial pg create time from mon to osd (#9887 David Zafman)
-* osd,mon: add 'norebalance' flag (Kefu Chai)
-* osd,mon: specify OSD features explicitly in MOSDBoot (#10911 Sage Weil)
-* osd: DBObjectMap: fix locking to prevent rare crash (#9891 Samuel Just)
-* osd: EIO on whole-object reads when checksum is wrong (Sage Weil)
-* osd: add erasure code corpus (Loic Dachary)
-* osd: add fadvise flags to ObjectStore API (Jianpeng Ma)
-* osd: add get_latest_osdmap asok command (#9483 #9484 Mykola Golub)
-* osd: add misc tests (Loic Dachary, Danny Al-Gaaf)
-* osd: add option to prioritize heartbeat network traffic (Jian Wen)
-* osd: add support for the SHEC erasure-code algorithm (Takeshi Miyamae, Loic Dachary)
-* osd: allow deletion of objects with watcher (#2339 Sage Weil)
-* osd: allow recovery while below min_size (Samuel Just)
-* osd: allow recovery with fewer than min_size OSDs (Samuel Just)
-* osd: allow sparse read for Push/Pull (Haomai Wang)
-* osd: allow whiteout deletion in cache pool (Sage Weil)
-* osd: allow writes to degraded objects (Samuel Just)
-* osd: allow writes to degraded objects (Samuel Just)
-* osd: avoid publishing unchanged PG stats (Sage Weil)
-* osd: batch pg log trim (Xinze Chi)
-* osd: cache pool: ignore min flush age when cache is full (Xinze Chi)
-* osd: cache recent ObjectContexts (Dong Yuan)
-* osd: cache reverse_nibbles hash value (Dong Yuan)
-* osd: clean up internal ObjectStore interface (Sage Weil)
-* osd: cleanup boost optionals (William Kennington)
-* osd: clear cache on interval change (Samuel Just)
-* osd: do no proxy reads unless target OSDs are new (#10788 Sage Weil)
-* osd: do not abort deep scrub on missing hinfo (#10018 Loic Dachary)
-* osd: do not update digest on inconsistent object (#10524 Samuel Just)
-* osd: don't record digests for snapdirs (#10536 Samuel Just)
-* osd: drop upgrade support for pre-dumpling (Sage Weil)
-* osd: enable and use posix_fadvise (Sage Weil)
-* osd: erasure coding: allow bench.sh to test ISA backend (Yuan Zhou)
-* osd: erasure-code: encoding regression tests, corpus (#9420 Loic Dachary)
-* osd: erasure-code: enforce chunk size alignment (#10211 Loic Dachary)
-* osd: erasure-code: jerasure support for NEON (Loic Dachary)
-* osd: erasure-code: relax cauchy w restrictions (#10325 David Zhang, Loic Dachary)
-* osd: erasure-code: update gf-complete to latest upstream (Loic Dachary)
-* osd: expose non-journal backends via ceph-osd CLI (Hoamai Wang)
-* osd: filejournal: don't cache journal when not using direct IO (Jianpeng Ma)
-* osd: fix JSON output for stray OSDs (Loic Dachary)
-* osd: fix OSDCap parser on old (el6) boost::spirit (#10757 Kefu Chai)
-* osd: fix OSDCap parsing on el6 (#10757 Kefu Chai)
-* osd: fix ObjectStore::Transaction encoding version (#10734 Samuel Just)
-* osd: fix WBTHrottle perf counters (Haomai Wang)
-* osd: fix and document last_epoch_started semantics (Samuel Just)
-* osd: fix auth object selection during repair (#10524 Samuel Just)
-* osd: fix backfill bug (#10150 Samuel Just)
-* osd: fix bug in pending digest updates (#10840 Samuel Just)
-* osd: fix cancel_proxy_read_ops (Sage Weil)
-* osd: fix cleanup of interrupted pg deletion (#10617 Sage Weil)
-* osd: fix divergent entry handling on PG split (Samuel Just)
-* osd: fix ghobject_t formatted output to include shard (#10063 Loic Dachary)
-* osd: fix ioprio option (Mykola Golub)
-* osd: fix ioprio options (Loic Dachary)
-* osd: fix journal shutdown race (Sage Weil)
-* osd: fix journal wrapping bug (#10883 David Zafman)
-* osd: fix leak in SnapTrimWQ (#10421 Kefu Chai)
-* osd: fix leak on shutdown (Kefu Chai)
-* osd: fix memstore free space calculation (Xiaoxi Chen)
-* osd: fix mixed-version peering issues (Samuel Just)
-* osd: fix object age eviction (Zhiqiang Wang)
-* osd: fix object atime calculation (Xinze Chi)
-* osd: fix object digest update bug (#10840 Samuel Just)
-* osd: fix occasional peering stalls (#10431 Sage Weil)
-* osd: fix ordering issue with new transaction encoding (#10534 Dong Yuan)
-* osd: fix osd peer check on scrub messages (#9555 Sage Weil)
-* osd: fix past_interval display bug (#9752 Loic Dachary)
-* osd: fix past_interval generation (#10427 #10430 David Zafman)
-* osd: fix pgls filter ops (#9439 David Zafman)
-* osd: fix recording of digest on scrub (Samuel Just)
-* osd: fix scrub delay bug (#10693 Samuel Just)
-* osd: fix scrub vs try-flush bug (#8011 Samuel Just)
-* osd: fix short read handling on push (#8121 David Zafman)
-* osd: fix stderr with -f or -d (Dan Mick)
-* osd: fix transaction accounting (Jianpeng Ma)
-* osd: fix watch reconnect race (#10441 Sage Weil)
-* osd: fix watch timeout cache state update (#10784 David Zafman)
-* osd: fix whiteout handling (Sage Weil)
-* osd: flush snapshots from cache tier immediately (Sage Weil)
-* osd: force promotion of watch/notify ops (Zhiqiang Wang)
-* osd: handle no-op write with snapshot (#10262 Sage Weil)
-* osd: improve idempotency detection across cache promotion/demotion (#8935 Sage Weil, Samuel Just)
-* osd: include activating peers in blocked_by (#10477 Sage Weil)
-* osd: jerasure and gf-complete updates from upstream (#10216 Loic Dachary)
-* osd: journal: check fsync/fdatasync result (Jianpeng Ma)
-* osd: journal: fix alignment checks, avoid useless memmove (Jianpeng Ma)
-* osd: journal: fix hang on shutdown (#10474 David Zafman)
-* osd: journal: fix header.committed_up_to (Xinze Chi)
-* osd: journal: fix journal zeroing when direct IO is enabled (Xie Rui)
-* osd: journal: initialize throttle (Ning Yao)
-* osd: journal: misc bug fixes (#6003 David Zafman, Samuel Just)
-* osd: journal: update committed_thru after replay (#6756 Samuel Just)
-* osd: keyvaluestore: cleanup dead code (Ning Yao)
-* osd: keyvaluestore: fix getattr semantics (Haomai Wang)
-* osd: keyvaluestore: fix key ordering (#10119 Haomai Wang)
-* osd: keyvaluestore_dev: optimization (Chendi Xue)
-* osd: limit in-flight read requests (Jason Dillaman)
-* osd: log when scrub or repair starts (Loic Dachary)
-* osd: make misdirected op checks robust for EC pools (#9835 Sage Weil)
-* osd: memstore: fix size limit (Xiaoxi Chen)
-* osd: misc FIEMAP fixes (Ma Jianpeng)
-* osd: misc cleanup (Xinze Chi, Yongyue Sun)
-* osd: misc optimizations (Xinxin Shu, Zhiqiang Wang, Xinze Chi)
-* osd: misc scrub fixes (#10017 Loic Dachary)
-* osd: new 'activating' state between peering and active (Sage Weil)
-* osd: new optimized encoding for ObjectStore::Transaction (Dong Yuan)
-* osd: optimize Finisher (Xinze Chi)
-* osd: optimize WBThrottle map with unordered_map (Ning Yao)
-* osd: optimize filter_snapc (Ning Yao)
-* osd: preserve reqids for idempotency checks for promote/demote (Sage Weil, Zhiqiang Wang, Samuel Just)
-* osd: proxy read support (Zhiqiang Wang)
-* osd: proxy reads during cache promote (Zhiqiang Wang)
-* osd: remove dead locking code (Xinxin Shu)
-* osd: remove legacy classic scrub code (Sage Weil)
-* osd: remove unused fields in MOSDSubOp (Xiaoxi Chen)
-* osd: removed some dead code (Xinze Chi)
-* osd: replace MOSDSubOp messages with simpler, optimized MOSDRepOp (Xiaoxi Chen)
-* osd: restrict scrub to certain times of day (Xinze Chi)
-* osd: rocksdb: fix shutdown (Hoamai Wang)
-* osd: store PG metadata in per-collection objects for better concurrency (Sage Weil)
-* osd: store whole-object checksums on scrub, write_full (Sage Weil)
-* osd: support for discard for journal trim (Jianpeng Ma)
-* osd: use FIEMAP_FLAGS_SYNC instead of fsync (Jianpeng Ma)
-* osd: verify kernel is new enough before using XFS extsize ioctl, enable by default (#9956 Sage Weil)
-* pybind: fix memory leak in librados bindings (Billy Olsen)
-* pyrados: add object lock support (#6114 Mehdi Abaakouk)
-* pyrados: fix misnamed wait_* routings (#10104 Dan Mick)
-* pyrados: misc cleanups (Kefu Chai)
-* qa: add large auth ticket tests (Ilya Dryomov)
-* qa: fix mds tests (#10539 John Spray)
-* qa: fix osd create dup tests (#10083 Loic Dachary)
-* qa: ignore duplicates in rados ls (Josh Durgin)
-* qa: improve hadoop tests (Noah Watkins)
-* qa: many 'make check' improvements (Loic Dachary)
-* qa: misc tests (Loic Dachary, Yan, Zheng)
-* qa: parallelize make check (Loic Dachary)
-* qa: reorg fs quota tests (Greg Farnum)
-* qa: tolerate nearly-full disk for make check (Loic Dachary)
-* rados: fix put of /dev/null (Loic Dachary)
-* rados: fix usage (Jianpeng Ma)
-* rados: parse command-line arguments more strictly (#8983 Adam Crume)
-* rados: use copy-from operation for copy, cppool (Sage Weil)
-* radosgw-admin: add replicalog update command (Yehuda Sadeh)
-* rbd-fuse: clean up on shutdown (Josh Durgin)
-* rbd-fuse: fix memory leak (Adam Crume)
-* rbd-replay-many (Adam Crume)
-* rbd-replay: --anonymize flag to rbd-replay-prep (Adam Crume)
-* rbd: add 'merge-diff' function (MingXin Liu, Yunchuan Wen, Li Wang)
-* rbd: allow v2 striping parameters for clones and imports (Jason Dillaman)
-* rbd: fix 'rbd diff' for non-existent objects (Adam Crume)
-* rbd: fix buffer handling on image import (#10590 Jason Dillaman)
-* rbd: fix error when striping with format 1 (Sebastien Han)
-* rbd: fix export for image sizes over 2GB (Vicente Cheng)
-* rbd: fix formatted output of image features (Jason Dillaman)
-* rbd: leave exclusive lockin goff by default (Jason Dillaman)
-* rbd: updat eman page (Ilya Dryomov)
-* rbd: update init-rbdmap to fix dup mount point (Karel Striegel)
-* rbd: use IO hints for import, export, and bench operations (#10462 Jason Dillaman)
-* rbd: use rolling average for rbd bench-write throughput (Jason Dillaman)
-* rbd_recover_tool: RBD image recovery tool (Min Chen)
-* rgw: S3-style object versioning support (Yehuda Sadeh)
-* rgw: add location header when object is in another region (VRan Liu)
-* rgw: change multipart upload id magic (#10271 Yehuda Sadeh)
-* rgw: check keystone auth for S3 POST requests (#10062 Abhishek Lekshmanan)
-* rgw: check timestamp on s3 keystone auth (#10062 Abhishek Lekshmanan)
-* rgw: conditional PUT on ETag (#8562 Ray Lv)
-* rgw: create subuser if needed when creating user (#10103 Yehuda Sadeh)
-* rgw: decode http query params correction (#10271 Yehuda Sadeh)
-* rgw: don't overwrite bucket/object owner when setting ACLs (#10978 Yehuda Sadeh)
-* rgw: enable IPv6 for civetweb (#10965 Yehuda Sadeh)
-* rgw: extend replica log API (purge-all) (Yehuda Sadeh)
-* rgw: fail S3 POST if keystone not configured (#10688 Valery Tschopp, Yehuda Sadeh)
-* rgw: fix If-Modified-Since (VRan Liu)
-* rgw: fix XML header on get ACL request (#10106 Yehuda Sadeh)
-* rgw: fix bucket removal with data purge (Yehuda Sadeh)
-* rgw: fix content length check (#10701 Axel Dunkel, Yehuda Sadeh)
-* rgw: fix content-length update (#9576 Yehuda Sadeh)
-* rgw: fix disabling of max_size quota (#9907 Dong Lei)
-* rgw: fix error codes (#10334 #10329 Yehuda Sadeh)
-* rgw: fix incorrect len when len is 0 (#9877 Yehuda Sadeh)
-* rgw: fix object copy content type (#9478 Yehuda Sadeh)
-* rgw: fix partial GET in swift (#10553 Yehuda Sadeh)
-* rgw: fix replica log indexing (#8251 Yehuda Sadeh)
-* rgw: fix shutdown (#10472 Yehuda Sadeh)
-* rgw: fix swift metadata header name (Dmytro Iurchenko)
-* rgw: fix sysvinit script when rgw_socket_path is not defined (#11159 Yehuda Sadeh, Dan Mick)
-* rgw: fix user stags in get-user-info API (#9359 Ray Lv)
-* rgw: include XML ns on get ACL request (#10106 Yehuda Sadeh)
-* rgw: index swift keys appropriately (#10471 Yehuda Sadeh)
-* rgw: make sysvinit script set ulimit -n properly (Sage Weil)
-* rgw: misc fixes (#10307 Yehuda Sadeh)
-* rgw: only track cleanup for objects we write (#10311 Yehuda Sadeh)
-* rgw: pass civetweb configurables through (#10907 Yehuda Sadeh)
-* rgw: prevent illegal bucket policy that doesn't match placement rule (Yehuda Sadeh)
-* rgw: remove multipart entries from bucket index on abort (#10719 Yehuda Sadeh)
-* rgw: remove swift user manifest (DLO) hash calculation (#9973 Yehuda Sadeh)
-* rgw: respond with 204 to POST on containers (#10667 Yuan Zhou)
-* rgw: return timestamp on GET/HEAD (#8911 Yehuda Sadeh)
-* rgw: reuse fcgx connection struct (#10194 Yehuda Sadeh)
-* rgw: run radosgw as apache with systemd (#10125 Loic Dachary)
-* rgw: send explicit HTTP status string (Yehuda Sadeh)
-* rgw: set ETag on object copy (#9479 Yehuda Sadeh)
-* rgw: set length for keystone token validation request (#7796 Yehuda Sadeh, Mark Kirkwood)
-* rgw: support X-Storage-Policy header for Swift storage policy compat (Yehuda Sadeh)
-* rgw: support multiple host names (#7467 Yehuda Sadeh)
-* rgw: swift: dump container's custom metadata (#10665 Ahmad Faheem, Dmytro Iurchenko)
-* rgw: swift: support Accept header for response format (#10746 Dmytro Iurchenko)
-* rgw: swift: support for X-Remove-Container-Meta-{key} (#10475 Dmytro Iurchenko)
-* rgw: tweak error codes (#10329 #10334 Yehuda Sadeh)
-* rgw: update bucket index on attr changes, for multi-site sync (#5595 Yehuda Sadeh)
-* rgw: use \r\n for http headers (#9254 Yehuda Sadeh)
-* rgw: use gc for multipart abort (#10445 Aaron Bassett, Yehuda Sadeh)
-* rgw: use new watch/notify API (Yehuda Sadeh, Sage Weil)
-* rpm: misc fixes (Key Dreyer)
-* rpm: move rgw logrotate to radosgw subpackage (Ken Dreyer)
-* systemd: better systemd unit files (Owen Synge)
-* sysvinit: fix race in 'stop' (#10389 Loic Dachary)
-* test: fix bufferlist tests (Jianpeng Ma)
-* tests: ability to run unit tests under docker (Loic Dachary)
-* tests: centos-6 dockerfile (#10755 Loic Dachary)
-* tests: improve docker-based tests (Loic Dachary)
-* tests: unit tests for shared_cache (Dong Yuan)
-* udev: fix rules for CentOS7/RHEL7 (Loic Dachary)
-* use clock_gettime instead of gettimeofday (Jianpeng Ma)
-* vstart.sh: set up environment for s3-tests (Luis Pabon)
-* vstart.sh: work with cmake (Yehuda Sadeh)
-
-
-
-
-
-
-v0.93
-=====
-
-This is the first release candidate for Hammer, and includes all of
-the features that will be present in the final release.  We welcome
-and encourage any and all testing in non-production clusters to identify
-any problems with functionality, stability, or performance before the
-final Hammer release.
-
-We suggest some caution in one area: librbd.  There is a lot of new
-functionality around object maps and locking that is disabled by
-default but may still affect stability for existing images.  We are
-continuing to shake out those bugs so that the final Hammer release
-(probably v0.94) will be rock solid.
-
-Major features since Giant include:
-
-* cephfs: journal scavenger repair tool (John Spray)
-* crush: new and improved straw2 bucket type (Sage Weil, Christina Anderson, Xiaoxi Chen)
-* doc: improved guidance for CephFS early adopters (John Spray)
-* librbd: add per-image object map for improved performance (Jason Dillaman)
-* librbd: copy-on-read (Min Chen, Li Wang, Yunchuan Wen, Cheng Cheng)
-* librados: fadvise-style IO hints (Jianpeng Ma)
-* mds: many many snapshot-related fixes (Yan, Zheng)
-* mon: new 'ceph osd df' command (Mykola Golub)
-* mon: new 'ceph pg ls ...' command (Xinxin Shu)
-* osd: improved performance for high-performance backends
-* osd: improved recovery behavior (Samuel Just)
-* osd: improved cache tier behavior with reads (Zhiqiang Wang)
-* rgw: S3-compatible bucket versioning support (Yehuda Sadeh)
-* rgw: large bucket index sharding (Guang Yang, Yehuda Sadeh)
-* RDMA "xio" messenger support (Matt Benjamin, Vu Pham)
-
-Upgrading
----------
-
-* If you are upgrading from v0.92, you must stop all OSD daemons and flush their
-  journals (``ceph-osd -i NNN --flush-journal``) before upgrading.  There was
-  a transaction encoding bug in v0.92 that broke compatibility.  Upgrading from
-  v0.91 or anything earlier is safe.
-
-* No special restrictions when upgrading from firefly or giant.
-
-Notable Changes
----------------
-
-* build: CMake support (Ali Maredia, Casey Bodley, Adam Emerson, Marcus Watts, Matt Benjamin)
-* ceph-disk: do not re-use partition if encryption is required (Loic Dachary)
-* ceph-disk: support LUKS for encrypted partitions (Andrew Bartlett, Loic Dachary)
-* ceph-fuse,libcephfs: add support for O_NOFOLLOW and O_PATH (Greg Farnum)
-* ceph-fuse,libcephfs: resend requests before completing cap reconnect (#10912 Yan, Zheng)
-* ceph-fuse: select kernel cache invalidation mechanism based on kernel version (Greg Farnum)
-* ceph-objectstore-tool: improved import (David Zafman)
-* ceph-objectstore-tool: misc improvements, fixes (#9870 #9871 David Zafman)
-* ceph: add 'ceph osd df [tree]' command (#10452 Mykola Golub)
-* ceph: fix 'ceph tell ...' command validation (#10439 Joao Eduardo Luis)
-* ceph: improve 'ceph osd tree' output (Mykola Golub)
-* cephfs-journal-tool: add recover_dentries function (#9883 John Spray)
-* common: add newline to flushed json output (Sage Weil)
-* common: filtering for 'perf dump' (John Spray)
-* common: fix Formatter factory breakage (#10547 Loic Dachary)
-* common: make json-pretty output prettier (Sage Weil)
-* crush: new and improved straw2 bucket type (Sage Weil, Christina Anderson, Xiaoxi Chen)
-* crush: update tries stats for indep rules (#10349 Loic Dachary)
-* crush: use larger choose_tries value for erasure code rulesets (#10353 Loic Dachary)
-* debian,rpm: move RBD udev rules to ceph-common (#10864 Ken Dreyer)
-* debian: split python-ceph into python-{rbd,rados,cephfs} (Boris Ranto)
-* doc: CephFS disaster recovery guidance (John Spray)
-* doc: CephFS for early adopters (John Spray)
-* doc: fix OpenStack Glance docs (#10478 Sebastien Han)
-* doc: misc updates (#9793 #9922 #10204 #10203 Travis Rhoden, Hazem, Ayari, Florian Coste, Andy Allan, Frank Yu, Baptiste Veuillez-Mainard, Yuan Zhou, Armando Segnini, Robert Jansen, Tyler Brekke, Viktor Suprun)
-* doc: replace cloudfiles with swiftclient Python Swift example (Tim Freund)
-* erasure-code: add mSHEC erasure code support (Takeshi Miyamae)
-* erasure-code: improved docs (#10340 Loic Dachary)
-* erasure-code: set max_size to 20 (#10363 Loic Dachary)
-* libcephfs,ceph-fuse: fix getting zero-length xattr (#10552 Yan, Zheng)
-* librados: add blacklist_add convenience method (Jason Dillaman)
-* librados: expose rados_{read|write}_op_assert_version in C API (Kim Vandry)
-* librados: fix pool name caching (#10458 Radoslaw Zarzynski)
-* librados: fix resource leak, misc bugs (#10425 Radoslaw Zarzynski)
-* librados: fix some watch/notify locking (Jason Dillaman, Josh Durgin)
-* libradosstriper: fix write_full when ENOENT (#10758 Sebastien Ponce)
-* librbd: CRC protection for RBD image map (Jason Dillaman)
-* librbd: add per-image object map for improved performance (Jason Dillaman)
-* librbd: add support for an "object map" indicating which objects exist (Jason Dillaman)
-* librbd: adjust internal locking (Josh Durgin, Jason Dillaman)
-* librbd: better handling of watch errors (Jason Dillaman)
-* librbd: coordinate maint operations through lock owner (Jason Dillaman)
-* librbd: copy-on-read (Min Chen, Li Wang, Yunchuan Wen, Cheng Cheng, Jason Dillaman)
-* librbd: enforce write ordering with a snapshot (Jason Dillaman)
-* librbd: fadvise-style hints; add misc hints for certain operations (Jianpeng Ma)
-* librbd: fix coverity false-positives (Jason Dillaman)
-* librbd: fix snap create races (Jason Dillaman)
-* librbd: flush AIO operations asynchronously (#10714 Jason Dillaman)
-* librbd: make async versions of long-running maint operations (Jason Dillaman)
-* librbd: mock tests (Jason Dillaman)
-* librbd: optionally blacklist clients before breaking locks (#10761 Jason Dillaman)
-* librbd: prevent copyup during shrink (Jason Dillaman)
-* mds: add cephfs-table-tool (John Spray)
-* mds: avoid sending traceless replies in most cases (Yan, Zheng)
-* mds: export dir asok command (John Spray)
-* mds: fix stray/purge perfcounters (#10388 John Spray)
-* mds: handle heartbeat_reset during shutdown (#10382 John Spray)
-* mds: many many snapshot-related fixes (Yan, Zheng)
-* mds: refactor, improve Session storage (John Spray)
-* misc coverity fixes (Danny Al-Gaaf)
-* mon: add noforward flag for some mon commands (Mykola Golub)
-* mon: disallow empty pool names (#10555 Wido den Hollander)
-* mon: do not deactivate last mds (#10862 John Spray)
-* mon: drop old ceph_mon_store_converter (Sage Weil)
-* mon: fix 'ceph pg dump_stuck degraded' (Xinxin Shu)
-* mon: fix 'profile osd' use of config-key function on mon (#10844 Joao Eduardo Luis)
-* mon: fix compatset initalization during mkfs (Joao Eduardo Luis)
-* mon: fix feature tracking during elections (Joao Eduardo Luis)
-* mon: fix mds gid/rank/state parsing (John Spray)
-* mon: ignore failure reports from before up_from (#10762 Dan van der Ster, Sage Weil)
-* mon: improved corrupt CRUSH map detection (Joao Eduardo Luis)
-* mon: include pg_temp count in osdmap summary (Sage Weil)
-* mon: log health summary to cluster log (#9440 Joao Eduardo Luis)
-* mon: make 'mds fail' idempotent (John Spray)
-* mon: make pg dump {sum,pgs,pgs_brief} work for format=plain (#5963 #6759 Mykola Golub)
-* mon: new pool safety flags nodelete, nopgchange, nosizechange (#9792 Mykola Golub)
-* mon: new, friendly 'ceph pg ls ...' command (Xinxin Shu)
-* mon: prevent MDS transition from STOPPING (#10791 Greg Farnum)
-* mon: propose all pending work in one transaction (Sage Weil)
-* mon: remove pg_temps for nonexistent pools (Joao Eduardo Luis)
-* mon: require mon_allow_pool_delete option to remove pools (Sage Weil)
-* mon: set globalid prealloc to larger value (Sage Weil)
-* mon: skip zeroed osd stats in get_rule_avail (#10257 Joao Eduardo Luis)
-* mon: validate min_size range (Jianpeng Ma)
-* msgr: async: bind threads to CPU cores, improved poll (Haomai Wang)
-* msgr: fix crc configuration (Mykola Golub)
-* msgr: misc unit tests (Haomai Wang)
-* msgr: xio: XioMessenger RDMA support (Casey Bodley, Vu Pham, Matt Benjamin)
-* osd, librados: fadvise-style librados hints (Jianpeng Ma)
-* osd, librados: fix xattr_cmp_u64 (Dongmao Zhang)
-* osd,mon: add 'norebalance' flag (Kefu Chai)
-* osd,mon: specify OSD features explicitly in MOSDBoot (#10911 Sage Weil)
-* osd: add option to prioritize heartbeat network traffic (Jian Wen)
-* osd: add support for the SHEC erasure-code algorithm (Takeshi Miyamae, Loic Dachary)
-* osd: allow recovery while below min_size (Samuel Just)
-* osd: allow recovery with fewer than min_size OSDs (Samuel Just)
-* osd: allow writes to degraded objects (Samuel Just)
-* osd: allow writes to degraded objects (Samuel Just)
-* osd: avoid publishing unchanged PG stats (Sage Weil)
-* osd: cache recent ObjectContexts (Dong Yuan)
-* osd: clear cache on interval change (Samuel Just)
-* osd: do no proxy reads unless target OSDs are new (#10788 Sage Weil)
-* osd: do not update digest on inconsistent object (#10524 Samuel Just)
-* osd: don't record digests for snapdirs (#10536 Samuel Just)
-* osd: fix OSDCap parser on old (el6) boost::spirit (#10757 Kefu Chai)
-* osd: fix OSDCap parsing on el6 (#10757 Kefu Chai)
-* osd: fix ObjectStore::Transaction encoding version (#10734 Samuel Just)
-* osd: fix auth object selection during repair (#10524 Samuel Just)
-* osd: fix bug in pending digest updates (#10840 Samuel Just)
-* osd: fix cancel_proxy_read_ops (Sage Weil)
-* osd: fix cleanup of interrupted pg deletion (#10617 Sage Weil)
-* osd: fix journal wrapping bug (#10883 David Zafman)
-* osd: fix leak in SnapTrimWQ (#10421 Kefu Chai)
-* osd: fix memstore free space calculation (Xiaoxi Chen)
-* osd: fix mixed-version peering issues (Samuel Just)
-* osd: fix object digest update bug (#10840 Samuel Just)
-* osd: fix ordering issue with new transaction encoding (#10534 Dong Yuan)
-* osd: fix past_interval generation (#10427 #10430 David Zafman)
-* osd: fix short read handling on push (#8121 David Zafman)
-* osd: fix watch timeout cache state update (#10784 David Zafman)
-* osd: force promotion of watch/notify ops (Zhiqiang Wang)
-* osd: improve idempotency detection across cache promotion/demotion (#8935 Sage Weil, Samuel Just)
-* osd: include activating peers in blocked_by (#10477 Sage Weil)
-* osd: jerasure and gf-complete updates from upstream (#10216 Loic Dachary)
-* osd: journal: check fsync/fdatasync result (Jianpeng Ma)
-* osd: journal: fix hang on shutdown (#10474 David Zafman)
-* osd: journal: fix header.committed_up_to (Xinze Chi)
-* osd: journal: initialize throttle (Ning Yao)
-* osd: journal: misc bug fixes (#6003 David Zafman, Samuel Just)
-* osd: misc cleanup (Xinze Chi, Yongyue Sun)
-* osd: new 'activating' state between peering and active (Sage Weil)
-* osd: preserve reqids for idempotency checks for promote/demote (Sage Weil, Zhiqiang Wang, Samuel Just)
-* osd: remove dead locking code (Xinxin Shu)
-* osd: restrict scrub to certain times of day (Xinze Chi)
-* osd: rocksdb: fix shutdown (Hoamai Wang)
-* pybind: fix memory leak in librados bindings (Billy Olsen)
-* qa: fix mds tests (#10539 John Spray)
-* qa: ignore duplicates in rados ls (Josh Durgin)
-* qa: improve hadoop tests (Noah Watkins)
-* qa: reorg fs quota tests (Greg Farnum)
-* rados: fix usage (Jianpeng Ma)
-* radosgw-admin: add replicalog update command (Yehuda Sadeh)
-* rbd-fuse: clean up on shutdown (Josh Durgin)
-* rbd: add 'merge-diff' function (MingXin Liu, Yunchuan Wen, Li Wang)
-* rbd: fix buffer handling on image import (#10590 Jason Dillaman)
-* rbd: leave exclusive lockin goff by default (Jason Dillaman)
-* rbd: update init-rbdmap to fix dup mount point (Karel Striegel)
-* rbd: use IO hints for import, export, and bench operations (#10462 Jason Dillaman)
-* rbd_recover_tool: RBD image recovery tool (Min Chen)
-* rgw: S3-style object versioning support (Yehuda Sadeh)
-* rgw: check keystone auth for S3 POST requests (#10062 Abhishek Lekshmanan)
-* rgw: extend replica log API (purge-all) (Yehuda Sadeh)
-* rgw: fail S3 POST if keystone not configured (#10688 Valery Tschopp, Yehuda Sadeh)
-* rgw: fix XML header on get ACL request (#10106 Yehuda Sadeh)
-* rgw: fix bucket removal with data purge (Yehuda Sadeh)
-* rgw: fix replica log indexing (#8251 Yehuda Sadeh)
-* rgw: fix swift metadata header name (Dmytro Iurchenko)
-* rgw: remove multipart entries from bucket index on abort (#10719 Yehuda Sadeh)
-* rgw: respond with 204 to POST on containers (#10667 Yuan Zhou)
-* rgw: reuse fcgx connection struct (#10194 Yehuda Sadeh)
-* rgw: support multiple host names (#7467 Yehuda Sadeh)
-* rgw: swift: dump container's custom metadata (#10665 Ahmad Faheem, Dmytro Iurchenko)
-* rgw: swift: support Accept header for response format (#10746 Dmytro Iurchenko)
-* rgw: swift: support for X-Remove-Container-Meta-{key} (#10475 Dmytro Iurchenko)
-* rpm: move rgw logrotate to radosgw subpackage (Ken Dreyer)
-* tests: centos-6 dockerfile (#10755 Loic Dachary)
-* tests: unit tests for shared_cache (Dong Yuan)
-* vstart.sh: work with cmake (Yehuda Sadeh)
-
-
-
-v0.92
-=====
-
-This is the second-to-last chunk of new stuff before Hammer.  Big items
-include additional checksums on OSD objects, proxied reads in the
-cache tier, image locking in RBD, optimized OSD Transaction and
-replication messages, and a big pile of RGW and MDS bug fixes.
-
-Upgrading
----------
-
-* The experimental 'keyvaluestore-dev' OSD backend has been renamed
-  'keyvaluestore' (for simplicity) and marked as experimental.  To
-  enable this untested feature and acknowledge that you understand
-  that it is untested and may destroy data, you need to add the
-  following to your ceph.conf::
-
-    enable experimental unrecoverable data corrupting features = keyvaluestore
-
-* The following librados C API function calls take a 'flags' argument whose value
-  is now correctly interpreted:
-
-     rados_write_op_operate()
-     rados_aio_write_op_operate()
-     rados_read_op_operate()
-     rados_aio_read_op_operate()
-
-  The flags were not correctly being translated from the librados constants to the
-  internal values.  Now they are.  Any code that is passing flags to these methods
-  should be audited to ensure that they are using the correct LIBRADOS_OP_FLAG_*
-  constants.
-
-* The 'rados' CLI 'copy' and 'cppool' commands now use the copy-from operation,
-  which means the latest CLI cannot run these commands against pre-firefly OSDs.
-
-* The librados watch/notify API now includes a watch_flush() operation to flush
-  the async queue of notify operations.  This should be called by any watch/notify
-  user prior to rados_shutdown().
-
-Notable Changes
----------------
-
-* add experimental features option (Sage Weil)
-* build: fix 'make check' races (#10384 Loic Dachary)
-* build: fix pkg names when libkeyutils is missing (Pankag Garg, Ken Dreyer)
-* ceph: make 'ceph -s' show PG state counts in sorted order (Sage Weil)
-* ceph: make 'ceph tell mon.* version' work (Mykola Golub)
-* ceph-monstore-tool: fix/improve CLI (Joao Eduardo Luis)
-* ceph: show primary-affinity in 'ceph osd tree' (Mykola Golub)
-* common: add TableFormatter (Andreas Peters)
-* common: check syncfs() return code (Jianpeng Ma)
-* doc: do not suggest dangerous XFS nobarrier option (Dan van der Ster)
-* doc: misc updates (Nilamdyuti Goswami, John Wilkins)
-* install-deps.sh: do not require sudo when root (Loic Dachary)
-* libcephfs: fix dirfrag trimming (#10387 Yan, Zheng)
-* libcephfs: fix mount timeout (#10041 Yan, Zheng)
-* libcephfs: fix test (#10415 Yan, Zheng)
-* libcephfs: fix use-afer-free on umount (#10412 Yan, Zheng)
-* libcephfs: include ceph and git version in client metadata (Sage Weil)
-* librados: add watch_flush() operation (Sage Weil, Haomai Wang)
-* librados: avoid memcpy on getxattr, read (Jianpeng Ma)
-* librados: create ioctx by pool id (Jason Dillaman)
-* librados: do notify completion in fast-dispatch (Sage Weil)
-* librados: remove shadowed variable (Kefu Chain)
-* librados: translate op flags from C APIs (Matthew Richards)
-* librbd: differentiate between R/O vs R/W features (Jason Dillaman)
-* librbd: exclusive image locking (Jason Dillaman)
-* librbd: fix write vs import race (#10590 Jason Dillaman)
-* librbd: gracefully handle deleted/renamed pools (#10270 Jason Dillaman)
-* mds: asok command for fetching subtree map (John Spray)
-* mds: constify MDSCacheObjects (John Spray)
-* misc: various valgrind fixes and cleanups (Danny Al-Gaaf)
-* mon: fix 'mds fail' for standby MDSs (John Spray)
-* mon: fix stashed monmap encoding (#5203 Xie Rui)
-* mon: implement 'fs reset' command (John Spray)
-* mon: respect down flag when promoting standbys (John Spray)
-* mount.ceph: fix suprious error message (#10351 Yan, Zheng)
-* msgr: async: many fixes, unit tests (Haomai Wang)
-* msgr: simple: retry binding to port on failure (#10029 Wido den Hollander)
-* osd: add fadvise flags to ObjectStore API (Jianpeng Ma)
-* osd: add get_latest_osdmap asok command (#9483 #9484 Mykola Golub)
-* osd: EIO on whole-object reads when checksum is wrong (Sage Weil)
-* osd: filejournal: don't cache journal when not using direct IO (Jianpeng Ma)
-* osd: fix ioprio option (Mykola Golub)
-* osd: fix scrub delay bug (#10693 Samuel Just)
-* osd: fix watch reconnect race (#10441 Sage Weil)
-* osd: handle no-op write with snapshot (#10262 Sage Weil)
-* osd: journal: fix journal zeroing when direct IO is enabled (Xie Rui)
-* osd: keyvaluestore: cleanup dead code (Ning Yao)
-* osd, mds: 'ops' as shorthand for 'dump_ops_in_flight' on asok (Sage Weil)
-* osd: memstore: fix size limit (Xiaoxi Chen)
-* osd: misc scrub fixes (#10017 Loic Dachary)
-* osd: new optimized encoding for ObjectStore::Transaction (Dong Yuan)
-* osd: optimize filter_snapc (Ning Yao)
-* osd: optimize WBThrottle map with unordered_map (Ning Yao)
-* osd: proxy reads during cache promote (Zhiqiang Wang)
-* osd: proxy read support (Zhiqiang Wang)
-* osd: remove legacy classic scrub code (Sage Weil)
-* osd: remove unused fields in MOSDSubOp (Xiaoxi Chen)
-* osd: replace MOSDSubOp messages with simpler, optimized MOSDRepOp (Xiaoxi Chen)
-* osd: store whole-object checksums on scrub, write_full (Sage Weil)
-* osd: verify kernel is new enough before using XFS extsize ioctl, enable by default (#9956 Sage Weil)
-* rados: use copy-from operation for copy, cppool (Sage Weil)
-* rgw: change multipart upload id magic (#10271 Yehuda Sadeh)
-* rgw: decode http query params correction (#10271 Yehuda Sadeh)
-* rgw: fix content length check (#10701 Axel Dunkel, Yehuda Sadeh)
-* rgw: fix partial GET in swift (#10553 Yehuda Sadeh)
-* rgw: fix shutdown (#10472 Yehuda Sadeh)
-* rgw: include XML ns on get ACL request (#10106 Yehuda Sadeh)
-* rgw: misc fixes (#10307 Yehuda Sadeh)
-* rgw: only track cleanup for objects we write (#10311 Yehuda Sadeh)
-* rgw: tweak error codes (#10329 #10334 Yehuda Sadeh)
-* rgw: use gc for multipart abort (#10445 Aaron Bassett, Yehuda Sadeh)
-* sysvinit: fix race in 'stop' (#10389 Loic Dachary)
-* test: fix bufferlist tests (Jianpeng Ma)
-* tests: improve docker-based tests (Loic Dachary)
-
-
-v0.91
-=====
-
-We are quickly approaching the Hammer feature freeze but have a few
-more dev releases to go before we get there.  The headline items are
-subtree-based quota support in CephFS (ceph-fuse/libcephfs client
-support only for now), a rewrite of the watch/notify librados API used
-by RBD and RGW, OSDMap checksums to ensure that maps are always
-consistent inside the cluster, new API calls in librados and librbd
-for IO hinting modeled after posix_fadvise, and improved storage of
-per-PG state.
-
-We expect two more releases before the Hammer feature freeze (v0.93).
-
-Upgrading
----------
-
-* The 'category' field for objects has been removed.  This was originally added
-  to track PG stat summations over different categories of objects for use by
-  radosgw.  It is no longer has any known users and is prone to abuse because it
-  can lead to a pg_stat_t structure that is unbounded.  The librados API calls
-  that accept this field now ignore it, and the OSD no longer tracks the
-  per-category summations.
-
-* The output for 'rados df' has changed.  The 'category' level has been
-  eliminated, so there is now a single stat object per pool.  The structure of
-  the JSON output is different, and the plaintext output has one less column.
-
-* The 'rados create <objectname> [category]' optional category argument is no
-  longer supported or recognized.
-
-* rados.py's Rados class no longer has a __del__ method; it was causing
-  problems on interpreter shutdown and use of threads.  If your code has
-  Rados objects with limited lifetimes and you're concerned about locked
-  resources, call Rados.shutdown() explicitly.
-
-* There is a new version of the librados watch/notify API with vastly
-  improved semantics.  Any applications using this interface are
-  encouraged to migrate to the new API.  The old API calls are marked
-  as deprecated and will eventually be removed.
-
-* The librados rados_unwatch() call used to be safe to call on an
-  invalid handle.  The new version has undefined behavior when passed
-  a bogus value (for example, when rados_watch() returns an error and
-  handle is not defined).
-
-* The structure of the formatted 'pg stat' command is changed for the
-  portion that counts states by name to avoid using the '+' character
-  (which appears in state names) as part of the XML token (it is not
-  legal).
-
-Notable Changes
----------------
-
-* asyncmsgr: misc fixes (Haomai Wang)
-* buffer: add 'shareable' construct (Matt Benjamin)
-* build: aarch64 build fixes (Noah Watkins, Haomai Wang)
-* build: support for jemalloc (Shishir Gowda)
-* ceph-disk: allow journal partition re-use (#10146 Loic Dachary, Dav van der Ster)
-* ceph-disk: misc fixes (Christos Stavrakakis)
-* ceph-fuse: fix kernel cache trimming (#10277 Yan, Zheng)
-* ceph-objectstore-tool: many many improvements (David Zafman)
-* common: support new gperftools header locations (Key Dreyer)
-* crush: straw bucket weight calculation fixes (#9998 Sage Weil)
-* doc: misc improvements (Nilamdyuti Goswami, John Wilkins, Chris Holcombe)
-* libcephfs,ceph-fuse: add 'status' asok (John Spray)
-* librados, osd: new watch/notify implementation (Sage Weil)
-* librados: drop 'category' feature (Sage Weil)
-* librados: fix pool deletion handling (#10372 Sage Weil)
-* librados: new fadvise API (Ma Jianpeng)
-* libradosstriper: fix remove() (Dongmao Zhang)
-* librbd: complete pending ops before closing image (#10299 Josh Durgin)
-* librbd: fadvise API (Ma Jianpeng)
-* mds: ENOSPC and OSDMap epoch barriers (#7317 John Spray)
-* mds: dirfrag buf fix (Yan, Zheng)
-* mds: disallow most commands on inactive MDS's (Greg Farnum)
-* mds: drop dentries, leases on deleted directories (#10164 Yan, Zheng)
-* mds: handle zero-size xattr (#10335 Yan, Zheng)
-* mds: subtree quota support (Yunchuan Wen)
-* memstore: free space tracking (John Spray)
-* misc cleanup (Danny Al-Gaaf, David Anderson)
-* mon: 'osd crush reweight-all' command (Sage Weil)
-* mon: allow full flag to be manually cleared (#9323 Sage Weil)
-* mon: delay failure injection (Joao Eduardo Luis)
-* mon: fix paxos timeouts (#10220 Joao Eduardo Luis)
-* mon: get canonical OSDMap from leader (#10422 Sage Weil)
-* msgr: fix RESETSESSION bug (#10080 Greg Farnum)
-* objectstore: deprecate collection attrs (Sage Weil)
-* osd, mon: add checksums to all OSDMaps (Sage Weil)
-* osd: allow deletion of objects with watcher (#2339 Sage Weil)
-* osd: allow sparse read for Push/Pull (Haomai Wang)
-* osd: cache reverse_nibbles hash value (Dong Yuan)
-* osd: drop upgrade support for pre-dumpling (Sage Weil)
-* osd: enable and use posix_fadvise (Sage Weil)
-* osd: erasure-code: enforce chunk size alignment (#10211 Loic Dachary)
-* osd: erasure-code: jerasure support for NEON (Loic Dachary)
-* osd: erasure-code: relax cauchy w restrictions (#10325 David Zhang, Loic Dachary)
-* osd: erasure-code: update gf-complete to latest upstream (Loic Dachary)
-* osd: fix WBTHrottle perf counters (Haomai Wang)
-* osd: fix backfill bug (#10150 Samuel Just)
-* osd: fix occasional peering stalls (#10431 Sage Weil)
-* osd: fix scrub vs try-flush bug (#8011 Samuel Just)
-* osd: fix stderr with -f or -d (Dan Mick)
-* osd: misc FIEMAP fixes (Ma Jianpeng)
-* osd: optimize Finisher (Xinze Chi)
-* osd: store PG metadata in per-collection objects for better concurrency (Sage Weil)
-* pyrados: add object lock support (#6114 Mehdi Abaakouk)
-* pyrados: fix misnamed wait_* routings (#10104 Dan Mick)
-* pyrados: misc cleanups (Kefu Chai)
-* qa: add large auth ticket tests (Ilya Dryomov)
-* qa: many 'make check' improvements (Loic Dachary)
-* qa: misc tests (Loic Dachary, Yan, Zheng)
-* rgw: conditional PUT on ETag (#8562 Ray Lv)
-* rgw: fix error codes (#10334 #10329 Yehuda Sadeh)
-* rgw: index swift keys appropriately (#10471 Yehuda Sadeh)
-* rgw: prevent illegal bucket policy that doesn't match placement rule (Yehuda Sadeh)
-* rgw: run radosgw as apache with systemd (#10125 Loic Dachary)
-* rgw: support X-Storage-Policy header for Swift storage policy compat (Yehuda Sadeh)
-* rgw: use \r\n for http headers (#9254 Yehuda Sadeh)
-* rpm: misc fixes (Key Dreyer)
-
-
-v0.90
-=====
-
-This is the last development release before Christmas.  There are some
-API cleanups for librados and librbd, and lots of bug fixes across the
-board for the OSD, MDS, RGW, and CRUSH.  The OSD also gets support for
-discard (potentially helpful on SSDs, although it is off by default), and there
-are several improvements to ceph-disk.
-
-The next two development releases will be getting a slew of new
-functionality for hammer.  Stay tuned!
-
-Upgrading
----------
-
-* Previously, the formatted output of 'ceph pg stat -f ...' was a full
-  pg dump that included all metadata about all PGs in the system.  It
-  is now a concise summary of high-level PG stats, just like the
-  unformatted 'ceph pg stat' command.
-
-* All JSON dumps of floating point values were incorrecting surrounding the
-  value with quotes.  These quotes have been removed.  Any consumer of structured
-  JSON output that was consuming the floating point values was previously having
-  to interpret the quoted string and will most likely need to be fixed to take
-  the unquoted number.
-
-Notable Changes
----------------
-
-* arch: fix NEON feaeture detection (#10185 Loic Dachary)
-* build: adjust build deps for yasm, virtualenv (Jianpeng Ma)
-* build: improve build dependency tooling (Loic Dachary)
-* ceph-disk: call partx/partprobe consistency (#9721 Loic Dachary)
-* ceph-disk: fix dmcrypt key permissions (Loic Dachary)
-* ceph-disk: fix umount race condition (#10096 Blaine Gardner)
-* ceph-disk: init=none option (Loic Dachary)
-* ceph-monstore-tool: fix shutdown (#10093 Loic Dachary)
-* ceph-objectstore-tool: fix import (#10090 David Zafman)
-* ceph-objectstore-tool: many improvements and tests (David Zafman)
-* ceph.spec: package rbd-replay-prep (Ken Dreyer)
-* common: add 'perf reset ...' admin command (Jianpeng Ma)
-* common: do not unlock rwlock on destruction (Federico Simoncelli)
-* common: fix block device discard check (#10296 Sage Weil)
-* common: remove broken CEPH_LOCKDEP optoin (Kefu Chai)
-* crush: fix tree bucket behavior (Rongze Zhu)
-* doc: add build-doc guidlines for Fedora and CentOS/RHEL (Nilamdyuti Goswami)
-* doc: enable rbd cache on openstack deployments (Sebastien Han)
-* doc: improved installation nots on CentOS/RHEL installs (John Wilkins)
-* doc: misc cleanups (Adam Spiers, Sebastien Han, Nilamdyuti Goswami, Ken Dreyer, John Wilkins)
-* doc: new man pages (Nilamdyuti Goswami)
-* doc: update release descriptions (Ken Dreyer)
-* doc: update sepia hardware inventory (Sandon Van Ness)
-* librados: only export public API symbols (Jason Dillaman)
-* libradosstriper: fix stat strtoll (Dongmao Zhang)
-* libradosstriper: fix trunc method (#10129 Sebastien Ponce)
-* librbd: fix list_children from invalid pool ioctxs (#10123 Jason Dillaman)
-* librbd: only export public API symbols (Jason Dillaman)
-* many coverity fixes (Danny Al-Gaaf)
-* mds: 'flush journal' admin command (John Spray)
-* mds: fix MDLog IO callback deadlock (John Spray)
-* mds: fix deadlock during journal probe vs purge (#10229 Yan, Zheng)
-* mds: fix race trimming log segments (Yan, Zheng)
-* mds: store backtrace for stray dir (Yan, Zheng)
-* mds: verify backtrace when fetching dirfrag (#9557 Yan, Zheng)
-* mon: add max pgs per osd warning (Sage Weil)
-* mon: fix *_ratio* units and types (Sage Weil)
-* mon: fix JSON dumps to dump floats as flots and not strings (Sage Weil)
-* mon: fix formatter 'pg stat' command output (Sage Weil)
-* msgr: async: several fixes (Haomai Wang)
-* msgr: simple: fix rare deadlock (Greg Farnum)
-* osd: batch pg log trim (Xinze Chi)
-* osd: clean up internal ObjectStore interface (Sage Weil)
-* osd: do not abort deep scrub on missing hinfo (#10018 Loic Dachary)
-* osd: fix ghobject_t formatted output to include shard (#10063 Loic Dachary)
-* osd: fix osd peer check on scrub messages (#9555 Sage Weil)
-* osd: fix pgls filter ops (#9439 David Zafman)
-* osd: flush snapshots from cache tier immediately (Sage Weil)
-* osd: keyvaluestore: fix getattr semantics (Haomai Wang)
-* osd: keyvaluestore: fix key ordering (#10119 Haomai Wang)
-* osd: limit in-flight read requests (Jason Dillaman)
-* osd: log when scrub or repair starts (Loic Dachary)
-* osd: support for discard for journal trim (Jianpeng Ma)
-* qa: fix osd create dup tests (#10083 Loic Dachary)
-* rgw: add location header when object is in another region (VRan Liu)
-* rgw: check timestamp on s3 keystone auth (#10062 Abhishek Lekshmanan)
-* rgw: make sysvinit script set ulimit -n properly (Sage Weil)
-* systemd: better systemd unit files (Owen Synge)
-* tests: ability to run unit tests under docker (Loic Dachary)
-
-
-v0.89
-=====
-
-This is the second development release since Giant.  The big items
-include the first batch of scrub patchs from Greg for CephFS, a rework
-in the librados object listing API to properly handle namespaces, and
-a pile of bug fixes for RGW.  There are also several smaller issues
-fixed up in the performance area with buffer alignment and memory
-copies, osd cache tiering agent, and various CephFS fixes.
-
-Upgrading
----------
-
-* New ability to list all objects from all namespaces can fail or
-  return incomplete results when not all OSDs have been upgraded.
-  Features rados --all ls, rados cppool, rados export, rados
-  cache-flush-evict-all and rados cache-try-flush-evict-all can also
-  fail or return incomplete results.
-
-Notable Changes
----------------
-
-* buffer: add list::get_contiguous (Sage Weil)
-* buffer: avoid rebuild if buffer already contiguous (Jianpeng Ma)
-* ceph-disk: improved systemd support (Owen Synge)
-* ceph-disk: set guid if reusing journal partition (Dan van der Ster)
-* ceph-fuse, libcephfs: allow xattr caps in inject_release_failure (#9800 John Spray)
-* ceph-fuse, libcephfs: fix I_COMPLETE_ORDERED checks (#9894 Yan, Zheng)
-* ceph-fuse: fix dentry invalidation on 3.18+ kernels (#9997 Yan, Zheng)
-* crush: fix detach_bucket (#10095 Sage Weil)
-* crush: fix several bugs in adjust_item_weight (Rongze Zhu)
-* doc: add dumpling to firefly upgrade section (#7679 John Wilkins)
-* doc: document erasure coded pool operations (#9970 Loic Dachary)
-* doc: file system osd config settings (Kevin Dalley)
-* doc: key/value store config reference (John Wilkins)
-* doc: update openstack docs for Juno (Sebastien Han)
-* fix cluster logging from non-mon daemons (Sage Weil)
-* init-ceph: check for systemd-run before using it (Boris Ranto)
-* librados: fix infinite loop with skipped map epochs (#9986 Ding Dinghua)
-* librados: fix iterator operator= bugs (#10082 David Zafman, Yehuda Sadeh)
-* librados: fix null deref when pool DNE (#9944 Sage Weil)
-* librados: fix timer race from recent refactor (Sage Weil)
-* libradosstriper: fix shutdown hang (Dongmao Zhang)
-* librbd: don't close a closed parent in failure path (#10030 Jason Dillaman)
-* librbd: fix diff test (#10002 Josh Durgin)
-* librbd: fix locking for readahead (#10045 Jason Dillaman)
-* librbd: refactor unit tests to use fixtures (Jason Dillaman)
-* many many coverity cleanups (Danny Al-Gaaf)
-* mds: a whole bunch of initial scrub infrastructure (Greg Farnum)
-* mds: fix compat_version for MClientSession (#9945 John Spray)
-* mds: fix reply snapbl (Yan, Zheng)
-* mon: allow adding tiers to fs pools (#10135 John Spray)
-* mon: fix MDS health status from peons (#10151 John Spray)
-* mon: fix caching for min_last_epoch_clean (#9987 Sage Weil)
-* mon: fix error output for add_data_pool (#9852 Joao Eduardo Luis)
-* mon: include entity name in audit log for forwarded requests (#9913 Joao Eduardo Luis)
-* mon: paxos: allow reads while proposing (#9321 #9322 Joao Eduardo Luis)
-* msgr: asyncmessenger: add kqueue support (#9926 Haomai Wang)
-* osd, librados: revamp PG listing API to handle namespaces (#9031 #9262 #9438 David Zafman)
-* osd, mon: send intiial pg create time from mon to osd (#9887 David Zafman)
-* osd: allow whiteout deletion in cache pool (Sage Weil)
-* osd: cache pool: ignore min flush age when cache is full (Xinze Chi)
-* osd: erasure coding: allow bench.sh to test ISA backend (Yuan Zhou)
-* osd: erasure-code: encoding regression tests, corpus (#9420 Loic Dachary)
-* osd: fix journal shutdown race (Sage Weil)
-* osd: fix object age eviction (Zhiqiang Wang)
-* osd: fix object atime calculation (Xinze Chi)
-* osd: fix past_interval display bug (#9752 Loic Dachary)
-* osd: journal: fix alignment checks, avoid useless memmove (Jianpeng Ma)
-* osd: journal: update committed_thru after replay (#6756 Samuel Just)
-* osd: keyvaluestore_dev: optimization (Chendi Xue)
-* osd: make misdirected op checks robust for EC pools (#9835 Sage Weil)
-* osd: removed some dead code (Xinze Chi)
-* qa: parallelize make check (Loic Dachary)
-* qa: tolerate nearly-full disk for make check (Loic Dachary)
-* rgw: create subuser if needed when creating user (#10103 Yehuda Sadeh)
-* rgw: fix If-Modified-Since (VRan Liu)
-* rgw: fix content-length update (#9576 Yehuda Sadeh)
-* rgw: fix disabling of max_size quota (#9907 Dong Lei)
-* rgw: fix incorrect len when len is 0 (#9877 Yehuda Sadeh)
-* rgw: fix object copy content type (#9478 Yehuda Sadeh)
-* rgw: fix user stags in get-user-info API (#9359 Ray Lv)
-* rgw: remove swift user manifest (DLO) hash calculation (#9973 Yehuda Sadeh)
-* rgw: return timestamp on GET/HEAD (#8911 Yehuda Sadeh)
-* rgw: set ETag on object copy (#9479 Yehuda Sadeh)
-* rgw: update bucket index on attr changes, for multi-site sync (#5595 Yehuda Sadeh)
-
-
-v0.88
-=====
-
-This is the first development release after Giant.  The two main
-features merged this round are the new AsyncMessenger (an alternative
-implementation of the network layer) from Haomai Wang at UnitedStack,
-and support for POSIX file locks in ceph-fuse and libcephfs from Yan,
-Zheng.  There is also a big pile of smaller items that re merged while
-we were stabilizing Giant, including a range of smaller performance
-and bug fixes and some new tracepoints for LTTNG.
-
-Notable Changes
----------------
-
-* ceph-disk: Scientific Linux support (Dan van der Ster)
-* ceph-disk: respect --statedir for keyring (Loic Dachary)
-* ceph-fuse, libcephfs: POSIX file lock support (Yan, Zheng)
-* ceph-fuse, libcephfs: fix cap flush overflow (Greg Farnum, Yan, Zheng)
-* ceph-fuse, libcephfs: fix root inode xattrs (Yan, Zheng)
-* ceph-fuse, libcephfs: preserve dir ordering (#9178 Yan, Zheng)
-* ceph-fuse, libcephfs: trim inodes before reconnecting to MDS (Yan, Zheng)
-* ceph: do not parse injectargs twice (Loic Dachary)
-* ceph: make 'ceph -s' output more readable (Sage Weil)
-* ceph: new 'ceph tell mds.$name_or_rank_or_gid' (John Spray)
-* ceph: test robustness (Joao Eduardo Luis)
-* ceph_objectstore_tool: behave with sharded flag (#9661 David Zafman)
-* cephfs-journal-tool: fix journal import (#10025 John Spray)
-* cephfs-journal-tool: skip up to expire_pos (#9977 John Spray)
-* cleanup rados.h definitions with macros (Ilya Dryomov)
-* common: shared_cache unit tests (Cheng Cheng)
-* config: add $cctid meta variable (Adam Crume)
-* crush: fix buffer overrun for poorly formed rules (#9492 Johnu George)
-* crush: improve constness (Loic Dachary)
-* crushtool: add --location <id> command (Sage Weil, Loic Dachary)
-* default to libnss instead of crypto++ (Federico Gimenez)
-* doc: ceph osd reweight vs crush weight (Laurent Guerby)
-* doc: document the LRC per-layer plugin configuration (Yuan Zhou)
-* doc: erasure code doc updates (Loic Dachary)
-* doc: misc updates (Alfredo Deza, VRan Liu)
-* doc: preflight doc fixes (John Wilkins)
-* doc: update PG count guide (Gerben Meijer, Laurent Guerby, Loic Dachary)
-* keyvaluestore: misc fixes (Haomai Wang)
-* keyvaluestore: performance improvements (Haomai Wang)
-* librados: add rados_pool_get_base_tier() call (Adam Crume)
-* librados: cap buffer length (Loic Dachary)
-* librados: fix objecter races (#9617 Josh Durgin)
-* libradosstriper: misc fixes (Sebastien Ponce)
-* librbd: add missing python docstrings (Jason Dillaman)
-* librbd: add readahead (Adam Crume)
-* librbd: fix cache tiers in list_children and snap_unprotect (Adam Crume)
-* librbd: fix performance regression in ObjectCacher (#9513 Adam Crume)
-* librbd: lttng tracepoints (Adam Crume)
-* librbd: misc fixes (Xinxin Shu, Jason Dillaman)
-* mds: fix sessionmap lifecycle bugs (Yan, Zheng)
-* mds: initialize root inode xattr version (Yan, Zheng)
-* mds: introduce auth caps (John Spray)
-* mds: misc bugs (Greg Farnum, John Spray, Yan, Zheng, Henry Change)
-* misc coverity fixes (Danny Al-Gaaf)
-* mon: add 'ceph osd rename-bucket ...' command (Loic Dachary)
-* mon: clean up auth list output (Loic Dachary)
-* mon: fix 'osd crush link' id resolution (John Spray)
-* mon: fix misc error paths (Joao Eduardo Luis)
-* mon: fix paxos off-by-one corner case (#9301 Sage Weil)
-* mon: new 'ceph pool ls [detail]' command (Sage Weil)
-* mon: wait for writeable before cross-proposing (#9794 Joao Eduardo Luis)
-* msgr: avoid useless new/delete (Haomai Wang)
-* msgr: fix delay injection bug (#9910 Sage Weil, Greg Farnum)
-* msgr: new AsymcMessenger alternative implementation (Haomai Wang)
-* msgr: prefetch data when doing recv (Yehuda Sadeh)
-* osd: add erasure code corpus (Loic Dachary)
-* osd: add misc tests (Loic Dachary, Danny Al-Gaaf)
-* osd: cleanup boost optionals (William Kennington)
-* osd: expose non-journal backends via ceph-osd CLI (Hoamai Wang)
-* osd: fix JSON output for stray OSDs (Loic Dachary)
-* osd: fix ioprio options (Loic Dachary)
-* osd: fix transaction accounting (Jianpeng Ma)
-* osd: misc optimizations (Xinxin Shu, Zhiqiang Wang, Xinze Chi)
-* osd: use FIEMAP_FLAGS_SYNC instead of fsync (Jianpeng Ma)
-* rados: fix put of /dev/null (Loic Dachary)
-* rados: parse command-line arguments more strictly (#8983 Adam Crume)
-* rbd-fuse: fix memory leak (Adam Crume)
-* rbd-replay-many (Adam Crume)
-* rbd-replay: --anonymize flag to rbd-replay-prep (Adam Crume)
-* rbd: fix 'rbd diff' for non-existent objects (Adam Crume)
-* rbd: fix error when striping with format 1 (Sebastien Han)
-* rbd: fix export for image sizes over 2GB (Vicente Cheng)
-* rbd: use rolling average for rbd bench-write throughput (Jason Dillaman)
-* rgw: send explicit HTTP status string (Yehuda Sadeh)
-* rgw: set length for keystone token validation request (#7796 Yehuda Sadeh, Mark Kirkwood)
-* udev: fix rules for CentOS7/RHEL7 (Loic Dachary)
-* use clock_gettime instead of gettimeofday (Jianpeng Ma)
-* vstart.sh: set up environment for s3-tests (Luis Pabon)
diff --git a/ceph/doc/releases/index.rst b/ceph/doc/releases/index.rst
deleted file mode 100644 (file)
index ac9bc4d..0000000
+++ /dev/null
@@ -1,262 +0,0 @@
-.. _ceph-releases-index:
-
-=====================
-Ceph Releases (index)
-=====================
-
-.. toctree::
-   :maxdepth: 1
-
-.. _active-releases:
-
-Active Releases
----------------
-
-The following Ceph releases are actively maintained and receive periodic backports and
-security fixes.
-
-.. toctree::
-   :maxdepth: 1
-   :hidden:
-
-   Quincy (v17.2.*) <quincy>
-   Pacific (v16.2.*) <pacific>
-   Octopus (v15.2.*) <octopus>
-
-.. ceph_releases:: releases.yml current
-
-
-Archived Releases
------------------
-
-The following older Ceph releases are no longer maintained (do not
-receive bug fixes or backports).
-
-.. ceph_releases:: releases.yml eol
-
-.. toctree::
-   :maxdepth: 1
-   :hidden:
-
-   Nautilus (v14.2.*) <nautilus>
-   Mimic (v13.2.*) <mimic>
-   Luminous (v12.2.*) <luminous>
-   Kraken (v11.2.*) <kraken>
-   Jewel (v10.2.*) <jewel>
-   Infernalis (v9.2.*) <infernalis>
-   Hammer (v0.94.*) <hammer>
-   Giant (v0.87.*) <giant>
-   Firefly (v0.80.*) <firefly>
-   Emperor (v0.72.*) <emperor>
-   Dumpling (v0.67.*) <dumpling>
-   Cuttlefish (v0.61.*) <cuttlefish>
-   Bobtail (v0.56.*) <bobtail>
-   Argonaut (v0.48.*) <argonaut>
-
-Release timeline
-----------------
-
-.. ceph_timeline:: releases.yml quincy pacific octopus
-
-.. _Quincy: quincy
-.. _17.2.0: quincy#v17-2-0-quincy
-
-
-.. _Pacific: pacific
-.. _16.2.7: pacific#v16-2-7-pacific
-.. _16.2.6: pacific#v16-2-6-pacific
-.. _16.2.5: pacific#v16-2-5-pacific
-.. _16.2.4: pacific#v16-2-4-pacific
-.. _16.2.3: pacific#v16-2-3-pacific
-.. _16.2.2: pacific#v16-2-2-pacific
-.. _16.2.1: pacific#v16-2-1-pacific
-.. _16.2.0: pacific#v16-2-0-pacific
-
-.. _Octopus: octopus
-.. _15.2.15: octopus#v15-2-15-octopus
-.. _15.2.14: octopus#v15-2-14-octopus
-.. _15.2.13: octopus#v15-2-13-octopus
-.. _15.2.12: octopus#v15-2-12-octopus
-.. _15.2.11: octopus#v15-2-11-octopus
-.. _15.2.10: octopus#v15-2-10-octopus
-.. _15.2.9: octopus#v15-2-9-octopus
-.. _15.2.8: octopus#v15-2-8-octopus
-.. _15.2.7: octopus#v15-2-7-octopus
-.. _15.2.6: octopus#v15-2-6-octopus
-.. _15.2.5: octopus#v15-2-5-octopus
-.. _15.2.4: octopus#v15-2-4-octopus
-.. _15.2.3: octopus#v15-2-3-octopus
-.. _15.2.2: octopus#v15-2-2-octopus
-.. _15.2.1: octopus#v15-2-1-octopus
-.. _15.2.0: octopus#v15-2-0-octopus
-
-.. _Nautilus: nautilus
-.. _14.2.22: nautilus#v14-2-22-nautilus
-.. _14.2.21: nautilus#v14-2-21-nautilus
-.. _14.2.20: nautilus#v14-2-20-nautilus
-.. _14.2.19: nautilus#v14-2-19-nautilus
-.. _14.2.18: nautilus#v14-2-18-nautilus
-.. _14.2.17: nautilus#v14-2-17-nautilus
-.. _14.2.16: nautilus#v14-2-16-nautilus
-.. _14.2.15: nautilus#v14-2-15-nautilus
-.. _14.2.14: nautilus#v14-2-14-nautilus
-.. _14.2.13: nautilus#v14-2-13-nautilus
-.. _14.2.12: nautilus#v14-2-12-nautilus
-.. _14.2.11: nautilus#v14-2-11-nautilus
-.. _14.2.10: nautilus#v14-2-10-nautilus
-.. _14.2.9: nautilus#v14-2-9-nautilus
-.. _14.2.8: nautilus#v14-2-8-nautilus
-.. _14.2.7: nautilus#v14-2-7-nautilus
-.. _14.2.6: nautilus#v14-2-6-nautilus
-.. _14.2.5: nautilus#v14-2-5-nautilus
-.. _14.2.4: nautilus#v14-2-4-nautilus
-.. _14.2.3: nautilus#v14-2-3-nautilus
-.. _14.2.2: nautilus#v14-2-2-nautilus
-.. _14.2.1: nautilus#v14-2-1-nautilus
-.. _14.2.0: nautilus#v14-2-0-nautilus
-
-.. _Mimic: mimic
-.. _13.2.10: mimic#v13-2-10-mimic
-.. _13.2.9: mimic#v13-2-9-mimic
-.. _13.2.8: mimic#v13-2-8-mimic
-.. _13.2.7: mimic#v13-2-7-mimic
-.. _13.2.6: mimic#v13-2-6-mimic
-.. _13.2.5: mimic#v13-2-5-mimic
-.. _13.2.4: mimic#v13-2-4-mimic
-.. _13.2.3: mimic#v13-2-3-mimic
-.. _13.2.2: mimic#v13-2-2-mimic
-.. _13.2.1: mimic#v13-2-1-mimic
-.. _13.2.0: mimic#v13-2-0-mimic
-
-.. _Luminous: luminous
-.. _12.2.13: luminous#v12-2-13-luminous
-.. _12.2.12: luminous#v12-2-12-luminous
-.. _12.2.11: luminous#v12-2-11-luminous
-.. _12.2.10: luminous#v12-2-10-luminous
-.. _12.2.9: luminous#v12-2-9-luminous
-.. _12.2.8: luminous#v12-2-8-luminous
-.. _12.2.7: luminous#v12-2-7-luminous
-.. _12.2.6: luminous#v12-2-6-luminous
-.. _12.2.5: luminous#v12-2-5-luminous
-.. _12.2.4: luminous#v12-2-4-luminous
-.. _12.2.3: luminous#v12-2-3-luminous
-.. _12.2.2: luminous#v12-2-2-luminous
-.. _12.2.1: luminous#v12-2-1-luminous
-.. _12.2.0: luminous#v12-2-0-luminous
-
-.. _Kraken: kraken
-.. _11.2.1: kraken#v11-2-1-kraken
-.. _11.2.0: kraken#v11-2-0-kraken
-.. _11.0.2: kraken#v11-0-2-kraken
-
-.. _Jewel: jewel
-.. _10.2.11: jewel#v10-2-11-jewel
-.. _10.2.10: jewel#v10-2-10-jewel
-.. _10.2.9: jewel#v10-2-9-jewel
-.. _10.2.8: jewel#v10-2-8-jewel
-.. _10.2.7: jewel#v10-2-7-jewel
-.. _10.2.6: jewel#v10-2-6-jewel
-.. _10.2.5: jewel#v10-2-5-jewel
-.. _10.2.4: jewel#v10-2-4-jewel
-.. _10.2.3: jewel#v10-2-3-jewel
-.. _10.2.2: jewel#v10-2-2-jewel
-.. _10.2.1: jewel#v10-2-1-jewel
-.. _10.2.0: jewel#v10-2-0-jewel
-
-.. _10.1.2: jewel#v10-1-2-jewel-release-candidate
-.. _10.1.1: jewel#v10-1-1-jewel-release-candidate
-.. _10.1.0: jewel#v10-1-0-jewel-release-candidate
-.. _10.0.5: jewel#v10-0-5
-.. _10.0.3: jewel#v10-0-3
-.. _10.0.2: jewel#v10-0-2
-.. _10.0.1: jewel#v10-0-1
-.. _10.0.0: jewel#v10-0-0
-
-.. _Infernalis: infernalis
-.. _9.2.1: infernalis#v9-2-1-infernalis
-.. _9.2.0: infernalis#v9-2-0-infernalis
-
-.. _9.1.0: infernalis#v9-1-0
-.. _9.0.3: infernalis#v9-0-3
-.. _9.0.2: infernalis#v9-0-2
-.. _9.0.1: infernalis#v9-0-1
-.. _9.0.0: infernalis#v9-0-0
-
-.. _0.94.10: hammer#v0-94-10-hammer
-.. _0.94.9: hammer#v0-94-9-hammer
-.. _0.94.8: hammer#v0-94-8-hammer
-.. _0.94.7: hammer#v0-94-7-hammer
-.. _0.94.6: hammer#v0-94-6-hammer
-.. _0.94.5: hammer#v0-94-5-hammer
-.. _0.94.4: hammer#v0-94-4-hammer
-.. _0.94.3: hammer#v0-94-3-hammer
-.. _0.94.2: hammer#v0-94-2-hammer
-.. _0.94.1: hammer#v0-94-1-hammer
-.. _0.94: hammer#v0-94-hammer
-.. _Hammer: hammer
-
-.. _0.93: hammer#v0-93
-.. _0.92: hammer#v0-92
-.. _0.91: hammer#v0-91
-.. _0.90: hammer#v0-90
-.. _0.89: hammer#v0-89
-.. _0.88: hammer#v0-88
-
-.. _0.87.2: giant#v0-87-2-giant
-.. _0.87.1: giant#v0-87-1-giant
-.. _0.87: giant#v0-87-giant
-.. _Giant: giant
-
-.. _0.86: giant#v0-86
-.. _0.85: giant#v0-85
-.. _0.84: giant#v0-84
-.. _0.83: giant#v0-83
-.. _0.82: giant#v0-82
-.. _0.81: giant#v0-81
-
-.. _0.80.11: firefly#v0-80-11-firefly
-.. _0.80.10: firefly#v0-80-10-firefly
-.. _0.80.9: firefly#v0-80-9-firefly
-.. _0.80.8: firefly#v0-80-8-firefly
-.. _0.80.7: firefly#v0-80-7-firefly
-.. _0.80.6: firefly#v0-80-6-firefly
-.. _0.80.5: firefly#v0-80-5-firefly
-.. _0.80.4: firefly#v0-80-4-firefly
-.. _0.80.3: firefly#v0-80-3-firefly
-.. _0.80.2: firefly#v0-80-2-firefly
-.. _0.80.1: firefly#v0-80-1-firefly
-.. _0.80: firefly#v0-80-firefly
-.. _Firefly: firefly
-
-.. _0.79: firefly#v0-79
-.. _0.78: firefly#v0-78
-.. _0.77: firefly#v0-77
-.. _0.76: firefly#v0-76
-.. _0.75: firefly#v0-75
-.. _0.74: firefly#v0-74
-.. _0.73: firefly#v0-73
-
-.. _0.72.2: emperor#v0-72-2-emperor
-.. _0.72.1: emperor#v0-72-1-emperor
-.. _0.72: emperor#v0-72-emperor
-.. _Emperor: emperor
-
-.. _0.71: dumpling#v0-71
-.. _0.70: dumpling#v0-70
-.. _0.69: dumpling#v0-69
-.. _0.68: dumpling#v0-68
-
-.. _0.67.11: dumpling#v0-67-11-dumpling
-.. _0.67.10: dumpling#v0-67-10-dumpling
-.. _0.67.9: dumpling#v0-67-9-dumpling
-.. _0.67.8: dumpling#v0-67-8-dumpling
-.. _0.67.7: dumpling#v0-67-7-dumpling
-.. _0.67.6: dumpling#v0-67-6-dumpling
-.. _0.67.5: dumpling#v0-67-5-dumpling
-.. _0.67.4: dumpling#v0-67-4-dumpling
-.. _0.67.3: dumpling#v0-67-3-dumpling
-.. _0.67.2: dumpling#v0-67-2-dumpling
-.. _0.67.1: dumpling#v0-67-1-dumpling
-.. _0.67: dumpling#v0-67-dumpling
-.. _Dumpling:  dumpling
-   
diff --git a/ceph/doc/releases/infernalis.rst b/ceph/doc/releases/infernalis.rst
deleted file mode 100644 (file)
index 43a2af3..0000000
+++ /dev/null
@@ -1,1534 +0,0 @@
-.. _infernalis-release-notes:
-
-==========
-Infernalis
-==========
-
-Infernalis is the 9th stable release of Ceph.  It is named after the
-vampire squid (Vampyroteuthis infernalis, the "vampire squid from
-hell").
-
-v9.2.1 Infernalis
-=================
-
-This Infernalis point release fixes several packagins and init script
-issues, enables the librbd objectmap feature by default, a few librbd
-bugs, and a range of miscellaneous bug fixes across the system.
-
-We recommend that all infernalis v9.2.0 users upgrade.
-
-For more detailed information, see :download:`the complete changelog <../changelog/v9.2.1.txt>`.
-
-Upgrading
----------
-
-* Some symbols wrongly exposed by the C++ interface for librados in
-  v9.1.0 and v9.2.0 were removed.  If you compiled your own
-  application against librados shipped with these releases, it is very
-  likely referencing these removed symbols. So you will need to
-  recompile it.
-
-
-Notable Changes
----------------
-* build/ops: Ceph daemon failed to start, because the service name was already used. (`issue#13474 <http://tracker.ceph.com/issues/13474>`_, `pr#6833 <http://github.com/ceph/ceph/pull/6833>`_, Chuanhong Wang)
-* build/ops: ceph upstart script rbdmap.conf incorrectly processes parameters (`issue#13214 <http://tracker.ceph.com/issues/13214>`_, `pr#6396 <http://github.com/ceph/ceph/pull/6396>`_, Sage Weil)
-* build/ops: libunwind package missing on CentOS 7 (`issue#13997 <http://tracker.ceph.com/issues/13997>`_, `pr#6845 <http://github.com/ceph/ceph/pull/6845>`_, Loic Dachary)
-* build/ops: rbd-replay-* moved from ceph-test-dbg to ceph-common-dbg as well (`issue#13785 <http://tracker.ceph.com/issues/13785>`_, `pr#6628 <http://github.com/ceph/ceph/pull/6628>`_, Loic Dachary)
-* build/ops: systemd/ceph-disk@.service assumes /bin/flock (`issue#13975 <http://tracker.ceph.com/issues/13975>`_, `pr#6852 <http://github.com/ceph/ceph/pull/6852>`_, Loic Dachary)
-* build/ops: systemd: no rbdmap systemd unit file (`issue#13374 <http://tracker.ceph.com/issues/13374>`_, `pr#6500 <http://github.com/ceph/ceph/pull/6500>`_, Boris Ranto)
-* common: auth/cephx: large amounts of log are produced by osd (`issue#13610 <http://tracker.ceph.com/issues/13610>`_, `pr#6836 <http://github.com/ceph/ceph/pull/6836>`_, Qiankun Zheng)
-* common: log: Log.cc: Assign LOG_DEBUG priority to syslog calls (`issue#13993 <http://tracker.ceph.com/issues/13993>`_, `pr#6993 <http://github.com/ceph/ceph/pull/6993>`_, Brad Hubbard)
-* crush: crash if we see CRUSH_ITEM_NONE in early rule step (`issue#13477 <http://tracker.ceph.com/issues/13477>`_, `pr#6626 <http://github.com/ceph/ceph/pull/6626>`_, Sage Weil)
-* fs: Ceph file system is not freeing space (`issue#13777 <http://tracker.ceph.com/issues/13777>`_, `pr#7431 <http://github.com/ceph/ceph/pull/7431>`_, Yan, Zheng, John Spray)
-* fs: Ceph-fuse won't start correctly when the option log_max_new in ceph.conf set to zero (`issue#13443 <http://tracker.ceph.com/issues/13443>`_, `pr#6395 <http://github.com/ceph/ceph/pull/6395>`_, Wenjun Huang)
-* fs: Segmentation fault accessing file using fuse mount (`issue#13714 <http://tracker.ceph.com/issues/13714>`_, `pr#6853 <http://github.com/ceph/ceph/pull/6853>`_, Yan, Zheng)
-* librbd: Avoid re-writing old-format image header on resize (`issue#13674 <http://tracker.ceph.com/issues/13674>`_, `pr#6630 <http://github.com/ceph/ceph/pull/6630>`_, Jason Dillaman)
-* librbd: ImageWatcher shouldn't block the notification thread (`issue#14373 <http://tracker.ceph.com/issues/14373>`_, `pr#7406 <http://github.com/ceph/ceph/pull/7406>`_, Jason Dillaman)
-* librbd: QEMU hangs after creating snapshot and stopping VM (`issue#13726 <http://tracker.ceph.com/issues/13726>`_, `pr#6632 <http://github.com/ceph/ceph/pull/6632>`_, Jason Dillaman)
-* librbd: Verify self-managed snapshot functionality on image create (`issue#13633 <http://tracker.ceph.com/issues/13633>`_, `pr#7080 <http://github.com/ceph/ceph/pull/7080>`_, Jason Dillaman)
-* librbd: [ FAILED ] TestLibRBD.SnapRemoveViaLockOwner (`issue#14164 <http://tracker.ceph.com/issues/14164>`_, `pr#7079 <http://github.com/ceph/ceph/pull/7079>`_, Jason Dillaman)
-* librbd: enable feature objectmap (`issue#13558 <http://tracker.ceph.com/issues/13558>`_, `pr#6477 <http://github.com/ceph/ceph/pull/6477>`_, xinxin shu)
-* librbd: fix merge-diff for >2GB diff-files (`issue#14030 <http://tracker.ceph.com/issues/14030>`_, `pr#6981 <http://github.com/ceph/ceph/pull/6981>`_, Jason Dillaman)
-* librbd: flattening an rbd image with active IO can lead to hang (`issue#14092 <http://tracker.ceph.com/issues/14092>`_, `issue#14483 <http://tracker.ceph.com/issues/14483>`_, `pr#7484 <http://github.com/ceph/ceph/pull/7484>`_, Jason Dillaman)
-* mds: fix client capabilities during reconnect (client.XXXX isn't responding to mclientcaps warning) (`issue#11482 <http://tracker.ceph.com/issues/11482>`_, `pr#6752 <http://github.com/ceph/ceph/pull/6752>`_, Yan, Zheng)
-* mon: Ceph Pools' MAX AVAIL is 0 if some OSDs' weight is 0 (`issue#13840 <http://tracker.ceph.com/issues/13840>`_, `pr#6907 <http://github.com/ceph/ceph/pull/6907>`_, Chengyuan Li)
-* mon: should not set isvalid = true when cephx_verify_authorizer retur... (`issue#13525 <http://tracker.ceph.com/issues/13525>`_, `pr#6392 <http://github.com/ceph/ceph/pull/6392>`_, Ruifeng Yang)
-* objecter: pool op callback may hang forever. (`issue#13642 <http://tracker.ceph.com/issues/13642>`_, `pr#6627 <http://github.com/ceph/ceph/pull/6627>`_, xie xingguo)
-* objecter: potential null pointer access when do pool_snap_list. (`issue#13639 <http://tracker.ceph.com/issues/13639>`_, `pr#6840 <http://github.com/ceph/ceph/pull/6840>`_, xie xingguo)
-* osd: FileStore: potential memory leak if getattrs fails. (`issue#13597 <http://tracker.ceph.com/issues/13597>`_, `pr#6846 <http://github.com/ceph/ceph/pull/6846>`_, xie xingguo)
-* osd: OSD::build_past_intervals_parallel() shall reset primary and up_primary when begin a new past_interval. (`issue#13471 <http://tracker.ceph.com/issues/13471>`_, `pr#6397 <http://github.com/ceph/ceph/pull/6397>`_, xiexingguo)
-* osd: call on_new_interval on newly split child PG (`issue#13962 <http://tracker.ceph.com/issues/13962>`_, `pr#6849 <http://github.com/ceph/ceph/pull/6849>`_, Sage Weil)
-* osd: ceph-disk list fails on /dev/cciss!c0d0 (`issue#13970 <http://tracker.ceph.com/issues/13970>`_, `issue#14230 <http://tracker.ceph.com/issues/14230>`_, `pr#6880 <http://github.com/ceph/ceph/pull/6880>`_, Loic Dachary)
-* osd: ceph-disk: use blkid instead of sgdisk -i (`issue#14080 <http://tracker.ceph.com/issues/14080>`_, `pr#7001 <http://github.com/ceph/ceph/pull/7001>`_, Loic Dachary, Ilya Dryomov)
-* osd: fix race condition during send_failures (`issue#13821 <http://tracker.ceph.com/issues/13821>`_, `pr#6694 <http://github.com/ceph/ceph/pull/6694>`_, Sage Weil)
-* osd: osd/PG.cc: 288: FAILED assert(info.last_epoch_started >= info.history.last_epoch_started) (`issue#14015 <http://tracker.ceph.com/issues/14015>`_, `pr#6851 <http://github.com/ceph/ceph/pull/6851>`_, David Zafman)
-* osd: pgs stuck inconsistent after infernalis upgrade (`issue#13862 <http://tracker.ceph.com/issues/13862>`_, `pr#7421 <http://github.com/ceph/ceph/pull/7421>`_, David Zafman)
-* rbd: TaskFinisher::cancel should remove event from SafeTimer (`issue#14476 <http://tracker.ceph.com/issues/14476>`_, `pr#7426 <http://github.com/ceph/ceph/pull/7426>`_, Douglas Fuller)
-* rbd: cls_rbd: object_map_save should enable checksums (`issue#14280 <http://tracker.ceph.com/issues/14280>`_, `pr#7428 <http://github.com/ceph/ceph/pull/7428>`_, Douglas Fuller)
-* rbd: misdirected op in rbd balance-reads test (`issue#13491 <http://tracker.ceph.com/issues/13491>`_, `pr#6629 <http://github.com/ceph/ceph/pull/6629>`_, Jason Dillaman)
-* rbd: pure virtual method called (`issue#13636 <http://tracker.ceph.com/issues/13636>`_, `pr#6633 <http://github.com/ceph/ceph/pull/6633>`_, Jason Dillaman)
-* rbd: rbd clone issue (`issue#13553 <http://tracker.ceph.com/issues/13553>`_, `pr#6474 <http://github.com/ceph/ceph/pull/6474>`_, xinxin shu)
-* rbd: rbd-replay does not check for EOF and goes to endless loop (`issue#14452 <http://tracker.ceph.com/issues/14452>`_, `pr#7427 <http://github.com/ceph/ceph/pull/7427>`_, Mykola Golub)
-* rbd: unknown argument --quiet in udevadm settle (`issue#13560 <http://tracker.ceph.com/issues/13560>`_, `pr#6634 <http://github.com/ceph/ceph/pull/6634>`_, Jason Dillaman)
-* rgw: init script reload doesn't work on EL7 (`issue#13709 <http://tracker.ceph.com/issues/13709>`_, `pr#6650 <http://github.com/ceph/ceph/pull/6650>`_, Hervé Rousseau)
-* rgw: radosgw-admin --help doesn't show the orphans find command (`issue#14516 <http://tracker.ceph.com/issues/14516>`_, `pr#7543 <http://github.com/ceph/ceph/pull/7543>`_, Yehuda Sadeh)
-* tests: ceph-disk workunit uses configobj (`issue#14004 <http://tracker.ceph.com/issues/14004>`_, `pr#6828 <http://github.com/ceph/ceph/pull/6828>`_, Loic Dachary)
-* tests: fsx failed to compile (`issue#14384 <http://tracker.ceph.com/issues/14384>`_, `pr#7429 <http://github.com/ceph/ceph/pull/7429>`_, Greg Farnum)
-* tests: notification slave needs to wait for master (`issue#13810 <http://tracker.ceph.com/issues/13810>`_, `pr#7225 <http://github.com/ceph/ceph/pull/7225>`_, Jason Dillaman)
-* tests: rebuild exclusive lock test should acquire exclusive lock (`issue#14121 <http://tracker.ceph.com/issues/14121>`_, `pr#7038 <http://github.com/ceph/ceph/pull/7038>`_, Jason Dillaman)
-* tests: testprofile must be removed before it is re-created (`issue#13664 <http://tracker.ceph.com/issues/13664>`_, `pr#6449 <http://github.com/ceph/ceph/pull/6449>`_, Loic Dachary)
-* tests: verify it is possible to reuse an OSD id (`issue#13988 <http://tracker.ceph.com/issues/13988>`_, `pr#6882 <http://github.com/ceph/ceph/pull/6882>`_, Loic Dachary)
-
-v9.2.0 Infernalis
-=================
-
-This major release will be the foundation for the next stable series.
-There have been some major changes since v0.94.x Hammer, and the
-upgrade process is non-trivial.  Please read these release notes carefully.
-
-Major Changes from Hammer
--------------------------
-
-- *General*:
-
-  * Ceph daemons are now managed via systemd (with the exception of
-    Ubuntu Trusty, which still uses upstart).
-  * Ceph daemons run as 'ceph' user instead root.
-  * On Red Hat distros, there is also an SELinux policy.
-
-- *RADOS*:
-
-  * The RADOS cache tier can now proxy write operations to the base
-    tier, allowing writes to be handled without forcing migration of
-    an object into the cache.
-  * The SHEC erasure coding support is no longer flagged as
-    experimental. SHEC trades some additional storage space for faster
-    repair.
-  * There is now a unified queue (and thus prioritization) of client
-    IO, recovery, scrubbing, and snapshot trimming.
-  * There have been many improvements to low-level repair tooling
-    (ceph-objectstore-tool).
-  * The internal ObjectStore API has been significantly cleaned up in order
-    to facilitate new storage backends like NewStore.
-
-- *RGW*:
-
-  * The Swift API now supports object expiration.
-  * There are many Swift API compatibility improvements.
-
-- *RBD*:
-
-  * The ``rbd du`` command shows actual usage (quickly, when
-    object-map is enabled).
-  * The object-map feature has seen many stability improvements.
-  * Object-map and exclusive-lock features can be enabled or disabled
-    dynamically.
-  * You can now store user metadata and set persistent librbd options
-    associated with individual images.
-  * The new deep-flatten features allows flattening of a clone and all
-    of its snapshots.  (Previously snapshots could not be flattened.)
-  * The export-diff command command is now faster (it uses aio).  There is also
-    a new fast-diff feature.
-  * The --size argument can be specified with a suffix for units
-    (e.g., ``--size 64G``).
-  * There is a new ``rbd status`` command that, for now, shows who has
-    the image open/mapped.
-
-- *CephFS*:
-
-  * You can now rename snapshots.
-  * There have been ongoing improvements around administration, diagnostics,
-    and the check and repair tools.
-  * The caching and revocation of client cache state due to unused
-    inodes has been dramatically improved.
-  * The ceph-fuse client behaves better on 32-bit hosts.
-
-Distro compatibility
---------------------
-
-We have decided to drop support for many older distributions so that we can
-move to a newer compiler toolchain (e.g., C++11).  Although it is still possible
-to build Ceph on older distributions by installing backported development tools,
-we are not building and publishing release packages for ceph.com.
-
-We now build packages for:
-
-* CentOS 7 or later.  We have dropped support for CentOS 6 (and other
-  RHEL 6 derivatives, like Scientific Linux 6).
-* Debian Jessie 8.x or later.  Debian Wheezy 7.x's g++ has incomplete
-  support for C++11 (and no systemd).
-* Ubuntu Trusty 14.04 or later.  Ubuntu Precise 12.04 is no longer
-  supported.
-* Fedora 22 or later.
-
-Upgrading from Firefly
-----------------------
-
-Upgrading directly from Firefly v0.80.z is not recommended.  It is
-possible to do a direct upgrade, but not without downtime.  We
-recommend that clusters are first upgraded to Hammer v0.94.4 or a
-later v0.94.z release; only then is it possible to upgrade to
-Infernalis 9.2.z for an online upgrade (see below).
-
-To do an offline upgrade directly from Firefly, all Firefly OSDs must
-be stopped and marked down before any Infernalis OSDs will be allowed
-to start up.  This fencing is enforced by the Infernalis monitor, so
-use an upgrade procedure like:
-
-#. Upgrade Ceph on monitor hosts
-#. Restart all ceph-mon daemons
-#. Upgrade Ceph on all OSD hosts
-#. Stop all ceph-osd daemons
-#. Mark all OSDs down with something like::
-
-     ceph osd down `seq 0 1000`
-
-#. Start all ceph-osd daemons
-#. Upgrade and restart remaining daemons (ceph-mds, radosgw)
-
-Upgrading from Hammer
----------------------
-
-* All cluster nodes must first upgrade to Hammer v0.94.4 or a later v0.94.z release; only
-  then is it possible to upgrade to Infernalis 9.2.z.
-
-* For all distributions that support systemd (CentOS 7, Fedora, Debian
-  Jessie 8.x, OpenSUSE), ceph daemons are now managed using native systemd
-  files instead of the legacy sysvinit scripts.  For example::
-
-    systemctl start ceph.target       # start all daemons
-    systemctl status ceph-osd@12      # check status of osd.12
-
-  The main notable distro that is *not* yet using systemd is Ubuntu trusty
-  14.04.  (The next Ubuntu LTS, 16.04, will use systemd instead of upstart.)
-
-* Ceph daemons now run as user and group ``ceph`` by default.  The
-  ceph user has a static UID assigned by Fedora and Debian (also used
-  by derivative distributions like RHEL/CentOS and Ubuntu).  On SUSE
-  the ceph user will currently get a dynamically assigned UID when the
-  user is created.
-
-  If your systems already have a ceph user, upgrading the package will cause
-  problems.  We suggest you first remove or rename the existing 'ceph' user
-  and 'ceph' group before upgrading.
-
-  When upgrading, administrators have two options:
-
-   #. Add the following line to ``ceph.conf`` on all hosts::
-
-        setuser match path = /var/lib/ceph/$type/$cluster-$id
-
-      This will make the Ceph daemons run as root (i.e., not drop
-      privileges and switch to user ceph) if the daemon's data
-      directory is still owned by root.  Newly deployed daemons will
-      be created with data owned by user ceph and will run with
-      reduced privileges, but upgraded daemons will continue to run as
-      root.
-
-   #. Fix the data ownership during the upgrade.  This is the
-      preferred option, but it is more work and can be very time
-      consuming.  The process for each host is to:
-
-   #. Upgrade the ceph package.  This creates the ceph user and group.  For
-      example::
-
-        ceph-deploy install --stable infernalis HOST
-
-      #. Stop the daemon(s)::
-
-           service ceph stop           # fedora, centos, rhel, debian
-           stop ceph-all               # ubuntu
-
-      #. Fix the ownership::
-
-           chown -R ceph:ceph /var/lib/ceph
-           chown -R ceph:ceph /var/log/ceph
-
-      #. Restart the daemon(s)::
-
-           start ceph-all                # ubuntu
-           systemctl start ceph.target   # debian, centos, fedora, rhel
-
-      Alternatively, the same process can be done with a single daemon
-      type, for example by stopping only monitors and chowning only
-      ``/var/lib/ceph/mon``.
-
-* The on-disk format for the experimental KeyValueStore OSD backend has
-  changed.  You will need to remove any OSDs using that backend before you
-  upgrade any test clusters that use it.
-
-* When a pool quota is reached, librados operations now block indefinitely,
-  the same way they do when the cluster fills up.  (Previously they would return
-  -ENOSPC).  By default, a full cluster or pool will now block.  If your
-  librados application can handle ENOSPC or EDQUOT errors gracefully, you can
-  get error returns instead by using the new librados OPERATION_FULL_TRY flag.
-
-* The return code for librbd's rbd_aio_read and Image::aio_read API methods no
-  longer returns the number of bytes read upon success.  Instead, it returns 0
-  upon success and a negative value upon failure.
-
-* 'ceph scrub', 'ceph compact' and 'ceph sync force are now DEPRECATED.  Users
-  should instead use 'ceph mon scrub', 'ceph mon compact' and
-  'ceph mon sync force'.
-
-* 'ceph mon_metadata' should now be used as 'ceph mon metadata'. There is no
-  need to deprecate this command (same major release since it was first
-  introduced).
-
-* The `--dump-json` option of "osdmaptool" is replaced by `--dump json`.
-
-* The commands of "pg ls-by-{pool,primary,osd}" and "pg ls" now take "recovering"
-  instead of "recovery", to include the recovering pgs in the listed pgs.
-
-Notable Changes since Hammer
-----------------------------
-
-* aarch64: add optimized version of crc32c (Yazen Ghannam, Steve Capper)
-* auth: cache/reuse crypto lib key objects, optimize msg signature check (Sage Weil)
-* auth: reinit NSS after fork() (#11128 Yan, Zheng)
-* autotools: fix out of tree build (Krxysztof Kosinski)
-* autotools: improve make check output (Loic Dachary)
-* buffer: add invalidate_crc() (Piotr Dalek)
-* buffer: fix zero bug (#12252 Haomai Wang)
-* buffer: some cleanup (Michal Jarzabek)
-* build: allow tcmalloc-minimal (Thorsten Behrens)
-* build: C++11 now supported
-* build: cmake: fix nss linking (Danny Al-Gaaf)
-* build: cmake: misc fixes (Orit Wasserman, Casey Bodley)
-* build: disable LTTNG by default (#11333 Josh Durgin)
-* build: do not build ceph-dencoder with tcmalloc (#10691 Boris Ranto)
-* build: fix junit detection on Fedora 22 (Ira Cooper)
-* build: fix pg ref disabling (William A. Kennington III)
-* build: fix ppc build (James Page)
-* build: install-deps: misc fixes (Loic Dachary)
-* build: install-deps.sh improvements (Loic Dachary)
-* build: install-deps: support OpenSUSE (Loic Dachary)
-* build: make_dist_tarball.sh (Sage Weil)
-* build: many cmake improvements
-* build: misc cmake fixes (Matt Benjamin)
-* build: misc fixes (Boris Ranto, Ken Dreyer, Owen Synge)
-* build: OSX build fixes (Yan, Zheng)
-* build: remove rest-bench
-* ceph-authtool: fix return code on error (Gerhard Muntingh)
-* ceph-detect-init: added Linux Mint (Michal Jarzabek)
-* ceph-detect-init: robust init system detection (Owen Synge)
-* ceph-disk: ensure 'zap' only operates on a full disk (#11272 Loic Dachary)
-* ceph-disk: fix zap sgdisk invocation (Owen Synge, Thorsten Behrens)
-* ceph-disk: follow ceph-osd hints when creating journal (#9580 Sage Weil)
-* ceph-disk: handle re-using existing partition (#10987 Loic Dachary)
-* ceph-disk: improve parted output parsing (#10983 Loic Dachary)
-* ceph-disk: install pip > 6.1 (#11952 Loic Dachary)
-* ceph-disk: make suppression work for activate-all and activate-journal (Dan van der Ster)
-* ceph-disk: many fixes (Loic Dachary, Alfredo Deza)
-* ceph-disk: fixes to respect init system (Loic Dachary, Owen Synge)
-* ceph-disk: pass --cluster arg on prepare subcommand (Kefu Chai)
-* ceph-disk: support for multipath devices (Loic Dachary)
-* ceph-disk: support NVMe device partitions (#11612 Ilja Slepnev)
-* ceph: fix 'df' units (Zhe Zhang)
-* ceph: fix parsing in interactive cli mode (#11279 Kefu Chai)
-* cephfs-data-scan: many additions, improvements (John Spray)
-* ceph-fuse: do not require successful remount when unmounting (#10982 Greg Farnum)
-* ceph-fuse, libcephfs: don't clear COMPLETE when trimming null (Yan, Zheng)
-* ceph-fuse, libcephfs: drop inode when rmdir finishes (#11339 Yan, Zheng)
-* ceph-fuse,libcephfs: fix uninline (#11356 Yan, Zheng)
-* ceph-fuse, libcephfs: hold exclusive caps on dirs we "own" (#11226 Greg Farnum)
-* ceph-fuse: mostly behave on 32-bit hosts (Yan, Zheng)
-* ceph: improve error output for 'tell' (#11101 Kefu Chai)
-* ceph-monstore-tool: fix store-copy (Huangjun)
-* ceph: new 'ceph daemonperf' command (John Spray, Mykola Golub)
-* ceph-objectstore-tool: many many improvements (David Zafman)
-* ceph-objectstore-tool: refactoring and cleanup (John Spray)
-* ceph-post-file: misc fixes (Joey McDonald, Sage Weil)
-* ceph_test_rados: test pipelined reads (Zhiqiang Wang)
-* client: avoid sending unnecessary FLUSHSNAP messages (Yan, Zheng)
-* client: exclude setfilelock when calculating oldest tid (Yan, Zheng)
-* client: fix error handling in check_pool_perm (John Spray)
-* client: fsync waits only for inode's caps to flush (Yan, Zheng)
-* client: invalidate kernel dcache when cache size exceeds limits (Yan, Zheng)
-* client: make fsync wait for unsafe dir operations (Yan, Zheng)
-* client: pin lookup dentry to avoid inode being freed (Yan, Zheng)
-* common: add descriptions to perfcounters (Kiseleva Alyona)
-* common: add perf counter descriptions (Alyona Kiseleva)
-* common: bufferlist performance tuning (Piotr Dalek, Sage Weil)
-* common: detect overflow of int config values (#11484 Kefu Chai)
-* common: fix bit_vector extent calc (#12611 Jason Dillaman)
-* common: fix json parsing of utf8 (#7387 Tim Serong)
-* common: fix leak of pthread_mutexattr (#11762 Ketor Meng)
-* common: fix LTTNG vs fork issue (Josh Durgin)
-* common: fix throttle max change (Henry Chang)
-* common: make mutex more efficient
-* common: make work queue addition/removal thread safe (#12662 Jason Dillaman)
-* common: optracker improvements (Zhiqiang Wang, Jianpeng Ma)
-* common: PriorityQueue tests (Kefu Chai)
-* common: some async compression infrastructure (Haomai Wang)
-* crush: add --check to validate dangling names, max osd id (Kefu Chai)
-* crush: cleanup, sync with kernel (Ilya Dryomov)
-* crush: fix crash from invalid 'take' argument (#11602 Shiva Rkreddy, Sage Weil)
-* crush: fix divide-by-2 in straw2 (#11357 Yann Dupont, Sage Weil)
-* crush: fix has_v4_buckets (#11364 Sage Weil)
-* crush: fix subtree base weight on adjust_subtree_weight (#11855 Sage Weil)
-* crush: respect default replicated ruleset config on map creation (Ilya Dryomov)
-* crushtool: fix order of operations, usage (Sage Weil)
-* crypto: fix NSS leak (Jason Dillaman)
-* crypto: fix unbalanced init/shutdown (#12598 Zheng Yan)
-* deb: fix rest-bench-dbg and ceph-test-dbg dependendies (Ken Dreyer)
-* debian: minor package reorg (Ken Dreyer)
-* deb, rpm: move ceph-objectstore-tool to ceph (Ken Dreyer)
-* doc: docuemnt object corpus generation (#11099 Alexis Normand)
-* doc: document region hostnames (Robin H. Johnson)
-* doc: fix gender neutrality (Alexandre Maragone)
-* doc: fix install doc (#10957 Kefu Chai)
-* doc: fix sphinx issues (Kefu Chai)
-* doc: man page updates (Kefu Chai)
-* doc: mds data structure docs (Yan, Zheng)
-* doc: misc updates (Fracois Lafont, Ken Dreyer, Kefu Chai, Owen Synge, Gael Fenet-Garde, Loic Dachary, Yannick Atchy-Dalama, Jiaying Ren, Kevin Caradant, Robert Maxime, Nicolas Yong, Germain Chipaux, Arthur Gorjux, Gabriel Sentucq, Clement Lebrun, Jean-Remi Deveaux, Clair Massot, Robin Tang, Thomas Laumondais, Jordan Dorne, Yuan Zhou, Valentin Thomas, Pierre Chaumont, Benjamin Troquereau, Benjamin Sesia, Vikhyat Umrao, Nilamdyuti Goswami, Vartika Rai, Florian Haas, Loic Dachary, Simon Guinot, Andy Allan, Alistair Israel, Ken Dreyer, Robin Rehu, Lee Revell, Florian Marsylle, Thomas Johnson, Bosse Klykken, Travis Rhoden, Ian Kelling)
-* doc: swift tempurls (#10184 Abhishek Lekshmanan)
-* doc: switch doxygen integration back to breathe (#6115 Kefu Chai)
-* doc: update release schedule docs (Loic Dachary)
-* erasure-code: cleanup (Kefu Chai)
-* erasure-code: improve tests (Loic Dachary)
-* erasure-code: shec: fix recovery bugs (Takanori Nakao, Shotaro Kawaguchi)
-* erasure-code: update ISA-L to 2.13 (Yuan Zhou)
-* gmock: switch to submodule (Danny Al-Gaaf, Loic Dachary)
-* hadoop: add terasort test (Noah Watkins)
-* init-radosgw: merge with sysv version; fix enumeration (Sage Weil)
-* java: fix libcephfs bindings (Noah Watkins)
-* libcephfs: add pread, pwrite (Jevon Qiao)
-* libcephfs,ceph-fuse: cache cleanup (Zheng Yan)
-* libcephfs,ceph-fuse: fix request resend on cap reconnect (#10912 Yan, Zheng)
-* librados: add config observer (Alistair Strachan)
-* librados: add FULL_TRY and FULL_FORCE flags for dealing with full clusters or pools (Sage Weil)
-* librados: add src_fadvise_flags for copy-from (Jianpeng Ma)
-* librados: define C++ flags from C constants (Josh Durgin)
-* librados: fadvise flags per op (Jianpeng Ma)
-* librados: fix last_force_resent handling (#11026 Jianpeng Ma)
-* librados: fix memory leak from C_TwoContexts (Xiong Yiliang)
-* librados: fix notify completion race (#13114 Sage Weil)
-* librados: fix striper when stripe_count = 1 and stripe_unit != object_size (#11120 Yan, Zheng)
-* librados, libcephfs: randomize client nonces (Josh Durgin)
-* librados: op perf counters (John Spray)
-* librados: pybind: fix binary omap values (Robin H. Johnson)
-* librados: pybind: fix write() method return code (Javier Guerra)
-* librados: respect default_crush_ruleset on pool_create (#11640 Yuan Zhou)
-* libradosstriper: fix leak (Danny Al-Gaaf)
-* librbd: add const for single-client-only features (Josh Durgin)
-* librbd: add deep-flatten operation (Jason Dillaman)
-* librbd: add purge_on_error cache behavior (Jianpeng Ma)
-* librbd: allow additional metadata to be stored with the image (Haomai Wang)
-* librbd: avoid blocking aio API methods (#11056 Jason Dillaman)
-* librbd: better handling for dup flatten requests (#11370 Jason Dillaman)
-* librbd: cancel in-flight ops on watch error (#11363 Jason Dillaman)
-* librbd: default new images to format 2 (#11348 Jason Dillaman)
-* librbd: fadvise for copy, export, import (Jianpeng Ma)
-* librbd: fast diff implementation that leverages object map (Jason Dillaman)
-* librbd: fix fast diff bugs (#11553 Jason Dillaman)
-* librbd: fix image format detection (Zhiqiang Wang)
-* librbd: fix lock ordering issue (#11577 Jason Dillaman)
-* librbd: fix reads larger than the cache size (Lu Shi)
-* librbd: fix snapshot creation when other snap is active (#11475 Jason Dillaman)
-* librbd: flatten/copyup fixes (Jason Dillaman)
-* librbd: handle NOCACHE fadvise flag (Jinapeng Ma)
-* librbd: lockdep, helgrind validation (Jason Dillaman, Josh Durgin)
-* librbd: metadata filter fixes (Haomai Wang)
-* librbd: misc aio fixes (#5488 Jason Dillaman)
-* librbd: misc rbd fixes (#11478 #11113 #11342 #11380 Jason Dillaman, Zhiqiang Wang)
-* librbd: new diff_iterate2 API (Jason Dillaman)
-* librbd: object map rebuild support (Jason Dillaman)
-* librbd: only update image flags while hold exclusive lock (#11791 Jason Dillaman)
-* librbd: optionally disable allocation hint (Haomai Wang)
-* librbd: prevent race between resize requests (#12664 Jason Dillaman)
-* librbd: readahead fixes (Zhiqiang Wang)
-* librbd: return result code from close (#12069 Jason Dillaman)
-* librbd: store metadata, including config options, in image (Haomai Wang)
-* librbd: tolerate old osds when getting image metadata (#11549 Jason Dillaman)
-* librbd: use write_full when possible (Zhiqiang Wang)
-* log: fix data corruption race resulting from log rotation (#12465 Samuel Just)
-* logrotate.d: prefer service over invoke-rc.d (#11330 Win Hierman, Sage Weil)
-* mds: add 'damaged' state to MDSMap (John Spray)
-* mds: add nicknames for perfcounters (John Spray)
-* mds: avoid emitting cap warnigns before evicting session (John Spray)
-* mds: avoid getting stuck in XLOCKDONE (#11254 Yan, Zheng)
-* mds: disable problematic rstat propagation into snap parents (Yan, Zheng)
-* mds: do not add snapped items to bloom filter (Yan, Zheng)
-* mds: expose frags via asok (John Spray)
-* mds: fix expected holes in journal objects (#13167 Yan, Zheng)
-* mds: fix handling for missing mydir dirfrag (#11641 John Spray)
-* mds: fix integer truncateion on large client ids (Henry Chang)
-* mds: fix mydir replica issue with shutdown (#10743 John Spray)
-* mds: fix out-of-order messages (#11258 Yan, Zheng)
-* mds: fix rejoin (Yan, Zheng)
-* mds: fix setting entire file layout in one setxattr (John Spray)
-* mds: fix shutdown (John Spray)
-* mds: fix shutdown with strays (#10744 John Spray)
-* mds: fix SnapServer crash on deleted pool (John Spray)
-* mds: fix snapshot bugs (Yan, Zheng)
-* mds: fix stray reintegration (Yan, Zheng)
-* mds: fix stray handling (John Spray)
-* mds: fix suicide beacon (John Spray)
-* mds: flush immediately in do_open_truncate (#11011 John Spray)
-* mds: handle misc corruption issues (John Spray)
-* mds: improve dump methods (John Spray)
-* mds: many fixes (Yan, Zheng, John Spray, Greg Farnum)
-* mds: many snapshot and stray fixes (Yan, Zheng)
-* mds: misc fixes (Jianpeng Ma, Dan van der Ster, Zhang Zhi)
-* mds: misc journal cleanups and fixes (#10368 John Spray)
-* mds: misc repair improvements (John Spray)
-* mds: misc snap fixes (Zheng Yan)
-* mds: misc snapshot fixes (Yan, Zheng)
-* mds: new SessionMap storage using omap (#10649 John Spray)
-* mds: persist completed_requests reliably (#11048 John Spray)
-* mds: reduce memory consumption (Yan, Zheng)
-* mds: respawn instead of suicide on blacklist (John Spray)
-* mds: separate safe_pos in Journaler (#10368 John Spray)
-* mds: snapshot rename support (#3645 Yan, Zheng)
-* mds: store layout on header object (#4161 John Spray)
-* mds: throttle purge stray operations (#10390 John Spray)
-* mds: tolerate clock jumping backwards (#11053 Yan, Zheng)
-* mds: warn when clients fail to advance oldest_client_tid (#10657 Yan, Zheng)
-* misc cleanups and fixes (Danny Al-Gaaf)
-* misc coverity fixes (Danny Al-Gaaf)
-* misc performance and cleanup (Nathan Cutler, Xinxin Shu)
-* mon: add cache over MonitorDBStore (Kefu Chai)
-* mon: add 'mon_metadata <id>' command (Kefu Chai)
-* mon: add 'node ls ...' command (Kefu Chai)
-* mon: add NOFORWARD, OBSOLETE, DEPRECATE flags for mon commands (Joao Eduardo Luis)
-* mon: add PG count to 'ceph osd df' output (Michal Jarzabek)
-* mon: 'ceph osd metadata' can dump all osds (Haomai Wang)
-* mon: clean up, reorg some mon commands (Joao Eduardo Luis)
-* monclient: flush_log (John Spray)
-* mon: detect kv backend failures (Sage Weil)
-* mon: disallow >2 tiers (#11840 Kefu Chai)
-* mon: disallow ec pools as tiers (#11650 Samuel Just)
-* mon: do not deactivate last mds (#10862 John Spray)
-* mon: fix average utilization calc for 'osd df' (Mykola Golub)
-* mon: fix CRUSH map test for new pools (Sage Weil)
-* mon: fix log dump crash when debugging (Mykola Golub)
-* mon: fix mds beacon replies (#11590 Kefu Chai)
-* mon: fix metadata update race (Mykola Golub)
-* mon: fix min_last_epoch_clean tracking (Kefu Chai)
-* mon: fix 'pg ls' sort order, state names (#11569 Kefu Chai)
-* mon: fix refresh (#11470 Joao Eduardo Luis)
-* mon: fix variance calc in 'osd df' (Sage Weil)
-* mon: improve callout to crushtool (Mykola Golub)
-* mon: make blocked op messages more readable (Jianpeng Ma)
-* mon: make osd get pool 'all' only return applicable fields (#10891 Michal Jarzabek)
-* mon: misc scaling fixes (Sage Weil)
-* mon: normalize erasure-code profile for storage and comparison (Loic Dachary)
-* mon: only send mon metadata to supporting peers (Sage Weil)
-* mon: optionally specify osd id on 'osd create' (Mykola Golub)
-* mon: 'osd tree' fixes (Kefu Chai)
-* mon: periodic background scrub (Joao Eduardo Luis)
-* mon: prevent bucket deletion when referenced by a crush rule (#11602 Sage Weil)
-* mon: prevent pgp_num > pg_num (#12025 Xinxin Shu)
-* mon: prevent pool with snapshot state from being used as a tier (#11493 Sage Weil)
-* mon: prime pg_temp when CRUSH map changes (Sage Weil)
-* mon: refine check_remove_tier checks (#11504 John Spray)
-* mon: reject large max_mds values (#12222 John Spray)
-* mon: remove spurious who arg from 'mds rm ...' (John Spray)
-* mon: streamline session handling, fix memory leaks (Sage Weil)
-* mon: upgrades must pass through hammer (Sage Weil)
-* mon: warn on bogus cache tier config (Jianpeng Ma)
-* msgr: add ceph_perf_msgr tool (Hoamai Wang)
-* msgr: async: fix seq handling (Haomai Wang)
-* msgr: async: many many fixes (Haomai Wang)
-* msgr: simple: fix clear_pipe (#11381 Haomai Wang)
-* msgr: simple: fix connect_seq assert (Haomai Wang)
-* msgr: xio: fastpath improvements (Raju Kurunkad)
-* msgr: xio: fix ip and nonce (Raju Kurunkad)
-* msgr: xio: improve lane assignment (Vu Pham)
-* msgr: xio: sync with accellio v1.4 (Vu Pham)
-* msgr: xio: misc fixes (#10735 Matt Benjamin, Kefu Chai, Danny Al-Gaaf, Raju Kurunkad, Vu Pham, Casey Bodley)
-* msg: unit tests (Haomai Wang)
-* objectcacher: misc bug fixes (Jianpeng Ma)
-* osd: add latency perf counters for tier operations (Xinze Chi)
-* osd: add misc perfcounters (Xinze Chi)
-* osd: add simple sleep injection in recovery (Sage Weil)
-* osd: allow SEEK_HOLE/SEEK_DATA for sparse read (Zhiqiang Wang)
-* osd: avoid dup omap sets for in pg metadata (Sage Weil)
-* osd: avoid multiple hit set insertions (Zhiqiang Wang)
-* osd: avoid transaction append in some cases (Sage Weil)
-* osd: break PG removal into multiple iterations (#10198 Guang Yang)
-* osd: cache proxy-write support (Zhiqiang Wang, Samuel Just)
-* osd: check scrub state when handling map (Jianpeng Ma)
-* osd: clean up some constness, privateness (Kefu Chai)
-* osd: clean up temp object if promotion fails (Jianpeng Ma)
-* osd: configure promotion based on write recency (Zhiqiang Wang)
-* osd: constrain collections to meta and PGs (normal and temp) (Sage Weil)
-* osd: don't send dup MMonGetOSDMap requests (Sage Weil, Kefu Chai)
-* osd: EIO injection (David Zhang)
-* osd: elminiate txn apend, ECSubWrite copy (Samuel Just)
-* osd: erasure-code: drop entries according to LRU (Andreas-Joachim Peters)
-* osd: erasure-code: fix SHEC floating point bug (#12936 Loic Dachary)
-* osd: erasure-code: update to ISA-L 2.14 (Yuan Zhou)
-* osd: filejournal: cleanup (David Zafman)
-* osd: filestore: clone using splice (Jianpeng Ma)
-* osd: filestore: fix recursive lock (Xinxin Shu)
-* osd: fix check_for_full (Henry Chang)
-* osd: fix dirty accounting in make_writeable (Zhiqiang Wang)
-* osd: fix dup promotion lost op bug (Zhiqiang Wang)
-* osd: fix endless repair when object is unrecoverable (Jianpeng Ma, Kefu Chai)
-* osd: fix hitset object naming to use GMT (Kefu Chai)
-* osd: fix misc memory leaks (Sage Weil)
-* osd: fix negative degraded stats during backfill (Guang Yang)
-* osd: fix osdmap dump of blacklist items (John Spray)
-* osd: fix peek_queue locking in FileStore (Xinze Chi)
-* osd: fix pg resurrection (#11429 Samuel Just)
-* osd: fix promotion vs full cache tier (Samuel Just)
-* osd: fix replay requeue when pg is still activating (#13116 Samuel Just)
-* osd: fix scrub stat bugs (Sage Weil, Samuel Just)
-* osd: fix snap flushing from cache tier (again) (#11787 Samuel Just)
-* osd: fix snap handling on promotion (#11296 Sam Just)
-* osd: fix temp-clearing (David Zafman)
-* osd: force promotion for ops EC can't handle (Zhiqiang Wang)
-* osd: handle log split with overlapping entries (#11358 Samuel Just)
-* osd: ignore non-existent osds in unfound calc (#10976 Mykola Golub)
-* osd: improve behavior on machines with large memory pages (Steve Capper)
-* osd: include a temp namespace within each collection/pgid (Sage Weil)
-* osd: increase default max open files (Owen Synge)
-* osd: keyvaluestore: misc fixes (Varada Kari)
-* osd: low and high speed flush modes (Mingxin Liu)
-* osd: make suicide timeouts individually configurable (Samuel Just)
-* osd: merge multiple setattr calls into a setattrs call (Xinxin Shu)
-* osd: misc fixes (Ning Yao, Kefu Chai, Xinze Chi, Zhiqiang Wang, Jianpeng Ma)
-* osd: move scrub in OpWQ (Samuel Just)
-* osd: newstore prototype (Sage Weil)
-* osd: ObjectStore internal API refactor (Sage Weil)
-* osd: peer_features includes self (David Zafman)
-* osd: pool size change triggers new interval (#11771 Samuel Just)
-* osd: prepopulate needs_recovery_map when only one peer has missing (#9558 Guang Yang)
-* osd: randomize scrub times (#10973 Kefu Chai)
-* osd: recovery, peering fixes (#11687 Samuel Just)
-* osd: refactor scrub and digest recording (Sage Weil)
-* osd: refuse first write to EC object at non-zero offset (Jianpeng Ma)
-* osd: relax reply order on proxy read (#11211 Zhiqiang Wang)
-* osd: require firefly features (David Zafman)
-* osd: set initial crush weight with more precision (Sage Weil)
-* osd: SHEC no longer experimental
-* osd: skip promotion for flush/evict op (Zhiqiang Wang)
-* osd: stripe over small xattrs to fit in XFS's 255 byte inline limit (Sage Weil, Ning Yao)
-* osd: sync object_map on syncfs (Samuel Just)
-* osd: take excl lock of op is rw (Samuel Just)
-* osd: throttle evict ops (Yunchuan Wen)
-* osd: upgrades must pass through hammer (Sage Weil)
-* osd: use a temp object for recovery (Sage Weil)
-* osd: use blkid to collection partition information (Joseph Handzik)
-* osd: use SEEK_HOLE / SEEK_DATA for sparse copy (Xinxin Shu)
-* osd: WBThrottle cleanups (Jianpeng Ma)
-* osd: write journal header on clean shutdown (Xinze Chi)
-* osdc/Objecter: allow per-pool calls to op_cancel_writes (John Spray)
-* os/filestore: enlarge getxattr buffer size (Jianpeng Ma)
-* pybind: pep8 cleanups (Danny Al-Gaaf)
-* pycephfs: many fixes for bindings (Haomai Wang)
-* qa: fix filelock_interrupt.py test (Yan, Zheng)
-* qa: improve ceph-disk tests (Loic Dachary)
-* qa: improve docker build layers (Loic Dachary)
-* qa: run-make-check.sh script (Loic Dachary)
-* rados: add --striper option to use libradosstriper (#10759 Sebastien Ponce)
-* rados: bench: add --no-verify option to improve performance (Piotr Dalek)
-* rados bench: misc fixes (Dmitry Yatsushkevich)
-* rados: fix error message on failed pool removal (Wido den Hollander)
-* radosgw-admin: add 'bucket check' function to repair bucket index (Yehuda Sadeh)
-* radosgw-admin: fix subuser modify output (#12286 Guce)
-* rados: handle --snapid arg properly (Abhishek Lekshmanan)
-* rados: improve bench buffer handling, performance (Piotr Dalek)
-* rados: misc bench fixes (Dmitry Yatsushkevich)
-* rados: new pool import implementation (John Spray)
-* rados: translate errno to string in CLI (#10877 Kefu Chai)
-* rbd: accept map options config option (Ilya Dryomov)
-* rbd: add disk usage tool (#7746 Jason Dillaman)
-* rbd: allow unmapping by spec (Ilya Dryomov)
-* rbd: cli: fix arg parsing with --io-pattern (Dmitry Yatsushkevich)
-* rbd: deprecate --new-format option (Jason Dillman)
-* rbd: fix error messages (#2862 Rajesh Nambiar)
-* rbd: fix link issues (Jason Dillaman)
-* rbd: improve CLI arg parsing, usage (Ilya Dryomov)
-* rbd: rbd-replay-prep and rbd-replay improvements (Jason Dillaman)
-* rbd: recognize queue_depth kernel option (Ilya Dryomov)
-* rbd: support G and T units for CLI (Abhishek Lekshmanan)
-* rbd: update rbd man page (Ilya Dryomov)
-* rbd: update xfstests tests (Douglas Fuller)
-* rbd: use image-spec and snap-spec in help (Vikhyat Umrao, Ilya Dryomov)
-* rest-bench: misc fixes (Shawn Chen)
-* rest-bench: support https (#3968 Yuan Zhou)
-* rgw: add max multipart upload parts (#12146 Abshishek Dixit)
-* rgw: add missing headers to Swift container details (#10666 Ahmad Faheem, Dmytro Iurchenko)
-* rgw: add stats to headers for account GET (#10684 Yuan Zhou)
-* rgw: add Trasnaction-Id to response (Abhishek Dixit)
-* rgw: add X-Timestamp for Swift containers (#10938 Radoslaw Zarzynski)
-* rgw: always check if token is expired (#11367 Anton Aksola, Riku Lehto)
-* rgw: conversion tool to repair broken multipart objects (#12079 Yehuda Sadeh)
-* rgw: document layout of pools and objects (Pete Zaitcev)
-* rgw: do not enclose bucket header in quotes (#11860 Wido den Hollander)
-* rgw: do not prefetch data for HEAD requests (Guang Yang)
-* rgw: do not preserve ACLs when copying object (#12370 Yehuda Sadeh)
-* rgw: do not set content-type if length is 0 (#11091 Orit Wasserman)
-* rgw: don't clobber bucket/object owner when setting ACLs (#10978 Yehuda Sadeh)
-* rgw: don't use end_marker for namespaced object listing (#11437 Yehuda Sadeh)
-* rgw: don't use rgw_socket_path if frontend is configured (#11160 Yehuda Sadeh)
-* rgw: enforce Content-Length for POST on Swift cont/obj (#10661 Radoslaw Zarzynski)
-* rgw: error out if frontend did not send all data (#11851 Yehuda Sadeh)
-* rgw: expose the number of unhealthy workers through admin socket (Guang Yang)
-* rgw: fail if parts not specified on multipart upload (#11435 Yehuda Sadeh)
-* rgw: fix assignment of copy obj attributes (#11563 Yehuda Sadeh)
-* rgw: fix broken stats in container listing (#11285 Radoslaw Zarzynski)
-* rgw: fix bug in domain/subdomain splitting (Robin H. Johnson)
-* rgw: fix casing of Content-Type header (Robin H. Johnson)
-* rgw: fix civetweb max threads (#10243 Yehuda Sadeh)
-* rgw: fix Connection: header handling (#12298 Wido den Hollander)
-* rgw: fix copy metadata, support X-Copied-From for swift (#10663 Radoslaw Zarzynski)
-* rgw: fix data corruptions race condition (#11749 Wuxingyi)
-* rgw: fix decoding of X-Object-Manifest from GET on Swift DLO (Radslow Rzarzynski)
-* rgw: fix GET on swift account when limit == 0 (#10683 Radoslaw Zarzynski)
-* rgw: fix handling empty metadata items on Swift container (#11088 Radoslaw Zarzynski)
-* rgw: fix JSON response when getting user quota (#12117 Wuxingyi)
-* rgw: fix locator for objects starting with _ (#11442 Yehuda Sadeh)
-* rgw: fix log rotation (Wuxingyi)
-* rgw: fix mulitipart upload in retry path (#11604 Yehuda Sadeh)
-* rgw: fix quota enforcement on POST (#11323 Sergey Arkhipov)
-* rgw: fix reset_loc (#11974 Yehuda Sadeh)
-* rgw: fix return code on missing upload (#11436 Yehuda Sadeh)
-* rgw: fix sysvinit script
-* rgw: fix sysvinit script w/ multiple instances (Sage Weil, Pavan Rallabhandi)
-* rgw: force content_type for swift bucket stats requests (#12095 Orit Wasserman)
-* rgw: force content type header on responses with no body (#11438 Orit Wasserman)
-* rgw: generate Date header for civetweb (#10873 Radoslaw Zarzynski)
-* rgw: generate new object tag when setting attrs (#11256 Yehuda Sadeh)
-* rgw: improve content-length env var handling (#11419 Robin H. Johnson)
-* rgw: improved support for swift account metadata (Radoslaw Zarzynski)
-* rgw: improve handling of already removed buckets in expirer (Radoslaw Rzarzynski)
-* rgw: issue aio for first chunk before flush cached data (#11322 Guang Yang)
-* rgw: log to /var/log/ceph instead of /var/log/radosgw
-* rgw: make init script wait for radosgw to stop (#11140 Dmitry Yatsushkevich)
-* rgw: make max put size configurable (#6999 Yuan Zhou)
-* rgw: make quota/gc threads configurable (#11047 Guang Yang)
-* rgw: make read user buckets backward compat (#10683 Radoslaw Zarzynski)
-* rgw: merge manifests properly with prefix override (#11622 Yehuda Sadeh)
-* rgw: only scan for objects not in a namespace (#11984 Yehuda Sadeh)
-* rgw: orphan detection tool (Yehuda Sadeh)
-* rgw: pass in civetweb configurables (#10907 Yehuda Sadeh)
-* rgw: rectify 202 Accepted in PUT response (#11148 Radoslaw Zarzynski)
-* rgw: remove meta file after deleting bucket (#11149 Orit Wasserman)
-* rgw: remove trailing :port from HTTP_HOST header (Sage Weil)
-* rgw: return 412 on bad limit when listing buckets (#11613 Yehuda Sadeh)
-* rgw: rework X-Trans-Id header to conform with Swift API (Radoslaw Rzarzynski)
-* rgw: s3 encoding-type for get bucket (Jeff Weber)
-* rgw: send ETag, Last-Modified for swift (#11087 Radoslaw Zarzynski)
-* rgw: set content length on container GET, PUT, DELETE, HEAD (#10971, #11036 Radoslaw Zarzynski)
-* rgw: set max buckets per user in ceph.conf (Vikhyat Umrao)
-* rgw: shard work over multiple librados instances (Pavan Rallabhandi)
-* rgw: support end marker on swift container GET (#10682 Radoslaw Zarzynski)
-* rgw: support for Swift expiration API (Radoslaw Rzarzynski, Yehuda Sadeh)
-* rgw: swift: allow setting attributes with COPY (#10662 Ahmad Faheem, Dmytro Iurchenko)
-* rgw: swift: do not override sent content type (#12363 Orit Wasserman)
-* rgw: swift: enforce Content-Type in response (#12157 Radoslaw Zarzynski)
-* rgw: swift: fix account listing (#11501 Radoslaw Zarzynski)
-* rgw: swift: fix metadata handling on copy (#10645 Radoslaw Zarzynski)
-* rgw: swift: send Last-Modified header (#10650 Radoslaw Zarzynski)
-* rgw: swift: set Content-Length for account GET (#12158 Radoslav Zarzynski)
-* rgw: swift: set content-length on keystone tokens (#11473 Herv Rousseau)
-* rgw: update keystone cache with token info (#11125 Yehuda Sadeh)
-* rgw: update to latest civetweb, enable config for IPv6 (#10965 Yehuda Sadeh)
-* rgw: use attrs from source bucket on copy (#11639 Javier M. Mellid)
-* rgw: use correct oid for gc chains (#11447 Yehuda Sadeh)
-* rgw: user rm is idempotent (Orit Wasserman)
-* rgw: use unique request id for civetweb (#10295 Orit Wasserman)
-* rocksdb: add perf counters for get/put latency (Xinxin Shu)
-* rocksdb, leveldb: fix compact_on_mount (Xiaoxi Chen)
-* rocksdb: pass options as single string (Xiaoxi Chen)
-* rocksdb: update to latest (Xiaoxi Chen)
-* rpm: add suse firewall files (Tim Serong)
-* rpm: always rebuild and install man pages for rpm (Owen Synge)
-* rpm: loosen ceph-test dependencies (Ken Dreyer)
-* rpm: many spec file fixes (Owen Synge, Ken Dreyer)
-* rpm: misc fixes (Boris Ranto, Owen Synge, Ken Dreyer, Ira Cooper)
-* rpm: misc systemd and SUSE fixes (Owen Synge, Nathan Cutler)
-* selinux policy (Boris Ranto, Milan Broz)
-* systemd: logrotate fixes (Tim Serong, Lars Marowsky-Bree, Nathan Cutler)
-* systemd: many fixes (Sage Weil, Owen Synge, Boris Ranto, Dan van der Ster)
-* systemd: run daemons as user ceph
-* sysvinit compat: misc fixes (Owen Synge)
-* test: misc fs test improvements (John Spray, Loic Dachary)
-* test: python tests, linter cleanup (Alfredo Deza)
-* tests: fixes for rbd xstests (Douglas Fuller)
-* tests: fix tiering health checks (Loic Dachary)
-* tests for low-level performance (Haomai Wang)
-* tests: many ec non-regression improvements (Loic Dachary)
-* tests: many many ec test improvements (Loic Dachary)
-* upstart: throttle restarts (#11798 Sage Weil, Greg Farnum)
-
-
-v9.1.0 Infernalis release candidate
-===================================
-
-This is the first Infernalis release candidate.  There have been some
-major changes since Hammer, and the upgrade process is non-trivial.
-Please read carefully.
-
-Getting the release candidate
------------------------------
-
-The v9.1.0 packages are pushed to the development release repositories::
-
-  http://download.ceph.com/rpm-testing
-  http://download.ceph.com/debian-testing
-
-For for info, see::
-
-  http://docs.ceph.com/docs/master/install/get-packages/
-
-Or install with ceph-deploy via::
-
-  ceph-deploy install --testing HOST
-
-
-Known issues
-------------
-
-* librbd and librados ABI compatibility is broken.  Be careful
-  installing this RC on client machines (e.g., those running qemu).
-  It will be fixed in the final v9.2.0 release.
-
-
-Major Changes from Hammer
--------------------------
-
-- *General*:
-
-  * Ceph daemons are now managed via systemd (with the exception of
-    Ubuntu Trusty, which still uses upstart).
-  * Ceph daemons run as 'ceph' user instead of root.
-  * On Red Hat distros, there is also an SELinux policy.
-
-- *RADOS*:
-
-  * The RADOS cache tier can now proxy write operations to the base
-    tier, allowing writes to be handled without forcing migration of
-    an object into the cache.
-  * The SHEC erasure coding support is no longer flagged as
-    experimental. SHEC trades some additional storage space for faster
-    repair.
-  * There is now a unified queue (and thus prioritization) of client
-    IO, scrubbing, and snapshot trimming.
-  * There have been many improvements to low-level repair tooling
-    (ceph-objectstore-tool).
-  * The internal ObjectStore API has been significantly cleaned up in order
-    to facilitate new storage backends like NewStore.
-
-- *RGW*:
-
-  * The Swift API now supports object expiration.
-  * There are many Swift API compatibility improvements.
-
-- *RBD*:
-
-  * The ``rbd du`` command shows actual usage (quickly, when
-    object-map is enabled).
-  * The object-map feature has seen many stability improvements.
-  * Object-map and exclusive-lock features can be enabled or disabled
-    dynamically.
-  * You can now store user metadata and set persistent librbd options
-    associated with individual images.
-  * The new deep-flatten features allows flattening of a clone and all
-    of its snapshots.  (Previously snapshots could not be flattened.)
-  * The export-diff command command is now faster (it uses aio).  There is also
-    a new fast-diff feature.
-  * The --size argument can be specified with a suffix for units
-    (e.g., ``--size 64G``).
-  * There is a new ``rbd status`` command that, for now, shows who has
-    the image open/mapped.
-
-- *CephFS*:
-
-  * You can now rename snapshots.
-  * There have been ongoing improvements around administration, diagnostics,
-    and the check and repair tools.
-  * The caching and revocation of client cache state due to unused
-    inodes has been dramatically improved.
-  * The ceph-fuse client behaves better on 32-bit hosts.
-
-Distro compatibility
---------------------
-
-We have decided to drop support for many older distributions so that we can
-move to a newer compiler toolchain (e.g., C++11).  Although it is still possible
-to build Ceph on older distributions by installing backported development tools,
-we are not building and publishing release packages for them on ceph.com.
-
-In particular,
-
-* CentOS 7 or later; we have dropped support for CentOS 6 (and other
-  RHEL 6 derivatives, like Scientific Linux 6).
-* Debian Jessie 8.x or later; Debian Wheezy 7.x's g++ has incomplete
-  support for C++11 (and no systemd).
-* Ubuntu Trusty 14.04 or later; Ubuntu Precise 12.04 is no longer
-  supported.
-* Fedora 22 or later.
-
-Upgrading from Firefly
-----------------------
-
-Upgrading directly from Firefly v0.80.z is not possible.  All clusters
-must first upgrade to Hammer v0.94.4 or a later v0.94.z release; only
-then is it possible to do online upgrade to Infernalis 9.2.z.
-
-User can upgrade to latest hammer v0.94.z
-from gitbuilder with(also refer the hammer release notes for more details)::
-
-  ceph-deploy install --release hammer HOST
-
-
-Upgrading from Hammer
----------------------
-
-* All cluster nodes must first upgrade to Hammer v0.94.4 or a later v0.94.z release; only
-  then is it possible to do online upgrade to Infernalis 9.2.z.
-
-* For all distributions that support systemd (CentOS 7, Fedora, Debian
-  Jessie 8.x, OpenSUSE), ceph daemons are now managed using native systemd
-  files instead of the legacy sysvinit scripts.  For example::
-
-    systemctl start ceph.target       # start all daemons
-    systemctl status ceph-osd@12      # check status of osd.12
-
-  The main notable distro that is *not* yet using systemd is Ubuntu trusty
-  14.04.  (The next Ubuntu LTS, 16.04, will use systemd instead of upstart.)
-
-* Ceph daemons now run as user and group ``ceph`` by default.  The
-  ceph user has a static UID assigned by Fedora and Debian (also used
-  by derivative distributions like RHEL/CentOS and Ubuntu).  On SUSE
-  the ceph user will currently get a dynamically assigned UID when the
-  user is created.
-
-  If your systems already have a ceph user, the package upgrade
-  process will usually fail with an error.  We suggest you first
-  remove or rename the existing 'ceph' user and then upgrade.
-
-  When upgrading, administrators have two options:
-
-   #. Add the following line to ``ceph.conf`` on all hosts::
-
-        setuser match path = /var/lib/ceph/$type/$cluster-$id
-
-      This will make the Ceph daemons run as root (i.e., not drop
-      privileges and switch to user ceph) if the daemon's data
-      directory is still owned by root.  Newly deployed daemons will
-      be created with data owned by user ceph and will run with
-      reduced privileges, but upgraded daemons will continue to run as
-      root.
-
-   #. Fix the data ownership during the upgrade.  This is the preferred option,
-      but is more work.  The process for each host would be to:
-
-      #. Upgrade the ceph package.  This creates the ceph user and group.  For
-         example::
-
-           ceph-deploy install --stable infernalis HOST
-
-      #. Stop the daemon(s)::
-
-           service ceph stop           # fedora, centos, rhel, debian
-           stop ceph-all               # ubuntu
-
-      #. Fix the ownership::
-
-           chown -R ceph:ceph /var/lib/ceph
-           chown -R ceph:ceph /var/log/ceph
-
-      #. Restart the daemon(s)::
-
-           start ceph-all                # ubuntu
-           systemctl start ceph.target   # debian, centos, fedora, rhel
-
-* The on-disk format for the experimental KeyValueStore OSD backend has
-  changed.  You will need to remove any OSDs using that backend before you
-  upgrade any test clusters that use it.
-
-Upgrade notes
--------------
-
-* When a pool quota is reached, librados operations now block indefinitely,
-  the same way they do when the cluster fills up.  (Previously they would return
-  -ENOSPC).  By default, a full cluster or pool will now block.  If your
-  librados application can handle ENOSPC or EDQUOT errors gracefully, you can
-  get error returns instead by using the new librados OPERATION_FULL_TRY flag.
-
-Notable changes
----------------
-
-NOTE: These notes are somewhat abbreviated while we find a less
-time-consuming process for generating them.
-
-* build: C++11 now supported
-* build: many cmake improvements
-* build: OSX build fixes (Yan, Zheng)
-* build: remove rest-bench
-* ceph-disk: many fixes (Loic Dachary)
-* ceph-disk: support for multipath devices (Loic Dachary)
-* ceph-fuse: mostly behave on 32-bit hosts (Yan, Zheng)
-* ceph-objectstore-tool: many improvements (David Zafman)
-* common: bufferlist performance tuning (Piotr Dalek, Sage Weil)
-* common: make mutex more efficient
-* common: some async compression infrastructure (Haomai Wang)
-* librados: add FULL_TRY and FULL_FORCE flags for dealing with full clusters or pools (Sage Weil)
-* librados: fix notify completion race (#13114 Sage Weil)
-* librados, libcephfs: randomize client nonces (Josh Durgin)
-* librados: pybind: fix binary omap values (Robin H. Johnson)
-* librbd: fix reads larger than the cache size (Lu Shi)
-* librbd: metadata filter fixes (Haomai Wang)
-* librbd: use write_full when possible (Zhiqiang Wang)
-* mds: avoid emitting cap warnigns before evicting session (John Spray)
-* mds: fix expected holes in journal objects (#13167 Yan, Zheng)
-* mds: fix SnapServer crash on deleted pool (John Spray)
-* mds: many fixes (Yan, Zheng, John Spray, Greg Farnum)
-* mon: add cache over MonitorDBStore (Kefu Chai)
-* mon: 'ceph osd metadata' can dump all osds (Haomai Wang)
-* mon: detect kv backend failures (Sage Weil)
-* mon: fix CRUSH map test for new pools (Sage Weil)
-* mon: fix min_last_epoch_clean tracking (Kefu Chai)
-* mon: misc scaling fixes (Sage Weil)
-* mon: streamline session handling, fix memory leaks (Sage Weil)
-* mon: upgrades must pass through hammer (Sage Weil)
-* msg/async: many fixes (Haomai Wang)
-* osd: cache proxy-write support (Zhiqiang Wang, Samuel Just)
-* osd: configure promotion based on write recency (Zhiqiang Wang)
-* osd: don't send dup MMonGetOSDMap requests (Sage Weil, Kefu Chai)
-* osd: erasure-code: fix SHEC floating point bug (#12936 Loic Dachary)
-* osd: erasure-code: update to ISA-L 2.14 (Yuan Zhou)
-* osd: fix hitset object naming to use GMT (Kefu Chai)
-* osd: fix misc memory leaks (Sage Weil)
-* osd: fix peek_queue locking in FileStore (Xinze Chi)
-* osd: fix promotion vs full cache tier (Samuel Just)
-* osd: fix replay requeue when pg is still activating (#13116 Samuel Just)
-* osd: fix scrub stat bugs (Sage Weil, Samuel Just)
-* osd: force promotion for ops EC can't handle (Zhiqiang Wang)
-* osd: improve behavior on machines with large memory pages (Steve Capper)
-* osd: merge multiple setattr calls into a setattrs call (Xinxin Shu)
-* osd: newstore prototype (Sage Weil)
-* osd: ObjectStore internal API refactor (Sage Weil)
-* osd: SHEC no longer experimental
-* osd: throttle evict ops (Yunchuan Wen)
-* osd: upgrades must pass through hammer (Sage Weil)
-* osd: use SEEK_HOLE / SEEK_DATA for sparse copy (Xinxin Shu)
-* rbd: rbd-replay-prep and rbd-replay improvements (Jason Dillaman)
-* rgw: expose the number of unhealthy workers through admin socket (Guang Yang)
-* rgw: fix casing of Content-Type header (Robin H. Johnson)
-* rgw: fix decoding of X-Object-Manifest from GET on Swift DLO (Radslow Rzarzynski)
-* rgw: fix sysvinit script
-* rgw: fix sysvinit script w/ multiple instances (Sage Weil, Pavan Rallabhandi)
-* rgw: improve handling of already removed buckets in expirer (Radoslaw Rzarzynski)
-* rgw: log to /var/log/ceph instead of /var/log/radosgw
-* rgw: rework X-Trans-Id header to be conform with Swift API (Radoslaw Rzarzynski)
-* rgw: s3 encoding-type for get bucket (Jeff Weber)
-* rgw: set max buckets per user in ceph.conf (Vikhyat Umrao)
-* rgw: support for Swift expiration API (Radoslaw Rzarzynski, Yehuda Sadeh)
-* rgw: user rm is idempotent (Orit Wasserman)
-* selinux policy (Boris Ranto, Milan Broz)
-* systemd: many fixes (Sage Weil, Owen Synge, Boris Ranto, Dan van der Ster)
-* systemd: run daemons as user ceph
-
-
-v9.0.3
-======
-
-This is the second to last batch of development work for the
-Infernalis cycle.  The most intrusive change is an internal (non
-user-visible) change to the OSD's ObjectStore interface.  Many fixes and
-improvements elsewhere across RGW, RBD, and another big pile of CephFS
-scrub/repair improvements.
-
-Upgrading
----------
-
-* The return code for librbd's rbd_aio_read and Image::aio_read API methods no
-  longer returns the number of bytes read upon success.  Instead, it returns 0
-  upon success and a negative value upon failure.
-
-* 'ceph scrub', 'ceph compact' and 'ceph sync force' are now deprecated.  Users
-  should instead use 'ceph mon scrub', 'ceph mon compact' and
-  'ceph mon sync force'.
-
-* 'ceph mon_metadata' should now be used as 'ceph mon metadata'.
-
-* The `--dump-json` option of "osdmaptool" is replaced by `--dump json`.
-
-* The commands of 'pg ls-by-{pool,primary,osd}' and 'pg ls' now take 'recovering'
-  instead of 'recovery' to include the recovering pgs in the listed pgs.
-
-
-Notable Changes
----------------
-
-  * autotools: fix out of tree build (Krxysztof Kosinski)
-  * autotools: improve make check output (Loic Dachary)
-  * buffer: add invalidate_crc() (Piotr Dalek)
-  * buffer: fix zero bug (#12252 Haomai Wang)
-  * build: fix junit detection on Fedora 22 (Ira Cooper)
-  * ceph-disk: install pip > 6.1 (#11952 Loic Dachary)
-  * cephfs-data-scan: many additions, improvements (John Spray)
-  * ceph: improve error output for 'tell' (#11101 Kefu Chai)
-  * ceph-objectstore-tool: misc improvements (David Zafman)
-  * ceph-objectstore-tool: refactoring and cleanup (John Spray)
-  * ceph_test_rados: test pipelined reads (Zhiqiang Wang)
-  * common: fix bit_vector extent calc (#12611 Jason Dillaman)
-  * common: make work queue addition/removal thread safe (#12662 Jason Dillaman)
-  * common: optracker improvements (Zhiqiang Wang, Jianpeng Ma)
-  * crush: add --check to validate dangling names, max osd id (Kefu Chai)
-  * crush: cleanup, sync with kernel (Ilya Dryomov)
-  * crush: fix subtree base weight on adjust_subtree_weight (#11855 Sage Weil)
-  * crypo: fix NSS leak (Jason Dillaman)
-  * crypto: fix unbalanced init/shutdown (#12598 Zheng Yan)
-  * doc: misc updates (Kefu Chai, Owen Synge, Gael Fenet-Garde, Loic Dachary, Yannick Atchy-Dalama, Jiaying Ren, Kevin Caradant, Robert Maxime, Nicolas Yong, Germain Chipaux, Arthur Gorjux, Gabriel Sentucq, Clement Lebrun, Jean-Remi Deveaux, Clair Massot, Robin Tang, Thomas Laumondais, Jordan Dorne, Yuan Zhou, Valentin Thomas, Pierre Chaumont, Benjamin Troquereau, Benjamin Sesia, Vikhyat Umrao)
-  * erasure-code: cleanup (Kefu Chai)
-  * erasure-code: improve tests (Loic Dachary)
-  * erasure-code: shec: fix recovery bugs (Takanori Nakao, Shotaro Kawaguchi)
-  * libcephfs: add pread, pwrite (Jevon Qiao)
-  * libcephfs,ceph-fuse: cache cleanup (Zheng Yan)
-  * librados: add src_fadvise_flags for copy-from (Jianpeng Ma)
-  * librados: respect default_crush_ruleset on pool_create (#11640 Yuan Zhou)
-  * librbd: fadvise for copy, export, import (Jianpeng Ma)
-  * librbd: handle NOCACHE fadvise flag (Jinapeng Ma)
-  * librbd: optionally disable allocation hint (Haomai Wang)
-  * librbd: prevent race between resize requests (#12664 Jason Dillaman)
-  * log: fix data corruption race resulting from log rotation (#12465 Samuel Just)
-  * mds: expose frags via asok (John Spray)
-  * mds: fix setting entire file layout in one setxattr (John Spray)
-  * mds: fix shutdown (John Spray)
-  * mds: handle misc corruption issues (John Spray)
-  * mds: misc fixes (Jianpeng Ma, Dan van der Ster, Zhang Zhi)
-  * mds: misc snap fixes (Zheng Yan)
-  * mds: store layout on header object (#4161 John Spray)
-  * misc performance and cleanup (Nathan Cutler, Xinxin Shu)
-  * mon: add NOFORWARD, OBSOLETE, DEPRECATE flags for mon commands (Joao Eduardo Luis)
-  * mon: add PG count to 'ceph osd df' output (Michal Jarzabek)
-  * mon: clean up, reorg some mon commands (Joao Eduardo Luis)
-  * mon: disallow >2 tiers (#11840 Kefu Chai)
-  * mon: fix log dump crash when debugging (Mykola Golub)
-  * mon: fix metadata update race (Mykola Golub)
-  * mon: fix refresh (#11470 Joao Eduardo Luis)
-  * mon: make blocked op messages more readable (Jianpeng Ma)
-  * mon: only send mon metadata to supporting peers (Sage Weil)
-  * mon: periodic background scrub (Joao Eduardo Luis)
-  * mon: prevent pgp_num > pg_num (#12025 Xinxin Shu)
-  * mon: reject large max_mds values (#12222 John Spray)
-  * msgr: add ceph_perf_msgr tool (Hoamai Wang)
-  * msgr: async: fix seq handling (Haomai Wang)
-  * msgr: xio: fastpath improvements (Raju Kurunkad)
-  * msgr: xio: sync with accellio v1.4 (Vu Pham)
-  * osd: clean up temp object if promotion fails (Jianpeng Ma)
-  * osd: constrain collections to meta and PGs (normal and temp) (Sage Weil)
-  * osd: filestore: clone using splice (Jianpeng Ma)
-  * osd: filestore: fix recursive lock (Xinxin Shu)
-  * osd: fix dup promotion lost op bug (Zhiqiang Wang)
-  * osd: fix temp-clearing (David Zafman)
-  * osd: include a temp namespace within each collection/pgid (Sage Weil)
-  * osd: low and high speed flush modes (Mingxin Liu)
-  * osd: peer_features includes self (David Zafman)
-  * osd: recovery, peering fixes (#11687 Samuel Just)
-  * osd: require firefly features (David Zafman)
-  * osd: set initial crush weight with more precision (Sage Weil)
-  * osd: use a temp object for recovery (Sage Weil)
-  * osd: use blkid to collection partition information (Joseph Handzik)
-  * rados: add --striper option to use libradosstriper (#10759 Sebastien Ponce)
-  * radosgw-admin: fix subuser modify output (#12286 Guce)
-  * rados: handle --snapid arg properly (Abhishek Lekshmanan)
-  * rados: improve bench buffer handling, performance (Piotr Dalek)
-  * rados: new pool import implementation (John Spray)
-  * rbd: fix link issues (Jason Dillaman)
-  * rbd: improve CLI arg parsing, usage (Ilya Dryomov)
-  * rbd: recognize queue_depth kernel option (Ilya Dryomov)
-  * rbd: support G and T units for CLI (Abhishek Lekshmanan)
-  * rbd: use image-spec and snap-spec in help (Vikhyat Umrao, Ilya Dryomov)
-  * rest-bench: misc fixes (Shawn Chen)
-  * rest-bench: support https (#3968 Yuan Zhou)
-  * rgw: add max multipart upload parts (#12146 Abshishek Dixit)
-  * rgw: add Trasnaction-Id to response (Abhishek Dixit)
-  * rgw: document layout of pools and objects (Pete Zaitcev)
-  * rgw: do not preserve ACLs when copying object (#12370 Yehuda Sadeh)
-  * rgw: fix Connection: header handling (#12298 Wido den Hollander)
-  * rgw: fix data corruptions race condition (#11749 Wuxingyi)
-  * rgw: fix JSON response when getting user quota (#12117 Wuxingyi)
-  * rgw: force content_type for swift bucket stats requests (#12095 Orit Wasserman)
-  * rgw: improved support for swift account metadata (Radoslaw Zarzynski)
-  * rgw: make max put size configurable (#6999 Yuan Zhou)
-  * rgw: orphan detection tool (Yehuda Sadeh)
-  * rgw: swift: do not override sent content type (#12363 Orit Wasserman)
-  * rgw: swift: set Content-Length for account GET (#12158 Radoslav Zarzynski)
-  * rpm: always rebuild and install man pages for rpm (Owen Synge)
-  * rpm: misc fixes (Boris Ranto, Owen Synge, Ken Dreyer, Ira Cooper)
-  * systemd: logrotate fixes (Tim Seron, Lars Marowsky-Bree, Nathan Cutler)
-  * sysvinit compat: misc fixes (Owen Synge)
-  * test: misc fs test improvements (John Spray, Loic Dachary)
-  * test: python tests, linter cleanup (Alfredo Deza)
-
-
-v9.0.2
-======
-
-This development release features more of the OSD work queue
-unification, randomized osd scrub times, a huge pile of librbd fixes,
-more MDS repair and snapshot fixes, and a significant amount of work
-on the tests and build infrastructure.
-
-Notable Changes
----------------
-
-* buffer: some cleanup (Michal Jarzabek)
-* build: cmake: fix nss linking (Danny Al-Gaaf)
-* build: cmake: misc fixes (Orit Wasserman, Casey Bodley)
-* build: install-deps: misc fixes (Loic Dachary)
-* build: make_dist_tarball.sh (Sage Weil)
-* ceph-detect-init: added Linux Mint (Michal Jarzabek)
-* ceph-detect-init: robust init system detection (Owen Synge, Loic Dachary)
-* ceph-disk: ensure 'zap' only operates on a full disk (#11272 Loic Dachary)
-* ceph-disk: misc fixes to respect init system (Loic Dachary, Owen Synge)
-* ceph-disk: support NVMe device partitions (#11612 Ilja Slepnev)
-* ceph: fix 'df' units (Zhe Zhang)
-* ceph: fix parsing in interactive cli mode (#11279 Kefu Chai)
-* ceph-objectstore-tool: many many changes (David Zafman)
-* ceph-post-file: misc fixes (Joey McDonald, Sage Weil)
-* client: avoid sending unnecessary FLUSHSNAP messages (Yan, Zheng)
-* client: exclude setfilelock when calculating oldest tid (Yan, Zheng)
-* client: fix error handling in check_pool_perm (John Spray)
-* client: fsync waits only for inode's caps to flush (Yan, Zheng)
-* client: invalidate kernel dcache when cache size exceeds limits (Yan, Zheng)
-* client: make fsync wait for unsafe dir operations (Yan, Zheng)
-* client: pin lookup dentry to avoid inode being freed (Yan, Zheng)
-* common: detect overflow of int config values (#11484 Kefu Chai)
-* common: fix json parsing of utf8 (#7387 Tim Serong)
-* common: fix leak of pthread_mutexattr (#11762 Ketor Meng)
-* crush: respect default replicated ruleset config on map creation (Ilya Dryomov)
-* deb, rpm: move ceph-objectstore-tool to ceph (Ken Dreyer)
-* doc: man page updates (Kefu Chai)
-* doc: misc updates (#11396 Nilamdyuti, Fracois Lafont, Ken Dreyer, Kefu Chai)
-* init-radosgw: merge with sysv version; fix enumeration (Sage Weil)
-* librados: add config observer (Alistair Strachan)
-* librbd: add const for single-client-only features (Josh Durgin)
-* librbd: add deep-flatten operation (Jason Dillaman)
-* librbd: avoid blocking aio API methods (#11056 Jason Dillaman)
-* librbd: fix fast diff bugs (#11553 Jason Dillaman)
-* librbd: fix image format detection (Zhiqiang Wang)
-* librbd: fix lock ordering issue (#11577 Jason Dillaman)
-* librbd: flatten/copyup fixes (Jason Dillaman)
-* librbd: lockdep, helgrind validation (Jason Dillaman, Josh Durgin)
-* librbd: only update image flags while hold exclusive lock (#11791 Jason Dillaman)
-* librbd: return result code from close (#12069 Jason Dillaman)
-* librbd: tolerate old osds when getting image metadata (#11549 Jason Dillaman)
-* mds: do not add snapped items to bloom filter (Yan, Zheng)
-* mds: fix handling for missing mydir dirfrag (#11641 John Spray)
-* mds: fix rejoin (Yan, Zheng)
-* mds: fix stra reintegration (Yan, Zheng)
-* mds: fix suicide beason (John Spray)
-* mds: misc repair improvements (John Spray)
-* mds: misc snapshot fixes (Yan, Zheng)
-* mds: respawn instead of suicide on blacklist (John Spray)
-* misc coverity fixes (Danny Al-Gaaf)
-* mon: add 'mon_metadata <id>' command (Kefu Chai)
-* mon: add 'node ls ...' command (Kefu Chai)
-* mon: disallow ec pools as tiers (#11650 Samuel Just)
-* mon: fix mds beacon replies (#11590 Kefu Chai)
-* mon: fix 'pg ls' sort order, state names (#11569 Kefu Chai)
-* mon: normalize erasure-code profile for storage and comparison (Loic Dachary)
-* mon: optionally specify osd id on 'osd create' (Mykola Golub)
-* mon: 'osd tree' fixes (Kefu Chai)
-* mon: prevent pool with snapshot state from being used as a tier (#11493 Sage Weil)
-* mon: refine check_remove_tier checks (#11504 John Spray)
-* mon: remove spurious who arg from 'mds rm ...' (John Spray)
-* msgr: async: misc fixes (Haomai Wang)
-* msgr: xio: fix ip and nonce (Raju Kurunkad)
-* msgr: xio: improve lane assignment (Vu Pham)
-* msgr: xio: misc fixes (Vu Pham, Cosey Bodley)
-* osd: avoid transaction append in some cases (Sage Weil)
-* osdc/Objecter: allow per-pool calls to op_cancel_writes (John Spray)
-* osd: elminiate txn apend, ECSubWrite copy (Samuel Just)
-* osd: filejournal: cleanup (David Zafman)
-* osd: fix check_for_full (Henry Chang)
-* osd: fix dirty accounting in make_writeable (Zhiqiang Wang)
-* osd: fix osdmap dump of blacklist items (John Spray)
-* osd: fix snap flushing from cache tier (again) (#11787 Samuel Just)
-* osd: fix snap handling on promotion (#11296 Sam Just)
-* osd: handle log split with overlapping entries (#11358 Samuel Just)
-* osd: keyvaluestore: misc fixes (Varada Kari)
-* osd: make suicide timeouts individually configurable (Samuel Just)
-* osd: move scrub in OpWQ (Samuel Just)
-* osd: pool size change triggers new interval (#11771 Samuel Just)
-* osd: randomize scrub times (#10973 Kefu Chai)
-* osd: refactor scrub and digest recording (Sage Weil)
-* osd: refuse first write to EC object at non-zero offset (Jianpeng Ma)
-* osd: stripe over small xattrs to fit in XFS's 255 byte inline limit (Sage Weil, Ning Yao)
-* osd: sync object_map on syncfs (Samuel Just)
-* osd: take excl lock of op is rw (Samuel Just)
-* osd: WBThrottle cleanups (Jianpeng Ma)
-* pycephfs: many fixes for bindings (Haomai Wang)
-* rados: bench: add --no-verify option to improve performance (Piotr Dalek)
-* rados: misc bench fixes (Dmitry Yatsushkevich)
-* rbd: add disk usage tool (#7746 Jason Dillaman)
-* rgw: alwasy check if token is expired (#11367 Anton Aksola, Riku Lehto)
-* rgw: conversion tool to repair broken multipart objects (#12079 Yehuda Sadeh)
-* rgw: do not enclose bucket header in quotes (#11860 Wido den Hollander)
-* rgw: error out if frontend did not send all data (#11851 Yehuda Sadeh)
-* rgw: fix assignment of copy obj attributes (#11563 Yehuda Sadeh)
-* rgw: fix reset_loc (#11974 Yehuda Sadeh)
-* rgw: improve content-length env var handling (#11419 Robin H. Johnson)
-* rgw: only scan for objects not in a namespace (#11984 Yehuda Sadeh)
-* rgw: remove trailing :port from HTTP_HOST header (Sage Weil)
-* rgw: shard work over multiple librados instances (Pavan Rallabhandi)
-* rgw: swift: enforce Content-Type in response (#12157 Radoslaw Zarzynski)
-* rgw: use attrs from source bucket on copy (#11639 Javier M. Mellid)
-* rocksdb: pass options as single string (Xiaoxi Chen)
-* rpm: many spec file fixes (Owen Synge, Ken Dreyer)
-* tests: fixes for rbd xstests (Douglas Fuller)
-* tests: fix tiering health checks (Loic Dachary)
-* tests for low-level performance (Haomai Wang)
-* tests: many ec non-regression improvements (Loic Dachary)
-* tests: many many ec test improvements (Loic Dachary)
-* upstart: throttle restarts (#11798 Sage Weil, Greg Farnum)
-
-
-v9.0.1
-======
-
-This development release is delayed a bit due to tooling changes in the build
-environment.  As a result the next one (v9.0.2) will have a bit more work than
-is usual.
-
-Highlights here include lots of RGW Swift fixes, RBD feature work
-surrounding the new object map feature, more CephFS snapshot fixes,
-and a few important CRUSH fixes.
-
-Notable Changes
----------------
-
-* auth: cache/reuse crypto lib key objects, optimize msg signature check (Sage Weil)
-* build: allow tcmalloc-minimal (Thorsten Behrens)
-* build: do not build ceph-dencoder with tcmalloc (#10691 Boris Ranto)
-* build: fix pg ref disabling (William A. Kennington III)
-* build: install-deps.sh improvements (Loic Dachary)
-* build: misc fixes (Boris Ranto, Ken Dreyer, Owen Synge)
-* ceph-authtool: fix return code on error (Gerhard Muntingh)
-* ceph-disk: fix zap sgdisk invocation (Owen Synge, Thorsten Behrens)
-* ceph-disk: pass --cluster arg on prepare subcommand (Kefu Chai)
-* ceph-fuse, libcephfs: drop inode when rmdir finishes (#11339 Yan, Zheng)
-* ceph-fuse,libcephfs: fix uninline (#11356 Yan, Zheng)
-* ceph-monstore-tool: fix store-copy (Huangjun)
-* common: add perf counter descriptions (Alyona Kiseleva)
-* common: fix throttle max change (Henry Chang)
-* crush: fix crash from invalid 'take' argument (#11602 Shiva Rkreddy, Sage Weil)
-* crush: fix divide-by-2 in straw2 (#11357 Yann Dupont, Sage Weil)
-* deb: fix rest-bench-dbg and ceph-test-dbg dependendies (Ken Dreyer)
-* doc: document region hostnames (Robin H. Johnson)
-* doc: update release schedule docs (Loic Dachary)
-* init-radosgw: run radosgw as root (#11453 Ken Dreyer)
-* librados: fadvise flags per op (Jianpeng Ma)
-* librbd: allow additional metadata to be stored with the image (Haomai Wang)
-* librbd: better handling for dup flatten requests (#11370 Jason Dillaman)
-* librbd: cancel in-flight ops on watch error (#11363 Jason Dillaman)
-* librbd: default new images to format 2 (#11348 Jason Dillaman)
-* librbd: fast diff implementation that leverages object map (Jason Dillaman)
-* librbd: fix snapshot creation when other snap is active (#11475 Jason Dillaman)
-* librbd: new diff_iterate2 API (Jason Dillaman)
-* librbd: object map rebuild support (Jason Dillaman)
-* logrotate.d: prefer service over invoke-rc.d (#11330 Win Hierman, Sage Weil)
-* mds: avoid getting stuck in XLOCKDONE (#11254 Yan, Zheng)
-* mds: fix integer truncateion on large client ids (Henry Chang)
-* mds: many snapshot and stray fixes (Yan, Zheng)
-* mds: persist completed_requests reliably (#11048 John Spray)
-* mds: separate safe_pos in Journaler (#10368 John Spray)
-* mds: snapshot rename support (#3645 Yan, Zheng)
-* mds: warn when clients fail to advance oldest_client_tid (#10657 Yan, Zheng)
-* misc cleanups and fixes (Danny Al-Gaaf)
-* mon: fix average utilization calc for 'osd df' (Mykola Golub)
-* mon: fix variance calc in 'osd df' (Sage Weil)
-* mon: improve callout to crushtool (Mykola Golub)
-* mon: prevent bucket deletion when referenced by a crush rule (#11602 Sage Weil)
-* mon: prime pg_temp when CRUSH map changes (Sage Weil)
-* monclient: flush_log (John Spray)
-* msgr: async: many many fixes (Haomai Wang)
-* msgr: simple: fix clear_pipe (#11381 Haomai Wang)
-* osd: add latency perf counters for tier operations (Xinze Chi)
-* osd: avoid multiple hit set insertions (Zhiqiang Wang)
-* osd: break PG removal into multiple iterations (#10198 Guang Yang)
-* osd: check scrub state when handling map (Jianpeng Ma)
-* osd: fix endless repair when object is unrecoverable (Jianpeng Ma, Kefu Chai)
-* osd: fix pg resurrection (#11429 Samuel Just)
-* osd: ignore non-existent osds in unfound calc (#10976 Mykola Golub)
-* osd: increase default max open files (Owen Synge)
-* osd: prepopulate needs_recovery_map when only one peer has missing (#9558 Guang Yang)
-* osd: relax reply order on proxy read (#11211 Zhiqiang Wang)
-* osd: skip promotion for flush/evict op (Zhiqiang Wang)
-* osd: write journal header on clean shutdown (Xinze Chi)
-* qa: run-make-check.sh script (Loic Dachary)
-* rados bench: misc fixes (Dmitry Yatsushkevich)
-* rados: fix error message on failed pool removal (Wido den Hollander)
-* radosgw-admin: add 'bucket check' function to repair bucket index (Yehuda Sadeh)
-* rbd: allow unmapping by spec (Ilya Dryomov)
-* rbd: deprecate --new-format option (Jason Dillman)
-* rgw: do not set content-type if length is 0 (#11091 Orit Wasserman)
-* rgw: don't use end_marker for namespaced object listing (#11437 Yehuda Sadeh)
-* rgw: fail if parts not specified on multipart upload (#11435 Yehuda Sadeh)
-* rgw: fix GET on swift account when limit == 0 (#10683 Radoslaw Zarzynski)
-* rgw: fix broken stats in container listing (#11285 Radoslaw Zarzynski)
-* rgw: fix bug in domain/subdomain splitting (Robin H. Johnson)
-* rgw: fix civetweb max threads (#10243 Yehuda Sadeh)
-* rgw: fix copy metadata, support X-Copied-From for swift (#10663 Radoslaw Zarzynski)
-* rgw: fix locator for objects starting with _ (#11442 Yehuda Sadeh)
-* rgw: fix mulitipart upload in retry path (#11604 Yehuda Sadeh)
-* rgw: fix quota enforcement on POST (#11323 Sergey Arkhipov)
-* rgw: fix return code on missing upload (#11436 Yehuda Sadeh)
-* rgw: force content type header on responses with no body (#11438 Orit Wasserman)
-* rgw: generate new object tag when setting attrs (#11256 Yehuda Sadeh)
-* rgw: issue aio for first chunk before flush cached data (#11322 Guang Yang)
-* rgw: make read user buckets backward compat (#10683 Radoslaw Zarzynski)
-* rgw: merge manifests properly with prefix override (#11622 Yehuda Sadeh)
-* rgw: return 412 on bad limit when listing buckets (#11613 Yehuda Sadeh)
-* rgw: send ETag, Last-Modified for swift (#11087 Radoslaw Zarzynski)
-* rgw: set content length on container GET, PUT, DELETE, HEAD (#10971, #11036 Radoslaw Zarzynski)
-* rgw: support end marker on swift container GET (#10682 Radoslaw Zarzynski)
-* rgw: swift: fix account listing (#11501 Radoslaw Zarzynski)
-* rgw: swift: set content-length on keystone tokens (#11473 Herv Rousseau)
-* rgw: use correct oid for gc chains (#11447 Yehuda Sadeh)
-* rgw: use unique request id for civetweb (#10295 Orit Wasserman)
-* rocksdb, leveldb: fix compact_on_mount (Xiaoxi Chen)
-* rocksdb: add perf counters for get/put latency (Xinxin Shu)
-* rpm: add suse firewall files (Tim Serong)
-* rpm: misc systemd and suse fixes (Owen Synge, Nathan Cutler)
-
-
-
-v9.0.0
-======
-
-This is the first development release for the Infernalis cycle, and
-the first Ceph release to sport a version number from the new
-numbering scheme.  The "9" indicates this is the 9th release cycle--I
-(for Infernalis) is the 9th letter.  The first "0" indicates this is a
-development release ("1" will mean release candidate and "2" will mean
-stable release), and the final "0" indicates this is the first such
-development release.
-
-A few highlights include:
-
-* a new 'ceph daemonperf' command to watch perfcounter stats in realtime
-* reduced MDS memory usage
-* many MDS snapshot fixes
-* librbd can now store options in the image itself
-* many fixes for RGW Swift API support
-* OSD performance improvements
-* many doc updates and misc bug fixes
-
-Notable Changes
----------------
-
-* aarch64: add optimized version of crc32c (Yazen Ghannam, Steve Capper)
-* auth: reinit NSS after fork() (#11128 Yan, Zheng)
-* build: disable LTTNG by default (#11333 Josh Durgin)
-* build: fix ppc build (James Page)
-* build: install-deps: support OpenSUSE (Loic Dachary)
-* build: misc cmake fixes (Matt Benjamin)
-* ceph-disk: follow ceph-osd hints when creating journal (#9580 Sage Weil)
-* ceph-disk: handle re-using existing partition (#10987 Loic Dachary)
-* ceph-disk: improve parted output parsing (#10983 Loic Dachary)
-* ceph-disk: make suppression work for activate-all and activate-journal (Dan van der Ster)
-* ceph-disk: misc fixes (Alfredo Deza)
-* ceph-fuse, libcephfs: don't clear COMPLETE when trimming null (Yan, Zheng)
-* ceph-fuse, libcephfs: hold exclusive caps on dirs we "own" (#11226 Greg Farnum)
-* ceph-fuse: do not require successful remount when unmounting (#10982 Greg Farnum)
-* ceph: new 'ceph daemonperf' command (John Spray, Mykola Golub)
-* common: PriorityQueue tests (Kefu Chai)
-* common: add descriptions to perfcounters (Kiseleva Alyona)
-* common: fix LTTNG vs fork issue (Josh Durgin)
-* crush: fix has_v4_buckets (#11364 Sage Weil)
-* crushtool: fix order of operations, usage (Sage Weil)
-* debian: minor package reorg (Ken Dreyer)
-* doc: docuemnt object corpus generation (#11099 Alexis Normand)
-* doc: fix gender neutrality (Alexandre Maragone)
-* doc: fix install doc (#10957 Kefu Chai)
-* doc: fix sphinx issues (Kefu Chai)
-* doc: mds data structure docs (Yan, Zheng)
-* doc: misc updates (Nilamdyuti Goswami, Vartika Rai, Florian Haas, Loic Dachary, Simon Guinot, Andy Allan, Alistair Israel, Ken Dreyer, Robin Rehu, Lee Revell, Florian Marsylle, Thomas Johnson, Bosse Klykken, Travis Rhoden, Ian Kelling)
-* doc: swift tempurls (#10184 Abhishek Lekshmanan)
-* doc: switch doxygen integration back to breathe (#6115 Kefu Chai)
-* erasure-code: update ISA-L to 2.13 (Yuan Zhou)
-* gmock: switch to submodule (Danny Al-Gaaf, Loic Dachary)
-* hadoop: add terasort test (Noah Watkins)
-* java: fix libcephfs bindings (Noah Watkins)
-* libcephfs,ceph-fuse: fix request resend on cap reconnect (#10912 Yan, Zheng)
-* librados: define C++ flags from C constants (Josh Durgin)
-* librados: fix last_force_resent handling (#11026 Jianpeng Ma)
-* librados: fix memory leak from C_TwoContexts (Xiong Yiliang)
-* librados: fix striper when stripe_count = 1 and stripe_unit != object_size (#11120 Yan, Zheng)
-* librados: op perf counters (John Spray)
-* librados: pybind: fix write() method return code (Javier Guerra)
-* libradosstriper: fix leak (Danny Al-Gaaf)
-* librbd: add purge_on_error cache behavior (Jianpeng Ma)
-* librbd: misc aio fixes (#5488 Jason Dillaman)
-* librbd: misc rbd fixes (#11478 #11113 #11342 #11380 Jason Dillaman, Zhiqiang Wang)
-* librbd: readahead fixes (Zhiqiang Wang)
-* librbd: store metadata, including config options, in image (Haomai Wang)
-* mds: add 'damaged' state to MDSMap (John Spray)
-* mds: add nicknames for perfcounters (John Spray)
-* mds: disable problematic rstat propagation into snap parents (Yan, Zheng)
-* mds: fix mydir replica issue with shutdown (#10743 John Spray)
-* mds: fix out-of-order messages (#11258 Yan, Zheng)
-* mds: fix shutdown with strays (#10744 John Spray)
-* mds: fix snapshot fixes (Yan, Zheng)
-* mds: fix stray handling (John Spray)
-* mds: flush immediately in do_open_truncate (#11011 John Spray)
-* mds: improve dump methods (John Spray)
-* mds: misc journal cleanups and fixes (#10368 John Spray)
-* mds: new SessionMap storage using omap (#10649 John Spray)
-* mds: reduce memory consumption (Yan, Zheng)
-* mds: throttle purge stray operations (#10390 John Spray)
-* mds: tolerate clock jumping backwards (#11053 Yan, Zheng)
-* misc coverity fixes (Danny Al-Gaaf)
-* mon: do not deactivate last mds (#10862 John Spray)
-* mon: make osd get pool 'all' only return applicable fields (#10891 Michal Jarzabek)
-* mon: warn on bogus cache tier config (Jianpeng Ma)
-* msg/async: misc bug fixes and updates (Haomai Wang)
-* msg/simple: fix connect_seq assert (Haomai Wang)
-* msg/xio: misc fixes (#10735 Matt Benjamin, Kefu Chai, Danny Al-Gaaf, Raju Kurunkad, Vu Pham)
-* msg: unit tests (Haomai Wang)
-* objectcacher: misc bug fixes (Jianpeng Ma)
-* os/filestore: enlarge getxattr buffer size (Jianpeng Ma)
-* osd: EIO injection (David Zhang)
-* osd: add misc perfcounters (Xinze Chi)
-* osd: add simple sleep injection in recovery (Sage Weil)
-* osd: allow SEEK_HOLE/SEEK_DATA for sparse read (Zhiqiang Wang)
-* osd: avoid dup omap sets for in pg metadata (Sage Weil)
-* osd: clean up some constness, privateness (Kefu Chai)
-* osd: erasure-code: drop entries according to LRU (Andreas-Joachim Peters)
-* osd: fix negative degraded stats during backfill (Guang Yang)
-* osd: misc fixes (Ning Yao, Kefu Chai, Xinze Chi, Zhiqiang Wang, Jianpeng Ma)
-* pybind: pep8 cleanups (Danny Al-Gaaf)
-* qa: fix filelock_interrupt.py test (Yan, Zheng)
-* qa: improve ceph-disk tests (Loic Dachary)
-* qa: improve docker build layers (Loic Dachary)
-* rados: translate erno to string in CLI (#10877 Kefu Chai)
-* rbd: accept map options config option (Ilya Dryomov)
-* rbd: cli: fix arg parsing with --io-pattern (Dmitry Yatsushkevich)
-* rbd: fix error messages (#2862 Rajesh Nambiar)
-* rbd: update rbd man page (Ilya Dryomov)
-* rbd: update xfstests tests (Douglas Fuller)
-* rgw: add X-Timestamp for Swift containers (#10938 Radoslaw Zarzynski)
-* rgw: add missing headers to Swift container details (#10666 Ahmad Faheem, Dmytro Iurchenko)
-* rgw: add stats to headers for account GET (#10684 Yuan Zhou)
-* rgw: do not prefecth data for HEAD requests (Guang Yang)
-* rgw: don't clobber bucket/object owner when setting ACLs (#10978 Yehuda Sadeh)
-* rgw: don't use rgw_socket_path if frontend is configured (#11160 Yehuda Sadeh)
-* rgw: enforce Content-Lenth for POST on Swift cont/obj (#10661 Radoslaw Zarzynski)
-* rgw: fix handling empty metadata items on Swift container (#11088 Radoslaw Zarzynski)
-* rgw: fix log rotation (Wuxingyi)
-* rgw: generate Date header for civetweb (#10873 Radoslaw Zarzynski)
-* rgw: make init script wait for radosgw to stop (#11140 Dmitry Yatsushkevich)
-* rgw: make quota/gc threads configurable (#11047 Guang Yang)
-* rgw: pass in civetweb configurables (#10907 Yehuda Sadeh)
-* rgw: rectify 202 Accepted in PUT response (#11148 Radoslaw Zarzynski)
-* rgw: remove meta file after deleting bucket (#11149 Orit Wasserman)
-* rgw: swift: allow setting attributes with COPY (#10662 Ahmad Faheem, Dmytro Iurchenko)
-* rgw: swift: fix metadata handling on copy (#10645 Radoslaw Zarzynski)
-* rgw: swift: send Last-Modified header (#10650 Radoslaw Zarzynski)
-* rgw: update keystone cache with token info (#11125 Yehuda Sadeh)
-* rgw: update to latest civetweb, enable config for IPv6 (#10965 Yehuda Sadeh)
-* rocksdb: update to latest (Xiaoxi Chen)
-* rpm: loosen ceph-test dependencies (Ken Dreyer)
-
diff --git a/ceph/doc/releases/jewel.rst b/ceph/doc/releases/jewel.rst
deleted file mode 100644 (file)
index 951dc5d..0000000
+++ /dev/null
@@ -1,3384 +0,0 @@
-=====
-Jewel
-=====
-
-Jewel is the 10th stable release of Ceph. It is named after the jewel
-squid (Histioteuthis reversa).
-
-
-v10.2.11 Jewel
-==============
-
-This point releases brings a number of important bugfixes and has a few
-important security fixes. This is expected to be the last Jewel release. We
-recommend all Jewel 10.2.x users to upgrade.
-
-Notable Changes
----------------
-
-* CVE 2018-1128: auth: cephx authorizer subject to replay attack (`issue#24836 <http://tracker.ceph.com/issues/24836>`_, Sage Weil)
-
-* CVE 2018-1129: auth: cephx signature check is weak (`issue#24837 <http://tracker.ceph.com/issues/24837>`_, Sage Weil)
-
-* CVE 2018-10861: mon: auth checks not correct for pool ops (`issue#24838 <http://tracker.ceph.com/issues/24838>`_, Jason Dillaman)
-
-* The RBD C API's rbd_discard method and the C++ API's Image::discard method
-  now enforce a maximum length of 2GB. This restriction prevents overflow of
-  the result code.
-
-* New OSDs will now use rocksdb for omap data by default, rather than
-  leveldb. omap is used by RGW bucket indexes and CephFS directories,
-  and when a single leveldb grows to 10s of GB with a high write or
-  delete workload, it can lead to high latency when leveldb's
-  single-threaded compaction cannot keep up. rocksdb supports multiple
-  threads for compaction, which avoids this problem.
-
-* The CephFS client now catches failures to clear dentries during startup
-  and refuses to start as consistency and untrimmable cache issues may
-  develop. The new option client_die_on_failed_dentry_invalidate (default:
-  true) may be turned off to allow the client to proceed (dangerous!).
-
-* In 10.2.10 and earlier releases, keyring caps were not checked for validity,
-  so the caps string could be anything. As of 10.2.11, caps strings are
-  validated and providing a keyring with an invalid caps string to, e.g.,
-  "ceph auth add" will result in an error.
-
-
-Changelog
----------
-
-* admin: bump sphinx to 1.6 (`issue#21717 <http://tracker.ceph.com/issues/21717>`_, `pr#18166 <https://github.com/ceph/ceph/pull/18166>`_, Kefu Chai, Alfredo Deza)
-* auth: ceph auth add does not sanity-check caps (`issue#22525 <http://tracker.ceph.com/issues/22525>`_, `pr#21367 <https://github.com/ceph/ceph/pull/21367>`_, Jing Li, Nathan Cutler, Kefu Chai, Sage Weil)
-* build/ops: rpm: bump epoch ahead of ceph-common in RHEL base (`issue#20508 <http://tracker.ceph.com/issues/20508>`_, `pr#21190 <https://github.com/ceph/ceph/pull/21190>`_, Ken Dreyer)
-* build/ops: upstart: radosgw-all does not start on boot if ceph-base is not installed (`issue#18313 <http://tracker.ceph.com/issues/18313>`_, `pr#16294 <https://github.com/ceph/ceph/pull/16294>`_, Ken Dreyer)
-* ceph_authtool: add mode option (`issue#23513 <http://tracker.ceph.com/issues/23513>`_, `pr#21197 <https://github.com/ceph/ceph/pull/21197>`_, Sébastien Han)
-* ceph-disk: factor out the retry logic into a decorator (`issue#21728 <http://tracker.ceph.com/issues/21728>`_, `pr#18169 <https://github.com/ceph/ceph/pull/18169>`_, Kefu Chai)
-* ceph-disk: fix --runtime omission when enabling ceph-osd@$ID.service units for device-backed OSDs (`issue#21498 <http://tracker.ceph.com/issues/21498>`_, `pr#17942 <https://github.com/ceph/ceph/pull/17942>`_, Carl Xiong)
-* ceph-disk flake8 test fails on very old, and very new, versions of flake8 (`issue#22207 <http://tracker.ceph.com/issues/22207>`_, `pr#19153 <https://github.com/ceph/ceph/pull/19153>`_, Nathan Cutler)
-* cephfs: ceph.in: pass RADOS inst to LibCephFS (`issue#21406 <http://tracker.ceph.com/issues/21406>`_, `issue#21967 <http://tracker.ceph.com/issues/21967>`_, `pr#19907 <https://github.com/ceph/ceph/pull/19907>`_, Patrick Donnelly)
-* cephfs: client::mkdirs not handle well when two clients send mkdir request for a same dir (`issue#20592 <http://tracker.ceph.com/issues/20592>`_, `pr#20271 <https://github.com/ceph/ceph/pull/20271>`_, dongdong tao)
-* cephfs: client: prevent fallback to remount when dentry_invalidate_cb is true but root->dir is NULL (`issue#23211 <http://tracker.ceph.com/issues/23211>`_, `pr#21189 <https://github.com/ceph/ceph/pull/21189>`_, Zhi Zhang)
-* cephfs: fix tmap_upgrade crash (`issue#23529 <http://tracker.ceph.com/issues/23529>`_, `pr#21208 <https://github.com/ceph/ceph/pull/21208>`_, "Yan, Zheng")
-* cephfs: fuse client: ::rmdir() uses a deleted memory structure of dentry leads … (`issue#22536 <http://tracker.ceph.com/issues/22536>`_, `pr#19993 <https://github.com/ceph/ceph/pull/19993>`_, YunfeiGuan)
-* cephfs-journal-tool: add "set pool_id" option (`issue#22631 <http://tracker.ceph.com/issues/22631>`_, `pr#20111 <https://github.com/ceph/ceph/pull/20111>`_, dongdong tao)
-* cephfs-journal-tool: move shutdown to the deconstructor of MDSUtility (`issue#22734 <http://tracker.ceph.com/issues/22734>`_, `pr#20333 <https://github.com/ceph/ceph/pull/20333>`_, dongdong tao)
-* cephfs: osdc: "FAILED assert(bh->last_write_tid > tid)" in powercycle-wip-yuri-master-1.19.18-distro-basic-smithi (`issue#22741 <http://tracker.ceph.com/issues/22741>`_, `pr#20312 <https://github.com/ceph/ceph/pull/20312>`_, "Yan, Zheng")
-* cephfs: osdc/Journaler: make sure flush() writes enough data (`issue#22824 <http://tracker.ceph.com/issues/22824>`_, `pr#20435 <https://github.com/ceph/ceph/pull/20435>`_, "Yan, Zheng")
-* cephfs: Processes stuck waiting for write with ceph-fuse (`issue#22008 <http://tracker.ceph.com/issues/22008>`_, `issue#22207 <http://tracker.ceph.com/issues/22207>`_, `pr#19141 <https://github.com/ceph/ceph/pull/19141>`_, "Yan, Zheng")
-* ceph-fuse: failure to remount in startup test does not handle client_die_on_failed_remount properly (`issue#22269 <http://tracker.ceph.com/issues/22269>`_, `pr#21162 <https://github.com/ceph/ceph/pull/21162>`_, Patrick Donnelly)
-* ceph.in: bypass codec when writing raw binary data (`issue#23185 <http://tracker.ceph.com/issues/23185>`_, `pr#20763 <https://github.com/ceph/ceph/pull/20763>`_, Oleh Prypin)
-* ceph-objectstore-tool command to trim the pg log (`issue#23242 <http://tracker.ceph.com/issues/23242>`_, `pr#20882 <https://github.com/ceph/ceph/pull/20882>`_, Josh Durgin, David Zafman)
-* ceph-objectstore-tool: "$OBJ get-omaphdr" and "$OBJ list-omap" scan all pgs instead of using specific pg (`issue#21327 <http://tracker.ceph.com/issues/21327>`_, `pr#20284 <https://github.com/ceph/ceph/pull/20284>`_, David Zafman)
-* ceph.restart + ceph_manager.wait_for_clean is racy (`issue#15778 <http://tracker.ceph.com/issues/15778>`_, `pr#20508 <https://github.com/ceph/ceph/pull/20508>`_, Warren Usui, Sage Weil)
-* ceph_volume_client: fix setting caps for IDs (`issue#21501 <http://tracker.ceph.com/issues/21501>`_, `pr#18084 <https://github.com/ceph/ceph/pull/18084>`_, Ramana Raja)
-* class rbd.Image discard----OSError: [errno 2147483648] error discarding region (`issue#16465 <http://tracker.ceph.com/issues/16465>`_, `issue#21966 <http://tracker.ceph.com/issues/21966>`_, `pr#20287 <https://github.com/ceph/ceph/pull/20287>`_, Nathan Cutler, Huan Zhang, Jason Dillaman)
-* cli/crushtools/build.t sometimes fails in jenkins' make check run (`issue#21758 <http://tracker.ceph.com/issues/21758>`_, `pr#21158 <https://github.com/ceph/ceph/pull/21158>`_, Kefu Chai)
-* client reconnect gather race (`issue#22263 <http://tracker.ceph.com/issues/22263>`_, `pr#21163 <https://github.com/ceph/ceph/pull/21163>`_, "Yan, Zheng")
-* client: release revoking Fc after invalidate cache (`issue#22652 <http://tracker.ceph.com/issues/22652>`_, `pr#19975 <https://github.com/ceph/ceph/pull/19975>`_, "Yan, Zheng")
-* client: set client_try_dentry_invalidate to false by default (`issue#21423 <http://tracker.ceph.com/issues/21423>`_, `pr#17925 <https://github.com/ceph/ceph/pull/17925>`_, "Yan, Zheng")
-* [cli] rename of non-existent image results in seg fault (`issue#21248 <http://tracker.ceph.com/issues/21248>`_, `pr#20280 <https://github.com/ceph/ceph/pull/20280>`_, Jason Dillaman)
-* CLI unit formatting tests are broken (`issue#24733 <http://tracker.ceph.com/issues/24733>`_, `pr#22913 <https://github.com/ceph/ceph/pull/22913>`_, Jason Dillaman)
-* common: compute SimpleLRU's size with contents.size() instead of lru.… (`issue#22613 <http://tracker.ceph.com/issues/22613>`_, `pr#19978 <https://github.com/ceph/ceph/pull/19978>`_, Xuehan Xu)
-* common/config: set rocksdb_cache_size to OPT_U64 (`issue#22104 <http://tracker.ceph.com/issues/22104>`_, `pr#18850 <https://github.com/ceph/ceph/pull/18850>`_, Vikhyat Umrao, liuhongtong)
-* common: fix typo in rados bench write JSON output (`issue#24199 <http://tracker.ceph.com/issues/24199>`_, `pr#22407 <https://github.com/ceph/ceph/pull/22407>`_, Sandor Zeestraten)
-* config: lower default omap entries recovered at once (`issue#21897 <http://tracker.ceph.com/issues/21897>`_, `pr#19927 <https://github.com/ceph/ceph/pull/19927>`_, Josh Durgin)
-* core: Addition of online osd 'omap'compaction command (`issue#19592 <http://tracker.ceph.com/issues/19592>`_, `pr#17101 <https://github.com/ceph/ceph/pull/17101>`_, liuchang0812, Sage Weil)
-* core: global/signal_handler.cc: fix typo (`issue#21432 <http://tracker.ceph.com/issues/21432>`_, `pr#17883 <https://github.com/ceph/ceph/pull/17883>`_, Kefu Chai)
-* core: librados: Double free in rados_getxattrs_next (`issue#22042 <http://tracker.ceph.com/issues/22042>`_, `pr#20381 <https://github.com/ceph/ceph/pull/20381>`_, Gu Zhongyan)
-* core: Objecter::C_ObjectOperation_sparse_read throws/catches exceptions on -ENOENT (`issue#21844 <http://tracker.ceph.com/issues/21844>`_, `pr#18743 <https://github.com/ceph/ceph/pull/18743>`_, Jason Dillaman)
-* Deleting a pool with active notify linger ops can result in seg fault (`issue#23966 <http://tracker.ceph.com/issues/23966>`_, `pr#22188 <https://github.com/ceph/ceph/pull/22188>`_, Kefu Chai, Jason Dillaman)
-* doc: clarify Path Restriction instructions (`issue#16906 <http://tracker.ceph.com/issues/16906>`_, `pr#19795 <https://github.com/ceph/ceph/pull/19795>`_, huanwen ren)
-* doc: clarify Path Restriction instructions (`issue#16906 <http://tracker.ceph.com/issues/16906>`_, `pr#19840 <https://github.com/ceph/ceph/pull/19840>`_, Drunkard Zhang)
-* doc: remove region from INSTALL CEPH OBJECT GATEWAY (`issue#21610 <http://tracker.ceph.com/issues/21610>`_, `pr#18303 <https://github.com/ceph/ceph/pull/18303>`_, Orit Wasserman)
-* Filestore rocksdb compaction readahead option not set by default (`issue#21505 <http://tracker.ceph.com/issues/21505>`_, `pr#20446 <https://github.com/ceph/ceph/pull/20446>`_, Mark Nelson)
-* follow-on: osd: be_select_auth_object() sanity check oi soid (`issue#20471 <http://tracker.ceph.com/issues/20471>`_, `pr#20622 <https://github.com/ceph/ceph/pull/20622>`_, David Zafman)
-* HashIndex: randomize split threshold by a configurable amount (`issue#15835 <http://tracker.ceph.com/issues/15835>`_, `pr#19906 <https://github.com/ceph/ceph/pull/19906>`_, Josh Durgin)
-* include/fs_types: fix unsigned integer overflow (`issue#22494 <http://tracker.ceph.com/issues/22494>`_, `pr#19611 <https://github.com/ceph/ceph/pull/19611>`_, runsisi)
-* install-deps.sh: point gcc to the one shipped by distro (`issue#22220 <http://tracker.ceph.com/issues/22220>`_, `pr#19461 <https://github.com/ceph/ceph/pull/19461>`_, Kefu Chai)
-* install-deps.sh: readlink /usr/bin/gcc not /usr/bin/x86_64-linux-gnu-gcc (`issue#22220 <http://tracker.ceph.com/issues/22220>`_, `pr#19521 <https://github.com/ceph/ceph/pull/19521>`_, Kefu Chai)
-* install-deps.sh: update g++ symlink also (`issue#22220 <http://tracker.ceph.com/issues/22220>`_, `pr#19656 <https://github.com/ceph/ceph/pull/19656>`_, Kefu Chai)
-* journal: Message too long error when appending journal (`issue#23526 <http://tracker.ceph.com/issues/23526>`_, `pr#21215 <https://github.com/ceph/ceph/pull/21215>`_, Mykola Golub)
-* [journal] tags are not being expired if no other clients are registered (`issue#21960 <http://tracker.ceph.com/issues/21960>`_, `pr#20282 <https://github.com/ceph/ceph/pull/20282>`_, Jason Dillaman)
-* legal: remove doc license ambiguity (`issue#23336 <http://tracker.ceph.com/issues/23336>`_, `pr#20999 <https://github.com/ceph/ceph/pull/20999>`_, Nathan Cutler)
-* librados: copy out data to users' buffer for xio (`issue#20616 <http://tracker.ceph.com/issues/20616>`_, `pr#17594 <https://github.com/ceph/ceph/pull/17594>`_, Vu Pham)
-* librbd: cannot clone all image-metas if we have more than 64 key/value pairs (`issue#21814 <http://tracker.ceph.com/issues/21814>`_, `pr#21228 <https://github.com/ceph/ceph/pull/21228>`_, PCzhangPC)
-* librbd: cannot copy all image-metas if we have more than 64 key/value pairs (`issue#21815 <http://tracker.ceph.com/issues/21815>`_, `pr#21203 <https://github.com/ceph/ceph/pull/21203>`_, PCzhangPC)
-* librbd: create+truncate for whole-object layered discards (`issue#23285 <http://tracker.ceph.com/issues/23285>`_, `pr#21219 <https://github.com/ceph/ceph/pull/21219>`_, Jason Dillaman)
-* librbd: list_children should not attempt to refresh image (`issue#21670 <http://tracker.ceph.com/issues/21670>`_, `pr#21224 <https://github.com/ceph/ceph/pull/21224>`_, Jason Dillaman)
-* librbd: object map batch update might cause OSD suicide timeout (`issue#22716 <http://tracker.ceph.com/issues/22716>`_, `issue#21797 <http://tracker.ceph.com/issues/21797>`_, `pr#21220 <https://github.com/ceph/ceph/pull/21220>`_, Song Shun, Jason Dillaman)
-* librbd: set deleted parent pointer to null (`issue#22158 <http://tracker.ceph.com/issues/22158>`_, `pr#19098 <https://github.com/ceph/ceph/pull/19098>`_, Jason Dillaman)
-* log: Fix AddressSanitizer: new-delete-type-mismatch (`issue#23324 <http://tracker.ceph.com/issues/23324>`_, `pr#21084 <https://github.com/ceph/ceph/pull/21084>`_, Brad Hubbard)
-* mds: FAILED assert(get_version() < pv) in CDir::mark_dirty (`issue#21584 <http://tracker.ceph.com/issues/21584>`_, `pr#21156 <https://github.com/ceph/ceph/pull/21156>`_, Yan, Zheng, "Yan, Zheng")
-* mds: fix dump last_sent (`issue#22562 <http://tracker.ceph.com/issues/22562>`_, `pr#19961 <https://github.com/ceph/ceph/pull/19961>`_, dongdong tao)
-* mds: fix integer overflow (`issue#21067 <http://tracker.ceph.com/issues/21067>`_, `pr#17188 <https://github.com/ceph/ceph/pull/17188>`_, Henry Chang)
-* mds: fix scrub crash (`issue#22730 <http://tracker.ceph.com/issues/22730>`_, `pr#20335 <https://github.com/ceph/ceph/pull/20335>`_, dongdong tao)
-* mds: session reference leak (`issue#22821 <http://tracker.ceph.com/issues/22821>`_, `pr#21175 <https://github.com/ceph/ceph/pull/21175>`_, Nathan Cutler, "Yan, Zheng")
-* mds: unbalanced auth_pin/auth_unpin in RecoveryQueue code (`issue#22647 <http://tracker.ceph.com/issues/22647>`_, `pr#20067 <https://github.com/ceph/ceph/pull/20067>`_, "Yan, Zheng")
-* mds: underwater dentry check in CDir::_omap_fetched is racy (`issue#23032 <http://tracker.ceph.com/issues/23032>`_, `pr#21185 <https://github.com/ceph/ceph/pull/21185>`_, Yan, Zheng)
-* mon/LogMonitor: call no_reply() on ignored log message (`issue#24180 <http://tracker.ceph.com/issues/24180>`_, `pr#22431 <https://github.com/ceph/ceph/pull/22431>`_, Sage Weil)
-* mon/MDSMonitor: no_reply on MMDSLoadTargets (`issue#23769 <http://tracker.ceph.com/issues/23769>`_, `pr#22189 <https://github.com/ceph/ceph/pull/22189>`_, Sage Weil)
-* mon/OSDMonitor.cc: fix expected_num_objects interpret error (`issue#22530 <http://tracker.ceph.com/issues/22530>`_, `pr#22050 <https://github.com/ceph/ceph/pull/22050>`_, Yang Honggang)
-* mon/OSDMonitor: fix dividing by zero in OSDUtilizationDumper (`issue#22662 <http://tracker.ceph.com/issues/22662>`_, `pr#20344 <https://github.com/ceph/ceph/pull/20344>`_, Mingxin Liu)
-* ObjectStore/StoreTest.FiemapHoles/3 fails with kstore (`issue#21716 <http://tracker.ceph.com/issues/21716>`_, `pr#20143 <https://github.com/ceph/ceph/pull/20143>`_, Kefu Chai, Ning Yao)
-* osd: also check the exsistence of clone obc for "CEPH_SNAPDIR" requests (`issue#17445 <http://tracker.ceph.com/issues/17445>`_, `pr#17707 <https://github.com/ceph/ceph/pull/17707>`_, Xuehan Xu)
-* osdc/Objecter: prevent double-invocation of linger op callback (`issue#23872 <http://tracker.ceph.com/issues/23872>`_, `pr#21754 <https://github.com/ceph/ceph/pull/21754>`_, Jason Dillaman)
-* osd: objecter sends out of sync with pg epochs for proxied ops (`issue#22123 <http://tracker.ceph.com/issues/22123>`_, `pr#20518 <https://github.com/ceph/ceph/pull/20518>`_, Sage Weil)
-* osd ops (sent and?) arrive at osd out of order (`issue#19133 <http://tracker.ceph.com/issues/19133>`_, `issue#19139 <http://tracker.ceph.com/issues/19139>`_, `pr#17893 <https://github.com/ceph/ceph/pull/17893>`_, Jianpeng Ma, Sage Weil)
-* osd: OSDMap cache assert on shutdown (`issue#21737 <http://tracker.ceph.com/issues/21737>`_, `pr#21184 <https://github.com/ceph/ceph/pull/21184>`_, Greg Farnum)
-* osd: osd_scrub_during_recovery only considers primary, not replicas (`issue#18206 <http://tracker.ceph.com/issues/18206>`_, `pr#17815 <https://github.com/ceph/ceph/pull/17815>`_, David Zafman)
-* osd/PrimaryLogPG: dump snap_trimq size (`issue#22448 <http://tracker.ceph.com/issues/22448>`_, `pr#21200 <https://github.com/ceph/ceph/pull/21200>`_, Piotr Dałek)
-* osd: recover_replicas: object added to missing set for backfill, but is not in recovering, error! (`issue#18162 <http://tracker.ceph.com/issues/18162>`_, `issue#14513 <http://tracker.ceph.com/issues/14513>`_, `pr#18690 <https://github.com/ceph/ceph/pull/18690>`_, huangjun, Adam C. Emerson, David Zafman)
-* osd: replica read can trigger cache promotion (`issue#20919 <http://tracker.ceph.com/issues/20919>`_, `pr#21199 <https://github.com/ceph/ceph/pull/21199>`_, Sage Weil)
-* osd: update heartbeat peers when a new OSD is added (`issue#18004 <http://tracker.ceph.com/issues/18004>`_, `pr#20108 <https://github.com/ceph/ceph/pull/20108>`_, Pan Liu)
-* performance: Only scan for omap corruption once (`issue#21328 <http://tracker.ceph.com/issues/21328>`_, `pr#18951 <https://github.com/ceph/ceph/pull/18951>`_, David Zafman)
-* qa: failures from pjd fstest (`issue#21383 <http://tracker.ceph.com/issues/21383>`_, `pr#21152 <https://github.com/ceph/ceph/pull/21152>`_, "Yan, Zheng")
-* qa: src/test/libcephfs/test.cc:376: Expected: (len) > (0), actual: -34 vs 0 (`issue#22221 <http://tracker.ceph.com/issues/22221>`_, `pr#21172 <https://github.com/ceph/ceph/pull/21172>`_, Patrick Donnelly)
-* qa: use xfs instead of btrfs w/ filestore (`issue#20169 <http://tracker.ceph.com/issues/20169>`_, `issue#20911 <http://tracker.ceph.com/issues/20911>`_, `pr#18165 <https://github.com/ceph/ceph/pull/18165>`_, Sage Weil)
-* qa: use xfs instead of btrfs w/ filestore (`issue#21481 <http://tracker.ceph.com/issues/21481>`_, `pr#17847 <https://github.com/ceph/ceph/pull/17847>`_, Patrick Donnelly)
-* radosgw: fix awsv4 header line sort order (`issue#21607 <http://tracker.ceph.com/issues/21607>`_, `pr#18080 <https://github.com/ceph/ceph/pull/18080>`_, Marcus Watts)
-* rbd: clean up warnings when mirror commands used on non-setup pool (`issue#21319 <http://tracker.ceph.com/issues/21319>`_, `pr#21227 <https://github.com/ceph/ceph/pull/21227>`_, Jason Dillaman)
-* rbd: disk usage on empty pool no longer returns an error message (`issue#22200 <http://tracker.ceph.com/issues/22200>`_, `pr#19186 <https://github.com/ceph/ceph/pull/19186>`_, Jason Dillaman)
-* [rbd] image-meta list does not return all entries (`issue#21179 <http://tracker.ceph.com/issues/21179>`_, `pr#20281 <https://github.com/ceph/ceph/pull/20281>`_, Jason Dillaman)
-* rbd: is_qemu_running in qemu_rebuild_object_map.sh and qemu_dynamic_features.sh may return false positive (`issue#23502 <http://tracker.ceph.com/issues/23502>`_, `pr#21207 <https://github.com/ceph/ceph/pull/21207>`_, Mykola Golub)
-* rbd: [journal] allocating a new tag after acquiring the lock should use on-disk committed position (`issue#22945 <http://tracker.ceph.com/issues/22945>`_, `pr#21206 <https://github.com/ceph/ceph/pull/21206>`_, Jason Dillaman)
-* rbd: librbd: filter out potential race with image rename (`issue#18435 <http://tracker.ceph.com/issues/18435>`_, `pr#19855 <https://github.com/ceph/ceph/pull/19855>`_, Jason Dillaman)
-* rbd ls -l crashes with SIGABRT (`issue#21558 <http://tracker.ceph.com/issues/21558>`_, `pr#19801 <https://github.com/ceph/ceph/pull/19801>`_, Jason Dillaman)
-* rbd-mirror: cluster watcher should ensure it has latest OSD map (`issue#22461 <http://tracker.ceph.com/issues/22461>`_, `pr#19644 <https://github.com/ceph/ceph/pull/19644>`_, Jason Dillaman)
-* rbd-mirror: fix potential infinite loop when formatting status message (`issue#22932 <http://tracker.ceph.com/issues/22932>`_, `pr#20418 <https://github.com/ceph/ceph/pull/20418>`_, Mykola Golub)
-* rbd-mirror: ignore permission errors on rbd_mirroring object (`issue#20571 <http://tracker.ceph.com/issues/20571>`_, `pr#21225 <https://github.com/ceph/ceph/pull/21225>`_, Jason Dillaman)
-* rbd-mirror: strip environment/CLI overrides for remote cluster (`issue#21894 <http://tracker.ceph.com/issues/21894>`_, `pr#21223 <https://github.com/ceph/ceph/pull/21223>`_, Jason Dillaman)
-* [rbd-nbd] Fedora does not register resize events (`issue#22131 <http://tracker.ceph.com/issues/22131>`_, `pr#19115 <https://github.com/ceph/ceph/pull/19115>`_, Jason Dillaman)
-* rbd-nbd: fix ebusy when do map (`issue#23528 <http://tracker.ceph.com/issues/23528>`_, `pr#21232 <https://github.com/ceph/ceph/pull/21232>`_, Li Wang)
-* rbd: possible deadlock in various maintenance operations (`issue#22120 <http://tracker.ceph.com/issues/22120>`_, `pr#20285 <https://github.com/ceph/ceph/pull/20285>`_, Jason Dillaman)
-* rbd: rbd crashes during map (`issue#21808 <http://tracker.ceph.com/issues/21808>`_, `pr#18843 <https://github.com/ceph/ceph/pull/18843>`_, Peter Keresztes Schmidt)
-* rbd: rbd-mirror split brain test case can have a false-positive failure until teuthology (`issue#22485 <http://tracker.ceph.com/issues/22485>`_, `pr#21205 <https://github.com/ceph/ceph/pull/21205>`_, Jason Dillaman)
-* rbd: TestLibRBD.RenameViaLockOwner may still fail with -ENOENT (`issue#23068 <http://tracker.ceph.com/issues/23068>`_, `pr#20627 <https://github.com/ceph/ceph/pull/20627>`_, Mykola Golub)
-* repair_test fails due to race with osd start (`issue#20705 <http://tracker.ceph.com/issues/20705>`_, `pr#20146 <https://github.com/ceph/ceph/pull/20146>`_, Sage Weil)
-* rgw: 15912 15673 (Fix duplicate tag removal during GC, cls/refcount: store and use list of retired tags) (`issue#20107 <http://tracker.ceph.com/issues/20107>`_, `pr#16708 <https://github.com/ceph/ceph/pull/16708>`_, Jens Rosenboom)
-* rgw: abort in listing mapped nbd devices when running in a container (`issue#22012 <http://tracker.ceph.com/issues/22012>`_, `issue#22011 <http://tracker.ceph.com/issues/22011>`_, `pr#20286 <https://github.com/ceph/ceph/pull/20286>`_, Li Wang, Pan Liu)
-* rgw: add ability to sync user stats from admin api (`issue#21301 <http://tracker.ceph.com/issues/21301>`_, `pr#20179 <https://github.com/ceph/ceph/pull/20179>`_, Nathan Johnson)
-* rgw: add cors header rule check in cors option request (`issue#22002 <http://tracker.ceph.com/issues/22002>`_, `pr#19057 <https://github.com/ceph/ceph/pull/19057>`_, yuliyang)
-* rgw: add radosgw-admin sync error trim to trim sync error log (`issue#23287 <http://tracker.ceph.com/issues/23287>`_, `pr#21210 <https://github.com/ceph/ceph/pull/21210>`_, fang yuxiang)
-* rgw: add xml output header in RGWCopyObj_ObjStore_S3 response msg (`issue#22416 <http://tracker.ceph.com/issues/22416>`_, `pr#19887 <https://github.com/ceph/ceph/pull/19887>`_, Enming Zhang)
-* rgw: automated trimming of datalog and mdlog (`issue#18227 <http://tracker.ceph.com/issues/18227>`_, `pr#20061 <https://github.com/ceph/ceph/pull/20061>`_, Casey Bodley)
-* rgw: bi list entry count incremented on error, distorting error code (`issue#21205 <http://tracker.ceph.com/issues/21205>`_, `pr#18207 <https://github.com/ceph/ceph/pull/18207>`_, Nathan Cutler)
-* rgw: boto3 v4 SignatureDoesNotMatch failure due to sorting of sse-kms headers (`issue#21832 <http://tracker.ceph.com/issues/21832>`_, `pr#18772 <https://github.com/ceph/ceph/pull/18772>`_, Nathan Cutler)
-* rgw: bucket resharding should not update bucket ACL or user stats (`issue#22124 <http://tracker.ceph.com/issues/22124>`_, `pr#20421 <https://github.com/ceph/ceph/pull/20421>`_, Orit Wasserman)
-* rgw: copying part without http header x-amz-copy-source-range will be mistaken for copying object (`issue#22729 <http://tracker.ceph.com/issues/22729>`_, `pr#21294 <https://github.com/ceph/ceph/pull/21294>`_, Malcolm Lee)
-* rgw: core dump, recursive lock of RGWKeystoneTokenCache (`issue#23171 <http://tracker.ceph.com/issues/23171>`_, `pr#20639 <https://github.com/ceph/ceph/pull/20639>`_, Mark Kogan, Adam Kupczyk)
-* rgw: data sync of versioned objects, note updating bi marker (`issue#18885 <http://tracker.ceph.com/issues/18885>`_, `pr#21213 <https://github.com/ceph/ceph/pull/21213>`_, Yehuda Sadeh)
-* rgw: dont log EBUSY errors in 'sync error list' (`issue#22473 <http://tracker.ceph.com/issues/22473>`_, `pr#19908 <https://github.com/ceph/ceph/pull/19908>`_, Casey Bodley)
-* rgw: ECANCELED in rgw_get_system_obj() leads to infinite loop (`issue#17996 <http://tracker.ceph.com/issues/17996>`_, `pr#20561 <https://github.com/ceph/ceph/pull/20561>`_, Yehuda Sadeh)
-* rgw: file deadlock on lru evicting (`issue#22736 <http://tracker.ceph.com/issues/22736>`_, `pr#20076 <https://github.com/ceph/ceph/pull/20076>`_, Matt Benjamin)
-* rgw: file write error (`issue#21455 <http://tracker.ceph.com/issues/21455>`_, `pr#18304 <https://github.com/ceph/ceph/pull/18304>`_, Yao Zongyou)
-* rgw: fix chained cache invalidation to prevent cache size growth (`issue#22410 <http://tracker.ceph.com/issues/22410>`_, `pr#19469 <https://github.com/ceph/ceph/pull/19469>`_, Mark Kogan)
-* rgw: fix doubled underscore with s3/swift server-side copy (`issue#22529 <http://tracker.ceph.com/issues/22529>`_, `pr#19747 <https://github.com/ceph/ceph/pull/19747>`_, Matt Benjamin)
-* rgw: fix GET website response error code (`issue#22272 <http://tracker.ceph.com/issues/22272>`_, `pr#19488 <https://github.com/ceph/ceph/pull/19488>`_, Dmitry Plyakin)
-* rgw: fix index update in dir_suggest_changes (`issue#24280 <http://tracker.ceph.com/issues/24280>`_, `pr#22677 <https://github.com/ceph/ceph/pull/22677>`_, Tianshan Qu)
-* rgw: fix marker encoding problem (`issue#20463 <http://tracker.ceph.com/issues/20463>`_, `pr#17731 <https://github.com/ceph/ceph/pull/17731>`_, Orit Wasserman, Marcus Watts)
-* rgw: fix swift anonymous access (`issue#22259 <http://tracker.ceph.com/issues/22259>`_, `pr#19194 <https://github.com/ceph/ceph/pull/19194>`_, Marcus Watts)
-* rgw: Fix swift object expiry not deleting objects (`issue#22084 <http://tracker.ceph.com/issues/22084>`_, `pr#18925 <https://github.com/ceph/ceph/pull/18925>`_, Pavan Rallabhandi)
-* rgw: fix the bug that part's index can't be removed after completing (`issue#19604 <http://tracker.ceph.com/issues/19604>`_, `pr#16763 <https://github.com/ceph/ceph/pull/16763>`_, Zhang Shaowen, Matt Benjamin)
-* rgw: fix the max-uploads parameter not work (`issue#22825 <http://tracker.ceph.com/issues/22825>`_, `pr#20479 <https://github.com/ceph/ceph/pull/20479>`_, Xin Liao)
-* rgw: inefficient buffer usage for PUTs (`issue#23207 <http://tracker.ceph.com/issues/23207>`_, `pr#21098 <https://github.com/ceph/ceph/pull/21098>`_, Marcus Watts)
-* rgw: libcurl & ssl fixes (`issue#22951 <http://tracker.ceph.com/issues/22951>`_, `issue#23203 <http://tracker.ceph.com/issues/23203>`_, `issue#23162 <http://tracker.ceph.com/issues/23162>`_, `pr#20749 <https://github.com/ceph/ceph/pull/20749>`_, Marcus Watts, Abhishek Lekshmanan, Jesse Williamson)
-* rgw: list bucket which enable versioning get wrong result when user marker (`issue#21500 <http://tracker.ceph.com/issues/21500>`_, `pr#20291 <https://github.com/ceph/ceph/pull/20291>`_, yuliyang)
-* rgw: log includes zero byte sometimes (`issue#20037 <http://tracker.ceph.com/issues/20037>`_, `pr#17151 <https://github.com/ceph/ceph/pull/17151>`_, Abhishek Lekshmanan)
-* rgw:  make init env methods return an error (`issue#23039 <http://tracker.ceph.com/issues/23039>`_, `pr#20800 <https://github.com/ceph/ceph/pull/20800>`_, Abhishek Lekshmanan)
-* RGW: Multipart upload may double the quota (`issue#21586 <http://tracker.ceph.com/issues/21586>`_, `pr#18121 <https://github.com/ceph/ceph/pull/18121>`_, Sibei Gao, Matt Benjamin)
-* rgw: multisite: data sync status advances despite failure in RGWListBucketIndexesCR (`issue#21735 <http://tracker.ceph.com/issues/21735>`_, `pr#20269 <https://github.com/ceph/ceph/pull/20269>`_, Casey Bodley)
-* rgw: multisite: Get bucket location which is located in another zonegroup, will return 301 Moved Permanently (`issue#21125 <http://tracker.ceph.com/issues/21125>`_, `pr#18305 <https://github.com/ceph/ceph/pull/18305>`_, Shasha Lu, lvshuhua, Jiaying Ren)
-* rgw: null instance mtime incorrect when enable versioning (`issue#21743 <http://tracker.ceph.com/issues/21743>`_, `pr#20262 <https://github.com/ceph/ceph/pull/20262>`_, Shasha Lu)
-* rgw: radosgw-admin: add an option to reset user stats (`issue#23335 <http://tracker.ceph.com/issues/23335>`_, `issue#23322 <http://tracker.ceph.com/issues/23322>`_, `pr#20877 <https://github.com/ceph/ceph/pull/20877>`_, Abhishek Lekshmanan)
-* rgw: release cls lock if taken in RGWCompleteMultipart (`issue#21596 <http://tracker.ceph.com/issues/21596>`_, `issue#22368 <http://tracker.ceph.com/issues/22368>`_, `pr#18116 <https://github.com/ceph/ceph/pull/18116>`_, Casey Bodley, Matt Benjamin)
-* rgw: resharding needs to set back the bucket ACL after link (`issue#22742 <http://tracker.ceph.com/issues/22742>`_, `pr#20039 <https://github.com/ceph/ceph/pull/20039>`_, Orit Wasserman)
-* rgw: resolve Random 500 errors in Swift PutObject (22517) (`issue#22517 <http://tracker.ceph.com/issues/22517>`_, `issue#21560 <http://tracker.ceph.com/issues/21560>`_, `pr#19769 <https://github.com/ceph/ceph/pull/19769>`_, Adam C. Emerson, Matt Benjamin)
-* rgw: rgw_file: recursive lane lock can occur in LRU drain (`issue#20374 <http://tracker.ceph.com/issues/20374>`_, `pr#17149 <https://github.com/ceph/ceph/pull/17149>`_, Matt Benjamin)
-* rgw: S3 POST policy should not require Content-Type (`issue#20201 <http://tracker.ceph.com/issues/20201>`_, `pr#19635 <https://github.com/ceph/ceph/pull/19635>`_, Matt Benjamin)
-* rgw: s3website error handler uses original object name (`issue#23201 <http://tracker.ceph.com/issues/23201>`_, `issue#20307 <http://tracker.ceph.com/issues/20307>`_, `pr#21100 <https://github.com/ceph/ceph/pull/21100>`_, liuhong, Casey Bodley)
-* rgw: segfaults after running radosgw-admin data sync init (`issue#22083 <http://tracker.ceph.com/issues/22083>`_, `pr#19783 <https://github.com/ceph/ceph/pull/19783>`_, Casey Bodley, Abhishek Lekshmanan)
-* rgw: segmentation fault when starting radosgw after reverting .rgw.root (`issue#21996 <http://tracker.ceph.com/issues/21996>`_, `pr#20292 <https://github.com/ceph/ceph/pull/20292>`_, Orit Wasserman, Casey Bodley)
-* rgw: stale bucket index entry remains after object deletion (`issue#22555 <http://tracker.ceph.com/issues/22555>`_, `pr#20293 <https://github.com/ceph/ceph/pull/20293>`_, J. Eric Ivancich)
-* rgw: system user can't delete bucket completely (`issue#22248 <http://tracker.ceph.com/issues/22248>`_, `pr#21212 <https://github.com/ceph/ceph/pull/21212>`_, Casey Bodley)
-* rgw: tcmalloc (`issue#23469 <http://tracker.ceph.com/issues/23469>`_, `pr#21073 <https://github.com/ceph/ceph/pull/21073>`_, Matt Benjamin)
-* rgw: upldate the max-buckets when the quota is uploaded (`issue#22745 <http://tracker.ceph.com/issues/22745>`_, `pr#20496 <https://github.com/ceph/ceph/pull/20496>`_, zhaokun)
-* rgw: user creation can overwrite existing user even if different uid is given (`issue#21685 <http://tracker.ceph.com/issues/21685>`_, `pr#20074 <https://github.com/ceph/ceph/pull/20074>`_, Casey Bodley)
-* RHEL 7.3 Selinux denials at OSD start (`issue#19200 <http://tracker.ceph.com/issues/19200>`_, `pr#18780 <https://github.com/ceph/ceph/pull/18780>`_, Boris Ranto)
-* scrub errors not cleared on replicas can cause inconsistent pg state when replica takes over primary (`issue#23267 <http://tracker.ceph.com/issues/23267>`_, `pr#21194 <https://github.com/ceph/ceph/pull/21194>`_, David Zafman)
-* snapset xattr corruption propagated from primary to other shards (`issue#20186 <http://tracker.ceph.com/issues/20186>`_, `issue#18409 <http://tracker.ceph.com/issues/18409>`_, `issue#21907 <http://tracker.ceph.com/issues/21907>`_, `pr#20331 <https://github.com/ceph/ceph/pull/20331>`_, David Zafman)
-* systemd: Add explicit Before=ceph.target (`issue#21477 <http://tracker.ceph.com/issues/21477>`_, `pr#17841 <https://github.com/ceph/ceph/pull/17841>`_, Tim Serong)
-* table of contents doesn't render for luminous/jewel docs (`issue#23780 <http://tracker.ceph.com/issues/23780>`_, `pr#21503 <https://github.com/ceph/ceph/pull/21503>`_, Alfredo Deza)
-* test: Adjust for Jewel quirk caused of differences with master (`issue#23006 <http://tracker.ceph.com/issues/23006>`_, `pr#20463 <https://github.com/ceph/ceph/pull/20463>`_, David Zafman)
-* test/CMakeLists: disable test_pidfile.sh (`issue#20975 <http://tracker.ceph.com/issues/20975>`_, `pr#20557 <https://github.com/ceph/ceph/pull/20557>`_, Sage Weil)
-* test_health_warnings.sh can fail (`issue#21121 <http://tracker.ceph.com/issues/21121>`_, `pr#20289 <https://github.com/ceph/ceph/pull/20289>`_, Sage Weil)
-* test/librbd: fixed metadata tests under upgrade scenarios (`issue#21911 <http://tracker.ceph.com/issues/21911>`_, `pr#18548 <https://github.com/ceph/ceph/pull/18548>`_, Jason Dillaman)
-* test/librbd: utilize unique pool for cache tier testing (`issue#11502 <http://tracker.ceph.com/issues/11502>`_, `pr#20524 <https://github.com/ceph/ceph/pull/20524>`_, Jason Dillaman)
-* tests: rbd_mirror_helpers.sh request_resync_image function saves image id to wrong variable (`issue#21663 <http://tracker.ceph.com/issues/21663>`_, `pr#19804 <https://github.com/ceph/ceph/pull/19804>`_, Jason Dillaman)
-* tests: test_admin_socket.sh may fail on wait_for_clean (`issue#23499 <http://tracker.ceph.com/issues/23499>`_, `pr#21125 <https://github.com/ceph/ceph/pull/21125>`_, Mykola Golub)
-* tests: tests/librbd: updated test_notify to handle new release lock semantics (`issue#21912 <http://tracker.ceph.com/issues/21912>`_, `pr#18560 <https://github.com/ceph/ceph/pull/18560>`_, Jason Dillaman)
-* tests: unittest_pglog timeout (`issue#23504 <http://tracker.ceph.com/issues/23504>`_, `issue#18030 <http://tracker.ceph.com/issues/18030>`_, `pr#21135 <https://github.com/ceph/ceph/pull/21135>`_, Nathan Cutler, Loic Dachary)
-* tools: ceph-objectstore-tool set-size should clear data-digest (`issue#22112 <http://tracker.ceph.com/issues/22112>`_, `pr#20070 <https://github.com/ceph/ceph/pull/20070>`_, David Zafman)
-* Ubuntu amd64 client can not discover the ubuntu arm64 ceph cluster (`issue#19705 <http://tracker.ceph.com/issues/19705>`_, `pr#18294 <https://github.com/ceph/ceph/pull/18294>`_, Kefu Chai)
-
-
-
-v10.2.10 Jewel
-==============
-
-This point release brings a number of important bugfixes in all major
-components of Ceph, we recommend all Jewel 10.2.x users to upgrade.
-
-For a detailed list of changes refer to :download: `the complete changelog <../changelog/v10.2.10txt>`
-
-
-Notable Changes
------------------
-* build/ops: Add fix subcommand to ceph-disk, fix SELinux denials, and speed up upgrade from non-SELinux enabled ceph to an SELinux enabled one (`issue#20077 <http://tracker.ceph.com/issues/20077>`_, `issue#20184 <http://tracker.ceph.com/issues/20184>`_, `issue#19545 <http://tracker.ceph.com/issues/19545>`_, `pr#14346 <https://github.com/ceph/ceph/pull/14346>`_, Boris Ranto)
-* build/ops: deb: Fix logrotate packaging (`issue#19938 <http://tracker.ceph.com/issues/19938>`_, `pr#15428 <https://github.com/ceph/ceph/pull/15428>`_, Nathan Cutler)
-* build/ops: extended, customizable systemd ceph-disk timeout (`issue#18740 <http://tracker.ceph.com/issues/18740>`_, `pr#15051 <https://github.com/ceph/ceph/pull/15051>`_, Alexey Sheplyakov)
-* build/ops: rpm: fix python-Sphinx package name for SUSE (`issue#19924 <http://tracker.ceph.com/issues/19924>`_, `pr#15196 <https://github.com/ceph/ceph/pull/15196>`_, Nathan Cutler, Jan Matejek)
-* build/ops: rpm: set subman cron attributes in spec file (`issue#20074 <http://tracker.ceph.com/issues/20074>`_, `pr#15473 <https://github.com/ceph/ceph/pull/15473>`_, Thomas Serlin)
-* cephfs: ceph-fuse segfaults at mount time, assert in ceph::log::Log::stop (`issue#18157 <http://tracker.ceph.com/issues/18157>`_, `pr#16963 <https://github.com/ceph/ceph/pull/16963>`_, Greg Farnum)
-* cephfs: df reports negative disk "used" value when quota exceed (`issue#20178 <http://tracker.ceph.com/issues/20178>`_, `pr#16151 <https://github.com/ceph/ceph/pull/16151>`_, John Spray)
-* cephfs: get_quota_root sends lookupname op for every buffered write (`issue#20945 <http://tracker.ceph.com/issues/20945>`_, `pr#17396 <https://github.com/ceph/ceph/pull/17396>`_, Dan van der Ster)
-* cephfs: osdc/Filer: truncate large file party by party (`issue#19755 <http://tracker.ceph.com/issues/19755>`_, `pr#15442 <https://github.com/ceph/ceph/pull/15442>`_, "Yan, Zheng")
-* core: an OSD was seen getting ENOSPC even with osd_failsafe_full_ratio passed (`issue#20544 <http://tracker.ceph.com/issues/20544>`_, `issue#16878 <http://tracker.ceph.com/issues/16878>`_, `issue#19733 <http://tracker.ceph.com/issues/19733>`_, `issue#15912 <http://tracker.ceph.com/issues/15912>`_, `pr#15050 <https://github.com/ceph/ceph/pull/15050>`_, Sage Weil, David Zafman)
-* core: disable skewed utilization warning by default (`issue#20730 <http://tracker.ceph.com/issues/20730>`_, `pr#17210 <https://github.com/ceph/ceph/pull/17210>`_, David Zafman)
-* core: interval_set: optimize intersect_of insert operations (`issue#21229 <http://tracker.ceph.com/issues/21229>`_, `pr#17514 <https://github.com/ceph/ceph/pull/17514>`_, Zac Medico)
-* core: kv: let ceph_logger destructed after db reset (`issue#21336 <http://tracker.ceph.com/issues/21336>`_, `pr#17626 <https://github.com/ceph/ceph/pull/17626>`_, wumingqiao)
-* core: test_envlibrados_for_rocksdb.yaml fails on crypto restart (`issue#19741 <http://tracker.ceph.com/issues/19741>`_, `pr#16293 <https://github.com/ceph/ceph/pull/16293>`_, Kefu Chai)
-* libradosstriper silently fails to delete empty objects in jewel (`issue#20325 <http://tracker.ceph.com/issues/20325>`_, `pr#15760 <https://github.com/ceph/ceph/pull/15760>`_, Stan K)
-* librbd: fail IO request when exclusive lock cannot be obtained (`issue#20168 <http://tracker.ceph.com/issues/20168>`_, `issue#21251 <http://tracker.ceph.com/issues/21251>`_, `pr#17402 <https://github.com/ceph/ceph/pull/17402>`_, Jason Dillaman)
-* librbd: prevent self-blacklisting during break lock (`issue#18666 <http://tracker.ceph.com/issues/18666>`_, `pr#17412 <https://github.com/ceph/ceph/pull/17412>`_, Jason Dillaman)
-* librbd: reacquire lock should update lock owner client id (`issue#19929 <http://tracker.ceph.com/issues/19929>`_, `pr#17385 <https://github.com/ceph/ceph/pull/17385>`_, Jason Dillaman)
-* mds: damage reporting by ino number is useless (`issue#18509 <http://tracker.ceph.com/issues/18509>`_, `issue#16016 <http://tracker.ceph.com/issues/16016>`_, `pr#14699 <https://github.com/ceph/ceph/pull/14699>`_, John Spray, Michal Jarzabek)
-* mds: log rotation doesn't work if mds has respawned (`issue#19291 <http://tracker.ceph.com/issues/19291>`_, `pr#14673 <https://github.com/ceph/ceph/pull/14673>`_, Patrick Donnelly)
-* mds: save  projected path into inode_t::stray_prior_path (`issue#20340 <http://tracker.ceph.com/issues/20340>`_, `pr#16150 <https://github.com/ceph/ceph/pull/16150>`_, "Yan, Zheng")
-* mon: crash on shutdown, lease_ack_timeout event (`issue#19825 <http://tracker.ceph.com/issues/19825>`_, `pr#15083 <https://github.com/ceph/ceph/pull/15083>`_, Kefu Chai, Michal Jarzabek, Alexey Sheplyakov)
-* mon: Disallow enabling 'hashpspool' option to a pool without some kind of --i-understand-this-will-remap-all-pgs flag (`issue#18468 <http://tracker.ceph.com/issues/18468>`_, `pr#13507 <https://github.com/ceph/ceph/pull/13507>`_, Vikhyat Umrao)
-* mon: factor mon_osd_full_ratio into MAX AVAIL calc (`issue#18522 <http://tracker.ceph.com/issues/18522>`_, `pr#15236 <https://github.com/ceph/ceph/pull/15236>`_, Sage Weil)
-* mon: fail to form large quorum; msg/async busy loop (`issue#20230 <http://tracker.ceph.com/issues/20230>`_, `pr#15726 <https://github.com/ceph/ceph/pull/15726>`_, Haomai Wang, Michal Jarzabek)
-* mon: fix force_pg_create pg stuck in creating bug (`issue#18298 <http://tracker.ceph.com/issues/18298>`_, `pr#17008 <https://github.com/ceph/ceph/pull/17008>`_, Alexey Sheplyakov)
-* mon: osd crush set crushmap need sanity check (`issue#19302 <http://tracker.ceph.com/issues/19302>`_, `pr#16144 <https://github.com/ceph/ceph/pull/16144>`_, Loic Dachary)
-* osd: Add heartbeat message for Jumbo Frames (MTU 9000) (`issue#20087 <http://tracker.ceph.com/issues/20087>`_, `issue#20323 <http://tracker.ceph.com/issues/20323>`_, `pr#16059 <https://github.com/ceph/ceph/pull/16059>`_, Piotr Dałek, Sage Weil, Greg Farnum)
-* osd: fix infinite loops in fiemap (`issue#19996 <http://tracker.ceph.com/issues/19996>`_, `pr#15189 <https://github.com/ceph/ceph/pull/15189>`_, Sage Weil, Ning Yao)
-* osd: leaked MOSDMap (`issue#18293 <http://tracker.ceph.com/issues/18293>`_, `pr#14943 <https://github.com/ceph/ceph/pull/14943>`_, Sage Weil)
-* osd: objecter full_try behavior not consistent with osd (`issue#19430 <http://tracker.ceph.com/issues/19430>`_, `pr#15474 <https://github.com/ceph/ceph/pull/15474>`_, Sage Weil)
-* osd: omap threadpool heartbeat is only reset every 100 values (`issue#20375 <http://tracker.ceph.com/issues/20375>`_, `pr#16167 <https://github.com/ceph/ceph/pull/16167>`_, Josh Durgin)
-* osd: osd_internal_types: wake snaptrimmer on put_read lock, too (`issue#19131 <http://tracker.ceph.com/issues/19131>`_, `pr#16015 <https://github.com/ceph/ceph/pull/16015>`_, Sage Weil)
-* osd: PrimaryLogPG: do not call on_shutdown() if (pg.deleting) (`issue#19902 <http://tracker.ceph.com/issues/19902>`_, `pr#15065 <https://github.com/ceph/ceph/pull/15065>`_, Kefu Chai)
-* osd: rados ls on pool with no access returns no error (`issue#20043 <http://tracker.ceph.com/issues/20043>`_, `issue#19790 <http://tracker.ceph.com/issues/19790>`_, `pr#16473 <https://github.com/ceph/ceph/pull/16473>`_, Nathan Cutler, Kefu Chai, John Spray, Sage Weil, Brad Hubbard)
-* osd: ReplicatedPG: solve cache tier osd high memory consumption (`issue#20464 <http://tracker.ceph.com/issues/20464>`_, `pr#16169 <https://github.com/ceph/ceph/pull/16169>`_, Peng Xie)
-* osd: Reset() snaptrimmer on shutdown and do not default-abort on leaked pg refs (`issue#19931 <http://tracker.ceph.com/issues/19931>`_, `pr#15322 <https://github.com/ceph/ceph/pull/15322>`_, Greg Farnum)
-* osd: scrub_to specifies clone ver, but transaction include head write ver (`issue#20041 <http://tracker.ceph.com/issues/20041>`_, `pr#16405 <https://github.com/ceph/ceph/pull/16405>`_, David Zafman)
-* osd: unlock sdata_op_ordering_lock with sdata_lock hold to avoid missing wakeup signal (`issue#20427 <http://tracker.ceph.com/issues/20427>`_, `pr#15947 <https://github.com/ceph/ceph/pull/15947>`_, Alexey Sheplyakov)
-* qa: add a sleep after restarting osd before "tell"ing it (`issue#16239 <http://tracker.ceph.com/issues/16239>`_, `pr#15475 <https://github.com/ceph/ceph/pull/15475>`_, Kefu Chai)
-* rbd: api: is_exclusive_lock_owner shouldn't return -EBUSY (`issue#20182 <http://tracker.ceph.com/issues/20182>`_, `pr#16296 <https://github.com/ceph/ceph/pull/16296>`_, Jason Dillaman)
-* rbd: cli: ensure positional arguments exist before casting (`issue#20185 <http://tracker.ceph.com/issues/20185>`_, `pr#16295 <https://github.com/ceph/ceph/pull/16295>`_, Jason Dillaman)
-* rbd: cli: map with cephx disabled results in error message (`issue#19035 <http://tracker.ceph.com/issues/19035>`_, `pr#16297 <https://github.com/ceph/ceph/pull/16297>`_, Jason Dillaman)
-* rbd: default features should be negotiated with the OSD (`issue#17010 <http://tracker.ceph.com/issues/17010>`_, `pr#14874 <https://github.com/ceph/ceph/pull/14874>`_, Mykola Golub, Jason Dillaman)
-* rbd: Enabling mirroring for a pool with clones may fail (`issue#19798 <http://tracker.ceph.com/issues/19798>`_, `issue#19130 <http://tracker.ceph.com/issues/19130>`_, `pr#14663 <https://github.com/ceph/ceph/pull/14663>`_, Mykola Golub, Jason Dillaman)
-* rbd-mirror: image sync should send NOCACHE advise flag (`issue#17127 <http://tracker.ceph.com/issues/17127>`_, `pr#16285 <https://github.com/ceph/ceph/pull/16285>`_, Mykola Golub)
-* rbd: object-map: batch updates during trim operation (`issue#17356 <http://tracker.ceph.com/issues/17356>`_, `pr#15460 <https://github.com/ceph/ceph/pull/15460>`_, Mykola Golub, Venky Shankar, Nathan Cutler)
-* rbd: Potential IO hang if image is flattened while read request is in-flight (`issue#19832 <http://tracker.ceph.com/issues/19832>`_, `pr#15464 <https://github.com/ceph/ceph/pull/15464>`_, Jason Dillaman)
-* rbd: rbd_clone_copy_on_read ineffective with exclusive-lock (`issue#18888 <http://tracker.ceph.com/issues/18888>`_, `pr#16124 <https://github.com/ceph/ceph/pull/16124>`_, Nathan Cutler, Venky Shankar, Jason Dillaman)
-* rbd: rbd-mirror: ensure missing images are re-synced when detected (`issue#19811 <http://tracker.ceph.com/issues/19811>`_, `pr#15488 <https://github.com/ceph/ceph/pull/15488>`_, Jason Dillaman)
-* rbd: rbd-mirror: failover and failback of unmodified image results in split-brain (`issue#19858 <http://tracker.ceph.com/issues/19858>`_, `pr#14977 <https://github.com/ceph/ceph/pull/14977>`_, Jason Dillaman)
-* rbd: rbd-nbd: kernel reported invalid device size (0, expected 1073741824) (`issue#19871 <http://tracker.ceph.com/issues/19871>`_, `pr#15463 <https://github.com/ceph/ceph/pull/15463>`_, Mykola Golub)
-* rgw: add the remove-x-delete feature to cancel swift object expiration (`issue#19074 <http://tracker.ceph.com/issues/19074>`_, `pr#14659 <https://github.com/ceph/ceph/pull/14659>`_, Jing Wenjun)
-* rgw: aws4: add rgw_s3_auth_aws4_force_boto2_compat conf option (`issue#16463 <http://tracker.ceph.com/issues/16463>`_, `pr#17009 <https://github.com/ceph/ceph/pull/17009>`_, Javier M. Mellid)
-* rgw: bucket index check in radosgw-admin removes valid index (`issue#18470 <http://tracker.ceph.com/issues/18470>`_, `pr#16856 <https://github.com/ceph/ceph/pull/16856>`_, Zhang Shaowen, Pavan Rallabhandi)
-* rgw: cls: ceph::timespan tag_timeout wrong units (`issue#20380 <http://tracker.ceph.com/issues/20380>`_, `pr#16289 <https://github.com/ceph/ceph/pull/16289>`_, Matt Benjamin)
-* rgw: Custom data header support (`issue#19644 <http://tracker.ceph.com/issues/19644>`_, `pr#15966 <https://github.com/ceph/ceph/pull/15966>`_, Pavan Rallabhandi)
-* rgw: datalog trim can't work as expected (`issue#20190 <http://tracker.ceph.com/issues/20190>`_, `pr#16299 <https://github.com/ceph/ceph/pull/16299>`_, Zhang Shaowen)
-* rgw: Delete non-empty bucket in slave zonegroup (`issue#19313 <http://tracker.ceph.com/issues/19313>`_, `pr#15477 <https://github.com/ceph/ceph/pull/15477>`_, Zhang Shaowen)
-* rgw: Do not decrement stats cache when the cache values are zero (`issue#20661 <http://tracker.ceph.com/issues/20661>`_, `issue#20934 <http://tracker.ceph.com/issues/20934>`_, `pr#16720 <https://github.com/ceph/ceph/pull/16720>`_, Aleksei Gutikov, Pavan Rallabhandi)
-* rgw: fix crash caused by shard id out of range when listing data log (`issue#19732 <http://tracker.ceph.com/issues/19732>`_, `pr#15465 <https://github.com/ceph/ceph/pull/15465>`_, redickwang)
-* rgw: fix hangs in RGWRealmReloader::reload on SIGHUP (`issue#20686 <http://tracker.ceph.com/issues/20686>`_, `pr#17281 <https://github.com/ceph/ceph/pull/17281>`_, fang.yuxiang)
-* rgw: fix infinite loop in rest api for log list (`issue#20386 <http://tracker.ceph.com/issues/20386>`_, `pr#15988 <https://github.com/ceph/ceph/pull/15988>`_, xierui, Casey Bodley)
-* rgw: fix race in RGWCompleteMultipart (`issue#20861 <http://tracker.ceph.com/issues/20861>`_, `pr#16767 <https://github.com/ceph/ceph/pull/16767>`_, Abhishek Varshney, Matt Benjamin)
-* rgw: Fix up to 1000 entries at a time in check_bad_index_multipart (`issue#20772 <http://tracker.ceph.com/issues/20772>`_, `pr#16880 <https://github.com/ceph/ceph/pull/16880>`_, Orit Wasserman, Matt Benjamin)
-* rgw: folders starting with _ underscore are not in bucket index (`issue#19432 <http://tracker.ceph.com/issues/19432>`_, `pr#16276 <https://github.com/ceph/ceph/pull/16276>`_, Giovani Rinaldi, Orit Wasserman)
-* rgw: 'gc list --include-all' command infinite loop the first 1000 items (`issue#19978 <http://tracker.ceph.com/issues/19978>`_, `pr#15719 <https://github.com/ceph/ceph/pull/15719>`_, Shasha Lu, fang yuxiang)
-* rgw: meta sync thread crash at RGWMetaSyncShardCR (`issue#20251 <http://tracker.ceph.com/issues/20251>`_, `pr#16711 <https://github.com/ceph/ceph/pull/16711>`_, fang yuxiang, Nathan Cutler)
-* rgw: multipart copy-part remove '/' for s3 java sdk request header (`issue#20075 <http://tracker.ceph.com/issues/20075>`_, `pr#16266 <https://github.com/ceph/ceph/pull/16266>`_, donglingpeng)
-* rgw: multipart parts on versioned bucket create versioned bucket index entries (`issue#19604 <http://tracker.ceph.com/issues/19604>`_, `issue#17964 <http://tracker.ceph.com/issues/17964>`_, `pr#17278 <https://github.com/ceph/ceph/pull/17278>`_, Zhang Shaowen)
-* rgw: multisite: after CreateBucket is forwarded to master, local bucket may use different value for bucket index shards (`issue#19745 <http://tracker.ceph.com/issues/19745>`_, `pr#15450 <https://github.com/ceph/ceph/pull/15450>`_, Shasha Lu)
-* rgw: multisite: bucket zonegroup redirect not working (`issue#19488 <http://tracker.ceph.com/issues/19488>`_, `pr#15448 <https://github.com/ceph/ceph/pull/15448>`_, Casey Bodley)
-* rgw: multisite: fixes for meta sync across periods (`issue#18639 <http://tracker.ceph.com/issues/18639>`_, `pr#15556 <https://github.com/ceph/ceph/pull/15556>`_, Casey Bodley)
-* rgw: multisite: lock is not released when RGWMetaSyncShardCR::full_sync() fails to write marker (`issue#18077 <http://tracker.ceph.com/issues/18077>`_, `pr#17155 <https://github.com/ceph/ceph/pull/17155>`_, Zhang Shaowen)
-* rgw: multisite: log_meta on secondary zone causes continuous loop of metadata sync (`issue#20357 <http://tracker.ceph.com/issues/20357>`_, `issue#20244 <http://tracker.ceph.com/issues/20244>`_, `pr#17148 <https://github.com/ceph/ceph/pull/17148>`_, Orit Wasserman, Casey Bodley)
-* rgw: multisite: memory leak on failed lease in RGWDataSyncShardCR (`issue#19861 <http://tracker.ceph.com/issues/19861>`_, `issue#19834 <http://tracker.ceph.com/issues/19834>`_, `issue#19446 <http://tracker.ceph.com/issues/19446>`_, `pr#15457 <https://github.com/ceph/ceph/pull/15457>`_, Casey Bodley, weiqiaomiao)
-* rgw: multisite: operating bucket's acl&cors is not restricted on slave zone (`issue#16888 <http://tracker.ceph.com/issues/16888>`_, `pr#15453 <https://github.com/ceph/ceph/pull/15453>`_, Casey Bodley, Shasha Lu, Guo Zhandong)
-* rgw: multisite: realm rename does not propagate to other clusters (`issue#19746 <http://tracker.ceph.com/issues/19746>`_, `pr#15454 <https://github.com/ceph/ceph/pull/15454>`_, Casey Bodley)
-* rgw: multisite: rest api fails to decode large period on "period commit" (`issue#19505 <http://tracker.ceph.com/issues/19505>`_, `pr#15447 <https://github.com/ceph/ceph/pull/15447>`_, Casey Bodley)
-* rgw: multisite: RGWPeriodPuller does not call RGWPeriod::reflect() on new period (`issue#19816 <http://tracker.ceph.com/issues/19816>`_, `issue#19817 <http://tracker.ceph.com/issues/19817>`_, `pr#17167 <https://github.com/ceph/ceph/pull/17167>`_, Casey Bodley)
-* rgw: multisite: RGWRadosRemoveOmapKeysCR::request_complete return val is wrong (`issue#20539 <http://tracker.ceph.com/issues/20539>`_, `pr#17156 <https://github.com/ceph/ceph/pull/17156>`_, Shasha Lu)
-* rgw: not initialized pointer cause rgw crash with ec data pool (`issue#20542 <http://tracker.ceph.com/issues/20542>`_, `pr#17164 <https://github.com/ceph/ceph/pull/17164>`_, Aleksei Gutikov, fang yuxiang)
-* rgw: radosgw-admin: bucket rm with --bypass-gc and without --purge-data doesn't throw error message (`issue#20688 <http://tracker.ceph.com/issues/20688>`_, `pr#17159 <https://github.com/ceph/ceph/pull/17159>`_, Abhishek Varshney)
-* rgw: radosgw-admin data sync run crash (`issue#20423 <http://tracker.ceph.com/issues/20423>`_, `pr#17165 <https://github.com/ceph/ceph/pull/17165>`_, Shasha Lu)
-* rgw: radosgw-admin: fix bucket limit check argparse, div(0) (`issue#20966 <http://tracker.ceph.com/issues/20966>`_, `pr#16952 <https://github.com/ceph/ceph/pull/16952>`_, Matt Benjamin)
-* rgw: reduce log level of 'storing entry at' in cls_log (`issue#19835 <http://tracker.ceph.com/issues/19835>`_, `pr#15455 <https://github.com/ceph/ceph/pull/15455>`_, Willem Jan Withagen)
-* rgw: remove unnecessary 'error in read_id for object name: default' (`issue#19922 <http://tracker.ceph.com/issues/19922>`_, `pr#15197 <https://github.com/ceph/ceph/pull/15197>`_, weiqiaomiao)
-* rgw: replace '+' with "%20" in canonical query string for s3 v4 auth (`issue#20501 <http://tracker.ceph.com/issues/20501>`_, `pr#16951 <https://github.com/ceph/ceph/pull/16951>`_, Zhang Shaowen, Matt Benjamin)
-* rgw: rgw_common.cc: modify the end check in RGWHTTPArgs::sys_get (`issue#16072 <http://tracker.ceph.com/issues/16072>`_, `pr#16268 <https://github.com/ceph/ceph/pull/16268>`_, zhao kun)
-* rgw: rgw_file: cannot delete bucket w/uxattrs (`issue#20061 <http://tracker.ceph.com/issues/20061>`_, `issue#20047 <http://tracker.ceph.com/issues/20047>`_, `issue#19214 <http://tracker.ceph.com/issues/19214>`_, `issue#20045 <http://tracker.ceph.com/issues/20045>`_, `pr#15459 <https://github.com/ceph/ceph/pull/15459>`_, Matt Benjamin)
-* rgw: rgw_file: fix size and (c|m)time unix attrs in write_finish (`issue#19653 <http://tracker.ceph.com/issues/19653>`_, `pr#15449 <https://github.com/ceph/ceph/pull/15449>`_, Matt Benjamin)
-* rgw: rgw_file:  incorrect lane lock behavior in evict_block() (`issue#21141 <http://tracker.ceph.com/issues/21141>`_, `pr#17597 <https://github.com/ceph/ceph/pull/17597>`_, Matt Benjamin)
-* rgw: rgw_file: prevent conflict of mkdir between restarts (`issue#20275 <http://tracker.ceph.com/issues/20275>`_, `pr#17147 <https://github.com/ceph/ceph/pull/17147>`_, Gui Hecheng)
-* rgw: rgw_file:  v3 write timer does not close open handles (`issue#19932 <http://tracker.ceph.com/issues/19932>`_, `pr#15456 <https://github.com/ceph/ceph/pull/15456>`_, Matt Benjamin)
-* rgw: Segmentation fault when exporting rgw bucket in nfs-ganesha (`issue#20663 <http://tracker.ceph.com/issues/20663>`_, `pr#17285 <https://github.com/ceph/ceph/pull/17285>`_, Matt Benjamin)
-* rgw: send data-log list infinitely (`issue#20951 <http://tracker.ceph.com/issues/20951>`_, `pr#17287 <https://github.com/ceph/ceph/pull/17287>`_, fang.yuxiang)
-* rgw: set latest object's acl failed (`issue#18649 <http://tracker.ceph.com/issues/18649>`_, `pr#15451 <https://github.com/ceph/ceph/pull/15451>`_, Zhang Shaowen)
-* rgw: Truncated objects (`issue#20107 <http://tracker.ceph.com/issues/20107>`_, `pr#17166 <https://github.com/ceph/ceph/pull/17166>`_, Yehuda Sadeh)
-* rgw: uninitialized memory is accessed during creation of bucket's metadata (`issue#20774 <http://tracker.ceph.com/issues/20774>`_, `pr#17280 <https://github.com/ceph/ceph/pull/17280>`_, Radoslaw Zarzynski)
-* rgw: usage logging on tenated buckets causes invalid memory reads (`issue#20779 <http://tracker.ceph.com/issues/20779>`_, `pr#17279 <https://github.com/ceph/ceph/pull/17279>`_, Radoslaw Zarzynski)
-* rgw: user quota did not work well on multipart upload (`issue#19285 <http://tracker.ceph.com/issues/19285>`_, `issue#19602 <http://tracker.ceph.com/issues/19602>`_, `pr#17277 <https://github.com/ceph/ceph/pull/17277>`_, Zhang Shaowen)
-* rgw: VersionIdMarker and NextVersionIdMarker are not returned when listing object versions (`issue#19886 <http://tracker.ceph.com/issues/19886>`_, `pr#16316 <https://github.com/ceph/ceph/pull/16316>`_, Zhang Shaowen)
-* rgw: when uploading objects continuously into a versioned bucket, some objects will not sync (`issue#18208 <http://tracker.ceph.com/issues/18208>`_, `pr#15452 <https://github.com/ceph/ceph/pull/15452>`_, lvshuhua)
-* tools: ceph cli: Rados object in state configuring race (`issue#16477 <http://tracker.ceph.com/issues/16477>`_, `pr#15762 <https://github.com/ceph/ceph/pull/15762>`_, Loic Dachary)
-* tools: ceph-disk: dmcrypt cluster must default to ceph (`issue#20893 <http://tracker.ceph.com/issues/20893>`_, `pr#16870 <https://github.com/ceph/ceph/pull/16870>`_, Loic Dachary)
-* tools: ceph-disk: don't activate suppressed journal devices (`issue#19489 <http://tracker.ceph.com/issues/19489>`_, `pr#16703 <https://github.com/ceph/ceph/pull/16703>`_, David Disseldorp)
-* tools: ceph-disk: separate ceph-osd --check-needs-\* logs (`issue#19888 <http://tracker.ceph.com/issues/19888>`_, `pr#15503 <https://github.com/ceph/ceph/pull/15503>`_, Loic Dachary)
-* tools: ceph-disk: systemd unit timesout too quickly (`issue#20229 <http://tracker.ceph.com/issues/20229>`_, `pr#17133 <https://github.com/ceph/ceph/pull/17133>`_, Loic Dachary)
-* tools: ceph-disk: Use stdin for 'config-key put' command (`issue#21059 <http://tracker.ceph.com/issues/21059>`_, `pr#17084 <https://github.com/ceph/ceph/pull/17084>`_, Brad Hubbard, Loic Dachary, Sage Weil)
-* tools: libradosstriper processes arbitrary printf placeholders in user input (`issue#20240 <http://tracker.ceph.com/issues/20240>`_, `pr#17574 <https://github.com/ceph/ceph/pull/17574>`_, Stan K)
-
-
-v10.2.9 Jewel
-=============
-
-This point release fixes a regression introduced in v10.2.8.
-
-We recommend that all Jewel users upgrade.
-
-For more detailed information, see :download:`the complete changelog <../changelog/v10.2.9.txt>`.
-
-
-Notable Changes
----------------
-
-* cephfs: Damaged MDS with 10.2.8 (`issue#20599 <http://tracker.ceph.com/issues/20599>`_, `pr#16282 <https://github.com/ceph/ceph/pull/16282>`_, Nathan Cutler)
-
-
-
-v10.2.8 Jewel
-=============
-
-This point release brought a number of important bugfixes in all major
-components of Ceph. However, it also introduced a regression that could cause
-MDS damage, and a new release, v10.2.9, was published to address this.
-Therefore, Jewel users should *not* upgrade to this version - instead, we
-recommend upgrading directly to v10.2.9.
-
-For more detailed information, see :download:`the complete changelog <../changelog/v10.2.8.txt>`.
-
-OSD Removal Caveat
-------------------
-
-There was a bug introduced in Jewel (#19119) that broke the mapping behavior
-when an "out" OSD that still existed in the CRUSH map was removed with 'osd rm'.
-This could result in 'misdirected op' and other errors.  The bug is now fixed,
-but the fix itself introduces the same risk because the behavior may vary between
-clients and OSDs.  To avoid problems, please ensure that all OSDs are removed
-from the CRUSH map before deleting them.  That is, be sure to do::
-
-    ceph osd crush rm osd.123
-
-before::
-
-    ceph osd rm osd.123
-
-Snap Trimmer Improvements
--------------------------
-
-This release greatly improves control and throttling of the snap trimmer. It
-introduces the "osd max trimming pgs" option (defaulting to 2), which limits
-how many PGs on an OSD can be trimming snapshots at a time. And it restores
-the safe use of the "osd snap trim sleep" option, wihch defaults to 0 but
-otherwise adds the given number of seconds in delay between every dispatch
-of trim operations to the underlying system.
-
-Other Notable Changes
----------------------
-
-* build/ops: "osd marked itself down" will not recognised if host runs mon + osd on shutdown/reboot (`issue#18516 <http://tracker.ceph.com/issues/18516>`_, `pr#13492 <https://github.com/ceph/ceph/pull/13492>`_, Boris Ranto)
-* build/ops: ceph-base package missing dependency for psmisc (`issue#19129 <http://tracker.ceph.com/issues/19129>`_, `pr#13786 <https://github.com/ceph/ceph/pull/13786>`_, Nathan Cutler)
-* build/ops: enable build of ceph-resource-agents package on rpm-based os (`issue#17613 <http://tracker.ceph.com/issues/17613>`_, `issue#19546 <http://tracker.ceph.com/issues/19546>`_, `pr#13606 <https://github.com/ceph/ceph/pull/13606>`_, Nathan Cutler)
-* build/ops: rbdmap.service not included in debian packaging (jewel-only) (`issue#19547 <http://tracker.ceph.com/issues/19547>`_, `pr#14383 <https://github.com/ceph/ceph/pull/14383>`_, Ken Dreyer)
-* cephfs: Journaler may execute on_safe contexts prematurely (`issue#20055 <http://tracker.ceph.com/issues/20055>`_, `pr#15468 <https://github.com/ceph/ceph/pull/15468>`_, "Yan, Zheng")
-* cephfs: MDS assert failed when shutting down (`issue#19204 <http://tracker.ceph.com/issues/19204>`_, `pr#14683 <https://github.com/ceph/ceph/pull/14683>`_, John Spray)
-* cephfs: MDS goes readonly writing backtrace for a file whose data pool has been removed (`issue#19401 <http://tracker.ceph.com/issues/19401>`_, `pr#14682 <https://github.com/ceph/ceph/pull/14682>`_, John Spray)
-* cephfs: MDS server crashes due to inconsistent metadata (`issue#19406 <http://tracker.ceph.com/issues/19406>`_, `pr#14676 <https://github.com/ceph/ceph/pull/14676>`_, John Spray)
-* cephfs: No output for ceph mds rmfailed 0 --yes-i-really-mean-it command (`issue#16709 <http://tracker.ceph.com/issues/16709>`_, `pr#14674 <https://github.com/ceph/ceph/pull/14674>`_, John Spray)
-* cephfs: Test failure: test_data_isolated (tasks.cephfs.test_volume_client.TestVolumeClient) (`issue#18914 <http://tracker.ceph.com/issues/18914>`_, `pr#14685 <https://github.com/ceph/ceph/pull/14685>`_, "Yan, Zheng")
-* cephfs: Test failure: test_open_inode (`issue#18661 <http://tracker.ceph.com/issues/18661>`_, `pr#14669 <https://github.com/ceph/ceph/pull/14669>`_, John Spray)
-* cephfs: The mount point break off when mds switch hanppened (`issue#19437 <http://tracker.ceph.com/issues/19437>`_, `pr#14679 <https://github.com/ceph/ceph/pull/14679>`_, Guan yunfei)
-* cephfs: ceph-fuse does not recover after lost connection to MDS (`issue#16743 <http://tracker.ceph.com/issues/16743>`_, `issue#18757 <http://tracker.ceph.com/issues/18757>`_, `pr#14698 <https://github.com/ceph/ceph/pull/14698>`_, Kefu Chai, Henrik Korkuc, Patrick Donnelly)
-* cephfs: client: fix the cross-quota rename boundary check conditions (`issue#18699 <http://tracker.ceph.com/issues/18699>`_, `pr#14667 <https://github.com/ceph/ceph/pull/14667>`_, Greg Farnum)
-* cephfs: mds is crushed, after I set about 400 64KB xattr kv pairs to a file (`issue#19033 <http://tracker.ceph.com/issues/19033>`_, `pr#14684 <https://github.com/ceph/ceph/pull/14684>`_, Yang Honggang)
-* cephfs: non-local quota changes not visible until some IO is done (`issue#17939 <http://tracker.ceph.com/issues/17939>`_, `pr#15466 <https://github.com/ceph/ceph/pull/15466>`_, John Spray, Nathan Cutler)
-* cephfs: normalize file open flags internally used by cephfs (`issue#18872 <http://tracker.ceph.com/issues/18872>`_, `issue#19890 <http://tracker.ceph.com/issues/19890>`_, `pr#15000 <https://github.com/ceph/ceph/pull/15000>`_, Jan Fajerski, "Yan, Zheng")
-* common: monitor creation with IPv6 public network segfaults (`issue#19371 <http://tracker.ceph.com/issues/19371>`_, `pr#14324 <https://github.com/ceph/ceph/pull/14324>`_, Fabian Grünbichler)
-* common: radosstriper: protect aio_write API from calls with 0 bytes (`issue#14609 <http://tracker.ceph.com/issues/14609>`_, `pr#13254 <https://github.com/ceph/ceph/pull/13254>`_, Sebastien Ponce)
-* core: Objecter::epoch_barrier isn't respected in _op_submit() (`issue#19396 <http://tracker.ceph.com/issues/19396>`_, `pr#14332 <https://github.com/ceph/ceph/pull/14332>`_, Ilya Dryomov)
-* core: clear divergent_priors set off disk (`issue#17916 <http://tracker.ceph.com/issues/17916>`_, `pr#14596 <https://github.com/ceph/ceph/pull/14596>`_, Greg Farnum)
-* core: improve snap trimming, enable restriction of parallelism (`issue#19241 <http://tracker.ceph.com/issues/19241>`_, `pr#14492 <https://github.com/ceph/ceph/pull/14492>`_, Samuel Just, Greg Farnum)
-* core: os/filestore/HashIndex: be loud about splits (`issue#18235 <http://tracker.ceph.com/issues/18235>`_, `pr#13788 <https://github.com/ceph/ceph/pull/13788>`_, Dan van der Ster)
-* core: os/filestore: fix clang static check warn use-after-free (`issue#19311 <http://tracker.ceph.com/issues/19311>`_, `pr#14044 <https://github.com/ceph/ceph/pull/14044>`_, liuchang0812, yaoning)
-* core: transient jerasure unit test failures (`issue#18070 <http://tracker.ceph.com/issues/18070>`_, `issue#17762 <http://tracker.ceph.com/issues/17762>`_, `issue#18128 <http://tracker.ceph.com/issues/18128>`_, `issue#17951 <http://tracker.ceph.com/issues/17951>`_, `pr#14701 <https://github.com/ceph/ceph/pull/14701>`_, Kefu Chai, Pan Liu, Loic Dachary, Jason Dillaman)
-* core: two instances of omap_digest mismatch (`issue#18533 <http://tracker.ceph.com/issues/18533>`_, `pr#14204 <https://github.com/ceph/ceph/pull/14204>`_, Samuel Just, David Zafman)
-* doc: Improvements to crushtool manpage (`issue#19649 <http://tracker.ceph.com/issues/19649>`_, `pr#14635 <https://github.com/ceph/ceph/pull/14635>`_, Loic Dachary, Nathan Cutler)
-* doc: PendingReleaseNotes: note about 19119 (`issue#19119 <http://tracker.ceph.com/issues/19119>`_, `pr#13732 <https://github.com/ceph/ceph/pull/13732>`_, Sage Weil)
-* doc: admin ops: fix the quota section (`issue#19397 <http://tracker.ceph.com/issues/19397>`_, `pr#14654 <https://github.com/ceph/ceph/pull/14654>`_, Chu, Hua-Rong)
-* doc: radosgw-admin: add the 'object stat' command to usage (`issue#19013 <http://tracker.ceph.com/issues/19013>`_, `pr#13872 <https://github.com/ceph/ceph/pull/13872>`_, Pavan Rallabhandi)
-* doc: rgw S3 create bucket should not do response in json (`issue#18889 <http://tracker.ceph.com/issues/18889>`_, `pr#13874 <https://github.com/ceph/ceph/pull/13874>`_, Abhishek Lekshmanan)
-* fs: Invalid error code returned by MDS is causing a kernel client WARNING (`issue#19205 <http://tracker.ceph.com/issues/19205>`_, `pr#13831 <https://github.com/ceph/ceph/pull/13831>`_, Jan Fajerski, xie xingguo)
-* librbd: Incomplete declaration for ContextWQ in librbd/Journal.h (`issue#18862 <http://tracker.ceph.com/issues/18862>`_, `pr#14152 <https://github.com/ceph/ceph/pull/14152>`_, Boris Ranto)
-* librbd: Issues with C API image metadata retrieval functions (`issue#19588 <http://tracker.ceph.com/issues/19588>`_, `pr#14666 <https://github.com/ceph/ceph/pull/14666>`_, Mykola Golub)
-* librbd: Possible deadlock performing a synchronous API action while refresh in-progress (`issue#18419 <http://tracker.ceph.com/issues/18419>`_, `pr#13154 <https://github.com/ceph/ceph/pull/13154>`_, Jason Dillaman)
-* librbd: is_exclusive_lock_owner API should ping OSD (`issue#19287 <http://tracker.ceph.com/issues/19287>`_, `pr#14481 <https://github.com/ceph/ceph/pull/14481>`_, Jason Dillaman)
-* librbd: remove image header lock assertions (`issue#18244 <http://tracker.ceph.com/issues/18244>`_, `pr#13809 <https://github.com/ceph/ceph/pull/13809>`_, Jason Dillaman)
-* mds: C_MDSInternalNoop::complete doesn't free itself (`issue#19501 <http://tracker.ceph.com/issues/19501>`_, `pr#14677 <https://github.com/ceph/ceph/pull/14677>`_, "Yan, Zheng")
-* mds: Too many stat ops when trying to probe a large file (`issue#19955 <http://tracker.ceph.com/issues/19955>`_, `pr#15472 <https://github.com/ceph/ceph/pull/15472>`_, "Yan, Zheng")
-* mds: avoid reusing deleted inode in StrayManager::_purge_stray_logged (`issue#18877 <http://tracker.ceph.com/issues/18877>`_, `pr#14670 <https://github.com/ceph/ceph/pull/14670>`_, Zhi Zhang)
-* mds: enable start when session ino info is corrupt (`issue#19708 <http://tracker.ceph.com/issues/19708>`_, `issue#16842 <http://tracker.ceph.com/issues/16842>`_, `pr#14700 <https://github.com/ceph/ceph/pull/14700>`_, John Spray)
-* mds: fragment space check can cause replayed request fail (`issue#18660 <http://tracker.ceph.com/issues/18660>`_, `pr#14668 <https://github.com/ceph/ceph/pull/14668>`_, "Yan, Zheng")
-* mds: heartbeat timeout during rejoin, when working with large amount of caps/inodes (`issue#19118 <http://tracker.ceph.com/issues/19118>`_, `pr#14672 <https://github.com/ceph/ceph/pull/14672>`_, John Spray)
-* mds: issue new caps when sending reply to client (`issue#19635 <http://tracker.ceph.com/issues/19635>`_, `pr#15438 <https://github.com/ceph/ceph/pull/15438>`_, "Yan, Zheng")
-* mon: OSDMonitor: make 'osd crush move ...' work on osds (`issue#18587 <http://tracker.ceph.com/issues/18587>`_, `pr#13261 <https://github.com/ceph/ceph/pull/13261>`_, Sage Weil)
-* mon: fix 'sortbitwise' warning on jewel (`issue#20578 <http://tracker.ceph.com/issues/20578>`_, `pr#15208 <https://github.com/ceph/ceph/pull/15208>`_, huanwen ren, Sage Weil)
-* mon: make get_mon_log_message() atomic (`issue#19427 <http://tracker.ceph.com/issues/19427>`_, `pr#14587 <https://github.com/ceph/ceph/pull/14587>`_, Kefu Chai)
-* mon: remove bad rocksdb option (`issue#19392 <http://tracker.ceph.com/issues/19392>`_, `pr#14236 <https://github.com/ceph/ceph/pull/14236>`_, Sage Weil)
-* msg: IPv6 Heartbeat packets are not marked with DSCP QoS - simple messenger (`issue#18887 <http://tracker.ceph.com/issues/18887>`_, `pr#13450 <https://github.com/ceph/ceph/pull/13450>`_, Yan Jun, Robin H. Johnson)
-* msg: set close on exec flag (`issue#16390 <http://tracker.ceph.com/issues/16390>`_, `pr#13585 <https://github.com/ceph/ceph/pull/13585>`_, Kefu Chai)
-* osd: --flush-journal: sporadic segfaults on exit (`issue#18820 <http://tracker.ceph.com/issues/18820>`_, `pr#13477 <https://github.com/ceph/ceph/pull/13477>`_, Alexey Sheplyakov)
-* osd: Give requested scrubs a higher priority (`issue#15789 <http://tracker.ceph.com/issues/15789>`_, `pr#14686 <https://github.com/ceph/ceph/pull/14686>`_, David Zafman)
-* osd: Implement asynchronous scrub sleep (`issue#19986 <http://tracker.ceph.com/issues/19986>`_, `issue#19497 <http://tracker.ceph.com/issues/19497>`_, `pr#15529 <https://github.com/ceph/ceph/pull/15529>`_, Brad Hubbard)
-* osd: Object level shard errors are tracked and used if no auth available (`issue#20089 <http://tracker.ceph.com/issues/20089>`_, `pr#15416 <https://github.com/ceph/ceph/pull/15416>`_, David Zafman)
-* osd: ReplicatedPG: try with pool's use-gmt setting if hitset archive not found (`issue#19185 <http://tracker.ceph.com/issues/19185>`_, `pr#13827 <https://github.com/ceph/ceph/pull/13827>`_, Kefu Chai)
-* osd: allow client throttler to be adjusted on-fly, without restart (`issue#18791 <http://tracker.ceph.com/issues/18791>`_, `pr#13214 <https://github.com/ceph/ceph/pull/13214>`_, Piotr Dałek)
-* osd: bypass readonly ops when osd full (`issue#19394 <http://tracker.ceph.com/issues/19394>`_, `pr#14181 <https://github.com/ceph/ceph/pull/14181>`_, Jianpeng Ma, yaoning)
-* osd: degraded and misplaced status output inaccurate (`issue#18619 <http://tracker.ceph.com/issues/18619>`_, `pr#14325 <https://github.com/ceph/ceph/pull/14325>`_, David Zafman)
-* osd: new added OSD always down when full flag is set (`issue#15025 <http://tracker.ceph.com/issues/15025>`_, `pr#14326 <https://github.com/ceph/ceph/pull/14326>`_, Mingxin Liu)
-* osd: pg_pool_t::encode(): be compatible with Hammer <= 0.94.6 (`issue#19508 <http://tracker.ceph.com/issues/19508>`_, `pr#14392 <https://github.com/ceph/ceph/pull/14392>`_, Alexey Sheplyakov)
-* osd: pre-jewel "osd rm" incrementals are misinterpreted (`issue#19119 <http://tracker.ceph.com/issues/19119>`_, `pr#13884 <https://github.com/ceph/ceph/pull/13884>`_, Ilya Dryomov)
-* osd: preserve allocation hint attribute during recovery (`issue#19083 <http://tracker.ceph.com/issues/19083>`_, `pr#13647 <https://github.com/ceph/ceph/pull/13647>`_, yaoning)
-* osd: promote throttle parameters are reversed (`issue#19773 <http://tracker.ceph.com/issues/19773>`_, `pr#14791 <https://github.com/ceph/ceph/pull/14791>`_, Mark Nelson)
-* osd: reindex properly on pg log split (`issue#18975 <http://tracker.ceph.com/issues/18975>`_, `pr#14047 <https://github.com/ceph/ceph/pull/14047>`_, Alexey Sheplyakov)
-* osd: restrict want_acting to up+acting on recovery completion (`issue#18929 <http://tracker.ceph.com/issues/18929>`_, `pr#13541 <https://github.com/ceph/ceph/pull/13541>`_, Sage Weil)
-* rbd-nbd: check /sys/block/nbdX/size to ensure kernel mapped correctly (`issue#18335 <http://tracker.ceph.com/issues/18335>`_, `pr#13932 <https://github.com/ceph/ceph/pull/13932>`_, Mykola Golub, Alexey Sheplyakov)
-* rbd: [api] temporarily restrict (rbd\_)mirror_peer_add from adding multiple peers (`issue#19256 <http://tracker.ceph.com/issues/19256>`_, `pr#14664 <https://github.com/ceph/ceph/pull/14664>`_, Jason Dillaman)
-* rbd: qemu crash triggered by network issues (`issue#18436 <http://tracker.ceph.com/issues/18436>`_, `pr#13244 <https://github.com/ceph/ceph/pull/13244>`_, Jason Dillaman)
-* rbd: rbd --pool=x rename y z does not work (`issue#18326 <http://tracker.ceph.com/issues/18326>`_, `pr#14148 <https://github.com/ceph/ceph/pull/14148>`_, Gaurav Kumar Garg)
-* rbd: systemctl stop rbdmap unmaps all rbds and not just the ones in /etc/ceph/rbdmap (`issue#18884 <http://tracker.ceph.com/issues/18884>`_, `issue#18262 <http://tracker.ceph.com/issues/18262>`_, `pr#14083 <https://github.com/ceph/ceph/pull/14083>`_, David Disseldorp, Nathan Cutler)
-* rgw: "cluster [WRN] bad locator @X on object @X...." in cluster log (`issue#18980 <http://tracker.ceph.com/issues/18980>`_, `pr#14064 <https://github.com/ceph/ceph/pull/14064>`_, Casey Bodley)
-* rgw: 'radosgw-admin sync status' on master zone of non-master zonegroup (`issue#18091 <http://tracker.ceph.com/issues/18091>`_, `pr#13779 <https://github.com/ceph/ceph/pull/13779>`_, Jing Wenjun)
-* rgw: Change loglevel to 20 for 'System already converted' message (`issue#18919 <http://tracker.ceph.com/issues/18919>`_, `pr#13834 <https://github.com/ceph/ceph/pull/13834>`_, Vikhyat Umrao)
-* rgw: Use decoded URI when verifying TempURL (`issue#18590 <http://tracker.ceph.com/issues/18590>`_, `pr#13724 <https://github.com/ceph/ceph/pull/13724>`_, Alexey Sheplyakov)
-* rgw: a few cases where rgw_obj is incorrectly initialized (`issue#19096 <http://tracker.ceph.com/issues/19096>`_, `pr#13842 <https://github.com/ceph/ceph/pull/13842>`_, Yehuda Sadeh)
-* rgw: add apis to support ragweed suite (`issue#19804 <http://tracker.ceph.com/issues/19804>`_, `pr#14851 <https://github.com/ceph/ceph/pull/14851>`_, Yehuda Sadeh)
-* rgw: add bucket size limit check to radosgw-admin (`issue#17925 <http://tracker.ceph.com/issues/17925>`_, `pr#14787 <https://github.com/ceph/ceph/pull/14787>`_, Matt Benjamin)
-* rgw: allow system users to read SLO parts (`issue#19027 <http://tracker.ceph.com/issues/19027>`_, `pr#14752 <https://github.com/ceph/ceph/pull/14752>`_, Casey Bodley)
-* rgw: don't return skew time in pre-signed url (`issue#18828 <http://tracker.ceph.com/issues/18828>`_, `issue#18829 <http://tracker.ceph.com/issues/18829>`_, `pr#14605 <https://github.com/ceph/ceph/pull/14605>`_, liuchang0812)
-* rgw: failure to create s3 type subuser from admin rest api (`issue#16682 <http://tracker.ceph.com/issues/16682>`_, `pr#14815 <https://github.com/ceph/ceph/pull/14815>`_, snakeAngel2015)
-* rgw: fix break inside of yield in RGWFetchAllMetaCR (`issue#17655 <http://tracker.ceph.com/issues/17655>`_, `pr#14066 <https://github.com/ceph/ceph/pull/14066>`_, Casey Bodley)
-* rgw: fix failed to create bucket if a non-master zonegroup has a single zone (`issue#19756 <http://tracker.ceph.com/issues/19756>`_, `pr#14766 <https://github.com/ceph/ceph/pull/14766>`_, weiqiaomiao)
-* rgw: health check errors out incorrectly (`issue#19025 <http://tracker.ceph.com/issues/19025>`_, `pr#13865 <https://github.com/ceph/ceph/pull/13865>`_, Pavan Rallabhandi)
-* rgw: list_plain_entries() stops before bi_log entries (`issue#19876 <http://tracker.ceph.com/issues/19876>`_, `pr#15383 <https://github.com/ceph/ceph/pull/15383>`_, Casey Bodley)
-* rgw: multisite: fetch_remote_obj() gets wrong version when copying from remote (`issue#19599 <http://tracker.ceph.com/issues/19599>`_, `pr#14607 <https://github.com/ceph/ceph/pull/14607>`_, Zhang Shaowen, Casey Bodley)
-* rgw: multisite: some yields in RGWMetaSyncShardCR::full_sync() resume in incremental_sync() (`issue#18076 <http://tracker.ceph.com/issues/18076>`_, `pr#13837 <https://github.com/ceph/ceph/pull/13837>`_, Casey Bodley, Abhishek Lekshmanan)
-* rgw: only append zonegroups to rest params if not empty (`issue#20078 <http://tracker.ceph.com/issues/20078>`_, `pr#15312 <https://github.com/ceph/ceph/pull/15312>`_, Yehuda Sadeh, Karol Mroz)
-* rgw: pullup civet chunked (`issue#19736 <http://tracker.ceph.com/issues/19736>`_, `pr#14776 <https://github.com/ceph/ceph/pull/14776>`_, Matt Benjamin)
-* rgw: rgw_file: fix event expire check, don't expire directories being read (`issue#19623 <http://tracker.ceph.com/issues/19623>`_, `issue#19270 <http://tracker.ceph.com/issues/19270>`_, `issue#19625 <http://tracker.ceph.com/issues/19625>`_, `issue#19624 <http://tracker.ceph.com/issues/19624>`_, `issue#19634 <http://tracker.ceph.com/issues/19634>`_, `issue#19435 <http://tracker.ceph.com/issues/19435>`_, `pr#14653 <https://github.com/ceph/ceph/pull/14653>`_, Gui Hecheng, Matt Benjamin)
-* rgw: swift: disable revocation thread under certain circumstances (`issue#19499 <http://tracker.ceph.com/issues/19499>`_, `issue#9493 <http://tracker.ceph.com/issues/9493>`_, `pr#14789 <https://github.com/ceph/ceph/pull/14789>`_, Marcus Watts)
-* rgw: the swift container acl does not support field .ref (`issue#18484 <http://tracker.ceph.com/issues/18484>`_, `pr#13833 <https://github.com/ceph/ceph/pull/13833>`_, Jing Wenjun)
-* rgw: typo in rgw_admin.cc (`issue#19026 <http://tracker.ceph.com/issues/19026>`_, `pr#13863 <https://github.com/ceph/ceph/pull/13863>`_, Ronak Jain)
-* rgw: unsafe access in RGWListBucket_ObjStore_SWIFT::send_response() (`issue#19249 <http://tracker.ceph.com/issues/19249>`_, `pr#14661 <https://github.com/ceph/ceph/pull/14661>`_, Yehuda Sadeh)
-* rgw: upgrade to multisite v2 fails if there is a zone without zone info (`issue#19231 <http://tracker.ceph.com/issues/19231>`_, `pr#14136 <https://github.com/ceph/ceph/pull/14136>`_, Danny Al-Gaaf, Orit Wasserman)
-* rgw: use separate http_manager for read_sync_status (`issue#19236 <http://tracker.ceph.com/issues/19236>`_, `pr#14195 <https://github.com/ceph/ceph/pull/14195>`_, Casey Bodley, Shasha Lu)
-* rgw: when converting region_map we need to use rgw_zone_root_pool (`issue#19195 <http://tracker.ceph.com/issues/19195>`_, `pr#14143 <https://github.com/ceph/ceph/pull/14143>`_, Orit Wasserman)
-* rgw: zonegroupmap set does not work (`issue#19498 <http://tracker.ceph.com/issues/19498>`_, `issue#18725 <http://tracker.ceph.com/issues/18725>`_, `pr#14660 <https://github.com/ceph/ceph/pull/14660>`_, Orit Wasserman, Casey Bodley)
-* rgw:fix memory leaks in data/md sync (`issue#20088 <http://tracker.ceph.com/issues/20088>`_, `pr#15382 <https://github.com/ceph/ceph/pull/15382>`_, weiqiaomiao)
-* tests: 'ceph auth import -i' overwrites caps, should alert user before overwrite (`issue#18932 <http://tracker.ceph.com/issues/18932>`_, `pr#13544 <https://github.com/ceph/ceph/pull/13544>`_, Vikhyat Umrao)
-* tests: New upgrade test for #19508 (`issue#19829 <http://tracker.ceph.com/issues/19829>`_, `issue#19508 <http://tracker.ceph.com/issues/19508>`_, `pr#14930 <https://github.com/ceph/ceph/pull/14930>`_, Nathan Cutler)
-* tests: [  FAILED  ] TestLibRBD.ImagePollIO in upgrade:client-upgrade-kraken-distro-basic-smithi (`issue#18617 <http://tracker.ceph.com/issues/18617>`_, `pr#13107 <https://github.com/ceph/ceph/pull/13107>`_, Jason Dillaman)
-* tests: [librados_test_stub] cls_cxx_map_get_XYZ methods don't return correct value (`issue#19597 <http://tracker.ceph.com/issues/19597>`_, `pr#14665 <https://github.com/ceph/ceph/pull/14665>`_, Jason Dillaman)
-* tests: additional rbd-mirror test stability improvements (`issue#18935 <http://tracker.ceph.com/issues/18935>`_, `pr#14154 <https://github.com/ceph/ceph/pull/14154>`_, Jason Dillaman)
-* tests: api_misc: [  FAILED  ] LibRadosMiscConnectFailure.ConnectFailure (`issue#15368 <http://tracker.ceph.com/issues/15368>`_, `pr#14763 <https://github.com/ceph/ceph/pull/14763>`_, Sage Weil)
-* tests: buffer overflow in test LibCephFS.DirLs (`issue#18941 <http://tracker.ceph.com/issues/18941>`_, `pr#14671 <https://github.com/ceph/ceph/pull/14671>`_, "Yan, Zheng")
-* tests: clone workunit using the branch specified by task (`issue#19429 <http://tracker.ceph.com/issues/19429>`_, `pr#14371 <https://github.com/ceph/ceph/pull/14371>`_, Kefu Chai, Dan Mick)
-* tests: drop upgrade/hammer-jewel-x (`issue#20574 <http://tracker.ceph.com/issues/20574>`_, `pr#15933 <https://github.com/ceph/ceph/pull/15933>`_, Nathan Cutler)
-* tests: dummy suite fails in OpenStack (`issue#18259 <http://tracker.ceph.com/issues/18259>`_, `pr#14070 <https://github.com/ceph/ceph/pull/14070>`_, Nathan Cutler)
-* tests: eliminate race condition in Thrasher constructor (`issue#18799 <http://tracker.ceph.com/issues/18799>`_, `pr#13608 <https://github.com/ceph/ceph/pull/13608>`_, Nathan Cutler)
-* tests: enable quotas for pre-luminous quota tests (`issue#20412 <http://tracker.ceph.com/issues/20412>`_, `pr#15936 <https://github.com/ceph/ceph/pull/15936>`_, Patrick Donnelly)
-* tests: fix oversight in yaml comment (`issue#20581 <http://tracker.ceph.com/issues/20581>`_, `pr#14449 <https://github.com/ceph/ceph/pull/14449>`_, Nathan Cutler)
-* tests: move swift.py task from teuthology to ceph, phase one (jewel) (`issue#20392 <http://tracker.ceph.com/issues/20392>`_, `pr#15870 <https://github.com/ceph/ceph/pull/15870>`_, Nathan Cutler, Sage Weil, Warren Usui, Greg Farnum, Ali Maredia, Tommi Virtanen, Zack Cerza, Sam Lang, Yehuda Sadeh, Joe Buck, Josh Durgin)
-* tests: qa/Fixed upgrade sequence to 10.2.0 -> 10.2.7 -> latest -x (10.2.8) (`issue#20572 <http://tracker.ceph.com/issues/20572>`_, `pr#16089 <https://github.com/ceph/ceph/pull/16089>`_, Yuri Weinstein)
-* tests: qa/suites/upgrade/hammer-x: set "sortbitwise" for jewel clusters (`issue#20342 <http://tracker.ceph.com/issues/20342>`_, `pr#15842 <https://github.com/ceph/ceph/pull/15842>`_, Nathan Cutler)
-* tests: qa/workunits/rados/test-upgrade-\*: whitelist tests for master (part 1) (`issue#20577 <http://tracker.ceph.com/issues/20577>`_, `pr#15360 <https://github.com/ceph/ceph/pull/15360>`_, Sage Weil)
-* tests: qa/workunits/rados/test-upgrade-\*: whitelist tests for master (part 2) (`issue#20576 <http://tracker.ceph.com/issues/20576>`_, `pr#15778 <https://github.com/ceph/ceph/pull/15778>`_, Kefu Chai)
-* tests: qa/workunits/rados/test-upgrade-\*: whitelist tests the right way (`issue#20575 <http://tracker.ceph.com/issues/20575>`_, `pr#15824 <https://github.com/ceph/ceph/pull/15824>`_, Kefu Chai)
-* tests: rados: sleep before ceph tell osd.0 flush_pg_stats after restart (`issue#16239 <http://tracker.ceph.com/issues/16239>`_, `issue#20489 <http://tracker.ceph.com/issues/20489>`_, `pr#14710 <https://github.com/ceph/ceph/pull/14710>`_, Kefu Chai, Nathan Cutler)
-* tests: run upgrade/client-upgrade on latest CentOS 7.3 (`issue#20573 <http://tracker.ceph.com/issues/20573>`_, `pr#16088 <https://github.com/ceph/ceph/pull/16088>`_, Nathan Cutler)
-* tests: run-rbd-unit-tests.sh assert in lockdep_will_lock, TestLibRBD.ObjectMapConsistentSnap (`issue#17447 <http://tracker.ceph.com/issues/17447>`_, `pr#14150 <https://github.com/ceph/ceph/pull/14150>`_, Jason Dillaman)
-* tests: systemd test backport to jewel (`issue#19717 <http://tracker.ceph.com/issues/19717>`_, `pr#14694 <https://github.com/ceph/ceph/pull/14694>`_, Vasu Kulkarni)
-* tests: test/librados/tmap_migrate: g_ceph_context->put() upon return (`issue#20579 <http://tracker.ceph.com/issues/20579>`_, `pr#14809 <https://github.com/ceph/ceph/pull/14809>`_, Kefu Chai)
-* tests: test_notify.py: rbd.InvalidArgument: error updating features for image test_notify_clone2 (`issue#19692 <http://tracker.ceph.com/issues/19692>`_, `pr#14680 <https://github.com/ceph/ceph/pull/14680>`_, Jason Dillaman)
-* tests: upgrade/hammer-x failing with OSD has the store locked when Thrasher runs ceph-objectstore-tool on down PG (`issue#19556 <http://tracker.ceph.com/issues/19556>`_, `pr#14416 <https://github.com/ceph/ceph/pull/14416>`_, Nathan Cutler)
-* tests: upgrade:hammer-x/stress-split-erasure-code-x86_64 fails in 10.2.8 integration testing (`issue#20413 <http://tracker.ceph.com/issues/20413>`_, `pr#15904 <https://github.com/ceph/ceph/pull/15904>`_, Nathan Cutler)
-* tools: brag fails to count "in" mds (`issue#19192 <http://tracker.ceph.com/issues/19192>`_, `pr#14112 <https://github.com/ceph/ceph/pull/14112>`_, Oleh Prypin, Peng Zhang)
-* tools: ceph-disk does not support cluster names different than 'ceph' (`issue#17821 <http://tracker.ceph.com/issues/17821>`_, `pr#14765 <https://github.com/ceph/ceph/pull/14765>`_, Loic Dachary)
-* tools: ceph-disk: Racing between partition creation and device node creation (`issue#19428 <http://tracker.ceph.com/issues/19428>`_, `pr#14329 <https://github.com/ceph/ceph/pull/14329>`_, Erwan Velu)
-* tools: ceph-disk: bluestore --setgroup incorrectly set with user (`issue#18955 <http://tracker.ceph.com/issues/18955>`_, `pr#13489 <https://github.com/ceph/ceph/pull/13489>`_, craigchi)
-* tools: ceph-disk: ceph-disk list reports mount error for OSD having mount options with SELinux context (`issue#17331 <http://tracker.ceph.com/issues/17331>`_, `pr#14402 <https://github.com/ceph/ceph/pull/14402>`_, Brad Hubbard)
-* tools: ceph-disk: do not setup_statedir on trigger (`issue#19941 <http://tracker.ceph.com/issues/19941>`_, `pr#15504 <https://github.com/ceph/ceph/pull/15504>`_, Loic Dachary)
-* tools: ceph-disk: enable directory backed OSD at boot time (`issue#19628 <http://tracker.ceph.com/issues/19628>`_, `pr#14602 <https://github.com/ceph/ceph/pull/14602>`_, Loic Dachary)
-* tools: rados: RadosImport::import should return an error if Rados::connect fails (`issue#19319 <http://tracker.ceph.com/issues/19319>`_, `pr#14113 <https://github.com/ceph/ceph/pull/14113>`_, Brad Hubbard)
-
-
-v10.2.7 Jewel
-=============
-
-This point release fixes several important bugs in RBD mirroring, librbd &  RGW.
-
-We recommend that all v10.2.x users upgrade.
-
-For more detailed information, see :download:`the complete changelog <../changelog/v10.2.7.txt>`.
-
-
-Notable Changes
----------------
-
-* librbd: possible race in ExclusiveLock handle_peer_notification (`issue#19368 <http://tracker.ceph.com/issues/19368>`_, `pr#14233 <https://github.com/ceph/ceph/pull/14233>`_, Mykola Golub)
-* osd: Increase priority for inactive PGs backfill (`issue#18350 <http://tracker.ceph.com/issues/18350>`_, `pr#13232 <https://github.com/ceph/ceph/pull/13232>`_, Bartłomiej Święcki)
-* osd: Scrub improvements and other fixes (`issue#17857 <http://tracker.ceph.com/issues/17857>`_, `issue#18114 <http://tracker.ceph.com/issues/18114>`_, `issue#13937 <http://tracker.ceph.com/issues/13937>`_, `issue#18113 <http://tracker.ceph.com/issues/18113>`_, `pr#13146 <https://github.com/ceph/ceph/pull/13146>`_, Kefu Chai, David Zafman)
-* osd: fix OSD network address in OSD heartbeat_check log message (`issue#18657 <http://tracker.ceph.com/issues/18657>`_, `pr#13108 <https://github.com/ceph/ceph/pull/13108>`_, Vikhyat Umrao)
-* rbd-mirror: deleting a snapshot during sync can result in read errors (`issue#18990 <http://tracker.ceph.com/issues/18990>`_, `pr#13596 <https://github.com/ceph/ceph/pull/13596>`_, Jason Dillaman)
-* rgw: 'period update' does not remove short_zone_ids of deleted zones (`issue#15618 <http://tracker.ceph.com/issues/15618>`_, `pr#14140 <https://github.com/ceph/ceph/pull/14140>`_, Casey Bodley)
-* rgw: DUMPABLE flag is cleared by setuid preventing coredumps (`issue#19089 <http://tracker.ceph.com/issues/19089>`_, `pr#13844 <https://github.com/ceph/ceph/pull/13844>`_, Brad Hubbard)
-* rgw: clear data_sync_cr if RGWDataSyncControlCR fails (`issue#17569 <http://tracker.ceph.com/issues/17569>`_, `pr#13886 <https://github.com/ceph/ceph/pull/13886>`_, Casey Bodley)
-* rgw: fix openssl (`issue#11239 <http://tracker.ceph.com/issues/11239>`_, `issue#19098 <http://tracker.ceph.com/issues/19098>`_, `issue#16535 <http://tracker.ceph.com/issues/16535>`_, `pr#14215 <https://github.com/ceph/ceph/pull/14215>`_, Marcus Watts)
-* rgw: fix swift cannot disable object versioning with empty X-Versions-Location (`issue#18852 <http://tracker.ceph.com/issues/18852>`_, `pr#13823 <https://github.com/ceph/ceph/pull/13823>`_, Jing Wenjun)
-* rgw: librgw: RGWLibFS::setattr fails on directories (`issue#18808 <http://tracker.ceph.com/issues/18808>`_, `pr#13778 <https://github.com/ceph/ceph/pull/13778>`_, Matt Benjamin)
-* rgw: make sending Content-Length in 204 and 304 controllable (`issue#16602 <http://tracker.ceph.com/issues/16602>`_, `pr#13503 <https://github.com/ceph/ceph/pull/13503>`_, Radoslaw Zarzynski, Matt Benjamin)
-* rgw: multipart uploads copy part support (`issue#12790 <http://tracker.ceph.com/issues/12790>`_, `pr#13219 <https://github.com/ceph/ceph/pull/13219>`_, Yehuda Sadeh, Javier M. Mellid, Matt Benjamin)
-* rgw: multisite: RGWMetaSyncShardControlCR gives up on EIO (`issue#19019 <http://tracker.ceph.com/issues/19019>`_, `pr#13867 <https://github.com/ceph/ceph/pull/13867>`_, Casey Bodley)
-* rgw: radosgw/swift: clean up flush / newline behavior (`issue#18473 <http://tracker.ceph.com/issues/18473>`_, `pr#14100 <https://github.com/ceph/ceph/pull/14100>`_, Nathan Cutler, Marcus Watts, Matt Benjamin)
-* rgw: radosgw/swift: clean up flush / newline behavior. (`issue#18473 <http://tracker.ceph.com/issues/18473>`_, `pr#13143 <https://github.com/ceph/ceph/pull/13143>`_, Marcus Watts, Matt Benjamin)
-* rgw: rgw_fh: RGWFileHandle dtor must also cond-unlink from FHCache (`issue#19112 <http://tracker.ceph.com/issues/19112>`_, `pr#14231 <https://github.com/ceph/ceph/pull/14231>`_, Matt Benjamin)
-* rgw: rgw_file:  avoid interning .. in FHCache table and don't ref for them (`issue#19036 <http://tracker.ceph.com/issues/19036>`_, `pr#13848 <https://github.com/ceph/ceph/pull/13848>`_, Matt Benjamin)
-* rgw: rgw_file:  interned RGWFileHandle objects need parent refs (`issue#18650 <http://tracker.ceph.com/issues/18650>`_, `pr#13583 <https://github.com/ceph/ceph/pull/13583>`_, Matt Benjamin)
-* rgw: rgw_file:  restore (corrected) fix for dir partial match (return of FLAG_EXACT_MATCH) (`issue#19060 <http://tracker.ceph.com/issues/19060>`_, `issue#18992 <http://tracker.ceph.com/issues/18992>`_, `issue#19059 <http://tracker.ceph.com/issues/19059>`_, `pr#13858 <https://github.com/ceph/ceph/pull/13858>`_, Matt Benjamin)
-* rgw: rgw_file: FHCache residence check should be exhaustive (`issue#19111 <http://tracker.ceph.com/issues/19111>`_, `pr#14169 <https://github.com/ceph/ceph/pull/14169>`_, Matt Benjamin)
-* rgw: rgw_file: ensure valid_s3_object_name for directories, too (`issue#19066 <http://tracker.ceph.com/issues/19066>`_, `pr#13717 <https://github.com/ceph/ceph/pull/13717>`_, Matt Benjamin)
-* rgw: rgw_file: fix marker computation (`issue#19018 <http://tracker.ceph.com/issues/19018>`_, `issue#18989 <http://tracker.ceph.com/issues/18989>`_, `issue#18992 <http://tracker.ceph.com/issues/18992>`_, `issue#18991 <http://tracker.ceph.com/issues/18991>`_, `pr#13869 <https://github.com/ceph/ceph/pull/13869>`_, Matt Benjamin)
-* rgw: rgw_file: wip dir orphan (`issue#18992 <http://tracker.ceph.com/issues/18992>`_, `issue#18989 <http://tracker.ceph.com/issues/18989>`_, `issue#19018 <http://tracker.ceph.com/issues/19018>`_, `issue#18991 <http://tracker.ceph.com/issues/18991>`_, `pr#14205 <https://github.com/ceph/ceph/pull/14205>`_, Gui Hecheng, Matt Benjamin)
-* rgw: rgw_file: various fixes (`pr#14206 <https://github.com/ceph/ceph/pull/14206>`_, Matt Benjamin)
-* rgw: rgw_file: expand argv (`pr#14230 <https://github.com/ceph/ceph/pull/14230>`_, Matt Benjamin)
-
-
-v10.2.6 Jewel
-=============
-
-This point release fixes several important bugs in RBD mirroring, RGW multi-site, CephFS, and RADOS.
-
-We recommend that all v10.2.x users upgrade.
-
-For more detailed information, see :download:`the complete changelog <../changelog/v10.2.6.txt>`.
-
-OSDs No Longer Send ENXIO by Default
-------------------------------------
-
-In previous versions, if a client sent an op to the wrong OSD, the OSD
-would reply with ENXIO.  The rationale here is that the client or OSD is
-clearly buggy and we want to surface the error as clearly as possible.
-We now only send the ENXIO reply if the osd_enxio_on_misdirected_op option
-is enabled (it's off by default).  This means that a VM using librbd that
-previously would have gotten an EIO and gone read-only will now see a
-blocked/hung IO instead.
-
-Other Notable Changes
----------------------
-
-* build/ops: add hostname sanity check to run-{c}make-check.sh (`issue#18134 <http://tracker.ceph.com/issues/18134>`_, `pr#12302 <http://github.com/ceph/ceph/pull/12302>`_, Nathan Cutler)
-* build/ops: add ldap lib to rgw lib deps based on build config (`issue#17313 <http://tracker.ceph.com/issues/17313>`_, `pr#13183 <http://github.com/ceph/ceph/pull/13183>`_, Nathan Cutler)
-* build/ops: ceph-create-keys loops forever (`issue#17753 <http://tracker.ceph.com/issues/17753>`_, `pr#11884 <http://github.com/ceph/ceph/pull/11884>`_, Alfredo Deza)
-* build/ops: ceph daemons DUMPABLE flag is cleared by setuid preventing coredumps (`issue#17650 <http://tracker.ceph.com/issues/17650>`_, `pr#11736 <http://github.com/ceph/ceph/pull/11736>`_, Patrick Donnelly)
-* build/ops: fixed compilation error when --with-radowsgw=no (`issue#18512 <http://tracker.ceph.com/issues/18512>`_, `pr#12729 <http://github.com/ceph/ceph/pull/12729>`_, Pan Liu)
-* build/ops: fixed the issue when --disable-server, compilation fails. (`issue#18120 <http://tracker.ceph.com/issues/18120>`_, `pr#12239 <http://github.com/ceph/ceph/pull/12239>`_, Pan Liu)
-* build/ops: fix undefined crypto references with --with-xio (`issue#18133 <http://tracker.ceph.com/issues/18133>`_, `pr#12296 <http://github.com/ceph/ceph/pull/12296>`_, Nathan Cutler)
-* build/ops: install-deps.sh based on /etc/os-release (`issue#18466 <http://tracker.ceph.com/issues/18466>`_, `issue#18198 <http://tracker.ceph.com/issues/18198>`_, `pr#12405 <http://github.com/ceph/ceph/pull/12405>`_, Jan Fajerski, Nitin A Kamble, Nathan Cutler)
-* build/ops: Remove the runtime dependency on lsb_release (`issue#17425 <http://tracker.ceph.com/issues/17425>`_, `pr#11875 <http://github.com/ceph/ceph/pull/11875>`_, John Coyle, Brad Hubbard)
-* build/ops: rpm: /etc/ceph/rbdmap is packaged with executable access rights (`issue#17395 <http://tracker.ceph.com/issues/17395>`_, `pr#11855 <http://github.com/ceph/ceph/pull/11855>`_, Ken Dreyer)
-* build/ops: selinux: Allow ceph to manage tmp files (`issue#17436 <http://tracker.ceph.com/issues/17436>`_, `pr#13048 <http://github.com/ceph/ceph/pull/13048>`_, Boris Ranto)
-* build/ops: systemd: Restart Mon after 10s in case of failure (`issue#18635 <http://tracker.ceph.com/issues/18635>`_, `pr#13058 <http://github.com/ceph/ceph/pull/13058>`_, Wido den Hollander)
-* build/ops: systemd restarts Ceph Mon to quickly after failing to start (`issue#18635 <http://tracker.ceph.com/issues/18635>`_, `pr#13184 <http://github.com/ceph/ceph/pull/13184>`_, Wido den Hollander)
-* ceph-disk: fix flake8 errors (`issue#17898 <http://tracker.ceph.com/issues/17898>`_, `pr#11976 <http://github.com/ceph/ceph/pull/11976>`_, Ken Dreyer)
-* cephfs: fuse client crash when adding a new osd (`issue#17270 <http://tracker.ceph.com/issues/17270>`_, `pr#11860 <http://github.com/ceph/ceph/pull/11860>`_, John Spray)
-* cli: ceph-disk: convert none str to str before printing it (`issue#18371 <http://tracker.ceph.com/issues/18371>`_, `pr#13187 <http://github.com/ceph/ceph/pull/13187>`_, Kefu Chai)
-* client: Fix lookup of "/.." in jewel (`issue#18408 <http://tracker.ceph.com/issues/18408>`_, `pr#12766 <http://github.com/ceph/ceph/pull/12766>`_, Jeff Layton)
-* client: fix stale entries in command table (`issue#17974 <http://tracker.ceph.com/issues/17974>`_, `pr#12137 <http://github.com/ceph/ceph/pull/12137>`_, John Spray)
-* client: populate metadata during mount (`issue#18361 <http://tracker.ceph.com/issues/18361>`_, `pr#13085 <http://github.com/ceph/ceph/pull/13085>`_, John Spray)
-* cli: implement functionality for adding, editing and removing omap values with binary keys (`issue#18123 <http://tracker.ceph.com/issues/18123>`_, `pr#12755 <http://github.com/ceph/ceph/pull/12755>`_, Jason Dillaman)
-* common: Improve linux dcache hash algorithm (`issue#17599 <http://tracker.ceph.com/issues/17599>`_, `pr#11529 <http://github.com/ceph/ceph/pull/11529>`_, Yibo Cai)
-* common: utime.h: fix timezone issue in round_to_* funcs.  (`issue#14862 <http://tracker.ceph.com/issues/14862>`_, `pr#11508 <http://github.com/ceph/ceph/pull/11508>`_, Zhao Chao)
-* doc: Python Swift client commands in Quick Developer Guide don't match configuration in vstart.sh (`issue#17746 <http://tracker.ceph.com/issues/17746>`_, `pr#13043 <http://github.com/ceph/ceph/pull/13043>`_, Ronak Jain)
-* librbd: allow to open an image without opening parent image (`issue#18325 <http://tracker.ceph.com/issues/18325>`_, `pr#13130 <http://github.com/ceph/ceph/pull/13130>`_, Ricardo Dias)
-* librbd: metadata_set API operation should not change global config setting (`issue#18465 <http://tracker.ceph.com/issues/18465>`_, `pr#13168 <http://github.com/ceph/ceph/pull/13168>`_, Mykola Golub)
-* librbd: new API method to force break a peer's exclusive lock (`issue#15632 <http://tracker.ceph.com/issues/15632>`_, `issue#16773 <http://tracker.ceph.com/issues/16773>`_, `issue#17188 <http://tracker.ceph.com/issues/17188>`_, `issue#16988 <http://tracker.ceph.com/issues/16988>`_, `issue#17210 <http://tracker.ceph.com/issues/17210>`_, `issue#17251 <http://tracker.ceph.com/issues/17251>`_, `issue#18429 <http://tracker.ceph.com/issues/18429>`_, `issue#17227 <http://tracker.ceph.com/issues/17227>`_, `issue#18327 <http://tracker.ceph.com/issues/18327>`_, `issue#17015 <http://tracker.ceph.com/issues/17015>`_, `pr#12890 <http://github.com/ceph/ceph/pull/12890>`_, Danny Al-Gaaf, Mykola Golub, Jason Dillaman)
-* librbd: properly order concurrent updates to the object map (`issue#16176 <http://tracker.ceph.com/issues/16176>`_, `pr#12909 <http://github.com/ceph/ceph/pull/12909>`_, Jason Dillaman)
-* librbd: restore journal access when force disabling mirroring (`issue#17588 <http://tracker.ceph.com/issues/17588>`_, `pr#11916 <http://github.com/ceph/ceph/pull/11916>`_, Mykola Golub)
-* mds: Cannot create deep directories when caps contain path=/somepath (`issue#17858 <http://tracker.ceph.com/issues/17858>`_, `pr#12154 <http://github.com/ceph/ceph/pull/12154>`_, Patrick Donnelly)
-* mds: cephfs metadata pool: deep-scrub error omap_digest != best guess omap_digest (`issue#17177 <http://tracker.ceph.com/issues/17177>`_, `pr#12380 <http://github.com/ceph/ceph/pull/12380>`_, Yan, Zheng)
-* mds: cephfs test failures (ceph.com/qa is broken, should be download.ceph.com/qa) (`issue#18574 <http://tracker.ceph.com/issues/18574>`_, `pr#13023 <http://github.com/ceph/ceph/pull/13023>`_, John Spray)
-* mds: ceph-fuse crash during snapshot tests (`issue#18460 <http://tracker.ceph.com/issues/18460>`_, `pr#13120 <http://github.com/ceph/ceph/pull/13120>`_, Yan, Zheng)
-* mds: ceph_volume_client: fix recovery from partial auth update  (`issue#17216 <http://tracker.ceph.com/issues/17216>`_, `pr#11656 <http://github.com/ceph/ceph/pull/11656>`_, Ramana Raja)
-* mds: ceph_volume_client.py : Error: Can't handle arrays of non-strings (`issue#17800 <http://tracker.ceph.com/issues/17800>`_, `pr#12325 <http://github.com/ceph/ceph/pull/12325>`_, Ramana Raja)
-* mds: Cleanly reject session evict command when in replay (`issue#17801 <http://tracker.ceph.com/issues/17801>`_, `pr#12153 <http://github.com/ceph/ceph/pull/12153>`_, Yan, Zheng)
-* mds: client segfault on ceph_rmdir path / (`issue#9935 <http://tracker.ceph.com/issues/9935>`_, `pr#13029 <http://github.com/ceph/ceph/pull/13029>`_, Michal Jarzabek)
-* mds: Clients without pool-changing caps shouldn't be allowed to change pool_namespace (`issue#17798 <http://tracker.ceph.com/issues/17798>`_, `pr#12155 <http://github.com/ceph/ceph/pull/12155>`_, John Spray)
-* mds: Decode errors on backtrace will crash MDS (`issue#18311 <http://tracker.ceph.com/issues/18311>`_, `pr#12836 <http://github.com/ceph/ceph/pull/12836>`_, Nathan Cutler, John Spray)
-* mds: false failing to respond to cache pressure warning (`issue#17611 <http://tracker.ceph.com/issues/17611>`_, `pr#11861 <http://github.com/ceph/ceph/pull/11861>`_, Yan, Zheng)
-* mds: finish clientreplay requests before requesting active state (`issue#18461 <http://tracker.ceph.com/issues/18461>`_, `pr#13113 <http://github.com/ceph/ceph/pull/13113>`_, Yan, Zheng)
-* mds: fix incorrect assertion in Server::_dir_is_nonempty() (`issue#18578 <http://tracker.ceph.com/issues/18578>`_, `pr#13459 <http://github.com/ceph/ceph/pull/13459>`_, Yan, Zheng)
-* mds: fix MDSMap upgrade decoding (`issue#17837 <http://tracker.ceph.com/issues/17837>`_, `pr#13139 <http://github.com/ceph/ceph/pull/13139>`_, John Spray, Patrick Donnelly)
-* mds: fix missing ll_get for ll_walk (`issue#18086 <http://tracker.ceph.com/issues/18086>`_, `pr#13125 <http://github.com/ceph/ceph/pull/13125>`_, Gui Hecheng)
-* mds: Fix mount root for ceph_mount users and change tarball format (`issue#18312 <http://tracker.ceph.com/issues/18312>`_, `issue#18254 <http://tracker.ceph.com/issues/18254>`_, `pr#12592 <http://github.com/ceph/ceph/pull/12592>`_, Jeff Layton)
-* mds: fix null pointer dereference in Locker::handle_client_caps (`issue#18306 <http://tracker.ceph.com/issues/18306>`_, `pr#13060 <http://github.com/ceph/ceph/pull/13060>`_, Yan, Zheng)
-* mds: lookup of /.. in  returns -ENOENT (`issue#18408 <http://tracker.ceph.com/issues/18408>`_, `pr#12783 <http://github.com/ceph/ceph/pull/12783>`_, Jeff Layton)
-* mds: MDS crashes on missing metadata object (`issue#18179 <http://tracker.ceph.com/issues/18179>`_, `pr#13119 <http://github.com/ceph/ceph/pull/13119>`_, Yan, Zheng)
-* mds: mds fails to respawn if executable has changed (`issue#17531 <http://tracker.ceph.com/issues/17531>`_, `pr#11873 <http://github.com/ceph/ceph/pull/11873>`_, Patrick Donnelly)
-* mds: MDS: false failing to respond to cache pressure warning (`issue#17716 <http://tracker.ceph.com/issues/17716>`_, `pr#11856 <http://github.com/ceph/ceph/pull/11856>`_, Yan, Zheng)
-* mds: MDS goes damaged on blacklist (failed to read JournalPointer: -108 ((108) Cannot send after transport endpoint shutdown) (`issue#17236 <http://tracker.ceph.com/issues/17236>`_, `pr#11413 <http://github.com/ceph/ceph/pull/11413>`_, John Spray)
-* mds: MDS long-time blocked ops. ceph-fuse locks up with getattr of file (`issue#17275 <http://tracker.ceph.com/issues/17275>`_, `pr#11858 <http://github.com/ceph/ceph/pull/11858>`_, Yan, Zheng)
-* mds: speed up readdir by skipping unwanted dn (`issue#18519 <http://tracker.ceph.com/issues/18519>`_, `pr#12921 <http://github.com/ceph/ceph/pull/12921>`_, Xiaoxi Chen)
-* mds: standby-replay daemons can sometimes miss events (`issue#17954 <http://tracker.ceph.com/issues/17954>`_, `pr#13126 <http://github.com/ceph/ceph/pull/13126>`_, John Spray)
-* mon: cache tiering: base pool last_force_resend not respected (racing read got wrong version) (`issue#18366 <http://tracker.ceph.com/issues/18366>`_, `pr#13115 <http://github.com/ceph/ceph/pull/13115>`_, Sage Weil)
-* mon: ceph osd down detection behaviour (`issue#18104 <http://tracker.ceph.com/issues/18104>`_, `pr#12677 <http://github.com/ceph/ceph/pull/12677>`_, xie xingguo)
-* mon: Error EINVAL: removing mon.a at 172.21.15.16:6789/0, there will be 1 monitors (`issue#17725 <http://tracker.ceph.com/issues/17725>`_, `pr#11999 <http://github.com/ceph/ceph/pull/11999>`_, Joao Eduardo Luis)
-* mon: health does not report pgs stuck in more than one state (`issue#17515 <http://tracker.ceph.com/issues/17515>`_, `pr#11660 <http://github.com/ceph/ceph/pull/11660>`_, Sage Weil)
-* mon: monitor assertion failure when deactivating mds in (invalid) fscid 0 (`issue#17518 <http://tracker.ceph.com/issues/17518>`_, `pr#11862 <http://github.com/ceph/ceph/pull/11862>`_, Patrick Donnelly)
-* mon: monitor cannot start because of FAILED assert(info.state == MDSMap::STATE_STANDBY) (`issue#18166 <http://tracker.ceph.com/issues/18166>`_, `pr#13123 <http://github.com/ceph/ceph/pull/13123>`_, John Spray, Patrick Donnelly)
-* mon: osd flag health message is misleading (`issue#18175 <http://tracker.ceph.com/issues/18175>`_, `pr#13117 <http://github.com/ceph/ceph/pull/13117>`_, Sage Weil)
-* mon: OSDMonitor: clear jewel+ feature bits when talking to Hammer OSD (`issue#18582 <http://tracker.ceph.com/issues/18582>`_, `pr#13131 <http://github.com/ceph/ceph/pull/13131>`_, Piotr Dałek)
-* mon: OSDs marked OUT wrongly after monitor failover (`issue#17719 <http://tracker.ceph.com/issues/17719>`_, `pr#11947 <http://github.com/ceph/ceph/pull/11947>`_, Dong Wu)
-* mon: peon wrongly delete routed pg stats op before receive pg stats ack (`issue#18458 <http://tracker.ceph.com/issues/18458>`_, `pr#13045 <http://github.com/ceph/ceph/pull/13045>`_, Mingxin Liu)
-* mon: send updated monmap to its subscribers (`issue#17558 <http://tracker.ceph.com/issues/17558>`_, `pr#11743 <http://github.com/ceph/ceph/pull/11743>`_, Kefu Chai)
-* msgr: don't truncate message sequence to 32-bits (`issue#16122 <http://tracker.ceph.com/issues/16122>`_, `pr#12416 <http://github.com/ceph/ceph/pull/12416>`_, Yan, Zheng)
-* msgr: msg/simple: clear_pipe when wait() is mopping up pipes (`issue#15784 <http://tracker.ceph.com/issues/15784>`_, `pr#13062 <http://github.com/ceph/ceph/pull/13062>`_, Sage Weil)
-* msgr: msg/simple/Pipe: error decoding addr (`issue#18072 <http://tracker.ceph.com/issues/18072>`_, `pr#12291 <http://github.com/ceph/ceph/pull/12291>`_, Sage Weil)
-* osd: Add config option to disable new scrubs during recovery (`issue#17866 <http://tracker.ceph.com/issues/17866>`_, `pr#11944 <http://github.com/ceph/ceph/pull/11944>`_, Wido den Hollander)
-* osd: collection_list shadow return value # (`issue#17713 <http://tracker.ceph.com/issues/17713>`_, `pr#11737 <http://github.com/ceph/ceph/pull/11737>`_, Haomai Wang)
-* osd: do not send ENXIO on misdirected op by default (`issue#18751 <http://tracker.ceph.com/issues/18751>`_, `pr#13255 <http://github.com/ceph/ceph/pull/13255>`_, Sage Weil)
-* osd: FileStore: fiemap cannot be totally retrieved in xfs when the number of extents > 1364  (`issue#17610 <http://tracker.ceph.com/issues/17610>`_, `pr#11998 <http://github.com/ceph/ceph/pull/11998>`_, Kefu Chai, Ning Yao)
-* osd: leveldb corruption leads to Operation not permitted not handled and assert (`issue#18037 <http://tracker.ceph.com/issues/18037>`_, `pr#12789 <http://github.com/ceph/ceph/pull/12789>`_, Nathan Cutler)
-* osd: limit omap data in push op (`issue#16128 <http://tracker.ceph.com/issues/16128>`_, `pr#11991 <http://github.com/ceph/ceph/pull/11991>`_, Wanlong Gao)
-* osd: osd crashes when radosgw-admin bi list --max-entries=1 command runing (`issue#17745 <http://tracker.ceph.com/issues/17745>`_, `pr#11758 <http://github.com/ceph/ceph/pull/11758>`_, weiqiaomiao)
-* osd: osd_max_backfills default has changed, documentation should reflect that. (`issue#17701 <http://tracker.ceph.com/issues/17701>`_, `pr#11735 <http://github.com/ceph/ceph/pull/11735>`_, huangjun)
-* osd: OSDMonitor: only reject MOSDBoot based on up_from if inst matches (`issue#17899 <http://tracker.ceph.com/issues/17899>`_, `pr#12868 <http://github.com/ceph/ceph/pull/12868>`_, Samuel Just)
-* osd: osd/PG: publish PG stats when backfill-related states change (`issue#18369 <http://tracker.ceph.com/issues/18369>`_, `pr#12875 <http://github.com/ceph/ceph/pull/12875>`_, Alexey Sheplyakov, Sage Weil)
-* osd: Remove extra call to reg_next_scrub() during splits (`issue#16474 <http://tracker.ceph.com/issues/16474>`_, `pr#11606 <http://github.com/ceph/ceph/pull/11606>`_, David Zafman)
-* osd: Revert "Merge pull request #12978 from asheplyakov/jewel-18581" (`issue#18809 <http://tracker.ceph.com/issues/18809>`_, `pr#13280 <http://github.com/ceph/ceph/pull/13280>`_, Samuel Just)
-* osd: update_log_missing does not order correctly with osd_ops (`issue#17789 <http://tracker.ceph.com/issues/17789>`_, `pr#11997 <http://github.com/ceph/ceph/pull/11997>`_, Samuel Just)
-* qa/tasks: backport rbd_fio fixes to jewel (`issue#13512 <http://tracker.ceph.com/issues/13512>`_, `pr#13104 <http://github.com/ceph/ceph/pull/13104>`_, Ilya Dryomov)
-* qa/tasks/workunits: backport misc fixes to jewel (`issue#18336 <http://tracker.ceph.com/issues/18336>`_, `pr#12912 <http://github.com/ceph/ceph/pull/12912>`_, Sage Weil)
-* rados: crash adding snap to purged_snaps in ReplicatedPG::WaitingOnReplicas (part 2) (`issue#15943 <http://tracker.ceph.com/issues/15943>`_, `issue#18504 <http://tracker.ceph.com/issues/18504>`_, `pr#12791 <http://github.com/ceph/ceph/pull/12791>`_, Samuel Just)
-* rados: Memory leaks in object_list_begin and object_list_end (`issue#18252 <http://tracker.ceph.com/issues/18252>`_, `pr#13118 <http://github.com/ceph/ceph/pull/13118>`_, Brad Hubbard)
-* rados: The request lock RPC message might be incorrectly ignored  (`issue#17030 <http://tracker.ceph.com/issues/17030>`_, `pr#10865 <http://github.com/ceph/ceph/pull/10865>`_, Jason Dillaman)
-* rbd: add image id block name prefix APIs (`issue#18270 <http://tracker.ceph.com/issues/18270>`_, `pr#12529 <http://github.com/ceph/ceph/pull/12529>`_, Jason Dillaman)
-* rbd: add max_part and nbds_max options in rbd nbd map, in order to keep consistent with   (`issue#18186 <http://tracker.ceph.com/issues/18186>`_, `pr#12426 <http://github.com/ceph/ceph/pull/12426>`_, Pan Liu)
-* rbd: Attempting to remove an image w/ incompatible features results in partial removal (`issue#18315 <http://tracker.ceph.com/issues/18315>`_, `pr#13156 <http://github.com/ceph/ceph/pull/13156>`_, Dongsheng Yang)
-* rbd: bench-write will crash if --io-size is 4G (`issue#18422 <http://tracker.ceph.com/issues/18422>`_, `pr#13129 <http://github.com/ceph/ceph/pull/13129>`_, Gaurav Kumar Garg)
-* rbd: diff calculate can hide parent extents when examining first snapshot in clone (`issue#18068 <http://tracker.ceph.com/issues/18068>`_, `pr#12322 <http://github.com/ceph/ceph/pull/12322>`_, Jason Dillaman)
-* rbd: Exclusive lock improperly initialized on read-only image when using snap_set API (`issue#17618 <http://tracker.ceph.com/issues/17618>`_, `pr#11852 <http://github.com/ceph/ceph/pull/11852>`_, Jason Dillaman)
-* rbd: FAILED assert(m_processing == 0) while running test_lock_fence.sh (`issue#17973 <http://tracker.ceph.com/issues/17973>`_, `pr#12323 <http://github.com/ceph/ceph/pull/12323>`_, Venky Shankar)
-* rbd: Improve error reporting from rbd feature enable/disable (`issue#16985 <http://tracker.ceph.com/issues/16985>`_, `pr#13157 <http://github.com/ceph/ceph/pull/13157>`_, Gaurav Kumar Garg)
-* rbd: JournalMetadata flooding with errors when being blacklisted (`issue#18243 <http://tracker.ceph.com/issues/18243>`_, `pr#12739 <http://github.com/ceph/ceph/pull/12739>`_, Jason Dillaman)
-* rbd: librbd: use proper snapshot when computing diff parent overlap (`issue#18200 <http://tracker.ceph.com/issues/18200>`_, `pr#12649 <http://github.com/ceph/ceph/pull/12649>`_, Xiaoxi Chen)
-* rbd: partition func should be enabled When load nbd.ko for rbd-nbd (`issue#18115 <http://tracker.ceph.com/issues/18115>`_, `pr#12754 <http://github.com/ceph/ceph/pull/12754>`_, Pan Liu)
-* rbd: Potential race when removing two-way mirroring image (`issue#18447 <http://tracker.ceph.com/issues/18447>`_, `pr#13233 <http://github.com/ceph/ceph/pull/13233>`_, Mykola Golub)
-* rbd: [qa] crash in journal-enabled fsx run (`issue#18618 <http://tracker.ceph.com/issues/18618>`_, `pr#13128 <http://github.com/ceph/ceph/pull/13128>`_, Jason Dillaman)
-* rbd: 'rbd du' of missing image does not return error (`issue#16987 <http://tracker.ceph.com/issues/16987>`_, `pr#11854 <http://github.com/ceph/ceph/pull/11854>`_, Dongsheng Yang)
-* rbd: rbd-mirror: gmock warnings in bootstrap request unit tests (`issue#18048 <http://tracker.ceph.com/issues/18048>`_, `issue#18012 <http://tracker.ceph.com/issues/18012>`_, `issue#18156 <http://tracker.ceph.com/issues/18156>`_, `issue#16991 <http://tracker.ceph.com/issues/16991>`_, `issue#18051 <http://tracker.ceph.com/issues/18051>`_, `pr#12425 <http://github.com/ceph/ceph/pull/12425>`_, Mykola Golub)
-* rbd: rbd-mirror: image sync object map reload logs message (`issue#16179 <http://tracker.ceph.com/issues/16179>`_, `pr#12753 <http://github.com/ceph/ceph/pull/12753>`_, runsisi)
-* rbd: rbd-mirror: snap protect of non-layered image results in split-brain (`issue#16962 <http://tracker.ceph.com/issues/16962>`_, `pr#11869 <http://github.com/ceph/ceph/pull/11869>`_, Mykola Golub)
-* rbd: [rbd-mirror] sporadic image replayer shut down failure (`issue#18441 <http://tracker.ceph.com/issues/18441>`_, `pr#13155 <http://github.com/ceph/ceph/pull/13155>`_, Jason Dillaman)
-* rbd: rbd-nbd: disallow mapping images >2TB in size (`issue#17219 <http://tracker.ceph.com/issues/17219>`_, `pr#11870 <http://github.com/ceph/ceph/pull/11870>`_, Mykola Golub)
-* rbd: rbd-nbd: invalid error code for "failed to read nbd request" messages (`issue#18242 <http://tracker.ceph.com/issues/18242>`_, `pr#12756 <http://github.com/ceph/ceph/pull/12756>`_, Mykola Golub)
-* rbd: status json format has duplicated/overwritten key (`issue#18261 <http://tracker.ceph.com/issues/18261>`_, `pr#12741 <http://github.com/ceph/ceph/pull/12741>`_, Mykola Golub)
-* rbd: TestLibRBD.DiscardAfterWrite doesn't handle rbd_skip_partial_discard = true (`issue#17750 <http://tracker.ceph.com/issues/17750>`_, `pr#11853 <http://github.com/ceph/ceph/pull/11853>`_, Jason Dillaman)
-* rbd: truncate can cause unflushed snapshot data lose (`issue#17193 <http://tracker.ceph.com/issues/17193>`_, `pr#12324 <http://github.com/ceph/ceph/pull/12324>`_, Yan, Zheng)
-* : ReplicatedBackend: take read locks for clone sources during recovery (`issue#17831 <http://tracker.ceph.com/issues/17831>`_, `issue#18583 <http://tracker.ceph.com/issues/18583>`_, `pr#12978 <http://github.com/ceph/ceph/pull/12978>`_, Samuel Just)
-* rgw: add option to log custom HTTP headers (rgw_log_http_headers) (`issue#18891 <http://tracker.ceph.com/issues/18891>`_, `pr#12490 <http://github.com/ceph/ceph/pull/12490>`_, Matt Benjamin)
-* rgw: add suport for Swift-at-root dependent features of Swift API  (`issue#18526 <http://tracker.ceph.com/issues/18526>`_, `issue#16673 <http://tracker.ceph.com/issues/16673>`_, `pr#11497 <http://github.com/ceph/ceph/pull/11497>`_, Pritha Srivastava, Radoslaw Zarzynski, Pete Zaitcev, Abhishek Lekshmanan)
-* rgw: add support for the prefix parameter in account listing of Swift API (`issue#17931 <http://tracker.ceph.com/issues/17931>`_, `pr#12258 <http://github.com/ceph/ceph/pull/12258>`_, Radoslaw Zarzynski)
-* rgw: Add workaround for upgrade issues for older jewel versions (`issue#17820 <http://tracker.ceph.com/issues/17820>`_, `pr#12316 <http://github.com/ceph/ceph/pull/12316>`_, Orit Wasserman)
-* rgw: be aware abount tenants on cls_user_bucket -> rgw_bucket conversion (`issue#18364 <http://tracker.ceph.com/issues/18364>`_, `issue#16355 <http://tracker.ceph.com/issues/16355>`_, `pr#13276 <http://github.com/ceph/ceph/pull/13276>`_, Radoslaw Zarzynski)
-* rgw: bucket check remove _multipart_ prefix (`issue#13724 <http://tracker.ceph.com/issues/13724>`_, `pr#11470 <http://github.com/ceph/ceph/pull/11470>`_, Weijun Duan)
-* rgw: bucket resharding (`issue#17549 <http://tracker.ceph.com/issues/17549>`_, `issue#17550 <http://tracker.ceph.com/issues/17550>`_, `pr#13341 <http://github.com/ceph/ceph/pull/13341>`_, Yehuda Sadeh, Robin H. Johnson)
-* rgw: disable virtual hosting of buckets when no hostnames are configured (`issue#17440 <http://tracker.ceph.com/issues/17440>`_, `issue#15975 <http://tracker.ceph.com/issues/15975>`_, `issue#17136 <http://tracker.ceph.com/issues/17136>`_, `pr#11760 <http://github.com/ceph/ceph/pull/11760>`_, Casey Bodley, Robin H. Johnson)
-* rgw: do not abort when accept a CORS request with short origin (`issue#18187 <http://tracker.ceph.com/issues/18187>`_, `pr#12397 <http://github.com/ceph/ceph/pull/12397>`_, LiuYang)
-* rgw: don't store empty chains in gc (`issue#17897 <http://tracker.ceph.com/issues/17897>`_, `pr#12174 <http://github.com/ceph/ceph/pull/12174>`_, Yehuda Sadeh)
-* rgw:fix for deleting objects name beginning and ending with underscores of one bucket using POST method of js sdk.  (`issue#17888 <http://tracker.ceph.com/issues/17888>`_, `pr#12320 <http://github.com/ceph/ceph/pull/12320>`_, Casey Bodley)
-* rgw: fix period update crash (`issue#18631 <http://tracker.ceph.com/issues/18631>`_, `pr#13273 <http://github.com/ceph/ceph/pull/13273>`_, Orit Wasserman)
-* rgw: fix put_acls for objects starting and ending with underscore (`issue#17625 <http://tracker.ceph.com/issues/17625>`_, `pr#11675 <http://github.com/ceph/ceph/pull/11675>`_, Orit Wasserman)
-* rgw: fix use of marker in List::list_objects() (`issue#18331 <http://tracker.ceph.com/issues/18331>`_, `pr#13358 <http://github.com/ceph/ceph/pull/13358>`_, Yehuda Sadeh)
-* rgw: for the create_bucket api, if the input creation_time is zero, we … (`issue#16597 <http://tracker.ceph.com/issues/16597>`_, `pr#11990 <http://github.com/ceph/ceph/pull/11990>`_, weiqiaomiao)
-* rgw: Have a flavor of bucket deletion in radosgw-admin to bypass garbage collection (`issue#15557 <http://tracker.ceph.com/issues/15557>`_, `pr#10661 <http://github.com/ceph/ceph/pull/10661>`_, Pavan Rallabhandi)
-* rgw: json encode/decode of RGWBucketInfo missing index_type field (`issue#17755 <http://tracker.ceph.com/issues/17755>`_, `pr#11759 <http://github.com/ceph/ceph/pull/11759>`_, Yehuda Sadeh)
-* rgw: ldap: enforce simple_bind w/LDAPv3 redux (`issue#18339 <http://tracker.ceph.com/issues/18339>`_, `pr#12678 <http://github.com/ceph/ceph/pull/12678>`_, Weibing Zhang)
-* rgw: leak from RGWMetaSyncShardCR::incremental_sync (`issue#18412 <http://tracker.ceph.com/issues/18412>`_, `issue#18300 <http://tracker.ceph.com/issues/18300>`_, `pr#13004 <http://github.com/ceph/ceph/pull/13004>`_, Casey Bodley, Sage Weil)
-* rgw: leak in RGWFetchAllMetaCR (`issue#17812 <http://tracker.ceph.com/issues/17812>`_, `pr#11872 <http://github.com/ceph/ceph/pull/11872>`_, Casey Bodley)
-* rgw: librgw: objects created from s3 apis are not visible from nfs mount point  (`issue#18651 <http://tracker.ceph.com/issues/18651>`_, `pr#13177 <http://github.com/ceph/ceph/pull/13177>`_, Matt Benjamin)
-* rgw: log name instead of id for SystemMetaObj on failure (`issue#15776 <http://tracker.ceph.com/issues/15776>`_, `pr#12622 <http://github.com/ceph/ceph/pull/12622>`_, Wido den Hollander, Abhishek Lekshmanan)
-* rgw: multimds: mds entering up:replay and processing down mds aborts (`issue#17670 <http://tracker.ceph.com/issues/17670>`_, `pr#11857 <http://github.com/ceph/ceph/pull/11857>`_, Patrick Donnelly)
-* rgw: multipart upload copy (`issue#12790 <http://tracker.ceph.com/issues/12790>`_, `pr#13068 <http://github.com/ceph/ceph/pull/13068>`_, Yehuda Sadeh, Javier M. Mellid, Matt Benjamin)
-* rgw: multisite: after finishing full sync on a bucket, incremental sync starts over from the beginning (`issue#17661 <http://tracker.ceph.com/issues/17661>`_, `issue#17624 <http://tracker.ceph.com/issues/17624>`_, `pr#11864 <http://github.com/ceph/ceph/pull/11864>`_, Zengran Zhang, Casey Bodley)
-* rgw: multisite: assert(next) failed in RGWMetaSyncCR (`issue#17044 <http://tracker.ceph.com/issues/17044>`_, `pr#11477 <http://github.com/ceph/ceph/pull/11477>`_, Casey Bodley)
-* rgw: multisite: coroutine deadlock assertion on error in FetchAllMetaCR (`issue#17571 <http://tracker.ceph.com/issues/17571>`_, `pr#11866 <http://github.com/ceph/ceph/pull/11866>`_, Casey Bodley)
-* rgw: multisite: coroutine deadlock in RGWMetaSyncCR after ECANCELED errors (`issue#17465 <http://tracker.ceph.com/issues/17465>`_, `pr#12738 <http://github.com/ceph/ceph/pull/12738>`_, Casey Bodley)
-* rgw: multisite doesn't retry RGWFetchAllMetaCR on failed lease (`issue#17047 <http://tracker.ceph.com/issues/17047>`_, `pr#11476 <http://github.com/ceph/ceph/pull/11476>`_, Casey Bodley)
-* rgw: multisite: ECANCELED & 500 error on bucket delete (`issue#17698 <http://tracker.ceph.com/issues/17698>`_, `pr#12044 <http://github.com/ceph/ceph/pull/12044>`_, Casey Bodley)
-* rgw: multisite: failed assertion in 'radosgw-admin bucket sync status' (`issue#18083 <http://tracker.ceph.com/issues/18083>`_, `pr#12314 <http://github.com/ceph/ceph/pull/12314>`_, Casey Bodley)
-* rgw: multisite: fix ref counting of completions (`issue#17792 <http://tracker.ceph.com/issues/17792>`_, `issue#18414 <http://tracker.ceph.com/issues/18414>`_, `issue#17793 <http://tracker.ceph.com/issues/17793>`_, `issue#18407 <http://tracker.ceph.com/issues/18407>`_, `pr#13001 <http://github.com/ceph/ceph/pull/13001>`_, Casey Bodley)
-* rgw: multisite: metadata master can get the wrong value for 'oldest_log_period' (`issue#16894 <http://tracker.ceph.com/issues/16894>`_, `pr#11868 <http://github.com/ceph/ceph/pull/11868>`_, Casey Bodley)
-* rgw: multisite: obsolete 'radosgw-admin period prepare' command (`issue#17387 <http://tracker.ceph.com/issues/17387>`_, `pr#11574 <http://github.com/ceph/ceph/pull/11574>`_, Gaurav Kumar Garg)
-* rgw: multisite: race between ReadSyncStatus and InitSyncStatus leads to EIO errors (`issue#17568 <http://tracker.ceph.com/issues/17568>`_, `pr#11865 <http://github.com/ceph/ceph/pull/11865>`_, Casey Bodley)
-* rgw: multisite requests failing with '400 Bad Request' with civetweb 1.8 (`issue#17822 <http://tracker.ceph.com/issues/17822>`_, `pr#12313 <http://github.com/ceph/ceph/pull/12313>`_, Casey Bodley)
-* rgw: multisite: segfault after changing value of rgw_data_log_num_shards (`issue#18488 <http://tracker.ceph.com/issues/18488>`_, `pr#13180 <http://github.com/ceph/ceph/pull/13180>`_, Casey Bodley)
-* rgw: multisite: sync status reports master is on a different period (`issue#18064 <http://tracker.ceph.com/issues/18064>`_, `pr#13175 <http://github.com/ceph/ceph/pull/13175>`_, Abhishek Lekshmanan)
-* rgw: multisite upgrade from hammer -> jewel ignores rgw_region_root_pool (`issue#17963 <http://tracker.ceph.com/issues/17963>`_, `pr#12156 <http://github.com/ceph/ceph/pull/12156>`_, Casey Bodley)
-* rgw: radosgw-admin period update reverts deleted zonegroup  (`issue#17239 <http://tracker.ceph.com/issues/17239>`_, `pr#13171 <http://github.com/ceph/ceph/pull/13171>`_, Orit Wasserman)
-* rgw: Realm set does not create a new period (`issue#18333 <http://tracker.ceph.com/issues/18333>`_, `pr#13182 <http://github.com/ceph/ceph/pull/13182>`_, Orit Wasserman)
-* rgw: remove spurious mount entries for RGW buckets (`issue#17850 <http://tracker.ceph.com/issues/17850>`_, `pr#12045 <http://github.com/ceph/ceph/pull/12045>`_, Matt Benjamin)
-* rgw: Replacing '+' with "%20" in canonical uri for s3 v4 auth. (`issue#17076 <http://tracker.ceph.com/issues/17076>`_, `pr#12542 <http://github.com/ceph/ceph/pull/12542>`_, Pritha Srivastava)
-* rgw: rgw-admin: missing command to modify placement targets (`issue#18078 <http://tracker.ceph.com/issues/18078>`_, `pr#12428 <http://github.com/ceph/ceph/pull/12428>`_, Yehuda Sadeh, Casey Bodley)
-* rgw: RGWRados::get_system_obj() sends unnecessary stat request before read (`issue#17580 <http://tracker.ceph.com/issues/17580>`_, `pr#11867 <http://github.com/ceph/ceph/pull/11867>`_, Casey Bodley)
-* rgw: rgw_rest_s3:  apply missed base64 try-catch (`issue#17663 <http://tracker.ceph.com/issues/17663>`_, `pr#11672 <http://github.com/ceph/ceph/pull/11672>`_, Matt Benjamin)
-* rgw: RGW will not list Argonaut-era bucket via HTTP (but radosgw-admin works) (`issue#17372 <http://tracker.ceph.com/issues/17372>`_, `pr#11863 <http://github.com/ceph/ceph/pull/11863>`_, Yehuda Sadeh)
-* rgw: sends omap_getvals with (u64)-1 limit (`issue#17985 <http://tracker.ceph.com/issues/17985>`_, `pr#12419 <http://github.com/ceph/ceph/pull/12419>`_, Yehuda Sadeh, Sage Weil)
-* rgw: slave zonegroup cannot enable the bucket versioning (`issue#18003 <http://tracker.ceph.com/issues/18003>`_, `pr#13173 <http://github.com/ceph/ceph/pull/13173>`_, Orit Wasserman)
-* rgw: TempURL properly handles accounts created with the implicit tenant (`issue#17961 <http://tracker.ceph.com/issues/17961>`_, `pr#12079 <http://github.com/ceph/ceph/pull/12079>`_, Radoslaw Zarzynski)
-* rgw: the value of total_time is wrong in the result of 'radosgw-admin log show' opt (`issue#17598 <http://tracker.ceph.com/issues/17598>`_, `pr#11876 <http://github.com/ceph/ceph/pull/11876>`_, weiqiaomiao)
-* rgw: Unable to commit period zonegroup change (`issue#17364 <http://tracker.ceph.com/issues/17364>`_, `pr#12315 <http://github.com/ceph/ceph/pull/12315>`_, Orit Wasserman)
-* rgw: valgrind "invalid read size 4" RGWGetObj (`issue#18071 <http://tracker.ceph.com/issues/18071>`_, `pr#12997 <http://github.com/ceph/ceph/pull/12997>`_, Matt Benjamin)
-* rgw: work around curl_multi_wait bug with non-blocking reads (`issue#15915 <http://tracker.ceph.com/issues/15915>`_, `issue#16368 <http://tracker.ceph.com/issues/16368>`_, `issue#16695 <http://tracker.ceph.com/issues/16695>`_, `pr#11627 <http://github.com/ceph/ceph/pull/11627>`_, John Coyle, Casey Bodley)
-* tests: add require_jewel_osds before upgrading last hammer node (`issue#18719 <http://tracker.ceph.com/issues/18719>`_, `pr#13161 <http://github.com/ceph/ceph/pull/13161>`_, Nathan Cutler)
-* tests: add require_jewel_osds to upgrade/hammer-x/tiering (`issue#18920 <http://tracker.ceph.com/issues/18920>`_, `pr#13404 <http://github.com/ceph/ceph/pull/13404>`_, Nathan Cutler)
-* tests: assertion failure in a radosgw-admin related task (`issue#17167 <http://tracker.ceph.com/issues/17167>`_, `pr#12764 <http://github.com/ceph/ceph/pull/12764>`_, Orit Wasserman)
-* tests: Cannot reserve CentOS 7.2 smithi machines (`issue#18416 <http://tracker.ceph.com/issues/18416>`_, `issue#18401 <http://tracker.ceph.com/issues/18401>`_, `pr#13050 <http://github.com/ceph/ceph/pull/13050>`_, Nathan Cutler, Sage Weil, Yuri Weinstein)
-* tests: ignore bogus ceph-objectstore-tool error in ceph_manager (`issue#16263 <http://tracker.ceph.com/issues/16263>`_, `pr#13240 <http://github.com/ceph/ceph/pull/13240>`_, Nathan Cutler, Kefu Chai)
-* tests: objecter_requests workunit fails on wip branches (`issue#18393 <http://tracker.ceph.com/issues/18393>`_, `pr#12761 <http://github.com/ceph/ceph/pull/12761>`_, Sage Weil)
-* tests: qa/suites/upgrade/hammer-x: break stress split ec symlinks (`issue#19006 <http://tracker.ceph.com/issues/19006>`_, `pr#13533 <http://github.com/ceph/ceph/pull/13533>`_, Nathan Cutler)
-* tests: qa/suites/upgrade/hammer-x/stress-split: finish thrashing before final upgrade (`issue#19004 <http://tracker.ceph.com/issues/19004>`_, `pr#13222 <http://github.com/ceph/ceph/pull/13222>`_, Sage Weil)
-* tests: qa/tasks/ceph_deploy.py: use dev option (`issue#18736 <http://tracker.ceph.com/issues/18736>`_, `pr#13106 <http://github.com/ceph/ceph/pull/13106>`_, Vasu Kulkarni)
-* tests: qa/workunits/rbd: use more recent qemu-iotests that support Xenial (`issue#18149 <http://tracker.ceph.com/issues/18149>`_, `issue#10773 <http://tracker.ceph.com/issues/10773>`_, `pr#13103 <http://github.com/ceph/ceph/pull/13103>`_, Jason Dillaman)
-* tests: remove qa/suites/buildpackages (`issue#18846 <http://tracker.ceph.com/issues/18846>`_, `pr#13299 <http://github.com/ceph/ceph/pull/13299>`_, Loic Dachary)
-* tests: SUSE yaml facets in qa/distros/all are out of date (`issue#18856 <http://tracker.ceph.com/issues/18856>`_, `issue#18846 <http://tracker.ceph.com/issues/18846>`_, `pr#13331 <http://github.com/ceph/ceph/pull/13331>`_, Nathan Cutler)
-* tests: update rbd/singleton/all/formatted-output.yaml to support ceph-ci (`issue#18440 <http://tracker.ceph.com/issues/18440>`_, `pr#12822 <http://github.com/ceph/ceph/pull/12822>`_, Nathan Cutler, Venky Shankar)
-* tests: update Ubuntu image url after ceph.com refactor (`issue#18542 <http://tracker.ceph.com/issues/18542>`_, `pr#12959 <http://github.com/ceph/ceph/pull/12959>`_, Jason Dillaman)
-* tests: upgrade:hammer-x: install firefly only on Ubuntu 14.04 (`issue#18089 <http://tracker.ceph.com/issues/18089>`_, `pr#13153 <http://github.com/ceph/ceph/pull/13153>`_, Nathan Cutler)
-* tests: use ceph-jewel branch for s3tests (`issue#18384 <http://tracker.ceph.com/issues/18384>`_, `pr#12745 <http://github.com/ceph/ceph/pull/12745>`_, Nathan Cutler)
-* tests: Workunits needlessly wget from git.ceph.com (`issue#18336 <http://tracker.ceph.com/issues/18336>`_, `issue#18271 <http://tracker.ceph.com/issues/18271>`_, `issue#18388 <http://tracker.ceph.com/issues/18388>`_, `pr#12686 <http://github.com/ceph/ceph/pull/12686>`_, Nathan Cutler, Sage Weil)
-* test: temporarily disable fork()'ing tests (`issue#16556 <http://tracker.ceph.com/issues/16556>`_, `issue#17832 <http://tracker.ceph.com/issues/17832>`_, `pr#11953 <http://github.com/ceph/ceph/pull/11953>`_, John Spray)
-* test: test fails due to The UNIX domain socket path (`issue#16014 <http://tracker.ceph.com/issues/16014>`_, `pr#12151 <http://github.com/ceph/ceph/pull/12151>`_, Loic Dachary)
-* tools: ceph-disk: ceph-disk@.service races with ceph-osd@.service (`issue#17889 <http://tracker.ceph.com/issues/17889>`_, `issue#17813 <http://tracker.ceph.com/issues/17813>`_, `pr#12147 <http://github.com/ceph/ceph/pull/12147>`_, Loic Dachary)
-* tools: ceph-disk --dmcrypt create must not require admin key (`issue#17849 <http://tracker.ceph.com/issues/17849>`_, `pr#12033 <http://github.com/ceph/ceph/pull/12033>`_, Loic Dachary)
-* tools: ceph-disk prepare writes osd log 0 with root owner (`issue#18538 <http://tracker.ceph.com/issues/18538>`_, `pr#13025 <http://github.com/ceph/ceph/pull/13025>`_, Samuel Matzek)
-* tools: crushtool --compile is create output despite of missing item (`issue#17306 <http://tracker.ceph.com/issues/17306>`_, `pr#11410 <http://github.com/ceph/ceph/pull/11410>`_, Kefu Chai)
-* tools: rados bench seq must verify the hostname (`issue#17526 <http://tracker.ceph.com/issues/17526>`_, `pr#13049 <http://github.com/ceph/ceph/pull/13049>`_, Loic Dachary)
-* tools: snapshotted RBD extent objects can't be manually evicted from a cache tier (`issue#17896 <http://tracker.ceph.com/issues/17896>`_, `pr#11968 <http://github.com/ceph/ceph/pull/11968>`_, Mingxin Liu)
-* tools: systemd/ceph-disk: reduce ceph-disk flock contention (`issue#18049 <http://tracker.ceph.com/issues/18049>`_, `issue#13160 <http://tracker.ceph.com/issues/13160>`_, `pr#12210 <http://github.com/ceph/ceph/pull/12210>`_, David Disseldorp)
-
-
-v10.2.5 Jewel
-=============
-
-This point release fixes an important `regression introduced in v10.2.4 <http://tracker.ceph.com/issues/18185>`_.
-
-We recommend that all v10.2.x users upgrade.
-
-Notable Changes
----------------
-For more detailed information, see :download:`the complete changelog <../changelog/v10.2.5.txt>`.
-
-* msg/simple/Pipe: avoid returning 0 on poll timeout (`issue#18185 <http://tracker.ceph.com/issues/18185>`_, `pr#12376 <https://github.com/ceph/ceph/pull/12376>`_, Sage Weil)
-
-v10.2.4 Jewel
-=============
-
-This point release fixes several important bugs in RBD mirroring, RGW multi-site, CephFS, and RADOS.
-
-We recommend that all v10.2.x users upgrade. Also note the following when upgrading from hammer
-
-Upgrading from hammer
----------------------
-
-When the last hammer OSD in a cluster containing jewel MONs is
-upgraded to jewel, as of 10.2.4 the jewel MONs will issue this
-warning: "all OSDs are running jewel or later but the
-'require_jewel_osds' osdmap flag is not set" and change the
-cluster health status to HEALTH_WARN.
-
-This is a signal for the admin to do "ceph osd set require_jewel_osds" - by
-doing this, the upgrade path is complete and no more pre-Jewel OSDs may be added
-to the cluster.
-
-
-Notable Changes
----------------
-For more detailed information, see :download:`the complete changelog <../changelog/v10.2.4.txt>`.
-
-* build/ops: aarch64: Compiler-based detection of crc32 extended CPU type is broken (`issue#17516 <http://tracker.ceph.com/issues/17516>`_, `pr#11492 <http://github.com/ceph/ceph/pull/11492>`_, Alexander Graf)
-* build/ops: allow building RGW with LDAP disabled (`issue#17312 <http://tracker.ceph.com/issues/17312>`_, `pr#11478 <http://github.com/ceph/ceph/pull/11478>`_, Daniel Gryniewicz)
-* build/ops: backport 'logrotate: Run as root/ceph' (`issue#17381 <http://tracker.ceph.com/issues/17381>`_, `pr#11201 <http://github.com/ceph/ceph/pull/11201>`_, Boris Ranto)
-* build/ops: ceph installs stuff in %_udevrulesdir but does not own that directory (`issue#16949 <http://tracker.ceph.com/issues/16949>`_, `pr#10862 <http://github.com/ceph/ceph/pull/10862>`_, Nathan Cutler)
-* build/ops: ceph-osd-prestart.sh fails confusingly when data directory does not exist (`issue#17091 <http://tracker.ceph.com/issues/17091>`_, `pr#10812 <http://github.com/ceph/ceph/pull/10812>`_, Nathan Cutler)
-* build/ops: disable LTTng-UST in openSUSE builds (`issue#16937 <http://tracker.ceph.com/issues/16937>`_, `pr#10794 <http://github.com/ceph/ceph/pull/10794>`_, Michel Normand)
-* build/ops: i386 tarball gitbuilder failure on master (`issue#16398 <http://tracker.ceph.com/issues/16398>`_, `pr#10855 <http://github.com/ceph/ceph/pull/10855>`_, Vikhyat Umrao, Kefu Chai)
-* build/ops: include more files in "make dist" tarball (`issue#17560 <http://tracker.ceph.com/issues/17560>`_, `pr#11431 <http://github.com/ceph/ceph/pull/11431>`_, Ken Dreyer)
-* build/ops: incorrect value of CINIT_FLAG_DEFER_DROP_PRIVILEGES (`issue#16663 <http://tracker.ceph.com/issues/16663>`_, `pr#10278 <http://github.com/ceph/ceph/pull/10278>`_, Casey Bodley)
-* build/ops: remove SYSTEMD_RUN from initscript (`issue#7627 <http://tracker.ceph.com/issues/7627>`_, `issue#16441 <http://tracker.ceph.com/issues/16441>`_, `issue#16440 <http://tracker.ceph.com/issues/16440>`_, `pr#9872 <http://github.com/ceph/ceph/pull/9872>`_, Vladislav Odintsov)
-* build/ops: systemd: add install section to rbdmap.service file (`issue#17541 <http://tracker.ceph.com/issues/17541>`_, `pr#11158 <http://github.com/ceph/ceph/pull/11158>`_, Jelle vd Kooij)
-* common: Enable/Disable of features is allowed even the features are already enabled/disabled (`issue#16079 <http://tracker.ceph.com/issues/16079>`_, `pr#11460 <http://github.com/ceph/ceph/pull/11460>`_, Lu Shi)
-* common: Log.cc: Assign LOG_INFO priority to syslog calls (`issue#15808 <http://tracker.ceph.com/issues/15808>`_, `pr#11231 <http://github.com/ceph/ceph/pull/11231>`_, Brad Hubbard)
-* common: Proxied operations shouldn't result in error messages if replayed (`issue#16130 <http://tracker.ceph.com/issues/16130>`_, `pr#11461 <http://github.com/ceph/ceph/pull/11461>`_, Vikhyat Umrao)
-* common: Request exclusive lock if owner sends -ENOTSUPP for proxied maintenance op (`issue#16171 <http://tracker.ceph.com/issues/16171>`_, `pr#10784 <http://github.com/ceph/ceph/pull/10784>`_, Jason Dillaman)
-* common: msgr/async: Messenger thread long time lock hold risk (`issue#15758 <http://tracker.ceph.com/issues/15758>`_, `pr#10761 <http://github.com/ceph/ceph/pull/10761>`_, Wei Jin)
-* doc: fix description for rsize and rasize (`issue#17357 <http://tracker.ceph.com/issues/17357>`_, `pr#11171 <http://github.com/ceph/ceph/pull/11171>`_, Andreas Gerstmayr)
-* filestore: can get stuck in an unbounded loop during scrub (`issue#17859 <http://tracker.ceph.com/issues/17859>`_, `pr#12001 <http://github.com/ceph/ceph/pull/12001>`_, Sage Weil)
-* fs: Failure in snaptest-git-ceph.sh (`issue#17172 <http://tracker.ceph.com/issues/17172>`_, `pr#11419 <http://github.com/ceph/ceph/pull/11419>`_, Yan, Zheng)
-* fs: Log path as well as ino when detecting metadata damage (`issue#16973 <http://tracker.ceph.com/issues/16973>`_, `pr#11418 <http://github.com/ceph/ceph/pull/11418>`_, John Spray)
-* fs: client: FAILED assert(root_ancestor->qtree == __null) (`issue#16066 <http://tracker.ceph.com/issues/16066>`_, `issue#16067 <http://tracker.ceph.com/issues/16067>`_, `pr#10107 <http://github.com/ceph/ceph/pull/10107>`_, Yan, Zheng)
-* fs: client: add missing client_lock for get_root (`issue#17197 <http://tracker.ceph.com/issues/17197>`_, `pr#10921 <http://github.com/ceph/ceph/pull/10921>`_, Patrick Donnelly)
-* fs: client: fix shutdown with open inodes (`issue#16764 <http://tracker.ceph.com/issues/16764>`_, `pr#10958 <http://github.com/ceph/ceph/pull/10958>`_, John Spray)
-* fs: client: nlink count is not maintained correctly (`issue#16668 <http://tracker.ceph.com/issues/16668>`_, `pr#10877 <http://github.com/ceph/ceph/pull/10877>`_, Jeff Layton)
-* fs: multimds: allow_multimds not required when max_mds is set in ceph.conf at startup (`issue#17105 <http://tracker.ceph.com/issues/17105>`_, `pr#10997 <http://github.com/ceph/ceph/pull/10997>`_, Patrick Donnelly)
-* librados: memory leaks from ceph::crypto (WITH_NSS) (`issue#17205 <http://tracker.ceph.com/issues/17205>`_, `pr#11409 <http://github.com/ceph/ceph/pull/11409>`_, Casey Bodley)
-* librados: modify Pipe::connect() to return the error code (`issue#15308 <http://tracker.ceph.com/issues/15308>`_, `pr#11193 <http://github.com/ceph/ceph/pull/11193>`_, Vikhyat Umrao)
-* librados: remove new setxattr overload to avoid breaking the C++ ABI (`issue#18058 <http://tracker.ceph.com/issues/18058>`_, `pr#12207 <http://github.com/ceph/ceph/pull/12207>`_, Josh Durgin)
-* librbd: cannot disable journaling or remove non-mirrored, non-primary image (`issue#16740 <http://tracker.ceph.com/issues/16740>`_, `pr#11337 <http://github.com/ceph/ceph/pull/11337>`_, Jason Dillaman)
-* librbd: discard after write can result in assertion failure (`issue#17695 <http://tracker.ceph.com/issues/17695>`_, `pr#11644 <http://github.com/ceph/ceph/pull/11644>`_, Jason Dillaman)
-* librbd::Operations: update notification failed: (2) No such file or directory (`issue#17549 <http://tracker.ceph.com/issues/17549>`_, `pr#11420 <http://github.com/ceph/ceph/pull/11420>`_, Jason Dillaman)
-* mds: Crash in Client::_invalidate_kernel_dcache when reconnecting during unmount (`issue#17253 <http://tracker.ceph.com/issues/17253>`_, `pr#11414 <http://github.com/ceph/ceph/pull/11414>`_, Yan, Zheng)
-* mds: Duplicate damage table entries (`issue#17173 <http://tracker.ceph.com/issues/17173>`_, `pr#11412 <http://github.com/ceph/ceph/pull/11412>`_, John Spray)
-* mds: Failure in dirfrag.sh (`issue#17286 <http://tracker.ceph.com/issues/17286>`_, `pr#11416 <http://github.com/ceph/ceph/pull/11416>`_, Yan, Zheng)
-* mds: Failure in snaptest-git-ceph.sh (`issue#17271 <http://tracker.ceph.com/issues/17271>`_, `pr#11415 <http://github.com/ceph/ceph/pull/11415>`_, Yan, Zheng)
-* mon: Ceph Status - Segmentation Fault (`issue#16266 <http://tracker.ceph.com/issues/16266>`_, `pr#11408 <http://github.com/ceph/ceph/pull/11408>`_, Brad Hubbard)
-* mon: Display full flag in ceph status if full flag is set (`issue#15809 <http://tracker.ceph.com/issues/15809>`_, `pr#9388 <http://github.com/ceph/ceph/pull/9388>`_, Vikhyat Umrao)
-* mon: Error EINVAL: removing mon.a at 172.21.15.16:6789/0, there will be 1 monitors (`issue#17725 <http://tracker.ceph.com/issues/17725>`_, `pr#12267 <http://github.com/ceph/ceph/pull/12267>`_, Joao Eduardo Luis)
-* mon: OSDMonitor: only reject MOSDBoot based on up_from if inst matches (`issue#17899 <http://tracker.ceph.com/issues/17899>`_, `pr#12067 <http://github.com/ceph/ceph/pull/12067>`_, Samuel Just)
-* mon: OSDMonitor: Missing nearfull flag set (`issue#17390 <http://tracker.ceph.com/issues/17390>`_, `pr#11272 <http://github.com/ceph/ceph/pull/11272>`_, Igor Podoski)
-* mon: Upgrading 0.94.6 -> 0.94.9 saturating mon node networking (`issue#17365 <http://tracker.ceph.com/issues/17365>`_, `issue#17386 <http://tracker.ceph.com/issues/17386>`_, `pr#11679 <http://github.com/ceph/ceph/pull/11679>`_, Sage Weil, xie xingguo)
-* mon: ceph mon Segmentation fault after set crush_ruleset ceph 10.2.2 (`issue#16653 <http://tracker.ceph.com/issues/16653>`_, `pr#10861 <http://github.com/ceph/ceph/pull/10861>`_, song baisen)
-* mon: crash: crush/CrushWrapper.h: 940: FAILED assert(successful_detach) (`issue#16525 <http://tracker.ceph.com/issues/16525>`_, `pr#10496 <http://github.com/ceph/ceph/pull/10496>`_, Kefu Chai)
-* mon: don't crash on invalid standby_for_fscid (`issue#17466 <http://tracker.ceph.com/issues/17466>`_, `pr#11389 <http://github.com/ceph/ceph/pull/11389>`_, John Spray)
-* mon: fix missing osd metadata (again) (`issue#17685 <http://tracker.ceph.com/issues/17685>`_, `pr#11642 <http://github.com/ceph/ceph/pull/11642>`_, John Spray)
-* mon: osdmonitor: decouple adjust_heartbeat_grace and min_down_reporters (`issue#17055 <http://tracker.ceph.com/issues/17055>`_, `pr#10757 <http://github.com/ceph/ceph/pull/10757>`_, Zengran Zhang)
-* mon: the %USED of ceph df is wrong (`issue#16933 <http://tracker.ceph.com/issues/16933>`_, `pr#10860 <http://github.com/ceph/ceph/pull/10860>`_, Kefu Chai)
-* osd: condition OSDMap encoding on features (`issue#18015 <http://tracker.ceph.com/issues/18015>`_, `pr#12167 <http://github.com/ceph/ceph/pull/12167>`_, Sage Weil)
-* osd: PG::_update_calc_stats wrong for CRUSH_ITEM_NONE up set items (`issue#16998 <http://tracker.ceph.com/issues/16998>`_, `pr#10883 <http://github.com/ceph/ceph/pull/10883>`_, Samuel Just)
-* osd: PG::choose_acting valgrind error or ./common/hobject.h: 182: FAILED assert(!max || (\*this == hobject_t(hobject_t::get_max()))) (`issue#13967 <http://tracker.ceph.com/issues/13967>`_, `pr#10885 <http://github.com/ceph/ceph/pull/10885>`_, Tao Chang)
-* osd: Potential crash during journal::Replay shut down (`issue#16433 <http://tracker.ceph.com/issues/16433>`_, `pr#10645 <http://github.com/ceph/ceph/pull/10645>`_, Jason Dillaman)
-* osd: add peer_addr in heartbeat_check log message (`issue#15762 <http://tracker.ceph.com/issues/15762>`_, `pr#9739 <http://github.com/ceph/ceph/pull/9739>`_, Vikhyat Umrao, Sage Weil)
-* osd: adjust scrub boundary to object without SnapSet (`issue#17470 <http://tracker.ceph.com/issues/17470>`_, `pr#11311 <http://github.com/ceph/ceph/pull/11311>`_, Samuel Just)
-* osd: ceph osd df does not show summarized info correctly if one or more OSDs are out (`issue#16706 <http://tracker.ceph.com/issues/16706>`_, `pr#10759 <http://github.com/ceph/ceph/pull/10759>`_, xie xingguo)
-* osd: journal: do not prematurely flag object recorder as closed (`issue#17590 <http://tracker.ceph.com/issues/17590>`_, `pr#11634 <http://github.com/ceph/ceph/pull/11634>`_, Jason Dillaman)
-* osd: mark_all_unfound_lost() leaves unapplied changes (`issue#16156 <http://tracker.ceph.com/issues/16156>`_, `pr#10886 <http://github.com/ceph/ceph/pull/10886>`_, Samuel Just)
-* osd: segfault in ObjectCacher::FlusherThread (`issue#16610 <http://tracker.ceph.com/issues/16610>`_, `pr#10864 <http://github.com/ceph/ceph/pull/10864>`_, Yan, Zheng)
-* qa: remove EnumerateObjects from librados upgrade tests (`pr#11728 <https://github.com/ceph/ceph/pull/11728>`_, Josh Durgin)
-* rbd: Disabling pool mirror mode with registered peers results orphaned mirrored images (`issue#16984 <http://tracker.ceph.com/issues/16984>`_, `pr#10857 <http://github.com/ceph/ceph/pull/10857>`_, Jason Dillaman)
-* rbd: ImageWatcher: use after free within C_UnwatchAndFlush (`issue#17289 <http://tracker.ceph.com/issues/17289>`_, `issue#17254 <http://tracker.ceph.com/issues/17254>`_, `pr#11466 <http://github.com/ceph/ceph/pull/11466>`_, Jason Dillaman)
-* rbd: Prevent the creation of a clone from a non-primary mirrored image (`issue#16449 <http://tracker.ceph.com/issues/16449>`_, `pr#10650 <http://github.com/ceph/ceph/pull/10650>`_, Mykola Golub)
-* rbd: RBD should restrict mirror enable/disable actions on parents/clones (`issue#16056 <http://tracker.ceph.com/issues/16056>`_, `pr#11459 <http://github.com/ceph/ceph/pull/11459>`_, zhuangzeqiang)
-* rbd: TestJournalReplay: sporadic assert(m_state == STATE_READY || m_state == STATE_STOPPING) failure (`issue#17566 <http://tracker.ceph.com/issues/17566>`_, `pr#11590 <http://github.com/ceph/ceph/pull/11590>`_, Jason Dillaman)
-* rbd: bench io-size should not be larger than image size (`issue#16967 <http://tracker.ceph.com/issues/16967>`_, `pr#10796 <http://github.com/ceph/ceph/pull/10796>`_, Jason Dillaman)
-* rbd: ceph 10.2.2 rbd status on image format 2 returns (2) No such file or directory (`issue#16887 <http://tracker.ceph.com/issues/16887>`_, `pr#10652 <http://github.com/ceph/ceph/pull/10652>`_, Jason Dillaman)
-* rbd: helgrind: TestLibRBD.TestIOPP potential deadlock closing an image with read-ahead enabled (`issue#17198 <http://tracker.ceph.com/issues/17198>`_, `pr#11463 <http://github.com/ceph/ceph/pull/11463>`_, Jason Dillaman)
-* rbd: image.stat() call in librbdpy fails sometimes (`issue#17310 <http://tracker.ceph.com/issues/17310>`_, `pr#11464 <http://github.com/ceph/ceph/pull/11464>`_, Jason Dillaman)
-* rbd: krbd qa scripts and concurrent.sh test fix (`issue#17223 <http://tracker.ceph.com/issues/17223>`_, `pr#11018 <http://github.com/ceph/ceph/pull/11018>`_, Ilya Dryomov)
-* rbd: krbd-related CLI patches (`issue#17554 <http://tracker.ceph.com/issues/17554>`_, `pr#11400 <http://github.com/ceph/ceph/pull/11400>`_, Ilya Dryomov)
-* rbd: mirror: improve resiliency of stress test case (`issue#16855 <http://tracker.ceph.com/issues/16855>`_, `issue#16555 <http://tracker.ceph.com/issues/16555>`_, `issue#14738 <http://tracker.ceph.com/issues/14738>`_, `issue#15259 <http://tracker.ceph.com/issues/15259>`_, `issue#17446 <http://tracker.ceph.com/issues/17446>`_, `issue#17355 <http://tracker.ceph.com/issues/17355>`_, `issue#16538 <http://tracker.ceph.com/issues/16538>`_, `issue#16974 <http://tracker.ceph.com/issues/16974>`_, `issue#17283 <http://tracker.ceph.com/issues/17283>`_, `issue#17317 <http://tracker.ceph.com/issues/17317>`_, `issue#17416 <http://tracker.ceph.com/issues/17416>`_, `issue#16227 <http://tracker.ceph.com/issues/16227>`_, `pr#11433 <http://github.com/ceph/ceph/pull/11433>`_, Mykola Golub, Ricardo Dias, Jason Dillaman)
-* rbd: rbd-nbd IO hang (`issue#16921 <http://tracker.ceph.com/issues/16921>`_, `pr#11467 <http://github.com/ceph/ceph/pull/11467>`_, Jason Dillaman)
-* rbd: update_features API needs to support backwards/forward compatibility (`issue#17330 <http://tracker.ceph.com/issues/17330>`_, `pr#11462 <http://github.com/ceph/ceph/pull/11462>`_, Jason Dillaman)
-* rgw: COPY broke multipart files uploaded under dumpling (`issue#16435 <http://tracker.ceph.com/issues/16435>`_, `pr#10866 <http://github.com/ceph/ceph/pull/10866>`_, Yehuda Sadeh)
-* rgw: Config parameter rgw keystone make new tenants in radosgw multitenancy does not work (`issue#17293 <http://tracker.ceph.com/issues/17293>`_, `pr#11473 <http://github.com/ceph/ceph/pull/11473>`_, SirishaGuduru)
-* rgw: Do not archive metadata by default (`issue#17256 <http://tracker.ceph.com/issues/17256>`_, `pr#11321 <http://github.com/ceph/ceph/pull/11321>`_, Pavan Rallabhandi, Matt Benjamin)
-* rgw: ERROR: got unexpected error when trying to read object: -2 (`issue#17111 <http://tracker.ceph.com/issues/17111>`_, `pr#11472 <http://github.com/ceph/ceph/pull/11472>`_, Yang Honggang)
-* rgw: Modification for TEST S3 ACCESS section in INSTALL CEPH OBJECT GATEWAY page (`issue#15603 <http://tracker.ceph.com/issues/15603>`_, `pr#11475 <http://github.com/ceph/ceph/pull/11475>`_, la-sguduru)
-* rgw: RGW loses realm/period/zonegroup/zone data: period overwritten if somewhere in the cluster is still running Hammer (`issue#17371 <http://tracker.ceph.com/issues/17371>`_, `pr#11519 <http://github.com/ceph/ceph/pull/11519>`_, Orit Wasserman)
-* rgw: RGWDataSyncCR fails on errors from RGWListBucketIndexesCR (`issue#17073 <http://tracker.ceph.com/issues/17073>`_, `pr#11330 <http://github.com/ceph/ceph/pull/11330>`_, Casey Bodley)
-* rgw: S3 object versioning fails when applied on a non-master zone (`issue#16494 <http://tracker.ceph.com/issues/16494>`_, `pr#11367 <http://github.com/ceph/ceph/pull/11367>`_, Yehuda Sadeh)
-* rgw: add orphan options to radosgw-admin --help and man page (`issue#17281 <http://tracker.ceph.com/issues/17281>`_, `issue#17280 <http://tracker.ceph.com/issues/17280>`_, `pr#11139 <http://github.com/ceph/ceph/pull/11139>`_, Ken Dreyer, Thomas Serlin)
-* rgw: back off bucket sync on failures, don't store marker (`issue#16742 <http://tracker.ceph.com/issues/16742>`_, `pr#11021 <http://github.com/ceph/ceph/pull/11021>`_, Yehuda Sadeh)
-* rgw: combined LDAP backports (`issue#17544 <http://tracker.ceph.com/issues/17544>`_, `issue#17185 <http://tracker.ceph.com/issues/17185>`_, `pr#11332 <http://github.com/ceph/ceph/pull/11332>`_, Harald Klein, Matt Benjamin)
-* rgw: cors auto memleak (`issue#16564 <http://tracker.ceph.com/issues/16564>`_, `pr#10656 <http://github.com/ceph/ceph/pull/10656>`_, Yan Jun)
-* rgw: default quota fixes (`issue#16410 <http://tracker.ceph.com/issues/16410>`_, `pr#10832 <http://github.com/ceph/ceph/pull/10832>`_, Pavan Rallabhandi, Daniel Gryniewicz)
-* rgw: doc: description of multipart part entity is wrong (`issue#17504 <http://tracker.ceph.com/issues/17504>`_, `pr#11342 <http://github.com/ceph/ceph/pull/11342>`_, weiqiaomiao)
-* rgw: don't loop forever when reading data from 0 sized segment. (`issue#17692 <http://tracker.ceph.com/issues/17692>`_, `pr#11626 <http://github.com/ceph/ceph/pull/11626>`_, Marcus Watts)
-* rgw: fix put_acls for objects starting and ending with underscore (`issue#17625 <http://tracker.ceph.com/issues/17625>`_, `pr#11669 <http://github.com/ceph/ceph/pull/11669>`_, Orit Wasserman)
-* rgw: fix regression with handling double underscore (`issue#17443 <http://tracker.ceph.com/issues/17443>`_, `issue#16856 <http://tracker.ceph.com/issues/16856>`_, `pr#11563 <http://github.com/ceph/ceph/pull/11563>`_, Yehuda Sadeh, Orit Wasserman)
-* rgw: handle empty POST condition (`issue#17635 <http://tracker.ceph.com/issues/17635>`_, `pr#11662 <http://github.com/ceph/ceph/pull/11662>`_, Yehuda Sadeh)
-* rgw: metadata sync can skip markers for failed/incomplete entries (`issue#16759 <http://tracker.ceph.com/issues/16759>`_, `pr#10657 <http://github.com/ceph/ceph/pull/10657>`_, Yehuda Sadeh)
-* rgw: nfs backports (`issue#17393 <http://tracker.ceph.com/issues/17393>`_, `issue#17311 <http://tracker.ceph.com/issues/17311>`_, `issue#17367 <http://tracker.ceph.com/issues/17367>`_, `issue#17319 <http://tracker.ceph.com/issues/17319>`_, `issue#17321 <http://tracker.ceph.com/issues/17321>`_, `issue#17322 <http://tracker.ceph.com/issues/17322>`_, `issue#17323 <http://tracker.ceph.com/issues/17323>`_, `issue#17325 <http://tracker.ceph.com/issues/17325>`_, `issue#17326 <http://tracker.ceph.com/issues/17326>`_, `issue#17327 <http://tracker.ceph.com/issues/17327>`_, `pr#11335 <http://github.com/ceph/ceph/pull/11335>`_, Min Chen, Yan Jun, Weibing Zhang, Matt Benjamin)
-* rgw: period commit loses zonegroup changes: region_map converted repeatedly (`issue#17051 <http://tracker.ceph.com/issues/17051>`_, `pr#10890 <http://github.com/ceph/ceph/pull/10890>`_, Casey Bodley)
-* rgw: period commit return error when the current period has a zonegroup which doesn't have a master zone (`issue#17110 <http://tracker.ceph.com/issues/17110>`_, `pr#10867 <http://github.com/ceph/ceph/pull/10867>`_, weiqiaomiao)
-* rgw: radosgw daemon core when reopen logs (`issue#17036 <http://tracker.ceph.com/issues/17036>`_, `pr#10868 <http://github.com/ceph/ceph/pull/10868>`_, weiqiaomiao)
-* rgw: rgw file uses too much CPU in gc/idle thread (`issue#16976 <http://tracker.ceph.com/issues/16976>`_, `pr#10889 <http://github.com/ceph/ceph/pull/10889>`_, Matt Benjamin)
-* rgw: s3tests-test-readwrite failing with 500 (`issue#16930 <http://tracker.ceph.com/issues/16930>`_, `pr#11471 <http://github.com/ceph/ceph/pull/11471>`_, Yehuda Sadeh)
-* rgw: upgrade from old multisite to new multisite fails (`issue#16751 <http://tracker.ceph.com/issues/16751>`_, `pr#10891 <http://github.com/ceph/ceph/pull/10891>`_, Orit Wasserman)
-* rgw:response information is error when geting token of swift account (`issue#15195 <http://tracker.ceph.com/issues/15195>`_, `pr#11474 <http://github.com/ceph/ceph/pull/11474>`_, Qiankun Zheng)
-* rgw:user email can modify to empty when it has values (`issue#13286 <http://tracker.ceph.com/issues/13286>`_, `pr#11469 <http://github.com/ceph/ceph/pull/11469>`_, Yehuda Sadeh, Weijun Duan)
-* tests: ceph-disk must ignore debug monc (`issue#17607 <http://tracker.ceph.com/issues/17607>`_, `pr#11548 <http://github.com/ceph/ceph/pull/11548>`_, Loic Dachary)
-* tests: fix TestClsRbd.mirror_image failure in upgrade:jewel-x-master-distro-basic-vps (`issue#16529 <http://tracker.ceph.com/issues/16529>`_, `pr#10888 <http://github.com/ceph/ceph/pull/10888>`_, Jason Dillaman)
-* tests: scsi_debug fails /dev/disk/by-partuuid (`issue#17100 <http://tracker.ceph.com/issues/17100>`_, `pr#11411 <http://github.com/ceph/ceph/pull/11411>`_, Loic Dachary)
-* tests: test/ceph_test_msgr: do not use Message::middle for holding transient… (`issue#17365 <http://tracker.ceph.com/issues/17365>`_, `issue#17728 <http://tracker.ceph.com/issues/17728>`_, `issue#16955 <http://tracker.ceph.com/issues/16955>`_, `pr#11742 <http://github.com/ceph/ceph/pull/11742>`_, Haomai Wang, Kefu Chai, Michal Jarzabek, Sage Weil)
-* tools: Missing comma in ceph-create-keys causes concatenation of arguments (`issue#17815 <http://tracker.ceph.com/issues/17815>`_, `pr#11822 <http://github.com/ceph/ceph/pull/11822>`_, Patrick Donnelly)
-* tools: add a tool to rebuild mon store from OSD (`issue#17179 <http://tracker.ceph.com/issues/17179>`_, `issue#17400 <http://tracker.ceph.com/issues/17400>`_, `pr#11126 <http://github.com/ceph/ceph/pull/11126>`_, Kefu Chai, xie xingguo)
-* tools: ceph-create-keys: sometimes blocks forever if mds allow is set (`issue#16255 <http://tracker.ceph.com/issues/16255>`_, `pr#11417 <http://github.com/ceph/ceph/pull/11417>`_, John Spray)
-* tools: ceph-disk should timeout when a lock cannot be acquired (`issue#16580 <http://tracker.ceph.com/issues/16580>`_, `pr#10758 <http://github.com/ceph/ceph/pull/10758>`_, Loic Dachary)
-* tools: ceph-disk: expected systemd unit failures are confusing (`issue#15990 <http://tracker.ceph.com/issues/15990>`_, `pr#10884 <http://github.com/ceph/ceph/pull/10884>`_, Boris Ranto)
-* tools: ceph-disk: using a regular file as a journal fails (`issue#16280 <http://tracker.ceph.com/issues/16280>`_, `issue#17662 <http://tracker.ceph.com/issues/17662>`_, `pr#11657 <http://github.com/ceph/ceph/pull/11657>`_, Jayashree Candadai, Anirudha Bose, Loic Dachary, Shylesh Kumar)
-* tools: ceph-objectstore-tool crashes if --journal-path <a-directory> (`issue#17307 <http://tracker.ceph.com/issues/17307>`_, `pr#11407 <http://github.com/ceph/ceph/pull/11407>`_, Kefu Chai)
-* tools: ceph-objectstore-tool: add a way to split filestore directories offline (`issue#17220 <http://tracker.ceph.com/issues/17220>`_, `pr#11252 <http://github.com/ceph/ceph/pull/11252>`_, Josh Durgin)
-* tools: ceph-post-file: use new ssh key (`issue#14267 <http://tracker.ceph.com/issues/14267>`_, `pr#11746 <http://github.com/ceph/ceph/pull/11746>`_, David Galloway)
-
-
-v10.2.3 Jewel
-=============
-
-This point release fixes several important bugs in RBD mirroring, RGW multi-site, CephFS, and RADOS.
-
-We recommend that all v10.2.x users upgrade.
-
-For more detailed information, see :download:`the complete changelog <../changelog/v10.2.3.txt>`.
-
-Notable Changes
----------------
-
-* build/ops: 60-ceph-partuuid-workaround-rules still needed by debian jessie (udev 215-17) (`issue#16351 <http://tracker.ceph.com/issues/16351>`_, `pr#10653 <http://github.com/ceph/ceph/pull/10653>`_, runsisi, Loic Dachary)
-* build/ops: ceph Resource Agent does not work with systemd (`issue#14828 <http://tracker.ceph.com/issues/14828>`_, `pr#9917 <http://github.com/ceph/ceph/pull/9917>`_, Nathan Cutler)
-* build/ops: ceph-base requires parted (`issue#16095 <http://tracker.ceph.com/issues/16095>`_, `pr#10008 <http://github.com/ceph/ceph/pull/10008>`_, Ken Dreyer)
-* build/ops: ceph-osd-prestart.sh contains Upstart-specific code (`issue#15984 <http://tracker.ceph.com/issues/15984>`_, `pr#10364 <http://github.com/ceph/ceph/pull/10364>`_, Nathan Cutler)
-* build/ops: mount.ceph: move from ceph-base to ceph-common and add symlink in /sbin for SUSE (`issue#16598 <http://tracker.ceph.com/issues/16598>`_, `issue#16645 <http://tracker.ceph.com/issues/16645>`_, `pr#10357 <http://github.com/ceph/ceph/pull/10357>`_, Nathan Cutler, Dan Horák, Ricardo Dias, Kefu Chai)
-* build/ops: need rocksdb commit 7ca731b12ce for ppc64le build (`issue#17092 <http://tracker.ceph.com/issues/17092>`_, `pr#10816 <http://github.com/ceph/ceph/pull/10816>`_, Nathan Cutler)
-* build/ops: rpm: OBS needs ExclusiveArch (`issue#16936 <http://tracker.ceph.com/issues/16936>`_, `pr#10614 <http://github.com/ceph/ceph/pull/10614>`_, Michel Normand)
-* cli: ceph command line tool chokes on ceph –w (the dash is unicode 'en dash' &ndash, copy-paste to reproduce) (`issue#12287 <http://tracker.ceph.com/issues/12287>`_, `pr#10420 <http://github.com/ceph/ceph/pull/10420>`_, Oleh Prypin, Kefu Chai)
-* common: expose buffer const_iterator symbols (`issue#16899 <http://tracker.ceph.com/issues/16899>`_, `pr#10552 <http://github.com/ceph/ceph/pull/10552>`_, Noah Watkins)
-* common: global-init: fixup chown of the run directory along with log and asok files (`issue#15607 <http://tracker.ceph.com/issues/15607>`_, `pr#8754 <http://github.com/ceph/ceph/pull/8754>`_, Karol Mroz)
-* fs: ceph-fuse: link to libtcmalloc or jemalloc (`issue#16655 <http://tracker.ceph.com/issues/16655>`_, `pr#10303 <http://github.com/ceph/ceph/pull/10303>`_, Yan, Zheng)
-* fs: client: crash in unmount when fuse_use_invalidate_cb is enabled (`issue#16137 <http://tracker.ceph.com/issues/16137>`_, `pr#10106 <http://github.com/ceph/ceph/pull/10106>`_, Yan, Zheng)
-* fs: client: fstat cap release (`issue#15723 <http://tracker.ceph.com/issues/15723>`_, `pr#9562 <http://github.com/ceph/ceph/pull/9562>`_, Yan, Zheng, Noah Watkins)
-* fs: essential backports for OpenStack Manila (`issue#15406 <http://tracker.ceph.com/issues/15406>`_, `issue#15614 <http://tracker.ceph.com/issues/15614>`_, `issue#15615 <http://tracker.ceph.com/issues/15615>`_, `pr#10453 <http://github.com/ceph/ceph/pull/10453>`_, John Spray, Ramana Raja, Xiaoxi Chen)
-* fs: fix double-unlock on shutdown (`issue#17126 <http://tracker.ceph.com/issues/17126>`_, `pr#10847 <http://github.com/ceph/ceph/pull/10847>`_, Greg Farnum)
-* fs: fix mdsmap print_summary with standby replays (`issue#15705 <http://tracker.ceph.com/issues/15705>`_, `pr#9547 <http://github.com/ceph/ceph/pull/9547>`_, John Spray)
-* fs: fuse mounted file systems fails SAMBA CTDB ping_pong rw test with v9.0.2 (`issue#12653 <http://tracker.ceph.com/issues/12653>`_, `issue#15634 <http://tracker.ceph.com/issues/15634>`_, `pr#10108 <http://github.com/ceph/ceph/pull/10108>`_, Yan, Zheng)
-* librados: Missing export for rados_aio_get_version in src/include/rados/librados.h (`issue#15535 <http://tracker.ceph.com/issues/15535>`_, `pr#9574 <http://github.com/ceph/ceph/pull/9574>`_, Jim Wright)
-* librados: osd: bad flags can crash the osd (`issue#16012 <http://tracker.ceph.com/issues/16012>`_, `pr#9997 <http://github.com/ceph/ceph/pull/9997>`_, Sage Weil)
-* librbd: Close journal and object map before flagging exclusive lock as released (`issue#16450 <http://tracker.ceph.com/issues/16450>`_, `pr#10053 <http://github.com/ceph/ceph/pull/10053>`_, Jason Dillaman)
-* librbd: Crash when utilizing advisory locking API functions (`issue#16364 <http://tracker.ceph.com/issues/16364>`_, `pr#10051 <http://github.com/ceph/ceph/pull/10051>`_, Jason Dillaman)
-* librbd: ExclusiveLock object leaked when switching to snapshot (`issue#16446 <http://tracker.ceph.com/issues/16446>`_, `pr#10054 <http://github.com/ceph/ceph/pull/10054>`_, Jason Dillaman)
-* librbd: FAILED assert(object_no < m_object_map.size()) (`issue#16561 <http://tracker.ceph.com/issues/16561>`_, `pr#10647 <http://github.com/ceph/ceph/pull/10647>`_, Jason Dillaman)
-* librbd: Image removal doesn't necessarily clean up all rbd_mirroring entries (`issue#16471 <http://tracker.ceph.com/issues/16471>`_, `pr#10009 <http://github.com/ceph/ceph/pull/10009>`_, Jason Dillaman)
-* librbd: Object map/fast-diff invalidated if journal replays the same snap remove event (`issue#16350 <http://tracker.ceph.com/issues/16350>`_, `pr#10010 <http://github.com/ceph/ceph/pull/10010>`_, Jason Dillaman)
-* librbd: Timeout sending mirroring notification shouldn't result in failure (`issue#16470 <http://tracker.ceph.com/issues/16470>`_, `pr#10052 <http://github.com/ceph/ceph/pull/10052>`_, Jason Dillaman)
-* librbd: Whitelist EBUSY error from snap unprotect for journal replay (`issue#16445 <http://tracker.ceph.com/issues/16445>`_, `pr#10055 <http://github.com/ceph/ceph/pull/10055>`_, Jason Dillaman)
-* librbd: cancel all tasks should wait until finisher is done (`issue#16517 <http://tracker.ceph.com/issues/16517>`_, `pr#9752 <http://github.com/ceph/ceph/pull/9752>`_, Haomai Wang)
-* librbd: delay acquiring lock if image watch has failed (`issue#16923 <http://tracker.ceph.com/issues/16923>`_, `pr#10827 <http://github.com/ceph/ceph/pull/10827>`_, Jason Dillaman)
-* librbd: fix missing return statement if failed to get mirror image state (`issue#16600 <http://tracker.ceph.com/issues/16600>`_, `pr#10144 <http://github.com/ceph/ceph/pull/10144>`_, runsisi)
-* librbd: flag image as updated after proxying maintenance op (`issue#16404 <http://tracker.ceph.com/issues/16404>`_, `pr#9883 <http://github.com/ceph/ceph/pull/9883>`_, Jason Dillaman)
-* librbd: mkfs.xfs slow performance with discards and object map (`issue#16707 <http://tracker.ceph.com/issues/16707>`_, `issue#16689 <http://tracker.ceph.com/issues/16689>`_, `pr#10649 <http://github.com/ceph/ceph/pull/10649>`_, Jason Dillaman)
-* librbd: potential use after free on refresh error (`issue#16519 <http://tracker.ceph.com/issues/16519>`_, `pr#9952 <http://github.com/ceph/ceph/pull/9952>`_, Mykola Golub)
-* librbd: rbd-nbd does not properly handle resize notifications (`issue#15715 <http://tracker.ceph.com/issues/15715>`_, `pr#10679 <http://github.com/ceph/ceph/pull/10679>`_, Mykola Golub)
-* librbd: the option 'rbd_cache_writethrough_until_flush=true' dosn't work (`issue#16740 <http://tracker.ceph.com/issues/16740>`_, `issue#16386 <http://tracker.ceph.com/issues/16386>`_, `issue#16708 <http://tracker.ceph.com/issues/16708>`_, `issue#16654 <http://tracker.ceph.com/issues/16654>`_, `issue#16478 <http://tracker.ceph.com/issues/16478>`_, `pr#10797 <http://github.com/ceph/ceph/pull/10797>`_, Mykola Golub, xinxin shu, Xiaowei Chen, Jason Dillaman)
-* mds:  tell command blocks forever with async messenger (TestVolumeClient.test_evict_client failure) (`issue#16288 <http://tracker.ceph.com/issues/16288>`_, `pr#10501 <http://github.com/ceph/ceph/pull/10501>`_, Douglas Fuller)
-* mds: Confusing MDS log message when shut down with stalled journaler reads (`issue#15689 <http://tracker.ceph.com/issues/15689>`_, `pr#9557 <http://github.com/ceph/ceph/pull/9557>`_, John Spray)
-* mds: Deadlock on shutdown active rank while busy with metadata IO (`issue#16042 <http://tracker.ceph.com/issues/16042>`_, `pr#10502 <http://github.com/ceph/ceph/pull/10502>`_, Patrick Donnelly)
-* mds: Failing file operations on kernel based cephfs mount point leaves unaccessible file behind on hammer 0.94.7 (`issue#16013 <http://tracker.ceph.com/issues/16013>`_, `pr#10199 <http://github.com/ceph/ceph/pull/10199>`_, Yan, Zheng)
-* mds: Fix shutting down mds timed-out due to deadlock (`issue#16396 <http://tracker.ceph.com/issues/16396>`_, `pr#10500 <http://github.com/ceph/ceph/pull/10500>`_, Zhi Zhang)
-* mds: MDSMonitor fixes (`issue#16136 <http://tracker.ceph.com/issues/16136>`_, `pr#9561 <http://github.com/ceph/ceph/pull/9561>`_, xie xingguo)
-* mds: MDSMonitor::check_subs() is very buggy (`issue#16022 <http://tracker.ceph.com/issues/16022>`_, `pr#10103 <http://github.com/ceph/ceph/pull/10103>`_, Yan, Zheng)
-* mds: Session::check_access() is buggy (`issue#16358 <http://tracker.ceph.com/issues/16358>`_, `pr#10105 <http://github.com/ceph/ceph/pull/10105>`_, Yan, Zheng)
-* mds: StrayManager.cc: 520: FAILED assert(dnl->is_primary()) (`issue#15920 <http://tracker.ceph.com/issues/15920>`_, `pr#9559 <http://github.com/ceph/ceph/pull/9559>`_, Yan, Zheng)
-* mds: enforce a dirfrag limit on entries (`issue#16164 <http://tracker.ceph.com/issues/16164>`_, `pr#10104 <http://github.com/ceph/ceph/pull/10104>`_, Patrick Donnelly)
-* mds: fix SnapRealm::have_past_parents_open() (`issue#16299 <http://tracker.ceph.com/issues/16299>`_, `pr#10499 <http://github.com/ceph/ceph/pull/10499>`_, Yan, Zheng)
-* mds: fix getattr starve setattr (`issue#16154 <http://tracker.ceph.com/issues/16154>`_, `pr#9560 <http://github.com/ceph/ceph/pull/9560>`_, Yan, Zheng)
-* mds: wrongly treat symlink inode as normal file/dir when symlink inode is stale on kcephfs (`issue#15702 <http://tracker.ceph.com/issues/15702>`_, `pr#9405 <http://github.com/ceph/ceph/pull/9405>`_, Zhi Zhang)
-* mon: "mon metadata" fails when only one monitor exists (`issue#15866 <http://tracker.ceph.com/issues/15866>`_, `pr#10654 <http://github.com/ceph/ceph/pull/10654>`_, John Spray, Kefu Chai)
-* mon: Monitor: validate prefix on handle_command() (`issue#16297 <http://tracker.ceph.com/issues/16297>`_, `pr#10036 <http://github.com/ceph/ceph/pull/10036>`_, You Ji)
-* mon: OSDMonitor: drop pg temps from not the current primary (`issue#16127 <http://tracker.ceph.com/issues/16127>`_, `pr#9998 <http://github.com/ceph/ceph/pull/9998>`_, Samuel Just)
-* mon: prepare_pgtemp needs to only update up_thru if newer than the existing one (`issue#16185 <http://tracker.ceph.com/issues/16185>`_, `pr#10001 <http://github.com/ceph/ceph/pull/10001>`_, Samuel Just)
-* msgr: AsyncConnection::lockmsg/async lockdep cycle: AsyncMessenger::lock, MDSDaemon::mds_lock, AsyncConnection::lock (`issue#16237 <http://tracker.ceph.com/issues/16237>`_, `pr#10004 <http://github.com/ceph/ceph/pull/10004>`_, Haomai Wang)
-* msgr: async messenger mon crash (`issue#16378 <http://tracker.ceph.com/issues/16378>`_, `issue#16418 <http://tracker.ceph.com/issues/16418>`_, `pr#9996 <http://github.com/ceph/ceph/pull/9996>`_, Haomai Wang)
-* msgr: backports of all asyncmsgr fixes to jewel (`issue#15503 <http://tracker.ceph.com/issues/15503>`_, `issue#15372 <http://tracker.ceph.com/issues/15372>`_, `pr#9633 <http://github.com/ceph/ceph/pull/9633>`_, Yan Jun, Haomai Wang, Piotr Dałek)
-* msgr: msg/async: connection race hang (`issue#15849 <http://tracker.ceph.com/issues/15849>`_, `pr#10003 <http://github.com/ceph/ceph/pull/10003>`_, Haomai Wang)
-* osd: FileStore: umount hang because sync thread doesn't exit (`issue#15695 <http://tracker.ceph.com/issues/15695>`_, `pr#9105 <http://github.com/ceph/ceph/pull/9105>`_, Kefu Chai)
-* osd: Fixes for list-inconsistent-* (`issue#15766 <http://tracker.ceph.com/issues/15766>`_, `issue#16192 <http://tracker.ceph.com/issues/16192>`_, `issue#15719 <http://tracker.ceph.com/issues/15719>`_, `pr#9565 <http://github.com/ceph/ceph/pull/9565>`_, David Zafman)
-* osd: New pools have bogus stuck inactive/unclean HEALTH_ERR messages until they are first active and clean (`issue#14952 <http://tracker.ceph.com/issues/14952>`_, `pr#10007 <http://github.com/ceph/ceph/pull/10007>`_, Sage Weil)
-* osd: OSD crash with Hammer to Jewel Upgrade: void FileStore::init_temp_collections() (`issue#16672 <http://tracker.ceph.com/issues/16672>`_, `pr#10561 <http://github.com/ceph/ceph/pull/10561>`_, David Zafman)
-* osd: OSD failed to subscribe skipped osdmaps after ceph osd pause (`issue#17023 <http://tracker.ceph.com/issues/17023>`_, `pr#10804 <http://github.com/ceph/ceph/pull/10804>`_, Kefu Chai)
-* osd: ObjectCacher split BufferHead read fix (`issue#16002 <http://tracker.ceph.com/issues/16002>`_, `pr#10074 <http://github.com/ceph/ceph/pull/10074>`_, Greg Farnum)
-* osd: ReplicatedBackend doesn't increment stats on pull, only push (`issue#16277 <http://tracker.ceph.com/issues/16277>`_, `pr#10421 <http://github.com/ceph/ceph/pull/10421>`_, Kefu Chai)
-* osd: Scrub error: 0/1 pinned (`issue#15952 <http://tracker.ceph.com/issues/15952>`_, `pr#9576 <http://github.com/ceph/ceph/pull/9576>`_, Samuel Just)
-* osd: crash adding snap to purged_snaps in ReplicatedPG::WaitingOnReplicas (`issue#15943 <http://tracker.ceph.com/issues/15943>`_, `pr#9575 <http://github.com/ceph/ceph/pull/9575>`_, Samuel Just)
-* osd: partprobe intermittent issues during ceph-disk prepare (`issue#15176 <http://tracker.ceph.com/issues/15176>`_, `pr#10497 <http://github.com/ceph/ceph/pull/10497>`_, Marius Vollmer, Loic Dachary)
-* osd: saw valgrind issues in ReplicatedPG::new_repop (`issue#16801 <http://tracker.ceph.com/issues/16801>`_, `pr#10760 <http://github.com/ceph/ceph/pull/10760>`_, Kefu Chai)
-* osd: sparse_read on ec pool should return extends with correct offset (`issue#16138 <http://tracker.ceph.com/issues/16138>`_, `pr#10006 <http://github.com/ceph/ceph/pull/10006>`_, kofiliu)
-* osd:sched_time not actually randomized (`issue#15890 <http://tracker.ceph.com/issues/15890>`_, `pr#9578 <http://github.com/ceph/ceph/pull/9578>`_, xie xingguo)
-* rbd: ImageReplayer::is_replaying does not include flush state  (`issue#16970 <http://tracker.ceph.com/issues/16970>`_, `pr#10790 <http://github.com/ceph/ceph/pull/10790>`_, Jason Dillaman)
-* rbd: Journal duplicate op detection can cause lockdep error (`issue#16363 <http://tracker.ceph.com/issues/16363>`_, `pr#10044 <http://github.com/ceph/ceph/pull/10044>`_, Jason Dillaman)
-* rbd: Journal needs to handle duplicate maintenance op tids (`issue#16362 <http://tracker.ceph.com/issues/16362>`_, `pr#10045 <http://github.com/ceph/ceph/pull/10045>`_, Jason Dillaman)
-* rbd: Unable to disable journaling feature if in unexpected mirror state (`issue#16348 <http://tracker.ceph.com/issues/16348>`_, `pr#10042 <http://github.com/ceph/ceph/pull/10042>`_, Jason Dillaman)
-* rbd: bashism in src/rbdmap  (`issue#16608 <http://tracker.ceph.com/issues/16608>`_, `pr#10786 <http://github.com/ceph/ceph/pull/10786>`_, Jason Dillaman)
-* rbd: doc: format 2 now is the default image format (`issue#17026 <http://tracker.ceph.com/issues/17026>`_, `pr#10732 <http://github.com/ceph/ceph/pull/10732>`_, Chengwei Yang)
-* rbd: hen journaling is enabled, a flush request shouldn't flush the cache (`issue#15761 <http://tracker.ceph.com/issues/15761>`_, `pr#10041 <http://github.com/ceph/ceph/pull/10041>`_, Yuan Zhou)
-* rbd: possible race condition during journal transition from replay to ready (`issue#16198 <http://tracker.ceph.com/issues/16198>`_, `pr#10047 <http://github.com/ceph/ceph/pull/10047>`_, Jason Dillaman)
-* rbd: qa/workunits/rbd: respect RBD_CREATE_ARGS environment variable (`issue#16289 <http://tracker.ceph.com/issues/16289>`_, `pr#9721 <http://github.com/ceph/ceph/pull/9721>`_, Mykola Golub)
-* rbd: rbd-mirror should disable proxied maintenance ops for non-primary image (`issue#16411 <http://tracker.ceph.com/issues/16411>`_, `pr#10050 <http://github.com/ceph/ceph/pull/10050>`_, Jason Dillaman)
-* rbd: rbd-mirror: FAILED assert(m_local_image_ctx->object_map != nullptr) (`issue#16558 <http://tracker.ceph.com/issues/16558>`_, `pr#10646 <http://github.com/ceph/ceph/pull/10646>`_, Jason Dillaman)
-* rbd: rbd-mirror: FAILED assert(m_on_update_status_finish == nullptr) (`issue#16956 <http://tracker.ceph.com/issues/16956>`_, `pr#10792 <http://github.com/ceph/ceph/pull/10792>`_, Jason Dillaman)
-* rbd: rbd-mirror: FAILED assert(m_state == STATE_STOPPING) (`issue#16980 <http://tracker.ceph.com/issues/16980>`_, `pr#10791 <http://github.com/ceph/ceph/pull/10791>`_, Jason Dillaman)
-* rbd: rbd-mirror: ensure replay status formatter has completed before stopping replay (`issue#16352 <http://tracker.ceph.com/issues/16352>`_, `pr#10043 <http://github.com/ceph/ceph/pull/10043>`_, Jason Dillaman)
-* rbd: rbd-mirror: include local pool id in resync throttle unique key (`issue#16536 <http://tracker.ceph.com/issues/16536>`_, `issue#15239 <http://tracker.ceph.com/issues/15239>`_, `issue#16488 <http://tracker.ceph.com/issues/16488>`_, `issue#16491 <http://tracker.ceph.com/issues/16491>`_, `issue#16329 <http://tracker.ceph.com/issues/16329>`_, `issue#15108 <http://tracker.ceph.com/issues/15108>`_, `issue#15670 <http://tracker.ceph.com/issues/15670>`_, `pr#10678 <http://github.com/ceph/ceph/pull/10678>`_, Ricardo Dias, Jason Dillaman)
-* rbd: rbd-mirror: potential race condition accessing local image journal  (`issue#16230 <http://tracker.ceph.com/issues/16230>`_, `pr#10046 <http://github.com/ceph/ceph/pull/10046>`_, Jason Dillaman)
-* rbd: rbd-mirror: reduce memory footprint during journal replay (`issue#16321 <http://tracker.ceph.com/issues/16321>`_, `issue#16489 <http://tracker.ceph.com/issues/16489>`_, `issue#16622 <http://tracker.ceph.com/issues/16622>`_, `issue#16539 <http://tracker.ceph.com/issues/16539>`_, `issue#16223 <http://tracker.ceph.com/issues/16223>`_, `issue#16349 <http://tracker.ceph.com/issues/16349>`_, `pr#10684 <http://github.com/ceph/ceph/pull/10684>`_, Mykola Golub, Jason Dillaman)
-* rgw: A query on a static large object fails with 404 error (`issue#16015 <http://tracker.ceph.com/issues/16015>`_, `pr#9544 <http://github.com/ceph/ceph/pull/9544>`_, Radoslaw Zarzynski)
-* rgw: Add zone rename to radosgw_admin (`issue#16934 <http://tracker.ceph.com/issues/16934>`_, `pr#10663 <http://github.com/ceph/ceph/pull/10663>`_, Shilpa Jagannath)
-* rgw: Bucket index shards orphaned after bucket delete (`issue#16412 <http://tracker.ceph.com/issues/16412>`_, `pr#10525 <http://github.com/ceph/ceph/pull/10525>`_, Orit Wasserman)
-* rgw: Bug when using port 443s in rgw. (`issue#16548 <http://tracker.ceph.com/issues/16548>`_, `pr#10664 <http://github.com/ceph/ceph/pull/10664>`_, Pritha Srivastava)
-* rgw: Fallback to Host header for bucket name. (`issue#15975 <http://tracker.ceph.com/issues/15975>`_, `pr#10693 <http://github.com/ceph/ceph/pull/10693>`_, Robin H. Johnson)
-* rgw: Fix civetweb IPv6 (`issue#16928 <http://tracker.ceph.com/issues/16928>`_, `pr#10580 <http://github.com/ceph/ceph/pull/10580>`_, Robin H. Johnson)
-* rgw: Increase log level for messages occuring while running rgw admin command (`issue#16935 <http://tracker.ceph.com/issues/16935>`_, `pr#10765 <http://github.com/ceph/ceph/pull/10765>`_, Shilpa Jagannath)
-* rgw: No Last-Modified, Content-Size and X-Object-Manifest headers if no segments in DLO manifest (`issue#15812 <http://tracker.ceph.com/issues/15812>`_, `pr#9265 <http://github.com/ceph/ceph/pull/9265>`_, Radoslaw Zarzynski)
-* rgw: RGWPeriodPuller tries to pull from itself (`issue#16939 <http://tracker.ceph.com/issues/16939>`_, `pr#10764 <http://github.com/ceph/ceph/pull/10764>`_, Casey Bodley)
-* rgw: Set Access-Control-Allow-Origin to a Asterisk if allowed in a rule (`issue#15348 <http://tracker.ceph.com/issues/15348>`_, `pr#9453 <http://github.com/ceph/ceph/pull/9453>`_, Wido den Hollander)
-* rgw: Swift API returns double space usage and objects of account metadata (`issue#16188 <http://tracker.ceph.com/issues/16188>`_, `pr#10148 <http://github.com/ceph/ceph/pull/10148>`_, Albert Tu)
-* rgw: account/container metadata not actually present in a request are deleted during POST through Swift API (`issue#15977 <http://tracker.ceph.com/issues/15977>`_, `issue#15779 <http://tracker.ceph.com/issues/15779>`_, `pr#9542 <http://github.com/ceph/ceph/pull/9542>`_, Radoslaw Zarzynski)
-* rgw: add socket backlog setting for via ceph.conf (`issue#16406 <http://tracker.ceph.com/issues/16406>`_, `pr#10216 <http://github.com/ceph/ceph/pull/10216>`_, Feng Guo)
-* rgw: add tenant support to multisite sync (`issue#16469 <http://tracker.ceph.com/issues/16469>`_, `issue#16121 <http://tracker.ceph.com/issues/16121>`_, `issue#16665 <http://tracker.ceph.com/issues/16665>`_, `pr#10845 <http://github.com/ceph/ceph/pull/10845>`_, Yehuda Sadeh, Josh Durgin, Casey Bodley, Pritha Srivastava)
-* rgw: add_zone only clears master_zone if --master=false (`issue#15901 <http://tracker.ceph.com/issues/15901>`_, `pr#9327 <http://github.com/ceph/ceph/pull/9327>`_, Casey Bodley)
-* rgw: aws4 parsing issue (`issue#15940 <http://tracker.ceph.com/issues/15940>`_, `issue#15939 <http://tracker.ceph.com/issues/15939>`_, `pr#9545 <http://github.com/ceph/ceph/pull/9545>`_, Yehuda Sadeh)
-* rgw: aws4: add STREAMING-AWS4-HMAC-SHA256-PAYLOAD support (`issue#16146 <http://tracker.ceph.com/issues/16146>`_, `pr#10167 <http://github.com/ceph/ceph/pull/10167>`_, Radoslaw Zarzynski, Javier M. Mellid)
-* rgw: backport merge of static sites fixes (`issue#15555 <http://tracker.ceph.com/issues/15555>`_, `issue#15532 <http://tracker.ceph.com/issues/15532>`_, `issue#15531 <http://tracker.ceph.com/issues/15531>`_, `pr#9568 <http://github.com/ceph/ceph/pull/9568>`_, Robin H. Johnson)
-* rgw: can set negative max_buckets on RGWUserInfo (`issue#14534 <http://tracker.ceph.com/issues/14534>`_, `pr#10655 <http://github.com/ceph/ceph/pull/10655>`_, Yehuda Sadeh)
-* rgw: cleanup radosgw-admin temp command as it was deprecated (`issue#16023 <http://tracker.ceph.com/issues/16023>`_, `pr#9390 <http://github.com/ceph/ceph/pull/9390>`_, Vikhyat Umrao)
-* rgw: comparing return code to ERR_NOT_MODIFIED in rgw_rest_s3.cc (needs minus sign) (`issue#16327 <http://tracker.ceph.com/issues/16327>`_, `pr#9790 <http://github.com/ceph/ceph/pull/9790>`_, Nathan Cutler)
-* rgw: custom metadata aren't camelcased in Swift's responses (`issue#15902 <http://tracker.ceph.com/issues/15902>`_, `pr#9267 <http://github.com/ceph/ceph/pull/9267>`_, Radoslaw Zarzynski)
-* rgw: data sync stops after getting error in all data log sync shards (`issue#16530 <http://tracker.ceph.com/issues/16530>`_, `pr#10073 <http://github.com/ceph/ceph/pull/10073>`_, Yehuda Sadeh)
-* rgw: default zone and zonegroup cannot be added to a realm (`issue#16839 <http://tracker.ceph.com/issues/16839>`_, `pr#10658 <http://github.com/ceph/ceph/pull/10658>`_, Casey Bodley)
-* rgw: document multi tenancy (`issue#16635 <http://tracker.ceph.com/issues/16635>`_, `pr#10217 <http://github.com/ceph/ceph/pull/10217>`_, Pete Zaitcev)
-* rgw: don't unregister request if request is not connected to manager (`issue#15911 <http://tracker.ceph.com/issues/15911>`_, `pr#9242 <http://github.com/ceph/ceph/pull/9242>`_, Yehuda Sadeh)
-* rgw: failed to create bucket after upgrade from hammer to jewel (`issue#16627 <http://tracker.ceph.com/issues/16627>`_, `pr#10524 <http://github.com/ceph/ceph/pull/10524>`_, Orit Wasserman)
-* rgw: fix ldap bindpw parsing (`issue#16286 <http://tracker.ceph.com/issues/16286>`_, `pr#10518 <http://github.com/ceph/ceph/pull/10518>`_, Matt Benjamin)
-* rgw: fix multi-delete query param parsing. (`issue#16618 <http://tracker.ceph.com/issues/16618>`_, `pr#10188 <http://github.com/ceph/ceph/pull/10188>`_, Robin H. Johnson)
-* rgw: improve support for Swift's object versioning. (`issue#15925 <http://tracker.ceph.com/issues/15925>`_, `pr#10710 <http://github.com/ceph/ceph/pull/10710>`_, Radoslaw Zarzynski)
-* rgw: initial slashes are not properly handled in Swift's BulkDelete (`issue#15948 <http://tracker.ceph.com/issues/15948>`_, `pr#9316 <http://github.com/ceph/ceph/pull/9316>`_, Radoslaw Zarzynski)
-* rgw: master: build failures with boost > 1.58 (`issue#16392 <http://tracker.ceph.com/issues/16392>`_, `issue#16391 <http://tracker.ceph.com/issues/16391>`_, `pr#10026 <http://github.com/ceph/ceph/pull/10026>`_, Abhishek Lekshmanan)
-* rgw: multisite segfault on ~RGWRealmWatcher if realm was deleted (`issue#16817 <http://tracker.ceph.com/issues/16817>`_, `pr#10660 <http://github.com/ceph/ceph/pull/10660>`_, Casey Bodley)
-* rgw: multisite sync races with deletes (`issue#16222 <http://tracker.ceph.com/issues/16222>`_, `issue#16464 <http://tracker.ceph.com/issues/16464>`_, `issue#16220 <http://tracker.ceph.com/issues/16220>`_, `issue#16143 <http://tracker.ceph.com/issues/16143>`_, `pr#10293 <http://github.com/ceph/ceph/pull/10293>`_, Yehuda Sadeh, Casey Bodley)
-* rgw: multisite: preserve zone's extra pool (`issue#16712 <http://tracker.ceph.com/issues/16712>`_, `pr#10537 <http://github.com/ceph/ceph/pull/10537>`_, Abhishek Lekshmanan)
-* rgw: object expirer's hints might be trimmed without processing in some circumstances (`issue#16705 <http://tracker.ceph.com/issues/16705>`_, `issue#16684 <http://tracker.ceph.com/issues/16684>`_, `pr#10763 <http://github.com/ceph/ceph/pull/10763>`_, Radoslaw Zarzynski)
-* rgw: radosgw-admin failure for user create after upgrade from hammer to jewel (`issue#15937 <http://tracker.ceph.com/issues/15937>`_, `pr#9294 <http://github.com/ceph/ceph/pull/9294>`_, Orit Wasserman, Abhishek Lekshmanan)
-* rgw: radosgw-admin: EEXIST messages for create operations (`issue#15720 <http://tracker.ceph.com/issues/15720>`_, `pr#9268 <http://github.com/ceph/ceph/pull/9268>`_, Abhishek Lekshmanan)
-* rgw: radosgw-admin: inconsistency in uid/email handling (`issue#13598 <http://tracker.ceph.com/issues/13598>`_, `pr#10520 <http://github.com/ceph/ceph/pull/10520>`_, Matt Benjamin)
-* rgw: realm pull fails when using apache frontend (`issue#15846 <http://tracker.ceph.com/issues/15846>`_, `pr#9266 <http://github.com/ceph/ceph/pull/9266>`_, Orit Wasserman)
-* rgw: retry on bucket sync errors (`issue#16108 <http://tracker.ceph.com/issues/16108>`_, `pr#9425 <http://github.com/ceph/ceph/pull/9425>`_, Yehuda Sadeh)
-* rgw: s3website: x-amz-website-redirect-location header returns malformed HTTP response (`issue#15531 <http://tracker.ceph.com/issues/15531>`_, `pr#9099 <http://github.com/ceph/ceph/pull/9099>`_, Robin H. Johnson)
-* rgw: segfault in RGWOp_MDLog_Notify (`issue#16666 <http://tracker.ceph.com/issues/16666>`_, `pr#10662 <http://github.com/ceph/ceph/pull/10662>`_, Casey Bodley)
-* rgw: segmentation fault on error_repo in data sync (`issue#16603 <http://tracker.ceph.com/issues/16603>`_, `pr#10523 <http://github.com/ceph/ceph/pull/10523>`_, Casey Bodley)
-* rgw: selinux denials in RGW (`issue#16126 <http://tracker.ceph.com/issues/16126>`_, `pr#10519 <http://github.com/ceph/ceph/pull/10519>`_, Boris Ranto)
-* rgw: support size suffixes for --max-size in radosgw-admin command (`issue#16004 <http://tracker.ceph.com/issues/16004>`_, `pr#9743 <http://github.com/ceph/ceph/pull/9743>`_, Vikhyat Umrao)
-* rgw: updating CORS/ACLs might not work in some circumstances (`issue#15976 <http://tracker.ceph.com/issues/15976>`_, `pr#9543 <http://github.com/ceph/ceph/pull/9543>`_, Radoslaw Zarzynski)
-* rgw: use zone endpoints instead of zonegroup endpoints (`issue#16834 <http://tracker.ceph.com/issues/16834>`_, `pr#10659 <http://github.com/ceph/ceph/pull/10659>`_, Casey Bodley)
-* tests: improve rbd-mirror test case coverage (`issue#16197 <http://tracker.ceph.com/issues/16197>`_, `pr#9631 <http://github.com/ceph/ceph/pull/9631>`_, Mykola Golub, Jason Dillaman)
-* tests: rados/test.sh workunit timesout on OpenStack (`issue#15403 <http://tracker.ceph.com/issues/15403>`_, `pr#8904 <http://github.com/ceph/ceph/pull/8904>`_, Loic Dachary)
-* tools: ceph-disk: Accept bcache devices as data disks (`issue#13278 <http://tracker.ceph.com/issues/13278>`_, `pr#8497 <http://github.com/ceph/ceph/pull/8497>`_, Peter Sabaini)
-* tools: rados: Add cleanup message with time to rados bench output (`issue#15704 <http://tracker.ceph.com/issues/15704>`_, `pr#9740 <http://github.com/ceph/ceph/pull/9740>`_, Vikhyat Umrao)
-* tools: src/script/subman fails with KeyError: 'nband' (`issue#16961 <http://tracker.ceph.com/issues/16961>`_, `pr#10625 <http://github.com/ceph/ceph/pull/10625>`_, Loic Dachary, Ali Maredia)
-
-
-v10.2.2 Jewel
-=============
-
-This point release fixes several important bugs in RBD mirroring, RGW multi-site, CephFS, and RADOS.
-
-We recommend that all v10.2.x users upgrade.
-
-For more detailed information, see :download:`the complete changelog <../changelog/v10.2.2.txt>`.
-
-Notable Changes
----------------
-
-* ceph: cli: exception when pool name has non-ascii characters (`issue#15913 <http://tracker.ceph.com/issues/15913>`_, `pr#9320 <http://github.com/ceph/ceph/pull/9320>`_, Ricardo Dias)
-* ceph-disk: workaround gperftool hang (`issue#13522 <http://tracker.ceph.com/issues/13522>`_, `issue#16103 <http://tracker.ceph.com/issues/16103>`_, `pr#9427 <http://github.com/ceph/ceph/pull/9427>`_, Loic Dachary)
-* cephfs: backports needed for Manila (`issue#15599 <http://tracker.ceph.com/issues/15599>`_, `issue#15417 <http://tracker.ceph.com/issues/15417>`_, `issue#15045 <http://tracker.ceph.com/issues/15045>`_, `pr#9430 <http://github.com/ceph/ceph/pull/9430>`_, John Spray, Ramana Raja, Xiaoxi Chen)
-* ceph.spec.in: drop support for RHEL<7 and SUSE<1210 in jewel and above (`issue#15725 <http://tracker.ceph.com/issues/15725>`_, `issue#15627 <http://tracker.ceph.com/issues/15627>`_, `issue#13445 <http://tracker.ceph.com/issues/13445>`_, `issue#15822 <http://tracker.ceph.com/issues/15822>`_, `issue#15472 <http://tracker.ceph.com/issues/15472>`_, `issue#15987 <http://tracker.ceph.com/issues/15987>`_, `issue#15516 <http://tracker.ceph.com/issues/15516>`_, `issue#15549 <http://tracker.ceph.com/issues/15549>`_, `pr#8938 <http://github.com/ceph/ceph/pull/8938>`_, Boris Ranto, Sage Weil, Nathan Cutler, Lars Marowsky-Bree)
-* ceph_test_librbd_fsx crashes during journal replay shut down (`issue#16123 <http://tracker.ceph.com/issues/16123>`_, `pr#9556 <http://github.com/ceph/ceph/pull/9556>`_, Jason Dillaman)
-* client: fix bugs accidentally disabling readahead (`issue#16024 <http://tracker.ceph.com/issues/16024>`_, `pr#9656 <http://github.com/ceph/ceph/pull/9656>`_, Patrick Donnelly, Greg Farnum)
-* cls_journal: initialize empty commit position upon client register (`issue#15757 <http://tracker.ceph.com/issues/15757>`_, `pr#9376 <http://github.com/ceph/ceph/pull/9376>`_, runsisi, Venky Shankar)
-* cls::rbd: mirror_image_status_list returned max 64 items (`pr#9069 <http://github.com/ceph/ceph/pull/9069>`_, Mykola Golub)
-* cls_rbd: mirror image status summary should read full directory (`issue#16178 <http://tracker.ceph.com/issues/16178>`_, `pr#9608 <http://github.com/ceph/ceph/pull/9608>`_, Jason Dillaman)
-* common: BackoffThrottle spins unnecessarily with very small backoff while the throttle is full (`issue#15953 <http://tracker.ceph.com/issues/15953>`_, `pr#9579 <http://github.com/ceph/ceph/pull/9579>`_, Samuel Just)
-* common: Do not link lttng into libglobal (`pr#9194 <http://github.com/ceph/ceph/pull/9194>`_, Karol Mroz)
-* debian: install systemd target files (`issue#15573 <http://tracker.ceph.com/issues/15573>`_, `pr#8815 <http://github.com/ceph/ceph/pull/8815>`_, Kefu Chai, Sage Weil)
-* doc: update mirroring guide to include pool/image status commands (`issue#15746 <http://tracker.ceph.com/issues/15746>`_, `pr#9180 <http://github.com/ceph/ceph/pull/9180>`_, Mykola Golub)
-* librbd: Disabling journaling feature results in "Transport endpoint is not connected" error (`issue#15863 <http://tracker.ceph.com/issues/15863>`_, `pr#9548 <http://github.com/ceph/ceph/pull/9548>`_, Yuan Zhou)
-* librbd: do not shut down exclusive lock while acquiring' (`issue#16291 <http://tracker.ceph.com/issues/16291>`_, `issue#16260 <http://tracker.ceph.com/issues/16260>`_, `pr#9691 <http://github.com/ceph/ceph/pull/9691>`_, Jason Dillaman)
-* librbd: Initial python APIs to support mirroring (`issue#15656 <http://tracker.ceph.com/issues/15656>`_, `pr#9550 <http://github.com/ceph/ceph/pull/9550>`_, Mykola Golub)
-* librbd: journal IO error results in failed assertion in AioCompletion (`issue#16077 <http://tracker.ceph.com/issues/16077>`_, `issue#15034 <http://tracker.ceph.com/issues/15034>`_, `issue#15791 <http://tracker.ceph.com/issues/15791>`_, `pr#9611 <http://github.com/ceph/ceph/pull/9611>`_, Hector Martin, Jason Dillaman)
-* librbd: journal: live replay might skip entries from previous object set (`issue#15864 <http://tracker.ceph.com/issues/15864>`_, `issue#15665 <http://tracker.ceph.com/issues/15665>`_, `pr#9217 <http://github.com/ceph/ceph/pull/9217>`_, Jason Dillaman)
-* librbd: journal: support asynchronous shutdown (`issue#15949 <http://tracker.ceph.com/issues/15949>`_, `issue#14530 <http://tracker.ceph.com/issues/14530>`_, `issue#15993 <http://tracker.ceph.com/issues/15993>`_, `pr#9373 <http://github.com/ceph/ceph/pull/9373>`_, Jason Dillaman)
-* librbd: Metadata config overrides are applied synchronously (`issue#15928 <http://tracker.ceph.com/issues/15928>`_, `pr#9318 <http://github.com/ceph/ceph/pull/9318>`_, Jason Dillaman)
-* librbd: Object Map is showing as invalid, even when Object Map is disabled for that Image. (`issue#16076 <http://tracker.ceph.com/issues/16076>`_, `pr#9555 <http://github.com/ceph/ceph/pull/9555>`_, xinxin shu)
-* librbd: prevent error messages when journal externally disabled (`issue#16114 <http://tracker.ceph.com/issues/16114>`_, `pr#9610 <http://github.com/ceph/ceph/pull/9610>`_, Zhiqiang Wang, Jason Dillaman)
-* librbd: recursive lock possible when disabling journaling (`issue#16235 <http://tracker.ceph.com/issues/16235>`_, `pr#9654 <http://github.com/ceph/ceph/pull/9654>`_, Jason Dillaman)
-* librbd: refresh image if needed in mirror functions (`issue#16096 <http://tracker.ceph.com/issues/16096>`_, `pr#9609 <http://github.com/ceph/ceph/pull/9609>`_, Jon Bernard)
-* librbd: remove should ignore mirror errors from older OSDs (`issue#16268 <http://tracker.ceph.com/issues/16268>`_, `pr#9692 <http://github.com/ceph/ceph/pull/9692>`_, Jason Dillaman)
-* librbd: reuse ImageCtx::finisher and SafeTimer for lots of images case (`issue#13938 <http://tracker.ceph.com/issues/13938>`_, `pr#9580 <http://github.com/ceph/ceph/pull/9580>`_, Haomai Wang)
-* librbd: validate image metadata configuration overrides (`issue#15522 <http://tracker.ceph.com/issues/15522>`_, `pr#9554 <http://github.com/ceph/ceph/pull/9554>`_, zhuangzeqiang)
-* mds: order directories by hash and fix simultaneous readdir races (`issue#15508 <http://tracker.ceph.com/issues/15508>`_, `pr#9655 <http://github.com/ceph/ceph/pull/9655>`_, Yan, Zheng, Greg Farnum)
-* mon: Hammer (0.94.3) OSD does not delete old OSD Maps in a timely fashion (maybe at all?) (`issue#13990 <http://tracker.ceph.com/issues/13990>`_, `pr#9100 <http://github.com/ceph/ceph/pull/9100>`_, Kefu Chai)
-* mon/Monitor: memory leak on Monitor::handle_ping() (`issue#15793 <http://tracker.ceph.com/issues/15793>`_, `pr#9270 <http://github.com/ceph/ceph/pull/9270>`_, xie xingguo)
-* osd: acting_primary not updated on split (`issue#15523 <http://tracker.ceph.com/issues/15523>`_, `pr#8968 <http://github.com/ceph/ceph/pull/8968>`_, Sage Weil)
-* osd: boot race with noup being set (`issue#15678 <http://tracker.ceph.com/issues/15678>`_, `pr#9101 <http://github.com/ceph/ceph/pull/9101>`_, Sage Weil)
-* osd: deadlock in OSD::_committed_osd_maps (`issue#15701 <http://tracker.ceph.com/issues/15701>`_, `pr#9103 <http://github.com/ceph/ceph/pull/9103>`_, Xinze Chi)
-* osd: hobject_t::get_max() vs is_max() discrepancy (`issue#16113 <http://tracker.ceph.com/issues/16113>`_, `pr#9614 <http://github.com/ceph/ceph/pull/9614>`_, Samuel Just)
-* osd: LibRadosWatchNotifyPPTests/LibRadosWatchNotifyPP.WatchNotify2Timeout/1 segv (`issue#15760 <http://tracker.ceph.com/issues/15760>`_, `pr#9104 <http://github.com/ceph/ceph/pull/9104>`_, Sage Weil)
-* osd: remove reliance on FLAG_OMAP for reads (`pr#9638 <http://github.com/ceph/ceph/pull/9638>`_, Samuel Just)
-* osd valgrind invalid reads/writes (`issue#15870 <http://tracker.ceph.com/issues/15870>`_, `pr#9237 <http://github.com/ceph/ceph/pull/9237>`_, Samuel Just)
-* pybind: rbd API should default features parameter to None (`issue#15982 <http://tracker.ceph.com/issues/15982>`_, `pr#9553 <http://github.com/ceph/ceph/pull/9553>`_, Mykola Golub)
-* qa: dynamic_features.sh races with image deletion (`issue#15500 <http://tracker.ceph.com/issues/15500>`_, `pr#9552 <http://github.com/ceph/ceph/pull/9552>`_, Mykola Golub)
-* qa/workunits: ensure replay has started before checking position (`issue#16248 <http://tracker.ceph.com/issues/16248>`_, `pr#9674 <http://github.com/ceph/ceph/pull/9674>`_, Jason Dillaman)
-* qa/workunits/rbd: fixed rbd_mirror teuthology runtime errors (`pr#9232 <http://github.com/ceph/ceph/pull/9232>`_, Jason Dillaman)
-* radosgw-admin: fix 'period push' handling of --url (`issue#15926 <http://tracker.ceph.com/issues/15926>`_, `pr#9210 <http://github.com/ceph/ceph/pull/9210>`_, Casey Bodley)
-* rbd-mirror: Delete local image mirror when remote image mirroring is disabled (`issue#15916 <http://tracker.ceph.com/issues/15916>`_, `issue#14421 <http://tracker.ceph.com/issues/14421>`_, `pr#9372 <http://github.com/ceph/ceph/pull/9372>`_, runsisi, Mykola Golub, Ricardo Dias)
-* rbd-mirror: do not propagate deletions when pool unavailable (`issue#16229 <http://tracker.ceph.com/issues/16229>`_, `pr#9630 <http://github.com/ceph/ceph/pull/9630>`_, Jason Dillaman)
-* rbd-mirror: do not re-use image id from mirror directory if creating image (`issue#16253 <http://tracker.ceph.com/issues/16253>`_, `pr#9673 <http://github.com/ceph/ceph/pull/9673>`_, Jason Dillaman)
-* rbd-mirror: FAILED assert(!m_status_watcher) (`issue#16245 <http://tracker.ceph.com/issues/16245>`_, `issue#16290 <http://tracker.ceph.com/issues/16290>`_, `pr#9690 <http://github.com/ceph/ceph/pull/9690>`_, Mykola Golub)
-* rbd-mirror: fix deletion propagation edge cases (`issue#16226 <http://tracker.ceph.com/issues/16226>`_, `pr#9629 <http://github.com/ceph/ceph/pull/9629>`_, Jason Dillaman)
-* rbd-mirror: fix journal shut down ordering (`issue#16165 <http://tracker.ceph.com/issues/16165>`_, `pr#9628 <http://github.com/ceph/ceph/pull/9628>`_, Jason Dillaman)
-* rbd-mirror: potential crash during image status update (`issue#15909 <http://tracker.ceph.com/issues/15909>`_, `pr#9226 <http://github.com/ceph/ceph/pull/9226>`_, Mykola Golub, Jason Dillaman)
-* rbd-mirror: refresh image after creating sync point (`issue#16196 <http://tracker.ceph.com/issues/16196>`_, `pr#9627 <http://github.com/ceph/ceph/pull/9627>`_, Jason Dillaman)
-* rbd-mirror: replicate cloned images (`issue#14937 <http://tracker.ceph.com/issues/14937>`_, `pr#9423 <http://github.com/ceph/ceph/pull/9423>`_, Jason Dillaman)
-* rbd-mirror should disable the rbd cache for local images (`issue#15930 <http://tracker.ceph.com/issues/15930>`_, `pr#9317 <http://github.com/ceph/ceph/pull/9317>`_, Jason Dillaman)
-* rbd-mirror: support bootstrap canceling (`issue#16201 <http://tracker.ceph.com/issues/16201>`_, `pr#9612 <http://github.com/ceph/ceph/pull/9612>`_, Mykola Golub)
-* rbd-mirror: support multiple replicated pools (`issue#16045 <http://tracker.ceph.com/issues/16045>`_, `pr#9409 <http://github.com/ceph/ceph/pull/9409>`_, Jason Dillaman)
-* rgw: fix manager selection when APIs customized (`issue#15974 <http://tracker.ceph.com/issues/15974>`_, `issue#15973 <http://tracker.ceph.com/issues/15973>`_, `pr#9245 <http://github.com/ceph/ceph/pull/9245>`_, Robin H. Johnson)
-* rgw: keep track of written_objs correctly (`issue#15886 <http://tracker.ceph.com/issues/15886>`_, `pr#9239 <http://github.com/ceph/ceph/pull/9239>`_, Yehuda Sadeh)
-* rpm: ceph gid mismatch on upgrade from hammer with pre-existing ceph user (SUSE) (`issue#15869 <http://tracker.ceph.com/issues/15869>`_, `pr#9424 <http://github.com/ceph/ceph/pull/9424>`_, Nathan Cutler)
-* systemd: ceph-{mds,mon,osd,radosgw} systemd unit files need wants=time-sync.target (`issue#15419 <http://tracker.ceph.com/issues/15419>`_, `pr#8802 <http://github.com/ceph/ceph/pull/8802>`_, Nathan Cutler)
-* test: failure in journal.sh workunit test (`issue#16011 <http://tracker.ceph.com/issues/16011>`_, `pr#9377 <http://github.com/ceph/ceph/pull/9377>`_, Mykola Golub)
-* tests: rm -fr /tmp/*virtualenv* (`issue#16087 <http://tracker.ceph.com/issues/16087>`_, `pr#9403 <http://github.com/ceph/ceph/pull/9403>`_, Loic Dachary)
-
-v10.2.1 Jewel
-=============
-
-This is the first bugfix release for Jewel.  It contains several annoying
-packaging and init system fixes and a range of important bugfixes across
-RBD, RGW, and CephFS.
-
-We recommend that all v10.2.x users upgrade.
-
-For more detailed information, see :download:`the complete changelog <../changelog/v10.2.1.txt>`.
-
-Notable Changes
----------------
-
-* cephfs: CephFSVolumeClient should isolate volumes by RADOS namespace (`issue#15400 <http://tracker.ceph.com/issues/15400>`_, `pr#8787 <http://github.com/ceph/ceph/pull/8787>`_, Xiaoxi Chen)
-* cephfs: handle standby-replay nodes properly in upgrades (`issue#15591 <http://tracker.ceph.com/issues/15591>`_, `pr#8971 <http://github.com/ceph/ceph/pull/8971>`_, John Spray)
-* ceph-{mds,mon,osd} packages need scriptlets with systemd code (`issue#14941 <http://tracker.ceph.com/issues/14941>`_, `pr#8801 <http://github.com/ceph/ceph/pull/8801>`_, Boris Ranto, Nathan Cutler)
-* ceph_test_keyvaluedb: fix (`issue#15435 <http://tracker.ceph.com/issues/15435>`_, `pr#9051 <http://github.com/ceph/ceph/pull/9051>`_, Allen Samuels, Sage Weil)
-* cmake: add missing source file to rbd_mirror/image_replayer (`pr#9052 <http://github.com/ceph/ceph/pull/9052>`_, Casey Bodley)
-* cmake: fix rbd compile errors (`pr#9076 <http://github.com/ceph/ceph/pull/9076>`_, runsisi, Jason Dillaman)
-* journal: incorrectly computed object offset within set (`issue#15765 <http://tracker.ceph.com/issues/15765>`_, `pr#9038 <http://github.com/ceph/ceph/pull/9038>`_, Jason Dillaman)
-* librbd: client-side handling for incompatible object map sizes (`issue#15642 <http://tracker.ceph.com/issues/15642>`_, `pr#9039 <http://github.com/ceph/ceph/pull/9039>`_, Jason Dillaman)
-* librbd: constrain size of AioWriteEvent journal entries (`issue#15750 <http://tracker.ceph.com/issues/15750>`_, `pr#9048 <http://github.com/ceph/ceph/pull/9048>`_, Jason Dillaman)
-* librbd: does not crash if image header is too short (`pr#9044 <http://github.com/ceph/ceph/pull/9044>`_, Kefu Chai)
-* librbd: Errors encountered disabling object-map while flatten is in-progress (`issue#15572 <http://tracker.ceph.com/issues/15572>`_, `pr#8869 <http://github.com/ceph/ceph/pull/8869>`_, Jason Dillaman)
-* librbd: fix get/list mirror image status API (`issue#15771 <http://tracker.ceph.com/issues/15771>`_, `pr#9036 <http://github.com/ceph/ceph/pull/9036>`_, Mykola Golub)
-* librbd: Parent image is closed twice if error encountered while opening (`issue#15574 <http://tracker.ceph.com/issues/15574>`_, `pr#8867 <http://github.com/ceph/ceph/pull/8867>`_, Jason Dillaman)
-* librbd: possible double-free of object map invalidation request upon error (`issue#15643 <http://tracker.ceph.com/issues/15643>`_, `pr#8865 <http://github.com/ceph/ceph/pull/8865>`_, runsisi)
-* librbd: possible race condition leads to use-after-free (`issue#15690 <http://tracker.ceph.com/issues/15690>`_, `pr#9009 <http://github.com/ceph/ceph/pull/9009>`_, Jason Dillaman)
-* librbd: potential concurrent event processing during journal replay (`issue#15755 <http://tracker.ceph.com/issues/15755>`_, `pr#9040 <http://github.com/ceph/ceph/pull/9040>`_, Jason Dillaman)
-* librbd: Potential double free of SetSnapRequest instance (`issue#15571 <http://tracker.ceph.com/issues/15571>`_, `pr#8803 <http://github.com/ceph/ceph/pull/8803>`_, runsisi)
-* librbd: put the validation of image snap context earlier (`pr#9046 <http://github.com/ceph/ceph/pull/9046>`_, runsisi)
-* librbd: reduce log level for image format 1 warning (`issue#15577 <http://tracker.ceph.com/issues/15577>`_, `pr#9003 <http://github.com/ceph/ceph/pull/9003>`_, Jason Dillaman)
-* mds/MDSAuthCap parse no longer fails on paths with hyphens (`issue#15465 <http://tracker.ceph.com/issues/15465>`_, `pr#8969 <http://github.com/ceph/ceph/pull/8969>`_, John Spray)
-* mds: MDS incarnation no longer gets lost after remove filesystem (`issue#15399 <http://tracker.ceph.com/issues/15399>`_, `pr#8970 <http://github.com/ceph/ceph/pull/8970>`_, John Spray)
-* mon/OSDMonitor: avoid underflow in reweight-by-utilization if max_change=1 (`issue#15655 <http://tracker.ceph.com/issues/15655>`_, `pr#9006 <http://github.com/ceph/ceph/pull/9006>`_, Samuel Just)
-* python: clone operation will fail if config overridden with "rbd default format = 1" (`issue#15685 <http://tracker.ceph.com/issues/15685>`_, `pr#8972 <http://github.com/ceph/ceph/pull/8972>`_, Jason Dillaman)
-* radosgw-admin: add missing --zonegroup-id to usage (`issue#15650 <http://tracker.ceph.com/issues/15650>`_, `pr#9019 <http://github.com/ceph/ceph/pull/9019>`_, Casey Bodley)
-* radosgw-admin: update usage for zone[group] modify (`issue#15651 <http://tracker.ceph.com/issues/15651>`_, `pr#9016 <http://github.com/ceph/ceph/pull/9016>`_, Casey Bodley)
-* radosgw-admin: zonegroup remove command (`issue#15684 <http://tracker.ceph.com/issues/15684>`_, `pr#9015 <http://github.com/ceph/ceph/pull/9015>`_, Casey Bodley)
-* rbd CLI to retrieve rbd mirror state for a pool / specific image (`issue#15144 <http://tracker.ceph.com/issues/15144>`_, `issue#14420 <http://tracker.ceph.com/issues/14420>`_, `pr#8868 <http://github.com/ceph/ceph/pull/8868>`_, Mykola Golub)
-* rbd disk-usage CLI command should support calculating full image usage (`issue#14540 <http://tracker.ceph.com/issues/14540>`_, `pr#8870 <http://github.com/ceph/ceph/pull/8870>`_, Jason Dillaman)
-* rbd: helpful error message on map failure (`issue#15721 <http://tracker.ceph.com/issues/15721>`_, `pr#9041 <http://github.com/ceph/ceph/pull/9041>`_, Venky Shankar)
-* rbd: help message distinction between commands and aliases (`issue#15521 <http://tracker.ceph.com/issues/15521>`_, `pr#9004 <http://github.com/ceph/ceph/pull/9004>`_, Yongqiang He)
-* rbd-mirror: admin socket commands to start/stop/restart mirroring (`issue#15718 <http://tracker.ceph.com/issues/15718>`_, `pr#9010 <http://github.com/ceph/ceph/pull/9010>`_, Mykola Golub, Josh Durgin)
-* rbd-mirror can crash if start up is interrupted (`issue#15630 <http://tracker.ceph.com/issues/15630>`_, `pr#8866 <http://github.com/ceph/ceph/pull/8866>`_, Jason Dillaman)
-* rbd-mirror: image sync needs to handle snapshot size and protection status (`issue#15110 <http://tracker.ceph.com/issues/15110>`_, `pr#9050 <http://github.com/ceph/ceph/pull/9050>`_, Jason Dillaman)
-* rbd-mirror: lockdep error during bootstrap (`issue#15664 <http://tracker.ceph.com/issues/15664>`_, `pr#9008 <http://github.com/ceph/ceph/pull/9008>`_, Jason Dillaman)
-* rbd-nbd: fix rbd-nbd aio callback error handling (`issue#15604 <http://tracker.ceph.com/issues/15604>`_, `pr#9005 <http://github.com/ceph/ceph/pull/9005>`_, Chang-Yi Lee)
-* rgw: add AWS4 completion support for RGW_OP_SET_BUCKET_WEBSITE (`issue#15626 <http://tracker.ceph.com/issues/15626>`_, `pr#9018 <http://github.com/ceph/ceph/pull/9018>`_, Javier M. Mellid)
-* rgw admin output (`issue#15747 <http://tracker.ceph.com/issues/15747>`_, `pr#9054 <http://github.com/ceph/ceph/pull/9054>`_, Casey Bodley)
-* rgw: fix issue #15597 (`issue#15597 <http://tracker.ceph.com/issues/15597>`_, `pr#9020 <http://github.com/ceph/ceph/pull/9020>`_, Yehuda Sadeh)
-* rgw: fix printing wrong X-Storage-Url in Swift's TempAuth. (`issue#15667 <http://tracker.ceph.com/issues/15667>`_, `pr#9021 <http://github.com/ceph/ceph/pull/9021>`_, Radoslaw Zarzynski)
-* rgw: handle stripe transition when flushing final pending_data_bl (`issue#15745 <http://tracker.ceph.com/issues/15745>`_, `pr#9053 <http://github.com/ceph/ceph/pull/9053>`_, Yehuda Sadeh)
-* rgw: leak fixes (`issue#15792 <http://tracker.ceph.com/issues/15792>`_, `pr#9022 <http://github.com/ceph/ceph/pull/9022>`_, Yehuda Sadeh)
-* rgw: multisite: Issues with Deleting Buckets (`issue#15540 <http://tracker.ceph.com/issues/15540>`_, `pr#8930 <http://github.com/ceph/ceph/pull/8930>`_, Abhishek Lekshmanan)
-* rgw: period commit fix (`issue#15828 <http://tracker.ceph.com/issues/15828>`_, `pr#9081 <http://github.com/ceph/ceph/pull/9081>`_, Casey Bodley)
-* rgw: period delete fixes (`issue#15469 <http://tracker.ceph.com/issues/15469>`_, `pr#9047 <http://github.com/ceph/ceph/pull/9047>`_, Casey Bodley)
-* rgw: radosgw-admin zone set cuts pool names short if name starts with a period (`issue#15598 <http://tracker.ceph.com/issues/15598>`_, `pr#9029 <http://github.com/ceph/ceph/pull/9029>`_, Yehuda Sadeh)
-* rgw: segfault at RGWAsyncGetSystemObj (`issue#15565 <http://tracker.ceph.com/issues/15565>`_, `issue#15625 <http://tracker.ceph.com/issues/15625>`_, `pr#9017 <http://github.com/ceph/ceph/pull/9017>`_, Yehuda Sadeh)
-* several backports (`issue#15588 <http://tracker.ceph.com/issues/15588>`_, `issue#15655 <http://tracker.ceph.com/issues/15655>`_, `pr#8853 <http://github.com/ceph/ceph/pull/8853>`_, Alexandre Derumier, xie xingguo, Alfredo Deza)
-* systemd: fix typo in preset file (`pr#8843 <http://github.com/ceph/ceph/pull/8843>`_, Nathan Cutler)
-* tests: make check fails on ext4 (`issue#15837 <http://tracker.ceph.com/issues/15837>`_, `pr#9063 <http://github.com/ceph/ceph/pull/9063>`_, Loic Dachary, Sage Weil)
-
-
-v10.2.0 Jewel
-=============
-
-This major release of Ceph is the foundation for the next
-long-term stable release series.  There have been many major changes since
-the Infernalis (9.2.x) and Hammer (0.94.x) releases, and the upgrade
-process is non-trivial. Please read these release notes carefully.
-
-Major Changes from Infernalis
------------------------------
-
-- *CephFS*:
-
-  * This is the first release in which CephFS is declared stable!
-    Several features are disabled by default, including snapshots and
-    multiple active MDS servers.
-  * The repair and disaster recovery tools are now feature-complete.
-  * A new cephfs-volume-manager module is included that provides a
-    high-level interface for creating "shares" for OpenStack Manila
-    and similar projects.
-  * There is now experimental support for multiple CephFS file systems
-    within a single cluster.
-
-- *RGW*:
-
-  * The multisite feature has been almost completely rearchitected and
-    rewritten to support any number of clusters/sites, bidirectional
-    fail-over, and active/active configurations.
-  * You can now access radosgw buckets via NFS (experimental).
-  * The AWS4 authentication protocol is now supported.
-  * There is now support for S3 request payer buckets.
-  * The new multitenancy infrastructure improves compatibility with
-    Swift, which provides a separate container namespace for each
-    user/tenant.
-  * The OpenStack Keystone v3 API is now supported.  There are a range
-    of other small Swift API features and compatibility improvements
-    as well, including bulk delete and SLO (static large objects).
-
-- *RBD*:
-
-  * There is new support for mirroring (asynchronous replication) of
-    RBD images across clusters.  This is implemented as a per-RBD
-    image journal that can be streamed across a WAN to another site,
-    and a new rbd-mirror daemon that performs the cross-cluster
-    replication.
-  * The exclusive-lock, object-map, fast-diff, and journaling features
-    can be enabled or disabled dynamically. The deep-flatten features
-    can be disabled dynamically but not re-enabled.
-  * The RBD CLI has been rewritten to provide command-specific help
-    and full bash completion support.
-  * RBD snapshots can now be renamed.
-
-- *RADOS*:
-
-  * BlueStore, a new OSD backend, is included as an experimental
-    feature.  The plan is for it to become the default backend in the
-    K or L release.
-  * The OSD now persists scrub results and provides a librados API to
-    query results in detail.
-  * We have revised our documentation to recommend *against* using
-    ext4 as the underlying filesystem for Ceph OSD daemons due to
-    problems supporting our long object name handling.
-
-Major Changes from Hammer
--------------------------
-
-- *General*:
-
-  * Ceph daemons are now managed via systemd (with the exception of
-    Ubuntu Trusty, which still uses upstart).
-  * Ceph daemons run as 'ceph' user instead of 'root'.
-  * On Red Hat distros, there is also an SELinux policy.
-
-- *RADOS*:
-
-  * The RADOS cache tier can now proxy write operations to the base
-    tier, allowing writes to be handled without forcing migration of
-    an object into the cache.
-  * The SHEC erasure coding support is no longer flagged as
-    experimental. SHEC trades some additional storage space for faster
-    repair.
-  * There is now a unified queue (and thus prioritization) of client
-    IO, recovery, scrubbing, and snapshot trimming.
-  * There have been many improvements to low-level repair tooling
-    (ceph-objectstore-tool).
-  * The internal ObjectStore API has been significantly cleaned up in order
-    to facilitate new storage backends like BlueStore.
-
-- *RGW*:
-
-  * The Swift API now supports object expiration.
-  * There are many Swift API compatibility improvements.
-
-- *RBD*:
-
-  * The ``rbd du`` command shows actual usage (quickly, when
-    object-map is enabled).
-  * The object-map feature has seen many stability improvements.
-  * The object-map and exclusive-lock features can be enabled or disabled
-    dynamically.
-  * You can now store user metadata and set persistent librbd options
-    associated with individual images.
-  * The new deep-flatten features allow flattening of a clone and all
-    of its snapshots.  (Previously snapshots could not be flattened.)
-  * The export-diff command is now faster (it uses aio).  There is also
-    a new fast-diff feature.
-  * The --size argument can be specified with a suffix for units
-    (e.g., ``--size 64G``).
-  * There is a new ``rbd status`` command that, for now, shows who has
-    the image open/mapped.
-
-- *CephFS*:
-
-  * You can now rename snapshots.
-  * There have been ongoing improvements around administration, diagnostics,
-    and the check and repair tools.
-  * The caching and revocation of client cache state due to unused
-    inodes has been dramatically improved.
-  * The ceph-fuse client behaves better on 32-bit hosts.
-
-Distro compatibility
---------------------
-
-Starting with Infernalis, we have dropped support for many older
-distributions so that we can move to a newer compiler toolchain (e.g.,
-C++11).  Although it is still possible to build Ceph on older
-distributions by installing backported development tools, we are not
-building and publishing release packages for ceph.com.
-
-We now build packages for the following distributions and architectures:
-
-- x86_64:
-
-  * CentOS 7.x.  We have dropped support for CentOS 6 (and other RHEL 6
-    derivatives, like Scientific Linux 6).
-  * Debian Jessie 8.x.  Debian Wheezy 7.x's g++ has incomplete support
-    for C++11 (and no systemd).
-  * Ubuntu Xenial 16.04 and Trusty 14.04.  Ubuntu Precise 12.04 is no
-    longer supported.
-  * Fedora 22 or later.
-
-- aarch64 / arm64:
-
-  * Ubuntu Xenial 16.04.
-
-Upgrading from Infernalis or Hammer
------------------------------------
-
-* We now recommend against using ``ext4`` as the underlying file
-  system for Ceph OSDs, especially when RGW or other users of long
-  RADOS object names are used.  For more information about why, please
-  see `Filesystem Recommendations`_.
-
-  If you have an existing cluster that uses ext4 for the OSDs but uses only
-  RBD and/or CephFS, then the ext4 limitations will not affect you.  Before
-  upgrading, be sure add the following to ``ceph.conf`` to allow the OSDs to
-  start::
-
-    osd max object name len = 256
-    osd max object namespace len = 64
-
-  Keep in mind that if you set these lower object name limits and
-  later decide to use RGW on this cluster, it will have problems
-  storing S3/Swift objects with long names.  This startup check can also be
-  disabled via the below option, although this is not recommended::
-
-    osd check max object name len on startup = false
-
-.. _Filesystem Recommendations: ../configuration/filesystem-recommendations
-
-* There are no major compatibility changes since Infernalis.  Simply
-  upgrading the daemons on each host and restarting all daemons is
-  sufficient.
-
-* The rbd CLI no longer accepts the deprecated '--image-features' option
-  during create, import, and clone operations.  The '--image-feature'
-  option should be used instead.
-
-* The rbd legacy image format (version 1) is deprecated with the Jewel release.
-  Attempting to create a new version 1 RBD image will result in a warning.
-  Future releases of Ceph will remove support for version 1 RBD images.
-
-* The 'send_pg_creates' and 'map_pg_creates' mon CLI commands are
-  obsolete and no longer supported.
-
-* A new configure option 'mon_election_timeout' is added to specifically
-  limit max waiting time of monitor election process, which was previously
-  restricted by 'mon_lease'.
-
-* CephFS filesystems created using versions older than Firefly (0.80) must
-  use the new 'cephfs-data-scan tmap_upgrade' command after upgrading to
-  Jewel.  See 'Upgrading' in the CephFS documentation for more information.
-
-* The 'ceph mds setmap' command has been removed.
-
-* The default RBD image features for new images have been updated to
-  enable the following: exclusive lock, object map, fast-diff, and
-  deep-flatten. These features are not currently supported by the RBD
-  kernel driver nor older RBD clients. They can be disabled on a per-image
-  basis via the RBD CLI, or the default features can be updated to the
-  pre-Jewel setting by adding the following to the client section of the Ceph
-  configuration file::
-
-    rbd default features = 1
-
-* The rbd legacy image format (version 1) is deprecated with the Jewel
-  release.
-
-* After upgrading, users should set the 'sortbitwise' flag to enable the new
-  internal object sort order::
-
-    ceph osd set sortbitwise
-
-  This flag is important for the new object enumeration API and for
-  new backends like BlueStore.
-
-* The rbd CLI no longer permits creating images and snapshots with potentially
-  ambiguous names (e.g. the '/' and '@' characters are disallowed). The
-  validation can be temporarily disabled by adding "--rbd-validate-names=false"
-  to the rbd CLI when creating an image or snapshot. It can also be disabled
-  by adding the following to the client section of the Ceph configuration file::
-
-    rbd validate names = false
-
-Upgrading from Hammer
----------------------
-
-* All cluster nodes must first upgrade to Hammer v0.94.4 or a later
-  v0.94.z release; only then is it possible to upgrade to Jewel
-  10.2.z.
-
-* For all distributions that support systemd (CentOS 7, Fedora, Debian
-  Jessie 8.x, OpenSUSE), ceph daemons are now managed using native systemd
-  files instead of the legacy sysvinit scripts.  For example::
-
-    systemctl start ceph.target       # start all daemons
-    systemctl status ceph-osd@12      # check status of osd.12
-
-  The main notable distro that is *not* yet using systemd is Ubuntu trusty
-  14.04.  (The next Ubuntu LTS, 16.04, will use systemd instead of upstart.)
-
-* Ceph daemons now run as user and group ``ceph`` by default.  The
-  ceph user has a static UID assigned by Fedora and Debian (also used by
-  derivative distributions like RHEL/CentOS and Ubuntu).  On SUSE the same
-  UID/GID as in Fedora and Debian will be used, *provided it is not already
-  assigned*. In the unlikely event the preferred UID or GID is assigned to a
-  different user/group, ceph will get a dynamically assigned UID/GID.
-
-  If your systems already have a ceph user, upgrading the package will cause
-  problems.  We suggest you first remove or rename the existing 'ceph' user
-  and 'ceph' group before upgrading.
-
-  When upgrading, administrators have two options:
-
-   #. Add the following line to ``ceph.conf`` on all hosts::
-
-        setuser match path = /var/lib/ceph/$type/$cluster-$id
-
-      This will make the Ceph daemons run as root (i.e., not drop
-      privileges and switch to user ceph) if the daemon's data
-      directory is still owned by root.  Newly deployed daemons will
-      be created with data owned by user ceph and will run with
-      reduced privileges, but upgraded daemons will continue to run as
-      root.
-
-   #. Fix the data ownership during the upgrade.  This is the
-      preferred option, but it is more work and can be very time
-      consuming.  The process for each host is to:
-
-      #. Upgrade the ceph package.  This creates the ceph user and group.  For
-         example::
-
-           ceph-deploy install --stable jewel HOST
-
-      #. Stop the daemon(s)::
-
-           service ceph stop           # fedora, centos, rhel, debian
-           stop ceph-all               # ubuntu
-
-      #. Fix the ownership::
-
-           chown -R ceph:ceph /var/lib/ceph
-           chown -R ceph:ceph /var/log/ceph
-
-      #. Restart the daemon(s)::
-
-           start ceph-all                # ubuntu
-           systemctl start ceph.target   # debian, centos, fedora, rhel
-
-      Alternatively, the same process can be done with a single daemon
-      type, for example by stopping only monitors and chowning only
-      ``/var/lib/ceph/mon``.
-
-* The on-disk format for the experimental KeyValueStore OSD backend has
-  changed.  You will need to remove any OSDs using that backend before you
-  upgrade any test clusters that use it.
-
-* When a pool quota is reached, librados operations now block indefinitely,
-  the same way they do when the cluster fills up.  (Previously they would return
-  -ENOSPC.)  By default, a full cluster or pool will now block.  If your
-  librados application can handle ENOSPC or EDQUOT errors gracefully, you can
-  get error returns instead by using the new librados OPERATION_FULL_TRY flag.
-
-* The return code for librbd's rbd_aio_read and Image::aio_read API methods no
-  longer returns the number of bytes read upon success.  Instead, it returns 0
-  upon success and a negative value upon failure.
-
-* 'ceph scrub', 'ceph compact' and 'ceph sync force' are now DEPRECATED.  Users
-  should instead use 'ceph mon scrub', 'ceph mon compact' and
-  'ceph mon sync force'.
-
-* 'ceph mon_metadata' should now be used as 'ceph mon metadata'. There is no
-  need to deprecate this command (same major release since it was first
-  introduced).
-
-* The `--dump-json` option of "osdmaptool" is replaced by `--dump json`.
-
-* The commands of "pg ls-by-{pool,primary,osd}" and "pg ls" now take "recovering"
-  instead of "recovery", to include the recovering pgs in the listed pgs.
-
-Upgrading from Firefly
-----------------------
-
-Upgrading directly from Firefly v0.80.z is not recommended.  It is
-possible to do a direct upgrade, but not without downtime, as all OSDs
-must be stopped, upgraded, and then restarted.  We recommend that
-clusters be first upgraded to Hammer v0.94.6 or a later v0.94.z
-release; only then is it possible to upgrade to Jewel 10.2.z for an
-online upgrade (see below).
-
-To do an offline upgrade directly from Firefly, all Firefly OSDs must
-be stopped and marked down before any Jewel OSDs will be allowed
-to start up.  This fencing is enforced by the Jewel monitor, so
-you should use an upgrade procedure like:
-
-  #. Upgrade Ceph on monitor hosts
-  #. Restart all ceph-mon daemons
-  #. Set noout::
-       ceph osd set noout
-  #. Upgrade Ceph on all OSD hosts
-  #. Stop all ceph-osd daemons
-  #. Mark all OSDs down with something like::
-       ceph osd down `seq 0 1000`
-  #. Start all ceph-osd daemons
-  #. Let the cluster settle and then unset noout::
-       ceph osd unset noout
-  #. Upgrade and restart any remaining daemons (ceph-mds, radosgw)
-
-Notable Changes since Infernalis
---------------------------------
-
-* aarch64: add optimized version of crc32c (Yazen Ghannam, Steve Capper)
-* Adding documentation on how to use new dynamic throttle scheme (`pr#8069 <http://github.com/ceph/ceph/pull/8069>`_, Somnath Roy)
-* admin/build-doc: depend on zlib1g-dev and graphviz (`pr#7522 <http://github.com/ceph/ceph/pull/7522>`_, Ken Dreyer)
-* auth: cache/reuse crypto lib key objects, optimize msg signature check (Sage Weil)
-* auth: fail if rotating key is missing (do not spam log) (`pr#6473 <http://github.com/ceph/ceph/pull/6473>`_, Qiankun Zheng)
-* auth: fix crash when bad keyring is passed (`pr#6698 <http://github.com/ceph/ceph/pull/6698>`_, Dunrong Huang)
-* auth: make keyring without mon entity type return -EACCES (`pr#5734 <http://github.com/ceph/ceph/pull/5734>`_, Xiaowei Chen)
-* AUTHORS: update email (`pr#7854 <http://github.com/ceph/ceph/pull/7854>`_, Yehuda Sadeh)
-* auth: reinit NSS after fork() (#11128 Yan, Zheng)
-* authtool: update --help and manpage to match code. (`pr#8456 <http://github.com/ceph/ceph/pull/8456>`_, Robin H. Johnson)
-* autotools: fix out of tree build (Krxysztof Kosinski)
-* autotools: improve make check output (Loic Dachary)
-* Be more careful about directory fragmentation and scrubbing (`issue#15167 <http://tracker.ceph.com/issues/15167>`_, `pr#8180 <http://github.com/ceph/ceph/pull/8180>`_, Yan, Zheng)
-* bluestore: latest and greatest (`issue#14210 <http://tracker.ceph.com/issues/14210>`_, `issue#13801 <http://tracker.ceph.com/issues/13801>`_, `pr#6896 <http://github.com/ceph/ceph/pull/6896>`_, xie.xingguo, Jianpeng Ma, YiQiang Chen, Sage Weil, Ning Yao)
-* buffer: add invalidate_crc() (Piotr Dalek)
-* buffer: add symmetry operator==() and operator!=() (`pr#7974 <http://github.com/ceph/ceph/pull/7974>`_, Kefu Chai)
-* buffer: fix internal iterator invalidation on rebuild, get_contiguous (`pr#6962 <http://github.com/ceph/ceph/pull/6962>`_, Sage Weil)
-* buffer: fix zero bug (#12252 Haomai Wang)
-* buffer: hide iterator_impl symbols (`issue#14788 <http://tracker.ceph.com/issues/14788>`_, `pr#7688 <http://github.com/ceph/ceph/pull/7688>`_, Kefu Chai)
-* buffer: increment history alloc as well in raw_combined (`issue#14955 <http://tracker.ceph.com/issues/14955>`_, `pr#7910 <http://github.com/ceph/ceph/pull/7910>`_, Samuel Just)
-* buffer: make usable outside of ceph source again (`pr#6863 <http://github.com/ceph/ceph/pull/6863>`_, Josh Durgin)
-* buffer: raw_combined allocations buffer and ref count together (`pr#7612 <http://github.com/ceph/ceph/pull/7612>`_, Sage Weil)
-* buffer: some cleanup (Michal Jarzabek)
-* buffer: use move construct to append/push_back/push_front (`pr#7455 <http://github.com/ceph/ceph/pull/7455>`_, Haomai Wang)
-* build: Adding build requires (`pr#7742 <http://github.com/ceph/ceph/pull/7742>`_, Erwan Velu)
-* build: a few armhf (32-bit build) fixes (`pr#7999 <http://github.com/ceph/ceph/pull/7999>`_, Eric Lee, Sage Weil)
-* build: allow jemalloc with rocksdb-static (`pr#7368 <http://github.com/ceph/ceph/pull/7368>`_, Somnath Roy)
-* build: allow tcmalloc-minimal (Thorsten Behrens)
-* build: build internal plugins and classes as modules (`pr#6462 <http://github.com/ceph/ceph/pull/6462>`_, James Page)
-* build: C++11 now supported
-* build: cmake check fixes (`pr#6787 <http://github.com/ceph/ceph/pull/6787>`_, Orit Wasserman)
-* build: cmake: fix nss linking (Danny Al-Gaaf)
-* build: cmake: misc fixes (Orit Wasserman, Casey Bodley)
-* build: cmake tweaks (`pr#6254 <http://github.com/ceph/ceph/pull/6254>`_, John Spray)
-* build: disable LTTNG by default (#11333 Josh Durgin)
-* build: do not build ceph-dencoder with tcmalloc (#10691 Boris Ranto)
-* build: fix a few warnings (`pr#6847 <http://github.com/ceph/ceph/pull/6847>`_, Orit Wasserman)
-* build: fix bz2-dev dependency (`pr#6948 <http://github.com/ceph/ceph/pull/6948>`_, Samuel Just)
-* build: fix compiling warnings (`pr#8366 <http://github.com/ceph/ceph/pull/8366>`_, Dongsheng Yang)
-* build: Fixing BTRFS issue at 'make check' (`pr#7805 <http://github.com/ceph/ceph/pull/7805>`_, Erwan Velu)
-* build: fix Jenkins make check errors due to deep-scrub randomization (`pr#6671 <http://github.com/ceph/ceph/pull/6671>`_, David Zafman)
-* build: fix junit detection on Fedora 22 (Ira Cooper)
-* build: fix pg ref disabling (William A. Kennington III)
-* build: fix ppc build (James Page)
-* build: fix the autotools and cmake build (the new fusestore needs libfuse) (`pr#7393 <http://github.com/ceph/ceph/pull/7393>`_, Kefu Chai)
-* build: fix warnings (`pr#7197 <http://github.com/ceph/ceph/pull/7197>`_, Kefu Chai, xie xingguo)
-* build: fix warnings (`pr#7315 <http://github.com/ceph/ceph/pull/7315>`_, Kefu Chai)
-* build: FreeBSD related fixes (`pr#7170 <http://github.com/ceph/ceph/pull/7170>`_, Mykola Golub)
-* build: Gentoo: _FORTIFY_SOURCE fix. (`issue#13920 <http://tracker.ceph.com/issues/13920>`_, `pr#6739 <http://github.com/ceph/ceph/pull/6739>`_, Robin H. Johnson)
-* build: install-deps: misc fixes (Loic Dachary)
-* build: install-deps.sh improvements (Loic Dachary)
-* build: install-deps: support OpenSUSE (Loic Dachary)
-* build: kill warnings (`pr#7397 <http://github.com/ceph/ceph/pull/7397>`_, Kefu Chai)
-* build: make_dist_tarball.sh (Sage Weil)
-* build: many cmake improvements
-* build: misc cmake fixes (Matt Benjamin)
-* build: misc fixes (Boris Ranto, Ken Dreyer, Owen Synge)
-* build: misc make check fixes (`pr#7153 <http://github.com/ceph/ceph/pull/7153>`_, Sage Weil)
-* build: more CMake package check fixes (`pr#6108 <http://github.com/ceph/ceph/pull/6108>`_, Daniel Gryniewicz)
-* build: move libexec scripts to standardize across distros (`issue#14687 <http://tracker.ceph.com/issues/14687>`_, `issue#14705 <http://tracker.ceph.com/issues/14705>`_, `issue#14723 <http://tracker.ceph.com/issues/14723>`_, `pr#7636 <http://github.com/ceph/ceph/pull/7636>`_, Nathan Cutler, Kefu Chai)
-* build/ops: enable CR in CentOS 7 (`issue#13997 <http://tracker.ceph.com/issues/13997>`_, `pr#6844 <http://github.com/ceph/ceph/pull/6844>`_, Loic Dachary)
-* build/ops: rbd-replay moved from ceph-test-dbg to ceph-common-dbg (`issue#13785 <http://tracker.ceph.com/issues/13785>`_, `pr#6578 <http://github.com/ceph/ceph/pull/6578>`_, Loic Dachary)
-* build/ops: systemd ceph-disk unit must not assume /bin/flock (`issue#13975 <http://tracker.ceph.com/issues/13975>`_, `pr#6803 <http://github.com/ceph/ceph/pull/6803>`_, Loic Dachary)
-* build: OSX build fixes (Yan, Zheng)
-* build: Refrain from versioning and packaging EC testing plugins (`issue#14756 <http://tracker.ceph.com/issues/14756>`_, `issue#14723 <http://tracker.ceph.com/issues/14723>`_, `pr#7637 <http://github.com/ceph/ceph/pull/7637>`_, Nathan Cutler, Kefu Chai)
-* build: remove rest-bench
-* build: Respect TMPDIR for virtualenv. (`pr#8457 <http://github.com/ceph/ceph/pull/8457>`_, Robin H. Johnson)
-* build: spdk submodule; cmake (`pr#7503 <http://github.com/ceph/ceph/pull/7503>`_, Kefu Chai)
-* build: workaround an automake bug for "make check" (`issue#14723 <http://tracker.ceph.com/issues/14723>`_, `pr#7626 <http://github.com/ceph/ceph/pull/7626>`_, Kefu Chai)
-* ceph-authtool: fix return code on error (Gerhard Muntingh)
-* ceph: bash auto complete for CLI based on mon command descriptions (`pr#7693 <http://github.com/ceph/ceph/pull/7693>`_, Adam Kupczyk)
-* ceph_daemon.py: Resolved ImportError to work with python3 (`pr#7937 <http://github.com/ceph/ceph/pull/7937>`_, Sarthak Munshi)
-* ceph-detect-init: add debian/jessie test (`pr#8074 <http://github.com/ceph/ceph/pull/8074>`_, Kefu Chai)
-* ceph-detect-init: added Linux Mint (Michal Jarzabek)
-* ceph-detect-init: add missing test case (`pr#8105 <http://github.com/ceph/ceph/pull/8105>`_, Nathan Cutler)
-* ceph-detect-init: fix py3 test (`pr#7025 <http://github.com/ceph/ceph/pull/7025>`_, Kefu Chai)
-* ceph-detect-init: fix py3 test (`pr#7243 <http://github.com/ceph/ceph/pull/7243>`_, Kefu Chai)
-* ceph_detect_init/__init__.py: remove shebang (`pr#7731 <http://github.com/ceph/ceph/pull/7731>`_, Nathan Cutler)
-* ceph-detect-init: return correct value on recent SUSE distros (`issue#14770 <http://tracker.ceph.com/issues/14770>`_, `pr#7909 <http://github.com/ceph/ceph/pull/7909>`_, Nathan Cutler)
-* ceph-detect-init: robust init system detection (Owen Synge)
-* ceph-detect-init/run-tox.sh: FreeBSD: No init detect (`pr#8373 <http://github.com/ceph/ceph/pull/8373>`_, Willem Jan Withagen)
-* ceph-detect-init: Ubuntu >= 15.04 uses systemd (`pr#6873 <http://github.com/ceph/ceph/pull/6873>`_, James Page)
-* ceph-disk: Add destroy and deactivate option (`issue#7454 <http://tracker.ceph.com/issues/7454>`_, `pr#5867 <http://github.com/ceph/ceph/pull/5867>`_, Vicente Cheng)
-* ceph-disk: add -f flag for btrfs mkfs (`pr#7222 <http://github.com/ceph/ceph/pull/7222>`_, Darrell Enns)
-* ceph-disk: Add --setuser and --setgroup options for ceph-disk (`pr#7351 <http://github.com/ceph/ceph/pull/7351>`_, Mike Shuey)
-* ceph-disk: ceph-disk list fails on /dev/cciss!c0d0 (`issue#13970 <http://tracker.ceph.com/issues/13970>`_, `issue#14233 <http://tracker.ceph.com/issues/14233>`_, `issue#14230 <http://tracker.ceph.com/issues/14230>`_, `pr#6879 <http://github.com/ceph/ceph/pull/6879>`_, Loic Dachary)
-* ceph-disk: compare parted output with the dereferenced path (`issue#13438 <http://tracker.ceph.com/issues/13438>`_, `pr#6219 <http://github.com/ceph/ceph/pull/6219>`_, Joe Julian)
-* ceph-disk: deactivate / destroy PATH arg are optional (`pr#7756 <http://github.com/ceph/ceph/pull/7756>`_, Loic Dachary)
-* ceph-disk: do not always fail when re-using a partition (`pr#8508 <http://github.com/ceph/ceph/pull/8508>`_, You Ji)
-* ceph-disk: ensure 'zap' only operates on a full disk (#11272 Loic Dachary)
-* ceph-disk: fixes to respect init system (Loic Dachary, Owen Synge)
-* ceph-disk: fix failures when preparing disks with udev > 214 (`issue#14080 <http://tracker.ceph.com/issues/14080>`_, `issue#14094 <http://tracker.ceph.com/issues/14094>`_, `pr#6926 <http://github.com/ceph/ceph/pull/6926>`_, Loic Dachary, Ilya Dryomov)
-* ceph-disk: fix prepare --help (`pr#7758 <http://github.com/ceph/ceph/pull/7758>`_, Loic Dachary)
-* ceph-disk: Fix trivial typo (`pr#7472 <http://github.com/ceph/ceph/pull/7472>`_, Brad Hubbard)
-* ceph-disk: fix zap sgdisk invocation (Owen Synge, Thorsten Behrens)
-* ceph-disk: flake8 fixes (`pr#7646 <http://github.com/ceph/ceph/pull/7646>`_, Loic Dachary)
-* ceph-disk: follow ceph-osd hints when creating journal (#9580 Sage Weil)
-* ceph-disk: get Nonetype when ceph-disk list with --format plain on single device. (`pr#6410 <http://github.com/ceph/ceph/pull/6410>`_, Vicente Cheng)
-* ceph-disk: handle re-using existing partition (#10987 Loic Dachary)
-* ceph-disk: improve parted output parsing (#10983 Loic Dachary)
-* ceph-disk: Improving 'make check' for ceph-disk (`pr#7762 <http://github.com/ceph/ceph/pull/7762>`_, Erwan Velu)
-* ceph-disk: install pip > 6.1 (#11952 Loic Dachary)
-* ceph-disk: key management support (`issue#14669 <http://tracker.ceph.com/issues/14669>`_, `pr#7552 <http://github.com/ceph/ceph/pull/7552>`_, Loic Dachary)
-* ceph-disk: make some arguments as required if necessary (`pr#7687 <http://github.com/ceph/ceph/pull/7687>`_, Dongsheng Yang)
-* ceph-disk: make suppression work for activate-all and activate-journal (Dan van der Ster)
-* ceph-disk: many fixes (Loic Dachary, Alfredo Deza)
-* ceph-disk: pass --cluster arg on prepare subcommand (Kefu Chai)
-* ceph-disk: s/dmcrpyt/dmcrypt/ (`issue#14838 <http://tracker.ceph.com/issues/14838>`_, `pr#7744 <http://github.com/ceph/ceph/pull/7744>`_, Loic Dachary, Frode Sandholtbraaten)
-* ceph-disk: support bluestore (`issue#13422 <http://tracker.ceph.com/issues/13422>`_, `pr#7218 <http://github.com/ceph/ceph/pull/7218>`_, Loic Dachary, Sage Weil)
-* ceph-disk: support for multipath devices (Loic Dachary)
-* ceph-disk: support NVMe device partitions (#11612 Ilja Slepnev)
-* ceph-disk/test: fix test_prepare.py::TestPrepare tests (`pr#7549 <http://github.com/ceph/ceph/pull/7549>`_, Kefu Chai)
-* ceph-disk: warn for prepare partitions with bad GUIDs (`issue#13943 <http://tracker.ceph.com/issues/13943>`_, `pr#6760 <http://github.com/ceph/ceph/pull/6760>`_, David Disseldorp)
-* ceph: fix 'df' units (Zhe Zhang)
-* ceph: fix parsing in interactive cli mode (#11279 Kefu Chai)
-* ceph: fix tell behavior (`pr#6329 <http://github.com/ceph/ceph/pull/6329>`_, David Zafman)
-* cephfs-data-scan: many additions, improvements (John Spray)
-* cephfs-data-scan: scan_frags (`pr#5941 <http://github.com/ceph/ceph/pull/5941>`_, John Spray)
-* cephfs-data-scan: scrub tag filtering (#12133 and #12145) (`issue#12133 <http://tracker.ceph.com/issues/12133>`_, `issue#12145 <http://tracker.ceph.com/issues/12145>`_, `pr#5685 <http://github.com/ceph/ceph/pull/5685>`_, John Spray)
-* ceph-fuse: add process to ceph-fuse --help (`pr#6821 <http://github.com/ceph/ceph/pull/6821>`_, Wei Feng)
-* ceph-fuse: do not require successful remount when unmounting (#10982 Greg Farnum)
-* ceph-fuse: fix double decreasing the count to trim caps (`issue#14319 <http://tracker.ceph.com/issues/14319>`_, `pr#7229 <http://github.com/ceph/ceph/pull/7229>`_, Zhi Zhang)
-* ceph-fuse: fix double free of args (`pr#7015 <http://github.com/ceph/ceph/pull/7015>`_, Ilya Shipitsin)
-* ceph-fuse: fix fsync() (`pr#6388 <http://github.com/ceph/ceph/pull/6388>`_, Yan, Zheng)
-* ceph-fuse: Fix potential filehandle ref leak at umount (`issue#14800 <http://tracker.ceph.com/issues/14800>`_, `pr#7686 <http://github.com/ceph/ceph/pull/7686>`_, Zhi Zhang)
-* ceph-fuse, libcephfs: don't clear COMPLETE when trimming null (Yan, Zheng)
-* ceph-fuse, libcephfs: drop inode when rmdir finishes (#11339 Yan, Zheng)
-* ceph-fuse,libcephfs: Fix client handling of "lost" open directories on shutdown (`issue#14996 <http://tracker.ceph.com/issues/14996>`_, `pr#7994 <http://github.com/ceph/ceph/pull/7994>`_, Yan, Zheng)
-* ceph-fuse,libcephfs: fix free fds being exhausted eventually because freed fds are never put back (`issue#14798 <http://tracker.ceph.com/issues/14798>`_, `pr#7685 <http://github.com/ceph/ceph/pull/7685>`_, Zhi Zhang)
-* ceph-fuse,libcephfs: fix uninline (#11356 Yan, Zheng)
-* ceph-fuse, libcephfs: hold exclusive caps on dirs we "own" (#11226 Greg Farnum)
-* ceph-fuse: mostly behave on 32-bit hosts (Yan, Zheng)
-* ceph-fuse:print usage information when no parameter specified (`pr#6868 <http://github.com/ceph/ceph/pull/6868>`_, Bo Cai)
-* ceph-fuse: rotate log file (`pr#8485 <http://github.com/ceph/ceph/pull/8485>`_, Sage Weil)
-* ceph-fuse: While starting ceph-fuse, start the log thread first (`issue#13443 <http://tracker.ceph.com/issues/13443>`_, `pr#6224 <http://github.com/ceph/ceph/pull/6224>`_, Wenjun Huang)
-* ceph: improve error output for 'tell' (#11101 Kefu Chai)
-* ceph: improve the error message (`issue#11101 <http://tracker.ceph.com/issues/11101>`_, `pr#7106 <http://github.com/ceph/ceph/pull/7106>`_, Kefu Chai)
-* ceph.in: avoid a broken pipe error when use ceph command (`issue#14354 <http://tracker.ceph.com/issues/14354>`_, `pr#7212 <http://github.com/ceph/ceph/pull/7212>`_, Bo Cai)
-* ceph.in: correct dev python path for automake builds (`pr#8360 <http://github.com/ceph/ceph/pull/8360>`_, Josh Durgin)
-* ceph.in: fix python libpath for automake as well (`pr#8362 <http://github.com/ceph/ceph/pull/8362>`_, Josh Durgin)
-* ceph.in: Minor python3 specific changes (`pr#7947 <http://github.com/ceph/ceph/pull/7947>`_, Sarthak Munshi)
-* ceph-kvstore-tool: handle bad out file on command line (`pr#6093 <http://github.com/ceph/ceph/pull/6093>`_, Kefu Chai)
-* ceph-mds:add --help/-h (`pr#6850 <http://github.com/ceph/ceph/pull/6850>`_, Cilang Zhao)
-* ceph-monstore-tool: fix store-copy (Huangjun)
-* ceph: new 'ceph daemonperf' command (John Spray, Mykola Golub)
-* ceph_objectstore_bench: fix race condition, bugs (`issue#13516 <http://tracker.ceph.com/issues/13516>`_, `pr#6681 <http://github.com/ceph/ceph/pull/6681>`_, Igor Fedotov)
-* ceph-objectstore-tool: fix --dry-run for many ceph-objectstore-tool operations (`pr#6545 <http://github.com/ceph/ceph/pull/6545>`_, David Zafman)
-* ceph-objectstore-tool: many many improvements (David Zafman)
-* ceph-objectstore-tool: refactoring and cleanup (John Spray)
-* ceph-post-file: misc fixes (Joey McDonald, Sage Weil)
-* ceph-rest-api: fix fs/flag/set (`pr#8428 <http://github.com/ceph/ceph/pull/8428>`_, Sage Weil)
-* ceph.spec.in: add BuildRequires: systemd (`issue#13860 <http://tracker.ceph.com/issues/13860>`_, `pr#6692 <http://github.com/ceph/ceph/pull/6692>`_, Nathan Cutler)
-* ceph.spec.in: add copyright notice (`issue#14694 <http://tracker.ceph.com/issues/14694>`_, `pr#7569 <http://github.com/ceph/ceph/pull/7569>`_, Nathan Cutler)
-* ceph.spec.in: add license declaration (`pr#7574 <http://github.com/ceph/ceph/pull/7574>`_, Nathan Cutler)
-* ceph.spec.in: disable lttng and babeltrace explicitly (`issue#14844 <http://tracker.ceph.com/issues/14844>`_, `pr#7857 <http://github.com/ceph/ceph/pull/7857>`_, Kefu Chai)
-* ceph.spec.in: do not install Ceph RA on systemd platforms (`issue#14828 <http://tracker.ceph.com/issues/14828>`_, `pr#7894 <http://github.com/ceph/ceph/pull/7894>`_, Nathan Cutler)
-* ceph.spec.in: fix openldap and openssl build dependencies for SUSE (`issue#15138 <http://tracker.ceph.com/issues/15138>`_, `pr#8120 <http://github.com/ceph/ceph/pull/8120>`_, Nathan Cutler)
-* ceph.spec.in: limit _smp_mflags when lowmem_builder is set in SUSE's OBS (`issue#13858 <http://tracker.ceph.com/issues/13858>`_, `pr#6691 <http://github.com/ceph/ceph/pull/6691>`_, Nathan Cutler)
-* ceph_test_libcephfs: tolerate duplicated entries in readdir (`issue#14377 <http://tracker.ceph.com/issues/14377>`_, `pr#7246 <http://github.com/ceph/ceph/pull/7246>`_, Yan, Zheng)
-* ceph_test_msgr: reduce test size to fix memory size (`pr#8127 <http://github.com/ceph/ceph/pull/8127>`_, Haomai Wang)
-* ceph_test_msgr: Use send_message instead of keepalive to wakeup connection (`pr#6605 <http://github.com/ceph/ceph/pull/6605>`_, Haomai Wang)
-* ceph_test_rados_misc: shorten mount timeout (`pr#8209 <http://github.com/ceph/ceph/pull/8209>`_, Sage Weil)
-* ceph_test_rados: test pipelined reads (Zhiqiang Wang)
-* check-generated.sh: can't source bash from sh (`pr#8521 <http://github.com/ceph/ceph/pull/8521>`_, Michal Jarzabek)
-* cleanup (`pr#8058 <http://github.com/ceph/ceph/pull/8058>`_, Yehuda Sadeh, Orit Wasserman)
-* cleanup: remove misc dead code (`pr#7201 <http://github.com/ceph/ceph/pull/7201>`_, Erwan Velu)
-* client: a better check for MDS availability (`pr#6253 <http://github.com/ceph/ceph/pull/6253>`_, John Spray)
-* client: add option to control how directory size is calculated (`pr#7323 <http://github.com/ceph/ceph/pull/7323>`_, Yan, Zheng)
-* client: avoid creating orphan object in Client::check_pool_perm() (`issue#13782 <http://tracker.ceph.com/issues/13782>`_, `pr#6603 <http://github.com/ceph/ceph/pull/6603>`_, Yan, Zheng)
-* client: avoid sending unnecessary FLUSHSNAP messages (Yan, Zheng)
-* client: check if Fh is readable when processing a read (`issue#11517 <http://tracker.ceph.com/issues/11517>`_, `pr#7209 <http://github.com/ceph/ceph/pull/7209>`_, Yan, Zheng)
-* client: close mds sessions in shutdown() (`pr#6269 <http://github.com/ceph/ceph/pull/6269>`_, John Spray)
-* client: don't invalidate page cache when inode is no longer used (`pr#6380 <http://github.com/ceph/ceph/pull/6380>`_, Yan, Zheng)
-* client: don't mark_down on command reply (`pr#6204 <http://github.com/ceph/ceph/pull/6204>`_, John Spray)
-* client: drop prefix from ints (`pr#6275 <http://github.com/ceph/ceph/pull/6275>`_, John Coyle)
-* client: exclude setfilelock when calculating oldest tid (Yan, Zheng)
-* client: fix error handling in check_pool_perm (John Spray)
-* client: flush kernel pagecache before creating snapshot (`issue#10436 <http://tracker.ceph.com/issues/10436>`_, `pr#7495 <http://github.com/ceph/ceph/pull/7495>`_, Yan, Zheng)
-* client: fsync waits only for inode's caps to flush (Yan, Zheng)
-* client: invalidate kernel dcache when cache size exceeds limits (Yan, Zheng)
-* client: make fsync wait for unsafe dir operations (Yan, Zheng)
-* client: modify a word in log (`pr#6906 <http://github.com/ceph/ceph/pull/6906>`_, YongQiang He)
-* client: pin lookup dentry to avoid inode being freed (Yan, Zheng)
-* client: properly trim unlinked inode (`issue#13903 <http://tracker.ceph.com/issues/13903>`_, `pr#7297 <http://github.com/ceph/ceph/pull/7297>`_, Yan, Zheng)
-* client: removed unused Mutex from MetaRequest (`pr#7655 <http://github.com/ceph/ceph/pull/7655>`_, Greg Farnum)
-* client: sys/file.h includes for flock operations (`pr#6282 <http://github.com/ceph/ceph/pull/6282>`_, John Coyle)
-* client: use null snapc to check pool permission (`issue#13714 <http://tracker.ceph.com/issues/13714>`_, `pr#6497 <http://github.com/ceph/ceph/pull/6497>`_, Yan, Zheng)
-* cls/cls_rbd.cc: fix misused metadata_name_from_key (`issue#13922 <http://tracker.ceph.com/issues/13922>`_, `pr#6661 <http://github.com/ceph/ceph/pull/6661>`_, Xiaoxi Chen)
-* cls/cls_rbd: pass string by reference (`pr#7232 <http://github.com/ceph/ceph/pull/7232>`_, Jeffrey Lu)
-* cls_hello: Fix grammatical error in description comment (`pr#7951 <http://github.com/ceph/ceph/pull/7951>`_, Brad Hubbard)
-* cls_journal: fix -EEXIST checking (`pr#8413 <http://github.com/ceph/ceph/pull/8413>`_, runsisi)
-* cls_rbd: add guards for error cases (`issue#14316 <http://tracker.ceph.com/issues/14316>`_, `issue#14317 <http://tracker.ceph.com/issues/14317>`_, `pr#7165 <http://github.com/ceph/ceph/pull/7165>`_, xie xingguo)
-* cls_rbd: change object_map_update to return 0 on success, add logging (`pr#6467 <http://github.com/ceph/ceph/pull/6467>`_, Douglas Fuller)
-* cls_rbd: enable object map checksums for object_map_save (`issue#14280 <http://tracker.ceph.com/issues/14280>`_, `pr#7149 <http://github.com/ceph/ceph/pull/7149>`_, Douglas Fuller)
-* cls_rbd: fix -EEXIST checking in cls::rbd::image_set (`pr#8371 <http://github.com/ceph/ceph/pull/8371>`_, runsisi)
-* cls_rbd: fix the test for ceph-dencoder (`pr#7793 <http://github.com/ceph/ceph/pull/7793>`_, Kefu Chai)
-* cls_rbd: mirror_image_list should return global image id (`pr#8297 <http://github.com/ceph/ceph/pull/8297>`_, Jason Dillaman)
-* cls_rbd: mirroring directory (`issue#14419 <http://tracker.ceph.com/issues/14419>`_, `pr#7620 <http://github.com/ceph/ceph/pull/7620>`_, Josh Durgin)
-* cls_rbd: pass WILLNEED fadvise flags during object map update (`issue#15332 <http://tracker.ceph.com/issues/15332>`_, `pr#8380 <http://github.com/ceph/ceph/pull/8380>`_, Jason Dillaman)
-* cls_rbd: protect against excessively large object maps (`issue#15121 <http://tracker.ceph.com/issues/15121>`_, `pr#8099 <http://github.com/ceph/ceph/pull/8099>`_, Jason Dillaman)
-* cls_rbd: read_peers: update last_read on next cls_cxx_map_get_vals (`pr#8374 <http://github.com/ceph/ceph/pull/8374>`_, Mykola Golub)
-* cls/rgw: fix FTBFS (`pr#8142 <http://github.com/ceph/ceph/pull/8142>`_, Kefu Chai)
-* cls/rgw: fix use of timespan (`issue#15181 <http://tracker.ceph.com/issues/15181>`_, `pr#8212 <http://github.com/ceph/ceph/pull/8212>`_, Yehuda Sadeh)
-* cmake: add common/fs_types.cc to libcommon (`pr#7898 <http://github.com/ceph/ceph/pull/7898>`_, Orit Wasserman)
-* cmake: Add common/PluginRegistry.cc to CMakeLists.txt (`pr#6805 <http://github.com/ceph/ceph/pull/6805>`_, Pete Zaitcev)
-* cmake: Added new unittests to make check (`pr#7572 <http://github.com/ceph/ceph/pull/7572>`_, Ali Maredia)
-* cmake: Add ENABLE_GIT_VERSION to avoid rebuilding (`pr#7171 <http://github.com/ceph/ceph/pull/7171>`_, Kefu Chai)
-* cmake: add ErasureCode.cc to jerasure plugins (`pr#7808 <http://github.com/ceph/ceph/pull/7808>`_, Casey Bodley)
-* cmake: add FindOpenSSL.cmake (`pr#8106 <http://github.com/ceph/ceph/pull/8106>`_, Marcus Watts, Matt Benjamin)
-* cmake: add KernelDevice.cc to libos_srcs (`pr#7507 <http://github.com/ceph/ceph/pull/7507>`_, Kefu Chai)
-* cmake: add missing check for HAVE_EXECINFO_H (`pr#7270 <http://github.com/ceph/ceph/pull/7270>`_, Casey Bodley)
-* cmake: add missing librbd image_watcher sources (`issue#14823 <http://tracker.ceph.com/issues/14823>`_, `pr#7717 <http://github.com/ceph/ceph/pull/7717>`_, Casey Bodley)
-* cmake: add missing librbd/MirrorWatcher.cc and librd/ObjectWatcher.cc (`pr#8399 <http://github.com/ceph/ceph/pull/8399>`_, Orit Wasserman)
-* cmake: add nss as a suffix for pk11pub.h (`pr#6556 <http://github.com/ceph/ceph/pull/6556>`_, Samuel Just)
-* cmake: add rgw_basic_types.cc to librgw.a (`pr#6786 <http://github.com/ceph/ceph/pull/6786>`_, Orit Wasserman)
-* cmake: add StandardPolicy.cc to librbd (`pr#8368 <http://github.com/ceph/ceph/pull/8368>`_, Kefu Chai)
-* cmake: add TracepointProvider.cc to libcommon (`pr#6823 <http://github.com/ceph/ceph/pull/6823>`_, Orit Wasserman)
-* cmake: avoid false-positive LDAP header detect (`pr#8100 <http://github.com/ceph/ceph/pull/8100>`_, Matt Benjamin)
-* cmake: Build cython modules and change paths to bin/, lib/ (`pr#8351 <http://github.com/ceph/ceph/pull/8351>`_, John Spray, Ali Maredia)
-* cmake: check for libsnappy in default path also (`pr#7366 <http://github.com/ceph/ceph/pull/7366>`_, Kefu Chai)
-* cmake: cleanups and more features from automake (`pr#7103 <http://github.com/ceph/ceph/pull/7103>`_, Casey Bodley, Ali Maredia)
-* cmake: define STRERROR_R_CHAR_P for GNU-specific strerror_r (`pr#6751 <http://github.com/ceph/ceph/pull/6751>`_, Ilya Dryomov)
-* cmake: detect bzip2 and lz4 (`pr#7126 <http://github.com/ceph/ceph/pull/7126>`_, Kefu Chai)
-* cmake: feb5 (`pr#7541 <http://github.com/ceph/ceph/pull/7541>`_, Matt Benjamin)
-* cmake: fix build with bluestore (`pr#7099 <http://github.com/ceph/ceph/pull/7099>`_, John Spray)
-* cmake: fix files list (`pr#6539 <http://github.com/ceph/ceph/pull/6539>`_, Yehuda Sadeh)
-* cmake: fix mrun to handle cmake build structure (`pr#8237 <http://github.com/ceph/ceph/pull/8237>`_, Orit Wasserman)
-* cmake: fix paths to various EC source files (`pr#7748 <http://github.com/ceph/ceph/pull/7748>`_, Ali Maredia, Matt Benjamin)
-* cmake: fix the build of test_rados_api_list (`pr#8438 <http://github.com/ceph/ceph/pull/8438>`_, Kefu Chai)
-* cmake: fix the build of tests (`pr#7523 <http://github.com/ceph/ceph/pull/7523>`_, Kefu Chai)
-* cmake: fix the build on trusty (`pr#7249 <http://github.com/ceph/ceph/pull/7249>`_, Kefu Chai)
-* cmake: For CMake version <= 2.8.11, use LINK_PRIVATE and LINK_PUBLIC (`pr#7474 <http://github.com/ceph/ceph/pull/7474>`_, Tao Chang)
-* CMake: For CMake version <= 2.8.11, use LINK_PRIVATE (`pr#8422 <http://github.com/ceph/ceph/pull/8422>`_, Haomai Wang)
-* cmake: let ceph-client-debug link with tcmalloc (`pr#7314 <http://github.com/ceph/ceph/pull/7314>`_, Kefu Chai)
-* cmake: librbd and libjournal build fixes (`pr#6557 <http://github.com/ceph/ceph/pull/6557>`_, Ilya Dryomov)
-* cmake: made rocksdb an imported library (`pr#7131 <http://github.com/ceph/ceph/pull/7131>`_, Ali Maredia)
-* cmake: no need to run configure from run-cmake-check.sh (`pr#6959 <http://github.com/ceph/ceph/pull/6959>`_, Orit Wasserman)
-* cmake (`pr#7849 <http://github.com/ceph/ceph/pull/7849>`_, Ali Maredia)
-* cmake: Remove duplicate find_package libcurl line. (`pr#7972 <http://github.com/ceph/ceph/pull/7972>`_, Brad Hubbard)
-* cmake: support ccache via a WITH_CCACHE build option (`pr#6875 <http://github.com/ceph/ceph/pull/6875>`_, John Coyle)
-* cmake: test_build_libcephfs needs ${ALLOC_LIBS} (`pr#7300 <http://github.com/ceph/ceph/pull/7300>`_, Ali Maredia)
-* cmake: update for recent librbd changes (`pr#6715 <http://github.com/ceph/ceph/pull/6715>`_, John Spray)
-* cmake: update for recent rbd changes (`pr#6818 <http://github.com/ceph/ceph/pull/6818>`_, Mykola Golub)
-* cmake: Use uname instead of arch. (`pr#6358 <http://github.com/ceph/ceph/pull/6358>`_, John Coyle)
-* coc: fix typo in the apt-get command (`pr#6659 <http://github.com/ceph/ceph/pull/6659>`_, Chris Holcombe)
-* common: add descriptions to perfcounters (Kiseleva Alyona)
-* common: add generic plugin infrastructure (`pr#6696 <http://github.com/ceph/ceph/pull/6696>`_, Sage Weil)
-* common: add latency perf counter for finisher (`pr#6175 <http://github.com/ceph/ceph/pull/6175>`_, Xinze Chi)
-* common: add perf counter descriptions (Alyona Kiseleva)
-* common/address_help.cc: fix the leak in entity_addr_from_url() (`issue#14132 <http://tracker.ceph.com/issues/14132>`_, `pr#6987 <http://github.com/ceph/ceph/pull/6987>`_, Qiankun Zheng)
-* common: add thread names (`pr#5882 <http://github.com/ceph/ceph/pull/5882>`_, Igor Podoski)
-* common: add zlib compression plugin (`pr#7437 <http://github.com/ceph/ceph/pull/7437>`_, Alyona Kiseleva, Kiseleva Alyona)
-* common: admin socket commands for tcmalloc heap get/set operations (`pr#7512 <http://github.com/ceph/ceph/pull/7512>`_, Samuel Just)
-* common: ake ceph_time clocks work under BSD (`pr#7340 <http://github.com/ceph/ceph/pull/7340>`_, Adam C. Emerson)
-* common: allow enable/disable of optracker at runtime (`pr#5168 <http://github.com/ceph/ceph/pull/5168>`_, Jianpeng Ma)
-* common: Allow OPT_INT settings with negative values (`issue#13829 <http://tracker.ceph.com/issues/13829>`_, `pr#7390 <http://github.com/ceph/ceph/pull/7390>`_, Brad Hubbard, Kefu Chai)
-* common: assert: abort() rather than throw (`pr#6804 <http://github.com/ceph/ceph/pull/6804>`_, Adam C. Emerson)
-* common: assert: __STRING macro is not defined by musl libc. (`pr#6210 <http://github.com/ceph/ceph/pull/6210>`_, John Coyle)
-* common/bit_vector: use hard-coded value for block size (`issue#14747 <http://tracker.ceph.com/issues/14747>`_, `pr#7610 <http://github.com/ceph/ceph/pull/7610>`_, Jason Dillaman)
-* common: buffer: add cached_crc and cached_crc_adjust counts to perf dump (`pr#6535 <http://github.com/ceph/ceph/pull/6535>`_, Ning Yao)
-* common: buffer/assert minor fixes (`pr#6990 <http://github.com/ceph/ceph/pull/6990>`_, Matt Benjamin)
-* common: bufferlist performance tuning (Piotr Dalek, Sage Weil)
-* common: buffer: put a guard for stat() syscall during read_file (`pr#7956 <http://github.com/ceph/ceph/pull/7956>`_, xie xingguo)
-* common: buffer: remove unneeded list destructor (`pr#6456 <http://github.com/ceph/ceph/pull/6456>`_, Michal Jarzabek)
-* common/buffer: replace RWLock with spinlocks (`pr#7294 <http://github.com/ceph/ceph/pull/7294>`_, Piotr Dałek)
-* common/ceph_context.cc:fix order of initialisers (`pr#6838 <http://github.com/ceph/ceph/pull/6838>`_, Michal Jarzabek)
-* common: change the type of counter total/unhealthy_workers (`pr#7254 <http://github.com/ceph/ceph/pull/7254>`_, Guang Yang)
-* common: default cluster name to config file prefix (`pr#7364 <http://github.com/ceph/ceph/pull/7364>`_, Javen Wu)
-* common: Deprecate or free up a bunch of feature bits (`pr#8214 <http://github.com/ceph/ceph/pull/8214>`_, Samuel Just)
-* common: detect overflow of int config values (#11484 Kefu Chai)
-* common: Do not use non-portable constants in mutex_debug (`pr#7766 <http://github.com/ceph/ceph/pull/7766>`_, Adam C. Emerson)
-* common: don't reverse hobject_t hash bits when zero (`pr#6653 <http://github.com/ceph/ceph/pull/6653>`_, Piotr Dałek)
-* common: fix bit_vector extent calc (#12611 Jason Dillaman)
-* common: fix json parsing of utf8 (#7387 Tim Serong)
-* common: fix leak of pthread_mutexattr (#11762 Ketor Meng)
-* common: fix LTTNG vs fork issue (Josh Durgin)
-* common: fix OpTracker age histogram calculation (`pr#5065 <http://github.com/ceph/ceph/pull/5065>`_, Zhiqiang Wang)
-* common: fix race during optracker switches between enabled/disabled mode (`pr#8330 <http://github.com/ceph/ceph/pull/8330>`_, xie xingguo)
-* common: fix reset max in Throttle using perf reset command (`issue#13517 <http://tracker.ceph.com/issues/13517>`_, `pr#6300 <http://github.com/ceph/ceph/pull/6300>`_, Xinze Chi)
-* common: fix throttle max change (Henry Chang)
-* common: fix time_t cast in decode (`issue#15330 <http://tracker.ceph.com/issues/15330>`_, `pr#8419 <http://github.com/ceph/ceph/pull/8419>`_, Adam C. Emerson)
-* common/Formatter: avoid newline if there is no output (`pr#5351 <http://github.com/ceph/ceph/pull/5351>`_, Aran85)
-* common: improve shared_cache and simple_cache efficiency with hash table (`pr#6909 <http://github.com/ceph/ceph/pull/6909>`_, Ning Yao)
-* common/lockdep: increase max lock names (`pr#6961 <http://github.com/ceph/ceph/pull/6961>`_, Sage Weil)
-* common: log: Assign LOG_DEBUG priority to syslog calls (`issue#13993 <http://tracker.ceph.com/issues/13993>`_, `pr#6815 <http://github.com/ceph/ceph/pull/6815>`_, Brad Hubbard)
-* common: log: predict log message buffer allocation size (`pr#6641 <http://github.com/ceph/ceph/pull/6641>`_, Adam Kupczyk)
-* common: make mutex more efficient
-* common: make work queue addition/removal thread safe (#12662 Jason Dillaman)
-* common/MemoryModel: Added explicit feature check for mallinfo(). (`pr#6252 <http://github.com/ceph/ceph/pull/6252>`_, John Coyle)
-* common: new timekeeping common code, and Objecter conversion (`pr#5782 <http://github.com/ceph/ceph/pull/5782>`_, Adam C. Emerson)
-* common/obj_bencher.cc: bump the precision of bandwidth field (`pr#8021 <http://github.com/ceph/ceph/pull/8021>`_, Piotr Dałek)
-* common/obj_bencher.cc: faster object name generation (`pr#7863 <http://github.com/ceph/ceph/pull/7863>`_, Piotr Dałek)
-* common/obj_bencher.cc: fix verification crashing when there's no objects (`pr#5853 <http://github.com/ceph/ceph/pull/5853>`_, Piotr Dałek)
-* common/obj_bencher.cc: make verify error fatal (`issue#14971 <http://tracker.ceph.com/issues/14971>`_, `pr#7897 <http://github.com/ceph/ceph/pull/7897>`_, Piotr Dałek)
-* common: optimize debug logging code (`pr#6441 <http://github.com/ceph/ceph/pull/6441>`_, Adam Kupczyk)
-* common: optimize debug logging (`pr#6307 <http://github.com/ceph/ceph/pull/6307>`_, Adam Kupczyk)
-* common: optracker improvements (Zhiqiang Wang, Jianpeng Ma)
-* common/page.cc: _page_mask has too many bits (`pr#7588 <http://github.com/ceph/ceph/pull/7588>`_, Dan Mick)
-* common: perf counter for bufferlist history total alloc (`pr#6198 <http://github.com/ceph/ceph/pull/6198>`_, Xinze Chi)
-* common: PriorityQueue tests (Kefu Chai)
-* common: reduce CPU usage by making stringstream in stringify function thread local (`pr#6543 <http://github.com/ceph/ceph/pull/6543>`_, Evgeniy Firsov)
-* common: re-enable backtrace support (`pr#6771 <http://github.com/ceph/ceph/pull/6771>`_, Jason Dillaman)
-* common: set thread name from correct thread (`pr#7845 <http://github.com/ceph/ceph/pull/7845>`_, Igor Podoski)
-* common: signal_handler: added support for using reentrant strsignal() implementations vs. sys_siglist[] (`pr#6796 <http://github.com/ceph/ceph/pull/6796>`_, John Coyle)
-* common: snappy decompressor may assert when handling segmented input bufferlist (`issue#14400 <http://tracker.ceph.com/issues/14400>`_, `pr#7268 <http://github.com/ceph/ceph/pull/7268>`_, Igor Fedotov)
-* common: some async compression infrastructure (Haomai Wang)
-* common/str_map: cleanup: replaced get_str_map() function overloading by using default parameters for delimiters (`pr#7266 <http://github.com/ceph/ceph/pull/7266>`_, Sahithi R V)
-* common/strtol.cc: fix the coverity warnings (`pr#7967 <http://github.com/ceph/ceph/pull/7967>`_, Kefu Chai)
-* common: SubProcess: Avoid buffer corruption when calling err() (`issue#15011 <http://tracker.ceph.com/issues/15011>`_, `pr#8054 <http://github.com/ceph/ceph/pull/8054>`_, Erwan Velu)
-* common: SubProcess: fix multiple definition bug (`pr#6790 <http://github.com/ceph/ceph/pull/6790>`_, Yunchuan Wen)
-* common: Thread: move copy constructor and assignment op (`pr#5133 <http://github.com/ceph/ceph/pull/5133>`_, Michal Jarzabek)
-* common: time: have skewing-now call non-skewing now (`pr#7466 <http://github.com/ceph/ceph/pull/7466>`_, Adam C. Emerson)
-* common/TrackedOp: fix inaccurate counting for slow requests (`issue#14804 <http://tracker.ceph.com/issues/14804>`_, `pr#7690 <http://github.com/ceph/ceph/pull/7690>`_, xie xingguo)
-* common: unit test for interval_set implementations (`pr#6 <http://github.com/ceph/ceph/pull/6>`_, Igor Fedotov)
-* common: use namespace instead of subclasses for buffer (`pr#6686 <http://github.com/ceph/ceph/pull/6686>`_, Michal Jarzabek)
-* common: various fixes from SCA runs (`pr#7680 <http://github.com/ceph/ceph/pull/7680>`_, Danny Al-Gaaf)
-* common: WorkQueue: new PointerWQ base class for ContextWQ (`issue#13636 <http://tracker.ceph.com/issues/13636>`_, `pr#6525 <http://github.com/ceph/ceph/pull/6525>`_, Jason Dillaman)
-* compat: use prefixed typeof extension (`pr#6216 <http://github.com/ceph/ceph/pull/6216>`_, John Coyle)
-* config: add $data_dir/config to config search path (`pr#7377 <http://github.com/ceph/ceph/pull/7377>`_, Sage Weil)
-* config: complains when a setting is not tracked (`issue#11692 <http://tracker.ceph.com/issues/11692>`_, `pr#7085 <http://github.com/ceph/ceph/pull/7085>`_, Kefu Chai)
-* config: fix osd_crush_initial_weight (`pr#7975 <http://github.com/ceph/ceph/pull/7975>`_, You Ji)
-* config: increase default async op threads (`pr#7802 <http://github.com/ceph/ceph/pull/7802>`_, Piotr Dałek)
-* config_opts: disable filestore throttle soft backoff by default (`pr#8265 <http://github.com/ceph/ceph/pull/8265>`_, Samuel Just)
-* configure.ac: boost_iostreams is required, not optional (`pr#7816 <http://github.com/ceph/ceph/pull/7816>`_, Hector Martin)
-* configure.ac: macro fix (`pr#6769 <http://github.com/ceph/ceph/pull/6769>`_, Igor Podoski)
-* configure.ac: make "--with-librocksdb-static" default to 'check' (`issue#14463 <http://tracker.ceph.com/issues/14463>`_, `pr#7317 <http://github.com/ceph/ceph/pull/7317>`_, Dan Mick)
-* configure.ac: update help strings for cython (`pr#7856 <http://github.com/ceph/ceph/pull/7856>`_, Josh Durgin)
-* configure: Add -D_LARGEFILE64_SOURCE to Linux build. (`pr#8402 <http://github.com/ceph/ceph/pull/8402>`_, Ira Cooper)
-* configure: detect bz2 and lz4 (`issue#13850 <http://tracker.ceph.com/issues/13850>`_, `issue#13981 <http://tracker.ceph.com/issues/13981>`_, `pr#7030 <http://github.com/ceph/ceph/pull/7030>`_, Kefu Chai)
-* correct radosgw-admin command (`pr#7006 <http://github.com/ceph/ceph/pull/7006>`_, YankunLi)
-* crush: add --check to validate dangling names, max osd id (Kefu Chai)
-* crush: add chooseleaf_stable tunable (`pr#6572 <http://github.com/ceph/ceph/pull/6572>`_, Sangdi Xu, Sage Weil)
-* crush: add safety assert (`issue#14496 <http://tracker.ceph.com/issues/14496>`_, `pr#7344 <http://github.com/ceph/ceph/pull/7344>`_, songbaisen)
-* crush: cleanup, sync with kernel (Ilya Dryomov)
-* crush: clean up whitespace removal (`issue#14302 <http://tracker.ceph.com/issues/14302>`_, `pr#7157 <http://github.com/ceph/ceph/pull/7157>`_, songbaisen)
-* crush/CrushTester: check for overlapped rules (`pr#7139 <http://github.com/ceph/ceph/pull/7139>`_, Kefu Chai)
-* crush/CrushTester: workaround a bug in boost::icl (`pr#7560 <http://github.com/ceph/ceph/pull/7560>`_, Kefu Chai)
-* crush: fix cli tests for new crush tunables (`pr#8107 <http://github.com/ceph/ceph/pull/8107>`_, Sage Weil)
-* crush: fix crash from invalid 'take' argument (#11602 Shiva Rkreddy, Sage Weil)
-* crush: fix divide-by-2 in straw2 (#11357 Yann Dupont, Sage Weil)
-* crush: fix error log (`pr#8430 <http://github.com/ceph/ceph/pull/8430>`_, Wei Jin)
-* crush: fix has_v4_buckets (#11364 Sage Weil)
-* crush: fix subtree base weight on adjust_subtree_weight (#11855 Sage Weil)
-* crush: fix typo (`pr#8518 <http://github.com/ceph/ceph/pull/8518>`_, Wei Jin)
-* crush: reply quickly from get_immediate_parent (`issue#14334 <http://tracker.ceph.com/issues/14334>`_, `pr#7181 <http://github.com/ceph/ceph/pull/7181>`_, song baisen)
-* crush: respect default replicated ruleset config on map creation (Ilya Dryomov)
-* crushtool: Don't crash when called on a file that isn't a crushmap (`issue#8286 <http://tracker.ceph.com/issues/8286>`_, `pr#8038 <http://github.com/ceph/ceph/pull/8038>`_, Brad Hubbard)
-* crushtool: fix order of operations, usage (Sage Weil)
-* crushtool: improve usage/tip messages (`pr#7142 <http://github.com/ceph/ceph/pull/7142>`_, xie xingguo)
-* crushtool: set type 0 name "device" for --build option (`pr#6824 <http://github.com/ceph/ceph/pull/6824>`_, Sangdi Xu)
-* crush: update tunable docs.  change default profile to jewel (`pr#7964 <http://github.com/ceph/ceph/pull/7964>`_, Sage Weil)
-* crush: validate bucket id before indexing buckets array (`issue#13477 <http://tracker.ceph.com/issues/13477>`_, `pr#6246 <http://github.com/ceph/ceph/pull/6246>`_, Sage Weil)
-* crypto: fix NSS leak (Jason Dillaman)
-* crypto: fix unbalanced init/shutdown (#12598 Zheng Yan)
-* deb: fix rest-bench-dbg and ceph-test-dbg dependendies (Ken Dreyer)
-* debian/changelog: Remove stray 'v' in version (`pr#7936 <http://github.com/ceph/ceph/pull/7936>`_, Dan Mick)
-* debian/changelog: Remove stray 'v' in version (`pr#7938 <http://github.com/ceph/ceph/pull/7938>`_, Dan Mick)
-* debian: include cpio in build-requiers (`pr#7533 <http://github.com/ceph/ceph/pull/7533>`_, Rémi BUISSON)
-* debian: minor package reorg (Ken Dreyer)
-* debian: package librgw_file* tests (`pr#7930 <http://github.com/ceph/ceph/pull/7930>`_, Ken Dreyer)
-* debian: packaging fixes for jewel (`pr#7807 <http://github.com/ceph/ceph/pull/7807>`_, Ken Dreyer, Ali Maredia)
-* debian/rpm split servers (`issue#10587 <http://tracker.ceph.com/issues/10587>`_, `pr#7746 <http://github.com/ceph/ceph/pull/7746>`_, Ken Dreyer)
-* debian/rules: put init-ceph in /etc/init.d/ceph, not ceph-base (`issue#15329 <http://tracker.ceph.com/issues/15329>`_, `pr#8406 <http://github.com/ceph/ceph/pull/8406>`_, Dan Mick)
-* deb, rpm: move ceph-objectstore-tool to ceph (Ken Dreyer)
-* doc: add ceph-detect-init(8) source to dist tarball (`pr#7933 <http://github.com/ceph/ceph/pull/7933>`_, Ken Dreyer)
-* doc: add cinder backend section to rbd-openstack.rst (`pr#7923 <http://github.com/ceph/ceph/pull/7923>`_, RustShen)
-* doc: adding "--allow-shrink" in decreasing the size of the rbd block to distinguish from the increasing option (`pr#7020 <http://github.com/ceph/ceph/pull/7020>`_, Yehua)
-* doc: add orphans commands to radosgw-admin(8) (`issue#14637 <http://tracker.ceph.com/issues/14637>`_, `pr#7518 <http://github.com/ceph/ceph/pull/7518>`_, Ken Dreyer)
-* doc: add v0.80.11 to the release timeline (`pr#6658 <http://github.com/ceph/ceph/pull/6658>`_, Loic Dachary)
-* doc: admin/build-doc: add lxml dependencies on debian (`pr#6610 <http://github.com/ceph/ceph/pull/6610>`_, Ken Dreyer)
-* doc: admin/build-doc: make paths absolute (`pr#7119 <http://github.com/ceph/ceph/pull/7119>`_, Dan Mick)
-* doc: amend Fixes instructions in SubmittingPatches (`pr#8312 <http://github.com/ceph/ceph/pull/8312>`_, Nathan Cutler)
-* doc: amend the rados.8 (`pr#7251 <http://github.com/ceph/ceph/pull/7251>`_, Kefu Chai)
-* doc/architecture.rst: remove redundant word "across" (`pr#8179 <http://github.com/ceph/ceph/pull/8179>`_, Zhao Junwang)
-* doc/cephfs/posix: update (`pr#6922 <http://github.com/ceph/ceph/pull/6922>`_, Sage Weil)
-* doc: Clarify usage on starting single osd/mds/mon. (`pr#7641 <http://github.com/ceph/ceph/pull/7641>`_, Patrick Donnelly)
-* doc: CodingStyle: fix broken URLs (`pr#6733 <http://github.com/ceph/ceph/pull/6733>`_, Kefu Chai)
-* doc: correct typo 'restared' to 'restarted' (`pr#6734 <http://github.com/ceph/ceph/pull/6734>`_, Yilong Zhao)
-* doc: detailed description of bugfixing workflow (`pr#7941 <http://github.com/ceph/ceph/pull/7941>`_, Nathan Cutler)
-* doc/dev: add "Deploy a cluster for manual testing" section (`issue#15218 <http://tracker.ceph.com/issues/15218>`_, `pr#8228 <http://github.com/ceph/ceph/pull/8228>`_, Nathan Cutler)
-* doc/dev: add section on interrupting a running suite (`pr#8116 <http://github.com/ceph/ceph/pull/8116>`_, Nathan Cutler)
-* doc/dev: continue writing Testing in the cloud chapter (`pr#7960 <http://github.com/ceph/ceph/pull/7960>`_, Nathan Cutler)
-* doc: dev: document ceph-qa-suite (`pr#6955 <http://github.com/ceph/ceph/pull/6955>`_, Loic Dachary)
-* doc/dev/index: refactor/reorg (`pr#6792 <http://github.com/ceph/ceph/pull/6792>`_, Nathan Cutler)
-* doc/dev/index.rst: begin writing Contributing to Ceph (`pr#6727 <http://github.com/ceph/ceph/pull/6727>`_, Nathan Cutler)
-* doc/dev/index.rst: fix headings (`pr#6780 <http://github.com/ceph/ceph/pull/6780>`_, Nathan Cutler)
-* doc/dev: integrate testing into the narrative (`pr#7946 <http://github.com/ceph/ceph/pull/7946>`_, Nathan Cutler)
-* doc: dev: introduction to tests (`pr#6910 <http://github.com/ceph/ceph/pull/6910>`_, Loic Dachary)
-* doc/dev: various refinements (`pr#7954 <http://github.com/ceph/ceph/pull/7954>`_, Nathan Cutler)
-* doc: docuemnt object corpus generation (#11099 Alexis Normand)
-* doc: document "readforward" and "readproxy" cache mode (`pr#7023 <http://github.com/ceph/ceph/pull/7023>`_, Kefu Chai)
-* doc: document region hostnames (Robin H. Johnson)
-* doc: download GPG key from download.ceph.com (`issue#13603 <http://tracker.ceph.com/issues/13603>`_, `pr#6384 <http://github.com/ceph/ceph/pull/6384>`_, Ken Dreyer)
-* doc: draft notes for jewel (`pr#8211 <http://github.com/ceph/ceph/pull/8211>`_, Loic Dachary, Sage Weil)
-* doc: file must be empty when writing layout fields of file use "setfattr" (`pr#6848 <http://github.com/ceph/ceph/pull/6848>`_, Cilang Zhao)
-* doc: fix 0.94.4 and 0.94.5 ordering (`pr#7763 <http://github.com/ceph/ceph/pull/7763>`_, Loic Dachary)
-* doc: Fixed incorrect name of a "List Multipart Upload Parts" Response Entity (`issue#14003 <http://tracker.ceph.com/issues/14003>`_, `pr#6829 <http://github.com/ceph/ceph/pull/6829>`_, Lenz Grimmer)
-* doc: Fixes a CRUSH map step take argument (`pr#7327 <http://github.com/ceph/ceph/pull/7327>`_, Ivan Grcic)
-* doc: Fixes a spelling error (`pr#6705 <http://github.com/ceph/ceph/pull/6705>`_, Jeremy Qian)
-* doc: Fixes headline different font size and type (`pr#8328 <http://github.com/ceph/ceph/pull/8328>`_, scienceluo)
-* doc: fix gender neutrality (Alexandre Maragone)
-* doc: fixing image in section ERASURE CODING (`pr#7298 <http://github.com/ceph/ceph/pull/7298>`_, Rachana Patel)
-* doc: fix install doc (#10957 Kefu Chai)
-* doc: fix misleading configuration guide on cache tiering (`pr#7000 <http://github.com/ceph/ceph/pull/7000>`_, Yuan Zhou)
-* doc: fix "mon osd down out subtree limit" option name (`pr#7164 <http://github.com/ceph/ceph/pull/7164>`_, François Lafont)
-* doc: fix outdated content in cache tier (`pr#6272 <http://github.com/ceph/ceph/pull/6272>`_, Yuan Zhou)
-* doc: fix S3 C# example (`pr#7027 <http://github.com/ceph/ceph/pull/7027>`_, Dunrong Huang)
-* doc: fix sphinx issues (Kefu Chai)
-* doc: fix typo, duplicated content etc. for Jewel release notes (`pr#8342 <http://github.com/ceph/ceph/pull/8342>`_, xie xingguo)
-* doc: fix typo in cephfs/quota (`pr#6745 <http://github.com/ceph/ceph/pull/6745>`_, Drunkard Zhang)
-* doc: fix typo, indention etc. (`pr#7829 <http://github.com/ceph/ceph/pull/7829>`_, xie xingguo)
-* doc: fix typo in developer guide (`pr#6943 <http://github.com/ceph/ceph/pull/6943>`_, Nathan Cutler)
-* doc: fix typo (`pr#7004 <http://github.com/ceph/ceph/pull/7004>`_, tianqing)
-* doc: fix wrong type of hyphen (`pr#8252 <http://github.com/ceph/ceph/pull/8252>`_, xie xingguo)
-* doc: initial draft of RBD mirroring admin documentation (`issue#15041 <http://tracker.ceph.com/issues/15041>`_, `pr#8169 <http://github.com/ceph/ceph/pull/8169>`_, Jason Dillaman)
-* doc: INSTALL redirect to online documentation (`pr#6749 <http://github.com/ceph/ceph/pull/6749>`_, Loic Dachary)
-* doc: little improvements for troubleshooting scrub issues (`pr#6827 <http://github.com/ceph/ceph/pull/6827>`_, Mykola Golub)
-* doc: man page updates (Kefu Chai)
-* doc: mds data structure docs (Yan, Zheng)
-* doc: misc updates (Fracois Lafont, Ken Dreyer, Kefu Chai, Owen Synge, Gael Fenet-Garde, Loic Dachary, Yannick Atchy-Dalama, Jiaying Ren, Kevin Caradant, Robert Maxime, Nicolas Yong, Germain Chipaux, Arthur Gorjux, Gabriel Sentucq, Clement Lebrun, Jean-Remi Deveaux, Clair Massot, Robin Tang, Thomas Laumondais, Jordan Dorne, Yuan Zhou, Valentin Thomas, Pierre Chaumont, Benjamin Troquereau, Benjamin Sesia, Vikhyat Umrao, Nilamdyuti Goswami, Vartika Rai, Florian Haas, Loic Dachary, Simon Guinot, Andy Allan, Alistair Israel, Ken Dreyer, Robin Rehu, Lee Revell, Florian Marsylle, Thomas Johnson, Bosse Klykken, Travis Rhoden, Ian Kelling)
-* doc: Modified a note section in rbd-snapshot doc. (`pr#6908 <http://github.com/ceph/ceph/pull/6908>`_, Nilamdyuti Goswami)
-* doc: note that cephfs auth stuff is new in jewel (`pr#6858 <http://github.com/ceph/ceph/pull/6858>`_, John Spray)
-* doc: osd-config Add Configuration Options for op queue. (`pr#7837 <http://github.com/ceph/ceph/pull/7837>`_, Robert LeBlanc)
-* doc: osd: s/schedued/scheduled/ (`pr#6872 <http://github.com/ceph/ceph/pull/6872>`_, Loic Dachary)
-* doc/rados/api/librados-intro.rst: fix typo (`pr#7879 <http://github.com/ceph/ceph/pull/7879>`_, xie xingguo)
-* doc/rados/operations/crush: fix the formatting (`pr#8306 <http://github.com/ceph/ceph/pull/8306>`_, Kefu Chai)
-* doc: release-notes: draft v0.80.11 release notes (`pr#6374 <http://github.com/ceph/ceph/pull/6374>`_, Loic Dachary)
-* doc: release-notes: draft v10.0.0 release notes (`pr#6666 <http://github.com/ceph/ceph/pull/6666>`_, Loic Dachary)
-* doc/release-notes: fix indents (`pr#8345 <http://github.com/ceph/ceph/pull/8345>`_, Kefu Chai)
-* doc/release-notes: v9.1.0 (`pr#6281 <http://github.com/ceph/ceph/pull/6281>`_, Loic Dachary)
-* doc/releases-notes: fix build error (`pr#6483 <http://github.com/ceph/ceph/pull/6483>`_, Kefu Chai)
-* doc: Remove Ceph Monitors do lots of fsync() (`issue#15288 <http://tracker.ceph.com/issues/15288>`_, `pr#8327 <http://github.com/ceph/ceph/pull/8327>`_, Vikhyat Umrao)
-* doc: remove redundant space in ceph-authtool/monmaptool doc (`pr#7244 <http://github.com/ceph/ceph/pull/7244>`_, Jiaying Ren)
-* doc: remove toctree items under Create CephFS (`pr#6241 <http://github.com/ceph/ceph/pull/6241>`_, Jevon Qiao)
-* doc: remove unnecessary period in headline (`pr#6775 <http://github.com/ceph/ceph/pull/6775>`_, Marc Koderer)
-* doc: rename the "Create a Ceph User" section and add verbage about… (`issue#13502 <http://tracker.ceph.com/issues/13502>`_, `pr#6297 <http://github.com/ceph/ceph/pull/6297>`_, ritz303)
-* doc: revise SubmittingPatches (`pr#7292 <http://github.com/ceph/ceph/pull/7292>`_, Kefu Chai)
-* doc: rgw admin uses "region list" not "regions list" (`pr#8517 <http://github.com/ceph/ceph/pull/8517>`_, Kris Jurka)
-* doc: rgw explain keystone's verify ssl switch (`pr#7862 <http://github.com/ceph/ceph/pull/7862>`_, Abhishek Lekshmanan)
-* doc: rgw: port changes from downstream to upstream (`pr#7264 <http://github.com/ceph/ceph/pull/7264>`_, Bara Ancincova)
-* doc: rgw_region_root_pool option should be in [global] (`issue#15244 <http://tracker.ceph.com/issues/15244>`_, `pr#8271 <http://github.com/ceph/ceph/pull/8271>`_, Vikhyat Umrao)
-* doc: rst style fix for pools document (`pr#6816 <http://github.com/ceph/ceph/pull/6816>`_, Drunkard Zhang)
-* doc: script and guidelines for mirroring Ceph (`pr#7384 <http://github.com/ceph/ceph/pull/7384>`_, Wido den Hollander)
-* docs: Fix styling of newly added mirror docs (`pr#6127 <http://github.com/ceph/ceph/pull/6127>`_, Wido den Hollander)
-* doc: small fixes (`pr#7813 <http://github.com/ceph/ceph/pull/7813>`_, xiexingguo)
-* doc: standardize @param (not @parma, @parmam, @params) (`pr#7714 <http://github.com/ceph/ceph/pull/7714>`_, Nathan Cutler)
-* doc: SubmittingPatches: there is no next; only jewel (`pr#6811 <http://github.com/ceph/ceph/pull/6811>`_, Nathan Cutler)
-* doc: swift tempurls (#10184 Abhishek Lekshmanan)
-* doc: switch doxygen integration back to breathe (#6115 Kefu Chai)
-* doc, tests: update all http://ceph.com/ to download.ceph.com (`pr#6435 <http://github.com/ceph/ceph/pull/6435>`_, Alfredo Deza)
-* doc: Update ceph-disk manual page with new feature deactivate/destroy. (`pr#6637 <http://github.com/ceph/ceph/pull/6637>`_, Vicente Cheng)
-* doc: Updated CloudStack RBD documentation (`pr#8308 <http://github.com/ceph/ceph/pull/8308>`_, Wido den Hollander)
-* doc: update doc for with new pool settings (`pr#5951 <http://github.com/ceph/ceph/pull/5951>`_, Guang Yang)
-* doc: Updated the rados command man page to include the --run-name opt… (`issue#12899 <http://tracker.ceph.com/issues/12899>`_, `pr#5900 <http://github.com/ceph/ceph/pull/5900>`_, ritz303)
-* doc: update infernalis release notes (`pr#6575 <http://github.com/ceph/ceph/pull/6575>`_, vasukulkarni)
-* doc: Update list of admin/build-doc dependencies (`issue#14070 <http://tracker.ceph.com/issues/14070>`_, `pr#6934 <http://github.com/ceph/ceph/pull/6934>`_, Nathan Cutler)
-* doc: update radosgw-admin example (`pr#6256 <http://github.com/ceph/ceph/pull/6256>`_, YankunLi)
-* doc: update release schedule docs (Loic Dachary)
-* doc: update the OS recommendations for newer Ceph releases (`pr#6355 <http://github.com/ceph/ceph/pull/6355>`_, ritz303)
-* doc: use 'ceph auth get-or-create' for creating RGW keyring (`pr#6930 <http://github.com/ceph/ceph/pull/6930>`_, Wido den Hollander)
-* doc: very basic doc on mstart (`pr#8207 <http://github.com/ceph/ceph/pull/8207>`_, Abhishek Lekshmanan)
-* drop envz.h includes (`pr#6285 <http://github.com/ceph/ceph/pull/6285>`_, John Coyle)
-* erasure-code: cleanup (Kefu Chai)
-* erasure-code: improve tests (Loic Dachary)
-* erasure-code: shec: fix recovery bugs (Takanori Nakao, Shotaro Kawaguchi)
-* erasure-code: update ISA-L to 2.13 (Yuan Zhou)
-* fix FTBFS introduced by d0af316 (`pr#7792 <http://github.com/ceph/ceph/pull/7792>`_, Kefu Chai)
-* fix: use right init_flags to finish CephContext (`pr#6549 <http://github.com/ceph/ceph/pull/6549>`_, Yunchuan Wen)
-* fs: be more careful about the "mds setmap" command to prevent breakage (`issue#14380 <http://tracker.ceph.com/issues/14380>`_, `pr#7262 <http://github.com/ceph/ceph/pull/7262>`_, Yan, Zheng)
-* ghobject_t: use # instead of ! as a separator (`pr#8055 <http://github.com/ceph/ceph/pull/8055>`_, Sage Weil)
-* global: do not start two daemons with a single pid-file (`issue#13422 <http://tracker.ceph.com/issues/13422>`_, `pr#7075 <http://github.com/ceph/ceph/pull/7075>`_, shun song)
-* global: do not start two daemons with a single pid-file (part 2) (`issue#13422 <http://tracker.ceph.com/issues/13422>`_, `pr#7463 <http://github.com/ceph/ceph/pull/7463>`_, Loic Dachary)
-* global/global_init: expand metavariables in setuser_match_path (`issue#15365 <http://tracker.ceph.com/issues/15365>`_, `pr#8433 <http://github.com/ceph/ceph/pull/8433>`_, Sage Weil)
-* global/signal_handler: print thread name in signal handler (`pr#8177 <http://github.com/ceph/ceph/pull/8177>`_, Jianpeng Ma)
-* gmock: switch to submodule (Danny Al-Gaaf, Loic Dachary)
-* hadoop: add terasort test (Noah Watkins)
-* helgrind: additional race conditionslibrbd: journal replay should honor inter-event dependencies (`pr#7274 <http://github.com/ceph/ceph/pull/7274>`_, Jason Dillaman)
-* helgrind: fix real (and imaginary) race conditions (`issue#14163 <http://tracker.ceph.com/issues/14163>`_, `pr#7208 <http://github.com/ceph/ceph/pull/7208>`_, Jason Dillaman)
-* include/encoding: do not try to be clever with list encoding (`pr#7913 <http://github.com/ceph/ceph/pull/7913>`_, Sage Weil)
-* init-ceph: do umount when the path exists. (`pr#6866 <http://github.com/ceph/ceph/pull/6866>`_, Xiaoxi Chen)
-* init-ceph.in: allow case-insensitive true in `osd crush update on start' (`pr#7943 <http://github.com/ceph/ceph/pull/7943>`_, Eric Cook)
-* init-ceph.in: skip ceph-disk if it is not present (`issue#10587 <http://tracker.ceph.com/issues/10587>`_, `pr#7286 <http://github.com/ceph/ceph/pull/7286>`_, Ken Dreyer)
-* init-ceph: use getopt to make option processing more flexible (`issue#3015 <http://tracker.ceph.com/issues/3015>`_, `pr#6089 <http://github.com/ceph/ceph/pull/6089>`_, Nathan Cutler)
-* init-radosgw: merge with sysv version; fix enumeration (Sage Weil)
-* java: fix libcephfs bindings (Noah Watkins)
-* journal: async methods to (un)register and update client (`pr#7832 <http://github.com/ceph/ceph/pull/7832>`_, Mykola Golub)
-* journal: disconnect watch after watch error (`issue#14168 <http://tracker.ceph.com/issues/14168>`_, `pr#7113 <http://github.com/ceph/ceph/pull/7113>`_, Jason Dillaman)
-* journal: fire replay complete event after reading last object (`issue#13924 <http://tracker.ceph.com/issues/13924>`_, `pr#6762 <http://github.com/ceph/ceph/pull/6762>`_, Jason Dillaman)
-* journal: fix final result for JournalTrimmer::C_RemoveSet (`pr#8516 <http://github.com/ceph/ceph/pull/8516>`_, runsisi)
-* journal: fix race condition between Future and journal shutdown (`issue#15364 <http://tracker.ceph.com/issues/15364>`_, `pr#8477 <http://github.com/ceph/ceph/pull/8477>`_, Jason Dillaman)
-* journal: flush commit position on metadata shutdown (`pr#7385 <http://github.com/ceph/ceph/pull/7385>`_, Mykola Golub)
-* journal: improve commit position tracking (`pr#7776 <http://github.com/ceph/ceph/pull/7776>`_, Jason Dillaman)
-* journal: incremental improvements and fixes (`pr#6552 <http://github.com/ceph/ceph/pull/6552>`_, Mykola Golub)
-* journal: prevent race injecting new records into overflowed object (`issue#15202 <http://tracker.ceph.com/issues/15202>`_, `pr#8220 <http://github.com/ceph/ceph/pull/8220>`_, Jason Dillaman)
-* journal: reset commit_position_task_ctx pointer after task complete (`pr#7480 <http://github.com/ceph/ceph/pull/7480>`_, Mykola Golub)
-* journal: re-use common threads between journalers (`pr#7906 <http://github.com/ceph/ceph/pull/7906>`_, Jason Dillaman)
-* journal: support replaying beyond skipped splay objects (`pr#6687 <http://github.com/ceph/ceph/pull/6687>`_, Jason Dillaman)
-* krbd: remove deprecated --quiet param from udevadm (`issue#13560 <http://tracker.ceph.com/issues/13560>`_, `pr#6394 <http://github.com/ceph/ceph/pull/6394>`_, Jason Dillaman)
-* kv: fix bug in kv key optimization (`pr#6511 <http://github.com/ceph/ceph/pull/6511>`_, Sage Weil)
-* kv: implement value_as_ptr() and use it in .get() (`pr#7052 <http://github.com/ceph/ceph/pull/7052>`_, Piotr Dałek)
-* kv/KineticStore: fix broken split_key (`pr#6574 <http://github.com/ceph/ceph/pull/6574>`_, Haomai Wang)
-* kv: optimize and clean up internal key/value interface (`pr#6312 <http://github.com/ceph/ceph/pull/6312>`_, Piotr Dałek, Sage Weil)
-* libcephfs: add pread, pwrite (Jevon Qiao)
-* libcephfs,ceph-fuse: cache cleanup (Zheng Yan)
-* libcephfs,ceph-fuse: fix request resend on cap reconnect (#10912 Yan, Zheng)
-* libcephfs: fix python tests and fix getcwd on missing dir (`pr#7901 <http://github.com/ceph/ceph/pull/7901>`_, John Spray)
-* libcephfs: Improve portability by replacing loff_t type usage with off_t (`pr#6301 <http://github.com/ceph/ceph/pull/6301>`_, John Coyle)
-* libcephfs: only check file offset on glibc platforms (`pr#6288 <http://github.com/ceph/ceph/pull/6288>`_, John Coyle)
-* libcephfs: update LIBCEPHFS_VERSION to indicate the interface was changed (`pr#7551 <http://github.com/ceph/ceph/pull/7551>`_, Jevon Qiao)
-* librados: add config observer (Alistair Strachan)
-* librados: add c++ style osd/pg command interface (`pr#6893 <http://github.com/ceph/ceph/pull/6893>`_, Yunchuan Wen)
-* librados: add FULL_TRY and FULL_FORCE flags for dealing with full clusters or pools (Sage Weil)
-* librados: add src_fadvise_flags for copy-from (Jianpeng Ma)
-* librados: aix gcc librados port (`pr#6675 <http://github.com/ceph/ceph/pull/6675>`_, Rohan Mars)
-* librados: avoid malloc(0) (which can return NULL on some platforms) (`issue#13944 <http://tracker.ceph.com/issues/13944>`_, `pr#6779 <http://github.com/ceph/ceph/pull/6779>`_, Dan Mick)
-* librados: cancel aio notification linger op upon completion (`pr#8102 <http://github.com/ceph/ceph/pull/8102>`_, Jason Dillaman)
-* librados: check connection state in rados_monitor_log (`issue#14499 <http://tracker.ceph.com/issues/14499>`_, `pr#7350 <http://github.com/ceph/ceph/pull/7350>`_, David Disseldorp)
-* librados: clean up Objecter.h (`pr#6731 <http://github.com/ceph/ceph/pull/6731>`_, Jie Wang)
-* librados: define C++ flags from C constants (Josh Durgin)
-* librados: detect laggy ops with objecter_timeout, not osd_timeout (`pr#7629 <http://github.com/ceph/ceph/pull/7629>`_, Greg Farnum)
-* librados: do cleanup (`pr#6488 <http://github.com/ceph/ceph/pull/6488>`_, xie xingguo)
-* librados: do not clear handle for aio_watch() (`pr#7771 <http://github.com/ceph/ceph/pull/7771>`_, xie xingguo)
-* librados: fadvise flags per op (Jianpeng Ma)
-* librados: fix examples/librados/Makefile error. (`pr#6320 <http://github.com/ceph/ceph/pull/6320>`_, You Ji)
-* librados: fix last_force_resent handling (#11026 Jianpeng Ma)
-* librados: fix memory leak from C_TwoContexts (Xiong Yiliang)
-* librados: fix notify completion race (#13114 Sage Weil)
-* librados: fix pool alignment API overflow issue (`issue#13715 <http://tracker.ceph.com/issues/13715>`_, `pr#6489 <http://github.com/ceph/ceph/pull/6489>`_, xie xingguo)
-* librados: fix potential null pointer access when do pool_snap_list (`issue#13639 <http://tracker.ceph.com/issues/13639>`_, `pr#6422 <http://github.com/ceph/ceph/pull/6422>`_, xie xingguo)
-* librados: fix PromoteOn2ndRead test for EC (`pr#6373 <http://github.com/ceph/ceph/pull/6373>`_, Sage Weil)
-* librados: fix rare race where pool op callback may hang forever (`issue#13642 <http://tracker.ceph.com/issues/13642>`_, `pr#6426 <http://github.com/ceph/ceph/pull/6426>`_, xie xingguo)
-* librados: fix several flaws introduced by the enumeration_objects API (`issue#14299 <http://tracker.ceph.com/issues/14299>`_, `issue#14301 <http://tracker.ceph.com/issues/14301>`_, `issue#14300 <http://tracker.ceph.com/issues/14300>`_, `pr#7156 <http://github.com/ceph/ceph/pull/7156>`_, xie xingguo)
-* librados: fix striper when stripe_count = 1 and stripe_unit != object_size (#11120 Yan, Zheng)
-* librados: fix test failure with new aio watch/unwatch API  (`pr#7824 <http://github.com/ceph/ceph/pull/7824>`_, Jason Dillaman)
-* librados: implement async watch/unwatch (`pr#7649 <http://github.com/ceph/ceph/pull/7649>`_, Haomai Wang)
-* librados: include/rados/librados.h: fix typo (`pr#6741 <http://github.com/ceph/ceph/pull/6741>`_, Nathan Cutler)
-* librados: init crush_location from config file. (`issue#13473 <http://tracker.ceph.com/issues/13473>`_, `pr#6243 <http://github.com/ceph/ceph/pull/6243>`_, Wei Luo)
-* librados, libcephfs: randomize client nonces (Josh Durgin)
-* librados: mix lock cycle (un)registering asok commands (`pr#7581 <http://github.com/ceph/ceph/pull/7581>`_, John Spray)
-* librados: move to c++11 concurrency types (`pr#5931 <http://github.com/ceph/ceph/pull/5931>`_, Adam C. Emerson)
-* librados: new style (sharded) object listing (`pr#6405 <http://github.com/ceph/ceph/pull/6405>`_, John Spray, Sage Weil)
-* librados: op perf counters (John Spray)
-* librados: potential null pointer access in list_(n)objects (`issue#13822 <http://tracker.ceph.com/issues/13822>`_, `pr#6639 <http://github.com/ceph/ceph/pull/6639>`_, xie xingguo)
-* librados: pybind: fix binary omap values (Robin H. Johnson)
-* librados: pybind: fix write() method return code (Javier Guerra)
-* librados: race condition on aio_notify completion handling (`pr#7864 <http://github.com/ceph/ceph/pull/7864>`_, Jason Dillaman)
-* librados: remove duplicate definitions for rados pool_stat_t and cluster_stat_t (`pr#7330 <http://github.com/ceph/ceph/pull/7330>`_, Igor Fedotov)
-* librados: respect default_crush_ruleset on pool_create (#11640 Yuan Zhou)
-* librados: Revert "rados: Add new field flags for ceph_osd_op.copy_get." (`pr#8486 <http://github.com/ceph/ceph/pull/8486>`_, Sage Weil)
-* librados: shutdown finisher in a more graceful way (`pr#7519 <http://github.com/ceph/ceph/pull/7519>`_, xie xingguo)
-* librados: Solaris port (`pr#6416 <http://github.com/ceph/ceph/pull/6416>`_, Rohan Mars)
-* librados: stat2 with higher time precision (`pr#7915 <http://github.com/ceph/ceph/pull/7915>`_, Yehuda Sadeh, Matt Benjamin)
-* librados: Striper: Fix incorrect push_front -> append_zero change (`pr#7578 <http://github.com/ceph/ceph/pull/7578>`_, Haomai Wang)
-* libradosstriper: fix leak (Danny Al-Gaaf)
-* librados_test_stub: protect against notify/unwatch race (`pr#7540 <http://github.com/ceph/ceph/pull/7540>`_, Jason Dillaman)
-* librados: wrongly passed in argument for stat command (`issue#13703 <http://tracker.ceph.com/issues/13703>`_, `pr#6476 <http://github.com/ceph/ceph/pull/6476>`_, xie xingguo)
-* librbd: add const for single-client-only features (Josh Durgin)
-* librbd: add deep-flatten operation (Jason Dillaman)
-* librbd: add purge_on_error cache behavior (Jianpeng Ma)
-* librbd: allocate new journal tag after acquiring exclusive lock (`pr#7884 <http://github.com/ceph/ceph/pull/7884>`_, Jason Dillaman)
-* librbd: allow additional metadata to be stored with the image (Haomai Wang)
-* librbd: API: async open and close (`issue#14264 <http://tracker.ceph.com/issues/14264>`_, `pr#7259 <http://github.com/ceph/ceph/pull/7259>`_, Mykola Golub)
-* librbd: automatically flush IO after blocking write operations (`issue#13913 <http://tracker.ceph.com/issues/13913>`_, `pr#6742 <http://github.com/ceph/ceph/pull/6742>`_, Jason Dillaman)
-* librbd: avoid blocking aio API methods (#11056 Jason Dillaman)
-* librbd: Avoid create two threads per image (`pr#7400 <http://github.com/ceph/ceph/pull/7400>`_, Haomai Wang)
-* librbd: avoid throwing error if mirroring is unsupported (`pr#8417 <http://github.com/ceph/ceph/pull/8417>`_, Jason Dillaman)
-* librbd: better handling for dup flatten requests (#11370 Jason Dillaman)
-* librbd: better handling of exclusive lock transition period (`pr#7204 <http://github.com/ceph/ceph/pull/7204>`_, Jason Dillaman)
-* librbd: block maintenance ops until after journal is ready (`issue#14510 <http://tracker.ceph.com/issues/14510>`_, `pr#7382 <http://github.com/ceph/ceph/pull/7382>`_, Jason Dillaman)
-* librbd: block read requests until journal replayed (`pr#7627 <http://github.com/ceph/ceph/pull/7627>`_, Jason Dillaman)
-* librbd: cancel in-flight ops on watch error (#11363 Jason Dillaman)
-* librbd: check for presence of journal before attempting to remove  (`issue#13912 <http://tracker.ceph.com/issues/13912>`_, `pr#6737 <http://github.com/ceph/ceph/pull/6737>`_, Jason Dillaman)
-* librbd: clear error when older OSD doesn't support image flags (`issue#14122 <http://tracker.ceph.com/issues/14122>`_, `pr#7035 <http://github.com/ceph/ceph/pull/7035>`_, Jason Dillaman)
-* librbd: correct include guard in RenameRequest.h (`pr#7143 <http://github.com/ceph/ceph/pull/7143>`_, Jason Dillaman)
-* librbd: correct issues discovered during teuthology testing (`issue#14108 <http://tracker.ceph.com/issues/14108>`_, `issue#14107 <http://tracker.ceph.com/issues/14107>`_, `pr#6974 <http://github.com/ceph/ceph/pull/6974>`_, Jason Dillaman)
-* librbd: correct issues discovered via valgrind memcheck (`pr#8132 <http://github.com/ceph/ceph/pull/8132>`_, Jason Dillaman)
-* librbd: correct issues discovered when cache is disabled (`issue#14123 <http://tracker.ceph.com/issues/14123>`_, `pr#6979 <http://github.com/ceph/ceph/pull/6979>`_, Jason Dillaman)
-* librbd: correct race conditions discovered during unit testing (`issue#14060 <http://tracker.ceph.com/issues/14060>`_, `pr#6923 <http://github.com/ceph/ceph/pull/6923>`_, Jason Dillaman)
-* librbd: deadlock while attempting to flush AIO requests (`issue#13726 <http://tracker.ceph.com/issues/13726>`_, `pr#6508 <http://github.com/ceph/ceph/pull/6508>`_, Jason Dillaman)
-* librbd: default new images to format 2 (#11348 Jason Dillaman)
-* librbd: differentiate journal replay flush vs shut down (`pr#7698 <http://github.com/ceph/ceph/pull/7698>`_, Jason Dillaman)
-* librbd: disable copy-on-read when not exclusive lock owner (`issue#14167 <http://tracker.ceph.com/issues/14167>`_, `pr#7129 <http://github.com/ceph/ceph/pull/7129>`_, Jason Dillaman)
-* librbd: disable image mirroring when image is removed (`issue#15265 <http://tracker.ceph.com/issues/15265>`_, `pr#8375 <http://github.com/ceph/ceph/pull/8375>`_, Ricardo Dias)
-* librbd: disallow unsafe rbd_op_threads values (`issue#15034 <http://tracker.ceph.com/issues/15034>`_, `pr#8459 <http://github.com/ceph/ceph/pull/8459>`_, Josh Durgin)
-* librbd: do not ignore self-managed snapshot release result (`issue#14170 <http://tracker.ceph.com/issues/14170>`_, `pr#7043 <http://github.com/ceph/ceph/pull/7043>`_, Jason Dillaman)
-* librbd: enable/disable image mirroring automatically for pool mode (`issue#15143 <http://tracker.ceph.com/issues/15143>`_, `pr#8204 <http://github.com/ceph/ceph/pull/8204>`_, Ricardo Dias)
-* librbd: ensure copy-on-read requests are complete prior to closing parent image  (`pr#6740 <http://github.com/ceph/ceph/pull/6740>`_, Jason Dillaman)
-* librbd: ensure librados callbacks are flushed prior to destroying (`issue#14092 <http://tracker.ceph.com/issues/14092>`_, `pr#7040 <http://github.com/ceph/ceph/pull/7040>`_, Jason Dillaman)
-* librbd: exit if parent's snap is gone during clone (`issue#14118 <http://tracker.ceph.com/issues/14118>`_, `pr#6968 <http://github.com/ceph/ceph/pull/6968>`_, xie xingguo)
-* librbd: fadvise for copy, export, import (Jianpeng Ma)
-* librbd: fast diff implementation that leverages object map (Jason Dillaman)
-* librbd: fix enable objectmap feature issue (`issue#13558 <http://tracker.ceph.com/issues/13558>`_, `pr#6339 <http://github.com/ceph/ceph/pull/6339>`_, xinxin shu)
-* librbd: fix fast diff bugs (#11553 Jason Dillaman)
-* librbd: fix image format detection (Zhiqiang Wang)
-* librbd: fix internal handling of dynamic feature updates (`pr#7299 <http://github.com/ceph/ceph/pull/7299>`_, Jason Dillaman)
-* librbd: fix journal iohint (`pr#6917 <http://github.com/ceph/ceph/pull/6917>`_, Jianpeng Ma)
-* librbd: fix known test case race condition failures (`issue#13969 <http://tracker.ceph.com/issues/13969>`_, `pr#6800 <http://github.com/ceph/ceph/pull/6800>`_, Jason Dillaman)
-* librbd: fix lock ordering issue (#11577 Jason Dillaman)
-* librbd: fix merge-diff for >2GB diff-files (`issue#14030 <http://tracker.ceph.com/issues/14030>`_, `pr#6889 <http://github.com/ceph/ceph/pull/6889>`_, Yunchuan Wen)
-* librbd: fix potential memory leak (`issue#14332 <http://tracker.ceph.com/issues/14332>`_, `issue#14333 <http://tracker.ceph.com/issues/14333>`_, `pr#7174 <http://github.com/ceph/ceph/pull/7174>`_, xie xingguo)
-* librbd: fix reads larger than the cache size (Lu Shi)
-* librbd: fix snap_exists API return code overflow (`issue#14129 <http://tracker.ceph.com/issues/14129>`_, `pr#6986 <http://github.com/ceph/ceph/pull/6986>`_, xie xingguo)
-* librbd: fix snapshot creation when other snap is active (#11475 Jason Dillaman)
-* librbd: fix state machine race conditions during shut down (`pr#7761 <http://github.com/ceph/ceph/pull/7761>`_, Jason Dillaman)
-* librbd: fix test case race condition for journaling ops (`pr#6877 <http://github.com/ceph/ceph/pull/6877>`_, Jason Dillaman)
-* librbd: fix tracepoint parameter in diff_iterate (`pr#6892 <http://github.com/ceph/ceph/pull/6892>`_, Yunchuan Wen)
-* librbd: flatten/copyup fixes (Jason Dillaman)
-* librbd: flush and invalidate cache via admin socket (`issue#2468 <http://tracker.ceph.com/issues/2468>`_, `pr#6453 <http://github.com/ceph/ceph/pull/6453>`_, Mykola Golub)
-* librbd: handle NOCACHE fadvise flag (Jinapeng Ma)
-* librbd: handle unregistering the image watcher when disconnected (`pr#8094 <http://github.com/ceph/ceph/pull/8094>`_, Jason Dillaman)
-* librbd: image refresh code paths converted to async state machines (`pr#6859 <http://github.com/ceph/ceph/pull/6859>`_, Jason Dillaman)
-* librbd: include missing header for bool type (`pr#6798 <http://github.com/ceph/ceph/pull/6798>`_, Mykola Golub)
-* librbd: initial collection of state machine unit tests (`pr#6703 <http://github.com/ceph/ceph/pull/6703>`_, Jason Dillaman)
-* librbd: integrate journaling for maintenance operations (`pr#6625 <http://github.com/ceph/ceph/pull/6625>`_, Jason Dillaman)
-* librbd: integrate journaling support for IO operations (`pr#6541 <http://github.com/ceph/ceph/pull/6541>`_, Jason Dillaman)
-* librbd: integrate journal replay with fsx testing (`pr#7583 <http://github.com/ceph/ceph/pull/7583>`_, Jason Dillaman)
-* librbd: journal framework for tracking exclusive lock transitions (`issue#13298 <http://tracker.ceph.com/issues/13298>`_, `pr#7529 <http://github.com/ceph/ceph/pull/7529>`_, Jason Dillaman)
-* librbd: journaling-related lock dependency cleanup (`pr#6777 <http://github.com/ceph/ceph/pull/6777>`_, Jason Dillaman)
-* librbd: journal replay needs to support re-executing maintenance ops (`issue#14822 <http://tracker.ceph.com/issues/14822>`_, `pr#7785 <http://github.com/ceph/ceph/pull/7785>`_, Jason Dillaman)
-* librbd: journal replay should honor inter-event dependencies (`pr#7019 <http://github.com/ceph/ceph/pull/7019>`_, Jason Dillaman)
-* librbd: journal shut down flush race condition (`issue#14434 <http://tracker.ceph.com/issues/14434>`_, `pr#7302 <http://github.com/ceph/ceph/pull/7302>`_, Jason Dillaman)
-* librbd: lockdep, helgrind validation (Jason Dillaman, Josh Durgin)
-* librbd: metadata filter fixes (Haomai Wang)
-* librbd: misc aio fixes (#5488 Jason Dillaman)
-* librbd: misc rbd fixes (#11478 #11113 #11342 #11380 Jason Dillaman, Zhiqiang Wang)
-* librbd: new diff_iterate2 API (Jason Dillaman)
-* librbd: not necessary to hold owner_lock while releasing snap id (`issue#13914 <http://tracker.ceph.com/issues/13914>`_, `pr#6736 <http://github.com/ceph/ceph/pull/6736>`_, Jason Dillaman)
-* librbd: object map rebuild support (Jason Dillaman)
-* librbd: only send signal when AIO completions queue empty (`pr#6729 <http://github.com/ceph/ceph/pull/6729>`_, Jianpeng Ma)
-* librbd: only update image flags while hold exclusive lock (#11791 Jason Dillaman)
-* librbd: optionally disable allocation hint (Haomai Wang)
-* librbd: optionally validate new RBD pools for snapshot support (`issue#13633 <http://tracker.ceph.com/issues/13633>`_, `pr#6925 <http://github.com/ceph/ceph/pull/6925>`_, Jason Dillaman)
-* librbd: partial revert of commit 9b0e359 (`issue#13969 <http://tracker.ceph.com/issues/13969>`_, `pr#6789 <http://github.com/ceph/ceph/pull/6789>`_, Jason Dillaman)
-* librbd: perf counters might not be initialized on error (`issue#13740 <http://tracker.ceph.com/issues/13740>`_, `pr#6523 <http://github.com/ceph/ceph/pull/6523>`_, Jason Dillaman)
-* librbd: perf section name: use hyphen to separate components (`issue#13719 <http://tracker.ceph.com/issues/13719>`_, `pr#6516 <http://github.com/ceph/ceph/pull/6516>`_, Mykola Golub)
-* librbd: prevent race between resize requests (#12664 Jason Dillaman)
-* librbd: properly handle replay of snap remove RPC message (`issue#14164 <http://tracker.ceph.com/issues/14164>`_, `pr#7042 <http://github.com/ceph/ceph/pull/7042>`_, Jason Dillaman)
-* librbd: readahead fixes (Zhiqiang Wang)
-* librbd: reduce mem copies to user-buffer during read (`pr#7548 <http://github.com/ceph/ceph/pull/7548>`_, Jianpeng Ma)
-* librbd: reduce verbosity of common error condition logging (`issue#14234 <http://tracker.ceph.com/issues/14234>`_, `pr#7114 <http://github.com/ceph/ceph/pull/7114>`_, Jason Dillaman)
-* librbd: refresh image if required before replaying journal ops (`issue#14908 <http://tracker.ceph.com/issues/14908>`_, `pr#7978 <http://github.com/ceph/ceph/pull/7978>`_, Jason Dillaman)
-* librbd: remove canceled tasks from timer thread (`issue#14476 <http://tracker.ceph.com/issues/14476>`_, `pr#7329 <http://github.com/ceph/ceph/pull/7329>`_, Douglas Fuller)
-* librbd: remove duplicate read_only test in librbd::async_flatten (`pr#5856 <http://github.com/ceph/ceph/pull/5856>`_, runsisi)
-* librbd: remove last synchronous librados calls from open/close state machine (`pr#7839 <http://github.com/ceph/ceph/pull/7839>`_, Jason Dillaman)
-* librbd: replaying a journal op post-refresh requires locking (`pr#8028 <http://github.com/ceph/ceph/pull/8028>`_, Jason Dillaman)
-* librbd: resize should only update image size within header (`issue#13674 <http://tracker.ceph.com/issues/13674>`_, `pr#6447 <http://github.com/ceph/ceph/pull/6447>`_, Jason Dillaman)
-* librbd: retrieve image name when opening by id (`pr#7736 <http://github.com/ceph/ceph/pull/7736>`_, Mykola Golub)
-* librbd: return error if we fail to delete object_map head object (`issue#14098 <http://tracker.ceph.com/issues/14098>`_, `pr#6958 <http://github.com/ceph/ceph/pull/6958>`_, xie xingguo)
-* librbd: return result code from close (#12069 Jason Dillaman)
-* librbd: Revert "librbd: use task finisher per CephContext" (`issue#14780 <http://tracker.ceph.com/issues/14780>`_, `pr#7667 <http://github.com/ceph/ceph/pull/7667>`_, Josh Durgin)
-* librbd: send notifications for mirroring status updates (`pr#8355 <http://github.com/ceph/ceph/pull/8355>`_, Jason Dillaman)
-* librbd: several race conditions discovered under single CPU environment (`pr#7653 <http://github.com/ceph/ceph/pull/7653>`_, Jason Dillaman)
-* librbd: simplify IO method signatures for 32bit environments (`pr#6700 <http://github.com/ceph/ceph/pull/6700>`_, Jason Dillaman)
-* librbd: small fixes for error messages and readahead counter (`issue#14127 <http://tracker.ceph.com/issues/14127>`_, `pr#6983 <http://github.com/ceph/ceph/pull/6983>`_, xie xingguo)
-* librbd: start perf counters after id is initialized (`issue#13720 <http://tracker.ceph.com/issues/13720>`_, `pr#6494 <http://github.com/ceph/ceph/pull/6494>`_, Mykola Golub)
-* librbd: store metadata, including config options, in image (Haomai Wang)
-* librbd: support eventfd for AIO completion notifications (`pr#5465 <http://github.com/ceph/ceph/pull/5465>`_, Haomai Wang)
-* librbd: tolerate old osds when getting image metadata (#11549 Jason Dillaman)
-* librbd: truncate does not need to mark the object as existing in the object map (`issue#14789 <http://tracker.ceph.com/issues/14789>`_, `pr#7772 <http://github.com/ceph/ceph/pull/7772>`_, xinxin shu)
-* librbd: uninitialized state in snap remove state machine (`pr#6982 <http://github.com/ceph/ceph/pull/6982>`_, Jason Dillaman)
-* librbd: update of mirror pool mode and mirror peer handling (`pr#7718 <http://github.com/ceph/ceph/pull/7718>`_, Jason Dillaman)
-* librbd: use async librados notifications (`pr#7668 <http://github.com/ceph/ceph/pull/7668>`_, Jason Dillaman)
-* librbd: use write_full when possible (Zhiqiang Wang)
-* log: do not repeat errors to stderr (`issue#14616 <http://tracker.ceph.com/issues/14616>`_, `pr#7983 <http://github.com/ceph/ceph/pull/7983>`_, Sage Weil)
-* log: fix data corruption race resulting from log rotation (#12465 Samuel Just)
-* log: fix stack overflow when flushing large log lines (`issue#14707 <http://tracker.ceph.com/issues/14707>`_, `pr#7599 <http://github.com/ceph/ceph/pull/7599>`_, Igor Fedotov)
-* logrotate.d: prefer service over invoke-rc.d (#11330 Win Hierman, Sage Weil)
-* log: segv in a portable way (`issue#14856 <http://tracker.ceph.com/issues/14856>`_, `pr#7790 <http://github.com/ceph/ceph/pull/7790>`_, Kefu Chai)
-* log: use delete[] (`pr#7904 <http://github.com/ceph/ceph/pull/7904>`_, Sage Weil)
-* mailmap: add UMCloud affiliation (`pr#6820 <http://github.com/ceph/ceph/pull/6820>`_, Jiaying Ren)
-* mailmap for 10.0.4 (`pr#7932 <http://github.com/ceph/ceph/pull/7932>`_, Abhishek Lekshmanan)
-* mailmap: hange organization for Dongmao Zhang (`pr#7173 <http://github.com/ceph/ceph/pull/7173>`_, Dongmao Zhang)
-* mailmap: Igor Podoski affiliation (`pr#7219 <http://github.com/ceph/ceph/pull/7219>`_, Igor Podoski)
-* mailmap: Jewel updates (`pr#6750 <http://github.com/ceph/ceph/pull/6750>`_, Abhishek Lekshmanan)
-* mailmap: modify member info  (`pr#6468 <http://github.com/ceph/ceph/pull/6468>`_, Xiaowei Chen)
-* mailmap: revise organization (`pr#6519 <http://github.com/ceph/ceph/pull/6519>`_, Li Wang)
-* mailmap: Ubuntu Kylin name changed to Kylin Cloud (`pr#6532 <http://github.com/ceph/ceph/pull/6532>`_, Loic Dachary)
-* mailmap: update .organizationmap (`pr#6565 <http://github.com/ceph/ceph/pull/6565>`_, chenji-kael)
-* mailmap update (`pr#7210 <http://github.com/ceph/ceph/pull/7210>`_, M Ranga Swami Reddy)
-* mailmap update (`pr#8522 <http://github.com/ceph/ceph/pull/8522>`_, M Ranga Swami Reddy)
-* mailmap: updates for infernalis. (`pr#6495 <http://github.com/ceph/ceph/pull/6495>`_, Yann Dupont)
-* mailmap: updates (`pr#6258 <http://github.com/ceph/ceph/pull/6258>`_, M Ranga Swami Reddy)
-* mailmap: updates (`pr#6594 <http://github.com/ceph/ceph/pull/6594>`_, chenji-kael)
-* mailmap updates (`pr#6992 <http://github.com/ceph/ceph/pull/6992>`_, Loic Dachary)
-* mailmap updates (`pr#7189 <http://github.com/ceph/ceph/pull/7189>`_, Loic Dachary)
-* mailmap updates (`pr#7528 <http://github.com/ceph/ceph/pull/7528>`_, Yann Dupont)
-* mailmap updates (`pr#8256 <http://github.com/ceph/ceph/pull/8256>`_, Loic Dachary)
-* mailmap: Xie Xingguo affiliation (`pr#6409 <http://github.com/ceph/ceph/pull/6409>`_, Loic Dachary)
-* Makefile-env.am: set a default for CEPH_BUILD_VIRTUALENV (part 2) (`pr#8320 <http://github.com/ceph/ceph/pull/8320>`_, Loic Dachary)
-* makefile: fix rbdmap manpage (`pr#8310 <http://github.com/ceph/ceph/pull/8310>`_, Kefu Chai)
-* makefile: remove libedit from libclient.la (`pr#7284 <http://github.com/ceph/ceph/pull/7284>`_, Kefu Chai)
-* makefiles: remove bz2-dev from dependencies (`issue#13981 <http://tracker.ceph.com/issues/13981>`_, `pr#6939 <http://github.com/ceph/ceph/pull/6939>`_, Piotr Dałek)
-* man/8/ceph-disk: fix formatting issue (`pr#8003 <http://github.com/ceph/ceph/pull/8003>`_, Sage Weil)
-* man/8/ceph-disk: fix formatting issue (`pr#8012 <http://github.com/ceph/ceph/pull/8012>`_, Sage Weil)
-* man: document listwatchers cmd in "rados" manpage (`pr#7021 <http://github.com/ceph/ceph/pull/7021>`_, Kefu Chai)
-* mdsa: A few more snapshot fixes, mostly around snapshotted inode/dentry tracking (`pr#7798 <http://github.com/ceph/ceph/pull/7798>`_, Yan, Zheng)
-* mds: Add cmapv to ESessions default constructor initializer list (`pr#8403 <http://github.com/ceph/ceph/pull/8403>`_, John Coyle)
-* mds: add 'damaged' state to MDSMap (John Spray)
-* mds: add nicknames for perfcounters (John Spray)
-* mds: add 'p' flag in auth caps to control setting pool in layout (`pr#6567 <http://github.com/ceph/ceph/pull/6567>`_, John Spray)
-* mds: advance clientreplay when replying (`issue#14357 <http://tracker.ceph.com/issues/14357>`_, `pr#7216 <http://github.com/ceph/ceph/pull/7216>`_, John Spray)
-* mds: allow client to request caps when opening file (`issue#14360 <http://tracker.ceph.com/issues/14360>`_, `pr#7952 <http://github.com/ceph/ceph/pull/7952>`_, Yan, Zheng)
-* mds: avoid emitting cap warnigns before evicting session (John Spray)
-* mds: avoid getting stuck in XLOCKDONE (#11254 Yan, Zheng)
-* mds, client: add namespace to file_layout_t (previously ceph_file_layout) (`pr#7098 <http://github.com/ceph/ceph/pull/7098>`_, Yan, Zheng, Sage Weil)
-* mds, client: fix locking around handle_conf_change (`issue#14365 <http://tracker.ceph.com/issues/14365>`_, `issue#14374 <http://tracker.ceph.com/issues/14374>`_, `pr#7312 <http://github.com/ceph/ceph/pull/7312>`_, John Spray)
-* mds: disable problematic rstat propagation into snap parents (Yan, Zheng)
-* mds: do not add snapped items to bloom filter (Yan, Zheng)
-* mds: don't double-shutdown the timer when suiciding (`issue#14697 <http://tracker.ceph.com/issues/14697>`_, `pr#7616 <http://github.com/ceph/ceph/pull/7616>`_, Greg Farnum)
-* mds: expose frags via asok (John Spray)
-* mds: expose state of recovery to status ASOK command (`issue#14146 <http://tracker.ceph.com/issues/14146>`_, `pr#7068 <http://github.com/ceph/ceph/pull/7068>`_, Yan, Zheng)
-* mds: Extend the existing pool access checking to include specific RADOS namespacse. (`pr#8444 <https://github.com/ceph/ceph/pull/8444>`_, Yan, Zheng)
-* mds: filelock deadlock (`pr#7713 <http://github.com/ceph/ceph/pull/7713>`_, Yan, Zheng)
-* mds: fix client capabilities during reconnect (client.XXXX isn't responding to mclientcaps(revoke)) (`issue#11482 <http://tracker.ceph.com/issues/11482>`_, `pr#6432 <http://github.com/ceph/ceph/pull/6432>`_, Yan, Zheng)
-* mds: fix client cap/message replay order on restart (`issue#14254 <http://tracker.ceph.com/issues/14254>`_, `issue#13546 <http://tracker.ceph.com/issues/13546>`_, `pr#7199 <http://github.com/ceph/ceph/pull/7199>`_, Yan, Zheng)
-* mds: fix expected holes in journal objects (#13167 Yan, Zheng)
-* mds: fix file_layout_t legacy encoding snafu (`pr#8455 <http://github.com/ceph/ceph/pull/8455>`_, Sage Weil)
-* mds: fix fsmap decode (`pr#8063 <http://github.com/ceph/ceph/pull/8063>`_, Greg Farnum)
-* mds: fix FSMap upgrade with daemons in the map (`pr#8073 <http://github.com/ceph/ceph/pull/8073>`_, John Spray, Greg Farnum)
-* mds: fix handling for missing mydir dirfrag (#11641 John Spray)
-* mds: fix inode_t::compare() (`issue#15038 <http://tracker.ceph.com/issues/15038>`_, `pr#8014 <http://github.com/ceph/ceph/pull/8014>`_, Yan, Zheng)
-* mds: fix integer truncateion on large client ids (Henry Chang)
-* mds: fix mydir replica issue with shutdown (#10743 John Spray)
-* mds: fix out-of-order messages (#11258 Yan, Zheng)
-* mds: fix rejoin (Yan, Zheng)
-* mds: fix scrub_path (`pr#6684 <http://github.com/ceph/ceph/pull/6684>`_, John Spray)
-* mds: fix setting entire file layout in one setxattr (John Spray)
-* mds: fix setvxattr (broken in a536d114) (`issue#14029 <http://tracker.ceph.com/issues/14029>`_, `pr#6941 <http://github.com/ceph/ceph/pull/6941>`_, John Spray)
-* mds: fix shutdown (John Spray)
-* mds: fix shutdown with strays (#10744 John Spray)
-* mds: fix SnapServer crash on deleted pool (John Spray)
-* mds: fix snapshot bugs (Yan, Zheng)
-* mds: fix standby replay thread creation (`issue#14144 <http://tracker.ceph.com/issues/14144>`_, `pr#7132 <http://github.com/ceph/ceph/pull/7132>`_, John Spray)
-* mds: fix stray handling (John Spray)
-* mds: fix stray purging in 'stripe_count > 1' case (`issue#15050 <http://tracker.ceph.com/issues/15050>`_, `pr#8040 <http://github.com/ceph/ceph/pull/8040>`_, Yan, Zheng)
-* mds: fix stray reintegration (Yan, Zheng)
-* mds: fix suicide beacon (John Spray)
-* mds: flush immediately in do_open_truncate (#11011 John Spray)
-* mds: function parameter 'df' should be passed by reference (`pr#7490 <http://github.com/ceph/ceph/pull/7490>`_, Na Xie)
-* mds: handle misc corruption issues (John Spray)
-* mds: implement snapshot rename (`pr#5645 <http://github.com/ceph/ceph/pull/5645>`_, xinxin shu)
-* mds: improve dump methods (John Spray)
-* mds: judgment added to avoid the risk of visiting the NULL pointer (`pr#7358 <http://github.com/ceph/ceph/pull/7358>`_, Kongming Wu)
-* mds: many fixes (Yan, Zheng, John Spray, Greg Farnum)
-* mds: many snapshot and stray fixes (Yan, Zheng)
-* mds: messages/MOSDOp: cast in assert to eliminate warnings (`issue#13625 <http://tracker.ceph.com/issues/13625>`_, `pr#6414 <http://github.com/ceph/ceph/pull/6414>`_, David Zafman)
-* mds: misc fixes (Jianpeng Ma, Dan van der Ster, Zhang Zhi)
-* mds: misc journal cleanups and fixes (#10368 John Spray)
-* mds: misc repair improvements (John Spray)
-* mds: misc snap fixes (Zheng Yan)
-* mds: misc snapshot fixes (Yan, Zheng)
-* mds: Multi-filesystem support (`issue#14952 <http://tracker.ceph.com/issues/14952>`_, `pr#6953 <http://github.com/ceph/ceph/pull/6953>`_, John Spray, Sage Weil)
-* mds: new filtered MDS tell commands for sessions (`pr#6180 <http://github.com/ceph/ceph/pull/6180>`_, John Spray)
-* mds: new SessionMap storage using omap (#10649 John Spray)
-* mds: persist completed_requests reliably (#11048 John Spray)
-* mds: properly set STATE_STRAY/STATE_ORPHAN for stray dentry/inode (`issue#13777 <http://tracker.ceph.com/issues/13777>`_, `pr#6553 <http://github.com/ceph/ceph/pull/6553>`_, Yan, Zheng)
-* mds: Protect a number of unstable/experimental features behind durable flags (`pr#8383 <https://github.com/ceph/ceph/pull/8383>`_, Greg Farnum)
-* mds: reduce memory consumption (Yan, Zheng)
-* mds: repair the command option "--hot-standby" (`pr#6454 <http://github.com/ceph/ceph/pull/6454>`_, Wei Feng)
-* mds: respawn instead of suicide on blacklist (John Spray)
-* mds: ScrubStack and "tag path" command (`pr#5662 <http://github.com/ceph/ceph/pull/5662>`_, Yan, Zheng, John Spray, Greg Farnum)
-* mds: separate safe_pos in Journaler (#10368 John Spray)
-* mds/Session: use projected parent for auth path check (`issue#13364 <http://tracker.ceph.com/issues/13364>`_, `pr#6200 <http://github.com/ceph/ceph/pull/6200>`_, Sage Weil)
-* mds: snapshot rename support (#3645 Yan, Zheng)
-* mds: store layout on header object (#4161 John Spray)
-* mds: tear down connections from `tell` commands (`issue#14048 <http://tracker.ceph.com/issues/14048>`_, `pr#6933 <http://github.com/ceph/ceph/pull/6933>`_, John Spray)
-* mds: throttle purge stray operations (#10390 John Spray)
-* mds: tolerate clock jumping backwards (#11053 Yan, Zheng)
-* mds: warn when clients fail to advance oldest_client_tid (#10657 Yan, Zheng)
-* mds: we should wait messenger when MDSDaemon suicide (`pr#6996 <http://github.com/ceph/ceph/pull/6996>`_, Wei Feng)
-* messages/MOSDOp: clear reqid inc for v6 encoding (`issue#15230 <http://tracker.ceph.com/issues/15230>`_, `pr#8299 <http://github.com/ceph/ceph/pull/8299>`_, Sage Weil)
-* Minor fixes around data scan in some scenarios (`pr#8115 <http://github.com/ceph/ceph/pull/8115>`_, Yan, Zheng)
-* mirrors: Change contact e-mail address for se.ceph.com (`pr#8007 <http://github.com/ceph/ceph/pull/8007>`_, Wido den Hollander)
-* mirrors: Updated scripts and documentation for mirrors (`pr#7847 <http://github.com/ceph/ceph/pull/7847>`_, Wido den Hollander)
-* misc cleanups and fixes (Danny Al-Gaaf)
-* misc coverity fixes (Danny Al-Gaaf)
-* misc performance and cleanup (Nathan Cutler, Xinxin Shu)
-* misc: use make_shared while creating shared_ptr (`pr#7769 <http://github.com/ceph/ceph/pull/7769>`_, Somnath Roy)
-* mon: add an independent option for max election time (`pr#7245 <http://github.com/ceph/ceph/pull/7245>`_, Sangdi Xu)
-* mon: add cache over MonitorDBStore (Kefu Chai)
-* mon: add 'mon_metadata <id>' command (Kefu Chai)
-* mon: add 'node ls ...' command (Kefu Chai)
-* mon: add NOFORWARD, OBSOLETE, DEPRECATE flags for mon commands (Joao Eduardo Luis)
-* mon: add `osd blacklist clear` (`pr#6945 <http://github.com/ceph/ceph/pull/6945>`_, John Spray)
-* mon: add PG count to 'ceph osd df' output (Michal Jarzabek)
-* mon: add RAW USED column to ceph df detail (`pr#7087 <http://github.com/ceph/ceph/pull/7087>`_, Ruifeng Yang)
-* mon: block 'ceph osd pg-temp ...' if pg_temp update is already pending (`pr#6704 <http://github.com/ceph/ceph/pull/6704>`_, Sage Weil)
-* mon: 'ceph osd metadata' can dump all osds (Haomai Wang)
-* mon: clean up, reorg some mon commands (Joao Eduardo Luis)
-* mon: cleanup set-quota error msg (`pr#7371 <http://github.com/ceph/ceph/pull/7371>`_, Abhishek Lekshmanan)
-* monclient: avoid key renew storm on clock skew (`issue#12065 <http://tracker.ceph.com/issues/12065>`_, `pr#8258 <http://github.com/ceph/ceph/pull/8258>`_, Alexey Sheplyakov)
-* monclient: flush_log (John Spray)
-* mon: compact full epochs also (`issue#14537 <http://tracker.ceph.com/issues/14537>`_, `pr#7396 <http://github.com/ceph/ceph/pull/7396>`_, Kefu Chai)
-* mon: consider pool size when creating pool (`issue#14509 <http://tracker.ceph.com/issues/14509>`_, `pr#7359 <http://github.com/ceph/ceph/pull/7359>`_, songbaisen)
-* mon: consider the pool size when setting pool crush rule (`issue#14495 <http://tracker.ceph.com/issues/14495>`_, `pr#7341 <http://github.com/ceph/ceph/pull/7341>`_, song baisen)
-* mon: degrade a log message to level 2 (`pr#6929 <http://github.com/ceph/ceph/pull/6929>`_, Kongming Wu)
-* mon: detect kv backend failures (Sage Weil)
-* mon: disallow >2 tiers (#11840 Kefu Chai)
-* mon: disallow ec pools as tiers (#11650 Samuel Just)
-* mon: do not deactivate last mds (#10862 John Spray)
-* mon: do not send useless pg_create messages for split pgs (`pr#8247 <http://github.com/ceph/ceph/pull/8247>`_, Sage Weil)
-* mon: don't require OSD W for MRemoveSnaps (`issue#13777 <http://tracker.ceph.com/issues/13777>`_, `pr#6601 <http://github.com/ceph/ceph/pull/6601>`_, John Spray)
-* mon: drop useless rank init assignment (`issue#14508 <http://tracker.ceph.com/issues/14508>`_, `pr#7321 <http://github.com/ceph/ceph/pull/7321>`_, huanwen ren)
-* mon: enable 'mon osd prime pg temp' by default (`pr#7838 <http://github.com/ceph/ceph/pull/7838>`_, Robert LeBlanc)
-* mon: fix average utilization calc for 'osd df' (Mykola Golub)
-* mon: fix calculation of %USED (`pr#7881 <http://github.com/ceph/ceph/pull/7881>`_, Adam Kupczyk)
-* mon: fix ceph df pool available calculation for 0-weighted OSDs (`pr#6660 <http://github.com/ceph/ceph/pull/6660>`_, Chengyuan Li)
-* mon: fix coding-style on PG related Monitor files (`pr#6881 <http://github.com/ceph/ceph/pull/6881>`_, Wido den Hollander)
-* mon: fix CRUSH map test for new pools (Sage Weil)
-* mon: fixes related to mondbstore->get() changes (`pr#6564 <http://github.com/ceph/ceph/pull/6564>`_, Piotr Dałek)
-* mon: fix keyring permissions (`issue#14950 <http://tracker.ceph.com/issues/14950>`_, `pr#7880 <http://github.com/ceph/ceph/pull/7880>`_, Owen Synge)
-* mon: fix locking in preinit error paths (`issue#14473 <http://tracker.ceph.com/issues/14473>`_, `pr#7353 <http://github.com/ceph/ceph/pull/7353>`_, huanwen ren)
-* mon: fix log dump crash when debugging (Mykola Golub)
-* mon: fix mds beacon replies (#11590 Kefu Chai)
-* mon: fix metadata update race (Mykola Golub)
-* mon: fix min_last_epoch_clean tracking (Kefu Chai)
-* mon: fix monmap creation stamp (`pr#7459 <http://github.com/ceph/ceph/pull/7459>`_, duanweijun)
-* mon: fix 'pg ls' sort order, state names (#11569 Kefu Chai)
-* mon: fix refresh (#11470 Joao Eduardo Luis)
-* mon: fix reuse of osd ids (clear osd info on osd deletion) (`issue#13988 <http://tracker.ceph.com/issues/13988>`_, `pr#6900 <http://github.com/ceph/ceph/pull/6900>`_, Loic Dachary, Sage Weil)
-* mon: fix routed_request_tids leak (`pr#6102 <http://github.com/ceph/ceph/pull/6102>`_, Ning Yao)
-* mon: fix sync of config-key data (`pr#7363 <http://github.com/ceph/ceph/pull/7363>`_, Xiaowei Chen)
-* mon: fix the can't change subscribe level bug in monitoring log (`pr#7031 <http://github.com/ceph/ceph/pull/7031>`_, Zhiqiang Wang)
-* mon: fix variance calc in 'osd df' (Sage Weil)
-* mon: go into ERR state if multiple PGs are stuck inactive (`issue#13923 <http://tracker.ceph.com/issues/13923>`_, `pr#7253 <http://github.com/ceph/ceph/pull/7253>`_, Wido den Hollander)
-* mon: improve callout to crushtool (Mykola Golub)
-* mon: initialize last_* timestamps on new pgs to creation time (`issue#14952 <http://tracker.ceph.com/issues/14952>`_, `pr#7980 <http://github.com/ceph/ceph/pull/7980>`_, Sage Weil)
-* mon: initialize recorded election epoch properly even when standalone (`issue#13627 <http://tracker.ceph.com/issues/13627>`_, `pr#6407 <http://github.com/ceph/ceph/pull/6407>`_, huanwen ren)
-* mon: make blocked op messages more readable (Jianpeng Ma)
-* mon: make clock skew checks sane (`issue#14175 <http://tracker.ceph.com/issues/14175>`_, `pr#7141 <http://github.com/ceph/ceph/pull/7141>`_, Joao Eduardo Luis)
-* mon: make osd get pool 'all' only return applicable fields (#10891 Michal Jarzabek)
-* mon: mark_down_pgs in lockstep with pg_map's osdmap epoch (`pr#8208 <http://github.com/ceph/ceph/pull/8208>`_, Sage Weil)
-* mon/MDSMonitor: add confirmation to "ceph mds rmfailed" (`issue#14379 <http://tracker.ceph.com/issues/14379>`_, `pr#7248 <http://github.com/ceph/ceph/pull/7248>`_, Yan, Zheng)
-* mon/MDSMonitor.cc: properly note beacon when health metrics changes (`issue#14684 <http://tracker.ceph.com/issues/14684>`_, `pr#7757 <http://github.com/ceph/ceph/pull/7757>`_, Yan, Zheng)
-* mon: misc scaling fixes (Sage Weil)
-* mon: modify a dout level in OSDMonitor.cc (`pr#6928 <http://github.com/ceph/ceph/pull/6928>`_, Yongqiang He)
-* mon/MonClient: avoid null pointer error when configured incorrectly (`issue#14405 <http://tracker.ceph.com/issues/14405>`_, `pr#7276 <http://github.com/ceph/ceph/pull/7276>`_, Bo Cai)
-* mon/MonClient: fix shutdown race (`issue#13992 <http://tracker.ceph.com/issues/13992>`_, `pr#8335 <http://github.com/ceph/ceph/pull/8335>`_, Sage Weil)
-* mon/monitor: some clean up (`pr#7520 <http://github.com/ceph/ceph/pull/7520>`_, huanwen ren)
-* mon: MonmapMonitor: don't expose uncommitted state to client (`pr#6854 <http://github.com/ceph/ceph/pull/6854>`_, Joao Eduardo Luis)
-* mon: normalize erasure-code profile for storage and comparison (Loic Dachary)
-* mon: only send mon metadata to supporting peers (Sage Weil)
-* mon: optionally specify osd id on 'osd create' (Mykola Golub)
-* mon/OSDMonitor: osdmap laggy set a maximum limit for interval (`pr#7109 <http://github.com/ceph/ceph/pull/7109>`_, Zengran Zhang)
-* mon: osd [test-]reweight-by-{pg,utilization} command updates (`pr#7890 <http://github.com/ceph/ceph/pull/7890>`_, Dan van der Ster, Sage Weil)
-* mon: 'osd tree' fixes (Kefu Chai)
-* mon: paxos is_recovering calc error (`pr#7227 <http://github.com/ceph/ceph/pull/7227>`_, Weijun Duan)
-* mon: periodic background scrub (Joao Eduardo Luis)
-* mon/PGMap: show rd/wr iops separately in status reports (`pr#7072 <http://github.com/ceph/ceph/pull/7072>`_, Cilang Zhao)
-* mon: PGMonitor: acting primary diff with cur_stat, should not set pg to stale (`pr#7083 <http://github.com/ceph/ceph/pull/7083>`_, Xiaowei Chen)
-* mon/PGMonitor: reliably mark PGs state (`pr#8089 <http://github.com/ceph/ceph/pull/8089>`_, Sage Weil)
-* mon: PG Monitor should report waiting for backfill (`issue#12744 <http://tracker.ceph.com/issues/12744>`_, `pr#7398 <http://github.com/ceph/ceph/pull/7398>`_, Abhishek Lekshmanan)
-* mon/pgmonitor: use appropriate forced conversions in get_rule_avail (`pr#7705 <http://github.com/ceph/ceph/pull/7705>`_, huanwen ren)
-* mon: prevent bucket deletion when referenced by a crush rule (#11602 Sage Weil)
-* mon: prevent pgp_num > pg_num (#12025 Xinxin Shu)
-* mon: prevent pool with snapshot state from being used as a tier (#11493 Sage Weil)
-* mon: prime pg_temp when CRUSH map changes (Sage Weil)
-* mon: reduce CPU and memory manager pressure of pg health check (`pr#7482 <http://github.com/ceph/ceph/pull/7482>`_, Piotr Dałek)
-* mon: refine check_remove_tier checks (#11504 John Spray)
-* mon: reject large max_mds values (#12222 John Spray)
-* mon: remove 'mds setmap' (`issue#15136 <http://tracker.ceph.com/issues/15136>`_, `pr#8121 <http://github.com/ceph/ceph/pull/8121>`_, Sage Weil)
-* mon: remove remove_legacy_versions() (`pr#8324 <http://github.com/ceph/ceph/pull/8324>`_, Kefu Chai)
-* mon: remove spurious who arg from 'mds rm ...' (John Spray)
-* mon: remove unnecessary comment for update_from_paxos (`pr#8400 <http://github.com/ceph/ceph/pull/8400>`_, Qinghua Jin)
-* mon: remove unused variable (`issue#15292 <http://tracker.ceph.com/issues/15292>`_, `pr#8337 <http://github.com/ceph/ceph/pull/8337>`_, Javier M. Mellid)
-* mon: revert MonitorDBStore's WholeStoreIteratorImpl::get (`issue#13742 <http://tracker.ceph.com/issues/13742>`_, `pr#6522 <http://github.com/ceph/ceph/pull/6522>`_, Piotr Dałek)
-* mon: should not set isvalid = true when cephx_verify_authorizer return false (`issue#13525 <http://tracker.ceph.com/issues/13525>`_, `pr#6306 <http://github.com/ceph/ceph/pull/6306>`_, Ruifeng Yang)
-* mon: show the pool quota info on ceph df detail command (`issue#14216 <http://tracker.ceph.com/issues/14216>`_, `pr#7094 <http://github.com/ceph/ceph/pull/7094>`_, song baisen)
-* mon: some cleanup in MonmapMonitor.cc (`pr#7418 <http://github.com/ceph/ceph/pull/7418>`_, huanwen ren)
-* mon: standardize Ceph removal commands (`pr#7939 <http://github.com/ceph/ceph/pull/7939>`_, Dongsheng Yang)
-* mon: streamline session handling, fix memory leaks (Sage Weil)
-* mon: support min_down_reporter by subtree level (default by host) (`pr#6709 <http://github.com/ceph/ceph/pull/6709>`_, Xiaoxi Chen)
-* mon: unconfuse object count skew message (`pr#7882 <http://github.com/ceph/ceph/pull/7882>`_, Piotr Dałek)
-* mon: unregister command on shutdown (`pr#7504 <http://github.com/ceph/ceph/pull/7504>`_, huanwen ren)
-* mon: upgrades must pass through hammer (Sage Weil)
-* mon: warn if pg(s) not scrubbed (`issue#13142 <http://tracker.ceph.com/issues/13142>`_, `pr#6440 <http://github.com/ceph/ceph/pull/6440>`_, Michal Jarzabek)
-* mon: warn on bogus cache tier config (Jianpeng Ma)
-* mount.ceph: memory leaks (`pr#6905 <http://github.com/ceph/ceph/pull/6905>`_, Qiankun Zheng)
-* mount.fuse.ceph: better parsing of arguments passed to mount.fuse.ceph by mount command (`issue#14735 <http://tracker.ceph.com/issues/14735>`_, `pr#7607 <http://github.com/ceph/ceph/pull/7607>`_, Florent Bautista)
-* mrun: update path to cmake binaries (`pr#8447 <http://github.com/ceph/ceph/pull/8447>`_, Casey Bodley)
-* msg: add override to virutal methods (`pr#6977 <http://github.com/ceph/ceph/pull/6977>`_, Michal Jarzabek)
-* msg: add thread safety for "random" Messenger + fix wrong usage of random functions (`pr#7650 <http://github.com/ceph/ceph/pull/7650>`_, Avner BenHanoch)
-* msg/async: AsyncConnection: avoid debug log in cleanup_handler (`pr#7547 <http://github.com/ceph/ceph/pull/7547>`_, Haomai Wang)
-* msg/async: AsyncMessenger: fix several bugs (`pr#7831 <http://github.com/ceph/ceph/pull/7831>`_, Haomai Wang)
-* msg/async: AsyncMessenger: fix valgrind leak (`pr#7725 <http://github.com/ceph/ceph/pull/7725>`_, Haomai Wang)
-* msg/async: avoid log spam on throttle (`issue#15031 <http://tracker.ceph.com/issues/15031>`_, `pr#8263 <http://github.com/ceph/ceph/pull/8263>`_, Kefu Chai)
-* msg/async: bunch of fixes (`pr#7379 <http://github.com/ceph/ceph/pull/7379>`_, Piotr Dałek)
-* msg/async: cleanup dead connection and misc things (`pr#7158 <http://github.com/ceph/ceph/pull/7158>`_, Haomai Wang)
-* msg/async: don't calculate msg header crc when not needed (`pr#7815 <http://github.com/ceph/ceph/pull/7815>`_, Piotr Dałek)
-* msg/async: don't use shared_ptr to manage EventCallback (`pr#7028 <http://github.com/ceph/ceph/pull/7028>`_, Haomai Wang)
-* msg/async: Event: fix clock skew problem (`pr#7949 <http://github.com/ceph/ceph/pull/7949>`_, Wei Jin)
-* msg/async: fix array boundary (`pr#7451 <http://github.com/ceph/ceph/pull/7451>`_, Wei Jin)
-* msg: async: fix perf counter description and simplify _send_keepalive_or_ack (`pr#8046 <http://github.com/ceph/ceph/pull/8046>`_, xie xingguo)
-* msg/async: fix potential race condition (`pr#7453 <http://github.com/ceph/ceph/pull/7453>`_, Haomai Wang)
-* msg/async: fix send closed local_connection message problem (`pr#7255 <http://github.com/ceph/ceph/pull/7255>`_, Haomai Wang)
-* msg/async: let receiver ack message ASAP (`pr#6478 <http://github.com/ceph/ceph/pull/6478>`_, Haomai Wang)
-* msg/async: reduce extra tcp packet for message ack (`pr#7380 <http://github.com/ceph/ceph/pull/7380>`_, Haomai Wang)
-* msg/async: remove experiment feature (`pr#7820 <http://github.com/ceph/ceph/pull/7820>`_, Haomai Wang)
-* msg: async: small cleanups (`pr#7871 <http://github.com/ceph/ceph/pull/7871>`_, xie xingguo)
-* msg/async: smarter MSG_MORE (`pr#7625 <http://github.com/ceph/ceph/pull/7625>`_, Piotr Dałek)
-* msg: async: start over after failing to bind a port in specified range (`issue#14928 <http://tracker.ceph.com/issues/14928>`_, `issue#13002 <http://tracker.ceph.com/issues/13002>`_, `pr#7852 <http://github.com/ceph/ceph/pull/7852>`_, xie xingguo)
-* msg/async: support of non-block connect in async messenger (`issue#12802 <http://tracker.ceph.com/issues/12802>`_, `pr#5848 <http://github.com/ceph/ceph/pull/5848>`_, Jianhui Yuan)
-* msg/async: _try_send trim already sent for outcoming_bl more efficient (`pr#7970 <http://github.com/ceph/ceph/pull/7970>`_, Yan Jun)
-* msg/async: will crash if enabling async msg because of an assertion (`pr#6640 <http://github.com/ceph/ceph/pull/6640>`_, Zhi Zhang)
-* msg: filter out lo addr when bind osd addr (`pr#7012 <http://github.com/ceph/ceph/pull/7012>`_, Ji Chen)
-* msgr: add ceph_perf_msgr tool (Hoamai Wang)
-* msgr: async: fix seq handling (Haomai Wang)
-* msgr: async: many many fixes (Haomai Wang)
-* msg: removed unneeded includes from Dispatcher (`pr#6814 <http://github.com/ceph/ceph/pull/6814>`_, Michal Jarzabek)
-* msg: remove duplicated code - local_delivery will now call 'enqueue' (`pr#7948 <http://github.com/ceph/ceph/pull/7948>`_, Avner BenHanoch)
-* msg: remove unneeded inline (`pr#6989 <http://github.com/ceph/ceph/pull/6989>`_, Michal Jarzabek)
-* msgr:  fix large message data content length causing overflow (`pr#6809 <http://github.com/ceph/ceph/pull/6809>`_, Jun Huang, Haomai Wang)
-* msgr: simple: fix clear_pipe (#11381 Haomai Wang)
-* msgr: simple: fix connect_seq assert (Haomai Wang)
-* msgr: xio: fastpath improvements (Raju Kurunkad)
-* msgr: xio: fix ip and nonce (Raju Kurunkad)
-* msgr: xio: improve lane assignment (Vu Pham)
-* msgr: xio: misc fixes (#10735 Matt Benjamin, Kefu Chai, Danny Al-Gaaf, Raju Kurunkad, Vu Pham, Casey Bodley)
-* msgr: xio: sync with accellio v1.4 (Vu Pham)
-* msg: significantly reduce minimal memory usage of connections (`pr#7567 <http://github.com/ceph/ceph/pull/7567>`_, Piotr Dałek)
-* msg/simple: pipe: memory leak when signature check failed (`pr#7096 <http://github.com/ceph/ceph/pull/7096>`_, Ruifeng Yang)
-* msg/simple: remove unneeded friend declarations (`pr#6924 <http://github.com/ceph/ceph/pull/6924>`_, Michal Jarzabek)
-* msg: unit tests (Haomai Wang)
-* msg/xio: fix compilation (`pr#7479 <http://github.com/ceph/ceph/pull/7479>`_, Roi Dayan)
-* msg/xio: fixes (`pr#7603 <http://github.com/ceph/ceph/pull/7603>`_, Roi Dayan)
-* mstart: start rgw on different ports as well (`pr#8167 <http://github.com/ceph/ceph/pull/8167>`_, Abhishek Lekshmanan)
-* nfs for rgw (Matt Benjamin, Orit Wasserman) (`pr#7634 <http://github.com/ceph/ceph/pull/7634>`_, Yehuda Sadeh, Matt Benjamin)
-* objectcacher: misc bug fixes (Jianpeng Ma)
-* objecter: avoid recursive lock of Objecter::rwlock (`pr#7343 <http://github.com/ceph/ceph/pull/7343>`_, Yan, Zheng)
-* organizationmap: modify org mail info. (`pr#7240 <http://github.com/ceph/ceph/pull/7240>`_, Xiaowei Chen)
-* os/bluestore: a few fixes (`pr#8193 <http://github.com/ceph/ceph/pull/8193>`_, Sage Weil)
-* os/bluestore/BlueFS: Before reap ioct, it should wait io complete (`pr#8178 <http://github.com/ceph/ceph/pull/8178>`_, Jianpeng Ma)
-* os/bluestore/BlueStore: Don't leak trim overlay data before write. (`pr#7895 <http://github.com/ceph/ceph/pull/7895>`_, Jianpeng Ma)
-* os/bluestore: ceph-bluefs-tool fixes (`issue#15261 <http://tracker.ceph.com/issues/15261>`_, `pr#8292 <http://github.com/ceph/ceph/pull/8292>`_, Venky Shankar)
-* os/bluestore: clone overlay data (`pr#7860 <http://github.com/ceph/ceph/pull/7860>`_, Jianpeng Ma)
-* os/bluestore: fix assert (`issue#14436 <http://tracker.ceph.com/issues/14436>`_, `pr#7293 <http://github.com/ceph/ceph/pull/7293>`_, xie xingguo)
-* os/bluestore: fix a typo in SPDK path parsing (`pr#7601 <http://github.com/ceph/ceph/pull/7601>`_, Jianjian Huo)
-* os/bluestore: fix bluestore_wal_transaction_t encoding test (`pr#7342 <http://github.com/ceph/ceph/pull/7342>`_, Kefu Chai)
-* os/bluestore: fix bluestore_wal_transaction_t encoding test (`pr#7419 <http://github.com/ceph/ceph/pull/7419>`_, Kefu Chai, Brad Hubbard)
-* os/bluestore: insert new onode to the front position of onode LRU (`pr#7492 <http://github.com/ceph/ceph/pull/7492>`_, Jianjian Huo)
-* os/bluestore/KernelDevice: force block size (`pr#8006 <http://github.com/ceph/ceph/pull/8006>`_, Sage Weil)
-* os/bluestore: make bluestore_sync_transaction = true can work. (`pr#7674 <http://github.com/ceph/ceph/pull/7674>`_, Jianpeng Ma)
-* os/bluestore/NVMEDevice: make IO thread using dpdk launch (`pr#8160 <http://github.com/ceph/ceph/pull/8160>`_, Haomai Wang)
-* os/bluestore/NVMEDevice: refactor probe/attach codes and support zero command (`pr#7647 <http://github.com/ceph/ceph/pull/7647>`_, Haomai Wang)
-* os/bluestore: revamp BlueFS bdev management and add perfcounters (`issue#15376 <http://tracker.ceph.com/issues/15376>`_, `pr#8431 <http://github.com/ceph/ceph/pull/8431>`_, Sage Weil)
-* os/bluestore: small fixes in bluestore StupidAllocator (`pr#8101 <http://github.com/ceph/ceph/pull/8101>`_, Jianjian Huo)
-* os/bluestore: use intrusive_ptr for Dir (`pr#7247 <http://github.com/ceph/ceph/pull/7247>`_, Igor Fedotov)
-* osd: add cache hint when pushing raw clone during recovery (`pr#7069 <http://github.com/ceph/ceph/pull/7069>`_, Zhiqiang Wang)
-* osd: Add config option osd_read_ec_check_for_errors for testing (`pr#5865 <http://github.com/ceph/ceph/pull/5865>`_, David Zafman)
-* osd: add latency perf counters for tier operations (Xinze Chi)
-* osd: add misc perfcounters (Xinze Chi)
-* osd: add missing newline to usage message (`pr#7613 <http://github.com/ceph/ceph/pull/7613>`_, Willem Jan Withagen)
-* osd: add osd op queue latency perfcounter (`pr#5793 <http://github.com/ceph/ceph/pull/5793>`_, Haomai Wang)
-* osd: add pin/unpin support to cache tier (11066) (`pr#6326 <http://github.com/ceph/ceph/pull/6326>`_, Zhiqiang Wang)
-* osd: add 'proxy' cache mode (`issue#12814 <http://tracker.ceph.com/issues/12814>`_, `pr#8210 <http://github.com/ceph/ceph/pull/8210>`_, Sage Weil)
-* osd: add scrub persist/query API (`issue#13505 <http://tracker.ceph.com/issues/13505>`_, `pr#6898 <http://github.com/ceph/ceph/pull/6898>`_, Kefu Chai, Samuel Just)
-* osd: add simple sleep injection in recovery (Sage Weil)
-* osd: add the support of per pool scrub priority (`pr#7062 <http://github.com/ceph/ceph/pull/7062>`_, Zhiqiang Wang)
-* osd: a fix for HeartbeatDispatcher and cleanups (`pr#7550 <http://github.com/ceph/ceph/pull/7550>`_, Kefu Chai)
-* osd: Allow repair of history.last_epoch_started using config (`pr#6793 <http://github.com/ceph/ceph/pull/6793>`_, David Zafman)
-* osd: allow SEEK_HOLE/SEEK_DATA for sparse read (Zhiqiang Wang)
-* osd: auto repair EC pool (`issue#12754 <http://tracker.ceph.com/issues/12754>`_, `pr#6196 <http://github.com/ceph/ceph/pull/6196>`_, Guang Yang)
-* osd: avoid calculating crush mapping for most ops (`pr#6371 <http://github.com/ceph/ceph/pull/6371>`_, Sage Weil)
-* osd: avoid debug std::string initialization in PG::get/put (`pr#7117 <http://github.com/ceph/ceph/pull/7117>`_, Evgeniy Firsov)
-* osd: avoid double-check for replaying and can_checkpoint() in FileStore::_check_replay_guard (`pr#6471 <http://github.com/ceph/ceph/pull/6471>`_, Ning Yao)
-* osd: avoid duplicate op->mark_started in ReplicatedBackend (`pr#6689 <http://github.com/ceph/ceph/pull/6689>`_, Jacek J. Łakis)
-* osd: avoid dup omap sets for in pg metadata (Sage Weil)
-* osd: avoid FORCE updating digest been overwritten by MAYBE when comparing scrub map (`pr#7051 <http://github.com/ceph/ceph/pull/7051>`_, Zhiqiang Wang)
-* osd: avoid multiple hit set insertions (Zhiqiang Wang)
-* osd: avoid osd_op_thread suicide because osd_scrub_sleep (`pr#7009 <http://github.com/ceph/ceph/pull/7009>`_, Jianpeng Ma)
-* osd: avoid transaction append in some cases (Sage Weil)
-* osd: bail out of _committed_osd_maps if we are shutting down (`pr#8267 <http://github.com/ceph/ceph/pull/8267>`_, Samuel Just)
-* osd: blockdevice: avoid implicit cast and add guard (`pr#7460 <http://github.com/ceph/ceph/pull/7460>`_, xie xingguo)
-* osd: bluefs: fix alignment for odd page sizes (`pr#7900 <http://github.com/ceph/ceph/pull/7900>`_, Dan Mick)
-* osd: bluestore: add 'override' to virtual functions (`pr#7886 <http://github.com/ceph/ceph/pull/7886>`_, Michal Jarzabek)
-* osd: bluestore: allow _dump_onode dynamic accept log level (`pr#7995 <http://github.com/ceph/ceph/pull/7995>`_, Jianpeng Ma)
-* osd: bluestore/blockdevice: use std::mutex et al (`pr#7568 <http://github.com/ceph/ceph/pull/7568>`_, Sage Weil)
-* osd: bluestore: bluefs: fix several small bugs (`issue#14344 <http://tracker.ceph.com/issues/14344>`_, `issue#14343 <http://tracker.ceph.com/issues/14343>`_, `pr#7200 <http://github.com/ceph/ceph/pull/7200>`_, xie xingguo)
-* osd: bluestore/BlueFS: initialize super block_size earlier in mkfs (`pr#7535 <http://github.com/ceph/ceph/pull/7535>`_, Sage Weil)
-* osd: bluestore: don't include when building without libaio (`issue#14207 <http://tracker.ceph.com/issues/14207>`_, `pr#7169 <http://github.com/ceph/ceph/pull/7169>`_, Mykola Golub)
-* osd: bluestore: fix bluestore onode_t attr leak (`pr#7125 <http://github.com/ceph/ceph/pull/7125>`_, Ning Yao)
-* osd: bluestore: fix bluestore_wal_transaction_t encoding test (`pr#7168 <http://github.com/ceph/ceph/pull/7168>`_, Kefu Chai)
-* osd: bluestore: fix check for write falling within the same extent (`issue#14954 <http://tracker.ceph.com/issues/14954>`_, `pr#7892 <http://github.com/ceph/ceph/pull/7892>`_, Jianpeng Ma)
-* osd: BlueStore: fix fsck and blockdevice read-relevant issue (`pr#7362 <http://github.com/ceph/ceph/pull/7362>`_, xie xingguo)
-* osd: BlueStore: fix null pointer access (`issue#14561 <http://tracker.ceph.com/issues/14561>`_, `pr#7435 <http://github.com/ceph/ceph/pull/7435>`_, xie xingguo)
-* osd: bluestore: fix several bugs (`issue#14259 <http://tracker.ceph.com/issues/14259>`_, `issue#14353 <http://tracker.ceph.com/issues/14353>`_, `issue#14260 <http://tracker.ceph.com/issues/14260>`_, `issue#14261 <http://tracker.ceph.com/issues/14261>`_, `pr#7122 <http://github.com/ceph/ceph/pull/7122>`_, xie xingguo)
-* osd: bluestore: fix space rebalancing, collection split, buffered reads (`pr#7196 <http://github.com/ceph/ceph/pull/7196>`_, Sage Weil)
-* osd: bluestore: for overwrite a extent, allocate new extent on min_alloc_size write (`pr#7996 <http://github.com/ceph/ceph/pull/7996>`_, Jianpeng Ma)
-* osd: bluestore: improve fs-type verification and tidy up (`pr#7651 <http://github.com/ceph/ceph/pull/7651>`_, xie xingguo)
-* osd: bluestore, kstore: fix nid overwritten logic (`issue#14407 <http://tracker.ceph.com/issues/14407>`_, `issue#14433 <http://tracker.ceph.com/issues/14433>`_, `pr#7283 <http://github.com/ceph/ceph/pull/7283>`_, xie xingguo)
-* osd: bluestore: misc fixes (`pr#7658 <http://github.com/ceph/ceph/pull/7658>`_, Jianpeng Ma)
-* osd: bluestore: more fixes (`pr#7130 <http://github.com/ceph/ceph/pull/7130>`_, Sage Weil)
-* osd: BlueStore/NVMEDevice: fix compiling and fd leak (`pr#7496 <http://github.com/ceph/ceph/pull/7496>`_, xie xingguo)
-* osd: bluestore: NVMEDevice: fix error handling (`pr#7799 <http://github.com/ceph/ceph/pull/7799>`_, xie xingguo)
-* osd: bluestore: remove unneeded includes (`pr#7870 <http://github.com/ceph/ceph/pull/7870>`_, Michal Jarzabek)
-* osd: bluestore: Revert NVMEDevice task cstor and refresh interface changes (`pr#7729 <http://github.com/ceph/ceph/pull/7729>`_, Haomai Wang)
-* osd: bluestore updates, scrub fixes (`pr#8035 <http://github.com/ceph/ceph/pull/8035>`_, Sage Weil)
-* osd: bluestore: use btree_map for allocator (`pr#7269 <http://github.com/ceph/ceph/pull/7269>`_, Igor Fedotov, Sage Weil)
-* osd: break PG removal into multiple iterations (#10198 Guang Yang)
-* osd: cache proxy-write support (Zhiqiang Wang, Samuel Just)
-* osd: cache tier: add config option for eviction check list size (`pr#6997 <http://github.com/ceph/ceph/pull/6997>`_, Yuan Zhou)
-* osd: call on_new_interval on newly split child PG (`issue#13962 <http://tracker.ceph.com/issues/13962>`_, `pr#6778 <http://github.com/ceph/ceph/pull/6778>`_, Sage Weil)
-* osd: cancel failure reports if we fail to rebind network (`pr#6278 <http://github.com/ceph/ceph/pull/6278>`_, Xinze Chi)
-* osdc: Fix race condition with tick_event and shutdown (`issue#14256 <http://tracker.ceph.com/issues/14256>`_, `pr#7151 <http://github.com/ceph/ceph/pull/7151>`_, Adam C. Emerson)
-* osd: change mutex to spinlock to optimize thread context switch. (`pr#6492 <http://github.com/ceph/ceph/pull/6492>`_, Xiaowei Chen)
-* osd: check do_shutdown before do_restart (`pr#6547 <http://github.com/ceph/ceph/pull/6547>`_, Xiaoxi Chen)
-* osd: check health state before pre_booting (`issue#14181 <http://tracker.ceph.com/issues/14181>`_, `pr#7053 <http://github.com/ceph/ceph/pull/7053>`_, Xiaoxi Chen)
-* osd: check scrub state when handling map (Jianpeng Ma)
-* osd: clarify the scrub result report (`pr#6534 <http://github.com/ceph/ceph/pull/6534>`_, Li Wang)
-* osd/ClassHandler: only dlclose() the classes not missing (`pr#8354 <http://github.com/ceph/ceph/pull/8354>`_, Kefu Chai)
-* osd: clean up CMPXATTR checks (`pr#5961 <http://github.com/ceph/ceph/pull/5961>`_, Jianpeng Ma)
-* osd: clean up some constness, privateness (Kefu Chai)
-* osd: clean up temp object if copy-from fails (`pr#8487 <http://github.com/ceph/ceph/pull/8487>`_, Sage Weil)
-* osd: clean up temp object if promotion fails (Jianpeng Ma)
-* osd: clear pg_stat_queue after stopping pgs (`issue#14212 <http://tracker.ceph.com/issues/14212>`_, `pr#7091 <http://github.com/ceph/ceph/pull/7091>`_, Sage Weil)
-* osdc/Objecter: allow per-pool calls to op_cancel_writes (John Spray)
-* osdc/Objecter: dout log after assign tid (`pr#8202 <http://github.com/ceph/ceph/pull/8202>`_, Xinze Chi)
-* osdc/Objecter: fix narrow race with tid assignment (`issue#14364 <http://tracker.ceph.com/issues/14364>`_, `pr#7981 <http://github.com/ceph/ceph/pull/7981>`_, Sage Weil)
-* osdc/Objecter: use full pgid hash in PGNLS ops (`pr#8378 <http://github.com/ceph/ceph/pull/8378>`_, Sage Weil)
-* osd: configure promotion based on write recency (Zhiqiang Wang)
-* osd: consider high/low mode when putting agent to sleep (`issue#14752 <http://tracker.ceph.com/issues/14752>`_, `pr#7631 <http://github.com/ceph/ceph/pull/7631>`_, Sage Weil)
-* osd: constrain collections to meta and PGs (normal and temp) (Sage Weil)
-* osd: correctly handle small osd_scrub_interval_randomize_ratio (`pr#7147 <http://github.com/ceph/ceph/pull/7147>`_, Samuel Just)
-* osd: defer decoding of MOSDRepOp/MOSDRepOpReply (`pr#6503 <http://github.com/ceph/ceph/pull/6503>`_, Xinze Chi)
-* osd: delay populating in-memory PG log hashmaps (`pr#6425 <http://github.com/ceph/ceph/pull/6425>`_, Piotr Dałek)
-* osd: disable filestore_xfs_extsize by default (`issue#14397 <http://tracker.ceph.com/issues/14397>`_, `pr#7265 <http://github.com/ceph/ceph/pull/7265>`_, Ken Dreyer)
-* osd: do not keep ref of old osdmap in pg (`issue#13990 <http://tracker.ceph.com/issues/13990>`_, `pr#7007 <http://github.com/ceph/ceph/pull/7007>`_, Kefu Chai)
-* osd: don't do random deep scrubs for user initiated scrubs (`pr#6673 <http://github.com/ceph/ceph/pull/6673>`_, David Zafman)
-* osd: don't send dup MMonGetOSDMap requests (Sage Weil, Kefu Chai)
-* osd: don't update epoch and rollback_info objects attrs if there is no need (`pr#6555 <http://github.com/ceph/ceph/pull/6555>`_, Ning Yao)
-* osd: drop deprecated removal pg type (`pr#6970 <http://github.com/ceph/ceph/pull/6970>`_, Igor Podoski)
-* osd: drop fiemap len=0 logic (`pr#7267 <http://github.com/ceph/ceph/pull/7267>`_, Sage Weil)
-* osd: drop the interim set from load_pgs() (`pr#6277 <http://github.com/ceph/ceph/pull/6277>`_, Piotr Dałek)
-* osd: dump number of missing objects for each peer with pg query (`pr#6058 <http://github.com/ceph/ceph/pull/6058>`_, Guang Yang)
-* osd: duplicated clear for peer_missing (`pr#8315 <http://github.com/ceph/ceph/pull/8315>`_, Ning Yao)
-* osd: EIO injection (David Zhang)
-* osd: elminiate txn apend, ECSubWrite copy (Samuel Just)
-* osd: enable perfcounters on sharded work queue mutexes (`pr#6455 <http://github.com/ceph/ceph/pull/6455>`_, Jacek J. Łakis)
-* osd: ensure new osdmaps commit before publishing them to pgs (`issue#15073 <http://tracker.ceph.com/issues/15073>`_, `pr#8096 <http://github.com/ceph/ceph/pull/8096>`_, Sage Weil)
-* osd: erasure-code: drop entries according to LRU (Andreas-Joachim Peters)
-* osd: erasure-code: fix SHEC floating point bug (#12936 Loic Dachary)
-* osd: erasure-code: update to ISA-L 2.14 (Yuan Zhou)
-* osd: filejournal: cleanup (David Zafman)
-* osd: FileJournal: _fdump wrongly returns if journal is currently unreadable. (`issue#13626 <http://tracker.ceph.com/issues/13626>`_, `pr#6406 <http://github.com/ceph/ceph/pull/6406>`_, xie xingguo)
-* osd: FileJournal: fix return code of create method (`issue#14134 <http://tracker.ceph.com/issues/14134>`_, `pr#6988 <http://github.com/ceph/ceph/pull/6988>`_, xie xingguo)
-* osd: FileJournal: reduce locking scope in write_aio_bl (`issue#12789 <http://tracker.ceph.com/issues/12789>`_, `pr#5670 <http://github.com/ceph/ceph/pull/5670>`_, Zhi Zhang)
-* osd: filejournal: report journal entry count (`pr#7643 <http://github.com/ceph/ceph/pull/7643>`_, tianqing)
-* osd: FileJournal: support batch peak and pop from writeq (`pr#6701 <http://github.com/ceph/ceph/pull/6701>`_, Xinze Chi)
-* osd: FileStore: add a field indicate xattr only one chunk for set xattr. (`pr#6244 <http://github.com/ceph/ceph/pull/6244>`_, Jianpeng Ma)
-* osd: FileStore: Added O_DSYNC write scheme (`pr#7752 <http://github.com/ceph/ceph/pull/7752>`_, Somnath Roy)
-* osd: FileStore: add error check for object_map->sync() (`pr#7281 <http://github.com/ceph/ceph/pull/7281>`_, Chendi Xue)
-* osd: FileStore: cleanup: remove obsolete option "filestore_xattr_use_omap" (`issue#14356 <http://tracker.ceph.com/issues/14356>`_, `pr#7217 <http://github.com/ceph/ceph/pull/7217>`_, Vikhyat Umrao)
-* osd: filestore: clone using splice (Jianpeng Ma)
-* osd: FileStore: conditional collection of drive metadata (`pr#6956 <http://github.com/ceph/ceph/pull/6956>`_, Somnath Roy)
-* osd: filestore: FALLOC_FL_PUNCH_HOLE must be used with FALLOC_FL_KEEP_SIZE (`pr#7768 <http://github.com/ceph/ceph/pull/7768>`_, xinxin shu)
-* osd: filestore: fast abort if statfs encounters ENOENT (`pr#7703 <http://github.com/ceph/ceph/pull/7703>`_, xie xingguo)
-* osd: FileStore: fix initialization order for m_disable_wbthrottle (`pr#8067 <http://github.com/ceph/ceph/pull/8067>`_, Samuel Just)
-* osd: filestore: fix race condition with split vs collection_move_rename and long object names (`issue#14766 <http://tracker.ceph.com/issues/14766>`_, `pr#8136 <http://github.com/ceph/ceph/pull/8136>`_, Samuel Just)
-* osd: filestore: fix recursive lock (Xinxin Shu)
-* osd: filestore: fix result code overwritten for clone (`issue#14817 <http://tracker.ceph.com/issues/14817>`_, `issue#14827 <http://tracker.ceph.com/issues/14827>`_, `pr#7711 <http://github.com/ceph/ceph/pull/7711>`_, xie xingguo)
-* osd: filestore: fix wrong scope of result code for error cases during mkfs (`issue#14814 <http://tracker.ceph.com/issues/14814>`_, `pr#7704 <http://github.com/ceph/ceph/pull/7704>`_, xie xingguo)
-* osd: filestore: fix wrong scope of result code for error cases during mount (`issue#14815 <http://tracker.ceph.com/issues/14815>`_, `pr#7707 <http://github.com/ceph/ceph/pull/7707>`_, xie xingguo)
-* osd: FileStore: LFNIndex: remove redundant local variable 'obj'. (`issue#13552 <http://tracker.ceph.com/issues/13552>`_, `pr#6333 <http://github.com/ceph/ceph/pull/6333>`_, xiexingguo)
-* osd: FileStore: modify the format of colon (`pr#7333 <http://github.com/ceph/ceph/pull/7333>`_, Donghai Xu)
-* osd: FileStore:: optimize lfn_unlink (`pr#6649 <http://github.com/ceph/ceph/pull/6649>`_, Jianpeng Ma)
-* osd: FileStore: potential memory leak if _fgetattrs fails (`issue#13597 <http://tracker.ceph.com/issues/13597>`_, `pr#6377 <http://github.com/ceph/ceph/pull/6377>`_, xie xingguo)
-* osd: FileStore: print file name before osd assert if read file failed (`pr#7111 <http://github.com/ceph/ceph/pull/7111>`_, Ji Chen)
-* osd: FileStore: remove __SWORD_TYPE dependency (`pr#6263 <http://github.com/ceph/ceph/pull/6263>`_, John Coyle)
-* osd: FileStore: remove unused local variable 'handle' (`pr#6381 <http://github.com/ceph/ceph/pull/6381>`_, xie xingguo)
-* osd: filestore: restructure journal and op queue throttling (`pr#7767 <http://github.com/ceph/ceph/pull/7767>`_, Samuel Just)
-* osd: FileStore: support multiple ondisk finish and apply finishers (`pr#6486 <http://github.com/ceph/ceph/pull/6486>`_, Xinze Chi, Haomai Wang)
-* osd: FileStore: use pwritev instead of lseek+writev (`pr#7349 <http://github.com/ceph/ceph/pull/7349>`_, Haomai Wang, Tao Chang)
-* osd: fix bogus scrub results when missing a clone (`issue#12738 <http://tracker.ceph.com/issues/12738>`_, `issue#12740 <http://tracker.ceph.com/issues/12740>`_, `pr#5783 <http://github.com/ceph/ceph/pull/5783>`_, David Zafman)
-* osd: fix broken balance / localized read handling (`issue#13491 <http://tracker.ceph.com/issues/13491>`_, `pr#6364 <http://github.com/ceph/ceph/pull/6364>`_, Jason Dillaman)
-* osd: fix bug in last_* PG state timestamps (`pr#6517 <http://github.com/ceph/ceph/pull/6517>`_, Li Wang)
-* osd: fix bugs for omap ops (`pr#8230 <http://github.com/ceph/ceph/pull/8230>`_, Jianpeng Ma)
-* osd: fix check_for_full (Henry Chang)
-* osd: fix ClassHandler::ClassData::get_filter() (`pr#6747 <http://github.com/ceph/ceph/pull/6747>`_, Yan, Zheng)
-* osd: fix/clean up full map request handling (`pr#8446 <http://github.com/ceph/ceph/pull/8446>`_, Sage Weil)
-* osd: fix debug message in OSD::is_healthy (`pr#6226 <http://github.com/ceph/ceph/pull/6226>`_, Xiaoxi Chen)
-* osd: fix dirty accounting in make_writeable (Zhiqiang Wang)
-* osd: fix dirtying info without correctly setting drity_info field (`pr#8275 <http://github.com/ceph/ceph/pull/8275>`_, xie xingguo)
-* osd: fix dump_ops_in_flight races (`issue#8885 <http://tracker.ceph.com/issues/8885>`_, `pr#8044 <http://github.com/ceph/ceph/pull/8044>`_, David Zafman)
-* osd: fix dup promotion lost op bug (Zhiqiang Wang)
-* osd: fix endless repair when object is unrecoverable (Jianpeng Ma, Kefu Chai)
-* osd: fix epoch check in handle_pg_create (`pr#8382 <http://github.com/ceph/ceph/pull/8382>`_, Samuel Just)
-* osd: fixes for several cases where op result code was not checked or set (`issue#13566 <http://tracker.ceph.com/issues/13566>`_, `pr#6347 <http://github.com/ceph/ceph/pull/6347>`_, xie xingguo)
-* osd: fix failure report handling during ms_handle_connect() (`pr#8348 <http://github.com/ceph/ceph/pull/8348>`_, xie xingguo)
-* osd: fix FileStore::_destroy_collection error return code (`pr#6612 <http://github.com/ceph/ceph/pull/6612>`_, Ruifeng Yang)
-* osd: fix forced prmootion for CALL ops (`issue#14745 <http://tracker.ceph.com/issues/14745>`_, `pr#7617 <http://github.com/ceph/ceph/pull/7617>`_, Sage Weil)
-* osd: fix fusestore hanging during stop/quit (`issue#14786 <http://tracker.ceph.com/issues/14786>`_, `pr#7677 <http://github.com/ceph/ceph/pull/7677>`_, xie xingguo)
-* osd: fix hitset object naming to use GMT (Kefu Chai)
-* osd: fix inaccurate counter and skip over queueing an empty transaction (`pr#7754 <http://github.com/ceph/ceph/pull/7754>`_, xie xingguo)
-* osd: fix incorrect throttle in WBThrottle (`pr#6713 <http://github.com/ceph/ceph/pull/6713>`_, Zhang Huan)
-* osd: fix invalid list traversal in process_copy_chunk (`pr#7511 <http://github.com/ceph/ceph/pull/7511>`_, Samuel Just)
-* osd: fix lack of object unblock when flush fails (`issue#14511 <http://tracker.ceph.com/issues/14511>`_, `pr#7584 <http://github.com/ceph/ceph/pull/7584>`_, Igor Fedotov)
-* osd: fix log info (`pr#8273 <http://github.com/ceph/ceph/pull/8273>`_, Wei Jin)
-* osd: fix misc memory leaks (Sage Weil)
-* osd: fix MOSDOp encoding (`pr#6174 <http://github.com/ceph/ceph/pull/6174>`_, Sage Weil)
-* osd: fix MOSDRepScrub reference counter in replica_scrub (`pr#6730 <http://github.com/ceph/ceph/pull/6730>`_, Jie Wang)
-* osd: fix negative degraded stats during backfill (Guang Yang)
-* osd: fix null pointer access and race condition (`issue#14072 <http://tracker.ceph.com/issues/14072>`_, `pr#6916 <http://github.com/ceph/ceph/pull/6916>`_, xie xingguo)
-* osd: fix osdmap dump of blacklist items (John Spray)
-* osd: fix overload of '==' operator for pg_stat_t (`issue#14921 <http://tracker.ceph.com/issues/14921>`_, `pr#7842 <http://github.com/ceph/ceph/pull/7842>`_, xie xingguo)
-* osd: fix peek_queue locking in FileStore (Xinze Chi)
-* osd: fix pg resurrection (#11429 Samuel Just)
-* osd: fix promotion vs full cache tier (Samuel Just)
-* osd: fix race condition for heartbeat_need_update (`issue#14387 <http://tracker.ceph.com/issues/14387>`_, `pr#7739 <http://github.com/ceph/ceph/pull/7739>`_, xie xingguo)
-* osd: fix reactivate (check OSDSuperblock in mkfs() when we already have the superblock) (`issue#13586 <http://tracker.ceph.com/issues/13586>`_, `pr#6385 <http://github.com/ceph/ceph/pull/6385>`_, Vicente Cheng)
-* osd: fix reference count, rare race condition etc. (`pr#8254 <http://github.com/ceph/ceph/pull/8254>`_, xie xingguo)
-* osd: fix replay requeue when pg is still activating (#13116 Samuel Just)
-* osd: fix return value from maybe_handle_cache_detail() (`pr#7593 <http://github.com/ceph/ceph/pull/7593>`_, Igor Fedotov)
-* osd: fix rollback_info_trimmed_to before index() (`issue#13965 <http://tracker.ceph.com/issues/13965>`_, `pr#6801 <http://github.com/ceph/ceph/pull/6801>`_, Samuel Just)
-* osd: fix scrub start hobject (`pr#7467 <http://github.com/ceph/ceph/pull/7467>`_, Sage Weil)
-* osd: fix scrub stat bugs (Sage Weil, Samuel Just)
-* osd: fix snap flushing from cache tier (again) (#11787 Samuel Just)
-* osd: fix snap handling on promotion (#11296 Sam Just)
-* osd: fix sparse-read result code checking logic (`issue#14151 <http://tracker.ceph.com/issues/14151>`_, `pr#7016 <http://github.com/ceph/ceph/pull/7016>`_, xie xingguo)
-* osd: fix temp-clearing (David Zafman)
-* osd: fix temp object removal after upgrade (`issue#13862 <http://tracker.ceph.com/issues/13862>`_, `pr#6976 <http://github.com/ceph/ceph/pull/6976>`_, David Zafman)
-* osd: fix tick relevant issues (`pr#8369 <http://github.com/ceph/ceph/pull/8369>`_, xie xingguo)
-* osd: fix trivial scrub bug (`pr#6533 <http://github.com/ceph/ceph/pull/6533>`_, Li Wang)
-* osd: fix two scrub relevant issues (`pr#8462 <http://github.com/ceph/ceph/pull/8462>`_, xie xingguo)
-* osd: fix unnecessary object promotion when deleting from cache pool (`issue#13894 <http://tracker.ceph.com/issues/13894>`_, `pr#7537 <http://github.com/ceph/ceph/pull/7537>`_, Igor Fedotov)
-* osd: fix wip (l_osd_op_wip) perf counter and remove repop_map (`pr#7077 <http://github.com/ceph/ceph/pull/7077>`_, Xinze Chi)
-* osd: fix wrongly placed assert and some cleanups (`pr#6766 <http://github.com/ceph/ceph/pull/6766>`_, xiexingguo, xie xingguo)
-* osd: fix wrong return type of find_osd_on_ip() (`issue#14872 <http://tracker.ceph.com/issues/14872>`_, `pr#7812 <http://github.com/ceph/ceph/pull/7812>`_, xie xingguo)
-* osd: fix wrong use of right parenthesis in localized read logic (`pr#6566 <http://github.com/ceph/ceph/pull/6566>`_, Jie Wang)
-* osd: force promotion for ops EC can't handle (Zhiqiang Wang)
-* osd: ghobject_t: use ! instead of @ as a separator (`pr#7595 <http://github.com/ceph/ceph/pull/7595>`_, Sage Weil)
-* osd: handle dup pg_create that races with pg deletion (`pr#8033 <http://github.com/ceph/ceph/pull/8033>`_, Sage Weil)
-* osd: handle log split with overlapping entries (#11358 Samuel Just)
-* osd: ignore non-existent osds in unfound calc (#10976 Mykola Golub)
-* osd: improve behavior on machines with large memory pages (Steve Capper)
-* osd: improve temperature calculation for cache tier agent (`pr#4737 <http://github.com/ceph/ceph/pull/4737>`_, MingXin Liu)
-* osd: include a temp namespace within each collection/pgid (Sage Weil)
-* osd: increase default max open files (Owen Synge)
-* osd: initialize last_recalibrate field at construction (`pr#8071 <http://github.com/ceph/ceph/pull/8071>`_, xie xingguo)
-* osd: init started to 0 (`issue#13206 <http://tracker.ceph.com/issues/13206>`_, `pr#6107 <http://github.com/ceph/ceph/pull/6107>`_, Sage Weil)
-* osd: KeyValueStore: don't queue NULL context (`pr#6783 <http://github.com/ceph/ceph/pull/6783>`_, Haomai Wang)
-* osd: KeyValueStore: fix return code of mkfs (`pr#7036 <http://github.com/ceph/ceph/pull/7036>`_, xie xingguo)
-* osd: KeyValueStore: fix the name's typo of keyvaluestore_default_strip_size (`pr#6375 <http://github.com/ceph/ceph/pull/6375>`_, Zhi Zhang)
-* osd: KeyValueStore: fix wrongly placed assert (`issue#14176 <http://tracker.ceph.com/issues/14176>`_, `issue#14178 <http://tracker.ceph.com/issues/14178>`_, `pr#7047 <http://github.com/ceph/ceph/pull/7047>`_, xie xingguo)
-* osd: keyvaluestore: misc fixes (Varada Kari)
-* osd: kstore: fix a race condition in _txc_finish() (`pr#7804 <http://github.com/ceph/ceph/pull/7804>`_, Jianjian Huo)
-* osd: kstore: latency breakdown (`pr#7850 <http://github.com/ceph/ceph/pull/7850>`_, James Liu)
-* osd: kstore: several small fixes (`issue#14351 <http://tracker.ceph.com/issues/14351>`_, `issue#14352 <http://tracker.ceph.com/issues/14352>`_, `pr#7213 <http://github.com/ceph/ceph/pull/7213>`_, xie xingguo)
-* osd: kstore: small fixes to kstore (`issue#14204 <http://tracker.ceph.com/issues/14204>`_, `pr#7095 <http://github.com/ceph/ceph/pull/7095>`_, xie xingguo)
-* osd: kstore: sync up kstore with recent bluestore updates (`pr#7681 <http://github.com/ceph/ceph/pull/7681>`_, Jianjian Huo)
-* osd: low and high speed flush modes (Mingxin Liu)
-* osd: make backend and block device code a bit more generic (`pr#6759 <http://github.com/ceph/ceph/pull/6759>`_, Sage Weil)
-* osd: make list_missing query missing_loc.needs_recovery_map (`pr#6298 <http://github.com/ceph/ceph/pull/6298>`_, Guang Yang)
-* osd: make suicide timeouts individually configurable (Samuel Just)
-* osdmap: remove unused local variables (`pr#6864 <http://github.com/ceph/ceph/pull/6864>`_, luo kexue)
-* osdmap: rm nonused variable (`pr#8423 <http://github.com/ceph/ceph/pull/8423>`_, Wei Jin)
-* osd: memstore: fix alignment of Page for test_pageset (`pr#7587 <http://github.com/ceph/ceph/pull/7587>`_, Casey Bodley)
-* osd: memstore: fix two bugs (`pr#6963 <http://github.com/ceph/ceph/pull/6963>`_, Casey Bodley, Sage Weil)
-* osd: merge local_t and op_t txn to single one (`pr#6439 <http://github.com/ceph/ceph/pull/6439>`_, Xinze Chi)
-* osd: merge multiple setattr calls into a setattrs call (Xinxin Shu)
-* osd: min_write_recency_for_promote & min_read_recency_for_promote are tiering only (`pr#8081 <http://github.com/ceph/ceph/pull/8081>`_, huanwen ren)
-* osd: misc FileStore fixes (`issue#14192 <http://tracker.ceph.com/issues/14192>`_, `issue#14188 <http://tracker.ceph.com/issues/14188>`_, `issue#14194 <http://tracker.ceph.com/issues/14194>`_, `issue#14187 <http://tracker.ceph.com/issues/14187>`_, `issue#14186 <http://tracker.ceph.com/issues/14186>`_, `pr#7059 <http://github.com/ceph/ceph/pull/7059>`_, xie xingguo)
-* osd: misc fixes (Ning Yao, Kefu Chai, Xinze Chi, Zhiqiang Wang, Jianpeng Ma)
-* osd: misc optimization for map utilization (`pr#6950 <http://github.com/ceph/ceph/pull/6950>`_, Ning Yao)
-* osd, mon: fix exit issue (`pr#7420 <http://github.com/ceph/ceph/pull/7420>`_, Jiaying Ren)
-* osd,mon: log leveldb and rocksdb to ceph log (`pr#6921 <http://github.com/ceph/ceph/pull/6921>`_, Sage Weil)
-* osd: more fixes for incorrectly dirtying info; resend reply for duplicated scrub-reserve req (`pr#8291 <http://github.com/ceph/ceph/pull/8291>`_, xie xingguo)
-* osd: move newest decode version of MOSDOp and MOSDOpReply to the front (`pr#6642 <http://github.com/ceph/ceph/pull/6642>`_, Jacek J. Łakis)
-* osd: move scrub in OpWQ (Samuel Just)
-* osd: new and delete ObjectStore::Transaction in a function is not necessary (`pr#6299 <http://github.com/ceph/ceph/pull/6299>`_, Ruifeng Yang)
-* osd: newstore: misc updates (including kv and os/fs stuff) (`pr#6609 <http://github.com/ceph/ceph/pull/6609>`_, Sage Weil)
-* osd: newstore prototype (Sage Weil)
-* osd: note down the number of missing clones (`pr#6654 <http://github.com/ceph/ceph/pull/6654>`_, Kefu Chai)
-* osd: ObjectStore internal API refactor (Sage Weil)
-* osd: Omap small bugs adapted (`pr#6669 <http://github.com/ceph/ceph/pull/6669>`_, Jianpeng Ma, David Zafman)
-* osd: optimize clone write path if object-map is enabled (`pr#6403 <http://github.com/ceph/ceph/pull/6403>`_, xinxin shu)
-* osd: optimize get_object_context (`pr#6305 <http://github.com/ceph/ceph/pull/6305>`_, Jianpeng Ma)
-* osd: optimize MOSDOp/do_op/handle_op (`pr#5211 <http://github.com/ceph/ceph/pull/5211>`_, Jacek J. Lakis)
-* osd: optimize scrub subset_last_update calculation (`pr#6518 <http://github.com/ceph/ceph/pull/6518>`_, Li Wang)
-* osd: optimize the session_handle_reset function (`issue#14182 <http://tracker.ceph.com/issues/14182>`_, `pr#7054 <http://github.com/ceph/ceph/pull/7054>`_, songbaisen)
-* osd: os/chain_xattr: On linux use linux/limits.h for XATTR_NAME_MAX. (`pr#6343 <http://github.com/ceph/ceph/pull/6343>`_, John Coyle)
-* osd/OSD.cc: finish full_map_request every MOSDMap message. (`issue#15130 <http://tracker.ceph.com/issues/15130>`_, `pr#8147 <http://github.com/ceph/ceph/pull/8147>`_, Xiaoxi Chen)
-* osd/OSD: fix build_past_intervals_parallel (`pr#8215 <http://github.com/ceph/ceph/pull/8215>`_, David Zafman)
-* osd/OSDMap: fix typo in summarize_mapping_stats (`pr#8088 <http://github.com/ceph/ceph/pull/8088>`_, Sage Weil)
-* osd: OSDMap: reset osd_primary_affinity shared_ptr when deepish_copy_from (`issue#14686 <http://tracker.ceph.com/issues/14686>`_, `pr#7553 <http://github.com/ceph/ceph/pull/7553>`_, Xinze Chi)
-* osd: OSDService: Fix typo in osdmap comment (`pr#7275 <http://github.com/ceph/ceph/pull/7275>`_, Brad Hubbard)
-* osd: os: skip checking pg_meta object existance in FileStore (`pr#6870 <http://github.com/ceph/ceph/pull/6870>`_, Ning Yao)
-* osd: partial revert of "ReplicatedPG: result code not correctly set in some cases." (`issue#13796 <http://tracker.ceph.com/issues/13796>`_, `pr#6622 <http://github.com/ceph/ceph/pull/6622>`_, Sage Weil)
-* osd: peer_features includes self (David Zafman)
-* osd: PG::activate(): handle unexpected cached_removed_snaps more gracefully (`issue#14428 <http://tracker.ceph.com/issues/14428>`_, `pr#7309 <http://github.com/ceph/ceph/pull/7309>`_, Alexey Sheplyakov)
-* osd/PG: indicate in pg query output whether ignore_history_les would help (`pr#8156 <http://github.com/ceph/ceph/pull/8156>`_, Sage Weil)
-* osd: PGLog: clean up read_log (`pr#7092 <http://github.com/ceph/ceph/pull/7092>`_, Jie Wang)
-* osd/PGLog: fix warning (`pr#8057 <http://github.com/ceph/ceph/pull/8057>`_, Sage Weil)
-* osd: pg_pool_t: add dictionary for pool options (`issue#13077 <http://tracker.ceph.com/issues/13077>`_, `pr#6081 <http://github.com/ceph/ceph/pull/6081>`_, Mykola Golub)
-* osd/PG: set epoch_created and parent_split_bits for child pg (`issue#15426 <http://tracker.ceph.com/issues/15426>`_, `pr#8552 <http://github.com/ceph/ceph/pull/8552>`_, Kefu Chai)
-* osd: pool size change triggers new interval (#11771 Samuel Just)
-* osd: prepopulate needs_recovery_map when only one peer has missing (#9558 Guang Yang)
-* osd: prevent osd_recovery_sleep from causing recovery-thread suicide (`pr#7065 <http://github.com/ceph/ceph/pull/7065>`_, Jianpeng Ma)
-* osd: probabilistic cache tier promotion throttling (`pr#7465 <http://github.com/ceph/ceph/pull/7465>`_, Sage Weil)
-* osd: randomize deep scrubbing (`pr#6550 <http://github.com/ceph/ceph/pull/6550>`_, Dan van der Ster, Herve Rousseau)
-* osd: randomize scrub times (#10973 Kefu Chai)
-* osd: recovery, peering fixes (#11687 Samuel Just)
-* osd: reduce memory consumption of some structs (`pr#6475 <http://github.com/ceph/ceph/pull/6475>`_, Piotr Dałek)
-* osd: reduce string use in coll_t::calc_str() (`pr#6505 <http://github.com/ceph/ceph/pull/6505>`_, Igor Podoski)
-* osd: refactor scrub and digest recording (Sage Weil)
-* osd: refuse first write to EC object at non-zero offset (Jianpeng Ma)
-* osd: relax reply order on proxy read (#11211 Zhiqiang Wang)
-* osd: release related sources when scrub is interrupted (`pr#6744 <http://github.com/ceph/ceph/pull/6744>`_, Jianpeng Ma)
-* osd: release the message throttle when OpRequest unregistered (`issue#14248 <http://tracker.ceph.com/issues/14248>`_, `pr#7148 <http://github.com/ceph/ceph/pull/7148>`_, Samuel Just)
-* osd: remove __SWORD_TYPE dependency (`pr#6262 <http://github.com/ceph/ceph/pull/6262>`_, John Coyle)
-* osd: remove unused OSDMap::set_weightf() (`issue#14369 <http://tracker.ceph.com/issues/14369>`_, `pr#7231 <http://github.com/ceph/ceph/pull/7231>`_, huanwen ren)
-* osd: remove up_thru_pending field, which is never used (`pr#7991 <http://github.com/ceph/ceph/pull/7991>`_, xie xingguo)
-* osd: reorder bool fields in PGLog struct (`pr#6279 <http://github.com/ceph/ceph/pull/6279>`_, Piotr Dałek)
-* osd: Replace snprintf with faster implementation in eversion_t::get_key_name (`pr#7121 <http://github.com/ceph/ceph/pull/7121>`_, Evgeniy Firsov)
-* osd/ReplicatedPG: be more careful about calling publish_stats_to_osd() (`issue#14962 <http://tracker.ceph.com/issues/14962>`_, `pr#8039 <http://github.com/ceph/ceph/pull/8039>`_, Greg Farnum)
-* osd: replicatedpg: break out loop if we encounter fatal error during do_pg_op() (`issue#14922 <http://tracker.ceph.com/issues/14922>`_, `pr#7844 <http://github.com/ceph/ceph/pull/7844>`_, xie xingguo)
-* osd: ReplicatedPG: clean up unused function (`pr#7211 <http://github.com/ceph/ceph/pull/7211>`_, Xiaowei Chen)
-* osd/ReplicatedPG: clear watches on change after applying repops (`issue#15151 <http://tracker.ceph.com/issues/15151>`_, `pr#8163 <http://github.com/ceph/ceph/pull/8163>`_, Sage Weil)
-* osd/ReplicatedPG: fix promotion recency logic (`issue#14320 <http://tracker.ceph.com/issues/14320>`_, `pr#6702 <http://github.com/ceph/ceph/pull/6702>`_, Sage Weil)
-* osd: ReplicatedPG: remove unused local variables (`issue#13575 <http://tracker.ceph.com/issues/13575>`_, `pr#6360 <http://github.com/ceph/ceph/pull/6360>`_, xiexingguo)
-* osd/ReplicatedPG::_rollback_to: update the OMAP flag (`issue#14777 <http://tracker.ceph.com/issues/14777>`_, `pr#8495 <http://github.com/ceph/ceph/pull/8495>`_, Samuel Just)
-* osd: repop and lost-unfound overhaul (`pr#7765 <http://github.com/ceph/ceph/pull/7765>`_, Samuel Just)
-* osd: require firefly features (David Zafman)
-* osd: reset primary and up_primary when building a new past_interval. (`issue#13471 <http://tracker.ceph.com/issues/13471>`_, `pr#6240 <http://github.com/ceph/ceph/pull/6240>`_, xiexingguo)
-* osd: resolve boot vs NOUP set + clear race (`pr#7483 <http://github.com/ceph/ceph/pull/7483>`_, Sage Weil)
-* osd: scrub: do not assign value if read error (`pr#6568 <http://github.com/ceph/ceph/pull/6568>`_, Li Wang)
-* osd/ScrubStore: remove unused function (`pr#8045 <http://github.com/ceph/ceph/pull/8045>`_, Kefu Chai)
-* osd: set initial crush weight with more precision (Sage Weil)
-* osd: several small cleanups (`pr#7055 <http://github.com/ceph/ceph/pull/7055>`_, xie xingguo)
-* osd: SHEC no longer experimental
-* osd: shut down if we flap too many times in a short period (`pr#6708 <http://github.com/ceph/ceph/pull/6708>`_, Xiaoxi Chen)
-* osd: skip promote for writefull w/ FADVISE_DONTNEED/NOCACHE (`pr#7010 <http://github.com/ceph/ceph/pull/7010>`_, Jianpeng Ma)
-* osd: skip promotion for flush/evict op (Zhiqiang Wang)
-* osd: slightly reduce actual size of pg_log_entry_t (`pr#6690 <http://github.com/ceph/ceph/pull/6690>`_, Piotr Dałek)
-* osd: small fixes to memstore (`issue#14228 <http://tracker.ceph.com/issues/14228>`_, `issue#14229 <http://tracker.ceph.com/issues/14229>`_, `issue#14227 <http://tracker.ceph.com/issues/14227>`_, `pr#7107 <http://github.com/ceph/ceph/pull/7107>`_, xie xingguo)
-* osd: stripe over small xattrs to fit in XFS's 255 byte inline limit (Sage Weil, Ning Yao)
-* osd: support pool level recovery_priority and recovery_op_priority (`pr#5953 <http://github.com/ceph/ceph/pull/5953>`_, Guang Yang)
-* osd: sync object_map on syncfs (Samuel Just)
-* osd: take excl lock of op is rw (Samuel Just)
-* osd: throttle evict ops (Yunchuan Wen)
-* osd: try evicting after flushing is done (`pr#5630 <http://github.com/ceph/ceph/pull/5630>`_, Zhiqiang Wang)
-* osd: upgrades must pass through hammer (Sage Weil)
-* osd: use a temp object for recovery (Sage Weil)
-* osd: use atomic to generate ceph_tid (`pr#7017 <http://github.com/ceph/ceph/pull/7017>`_, Evgeniy Firsov)
-* osd: use blkid to collection partition information (Joseph Handzik)
-* osd: use optimized is_zero in object_stat_sum_t.is_zero() (`pr#7203 <http://github.com/ceph/ceph/pull/7203>`_, Piotr Dałek)
-* osd: use pg id (without shard) when referring the PG (`pr#6236 <http://github.com/ceph/ceph/pull/6236>`_, Guang Yang)
-* osd: use SEEK_HOLE / SEEK_DATA for sparse copy (Xinxin Shu)
-* osd: utime_t, eversion_t, osd_stat_sum_t encoding optimization (`pr#6902 <http://github.com/ceph/ceph/pull/6902>`_, Xinze Chi)
-* osd: WBThrottle cleanups (Jianpeng Ma)
-* osd: WeightedPriorityQueue: move to intrusive containers (`pr#7654 <http://github.com/ceph/ceph/pull/7654>`_, Robert LeBlanc)
-* osd: write file journal optimization (`pr#6484 <http://github.com/ceph/ceph/pull/6484>`_, Xinze Chi)
-* osd: write journal header on clean shutdown (Xinze Chi)
-* os/filestore: enlarge getxattr buffer size (Jianpeng Ma)
-* os/filestore/FileJournal: set block size via config option (`pr#7628 <http://github.com/ceph/ceph/pull/7628>`_, Sage Weil)
-* os/filestore: fix punch hole usage in _zero (`pr#8050 <http://github.com/ceph/ceph/pull/8050>`_, Sage Weil)
-* os/filestore: fix result handling logic of destroy_collection (`pr#7721 <http://github.com/ceph/ceph/pull/7721>`_, xie xingguo)
-* os/filestore: force lfn attrs to be written atomically, restructure name length limits (`pr#8496 <http://github.com/ceph/ceph/pull/8496>`_, Samuel Just)
-* os/filestore: require offset == length == 0 for full object read; add test (`pr#7957 <http://github.com/ceph/ceph/pull/7957>`_, Jianpeng Ma)
-* os/fs: fix io_getevents argument (`pr#7355 <http://github.com/ceph/ceph/pull/7355>`_, Jingkai Yuan)
-* os/fusestore: add error handling (`pr#7395 <http://github.com/ceph/ceph/pull/7395>`_, xie xingguo)
-* os/keyvaluestore: kill KeyValueStore (`pr#7320 <http://github.com/ceph/ceph/pull/7320>`_, Haomai Wang)
-* os/kstore: insert new onode to the front position of onode LRU (`pr#7505 <http://github.com/ceph/ceph/pull/7505>`_, xie xingguo)
-* os/ObjectStore: add custom move operations for ObjectStore::Transaction (`pr#7303 <http://github.com/ceph/ceph/pull/7303>`_, Casey Bodley)
-* os/ObjectStore: add noexcept to ensure move ctor is used (`pr#8421 <http://github.com/ceph/ceph/pull/8421>`_, Kefu Chai)
-* os/ObjectStore: fix _update_op for split dest_cid (`pr#8364 <http://github.com/ceph/ceph/pull/8364>`_, Sage Weil)
-* os/ObjectStore: implement more efficient get_encoded_bytes()  (`pr#7775 <http://github.com/ceph/ceph/pull/7775>`_, Piotr Dałek)
-* os/ObjectStore: make device uuid probe output something friendly (`pr#8418 <http://github.com/ceph/ceph/pull/8418>`_, Sage Weil)
-* os/ObjectStore: try_move_rename in transaction append and add coverage to store_test (`issue#15205 <http://tracker.ceph.com/issues/15205>`_, `pr#8359 <http://github.com/ceph/ceph/pull/8359>`_, Samuel Just)
-* packaging: add build dependency on python devel package (`pr#7205 <http://github.com/ceph/ceph/pull/7205>`_, Josh Durgin)
-* packaging: make infernalis -> jewel upgrade work (`issue#15047 <http://tracker.ceph.com/issues/15047>`_, `pr#8034 <http://github.com/ceph/ceph/pull/8034>`_, Nathan Cutler)
-* packaging: move cephfs repair tools to ceph-common (`issue#15145 <http://tracker.ceph.com/issues/15145>`_, `pr#8133 <http://github.com/ceph/ceph/pull/8133>`_, Boris Ranto, Ken Dreyer)
-* PG: pg down state blocked by osd.x, lost osd.x cannot solve peering stuck (`issue#13531 <http://tracker.ceph.com/issues/13531>`_, `pr#6317 <http://github.com/ceph/ceph/pull/6317>`_, Xiaowei Chen)
-* pybind: add ceph_volume_client interface for Manila and similar frameworks (`pr#6205 <http://github.com/ceph/ceph/pull/6205>`_, John Spray)
-* pybind: add flock to libcephfs python bindings (`pr#7902 <http://github.com/ceph/ceph/pull/7902>`_, John Spray)
-* pybind/cephfs: add symlink and its unit test (`pr#6323 <http://github.com/ceph/ceph/pull/6323>`_, Shang Ding)
-* pybind: decode empty string in conf_parse_argv() correctly (`pr#6711 <http://github.com/ceph/ceph/pull/6711>`_, Josh Durgin)
-* pybind: Ensure correct python flags are passed (`pr#7663 <http://github.com/ceph/ceph/pull/7663>`_, James Page)
-* pybind: fix build failure, remove extraneous semicolon in method (`issue#14371 <http://tracker.ceph.com/issues/14371>`_, `pr#7235 <http://github.com/ceph/ceph/pull/7235>`_, Abhishek Lekshmanan)
-* pybind: flag an RBD image as closed regardless of result code (`pr#8005 <http://github.com/ceph/ceph/pull/8005>`_, Jason Dillaman)
-* pybind: Implementation of rados_ioctx_snapshot_rollback (`pr#6878 <http://github.com/ceph/ceph/pull/6878>`_, Florent Manens)
-* pybind/Makefile.am: Prevent race creating CYTHON_BUILD_DIR (`issue#15276 <http://tracker.ceph.com/issues/15276>`_, `pr#8356 <http://github.com/ceph/ceph/pull/8356>`_, Dan Mick)
-* pybind: move cephfs to Cython (`pr#7745 <http://github.com/ceph/ceph/pull/7745>`_, John Spray, Mehdi Abaakouk)
-* pybind: pep8 cleanups (Danny Al-Gaaf)
-* pybind: port the rbd bindings to Cython (`issue#13115 <http://tracker.ceph.com/issues/13115>`_, `pr#6768 <http://github.com/ceph/ceph/pull/6768>`_, Hector Martin)
-* pybind/rados: fix object lifetime issues and other bugs in aio (`pr#7778 <http://github.com/ceph/ceph/pull/7778>`_, Hector Martin)
-* pybind/rados: python3 fix (`pr#8331 <http://github.com/ceph/ceph/pull/8331>`_, Mehdi Abaakouk)
-* pybind/rados: use __dealloc__ since __del__ is ignored by cython (`pr#7692 <http://github.com/ceph/ceph/pull/7692>`_, Mehdi Abaakouk)
-* pybind: remove next() on iterators (`pr#7706 <http://github.com/ceph/ceph/pull/7706>`_, Mehdi Abaakouk)
-* pybind: replace __del__ with __dealloc__ for rbd (`pr#7708 <http://github.com/ceph/ceph/pull/7708>`_, Josh Durgin)
-* pybind: support ioctx:exec (`pr#6795 <http://github.com/ceph/ceph/pull/6795>`_, Noah Watkins)
-* pybind/test_rbd: fix test_create_defaults (`issue#14279 <http://tracker.ceph.com/issues/14279>`_, `pr#7155 <http://github.com/ceph/ceph/pull/7155>`_, Josh Durgin)
-* pybind: use correct subdir for rados install-exec rule (`pr#7684 <http://github.com/ceph/ceph/pull/7684>`_, Josh Durgin)
-* pycephfs: many fixes for bindings (Haomai Wang)
-* python binding of librados with cython (`pr#7621 <http://github.com/ceph/ceph/pull/7621>`_, Mehdi Abaakouk)
-* python: use pip instead of python setup.py (`pr#7605 <http://github.com/ceph/ceph/pull/7605>`_, Loic Dachary)
-* qa: add workunit to run ceph_test_rbd_mirror (`pr#8221 <http://github.com/ceph/ceph/pull/8221>`_, Josh Durgin)
-* qa: disable rbd/qemu-iotests test case 055 on RHEL/CentOSlibrbd: journal replay should honor inter-event dependencies (`issue#14385 <http://tracker.ceph.com/issues/14385>`_, `pr#7272 <http://github.com/ceph/ceph/pull/7272>`_, Jason Dillaman)
-* qa: erasure-code benchmark plugin selection (`pr#6685 <http://github.com/ceph/ceph/pull/6685>`_, Loic Dachary)
-* qa: fix filelock_interrupt.py test (Yan, Zheng)
-* qa: improve ceph-disk tests (Loic Dachary)
-* qa: improve docker build layers (Loic Dachary)
-* qa/krbd: Expunge generic/247 (`pr#6831 <http://github.com/ceph/ceph/pull/6831>`_, Douglas Fuller)
-* qa: run-make-check.sh script (Loic Dachary)
-* qa: update rest test cephfs calls (`issue#15309 <http://tracker.ceph.com/issues/15309>`_, `pr#8372 <http://github.com/ceph/ceph/pull/8372>`_, John Spray)
-* qa: update rest test cephfs calls (part 2) (`issue#15309 <http://tracker.ceph.com/issues/15309>`_, `pr#8393 <http://github.com/ceph/ceph/pull/8393>`_, John Spray)
-* qa/workunits/cephtool/test.sh: false positive fail on /tmp/obj1. (`pr#6837 <http://github.com/ceph/ceph/pull/6837>`_, Robin H. Johnson)
-* qa/workunits/cephtool/test.sh: no ./ (`pr#6748 <http://github.com/ceph/ceph/pull/6748>`_, Sage Weil)
-* qa/workunits/cephtool/test.sh: wait longer in ceph_watch_start() (`issue#14910 <http://tracker.ceph.com/issues/14910>`_, `pr#7861 <http://github.com/ceph/ceph/pull/7861>`_, Kefu Chai)
-* qa/workunits: merge_diff shouldn't attempt to use striping (`issue#14165 <http://tracker.ceph.com/issues/14165>`_, `pr#7041 <http://github.com/ceph/ceph/pull/7041>`_, Jason Dillaman)
-* qa/workunits/rados/test.sh: capture stderr too (`pr#8004 <http://github.com/ceph/ceph/pull/8004>`_, Sage Weil)
-* qa/workunits/rados/test.sh: test tmap_migrate (`pr#8114 <http://github.com/ceph/ceph/pull/8114>`_, Sage Weil)
-* qa/workunits/rbd: do not use object map during read flag testing (`pr#8104 <http://github.com/ceph/ceph/pull/8104>`_, Jason Dillaman)
-* qa/workunits/rbd: new online maintenance op tests (`pr#8216 <http://github.com/ceph/ceph/pull/8216>`_, Jason Dillaman)
-* qa/workunits/rbd: rbd-nbd test should use sudo for map/unmap ops (`issue#14221 <http://tracker.ceph.com/issues/14221>`_, `pr#7101 <http://github.com/ceph/ceph/pull/7101>`_, Jason Dillaman)
-* qa/workunits/rbd: use POSIX function definition (`issue#15104 <http://tracker.ceph.com/issues/15104>`_, `pr#8068 <http://github.com/ceph/ceph/pull/8068>`_, Nathan Cutler)
-* qa/workunits/rest/test.py: add confirmation to 'mds setmap' (`issue#14606 <http://tracker.ceph.com/issues/14606>`_, `pr#7982 <http://github.com/ceph/ceph/pull/7982>`_, Sage Weil)
-* qa/workunits/rest/test.py: don't use newfs (`pr#8191 <http://github.com/ceph/ceph/pull/8191>`_, Sage Weil)
-* qa/workunits/snaps: move snap tests into fs sub-directory (`pr#6496 <http://github.com/ceph/ceph/pull/6496>`_, Yan, Zheng)
-* rados: add ceph:: namespace to bufferlist type (`pr#8059 <http://github.com/ceph/ceph/pull/8059>`_, Noah Watkins)
-* rados: add --striper option to use libradosstriper (#10759 Sebastien Ponce)
-* rados: bench: add --no-verify option to improve performance (Piotr Dalek)
-* rados: bench: fix off-by-one to avoid writing past object_size (`pr#6677 <http://github.com/ceph/ceph/pull/6677>`_, Tao Chang)
-* rados bench: misc fixes (Dmitry Yatsushkevich)
-* rados: fix bug for write bench (`pr#7851 <http://github.com/ceph/ceph/pull/7851>`_, James Liu)
-* rados: fix error message on failed pool removal (Wido den Hollander)
-* radosgw-admin: add 'bucket check' function to repair bucket index (Yehuda Sadeh)
-* radosgw-admin: allow (`pr#8529 <http://github.com/ceph/ceph/pull/8529>`_, Orit Wasserman)
-* radosgw-admin: Checking the legality of the parameters (`issue#13018 <http://tracker.ceph.com/issues/13018>`_, `pr#5879 <http://github.com/ceph/ceph/pull/5879>`_, Qiankun Zheng)
-* radosgw-admin: Create --secret-key alias for --secret (`issue#5821 <http://tracker.ceph.com/issues/5821>`_, `pr#5335 <http://github.com/ceph/ceph/pull/5335>`_, Yuan Zhou)
-* radosgw-admin: fix for 'realm pull' (`pr#8404 <http://github.com/ceph/ceph/pull/8404>`_, Casey Bodley)
-* radosgw-admin: fix subuser modify output (#12286 Guce)
-* radosgw-admin: metadata list user should return an empty list when user pool is empty (`issue#13596 <http://tracker.ceph.com/issues/13596>`_, `pr#6465 <http://github.com/ceph/ceph/pull/6465>`_, Orit Wasserman)
-* radosgw-admin: 'period commit' supplies user-readable error messages (`pr#8264 <http://github.com/ceph/ceph/pull/8264>`_, Casey Bodley)
-* rados: handle --snapid arg properly (Abhishek Lekshmanan)
-* rados: implement rm --force option to force remove when full (`pr#6202 <http://github.com/ceph/ceph/pull/6202>`_, Xiaowei Chen)
-* rados: improve bench buffer handling, performance (Piotr Dalek)
-* rados: misc bench fixes (Dmitry Yatsushkevich)
-* rados: new options for write benchmark (`pr#6340 <http://github.com/ceph/ceph/pull/6340>`_, Joaquim Rocha)
-* rados: new pool import implementation (John Spray)
-* rados: translate errno to string in CLI (#10877 Kefu Chai)
-* rbd: accept map options config option (Ilya Dryomov)
-* rbd: accept --user, refuse -i command-line optionals (`pr#6590 <http://github.com/ceph/ceph/pull/6590>`_, Ilya Dryomov)
-* rbd: add disk usage tool (#7746 Jason Dillaman)
-* rbd: additional validation for striping parameters (`pr#6914 <http://github.com/ceph/ceph/pull/6914>`_, Na Xie)
-* rbd: add missing command aliases to refactored CLI (`issue#13806 <http://tracker.ceph.com/issues/13806>`_, `pr#6606 <http://github.com/ceph/ceph/pull/6606>`_, Jason Dillaman)
-* rbd: add --object-size option, deprecate --order (`issue#12112 <http://tracker.ceph.com/issues/12112>`_, `pr#6830 <http://github.com/ceph/ceph/pull/6830>`_, Vikhyat Umrao)
-* rbd: add pool name to disambiguate rbd admin socket commands (`pr#6904 <http://github.com/ceph/ceph/pull/6904>`_, wuxiangwei)
-* rbd: add RBD pool mirroring configuration API + CLI (`pr#6129 <http://github.com/ceph/ceph/pull/6129>`_, Jason Dillaman)
-* rbd: add support for mirror image promotion/demotion/resync (`pr#8138 <http://github.com/ceph/ceph/pull/8138>`_, Jason Dillaman)
-* rbd: allow librados to prune the command-line for config overrides (`issue#15250 <http://tracker.ceph.com/issues/15250>`_, `pr#8282 <http://github.com/ceph/ceph/pull/8282>`_, Jason Dillaman)
-* rbd: allow unmapping by spec (Ilya Dryomov)
-* rbd: cli: fix arg parsing with --io-pattern (Dmitry Yatsushkevich)
-* rbd: clone operation should default to image format 2 (`pr#8119 <http://github.com/ceph/ceph/pull/8119>`_, Jason Dillaman)
-* rbd: correct an output string for merge-diff (`pr#7046 <http://github.com/ceph/ceph/pull/7046>`_, Kongming Wu)
-* rbd: deprecate image format 1 (`pr#7841 <http://github.com/ceph/ceph/pull/7841>`_, Jason Dillaman)
-* rbd: deprecate --new-format option (Jason Dillman)
-* rbd: dynamically generated bash completion (`issue#13494 <http://tracker.ceph.com/issues/13494>`_, `pr#6316 <http://github.com/ceph/ceph/pull/6316>`_, Jason Dillaman)
-* rbd: fix build with "--without-rbd" (`issue#14058 <http://tracker.ceph.com/issues/14058>`_, `pr#6899 <http://github.com/ceph/ceph/pull/6899>`_, Piotr Dałek)
-* rbd: fix clone isssue (`issue#13553 <http://tracker.ceph.com/issues/13553>`_, `pr#6334 <http://github.com/ceph/ceph/pull/6334>`_, xinxin shu)
-* rbd: fix error messages (#2862 Rajesh Nambiar)
-* rbd: fixes for refactored CLI and related tests (`pr#6738 <http://github.com/ceph/ceph/pull/6738>`_, Ilya Dryomov)
-* rbd: fix init-rbdmap CMDPARAMS (`issue#13214 <http://tracker.ceph.com/issues/13214>`_, `pr#6109 <http://github.com/ceph/ceph/pull/6109>`_, Sage Weil)
-* rbd: fix link issues (Jason Dillaman)
-* rbd: fix static initialization ordering issues (`pr#6978 <http://github.com/ceph/ceph/pull/6978>`_, Mykola Golub)
-* rbd-fuse: image name can not include snap name (`pr#7044 <http://github.com/ceph/ceph/pull/7044>`_, Yongqiang He)
-* rbd-fuse: implement mv operation (`pr#6938 <http://github.com/ceph/ceph/pull/6938>`_, wuxiangwei)
-* rbd: improve CLI arg parsing, usage (Ilya Dryomov)
-* rbd: journal: configuration via conf, cli, api and some fixes (`pr#6665 <http://github.com/ceph/ceph/pull/6665>`_, Mykola Golub)
-* rbd: journal reset should disable/re-enable journaling feature (`issue#15097 <http://tracker.ceph.com/issues/15097>`_, `pr#8490 <http://github.com/ceph/ceph/pull/8490>`_, Jason Dillaman)
-* rbd: make config changes actually apply (`pr#6520 <http://github.com/ceph/ceph/pull/6520>`_, Mykola Golub)
-* rbdmap: add manpage (`issue#15212 <http://tracker.ceph.com/issues/15212>`_, `pr#8224 <http://github.com/ceph/ceph/pull/8224>`_, Nathan Cutler)
-* rbdmap: systemd support (`issue#13374 <http://tracker.ceph.com/issues/13374>`_, `pr#6479 <http://github.com/ceph/ceph/pull/6479>`_, Boris Ranto)
-* rbd: merge_diff test should use new --object-size parameter instead of --order (`issue#14106 <http://tracker.ceph.com/issues/14106>`_, `pr#6972 <http://github.com/ceph/ceph/pull/6972>`_, Na Xie, Jason Dillaman)
-* rbd-mirror: asok commands to get status and flush on Mirror and Replayer level (`pr#8235 <http://github.com/ceph/ceph/pull/8235>`_, Mykola Golub)
-* rbd-mirror: enabling/disabling pool mirroring should update the mirroring directory (`issue#15217 <http://tracker.ceph.com/issues/15217>`_, `pr#8261 <http://github.com/ceph/ceph/pull/8261>`_, Ricardo Dias)
-* rbd-mirror: fix image replay test failures (`pr#8158 <http://github.com/ceph/ceph/pull/8158>`_, Jason Dillaman)
-* rbd-mirror: fix long termination due to 30sec wait in main loop (`pr#8185 <http://github.com/ceph/ceph/pull/8185>`_, Mykola Golub)
-* rbd-mirror: fix missing increment for iterators (`pr#8352 <http://github.com/ceph/ceph/pull/8352>`_, runsisi)
-* rbd-mirror: ImageReplayer async start/stop (`pr#7944 <http://github.com/ceph/ceph/pull/7944>`_, Mykola Golub)
-* rbd-mirror: ImageReplayer improvements (`pr#7759 <http://github.com/ceph/ceph/pull/7759>`_, Mykola Golub)
-* rbd-mirror: implement ImageReplayer (`pr#7614 <http://github.com/ceph/ceph/pull/7614>`_, Mykola Golub)
-* rbd-mirror: initial failover / failback support (`pr#8287 <http://github.com/ceph/ceph/pull/8287>`_, Jason Dillaman)
-* rbd-mirror: integrate with image sync state machine (`pr#8079 <http://github.com/ceph/ceph/pull/8079>`_, Jason Dillaman)
-* rbd-mirror: make remote context respect env and argv config params (`pr#8182 <http://github.com/ceph/ceph/pull/8182>`_, Mykola Golub)
-* rbd-mirror: minor fix-ups for initial skeleton implementation (`pr#7958 <http://github.com/ceph/ceph/pull/7958>`_, Mykola Golub)
-* rbd-mirror: prevent enabling/disabling an image's mirroring when not in image mode (`issue#15267 <http://tracker.ceph.com/issues/15267>`_, `pr#8332 <http://github.com/ceph/ceph/pull/8332>`_, Ricardo Dias)
-* rbd-mirror: remote to local cluster image sync (`pr#7979 <http://github.com/ceph/ceph/pull/7979>`_, Jason Dillaman)
-* rbd-mirror: switch fsid over to mirror uuid (`issue#15238 <http://tracker.ceph.com/issues/15238>`_, `pr#8280 <http://github.com/ceph/ceph/pull/8280>`_, Ricardo Dias)
-* rbd-mirror: use pool/image names in asok commands (`pr#8159 <http://github.com/ceph/ceph/pull/8159>`_, Mykola Golub)
-* rbd-mirror: use the mirroring directory to detect candidate images (`issue#15142 <http://tracker.ceph.com/issues/15142>`_, `pr#8162 <http://github.com/ceph/ceph/pull/8162>`_, Ricardo Dias)
-* rbd-mirror: workaround for intermingled lockdep singletons (`pr#8476 <http://github.com/ceph/ceph/pull/8476>`_, Jason Dillaman)
-* rbd: must specify both of stripe-unit and stripe-count when specifying stripingv2 feature (`pr#7026 <http://github.com/ceph/ceph/pull/7026>`_, Donghai Xu)
-* rbd-nbd: add copyright (`pr#7166 <http://github.com/ceph/ceph/pull/7166>`_, Li Wang)
-* rbd-nbd: fix up return code handling (`pr#7215 <http://github.com/ceph/ceph/pull/7215>`_, Mykola Golub)
-* rbd-nbd: network block device (NBD) support for RBD  (`pr#6657 <http://github.com/ceph/ceph/pull/6657>`_, Yunchuan Wen, Li Wang)
-* rbd-nbd: small improvements in logging and forking (`pr#7127 <http://github.com/ceph/ceph/pull/7127>`_, Mykola Golub)
-* rbd: output formatter may not be closed upon error (`issue#13711 <http://tracker.ceph.com/issues/13711>`_, `pr#6706 <http://github.com/ceph/ceph/pull/6706>`_, xie xingguo)
-* rbd: rbdmap improvements (`pr#6445 <http://github.com/ceph/ceph/pull/6445>`_, Boris Ranto)
-* rbd: rbd order will be place in 22, when set to 0 in the config_opt (`issue#14139 <http://tracker.ceph.com/issues/14139>`_, `issue#14047 <http://tracker.ceph.com/issues/14047>`_, `pr#6886 <http://github.com/ceph/ceph/pull/6886>`_, huanwen ren)
-* rbd: rbd-replay-prep and rbd-replay improvements (Jason Dillaman)
-* rbd: recognize queue_depth kernel option (Ilya Dryomov)
-* rbd: refactor cli command handling (`pr#5987 <http://github.com/ceph/ceph/pull/5987>`_, Jason Dillaman)
-* rbd/run_cli_tests.sh: Reflect test failures (`issue#14825 <http://tracker.ceph.com/issues/14825>`_, `pr#7781 <http://github.com/ceph/ceph/pull/7781>`_, Zack Cerza)
-* rbd: stripe unit/count set incorrectly from config (`pr#6593 <http://github.com/ceph/ceph/pull/6593>`_, Mykola Golub)
-* rbd: striping parameters should support 64bit integers (`pr#6942 <http://github.com/ceph/ceph/pull/6942>`_, Na Xie)
-* rbd: support for enabling/disabling mirroring on specific images (`issue#13296 <http://tracker.ceph.com/issues/13296>`_, `pr#8056 <http://github.com/ceph/ceph/pull/8056>`_, Ricardo Dias)
-* rbd: support G and T units for CLI (Abhishek Lekshmanan)
-* rbd: support negative boolean command-line optionals (`issue#13784 <http://tracker.ceph.com/issues/13784>`_, `pr#6607 <http://github.com/ceph/ceph/pull/6607>`_, Jason Dillaman)
-* rbd: unbreak rbd map + cephx_sign_messages option (`pr#6583 <http://github.com/ceph/ceph/pull/6583>`_, Ilya Dryomov)
-* rbd: update default image features (`pr#7846 <http://github.com/ceph/ceph/pull/7846>`_, Jason Dillaman)
-* rbd: update rbd man page (Ilya Dryomov)
-* rbd: update xfstests tests (Douglas Fuller)
-* rbd: use default order from configuration when not specified (`pr#6965 <http://github.com/ceph/ceph/pull/6965>`_, Yunchuan Wen)
-* rbd: use image-spec and snap-spec in help (Vikhyat Umrao, Ilya Dryomov)
-* release-notes: draft v0.94.4 release notes (`pr#5907 <http://github.com/ceph/ceph/pull/5907>`_, Loic Dachary)
-* release-notes: draft v0.94.4 release notes (`pr#6195 <http://github.com/ceph/ceph/pull/6195>`_, Loic Dachary)
-* release-notes: draft v0.94.4 release notes (`pr#6238 <http://github.com/ceph/ceph/pull/6238>`_, Loic Dachary)
-* release-notes: draft v0.94.6 release notes (`issue#13356 <http://tracker.ceph.com/issues/13356>`_, `pr#7689 <http://github.com/ceph/ceph/pull/7689>`_, Abhishek Varshney, Loic Dachary)
-* release-notes: draft v10.0.3 release notes (`pr#7592 <http://github.com/ceph/ceph/pull/7592>`_, Loic Dachary)
-* release-notes: draft v10.0.4 release notes (`pr#7966 <http://github.com/ceph/ceph/pull/7966>`_, Loic Dachary)
-* release-notes: draft v9.2.1 release notes (`issue#13750 <http://tracker.ceph.com/issues/13750>`_, `pr#7694 <http://github.com/ceph/ceph/pull/7694>`_, Abhishek Varshney)
-* releases: what is merged where and when ? (`pr#8358 <http://github.com/ceph/ceph/pull/8358>`_, Loic Dachary)
-* rest-bench: misc fixes (Shawn Chen)
-* rest-bench: support https (#3968 Yuan Zhou)
-* rgw: accept data only at the first time in response to a request (`pr#8084 <http://github.com/ceph/ceph/pull/8084>`_, sunspot)
-* rgw: add a few more help options in admin interface (`pr#8410 <http://github.com/ceph/ceph/pull/8410>`_, Abhishek Lekshmanan)
-* rgw: add a method to purge all associate keys when removing a subuser (`issue#12890 <http://tracker.ceph.com/issues/12890>`_, `pr#6002 <http://github.com/ceph/ceph/pull/6002>`_, Sangdi Xu)
-* rgw: add a missing cap type (`pr#6774 <http://github.com/ceph/ceph/pull/6774>`_, Yehuda Sadeh)
-* rgw: add an inspection to the field of type when assigning user caps (`pr#6051 <http://github.com/ceph/ceph/pull/6051>`_, Kongming Wu)
-* rgw: add bucket request payment feature usage statistics integration (`issue#13834 <http://tracker.ceph.com/issues/13834>`_, `pr#6656 <http://github.com/ceph/ceph/pull/6656>`_, Javier M. Mellid)
-* rgw: add compat header for TEMP_FAILURE_RETRY (`pr#6294 <http://github.com/ceph/ceph/pull/6294>`_, John Coyle)
-* rgw: add default quota config (`pr#6400 <http://github.com/ceph/ceph/pull/6400>`_, Daniel Gryniewicz)
-* rgw: add LifeCycle feature (`pr#6331 <http://github.com/ceph/ceph/pull/6331>`_, Ji Chen)
-* rgw: add max multipart upload parts (#12146 Abshishek Dixit)
-* rgw: add missing error code for admin op API (`pr#7037 <http://github.com/ceph/ceph/pull/7037>`_, Dunrong Huang)
-* rgw: add missing headers to Swift container details (#10666 Ahmad Faheem, Dmytro Iurchenko)
-* rgw: add stats to headers for account GET (#10684 Yuan Zhou)
-* rgw: adds the radosgw-admin sync status command that gives a human readable status of the sync process at a specific zone (`pr#8030 <http://github.com/ceph/ceph/pull/8030>`_, Yehuda Sadeh)
-* rgw: add support for caching of Keystone admin token. (`pr#7630 <http://github.com/ceph/ceph/pull/7630>`_, Radoslaw Zarzynski)
-* rgw: add support for "end_marker" parameter for GET on Swift account. (`issue#10682 <http://tracker.ceph.com/issues/10682>`_, `pr#4216 <http://github.com/ceph/ceph/pull/4216>`_, Radoslaw Zarzynski)
-* rgw: add support for getting Swift's DLO without manifest handling (`pr#6206 <http://github.com/ceph/ceph/pull/6206>`_, Radoslaw Zarzynski)
-* rgw: add support for metadata upload during PUT on Swift container. (`pr#8002 <http://github.com/ceph/ceph/pull/8002>`_, Radoslaw Zarzynski)
-* rgw: add support for Static Large Objects of Swift API (`issue#12886 <http://tracker.ceph.com/issues/12886>`_, `issue#13452 <http://tracker.ceph.com/issues/13452>`_, `pr#6643 <http://github.com/ceph/ceph/pull/6643>`_, Yehuda Sadeh, Radoslaw Zarzynski)
-* rgw: add support for system requests over Swift API (`pr#7666 <http://github.com/ceph/ceph/pull/7666>`_, Radoslaw Zarzynski)
-* rgw: add Trasnaction-Id to response (Abhishek Dixit)
-* rgw: add X-Timestamp for Swift containers (#10938 Radoslaw Zarzynski)
-* rgw: add zone delete to rgw-admin help (`pr#8184 <http://github.com/ceph/ceph/pull/8184>`_, Abhishek Lekshmanan)
-* rgw: adjust error code when bucket does not exist in copy operation (`issue#14975 <http://tracker.ceph.com/issues/14975>`_, `pr#7916 <http://github.com/ceph/ceph/pull/7916>`_, Yehuda Sadeh)
-* rgw: adjust the request_uri to support absoluteURI of http request (`issue#12917 <http://tracker.ceph.com/issues/12917>`_, `pr#7675 <http://github.com/ceph/ceph/pull/7675>`_, Wenjun Huang)
-* rgw: admin api for retrieving usage info (Ji Chen) (`pr#8031 <http://github.com/ceph/ceph/pull/8031>`_, Yehuda Sadeh, Ji Chen)
-* rgw_admin: orphans finish segfaults (`pr#6652 <http://github.com/ceph/ceph/pull/6652>`_, Igor Fedotov)
-* rgw-admin: remove unused iterator and fix error message (`pr#8507 <http://github.com/ceph/ceph/pull/8507>`_, Karol Mroz)
-* rgw_admin: remove unused parent_period arg (`pr#8411 <http://github.com/ceph/ceph/pull/8411>`_, Abhishek Lekshmanan)
-* rgw: Allow an implicit tenant in case of Keystone (`pr#8139 <http://github.com/ceph/ceph/pull/8139>`_, Pete Zaitcev)
-* rgw: allow authentication keystone with self signed certs  (`issue#14853 <http://tracker.ceph.com/issues/14853>`_, `issue#13422 <http://tracker.ceph.com/issues/13422>`_, `pr#7777 <http://github.com/ceph/ceph/pull/7777>`_, Abhishek Lekshmanan)
-* rgw: always check if token is expired (#11367 Anton Aksola, Riku Lehto)
-* rgw: approximate AmazonS3 HostId error field. (`pr#7444 <http://github.com/ceph/ceph/pull/7444>`_, Robin H. Johnson)
-* rgw: aws4 subdomain calling bugfix (`issue#15369 <http://tracker.ceph.com/issues/15369>`_, `pr#8472 <http://github.com/ceph/ceph/pull/8472>`_, Javier M. Mellid)
-* rgw:bucket link now set the bucket.instance acl (bug fix) (`issue#11076 <http://tracker.ceph.com/issues/11076>`_, `pr#8037 <http://github.com/ceph/ceph/pull/8037>`_, Zengran Zhang)
-* rgw: bucket request payment support (`issue#13427 <http://tracker.ceph.com/issues/13427>`_, `pr#6214 <http://github.com/ceph/ceph/pull/6214>`_, Javier M. Mellid)
-* rgw: Bug fix for mtime anomalies in RadosGW and other places (`pr#7328 <http://github.com/ceph/ceph/pull/7328>`_, Adam C. Emerson, Casey Bodley)
-* rgw: build-related fixes (`pr#8076 <http://github.com/ceph/ceph/pull/8076>`_, Yehuda Sadeh, Matt Benjamin)
-* rgw: calculate payload hash in RGWPutObj_ObjStore only when necessary. (`pr#7869 <http://github.com/ceph/ceph/pull/7869>`_, Radoslaw Zarzynski)
-* [rgw] Check return code in RGWFileHandle::write (`pr#7875 <http://github.com/ceph/ceph/pull/7875>`_, Brad Hubbard)
-* rgw: check the return value when call fe->run() (`issue#14585 <http://tracker.ceph.com/issues/14585>`_, `pr#7457 <http://github.com/ceph/ceph/pull/7457>`_, wei qiaomiao)
-* rgw: clarify the error message when trying to create an existed user (`pr#5938 <http://github.com/ceph/ceph/pull/5938>`_, Zeqiang Zhuang)
-* rgw: cleanups to comments and messages (`pr#7633 <http://github.com/ceph/ceph/pull/7633>`_, Pete Zaitcev)
-* rgw: content length (`issue#13582 <http://tracker.ceph.com/issues/13582>`_, `pr#6975 <http://github.com/ceph/ceph/pull/6975>`_, Yehuda Sadeh)
-* rgw: conversion tool to repair broken multipart objects (#12079 Yehuda Sadeh)
-* rgw: convert plain object to versioned (with null version) when removing (`issue#15243 <http://tracker.ceph.com/issues/15243>`_, `pr#8268 <http://github.com/ceph/ceph/pull/8268>`_, Yehuda Sadeh)
-* rgw: delete default zone (`pr#7005 <http://github.com/ceph/ceph/pull/7005>`_, YankunLi)
-* rgw: document layout of pools and objects (Pete Zaitcev)
-* rgw: do not abort radowgw server when using admin op API with bad parameters  (`issue#14190 <http://tracker.ceph.com/issues/14190>`_, `issue#14191 <http://tracker.ceph.com/issues/14191>`_, `pr#7063 <http://github.com/ceph/ceph/pull/7063>`_, Dunrong Huang)
-* rgw: do not enclose bucket header in quotes (#11860 Wido den Hollander)
-* rgw: do not prefetch data for HEAD requests (Guang Yang)
-* rgw: do not preserve ACLs when copying object (#12370 Yehuda Sadeh)
-* rgw: Do not send a Content-Type on a '304 Not Modified' response (`issue#15119 <http://tracker.ceph.com/issues/15119>`_, `pr#8253 <http://github.com/ceph/ceph/pull/8253>`_, Wido den Hollander)
-* rgw: do not set content-type if length is 0 (#11091 Orit Wasserman)
-* rgw: don't clobber bucket/object owner when setting ACLs (#10978 Yehuda Sadeh)
-* rgw: don't use end_marker for namespaced object listing (#11437 Yehuda Sadeh)
-* rgw: don't use rgw_socket_path if frontend is configured (#11160 Yehuda Sadeh)
-* rgw: don't use s->bucket for metadata api path entry (`issue#14549 <http://tracker.ceph.com/issues/14549>`_, `pr#7408 <http://github.com/ceph/ceph/pull/7408>`_, Yehuda Sadeh)
-* rgw: Drop a debugging message (`pr#7280 <http://github.com/ceph/ceph/pull/7280>`_, Pete Zaitcev)
-* rgw: drop permissions of rgw/civetweb after startup (`issue#13600 <http://tracker.ceph.com/issues/13600>`_, `pr#8019 <http://github.com/ceph/ceph/pull/8019>`_, Karol Mroz)
-* rgw: Drop unused usage_exit from rgw_admin.cc (`pr#7632 <http://github.com/ceph/ceph/pull/7632>`_, Pete Zaitcev)
-* rgw: enforce Content-Length for POST on Swift cont/obj (#10661 Radoslaw Zarzynski)
-* rgw: error out if frontend did not send all data (#11851 Yehuda Sadeh)
-* rgw: expose the number of unhealthy workers through admin socket (Guang Yang)
-* rgw: extend rgw_extended_http_attrs to affect Swift accounts and containers as well (`pr#5969 <http://github.com/ceph/ceph/pull/5969>`_, Radoslaw Zarzynski)
-* rgw: fail if parts not specified on multipart upload (#11435 Yehuda Sadeh)
-* rgw: fcgi should include acconfig (`pr#7760 <http://github.com/ceph/ceph/pull/7760>`_, Abhishek Lekshmanan)
-* rgw_file: set owner uid, gid, and Unix mode on new objects (`pr#8321 <http://github.com/ceph/ceph/pull/8321>`_, Matt Benjamin)
-* rgw: fix a glaring syntax error (`pr#6888 <http://github.com/ceph/ceph/pull/6888>`_, Pavan Rallabhandi)
-* rgw: fix assignment of copy obj attributes (#11563 Yehuda Sadeh)
-* rgw: fix a typo in error message (`pr#8434 <http://github.com/ceph/ceph/pull/8434>`_, Abhishek Lekshmanan)
-* rgw: fix a typo in init-radosgw (`pr#6817 <http://github.com/ceph/ceph/pull/6817>`_, Zhi Zhang)
-* rgw: fix broken stats in container listing (#11285 Radoslaw Zarzynski)
-* rgw: fix bug in domain/subdomain splitting (Robin H. Johnson)
-* rgw: fix casing of Content-Type header (Robin H. Johnson)
-* rgw: fix civetweb max threads (#10243 Yehuda Sadeh)
-* rgw: fix compilation warning (`pr#7160 <http://github.com/ceph/ceph/pull/7160>`_, Yehuda Sadeh)
-* rgw: fix compiling error (`pr#8394 <http://github.com/ceph/ceph/pull/8394>`_, xie xingguo)
-* rgw: fix Connection: header handling (#12298 Wido den Hollander)
-* rgw: fix copy metadata, support X-Copied-From for swift (#10663 Radoslaw Zarzynski)
-* rgw: fix data corruptions race condition (#11749 Wuxingyi)
-* rgw: fix decoding of X-Object-Manifest from GET on Swift DLO (Radslow Rzarzynski)
-* rgw: fixes for per-period metadata logs (`pr#7827 <http://github.com/ceph/ceph/pull/7827>`_, Casey Bodley)
-* rgw: fix GET on swift account when limit == 0 (#10683 Radoslaw Zarzynski)
-* rgw: fix handling empty metadata items on Swift container (#11088 Radoslaw Zarzynski)
-* rgw: fix JSON response when getting user quota (#12117 Wuxingyi)
-* rgw: fix locator for objects starting with _ (#11442 Yehuda Sadeh)
-* rgw: fix lockdep false positive (`pr#8284 <http://github.com/ceph/ceph/pull/8284>`_, Yehuda Sadeh)
-* rgw: fix log rotation (Wuxingyi)
-* rgw: fix mdlog (`pr#8183 <http://github.com/ceph/ceph/pull/8183>`_, Orit Wasserman)
-* rgw: fix mulitipart upload in retry path (#11604 Yehuda Sadeh)
-* rgw: fix objects can not be displayed which object name does not cont… (`issue#12963 <http://tracker.ceph.com/issues/12963>`_, `pr#5738 <http://github.com/ceph/ceph/pull/5738>`_, Weijun Duan)
-* rgw: fix openssl linkage (`pr#6513 <http://github.com/ceph/ceph/pull/6513>`_, Yehuda Sadeh)
-* rgw: fix partial read issue in rgw_admin and rgw_tools (`pr#6761 <http://github.com/ceph/ceph/pull/6761>`_, Jiaying Ren)
-* rgw: fix problem deleting objects begining with double underscores (`issue#15318 <http://tracker.ceph.com/issues/15318>`_, `pr#8488 <http://github.com/ceph/ceph/pull/8488>`_, Orit Wasserman)
-* rgw: fix quota enforcement on POST (#11323 Sergey Arkhipov)
-* rgw: fix reload on non Debian systems. (`pr#6482 <http://github.com/ceph/ceph/pull/6482>`_, Hervé Rousseau)
-* rgw: fix reset_loc (#11974 Yehuda Sadeh)
-* rgw: fix response of delete expired objects (`issue#13469 <http://tracker.ceph.com/issues/13469>`_, `pr#6228 <http://github.com/ceph/ceph/pull/6228>`_, Yuan Zhou)
-* rgw: fix return code on missing upload (#11436 Yehuda Sadeh)
-* rgw: Fix subuser harder with tenants (`pr#7618 <http://github.com/ceph/ceph/pull/7618>`_, Pete Zaitcev)
-* rgw: fix swift API returning incorrect account metadata (`issue#13140 <http://tracker.ceph.com/issues/13140>`_, `pr#6047 <http://github.com/ceph/ceph/pull/6047>`_, Sangdi Xu)
-* rgw: fix sysvinit script
-* rgw: fix sysvinit script w/ multiple instances (Sage Weil, Pavan Rallabhandi)
-* rgw: fix the build failure (`pr#6927 <http://github.com/ceph/ceph/pull/6927>`_, Kefu Chai)
-* rgw: fix typo in RGWHTTPClient::process error message (`pr#6424 <http://github.com/ceph/ceph/pull/6424>`_, Brad Hubbard)
-* rgw: fix wrong check for parse() return (`pr#6797 <http://github.com/ceph/ceph/pull/6797>`_, Dunrong Huang)
-* rgw: fix wrong etag calculation during POST on S3 bucket. (`issue#11241 <http://tracker.ceph.com/issues/11241>`_, `pr#6030 <http://github.com/ceph/ceph/pull/6030>`_, Radoslaw Zarzynski)
-* rgw: fix wrong handling of limit=0 during listing of Swift account. (`issue#14903 <http://tracker.ceph.com/issues/14903>`_, `pr#7821 <http://github.com/ceph/ceph/pull/7821>`_, Radoslaw Zarzynski)
-* rgw: force content_type for swift bucket stats requests (#12095 Orit Wasserman)
-* rgw: force content type header on responses with no body (#11438 Orit Wasserman)
-* rgw: generate Date header for civetweb (#10873 Radoslaw Zarzynski)
-* rgw: generate new object tag when setting attrs (#11256 Yehuda Sadeh)
-* rgw: highres time stamps (`pr#8108 <http://github.com/ceph/ceph/pull/8108>`_, Yehuda Sadeh, Adam C. Emerson, Matt Benjamin)
-* rgw: improve content-length env var handling (#11419 Robin H. Johnson)
-* rgw: improved support for swift account metadata (Radoslaw Zarzynski)
-* rgw: improve error handling in S3/Keystone integration (`pr#7597 <http://github.com/ceph/ceph/pull/7597>`_, Radoslaw Zarzynski)
-* rgw: improve handling of already removed buckets in expirer (Radoslaw Rzarzynski)
-* rgw: increase verbosity level on RGWObjManifest line (`pr#7285 <http://github.com/ceph/ceph/pull/7285>`_, magicrobotmonkey)
-* rgw: indexless (`pr#7786 <http://github.com/ceph/ceph/pull/7786>`_, Yehuda Sadeh)
-* rgw: issue aio for first chunk before flush cached data (#11322 Guang Yang)
-* rgw: Jewel nfs fixes 3 (`pr#8460 <http://github.com/ceph/ceph/pull/8460>`_, Matt Benjamin)
-* rgw: keystone v3 (`pr#7719 <http://github.com/ceph/ceph/pull/7719>`_, Mark Barnes, Radoslaw Zarzynski)
-* rgw: ldap fixes (`pr#8168 <http://github.com/ceph/ceph/pull/8168>`_, Matt Benjamin)
-* rgw_ldap: make ldap.h inclusion conditional (`pr#8500 <http://github.com/ceph/ceph/pull/8500>`_, Matt Benjamin)
-* rgw: ldap (Matt Benjamin) (`pr#7985 <http://github.com/ceph/ceph/pull/7985>`_, Matt Benjamin)
-* rgw: let radosgw-admin bucket stats return a standard josn (`pr#7029 <http://github.com/ceph/ceph/pull/7029>`_, Ruifeng Yang)
-* rgw: link against system openssl (instead of dlopen at runtime) (`pr#6419 <http://github.com/ceph/ceph/pull/6419>`_, Sage Weil)
-* rgw: link civetweb with openssl (Sage, Marcus Watts) (`pr#7825 <http://github.com/ceph/ceph/pull/7825>`_, Marcus Watts, Sage Weil)
-* rgw: link payer info to usage logging (`pr#7918 <http://github.com/ceph/ceph/pull/7918>`_, Yehuda Sadeh, Javier M. Mellid)
-* rgw: log to /var/log/ceph instead of /var/log/radosgw
-* rgw: make init script wait for radosgw to stop (#11140 Dmitry Yatsushkevich)
-* rgw: make max put size configurable (#6999 Yuan Zhou)
-* rgw: make quota/gc threads configurable (#11047 Guang Yang)
-* rgw: make read user buckets backward compat (#10683 Radoslaw Zarzynski)
-* rgw: mdlog trim add usage prompt (`pr#6059 <http://github.com/ceph/ceph/pull/6059>`_, Weijun Duan)
-* rgw: merge manifests properly with prefix override (#11622 Yehuda Sadeh)
-* rgw: modify command stucking when operating radosgw-admin metadata list user (`pr#7032 <http://github.com/ceph/ceph/pull/7032>`_, Peiyang Liu)
-* rgw: modify documents and help infos' descriptions to the usage of option date when executing command "log show" (`pr#6080 <http://github.com/ceph/ceph/pull/6080>`_, Kongming Wu)
-* rgw: modify the conditional statement in parse_metadata_key method. (`pr#5875 <http://github.com/ceph/ceph/pull/5875>`_, Zengran Zhang)
-* rgw: move signal.h dependency from rgw_front.h (`pr#7678 <http://github.com/ceph/ceph/pull/7678>`_, Matt Benjamin)
-* rgw: Multipart ListPartsResult ETag quotes (`issue#15334 <http://tracker.ceph.com/issues/15334>`_, `pr#8387 <http://github.com/ceph/ceph/pull/8387>`_, Robin H. Johnson)
-* rgw: multiple improvements regarding etag calculation for SLO/DLO of Swift API. (`pr#7764 <http://github.com/ceph/ceph/pull/7764>`_, Radoslaw Zarzynski)
-* rgw: multiple Swift API compliance improvements for TempURL (Radoslaw Zarzynsk) (`issue#14806 <http://tracker.ceph.com/issues/14806>`_, `issue#11163 <http://tracker.ceph.com/issues/11163>`_, `pr#7891 <http://github.com/ceph/ceph/pull/7891>`_, Radoslaw Zarzynski)
-* rgw: multisite fixes (`pr#8013 <http://github.com/ceph/ceph/pull/8013>`_, Yehuda Sadeh)
-* rgw: multitenancy support (`pr#6784 <http://github.com/ceph/ceph/pull/6784>`_, Yehuda Sadeh, Pete Zaitcev)
-* rgw: new multisite merge (`issue#14549 <http://tracker.ceph.com/issues/14549>`_, `pr#7709 <http://github.com/ceph/ceph/pull/7709>`_, Yehuda Sadeh, Orit Wasserman, Casey Bodley, Daniel Gryniewicz)
-* rgw: only scan for objects not in a namespace (#11984 Yehuda Sadeh)
-* rgw: orphan detection tool (Yehuda Sadeh)
-* rgw: Parse --subuser better (`pr#7279 <http://github.com/ceph/ceph/pull/7279>`_, Pete Zaitcev)
-* rgw: pass in civetweb configurables (#10907 Yehuda Sadeh)
-* rgw: prevent anonymous user from reading bucket with authenticated read ACL (`issue#13207 <http://tracker.ceph.com/issues/13207>`_, `pr#6057 <http://github.com/ceph/ceph/pull/6057>`_, root)
-* rgw: radosgw-admin bucket check --fix not work (`pr#7093 <http://github.com/ceph/ceph/pull/7093>`_, Weijun Duan)
-* rgw: rectify 202 Accepted in PUT response (#11148 Radoslaw Zarzynski)
-* rgw: refuse to calculate digest when the s3 secret key is empty (`issue#13133 <http://tracker.ceph.com/issues/13133>`_, `pr#6045 <http://github.com/ceph/ceph/pull/6045>`_, Sangdi Xu)
-* rgw: remove duplicated code in RGWRados::get_bucket_info() (`pr#7413 <http://github.com/ceph/ceph/pull/7413>`_, liyankun)
-* rgw: remove extra check in RGWGetObj::execute (`issue#12352 <http://tracker.ceph.com/issues/12352>`_, `pr#5262 <http://github.com/ceph/ceph/pull/5262>`_, Javier M. Mellid)
-* rgw: remove meta file after deleting bucket (#11149 Orit Wasserman)
-* rgw: remove trailing :port from HTTP_HOST header (Sage Weil)
-* rgw: Remove unused code in PutMetadataAccount:execute (`pr#6668 <http://github.com/ceph/ceph/pull/6668>`_, Pete Zaitcev)
-* rgw: remove unused variable in RGWPutMetadataBucket::execute (`pr#6735 <http://github.com/ceph/ceph/pull/6735>`_, Radoslaw Zarzynski)
-* rgw: remove unused vector (`pr#7990 <http://github.com/ceph/ceph/pull/7990>`_, Na Xie)
-* rgw: reset return code in when iterating over the bucket the objects (`issue#14826 <http://tracker.ceph.com/issues/14826>`_, `pr#7803 <http://github.com/ceph/ceph/pull/7803>`_, Orit Wasserman)
-* rgw: retry RGWRemoteMetaLog::read_log_info() while master is down (`pr#8453 <http://github.com/ceph/ceph/pull/8453>`_, Casey Bodley)
-* rgw: return 412 on bad limit when listing buckets (#11613 Yehuda Sadeh)
-* rgw: Revert "rgw ldap" (`pr#8075 <http://github.com/ceph/ceph/pull/8075>`_, Yehuda Sadeh)
-* rgw: rework X-Trans-Id header to conform with Swift API (Radoslaw Rzarzynski)
-* rgw/rgw_admin:fix bug about list and stats command (`pr#8200 <http://github.com/ceph/ceph/pull/8200>`_, Qiankun Zheng)
-* rgw/rgw_common.h: fix the RGWBucketInfo decoding (`pr#8154 <http://github.com/ceph/ceph/pull/8154>`_, Kefu Chai)
-* rgw/rgw_common.h: fix the RGWBucketInfo decoding (`pr#8165 <http://github.com/ceph/ceph/pull/8165>`_, Kefu Chai)
-* rgw: RGWLib::env is not used so remove it (`pr#7874 <http://github.com/ceph/ceph/pull/7874>`_, Brad Hubbard)
-* rgw/rgw_orphan: check the return value of save_state (`pr#7544 <http://github.com/ceph/ceph/pull/7544>`_, Boris Ranto)
-* rgw/rgw_resolve: fallback to res_query when res_nquery not implemented (`pr#6292 <http://github.com/ceph/ceph/pull/6292>`_, John Coyle)
-* rgw: RGWZoneParams::create should not handle -EEXIST error (`pr#7927 <http://github.com/ceph/ceph/pull/7927>`_, Orit Wasserman)
-* rgw: s3 encoding-type for get bucket (Jeff Weber)
-* rgw: S3: set EncodingType in ListBucketResult (`pr#7712 <http://github.com/ceph/ceph/pull/7712>`_, Victor Makarov)
-* rgw: send ETag, Last-Modified for swift (#11087 Radoslaw Zarzynski)
-* rgw: set content length on container GET, PUT, DELETE, HEAD (#10971, #11036 Radoslaw Zarzynski)
-* rgw: set max buckets per user in ceph.conf (Vikhyat Umrao)
-* rgw: shard work over multiple librados instances (Pavan Rallabhandi)
-* rgw: signature mismatch with escaped characters in url query portion (`issue#15358 <http://tracker.ceph.com/issues/15358>`_, `pr#8445 <http://github.com/ceph/ceph/pull/8445>`_, Javier M. Mellid)
-* rgw: static large objects (Radoslaw Zarzynski, Yehuda Sadeh)
-* rgw: store system object meta in cache when creating it (`issue#14678 <http://tracker.ceph.com/issues/14678>`_, `pr#7615 <http://github.com/ceph/ceph/pull/7615>`_, Yehuda Sadeh)
-* rgw: support core file limit for radosgw daemon (`pr#6346 <http://github.com/ceph/ceph/pull/6346>`_, Guang Yang)
-* rgw: support end marker on swift container GET (#10682 Radoslaw Zarzynski)
-* rgw: support for aws authentication v4 (Javier M. Mellid) (`issue#10333 <http://tracker.ceph.com/issues/10333>`_, `pr#7720 <http://github.com/ceph/ceph/pull/7720>`_, Yehuda Sadeh, Javier M. Mellid)
-* rgw: support for Swift expiration API (Radoslaw Rzarzynski, Yehuda Sadeh)
-* rgw: support json format for admin policy API (Dunrong Huang) (`issue#14090 <http://tracker.ceph.com/issues/14090>`_, `pr#8036 <http://github.com/ceph/ceph/pull/8036>`_, Yehuda Sadeh, Dunrong Huang)
-* rgw: swift: allow setting attributes with COPY (#10662 Ahmad Faheem, Dmytro Iurchenko)
-* rgw: swift bulk delete (Radoslaw Zarzynski)
-* rgw: swift: do not override sent content type (#12363 Orit Wasserman)
-* rgw: swift: enforce Content-Type in response (#12157 Radoslaw Zarzynski)
-* rgw: swift: fix account listing (#11501 Radoslaw Zarzynski)
-* rgw: swift: fix metadata handling on copy (#10645 Radoslaw Zarzynski)
-* rgw: swift: send Last-Modified header (#10650 Radoslaw Zarzynski)
-* rgw: swift: set Content-Length for account GET (#12158 Radoslav Zarzynski)
-* rgw: swift: set content-length on keystone tokens (#11473 Herv Rousseau)
-* rgw: swift use Civetweb ssl can not get right url (`issue#13628 <http://tracker.ceph.com/issues/13628>`_, `pr#6408 <http://github.com/ceph/ceph/pull/6408>`_, Weijun Duan)
-* rgw: swift versioning disabled (`pr#8066 <http://github.com/ceph/ceph/pull/8066>`_, Yehuda Sadeh, Radoslaw Zarzynski)
-* rgw: sync fixes 3 (`pr#8170 <http://github.com/ceph/ceph/pull/8170>`_, Yehuda Sadeh)
-* rgw: sync fixes 4 (`pr#8190 <http://github.com/ceph/ceph/pull/8190>`_, Yehuda Sadeh)
-* rgw sync fixes (`pr#8095 <http://github.com/ceph/ceph/pull/8095>`_, Yehuda Sadeh)
-* rgw: the map 'headers' is assigned a wrong value (`pr#8481 <http://github.com/ceph/ceph/pull/8481>`_, weiqiaomiao)
-* rgw: try to parse Keystone token in order appropriate to configuration. (`pr#7822 <http://github.com/ceph/ceph/pull/7822>`_, Radoslaw Zarzynski)
-* rgw: update keystone cache with token info (#11125 Yehuda Sadeh)
-* rgw: update to latest civetweb, enable config for IPv6 (#10965 Yehuda Sadeh)
-* rgw: use attrs from source bucket on copy (#11639 Javier M. Mellid)
-* rgw: use correct oid for gc chains (#11447 Yehuda Sadeh)
-* rgw:Use count fn in RGWUserBuckets for quota check (`pr#8294 <http://github.com/ceph/ceph/pull/8294>`_, Abhishek Lekshmanan)
-* rgw: use pimpl pattern for RGWPeriodHistory (`pr#7809 <http://github.com/ceph/ceph/pull/7809>`_, Casey Bodley)
-* rgw: user quota may not adjust on bucket removal (`issue#14507 <http://tracker.ceph.com/issues/14507>`_, `pr#7586 <http://github.com/ceph/ceph/pull/7586>`_, root)
-* rgw: user rm is idempotent (Orit Wasserman)
-* rgw: use smart pointer for C_Reinitwatch (`pr#6767 <http://github.com/ceph/ceph/pull/6767>`_, Orit Wasserman)
-* rgw: use unique request id for civetweb (#10295 Orit Wasserman)
-* rgw: warn on suspicious civetweb frontend parameters (`pr#6944 <http://github.com/ceph/ceph/pull/6944>`_, Matt Benjamin)
-* rocksdb: add perf counters for get/put latency (Xinxin Shu)
-* rocksdb: build with PORTABLE=1 (`pr#6311 <http://github.com/ceph/ceph/pull/6311>`_, Sage Weil)
-* rocksdb, leveldb: fix compact_on_mount (Xiaoxi Chen)
-* rocksdb: pass options as single string (Xiaoxi Chen)
-* rocksdb: remove rdb source files from dist tarball (`issue#13554 <http://tracker.ceph.com/issues/13554>`_, `pr#6379 <http://github.com/ceph/ceph/pull/6379>`_, Kefu Chai)
-* rocksdb: remove rdb sources from dist tarball (`issue#13554 <http://tracker.ceph.com/issues/13554>`_, `pr#7105 <http://github.com/ceph/ceph/pull/7105>`_, Venky Shankar)
-* rocksdb: update to latest (Xiaoxi Chen)
-* rocksdb: use native rocksdb makefile (and our autotools) (`pr#6290 <http://github.com/ceph/ceph/pull/6290>`_, Sage Weil)
-* rpm: add suse firewall files (Tim Serong)
-* rpm: always rebuild and install man pages for rpm (Owen Synge)
-* rpm: ceph.spec.in: correctly declare systemd dependency for SLE/openSUSE (`pr#6114 <http://github.com/ceph/ceph/pull/6114>`_, Nathan Cutler)
-* rpm: ceph.spec.in: fix libs-compat / devel-compat conditional (`issue#12315 <http://tracker.ceph.com/issues/12315>`_, `pr#5219 <http://github.com/ceph/ceph/pull/5219>`_, Ken Dreyer)
-* rpm,deb: remove conditional BuildRequires for btrfs-progs (`issue#15042 <http://tracker.ceph.com/issues/15042>`_, `pr#8016 <http://github.com/ceph/ceph/pull/8016>`_, Erwan Velu)
-* rpm: loosen ceph-test dependencies (Ken Dreyer)
-* rpm: many spec file fixes (Owen Synge, Ken Dreyer)
-* rpm: misc fixes (Boris Ranto, Owen Synge, Ken Dreyer, Ira Cooper)
-* rpm: misc systemd and SUSE fixes (Owen Synge, Nathan Cutler)
-* rpm: move %post(un) ldconfig calls to ceph-base (`issue#14940 <http://tracker.ceph.com/issues/14940>`_, `pr#7867 <http://github.com/ceph/ceph/pull/7867>`_, Nathan Cutler)
-* rpm: move runtime dependencies to ceph-base and fix other packaging issues (`issue#14864 <http://tracker.ceph.com/issues/14864>`_, `pr#7826 <http://github.com/ceph/ceph/pull/7826>`_, Nathan Cutler)
-* rpm: prefer UID/GID 167 when creating ceph user/group (`issue#15246 <http://tracker.ceph.com/issues/15246>`_, `pr#8277 <http://github.com/ceph/ceph/pull/8277>`_, Nathan Cutler)
-* rpm: remove sub-package dependencies on "ceph" (`issue#15146 <http://tracker.ceph.com/issues/15146>`_, `pr#8137 <http://github.com/ceph/ceph/pull/8137>`_, Ken Dreyer)
-* rpm: rhel 5.9 librados compile fix, moved blkid to RBD check/compilation (`issue#13177 <http://tracker.ceph.com/issues/13177>`_, `pr#5954 <http://github.com/ceph/ceph/pull/5954>`_, Rohan Mars)
-* script: add missing stop_rgw variable to stop.sh script (`pr#7959 <http://github.com/ceph/ceph/pull/7959>`_, Karol Mroz)
-* scripts: adjust mstart and mstop script to run with cmake build (`pr#6920 <http://github.com/ceph/ceph/pull/6920>`_, Orit Wasserman)
-* scripts: release_notes can track original issue (`pr#6009 <http://github.com/ceph/ceph/pull/6009>`_, Abhishek Lekshmanan)
-* script: subscription-manager support (`issue#14972 <http://tracker.ceph.com/issues/14972>`_, `pr#7907 <http://github.com/ceph/ceph/pull/7907>`_, Loic Dachary)
-* selinux: allow log files to be located in /var/log/radosgw (`pr#7604 <http://github.com/ceph/ceph/pull/7604>`_, Boris Ranto)
-* selinux policy (Boris Ranto, Milan Broz)
-* selinux: Update policy to grant additional access (`issue#14870 <http://tracker.ceph.com/issues/14870>`_, `pr#7971 <http://github.com/ceph/ceph/pull/7971>`_, Boris Ranto)
-* set 128MB tcmalloc cache size by bytes (`pr#8427 <http://github.com/ceph/ceph/pull/8427>`_, Star Guo)
-* sstring.hh: return type from str_len(...) need not be const (`pr#7679 <http://github.com/ceph/ceph/pull/7679>`_, Matt Benjamin)
-* stringify outputted error code and fix unmatched parentheses. (`pr#6998 <http://github.com/ceph/ceph/pull/6998>`_, xie.xingguo, xie xingguo)
-* Striper: reduce assemble_result log level (`pr#8426 <http://github.com/ceph/ceph/pull/8426>`_, Jason Dillaman)
-* submodules: revert an accidental change (`pr#7929 <http://github.com/ceph/ceph/pull/7929>`_, Yehuda Sadeh)
-* systemd: correctly escape block device paths (`issue#14706 <http://tracker.ceph.com/issues/14706>`_, `pr#7579 <http://github.com/ceph/ceph/pull/7579>`_, James Page)
-* systemd: drop any systemd imposed process/thread limits (`pr#8450 <http://github.com/ceph/ceph/pull/8450>`_, James Page)
-* systemd: fix typos (`pr#6679 <http://github.com/ceph/ceph/pull/6679>`_, Tobias Suckow)
-* systemd: logrotate fixes (Tim Serong, Lars Marowsky-Bree, Nathan Cutler)
-* systemd: many fixes (Sage Weil, Owen Synge, Boris Ranto, Dan van der Ster)
-* systemd: run daemons as user ceph
-* systemd: set up environment in rbdmap unit file (`issue#14984 <http://tracker.ceph.com/issues/14984>`_, `pr#8222 <http://github.com/ceph/ceph/pull/8222>`_, Nathan Cutler)
-* systemd: start/stop/restart ceph services by daemon type (`issue#13497 <http://tracker.ceph.com/issues/13497>`_, `pr#6276 <http://github.com/ceph/ceph/pull/6276>`_, Zhi Zhang)
-* sysvinit: allow custom cluster names (`pr#6732 <http://github.com/ceph/ceph/pull/6732>`_, Richard Chan)
-* sysvinit compat: misc fixes (Owen Synge)
-* test: add missing shut_down mock method (`pr#8125 <http://github.com/ceph/ceph/pull/8125>`_, Jason Dillaman)
-* test/bufferlist: Avoid false-positive tests (`pr#7955 <http://github.com/ceph/ceph/pull/7955>`_, Erwan Velu)
-* test: ceph_test_rados: use less CPU (`pr#7513 <http://github.com/ceph/ceph/pull/7513>`_, Samuel Just)
-* test/cli-integration/rbd: disable progress output (`issue#14931 <http://tracker.ceph.com/issues/14931>`_, `pr#7858 <http://github.com/ceph/ceph/pull/7858>`_, Josh Durgin)
-* test: correct librbd errors discovered with unoptimized cmake build (`pr#7914 <http://github.com/ceph/ceph/pull/7914>`_, Jason Dillaman)
-* test: create pools for rbd tests with different prefix (`pr#7738 <http://github.com/ceph/ceph/pull/7738>`_, Mykola Golub)
-* test: enable test for bug #2339 which has been resolved. (`pr#7743 <http://github.com/ceph/ceph/pull/7743>`_, You Ji)
-* test/encoding/readable.sh fix (`pr#6714 <http://github.com/ceph/ceph/pull/6714>`_, Igor Podoski)
-* Test exit values on test.sh, fix tier.cc (`issue#15165 <http://tracker.ceph.com/issues/15165>`_, `pr#8266 <http://github.com/ceph/ceph/pull/8266>`_, Samuel Just)
-* test: fix issues discovered via the rbd permissions test case (`pr#8129 <http://github.com/ceph/ceph/pull/8129>`_, Jason Dillaman)
-* test: fix osd-scrub-snaps.sh (`pr#6697 <http://github.com/ceph/ceph/pull/6697>`_, Xinze Chi)
-* test: Fix test to run with btrfs which has snap_### dirs (`issue#15347 <http://tracker.ceph.com/issues/15347>`_, `pr#8420 <http://github.com/ceph/ceph/pull/8420>`_, David Zafman)
-* test: fixup and improvements for rbd-mirror test (`pr#8090 <http://github.com/ceph/ceph/pull/8090>`_, Mykola Golub)
-* test: fix ut test failure caused by lfn change (`issue#15464 <http://tracker.ceph.com/issues/15464>`_, `pr#8544 <http://github.com/ceph/ceph/pull/8544>`_, xie xingguo)
-* test: fix valgrind memcheck issues for rbd-mirror test cases (`issue#15354 <http://tracker.ceph.com/issues/15354>`_, `pr#8493 <http://github.com/ceph/ceph/pull/8493>`_, Jason Dillaman)
-* test: handle exception thrown from close during rbd lock test (`pr#8124 <http://github.com/ceph/ceph/pull/8124>`_, Jason Dillaman)
-* test/libcephfs/flock: add sys/file.h include for flock operations (`pr#6310 <http://github.com/ceph/ceph/pull/6310>`_, John Coyle)
-* test/librados/test.cc: clean up EC pools' crush rules too (`issue#13878 <http://tracker.ceph.com/issues/13878>`_, `pr#6788 <http://github.com/ceph/ceph/pull/6788>`_, Loic Dachary, Dan Mick)
-* test/librbd/fsx: Use c++11 std::mt19937 generator instead of random_r() (`pr#6332 <http://github.com/ceph/ceph/pull/6332>`_, John Coyle)
-* test: misc fs test improvements (John Spray, Loic Dachary)
-* test/mon/osd-erasure-code-profile: pick new mon port (`pr#7161 <http://github.com/ceph/ceph/pull/7161>`_, Sage Weil)
-* test: more debug logging for TestWatchNotify (`pr#7737 <http://github.com/ceph/ceph/pull/7737>`_, Mykola Golub)
-* test: new librbd flatten test case (`pr#7609 <http://github.com/ceph/ceph/pull/7609>`_, Jason Dillaman)
-* test/osd: Relax the timing intervals in osd-markdown.sh (`pr#7899 <http://github.com/ceph/ceph/pull/7899>`_, Dan Mick)
-* test_pool_create.sh: put test files in the test dir so they are cleaned up (`pr#8219 <http://github.com/ceph/ceph/pull/8219>`_, Josh Durgin)
-* test/pybind/test_ceph_argparse: fix reweight-by-utilization tests (`pr#8027 <http://github.com/ceph/ceph/pull/8027>`_, Kefu Chai, Sage Weil)
-* test: python tests, linter cleanup (Alfredo Deza)
-* test/radosgw-admin: update the expected usage outputs (`pr#7723 <http://github.com/ceph/ceph/pull/7723>`_, Kefu Chai)
-* test: rbd-mirror: add "switch to the next tag" test (`pr#8149 <http://github.com/ceph/ceph/pull/8149>`_, Mykola Golub)
-* test: rbd-mirror: compare positions using all fields (`pr#8172 <http://github.com/ceph/ceph/pull/8172>`_, Mykola Golub)
-* test: rbd-mirror: script improvements for manual testing (`pr#8325 <http://github.com/ceph/ceph/pull/8325>`_, Mykola Golub)
-* test: reproducer for writeback CoW deadlock (`pr#8009 <http://github.com/ceph/ceph/pull/8009>`_, Jason Dillaman)
-* test/rgw: add multisite test for meta sync across periods (`pr#7887 <http://github.com/ceph/ceph/pull/7887>`_, Casey Bodley)
-* test_rgw_admin: use freopen for output redirection. (`pr#6303 <http://github.com/ceph/ceph/pull/6303>`_, John Coyle)
-* tests: add const for ec test (`pr#6911 <http://github.com/ceph/ceph/pull/6911>`_, Michal Jarzabek)
-* tests: add Ubuntu 16.04 xenial dockerfile (`pr#8519 <http://github.com/ceph/ceph/pull/8519>`_, Loic Dachary)
-* tests: allow docker-test.sh to run under root (`issue#13355 <http://tracker.ceph.com/issues/13355>`_, `pr#6173 <http://github.com/ceph/ceph/pull/6173>`_, Loic Dachary)
-* tests: allow object corpus readable test to skip specific incompat instances (`pr#6932 <http://github.com/ceph/ceph/pull/6932>`_, Igor Podoski)
-* tests: centos7 needs the Continuous Release (CR) Repository enabled for (`issue#13997 <http://tracker.ceph.com/issues/13997>`_, `pr#6842 <http://github.com/ceph/ceph/pull/6842>`_, Brad Hubbard)
-* tests: ceph-disk.sh: should use "readlink -f" instead (`pr#7594 <http://github.com/ceph/ceph/pull/7594>`_, Kefu Chai)
-* tests: ceph-disk.sh: use "readlink -f" instead for fullpath (`pr#7606 <http://github.com/ceph/ceph/pull/7606>`_, Kefu Chai)
-* tests: ceph-disk workunit uses configobj  (`pr#6342 <http://github.com/ceph/ceph/pull/6342>`_, Loic Dachary)
-* tests: ceph-helpers assert success getting backfills (`pr#6699 <http://github.com/ceph/ceph/pull/6699>`_, Loic Dachary)
-* tests: ceph_test_keyvaluedb_iterators: fix broken test (`pr#6597 <http://github.com/ceph/ceph/pull/6597>`_, Haomai Wang)
-* tests: concatenate test_rados_test_tool from src and qa (`issue#13691 <http://tracker.ceph.com/issues/13691>`_, `pr#6464 <http://github.com/ceph/ceph/pull/6464>`_, Loic Dachary)
-* tests: configure with rocksdb by default (`issue#14220 <http://tracker.ceph.com/issues/14220>`_, `pr#7100 <http://github.com/ceph/ceph/pull/7100>`_, Loic Dachary)
-* tests: destroy testprofile before creating one (`issue#13664 <http://tracker.ceph.com/issues/13664>`_, `pr#6446 <http://github.com/ceph/ceph/pull/6446>`_, Loic Dachary)
-* tests: fix a few build warnings (`pr#7608 <http://github.com/ceph/ceph/pull/7608>`_, Sage Weil)
-* tests: fixes for rbd xstests (Douglas Fuller)
-* tests: fix failure for osd-scrub-snap.sh (`issue#13986 <http://tracker.ceph.com/issues/13986>`_, `pr#6890 <http://github.com/ceph/ceph/pull/6890>`_, Loic Dachary, Ning Yao)
-* tests: Fix for make check. (`pr#7102 <http://github.com/ceph/ceph/pull/7102>`_, David Zafman)
-* tests: Fixing broken test/cephtool-test-mon.sh test (`pr#8429 <http://github.com/ceph/ceph/pull/8429>`_, Erwan Velu)
-* tests: fix race condition testing auto scrub (`issue#13592 <http://tracker.ceph.com/issues/13592>`_, `pr#6724 <http://github.com/ceph/ceph/pull/6724>`_, Xinze Chi, Loic Dachary)
-* tests: fix test_rados_tools.sh rados lookup (`issue#13691 <http://tracker.ceph.com/issues/13691>`_, `pr#6502 <http://github.com/ceph/ceph/pull/6502>`_, Loic Dachary)
-* tests: fix tiering health checks (Loic Dachary)
-* tests: fix typo in TestClsRbd.snapshots test case (`issue#13727 <http://tracker.ceph.com/issues/13727>`_, `pr#6504 <http://github.com/ceph/ceph/pull/6504>`_, Jason Dillaman)
-* tests: flush op work queue prior to destroying MockImageCtx (`issue#14092 <http://tracker.ceph.com/issues/14092>`_, `pr#7002 <http://github.com/ceph/ceph/pull/7002>`_, Jason Dillaman)
-* tests for low-level performance (Haomai Wang)
-* tests: ignore test-suite.log (`pr#6584 <http://github.com/ceph/ceph/pull/6584>`_, Loic Dachary)
-* tests: Improving 'make check' execution time (`pr#8131 <http://github.com/ceph/ceph/pull/8131>`_, Erwan Velu)
-* tests: many ec non-regression improvements (Loic Dachary)
-* tests: many many ec test improvements (Loic Dachary)
-* tests: notification slave needs to wait for master (`issue#13810 <http://tracker.ceph.com/issues/13810>`_, `pr#7220 <http://github.com/ceph/ceph/pull/7220>`_, Jason Dillaman)
-* tests: --osd-scrub-load-threshold=2000 for more consistency (`issue#14027 <http://tracker.ceph.com/issues/14027>`_, `pr#6871 <http://github.com/ceph/ceph/pull/6871>`_, Loic Dachary)
-* tests: osd-scrub-snaps.sh to display full osd logs on error (`issue#13986 <http://tracker.ceph.com/issues/13986>`_, `pr#6857 <http://github.com/ceph/ceph/pull/6857>`_, Loic Dachary)
-* tests: port uniqueness reminder (`pr#6387 <http://github.com/ceph/ceph/pull/6387>`_, Loic Dachary)
-* tests: restore run-cli-tests (`pr#6571 <http://github.com/ceph/ceph/pull/6571>`_, Loic Dachary, Sage Weil, Jason Dillaman)
-* tests: snap rename and rebuild object map in client update test (`pr#7224 <http://github.com/ceph/ceph/pull/7224>`_, Jason Dillaman)
-* tests: sync ceph-erasure-code-corpus for mktemp -d (`pr#7596 <http://github.com/ceph/ceph/pull/7596>`_, Loic Dachary)
-* tests: test/librados/test.cc must create profile (`issue#13664 <http://tracker.ceph.com/issues/13664>`_, `pr#6452 <http://github.com/ceph/ceph/pull/6452>`_, Loic Dachary)
-* tests: test_pidfile.sh lingering processes (`issue#14834 <http://tracker.ceph.com/issues/14834>`_, `pr#7734 <http://github.com/ceph/ceph/pull/7734>`_, Loic Dachary)
-* tests: unittest_bufferlist: fix hexdump test (`pr#7152 <http://github.com/ceph/ceph/pull/7152>`_, Sage Weil)
-* tests: unittest_ipaddr: fix segv (`pr#7154 <http://github.com/ceph/ceph/pull/7154>`_, Sage Weil)
-* test/system/rados_list_parallel: print oid if rados_write fails (`issue#15240 <http://tracker.ceph.com/issues/15240>`_, `pr#8309 <http://github.com/ceph/ceph/pull/8309>`_, Kefu Chai)
-* test/system/\*: use dynamically generated pool name (`issue#15240 <http://tracker.ceph.com/issues/15240>`_, `pr#8318 <http://github.com/ceph/ceph/pull/8318>`_, Kefu Chai)
-* test/test-erasure-code.sh: disable pg_temp priming (`issue#15211 <http://tracker.ceph.com/issues/15211>`_, `pr#8260 <http://github.com/ceph/ceph/pull/8260>`_, Sage Weil)
-* test: TestMirroringWatcher test cases were not closing images (`pr#8435 <http://github.com/ceph/ceph/pull/8435>`_, Jason Dillaman)
-* test/TestPGLog: fix the FTBFS (`issue#14930 <http://tracker.ceph.com/issues/14930>`_, `pr#7855 <http://github.com/ceph/ceph/pull/7855>`_, Kefu Chai)
-* test/test_pool_create.sh: fix port (`pr#8361 <http://github.com/ceph/ceph/pull/8361>`_, Sage Weil)
-* test/time: no need to abs(uint64_t) for comparing (`pr#7726 <http://github.com/ceph/ceph/pull/7726>`_, Kefu Chai)
-* test: update rbd integration cram tests for new default features (`pr#8001 <http://github.com/ceph/ceph/pull/8001>`_, Jason Dillaman)
-* test: use sequential journal_tid for object cacher test (`issue#13877 <http://tracker.ceph.com/issues/13877>`_, `pr#6710 <http://github.com/ceph/ceph/pull/6710>`_, Josh Durgin)
-* tools: add cephfs-table-tool 'take_inos' (`pr#6655 <http://github.com/ceph/ceph/pull/6655>`_, John Spray)
-* tools/cephfs: add tmap_upgrade (`pr#7003 <http://github.com/ceph/ceph/pull/7003>`_, John Spray)
-* tools/cephfs: fix overflow writing header to fixed size buffer (#13816) (`pr#6617 <http://github.com/ceph/ceph/pull/6617>`_, John Spray)
-* tools/cephfs: fix tmap_upgrade (`issue#15135 <http://tracker.ceph.com/issues/15135>`_, `pr#8128 <http://github.com/ceph/ceph/pull/8128>`_, John Spray)
-* tools: ceph_monstore_tool: add inflate-pgmap command (`issue#14217 <http://tracker.ceph.com/issues/14217>`_, `pr#7097 <http://github.com/ceph/ceph/pull/7097>`_, Kefu Chai)
-* tools: ceph-monstore-update-crush: add "--test" when testing crushmap (`pr#6418 <http://github.com/ceph/ceph/pull/6418>`_, Kefu Chai)
-* tools: Fix layout handing in cephfs-data-scan (#13898) (`pr#6719 <http://github.com/ceph/ceph/pull/6719>`_, John Spray)
-* tools: monstore: add 'show-versions' command. (`pr#7073 <http://github.com/ceph/ceph/pull/7073>`_, Cilang Zhao)
-* tools/rados: reduce "rados put" memory usage by op_size (`pr#7928 <http://github.com/ceph/ceph/pull/7928>`_, Piotr Dałek)
-* tools:remove duplicate references (`pr#5917 <http://github.com/ceph/ceph/pull/5917>`_, Bo Cai)
-* tools: support printing part cluster map in readable fashion (`issue#13079 <http://tracker.ceph.com/issues/13079>`_, `pr#5921 <http://github.com/ceph/ceph/pull/5921>`_, Bo Cai)
-* unittest_compression_zlib: do not assume buffer will be null terminated (`pr#8064 <http://github.com/ceph/ceph/pull/8064>`_, Sage Weil)
-* unittest_erasure_code_plugin: fix deadlock (Alpine) (`pr#8314 <http://github.com/ceph/ceph/pull/8314>`_, John Coyle)
-* unittest_osdmap: default crush tunables now firefly (`pr#8098 <http://github.com/ceph/ceph/pull/8098>`_, Sage Weil)
-* upstart: throttle restarts (#11798 Sage Weil, Greg Farnum)
-* vstart: fix up cmake paths when VSTART_DEST is given (`pr#8363 <http://github.com/ceph/ceph/pull/8363>`_, Casey Bodley)
-* vstart: grant full access to Swift testing account (`pr#6239 <http://github.com/ceph/ceph/pull/6239>`_, Yuan Zhou)
-* vstart: make -k with optional mon_num. (`pr#8251 <http://github.com/ceph/ceph/pull/8251>`_, Jianpeng Ma)
-* vstart: set cephfs root uid/gid to caller (`pr#6255 <http://github.com/ceph/ceph/pull/6255>`_, John Spray)
-* vstart.sh: add mstart, mstop, mrun wrappers for running multiple vstart-style test clusters out of src tree (`pr#6901 <http://github.com/ceph/ceph/pull/6901>`_, Yehuda Sadeh)
-* vstart.sh: avoid race condition starting rgw via vstart.sh (`issue#14829 <http://tracker.ceph.com/issues/14829>`_, `pr#7727 <http://github.com/ceph/ceph/pull/7727>`_, Javier M. Mellid)
-* vstart.sh: silence a harmless msg where btrfs is not found (`pr#7640 <http://github.com/ceph/ceph/pull/7640>`_, Patrick Donnelly)
-* xio: add prefix to xio msgr logs (`pr#8148 <http://github.com/ceph/ceph/pull/8148>`_, Roi Dayan)
-* xio: fix compilation against latest accelio (`pr#8022 <http://github.com/ceph/ceph/pull/8022>`_, Roi Dayan)
-* xio: fix incorrect ip being assigned in case of multiple RDMA ports (`pr#7747 <http://github.com/ceph/ceph/pull/7747>`_, Subramanyam Varanasi)
-* xio: remove duplicate assignment of peer addr (`pr#8025 <http://github.com/ceph/ceph/pull/8025>`_, Roi Dayan)
-* xio: remove redundant magic methods (`pr#7773 <http://github.com/ceph/ceph/pull/7773>`_, Roi Dayan)
-* xio: remove unused variable (`pr#8023 <http://github.com/ceph/ceph/pull/8023>`_, Roi Dayan)
-* xio: xio_init needs to be called before any other xio function (`pr#8227 <http://github.com/ceph/ceph/pull/8227>`_, Roi Dayan)
-* xxhash: use clone of xxhash.git; add .gitignore (`pr#7986 <http://github.com/ceph/ceph/pull/7986>`_, Sage Weil)
diff --git a/ceph/doc/releases/kraken.rst b/ceph/doc/releases/kraken.rst
deleted file mode 100644 (file)
index 3d39e32..0000000
+++ /dev/null
@@ -1,2337 +0,0 @@
-======
-Kraken
-======
-
-Kraken is the 11th stable release of Ceph.  It is named after the
-mythical kraken, a legendary sea monster in Scandinavian folklore with
-cephalopod-like appearance.
-
-v11.2.1 Kraken
-==============
-
-This is the first bugfix release for Kraken, and probably the last release of
-the Kraken series (Kraken will be declared "End Of Life" (EOL) when Luminous
-is declared stable). It contains a large number of bugfixes across all Ceph
-components.
-
-We recommend that all v11.2.x users upgrade.
-
-For more detailed information, see :download:`the complete changelog <../changelog/v11.2.1.txt>`.
-
-Notable Changes
----------------
-
-* In previous versions, if a client sent an op to the wrong OSD, the OSD
-  would reply with ENXIO.  The rationale here is that the client or OSD is
-  clearly buggy and we want to surface the error as clearly as possible.
-  We now only send the ENXIO reply if the osd_enxio_on_misdirected_op option
-  is enabled (it's off by default).  This means that a VM using librbd that
-  previously would have gotten an EIO and gone read-only will now see a
-  blocked/hung IO instead.
-
-* There was a bug introduced in Jewel (#19119) that broke the mapping behavior
-  when an "out" OSD that still existed in the CRUSH map was removed with 'osd rm'.
-  This could result in 'misdirected op' and other errors.  The bug is now fixed,
-  but the fix itself introduces the same risk because the behavior may vary between
-  clients and OSDs.  To avoid problems, please ensure that all OSDs are removed
-  from the CRUSH map before deleting them.  That is, be sure to do::
-
-     ceph osd crush rm osd.123
-
-  before::
-
-     ceph osd rm osd.123
-
-* This release greatly improves control and throttling of the snap trimmer. It
-  introduces the "osd max trimming pgs" option (defaulting to 2), which limits
-  how many PGs on an OSD can be trimming snapshots at a time. And it restores
-  the safe use of the "osd snap trim sleep" option, which defaults to 0 but
-  otherwise adds the given number of seconds in delay between every dispatch
-  of trim operations to the underlying system.
-
-Other Notable Changes
----------------------
-
-* build/ops: ceph-base missing dependency for psmisc in Ubuntu Xenial (`issue#19129 <http://tracker.ceph.com/issues/19129>`_, `issue#19564 <http://tracker.ceph.com/issues/19564>`_, `pr#14425 <https://github.com/ceph/ceph/pull/14425>`_, Nathan Cutler)
-* build/ops: logrotate is missing from debian package (kraken, master) (`issue#19670 <http://tracker.ceph.com/issues/19670>`_, `issue#19390 <http://tracker.ceph.com/issues/19390>`_, `pr#14734 <https://github.com/ceph/ceph/pull/14734>`_, Kefu Chai)
-* build/ops: selinux: Do parallel relabel on package install (`issue#20077 <http://tracker.ceph.com/issues/20077>`_, `issue#20184 <http://tracker.ceph.com/issues/20184>`_, `issue#20191 <http://tracker.ceph.com/issues/20191>`_, `issue#20193 <http://tracker.ceph.com/issues/20193>`_, `pr#15509 <https://github.com/ceph/ceph/pull/15509>`_, Boris Ranto)
-* build/ops: spec file mentions non-existent ceph-create-keys systemd unit file, causing ceph-mon units to not be enabled via preset (`issue#19460 <http://tracker.ceph.com/issues/19460>`_, `pr#14315 <https://github.com/ceph/ceph/pull/14315>`_, Sébastien Han)
-* build/ops: systemd restarts Ceph Mon to quickly after failing to start (`issue#18635 <http://tracker.ceph.com/issues/18635>`_, `issue#18721 <http://tracker.ceph.com/issues/18721>`_, `pr#13185 <https://github.com/ceph/ceph/pull/13185>`_, Wido den Hollander)
-* build/ops: systemd: Start OSDs after MONs (`issue#18907 <http://tracker.ceph.com/issues/18907>`_, `issue#18516 <http://tracker.ceph.com/issues/18516>`_, `pr#13494 <https://github.com/ceph/ceph/pull/13494>`_, Boris Ranto)
-* ceph-disk: Add fix subcommand kraken back-port (`issue#19544 <http://tracker.ceph.com/issues/19544>`_, `pr#14345 <https://github.com/ceph/ceph/pull/14345>`_, Boris Ranto)
-* ceph-disk: does not support cluster names different than 'ceph' (`issue#18973 <http://tracker.ceph.com/issues/18973>`_, `issue#17821 <http://tracker.ceph.com/issues/17821>`_, `pr#13497 <https://github.com/ceph/ceph/pull/13497>`_, Loic Dachary)
-* ceph-disk: enable directory backed OSD at boot time (`issue#19628 <http://tracker.ceph.com/issues/19628>`_, `issue#19647 <http://tracker.ceph.com/issues/19647>`_, `pr#14604 <https://github.com/ceph/ceph/pull/14604>`_, Loic Dachary)
-* ceph-disk: error on _bytes2str (`issue#18431 <http://tracker.ceph.com/issues/18431>`_, `issue#18371 <http://tracker.ceph.com/issues/18371>`_, `pr#13501 <https://github.com/ceph/ceph/pull/13501>`_, Kefu Chai)
-* ceph-disk: fails if OSD udev rule triggers prior to mount of /var (`issue#20150 <http://tracker.ceph.com/issues/20150>`_, `issue#19941 <http://tracker.ceph.com/issues/19941>`_, `pr#16092 <https://github.com/ceph/ceph/pull/16092>`_, Loic Dachary)
-* ceph-disk: Fix getting wrong group name when --setgroup in bluestore (`issue#18956 <http://tracker.ceph.com/issues/18956>`_, `pr#13488 <https://github.com/ceph/ceph/pull/13488>`_, craigchi)
-* ceph-disk list reports mount error for OSD having mount options with SELinux context (`issue#19537 <http://tracker.ceph.com/issues/19537>`_, `issue#17331 <http://tracker.ceph.com/issues/17331>`_, `pr#14403 <https://github.com/ceph/ceph/pull/14403>`_, Brad Hubbard)
-* ceph-disk prepare get wrong group name in bluestore (`issue#18997 <http://tracker.ceph.com/issues/18997>`_, `pr#13543 <https://github.com/ceph/ceph/pull/13543>`_, craigchi)
-* ceph-disk: Racing between partition creation & device node creation (`issue#20034 <http://tracker.ceph.com/issues/20034>`_, `pr#16138 <https://github.com/ceph/ceph/pull/16138>`_, Erwan Velu)
-* ceph-disk: separate ceph-osd --check-needs-\* logs (`issue#20010 <http://tracker.ceph.com/issues/20010>`_, `issue#19888 <http://tracker.ceph.com/issues/19888>`_, `pr#16135 <https://github.com/ceph/ceph/pull/16135>`_, Loic Dachary)
-* cephfs: buffer overflow in test LibCephFS.DirLs (`issue#18941 <http://tracker.ceph.com/issues/18941>`_, `issue#19045 <http://tracker.ceph.com/issues/19045>`_, `pr#14571 <https://github.com/ceph/ceph/pull/14571>`_, "Yan, Zheng")
-* cephfs: ceph-fuse crash during snapshot tests (`issue#18552 <http://tracker.ceph.com/issues/18552>`_, `issue#18460 <http://tracker.ceph.com/issues/18460>`_, `pr#14563 <https://github.com/ceph/ceph/pull/14563>`_, Yan, Zheng)
-* cephfs: ceph-fuse does not recover after lost connection to MDS (`issue#19678 <http://tracker.ceph.com/issues/19678>`_, `issue#18757 <http://tracker.ceph.com/issues/18757>`_, `pr#16105 <https://github.com/ceph/ceph/pull/16105>`_, Henrik Korkuc)
-* cephfs: client: fix the cross-quota rename boundary check conditions (`issue#18700 <http://tracker.ceph.com/issues/18700>`_, `pr#14567 <https://github.com/ceph/ceph/pull/14567>`_, Greg Farnum)
-* cephfs: Deadlock on two ceph-fuse clients accessing the same file (`issue#20028 <http://tracker.ceph.com/issues/20028>`_, `issue#19635 <http://tracker.ceph.com/issues/19635>`_, `pr#16191 <https://github.com/ceph/ceph/pull/16191>`_, "Yan, Zheng")
-* cephfs: fragment space check can cause replayed request fail (`issue#18660 <http://tracker.ceph.com/issues/18660>`_, `issue#18706 <http://tracker.ceph.com/issues/18706>`_, `pr#14568 <https://github.com/ceph/ceph/pull/14568>`_, "Yan, Zheng")
-* cephfs: MDS crashes on missing metadata object (`issue#18179 <http://tracker.ceph.com/issues/18179>`_, `issue#18566 <http://tracker.ceph.com/issues/18566>`_, `pr#14565 <https://github.com/ceph/ceph/pull/14565>`_, Yan, Zheng)
-* cephfs: MDS heartbeat timeout during rejoin, when working with large amount of caps/inodes (`issue#19118 <http://tracker.ceph.com/issues/19118>`_, `issue#19335 <http://tracker.ceph.com/issues/19335>`_, `pr#14572 <https://github.com/ceph/ceph/pull/14572>`_, John Spray)
-* cephfs: mds is crushed, after I set about 400 64KB xattr kv pairs to a file (`issue#19674 <http://tracker.ceph.com/issues/19674>`_, `issue#19033 <http://tracker.ceph.com/issues/19033>`_, `pr#16103 <https://github.com/ceph/ceph/pull/16103>`_, Yang Honggang)
-* cephfs: MDS server crashes due to inconsistent metadata (`issue#19406 <http://tracker.ceph.com/issues/19406>`_, `issue#19620 <http://tracker.ceph.com/issues/19620>`_, `pr#14574 <https://github.com/ceph/ceph/pull/14574>`_, John Spray)
-* cephfs: mds/StrayManager: avoid reusing deleted inode in StrayManager::_purge_stray_logged (`issue#18950 <http://tracker.ceph.com/issues/18950>`_, `pr#14570 <https://github.com/ceph/ceph/pull/14570>`_, Zhi Zhang)
-* cephfs: mount point break off problem after mds switch (`issue#19667 <http://tracker.ceph.com/issues/19667>`_, `issue#19437 <http://tracker.ceph.com/issues/19437>`_, `pr#16100 <https://github.com/ceph/ceph/pull/16100>`_, Guan yunfei, Sage Weil)
-* cephfs: non-local quota changes not visible until some IO is done (`issue#17939 <http://tracker.ceph.com/issues/17939>`_, `issue#19763 <http://tracker.ceph.com/issues/19763>`_, `pr#16108 <https://github.com/ceph/ceph/pull/16108>`_, John Spray)
-* cephfs: No output for ceph mds rmfailed 0 --yes-i-really-mean-it command (`issue#19483 <http://tracker.ceph.com/issues/19483>`_, `issue#16709 <http://tracker.ceph.com/issues/16709>`_, `pr#14573 <https://github.com/ceph/ceph/pull/14573>`_, John Spray)
-* cephfs: normalize file open flags internally used by cephfs (`issue#19845 <http://tracker.ceph.com/issues/19845>`_, `pr#14998 <https://github.com/ceph/ceph/pull/14998>`_, Jan Fajerski)
-* cephfs: segfault in handle_client_caps (`issue#18306 <http://tracker.ceph.com/issues/18306>`_, `issue#18616 <http://tracker.ceph.com/issues/18616>`_, `pr#14566 <https://github.com/ceph/ceph/pull/14566>`_, Yan, Zheng)
-* cephfs: speed up readdir by skipping unwanted dn (`issue#18531 <http://tracker.ceph.com/issues/18531>`_, `pr#13028 <https://github.com/ceph/ceph/pull/13028>`_, Xiaoxi Chen)
-* cephfs: src/test/pybind/test_cephfs.py fails (`issue#20500 <http://tracker.ceph.com/issues/20500>`_, `issue#19890 <http://tracker.ceph.com/issues/19890>`_, `pr#16114 <https://github.com/ceph/ceph/pull/16114>`_, "Yan, Zheng")
-* cephfs: test_client_recovery.TestClientRecovery fails (`issue#18562 <http://tracker.ceph.com/issues/18562>`_, `issue#18396 <http://tracker.ceph.com/issues/18396>`_, `pr#14564 <https://github.com/ceph/ceph/pull/14564>`_, Yan, Zheng)
-* cephfs test failures (ceph.com/qa is broken, should be download.ceph.com/qa) (`issue#18574 <http://tracker.ceph.com/issues/18574>`_, `issue#18604 <http://tracker.ceph.com/issues/18604>`_, `pr#13024 <https://github.com/ceph/ceph/pull/13024>`_, John Spray)
-* cephfs: Test failure: test_data_isolated (tasks.cephfs.test_volume_client.TestVolumeClient) (`issue#18914 <http://tracker.ceph.com/issues/18914>`_, `issue#19676 <http://tracker.ceph.com/issues/19676>`_, `pr#16104 <https://github.com/ceph/ceph/pull/16104>`_, "Yan, Zheng")
-* cephfs: test_open_inode fails (`issue#18899 <http://tracker.ceph.com/issues/18899>`_, `issue#18661 <http://tracker.ceph.com/issues/18661>`_, `pr#14569 <https://github.com/ceph/ceph/pull/14569>`_, John Spray)
-* client: populate metadata during mount (`issue#18361 <http://tracker.ceph.com/issues/18361>`_, `issue#18540 <http://tracker.ceph.com/issues/18540>`_, `pr#12951 <https://github.com/ceph/ceph/pull/12951>`_, John Spray)
-* client: segfault on ceph_rmdir path / (`issue#18612 <http://tracker.ceph.com/issues/18612>`_, `issue#9935 <http://tracker.ceph.com/issues/9935>`_, `pr#13030 <https://github.com/ceph/ceph/pull/13030>`_, Michal Jarzabek)
-* cls_rbd: default initialize snapshot namespace for legacy clients (`issue#19413 <http://tracker.ceph.com/issues/19413>`_, `issue#19833 <http://tracker.ceph.com/issues/19833>`_, `pr#14934 <https://github.com/ceph/ceph/pull/14934>`_, Jason Dillaman)
-* cls/rgw: list_plain_entries() stops before bi_log entries (`issue#19876 <http://tracker.ceph.com/issues/19876>`_, `issue#20015 <http://tracker.ceph.com/issues/20015>`_, `pr#15384 <https://github.com/ceph/ceph/pull/15384>`_, Casey Bodley)
-* common: monitor creation with IPv6 public network segfaults (`issue#19465 <http://tracker.ceph.com/issues/19465>`_, `issue#19371 <http://tracker.ceph.com/issues/19371>`_, `pr#14323 <https://github.com/ceph/ceph/pull/14323>`_, Fabian Grünbichler)
-* common: possible lockdep false alarm for ThreadPool lock (`issue#18819 <http://tracker.ceph.com/issues/18819>`_, `issue#18894 <http://tracker.ceph.com/issues/18894>`_, `pr#13487 <https://github.com/ceph/ceph/pull/13487>`_, Mykola Golub)
-* core: api_misc: [  FAILED  ] LibRadosMiscConnectFailure.ConnectFailure (`issue#19561 <http://tracker.ceph.com/issues/19561>`_, `issue#15368 <http://tracker.ceph.com/issues/15368>`_, `pr#14733 <https://github.com/ceph/ceph/pull/14733>`_, Sage Weil)
-* core: bluestore bdev: flush no-op optimization is racy (`issue#20495 <http://tracker.ceph.com/issues/20495>`_, `issue#19326 <http://tracker.ceph.com/issues/19326>`_, `issue#19327 <http://tracker.ceph.com/issues/19327>`_, `issue#19250 <http://tracker.ceph.com/issues/19250>`_, `issue#19251 <http://tracker.ceph.com/issues/19251>`_, `pr#14736 <https://github.com/ceph/ceph/pull/14736>`_, Sage Weil)
-* core: improve control and throttling of the snap trimmer (`issue#19329 <http://tracker.ceph.com/issues/19329>`_, `issue#19931 <http://tracker.ceph.com/issues/19931>`_, `pr#14597 <https://github.com/ceph/ceph/pull/14597>`_, Samuel Just, Greg Farnum)
-* core: two instances of omap_digest mismatch (`issue#19391 <http://tracker.ceph.com/issues/19391>`_, `pr#14200 <https://github.com/ceph/ceph/pull/14200>`_, Samuel Just, David Zafman)
-* doc: PendingReleaseNotes: warning about 'osd rm ...' and #13733 (`issue#19119 <http://tracker.ceph.com/issues/19119>`_, `pr#14506 <https://github.com/ceph/ceph/pull/14506>`_, Sage Weil)
-* doc: Python Swift client commands in Quick Developer Guide don't match configuration in vstart.sh (`issue#17746 <http://tracker.ceph.com/issues/17746>`_, `issue#18571 <http://tracker.ceph.com/issues/18571>`_, `pr#13044 <https://github.com/ceph/ceph/pull/13044>`_, Ronak Jain)
-* doc: rgw: admin ops: fix the quota section (`issue#19397 <http://tracker.ceph.com/issues/19397>`_, `issue#19462 <http://tracker.ceph.com/issues/19462>`_, `pr#14521 <https://github.com/ceph/ceph/pull/14521>`_, Chu, Hua-Rong)
-* fix: rgw crashed caused by shard id out of range when listing data log (`issue#20156 <http://tracker.ceph.com/issues/20156>`_, `issue#19732 <http://tracker.ceph.com/issues/19732>`_, `pr#16173 <https://github.com/ceph/ceph/pull/16173>`_, redickwang)
-* fuse: TestVolumeClient.test_evict_client failure creating pidfile (`issue#18439 <http://tracker.ceph.com/issues/18439>`_, `issue#18309 <http://tracker.ceph.com/issues/18309>`_, `pr#12813 <https://github.com/ceph/ceph/pull/12813>`_, Nathan Cutler)
-* librbd: allow to open an image without opening parent image (`issue#18609 <http://tracker.ceph.com/issues/18609>`_, `issue#18325 <http://tracker.ceph.com/issues/18325>`_, `pr#13132 <https://github.com/ceph/ceph/pull/13132>`_, Ricardo Dias)
-* librbd: corrected resize RPC message backwards compatibility (`issue#19636 <http://tracker.ceph.com/issues/19636>`_, `issue#19659 <http://tracker.ceph.com/issues/19659>`_, `pr#14620 <https://github.com/ceph/ceph/pull/14620>`_, Jason Dillaman)
-* librbd: Incomplete declaration for ContextWQ in librbd/Journal.h (`issue#18862 <http://tracker.ceph.com/issues/18862>`_, `issue#18892 <http://tracker.ceph.com/issues/18892>`_, `pr#14153 <https://github.com/ceph/ceph/pull/14153>`_, Boris Ranto)
-* librbd: is_exclusive_lock_owner API should ping OSD (`issue#19467 <http://tracker.ceph.com/issues/19467>`_, `issue#19287 <http://tracker.ceph.com/issues/19287>`_, `pr#14480 <https://github.com/ceph/ceph/pull/14480>`_, Jason Dillaman)
-* librbd: possible race in ExclusiveLock handle_peer_notification (`issue#19368 <http://tracker.ceph.com/issues/19368>`_, `pr#14163 <https://github.com/ceph/ceph/pull/14163>`_, Mykola Golub)
-* librbd: prevent self-blacklisting during break lock (`issue#18703 <http://tracker.ceph.com/issues/18703>`_, `issue#18666 <http://tracker.ceph.com/issues/18666>`_, `pr#13201 <https://github.com/ceph/ceph/pull/13201>`_, Jason Dillaman)
-* make check fails with Error EIO: load dlopen(build/lib/libec_FAKE.so): build/lib/libec_FAKE.so: cannot open shared object file: No such file or directory (`issue#20487 <http://tracker.ceph.com/issues/20487>`_, `issue#20345 <http://tracker.ceph.com/issues/20345>`_, `issue#18876 <http://tracker.ceph.com/issues/18876>`_, `pr#16069 <https://github.com/ceph/ceph/pull/16069>`_, Kefu Chai, Kyr Shatskyy)
-* mds: assert fail when shutting down (`issue#19672 <http://tracker.ceph.com/issues/19672>`_, `issue#19204 <http://tracker.ceph.com/issues/19204>`_, `pr#16102 <https://github.com/ceph/ceph/pull/16102>`_, John Spray)
-* mds: C_MDSInternalNoop::complete doesn't free itself (`issue#19664 <http://tracker.ceph.com/issues/19664>`_, `issue#19501 <http://tracker.ceph.com/issues/19501>`_, `pr#16099 <https://github.com/ceph/ceph/pull/16099>`_, "Yan, Zheng")
-* mds: daemon goes readonly writing backtrace for a file whose data pool has been removed (`issue#19669 <http://tracker.ceph.com/issues/19669>`_, `issue#19401 <http://tracker.ceph.com/issues/19401>`_, `pr#16101 <https://github.com/ceph/ceph/pull/16101>`_, John Spray)
-* mds: damage reporting by ino number is useless (`issue#18509 <http://tracker.ceph.com/issues/18509>`_, `issue#19680 <http://tracker.ceph.com/issues/19680>`_, `pr#16106 <https://github.com/ceph/ceph/pull/16106>`_, John Spray)
-* mds: Decode errors on backtrace will crash MDS (`issue#18311 <http://tracker.ceph.com/issues/18311>`_, `issue#18463 <http://tracker.ceph.com/issues/18463>`_, `pr#12835 <https://github.com/ceph/ceph/pull/12835>`_, John Spray)
-* mds: enable daemon to start when session ino info is corrupt (`issue#19710 <http://tracker.ceph.com/issues/19710>`_, `issue#16842 <http://tracker.ceph.com/issues/16842>`_, `pr#16107 <https://github.com/ceph/ceph/pull/16107>`_, John Spray)
-* mds: failed filelock.can_read(-1) assertion in Server::_dir_is_nonempty (`issue#18707 <http://tracker.ceph.com/issues/18707>`_, `issue#18578 <http://tracker.ceph.com/issues/18578>`_, `pr#13555 <https://github.com/ceph/ceph/pull/13555>`_, Yan, Zheng)
-* mds: finish clientreplay requests before requesting active state (`issue#18678 <http://tracker.ceph.com/issues/18678>`_, `issue#18461 <http://tracker.ceph.com/issues/18461>`_, `pr#13112 <https://github.com/ceph/ceph/pull/13112>`_, Yan, Zheng)
-* mds: unresponsive when truncating a very large file (`issue#19755 <http://tracker.ceph.com/issues/19755>`_, `issue#20026 <http://tracker.ceph.com/issues/20026>`_, `pr#16190 <https://github.com/ceph/ceph/pull/16190>`_, "Yan, Zheng")
-* mon: cache tiering: base pool last_force_resend not respected (racing read got wrong version) (`issue#18366 <http://tracker.ceph.com/issues/18366>`_, `issue#18403 <http://tracker.ceph.com/issues/18403>`_, `pr#13116 <https://github.com/ceph/ceph/pull/13116>`_, Sage Weil)
-* mon crash on shutdown, lease_ack_timeout event (`issue#19928 <http://tracker.ceph.com/issues/19928>`_, `issue#19825 <http://tracker.ceph.com/issues/19825>`_, `pr#15084 <https://github.com/ceph/ceph/pull/15084>`_, Kefu Chai, Alexey Sheplyakov)
-* mon: fail to form large quorum; msg/async busy loop (`issue#20230 <http://tracker.ceph.com/issues/20230>`_, `issue#20315 <http://tracker.ceph.com/issues/20315>`_, `pr#15729 <https://github.com/ceph/ceph/pull/15729>`_, Haomai Wang)
-* mon: force_create_pg could leave pg stuck in creating state (`issue#19181 <http://tracker.ceph.com/issues/19181>`_, `issue#18298 <http://tracker.ceph.com/issues/18298>`_, `pr#13790 <https://github.com/ceph/ceph/pull/13790>`_, Adam C. Emerson, Sage Weil)
-* mon/MonClient: make get_mon_log_message() atomic (`issue#19618 <http://tracker.ceph.com/issues/19618>`_, `issue#19427 <http://tracker.ceph.com/issues/19427>`_, `pr#14588 <https://github.com/ceph/ceph/pull/14588>`_, Kefu Chai)
-* mon: 'osd crush move ...' doesnt work on osds (`issue#18682 <http://tracker.ceph.com/issues/18682>`_, `issue#18587 <http://tracker.ceph.com/issues/18587>`_, `pr#13500 <https://github.com/ceph/ceph/pull/13500>`_, Sage Weil)
-* mon: osd crush set crushmap need sanity check (`issue#19302 <http://tracker.ceph.com/issues/19302>`_, `issue#20365 <http://tracker.ceph.com/issues/20365>`_, `pr#16143 <https://github.com/ceph/ceph/pull/16143>`_, Loic Dachary)
-* mon: peon wrongly delete routed pg stats op before receive pg stats ack (`issue#18554 <http://tracker.ceph.com/issues/18554>`_, `issue#18458 <http://tracker.ceph.com/issues/18458>`_, `pr#13046 <https://github.com/ceph/ceph/pull/13046>`_, Mingxin Liu)
-* mon/PGMap: factor mon_osd_full_ratio into MAX AVAIL calc (`issue#18522 <http://tracker.ceph.com/issues/18522>`_, `issue#20035 <http://tracker.ceph.com/issues/20035>`_, `pr#15237 <https://github.com/ceph/ceph/pull/15237>`_, Sage Weil)
-* msg/simple/SimpleMessenger.cc: 239: FAILED assert(!cleared) (`issue#15784 <http://tracker.ceph.com/issues/15784>`_, `issue#18378 <http://tracker.ceph.com/issues/18378>`_, `pr#16133 <https://github.com/ceph/ceph/pull/16133>`_, Sage Weil)
-* multisite: rest api fails to decode large period on 'period commit' (`issue#19505 <http://tracker.ceph.com/issues/19505>`_, `issue#19616 <http://tracker.ceph.com/issues/19616>`_, `issue#19614 <http://tracker.ceph.com/issues/19614>`_, `issue#20244 <http://tracker.ceph.com/issues/20244>`_, `issue#19488 <http://tracker.ceph.com/issues/19488>`_, `issue#19776 <http://tracker.ceph.com/issues/19776>`_, `issue#20293 <http://tracker.ceph.com/issues/20293>`_, `issue#19746 <http://tracker.ceph.com/issues/19746>`_, `pr#16161 <https://github.com/ceph/ceph/pull/16161>`_, Casey Bodley, Abhishek Lekshmanan)
-* objecter: full_try behavior not consistent with osd (`issue#19560 <http://tracker.ceph.com/issues/19560>`_, `issue#19430 <http://tracker.ceph.com/issues/19430>`_, `pr#14732 <https://github.com/ceph/ceph/pull/14732>`_, Sage Weil)
-* ojecter: epoch_barrier isn't respected in _op_submit() (`issue#19396 <http://tracker.ceph.com/issues/19396>`_, `issue#19496 <http://tracker.ceph.com/issues/19496>`_, `pr#14331 <https://github.com/ceph/ceph/pull/14331>`_, Ilya Dryomov)
-* os/bluestore: deep decode onode value (`issue#20366 <http://tracker.ceph.com/issues/20366>`_, `pr#15792 <https://github.com/ceph/ceph/pull/15792>`_, Sage Weil)
-* os/bluestore: fix Allocator::allocate() int truncation (`issue#20884 <http://tracker.ceph.com/issues/20884>`_, `issue#18595 <http://tracker.ceph.com/issues/18595>`_, `pr#13011 <https://github.com/ceph/ceph/pull/13011>`_, Sage Weil)
-* osd: allow client throttler to be adjusted on-fly, without restart (`issue#18791 <http://tracker.ceph.com/issues/18791>`_, `issue#18793 <http://tracker.ceph.com/issues/18793>`_, `pr#13216 <https://github.com/ceph/ceph/pull/13216>`_, Piotr Dałek)
-* osd: An OSD was seen getting ENOSPC even with osd_failsafe_full_ratio passed (`issue#20544 <http://tracker.ceph.com/issues/20544>`_, `issue#16878 <http://tracker.ceph.com/issues/16878>`_, `issue#19340 <http://tracker.ceph.com/issues/19340>`_, `issue#19841 <http://tracker.ceph.com/issues/19841>`_, `issue#20672 <http://tracker.ceph.com/issues/20672>`_, `pr#16134 <https://github.com/ceph/ceph/pull/16134>`_, Sage Weil, David Zafman)
-* osd: bogus assert when checking acting set on recovery completion in rados/upgrade (`issue#18999 <http://tracker.ceph.com/issues/18999>`_, `pr#13542 <https://github.com/ceph/ceph/pull/13542>`_, Sage Weil)
-* osd: calc_clone_subsets misuses try_read_lock vs missing (`issue#18610 <http://tracker.ceph.com/issues/18610>`_, `issue#18583 <http://tracker.ceph.com/issues/18583>`_, `issue#18723 <http://tracker.ceph.com/issues/18723>`_, `issue#17831 <http://tracker.ceph.com/issues/17831>`_, `pr#14616 <https://github.com/ceph/ceph/pull/14616>`_, Samuel Just)
-* osd: ceph degraded and misplaced status output inaccurate (`issue#18619 <http://tracker.ceph.com/issues/18619>`_, `issue#19480 <http://tracker.ceph.com/issues/19480>`_, `pr#14322 <https://github.com/ceph/ceph/pull/14322>`_, David Zafman)
-* osd: condition object_info_t encoding on required (not up) features (`issue#18842 <http://tracker.ceph.com/issues/18842>`_, `issue#18831 <http://tracker.ceph.com/issues/18831>`_, `issue#18814 <http://tracker.ceph.com/issues/18814>`_, `pr#13485 <https://github.com/ceph/ceph/pull/13485>`_, Ilya Dryomov)
-* osd: do not send ENXIO on misdirected op by default (`issue#19622 <http://tracker.ceph.com/issues/19622>`_, `pr#13253 <https://github.com/ceph/ceph/pull/13253>`_, Sage Weil)
-* osd: FAILED assert(object_contexts.empty()) (live on master only from Jan-Feb 2017, all other instances are different) (`issue#20522 <http://tracker.ceph.com/issues/20522>`_, `issue#20523 <http://tracker.ceph.com/issues/20523>`_, `issue#18927 <http://tracker.ceph.com/issues/18927>`_, `issue#18809 <http://tracker.ceph.com/issues/18809>`_, `pr#16132 <https://github.com/ceph/ceph/pull/16132>`_, Samuel Just)
-* osd: --flush-journal: sporadic segfaults on exit (`issue#18952 <http://tracker.ceph.com/issues/18952>`_, `issue#18820 <http://tracker.ceph.com/issues/18820>`_, `pr#13490 <https://github.com/ceph/ceph/pull/13490>`_, Alexey Sheplyakov)
-* osd: Give requested scrubs a higher priority (`issue#19685 <http://tracker.ceph.com/issues/19685>`_, `issue#15789 <http://tracker.ceph.com/issues/15789>`_, `pr#14735 <https://github.com/ceph/ceph/pull/14735>`_, David Zafman)
-* osd: Implement asynchronous scrub sleep (`issue#20033 <http://tracker.ceph.com/issues/20033>`_, `issue#19986 <http://tracker.ceph.com/issues/19986>`_, `issue#20173 <http://tracker.ceph.com/issues/20173>`_, `issue#19497 <http://tracker.ceph.com/issues/19497>`_, `pr#15526 <https://github.com/ceph/ceph/pull/15526>`_, Brad Hubbard)
-* osd: leaked MOSDMap (`issue#19760 <http://tracker.ceph.com/issues/19760>`_, `issue#18293 <http://tracker.ceph.com/issues/18293>`_, `pr#14942 <https://github.com/ceph/ceph/pull/14942>`_, Sage Weil)
-* osd: leveldb corruption leads to Operation not permitted not handled and assert (`issue#18037 <http://tracker.ceph.com/issues/18037>`_, `issue#18418 <http://tracker.ceph.com/issues/18418>`_, `pr#12790 <https://github.com/ceph/ceph/pull/12790>`_, Nathan Cutler)
-* osd: metadata reports filestore when using bluestore (`issue#18677 <http://tracker.ceph.com/issues/18677>`_, `issue#18638 <http://tracker.ceph.com/issues/18638>`_, `pr#16083 <https://github.com/ceph/ceph/pull/16083>`_, Wido den Hollander)
-* osd: New added OSD always down when full flag is set (`issue#19485 <http://tracker.ceph.com/issues/19485>`_, `pr#14321 <https://github.com/ceph/ceph/pull/14321>`_, Mingxin Liu)
-* osd: Object level shard errors are tracked and used if no auth available (`issue#20089 <http://tracker.ceph.com/issues/20089>`_, `pr#15421 <https://github.com/ceph/ceph/pull/15421>`_, David Zafman)
-* osd: os/bluestore: fix statfs to not include DB partition in free space (`issue#18599 <http://tracker.ceph.com/issues/18599>`_, `issue#18722 <http://tracker.ceph.com/issues/18722>`_, `pr#13284 <https://github.com/ceph/ceph/pull/13284>`_, Sage Weil)
-* osd: osd/PrimaryLogPG: do not call on_shutdown() if (pg.deleting) (`issue#19902 <http://tracker.ceph.com/issues/19902>`_, `issue#19916 <http://tracker.ceph.com/issues/19916>`_, `pr#15066 <https://github.com/ceph/ceph/pull/15066>`_, Kefu Chai)
-* osd: pg log split does not rebuild index for parent or child (`issue#19315 <http://tracker.ceph.com/issues/19315>`_, `issue#18975 <http://tracker.ceph.com/issues/18975>`_, `pr#14048 <https://github.com/ceph/ceph/pull/14048>`_, Sage Weil)
-* osd: pglog: with config, don't assert in the presence of stale diverg… (`issue#17916 <http://tracker.ceph.com/issues/17916>`_, `issue#19702 <http://tracker.ceph.com/issues/19702>`_, `pr#14646 <https://github.com/ceph/ceph/pull/14646>`_, Greg Farnum)
-* osd: publish PG stats when backfill-related states change (`issue#18497 <http://tracker.ceph.com/issues/18497>`_, `issue#18369 <http://tracker.ceph.com/issues/18369>`_, `pr#13295 <https://github.com/ceph/ceph/pull/13295>`_, Sage Weil)
-* osd: Revert "PrimaryLogPG::failed_push: update missing as well" (`issue#18659 <http://tracker.ceph.com/issues/18659>`_, `pr#13091 <https://github.com/ceph/ceph/pull/13091>`_, David Zafman)
-* osd: unlock sdata_op_ordering_lock with sdata_lock hold to avoid missing wakeup signal (`issue#20443 <http://tracker.ceph.com/issues/20443>`_, `pr#15962 <https://github.com/ceph/ceph/pull/15962>`_, Alexey Sheplyakov)
-* pre-jewel "osd rm" incrementals are misinterpreted (`issue#19209 <http://tracker.ceph.com/issues/19209>`_, `issue#19119 <http://tracker.ceph.com/issues/19119>`_, `pr#13883 <https://github.com/ceph/ceph/pull/13883>`_, Ilya Dryomov)
-* rbd: Add missing parameter feedback to 'rbd snap limit' (`issue#18601 <http://tracker.ceph.com/issues/18601>`_, `pr#14537 <https://github.com/ceph/ceph/pull/14537>`_, Tang Jin)
-* rbd: [api] is_exclusive_lock_owner shouldn't return -EBUSY (`issue#20266 <http://tracker.ceph.com/issues/20266>`_, `issue#20182 <http://tracker.ceph.com/issues/20182>`_, `pr#16187 <https://github.com/ceph/ceph/pull/16187>`_, Jason Dillaman)
-* rbd: [api] temporarily restrict (rbd\_)mirror_peer_add from adding multiple peers (`issue#19256 <http://tracker.ceph.com/issues/19256>`_, `issue#19324 <http://tracker.ceph.com/issues/19324>`_, `pr#14545 <https://github.com/ceph/ceph/pull/14545>`_, Jason Dillaman)
-* rbd: attempting to remove an image with incompatible features results in partial removal (`issue#18456 <http://tracker.ceph.com/issues/18456>`_, `issue#18315 <http://tracker.ceph.com/issues/18315>`_, `pr#13247 <https://github.com/ceph/ceph/pull/13247>`_, Dongsheng Yang)
-* rbd: [cli] ensure positional arguments exist before casting (`issue#20264 <http://tracker.ceph.com/issues/20264>`_, `issue#20185 <http://tracker.ceph.com/issues/20185>`_, `pr#16186 <https://github.com/ceph/ceph/pull/16186>`_, Jason Dillaman)
-* rbd: cli: map with cephx disabled results in error message (`issue#19035 <http://tracker.ceph.com/issues/19035>`_, `issue#20517 <http://tracker.ceph.com/issues/20517>`_, `pr#16298 <https://github.com/ceph/ceph/pull/16298>`_, Jason Dillaman)
-* rbd: [  FAILED  ] TestJournalTrimmer.RemoveObjectsWithOtherClient (`issue#18769 <http://tracker.ceph.com/issues/18769>`_, `issue#18738 <http://tracker.ceph.com/issues/18738>`_, `pr#14147 <https://github.com/ceph/ceph/pull/14147>`_, Jason Dillaman)
-* rbd: Improve compatibility between librbd + krbd for the data pool (`issue#18771 <http://tracker.ceph.com/issues/18771>`_, `issue#18653 <http://tracker.ceph.com/issues/18653>`_, `pr#14539 <https://github.com/ceph/ceph/pull/14539>`_, Jason Dillaman)
-* rbd: Issues with C API image metadata retrieval functions (`issue#19588 <http://tracker.ceph.com/issues/19588>`_, `issue#19611 <http://tracker.ceph.com/issues/19611>`_, `pr#15612 <https://github.com/ceph/ceph/pull/15612>`_, Mykola Golub)
-* rbd: 'metadata_set' API operation should not change global config setting (`issue#18465 <http://tracker.ceph.com/issues/18465>`_, `issue#18549 <http://tracker.ceph.com/issues/18549>`_, `pr#14534 <https://github.com/ceph/ceph/pull/14534>`_, Mykola Golub)
-* rbd-mirror: additional test stability improvements (`issue#18935 <http://tracker.ceph.com/issues/18935>`_, `issue#18947 <http://tracker.ceph.com/issues/18947>`_, `pr#14155 <https://github.com/ceph/ceph/pull/14155>`_, Jason Dillaman)
-* rbd-mirror: deleting a snapshot during sync can result in read errors (`issue#19037 <http://tracker.ceph.com/issues/19037>`_, `issue#18990 <http://tracker.ceph.com/issues/18990>`_, `pr#14622 <https://github.com/ceph/ceph/pull/14622>`_, Jason Dillaman)
-* rbd-mirror: ensure missing images are re-synced when detected (`issue#20022 <http://tracker.ceph.com/issues/20022>`_, `issue#19811 <http://tracker.ceph.com/issues/19811>`_, `pr#15486 <https://github.com/ceph/ceph/pull/15486>`_, Jason Dillaman)
-* rbd-mirror: failover and failback of unmodified image results in split-brain (`issue#19872 <http://tracker.ceph.com/issues/19872>`_, `issue#19858 <http://tracker.ceph.com/issues/19858>`_, `pr#14974 <https://github.com/ceph/ceph/pull/14974>`_, Jason Dillaman)
-* rbd-mirror: potential race mirroring cloned image (`issue#18501 <http://tracker.ceph.com/issues/18501>`_, `issue#17993 <http://tracker.ceph.com/issues/17993>`_, `pr#14533 <https://github.com/ceph/ceph/pull/14533>`_, Jason Dillaman)
-* rbd-mirror: sporadic image replayer shut down failure (`issue#18493 <http://tracker.ceph.com/issues/18493>`_, `issue#18441 <http://tracker.ceph.com/issues/18441>`_, `pr#14531 <https://github.com/ceph/ceph/pull/14531>`_, Jason Dillaman)
-* rbd-nbd: add signal handler (`issue#19621 <http://tracker.ceph.com/issues/19621>`_, `issue#19349 <http://tracker.ceph.com/issues/19349>`_, `pr#16098 <https://github.com/ceph/ceph/pull/16098>`_, Kefu Chai, Pan Liu)
-* rbd-nbd: check /sys/block/nbdX/size to ensure kernel mapped correctly (`issue#18970 <http://tracker.ceph.com/issues/18970>`_, `issue#17951 <http://tracker.ceph.com/issues/17951>`_, `issue#18910 <http://tracker.ceph.com/issues/18910>`_, `issue#18335 <http://tracker.ceph.com/issues/18335>`_, `pr#14540 <https://github.com/ceph/ceph/pull/14540>`_, Mykola Golub, Pan Liu)
-* rbd: Possible deadlock performing a synchronous API action while refresh in-progress (`issue#18495 <http://tracker.ceph.com/issues/18495>`_, `issue#18419 <http://tracker.ceph.com/issues/18419>`_, `pr#14532 <https://github.com/ceph/ceph/pull/14532>`_, Jason Dillaman)
-* rbd: Potential IO hang if image is flattened while read request is in-flight (`issue#19832 <http://tracker.ceph.com/issues/19832>`_, `issue#20154 <http://tracker.ceph.com/issues/20154>`_, `pr#16184 <https://github.com/ceph/ceph/pull/16184>`_, Jason Dillaman)
-* rbd: [qa] crash in journal-enabled fsx run (`issue#18618 <http://tracker.ceph.com/issues/18618>`_, `issue#18632 <http://tracker.ceph.com/issues/18632>`_, `pr#14538 <https://github.com/ceph/ceph/pull/14538>`_, Jason Dillaman)
-* rbd: qemu crash triggered by network issues (`issue#18776 <http://tracker.ceph.com/issues/18776>`_, `issue#18436 <http://tracker.ceph.com/issues/18436>`_, `pr#13245 <https://github.com/ceph/ceph/pull/13245>`_, Jason Dillaman)
-* rbd: 'rbd bench-write' will crash if --io-size is 4G (`issue#18422 <http://tracker.ceph.com/issues/18422>`_, `issue#18557 <http://tracker.ceph.com/issues/18557>`_, `pr#14536 <https://github.com/ceph/ceph/pull/14536>`_, Gaurav Kumar Garg)
-* rbd: rbd_clone_copy_on_read ineffective with exclusive-lock (`issue#19173 <http://tracker.ceph.com/issues/19173>`_, `issue#18888 <http://tracker.ceph.com/issues/18888>`_, `pr#14543 <https://github.com/ceph/ceph/pull/14543>`_, Venky Shankar)
-* rbd: rbd --pool=x rename y z does not work (`issue#18777 <http://tracker.ceph.com/issues/18777>`_, `issue#18326 <http://tracker.ceph.com/issues/18326>`_, `pr#14149 <https://github.com/ceph/ceph/pull/14149>`_, Gaurav Kumar Garg)
-* rbd: refuse to use an ec pool that doesn't support overwrites (`issue#19081 <http://tracker.ceph.com/issues/19081>`_, `issue#19336 <http://tracker.ceph.com/issues/19336>`_, `pr#16096 <https://github.com/ceph/ceph/pull/16096>`_, Jason Dillaman)
-* rgw: add apis to support ragweed suite (`issue#19809 <http://tracker.ceph.com/issues/19809>`_, `pr#14852 <https://github.com/ceph/ceph/pull/14852>`_, Yehuda Sadeh)
-* rgw: add the remove-x-delete feature to cancel swift object expiration (`issue#19472 <http://tracker.ceph.com/issues/19472>`_, `issue#19074 <http://tracker.ceph.com/issues/19074>`_, `pr#14522 <https://github.com/ceph/ceph/pull/14522>`_, Jing Wenjun)
-* rgw: a few cases where rgw_obj is incorrectly initialized (`issue#19146 <http://tracker.ceph.com/issues/19146>`_, `issue#19096 <http://tracker.ceph.com/issues/19096>`_, `pr#13843 <https://github.com/ceph/ceph/pull/13843>`_, Yehuda Sadeh)
-* rgw: anonymous user error code of getting object is not consistent with SWIFT (`issue#18806 <http://tracker.ceph.com/issues/18806>`_, `issue#19178 <http://tracker.ceph.com/issues/19178>`_, `pr#13877 <https://github.com/ceph/ceph/pull/13877>`_, Jing Wenjun)
-* rgw: civetweb frontend segfaults in Luminous (`issue#19749 <http://tracker.ceph.com/issues/19749>`_, `issue#19840 <http://tracker.ceph.com/issues/19840>`_, `pr#16166 <https://github.com/ceph/ceph/pull/16166>`_, Abhishek Lekshmanan, Jesse Williamson)
-* rgw: civetweb: move to post 1.8 version (`issue#19704 <http://tracker.ceph.com/issues/19704>`_, `pr#14960 <https://github.com/ceph/ceph/pull/14960>`_, Yehuda Sadeh)
-* rgw: "cluster [WRN] bad locator @X on object @X...." in cluster log (`issue#19212 <http://tracker.ceph.com/issues/19212>`_, `issue#18980 <http://tracker.ceph.com/issues/18980>`_, `pr#14065 <https://github.com/ceph/ceph/pull/14065>`_, Casey Bodley)
-* rgw: crash when updating period with placement group (`issue#18772 <http://tracker.ceph.com/issues/18772>`_, `issue#18631 <http://tracker.ceph.com/issues/18631>`_, `pr#14511 <https://github.com/ceph/ceph/pull/14511>`_, Orit Wasserman)
-* rgw: Custom data header support (`issue#19843 <http://tracker.ceph.com/issues/19843>`_, `pr#15985 <https://github.com/ceph/ceph/pull/15985>`_, Pavan Rallabhandi)
-* rgw: datalog trim can't work as expected (`issue#20263 <http://tracker.ceph.com/issues/20263>`_, `issue#20190 <http://tracker.ceph.com/issues/20190>`_, `pr#16175 <https://github.com/ceph/ceph/pull/16175>`_, Zhang Shaowen)
-* rgw: DUMPABLE flag is cleared by setuid preventing coredumps (`issue#19147 <http://tracker.ceph.com/issues/19147>`_, `issue#19089 <http://tracker.ceph.com/issues/19089>`_, `pr#13845 <https://github.com/ceph/ceph/pull/13845>`_, Brad Hubbard)
-* rgw: Error parsing xml when get bucket lifecycle (`issue#19363 <http://tracker.ceph.com/issues/19363>`_, `issue#19534 <http://tracker.ceph.com/issues/19534>`_, `pr#14528 <https://github.com/ceph/ceph/pull/14528>`_, liuchang0812)
-* rgw: first write also tries to read object (`issue#18904 <http://tracker.ceph.com/issues/18904>`_, `issue#18622 <http://tracker.ceph.com/issues/18622>`_, `issue#18623 <http://tracker.ceph.com/issues/18623>`_, `issue#18621 <http://tracker.ceph.com/issues/18621>`_, `pr#14515 <https://github.com/ceph/ceph/pull/14515>`_, Yehuda Sadeh)
-* rgw: fix break inside of yield in RGWFetchAllMetaCR (`issue#19322 <http://tracker.ceph.com/issues/19322>`_, `issue#17655 <http://tracker.ceph.com/issues/17655>`_, `pr#14067 <https://github.com/ceph/ceph/pull/14067>`_, Casey Bodley)
-* rgw: fix handling RGWUserInfo::system in RGWHandler_REST_SWIFT (`issue#18476 <http://tracker.ceph.com/issues/18476>`_, `pr#13006 <https://github.com/ceph/ceph/pull/13006>`_, Radoslaw Zarzynski)
-* rgw: fix RadosGW hang during multi-chunk upload of AWSv4 (`issue#19837 <http://tracker.ceph.com/issues/19837>`_, `issue#19754 <http://tracker.ceph.com/issues/19754>`_, `pr#14939 <https://github.com/ceph/ceph/pull/14939>`_, Radoslaw Zarzynski)
-* rgw: fix use of marker in List::list_objects() (`issue#19047 <http://tracker.ceph.com/issues/19047>`_, `issue#18331 <http://tracker.ceph.com/issues/18331>`_, `pr#14517 <https://github.com/ceph/ceph/pull/14517>`_, Yehuda Sadeh)
-* rgw: 'gc list --include-all' command infinite loop the first 1000 items (`issue#19978 <http://tracker.ceph.com/issues/19978>`_, `issue#20147 <http://tracker.ceph.com/issues/20147>`_, `pr#16139 <https://github.com/ceph/ceph/pull/16139>`_, Shasha Lu, fang yuxiang)
-* rgw: get wrong content when download object with specific range when compression was enabled (`issue#20100 <http://tracker.ceph.com/issues/20100>`_, `issue#20268 <http://tracker.ceph.com/issues/20268>`_, `pr#16178 <https://github.com/ceph/ceph/pull/16178>`_, fang yuxiang)
-* rgw: health check errors out incorrectly (`issue#19025 <http://tracker.ceph.com/issues/19025>`_, `issue#19157 <http://tracker.ceph.com/issues/19157>`_, `pr#13866 <https://github.com/ceph/ceph/pull/13866>`_, Pavan Rallabhandi)
-* rgw: Lifecycle thread will still handle the bucket even if it has been removed (`issue#20285 <http://tracker.ceph.com/issues/20285>`_, `issue#20405 <http://tracker.ceph.com/issues/20405>`_, `pr#16183 <https://github.com/ceph/ceph/pull/16183>`_, Zhang Shaowen)
-* rgw: make sending Content-Length in 204 and 304 controllable (`issue#18985 <http://tracker.ceph.com/issues/18985>`_, `issue#16602 <http://tracker.ceph.com/issues/16602>`_, `pr#13514 <https://github.com/ceph/ceph/pull/13514>`_, Radoslaw Zarzynski)
-* rgw: meta sync thread crash at RGWMetaSyncShardCR (`issue#20251 <http://tracker.ceph.com/issues/20251>`_, `issue#20347 <http://tracker.ceph.com/issues/20347>`_, `pr#16180 <https://github.com/ceph/ceph/pull/16180>`_, Fang Yuxiang, Nathan Cutler)
-* rgw: multisite: after CreateBucket is forwarded to master, local bucket may use different value for bucket index shards (`issue#19745 <http://tracker.ceph.com/issues/19745>`_, `issue#19759 <http://tracker.ceph.com/issues/19759>`_, `pr#16290 <https://github.com/ceph/ceph/pull/16290>`_, Shasha Lu)
-* rgw: multisite: EPERM when trying to read SLO objects as system/admin user (`issue#19027 <http://tracker.ceph.com/issues/19027>`_, `issue#19475 <http://tracker.ceph.com/issues/19475>`_, `pr#14523 <https://github.com/ceph/ceph/pull/14523>`_, Casey Bodley)
-* rgw: multisite: fetch_remote_obj() gets wrong version when copying from remote (`issue#19608 <http://tracker.ceph.com/issues/19608>`_, `pr#14606 <https://github.com/ceph/ceph/pull/14606>`_, Zhang Shaowen, Casey Bodley)
-* rgw: multisite: RGWMetaSyncShardControlCR gives up on EIO (`issue#19160 <http://tracker.ceph.com/issues/19160>`_, `issue#19019 <http://tracker.ceph.com/issues/19019>`_, `pr#13868 <https://github.com/ceph/ceph/pull/13868>`_, Casey Bodley)
-* rgw: multisite: segfault after changing value of rgw_data_log_num_shards (`issue#18488 <http://tracker.ceph.com/issues/18488>`_, `issue#18548 <http://tracker.ceph.com/issues/18548>`_, `pr#13181 <https://github.com/ceph/ceph/pull/13181>`_, Casey Bodley)
-* rgw: multisite: some 'radosgw-admin data sync' commands hang (`issue#19236 <http://tracker.ceph.com/issues/19236>`_, `issue#19354 <http://tracker.ceph.com/issues/19354>`_, `pr#14142 <https://github.com/ceph/ceph/pull/14142>`_, Shasha Lu)
-* rgw: multisite: some yields in RGWMetaSyncShardCR::full_sync() resume in incremental_sync() (`issue#19049 <http://tracker.ceph.com/issues/19049>`_, `issue#18076 <http://tracker.ceph.com/issues/18076>`_, `pr#13838 <https://github.com/ceph/ceph/pull/13838>`_, Casey Bodley)
-* rgw: multisite: sync status reports master is on a different period (`issue#18709 <http://tracker.ceph.com/issues/18709>`_, `issue#18064 <http://tracker.ceph.com/issues/18064>`_, `pr#13176 <https://github.com/ceph/ceph/pull/13176>`_, Abhishek Lekshmanan)
-* rgw: no http referer info in container metadata dump in swift API (`issue#18665 <http://tracker.ceph.com/issues/18665>`_, `issue#18898 <http://tracker.ceph.com/issues/18898>`_, `pr#13829 <https://github.com/ceph/ceph/pull/13829>`_, Jing Wenjun)
-* rgw: "period update" does not remove short_zone_ids of deleted zones (`issue#15618 <http://tracker.ceph.com/issues/15618>`_, `issue#19342 <http://tracker.ceph.com/issues/19342>`_, `pr#14141 <https://github.com/ceph/ceph/pull/14141>`_, Casey Bodley)
-* rgw: radosgw-admin: add the 'object stat' command to usage (`issue#19164 <http://tracker.ceph.com/issues/19164>`_, `issue#19013 <http://tracker.ceph.com/issues/19013>`_, `pr#13873 <https://github.com/ceph/ceph/pull/13873>`_, Pavan Rallabhandi)
-* rgw: radosgw-admin period update reverts deleted zonegroup (`issue#18713 <http://tracker.ceph.com/issues/18713>`_, `issue#17239 <http://tracker.ceph.com/issues/17239>`_, `pr#13172 <https://github.com/ceph/ceph/pull/13172>`_, Orit Wasserman)
-* rgw: 'radosgw-admin usage show' listing 0 bytes_sent/received (`issue#20261 <http://tracker.ceph.com/issues/20261>`_, `pr#16174 <https://github.com/ceph/ceph/pull/16174>`_, Pritha Srivastava)
-* rgw: 'radosgw-admin zone create' command with specified zone-id creates a zone with different id (`issue#19524 <http://tracker.ceph.com/issues/19524>`_, `issue#19498 <http://tracker.ceph.com/issues/19498>`_, `pr#14526 <https://github.com/ceph/ceph/pull/14526>`_, Orit Wasserman)
-* rgw: Realm set does not create a new period (`issue#18333 <http://tracker.ceph.com/issues/18333>`_, `issue#18499 <http://tracker.ceph.com/issues/18499>`_, `pr#14509 <https://github.com/ceph/ceph/pull/14509>`_, Orit Wasserman)
-* rgw: reduce log level of 'storing entry at' in cls_log (`issue#19835 <http://tracker.ceph.com/issues/19835>`_, `issue#19839 <http://tracker.ceph.com/issues/19839>`_, `pr#16165 <https://github.com/ceph/ceph/pull/16165>`_, Willem Jan Withagen)
-* rgw: Response header of swift API returned by radosgw does not contain x-openstack-request-id. But Swift returns it (`issue#19443 <http://tracker.ceph.com/issues/19443>`_, `issue#19573 <http://tracker.ceph.com/issues/19573>`_, `pr#14529 <https://github.com/ceph/ceph/pull/14529>`_, tone-zhang)
-* rgw: rgw_file: fix marker computation (`issue#20158 <http://tracker.ceph.com/issues/20158>`_, `issue#19526 <http://tracker.ceph.com/issues/19526>`_, `issue#18989 <http://tracker.ceph.com/issues/18989>`_, `issue#19470 <http://tracker.ceph.com/issues/19470>`_, `issue#19471 <http://tracker.ceph.com/issues/19471>`_, `issue#18651 <http://tracker.ceph.com/issues/18651>`_, `issue#20195 <http://tracker.ceph.com/issues/20195>`_, `issue#19059 <http://tracker.ceph.com/issues/19059>`_, `issue#19112 <http://tracker.ceph.com/issues/19112>`_, `issue#19018 <http://tracker.ceph.com/issues/19018>`_, `issue#19036 <http://tracker.ceph.com/issues/19036>`_, `issue#19154 <http://tracker.ceph.com/issues/19154>`_, `issue#19170 <http://tracker.ceph.com/issues/19170>`_, `issue#19663 <http://tracker.ceph.com/issues/19663>`_, `issue#19661 <http://tracker.ceph.com/issues/19661>`_, `issue#19111 <http://tracker.ceph.com/issues/19111>`_, `issue#18992 <http://tracker.ceph.com/issues/18992>`_, `issue#18650 <http://tracker.ceph.com/issues/18650>`_, `issue#18991 <http://tracker.ceph.com/issues/18991>`_, `issue#19623 <http://tracker.ceph.com/issues/19623>`_, `issue#19149 <http://tracker.ceph.com/issues/19149>`_, `issue#19270 <http://tracker.ceph.com/issues/19270>`_, `issue#19723 <http://tracker.ceph.com/issues/19723>`_, `issue#19625 <http://tracker.ceph.com/issues/19625>`_, `issue#19624 <http://tracker.ceph.com/issues/19624>`_, `issue#19060 <http://tracker.ceph.com/issues/19060>`_, `issue#19166 <http://tracker.ceph.com/issues/19166>`_, `issue#18810 <http://tracker.ceph.com/issues/18810>`_, `issue#19168 <http://tracker.ceph.com/issues/19168>`_, `issue#19162 <http://tracker.ceph.com/issues/19162>`_, `issue#19066 <http://tracker.ceph.com/issues/19066>`_, `issue#18808 <http://tracker.ceph.com/issues/18808>`_, `issue#19634 <http://tracker.ceph.com/issues/19634>`_, `issue#19435 <http://tracker.ceph.com/issues/19435>`_, `issue#19144 <http://tracker.ceph.com/issues/19144>`_, `issue#19229 <http://tracker.ceph.com/issues/19229>`_, `issue#18902 <http://tracker.ceph.com/issues/18902>`_, `pr#13871 <https://github.com/ceph/ceph/pull/13871>`_, Gui Hecheng, Matt Benjamin)
-* rgw: S3 create bucket should not do response in json (`issue#19172 <http://tracker.ceph.com/issues/19172>`_, `issue#18889 <http://tracker.ceph.com/issues/18889>`_, `pr#13875 <https://github.com/ceph/ceph/pull/13875>`_, Abhishek Lekshmanan)
-* rgw: S3 v4 authentication issue with X-Amz-Expires (`issue#19477 <http://tracker.ceph.com/issues/19477>`_, `issue#18828 <http://tracker.ceph.com/issues/18828>`_, `pr#14524 <https://github.com/ceph/ceph/pull/14524>`_, liuchang0812)
-* rgw: S3 v4 authentication issue with X-Amz-Expires (`issue#19725 <http://tracker.ceph.com/issues/19725>`_, `issue#18828 <http://tracker.ceph.com/issues/18828>`_, `pr#16162 <https://github.com/ceph/ceph/pull/16162>`_, liuchang0812)
-* rgw: should parse the url to http host to compare with the container referer acl (`issue#18896 <http://tracker.ceph.com/issues/18896>`_, `issue#18685 <http://tracker.ceph.com/issues/18685>`_, `pr#13780 <https://github.com/ceph/ceph/pull/13780>`_, Jing Wenjun)
-* rgw: slave zonegroup cannot enable the bucket versioning (`issue#18711 <http://tracker.ceph.com/issues/18711>`_, `issue#18003 <http://tracker.ceph.com/issues/18003>`_, `pr#13174 <https://github.com/ceph/ceph/pull/13174>`_, Orit Wasserman)
-* rgw: Swift API: spurious newline after http body causes weird errors (`issue#18780 <http://tracker.ceph.com/issues/18780>`_, `issue#18473 <http://tracker.ceph.com/issues/18473>`_, `pr#13224 <https://github.com/ceph/ceph/pull/13224>`_, Marcus Watts, Matt Benjamin)
-* rgw: swift API: cannot disable object versioning with empty X-Versions-Location (`issue#18852 <http://tracker.ceph.com/issues/18852>`_, `issue#19175 <http://tracker.ceph.com/issues/19175>`_, `pr#14519 <https://github.com/ceph/ceph/pull/14519>`_, Jing Wenjun)
-* rgw: swift: disable revocation thread under certain circumstances (`issue#19499 <http://tracker.ceph.com/issues/19499>`_, `issue#9493 <http://tracker.ceph.com/issues/9493>`_, `issue#19777 <http://tracker.ceph.com/issues/19777>`_, `pr#16164 <https://github.com/ceph/ceph/pull/16164>`_, Marcus Watts)
-* rgw: Swift's at-root features (/crossdomain.xml, /info, /healthcheck) are broken (`issue#20031 <http://tracker.ceph.com/issues/20031>`_, `issue#19520 <http://tracker.ceph.com/issues/19520>`_, `pr#16168 <https://github.com/ceph/ceph/pull/16168>`_, Radoslaw Zarzynski)
-* rgw: the swift container acl does not support field .ref (`issue#18909 <http://tracker.ceph.com/issues/18909>`_, `issue#19180 <http://tracker.ceph.com/issues/19180>`_, `issue#18484 <http://tracker.ceph.com/issues/18484>`_, `issue#18796 <http://tracker.ceph.com/issues/18796>`_, `pr#14516 <https://github.com/ceph/ceph/pull/14516>`_, Jing Wenjun, Radoslaw Zarzynski)
-* rgw: typo in rgw_admin.cc (`issue#19156 <http://tracker.ceph.com/issues/19156>`_, `issue#19026 <http://tracker.ceph.com/issues/19026>`_, `pr#13864 <https://github.com/ceph/ceph/pull/13864>`_, Ronak Jain)
-* rgw: unsafe access in RGWListBucket_ObjStore_SWIFT::send_response() (`issue#19574 <http://tracker.ceph.com/issues/19574>`_, `issue#19249 <http://tracker.ceph.com/issues/19249>`_, `pr#14530 <https://github.com/ceph/ceph/pull/14530>`_, Yehuda Sadeh)
-* rgw: upgrade to multisite v2 fails if there is a zone without zone info (`issue#19331 <http://tracker.ceph.com/issues/19331>`_, `issue#19231 <http://tracker.ceph.com/issues/19231>`_, `pr#14137 <https://github.com/ceph/ceph/pull/14137>`_, Danny Al-Gaaf, Orit Wasserman)
-* rgw: usage stats and quota are not operational for multi-tenant users (`issue#18364 <http://tracker.ceph.com/issues/18364>`_, `issue#18843 <http://tracker.ceph.com/issues/18843>`_, `issue#16355 <http://tracker.ceph.com/issues/16355>`_, `pr#14513 <https://github.com/ceph/ceph/pull/14513>`_, Radoslaw Zarzynski)
-* rgw: Use decoded URI when verifying TempURL (`issue#18590 <http://tracker.ceph.com/issues/18590>`_, `issue#18627 <http://tracker.ceph.com/issues/18627>`_, `pr#12986 <https://github.com/ceph/ceph/pull/12986>`_, Michal Koutný)
-* rgw: VersionIdMarker and NextVersionIdMarker are not returned when listing object versions (`issue#20363 <http://tracker.ceph.com/issues/20363>`_, `issue#19886 <http://tracker.ceph.com/issues/19886>`_, `pr#16181 <https://github.com/ceph/ceph/pull/16181>`_, Zhang Shaowen)
-* rgw: when converting region_map we need to use rgw_zone_root_pool (`issue#19195 <http://tracker.ceph.com/issues/19195>`_, `issue#19356 <http://tracker.ceph.com/issues/19356>`_, `pr#14144 <https://github.com/ceph/ceph/pull/14144>`_, Orit Wasserman)
-* rgw: when uploading the objects continuesly in the versioned bucket, some objects will not sync (`issue#19766 <http://tracker.ceph.com/issues/19766>`_, `issue#18208 <http://tracker.ceph.com/issues/18208>`_, `pr#16163 <https://github.com/ceph/ceph/pull/16163>`_, lvshuhua)
-* rgw: wrong object size after copy of uncompressed multipart objects (`issue#20269 <http://tracker.ceph.com/issues/20269>`_, `issue#20071 <http://tracker.ceph.com/issues/20071>`_, `pr#16179 <https://github.com/ceph/ceph/pull/16179>`_, fang yuxiang)
-* rgw: zonegroupmap set does not work (`issue#18725 <http://tracker.ceph.com/issues/18725>`_, `issue#19479 <http://tracker.ceph.com/issues/19479>`_, `pr#14525 <https://github.com/ceph/ceph/pull/14525>`_, Casey Bodley)
-* tests: AttributeError: Thrasher instance has no attribute 'ceph_objectstore_tool' (`issue#19064 <http://tracker.ceph.com/issues/19064>`_, `issue#18799 <http://tracker.ceph.com/issues/18799>`_, `pr#13609 <https://github.com/ceph/ceph/pull/13609>`_, Nathan Cutler)
-* tests: backport Sage's fixes to qa/suites/upgrade/jewel-x (`issue#19651 <http://tracker.ceph.com/issues/19651>`_, `pr#14612 <https://github.com/ceph/ceph/pull/14612>`_, Sage Weil)
-* tests: ceph-object-corpus: kraken objects (`issue#20878 <http://tracker.ceph.com/issues/20878>`_, `pr#14983 <https://github.com/ceph/ceph/pull/14983>`_, Sage Weil)
-* tests: CMakeLists.txt: disable memstore make check test (`issue#17743 <http://tracker.ceph.com/issues/17743>`_, `pr#16215 <https://github.com/ceph/ceph/pull/16215>`_, Sage Weil)
-* tests: HEALTH_WARN pool rbd pg_num 244 > pgp_num 224 during upgrade (`issue#19771 <http://tracker.ceph.com/issues/19771>`_, `issue#20024 <http://tracker.ceph.com/issues/20024>`_, `pr#16137 <https://github.com/ceph/ceph/pull/16137>`_, Kefu Chai)
-* tests: ignore bogus ceph-objectstore-tool error in ceph_manager (`issue#18805 <http://tracker.ceph.com/issues/18805>`_, `issue#16263 <http://tracker.ceph.com/issues/16263>`_, `pr#13239 <https://github.com/ceph/ceph/pull/13239>`_, Nathan Cutler, Kefu Chai)
-* tests: insufficient timeout in radosbench task (`issue#20497 <http://tracker.ceph.com/issues/20497>`_, `pr#16111 <https://github.com/ceph/ceph/pull/16111>`_, Sage Weil)
-* tests: LibRadosMiscConnectFailure.ConnectFailure hang (`issue#20271 <http://tracker.ceph.com/issues/20271>`_, `issue#19901 <http://tracker.ceph.com/issues/19901>`_, `pr#16140 <https://github.com/ceph/ceph/pull/16140>`_, Sage Weil)
-* tests: [librados_test_stub] cls_cxx_map_get_XYZ methods don't return correct value (`issue#19597 <http://tracker.ceph.com/issues/19597>`_, `issue#19609 <http://tracker.ceph.com/issues/19609>`_, `pr#16097 <https://github.com/ceph/ceph/pull/16097>`_, Jason Dillaman)
-* tests: move swift.py task from teuthology to ceph, phase one (kraken) (`issue#20392 <http://tracker.ceph.com/issues/20392>`_, `pr#15869 <https://github.com/ceph/ceph/pull/15869>`_, Nathan Cutler, Sage Weil, Warren Usui, Greg Farnum, Ali Maredia, Tommi Virtanen, Zack Cerza, Sam Lang, Yehuda Sadeh, Joe Buck, Josh Durgin)
-* tests: ObjectStore/StoreTest.OnodeSizeTracking/2 fails on bluestore (`issue#20499 <http://tracker.ceph.com/issues/20499>`_, `pr#16112 <https://github.com/ceph/ceph/pull/16112>`_, xie xingguo)
-* tests: qa: ceph-ansible test tweaks (`issue#20882 <http://tracker.ceph.com/issues/20882>`_, `pr#12984 <https://github.com/ceph/ceph/pull/12984>`_, `pr#13618 <https://github.com/ceph/ceph/pull/13618>`_, Tamil Muthamizhan, Yuri Weinstein)
-* tests: qa/suites/upgrade: add tiering test to hammer-jewel-x (`issue#20879 <http://tracker.ceph.com/issues/20879>`_, `issue#19185 <http://tracker.ceph.com/issues/19185>`_, `pr#14692 <https://github.com/ceph/ceph/pull/14692>`_, Kefu Chai)
-* tests: qa/tasks: misc systemd updates (`issue#19719 <http://tracker.ceph.com/issues/19719>`_, `pr#14702 <https://github.com/ceph/ceph/pull/14702>`_, Vasu Kulkarni)
-* tests: qa/tasks: rbd-mirror daemon not properly run in foreground mode (`issue#20638 <http://tracker.ceph.com/issues/20638>`_, `issue#20630 <http://tracker.ceph.com/issues/20630>`_, `issue#20634 <http://tracker.ceph.com/issues/20634>`_, `pr#16342 <https://github.com/ceph/ceph/pull/16342>`_, Jason Dillaman)
-* tests: qa/tasks: set pgp = pg num on thrashing finish (`issue#20881 <http://tracker.ceph.com/issues/20881>`_, `pr#13757 <https://github.com/ceph/ceph/pull/13757>`_, Kefu Chai)
-* tests: qa/tasks/workunit: Backport repo fixes from master (`issue#19429 <http://tracker.ceph.com/issues/19429>`_, `issue#19531 <http://tracker.ceph.com/issues/19531>`_, `pr#14487 <https://github.com/ceph/ceph/pull/14487>`_, Kefu Chai, Dan Mick)
-* tests: remove hard-coded image name from TestLibRBD.Mirror (`issue#18555 <http://tracker.ceph.com/issues/18555>`_, `issue#19130 <http://tracker.ceph.com/issues/19130>`_, `issue#19227 <http://tracker.ceph.com/issues/19227>`_, `issue#18447 <http://tracker.ceph.com/issues/18447>`_, `issue#19807 <http://tracker.ceph.com/issues/19807>`_, `issue#19798 <http://tracker.ceph.com/issues/19798>`_, `pr#16113 <https://github.com/ceph/ceph/pull/16113>`_, Mykola Golub, Jason Dillaman)
-* tests: remove qa/suites/buildpackages (`issue#18849 <http://tracker.ceph.com/issues/18849>`_, `issue#18846 <http://tracker.ceph.com/issues/18846>`_, `pr#13298 <https://github.com/ceph/ceph/pull/13298>`_, Loic Dachary)
-* tests: run certain upgrade/jewel-x tests on Xenial only (`issue#20877 <http://tracker.ceph.com/issues/20877>`_, `pr#16493 <https://github.com/ceph/ceph/pull/16493>`_, Nathan Cutler)
-* tests: run-rbd-unit-tests.sh assert in lockdep_will_lock, TestLibRBD.ObjectMapConsistentSnap (`issue#18822 <http://tracker.ceph.com/issues/18822>`_, `issue#17447 <http://tracker.ceph.com/issues/17447>`_, `pr#14151 <https://github.com/ceph/ceph/pull/14151>`_, Jason Dillaman)
-* tests: SUSE yaml facets in qa/distros/all are out of date (`issue#18849 <http://tracker.ceph.com/issues/18849>`_, `issue#18870 <http://tracker.ceph.com/issues/18870>`_, `issue#18846 <http://tracker.ceph.com/issues/18846>`_, `issue#18856 <http://tracker.ceph.com/issues/18856>`_, `pr#13330 <https://github.com/ceph/ceph/pull/13330>`_, Nathan Cutler)
-* tests: swift.py: clone the ceph-kraken branch (`issue#20520 <http://tracker.ceph.com/issues/20520>`_, `pr#16131 <https://github.com/ceph/ceph/pull/16131>`_, Nathan Cutler)
-* tests: test/librbd: decouple ceph_test_librbd_api from libceph-common (`issue#20175 <http://tracker.ceph.com/issues/20175>`_, `issue#20351 <http://tracker.ceph.com/issues/20351>`_, `pr#16195 <https://github.com/ceph/ceph/pull/16195>`_, Kefu Chai)
-* tests: test_notify.py: assert(not image.is_exclusive_lock_owner()) on line 147 (`issue#19716 <http://tracker.ceph.com/issues/19716>`_, `issue#19794 <http://tracker.ceph.com/issues/19794>`_, `pr#14833 <https://github.com/ceph/ceph/pull/14833>`_, Mykola Golub)
-* tests: test_notify.py: rbd.InvalidArgument: error updating features for image test_notify_clone2 (`issue#19692 <http://tracker.ceph.com/issues/19692>`_, `issue#19693 <http://tracker.ceph.com/issues/19693>`_, `pr#14641 <https://github.com/ceph/ceph/pull/14641>`_, Jason Dillaman)
-* tests: use ceph-kraken branch for s3tests (`issue#18387 <http://tracker.ceph.com/issues/18387>`_, `pr#12746 <https://github.com/ceph/ceph/pull/12746>`_, Nathan Cutler)
-* tests: use librados API to retrieve config params (`issue#18668 <http://tracker.ceph.com/issues/18668>`_, `issue#18617 <http://tracker.ceph.com/issues/18617>`_, `pr#13102 <https://github.com/ceph/ceph/pull/13102>`_, Jason Dillaman)
-* tests: various OpenStack tweaks (`issue#20882 <http://tracker.ceph.com/issues/20882>`_, `pr#13707 <https://github.com/ceph/ceph/pull/13707>`_, `pr#13641 <https://github.com/ceph/ceph/pull/13641>`_, `pr#13635 <https://github.com/ceph/ceph/pull/13635>`_, `pr#13633 <https://github.com/ceph/ceph/pull/13633>`_, `pr#13613 <https://github.com/ceph/ceph/pull/13613>`_, `pr#13283 <https://github.com/ceph/ceph/pull/13283>`_, `pr#13673 <https://github.com/ceph/ceph/pull/13673>`_, `pr#13638 <https://github.com/ceph/ceph/pull/13638>`_, `pr#14485 <https://github.com/ceph/ceph/pull/14485>`_, Zack Cerza)
-* tools: ceph-brag fails to count "in" mds (`issue#19333 <http://tracker.ceph.com/issues/19333>`_, `issue#19192 <http://tracker.ceph.com/issues/19192>`_, `pr#14098 <https://github.com/ceph/ceph/pull/14098>`_, Peng Zhang)
-* tools: ceph-disk prepare writes osd log 0 with root owner (`issue#18538 <http://tracker.ceph.com/issues/18538>`_, `issue#18606 <http://tracker.ceph.com/issues/18606>`_, `pr#13026 <https://github.com/ceph/ceph/pull/13026>`_, Samuel Matzek)
-* tools: RadosImport::import should return an error if Rados::connect fails (`issue#19351 <http://tracker.ceph.com/issues/19351>`_, `issue#19319 <http://tracker.ceph.com/issues/19319>`_, `pr#14095 <https://github.com/ceph/ceph/pull/14095>`_, Brad Hubbard)
-
-v11.2.0 Kraken
-==============
-
-This is the first release of the Kraken series.  It is a stable
-release that will be maintained with bugfixes and backports until the
-next stable release, Luminous, is completed in the Spring of 2017.
-
-Major Changes from Jewel
-------------------------
-
-- *RADOS*:
-
-  * The new *BlueStore* backend now has a stable disk format and is
-    passing our failure and stress testing. Although the backend is
-    still flagged as experimental, we encourage users to try it out
-    for non-production clusters and non-critical data sets.
-  * RADOS now has experimental support for *overwrites on
-    erasure-coded* pools. Because the disk format and implementation
-    are not yet finalized, there is a special pool option that must be
-    enabled to test the new feature.  Enabling this option on a cluster
-    will permanently bar that cluster from being upgraded to future
-    versions.
-  * We now default to the AsyncMessenger (``ms type = async``) instead
-    of the legacy SimpleMessenger.  The most noticeable difference is
-    that we now use a fixed sized thread pool for network connections
-    (instead of two threads per socket with SimpleMessenger).
-  * Some OSD failures are now detected almost immediately, whereas
-    previously the heartbeat timeout (which defaults to 20 seconds)
-    had to expire.  This prevents IO from blocking for an extended
-    period for failures where the host remains up but the ceph-osd
-    process is no longer running.
-  * There is a new ``ceph-mgr`` daemon.  It is currently collocated with
-    the monitors by default, and is not yet used for much, but the basic
-    infrastructure is now in place.
-  * The size of encoded OSDMaps has been reduced.
-  * The OSDs now quiesce scrubbing when recovery or rebalancing is in progress.
-
-- *RGW*:
-
-  * RGW now supports a new zone type that can be used for metadata indexing
-    via ElasticSearch.
-  * RGW now supports the S3 multipart object copy-part API.
-  * It is possible now to reshard an existing bucket. Note that bucket
-    resharding currently requires that all IO (especially writes) to
-    the specific bucket is quiesced.
-  * RGW now supports data compression for objects.
-  * Civetweb version has been upgraded to 1.8
-  * The Swift static website API is now supported (S3 support has been added
-    previously).
-  * S3 bucket lifecycle API has been added. Note that currently it only supports
-    object expiration.
-  * Support for custom search filters has been added to the LDAP auth
-    implementation.
-  * Support for NFS version 3 has been added to the RGW NFS gateway.
-  * A Python binding has been created for librgw.
-
-- *RBD*:
-
-  * RBD now supports images stored in an *erasure-coded* RADOS pool
-    using the new (experimental) overwrite support. Images must be
-    created using the new rbd CLI "--data-pool <ec pool>" option to
-    specify the EC pool where the backing data objects are
-    stored. Attempting to create an image directly on an EC pool will
-    not be successful since the image's backing metadata is only
-    supported on a replicated pool.
-  * The rbd-mirror daemon now supports replicating dynamic image
-    feature updates and image metadata key/value pairs from the
-    primary image to the non-primary image.
-  * The number of image snapshots can be optionally restricted to a
-    configurable maximum.
-  * The rbd Python API now supports asynchronous IO operations.
-
-- *CephFS*:
-
-  * libcephfs function definitions have been changed to enable proper
-    uid/gid control.  The library version has been increased to reflect the
-    interface change.
-  * Standby replay MDS daemons now consume less memory on workloads
-    doing deletions.
-  * Scrub now repairs backtrace, and populates `damage ls` with
-    discovered errors.
-  * A new `pg_files` subcommand to `cephfs-data-scan` can identify
-    files affected by a damaged or lost RADOS PG.
-  * The false-positive "failing to respond to cache pressure" warnings have
-    been fixed.
-
-
-Upgrading from Kraken release candidate 11.1.0
-----------------------------------------------
-
-* The new *BlueStore* backend had an on-disk format change after 11.1.0.
-  Any BlueStore OSDs created with 11.1.0 will need to be destroyed and
-  recreated.
-
-Upgrading from Jewel
---------------------
-
-* All clusters must first be upgraded to Jewel 10.2.z before upgrading
-  to Kraken 11.2.z (or, eventually, Luminous 12.2.z).
-
-* The ``sortbitwise`` flag must be set on the Jewel cluster before upgrading
-  to Kraken.  The latest Jewel (10.2.8+) releases issue a health warning if
-  the flag is not set, so this is probably already set.  If it is not, Kraken
-  OSDs will refuse to start and will print and error message in their log.
-
-* You may upgrade OSDs, Monitors, and MDSs in any order.  RGW daemons
-  should be upgraded last.
-
-* When upgrading, new ceph-mgr daemon instances will be created automatically
-  alongside any monitors.  This will be true for Jewel to Kraken and Jewel to
-  Luminous upgrades, but likely not be true for future upgrades beyond
-  Luminous.  You are, of course, free to create new ceph-mgr daemon instances
-  and destroy the auto-created ones if you do not with them to be colocated
-  with the ceph-mon daemons.
-
-
-BlueStore
----------
-
-BlueStore is a new backend for managing data stored by each OSD on the directly
-hard disk or SSD.  Unlike the existing FileStore implementation, which makes
-use of an XFS file system to store objects as files, BlueStore manages the
-underlying block device directly.  Implements its own file system-like on-disk
-structure the is designed specifically for Ceph OSD workloads.  Key features
-of BlueStore include:
-
- * Checksums on all data written to disk, with checksum verifications on all
-   reads, enabled by default.
- * Inline compression support, which can be enabled on a per-pool or per-object
-   basis via pool properties or client hints, respectively.
- * Efficient journaling.  Unlike FileStore, which writes *all* data to
-   its journal device, BlueStore only journals metadata and (in some
-   cases) small writes, reducing the size and throughput requirements
-   for its journal.  As with FileStore, the journal can be colocated
-   on the same device as other data or allocated on a smaller,
-   high-performance device (e.g., an SSD or NVMe device).  BlueStore
-   journals are only 512 MB by default.
-
-The BlueStore on-disk format is expected to continue to evolve.  However, we
-will provide support in the OSD to migrate to the new format on upgrade.
-
-.. note: BlueStore is still marked "experimental" in Kraken.  We
-   recommend its use for proof-of-concept and test environments, or
-   other cases where data loss can be tolerated.  Although it is
-   stable in our testing environment, the code is new and bugs are
-   inevitable.  We hope that with user feedback from Kraken
-   deployments we will have sufficient confidence to mark it stable
-   (and the default) in the next major release (Luminous).
-
-In order to enable BlueStore, add the following to ceph.conf::
-
-  enable experimental unrecoverable data corrupting features = bluestore
-
-To create a BlueStore OSD, pass the --bluestore option to ceph-disk or
-ceph-deploy during OSD creation.
-
-
-
-Upgrade notes
--------------
-
-* The OSDs now avoid starting new scrubs while recovery is in progress.  To
-  revert to the old behavior (and do not let recovery activity affect the
-  scrub scheduling) you can set the following option::
-
-    osd scrub during recovery = true
-
-* The list of monitor hosts/addresses for building the monmap can now be
-  obtained from DNS SRV records. The service name used when querying the DNS
-  is defined in the "mon_dns_srv_name" config option, which defaults to
-  "ceph-mon".
-
-* The 'osd class load list' config option is a list of object class names that
-  the OSD is permitted to load (or '*' for all classes). By default it
-  contains all existing in-tree classes for backwards compatibility.
-
-* The 'osd class default list' config option is a list of object class
-  names (or '*' for all classes) that clients may invoke having only
-  the '*', 'x', 'class-read', or 'class-write' capabilities. By
-  default it contains all existing in-tree classes for backwards
-  compatibility. Invoking classes not listed in 'osd class default
-  list' requires a capability naming the class (e.g. 'allow class
-  foo').
-
-* The 'rgw rest getusage op compat' config option allows you to dump
-  (or not dump) the description of user stats in the S3 GetUsage
-  API. This option defaults to false.  If the value is true, the
-  response data for GetUsage looks like::
-
-    "stats": {
-                "TotalBytes": 516,
-                "TotalBytesRounded": 1024,
-                "TotalEntries": 1
-             }
-
-  If the value is false, the response for GetUsage looks as it did before::
-
-    {
-         516,
-         1024,
-         1
-    }
-
-* The 'osd out ...' and 'osd in ...' commands now preserve the OSD
-  weight.  That is, after marking an OSD out and then in, the weight
-  will be the same as before (instead of being reset to 1.0).
-  Previously the mons would only preserve the weight if the mon
-  automatically marked and OSD out and then in, but not when an admin
-  did so explicitly.
-
-* The 'ceph osd perf' command will display 'commit_latency(ms)' and
-  'apply_latency(ms)'. Previously, the names of these two columns are
-  'fs_commit_latency(ms)' and 'fs_apply_latency(ms)'. We remove the
-  prefix 'fs\_', because they are not filestore specific.
-
-* Monitors will no longer allow pools to be removed by default.  The
-  setting mon_allow_pool_delete has to be set to true (defaults to
-  false) before they allow pools to be removed.  This is a additional
-  safeguard against pools being removed by accident.
-
-* If you have manually specified the monitor user rocksdb via the
-  ``mon keyvaluedb = rocksdb`` option, you will need to manually add a
-  file to the mon data directory to preserve this option::
-
-     echo rocksdb > /var/lib/ceph/mon/ceph-`hostname`/kv_backend
-
-  New monitors will now use rocksdb by default, but if that file is
-  not present, existing monitors will use leveldb.  The ``mon
-  keyvaluedb`` option now only affects the backend chosen when a
-  monitor is created.
-
-* The 'osd crush initial weight' option allows you to specify a CRUSH
-  weight for a newly added OSD.  Previously a value of 0 (the default)
-  meant that we should use the size of the OSD's store to weight the
-  new OSD.  Now, a value of 0 means it should have a weight of 0, and
-  a negative value (the new default) means we should automatically
-  weight the OSD based on its size.  If your configuration file
-  explicitly specifies a value of 0 for this option you will need to
-  change it to a negative value (e.g., -1) to preserve the current
-  behavior.
-
-* The ``osd crush location`` config option is no longer supported.  Please
-  update your ceph.conf to use the ``crush location`` option instead.
-
-* The static libraries are no longer included by the debian
-  development packages (lib*-dev) as it is not required per debian
-  packaging policy.  The shared (.so) versions are packaged as before.
-
-* The libtool pseudo-libraries (.la files) are no longer included by
-  the debian development packages (lib*-dev) as they are not required
-  per https://wiki.debian.org/ReleaseGoals/LAFileRemoval and
-  https://www.debian.org/doc/manuals/maint-guide/advanced.en.html.
-
-* The jerasure and shec plugins can now detect SIMD instruction at
-  runtime and no longer need to be explicitly configured for different
-  processors.  The following plugins are now deprecated:
-  jerasure_generic, jerasure_sse3, jerasure_sse4, jerasure_neon,
-  shec_generic, shec_sse3, shec_sse4, and shec_neon. If you use any of
-  these plugins directly you will see a warning in the mon log file.
-  Please switch to using just 'jerasure' or 'shec'.
-
-* The librados omap get_keys and get_vals operations include a start key and a
-  limit on the number of keys to return.  The OSD now imposes a configurable
-  limit on the number of keys and number of total bytes it will respond with,
-  which means that a librados user might get fewer keys than they asked for.
-  This is necessary to prevent careless users from requesting an unreasonable
-  amount of data from the cluster in a single operation.  The new limits are
-  configured with ``osd_max_omap_entries_per_request``, defaulting to 131,072, and
-  ``osd_max_omap_bytes_per_request``, defaulting to 4MB.
-
-* Calculation of recovery priorities has been updated.
-  This could lead to unintuitive recovery prioritization
-  during cluster upgrade. In case of such recovery, OSDs
-  in the old version would operate on different priority ranges
-  than new ones. Once upgraded, the cluster will operate on
-  consistent values.
-
-
-Notable Changes
----------------
-
-* bluestore: add counter to trace blob splitting (`pr#11718 <http://github.com/ceph/ceph/pull/11718>`_, xie xingguo)
-* bluestore: a few more cleanups (`pr#11780 <http://github.com/ceph/ceph/pull/11780>`_, xie xingguo)
-* bluestore: avoid polluting shard info if need resharding (`pr#11439 <http://github.com/ceph/ceph/pull/11439>`_, xie xingguo)
-* bluestore: avoid unnecessary call to init_csum() (`pr#12015 <http://github.com/ceph/ceph/pull/12015>`_, xie xingguo)
-* bluestore: ceph-disk: adjust bluestore default device sizes (`pr#12530 <http://github.com/ceph/ceph/pull/12530>`_, Sage Weil)
-* bluestore: ceph_test_objectstore: smaller device (`pr#11591 <http://github.com/ceph/ceph/pull/11591>`_, Sage Weil)
-* bluestore: clean up Allocator::dump (`issue#18054 <http://tracker.ceph.com/issues/18054>`_, `pr#12282 <http://github.com/ceph/ceph/pull/12282>`_, Sage Weil)
-* bluestore: clear extent map on object removal (`pr#11603 <http://github.com/ceph/ceph/pull/11603>`_, Sage Weil)
-* bluestore: compressor/ZLibCompressor: fix broken isal-l (`pr#11445 <http://github.com/ceph/ceph/pull/11445>`_, Igor Fedotov)
-* bluestore: dedup if space overlap truly exists (`pr#11986 <http://github.com/ceph/ceph/pull/11986>`_, xie xingguo)
-* bluestore: dedup omap_head, reuse nid instead (`pr#12275 <http://github.com/ceph/ceph/pull/12275>`_, xie xingguo)
-* bluestore: deep fsck (`pr#11724 <http://github.com/ceph/ceph/pull/11724>`_, Sage Weil)
-* bluestore: default bluestore_clone_cow=true (`pr#11540 <http://github.com/ceph/ceph/pull/11540>`_, Sage Weil)
-* bluestore: drop inline_dirty from struct ExtentMap (`pr#11377 <http://github.com/ceph/ceph/pull/11377>`_, xie xingguo)
-* bluestore: drop member "space" from Onode (`pr#12185 <http://github.com/ceph/ceph/pull/12185>`_, xie xingguo)
-* bluestore: fix alloc release timing on sync submits (`pr#11983 <http://github.com/ceph/ceph/pull/11983>`_, Sage Weil)
-* bluestore: fix bufferspace stats leak due to blob splitting (`pr#12039 <http://github.com/ceph/ceph/pull/12039>`_, xie xingguo)
-* bluestore: fix collection_list end bound off-by-one (`pr#11771 <http://github.com/ceph/ceph/pull/11771>`_, Sage Weil)
-* bluestore: fix compiler warnings (`pr#11905 <http://github.com/ceph/ceph/pull/11905>`_, xie xingguo)
-* bluestore: fixes and cleanups (`pr#11761 <http://github.com/ceph/ceph/pull/11761>`_, xie xingguo)
-* bluestore: fix escaping of chars > 0x80 (`pr#11502 <http://github.com/ceph/ceph/pull/11502>`_, Sage Weil)
-* bluestore: fix extent shard span check (`pr#11725 <http://github.com/ceph/ceph/pull/11725>`_, Sage Weil)
-* bluestore: fix has_aios (`pr#11317 <http://github.com/ceph/ceph/pull/11317>`_, Sage Weil)
-* bluestore: Fix invalid compression statfs caused by clone op (`pr#11351 <http://github.com/ceph/ceph/pull/11351>`_, Igor Fedotov)
-* bluestore: fix lack of resharding (`pr#11597 <http://github.com/ceph/ceph/pull/11597>`_, Igor Fedotov)
-* bluestore: fix latency calculation (`pr#12040 <http://github.com/ceph/ceph/pull/12040>`_, Pan Liu)
-* bluestore: fix onode vs extent key suffix (`pr#11452 <http://github.com/ceph/ceph/pull/11452>`_, Sage Weil)
-* bluestore: fix potential memory leak (`pr#11893 <http://github.com/ceph/ceph/pull/11893>`_, xie xingguo)
-* bluestore: fix race condtion during blob spliting (`pr#11422 <http://github.com/ceph/ceph/pull/11422>`_, xiexingguo, xie xingguo)
-* bluestore: fix remove_collection to properly detect collection e… (`pr#11398 <http://github.com/ceph/ceph/pull/11398>`_, Igor Fedotov)
-* bluestore: fix _split_collections race with osr_reap (`pr#11748 <http://github.com/ceph/ceph/pull/11748>`_, Sage Weil)
-* bluestore: fix up compression tests and debug output (`pr#11350 <http://github.com/ceph/ceph/pull/11350>`_, Sage Weil)
-* bluestore: fix writes that span existing shard boundaries (`pr#11451 <http://github.com/ceph/ceph/pull/11451>`_, Sage Weil)
-* bluestore: flush before enumerating omap values (`issue#18140 <http://tracker.ceph.com/issues/18140>`_, `pr#12328 <http://github.com/ceph/ceph/pull/12328>`_, Sage Weil)
-* bluestore: formatting nits (`pr#11514 <http://github.com/ceph/ceph/pull/11514>`_, xie xingguo)
-* bluestore: fsck: fix omap_head check (`pr#11726 <http://github.com/ceph/ceph/pull/11726>`_, Sage Weil)
-* bluestore: GC infra refactor, more UTs and GC range calculation fixes (`pr#11482 <http://github.com/ceph/ceph/pull/11482>`_, Igor Fedotov)
-* bluestore: KernelDevice: fix race in aio_thread vs aio_wait (`issue#17824 <http://tracker.ceph.com/issues/17824>`_, `pr#12204 <http://github.com/ceph/ceph/pull/12204>`_, Sage Weil)
-* bluestore: kv: dump rocksdb stats (`pr#12287 <http://github.com/ceph/ceph/pull/12287>`_, Varada Kari, Jianpeng Ma, Sage Weil)
-* bluestore: kv/rocksdb: enable rocksdb write path breakdown (`pr#11696 <http://github.com/ceph/ceph/pull/11696>`_, Haodong Tang)
-* bluestore: kv/RocksDBStore: rename option (`pr#11769 <http://github.com/ceph/ceph/pull/11769>`_, Sage Weil)
-* bluestore: less code redundancy (`pr#11740 <http://github.com/ceph/ceph/pull/11740>`_, xie xingguo)
-* bluestore: make 2q cache kin/kout size tunable (`pr#11599 <http://github.com/ceph/ceph/pull/11599>`_, Haodong Tang)
-* bluestore: mark ops that can't tolerate ENOENT (`pr#12114 <http://github.com/ceph/ceph/pull/12114>`_, Sage Weil)
-* bluestore: mempool: changes for bitmap allocator (`pr#11922 <http://github.com/ceph/ceph/pull/11922>`_, Ramesh Chander)
-* bluestore: misc. fixes and cleanups (`pr#11964 <http://github.com/ceph/ceph/pull/11964>`_, xie xingguo)
-* bluestore: move bluefs into its own mempool (`pr#11834 <http://github.com/ceph/ceph/pull/11834>`_, Sage Weil)
-* bluestore: no garbage collection for uncompressed blobs (`pr#11539 <http://github.com/ceph/ceph/pull/11539>`_, Roushan Ali, Sage Weil)
-* bluestore: optional debug mode to identify aio stalls (`pr#11818 <http://github.com/ceph/ceph/pull/11818>`_, Sage Weil)
-* bluestore: os/bluestore: a few cleanups (`pr#11483 <http://github.com/ceph/ceph/pull/11483>`_, Sage Weil)
-* bluestore: os/bluestore: avoid resharding if the last shard size fall below shar… (`pr#12447 <http://github.com/ceph/ceph/pull/12447>`_, Igor Fedotov)
-* bluestore: os/bluestore: bitmap allocator dump functionality (`pr#12298 <http://github.com/ceph/ceph/pull/12298>`_, Ramesh Chander)
-* bluestore: os/bluestore: bluestore_sync_submit_transaction = false (`pr#12367 <http://github.com/ceph/ceph/pull/12367>`_, Sage Weil)
-* bluestore: os/bluestore: cleanup around Blob::ref_map (`pr#11896 <http://github.com/ceph/ceph/pull/11896>`_, Igor Fedotov)
-* bluestore: os/bluestore: clear omap flag if parent has none (`pr#12351 <http://github.com/ceph/ceph/pull/12351>`_, xie xingguo)
-* bluestore: os/bluestore: don't implicitly create the source object for clone (`pr#12353 <http://github.com/ceph/ceph/pull/12353>`_, xie xingguo)
-* bluestore: os/bluestore: drop old bluestore preconditioning; replace with wal preextension of file size (`pr#12265 <http://github.com/ceph/ceph/pull/12265>`_, Sage Weil)
-* bluestore: os/bluestore: fix global commit latency (`pr#12356 <http://github.com/ceph/ceph/pull/12356>`_, xie xingguo)
-* bluestore: os/bluestore: fix ondisk encoding for blobs (`pr#12488 <http://github.com/ceph/ceph/pull/12488>`_, Varada Kari, Sage Weil)
-* bluestore: os/bluestore: fix potential csum_order overflow (`pr#12333 <http://github.com/ceph/ceph/pull/12333>`_, xie xingguo)
-* bluestore: os/bluestore: fix target_buffer value overflow in Cache::trim() (`pr#12507 <http://github.com/ceph/ceph/pull/12507>`_, Igor Fedotov)
-* bluestore: os/bluestore: include modified objects in flush list even if onode unchanged (`pr#12541 <http://github.com/ceph/ceph/pull/12541>`_, Sage Weil)
-* bluestore: os/bluestore: kill dead gc-related counters (`pr#12065 <http://github.com/ceph/ceph/pull/12065>`_, xie xingguo)
-* bluestore: os/bluestore: kill overlay related options (`pr#11557 <http://github.com/ceph/ceph/pull/11557>`_, xie xingguo)
-* bluestore: os/bluestore: misc coverity fixes/cleanups (`pr#12202 <http://github.com/ceph/ceph/pull/12202>`_, Sage Weil)
-* bluestore: os/bluestore: preserve source collection cache during split (`pr#12574 <http://github.com/ceph/ceph/pull/12574>`_, Sage Weil)
-* bluestore: os/bluestore: remove 'extents' from shard_info (`pr#12629 <http://github.com/ceph/ceph/pull/12629>`_, Sage Weil)
-* bluestore: os/bluestore: simplified allocator interfaces to single apis (`pr#12355 <http://github.com/ceph/ceph/pull/12355>`_, Ramesh Chander)
-* bluestore: os/bluestore: simplify allocator release flow (`pr#12343 <http://github.com/ceph/ceph/pull/12343>`_, Sage Weil)
-* bluestore: os/bluestore: simplify can_split_at()  (`pr#11607 <http://github.com/ceph/ceph/pull/11607>`_, xie xingguo)
-* bluestore: os/bluestore: use iterator for erase() method directly (`pr#11490 <http://github.com/ceph/ceph/pull/11490>`_, xie xingguo)
-* bluestore: os/kstore: rmcoll fix to satisfy store_test (`pr#11533 <http://github.com/ceph/ceph/pull/11533>`_, Igor Fedotov)
-* bluestore: os: make filestore_blackhole -> objectstore_blackhole (`pr#11788 <http://github.com/ceph/ceph/pull/11788>`_, Sage Weil)
-* bluestore: os: move_ranges_destroy_src (`pr#11237 <http://github.com/ceph/ceph/pull/11237>`_, Manali Kulkarni, Sage Weil)
-* bluestore: readability improvements and doxygen fix (`pr#11895 <http://github.com/ceph/ceph/pull/11895>`_, xie xingguo)
-* bluestore: reap collection after all pending ios done (`pr#11797 <http://github.com/ceph/ceph/pull/11797>`_, Haomai Wang)
-* bluestore: reap ioc when stopping aio_thread. (`pr#11811 <http://github.com/ceph/ceph/pull/11811>`_, Haodong Tang)
-* bluestore: refactor _do_write(); move initializaiton of csum out of loop (`pr#11823 <http://github.com/ceph/ceph/pull/11823>`_, xie xingguo)
-* bluestore: remove duplicated namespace of tx state (`pr#11845 <http://github.com/ceph/ceph/pull/11845>`_, xie xingguo)
-* bluestore: remove garbage collector staff (`pr#12042 <http://github.com/ceph/ceph/pull/12042>`_, Igor Fedotov)
-* bluestore: set next object as ghobject_t::get_max() when start.hobj.i… (`pr#11495 <http://github.com/ceph/ceph/pull/11495>`_, Xinze Chi, Haomai Wang)
-* bluestore: simplify blob status checking for small writes (`pr#11366 <http://github.com/ceph/ceph/pull/11366>`_, xie xingguo)
-* bluestore: some more cleanups (`pr#11910 <http://github.com/ceph/ceph/pull/11910>`_, xie xingguo)
-* bluestore: spdk: a few fixes (`pr#11882 <http://github.com/ceph/ceph/pull/11882>`_, Yehuda Sadeh)
-* bluestore: speed up omap-key generation for same onode (`pr#11807 <http://github.com/ceph/ceph/pull/11807>`_, xie xingguo)
-* bluestore: traverse buffer_map in reverse order when spliting BufferSpace (`pr#11468 <http://github.com/ceph/ceph/pull/11468>`_, xie xingguo)
-* bluestore: update cache logger after 'trim_cache' operation (`pr#11695 <http://github.com/ceph/ceph/pull/11695>`_, Haodong Tang)
-* bluestore: use bitmap allocator for bluefs (`pr#12285 <http://github.com/ceph/ceph/pull/12285>`_, Sage Weil)
-* bluestore: use std::unordered_map for SharedBlob lookup (`pr#11394 <http://github.com/ceph/ceph/pull/11394>`_, Sage Weil)
-* build/ops: AArch64: Detect crc32 extension support from assembler (`issue#17516 <http://tracker.ceph.com/issues/17516>`_, `pr#11391 <http://github.com/ceph/ceph/pull/11391>`_, Alexander Graf)
-* build/ops: boost: embedded (`pr#11817 <http://github.com/ceph/ceph/pull/11817>`_, Sage Weil, Matt Benjamin)
-* build/ops: build: dump env during build (`issue#18084 <http://tracker.ceph.com/issues/18084>`_, `pr#12284 <http://github.com/ceph/ceph/pull/12284>`_, Sage Weil)
-* build/ops: ceph-detect-init: FreeBSD introduction of bsdrc (`pr#11906 <http://github.com/ceph/ceph/pull/11906>`_, Willem Jan Withagen, Kefu Chai)
-* build/ops: ceph-disk: enable --runtime ceph-osd systemd units (`issue#17889 <http://tracker.ceph.com/issues/17889>`_, `pr#12241 <http://github.com/ceph/ceph/pull/12241>`_, Loic Dachary)
-* build/ops: ceph.spec: add pybind rgwfile (`pr#11847 <http://github.com/ceph/ceph/pull/11847>`_, Haomai Wang)
-* build/ops,cleanup,bluestore: os/bluestore: remove build warning in a better way (`pr#11920 <http://github.com/ceph/ceph/pull/11920>`_, Igor Fedotov)
-* build/ops: CMakeLists: add vstart-base target (`pr#12476 <http://github.com/ceph/ceph/pull/12476>`_, Sage Weil)
-* build/ops: CMakeLists.txt: enable LTTNG by default (`pr#11500 <http://github.com/ceph/ceph/pull/11500>`_, Sage Weil)
-* build/ops: common/buffer.cc: raw_pipe depends on splice(2) (`pr#11967 <http://github.com/ceph/ceph/pull/11967>`_, Willem Jan Withagen)
-* build/ops,common: common/str_list.h: fix clang warning about std::move (`pr#12570 <http://github.com/ceph/ceph/pull/12570>`_, Willem Jan Withagen)
-* build/ops,core: xio: fix build (`pr#11768 <http://github.com/ceph/ceph/pull/11768>`_, Matt Benjamin)
-* build/ops: deb: add python dependencies where needed (`issue#17579 <http://tracker.ceph.com/issues/17579>`_, `pr#11507 <http://github.com/ceph/ceph/pull/11507>`_, Nathan Cutler, Kefu Chai)
-* build/ops: deb: add python-rgw packages (`pr#11832 <http://github.com/ceph/ceph/pull/11832>`_, Sage Weil)
-* build/ops: debian: apply dh_python to python-rgw also (`pr#12260 <http://github.com/ceph/ceph/pull/12260>`_, Kefu Chai)
-* build/ops: deb: update python-rgw dependencies to librgw2 (`pr#11885 <http://github.com/ceph/ceph/pull/11885>`_, Casey Bodley)
-* build/ops: do_freebsd.sh: Build with SYSTEM Boost on FreeBSD (`pr#11942 <http://github.com/ceph/ceph/pull/11942>`_, Willem Jan Withagen)
-* build/ops: do_freebsd.sh: Do not use LTTNG on FreeBSD (`pr#11551 <http://github.com/ceph/ceph/pull/11551>`_, Willem Jan Withagen)
-* build/ops: do_freebsd.sh: Set options for debug building. (`pr#11443 <http://github.com/ceph/ceph/pull/11443>`_, Willem Jan Withagen)
-* build/ops: FreeBSD: do_freebsd.sh (`pr#12090 <http://github.com/ceph/ceph/pull/12090>`_, Willem Jan Withagen)
-* build/ops: FreeBSD:test/encoding/readable.sh": fix nproc and ls -v calls (`pr#11522 <http://github.com/ceph/ceph/pull/11522>`_, Willem Jan Withagen)
-* build/ops: FreeBSD: update require packages (`pr#11512 <http://github.com/ceph/ceph/pull/11512>`_, Willem Jan Withagen)
-* build/ops: git-archive-all.sh: use an actually unique tmp dir (`pr#12011 <http://github.com/ceph/ceph/pull/12011>`_, Dan Mick)
-* build/ops: include/enc: make clang happy (`pr#11638 <http://github.com/ceph/ceph/pull/11638>`_, Kefu Chai, Sage Weil)
-* build/ops: install-deps.sh: allow building on SLES systems (`pr#11708 <http://github.com/ceph/ceph/pull/11708>`_, Nitin A Kamble)
-* build/ops: install-deps.sh: JQ is needed in one script (`pr#12080 <http://github.com/ceph/ceph/pull/12080>`_, Willem Jan Withagen)
-* build/ops: Log: Replace namespace log with logging (`pr#11650 <http://github.com/ceph/ceph/pull/11650>`_, Willem Jan Withagen)
-* build/ops: Merging before make check because it clearly breaks the build and the build part is done (`pr#11924 <http://github.com/ceph/ceph/pull/11924>`_, Sage Weil)
-* build/ops: ok, w/upstream acks, merging--jenkins build did succeed (this is a build-only change) (`pr#12008 <http://github.com/ceph/ceph/pull/12008>`_, Matt Benjamin)
-* build/ops: qa: Add ceph-ansible installer. (`issue#16770 <http://tracker.ceph.com/issues/16770>`_, `pr#10402 <http://github.com/ceph/ceph/pull/10402>`_, Warren Usui)
-* build/ops: rocksdb: do not build with --march=native (`pr#11677 <http://github.com/ceph/ceph/pull/11677>`_, Kefu Chai)
-* build/ops: rocksdb: update to latest (`pr#12100 <http://github.com/ceph/ceph/pull/12100>`_, Kefu Chai)
-* build/ops: rpm: Remove trailing whitespace in usermod command (SUSE) (`pr#10707 <http://github.com/ceph/ceph/pull/10707>`_, Tim Serong)
-* build/ops: scripts/release-notes: allow title guesses from gh tags & description update (`pr#11399 <http://github.com/ceph/ceph/pull/11399>`_, Abhishek Lekshmanan)
-* build/ops: systemd: Fix startup of ceph-mgr on Debian 8 (`pr#12555 <http://github.com/ceph/ceph/pull/12555>`_, Mark Korenberg)
-* build/ops: tracing/objectstore.tp: add missing move_ranges\_... tp (`pr#11484 <http://github.com/ceph/ceph/pull/11484>`_, Sage Weil)
-* build/ops: upstart: fix ceph-crush-location default (`issue#6698 <http://tracker.ceph.com/issues/6698>`_, `pr#803 <http://github.com/ceph/ceph/pull/803>`_, Jason Dillaman)
-* build/ops: upstart: start ceph-all after static-network-up (`issue#17689 <http://tracker.ceph.com/issues/17689>`_, `pr#11631 <http://github.com/ceph/ceph/pull/11631>`_, Billy Olsen)
-* cephfs: add gid to asok status (`pr#11487 <http://github.com/ceph/ceph/pull/11487>`_, Patrick Donnelly)
-* cephfs: API cleanup for libcephfs interfaces (`issue#17911 <http://tracker.ceph.com/issues/17911>`_, `pr#12106 <http://github.com/ceph/ceph/pull/12106>`_, Jeff Layton)
-* cephfs: ceph-fuse: start up log on parent process before shutdown (`issue#18157 <http://tracker.ceph.com/issues/18157>`_, `pr#12347 <http://github.com/ceph/ceph/pull/12347>`_, Greg Farnum)
-* cephfs: ceph_fuse: use sizeof get the buf length (`pr#11176 <http://github.com/ceph/ceph/pull/11176>`_, LeoZhang)
-* cephfs,cleanup: ceph-fuse: start up log on parent process before shutdown (`issue#18157 <http://tracker.ceph.com/issues/18157>`_, `pr#12358 <http://github.com/ceph/ceph/pull/12358>`_, Kefu Chai)
-* cephfs: client: add pid to metadata (`issue#17276 <http://tracker.ceph.com/issues/17276>`_, `pr#11359 <http://github.com/ceph/ceph/pull/11359>`_, Patrick Donnelly)
-* cephfs: client: Client.cc: remove duplicated op type checking against CEPH_MD… (`pr#11608 <http://github.com/ceph/ceph/pull/11608>`_, Weibing Zhang)
-* cephfs: client: don't take extra target inode reference in ll_link (`pr#11440 <http://github.com/ceph/ceph/pull/11440>`_, Jeff Layton)
-* cephfs: client: fix mutex name typos (`pr#12401 <http://github.com/ceph/ceph/pull/12401>`_, Yunchuan Wen)
-* cephfs: client: get caller's uid/gid on every libcephfs operation (`issue#17591 <http://tracker.ceph.com/issues/17591>`_, `pr#11526 <http://github.com/ceph/ceph/pull/11526>`_, Yan, Zheng)
-* cephfs: client: get gid from MonClient (`pr#11486 <http://github.com/ceph/ceph/pull/11486>`_, Patrick Donnelly)
-* cephfs: client: improve failure messages/debugging (`pr#12110 <http://github.com/ceph/ceph/pull/12110>`_, Patrick Donnelly)
-* cephfs: client/mds: Clear setuid bits when writing or truncating (`issue#18131 <http://tracker.ceph.com/issues/18131>`_, `pr#12412 <http://github.com/ceph/ceph/pull/12412>`_, Jeff Layton)
-* cephfs: client: put CapSnap not ptr in cap_snaps map (`pr#12111 <http://github.com/ceph/ceph/pull/12111>`_, Patrick Donnelly)
-* cephfs: client: remove redundant initialization (`pr#12028 <http://github.com/ceph/ceph/pull/12028>`_, Patrick Donnelly)
-* cephfs:  client: remove unnecessary bufferptr[] for writev (`pr#11836 <http://github.com/ceph/ceph/pull/11836>`_, Patrick Donnelly)
-* cephfs: client: remove unneeded layout on MClientCaps (`pr#11790 <http://github.com/ceph/ceph/pull/11790>`_, John Spray)
-* cephfs: client: set metadata["root"] from mount method when it's called with … (`pr#12505 <http://github.com/ceph/ceph/pull/12505>`_, Jeff Layton)
-* cephfs: client: trim_caps() do not dereference cap if it's removed (`pr#12145 <http://github.com/ceph/ceph/pull/12145>`_, Kefu Chai)
-* cephfs: client: use unique_ptr (`pr#11837 <http://github.com/ceph/ceph/pull/11837>`_, Patrick Donnelly)
-* cephfs: common/ceph_string: add ceph string constants for CEPH_SESSION_FORCE_RO (`pr#11516 <http://github.com/ceph/ceph/pull/11516>`_, Zhi Zhang)
-* cephfs: Fix #17562 (backtrace check fails when scrubbing directory created by fsstress) (`issue#17562 <http://tracker.ceph.com/issues/17562>`_, `pr#11517 <http://github.com/ceph/ceph/pull/11517>`_, Yan, Zheng)
-* cephfs: fix missing ll_get for ll_walk (`issue#18086 <http://tracker.ceph.com/issues/18086>`_, `pr#12061 <http://github.com/ceph/ceph/pull/12061>`_, Gui Hecheng)
-* cephfs: get new fsmap after marking clusters down (`issue#7271 <http://tracker.ceph.com/issues/7271>`_, `issue#17894 <http://tracker.ceph.com/issues/17894>`_, `pr#1262 <http://github.com/ceph/ceph/pull/1262>`_, Patrick Donnelly)
-* cephfs: Have ceph clear setuid/setgid bits on chown (`issue#18131 <http://tracker.ceph.com/issues/18131>`_, `pr#12331 <http://github.com/ceph/ceph/pull/12331>`_, Jeff Layton)
-* cephfs: libcephfs: add ceph_fsetattr&&ceph_lchmod&&ceph_lutime (`pr#11191 <http://github.com/ceph/ceph/pull/11191>`_, huanwen ren)
-* cephfs: libcephfs: add readlink function in cephfs.pyx (`pr#12384 <http://github.com/ceph/ceph/pull/12384>`_, huanwen ren)
-* cephfs: libcephfs and test suite fixes (`issue#18013 <http://tracker.ceph.com/issues/18013>`_, `issue#17982 <http://tracker.ceph.com/issues/17982>`_, `pr#12228 <http://github.com/ceph/ceph/pull/12228>`_, Jeff Layton)
-* cephfs: libcephfs client API overhaul and update (`pr#11647 <http://github.com/ceph/ceph/pull/11647>`_, Jeff Layton)
-* cephfs: lua: use simpler lua_next traversal structure (`pr#11958 <http://github.com/ceph/ceph/pull/11958>`_, Patrick Donnelly)
-* cephfs: mds/Beacon: move C_MDS_BeaconSender class to .cc (`pr#10940 <http://github.com/ceph/ceph/pull/10940>`_, Michal Jarzabek)
-* cephfs: mds/CDir.cc: remove unneeded use of count (`pr#11613 <http://github.com/ceph/ceph/pull/11613>`_, Michal Jarzabek)
-* cephfs: mds/CInode.h: remove unneeded use of count (`pr#11371 <http://github.com/ceph/ceph/pull/11371>`_, Michal Jarzabek)
-* cephfs: mds/DamageTable.cc: move shared ptrs (`pr#11435 <http://github.com/ceph/ceph/pull/11435>`_, Michal Jarzabek)
-* cephfs: mds/DamageTable.cc: remove unneeded use of count (`pr#11625 <http://github.com/ceph/ceph/pull/11625>`_, Michal Jarzabek)
-* cephfs: mds/DamageTable: move classes to .cc file (`pr#11450 <http://github.com/ceph/ceph/pull/11450>`_, Michal Jarzabek)
-* cephfs: mds/flock: add const to member functions (`pr#11692 <http://github.com/ceph/ceph/pull/11692>`_, Michal Jarzabek)
-* cephfs: mds/FSMap.cc: remove unneeded use of count (`pr#11402 <http://github.com/ceph/ceph/pull/11402>`_, Michal Jarzabek)
-* cephfs: mds/FSMapUser.h: remove copy ctr and assign op (`pr#11509 <http://github.com/ceph/ceph/pull/11509>`_, Michal Jarzabek)
-* cephfs: mds/InfoTable.h: add override to virtual functs (`pr#11496 <http://github.com/ceph/ceph/pull/11496>`_, Michal Jarzabek)
-* cephfs: mds/InoTable.h: add override to virtual functs (`pr#11604 <http://github.com/ceph/ceph/pull/11604>`_, Michal Jarzabek)
-* cephfs: mds/Mantle.h: include correct header files (`pr#11886 <http://github.com/ceph/ceph/pull/11886>`_, Michal Jarzabek)
-* cephfs: mds/Mantle: pass parameters by const ref (`pr#11713 <http://github.com/ceph/ceph/pull/11713>`_, Michal Jarzabek)
-* cephfs: mds/MDCache.h: remove unneeded call to clear func (`pr#11954 <http://github.com/ceph/ceph/pull/11954>`_, Michal Jarzabek)
-* cephfs: mds/MDCache.h: remove unused functions (`pr#11908 <http://github.com/ceph/ceph/pull/11908>`_, Michal Jarzabek)
-* cephfs: mds/MDLog: add const to member functions (`pr#11663 <http://github.com/ceph/ceph/pull/11663>`_, Michal Jarzabek)
-* cephfs: mds/MDSMap.h: add const to member functions (`pr#11511 <http://github.com/ceph/ceph/pull/11511>`_, Michal Jarzabek)
-* cephfs: mds/MDSRank: add const to member functions (`pr#11752 <http://github.com/ceph/ceph/pull/11752>`_, Michal Jarzabek)
-* cephfs: mds/MDSRank.h: add override to virtual function (`pr#11727 <http://github.com/ceph/ceph/pull/11727>`_, Michal Jarzabek)
-* cephfs: mds/MDSRank.h: make destructor protected (`pr#11651 <http://github.com/ceph/ceph/pull/11651>`_, Michal Jarzabek)
-* cephfs: mds/MDSTableClient.h: add const to member funct (`pr#11681 <http://github.com/ceph/ceph/pull/11681>`_, Michal Jarzabek)
-* cephfs: mds/Migrator.cc: remove unneeded use of count (`pr#11523 <http://github.com/ceph/ceph/pull/11523>`_, Michal Jarzabek)
-* cephfs: mds/Migrator.h: add const to member functions (`pr#11819 <http://github.com/ceph/ceph/pull/11819>`_, Michal Jarzabek)
-* cephfs: mds/Migrator.h: remove unneeded use of count (`pr#11833 <http://github.com/ceph/ceph/pull/11833>`_, Michal Jarzabek)
-* cephfs: mds/Mutation.h: add const to member functions (`pr#11670 <http://github.com/ceph/ceph/pull/11670>`_, Michal Jarzabek)
-* cephfs: mds/Mutation.h: simplify constructors (`pr#11455 <http://github.com/ceph/ceph/pull/11455>`_, Michal Jarzabek)
-* cephfs: MDS: reduce usage of context wrapper (`pr#11560 <http://github.com/ceph/ceph/pull/11560>`_, Yan, Zheng)
-* cephfs: mds/ScrubHeader.h: pass string by const reference (`pr#11904 <http://github.com/ceph/ceph/pull/11904>`_, Michal Jarzabek)
-* cephfs: mds/server: merge the snapshot request judgment (`pr#11150 <http://github.com/ceph/ceph/pull/11150>`_, huanwen ren)
-* cephfs: mds/SessionMap: add const to member functions (`pr#11541 <http://github.com/ceph/ceph/pull/11541>`_, Michal Jarzabek)
-* cephfs: mds/SessionMap.cc: avoid copying and add const (`pr#11297 <http://github.com/ceph/ceph/pull/11297>`_, Michal Jarzabek)
-* cephfs: mds/SessionMap.cc:put classes in unnamed namespace (`pr#11316 <http://github.com/ceph/ceph/pull/11316>`_, Michal Jarzabek)
-* cephfs: mds/SessionMap.cc: remove unneeded use of count (`pr#11338 <http://github.com/ceph/ceph/pull/11338>`_, Michal Jarzabek)
-* cephfs: mds/SessionMap.h: remove unneeded function (`pr#11565 <http://github.com/ceph/ceph/pull/11565>`_, Michal Jarzabek)
-* cephfs: mds/SessionMap.h: remove unneeded use of count (`pr#11358 <http://github.com/ceph/ceph/pull/11358>`_, Michal Jarzabek)
-* cephfs: mds/SnapRealm: remove unneeded use of count (`pr#11609 <http://github.com/ceph/ceph/pull/11609>`_, Michal Jarzabek)
-* cephfs: mds/SnapServer.h: add override to virtual functs (`pr#11380 <http://github.com/ceph/ceph/pull/11380>`_, Michal Jarzabek)
-* cephfs: mds/SnapServer.h: add override to virtual functs (`pr#11583 <http://github.com/ceph/ceph/pull/11583>`_, Michal Jarzabek)
-* cephfs: mon/MDSMonitor: fix iterating over mutated map (`issue#18166 <http://tracker.ceph.com/issues/18166>`_, `pr#12395 <http://github.com/ceph/ceph/pull/12395>`_, John Spray)
-* cephfs: multimds: fix state check in Migrator::find_stale_export_freeze() (`pr#12098 <http://github.com/ceph/ceph/pull/12098>`_, Yan, Zheng)
-* cephfs: osdc: After write try merge bh. (`issue#17270 <http://tracker.ceph.com/issues/17270>`_, `pr#11545 <http://github.com/ceph/ceph/pull/11545>`_, Jianpeng Ma)
-* cephfs: Partial organization of mds/ header sections (`pr#11959 <http://github.com/ceph/ceph/pull/11959>`_, Patrick Donnelly)
-* cephfs: Port/bootstrap (`pr#827 <http://github.com/ceph/ceph/pull/827>`_, Yan, Zheng)
-* cephfs: Revert "osdc: After write try merge bh." (`issue#17270 <http://tracker.ceph.com/issues/17270>`_, `pr#11262 <http://github.com/ceph/ceph/pull/11262>`_, John Spray)
-* cephfs: Small pile of random cephfs fixes and cleanup (`pr#11421 <http://github.com/ceph/ceph/pull/11421>`_, Jeff Layton)
-* cephfs: src/mds: fix MDSMap upgrade decoding (`issue#17837 <http://tracker.ceph.com/issues/17837>`_, `pr#12097 <http://github.com/ceph/ceph/pull/12097>`_, John Spray)
-* cephfs: systemd: add ceph-fuse service file (`pr#11542 <http://github.com/ceph/ceph/pull/11542>`_, Patrick Donnelly)
-* cephfs: test fragment size limit (`issue#16164 <http://tracker.ceph.com/issues/16164>`_, `pr#1069 <http://github.com/ceph/ceph/pull/1069>`_, Patrick Donnelly)
-* cephfs: test readahead is working (`issue#16024 <http://tracker.ceph.com/issues/16024>`_, `pr#1046 <http://github.com/ceph/ceph/pull/1046>`_, Patrick Donnelly)
-* cephfs: test: temporarily remove fork()ing flock tests (`issue#16556 <http://tracker.ceph.com/issues/16556>`_, `pr#11211 <http://github.com/ceph/ceph/pull/11211>`_, John Spray)
-* cephfs: tool/cephfs: displaying "list" in journal event mode (`pr#11236 <http://github.com/ceph/ceph/pull/11236>`_, huanwen ren)
-* cephfs: tools/cephfs: add pg_files command (`issue#17249 <http://tracker.ceph.com/issues/17249>`_, `pr#11026 <http://github.com/ceph/ceph/pull/11026>`_, John Spray)
-* cephfs: tools/cephfs: add scan_links command which fixes linkages errors (`pr#11446 <http://github.com/ceph/ceph/pull/11446>`_, Yan, Zheng)
-* cephfs: update tests to enable multimds when needed (`pr#933 <http://github.com/ceph/ceph/pull/933>`_, Greg Farnum)
-* cleanup: build: The Light Clangtastic (`pr#11921 <http://github.com/ceph/ceph/pull/11921>`_, Adam C. Emerson)
-* cleanup,common: common/blkdev: use realpath instead of readlink to resolve the recurs… (`pr#12462 <http://github.com/ceph/ceph/pull/12462>`_, Xinze Chi)
-* cleanup,common: common/throttle: simplify Throttle::_wait() (`pr#11165 <http://github.com/ceph/ceph/pull/11165>`_, xie xingguo)
-* cleanup,common: src/common: remove nonused config option (`pr#12311 <http://github.com/ceph/ceph/pull/12311>`_, Wei Jin)
-* cleanup: coverity fix: fixing few coverity issue (`pr#9624 <http://github.com/ceph/ceph/pull/9624>`_, Gaurav Kumar Garg)
-* cleanup: deprecate readdir_r() with readdir() (`pr#11805 <http://github.com/ceph/ceph/pull/11805>`_, Kefu Chai)
-* cleanup: erasure-code: fix gf-complete warning (`pr#12150 <http://github.com/ceph/ceph/pull/12150>`_, Kefu Chai)
-* cleanup: fix typos (`pr#12502 <http://github.com/ceph/ceph/pull/12502>`_, xianxiaxiao)
-* cleanup: mds/FSMap.cc: prevent unneeded copy of map entry (`pr#11798 <http://github.com/ceph/ceph/pull/11798>`_, Michal Jarzabek)
-* cleanup: mds/FSMap.h: add const and reference (`pr#11802 <http://github.com/ceph/ceph/pull/11802>`_, Michal Jarzabek)
-* cleanup: mds/FSMap: pass shared_ptr by const ref (`pr#11383 <http://github.com/ceph/ceph/pull/11383>`_, Michal Jarzabek)
-* cleanup: mds/SnapServer: add const to member function (`pr#11688 <http://github.com/ceph/ceph/pull/11688>`_, Michal Jarzabek)
-* cleanup: mon/MonCap.h: add std::move for std::string (`pr#10722 <http://github.com/ceph/ceph/pull/10722>`_, Michal Jarzabek)
-* cleanup: mon/OSDMonitor: only show interesting flags in health warning (`issue#18175 <http://tracker.ceph.com/issues/18175>`_, `pr#12365 <http://github.com/ceph/ceph/pull/12365>`_, Sage Weil)
-* cleanup: msg/async: assert(0) -> ceph_abort() (`pr#12339 <http://github.com/ceph/ceph/pull/12339>`_, Li Wang)
-* cleanup: msg/AsyncMessenger: remove unneeded include (`pr#9846 <http://github.com/ceph/ceph/pull/9846>`_, Michal Jarzabek)
-* cleanup: msg/async/rdma: fix disconnect log line (`pr#12254 <http://github.com/ceph/ceph/pull/12254>`_, Adir Lev)
-* cleanup: msg/async: remove unused member variable (`pr#12387 <http://github.com/ceph/ceph/pull/12387>`_, Kefu Chai)
-* cleanup: msg: fix format specifier for unsigned value id (`pr#11145 <http://github.com/ceph/ceph/pull/11145>`_, Weibing Zhang)
-* cleanup: msg/Pipe: move DelayedDelivery class to cc file (`pr#10447 <http://github.com/ceph/ceph/pull/10447>`_, Michal Jarzabek)
-* cleanup: msg/test: fix the guided compile-command to ceph_test_msgr (`pr#10490 <http://github.com/ceph/ceph/pull/10490>`_, Yan Jun)
-* cleanup: osd/PGBackend: build_push_op segment fault (`pr#9357 <http://github.com/ceph/ceph/pull/9357>`_, Zengran Zhang)
-* cleanup: osd/PG.h: change PGRecoveryStats struct to class (`pr#11178 <http://github.com/ceph/ceph/pull/11178>`_, Michal Jarzabek)
-* cleanup: osd/PG.h: remove unneeded forward declaration (`pr#12135 <http://github.com/ceph/ceph/pull/12135>`_, Li Wang)
-* cleanup: osd/ReplicatedPG: remove unneeded use of count (`pr#11251 <http://github.com/ceph/ceph/pull/11251>`_, Michal Jarzabek)
-* cleanup: os/filestore: clean filestore perfcounters (`pr#11524 <http://github.com/ceph/ceph/pull/11524>`_, Wei Jin)
-* cleanup: os/fs/FS.cc: condition on WITH_AIO for FreeBSD (`pr#11913 <http://github.com/ceph/ceph/pull/11913>`_, Willem Jan Withagen)
-* cleanup,rbd: cls_rbd: silence compiler warnings (`pr#11363 <http://github.com/ceph/ceph/pull/11363>`_, xiexingguo)
-* cleanup,rbd: journal: avoid logging an error when a watch is blacklisted (`issue#18243 <http://tracker.ceph.com/issues/18243>`_, `pr#12473 <http://github.com/ceph/ceph/pull/12473>`_, Jason Dillaman)
-* cleanup,rbd: journal: prevent repetitive error messages after being blacklisted (`issue#18243 <http://tracker.ceph.com/issues/18243>`_, `pr#12497 <http://github.com/ceph/ceph/pull/12497>`_, Jason Dillaman)
-* cleanup,rbd: librbd/ImageCtx: no need for virtual dtor (`pr#12220 <http://github.com/ceph/ceph/pull/12220>`_, Sage Weil)
-* cleanup,rbd: rbd-mirror: configuration overrides for hard coded timers (`pr#11840 <http://github.com/ceph/ceph/pull/11840>`_, Dongsheng Yang)
-* cleanup,rbd: rbd-mirror: set SEQUENTIAL and NOCACHE advise flags on image sync (`issue#17127 <http://tracker.ceph.com/issues/17127>`_, `pr#12280 <http://github.com/ceph/ceph/pull/12280>`_, Mykola Golub)
-* cleanup: remove unneeded forward declaration (`pr#12257 <http://github.com/ceph/ceph/pull/12257>`_, Li Wang, Yunchuan Wen)
-* cleanup: remove unused declaration (`pr#12466 <http://github.com/ceph/ceph/pull/12466>`_, Li Wang, Yunchuan Wen)
-* cleanup,rgw: rgw multisite: move lease up to RunBucketSync instead of child crs (`pr#11598 <http://github.com/ceph/ceph/pull/11598>`_, Casey Bodley)
-* cleanup,rgw: rgw/rest: don't print empty x-amz-request-id (`pr#10674 <http://github.com/ceph/ceph/pull/10674>`_, Marcus Watts)
-* cleanup,rgw: verified: f23 (`pr#12103 <http://github.com/ceph/ceph/pull/12103>`_, Radoslaw Zarzynski)
-* cleanup: src/common/perf_counters.h: fix wrong word (`pr#11690 <http://github.com/ceph/ceph/pull/11690>`_, zhang.zezhu)
-* cleanup: Wip ctypos (`pr#12495 <http://github.com/ceph/ceph/pull/12495>`_, xianxiaxiao)
-* cleanup: xio: provide dout_prefix for XioConnection (`pr#9444 <http://github.com/ceph/ceph/pull/9444>`_, Avner BenHanoch)
-* cleanup: yasm-wrapper: translate "-isystem $1" to "-i $1" (`pr#12093 <http://github.com/ceph/ceph/pull/12093>`_, Kefu Chai)
-* cmake: add -Wno-unknown-pragmas to CMAKE_CXX_FLAGS (`pr#12128 <http://github.com/ceph/ceph/pull/12128>`_, Kefu Chai)
-* cmake: check WITH_RADOSGW for fcgi and expat dependencies (`pr#11481 <http://github.com/ceph/ceph/pull/11481>`_, David Disseldorp)
-* cmake: compile C code with c99 (`pr#12369 <http://github.com/ceph/ceph/pull/12369>`_, Kefu Chai)
-* cmake: detect keyutils if WITH_LIBCEPHFS OR WITH_RBD (`pr#12359 <http://github.com/ceph/ceph/pull/12359>`_, Kefu Chai)
-* cmake: do not link erasure tests again libosd (`pr#11738 <http://github.com/ceph/ceph/pull/11738>`_, Kefu Chai)
-* cmake: find gperftools package for tcmalloc_minimal too (`pr#11403 <http://github.com/ceph/ceph/pull/11403>`_, Bassam Tabbara)
-* cmake: fix boost build on ubuntu 16.10 yakkety (`pr#12143 <http://github.com/ceph/ceph/pull/12143>`_, Bassam Tabbara)
-* cmake: Fix for cross compiling (`pr#11404 <http://github.com/ceph/ceph/pull/11404>`_, Bassam Tabbara)
-* cmake: fix git version string, cleanup (`pr#11661 <http://github.com/ceph/ceph/pull/11661>`_, Sage Weil)
-* cmake: librbd cleanup (`pr#11842 <http://github.com/ceph/ceph/pull/11842>`_, Kefu Chai)
-* cmake: link tests against static librados (`issue#17260 <http://tracker.ceph.com/issues/17260>`_, `pr#11575 <http://github.com/ceph/ceph/pull/11575>`_, Kefu Chai)
-* cmake: pass CMAKE_BUILD_TYPE down to rocksdb (`pr#11767 <http://github.com/ceph/ceph/pull/11767>`_, Kefu Chai)
-* cmake: remove include/Makefile.am (`pr#11666 <http://github.com/ceph/ceph/pull/11666>`_, Kefu Chai)
-* cmake: replace civetweb symlink w/file copy (`pr#11900 <http://github.com/ceph/ceph/pull/11900>`_, Matt Benjamin)
-* cmake: should link against ${ALLOC_LIBS} (`pr#11978 <http://github.com/ceph/ceph/pull/11978>`_, Kefu Chai)
-* cmake: src/test/CMakeLists.txt: Exclude test on HAVE_BLKID (`pr#12301 <http://github.com/ceph/ceph/pull/12301>`_, Willem Jan Withagen)
-* cmake: Support for embedding Ceph Daemons (`pr#11764 <http://github.com/ceph/ceph/pull/11764>`_, Bassam Tabbara)
-* cmake: use external project for rocksdb (`pr#11385 <http://github.com/ceph/ceph/pull/11385>`_, Bassam Tabbara)
-* common: Add throttle_get_started perf counter (`pr#12163 <http://github.com/ceph/ceph/pull/12163>`_, Bartłomiej Święcki)
-* common: assert(0) -> ceph_abort() (`pr#12031 <http://github.com/ceph/ceph/pull/12031>`_, Sage Weil)
-* common: auth: fix NULL pointer access when trying to delete CryptoAESKeyHandler instance (`pr#11614 <http://github.com/ceph/ceph/pull/11614>`_, runsisi)
-* common,bluestore: compressor: fixes and tests; disable zlib isal (it's broken) (`pr#11349 <http://github.com/ceph/ceph/pull/11349>`_, Sage Weil)
-* common,bluestore: mempool: mempool infrastructure, bluestore changes to use it (`pr#11331 <http://github.com/ceph/ceph/pull/11331>`_, Allen Samuels, Sage Weil)
-* common: buffer: add advance(unsigned) back (`issue#17809 <http://tracker.ceph.com/issues/17809>`_, `pr#11993 <http://github.com/ceph/ceph/pull/11993>`_, Kefu Chai)
-* common: buffer: add copy(unsigned, ptr) back (`issue#17809 <http://tracker.ceph.com/issues/17809>`_, `pr#12246 <http://github.com/ceph/ceph/pull/12246>`_, Kefu Chai)
-* common: client/Client.cc: fix/silence "logically dead code" CID-Error (`pr#291 <http://github.com/ceph/ceph/pull/291>`_, Yehuda Sadeh)
-* common: common/strtol.cc: Get error testing also to work on FreeBSD (`pr#12034 <http://github.com/ceph/ceph/pull/12034>`_, Willem Jan Withagen)
-* common: fix clang compilation error (`pr#12565 <http://github.com/ceph/ceph/pull/12565>`_, Mykola Golub)
-* common: FreeBSD/EventKqueue.{h,cc} Added code to restore events on (thread)fork (`pr#11430 <http://github.com/ceph/ceph/pull/11430>`_, Willem Jan Withagen)
-* common: log/LogClient: fill seq & who for syslog and graylog (`issue#16609 <http://tracker.ceph.com/issues/16609>`_, `pr#10196 <http://github.com/ceph/ceph/pull/10196>`_, Xiaoxi Chen)
-* common: make l_finisher_complete_lat more accurate (`pr#11637 <http://github.com/ceph/ceph/pull/11637>`_, Pan Liu)
-* common: msg/simple/Accepter.cc: replace shutdown() with selfpipe event in poll() (FreeBSD) (`pr#10720 <http://github.com/ceph/ceph/pull/10720>`_, Willem Jan Withagen)
-* common: osdc/Objecter: fix relock race (`issue#17942 <http://tracker.ceph.com/issues/17942>`_, `pr#12234 <http://github.com/ceph/ceph/pull/12234>`_, Sage Weil)
-* common: osdc/Objecter: handle race between calc_target and handle_osd_map (`issue#17942 <http://tracker.ceph.com/issues/17942>`_, `pr#12055 <http://github.com/ceph/ceph/pull/12055>`_, Sage Weil)
-* common: osd/osdmap: fix divide by zero error (`pr#12521 <http://github.com/ceph/ceph/pull/12521>`_, Yunchuan Wen)
-* common: release g_ceph_context before returns (`issue#17762 <http://tracker.ceph.com/issues/17762>`_, `pr#11733 <http://github.com/ceph/ceph/pull/11733>`_, Kefu Chai)
-* common: Remove the runtime dependency on lsb_release (`issue#17425 <http://tracker.ceph.com/issues/17425>`_, `pr#11365 <http://github.com/ceph/ceph/pull/11365>`_, Brad Hubbard)
-* common: test/fio: fix global CephContext life cycle (`pr#12245 <http://github.com/ceph/ceph/pull/12245>`_, Igor Fedotov)
-* core: auth: tolerate missing MGR keys during upgrade (`pr#11401 <http://github.com/ceph/ceph/pull/11401>`_, Sage Weil)
-* core,bluestore: os/bluestore: fix warning and uninit variable (`pr#12032 <http://github.com/ceph/ceph/pull/12032>`_, Sage Weil)
-* core,bluestore: os: fix offsets for move_ranges operation (`pr#11595 <http://github.com/ceph/ceph/pull/11595>`_, Sage Weil)
-* core,bluestore: os: remove move_ranges_destroy_src (`pr#11791 <http://github.com/ceph/ceph/pull/11791>`_, Sage Weil)
-* core: ceph-disk: allow using a regular file as a journal (`issue#17662 <http://tracker.ceph.com/issues/17662>`_, `pr#11619 <http://github.com/ceph/ceph/pull/11619>`_, Jayashree Candadai, Loic Dachary)
-* core: ceph-disk: resolve race conditions (`issue#17889 <http://tracker.ceph.com/issues/17889>`_, `issue#17813 <http://tracker.ceph.com/issues/17813>`_, `pr#12136 <http://github.com/ceph/ceph/pull/12136>`_, Loic Dachary)
-* core,cephfs: osdc/ObjectCacher: wake up dirty stat waiters after removing buffers (`issue#17275 <http://tracker.ceph.com/issues/17275>`_, `pr#11593 <http://github.com/ceph/ceph/pull/11593>`_, Yan, Zheng)
-* core: ceph.in: allow 'flags' to not be present in cmddescs (`issue#18297 <http://tracker.ceph.com/issues/18297>`_, `pr#12540 <http://github.com/ceph/ceph/pull/12540>`_, Dan Mick)
-* core,cleanup: ceph-disk: do not create bluestore wal/db partitions by default (`issue#18291 <http://tracker.ceph.com/issues/18291>`_, `pr#12531 <http://github.com/ceph/ceph/pull/12531>`_, Loic Dachary)
-* core,cleanup,common: common/TrackedOp: remove unused 'now' in _dump() (`pr#12007 <http://github.com/ceph/ceph/pull/12007>`_, John Spray)
-* core,cleanup: FileStore: Only verify split when it has been really done and done correctly (`pr#11731 <http://github.com/ceph/ceph/pull/11731>`_, Li Wang)
-* core,cleanup: kv: remove snapshot iterator (`pr#12049 <http://github.com/ceph/ceph/pull/12049>`_, Sage Weil)
-* core,cleanup: mon/MonClient.h: remove repeated searching of map (`pr#10601 <http://github.com/ceph/ceph/pull/10601>`_, Michal Jarzabek)
-* core,cleanup: msg: Fix typos in socket creation error message (`pr#11907 <http://github.com/ceph/ceph/pull/11907>`_, Brad Hubbard)
-* core,cleanup: osd/command tell: check pgid at the right time (`pr#11547 <http://github.com/ceph/ceph/pull/11547>`_, Javeme)
-* core,cleanup: osd/OSDMap.cc: fix duplicated assignment for new_blacklist_entries (`pr#11799 <http://github.com/ceph/ceph/pull/11799>`_, Ker Liu)
-* core,cleanup: osd/PG.cc: prevent repeated searching of map/set (`pr#11203 <http://github.com/ceph/ceph/pull/11203>`_, Michal Jarzabek)
-* core,cleanup: osd/ReplicatedPG: remove redundant check for balance/localize read (`pr#10209 <http://github.com/ceph/ceph/pull/10209>`_, runsisi)
-* core,cleanup: osd/ReplicatedPG: remove unneeded use of count (`pr#11242 <http://github.com/ceph/ceph/pull/11242>`_, Michal Jarzabek)
-* core,cleanup: os/filestore: handle EINTR returned by io_getevents() (`pr#11890 <http://github.com/ceph/ceph/pull/11890>`_, Pan Liu)
-* core,cleanup: os/ObjectStore: remove legacy tbl support (`pr#11770 <http://github.com/ceph/ceph/pull/11770>`_, Jianpeng Ma)
-* core,cleanup: scan build fixes (`pr#12148 <http://github.com/ceph/ceph/pull/12148>`_, Kefu Chai)
-* core,cleanup: src: rename ReplicatedPG to PrimaryLogPG (`pr#12487 <http://github.com/ceph/ceph/pull/12487>`_, Samuel Just)
-* core,cleanup: Wip scrub misc (`pr#11397 <http://github.com/ceph/ceph/pull/11397>`_, David Zafman)
-* core,common: buffer: put buffers in buffer_{data,meta} mempools (`pr#11839 <http://github.com/ceph/ceph/pull/11839>`_, Sage Weil)
-* core,common: msg: add entity_addr_t types; add new entity_addrvec_t type (`pr#9825 <http://github.com/ceph/ceph/pull/9825>`_, Zhao Junwang, Sage Weil)
-* core,common: msg/simple/Pipe: handle addr decode error (`issue#18072 <http://tracker.ceph.com/issues/18072>`_, `pr#12221 <http://github.com/ceph/ceph/pull/12221>`_, Sage Weil)
-* core: compress: Fix compilation failure from missing header (`pr#12108 <http://github.com/ceph/ceph/pull/12108>`_, Adam C. Emerson)
-* core: denc: don't pass null instances into encoder fns (`issue#17636 <http://tracker.ceph.com/issues/17636>`_, `pr#11577 <http://github.com/ceph/ceph/pull/11577>`_, John Spray)
-* core: erasure-code: synchronize with upstream gf-complete (`issue#18092 <http://tracker.ceph.com/issues/18092>`_, `pr#12382 <http://github.com/ceph/ceph/pull/12382>`_, Loic Dachary)
-* core: FreeBSD/OSD.cc: add client_messenger to the avoid_ports set. (`pr#12463 <http://github.com/ceph/ceph/pull/12463>`_, Willem Jan Withagen)
-* core: include/object: pass "snapid_t&" to bound_encode() (`pr#11552 <http://github.com/ceph/ceph/pull/11552>`_, Kefu Chai)
-* core: kv/RocksDBStore: Don't update rocksdb perf_context if rocksdb_perf di… (`pr#12064 <http://github.com/ceph/ceph/pull/12064>`_, Jianpeng Ma)
-* core: librados-dev: install inline_memory.h (`issue#17654 <http://tracker.ceph.com/issues/17654>`_, `pr#11730 <http://github.com/ceph/ceph/pull/11730>`_, Josh Durgin)
-* core: messages/MForward: reencode forwarded message if target has differing features (`pr#11610 <http://github.com/ceph/ceph/pull/11610>`_, Sage Weil)
-* core,mgr: messages: fix out of range assertion (`pr#11345 <http://github.com/ceph/ceph/pull/11345>`_, John Spray)
-* core: mon,ceph-disk: add lockbox permissions to bootstrap-osd (`issue#17849 <http://tracker.ceph.com/issues/17849>`_, `pr#11996 <http://github.com/ceph/ceph/pull/11996>`_, Loic Dachary)
-* core:  mon: make it more clearly to debug for paxos state (`pr#12438 <http://github.com/ceph/ceph/pull/12438>`_, song baisen)
-* core: mon/OSDMonitor: encode full osdmaps with features all OSDs can understand (`pr#11284 <http://github.com/ceph/ceph/pull/11284>`_, Sage Weil)
-* core: mon/OSDMonitor: encode OSDMap::Incremental with same features as OSDMap (`pr#11596 <http://github.com/ceph/ceph/pull/11596>`_, Sage Weil)
-* core: mon/OSDMonitor: newly created osd should not be wrongly marked in (`pr#11795 <http://github.com/ceph/ceph/pull/11795>`_, runsisi)
-* core: mon/OSDMonitor: remove duplicate jewel/kraken flag warning (`pr#11775 <http://github.com/ceph/ceph/pull/11775>`_, Josh Durgin)
-* core: mon/PGMap: PGs can be stuck more than one thing (`issue#17515 <http://tracker.ceph.com/issues/17515>`_, `pr#11339 <http://github.com/ceph/ceph/pull/11339>`_, Sage Weil)
-* core: mon: print the num_pools and num_objects in 'ceph -s -f json/json-p… (`issue#17703 <http://tracker.ceph.com/issues/17703>`_, `pr#11654 <http://github.com/ceph/ceph/pull/11654>`_, huangjun)
-* core: msg/async/AsyncConnection: dispatch write handler on keepalive2 (`issue#17664 <http://tracker.ceph.com/issues/17664>`_, `pr#11601 <http://github.com/ceph/ceph/pull/11601>`_, Ilya Dryomov)
-* core: msg/async: DPDKStack as AsyncMessenger backend (`pr#10748 <http://github.com/ceph/ceph/pull/10748>`_, Haomai Wang)
-* core: msg/async/rdma: change log level: 0 -> 1 (`pr#12334 <http://github.com/ceph/ceph/pull/12334>`_, Avner BenHanoch)
-* core: msg/async/rdma: don't use more buffers than what device capabilities … (`pr#12263 <http://github.com/ceph/ceph/pull/12263>`_, Avner BenHanoch)
-* core: msg/async/rdma: ensure CephContext existed (`pr#12068 <http://github.com/ceph/ceph/pull/12068>`_, Haomai Wang)
-* core: msg/async/rdma: event polling thread can block on event (`pr#12270 <http://github.com/ceph/ceph/pull/12270>`_, Haomai Wang)
-* core: msg/async/rdma: fixup memory free (`pr#12236 <http://github.com/ceph/ceph/pull/12236>`_, gongchuang)
-* core: msg/async/rdma: set correct value to memory manager (`pr#12299 <http://github.com/ceph/ceph/pull/12299>`_, Adir Lev)
-* core: msg/async: set nonce before starting the workers (`pr#12390 <http://github.com/ceph/ceph/pull/12390>`_, Kefu Chai)
-* core: msg: make loopback Connection feature accurate all the time (`pr#11183 <http://github.com/ceph/ceph/pull/11183>`_, Sage Weil)
-* core: msg: seed random engine used for ms_type="random" (`pr#11880 <http://github.com/ceph/ceph/pull/11880>`_, Casey Bodley)
-* core: msg/simple/Pipe: avoid returning 0 on poll timeout (`issue#18184 <http://tracker.ceph.com/issues/18184>`_, `pr#12375 <http://github.com/ceph/ceph/pull/12375>`_, Sage Weil)
-* core: msg/simple/Pipe::stop_and_wait: unlock pipe_lock for stop_fast_dispatching() (`issue#18042 <http://tracker.ceph.com/issues/18042>`_, `pr#12307 <http://github.com/ceph/ceph/pull/12307>`_, Samuel Just)
-* core: msg/simple: save the errno in case being changed by subsequent codes (`pr#10297 <http://github.com/ceph/ceph/pull/10297>`_, Yan Jun)
-* core: osd/ECTransaction: only write out the hinfo if not delete (`issue#17983 <http://tracker.ceph.com/issues/17983>`_, `pr#12141 <http://github.com/ceph/ceph/pull/12141>`_, Samuel Just)
-* core: OSDMonitor: only reject MOSDBoot based on up_from if inst matches (`issue#17899 <http://tracker.ceph.com/issues/17899>`_, `pr#12003 <http://github.com/ceph/ceph/pull/12003>`_, Samuel Just)
-* core: osd,mon: require sortbitwise flag to upgrade beyond jewel (`pr#11772 <http://github.com/ceph/ceph/pull/11772>`_, Sage Weil)
-* core: osd/osd_types: fix the osd_stat_t::decode() (`pr#12235 <http://github.com/ceph/ceph/pull/12235>`_, Kefu Chai)
-* core: osd/PG: add "down" pg state (distinct from down+peering) (`pr#12289 <http://github.com/ceph/ceph/pull/12289>`_, Sage Weil)
-* core: osd/PGLog::proc_replica_log,merge_log: fix bound for last_update (`issue#18127 <http://tracker.ceph.com/issues/18127>`_, `pr#12340 <http://github.com/ceph/ceph/pull/12340>`_, Samuel Just)
-* core: osd/ReplicatedPG: do_update_log_missing: take the pg lock in the callback (`issue#17789 <http://tracker.ceph.com/issues/17789>`_, `pr#11754 <http://github.com/ceph/ceph/pull/11754>`_, Samuel Just)
-* core: osd/ReplicatedPG::record_write_error: don't leak orig_reply on cancel (`issue#18180 <http://tracker.ceph.com/issues/18180>`_, `pr#12450 <http://github.com/ceph/ceph/pull/12450>`_, Samuel Just)
-* core: os/filestore: avoid to get the wrong hardlink number. (`pr#11841 <http://github.com/ceph/ceph/pull/11841>`_, huangjun)
-* core: os/filestore/chain_xattr.h:uses ENODATA, so include compat.h (`pr#12279 <http://github.com/ceph/ceph/pull/12279>`_, Willem Jan Withagen)
-* core: os/filestore: Fix erroneous WARNING: max attr too small (`issue#17420 <http://tracker.ceph.com/issues/17420>`_, `pr#11246 <http://github.com/ceph/ceph/pull/11246>`_, Brad Hubbard)
-* core: os/FileStore: fix fiemap issue in xfs when #extents > 1364  (`pr#11554 <http://github.com/ceph/ceph/pull/11554>`_, Ning Yao)
-* core: os/filestore: fix journal logger (`pr#12099 <http://github.com/ceph/ceph/pull/12099>`_, Wei Jin)
-* core: os/filestore: fix potential result code overwriting (`pr#11491 <http://github.com/ceph/ceph/pull/11491>`_, xie xingguo)
-* core: os/filestore/HashIndex: fix list_by_hash_* termination on reaching end (`issue#17859 <http://tracker.ceph.com/issues/17859>`_, `pr#11898 <http://github.com/ceph/ceph/pull/11898>`_, Sage Weil)
-* core: os/ObjectStore: properly clear object map when replaying OP_REMOVE (`issue#17177 <http://tracker.ceph.com/issues/17177>`_, `pr#11388 <http://github.com/ceph/ceph/pull/11388>`_, Yan, Zheng)
-* core,performance: msg/async: ibverbs/rdma support (`pr#11531 <http://github.com/ceph/ceph/pull/11531>`_, Haomai Wang, Zhi Wang)
-* core,performance: osd/OSDMap.cc: remove unneeded use of count (`pr#11221 <http://github.com/ceph/ceph/pull/11221>`_, Michal Jarzabek)
-* core,performance: osd/PrimaryLogPG: don't truncate if we don't have to for WRITEFULL (`pr#12534 <http://github.com/ceph/ceph/pull/12534>`_, Samuel Just)
-* core,performance: os/fs/FS: optimize aio::pwritev which make caller provide length. (`pr#9062 <http://github.com/ceph/ceph/pull/9062>`_, Jianpeng Ma)
-* core,pybind,common: python-rados: implement new aio_execute (`pr#12140 <http://github.com/ceph/ceph/pull/12140>`_, Iain Buclaw)
-* core,rbd,bluestore,rgw,performance,cephfs: fast denc encoding (`pr#11027 <http://github.com/ceph/ceph/pull/11027>`_, Sage Weil)
-* core: remove spurious executable permissions on source code files (`pr#1061 <http://github.com/ceph/ceph/pull/1061>`_, Samuel Just)
-* core: ReplicatedPG::failed_push: release read lock on failure (`issue#17857 <http://tracker.ceph.com/issues/17857>`_, `pr#11914 <http://github.com/ceph/ceph/pull/11914>`_, Kefu Chai)
-* core: rocksdb: update to latest, and make it the default for the mons (`pr#11354 <http://github.com/ceph/ceph/pull/11354>`_, Sage Weil)
-* core: set dumpable flag after setuid (`issue#17650 <http://tracker.ceph.com/issues/17650>`_, `pr#11582 <http://github.com/ceph/ceph/pull/11582>`_, Patrick Donnelly)
-* core: systemd/ceph-disk: reduce ceph-disk flock contention (`issue#18049 <http://tracker.ceph.com/issues/18049>`_, `issue#13160 <http://tracker.ceph.com/issues/13160>`_, `pr#12200 <http://github.com/ceph/ceph/pull/12200>`_, David Disseldorp)
-* core: tchaikov (`issue#17713 <http://tracker.ceph.com/issues/17713>`_, `pr#11382 <http://github.com/ceph/ceph/pull/11382>`_, Haomai Wang)
-* core,tests: ceph_test_rados_api_tier: dump hitset that we fail to decode (`issue#17945 <http://tracker.ceph.com/issues/17945>`_, `pr#12057 <http://github.com/ceph/ceph/pull/12057>`_, Sage Weil)
-* core,tests: common osd: Improve scrub analysis, list-inconsistent-obj output and osd-scrub-repair test (`issue#18114 <http://tracker.ceph.com/issues/18114>`_, `pr#9613 <http://github.com/ceph/ceph/pull/9613>`_, Kefu Chai, David Zafman)
-* core,tests: test,cmake: turn unit.h into unit.cc to speed up compilation (`pr#12194 <http://github.com/ceph/ceph/pull/12194>`_, Kefu Chai)
-* core,tests: test/rados/list.cc: Memory leak in ceph_test_rados_api_list (`issue#18250 <http://tracker.ceph.com/issues/18250>`_, `pr#12479 <http://github.com/ceph/ceph/pull/12479>`_, Brad Hubbard)
-* core,tests: workunits/ceph-helpers.sh: Fixes for FreeBSD (`pr#12085 <http://github.com/ceph/ceph/pull/12085>`_, Willem Jan Withagen)
-* core,tools: Added append functionality to rados tool. (`pr#11036 <http://github.com/ceph/ceph/pull/11036>`_, Tomy Cheru)
-* core,tools: Tested-by: Huawen Ren <ren.huanwen@zte.com.cn> (`issue#17400 <http://tracker.ceph.com/issues/17400>`_, `pr#11276 <http://github.com/ceph/ceph/pull/11276>`_, Kefu Chai)
-* core,tools: vstart: decrease pool size if <3 OSDs (`pr#11528 <http://github.com/ceph/ceph/pull/11528>`_, John Spray)
-* crush: make counting of choose_tries consistent (`issue#17229 <http://tracker.ceph.com/issues/17229>`_, `pr#10993 <http://github.com/ceph/ceph/pull/10993>`_, Vicente Cheng)
-* crush: remove the crush_lock (`pr#11830 <http://github.com/ceph/ceph/pull/11830>`_, Adam C. Emerson)
-* crush: Silence coverity warnings for test/crush/crush.cc (`pr#12436 <http://github.com/ceph/ceph/pull/12436>`_, Brad Hubbard)
-* doc: Add doc about osd scrub {during recovery|chunk {min|max}| sleep} (`pr#12176 <http://github.com/ceph/ceph/pull/12176>`_, Paweł Sadowski)
-* doc: Add docs about looking up Monitors through DNS (`issue#14527 <http://tracker.ceph.com/issues/14527>`_, `pr#10852 <http://github.com/ceph/ceph/pull/10852>`_, Wido den Hollander)
-* doc: add docs for raw compression (`pr#12244 <http://github.com/ceph/ceph/pull/12244>`_, Casey Bodley)
-* doc: Add documentation about mon_allow_pool_delete before pool remove (`pr#11943 <http://github.com/ceph/ceph/pull/11943>`_, Wido den Hollander)
-* doc: add infernalis EOL date (`pr#11925 <http://github.com/ceph/ceph/pull/11925>`_, Ken Dreyer)
-* doc: adding changelog for v10.2.4 (`pr#12346 <http://github.com/ceph/ceph/pull/12346>`_, Abhishek Lekshmanan)
-* doc: Add MON docs about pool flags and pool removal config settings (`pr#10853 <http://github.com/ceph/ceph/pull/10853>`_, Wido den Hollander)
-* doc: add python-rgw doc (`pr#11859 <http://github.com/ceph/ceph/pull/11859>`_, Kefu Chai)
-* doc: change the osd_max_backfills default to 1 (`issue#17701 <http://tracker.ceph.com/issues/17701>`_, `pr#11658 <http://github.com/ceph/ceph/pull/11658>`_, huangjun)
-* doc: clarify file deletion from OSD restricted pool behaviour (`issue#17937 <http://tracker.ceph.com/issues/17937>`_, `pr#12054 <http://github.com/ceph/ceph/pull/12054>`_, David Disseldorp)
-* doc: clarify mds deactivate purpose (`pr#11957 <http://github.com/ceph/ceph/pull/11957>`_, Patrick Donnelly)
-* doc: common/Throttle: fix typo for BackoffThrottle (`pr#12129 <http://github.com/ceph/ceph/pull/12129>`_, Wei Jin)
-* doc: correcting the object name (`pr#12354 <http://github.com/ceph/ceph/pull/12354>`_, Uday Mullangi)
-* doc: Correcting the sample python tempurl generation script. (`issue#15258 <http://tracker.ceph.com/issues/15258>`_, `pr#8712 <http://github.com/ceph/ceph/pull/8712>`_, Diwakar Goel)
-* doc: Coverity and SCA fixes (`pr#7784 <http://github.com/ceph/ceph/pull/7784>`_, Danny Al-Gaaf)
-* doc: doc/dev/osd_internals: add pgpool.rst (`pr#12500 <http://github.com/ceph/ceph/pull/12500>`_, Brad Hubbard)
-* doc: doc/dev/perf: a few notes on perf (`pr#12168 <http://github.com/ceph/ceph/pull/12168>`_, Sage Weil)
-* doc: doc/dev/perf: fix dittography (`pr#12317 <http://github.com/ceph/ceph/pull/12317>`_, xie xingguo)
-* doc: doc/man: avoid file builtin to solve build error (`pr#11984 <http://github.com/ceph/ceph/pull/11984>`_, Patrick Donnelly)
-* doc: doc/rados/configuration/ms-ref.rst: document a few async msgr options (`pr#12126 <http://github.com/ceph/ceph/pull/12126>`_, Piotr Dałek)
-* doc: doc/rados/configuration/osd-config-ref.rst: document the fast mark down (`pr#12124 <http://github.com/ceph/ceph/pull/12124>`_, Piotr Dałek)
-* doc: doc/release-notes: kraken release notes (draft) (`pr#12338 <http://github.com/ceph/ceph/pull/12338>`_, Sage Weil)
-* doc: doc/releases: add links to kraken and v10.2.4 (`pr#12409 <http://github.com/ceph/ceph/pull/12409>`_, Kefu Chai)
-* doc: doc/start/hardware-recommentdations: cosmetic (`pr#10585 <http://github.com/ceph/ceph/pull/10585>`_, Zhao Junwang)
-* doc: Documentation syntax cleanup (`pr#11784 <http://github.com/ceph/ceph/pull/11784>`_, John Spray)
-* doc: document osd tell bench (`issue#5431 <http://tracker.ceph.com/issues/5431>`_, `pr#16 <http://github.com/ceph/ceph/pull/16>`_, Sage Weil)
-* doc: drop --journal-check from ceph-mds man page (`issue#17747 <http://tracker.ceph.com/issues/17747>`_, `pr#11912 <http://github.com/ceph/ceph/pull/11912>`_, Nathan Cutler)
-* doc: explain rgw_fcgi_socket_backlog in rgw/config-ref.rst (`pr#12548 <http://github.com/ceph/ceph/pull/12548>`_, liuchang0812)
-* doc: final additions to 11.1.0-rc release notes (`pr#12448 <http://github.com/ceph/ceph/pull/12448>`_, Abhishek Lekshmanan)
-* doc: Fix broken link for caps (`issue#17587 <http://tracker.ceph.com/issues/17587>`_, `pr#11546 <http://github.com/ceph/ceph/pull/11546>`_, Uday Mullangi)
-* doc: fix broken links (`issue#17587 <http://tracker.ceph.com/issues/17587>`_, `pr#11518 <http://github.com/ceph/ceph/pull/11518>`_, Uday Mullangi)
-* doc: fix dead link "Hardware Recommendations" (`pr#11379 <http://github.com/ceph/ceph/pull/11379>`_, Leo Zhang)
-* doc: fix dead link of "os-recommendations" in troubleshooting-osd (`pr#11454 <http://github.com/ceph/ceph/pull/11454>`_, Leo Zhang)
-* doc: Fixed mapping error in legacy mds command (`pr#11668 <http://github.com/ceph/ceph/pull/11668>`_, Malte Fiala)
-* doc: Fix for worker arguments to cephfs-data-scan tool (`pr#12360 <http://github.com/ceph/ceph/pull/12360>`_, Wido den Hollander)
-* doc: fix grammar/spelling in RGW sections (`pr#12329 <http://github.com/ceph/ceph/pull/12329>`_, Ken Dreyer)
-* doc: Fixing the broken hyperlinks by pointing to correct documentation. (`pr#11617 <http://github.com/ceph/ceph/pull/11617>`_, Uday Mullangi)
-* doc: fix librados example programs (`pr#11302 <http://github.com/ceph/ceph/pull/11302>`_, Alexey Sheplyakov)
-* doc: fix mgr literal block rST syntax (`pr#11652 <http://github.com/ceph/ceph/pull/11652>`_, Ken Dreyer)
-* doc: fix start development cluster operation in index.rst (`pr#11233 <http://github.com/ceph/ceph/pull/11233>`_, Leo Zhang)
-* doc: fix the script for rebuild monitor db (`pr#11962 <http://github.com/ceph/ceph/pull/11962>`_, Kefu Chai)
-* doc: fix typos (`pr#8751 <http://github.com/ceph/ceph/pull/8751>`_, Li Peng)
-* doc: Flag deprecated mds commands and omit deprecated mon commands in help output (`pr#11434 <http://github.com/ceph/ceph/pull/11434>`_, Patrick Donnelly)
-* doc: mailmap: change personal info (`pr#12310 <http://github.com/ceph/ceph/pull/12310>`_, Wei Jin)
-* doc: mailmap updates sept (`pr#10955 <http://github.com/ceph/ceph/pull/10955>`_, Yann Dupont)
-* doc: mds: fixup "mds bal mode" Description (`pr#12127 <http://github.com/ceph/ceph/pull/12127>`_, huanwen ren)
-* doc: mention corresponding libvirt section in nova.conf (`pr#12584 <http://github.com/ceph/ceph/pull/12584>`_, Marc Koderer)
-* doc: Modify documentation for mon_osd_down_out_interval (`pr#12408 <http://github.com/ceph/ceph/pull/12408>`_, Brad Hubbard)
-* doc: network-protocol typos (`pr#9837 <http://github.com/ceph/ceph/pull/9837>`_, Zhao Junwang)
-* doc: openstack glance mitaka uses show_multiple_locations (`pr#12020 <http://github.com/ceph/ceph/pull/12020>`_, Sébastien Han)
-* doc: README.FreeBSD: update to match the bimonthly FreeBSD status report (`pr#11442 <http://github.com/ceph/ceph/pull/11442>`_, Willem Jan Withagen)
-* doc: README: hint at where to look to diagnose test failures (`pr#11903 <http://github.com/ceph/ceph/pull/11903>`_, Dan Mick)
-* doc: reformat SubmittingPatches with more rst syntax (`pr#11570 <http://github.com/ceph/ceph/pull/11570>`_, Kefu Chai)
-* doc: release notes for 10.2.4 (`pr#12053 <http://github.com/ceph/ceph/pull/12053>`_, Abhishek Lekshmanan)
-* doc: release notes for 10.2.5 (`issue#18207 <http://tracker.ceph.com/issues/18207>`_, `pr#12410 <http://github.com/ceph/ceph/pull/12410>`_, Loic Dachary)
-* doc: release notes for 11.0.2 (`pr#11369 <http://github.com/ceph/ceph/pull/11369>`_, Abhishek Lekshmanan)
-* doc: Remove duplicate command for Ubuntu (`pr#12186 <http://github.com/ceph/ceph/pull/12186>`_, chrone)
-* doc: reviewed-by: John Wilkins <jowilkin@redhat.com> (`issue#17526 <http://tracker.ceph.com/issues/17526>`_, `pr#11352 <http://github.com/ceph/ceph/pull/11352>`_, Loic Dachary)
-* doc: reviewed-by: John Wilkins <jowilkin@redhat.com> (`issue#17665 <http://tracker.ceph.com/issues/17665>`_, `pr#11602 <http://github.com/ceph/ceph/pull/11602>`_, Jason Dillaman)
-* doc: rgw: fix a typo in S3 java api example (`pr#11762 <http://github.com/ceph/ceph/pull/11762>`_, Weibing Zhang)
-* doc: rm "type=rpm-md" from yum repositories (`pr#10248 <http://github.com/ceph/ceph/pull/10248>`_, Ken Dreyer)
-* doc: Small styling fix to mirror documentation (`pr#9714 <http://github.com/ceph/ceph/pull/9714>`_, Wido den Hollander)
-* doc: src/doc: fix class names in exports.txt (`pr#12000 <http://github.com/ceph/ceph/pull/12000>`_, John Spray)
-* doc: standardize EPEL instructions (`pr#11653 <http://github.com/ceph/ceph/pull/11653>`_, Ken Dreyer)
-* doc: update cinder key permissions for mitaka (`pr#12211 <http://github.com/ceph/ceph/pull/12211>`_, Sébastien Han)
-* doc: Update crush-map.rst, fix a typo mistake (`pr#11785 <http://github.com/ceph/ceph/pull/11785>`_, whu_liuchang)
-* doc: Update filestore xattr config documentation. (`pr#11826 <http://github.com/ceph/ceph/pull/11826>`_, Bartłomiej Święcki)
-* doc: Update install-ceph-gateway.rst (`pr#11432 <http://github.com/ceph/ceph/pull/11432>`_, Hans van den Bogert)
-* doc: Update keystone doc about v3 options (`pr#11392 <http://github.com/ceph/ceph/pull/11392>`_, Proskurin Kirill)
-* doc: Update layout.rst, move commands to CODE block (`pr#11987 <http://github.com/ceph/ceph/pull/11987>`_, liuchang0812)
-* doc: we can now run multiple MDS, so qualify warning (`issue#18040 <http://tracker.ceph.com/issues/18040>`_, `pr#12184 <http://github.com/ceph/ceph/pull/12184>`_, Nathan Cutler)
-* fs: add snapshot tests to mds thrashing (`pr#1073 <http://github.com/ceph/ceph/pull/1073>`_, Yan, Zheng)
-* fs: enable ceph-fuse permission checking for all pjd suites (`pr#1187 <http://github.com/ceph/ceph/pull/1187>`_, Greg Farnum)
-* fs: fix two frag_enable fragments (`issue#6143 <http://tracker.ceph.com/issues/6143>`_, `pr#656 <http://github.com/ceph/ceph/pull/656>`_, Sage Weil)
-* fs: fix up dd testing again (`issue#10861 <http://tracker.ceph.com/issues/10861>`_, `pr#373 <http://github.com/ceph/ceph/pull/373>`_, Greg Farnum)
-* fs: fuse_default_permissions = 0 for kernel build test (`pr#1109 <http://github.com/ceph/ceph/pull/1109>`_, Patrick Donnelly)
-* fs: Mantle: A Programmable Metadata Load Balancer (`pr#10887 <http://github.com/ceph/ceph/pull/10887>`_, Michael Sevilla)
-* fs: unify common parts of sub-suites (`issue#1737 <http://tracker.ceph.com/issues/1737>`_, `pr#1282 <http://github.com/ceph/ceph/pull/1282>`_, Patrick Donnelly)
-* librados: Add rados_aio_exec to the C API (`pr#11709 <http://github.com/ceph/ceph/pull/11709>`_, Iain Buclaw)
-* librados: add timeout to watch/notify (`pr#11378 <http://github.com/ceph/ceph/pull/11378>`_, Ryne Li)
-* librados: do not request osd ack if no completed completion is set (`pr#11204 <http://github.com/ceph/ceph/pull/11204>`_, Sage Weil)
-* librados:  For C-API, expose LIBRADOS_OPERATION_FULL_FORCE flag (`pr#9172 <http://github.com/ceph/ceph/pull/9172>`_, Jianpeng Ma)
-* librados: improvements async IO in librados and libradosstriper (`pr#10049 <http://github.com/ceph/ceph/pull/10049>`_, Sebastien Ponce)
-* librados: Memory leaks in object_list_begin and object_list_end (`issue#18252 <http://tracker.ceph.com/issues/18252>`_, `pr#12482 <http://github.com/ceph/ceph/pull/12482>`_, Brad Hubbard)
-* librados: postpone cct deletion (`pr#11659 <http://github.com/ceph/ceph/pull/11659>`_, Kefu Chai)
-* librados: remove new setxattr overload to avoid breaking the C++ ABI (`issue#18058 <http://tracker.ceph.com/issues/18058>`_, `pr#12206 <http://github.com/ceph/ceph/pull/12206>`_, Josh Durgin)
-* librados: remove unused bufferlist from rados_write_op_rmxattr (`pr#12030 <http://github.com/ceph/ceph/pull/12030>`_, Piotr Dałek)
-* librbd: add support for snapshot namespaces (`pr#11160 <http://github.com/ceph/ceph/pull/11160>`_, Victor Denisov)
-* librbd: API changes to support separate data pool (`pr#11353 <http://github.com/ceph/ceph/pull/11353>`_, Jason Dillaman)
-* librbd: batch object map updates during trim (`issue#17356 <http://tracker.ceph.com/issues/17356>`_, `pr#11510 <http://github.com/ceph/ceph/pull/11510>`_, Venky Shankar)
-* librbd: bug fixes for optional data pool support (`pr#11960 <http://github.com/ceph/ceph/pull/11960>`_, Venky Shankar)
-* librbd: cannot access non-primary image when mirroring force disabled  (`issue#16740 <http://tracker.ceph.com/issues/16740>`_, `issue#17588 <http://tracker.ceph.com/issues/17588>`_, `pr#11568 <http://github.com/ceph/ceph/pull/11568>`_, Jason Dillaman)
-* librbd: cls_rbd updates for separate data pool (`issue#17422 <http://tracker.ceph.com/issues/17422>`_, `pr#11327 <http://github.com/ceph/ceph/pull/11327>`_, Jason Dillaman)
-* librbd: default features should be negotiated with the OSD (`issue#17010 <http://tracker.ceph.com/issues/17010>`_, `pr#11808 <http://github.com/ceph/ceph/pull/11808>`_, Mykola Golub)
-* librbd: diffs to clone's first snapshot should include parent diffs (`issue#18068 <http://tracker.ceph.com/issues/18068>`_, `pr#12218 <http://github.com/ceph/ceph/pull/12218>`_, Jason Dillaman)
-* librbd: do not create empty object map object on image creation (`issue#17752 <http://tracker.ceph.com/issues/17752>`_, `pr#11704 <http://github.com/ceph/ceph/pull/11704>`_, Jason Dillaman)
-* librbd: enabling/disabling rbd feature should report missing dependency (`issue#16985 <http://tracker.ceph.com/issues/16985>`_, `pr#12238 <http://github.com/ceph/ceph/pull/12238>`_, Gaurav Kumar Garg)
-* librbd: ensure consistency groups will gracefully fail on older OSDs (`pr#11623 <http://github.com/ceph/ceph/pull/11623>`_, Jason Dillaman)
-* librbd: exclusive lock incorrectly initialized when switching to head revision (`issue#17618 <http://tracker.ceph.com/issues/17618>`_, `pr#11559 <http://github.com/ceph/ceph/pull/11559>`_, Jason Dillaman)
-* librbd: fix rollback if failed to disable mirroring for image (`pr#11260 <http://github.com/ceph/ceph/pull/11260>`_, runsisi)
-* librbd: ignore error when object map is already locked by current client (`issue#16179 <http://tracker.ceph.com/issues/16179>`_, `pr#12484 <http://github.com/ceph/ceph/pull/12484>`_, runsisi)
-* librbd: ignore notify errors on missing image header (`issue#17549 <http://tracker.ceph.com/issues/17549>`_, `pr#11395 <http://github.com/ceph/ceph/pull/11395>`_, Jason Dillaman)
-* librbd: keep rbd_default_features setting as bitmask (`issue#18247 <http://tracker.ceph.com/issues/18247>`_, `pr#12486 <http://github.com/ceph/ceph/pull/12486>`_, Jason Dillaman)
-* librbd: mark request as finished after failed refresh (`issue#17973 <http://tracker.ceph.com/issues/17973>`_, `pr#12160 <http://github.com/ceph/ceph/pull/12160>`_, Venky Shankar)
-* librbd: minor cleanup (`pr#12078 <http://github.com/ceph/ceph/pull/12078>`_, Dongsheng Yang)
-* librbd: new API method to force break a peer's exclusive lock (`issue#18429 <http://tracker.ceph.com/issues/18429>`_, `issue#16988 <http://tracker.ceph.com/issues/16988>`_, `issue#18327 <http://tracker.ceph.com/issues/18327>`_, `pr#12889 <http://github.com/ceph/ceph/pull/12889>`_, Jason Dillaman)
-* librbd: parse rbd_default_features config option as a string (`pr#11175 <http://github.com/ceph/ceph/pull/11175>`_, Alyona Kiseleva, Alexey Sheplyakov)
-* librbd: possible assert failure creating image when using data pool (`pr#11641 <http://github.com/ceph/ceph/pull/11641>`_, Venky Shankar)
-* librbd: proper check for get_data_pool compatibility (`issue#17791 <http://tracker.ceph.com/issues/17791>`_, `pr#11755 <http://github.com/ceph/ceph/pull/11755>`_, Mykola Golub)
-* librbd: properly order concurrent updates to the object map (`issue#16176 <http://tracker.ceph.com/issues/16176>`_, `pr#12420 <http://github.com/ceph/ceph/pull/12420>`_, Jason Dillaman)
-* librbd: release lock after demote (`issue#17880 <http://tracker.ceph.com/issues/17880>`_, `pr#11940 <http://github.com/ceph/ceph/pull/11940>`_, Mykola Golub)
-* librbd: remove consistency group rbd cli and API support (`issue#18231 <http://tracker.ceph.com/issues/18231>`_, `pr#12475 <http://github.com/ceph/ceph/pull/12475>`_, Jason Dillaman)
-* librbd: remove image header lock assertions (`issue#18244 <http://tracker.ceph.com/issues/18244>`_, `pr#12472 <http://github.com/ceph/ceph/pull/12472>`_, Jason Dillaman)
-* librbd: remove unused local variable (`pr#12388 <http://github.com/ceph/ceph/pull/12388>`_, Yunchuan Wen)
-* librbd: silence the unused variable warning (`pr#11678 <http://github.com/ceph/ceph/pull/11678>`_, Kefu Chai)
-* librbd: snap_get_limit compatibility check (`pr#11766 <http://github.com/ceph/ceph/pull/11766>`_, Mykola Golub)
-* librbd: update internals to use optional separate data pool (`pr#11356 <http://github.com/ceph/ceph/pull/11356>`_, Jason Dillaman)
-* librbd: use proper snapshot when computing diff parent overlap (`issue#18200 <http://tracker.ceph.com/issues/18200>`_, `pr#12396 <http://github.com/ceph/ceph/pull/12396>`_, Xiaoxi Chen)
-* log: optimize header file dependency (`pr#9768 <http://github.com/ceph/ceph/pull/9768>`_, Xiaowei Chen)
-* mds: add debug assertion for issue #17636 (`pr#11576 <http://github.com/ceph/ceph/pull/11576>`_, Yan, Zheng)
-* mds: add tests for mantle (programmable balancer) (`pr#1145 <http://github.com/ceph/ceph/pull/1145>`_, Michael Sevilla)
-* mds: check if down mds is known (`issue#17670 <http://tracker.ceph.com/issues/17670>`_, `pr#11611 <http://github.com/ceph/ceph/pull/11611>`_, Patrick Donnelly)
-* mds: don't access mdsmap from log submit thread (`issue#18047 <http://tracker.ceph.com/issues/18047>`_, `pr#12208 <http://github.com/ceph/ceph/pull/12208>`_, Yan, Zheng)
-* mds: don't maintain bloom filters in standby replay (`issue#16924 <http://tracker.ceph.com/issues/16924>`_, `pr#12133 <http://github.com/ceph/ceph/pull/12133>`_, John Spray)
-* mds: enable rmxattr on pool_namespace attrs  (`issue#17797 <http://tracker.ceph.com/issues/17797>`_, `pr#11783 <http://github.com/ceph/ceph/pull/11783>`_, John Spray)
-* mds: fix dropping events in standby replay (`issue#17954 <http://tracker.ceph.com/issues/17954>`_, `pr#12077 <http://github.com/ceph/ceph/pull/12077>`_, John Spray)
-* mds: fix EMetaBlob::fullbit xattr dump (`pr#11536 <http://github.com/ceph/ceph/pull/11536>`_, Sage Weil)
-* mds: fix false "failing to respond to cache pressure" warning (`pr#11373 <http://github.com/ceph/ceph/pull/11373>`_, Yan, Zheng)
-* mds: force client flush snap data before truncating objects (`issue#17193 <http://tracker.ceph.com/issues/17193>`_, `pr#11994 <http://github.com/ceph/ceph/pull/11994>`_, Yan, Zheng)
-* mds: handle bad standby_for_fscids in fsmap (`issue#17466 <http://tracker.ceph.com/issues/17466>`_, `pr#11281 <http://github.com/ceph/ceph/pull/11281>`_, John Spray)
-* mds: ignore 'session evict' when mds is replaying log (`issue#17801 <http://tracker.ceph.com/issues/17801>`_, `pr#11813 <http://github.com/ceph/ceph/pull/11813>`_, Yan, Zheng)
-* mds: include legacy client fsid in FSMap print (`pr#11283 <http://github.com/ceph/ceph/pull/11283>`_, John Spray)
-* mds: more deterministic timing on frag split/join (`issue#17853 <http://tracker.ceph.com/issues/17853>`_, `pr#12022 <http://github.com/ceph/ceph/pull/12022>`_, John Spray)
-* mds: more unique_pointer changes (`pr#11635 <http://github.com/ceph/ceph/pull/11635>`_, Patrick Donnelly)
-* mds: properly commit new dirfrag before splitting it (`issue#17990 <http://tracker.ceph.com/issues/17990>`_, `pr#12125 <http://github.com/ceph/ceph/pull/12125>`_, Yan, Zheng)
-* mds: release pool allocator memory after exceeding size limit (`issue#18225 <http://tracker.ceph.com/issues/18225>`_, `pr#12443 <http://github.com/ceph/ceph/pull/12443>`_, John Spray)
-* mds: remove duplicated log in handle_client_readdir (`pr#11806 <http://github.com/ceph/ceph/pull/11806>`_, Zhi Zhang)
-* mds: remove "--journal-check" help text (`issue#17747 <http://tracker.ceph.com/issues/17747>`_, `pr#11739 <http://github.com/ceph/ceph/pull/11739>`_, Nathan Cutler)
-* mds: remove unused EFragment::OP_ONESHOT (`pr#11887 <http://github.com/ceph/ceph/pull/11887>`_, John Spray)
-* mds: repair backtraces during scrub (`issue#17639 <http://tracker.ceph.com/issues/17639>`_, `pr#11578 <http://github.com/ceph/ceph/pull/11578>`_, John Spray)
-* mds: require MAY_SET_POOL to set pool_ns (`issue#17798 <http://tracker.ceph.com/issues/17798>`_, `pr#11789 <http://github.com/ceph/ceph/pull/11789>`_, John Spray)
-* mds: respawn using /proc/self/exe (`issue#17531 <http://tracker.ceph.com/issues/17531>`_, `pr#11362 <http://github.com/ceph/ceph/pull/11362>`_, Patrick Donnelly)
-* mds: revert "mds/Mutation: remove redundant _dump method" (`issue#17906 <http://tracker.ceph.com/issues/17906>`_, `pr#11985 <http://github.com/ceph/ceph/pull/11985>`_, Patrick Donnelly)
-* mds: use parse_filesystem in parse_role to handle exceptions and reuse parsing code (`issue#17518 <http://tracker.ceph.com/issues/17518>`_, `pr#11357 <http://github.com/ceph/ceph/pull/11357>`_, Patrick Donnelly)
-* mds: use projected path construction for access (`issue#17858 <http://tracker.ceph.com/issues/17858>`_, `pr#12063 <http://github.com/ceph/ceph/pull/12063>`_, Patrick Donnelly)
-* mds: use unique_ptr to simplify resource mgmt (`pr#11543 <http://github.com/ceph/ceph/pull/11543>`_, Patrick Donnelly)
-* mgr: doc/mgr: fix mgr how long to wait to failover (`pr#11550 <http://github.com/ceph/ceph/pull/11550>`_, huanwen ren)
-* mgr: init() return when connection daemons failed && add some err info (`pr#11424 <http://github.com/ceph/ceph/pull/11424>`_, huanwen ren)
-* mgr: misc minor changes (`issue#17455 <http://tracker.ceph.com/issues/17455>`_, `pr#11386 <http://github.com/ceph/ceph/pull/11386>`_, xie xingguo)
-* mgr: PyModules.cc: remove duplicated if condition for fs_map (`pr#11639 <http://github.com/ceph/ceph/pull/11639>`_, Weibing Zhang)
-* mgr: remove unnecessary C_StdFunction (`pr#11883 <http://github.com/ceph/ceph/pull/11883>`_, John Spray)
-* mon: add missing space in warning message (`pr#11361 <http://github.com/ceph/ceph/pull/11361>`_, Patrick Donnelly)
-* mon: clean legacy code (`pr#9643 <http://github.com/ceph/ceph/pull/9643>`_, Wei Jin)
-* mon: clear duplicated logic in MDSMonitor (`pr#11209 <http://github.com/ceph/ceph/pull/11209>`_, Zhi Zhang)
-* mon: Do not allow pools to be deleted by default (`pr#11665 <http://github.com/ceph/ceph/pull/11665>`_, Wido den Hollander)
-* mon: fix "OSDs marked OUT wrongly after monitor failover" (`issue#17719 <http://tracker.ceph.com/issues/17719>`_, `pr#11664 <http://github.com/ceph/ceph/pull/11664>`_, Dong Wu)
-* mon: Forbidden copy and assignment function in monoprequest (`pr#9513 <http://github.com/ceph/ceph/pull/9513>`_, song baisen)
-* mon: have mon-specific features & rework internal monmap structures (`pr#10907 <http://github.com/ceph/ceph/pull/10907>`_, Joao Eduardo Luis)
-* mon: if crushtool config is empty use internal crush test (`pr#11765 <http://github.com/ceph/ceph/pull/11765>`_, Bassam Tabbara)
-* mon: make MDSMonitor tolerant of slow mon elections (`issue#17308 <http://tracker.ceph.com/issues/17308>`_, `pr#11167 <http://github.com/ceph/ceph/pull/11167>`_, John Spray)
-* mon: MonmapMonitor: return success when monitor will be removed (`issue#17725 <http://tracker.ceph.com/issues/17725>`_, `pr#11747 <http://github.com/ceph/ceph/pull/11747>`_, Joao Eduardo Luis)
-* mon: move case CEPH_MSG_POOLOP to OSDs group (`pr#11848 <http://github.com/ceph/ceph/pull/11848>`_, Javeme)
-* mon: osdmap's epoch should be more than 0 (`pr#9859 <http://github.com/ceph/ceph/pull/9859>`_, Na Xie)
-* mon: OSDMonitor: fix the check error of pg creating (`issue#17169 <http://tracker.ceph.com/issues/17169>`_, `pr#10916 <http://github.com/ceph/ceph/pull/10916>`_, DesmondS)
-* mon:  paxos add the timeout function when peon recovery (`pr#10359 <http://github.com/ceph/ceph/pull/10359>`_, song baisen)
-* mon: preserve osd weight when marking osd out, then in (`pr#11293 <http://github.com/ceph/ceph/pull/11293>`_, Sage Weil)
-* mon: prevent post-jewel OSDs from booting if require_jewel_osds is not set (`pr#11498 <http://github.com/ceph/ceph/pull/11498>`_, Sage Weil)
-* mon: remove ceph-create-keys from mon startup (`issue#16036 <http://tracker.ceph.com/issues/16036>`_, `pr#9345 <http://github.com/ceph/ceph/pull/9345>`_, Owen Synge)
-* mon:  remove the redudant jugement in LogMonitor tick function (`pr#10474 <http://github.com/ceph/ceph/pull/10474>`_, song baisen)
-* mon: remove utime_t param in _dump (`pr#12029 <http://github.com/ceph/ceph/pull/12029>`_, Patrick Donnelly)
-* mon: send updated monmap to its subscribers (`issue#17558 <http://tracker.ceph.com/issues/17558>`_, `pr#11456 <http://github.com/ceph/ceph/pull/11456>`_, Kefu Chai)
-* mon: small change on the HealthMonitor start_epoch  function (`pr#10296 <http://github.com/ceph/ceph/pull/10296>`_, songbaisen)
-* mon: support for building without leveldb + mon mkfs bug fix (`pr#11800 <http://github.com/ceph/ceph/pull/11800>`_, Bassam Tabbara)
-* osd: add a pg _fastinfo attribute to reduce per-io metadata updates (`pr#11213 <http://github.com/ceph/ceph/pull/11213>`_, Sage Weil)
-* osd: Add config option to disable new scrubs during recovery (`issue#17866 <http://tracker.ceph.com/issues/17866>`_, `pr#11874 <http://github.com/ceph/ceph/pull/11874>`_, Wido den Hollander)
-* osd: a few fast dispatch optimizations (`pr#12052 <http://github.com/ceph/ceph/pull/12052>`_, Sage Weil)
-* osd: cleanup C_CompleteSplits::finish() (`pr#12094 <http://github.com/ceph/ceph/pull/12094>`_, Jie Wang)
-* osd: clean up PeeringWQ::_dequeue(), remove unnecessary variable (`pr#12117 <http://github.com/ceph/ceph/pull/12117>`_, Jie Wang)
-* osd: clean up process_peering_events (`pr#12009 <http://github.com/ceph/ceph/pull/12009>`_, Jie Wang)
-* osdc/Objecter: resend pg commands on interval change (`issue#18358 <http://tracker.ceph.com/issues/18358>`_, `pr#12910 <http://github.com/ceph/ceph/pull/12910>`_, Samuel Just)
-* osd: condition OSDMap encoding on features (`pr#12166 <http://github.com/ceph/ceph/pull/12166>`_, Sage Weil)
-* osd: default osd_scrub_during_recovery=false (`pr#12402 <http://github.com/ceph/ceph/pull/12402>`_, Sage Weil)
-* osd: do not open pgs when the pg is not in pg_map (`issue#17806 <http://tracker.ceph.com/issues/17806>`_, `pr#11803 <http://github.com/ceph/ceph/pull/11803>`_, Xinze Chi)
-* osd: drop stray debug message (`pr#11296 <http://github.com/ceph/ceph/pull/11296>`_, Sage Weil)
-* osd: EC Overwrites (`issue#17668 <http://tracker.ceph.com/issues/17668>`_, `pr#11701 <http://github.com/ceph/ceph/pull/11701>`_, Tomy Cheru, Samuel Just)
-* osd: enhance logging for osd network error (`pr#12458 <http://github.com/ceph/ceph/pull/12458>`_, liuchang0812)
-* osd: fix CEPH_OSD_FLAG_RWORDERED (`pr#12603 <http://github.com/ceph/ceph/pull/12603>`_, Sage Weil)
-* osd: fix duplicated id of incompat feature "fastinfo" (`pr#11588 <http://github.com/ceph/ceph/pull/11588>`_, xie xingguo)
-* osd: fix ec scrub errors (`issue#17999 <http://tracker.ceph.com/issues/17999>`_, `pr#12306 <http://github.com/ceph/ceph/pull/12306>`_, Samuel Just)
-* osd: fixes to make rbd on ec work (`pr#12305 <http://github.com/ceph/ceph/pull/12305>`_, Samuel Just)
-* osd: Fix map gaps again (bug 15943) (`issue#15943 <http://tracker.ceph.com/issues/15943>`_, `pr#12571 <http://github.com/ceph/ceph/pull/12571>`_, Samuel Just)
-* osd: fix memory leak from EC write workload (`issue#18093 <http://tracker.ceph.com/issues/18093>`_, `pr#12256 <http://github.com/ceph/ceph/pull/12256>`_, Sage Weil)
-* osd: fix rados write op hang (`pr#11143 <http://github.com/ceph/ceph/pull/11143>`_, Yunchuan Wen)
-* osd: Fix read error propogation in ECBackend (`issue#17966 <http://tracker.ceph.com/issues/17966>`_, `pr#12142 <http://github.com/ceph/ceph/pull/12142>`_, Samuel Just)
-* osd: fix scrub boundary to not include a SnapSet (`pr#11255 <http://github.com/ceph/ceph/pull/11255>`_, Samuel Just)
-* osd: fix signed/unsigned comparison warning (`pr#12400 <http://github.com/ceph/ceph/pull/12400>`_, Greg Farnum)
-* osd: fix typo in PG::clear_primary_state (`pr#11513 <http://github.com/ceph/ceph/pull/11513>`_, Brad Hubbard)
-* osd: Fix typos in PG::find_best_info (`pr#11515 <http://github.com/ceph/ceph/pull/11515>`_, Brad Hubbard)
-* osd: fix typos in "struct OSDOp" comments (`pr#12350 <http://github.com/ceph/ceph/pull/12350>`_, Chanyoung Park)
-* osd: Flush Journal on shutdown (`pr#11249 <http://github.com/ceph/ceph/pull/11249>`_, Wido den Hollander)
-* osd: force watch PING to be write ordered (`issue#18310 <http://tracker.ceph.com/issues/18310>`_, `pr#12590 <http://github.com/ceph/ceph/pull/12590>`_, Samuel Just)
-* osd: handle EC recovery read errors (`issue#13937 <http://tracker.ceph.com/issues/13937>`_, `pr#9304 <http://github.com/ceph/ceph/pull/9304>`_, David Zafman)
-* osd: heartbeat peers need to be updated when a new OSD added into an existed cluster (`issue#18004 <http://tracker.ceph.com/issues/18004>`_, `pr#12069 <http://github.com/ceph/ceph/pull/12069>`_, Pan Liu)
-* osd: Increase priority for inactive PGs backfill (`pr#12389 <http://github.com/ceph/ceph/pull/12389>`_, Bartłomiej Święcki)
-* osd: kill PG_STATE_SPLITTING (`pr#11824 <http://github.com/ceph/ceph/pull/11824>`_, xie xingguo)
-* osd: mark queued flag for op (`pr#12352 <http://github.com/ceph/ceph/pull/12352>`_, Yunchuan Wen)
-* osd: osdc: pass a string reference type to "osdmap->lookup_pg_pool_name" (`pr#12219 <http://github.com/ceph/ceph/pull/12219>`_, Leo Zhang)
-* osd: osd/OSDMonitor: accept 'osd pool set ...' value as string (`pr#911 <http://github.com/ceph/ceph/pull/911>`_, David Zafman)
-* osd: PGLog: initialize writeout_from in PGLog constructor (`issue#12973 <http://tracker.ceph.com/issues/12973>`_, `pr#558 <http://github.com/ceph/ceph/pull/558>`_, Sage Weil)
-* osd/PrimaryLogPG: don't update digests for objects with mismatched names (`issue#18409 <http://tracker.ceph.com/issues/18409>`_, `pr#12803 <http://github.com/ceph/ceph/pull/12803>`_, Samuel Just)
-* osd/PrimaryLogPG::failed_push: update missing as well (`issue#18165 <http://tracker.ceph.com/issues/18165>`_, `pr#12911 <http://github.com/ceph/ceph/pull/12911>`_, Samuel Just)
-* osd: print log when osd want to kill self (`pr#9288 <http://github.com/ceph/ceph/pull/9288>`_, Haomai Wang)
-* osd: Remove extra call to reg_next_scrub() during splits (`issue#16474 <http://tracker.ceph.com/issues/16474>`_, `pr#11206 <http://github.com/ceph/ceph/pull/11206>`_, David Zafman)
-* osd: remove redudant call of heartbeat_check (`pr#12130 <http://github.com/ceph/ceph/pull/12130>`_, Pan Liu)
-* osd: remove the lock heartbeat_update_lock, and change heatbeat_need\_… (`pr#12461 <http://github.com/ceph/ceph/pull/12461>`_, Pan Liu)
-* osd:  remove the redundant clear method in consume_map function (`pr#10553 <http://github.com/ceph/ceph/pull/10553>`_, song baisen)
-* osd: Remove unused '_lsb_release_' declarations (`pr#11364 <http://github.com/ceph/ceph/pull/11364>`_, Brad Hubbard)
-* osd: replace hb_out and hb_in with a single hb_peers (`issue#18057 <http://tracker.ceph.com/issues/18057>`_, `pr#12178 <http://github.com/ceph/ceph/pull/12178>`_, Pan Liu)
-* osd: ReplicatedPG: don't bless C_OSD_SendMessageOnConn (`issue#13304 <http://tracker.ceph.com/issues/13304>`_, `pr#669 <http://github.com/ceph/ceph/pull/669>`_, Jason Dillaman)
-* osd: set server-side limits on omap get operations (`pr#12059 <http://github.com/ceph/ceph/pull/12059>`_, Sage Weil)
-* osd: When deep-scrub errors present upgrade regular scrubs (`pr#12268 <http://github.com/ceph/ceph/pull/12268>`_, David Zafman)
-* performance,bluestore: kv/MemDB: making memdb code adapt to generic maps (`pr#11436 <http://github.com/ceph/ceph/pull/11436>`_, Ramesh Chander)
-* performance,bluestore: os/bluestore: allow default to buffered write (`pr#11301 <http://github.com/ceph/ceph/pull/11301>`_, Sage Weil)
-* performance,bluestore: os/bluestore: bluestore_cache_meta_ratio = .5 (`pr#11919 <http://github.com/ceph/ceph/pull/11919>`_, Sage Weil)
-* performance,bluestore: os/bluestore: reduce Onode in-memory footprint (`pr#12568 <http://github.com/ceph/ceph/pull/12568>`_, Igor Fedotov)
-* performance,bluestore: os/bluestore: refactor bluestore_sync_submit_transaction (`pr#11537 <http://github.com/ceph/ceph/pull/11537>`_, Sage Weil)
-* performance,bluestore: os/bluestore: speed up omap-key generation for same onode(the read paths) (`pr#11894 <http://github.com/ceph/ceph/pull/11894>`_, xie xingguo)
-* performance,bluestore: os/bluestore: speedup the performance of multi-replication flow by switc… (`pr#11844 <http://github.com/ceph/ceph/pull/11844>`_, Pan Liu)
-* performance,cephfs: Fix long stalls when calling ceph_fsync() (`issue#17563 <http://tracker.ceph.com/issues/17563>`_, `pr#11710 <http://github.com/ceph/ceph/pull/11710>`_, Jeff Layton)
-* performance,cleanup: Context: std::move the callback param in FunctionContext's ctor (`pr#11892 <http://github.com/ceph/ceph/pull/11892>`_, Kefu Chai)
-* performance,cleanup: osd/PG.h: move shared ptr instead of copying it (`pr#11154 <http://github.com/ceph/ceph/pull/11154>`_, Michal Jarzabek)
-* performance,common: common/config_opts.h: Optimized RocksDB WAL settings. (`pr#11530 <http://github.com/ceph/ceph/pull/11530>`_, Mark Nelson)
-* performance,common: osd/OSDMap: improve the performance of pg_to_acting_osds (`pr#12190 <http://github.com/ceph/ceph/pull/12190>`_, Pan Liu)
-* performance: msg/async: set ms_async_send_inline to false to improve small randread iops (`pr#11521 <http://github.com/ceph/ceph/pull/11521>`_, Mark Nelson)
-* performance,tools: rados: add hints to rados bench (`pr#12169 <http://github.com/ceph/ceph/pull/12169>`_, Sage Weil)
-* pybind: avoid "exception 'int' object is not iterable" (`pr#11532 <http://github.com/ceph/ceph/pull/11532>`_, Javeme)
-* pybind,cephfs: ceph_volume_client: fix recovery from partial auth update (`issue#17216 <http://tracker.ceph.com/issues/17216>`_, `pr#11304 <http://github.com/ceph/ceph/pull/11304>`_, Ramana Raja)
-* pybind,cephfs: ceph_volume_client: set an existing auth ID's default mon caps  (`issue#17800 <http://tracker.ceph.com/issues/17800>`_, `pr#11917 <http://github.com/ceph/ceph/pull/11917>`_, Ramana Raja)
-* pybind: ceph-rest-api: understand the new style entity_addr_t representation (`issue#17742 <http://tracker.ceph.com/issues/17742>`_, `pr#11686 <http://github.com/ceph/ceph/pull/11686>`_, Kefu Chai)
-* pybind: clean up mgr stuff for flake8 (`pr#11314 <http://github.com/ceph/ceph/pull/11314>`_, John Spray)
-* pybind: fix build failure of rgwfile binding (`pr#11825 <http://github.com/ceph/ceph/pull/11825>`_, Kefu Chai)
-* pybind: pybind/rados: add missing "length" requires for aio_execute() (`pr#12439 <http://github.com/ceph/ceph/pull/12439>`_, Kefu Chai)
-* pybind: pybind/rados: Add @requires for all aio methods (`pr#12327 <http://github.com/ceph/ceph/pull/12327>`_, Iain Buclaw)
-* qa: fixed distros links (`pr#12773 <http://github.com/ceph/ceph/pull/12773>`_, Yuri Weinstein)
-* qa: Fixed link to centos distro (`pr#12768 <http://github.com/ceph/ceph/pull/12768>`_, Yuri Weinstein)
-* qa/suites: switch from centos 7.2 to 7.x (`pr#12632 <http://github.com/ceph/ceph/pull/12632>`_, Sage Weil)
-* qa/tasks/peer: update task based on current peering behavior (`issue#18330 <http://tracker.ceph.com/issues/18330>`_, `pr#12614 <http://github.com/ceph/ceph/pull/12614>`_, Sage Weil)
-* qa/tasks/workunit: clear clone dir before retrying checkout (`issue#18336 <http://tracker.ceph.com/issues/18336>`_, `pr#12630 <http://github.com/ceph/ceph/pull/12630>`_, Sage Weil)
-* qa: update Ubuntu image url after ceph.com refactor (`issue#18542 <http://tracker.ceph.com/issues/18542>`_, `pr#12960 <http://github.com/ceph/ceph/pull/12960>`_, Jason Dillaman)
-* qa/workunits/rbd/test_lock_fence.sh fails (`issue#18388 <http://tracker.ceph.com/issues/18388>`_, `pr#12752 <http://github.com/ceph/ceph/pull/12752>`_, Nathan Cutler)
-* rbd: added rbd-nbd fsx test case (`pr#1049 <http://github.com/ceph/ceph/pull/1049>`_, Jason Dillaman)
-* rbd: add fsx journal replay test case (`pr#821 <http://github.com/ceph/ceph/pull/821>`_, Jason Dillaman)
-* rbd: add singleton to assert no rbdmap regression (`issue#14984 <http://tracker.ceph.com/issues/14984>`_, `pr#902 <http://github.com/ceph/ceph/pull/902>`_, Nathan Cutler)
-* rbd: add some missing workunits (`pr#870 <http://github.com/ceph/ceph/pull/870>`_, Josh Durgin)
-* rbd: add support for separate image data pool (`issue#17424 <http://tracker.ceph.com/issues/17424>`_, `pr#11355 <http://github.com/ceph/ceph/pull/11355>`_, Jason Dillaman)
-* rbd: expose rbd unmap options (`issue#17554 <http://tracker.ceph.com/issues/17554>`_, `pr#11370 <http://github.com/ceph/ceph/pull/11370>`_, Ilya Dryomov)
-* rbd: fix json formatting for image and journal status output (`issue#18261 <http://tracker.ceph.com/issues/18261>`_, `pr#12525 <http://github.com/ceph/ceph/pull/12525>`_, Mykola Golub)
-* rbd: fix parsing of group and image specific pools (`pr#11632 <http://github.com/ceph/ceph/pull/11632>`_, Victor Denisov)
-* rbd: journal: do not prematurely flag object recorder as closed (`issue#17590 <http://tracker.ceph.com/issues/17590>`_, `pr#11520 <http://github.com/ceph/ceph/pull/11520>`_, Jason Dillaman)
-* rbd: krbd: kernel client expects ip[:port], not an entity_addr_t (`pr#11902 <http://github.com/ceph/ceph/pull/11902>`_, Ilya Dryomov)
-* rbd: --max_part and --nbds_max options for nbd map (`issue#18186 <http://tracker.ceph.com/issues/18186>`_, `pr#12379 <http://github.com/ceph/ceph/pull/12379>`_, Pan Liu)
-* rbd: move nbd test workload to separate client host from OSDs (`pr#1170 <http://github.com/ceph/ceph/pull/1170>`_, Jason Dillaman)
-* rbd: provision volumes to format as XFS (`issue#6693 <http://tracker.ceph.com/issues/6693>`_, `pr#1028 <http://github.com/ceph/ceph/pull/1028>`_, Loic Dachary)
-* rbd: rbd-mirror: fix sparse read optimization in image sync (`issue#18146 <http://tracker.ceph.com/issues/18146>`_, `pr#12368 <http://github.com/ceph/ceph/pull/12368>`_, Mykola Golub)
-* rbd: rbd-mirror HA: move librbd::image_watcher::Notifier to librbd::object_watcher (`issue#17017 <http://tracker.ceph.com/issues/17017>`_, `pr#11290 <http://github.com/ceph/ceph/pull/11290>`_, Mykola Golub)
-* rbd: rbd-mirror: recovering after split-brain (`issue#16991 <http://tracker.ceph.com/issues/16991>`_, `issue#18051 <http://tracker.ceph.com/issues/18051>`_, `pr#12212 <http://github.com/ceph/ceph/pull/12212>`_, Mykola Golub)
-* rbd: rbd-mirror: snap protect of non-layered image results in split-brain (`issue#16962 <http://tracker.ceph.com/issues/16962>`_, `pr#11744 <http://github.com/ceph/ceph/pull/11744>`_, Mykola Golub)
-* rbd: rbd-nbd: disallow mapping images >2TB in size (`issue#17219 <http://tracker.ceph.com/issues/17219>`_, `pr#11741 <http://github.com/ceph/ceph/pull/11741>`_, Mykola Golub)
-* rbd: rbd-nbd: invalid error code for "failed to read nbd request" messages (`issue#18242 <http://tracker.ceph.com/issues/18242>`_, `pr#12483 <http://github.com/ceph/ceph/pull/12483>`_, Mykola Golub)
-* rbd: rbd-nbd: restart parent process logger after forking (`issue#18070 <http://tracker.ceph.com/issues/18070>`_, `pr#12222 <http://github.com/ceph/ceph/pull/12222>`_, Jason Dillaman)
-* rbd: rbd-nbd: support disabling auto-exclusive lock transition logic (`issue#17488 <http://tracker.ceph.com/issues/17488>`_, `pr#11438 <http://github.com/ceph/ceph/pull/11438>`_, Mykola Golub)
-* rbd: rbd-nbd: support partition for rbd-nbd mapped raw block device (`issue#18115 <http://tracker.ceph.com/issues/18115>`_, `pr#12259 <http://github.com/ceph/ceph/pull/12259>`_, Pan Liu)
-* rbd: tests with rbd_skip_partial_discard option enabled (`pr#1077 <http://github.com/ceph/ceph/pull/1077>`_, Mykola Golub)
-* rbd,tools: rbd : make option --stripe-unit w/ B/K/M work (`pr#12407 <http://github.com/ceph/ceph/pull/12407>`_, Jianpeng Ma)
-* rbd: updated tests to use new rbd default feature set (`pr#842 <http://github.com/ceph/ceph/pull/842>`_, Jason Dillaman)
-* rbd: use snap_remove implementation from internal (`pr#12035 <http://github.com/ceph/ceph/pull/12035>`_, Victor Denisov)
-* rgw: add default zone name (`issue#7009 <http://tracker.ceph.com/issues/7009>`_, `pr#954 <http://github.com/ceph/ceph/pull/954>`_, Orit Wasserman)
-* rgw: add documentation for upgrading with rgw_region_root_pool (`pr#12138 <http://github.com/ceph/ceph/pull/12138>`_, Orit Wasserman)
-* rgw: add option to log custom HTTP headers (rgw_log_http_headers) (`pr#7639 <http://github.com/ceph/ceph/pull/7639>`_, Matt Benjamin)
-* rgw: add recovery procedure for upgrade to older version of jewel (`issue#17820 <http://tracker.ceph.com/issues/17820>`_, `pr#11827 <http://github.com/ceph/ceph/pull/11827>`_, Orit Wasserman)
-* rgw: add rgw_compression_type=random for teuthology testing (`pr#11901 <http://github.com/ceph/ceph/pull/11901>`_, Casey Bodley)
-* rgw: add sleep to let the sync agent init (`pr#1136 <http://github.com/ceph/ceph/pull/1136>`_, Orit Wasserman)
-* rgw: add suport for creating S3 type subuser of admin rest api (`issue#16682 <http://tracker.ceph.com/issues/16682>`_, `pr#10325 <http://github.com/ceph/ceph/pull/10325>`_, snakeAngel2015)
-* rgw: add support for the prefix parameter in account listing of Swift API (`issue#17931 <http://tracker.ceph.com/issues/17931>`_, `pr#12047 <http://github.com/ceph/ceph/pull/12047>`_, Radoslaw Zarzynski)
-* rgw: allow fastcgi idle timeout to be adjusted (`pr#230 <http://github.com/ceph/ceph/pull/230>`_, Sage Weil)
-* rgw: also approve, passed teuthology (many false positives in several classes) (`issue#17985 <http://tracker.ceph.com/issues/17985>`_, `pr#12224 <http://github.com/ceph/ceph/pull/12224>`_, Yehuda Sadeh, Sage Weil)
-* rgw: Anonymous users shouldn't be able to access requester pays buckets. (`issue#17175 <http://tracker.ceph.com/issues/17175>`_, `pr#11719 <http://github.com/ceph/ceph/pull/11719>`_, Zhang Shaowen)
-* rgw: aws4: add presigned url bugfix in runtime (`issue#16463 <http://tracker.ceph.com/issues/16463>`_, `pr#10160 <http://github.com/ceph/ceph/pull/10160>`_, Javier M. Mellid)
-* rgw: bucket resharding (`issue#17550 <http://tracker.ceph.com/issues/17550>`_, `pr#11230 <http://github.com/ceph/ceph/pull/11230>`_, Yehuda Sadeh)
-* rgw:bugfix for deleting objects name beginning and ending with underscores of one bucket using POST method of AWS's js sdk. (`issue#17888 <http://tracker.ceph.com/issues/17888>`_, `pr#11982 <http://github.com/ceph/ceph/pull/11982>`_, root)
-* rgw: Class member cookie is not initialized correctly in some coroutine's constructor. (`pr#11673 <http://github.com/ceph/ceph/pull/11673>`_, Zhang Shaowen)
-* rgw: clean up RGWShardedOmapCRManager on early return (`issue#17571 <http://tracker.ceph.com/issues/17571>`_, `pr#11505 <http://github.com/ceph/ceph/pull/11505>`_, Casey Bodley)
-* rgw: clear data_sync_cr if RGWDataSyncControlCR fails (`issue#17569 <http://tracker.ceph.com/issues/17569>`_, `pr#11506 <http://github.com/ceph/ceph/pull/11506>`_, Casey Bodley)
-* rgw: compilation of the ASIO front-end is enabled by default. (`pr#12073 <http://github.com/ceph/ceph/pull/12073>`_, Radoslaw Zarzynski)
-* rgw: compression uses optional::emplace instead of in-place factories (`pr#12021 <http://github.com/ceph/ceph/pull/12021>`_, Radoslaw Zarzynski)
-* rgw: conform to the standard usage of string::find (`pr#10086 <http://github.com/ceph/ceph/pull/10086>`_, Yan Jun)
-* rgw: data_extra_pool is unique per zone (`issue#17025 <http://tracker.ceph.com/issues/17025>`_, `pr#1119 <http://github.com/ceph/ceph/pull/1119>`_, Orit Wasserman)
-* rgw: delete entries_index in RGWFetchAllMetaCR (`issue#17812 <http://tracker.ceph.com/issues/17812>`_, `pr#11816 <http://github.com/ceph/ceph/pull/11816>`_, Casey Bodley)
-* rgw: do not abort when accept a CORS request with short origin (`pr#12381 <http://github.com/ceph/ceph/pull/12381>`_, LiuYang)
-* rgw: do not enable both tcp and uds for fastcgi (`issue#5797 <http://tracker.ceph.com/issues/5797>`_, `pr#479 <http://github.com/ceph/ceph/pull/479>`_, Andrew Schoen)
-* rgw: don't error out on empty owner when setting acls (`issue#6892 <http://tracker.ceph.com/issues/6892>`_, `pr#877 <http://github.com/ceph/ceph/pull/877>`_, Loic Dachary, Nathan Cutler)
-* rgw: Don't loop forever when reading data from 0 sized segment. (`issue#17692 <http://tracker.ceph.com/issues/17692>`_, `pr#11567 <http://github.com/ceph/ceph/pull/11567>`_, Marcus Watts)
-* rgw: dont set CURLOPT_UPLOAD for GET requests (`issue#17822 <http://tracker.ceph.com/issues/17822>`_, `pr#12105 <http://github.com/ceph/ceph/pull/12105>`_, Casey Bodley)
-* rgw: don't store empty chains in gc (`issue#17897 <http://tracker.ceph.com/issues/17897>`_, `pr#11969 <http://github.com/ceph/ceph/pull/11969>`_, Yehuda Sadeh)
-* rgw: do quota tests on ubuntu (`issue#6382 <http://tracker.ceph.com/issues/6382>`_, `pr#635 <http://github.com/ceph/ceph/pull/635>`_, Sage Weil)
-* rgw: dump objects in RGWBucket::check_object_index() (`issue#14589 <http://tracker.ceph.com/issues/14589>`_, `pr#11324 <http://github.com/ceph/ceph/pull/11324>`_, Yehuda Sadeh)
-* rgw: dump remaining coroutines when cr deadlock is detected (`pr#11580 <http://github.com/ceph/ceph/pull/11580>`_, Casey Bodley)
-* rgw: extract host name from host:port string (`issue#17788 <http://tracker.ceph.com/issues/17788>`_, `pr#11751 <http://github.com/ceph/ceph/pull/11751>`_, Yehuda Sadeh)
-* rgw: Fixed problem with PUT with x-amz-copy-source when source object is compressed. (`pr#12253 <http://github.com/ceph/ceph/pull/12253>`_, Adam Kupczyk)
-* rgw: fixes for virtual hosting of buckets (`issue#17440 <http://tracker.ceph.com/issues/17440>`_, `issue#15975 <http://tracker.ceph.com/issues/15975>`_, `issue#17136 <http://tracker.ceph.com/issues/17136>`_, `pr#11280 <http://github.com/ceph/ceph/pull/11280>`_, Casey Bodley, Robin H. Johnson)
-* rgw: fix etag in multipart complete (`issue#17794 <http://tracker.ceph.com/issues/17794>`_, `issue#6830 <http://tracker.ceph.com/issues/6830>`_, `issue#16129 <http://tracker.ceph.com/issues/16129>`_, `issue#17872 <http://tracker.ceph.com/issues/17872>`_, `pr#1269 <http://github.com/ceph/ceph/pull/1269>`_, Casey Bodley, Orit Wasserman)
-* rgw: fix for bucket delete racing with mdlog sync (`issue#17698 <http://tracker.ceph.com/issues/17698>`_, `pr#11648 <http://github.com/ceph/ceph/pull/11648>`_, Casey Bodley)
-* rgw: fix for passing temporary in InitBucketSyncStatus (`issue#17661 <http://tracker.ceph.com/issues/17661>`_, `pr#11594 <http://github.com/ceph/ceph/pull/11594>`_, Casey Bodley)
-* rgw: fix for unsafe change of rgw_zonegroup (`issue#17962 <http://tracker.ceph.com/issues/17962>`_, `pr#12075 <http://github.com/ceph/ceph/pull/12075>`_, Casey Bodley)
-* rgw: fix indentation for cache_pools (`issue#8295 <http://tracker.ceph.com/issues/8295>`_, `pr#251 <http://github.com/ceph/ceph/pull/251>`_, Sage Weil)
-* rgw: fix missing master zone for a single zone zonegroup (`issue#17364 <http://tracker.ceph.com/issues/17364>`_, `pr#11965 <http://github.com/ceph/ceph/pull/11965>`_, Orit Wasserman)
-* rgw: fix osd crashes when execute "radosgw-admin bi list --max-entries=1" command (`issue#17745 <http://tracker.ceph.com/issues/17745>`_, `pr#11697 <http://github.com/ceph/ceph/pull/11697>`_, weiqiaomiao)
-* rgw: fix put_acls for objects starting and ending with underscore (`issue#17625 <http://tracker.ceph.com/issues/17625>`_, `pr#11566 <http://github.com/ceph/ceph/pull/11566>`_, Orit Wasserman)
-* rgw: fix RGWSimpleRadosLockCR set_description() (`pr#11961 <http://github.com/ceph/ceph/pull/11961>`_, Tianshan Qu)
-* rgw: fix the field 'total_time'  of log entry in log show opt (`issue#17598 <http://tracker.ceph.com/issues/17598>`_, `pr#11425 <http://github.com/ceph/ceph/pull/11425>`_, weiqiaomiao)
-* rgw: fix uncompressed object size deduction in RGWRados::copy_obj_data. (`issue#17803 <http://tracker.ceph.com/issues/17803>`_, `pr#11794 <http://github.com/ceph/ceph/pull/11794>`_, Radoslaw Zarzynski)
-* rgw: frontend subsystem rework (`pr#10767 <http://github.com/ceph/ceph/pull/10767>`_, Radoslaw Zarzynski, Casey Bodley, Matt Benjamin)
-* rgw: ftw (`issue#17888 <http://tracker.ceph.com/issues/17888>`_, `pr#12262 <http://github.com/ceph/ceph/pull/12262>`_, Casey Bodley)
-* rgw: get_system_obj does not use result of get_system_obj_state (`issue#17580 <http://tracker.ceph.com/issues/17580>`_, `pr#11444 <http://github.com/ceph/ceph/pull/11444>`_, Casey Bodley)
-* rgw: get_zonegroup() uses "default" zonegroup if empty (`issue#17372 <http://tracker.ceph.com/issues/17372>`_, `pr#11207 <http://github.com/ceph/ceph/pull/11207>`_, Yehuda Sadeh)
-* rgw: handle empty POST condition (`issue#17635 <http://tracker.ceph.com/issues/17635>`_, `pr#11581 <http://github.com/ceph/ceph/pull/11581>`_, Yehuda Sadeh)
-* rgw: handle Swift auth errors in a way compatible with new Tempests. (`issue#16590 <http://tracker.ceph.com/issues/16590>`_, `pr#10021 <http://github.com/ceph/ceph/pull/10021>`_, Radoslaw Zarzynski)
-* rgw: json encode/decode index_type, allow modification (`issue#17755 <http://tracker.ceph.com/issues/17755>`_, `pr#11707 <http://github.com/ceph/ceph/pull/11707>`_, Yehuda Sadeh)
-* rgw: loses realm/period/zonegroup/zone data: period overwritten if somewhere in the cluster is still running Hammer (`issue#17371 <http://tracker.ceph.com/issues/17371>`_, `pr#11426 <http://github.com/ceph/ceph/pull/11426>`_, Orit Wasserman)
-* rgw: make RGWLocalAuthApplier::is_admin_of() aware about system users. (`issue#18106 <http://tracker.ceph.com/issues/18106>`_, `pr#12283 <http://github.com/ceph/ceph/pull/12283>`_, Radoslaw Zarzynski)
-* rgw: metadata sync info should be shown at master zone of slave zoneg… (`issue#18091 <http://tracker.ceph.com/issues/18091>`_, `pr#12187 <http://github.com/ceph/ceph/pull/12187>`_, Jing Wenjun)
-* rgw: minor cleanup (`pr#10057 <http://github.com/ceph/ceph/pull/10057>`_, Yan Jun)
-* rgw: move compression config into zone placement (`pr#12113 <http://github.com/ceph/ceph/pull/12113>`_, Casey Bodley)
-* rgw: move xfs to a seperate directory (`pr#969 <http://github.com/ceph/ceph/pull/969>`_, Orit Wasserman)
-* rgw: multipart upload copy (`issue#12790 <http://tracker.ceph.com/issues/12790>`_, `pr#11269 <http://github.com/ceph/ceph/pull/11269>`_, Yehuda Sadeh, Javier M. Mellid)
-* rgw: need to close_section in lc list op (`pr#12232 <http://github.com/ceph/ceph/pull/12232>`_, weiqiaomiao)
-* rgw: policy acl format should be xml (`pr#946 <http://github.com/ceph/ceph/pull/946>`_, Orit Wasserman)
-* rgw: radosgw-admin: more on placement configuration (`issue#18078 <http://tracker.ceph.com/issues/18078>`_, `pr#12242 <http://github.com/ceph/ceph/pull/12242>`_, Casey Bodley)
-* rgw: region conversion respects pre-existing rgw_region_root_pool (`issue#17963 <http://tracker.ceph.com/issues/17963>`_, `pr#12076 <http://github.com/ceph/ceph/pull/12076>`_, Casey Bodley)
-* rgw: remove a redundant judgement when listng objects. (`pr#10849 <http://github.com/ceph/ceph/pull/10849>`_, zhangshaowen)
-* rgw: remove circular reference in RGWAsyncRadosRequest (`issue#17793 <http://tracker.ceph.com/issues/17793>`_, `issue#17792 <http://tracker.ceph.com/issues/17792>`_, `pr#11815 <http://github.com/ceph/ceph/pull/11815>`_, Casey Bodley)
-* rgw: remove suggestion to upgrade libcurl (`pr#11630 <http://github.com/ceph/ceph/pull/11630>`_, Casey Bodley)
-* rgw: remove unused variable "ostr" in rgw_b64.h and fix the comment (`pr#11329 <http://github.com/ceph/ceph/pull/11329>`_, Weibing Zhang)
-* rgw: Replacing '+' with "%20" in canonical uri for s3 v4 auth. (`issue#17076 <http://tracker.ceph.com/issues/17076>`_, `pr#10919 <http://github.com/ceph/ceph/pull/10919>`_, Pritha Srivastava)
-* rgw: revert unintentional change to civetweb (`pr#12004 <http://github.com/ceph/ceph/pull/12004>`_, Bassam Tabbara)
-* rgw: rgw-admin: new commands to control placement (`issue#18078 <http://tracker.ceph.com/issues/18078>`_, `pr#12230 <http://github.com/ceph/ceph/pull/12230>`_, Yehuda Sadeh)
-* rgw: RGWBucketSyncStatusManager uses existing async_rados (`issue#18083 <http://tracker.ceph.com/issues/18083>`_, `pr#12229 <http://github.com/ceph/ceph/pull/12229>`_, Casey Bodley)
-* rgw: rgw_file:  apply missed base64 try-catch (`issue#17663 <http://tracker.ceph.com/issues/17663>`_, `pr#11671 <http://github.com/ceph/ceph/pull/11671>`_, Matt Benjamin)
-* rgw: RGWHTTPArgs::get_str() - return argument string that was set. (`pr#10672 <http://github.com/ceph/ceph/pull/10672>`_, Marcus Watts)
-* rgw: rgw multisite: fix the increamtal bucket sync init (`issue#17624 <http://tracker.ceph.com/issues/17624>`_, `pr#11553 <http://github.com/ceph/ceph/pull/11553>`_, Zengran Zhang)
-* rgw: rgw multisite: use a rados lock to coordinate data log trimming (`pr#10546 <http://github.com/ceph/ceph/pull/10546>`_, Casey Bodley)
-* rgw: RGW Python bindings - use explicit array (`pr#11831 <http://github.com/ceph/ceph/pull/11831>`_, Daniel Gryniewicz)
-* rgw: rgw_rados.cc fix shard_num format for snprintf (`pr#11493 <http://github.com/ceph/ceph/pull/11493>`_, Weibing Zhang)
-* rgw: rgw/rgw_file.cc: Add compat.h to allow CLOCK_MONOTONE (`pr#12309 <http://github.com/ceph/ceph/pull/12309>`_, Willem Jan Withagen)
-* rgw: RGWSimpleRadosReadCR tolerates empty reads (`issue#17568 <http://tracker.ceph.com/issues/17568>`_, `pr#11504 <http://github.com/ceph/ceph/pull/11504>`_, Casey Bodley)
-* rgw: [RGW] Wip rgw compression (`pr#11494 <http://github.com/ceph/ceph/pull/11494>`_, Alyona Kiseleva, Adam Kupczyk, Casey Bodley)
-* rgw: set duration for lifecycle lease (`issue#17965 <http://tracker.ceph.com/issues/17965>`_, `pr#12231 <http://github.com/ceph/ceph/pull/12231>`_, Yehuda Sadeh)
-* rgw: should assign 'olh_bl" to state.attrset[RGW_ATTR_OLH_ID_TAG] instead of 'bl' (`pr#10239 <http://github.com/ceph/ceph/pull/10239>`_, weiqiaomiao)
-* rgw: skip empty http args in method parse() to avoid extra effort (`pr#11989 <http://github.com/ceph/ceph/pull/11989>`_, Guo Zhandong)
-* rgw: split osd's in 2 nodes (`issue#15612 <http://tracker.ceph.com/issues/15612>`_, `pr#1019 <http://github.com/ceph/ceph/pull/1019>`_, Vasu Kulkarni)
-* rgw: support for x-robots-tag header (`issue#17790 <http://tracker.ceph.com/issues/17790>`_, `pr#11753 <http://github.com/ceph/ceph/pull/11753>`_, Yehuda Sadeh)
-* rgw: sync modules, metadata search (`pr#10731 <http://github.com/ceph/ceph/pull/10731>`_, Yehuda Sadeh)
-* rgw: Update version of civetweb to 1.8 (`pr#11343 <http://github.com/ceph/ceph/pull/11343>`_, Marcus Watts)
-* rgw: use civetweb if no frontend was configured (`pr#958 <http://github.com/ceph/ceph/pull/958>`_, Orit Wasserman)
-* rgw: use explicit flag to cancel RGWCoroutinesManager::run() (`issue#17465 <http://tracker.ceph.com/issues/17465>`_, `pr#12452 <http://github.com/ceph/ceph/pull/12452>`_, Casey Bodley)
-* rgw: valgrind fixes for kraken (`issue#18414 <http://tracker.ceph.com/issues/18414>`_, `issue#18407 <http://tracker.ceph.com/issues/18407>`_, `issue#18412 <http://tracker.ceph.com/issues/18412>`_, `issue#18300 <http://tracker.ceph.com/issues/18300>`_, `pr#12949 <http://github.com/ceph/ceph/pull/12949>`_, Casey Bodley)
-* rgw: verified that failed check is in osd-scrub-repair.sh (`issue#17850 <http://tracker.ceph.com/issues/17850>`_, `pr#11881 <http://github.com/ceph/ceph/pull/11881>`_, Matt Benjamin)
-* rgw: we don't support btrfs any more (`pr#1132 <http://github.com/ceph/ceph/pull/1132>`_, Orit Wasserman)
-* rgw: Wip rgwfile pybind (`pr#11624 <http://github.com/ceph/ceph/pull/11624>`_, Haomai Wang)
-* tests,bluestore: os/bluestore: add UT for an estimation of Onode in-memory size (`pr#12532 <http://github.com/ceph/ceph/pull/12532>`_, Igor Fedotov)
-* tests,bluestore: os/test/store_test: fix legacy bluestore cache settings application (`pr#11915 <http://github.com/ceph/ceph/pull/11915>`_, Igor Fedotov)
-* tests: ceph-disk: force debug monc = 0 (`issue#17607 <http://tracker.ceph.com/issues/17607>`_, `pr#11534 <http://github.com/ceph/ceph/pull/11534>`_, Loic Dachary)
-* tests: ceph_objectstore_tool.py: Don't use btrfs on FreeBSD (`pr#10507 <http://github.com/ceph/ceph/pull/10507>`_, Willem Jan Withagen)
-* tests: ceph_test_objectstore: fix Rename test (`pr#12261 <http://github.com/ceph/ceph/pull/12261>`_, Sage Weil)
-* tests: check hostname --fqdn sanity before running make check (`issue#18134 <http://tracker.ceph.com/issues/18134>`_, `pr#12297 <http://github.com/ceph/ceph/pull/12297>`_, Nathan Cutler)
-* tests,cleanup,rbd: test/librbd: in test_notify set object-map and fast-diff features by default (`pr#11821 <http://github.com/ceph/ceph/pull/11821>`_, Mykola Golub)
-* tests,cleanup: test_bloom_filter.cc: Fix a mismatch for the random_seed parameter (`pr#11774 <http://github.com/ceph/ceph/pull/11774>`_, Willem Jan Withagen)
-* tests,cleanup: test/osd/osd-fast-mark-down.sh: remove unnecessary teardown() calls (`pr#12101 <http://github.com/ceph/ceph/pull/12101>`_, Kefu Chai)
-* tests,cleanup: test/osd-scrub-repair.sh: use repair() instead of "ceph pg repair" (`pr#12036 <http://github.com/ceph/ceph/pull/12036>`_, Kefu Chai)
-* tests,cleanup: test/rados: remove unused bufferlist variable (`pr#10221 <http://github.com/ceph/ceph/pull/10221>`_, Yan Jun)
-* tests,common: test: add perf-reset test in test/perf_counters.cc (`pr#8948 <http://github.com/ceph/ceph/pull/8948>`_, wangsongbo)
-* tests: disable failing tests (`issue#17561 <http://tracker.ceph.com/issues/17561>`_, `issue#17757 <http://tracker.ceph.com/issues/17757>`_, `pr#11714 <http://github.com/ceph/ceph/pull/11714>`_, Loic Dachary)
-* tests: disable the echo when running get_timeout_delays() (`pr#12180 <http://github.com/ceph/ceph/pull/12180>`_, Kefu Chai)
-* tests: do not use memstore.test_temp_dir in two tests (`issue#17743 <http://tracker.ceph.com/issues/17743>`_, `pr#12281 <http://github.com/ceph/ceph/pull/12281>`_, Loic Dachary)
-* tests: erasure-code: add k=2, m=2 for isa & jerasure (`issue#18188 <http://tracker.ceph.com/issues/18188>`_, `pr#12383 <http://github.com/ceph/ceph/pull/12383>`_, Loic Dachary)
-* tests: facilitate background process debug in ceph-helpers.sh (`issue#17830 <http://tracker.ceph.com/issues/17830>`_, `pr#12183 <http://github.com/ceph/ceph/pull/12183>`_, Loic Dachary)
-* tests: fix ceph-helpers.sh wait_for_clean delays (`issue#17830 <http://tracker.ceph.com/issues/17830>`_, `pr#12095 <http://github.com/ceph/ceph/pull/12095>`_, Loic Dachary)
-* tests: fix osd-scrub-repair.sh (`pr#12072 <http://github.com/ceph/ceph/pull/12072>`_, David Zafman)
-* tests: Fix racey test by setting noout flag (tracker 17757) (`issue#17757 <http://tracker.ceph.com/issues/17757>`_, `pr#11715 <http://github.com/ceph/ceph/pull/11715>`_, David Zafman)
-* tests: merge ceph-qa-suite
-* tests: Minor clean-ups (`pr#12048 <http://github.com/ceph/ceph/pull/12048>`_, David Zafman)
-* tests: minor make check cleanup (`pr#12146 <http://github.com/ceph/ceph/pull/12146>`_, David Zafman)
-* tests: no python3 tests for ceph-disk (`issue#17923 <http://tracker.ceph.com/issues/17923>`_, `pr#12025 <http://github.com/ceph/ceph/pull/12025>`_, Loic Dachary)
-* tests: osd-crush.sh must retry crush dump (`issue#17919 <http://tracker.ceph.com/issues/17919>`_, `pr#12016 <http://github.com/ceph/ceph/pull/12016>`_, Loic Dachary)
-* tests: osd-scrub-repair.sh abort if add_something fails (`pr#12172 <http://github.com/ceph/ceph/pull/12172>`_, Loic Dachary)
-* tests: os/memstore: fix a mem leak in MemStore::Collection::create_object() (`pr#12201 <http://github.com/ceph/ceph/pull/12201>`_, Kefu Chai)
-* tests: os/memstore, os/filestore: fix store_test's to satisfy rm_coll behavi… (`pr#11558 <http://github.com/ceph/ceph/pull/11558>`_, Igor Fedotov)
-* tests: paxos fixes (`issue#11913 <http://tracker.ceph.com/issues/11913>`_, `pr#457 <http://github.com/ceph/ceph/pull/457>`_, John Spray)
-* tests: pin flake8 to avoid behavior changes (`issue#17898 <http://tracker.ceph.com/issues/17898>`_, `pr#11971 <http://github.com/ceph/ceph/pull/11971>`_, Loic Dachary)
-* tests: qa: fixed script to schedule rados and other suites with --subset option (`pr#12587 <http://github.com/ceph/ceph/pull/12587>`_, Yuri Weinstein)
-* tests: qa/tasks/admin_socket: subst in repo name (`pr#12508 <http://github.com/ceph/ceph/pull/12508>`_, Sage Weil)
-* tests: qa/tasks/ceph_deploy: use dev option instead of dev-commit (`pr#12514 <http://github.com/ceph/ceph/pull/12514>`_, Vasu Kulkarni)
-* tests: qa/tasks/osd_backfill.py: wait for osd.[12] to start (`issue#18303 <http://tracker.ceph.com/issues/18303>`_, `pr#12577 <http://github.com/ceph/ceph/pull/12577>`_, Sage Weil)
-* tests: qa/workunits/cephtool/test.sh: FreeBSD has no distro. (`pr#11702 <http://github.com/ceph/ceph/pull/11702>`_, Willem Jan Withagen)
-* tests: qa/workunits: include extension for nose tests (`pr#12572 <http://github.com/ceph/ceph/pull/12572>`_, Sage Weil)
-* tests: qa/workunits/rados/test_envlibrados_for_rocksdb: force librados-dev install (`pr#11941 <http://github.com/ceph/ceph/pull/11941>`_, Sage Weil)
-* tests,rbd: qa/workunits/rbd: fix (`issue#18271 <http://tracker.ceph.com/issues/18271>`_, `pr#12511 <http://github.com/ceph/ceph/pull/12511>`_, Sage Weil)
-* tests,rbd: qa/workunits/rbd: removed qemu-iotest case 077 (`issue#10773 <http://tracker.ceph.com/issues/10773>`_, `pr#12366 <http://github.com/ceph/ceph/pull/12366>`_, Jason Dillaman)
-* tests,rbd: qa/workunits/rbd: simplify running nbd test under build env (`pr#11781 <http://github.com/ceph/ceph/pull/11781>`_, Mykola Golub)
-* tests,rbd: qa/workunits/rbd: use image id when probing for image presence (`issue#18048 <http://tracker.ceph.com/issues/18048>`_, `pr#12195 <http://github.com/ceph/ceph/pull/12195>`_, Mykola Golub)
-* tests,rbd: qa/workunits/rbd: use more recent qemu-iotests that support Xenial (`issue#18149 <http://tracker.ceph.com/issues/18149>`_, `pr#12371 <http://github.com/ceph/ceph/pull/12371>`_, Jason Dillaman)
-* tests,rbd: rbd-mirror: fix gmock warnings in bootstrap request unit tests (`issue#18156 <http://tracker.ceph.com/issues/18156>`_, `pr#12344 <http://github.com/ceph/ceph/pull/12344>`_, Mykola Golub)
-* tests,rbd: rbd-mirror: improve resiliency of stress test case (`issue#17416 <http://tracker.ceph.com/issues/17416>`_, `pr#11326 <http://github.com/ceph/ceph/pull/11326>`_, Jason Dillaman)
-* tests,rbd: test: new librbd discard after write test case (`pr#11645 <http://github.com/ceph/ceph/pull/11645>`_, Jason Dillaman)
-* tests,rbd: test: skip TestLibRBD.DiscardAfterWrite if skip partial discard enabled (`issue#17750 <http://tracker.ceph.com/issues/17750>`_, `pr#11703 <http://github.com/ceph/ceph/pull/11703>`_, Jason Dillaman)
-* tests,rbd: test: TestJournalReplay test cases need to wait for event commit (`issue#17566 <http://tracker.ceph.com/issues/17566>`_, `pr#11480 <http://github.com/ceph/ceph/pull/11480>`_, Jason Dillaman)
-* tests: remove TestPGLog EXPECT_DEATH tests (`issue#18030 <http://tracker.ceph.com/issues/18030>`_, `pr#12361 <http://github.com/ceph/ceph/pull/12361>`_, Loic Dachary)
-* tests: save 9 characters for asok paths (`issue#16014 <http://tracker.ceph.com/issues/16014>`_, `pr#12066 <http://github.com/ceph/ceph/pull/12066>`_, Loic Dachary)
-* tests: sync ceph-erasure-code-corpus for using 'arch' not 'uname -p' (`pr#12024 <http://github.com/ceph/ceph/pull/12024>`_, Kefu Chai)
-* tests: test/ceph_crypto: do not read ceph.conf in global_init() (`issue#18128 <http://tracker.ceph.com/issues/18128>`_, `pr#12318 <http://github.com/ceph/ceph/pull/12318>`_, Kefu Chai)
-* tests: test: ceph-objectstore-tool: should import platform before using it (`pr#12038 <http://github.com/ceph/ceph/pull/12038>`_, Kefu Chai)
-* tests: test/ceph_test_msgr: do not use Message::middle for holding transient… (`issue#17728 <http://tracker.ceph.com/issues/17728>`_, `pr#11680 <http://github.com/ceph/ceph/pull/11680>`_, Kefu Chai)
-* tests: test: disable osd-scrub-repair and test-erasure-eio (`issue#17830 <http://tracker.ceph.com/issues/17830>`_, `pr#12058 <http://github.com/ceph/ceph/pull/12058>`_, Loic Dachary, Dan Mick)
-* tests: test: disable osd-scrub-repair and test-erasure-eio (`pr#11979 <http://github.com/ceph/ceph/pull/11979>`_, Dan Mick)
-* tests: test: Don't write to a poolid that this test might not have created (`pr#12378 <http://github.com/ceph/ceph/pull/12378>`_, David Zafman)
-* tests: test: enable unittest_dns_resolve (`pr#12209 <http://github.com/ceph/ceph/pull/12209>`_, Kefu Chai)
-* tests: test/encoding/readable.sh: fix shell script warning (`pr#11527 <http://github.com/ceph/ceph/pull/11527>`_, Willem Jan Withagen)
-* tests: TestErasureCodePluginJerasure must stop the log thread (`issue#17561 <http://tracker.ceph.com/issues/17561>`_, `pr#11721 <http://github.com/ceph/ceph/pull/11721>`_, Loic Dachary)
-* tests: test: fix test-erasure-eio and osd-scrub-repair races (17830) (`pr#11926 <http://github.com/ceph/ceph/pull/11926>`_, David Zafman)
-* tests: test/osd-fast-mark-down.sh: wrong assumption on first subtest (`pr#12123 <http://github.com/ceph/ceph/pull/12123>`_, Piotr Dałek)
-* tests: test/osd/osd-fast-mark-down.sh: introduce large timeout (`issue#17918 <http://tracker.ceph.com/issues/17918>`_, `pr#12019 <http://github.com/ceph/ceph/pull/12019>`_, Piotr Dałek)
-* tests: test/osd-scrub-repair.sh: Use test case specific object names to help… (`pr#11449 <http://github.com/ceph/ceph/pull/11449>`_, David Zafman)
-* tests: test/store_test: fix errors on the whole test suite run caused by the… (`pr#11427 <http://github.com/ceph/ceph/pull/11427>`_, Igor Fedotov)
-* tests: test_subman.sh: Don't use --tmpdir (`pr#11384 <http://github.com/ceph/ceph/pull/11384>`_, Willem Jan Withagen)
-* tests: test: test-erasure-eio.sh fix recovery testing and enable it (`pr#12170 <http://github.com/ceph/ceph/pull/12170>`_, David Zafman)
-* tests: The default changed to disallow pool delete as of #11665; the tests assume it's allowed. (`pr#11897 <http://github.com/ceph/ceph/pull/11897>`_, Sage Weil)
-* tests: Turn off tests again due to Jenkins failures (`pr#12217 <http://github.com/ceph/ceph/pull/12217>`_, David Zafman)
-* tests: unittest_throttle avoid ASSERT_DEATH (`issue#18036 <http://tracker.ceph.com/issues/18036>`_, `pr#12393 <http://github.com/ceph/ceph/pull/12393>`_, Loic Dachary)
-* tests: update rbd/singleton/all/formatted-output.yaml to support ceph-ci (`issue#18440 <http://tracker.ceph.com/issues/18440>`_, `pr#12823 <http://github.com/ceph/ceph/pull/12823>`_, Nathan Cutler)
-* tests: use shorter directories for tests (`issue#16014 <http://tracker.ceph.com/issues/16014>`_, `pr#12046 <http://github.com/ceph/ceph/pull/12046>`_, Loic Dachary)
-* tests: vstart.sh: fix bashism in the script (`pr#11889 <http://github.com/ceph/ceph/pull/11889>`_, Mykola Golub)
-* tests: workunits/ceph-helpers.sh: FreeBSD returns a different errorstring. (`pr#12005 <http://github.com/ceph/ceph/pull/12005>`_, Willem Jan Withagen)
-* tools: Adding ceph-lazy tool (`pr#11055 <http://github.com/ceph/ceph/pull/11055>`_, gcharot)
-* tools: ceph-create-keys should not try forever to do things (`issue#17753 <http://tracker.ceph.com/issues/17753>`_, `issue#12649 <http://tracker.ceph.com/issues/12649>`_, `issue#16255 <http://tracker.ceph.com/issues/16255>`_, `pr#11749 <http://github.com/ceph/ceph/pull/11749>`_, Alfredo Deza)
-* tools: ceph_detect_init: add support for Alpine (`pr#8316 <http://github.com/ceph/ceph/pull/8316>`_, John Coyle)
-* tools: ceph-disk: fix flake8 errors (`issue#17898 <http://tracker.ceph.com/issues/17898>`_, `pr#11973 <http://github.com/ceph/ceph/pull/11973>`_, Ken Dreyer)
-* tools: ceph-disk: prevent unnecessary tracebacks from subprocess.check_call (`issue#16125 <http://tracker.ceph.com/issues/16125>`_, `pr#12414 <http://github.com/ceph/ceph/pull/12414>`_, Alfredo Deza)
-* tools: ceph-post-file: single command to upload a file to cephdrop (`pr#505 <http://github.com/ceph/ceph/pull/505>`_, Dan Mick, Travis Rhoden)
-* tools: cleanup phase of cephfs-data-scan (`pr#12337 <http://github.com/ceph/ceph/pull/12337>`_, Vishal Kanaujia)
-* tools: osdmaptool: additional tests (`pr#1196 <http://github.com/ceph/ceph/pull/1196>`_, Sage Weil)
-* tools: osdmaptool: fix divide by zero error (`pr#12561 <http://github.com/ceph/ceph/pull/12561>`_, Yunchuan Wen)
-* tools: rados: fix segfaults when run without --pool (`issue#17684 <http://tracker.ceph.com/issues/17684>`_, `pr#11633 <http://github.com/ceph/ceph/pull/11633>`_, David Disseldorp)
-* tools: rados: optionally support reading omap key from file (`issue#18123 <http://tracker.ceph.com/issues/18123>`_, `pr#12286 <http://github.com/ceph/ceph/pull/12286>`_, Jason Dillaman)
-* tools: script/run-coverity: update (`pr#12162 <http://github.com/ceph/ceph/pull/12162>`_, Sage Weil)
-* tools: script/sepia_bt.sh: a script to prepare for debugging on teuthology@sepia (`pr#12012 <http://github.com/ceph/ceph/pull/12012>`_, Kefu Chai)
-* tools: src/vstart.sh: Only execute btrfs if it is available (`pr#11683 <http://github.com/ceph/ceph/pull/11683>`_, Willem Jan Withagen)
-* tools: tools/ceph-monstore-update-crush.sh: FreeBSD getopt is not compatible… (`pr#11525 <http://github.com/ceph/ceph/pull/11525>`_, Willem Jan Withagen)
-
-
-
-v11.0.2 Kraken
-==============
-
-This development checkpoint release includes a lot of changes and improvements
-to Kraken. This is the first release introducing ceph-mgr, a new daemon which
-provides additional monitoring & interfaces to external monitoring/management
-systems. There are also many improvements to bluestore, RGW introduces sync
-modules, copy part for multipart uploads and metadata search via elastic search
-as a tech preview.
-
-Notable Changes
----------------
-
-* bluestore: os/bluestore: misc fixes (`pr#10953 <http://github.com/ceph/ceph/pull/10953>`_, Sage Weil)
-* bluestore: os/bluestore/BlueFS: do not op_file_update deleted files (`pr#10686 <http://github.com/ceph/ceph/pull/10686>`_, Sage Weil)
-* bluestore: bluestore/BitAllocator: Fix deadlock with musl libc (`pr#10634 <http://github.com/ceph/ceph/pull/10634>`_, John Coyle)
-* bluestore: bluestore/BlueFS: revert direct IO for WRITER_WAL (`pr#11059 <http://github.com/ceph/ceph/pull/11059>`_, Mark Nelson)
-* bluestore: ceph-disk: support creating block.db and block.wal with customized size for bluestore (`pr#10135 <http://github.com/ceph/ceph/pull/10135>`_, Zhi Zhang)
-* bluestore: compressor/zlib: switch to raw deflate (`pr#11122 <http://github.com/ceph/ceph/pull/11122>`_, Piotr Dałek)
-* bluestore: do not use freelist to track bluefs_extents (`pr#10698 <http://github.com/ceph/ceph/pull/10698>`_, Sage Weil)
-* bluestore: initialize csum_order properly (`pr#10728 <http://github.com/ceph/ceph/pull/10728>`_, xie xingguo)
-* bluestore: kv/rocksdb: dump transactions on error (`pr#11042 <http://github.com/ceph/ceph/pull/11042>`_, Somnath Roy)
-* bluestore: kv: In memory keyvalue db implementation (`pr#9933 <http://github.com/ceph/ceph/pull/9933>`_, Ramesh Chander)
-* bluestore: os/bluestore/BitAllocator: batch is_allocated bit checks (`pr#10704 <http://github.com/ceph/ceph/pull/10704>`_, Ramesh Chander)
-* bluestore: os/bluestore/BlueFS: For logs of rocksdb & bluefs only use directio. (`pr#11012 <http://github.com/ceph/ceph/pull/11012>`_, Jianpeng Ma)
-* bluestore: os/bluestore/BlueFS: async compaction (`pr#10717 <http://github.com/ceph/ceph/pull/10717>`_, Varada Kari, Sage Weil)
-* bluestore: os/bluestore/BlueFS: do not hold internal lock while waiting for IO (`pr#9898 <http://github.com/ceph/ceph/pull/9898>`_, Varada Kari, Sage Weil)
-* bluestore: os/bluestore/BlueFS: do not start racing async compaction (`pr#11010 <http://github.com/ceph/ceph/pull/11010>`_, Sage Weil)
-* bluestore: os/bluestore/BlueFS: don't inc l_bluefs_files_written_wal if overwrite. (`pr#10143 <http://github.com/ceph/ceph/pull/10143>`_, Jianpeng Ma)
-* bluestore: os/bluestore/BlueFS: factor unflushed log into runway calculation (`pr#10966 <http://github.com/ceph/ceph/pull/10966>`_, Sage Weil)
-* bluestore: os/bluestore/BlueFS: fix async compaction logging bug (`pr#10964 <http://github.com/ceph/ceph/pull/10964>`_, Sage Weil)
-* bluestore: os/bluestore/BlueFS: log dirty files at sync time (`pr#11108 <http://github.com/ceph/ceph/pull/11108>`_, Sage Weil)
-* bluestore: os/bluestore/BlueFS: only extend extent on same bdev (`pr#11023 <http://github.com/ceph/ceph/pull/11023>`_, Sage Weil)
-* bluestore: os/bluestore/BlueFS: prevent concurrent async compaction (`pr#11095 <http://github.com/ceph/ceph/pull/11095>`_, Sage Weil)
-* bluestore: os/bluestore/BlueFS: release completed aios (`pr#11268 <http://github.com/ceph/ceph/pull/11268>`_, Sage Weil)
-* bluestore: os/bluestore/BlueFS: use StupidAllocator; fix async compaction bug (`pr#11087 <http://github.com/ceph/ceph/pull/11087>`_, Sage Weil)
-* bluestore: os/bluestore/bluefs: add file refs check (`pr#10863 <http://github.com/ceph/ceph/pull/10863>`_, xie xingguo)
-* bluestore: os/bluestore/bluefs: use map to track dirty files (`pr#10923 <http://github.com/ceph/ceph/pull/10923>`_, xie xingguo)
-* bluestore: os/bluestore/bluefs_types: fix extent operator<< (`pr#10685 <http://github.com/ceph/ceph/pull/10685>`_, Sage Weil)
-* bluestore: os/bluestore/bluestore_types: uint64_t for ref_map (`pr#11267 <http://github.com/ceph/ceph/pull/11267>`_, Sage Weil)
-* bluestore: os/bluestore: Hint based allocation in bitmap Allocator (`pr#10978 <http://github.com/ceph/ceph/pull/10978>`_, Ramesh Chander)
-* bluestore: os/bluestore: Remove bit alloc Woverloaded-virtual warnings (`pr#10082 <http://github.com/ceph/ceph/pull/10082>`_, Ramesh Chander)
-* bluestore: os/bluestore: a few cleanups (`pr#11192 <http://github.com/ceph/ceph/pull/11192>`_, xie xingguo)
-* bluestore: os/bluestore: a few fixes about  the global csum setting (`pr#11195 <http://github.com/ceph/ceph/pull/11195>`_, xie xingguo)
-* bluestore: os/bluestore: add assert to compress_extent_map (`pr#11240 <http://github.com/ceph/ceph/pull/11240>`_, Sage Weil)
-* bluestore: os/bluestore: add cache-related stats (`pr#10961 <http://github.com/ceph/ceph/pull/10961>`_, xie xingguo)
-* bluestore: os/bluestore: add checks and kill unreachable code (`pr#11077 <http://github.com/ceph/ceph/pull/11077>`_, xie xingguo)
-* bluestore: os/bluestore: add error injection (`pr#11151 <http://github.com/ceph/ceph/pull/11151>`_, Sage Weil)
-* bluestore: os/bluestore: add max blob size; fix compressed min blob size logic (`pr#11239 <http://github.com/ceph/ceph/pull/11239>`_, Sage Weil)
-* bluestore: os/bluestore: add multiple finishers to bluestore (`pr#10780 <http://github.com/ceph/ceph/pull/10780>`_, Ilsoo Byun)
-* bluestore: os/bluestore: add perf counters for compression effectiveness and space utilization measurements (`pr#10449 <http://github.com/ceph/ceph/pull/10449>`_, Igor Fedotov)
-* bluestore: os/bluestore: apply "small encoding" for onode_t::extents map (`pr#10018 <http://github.com/ceph/ceph/pull/10018>`_, Igor Fedotov)
-* bluestore: os/bluestore: avoid blob_t reencode when unchanged (`pr#10768 <http://github.com/ceph/ceph/pull/10768>`_, Sage Weil)
-* bluestore: os/bluestore: binary search specified shard (`pr#11245 <http://github.com/ceph/ceph/pull/11245>`_, xie xingguo)
-* bluestore: os/bluestore: change algorithm of compression header from string to int (`pr#10137 <http://github.com/ceph/ceph/pull/10137>`_, xie xingguo)
-* bluestore: os/bluestore: compaction fixes (`pr#11279 <http://github.com/ceph/ceph/pull/11279>`_, Sage Weil)
-* bluestore: os/bluestore: drop redundant call of get_blob (`pr#11275 <http://github.com/ceph/ceph/pull/11275>`_, xie xingguo)
-* bluestore: os/bluestore: drop unreferenced spanning blobs (`pr#11212 <http://github.com/ceph/ceph/pull/11212>`_, Sage Weil)
-* bluestore: os/bluestore: fix a few leaks (`pr#11068 <http://github.com/ceph/ceph/pull/11068>`_, Sage Weil)
-* bluestore: os/bluestore: fix a few memory utilization leaks and wasters (`pr#11011 <http://github.com/ceph/ceph/pull/11011>`_, Sage Weil)
-* bluestore: os/bluestore: fix crash in decode_some() (`pr#11312 <http://github.com/ceph/ceph/pull/11312>`_, Sage Weil)
-* bluestore: os/bluestore: fix decoding hash of bnode (`pr#10773 <http://github.com/ceph/ceph/pull/10773>`_, xie xingguo)
-* bluestore: os/bluestore: fix fsck() won't catch stray shard sometimes (`pr#11219 <http://github.com/ceph/ceph/pull/11219>`_, xie xingguo)
-* bluestore: os/bluestore: fix gc when blob extends past eof (`pr#11282 <http://github.com/ceph/ceph/pull/11282>`_, Sage Weil)
-* bluestore: os/bluestore: fix improper local var variable in collection_list meth… (`pr#10680 <http://github.com/ceph/ceph/pull/10680>`_, Igor Fedotov)
-* bluestore: os/bluestore: fix incorrect pool decoding of bnode (`pr#10117 <http://github.com/ceph/ceph/pull/10117>`_, xie xingguo)
-* bluestore: os/bluestore: fix leak of result-checking of _fsck_check_extents (`pr#11040 <http://github.com/ceph/ceph/pull/11040>`_, xie xingguo)
-* bluestore: os/bluestore: fix leaks in our use of rocksdb (`pr#11250 <http://github.com/ceph/ceph/pull/11250>`_, Sage Weil)
-* bluestore: os/bluestore: fix memory leak during bit_alloc testing (`pr#9935 <http://github.com/ceph/ceph/pull/9935>`_, xie xingguo)
-* bluestore: os/bluestore: fix offset bug in _do_write_small. (`pr#11030 <http://github.com/ceph/ceph/pull/11030>`_, amoxic)
-* bluestore: os/bluestore: fix onode cache addition race (`pr#11300 <http://github.com/ceph/ceph/pull/11300>`_, Sage Weil)
-* bluestore: os/bluestore: fix potential access violation (`pr#10362 <http://github.com/ceph/ceph/pull/10362>`_, xie xingguo)
-* bluestore: os/bluestore: fix potential access violation during rename (`pr#11033 <http://github.com/ceph/ceph/pull/11033>`_, xie xingguo)
-* bluestore: os/bluestore: fix shard_info::dump() (`pr#11061 <http://github.com/ceph/ceph/pull/11061>`_, xie xingguo)
-* bluestore: os/bluestore: fix spanning blob leak from ~ExtentMap (`pr#11223 <http://github.com/ceph/ceph/pull/11223>`_, Somnath Roy)
-* bluestore: os/bluestore: fix statfs tests (`pr#10910 <http://github.com/ceph/ceph/pull/10910>`_, Sage Weil)
-* bluestore: os/bluestore: fix when block device is not a multiple of the block size (`pr#10844 <http://github.com/ceph/ceph/pull/10844>`_, Sage Weil)
-* bluestore: os/bluestore: fix write_big counter and some more cleanups (`pr#11344 <http://github.com/ceph/ceph/pull/11344>`_, xie xingguo)
-* bluestore: os/bluestore: fix/improve csum error message (`pr#10938 <http://github.com/ceph/ceph/pull/10938>`_, Sage Weil)
-* bluestore: os/bluestore: garbage collect partially overlapped blobs (`pr#11232 <http://github.com/ceph/ceph/pull/11232>`_, Roushan Ali)
-* bluestore: os/bluestore: get rid off "isa-l" type in ZLibCompressor ctor (`pr#10931 <http://github.com/ceph/ceph/pull/10931>`_, xie xingguo)
-* bluestore: os/bluestore: gifting bluefs more carefully (`pr#10950 <http://github.com/ceph/ceph/pull/10950>`_, xie xingguo)
-* bluestore: os/bluestore: honour allow-eio flag; use global compressor if possible (`pr#10970 <http://github.com/ceph/ceph/pull/10970>`_, xie xingguo)
-* bluestore: os/bluestore: improve required compression threshold (`pr#10080 <http://github.com/ceph/ceph/pull/10080>`_, xie xingguo)
-* bluestore: os/bluestore: include bluefs space in statfs result (`pr#10795 <http://github.com/ceph/ceph/pull/10795>`_, Sage Weil)
-* bluestore: os/bluestore: introduce power 2 macros for block alignment and rounding (`pr#10128 <http://github.com/ceph/ceph/pull/10128>`_, xie xingguo)
-* bluestore: os/bluestore: make assert conditional with macro for allocator (`pr#11014 <http://github.com/ceph/ceph/pull/11014>`_, Ramesh Chander)
-* bluestore: os/bluestore: make cache settings process-wide (`pr#11295 <http://github.com/ceph/ceph/pull/11295>`_, Sage Weil)
-* bluestore: os/bluestore: make clone_range copy-on-write (`pr#11106 <http://github.com/ceph/ceph/pull/11106>`_, Sage Weil)
-* bluestore: os/bluestore: make onode keys more efficient (and sort correctly) (`pr#11009 <http://github.com/ceph/ceph/pull/11009>`_, xie xingguo, Sage Weil)
-* bluestore: os/bluestore: make trim() of 2Q cache more fine-grained (`pr#9946 <http://github.com/ceph/ceph/pull/9946>`_, xie xingguo)
-* bluestore: os/bluestore: make zone/span size of bitmap-allocator configurable (`pr#10040 <http://github.com/ceph/ceph/pull/10040>`_, xie xingguo)
-* bluestore: os/bluestore: misc cleanup and test fixes (`pr#11346 <http://github.com/ceph/ceph/pull/11346>`_, Igor Fedotov)
-* bluestore: os/bluestore: misc cleanups (`pr#10201 <http://github.com/ceph/ceph/pull/10201>`_, xie xingguo)
-* bluestore: os/bluestore: misc cleanups (`pr#11197 <http://github.com/ceph/ceph/pull/11197>`_, Haomai Wang)
-* bluestore: os/bluestore: misc fixes (`pr#9999 <http://github.com/ceph/ceph/pull/9999>`_, xie xingguo)
-* bluestore: os/bluestore: misc fixes (`pr#10771 <http://github.com/ceph/ceph/pull/10771>`_, xie xingguo)
-* bluestore: os/bluestore: misc. fixes (`pr#11129 <http://github.com/ceph/ceph/pull/11129>`_, xie xingguo)
-* bluestore: os/bluestore: more cleanups (`pr#11235 <http://github.com/ceph/ceph/pull/11235>`_, xie xingguo)
-* bluestore: os/bluestore: more cleanups and fixes (`pr#11210 <http://github.com/ceph/ceph/pull/11210>`_, xie xingguo)
-* bluestore: os/bluestore: narrow condition of sanity check when get_object_key() (`pr#11149 <http://github.com/ceph/ceph/pull/11149>`_, xie xingguo)
-* bluestore: os/bluestore: narrow lock scope for cache trim() (`pr#10410 <http://github.com/ceph/ceph/pull/10410>`_, xie xingguo)
-* bluestore: os/bluestore: optimize intrusive sets for size. (`pr#11319 <http://github.com/ceph/ceph/pull/11319>`_, Mark Nelson)
-* bluestore: os/bluestore: pack a few more in-memory types (`pr#11328 <http://github.com/ceph/ceph/pull/11328>`_, Sage Weil)
-* bluestore: os/bluestore: precondition rocksdb/bluefs during mkfs (`pr#10814 <http://github.com/ceph/ceph/pull/10814>`_, Sage Weil)
-* bluestore: os/bluestore: prevent extent merging across shard boundaries (`pr#11216 <http://github.com/ceph/ceph/pull/11216>`_, Sage Weil)
-* bluestore: os/bluestore: print bluefs_extents in hex (`pr#10689 <http://github.com/ceph/ceph/pull/10689>`_, Sage Weil)
-* bluestore: os/bluestore: proper handling for csum enable/disable settings (`pr#10431 <http://github.com/ceph/ceph/pull/10431>`_, Igor Fedotov)
-* bluestore: os/bluestore: refactor dirty blob tracking along with some related fixes (`pr#10215 <http://github.com/ceph/ceph/pull/10215>`_, Igor Fedotov)
-* bluestore: os/bluestore: remove cmake warning from extent alloc functions (`issue#16766 <http://tracker.ceph.com/issues/16766>`_, `pr#10492 <http://github.com/ceph/ceph/pull/10492>`_, Ramesh Chander)
-* bluestore: os/bluestore: remove deferred_csum machinery (`pr#11243 <http://github.com/ceph/ceph/pull/11243>`_, Sage Weil)
-* bluestore: os/bluestore: remove some copy-pastes (`pr#11017 <http://github.com/ceph/ceph/pull/11017>`_, Igor Fedotov)
-* bluestore: os/bluestore: replace store with logger in Cache (`pr#10969 <http://github.com/ceph/ceph/pull/10969>`_, xie xingguo)
-* bluestore: os/bluestore: shard extent map (`pr#10963 <http://github.com/ceph/ceph/pull/10963>`_, Sage Weil)
-* bluestore: os/bluestore: simplify LRUCache::trim() (`pr#10109 <http://github.com/ceph/ceph/pull/10109>`_, xie xingguo)
-* bluestore: os/bluestore: simplify calculation of collection key range (`pr#11166 <http://github.com/ceph/ceph/pull/11166>`_, xie xingguo)
-* bluestore: os/bluestore: sloppy reshard boundaries to avoid spanning blobs (`pr#11263 <http://github.com/ceph/ceph/pull/11263>`_, Sage Weil)
-* bluestore: os/bluestore: still more cleanups (`pr#11274 <http://github.com/ceph/ceph/pull/11274>`_, xie xingguo)
-* bluestore: os/bluestore: switch spanning_blob_map to std::map (`pr#11336 <http://github.com/ceph/ceph/pull/11336>`_, Sage Weil)
-* bluestore: os/bluestore: trim cache on reads (`pr#10095 <http://github.com/ceph/ceph/pull/10095>`_, Sage Weil)
-* bluestore: os/bluestore: try to split blobs instead of spanning them (`pr#11264 <http://github.com/ceph/ceph/pull/11264>`_, Sage Weil)
-* bluestore: os/bluestore: upgrade compression settings to atomics (`pr#11244 <http://github.com/ceph/ceph/pull/11244>`_, xie xingguo)
-* bluestore: os/bluestore: use small encoding for bluefs extent and fnode (`pr#10375 <http://github.com/ceph/ceph/pull/10375>`_, xie xingguo)
-* bluestore: os/bluestore: yet another statfs test fix (`pr#10926 <http://github.com/ceph/ceph/pull/10926>`_, Igor Fedotov)
-* bluestore: os/bluestore:Fix size calculation in bitallocator (`pr#10377 <http://github.com/ceph/ceph/pull/10377>`_, Ramesh Chander)
-* bluestore: os/bluestore: fix error handling of posix_fallocate() (`pr#10277 <http://github.com/ceph/ceph/pull/10277>`_, xie xingguo)
-* bluestore: os/bluestore: use BE for gifting and reclaiming from bluefs (`pr#10294 <http://github.com/ceph/ceph/pull/10294>`_, xie xingguo)
-* bluestore: os/bluestore: get rid off blob's ref_map for non-shared objects (`pr#9988 <http://github.com/ceph/ceph/pull/9988>`_, Igor Fedotov)
-* bluestore: kv/MemDB: fix wrong output target and add sanity checks (`pr#10358 <http://github.com/ceph/ceph/pull/10358>`_, xie xingguo)
-* bluestore: os/bluestore: add a boundary check of cache read (`pr#10349 <http://github.com/ceph/ceph/pull/10349>`_, xie xingguo)
-* bluestore: os/bluestore: fix bitmap allocating failure if max_alloc_size is 0 (`pr#10379 <http://github.com/ceph/ceph/pull/10379>`_, xie xingguo)
-* bluestore: os/bluestore: misc fixes (`pr#10327 <http://github.com/ceph/ceph/pull/10327>`_, xie xingguo)
-* bluestore: kv/MemDB: misc fixes and cleanups (`pr#10295 <http://github.com/ceph/ceph/pull/10295>`_, xie xingguo)
-* bluestore: rocksdb: pull up to master (4.12 + a few patches) (`pr#11069 <http://github.com/ceph/ceph/pull/11069>`_, Sage Weil)
-* bluestore: test/store_test: extend Bluestore compression test to verify compress… (`pr#11080 <http://github.com/ceph/ceph/pull/11080>`_, Igor Fedotov)
-* bluestore: test/store_test: fix statfs results check to consider SSD min_alloc_size (`pr#11096 <http://github.com/ceph/ceph/pull/11096>`_, Igor Fedotov)
-* bluestore: unittest_bluestore_types: a few more types for sizeof (`pr#11323 <http://github.com/ceph/ceph/pull/11323>`_, Sage Weil)
-* bluestore: ceph_test_objectstore: test clone_range and fix a few bugs (`pr#11103 <http://github.com/ceph/ceph/pull/11103>`_, Sage Weil)
-* bluestore: kv: fix some bugs in memdb (`pr#10550 <http://github.com/ceph/ceph/pull/10550>`_, Haodong Tang)
-* bluestore: os/bluestore/BlueFS: disable buffered io (`pr#10766 <http://github.com/ceph/ceph/pull/10766>`_, Sage Weil)
-* build/ops,bluestore: test/objectstore/CMakeLists.txt: fix libaio conditional (`pr#11008 <http://github.com/ceph/ceph/pull/11008>`_, Sage Weil)
-* build/ops,cephfs: client: added def for ACCESSPERMS when undefined (`pr#9835 <http://github.com/ceph/ceph/pull/9835>`_, John Coyle)
-* build/ops,cephfs: deb: merge ceph-fs-common into ceph-common (`issue#16808 <http://tracker.ceph.com/issues/16808>`_, `pr#10433 <http://github.com/ceph/ceph/pull/10433>`_, Nathan Cutler)
-* build/ops,cephfs: man/Makefile-client.am: drop legacy cephfs tool (`pr#10444 <http://github.com/ceph/ceph/pull/10444>`_, Nathan Cutler)
-* build/ops,cephfs: test: break out librados-using cephfs test (`issue#16556 <http://tracker.ceph.com/issues/16556>`_, `pr#10452 <http://github.com/ceph/ceph/pull/10452>`_, John Spray)
-* build/ops,common: common/dns_resolve: use ns_name_uncompress instead of ns_name_ntop (`pr#9755 <http://github.com/ceph/ceph/pull/9755>`_, John Coyle)
-* build/ops,common: msg/async/net_handler.cc: make it more compatible with BSDs (`pr#10029 <http://github.com/ceph/ceph/pull/10029>`_, Willem Jan Withagen)
-* build/ops,pybind: Include Python 3 bindings into the cmake build and make packages for them (`pr#10208 <http://github.com/ceph/ceph/pull/10208>`_, Oleh Prypin)
-* build/ops,rbd: systemd: add install section to rbdmap.service file (`pr#10942 <http://github.com/ceph/ceph/pull/10942>`_, Jelle vd Kooij)
-* build/ops,rbd: test: fix rbd-mirror workunit test cases for cmake (`pr#10076 <http://github.com/ceph/ceph/pull/10076>`_, Jason Dillaman)
-* build/ops,rgw: rgw-ldap: add ldap lib to rgw lib deps based on build config (`pr#9852 <http://github.com/ceph/ceph/pull/9852>`_, John Coyle)
-* build/ops: .gitignore: Add .pyc files globally (`pr#11076 <http://github.com/ceph/ceph/pull/11076>`_, Brad Hubbard)
-* build/ops: Allow compressor build without YASM (`pr#10937 <http://github.com/ceph/ceph/pull/10937>`_, Daniel Gryniewicz)
-* build/ops: CMake - stop pip checking for updates (`pr#10161 <http://github.com/ceph/ceph/pull/10161>`_, Daniel Gryniewicz)
-* build/ops: CMakeList.txt: link ceph_objectstore_tool against fuse only if WITH_FUSE (`pr#10149 <http://github.com/ceph/ceph/pull/10149>`_, Willem Jan Withagen)
-* build/ops: Cmake: fix using CMAKE_DL_LIBS instead of dl (`pr#10317 <http://github.com/ceph/ceph/pull/10317>`_, Willem Jan Withagen)
-* build/ops: CmakeLists.txt: use LIB_RESOLV instead of resolv. (`pr#10972 <http://github.com/ceph/ceph/pull/10972>`_, Willem Jan Withagen)
-* build/ops: Enable builds without ceph-test subpackage (`issue#16776 <http://tracker.ceph.com/issues/16776>`_, `pr#10872 <http://github.com/ceph/ceph/pull/10872>`_, Ricardo Dias)
-* build/ops: Fix libatomic_ops-devel in SUSE and specfile cleanup (`issue#16645 <http://tracker.ceph.com/issues/16645>`_, `pr#10363 <http://github.com/ceph/ceph/pull/10363>`_, Nathan Cutler)
-* build/ops: FreeBSD: Define CLOCK_REALTIME_COARSE in compat.h (`pr#10506 <http://github.com/ceph/ceph/pull/10506>`_, Willem Jan Withagen)
-* build/ops: Gentoo support for ceph-disk / ceph-detect-init; pip speedup (`pr#8317 <http://github.com/ceph/ceph/pull/8317>`_, Robin H. Johnson)
-* build/ops: LTTng-UST disabled for openSUSE (`issue#16937 <http://tracker.ceph.com/issues/16937>`_, `pr#10592 <http://github.com/ceph/ceph/pull/10592>`_, Michel Normand)
-* build/ops: Port ceph-brag to Python 3 (+ small fixes) (`pr#10064 <http://github.com/ceph/ceph/pull/10064>`_, Oleh Prypin)
-* build/ops: Removes remaining reference to WITH_MDS (`pr#10286 <http://github.com/ceph/ceph/pull/10286>`_, J. Eric Ivancich)
-* build/ops: Stop hiding errors from run-tox.sh (`issue#17267 <http://tracker.ceph.com/issues/17267>`_, `pr#11071 <http://github.com/ceph/ceph/pull/11071>`_, Dan Mick)
-* build/ops: Wip kill warnings (`pr#10881 <http://github.com/ceph/ceph/pull/10881>`_, Kefu Chai)
-* build/ops: autogen: Fix rocksdb error when make dist (`pr#10988 <http://github.com/ceph/ceph/pull/10988>`_, tianqing)
-* build/ops: autotools: remove a few other remaining traces (`pr#11019 <http://github.com/ceph/ceph/pull/11019>`_, Sage Weil)
-* build/ops: build scripts: Enable dnf for Fedora >= 22 (`pr#11105 <http://github.com/ceph/ceph/pull/11105>`_, Brad Hubbard)
-* build/ops: build: drop dryrun of autogen.sh from run-cmake-check.sh script (`pr#11013 <http://github.com/ceph/ceph/pull/11013>`_, xie xingguo)
-* build/ops: ceph-disk tests: Let missing python interpreters be non-fatal (`pr#11072 <http://github.com/ceph/ceph/pull/11072>`_, Dan Mick)
-* build/ops: ceph-disk: Compatibility fixes for Python 3 (`pr#9936 <http://github.com/ceph/ceph/pull/9936>`_, Anirudha Bose)
-* build/ops: ceph-disk: do not activate device that is not ready (`issue#15990 <http://tracker.ceph.com/issues/15990>`_, `pr#9943 <http://github.com/ceph/ceph/pull/9943>`_, Boris Ranto)
-* build/ops: ceph-osd-prestart.sh: check existence of OSD data directory (`issue#17091 <http://tracker.ceph.com/issues/17091>`_, `pr#10809 <http://github.com/ceph/ceph/pull/10809>`_, Nathan Cutler)
-* build/ops: ceph-osd-prestart.sh: drop Upstart-specific code (`issue#15984 <http://tracker.ceph.com/issues/15984>`_, `pr#9667 <http://github.com/ceph/ceph/pull/9667>`_, Nathan Cutler)
-* build/ops: ceph-post-file replace DSA with RSA ssh key (`issue#14267 <http://tracker.ceph.com/issues/14267>`_, `pr#10800 <http://github.com/ceph/ceph/pull/10800>`_, David Galloway)
-* build/ops: ceph.spec.in: don't try to package __pycache__ for SUSE (`issue#17106 <http://tracker.ceph.com/issues/17106>`_, `pr#10805 <http://github.com/ceph/ceph/pull/10805>`_, Tim Serong)
-* build/ops: ceph.spec.in: fix rpm package building error (`pr#10115 <http://github.com/ceph/ceph/pull/10115>`_, runsisi)
-* build/ops: changes for Clang and yasm (`pr#10417 <http://github.com/ceph/ceph/pull/10417>`_, Willem Jan Withagen)
-* build/ops: cmake changes (`pr#10351 <http://github.com/ceph/ceph/pull/10351>`_, Kefu Chai)
-* build/ops: cmake changes (`pr#10059 <http://github.com/ceph/ceph/pull/10059>`_, Kefu Chai)
-* build/ops: cmake changes (`pr#10279 <http://github.com/ceph/ceph/pull/10279>`_, Kefu Chai)
-* build/ops: cmake changes (`issue#16804 <http://tracker.ceph.com/issues/16804>`_, `pr#10391 <http://github.com/ceph/ceph/pull/10391>`_, Kefu Chai)
-* build/ops: cmake changes (`pr#10361 <http://github.com/ceph/ceph/pull/10361>`_, Kefu Chai)
-* build/ops: cmake changes (`pr#10112 <http://github.com/ceph/ceph/pull/10112>`_, Kefu Chai)
-* build/ops: cmake changes (`pr#10489 <http://github.com/ceph/ceph/pull/10489>`_, Kefu Chai)
-* build/ops: cmake changes (`pr#10283 <http://github.com/ceph/ceph/pull/10283>`_, Kefu Chai)
-* build/ops: cmake changes (`issue#16504 <http://tracker.ceph.com/issues/16504>`_, `pr#9995 <http://github.com/ceph/ceph/pull/9995>`_, Kefu Chai, Sage Weil, Dan Mick)
-* build/ops: cmake changes (`pr#9975 <http://github.com/ceph/ceph/pull/9975>`_, Kefu Chai)
-* build/ops: cmake changes related to LTTng-UST (`pr#10917 <http://github.com/ceph/ceph/pull/10917>`_, Kefu Chai)
-* build/ops: common/compressor: add libcommon as a dependency for zlib and snappy p… (`pr#11083 <http://github.com/ceph/ceph/pull/11083>`_, Igor Fedotov)
-* build/ops: compat: add abstractions for non portable pthread name funcs (`pr#9763 <http://github.com/ceph/ceph/pull/9763>`_, John Coyle)
-* build/ops: configure.ac: Use uname instead of arch. (`pr#9766 <http://github.com/ceph/ceph/pull/9766>`_, John Coyle)
-* build/ops: configure.ac: add _LIBS variables for boost_system and boost_iostreams (`pr#9848 <http://github.com/ceph/ceph/pull/9848>`_, John Coyle)
-* build/ops: configure.ac: fix res_query detection (`pr#9820 <http://github.com/ceph/ceph/pull/9820>`_, John Coyle)
-* build/ops: debian and cmake cleanups  (`pr#10788 <http://github.com/ceph/ceph/pull/10788>`_, Kefu Chai)
-* build/ops: debian: bump compat to 9 (`issue#16744 <http://tracker.ceph.com/issues/16744>`_, `pr#10366 <http://github.com/ceph/ceph/pull/10366>`_, Kefu Chai)
-* build/ops: debian: python related changes (`pr#10322 <http://github.com/ceph/ceph/pull/10322>`_, Kefu Chai)
-* build/ops: debian: replace SysV rbdmap with systemd service (`pr#10435 <http://github.com/ceph/ceph/pull/10435>`_, Ken Dreyer)
-* build/ops: debian: set libexec dir to correct value as autotools did (`pr#10096 <http://github.com/ceph/ceph/pull/10096>`_, Daniel Gryniewicz)
-* build/ops: do_cmake.sh: set up initial plugin dir (`pr#10067 <http://github.com/ceph/ceph/pull/10067>`_, Sage Weil)
-* build/ops: fix /etc/os-release parsing in install-deps.sh (`pr#10981 <http://github.com/ceph/ceph/pull/10981>`_, Nathan Cutler)
-* build/ops: fix the rpm build for centos (`pr#10289 <http://github.com/ceph/ceph/pull/10289>`_, Oleh Prypin, Josh Durgin)
-* build/ops: force Python 3 packages to build in SUSE (`issue#17106 <http://tracker.ceph.com/issues/17106>`_, `pr#10894 <http://github.com/ceph/ceph/pull/10894>`_, Dominique Leuenberger, Nathan Cutler)
-* build/ops: install-deps.sh based on /etc/os-release (`issue#16522 <http://tracker.ceph.com/issues/16522>`_, `pr#10017 <http://github.com/ceph/ceph/pull/10017>`_, Jan Fajerski)
-* build/ops: install-deps: exit non-zero when we cannot match distro  (`pr#10941 <http://github.com/ceph/ceph/pull/10941>`_, Gregory Meno)
-* build/ops: isa-l: add isa-l library as a submodule (`pr#10066 <http://github.com/ceph/ceph/pull/10066>`_, Alyona Kiseleva)
-* build/ops: jerasure: include generic objects in neon jerasure lib (like sse3/4) (`pr#10879 <http://github.com/ceph/ceph/pull/10879>`_, Dan Mick)
-* build/ops: logrotate: Run as root/ceph (`pr#10587 <http://github.com/ceph/ceph/pull/10587>`_, Boris Ranto)
-* build/ops: lttng: build the tracepoint provider lib from .c files in repo (`pr#11196 <http://github.com/ceph/ceph/pull/11196>`_, Kefu Chai)
-* build/ops: make-dist: generate ceph.spec (`issue#16501 <http://tracker.ceph.com/issues/16501>`_, `pr#9986 <http://github.com/ceph/ceph/pull/9986>`_, Sage Weil)
-* build/ops: make-dist: set rpm_release correctly for release builds (`pr#11334 <http://github.com/ceph/ceph/pull/11334>`_, Dan Mick)
-* build/ops: make-srpm.sh: A simple script to make the srpm for ceph. (`pr#11064 <http://github.com/ceph/ceph/pull/11064>`_, Ira Cooper)
-* build/ops: makefile: change librgw_file_* as check_PROGRAMS (`issue#16646 <http://tracker.ceph.com/issues/16646>`_, `pr#10229 <http://github.com/ceph/ceph/pull/10229>`_, Brad Hubbard)
-* build/ops: remove autotools (`pr#11007 <http://github.com/ceph/ceph/pull/11007>`_, Sage Weil)
-* build/ops: rpm: Do not start targets on update (`pr#9968 <http://github.com/ceph/ceph/pull/9968>`_, Nathan Cutler, Boris Ranto)
-* build/ops: rpm: ExclusiveArch for suse_version (`issue#16936 <http://tracker.ceph.com/issues/16936>`_, `pr#10594 <http://github.com/ceph/ceph/pull/10594>`_, Michel Normand)
-* build/ops: rpm: Fix creation of mount.ceph symbolic link for SUSE distros (`pr#10353 <http://github.com/ceph/ceph/pull/10353>`_, Ricardo Dias)
-* build/ops: rpm: add udev BuildRequires to provide /usr/lib/udev directory (`issue#16949 <http://tracker.ceph.com/issues/16949>`_, `pr#10608 <http://github.com/ceph/ceph/pull/10608>`_, Nathan Cutler)
-* build/ops: rpm: build rpm with cmake (`pr#10016 <http://github.com/ceph/ceph/pull/10016>`_, Kefu Chai)
-* build/ops: rpm: drop obsolete libs-compat and python-ceph-compat metapackages (`issue#16353 <http://tracker.ceph.com/issues/16353>`_, `pr#9757 <http://github.com/ceph/ceph/pull/9757>`_, Nathan Cutler)
-* build/ops: rpm: fix permissions for /etc/ceph/rbdmap (`issue#17395 <http://tracker.ceph.com/issues/17395>`_, `pr#11217 <http://github.com/ceph/ceph/pull/11217>`_, Ken Dreyer)
-* build/ops: rpm: fix shared library devel package names and dependencies (`issue#16345 <http://tracker.ceph.com/issues/16345>`_, `issue#16346 <http://tracker.ceph.com/issues/16346>`_, `pr#9744 <http://github.com/ceph/ceph/pull/9744>`_, Nathan Cutler, Ken Dreyer)
-* build/ops: rpm: move mount.ceph from ceph-base to ceph-common and add symlink in /sbin for SUSE (`issue#16598 <http://tracker.ceph.com/issues/16598>`_, `pr#10147 <http://github.com/ceph/ceph/pull/10147>`_, Nathan Cutler)
-* build/ops: run-cmake-check.sh: Remove redundant calls (`pr#11116 <http://github.com/ceph/ceph/pull/11116>`_, Brad Hubbard)
-* build/ops: script: improve ceph-release-notes regex (`pr#10729 <http://github.com/ceph/ceph/pull/10729>`_, Nathan Cutler)
-* build/ops: src/CMakeLists.txt: remove double flag -Wno-invalid-offsetof (`pr#10443 <http://github.com/ceph/ceph/pull/10443>`_, Willem Jan Withagen)
-* build/ops: src/CMakeLists.txt: remove unneeded libraries from ceph-dencoder target (`pr#10478 <http://github.com/ceph/ceph/pull/10478>`_, Willem Jan Withagen)
-* build/ops: src/global/pidfile.cc: Assign elements in structures individually (`pr#10516 <http://github.com/ceph/ceph/pull/10516>`_, Willem Jan Withagen)
-* build/ops: src/kv/CMakeLists.txt: force rocksdb/include to first include directory (`pr#11194 <http://github.com/ceph/ceph/pull/11194>`_, Willem Jan Withagen)
-* build/ops: test/common/test_util.cc: FreeBSD does not have distro information (`pr#10547 <http://github.com/ceph/ceph/pull/10547>`_, Willem Jan Withagen)
-* build/ops: test: make check using cmake (`pr#10116 <http://github.com/ceph/ceph/pull/10116>`_, Kefu Chai, Sage Weil)
-* build/ops: verfied f23 (`pr#10222 <http://github.com/ceph/ceph/pull/10222>`_, Kefu Chai)
-* build/ops: yasm-wrapper: dont echo the yasm command line (`pr#10819 <http://github.com/ceph/ceph/pull/10819>`_, Casey Bodley)
-* build/ops: .gitignore: exclude coredumps, logfiles and temporary testresults (`pr#8150 <http://github.com/ceph/ceph/pull/8150>`_, Willem Jan Withagen)
-* build/ops: this fixes the broken build (`pr#9992 <http://github.com/ceph/ceph/pull/9992>`_, Haomai Wang)
-* build/ops: mrgw: search for cmake build dir. (`pr#10180 <http://github.com/ceph/ceph/pull/10180>`_, Abhishek Lekshmanan)
-* build/ops: mrun, mstart.sh, mstop.sh: search for cmake build directory (`pr#10097 <http://github.com/ceph/ceph/pull/10097>`_, Yehuda Sadeh)
-* build/ops: arm64 fixes(`pr#10438 <http://github.com/ceph/ceph/pull/10438>`_, Dan Mick)
-* build/ops: Wip kill warnings (`pr#10934 <http://github.com/ceph/ceph/pull/10934>`_, Kefu Chai)
-* build/ops: systemd: add osd id to service description (`pr#10091 <http://github.com/ceph/ceph/pull/10091>`_, Ruben Kerkhof)
-* build/ops: fix wrong indent caused compile warning (`pr#10014 <http://github.com/ceph/ceph/pull/10014>`_, Wanlong Gao)
-* build/ops: ceph-detect-init: fix the py3 test (`pr#10266 <http://github.com/ceph/ceph/pull/10266>`_, Kefu Chai)
-* build/ops: ceph.spec: fix ceph-mgr version requirement (`pr#11285 <http://github.com/ceph/ceph/pull/11285>`_, Sage Weil)
-* build/ops: make-dist/ceph.spec.in: Fix srpm build breakage. (`pr#10404 <http://github.com/ceph/ceph/pull/10404>`_, Ira Cooper)
-* build/ops: master: remove SYSTEMD_RUN from initscript (`issue#16440 <http://tracker.ceph.com/issues/16440>`_, `issue#7627 <http://tracker.ceph.com/issues/7627>`_, `pr#9871 <http://github.com/ceph/ceph/pull/9871>`_, Vladislav Odintsov)
-* build/ops: rocksdb: revert the change introduced by dc41731 (`pr#10595 <http://github.com/ceph/ceph/pull/10595>`_, Kefu Chai)
-* build/ops: do_freebsd*.sh: rename do_freebsd-cmake.sh to do_freebsd.sh (`pr#11088 <http://github.com/ceph/ceph/pull/11088>`_, Kefu Chai)
-* build/ops: gcc 6.1.1 complains about missing include: <random>. 4.8.3 does not c… (`pr#10747 <http://github.com/ceph/ceph/pull/10747>`_, Daniel Oliveira)
-* build/ops: selinux: Allow ceph to manage tmp files (`issue#17436 <http://tracker.ceph.com/issues/17436>`_, `pr#11259 <http://github.com/ceph/ceph/pull/11259>`_, Boris Ranto)
-* build/ops: selinux: allow read /proc/<pid>/cmdline (`issue#16675 <http://tracker.ceph.com/issues/16675>`_, `pr#10339 <http://github.com/ceph/ceph/pull/10339>`_, Kefu Chai)
-* cephfs,common: osdc/Journaler: move C_DelayFlush class to .cc (`pr#10744 <http://github.com/ceph/ceph/pull/10744>`_, Michal Jarzabek)
-* cephfs,core,rbd: ObjectCacher: fix bh_read_finish offset logic (`issue#16002 <http://tracker.ceph.com/issues/16002>`_, `pr#9606 <http://github.com/ceph/ceph/pull/9606>`_, Greg Farnum)
-* cephfs,core,rbd: osdc/ObjectCacher: move C_ReadFinish, C_RetryRead (`pr#10781 <http://github.com/ceph/ceph/pull/10781>`_, Michal Jarzabek)
-* cephfs: Add ceph_ll_setlk and ceph_ll_getlk (`pr#9566 <http://github.com/ceph/ceph/pull/9566>`_, Frank S. Filz)
-* cephfs: CephFS: misc. cleanups and remove legacy cephfs tool (`issue#16195 <http://tracker.ceph.com/issues/16195>`_, `issue#16035 <http://tracker.ceph.com/issues/16035>`_, `issue#15923 <http://tracker.ceph.com/issues/15923>`_, `pr#10243 <http://github.com/ceph/ceph/pull/10243>`_, John Spray)
-* cephfs: Clean up handling of "/.." in ceph client (`pr#10691 <http://github.com/ceph/ceph/pull/10691>`_, Jeff Layton)
-* cephfs: Client: fixup param type and return value (`pr#10463 <http://github.com/ceph/ceph/pull/10463>`_, gongchuang)
-* cephfs: Client: pass "UserPerm" struct everywhere for security checks (`issue#16367 <http://tracker.ceph.com/issues/16367>`_, `issue#17368 <http://tracker.ceph.com/issues/17368>`_, `pr#11218 <http://github.com/ceph/ceph/pull/11218>`_, Greg Farnum)
-* cephfs: First pile of statx patches (`pr#10922 <http://github.com/ceph/ceph/pull/10922>`_, Sage Weil, Jeff Layton)
-* cephfs: Fix attribute handling at lookup time (`issue#16668 <http://tracker.ceph.com/issues/16668>`_, `pr#10386 <http://github.com/ceph/ceph/pull/10386>`_, Jeff Layton)
-* cephfs: Inotable repair during forward scrub (`pr#10281 <http://github.com/ceph/ceph/pull/10281>`_, Vishal Kanaujia)
-* cephfs: Server: drop locks and auth pins if wait for pending truncate (`pr#9716 <http://github.com/ceph/ceph/pull/9716>`_, xie xingguo)
-* cephfs: Small interface cleanups for struct ceph_statx  (`pr#11093 <http://github.com/ceph/ceph/pull/11093>`_, Jeff Layton)
-* cephfs: build ceph-fuse on OSX (`pr#9371 <http://github.com/ceph/ceph/pull/9371>`_, Yan, Zheng)
-* cephfs: ceph-fuse: link to libtcmalloc or jemalloc (`issue#16655 <http://tracker.ceph.com/issues/16655>`_, `pr#10258 <http://github.com/ceph/ceph/pull/10258>`_, Yan, Zheng)
-* cephfs: ceph_volume_client: store authentication metadata (`issue#15406 <http://tracker.ceph.com/issues/15406>`_, `issue#15615 <http://tracker.ceph.com/issues/15615>`_, `pr#9864 <http://github.com/ceph/ceph/pull/9864>`_, John Spray, Ramana Raja)
-* cephfs: client/barrier: move C_Block_Sync class to .cc (`pr#11001 <http://github.com/ceph/ceph/pull/11001>`_, Michal Jarzabek)
-* cephfs: client/filer: cleanup the redundant judgments of _write&&_fallocate (`pr#10062 <http://github.com/ceph/ceph/pull/10062>`_, huanwen ren)
-* cephfs: client: add missing client_lock for get_root (`pr#10027 <http://github.com/ceph/ceph/pull/10027>`_, Patrick Donnelly)
-* cephfs: client: discard mds map if it is identical to ours (`pr#9774 <http://github.com/ceph/ceph/pull/9774>`_, xie xingguo)
-* cephfs: client: fast abort if underlying statsf() call failed; end scope of std::hex properly (`pr#9803 <http://github.com/ceph/ceph/pull/9803>`_, xie xingguo)
-* cephfs: client: fix access violation (`pr#9793 <http://github.com/ceph/ceph/pull/9793>`_, xie xingguo)
-* cephfs: client: fix readdir vs fragmentation race (`issue#17286 <http://tracker.ceph.com/issues/17286>`_, `pr#11147 <http://github.com/ceph/ceph/pull/11147>`_, Yan, Zheng)
-* cephfs: client: fix segment fault in Client::_invalidate_kernel_dcache(). (`issue#17253 <http://tracker.ceph.com/issues/17253>`_, `pr#11170 <http://github.com/ceph/ceph/pull/11170>`_, Yan, Zheng)
-* cephfs: client: fix shutdown with open inodes (`issue#16764 <http://tracker.ceph.com/issues/16764>`_, `pr#10419 <http://github.com/ceph/ceph/pull/10419>`_, John Spray)
-* cephfs: client: include COMPLETE and ORDERED states in cache dump (`pr#10485 <http://github.com/ceph/ceph/pull/10485>`_, Greg Farnum)
-* cephfs: client: kill compiling warning (`pr#9994 <http://github.com/ceph/ceph/pull/9994>`_, xie xingguo)
-* cephfs: client: misc fixes (`pr#9838 <http://github.com/ceph/ceph/pull/9838>`_, xie xingguo)
-* cephfs: client: move Inode specific cleanup to destructor (`pr#10168 <http://github.com/ceph/ceph/pull/10168>`_, Patrick Donnelly)
-* cephfs: client: note order of member init in cons (`pr#10169 <http://github.com/ceph/ceph/pull/10169>`_, Patrick Donnelly)
-* cephfs: client: properly set inode number of created inode in replay request (`issue#17172 <http://tracker.ceph.com/issues/17172>`_, `pr#10957 <http://github.com/ceph/ceph/pull/10957>`_, Yan, Zheng)
-* cephfs: client: protect InodeRef with client_lock (`issue#17392 <http://tracker.ceph.com/issues/17392>`_, `pr#11225 <http://github.com/ceph/ceph/pull/11225>`_, Yan, Zheng)
-* cephfs: doc/mds: fixup mds doc (`pr#10573 <http://github.com/ceph/ceph/pull/10573>`_, huanwen ren)
-* cephfs: fuse_ll: fix incorrect error settings of fuse_ll_mkdir() (`pr#9809 <http://github.com/ceph/ceph/pull/9809>`_, xie xingguo)
-* cephfs: include/ceph_fs.h: guard `#define CEPH_SETATTR_*` with #ifndef (`pr#10265 <http://github.com/ceph/ceph/pull/10265>`_, Kefu Chai)
-* cephfs: libcephfs: Fix the incorrect integer conversion in libcephfs_jni.cc (`pr#10640 <http://github.com/ceph/ceph/pull/10640>`_, wenjunhuang)
-* cephfs: libcephfs: add unmount function in cephfs.pyx (`pr#10774 <http://github.com/ceph/ceph/pull/10774>`_, huanwen ren)
-* cephfs: libcephfs: fix portability-related error settings (`pr#9794 <http://github.com/ceph/ceph/pull/9794>`_, xie xingguo)
-* cephfs: libcephfs: kill compiling warning (`pr#10622 <http://github.com/ceph/ceph/pull/10622>`_, xie xingguo)
-* cephfs: mds/CDir: remove the part of judgment for _next_dentry_on_set (`pr#10476 <http://github.com/ceph/ceph/pull/10476>`_, zhang.zezhu)
-* cephfs: mds/CInode: fix potential fin hanging (`pr#9773 <http://github.com/ceph/ceph/pull/9773>`_, xie xingguo)
-* cephfs: mds/MDBalancer: cleanup (`pr#10512 <http://github.com/ceph/ceph/pull/10512>`_, huanwen ren)
-* cephfs: mds/MDCache: kill a comipler warning (`pr#11254 <http://github.com/ceph/ceph/pull/11254>`_, xie xingguo)
-* cephfs: mds/MDSMap default metadata pool to -1 (was: output None instead of 0 when no fs present.) (`issue#16588 <http://tracker.ceph.com/issues/16588>`_, `pr#10202 <http://github.com/ceph/ceph/pull/10202>`_, Xiaoxi Chen)
-* cephfs: mds/MDSTable: add const to member functions (`pr#10846 <http://github.com/ceph/ceph/pull/10846>`_, Michal Jarzabek)
-* cephfs: mds/SessionMap.h: change statement to assertion (`pr#11289 <http://github.com/ceph/ceph/pull/11289>`_, Michal Jarzabek)
-* cephfs: mds/SnapRealm.h: add const to member functions (`pr#10878 <http://github.com/ceph/ceph/pull/10878>`_, Michal Jarzabek)
-* cephfs: mds/server: clean up handle_client_open() (`pr#11120 <http://github.com/ceph/ceph/pull/11120>`_, huanwen ren)
-* cephfs: mon/MDSMonitor: move C_Updated class to .cc file (`pr#10668 <http://github.com/ceph/ceph/pull/10668>`_, Michal Jarzabek)
-* cephfs: osdc/mds: fixup pos parameter in the journaler (`pr#10200 <http://github.com/ceph/ceph/pull/10200>`_, huanwen ren)
-* cephfs: reduce unnecessary mds log flush (`pr#10393 <http://github.com/ceph/ceph/pull/10393>`_, Yan, Zheng)
-* cephfs: tools/cephfs: Remove cephfs-data-scan tmap_upgrade (`issue#16144 <http://tracker.ceph.com/issues/16144>`_, `pr#10100 <http://github.com/ceph/ceph/pull/10100>`_, Douglas Fuller)
-* cephfs: ceph_fuse: use sizeof get the buf length (`pr#11176 <http://github.com/ceph/ceph/pull/11176>`_, LeoZhang)
-* cli: retry when the mon is not configured (`issue#16477 <http://tracker.ceph.com/issues/16477>`_, `pr#11089 <http://github.com/ceph/ceph/pull/11089>`_, Loic Dachary)
-* cmake: Add -pie to CMAKE_EXE_LINKER_FLAGS (`pr#10755 <http://github.com/ceph/ceph/pull/10755>`_, Tim Serong)
-* cmake: Fix FCGI include directory (`pr#9983 <http://github.com/ceph/ceph/pull/9983>`_, Tim Serong)
-* cmake: Fix mismatched librgw VERSION / SOVERSION (`pr#10754 <http://github.com/ceph/ceph/pull/10754>`_, Tim Serong)
-* cmake: FreeBSD specific excludes in CMakeLists.txt (`pr#10973 <http://github.com/ceph/ceph/pull/10973>`_, Willem Jan Withagen)
-* cmake: FreeBSD specific excludes in CMakeLists.txt files (`pr#10517 <http://github.com/ceph/ceph/pull/10517>`_, Willem Jan Withagen)
-* cmake: Really add FCGI_INCLUDE_DIR to include_directories for rgw (`pr#10139 <http://github.com/ceph/ceph/pull/10139>`_, Tim Serong)
-* cmake: Removed README.cmake.md, edited README.md (`pr#10028 <http://github.com/ceph/ceph/pull/10028>`_, Ali Maredia)
-* cmake: Support tcmalloc_minimal allocator (`pr#11111 <http://github.com/ceph/ceph/pull/11111>`_, Bassam Tabbara)
-* cmake: add dependency from ceph_smalliobenchrbd to cls libraries (`pr#10870 <http://github.com/ceph/ceph/pull/10870>`_, J. Eric Ivancich)
-* cmake: add_subdirectory(include) (`pr#10360 <http://github.com/ceph/ceph/pull/10360>`_, Kefu Chai)
-* cmake: ceph_test_rbd_mirror does not require librados_test_stub (`pr#10164 <http://github.com/ceph/ceph/pull/10164>`_, Jason Dillaman)
-* cmake: cleanup Findgperftools.cmake (`pr#10670 <http://github.com/ceph/ceph/pull/10670>`_, Kefu Chai)
-* cmake: correct ceph_test_librbd/ceph_test_rbd_mirror linkage (`issue#16882 <http://tracker.ceph.com/issues/16882>`_, `pr#10598 <http://github.com/ceph/ceph/pull/10598>`_, Jason Dillaman)
-* cmake: disable -fvar-tracking-assignments for ceph_dencoder.cc (`pr#10275 <http://github.com/ceph/ceph/pull/10275>`_, Kefu Chai)
-* cmake: disable unittest_async_compressor (`pr#10394 <http://github.com/ceph/ceph/pull/10394>`_, Kefu Chai)
-* cmake: do not link against unused objects or libraries (`pr#10837 <http://github.com/ceph/ceph/pull/10837>`_, Kefu Chai)
-* cmake: enable ccache for rocksdb too (`pr#11100 <http://github.com/ceph/ceph/pull/11100>`_, Bassam Tabbara)
-* cmake: exclude non-public symbols in shared libraries (`issue#16556 <http://tracker.ceph.com/issues/16556>`_, `pr#10472 <http://github.com/ceph/ceph/pull/10472>`_, Kefu Chai)
-* cmake: fix incorrect dependencies to librados (`pr#10145 <http://github.com/ceph/ceph/pull/10145>`_, Jason Dillaman)
-* cmake: fix the FTBFS introduced by dc8b3ba (`pr#10282 <http://github.com/ceph/ceph/pull/10282>`_, Kefu Chai)
-* cmake: fix the build of unittest_async_compressor (`pr#10400 <http://github.com/ceph/ceph/pull/10400>`_, Kefu Chai)
-* cmake: fix the tracing header dependencies (`pr#10906 <http://github.com/ceph/ceph/pull/10906>`_, Kefu Chai)
-* cmake: fix unittest_rbd_mirror failures under non-optimized builds (`pr#9990 <http://github.com/ceph/ceph/pull/9990>`_, Jason Dillaman)
-* cmake: fix wrong path introduced by bb163e9 (`pr#10643 <http://github.com/ceph/ceph/pull/10643>`_, Kefu Chai)
-* cmake: fixes (`pr#10092 <http://github.com/ceph/ceph/pull/10092>`_, Daniel Gryniewicz)
-* cmake: fixes for pypi changes (`pr#10204 <http://github.com/ceph/ceph/pull/10204>`_, Kefu Chai)
-* cmake: include(SIMDExt) in src/CMakeLists.txt (`pr#11003 <http://github.com/ceph/ceph/pull/11003>`_, Kefu Chai)
-* cmake: install ceph_test_cls_rgw (`pr#10025 <http://github.com/ceph/ceph/pull/10025>`_, Kefu Chai)
-* cmake: install ceph_test_rados_striper_api_* (`pr#10541 <http://github.com/ceph/ceph/pull/10541>`_, Kefu Chai)
-* cmake: install platlib into a subdir of build-base dir (`pr#10666 <http://github.com/ceph/ceph/pull/10666>`_, Kefu Chai)
-* cmake: make py3 a nice-to-have (`issue#17103 <http://tracker.ceph.com/issues/17103>`_, `pr#11015 <http://github.com/ceph/ceph/pull/11015>`_, Kefu Chai)
-* cmake: pass -DINTEL* to gf-complete cflags (`pr#10956 <http://github.com/ceph/ceph/pull/10956>`_, tone.zhang, Kefu Chai)
-* cmake: pass cmake's compiler and flags to compile RocksDB into build (`pr#10418 <http://github.com/ceph/ceph/pull/10418>`_, Willem Jan Withagen)
-* cmake: recompile erasure src for different variants (`pr#10772 <http://github.com/ceph/ceph/pull/10772>`_, Kefu Chai)
-* cmake: remove WITH_MDS option (`pr#10186 <http://github.com/ceph/ceph/pull/10186>`_, Ali Maredia)
-* cmake: remove more autotools hacks (`pr#11229 <http://github.com/ceph/ceph/pull/11229>`_, Sage Weil)
-* cmake: remove unnecessary linked libs from libcephfs (`issue#16556 <http://tracker.ceph.com/issues/16556>`_, `pr#10081 <http://github.com/ceph/ceph/pull/10081>`_, Kefu Chai)
-* cmake: rework NSS and SSL (`pr#9831 <http://github.com/ceph/ceph/pull/9831>`_, Matt Benjamin)
-* cmake: set ARM_CRC_FLAGS from the CRC test rather than ARM_NEON_FLAGS (`issue#17250 <http://tracker.ceph.com/issues/17250>`_, `pr#11028 <http://github.com/ceph/ceph/pull/11028>`_, Dan Mick)
-* cmake: specify distutils build path explicitly (`pr#10568 <http://github.com/ceph/ceph/pull/10568>`_, Kefu Chai)
-* cmake: supress more warnings (`pr#10469 <http://github.com/ceph/ceph/pull/10469>`_, Willem Jan Withagen)
-* cmake: use PERF_LOCAL_FLAGS only if defined (`issue#17104 <http://tracker.ceph.com/issues/17104>`_, `pr#10828 <http://github.com/ceph/ceph/pull/10828>`_, Michel Normand)
-* cmake: use stock Find* modules. (`pr#10178 <http://github.com/ceph/ceph/pull/10178>`_, Kefu Chai)
-* cmake: work to get inital FreeBSD stuff (`pr#10352 <http://github.com/ceph/ceph/pull/10352>`_, Willem Jan Withagen)
-* cmake: find GIT_VER variables if there is no .git dir (`pr#11499 <http://github.com/ceph/ceph/pull/11499>`_, Ali Maredia)
-* common,bluestore: Isa-l extention for zlib compression plugin (`pr#10158 <http://github.com/ceph/ceph/pull/10158>`_, Alyona Kiseleva, Dan Mick)
-* common,bluestore: compressor/zlib: zlib wrapper fix (`pr#11079 <http://github.com/ceph/ceph/pull/11079>`_, Igor Fedotov)
-* common: auth/cephx: misc fixes (`pr#9679 <http://github.com/ceph/ceph/pull/9679>`_, xie xingguo)
-* common: common/PluginRegistry: improve error output for shared library load fa… (`pr#11081 <http://github.com/ceph/ceph/pull/11081>`_, Igor Fedotov)
-* common: common/Throttle.h: remove unneeded class (`pr#10902 <http://github.com/ceph/ceph/pull/10902>`_, Michal Jarzabek)
-* common: common/Timer.h: delete copy constr and assign op (`pr#11046 <http://github.com/ceph/ceph/pull/11046>`_, Michal Jarzabek)
-* common: common/WorkQueue: add std move (`pr#9729 <http://github.com/ceph/ceph/pull/9729>`_, Michal Jarzabek)
-* common: compressor: zlib compressor plugin  cleanup (`pr#9782 <http://github.com/ceph/ceph/pull/9782>`_, Alyona Kiseleva)
-* common: erasure-code: Runtime detection of SIMD for jerasure and shec (`pr#11086 <http://github.com/ceph/ceph/pull/11086>`_, Bassam Tabbara)
-* common: global: log which process/command sent a signal (`pr#8964 <http://github.com/ceph/ceph/pull/8964>`_, song baisen)
-* common: include/assert: clean up ceph assertion macros (`pr#9969 <http://github.com/ceph/ceph/pull/9969>`_, Sage Weil)
-* common: instantiate strict_si_cast<long> not strict_si_cast<int64_t> (`issue#16398 <http://tracker.ceph.com/issues/16398>`_, `pr#9934 <http://github.com/ceph/ceph/pull/9934>`_, Kefu Chai)
-* common: lockdep: verbose even if no logging is set (`pr#10576 <http://github.com/ceph/ceph/pull/10576>`_, Willem Jan Withagen)
-* common: messages/MOSDMap: mark as enlighten OSDMap encoder (`pr#10843 <http://github.com/ceph/ceph/pull/10843>`_, Sage Weil)
-* common: mon/Monitor.cc:replce lock/unlock with Mutex:Lockr (`pr#9792 <http://github.com/ceph/ceph/pull/9792>`_, Michal Jarzabek)
-* common: msg/AsyncMessenger.cc: remove code duplication (`pr#10030 <http://github.com/ceph/ceph/pull/10030>`_, Michal Jarzabek)
-* common: msg/async: less verbose debug messages at debug_ms=1 (`pr#11205 <http://github.com/ceph/ceph/pull/11205>`_, Sage Weil)
-* common: msg/async: remove static member variable (`issue#16686 <http://tracker.ceph.com/issues/16686>`_, `pr#10440 <http://github.com/ceph/ceph/pull/10440>`_, Kefu Chai)
-* common: only call crypto::init once per CephContext (`issue#17205 <http://tracker.ceph.com/issues/17205>`_, `pr#10965 <http://github.com/ceph/ceph/pull/10965>`_, Casey Bodley)
-* common: osdc/ObjectCacher: change iterator to const_iterator and add const to member functions (`pr#9644 <http://github.com/ceph/ceph/pull/9644>`_, Michal Jarzabek)
-* common: preforker: prevent call to 'write' on an fd that was already closed (`pr#10949 <http://github.com/ceph/ceph/pull/10949>`_, Avner BenHanoch)
-* common: remove basename() dependency (`pr#9845 <http://github.com/ceph/ceph/pull/9845>`_, John Coyle)
-* common: src/common/buffer.cc fix judgment for lseek (`pr#10130 <http://github.com/ceph/ceph/pull/10130>`_, zhang.zezhu)
-* common: unknown hash type of judgment modification (`pr#9510 <http://github.com/ceph/ceph/pull/9510>`_, huanwen ren)
-* common: Timer.cc: replace long types with auto (`pr#11067 <http://github.com/ceph/ceph/pull/11067>`_, Michal Jarzabek)
-* common: TrackedOp: move ShardedTrackingData to .cc (`pr#10639 <http://github.com/ceph/ceph/pull/10639>`_, Michal Jarzabek)
-* common: config_opts: fix comment(radio -> ratio) (`pr#10783 <http://github.com/ceph/ceph/pull/10783>`_, xie xingguo)
-* common: src/common/dns_resolve.cc: reorder the includes (`pr#10505 <http://github.com/ceph/ceph/pull/10505>`_, Willem Jan Withagen)
-* common: global/signal_handler: use sig_str instead of sys_siglist (`pr#10633 <http://github.com/ceph/ceph/pull/10633>`_, John Coyle)
-* core,cephfs: Revert "osd/ReplicatedPG: for sync-read it don't cacl l_osd_op_r_prep… (`issue#16908 <http://tracker.ceph.com/issues/16908>`_, `pr#10875 <http://github.com/ceph/ceph/pull/10875>`_, Samuel Just)
-* core,cephfs: mon/mds: add err info when load_metadata is abnormal (`pr#10176 <http://github.com/ceph/ceph/pull/10176>`_, huanwen ren)
-* core,common: osd/OSD.cc: remove unneeded returns (`pr#11043 <http://github.com/ceph/ceph/pull/11043>`_, Michal Jarzabek)
-* core,pybind: python-rados: extends ReadOp/WriteOp API (`pr#9944 <http://github.com/ceph/ceph/pull/9944>`_, Mehdi Abaakouk)
-* core,pybind: python-rados: implement new aio_stat. (`pr#11006 <http://github.com/ceph/ceph/pull/11006>`_, Iain Buclaw)
-* core,pybind: qa/workunits/rados/test_python.sh: Allow specifying Python executable (`pr#10782 <http://github.com/ceph/ceph/pull/10782>`_, Oleh Prypin)
-* core:   os/filestore/LFNIndex: remove unused variable 'subdir_path' (`pr#8959 <http://github.com/ceph/ceph/pull/8959>`_, huangjun)
-* core: Create ceph-mgr (`pr#10328 <http://github.com/ceph/ceph/pull/10328>`_, John Spray, Tim Serong)
-* core: FileJournal: Remove obsolete _check_disk_write_cache function (`pr#11073 <http://github.com/ceph/ceph/pull/11073>`_, Brad Hubbard)
-* core: Lua object class support (`pr#7338 <http://github.com/ceph/ceph/pull/7338>`_, Noah Watkins)
-* core: OSD crash with Hammer to Jewel Upgrade: void FileStore::init_temp_collections() (`issue#16672 <http://tracker.ceph.com/issues/16672>`_, `pr#10565 <http://github.com/ceph/ceph/pull/10565>`_, David Zafman)
-* core: OSD.cc: remove unneeded return (`pr#9701 <http://github.com/ceph/ceph/pull/9701>`_, Michal Jarzabek)
-* core: OSD: avoid FileStore finisher deadlock in osd_lock when shutdown OSD (`pr#11052 <http://github.com/ceph/ceph/pull/11052>`_, Haomai Wang)
-* core: ObjectCacher: fix last_write check in bh_write_adjacencies() (`issue#16610 <http://tracker.ceph.com/issues/16610>`_, `pr#10304 <http://github.com/ceph/ceph/pull/10304>`_, Yan, Zheng)
-* core: ReplicatedPG: call op_applied for submit_log_entries based repops (`pr#9489 <http://github.com/ceph/ceph/pull/9489>`_, Samuel Just)
-* core: Wip 16998 (`issue#16998 <http://tracker.ceph.com/issues/16998>`_, `pr#10688 <http://github.com/ceph/ceph/pull/10688>`_, Samuel Just)
-* core: ceph-create-keys: add missing argument comma (`pr#11123 <http://github.com/ceph/ceph/pull/11123>`_, Patrick Donnelly)
-* core: ceph-create-keys: fix existing-but-different case (`issue#16255 <http://tracker.ceph.com/issues/16255>`_, `pr#10415 <http://github.com/ceph/ceph/pull/10415>`_, John Spray)
-* core: ceph-disk: partprobe should block udev induced BLKRRPART (`issue#15176 <http://tracker.ceph.com/issues/15176>`_, `pr#9330 <http://github.com/ceph/ceph/pull/9330>`_, Marius Vollmer, Loic Dachary)
-* core: ceph-disk: timeout ceph-disk to avoid blocking forever (`issue#16580 <http://tracker.ceph.com/issues/16580>`_, `pr#10262 <http://github.com/ceph/ceph/pull/10262>`_, Loic Dachary)
-* core: ceph-objectstore-tool: add a way to split filestore directories offline (`issue#17220 <http://tracker.ceph.com/issues/17220>`_, `pr#10776 <http://github.com/ceph/ceph/pull/10776>`_, Josh Durgin)
-* core: ceph.in: python 3 compatibility of the ceph CLI (`pr#9702 <http://github.com/ceph/ceph/pull/9702>`_, Oleh Prypin)
-* core: ceph_mon: use readdir() as readdir_r() is deprecated (`pr#11047 <http://github.com/ceph/ceph/pull/11047>`_, Kefu Chai)
-* core: cephx: Fix multiple segfaults due to attempts to encrypt or decrypt (`issue#16266 <http://tracker.ceph.com/issues/16266>`_, `pr#9703 <http://github.com/ceph/ceph/pull/9703>`_, Brad Hubbard)
-* core: https://github.com/ceph/ceph/pull/11052 (`pr#10371 <http://github.com/ceph/ceph/pull/10371>`_, Yan Jun)
-* core: include write error codes in the pg log (`issue#14468 <http://tracker.ceph.com/issues/14468>`_, `pr#10170 <http://github.com/ceph/ceph/pull/10170>`_, Josh Durgin)
-* core: kv/MemDB: fix assert triggerred by m_total_bytes underflow (`pr#10471 <http://github.com/ceph/ceph/pull/10471>`_, xie xingguo)
-* core: kv/RocksDB: add perfcounter for submit_transaction_sync operation (`pr#9770 <http://github.com/ceph/ceph/pull/9770>`_, Haodong Tang)
-* core: logmon: check is_leader() before doing any work on get_trim_to() (`pr#10342 <http://github.com/ceph/ceph/pull/10342>`_, song baisen)
-* core: memstore: clone zero-fills holes from source range (`pr#11157 <http://github.com/ceph/ceph/pull/11157>`_, Casey Bodley)
-* core: message: optimization for message priority strategy (`pr#8687 <http://github.com/ceph/ceph/pull/8687>`_, yaoning)
-* core: messages/MForward: fix encoding features (`issue#17365 <http://tracker.ceph.com/issues/17365>`_, `pr#11180 <http://github.com/ceph/ceph/pull/11180>`_, Sage Weil)
-* core: mgr/MgrClient: fix ms_handle_reset (`pr#11298 <http://github.com/ceph/ceph/pull/11298>`_, Sage Weil)
-* core: mgr/MgrMap: initialize all fields (`issue#17492 <http://tracker.ceph.com/issues/17492>`_, `pr#11308 <http://github.com/ceph/ceph/pull/11308>`_, Sage Weil)
-* core: mon/ConfigKeyService: pass strings by const ref (`pr#10618 <http://github.com/ceph/ceph/pull/10618>`_, Michal Jarzabek)
-* core: mon/LogMonitor: move C_Log struct to cc file (`pr#10721 <http://github.com/ceph/ceph/pull/10721>`_, Michal Jarzabek)
-* core: mon/MonClient.h: pass strings by const reference (`pr#10605 <http://github.com/ceph/ceph/pull/10605>`_, Michal Jarzabek)
-* core: mon/MonDBStore: fix assert which never fires (`pr#10706 <http://github.com/ceph/ceph/pull/10706>`_, xie xingguo)
-* core: mon/MonitorDBStore: do not use snapshot iterator; close on close (`pr#10102 <http://github.com/ceph/ceph/pull/10102>`_, Sage Weil)
-* core: mon/OSDMonitor.cc: remove use of boost assign (`pr#11060 <http://github.com/ceph/ceph/pull/11060>`_, Michal Jarzabek)
-* core: mon/PGMonitor: batch filter pg states; add sanity check (`pr#9394 <http://github.com/ceph/ceph/pull/9394>`_, xie xingguo)
-* core: mon/PGMonitor: calc the %USED of pool using used/(used+avail) (`issue#16933 <http://tracker.ceph.com/issues/16933>`_, `pr#10584 <http://github.com/ceph/ceph/pull/10584>`_, Kefu Chai)
-* core: mon/PGMonitor: move C_Stats struct to cc file (`pr#10719 <http://github.com/ceph/ceph/pull/10719>`_, Michal Jarzabek)
-* core: mon/PaxosService: make the return value type inconsistent (`pr#10231 <http://github.com/ceph/ceph/pull/10231>`_, zhang.zezhu)
-* core: mon/osdmonitor: fix incorrect output of "osd df" due to osd out (`issue#16706 <http://tracker.ceph.com/issues/16706>`_, `pr#10308 <http://github.com/ceph/ceph/pull/10308>`_, xie xingguo)
-* core: msg/AsyncMessenger: change return type to void (`pr#10230 <http://github.com/ceph/ceph/pull/10230>`_, Michal Jarzabek)
-* core: msg/Messenger: add const and override to function (`pr#10183 <http://github.com/ceph/ceph/pull/10183>`_, Michal Jarzabek)
-* core: msg/async/AsyncConnection: replace Mutex with std::mutex for peformance (`issue#16714 <http://tracker.ceph.com/issues/16714>`_, `issue#16715 <http://tracker.ceph.com/issues/16715>`_, `pr#10340 <http://github.com/ceph/ceph/pull/10340>`_, Haomai Wang)
-* core: msg/async/Event: ensure not refer to member variable which may destroyed (`issue#16714 <http://tracker.ceph.com/issues/16714>`_, `pr#10369 <http://github.com/ceph/ceph/pull/10369>`_, Haomai Wang)
-* core: msg/async/kqueue: avoid remove nonexist kqueue event (`pr#9869 <http://github.com/ceph/ceph/pull/9869>`_, Haomai Wang)
-* core: msg/async: Support close idle connection feature  (`issue#16366 <http://tracker.ceph.com/issues/16366>`_, `pr#9783 <http://github.com/ceph/ceph/pull/9783>`_, Haomai Wang)
-* core: msg/async: allow other async backend implementations (`pr#10264 <http://github.com/ceph/ceph/pull/10264>`_, Haomai Wang)
-* core: msg/async: avoid set out of range ms_async_op_threads option (`pr#11200 <http://github.com/ceph/ceph/pull/11200>`_, Haomai Wang)
-* core: msg/async: connect authorizer fix + recv_buf size (`pr#9784 <http://github.com/ceph/ceph/pull/9784>`_, Ilya Dryomov)
-* core: msg/async: harden error logic handle (`pr#9781 <http://github.com/ceph/ceph/pull/9781>`_, Haomai Wang)
-* core: msg/async: remove fd output in log prefix (`pr#11199 <http://github.com/ceph/ceph/pull/11199>`_, Haomai Wang)
-* core: msg/async: remove file event lock (`issue#16554 <http://tracker.ceph.com/issues/16554>`_, `issue#16552 <http://tracker.ceph.com/issues/16552>`_, `pr#10090 <http://github.com/ceph/ceph/pull/10090>`_, Haomai Wang)
-* core: msg/simple/Pipe: eliminating casts for the comparing of len and recv_max_prefetch (`pr#10273 <http://github.com/ceph/ceph/pull/10273>`_, zhang.zezhu)
-* core: msg/simple: fix wrong condition checking of writing TAG_CLOSE on closing (`pr#10343 <http://github.com/ceph/ceph/pull/10343>`_, xie xingguo)
-* core: msg/simple: wait dispatch_queue until all pipes closed (`issue#16472 <http://tracker.ceph.com/issues/16472>`_, `pr#9930 <http://github.com/ceph/ceph/pull/9930>`_, Haomai Wang)
-* core: msg: make async backend default (`pr#10746 <http://github.com/ceph/ceph/pull/10746>`_, Haomai Wang)
-* core: msg: mark daemons down on RST + ECONNREFUSED (`pr#8558 <http://github.com/ceph/ceph/pull/8558>`_, Piotr Dałek)
-* core: os/FuseStore: fix several FuseStore issues (`pr#10723 <http://github.com/ceph/ceph/pull/10723>`_, Sage Weil)
-* core: os/MemStore: move BufferlistObject to .cc file (`pr#10833 <http://github.com/ceph/ceph/pull/10833>`_, Michal Jarzabek)
-* core: os/ObjectStore: fix return code of collection_empty() method (`pr#11050 <http://github.com/ceph/ceph/pull/11050>`_, xie xingguo)
-* core: os/RocksDBStore: use effective Get API instead of iterator api (`pr#9411 <http://github.com/ceph/ceph/pull/9411>`_, Jianjian Huo, Haomai Wang, Mark Nelson)
-* core: os/filestore/FDCache: fix bug when filestore_fd_cache_shards = 0 (`pr#11048 <http://github.com/ceph/ceph/pull/11048>`_, jimifm)
-* core: os/filestore/FileJournal: error out if FileJournal is not a file (`issue#17307 <http://tracker.ceph.com/issues/17307>`_, `pr#11146 <http://github.com/ceph/ceph/pull/11146>`_, Kefu Chai)
-* core: os/filestore: add sanity checks and cleanups for mount() process (`pr#9734 <http://github.com/ceph/ceph/pull/9734>`_, xie xingguo)
-* core: os/filestore: disable use of splice by default (`pr#11113 <http://github.com/ceph/ceph/pull/11113>`_, Haomai Wang)
-* core: osd/OSD.cc: remove repeated searching of map (`pr#10986 <http://github.com/ceph/ceph/pull/10986>`_, Michal Jarzabek)
-* core: osd/OSD.cc: remove unneeded searching of maps (`pr#11039 <http://github.com/ceph/ceph/pull/11039>`_, Michal Jarzabek)
-* core: osd/OSD.h: add const to member functions (`pr#11114 <http://github.com/ceph/ceph/pull/11114>`_, Michal Jarzabek)
-* core: osd/OSD.h: move some members under private (`pr#11121 <http://github.com/ceph/ceph/pull/11121>`_, Michal Jarzabek)
-* core: osd/OSD.h: remove unneeded line (`pr#8980 <http://github.com/ceph/ceph/pull/8980>`_, Michal Jarzabek)
-* core: osd/OSDMonitor: misc. cleanups (`pr#10739 <http://github.com/ceph/ceph/pull/10739>`_, xie xingguo)
-* core: osd/OSDMonitor: misc. fixes (`pr#10491 <http://github.com/ceph/ceph/pull/10491>`_, xie xingguo)
-* core: osd/ReplicatedBackend: add sanity check during build_push_op() (`pr#9491 <http://github.com/ceph/ceph/pull/9491>`_, Yan Jun)
-* core: osd/ReplicatedPG: for sync-read it don't cacl l_osd_op_r_prepare_lat. (`pr#10365 <http://github.com/ceph/ceph/pull/10365>`_, Jianpeng Ma)
-* core: osd/ReplicatedPG: remove class redeclaration (`pr#11041 <http://github.com/ceph/ceph/pull/11041>`_, Michal Jarzabek)
-* core: osd/ReplicatedPG: remove unused param "op" from generate_subop() (`pr#10811 <http://github.com/ceph/ceph/pull/10811>`_, jimifm)
-* core: osd/Watch: add consts to member functions (`pr#10251 <http://github.com/ceph/ceph/pull/10251>`_, Michal Jarzabek)
-* core: osd/osd_type: check if pool is gone during check_new_interval()  (`pr#10859 <http://github.com/ceph/ceph/pull/10859>`_, xie xingguo)
-* core: osd/osdmonitor: pool of objects and bytes beyond quota should all be warn (`pr#9085 <http://github.com/ceph/ceph/pull/9085>`_, huanwen ren)
-* core: osdc/objecter: misc fixes (`pr#10826 <http://github.com/ceph/ceph/pull/10826>`_, xie xingguo)
-* core: pass string by const ref and add override to virtual function (`pr#9082 <http://github.com/ceph/ceph/pull/9082>`_, Michal Jarzabek)
-* core: qa/workunits/objectstore/test_fuse.sh: make test_fuse.sh work with filestore (`pr#11057 <http://github.com/ceph/ceph/pull/11057>`_, Sage Weil)
-* core: rados: add option to include clones when doing flush or evict (`pr#9698 <http://github.com/ceph/ceph/pull/9698>`_, Mingxin Liu)
-* core: subman: use replace instead of format (`issue#16961 <http://tracker.ceph.com/issues/16961>`_, `pr#10620 <http://github.com/ceph/ceph/pull/10620>`_, Loic Dachary)
-* core: test/common/Throttle.cc: fix race in shutdown (`pr#10094 <http://github.com/ceph/ceph/pull/10094>`_, Samuel Just)
-* core: test: add the necessary judgment (`pr#9694 <http://github.com/ceph/ceph/pull/9694>`_, huanwen ren)
-* core: tox.ini: remove extraneous coverage --omit option (`pr#10943 <http://github.com/ceph/ceph/pull/10943>`_, Josh Durgin)
-* core: udev: always populate /dev/disk/by-parttypeuuid (`issue#16351 <http://tracker.ceph.com/issues/16351>`_, `pr#9885 <http://github.com/ceph/ceph/pull/9885>`_, Loic Dachary)
-* core: os/FuseStore: remove unneeded header file (`pr#10799 <http://github.com/ceph/ceph/pull/10799>`_, Michal Jarzabek)
-* core: os/MemStore: move OmapIteratorImpl to cc file (`pr#10803 <http://github.com/ceph/ceph/pull/10803>`_, Michal Jarzabek)
-* core: os/Memstore.h: add override to virtual functions (`pr#10801 <http://github.com/ceph/ceph/pull/10801>`_, Michal Jarzabek)
-* core: os/Memstore: move PageSetObject class to .cc file (`pr#10817 <http://github.com/ceph/ceph/pull/10817>`_, Michal Jarzabek)
-* core: os/bluestore: remove unused head file. (`pr#11186 <http://github.com/ceph/ceph/pull/11186>`_, Jianpeng Ma)
-* core: safe_io: Improve portability by replacing loff_t type usage with off_t. (`pr#9767 <http://github.com/ceph/ceph/pull/9767>`_, John Coyle)
-* core: src/kv/MemDB.cc: the type of the parameter of push_back() does not match the ops's value_type (`pr#10455 <http://github.com/ceph/ceph/pull/10455>`_, Willem Jan Withagen)
-* core: msg/simple: apply prefetch policy more precisely (`pr#10344 <http://github.com/ceph/ceph/pull/10344>`_, xie xingguo)
-* core: CompatSet.h: remove unneeded inline (`pr#10071 <http://github.com/ceph/ceph/pull/10071>`_, Michal Jarzabek)
-* core: Objclass perm feedback (`pr#10313 <http://github.com/ceph/ceph/pull/10313>`_, Noah Watkins)
-* core: arch/arm.c: remove unnecessary variable read for simplicity (`pr#10821 <http://github.com/ceph/ceph/pull/10821>`_, Weibing Zhang)
-* crush: don't normalize input of crush_ln iteratively (`pr#10935 <http://github.com/ceph/ceph/pull/10935>`_, Piotr Dałek)
-* crush: reset bucket->h.items[i] when removing tree item (`issue#16525 <http://tracker.ceph.com/issues/16525>`_, `pr#10093 <http://github.com/ceph/ceph/pull/10093>`_, Kefu Chai)
-* crush: CrushCompiler.cc:884 (`pr#10952 <http://github.com/ceph/ceph/pull/10952>`_, xu biao)
-* crush: CrushCompiler: error out as long as parse fails (`issue#17306 <http://tracker.ceph.com/issues/17306>`_, `pr#11144 <http://github.com/ceph/ceph/pull/11144>`_, Kefu Chai)
-* doc: Add documentation about snapshots (`pr#10436 <http://github.com/ceph/ceph/pull/10436>`_, Greg Farnum)
-* doc: Add two options to radosgw-admin.rst manpage (`issue#17281 <http://tracker.ceph.com/issues/17281>`_, `pr#11134 <http://github.com/ceph/ceph/pull/11134>`_, Thomas Serlin)
-* doc: Changed config parameter "rgw keystone make new tenants" in radosgw multitenancy (`issue#17293 <http://tracker.ceph.com/issues/17293>`_, `pr#11127 <http://github.com/ceph/ceph/pull/11127>`_, SirishaGuduru)
-* doc: Modification for "TEST S3 ACCESS" section  in "INSTALL CEPH OBJECT GATEWAY" page (`pr#9089 <http://github.com/ceph/ceph/pull/9089>`_, la-sguduru)
-* doc: Update developer docs for cmake paths (`pr#11163 <http://github.com/ceph/ceph/pull/11163>`_, John Spray)
-* doc: add "--orphan-stale-secs" to radosgw-admin(8) (`issue#17280 <http://tracker.ceph.com/issues/17280>`_, `pr#11097 <http://github.com/ceph/ceph/pull/11097>`_, Ken Dreyer)
-* doc: add $pid metavar conf doc (`pr#11172 <http://github.com/ceph/ceph/pull/11172>`_, Patrick Donnelly)
-* doc: add Backporting section to Essentials chapter (`issue#15497 <http://tracker.ceph.com/issues/15497>`_, `pr#10457 <http://github.com/ceph/ceph/pull/10457>`_, Nathan Cutler)
-* doc: add Prepare tenant section to Testing in the cloud chapter (`pr#10413 <http://github.com/ceph/ceph/pull/10413>`_, Nathan Cutler)
-* doc: add Upload logs to archive server section... (`pr#10414 <http://github.com/ceph/ceph/pull/10414>`_, Nathan Cutler)
-* doc: add client config ref (`issue#16743 <http://tracker.ceph.com/issues/16743>`_, `pr#10434 <http://github.com/ceph/ceph/pull/10434>`_, Patrick Donnelly)
-* doc: add graphic for cap bit field (`pr#10897 <http://github.com/ceph/ceph/pull/10897>`_, Patrick Donnelly)
-* doc: add missing PR to hammer 0.94.8 release notes (`pr#10900 <http://github.com/ceph/ceph/pull/10900>`_, Nathan Cutler)
-* doc: add openSUSE instructions to quick-start-preflight (`pr#10454 <http://github.com/ceph/ceph/pull/10454>`_, Nathan Cutler)
-* doc: add rgw_enable_usage_log option in Rados Gateway admin guide (`issue#16604 <http://tracker.ceph.com/issues/16604>`_, `pr#10159 <http://github.com/ceph/ceph/pull/10159>`_, Mike Hackett)
-* doc: add troubleshooting steps for ceph-fuse (`pr#10374 <http://github.com/ceph/ceph/pull/10374>`_, Ken Dreyer)
-* doc: admin/build-doc: bypass sanity check if building doc (`issue#16940 <http://tracker.ceph.com/issues/16940>`_, `pr#10623 <http://github.com/ceph/ceph/pull/10623>`_, Kefu Chai)
-* doc: ceph-authtool man page option is --print-key not --print (`pr#9731 <http://github.com/ceph/ceph/pull/9731>`_, Brad Hubbard)
-* doc: ceph-deploy mon add doesn't take multiple nodes (`pr#10085 <http://github.com/ceph/ceph/pull/10085>`_, Chengwei Yang)
-* doc: clarify rbd size units (`pr#11303 <http://github.com/ceph/ceph/pull/11303>`_, Ilya Dryomov)
-* doc: cleanup outdated radosgw description (`pr#11248 <http://github.com/ceph/ceph/pull/11248>`_, Jiaying Ren)
-* doc: describe libvirt client logging (`pr#10542 <http://github.com/ceph/ceph/pull/10542>`_, Ken Dreyer)
-* doc: do not list all major versions in get-packages.rst (`pr#10899 <http://github.com/ceph/ceph/pull/10899>`_, Nathan Cutler)
-* doc: doc/cephfs: explain the various health messages (`pr#10244 <http://github.com/ceph/ceph/pull/10244>`_, John Spray)
-* doc: doc/dev: Fix missing code section due to no lexer for "none" (`pr#9083 <http://github.com/ceph/ceph/pull/9083>`_, Brad Hubbard)
-* doc: doc/radosgw: fix description of response elements 'Part' (`pr#10641 <http://github.com/ceph/ceph/pull/10641>`_, weiqiaomiao)
-* doc: doc/radosgw: rename config.rst to config-fcgi.rst (`pr#10381 <http://github.com/ceph/ceph/pull/10381>`_, Nathan Cutler)
-* doc: extend the CephFS troubleshooting guide (`pr#10458 <http://github.com/ceph/ceph/pull/10458>`_, Greg Farnum)
-* doc: fix broken link in SHEC erasure code plugin (`issue#16996 <http://tracker.ceph.com/issues/16996>`_, `pr#10675 <http://github.com/ceph/ceph/pull/10675>`_, Albert Tu)
-* doc: fix description for rsize and rasize (`pr#11101 <http://github.com/ceph/ceph/pull/11101>`_, Andreas Gerstmayr)
-* doc: fix rados/configuration/osd-config-ref.rst (`pr#10619 <http://github.com/ceph/ceph/pull/10619>`_, Chengwei Yang)
-* doc: fix singleton example in Developer Guide (`pr#10830 <http://github.com/ceph/ceph/pull/10830>`_, Nathan Cutler)
-* doc: fix some nits in release notes and releases table (`pr#10903 <http://github.com/ceph/ceph/pull/10903>`_, Nathan Cutler)
-* doc: fix standby replay config (`issue#16664 <http://tracker.ceph.com/issues/16664>`_, `pr#10268 <http://github.com/ceph/ceph/pull/10268>`_, Patrick Donnelly)
-* doc: fix wrong osdkeepalive name in mount.ceph manpage (`pr#10840 <http://github.com/ceph/ceph/pull/10840>`_, Zhi Zhang)
-* doc: fix/add changelog for 10.2.2, 0.94.7, 0.94.8 (`pr#10895 <http://github.com/ceph/ceph/pull/10895>`_, Sage Weil)
-* doc: format 2 now is the default image format (`pr#10705 <http://github.com/ceph/ceph/pull/10705>`_, Chengwei Yang)
-* doc: lgtm (build verified f23) (`pr#9745 <http://github.com/ceph/ceph/pull/9745>`_, weiqiaomiao)
-* doc: mailmap updates for upcoming 11.0.0 (`pr#9301 <http://github.com/ceph/ceph/pull/9301>`_, Yann Dupont)
-* doc: manual instructions to set up mds daemon (`pr#11115 <http://github.com/ceph/ceph/pull/11115>`_, Peter Maloney)
-* doc: missing "make vstart" in quick_guide.rst (`pr#11226 <http://github.com/ceph/ceph/pull/11226>`_, Leo Zhang)
-* doc: more details for pool deletion (`pr#10190 <http://github.com/ceph/ceph/pull/10190>`_, Ken Dreyer)
-* doc: peering.rst, fix typo (`pr#10131 <http://github.com/ceph/ceph/pull/10131>`_, Brad Hubbard)
-* doc: perf_counters.rst fix trivial typo (`pr#10292 <http://github.com/ceph/ceph/pull/10292>`_, Brad Hubbard)
-* doc: rbdmap: specify bash shell interpreter (`issue#16608 <http://tracker.ceph.com/issues/16608>`_, `pr#10733 <http://github.com/ceph/ceph/pull/10733>`_, Jason Dillaman)
-* doc: release-notes.rst: draft 0.94.8 release notes (`pr#10730 <http://github.com/ceph/ceph/pull/10730>`_, Nathan Cutler)
-* doc: remove btrfs contradiction (`pr#9758 <http://github.com/ceph/ceph/pull/9758>`_, Nathan Cutler)
-* doc: remove i386 from minimal hardware recommendations (`pr#10276 <http://github.com/ceph/ceph/pull/10276>`_, Kefu Chai)
-* doc: remove old references to inktank premium support (`pr#11182 <http://github.com/ceph/ceph/pull/11182>`_, Alfredo Deza)
-* doc: remove the description of deleted options (`issue#17041 <http://tracker.ceph.com/issues/17041>`_, `pr#10741 <http://github.com/ceph/ceph/pull/10741>`_, MinSheng Lin)
-* doc: rgw, doc: fix formatting around Keystone-related options. (`pr#10331 <http://github.com/ceph/ceph/pull/10331>`_, Radoslaw Zarzynski)
-* doc: rgw/doc: fix indent (`pr#10676 <http://github.com/ceph/ceph/pull/10676>`_, Yan Jun)
-* doc: rm SysV instructions, add systemd (`pr#10184 <http://github.com/ceph/ceph/pull/10184>`_, Ken Dreyer)
-* doc: silence sphinx warnings (`pr#10621 <http://github.com/ceph/ceph/pull/10621>`_, Kefu Chai)
-* doc: small standby doc edits (`pr#10479 <http://github.com/ceph/ceph/pull/10479>`_, Patrick Donnelly)
-* doc: update CephFS "early adopters" info (`pr#10068 <http://github.com/ceph/ceph/pull/10068>`_, John Spray)
-* doc: update canonical tarballs URL (`pr#9695 <http://github.com/ceph/ceph/pull/9695>`_, Ken Dreyer)
-* doc: update rbd glance configuration notes (`pr#10629 <http://github.com/ceph/ceph/pull/10629>`_, Jason Dillaman)
-* doc: update s3 static webiste feature support status (`pr#10223 <http://github.com/ceph/ceph/pull/10223>`_, Jiaying Ren)
-* doc: changelog: add v10.2.3 (`pr#11238 <http://github.com/ceph/ceph/pull/11238>`_, Abhishek Lekshmanan)
-* doc: install: Use https:// for download.ceph.com (`pr#10709 <http://github.com/ceph/ceph/pull/10709>`_, Colin Walters)
-* doc: release-notes: v0.94.9 (`pr#10927 <http://github.com/ceph/ceph/pull/10927>`_, Sage Weil)
-* doc: release-notes: v10.2.3 jewel (`pr#11234 <http://github.com/ceph/ceph/pull/11234>`_, Abhishek Lekshmanan)
-* doc: Add UK mirror and update copyright (`pr#10531 <http://github.com/ceph/ceph/pull/10531>`_, Patrick McGarry)
-* doc: README.md: replace package build instructions with tarball instructions (`pr#10829 <http://github.com/ceph/ceph/pull/10829>`_, Sage Weil)
-* doc: Removed reference about pool ownership based on BZ#1368528 (`pr#11063 <http://github.com/ceph/ceph/pull/11063>`_, Bara Ancincova)
-* librados: use bufferlist instead of buffer::list in public header (`pr#10632 <http://github.com/ceph/ceph/pull/10632>`_, Ryne Li)
-* librados: Rados-stripper: Flexible string matching for not found attributes (`pr#10577 <http://github.com/ceph/ceph/pull/10577>`_, Willem Jan Withagen)
-* librados: librados examples: link and include from current source tree by default. (`issue#15100 <http://tracker.ceph.com/issues/15100>`_, `pr#8189 <http://github.com/ceph/ceph/pull/8189>`_, Jesse Williamson)
-* librbd: API methods to directly acquire and release the exclusive lock (`issue#15632 <http://tracker.ceph.com/issues/15632>`_, `pr#9592 <http://github.com/ceph/ceph/pull/9592>`_, Mykola Golub)
-* librbd: add consistency groups operations with images (`pr#10034 <http://github.com/ceph/ceph/pull/10034>`_, Victor Denisov)
-* librbd: add explicit shrink check while resizing images (`pr#9878 <http://github.com/ceph/ceph/pull/9878>`_, Vaibhav Bhembre)
-* librbd: asynchronous v2 image creation (`issue#15321 <http://tracker.ceph.com/issues/15321>`_, `pr#9585 <http://github.com/ceph/ceph/pull/9585>`_, Venky Shankar)
-* librbd: backward/forward compatibility for update_features (`issue#17330 <http://tracker.ceph.com/issues/17330>`_, `pr#11155 <http://github.com/ceph/ceph/pull/11155>`_, Jason Dillaman)
-* librbd: block name prefix might overflow fixed size C-string (`issue#17310 <http://tracker.ceph.com/issues/17310>`_, `pr#11148 <http://github.com/ceph/ceph/pull/11148>`_, Jason Dillaman)
-* librbd: cache was not switching to writeback after first flush (`issue#16654 <http://tracker.ceph.com/issues/16654>`_, `pr#10762 <http://github.com/ceph/ceph/pull/10762>`_, Jason Dillaman)
-* librbd: corrected use-after-free in ImageWatcher (`issue#17289 <http://tracker.ceph.com/issues/17289>`_, `pr#11112 <http://github.com/ceph/ceph/pull/11112>`_, Jason Dillaman)
-* librbd: deadlock when replaying journal during image open (`issue#17188 <http://tracker.ceph.com/issues/17188>`_, `pr#10945 <http://github.com/ceph/ceph/pull/10945>`_, Jason Dillaman)
-* librbd: delay acquiring lock if image watch has failed (`issue#16923 <http://tracker.ceph.com/issues/16923>`_, `pr#10574 <http://github.com/ceph/ceph/pull/10574>`_, Jason Dillaman)
-* librbd: discard hangs when 'rbd_skip_partial_discard' is enabled (`issue#16386 <http://tracker.ceph.com/issues/16386>`_, `pr#10060 <http://github.com/ceph/ceph/pull/10060>`_, Mykola Golub)
-* librbd: extract group module from librbd/internal (`pr#11070 <http://github.com/ceph/ceph/pull/11070>`_, Victor Denisov)
-* librbd: failed assertion after shrinking a clone image twice (`issue#16561 <http://tracker.ceph.com/issues/16561>`_, `pr#10072 <http://github.com/ceph/ceph/pull/10072>`_, Jason Dillaman)
-* librbd: fix missing return statement if failed to get mirror image state (`pr#10136 <http://github.com/ceph/ceph/pull/10136>`_, runsisi)
-* librbd: fix possible inconsistent state when disabling mirroring fails (`issue#16984 <http://tracker.ceph.com/issues/16984>`_, `pr#10711 <http://github.com/ceph/ceph/pull/10711>`_, Jason Dillaman)
-* librbd: ignore partial refresh error when acquiring exclusive lock (`issue#17227 <http://tracker.ceph.com/issues/17227>`_, `pr#11044 <http://github.com/ceph/ceph/pull/11044>`_, Jason Dillaman)
-* librbd: initial hooks for client-side, image-extent cache in IO path (`pr#9121 <http://github.com/ceph/ceph/pull/9121>`_, Jason Dillaman)
-* librbd: interlock image refresh and exclusive lock operations (`issue#16773 <http://tracker.ceph.com/issues/16773>`_, `issue#17015 <http://tracker.ceph.com/issues/17015>`_, `pr#10770 <http://github.com/ceph/ceph/pull/10770>`_, Jason Dillaman)
-* librbd: memory leak in MirroringWatcher::notify_image_updated (`pr#11306 <http://github.com/ceph/ceph/pull/11306>`_, Mykola Golub)
-* librbd: optimize away unnecessary object map updates  (`issue#16707 <http://tracker.ceph.com/issues/16707>`_, `issue#16689 <http://tracker.ceph.com/issues/16689>`_, `pr#10332 <http://github.com/ceph/ceph/pull/10332>`_, Jason Dillaman)
-* librbd: optionally unregister "laggy" journal clients (`issue#14738 <http://tracker.ceph.com/issues/14738>`_, `pr#10378 <http://github.com/ceph/ceph/pull/10378>`_, Mykola Golub)
-* librbd: permit disabling journaling if in corrupt state (`issue#16740 <http://tracker.ceph.com/issues/16740>`_, `pr#10712 <http://github.com/ceph/ceph/pull/10712>`_, Jason Dillaman)
-* librbd: possible deadlock if cluster connection closed after image (`issue#17254 <http://tracker.ceph.com/issues/17254>`_, `pr#11037 <http://github.com/ceph/ceph/pull/11037>`_, Jason Dillaman)
-* librbd: potential deadlock closing image with in-flight readahead (`issue#17198 <http://tracker.ceph.com/issues/17198>`_, `pr#11152 <http://github.com/ceph/ceph/pull/11152>`_, Jason Dillaman)
-* librbd: potential double-unwatch of watch handle upon error (`issue#17210 <http://tracker.ceph.com/issues/17210>`_, `pr#10974 <http://github.com/ceph/ceph/pull/10974>`_, Jason Dillaman)
-* librbd: potential seg fault when blacklisting an image client (`issue#17251 <http://tracker.ceph.com/issues/17251>`_, `pr#11034 <http://github.com/ceph/ceph/pull/11034>`_, Jason Dillaman)
-* librbd: prevent creation of clone from non-primary mirrored image (`issue#16449 <http://tracker.ceph.com/issues/16449>`_, `pr#10123 <http://github.com/ceph/ceph/pull/10123>`_, Mykola Golub)
-* librbd: prevent creation of v2 image ids that are too large (`issue#16887 <http://tracker.ceph.com/issues/16887>`_, `pr#10581 <http://github.com/ceph/ceph/pull/10581>`_, Jason Dillaman)
-* mds: Add path filtering for dump cache (`issue#11171 <http://tracker.ceph.com/issues/11171>`_, `pr#9925 <http://github.com/ceph/ceph/pull/9925>`_, Douglas Fuller)
-* mds: Kill C_SaferCond in evict_sessions() (`issue#16288 <http://tracker.ceph.com/issues/16288>`_, `pr#9971 <http://github.com/ceph/ceph/pull/9971>`_, Douglas Fuller)
-* mds: Return "committing" rather than "committed" member in get_committing (`pr#10250 <http://github.com/ceph/ceph/pull/10250>`_, Greg Farnum)
-* mds: Set mds_snap_max_uid to 4294967294 (`pr#11016 <http://github.com/ceph/ceph/pull/11016>`_, Wido den Hollander)
-* mds: add assertion in handle_slave_rename_prep (`issue#16807 <http://tracker.ceph.com/issues/16807>`_, `pr#10429 <http://github.com/ceph/ceph/pull/10429>`_, John Spray)
-* mds: add assertions for standby_daemons invariant (`issue#16592 <http://tracker.ceph.com/issues/16592>`_, `pr#10316 <http://github.com/ceph/ceph/pull/10316>`_, Patrick Donnelly)
-* mds: add health warning for oversized cache (`issue#16570 <http://tracker.ceph.com/issues/16570>`_, `pr#10245 <http://github.com/ceph/ceph/pull/10245>`_, John Spray)
-* mds: add maximum fragment size constraint (`issue#16164 <http://tracker.ceph.com/issues/16164>`_, `pr#9789 <http://github.com/ceph/ceph/pull/9789>`_, Patrick Donnelly)
-* mds: add perf counters for MDLog replay and SessionMap (`pr#10539 <http://github.com/ceph/ceph/pull/10539>`_, John Spray)
-* mds: catch duplicates in DamageTable (`issue#17173 <http://tracker.ceph.com/issues/17173>`_, `pr#11137 <http://github.com/ceph/ceph/pull/11137>`_, John Spray)
-* mds: fix Session::check_access() (`issue#16358 <http://tracker.ceph.com/issues/16358>`_, `pr#9769 <http://github.com/ceph/ceph/pull/9769>`_, Yan, Zheng)
-* mds: fix daemon selection when starting ranks (`pr#10540 <http://github.com/ceph/ceph/pull/10540>`_, John Spray)
-* mds: fix shutting down mds timed-out due to deadlock (`issue#16396 <http://tracker.ceph.com/issues/16396>`_, `pr#9884 <http://github.com/ceph/ceph/pull/9884>`_, Zhi Zhang)
-* mds: fix up _dispatch ref-counting semantics (`pr#10533 <http://github.com/ceph/ceph/pull/10533>`_, Greg Farnum)
-* mds: fixup dump Formatter' type error; add path_ino and is_primary in the CDentry::dump() (`pr#10119 <http://github.com/ceph/ceph/pull/10119>`_, huanwen ren)
-* mds: handle blacklisting during journal recovery (`issue#17236 <http://tracker.ceph.com/issues/17236>`_, `pr#11138 <http://github.com/ceph/ceph/pull/11138>`_, John Spray)
-* mds: log path with CDir damage messages (`issue#16973 <http://tracker.ceph.com/issues/16973>`_, `pr#10996 <http://github.com/ceph/ceph/pull/10996>`_, John Spray)
-* mds: move Finisher to unlocked shutdown (`issue#16042 <http://tracker.ceph.com/issues/16042>`_, `pr#10142 <http://github.com/ceph/ceph/pull/10142>`_, Patrick Donnelly)
-* mds: populate DamageTable from scrub and log more quietly (`issue#16016 <http://tracker.ceph.com/issues/16016>`_, `pr#11136 <http://github.com/ceph/ceph/pull/11136>`_, John Spray)
-* mds: remove fail-safe queueing replay request (`issue#17271 <http://tracker.ceph.com/issues/17271>`_, `pr#11078 <http://github.com/ceph/ceph/pull/11078>`_, Yan, Zheng)
-* mds: remove max_mds config option (`issue#17105 <http://tracker.ceph.com/issues/17105>`_, `pr#10914 <http://github.com/ceph/ceph/pull/10914>`_, Patrick Donnelly)
-* mds: remove unused MDSDaemon::objecter (`pr#10566 <http://github.com/ceph/ceph/pull/10566>`_, Patrick Donnelly)
-* mds: snap failover fixes (`pr#9955 <http://github.com/ceph/ceph/pull/9955>`_, Yan, Zheng)
-* mds: trim null dentries proactively (`issue#16919 <http://tracker.ceph.com/issues/16919>`_, `pr#10606 <http://github.com/ceph/ceph/pull/10606>`_, John Spray)
-* mds: unuse Class and cleanup (`pr#10399 <http://github.com/ceph/ceph/pull/10399>`_, huanwen ren)
-* mds: use reference to avoid copy (`pr#10191 <http://github.com/ceph/ceph/pull/10191>`_, Patrick Donnelly)
-* mds: MDCache.h: remove unneeded access specifier (`pr#10901 <http://github.com/ceph/ceph/pull/10901>`_, Michal Jarzabek)
-* mds: MDSDaemon: move C_MDS_Tick class to .cc file (`pr#11220 <http://github.com/ceph/ceph/pull/11220>`_, Michal Jarzabek)
-* mgr: implement con reset handling (`pr#11299 <http://github.com/ceph/ceph/pull/11299>`_, Sage Weil)
-* mgr: squash compiler warnings (`pr#11307 <http://github.com/ceph/ceph/pull/11307>`_, John Spray)
-* mon: MonClient may hang on pinging an unresponsive monitor (`pr#9259 <http://github.com/ceph/ceph/pull/9259>`_, xie xingguo)
-* mon: Monitor: validate prefix on handle_command() (`issue#16297 <http://tracker.ceph.com/issues/16297>`_, `pr#9700 <http://github.com/ceph/ceph/pull/9700>`_, You Ji)
-* mon: OSDMonitor: Missing nearfull flag set (`pr#11082 <http://github.com/ceph/ceph/pull/11082>`_, Igor Podoski)
-* mon: change osdmap flags set and unset messages (`issue#15983 <http://tracker.ceph.com/issues/15983>`_, `pr#9252 <http://github.com/ceph/ceph/pull/9252>`_, Vikhyat Umrao)
-* mon: clear list in better way (`pr#9718 <http://github.com/ceph/ceph/pull/9718>`_, song baisen)
-* mon: do not recalculate 'to_remove' when it's known (`pr#9717 <http://github.com/ceph/ceph/pull/9717>`_, song baisen)
-* mon: misc cleanups (`pr#10591 <http://github.com/ceph/ceph/pull/10591>`_, xie xingguo)
-* mon: remove the redundant cancel_probe_timeout function (`pr#10261 <http://github.com/ceph/ceph/pull/10261>`_, song baisen)
-* mon: remove the redundant is_active judge in PaxosService (`pr#9749 <http://github.com/ceph/ceph/pull/9749>`_, song baisen)
-* mon: tear down standby replays on MDS rank stop (`issue#16909 <http://tracker.ceph.com/issues/16909>`_, `pr#10628 <http://github.com/ceph/ceph/pull/10628>`_, John Spray)
-* mon: use clearer code structure (`pr#10192 <http://github.com/ceph/ceph/pull/10192>`_, Patrick Donnelly)
-* mon: validate states transmitted in beacons (`issue#16592 <http://tracker.ceph.com/issues/16592>`_, `pr#10428 <http://github.com/ceph/ceph/pull/10428>`_, John Spray)
-* mon: wait 10m (not 5m) before marking down OSDs out (`pr#11184 <http://github.com/ceph/ceph/pull/11184>`_, Sage Weil)
-* mon: write fsid use the right return value (`pr#10197 <http://github.com/ceph/ceph/pull/10197>`_, song baisen)
-* mon: Elector:move C_ElectionExpire class to cc file (`pr#10416 <http://github.com/ceph/ceph/pull/10416>`_, Michal Jarzabek)
-* mon: HealthMonitor: add override to virtual functs (`pr#10549 <http://github.com/ceph/ceph/pull/10549>`_, Michal Jarzabek)
-* mon: HealthMonitor: remove unneeded include (`pr#10563 <http://github.com/ceph/ceph/pull/10563>`_, Michal Jarzabek)
-* mon: MonClient.h: delete copy constr and assing op (`pr#10599 <http://github.com/ceph/ceph/pull/10599>`_, Michal Jarzabek)
-* mon: MonClient: move C_CancelMonCommand to cc file (`pr#10392 <http://github.com/ceph/ceph/pull/10392>`_, Michal Jarzabek)
-* mon: MonClient: move C_Tick struct to cc file (`pr#10383 <http://github.com/ceph/ceph/pull/10383>`_, Michal Jarzabek)
-* mon: Monitor.h: add override to virtual functions (`pr#10515 <http://github.com/ceph/ceph/pull/10515>`_, Michal Jarzabek)
-* mon: Monitor: move C_Scrub, C_ScrubTimeout to .cc (`pr#10513 <http://github.com/ceph/ceph/pull/10513>`_, Michal Jarzabek)
-* mon: OSDMonitor.cc: remove unneeded casts (`pr#10575 <http://github.com/ceph/ceph/pull/10575>`_, Michal Jarzabek)
-* mon: Paxos: move classes to .cc file (`pr#11215 <http://github.com/ceph/ceph/pull/11215>`_, Michal Jarzabek)
-* mon: PaxosService: move classes to cc file (`pr#10529 <http://github.com/ceph/ceph/pull/10529>`_, Michal Jarzabek)
-* mon: remove the redundant list swap in paxos commit_proposal (`pr#10011 <http://github.com/ceph/ceph/pull/10011>`_, song baisen)
-* msgr: set close on exec flag (`issue#16390 <http://tracker.ceph.com/issues/16390>`_, `pr#9772 <http://github.com/ceph/ceph/pull/9772>`_, Kefu Chai)
-* msgr: Accepter.h: add override to virtual function (`pr#10422 <http://github.com/ceph/ceph/pull/10422>`_, Michal Jarzabek)
-* msgr: Accepter: move include to cc file (`pr#10441 <http://github.com/ceph/ceph/pull/10441>`_, Michal Jarzabek)
-* msgr: AsyncConnection: add const to mem functions (`pr#10302 <http://github.com/ceph/ceph/pull/10302>`_, Michal Jarzabek)
-* msgr: AsyncMessenger.cc: remove unneeded cast (`pr#10141 <http://github.com/ceph/ceph/pull/10141>`_, Michal Jarzabek)
-* msgr: AsyncMessenger: add const to function (`pr#10114 <http://github.com/ceph/ceph/pull/10114>`_, Michal Jarzabek)
-* msgr: AsyncMessenger: move C_handle_reap class to cc (`pr#10113 <http://github.com/ceph/ceph/pull/10113>`_, Michal Jarzabek)
-* msgr: AsyncMessenger: move C_processor_accept class (`pr#9991 <http://github.com/ceph/ceph/pull/9991>`_, Michal Jarzabek)
-* msgr: AsyncMessenger: remove unneeded include file (`pr#10195 <http://github.com/ceph/ceph/pull/10195>`_, Michal Jarzabek)
-* msgr: AsyncMessenger: remove unused function (`pr#10163 <http://github.com/ceph/ceph/pull/10163>`_, Michal Jarzabek)
-* msgr: EventKqueue.h: add override to virtual func (`pr#10318 <http://github.com/ceph/ceph/pull/10318>`_, Michal Jarzabek)
-* msgr: EventPoll.h: add override to virtual functions (`pr#10314 <http://github.com/ceph/ceph/pull/10314>`_, Michal Jarzabek)
-* msgr: EventSelect.h: add override to virtual funct (`pr#10321 <http://github.com/ceph/ceph/pull/10321>`_, Michal Jarzabek)
-* msgr: EventSelect: move includes to cc file (`pr#10333 <http://github.com/ceph/ceph/pull/10333>`_, Michal Jarzabek)
-* msgr: FastStrategy.h: add override to virtual funct (`pr#10482 <http://github.com/ceph/ceph/pull/10482>`_, Michal Jarzabek)
-* msgr: Message.h: add const to member function (`pr#10354 <http://github.com/ceph/ceph/pull/10354>`_, Michal Jarzabek)
-* msgr: Message.h: remove code duplication (`pr#10356 <http://github.com/ceph/ceph/pull/10356>`_, Michal Jarzabek)
-* msgr: QueueStrategy: add override to virtual functs (`pr#10503 <http://github.com/ceph/ceph/pull/10503>`_, Michal Jarzabek)
-* msgr: Stack.h: delete copy constr and assign op (`pr#11107 <http://github.com/ceph/ceph/pull/11107>`_, Michal Jarzabek)
-* msgr: async/Event.h: add const to member function (`pr#10224 <http://github.com/ceph/ceph/pull/10224>`_, Michal Jarzabek)
-* msgr: async: remove unused code. (`pr#11247 <http://github.com/ceph/ceph/pull/11247>`_, Jianpeng Ma)
-* osd: bail out if transaction size overflows (`issue#16982 <http://tracker.ceph.com/issues/16982>`_, `pr#10753 <http://github.com/ceph/ceph/pull/10753>`_, Kefu Chai)
-* osd: cleanup options and other redundancies (`pr#10450 <http://github.com/ceph/ceph/pull/10450>`_, xie xingguo)
-* osd: drop unused variables/methods (`pr#10559 <http://github.com/ceph/ceph/pull/10559>`_, xie xingguo)
-* osd: fix the mem leak of RepGather (`issue#16801 <http://tracker.ceph.com/issues/16801>`_, `pr#10423 <http://github.com/ceph/ceph/pull/10423>`_, Kefu Chai)
-* osd: fixups to explicitly persistenting missing sets (`pr#10405 <http://github.com/ceph/ceph/pull/10405>`_, Samuel Just)
-* osd: increment stats on recovery pull also (`issue#16277 <http://tracker.ceph.com/issues/16277>`_, `pr#10152 <http://github.com/ceph/ceph/pull/10152>`_, Kefu Chai)
-* osd: limit omap data in push op (`issue#16128 <http://tracker.ceph.com/issues/16128>`_, `pr#9894 <http://github.com/ceph/ceph/pull/9894>`_, Wanlong Gao)
-* osd: minor performance improvements (`pr#10470 <http://github.com/ceph/ceph/pull/10470>`_, xie xingguo)
-* osd: minor performance improvements and fixes (`pr#10526 <http://github.com/ceph/ceph/pull/10526>`_, xie xingguo)
-* osd: misc fixes and cleanups (`pr#10610 <http://github.com/ceph/ceph/pull/10610>`_, xie xingguo)
-* osd: miscellaneous fixes (`pr#10572 <http://github.com/ceph/ceph/pull/10572>`_, xie xingguo)
-* osd: more cleanups (`pr#10548 <http://github.com/ceph/ceph/pull/10548>`_, xie xingguo)
-* osd: object class loading and execution permissions (`pr#9972 <http://github.com/ceph/ceph/pull/9972>`_, Noah Watkins)
-* osd: pass shared_ptr by const reference (`pr#11266 <http://github.com/ceph/ceph/pull/11266>`_, Michal Jarzabek)
-* osd: persist the missing set explicitly (`pr#10334 <http://github.com/ceph/ceph/pull/10334>`_, Samuel Just)
-* osd: remove dispatch queue check since we don't queue hb message to this (`pr#9947 <http://github.com/ceph/ceph/pull/9947>`_, Haomai Wang)
-* osd: remove duplicated function (`pr#9117 <http://github.com/ceph/ceph/pull/9117>`_, Wei Jin)
-* osd: replace ceph:atomic_t with std::atomic in osd module. (`pr#9138 <http://github.com/ceph/ceph/pull/9138>`_, Xiaowei Chen)
-* osd: should not look up an empty pg (`issue#17380 <http://tracker.ceph.com/issues/17380>`_, `pr#11208 <http://github.com/ceph/ceph/pull/11208>`_, Kefu Chai, Loic Dachary)
-* osd: small cleanups (`pr#9980 <http://github.com/ceph/ceph/pull/9980>`_, Wanlong Gao)
-* osd: subscribe for old osdmaps when pause flag is set (`issue#17023 <http://tracker.ceph.com/issues/17023>`_, `pr#10725 <http://github.com/ceph/ceph/pull/10725>`_, Kefu Chai)
-* osd:preserve allocation hint attribute during recovery (`pr#9452 <http://github.com/ceph/ceph/pull/9452>`_, yaoning)
-* osd: osd-fast-mark-down.sh: fix typo in variable assignments (`pr#11224 <http://github.com/ceph/ceph/pull/11224>`_, Willem Jan Withagen)
-* osd: OSD.cc: initialise variable at definition (`pr#11099 <http://github.com/ceph/ceph/pull/11099>`_, Michal Jarzabek)
-* osd: OSD.cc: remove unneeded searching of map (`pr#11000 <http://github.com/ceph/ceph/pull/11000>`_, Michal Jarzabek)
-* osd: OSD.h: make some members private (`pr#11085 <http://github.com/ceph/ceph/pull/11085>`_, Michal Jarzabek)
-* osd: PG.cc: remove unneeded use of count (`pr#11228 <http://github.com/ceph/ceph/pull/11228>`_, Michal Jarzabek)
-* osd: PGBackend.h: move structs to .cc file (`pr#10975 <http://github.com/ceph/ceph/pull/10975>`_, Michal Jarzabek)
-* osd: ReplicatedBackend: move classes to cc file (`pr#10967 <http://github.com/ceph/ceph/pull/10967>`_, Michal Jarzabek)
-* osd: ReplicatedPG.h: add override to virtual funct (`pr#11271 <http://github.com/ceph/ceph/pull/11271>`_, Michal Jarzabek)
-* osd: ReplicatedPG: move classes to .cc file (`pr#10971 <http://github.com/ceph/ceph/pull/10971>`_, Michal Jarzabek)
-* osd: ReplicatedPG:move C_OSD_OnApplied class to cc (`pr#11288 <http://github.com/ceph/ceph/pull/11288>`_, Michal Jarzabek)
-* osd: Watch.h: remove unneeded forward declaration (`pr#10269 <http://github.com/ceph/ceph/pull/10269>`_, Michal Jarzabek)
-* osd: osdc/ObjectCacher.h: add const to member functions (`pr#9569 <http://github.com/ceph/ceph/pull/9569>`_, Michal Jarzabek)
-* osd: osdc/ObjectCacher.h: add const to member functions (`pr#9652 <http://github.com/ceph/ceph/pull/9652>`_, Michal Jarzabek)
-* osd: osdc/Objecter: move RequestStateHook class to .cc (`pr#10734 <http://github.com/ceph/ceph/pull/10734>`_, Michal Jarzabek)
-* pybind: Port Python-based tests and remaining Python bindings to Python 3 (`pr#10177 <http://github.com/ceph/ceph/pull/10177>`_, Oleh Prypin)
-* pybind: Rework cephfs/setup.py for PyPI (`pr#10315 <http://github.com/ceph/ceph/pull/10315>`_, Anirudha Bose)
-* pybind: Rework rbd/setup.py for PyPI (`issue#16940 <http://tracker.ceph.com/issues/16940>`_, `pr#10376 <http://github.com/ceph/ceph/pull/10376>`_, Anirudha Bose)
-* pybind: global/signal_handler: dump cmdline instead of arg[0] (`pr#10345 <http://github.com/ceph/ceph/pull/10345>`_, Kefu Chai)
-* pybind: make rados ready for PyPI (`pr#9833 <http://github.com/ceph/ceph/pull/9833>`_, Anirudha Bose)
-* pybind: pybind/ceph_argparse: handle non ascii unicode args (`issue#12287 <http://tracker.ceph.com/issues/12287>`_, `pr#8943 <http://github.com/ceph/ceph/pull/8943>`_, Kefu Chai)
-* pybind: Python 3 compatibility for workunits (`pr#10815 <http://github.com/ceph/ceph/pull/10815>`_, Anirudha Bose)
-* rbd: Allow user to remove snapshot with --force to auto flatten children (`pr#10087 <http://github.com/ceph/ceph/pull/10087>`_, Dongsheng Yang)
-* rbd: Reviewed-off-by: Ilya Dryomov <idryomov@gmail.com> (`issue#16171 <http://tracker.ceph.com/issues/16171>`_, `pr#10481 <http://github.com/ceph/ceph/pull/10481>`_, Jason Dillaman)
-* rbd: Reviewed-off-by: Ilya Dryomov <idryomov@gmail.com> (`issue#17030 <http://tracker.ceph.com/issues/17030>`_, `pr#10735 <http://github.com/ceph/ceph/pull/10735>`_, Jason Dillaman)
-* rbd: bench io-size should not be larger than image size (`issue#16967 <http://tracker.ceph.com/issues/16967>`_, `pr#10708 <http://github.com/ceph/ceph/pull/10708>`_, Jason Dillaman)
-* rbd: cleanup - Proxied operations shouldn't result in error messages if replayed (`issue#16130 <http://tracker.ceph.com/issues/16130>`_, `pr#9724 <http://github.com/ceph/ceph/pull/9724>`_, Vikhyat Umrao)
-* rbd: cls_rbd: clean up status from rbd-mirror if image removed (`pr#11142 <http://github.com/ceph/ceph/pull/11142>`_, Huan Zhang)
-* rbd: cls_rbd: set omap values in batch during image creation (`pr#9981 <http://github.com/ceph/ceph/pull/9981>`_, Dongsheng Yang)
-* rbd: inherit the parent image features when cloning an image (`issue#15388 <http://tracker.ceph.com/issues/15388>`_, `pr#9334 <http://github.com/ceph/ceph/pull/9334>`_, Dongsheng Yang)
-* rbd: journal: ensure in-flight ops are complete destroying journaler (`issue#17446 <http://tracker.ceph.com/issues/17446>`_, `pr#11257 <http://github.com/ceph/ceph/pull/11257>`_, Mykola Golub, Jason Dillaman)
-* rbd: journal: increase concurrency/parallelism of journal recorder (`issue#15259 <http://tracker.ceph.com/issues/15259>`_, `pr#10445 <http://github.com/ceph/ceph/pull/10445>`_, Ricardo Dias)
-* rbd: journal: move JournalTrimmer::C_RemoveSet struct (`pr#10912 <http://github.com/ceph/ceph/pull/10912>`_, Michal Jarzabek)
-* rbd: qa/workunits/rbd: before removing image make sure it is not bootstrapped (`issue#16555 <http://tracker.ceph.com/issues/16555>`_, `pr#10155 <http://github.com/ceph/ceph/pull/10155>`_, Mykola Golub)
-* rbd: qa/workunits/rbd: check status also in pool dir after asok commands (`pr#11291 <http://github.com/ceph/ceph/pull/11291>`_, Mykola Golub)
-* rbd: qa/workunits/rbd: set image-meta on primary image and wait it is replicated (`pr#11294 <http://github.com/ceph/ceph/pull/11294>`_, Mykola Golub)
-* rbd: qa/workunits/rbd: small fixup and improvements for rbd-mirror tests (`pr#10483 <http://github.com/ceph/ceph/pull/10483>`_, Mykola Golub)
-* rbd: qa/workunits/rbd: wait for image deleted before checking health (`pr#10545 <http://github.com/ceph/ceph/pull/10545>`_, Mykola Golub)
-* rbd: qa/workunits: support filtering cls_rbd unit test cases (`issue#16529 <http://tracker.ceph.com/issues/16529>`_, `pr#10714 <http://github.com/ceph/ceph/pull/10714>`_, Jason Dillaman)
-* rbd: rbd-mirror: 'wait_for_scheduled_deletion' callback might deadlock (`issue#16491 <http://tracker.ceph.com/issues/16491>`_, `pr#9964 <http://github.com/ceph/ceph/pull/9964>`_, Jason Dillaman)
-* rbd: rbd-mirror: Add sparse read for sync image (`issue#16780 <http://tracker.ceph.com/issues/16780>`_, `pr#11005 <http://github.com/ceph/ceph/pull/11005>`_, tianqing)
-* rbd: rbd-mirror: add additional test scenarios (`pr#10488 <http://github.com/ceph/ceph/pull/10488>`_, lande1234)
-* rbd: rbd-mirror: concurrent access of event might result in heap corruption (`issue#17283 <http://tracker.ceph.com/issues/17283>`_, `pr#11104 <http://github.com/ceph/ceph/pull/11104>`_, Jason Dillaman)
-* rbd: rbd-mirror: force-promoted image will remain R/O until rbd-mirror daemon restarted (`issue#16974 <http://tracker.ceph.com/issues/16974>`_, `pr#11090 <http://github.com/ceph/ceph/pull/11090>`_, Jason Dillaman)
-* rbd: rbd-mirror: gracefully fail if object map is unavailable (`issue#16558 <http://tracker.ceph.com/issues/16558>`_, `pr#10065 <http://github.com/ceph/ceph/pull/10065>`_, Jason Dillaman)
-* rbd: rbd-mirror: gracefully handle being blacklisted (`issue#16349 <http://tracker.ceph.com/issues/16349>`_, `pr#9970 <http://github.com/ceph/ceph/pull/9970>`_, Jason Dillaman)
-* rbd: rbd-mirror: image deleter should use pool id + global image uuid for key (`issue#16538 <http://tracker.ceph.com/issues/16538>`_, `issue#16227 <http://tracker.ceph.com/issues/16227>`_, `pr#10484 <http://github.com/ceph/ceph/pull/10484>`_, Jason Dillaman)
-* rbd: rbd-mirror: improve split-brain detection logic (`issue#16855 <http://tracker.ceph.com/issues/16855>`_, `pr#10703 <http://github.com/ceph/ceph/pull/10703>`_, Jason Dillaman)
-* rbd: rbd-mirror: include local pool id in resync throttle unique key (`issue#16536 <http://tracker.ceph.com/issues/16536>`_, `pr#10254 <http://github.com/ceph/ceph/pull/10254>`_, Jason Dillaman)
-* rbd: rbd-mirror: non-primary image is recording journal events during image sync (`pr#10462 <http://github.com/ceph/ceph/pull/10462>`_, Jason Dillaman)
-* rbd: rbd-mirror: potential IO stall when using asok flush request (`issue#16708 <http://tracker.ceph.com/issues/16708>`_, `pr#10432 <http://github.com/ceph/ceph/pull/10432>`_, Jason Dillaman)
-* rbd: rbd-mirror: potential assertion failure during error-induced shutdown (`issue#16956 <http://tracker.ceph.com/issues/16956>`_, `pr#10613 <http://github.com/ceph/ceph/pull/10613>`_, Jason Dillaman)
-* rbd: rbd-mirror: potential race condition during failure shutdown (`issue#16980 <http://tracker.ceph.com/issues/16980>`_, `pr#10667 <http://github.com/ceph/ceph/pull/10667>`_, Jason Dillaman)
-* rbd: rbd-mirror: quiesce in-flight event commits before shut down (`issue#17355 <http://tracker.ceph.com/issues/17355>`_, `pr#11185 <http://github.com/ceph/ceph/pull/11185>`_, Jason Dillaman)
-* rbd: rbd-mirror: reduce memory footprint during journal replay (`issue#16223 <http://tracker.ceph.com/issues/16223>`_, `pr#10341 <http://github.com/ceph/ceph/pull/10341>`_, Jason Dillaman)
-* rbd: rbd-mirror: remove ceph_test_rbd_mirror_image_replay test case (`issue#16539 <http://tracker.ceph.com/issues/16539>`_, `pr#10083 <http://github.com/ceph/ceph/pull/10083>`_, Mykola Golub)
-* rbd: rbd-mirror: replaying state should include flush action (`issue#16970 <http://tracker.ceph.com/issues/16970>`_, `pr#10627 <http://github.com/ceph/ceph/pull/10627>`_, Jason Dillaman)
-* rbd: rbd-mirror: replicate dynamic feature updates (`issue#16213 <http://tracker.ceph.com/issues/16213>`_, `pr#10980 <http://github.com/ceph/ceph/pull/10980>`_, Mykola Golub)
-* rbd: rbd-mirror: replicate image metadata settings (`issue#16212 <http://tracker.ceph.com/issues/16212>`_, `pr#11168 <http://github.com/ceph/ceph/pull/11168>`_, Mykola Golub)
-* rbd: rbd-mirror: snap rename does not properly replicate to peers (`issue#16622 <http://tracker.ceph.com/issues/16622>`_, `pr#10249 <http://github.com/ceph/ceph/pull/10249>`_, Jason Dillaman)
-* rbd: rbd-nbd does not properly handle resize notifications (`issue#15715 <http://tracker.ceph.com/issues/15715>`_, `pr#9291 <http://github.com/ceph/ceph/pull/9291>`_, Mykola Golub)
-* rbd: rbd-nbd: fix kernel deadlock during teuthology testing (`issue#16921 <http://tracker.ceph.com/issues/16921>`_, `pr#10985 <http://github.com/ceph/ceph/pull/10985>`_, Jason Dillaman)
-* rbd: recognize lock_on_read option (`pr#11313 <http://github.com/ceph/ceph/pull/11313>`_, Ilya Dryomov)
-* rbd: return error if we specified a wrong image name for rbd du (`issue#16987 <http://tracker.ceph.com/issues/16987>`_, `pr#11031 <http://github.com/ceph/ceph/pull/11031>`_, Dongsheng Yang)
-* rbd: test/librbd/fsx: enable exclusive-lock feature in krbd mode (`pr#10984 <http://github.com/ceph/ceph/pull/10984>`_, Ilya Dryomov)
-* rbd: test/rbd: fix possible mock journal race conditions (`issue#17317 <http://tracker.ceph.com/issues/17317>`_, `pr#11153 <http://github.com/ceph/ceph/pull/11153>`_, Jason Dillaman)
-* rbd: test: cmake related fixups for rbd tests (`pr#10124 <http://github.com/ceph/ceph/pull/10124>`_, Mykola Golub)
-* rbd: test: run-rbd-tests test cmake fixup (`pr#10134 <http://github.com/ceph/ceph/pull/10134>`_, Mykola Golub)
-* rbd: test: use wrapper that respects RBD_FEATURES when creating rbd image (`issue#16717 <http://tracker.ceph.com/issues/16717>`_, `pr#10348 <http://github.com/ceph/ceph/pull/10348>`_, Mykola Golub)
-* rbd: udev: add krbd readahead placeholder (`pr#10841 <http://github.com/ceph/ceph/pull/10841>`_, Nick Fisk)
-* rbd: rbd_mirror/ImageSynceThrottler: move struct to .cc (`pr#10928 <http://github.com/ceph/ceph/pull/10928>`_, Michal Jarzabek)
-* rgw: (build verified, provably unused/not aliased) (`pr#9993 <http://github.com/ceph/ceph/pull/9993>`_, weiqiaomiao)
-* rgw: Add documentation for the Multi-tenancy feature (`pr#9570 <http://github.com/ceph/ceph/pull/9570>`_, Pete Zaitcev)
-* rgw: Clean up lifecycle thread (`pr#10480 <http://github.com/ceph/ceph/pull/10480>`_, Daniel Gryniewicz)
-* rgw: Do not archive metadata by default (`issue#17256 <http://tracker.ceph.com/issues/17256>`_, `pr#11051 <http://github.com/ceph/ceph/pull/11051>`_, Pavan Rallabhandi)
-* rgw: Fix Host->bucket fallback logic inversion (`issue#15975 <http://tracker.ceph.com/issues/15975>`_, `issue#17136 <http://tracker.ceph.com/issues/17136>`_, `pr#10873 <http://github.com/ceph/ceph/pull/10873>`_, Robin H. Johnson)
-* rgw: Fix for using port 443 with pre-signed urls. (`issue#16548 <http://tracker.ceph.com/issues/16548>`_, `pr#10088 <http://github.com/ceph/ceph/pull/10088>`_, Pritha Srivastava)
-* rgw: Fix incorrect content length and range for zero sized objects during range requests (`issue#16388 <http://tracker.ceph.com/issues/16388>`_, `pr#10207 <http://github.com/ceph/ceph/pull/10207>`_, Pavan Rallabhandi)
-* rgw: Got rid of recursive mutex. (`pr#10562 <http://github.com/ceph/ceph/pull/10562>`_, Adam Kupczyk)
-* rgw: RGW : setting socket backlog for via ceph.conf (`issue#16406 <http://tracker.ceph.com/issues/16406>`_, `pr#9891 <http://github.com/ceph/ceph/pull/9891>`_, Feng Guo)
-* rgw: RGWMetaSyncCR holds refs to stacks instead of crs (`issue#16666 <http://tracker.ceph.com/issues/16666>`_, `pr#10301 <http://github.com/ceph/ceph/pull/10301>`_, Casey Bodley)
-* rgw: Reviewed by: Pritha Srivastava <prsrivas@redhat.com> (`issue#16188 <http://tracker.ceph.com/issues/16188>`_, `pr#9584 <http://github.com/ceph/ceph/pull/9584>`_, Albert Tu)
-* rgw: Rgw lifecycle testing (`pr#11131 <http://github.com/ceph/ceph/pull/11131>`_, Daniel Gryniewicz)
-* rgw: Rgw nfs 28 (`pr#10611 <http://github.com/ceph/ceph/pull/10611>`_, Matt Benjamin)
-* rgw: add configurables for {data,meta} sync error injection (`pr#10388 <http://github.com/ceph/ceph/pull/10388>`_, Yehuda Sadeh)
-* rgw: add deadlock detection to RGWCoroutinesManager::run() (`pr#10032 <http://github.com/ceph/ceph/pull/10032>`_, Casey Bodley)
-* rgw: add lc_pool when decode or encode struct RGWZoneParams (`pr#10439 <http://github.com/ceph/ceph/pull/10439>`_, weiqiaomiao)
-* rgw: add missing master_zone when running with old default region config (`issue#16627 <http://tracker.ceph.com/issues/16627>`_, `pr#10205 <http://github.com/ceph/ceph/pull/10205>`_, Orit Wasserman)
-* rgw: add pg_ver to tombstone_cache (`pr#9851 <http://github.com/ceph/ceph/pull/9851>`_, Casey Bodley)
-* rgw: add reinit/rebind logic (ldap) (`pr#10532 <http://github.com/ceph/ceph/pull/10532>`_, Matt Benjamin)
-* rgw: add return value checking to avoid possible subsequent `parse` exception (`pr#10241 <http://github.com/ceph/ceph/pull/10241>`_, Yan Jun)
-* rgw: add suport for Swift-at-root dependent features of Swift API (`issue#16673 <http://tracker.ceph.com/issues/16673>`_, `pr#10280 <http://github.com/ceph/ceph/pull/10280>`_, Pritha Srivastava, Radoslaw Zarzynski)
-* rgw: add support for Static Website of Swift API (`pr#9844 <http://github.com/ceph/ceph/pull/9844>`_, Radoslaw Zarzynski)
-* rgw: add tenant support to multisite sync (`issue#16469 <http://tracker.ceph.com/issues/16469>`_, `pr#10075 <http://github.com/ceph/ceph/pull/10075>`_, Casey Bodley)
-* rgw: back off bucket sync on failures, don't store marker (`issue#16742 <http://tracker.ceph.com/issues/16742>`_, `pr#10355 <http://github.com/ceph/ceph/pull/10355>`_, Yehuda Sadeh)
-* rgw: better error message when user has no bucket created yet (`issue#16444 <http://tracker.ceph.com/issues/16444>`_, `pr#10162 <http://github.com/ceph/ceph/pull/10162>`_, Gaurav Kumar Garg)
-* rgw: clean-up in the authentication infrastructure (`pr#10212 <http://github.com/ceph/ceph/pull/10212>`_, Radoslaw Zarzynski)
-* rgw: clear realm watch on failed watch_restart (`issue#16817 <http://tracker.ceph.com/issues/16817>`_, `pr#10446 <http://github.com/ceph/ceph/pull/10446>`_, Casey Bodley)
-* rgw: collect skips a specific coroutine stack (`issue#16665 <http://tracker.ceph.com/issues/16665>`_, `pr#10274 <http://github.com/ceph/ceph/pull/10274>`_, Yehuda Sadeh)
-* rgw: cosmetic changes only--build verified, f23 (`pr#9931 <http://github.com/ceph/ceph/pull/9931>`_, Yan Jun)
-* rgw: delete region map after upgrade to zonegroup map (`issue#17051 <http://tracker.ceph.com/issues/17051>`_, `pr#10831 <http://github.com/ceph/ceph/pull/10831>`_, Casey Bodley)
-* rgw: do not try to encode or decode time_t and fix compiling warnings (`pr#10751 <http://github.com/ceph/ceph/pull/10751>`_, Kefu Chai)
-* rgw: don't fail if lost race when setting acls (`issue#16930 <http://tracker.ceph.com/issues/16930>`_, `pr#11286 <http://github.com/ceph/ceph/pull/11286>`_, Yehuda Sadeh)
-* rgw: drop create_bucket in fwd_request log message (`pr#10214 <http://github.com/ceph/ceph/pull/10214>`_, Abhishek Lekshmanan)
-* rgw: eradicate dynamic memory allocation in RGWPostObj. (`pr#11054 <http://github.com/ceph/ceph/pull/11054>`_, Radoslaw Zarzynski)
-* rgw: file setattr (`pr#8618 <http://github.com/ceph/ceph/pull/8618>`_, Matt Benjamin)
-* rgw: finish error_repo cr in stop_spawned_services() (`issue#16530 <http://tracker.ceph.com/issues/16530>`_, `pr#10031 <http://github.com/ceph/ceph/pull/10031>`_, Yehuda Sadeh)
-* rgw: fix RGWAccessControlPolicy_SWIFT::create return value check error (`issue#17090 <http://tracker.ceph.com/issues/17090>`_, `pr#10727 <http://github.com/ceph/ceph/pull/10727>`_, weiqiaomiao)
-* rgw: fix compilation (`pr#10252 <http://github.com/ceph/ceph/pull/10252>`_, Josh Durgin)
-* rgw: fix decoding of creation_time and last_update. (`issue#17167 <http://tracker.ceph.com/issues/17167>`_, `pr#11132 <http://github.com/ceph/ceph/pull/11132>`_, Orit Wasserman)
-* rgw: fix error_repo segfault in data sync (`issue#16603 <http://tracker.ceph.com/issues/16603>`_, `pr#10157 <http://github.com/ceph/ceph/pull/10157>`_, Casey Bodley)
-* rgw: fix failed to create bucket if a non-master zonegroup has a single zone (`pr#10991 <http://github.com/ceph/ceph/pull/10991>`_, weiqiaomiao)
-* rgw: fix flush_read_list() error msg (`pr#10749 <http://github.com/ceph/ceph/pull/10749>`_, Jiaying Ren)
-* rgw: fix for issue 16494 (`issue#16494 <http://tracker.ceph.com/issues/16494>`_, `pr#10077 <http://github.com/ceph/ceph/pull/10077>`_, Yehuda Sadeh)
-* rgw: fix for s3tests failure when ldap auth is not applied (`pr#10669 <http://github.com/ceph/ceph/pull/10669>`_, Casey Bodley)
-* rgw: fix get object instance  returned NoSuchKey error (`issue#17111 <http://tracker.ceph.com/issues/17111>`_, `pr#10820 <http://github.com/ceph/ceph/pull/10820>`_, Yang Honggang)
-* rgw: fix is_admin handling in RGWLDAPAuthEngine and introduce acct_privilege_t (`pr#10687 <http://github.com/ceph/ceph/pull/10687>`_, Radoslaw Zarzynski)
-* rgw: fix issue 16435 (`issue#16435 <http://tracker.ceph.com/issues/16435>`_, `pr#10193 <http://github.com/ceph/ceph/pull/10193>`_, Yehuda Sadeh)
-* rgw: fix multi-delete query param parsing. (`issue#16618 <http://tracker.ceph.com/issues/16618>`_, `pr#10187 <http://github.com/ceph/ceph/pull/10187>`_, Robin H. Johnson)
-* rgw: fix period update --commit return error (`issue#17110 <http://tracker.ceph.com/issues/17110>`_, `pr#10836 <http://github.com/ceph/ceph/pull/10836>`_, weiqiaomiao)
-* rgw: fix radosgw daemon core when reopen logs (`issue#17036 <http://tracker.ceph.com/issues/17036>`_, `pr#10737 <http://github.com/ceph/ceph/pull/10737>`_, weiqiaomiao)
-* rgw: fix regression with handling double underscore (`issue#16856 <http://tracker.ceph.com/issues/16856>`_, `pr#10939 <http://github.com/ceph/ceph/pull/10939>`_, Orit Wasserman)
-* rgw: fix rgw_bucket_dir_entry decode v (`pr#10918 <http://github.com/ceph/ceph/pull/10918>`_, Tianshan Qu)
-* rgw: fix the error return variable in log message and cleanups (`pr#10138 <http://github.com/ceph/ceph/pull/10138>`_, Yan Jun)
-* rgw: fix the missing return value (`pr#10122 <http://github.com/ceph/ceph/pull/10122>`_, Yan Jun)
-* rgw: fix upgrade from old multisite to new multisite configuration (`issue#16751 <http://tracker.ceph.com/issues/16751>`_, `pr#10368 <http://github.com/ceph/ceph/pull/10368>`_, Orit Wasserman)
-* rgw: fix wrong  variable definition in cls_version_check func (`pr#10233 <http://github.com/ceph/ceph/pull/10233>`_, weiqiaomiao)
-* rgw: fix wrong variable definition in rgw_cls_lc_set_entry function (`pr#10408 <http://github.com/ceph/ceph/pull/10408>`_, weiqiaomiao)
-* rgw: for the create_bucket api, if the input creation_time is zero, we should set it to 'now" (`issue#16597 <http://tracker.ceph.com/issues/16597>`_, `pr#10118 <http://github.com/ceph/ceph/pull/10118>`_, weiqiaomiao)
-* rgw: kill a compile warning for rgw_sync (`pr#10425 <http://github.com/ceph/ceph/pull/10425>`_, Casey Bodley, Abhishek Lekshmanan)
-* rgw: lgtm (`pr#9941 <http://github.com/ceph/ceph/pull/9941>`_, weiqiaomiao)
-* rgw: lgtm (build verified, f23) (`pr#9754 <http://github.com/ceph/ceph/pull/9754>`_, John Coyle)
-* rgw: lgtm, build verified f23 (`pr#10035 <http://github.com/ceph/ceph/pull/10035>`_, Yan Jun)
-* rgw: lgtm--build verified, f23 (`pr#10002 <http://github.com/ceph/ceph/pull/10002>`_, Yan Jun)
-* rgw: lgtm--build verified, f23 (`pr#9985 <http://github.com/ceph/ceph/pull/9985>`_, Yan Jun)
-* rgw: lgtm--should backport (`pr#9979 <http://github.com/ceph/ceph/pull/9979>`_, Yan Jun)
-* rgw: log mp upload failures due to parts mismatch (`pr#10424 <http://github.com/ceph/ceph/pull/10424>`_, Abhishek Lekshmanan)
-* rgw: merge setting flags operation together and cleanups (`pr#10203 <http://github.com/ceph/ceph/pull/10203>`_, Yan Jun)
-* rgw: miscellaneous cleanups (`pr#10299 <http://github.com/ceph/ceph/pull/10299>`_, Yan Jun)
-* rgw: multiple fixes for Swift's object expiration (`issue#16705 <http://tracker.ceph.com/issues/16705>`_, `issue#16684 <http://tracker.ceph.com/issues/16684>`_, `pr#10330 <http://github.com/ceph/ceph/pull/10330>`_, Radoslaw Zarzynski)
-* rgw: need to 'open_object_section' before dump stats in 'RGWGetUsage\_… (`issue#17499 <http://tracker.ceph.com/issues/17499>`_, `pr#11325 <http://github.com/ceph/ceph/pull/11325>`_, weiqiaomiao)
-* rgw: obsolete 'radosgw-admin period prepare' command (`issue#17387 <http://tracker.ceph.com/issues/17387>`_, `pr#11278 <http://github.com/ceph/ceph/pull/11278>`_, Gaurav Kumar Garg)
-* rgw: radosgw-admin: add "--orphan-stale-secs" to --help (`issue#17280 <http://tracker.ceph.com/issues/17280>`_, `pr#11098 <http://github.com/ceph/ceph/pull/11098>`_, Ken Dreyer)
-* rgw: radosgw-admin: zone[group] modify can change realm id (`issue#16839 <http://tracker.ceph.com/issues/16839>`_, `pr#10477 <http://github.com/ceph/ceph/pull/10477>`_, Casey Bodley)
-* rgw: raise log levels for common radosgw-admin errors (`issue#16935 <http://tracker.ceph.com/issues/16935>`_, `pr#10602 <http://github.com/ceph/ceph/pull/10602>`_, Shilpa Jagannath)
-* rgw: register the correct handler for cls_user_complete_stats (`issue#16624 <http://tracker.ceph.com/issues/16624>`_, `pr#10151 <http://github.com/ceph/ceph/pull/10151>`_, Orit Wasserman)
-* rgw: remove bucket index objects when deleting the bucket (`issue#16412 <http://tracker.ceph.com/issues/16412>`_, `pr#10120 <http://github.com/ceph/ceph/pull/10120>`_, Orit Wasserman)
-* rgw: remove possible duplicate setting (`pr#10110 <http://github.com/ceph/ceph/pull/10110>`_, Yan Jun)
-* rgw: remove the field ret from class RGWPutLC (`pr#10726 <http://github.com/ceph/ceph/pull/10726>`_, weiqiaomiao)
-* rgw: remove unused bufferlist variable (`pr#10194 <http://github.com/ceph/ceph/pull/10194>`_, Yan Jun)
-* rgw: remove unused realm from radosgw-admin zone modify (`issue#16632 <http://tracker.ceph.com/issues/16632>`_, `pr#10211 <http://github.com/ceph/ceph/pull/10211>`_, Orit Wasserman)
-* rgw: remove unused variables (`pr#10589 <http://github.com/ceph/ceph/pull/10589>`_, Yan Jun)
-* rgw: return "NoSuchLifecycleConfiguration" if lifecycle config does not exist (`pr#10442 <http://github.com/ceph/ceph/pull/10442>`_, weiqiaomiao)
-* rgw: revert a commit that broke s3 signature validation (`issue#17279 <http://tracker.ceph.com/issues/17279>`_, `pr#11102 <http://github.com/ceph/ceph/pull/11102>`_, Casey Bodley)
-* rgw: rgw file: remove busy-wait in RGWLibFS::gc() (`pr#10638 <http://github.com/ceph/ceph/pull/10638>`_, Matt Benjamin)
-* rgw: rgw ldap:  protect rgw::from_base64 from non-base64 input (`pr#10777 <http://github.com/ceph/ceph/pull/10777>`_, Matt Benjamin)
-* rgw: rgw ldap: enforce simple_bind w/LDAPv3 (`pr#10593 <http://github.com/ceph/ceph/pull/10593>`_, Matt Benjamin)
-* rgw: rgw multisite: RGWCoroutinesManager::run returns status of last cr (`issue#17047 <http://tracker.ceph.com/issues/17047>`_, `pr#10778 <http://github.com/ceph/ceph/pull/10778>`_, Casey Bodley)
-* rgw: rgw multisite: RGWDataSyncCR fails on errors from RGWListBucketIndexesCR (`issue#17073 <http://tracker.ceph.com/issues/17073>`_, `pr#10779 <http://github.com/ceph/ceph/pull/10779>`_, Casey Bodley)
-* rgw: rgw multisite: fix for assertion in RGWMetaSyncCR (`issue#17044 <http://tracker.ceph.com/issues/17044>`_, `pr#10743 <http://github.com/ceph/ceph/pull/10743>`_, Casey Bodley)
-* rgw: rgw multisite: fixes for period puller (`issue#16939 <http://tracker.ceph.com/issues/16939>`_, `pr#10596 <http://github.com/ceph/ceph/pull/10596>`_, Casey Bodley)
-* rgw: rgw multisite: trim data logs as peer zones catch up (`pr#10372 <http://github.com/ceph/ceph/pull/10372>`_, Casey Bodley)
-* rgw: rgw nfs v3 completions (`pr#10745 <http://github.com/ceph/ceph/pull/10745>`_, Matt Benjamin)
-* rgw: rgw-admin: allow unsetting user's email (`issue#13286 <http://tracker.ceph.com/issues/13286>`_, `pr#11340 <http://github.com/ceph/ceph/pull/11340>`_, Yehuda Sadeh, Weijun Duan)
-* rgw: rgw/admin: fix some return values and indents (`pr#9170 <http://github.com/ceph/ceph/pull/9170>`_, Yan Jun)
-* rgw: rgw/rados: remove confused error printout (`pr#9351 <http://github.com/ceph/ceph/pull/9351>`_, Yan Jun)
-* rgw: rgw/rgw_common.cc: modify the end check in RGWHTTPArgs::sys_get (`pr#9136 <http://github.com/ceph/ceph/pull/9136>`_, zhao kun)
-* rgw: rgw/rgw_lc.cc: fix sleep time according to the error message (`pr#10930 <http://github.com/ceph/ceph/pull/10930>`_, Weibing Zhang)
-* rgw: rgw/rgw_main: fix unnecessary variables defined (`pr#10475 <http://github.com/ceph/ceph/pull/10475>`_, zhang.zezhu)
-* rgw: rgw/swift: remove redundant assignment operation (`pr#11292 <http://github.com/ceph/ceph/pull/11292>`_, Yan Jun)
-* rgw: rgw_file:  pre-assign times (`issue#17367 <http://tracker.ceph.com/issues/17367>`_, `pr#11181 <http://github.com/ceph/ceph/pull/11181>`_, Matt Benjamin)
-* rgw: rgw_file: fix rename cases and unify unlink (`pr#10271 <http://github.com/ceph/ceph/pull/10271>`_, Matt Benjamin)
-* rgw: rgw_file: fix set_attrs operation (`pr#11159 <http://github.com/ceph/ceph/pull/11159>`_, Matt Benjamin)
-* rgw: rgw_file: refuse partial, out-of-order writes (`pr#10284 <http://github.com/ceph/ceph/pull/10284>`_, Matt Benjamin)
-* rgw: rgw_file: restore local definition of RGWLibFS gc interval (`pr#10756 <http://github.com/ceph/ceph/pull/10756>`_, Matt Benjamin)
-* rgw: rgw_file: unlock() must precede out label (`pr#10635 <http://github.com/ceph/ceph/pull/10635>`_, Matt Benjamin)
-* rgw: right parenthesis is missing in radosgw-admin help message on caps (`pr#10947 <http://github.com/ceph/ceph/pull/10947>`_, Weibing Zhang)
-* rgw: set correct instance on the object (`issue#17443 <http://tracker.ceph.com/issues/17443>`_, `pr#11270 <http://github.com/ceph/ceph/pull/11270>`_, Yehuda Sadeh)
-* rgw: store oldest mdlog period in rados (`issue#16894 <http://tracker.ceph.com/issues/16894>`_, `pr#10558 <http://github.com/ceph/ceph/pull/10558>`_, Casey Bodley)
-* rgw: test/multi.py add a destructive attr to tests (`pr#10401 <http://github.com/ceph/ceph/pull/10401>`_, Abhishek Lekshmanan)
-* rgw: test/rgw: add --gateways-per-zone to test_multi.py (`pr#10742 <http://github.com/ceph/ceph/pull/10742>`_, Casey Bodley)
-* rgw: test_multi.py avoid creating mds (`pr#10174 <http://github.com/ceph/ceph/pull/10174>`_, Abhishek Lekshmanan)
-* rgw: test_rgw_bencode: null terminate strings before checking (`issue#16861 <http://tracker.ceph.com/issues/16861>`_, `pr#10510 <http://github.com/ceph/ceph/pull/10510>`_, Yehuda Sadeh)
-* rgw: use endpoints from master zone instead of zonegroup (`issue#16834 <http://tracker.ceph.com/issues/16834>`_, `pr#10456 <http://github.com/ceph/ceph/pull/10456>`_, Casey Bodley)
-* rgw: use the standard usage of string.find (`pr#10226 <http://github.com/ceph/ceph/pull/10226>`_, Yan Jun)
-* rgw: verfied:  f23, subset of s3tests (`pr#10448 <http://github.com/ceph/ceph/pull/10448>`_, Pritha Srivastava)
-* rgw: verified (`pr#10000 <http://github.com/ceph/ceph/pull/10000>`_, weiqiaomiao)
-* rgw: verified non-regression (MS AD) (`pr#10597 <http://github.com/ceph/ceph/pull/10597>`_, Pritha Srivastava)
-* rgw: verified:  autobuild (`issue#16928 <http://tracker.ceph.com/issues/16928>`_, `pr#10579 <http://github.com/ceph/ceph/pull/10579>`_, Robin H. Johnson)
-* rgw: verified: MS AD (`pr#10307 <http://github.com/ceph/ceph/pull/10307>`_, Pritha Srivastava)
-* rgw: verified: f23 (`pr#10882 <http://github.com/ceph/ceph/pull/10882>`_, Michal Jarzabek)
-* rgw: verified: f23 (`pr#10858 <http://github.com/ceph/ceph/pull/10858>`_, Weibing Zhang)
-* rgw: verified: f23 (`pr#10822 <http://github.com/ceph/ceph/pull/10822>`_, Yan Jun)
-* rgw: verified: f23 (`pr#10929 <http://github.com/ceph/ceph/pull/10929>`_, Weibing Zhang)
-* rgw: wip: rgw multisite: preserve zone's extra pool (`issue#16712 <http://tracker.ceph.com/issues/16712>`_, `pr#10397 <http://github.com/ceph/ceph/pull/10397>`_, Abhishek Lekshmanan)
-* rgw: work around curl_multi_wait bug with non-blocking reads (`issue#15915 <http://tracker.ceph.com/issues/15915>`_, `issue#16695 <http://tracker.ceph.com/issues/16695>`_, `pr#10998 <http://github.com/ceph/ceph/pull/10998>`_, Casey Bodley)
-* rgw:add a s3 API of make torrent for a object (`pr#10396 <http://github.com/ceph/ceph/pull/10396>`_, zhouruisong)
-* rgw:add a s3 API of make torrent for a object (`pr#9589 <http://github.com/ceph/ceph/pull/9589>`_, zhouruisong)
-* rgw:bucket check remove _multipart_ prefix (`pr#6501 <http://github.com/ceph/ceph/pull/6501>`_, Weijun Duan)
-* rgw:clean unuse bufferlist (`pr#10232 <http://github.com/ceph/ceph/pull/10232>`_, weiqiaomiao)
-* rgw:fix rgw boot failed after upgrade to master latest version (`pr#10409 <http://github.com/ceph/ceph/pull/10409>`_, weiqiaomiao)
-* rgw:lifecycle feature [rebased] (`pr#9737 <http://github.com/ceph/ceph/pull/9737>`_, Ji Chen, Daniel Gryniewicz)
-* rgw: rgw/rgw_rados.h: remove unneeded class C_Tick (`pr#10954 <http://github.com/ceph/ceph/pull/10954>`_, Michal Jarzabek)
-* rgw: ext_mime_map_init add string describing for error number (`pr#9807 <http://github.com/ceph/ceph/pull/9807>`_, Yan Jun)
-* tests: Add test for global static non-POD segfault (`pr#10486 <http://github.com/ceph/ceph/pull/10486>`_, Brad Hubbard)
-* tests: populate /dev/disk/by-partuuid for scsi_debug (`issue#17100 <http://tracker.ceph.com/issues/17100>`_, `pr#10824 <http://github.com/ceph/ceph/pull/10824>`_, Loic Dachary)
-* tests: use a fixture for memstore clone testing (`pr#11190 <http://github.com/ceph/ceph/pull/11190>`_, Kefu Chai)
-* tests: run-\*make-check.sh: Make DRY_RUN actually mean a dry run (`pr#11074 <http://github.com/ceph/ceph/pull/11074>`_, Brad Hubbard)
-* tests: run-cmake-check.sh: Actually run the tests (`pr#11075 <http://github.com/ceph/ceph/pull/11075>`_, Brad Hubbard)
-* tests: run-cmake-check.sh: Init submodules (`pr#11091 <http://github.com/ceph/ceph/pull/11091>`_, Brad Hubbard)
-* tests: run-make-check.sh: Make DRY_RUN actually do a dry run (`pr#11092 <http://github.com/ceph/ceph/pull/11092>`_, Brad Hubbard)
-* tests: run-make-check.sh: pass args to do_cmake.sh (`pr#10701 <http://github.com/ceph/ceph/pull/10701>`_, John Coyle)
-* tests: unittest_chain_xattr: account for existing xattrs (`issue#16025 <http://tracker.ceph.com/issues/16025>`_, `pr#11109 <http://github.com/ceph/ceph/pull/11109>`_, Dan Mick)
-* tests: src/test/cli/* tests: POSIX Convert grep -P to grep -E (`pr#10319 <http://github.com/ceph/ceph/pull/10319>`_, Willem Jan Withagen)
-* test: ceph_test_msgr: fix circular locking dependency (`issue#16955 <http://tracker.ceph.com/issues/16955>`_, `pr#10612 <http://github.com/ceph/ceph/pull/10612>`_, Kefu Chai)
-* test: cli/crushtool: fix the test of compile-decompile-recompile.t (`issue#17306 <http://tracker.ceph.com/issues/17306>`_, `pr#11173 <http://github.com/ceph/ceph/pull/11173>`_, Kefu Chai)
-* test: libcephfs: fix gcc sys/fcntl.h warnings (`pr#10126 <http://github.com/ceph/ceph/pull/10126>`_, John Coyle)
-* test: librados: rados_connect() should succeed (`issue#17087 <http://tracker.ceph.com/issues/17087>`_, `pr#10806 <http://github.com/ceph/ceph/pull/10806>`_, Kefu Chai)
-* test: mds: add fs dump in test_ceph_argparse.py (`pr#10347 <http://github.com/ceph/ceph/pull/10347>`_, huanwen ren)
-* test: simple_dispatcher.cc: remove unused variable (`pr#9932 <http://github.com/ceph/ceph/pull/9932>`_, Michal Jarzabek)
-* test: store_test: tidy-up SyntheticWorkloadState class  (`pr#10775 <http://github.com/ceph/ceph/pull/10775>`_, xie xingguo)
-* test: More portable use of mmap(MAP_ANON) (`pr#10557 <http://github.com/ceph/ceph/pull/10557>`_, Willem Jan Withagen)
-* test: Removeall merged after print_function commit needs a fix (`pr#10535 <http://github.com/ceph/ceph/pull/10535>`_, David Zafman)
-* test: ceph-disk.sh do not kill all daemons (`issue#16729 <http://tracker.ceph.com/issues/16729>`_, `pr#10346 <http://github.com/ceph/ceph/pull/10346>`_, Kefu Chai)
-* test: cephtool/test.sh: fix expect_false() calls (`pr#10133 <http://github.com/ceph/ceph/pull/10133>`_, Kefu Chai)
-* test: fix usage info of omapbench (`pr#10089 <http://github.com/ceph/ceph/pull/10089>`_, Wanlong Gao)
-* test: remove ceph_test_rados_api_tmap_migrate (`issue#16144 <http://tracker.ceph.com/issues/16144>`_, `pr#10256 <http://github.com/ceph/ceph/pull/10256>`_, Kefu Chai)
-* test: test_{compression_plugin,async_compressor}: do not copy plugins (`pr#10153 <http://github.com/ceph/ceph/pull/10153>`_, Kefu Chai)
-* test: test_rados_tool.sh: Make script work under ctest (`pr#10166 <http://github.com/ceph/ceph/pull/10166>`_, Willem Jan Withagen)
-* test: qa/workunits/cephtool/test.sh: fix omission of ceph-command (`pr#10979 <http://github.com/ceph/ceph/pull/10979>`_, Willem Jan Withagen)
-* test: qa/workunits/cephtool/test.sh: s/TMPDIR/TEMP_DIR/ (`pr#10306 <http://github.com/ceph/ceph/pull/10306>`_, Kefu Chai)
-* test: qa/workunits/cephtool/test.sh: use absolute path for TEMP_DIR (`pr#10430 <http://github.com/ceph/ceph/pull/10430>`_, Kefu Chai)
-* tools: New "removeall" used to remove head with snapshots (`pr#10098 <http://github.com/ceph/ceph/pull/10098>`_, David Zafman)
-* tools: do not closed stdout ; fix overload of "<" operator (`pr#9290 <http://github.com/ceph/ceph/pull/9290>`_, xie xingguo)
-* tools: fix the core dump when get the crushmap do not exist (`pr#10451 <http://github.com/ceph/ceph/pull/10451>`_, song baisen)
-* tools: rebuild monstore (`issue#17179 <http://tracker.ceph.com/issues/17179>`_, `pr#10933 <http://github.com/ceph/ceph/pull/10933>`_, Kefu Chai)
-* tools: use TextTable for "rados df" plain output (`pr#9362 <http://github.com/ceph/ceph/pull/9362>`_, xie xingguo)
-* tools: fio engine for objectstore (`pr#10267 <http://github.com/ceph/ceph/pull/10267>`_, Casey Bodley, Igor Fedotov, Daniel Gollub)
-* tools: rados/client: fix typo (`pr#10493 <http://github.com/ceph/ceph/pull/10493>`_, Yan Jun)
-* tools: rados/client: fix waiting on the condition variable more efficient. (`pr#9939 <http://github.com/ceph/ceph/pull/9939>`_, Yan Jun)
-* tools: tools/rebuild_mondb: kill comipling warning and other fixes (`pr#11117 <http://github.com/ceph/ceph/pull/11117>`_, xie xingguo)
-* tools: authtool: Enhance argument combinations validation (`issue#2904 <http://tracker.ceph.com/issues/2904>`_, `pr#9704 <http://github.com/ceph/ceph/pull/9704>`_, Brad Hubbard)
-* tools: ceph-disk: change ownership of initfile to ceph:ceph (`issue#16280 <http://tracker.ceph.com/issues/16280>`_, `pr#9688 <http://github.com/ceph/ceph/pull/9688>`_, Shylesh Kumar)
-* test: ceph_test_rados_api_tmap_migrate: remove test for tmap_upgrade (`pr#10234 <http://github.com/ceph/ceph/pull/10234>`_, Kefu Chai)
diff --git a/ceph/doc/releases/luminous.rst b/ceph/doc/releases/luminous.rst
deleted file mode 100644 (file)
index 3d01d71..0000000
+++ /dev/null
@@ -1,5552 +0,0 @@
-========
-Luminous
-========
-
-Luminous is the 12th stable release of Ceph.  It is named after the
-luminous squid (watasenia scintillans, aka firefly squid).
-
-v12.2.13 Luminous
-=================
-
-This is the 13th bug fix release of the Luminous v12.2.x long term stable
-release series. We recommend that all users upgrade to this release.
-
-Notable Changes
----------------
-
-* Ceph now packages python bindings for python3.6 instead of
-  python3.4, because EPEL7 recently switched from python3.4 to
-  python3.6 as the native python3. see the `announcement <https://lists.fedoraproject.org/archives/list/epel-announce@lists.fedoraproject.org/message/EGUMKAIMPK2UD5VSHXM53BH2MBDGDWMO/>_`
-  for more details on the background of this change.
-
-* We now have telemetry support via a ceph-mgr module. The telemetry module is
-  absolutely on an opt-in basis, and is meant to collect generic cluster
-  information and push it to a central endpoint. By default, we're pushing it
-  to a project endpoint at https://telemetry.ceph.com/report, but this is
-  customizable using by setting the 'url' config option with::
-
-    ceph telemetry config-set url '<your url>'
-
-  You will have to opt-in on sharing your information with::
-
-    ceph telemetry on
-
-  You can view exactly what information will be reported first with::
-
-    ceph telemetry show
-
-  Should you opt-in, your information will be licensed under the
-  Community Data License Agreement - Sharing - Version 1.0, which you can
-  read at https://cdla.io/sharing-1-0/
-
-  The telemetry module reports information about CephFS file systems,
-  including:
-
-    - how many MDS daemons (in total and per file system)
-    - which features are (or have been) enabled
-    - how many data pools
-    - approximate file system age (year + month of creation)
-    - how much metadata is being cached per file system
-
-  As well as:
-
-    - whether IPv4 or IPv6 addresses are used for the monitors
-    - whether RADOS cache tiering is enabled (and which mode)
-    - whether pools are replicated or erasure coded, and
-      which erasure code profile plugin and parameters are in use
-    - how many RGW daemons, zones, and zonegroups are present; which RGW frontends are in use
-    - aggregate stats about the CRUSH map, like which algorithms are used, how
-      big buckets are, how many rules are defined, and what tunables are in use
-
-* A health warning is now generated if the average osd heartbeat ping
-  time exceeds a configurable threshold for any of the intervals
-  computed.  The OSD computes 1 minute, 5 minute and 15 minute
-  intervals with average, minimum and maximum values.  New configuration
-  option ``mon_warn_on_slow_ping_ratio`` specifies a percentage of
-  ``osd_heartbeat_grace`` to determine the threshold.  A value of zero
-  disables the warning.  New configuration option
-  ``mon_warn_on_slow_ping_time`` specified in milliseconds over-rides the
-  computed value, causes a warning
-  when OSD heartbeat pings take longer than the specified amount.
-  New admin command ``ceph daemon mgr.# dump_osd_network [threshold]`` command will
-  list all connections with a ping time longer than the specified threshold or
-  value determined by the config options, for the average for any of the 3 intervals.
-  New admin command ``ceph daemon osd.# dump_osd_network [threshold]`` will
-  do the same but only including heartbeats initiated by the specified OSD.
-
-* The configuration value ``osd_calc_pg_upmaps_max_stddev`` used for upmap
-  balancing has been removed. Instead use the mgr balancer config
-  ``upmap_max_deviation`` which now is an integer number of PGs of deviation
-  from the target PGs per OSD.  This can be set with a command like
-  ``ceph config set mgr mgr/balancer/upmap_max_deviation 2``.  The default
-  ``upmap_max_deviation`` is 1.  There are situations where crush rules
-  would not allow a pool to ever have completely balanced PGs.  For example, if
-  crush requires 1 replica on each of 3 racks, but there are fewer OSDs in 1 of
-  the racks.  In those cases, the configuration value can be increased.
-
-Changelog
----------
-
-* bluestore: >2GB bluefs writes (`pr#28965 <https://github.com/ceph/ceph/pull/28965>`_, kungf, Kefu Chai, Sage Weil)
-* bluestore: Inspect allocations (`pr#29539 <https://github.com/ceph/ceph/pull/29539>`_, Neha Ojha, Adam Kupczyk)
-* bluestore: [AFTER: #28644] luminous: os/bluestore: default to bitmap allocator for bluestore/bluefs (`pr#28972 <https://github.com/ceph/ceph/pull/28972>`_, Igor Fedotov)
-* bluestore: add bluestore_ignore_data_csum option (`pr#26247 <https://github.com/ceph/ceph/pull/26247>`_, Sage Weil)
-* bluestore: apply shared_alloc_size to shared device with log level change (`pr#29910 <https://github.com/ceph/ceph/pull/29910>`_, Vikhyat Umrao, Josh Durgin, Igor Fedotov, Sage Weil)
-* bluestore: avoid length overflow in extents returned by Stupid Alloc (`issue#40703 <http://tracker.ceph.com/issues/40703>`_, `pr#29025 <https://github.com/ceph/ceph/pull/29025>`_, Igor Fedotov)
-* bluestore: call fault_range properly prior to looking for blob to … (`pr#27529 <https://github.com/ceph/ceph/pull/27529>`_, Igor Fedotov)
-* bluestore: common/options: Set concurrent bluestore rocksdb compactions to 2 (`pr#30149 <https://github.com/ceph/ceph/pull/30149>`_, Mark Nelson)
-* bluestore: dump before "no spanning blob id" abort (`pr#28030 <https://github.com/ceph/ceph/pull/28030>`_, Igor Fedotov)
-* bluestore: fix assertion in StupidAllocator::get_fragmentation (`pr#32523 <https://github.com/ceph/ceph/pull/32523>`_, Lei Liu, Igor Fedotov)
-* bluestore: fix duplicate allocations in bmap allocator (`issue#40080 <http://tracker.ceph.com/issues/40080>`_, `pr#28644 <https://github.com/ceph/ceph/pull/28644>`_, Igor Fedotov)
-* bluestore: fix improper setting of STATE_KV_SUBMITTED (`pr#31674 <https://github.com/ceph/ceph/pull/31674>`_, Igor Fedotov)
-* bluestore: fix length overflow (`issue#39247 <http://tracker.ceph.com/issues/39247>`_, `pr#27365 <https://github.com/ceph/ceph/pull/27365>`_, Jianpeng Ma)
-* bluestore: fix out-of-bound access in bmap allocator (`pr#27739 <https://github.com/ceph/ceph/pull/27739>`_, Igor Fedotov)
-* bluestore: load OSD all compression settings unconditionally (`issue#40480 <http://tracker.ceph.com/issues/40480>`_, `pr#28895 <https://github.com/ceph/ceph/pull/28895>`_, Igor Fedotov)
-* bluestore: os/bluestore/BitmapFreelistManager: disable bluestore_debug_freelist (`pr#27459 <https://github.com/ceph/ceph/pull/27459>`_, Sage Weil)
-* bluestore: os/bluestore_tool: bluefs-bdev-expand: indicate bypassed for main dev (`pr#27912 <https://github.com/ceph/ceph/pull/27912>`_, Igor Fedotov)
-* bluestore: test/store_test: fix/workaround for BlobReuseOnOverwriteUT and garbageCollection (`pr#27056 <https://github.com/ceph/ceph/pull/27056>`_, Igor Fedotov)
-* build/ops: admin/build-doc: use python3 (`pr#30665 <https://github.com/ceph/ceph/pull/30665>`_, Kefu Chai, Jason Dillaman)
-* build/ops: admin/build-doc: use python3 (follow-on fix) (`pr#30690 <https://github.com/ceph/ceph/pull/30690>`_, Nathan Cutler)
-* build/ops: backport miscellaneous install-deps.sh and ceph.spec.in fixes from master (`issue#13997 <http://tracker.ceph.com/issues/13997>`_, `issue#37707 <http://tracker.ceph.com/issues/37707>`_, `issue#18163 <http://tracker.ceph.com/issues/18163>`_, `issue#22998 <http://tracker.ceph.com/issues/22998>`_, `pr#30722 <https://github.com/ceph/ceph/pull/30722>`_, Yao Guotao, Tomasz Setkowski, Andrey Parfenov, Alfredo Deza, Kefu Chai, Nathan Cutler, Yunchuan Wen, Zack Cerza, Brad Hubbard, Loic Dachary)
-* build/ops: ceph-test RPM not built for SUSE (`pr#29736 <https://github.com/ceph/ceph/pull/29736>`_, Nathan Cutler)
-* build/ops: cmake: pass -march to detect compiler support of arm64 crc/crypto (`issue#36080 <http://tracker.ceph.com/issues/36080>`_, `issue#17516 <http://tracker.ceph.com/issues/17516>`_, `pr#24169 <https://github.com/ceph/ceph/pull/24169>`_, Kefu Chai)
-* build/ops: do_cmake.sh: source not found (`issue#40004 <http://tracker.ceph.com/issues/40004>`_, `issue#39981 <http://tracker.ceph.com/issues/39981>`_, `pr#28216 <https://github.com/ceph/ceph/pull/28216>`_, Nathan Cutler)
-* build/ops: install-deps.sh: Remove CR repo (`issue#13997 <http://tracker.ceph.com/issues/13997>`_, `pr#30129 <https://github.com/ceph/ceph/pull/30129>`_, Brad Hubbard, Alfredo Deza)
-* build/ops: python-cephfs should depend on python-rados (`issue#37612 <http://tracker.ceph.com/issues/37612>`_, `issue#24918 <http://tracker.ceph.com/issues/24918>`_, `pr#27950 <https://github.com/ceph/ceph/pull/27950>`_, Kefu Chai)
-* build/ops: python3-cephfs should provide python36-cephfs (`pr#30981 <https://github.com/ceph/ceph/pull/30981>`_, Kefu Chai)
-* build/ops: rpm: Build with lttng on openSUSE (`issue#39332 <http://tracker.ceph.com/issues/39332>`_, `pr#27618 <https://github.com/ceph/ceph/pull/27618>`_, Nathan Cutler)
-* build/ops: rpm: explicitly declare python-tox build dependency (`pr#31934 <https://github.com/ceph/ceph/pull/31934>`_, Nathan Cutler)
-* ceph-volume: assume msgrV1 for all branches containing mimic (`pr#32796 <https://github.com/ceph/ceph/pull/32796>`_, Jan Fajerski)
-* ceph-volume: batch functional idempotency test fails since message is now on stderr (`pr#29791 <https://github.com/ceph/ceph/pull/29791>`_, Jan Fajerski)
-* ceph-volume: broken assertion errors after pytest changes (`pr#28929 <https://github.com/ceph/ceph/pull/28929>`_, Alfredo Deza)
-* ceph-volume: do not fail when trying to remove crypt mapper (`pr#30556 <https://github.com/ceph/ceph/pull/30556>`_, Guillaume Abrioux)
-* ceph-volume: does not recognize wal/db partitions created by ceph-disk (`pr#29462 <https://github.com/ceph/ceph/pull/29462>`_, Jan Fajerski)
-* ceph-volume: fix stderr failure to decode/encode when redirected (`pr#30299 <https://github.com/ceph/ceph/pull/30299>`_, Alfredo Deza)
-* ceph-volume: fix warnings raised by pytest (`pr#30677 <https://github.com/ceph/ceph/pull/30677>`_, Rishabh Dave)
-* ceph-volume: lvm list is O(n^2) (`pr#30094 <https://github.com/ceph/ceph/pull/30094>`_, Rishabh Dave)
-* ceph-volume: lvm.activate: Return an error if WAL/DB devices absent (`pr#29038 <https://github.com/ceph/ceph/pull/29038>`_, David Casier)
-* ceph-volume: lvm.zap fix cleanup for db partitions (`issue#40664 <http://tracker.ceph.com/issues/40664>`_, `pr#30302 <https://github.com/ceph/ceph/pull/30302>`_, Dominik Csapak)
-* ceph-volume: missing string substitution when reporting mounts (`issue#40978 <http://tracker.ceph.com/issues/40978>`_, `pr#29351 <https://github.com/ceph/ceph/pull/29351>`_, Shyukri Shyukriev)
-* ceph-volume: pre-install python-apt and its variants before test runs (`pr#30296 <https://github.com/ceph/ceph/pull/30296>`_, Alfredo Deza)
-* ceph-volume: prints errors to stdout with --format json (`issue#38548 <http://tracker.ceph.com/issues/38548>`_, `pr#29508 <https://github.com/ceph/ceph/pull/29508>`_, Jan Fajerski)
-* ceph-volume: prints log messages to stdout (`pr#29603 <https://github.com/ceph/ceph/pull/29603>`_, Jan Fajerski, Kefu Chai, Alfredo Deza)
-* ceph-volume: set a lvm_size property on the fakedevice fixture (`pr#30331 <https://github.com/ceph/ceph/pull/30331>`_, Andrew Schoen)
-* ceph-volume: simple: when 'type' file is not present activate fails (`pr#29415 <https://github.com/ceph/ceph/pull/29415>`_, Alfredo Deza)
-* ceph-volume: tests add a sleep in tox for slow OSDs after booting (`pr#28927 <https://github.com/ceph/ceph/pull/28927>`_, Alfredo Deza)
-* ceph-volume: tests set the noninteractive flag for Debian (`pr#29901 <https://github.com/ceph/ceph/pull/29901>`_, Alfredo Deza)
-* ceph-volume: update testing playbook 'deploy.yml' (`pr#29075 <https://github.com/ceph/ceph/pull/29075>`_, Andrew Schoen, Guillaume Abrioux)
-* ceph-volume: use the Device.rotational property instead of sys_api (`pr#28519 <https://github.com/ceph/ceph/pull/28519>`_, Andrew Schoen)
-* ceph-volume: use the OSD identifier when reporting success (`pr#29771 <https://github.com/ceph/ceph/pull/29771>`_, Alfredo Deza)
-* ceph-volume: zap always skips block.db, leaves them around (`issue#40664 <http://tracker.ceph.com/issues/40664>`_, `pr#30305 <https://github.com/ceph/ceph/pull/30305>`_, Alfredo Deza)
-* cephfs: client: _readdir_cache_cb() may use the readdir_cache already clear (`issue#41148 <http://tracker.ceph.com/issues/41148>`_, `pr#30934 <https://github.com/ceph/ceph/pull/30934>`_, huanwen ren)
-* cephfs: client: ceph.dir.rctime xattr value incorrectly prefixes 09 to the nanoseconds component (`issue#40166 <http://tracker.ceph.com/issues/40166>`_, `pr#28502 <https://github.com/ceph/ceph/pull/28502>`_, David Disseldorp)
-* cephfs: client: clean up error checking and return of _lookup_parent (`issue#40085 <http://tracker.ceph.com/issues/40085>`_, `pr#28437 <https://github.com/ceph/ceph/pull/28437>`_, Jeff Layton)
-* cephfs: client: return -EIO when sync file which unsafe reqs have been dropped (`issue#40877 <http://tracker.ceph.com/issues/40877>`_, `pr#30242 <https://github.com/ceph/ceph/pull/30242>`_, simon gao)
-* cephfs: client: unlink dentry for inode with llref=0 (`issue#40960 <http://tracker.ceph.com/issues/40960>`_, `pr#29830 <https://github.com/ceph/ceph/pull/29830>`_, Xiaoxi CHEN)
-* cephfs: kclient: nofail option not supported (`pr#28436 <https://github.com/ceph/ceph/pull/28436>`_, Kenneth Waegeman)
-* cephfs: mds/server: check directory split after rename (`issue#39198 <http://tracker.ceph.com/issues/39198>`_, `issue#38994 <http://tracker.ceph.com/issues/38994>`_, `pr#27801 <https://github.com/ceph/ceph/pull/27801>`_, Shen Hang)
-* cephfs: mds: add command that config individual client session (`issue#40811 <http://tracker.ceph.com/issues/40811>`_, `pr#31573 <https://github.com/ceph/ceph/pull/31573>`_, "Yan, Zheng")
-* cephfs: mds: add reference when setting Connection::priv to existing session (`pr#31049 <https://github.com/ceph/ceph/pull/31049>`_, "Yan, Zheng")
-* cephfs: mds: avoid trimming too many log segments after mds failover (`issue#40028 <http://tracker.ceph.com/issues/40028>`_, `pr#28543 <https://github.com/ceph/ceph/pull/28543>`_, simon gao)
-* cephfs: mds: better output of 'ceph health detail' (`issue#39266 <http://tracker.ceph.com/issues/39266>`_, `pr#27848 <https://github.com/ceph/ceph/pull/27848>`_, Shen Hang)
-* cephfs: mds: check dir fragment to split dir if mkdir makes it oversized (`pr#29829 <https://github.com/ceph/ceph/pull/29829>`_, Erqi Chen)
-* cephfs: mds: cleanup truncating inodes when standby replay mds trim log segments (`pr#31286 <https://github.com/ceph/ceph/pull/31286>`_, "Yan, Zheng")
-* cephfs: mds: dont print subtrees if they are too big or too many (`pr#27679 <https://github.com/ceph/ceph/pull/27679>`_, Rishabh Dave)
-* cephfs: mds: drop reconnect message from non-existent session (`issue#39191 <http://tracker.ceph.com/issues/39191>`_, `issue#39026 <http://tracker.ceph.com/issues/39026>`_, `pr#27737 <https://github.com/ceph/ceph/pull/27737>`_, Shen Hang)
-* cephfs: mds: fix corner case of replaying open sessions (`pr#28536 <https://github.com/ceph/ceph/pull/28536>`_, "Yan, Zheng")
-* cephfs: mds: initialize cap_revoke_eviction_timeout with conf (`issue#38844 <http://tracker.ceph.com/issues/38844>`_, `issue#39208 <http://tracker.ceph.com/issues/39208>`_, `pr#27840 <https://github.com/ceph/ceph/pull/27840>`_, simon gao)
-* cephfs: mds: msg weren't destroyed before handle_client_reconnect returned, if the reconnect msg was from non-existent session (`issue#40588 <http://tracker.ceph.com/issues/40588>`_, `issue#40807 <http://tracker.ceph.com/issues/40807>`_, `pr#29097 <https://github.com/ceph/ceph/pull/29097>`_, Shen Hang)
-* cephfs: mds: remove superfluous error in StrayManager::advance_delayed() (`issue#38679 <http://tracker.ceph.com/issues/38679>`_, `pr#28432 <https://github.com/ceph/ceph/pull/28432>`_, "Yan, Zheng")
-* cephfs: mds: reset heartbeat inside big loop (`pr#28544 <https://github.com/ceph/ceph/pull/28544>`_, "Yan, Zheng")
-* cephfs: mds: there is an assertion when calling Beacon::shutdown() (`issue#38822 <http://tracker.ceph.com/issues/38822>`_, `pr#28438 <https://github.com/ceph/ceph/pull/28438>`_, huanwen ren)
-* cephfs: mount: key parsing fail when doing a remount (`issue#40163 <http://tracker.ceph.com/issues/40163>`_, `pr#29226 <https://github.com/ceph/ceph/pull/29226>`_, Luis Henriques)
-* cephfs: pybind/ceph_volume_client: remove ceph mds calls in favor of ceph fs calls (`issue#22038 <http://tracker.ceph.com/issues/22038>`_, `issue#22524 <http://tracker.ceph.com/issues/22524>`_, `pr#28445 <https://github.com/ceph/ceph/pull/28445>`_, Patrick Donnelly, Ramana Raja)
-* cephfs: qa/cephfs: relax min_caps_per_client check (`issue#38270 <http://tracker.ceph.com/issues/38270>`_, `issue#38686 <http://tracker.ceph.com/issues/38686>`_, `pr#27040 <https://github.com/ceph/ceph/pull/27040>`_, "Yan, Zheng")
-* cephfs: qa: misc cache drop fixes (`issue#38340 <http://tracker.ceph.com/issues/38340>`_, `issue#38445 <http://tracker.ceph.com/issues/38445>`_, `pr#27342 <https://github.com/ceph/ceph/pull/27342>`_, Patrick Donnelly)
-* common/config: hold lock while accessing mutable container (`pr#30345 <https://github.com/ceph/ceph/pull/30345>`_, Jason Dillaman)
-* common: Keyrings created by ceph auth get are not suitable for ceph auth import (`issue#40548 <http://tracker.ceph.com/issues/40548>`_, `issue#22227 <http://tracker.ceph.com/issues/22227>`_, `pr#28742 <https://github.com/ceph/ceph/pull/28742>`_, Kefu Chai)
-* common: common/ceph_context: avoid unnecessary wait during service thread shutdown (`pr#31020 <https://github.com/ceph/ceph/pull/31020>`_, Jason Dillaman)
-* common: common/options.cc: Lower the default value of osd_deep_scrub_large_omap_object_key_threshold (`pr#29175 <https://github.com/ceph/ceph/pull/29175>`_, Neha Ojha)
-* common: common/util: handle long lines in /proc/cpuinfo (`issue#38296 <http://tracker.ceph.com/issues/38296>`_, `pr#32349 <https://github.com/ceph/ceph/pull/32349>`_, Sage Weil)
-* common: compressor/zstd: improvements (`pr#28647 <https://github.com/ceph/ceph/pull/28647>`_, Adam C. Emerson, Sage Weil)
-* common: data race in OutputDataSocket (`issue#40188 <http://tracker.ceph.com/issues/40188>`_, `issue#40266 <http://tracker.ceph.com/issues/40266>`_, `pr#29202 <https://github.com/ceph/ceph/pull/29202>`_, Casey Bodley)
-* core: ENOENT in collection_move_rename on EC backfill target (`issue#36739 <http://tracker.ceph.com/issues/36739>`_, `issue#38880 <http://tracker.ceph.com/issues/38880>`_, `pr#28110 <https://github.com/ceph/ceph/pull/28110>`_, Neha Ojha)
-* core: Health warnings on long network ping times (`issue#40586 <http://tracker.ceph.com/issues/40586>`_, `issue#40640 <http://tracker.ceph.com/issues/40640>`_, `pr#30230 <https://github.com/ceph/ceph/pull/30230>`_, xie xingguo, David Zafman)
-* core: Revert "crush: remove invalid upmap items" (`pr#32019 <https://github.com/ceph/ceph/pull/32019>`_, David Zafman)
-* core: backport recent messenger fixes (`issue#39243 <http://tracker.ceph.com/issues/39243>`_, `issue#38242 <http://tracker.ceph.com/issues/38242>`_, `issue#39448 <http://tracker.ceph.com/issues/39448>`_, `pr#27583 <https://github.com/ceph/ceph/pull/27583>`_, xie xingguo, Jason Dillaman)
-* core: ceph tell osd.xx bench help : gives wrong help (`issue#39006 <http://tracker.ceph.com/issues/39006>`_, `issue#39373 <http://tracker.ceph.com/issues/39373>`_, `pr#28112 <https://github.com/ceph/ceph/pull/28112>`_, Neha Ojha)
-* core: ceph-objectstore-tool: rename dump-import to dump-export (`issue#39343 <http://tracker.ceph.com/issues/39343>`_, `issue#39284 <http://tracker.ceph.com/issues/39284>`_, `pr#27636 <https://github.com/ceph/ceph/pull/27636>`_, David Zafman)
-* core: crc cache should be invalidated when posting preallocated rx buffers (`issue#38436 <http://tracker.ceph.com/issues/38436>`_, `pr#29248 <https://github.com/ceph/ceph/pull/29248>`_, Ilya Dryomov)
-* core: crush/CrushWrapper: ensure crush_choose_arg_map.size == max_buckets (`issue#38664 <http://tracker.ceph.com/issues/38664>`_, `issue#38719 <http://tracker.ceph.com/issues/38719>`_, `pr#27085 <https://github.com/ceph/ceph/pull/27085>`_, Sage Weil)
-* core: crush: remove invalid upmap items (`pr#31234 <https://github.com/ceph/ceph/pull/31234>`_, huangjun)
-* core: lazy omap stat collection (`pr#29190 <https://github.com/ceph/ceph/pull/29190>`_, Brad Hubbard)
-* core: mds,osd,mon,msg: use intrusive_ptr for holding Connection::priv (`issue#20924 <http://tracker.ceph.com/issues/20924>`_, `pr#29859 <https://github.com/ceph/ceph/pull/29859>`_, Shinobu Kinjo, Kefu Chai, Jianpeng Ma, Samuel Just)
-* core: mgr/localpool: pg_num is an int arg to 'osd pool create' (`pr#30446 <https://github.com/ceph/ceph/pull/30446>`_, Sage Weil)
-* core: mgr/prometheus: assign a value to osd_dev_node when obj_store is not filestore or bluestore (`pr#31587 <https://github.com/ceph/ceph/pull/31587>`_, jiahuizeng)
-* core: mon, osd: parallel clean_pg_upmaps (`issue#40229 <http://tracker.ceph.com/issues/40229>`_, `issue#40104 <http://tracker.ceph.com/issues/40104>`_, `pr#28594 <https://github.com/ceph/ceph/pull/28594>`_, xie xingguo)
-* core: mon,osd: limit MOSDMap messages by size as well as map count (`issue#38276 <http://tracker.ceph.com/issues/38276>`_, `pr#28640 <https://github.com/ceph/ceph/pull/28640>`_, Sage Weil)
-* core: mon/OSDMonitor: trim not-longer-exist failure reporters (`pr#30905 <https://github.com/ceph/ceph/pull/30905>`_, NancySu05)
-* core: mon: Error message displayed when mon_osd_max_split_count would be exceeded is not as user-friendly as it could be (`issue#39353 <http://tracker.ceph.com/issues/39353>`_, `issue#39563 <http://tracker.ceph.com/issues/39563>`_, `pr#27908 <https://github.com/ceph/ceph/pull/27908>`_, Nathan Cutler, Brad Hubbard)
-* core: mon: ensure prepare_failure() marks no_reply on op (`pr#30519 <https://github.com/ceph/ceph/pull/30519>`_, Joao Eduardo Luis)
-* core: mon: mon/AuthMonitor: don't validate fs caps on authorize (`pr#28666 <https://github.com/ceph/ceph/pull/28666>`_, Joao Eduardo Luis)
-* core: msg: output peer address when detecting bad CRCs (`issue#39367 <http://tracker.ceph.com/issues/39367>`_, `pr#27858 <https://github.com/ceph/ceph/pull/27858>`_, Greg Farnum)
-* core: osd/OSDMap.cc: don't output over/underfull messages to lderr (`pr#31598 <https://github.com/ceph/ceph/pull/31598>`_, Neha Ojha)
-* core: osd/OSDMap: Replace get_out_osds with get_out_existing_osds (`issue#39154 <http://tracker.ceph.com/issues/39154>`_, `issue#39420 <http://tracker.ceph.com/issues/39420>`_, `pr#27728 <https://github.com/ceph/ceph/pull/27728>`_, Brad Hubbard)
-* core: osd/OSDMap: do not trust partially simplified pg_upmap_item (`pr#30926 <https://github.com/ceph/ceph/pull/30926>`_, xie xingguo)
-* core: osd/PG: Add PG to large omap log message (`pr#30922 <https://github.com/ceph/ceph/pull/30922>`_, Brad Hubbard)
-* core: osd/PG: discover missing objects when an OSD peers and PG is degraded (`pr#27751 <https://github.com/ceph/ceph/pull/27751>`_, Jonas Jelten)
-* core: osd/PGLog: preserve original_crt to check rollbackability (`issue#38894 <http://tracker.ceph.com/issues/38894>`_, `issue#38905 <http://tracker.ceph.com/issues/38905>`_, `issue#36739 <http://tracker.ceph.com/issues/36739>`_, `issue#39042 <http://tracker.ceph.com/issues/39042>`_, `pr#27715 <https://github.com/ceph/ceph/pull/27715>`_, Neha Ojha)
-* core: osd/PeeringState: recover_got - add special handler for empty log (`pr#30896 <https://github.com/ceph/ceph/pull/30896>`_, xie xingguo)
-* core: osd/PrimaryLogPG: skip obcs that don't exist during backfill scan_range (`pr#31030 <https://github.com/ceph/ceph/pull/31030>`_, Sage Weil)
-* core: osd/ReplicatedBackend.cc: 1321: FAILED assert(get_parent()->get_log().get_log().objects.count(soid) && (get_parent()->get_log().get_log().objects.find(soid)->second->op == pg_log_entry_t::LOST_REVERT) && (get_parent()->get_log().get_log().object (`issue#39537 <http://tracker.ceph.com/issues/39537>`_, `issue#26958 <http://tracker.ceph.com/issues/26958>`_, `pr#28989 <https://github.com/ceph/ceph/pull/28989>`_, xie xingguo)
-* core: osd/ReplicatedBackend.cc: 1349: FAILED ceph_assert(peer_missing.count(fromshard)) (`pr#31855 <https://github.com/ceph/ceph/pull/31855>`_, Neha Ojha, xie xingguo)
-* core: osd/bluestore: Actually wait until completion in write_sync (`pr#29564 <https://github.com/ceph/ceph/pull/29564>`_, Vitaliy Filippov)
-* core: osd: Better error message when OSD count is less than osd_pool_default_size (`issue#38617 <http://tracker.ceph.com/issues/38617>`_, `issue#38585 <http://tracker.ceph.com/issues/38585>`_, `pr#30298 <https://github.com/ceph/ceph/pull/30298>`_, Vikhyat Umrao, Kefu Chai, Sage Weil, zjh)
-* core: osd: Diagnostic logging for upmap cleaning (`pr#32666 <https://github.com/ceph/ceph/pull/32666>`_, David Zafman)
-* core: osd: FAILED ceph_assert(attrs || !pg_log.get_missing().is_missing(soid) || (it_objects != pg_log.get_log().objects.end() && it_objects->second->op == pg_log_entry_t::LOST_REVERT)) in PrimaryLogPG::get_object_context() (`issue#39218 <http://tracker.ceph.com/issues/39218>`_, `issue#38931 <http://tracker.ceph.com/issues/38931>`_, `issue#38784 <http://tracker.ceph.com/issues/38784>`_, `pr#27878 <https://github.com/ceph/ceph/pull/27878>`_, xie xingguo)
-* core: osd: Fix for compatibility of encode/decode of osd_stat_t (`pr#31277 <https://github.com/ceph/ceph/pull/31277>`_, David Zafman)
-* core: osd: Include dups in copy_after() and copy_up_to() (`issue#39304 <http://tracker.ceph.com/issues/39304>`_, `pr#28185 <https://github.com/ceph/ceph/pull/28185>`_, David Zafman)
-* core: osd: Remove unused osdmap flags full, nearfull from output (`issue#22350 <http://tracker.ceph.com/issues/22350>`_, `pr#30902 <https://github.com/ceph/ceph/pull/30902>`_, Gu Zhongyan, David Zafman)
-* core: osd: add hdd, ssd and hybrid variants for osd_snap_trim_sleep (`pr#31857 <https://github.com/ceph/ceph/pull/31857>`_, Neha Ojha)
-* core: osd: clear PG_STATE_CLEAN when repair object (`pr#30271 <https://github.com/ceph/ceph/pull/30271>`_, Zengran Zhang)
-* core: osd: fix out of order caused by letting old msg from down osd be processed (`pr#31293 <https://github.com/ceph/ceph/pull/31293>`_, Mingxin Liu)
-* core: osd: merge replica log on primary need according to replica log's crt (`pr#30917 <https://github.com/ceph/ceph/pull/30917>`_, Zengran Zhang)
-* core: osd: refuse to start if we're > N+2 from recorded require_osd_release (`issue#38076 <http://tracker.ceph.com/issues/38076>`_, `pr#31858 <https://github.com/ceph/ceph/pull/31858>`_, Sage Weil)
-* core: osd: report omap/data/metadata usage (`issue#40638 <http://tracker.ceph.com/issues/40638>`_, `pr#28851 <https://github.com/ceph/ceph/pull/28851>`_, Sage Weil)
-* core: osd: rollforward may need to mark pglog dirty (`issue#40403 <http://tracker.ceph.com/issues/40403>`_, `pr#31036 <https://github.com/ceph/ceph/pull/31036>`_, Zengran Zhang)
-* core: osd: scrub error on big objects; make bluestore refuse to start on big objects (`pr#30785 <https://github.com/ceph/ceph/pull/30785>`_, Sage Weil, David Zafman)
-* core: osd: shutdown recovery_request_timer earlier (`issue#39204 <http://tracker.ceph.com/issues/39204>`_, `pr#27810 <https://github.com/ceph/ceph/pull/27810>`_, Zengran Zhang)
-* core: pybind: Rados.get_fsid() returning bytes in python3 (`issue#38873 <http://tracker.ceph.com/issues/38873>`_, `issue#38381 <http://tracker.ceph.com/issues/38381>`_, `pr#27674 <https://github.com/ceph/ceph/pull/27674>`_, Jason Dillaman)
-* core: should report EINVAL in ErasureCode::parse() if m<=0 (`issue#38682 <http://tracker.ceph.com/issues/38682>`_, `issue#38750 <http://tracker.ceph.com/issues/38750>`_, `pr#28111 <https://github.com/ceph/ceph/pull/28111>`_, Sage Weil)
-* doc: Minor rados related documentation fixes (`issue#38896 <http://tracker.ceph.com/issues/38896>`_, `issue#38902 <http://tracker.ceph.com/issues/38902>`_, `pr#27185 <https://github.com/ceph/ceph/pull/27185>`_, David Zafman)
-* doc: Missing Documentation for radosgw-admin reshard commands (man pages) (`issue#40092 <http://tracker.ceph.com/issues/40092>`_, `issue#21617 <http://tracker.ceph.com/issues/21617>`_, `pr#28329 <https://github.com/ceph/ceph/pull/28329>`_, Orit Wasserman)
-* doc: Update layout.rst (`pr#26381 <https://github.com/ceph/ceph/pull/26381>`_, ypdai)
-* doc: describe metadata_heap cleanup (`issue#18174 <http://tracker.ceph.com/issues/18174>`_, `pr#30071 <https://github.com/ceph/ceph/pull/30071>`_, Dan van der Ster)
-* doc: doc/rbd: s/guess/xml/ for codeblock lexer (`pr#31091 <https://github.com/ceph/ceph/pull/31091>`_, Kefu Chai)
-* doc: doc/rgw: document CreateBucketConfiguration for s3 PUT Bucket api (`issue#39597 <http://tracker.ceph.com/issues/39597>`_, `pr#31647 <https://github.com/ceph/ceph/pull/31647>`_, Casey Bodley)
-* doc: doc/rgw: document use of 'realm pull' instead of 'period pull' (`issue#39655 <http://tracker.ceph.com/issues/39655>`_, `pr#30132 <https://github.com/ceph/ceph/pull/30132>`_, Casey Bodley)
-* doc: fixed --read-only argument value in multisite doc (`pr#31655 <https://github.com/ceph/ceph/pull/31655>`_, Chenjiong Deng)
-* doc: osd_recovery_priority is not documented (but osd_recovery_op_priority is) (`pr#27471 <https://github.com/ceph/ceph/pull/27471>`_, David Zafman)
-* doc: update bluestore cache settings and clarify data fraction (`issue#39522 <http://tracker.ceph.com/issues/39522>`_, `pr#31257 <https://github.com/ceph/ceph/pull/31257>`_, Jan Fajerski)
-* doc: wrong datatype describing crush_rule (`pr#32267 <https://github.com/ceph/ceph/pull/32267>`_, Kefu Chai)
-* doc: wrong value of usage log default in logging section (`issue#37892 <http://tracker.ceph.com/issues/37892>`_, `issue#37856 <http://tracker.ceph.com/issues/37856>`_, `pr#29015 <https://github.com/ceph/ceph/pull/29015>`_, Abhishek Lekshmanan)
-* mgr: Change default upmap_max_deviation to 5 (`pr#32586 <https://github.com/ceph/ceph/pull/32586>`_, David Zafman)
-* mgr: Release GIL and Balancer fixes (`pr#31992 <https://github.com/ceph/ceph/pull/31992>`_, Kefu Chai, Noah Watkins, David Zafman)
-* mgr: mgr/BaseMgrModule: drop GIL in set_config (`issue#39040 <http://tracker.ceph.com/issues/39040>`_, `issue#36766 <http://tracker.ceph.com/issues/36766>`_, `pr#27808 <https://github.com/ceph/ceph/pull/27808>`_, John Spray, xie xingguo, Sage Weil)
-* mgr: mgr/balancer: blame if upmap won't actually work (`issue#38781 <http://tracker.ceph.com/issues/38781>`_, `pr#26498 <https://github.com/ceph/ceph/pull/26498>`_, xie xingguo)
-* mgr: mgr/balancer: python3 compatibility issue (`pr#31104 <https://github.com/ceph/ceph/pull/31104>`_, Mykola Golub)
-* mgr: mgr/prometheus: Cast collect_timeout (scrape_interval) to float (`pr#31107 <https://github.com/ceph/ceph/pull/31107>`_, Ben Meekhof)
-* mgr: mgr/prometheus: replace whitespaces in metrics' names (`pr#31105 <https://github.com/ceph/ceph/pull/31105>`_, Alfonso Martínez)
-* mgr: DaemonServer::handle_conf_change - broken locking (`issue#38899 <http://tracker.ceph.com/issues/38899>`_, `issue#38962 <http://tracker.ceph.com/issues/38962>`_, `pr#29213 <https://github.com/ceph/ceph/pull/29213>`_, xie xingguo)
-* mgr: pybind/mgr: Cancel output color control (`pr#31696 <https://github.com/ceph/ceph/pull/31696>`_, Zheng Yin)
-* mgr: restful: Query nodes_by_id for items (`pr#31272 <https://github.com/ceph/ceph/pull/31272>`_, Boris Ranto)
-* mgr: telemetry module for mgr (`issue#37976 <http://tracker.ceph.com/issues/37976>`_, `pr#32135 <https://github.com/ceph/ceph/pull/32135>`_, Joao Eduardo Luis, Wido den Hollander, Kefu Chai, Sage Weil, Dan Mick)
-* rbd: Reduce log level for cls/journal and cls/rbd expected errors (`issue#40865 <http://tracker.ceph.com/issues/40865>`_, `pr#30857 <https://github.com/ceph/ceph/pull/30857>`_, Jason Dillaman)
-* rbd: journal: properly advance read offset after skipping invalid range (`pr#28811 <https://github.com/ceph/ceph/pull/28811>`_, Mykola Golub)
-* rbd: krbd: avoid udev netlink socket overrun and retry on transient errors from udev_enumerate_scan_devices() (`issue#39089 <http://tracker.ceph.com/issues/39089>`_, `pr#31360 <https://github.com/ceph/ceph/pull/31360>`_, Zhi Zhang, Ilya Dryomov)
-* rbd: krbd: return -ETIMEDOUT in polling (`issue#38792 <http://tracker.ceph.com/issues/38792>`_, `issue#38975 <http://tracker.ceph.com/issues/38975>`_, `pr#27536 <https://github.com/ceph/ceph/pull/27536>`_, Dongsheng Yang)
-* rbd: librbd: add missing shutdown states to managed lock helper (`issue#38387 <http://tracker.ceph.com/issues/38387>`_, `issue#38508 <http://tracker.ceph.com/issues/38508>`_, `pr#28158 <https://github.com/ceph/ceph/pull/28158>`_, Jason Dillaman)
-* rbd: librbd: async open/close should free ImageCtx before issuing callback (`issue#39427 <http://tracker.ceph.com/issues/39427>`_, `issue#39031 <http://tracker.ceph.com/issues/39031>`_, `pr#28126 <https://github.com/ceph/ceph/pull/28126>`_, Jason Dillaman)
-* rbd: librbd: disable image mirroring when moving to trash (`pr#28149 <https://github.com/ceph/ceph/pull/28149>`_, Mykola Golub)
-* rbd: librbd: ensure compare-and-write doesn't skip compare after copyup (`issue#38440 <http://tracker.ceph.com/issues/38440>`_, `issue#38383 <http://tracker.ceph.com/issues/38383>`_, `pr#28134 <https://github.com/ceph/ceph/pull/28134>`_, Ilya Dryomov)
-* rbd: librbd: improve object map performance under high IOPS workloads (`issue#38674 <http://tracker.ceph.com/issues/38674>`_, `issue#38538 <http://tracker.ceph.com/issues/38538>`_, `pr#28137 <https://github.com/ceph/ceph/pull/28137>`_, Jason Dillaman)
-* rbd: librbd: properly track in-flight flush requests (`issue#40574 <http://tracker.ceph.com/issues/40574>`_, `pr#28773 <https://github.com/ceph/ceph/pull/28773>`_, Jason Dillaman)
-* rbd: librbd: race condition possible when validating RBD pool (`issue#38500 <http://tracker.ceph.com/issues/38500>`_, `issue#38564 <http://tracker.ceph.com/issues/38564>`_, `pr#28140 <https://github.com/ceph/ceph/pull/28140>`_, Jason Dillaman)
-* rbd: rbd-mirror: clear out bufferlist prior to listing mirror images (`issue#39460 <http://tracker.ceph.com/issues/39460>`_, `issue#39407 <http://tracker.ceph.com/issues/39407>`_, `pr#28124 <https://github.com/ceph/ceph/pull/28124>`_, Jason Dillaman)
-* rbd: rbd-mirror: don't overwrite status error returned by replay (`pr#29874 <https://github.com/ceph/ceph/pull/29874>`_, Mykola Golub)
-* rbd: rbd-mirror: handle duplicates in image sync throttler queue (`issue#40592 <http://tracker.ceph.com/issues/40592>`_, `issue#40519 <http://tracker.ceph.com/issues/40519>`_, `pr#28812 <https://github.com/ceph/ceph/pull/28812>`_, Mykola Golub)
-* rbd: rbd-mirror: ignore errors relating to parsing the cluster config file (`pr#30118 <https://github.com/ceph/ceph/pull/30118>`_, Jason Dillaman)
-* rbd: rbd-mirror: make logrotate work (`pr#32599 <https://github.com/ceph/ceph/pull/32599>`_, Mykola Golub)
-* rbd: rbd/action: fix error getting positional argument (`issue#40095 <http://tracker.ceph.com/issues/40095>`_, `pr#29295 <https://github.com/ceph/ceph/pull/29295>`_, songweibin)
-* rbd: tools/rbd-ggate: close log before running postfork (`pr#30858 <https://github.com/ceph/ceph/pull/30858>`_, Willem Jan Withagen)
-* rbd: use the ordered throttle for the export action (`issue#40435 <http://tracker.ceph.com/issues/40435>`_, `pr#30856 <https://github.com/ceph/ceph/pull/30856>`_, Jason Dillaman)
-* rgw: Adding tcp_nodelay option to Beast (`issue#38925 <http://tracker.ceph.com/issues/38925>`_, `pr#27424 <https://github.com/ceph/ceph/pull/27424>`_, Or Friedmann)
-* rgw: GetBucketCORS API returns Not Found error code when CORS configuration does not exist (`issue#38887 <http://tracker.ceph.com/issues/38887>`_, `issue#26964 <http://tracker.ceph.com/issues/26964>`_, `pr#27123 <https://github.com/ceph/ceph/pull/27123>`_, yuliyang, ashitakasam)
-* rgw: LC: handle resharded buckets (`pr#29122 <https://github.com/ceph/ceph/pull/29122>`_, Abhishek Lekshmanan)
-* rgw: RGWCoroutine::call(nullptr) sets retcode=0 (`pr#30329 <https://github.com/ceph/ceph/pull/30329>`_, Casey Bodley)
-* rgw: TempURL should not allow PUTs with the X-Object-Manifest (`issue#20797 <http://tracker.ceph.com/issues/20797>`_, `pr#31652 <https://github.com/ceph/ceph/pull/31652>`_, Radoslaw Zarzynski)
-* rgw: add list user admin OP API (`pr#30984 <https://github.com/ceph/ceph/pull/30984>`_, Oshyn Song)
-* rgw: allow radosgw-admin to list bucket w --allow-unordered (`pr#31220 <https://github.com/ceph/ceph/pull/31220>`_, J. Eric Ivancich)
-* rgw: civetweb frontend: response is buffered in memory if content length is not explicitly specified (`issue#39615 <http://tracker.ceph.com/issues/39615>`_, `issue#12713 <http://tracker.ceph.com/issues/12713>`_, `pr#28069 <https://github.com/ceph/ceph/pull/28069>`_, Robin H. Johnson)
-* rgw: cls/rgw: raise debug level of bi_log_iterate_entries output (`issue#40559 <http://tracker.ceph.com/issues/40559>`_, `pr#27974 <https://github.com/ceph/ceph/pull/27974>`_, Casey Bodley)
-* rgw: cls/user: cls_user_set_buckets_info overwrites creation_time (`issue#39635 <http://tracker.ceph.com/issues/39635>`_, `pr#31648 <https://github.com/ceph/ceph/pull/31648>`_, Casey Bodley)
-* rgw: conditionally allow builtin users with non-unique email addresses (`issue#40089 <http://tracker.ceph.com/issues/40089>`_, `issue#40506 <http://tracker.ceph.com/issues/40506>`_, `pr#28717 <https://github.com/ceph/ceph/pull/28717>`_, Matt Benjamin)
-* rgw: crypt: permit RGW-AUTO/default with SSE-S3 headers (`pr#31860 <https://github.com/ceph/ceph/pull/31860>`_, Matt Benjamin)
-* rgw: datalog/mdlog trim commands loop until done (`pr#29713 <https://github.com/ceph/ceph/pull/29713>`_, Casey Bodley)
-* rgw: delete_obj_index() takes mtime for bilog (`issue#24991 <http://tracker.ceph.com/issues/24991>`_, `pr#31649 <https://github.com/ceph/ceph/pull/31649>`_, Casey Bodley)
-* rgw: don't crash on missing /etc/mime.types (`issue#38920 <http://tracker.ceph.com/issues/38920>`_, `issue#38328 <http://tracker.ceph.com/issues/38328>`_, `pr#27332 <https://github.com/ceph/ceph/pull/27332>`_, Casey Bodley)
-* rgw: don't throw when accept errors are happening on frontend (`pr#30147 <https://github.com/ceph/ceph/pull/30147>`_, Yuval Lifshitz)
-* rgw: failed to pass test_bucket_create_naming_bad_punctuation in s3test (`issue#39360 <http://tracker.ceph.com/issues/39360>`_, `issue#39358 <http://tracker.ceph.com/issues/39358>`_, `issue#23587 <http://tracker.ceph.com/issues/23587>`_, `issue#26965 <http://tracker.ceph.com/issues/26965>`_, `pr#27668 <https://github.com/ceph/ceph/pull/27668>`_, yuliyang, Abhishek Lekshmanan)
-* rgw: fix bucket may redundantly list keys after BI_PREFIX_CHAR (`issue#39984 <http://tracker.ceph.com/issues/39984>`_, `issue#40149 <http://tracker.ceph.com/issues/40149>`_, `pr#28408 <https://github.com/ceph/ceph/pull/28408>`_, Tianshan Qu, Casey Bodley)
-* rgw: fix cls_bucket_list_unordered() partial results (`pr#30254 <https://github.com/ceph/ceph/pull/30254>`_, Mark Kogan)
-* rgw: fix drain handles error when deleting bucket with bypass-gc option (`pr#30198 <https://github.com/ceph/ceph/pull/30198>`_, dongdong tao)
-* rgw: fix issue for CreateBucket with BucketLocation param (`pr#29826 <https://github.com/ceph/ceph/pull/29826>`_, Enming Zhang, Matt Benjamin)
-* rgw: fix read not exists null version return wrong (`issue#38811 <http://tracker.ceph.com/issues/38811>`_, `issue#38908 <http://tracker.ceph.com/issues/38908>`_, `pr#27330 <https://github.com/ceph/ceph/pull/27330>`_, Tianshan Qu)
-* rgw: fix refcount tags to match and update object's idtag (`pr#30323 <https://github.com/ceph/ceph/pull/30323>`_, J. Eric Ivancich)
-* rgw: gc use aio (`issue#24592 <http://tracker.ceph.com/issues/24592>`_, `pr#28784 <https://github.com/ceph/ceph/pull/28784>`_, Yehuda Sadeh, Zhang Shaowen, Yao Zongyou, Jesse Williamson)
-* rgw: get or set realm zonegroup zone need check user's caps (`issue#37497 <http://tracker.ceph.com/issues/37497>`_, `pr#28332 <https://github.com/ceph/ceph/pull/28332>`_, yuliyang, Casey Bodley)
-* rgw: housekeeping of reset stats operation in radosgw-admin and cls back-end (`pr#30674 <https://github.com/ceph/ceph/pull/30674>`_, J. Eric Ivancich)
-* rgw: inefficient unordered bucket listing (`issue#39409 <http://tracker.ceph.com/issues/39409>`_, `issue#39393 <http://tracker.ceph.com/issues/39393>`_, `pr#28350 <https://github.com/ceph/ceph/pull/28350>`_, Casey Bodley)
-* rgw: lc: continue past get_obj_state() failure (`pr#32194 <https://github.com/ceph/ceph/pull/32194>`_, Matt Benjamin)
-* rgw: make dns hostnames matching case insensitive (`issue#40995 <http://tracker.ceph.com/issues/40995>`_, `pr#30375 <https://github.com/ceph/ceph/pull/30375>`_, Casey Bodley, Abhishek Lekshmanan)
-* rgw: mitigate bucket list with max-entries excessively high (`pr#30666 <https://github.com/ceph/ceph/pull/30666>`_, J. Eric Ivancich)
-* rgw: multisite: 'radosgw-admin bucket sync status' should call syncs_from(source.name) instead of id (`issue#40022 <http://tracker.ceph.com/issues/40022>`_, `issue#40143 <http://tracker.ceph.com/issues/40143>`_, `pr#29271 <https://github.com/ceph/ceph/pull/29271>`_, Casey Bodley)
-* rgw: orphans find perf improvments (`issue#39180 <http://tracker.ceph.com/issues/39180>`_, `pr#28314 <https://github.com/ceph/ceph/pull/28314>`_, Abhishek Lekshmanan)
-* rgw: parse_copy_location defers url-decode (`issue#27217 <http://tracker.ceph.com/issues/27217>`_, `pr#31651 <https://github.com/ceph/ceph/pull/31651>`_, Casey Bodley)
-* rgw: policy fix for nonexistent objects (`issue#38638 <http://tracker.ceph.com/issues/38638>`_, `pr#29153 <https://github.com/ceph/ceph/pull/29153>`_, Pritha Srivastava)
-* rgw: remove_olh_pending_entries() does not limit the number of xattrs to remove (`issue#39118 <http://tracker.ceph.com/issues/39118>`_, `issue#39177 <http://tracker.ceph.com/issues/39177>`_, `pr#28349 <https://github.com/ceph/ceph/pull/28349>`_, Casey Bodley)
-* rgw: resolve bugs and clean up garbage collection code (`issue#38454 <http://tracker.ceph.com/issues/38454>`_, `pr#31664 <https://github.com/ceph/ceph/pull/31664>`_, Dan Hill, J. Eric Ivancich)
-* rgw: return ERR_NO_SUCH_BUCKET early while evaluating bucket policy (`issue#38420 <http://tracker.ceph.com/issues/38420>`_, `pr#31218 <https://github.com/ceph/ceph/pull/31218>`_, Abhishek Lekshmanan)
-* rgw: rgw-admin: fix data sync report for master zone (`issue#38958 <http://tracker.ceph.com/issues/38958>`_, `pr#27453 <https://github.com/ceph/ceph/pull/27453>`_, cfanz)
-* rgw: rgw-admin: object stat command output's delete_at not readable (`issue#39497 <http://tracker.ceph.com/issues/39497>`_, `pr#27991 <https://github.com/ceph/ceph/pull/27991>`_, Abhishek Lekshmanan)
-* rgw: rgw/OutputDataSocket: actually discard data on full buffer (`issue#40178 <http://tracker.ceph.com/issues/40178>`_, `pr#31654 <https://github.com/ceph/ceph/pull/31654>`_, Matt Benjamin)
-* rgw: rgw/multisite: Don't allow certain radosgw-admin commands to run on non-master zone (`issue#39548 <http://tracker.ceph.com/issues/39548>`_, `pr#30946 <https://github.com/ceph/ceph/pull/30946>`_, Danny Al-Gaaf, Shilpa Jagannath)
-* rgw: rgw_file: save etag and acl info in setattr (`issue#39227 <http://tracker.ceph.com/issues/39227>`_, `pr#27881 <https://github.com/ceph/ceph/pull/27881>`_, Tao Chen)
-* rgw: rgw_sync: drop ENOENT error logs from mdlog (`issue#40032 <http://tracker.ceph.com/issues/40032>`_, `issue#38748 <http://tracker.ceph.com/issues/38748>`_, `pr#27110 <https://github.com/ceph/ceph/pull/27110>`_, Abhishek Lekshmanan)
-* rgw: set null version object acl issues (`issue#36763 <http://tracker.ceph.com/issues/36763>`_, `pr#31653 <https://github.com/ceph/ceph/pull/31653>`_, Tianshan Qu)
-* rgw: the Multi-Object Delete operation of S3 API wrongly handles the Code response element (`issue#18241 <http://tracker.ceph.com/issues/18241>`_, `issue#40135 <http://tracker.ceph.com/issues/40135>`_, `pr#29269 <https://github.com/ceph/ceph/pull/29269>`_, Radoslaw Zarzynski)
-* rgw: unable to cancel reshard operations for buckets with tenants (`issue#39016 <http://tracker.ceph.com/issues/39016>`_, `pr#27992 <https://github.com/ceph/ceph/pull/27992>`_, Abhishek Lekshmanan)
-* rgw: update civetweb submodule to match version in mimic (`issue#24158 <http://tracker.ceph.com/issues/24158>`_, `pr#27982 <https://github.com/ceph/ceph/pull/27982>`_, Abhishek Lekshmanan)
-* rgw: update s3-test download code for s3-test tasks (`pr#32227 <https://github.com/ceph/ceph/pull/32227>`_, Ali Maredia)
-* rgw: when exclusive lock fails due existing lock, log add'l info (`issue#38397 <http://tracker.ceph.com/issues/38397>`_, `issue#38171 <http://tracker.ceph.com/issues/38171>`_, `pr#26554 <https://github.com/ceph/ceph/pull/26554>`_, J. Eric Ivancich)
-* rgw:send x-amz-version-id header when upload files (`issue#39572 <http://tracker.ceph.com/issues/39572>`_, `pr#27935 <https://github.com/ceph/ceph/pull/27935>`_, Xinying Song)
-* tools: Add clear-data-digest command to objectstore tool (`pr#29366 <https://github.com/ceph/ceph/pull/29366>`_, Li Yichao)
-* tools: platform.linux_distribution() is deprecated; stop using it (`issue#39277 <http://tracker.ceph.com/issues/39277>`_, `issue#18163 <http://tracker.ceph.com/issues/18163>`_, `pr#27557 <https://github.com/ceph/ceph/pull/27557>`_, Nathan Cutler)
-* tools: rados tools list objects in a pg (`issue#36732 <http://tracker.ceph.com/issues/36732>`_, `pr#30608 <https://github.com/ceph/ceph/pull/30608>`_, Li Wang, Vikhyat Umrao)
-
-
-v12.2.12 Luminous
-=================
-
-This is the twelfth bug fix release of the Luminous v12.2.x long term stable
-release series. We recommend that all users upgrade to this release.
-
-Notable Changes
----------------
-
-* In 12.2.11 and earlier releases, keyring caps were not checked for validity,
-  so the caps string could be anything. As of 12.2.12, caps strings are
-  validated and providing a keyring with an invalid caps string to, e.g.,
-  `ceph auth add` will result in an error.
-
-Changelog
----------
-
-* auth: ceph auth add does not sanity-check caps (`issue#22525 <https://tracker.ceph.com/issues/22525>`_, `pr#24906 <https://github.com/ceph/ceph/pull/24906>`_, Jing Li, Nathan Cutler, Sage Weil)
-* build/ops: Allow multi instances of "make tests" on the same machine (`issue#36737 <https://tracker.ceph.com/issues/36737>`_, `pr#26186 <https://github.com/ceph/ceph/pull/26186>`_, Kefu Chai)
-* build/ops: rpm: require ceph-base instead of ceph-common (`issue#37620 <https://tracker.ceph.com/issues/37620>`_, `pr#25810 <https://github.com/ceph/ceph/pull/25810>`_, Sébastien Han)
-* ceph-volume: add --all flag to simple activate (`pr#26656 <https://github.com/ceph/ceph/pull/26656>`_, Jan Fajerski)
-* ceph-volume: look for rotational data in lsblk (`pr#26989 <https://github.com/ceph/ceph/pull/26989>`_, Andrew Schoen)
-* ceph-volume: replace testinfra command with py.test (`pr#26824 <https://github.com/ceph/ceph/pull/26824>`_, Alfredo Deza)
-* ceph-volume: revert partition as disk (`issue#37506 <https://tracker.ceph.com/issues/37506>`_, `pr#26295 <https://github.com/ceph/ceph/pull/26295>`_, Jan Fajerski)
-* ceph-volume: `simple scan` will now scan all running ceph-disk OSDs (`pr#26857 <https://github.com/ceph/ceph/pull/26857>`_, Andrew Schoen)
-* ceph-volume: use our own testinfra suite for functional testing (`pr#26703 <https://github.com/ceph/ceph/pull/26703>`_, Andrew Schoen)
-* CLI: ability to change file ownership (`issue#38370 <https://tracker.ceph.com/issues/38370>`_, `pr#26758 <https://github.com/ceph/ceph/pull/26758>`_, Sébastien Han)
-* client: session flush does not cause cap release message flush (`issue#38009 <https://tracker.ceph.com/issues/38009>`_, `pr#26271 <https://github.com/ceph/ceph/pull/26271>`_, Patrick Donnelly)
-* common: ceph_timer: stop timer's thread when it is suspended (`issue#37766 <https://tracker.ceph.com/issues/37766>`_, `pr#26579 <https://github.com/ceph/ceph/pull/26579>`_, Peng Wang)
-* common: fix for broken rbdmap parameter parsing (`issue#36327 <https://tracker.ceph.com/issues/36327>`_, `pr#26000 <https://github.com/ceph/ceph/pull/26000>`_, Marc Schoechlin)
-* core: Objecter::calc_op_budget: Fix invalid access to extent union member (`issue#37932 <https://tracker.ceph.com/issues/37932>`_, `pr#26064 <https://github.com/ceph/ceph/pull/26064>`_, Simon Ruggier)
-* core: os/filestore: ceph_abort() on fsync(2) or fdatasync(2) failure (`issue#38258 <https://tracker.ceph.com/issues/38258>`_, `pr#26871 <https://github.com/ceph/ceph/pull/26871>`_, Sage Weil)
-* crypto: don't use PK11_ImportSymKey() in FIPS mode (`issue#38843 <https://tracker.ceph.com/issues/38843>`_, `pr#27104 <https://github.com/ceph/ceph/pull/27104>`_, Radoslaw Zarzynski)
-* Fix recovery and backfill priority handling (`issue#27985 <https://tracker.ceph.com/issues/27985>`_, `issue#38041 <https://tracker.ceph.com/issues/38041>`_, `pr#26793 <https://github.com/ceph/ceph/pull/26793>`_, Sage Weil, xie xingguo, David Zafman)
-* journal: max journal order is incorrectly set at 64 (`issue#37541 <https://tracker.ceph.com/issues/37541>`_, `pr#25955 <https://github.com/ceph/ceph/pull/25955>`_, Mykola Golub)
-* librgw: export multitenancy support (`issue#37928 <https://tracker.ceph.com/issues/37928>`_, `pr#25986 <https://github.com/ceph/ceph/pull/25986>`_, Tao Chen)
-* mds: broadcast quota message to client when disable quota (`issue#38054 <https://tracker.ceph.com/issues/38054>`_, `pr#26293 <https://github.com/ceph/ceph/pull/26293>`_, Junhui Tang)
-* mds: fix potential re-evaluate stray dentry in _unlink_local_finish (`issue#38263 <https://tracker.ceph.com/issues/38263>`_, `pr#26473 <https://github.com/ceph/ceph/pull/26473>`_, Zhi Zhang)
-* mds: handle fragment notify race (`issue#36035 <https://tracker.ceph.com/issues/36035>`_, `pr#25990 <https://github.com/ceph/ceph/pull/25990>`_, "Yan, Zheng")
-* mds: handle state change race (`issue#37594 <https://tracker.ceph.com/issues/37594>`_, `pr#26005 <https://github.com/ceph/ceph/pull/26005>`_, "Yan, Zheng")
-* mds: log evicted clients to clog/dbg (`issue#37639 <https://tracker.ceph.com/issues/37639>`_, `pr#25858 <https://github.com/ceph/ceph/pull/25858>`_, Patrick Donnelly)
-* mds: log new client sessions with various metadata (`issue#37678 <https://tracker.ceph.com/issues/37678>`_, `pr#26257 <https://github.com/ceph/ceph/pull/26257>`_, Patrick Donnelly)
-* mds: message invalid access (`issue#38488 <https://tracker.ceph.com/issues/38488>`_, `pr#26661 <https://github.com/ceph/ceph/pull/26661>`_, Patrick Donnelly)
-* MDSMonitor: do not assign standby-replay when degraded (`issue#36384 <https://tracker.ceph.com/issues/36384>`_, `pr#26642 <https://github.com/ceph/ceph/pull/26642>`_, Patrick Donnelly)
-* MDSMonitor: missing osdmon writeable check (`issue#37929 <https://tracker.ceph.com/issues/37929>`_, `pr#26065 <https://github.com/ceph/ceph/pull/26065>`_, Patrick Donnelly)
-* mds: optimize revoking stale caps (`issue#38043 <https://tracker.ceph.com/issues/38043>`_, `pr#26278 <https://github.com/ceph/ceph/pull/26278>`_, "Yan, Zheng")
-* mds: stopping MDS with a large cache (40+GB) causes it to miss heartbeats (`issue#37723 <https://tracker.ceph.com/issues/37723>`_, `issue#38022 <https://tracker.ceph.com/issues/38022>`_, `pr#26232 <https://github.com/ceph/ceph/pull/26232>`_, Patrick Donnelly)
-* mds: trim cache after journal flush (`issue#38010 <https://tracker.ceph.com/issues/38010>`_, `pr#26215 <https://github.com/ceph/ceph/pull/26215>`_, Patrick Donnelly)
-* mds: wait for client to release shared cap when re-acquiring xlock (`issue#38491 <https://tracker.ceph.com/issues/38491>`_, `pr#27024 <https://github.com/ceph/ceph/pull/27024>`_, "Yan, Zheng")
-* mds: wait shorter intervals if beacon not sent (`issue#36367 <https://tracker.ceph.com/issues/36367>`_, `pr#25979 <https://github.com/ceph/ceph/pull/25979>`_, Patrick Donnelly)
-* mgr: "balancer execute" only requires read permissions (`issue#25345 <https://tracker.ceph.com/issues/25345>`_, `pr#25768 <https://github.com/ceph/ceph/pull/25768>`_, John Spray)
-* mgr/balancer: restrict automatic balancing to specific weekdays (`pr#26501 <https://github.com/ceph/ceph/pull/26501>`_, xie xingguo)
-* mgr/BaseMgrModule: drop GIL for ceph_send_command (`issue#38537 <https://tracker.ceph.com/issues/38537>`_, `pr#26830 <https://github.com/ceph/ceph/pull/26830>`_, Sage Weil)
-* mgr/DaemonServer: log pgmap usage to cluster log (`issue#37886 <https://tracker.ceph.com/issues/37886>`_, `pr#26207 <https://github.com/ceph/ceph/pull/26207>`_, Neha Ojha)
-* mgr/dashboard: fix for using '::' on hosts without ipv6 (`issue#38575 <https://tracker.ceph.com/issues/38575>`_, `pr#26751 <https://github.com/ceph/ceph/pull/26751>`_, Noah Watkins)
-* mgr: deadlock: _check_auth_rotating possible clock skew, rotating keys expired way too early (`issue#23460 <https://tracker.ceph.com/issues/23460>`_, `pr#26427 <https://github.com/ceph/ceph/pull/26427>`_, Yan Jun)
-* mgr: drop GIL in StandbyPyModule::get_config (`issue#35985 <http://tracker.ceph.com/issues/35985>`_, `pr#26613 <https://github.com/ceph/ceph/pull/26613>`_, John Spray; `pr#27639 <https://github.com/ceph/ceph/pull/27639>`_, wumingqiao)
-* mgr/restful: fix py got exception when get osd info (`issue#38182 <https://tracker.ceph.com/issues/38182>`_, `pr#26199 <https://github.com/ceph/ceph/pull/26199>`_, Boris Ranto, zouaiguo)
-* mon: A PG with PG_STATE_REPAIR doesn't mean damaged data, PG_STATE_IN… (`issue#38070 <https://tracker.ceph.com/issues/38070>`_, `pr#26305 <https://github.com/ceph/ceph/pull/26305>`_, David Zafman)
-* mon/MgrStatMonitor: ensure only one copy of initial service map (`issue#38839 <https://tracker.ceph.com/issues/38839>`_, `pr#27207 <https://github.com/ceph/ceph/pull/27207>`_, Sage Weil)
-* mon: monstore tool rebuild does not generate creating_pgs (`issue#36306 <https://tracker.ceph.com/issues/36306>`_, `pr#25825 <https://github.com/ceph/ceph/pull/25825>`_, Sage Weil)
-* mon: scrub warning check incorrectly uses mon scrub interval (`issue#37264 <https://tracker.ceph.com/issues/37264>`_, `pr#26557 <https://github.com/ceph/ceph/pull/26557>`_, Zhi Zhang, Sage Weil, David Zafman)
-* msg/async: backport recent messenger fixes (`issue#36497 <https://tracker.ceph.com/issues/36497>`_, `issue#37778 <https://tracker.ceph.com/issues/37778>`_, `pr#25956 <https://github.com/ceph/ceph/pull/25956>`_, xie xingguo)
-* msg/msg_types: fix the dencoder of entity_addr_t (`issue#24676 <https://tracker.ceph.com/issues/24676>`_, `pr#26042 <https://github.com/ceph/ceph/pull/26042>`_, Kefu Chai)
-* msgr: should set EPOLLET flag on del_event() (`issue#38828 <https://tracker.ceph.com/issues/38828>`_, `pr#27226 <https://github.com/ceph/ceph/pull/27226>`_, Roman Penyaev)
-* msg: should set EPOLLET flag on del_event() (`issue#38857 <https://tracker.ceph.com/issues/38857>`_, `pr#27226 <https://github.com/ceph/ceph/pull/27226>`_, Roman Penyaev)
-* multisite: es sync null versioned object failed because of olh info (`issue#23842 <https://tracker.ceph.com/issues/23842>`_, `issue#23841 <https://tracker.ceph.com/issues/23841>`_, `pr#26358 <https://github.com/ceph/ceph/pull/26358>`_, Tianshan Qu, Shang Ding)
-* Object can still be deleted even if s3:DeleteObject policy is set (`issue#37403 <https://tracker.ceph.com/issues/37403>`_, `pr#26310 <https://github.com/ceph/ceph/pull/26310>`_, Enming.Zhang)
-* objecter: avoid race when reset down osd's session (`issue#24601 <https://tracker.ceph.com/issues/24601>`_, `pr#25853 <https://github.com/ceph/ceph/pull/25853>`_, Zengran Zhang)
-* os/bluestore: backport new bitmap allocator (`issue#24598 <https://tracker.ceph.com/issues/24598>`_, `pr#26979 <https://github.com/ceph/ceph/pull/26979>`_, Radoslaw Zarzynski, Jianpeng Ma, Igor Fedotov, Sage Weil)
-* os/bluestore: bitmap allocator might fail to return contiguous chunk despite having enough space (`issue#38761 <https://tracker.ceph.com/issues/38761>`_, `pr#27312 <https://github.com/ceph/ceph/pull/27312>`_, Igor Fedotov)
-* os/bluestore: do not assert on non-zero err codes from compress() call (`issue#37839 <https://tracker.ceph.com/issues/37839>`_, `pr#26544 <https://github.com/ceph/ceph/pull/26544>`_, Igor Fedotov)
-* os/bluestore: fix lack of onode ref during removal (`issue#38395 <https://tracker.ceph.com/issues/38395>`_, `pr#26540 <https://github.com/ceph/ceph/pull/26540>`_, Sage Weil)
-* os/bluestore: Fix problem with bluefs's freespace not being balanced when kv_sync_thread is sleeping (`issue#38574 <https://tracker.ceph.com/issues/38574>`_, `pr#26866 <https://github.com/ceph/ceph/pull/26866>`_, Adam Kupczyk)
-* os/bluestore: fixup access a destroy cond cause deadlock or undefine (`issue#37733 <https://tracker.ceph.com/issues/37733>`_, `pr#26261 <https://github.com/ceph/ceph/pull/26261>`_, linbing)
-* os/bluestore: KernelDevice::read() does the EIO mapping now (`issue#36455 <https://tracker.ceph.com/issues/36455>`_, `pr#25855 <https://github.com/ceph/ceph/pull/25855>`_, Radoslaw Zarzynski)
-* osd: backport recent upmap fixes (`issue#37968 <https://tracker.ceph.com/issues/37968>`_, `issue#37940 <https://tracker.ceph.com/issues/37940>`_, `issue#37881 <https://tracker.ceph.com/issues/37881>`_, `pr#26127 <https://github.com/ceph/ceph/pull/26127>`_, huangjun, xie xingguo)
-* osd: backport recent upmap fixes (`issue#38826 <https://tracker.ceph.com/issues/38826>`_, `issue#38897 <https://tracker.ceph.com/issues/38897>`_, `pr#27224 <https://github.com/ceph/ceph/pull/27224>`_, huangjun, xie xingguo)
-* osd/bluestore: deep fsck fails on inspecting very large onodes (`issue#38065 <https://tracker.ceph.com/issues/38065>`_, `pr#26387 <https://github.com/ceph/ceph/pull/26387>`_, Igor Fedotov)
-* OSD crashes in get_str_map while creating with ceph-volume (`issue#38329 <https://tracker.ceph.com/issues/38329>`_, `pr#26900 <https://github.com/ceph/ceph/pull/26900>`_, Sage Weil)
-* osd: keep using cache even if op will invalid cache (`issue#37593 <https://tracker.ceph.com/issues/37593>`_, `pr#26078 <https://github.com/ceph/ceph/pull/26078>`_, Zengran Zhang)
-* osd/PG.cc: account for missing set irrespective of last_complete (`issue#37919 <https://tracker.ceph.com/issues/37919>`_, `pr#26236 <https://github.com/ceph/ceph/pull/26236>`_, Neha Ojha)
-* osd/PrimaryLogPG: fix the extent length error of the sync read (`issue#37680 <https://tracker.ceph.com/issues/37680>`_, `pr#25711 <https://github.com/ceph/ceph/pull/25711>`_, Xiaofei Cui)
-* osd/PrimaryLogPG: handle object !exists in handle_watch_timeout (`issue#38432 <https://tracker.ceph.com/issues/38432>`_, `pr#26706 <https://github.com/ceph/ceph/pull/26706>`_, Sage Weil)
-* rbd-mirror: update mirror status when stopping (`issue#36659 <https://tracker.ceph.com/issues/36659>`_, `pr#25720 <https://github.com/ceph/ceph/pull/25720>`_, Jason Dillaman)
-* rgw: bucket full sync handles delete markers (`issue#38007 <https://tracker.ceph.com/issues/38007>`_, `pr#26192 <https://github.com/ceph/ceph/pull/26192>`_, Casey Bodley)
-* rgw: bucket limit check misbehaves for > max-entries buckets (usually 1000) (`issue#35973 <https://tracker.ceph.com/issues/35973>`_, `pr#26946 <https://github.com/ceph/ceph/pull/26946>`_, Matt Benjamin)
-* rgw: bug in versioning concurrent, list and get have consistency issue (`issue#38060 <https://tracker.ceph.com/issues/38060>`_, `pr#26548 <https://github.com/ceph/ceph/pull/26548>`_, Wang Hao)
-* rgw: check for non-existent bucket in RGWGetACLs (`issue#38116 <https://tracker.ceph.com/issues/38116>`_, `pr#26530 <https://github.com/ceph/ceph/pull/26530>`_, Matt Benjamin)
-* rgw: data sync drains lease stack on lease failure (`issue#38479 <https://tracker.ceph.com/issues/38479>`_, `pr#26761 <https://github.com/ceph/ceph/pull/26761>`_, Casey Bodley)
-* rgw: fails to start on Fedora 28 from default configuration (`issue#24228 <https://tracker.ceph.com/issues/24228>`_, `pr#26131 <https://github.com/ceph/ceph/pull/26131>`_, Matt Benjamin)
-* rgw: feature -- log successful bucket resharding events (`issue#37647 <https://tracker.ceph.com/issues/37647>`_, `pr#25738 <https://github.com/ceph/ceph/pull/25738>`_, J. Eric Ivancich)
-* rgw: fetch_remote_obj filters out olh attrs (`issue#37792 <https://tracker.ceph.com/issues/37792>`_, `pr#26191 <https://github.com/ceph/ceph/pull/26191>`_, Casey Bodley)
-* rgw: fix cls_bucket_head result order consistency (`issue#38410 <https://tracker.ceph.com/issues/38410>`_, `pr#26546 <https://github.com/ceph/ceph/pull/26546>`_, Tianshan Qu)
-* rgw: fix radosgw linkage with WITH_RADOSGW_BEAST_FRONTEND=OFF (`issue#23680 <https://tracker.ceph.com/issues/23680>`_, `pr#26332 <https://github.com/ceph/ceph/pull/26332>`_, Nathan Cutler)
-* rgw: fix rgw_data_sync_info::json_decode() (`issue#38373 <https://tracker.ceph.com/issues/38373>`_, `pr#26549 <https://github.com/ceph/ceph/pull/26549>`_, Casey Bodley)
-* rgw: handle S3 version 2 pre-signed urls with meta-data (`issue#23470 <https://tracker.ceph.com/issues/23470>`_, `pr#25901 <https://github.com/ceph/ceph/pull/25901>`_, Matt Benjamin)
-* rgw: ldap: fix LDAPAuthEngine::init() when uri !empty() (`issue#38699 <https://tracker.ceph.com/issues/38699>`_, `pr#27173 <https://github.com/ceph/ceph/pull/27173>`_, Matt Benjamin)
-* rgw: multiple es related fixes and improvements (`issue#22877 <https://tracker.ceph.com/issues/22877>`_, `issue#23655 <https://tracker.ceph.com/issues/23655>`_, `issue#38030 <https://tracker.ceph.com/issues/38030>`_, `issue#38028 <https://tracker.ceph.com/issues/38028>`_, `issue#36092 <https://tracker.ceph.com/issues/36092>`_, `pr#26516 <https://github.com/ceph/ceph/pull/26516>`_, Yehuda Sadeh, Abhishek Lekshmanan)
-* rgw multisite: data sync checks empty next_marker for datalog (`issue#39033 <https://tracker.ceph.com/issues/39033>`_, `pr#27299 <https://github.com/ceph/ceph/pull/27299>`_, Casey Bodley)
-* rgw: nfs: skip empty (non-POSIX) path segments (`issue#38744 <https://tracker.ceph.com/issues/38744>`_, `pr#27180 <https://github.com/ceph/ceph/pull/27180>`_, Matt Benjamin)
-* rgw: only update last_trim marker on ENODATA (`issue#38075 <https://tracker.ceph.com/issues/38075>`_, `pr#26619 <https://github.com/ceph/ceph/pull/26619>`_, Casey Bodley)
-* rgw: "radosgw-admin bucket rm ... --purge-objects" can hang (`issue#38007 <https://tracker.ceph.com/issues/38007>`_, `issue#38134 <https://tracker.ceph.com/issues/38134>`_, `pr#26263 <https://github.com/ceph/ceph/pull/26263>`_, J. Eric Ivancich)
-* rgw: rgw_file: only first subuser can be exported to nfs (`issue#37855 <https://tracker.ceph.com/issues/37855>`_, `pr#26677 <https://github.com/ceph/ceph/pull/26677>`_, MinSheng Lin)
-* rgw: rgwgc: process coredump in some special case (`issue#23199 <https://tracker.ceph.com/issues/23199>`_, `pr#25611 <https://github.com/ceph/ceph/pull/25611>`_, zhaokun)
-* rgw: sse-c-fixes (`issue#38700 <https://tracker.ceph.com/issues/38700>`_, `pr#27295 <https://github.com/ceph/ceph/pull/27295>`_, Adam Kupczyk, Casey Bodley, Abhishek Lekshmanan)
-* rgw: sync module: avoid printing attrs of objects in log (`issue#37646 <https://tracker.ceph.com/issues/37646>`_, `pr#27030 <https://github.com/ceph/ceph/pull/27030>`_, Abhishek Lekshmanan)
-* tools: ceph-objectstore-tool: Dump hashinfo (`issue#37597 <https://tracker.ceph.com/issues/37597>`_, `pr#25722 <https://github.com/ceph/ceph/pull/25722>`_, David Zafman)
-
-
-v12.2.11 Luminous
-=================
-
-This is the eleventh bug fix release of the Luminous v12.2.x long term stable
-release series. We recommend that all users upgrade to this release. Please note
-the following precautions while upgrading.
-
-Notable Changes
----------------
-
-* This release fixes the pg log hard limit bug that was introduced in
-  12.2.9, https://tracker.ceph.com/issues/36686.  A flag called
-  `pglog_hardlimit` has been introduced, which is off by default. Enabling
-  this flag will limit the length of the pg log.  In order to enable
-  that, the flag must be set by running `ceph osd set pglog_hardlimit`
-  after completely upgrading to 12.2.11. Once the cluster has this flag
-  set, the length of the pg log will be capped by a hard limit. Once set,
-  this flag *must not* be unset anymore.
-  
-* There have been fixes to RGW dynamic and manual resharding, which no longer
-  leaves behind stale bucket instances to be removed manually. For finding and
-  cleaning up older instances from a reshard a radosgw-admin command `reshard
-  stale-instances list` and `reshard stale-instances rm` should do the necessary
-  cleanup.
-
-* `cephfs-journal-tool` makes rank argument (--rank) mandatory. Rank is
-  of format `filesystem:rank`, where `filesystem` is the CephFS filesystem
-  and `rank` is the MDS rank on which the operation is to be executed. To
-  operate on all ranks, use `all` or `*` as the rank specifier. Note that,
-  operations that dump journal information to file will now dump to per-rank
-  suffixed dump files. Importing journal information from dump files is
-  disallowed if operation is targetted for all ranks.
-
-* CVE-2018-14662: mon: limit caps allowed to access the config store
-
-* CVE-2018-16846: rgw: enforce bounds on max-keys/max-uploads/max-parts (`issue#35994 <http://tracker.ceph.com/issues/35994>`)
-
-* CVE-2018-16889: rgw: sanitize customer encryption keys from log output in v4 auth (`issue#37847 <http://tracker.ceph.com/issues/37847>`)
-
-Changelog
----------
-
-* build/ops: cmake: link unittest_compression against gtest (`pr#24921 <https://github.com/ceph/ceph/pull/24921>`_, Willem Jan Withagen)
-* build/ops: run-make-check.sh ccache tweaks (`issue#24826 <http://tracker.ceph.com/issues/24826>`_, `issue#24817 <http://tracker.ceph.com/issues/24817>`_, `issue#24777 <http://tracker.ceph.com/issues/24777>`_, `pr#23902 <https://github.com/ceph/ceph/pull/23902>`_, Nathan Cutler, Erwan Velu)
-* ceph-bluestore-tool: fix set label functionality for specific keys (`pr#25187 <https://github.com/ceph/ceph/pull/25187>`_, Igor Fedotov)
-* ceph-create-keys: fix octal notation for Python 3 without losing compatibility with Python 2 (`issue#37643 <http://tracker.ceph.com/issues/37643>`_, `pr#25532 <https://github.com/ceph/ceph/pull/25532>`_, James Page)
-* cephfs: ceph-volume-client: allow setting mode of CephFS volumes (`pr#25407 <https://github.com/ceph/ceph/pull/25407>`_, Tom Barron)
-* cephfs-journal-tool: make --rank argument mandatory (`pr#24728 <https://github.com/ceph/ceph/pull/24728>`_, Venky Shankar)
-* cephfs: mgr/status: fix fs status subcommand did not show standby-replay MDS' perf info (`issue#36575 <http://tracker.ceph.com/issues/36575>`_, `issue#36399 <http://tracker.ceph.com/issues/36399>`_, `pr#25032 <https://github.com/ceph/ceph/pull/25032>`_, Zhi Zhang)
-* cephfs: race of updating wanted caps (`issue#37635 <http://tracker.ceph.com/issues/37635>`_, `issue#37464 <http://tracker.ceph.com/issues/37464>`_, `pr#25762 <https://github.com/ceph/ceph/pull/25762>`_, "Yan, Zheng")
-* ceph-volume: Adapt code to support Python3 (`pr#26030 <https://github.com/ceph/ceph/pull/26030>`_, Volker Theile)
-* ceph-volume add device_id to inventory listing (`pr#25350 <https://github.com/ceph/ceph/pull/25350>`_, Jan Fajerski)
-* ceph-volume: enable device discards (`issue#36532 <http://tracker.ceph.com/issues/36532>`_, `pr#25748 <https://github.com/ceph/ceph/pull/25748>`_, Jonas Jelten)
-* ceph-volume: fix Batch object in py3 environments (`pr#25552 <https://github.com/ceph/ceph/pull/25552>`_, Jan Fajerski)
-* ceph-volume: fix JSON output in `inventory` (`issue#37390 <http://tracker.ceph.com/issues/37390>`_, `pr#25922 <https://github.com/ceph/ceph/pull/25922>`_, Sebastian Wagner)
-* ceph-volume: Fix TypeError: join() takes exactly one argument (2 given) (`issue#37595 <http://tracker.ceph.com/issues/37595>`_, `pr#25772 <https://github.com/ceph/ceph/pull/25772>`_, Sebastian Wagner)
-* ceph-volume fix TypeError on dmcrypt when using Python3 (`pr#26114 <https://github.com/ceph/ceph/pull/26114>`_, Alfredo Deza)
-* ceph-volume: introduce class hierachy for strategies (`pr#25553 <https://github.com/ceph/ceph/pull/25553>`_, Jan Fajerski, Alfredo Deza)
-* ceph-volume: mark a device not available if it belongs to ceph-disk (`pr#26117 <https://github.com/ceph/ceph/pull/26117>`_, Andrew Schoen)
-* ceph-volume normalize comma to dot for string to int conversions (`issue#37442 <http://tracker.ceph.com/issues/37442>`_, `pr#25776 <https://github.com/ceph/ceph/pull/25776>`_, Alfredo Deza)
-* ceph-volume: set permissions right before prime-osd-dir (`issue#37486 <http://tracker.ceph.com/issues/37486>`_, `pr#25778 <https://github.com/ceph/ceph/pull/25778>`_, Andrew Schoen, Alfredo Deza)
-* ceph-volume tests/functional declare ceph-ansible roles instead of importing them (`issue#37805 <http://tracker.ceph.com/issues/37805>`_, `pr#25838 <https://github.com/ceph/ceph/pull/25838>`_, Alfredo Deza)
-* ceph-volume zap devices associated with an OSD ID and/or OSD FSID (`pr#26014 <https://github.com/ceph/ceph/pull/26014>`_, Alfredo Deza)
-* ceph-volume: zap: improve zapping to remove all partitions and all LVs, encrypted or not (`issue#37449 <http://tracker.ceph.com/issues/37449>`_, `pr#25352 <https://github.com/ceph/ceph/pull/25352>`_, Alfredo Deza)
-* cli: dump osd-fsid as part of osd find <id> (`issue#37966 <http://tracker.ceph.com/issues/37966>`_, `pr#26036 <https://github.com/ceph/ceph/pull/26036>`_, Noah Watkins)
-* client: do not move f->pos untill success write (`issue#37631 <http://tracker.ceph.com/issues/37631>`_, `pr#25684 <https://github.com/ceph/ceph/pull/25684>`_, Junhui Tang)
-* client: explicitly show blacklisted state via asok status command (`issue#36456 <http://tracker.ceph.com/issues/36456>`_, `issue#36352 <http://tracker.ceph.com/issues/36352>`_, `pr#24994 <https://github.com/ceph/ceph/pull/24994>`_, Jonathan Brielmaier, Zhi Zhang)
-* client: fix fuse client hang because its pipe to mds is not ok4 (`issue#37829 <http://tracker.ceph.com/issues/37829>`_, `issue#36079 <http://tracker.ceph.com/issues/36079>`_, `pr#25904 <https://github.com/ceph/ceph/pull/25904>`_, Guan yunfei)
-* client: request next osdmap for blacklisted client (`issue#36668 <http://tracker.ceph.com/issues/36668>`_, `issue#36691 <http://tracker.ceph.com/issues/36691>`_, `pr#24986 <https://github.com/ceph/ceph/pull/24986>`_, Zhi Zhang)
-* common: auth/AuthSessionHandler: no handler if no session key (`issue#37427 <http://tracker.ceph.com/issues/37427>`_, `issue#36443 <http://tracker.ceph.com/issues/36443>`_, `pr#25297 <https://github.com/ceph/ceph/pull/25297>`_, Sage Weil)
-* common/blkdev, ceph-volume: improve get_device_id (`pr#25752 <https://github.com/ceph/ceph/pull/25752>`_, Sage Weil)
-* common: fix memory leaks in WeightedPriorityQueue (`issue#37429 <http://tracker.ceph.com/issues/37429>`_, `issue#36248 <http://tracker.ceph.com/issues/36248>`_, `pr#25296 <https://github.com/ceph/ceph/pull/25296>`_, Radoslaw Zarzynski)
-* common: (mon) command sanitization accepts floats when Int type is defined resulting in exception fault in ceph-mon (`issue#26919 <http://tracker.ceph.com/issues/26919>`_, `pr#24374 <https://github.com/ceph/ceph/pull/24374>`_, Sage Weil)
-* common: shut up some warnings (`pr#24648 <https://github.com/ceph/ceph/pull/24648>`_, Kefu Chai)
-* config: drop config::lock when invoking config observer (`issue#37762 <http://tracker.ceph.com/issues/37762>`_, `pr#25833 <https://github.com/ceph/ceph/pull/25833>`_, Kefu Chai, Venky Shankar)
-* core: bluestore: rename does not old ref to replacement onode at old name (`issue#36541 <http://tracker.ceph.com/issues/36541>`_, `issue#36638 <http://tracker.ceph.com/issues/36638>`_, `pr#24989 <https://github.com/ceph/ceph/pull/24989>`_, Jonathan Brielmaier, Sage Weil)
-* core: enable the pg deletion process to be throttled (`issue#36321 <http://tracker.ceph.com/issues/36321>`_, `pr#24501 <https://github.com/ceph/ceph/pull/24501>`_, David Zafman)
-* core: mgr crash on scrub of unconnected osd (`issue#36110 <http://tracker.ceph.com/issues/36110>`_, `issue#36464 <http://tracker.ceph.com/issues/36464>`_, `pr#25030 <https://github.com/ceph/ceph/pull/25030>`_, Sage Weil)
-* core: mon osdmap cash too small during upgrade to mimic (`issue#36506 <http://tracker.ceph.com/issues/36506>`_, `pr#25021 <https://github.com/ceph/ceph/pull/25021>`_, Sage Weil)
-* core: Objecter: add ignore cache flag if got redirect reply (`issue#36657 <http://tracker.ceph.com/issues/36657>`_, `pr#25074 <https://github.com/ceph/ceph/pull/25074>`_, Iain Buclaw, Jonathan Brielmaier)
-* core: os/bluestore_tool: fix bluefs expand (`pr#25384 <https://github.com/ceph/ceph/pull/25384>`_, Igor Fedotov)
-* core: rados rm --force-full is blocked when cluster is in full status (`issue#36436 <http://tracker.ceph.com/issues/36436>`_, `pr#25018 <https://github.com/ceph/ceph/pull/25018>`_, Yang Honggang)
-* crushtool: add --reclassify operation to convert legacy crush maps to use device classes (`pr#25307 <https://github.com/ceph/ceph/pull/25307>`_, Sage Weil)
-* debian: correct ceph-common relationship with older radosgw package (`pr#24997 <https://github.com/ceph/ceph/pull/24997>`_, Matthew Vernon)
-* doc: broken link on troubleshooting-mon page (`pr#25500 <https://github.com/ceph/ceph/pull/25500>`_, James McClune)
-* doc: fix broken fstab url in cephfs/fuse (`issue#36286 <http://tracker.ceph.com/issues/36286>`_, `pr#24434 <https://github.com/ceph/ceph/pull/24434>`_, Jos Collin)
-* doc: Fix typo error on cephfs/fuse/ (`issue#36180 <http://tracker.ceph.com/issues/36180>`_, `issue#36309 <http://tracker.ceph.com/issues/36309>`_, `pr#24752 <https://github.com/ceph/ceph/pull/24752>`_, Karun Josy)
-* doc: Put command template into literal block (`pr#25001 <https://github.com/ceph/ceph/pull/25001>`_, Alexey Stupnikov)
-* doc/rados: update bluestore provisioning and autotuning docs (`issue#37341 <http://tracker.ceph.com/issues/37341>`_, `pr#25284 <https://github.com/ceph/ceph/pull/25284>`_, Mark Nelson)
-* doc: show edit on github links and version warnings (`pr#25267 <https://github.com/ceph/ceph/pull/25267>`_, Neha Ojha, Noah Watkins)
-* doc/user-management: Remove obsolete reset caps command (`issue#37663 <http://tracker.ceph.com/issues/37663>`_, `pr#25609 <https://github.com/ceph/ceph/pull/25609>`_, Brad Hubbard)
-* examples: fix link order in librados example Makefile (`issue#37795 <http://tracker.ceph.com/issues/37795>`_, `pr#25829 <https://github.com/ceph/ceph/pull/25829>`_, Mahati Chamarthy)
-* extend reconnect period when mds is busy (`issue#37739 <http://tracker.ceph.com/issues/37739>`_, `pr#25784 <https://github.com/ceph/ceph/pull/25784>`_, "Yan, Zheng")
-* fsck: cid is improperly matched to oid (`issue#36145 <http://tracker.ceph.com/issues/36145>`_, `issue#32731 <http://tracker.ceph.com/issues/32731>`_, `pr#24705 <https://github.com/ceph/ceph/pull/24705>`_, Sage Weil)
-* libcephfs: expose CEPH_SETATTR_MTIME_NOW and CEPH_SETATTR_ATIME_NOW (`issue#36206 <http://tracker.ceph.com/issues/36206>`_, `issue#35961 <http://tracker.ceph.com/issues/35961>`_, `pr#24465 <https://github.com/ceph/ceph/pull/24465>`_, Zhu Shangzhong)
-* librbd: fix missing unblock_writes if shrink is not allowed (`issue#37363 <http://tracker.ceph.com/issues/37363>`_, `issue#36778 <http://tracker.ceph.com/issues/36778>`_, `pr#25253 <https://github.com/ceph/ceph/pull/25253>`_, runsisi)
-* librbd: reset snaps in rbd_snap_list() (`issue#37535 <http://tracker.ceph.com/issues/37535>`_, `issue#37508 <http://tracker.ceph.com/issues/37508>`_, `pr#25458 <https://github.com/ceph/ceph/pull/25458>`_, Kefu Chai)
-* mds: add "drop cache" command (`issue#36695 <http://tracker.ceph.com/issues/36695>`_, `issue#36281 <http://tracker.ceph.com/issues/36281>`_, `pr#24468 <https://github.com/ceph/ceph/pull/24468>`_, Rishabh Dave, Patrick Donnelly, Venky Shankar)
-* mds: clean up log messages for standby-replay (`pr#25804 <https://github.com/ceph/ceph/pull/25804>`_, Patrick Donnelly)
-* mds: create heartbeat grace config option (`issue#37674 <http://tracker.ceph.com/issues/37674>`_, `issue#37820 <http://tracker.ceph.com/issues/37820>`_, `pr#25889 <https://github.com/ceph/ceph/pull/25889>`_, Patrick Donnelly)
-* mds: directories pinned keep being replicated back and forth between exporting mds and importing mds (`issue#37368 <http://tracker.ceph.com/issues/37368>`_, `issue#37606 <http://tracker.ceph.com/issues/37606>`_, `pr#25522 <https://github.com/ceph/ceph/pull/25522>`_, Xuehan Xu)
-* mds: disallow dumping huge caches to formatter (`issue#37608 <http://tracker.ceph.com/issues/37608>`_, `pr#25567 <https://github.com/ceph/ceph/pull/25567>`_, Venky Shankar)
-* mds: do not call Journaler::_trim twice (`issue#37566 <http://tracker.ceph.com/issues/37566>`_, `issue#37629 <http://tracker.ceph.com/issues/37629>`_, `pr#25562 <https://github.com/ceph/ceph/pull/25562>`_, Tang Junhui)
-* mds: fix bug filelock stuck at LOCK_XSYN leading client can't read data (`issue#37700 <http://tracker.ceph.com/issues/37700>`_, `issue#37333 <http://tracker.ceph.com/issues/37333>`_, `pr#25677 <https://github.com/ceph/ceph/pull/25677>`_, Guan yunfei)
-* mds: fix incorrect l_pq_executing_ops statistics when meet an invalid item in purge queue (`issue#37627 <http://tracker.ceph.com/issues/37627>`_, `issue#37567 <http://tracker.ceph.com/issues/37567>`_, `pr#25560 <https://github.com/ceph/ceph/pull/25560>`_, Junhui Tang)
-* mds: fix infinite loop in OpTracker::check_ops_in_flight (`issue#37977 <http://tracker.ceph.com/issues/37977>`_, `pr#26048 <https://github.com/ceph/ceph/pull/26048>`_, "Yan, Zheng")
-* mds: fix infinite loop in OpTracker::check_ops_in_flight (`issue#37977 <http://tracker.ceph.com/issues/37977>`_, `pr#26088 <https://github.com/ceph/ceph/pull/26088>`_, "Yan, Zheng")
-* mds: fix mds damaged due to unexpected journal length (`issue#36200 <http://tracker.ceph.com/issues/36200>`_, `pr#24440 <https://github.com/ceph/ceph/pull/24440>`_, Zhi Zhang)
-* mds: migrate strays part by part when shutdown mds (`issue#26926 <http://tracker.ceph.com/issues/26926>`_, `issue#32091 <http://tracker.ceph.com/issues/32091>`_, `pr#24324 <https://github.com/ceph/ceph/pull/24324>`_, "Yan, Zheng")
-* MDSMonitor: allow beacons from stopping MDS that was laggy (`issue#37737 <http://tracker.ceph.com/issues/37737>`_, `pr#25686 <https://github.com/ceph/ceph/pull/25686>`_, Patrick Donnelly)
-* mds: obsolete MDSMap option configs (`issue#37540 <http://tracker.ceph.com/issues/37540>`_, `pr#25431 <https://github.com/ceph/ceph/pull/25431>`_, Patrick Donnelly)
-* mds: purge queue recovery hangs during boot if PQ journal is damaged (`issue#37899 <http://tracker.ceph.com/issues/37899>`_, `issue#37543 <http://tracker.ceph.com/issues/37543>`_, `pr#25968 <https://github.com/ceph/ceph/pull/25968>`_, Patrick Donnelly)
-* mds: PurgeQueue write error handler does not handle EBLACKLISTED (`issue#37604 <http://tracker.ceph.com/issues/37604>`_, `pr#25524 <https://github.com/ceph/ceph/pull/25524>`_, Patrick Donnelly)
-* mds: rctime not set on system inode (root) at startup (`issue#36221 <http://tracker.ceph.com/issues/36221>`_, `issue#36460 <http://tracker.ceph.com/issues/36460>`_, `pr#25043 <https://github.com/ceph/ceph/pull/25043>`_, Patrick Donnelly)
-* mds: remove duplicated l_mdc_num_strays perfcounter set (`issue#37633 <http://tracker.ceph.com/issues/37633>`_, `issue#37516 <http://tracker.ceph.com/issues/37516>`_, `pr#25682 <https://github.com/ceph/ceph/pull/25682>`_, Zhi Zhang)
-* mds: severe internal fragment when decoding xattr_map from log event (`issue#37399 <http://tracker.ceph.com/issues/37399>`_, `issue#37602 <http://tracker.ceph.com/issues/37602>`_, `pr#25520 <https://github.com/ceph/ceph/pull/25520>`_, "Yan, Zheng")
-* mds: "src/mds/MDLog.cc: 281: FAILED ceph_assert(!capped)" during max_mds thrashing (`issue#36350 <http://tracker.ceph.com/issues/36350>`_, `issue#37092 <http://tracker.ceph.com/issues/37092>`_, `pr#25826 <https://github.com/ceph/ceph/pull/25826>`_, "Yan, Zheng")
-* mgr/balancer: add cmd to list all plans (`issue#37420 <http://tracker.ceph.com/issues/37420>`_, `pr#25259 <https://github.com/ceph/ceph/pull/25259>`_, Yang Honggang)
-* mgr/balancer: add crush_compat_metrics param (`issue#37413 <http://tracker.ceph.com/issues/37413>`_, `pr#25257 <https://github.com/ceph/ceph/pull/25257>`_, Dan van der Ster)
-* mgr: balancer: python 3 compat fixes (`issue#37416 <http://tracker.ceph.com/issues/37416>`_, `pr#25258 <https://github.com/ceph/ceph/pull/25258>`_, Noah Watkins)
-* mgr: fix crash due to multiple sessions from daemons with same name (`pr#25867 <https://github.com/ceph/ceph/pull/25867>`_, Mykola Golub)
-* mgr: hold lock while accessing the request list and submitting request (`pr#25047 <https://github.com/ceph/ceph/pull/25047>`_, Jerry Lee)
-* mgr: Module 'influx' has failed (`issue#25201 <http://tracker.ceph.com/issues/25201>`_, `pr#25184 <https://github.com/ceph/ceph/pull/25184>`_, Nathan Cutler, Wido den Hollander)
-* mgr: prometheus: added bluestore db and wal devices to ceph_disk_occupation metric.// (`issue#37362 <http://tracker.ceph.com/issues/37362>`_, `pr#25216 <https://github.com/ceph/ceph/pull/25216>`_, Konstantin Shalygin)
-* mgr: race between daemon state and service map in 'service status' (`issue#37478 <http://tracker.ceph.com/issues/37478>`_, `issue#36656 <http://tracker.ceph.com/issues/36656>`_, `pr#25369 <https://github.com/ceph/ceph/pull/25369>`_, Mykola Golub)
-* mgr: [restful] deep_scrub is not a valid OSD command (`issue#36720 <http://tracker.ceph.com/issues/36720>`_, `issue#36750 <http://tracker.ceph.com/issues/36750>`_, `pr#25041 <https://github.com/ceph/ceph/pull/25041>`_, Boris Ranto)
-* mon: mark REMOVE_SNAPS messages as no_reply (`issue#37568 <http://tracker.ceph.com/issues/37568>`_, `issue#37694 <http://tracker.ceph.com/issues/37694>`_, `pr#25779 <https://github.com/ceph/ceph/pull/25779>`_, "Yan, Zheng")
-* mon/OSDMonitor: do not populate void pg_temp into nextmap (`issue#37811 <http://tracker.ceph.com/issues/37811>`_, `pr#25845 <https://github.com/ceph/ceph/pull/25845>`_, Aleksei Zakharov)
-* mon: shutdown messenger early to avoid accessing deleted logger (`issue#37780 <http://tracker.ceph.com/issues/37780>`_, `issue#37813 <http://tracker.ceph.com/issues/37813>`_, `pr#25847 <https://github.com/ceph/ceph/pull/25847>`_, ningtao)
-* os/bluestore: avoid frequent allocator dump on bluefs rebalance failure (`pr#24543 <https://github.com/ceph/ceph/pull/24543>`_, Igor Fedotov)
-* os/bluestore/BlueStore.cc: 1025: FAILED assert(buffer_bytes >= b->length) from ObjectStore/StoreTest.ColSplitTest2/2 (`issue#26943 <http://tracker.ceph.com/issues/26943>`_, `issue#24439 <http://tracker.ceph.com/issues/24439>`_, `pr#24992 <https://github.com/ceph/ceph/pull/24992>`_, Jonathan Brielmaier, Sage Weil)
-* os/bluestore: handle spurious read errors (`issue#22464 <http://tracker.ceph.com/issues/22464>`_, `pr#24649 <https://github.com/ceph/ceph/pull/24649>`_, Paul Emmerich)
-* osd: backport recent upmap fixes (`pr#25418 <https://github.com/ceph/ceph/pull/25418>`_, ningtao, xie xingguo)
-* osdc/Objecter: update op_target_t::paused in _calc_target (`issue#37398 <http://tracker.ceph.com/issues/37398>`_, `issue#37553 <http://tracker.ceph.com/issues/37553>`_, `pr#25719 <https://github.com/ceph/ceph/pull/25719>`_, Song Shun, runsisi)
-* osdc: reduce ObjectCacher's memory fragments (`issue#36642 <http://tracker.ceph.com/issues/36642>`_, `issue#36192 <http://tracker.ceph.com/issues/36192>`_, `pr#24872 <https://github.com/ceph/ceph/pull/24872>`_, "Yan, Zheng")
-* osd: failed assert when osd_memory_target options mismatch (`issue#37697 <http://tracker.ceph.com/issues/37697>`_, `issue#37507 <http://tracker.ceph.com/issues/37507>`_, `pr#25604 <https://github.com/ceph/ceph/pull/25604>`_, xie xingguo)
-* osd/mon: pg log hard limit with upgrades fixed (`issue#37903 <http://tracker.ceph.com/issues/37903>`_, `issue#21416 <http://tracker.ceph.com/issues/21416>`_, `pr#25949 <https://github.com/ceph/ceph/pull/25949>`_, Neha Ojha, xie xingguo)
-* osd/OSD.cc: log slow requests in OSD logs (`pr#25824 <https://github.com/ceph/ceph/pull/25824>`_, Neha Ojha)
-* osd/OSDMap: cancel mapping if target osd is out (`issue#37501 <http://tracker.ceph.com/issues/37501>`_, `pr#25698 <https://github.com/ceph/ceph/pull/25698>`_, ningtao, xie xingguo)
-* osd: potential deadlock in PG::_scan_snaps when repairing snap mapper (`issue#36630 <http://tracker.ceph.com/issues/36630>`_, `pr#24833 <https://github.com/ceph/ceph/pull/24833>`_, Mykola Golub)
-* osd: Prioritize user specified scrubs (`issue#37343 <http://tracker.ceph.com/issues/37343>`_, `issue#37269 <http://tracker.ceph.com/issues/37269>`_, `pr#25514 <https://github.com/ceph/ceph/pull/25514>`_, kungf, David Zafman)
-* osd: race condition opening heartbeat connection (`issue#36602 <http://tracker.ceph.com/issues/36602>`_, `issue#36636 <http://tracker.ceph.com/issues/36636>`_, `pr#25035 <https://github.com/ceph/ceph/pull/25035>`_, Sage Weil)
-* osd: RBD client IOPS pool stats are incorrect (2x higher; includes IO hints as an op) (`issue#24909 <http://tracker.ceph.com/issues/24909>`_, `issue#36556 <http://tracker.ceph.com/issues/36556>`_, `pr#25025 <https://github.com/ceph/ceph/pull/25025>`_, Jason Dillaman)
-* pybind/mgr/status: fix ceph fs status in py3 environments (`issue#37573 <http://tracker.ceph.com/issues/37573>`_, `issue#37625 <http://tracker.ceph.com/issues/37625>`_, `pr#25695 <https://github.com/ceph/ceph/pull/25695>`_, Jan Fajerski)
-* rbd: pybind: added missing RBD_FLAG_FAST_DIFF_INVALID constant (`issue#36407 <http://tracker.ceph.com/issues/36407>`_, `pr#25006 <https://github.com/ceph/ceph/pull/25006>`_, Jason Dillaman)
-* rbd: [rbd-mirror] periodic mirror status timer might fail to be scheduled (`issue#36500 <http://tracker.ceph.com/issues/36500>`_, `issue#36554 <http://tracker.ceph.com/issues/36554>`_, `pr#24917 <https://github.com/ceph/ceph/pull/24917>`_, Nathan Cutler, Jason Dillaman)
-* rgw: add ssl support to beast frontend (`issue#22832 <http://tracker.ceph.com/issues/22832>`_, `issue#24358 <http://tracker.ceph.com/issues/24358>`_, `pr#24621 <https://github.com/ceph/ceph/pull/24621>`_, Casey Bodley)
-* rgw: apply quota config to users created via external auth (`issue#24595 <http://tracker.ceph.com/issues/24595>`_, `issue#36222 <http://tracker.ceph.com/issues/36222>`_, `pr#24547 <https://github.com/ceph/ceph/pull/24547>`_, Casey Bodley, Matt Benjamin)
-* rgw: beast frontend fails to parse ipv6 endpoints (`issue#36733 <http://tracker.ceph.com/issues/36733>`_, `issue#36662 <http://tracker.ceph.com/issues/36662>`_, `pr#25512 <https://github.com/ceph/ceph/pull/25512>`_, Casey Bodley)
-* rgw: bucket resharding fixes (`issue#37446 <http://tracker.ceph.com/issues/37446>`_, `issue#36688 <http://tracker.ceph.com/issues/36688>`_, `pr#25326 <https://github.com/ceph/ceph/pull/25326>`_, Orit Wasserman, Abhishek Lekshmanan, J. Eric Ivancich)
-* rgw: catch exceptions from librados::NObjectIterator (`issue#37091 <http://tracker.ceph.com/issues/37091>`_, `issue#37475 <http://tracker.ceph.com/issues/37475>`_, `pr#25289 <https://github.com/ceph/ceph/pull/25289>`_, Casey Bodley)
-* rgw: Don't treat colons specially in resource part of ARN (`issue#37482 <http://tracker.ceph.com/issues/37482>`_, `issue#23817 <http://tracker.ceph.com/issues/23817>`_, `pr#25387 <https://github.com/ceph/ceph/pull/25387>`_, Adam C. Emerson)
-* rgw: es fixes for working with nfs ganesha (`issue#37349 <http://tracker.ceph.com/issues/37349>`_, `issue#36233 <http://tracker.ceph.com/issues/36233>`_, `issue#22758 <http://tracker.ceph.com/issues/22758>`_, `pr#25444 <https://github.com/ceph/ceph/pull/25444>`_, Abhishek Lekshmanan)
-* rgw_file: user info never synced since librgw init (`issue#37549 <http://tracker.ceph.com/issues/37549>`_, `pr#25484 <https://github.com/ceph/ceph/pull/25484>`_, Tao Chen)
-* rgw: fixes for zone deletion (`issue#37328 <http://tracker.ceph.com/issues/37328>`_, `issue#37466 <http://tracker.ceph.com/issues/37466>`_, `pr#25320 <https://github.com/ceph/ceph/pull/25320>`_, Abhishek Lekshmanan)
-* rgw: fix max-size in radosgw-admin and REST Admin API (`issue#37519 <http://tracker.ceph.com/issues/37519>`_, `pr#25448 <https://github.com/ceph/ceph/pull/25448>`_, Nick Erdmann)
-* rgw: fix version bucket stats (`issue#37563 <http://tracker.ceph.com/issues/37563>`_, `issue#21429 <http://tracker.ceph.com/issues/21429>`_, `pr#25644 <https://github.com/ceph/ceph/pull/25644>`_, Shasha Lu)
-* rgw: librgw: crashes in multisite configuration (`issue#36302 <http://tracker.ceph.com/issues/36302>`_, `issue#36414 <http://tracker.ceph.com/issues/36414>`_, `pr#24909 <https://github.com/ceph/ceph/pull/24909>`_, Casey Bodley)
-* rgw: multisite: sync gets stuck retrying deletes that fail with ERR_PRECONDITION_FAILED (`issue#37551 <http://tracker.ceph.com/issues/37551>`_, `issue#37448 <http://tracker.ceph.com/issues/37448>`_, `pr#25506 <https://github.com/ceph/ceph/pull/25506>`_, Casey Bodley)
-* rgw: radosgw-admin: translate reshard status codes (trivial) (`issue#37284 <http://tracker.ceph.com/issues/37284>`_, `issue#36486 <http://tracker.ceph.com/issues/36486>`_, `pr#25195 <https://github.com/ceph/ceph/pull/25195>`_, Matt Benjamin)
-* rgw: rgw-admin: reshard add can add a non-existent bucket (`issue#36449 <http://tracker.ceph.com/issues/36449>`_, `issue#36757 <http://tracker.ceph.com/issues/36757>`_, `pr#25088 <https://github.com/ceph/ceph/pull/25088>`_, Jonathan Brielmaier, Abhishek Lekshmanan)
-* rgw: SSE encryption does not detect ssl termination in proxy (`issue#36644 <http://tracker.ceph.com/issues/36644>`_, `issue#27221 <http://tracker.ceph.com/issues/27221>`_, `pr#24944 <https://github.com/ceph/ceph/pull/24944>`_, Jonathan Brielmaier, Casey Bodley)
-* rpm: Use hardened LDFLAGS (`issue#36316 <http://tracker.ceph.com/issues/36316>`_, `issue#36391 <http://tracker.ceph.com/issues/36391>`_, `pr#25173 <https://github.com/ceph/ceph/pull/25173>`_, Boris Ranto)
-
-
-v12.2.10 Luminous
-=================
-
-This is the tenth bug fix release of the Luminous v12.2.x long term stable
-release series. The previous release, v12.2.9, introduced the PG hard-limit
-patches which were found to cause an issue in certain upgrade scenarios, and
-this release was expedited to revert those patches. If you already successfully
-upgraded to v12.2.9, you should **not** upgrade to v12.2.10, but rather **wait**
-for a release in which http://tracker.ceph.com/issues/36686 is addressed. All
-other users are encouraged to upgrade to this release.
-
-Notable Changes
----------------
-
-OSD
-
-* This release reverts the PG hard-limit patches added in v12.2.9.
-
-Changelog
----------
-
-* ceph-volume: add some choose_disk capabilities (`issue#36446 <http://tracker.ceph.com/issues/36446>`_, `pr#24783 <https://github.com/ceph/ceph/pull/24783>`_, Erwan Velu)
-* ceph-volume: remove version reporting from help menu (`issue#36386 <http://tracker.ceph.com/issues/36386>`_, `pr#24754 <https://github.com/ceph/ceph/pull/24754>`_, Alfredo Deza)
-* ceph-volume: systemd import main so console_scripts work for executable (`issue#36648 <http://tracker.ceph.com/issues/36648>`_, `pr#24853 <https://github.com/ceph/ceph/pull/24853>`_, Alfredo Deza)
-* ceph-volume: tests install ceph-ansible's requirements.txt dependencies (`issue#36672 <http://tracker.ceph.com/issues/36672>`_, `pr#24960 <https://github.com/ceph/ceph/pull/24960>`_, Alfredo Deza)
-* ceph-volume: util.encryption don't push stderr to terminal (`issue#36246 <http://tracker.ceph.com/issues/36246>`_, `pr#24827 <https://github.com/ceph/ceph/pull/24827>`_, Alfredo Deza)
-* ceph-volume: util.encryption robust blkid+lsblk detection of lockbox (`pr#24981 <https://github.com/ceph/ceph/pull/24981>`_, Alfredo Deza)
-* ceph-volume: use console_scripts (`issue#36601 <http://tracker.ceph.com/issues/36601>`_, `pr#24837 <https://github.com/ceph/ceph/pull/24837>`_, Mehdi Abaakouk)
-* OSDMapMapping does not handle active.size() > pool size (`issue#26866 <http://tracker.ceph.com/issues/26866>`_, `issue#35935 <http://tracker.ceph.com/issues/35935>`_, `pr#24432 <https://github.com/ceph/ceph/pull/24432>`_, Sage Weil)
-* PG: add custom_reaction Backfilled and release reservations (`issue#24333 <http://tracker.ceph.com/issues/24333>`_, `pr#23493 <https://github.com/ceph/ceph/pull/23493>`_, Neha Ojha)
-* Revert "PG: add custom_reaction Backfilled and release reservations after backfill (`pr#24902 <https://github.com/ceph/ceph/pull/24902>`_, Neha Ojha)
-* Revert pg log limit changes (`issue#36686 <http://tracker.ceph.com/issues/36686>`_, `pr#24903 <https://github.com/ceph/ceph/pull/24903>`_, Neha Ojha)
-* backport and other test fixes for osd-scrub-repair.sh (`issue#35845 <http://tracker.ceph.com/issues/35845>`_, `issue#36393 <http://tracker.ceph.com/issues/36393>`_, `pr#24532 <https://github.com/ceph/ceph/pull/24532>`_, Xinying Song, David Zafman)
-* ceph-volume tests.systemd update imports for systemd module (`issue#36704 <http://tracker.ceph.com/issues/36704>`_, `pr#24958 <https://github.com/ceph/ceph/pull/24958>`_, Alfredo Deza)
-* ceph-volume: adds a --prepare flag to `lvm batch` (`issue#36363 <http://tracker.ceph.com/issues/36363>`_, `pr#24759 <https://github.com/ceph/ceph/pull/24759>`_, Andrew Schoen)
-* cls/user: cls_user_remove_bucket writes modified header (`issue#36534 <http://tracker.ceph.com/issues/36534>`_, `issue#36496 <http://tracker.ceph.com/issues/36496>`_, `pr#24855 <https://github.com/ceph/ceph/pull/24855>`_, Casey Bodley)
-* core: by pass cache if performing deep scrub (`issue#35067 <http://tracker.ceph.com/issues/35067>`_, `pr#24802 <https://github.com/ceph/ceph/pull/24802>`_, Xiaoguang Wang)
-* crush/CrushWrapper: fix crush tree json dumper (`issue#36149 <http://tracker.ceph.com/issues/36149>`_, `pr#24482 <https://github.com/ceph/ceph/pull/24482>`_, Oshyn Song)
-* ec: src/common/interval_map.h: 161: FAILED assert(len > 0) (`issue#21931 <http://tracker.ceph.com/issues/21931>`_, `issue#22330 <http://tracker.ceph.com/issues/22330>`_, `pr#24582 <https://github.com/ceph/ceph/pull/24582>`_, Neha Ojha)
-* gperftools-libs-2.6.1-1 or newer required for binaries linked against corresponding version at build time (`issue#36552 <http://tracker.ceph.com/issues/36552>`_, `issue#23657 <http://tracker.ceph.com/issues/23657>`_, `issue#36558 <http://tracker.ceph.com/issues/36558>`_, `issue#36508 <http://tracker.ceph.com/issues/36508>`_, `pr#24706 <https://github.com/ceph/ceph/pull/24706>`_, Brad Hubbard)
-* osd: add creating to pg_string_state (`issue#36174 <http://tracker.ceph.com/issues/36174>`_, `issue#36297 <http://tracker.ceph.com/issues/36297>`_, `pr#24602 <https://github.com/ceph/ceph/pull/24602>`_, Dan van der Ster)
-* osd: cast 'whoami' to unsigned so it can be used as the seed for RNG (`issue#26890 <http://tracker.ceph.com/issues/26890>`_, `pr#24659 <https://github.com/ceph/ceph/pull/24659>`_, Kefu Chai)
-* osd: get loadavg per cpu for scrub load threshold check (`pr#24593 <https://github.com/ceph/ceph/pull/24593>`_, kungf)
-* osdc/Objecter: possible race condition with connection reset (`issue#36183 <http://tracker.ceph.com/issues/36183>`_, `issue#36295 <http://tracker.ceph.com/issues/36295>`_, `pr#24574 <https://github.com/ceph/ceph/pull/24574>`_, Jason Dillaman)
-* qa: add test that builds example librados programs (`issue#36229 <http://tracker.ceph.com/issues/36229>`_, `issue#15100 <http://tracker.ceph.com/issues/15100>`_, `pr#24538 <https://github.com/ceph/ceph/pull/24538>`_, Nathan Cutler)
-* qa/ceph-ansible: Specify stable-3.2 branch (`issue#37331 <https://tracker.ceph.com/issues/37331>`_, `pr#25170 <https://github.com/ceph/ceph/pull/25170>`_, Brad Hubbard)
-* rgw/beast: drop privileges after binding ports (`issue#36041 <http://tracker.ceph.com/issues/36041>`_, `pr#24454 <https://github.com/ceph/ceph/pull/24454>`_, Paul Emmerich)
-* rgw: RGWAsyncGetBucketInstanceInfo does not access coroutine memory (`issue#35812 <http://tracker.ceph.com/issues/35812>`_, `issue#36212 <http://tracker.ceph.com/issues/36212>`_, `pr#24507 <https://github.com/ceph/ceph/pull/24507>`_, Casey Bodley)
-* rgw: fix leak of curl handle on shutdown (`issue#35715 <http://tracker.ceph.com/issues/35715>`_, `issue#36214 <http://tracker.ceph.com/issues/36214>`_, `pr#24519 <https://github.com/ceph/ceph/pull/24519>`_, Casey Bodley)
-* rgw: list bucket can not show the object uploaded by RGWPostObj when enable bucket versioning (`pr#24570 <https://github.com/ceph/ceph/pull/24570>`_, yuliyang)
-* rgw: multisite: enforce spawn_window for data full sync (`issue#26897 <http://tracker.ceph.com/issues/26897>`_, `pr#24857 <https://github.com/ceph/ceph/pull/24857>`_, Casey Bodley)
-* rgw: set default objecter_inflight_ops = 24576 (`issue#36570 <http://tracker.ceph.com/issues/36570>`_, `issue#25109 <http://tracker.ceph.com/issues/25109>`_, `pr#24862 <https://github.com/ceph/ceph/pull/24862>`_, Matt Benjamin)
-* rgw: user stats account for resharded buckets (`pr#24854 <https://github.com/ceph/ceph/pull/24854>`_, Casey Bodley)
-* segv in BlueStore::OldExtent::create (`issue#36526 <http://tracker.ceph.com/issues/36526>`_, `issue#36591 <http://tracker.ceph.com/issues/36591>`_, `pr#24746 <https://github.com/ceph/ceph/pull/24746>`_, Sage Weil)
-* test/common: unittest_mclock_priority_queue builds with "make" command (`pr#24808 <https://github.com/ceph/ceph/pull/24808>`_, J. Eric Ivancich)
-
-
-v12.2.9 Luminous
-================
-
-This is the ninth bug fix release of the Luminous v12.2.x long term stable
-release series. Although this release contains several bugfixes across all the
-components, it also introduced the PG hard-limit patches which could cause
-problems during upgrade when not all PGs were active+clean. Therefore, users
-should not install this release. Instead, they should skip it and upgrade to
-12.2.10 directly.
-
-Notable Changes
----------------
-
-OSD
-
-* 12.2.9 contains the pg hard hard limit patches (https://tracker.ceph.com/issues/23979).
-  A partial upgrade during recovery/backfill, can cause the osds on the
-  previous version, to fail with assert(trim_to <= info.last_complete). The
-  workaround for users is to upgrade and restart all OSDs to a version with the
-  pg hard limit, or only upgrade when all PGs are active+clean. This patch will
-  be reverted in 12.2.10, until a clean upgrade path is added to the pg log hard
-  limit patches.
-
-  See also: http://tracker.ceph.com/issues/36686
-
-* The bluestore_cache_* options are no longer needed. They are replaced
-  by osd_memory_target, defaulting to 4GB. BlueStore will expand
-  and contract its cache to attempt to stay within this
-  limit. Users upgrading should note this is a higher default
-  than the previous bluestore_cache_size of 1GB, so OSDs using
-  BlueStore will use more memory by default.
-
-  For more details, see `BlueStore docs <http://docs.ceph.com/docs/master/rados/configuration/bluestore-config-ref/#cache-size>_`
-
-Changelog
----------
-
-* build/ops: add e2fsprogs runtime dependency (`pr#24663 <https://github.com/ceph/ceph/pull/24663>`_, Guillaume Abrioux, Alfredo Deza)
-* build/ops: deb: fix ceph-mgr .pyc files left behind (`issue#26883 <http://tracker.ceph.com/issues/26883>`_, `pr#23832 <https://github.com/ceph/ceph/pull/23832>`_, Dan Mick)
-* build/ops: deb: require fuse for ceph-fuse (`issue#21057 <http://tracker.ceph.com/issues/21057>`_, `pr#23693 <https://github.com/ceph/ceph/pull/23693>`_, Thomas Serlin)
-* build/ops: rpm: selinux-policy fixes (`pr#24136 <https://github.com/ceph/ceph/pull/24136>`_, Brad Hubbard)
-* build/ops: rpm: use updated gperftools (`issue#35969 <http://tracker.ceph.com/issues/35969>`_, `pr#24259 <https://github.com/ceph/ceph/pull/24259>`_, Kefu Chai)
-* ceph-volume:  activate option --auto-detect-objectstore respects --no-systemd (`issue#36249 <http://tracker.ceph.com/issues/36249>`_, `pr#24358 <https://github.com/ceph/ceph/pull/24358>`_, Alfredo Deza)
-* ceph-volume:  lsblk can fail to find PARTLABEL, must fallback to blkid (`issue#36098 <http://tracker.ceph.com/issues/36098>`_, `pr#24335 <https://github.com/ceph/ceph/pull/24335>`_, Alfredo Deza)
-* ceph-volume: add new ceph-handlers role from ceph-ansible (`issue#36251 <http://tracker.ceph.com/issues/36251>`_, `pr#24338 <https://github.com/ceph/ceph/pull/24338>`_, Alfredo Deza)
-* ceph-volume: batch carve out lvs for bluestore (`issue#34535 <http://tracker.ceph.com/issues/34535>`_, `pr#24075 <https://github.com/ceph/ceph/pull/24075>`_, Alfredo Deza)
-* ceph-volume: batch tests for mixed-type of devices (`issue#35535 <http://tracker.ceph.com/issues/35535>`_, `issue#27210 <http://tracker.ceph.com/issues/27210>`_, `pr#23967 <https://github.com/ceph/ceph/pull/23967>`_, Alfredo Deza)
-* ceph-volume: batch: allow --osds-per-device, default it to 1 (`issue#35913 <http://tracker.ceph.com/issues/35913>`_, `pr#24080 <https://github.com/ceph/ceph/pull/24080>`_, Alfredo Deza)
-* ceph-volume: batch: allow journal+block.db sizing on the CLI (`issue#36088 <http://tracker.ceph.com/issues/36088>`_, `pr#24209 <https://github.com/ceph/ceph/pull/24209>`_, Alfredo Deza)
-* ceph-volume: custom cluster names fail on filestore trigger (`issue#27210 <http://tracker.ceph.com/issues/27210>`_, `pr#24280 <https://github.com/ceph/ceph/pull/24280>`_, Alfredo Deza)
-* ceph-volume: do not send (lvm) stderr/stdout to the terminal, use the logfile (`issue#36492 <http://tracker.ceph.com/issues/36492>`_, `pr#24741 <https://github.com/ceph/ceph/pull/24741>`_, Alfredo Deza)
-* ceph-volume: earlier detection for --journal and --filestore flag requirements (`issue#24794 <http://tracker.ceph.com/issues/24794>`_, `pr#24206 <https://github.com/ceph/ceph/pull/24206>`_, Alfredo Deza)
-* ceph-volume: fix journal and filestore data size in `lvm batch --report` (`issue#36242 <http://tracker.ceph.com/issues/36242>`_, `pr#24307 <https://github.com/ceph/ceph/pull/24307>`_, Andrew Schoen)
-* ceph-volume: fix zap not working with LVs (`issue#35970 <http://tracker.ceph.com/issues/35970>`_, `pr#24082 <https://github.com/ceph/ceph/pull/24082>`_, Alfredo Deza)
-* ceph-volume: lvm.prepare update help to indicate partitions are needed, not devices (`issue#24795 <http://tracker.ceph.com/issues/24795>`_, `pr#24451 <https://github.com/ceph/ceph/pull/24451>`_, Jeffrey Zhang, Alfredo Deza)
-* ceph-volume: make `lvm batch` idempotent (`pr#24589 <https://github.com/ceph/ceph/pull/24589>`_, Andrew Schoen)
-* ceph-volume: remove version reporting from help menu (`issue#36386 <http://tracker.ceph.com/issues/36386>`_, `pr#24754 <https://github.com/ceph/ceph/pull/24754>`_, Alfredo Deza)
-* ceph-volume: skip processing devices that don't exist when scanning system disks (`issue#36247 <http://tracker.ceph.com/issues/36247>`_, `pr#24382 <https://github.com/ceph/ceph/pull/24382>`_, Alfredo Deza)
-* cephfs: MDSMonitor: consider raising priority of MMDSBeacons from MDS so they are processed before other client messages (`issue#26899 <http://tracker.ceph.com/issues/26899>`_, `pr#23554 <https://github.com/ceph/ceph/pull/23554>`_, Patrick Donnelly)
-* cephfs: MDSMonitor: lookup of gid in prepare_beacon that has been removed will cause exception (`issue#35848 <http://tracker.ceph.com/issues/35848>`_, `pr#23990 <https://github.com/ceph/ceph/pull/23990>`_, Patrick Donnelly)
-* cephfs: ceph-fuse: add SELinux policy (`issue#36103 <http://tracker.ceph.com/issues/36103>`_, `pr#24313 <https://github.com/ceph/ceph/pull/24313>`_, Patrick Donnelly)
-* cephfs: ceph_volume_client: allow atomic update of RADOS objects (`issue#24173 <http://tracker.ceph.com/issues/24173>`_, `pr#24084 <https://github.com/ceph/ceph/pull/24084>`_, Rishabh Dave)
-* cephfs: ceph_volume_client: delay required after adding data pool to MDSMap (`issue#25141 <http://tracker.ceph.com/issues/25141>`_, `pr#23726 <https://github.com/ceph/ceph/pull/23726>`_, Patrick Donnelly)
-* cephfs: ceph_volume_client: py3 compatible (`issue#17230 <http://tracker.ceph.com/issues/17230>`_, `pr#24083 <https://github.com/ceph/ceph/pull/24083>`_, Rishabh Dave, Patrick Donnelly)
-* cephfs: cephfs-data-scan: print the max used ino (`issue#26925 <http://tracker.ceph.com/issues/26925>`_, `pr#23881 <https://github.com/ceph/ceph/pull/23881>`_, "Yan, Zheng")
-* cephfs: cephfs-journal-tool: wrong layout info used (`issue#24644 <http://tracker.ceph.com/issues/24644>`_, `pr#24033 <https://github.com/ceph/ceph/pull/24033>`_, Gu Zhongyan)
-* cephfs: client: check for unmounted condition before printing debug output (`issue#25213 <http://tracker.ceph.com/issues/25213>`_, `pr#23617 <https://github.com/ceph/ceph/pull/23617>`_, Jeff Layton)
-* cephfs: client: drop null child dentries before try pruning inode's alias (`issue#22293 <http://tracker.ceph.com/issues/22293>`_, `pr#24119 <https://github.com/ceph/ceph/pull/24119>`_, "Yan, Zheng")
-* cephfs: client: fix choose_target_mds for requests that do name lookup (`issue#26860 <http://tracker.ceph.com/issues/26860>`_, `pr#23793 <https://github.com/ceph/ceph/pull/23793>`_, "Yan, Zheng")
-* cephfs: client: retry remount on dcache invalidation failure (`issue#27657 <http://tracker.ceph.com/issues/27657>`_, `pr#24303 <https://github.com/ceph/ceph/pull/24303>`_, Venky Shankar)
-* cephfs: client: statfs inode count odd (`issue#24849 <http://tracker.ceph.com/issues/24849>`_, `pr#24376 <https://github.com/ceph/ceph/pull/24376>`_, Rishabh Dave)
-* cephfs: client: two ceph-fuse clients, one can not list out files created by another (`issue#27051 <http://tracker.ceph.com/issues/27051>`_, `pr#24282 <https://github.com/ceph/ceph/pull/24282>`_, Peng Xie)
-* cephfs: client: update ctime when modifying file content (`issue#35945 <http://tracker.ceph.com/issues/35945>`_, `pr#24323 <https://github.com/ceph/ceph/pull/24323>`_, "Yan, Zheng")
-* common: get real hostname from container/pod environment (`pr#23915 <https://github.com/ceph/ceph/pull/23915>`_, Sage Weil)
-* core: PGPool::update optimizations (`pr#23969 <https://github.com/ceph/ceph/pull/23969>`_, Zac Medico)
-* core: ceph-disk: compatibility fix for python 3 (`issue#35906 <http://tracker.ceph.com/issues/35906>`_, `pr#24347 <https://github.com/ceph/ceph/pull/24347>`_, Tim Serong)
-* core: discover_all_missing() not always called during activating (`issue#22837 <http://tracker.ceph.com/issues/22837>`_, `pr#23817 <https://github.com/ceph/ceph/pull/23817>`_, Sage Weil, David Zafman)
-* core: kv/KeyValueDB: return const char\* from MergeOperator::name() (`issue#26875 <http://tracker.ceph.com/issues/26875>`_, `pr#23566 <https://github.com/ceph/ceph/pull/23566>`_, Sage Weil)
-* core: librados application's symbol could conflict with the libceph-common (`issue#25154 <http://tracker.ceph.com/issues/25154>`_, `pr#23483 <https://github.com/ceph/ceph/pull/23483>`_, Kefu Chai)
-* core: mgr/MgrClient: guard send_pgstats() with lock (`issue#23370 <http://tracker.ceph.com/issues/23370>`_, `pr#23791 <https://github.com/ceph/ceph/pull/23791>`_, Kefu Chai)
-* core: mgr/balancer: deepcopy best plan - otherwise we get latest (`issue#27000 <http://tracker.ceph.com/issues/27000>`_, `pr#23740 <https://github.com/ceph/ceph/pull/23740>`_, Stefan Priebe)
-* core: mgrc: enable disabling stats via mgr_stats_threshold (`issue#25197 <http://tracker.ceph.com/issues/25197>`_, `pr#23461 <https://github.com/ceph/ceph/pull/23461>`_, John Spray)
-* core: mon/OSDMonitor: invalidate max_failed_since on cancel_report (`issue#35860 <http://tracker.ceph.com/issues/35860>`_, `pr#24257 <https://github.com/ceph/ceph/pull/24257>`_, xie xingguo)
-* core: object errors found in be_select_auth_object() aren't logged the same (`issue#25108 <http://tracker.ceph.com/issues/25108>`_, `pr#23871 <https://github.com/ceph/ceph/pull/23871>`_, David Zafman)
-* core: os/bluestore: bluestore_buffer_hit_bytes perf counter doesn't reset (`pr#23773 <https://github.com/ceph/ceph/pull/23773>`_, Igor Fedotov)
-* core: os/bluestore: cache autotuning and memory limit (`pr#24065 <https://github.com/ceph/ceph/pull/24065>`_, Mark Nelson)
-* core: osd,mon: increase mon_max_pg_per_osd to 250 (`issue#25112 <http://tracker.ceph.com/issues/25112>`_, `pr#23862 <https://github.com/ceph/ceph/pull/23862>`_, Neha Ojha)
-* core: osd/PG: avoid choose_acting picking want with > pool size items (`issue#35924 <http://tracker.ceph.com/issues/35924>`_, `pr#24299 <https://github.com/ceph/ceph/pull/24299>`_, Sage Weil)
-* core: osdc/Objecter: fix split vs reconnect race (`issue#22544 <http://tracker.ceph.com/issues/22544>`_, `pr#24188 <https://github.com/ceph/ceph/pull/24188>`_, Sage Weil)
-* core: rados python bindings use prval from stack (`issue#25175 <http://tracker.ceph.com/issues/25175>`_, `pr#23864 <https://github.com/ceph/ceph/pull/23864>`_, Sage Weil)
-* doc: Fix broken urls (`issue#25185 <http://tracker.ceph.com/issues/25185>`_, `pr#23621 <https://github.com/ceph/ceph/pull/23621>`_, Jos Collin)
-* doc: remove deprecated 'scrubq' from ceph(8) (`issue#35813 <http://tracker.ceph.com/issues/35813>`_, `pr#24211 <https://github.com/ceph/ceph/pull/24211>`_, Ruben Kerkhof)
-* doc: rgw: ldap-auth: fixed option name 'rgw_ldap_searchfilter' (`issue#23081 <http://tracker.ceph.com/issues/23081>`_, `pr#23761 <https://github.com/ceph/ceph/pull/23761>`_, Konstantin Shalygin)
-* mds: MDBalancer::try_rebalance() may stop prematurely (`issue#26973 <http://tracker.ceph.com/issues/26973>`_, `pr#23884 <https://github.com/ceph/ceph/pull/23884>`_, "Yan, Zheng")
-* mds: allows client to create .. and . dirents (`issue#25113 <http://tracker.ceph.com/issues/25113>`_, `pr#24329 <https://github.com/ceph/ceph/pull/24329>`_, Venky Shankar)
-* mds: avoid using g_conf->get_val<...>(...) in hot path (`issue#24820 <http://tracker.ceph.com/issues/24820>`_, `pr#23408 <https://github.com/ceph/ceph/pull/23408>`_, "Yan, Zheng")
-* mds: calculate load by checking self CPU usage (`issue#26834 <http://tracker.ceph.com/issues/26834>`_, `pr#23505 <https://github.com/ceph/ceph/pull/23505>`_, "Yan, Zheng")
-* mds: configurable timeout for client eviction (`issue#25188 <http://tracker.ceph.com/issues/25188>`_, `pr#24086 <https://github.com/ceph/ceph/pull/24086>`_, Patrick Donnelly, Venky Shankar)
-* mds: crash when dumping ops in flight (`issue#26894 <http://tracker.ceph.com/issues/26894>`_, `pr#23677 <https://github.com/ceph/ceph/pull/23677>`_, "Yan, Zheng")
-* mds: curate priority of perf counters sent to mgr (`issue#22097 <http://tracker.ceph.com/issues/22097>`_, `issue#24004 <http://tracker.ceph.com/issues/24004>`_, `pr#24089 <https://github.com/ceph/ceph/pull/24089>`_, Guan yunfei, Venky Shankar)
-* mds: explain delayed client_request due to subtree migration (`issue#24840 <http://tracker.ceph.com/issues/24840>`_, `pr#23678 <https://github.com/ceph/ceph/pull/23678>`_, Yan, Zheng, "Yan, Zheng")
-* mds: health warning for slow metadata IO (`issue#24879 <http://tracker.ceph.com/issues/24879>`_, `pr#24171 <https://github.com/ceph/ceph/pull/24171>`_, "Yan, Zheng")
-* mds: internal op missing events time 'throttled', 'all_read', 'dispatched' (`issue#36114 <http://tracker.ceph.com/issues/36114>`_, `pr#24410 <https://github.com/ceph/ceph/pull/24410>`_, Yanhu Cao)
-* mds: mds got laggy because of MDSBeacon stuck in mqueue (`issue#23519 <http://tracker.ceph.com/issues/23519>`_, `pr#23556 <https://github.com/ceph/ceph/pull/23556>`_, "Yan, Zheng")
-* mds: optimize the way how max export size is enforced (`issue#25131 <http://tracker.ceph.com/issues/25131>`_, `pr#23789 <https://github.com/ceph/ceph/pull/23789>`_, "Yan, Zheng")
-* mds: prevent MDSRank::evict_client from blocking finisher thread (`issue#35720 <http://tracker.ceph.com/issues/35720>`_, `pr#23946 <https://github.com/ceph/ceph/pull/23946>`_, "Yan, Zheng")
-* mds: print is_laggy message once (`issue#35250 <http://tracker.ceph.com/issues/35250>`_, `pr#24138 <https://github.com/ceph/ceph/pull/24138>`_, Patrick Donnelly)
-* mds: rctime may go back (`issue#35916 <http://tracker.ceph.com/issues/35916>`_, `pr#24378 <https://github.com/ceph/ceph/pull/24378>`_, "Yan, Zheng")
-* mds: reset heartbeat map at potential time-consuming places (`issue#26858 <http://tracker.ceph.com/issues/26858>`_, `pr#23507 <https://github.com/ceph/ceph/pull/23507>`_, Yan, Zheng, "Yan, Zheng")
-* mds: runs out of file descriptors after several respawns (`issue#35850 <http://tracker.ceph.com/issues/35850>`_, `pr#24310 <https://github.com/ceph/ceph/pull/24310>`_, Patrick Donnelly)
-* mds: track average session uptime (`issue#25013 <http://tracker.ceph.com/issues/25013>`_, `pr#24421 <https://github.com/ceph/ceph/pull/24421>`_, Patrick Donnelly, Venky Shankar)
-* mds: use monotonic clock for beacon message timekeeping (`issue#26959 <http://tracker.ceph.com/issues/26959>`_, `pr#24311 <https://github.com/ceph/ceph/pull/24311>`_, Patrick Donnelly)
-* mgr: Sync the prometheus module (`pr#23216 <https://github.com/ceph/ceph/pull/23216>`_, Boris Ranto)
-* mon: Automatically set expected_num_objects for new pools with >=100 PGs per OSD (`issue#24687 <http://tracker.ceph.com/issues/24687>`_, `pr#24395 <https://github.com/ceph/ceph/pull/24395>`_, Douglas Fuller)
-* msg: "challenging authorizer" messages appear at debug_ms=0 (`issue#35251 <http://tracker.ceph.com/issues/35251>`_, `pr#23943 <https://github.com/ceph/ceph/pull/23943>`_, Patrick Donnelly)
-* msg: async: clean up local buffers on dispatch (`issue#35987 <http://tracker.ceph.com/issues/35987>`_, `pr#24387 <https://github.com/ceph/ceph/pull/24387>`_, Greg Farnum)
-* msg: ceph_abort() when there are enough accepter errors in msg server (`issue#23649 <http://tracker.ceph.com/issues/23649>`_, `pr#24419 <https://github.com/ceph/ceph/pull/24419>`_, penglaiyxy@gmail.com)
-* osd: EC: slow/hung ops in multimds suite test (`issue#23769 <http://tracker.ceph.com/issues/23769>`_, `pr#24393 <https://github.com/ceph/ceph/pull/24393>`_, Sage Weil)
-* osd: ECBackend: don't get result code of subchunk-read overwritten (`issue#21769 <http://tracker.ceph.com/issues/21769>`_, `pr#24342 <https://github.com/ceph/ceph/pull/24342>`_, songweibin)
-* osd: Limit pg log length during recovery/backfill so that we don't run out of memory (`issue#21416 <http://tracker.ceph.com/issues/21416>`_, `pr#23211 <https://github.com/ceph/ceph/pull/23211>`_, Neha Ojha, xie xingguo)
-* osd: OSDMap: fix apply upmap segfault (`issue#22056 <http://tracker.ceph.com/issues/22056>`_, `pr#23579 <https://github.com/ceph/ceph/pull/23579>`_, Brad Hubbard)
-* osd: PG: add custom_reaction Backfilled and release reservations after bac… (`issue#23614 <http://tracker.ceph.com/issues/23614>`_, `pr#23493 <https://github.com/ceph/ceph/pull/23493>`_, Neha Ojha)
-* osd: PrimaryLogPG: fix potential pg-log overtrimming (`pr#24308 <https://github.com/ceph/ceph/pull/24308>`_, xie xingguo)
-* osd: backport 'bench' and stdout changes (`issue#24022 <http://tracker.ceph.com/issues/24022>`_, `pr#23680 <https://github.com/ceph/ceph/pull/23680>`_, Коренберг Маркr, John Spray, Kefu Chai)
-* osd: read object attrs failed at EC recovery (`issue#24406 <http://tracker.ceph.com/issues/24406>`_, `pr#24327 <https://github.com/ceph/ceph/pull/24327>`_, xiaofei cui)
-* osd: scrub livelock (`issue#26890 <http://tracker.ceph.com/issues/26890>`_, `pr#24396 <https://github.com/ceph/ceph/pull/24396>`_, Sage Weil)
-* qa/suites/rados/upgrade/jewel-x-singleton: exclude python3-rados, python3-cephfs (`pr#24479 <https://github.com/ceph/ceph/pull/24479>`_, Neha Ojha)
-* rbd: [rbd-mirror] failed assertion when updating mirror status (`issue#36084 <http://tracker.ceph.com/issues/36084>`_, `pr#24320 <https://github.com/ceph/ceph/pull/24320>`_, Jason Dillaman)
-* rbd: fix error import when the input is a pipe (`issue#34536 <http://tracker.ceph.com/issues/34536>`_, `pr#24003 <https://github.com/ceph/ceph/pull/24003>`_, songweibin)
-* rbd: librbd: blacklisted client might not notice it lost the lock (`issue#34534 <http://tracker.ceph.com/issues/34534>`_, `pr#24405 <https://github.com/ceph/ceph/pull/24405>`_, Song Shun, Mykola Golub, Jason Dillaman)
-* rbd: librbd: discard should wait for in-flight cache writeback to complete (`issue#23548 <http://tracker.ceph.com/issues/23548>`_, `pr#23594 <https://github.com/ceph/ceph/pull/23594>`_, Jason Dillaman)
-* rbd: librbd: ensure exclusive lock acquired when removing sync point snaps… (`issue#24898 <http://tracker.ceph.com/issues/24898>`_, `pr#24123 <https://github.com/ceph/ceph/pull/24123>`_, Mykola Golub, Jason Dillaman)
-* rbd: librbd: fix refuse to release lock when cookie is the same at rewatch (`issue#27986 <http://tracker.ceph.com/issues/27986>`_, `pr#23758 <https://github.com/ceph/ceph/pull/23758>`_, Song Shun)
-* rbd: librbd: fixed assert when flattening clone with zero overlap (`issue#35702 <http://tracker.ceph.com/issues/35702>`_, `pr#24285 <https://github.com/ceph/ceph/pull/24285>`_, Jason Dillaman)
-* rbd: librbd: image create request should validate data pool for self-managed snapshot support (`issue#24675 <http://tracker.ceph.com/issues/24675>`_, `pr#24390 <https://github.com/ceph/ceph/pull/24390>`_, Mykola Golub)
-* rbd: librbd: journaling unable request can not be sent to remote lock owner (`issue#26939 <http://tracker.ceph.com/issues/26939>`_, `pr#24100 <https://github.com/ceph/ceph/pull/24100>`_, Mykola Golub)
-* rbd: librbd: object map improperly flagged as invalidated (`issue#24516 <http://tracker.ceph.com/issues/24516>`_, `pr#24415 <https://github.com/ceph/ceph/pull/24415>`_, Jason Dillaman)
-* rbd: librbd: potential race on image create request complete (`issue#24910 <http://tracker.ceph.com/issues/24910>`_, `pr#23892 <https://github.com/ceph/ceph/pull/23892>`_, Mykola Golub)
-* rgw: 'radosgw-admin sync error trim' only trims partially (`issue#24873 <http://tracker.ceph.com/issues/24873>`_, `pr#24054 <https://github.com/ceph/ceph/pull/24054>`_, Casey Bodley)
-* rgw: Fix log level of gc_iterate_entries (`issue#23801 <http://tracker.ceph.com/issues/23801>`_, `pr#23665 <https://github.com/ceph/ceph/pull/23665>`_, iliul)
-* rgw: Limit the number of lifecycle rules on one bucket (`issue#24572 <http://tracker.ceph.com/issues/24572>`_, `pr#23522 <https://github.com/ceph/ceph/pull/23522>`_, Zhang Shaowen)
-* rgw: The delete markers generated by object expiration should have owner (`issue#24568 <http://tracker.ceph.com/issues/24568>`_, `pr#23545 <https://github.com/ceph/ceph/pull/23545>`_, Zhang Shaowen)
-* rgw: abort_bucket_multiparts() ignores individual NoSuchUpload errors (`issue#35986 <http://tracker.ceph.com/issues/35986>`_, `pr#24389 <https://github.com/ceph/ceph/pull/24389>`_, Casey Bodley)
-* rgw: change default rgw_thread_pool_size to 512 (`issue#25214 <http://tracker.ceph.com/issues/25214>`_, `issue#24544 <http://tracker.ceph.com/issues/24544>`_, `pr#24034 <https://github.com/ceph/ceph/pull/24034>`_, Douglas Fuller, Casey Bodley)
-* rgw: cls/rgw: don't assert in decode_list_index_key() (`issue#24117 <http://tracker.ceph.com/issues/24117>`_, `pr#24391 <https://github.com/ceph/ceph/pull/24391>`_, Yehuda Sadeh)
-* rgw: cls/rgw: ready rgw_usage_log_entry for extraction via ceph-dencoder (`issue#34537 <http://tracker.ceph.com/issues/34537>`_, `pr#23974 <https://github.com/ceph/ceph/pull/23974>`_, Vaibhav Bhembre)
-* rgw: fix chunked-encoding for chunks >1MiB (`issue#35990 <http://tracker.ceph.com/issues/35990>`_, `pr#24361 <https://github.com/ceph/ceph/pull/24361>`_, Robin H. Johnson)
-* rgw: fix deadlock on RGWIndexCompletionManager::stop (`issue#26949 <http://tracker.ceph.com/issues/26949>`_, `pr#24069 <https://github.com/ceph/ceph/pull/24069>`_, Yao Zongyou)
-* rgw: incremental data sync uses truncated flag to detect end of listing (`issue#26952 <http://tracker.ceph.com/issues/26952>`_, `pr#24242 <https://github.com/ceph/ceph/pull/24242>`_, Casey Bodley)
-* rgw: multisite: data sync error repo processing does not back off on empty (`issue#26938 <http://tracker.ceph.com/issues/26938>`_, `pr#24318 <https://github.com/ceph/ceph/pull/24318>`_, Casey Bodley)
-* rgw: multisite: intermittent failures in test_bucket_sync_disable_enable (`issue#26895 <http://tracker.ceph.com/issues/26895>`_, `pr#24316 <https://github.com/ceph/ceph/pull/24316>`_, Casey Bodley)
-* rgw: multisite: intermittent test_bucket_index_log_trim failures (`issue#36034 <http://tracker.ceph.com/issues/36034>`_, `pr#24398 <https://github.com/ceph/ceph/pull/24398>`_, Casey Bodley)
-* rgw: multisite: object metadata operations are skipped by sync (`issue#24367 <http://tracker.ceph.com/issues/24367>`_, `pr#24056 <https://github.com/ceph/ceph/pull/24056>`_, Casey Bodley)
-* rgw: multisite: object name should be urlencoded when we put it into ES (`issue#23216 <http://tracker.ceph.com/issues/23216>`_, `pr#24424 <https://github.com/ceph/ceph/pull/24424>`_, Chang Liu)
-* rgw: multisite: out of order updates to sync status markers (`issue#35539 <http://tracker.ceph.com/issues/35539>`_, `pr#24317 <https://github.com/ceph/ceph/pull/24317>`_, Yehuda Sadeh)
-* rgw: multisite: segfault on shutdown/realm reload (`issue#35543 <http://tracker.ceph.com/issues/35543>`_, `pr#24231 <https://github.com/ceph/ceph/pull/24231>`_, Casey Bodley)
-* rgw: multisite: update index segfault on shutdown/realm reload (`issue#35905 <http://tracker.ceph.com/issues/35905>`_, `pr#24397 <https://github.com/ceph/ceph/pull/24397>`_, Tianshan Qu)
-* rgw: raise debug level on redundant data sync error messages (`issue#35830 <http://tracker.ceph.com/issues/35830>`_, `issue#36037 <http://tracker.ceph.com/issues/36037>`_, `pr#24135 <https://github.com/ceph/ceph/pull/24135>`_, Casey Bodley, Matt Benjamin)
-* rgw: raise default rgw_curl_low_speed_time to 300 seconds (`issue#27989 <http://tracker.ceph.com/issues/27989>`_, `pr#24046 <https://github.com/ceph/ceph/pull/24046>`_, Casey Bodley)
-* rgw: resharding produces invalid values of bucket stats (`issue#36290 <http://tracker.ceph.com/issues/36290>`_, `pr#24527 <https://github.com/ceph/ceph/pull/24527>`_, Abhishek Lekshmanan)
-* rgw: return x-amz-version-id: null when delete obj in versioning suspended bucket (`issue#35814 <http://tracker.ceph.com/issues/35814>`_, `pr#24190 <https://github.com/ceph/ceph/pull/24190>`_, yuliyang)
-* rgw: rgw_file: deep stat handling (`issue#24915 <http://tracker.ceph.com/issues/24915>`_, `pr#23499 <https://github.com/ceph/ceph/pull/23499>`_, Matt Benjamin)
-* tests: Excluded 'python34-cephfs' from the install tasks (`pr#24650 <https://github.com/ceph/ceph/pull/24650>`_, Yuri Weinstein)
-* tests: Use pids instead of jobspecs which were wrong (`issue#27056 <http://tracker.ceph.com/issues/27056>`_, `pr#23901 <https://github.com/ceph/ceph/pull/23901>`_, David Zafman)
-* tests: cephfs: multifs requires 4 mds but gets only 2 (`issue#24899 <http://tracker.ceph.com/issues/24899>`_, `pr#24328 <https://github.com/ceph/ceph/pull/24328>`_, Patrick Donnelly)
-* tests: cls_rgw test is only run in rados suite: add it to rgw suite as well (`issue#24815 <http://tracker.ceph.com/issues/24815>`_, `pr#24070 <https://github.com/ceph/ceph/pull/24070>`_, Casey Bodley, Sage Weil)
-* tests: librbd: not valid to have different parents between image snapshots (`issue#36097 <http://tracker.ceph.com/issues/36097>`_, `pr#24245 <https://github.com/ceph/ceph/pull/24245>`_, Jason Dillaman)
-* tests: move mds/client config to qa from teuthology ceph.conf.template (`issue#26900 <http://tracker.ceph.com/issues/26900>`_, `issue#24839 <http://tracker.ceph.com/issues/24839>`_, `pr#23877 <https://github.com/ceph/ceph/pull/23877>`_, Patrick Donnelly)
-* tests: qa/tasks: s3a fix mirror (`pr#24039 <https://github.com/ceph/ceph/pull/24039>`_, Vasu Kulkarni)
-* tests: qa/workunits: replace 'realpath' with 'readlink -f' in fsstress.sh (`issue#27211 <http://tracker.ceph.com/issues/27211>`_, `issue#36409 <http://tracker.ceph.com/issues/36409>`_, `pr#24620 <https://github.com/ceph/ceph/pull/24620>`_, Ilya Dryomov, Jason Dillaman)
-* tests: qa: add .qa helper link (`pr#24134 <https://github.com/ceph/ceph/pull/24134>`_, Patrick Donnelly)
-* tests: qa: added v12.2.8 to the mix (`issue#35541 <http://tracker.ceph.com/issues/35541>`_, `pr#23913 <https://github.com/ceph/ceph/pull/23913>`_, Yuri Weinstein)
-* tests: remove knfs qa suite from future releases (`issue#36075 <http://tracker.ceph.com/issues/36075>`_, `pr#24268 <https://github.com/ceph/ceph/pull/24268>`_, Yuri Weinstein)
-* tools: ceph-objectstore-tool: Allow target level as first positional parameter (`issue#35846 <http://tracker.ceph.com/issues/35846>`_, `pr#24115 <https://github.com/ceph/ceph/pull/24115>`_, David Zafman)
-
-
-v12.2.8 Luminous
-================
-
-This is the eighth bug fix release of the Luminous v12.2.x long term stable
-release series. This release contains several bugfixes across all the components
-and we recommend all users upgrade.
-
-Upgrade Notes from previous luminous releases
----------------------------------------------
-
-When upgrading from v12.2.5 or v12.2.6 please note that upgrade caveats from
-12.2.5 will apply to any _newer_ luminous version including 12.2.8. Please read
-the notes at luminous-12-2-5-upgrades_ .
-
-For the cluster that installed the broken 12.2.6 release, 12.2.7 fixed the
-regression and introduced a workaround option `osd distrust data digest = true`,
-but 12.2.7 clusters still generated health warnings like ::
-
-  [ERR] 11.288 shard 207: soid  11:1155c332:::rbd_data.207dce238e1f29.0000000000000527:head data_digest 0xc8997a5b != data_digest 0x2ca15853
-
-
-12.2.8 improves the deep scrub code to automatically repair these
-inconsistencies. Once the entire cluster has been upgraded and then fully deep
-scrubbed, and all such inconsistencies are resolved, it will be safe to disable
-the `osd distrust data digest = true` workaround option.
-
-Notable Changes
----------------
-
-- *OSD*
-
-  * Scrub repair is enhanced to handle data digest mismatch info on
-    replicas as long as all replicas' digests match each other.
-
-- *RGW*
-
-  * Options `rgw curl low speed limit` and `rgw curl low speed time`
-    are added to control the lower speed limits and times below which
-    the requests are considered too slow to be aborted and can help
-    mitigate data sync getting blocked during network issues
-
-  * Option `rgw s3 auth order` configurable added which takes a comma
-    separated list of order to try for s3 authentication when external
-    engines are involved.
-
-Changelog
----------
-* bluestore: set correctly shard for existed Collection (`issue#24761 <http://tracker.ceph.com/issues/24761>`_, `pr#22860 <https://github.com/ceph/ceph/pull/22860>`_, Jianpeng Ma)
-* build/ops: Boost system library is no longer required to compile and link example librados program (`issue#25054 <http://tracker.ceph.com/issues/25054>`_, `pr#23202 <https://github.com/ceph/ceph/pull/23202>`_, Nathan Cutler)
-* build/ops: Bring back diff -y for non-FreeBSD (`issue#24396 <http://tracker.ceph.com/issues/24396>`_, `issue#21664 <http://tracker.ceph.com/issues/21664>`_, `pr#22848 <https://github.com/ceph/ceph/pull/22848>`_, Sage Weil, David Zafman)
-* build/ops: install-deps.sh fails on newest openSUSE Leap (`issue#25064 <http://tracker.ceph.com/issues/25064>`_, `pr#23179 <https://github.com/ceph/ceph/pull/23179>`_, Kyr Shatskyy)
-* build/ops: Mimic build fails with -DWITH_RADOSGW=0 (`issue#24437 <http://tracker.ceph.com/issues/24437>`_, `pr#22864 <https://github.com/ceph/ceph/pull/22864>`_, Dan Mick)
-* build/ops: order rbdmap.service before remote-fs-pre.target (`issue#24713 <http://tracker.ceph.com/issues/24713>`_, `pr#22844 <https://github.com/ceph/ceph/pull/22844>`_, Ilya Dryomov)
-* build/ops: rpm: silence osd block chown (`issue#25152 <http://tracker.ceph.com/issues/25152>`_, `pr#23313 <https://github.com/ceph/ceph/pull/23313>`_, Dan van der Ster)
-* cephfs-journal-tool: Fix purging when importing an zero-length journal (`issue#24239 <http://tracker.ceph.com/issues/24239>`_, `pr#22980 <https://github.com/ceph/ceph/pull/22980>`_, yupeng chen, zhongyan gu)
-* cephfs: MDSMonitor: uncommitted state exposed to clients/mdss (`issue#23768 <http://tracker.ceph.com/issues/23768>`_, `pr#23013 <https://github.com/ceph/ceph/pull/23013>`_, Patrick Donnelly)
-* ceph-fuse mount failed because no mds (`issue#22205 <http://tracker.ceph.com/issues/22205>`_, `pr#22895 <https://github.com/ceph/ceph/pull/22895>`_, liyan)
-* ceph-volume add a __release__ string, to help version-conditional calls (`issue#25170 <http://tracker.ceph.com/issues/25170>`_, `pr#23331 <https://github.com/ceph/ceph/pull/23331>`_, Alfredo Deza)
-* ceph-volume: adds test for `ceph-volume lvm list /dev/sda` (`issue#24784 <http://tracker.ceph.com/issues/24784>`_, `issue#24957 <http://tracker.ceph.com/issues/24957>`_, `pr#23350 <https://github.com/ceph/ceph/pull/23350>`_, Andrew Schoen)
-* ceph-volume: do not use stdin in luminous (`issue#25173 <http://tracker.ceph.com/issues/25173>`_, `issue#23260 <http://tracker.ceph.com/issues/23260>`_, `pr#23367 <https://github.com/ceph/ceph/pull/23367>`_, Alfredo Deza)
-* ceph-volume enable the ceph-osd during lvm activation (`issue#24152 <http://tracker.ceph.com/issues/24152>`_, `pr#23394 <https://github.com/ceph/ceph/pull/23394>`_, Dan van der Ster, Alfredo Deza)
-* ceph-volume expand on the LVM API to create multiple LVs at different sizes (`issue#24020 <http://tracker.ceph.com/issues/24020>`_, `pr#23395 <https://github.com/ceph/ceph/pull/23395>`_, Alfredo Deza)
-* ceph-volume lvm.activate conditional mon-config on prime-osd-dir (`issue#25216 <http://tracker.ceph.com/issues/25216>`_, `pr#23397 <https://github.com/ceph/ceph/pull/23397>`_, Alfredo Deza)
-* ceph-volume lvm.batch remove non-existent sys_api property (`issue#34310 <http://tracker.ceph.com/issues/34310>`_, `pr#23811 <https://github.com/ceph/ceph/pull/23811>`_, Alfredo Deza)
-* ceph-volume lvm.listing only include devices if they exist (`issue#24952 <http://tracker.ceph.com/issues/24952>`_, `pr#23150 <https://github.com/ceph/ceph/pull/23150>`_, Alfredo Deza)
-* ceph-volume: process.call with stdin in Python 3 fix (`issue#24993 <http://tracker.ceph.com/issues/24993>`_, `pr#23238 <https://github.com/ceph/ceph/pull/23238>`_, Alfredo Deza)
-* ceph-volume: PVolumes.get() should return one PV when using name or uuid (`issue#24784 <http://tracker.ceph.com/issues/24784>`_, `pr#23329 <https://github.com/ceph/ceph/pull/23329>`_, Andrew Schoen)
-* ceph-volume: refuse to zap mapper devices (`issue#24504 <http://tracker.ceph.com/issues/24504>`_, `pr#23374 <https://github.com/ceph/ceph/pull/23374>`_, Andrew Schoen)
-* ceph-volume: tests.functional inherit SSH_ARGS from ansible (`issue#34311 <http://tracker.ceph.com/issues/34311>`_, `pr#23813 <https://github.com/ceph/ceph/pull/23813>`_, Alfredo Deza)
-* ceph-volume tests/functional run lvm list after OSD provisioning (`issue#24961 <http://tracker.ceph.com/issues/24961>`_, `pr#23147 <https://github.com/ceph/ceph/pull/23147>`_, Alfredo Deza)
-* ceph-volume: unmount lvs correctly before zapping (`issue#24796 <http://tracker.ceph.com/issues/24796>`_, `pr#23128 <https://github.com/ceph/ceph/pull/23128>`_, Andrew Schoen)
-* ceph-volume: update batch documentation to explain filestore strategies (`issue#34309 <http://tracker.ceph.com/issues/34309>`_, `pr#23825 <https://github.com/ceph/ceph/pull/23825>`_, Alfredo Deza)
-* change default filestore_merge_threshold to -10 (`issue#24686 <http://tracker.ceph.com/issues/24686>`_, `pr#22814 <https://github.com/ceph/ceph/pull/22814>`_, Douglas Fuller)
-* client: add inst to asok status output (`issue#24724 <http://tracker.ceph.com/issues/24724>`_, `pr#23107 <https://github.com/ceph/ceph/pull/23107>`_, Patrick Donnelly)
-* client: fixup parallel calls to ceph_ll_lookup_inode() in NFS FASL (`issue#22683 <http://tracker.ceph.com/issues/22683>`_, `pr#23012 <https://github.com/ceph/ceph/pull/23012>`_, huanwen ren)
-* client: increase verbosity level for log messages in helper methods (`issue#21014 <http://tracker.ceph.com/issues/21014>`_, `pr#23014 <https://github.com/ceph/ceph/pull/23014>`_, Rishabh Dave)
-* client:  update inode fields according to issued caps (`issue#24269 <http://tracker.ceph.com/issues/24269>`_, `pr#22783 <https://github.com/ceph/ceph/pull/22783>`_, "Yan, Zheng")
-* common: Abort in OSDMap::decode() during qa/standalone/erasure-code/test-erasure-eio.sh (`issue#23492 <http://tracker.ceph.com/issues/23492>`_, `pr#23025 <https://github.com/ceph/ceph/pull/23025>`_, Sage Weil)
-* common/DecayCounter: set last_decay to current time when decoding decay counter (`issue#24440 <http://tracker.ceph.com/issues/24440>`_, `pr#22779 <https://github.com/ceph/ceph/pull/22779>`_, Zhi Zhang)
-* doc: ceph-bluestore-tool manpage not getting rendered correctly (`issue#24800 <http://tracker.ceph.com/issues/24800>`_, `pr#23177 <https://github.com/ceph/ceph/pull/23177>`_, Nathan Cutler)
-* filestore: add pgid in filestore pg dir split log message (`issue#24878 <http://tracker.ceph.com/issues/24878>`_, `pr#23454 <https://github.com/ceph/ceph/pull/23454>`_, Vikhyat Umrao)
-* let "ceph status" use base 10 when printing numbers not sizes (`issue#22095 <http://tracker.ceph.com/issues/22095>`_, `pr#22680 <https://github.com/ceph/ceph/pull/22680>`_, Jan Fajerski, Kefu Chai)
-* librados: fix buffer overflow for aio_exec python binding (`issue#23964 <http://tracker.ceph.com/issues/23964>`_, `pr#22708 <https://github.com/ceph/ceph/pull/22708>`_, Aleksei Gutikov)
-* librbd: force 'invalid object map' flag on-disk update (`issue#24434 <http://tracker.ceph.com/issues/24434>`_, `pr#22753 <https://github.com/ceph/ceph/pull/22753>`_, Mykola Golub)
-* librbd: utilize the journal disabled policy when removing images (`issue#23512 <http://tracker.ceph.com/issues/23512>`_, `pr#23595 <https://github.com/ceph/ceph/pull/23595>`_, Jason Dillaman)
-* mds: don't report slow request for blocked filelock request (`issue#22428 <http://tracker.ceph.com/issues/22428>`_, `pr#22782 <https://github.com/ceph/ceph/pull/22782>`_, "Yan, Zheng")
-* mds: dump recent events on respawn (`issue#24853 <http://tracker.ceph.com/issues/24853>`_, `pr#23213 <https://github.com/ceph/ceph/pull/23213>`_, Patrick Donnelly)
-* mds: handle discontinuous mdsmap (`issue#24856 <http://tracker.ceph.com/issues/24856>`_, `pr#23169 <https://github.com/ceph/ceph/pull/23169>`_, "Yan, Zheng")
-* mds: increase debug level for dropped client cap msg (`issue#24855 <http://tracker.ceph.com/issues/24855>`_, `pr#23214 <https://github.com/ceph/ceph/pull/23214>`_, Patrick Donnelly)
-* mds: low wrlock efficiency due to dirfrags traversal (`issue#24467 <http://tracker.ceph.com/issues/24467>`_, `pr#22885 <https://github.com/ceph/ceph/pull/22885>`_, Xuehan Xu)
-* mds: print mdsmap processed at low debug level (`issue#24852 <http://tracker.ceph.com/issues/24852>`_, `pr#23212 <https://github.com/ceph/ceph/pull/23212>`_, Patrick Donnelly)
-* mds: scrub doesn't always return JSON results (`issue#23958 <http://tracker.ceph.com/issues/23958>`_, `pr#23222 <https://github.com/ceph/ceph/pull/23222>`_, Venky Shankar)
-* mds: unset deleted vars in shutdown_pass (`issue#23766 <http://tracker.ceph.com/issues/23766>`_, `pr#23015 <https://github.com/ceph/ceph/pull/23015>`_, Patrick Donnelly)
-* mgr: add units to performance counters (`issue#22747 <http://tracker.ceph.com/issues/22747>`_, `pr#23266 <https://github.com/ceph/ceph/pull/23266>`_, Ernesto Puerta, Rubab Syed)
-* mgr: ceph osd safe-to-destroy crashes the mgr (`issue#23249 <http://tracker.ceph.com/issues/23249>`_, `pr#22806 <https://github.com/ceph/ceph/pull/22806>`_, Sage Weil)
-* mgr/MgrClient: Protect daemon_health_metrics (`issue#23352 <http://tracker.ceph.com/issues/23352>`_, `pr#23459 <https://github.com/ceph/ceph/pull/23459>`_, Kjetil Joergensen, Brad Hubbard)
-* mon: Add option to view IP addresses of clients in output of 'ceph features' (`issue#21315 <http://tracker.ceph.com/issues/21315>`_, `pr#22773 <https://github.com/ceph/ceph/pull/22773>`_, Paul Emmerich)
-* mon/HealthMonitor: do not send MMonHealthChecks to pre-luminous mon (`issue#24481 <http://tracker.ceph.com/issues/24481>`_, `pr#22655 <https://github.com/ceph/ceph/pull/22655>`_, Sage Weil)
-* os/bluestore: fix flush_commit locking (`issue#21480 <http://tracker.ceph.com/issues/21480>`_, `pr#22904 <https://github.com/ceph/ceph/pull/22904>`_, Sage Weil)
-* os/bluestore: fix incomplete faulty range marking when doing compression (`issue#21480 <http://tracker.ceph.com/issues/21480>`_, `pr#22909 <https://github.com/ceph/ceph/pull/22909>`_, Igor Fedotov)
-* os/bluestore: fix races on SharedBlob::coll in ~SharedBlob (`issue#24859 <http://tracker.ceph.com/issues/24859>`_, `pr#23064 <https://github.com/ceph/ceph/pull/23064>`_, Radoslaw Zarzynski)
-* osdc: Fix the wrong BufferHead offset (`issue#24484 <http://tracker.ceph.com/issues/24484>`_, `pr#22865 <https://github.com/ceph/ceph/pull/22865>`_, dongdong tao)
-* osd: do_sparse_read(): Verify checksum earlier so we will try to repair and missed backport (`issue#24875 <http://tracker.ceph.com/issues/24875>`_, `pr#23379 <https://github.com/ceph/ceph/pull/23379>`_, xie xingguo, David Zafman)
-* osd: eternal stuck PG in 'unfound_recovery' (`issue#24373 <http://tracker.ceph.com/issues/24373>`_, `pr#22546 <https://github.com/ceph/ceph/pull/22546>`_, Sage Weil)
-* osd: may get empty info at recovery (`issue#24588 <http://tracker.ceph.com/issues/24588>`_, `pr#22862 <https://github.com/ceph/ceph/pull/22862>`_, Sage Weil)
-* osd/OSDMap: CRUSH_TUNABLES5 added in jewel, not kraken (`issue#25057 <http://tracker.ceph.com/issues/25057>`_, `pr#23227 <https://github.com/ceph/ceph/pull/23227>`_, Sage Weil)
-* osd/Session: fix invalid iterator dereference in Sessoin::have_backoff() (`issue#24486 <http://tracker.ceph.com/issues/24486>`_, `pr#22729 <https://github.com/ceph/ceph/pull/22729>`_, Sage Weil)
-* pjd: cd: too many arguments (`issue#24307 <http://tracker.ceph.com/issues/24307>`_, `pr#22883 <https://github.com/ceph/ceph/pull/22883>`_, Neha Ojha)
-* PurgeQueue sometimes ignores Journaler errors (`issue#24533 <http://tracker.ceph.com/issues/24533>`_, `pr#22811 <https://github.com/ceph/ceph/pull/22811>`_, John Spray)
-* pybind: pybind/mgr/mgr_module: make rados handle available to all modules (`issue#24788 <http://tracker.ceph.com/issues/24788>`_, `issue#25102 <http://tracker.ceph.com/issues/25102>`_, `pr#23235 <https://github.com/ceph/ceph/pull/23235>`_, Ernesto Puerta, Sage Weil)
-* pybind: Python bindings use iteritems method which is not Python 3 compatible (`issue#24779 <http://tracker.ceph.com/issues/24779>`_, `pr#22918 <https://github.com/ceph/ceph/pull/22918>`_, Nathan Cutler, Kefu Chai)
-* pybind: rados.pyx: make all exceptions accept keyword arguments (`issue#24033 <http://tracker.ceph.com/issues/24033>`_, `pr#22979 <https://github.com/ceph/ceph/pull/22979>`_, Rishabh Dave)
-* rbd: fix issues in IEC unit handling (`issue#26927 <http://tracker.ceph.com/issues/26927>`_, `issue#26928 <http://tracker.ceph.com/issues/26928>`_, `pr#23776 <https://github.com/ceph/ceph/pull/23776>`_, Jason Dillaman)
-* repeated eviction of idle client until some IO happens (`issue#24052 <http://tracker.ceph.com/issues/24052>`_, `pr#22780 <https://github.com/ceph/ceph/pull/22780>`_, "Yan, Zheng")
-* rgw: add curl_low_speed_limit and curl_low_speed_time config to avoid the thread hangs in data sync (`issue#25019 <http://tracker.ceph.com/issues/25019>`_, `pr#23144 <https://github.com/ceph/ceph/pull/23144>`_, Mark Kogan, Zhang Shaowen)
-* rgw: add unit test for cls bi list command (`issue#24483 <http://tracker.ceph.com/issues/24483>`_, `pr#22846 <https://github.com/ceph/ceph/pull/22846>`_, Orit Wasserman, Xinying Song)
-* rgw: do not ignore EEXIST in RGWPutObj::execute (`issue#22790 <http://tracker.ceph.com/issues/22790>`_, `pr#23207 <https://github.com/ceph/ceph/pull/23207>`_, Matt Benjamin)
-* rgw: fail to recover index from crash luminous backport (`issue#24640 <http://tracker.ceph.com/issues/24640>`_, `issue#24280 <http://tracker.ceph.com/issues/24280>`_, `pr#23130 <https://github.com/ceph/ceph/pull/23130>`_, Tianshan Qu)
-* rgw: fix gc may cause a large number of read traffic (`issue#24767 <http://tracker.ceph.com/issues/24767>`_, `pr#22984 <https://github.com/ceph/ceph/pull/22984>`_, Xin Liao)
-* rgw: fix the bug of radowgw-admin zonegroup set requires realm (`issue#21583 <http://tracker.ceph.com/issues/21583>`_, `pr#22767 <https://github.com/ceph/ceph/pull/22767>`_, lvshanchun)
-* rgw: have a configurable authentication order (`issue#23089 <http://tracker.ceph.com/issues/23089>`_, `pr#23501 <https://github.com/ceph/ceph/pull/23501>`_, Abhishek Lekshmanan)
-* rgw: index complete miss zones_trace set (`issue#24590 <http://tracker.ceph.com/issues/24590>`_, `pr#22820 <https://github.com/ceph/ceph/pull/22820>`_, Tianshan Qu)
-* rgw: Invalid Access-Control-Request-Request may bypass validate_cors_rule_method (`issue#24223 <http://tracker.ceph.com/issues/24223>`_, `pr#22934 <https://github.com/ceph/ceph/pull/22934>`_, Jeegn Chen)
-* rgw: meta and data notify thread miss stop cr manager (`issue#24589 <http://tracker.ceph.com/issues/24589>`_, `pr#22822 <https://github.com/ceph/ceph/pull/22822>`_, Tianshan Qu)
-* rgw-multisite: endless loop in RGWBucketShardIncrementalSyncCR (`issue#24603 <http://tracker.ceph.com/issues/24603>`_, `pr#22817 <https://github.com/ceph/ceph/pull/22817>`_, cfanz)
-* rgw performance regression for luminous 12.2.4 (`issue#23379 <http://tracker.ceph.com/issues/23379>`_, `pr#22930 <https://github.com/ceph/ceph/pull/22930>`_, Mark Kogan)
-* rgw: radogw-admin reshard status command should print text for reshar… (`issue#23257 <http://tracker.ceph.com/issues/23257>`_, `pr#23019 <https://github.com/ceph/ceph/pull/23019>`_, Orit Wasserman)
-* rgw: "radosgw-admin objects expire" always returns ok even if the pro… (`issue#24592 <http://tracker.ceph.com/issues/24592>`_, `pr#23000 <https://github.com/ceph/ceph/pull/23000>`_, Zhang Shaowen)
-* rgw: require --yes-i-really-mean-it to run radosgw-admin orphans find (`issue#24146 <http://tracker.ceph.com/issues/24146>`_, `pr#22985 <https://github.com/ceph/ceph/pull/22985>`_, Matt Benjamin)
-* rgw: REST admin metadata API paging failure bucket & bucket.instance: InvalidArgument (`issue#23099 <http://tracker.ceph.com/issues/23099>`_, `pr#22932 <https://github.com/ceph/ceph/pull/22932>`_, Matt Benjamin)
-* rgw: set cr state if aio_read err return in RGWCloneMetaLogCoroutine (`issue#24566 <http://tracker.ceph.com/issues/24566>`_, `pr#22942 <https://github.com/ceph/ceph/pull/22942>`_, Tianshan Qu)
-* spdk: fix ceph-osd crash when activate SPDK (`issue#24371 <http://tracker.ceph.com/issues/24371>`_, `pr#22686 <https://github.com/ceph/ceph/pull/22686>`_, tone-zhang)
-* tools/ceph-objectstore-tool: split filestore directories offline to target hash level (`issue#21366 <http://tracker.ceph.com/issues/21366>`_, `pr#23418 <https://github.com/ceph/ceph/pull/23418>`_, Zhi Zhang)
-
-
-v12.2.7 Luminous
-================
-
-This is the seventh bugfix release of Luminous v12.2.x long term
-stable release series. This release contains several fixes for
-regressions in the v12.2.6 and v12.2.5 releases.  We recommend that
-all users upgrade.
-
-:note: The v12.2.6 release has serious known regressions.  If you installed this release, please see the upgrade procedure below.
-
-:note: The v12.2.5 release has a potential data corruption issue with erasure coded pools.  If you ran v12.2.5 with erasure coding, please see below.
-
-.. _luminous-12-2-5-upgrades:
-
-Upgrading from v12.2.6
-----------------------
-
-v12.2.6 included an incomplete backport of an optimization for
-BlueStore OSDs that avoids maintaining both the per-object checksum
-and the internal BlueStore checksum.  Due to the accidental omission
-of a critical follow-on patch, v12.2.6 corrupts (fails to update) the
-stored per-object checksum value for some objects.  This can result in
-an EIO error when trying to read those objects.
-
-#. If your cluster uses FileStore only, no special action is required.
-   This problem only affects clusters with BlueStore.
-
-#. If your cluster has only BlueStore OSDs (no FileStore), then you
-   should enable the following OSD option::
-
-     osd skip data digest = true
-
-   This will avoid setting and start ignoring the full-object digests
-   whenever the primary for a PG is BlueStore.
-
-#. If you have a mix of BlueStore and FileStore OSDs, then you should
-   enable the following OSD option::
-
-     osd distrust data digest = true
-
-   This will avoid setting and start ignoring the full-object digests
-   in all cases.  This weakens the data integrity checks for
-   FileStore (although those checks were always only opportunistic).
-
-If your cluster includes BlueStore OSDs and was affected, deep scrubs
-will generate errors about mismatched CRCs for affected objects.
-Currently the repair operation does not know how to correct them
-(since all replicas do not match the expected checksum it does not
-know how to proceed).  These warnings are harmless in the sense that
-IO is not affected and the replicas are all still in sync.  The number
-of affected objects is likely to drop (possibly to zero) on their own
-over time as those objects are modified.  We expect to include a scrub
-improvement in v12.2.8 to clean up any remaining objects.
-
-Additionally, see the notes below, which apply to both v12.2.5 and v12.2.6.
-
-Upgrading from v12.2.5 or v12.2.6
----------------------------------
-
-If you used v12.2.5 or v12.2.6 in combination with erasure coded
-pools, there is a small risk of corruption under certain workloads.
-Specifically, when:
-
-* An erasure coded pool is in use
-* The pool is busy with successful writes
-* The pool is also busy with updates that result in an error result to
-  the librados user.  RGW garbage collection is the most common
-  example of this (it sends delete operations on objects that don't
-  always exist.)
-* Some OSDs are reasonably busy.  One known example of such load is
-  FileStore splitting, although in principle any load on the cluster
-  could also trigger the behavior.
-* One or more OSDs restarts.
-
-This combination can trigger an OSD crash and possibly leave PGs in a state
-where they fail to peer.
-
-Notably, upgrading a cluster involves OSD restarts and as such may
-increase the risk of encountering this bug.  For this reason, for
-clusters with erasure coded pools, we recommend the following upgrade
-procedure to minimize risk:
-
-#. Install the v12.2.7 packages.
-#. Temporarily quiesce IO to cluster::
-
-     ceph osd pause
-
-#. Restart all OSDs and wait for all PGs to become active.
-#. Resume IO::
-
-     ceph osd unpause
-
-This will cause an availability outage for the duration of the OSD
-restarts.  If this in unacceptable, an *more risky* alternative is to
-disable RGW garbage collection (the primary known cause of these rados
-operations) for the duration of the upgrade::
-
-#. Set ``rgw_enable_gc_threads = false`` in ceph.conf
-#. Restart all radosgw daemons
-#. Upgrade and restart all OSDs
-#. Remove ``rgw_enable_gc_threads = false`` from ceph.conf
-#. Restart all radosgw daemons
-
-Upgrading from other versions
------------------------------
-
-If your cluster did not run v12.2.5 or v12.2.6 then none of the above
-issues apply to you and you should upgrade normally.
-
-Notable Changes
----------------
-
-* mon/AuthMonitor: improve error message (`issue#21765 <http://tracker.ceph.com/issues/21765>`_, `pr#22963 <https://github.com/ceph/ceph/pull/22963>`_, Douglas Fuller)
-* osd/PG: do not blindly roll forward to log.head (`issue#24597 <http://tracker.ceph.com/issues/24597>`_, `pr#22976 <https://github.com/ceph/ceph/pull/22976>`_, Sage Weil)
-* osd/PrimaryLogPG: rebuild attrs from clients (`issue#24768 <http://tracker.ceph.com/issues/24768>`_, `pr#22962 <https://github.com/ceph/ceph/pull/22962>`_, Sage Weil)
-* osd: work around data digest problems in 12.2.6 (version 2) (`issue#24922 <http://tracker.ceph.com/issues/24922>`_, `pr#23055 <https://github.com/ceph/ceph/pull/23055>`_, Sage Weil)
-* rgw: objects in cache never refresh after rgw_cache_expiry_interval (`issue#24346 <http://tracker.ceph.com/issues/24346>`_, `pr#22369 <https://github.com/ceph/ceph/pull/22369>`_, Casey Bodley, Matt Benjamin)
-
-
-v12.2.6 Luminous
-================
-
-:note: This is a broken release with serious known regressions.  Do not install it.
-
-This is the sixth bugfix release of Luminous v12.2.x long term stable release
-series. This release contains a range of bug fixes across all components of
-Ceph and a few security fixes.
-
-Notable Changes
----------------
-
-- *Auth*:
-
-  * In 12.2.4 and earlier releases, keyring caps were not checked for validity,
-    so the caps string could be anything. As of 12.2.6, caps strings are
-    validated and providing a keyring with an invalid caps string to, e.g.,
-    "ceph auth add" will result in an error.
-  * CVE 2018-1128: auth: cephx authorizer subject to replay attack (`issue#24836 <http://tracker.ceph.com/issues/24836>`_, Sage Weil)
-  * CVE 2018-1129: auth: cephx signature check is weak (`issue#24837 <http://tracker.ceph.com/issues/24837>`_, Sage Weil)
-  * CVE 2018-10861: mon: auth checks not correct for pool ops (`issue#24838 <http://tracker.ceph.com/issues/24838>`_, Jason Dillaman)
-
-
-* The config-key interface can store arbitrary binary blobs but JSON
-  can only express printable strings.  If binary blobs are present,
-  the 'ceph config-key dump' command will show them as something like
-  ``<<< binary blob of length N >>>``.
-
-
-Other Notable Changes
----------------------
-* build/ops: build-integration-branch script (`issue#24003 <http://tracker.ceph.com/issues/24003>`_, `pr#21919 <https://github.com/ceph/ceph/pull/21919>`_, Nathan Cutler, Kefu Chai, Sage Weil)
-* cephfs-journal-tool: wait prezero ops before destroying journal (`issue#20549 <http://tracker.ceph.com/issues/20549>`_, `pr#21874 <https://github.com/ceph/ceph/pull/21874>`_, "Yan, Zheng")
-* cephfs: MDSMonitor: cleanup and protect fsmap access (`issue#23762 <http://tracker.ceph.com/issues/23762>`_, `pr#21732 <https://github.com/ceph/ceph/pull/21732>`_, Patrick Donnelly)
-* cephfs: MDSMonitor: crash after assigning standby-replay daemon in multifs setup (`issue#23762 <http://tracker.ceph.com/issues/23762>`_, `issue#23658 <http://tracker.ceph.com/issues/23658>`_, `pr#22603 <https://github.com/ceph/ceph/pull/22603>`_, "Yan, Zheng")
-* cephfs: MDSMonitor: fix mds health printed in bad format (`issue#23582 <http://tracker.ceph.com/issues/23582>`_, `pr#21447 <https://github.com/ceph/ceph/pull/21447>`_, Patrick Donnelly)
-* cephfs: MDSMonitor: initialize new Filesystem epoch from pending (`issue#23764 <http://tracker.ceph.com/issues/23764>`_, `pr#21512 <https://github.com/ceph/ceph/pull/21512>`_, Patrick Donnelly)
-* ceph-fuse: missing dentries in readdir result (`issue#23894 <http://tracker.ceph.com/issues/23894>`_, `pr#22119 <https://github.com/ceph/ceph/pull/22119>`_, "Yan, Zheng")
-* ceph-fuse: return proper exit code (`issue#23665 <http://tracker.ceph.com/issues/23665>`_, `pr#21495 <https://github.com/ceph/ceph/pull/21495>`_, Patrick Donnelly)
-* ceph-fuse: trim ceph-fuse -V output (`issue#23248 <http://tracker.ceph.com/issues/23248>`_, `pr#21600 <https://github.com/ceph/ceph/pull/21600>`_, Jos Collin)
-* ceph_test_rados_api_aio: fix race with full pool and osdmap (`issue#23917 <http://tracker.ceph.com/issues/23917>`_, `issue#23876 <http://tracker.ceph.com/issues/23876>`_, `pr#21778 <https://github.com/ceph/ceph/pull/21778>`_, Sage Weil)
-* ceph-volume: error on commands that need ceph.conf to operate (`issue#23941 <http://tracker.ceph.com/issues/23941>`_, `pr#22746 <https://github.com/ceph/ceph/pull/22746>`_, Andrew Schoen)
-* ceph-volume: failed ceph-osd --mkfs command doesn't halt the OSD creation process (`issue#23874 <http://tracker.ceph.com/issues/23874>`_, `pr#21746 <https://github.com/ceph/ceph/pull/21746>`_, Alfredo Deza)
-* client: add ceph_ll_sync_inode (`issue#23291 <http://tracker.ceph.com/issues/23291>`_, `pr#21109 <https://github.com/ceph/ceph/pull/21109>`_, Jeff Layton)
-* client: add client option descriptions (`issue#22933 <http://tracker.ceph.com/issues/22933>`_, `pr#21589 <https://github.com/ceph/ceph/pull/21589>`_, Patrick Donnelly)
-* client: anchor dentries for trimming to make cap traversal safe (`issue#24137 <http://tracker.ceph.com/issues/24137>`_, `pr#22201 <https://github.com/ceph/ceph/pull/22201>`_, Patrick Donnelly)
-* client: avoid freeing inode when it contains TX buffer head (`issue#23837 <http://tracker.ceph.com/issues/23837>`_, `pr#22168 <https://github.com/ceph/ceph/pull/22168>`_, Guan yunfei, "Yan, Zheng", Jason Dillaman)
-* client: dirty caps may never get the chance to flush (`issue#22546 <http://tracker.ceph.com/issues/22546>`_, `pr#21278 <https://github.com/ceph/ceph/pull/21278>`_, dongdong tao)
-* client: fix issue of revoking non-auth caps (`issue#24172 <http://tracker.ceph.com/issues/24172>`_, `pr#22221 <https://github.com/ceph/ceph/pull/22221>`_, "Yan, Zheng")
-* client: fix request send_to_auth was never really used (`issue#23541 <http://tracker.ceph.com/issues/23541>`_, `pr#21354 <https://github.com/ceph/ceph/pull/21354>`_, Zhi Zhang)
-* client: Fix the gid_count check (`issue#23652 <http://tracker.ceph.com/issues/23652>`_, `pr#21596 <https://github.com/ceph/ceph/pull/21596>`_, Jos Collin)
-* client: flush the mdlog in _fsync before waiting on unstable reqs (`issue#23714 <http://tracker.ceph.com/issues/23714>`_, `pr#21542 <https://github.com/ceph/ceph/pull/21542>`_, Jeff Layton)
-* client: hangs on umount if it had an MDS session evicted (`issue#10915 <http://tracker.ceph.com/issues/10915>`_, `pr#22018 <https://github.com/ceph/ceph/pull/22018>`_, Rishabh Dave)
-* client: void sending mds request while holding cap reference (`issue#24369 <http://tracker.ceph.com/issues/24369>`_, `pr#22354 <https://github.com/ceph/ceph/pull/22354>`_, "Yan, Zheng")
-* cmake: fix the cepfs java binding build on Bionic (`issue#23458 <http://tracker.ceph.com/issues/23458>`_, `issue#24012 <http://tracker.ceph.com/issues/24012>`_, `pr#21872 <https://github.com/ceph/ceph/pull/21872>`_, Kefu Chai, Shengjing Zhu)
-* cmake/modules/BuildRocksDB.cmake: enable compressions for rocksdb (`issue#24025 <http://tracker.ceph.com/issues/24025>`_, `pr#22215 <https://github.com/ceph/ceph/pull/22215>`_, Kefu Chai)
-* common: ARMv8 feature detection broken, leading to illegal instruction crashes (`issue#23464 <http://tracker.ceph.com/issues/23464>`_, `pr#22567 <https://github.com/ceph/ceph/pull/22567>`_, Adam Kupczyk)
-* common: fix BoundedKeyCounter const_pointer_iterator (`issue#22139 <http://tracker.ceph.com/issues/22139>`_, `pr#21083 <https://github.com/ceph/ceph/pull/21083>`_, Casey Bodley)
-* common: fix typo in rados bench write JSON output (`issue#24199 <http://tracker.ceph.com/issues/24199>`_, `pr#22391 <https://github.com/ceph/ceph/pull/22391>`_, Sandor Zeestraten)
-* common: partially revert 95fc248 to make get_process_name work (`issue#24123 <http://tracker.ceph.com/issues/24123>`_, `pr#22290 <https://github.com/ceph/ceph/pull/22290>`_, Mykola Golub)
-* core: Deleting a pool with active notify linger ops can result in seg fault (`issue#23966 <http://tracker.ceph.com/issues/23966>`_, `pr#22143 <https://github.com/ceph/ceph/pull/22143>`_, Kefu Chai, Jason Dillaman)
-* core: mon/MgrMonitor: change 'unresponsive' message to info level (`issue#24222 <http://tracker.ceph.com/issues/24222>`_, `pr#22331 <https://github.com/ceph/ceph/pull/22331>`_, Sage Weil)
-* core: Wip scrub omap (`issue#24366 <http://tracker.ceph.com/issues/24366>`_, `pr#22375 <https://github.com/ceph/ceph/pull/22375>`_, xie xingguo, David Zafman)
-* crush: fix device_class_clone for unpopulated/empty weight-sets (`issue#23386 <http://tracker.ceph.com/issues/23386>`_, `pr#22381 <https://github.com/ceph/ceph/pull/22381>`_, Sage Weil)
-* crush, osd: handle multiple parents properly when applying pg upmaps (`issue#23921 <http://tracker.ceph.com/issues/23921>`_, `pr#22115 <https://github.com/ceph/ceph/pull/22115>`_, xiexingguo)
-* doc: Fix -d description in ceph-fuse (`issue#23214 <http://tracker.ceph.com/issues/23214>`_, `pr#21616 <https://github.com/ceph/ceph/pull/21616>`_, Jos Collin)
-* doc:Update ceph-fuse doc (`issue#23084 <http://tracker.ceph.com/issues/23084>`_, `pr#21603 <https://github.com/ceph/ceph/pull/21603>`_, Jos Collin)
-* fuse: wire up fuse_ll_access (`issue#23509 <http://tracker.ceph.com/issues/23509>`_, `pr#21475 <https://github.com/ceph/ceph/pull/21475>`_, Jeff Layton)
-* kceph: umount on evicted client blocks forever (`issue#24053 <http://tracker.ceph.com/issues/24053>`_, `issue#24054 <http://tracker.ceph.com/issues/24054>`_, `pr#22208 <https://github.com/ceph/ceph/pull/22208>`_, Yan, Zheng, "Yan, Zheng")
-* librbd: commit IO as safe when complete if writeback cache is disabled (`issue#23516 <http://tracker.ceph.com/issues/23516>`_, `pr#22370 <https://github.com/ceph/ceph/pull/22370>`_, Jason Dillaman)
-* librbd: prevent watcher from unregistering with in-flight actions (`issue#23955 <http://tracker.ceph.com/issues/23955>`_, `pr#21938 <https://github.com/ceph/ceph/pull/21938>`_, Jason Dillaman)
-* lvm: when osd creation fails log the exception (`issue#24456 <http://tracker.ceph.com/issues/24456>`_, `pr#22641 <https://github.com/ceph/ceph/pull/22641>`_, Andrew Schoen)
-* mds: avoid calling rejoin_gather_finish() two times successively (`issue#24047 <http://tracker.ceph.com/issues/24047>`_, `pr#22171 <https://github.com/ceph/ceph/pull/22171>`_, "Yan, Zheng")
-* mds: broadcast quota to relevant clients when quota is explicitly set (`issue#24133 <http://tracker.ceph.com/issues/24133>`_, `pr#22271 <https://github.com/ceph/ceph/pull/22271>`_, Zhi Zhang)
-* mds: crash when failover (`issue#23518 <http://tracker.ceph.com/issues/23518>`_, `pr#21900 <https://github.com/ceph/ceph/pull/21900>`_, "Yan, Zheng")
-* mds: don't discover inode/dirfrag when mds is in 'starting' state (`issue#23812 <http://tracker.ceph.com/issues/23812>`_, `pr#21990 <https://github.com/ceph/ceph/pull/21990>`_, "Yan, Zheng")
-* mds: fix occasional dir rstat inconsistency between multi-MDSes (`issue#23538 <http://tracker.ceph.com/issues/23538>`_, `pr#21617 <https://github.com/ceph/ceph/pull/21617>`_, "Yan, Zheng", Zhi Zhang)
-* mds: fix some memory leak (`issue#24289 <http://tracker.ceph.com/issues/24289>`_, `pr#22310 <https://github.com/ceph/ceph/pull/22310>`_, "Yan, Zheng")
-* mds: fix unhealth heartbeat during rejoin (`issue#23530 <http://tracker.ceph.com/issues/23530>`_, `pr#21366 <https://github.com/ceph/ceph/pull/21366>`_, dongdong tao)
-* mds: handle imported session race (`issue#24072 <http://tracker.ceph.com/issues/24072>`_, `issue#24087 <http://tracker.ceph.com/issues/24087>`_, `pr#21989 <https://github.com/ceph/ceph/pull/21989>`_, Patrick Donnelly)
-* mds: include nfiles/nsubdirs of directory inode in MClientCaps (`issue#23855 <http://tracker.ceph.com/issues/23855>`_, `pr#22118 <https://github.com/ceph/ceph/pull/22118>`_, "Yan, Zheng")
-* mds: kick rdlock if waiting for dirfragtreelock (`issue#23919 <http://tracker.ceph.com/issues/23919>`_, `pr#21901 <https://github.com/ceph/ceph/pull/21901>`_, Patrick Donnelly)
-* mds: make rstat.rctime follow inodes' ctime (`issue#23380 <http://tracker.ceph.com/issues/23380>`_, `pr#21448 <https://github.com/ceph/ceph/pull/21448>`_, "Yan, Zheng")
-* mds: mark damaged if sessions' preallocated inos don't match inotable (`issue#23452 <http://tracker.ceph.com/issues/23452>`_, `pr#21372 <https://github.com/ceph/ceph/pull/21372>`_, "Yan, Zheng")
-* mds: mark new root inode dirty (`issue#23960 <http://tracker.ceph.com/issues/23960>`_, `pr#21922 <https://github.com/ceph/ceph/pull/21922>`_, Patrick Donnelly)
-* mds: mds shutdown fixes and optimization (`issue#23602 <http://tracker.ceph.com/issues/23602>`_, `pr#21346 <https://github.com/ceph/ceph/pull/21346>`_, "Yan, Zheng")
-* mds: misc load balancer fixes (`issue#21745 <http://tracker.ceph.com/issues/21745>`_, `pr#21412 <https://github.com/ceph/ceph/pull/21412>`_, "Yan, Zheng", Jianyu Li)
-* mds: properly check auth subtree count in MDCache::shutdown_pass() (`issue#23813 <http://tracker.ceph.com/issues/23813>`_, `pr#21844 <https://github.com/ceph/ceph/pull/21844>`_, "Yan, Zheng")
-* mds: properly dirty sessions opened by journal replay (`issue#23625 <http://tracker.ceph.com/issues/23625>`_, `pr#21441 <https://github.com/ceph/ceph/pull/21441>`_, "Yan, Zheng")
-* mds: properly trim log segments after scrub repairs something (`issue#23880 <http://tracker.ceph.com/issues/23880>`_, `pr#21840 <https://github.com/ceph/ceph/pull/21840>`_, "Yan, Zheng")
-* mds: set could_consume to false when no purge queue item actually exe… (`issue#24073 <http://tracker.ceph.com/issues/24073>`_, `pr#22176 <https://github.com/ceph/ceph/pull/22176>`_, Xuehan Xu)
-* mds: trim log during shutdown to clean metadata (`issue#23923 <http://tracker.ceph.com/issues/23923>`_, `pr#21899 <https://github.com/ceph/ceph/pull/21899>`_, Patrick Donnelly)
-* mds: underwater dentry check in CDir::_omap_fetched is racy (`issue#23032 <http://tracker.ceph.com/issues/23032>`_, `pr#21187 <https://github.com/ceph/ceph/pull/21187>`_, Yan, Zheng)
-* mg_read() call has wrong arguments (`issue#23596 <http://tracker.ceph.com/issues/23596>`_, `pr#21382 <https://github.com/ceph/ceph/pull/21382>`_, Nathan Cutler)
-* mgr/influx: Only split string on first occurence of dot (.) (`issue#23996 <http://tracker.ceph.com/issues/23996>`_, `pr#21965 <https://github.com/ceph/ceph/pull/21965>`_, Wido den Hollander)
-* mgr: Module 'balancer' has failed: could not find bucket -14 (`issue#24167 <http://tracker.ceph.com/issues/24167>`_, `pr#22308 <https://github.com/ceph/ceph/pull/22308>`_, Sage Weil)
-* mon: add  'ceph osd pool get erasure allow_ec_overwrites' command (`issue#23487 <http://tracker.ceph.com/issues/23487>`_, `pr#21378 <https://github.com/ceph/ceph/pull/21378>`_, Mykola Golub)
-* mon: enable level_compaction_dynamic_level_bytes for rocksdb (`issue#24361 <http://tracker.ceph.com/issues/24361>`_, `pr#22360 <https://github.com/ceph/ceph/pull/22360>`_, Kefu Chai)
-* mon: handle bad snapshot removal reqs gracefully (`issue#18746 <http://tracker.ceph.com/issues/18746>`_, `pr#21717 <https://github.com/ceph/ceph/pull/21717>`_, Paul Emmerich)
-* mon: High MON cpu usage when cluster is changing (`issue#23713 <http://tracker.ceph.com/issues/23713>`_, `pr#21968 <https://github.com/ceph/ceph/pull/21968>`_, Sage Weil, Xiaoxi CHEN)
-* mon/MDSMonitor: do not send redundant MDS health messages to cluster log (`issue#24308 <http://tracker.ceph.com/issues/24308>`_, `pr#22558 <https://github.com/ceph/ceph/pull/22558>`_, Sage Weil)
-* msg/async/AsyncConnection: Fix FPE in process_connection (`issue#23618 <http://tracker.ceph.com/issues/23618>`_, `pr#21376 <https://github.com/ceph/ceph/pull/21376>`_, Brad Hubbard)
-* os/bluestore: alter the allow_eio policy regarding kernel's error list (`issue#23333 <http://tracker.ceph.com/issues/23333>`_, `pr#21405 <https://github.com/ceph/ceph/pull/21405>`_, Radoslaw Zarzynski)
-* os/bluestore/bluefs_types: make block_mask 64-bit (`issue#23840 <http://tracker.ceph.com/issues/23840>`_, `pr#21740 <https://github.com/ceph/ceph/pull/21740>`_, Sage Weil)
-* os/bluestore: fix exceeding the max IO queue depth in KernelDevice (`issue#23246 <http://tracker.ceph.com/issues/23246>`_, `pr#21407 <https://github.com/ceph/ceph/pull/21407>`_, Radoslaw Zarzynski)
-* os/bluestore: fix SharedBlobSet refcounting race (`issue#24319 <http://tracker.ceph.com/issues/24319>`_, `pr#22650 <https://github.com/ceph/ceph/pull/22650>`_, Sage Weil)
-* os/bluestore: simplify and fix SharedBlob::put() (`issue#24211 <http://tracker.ceph.com/issues/24211>`_, `pr#22351 <https://github.com/ceph/ceph/pull/22351>`_, Sage Weil)
-* osdc/Objecter: fix recursive locking in _finish_command (`issue#23940 <http://tracker.ceph.com/issues/23940>`_, `pr#21939 <https://github.com/ceph/ceph/pull/21939>`_, Sage Weil)
-* osdc/Objecter: prevent double-invocation of linger op callback (`issue#23872 <http://tracker.ceph.com/issues/23872>`_, `pr#21752 <https://github.com/ceph/ceph/pull/21752>`_, Jason Dillaman)
-* osd: do not crash on empty snapset (`issue#23851 <http://tracker.ceph.com/issues/23851>`_, `pr#21638 <https://github.com/ceph/ceph/pull/21638>`_, Mykola Golub, Igor Fedotov)
-* osd: Don't evict even when preemption has restarted with smaller chunk (`issue#22881 <http://tracker.ceph.com/issues/22881>`_, `issue#23909 <http://tracker.ceph.com/issues/23909>`_, `issue#23646 <http://tracker.ceph.com/issues/23646>`_, `pr#22044 <https://github.com/ceph/ceph/pull/22044>`_, Sage Weil, fang yuxiang, Jianpeng Ma, kungf, xie xingguo, David Zafman)
-* osd/ECBackend: only check required shards when finishing recovery reads (`issue#23195 <http://tracker.ceph.com/issues/23195>`_, `pr#21911 <https://github.com/ceph/ceph/pull/21911>`_, Josh Durgin, Kefu Chai)
-* osd: increase default hard pg limit (`issue#24243 <http://tracker.ceph.com/issues/24243>`_, `pr#22592 <https://github.com/ceph/ceph/pull/22592>`_, Josh Durgin)
-* osd/OSDMap: check against cluster topology changing before applying pg upmaps (`issue#23878 <http://tracker.ceph.com/issues/23878>`_, `pr#21818 <https://github.com/ceph/ceph/pull/21818>`_, xiexingguo)
-* osd/PG: fix DeferRecovery vs AllReplicasRecovered race (`issue#23860 <http://tracker.ceph.com/issues/23860>`_, `pr#21964 <https://github.com/ceph/ceph/pull/21964>`_, Sage Weil)
-* osd/PG: fix uninit read in Incomplete::react(AdvMap&) (`issue#23980 <http://tracker.ceph.com/issues/23980>`_, `pr#21993 <https://github.com/ceph/ceph/pull/21993>`_, Sage Weil)
-* osd/PrimaryLogPG: avoid infinite loop when flush collides with write … (`issue#23664 <http://tracker.ceph.com/issues/23664>`_, `pr#21764 <https://github.com/ceph/ceph/pull/21764>`_, Sage Weil)
-* osd: publish osdmap to OSDService before starting wq threads (`issue#21977 <http://tracker.ceph.com/issues/21977>`_, `pr#21737 <https://github.com/ceph/ceph/pull/21737>`_, Sage Weil)
-* osd: Warn about objects with too many omap entries (`issue#23784 <http://tracker.ceph.com/issues/23784>`_, `pr#21518 <https://github.com/ceph/ceph/pull/21518>`_, Brad Hubbard)
-* qa: disable -Werror when compiling env_librados_test (`issue#23786 <http://tracker.ceph.com/issues/23786>`_, `pr#21655 <https://github.com/ceph/ceph/pull/21655>`_, Kefu Chai)
-* qa: fix blacklisted check for test_lifecycle (`issue#23975 <http://tracker.ceph.com/issues/23975>`_, `pr#21921 <https://github.com/ceph/ceph/pull/21921>`_, Patrick Donnelly)
-* qa: remove racy/buggy test_purge_queue_op_rate (`issue#23829 <http://tracker.ceph.com/issues/23829>`_, `pr#21841 <https://github.com/ceph/ceph/pull/21841>`_, Patrick Donnelly)
-* qa/suites/rbd/basic/msgr-failures: remove many.yaml (`issue#23789 <http://tracker.ceph.com/issues/23789>`_, `pr#22128 <https://github.com/ceph/ceph/pull/22128>`_, Sage Weil)
-* qa: wait longer for osd to flush pg stats (`issue#24321 <http://tracker.ceph.com/issues/24321>`_, `pr#22296 <https://github.com/ceph/ceph/pull/22296>`_, Kefu Chai)
-* qa/workunits/mon/test_mon_config_key.py fails on master (`issue#23622 <http://tracker.ceph.com/issues/23622>`_, `pr#21368 <https://github.com/ceph/ceph/pull/21368>`_, Sage Weil)
-* qa/workunits/rbd: adapt import_export test to handle multiple units (`issue#24733 <http://tracker.ceph.com/issues/24733>`_, `pr#22911 <https://github.com/ceph/ceph/pull/22911>`_, Jason Dillaman)
-* qa/workunits/rbd: potential race in mirror disconnect test (`issue#23938 <http://tracker.ceph.com/issues/23938>`_, `pr#21869 <https://github.com/ceph/ceph/pull/21869>`_, Mykola Golub)
-* radosgw-admin sync status improvements (`issue#20473 <http://tracker.ceph.com/issues/20473>`_, `pr#21908 <https://github.com/ceph/ceph/pull/21908>`_, lvshanchun, Casey Bodley)
-* rbd: improve 'import-diff' corrupt input error messages (`issue#18844 <http://tracker.ceph.com/issues/18844>`_, `issue#23038 <http://tracker.ceph.com/issues/23038>`_, `pr#21316 <https://github.com/ceph/ceph/pull/21316>`_, PCzhangPC, songweibin, Jason Dillaman)
-* rbd-mirror: ensure remote demotion is replayed locally (`issue#24009 <http://tracker.ceph.com/issues/24009>`_, `pr#22142 <https://github.com/ceph/ceph/pull/22142>`_, Jason Dillaman)
-* rbd-nbd can deadlock in logging thread (`issue#23143 <http://tracker.ceph.com/issues/23143>`_, `pr#21705 <https://github.com/ceph/ceph/pull/21705>`_, Sage Weil)
-* rbd: python bindings fixes and improvements (`issue#23609 <http://tracker.ceph.com/issues/23609>`_, `pr#21725 <https://github.com/ceph/ceph/pull/21725>`_, Ricardo Dias)
-* rbd: [rbd-mirror] asok hook for image replayer not re-registered after bootstrap (`issue#23888 <http://tracker.ceph.com/issues/23888>`_, `pr#21726 <https://github.com/ceph/ceph/pull/21726>`_, Jason Dillaman)
-* rbd: [rbd-mirror] local tag predecessor mirror uuid is incorrectly replaced with remote (`issue#23876 <http://tracker.ceph.com/issues/23876>`_, `pr#21741 <https://github.com/ceph/ceph/pull/21741>`_, Jason Dillaman)
-* rbd: [rbd-mirror] potential deadlock when running asok 'flush' command (`issue#24141 <http://tracker.ceph.com/issues/24141>`_, `pr#22180 <https://github.com/ceph/ceph/pull/22180>`_, Mykola Golub)
-* rbd: [rbd-mirror] potential races during PoolReplayer shut-down (`issue#24008 <http://tracker.ceph.com/issues/24008>`_, `pr#22172 <https://github.com/ceph/ceph/pull/22172>`_, Jason Dillaman)
-* rgw: add buffering filter to compression for fetch_remote_obj (`issue#23547 <http://tracker.ceph.com/issues/23547>`_, `pr#21758 <https://github.com/ceph/ceph/pull/21758>`_, Casey Bodley)
-* rgw: add configurable AWS-compat invalid range get behavior (`issue#24317 <http://tracker.ceph.com/issues/24317>`_, `pr#22302 <https://github.com/ceph/ceph/pull/22302>`_, Matt Benjamin)
-* rgw: admin rest api shouldn't return error when getting user's stats if (`issue#23821 <http://tracker.ceph.com/issues/23821>`_, `pr#21661 <https://github.com/ceph/ceph/pull/21661>`_, Zhang Shaowen)
-* rgw: Allow swift acls to be deleted (`issue#22897 <http://tracker.ceph.com/issues/22897>`_, `pr#22465 <https://github.com/ceph/ceph/pull/22465>`_, Marcus Watts)
-* rgw: aws4 auth supports PutBucketRequestPayment (`issue#23803 <http://tracker.ceph.com/issues/23803>`_, `pr#21660 <https://github.com/ceph/ceph/pull/21660>`_, Casey Bodley)
-* rgw: beast frontend can listen on multiple endpoints (`issue#22779 <http://tracker.ceph.com/issues/22779>`_, `pr#21568 <https://github.com/ceph/ceph/pull/21568>`_, Casey Bodley)
-* rgw: Bucket lifecycles stick around after buckets are deleted (`issue#19632 <http://tracker.ceph.com/issues/19632>`_, `pr#22551 <https://github.com/ceph/ceph/pull/22551>`_, Wei Qiaomiao)
-* rgw: Do not modify email if argument is not set (`issue#24142 <http://tracker.ceph.com/issues/24142>`_, `pr#22352 <https://github.com/ceph/ceph/pull/22352>`_, Volker Theile)
-* rgw: do not reflect period if not current (`issue#22844 <http://tracker.ceph.com/issues/22844>`_, `pr#21735 <https://github.com/ceph/ceph/pull/21735>`_, Tianshan Qu)
-* rgw: es module: set compression type correctly (`issue#22758 <http://tracker.ceph.com/issues/22758>`_, `pr#21736 <https://github.com/ceph/ceph/pull/21736>`_, Abhishek Lekshmanan)
-* rgw_file: conditionally unlink handles when direct deleted (`issue#23299 <http://tracker.ceph.com/issues/23299>`_, `pr#21438 <https://github.com/ceph/ceph/pull/21438>`_, Matt Benjamin)
-* rgw: fix bi_list to reset is_truncated flag if it skips entires (`issue#22721 <http://tracker.ceph.com/issues/22721>`_, `pr#21669 <https://github.com/ceph/ceph/pull/21669>`_, Orit Wasserman)
-* rgw: fix 'copy part' without 'x-amz-copy-source-range' when compressi… (`issue#23196 <http://tracker.ceph.com/issues/23196>`_, `pr#22438 <https://github.com/ceph/ceph/pull/22438>`_, fang yuxiang)
-* rgw: fix error handling for GET with ?torrent (`issue#23506 <http://tracker.ceph.com/issues/23506>`_, `pr#21674 <https://github.com/ceph/ceph/pull/21674>`_, Casey Bodley)
-* rgw: fix use of libcurl with empty header values (`issue#23663 <http://tracker.ceph.com/issues/23663>`_, `pr#21738 <https://github.com/ceph/ceph/pull/21738>`_, Casey Bodley)
-* rgw:lc: RGWPutLC return ERR_MALFORMED_XML  when missing <Rule> tag in… (`issue#21377 <http://tracker.ceph.com/issues/21377>`_, `pr#19884 <https://github.com/ceph/ceph/pull/19884>`_, Shasha Lu)
-* rgw: making implicit_tenants backwards compatible (`issue#24348 <http://tracker.ceph.com/issues/24348>`_, `pr#22363 <https://github.com/ceph/ceph/pull/22363>`_, Marcus Watts)
-* rgw: Misnamed S3 operation (`issue#24061 <http://tracker.ceph.com/issues/24061>`_, `pr#21917 <https://github.com/ceph/ceph/pull/21917>`_, xiangxiang)
-* rgw: move all pool creation into rgw_init_ioctx (`issue#23480 <http://tracker.ceph.com/issues/23480>`_, `pr#21675 <https://github.com/ceph/ceph/pull/21675>`_, Casey Bodley)
-* rgw: radosgw-admin should not use metadata cache for readonly commands (`issue#23468 <http://tracker.ceph.com/issues/23468>`_, `pr#21437 <https://github.com/ceph/ceph/pull/21437>`_, Orit Wasserman)
-* rgw: raise log level on coroutine shutdown errors (`issue#23974 <http://tracker.ceph.com/issues/23974>`_, `pr#21792 <https://github.com/ceph/ceph/pull/21792>`_, Casey Bodley)
-* rgw: return EINVAL if max_keys can not convert correctly (`issue#23586 <http://tracker.ceph.com/issues/23586>`_, `pr#21435 <https://github.com/ceph/ceph/pull/21435>`_, yuliyang)
-* rgw: rgw_statfs should report the correct stats (`issue#22202 <http://tracker.ceph.com/issues/22202>`_, `pr#21724 <https://github.com/ceph/ceph/pull/21724>`_, Supriti Singh)
-* rgw: trim all spaces inside a metadata value (`issue#23301 <http://tracker.ceph.com/issues/23301>`_, `pr#22177 <https://github.com/ceph/ceph/pull/22177>`_, Orit Wasserman)
-* slow mon ops from osd_failure (`issue#24322 <http://tracker.ceph.com/issues/24322>`_, `pr#22568 <https://github.com/ceph/ceph/pull/22568>`_, Sage Weil)
-* table of contents doesn't render for luminous/jewel docs (`issue#23780 <http://tracker.ceph.com/issues/23780>`_, `pr#21502 <https://github.com/ceph/ceph/pull/21502>`_, Alfredo Deza)
-* test/librados: increase pgp_num along with pg_num (`issue#23763 <http://tracker.ceph.com/issues/23763>`_, `pr#21556 <https://github.com/ceph/ceph/pull/21556>`_, Kefu Chai)
-* test/rgw: fix for bucket checkpoints (`issue#24212 <http://tracker.ceph.com/issues/24212>`_, `pr#22541 <https://github.com/ceph/ceph/pull/22541>`_, Casey Bodley)
-* tests: filestore journal replay does not guard omap operations (`issue#22920 <http://tracker.ceph.com/issues/22920>`_, `pr#21547 <https://github.com/ceph/ceph/pull/21547>`_, Sage Weil)
-* tools: ceph-disk: write log to /var/log/ceph not to /var/run/ceph (`issue#24041 <http://tracker.ceph.com/issues/24041>`_, `pr#21870 <https://github.com/ceph/ceph/pull/21870>`_, Kefu Chai)
-* tools: ceph-fuse: getgroups failure causes exception (`issue#23446 <http://tracker.ceph.com/issues/23446>`_, `pr#21687 <https://github.com/ceph/ceph/pull/21687>`_, Jeff Layton)
-
-
-v12.2.5 Luminous
-================
-
-This is the fifth bugfix release of Luminous v12.2.x long term stable
-release series. This release contains a range of bug fixes across all
-components of Ceph. We recommend all the users of 12.2.x series to
-update.
-
-Notable Changes
----------------
-
-* MGR
-
-  The ceph-rest-api command-line tool included in the ceph-mon
-  package has been obsoleted by the MGR "restful" module. The
-  ceph-rest-api tool is hereby declared deprecated and will be dropped
-  in Mimic.
-
-  The MGR "restful" module provides similar functionality via a "pass through"
-  method. See http://docs.ceph.com/docs/luminous/mgr/restful for details.
-
-* CephFS
-
-  Upgrading an MDS cluster to 12.2.3+ will result in all active MDS
-  exiting due to feature incompatibilities once an upgraded MDS comes
-  online (even as standby). Operators may ignore the error messages
-  and continue upgrading/restarting or follow this upgrade sequence:
-
-  Reduce the number of ranks to 1 (`ceph fs set <fs_name> max_mds 1`),
-  wait for all other MDS to deactivate, leaving the one active MDS,
-  upgrade the single active MDS, then upgrade/start standbys. Finally,
-  restore the previous max_mds.
-
-  See also: https://tracker.ceph.com/issues/23172
-
-
-Other Notable Changes
----------------------
-
-* add --add-bucket and --move options to crushtool (`issue#23472 <http://tracker.ceph.com/issues/23472>`_, `issue#23471 <http://tracker.ceph.com/issues/23471>`_, `pr#21079 <https://github.com/ceph/ceph/pull/21079>`_, Kefu Chai)
-* BlueStore.cc: _balance_bluefs_freespace: assert(0 == "allocate failed, wtf") (`issue#23063 <http://tracker.ceph.com/issues/23063>`_, `pr#21394 <https://github.com/ceph/ceph/pull/21394>`_, Igor Fedotov, xie xingguo, Sage Weil, Zac Medico)
-* bluestore: correctly check all block devices to decide if journal is\_… (`issue#23173 <http://tracker.ceph.com/issues/23173>`_, `issue#23141 <http://tracker.ceph.com/issues/23141>`_, `pr#20651 <https://github.com/ceph/ceph/pull/20651>`_, Greg Farnum)
-* bluestore: statfs available can go negative (`issue#23074 <http://tracker.ceph.com/issues/23074>`_, `pr#20554 <https://github.com/ceph/ceph/pull/20554>`_, Igor Fedotov, Sage Weil)
-* build Debian installation packages failure (`issue#22856 <http://tracker.ceph.com/issues/22856>`_, `issue#22828 <http://tracker.ceph.com/issues/22828>`_, `pr#20250 <https://github.com/ceph/ceph/pull/20250>`_, Tone Zhang)
-* build/ops: deb: move python-jinja2 dependency to mgr (`issue#22457 <http://tracker.ceph.com/issues/22457>`_, `pr#20748 <https://github.com/ceph/ceph/pull/20748>`_, Nathan Cutler)
-* build/ops: deb: move python-jinja2 dependency to mgr (`issue#22457 <http://tracker.ceph.com/issues/22457>`_, `pr#21233 <https://github.com/ceph/ceph/pull/21233>`_, Nathan Cutler)
-* build/ops: run-make-check.sh: fix SUSE support (`issue#22875 <http://tracker.ceph.com/issues/22875>`_, `issue#23178 <http://tracker.ceph.com/issues/23178>`_, `pr#20737 <https://github.com/ceph/ceph/pull/20737>`_, Nathan Cutler)
-* cephfs-journal-tool: Fix Dumper destroyed before shutdown (`issue#22862 <http://tracker.ceph.com/issues/22862>`_, `issue#22734 <http://tracker.ceph.com/issues/22734>`_, `pr#20251 <https://github.com/ceph/ceph/pull/20251>`_, dongdong tao)
-* ceph.in: print all matched commands if arg missing (`issue#22344 <http://tracker.ceph.com/issues/22344>`_, `issue#23186 <http://tracker.ceph.com/issues/23186>`_, `pr#20664 <https://github.com/ceph/ceph/pull/20664>`_, Luo Kexue, Kefu Chai)
-* ceph-objectstore-tool command to trim the pg log (`issue#23242 <http://tracker.ceph.com/issues/23242>`_, `pr#20803 <https://github.com/ceph/ceph/pull/20803>`_, Josh Durgin, David Zafman)
-* ceph osd force-create-pg cause all ceph-mon to crash and unable to come up again (`issue#22942 <http://tracker.ceph.com/issues/22942>`_, `pr#20399 <https://github.com/ceph/ceph/pull/20399>`_, Sage Weil)
-* ceph-volume: adds raw device support to 'lvm list' (`issue#23140 <http://tracker.ceph.com/issues/23140>`_, `pr#20647 <https://github.com/ceph/ceph/pull/20647>`_, Andrew Schoen)
-* ceph-volume: allow parallel creates (`issue#23757 <http://tracker.ceph.com/issues/23757>`_, `pr#21509 <https://github.com/ceph/ceph/pull/21509>`_, Theofilos Mouratidis)
-* ceph-volume: allow skipping systemd interactions on activate/create (`issue#23678 <http://tracker.ceph.com/issues/23678>`_, `pr#21538 <https://github.com/ceph/ceph/pull/21538>`_, Alfredo Deza)
-* ceph-volume: automatic VDO detection (`issue#23581 <http://tracker.ceph.com/issues/23581>`_, `pr#21505 <https://github.com/ceph/ceph/pull/21505>`_, Alfredo Deza)
-* ceph-volume be resilient to $PATH issues (`pr#20716 <https://github.com/ceph/ceph/pull/20716>`_, Alfredo Deza)
-* ceph-volume: fix action plugins path in tox (`pr#20923 <https://github.com/ceph/ceph/pull/20923>`_, Guillaume Abrioux)
-* ceph-volume Implement an 'activate all' to help with dense servers or migrating OSDs (`pr#21533 <https://github.com/ceph/ceph/pull/21533>`_, Alfredo Deza)
-* ceph-volume improve robustness when reloading vms in tests (`pr#21072 <https://github.com/ceph/ceph/pull/21072>`_, Alfredo Deza)
-* ceph-volume lvm.activate error if no bluestore OSDs are found (`issue#23644 <http://tracker.ceph.com/issues/23644>`_, `pr#21335 <https://github.com/ceph/ceph/pull/21335>`_, Alfredo Deza)
-* ceph-volume: Nits noticed while studying code (`pr#21565 <https://github.com/ceph/ceph/pull/21565>`_, Dan Mick)
-* ceph-volume tests alleviate libvirt timeouts when reloading (`issue#23163 <http://tracker.ceph.com/issues/23163>`_, `pr#20754 <https://github.com/ceph/ceph/pull/20754>`_, Alfredo Deza)
-* ceph-volume update man page for prepare/activate flags (`pr#21574 <https://github.com/ceph/ceph/pull/21574>`_, Alfredo Deza)
-* ceph-volume: Using --readonly for {vg|pv|lv}s commands (`pr#21519 <https://github.com/ceph/ceph/pull/21519>`_, Erwan Velu)
-* client: allow client to use caps that are revoked but not yet returned (`issue#23028 <http://tracker.ceph.com/issues/23028>`_, `issue#23314 <http://tracker.ceph.com/issues/23314>`_, `pr#20904 <https://github.com/ceph/ceph/pull/20904>`_, Jeff Layton)
-* : Client:Fix readdir bug (`issue#22936 <http://tracker.ceph.com/issues/22936>`_, `pr#20356 <https://github.com/ceph/ceph/pull/20356>`_, dongdong tao)
-* client: release revoking Fc after invalidate cache (`issue#22652 <http://tracker.ceph.com/issues/22652>`_, `pr#20342 <https://github.com/ceph/ceph/pull/20342>`_, "Yan, Zheng")
-* Client: setattr should drop "Fs" rather than "As" for mtime and size (`issue#22935 <http://tracker.ceph.com/issues/22935>`_, `pr#20354 <https://github.com/ceph/ceph/pull/20354>`_, dongdong tao)
-* client: use either dentry_invalidate_cb or remount_cb to invalidate k… (`issue#23355 <http://tracker.ceph.com/issues/23355>`_, `pr#20960 <https://github.com/ceph/ceph/pull/20960>`_, Zhi Zhang)
-* cls/rbd: group_image_list incorrectly flagged as RW (`issue#23407 <http://tracker.ceph.com/issues/23407>`_, `issue#23388 <http://tracker.ceph.com/issues/23388>`_, `pr#20967 <https://github.com/ceph/ceph/pull/20967>`_, Jason Dillaman)
-* cls/rgw: fix bi_log_iterate_entries return wrong truncated (`issue#22737 <http://tracker.ceph.com/issues/22737>`_, `issue#23225 <http://tracker.ceph.com/issues/23225>`_, `pr#21054 <https://github.com/ceph/ceph/pull/21054>`_, Tianshan Qu)
-* cmake: rbd resource agent needs to be executable (`issue#22980 <http://tracker.ceph.com/issues/22980>`_, `pr#20617 <https://github.com/ceph/ceph/pull/20617>`_, Tim Bishop)
-* common/dns_resolv.cc: Query for AAAA-record if ms_bind_ipv6 is True (`issue#23078 <http://tracker.ceph.com/issues/23078>`_, `issue#23174 <http://tracker.ceph.com/issues/23174>`_, `pr#20710 <https://github.com/ceph/ceph/pull/20710>`_, Wido den Hollander)
-* common/ipaddr: Do not select link-local IPv6 addresses (`issue#21813 <http://tracker.ceph.com/issues/21813>`_, `pr#21111 <https://github.com/ceph/ceph/pull/21111>`_, Willem Jan Withagen)
-* common: omit short option for id in help for clients (`issue#23156 <http://tracker.ceph.com/issues/23156>`_, `issue#23041 <http://tracker.ceph.com/issues/23041>`_, `pr#20654 <https://github.com/ceph/ceph/pull/20654>`_, Patrick Donnelly)
-* common: should not check for VERSION_ID (`issue#23477 <http://tracker.ceph.com/issues/23477>`_, `issue#23478 <http://tracker.ceph.com/issues/23478>`_, `pr#21090 <https://github.com/ceph/ceph/pull/21090>`_, Kefu Chai, Shengjing Zhu)
-* config: Change bluestore_cache_kv_max to type INT64 (`pr#20334 <https://github.com/ceph/ceph/pull/20334>`_, Zhi Zhang)
-* Couldn't init storage provider (RADOS) (`issue#23349 <http://tracker.ceph.com/issues/23349>`_, `issue#22351 <http://tracker.ceph.com/issues/22351>`_, `pr#20896 <https://github.com/ceph/ceph/pull/20896>`_, Brad Hubbard)
-* doc: Add missing pg states from doc (`issue#23113 <http://tracker.ceph.com/issues/23113>`_, `pr#20584 <https://github.com/ceph/ceph/pull/20584>`_, David Zafman)
-* doc: outline upgrade procedure for mds cluster (`issue#23634 <http://tracker.ceph.com/issues/23634>`_, `issue#23568 <http://tracker.ceph.com/issues/23568>`_, `pr#21352 <https://github.com/ceph/ceph/pull/21352>`_, Patrick Donnelly)
-* doc/rgw: add page for http frontend configuration (`issue#13523 <http://tracker.ceph.com/issues/13523>`_, `issue#22884 <http://tracker.ceph.com/issues/22884>`_, `pr#20242 <https://github.com/ceph/ceph/pull/20242>`_, Casey Bodley)
-* doc: rgw: mention the civetweb support for binding to multiple ports (`issue#20942 <http://tracker.ceph.com/issues/20942>`_, `issue#23317 <http://tracker.ceph.com/issues/23317>`_, `pr#20906 <https://github.com/ceph/ceph/pull/20906>`_, Abhishek Lekshmanan)
-* docs fix ceph-volume missing sub-commands (`pr#20691 <https://github.com/ceph/ceph/pull/20691>`_, Katie Holly, Yao Zongyou, David Galloway, Sage Weil, Alfredo Deza)
-* doc: update man page to explain ceph-volume support bluestore (`issue#23142 <http://tracker.ceph.com/issues/23142>`_, `issue#22663 <http://tracker.ceph.com/issues/22663>`_, `pr#20679 <https://github.com/ceph/ceph/pull/20679>`_, lijing)
-* Double free in rados_getxattrs_next (`issue#22940 <http://tracker.ceph.com/issues/22940>`_, `issue#22042 <http://tracker.ceph.com/issues/22042>`_, `pr#20358 <https://github.com/ceph/ceph/pull/20358>`_, Gu Zhongyan)
-* fixes for openssl & libcurl (`issue#23239 <http://tracker.ceph.com/issues/23239>`_, `issue#23245 <http://tracker.ceph.com/issues/23245>`_, `issue#22951 <http://tracker.ceph.com/issues/22951>`_, `issue#23221 <http://tracker.ceph.com/issues/23221>`_, `issue#23203 <http://tracker.ceph.com/issues/23203>`_, `pr#20722 <https://github.com/ceph/ceph/pull/20722>`_, Marcus Watts, Abhishek Lekshmanan, Jesse Williamson)
-* invalid JSON returned when querying pool parameters (`issue#23312 <http://tracker.ceph.com/issues/23312>`_, `issue#23200 <http://tracker.ceph.com/issues/23200>`_, `pr#20890 <https://github.com/ceph/ceph/pull/20890>`_, Chang Liu)
-* is_qemu_running in qemu_rebuild_object_map.sh and qemu_dynamic_features.sh may return false positive (`issue#23524 <http://tracker.ceph.com/issues/23524>`_, `pr#21192 <https://github.com/ceph/ceph/pull/21192>`_, Mykola Golub)
-* [journal] allocating a new tag after acquiring the lock should use on-disk committed position (`issue#23011 <http://tracker.ceph.com/issues/23011>`_, `issue#22945 <http://tracker.ceph.com/issues/22945>`_, `pr#20454 <https://github.com/ceph/ceph/pull/20454>`_, Jason Dillaman)
-* journal: Message too long error when appending journal (`issue#23545 <http://tracker.ceph.com/issues/23545>`_, `issue#23526 <http://tracker.ceph.com/issues/23526>`_, `pr#21216 <https://github.com/ceph/ceph/pull/21216>`_, Mykola Golub)
-* legal: remove doc license ambiguity (`issue#23410 <http://tracker.ceph.com/issues/23410>`_, `issue#23336 <http://tracker.ceph.com/issues/23336>`_, `pr#20988 <https://github.com/ceph/ceph/pull/20988>`_, Nathan Cutler)
-* librados: make OPERATION_FULL_FORCE the default for rados_remove() (`issue#23114 <http://tracker.ceph.com/issues/23114>`_, `issue#22413 <http://tracker.ceph.com/issues/22413>`_, `pr#20585 <https://github.com/ceph/ceph/pull/20585>`_, Kefu Chai)
-* librados/snap_set_diff: don't assert on empty snapset (`issue#23423 <http://tracker.ceph.com/issues/23423>`_, `pr#20991 <https://github.com/ceph/ceph/pull/20991>`_, Mykola Golub)
-* librbd: potential crash if object map check encounters error (`issue#22857 <http://tracker.ceph.com/issues/22857>`_, `issue#22819 <http://tracker.ceph.com/issues/22819>`_, `pr#20253 <https://github.com/ceph/ceph/pull/20253>`_, Jason Dillaman)
-* log: Fix AddressSanitizer: new-delete-type-mismatch (`issue#23324 <http://tracker.ceph.com/issues/23324>`_, `issue#23412 <http://tracker.ceph.com/issues/23412>`_, `pr#20998 <https://github.com/ceph/ceph/pull/20998>`_, Brad Hubbard)
-* mds: add uptime to MDS status (`issue#23150 <http://tracker.ceph.com/issues/23150>`_, `pr#20626 <https://github.com/ceph/ceph/pull/20626>`_, Patrick Donnelly)
-* mds: FAILED assert (p != active_requests.end()) in MDRequestRef MDCache::request_get(metareqid_t) (`issue#23154 <http://tracker.ceph.com/issues/23154>`_, `issue#23059 <http://tracker.ceph.com/issues/23059>`_, `pr#21176 <https://github.com/ceph/ceph/pull/21176>`_, "Yan, Zheng")
-* mds: fix session reference leak (`issue#22821 <http://tracker.ceph.com/issues/22821>`_, `issue#22969 <http://tracker.ceph.com/issues/22969>`_, `pr#20432 <https://github.com/ceph/ceph/pull/20432>`_, "Yan, Zheng")
-* mds: optimize getattr file size (`issue#23013 <http://tracker.ceph.com/issues/23013>`_, `issue#22925 <http://tracker.ceph.com/issues/22925>`_, `pr#20455 <https://github.com/ceph/ceph/pull/20455>`_, "Yan, Zheng")
-* mgr: Backport recent prometheus exporter changes (`pr#20642 <https://github.com/ceph/ceph/pull/20642>`_, Jan Fajerski, Boris Ranto)
-* mgr: Backport recent prometheus rgw changes (`pr#21492 <https://github.com/ceph/ceph/pull/21492>`_, Jan Fajerski, John Spray, Boris Ranto, Rubab-Syed)
-* mgr/balancer: pool-specific optimization support and bug fixes (`pr#20359 <https://github.com/ceph/ceph/pull/20359>`_, xie xingguo)
-* mgr: die on bind() failure (`issue#23175 <http://tracker.ceph.com/issues/23175>`_, `pr#20712 <https://github.com/ceph/ceph/pull/20712>`_, John Spray)
-* mgr: fix MSG_MGR_MAP handling (`issue#23409 <http://tracker.ceph.com/issues/23409>`_, `pr#20973 <https://github.com/ceph/ceph/pull/20973>`_, Gu Zhongyan)
-* mgr: prometheus: fix PG state names (`pr#21365 <https://github.com/ceph/ceph/pull/21365>`_, John Spray)
-* mgr: prometheus: set metadata metrics value to '1' (#22717) (`pr#20254 <https://github.com/ceph/ceph/pull/20254>`_, Konstantin Shalygin)
-* mgr: quieten logging on missing OSD stats (`issue#23224 <http://tracker.ceph.com/issues/23224>`_, `pr#21053 <https://github.com/ceph/ceph/pull/21053>`_, John Spray)
-* mgr/zabbix: Backports to Luminous (`pr#20781 <https://github.com/ceph/ceph/pull/20781>`_, Wido den Hollander)
-* mon: allow removal of tier of ec overwritable pool (`issue#22971 <http://tracker.ceph.com/issues/22971>`_, `issue#22754 <http://tracker.ceph.com/issues/22754>`_, `pr#20433 <https://github.com/ceph/ceph/pull/20433>`_, Patrick Donnelly)
-* mon: ops get stuck in "resend forwarded message to leader" (`issue#22114 <http://tracker.ceph.com/issues/22114>`_, `issue#23077 <http://tracker.ceph.com/issues/23077>`_, `pr#21016 <https://github.com/ceph/ceph/pull/21016>`_, Kefu Chai, Greg Farnum)
-* mon, osd: fix potential collided \*Up Set\* after PG remapping (`issue#23118 <http://tracker.ceph.com/issues/23118>`_, `pr#20829 <https://github.com/ceph/ceph/pull/20829>`_, xie xingguo)
-* mon/OSDMonitor.cc: fix expected_num_objects interpret error (`issue#22530 <http://tracker.ceph.com/issues/22530>`_, `issue#23315 <http://tracker.ceph.com/issues/23315>`_, `pr#20907 <https://github.com/ceph/ceph/pull/20907>`_, Yang Honggang)
-* mon: update PaxosService::cached_first_committed in PaxosService::may… (`issue#23626 <http://tracker.ceph.com/issues/23626>`_, `issue#11332 <http://tracker.ceph.com/issues/11332>`_, `pr#21328 <https://github.com/ceph/ceph/pull/21328>`_, Xuehan Xu, yupeng chen)
-* msg/async: size of EventCenter::file_events should be greater than fd (`issue#23253 <http://tracker.ceph.com/issues/23253>`_, `issue#23306 <http://tracker.ceph.com/issues/23306>`_, `pr#20867 <https://github.com/ceph/ceph/pull/20867>`_, Yupeng Chen)
-* Objecter: add ignore overlay flag if got redirect reply (`pr#20766 <https://github.com/ceph/ceph/pull/20766>`_, Ting Yi Lin)
-* os/bluestore: avoid overhead of std::function in blob_t (`pr#20674 <https://github.com/ceph/ceph/pull/20674>`_, Radoslaw Zarzynski)
-* os/bluestore: avoid unneeded BlobRefing in _do_read() (`pr#20675 <https://github.com/ceph/ceph/pull/20675>`_, Radoslaw Zarzynski)
-* os/bluestore: backport fixes around _reap_collection (`pr#20964 <https://github.com/ceph/ceph/pull/20964>`_, Jianpeng Ma)
-* os/bluestore: change the type of aio_t:res to long (`issue#23527 <http://tracker.ceph.com/issues/23527>`_, `issue#23544 <http://tracker.ceph.com/issues/23544>`_, `pr#21231 <https://github.com/ceph/ceph/pull/21231>`_, kungf)
-* os/bluestore: _dump_onode() don't prolongate Onode anymore (`pr#20676 <https://github.com/ceph/ceph/pull/20676>`_, Radoslaw Zarzynski)
-* os/bluestore: recalc_allocated() when decoding bluefs_fnode_t (`issue#23256 <http://tracker.ceph.com/issues/23256>`_, `issue#23212 <http://tracker.ceph.com/issues/23212>`_, `pr#20771 <https://github.com/ceph/ceph/pull/20771>`_, Jianpeng Ma, Igor Fedotov, Kefu Chai)
-* os/bluestore: trim cache every 50ms (instead of 200ms) (`issue#23226 <http://tracker.ceph.com/issues/23226>`_, `pr#21059 <https://github.com/ceph/ceph/pull/21059>`_, Sage Weil)
-* osd: add numpg_removing metric (`pr#20785 <https://github.com/ceph/ceph/pull/20785>`_, Sage Weil)
-* osdc/Journaler: make sure flush() writes enough data (`issue#22967 <http://tracker.ceph.com/issues/22967>`_, `issue#22824 <http://tracker.ceph.com/issues/22824>`_, `pr#20431 <https://github.com/ceph/ceph/pull/20431>`_, "Yan, Zheng")
-* osd: do not release_reserved_pushes when requeuing (`pr#21229 <https://github.com/ceph/ceph/pull/21229>`_, Sage Weil)
-* osd: Fix assert when checking missing version (`issue#21218 <http://tracker.ceph.com/issues/21218>`_, `issue#23024 <http://tracker.ceph.com/issues/23024>`_, `pr#20495 <https://github.com/ceph/ceph/pull/20495>`_, David Zafman)
-* osd: objecter sends out of sync with pg epochs for proxied ops (`issue#22123 <http://tracker.ceph.com/issues/22123>`_, `issue#23075 <http://tracker.ceph.com/issues/23075>`_, `pr#20609 <https://github.com/ceph/ceph/pull/20609>`_, Sage Weil)
-* osd/OSDMap: skip out/crush-out osds (`pr#20840 <https://github.com/ceph/ceph/pull/20840>`_, xie xingguo)
-* osd/osd_types: fix pg_pool_t encoding for hammer (`pr#21283 <https://github.com/ceph/ceph/pull/21283>`_, Sage Weil)
-* osd: remove cost from mclock op queues; cost not handled well in dmcl… (`pr#21426 <https://github.com/ceph/ceph/pull/21426>`_, J. Eric Ivancich)
-* osd: Remove partially created pg known as DNE (`issue#23160 <http://tracker.ceph.com/issues/23160>`_, `issue#21833 <http://tracker.ceph.com/issues/21833>`_, `pr#20668 <https://github.com/ceph/ceph/pull/20668>`_, David Zafman)
-* osd: resend osd_pgtemp if it's not acked (`issue#23610 <http://tracker.ceph.com/issues/23610>`_, `issue#23630 <http://tracker.ceph.com/issues/23630>`_, `pr#21330 <https://github.com/ceph/ceph/pull/21330>`_, Kefu Chai)
-* osd: treat successful and erroroneous writes the same for log trimming (`issue#23323 <http://tracker.ceph.com/issues/23323>`_, `issue#22050 <http://tracker.ceph.com/issues/22050>`_, `pr#20851 <https://github.com/ceph/ceph/pull/20851>`_, Josh Durgin)
-* os/filestore: fix do_copy_range replay bug (`issue#23351 <http://tracker.ceph.com/issues/23351>`_, `issue#23298 <http://tracker.ceph.com/issues/23298>`_, `pr#20957 <https://github.com/ceph/ceph/pull/20957>`_, Sage Weil)
-* parent blocks are still seen after a whole-object discard (`issue#23304 <http://tracker.ceph.com/issues/23304>`_, `issue#23285 <http://tracker.ceph.com/issues/23285>`_, `pr#20860 <https://github.com/ceph/ceph/pull/20860>`_, Ilya Dryomov, Jason Dillaman)
-* PendingReleaseNotes: add note about upgrading MDS (`issue#23414 <http://tracker.ceph.com/issues/23414>`_, `pr#21001 <https://github.com/ceph/ceph/pull/21001>`_, Patrick Donnelly)
-* : qa: adjust cephfs full test for kclient (`issue#22966 <http://tracker.ceph.com/issues/22966>`_, `issue#22886 <http://tracker.ceph.com/issues/22886>`_, `pr#20417 <https://github.com/ceph/ceph/pull/20417>`_, "Yan, Zheng")
-* qa: ignore io pause warnings in mds-full test (`issue#23062 <http://tracker.ceph.com/issues/23062>`_, `issue#22990 <http://tracker.ceph.com/issues/22990>`_, `pr#20525 <https://github.com/ceph/ceph/pull/20525>`_, Patrick Donnelly)
-* qa: ignore MON_DOWN while thrashing mons (`issue#23061 <http://tracker.ceph.com/issues/23061>`_, `pr#20523 <https://github.com/ceph/ceph/pull/20523>`_, Patrick Donnelly)
-* qa/rgw: remove some civetweb overrides for beast testing (`issue#23002 <http://tracker.ceph.com/issues/23002>`_, `issue#23176 <http://tracker.ceph.com/issues/23176>`_, `pr#20736 <https://github.com/ceph/ceph/pull/20736>`_, Casey Bodley)
-* qa: src/test/libcephfs/test.cc:376: Expected: (len) > (0), actual: -34 vs 0 (`issue#22383 <http://tracker.ceph.com/issues/22383>`_, `issue#22221 <http://tracker.ceph.com/issues/22221>`_, `pr#21173 <https://github.com/ceph/ceph/pull/21173>`_, Patrick Donnelly)
-* qa: synchronize kcephfs suites with fs/multimds (`issue#22891 <http://tracker.ceph.com/issues/22891>`_, `issue#22627 <http://tracker.ceph.com/issues/22627>`_, `pr#20302 <https://github.com/ceph/ceph/pull/20302>`_, Patrick Donnelly)
-* qa/tests - added tag: v12.2.2 to be used by client.1 (`pr#21452 <https://github.com/ceph/ceph/pull/21452>`_, Yuri Weinstein)
-* qa/tests - Change machine type from 'vps' to 'ovh' as 'vps' does not … (`pr#21031 <https://github.com/ceph/ceph/pull/21031>`_, Yuri Weinstein)
-* qa/workunits/rados/test-upgrade-to-mimic.sh: fix tee output (`pr#21506 <https://github.com/ceph/ceph/pull/21506>`_, Sage Weil)
-* qa/workunits/rbd: switch devstack tempest to 17.2.0 tag (`issue#23177 <http://tracker.ceph.com/issues/23177>`_, `issue#22961 <http://tracker.ceph.com/issues/22961>`_, `pr#20715 <https://github.com/ceph/ceph/pull/20715>`_, Jason Dillaman)
-* radosgw-admin data sync run crashes (`issue#23180 <http://tracker.ceph.com/issues/23180>`_, `pr#20762 <https://github.com/ceph/ceph/pull/20762>`_, lvshanchun)
-* rbd-mirror: fix potential infinite loop when formatting status message (`issue#22964 <http://tracker.ceph.com/issues/22964>`_, `issue#22932 <http://tracker.ceph.com/issues/22932>`_, `pr#20416 <https://github.com/ceph/ceph/pull/20416>`_, Mykola Golub)
-* rbd-nbd: fix ebusy when do map (`issue#23542 <http://tracker.ceph.com/issues/23542>`_, `issue#23528 <http://tracker.ceph.com/issues/23528>`_, `pr#21230 <https://github.com/ceph/ceph/pull/21230>`_, Li Wang)
-* rgw: add radosgw-admin sync error trim to trim sync error log (`issue#23302 <http://tracker.ceph.com/issues/23302>`_, `pr#20859 <https://github.com/ceph/ceph/pull/20859>`_, fang yuxiang)
-* rgw: add xml output header in RGWCopyObj_ObjStore_S3 response msg (`issue#22416 <http://tracker.ceph.com/issues/22416>`_, `issue#22635 <http://tracker.ceph.com/issues/22635>`_, `pr#19883 <https://github.com/ceph/ceph/pull/19883>`_, Enming Zhang)
-* rgw: Admin API Support for bucket quota change (`issue#23357 <http://tracker.ceph.com/issues/23357>`_, `issue#21811 <http://tracker.ceph.com/issues/21811>`_, `pr#20885 <https://github.com/ceph/ceph/pull/20885>`_, Jeegn Chen)
-* rgw: allow beast frontend to listen on specific IP address (`issue#22858 <http://tracker.ceph.com/issues/22858>`_, `issue#22778 <http://tracker.ceph.com/issues/22778>`_, `pr#20252 <https://github.com/ceph/ceph/pull/20252>`_, Yuan Zhou)
-* rgw: can't download object with range when compression enabled (`issue#23146 <http://tracker.ceph.com/issues/23146>`_, `issue#23179 <http://tracker.ceph.com/issues/23179>`_, `issue#22852 <http://tracker.ceph.com/issues/22852>`_, `pr#20741 <https://github.com/ceph/ceph/pull/20741>`_, fang yuxiang)
-* rgw: data sync of versioned objects, note updating bi marker (`issue#23025 <http://tracker.ceph.com/issues/23025>`_, `pr#21214 <https://github.com/ceph/ceph/pull/21214>`_, Yehuda Sadeh)
-* RGW doesn't check time skew in auth v4 http header request (`issue#23252 <http://tracker.ceph.com/issues/23252>`_, `issue#22766 <http://tracker.ceph.com/issues/22766>`_, `issue#22439 <http://tracker.ceph.com/issues/22439>`_, `issue#22418 <http://tracker.ceph.com/issues/22418>`_, `pr#20072 <https://github.com/ceph/ceph/pull/20072>`_, Bingyin Zhang, Casey Bodley)
-* rgw_file: avoid evaluating nullptr for readdir offset (`issue#22889 <http://tracker.ceph.com/issues/22889>`_, `pr#20345 <https://github.com/ceph/ceph/pull/20345>`_, Matt Benjamin)
-* rgw: fix crash with rgw_run_sync_thread false (`issue#23318 <http://tracker.ceph.com/issues/23318>`_, `issue#20448 <http://tracker.ceph.com/issues/20448>`_, `pr#20932 <https://github.com/ceph/ceph/pull/20932>`_, Orit Wasserman)
-* rgw: fix memory fragmentation problem reading data from client (`issue#23347 <http://tracker.ceph.com/issues/23347>`_, `pr#20953 <https://github.com/ceph/ceph/pull/20953>`_, Marcus Watts)
-* rgw: fix mutlisite read-write issues (`issue#23690 <http://tracker.ceph.com/issues/23690>`_, `issue#22804 <http://tracker.ceph.com/issues/22804>`_, `pr#21390 <https://github.com/ceph/ceph/pull/21390>`_, Niu Pengju)
-* rgw: fix the max-uploads parameter not work (`issue#23020 <http://tracker.ceph.com/issues/23020>`_, `issue#22825 <http://tracker.ceph.com/issues/22825>`_, `pr#20476 <https://github.com/ceph/ceph/pull/20476>`_, Xin Liao)
-* rgw_log, rgw_file: account for new required envvars (`issue#23192 <http://tracker.ceph.com/issues/23192>`_, `issue#21942 <http://tracker.ceph.com/issues/21942>`_, `pr#20672 <https://github.com/ceph/ceph/pull/20672>`_, Matt Benjamin)
-* rgw: log the right http status code in civetweb frontend's access log (`issue#22812 <http://tracker.ceph.com/issues/22812>`_, `issue#22538 <http://tracker.ceph.com/issues/22538>`_, `pr#20157 <https://github.com/ceph/ceph/pull/20157>`_, Yao Zongyou)
-* rgw: parse old rgw_obj with namespace correctly (`issue#23102 <http://tracker.ceph.com/issues/23102>`_, `issue#22982 <http://tracker.ceph.com/issues/22982>`_, `pr#20586 <https://github.com/ceph/ceph/pull/20586>`_, Yehuda Sadeh)
-* rgw recalculate stats option added (`issue#23691 <http://tracker.ceph.com/issues/23691>`_, `issue#23720 <http://tracker.ceph.com/issues/23720>`_, `issue#23335 <http://tracker.ceph.com/issues/23335>`_, `issue#23322 <http://tracker.ceph.com/issues/23322>`_, `pr#21393 <https://github.com/ceph/ceph/pull/21393>`_, Abhishek Lekshmanan)
-* rgw: reject encrypted object COPY before supported (`issue#23232 <http://tracker.ceph.com/issues/23232>`_, `issue#23346 <http://tracker.ceph.com/issues/23346>`_, `pr#20937 <https://github.com/ceph/ceph/pull/20937>`_, Jeegn Chen)
-* rgw: rgw: reshard cancel command should clear bucket resharding flag (`issue#21619 <http://tracker.ceph.com/issues/21619>`_, `pr#21389 <https://github.com/ceph/ceph/pull/21389>`_, Orit Wasserman)
-* rgw: s3website error handler uses original object name (`issue#23201 <http://tracker.ceph.com/issues/23201>`_, `issue#23310 <http://tracker.ceph.com/issues/23310>`_, `pr#20889 <https://github.com/ceph/ceph/pull/20889>`_, Casey Bodley)
-* rgw: upldate the max-buckets when the quota is uploaded (`issue#23022 <http://tracker.ceph.com/issues/23022>`_, `pr#20477 <https://github.com/ceph/ceph/pull/20477>`_, zhaokun)
-* rgw: usage log fixes (`issue#23686 <http://tracker.ceph.com/issues/23686>`_, `issue#23758 <http://tracker.ceph.com/issues/23758>`_, `pr#21388 <https://github.com/ceph/ceph/pull/21388>`_, Yehuda Sadeh, Greg Farnum, Robin H. Johnson)
-* rocksdb: incorporate the fix in RocksDB for no fast CRC32 path (`issue#22534 <http://tracker.ceph.com/issues/22534>`_, `pr#20825 <https://github.com/ceph/ceph/pull/20825>`_, Radoslaw Zarzynski)
-* scrub errors not cleared on replicas can cause inconsistent pg state when replica takes over primary (`issue#23267 <http://tracker.ceph.com/issues/23267>`_, `pr#21103 <https://github.com/ceph/ceph/pull/21103>`_, David Zafman)
-* snapmapper inconsistency, crash on luminous (`issue#23500 <http://tracker.ceph.com/issues/23500>`_, `pr#21118 <https://github.com/ceph/ceph/pull/21118>`_, Sage Weil)
-* Special scrub handling of hinfo_key errors (`issue#23654 <http://tracker.ceph.com/issues/23654>`_, `issue#23428 <http://tracker.ceph.com/issues/23428>`_, `issue#23364 <http://tracker.ceph.com/issues/23364>`_, `pr#21397 <https://github.com/ceph/ceph/pull/21397>`_, David Zafman)
-* src: s/--use-wheel// (`pr#21177 <https://github.com/ceph/ceph/pull/21177>`_, Kefu Chai)
-* systemd: Wait 10 seconds before restarting ceph-mgr (`issue#23083 <http://tracker.ceph.com/issues/23083>`_, `issue#23101 <http://tracker.ceph.com/issues/23101>`_, `pr#20604 <https://github.com/ceph/ceph/pull/20604>`_, Wido den Hollander)
-* test_admin_socket.sh may fail on wait_for_clean (`issue#23507 <http://tracker.ceph.com/issues/23507>`_, `pr#21124 <https://github.com/ceph/ceph/pull/21124>`_, Mykola Golub)
-* test/ceph-disk: specify the python used for creating venv (`issue#23281 <http://tracker.ceph.com/issues/23281>`_, `pr#20817 <https://github.com/ceph/ceph/pull/20817>`_, Kefu Chai)
-* TestLibRBD.RenameViaLockOwner may still fail with -ENOENT (`issue#23152 <http://tracker.ceph.com/issues/23152>`_, `issue#23068 <http://tracker.ceph.com/issues/23068>`_, `pr#20628 <https://github.com/ceph/ceph/pull/20628>`_, Mykola Golub)
-* test/librbd: utilize unique pool for cache tier testing (`issue#23064 <http://tracker.ceph.com/issues/23064>`_, `issue#11502 <http://tracker.ceph.com/issues/11502>`_, `pr#20550 <https://github.com/ceph/ceph/pull/20550>`_, Jason Dillaman)
-* test/pybind/test_rbd: allow v1 images for testing (`pr#21471 <https://github.com/ceph/ceph/pull/21471>`_, Sage Weil)
-* test: Replace bc command with printf command (`pr#21015 <https://github.com/ceph/ceph/pull/21015>`_, David Zafman)
-* tests: drop upgrade/jewel-x/point-to-point-x in luminous and master (`issue#23159 <http://tracker.ceph.com/issues/23159>`_, `issue#22888 <http://tracker.ceph.com/issues/22888>`_, `pr#20641 <https://github.com/ceph/ceph/pull/20641>`_, Nathan Cutler)
-* tests: ENGINE Error in 'start' listener <bound  in rados (`issue#23606 <http://tracker.ceph.com/issues/23606>`_, `pr#21307 <https://github.com/ceph/ceph/pull/21307>`_, John Spray)
-* tests: rgw: swift tests target ceph-luminous branch (`pr#21048 <https://github.com/ceph/ceph/pull/21048>`_, Nathan Cutler)
-* tests: unittest_pglog timeout (`issue#23522 <http://tracker.ceph.com/issues/23522>`_, `issue#23504 <http://tracker.ceph.com/issues/23504>`_, `pr#21134 <https://github.com/ceph/ceph/pull/21134>`_, Nathan Cutler)
-* Update mgr/restful documentation (`issue#23230 <http://tracker.ceph.com/issues/23230>`_, `pr#20725 <https://github.com/ceph/ceph/pull/20725>`_, Boris Ranto)
-
-v12.2.4 Luminous
-================
-
-This is the fourth bugfix release of Luminous v12.2.x long term stable release
-series. This was primarily intended to fix a few build, ceph-volume/ceph-disk
-and RGW issues. We recommend all the users of 12.2.x series to update.
-
-Notable Changes
----------------
-
-* ceph-volume: adds support to zap encrypted devices (`issue#22878 <http://tracker.ceph.com/issues/22878>`_, `pr#20545 <https://github.com/ceph/ceph/pull/20545>`_, Andrew Schoen)
-* ceph-volume: log the current running command for easier debugging (`issue#23004 <http://tracker.ceph.com/issues/23004>`_, `pr#20597 <https://github.com/ceph/ceph/pull/20597>`_, Andrew Schoen)
-* ceph-volume: warn on mix of filestore and bluestore flags (`issue#23003 <http://tracker.ceph.com/issues/23003>`_, `pr#20568 <https://github.com/ceph/ceph/pull/20568>`_, Alfredo Deza)
-* cmake: check bootstrap.sh instead before downloading boost (`issue#23071 <http://tracker.ceph.com/issues/23071>`_, `pr#20515 <https://github.com/ceph/ceph/pull/20515>`_, Kefu Chai)
-* core: Backport of cache manipulation: issues #22603 and #22604 (`issue#22604 <http://tracker.ceph.com/issues/22604>`_, `issue#22603 <http://tracker.ceph.com/issues/22603>`_, `pr#20353 <https://github.com/ceph/ceph/pull/20353>`_, Adam C. Emerson)
-* core: last-stat-seq returns 0 because osd stats are cleared (`issue#23093 <http://tracker.ceph.com/issues/23093>`_, `pr#20548 <https://github.com/ceph/ceph/pull/20548>`_, Sage Weil, David Zafman)
-* core: Snapset inconsistency is detected with its own error (`issue#22996 <http://tracker.ceph.com/issues/22996>`_, `pr#20501 <https://github.com/ceph/ceph/pull/20501>`_, David Zafman)
-* rgw:  make init env methods return an error (`issue#23039 <http://tracker.ceph.com/issues/23039>`_, `pr#20564 <https://github.com/ceph/ceph/pull/20564>`_, Abhishek Lekshmanan)
-* rgw: parse old rgw_obj with namespace correctly (`issue#22982 <http://tracker.ceph.com/issues/22982>`_, `pr#20566 <https://github.com/ceph/ceph/pull/20566>`_, Yehuda Sadeh)
-* rgw: return valid Location element, CompleteMultipartUpload (`issue#22655 <http://tracker.ceph.com/issues/22655>`_, `pr#20266 <https://github.com/ceph/ceph/pull/20266>`_, Matt Benjamin)
-* rgw: URL-decode S3 and Swift object-copy URLs (`issue#22121 <http://tracker.ceph.com/issues/22121>`_, `issue#22729 <http://tracker.ceph.com/issues/22729>`_, `pr#20236 <https://github.com/ceph/ceph/pull/20236>`_, Malcolm Lee, Matt Benjamin)
-* rgw: use explicit index pool placement (`issue#22928 <http://tracker.ceph.com/issues/22928>`_, `pr#20565 <https://github.com/ceph/ceph/pull/20565>`_, Yehuda Sadeh)
-* tools: ceph-disk: v12.2.2 unable to create bluestore osd using ceph-disk (`issue#22354 <http://tracker.ceph.com/issues/22354>`_, `pr#20563 <https://github.com/ceph/ceph/pull/20563>`_, Kefu Chai)
-* tools: ceph-objectstore-tool: "$OBJ get-omaphdr" and "$OBJ list-omap" scan all pgs instead of using specific pg (`issue#21327 <http://tracker.ceph.com/issues/21327>`_, `pr#20283 <https://github.com/ceph/ceph/pull/20283>`_, David Zafman)
-
-
-v12.2.3 Luminous
-================
-
-This is the third bugfix release of Luminous v12.2.x long term stable release
-series. It contains a range of bug fixes and a few features across Bluestore,
-CephFS, RBD & RGW. We recommend all the users of 12.2.x series update.
-
-Notable Changes
----------------
-
-- *CephFS*:
-
-  * The CephFS client now checks for older kernels' inability to reliably clear
-    dentries from the kernel dentry cache. The new option
-    client_die_on_failed_dentry_invalidate (default: true) may be turned off to
-    allow the client to proceed (dangerous!).
-
-
-Other Notable Changes
----------------------
-* bluestore: do not crash on over-large objects (`issue#22161 <http://tracker.ceph.com/issues/22161>`_, `pr#19630 <https://github.com/ceph/ceph/pull/19630>`_, Sage Weil)
-* bluestore: OSD crash on boot with assert caused by Bluefs on flush write (`issue#21932 <http://tracker.ceph.com/issues/21932>`_, `pr#19047 <https://github.com/ceph/ceph/pull/19047>`_, Jianpeng Ma)
-* build/ops: ceph-base symbols not stripped in debs (`issue#22640 <http://tracker.ceph.com/issues/22640>`_, `pr#19969 <https://github.com/ceph/ceph/pull/19969>`_, Sage Weil)
-* build/ops: ceph-conf: dump parsed config in plain text or as json (`issue#21862 <http://tracker.ceph.com/issues/21862>`_, `pr#18842 <https://github.com/ceph/ceph/pull/18842>`_, Piotr Dałek)
-* build/ops: ceph-mgr dashboard has dependency on python-jinja2 (`issue#22457 <http://tracker.ceph.com/issues/22457>`_, `pr#19865 <https://github.com/ceph/ceph/pull/19865>`_, John Spray)
-* build/ops: ceph-volume fails when centos7 image doesn't have lvm2 installed (`issue#22443 <http://tracker.ceph.com/issues/22443>`_, `issue#22217 <http://tracker.ceph.com/issues/22217>`_, `pr#20215 <https://github.com/ceph/ceph/pull/20215>`_, Nathan Cutler, Theofilos Mouratidis)
-* build/ops: Default kernel.pid_max is easily exceeded during recovery on high OSD-count system (`issue#21929 <http://tracker.ceph.com/issues/21929>`_, `pr#19133 <https://github.com/ceph/ceph/pull/19133>`_, David Disseldorp, Kefu Chai)
-* build/ops: install-deps.sh: revert gcc to the one shipped by distro (`issue#22220 <http://tracker.ceph.com/issues/22220>`_, `pr#19680 <https://github.com/ceph/ceph/pull/19680>`_, Kefu Chai)
-* build/ops: luminous build fails with --without-radosgw (`issue#22321 <http://tracker.ceph.com/issues/22321>`_, `pr#19483 <https://github.com/ceph/ceph/pull/19483>`_, Jason Dillaman)
-* build/ops: move ceph-\*-tool binaries out of ceph-test subpackage (`issue#22319 <http://tracker.ceph.com/issues/22319>`_, `issue#21762 <http://tracker.ceph.com/issues/21762>`_, `pr#19355 <https://github.com/ceph/ceph/pull/19355>`_, liuchang0812, Nathan Cutler, Kefu Chai, Sage Weil)
-* build.ops: rpm: adjust ceph-{osdomap,kvstore,monstore}-tool feature move (`issue#22558 <http://tracker.ceph.com/issues/22558>`_, `pr#19839 <https://github.com/ceph/ceph/pull/19839>`_, Kefu Chai)
-* ceph: cluster [ERR] Unhandled exception from module 'balancer' while running on mgr.x: 'NoneType' object has no attribute 'iteritems'" in cluster log (`issue#22090 <http://tracker.ceph.com/issues/22090>`_, `pr#19023 <https://github.com/ceph/ceph/pull/19023>`_, Sage Weil)
-* cephfs: cephfs-journal-tool: add "set pool_id" option (`issue#22631 <http://tracker.ceph.com/issues/22631>`_, `pr#20085 <https://github.com/ceph/ceph/pull/20085>`_, dongdong tao)
-* cephfs: cephfs-journal-tool: tool would miss to report some invalid range (`issue#22459 <http://tracker.ceph.com/issues/22459>`_, `pr#19626 <https://github.com/ceph/ceph/pull/19626>`_, dongdong tao)
-* cephfs: cephfs: potential adjust failure in lru_expire (`issue#22458 <http://tracker.ceph.com/issues/22458>`_, `pr#19627 <https://github.com/ceph/ceph/pull/19627>`_, dongdong tao)
-* cephfs: "ceph tell mds" commands result in "File exists" errors on client admin socket (`issue#21406 <http://tracker.ceph.com/issues/21406>`_, `issue#21967 <http://tracker.ceph.com/issues/21967>`_, `pr#18831 <https://github.com/ceph/ceph/pull/18831>`_, Patrick Donnelly)
-* cephfs: client: anchor Inode while trimming caps (`issue#22157 <http://tracker.ceph.com/issues/22157>`_, `pr#19105 <https://github.com/ceph/ceph/pull/19105>`_, Patrick Donnelly)
-* cephfs: client: avoid recursive lock in ll_get_vino (`issue#22629 <http://tracker.ceph.com/issues/22629>`_, `pr#20086 <https://github.com/ceph/ceph/pull/20086>`_, dongdong tao)
-* cephfs: client: dual client segfault with racing ceph_shutdown (`issue#21512 <http://tracker.ceph.com/issues/21512>`_, `issue#20988 <http://tracker.ceph.com/issues/20988>`_, `pr#20082 <https://github.com/ceph/ceph/pull/20082>`_, Jeff Layton)
-* cephfs: client: implement delegation support in userland cephfs (`issue#18490 <http://tracker.ceph.com/issues/18490>`_, `pr#19480 <https://github.com/ceph/ceph/pull/19480>`_, Jeff Layton)
-* cephfs: client: quit on failed remount during dentry invalidate test #19218 (`issue#22269 <http://tracker.ceph.com/issues/22269>`_, `pr#19370 <https://github.com/ceph/ceph/pull/19370>`_, Patrick Donnelly)
-* cephfs: List of filesystems does not get refreshed after a filesystem deletion (`issue#21599 <http://tracker.ceph.com/issues/21599>`_, `pr#18730 <https://github.com/ceph/ceph/pull/18730>`_, John Spray)
-* cephfs: MDS : Avoid the assert failure when the inode for the cap_export from other… (`issue#22610 <http://tracker.ceph.com/issues/22610>`_, `pr#20300 <https://github.com/ceph/ceph/pull/20300>`_, Jianyu Li)
-* cephfs: MDSMonitor: monitor gives constant "is now active in filesystem cephfs as rank" cluster log info messages (`issue#21959 <http://tracker.ceph.com/issues/21959>`_, `pr#19055 <https://github.com/ceph/ceph/pull/19055>`_, Patrick Donnelly)
-* cephfs: racy is_mounted() checks in libcephfs (`issue#21025 <http://tracker.ceph.com/issues/21025>`_, `pr#17875 <https://github.com/ceph/ceph/pull/17875>`_, Jeff Layton)
-* cephfs: src/mds/MDCache.cc: 7421: FAILED assert(CInode::count() == inode_map.size() + snap_inode_map.size()) (`issue#21928 <http://tracker.ceph.com/issues/21928>`_, `pr#18912 <https://github.com/ceph/ceph/pull/18912>`_, "Yan, Zheng")
-* cephfs: vstart_runner: fixes for recent cephfs changes (`issue#22526 <http://tracker.ceph.com/issues/22526>`_, `pr#19829 <https://github.com/ceph/ceph/pull/19829>`_, Patrick Donnelly)
-* ceph-volume: adds a --destroy flag to ceph-volume lvm zap (`issue#22653 <http://tracker.ceph.com/issues/22653>`_, `pr#20240 <https://github.com/ceph/ceph/pull/20240>`_, Andrew Schoen)
-* ceph-volume: adds success messages for lvm prepare/activate/create (`issue#22307 <http://tracker.ceph.com/issues/22307>`_, `pr#20238 <https://github.com/ceph/ceph/pull/20238>`_, Andrew Schoen)
-* ceph-volume: dmcrypt support for lvm (`issue#22619 <http://tracker.ceph.com/issues/22619>`_, `pr#20241 <https://github.com/ceph/ceph/pull/20241>`_, Alfredo Deza)
-* ceph-volume dmcrypt support for simple (`issue#22620 <http://tracker.ceph.com/issues/22620>`_, `pr#20350 <https://github.com/ceph/ceph/pull/20350>`_, Andrew Schoen, Alfredo Deza)
-* ceph-volume: do not use --key during mkfs (`issue#22283 <http://tracker.ceph.com/issues/22283>`_, `pr#20244 <https://github.com/ceph/ceph/pull/20244>`_, Kefu Chai, Sage Weil)
-* ceph-volume: fix usage of the --osd-id flag (`issue#22642 <http://tracker.ceph.com/issues/22642>`_, `issue#22836 <http://tracker.ceph.com/issues/22836>`_, `pr#20323 <https://github.com/ceph/ceph/pull/20323>`_, Andrew Schoen)
-* ceph-volume Format correctly when vg/lv cannot be used (`issue#22299 <http://tracker.ceph.com/issues/22299>`_, `pr#19527 <https://github.com/ceph/ceph/pull/19527>`_, Alfredo Deza)
-* ceph-volume handle inline comments in the ceph.conf file (`issue#22297 <http://tracker.ceph.com/issues/22297>`_, `pr#19532 <https://github.com/ceph/ceph/pull/19532>`_, Alfredo Deza)
-* ceph-volume: handle leading whitespace/tabs in ceph.conf (`issue#22280 <http://tracker.ceph.com/issues/22280>`_, `pr#19526 <https://github.com/ceph/ceph/pull/19526>`_, Alfredo Deza)
-* ceph-volume: lvm zap will unmount osd paths used by zapped devices (`issue#22876 <http://tracker.ceph.com/issues/22876>`_, `pr#20438 <https://github.com/ceph/ceph/pull/20438>`_, Andrew Schoen)
-* ceph-volume: removed the explicit use of sudo (`issue#22282 <http://tracker.ceph.com/issues/22282>`_, `pr#19525 <https://github.com/ceph/ceph/pull/19525>`_, Andrew Schoen)
-* ceph-volume rollback on failed OSD prepare/create (`issue#22281 <http://tracker.ceph.com/issues/22281>`_, `pr#20237 <https://github.com/ceph/ceph/pull/20237>`_, Alfredo Deza)
-* ceph-volume should be able to handle multiple LVM (VG/LV) tags (`issue#22305 <http://tracker.ceph.com/issues/22305>`_, `pr#19528 <https://github.com/ceph/ceph/pull/19528>`_, Alfredo Deza)
-* ceph-volume use realpath when checking mounts (`issue#22988 <http://tracker.ceph.com/issues/22988>`_, `pr#20429 <https://github.com/ceph/ceph/pull/20429>`_, Alfredo Deza)
-* ceph-volume: warn on missing ceph.conf file (`issue#22326 <http://tracker.ceph.com/issues/22326>`_, `pr#19530 <https://github.com/ceph/ceph/pull/19530>`_, Alfredo Deza)
-* common: compute SimpleLRU's size with contents.size() instead of lru.… (`issue#22613 <http://tracker.ceph.com/issues/22613>`_, `pr#19977 <https://github.com/ceph/ceph/pull/19977>`_, Xuehan Xu)
-* config: lower default omap entries recovered at once (`issue#21897 <http://tracker.ceph.com/issues/21897>`_, `pr#19928 <https://github.com/ceph/ceph/pull/19928>`_, Josh Durgin)
-* core: backoff causes out of order op (`issue#21407 <http://tracker.ceph.com/issues/21407>`_, `pr#18747 <https://github.com/ceph/ceph/pull/18747>`_, Sage Weil)
-* core: common/throttle: start using 64-bit values (`issue#22539 <http://tracker.ceph.com/issues/22539>`_, `pr#19995 <https://github.com/ceph/ceph/pull/19995>`_, Igor Fedotov)
-* core: fix broken use of streamstream::rdbuf() (`issue#22715 <http://tracker.ceph.com/issues/22715>`_, `pr#20042 <https://github.com/ceph/ceph/pull/20042>`_, Sage Weil)
-* core: possible deadlock in various maintenance operations (`issue#22120 <http://tracker.ceph.com/issues/22120>`_, `pr#19123 <https://github.com/ceph/ceph/pull/19123>`_, Jason Dillaman)
-* core: _read_bdev_label unable to decode label at offset (`issue#22285 <http://tracker.ceph.com/issues/22285>`_, `pr#20326 <https://github.com/ceph/ceph/pull/20326>`_, Sage Weil)
-* core: rocksdb: fixes early metadata spill over to slow device in (`issue#22264 <http://tracker.ceph.com/issues/22264>`_, `pr#19257 <https://github.com/ceph/ceph/pull/19257>`_, Igor Fedotov)
-* core: Various odd clog messages for mons (`issue#22082 <http://tracker.ceph.com/issues/22082>`_, `pr#19031 <https://github.com/ceph/ceph/pull/19031>`_, John Spray)
-* crush: balancer crush-compat sends "foo" command (`issue#22361 <http://tracker.ceph.com/issues/22361>`_, `pr#19555 <https://github.com/ceph/ceph/pull/19555>`_, John Spray)
-* doc: crush_ruleset is invalid command in luminous (`issue#20559 <http://tracker.ceph.com/issues/20559>`_, `pr#19446 <https://github.com/ceph/ceph/pull/19446>`_, Nathan Cutler)
-* doc: doc/rbd: tweaks for the LIO iSCSI gateway (`issue#21763 <http://tracker.ceph.com/issues/21763>`_, `pr#20213 <https://github.com/ceph/ceph/pull/20213>`_, Ashish Singh, Mike Christie, Jason Dillaman)
-* doc: man page for mount.fuse.ceph (`issue#21539 <http://tracker.ceph.com/issues/21539>`_, `issue#22595 <http://tracker.ceph.com/issues/22595>`_, `pr#19449 <https://github.com/ceph/ceph/pull/19449>`_, Jos Collin)
-* doc: misc fixes for CephFS best practices (`issue#22630 <http://tracker.ceph.com/issues/22630>`_, `pr#19858 <https://github.com/ceph/ceph/pull/19858>`_, Jos Collin)
-* doc: remove region from "INSTALL CEPH OBJECT GATEWAY" (`issue#21610 <http://tracker.ceph.com/issues/21610>`_, `pr#18865 <https://github.com/ceph/ceph/pull/18865>`_, Orit Wasserman)
-* doc: update Blacklisting and OSD epoch barrier (`issue#22542 <http://tracker.ceph.com/issues/22542>`_, `pr#19741 <https://github.com/ceph/ceph/pull/19741>`_, Jos Collin)
-* librbd: cannot clone all image-metas if we have more than 64 key/value pairs (`issue#21814 <http://tracker.ceph.com/issues/21814>`_, `pr#19503 <https://github.com/ceph/ceph/pull/19503>`_, PCzhangPC)
-* librbd: cannot copy all image-metas if we have more than 64 key/value pairs (`issue#21815 <http://tracker.ceph.com/issues/21815>`_, `pr#19504 <https://github.com/ceph/ceph/pull/19504>`_, PCzhangPC)
-* librbd: compare and write against a clone can result in failure (`issue#20789 <http://tracker.ceph.com/issues/20789>`_, `pr#20211 <https://github.com/ceph/ceph/pull/20211>`_, Mykola Golub, Jason Dillaman)
-* librbd: default to sparse-reads for any IO operation over 64K (`issue#21849 <http://tracker.ceph.com/issues/21849>`_, `pr#20208 <https://github.com/ceph/ceph/pull/20208>`_, Jason Dillaman)
-* librbd: fix snap create/rm may taking long time (`issue#22716 <http://tracker.ceph.com/issues/22716>`_, `pr#20153 <https://github.com/ceph/ceph/pull/20153>`_, Song Shun)
-* librbd: force removal of a snapshot cannot ignore dependent children (`issue#22791 <http://tracker.ceph.com/issues/22791>`_, `pr#20135 <https://github.com/ceph/ceph/pull/20135>`_, Jason Dillaman)
-* librbd: Image-meta should be dynamically refreshed (`issue#21529 <http://tracker.ceph.com/issues/21529>`_, `pr#19447 <https://github.com/ceph/ceph/pull/19447>`_, Dongsheng Yang, Jason Dillaman)
-* librbd: journal should ignore -EILSEQ errors from compare-and-write (`issue#21628 <http://tracker.ceph.com/issues/21628>`_, `pr#20206 <https://github.com/ceph/ceph/pull/20206>`_, Jason Dillaman)
-* librbd: refresh image after applying new/removing old metadata (`issue#21711 <http://tracker.ceph.com/issues/21711>`_, `pr#19485 <https://github.com/ceph/ceph/pull/19485>`_, Jason Dillaman)
-* librbd: set deleted parent pointer to null (`issue#22158 <http://tracker.ceph.com/issues/22158>`_, `pr#20210 <https://github.com/ceph/ceph/pull/20210>`_, Jason Dillaman)
-* luminous: ceph-fuse: ::rmdir() uses a deleted memory structure of dentry leads … (`issue#22536 <http://tracker.ceph.com/issues/22536>`_, `pr#19968 <https://github.com/ceph/ceph/pull/19968>`_, YunfeiGuan)
-* mds: check for CEPH_OSDMAP_FULL is now wrong; cluster full flag is obsolete (`issue#22483 <http://tracker.ceph.com/issues/22483>`_, `pr#19830 <https://github.com/ceph/ceph/pull/19830>`_, Patrick Donnelly)
-* mds: don't check gid when none specified in auth caps (`issue#22009 <http://tracker.ceph.com/issues/22009>`_, `pr#18835 <https://github.com/ceph/ceph/pull/18835>`_, Douglas Fuller)
-* mds: don't delay processing completed requests in replay queue (`issue#22163 <http://tracker.ceph.com/issues/22163>`_, `pr#19157 <https://github.com/ceph/ceph/pull/19157>`_, "Yan, Zheng")
-* mds: don't report repaired backtraces in damagetable, write back after repair, clean up scrub log (`issue#18743 <http://tracker.ceph.com/issues/18743>`_, `issue#22058 <http://tracker.ceph.com/issues/22058>`_, `pr#20341 <https://github.com/ceph/ceph/pull/20341>`_, "Yan, Zheng", John Spray)
-* mds: fix CDir::log_mark_dirty() (`issue#21584 <http://tracker.ceph.com/issues/21584>`_, `pr#18008 <https://github.com/ceph/ceph/pull/18008>`_, "Yan, Zheng")
-* mds: fix dump last_sent (`issue#22562 <http://tracker.ceph.com/issues/22562>`_, `pr#19959 <https://github.com/ceph/ceph/pull/19959>`_, dongdong tao)
-* mds: fix MDS_FEATURE_INCOMPAT_FILE_LAYOUT_V2 definition (`issue#21985 <http://tracker.ceph.com/issues/21985>`_, `pr#18782 <https://github.com/ceph/ceph/pull/18782>`_, "Yan, Zheng")
-* mds: fix return value of MDCache::dump_cache (`issue#22798 <http://tracker.ceph.com/issues/22798>`_, `pr#20121 <https://github.com/ceph/ceph/pull/20121>`_, "Yan, Zheng")
-* mds: fix scrub crash (`issue#22730 <http://tracker.ceph.com/issues/22730>`_, `pr#20249 <https://github.com/ceph/ceph/pull/20249>`_, dongdong tao)
-* mds: fix StrayManager::truncate() (`issue#21091 <http://tracker.ceph.com/issues/21091>`_, `pr#18019 <https://github.com/ceph/ceph/pull/18019>`_, "Yan, Zheng")
-* mds: handle client reconnect gather race (`issue#22263 <http://tracker.ceph.com/issues/22263>`_, `pr#19326 <https://github.com/ceph/ceph/pull/19326>`_, "Yan, Zheng")
-* mds: handle client session messages when mds is stopping (`issue#22460 <http://tracker.ceph.com/issues/22460>`_, `pr#19585 <https://github.com/ceph/ceph/pull/19585>`_, "Yan, Zheng")
-* mds: handle 'inode gets queued for recovery multiple times' (`issue#22647 <http://tracker.ceph.com/issues/22647>`_, `pr#19982 <https://github.com/ceph/ceph/pull/19982>`_, "Yan, Zheng")
-* mds: ignore export pin for unlinked directory (`issue#22219 <http://tracker.ceph.com/issues/22219>`_, `pr#19360 <https://github.com/ceph/ceph/pull/19360>`_, "Yan, Zheng")
-* mds: limit size of subtree migration (`issue#21892 <http://tracker.ceph.com/issues/21892>`_, `pr#20339 <https://github.com/ceph/ceph/pull/20339>`_, "Yan, Zheng")
-* mds: no assertion on inode being purging in find_ino_peers() (`issue#21722 <http://tracker.ceph.com/issues/21722>`_, `pr#18869 <https://github.com/ceph/ceph/pull/18869>`_, Zhi Zhang)
-* mds: preserve order of requests during recovery of multimds cluster (`issue#21843 <http://tracker.ceph.com/issues/21843>`_, `pr#18871 <https://github.com/ceph/ceph/pull/18871>`_, "Yan, Zheng")
-* mds: prevent filelock from being stuck at XSYN state (`issue#22008 <http://tracker.ceph.com/issues/22008>`_, `pr#20340 <https://github.com/ceph/ceph/pull/20340>`_, "Yan, Zheng")
-* mds: properly eval locks after importing inode (`issue#22357 <http://tracker.ceph.com/issues/22357>`_, `pr#19646 <https://github.com/ceph/ceph/pull/19646>`_, "Yan, Zheng")
-* mds: reduce debugging level for balancer messages (`issue#21853 <http://tracker.ceph.com/issues/21853>`_, `pr#19827 <https://github.com/ceph/ceph/pull/19827>`_, Patrick Donnelly)
-* mds: respect mds_client_writeable_range_max_inc_objs config (`issue#22492 <http://tracker.ceph.com/issues/22492>`_, `pr#19776 <https://github.com/ceph/ceph/pull/19776>`_, "Yan, Zheng")
-* mds: set higher priority for some perf counters (`issue#22776 <http://tracker.ceph.com/issues/22776>`_, `pr#20299 <https://github.com/ceph/ceph/pull/20299>`_, Shangzhong Zhu)
-* mds: set PRIO_USEFUL on num_sessions counter (`issue#21927 <http://tracker.ceph.com/issues/21927>`_, `pr#18722 <https://github.com/ceph/ceph/pull/18722>`_, John Spray)
-* mds: tell session ls returns vanila EINVAL when MDS is not active (`issue#21991 <http://tracker.ceph.com/issues/21991>`_, `pr#19505 <https://github.com/ceph/ceph/pull/19505>`_, Jos Collin)
-* mds: track dirty dentries in separate list (`issue#19578 <http://tracker.ceph.com/issues/19578>`_, `pr#19775 <https://github.com/ceph/ceph/pull/19775>`_, "Yan, Zheng")
-* mds: trim 'N' log segments according to how many log segments are there (`issue#21975 <http://tracker.ceph.com/issues/21975>`_, `pr#18783 <https://github.com/ceph/ceph/pull/18783>`_, "Yan, Zheng")
-* mgr: ceph-mgr spuriously reloading OSD metadata on map changes (`issue#21159 <http://tracker.ceph.com/issues/21159>`_, `pr#18732 <https://github.com/ceph/ceph/pull/18732>`_, Yanhu Cao)
-* mgr: disconnect unregistered service daemon when report received (`issue#22286 <http://tracker.ceph.com/issues/22286>`_, `pr#20089 <https://github.com/ceph/ceph/pull/20089>`_, Jason Dillaman)
-* mgr: KeyError: ('name',) in balancer rm (`issue#22470 <http://tracker.ceph.com/issues/22470>`_, `pr#19624 <https://github.com/ceph/ceph/pull/19624>`_, Dan van der Ster)
-* mgr: Manager daemon x is unresponsive. No standby daemons available (`issue#21147 <http://tracker.ceph.com/issues/21147>`_, `pr#19501 <https://github.com/ceph/ceph/pull/19501>`_, Sage Weil)
-* mgr: mgr/balancer/upmap_max_iterations must be cast to integer (`issue#22429 <http://tracker.ceph.com/issues/22429>`_, `pr#19553 <https://github.com/ceph/ceph/pull/19553>`_, Dan van der Ster)
-* mgr: mgr/dashboard: added iSCSI IOPS/throughput metrics (`issue#21391 <http://tracker.ceph.com/issues/21391>`_, `pr#20209 <https://github.com/ceph/ceph/pull/20209>`_, Jason Dillaman)
-* mgr: mgr/dashboard: Fix PG status coloring (`issue#22615 <http://tracker.ceph.com/issues/22615>`_, `pr#19844 <https://github.com/ceph/ceph/pull/19844>`_, Wido den Hollander)
-* mgr: mgr/prometheus: add missing 'deep' state to PG_STATES in ceph-mgr pro… (`issue#22116 <http://tracker.ceph.com/issues/22116>`_, `pr#19929 <https://github.com/ceph/ceph/pull/19929>`_, Jan Fajerski, Peter Woodman)
-* mgr: mgr tests don't indicate failure if exception thrown from serve() (`issue#21999 <http://tracker.ceph.com/issues/21999>`_, `pr#18832 <https://github.com/ceph/ceph/pull/18832>`_, John Spray)
-* mgr: mgr[zabbix] float division by zero (osd['kb'] = 0) (`issue#21904 <http://tracker.ceph.com/issues/21904>`_, `pr#19048 <https://github.com/ceph/ceph/pull/19048>`_, Ilja Slepnev)
-* mgr: prometheus: added osd commit/apply latency metrics (#22718) (`issue#22718 <http://tracker.ceph.com/issues/22718>`_, `pr#20084 <https://github.com/ceph/ceph/pull/20084>`_, Konstantin Shalygin)
-* mgr: pybind/mgr/dashboard: fix duplicated slash in html href (`issue#22851 <http://tracker.ceph.com/issues/22851>`_, `pr#20325 <https://github.com/ceph/ceph/pull/20325>`_, Shengjing Zhu)
-* mgr: pybind/mgr/dashboard: fix reverse proxy support (`issue#22557 <http://tracker.ceph.com/issues/22557>`_, `pr#20182 <https://github.com/ceph/ceph/pull/20182>`_, Nick Erdmann, Kefu Chai)
-* mgr: pybind/mgr/prometheus: fix metric type undef -> untyped (`issue#22313 <http://tracker.ceph.com/issues/22313>`_, `pr#19834 <https://github.com/ceph/ceph/pull/19834>`_, Ilya Margolin)
-* mgr: restarting active ceph-mgr cause glitches in bps and iops metrics (`issue#21773 <http://tracker.ceph.com/issues/21773>`_, `pr#18735 <https://github.com/ceph/ceph/pull/18735>`_, Aleksei Gutikov, Kefu Chai)
-* mgr: Services reported with blank hostname (`issue#20887 <http://tracker.ceph.com/issues/20887>`_, `issue#21687 <http://tracker.ceph.com/issues/21687>`_, `pr#17869 <https://github.com/ceph/ceph/pull/17869>`_, liuchang0812, Chang Liu)
-* mon: do not use per_pool_sum_delta to show recovery summary (`issue#22727 <http://tracker.ceph.com/issues/22727>`_, `pr#20150 <https://github.com/ceph/ceph/pull/20150>`_, Chang Liu)
-* mon: fix mgr using auth_client_required policy (`issue#22096 <http://tracker.ceph.com/issues/22096>`_, `pr#20156 <https://github.com/ceph/ceph/pull/20156>`_, John Spray)
-* mon: MDSMonitor: reject misconfigured mds_blacklist_interval (`issue#21821 <http://tracker.ceph.com/issues/21821>`_, `pr#19871 <https://github.com/ceph/ceph/pull/19871>`_, John Spray)
-* mon/MgrMonitor: limit mgrmap history (`issue#22257 <http://tracker.ceph.com/issues/22257>`_, `pr#19187 <https://github.com/ceph/ceph/pull/19187>`_, Sage Weil)
-* mon: reenable timer to send digest when paxos is temporarily inactive (`issue#22142 <http://tracker.ceph.com/issues/22142>`_, `pr#19481 <https://github.com/ceph/ceph/pull/19481>`_, Jan Fajerski)
-* msg: msg/async/AsyncConnection.cc: 1835: FAILED assert(state == STATE_CLOSED) (`issue#21883 <http://tracker.ceph.com/issues/21883>`_, `pr#18746 <https://github.com/ceph/ceph/pull/18746>`_, Haomai Wang)
-* msg: msg/async: unregister connection failed when racing happened (`issue#22437 <http://tracker.ceph.com/issues/22437>`_, `pr#19552 <https://github.com/ceph/ceph/pull/19552>`_, Haomai Wang)
-* osdc: "FAILED assert(bh->last_write_tid > tid)" in powercycle-wip-yuri-master-1.19.18-distro-basic-smithi (`issue#22741 <http://tracker.ceph.com/issues/22741>`_, `pr#20256 <https://github.com/ceph/ceph/pull/20256>`_, "Yan, Zheng")
-* osdc/Journaler: add 'stopping' check to various finish callbacks (`issue#22360 <http://tracker.ceph.com/issues/22360>`_, `pr#19610 <https://github.com/ceph/ceph/pull/19610>`_, "Yan, Zheng")
-* osdc/Objecter: objecter op_send_bytes perf counter always 0 (`issue#21982 <http://tracker.ceph.com/issues/21982>`_, `pr#19046 <https://github.com/ceph/ceph/pull/19046>`_, Jianpeng Ma)
-* osd: do not check out-of-date osdmap for DESTROYED flag on start (`issue#22673 <http://tracker.ceph.com/issues/22673>`_, `pr#20068 <https://github.com/ceph/ceph/pull/20068>`_, Sage Weil)
-* osd,mgr: report pending creating pgs to mgr (`issue#22440 <http://tracker.ceph.com/issues/22440>`_, `pr#20204 <https://github.com/ceph/ceph/pull/20204>`_, Kefu Chai)
-* osd: miscounting degraded objects and PG stuck in recovery_unfound (`issue#22145 <http://tracker.ceph.com/issues/22145>`_, `pr#20055 <https://github.com/ceph/ceph/pull/20055>`_, Sage Weil, David Zafman)
-* osd: Objecter::C_ObjectOperation_sparse_read throws/catches exceptions on -ENOENT (`issue#21844 <http://tracker.ceph.com/issues/21844>`_, `pr#18744 <https://github.com/ceph/ceph/pull/18744>`_, Jason Dillaman)
-* osd: Objecter::_send_op unnecessarily constructs costly hobject_t (`issue#21845 <http://tracker.ceph.com/issues/21845>`_, `pr#18745 <https://github.com/ceph/ceph/pull/18745>`_, Jason Dillaman)
-* osd: On pg repair the primary is not favored as was intended (`issue#21907 <http://tracker.ceph.com/issues/21907>`_, `pr#19083 <https://github.com/ceph/ceph/pull/19083>`_, David Zafman)
-* osd: OSD crushes with FAILED assert(used_blocks.size() > count) during the first start after upgrade 12.2.1 -> 12.2.2 (`issue#22535 <http://tracker.ceph.com/issues/22535>`_, `pr#19888 <https://github.com/ceph/ceph/pull/19888>`_, Igor Fedotov)
-* osd: OSDMap cache assert on shutdown (`issue#21737 <http://tracker.ceph.com/issues/21737>`_, `pr#18749 <https://github.com/ceph/ceph/pull/18749>`_, Greg Farnum)
-* osd: OSDService::recovery_need_sleep read+updated without locking (`issue#21566 <http://tracker.ceph.com/issues/21566>`_, `pr#18753 <https://github.com/ceph/ceph/pull/18753>`_, Neha Ojha)
-* osd: "osd status" command exception if OSD not in pgmap stats (`issue#21707 <http://tracker.ceph.com/issues/21707>`_, `pr#19084 <https://github.com/ceph/ceph/pull/19084>`_, Yanhu Cao)
-* osd, pg, mgr: make snap trim queue problems visible (`issue#22448 <http://tracker.ceph.com/issues/22448>`_, `pr#20098 <https://github.com/ceph/ceph/pull/20098>`_, Piotr Dałek)
-* osd: Pool Compression type option doesn't apply to new OSDs (`issue#22419 <http://tracker.ceph.com/issues/22419>`_, `pr#20106 <https://github.com/ceph/ceph/pull/20106>`_, Kefu Chai)
-* osd: replica read can trigger cache promotion (`issue#20919 <http://tracker.ceph.com/issues/20919>`_, `pr#19499 <https://github.com/ceph/ceph/pull/19499>`_, Sage Weil)
-* osd/ReplicatedPG.cc: recover_replicas: object added to missing set for backfill, but is not in recovering, error! (`issue#21382 <http://tracker.ceph.com/issues/21382>`_, `issue#14513 <http://tracker.ceph.com/issues/14513>`_, `issue#18162 <http://tracker.ceph.com/issues/18162>`_, `pr#20081 <https://github.com/ceph/ceph/pull/20081>`_, David Zafman)
-* osd: subscribe osdmaps if any pending pgs (`issue#22113 <http://tracker.ceph.com/issues/22113>`_, `pr#19059 <https://github.com/ceph/ceph/pull/19059>`_, Kefu Chai)
-* osd: "sudo cp /var/lib/ceph/osd/ceph-0/fsid ..." fails (`issue#20736 <http://tracker.ceph.com/issues/20736>`_, `pr#19631 <https://github.com/ceph/ceph/pull/19631>`_, Patrick Donnelly)
-* os: fix 0-length zero semantics, test (`issue#21712 <http://tracker.ceph.com/issues/21712>`_, `pr#20049 <https://github.com/ceph/ceph/pull/20049>`_, Sage Weil)
-* qa/tests: Applied PR 20053 to stress-split tests (`issue#22665 <http://tracker.ceph.com/issues/22665>`_, `pr#20451 <https://github.com/ceph/ceph/pull/20451>`_, Yuri Weinstein)
-* rbd: abort in listing mapped nbd devices when running in a container (`issue#22012 <http://tracker.ceph.com/issues/22012>`_, `issue#22011 <http://tracker.ceph.com/issues/22011>`_, `pr#19051 <https://github.com/ceph/ceph/pull/19051>`_, Li Wang)
-* rbd: [api] compare-and-write methods not properly advertised (`issue#22036 <http://tracker.ceph.com/issues/22036>`_, `pr#18834 <https://github.com/ceph/ceph/pull/18834>`_, Jason Dillaman)
-* rbd: class rbd.Image discard----OSError: [errno 2147483648] error discarding region (`issue#21966 <http://tracker.ceph.com/issues/21966>`_, `pr#19058 <https://github.com/ceph/ceph/pull/19058>`_, Jason Dillaman)
-* rbd: cluster resource agent ocf:ceph:rbd - wrong permissions (`issue#22362 <http://tracker.ceph.com/issues/22362>`_, `pr#19554 <https://github.com/ceph/ceph/pull/19554>`_, Nathan Cutler)
-* rbd: disk usage on empty pool no longer returns an error message (`issue#22200 <http://tracker.ceph.com/issues/22200>`_, `pr#19107 <https://github.com/ceph/ceph/pull/19107>`_, Jason Dillaman)
-* rbd: fix crash during map (`issue#21808 <http://tracker.ceph.com/issues/21808>`_, `pr#18698 <https://github.com/ceph/ceph/pull/18698>`_, Peter Keresztes Schmidt)
-* rbd: [journal] tags are not being expired if no other clients are registered (`issue#21960 <http://tracker.ceph.com/issues/21960>`_, `pr#18840 <https://github.com/ceph/ceph/pull/18840>`_, Jason Dillaman)
-* rbd: librbd: filter out potential race with image rename (`issue#18435 <http://tracker.ceph.com/issues/18435>`_, `pr#19853 <https://github.com/ceph/ceph/pull/19853>`_, Jason Dillaman)
-* rbd-mirror: Allow a different data-pool to be used on the secondary cluster (`issue#21088 <http://tracker.ceph.com/issues/21088>`_, `pr#19305 <https://github.com/ceph/ceph/pull/19305>`_, Adam Wolfe Gordon)
-* rbd-mirror: primary image should register in remote, non-primary image's journal (`issue#21961 <http://tracker.ceph.com/issues/21961>`_, `issue#21561 <http://tracker.ceph.com/issues/21561>`_, `pr#20207 <https://github.com/ceph/ceph/pull/20207>`_, Jason Dillaman)
-* rbd-mirror: sync image metadata when transfering remote image (`issue#21535 <http://tracker.ceph.com/issues/21535>`_, `pr#19484 <https://github.com/ceph/ceph/pull/19484>`_, Jason Dillaman)
-* rbd: Python RBD metadata_get does not work (`issue#22306 <http://tracker.ceph.com/issues/22306>`_, `pr#19479 <https://github.com/ceph/ceph/pull/19479>`_, Mykola Golub)
-* rbd: rbd ls -l crashes with SIGABRT (`issue#21558 <http://tracker.ceph.com/issues/21558>`_, `pr#19800 <https://github.com/ceph/ceph/pull/19800>`_, Jason Dillaman)
-* rbd: [rbd-mirror] new pools might not be detected (`issue#22461 <http://tracker.ceph.com/issues/22461>`_, `pr#19625 <https://github.com/ceph/ceph/pull/19625>`_, Jason Dillaman)
-* rbd: [rbd-nbd] Fedora does not register resize events (`issue#22131 <http://tracker.ceph.com/issues/22131>`_, `pr#19066 <https://github.com/ceph/ceph/pull/19066>`_, Jason Dillaman)
-* rbd: [test] UpdateFeatures RPC message should be included in test_notify.py (`issue#21936 <http://tracker.ceph.com/issues/21936>`_, `pr#18838 <https://github.com/ceph/ceph/pull/18838>`_, Jason Dillaman)
-* Revert " luminous: msg/async: unregister connection failed when racing happened" (`issue#22231 <http://tracker.ceph.com/issues/22231>`_, `pr#20247 <https://github.com/ceph/ceph/pull/20247>`_, Sage Weil)
-* rgw: 501 is returned When init multipart is using V4 signature and chunk encoding (`issue#22129 <http://tracker.ceph.com/issues/22129>`_, `pr#19506 <https://github.com/ceph/ceph/pull/19506>`_, Jeegn Chen)
-* rgw: add cors header rule check in cors option request (`issue#22002 <http://tracker.ceph.com/issues/22002>`_, `pr#19053 <https://github.com/ceph/ceph/pull/19053>`_, yuliyang)
-* rgw: backport beast frontend and boost 1.66 update (`issue#22101 <http://tracker.ceph.com/issues/22101>`_, `issue#20935 <http://tracker.ceph.com/issues/20935>`_, `issue#21831 <http://tracker.ceph.com/issues/21831>`_, `issue#20048 <http://tracker.ceph.com/issues/20048>`_, `issue#22600 <http://tracker.ceph.com/issues/22600>`_, `issue#20971 <http://tracker.ceph.com/issues/20971>`_, `pr#19848 <https://github.com/ceph/ceph/pull/19848>`_, Casey Bodley, Jiaying Ren)
-* rgw: bucket index object not deleted after radosgw-admin bucket rm --purge-objects --bypass-gc (`issue#22122 <http://tracker.ceph.com/issues/22122>`_, `issue#19959 <http://tracker.ceph.com/issues/19959>`_, `pr#19085 <https://github.com/ceph/ceph/pull/19085>`_, Aleksei Gutikov)
-* rgw: bucket policy evaluation logical error (`issue#21901 <http://tracker.ceph.com/issues/21901>`_, `issue#21896 <http://tracker.ceph.com/issues/21896>`_, `pr#19810 <https://github.com/ceph/ceph/pull/19810>`_, Adam C. Emerson)
-* rgw: bucket resharding should not update bucket ACL or user stats (`issue#22742 <http://tracker.ceph.com/issues/22742>`_, `issue#22124 <http://tracker.ceph.com/issues/22124>`_, `pr#20327 <https://github.com/ceph/ceph/pull/20327>`_, Orit Wasserman)
-* rgw: check going_down() when lifecycle processing (`issue#22099 <http://tracker.ceph.com/issues/22099>`_, `pr#19088 <https://github.com/ceph/ceph/pull/19088>`_, Yao Zongyou)
-* rgw: Dynamic bucket indexing, resharding and tenants seems to be broken (`issue#22046 <http://tracker.ceph.com/issues/22046>`_, `pr#19050 <https://github.com/ceph/ceph/pull/19050>`_, Orit Wasserman)
-* rgw: file deadlock on lru evicting (`issue#22736 <http://tracker.ceph.com/issues/22736>`_, `pr#20075 <https://github.com/ceph/ceph/pull/20075>`_, Matt Benjamin)
-* rgw: fix chained cache invalidation to prevent cache size growth (`issue#22410 <http://tracker.ceph.com/issues/22410>`_, `pr#19785 <https://github.com/ceph/ceph/pull/19785>`_, Mark Kogan)
-* rgw: fix for empty query string in beast frontend (`issue#22797 <http://tracker.ceph.com/issues/22797>`_, `pr#20338 <https://github.com/ceph/ceph/pull/20338>`_, Casey Bodley)
-* rgw: fix GET website response error code (`issue#22272 <http://tracker.ceph.com/issues/22272>`_, `pr#19489 <https://github.com/ceph/ceph/pull/19489>`_, Dmitry Plyakin)
-* rgw: fix rewrite a versioning object create a new object bug (`issue#21984 <http://tracker.ceph.com/issues/21984>`_, `issue#22529 <http://tracker.ceph.com/issues/22529>`_, `pr#19787 <https://github.com/ceph/ceph/pull/19787>`_, Enming Zhang, Matt Benjamin)
-* rgw: Fix swift object expiry not deleting objects (`issue#22084 <http://tracker.ceph.com/issues/22084>`_, `pr#18972 <https://github.com/ceph/ceph/pull/18972>`_, Pavan Rallabhandi)
-* rgw: Fix swift object expiry not deleting objects (`issue#22084 <http://tracker.ceph.com/issues/22084>`_, `pr#19090 <https://github.com/ceph/ceph/pull/19090>`_, Pavan Rallabhandi)
-* rgw: librgw: fix shutdown error with resources uncleaned (`issue#22296 <http://tracker.ceph.com/issues/22296>`_, `pr#20073 <https://github.com/ceph/ceph/pull/20073>`_, Tao Chen)
-* rgw: log keystone errors at a higher level (`issue#22151 <http://tracker.ceph.com/issues/22151>`_, `pr#19077 <https://github.com/ceph/ceph/pull/19077>`_, Abhishek Lekshmanan)
-* rgw: make HTTP dechunking compatible with Amazon S3 (`issue#21015 <http://tracker.ceph.com/issues/21015>`_, `pr#19500 <https://github.com/ceph/ceph/pull/19500>`_, Radoslaw Zarzynski)
-* rgw: modify s3 type subuser access permission fail (`issue#21983 <http://tracker.ceph.com/issues/21983>`_, `pr#18766 <https://github.com/ceph/ceph/pull/18766>`_, yuliyang)
-* rgw: multisite: destination zone does not compress synced objects (`issue#21895 <http://tracker.ceph.com/issues/21895>`_, `pr#18867 <https://github.com/ceph/ceph/pull/18867>`_, Casey Bodley)
-* rgw: multisite: 'radosgw-admin sync error list' contains temporary EBUSY errors (`issue#22473 <http://tracker.ceph.com/issues/22473>`_, `pr#19799 <https://github.com/ceph/ceph/pull/19799>`_, Casey Bodley)
-* rgw: null instance mtime incorrect when enable versioning (`issue#21743 <http://tracker.ceph.com/issues/21743>`_, `pr#18870 <https://github.com/ceph/ceph/pull/18870>`_, Shasha Lu)
-* rgw: Policy parser may or may not dereference uninitialized boost::optional sometimes (`issue#21962 <http://tracker.ceph.com/issues/21962>`_, `pr#18868 <https://github.com/ceph/ceph/pull/18868>`_, Adam C. Emerson)
-* rgw: Possible deadlock in 'list_children' when refresh is required (`issue#21670 <http://tracker.ceph.com/issues/21670>`_, `pr#18564 <https://github.com/ceph/ceph/pull/18564>`_, Jason Dillaman)
-* rgw: put bucket policy panics RGW process (`issue#22541 <http://tracker.ceph.com/issues/22541>`_, `pr#19847 <https://github.com/ceph/ceph/pull/19847>`_, Bingyin Zhang)
-* rgw: radosgw-admin reshard command argument error (`issue#21723 <http://tracker.ceph.com/issues/21723>`_, `pr#19502 <https://github.com/ceph/ceph/pull/19502>`_, Yao Zongyou)
-* rgw: radosgw-admin zonegroup get and zone get should return defaults when there is no realm (`issue#21615 <http://tracker.ceph.com/issues/21615>`_, `pr#19086 <https://github.com/ceph/ceph/pull/19086>`_, lvshanchun)
-* rgw: Random 500 errors in Swift PutObject (needs cache fixes) (`issue#22517 <http://tracker.ceph.com/issues/22517>`_, `issue#21560 <http://tracker.ceph.com/issues/21560>`_, `pr#19788 <https://github.com/ceph/ceph/pull/19788>`_, Adam C. Emerson)
-* rgw: refuses upload when Content-Type missing from POST policy (`issue#20201 <http://tracker.ceph.com/issues/20201>`_, `pr#19867 <https://github.com/ceph/ceph/pull/19867>`_, Matt Benjamin)
-* rgw: revert PR #8765 (`issue#22364 <http://tracker.ceph.com/issues/22364>`_, `pr#19434 <https://github.com/ceph/ceph/pull/19434>`_, fang.yuxiang)
-* rgw: RGWCrashError: RGW will crash if a putting lc config request does not include an ID tag in the request xml (`issue#21980 <http://tracker.ceph.com/issues/21980>`_, `issue#22006 <http://tracker.ceph.com/issues/22006>`_, `pr#18765 <https://github.com/ceph/ceph/pull/18765>`_, Enming Zhang)
-* rgw: rgw multisite: automated trimming for bucket index logs (`issue#18229 <http://tracker.ceph.com/issues/18229>`_, `pr#20062 <https://github.com/ceph/ceph/pull/20062>`_, Casey Bodley)
-* rgw: RGW: S3 POST policy should not require Content-Type (`issue#20201 <http://tracker.ceph.com/issues/20201>`_, `pr#19784 <https://github.com/ceph/ceph/pull/19784>`_, Matt Benjamin)
-* rgw: rgw segfaults after running radosgw-admin data sync init (`issue#22083 <http://tracker.ceph.com/issues/22083>`_, `pr#19071 <https://github.com/ceph/ceph/pull/19071>`_, Casey Bodley, Abhishek Lekshmanan)
-* rgw: rgw usage trim only trims a few entries (`issue#22234 <http://tracker.ceph.com/issues/22234>`_, `pr#19636 <https://github.com/ceph/ceph/pull/19636>`_, Abhishek Lekshmanan)
-* rgw: S3 API Policy Conditions IpAddress and NotIpAddress do not work (`issue#20931 <http://tracker.ceph.com/issues/20931>`_, `issue#20991 <http://tracker.ceph.com/issues/20991>`_, `pr#19819 <https://github.com/ceph/ceph/pull/19819>`_, John Gibson, yuliyang, Casey Bodley, Abhishek Lekshmanan, Jiaying Ren)
-* rgw: Segmentation fault when starting radosgw after reverting .rgw.root (`issue#21996 <http://tracker.ceph.com/issues/21996>`_, `pr#18764 <https://github.com/ceph/ceph/pull/18764>`_, Orit Wasserman, Casey Bodley)
-* rgw: set sync_from_all as true when no value is seen (`issue#22062 <http://tracker.ceph.com/issues/22062>`_, `pr#19038 <https://github.com/ceph/ceph/pull/19038>`_, Abhishek Lekshmanan)
-* rgw: unlink deleted bucket from bucket's owner (`issue#22248 <http://tracker.ceph.com/issues/22248>`_, `pr#20357 <https://github.com/ceph/ceph/pull/20357>`_, Casey Bodley)
-* rgw: user stats increased after bucket reshard (`issue#22124 <http://tracker.ceph.com/issues/22124>`_, `pr#19538 <https://github.com/ceph/ceph/pull/19538>`_, Orit Wasserman)
-* rgw: When a system object is created exclusively, do not distribute the (`issue#22792 <http://tracker.ceph.com/issues/22792>`_, `pr#20107 <https://github.com/ceph/ceph/pull/20107>`_, J. Eric Ivancich, Robin H. Johnson)
-* tests: ceph_test_cls_log failures related to cls_cxx_subop_version() (`issue#21964 <http://tracker.ceph.com/issues/21964>`_, `pr#18715 <https://github.com/ceph/ceph/pull/18715>`_, Casey Bodley)
-* tests: ceph_test_objectstore fails ObjectStore/StoreTest.Synthetic/1 (filestore) buffer content mismatch (`issue#21712 <http://tracker.ceph.com/issues/21712>`_, `issue#21818 <http://tracker.ceph.com/issues/21818>`_, `pr#18742 <https://github.com/ceph/ceph/pull/18742>`_, Sage Weil)
-* tests: configure zabbix properly before selftest (`issue#22514 <http://tracker.ceph.com/issues/22514>`_, `pr#19831 <https://github.com/ceph/ceph/pull/19831>`_, John Spray)
-* tests: do not configure ec data pool with memstore (`issue#22436 <http://tracker.ceph.com/issues/22436>`_, `pr#19628 <https://github.com/ceph/ceph/pull/19628>`_, Patrick Donnelly)
-* tests: force backfill test can conflict with pool removal (`issue#22614 <http://tracker.ceph.com/issues/22614>`_, `pr#19966 <https://github.com/ceph/ceph/pull/19966>`_, Sage Weil)
-* tests: full flag not set on osdmap for tasks.cephfs.test_full (`issue#22475 <http://tracker.ceph.com/issues/22475>`_, `pr#19962 <https://github.com/ceph/ceph/pull/19962>`_, Patrick Donnelly)
-* tests: increase osd count for ec testing (`issue#22646 <http://tracker.ceph.com/issues/22646>`_, `pr#19976 <https://github.com/ceph/ceph/pull/19976>`_, Patrick Donnelly)
-* tests - Initial checkin for luminous point-to-point upgrade (`issue#22048 <http://tracker.ceph.com/issues/22048>`_, `pr#18771 <https://github.com/ceph/ceph/pull/18771>`_, Yuri Weinstein)
-* tests: qa/workunits/rbd: simplify split-brain test to avoid potential race (`issue#22485 <http://tracker.ceph.com/issues/22485>`_, `pr#20205 <https://github.com/ceph/ceph/pull/20205>`_, Jason Dillaman)
-* tests: qa/workunits/rbd: switch devstack to pike release (`issue#22786 <http://tracker.ceph.com/issues/22786>`_, `pr#20136 <https://github.com/ceph/ceph/pull/20136>`_, Jason Dillaman)
-* tests: rbd_mirror_helpers.sh request_resync_image function saves image id to wrong variable (`issue#21663 <http://tracker.ceph.com/issues/21663>`_, `pr#19802 <https://github.com/ceph/ceph/pull/19802>`_, Jason Dillaman)
-* tools/ceph_monstore_tool: include mgrmap in initial paxos epoch (`issue#22266 <http://tracker.ceph.com/issues/22266>`_, `pr#20116 <https://github.com/ceph/ceph/pull/20116>`_, Kefu Chai)
-* tools: ceph-monstore-tool --readable mode doesn't understand FSMap, MgrMap (`issue#21577 <http://tracker.ceph.com/issues/21577>`_, `pr#18754 <https://github.com/ceph/ceph/pull/18754>`_, John Spray)
-* tools: ceph-objectstore-tool: Add option dump-import to examine an export (`issue#22086 <http://tracker.ceph.com/issues/22086>`_, `pr#19487 <https://github.com/ceph/ceph/pull/19487>`_, David Zafman)
-* tools: ceph_objectstore_tool: no flush before collection_empty() calls; ObjectStore/StoreTest.SimpleAttrTest/2 fails (`issue#22409 <http://tracker.ceph.com/issues/22409>`_, `pr#19967 <https://github.com/ceph/ceph/pull/19967>`_, Igor Fedotov)
-* tools: ceph-objectstore-tool set-size should clear data-digest (`issue#22112 <http://tracker.ceph.com/issues/22112>`_, `pr#20069 <https://github.com/ceph/ceph/pull/20069>`_, David Zafman)
-* tools/crushtool: skip device id if no name exists (`issue#22117 <http://tracker.ceph.com/issues/22117>`_, `pr#19039 <https://github.com/ceph/ceph/pull/19039>`_, Jan Fajerski)
-
-
-v12.2.2 Luminous
-================
-
-This is the second bugfix release of Luminous v12.2.x long term stable release
-series. It contains a range of bug fixes and a few features across Bluestore,
-CephFS, RBD & RGW. We recommend all the users of 12.2.x series update.
-
-For more detailed information, see :download:`the complete changelog <../changelog/v12.2.2.txt>`.
-
-
-Notable Changes
----------------
-
-* Standby ceph-mgr daemons now redirect requests to the active messenger, easing
-  configuration for tools & users accessing the web dashboard, restful API, or
-  other ceph-mgr module services.
-* The prometheus module has several significant updates and improvements.
-* The new balancer module enables automatic optimization of CRUSH weights to
-  balance data across the cluster.
-* The ceph-volume tool has been updated to include support for BlueStore as well
-  as FileStore. The only major missing ceph-volume feature is dm-crypt support.
-* RGW's dynamic bucket index resharding is disabled in multisite environments,
-  as it can cause inconsistencies in replication of bucket indexes to remote
-  sites.
-
-Other Notable Changes
----------------------
-
-* build/ops: bump sphinx to 1.6 (`issue#21717 <http://tracker.ceph.com/issues/21717>`_, `pr#18167 <https://github.com/ceph/ceph/pull/18167>`_, Kefu Chai, Alfredo Deza)
-* build/ops: macros expanding in spec file comment (`issue#22250 <http://tracker.ceph.com/issues/22250>`_, `pr#19173 <https://github.com/ceph/ceph/pull/19173>`_, Ken Dreyer)
-* build/ops: python-numpy-devel build dependency for SUSE (`issue#21176 <http://tracker.ceph.com/issues/21176>`_, `pr#17692 <https://github.com/ceph/ceph/pull/17692>`_, Nathan Cutler)
-* build/ops: selinux: Allow getattr on lnk sysfs files (`issue#21492 <http://tracker.ceph.com/issues/21492>`_, `pr#18650 <https://github.com/ceph/ceph/pull/18650>`_, Boris Ranto)
-* build/ops: Ubuntu amd64 client can not discover the ubuntu arm64 ceph cluster (`issue#19705 <http://tracker.ceph.com/issues/19705>`_, `pr#18293 <https://github.com/ceph/ceph/pull/18293>`_, Kefu Chai)
-* core: buffer: fix ABI breakage by removing list _mempool member (`issue#21573 <http://tracker.ceph.com/issues/21573>`_, `pr#18491 <https://github.com/ceph/ceph/pull/18491>`_, Sage Weil)
-* core: Daemons(OSD, Mon...) exit abnormally at injectargs command (`issue#21365 <http://tracker.ceph.com/issues/21365>`_, `pr#17864 <https://github.com/ceph/ceph/pull/17864>`_, Yan Jun)
-* core: Disable messenger logging (debug ms = 0/0) for clients unless overridden (`issue#21860 <http://tracker.ceph.com/issues/21860>`_, `pr#18529 <https://github.com/ceph/ceph/pull/18529>`_, Jason Dillaman)
-* core: Improve OSD startup time by only scanning for omap corruption once (`issue#21328 <http://tracker.ceph.com/issues/21328>`_, `pr#17889 <https://github.com/ceph/ceph/pull/17889>`_, Luo Kexue, David Zafman)
-* core: upmap does not respect osd reweights (`issue#21538 <http://tracker.ceph.com/issues/21538>`_, `pr#18699 <https://github.com/ceph/ceph/pull/18699>`_, Theofilos Mouratidis)
-* dashboard: barfs on nulls where it expects numbers (`issue#21570 <http://tracker.ceph.com/issues/21570>`_, `pr#18728 <https://github.com/ceph/ceph/pull/18728>`_, John Spray)
-* dashboard: OSD list has servers and osds in arbitrary order (`issue#21572 <http://tracker.ceph.com/issues/21572>`_, `pr#18736 <https://github.com/ceph/ceph/pull/18736>`_, John Spray)
-* dashboard: the dashboard uses absolute links for filesystems and clients (`issue#20568 <http://tracker.ceph.com/issues/20568>`_, `pr#18737 <https://github.com/ceph/ceph/pull/18737>`_, Nick Erdmann)
-* filestore: set default readahead and compaction threads for rocksdb (`issue#21505 <http://tracker.ceph.com/issues/21505>`_, `pr#18234 <https://github.com/ceph/ceph/pull/18234>`_, Josh Durgin, Mark Nelson)
-* librbd: object map batch update might cause OSD suicide timeout (`issue#21797 <http://tracker.ceph.com/issues/21797>`_, `pr#18416 <https://github.com/ceph/ceph/pull/18416>`_, Jason Dillaman)
-* librbd: snapshots should be created/removed against data pool (`issue#21567 <http://tracker.ceph.com/issues/21567>`_, `pr#18336 <https://github.com/ceph/ceph/pull/18336>`_, Jason Dillaman)
-* mds: make sure snap inode's last matches its parent dentry's last (`issue#21337 <http://tracker.ceph.com/issues/21337>`_, `pr#17994 <https://github.com/ceph/ceph/pull/17994>`_, "Yan, Zheng")
-* mds: sanitize mdsmap of removed pools (`issue#21945 <http://tracker.ceph.com/issues/21945>`_, `issue#21568 <http://tracker.ceph.com/issues/21568>`_, `pr#18628 <https://github.com/ceph/ceph/pull/18628>`_, Patrick Donnelly)
-* mgr: bulk backport of ceph-mgr improvements (`issue#21594 <http://tracker.ceph.com/issues/21594>`_, `issue#17460 <http://tracker.ceph.com/issues/17460>`_, `issue#21197 <http://tracker.ceph.com/issues/21197>`_, `issue#21158 <http://tracker.ceph.com/issues/21158>`_, `issue#21593 <http://tracker.ceph.com/issues/21593>`_, `pr#18675 <https://github.com/ceph/ceph/pull/18675>`_, Benjeman Meekhof, Sage Weil, Jan Fajerski, John Spray, Kefu Chai, My Do, Spandan Kumar Sahu)
-* mgr: ceph-mgr gets process called "exe" after respawn (`issue#21404 <http://tracker.ceph.com/issues/21404>`_, `pr#18738 <https://github.com/ceph/ceph/pull/18738>`_, John Spray)
-* mgr: fix crashable DaemonStateIndex::get calls (`issue#17737 <http://tracker.ceph.com/issues/17737>`_, `pr#18412 <https://github.com/ceph/ceph/pull/18412>`_, John Spray)
-* mgr: key mismatch for mgr after upgrade from jewel to luminous(dev) (`issue#20950 <http://tracker.ceph.com/issues/20950>`_, `pr#18727 <https://github.com/ceph/ceph/pull/18727>`_, John Spray)
-* mgr: mgr status module uses base 10 units (`issue#21189 <http://tracker.ceph.com/issues/21189>`_, `issue#21752 <http://tracker.ceph.com/issues/21752>`_, `pr#18257 <https://github.com/ceph/ceph/pull/18257>`_, John Spray, Yanhu Cao)
-* mgr: mgr[zabbix] float division by zero (`issue#21518 <http://tracker.ceph.com/issues/21518>`_, `pr#18734 <https://github.com/ceph/ceph/pull/18734>`_, John Spray)
-* mgr: Prometheus crash when update (`issue#21253 <http://tracker.ceph.com/issues/21253>`_, `pr#17867 <https://github.com/ceph/ceph/pull/17867>`_, John Spray)
-* mgr: prometheus module generates invalid output when counter names contain non-alphanum characters (`issue#20899 <http://tracker.ceph.com/issues/20899>`_, `pr#17868 <https://github.com/ceph/ceph/pull/17868>`_, John Spray, Jeremy H Austin)
-* mgr: Quieten scary RuntimeError from restful module on startup (`issue#21292 <http://tracker.ceph.com/issues/21292>`_, `pr#17866 <https://github.com/ceph/ceph/pull/17866>`_, John Spray)
-* mgr: Spurious ceph-mgr failovers during mon elections (`issue#20629 <http://tracker.ceph.com/issues/20629>`_, `pr#18726 <https://github.com/ceph/ceph/pull/18726>`_, John Spray)
-* mon: Client client.admin marked osd.2 out, after it was down for 1504627577 seconds (`issue#21249 <http://tracker.ceph.com/issues/21249>`_, `pr#17862 <https://github.com/ceph/ceph/pull/17862>`_, John Spray)
-* mon: DNS SRV default service name not used anymore (`issue#21204 <http://tracker.ceph.com/issues/21204>`_, `pr#17863 <https://github.com/ceph/ceph/pull/17863>`_, Kefu Chai)
-* mon/MgrMonitor: handle cmd descs to/from disk in the absence of active mgr (`issue#21300 <http://tracker.ceph.com/issues/21300>`_, `pr#18038 <https://github.com/ceph/ceph/pull/18038>`_, Joao Eduardo Luis)
-* mon/mgr: sync "mgr_command_descs","osd_metadata" and "mgr_metadata" prefixes to new mons (`issue#21527 <http://tracker.ceph.com/issues/21527>`_, `pr#18620 <https://github.com/ceph/ceph/pull/18620>`_, huanwen ren)
-* mon: osd feature checks with 0 up osds (`issue#21471 <http://tracker.ceph.com/issues/21471>`_, `issue#20751 <http://tracker.ceph.com/issues/20751>`_, `pr#18364 <https://github.com/ceph/ceph/pull/18364>`_, Brad Hubbard, Sage Weil)
-* mon,osd: fix "pg ls {forced_backfill, backfilling}" (`issue#21609 <http://tracker.ceph.com/issues/21609>`_, `pr#18236 <https://github.com/ceph/ceph/pull/18236>`_, Kefu Chai)
-* mon/OSDMonitor: add option to fix up ruleset-\* to crush-\* for ec profiles (`issue#22128 <http://tracker.ceph.com/issues/22128>`_, `pr#18945 <https://github.com/ceph/ceph/pull/18945>`_, Sage Weil)
-* mon, osd: per pool space-full flag support (`issue#21409 <http://tracker.ceph.com/issues/21409>`_, `pr#17730 <https://github.com/ceph/ceph/pull/17730>`_, xie xingguo)
-* mon/PGMap: Fix %USED calculation (`issue#22247 <http://tracker.ceph.com/issues/22247>`_, `pr#19230 <https://github.com/ceph/ceph/pull/19230>`_, Xiaoxi Chen)
-* mon: update get_store_prefixes implementations (`issue#21534 <http://tracker.ceph.com/issues/21534>`_, `pr#18621 <https://github.com/ceph/ceph/pull/18621>`_, John Spray, huanwen ren)
-* msgr: messages/MOSDMap: do compat reencode of crush map, too (`issue#21882 <http://tracker.ceph.com/issues/21882>`_, `pr#18456 <https://github.com/ceph/ceph/pull/18456>`_, Sage Weil)
-* msgr: src/messages/MOSDMap: reencode OSDMap for older clients (`issue#21660 <http://tracker.ceph.com/issues/21660>`_, `pr#18140 <https://github.com/ceph/ceph/pull/18140>`_, Sage Weil)
-* os/bluestore/BlueFS: fix race with log flush during async log compaction (`issue#21878 <http://tracker.ceph.com/issues/21878>`_, `pr#18503 <https://github.com/ceph/ceph/pull/18503>`_, Sage Weil)
-* os/bluestore: fix another aio stall/deadlock (`issue#21470 <http://tracker.ceph.com/issues/21470>`_, `pr#18127 <https://github.com/ceph/ceph/pull/18127>`_, Sage Weil)
-* os/bluestore: fix SharedBlob unregistration (`issue#22039 <http://tracker.ceph.com/issues/22039>`_, `pr#18983 <https://github.com/ceph/ceph/pull/18983>`_, Sage Weil)
-* os/bluestore: handle compressed extents in blob unsharing checks (`issue#21766 <http://tracker.ceph.com/issues/21766>`_, `pr#18501 <https://github.com/ceph/ceph/pull/18501>`_, Sage Weil)
-* os/bluestore: replace 21089 repair with something online (instead of fsck) (`issue#21089 <http://tracker.ceph.com/issues/21089>`_, `pr#17734 <https://github.com/ceph/ceph/pull/17734>`_, Sage Weil)
-* os/bluestore: set bitmap freelist resolution to min_alloc_size (`issue#21408 <http://tracker.ceph.com/issues/21408>`_, `pr#18050 <https://github.com/ceph/ceph/pull/18050>`_, Sage Weil)
-* os/blueStore::umount will crash when the BlueStore is opened by start_kv_only() (`issue#21624 <http://tracker.ceph.com/issues/21624>`_, `pr#18750 <https://github.com/ceph/ceph/pull/18750>`_, Chang Liu)
-* osd: additional protection for out-of-bounds EC reads (`issue#21629 <http://tracker.ceph.com/issues/21629>`_, `pr#18413 <https://github.com/ceph/ceph/pull/18413>`_, Jason Dillaman)
-* osd: allow recovery preemption (`issue#21613 <http://tracker.ceph.com/issues/21613>`_, `pr#18025 <https://github.com/ceph/ceph/pull/18025>`_, Sage Weil)
-* osd: build_past_intervals_parallel: Ignore new partially created PGs (`issue#21833 <http://tracker.ceph.com/issues/21833>`_, `pr#18673 <https://github.com/ceph/ceph/pull/18673>`_, David Zafman)
-* osd: dump bluestore debug on shutdown if debug option is set (`issue#21259 <http://tracker.ceph.com/issues/21259>`_, `pr#18103 <https://github.com/ceph/ceph/pull/18103>`_, Sage Weil)
-* osd: make stat_bytes and stat_bytes_used counters PRIO_USEFUL (`issue#21981 <http://tracker.ceph.com/issues/21981>`_, `pr#18723 <https://github.com/ceph/ceph/pull/18723>`_, Yao Zongyou)
-* osd: make the PG's SORTBITWISE assert a more generous shutdown (`issue#20416 <http://tracker.ceph.com/issues/20416>`_, `pr#18132 <https://github.com/ceph/ceph/pull/18132>`_, Greg Farnum)
-* osd: OSD metadata 'backend_filestore_dev_node' is unknown even for simple deployment (`issue#20944 <http://tracker.ceph.com/issues/20944>`_, `pr#17865 <https://github.com/ceph/ceph/pull/17865>`_, Sage Weil)
-* rbd: [cli] mirror getter commands will fail if mirroring has never been enabled (`issue#21319 <http://tracker.ceph.com/issues/21319>`_, `pr#17861 <https://github.com/ceph/ceph/pull/17861>`_, Jason Dillaman)
-* rbd: cls/journal: fixed possible infinite loop in expire_tags (`issue#21956 <http://tracker.ceph.com/issues/21956>`_, `pr#18626 <https://github.com/ceph/ceph/pull/18626>`_, Jason Dillaman)
-* rbd: cls/journal: possible infinite loop within tag_list class method (`issue#21771 <http://tracker.ceph.com/issues/21771>`_, `pr#18417 <https://github.com/ceph/ceph/pull/18417>`_, Jason Dillaman)
-* rbd: [rbd-mirror] asok hook names not updated when image is renamed (`issue#20860 <http://tracker.ceph.com/issues/20860>`_, `pr#17860 <https://github.com/ceph/ceph/pull/17860>`_, Mykola Golub)
-* rbd: [rbd-mirror] forced promotion can result in incorrect status (`issue#21559 <http://tracker.ceph.com/issues/21559>`_, `pr#18337 <https://github.com/ceph/ceph/pull/18337>`_, Jason Dillaman)
-* rbd: [rbd-mirror] peer cluster connections should filter out command line optionals (`issue#21894 <http://tracker.ceph.com/issues/21894>`_, `pr#18566 <https://github.com/ceph/ceph/pull/18566>`_, Jason Dillaman)
-* rgw: add support for Swift's per storage policy statistics (`issue#17932 <http://tracker.ceph.com/issues/17932>`_, `issue#21506 <http://tracker.ceph.com/issues/21506>`_, `pr#17835 <https://github.com/ceph/ceph/pull/17835>`_, Radoslaw Zarzynski, Casey Bodley)
-* rgw: add support for Swift's reversed account listings (`issue#21148 <http://tracker.ceph.com/issues/21148>`_, `pr#17834 <https://github.com/ceph/ceph/pull/17834>`_, Radoslaw Zarzynski)
-* rgw: avoid logging keystone revocation failures when no keystone is configured (`issue#21400 <http://tracker.ceph.com/issues/21400>`_, `pr#18441 <https://github.com/ceph/ceph/pull/18441>`_, Abhishek Lekshmanan)
-* rgw: disable dynamic resharding in multisite enviorment (`issue#21725 <http://tracker.ceph.com/issues/21725>`_, `pr#18432 <https://github.com/ceph/ceph/pull/18432>`_, Orit Wasserman)
-* rgw: encryption: PutObj response does not include sse-kms headers (`issue#21576 <http://tracker.ceph.com/issues/21576>`_, `pr#18442 <https://github.com/ceph/ceph/pull/18442>`_, Casey Bodley)
-* rgw: encryption: reject requests that don't provide all expected headers (`issue#21581 <http://tracker.ceph.com/issues/21581>`_, `pr#18429 <https://github.com/ceph/ceph/pull/18429>`_, Enming Zhang)
-* rgw: expose --sync-stats via admin api (`issue#21301 <http://tracker.ceph.com/issues/21301>`_, `pr#18439 <https://github.com/ceph/ceph/pull/18439>`_, Nathan Johnson)
-* rgw: failed CompleteMultipartUpload request does not release lock (`issue#21596 <http://tracker.ceph.com/issues/21596>`_, `pr#18430 <https://github.com/ceph/ceph/pull/18430>`_, Matt Benjamin)
-* rgw_file:  set s->obj_size from bytes_written (`issue#21940 <http://tracker.ceph.com/issues/21940>`_, `pr#18599 <https://github.com/ceph/ceph/pull/18599>`_, Matt Benjamin)
-* rgw: fix a bug about inconsistent unit of comparison (`issue#21590 <http://tracker.ceph.com/issues/21590>`_, `pr#18438 <https://github.com/ceph/ceph/pull/18438>`_, gaosibei)
-* rgw: fix bilog entries on multipart complete (`issue#21772 <http://tracker.ceph.com/issues/21772>`_, `pr#18334 <https://github.com/ceph/ceph/pull/18334>`_, Casey Bodley)
-* rgw: fix error handling in ListBucketIndexesCR (`issue#21735 <http://tracker.ceph.com/issues/21735>`_, `pr#18591 <https://github.com/ceph/ceph/pull/18591>`_, Casey Bodley)
-* rgw: fix refcnt issues (`issue#21819 <http://tracker.ceph.com/issues/21819>`_, `pr#18539 <https://github.com/ceph/ceph/pull/18539>`_, baixueyu)
-* rgw: lc process only schdule the first item of lc objects (`issue#21022 <http://tracker.ceph.com/issues/21022>`_, `pr#17859 <https://github.com/ceph/ceph/pull/17859>`_, Shasha Lu)
-* rgw: list bucket which enable versioning get wrong result when user marker (`issue#21500 <http://tracker.ceph.com/issues/21500>`_, `pr#18569 <https://github.com/ceph/ceph/pull/18569>`_, yuliyang)
-* rgw: list_objects() honors end_marker regardless of namespace (`issue#18977 <http://tracker.ceph.com/issues/18977>`_, `pr#17832 <https://github.com/ceph/ceph/pull/17832>`_, Radoslaw Zarzynski)
-* rgw: Multipart upload may double the quota (`issue#21586 <http://tracker.ceph.com/issues/21586>`_, `pr#18435 <https://github.com/ceph/ceph/pull/18435>`_, Sibei Gao)
-* rgw: multisite: Get bucket location which is located in another zonegroup, will return 301 Moved Permanently (`issue#21125 <http://tracker.ceph.com/issues/21125>`_, `pr#17857 <https://github.com/ceph/ceph/pull/17857>`_, Shasha Lu)
-* rgw: multisite: race between sync of bucket and bucket instance metadata (`issue#21990 <http://tracker.ceph.com/issues/21990>`_, `pr#18767 <https://github.com/ceph/ceph/pull/18767>`_, Casey Bodley)
-* rgw: policy checks missing from Get/SetRequestPayment operations (`issue#21389 <http://tracker.ceph.com/issues/21389>`_, `pr#18440 <https://github.com/ceph/ceph/pull/18440>`_, Adam C. Emerson)
-* rgw: radosgw-admin usage show loops indefinitly (`issue#21196 <http://tracker.ceph.com/issues/21196>`_, `pr#18437 <https://github.com/ceph/ceph/pull/18437>`_, Mark Kogan)
-* rgw: rgw_file: explicit NFSv3 open() emulation (`issue#21854 <http://tracker.ceph.com/issues/21854>`_, `pr#18446 <https://github.com/ceph/ceph/pull/18446>`_, Matt Benjamin)
-* rgw: rgw_file: fix write error when the write offset overlaps (`issue#21455 <http://tracker.ceph.com/issues/21455>`_, `pr#18004 <https://github.com/ceph/ceph/pull/18004>`_, Yao Zongyou)
-* rgw: rgw file write error (`issue#21455 <http://tracker.ceph.com/issues/21455>`_, `pr#18433 <https://github.com/ceph/ceph/pull/18433>`_, Yao Zongyou)
-* rgw: s3:GetBucketCORS/s3:PutBucketCORS policy fails with 403 (`issue#21578 <http://tracker.ceph.com/issues/21578>`_, `pr#18444 <https://github.com/ceph/ceph/pull/18444>`_, Adam C. Emerson)
-* rgw:  s3:GetBucketLocation bucket policy fails with 403 (`issue#21582 <http://tracker.ceph.com/issues/21582>`_, `pr#18443 <https://github.com/ceph/ceph/pull/18443>`_, Adam C. Emerson)
-* rgw: s3:GetBucketWebsite/PutBucketWebsite fails with 403 (`issue#21597 <http://tracker.ceph.com/issues/21597>`_, `pr#18445 <https://github.com/ceph/ceph/pull/18445>`_, Adam C. Emerson)
-* rgw: setxattrs call leads to different mtimes for bucket index and object (`issue#21200 <http://tracker.ceph.com/issues/21200>`_, `pr#17856 <https://github.com/ceph/ceph/pull/17856>`_, Abhishek Lekshmanan)
-* rgw: stop/join TokenCache revoke thread only if started (`issue#21666 <http://tracker.ceph.com/issues/21666>`_, `pr#18138 <https://github.com/ceph/ceph/pull/18138>`_, Karol Mroz)
-* rgw: string_view instance points to expired memory in PrefixableSignatureHelper (`issue#21085 <http://tracker.ceph.com/issues/21085>`_, `pr#17858 <https://github.com/ceph/ceph/pull/17858>`_, Radoslaw Zarzynski)
-* rgw: user creation can overwrite existing user even if different uid is given (`issue#21685 <http://tracker.ceph.com/issues/21685>`_, `pr#18436 <https://github.com/ceph/ceph/pull/18436>`_, Casey Bodley)
-* rgw: We cant't get torrents if  objects are encrypted using SSE-C (`issue#21720 <http://tracker.ceph.com/issues/21720>`_, `pr#18431 <https://github.com/ceph/ceph/pull/18431>`_, Zhang Shaowen)
-* rgw: wrong error message is returned when putting container with a name that is too long (`issue#17938 <http://tracker.ceph.com/issues/17938>`_, `issue#21169 <http://tracker.ceph.com/issues/21169>`_, `issue#17935 <http://tracker.ceph.com/issues/17935>`_, `issue#17934 <http://tracker.ceph.com/issues/17934>`_, `issue#17936 <http://tracker.ceph.com/issues/17936>`_, `pr#17811 <https://github.com/ceph/ceph/pull/17811>`_, Radoslaw Zarzynski)
-* rgw: zone compression type is not validated (`issue#21775 <http://tracker.ceph.com/issues/21775>`_, `pr#18434 <https://github.com/ceph/ceph/pull/18434>`_, Casey Bodley)
-* tools: ceph-disk create deprecation warnings (`issue#22154 <http://tracker.ceph.com/issues/22154>`_, `pr#18989 <https://github.com/ceph/ceph/pull/18989>`_, Alfredo Deza)
-* tools: ceph-disk: fix '--runtime' omission for ceph-osd service (`issue#21498 <http://tracker.ceph.com/issues/21498>`_, `pr#17914 <https://github.com/ceph/ceph/pull/17914>`_, Carl Xiong)
-* tools: ceph-disk flake8 test fails on very old, and very new, versions of flake8 (`issue#22207 <http://tracker.ceph.com/issues/22207>`_, `pr#19152 <https://github.com/ceph/ceph/pull/19152>`_, Nathan Cutler)
-* tools: ceph-disk: retry on OSError (`issue#21728 <http://tracker.ceph.com/issues/21728>`_, `pr#18189 <https://github.com/ceph/ceph/pull/18189>`_, Kefu Chai)
-* tools: ceph-disk: unlocks dmcrypted partitions when activating them (`issue#20488 <http://tracker.ceph.com/issues/20488>`_, `pr#18625 <https://github.com/ceph/ceph/pull/18625>`_, Kefu Chai, Felix Winterhalter)
-* tools: ceph-kvstore-tool does not call bluestore's umount when exit (`issue#21625 <http://tracker.ceph.com/issues/21625>`_, `pr#18751 <https://github.com/ceph/ceph/pull/18751>`_, Chang Liu)
-* tools: ceph_monstore_tool: rebuild initial mgrmap also (`issue#22266 <http://tracker.ceph.com/issues/22266>`_, `pr#19240 <https://github.com/ceph/ceph/pull/19240>`_, Kefu Chai)
-* tools: ceph-objectstore-tool and ceph-bluestore-tool: backports from master (`issue#21272 <http://tracker.ceph.com/issues/21272>`_, `pr#17896 <https://github.com/ceph/ceph/pull/17896>`_, Sage Weil, David Zafman)
-* tools: ceph_volume_client: add get, put, and delete object interfaces (`issue#21601 <http://tracker.ceph.com/issues/21601>`_, `pr#18037 <https://github.com/ceph/ceph/pull/18037>`_, Ramana Raja)
-* tools: cli/crushtools/build.t sometimes fails in jenkins' make check run (`issue#21758 <http://tracker.ceph.com/issues/21758>`_, `pr#18398 <https://github.com/ceph/ceph/pull/18398>`_, Kefu Chai, Sage Weil)
-
-
-
-v12.2.1 Luminous
-================
-
-This is the first bugfix release of Luminous v12.2.x long term stable
-release series. It contains a range of bug fixes and a few features
-across CephFS, RBD & RGW. We recommend all the users of 12.2.x series
-update.
-
-For more detailed information, see :download:`the complete changelog <../changelog/v12.2.1.txt>`.
-
-
-Notable Changes
----------------
-
-* Dynamic resharding is now enabled by default for RGW, RGW will now
-  automatically reshard there bucket index once the index grows beyond
-  `rgw_max_objs_per_shard`
-
-* Limiting MDS cache via a memory limit is now supported using the new
-  mds_cache_memory_limit config option (1GB by default).  A cache reservation
-  can also be specified using mds_cache_reservation as a percentage of the
-  limit (5% by default). Limits by inode count are still supported using
-  mds_cache_size. Setting mds_cache_size to 0 (the default) disables the
-  inode limit.
-
-* The maximum number of PGs per OSD before the monitor issues a
-  warning has been reduced from 300 to 200 PGs.  200 is still twice
-  the generally recommended target of 100 PGs per OSD.  This limit can
-  be adjusted via the ``mon_max_pg_per_osd`` option on the
-  monitors.  The older ``mon_pg_warn_max_per_osd`` option has been removed.
-
-* Creating pools or adjusting pg_num will now fail if the change would
-  make the number of PGs per OSD exceed the configured
-  ``mon_max_pg_per_osd`` limit.  The option can be adjusted if it
-  is really necessary to create a pool with more PGs.
-
-* There was a bug in the PG mapping behavior of the new *upmap*
-  feature. If you made use of this feature (e.g., via the `ceph osd
-  pg-upmap-items` command), we recommend that all mappings be removed (via
-  the `ceph osd rm-pg-upmap-items` command) before upgrading to this
-  point release.
-
-* A stall in BlueStore IO submission that was affecting many users has
-  been resolved.
-
-Other Notable Changes
----------------------
-
-* bluestore: asyn cdeferred_try_submit deadlock (`issue#21207 <http://tracker.ceph.com/issues/21207>`_, `pr#17494 <https://github.com/ceph/ceph/pull/17494>`_, Sage Weil)
-* bluestore: fix deferred write deadlock, aio short return handling (`issue#21171 <http://tracker.ceph.com/issues/21171>`_, `pr#17601 <https://github.com/ceph/ceph/pull/17601>`_, Sage Weil)
-* bluestore: osd crash when change option bluestore_csum_type from none to CRC32 (`issue#21175 <http://tracker.ceph.com/issues/21175>`_, `pr#17497 <https://github.com/ceph/ceph/pull/17497>`_, xie xingguo)
-* bluestore: os/bluestore/BlueFS.cc: 1255: FAILED assert(!log_file->fnode.extents.empty()) (`issue#21250 <http://tracker.ceph.com/issues/21250>`_, `pr#17562 <https://github.com/ceph/ceph/pull/17562>`_, Sage Weil)
-* build/ops: ceph-fuse RPM should require fusermount (`issue#21057 <http://tracker.ceph.com/issues/21057>`_, `pr#17470 <https://github.com/ceph/ceph/pull/17470>`_, Ken Dreyer)
-* build/ops: RHEL 7.3 Selinux denials at OSD start (`issue#19200 <http://tracker.ceph.com/issues/19200>`_, `pr#17468 <https://github.com/ceph/ceph/pull/17468>`_, Boris Ranto)
-* build/ops: rocksdb,cmake:  build portable binaries (`issue#20529 <http://tracker.ceph.com/issues/20529>`_, `pr#17745 <https://github.com/ceph/ceph/pull/17745>`_, Kefu Chai)
-* cephfs: client/mds has wrong check to clear S_ISGID on chown (`issue#21004 <http://tracker.ceph.com/issues/21004>`_, `pr#17471 <https://github.com/ceph/ceph/pull/17471>`_, Patrick Donnelly)
-* cephfs: get_quota_root sends lookupname op for every buffered write (`issue#20945 <http://tracker.ceph.com/issues/20945>`_, `pr#17473 <https://github.com/ceph/ceph/pull/17473>`_, Dan van der Ster)
-* cephfs: MDCache::try_subtree_merge() may print N^2 lines of debug message (`issue#21221 <http://tracker.ceph.com/issues/21221>`_, `pr#17712 <https://github.com/ceph/ceph/pull/17712>`_, Patrick Donnelly)
-* cephfs: MDS rank add/remove log messages say wrong number of ranks (`issue#21421 <http://tracker.ceph.com/issues/21421>`_, `pr#17887 <https://github.com/ceph/ceph/pull/17887>`_, John Spray)
-* cephfs: MDS: standby-replay mds should avoid initiating subtree export (`issue#21378 <http://tracker.ceph.com/issues/21378>`_, `issue#21222 <http://tracker.ceph.com/issues/21222>`_, `pr#17714 <https://github.com/ceph/ceph/pull/17714>`_, "Yan, Zheng", Jianyu Li)
-* cephfs: the standbys are not updated via ceph tell mds.\* command (`issue#21230 <http://tracker.ceph.com/issues/21230>`_, `pr#17565 <https://github.com/ceph/ceph/pull/17565>`_, Kefu Chai)
-* common: adding line break at end of some cli results (`issue#21019 <http://tracker.ceph.com/issues/21019>`_, `pr#17467 <https://github.com/ceph/ceph/pull/17467>`_, songweibin)
-* core: [cls] metadata_list API function does not honor `max_return` parameter (`issue#21247 <http://tracker.ceph.com/issues/21247>`_, `pr#17558 <https://github.com/ceph/ceph/pull/17558>`_, Jason Dillaman)
-* core: incorrect erasure-code space in command ceph df (`issue#21243 <http://tracker.ceph.com/issues/21243>`_, `pr#17724 <https://github.com/ceph/ceph/pull/17724>`_, liuchang0812)
-* core: interval_set: optimize intersect_of insert operations (`issue#21229 <http://tracker.ceph.com/issues/21229>`_, `pr#17487 <https://github.com/ceph/ceph/pull/17487>`_, Zac Medico)
-* core: osd crush rule rename not idempotent (`issue#21162 <http://tracker.ceph.com/issues/21162>`_, `pr#17481 <https://github.com/ceph/ceph/pull/17481>`_, xie xingguo)
-* core: osd/PGLog: write only changed dup entries (`issue#21026 <http://tracker.ceph.com/issues/21026>`_, `pr#17378 <https://github.com/ceph/ceph/pull/17378>`_, Josh Durgin)
-* doc: doc/rbd: iSCSI Gateway Documentation (`issue#20437 <http://tracker.ceph.com/issues/20437>`_, `pr#17381 <https://github.com/ceph/ceph/pull/17381>`_, Aron Gunn, Jason Dillaman)
-* mds: fix 'dirfrag end' check in Server::handle_client_readdir (`issue#21070 <http://tracker.ceph.com/issues/21070>`_, `pr#17686 <https://github.com/ceph/ceph/pull/17686>`_, "Yan, Zheng")
-* mds: support limiting cache by memory (`issue#20594 <http://tracker.ceph.com/issues/20594>`_, `pr#17711 <https://github.com/ceph/ceph/pull/17711>`_, "Yan, Zheng", Patrick Donnelly)
-* mgr: 500 error when attempting to view filesystem data (`issue#20692 <http://tracker.ceph.com/issues/20692>`_, `pr#17477 <https://github.com/ceph/ceph/pull/17477>`_, John Spray)
-* mgr: ceph mgr versions shows active mgr as Unknown (`issue#21260 <http://tracker.ceph.com/issues/21260>`_, `pr#17635 <https://github.com/ceph/ceph/pull/17635>`_, John Spray)
-* mgr: Crash in MonCommandCompletion (`issue#21157 <http://tracker.ceph.com/issues/21157>`_, `pr#17483 <https://github.com/ceph/ceph/pull/17483>`_, John Spray)
-* mon: mon/OSDMonitor: deleting pool while pgs are being created leads to assert(p != pools.end) in update_creating_pgs() (`issue#21309 <http://tracker.ceph.com/issues/21309>`_, `pr#17634 <https://github.com/ceph/ceph/pull/17634>`_, Joao Eduardo Luis)
-* mon: OSDMonitor: osd pool application get support (`issue#20976 <http://tracker.ceph.com/issues/20976>`_, `pr#17472 <https://github.com/ceph/ceph/pull/17472>`_, xie xingguo)
-* mon: rate limit on health check update logging (`issue#20888 <http://tracker.ceph.com/issues/20888>`_, `pr#17500 <https://github.com/ceph/ceph/pull/17500>`_, John Spray)
-* osd: build_initial_pg_history doesn't update up/acting/etc (`issue#21203 <http://tracker.ceph.com/issues/21203>`_, `pr#17496 <https://github.com/ceph/ceph/pull/17496>`_, w11979, Sage Weil)
-* osd: osd/PG: discard msgs from down peers (`issue#19605 <http://tracker.ceph.com/issues/19605>`_, `pr#17501 <https://github.com/ceph/ceph/pull/17501>`_, Kefu Chai)
-* osd/PrimaryLogPG: request osdmap update in the right block (`issue#21428 <http://tracker.ceph.com/issues/21428>`_, `pr#17829 <https://github.com/ceph/ceph/pull/17829>`_, Josh Durgin)
-* osd: PrimaryLogPG: sparse read won't trigger repair correctly (`issue#21123 <http://tracker.ceph.com/issues/21123>`_, `pr#17475 <https://github.com/ceph/ceph/pull/17475>`_, xie xingguo)
-* osd: request new map from PG when needed (`issue#21428 <http://tracker.ceph.com/issues/21428>`_, `pr#17796 <https://github.com/ceph/ceph/pull/17796>`_, Josh Durgin)
-* osd: Revert "osd/OSDMap: allow bidirectional swap of pg-upmap-items" (`issue#21410 <http://tracker.ceph.com/issues/21410>`_, `pr#17812 <https://github.com/ceph/ceph/pull/17812>`_, Sage Weil)
-* osd: subscribe to new osdmap while waiting_for_healthy (`issue#21121 <http://tracker.ceph.com/issues/21121>`_, `pr#17498 <https://github.com/ceph/ceph/pull/17498>`_, Sage Weil)
-* osd: update info only if new_interval (`issue#21203 <http://tracker.ceph.com/issues/21203>`_, `pr#17622 <https://github.com/ceph/ceph/pull/17622>`_, Kefu Chai)
-* pybind: dashboard usage graph getting bigger and bigger (`issue#20746 <http://tracker.ceph.com/issues/20746>`_, `pr#17486 <https://github.com/ceph/ceph/pull/17486>`_, Yixing Yan)
-* rbd: image-meta list does not return all entries (`issue#21179 <http://tracker.ceph.com/issues/21179>`_, `pr#17561 <https://github.com/ceph/ceph/pull/17561>`_, Jason Dillaman)
-* rbd: some generic options can not be passed by rbd-nbd (`issue#20426 <http://tracker.ceph.com/issues/20426>`_, `pr#17557 <https://github.com/ceph/ceph/pull/17557>`_, Pan Liu)
-* rbd: switch to new config option getter methods (`issue#20737 <http://tracker.ceph.com/issues/20737>`_, `pr#17464 <https://github.com/ceph/ceph/pull/17464>`_, Jason Dillaman)
-* rbd: TestMirroringWatcher.ModeUpdated: periodic failure due to injected message failures (`issue#21029 <http://tracker.ceph.com/issues/21029>`_, `pr#17465 <https://github.com/ceph/ceph/pull/17465>`_, Jason Dillaman)
-* rgw: bucket index sporadically reshards to 65521 shards (`issue#20934 <http://tracker.ceph.com/issues/20934>`_, `pr#17476 <https://github.com/ceph/ceph/pull/17476>`_, Aleksei Gutikov)
-* rgw: bytes_send and bytes_recv in the msg of usage show returning is 0 in master branch (`issue#19870 <http://tracker.ceph.com/issues/19870>`_, `pr#17444 <https://github.com/ceph/ceph/pull/17444>`_, Marcus Watts)
-* rgw: data encryption sometimes fails to follow AWS settings (`issue#21349 <http://tracker.ceph.com/issues/21349>`_, `pr#17642 <https://github.com/ceph/ceph/pull/17642>`_, hechuang)
-* rgw: memory leak in MetadataHandlers (`issue#21214 <http://tracker.ceph.com/issues/21214>`_, `pr#17570 <https://github.com/ceph/ceph/pull/17570>`_, Luo Kexue, Jos Collin)
-* rgw: multisite: objects encrypted with SSE-KMS are stored unencrypted in target zone (`issue#20668 <http://tracker.ceph.com/issues/20668>`_, `issue#20671 <http://tracker.ceph.com/issues/20671>`_, `pr#17446 <https://github.com/ceph/ceph/pull/17446>`_, Casey Bodley)
-* rgw: need to stream metadata full sync init (`issue#18079 <http://tracker.ceph.com/issues/18079>`_, `pr#17448 <https://github.com/ceph/ceph/pull/17448>`_, Yehuda Sadeh)
-* rgw: object copied from remote src acl permission become full-control issue (`issue#20658 <http://tracker.ceph.com/issues/20658>`_, `pr#17478 <https://github.com/ceph/ceph/pull/17478>`_, Enming Zhang)
-* rgw: put lifecycle configuration fails if Prefix is not set (`issue#19587 <http://tracker.ceph.com/issues/19587>`_, `issue#20872 <http://tracker.ceph.com/issues/20872>`_, `pr#17479 <https://github.com/ceph/ceph/pull/17479>`_, Shasha Lu, Abhishek Lekshmanan)
-* rgw: rgw_file:  incorrect lane lock behavior in evict_block() (`issue#21141 <http://tracker.ceph.com/issues/21141>`_, `pr#17485 <https://github.com/ceph/ceph/pull/17485>`_, Matt Benjamin)
-* rgw: send data-log list infinitely (`issue#20951 <http://tracker.ceph.com/issues/20951>`_, `pr#17445 <https://github.com/ceph/ceph/pull/17445>`_, fang.yuxiang)
-* rgw: shadow objects are sometimes not removed (`issue#20234 <http://tracker.ceph.com/issues/20234>`_, `pr#17555 <https://github.com/ceph/ceph/pull/17555>`_, Yehuda Sadeh)
-* rgw: usage of --inconsistent-index should require user confirmation and print a warning (`issue#20777 <http://tracker.ceph.com/issues/20777>`_, `pr#17488 <https://github.com/ceph/ceph/pull/17488>`_, Orit Wasserman)
-* tools: [cli] rename of non-existent image results in seg fault (`issue#21248 <http://tracker.ceph.com/issues/21248>`_, `pr#17556 <https://github.com/ceph/ceph/pull/17556>`_, Jason Dillaman)
-
-
-v12.2.0 Luminous
-================
-
-This is the first release of Luminous v12.2.x long term stable release
-series.  There have been major changes since Kraken (v11.2.z) and
-Jewel (v10.2.z), and the upgrade process is non-trivial. Please read
-these release notes carefully.
-
-Major Changes from Kraken
--------------------------
-
-- *General*:
-
-  * Ceph now has a simple, `built-in web-based dashboard
-    <../mgr/dashboard>`_ for monitoring cluster status.
-
-- *RADOS*:
-
-  * *BlueStore*:
-
-    - The new *BlueStore* backend for *ceph-osd* is now stable and the
-      new default for newly created OSDs.  BlueStore manages data
-      stored by each OSD by directly managing the physical HDDs or
-      SSDs without the use of an intervening file system like XFS.
-      This provides greater performance and features. See
-      :doc:`/rados/configuration/storage-devices` and
-      :doc:`/rados/configuration/bluestore-config-ref`.
-    - BlueStore supports `full data and metadata checksums
-      <../rados/configuration/bluestore-config-ref/#checksums>`_ of all
-      data stored by Ceph.
-    - BlueStore supports `inline compression
-      <../rados/configuration/bluestore-config-ref/#inline-compression>`_ using
-      zlib, snappy, or LZ4. (Ceph also supports zstd for `RGW compression
-      <../man/8/radosgw-admin/#options>`_ but zstd is not recommended for
-      BlueStore for performance reasons.)
-
-  * *Erasure coded* pools now have `full support for overwrites
-    <../rados/operations/erasure-code/#erasure-coding-with-overwrites>`_,
-    allowing them to be used with RBD and CephFS.
-
-  * *ceph-mgr*:
-
-    - There is a new daemon, *ceph-mgr*, which is a required part of
-      any Ceph deployment.  Although IO can continue when *ceph-mgr*
-      is down, metrics will not refresh and some metrics-related calls
-      (e.g., ``ceph df``) may block.  We recommend deploying several
-      instances of *ceph-mgr* for reliability.  See the notes on
-      `Upgrading`_ below.
-    - The *ceph-mgr* daemon includes a `REST-based management API
-      <../mgr/restful>`_. The API is still experimental and somewhat
-      limited but will form the basis for API-based management of Ceph
-      going forward.
-    - *ceph-mgr* also includes a `Prometheus exporter
-      <../mgr/prometheus>`_ plugin, which can provide Ceph
-      perfcounters to Prometheus.
-    - ceph-mgr now has a `Zabbix <../mgr/zabbix>`_ plugin. Using
-      zabbix_sender it sends trapper events to a Zabbix server
-      containing high-level information of the Ceph cluster. This
-      makes it easy to monitor a Ceph cluster's status and send out
-      notifications in case of a malfunction.
-
-  * The overall *scalability* of the cluster has improved. We have
-    successfully tested clusters with up to 10,000 OSDs.
-  * Each OSD can now have a `device class
-    <../rados/operations/crush-map/#device-classes>`_ associated with
-    it (e.g., `hdd` or `ssd`), allowing CRUSH rules to trivially map
-    data to a subset of devices in the system.  Manually writing CRUSH
-    rules or manual editing of the CRUSH is normally not required.
-  * There is a new `upmap <../rados/operations/upmap>`_ exception
-    mechanism that allows individual PGs to be moved around to achieve
-    a *perfect distribution* (this requires luminous clients).
-  * Each OSD now adjusts its default configuration based on whether the
-    backing device is an HDD or SSD.  Manual tuning generally not required.
-  * The prototype `mClock QoS queueing algorithm
-    <../rados/configuration/osd-config-ref/#qos-based-on-mclock>`_ is now
-    available.
-  * There is now a *backoff* mechanism that prevents OSDs from being
-    overloaded by requests to objects or PGs that are not currently able to
-    process IO.
-  * There is a simplified `OSD replacement process
-    <../rados/operations/add-or-rm-osds/#replacing-an-osd>`_ that is more
-    robust.
-  * You can query the supported features and (apparent) releases of
-    all connected daemons and clients with `ceph features
-    <../man/8/ceph#features>`_.
-  * You can configure the oldest Ceph client version you wish to allow to
-    connect to the cluster via ``ceph osd set-require-min-compat-client`` and
-    Ceph will prevent you from enabling features that will break compatibility
-    with those clients.
-  * Several `sleep` settings, include ``osd_recovery_sleep``,
-    ``osd_snap_trim_sleep``, and ``osd_scrub_sleep`` have been
-    reimplemented to work efficiently.  (These are used in some cases
-    to work around issues throttling background work.)
-  * Pools are now expected to be associated with the application using them.
-    Upon completing the upgrade to Luminous, the cluster will attempt to associate
-    existing pools to known applications (i.e. CephFS, RBD, and RGW). In-use pools
-    that are not associated to an application will generate a health warning. Any
-    unassociated pools can be manually associated using the new
-    ``ceph osd pool application enable`` command. For more details see
-    `associate pool to application <../rados/operations/pools/#associate-pool-to-application>`_
-    in the documentation.
-
-- *RGW*:
-
-  * RGW *metadata search* backed by ElasticSearch now supports end
-    user requests service via RGW itself, and also supports custom
-    metadata fields. A query language a set of RESTful APIs were
-    created for users to be able to search objects by their
-    metadata. New APIs that allow control of custom metadata fields
-    were also added.
-  * RGW now supports *dynamic bucket index sharding*. This has to be enabled via
-    the `rgw dyamic resharding` configurable. As the number of objects in a
-    bucket grows, RGW will automatically reshard the bucket index in response.
-    No user intervention or bucket size capacity planning is required.
-  * RGW introduces *server side encryption* of uploaded objects with
-    three options for the management of encryption keys: automatic
-    encryption (only recommended for test setups), customer provided
-    keys similar to Amazon SSE-C specification, and through the use of
-    an external key management service (Openstack Barbican) similar
-    to Amazon SSE-KMS specification. :doc:`/radosgw/encryption`
-  * RGW now has preliminary AWS-like bucket policy API support.  For
-    now, policy is a means to express a range of new authorization
-    concepts.  In the future it will be the foundation for additional
-    auth capabilities such as STS and group policy. :doc:`/radosgw/bucketpolicy`
-  * RGW has consolidated the several metadata index pools via the use of rados
-    namespaces. :doc:`/radosgw/pools`
-  * S3 Object Tagging API has been added; while APIs are
-    supported for GET/PUT/DELETE object tags and in PUT object
-    API, there is no support for tags on Policies & Lifecycle yet
-  * RGW multisite now supports for enabling or disabling sync at a
-    bucket level.
-
-- *RBD*:
-
-  * RBD now has full, stable support for *erasure coded pools* via the new
-    ``--data-pool`` option to ``rbd create``.
-  * RBD mirroring's rbd-mirror daemon is now highly available. We
-    recommend deploying several instances of rbd-mirror for
-    reliability.
-  * RBD mirroring's rbd-mirror daemon should utilize unique Ceph user
-    IDs per instance to support the new mirroring dashboard.
-  * The default 'rbd' pool is no longer created automatically during
-    cluster creation. Additionally, the name of the default pool used
-    by the rbd CLI when no pool is specified can be overridden via a
-    new ``rbd default pool = <pool name>`` configuration option.
-  * Initial support for deferred image deletion via new ``rbd
-    trash`` CLI commands. Images, even ones actively in-use by
-    clones, can be moved to the trash and deleted at a later time.
-  * New pool-level ``rbd mirror pool promote`` and ``rbd mirror pool
-    demote`` commands to batch promote/demote all mirrored images
-    within a pool.
-  * Mirroring now optionally supports a configurable replication delay
-    via the ``rbd mirroring replay delay = <seconds>`` configuration
-    option.
-  * Improved discard handling when the object map feature is enabled.
-  * rbd CLI ``import`` and ``copy`` commands now detect sparse and
-    preserve sparse regions.
-  * Images and Snapshots will now include a creation timestamp.
-  * Specifying user authorization capabilities for RBD clients has been
-    simplified. The general syntax for using RBD capability profiles is
-    "mon 'profile rbd' osd 'profile rbd[-read-only][ pool={pool-name}[, ...]]'".
-    For more details see :doc:`/rados/operations/user-management`
-    in the documentation.
-
-- *CephFS*:
-
-  * *Multiple active MDS daemons* is now considered stable.  The number
-    of active MDS servers may be adjusted up or down on an active CephFS file
-    system.
-  * CephFS *directory fragmentation* is now stable and enabled by
-    default on new filesystems.  To enable it on existing filesystems
-    use "ceph fs set <fs_name> allow_dirfrags".  Large or very busy
-    directories are sharded and (potentially) distributed across
-    multiple MDS daemons automatically.
-  * Directory subtrees can be explicitly pinned to specific MDS daemons in
-    cases where the automatic load balancing is not desired or effective.
-  * Client keys can now be created using the new ``ceph fs authorize`` command
-    to create keys with access to the given CephFS file system and all of its
-    data pools.
-  * When running 'df' on a CephFS filesystem comprising exactly one data pool,
-    the result now reflects the file storage space used and available in that
-    data pool (fuse client only).
-
-- *Miscellaneous*:
-
-  * Release packages are now being built for *Debian Stretch*.  Note
-    that QA is limited to CentOS and Ubuntu (xenial and trusty).  The
-    distributions we build for now include:
-
-    - CentOS 7 (x86_64 and aarch64)
-    - Debian 8 Jessie (x86_64)
-    - Debian 9 Stretch (x86_64)
-    - Ubuntu 16.04 Xenial (x86_64 and aarch64)
-    - Ubuntu 14.04 Trusty (x86_64)
-
-  * A first release of Ceph for FreeBSD is available which contains a full set
-    of features, other than Bluestore. It will run everything needed to build a
-    storage cluster. For clients, all access methods are available, albeit
-    CephFS is only accessible through a Fuse implementation. RBD images can be
-    mounted on FreeBSD systems through rbd-ggate
-    Ceph versions are released through the regular FreeBSD ports and packages
-    system. The most current version is available as: net/ceph-devel. Once
-    Luminous goes into official release, this version will be available as
-    net/ceph. Future development releases will be available via net/ceph-devel
-    More details about this port are in: `README.FreeBSD <https://github.com/ceph/ceph/blob/master/README.FreeBSD>`_
-
-  * *CLI changes*:
-
-    - The ``ceph -s`` or ``ceph status`` command has a fresh look.
-    - ``ceph mgr metadata`` will dump metadata associated with each mgr
-      daemon.
-    - ``ceph versions`` or ``ceph {osd,mds,mon,mgr} versions``
-      summarize versions of running daemons.
-    - ``ceph {osd,mds,mon,mgr} count-metadata <property>`` similarly
-      tabulates any other daemon metadata visible via the ``ceph
-      {osd,mds,mon,mgr} metadata`` commands.
-    - ``ceph features`` summarizes features and releases of connected
-      clients and daemons.
-    - ``ceph osd require-osd-release <release>`` replaces the old
-      ``require_RELEASE_osds`` flags.
-    - ``ceph osd pg-upmap``, ``ceph osd rm-pg-upmap``, ``ceph osd
-      pg-upmap-items``, ``ceph osd rm-pg-upmap-items`` can explicitly
-      manage `upmap` items (see :doc:`/rados/operations/upmap`).
-    - ``ceph osd getcrushmap`` returns a crush map version number on
-      stderr, and ``ceph osd setcrushmap [version]`` will only inject
-      an updated crush map if the version matches.  This allows crush
-      maps to be updated offline and then reinjected into the cluster
-      without fear of clobbering racing changes (e.g., by newly added
-      osds or changes by other administrators).
-    - ``ceph osd create`` has been replaced by ``ceph osd new``.  This
-      should be hidden from most users by user-facing tools like
-      `ceph-disk`.
-    - ``ceph osd destroy`` will mark an OSD destroyed and remove its
-      cephx and lockbox keys.  However, the OSD id and CRUSH map entry
-      will remain in place, allowing the id to be reused by a
-      replacement device with minimal data rebalancing.
-    - ``ceph osd purge`` will remove all traces of an OSD from the
-      cluster, including its cephx encryption keys, dm-crypt lockbox
-      keys, OSD id, and crush map entry.
-    - ``ceph osd ls-tree <name>`` will output a list of OSD ids under
-      the given CRUSH name (like a host or rack name).  This is useful
-      for applying changes to entire subtrees.  For example, ``ceph
-      osd down `ceph osd ls-tree rack1```.
-    - ``ceph osd {add,rm}-{noout,noin,nodown,noup}`` allow the
-      `noout`, `noin`, `nodown`, and `noup` flags to be applied to
-      specific OSDs.
-    - ``ceph osd safe-to-destroy <osd(s)>`` will report whether it is safe to
-      remove or destroy OSD(s) without reducing data durability or redundancy.
-    - ``ceph osd ok-to-stop <osd(s)>`` will report whether it is okay to stop
-      OSD(s) without immediately compromising availability (i.e., all PGs
-      should remain active but may be degraded).
-    - ``ceph log last [n]`` will output the last *n* lines of the cluster
-      log.
-    - ``ceph mgr dump`` will dump the MgrMap, including the currently active
-      ceph-mgr daemon and any standbys.
-    - ``ceph mgr module ls`` will list active ceph-mgr modules.
-    - ``ceph mgr module {enable,disable} <name>`` will enable or
-      disable the named mgr module.  The module must be present in the
-      configured `mgr_module_path` on the host(s) where `ceph-mgr` is
-      running.
-    - ``ceph osd crush ls <node>`` will list items (OSDs or other CRUSH nodes)
-      directly beneath a given CRUSH node.
-    - ``ceph osd crush swap-bucket <src> <dest>`` will swap the
-      contents of two CRUSH buckets in the hierarchy while preserving
-      the buckets' ids.  This allows an entire subtree of devices to
-      be replaced (e.g., to replace an entire host of FileStore OSDs
-      with newly-imaged BlueStore OSDs) without disrupting the
-      distribution of data across neighboring devices.
-    - ``ceph osd set-require-min-compat-client <release>`` configures
-      the oldest client release the cluster is required to support.
-      Other changes, like CRUSH tunables, will fail with an error if
-      they would violate this setting.  Changing this setting also
-      fails if clients older than the specified release are currently
-      connected to the cluster.
-    - ``ceph config-key dump`` dumps config-key entries and their
-      contents.  (The existing ``ceph config-key list`` only dumps the key
-      names, not the values.)
-    - ``ceph config-key list`` is deprecated in favor of ``ceph config-key ls``.
-    - ``ceph config-key put`` is deprecated in favor of ``ceph config-key set``.
-    - ``ceph auth list`` is deprecated in favor of ``ceph auth ls``.
-    - ``ceph osd crush rule list`` is deprecated in favor of ``ceph osd crush rule ls``.
-    - ``ceph osd set-{full,nearfull,backfillfull}-ratio`` sets the
-      cluster-wide ratio for various full thresholds (when the cluster
-      refuses IO, when the cluster warns about being close to full,
-      when an OSD will defer rebalancing a PG to itself,
-      respectively).
-    - ``ceph osd reweightn`` will specify the `reweight` values for
-      multiple OSDs in a single command.  This is equivalent to a series of
-      ``ceph osd reweight`` commands.
-    - ``ceph osd crush {set,rm}-device-class`` manage the new
-      CRUSH *device class* feature. Note that manually creating or deleting
-      a device class name is generally not necessary as it will be smart
-      enough to be self-managed. ``ceph osd crush class ls`` and
-      ``ceph osd crush class ls-osd`` will output all existing device classes
-      and a list of OSD ids under the given device class respectively.
-    - ``ceph osd crush rule create-replicated`` replaces the old
-      ``ceph osd crush rule create-simple`` command to create a CRUSH
-      rule for a replicated pool.  Notably it takes a `class` argument
-      for the *device class* the rule should target (e.g., `ssd` or
-      `hdd`).
-    - ``ceph mon feature ls`` will list monitor features recorded in the
-      MonMap.  ``ceph mon feature set`` will set an optional feature (none of
-      these exist yet).
-    - ``ceph tell <daemon> help`` will now return a usage summary.
-    - ``ceph fs authorize`` creates a new client key with caps automatically
-      set to access the given CephFS file system.
-    - The ``ceph health`` structured output (JSON or XML) no longer contains
-      'timechecks' section describing the time sync status.  This
-      information is now available via the 'ceph time-sync-status'
-      command.
-    - Certain extra fields in the ``ceph health`` structured output that
-      used to appear if the mons were low on disk space (which duplicated
-      the information in the normal health warning messages) are now gone.
-    - The ``ceph -w`` output no longer contains audit log entries by default.
-      Add a ``--watch-channel=audit`` or ``--watch-channel=*`` to see them.
-    - New "ceph -w" behavior - the "ceph -w" output no longer contains
-      I/O rates, available space, pg info, etc. because these are no
-      longer logged to the central log (which is what ``ceph -w``
-      shows). The same information can be obtained by running ``ceph pg
-      stat``; alternatively, I/O rates per pool can be determined using
-      ``ceph osd pool stats``. Although these commands do not
-      self-update like ``ceph -w`` did, they do have the ability to
-      return formatted output by providing a ``--format=<format>``
-      option.
-    - Added new commands ``pg force-recovery`` and
-      ``pg-force-backfill``. Use them to boost recovery or backfill
-      priority of specified pgs, so they're recovered/backfilled
-      before any other. Note that these commands don't interrupt
-      ongoing recovery/backfill, but merely queue specified pgs before
-      others so they're recovered/backfilled as soon as possible. New
-      commands ``pg cancel-force-recovery`` and ``pg
-      cancel-force-backfill`` restore default recovery/backfill
-      priority of previously forced pgs.
-
-
-Major Changes from Jewel
-------------------------
-
-- *RADOS*:
-
-  * We now default to the AsyncMessenger (``ms type = async``) instead
-    of the legacy SimpleMessenger.  The most noticeable difference is
-    that we now use a fixed sized thread pool for network connections
-    (instead of two threads per socket with SimpleMessenger).
-  * Some OSD failures are now detected almost immediately, whereas
-    previously the heartbeat timeout (which defaults to 20 seconds)
-    had to expire.  This prevents IO from blocking for an extended
-    period for failures where the host remains up but the ceph-osd
-    process is no longer running.
-  * The size of encoded OSDMaps has been reduced.
-  * The OSDs now quiesce scrubbing when recovery or rebalancing is in progress.
-
-- *RGW*:
-
-  * RGW now supports the S3 multipart object copy-part API.
-  * It is possible now to reshard an existing bucket offline. Offline
-    bucket resharding currently requires that all IO (especially
-    writes) to the specific bucket is quiesced.  (For automatic online
-    resharding, see the new feature in Luminous above.)
-  * RGW now supports data compression for objects.
-  * Civetweb version has been upgraded to 1.8
-  * The Swift static website API is now supported (S3 support has been added
-    previously).
-  * S3 bucket lifecycle API has been added. Note that currently it only supports
-    object expiration.
-  * Support for custom search filters has been added to the LDAP auth
-    implementation.
-  * Support for NFS version 3 has been added to the RGW NFS gateway.
-  * A Python binding has been created for librgw.
-
-- *RBD*:
-
-  * The rbd-mirror daemon now supports replicating dynamic image
-    feature updates and image metadata key/value pairs from the
-    primary image to the non-primary image.
-  * The number of image snapshots can be optionally restricted to a
-    configurable maximum.
-  * The rbd Python API now supports asynchronous IO operations.
-
-- *CephFS*:
-
-  * libcephfs function definitions have been changed to enable proper
-    uid/gid control.  The library version has been increased to reflect the
-    interface change.
-  * Standby replay MDS daemons now consume less memory on workloads
-    doing deletions.
-  * Scrub now repairs backtrace, and populates `damage ls` with
-    discovered errors.
-  * A new `pg_files` subcommand to `cephfs-data-scan` can identify
-    files affected by a damaged or lost RADOS PG.
-  * The false-positive "failing to respond to cache pressure" warnings have
-    been fixed.
-
-
-Upgrade from Jewel or Kraken
-----------------------------
-.. _Upgrading:
-
-#. Ensure that the ``sortbitwise`` flag is enabled::
-
-     # ceph osd set sortbitwise
-
-#. Make sure your cluster is stable and healthy (no down or
-   recovering OSDs).  (Optional, but recommended.)
-
-#. Do not create any new erasure-code pools while upgrading the monitors.
-
-#. You can monitor the progress of your upgrade at each stage with the
-   ``ceph versions`` command, which will tell you what ceph version is
-   running for each type of daemon.
-
-#. Set the ``noout`` flag for the duration of the upgrade. (Optional
-   but recommended.)::
-
-     # ceph osd set noout
-
-#. Verify that all RBD client users have sufficient caps to blacklist
-   other client users. RBD client users with only ``"allow r"``
-   monitor caps should be updated as follows::
-
-     # ceph auth caps client.<ID> mon 'allow r, allow command "osd blacklist"' osd '<existing OSD caps for user>'
-
-#. Upgrade monitors by installing the new packages and restarting the
-   monitor daemons.  Note that, unlike prior releases, the ceph-mon
-   daemons *must* be upgraded first::
-
-     # systemctl restart ceph-mon.target
-
-   Verify the monitor upgrade is complete once all monitors are up by
-   looking for the ``luminous`` feature string in the mon map.  For
-   example::
-
-     # ceph mon feature ls
-
-   should include `luminous` under persistent features::
-
-     on current monmap (epoch NNN)
-        persistent: [kraken,luminous]
-        required: [kraken,luminous]
-
-#. Add or restart ``ceph-mgr`` daemons.  If you are upgrading from
-   kraken, upgrade packages and restart ceph-mgr daemons with::
-
-     # systemctl restart ceph-mgr.target
-
-   If you are upgrading from kraken, you may already have ceph-mgr
-   daemons deployed.  If not, or if you are upgrading from jewel, you
-   can deploy new daemons with tools like ceph-deploy or ceph-ansible.
-   For example::
-
-     # ceph-deploy mgr create HOST
-
-   Verify the ceph-mgr daemons are running by checking ``ceph -s``::
-
-     # ceph -s
-
-     ...
-       services:
-        mon: 3 daemons, quorum foo,bar,baz
-        mgr: foo(active), standbys: bar, baz
-     ...
-
-#. Upgrade all OSDs by installing the new packages and restarting the
-   ceph-osd daemons on all hosts::
-
-     # systemctl restart ceph-osd.target
-
-   You can monitor the progress of the OSD upgrades with the new
-   ``ceph versions`` or ``ceph osd versions`` command::
-
-     # ceph osd versions
-     {
-        "ceph version 12.2.0 (...) luminous (stable)": 12,
-        "ceph version 10.2.6 (...)": 3,
-     }
-
-#. Upgrade all CephFS daemons by upgrading packages and restarting
-   daemons on all hosts::
-
-     # systemctl restart ceph-mds.target
-
-#. Upgrade all radosgw daemons by upgrading packages and restarting
-   daemons on all hosts::
-
-     # systemctl restart radosgw.target
-
-#. Complete the upgrade by disallowing pre-luminous OSDs and enabling
-   all new Luminous-only functionality::
-
-     # ceph osd require-osd-release luminous
-
-   If you set ``noout`` at the beginning, be sure to clear it with::
-
-     # ceph osd unset noout
-
-#. Verify the cluster is healthy with ``ceph health``.
-
-
-Upgrading from pre-Jewel releases (like Hammer)
------------------------------------------------
-
-You *must* first upgrade to Jewel (10.2.z) before attempting an
-upgrade to Luminous.
-
-Upgrade compatibility notes, Jewel to Kraken
---------------------------------------------
-
-These changes occurred between the Jewel and Kraken releases and will affect
-upgrades from Jewel to Luminous.
-
-* The ``osd crush location`` config option is no longer supported.  Please
-  update your ceph.conf to use the ``crush location`` option instead.  Be sure
-  to update your config file to avoid any movement of OSDs from your customized
-  location back to the default one.
-
-* The OSDs now avoid starting new scrubs while recovery is in progress.  To
-  revert to the old behavior (and do not let recovery activity affect the
-  scrub scheduling) you can set the following option::
-
-    osd scrub during recovery = true
-
-* The list of monitor hosts/addresses for building the monmap can now be
-  obtained from DNS SRV records. The service name used in when querying the DNS
-  is defined in the "mon_dns_srv_name" config option, which defaults to
-  "ceph-mon".
-
-* The 'osd class load list' config option is a list of object class names that
-  the OSD is permitted to load (or '*' for all classes). By default it
-  contains all existing in-tree classes for backwards compatibility.
-
-* The 'osd class default list' config option is a list of object class
-  names (or '*' for all classes) that clients may invoke having only
-  the '*', 'x', 'class-read', or 'class-write' capabilities. By
-  default it contains all existing in-tree classes for backwards
-  compatibility. Invoking classes not listed in 'osd class default
-  list' requires a capability naming the class (e.g. 'allow class
-  foo').
-
-* The 'rgw rest getusage op compat' config option allows you to dump
-  (or not dump) the description of user stats in the S3 GetUsage
-  API. This option defaults to false.  If the value is true, the
-  response data for GetUsage looks like::
-
-    "stats": {
-                "TotalBytes": 516,
-                "TotalBytesRounded": 1024,
-                "TotalEntries": 1
-             }
-
-  If the value is false, the response for GetUsage looks as it did before::
-
-    {
-         516,
-         1024,
-         1
-    }
-
-* The 'osd out ...' and 'osd in ...' commands now preserve the OSD
-  weight.  That is, after marking an OSD out and then in, the weight
-  will be the same as before (instead of being reset to 1.0).
-  Previously the mons would only preserve the weight if the mon
-  automatically marked an OSD out and then in, but not when an admin
-  did so explicitly.
-
-* The 'ceph osd perf' command will display 'commit_latency(ms)' and
-  'apply_latency(ms)'. Previously, the names of these two columns were
-  'fs_commit_latency(ms)' and 'fs_apply_latency(ms)'. We removed the
-  prefix 'fs\_' because the values are not filestore-specific.
-
-* Monitors will no longer allow pools to be removed by default.  The
-  setting mon_allow_pool_delete has to be set to true (defaults to
-  false) before they allow pools to be removed.  This is a additional
-  safeguard against pools being removed by accident.
-
-* If you have manually specified the monitor user rocksdb via the
-  ``mon keyvaluedb = rocksdb`` option, you will need to manually add a
-  file to the mon data directory to preserve this option::
-
-     echo rocksdb > /var/lib/ceph/mon/ceph-`hostname`/kv_backend
-
-  New monitors will now use rocksdb by default, but if that file is
-  not present, existing monitors will use leveldb.  The ``mon
-  keyvaluedb`` option now only affects the backend chosen when a
-  monitor is created.
-
-* The 'osd crush initial weight' option allows you to specify a CRUSH
-  weight for a newly added OSD.  Previously a value of 0 (the default)
-  meant that we should use the size of the OSD's store to weight the
-  new OSD.  Now, a value of 0 means it should have a weight of 0, and
-  a negative value (the new default) means we should automatically
-  weight the OSD based on its size.  If your configuration file
-  explicitly specifies a value of 0 for this option you will need to
-  change it to a negative value (e.g., -1) to preserve the current
-  behavior.
-
-* The static libraries are no longer included by the debian
-  development packages (lib*-dev) as it is not required per debian
-  packaging policy.  The shared (.so) versions are packaged as before.
-
-* The libtool pseudo-libraries (.la files) are no longer included by
-  the debian development packages (lib*-dev) as they are not required
-  per https://wiki.debian.org/ReleaseGoals/LAFileRemoval and
-  https://www.debian.org/doc/manuals/maint-guide/advanced.en.html.
-
-* The jerasure and shec plugins can now detect SIMD instruction at
-  runtime and no longer need to be explicitly configured for different
-  processors.  The following plugins are now deprecated:
-  jerasure_generic, jerasure_sse3, jerasure_sse4, jerasure_neon,
-  shec_generic, shec_sse3, shec_sse4, and shec_neon. If you use any of
-  these plugins directly you will see a warning in the mon log file.
-  Please switch to using just 'jerasure' or 'shec'.
-
-* The librados omap get_keys and get_vals operations include a start key and a
-  limit on the number of keys to return.  The OSD now imposes a configurable
-  limit on the number of keys and number of total bytes it will respond with,
-  which means that a librados user might get fewer keys than they asked for.
-  This is necessary to prevent careless users from requesting an unreasonable
-  amount of data from the cluster in a single operation.  The new limits are
-  configured with ``osd_max_omap_entries_per_request``, defaulting to 131,072, and
-  ``osd_max_omap_bytes_per_request``, defaulting to 4MB.
-
-* Calculation of recovery priorities has been updated.
-  This could lead to unintuitive recovery prioritization
-  during cluster upgrade. In case of such recovery, OSDs
-  in old version would operate on different priority ranges
-  than new ones. Once upgraded, cluster will operate on
-  consistent values.
-
-
-Upgrade compatibility notes, Kraken to Luminous
------------------------------------------------
-
-* The configuration option ``osd pool erasure code stripe width`` has
-  been replaced by ``osd pool erasure code stripe unit``, and given
-  the ability to be overridden by the erasure code profile setting
-  ``stripe_unit``. For more details see
-  :ref:`erasure-code-profiles`.
-
-* rbd and cephfs can use erasure coding with bluestore. This may be
-  enabled by setting ``allow_ec_overwrites`` to ``true`` for a pool. Since
-  this relies on bluestore's checksumming to do deep scrubbing,
-  enabling this on a pool stored on filestore is not allowed.
-
-* The ``rados df`` JSON output now prints numeric values as numbers instead of
-  strings.
-
-* The ``mon_osd_max_op_age`` option has been renamed to
-  ``mon_osd_warn_op_age`` (default: 32 seconds), to indicate we
-  generate a warning at this age.  There is also a new
-  ``mon_osd_err_op_age_ratio`` that is a expressed as a multiple of
-  ``mon_osd_warn_op_age`` (default: 128, for roughly 60 minutes) to
-  control when an error is generated.
-
-* The default maximum size for a single RADOS object has been reduced from
-  100GB to 128MB.  The 100GB limit was completely impractical in practice
-  while the 128MB limit is a bit high but not unreasonable.  If you have an
-  application written directly to librados that is using objects larger than
-  128MB you may need to adjust ``osd_max_object_size``.
-
-* The semantics of the ``rados ls`` and librados object listing
-  operations have always been a bit confusing in that "whiteout"
-  objects (which logically don't exist and will return ENOENT if you
-  try to access them) are included in the results.  Previously
-  whiteouts only occurred in cache tier pools.  In luminous, logically
-  deleted but snapshotted objects now result in a whiteout object, and
-  as a result they will appear in ``rados ls`` results, even though
-  trying to read such an object will result in ENOENT.  The ``rados
-  listsnaps`` operation can be used in such a case to enumerate which
-  snapshots are present.
-  This may seem a bit strange, but is less strange than having a
-  deleted-but-snapshotted object not appear at all and be completely
-  hidden from librados's ability to enumerate objects.  Future
-  versions of Ceph will likely include an alternative object
-  enumeration interface that makes it more natural and efficient to
-  enumerate all objects along with their snapshot and clone metadata.
-
-* The deprecated ``crush_ruleset`` property has finally been removed;
-  please use  ``crush_rule`` instead for the ``osd pool get ...`` and ``osd
-  pool set ...`` commands.
-
-* The ``osd pool default crush replicated ruleset`` option has been
-  removed and replaced by the ``osd pool default crush rule`` option.
-  By default it is -1, which means the mon will pick the first type
-  replicated rule in the CRUSH map for replicated pools.  Erasure
-  coded pools have rules that are automatically created for them if
-  they are not specified at pool creation time.
-
-* We no longer test the FileStore ceph-osd backend in combination with
-  btrfs.  We recommend against using btrfs.  If you are using
-  btrfs-based OSDs and want to upgrade to luminous you will need to
-  add the following to your ceph.conf::
-
-    enable experimental unrecoverable data corrupting features = btrfs
-
-  The code is mature and unlikely to change, but we are only
-  continuing to test the Jewel stable branch against btrfs.  We
-  recommend moving these OSDs to FileStore with XFS or BlueStore.
-* The ``ruleset-*`` properties for the erasure code profiles have been
-  renamed to ``crush-*`` to move away from the obsolete 'ruleset'
-  term and to be more clear about their purpose.  There is also a new
-  optional ``crush-device-class`` property to specify a CRUSH device
-  class to use for the erasure coded pool.  Existing erasure code
-  profiles will be converted automatically when upgrade completes
-  (when the ``ceph osd require-osd-release luminous`` command is run)
-  but any provisioning tools that create erasure coded pools may need
-  to be updated.
-* The structure of the XML output for ``osd crush tree`` has changed
-  slightly to better match the ``osd tree`` output.  The top level
-  structure is now ``nodes`` instead of ``crush_map_roots``.
-* When assigning a network to the public network and not to
-  the cluster network the network specification of the public
-  network will be used for the cluster network as well.
-  In older versions this would lead to cluster services
-  being bound to 0.0.0.0:<port>, thus making the
-  cluster service even more publicly available than the
-  public services. When only specifying a cluster network it
-  will still result in the public services binding to 0.0.0.0.
-
-* In previous versions, if a client sent an op to the wrong OSD, the OSD
-  would reply with ENXIO.  The rationale here is that the client or OSD is
-  clearly buggy and we want to surface the error as clearly as possible.
-  We now only send the ENXIO reply if the osd_enxio_on_misdirected_op option
-  is enabled (it's off by default).  This means that a VM using librbd that
-  previously would have gotten an EIO and gone read-only will now see a
-  blocked/hung IO instead.
-
-* The "journaler allow split entries" config setting has been removed.
-
-* The 'mon_warn_osd_usage_min_max_delta' config option has been
-  removed and the associated health warning has been disabled because
-  it does not address clusters undergoing recovery or CRUSH rules that do
-  not target all devices in the cluster.
-
-* Added new configuration "public bind addr" to support dynamic
-  environments like Kubernetes. When set the Ceph MON daemon could
-  bind locally to an IP address and advertise a different IP address
-  ``public addr`` on the network.
-
-* The crush ``choose_args`` encoding has been changed to make it
-  architecture-independent. If you deployed Luminous dev releases or
-  12.1.0 rc release and made use of the CRUSH choose_args feature, you
-  need to remove all choose_args mappings from your CRUSH map before
-  starting the upgrade.
-
-
-- *librados*:
-
-  * Some variants of the omap_get_keys and omap_get_vals librados
-    functions have been deprecated in favor of omap_get_vals2 and
-    omap_get_keys2.  The new methods include an output argument
-    indicating whether there are additional keys left to fetch.
-    Previously this had to be inferred from the requested key count vs
-    the number of keys returned, but this breaks with new OSD-side
-    limits on the number of keys or bytes that can be returned by a
-    single omap request.  These limits were introduced by kraken but
-    are effectively disabled by default (by setting a very large limit
-    of 1 GB) because users of the newly deprecated interface cannot
-    tell whether they should fetch more keys or not.  In the case of
-    the standalone calls in the C++ interface
-    (IoCtx::get_omap_{keys,vals}), librados has been updated to loop on
-    the client side to provide a correct result via multiple calls to
-    the OSD.  In the case of the methods used for building
-    multi-operation transactions, however, client-side looping is not
-    practical, and the methods have been deprecated.  Note that use of
-    either the IoCtx methods on older librados versions or the
-    deprecated methods on any version of librados will lead to
-    incomplete results if/when the new OSD limits are enabled.
-
-  * The original librados rados_objects_list_open (C) and objects_begin
-    (C++) object listing API, deprecated in Hammer, has finally been
-    removed.  Users of this interface must update their software to use
-    either the rados_nobjects_list_open (C) and nobjects_begin (C++) API or
-    the new rados_object_list_begin (C) and object_list_begin (C++) API
-    before updating the client-side librados library to Luminous.
-    Object enumeration (via any API) with the latest librados version
-    and pre-Hammer OSDs is no longer supported.  Note that no in-tree
-    Ceph services rely on object enumeration via the deprecated APIs, so
-    only external librados users might be affected.
-    The newest (and recommended) rados_object_list_begin (C) and
-    object_list_begin (C++) API is only usable on clusters with the
-    SORTBITWISE flag enabled (Jewel and later).  (Note that this flag is
-    required to be set before upgrading beyond Jewel.)
-
-- *CephFS*:
-
-  * When configuring ceph-fuse mounts in /etc/fstab, a new syntax is
-    available that uses "ceph.<arg>=<val>" in the options column, instead
-    of putting configuration in the device column.  The old style syntax
-    still works.  See the documentation page "Mount CephFS in your
-    file systems table" for details.
-  * CephFS clients without the 'p' flag in their authentication capability
-    string will no longer be able to set quotas or any layout fields.  This
-    flag previously only restricted modification of the pool and namespace
-    fields in layouts.
-  * CephFS will generate a health warning if you have fewer standby daemons
-    than it thinks you wanted.  By default this will be 1 if you ever had
-    a standby, and 0 if you did not.  You can customize this using
-    ``ceph fs set <fs> standby_count_wanted <number>``.  Setting it
-    to zero will effectively disable the health check.
-  * The "ceph mds tell ..." command has been removed.  It is superseded
-    by "ceph tell mds.<id> ..."
-  * The ``apply`` mode of cephfs-journal-tool has been removed
-
-
-Other Notable Changes
----------------------
-* async: Fixed compilation error when enable -DWITH_DPDK (`pr#12660 <https://github.com/ceph/ceph/pull/12660>`_, Pan Liu)
-* async: fixed coredump when enable dpdk (`pr#12854 <https://github.com/ceph/ceph/pull/12854>`_, Pan Liu)
-* async: fixed the error "Cause: Cannot create lock on '/var/run/.rte_c… (`pr#12860 <https://github.com/ceph/ceph/pull/12860>`_, Pan Liu)
-* bluestore: avoid unnecessary copy with coll_t (`pr#12576 <https://github.com/ceph/ceph/pull/12576>`_, Yunchuan Wen)
-* bluestore: BitAllocator: delete useless codes (`pr#13619 <https://github.com/ceph/ceph/pull/13619>`_, Jie Wang)
-* bluestore: bluestore/BlueFS: pass string as const ref (`pr#16600 <https://github.com/ceph/ceph/pull/16600>`_, dingdangzhang)
-* bluestore: bluestore, NVMEDEVICE: Specify the max io completion in conf (`pr#13799 <https://github.com/ceph/ceph/pull/13799>`_, optimistyzy)
-* bluestore: bluestore/NVMEDEVICE: update SPDK to version 17.03 (`pr#14585 <https://github.com/ceph/ceph/pull/14585>`_, optimistyzy)
-* bluestore: bluestore, NVMeDevice: use task' own lock for (random) read (`pr#14094 <https://github.com/ceph/ceph/pull/14094>`_, optimistyzy)
-* bluestore,build/ops,performance: os/bluestore: enable SSE-assisted CRC32 calculations in RocksDB (`pr#13741 <https://github.com/ceph/ceph/pull/13741>`_, Radoslaw Zarzynski)
-* bluestore: ceph-disk: add --filestore argument, default to --bluestore (`pr#15437 <https://github.com/ceph/ceph/pull/15437>`_, Loic Dachary, Sage Weil)
-* bluestore: common/config: set rocksdb_cache_size to OPT_U64 (`pr#13995 <https://github.com/ceph/ceph/pull/13995>`_, liuhongtong)
-* bluestore: common/options: make "blue{fs,store}_allocator" LEVEL_DEV (`issue#20660 <http://tracker.ceph.com/issues/20660>`_, `pr#16645 <https://github.com/ceph/ceph/pull/16645>`_, Kefu Chai)
-* bluestore,common,performance: common/Finisher: Using queue(list<context\*>) instead queue(context\*) (`pr#8942 <https://github.com/ceph/ceph/pull/8942>`_, Jianpeng Ma)
-* bluestore,common,performance: isa-l: update isa-l to v2.18 (`pr#15895 <https://github.com/ceph/ceph/pull/15895>`_, Ganesh Mahalingam, Tushar Gohad)
-* bluestore,core: os/bluestore: fix statfs to not include DB partition in free space (`issue#18599 <http://tracker.ceph.com/issues/18599>`_, `pr#13140 <https://github.com/ceph/ceph/pull/13140>`_, Sage Weil)
-* bluestore,core: os/bluestore: fix warning (`pr#15435 <https://github.com/ceph/ceph/pull/15435>`_, Sage Weil)
-* bluestore,core: os/bluestore: improve mempool usage (`pr#15402 <https://github.com/ceph/ceph/pull/15402>`_, Sage Weil)
-* bluestore,core: os/bluestore: write "mkfs_done" into disk only if we pass fsck() tests (`pr#15238 <https://github.com/ceph/ceph/pull/15238>`_, xie xingguo)
-* bluestore,core: osd/OSDMap: should update input param if osd dne (`pr#14863 <https://github.com/ceph/ceph/pull/14863>`_, Kefu Chai)
-* bluestore,core: os: remove experimental status for BlueStore (`pr#15177 <https://github.com/ceph/ceph/pull/15177>`_, Sage Weil)
-* bluestore: fixed compilation error when enable spdk (`pr#12672 <https://github.com/ceph/ceph/pull/12672>`_, Pan Liu)
-* bluestore: include/intarith: templatize ctz/clz/cbits helpers (`pr#14862 <https://github.com/ceph/ceph/pull/14862>`_, Kefu Chai)
-* bluestore: luminous: os/bluestore: compensate for bad freelistmanager size/blocks metadata (`issue#21089 <http://tracker.ceph.com/issues/21089>`_, `pr#17273 <https://github.com/ceph/ceph/pull/17273>`_, Sage Weil)
-* bluestore: NVMEDevice: add the spdk core mask check (`pr#14068 <https://github.com/ceph/ceph/pull/14068>`_, optimistyzy)
-* bluestore: NVMEDevice: cleanup the logic in data_buf_next_sge (`pr#13056 <https://github.com/ceph/ceph/pull/13056>`_, optimistyzy)
-* bluestore: NVMeDevice: fix the core id for rte_remote_launch (`pr#13896 <https://github.com/ceph/ceph/pull/13896>`_, optimistyzy)
-* bluestore: NVMEDevice: fix bug in data_buf_next_sge (`pr#12812 <https://github.com/ceph/ceph/pull/12812>`_, optimistyzy)
-* bluestore: NVMEDevice: minor error for get slave core (`pr#14012 <https://github.com/ceph/ceph/pull/14012>`_, Ziye Yang)
-* bluestore: NVMEDevice: optimize sector_size usage (`pr#12780 <https://github.com/ceph/ceph/pull/12780>`_, optimistyzy)
-* bluestore: NVMEDevice: remove unnessary dpdk header file (`pr#14650 <https://github.com/ceph/ceph/pull/14650>`_, optimistyzy)
-* bluestore: NVMEDevice: fix the I/O logic for read (`pr#13971 <https://github.com/ceph/ceph/pull/13971>`_, optimistyzy)
-* bluestore: os/bluestore: add a debug option to bypass block device writes for bl… (`pr#12464 <https://github.com/ceph/ceph/pull/12464>`_, Igor Fedotov)
-* bluestore: os/bluestore: Add bluestore pextent vector to mempool (`pr#12946 <https://github.com/ceph/ceph/pull/12946>`_, Igor Fedotvo, Igor Fedotov)
-* bluestore: os/bluestore: add flush_store_cache cmd (`pr#13428 <https://github.com/ceph/ceph/pull/13428>`_, xie xingguo)
-* bluestore: os/bluestore: add more perf_counters to BlueStore (`pr#13274 <https://github.com/ceph/ceph/pull/13274>`_, Igor Fedotov)
-* bluestore: os/bluestore: add new garbage collector (`pr#12144 <https://github.com/ceph/ceph/pull/12144>`_, Igor Fedotov)
-* bluestore: os/bluestore: add perf variable for throttle info in bluestore (`pr#12583 <https://github.com/ceph/ceph/pull/12583>`_, Pan Liu)
-* bluestore: os/bluestore: add "_" prefix for internal methods (`pr#13409 <https://github.com/ceph/ceph/pull/13409>`_, xie xingguo)
-* bluestore: os/bluestore: align reclaim size to bluefs_alloc_size (`pr#14744 <https://github.com/ceph/ceph/pull/14744>`_, Haomai Wang)
-* bluestore: os/bluestore/Allocator: drop unused return value in release function (`pr#13913 <https://github.com/ceph/ceph/pull/13913>`_, wangzhengyong)
-* bluestore: os/bluestore: allow multiple DeferredBatches in flight at once (`issue#20295 <http://tracker.ceph.com/issues/20295>`_, `pr#16769 <https://github.com/ceph/ceph/pull/16769>`_, Nathan Cutler, Sage Weil)
-* bluestore: os/bluestore: allow multiple SPDK BlueStore OSD instances (`issue#16966 <http://tracker.ceph.com/issues/16966>`_, `pr#12604 <https://github.com/ceph/ceph/pull/12604>`_, Orlando Moreno)
-* bluestore: os/bluestore: assert blob map returns success (`pr#14473 <https://github.com/ceph/ceph/pull/14473>`_, shiqi)
-* bluestore: os/bluestore: avoid nullptr in bluestore_extent_ref_map_t::bound_encode (`pr#14073 <https://github.com/ceph/ceph/pull/14073>`_, Sage Weil)
-* bluestore: os/bluestore: avoid unnecessary memory copy, use variable reference in BlockDevice::Open (`pr#12942 <https://github.com/ceph/ceph/pull/12942>`_, liuchang0812)
-* bluestore: os/bluestore: better debug output on unsharing blobs (`issue#20227 <http://tracker.ceph.com/issues/20227>`_, `pr#15746 <https://github.com/ceph/ceph/pull/15746>`_, Sage Weil)
-* bluestore: os/bluestore/BitAllocator: fix bug of checking required blocks (`pr#13470 <https://github.com/ceph/ceph/pull/13470>`_, wangzhengyong)
-* bluestore: os/bluestore/BitMapAllocator: rm unused variable (`pr#13599 <https://github.com/ceph/ceph/pull/13599>`_, Jie Wang)
-* bluestore: os/bluestore/BitmapFreelistManager: readability improvements (`pr#12719 <https://github.com/ceph/ceph/pull/12719>`_, xie xingguo)
-* bluestore: os/bluestore/BlockDevice: support pmem device as bluestore backend (`pr#15102 <https://github.com/ceph/ceph/pull/15102>`_, Jianpeng Ma)
-* bluestore: os/bluestore/BlueFS: clean up log_writer aios from compaction (`issue#20454 <http://tracker.ceph.com/issues/20454>`_, `pr#16017 <https://github.com/ceph/ceph/pull/16017>`_, Sage Weil)
-* bluestore: os/bluestore/BlueFS: clear current log entrys before dump all fnode (`pr#15973 <https://github.com/ceph/ceph/pull/15973>`_, Jianpeng Ma)
-* bluestore: os/bluestore/BlueFS: fix reclaim_blocks (`issue#18368 <http://tracker.ceph.com/issues/18368>`_, `pr#12725 <https://github.com/ceph/ceph/pull/12725>`_, Sage Weil)
-* bluestore: os/bluestore/BlueFS: Rebuild memcopy for bufferlist::page_aligned_app… (`pr#15728 <https://github.com/ceph/ceph/pull/15728>`_, Jianpeng Ma, Sage Weil)
-* bluestore: os/bluestore/BlueFS: .slow should be compared with dirname (`pr#15595 <https://github.com/ceph/ceph/pull/15595>`_, zhanglei)
-* bluestore: os/bluestore/BlueStore: Avoid double counting state_kv_queued_lat (`pr#16374 <https://github.com/ceph/ceph/pull/16374>`_, Jianpeng Ma)
-* bluestore: os/bluestore/BlueStore.cc:remove unuse code in _open_bdev() (`pr#13553 <https://github.com/ceph/ceph/pull/13553>`_, yonghengdexin735)
-* bluestore: os/bluestore/BlueStore.cc: remove unused variable (`pr#12703 <https://github.com/ceph/ceph/pull/12703>`_, Li Wang)
-* bluestore: os/bluestore/BlueStore: no device no symlink (`pr#15721 <https://github.com/ceph/ceph/pull/15721>`_, Jianpeng Ma)
-* bluestore: os/bluestore/BlueStore: remove unused code (`pr#16522 <https://github.com/ceph/ceph/pull/16522>`_, Jianpeng Ma)
-* bluestore: os/bluestore: cleanup BitAllocator (`pr#12661 <https://github.com/ceph/ceph/pull/12661>`_, xie xingguo)
-* bluestore: os/bluestore: cleanup bluestore_types (`pr#15680 <https://github.com/ceph/ceph/pull/15680>`_, xie xingguo)
-* bluestore: os/bluestore: clean up flush logic (`pr#14162 <https://github.com/ceph/ceph/pull/14162>`_, Jianpeng Ma)
-* bluestore: os/bluestore: cleanup, got rid of table reference of 1<<x (`pr#13718 <https://github.com/ceph/ceph/pull/13718>`_, Adam Kupczyk)
-* bluestore: os/bluestore: clean up Invalid return value judgment (`pr#14219 <https://github.com/ceph/ceph/pull/14219>`_, shiqi)
-* bluestore: os/bluestore: cleanup min_alloc_size; some formatting nits (`pr#15826 <https://github.com/ceph/ceph/pull/15826>`_, xie xingguo)
-* bluestore: os/bluestore: clear result in BlueRocksEnv::getChildren (`issue#20857 <http://tracker.ceph.com/issues/20857>`_, `pr#16683 <https://github.com/ceph/ceph/pull/16683>`_, liuchang0812)
-* bluestore: os/bluestore: clear up redundant size assignment in KerenelDevice (`pr#16121 <https://github.com/ceph/ceph/pull/16121>`_, Shasha Lu)
-* bluestore: os/bluestore: conditionally load crr option (`pr#12877 <https://github.com/ceph/ceph/pull/12877>`_, xie xingguo)
-* bluestore: os/bluestore: configure rocksdb cache via bluestore_cache_kv_ratio (`pr#15580 <https://github.com/ceph/ceph/pull/15580>`_, Sage Weil)
-* bluestore: os/bluestore: default journal media to store media if bluefs is disabled (`pr#16844 <https://github.com/ceph/ceph/pull/16844>`_, xie xingguo)
-* bluestore: os/bluestore: _do_remove: dirty shard individually as each blob is unshared (`issue#20849 <http://tracker.ceph.com/issues/20849>`_, `pr#16822 <https://github.com/ceph/ceph/pull/16822>`_, Sage Weil)
-* bluestore: os/blueStore: Failure retry for opening file (`pr#16237 <https://github.com/ceph/ceph/pull/16237>`_, Yankun Li)
-* bluestore: os/bluestore: fix a bug in small write handling on sharded extents (`pr#13728 <https://github.com/ceph/ceph/pull/13728>`_, Igor Fedotov)
-* bluestore: os/bluestore: fix Allocator::allocate() int truncation (`issue#18595 <http://tracker.ceph.com/issues/18595>`_, `pr#13010 <https://github.com/ceph/ceph/pull/13010>`_, Sage Weil)
-* bluestore: os/bluestore: fix a typo about bleustore (`pr#15357 <https://github.com/ceph/ceph/pull/15357>`_, Dongsheng Yang)
-* bluestore: os/bluestore: fix BitMapAllocator assert on out-of-bound hint value (`pr#15289 <https://github.com/ceph/ceph/pull/15289>`_, Igor Fedotov)
-* bluestore: os/bluestore: fix buffers pinned by indefinitely deferred writes (`pr#15398 <https://github.com/ceph/ceph/pull/15398>`_, Sage Weil)
-* bluestore: os/bluestore: fix bug for calc extent_avg in reshard function (`pr#13931 <https://github.com/ceph/ceph/pull/13931>`_, wangzhengyong)
-* bluestore: os/bluestore: fix bug in aio_read() (`pr#13511 <https://github.com/ceph/ceph/pull/13511>`_, tangwenjun)
-* bluestore: os/bluestore: fix bug in _open_alloc() (`pr#13577 <https://github.com/ceph/ceph/pull/13577>`_, yonghengdexin735)
-* bluestore: os/bluestore: fix bug in _open_super_meta() (`pr#13559 <https://github.com/ceph/ceph/pull/13559>`_, Taeksang Kim)
-* bluestore: os/bluestore: fix bugs in bluefs and bdev flush (`issue#19250 <http://tracker.ceph.com/issues/19250>`_, `issue#19251 <http://tracker.ceph.com/issues/19251>`_, `pr#13911 <https://github.com/ceph/ceph/pull/13911>`_, Sage Weil)
-* bluestore: os/bluestore: fix coredump in register_ctrlr() (`pr#13556 <https://github.com/ceph/ceph/pull/13556>`_, tangwenjun)
-* bluestore: os/bluestore: fix deferred_aio deadlock (`pr#16051 <https://github.com/ceph/ceph/pull/16051>`_, Sage Weil)
-* bluestore: os/bluestore: fix deferred write race (`issue#19880 <http://tracker.ceph.com/issues/19880>`_, `pr#15004 <https://github.com/ceph/ceph/pull/15004>`_, Sage Weil)
-* bluestore: os/bluestore: fix deferred writes vs collection split race (`issue#19379 <http://tracker.ceph.com/issues/19379>`_, `pr#14157 <https://github.com/ceph/ceph/pull/14157>`_, Sage Weil)
-* bluestore: os/bluestore: fix dirty_range on _do_clone_range (`issue#20810 <http://tracker.ceph.com/issues/20810>`_, `pr#16738 <https://github.com/ceph/ceph/pull/16738>`_, Sage Weil)
-* bluestore: os/bluestore: fix false assert in IOContext::aio_wake (`pr#15268 <https://github.com/ceph/ceph/pull/15268>`_, Igor Fedotov)
-* bluestore: os/bluestore: fix false asserts in Cache::trim_all() (`pr#15470 <https://github.com/ceph/ceph/pull/15470>`_, xie xingguo)
-* bluestore: os/bluestore: fix fsck deferred_replay (`pr#15295 <https://github.com/ceph/ceph/pull/15295>`_, Sage Weil)
-* bluestore: os/bluestore: fix min_alloc_size at mkfs time (`pr#13192 <https://github.com/ceph/ceph/pull/13192>`_, Sage Weil)
-* bluestore: os/bluestore: fix narrow osr->flush() race (`pr#14489 <https://github.com/ceph/ceph/pull/14489>`_, Sage Weil)
-* bluestore: os/bluestore: fix NVMEDevice::open failure if serial number ends with a … (`pr#12956 <https://github.com/ceph/ceph/pull/12956>`_, Hongtong Liu)
-* bluestore: os/bluestore: fix OnodeSizeTracking testing (`issue#20498 <http://tracker.ceph.com/issues/20498>`_, `pr#12684 <https://github.com/ceph/ceph/pull/12684>`_, xie xingguo)
-* bluestore: os/bluestore: fix perf counters (`pr#13965 <https://github.com/ceph/ceph/pull/13965>`_, Sage Weil)
-* bluestore: os/bluestore: fix possible out of order shard(offset == 0); add sanity check (`pr#15658 <https://github.com/ceph/ceph/pull/15658>`_, xie xingguo)
-* bluestore: os/bluestore: fix potential access violation (`pr#15657 <https://github.com/ceph/ceph/pull/15657>`_, xie xingguo)
-* bluestore: os/bluestore: fix potential assert in cache _trim method (`pr#13234 <https://github.com/ceph/ceph/pull/13234>`_, Igor Fedotov)
-* bluestore: os/bluestore: fix reclaim_blocks and clean up Allocator interface (`issue#18573 <http://tracker.ceph.com/issues/18573>`_, `pr#12963 <https://github.com/ceph/ceph/pull/12963>`_, Sage Weil)
-* bluestore: os/bluestore: fix typo(s/trasnaction/transaction/) (`pr#14890 <https://github.com/ceph/ceph/pull/14890>`_, xie xingguo)
-* bluestore: os/bluestore: fix unsharing blob dirty_range args (`issue#20227 <http://tracker.ceph.com/issues/20227>`_, `pr#15766 <https://github.com/ceph/ceph/pull/15766>`_, Sage Weil)
-* bluestore: os/bluestore: fix use after free race with aio_wait (`pr#14956 <https://github.com/ceph/ceph/pull/14956>`_, Sage Weil)
-* bluestore: os/bluestore: fix wal-queue bytes-counter to keep pace with others (`pr#13382 <https://github.com/ceph/ceph/pull/13382>`_, xie xingguo)
-* bluestore: os/bluestore: fsck: verify blob.unused field (`pr#14316 <https://github.com/ceph/ceph/pull/14316>`_, Sage Weil)
-* bluestore: os/bluestore: handle rounding error in cache ratios (`pr#15672 <https://github.com/ceph/ceph/pull/15672>`_, Sage Weil)
-* bluestore: os/bluestore: implement collect_metadata (`pr#14115 <https://github.com/ceph/ceph/pull/14115>`_, Sage Weil)
-* bluestore: os/bluestore: include logical object offset in crc error (`pr#13074 <https://github.com/ceph/ceph/pull/13074>`_, Sage Weil)
-* bluestore: os/bluestore: initialize finishers properly (`pr#15666 <https://github.com/ceph/ceph/pull/15666>`_, xie xingguo)
-* bluestore: os/bluestore/KernelDevice: fix comments (`pr#15264 <https://github.com/ceph/ceph/pull/15264>`_, xie xingguo)
-* bluestore: os/bluestore/KernelDevice: fix debug message (`pr#13135 <https://github.com/ceph/ceph/pull/13135>`_, Sage Weil)
-* bluestore: os/bluestore/KernelDevice: helpful warning when aio limit exhausted (`pr#15116 <https://github.com/ceph/ceph/pull/15116>`_, Sage Weil)
-* bluestore: os/bluestore/KernelDevice: kill zeros (`pr#12856 <https://github.com/ceph/ceph/pull/12856>`_, xie xingguo)
-* bluestore: os/bluestore: kill BufferSpace.empty() (`pr#12871 <https://github.com/ceph/ceph/pull/12871>`_, xie xingguo)
-* bluestore: os/bluestore: kill orphan declaration of do_write_check_depth() (`pr#12853 <https://github.com/ceph/ceph/pull/12853>`_, xie xingguo)
-* bluestore: os/bluestore: leverage the type knowledge in BitMapAreaLeaf (`pr#13736 <https://github.com/ceph/ceph/pull/13736>`_, Radoslaw Zarzynski)
-* bluestore: os/bluestore: Make BitmapFreelistManager kv itereator short lived (`pr#16243 <https://github.com/ceph/ceph/pull/16243>`_, Mark Nelson)
-* bluestore: os/bluestore: make live changes for BlueStore throttle config work like initial config (`pr#14225 <https://github.com/ceph/ceph/pull/14225>`_, J. Eric Ivancich)
-* bluestore: os/bluestore: miscellaneous fixes to BitAllocator (`pr#12696 <https://github.com/ceph/ceph/pull/12696>`_, xie xingguo)
-* bluestore: os/bluestore: misc fix and cleanups (`pr#16315 <https://github.com/ceph/ceph/pull/16315>`_, Jianpeng Ma)
-* bluestore: os/bluestore: misc fixes (`pr#14333 <https://github.com/ceph/ceph/pull/14333>`_, Sage Weil)
-* bluestore: os/bluestore: move aio.h/cc from fs dir to bluestore dir (`pr#16409 <https://github.com/ceph/ceph/pull/16409>`_, Pan Liu)
-* bluestore: os/bluestore: move object exist in assign nid (`pr#16117 <https://github.com/ceph/ceph/pull/16117>`_, Jianpeng Ma)
-* bluestore: os/bluestore: move sharedblob to new collection in same shard (`issue#20358 <http://tracker.ceph.com/issues/20358>`_, `pr#15783 <https://github.com/ceph/ceph/pull/15783>`_, Sage Weil)
-* bluestore: os/bluestore: narrow cache lock range; make sure min_alloc_size p2 aligned (`pr#15911 <https://github.com/ceph/ceph/pull/15911>`_, xie xingguo)
-* bluestore: os/bluestore: "noid" is not always necessary in clone op (`pr#13769 <https://github.com/ceph/ceph/pull/13769>`_, wangzhengyong)
-* bluestore: os/bluestore: nullptr in OmapIteratorImpl::valid (`pr#12900 <https://github.com/ceph/ceph/pull/12900>`_, Xinze Chi)
-* bluestore: os/bluestore/NVMEDevice: Add multiple thread support for SPDK I/O thread (`pr#14420 <https://github.com/ceph/ceph/pull/14420>`_, Ziye Yang)
-* bluestore: os/bluestore/NVMEDevice.cc: fix the random read issue (`pr#13055 <https://github.com/ceph/ceph/pull/13055>`_, optimistyzy)
-* bluestore: os/bluestore/NVMEDevice: fix the compilation issue for collect_metadata (`pr#14455 <https://github.com/ceph/ceph/pull/14455>`_, optimistyzy)
-* bluestore: os/bluestore/NVMEdevice: fix the unrelease segs issue (`pr#12862 <https://github.com/ceph/ceph/pull/12862>`_, optimistyzy)
-* bluestore: os/bluestore: only submit deferred if there is any (`pr#16269 <https://github.com/ceph/ceph/pull/16269>`_, Sage Weil)
-* bluestore: os/bluestore: preallocate object[extent_shard] key to avoid reallocate (`pr#12644 <https://github.com/ceph/ceph/pull/12644>`_, xie xingguo)
-* bluestore: os/bluestore: pre-calculate number of ghost buffers to evict (`pr#15029 <https://github.com/ceph/ceph/pull/15029>`_, xie xingguo)
-* bluestore: os/bluestore: put strings in mempool (`pr#12651 <https://github.com/ceph/ceph/pull/12651>`_, Allen Samuels, Sage Weil)
-* bluestore: os/bluestore: Record l_bluestore_state_kv_queued_lat for sync_submit (`pr#14448 <https://github.com/ceph/ceph/pull/14448>`_, Jianpeng Ma)
-* bluestore: os/bluestore: reduce some overhead for _do_clone_range() and _do_remove() (`pr#15944 <https://github.com/ceph/ceph/pull/15944>`_, xie xingguo)
-* bluestore: os/bluestore: refactor BlueStore::_do_write;  kill dead ExtentMap::find_lextent() method (`pr#15750 <https://github.com/ceph/ceph/pull/15750>`_, xie xingguo)
-* bluestore: os/bluestore: refactor ExtentMap::update to avoid preceeding db updat… (`pr#12394 <https://github.com/ceph/ceph/pull/12394>`_, Igor Fedotov)
-* bluestore: os/bluestore: remove a never read value (`pr#12618 <https://github.com/ceph/ceph/pull/12618>`_, liuchang0812)
-* bluestore: os/bluestore: Remove ExtentFreeListManager (`pr#14772 <https://github.com/ceph/ceph/pull/14772>`_, Jianpeng Ma)
-* bluestore: os/bluestore: remove intermediate key var to avoid string copy (`pr#12643 <https://github.com/ceph/ceph/pull/12643>`_, xie xingguo)
-* bluestore: os/bluestore: remove no use parameter in bluestore_blob_t::map_bl (`pr#13013 <https://github.com/ceph/ceph/pull/13013>`_, wangzhengyong)
-* bluestore: os/bluestore: remove unneeded indirection in BitMapZone (`pr#13743 <https://github.com/ceph/ceph/pull/13743>`_, Radoslaw Zarzynski)
-* bluestore: os/bluestore: remove unused condition variable (`pr#14973 <https://github.com/ceph/ceph/pull/14973>`_, Igor Fedotov)
-* bluestore: os/bluestore: remove unused local variable "pos" (`pr#13715 <https://github.com/ceph/ceph/pull/13715>`_, wangzhengyong)
-* bluestore: os/bluestore: remove unused variables (`pr#15718 <https://github.com/ceph/ceph/pull/15718>`_, zhanglei)
-* bluestore: os/bluestore: rename/fix throttle options (`pr#14717 <https://github.com/ceph/ceph/pull/14717>`_, Sage Weil)
-* bluestore: os/bluestore: roundoff bluefs allocs to bluefs_alloc_size (`pr#14876 <https://github.com/ceph/ceph/pull/14876>`_, Ramesh Chander)
-* bluestore: os/bluestore: shrink buffer_map key into uint32_t (`pr#12850 <https://github.com/ceph/ceph/pull/12850>`_, xie xingguo)
-* bluestore: os/bluestore: slightly refactor Blob::try_reuse_blob (`pr#15836 <https://github.com/ceph/ceph/pull/15836>`_, xie xingguo)
-* bluestore: os/bluestore: some cleanup (`pr#13390 <https://github.com/ceph/ceph/pull/13390>`_, liuchang0812)
-* bluestore: os/bluestore: space between func and contents (`pr#16804 <https://github.com/ceph/ceph/pull/16804>`_, xie xingguo)
-* bluestore: os/bluestore: stop calculating bound if we must reshard; narrow shard combination condition (`pr#15631 <https://github.com/ceph/ceph/pull/15631>`_, xie xingguo)
-* bluestore: os/bluestore/StupidAllocator: rounded down len to an align boundary (`issue#20660 <http://tracker.ceph.com/issues/20660>`_, `pr#16593 <https://github.com/ceph/ceph/pull/16593>`_, Zhu Shangzhong)
-* bluestore: os/bluestore: target_bytes should scale with meta/data ratios (`pr#15708 <https://github.com/ceph/ceph/pull/15708>`_, Mark Nelson)
-* bluestore: os/bluestore: _txc_release_alloc when do wal cleaning (`pr#12692 <https://github.com/ceph/ceph/pull/12692>`_, Xinze Chi)
-* bluestore: os/bluestore: use bufferlist functions whenever possible (`pr#16158 <https://github.com/ceph/ceph/pull/16158>`_, Jianpeng Ma)
-* bluestore: os/bluestore: use correct bound encode size for unused (`pr#14731 <https://github.com/ceph/ceph/pull/14731>`_, Haomai Wang)
-* bluestore: os/bluestore: use reference to avoid string copy (`pr#16364 <https://github.com/ceph/ceph/pull/16364>`_, Pan Liu)
-* bluestore: os: extend ObjectStore interface to dump store's performance counters (`pr#13203 <https://github.com/ceph/ceph/pull/13203>`_, Igor Fedotov)
-* bluestore,performance: common/config_opts.h: compaction readahead for bluestore/rocksdb (`pr#14932 <https://github.com/ceph/ceph/pull/14932>`_, Mark Nelson)
-* bluestore,performance: kv/RocksDBStore: implement rm_range_keys operator interface and test (`pr#13855 <https://github.com/ceph/ceph/pull/13855>`_, Haomai Wang)
-* bluestore,performance: os/aio: remove the redundant memset(struct iocb) (`pr#13662 <https://github.com/ceph/ceph/pull/13662>`_, Jianpeng Ma)
-* bluestore,performance: os/bluestore: add bluestore_prefer_wal_size option (`pr#13217 <https://github.com/ceph/ceph/pull/13217>`_, Sage Weil)
-* bluestore,performance: os/bluestore: avoid overloading extents during reshard; atomic deferred_batch_ops (`pr#15502 <https://github.com/ceph/ceph/pull/15502>`_, xie xingguo)
-* bluestore,performance: os/bluestore: avoid the VTABLE-related burden in BitMapAllocator's hotspot (`pr#14348 <https://github.com/ceph/ceph/pull/14348>`_, Radoslaw Zarzynski)
-* bluestore,performance: os/bluestore: batch throttle (`pr#15284 <https://github.com/ceph/ceph/pull/15284>`_, Jianpeng Ma)
-* bluestore,performance: os/bluestore/BlueFS: add bluefs_sync_write option (`pr#14510 <https://github.com/ceph/ceph/pull/14510>`_, Sage Weil)
-* bluestore,performance: os/bluestore/BlueFS: optimize get_allocated (`pr#14121 <https://github.com/ceph/ceph/pull/14121>`_, Jianpeng Ma)
-* bluestore,performance: os/bluestore/BlueFS: tune flushing of writes (`pr#13032 <https://github.com/ceph/ceph/pull/13032>`_, Sage Weil)
-* bluestore,performance: os/bluestore/bluestore_types: drop std::bitset for blob unused (`pr#12569 <https://github.com/ceph/ceph/pull/12569>`_, Sage Weil)
-* bluestore,performance: os/bluestore: cap rocksdb cache size (`pr#15786 <https://github.com/ceph/ceph/pull/15786>`_, Mark Nelson)
-* bluestore,performance: os/bluestore: default 16KB min_alloc_size on ssd (`pr#14076 <https://github.com/ceph/ceph/pull/14076>`_, Sage Weil)
-* bluestore,performance: os/bluestore: default cache size of 3gb (`pr#15976 <https://github.com/ceph/ceph/pull/15976>`_, Sage Weil)
-* bluestore,performance: os/bluestore: differ default cache size for hdd/ssd backends (`pr#16157 <https://github.com/ceph/ceph/pull/16157>`_, xie xingguo)
-* bluestore,performance: os/bluestore: do not balance bluefs on every kv_sync_thread iteration (`pr#14557 <https://github.com/ceph/ceph/pull/14557>`_, Sage Weil)
-* bluestore,performance: os/bluestore: do not cache shard keys (`pr#12634 <https://github.com/ceph/ceph/pull/12634>`_, Sage Weil)
-* bluestore,performance: os/bluestore: eliminate some excessive stuff (`pr#14675 <https://github.com/ceph/ceph/pull/14675>`_, Igor Fedotov)
-* bluestore,performance: os/bluestore: fix deferred writes; improve flush (`pr#13888 <https://github.com/ceph/ceph/pull/13888>`_, Sage Weil)
-* bluestore,performance: os/bluestore: generate same onode extent-shard keys in a more efficient way (`pr#12681 <https://github.com/ceph/ceph/pull/12681>`_, xie xingguo)
-* bluestore,performance: os/bluestore: get rid off excessive lock at BitMapAllocator (`pr#14749 <https://github.com/ceph/ceph/pull/14749>`_, Igor Fedotov)
-* bluestore,performance: os/blueStore: In osd_tp_thread, call _txc_finalize_kv (`pr#14709 <https://github.com/ceph/ceph/pull/14709>`_, Jianpeng Ma)
-* bluestore,performance: os/bluestore: keep statfs replica in RAM to avoid expensive KV retrieval (`pr#15309 <https://github.com/ceph/ceph/pull/15309>`_, Igor Fedotov)
-* bluestore,performance: os/bluestore/KernelDevice: batch aio submit (`pr#16032 <https://github.com/ceph/ceph/pull/16032>`_, Haodong Tang)
-* bluestore,performance: os/bluestore/KernelDevice: fix sync write vs flush (`pr#15034 <https://github.com/ceph/ceph/pull/15034>`_, Sage Weil)
-* bluestore,performance: os/bluestore: kvdb histogram (`pr#12620 <https://github.com/ceph/ceph/pull/12620>`_, Varada Kari)
-* bluestore,performance: os/bluestore: make bluestore_max_blob_size parameter hdd/ssd case dependant (`pr#14434 <https://github.com/ceph/ceph/pull/14434>`_, Igor Fedotov)
-* bluestore,performance: os/bluestore: memory and dereference clean-up in the BitAllocator (`pr#13811 <https://github.com/ceph/ceph/pull/13811>`_, Radoslaw Zarzynski)
-* bluestore,performance: os/bluestore: move cache_trim into MempoolThread (`pr#15380 <https://github.com/ceph/ceph/pull/15380>`_, xie xingguo)
-* bluestore,performance: os/bluestore: optimize blob usage when doing appends/overwrites (`pr#13337 <https://github.com/ceph/ceph/pull/13337>`_, Igor Fedotov)
-* bluestore,performance: os/bluestore: optimized (encode|decode)_escaped (`pr#15759 <https://github.com/ceph/ceph/pull/15759>`_, Piotr Dałek)
-* bluestore,performance: os/bluestore: partial reshard support (`pr#13162 <https://github.com/ceph/ceph/pull/13162>`_, Sage Weil)
-* bluestore,performance: os/bluestore: prevent lock for almost "flush" calls (`pr#12524 <https://github.com/ceph/ceph/pull/12524>`_, Haomai Wang)
-* bluestore,performance: os/bluestore: put bluefs in the middle of the shared device (`pr#14873 <https://github.com/ceph/ceph/pull/14873>`_, Sage Weil)
-* bluestore,performance: os/bluestore: refactor small write handling to reuse blob more effect… (`pr#14399 <https://github.com/ceph/ceph/pull/14399>`_, Igor Fedotov)
-* bluestore,performance: os/bluestore: remove CephContext\* from BmapEntry (`pr#13651 <https://github.com/ceph/ceph/pull/13651>`_, Radoslaw Zarzynski)
-* bluestore,performance: os/bluestore: replace Blob ref_map with reference counting (`pr#12904 <https://github.com/ceph/ceph/pull/12904>`_, Igor Fedotov)
-* bluestore,performance: os/bluestore: rewrite deferred write handling (`issue#16644 <http://tracker.ceph.com/issues/16644>`_, `pr#14491 <https://github.com/ceph/ceph/pull/14491>`_, Sage Weil)
-* bluestore,performance: os/bluestore: separate kv_sync_thread into two parts (`pr#14035 <https://github.com/ceph/ceph/pull/14035>`_, Jianpeng Ma, Igor Fedotov, Sage Weil)
-* bluestore,performance: os/bluestore: set cache meta ratio to .9 (`pr#12635 <https://github.com/ceph/ceph/pull/12635>`_, Sage Weil)
-* bluestore,performance: os/bluestore: the exhausted check in BitMapZone can be lock-less (`pr#13653 <https://github.com/ceph/ceph/pull/13653>`_, Radoslaw Zarzynski)
-* bluestore,performance: os/bluestore: try to unshare blobs for EC overwrite workload (`pr#14239 <https://github.com/ceph/ceph/pull/14239>`_, Sage Weil)
-* bluestore,performance: os/bluestore: tune deferred_batch_ops separately for hdd and ssd (`pr#14435 <https://github.com/ceph/ceph/pull/14435>`_, Sage Weil)
-* bluestore,performance: os/bluestore: unify throttling model (`issue#19542 <http://tracker.ceph.com/issues/19542>`_, `pr#14306 <https://github.com/ceph/ceph/pull/14306>`_, Sage Weil)
-* bluestore,performance: os/bluestore: use aio for reads (`issue#19030 <http://tracker.ceph.com/issues/19030>`_, `pr#13066 <https://github.com/ceph/ceph/pull/13066>`_, Sage Weil)
-* bluestore,performance: os/bluestore: use Best-Effort policy when evicting onode from cache (`pr#12876 <https://github.com/ceph/ceph/pull/12876>`_, xie xingguo)
-* bluestore,performance: os/bluestore: use denc for varint encoding (`pr#14911 <https://github.com/ceph/ceph/pull/14911>`_, Piotr Dałek)
-* bluestore,performance: os/bluestore: various onode changes to reduce its in-memory footprint (`pr#12700 <https://github.com/ceph/ceph/pull/12700>`_, Igor Fedotov)
-* bluestore,performance: os/fs/aio: use small_vector for aio_t; clean up header location (`pr#14853 <https://github.com/ceph/ceph/pull/14853>`_, Sage Weil)
-* bluestore: rocksdb: add option: writable_file_max_buffer_size = 0 (`pr#12562 <https://github.com/ceph/ceph/pull/12562>`_, Jianpeng Ma)
-* bluestore,tests: ceph-dencoder: enable bluestore types (`pr#13595 <https://github.com/ceph/ceph/pull/13595>`_, Willem Jan Withagen, Kefu Chai)
-* bluestore,tests: ceph_test_objectstore: match clone_range src and dst offset (`pr#13211 <https://github.com/ceph/ceph/pull/13211>`_, Sage Weil)
-* bluestore,tests: qa/objectstore/bluestore\*: fsck on mount (`pr#15785 <https://github.com/ceph/ceph/pull/15785>`_, Sage Weil)
-* bluestore,tests: test/ceph-test-objectstore: Don't always include BlueStore code (`pr#13516 <https://github.com/ceph/ceph/pull/13516>`_, Willem Jan Withagen)
-* bluestore,tests: test/objectstore/store_test_fixture.cc: Exclude bluestore code if required (`pr#14085 <https://github.com/ceph/ceph/pull/14085>`_, Willem Jan Withagen)
-* bluestore,tests: test/store_test: add deferred test case setup to support explicit min… (`issue#18857 <http://tracker.ceph.com/issues/18857>`_, `pr#13415 <https://github.com/ceph/ceph/pull/13415>`_, Igor Fedotov)
-* bluestore,tests: test/store_test: fix bluestore test cases disablement (`pr#14228 <https://github.com/ceph/ceph/pull/14228>`_, Igor Fedotov)
-* bluestore,tests: test/unittest_bluefs: check whether add_block_device success (`pr#14013 <https://github.com/ceph/ceph/pull/14013>`_, shiqi)
-* bluestore,tests: test/unittest_bluefs: When fsync ret is less than 0, fsync can not be… (`pr#15365 <https://github.com/ceph/ceph/pull/15365>`_, shiqi)
-* bluestore,tests: unittest_alloc: add test_alloc_big (`issue#16662 <http://tracker.ceph.com/issues/16662>`_, `pr#14844 <https://github.com/ceph/ceph/pull/14844>`_, Sage Weil)
-* bluestore,tools: ceph-bluestore-tool: rename from bluefs-tool; improve usage (`pr#14258 <https://github.com/ceph/ceph/pull/14258>`_, Sage Weil)
-* bluestore,tools: ceph-kvstore-tool: allow 'bluestore-kv' as kvdb type; add escaping, compaction (`pr#14718 <https://github.com/ceph/ceph/pull/14718>`_, Sage Weil)
-* bluestore: wrap blob id when it reaches maximum value of int16_t (`issue#19555 <http://tracker.ceph.com/issues/19555>`_, `pr#15654 <https://github.com/ceph/ceph/pull/15654>`_, Xiaoyan Li)
-* build/ops: 12.0.3 (`pr#15600 <https://github.com/ceph/ceph/pull/15600>`_, Jenkins Build Slave User)
-* build/ops: add 12.0.1 release tag in master (`pr#14690 <https://github.com/ceph/ceph/pull/14690>`_, Jenkins Build Slave User)
-* build/ops: add psmisc dependency to ceph-base (deb and rpm) (`issue#19129 <http://tracker.ceph.com/issues/19129>`_, `pr#13744 <https://github.com/ceph/ceph/pull/13744>`_, Nathan Cutler)
-* build/ops: add sanity checks to run-make-check.sh (`pr#12683 <https://github.com/ceph/ceph/pull/12683>`_, Nathan Cutler)
-* build/ops: alpine: add alpine linux dev support (`pr#9853 <https://github.com/ceph/ceph/pull/9853>`_, John Coyle)
-* build/ops: arch: fix build on PowerPC with FreeBSD (`pr#14378 <https://github.com/ceph/ceph/pull/14378>`_, Andrew Solomon)
-* build/ops: arch: fix cmake's ARM CRC intrinsics test to handle duplicitous gcc 4.8.5 (`issue#19386 <http://tracker.ceph.com/issues/19386>`_, `pr#14132 <https://github.com/ceph/ceph/pull/14132>`_, Dan Mick)
-* build/ops: arch: use __get_cpuid instead of do_cpuid (`issue#7869 <http://tracker.ceph.com/issues/7869>`_, `pr#14857 <https://github.com/ceph/ceph/pull/14857>`_, Jos Collin)
-* build/ops: auth: Let's not use the deprecated cephx option (`pr#12721 <https://github.com/ceph/ceph/pull/12721>`_, Dave Chen)
-* build/ops: build: Add Virtuozzo Linux support (`pr#14301 <https://github.com/ceph/ceph/pull/14301>`_, Andrey Parfenov)
-* build/ops: build: build erasure-code isa lib without versions (`pr#16205 <https://github.com/ceph/ceph/pull/16205>`_, James Page)
-* build/ops: build/cmake:  provide asan, tsan, ubsan builds (`pr#12615 <https://github.com/ceph/ceph/pull/12615>`_, Matt Benjamin)
-* build/ops: build: execute dh_systemd_{enable,start} after dh_install (`issue#19585 <http://tracker.ceph.com/issues/19585>`_, `pr#16218 <https://github.com/ceph/ceph/pull/16218>`_, James Page)
-* build/ops: build: move bash_completion.d/ceph to ceph-common (`pr#15148 <https://github.com/ceph/ceph/pull/15148>`_, Leo Zhang)
-* build/ops: build: remove ceph-disk-udev entirely (`pr#15259 <https://github.com/ceph/ceph/pull/15259>`_, Leo Zhang)
-* build/ops: build: remove ceph-qa-suite directory (`pr#13880 <https://github.com/ceph/ceph/pull/13880>`_, Casey Bodley)
-* build/ops: build: revert -Wvla from #15342 (`pr#15469 <https://github.com/ceph/ceph/pull/15469>`_, Willem Jan Withagen)
-* build/ops: builds with dpdk v16.07 (`pr#12707 <https://github.com/ceph/ceph/pull/12707>`_, Kefu Chai)
-* build/ops: build: Use .S suffix for ppc64le assembly files (`issue#20106 <http://tracker.ceph.com/issues/20106>`_, `pr#15373 <https://github.com/ceph/ceph/pull/15373>`_, Andrew Solomon)
-* build/ops: ceph-disk: ability to use a different cluster name with dmcrypt (`issue#17821 <http://tracker.ceph.com/issues/17821>`_, `pr#11786 <https://github.com/ceph/ceph/pull/11786>`_, Sébastien Han, Erwan Velu)
-* build/ops: ceph-disk: don't activate suppressed journal devices (`issue#19489 <http://tracker.ceph.com/issues/19489>`_, `pr#16123 <https://github.com/ceph/ceph/pull/16123>`_, David Disseldorp)
-* build/ops: ceph.in: allow developer mode from outside build tree (`issue#20472 <http://tracker.ceph.com/issues/20472>`_, `pr#16055 <https://github.com/ceph/ceph/pull/16055>`_, Dan Mick)
-* build/ops: ceph_release: we are in the 'rc' phase (12.1.z) (`pr#15957 <https://github.com/ceph/ceph/pull/15957>`_, Sage Weil)
-* build/ops: ceph.spec.in, debian/control: Add bc to build dependencies (`issue#18876 <http://tracker.ceph.com/issues/18876>`_, `pr#13338 <https://github.com/ceph/ceph/pull/13338>`_, Kyr Shatskyy)
-* build/ops: Clean up make check for persistent test nodes (like arm64) (`pr#16773 <https://github.com/ceph/ceph/pull/16773>`_, Dan Mick)
-* build/ops: cmake,crc32c: conditionalize crc32c on different archs (`pr#14289 <https://github.com/ceph/ceph/pull/14289>`_, Kefu Chai)
-* build/ops: CMakeLists.txt: boost_python.so requires libpython.\*.so on FreeBSD (`pr#12763 <https://github.com/ceph/ceph/pull/12763>`_, Willem Jan Withagen)
-* build/ops: CMakeLists.txt: don't do crypto/isa-l if not Intel (`pr#14721 <https://github.com/ceph/ceph/pull/14721>`_, Dan Mick)
-* build/ops: CMakeLists.txt: suppress unneeded warning about jemalloc (`pr#13377 <https://github.com/ceph/ceph/pull/13377>`_, Willem Jan Withagen)
-* build/ops,common: build: Adds C++ warning flag for C Variable-Length Arrays (`pr#15342 <https://github.com/ceph/ceph/pull/15342>`_, Jesse Williamson)
-* build/ops,common: common/blkdev.cc: propagate get_device_by_fd to different OSes (`pr#15547 <https://github.com/ceph/ceph/pull/15547>`_, Willem Jan Withagen)
-* build/ops: common/module.c: do not use strerror_r the GNU way (`pr#12363 <https://github.com/ceph/ceph/pull/12363>`_, Willem Jan Withagen)
-* build/ops: compressor/zstd: add zstd to embedded ceph (`pr#13159 <https://github.com/ceph/ceph/pull/13159>`_, Bassam Tabbara)
-* build/ops: conditionalize rgw Beast frontend so it isn't built on s390x architecture (`issue#20048 <http://tracker.ceph.com/issues/20048>`_, `pr#15225 <https://github.com/ceph/ceph/pull/15225>`_, Willem Jan Withagen, Nathan Cutler, Kefu Chai, Tim Serong, Casey Bodley)
-* build/ops,core: build: let FreeBSD build ceph-fuse (`pr#14282 <https://github.com/ceph/ceph/pull/14282>`_, Willem Jan Withagen)
-* build/ops,core: ceph-disk: use correct user in check_journal_req (`issue#18538 <http://tracker.ceph.com/issues/18538>`_, `pr#12947 <https://github.com/ceph/ceph/pull/12947>`_, Samuel Matzek)
-* build/ops,core: common/freebsd_errno.cc: fix missing (`pr#15741 <https://github.com/ceph/ceph/pull/15741>`_, Willem Jan Withagen)
-* build/ops,core: erasure-code: update ec_isa version + add missing AVX512 ISA-L sources (`pr#15636 <https://github.com/ceph/ceph/pull/15636>`_, Ganesh Mahalingam, Tushar Gohad)
-* build/ops,core: os: allow offline conversion of filestore -> bluestore (or anything else) (`pr#14210 <https://github.com/ceph/ceph/pull/14210>`_, Sage Weil)
-* build/ops,core: osd/OSD: auto class on osd start up (`pr#16014 <https://github.com/ceph/ceph/pull/16014>`_, xie xingguo)
-* build/ops,core: osd/Pool: Disallow enabling 'hashpspool' option to a pool without  '--yes-i-really-mean-it' (`issue#18468 <http://tracker.ceph.com/issues/18468>`_, `pr#13406 <https://github.com/ceph/ceph/pull/13406>`_, Vikhyat Umrao)
-* build/ops,core,tests: osd/dmclock/testing: reorganize testing, building now optional (`issue#19987 <http://tracker.ceph.com/issues/19987>`_, `pr#15375 <https://github.com/ceph/ceph/pull/15375>`_, J. Eric Ivancich)
-* build/ops: debian: Add missing tp files in deb packaging (`pr#13526 <https://github.com/ceph/ceph/pull/13526>`_, Ganesh Mahalingam)
-* build/ops: debian: ceph-mgr: fix package description (`pr#15513 <https://github.com/ceph/ceph/pull/15513>`_, Fabian Grünbichler)
-* build/ops: debian/control: add ceph-base-dbg (`pr#13796 <https://github.com/ceph/ceph/pull/13796>`_, Sage Weil)
-* build/ops: debian: drop boost build dependencies (`pr#13524 <https://github.com/ceph/ceph/pull/13524>`_, Kefu Chai)
-* build/ops: debian: package ceph.logroate properly (`issue#19390 <http://tracker.ceph.com/issues/19390>`_, `pr#14600 <https://github.com/ceph/ceph/pull/14600>`_, Kefu Chai)
-* build/ops: debian: package crypto plugin only on amd64 (`pr#14820 <https://github.com/ceph/ceph/pull/14820>`_, Kefu Chai)
-* build/ops: debian/rpm: move radosgw-admin to ceph-common (`issue#19577 <http://tracker.ceph.com/issues/19577>`_, `pr#14940 <https://github.com/ceph/ceph/pull/14940>`_, Ali Maredia)
-* build/ops: debian/rules, ceph.spec.in: invoke cmake with -DBOOST_J (`pr#14114 <https://github.com/ceph/ceph/pull/14114>`_, Dan Mick)
-* build/ops: debian: sync logrotate packaging with downstream (`issue#19938 <http://tracker.ceph.com/issues/19938>`_, `pr#15567 <https://github.com/ceph/ceph/pull/15567>`_, Fabian Grünbichler)
-* build/ops: debian: workaround the bug in dpkg-maintscript-helper (`issue#20453 <http://tracker.ceph.com/issues/20453>`_, `pr#16072 <https://github.com/ceph/ceph/pull/16072>`_, Kefu Chai)
-* build/ops: debian: wrap-and-sort all files (`pr#16110 <https://github.com/ceph/ceph/pull/16110>`_, James Page)
-* build/ops: dmclock: error: ‘function’ in namespace ‘std’ does not name a template type (`pr#14909 <https://github.com/ceph/ceph/pull/14909>`_, Jos Collin)
-* build/ops: dmclock: include missing <functional> header (`pr#14923 <https://github.com/ceph/ceph/pull/14923>`_, Jos Collin)
-* build/ops: dmclock: initial commit of dmclock QoS library (`pr#14330 <https://github.com/ceph/ceph/pull/14330>`_, J. Eric Ivancich)
-* build/ops: do_cmake.sh: enable ccache if installed (`pr#15274 <https://github.com/ceph/ceph/pull/15274>`_, Sage Weil)
-* build/ops: do_cmake.sh: fix syntax for /bin/sh (doesn't have +=) (`pr#16433 <https://github.com/ceph/ceph/pull/16433>`_, Dan Mick)
-* build/ops: do_freebsd.sh: Remove ENODATA requirement (`pr#13626 <https://github.com/ceph/ceph/pull/13626>`_, Willem Jan Withagen)
-* build/ops: drop libfcgi build dependency (`pr#15285 <https://github.com/ceph/ceph/pull/15285>`_, Nathan Cutler)
-* build/ops: gitignore: Ignore rejects by patch (`pr#14405 <https://github.com/ceph/ceph/pull/14405>`_, Willem Jan Withagen)
-* build/ops: include/assert: test c++ before using static_cast<> (`pr#16424 <https://github.com/ceph/ceph/pull/16424>`_, Kefu Chai)
-* build/ops: init-ceph: add ceph libraries path to environment (`pr#14693 <https://github.com/ceph/ceph/pull/14693>`_, Mohamad Gebai)
-* build/ops: init-ceph: fix ceph user args (`pr#13467 <https://github.com/ceph/ceph/pull/13467>`_, Sage Weil)
-* build/ops: init-ceph: Make init-ceph work under FreeBSD for init-system (`pr#13209 <https://github.com/ceph/ceph/pull/13209>`_, Willem Jan Withagen)
-* build/ops: install-deps.sh: add missing dependencies for FreeBSD (`pr#16545 <https://github.com/ceph/ceph/pull/16545>`_, Alan Somers)
-* build/ops: install-deps.sh: workaround setuptools' dependency on six (`pr#15406 <https://github.com/ceph/ceph/pull/15406>`_, Kefu Chai)
-* build/ops: mailmap: Update OVH contributors (`pr#13063 <https://github.com/ceph/ceph/pull/13063>`_, Bartłomiej Święcki)
-* build/ops: make package groups comply with openSUSE guidelines (`issue#19184 <http://tracker.ceph.com/issues/19184>`_, `pr#13781 <https://github.com/ceph/ceph/pull/13781>`_, Nathan Cutler)
-* build/ops: make-srpm: Pass first parameter to make-dist for building SRPM (`pr#13480 <https://github.com/ceph/ceph/pull/13480>`_, Wido den Hollander)
-* build/ops: merge v12.0.2 release tag (`pr#15091 <https://github.com/ceph/ceph/pull/15091>`_, Jenkins Build Slave User)
-* build/ops,mgr: debian/ceph-base.dirs: create bootstrap-mgr dirs (`pr#14838 <https://github.com/ceph/ceph/pull/14838>`_, Sage Weil)
-* build/ops: miscellaneous cleanups and fixes (run-make-check.sh, ceph.spec.in) (`issue#20091 <http://tracker.ceph.com/issues/20091>`_, `issue#20127 <http://tracker.ceph.com/issues/20127>`_, `pr#15399 <https://github.com/ceph/ceph/pull/15399>`_, Nathan Cutler)
-* build/ops,mon: mon/ConfigKeyService: add 'config-key dump' to show keys and vals (`pr#14858 <https://github.com/ceph/ceph/pull/14858>`_, Dan Mick)
-* build/ops,mon: systemd: Restart Mon after 10s in case of failure (`issue#18635 <http://tracker.ceph.com/issues/18635>`_, `pr#13057 <https://github.com/ceph/ceph/pull/13057>`_, Wido den Hollander)
-* build/ops: msg/async/rdma: compile with rdma as default (`pr#13901 <https://github.com/ceph/ceph/pull/13901>`_, DanielBar-On)
-* build/ops: os/bluestore: fix build errors when spdk is on (`pr#16118 <https://github.com/ceph/ceph/pull/16118>`_, Ilsoo Byun)
-* build/ops: packaging: install libceph-common.so\* not libceph-common.so.\* (`issue#18692 <http://tracker.ceph.com/issues/18692>`_, `pr#13148 <https://github.com/ceph/ceph/pull/13148>`_, Kefu Chai)
-* build/ops,performance: crc32c: Add crc32c function optimized for ppc architecture (`pr#13909 <https://github.com/ceph/ceph/pull/13909>`_, Andrew Solomon)
-* build/ops,performance,rbd: byteorder: use gcc intrinsics for byteswap (`pr#15012 <https://github.com/ceph/ceph/pull/15012>`_, Kefu Chai)
-* build/ops,rbd,rgw: CMakeLists: trim rbd/rgw forced dependencies (`pr#16574 <https://github.com/ceph/ceph/pull/16574>`_, Patrick Donnelly)
-* build/ops,rbd,tests: test/librbd: decouple ceph_test_librbd_api from libceph-common (`issue#20175 <http://tracker.ceph.com/issues/20175>`_, `pr#15611 <https://github.com/ceph/ceph/pull/15611>`_, Kefu Chai)
-* build/ops,rbd,tests: test/librbd: re-enable internal tests in ceph_test_librbd (`pr#16255 <https://github.com/ceph/ceph/pull/16255>`_, Mykola Golub)
-* build/ops,rbd,tests: test: Need to exclude the fsx executable also on FreeBSD (`pr#13686 <https://github.com/ceph/ceph/pull/13686>`_, Willem Jan Withagen)
-* build/ops: Revert "msg/async: increase worker reference with local listen table enabled backend" (`issue#20603 <http://tracker.ceph.com/issues/20603>`_, `pr#16323 <https://github.com/ceph/ceph/pull/16323>`_, Haomai Wang)
-* build/ops: Revert "msg/async/rdma: Debug prints for ibv (`pr#14245 <https://github.com/ceph/ceph/pull/14245>`_, Kefu Chai)
-* build/ops,rgw: rgw_file: radosgw-admin can be built under FreeBSD (`pr#12191 <https://github.com/ceph/ceph/pull/12191>`_, Willem Jan Withagen)
-* build/ops,rgw,tests,tools: vstart: allow to start multiple radosgw when RGW=x (`pr#15632 <https://github.com/ceph/ceph/pull/15632>`_, Adam Kupczyk)
-* build/ops,rgw,tools: vstart: add --rgw_compression to set rgw compression plugin (`pr#15929 <https://github.com/ceph/ceph/pull/15929>`_, Casey Bodley)
-* build/ops: rocksdb: build with ppc64 (`pr#12908 <https://github.com/ceph/ceph/pull/12908>`_, Kefu Chai)
-* build/ops: rocksdb: sync with upstream (`pr#14456 <https://github.com/ceph/ceph/pull/14456>`_, Kefu Chai)
-* build/ops: rocksdb: sync with upstream (`pr#14818 <https://github.com/ceph/ceph/pull/14818>`_, Nathan Cutler, Kefu Chai)
-* build/ops: rpm: apply epoch only if %epoch macro is defined (`pr#15286 <https://github.com/ceph/ceph/pull/15286>`_, Nathan Cutler)
-* build/ops: rpm: build ceph-resource-agents by default (`issue#17613 <http://tracker.ceph.com/issues/17613>`_, `pr#13515 <https://github.com/ceph/ceph/pull/13515>`_, Nathan Cutler)
-* build/ops: rpm: bump epoch ahead of RHEL base (`issue#20508 <http://tracker.ceph.com/issues/20508>`_, `pr#16126 <https://github.com/ceph/ceph/pull/16126>`_, Ken Dreyer)
-* build/ops: rpm,deb: fix ceph-volume (`issue#20915 <http://tracker.ceph.com/issues/20915>`_, `pr#16832 <https://github.com/ceph/ceph/pull/16832>`_, Sage Weil)
-* build/ops: rpm: disable dwz to speed up valgrind (`issue#19099 <http://tracker.ceph.com/issues/19099>`_, `pr#13748 <https://github.com/ceph/ceph/pull/13748>`_, Kefu Chai)
-* build/ops: rpm: drop boost build dependencies (`pr#13519 <https://github.com/ceph/ceph/pull/13519>`_, Nathan Cutler)
-* build/ops: rpm: Drop legacy libxio support (`pr#16449 <https://github.com/ceph/ceph/pull/16449>`_, Nathan Cutler)
-* build/ops: rpm: fix python-Sphinx package name for SUSE (`pr#15015 <https://github.com/ceph/ceph/pull/15015>`_, Nathan Cutler, Jan Matejek)
-* build/ops: rpm: fix typo WTIH_BABELTRACE (`pr#16366 <https://github.com/ceph/ceph/pull/16366>`_, Nathan Cutler)
-* build/ops: rpm: Fix undefined FIRST_ARG (`issue#20077 <http://tracker.ceph.com/issues/20077>`_, `pr#16208 <https://github.com/ceph/ceph/pull/16208>`_, Boris Ranto)
-* build/ops: rpm: gperftools-devel >= 2.4 (`issue#13522 <http://tracker.ceph.com/issues/13522>`_, `pr#14870 <https://github.com/ceph/ceph/pull/14870>`_, Nathan Cutler)
-* build/ops: rpm: make librbd1 %post scriptlet depend on coreutils (`issue#20052 <http://tracker.ceph.com/issues/20052>`_, `pr#15231 <https://github.com/ceph/ceph/pull/15231>`_, Giacomo Comes, Nathan Cutler)
-* build/ops: rpm: move _epoch_prefix below Epoch definition (`pr#15417 <https://github.com/ceph/ceph/pull/15417>`_, Nathan Cutler)
-* build/ops: rpm: move RDMA and python-prettytables build dependencies to distro-conditional section (`pr#15200 <https://github.com/ceph/ceph/pull/15200>`_, Nathan Cutler)
-* build/ops: rpm: obsolete libcephfs1 (`pr#16074 <https://github.com/ceph/ceph/pull/16074>`_, Nathan Cutler)
-* build/ops: rpm: package COPYING, move sample ceph.conf to ceph-common (`pr#15596 <https://github.com/ceph/ceph/pull/15596>`_, Nathan Cutler)
-* build/ops: rpm: package crypto on x86_64 only (`pr#14779 <https://github.com/ceph/ceph/pull/14779>`_, Nathan Cutler)
-* build/ops: rpm: put mgr python build dependencies in make_check bcond (`issue#20425 <http://tracker.ceph.com/issues/20425>`_, `pr#15940 <https://github.com/ceph/ceph/pull/15940>`_, Nathan Cutler, Tim Serong)
-* build/ops: rpm: sane packaging of %{_docdir}/ceph directory (`pr#15900 <https://github.com/ceph/ceph/pull/15900>`_, Nathan Cutler)
-* build/ops: script: adding contributor credits script (`pr#13251 <https://github.com/ceph/ceph/pull/13251>`_, Patrick McGarry)
-* build/ops: script: drop the -x arg for credits script (`pr#14296 <https://github.com/ceph/ceph/pull/14296>`_, Abhishek Lekshmanan)
-* build/ops: script/sepia_bt.sh: download packages from shaman not gitbuilder (`pr#12799 <https://github.com/ceph/ceph/pull/12799>`_, Kefu Chai)
-* build/ops: script/sepia_bt.sh: get sha1,release from t.log if it's not in core (`pr#13620 <https://github.com/ceph/ceph/pull/13620>`_, Kefu Chai)
-* build/ops: script/sepia_bt.sh: support xenial (`pr#13292 <https://github.com/ceph/ceph/pull/13292>`_, Kefu Chai)
-* build/ops: selinux: Allow ceph daemons to read net stats (`issue#19254 <http://tracker.ceph.com/issues/19254>`_, `pr#13945 <https://github.com/ceph/ceph/pull/13945>`_, Boris Ranto)
-* build/ops: selinux: Allow read on var_run_t (`issue#16674 <http://tracker.ceph.com/issues/16674>`_, `pr#15523 <https://github.com/ceph/ceph/pull/15523>`_, Boris Ranto)
-* build/ops: selinux: Do parallel relabel on package install (`issue#20077 <http://tracker.ceph.com/issues/20077>`_, `pr#14871 <https://github.com/ceph/ceph/pull/14871>`_, Boris Ranto)
-* build/ops: selinux: Install ceph-base before ceph-selinux (`issue#20184 <http://tracker.ceph.com/issues/20184>`_, `pr#15490 <https://github.com/ceph/ceph/pull/15490>`_, Boris Ranto)
-* build/ops: Set subman cron attributes in spec file (`issue#20074 <http://tracker.ceph.com/issues/20074>`_, `pr#15270 <https://github.com/ceph/ceph/pull/15270>`_, Thomas Serlin)
-* build/ops: spdk: upgrade spdk to v16.12 (`pr#12734 <https://github.com/ceph/ceph/pull/12734>`_, Pan Liu)
-* build/ops: src/CMakeLists.txt: disable -Werror on rocksdb (`pr#12560 <https://github.com/ceph/ceph/pull/12560>`_, Willem Jan Withagen)
-* build/ops: src/CMakeLists.txt: Move parse_secret_objs setting within definition block (`pr#12785 <https://github.com/ceph/ceph/pull/12785>`_, Willem Jan Withagen)
-* build/ops: src/init-ceph.in:  allow one((re)?start|stop) as commands (`pr#14560 <https://github.com/ceph/ceph/pull/14560>`_, Willem Jan Withagen)
-* build/ops: sync luminous tag back to master (`pr#16758 <https://github.com/ceph/ceph/pull/16758>`_, Jenkins Build Slave User)
-* build/ops: systemd: Add explicit Before=ceph.target (`pr#15835 <https://github.com/ceph/ceph/pull/15835>`_, Tim Serong)
-* build/ops: systemd/ceph-disk: make it possible to customize timeout (`issue#18740 <http://tracker.ceph.com/issues/18740>`_, `pr#13197 <https://github.com/ceph/ceph/pull/13197>`_, Alexey Sheplyakov)
-* build/ops: systemd/ceph-mgr: remove automagic mgr creation hack (`issue#19994 <http://tracker.ceph.com/issues/19994>`_, `pr#16023 <https://github.com/ceph/ceph/pull/16023>`_, Sage Weil)
-* build/ops: systemd: remove ceph-create-keys from presets (`pr#14226 <https://github.com/ceph/ceph/pull/14226>`_, Sébastien Han)
-* build/ops: systemd: Start OSDs after MONs (`issue#18516 <http://tracker.ceph.com/issues/18516>`_, `pr#13097 <https://github.com/ceph/ceph/pull/13097>`_, Boris Ranto)
-* build/ops: test/fio_ceph_objectstore: fix fio plugin build failure caused by rec… (`pr#12655 <https://github.com/ceph/ceph/pull/12655>`_, Igor Fedotov)
-* build/ops,tests: qa: make run-standalone work on FreeBSD (`pr#16595 <https://github.com/ceph/ceph/pull/16595>`_, Willem Jan Withagen)
-* build/ops,tests: test/osd/CMakeLists.txt: osd-dup.sh require BlueStore/AIO (`pr#14387 <https://github.com/ceph/ceph/pull/14387>`_, Willem Jan Withagen)
-* build/ops,tests: test/osd/osd-dup.sh: warn on low open file limit (`pr#14637 <https://github.com/ceph/ceph/pull/14637>`_, Piotr Dałek)
-* build/ops,tests,tools: vstart.sh: Work around mgr restfull not available (`pr#15877 <https://github.com/ceph/ceph/pull/15877>`_, Willem Jan Withagen)
-* build/ops: The Clangtastic Mr. Clocks (`pr#15186 <https://github.com/ceph/ceph/pull/15186>`_, Adam C. Emerson)
-* build/ops: tool: add some ceph relate processes to ps-ceph.pl (`pr#12406 <https://github.com/ceph/ceph/pull/12406>`_, songbaisen)
-* build/ops: tools/scripts:"FreeBSD getopt is not compatible, use the one from packages" (`pr#13260 <https://github.com/ceph/ceph/pull/13260>`_, Willem Jan Withagen)
-* build/ops: tracing: Fix error in including all files in osd_tp (`pr#12501 <https://github.com/ceph/ceph/pull/12501>`_, Ganesh Mahalingam)
-* build/ops: upstart: start radosgw-all according to runlevel (`issue#18313 <http://tracker.ceph.com/issues/18313>`_, `pr#12586 <https://github.com/ceph/ceph/pull/12586>`_, Ken Dreyer)
-* build/ops: vstart: clean up usage a bit (`pr#13138 <https://github.com/ceph/ceph/pull/13138>`_, Sage Weil)
-* build/ops: vstart: do not start mgr if not start_all (`pr#13974 <https://github.com/ceph/ceph/pull/13974>`_, Kefu Chai)
-* build/ops: yasm-wrapper: filter -pthread (`pr#15249 <https://github.com/ceph/ceph/pull/15249>`_, Alessandro Barbieri)
-* build/ops: yasm-wrapper: strip -E (stops ccache trashing source files) (`pr#14633 <https://github.com/ceph/ceph/pull/14633>`_, Tim Serong)
-* cephfs: #11950: Persistent purge queue (`issue#11950 <http://tracker.ceph.com/issues/11950>`_, `pr#12786 <https://github.com/ceph/ceph/pull/12786>`_, John Spray)
-* cephfs: #17980: MDS client blacklisting and blacklist on eviction (`issue#17980 <http://tracker.ceph.com/issues/17980>`_, `issue#9754 <http://tracker.ceph.com/issues/9754>`_, `pr#14610 <https://github.com/ceph/ceph/pull/14610>`_, John Spray)
-* cephfs: #18600: Clear out tasks that don't make sense from multimds suite (`issue#18600 <http://tracker.ceph.com/issues/18600>`_, `pr#13089 <https://github.com/ceph/ceph/pull/13089>`_, John Spray)
-* cephfs: ceph_fuse: fix daemonization when pid file is non-empty (`pr#13532 <https://github.com/ceph/ceph/pull/13532>`_, "Yan, Zheng")
-* cephfs: ceph_fuse: pid_file default to empty (`issue#18309 <http://tracker.ceph.com/issues/18309>`_, `pr#12628 <https://github.com/ceph/ceph/pull/12628>`_, Nathan Cutler)
-* cephfs: ceph-fuse: use user space permission check by default (`issue#19820 <http://tracker.ceph.com/issues/19820>`_, `pr#14907 <https://github.com/ceph/ceph/pull/14907>`_, "Yan, Zheng")
-* cephfs: ceph: simplify CInode::maybe_export_pin() (`pr#15106 <https://github.com/ceph/ceph/pull/15106>`_, "Yan, Zheng")
-* cephfs: client: avoid returning negative space available (`issue#20178 <http://tracker.ceph.com/issues/20178>`_, `pr#15481 <https://github.com/ceph/ceph/pull/15481>`_, John Spray)
-* cephfs: client: call the lru_remove() twice,when trim cache (`pr#15662 <https://github.com/ceph/ceph/pull/15662>`_, huanwen ren)
-* cephfs: client: check for luminous MDS before sending FLUSH_MDLOG (`pr#15805 <https://github.com/ceph/ceph/pull/15805>`_, John Spray)
-* cephfs: client/Client.cc: after reset session from MDS - reconnect (`issue#18757 <http://tracker.ceph.com/issues/18757>`_, `pr#13522 <https://github.com/ceph/ceph/pull/13522>`_, Henrik Korkuc)
-* cephfs: client/Client.cc: prevent segfaulting (`issue#9935 <http://tracker.ceph.com/issues/9935>`_, `pr#12550 <https://github.com/ceph/ceph/pull/12550>`_, Michal Jarzabek)
-* cephfs: client: client_quota no longer optional (`pr#14978 <https://github.com/ceph/ceph/pull/14978>`_, Dan van der Ster)
-* cephfs: client: don't request lookup parent if ino is root (`pr#12478 <https://github.com/ceph/ceph/pull/12478>`_, huanwen ren)
-* cephfs: client: drop cap snaps when auth mds session gets closed (`issue#19022 <http://tracker.ceph.com/issues/19022>`_, `pr#13579 <https://github.com/ceph/ceph/pull/13579>`_, "Yan, Zheng")
-* cephfs: client: fix clang warn of "argument is an uninitialized value" (`pr#12580 <https://github.com/ceph/ceph/pull/12580>`_, liuchang0812)
-* cephfs:      client: fix Client::handle_cap_flushsnap_ack() crash (`issue#18460 <http://tracker.ceph.com/issues/18460>`_, `pr#12859 <https://github.com/ceph/ceph/pull/12859>`_, Yan, Zheng)
-* cephfs: client: fix Dentry::dump (`pr#15779 <https://github.com/ceph/ceph/pull/15779>`_, huanwen ren)
-* cephfs: client: fix display ino in the ldout (`pr#15314 <https://github.com/ceph/ceph/pull/15314>`_, huanwen ren)
-* cephfs: client: fix potential buffer overflow (`pr#12515 <https://github.com/ceph/ceph/pull/12515>`_, Yunchuan Wen)
-* cephfs: client: fix the cross-quota rename boundary check conditions (`pr#12489 <https://github.com/ceph/ceph/pull/12489>`_, Greg Farnum)
-* cephfs: client: fix UserPerm::gid_in_group() (`issue#19903 <http://tracker.ceph.com/issues/19903>`_, `pr#15039 <https://github.com/ceph/ceph/pull/15039>`_, "Yan, Zheng")
-* cephfs: client: getattr before returning quota/layout xattrs (`issue#17939 <http://tracker.ceph.com/issues/17939>`_, `pr#14018 <https://github.com/ceph/ceph/pull/14018>`_, John Spray)
-* cephfs: client/inode: fix the dump type of Inode::dump() (`pr#15198 <https://github.com/ceph/ceph/pull/15198>`_, huanwen ren)
-* cephfs: client: populate metadata during mount (`issue#18361 <http://tracker.ceph.com/issues/18361>`_, `pr#12915 <https://github.com/ceph/ceph/pull/12915>`_, John Spray)
-* cephfs: client: priority to verify the correctness of the "flag" (`pr#12897 <https://github.com/ceph/ceph/pull/12897>`_, huanwen ren)
-* cephfs: client: refine fsync/close writeback error handling (`pr#14589 <https://github.com/ceph/ceph/pull/14589>`_, John Spray)
-* cephfs: client: remove dead log code (`pr#13093 <https://github.com/ceph/ceph/pull/13093>`_, Patrick Donnelly)
-* cephfs: client: remove request from session->requests when handling forward (`issue#18675 <http://tracker.ceph.com/issues/18675>`_, `pr#13124 <https://github.com/ceph/ceph/pull/13124>`_, "Yan, Zheng")
-* cephfs: client: simplify remove_cap interface (`pr#12161 <https://github.com/ceph/ceph/pull/12161>`_, John Spray)
-* cephfs: client: specify inode in get_caps log message (`pr#13966 <https://github.com/ceph/ceph/pull/13966>`_, John Spray)
-* cephfs: client: wait for lastest osdmap when handling set file/dir layout (`issue#18914 <http://tracker.ceph.com/issues/18914>`_, `pr#13580 <https://github.com/ceph/ceph/pull/13580>`_, "Yan, Zheng")
-* cephfs,common: common/MemoryModel: Bump int to long and drop mallinfo (`pr#13453 <https://github.com/ceph/ceph/pull/13453>`_, Xiaoxi Chen)
-* cephfs,common,core: librados,osdc: kill ack vs commit distinction (`pr#12607 <https://github.com/ceph/ceph/pull/12607>`_, Sage Weil)
-* cephfs,common: include/fs_types: fix unsigned integer overflow (`pr#12440 <https://github.com/ceph/ceph/pull/12440>`_, runsisi)
-* cephfs,common,rbd: blkin: librbd trace hooks (`pr#15053 <https://github.com/ceph/ceph/pull/15053>`_, Victor Araujo, Jason Dillaman)
-* cephfs,common,rbd: osdc: cache should ignore error bhs during trim (`issue#18436 <http://tracker.ceph.com/issues/18436>`_, `pr#12966 <https://github.com/ceph/ceph/pull/12966>`_, Jason Dillaman)
-* cephfs,core: Add test for is_hacky_ecoverwrites in cephfs pool checks (`pr#13466 <https://github.com/ceph/ceph/pull/13466>`_, John Spray)
-* cephfs,core: cleanup: use std::make_shared to replace new (`pr#12276 <https://github.com/ceph/ceph/pull/12276>`_, Yunchuan Wen)
-* cephfs,core,mon: mon/MDSMonitor: fix segv when multiple MDSs raise same alert (`pr#16302 <https://github.com/ceph/ceph/pull/16302>`_, Sage Weil)
-* cephfs: fix mount point break off problem after mds switch occured (`issue#19437 <http://tracker.ceph.com/issues/19437>`_, `pr#14267 <https://github.com/ceph/ceph/pull/14267>`_, Guan yunfei)
-* cephfs: fix write_buf's _len overflow problem (`issue#19033 <http://tracker.ceph.com/issues/19033>`_, `pr#13587 <https://github.com/ceph/ceph/pull/13587>`_, Yang Honggang)
-* cephfs: fs/ceph-fuse: normalize file open flags on the wire (`pr#14822 <https://github.com/ceph/ceph/pull/14822>`_, Jan Fajerski)
-* cephfs: libcephfs.cc: fix memory leak (`pr#12557 <https://github.com/ceph/ceph/pull/12557>`_, Michal Jarzabek)
-* cephfs: libcephfs: cleanups (`pr#12830 <https://github.com/ceph/ceph/pull/12830>`_, huanwen ren)
-* cephfs: libcephfs: fix cct refcount constructing from rados (`pr#12831 <https://github.com/ceph/ceph/pull/12831>`_, John Spray)
-* cephfs: mds/MDBalancer: remove useless check_targets and hit_targets logic from MDS balancer (`issue#20131 <http://tracker.ceph.com/issues/20131>`_, `pr#15407 <https://github.com/ceph/ceph/pull/15407>`_, Zhi Zhang)
-* cephfs: mds/MDLog.cc Fix perf counter type for jlat (`pr#13449 <https://github.com/ceph/ceph/pull/13449>`_, Xiaoxi Chen)
-* cephfs: mds/Server.cc: Don't evict a slow client if (`issue#17855 <http://tracker.ceph.com/issues/17855>`_, `pr#12935 <https://github.com/ceph/ceph/pull/12935>`_, Michal Jarzabek)
-* cephfs: mds/StrayManager: avoid reusing deleted inode in StrayManager::_purge_stray_logged (`issue#18877 <http://tracker.ceph.com/issues/18877>`_, `pr#13347 <https://github.com/ceph/ceph/pull/13347>`_, Zhi Zhang)
-* cephfs,mgr: pybind/mgr/fsstatus: use mds_mem.dn as dentry counter (`pr#15255 <https://github.com/ceph/ceph/pull/15255>`_, Zhi Zhang)
-* cephfs: Mitigation for #16842, validate sessions after load (`issue#16842 <http://tracker.ceph.com/issues/16842>`_, `pr#14164 <https://github.com/ceph/ceph/pull/14164>`_, John Spray)
-* cephfs: mon/FSCommand: fix indentation (`pr#15423 <https://github.com/ceph/ceph/pull/15423>`_, Sage Weil)
-* cephfs: mon/MDSMonitor.cc:refuse fs new on pools with obj (`issue#11124 <http://tracker.ceph.com/issues/11124>`_, `pr#12825 <https://github.com/ceph/ceph/pull/12825>`_, Michal Jarzabek)
-* cephfs: mon/MDSMonitor: respect mds_standby_for_rank config (`pr#15129 <https://github.com/ceph/ceph/pull/15129>`_, "Yan, Zheng")
-* cephfs: mount: do not print "unknown" option to kclient (`issue#18159 <http://tracker.ceph.com/issues/18159>`_, `pr#12465 <https://github.com/ceph/ceph/pull/12465>`_, John Spray)
-* cephfs: osdc/Filer: truncate large file party by party (`issue#19755 <http://tracker.ceph.com/issues/19755>`_, `pr#14769 <https://github.com/ceph/ceph/pull/14769>`_, "Yan, Zheng")
-* cephfs: osdc/Journaler: avoid executing on_safe contexts prematurely (`issue#20055 <http://tracker.ceph.com/issues/20055>`_, `pr#15240 <https://github.com/ceph/ceph/pull/15240>`_, "Yan, Zheng")
-* cephfs: osdc/Journaler: fix memory leak in Journaler::_issue_read() (`issue#20338 <http://tracker.ceph.com/issues/20338>`_, `pr#15776 <https://github.com/ceph/ceph/pull/15776>`_, "Yan, Zheng")
-* cephfs: osdc/Objecter: fix inflight_ops update (`pr#15768 <https://github.com/ceph/ceph/pull/15768>`_, "Yan, Zheng")
-* cephfs: osdc: remove journaler_allow_split_entries option (`issue#19691 <http://tracker.ceph.com/issues/19691>`_, `pr#14636 <https://github.com/ceph/ceph/pull/14636>`_, John Spray)
-* cephfs,performance: client: make seeky readdir more efficiency (`issue#19306 <http://tracker.ceph.com/issues/19306>`_, `pr#14317 <https://github.com/ceph/ceph/pull/14317>`_, "Yan, Zheng")
-* cephfs,performance: mds/server: skip unwanted dn in handle_client_readdir (`pr#12870 <https://github.com/ceph/ceph/pull/12870>`_, Xiaoxi Chen)
-* cephfs: Permit recovering metadata into a new RADOS pool (`issue#15069 <http://tracker.ceph.com/issues/15069>`_, `issue#15068 <http://tracker.ceph.com/issues/15068>`_, `pr#10636 <https://github.com/ceph/ceph/pull/10636>`_, Douglas Fuller)
-* cephfs: qa/cephfs: disable mds_bal_frag for TestStrays.test_purge_queue_op_rate (`issue#19892 <http://tracker.ceph.com/issues/19892>`_, `pr#15105 <https://github.com/ceph/ceph/pull/15105>`_, "Yan, Zheng")
-* cephfs: qa/cephfs: Fix for test_data_scan (`issue#19893 <http://tracker.ceph.com/issues/19893>`_, `pr#15094 <https://github.com/ceph/ceph/pull/15094>`_, Douglas Fuller)
-* cephfs: qa: fix race in Mount.open_background (`issue#18661 <http://tracker.ceph.com/issues/18661>`_, `pr#13137 <https://github.com/ceph/ceph/pull/13137>`_, John Spray)
-* cephfs: qa/suites/fs: reserve more space for mds in full tests (`issue#19891 <http://tracker.ceph.com/issues/19891>`_, `pr#15026 <https://github.com/ceph/ceph/pull/15026>`_, "Yan, Zheng")
-* cephfs: qa/tasks/cephfs: use getattr to guarantee inode is in client cache (`issue#19912 <http://tracker.ceph.com/issues/19912>`_, `pr#15062 <https://github.com/ceph/ceph/pull/15062>`_, "Yan, Zheng")
-* cephfs: qa: unpin knfs from ubuntu (`issue#16397 <http://tracker.ceph.com/issues/16397>`_, `pr#13088 <https://github.com/ceph/ceph/pull/13088>`_, John Spray)
-* cephfs: qa: update log whitelists for kcephfs suite (`pr#14922 <https://github.com/ceph/ceph/pull/14922>`_, "Yan, Zheng")
-* cephfs: qa: update remaining ceph.com to download.ceph.com (`issue#18574 <http://tracker.ceph.com/issues/18574>`_, `pr#12964 <https://github.com/ceph/ceph/pull/12964>`_, John Spray)
-* cephfs: qa: whitelist new fullness messages in fs tests (`issue#19253 <http://tracker.ceph.com/issues/19253>`_, `pr#13915 <https://github.com/ceph/ceph/pull/13915>`_, John Spray)
-* cephfs: Remove "experimental" warnings from multimds (`pr#15154 <https://github.com/ceph/ceph/pull/15154>`_, John Spray, "Yan, Zheng")
-* cephfs: Rewrite mount.fuse.ceph (to python) and move ceph-fuse options to fs_mntops (`pr#11448 <https://github.com/ceph/ceph/pull/11448>`_, Edgaras Lukosevicius)
-* cephfs: tasks/cephfs: fix kernel force umount (`issue#18396 <http://tracker.ceph.com/issues/18396>`_, `pr#12833 <https://github.com/ceph/ceph/pull/12833>`_, Yan, Zheng)
-* cephfs: test/libcephfs: avoid buffer overflow when testing ceph_getdents() (`issue#18941 <http://tracker.ceph.com/issues/18941>`_, `pr#13429 <https://github.com/ceph/ceph/pull/13429>`_, "Yan, Zheng")
-* cephfs,tests: Add multimds:thrash sub-suite and fix bugs in thrasher for multimds (`issue#18690 <http://tracker.ceph.com/issues/18690>`_, `issue#10792 <http://tracker.ceph.com/issues/10792>`_, `pr#13262 <https://github.com/ceph/ceph/pull/13262>`_, Patrick Donnelly)
-* cephfs,tests: ceph-object-corpus: mark MMDSSlaveRequest incompat change (`pr#15730 <https://github.com/ceph/ceph/pull/15730>`_, Sage Weil)
-* cephfs,tests: Improve vstart_runner to (optionally) create its own cluster (`pr#12800 <https://github.com/ceph/ceph/pull/12800>`_, John Spray)
-* cephfs,tests: qa: fix float parse error in test_fragment (`pr#15122 <https://github.com/ceph/ceph/pull/15122>`_, Patrick Donnelly)
-* cephfs,tests: qa: fix test_standby_for_invalid_fscid with vstart_runner (`pr#14272 <https://github.com/ceph/ceph/pull/14272>`_, John Spray)
-* cephfs,tests: qa: handle SSHException in logrotate (`pr#13359 <https://github.com/ceph/ceph/pull/13359>`_, John Spray)
-* cephfs,tests: qa, mds: add checks for fragmentation, and enable it by default (`issue#16523 <http://tracker.ceph.com/issues/16523>`_, `pr#13862 <https://github.com/ceph/ceph/pull/13862>`_, john Spray, John Spray)
-* cephfs,tests: qa: misc cephfs test improvements (`issue#20131 <http://tracker.ceph.com/issues/20131>`_, `pr#15411 <https://github.com/ceph/ceph/pull/15411>`_, John Spray)
-* cephfs,tests: qa: re-enable ENOSPC tests for kclient (`issue#19550 <http://tracker.ceph.com/issues/19550>`_, `pr#14396 <https://github.com/ceph/ceph/pull/14396>`_, John Spray)
-* cephfs,tests: qa: silence spurious insufficient standby health warnings (`pr#15035 <https://github.com/ceph/ceph/pull/15035>`_, Patrick Donnelly)
-* cephfs,tests: qa: silence upgrade test failure (`issue#19934 <http://tracker.ceph.com/issues/19934>`_, `pr#15126 <https://github.com/ceph/ceph/pull/15126>`_, Patrick Donnelly)
-* cephfs,tests: qa: simplify TestJournalRepair (`pr#15096 <https://github.com/ceph/ceph/pull/15096>`_, John Spray)
-* cephfs,tests: qa/tasks: force umount during kclient teardown (`issue#18663 <http://tracker.ceph.com/issues/18663>`_, `pr#13099 <https://github.com/ceph/ceph/pull/13099>`_, John Spray)
-* cephfs,tests: qa: Tidy up fs/ suite (`pr#14575 <https://github.com/ceph/ceph/pull/14575>`_, John Spray)
-* cephfs,tests: qa/vstart_runner: amend ps invocation (`pr#14254 <https://github.com/ceph/ceph/pull/14254>`_, Ilya Dryomov)
-* cephfs,tests: qa: whitelist another fullness log message (`issue#19253 <http://tracker.ceph.com/issues/19253>`_, `pr#14221 <https://github.com/ceph/ceph/pull/14221>`_, John Spray)
-* cephfs,tests: tasks/cephfs: tear down on mount() failure (`pr#13282 <https://github.com/ceph/ceph/pull/13282>`_, John Spray)
-* cephfs: tools/cephfs: remove `apply` mode of cephfs-journal-tool (`pr#15715 <https://github.com/ceph/ceph/pull/15715>`_, John Spray)
-* cephfs: tools/cephfs: set dir_layout when injecting inodes (`issue#19406 <http://tracker.ceph.com/issues/19406>`_, `pr#14234 <https://github.com/ceph/ceph/pull/14234>`_, John Spray)
-* ceph-volume: use unique logical volumes (`pr#17208 <https://github.com/ceph/ceph/pull/17208>`_, Alfredo Deza)
-* cleanup: .gitignore: exclude rpm files (`pr#15745 <https://github.com/ceph/ceph/pull/15745>`_, Leo Zhang)
-* cleanup: Move code from .h into .cc (`pr#12737 <https://github.com/ceph/ceph/pull/12737>`_, Amir Vadai)
-* cleanup: resolve compiler warnings (`pr#13236 <https://github.com/ceph/ceph/pull/13236>`_, Adam C. Emerson)
-* cleanup: src: put-to operator function - const input cleanup (`issue#3977 <http://tracker.ceph.com/issues/3977>`_, `pr#15364 <https://github.com/ceph/ceph/pull/15364>`_, Jos Collin)
-* cmake: add "container" to required boost components (`pr#14850 <https://github.com/ceph/ceph/pull/14850>`_, Kefu Chai)
-* cmake: Add -finstrument-functions flag to OSD code (`pr#15055 <https://github.com/ceph/ceph/pull/15055>`_, Mohamad Gebai)
-* cmake: add RGW and MDS to libcephd (`pr#12345 <https://github.com/ceph/ceph/pull/12345>`_, Bassam Tabbara)
-* cmake: Add simple recursive ctags target for Ceph source only (`pr#14334 <https://github.com/ceph/ceph/pull/14334>`_, Kefu Chai, Dan Mick)
-* cmake: align cmake names of library packages (`issue#19853 <http://tracker.ceph.com/issues/19853>`_, `pr#14951 <https://github.com/ceph/ceph/pull/14951>`_, Nathan Cutler)
-* cmake: Allow tests to build without NSS (`pr#13315 <https://github.com/ceph/ceph/pull/13315>`_, Daniel Gryniewicz)
-* cmake: build boost as an external project (`pr#15376 <https://github.com/ceph/ceph/pull/15376>`_, Kefu Chai)
-* cmake: build tracepoint libraries for vstart target (`pr#14354 <https://github.com/ceph/ceph/pull/14354>`_, Mohamad Gebai)
-* cmake: check the existence of gperf before using it (`pr#15164 <https://github.com/ceph/ceph/pull/15164>`_, Kefu Chai)
-* cmake: cleanup the use of udev and blkid in target_link_lib() (`pr#12811 <https://github.com/ceph/ceph/pull/12811>`_, Willem Jan Withagen)
-* cmake: disable -fvar-tracking-assignments for config.cc (`pr#16695 <https://github.com/ceph/ceph/pull/16695>`_, Kefu Chai)
-* cmake: disable mallinfo for jemalloc (`pr#12469 <https://github.com/ceph/ceph/pull/12469>`_, Bassam Tabbara)
-* cmake: do not add dependencies to INTERFACE library on cmake < 3.3 (`pr#15813 <https://github.com/ceph/ceph/pull/15813>`_, Kefu Chai)
-* cmake: do not compile crush twice (`pr#14725 <https://github.com/ceph/ceph/pull/14725>`_, Kefu Chai)
-* cmake: do not link libcommon against some libs (`pr#15340 <https://github.com/ceph/ceph/pull/15340>`_, Willem Jan Withagen)
-* cmake: do not try to add submodule to exclude list if .git is not around (`pr#14495 <https://github.com/ceph/ceph/pull/14495>`_, Kefu Chai)
-* cmake: enable cross-compilation of boost (`issue#18938 <http://tracker.ceph.com/issues/18938>`_, `pr#14881 <https://github.com/ceph/ceph/pull/14881>`_, Kefu Chai)
-* cmake: exclude \*.css while generating ctags (`pr#15663 <https://github.com/ceph/ceph/pull/15663>`_, Leo Zhang)
-* cmake: explictly call find_package(PythonInterp) first to fix build err (`pr#12385 <https://github.com/ceph/ceph/pull/12385>`_, Yixun Lan)
-* cmake: fix boost components for WITH_SYSTEM_BOOST (`pr#15160 <https://github.com/ceph/ceph/pull/15160>`_, Bassam Tabbara)
-* cmake: Fix broken async/rdma compilation since move to libceph-common (`pr#13122 <https://github.com/ceph/ceph/pull/13122>`_, Oren Duer)
-* cmake: fix broken RDMA compilation after merge PR #12878 (`pr#13186 <https://github.com/ceph/ceph/pull/13186>`_, Oren Duer)
-* cmake: fix hard coded boost python lib (`pr#12480 <https://github.com/ceph/ceph/pull/12480>`_, John Coyle)
-* cmake: fix rpath on shared libraries and binaries targets (`pr#12927 <https://github.com/ceph/ceph/pull/12927>`_, Ricardo Dias)
-* cmake: fix the build with -DWITH_ZFS=ON (`pr#15907 <https://github.com/ceph/ceph/pull/15907>`_, Kefu Chai)
-* cmake: fix the linked lib reference of unittest_rgw_crypto (`pr#14869 <https://github.com/ceph/ceph/pull/14869>`_, Willem Jan Withagen)
-* cmake: improved build speed by 5x when using ccache (`pr#15147 <https://github.com/ceph/ceph/pull/15147>`_, Bassam Tabbara)
-* cmake: kill duplicated cmake commands (`pr#14948 <https://github.com/ceph/ceph/pull/14948>`_, liuchang0812)
-* cmake: link against fcgi only if enabled (`pr#15425 <https://github.com/ceph/ceph/pull/15425>`_, Yao Zongyou)
-* cmake: link ceph-{mgr,mon,mds,osd} against libcommon statically (`pr#12878 <https://github.com/ceph/ceph/pull/12878>`_, Kefu Chai)
-* cmake: link consumers of libclient with libcommon (`issue#18838 <http://tracker.ceph.com/issues/18838>`_, `pr#13394 <https://github.com/ceph/ceph/pull/13394>`_, Kefu Chai)
-* cmake: misc fixes for build on i386 (`pr#15516 <https://github.com/ceph/ceph/pull/15516>`_, James Page)
-* cmake: pass -d0 to b2 if not CMAKE_VERBOSE_MAKEFILE (`pr#14651 <https://github.com/ceph/ceph/pull/14651>`_, Kefu Chai)
-* cmake: remove Findpciaccess.cmake (`pr#12776 <https://github.com/ceph/ceph/pull/12776>`_, optimistyzy)
-* cmake: Rewrite HAVE_BABELTRACE  option to WITH (`pr#15305 <https://github.com/ceph/ceph/pull/15305>`_, Willem Jan Withagen)
-* cmake: rgw: do not link against boost in a wholesale (`pr#15347 <https://github.com/ceph/ceph/pull/15347>`_, Nathan Cutler, Kefu Chai)
-* cmake: search for Keyutils in default paths (`pr#12769 <https://github.com/ceph/ceph/pull/12769>`_, Pascal Bach)
-* cmake: search for nspr include files for both suffixes: nspr4 and nspr (`issue#18535 <http://tracker.ceph.com/issues/18535>`_, `pr#12939 <https://github.com/ceph/ceph/pull/12939>`_, John Lin)
-* cmake: should not compile crc32c_ppc.c on intel arch (`pr#14423 <https://github.com/ceph/ceph/pull/14423>`_, Kefu Chai)
-* cmake: simplify find_package jemalloc (`pr#12468 <https://github.com/ceph/ceph/pull/12468>`_, Bassam Tabbara)
-* cmake: support for external rocksdb (`pr#12467 <https://github.com/ceph/ceph/pull/12467>`_, Bassam Tabbara)
-* cmake: support optional argument for overriding default ctag excludes (`pr#14379 <https://github.com/ceph/ceph/pull/14379>`_, Kefu Chai)
-* cmake: turn libcommon into a shared library (`pr#12840 <https://github.com/ceph/ceph/pull/12840>`_, Kefu Chai)
-* cmake: use CMAKE_INSTALL_INCLUDEDIR (`pr#16483 <https://github.com/ceph/ceph/pull/16483>`_, David Disseldorp)
-* cmake: workaound ccache issue with .S assembly files (`pr#15142 <https://github.com/ceph/ceph/pull/15142>`_, Bassam Tabbara)
-* common: add ceph::size() (`pr#15181 <https://github.com/ceph/ceph/pull/15181>`_, Kefu Chai)
-* common: add override in common and misc (`issue#18922 <http://tracker.ceph.com/issues/18922>`_, `pr#13443 <https://github.com/ceph/ceph/pull/13443>`_, liuchang0812)
-* common: add override in header file (`pr#13774 <https://github.com/ceph/ceph/pull/13774>`_, liuchang0812)
-* common: add override in msg subsystem (`pr#13771 <https://github.com/ceph/ceph/pull/13771>`_, liuchang0812)
-* common: auth: Enhancement for the supported auth methods (`pr#12937 <https://github.com/ceph/ceph/pull/12937>`_, Dave Chen)
-* common: auth/RotatingKeyRing: use std::move() to set secrets (`pr#15866 <https://github.com/ceph/ceph/pull/15866>`_, Kefu Chai)
-* common: avoid statically allocating configuration options (`issue#20869 <http://tracker.ceph.com/issues/20869>`_, `pr#16735 <https://github.com/ceph/ceph/pull/16735>`_, Jason Dillaman)
-* common: Better handling for missing/inaccessible ceph.conf files (`issue#19658 <http://tracker.ceph.com/issues/19658>`_, `pr#14757 <https://github.com/ceph/ceph/pull/14757>`_, Dan Mick)
-* common: bufferlist: cleanup semantical wrong for bufferlist::append (`pr#12247 <https://github.com/ceph/ceph/pull/12247>`_, Yankun Li)
-* common: buffer: silence unused var warning on FreeBSD (`pr#16452 <https://github.com/ceph/ceph/pull/16452>`_, Willem Jan Withagen)
-* common: ceph_osd: remove client message cap limit (`pr#14944 <https://github.com/ceph/ceph/pull/14944>`_, Haomai Wang)
-* common: ceph: wait for maps before doing 'ceph tell ... help' (`issue#20113 <http://tracker.ceph.com/issues/20113>`_, `pr#16756 <https://github.com/ceph/ceph/pull/16756>`_, Sage Weil)
-* common: cls/log/cls_log.cc: reduce logging noise (`issue#19835 <http://tracker.ceph.com/issues/19835>`_, `pr#14879 <https://github.com/ceph/ceph/pull/14879>`_, Willem Jan Withagen)
-* common: cls: optimize header file dependency (`pr#15165 <https://github.com/ceph/ceph/pull/15165>`_, Brad Hubbard, Xiaowei Chen)
-* common: cmdparse: more constness (`pr#15023 <https://github.com/ceph/ceph/pull/15023>`_, Kefu Chai)
-* common: common/admin_socket: add config for admin socket permission bits (`pr#11684 <https://github.com/ceph/ceph/pull/11684>`_, runsisi)
-* common: common/admin-socket: fix potential buffer overflow (`pr#12518 <https://github.com/ceph/ceph/pull/12518>`_, Yunchuan Wen)
-* common: common/auth: add override in headers (`pr#13692 <https://github.com/ceph/ceph/pull/13692>`_, liuchang0812)
-* common: common/BackTrace: add operator<< (`pr#9028 <https://github.com/ceph/ceph/pull/9028>`_, Kefu Chai)
-* common: common/BackTrace: demangle on FreeBSD also (`pr#12992 <https://github.com/ceph/ceph/pull/12992>`_, Kefu Chai)
-* common: common/buffer: close pipe fd if set nonblocking fails (`pr#12828 <https://github.com/ceph/ceph/pull/12828>`_, donglinpeng)
-* common: common/buffer: off-by-one error in max iov length blocking (`issue#20907 <http://tracker.ceph.com/issues/20907>`_, `pr#16803 <https://github.com/ceph/ceph/pull/16803>`_, Dan Mick)
-* common: common/ceph_context.cc: Use CEPH_DEV to reduce logfile noise (`pr#10384 <https://github.com/ceph/ceph/pull/10384>`_, Willem Jan Withagen)
-* common: common/ceph_context: 'config diff get' option added (`pr#10736 <https://github.com/ceph/ceph/pull/10736>`_, Daniel Oliveira)
-* common: common/ceph_context: fewer warnings about experimental features (`pr#14170 <https://github.com/ceph/ceph/pull/14170>`_, Sage Weil)
-* common: common/ceph_context: fix leak of registered commands on exit (`pr#15302 <https://github.com/ceph/ceph/pull/15302>`_, xie xingguo)
-* common: common/ceph_context: Show clear message if all features are enabled (`pr#12676 <https://github.com/ceph/ceph/pull/12676>`_, Dave Chen)
-* common: common/cmdparse.cc: remove unused variable 'argnum' in dump_cmd_to_json() (`pr#16862 <https://github.com/ceph/ceph/pull/16862>`_, Luo Kexue)
-* common: common/common_init: disable default dout logging for UTILITY_NODOUT too (`issue#20771 <http://tracker.ceph.com/issues/20771>`_, `pr#16578 <https://github.com/ceph/ceph/pull/16578>`_, Sage Weil)
-* common: common/config: Add /usr/local/etc/ceph to default paths (`pr#14797 <https://github.com/ceph/ceph/pull/14797>`_, Willem Jan Withagen)
-* common: common/config: eliminate config_t::set_val unsafe option (`issue#19106 <http://tracker.ceph.com/issues/19106>`_, `pr#13687 <https://github.com/ceph/ceph/pull/13687>`_, liuchang0812)
-* common: common/config: fix return type of string::find and use string::npos (`pr#9924 <https://github.com/ceph/ceph/pull/9924>`_, Yan Jun)
-* common: common,config: OPT_FLOAT and OPT_DOUBLE output format in config show (`issue#20104 <http://tracker.ceph.com/issues/20104>`_, `pr#15647 <https://github.com/ceph/ceph/pull/15647>`_, Yanhu Cao)
-* common: common/config_opt: remove unused config (`pr#15874 <https://github.com/ceph/ceph/pull/15874>`_, alex.wu)
-* common: common/config_opts: drop unused opt (`pr#15876 <https://github.com/ceph/ceph/pull/15876>`_, Yanhu Cao)
-* common: common/config_opts.h: FreeBSD timing changed due to no SO_REUSEADDR (`pr#12594 <https://github.com/ceph/ceph/pull/12594>`_, Willem Jan Withagen)
-* common: common/config_opts.h: Remove deprecated osd_compact_leveldb_on_mount option (`issue#19318 <http://tracker.ceph.com/issues/19318>`_, `pr#14059 <https://github.com/ceph/ceph/pull/14059>`_, Vikhyat Umrao)
-* common: common/config_opts.h: remove obsolete configuration option (`pr#12659 <https://github.com/ceph/ceph/pull/12659>`_, Li Wang)
-* common: common/config_opts: Set the HDD throttle cost to 1.5M (`pr#14808 <https://github.com/ceph/ceph/pull/14808>`_, Mark Nelson)
-* common: common/EventTrace: fix compiler warning (`pr#13659 <https://github.com/ceph/ceph/pull/13659>`_, Jianpeng Ma)
-* common: common/Finisher: fix uninitialized variable warning (`pr#14958 <https://github.com/ceph/ceph/pull/14958>`_, Piotr Dałek)
-* common: common/freebsd_errno.cc: fixed again a stupid typo (`pr#15742 <https://github.com/ceph/ceph/pull/15742>`_, Willem Jan Withagen)
-* common: common/interval_set: return int64_t for size() (`pr#12898 <https://github.com/ceph/ceph/pull/12898>`_, Xinze Chi)
-* common: common/iso_8601.cc: Make return expression Clang compatible (`pr#15336 <https://github.com/ceph/ceph/pull/15336>`_, Willem Jan Withagen)
-* common: common/LogEntry: include EntityName in log entries (`pr#15395 <https://github.com/ceph/ceph/pull/15395>`_, Sage Weil)
-* common: common/Mutex.cc: fixed the error in comment (`pr#16214 <https://github.com/ceph/ceph/pull/16214>`_, Pan Liu)
-* common: common/options: refactors to set the properties in a more structured way (`pr#16482 <https://github.com/ceph/ceph/pull/16482>`_, Kefu Chai)
-* common: common,osdc: remove atomic_t completely (`pr#15562 <https://github.com/ceph/ceph/pull/15562>`_, Kefu Chai)
-* common: common/perf_counters: add average time for PERFCOUNTER_TIME (`pr#15478 <https://github.com/ceph/ceph/pull/15478>`_, xie xingguo)
-* common: common/perf_counters: fix race condition with atomic variables (`pr#14227 <https://github.com/ceph/ceph/pull/14227>`_, J. Eric Ivancich)
-* common: common/perf_counters: make schema more friendly and update docs (`pr#14933 <https://github.com/ceph/ceph/pull/14933>`_, Sage Weil)
-* common: common/perf_counters.: Remove unnecessary judgment (`pr#10407 <https://github.com/ceph/ceph/pull/10407>`_, zhang.zezhu)
-* common: common/simple_spin: use __ppc_yield() on all powerpc archs (`pr#14310 <https://github.com/ceph/ceph/pull/14310>`_, Kefu Chai)
-* common: common,test: migrate atomic_t to std::atomic (`pr#14866 <https://github.com/ceph/ceph/pull/14866>`_, Jesse Williamson)
-* common: common/Timer: do not add event if already shutdown (`issue#20432 <http://tracker.ceph.com/issues/20432>`_, `pr#16201 <https://github.com/ceph/ceph/pull/16201>`_, Kefu Chai)
-* common:   common/WorkQueue: use threadpoolname + threadaddr for heartbeat_han… (`pr#16563 <https://github.com/ceph/ceph/pull/16563>`_, huangjun)
-* common: common/xmlformatter: turn on underscored and add unittest (`pr#12916 <https://github.com/ceph/ceph/pull/12916>`_, liuchang0812)
-* common: compressor/zlib: remove g_ceph_context/g_conf from compressor plugin (`pr#16245 <https://github.com/ceph/ceph/pull/16245>`_, Casey Bodley)
-* common: compressor/zstd: add zstd compression plugin (`pr#13075 <https://github.com/ceph/ceph/pull/13075>`_, Kefu Chai, Sage Weil)
-* common: config: Improve warning for unobserved value (`issue#18424 <http://tracker.ceph.com/issues/18424>`_, `pr#12855 <https://github.com/ceph/ceph/pull/12855>`_, Brad Hubbard)
-* common: config_opt: use bool instead of int for the default value of filestore_debug_omap_check (`pr#15651 <https://github.com/ceph/ceph/pull/15651>`_, Leo Zhang)
-* common,core: ceph_test_rados_api_misc: fix LibRadosMiscConnectFailure.ConnectFailure retry (`issue#19901 <http://tracker.ceph.com/issues/19901>`_, `pr#15522 <https://github.com/ceph/ceph/pull/15522>`_, Sage Weil)
-* common: core/common: Fix ENODATA for FreeBSD with compat.h (`issue#19883 <http://tracker.ceph.com/issues/19883>`_, `pr#15685 <https://github.com/ceph/ceph/pull/15685>`_, Willem Jan Withagen)
-* common,core: common, osd, tools: Add histograms to performance counters (`pr#12829 <https://github.com/ceph/ceph/pull/12829>`_, Bartłomiej Święcki)
-* common,core: common/pick_address.cc: Copy public_netw to cluster_netw if cluster empty (`pr#12929 <https://github.com/ceph/ceph/pull/12929>`_, Willem Jan Withagen)
-* common,core: common/TracepointProvider: add assert if dlopen error (`pr#13430 <https://github.com/ceph/ceph/pull/13430>`_, Jianpeng Ma)
-* common,core: common/TrackedOp: make TrackedOp::reset_desc() safe (`issue#19110 <http://tracker.ceph.com/issues/19110>`_, `pr#13702 <https://github.com/ceph/ceph/pull/13702>`_, Sage Weil)
-* common,core: mempool: put bloom_filter in mempool (`pr#13009 <https://github.com/ceph/ceph/pull/13009>`_, Sage Weil)
-* common,core: osd,mds,mgr: do not dereference null rotating_keys (`issue#20667 <http://tracker.ceph.com/issues/20667>`_, `pr#16455 <https://github.com/ceph/ceph/pull/16455>`_, Sage Weil)
-* common,core: osd,osdc: pg and osd-based backoff (`pr#12342 <https://github.com/ceph/ceph/pull/12342>`_, Sage Weil)
-* common,core: osd/OSDMap: make osd_state 32 bits wide (`pr#15390 <https://github.com/ceph/ceph/pull/15390>`_, Sage Weil)
-* common,core: osd/OSDMap: replace require_osds flags with a single require_osd_release field (`pr#15068 <https://github.com/ceph/ceph/pull/15068>`_, Sage Weil)
-* common,core: osd/OSDMap: replace string-based min_compat_client with a CEPH_RELEASE uint8_t (`pr#15351 <https://github.com/ceph/ceph/pull/15351>`_, Sage Weil)
-* common,core: osd/osd_types: add flag name (IGNORE_REDIRECT) (`pr#15795 <https://github.com/ceph/ceph/pull/15795>`_, Myoungwon Oh)
-* common,core: rados:  we need to get the latest osdmap when pool does not exists (`pr#13289 <https://github.com/ceph/ceph/pull/13289>`_, song baisen)
-* common,core,tests: Wip cppcheck errors (`pr#14446 <https://github.com/ceph/ceph/pull/14446>`_, Brad Hubbard)
-* common: crc32c: include acconfig.h to fix ceph_crc32c_aarch64() (`pr#15515 <https://github.com/ceph/ceph/pull/15515>`_, Kefu Chai)
-* common: crush/CrushWrapper: fix has_incompat_choose_args (`pr#15218 <https://github.com/ceph/ceph/pull/15218>`_, Sage Weil)
-* common: crush/CrushWrapper: fix has_incompat_choose_args() (`pr#15244 <https://github.com/ceph/ceph/pull/15244>`_, Sage Weil)
-* common: crypto: cleanup NSPR in main thread (`pr#14801 <https://github.com/ceph/ceph/pull/14801>`_, Kefu Chai)
-* common: delete unused conf "filestore_debug_disable_sharded_check" (`pr#13051 <https://github.com/ceph/ceph/pull/13051>`_, Chuanhong Wang)
-* common: denc: add encode/decode for basic_sstring (`pr#15135 <https://github.com/ceph/ceph/pull/15135>`_, Kefu Chai, Casey Bodley)
-* common: do not print error when asok is closed (`pr#14022 <https://github.com/ceph/ceph/pull/14022>`_, Patrick Donnelly)
-* common: fix building against libcryptopp (`pr#14949 <https://github.com/ceph/ceph/pull/14949>`_, Shengjing Zhu)
-* common: Fix clang compilation (`pr#13335 <https://github.com/ceph/ceph/pull/13335>`_, Bartłomiej Święcki)
-* common: Fix heap buffer overflow in do_request (`issue#19393 <http://tracker.ceph.com/issues/19393>`_, `pr#14173 <https://github.com/ceph/ceph/pull/14173>`_, Brad Hubbard)
-* common: fix lockdep vs recursive mutexes (`pr#9940 <https://github.com/ceph/ceph/pull/9940>`_, Adam Kupczyk)
-* common: fix log warnings (`pr#16056 <https://github.com/ceph/ceph/pull/16056>`_, xie xingguo)
-* common: fix Option set_long_description (`pr#16668 <https://github.com/ceph/ceph/pull/16668>`_, Yan Jun)
-* common: fix segfault in public IPv6 addr picking (`issue#19371 <http://tracker.ceph.com/issues/19371>`_, `pr#14124 <https://github.com/ceph/ceph/pull/14124>`_, Fabian Grünbichler)
-* common: fix that $host always expands to localhost instead of actual hostname (`issue#11081 <http://tracker.ceph.com/issues/11081>`_, `pr#12998 <https://github.com/ceph/ceph/pull/12998>`_, liuchang0812)
-* common: fix typo in option of rados_mon_op_timeout's comment (`pr#15681 <https://github.com/ceph/ceph/pull/15681>`_, Leo Zhang)
-* common: Fix unused variable references warnings (`pr#14790 <https://github.com/ceph/ceph/pull/14790>`_, Willem Jan Withagen)
-* common: follow up to new options infrastructure (`pr#16527 <https://github.com/ceph/ceph/pull/16527>`_, John Spray)
-    common: Forward-declare container I/O overloads
-* common: get_process_name: use getprogname on bsd systems (`pr#15338 <https://github.com/ceph/ceph/pull/15338>`_, Mykola Golub)
-* common: get rid of "warning: ignoring return value of ‘strerror_r’" (`pr#12775 <https://github.com/ceph/ceph/pull/12775>`_, xie xingguo)
-* common: global: we need to handle the init_on_startup return value when global_init (`pr#13018 <https://github.com/ceph/ceph/pull/13018>`_, song baisen)
-* common: Implements simple_spin_t in terms of std::atomic_flag (`pr#14370 <https://github.com/ceph/ceph/pull/14370>`_, Jesse Williamson)
-* common: Improved CRC calculation for zero buffers (`pr#11966 <https://github.com/ceph/ceph/pull/11966>`_, Adam Kupczyk)
-* common: include/ceph_features.h uses uint64_t, which is in sys/types.h (`pr#13339 <https://github.com/ceph/ceph/pull/13339>`_, Willem Jan Withagen)
-* common: include/denc: improvements (`pr#12626 <https://github.com/ceph/ceph/pull/12626>`_, Adam C. Emerson)
-* common: include/denc, kv: silence gcc warnings (`pr#13458 <https://github.com/ceph/ceph/pull/13458>`_, Kefu Chai)
-* common: include/denc: remove nullptr runtime magic boundedness check (`pr#13889 <https://github.com/ceph/ceph/pull/13889>`_, Sage Weil)
-* common: include/lru.h: add const to member functions (`pr#15408 <https://github.com/ceph/ceph/pull/15408>`_, yonghengdexin735)
-* common: include/mempool: fix typo in comments (`pr#12772 <https://github.com/ceph/ceph/pull/12772>`_, huangjun)
-* common: include/rados: Fix typo in rados_ioctx_cct() doc (`pr#15220 <https://github.com/ceph/ceph/pull/15220>`_, Jos Collin)
-* common: include: Redo some includes for FreeBSD (`issue#19883 <http://tracker.ceph.com/issues/19883>`_, `pr#15337 <https://github.com/ceph/ceph/pull/15337>`_, Willem Jan Withagen)
-* common: initialize array in struct BackTrace (`pr#15864 <https://github.com/ceph/ceph/pull/15864>`_, Jos Collin)
-* common: initialize _hash in LogEntryKey() (`pr#15615 <https://github.com/ceph/ceph/pull/15615>`_, Jos Collin)
-* common: int_types.h: remove hacks to workaround old systems (`pr#15069 <https://github.com/ceph/ceph/pull/15069>`_, Kefu Chai)
-* common: kv: resolve a crash issue in ~LevelDBStore() (`pr#16553 <https://github.com/ceph/ceph/pull/16553>`_, wumingqiao)
-* common: librados,libradosstriper,test: migrate atomic_t to std::atomic (baragon) (`pr#14658 <https://github.com/ceph/ceph/pull/14658>`_, Jesse Williamson)
-* common: librados, osd: clang fixes (`pr#13768 <https://github.com/ceph/ceph/pull/13768>`_, Kefu Chai)
-* common: libradosstriper: Add example code (`pr#15350 <https://github.com/ceph/ceph/pull/15350>`_, Logan Blyth)
-* common: libradosstriper: fix format injection vulnerability (`issue#20240 <http://tracker.ceph.com/issues/20240>`_, `pr#15674 <https://github.com/ceph/ceph/pull/15674>`_, Stan K)
-* common: libradosstriper: fix MultiAioCompletion leaks on failure (`pr#15471 <https://github.com/ceph/ceph/pull/15471>`_, Kefu Chai)
-* common: make attempts of auth rotating configurable (`pr#12563 <https://github.com/ceph/ceph/pull/12563>`_, xie xingguo)
-* common: Make spinlock delay more conventional (`pr#14248 <https://github.com/ceph/ceph/pull/14248>`_, Brad Hubbard)
-* common: mempool: improve dump; fix buffer accounting bugs (`pr#15403 <https://github.com/ceph/ceph/pull/15403>`_, Sage Weil)
-* common: messages: fix return type name of MOSDMap (`pr#14382 <https://github.com/ceph/ceph/pull/14382>`_, Leo Zhang)
-* common: mgr/PyFormatter: implement dump_format_va (`pr#15634 <https://github.com/ceph/ceph/pull/15634>`_, Sage Weil)
-* common: misc cleanups in common, global, os, osd submodules (`pr#16321 <https://github.com/ceph/ceph/pull/16321>`_, Yan Jun)
-* common: misc fixes detected by crypto shutdown assert (`pr#12925 <https://github.com/ceph/ceph/pull/12925>`_, Sage Weil)
-* common,mon: crush,mon: add weight-set introspection and manipulation commands (`pr#16326 <https://github.com/ceph/ceph/pull/16326>`_, Sage Weil)
-* common,mon: messenger,client,compressor: migrate atomic_t to std::atomic (`pr#14657 <https://github.com/ceph/ceph/pull/14657>`_, Jesse Williamson)
-* common: mon/MonClient: scale backoff interval down when we have a healthy mon session (`issue#20371 <http://tracker.ceph.com/issues/20371>`_, `pr#16576 <https://github.com/ceph/ceph/pull/16576>`_, Kefu Chai, Sage Weil)
-* common,mon: mon,crush: add 'osd crush swap-bucket' command (`pr#15072 <https://github.com/ceph/ceph/pull/15072>`_, Sage Weil)
-* common: msg/async: add assert of ms_async_op_threads > 0 (`pr#15629 <https://github.com/ceph/ceph/pull/15629>`_, linbing)
-* common: msg/async: assert if compiled code doesn't support the configured ms (`pr#12559 <https://github.com/ceph/ceph/pull/12559>`_, Avner BenHanoch)
-* common: msg/async: fix crash that writing char to nonblock-fd gets EAGAIN in EventCenter::wakeup (`pr#13822 <https://github.com/ceph/ceph/pull/13822>`_, liuchang0812)
-* common: msg/async: make recv_stamp more precise (`pr#15810 <https://github.com/ceph/ceph/pull/15810>`_, Pan Liu)
-* common: msg/async/rdma: Add fork safe on RDMA (`pr#13740 <https://github.com/ceph/ceph/pull/13740>`_, Sarit Zubakov)
-* common: msg/async/rdma: clean line endings (`pr#12688 <https://github.com/ceph/ceph/pull/12688>`_, Adir Lev)
-* common: msg/async/rdma: Remove compilation warning (`pr#13142 <https://github.com/ceph/ceph/pull/13142>`_, Sarit Zubakov)
-* common: msg/async/rdma: rename chunk_size to buffer_size (`pr#13666 <https://github.com/ceph/ceph/pull/13666>`_, Adir Lev)
-* common: msg/async/rdma: Support for RoCE v2 and SL (`pr#12556 <https://github.com/ceph/ceph/pull/12556>`_, Oren Duer)
-* common: msg/async/rdma: Update fix broken compilation (`pr#13940 <https://github.com/ceph/ceph/pull/13940>`_, Sarit Zubakov)
-* common: msg/async: return right away in NetHandler::set_priority() if not supported (`pr#14795 <https://github.com/ceph/ceph/pull/14795>`_, Kefu Chai)
-* common: msg/simple: call clear_pipe in wait() shutdown path (`issue#15784 <http://tracker.ceph.com/issues/15784>`_, `pr#12633 <https://github.com/ceph/ceph/pull/12633>`_, Sage Weil)
-* common: msg/SimpleMessenger: error out misplace in set_socket_options (`pr#13961 <https://github.com/ceph/ceph/pull/13961>`_, wangzhengyong)
-* common: msg/simple/Pipe: support IPv6 QoS (`issue#18887 <http://tracker.ceph.com/issues/18887>`_, `pr#13370 <https://github.com/ceph/ceph/pull/13370>`_, Robin H. Johnson)
-* common: .organizationmap: Updated authors (`pr#14360 <https://github.com/ceph/ceph/pull/14360>`_, Jos Collin)
-* common: osdc: fix osdc_osd_seesion perf counter (`pr#13478 <https://github.com/ceph/ceph/pull/13478>`_, Xiaoxi Chen)
-* common: osdc/Objecter: fix bugs in explicit naming of op spg_t (`pr#13534 <https://github.com/ceph/ceph/pull/13534>`_, Sage Weil)
-* common: osdc/Objecter: fix pool dne corner case (`issue#19552 <http://tracker.ceph.com/issues/19552>`_, `pr#14901 <https://github.com/ceph/ceph/pull/14901>`_, Sage Weil)
-* common: osdc/Objecter: handle command target that goes down (`issue#19452 <http://tracker.ceph.com/issues/19452>`_, `pr#14302 <https://github.com/ceph/ceph/pull/14302>`_, Sage Weil)
-* common: osdc/Objecter: release message if it's not handled (`issue#19741 <http://tracker.ceph.com/issues/19741>`_, `pr#15890 <https://github.com/ceph/ceph/pull/15890>`_, Kefu Chai)
-* common: osdc/Objecter: resend RWORDERED ops on full (`issue#19133 <http://tracker.ceph.com/issues/19133>`_, `pr#13759 <https://github.com/ceph/ceph/pull/13759>`_, Sage Weil)
-* common: osd/OSDMap: fix feature commit comment (`pr#15056 <https://github.com/ceph/ceph/pull/15056>`_, Sage Weil)
-* common: osd/OSDMap: get_previous_up_osd_before() may run into endless loop (`pr#12976 <https://github.com/ceph/ceph/pull/12976>`_, Mingxin Liu)
-* common: osd/OSDMap: print require_osd_release (`pr#15974 <https://github.com/ceph/ceph/pull/15974>`_, Sage Weil)
-* common: osd/osd_types: clean up OSDOp printers (`pr#12980 <https://github.com/ceph/ceph/pull/12980>`_, Sage Weil)
-* common: Passing null pointer option_name to operator << in md_config_t::parse_option() (`pr#15881 <https://github.com/ceph/ceph/pull/15881>`_, Jos Collin)
-* common,performance: buffer: allow buffers to be accounted in arbitrary mempools (`pr#15352 <https://github.com/ceph/ceph/pull/15352>`_, Sage Weil)
-* common,performance: common/Finisher: batch handle perfcounter && only send signal when waiter existed (`pr#14363 <https://github.com/ceph/ceph/pull/14363>`_, Jianpeng Ma)
-* common,performance: crc32c: Add ppc64le fast zero optimized assembly (`pr#15100 <https://github.com/ceph/ceph/pull/15100>`_, Andrew Solomon)
-* common,performance: inline_memory: optimized mem_is_zero for non-x64 (`pr#15307 <https://github.com/ceph/ceph/pull/15307>`_, Piotr Dałek)
-* common,performance: kv/rocksdb: supports SliceParts interface (`pr#15058 <https://github.com/ceph/ceph/pull/15058>`_, Haomai Wang)
-* common,performance: osd/OSDMap: make pg_temp more efficient (`pr#15291 <https://github.com/ceph/ceph/pull/15291>`_, Sage Weil)
-* common: possible lockdep false alarm for ThreadPool lock (`issue#18819 <http://tracker.ceph.com/issues/18819>`_, `pr#13258 <https://github.com/ceph/ceph/pull/13258>`_, Mykola Golub)
-* common: prevent unset_dumpable from generating warnings (`pr#16462 <https://github.com/ceph/ceph/pull/16462>`_, Willem Jan Withagen)
-* common: rados: allow "rados purge" to delete objects when osd is full (`pr#13814 <https://github.com/ceph/ceph/pull/13814>`_, Pan Liu)
-* common: rados: more info added to pool deletion error (`issue#19400 <http://tracker.ceph.com/issues/19400>`_, `pr#14235 <https://github.com/ceph/ceph/pull/14235>`_, Vedant Nanda)
-* common,rbd: osdc/Objecter: unify disparate EAGAIN handling paths into one (`pr#16627 <https://github.com/ceph/ceph/pull/16627>`_, Sage Weil)
-* common,rbd,rgw: common/escape: do not escape / in json (`pr#14130 <https://github.com/ceph/ceph/pull/14130>`_, Sage Weil)
-* common,rbd,rgw: common/rgw/rbd: remove some unused variables (`pr#16690 <https://github.com/ceph/ceph/pull/16690>`_, Luo Kexue)
-* common,rdma: msg/async/rdma: automatically set RDMAV_HUGEPAGES_SAFE according to conf (`pr#15755 <https://github.com/ceph/ceph/pull/15755>`_, DanielBar-On)
-* common,rdma: msg/async/rdma: check ulimit (`pr#13655 <https://github.com/ceph/ceph/pull/13655>`_, Sarit Zubakov, Adir Lev)
-* common,rdma: msg/async/rdma: Introduce Device.{cc,h} (`pr#14001 <https://github.com/ceph/ceph/pull/14001>`_, Amir Vadai)
-* common,rdma: msg/async/rdma: Introduce RDMAConnMgr + Debug prints (`pr#14201 <https://github.com/ceph/ceph/pull/14201>`_, Amir Vadai)
-* common,rdma: msg/async/rdma: Move resource handling to Device (`pr#14088 <https://github.com/ceph/ceph/pull/14088>`_, Sarit Zubakov, Amir Vadai)
-* common,rdma: msg/async/rdma: RDMA-CM Initialize device on first connect (`pr#14179 <https://github.com/ceph/ceph/pull/14179>`_, Amir Vadai)
-* common,rdma: msg/async/rdma: reduce number of rdma rx/tx buffers (`pr#13190 <https://github.com/ceph/ceph/pull/13190>`_, Adir Lev)
-* common,rdma: msg/async/rdma: use lists properly (`pr#15908 <https://github.com/ceph/ceph/pull/15908>`_, Adir lev, Adir Lev)
-* common: remove config opt conversion utility (`pr#16480 <https://github.com/ceph/ceph/pull/16480>`_, John Spray)
-* common: remove \n on clog messages (`pr#13794 <https://github.com/ceph/ceph/pull/13794>`_, Sage Weil)
-* common: Remove redundant includes - 2 (`issue#19883 <http://tracker.ceph.com/issues/19883>`_, `pr#15169 <https://github.com/ceph/ceph/pull/15169>`_, Jos Collin)
-* common: Remove redundant includes - 3 (`issue#19883 <http://tracker.ceph.com/issues/19883>`_, `pr#15204 <https://github.com/ceph/ceph/pull/15204>`_, Jos Collin)
-* common: Remove redundant includes - 4 (`issue#19883 <http://tracker.ceph.com/issues/19883>`_, `pr#15251 <https://github.com/ceph/ceph/pull/15251>`_, Jos Collin)
-* common: Remove redundant includes - 5 (`issue#19883 <http://tracker.ceph.com/issues/19883>`_, `pr#15267 <https://github.com/ceph/ceph/pull/15267>`_, Jos Collin)
-* common: Remove redundant includes - 6 (`issue#19883 <http://tracker.ceph.com/issues/19883>`_, `pr#15299 <https://github.com/ceph/ceph/pull/15299>`_, Jos Collin)
-* common: Remove redundant includes (`issue#19883 <http://tracker.ceph.com/issues/19883>`_, `pr#15003 <https://github.com/ceph/ceph/pull/15003>`_, Brad Hubbard)
-* common: Remove redundant includes (`issue#19883 <http://tracker.ceph.com/issues/19883>`_, `pr#15019 <https://github.com/ceph/ceph/pull/15019>`_, Brad Hubbard)
-* common: Remove redundant includes (`issue#19883 <http://tracker.ceph.com/issues/19883>`_, `pr#15042 <https://github.com/ceph/ceph/pull/15042>`_, Brad Hubbard)
-* common: Remove redundant includes (`issue#19883 <http://tracker.ceph.com/issues/19883>`_, `pr#15086 <https://github.com/ceph/ceph/pull/15086>`_, Jos Collin)
-* common: remove useless parameter (`pr#14096 <https://github.com/ceph/ceph/pull/14096>`_, baiyanchun)
-* common: Revamp config option definitions (`issue#20627 <http://tracker.ceph.com/issues/20627>`_, `pr#16211 <https://github.com/ceph/ceph/pull/16211>`_, John Spray, Kefu Chai, Sage Weil)
-* common,rgw: cls/refcount: store and use list of retired tags (`issue#20107 <http://tracker.ceph.com/issues/20107>`_, `pr#15673 <https://github.com/ceph/ceph/pull/15673>`_, Yehuda Sadeh)
-* common: src/common/ceph_string: stringify new osd states (`pr#15751 <https://github.com/ceph/ceph/pull/15751>`_, xie xingguo)
-* common: src/common: change last_work_queue to next_work_queue (`pr#14738 <https://github.com/ceph/ceph/pull/14738>`_, Pan Liu)
-* common: support s390 and unknown architectures in spin-wait loop (`issue#19492 <http://tracker.ceph.com/issues/19492>`_, `pr#14337 <https://github.com/ceph/ceph/pull/14337>`_, Nathan Cutler)
-* common,tests: ceph_test_rados_api_c_read_operations: do not assert per-op rval is correct (`issue#19518 <http://tracker.ceph.com/issues/19518>`_, `pr#16196 <https://github.com/ceph/ceph/pull/16196>`_, Sage Weil)
-* common,tests: ceph_test_rados_api_list: more fix LibRadosListNP.ListObjectsError (`issue#19963 <http://tracker.ceph.com/issues/19963>`_, `pr#15138 <https://github.com/ceph/ceph/pull/15138>`_, Sage Weil)
-* common,tests: test: Make screencandy optional for FreeBSD (`pr#15444 <https://github.com/ceph/ceph/pull/15444>`_, Willem Jan Withagen)
-* common: the latency dumped by "ceph osd perf" is not real (`issue#20749 <http://tracker.ceph.com/issues/20749>`_, `pr#16512 <https://github.com/ceph/ceph/pull/16512>`_, Pan Liu)
-* common,tools: osdmaptool: show all the pg map to osds info (`pr#9419 <https://github.com/ceph/ceph/pull/9419>`_, song baisen)
-* common: tracing: Fix handle leak in TracepointProvider (`pr#12652 <https://github.com/ceph/ceph/pull/12652>`_, Brad Hubbard)
-* common: tracing: fix segv (`issue#18576 <http://tracker.ceph.com/issues/18576>`_, `pr#14304 <https://github.com/ceph/ceph/pull/14304>`_, Anjaneya Chagam)
-* common: Update the error string when res_nsearch() or res_search() fails (`pr#15878 <https://github.com/ceph/ceph/pull/15878>`_, huanwen ren)
-* common: use ref to avoid unnecessary memory copy (`issue#19107 <http://tracker.ceph.com/issues/19107>`_, `pr#13689 <https://github.com/ceph/ceph/pull/13689>`_, liuchang0812)
-* common: use std::move() for better performance (`pr#16620 <https://github.com/ceph/ceph/pull/16620>`_, Xinying Song)
-* common: xio: migrate atomic_t to std::atomic<> (`pr#15230 <https://github.com/ceph/ceph/pull/15230>`_, Jesse Williamson)
-* compressor: conditionalize on HAVE_LZ4 (`pr#17174 <https://github.com/ceph/ceph/pull/17174>`_, Kefu Chai)
-* compressor: fix Mutex::Locker used is not correct (`pr#13935 <https://github.com/ceph/ceph/pull/13935>`_, hechuang)
-* compressor: zlib: fix plugin for non-Intel arches (`pr#14947 <https://github.com/ceph/ceph/pull/14947>`_, Dan Mick)
-* core: auth: 'ceph auth import -i' overwrites caps, if caps are not specified (`issue#18932 <http://tracker.ceph.com/issues/18932>`_, `pr#13468 <https://github.com/ceph/ceph/pull/13468>`_, Vikhyat Umrao)
-* core: auth: Remove unused function in AuthSessionHandler (`pr#16666 <https://github.com/ceph/ceph/pull/16666>`_, Luo Kexue)
-* core: ceph: allow '-' with -i and -o for stdin/stdout (`pr#16359 <https://github.com/ceph/ceph/pull/16359>`_, Sage Weil)
-* core: ceph-create-keys: Add connection timeouts (`pr#11995 <https://github.com/ceph/ceph/pull/11995>`_, Owen Synge)
-* core: ceph-dencoder: Silence coverity CID 1412579 (`pr#15744 <https://github.com/ceph/ceph/pull/15744>`_, Brad Hubbard)
-* core: ceph-detect-init: Add docker detection (`pr#13218 <https://github.com/ceph/ceph/pull/13218>`_, Guillaume Abrioux)
-* core: ceph-disk: Adding retry loop in get_partition_dev() (`pr#14275 <https://github.com/ceph/ceph/pull/14275>`_, Erwan Velu)
-* core: ceph-disk/ceph_disk/main.py: fix calling of the bsdrc init scripts (`pr#14476 <https://github.com/ceph/ceph/pull/14476>`_, Willem Jan Withagen)
-* core: ceph-disk/ceph_disk/main.py: Replace ST_ISBLK() test by is_diskdevice() (`pr#15587 <https://github.com/ceph/ceph/pull/15587>`_, Willem Jan Withagen)
-* core: ceph-disk: ceph-disk on FreeBSD should not use mpath-code (`pr#14837 <https://github.com/ceph/ceph/pull/14837>`_, Willem Jan Withagen)
-* core: ceph-disk: dmcrypt activate must use the same cluster as prepare (`issue#17821 <http://tracker.ceph.com/issues/17821>`_, `pr#13573 <https://github.com/ceph/ceph/pull/13573>`_, Loic Dachary)
-* core: ceph-disk: dmcrypt cluster must default to ceph (`issue#20893 <http://tracker.ceph.com/issues/20893>`_, `pr#16776 <https://github.com/ceph/ceph/pull/16776>`_, Loic Dachary)
-* core: ceph-disk: do not setup_statedir on trigger (`issue#19941 <http://tracker.ceph.com/issues/19941>`_, `pr#15410 <https://github.com/ceph/ceph/pull/15410>`_, Loic Dachary)
-* core: ceph-disk: enable directory backed OSD at boot time (`issue#19628 <http://tracker.ceph.com/issues/19628>`_, `pr#14546 <https://github.com/ceph/ceph/pull/14546>`_, Loic Dachary)
-* core: ceph-disk: Fix getting wrong group name when --setgroup in bluestore (`issue#18955 <http://tracker.ceph.com/issues/18955>`_, `pr#13457 <https://github.com/ceph/ceph/pull/13457>`_, craigchi)
-* core: ceph-disk: FreeBSD changes to get it working and passing tests (`pr#12086 <https://github.com/ceph/ceph/pull/12086>`_, Willem Jan Withagen)
-* core: ceph-disk: implement prepare --no-locking (`pr#14728 <https://github.com/ceph/ceph/pull/14728>`_, Dan van der Ster, Loic Dachary)
-* core: ceph_disk/main.py: Allow FreeBSD zap a OSD disk (`pr#15642 <https://github.com/ceph/ceph/pull/15642>`_, Willem Jan Withagen)
-* core: ceph-disk,osd: add support for crush device classes (`issue#19513 <http://tracker.ceph.com/issues/19513>`_, `pr#14436 <https://github.com/ceph/ceph/pull/14436>`_, Loic Dachary)
-* core: ceph-disk: Populate mount options when running "list" (`issue#17331 <http://tracker.ceph.com/issues/17331>`_, `pr#14293 <https://github.com/ceph/ceph/pull/14293>`_, Brad Hubbard)
-* core: ceph-disk: Reporting /sys directory in get_partition_dev() (`pr#14080 <https://github.com/ceph/ceph/pull/14080>`_, Erwan Velu)
-* core: ceph-disk: Revert "Revert "change get_dmcrypt_key test to support different cluster name"" (`pr#13600 <https://github.com/ceph/ceph/pull/13600>`_, Loic Dachary)
-* core: ceph-disk: separate ceph-osd --check-needs-\* logs (`issue#19888 <http://tracker.ceph.com/issues/19888>`_, `pr#15016 <https://github.com/ceph/ceph/pull/15016>`_, Loic Dachary)
-* core: ceph-disk: set the default systemd unit timeout to 3h (`issue#20229 <http://tracker.ceph.com/issues/20229>`_, `pr#15585 <https://github.com/ceph/ceph/pull/15585>`_, Loic Dachary)
-* core: ceph-disk: support osd new (`pr#15432 <https://github.com/ceph/ceph/pull/15432>`_, Loic Dachary, Sage Weil)
-* core: ceph-disk: Write 10M to all partitions before zapping (`issue#18962 <http://tracker.ceph.com/issues/18962>`_, `pr#13766 <https://github.com/ceph/ceph/pull/13766>`_, Wido den Hollander)
-* core: ceph: do not throw TypeError on connection failure (`pr#13268 <https://github.com/ceph/ceph/pull/13268>`_, Kefu Chai)
-* core: ceph.in: Fix couple of minor issues on the messages (`pr#12797 <https://github.com/ceph/ceph/pull/12797>`_, Dave Chen)
-* core: ceph-objectstore-tool: do not populate snapmapper with missing clones (`issue#19943 <http://tracker.ceph.com/issues/19943>`_, `pr#15787 <https://github.com/ceph/ceph/pull/15787>`_, Sage Weil)
-* core: ceph-osd: fix auto detect which objectstore is currently running (`issue#20865 <http://tracker.ceph.com/issues/20865>`_, `pr#16717 <https://github.com/ceph/ceph/pull/16717>`_, Yanhu Cao)
-* core: ceph-osd: --flush-journal: sporadic segfaults on exit (`issue#18820 <http://tracker.ceph.com/issues/18820>`_, `pr#13311 <https://github.com/ceph/ceph/pull/13311>`_, Alexey Sheplyakov)
-* core: client/SyntheticClient.cc: Fix warning in random_walk (`issue#19445 <http://tracker.ceph.com/issues/19445>`_, `pr#14308 <https://github.com/ceph/ceph/pull/14308>`_, Brad Hubbard)
-* core: cls/timeindex: clean up cls_timeindex_client.h|cc (`pr#13987 <https://github.com/ceph/ceph/pull/13987>`_, Shinobu Kinjo)
-* core: common/options: remove mon_warn_osd_usage_min_max_delta from options.cc too (`pr#16488 <https://github.com/ceph/ceph/pull/16488>`_, Sage Weil)
-* core: common/TrackedOp: allow dumping historic ops sorted by duration (`pr#14050 <https://github.com/ceph/ceph/pull/14050>`_, Piotr Dałek)
-* core: compressor: add LZ4 support (`pr#15434 <https://github.com/ceph/ceph/pull/15434>`_, Haomai Wang)
-* core: compressor: optimize header file dependency (`pr#15187 <https://github.com/ceph/ceph/pull/15187>`_, Brad Hubbard, Xiaowei Chen)
-* core: Context: C_ContextsBase: delete enclosed contexts in dtor (`issue#20432 <http://tracker.ceph.com/issues/20432>`_, `pr#16159 <https://github.com/ceph/ceph/pull/16159>`_, Kefu Chai)
-* core: crush/CrushWrapper: chooseargs encoding fix (`pr#15984 <https://github.com/ceph/ceph/pull/15984>`_, Ilya Dryomov)
-* core: crush/CrushWrapper: make get_immediate_parent[_id] ignore per-class shadow hierarchy (`issue#20546 <http://tracker.ceph.com/issues/20546>`_, `pr#16221 <https://github.com/ceph/ceph/pull/16221>`_, Sage Weil)
-* core: crush, mon: make jewel the lower bound for client/crush compat for new clusters (`pr#15370 <https://github.com/ceph/ceph/pull/15370>`_, Sage Weil)
-* core: erasure-code: optimize header file dependency (`pr#15172 <https://github.com/ceph/ceph/pull/15172>`_, Brad Hubbard, Xiaowei Chen)
-* core: erasure-code: Remove duplicate of isa-l files (`pr#15372 <https://github.com/ceph/ceph/pull/15372>`_, Ganesh Mahalingam)
-* core: erasure-code: sync jerasure/gf-complete submodules (`pr#14424 <https://github.com/ceph/ceph/pull/14424>`_, Loic Dachary)
-* core: filestore: migrate atomic_t to std::atomic<> (`pr#15228 <https://github.com/ceph/ceph/pull/15228>`_, Jesse Williamson)
-* core: Give requested scrub work a higher priority (`issue#15789 <http://tracker.ceph.com/issues/15789>`_, `pr#14488 <https://github.com/ceph/ceph/pull/14488>`_, David Zafman)
-* core: global: start removing g_ceph_context (`pr#12149 <https://github.com/ceph/ceph/pull/12149>`_, Adam C. Emerson)
-* core: HashIndex.cc: add compat.h for ENODATA (`pr#16697 <https://github.com/ceph/ceph/pull/16697>`_, Willem Jan Withagen)
-* core: include/denc: add {encode,decode}_nohead for denc_traits<basic_string> (`issue#18938 <http://tracker.ceph.com/issues/18938>`_, `pr#14099 <https://github.com/ceph/ceph/pull/14099>`_, Kefu Chai)
-* core: include/mempool.h: fix Clangs complaint about types (`pr#13523 <https://github.com/ceph/ceph/pull/13523>`_, Willem Jan Withagen)
-* core: include/types.h, introduce host_to_ceph_errno (`pr#15496 <https://github.com/ceph/ceph/pull/15496>`_, Willem Jan Withagen)
-* core: Install Pecan for FreeBSD (`pr#15610 <https://github.com/ceph/ceph/pull/15610>`_, Willem Jan Withagen)
-* core: introduce (and fix) code to pass errno to other OSes (`pr#15495 <https://github.com/ceph/ceph/pull/15495>`_, Willem Jan Withagen)
-* core: introduce DirectMessenger (`pr#14755 <https://github.com/ceph/ceph/pull/14755>`_, Casey Bodley, Matt Benjamin)
-* core: kv/RocksDBStore: abort if rocksdb EIO, don't return incorrect result (`pr#15862 <https://github.com/ceph/ceph/pull/15862>`_, Haomai Wang)
-* core: kv/RocksDBStore: use vector instead of VLA for holding slices (`pr#16615 <https://github.com/ceph/ceph/pull/16615>`_, Kefu Chai)
-* core: libradosstriper: Initialize member variable m_writeRc in WriteCompletionData (`pr#16780 <https://github.com/ceph/ceph/pull/16780>`_, amitkuma)
-* core: luminous: Improve size scrub error handling and ignore system attrs in xattr checking (`issue#21051 <http://tracker.ceph.com/issues/21051>`_, `issue#18836 <http://tracker.ceph.com/issues/18836>`_, `issue#20243 <http://tracker.ceph.com/issues/20243>`_, `pr#17196 <https://github.com/ceph/ceph/pull/17196>`_, David Zafman)
-* core: luminous: Include front/back interface names in OSD metadata (`issue#21048 <http://tracker.ceph.com/issues/21048>`_, `issue#20956 <http://tracker.ceph.com/issues/20956>`_, `pr#17193 <https://github.com/ceph/ceph/pull/17193>`_, John Spray)
-* core: luminous: mon: bug in functon reweight_by_utilization (`issue#21079 <http://tracker.ceph.com/issues/21079>`_, `issue#20970 <http://tracker.ceph.com/issues/20970>`_, `pr#17198 <https://github.com/ceph/ceph/pull/17198>`_, xie xingguo)
-* core: luminous: mon: "ceph osd crush rule rename" support (`pr#17260 <https://github.com/ceph/ceph/pull/17260>`_, xie xingguo)
-* core: luminous: multisite: FAILED assert(prev_iter != pos_to_prev.end()) in RGWMetaSyncShardCR::collect_children() (`issue#21097 <http://tracker.ceph.com/issues/21097>`_, `issue#20906 <http://tracker.ceph.com/issues/20906>`_, `pr#17234 <https://github.com/ceph/ceph/pull/17234>`_, Casey Bodley)
-* core: luminous: osd: osd_scrub_during_recovery only considers primary, not replicas (`issue#18206 <http://tracker.ceph.com/issues/18206>`_, `issue#21077 <http://tracker.ceph.com/issues/21077>`_, `pr#17195 <https://github.com/ceph/ceph/pull/17195>`_, David Zafman)
-* core: luminous: src/common/LogClient.cc: 310: FAILED assert(num_unsent <= log_queue.size()) (`issue#20965 <http://tracker.ceph.com/issues/20965>`_, `issue#18209 <http://tracker.ceph.com/issues/18209>`_, `pr#17197 <https://github.com/ceph/ceph/pull/17197>`_, Sage Weil)
-* core: make the conversion from wire error to host OS work (`pr#15780 <https://github.com/ceph/ceph/pull/15780>`_, Willem Jan Withagen)
-* core: Merge pull request #16755 from ivancich/wip-pull-new-dmclock (`pr#16922 <https://github.com/ceph/ceph/pull/16922>`_, Gregory Farnum)
-* core: messages: default-initialize MOSDPGRecoveryDelete[Reply] members (`pr#16584 <https://github.com/ceph/ceph/pull/16584>`_, Greg Farnum)
-* core: messages: Initialize members in MMDSTableRequest (`pr#16810 <https://github.com/ceph/ceph/pull/16810>`_, amitkuma)
-* core: messages: Initialize member variables (`pr#16819 <https://github.com/ceph/ceph/pull/16819>`_, amitkuma)
-* core: messages: Initialize member variables (`pr#16839 <https://github.com/ceph/ceph/pull/16839>`_, amitkuma)
-* core: messages: Initializing member variable in MMDSCacheRejoin (`pr#16791 <https://github.com/ceph/ceph/pull/16791>`_, amitkuma)
-* core: messages/MOSDOp: fix pg_t decoding for version <7 decoding (`issue#19005 <http://tracker.ceph.com/issues/19005>`_, `pr#13537 <https://github.com/ceph/ceph/pull/13537>`_, Sage Weil)
-* core: messages/MOSDPGTrim: add the missed HEAD_VERSION AND COMPAT_VERSION (`issue#18266 <http://tracker.ceph.com/issues/18266>`_, `pr#12517 <https://github.com/ceph/ceph/pull/12517>`_, huangjun)
-* core: messages/MOSDPing.h: drop unused fields (`pr#15843 <https://github.com/ceph/ceph/pull/15843>`_, Piotr Dałek)
-* core: messages/MOSDPing: initialize MOSDPing padding (`issue#20323 <http://tracker.ceph.com/issues/20323>`_, `pr#15714 <https://github.com/ceph/ceph/pull/15714>`_, Sage Weil)
-* core: messages/MOSDSubOp: Make encode_payload can be reentrant (`pr#12654 <https://github.com/ceph/ceph/pull/12654>`_, Haomai Wang)
-* core: messages: remove compat cruft (`pr#14475 <https://github.com/ceph/ceph/pull/14475>`_, Sage Weil)
-* core: mgr/MgrClient: do not attempt to access a global variable for config (`pr#16544 <https://github.com/ceph/ceph/pull/16544>`_, Jason Dillaman)
-* core: mgr/MgrClient: use unique_ptr for MgrClient::session (`issue#19097 <http://tracker.ceph.com/issues/19097>`_, `pr#13685 <https://github.com/ceph/ceph/pull/13685>`_, Kefu Chai)
-* core,mgr: mgr/DaemonServer: stop spamming log with pg stats (`pr#15487 <https://github.com/ceph/ceph/pull/15487>`_, Sage Weil)
-* core,mgr: mgr,librados: service map (`pr#15858 <https://github.com/ceph/ceph/pull/15858>`_, Yehuda Sadeh, John Spray, Sage Weil)
-* core,mgr,mon: mgr,mon: enable/disable mgr modules via 'ceph mgr module ...' commands (`pr#15958 <https://github.com/ceph/ceph/pull/15958>`_, Sage Weil)
-* core,mgr,mon: mon,mgr: tag some commands for ceph-mgr (`pr#13617 <https://github.com/ceph/ceph/pull/13617>`_, Sage Weil)
-* core,mgr,mon: mon/PGMap: fix osd_epoch update when removing osd_stat (`issue#20208 <http://tracker.ceph.com/issues/20208>`_, `pr#15573 <https://github.com/ceph/ceph/pull/15573>`_, Sage Weil)
-* core,mgr: mon/PGMap: slightly better debugging around pgmap updates (`pr#15820 <https://github.com/ceph/ceph/pull/15820>`_, Sage Weil)
-* core,mgr,tests: qa: flush out monc's dropped msgs on msgr failure injection (`issue#20371 <http://tracker.ceph.com/issues/20371>`_, `pr#16484 <https://github.com/ceph/ceph/pull/16484>`_, Joao Eduardo Luis)
-* core,mgr,tests: qa/suites/rados/rest: test restful mgr module (`pr#15604 <https://github.com/ceph/ceph/pull/15604>`_, Sage Weil)
-* core: misc: SCA fixes (`pr#14426 <https://github.com/ceph/ceph/pull/14426>`_, Danny Al-Gaaf)
-* core,mon: crush, mon: simplify device class manipulation commands (`pr#16388 <https://github.com/ceph/ceph/pull/16388>`_, xie xingguo)
-* core: mon,mgr: fix "ceph osd df", add some tools to find untested commands (`issue#20256 <http://tracker.ceph.com/issues/20256>`_, `pr#15675 <https://github.com/ceph/ceph/pull/15675>`_, Greg Farnum)
-* core: mon/MonClient: discard stray messages from non-acitve conns (`issue#19015 <http://tracker.ceph.com/issues/19015>`_, `pr#13656 <https://github.com/ceph/ceph/pull/13656>`_, Kefu Chai)
-* core: mon/MonClient: don't return zero global_id (`issue#19134 <http://tracker.ceph.com/issues/19134>`_, `pr#13853 <https://github.com/ceph/ceph/pull/13853>`_, "Yan, Zheng", Kefu Chai)
-* core: mon/MonClient: hunt monitors in parallel (`issue#16091 <http://tracker.ceph.com/issues/16091>`_, `pr#11128 <https://github.com/ceph/ceph/pull/11128>`_, Steven Dieffenbach, Kefu Chai)
-* core: mon/MonClient: persist global_id across re-connecting (`issue#18968 <http://tracker.ceph.com/issues/18968>`_, `pr#13550 <https://github.com/ceph/ceph/pull/13550>`_, Kefu Chai)
-* core: mon/MonClient: respect the priority in SRV RR (`issue#5249 <http://tracker.ceph.com/issues/5249>`_, `pr#15964 <https://github.com/ceph/ceph/pull/15964>`_, Kefu Chai)
-* core,mon: mon/LogMonitor: 'log last' command (`pr#15497 <https://github.com/ceph/ceph/pull/15497>`_, Sage Weil)
-* core: mon/MonmapMonitor: use `__func__` instead of hard code function name (`pr#16037 <https://github.com/ceph/ceph/pull/16037>`_, Yanhu Cao)
-* core,mon: mon/MgrStatMonitor: avoid dup health warnings during luminous upgrade (`issue#20435 <http://tracker.ceph.com/issues/20435>`_, `pr#15986 <https://github.com/ceph/ceph/pull/15986>`_, Sage Weil)
-* core,mon: mon/MgrStatMonitor: keep mgrstat version ahead of pgmon (`issue#20219 <http://tracker.ceph.com/issues/20219>`_, `pr#15584 <https://github.com/ceph/ceph/pull/15584>`_, Sage Weil)
-* core,mon: mon,osd: add crush_version to OSDMap, and allow crush map updates to gate on crush_version (`pr#15533 <https://github.com/ceph/ceph/pull/15533>`_, Sage Weil)
-* core,mon: mon,osd: decouple creating pgs from pgmap (`pr#13999 <https://github.com/ceph/ceph/pull/13999>`_, Kefu Chai)
-* core,mon: mon, osd: misc fixes (`pr#16078 <https://github.com/ceph/ceph/pull/16078>`_, xie xingguo)
-* core,mon: mon/OSDMonitor: cancel mapping job from update_from_paxos (`issue#20067 <http://tracker.ceph.com/issues/20067>`_, `pr#15320 <https://github.com/ceph/ceph/pull/15320>`_, Sage Weil)
-* core,mon: mon/OSDMonitor: make 'osd crush move ...' work on osds (`issue#18587 <http://tracker.ceph.com/issues/18587>`_, `pr#12981 <https://github.com/ceph/ceph/pull/12981>`_, Sage Weil)
-* core,mon: mon/OSDMonitor: make snaps on tier pool should not be allowed (`pr#9348 <https://github.com/ceph/ceph/pull/9348>`_, Mingxin Liu)
-* core,mon: mon/OSDMonitor: use up set instead of acting set in reweight_by_utilization (`pr#13802 <https://github.com/ceph/ceph/pull/13802>`_, Mingxin Liu)
-* core,mon: mon,osd: new mechanism for managing full and nearfull OSDs for luminous (`pr#13615 <https://github.com/ceph/ceph/pull/13615>`_, Sage Weil)
-* core,mon: mon/PGMap: call blocked requests ERR not WARN (`pr#15501 <https://github.com/ceph/ceph/pull/15501>`_, Sage Weil)
-* core: mon,osd: add require_min_compat_client setting to enforce and clarify client compatibility (`pr#14959 <https://github.com/ceph/ceph/pull/14959>`_, Sage Weil)
-* core: mon,osd: luminous feature bits, require flags, upgrade gates (`pr#13278 <https://github.com/ceph/ceph/pull/13278>`_, Sage Weil)
-* core: mon, osd: misc fixes and cleanups (`pr#16160 <https://github.com/ceph/ceph/pull/16160>`_, xie xingguo)
-* core: mon, osd: misc fixes (`pr#16283 <https://github.com/ceph/ceph/pull/16283>`_, xie xingguo)
-* core: mon/OSDMonitor: _apply_remap -> _apply_upmap; less code redundancy (`pr#15846 <https://github.com/ceph/ceph/pull/15846>`_, xie xingguo)
-* core: mon/OSDMonitor: batch noup/noin osds support (`pr#15725 <https://github.com/ceph/ceph/pull/15725>`_, xie xingguo)
-* core: mon/OSDMonitor: batch OSDs nodown/noout support (`pr#15381 <https://github.com/ceph/ceph/pull/15381>`_, xie xingguo)
-* core: mon/OSDMonitor: change info in 'osd failed' messages (`pr#15321 <https://github.com/ceph/ceph/pull/15321>`_, Sage Weil)
-* core: mon/OSDMonitor: do not allow crush device classes until luminous (`pr#16188 <https://github.com/ceph/ceph/pull/16188>`_, Sage Weil)
-* core: mon/OSDMonitor: fixup sortbitwise flag warning (`pr#12682 <https://github.com/ceph/ceph/pull/12682>`_, huanwen ren)
-* core: mon/OSDMonitor: make mapping job behave if mon_osd_prime_pg_temp = false (`issue#19020 <http://tracker.ceph.com/issues/19020>`_, `pr#13574 <https://github.com/ceph/ceph/pull/13574>`_, Sage Weil)
-* core: mon/OSDMonitor: osd crush set-device-class (`issue#19307 <http://tracker.ceph.com/issues/19307>`_, `pr#14039 <https://github.com/ceph/ceph/pull/14039>`_, Loic Dachary)
-* core: mon/OSDMonitor: set last_force_op_resend on overlay pool too (`issue#18366 <http://tracker.ceph.com/issues/18366>`_, `pr#12712 <https://github.com/ceph/ceph/pull/12712>`_, Sage Weil)
-* core: mon/OSDMonitor: should propose osdmap update when cluster addr changed (`pr#11065 <https://github.com/ceph/ceph/pull/11065>`_, Mingxin Liu)
-* core: mon/OSDMonitor: skip prime_pg_temp if mapping is prior to osdmap (`pr#14826 <https://github.com/ceph/ceph/pull/14826>`_, Kefu Chai)
-* core: mon,osd/OSDMap: a couple pg-upmap fixes (`pr#15319 <https://github.com/ceph/ceph/pull/15319>`_, Sage Weil)
-* core: mon/PGMap: factor mon_osd_full_ratio into MAX AVAIL calc (`issue#18522 <http://tracker.ceph.com/issues/18522>`_, `pr#12923 <https://github.com/ceph/ceph/pull/12923>`_, Sage Weil)
-* core: mon/PGMonitor: fix wrongly report "pg stuck in inactive" (`pr#14391 <https://github.com/ceph/ceph/pull/14391>`_, Mingxin Liu)
-* core,mon,rbd: mon,osd: new rbd-based cephx cap profiles (`pr#15991 <https://github.com/ceph/ceph/pull/15991>`_, Jason Dillaman)
-* core: msg/async/AsyncConnection: keepalive objecter ping connection to avoid timeout (`pr#14009 <https://github.com/ceph/ceph/pull/14009>`_, Haomai Wang)
-* core: msg/async/AsyncConnection: socket's fd can be zero, avoid false assert (`pr#13080 <https://github.com/ceph/ceph/pull/13080>`_, Haomai Wang)
-* core: msg/async: avoid requeue racing with handle_write (`issue#20093 <http://tracker.ceph.com/issues/20093>`_, `pr#15324 <https://github.com/ceph/ceph/pull/15324>`_, Haomai Wang)
-* core: msg/async/dpdk: fix compile errors (`pr#12698 <https://github.com/ceph/ceph/pull/12698>`_, Haomai Wang)
-* core: msg/async: fix deleted_conn is out of sync with conns (`issue#20230 <http://tracker.ceph.com/issues/20230>`_, `pr#15645 <https://github.com/ceph/ceph/pull/15645>`_, Haomai Wang)
-* core: msg/async: fix the bug of inaccurate calculation of l_msgr_send_bytes (`pr#16526 <https://github.com/ceph/ceph/pull/16526>`_, Jin Cai)
-* core: msg/async/rdma: add log to show correct destruct queuepair (`pr#13412 <https://github.com/ceph/ceph/pull/13412>`_, Haomai Wang)
-* core: msg/async/rdma: add perf counters to RDMA backend (`pr#13484 <https://github.com/ceph/ceph/pull/13484>`_, Haomai Wang)
-* core: msg/async/rdma: destroy QueuePair if needed (`pr#13810 <https://github.com/ceph/ceph/pull/13810>`_, Haomai Wang)
-* core: msg/async/rdma: don't need to delete event when tcp connection isn't … (`pr#13528 <https://github.com/ceph/ceph/pull/13528>`_, Haomai Wang)
-* core: msg/async/rdma: fix ceph_clock_now calls (`pr#12711 <https://github.com/ceph/ceph/pull/12711>`_, Haomai Wang)
-* core: msg/async/rdma: fix potential racing connection usage (`pr#13738 <https://github.com/ceph/ceph/pull/13738>`_, Haomai Wang)
-* core: msg/async/rdma: make Infiniband can be forkable (`pr#13525 <https://github.com/ceph/ceph/pull/13525>`_, Haomai Wang)
-* core: msg/async/rdm: fix leak when existing failure in ip network (`pr#13435 <https://github.com/ceph/ceph/pull/13435>`_, Haomai Wang)
-* core: msg/async: set thread name for msgr worker (`pr#13699 <https://github.com/ceph/ceph/pull/13699>`_, Haomai Wang)
-* core: msg/async/Stack.cc: use of pthread_setname_np() needs compat.h (`pr#13825 <https://github.com/ceph/ceph/pull/13825>`_, Willem Jan Withagen)
-* core: msg/async: support IPv6 QoS (`issue#18887 <http://tracker.ceph.com/issues/18887>`_, `issue#18928 <http://tracker.ceph.com/issues/18928>`_, `pr#13418 <https://github.com/ceph/ceph/pull/13418>`_, Robin H. Johnson)
-* core: msg/simple: fix missing unlock when already bind (`pr#13267 <https://github.com/ceph/ceph/pull/13267>`_, Haomai Wang)
-* core: msg/simple/Pipe:the returned value for do_recv unequal to zero (`pr#10272 <https://github.com/ceph/ceph/pull/10272>`_, zhang.zezhu)
-* core: objclass: modify omap_get_{keys,vals} api (`pr#16667 <https://github.com/ceph/ceph/pull/16667>`_, Yehuda Sadeh, Casey Bodley)
-* core: objclass-sdk: use namespace ceph for bufferlist (`pr#15581 <https://github.com/ceph/ceph/pull/15581>`_, Neha Ojha)
-* core: os/bluestore: do not use nullptr to calc the size of bluestore_pextent_t (`pr#14030 <https://github.com/ceph/ceph/pull/14030>`_, Kefu Chai)
-* core: os/bluestore rm unused variable in aio_read() (`pr#13530 <https://github.com/ceph/ceph/pull/13530>`_, tangwenjun)
-* core: os/bluestore: silence gcc warning (`pr#14028 <https://github.com/ceph/ceph/pull/14028>`_, Kefu Chai)
-* core: osdc: clean up osd_command/start_mon_command interfaces (`pr#13727 <https://github.com/ceph/ceph/pull/13727>`_, John Spray)
-* core: osdc/Objecter: fix possible OSDSession leak on wrong connection (`pr#13365 <https://github.com/ceph/ceph/pull/13365>`_, xie xingguo)
-* core: osdc/Objecter: resend pg commands on interval change (`issue#18358 <http://tracker.ceph.com/issues/18358>`_, `pr#12869 <https://github.com/ceph/ceph/pull/12869>`_, Samuel Just)
-* core: osdc/Objecter: respect epoch barrier in _op_submit() (`issue#19396 <http://tracker.ceph.com/issues/19396>`_, `pr#14190 <https://github.com/ceph/ceph/pull/14190>`_, Ilya Dryomov)
-* core: osd/: don't leak context for Blessed\*Context or RecoveryQueueAsync (`issue#18809 <http://tracker.ceph.com/issues/18809>`_, `pr#13342 <https://github.com/ceph/ceph/pull/13342>`_, Samuel Just)
-* core: OSD: drop parameter t from merge_log() (`pr#13923 <https://github.com/ceph/ceph/pull/13923>`_, xie xingguo)
-* core: osd/ECBackend: cleanup for unnecessary copy with pg_stat_t (`pr#12564 <https://github.com/ceph/ceph/pull/12564>`_, Yunchuan Wen)
-* core: osd/ECBackend: drop duplicated pending_commit field from << operator (`pr#13665 <https://github.com/ceph/ceph/pull/13665>`_, xie xingguo)
-* core: osd/ECBackend: only need check missing_loc when doing recovery (`pr#12526 <https://github.com/ceph/ceph/pull/12526>`_, huangjun)
-* core:   osd/ECBackend: remove unused variable "ReadCB" (`pr#12543 <https://github.com/ceph/ceph/pull/12543>`_, huangjun)
-* core: osd/ECTransaction: cleanup the redundant check which works in overwrite IO context (`pr#15765 <https://github.com/ceph/ceph/pull/15765>`_, tang.jin)
-* core: osd/ECTransaction: only read partial stripes when below \*original\* object size (`issue#19882 <http://tracker.ceph.com/issues/19882>`_, `pr#15712 <https://github.com/ceph/ceph/pull/15712>`_, Sage Weil)
-* core: osd/filestore: Revert "os/filestore: move ondisk in front (`issue#20524 <http://tracker.ceph.com/issues/20524>`_, `pr#16156 <https://github.com/ceph/ceph/pull/16156>`_, Kefu Chai)
-* core: osd,librados: add manifest, redirect (`pr#15325 <https://github.com/ceph/ceph/pull/15325>`_, Sage Weil)
-* core: osd,librados: cmpext support (`pr#14715 <https://github.com/ceph/ceph/pull/14715>`_, Zhengyong Wang, David Disseldorp, Mike Christie)
-* core: osd,librados: remove clone_range and associated multi-object cruft (`pr#13008 <https://github.com/ceph/ceph/pull/13008>`_, Samuel Just)
-* core: osd, messages/MOSDPing: bunch of fixes related to ping inflation (`pr#15727 <https://github.com/ceph/ceph/pull/15727>`_, Piotr Dałek)
-* core: osd/mon/mds: fix `config set` tell command (`issue#20803 <http://tracker.ceph.com/issues/20803>`_, `pr#16700 <https://github.com/ceph/ceph/pull/16700>`_, John Spray)
-* core: osd,mon: misc full fixes and cleanups (`pr#13968 <https://github.com/ceph/ceph/pull/13968>`_, David Zafman)
-* core: osd/OpRequest: dump both name and addr for the client op (`pr#12691 <https://github.com/ceph/ceph/pull/12691>`_, runsisi)
-* core: osd/OSD: bump up current version; conditionally encoding manifest into oi (`pr#15687 <https://github.com/ceph/ceph/pull/15687>`_, xie xingguo)
-* core: osd/osd_internal_types: wake snaptrimmer on put_read lock, too (`issue#19131 <http://tracker.ceph.com/issues/19131>`_, `pr#13755 <https://github.com/ceph/ceph/pull/13755>`_, Sage Weil)
-* core: osd/OSDMap: bump encoding version for require_min_compat_client (`pr#15046 <https://github.com/ceph/ceph/pull/15046>`_, "Yan, Zheng")
-* core: osd/OSDMap: Change \*pg_to_\* to return void (`pr#15684 <https://github.com/ceph/ceph/pull/15684>`_, Brad Hubbard)
-* core: osd/OSDMap: don't set weight to IN when OSD is destroyed (`issue#19119 <http://tracker.ceph.com/issues/19119>`_, `pr#13730 <https://github.com/ceph/ceph/pull/13730>`_, Ilya Dryomov)
-* core: osd/OSDMap: hide require_osd and sortbitwise flags (`pr#14440 <https://github.com/ceph/ceph/pull/14440>`_, Sage Weil)
-* core: osd/OSDMap: improve upmap calculation (`issue#19818 <http://tracker.ceph.com/issues/19818>`_, `pr#14902 <https://github.com/ceph/ceph/pull/14902>`_, Sage Weil)
-* core: osd/OSDMap: Uncomment code to enable private default constructors (`pr#12597 <https://github.com/ceph/ceph/pull/12597>`_, Brad Hubbard)
-* core: osd/OSD: tolerate any 'set-device-class' error on OSD startup (`pr#16812 <https://github.com/ceph/ceph/pull/16812>`_, xie xingguo)
-* core: osd/osd_type: Fix logging output (`pr#12778 <https://github.com/ceph/ceph/pull/12778>`_, Brad Hubbard)
-* core: osd/osd_types: Move comment to more relevant position (`pr#12779 <https://github.com/ceph/ceph/pull/12779>`_, Brad Hubbard)
-* core: osd/osd_types: print notify-ack op properly (`pr#12585 <https://github.com/ceph/ceph/pull/12585>`_, Sage Weil)
-* core: osd/PG: add new have_unfound() function in MissingLoc (`pr#12668 <https://github.com/ceph/ceph/pull/12668>`_, huangjun)
-* core: osd/PG: Add two new mClock implementations of the PG sharded operator queue (`pr#14997 <https://github.com/ceph/ceph/pull/14997>`_, J. Eric Ivancich)
-* core: osd/PG.cc: Optimistic estimation on PG.last_active (`pr#14799 <https://github.com/ceph/ceph/pull/14799>`_, Xiaoxi Chen)
-* core: osd/PG.cc: unify the call of checking whether lock is held (`pr#15013 <https://github.com/ceph/ceph/pull/15013>`_, Jin Cai)
-* core: osd/PG: check the connection first in fulfill_log (`pr#12579 <https://github.com/ceph/ceph/pull/12579>`_, huangjun)
-* core: osd/PG: conditionally retry on receiving pg-notify when Primary is Incomplete (`pr#13942 <https://github.com/ceph/ceph/pull/13942>`_, xie xingguo)
-* core: osd/PG: drop pre-firefly compat_mode for choose_acting (`pr#15057 <https://github.com/ceph/ceph/pull/15057>`_, Sage Weil)
-* core: osd/PG: fix lost unfound + delete when there are no missing objects (`issue#20904 <http://tracker.ceph.com/issues/20904>`_, `pr#16809 <https://github.com/ceph/ceph/pull/16809>`_, Josh Durgin)
-* core: osd/PG: fix possible overflow on unfound objects (`pr#12669 <https://github.com/ceph/ceph/pull/12669>`_, huangjun)
-* core: osd/PG: fix warning so we discard_event() on a no-op state change (`pr#16655 <https://github.com/ceph/ceph/pull/16655>`_, Sage Weil)
-* core: osd/PG: ignore CancelRecovery in NotRecovering (`issue#20804 <http://tracker.ceph.com/issues/20804>`_, `pr#16638 <https://github.com/ceph/ceph/pull/16638>`_, Sage Weil)
-* core: osd/PGLog: avoid infinite loop if missing version is corrupted (`pr#16798 <https://github.com/ceph/ceph/pull/16798>`_, Josh Durgin)
-* core: osd/PGLog: fix inaccurate missing assert (`issue#20753 <http://tracker.ceph.com/issues/20753>`_, `pr#16539 <https://github.com/ceph/ceph/pull/16539>`_, Josh Durgin)
-* core: osd/PGLog: fix index for parent and child log on split (`issue#18975 <http://tracker.ceph.com/issues/18975>`_, `pr#13493 <https://github.com/ceph/ceph/pull/13493>`_, Sage Weil)
-* core: osd/pglog: remove loop through empty collection (`pr#15121 <https://github.com/ceph/ceph/pull/15121>`_, J. Eric Ivancich)
-* core: osd/PGLog: skip ERROR entires in _merge_object_divergent_entries (`issue#20843 <http://tracker.ceph.com/issues/20843>`_, `pr#16675 <https://github.com/ceph/ceph/pull/16675>`_, Jeegn Chen)
-* core: osd/PG: make non-empty PastIntervals non-fatal (`issue#20167 <http://tracker.ceph.com/issues/20167>`_, `pr#15639 <https://github.com/ceph/ceph/pull/15639>`_, Sage Weil)
-* core: osd/PG: only correct filestore collection bits on load (`issue#19541 <http://tracker.ceph.com/issues/19541>`_, `pr#14397 <https://github.com/ceph/ceph/pull/14397>`_, Sage Weil)
-* core: osd/PG: publish PG stats when backfill-related states change (`issue#18369 <http://tracker.ceph.com/issues/18369>`_, `pr#12727 <https://github.com/ceph/ceph/pull/12727>`_, Sage Weil)
-* core: osd/PG: reset the missing set when restarting backfill (`issue#19191 <http://tracker.ceph.com/issues/19191>`_, `pr#14053 <https://github.com/ceph/ceph/pull/14053>`_, Josh Durgin)
-* core: osd/PG: restrict want_acting to up+acting on recovery completion (`issue#18929 <http://tracker.ceph.com/issues/18929>`_, `pr#13420 <https://github.com/ceph/ceph/pull/13420>`_, Sage Weil)
-* core: osd/PG: set clean when last_epoch_clean is updated (`issue#19023 <http://tracker.ceph.com/issues/19023>`_, `pr#15555 <https://github.com/ceph/ceph/pull/15555>`_, Samuel Just)
-* core: osd/PG: simplify the logic of backfill_targets checking (`pr#12519 <https://github.com/ceph/ceph/pull/12519>`_, huangjun)
-* core: osd/PG: some minor cleanups (`pr#14133 <https://github.com/ceph/ceph/pull/14133>`_, runsisi)
-* core: osd/PrimaryLogPG: clear oi from trim_object() (`issue#19947 <http://tracker.ceph.com/issues/19947>`_, `pr#15519 <https://github.com/ceph/ceph/pull/15519>`_, Sage Weil)
-* core: osd/PrimaryLogPG: do not call on_shutdown() if (pg.deleting) (`issue#19902 <http://tracker.ceph.com/issues/19902>`_, `pr#15040 <https://github.com/ceph/ceph/pull/15040>`_, Kefu Chai)
-* core: osd/PrimaryLogPG: do not expect FULL_TRY ops to get resent (`issue#19430 <http://tracker.ceph.com/issues/19430>`_, `pr#14255 <https://github.com/ceph/ceph/pull/14255>`_, Sage Weil)
-* core: osd/PrimaryLogPG::failed_push: update missing as well (`issue#18165 <http://tracker.ceph.com/issues/18165>`_, `pr#12888 <https://github.com/ceph/ceph/pull/12888>`_, Samuel Just)
-* core: osd/PrimaryLogPG: fix oi reset during trim_object (`issue#19947 <http://tracker.ceph.com/issues/19947>`_, `pr#15696 <https://github.com/ceph/ceph/pull/15696>`_, Sage Weil)
-* core:   osd/PrimaryLogPG: fix recovering hang when have unfound objects (`pr#16558 <https://github.com/ceph/ceph/pull/16558>`_, huangjun)
-* core: osd/PrimaryLogPG: optimal pick_newest_available (`pr#12695 <https://github.com/ceph/ceph/pull/12695>`_, huangjun)
-* core: osd/PrimaryLogPG: record prior_version for DELETE events (`issue#20274 <http://tracker.ceph.com/issues/20274>`_, `pr#15649 <https://github.com/ceph/ceph/pull/15649>`_, Sage Weil)
-* core: osd/PrimaryLogPG: remove duplicated code (`pr#13894 <https://github.com/ceph/ceph/pull/13894>`_, Jianpeng Ma)
-* core: osd/PrimaryLogPG: set return value if sparse read failed (`pr#14093 <https://github.com/ceph/ceph/pull/14093>`_, huangjun)
-* core: osd/PrimaryLogPG: skip deleted missing objects in pg[n]ls (`issue#20739 <http://tracker.ceph.com/issues/20739>`_, `pr#16490 <https://github.com/ceph/ceph/pull/16490>`_, Josh Durgin)
-* core: osd/PrimaryLogPG solve cache tier osd high memory consumption (`issue#20464 <http://tracker.ceph.com/issues/20464>`_, `pr#16011 <https://github.com/ceph/ceph/pull/16011>`_, Peng Xie)
-* core: osd/PrimaryLogPG::try_lock_for_read: give up if missing (`issue#18583 <http://tracker.ceph.com/issues/18583>`_, `pr#13087 <https://github.com/ceph/ceph/pull/13087>`_, Samuel Just)
-* core: osd/PrimaryLogPG: unify the access to primary pg (`pr#12527 <https://github.com/ceph/ceph/pull/12527>`_, huangjun)
-* core: osd/PrimayLogPG: update modified range to include the whole object size for write_full op (`pr#15021 <https://github.com/ceph/ceph/pull/15021>`_, runsisi)
-* core: osd/ReplicatedBackend: clear pull source once we are done with it (`issue#19076 <http://tracker.ceph.com/issues/19076>`_, `pr#13879 <https://github.com/ceph/ceph/pull/13879>`_, Samuel Just)
-* core: osd/ReplicatedBackend: remove MOSDSubOp cruft from repop_applied (`pr#14358 <https://github.com/ceph/ceph/pull/14358>`_, Jianpeng Ma)
-* core: osd/ReplicatedBackend: reset thread heartbeat after every omap entry … (`issue#20375 <http://tracker.ceph.com/issues/20375>`_, `pr#15823 <https://github.com/ceph/ceph/pull/15823>`_, Josh Durgin)
-* core: osd/ReplicatedBackend: take read locks for clone sources during recovery (`issue#17831 <http://tracker.ceph.com/issues/17831>`_, `pr#12844 <https://github.com/ceph/ceph/pull/12844>`_, Samuel Just)
-* core: os/filestore: call committed_thru when no journal entries are replayed (`pr#15781 <https://github.com/ceph/ceph/pull/15781>`_, Kuan-Kai Chiu)
-* core: os/filestore: debug which omap keys are set (`issue#19067 <http://tracker.ceph.com/issues/19067>`_, `pr#13671 <https://github.com/ceph/ceph/pull/13671>`_, Sage Weil)
-* core: os/filestore: do not free event if not added (`pr#16235 <https://github.com/ceph/ceph/pull/16235>`_, Kefu Chai)
-* core: os/filestore/FileJournal: bufferlist rebuild (`pr#13980 <https://github.com/ceph/ceph/pull/13980>`_, Jianpeng Ma)
-* core: os/filestore/FileJournal: FileJournal::open() close journal file before return error (`issue#20504 <http://tracker.ceph.com/issues/20504>`_, `pr#16120 <https://github.com/ceph/ceph/pull/16120>`_, Yang Honggang)
-* core: os/filestore/FileStore.cc: remove a redundant judgement when get max latency (`pr#15961 <https://github.com/ceph/ceph/pull/15961>`_, Jianpeng Ma)
-* core: os/filestore/FileStore.cc: remove unneeded loop (`pr#12177 <https://github.com/ceph/ceph/pull/12177>`_, Li Wang)
-* core: os/filestore: fix clang static check warn "use-after-free“ (`pr#12581 <https://github.com/ceph/ceph/pull/12581>`_, liuchang0812)
-* core: os/filestore: fix infinit loops in fiemap() (`pr#14367 <https://github.com/ceph/ceph/pull/14367>`_, Ning Yao)
-* core: os/filestore: handle error returned from write_fd() (`pr#10146 <https://github.com/ceph/ceph/pull/10146>`_, yonghengdexin735)
-* core: os/filestore/HashIndex: be loud about splits (`issue#18235 <http://tracker.ceph.com/issues/18235>`_, `pr#12421 <https://github.com/ceph/ceph/pull/12421>`_, Dan van der Ster)
-* core: os/filestore/JournalingObjectStore cleanup (`pr#12528 <https://github.com/ceph/ceph/pull/12528>`_, Li Wang)
-* core: os/filestore: require experimental flag for btrfs (`pr#16086 <https://github.com/ceph/ceph/pull/16086>`_, Sage Weil)
-* core: os/filestore: version will be uninitialized varible if store_version doesn't exist (`pr#12582 <https://github.com/ceph/ceph/pull/12582>`_, liuchang0812)
-* core: os/fs/FS.cc: remove the redundant code (`pr#14362 <https://github.com/ceph/ceph/pull/14362>`_, Jianpeng Ma)
-* core: os/FuseStore: include <functional> header in src/os/FuseStore.h for gcc 7.x (`pr#13454 <https://github.com/ceph/ceph/pull/13454>`_, Jos Collin)
-* core,performance: common/config_opts: improve rdma buffer size to 128k (`pr#13510 <https://github.com/ceph/ceph/pull/13510>`_, Haomai Wang)
-* core,performance: common/TrackedOp: various cleanups and optimizations (`pr#12537 <https://github.com/ceph/ceph/pull/12537>`_, Sage Weil)
-* core,performance: kv/RocksDBStore: Table options for indexing and filtering (`pr#16450 <https://github.com/ceph/ceph/pull/16450>`_, Mark Nelson)
-* core,performance: mon,osd: explicitly remap some pgs (`pr#13984 <https://github.com/ceph/ceph/pull/13984>`_, Sage Weil)
-* core,performance: msg/async: avoid lossy connection sending ack message (`pr#13700 <https://github.com/ceph/ceph/pull/13700>`_, Haomai Wang)
-* core,performance: msg/async/rdma: cleanup (`pr#13509 <https://github.com/ceph/ceph/pull/13509>`_, Haomai Wang)
-* core,performance: msg/async/rdma: refactor tx handle flow to get rid of locks (`pr#13680 <https://github.com/ceph/ceph/pull/13680>`_, Haomai Wang)
-* core,performance: msg/async: reduce write_lock contention (`pr#15092 <https://github.com/ceph/ceph/pull/15092>`_, Haomai Wang)
-* core,performance: osd/ECBackend: Send write message to peers first, then do local write (`pr#12522 <https://github.com/ceph/ceph/pull/12522>`_, huangjun)
-* core,performance: osd/OSD.h: requeue the scrub job with higher priority to shorten the blocking time of related requests (`pr#15552 <https://github.com/ceph/ceph/pull/15552>`_, Jin Cai)
-* core,performance: osd, os: reduce fiemap burden (`pr#14640 <https://github.com/ceph/ceph/pull/14640>`_, Piotr Dałek)
-* core,performance: osd/pg: bound the portion of the log we request in GetLog::GetLog() (`pr#12233 <https://github.com/ceph/ceph/pull/12233>`_, Jie Wang)
-* core,performance: osd/PG: make prioritized recovery possible (`pr#13723 <https://github.com/ceph/ceph/pull/13723>`_, Piotr Dałek)
-* core,performance: os/filestore: avoid unnecessary copy in filestore::_do_transaction (`pr#12578 <https://github.com/ceph/ceph/pull/12578>`_, Yunchuan Wen)
-* core,performance: os/filestore/HashIndex: randomize split threshold by a configurable amount (`issue#15835 <http://tracker.ceph.com/issues/15835>`_, `pr#15689 <https://github.com/ceph/ceph/pull/15689>`_, Josh Durgin)
-* core,performance: os/filestore: queue ondisk completion before apply work (`pr#13918 <https://github.com/ceph/ceph/pull/13918>`_, Pan Liu)
-* core,performance: os/filestore: use new sleep strategy when io_submit gets EAGAIN (`pr#14860 <https://github.com/ceph/ceph/pull/14860>`_, Pan Liu)
-* core,performance: os/kstore: Added rocksdb bloom filter settings (`pr#13053 <https://github.com/ceph/ceph/pull/13053>`_, Ted-Chang)
-* core,performance: src/OSD: add more useful perf counters for performance tuning (`pr#15915 <https://github.com/ceph/ceph/pull/15915>`_, Pan Liu)
-* core: PGLog: store extra duplicate ops beyond the normal log entries (`pr#16172 <https://github.com/ceph/ceph/pull/16172>`_, Josh Durgin, J. Eric Ivancich)
-* core: Prefix /proc/ with FreeBSD emulation (`pr#14290 <https://github.com/ceph/ceph/pull/14290>`_, Willem Jan Withagen)
-* core: PrimaryLogPG: don't update digests for objects with mismatched names (`issue#18409 <http://tracker.ceph.com/issues/18409>`_, `pr#12788 <https://github.com/ceph/ceph/pull/12788>`_, Samuel Just)
-* core: print more information when run ceph-osd cmd with 'check options' (`pr#16678 <https://github.com/ceph/ceph/pull/16678>`_, mychoxin)
-* core: qa: do not restrict valgrind runs to centos (`issue#18126 <http://tracker.ceph.com/issues/18126>`_, `pr#15389 <https://github.com/ceph/ceph/pull/15389>`_, Greg Farnum)
-* core,rbd: mon,osd: do not create rbd pool by default (`pr#15894 <https://github.com/ceph/ceph/pull/15894>`_, Greg Farnum, Sage Weil, David Zafman)
-* core: ReplicatedBackend: don't queue Context outside of ObjectStore with obc (`issue#18927 <http://tracker.ceph.com/issues/18927>`_, `pr#13569 <https://github.com/ceph/ceph/pull/13569>`_, Samuel Just)
-* core: Revert "PrimaryLogPG::failed_push: update missing as well" (`issue#18624 <http://tracker.ceph.com/issues/18624>`_, `pr#13090 <https://github.com/ceph/ceph/pull/13090>`_, David Zafman)
-* core,rgw: misc: SCA and Coverity Fixes (`pr#13208 <https://github.com/ceph/ceph/pull/13208>`_, Danny Al-Gaaf)
-* core,rgw: qa: Removed all 'default_idle_timeout' due to chnage in rwg task (`pr#15420 <https://github.com/ceph/ceph/pull/15420>`_, Yuri Weinstein)
-* core,rgw,tests: qa/rgw_snaps: move default_idle_timeout config under the client (`issue#20128 <http://tracker.ceph.com/issues/20128>`_, `pr#15400 <https://github.com/ceph/ceph/pull/15400>`_, Yehuda Sadeh)
-* core,rgw,tests: qa/suits/rados/basic/tasks/rgw_snaps: wait for pools to be created (`pr#16509 <https://github.com/ceph/ceph/pull/16509>`_, Sage Weil)
-* core: rocksdb: sync with upstream (`issue#18464 <http://tracker.ceph.com/issues/18464>`_, `pr#13306 <https://github.com/ceph/ceph/pull/13306>`_, Kefu Chai)
-* core: src/ceph.in: Use env(CEPH_DEV) to suppress noise from ceph (`pr#14746 <https://github.com/ceph/ceph/pull/14746>`_, Willem Jan Withagen)
-* core: src/vstart.sh: kill dead upmap option (`pr#15848 <https://github.com/ceph/ceph/pull/15848>`_, xie xingguo)
-* core:" Stringify needs access to << before reference" src/include/stringify.h (`pr#16334 <https://github.com/ceph/ceph/pull/16334>`_, Willem Jan Withagen)
-* core: test, osd: fix some coverity issues (`pr#13293 <https://github.com/ceph/ceph/pull/13293>`_, liuchang0812)
-* core: test/pybind/test_rados.py: tolerate TimedOut in test_ping_monitor (`issue#18529 <http://tracker.ceph.com/issues/18529>`_, `pr#12934 <https://github.com/ceph/ceph/pull/12934>`_, Samuel Just)
-* core,tests: ceph-disk: sensible default for block.db (`pr#15576 <https://github.com/ceph/ceph/pull/15576>`_, Loic Dachary)
-* core,tests: ceph-disk/tests: Certain partition types do not work on FreeBSD (`pr#13560 <https://github.com/ceph/ceph/pull/13560>`_, Willem Jan Withagen)
-* core,tests: ceph-disk/tests/test_main.py: FreeBSD does not do multipath (`pr#13847 <https://github.com/ceph/ceph/pull/13847>`_, Willem Jan Withagen)
-* core,tests: ceph_test_librados_api_misc: fix stupid LibRadosMiscConnectFailure.ConnectFailure test (`issue#15368 <http://tracker.ceph.com/issues/15368>`_, `pr#14261 <https://github.com/ceph/ceph/pull/14261>`_, Sage Weil)
-* core,tests: ceph_test_rados_api_misc: avoid livelock from PoolCreationRace (`pr#13565 <https://github.com/ceph/ceph/pull/13565>`_, Sage Weil)
-* core,tests: ceph_test_rados_api_misc: Fix trivial memory leak (`pr#12680 <https://github.com/ceph/ceph/pull/12680>`_, Brad Hubbard)
-* core,tests: ceph_test_rados_api: wait for snap trim on ENOENT during cleanup (`issue#19948 <http://tracker.ceph.com/issues/19948>`_, `pr#15638 <https://github.com/ceph/ceph/pull/15638>`_, Sage Weil)
-* core,tests: ceph_test_rados_api_watch_notify: flush after unwatch (`issue#20105 <http://tracker.ceph.com/issues/20105>`_, `pr#16402 <https://github.com/ceph/ceph/pull/16402>`_, Sage Weil)
-* core,tests: ceph_test_rados_api_watch_notify: make LibRadosWatchNotify.Watch3Timeout tolerate thrashing (`issue#19433 <http://tracker.ceph.com/issues/19433>`_, `pr#14899 <https://github.com/ceph/ceph/pull/14899>`_, Sage Weil)
-* core,tests: ceph_test_rados: max_stride_size must be more than min_stride_size (`issue#20775 <http://tracker.ceph.com/issues/20775>`_, `pr#16590 <https://github.com/ceph/ceph/pull/16590>`_, Lianne Wang)
-* core,tests: c_write_operations.cc: Fix trivial memory leak (`pr#12663 <https://github.com/ceph/ceph/pull/12663>`_, Brad Hubbard)
-* core,tests: do all valgrind runs on centos (`issue#20360 <http://tracker.ceph.com/issues/20360>`_, `issue#18126 <http://tracker.ceph.com/issues/18126>`_, `pr#16046 <https://github.com/ceph/ceph/pull/16046>`_, Sage Weil)
-* core,tests: os: allow 'osd objectstore = random' to pick either filestore or bluestore (`pr#13754 <https://github.com/ceph/ceph/pull/13754>`_, Sage Weil)
-* core,tests: qa: avoid map-gap tests for k=2 m=1 (`issue#20844 <http://tracker.ceph.com/issues/20844>`_, `pr#16789 <https://github.com/ceph/ceph/pull/16789>`_, Sage Weil)
-* core,tests: qa: move ceph-helpers-based make check tests to qa/standalone; run via teuthology (`pr#16513 <https://github.com/ceph/ceph/pull/16513>`_, Sage Weil)
-* core,tests: qa/objectstore/filestore-btrfs: test btrfs on trusty only (`issue#20169 <http://tracker.ceph.com/issues/20169>`_, `pr#15814 <https://github.com/ceph/ceph/pull/15814>`_, Sage Weil)
-* core,tests: qa/objectstore: test bluestore with aggressive compression (`pr#14623 <https://github.com/ceph/ceph/pull/14623>`_, Sage Weil)
-* core,tests: qa/rados/upgrade/jewel-x-singleton: run luminous.yaml at the end (`pr#13378 <https://github.com/ceph/ceph/pull/13378>`_, Sage Weil)
-* core,tests: qa: stop testing btrfs (`issue#20169 <http://tracker.ceph.com/issues/20169>`_, `pr#16044 <https://github.com/ceph/ceph/pull/16044>`_, Sage Weil)
-* core,tests: qa/suites/powercycle/osd/tasks/radosbench: consume less space (`issue#20302 <http://tracker.ceph.com/issues/20302>`_, `pr#15821 <https://github.com/ceph/ceph/pull/15821>`_, Sage Weil)
-* core,tests: qa/suites/rados: at-end: ignore PG_{AVAILABILITY,DEGRADED} (`issue#20693 <http://tracker.ceph.com/issues/20693>`_, `pr#16575 <https://github.com/ceph/ceph/pull/16575>`_, Sage Weil)
-* core,tests: qa/suites/rados/\*/at-end: wait for healthy before scrubbing (`pr#15245 <https://github.com/ceph/ceph/pull/15245>`_, Sage Weil)
-* core,tests: qa/suites/rados/basic: set low omap limit for rgw workload (`pr#13071 <https://github.com/ceph/ceph/pull/13071>`_, Sage Weil)
-* core,tests: qa/suites/rados/basic/tasks/rados_python: POOL_APP_NOT_ENABLED (`pr#16827 <https://github.com/ceph/ceph/pull/16827>`_, Sage Weil)
-* core,tests: qa/suites/rados/mgr/tasks/failover: whitelist (`pr#16795 <https://github.com/ceph/ceph/pull/16795>`_, Sage Weil)
-* core,tests: qa/suites/rados/singleton/all/reg11184: whitelist health warnings (`pr#16306 <https://github.com/ceph/ceph/pull/16306>`_, Sage Weil)
-* core,tests: qa/suites/rados/singleton-nomsg/health-warnings: behave on ext4 (`issue#20043 <http://tracker.ceph.com/issues/20043>`_, `pr#15207 <https://github.com/ceph/ceph/pull/15207>`_, Sage Weil)
-* core,tests: qa/suites/rados: temporarily remove scrub_test from basic/ until post-luminous (`issue#19935 <http://tracker.ceph.com/issues/19935>`_, `pr#15202 <https://github.com/ceph/ceph/pull/15202>`_, Sage Weil)
-* core,tests: qa/suites/rados/thrash/workload/\*: enable rados.py cache tiering ops (`issue#11793 <http://tracker.ceph.com/issues/11793>`_, `pr#16244 <https://github.com/ceph/ceph/pull/16244>`_, Sage Weil)
-* core,tests: qa/suites/upgrade/kraken-x: enable experimental for bluestore (`pr#15359 <https://github.com/ceph/ceph/pull/15359>`_, Sage Weil)
-* core,tests: qa/tasks/ceph: enable rbd on rbd pool (`pr#16794 <https://github.com/ceph/ceph/pull/16794>`_, Sage Weil)
-* core,tests: qa/tasks/ceph_manager: get osds all in after thrashing (`pr#15784 <https://github.com/ceph/ceph/pull/15784>`_, Sage Weil)
-* core,tests: qa/tasks/ceph_manager: wait for osd to start after objectstore-tool sequence (`issue#20705 <http://tracker.ceph.com/issues/20705>`_, `pr#16454 <https://github.com/ceph/ceph/pull/16454>`_, Sage Weil)
-* core,tests: qa/tasks/ceph_manager: wait longer for pg stats to flush (`pr#16322 <https://github.com/ceph/ceph/pull/16322>`_, Sage Weil)
-* core,tests: qa/tasks/ceph: osd_scrub_pgs: reissue scrub requests in loop (`issue#20326 <http://tracker.ceph.com/issues/20326>`_, `pr#15747 <https://github.com/ceph/ceph/pull/15747>`_, Sage Weil)
-* core,tests: qa/tasks/ceph.py: no osd id to 'osd create' command (`issue#20548 <http://tracker.ceph.com/issues/20548>`_, `pr#16233 <https://github.com/ceph/ceph/pull/16233>`_, Sage Weil)
-* core,tests: qa/tasks/ceph.py: tolerate active+clean+something (`pr#15717 <https://github.com/ceph/ceph/pull/15717>`_, Sage Weil)
-* core,tests: qa/tasks/ceph: simplify ceph deployment slightly (`pr#15853 <https://github.com/ceph/ceph/pull/15853>`_, Sage Weil)
-* core,tests: qa/tasks/ceph: wait for mgr to activate and pg stats to flush in health() (`issue#20744 <http://tracker.ceph.com/issues/20744>`_, `pr#16514 <https://github.com/ceph/ceph/pull/16514>`_, Sage Weil)
-* core,tests: qa/tasks/dump_stuck: fix dump_stuck test bug (`pr#16559 <https://github.com/ceph/ceph/pull/16559>`_, huangjun)
-* core,tests: qa/tasks/dump_stuck: fix for active+clean+remapped (`issue#20431 <http://tracker.ceph.com/issues/20431>`_, `pr#15955 <https://github.com/ceph/ceph/pull/15955>`_, Sage Weil)
-* core,tests: qa/tasks/radosbench: longer timeout (`pr#16213 <https://github.com/ceph/ceph/pull/16213>`_, Sage Weil)
-* core,tests: qa/workunits/cephtool/test.sh: add sudo for daemon compact (`pr#16500 <https://github.com/ceph/ceph/pull/16500>`_, Sage Weil)
-* core,tests: qa/workunits/cephtool/test.sh: fix osd full health detail grep (`issue#20187 <http://tracker.ceph.com/issues/20187>`_, `pr#15494 <https://github.com/ceph/ceph/pull/15494>`_, Sage Weil)
-* core,tests: qa/workunits/rados/test_health_warning: misc fixes (`issue#19990 <http://tracker.ceph.com/issues/19990>`_, `pr#15201 <https://github.com/ceph/ceph/pull/15201>`_, Sage Weil)
-* core,tests: qa/workunits/rest: use unique pool names for cephfs test (`pr#13188 <https://github.com/ceph/ceph/pull/13188>`_, Sage Weil)
-* core,tests: Revert "qa: do not restrict valgrind runs to centos" (`issue#20360 <http://tracker.ceph.com/issues/20360>`_, `pr#15791 <https://github.com/ceph/ceph/pull/15791>`_, Sage Weil)
-* core,tests: test: add separate ceph-helpers-based smoke test (`pr#16572 <https://github.com/ceph/ceph/pull/16572>`_, Sage Weil)
-* core,tests: test/librados/cmd.cc: Fix trivial memory leaks (`pr#12671 <https://github.com/ceph/ceph/pull/12671>`_, Brad Hubbard)
-* core,tests: test/librados/c_read_operations.cc: Fix trivial memory leak (`pr#12656 <https://github.com/ceph/ceph/pull/12656>`_, Brad Hubbard)
-* core,tests: test/librados/c_read_operations.cc: Fix valgrind errors (`issue#18354 <http://tracker.ceph.com/issues/18354>`_, `pr#12657 <https://github.com/ceph/ceph/pull/12657>`_, Brad Hubbard)
-* core,tests: test/librados: Silence Coverity memory leak warnings (`pr#12442 <https://github.com/ceph/ceph/pull/12442>`_, Brad Hubbard, Samuel Just)
-* core,tests: test/librados/snapshots.cc: Fix memory leak (`pr#12690 <https://github.com/ceph/ceph/pull/12690>`_, Brad Hubbard)
-* core,tests: test/librados/tier.cc: Fix valgrind errors (`issue#18360 <http://tracker.ceph.com/issues/18360>`_, `pr#12705 <https://github.com/ceph/ceph/pull/12705>`_, Brad Hubbard)
-* core,tests: test/osd/TestRados.cc: run set-redirect test after finishing setup (`issue#20114 <http://tracker.ceph.com/issues/20114>`_, `pr#15385 <https://github.com/ceph/ceph/pull/15385>`_, Myoungwon Oh)
-* core,tests: test_rados_watch_notify: Fix trivial memory leaks (`pr#12713 <https://github.com/ceph/ceph/pull/12713>`_, Brad Hubbard)
-* core,tests,tools: Fixes: http://tracker.ceph.com/issues/18533 (`pr#13423 <https://github.com/ceph/ceph/pull/13423>`_, Samuel Just, David Zafman)
-* core,tests: upgrade/jewel-x: a few fixes (`pr#16830 <https://github.com/ceph/ceph/pull/16830>`_, Sage Weil)
-* core: throttle: Minimal destructor fix for Luminous (`pr#16661 <https://github.com/ceph/ceph/pull/16661>`_, Adam C. Emerson)
-* core,tools: ceph: perfcounter priorities and daemonperf updates to use them (`pr#14793 <https://github.com/ceph/ceph/pull/14793>`_, Sage Weil, Dan Mick)
-* core,tools: kv: move 'bluestore-kv' hackery out of KeyValueDB into ceph-kvstore-tool (`issue#19778 <http://tracker.ceph.com/issues/19778>`_, `pr#14895 <https://github.com/ceph/ceph/pull/14895>`_, Sage Weil)
-* core,tools: osdmaptool: require --upmap-save before modifying input osdmap (`pr#15247 <https://github.com/ceph/ceph/pull/15247>`_, Sage Weil)
-* core: vstart.sh: start mgr after mon, before osds (`pr#16613 <https://github.com/ceph/ceph/pull/16613>`_, Sage Weil)
-* core: Wip 20985 divergent handling luminous (`issue#20985 <http://tracker.ceph.com/issues/20985>`_, `pr#17001 <https://github.com/ceph/ceph/pull/17001>`_, Greg Farnum)
-* create the ceph-volume and ceph-volume-systemd man pages (`pr#17158 <https://github.com/ceph/ceph/pull/17158>`_, Alfredo Deza)
-* crush: a couple of weight-set fixes (`pr#16623 <https://github.com/ceph/ceph/pull/16623>`_, xie xingguo)
-* crush: add devices class that rules can use as a filter (`issue#18943 <http://tracker.ceph.com/issues/18943>`_, `pr#13444 <https://github.com/ceph/ceph/pull/13444>`_, Loic Dachary)
-* crush: add --dump to crushtool (`pr#13726 <https://github.com/ceph/ceph/pull/13726>`_, Loic Dachary)
-* crush: add missing tunable in tests (`pr#15412 <https://github.com/ceph/ceph/pull/15412>`_, Loic Dachary)
-* crush: allow uniform buckets with no items (`pr#13521 <https://github.com/ceph/ceph/pull/13521>`_, Loic Dachary)
-* crush: API documentation (`pr#13205 <https://github.com/ceph/ceph/pull/13205>`_, Loic Dachary)
-* crush: bucket: crush_add_uniform_bucket_item should check for uniformity (`pr#14208 <https://github.com/ceph/ceph/pull/14208>`_, Sahid Orentino Ferdjaoui)
-* crush: builder: clean the arguments of crush_reweight\* methods (`pr#14110 <https://github.com/ceph/ceph/pull/14110>`_, Sahid Orentino Ferdjaoui)
-* crush: builder: creating crush map with optimal configurations (`pr#14209 <https://github.com/ceph/ceph/pull/14209>`_, Sahid Orentino Ferdjaoui)
-* crush: builder: legacy has chooseleaf_stable = 0 (`pr#14695 <https://github.com/ceph/ceph/pull/14695>`_, Loic Dachary)
-* crush: crush_init_workspace starts with struct crush_work (`pr#14696 <https://github.com/ceph/ceph/pull/14696>`_, Loic Dachary)
-* crush: detect and (usually) fix ruleset != rule id (`pr#13683 <https://github.com/ceph/ceph/pull/13683>`_, Sage Weil)
-* crush: document tunables and rule step set (`pr#13722 <https://github.com/ceph/ceph/pull/13722>`_, Loic Dachary)
-* crush: do is_out test only if we do not collide (`pr#13326 <https://github.com/ceph/ceph/pull/13326>`_, xie xingguo)
-* crush: encode can override weights with weight set (`issue#19836 <http://tracker.ceph.com/issues/19836>`_, `pr#15002 <https://github.com/ceph/ceph/pull/15002>`_, Loic Dachary)
-* crush: enforce buckets-before-rules rule (`pr#16453 <https://github.com/ceph/ceph/pull/16453>`_, Sage Weil)
-* crush: fix CrushCompiler won't compile maps with empty shadow tree (`pr#17228 <https://github.com/ceph/ceph/pull/17228>`_, xie xingguo)
-* crush: fix dprintk compilation (`pr#13424 <https://github.com/ceph/ceph/pull/13424>`_, Loic Dachary)
-* crush: force rebuilding shadow hierarchy after swapping buckets (`pr#17229 <https://github.com/ceph/ceph/pull/17229>`_, xie xingguo)
-* crush: misc changes/fixes for device classes (`issue#20845 <http://tracker.ceph.com/issues/20845>`_, `pr#16805 <https://github.com/ceph/ceph/pull/16805>`_, Kefu Chai, xie xingguo, Sage Weil)
-* crush: more class fixes (`pr#16837 <https://github.com/ceph/ceph/pull/16837>`_, xie xingguo)
-* crush: only encode class info if SERVER_LUMINOUS (`issue#19361 <http://tracker.ceph.com/issues/19361>`_, `pr#14131 <https://github.com/ceph/ceph/pull/14131>`_, Sage Weil)
-* crush: optimize header file dependency (`pr#9307 <https://github.com/ceph/ceph/pull/9307>`_, Xiaowei Chen)
-* crush: silence warning from -Woverflow (`pr#16329 <https://github.com/ceph/ceph/pull/16329>`_, Jos Collin)
-* crush: s/ruleset/id/ in decompiled output; prevent compilation when ruleset != id (`pr#16400 <https://github.com/ceph/ceph/pull/16400>`_, Sage Weil)
-* crush: update choose_args when items are added/removed (`pr#15311 <https://github.com/ceph/ceph/pull/15311>`_, Loic Dachary)
-* crush: update documentation for negative choose step (`pr#14970 <https://github.com/ceph/ceph/pull/14970>`_, Loic Dachary)
-* crush: various weight-set fixes (`pr#17214 <https://github.com/ceph/ceph/pull/17214>`_, xie xingguo)
-* crush: verify weights is influenced by the number of replicas (`issue#15653 <http://tracker.ceph.com/issues/15653>`_, `pr#13083 <https://github.com/ceph/ceph/pull/13083>`_, Adam C. Emerson, Loic Dachary)
-* crush: weight_set and id remapping (`issue#15653 <http://tracker.ceph.com/issues/15653>`_, `pr#14486 <https://github.com/ceph/ceph/pull/14486>`_, Loic Dachary)
-* crush:  when osd_location_hook does not exist, we should exit error (`pr#12961 <https://github.com/ceph/ceph/pull/12961>`_, song baisen)
-* doc: 12.1.0/release notes 2 (`pr#15627 <https://github.com/ceph/ceph/pull/15627>`_, Abhishek Lekshmanan)
-* doc: 12.1.1 & 12.1.2 release notes (`pr#16377 <https://github.com/ceph/ceph/pull/16377>`_, Abhishek Lekshmanan)
-* doc: add 0.94.10 and hammer EOL to releases.rst (`pr#13069 <https://github.com/ceph/ceph/pull/13069>`_, Nathan Cutler)
-* doc: add 12.0.1 release notes (`pr#14106 <https://github.com/ceph/ceph/pull/14106>`_, Abhishek Lekshmanan)
-* doc: Add amitkumar50 affiliation to .organizationmap (`pr#16475 <https://github.com/ceph/ceph/pull/16475>`_, Amit Kumar)
-* doc add ceph-volume and ceph-volume-systemd man pages to CMakeLists file (`pr#17170 <https://github.com/ceph/ceph/pull/17170>`_, Alfredo Deza)
-* doc: add changelog for v0.94.10 (`pr#13572 <https://github.com/ceph/ceph/pull/13572>`_, Abhishek Lekshmanan)
-* doc: add changelog for v10.2.6 Jewel release (`pr#13839 <https://github.com/ceph/ceph/pull/13839>`_, Abhishek Lekshmanan)
-* doc: add changelog for v10.2.7 (`pr#14441 <https://github.com/ceph/ceph/pull/14441>`_, Abhishek Lekshmanan)
-* doc: add descriptions for mon/mgr options (`pr#15032 <https://github.com/ceph/ceph/pull/15032>`_, Kefu Chai)
-* doc: add doc requirements on PR submitters (`pr#16394 <https://github.com/ceph/ceph/pull/16394>`_, John Spray)
-* doc: added mgr caps to manual deployment documentation (`pr#16660 <https://github.com/ceph/ceph/pull/16660>`_, Nick Erdmann)
-* doc: add FreeBSD manual install (`pr#14941 <https://github.com/ceph/ceph/pull/14941>`_, Willem Jan Withagen)
-* doc: add instructions for replacing an OSD (`pr#16314 <https://github.com/ceph/ceph/pull/16314>`_, Kefu Chai)
-* doc: add new cn ceph mirror to doc and mirroring (`pr#15089 <https://github.com/ceph/ceph/pull/15089>`_, Shengjing Zhu)
-* doc: add optional argument for build-doc (`pr#14058 <https://github.com/ceph/ceph/pull/14058>`_, Kefu Chai)
-* doc: add rados xattr commands to manpage (`pr#15362 <https://github.com/ceph/ceph/pull/15362>`_, Andreas Gerstmayr)
-* doc: add rbd new trash cli and cleanups  in release-notes.rst (`issue#20702 <http://tracker.ceph.com/issues/20702>`_, `pr#16498 <https://github.com/ceph/ceph/pull/16498>`_, songweibin)
-* doc: add README to dmclock subdir to inform developers it's a git subtree (`pr#15386 <https://github.com/ceph/ceph/pull/15386>`_, J. Eric Ivancich)
-* doc: add RGW ldap auth documentation (`pr#14339 <https://github.com/ceph/ceph/pull/14339>`_, Harald Klein)
-* doc: add some undocumented options to rbd-nbd (`pr#14134 <https://github.com/ceph/ceph/pull/14134>`_, wangzhengyong)
-* doc: add verbiage to rbdmap manpage (`issue#18262 <http://tracker.ceph.com/issues/18262>`_, `pr#12509 <https://github.com/ceph/ceph/pull/12509>`_, Nathan Cutler)
-* doc: Add Zabbix ceph-mgr plugin to PendingReleaseNotes (`pr#16412 <https://github.com/ceph/ceph/pull/16412>`_, Wido den Hollander)
-* doc: AUTHORS: update CephFS PTL (`pr#16399 <https://github.com/ceph/ceph/pull/16399>`_, Patrick Donnelly)
-* doc: AUTHORS: update tech leads (`pr#14350 <https://github.com/ceph/ceph/pull/14350>`_, Patrick Donnelly)
-* doc: AUTHORS: update with release manager, backport team (`pr#15391 <https://github.com/ceph/ceph/pull/15391>`_, Sage Weil)
-* doc: build/install-deps.sh: Add sphinx package for building docs on FreeBSD (`pr#13223 <https://github.com/ceph/ceph/pull/13223>`_, Willem Jan Withagen)
-* doc: ceph-disk: use '-' for feeding ceph cli with stdin (`pr#16362 <https://github.com/ceph/ceph/pull/16362>`_, Kefu Chai)
-* doc: change osd_op_thread_timeout default value to 15 (`pr#14199 <https://github.com/ceph/ceph/pull/14199>`_, Andreas Gerstmayr)
-* doc: Change the default values of some OSD options (`issue#20199 <http://tracker.ceph.com/issues/20199>`_, `pr#15566 <https://github.com/ceph/ceph/pull/15566>`_, Bara Ancincova)
-* doc: clarify "ceph quorum" syntax (`issue#17802 <http://tracker.ceph.com/issues/17802>`_, `pr#11787 <https://github.com/ceph/ceph/pull/11787>`_, Nathan Cutler)
-* doc: clarify SubmittingPatches.rst (`pr#12988 <https://github.com/ceph/ceph/pull/12988>`_, Nathan Cutler)
-* doc: clarify that "ms bind ipv6" disables IPv4 (`pr#13317 <https://github.com/ceph/ceph/pull/13317>`_, Ken Dreyer)
-* doc: clarify the path restriction mds cap example (`pr#12993 <https://github.com/ceph/ceph/pull/12993>`_, John Spray)
-* doc: common/options.cc: document bluestore config options (`pr#16489 <https://github.com/ceph/ceph/pull/16489>`_, Sage Weil)
-* doc: correct and improve add user capability section (`pr#14055 <https://github.com/ceph/ceph/pull/14055>`_, Chu, Hua-Rong)
-* doc: correct arguments for ceph tell osd.N bench (`pr#14462 <https://github.com/ceph/ceph/pull/14462>`_, Patrick Dinnen)
-* doc: Correcting the remove bucket example and adding bucket link/unlink examples (`pr#12460 <https://github.com/ceph/ceph/pull/12460>`_, Uday Mullangi)
-* doc: correct S3 lifecycle support explain (`issue#18459 <http://tracker.ceph.com/issues/18459>`_, `pr#12827 <https://github.com/ceph/ceph/pull/12827>`_, liuchang0812)
-* doc: correct the quota section (`issue#19397 <http://tracker.ceph.com/issues/19397>`_, `pr#14122 <https://github.com/ceph/ceph/pull/14122>`_, Chu, Hua-Rong)
-* doc: crush: API documentation fixes (`pr#13589 <https://github.com/ceph/ceph/pull/13589>`_, Loic Dachary)
-* doc: crush typo in algorithm description (`pr#13661 <https://github.com/ceph/ceph/pull/13661>`_, Loic Dachary)
-* doc: deletes duplicated word and clarifies an example (`pr#13746 <https://github.com/ceph/ceph/pull/13746>`_, Tahia Khan)
-* doc: describe CephFS max_file_size (`pr#15287 <https://github.com/ceph/ceph/pull/15287>`_, Ken Dreyer)
-* doc: describe mark_events logging available via the OSD's OpTracker (`pr#15095 <https://github.com/ceph/ceph/pull/15095>`_, Greg Farnum)
-* doc: Describe mClock's use within Ceph in great detail (`pr#16707 <https://github.com/ceph/ceph/pull/16707>`_, J. Eric Ivancich)
-* doc: dev add a note about ccache (`pr#14478 <https://github.com/ceph/ceph/pull/14478>`_, Abhishek Lekshmanan)
-* doc: dev: add notes on PR make check validation test (`pr#16079 <https://github.com/ceph/ceph/pull/16079>`_, Nathan Cutler)
-* doc: dev guide: how to run s3-tests locally against vstart (`pr#14508 <https://github.com/ceph/ceph/pull/14508>`_, Nathan Cutler, Abhishek Lekshmanan)
-* doc: dev improve the s3tests doc to reflect current scripts (`pr#15180 <https://github.com/ceph/ceph/pull/15180>`_, Abhishek Lekshmanan)
-* doc: doc/cephfs: mention RADOS object size limit (`pr#15550 <https://github.com/ceph/ceph/pull/15550>`_, John Spray)
-* doc: doc/dev: update log_based_pg.rst, fix some display problem (`pr#12730 <https://github.com/ceph/ceph/pull/12730>`_, liuchang0812)
-* doc: Doc:Fixes Python Swift client commands (`issue#17746 <http://tracker.ceph.com/issues/17746>`_, `pr#12887 <https://github.com/ceph/ceph/pull/12887>`_, Ronak Jain)
-* doc: doc/install/manual-deployment: update osd creation steps (`pr#16573 <https://github.com/ceph/ceph/pull/16573>`_, Sage Weil)
-* doc: doc/mgr/dashboard: update dashboard docs to reflect new defaults (`pr#16241 <https://github.com/ceph/ceph/pull/16241>`_, Sage Weil)
-* doc: doc/mon: fix ceph-authtool command in rebuild mon's sample (`pr#16503 <https://github.com/ceph/ceph/pull/16503>`_, huanwen ren)
-* doc: doc/qa: cover `config help` command (`pr#16727 <https://github.com/ceph/ceph/pull/16727>`_, John Spray)
-* doc: doc/rados.8: add offset option for put command (`pr#16155 <https://github.com/ceph/ceph/pull/16155>`_, Jianpeng Ma)
-* doc: doc/rados: add page for health checks and update monitoring.rst (`pr#16566 <https://github.com/ceph/ceph/pull/16566>`_, John Spray)
-* doc: doc/rados/configuration: document bluestore (`pr#16765 <https://github.com/ceph/ceph/pull/16765>`_, Sage Weil)
-* doc: doc/radosgw/s3/cpp.rst: update usage of libs3 APIs to make the examples work (`pr#10851 <https://github.com/ceph/ceph/pull/10851>`_, Weibing Zhang)
-* doc: doc/rados/operations/health-checks: osd section (`pr#16611 <https://github.com/ceph/ceph/pull/16611>`_, Sage Weil)
-* doc: doc/release-notes: add Images creation timestamp note (`pr#15963 <https://github.com/ceph/ceph/pull/15963>`_, clove)
-* doc: doc/release-notes: avoid 'production-ready' in describing kraken (`pr#13675 <https://github.com/ceph/ceph/pull/13675>`_, Sage Weil)
-* doc: doc/release-notes: final kraken notes (`pr#12968 <https://github.com/ceph/ceph/pull/12968>`_, Sage Weil)
-* doc: doc/release-notes: fix bluestore links (`pr#16787 <https://github.com/ceph/ceph/pull/16787>`_, Sage Weil)
-* doc: doc/release-notes: fix links, formatting; add crush device class docs (`pr#16741 <https://github.com/ceph/ceph/pull/16741>`_, Sage Weil)
-* doc: doc/release-notes: fix upmap and osd replacement links; add fixme (`pr#16730 <https://github.com/ceph/ceph/pull/16730>`_, Sage Weil)
-* doc: doc/release-notes: Luminous release notes typo fixes  "ceph config-key ls"->"ceph config-key list" (`pr#16330 <https://github.com/ceph/ceph/pull/16330>`_, scienceluo)
-* doc: doc/release-notes: Luminous release notes typo fixes (`pr#16338 <https://github.com/ceph/ceph/pull/16338>`_, Luo Kexue)
-* doc: doc/release-notes: sort release note changes into the right section (`pr#16764 <https://github.com/ceph/ceph/pull/16764>`_, Sage Weil)
-* doc: doc/release-notes: update device class cli (`pr#16851 <https://github.com/ceph/ceph/pull/16851>`_, xie xingguo)
-* doc: doc/release-notes: update luminous notes (`pr#15851 <https://github.com/ceph/ceph/pull/15851>`_, Sage Weil)
-* doc: doc/release-notes: update which jewel version does sortbitwise warning (`pr#15209 <https://github.com/ceph/ceph/pull/15209>`_, Sage Weil)
-* doc: doc/releases: Update releases from Feb 2017 to July 2017 (`pr#16303 <https://github.com/ceph/ceph/pull/16303>`_, Bryan Stillwell)
-* doc: doc/rgw: instructions for changing multisite master zone (`pr#14089 <https://github.com/ceph/ceph/pull/14089>`_, Casey Bodley)
-* doc: doc/rgw: remove fastcgi page and sample configs (`pr#15133 <https://github.com/ceph/ceph/pull/15133>`_, Casey Bodley)
-* doc: doc/rgw: remove Federated Configuration, clean up multisite (`issue#19504 <http://tracker.ceph.com/issues/19504>`_, `issue#18082 <http://tracker.ceph.com/issues/18082>`_, `pr#15132 <https://github.com/ceph/ceph/pull/15132>`_, Casey Bodley)
-* doc: docs: Clarify the relationship of min_size to EC pool recovery (`pr#14419 <https://github.com/ceph/ceph/pull/14419>`_, Brad Hubbard)
-* doc: docs: Fix problems with example code (`pr#14007 <https://github.com/ceph/ceph/pull/14007>`_, Brad Hubbard)
-* doc: docs: mgr dashboard (`pr#15920 <https://github.com/ceph/ceph/pull/15920>`_, Wido den Hollander)
-* doc: [docs/quick-start]: update quick start to add a note for mgr create command for luminous+ builds (`pr#16350 <https://github.com/ceph/ceph/pull/16350>`_, Vasu Kulkarni)
-* doc: Documentation Fixes for http://tracker.ceph.com/issues/19879 (`issue#20057 <http://tracker.ceph.com/issues/20057>`_, `issue#19879 <http://tracker.ceph.com/issues/19879>`_, `pr#15606 <https://github.com/ceph/ceph/pull/15606>`_, Sameer Tiwari)
-* doc: Documentation updates for July 2017 releases (`pr#16401 <https://github.com/ceph/ceph/pull/16401>`_, Bryan Stillwell)
-* doc: document bluestore compression settings (`pr#16747 <https://github.com/ceph/ceph/pull/16747>`_, Kefu Chai)
-* doc: document mClock related options (`pr#16552 <https://github.com/ceph/ceph/pull/16552>`_, Kefu Chai)
-* doc: document `osd-agent-{max,low}-ops` options (`pr#13648 <https://github.com/ceph/ceph/pull/13648>`_, Kefu Chai)
-* doc: document perf historgrams (`pr#15150 <https://github.com/ceph/ceph/pull/15150>`_, Piotr Dałek)
-* doc: document "rados cleanup" in rados manpage (`issue#20894 <http://tracker.ceph.com/issues/20894>`_, `pr#16777 <https://github.com/ceph/ceph/pull/16777>`_, Nathan Cutler)
-* doc: document repair/scrub features (`issue#15786 <http://tracker.ceph.com/issues/15786>`_, `pr#9032 <https://github.com/ceph/ceph/pull/9032>`_, Kefu Chai, David Zafman)
-* doc: Document RGW quota cache options (`issue#18747 <http://tracker.ceph.com/issues/18747>`_, `pr#13395 <https://github.com/ceph/ceph/pull/13395>`_, Daniel Gryniewicz)
-* doc: Document that osd_heartbeat_grace applies to MON and OSD (`pr#13098 <https://github.com/ceph/ceph/pull/13098>`_, Wido den Hollander)
-* doc: document the setup of restful and dashboard plugins (`issue#20239 <http://tracker.ceph.com/issues/20239>`_, `pr#15707 <https://github.com/ceph/ceph/pull/15707>`_, Kefu Chai)
-* doc: explain about logging levels (`pr#12920 <https://github.com/ceph/ceph/pull/12920>`_, liuchang0812)
-* doc: fio: update README.md so only the fio ceph engine is built (`pr#15081 <https://github.com/ceph/ceph/pull/15081>`_, Kefu Chai)
-* doc: fix a typo (`pr#13930 <https://github.com/ceph/ceph/pull/13930>`_, Drunkard Zhang)
-* doc: fix broken link in erasure-code.rst (`issue#19972 <http://tracker.ceph.com/issues/19972>`_, `pr#15143 <https://github.com/ceph/ceph/pull/15143>`_, MinSheng Lin)
-* doc: fix document about rados mon (`pr#12662 <https://github.com/ceph/ceph/pull/12662>`_, liuchang0812)
-* doc: Fixed a typo in yum repo filename script (`pr#16431 <https://github.com/ceph/ceph/pull/16431>`_, Jeff Green)
-* doc: fixes a broken hyperlink to RADOS paper in architecture (`pr#13682 <https://github.com/ceph/ceph/pull/13682>`_, Tahia Khan)
-* doc: Fixes a typo (`pr#13985 <https://github.com/ceph/ceph/pull/13985>`_, Edwin F. Boza)
-* doc: Fixes parameter name in rbd configuration on openstack havana/icehouse (`issue#17978 <http://tracker.ceph.com/issues/17978>`_, `pr#13403 <https://github.com/ceph/ceph/pull/13403>`_, Michael Eischer)
-* doc: Fixes radosgw-admin ex: in swift auth section (`issue#16687 <http://tracker.ceph.com/issues/16687>`_, `pr#12646 <https://github.com/ceph/ceph/pull/12646>`_, SirishaGuduru)
-* doc:  fixes to silence sphinx-build (`pr#13997 <https://github.com/ceph/ceph/pull/13997>`_, Kefu Chai)
-* doc: fix factual inaccuracy in doc/architecture.rst (`pr#15235 <https://github.com/ceph/ceph/pull/15235>`_, Nathan Cutler, Sage Weil)
-* doc: fixing an error in 12.0.3 release notes (`pr#15195 <https://github.com/ceph/ceph/pull/15195>`_, Abhishek Lekshmanan)
-* doc: fix link for ceph-mgr cephx authorization (`pr#16246 <https://github.com/ceph/ceph/pull/16246>`_, Greg Farnum)
-* doc: fix link that pointed to a nonexistent file (`pr#14740 <https://github.com/ceph/ceph/pull/14740>`_, Peter Maloney)
-* doc: fix syntax on code snippets in cephfs/multimds (`pr#15499 <https://github.com/ceph/ceph/pull/15499>`_, John Spray)
-* doc: fix the librados c api can not compile problem (`pr#9396 <https://github.com/ceph/ceph/pull/9396>`_, song baisen)
-* doc: fix the links to http://ceph.com/docs (`issue#19090 <http://tracker.ceph.com/issues/19090>`_, `pr#13976 <https://github.com/ceph/ceph/pull/13976>`_, Kefu Chai)
-* doc: Fix typo and grammar in RGW config reference (`pr#13356 <https://github.com/ceph/ceph/pull/13356>`_, Ruben Kerkhof)
-* doc: fix typo in config.rst (`pr#16721 <https://github.com/ceph/ceph/pull/16721>`_, Jos Collin)
-* doc: fix typos in config.rst (`pr#16681 <https://github.com/ceph/ceph/pull/16681>`_, Song Shun)
-* doc: fix typos in radosgw-admin usage (`pr#13936 <https://github.com/ceph/ceph/pull/13936>`_, Enming Zhang)
-* doc: freshen mgr docs (`pr#15690 <https://github.com/ceph/ceph/pull/15690>`_, John Spray)
-* doc: hammer 0.94.10 release notes (`pr#13152 <https://github.com/ceph/ceph/pull/13152>`_, Nathan Cutler)
-* doc: Have install put manpages in the FreeBSD correct location (`pr#13301 <https://github.com/ceph/ceph/pull/13301>`_, Willem Jan Withagen)
-* doc: how to specify filesystem for cephfs clients (`pr#14087 <https://github.com/ceph/ceph/pull/14087>`_, John Spray)
-* doc: improve firewalld instructions (`pr#13360 <https://github.com/ceph/ceph/pull/13360>`_, Ken Dreyer)
-* doc: Indicate how to add multiple admin capbabilies (`pr#13956 <https://github.com/ceph/ceph/pull/13956>`_, Chu, Hua-Rong)
-* doc: instructions and guidance for multimds (`issue#19135 <http://tracker.ceph.com/issues/19135>`_, `pr#13830 <https://github.com/ceph/ceph/pull/13830>`_, John Spray)
-* doc: instructions for provisioning OpenStack VMs ad hoc (`pr#13368 <https://github.com/ceph/ceph/pull/13368>`_, Nathan Cutler)
-* doc: Jewel 10.2.6 release notes (`pr#13835 <https://github.com/ceph/ceph/pull/13835>`_, Abhishek Lekshmanan)
-* doc: Jewel v10.2.8 release notes (`pr#16274 <https://github.com/ceph/ceph/pull/16274>`_, Nathan Cutler)
-* doc: Jewel v10.2.9 release notes (`pr#16318 <https://github.com/ceph/ceph/pull/16318>`_, Nathan Cutler)
-* doc: kernel client os-recommendations update (`pr#13369 <https://github.com/ceph/ceph/pull/13369>`_, John Spray, Ilya Dryomov)
-* doc: kill some broken links (`pr#15203 <https://github.com/ceph/ceph/pull/15203>`_, liuchang0812)
-* doc: kill sphinx warnings (`pr#16198 <https://github.com/ceph/ceph/pull/16198>`_, Kefu Chai)
-* doc: luminous: doc: update rbd-mirroring documentation (`issue#20701 <http://tracker.ceph.com/issues/20701>`_, `pr#16912 <https://github.com/ceph/ceph/pull/16912>`_, Jason Dillaman)
-* doc: Luminous release notes typo fixes (`pr#15899 <https://github.com/ceph/ceph/pull/15899>`_, Abhishek Lekshmanan)
-* doc: mailmap: add affiliation for Zhu Shangzhong (`pr#16537 <https://github.com/ceph/ceph/pull/16537>`_, Zhu Shangzhong)
-* doc: mailmap: add Alibaba into organization map (`pr#14900 <https://github.com/ceph/ceph/pull/14900>`_, James Liu)
-* doc: mailmap: add Myoungwon Oh's mailmap and affiliation (`pr#15934 <https://github.com/ceph/ceph/pull/15934>`_, Myoungwon Oh)
-* doc: mailmap for v12.0.2 (`pr#14753 <https://github.com/ceph/ceph/pull/14753>`_, Abhishek Lekshmanan)
-* doc: mailmap: Michal Koutny affiliation (`pr#13036 <https://github.com/ceph/ceph/pull/13036>`_, Nathan Cutler)
-* doc: mailmap, organizationmap: add affiliation for Tushar Gohad (`pr#16081 <https://github.com/ceph/ceph/pull/16081>`_, Tushar Gohad)
-* doc:  .mailmap, .organizationmap: Update Fan Yang information and affiliation (`pr#16067 <https://github.com/ceph/ceph/pull/16067>`_, Fan Yang)
-* doc: .mailmap, .organizationmap: Update Song Weibin information and affiliation (`pr#16311 <https://github.com/ceph/ceph/pull/16311>`_, songweibin)
-* doc: .mailmap, .organizationmap: Update ztczll affiliation (`pr#16038 <https://github.com/ceph/ceph/pull/16038>`_, zhanglei)
-* doc: mailmap updates for v11.1.0 (`pr#12335 <https://github.com/ceph/ceph/pull/12335>`_, Abhishek Lekshmanan)
-* doc: mailmap updates (`pr#13309 <https://github.com/ceph/ceph/pull/13309>`_, Loic Dachary)
-* doc: mailmap: V12.0.1 credits (`pr#14479 <https://github.com/ceph/ceph/pull/14479>`_, M Ranga Swami Reddy)
-* doc: mailmap: Willem Jan Withagen affiliation (`pr#13034 <https://github.com/ceph/ceph/pull/13034>`_, Willem Jan Withagen)
-* doc: mailmap: ztczll affiliation (`pr#15079 <https://github.com/ceph/ceph/pull/15079>`_, zhanglei)
-* doc: man/8/ceph-disk: fix formatting (`pr#13969 <https://github.com/ceph/ceph/pull/13969>`_, Kefu Chai)
-* doc: mention certain conf vars should be in global (`pr#15119 <https://github.com/ceph/ceph/pull/15119>`_, Ali Maredia)
-* doc: mention ENXIO change in the 10.2.6 release notes (`pr#13878 <https://github.com/ceph/ceph/pull/13878>`_, Nathan Cutler)
-* doc: mention --show-mappings in crushtool manpage (`issue#19649 <http://tracker.ceph.com/issues/19649>`_, `pr#14599 <https://github.com/ceph/ceph/pull/14599>`_, Nathan Cutler, Loic Dachary)
-* doc: mention teuthology-worker security group (`pr#14748 <https://github.com/ceph/ceph/pull/14748>`_, Nathan Cutler)
-* doc: Merge pull request from stiwari/wip-19879 (`issue#19879 <http://tracker.ceph.com/issues/19879>`_, `pr#15609 <https://github.com/ceph/ceph/pull/15609>`_, Sameer Tiwari)
-* doc: mgr/restful: bind to :: and update docs (`pr#16267 <https://github.com/ceph/ceph/pull/16267>`_, Sage Weil)
-* doc: minor changes in fuse client config reference (`pr#13065 <https://github.com/ceph/ceph/pull/13065>`_, Barbora Ančincová)
-* doc: minor change to a cloud testing paragraph (`pr#13277 <https://github.com/ceph/ceph/pull/13277>`_, Jan Fajerski)
-* doc: minor fixes in radosgw/ (`pr#15103 <https://github.com/ceph/ceph/pull/15103>`_, Drunkard Zhang)
-* doc: min_size advice is not helpful (`pr#12936 <https://github.com/ceph/ceph/pull/12936>`_, Brad Hubbard)
-* doc: misc minor fixes (`pr#13713 <https://github.com/ceph/ceph/pull/13713>`_, Drunkard Zhang)
-* doc: Modify Configuring Cinder section (`issue#18840 <http://tracker.ceph.com/issues/18840>`_, `pr#13400 <https://github.com/ceph/ceph/pull/13400>`_, Shinobu Kinjo)
-* doc: op queue and mclock related options (`pr#16662 <https://github.com/ceph/ceph/pull/16662>`_, J. Eric Ivancich)
-* doc: organizationmap: add Xianxia Xiao to Kylin Cloud team (`pr#12718 <https://github.com/ceph/ceph/pull/12718>`_, Yunchuan Wen)
-* doc: PendingReleaseNotes: "ceph -w" behavior has changed drastically (`pr#16425 <https://github.com/ceph/ceph/pull/16425>`_, Joao Eduardo Luis, Nathan Cutler)
-* doc: PendingReleaseNotes: notes on whiteouts vs pgnls (`pr#15575 <https://github.com/ceph/ceph/pull/15575>`_, Sage Weil)
-* doc: PendingReleaseNotes: note the fuse fstab format change (`pr#13259 <https://github.com/ceph/ceph/pull/13259>`_, John Spray)
-* doc: PendingReleaseNotes: recent cephfs changes (`pr#14196 <https://github.com/ceph/ceph/pull/14196>`_, John Spray)
-* doc: PendingReleaseNotes: warning about 'osd rm ...' and #19119 (`issue#19119 <http://tracker.ceph.com/issues/19119>`_, `pr#13731 <https://github.com/ceph/ceph/pull/13731>`_, Sage Weil)
-* doc: peoplemap: add pdonnell alias (`pr#14352 <https://github.com/ceph/ceph/pull/14352>`_, Patrick Donnelly)
-* doc: radosgw-admin: new 'global quota' commands update period config (`issue#19409 <http://tracker.ceph.com/issues/19409>`_, `pr#14252 <https://github.com/ceph/ceph/pull/14252>`_, Casey Bodley)
-* doc: README.FreeBSD: update current status (`pr#12096 <https://github.com/ceph/ceph/pull/12096>`_, Willem Jan Withagen)
-* doc: README.FreeBSD: Update the status (`pr#14406 <https://github.com/ceph/ceph/pull/14406>`_, Willem Jan Withagen)
-* doc: README.md: fix build instructions inconsistent (`pr#14555 <https://github.com/ceph/ceph/pull/14555>`_, Yao Zongyou)
-* doc: README.md: use github heading syntax to mark the headings (`pr#14591 <https://github.com/ceph/ceph/pull/14591>`_, Kefu Chai)
-* doc: release-notes clarify about rgw encryption (`pr#14800 <https://github.com/ceph/ceph/pull/14800>`_, Abhishek Lekshmanan)
-* doc: release notes for v10.2.7 Jewel (`pr#14295 <https://github.com/ceph/ceph/pull/14295>`_, Abhishek Lekshmanan)
-* doc: release notes for v11.1.1 (`pr#12642 <https://github.com/ceph/ceph/pull/12642>`_, Abhishek Lekshmanan)
-* doc: release notes for v12.0.3 (dev) (`pr#15090 <https://github.com/ceph/ceph/pull/15090>`_, Abhishek Lekshmanan)
-* doc: releases update the luminous, hammer, jewel release dates (`pr#13584 <https://github.com/ceph/ceph/pull/13584>`_, Abhishek Lekshmanan)
-* doc: remove deprecated subcommand in man/8/ceph.rst (`pr#14928 <https://github.com/ceph/ceph/pull/14928>`_, Drunkard Zhang)
-* doc: remove docs on non-existant command (`pr#16616 <https://github.com/ceph/ceph/pull/16616>`_, Luo Kexue, Kefu Chai)
-* doc: remove duplicated references (`pr#13396 <https://github.com/ceph/ceph/pull/13396>`_, Kefu Chai)
-* doc: remove mentions about mon_osd_min_down_reports (`issue#19016 <http://tracker.ceph.com/issues/19016>`_, `pr#13558 <https://github.com/ceph/ceph/pull/13558>`_, Barbora Ančincová)
-* doc: remove some non-existent and fix the default value according to … (`pr#15664 <https://github.com/ceph/ceph/pull/15664>`_, Leo Zhang)
-* doc: Remove "splitting" state (`pr#12636 <https://github.com/ceph/ceph/pull/12636>`_, Brad Hubbard)
-* doc: reword mds deactivate docs; add optional fs_name argument (`issue#20607 <http://tracker.ceph.com/issues/20607>`_, `pr#16471 <https://github.com/ceph/ceph/pull/16471>`_, Jan Fajerski)
-* doc: Re-word the warnings about using git subtrees (`pr#14999 <https://github.com/ceph/ceph/pull/14999>`_, J. Eric Ivancich)
-* doc: rgw clarify limitations when creating tenant names (`pr#16418 <https://github.com/ceph/ceph/pull/16418>`_, Abhishek Lekshmanan)
-* doc: rgw: Clean up create subuser parameters (`pr#14335 <https://github.com/ceph/ceph/pull/14335>`_, hrchu)
-* doc: rgw: correct get usage parameter default value (`pr#14372 <https://github.com/ceph/ceph/pull/14372>`_, hrchu)
-* doc: rgw: Get user usage needs to specify user (`pr#14804 <https://github.com/ceph/ceph/pull/14804>`_, hrchu)
-* doc: rgw: make a note abt system users vs normal users (`issue#18889 <http://tracker.ceph.com/issues/18889>`_, `pr#13461 <https://github.com/ceph/ceph/pull/13461>`_, Abhishek Lekshmanan)
-* doc: rgw: note rgw_enable_usage_log option in adminops guide (`pr#14803 <https://github.com/ceph/ceph/pull/14803>`_, hrchu)
-* doc: rgw: remove mention of megabytes for quotas (`pr#14413 <https://github.com/ceph/ceph/pull/14413>`_, Hans van den Bogert)
-* doc: rgw: Rewrite Java swift examples (`pr#14268 <https://github.com/ceph/ceph/pull/14268>`_, Chu, Hua-Rong)
-* doc: rgw: Rewrite the key management (`pr#14384 <https://github.com/ceph/ceph/pull/14384>`_, hrchu)
-* doc: rgw server-side encryption and barbican (`pr#13483 <https://github.com/ceph/ceph/pull/13483>`_, Adam Kupczyk, Casey Bodley)
-* doc: script: build-doc/serve-doc fixes (`pr#14438 <https://github.com/ceph/ceph/pull/14438>`_, Abhishek Lekshmanan)
-* doc: script: ceph-release-notes: use https instead of http (`pr#14103 <https://github.com/ceph/ceph/pull/14103>`_, Kefu Chai)
-* docs: doc/cephfs/troubleshooting: fix broken bullet list (`pr#12894 <https://github.com/ceph/ceph/pull/12894>`_, Dan Mick)
-* docs: doc/dev: add some info about FreeBSD (`pr#14503 <https://github.com/ceph/ceph/pull/14503>`_, Willem Jan Withagen)
-* docs: doc/release-notes: fix ceph-deploy command (`pr#15987 <https://github.com/ceph/ceph/pull/15987>`_, Sage Weil)
-* docs: doc/release-note: update release-note (`pr#15748 <https://github.com/ceph/ceph/pull/15748>`_, liuchang0812)
-* docs: document "osd recovery max single start" setting (`issue#17396 <http://tracker.ceph.com/issues/17396>`_, `pr#15275 <https://github.com/ceph/ceph/pull/15275>`_, Ken Dreyer)
-* docs: mailmap: fix Zhao Chao affiliation (`pr#13413 <https://github.com/ceph/ceph/pull/13413>`_, Zhao Chao)
-* docs: mailmap: Leo Zhang infomation and affiliation (`pr#15145 <https://github.com/ceph/ceph/pull/15145>`_, Leo Zhang)
-* docs: mailmap: Liu Yang affiliation (`pr#13427 <https://github.com/ceph/ceph/pull/13427>`_, LiuYang)
-* docs: mailmap: shiqi affiliation (`pr#14361 <https://github.com/ceph/ceph/pull/14361>`_, shiqi)
-* docs: mailmap: update organization info (`pr#14747 <https://github.com/ceph/ceph/pull/14747>`_, liuchang0812)
-* docs: mailmap: Weibing Zhang mailmap affiliation (`pr#15076 <https://github.com/ceph/ceph/pull/15076>`_, Weibing Zhang)
-* docs: PendingReleaseNotes: mention forced recovery (`pr#16775 <https://github.com/ceph/ceph/pull/16775>`_, Piotr Dałek)
-* docs: Remove contractions from the documentation (`pr#16629 <https://github.com/ceph/ceph/pull/16629>`_, John Wilkins)
-* doc: style fix for doc/cephfs/client-config-ref.rst (`pr#14840 <https://github.com/ceph/ceph/pull/14840>`_, Drunkard Zhang)
-* doc: tools/cephfs: fix cephfs-journal-tool --help (`pr#15614 <https://github.com/ceph/ceph/pull/15614>`_, John Spray)
-* doc: two minor fixes (`pr#14494 <https://github.com/ceph/ceph/pull/14494>`_, Drunkard Zhang)
-* doc: typo fixes on hyperlink/words (`pr#15144 <https://github.com/ceph/ceph/pull/15144>`_, Drunkard Zhang)
-* doc: typo fix in s3_compliance (`pr#12598 <https://github.com/ceph/ceph/pull/12598>`_, LiuYang)
-* doc: typo in hit_set_search_last_n (`pr#14108 <https://github.com/ceph/ceph/pull/14108>`_, Sven Seeberg)
-* doc: Update adminops.rst (`pr#13893 <https://github.com/ceph/ceph/pull/13893>`_, Chu, Hua-Rong)
-* doc: update ceph(8) man page with new sub-commands (`pr#16437 <https://github.com/ceph/ceph/pull/16437>`_, Kefu Chai)
-* doc: Update CephFS disaster recovery documentation (`pr#12370 <https://github.com/ceph/ceph/pull/12370>`_, Wido den Hollander)
-* doc: Update disk thread section to reflect that scrubbing is no longe… (`pr#12621 <https://github.com/ceph/ceph/pull/12621>`_, Nick Fisk)
-* doc: update intro, quick start docs (`pr#16224 <https://github.com/ceph/ceph/pull/16224>`_, Sage Weil)
-* doc: Update keystone.rst (`pr#12717 <https://github.com/ceph/ceph/pull/12717>`_, Chu, Hua-Rong)
-* doc: update links to point to ceph/qa instead of ceph-qa-suite (`pr#13397 <https://github.com/ceph/ceph/pull/13397>`_, Jan Fajerski, Nathan Cutler)
-* doc: Update .organizationmap (`pr#16507 <https://github.com/ceph/ceph/pull/16507>`_, luokexue)
-* doc: update packages mentioned by build-doc and related doc (`pr#14649 <https://github.com/ceph/ceph/pull/14649>`_, Yu Shengzuo)
-* doc: Update sample.ceph.conf (`pr#13751 <https://github.com/ceph/ceph/pull/13751>`_, Saumay Agrawal)
-* doc: update sample explaning "%" operator in test suites (`pr#15511 <https://github.com/ceph/ceph/pull/15511>`_, Kefu Chai)
-* doc: Update some RGW documentation (`pr#15175 <https://github.com/ceph/ceph/pull/15175>`_, Jens Rosenboom)
-* doc: update the pool names created by vstart.sh by default (`pr#16652 <https://github.com/ceph/ceph/pull/16652>`_, Zhu Shangzhong)
-* doc: update the rados namespace docs (`pr#15838 <https://github.com/ceph/ceph/pull/15838>`_, Abhishek Lekshmanan)
-* doc: update the support status of swift static website (`pr#13824 <https://github.com/ceph/ceph/pull/13824>`_, Jing Wenjun)
-* doc: update the usage of 'ceph-deploy purge' (`pr#15080 <https://github.com/ceph/ceph/pull/15080>`_, Yu Shengzuo)
-* doc: update to new ceph fs commands (`pr#13346 <https://github.com/ceph/ceph/pull/13346>`_, Patrick Donnelly)
-* doc: upmap docs; various missing links for release notes (`pr#16637 <https://github.com/ceph/ceph/pull/16637>`_, Sage Weil)
-* doc: use do_cmake.sh instead of `cmake ..` (`pr#15110 <https://github.com/ceph/ceph/pull/15110>`_, Kefu Chai)
-* doc: v12.0.0 release notes (`pr#13281 <https://github.com/ceph/ceph/pull/13281>`_, Abhishek Lekshmanan)
-* doc: v12.0.2 (dev) release notes (`pr#14625 <https://github.com/ceph/ceph/pull/14625>`_, Abhishek Lekshmanan)
-* doc: v12.1.0 release notes notable changes addition again (`pr#15857 <https://github.com/ceph/ceph/pull/15857>`_, Abhishek Lekshmanan)
-* doc: various fixes (`pr#16723 <https://github.com/ceph/ceph/pull/16723>`_, Kefu Chai)
-* doc: vstart: add --help documentation for rgw_num (`pr#13817 <https://github.com/ceph/ceph/pull/13817>`_, Ali Maredia)
-* doc: wip-doc-multisite ports downstream multisite document upstream (`pr#14259 <https://github.com/ceph/ceph/pull/14259>`_, John Wilkins)
-* doc: Wip osd discussion docs (`pr#13344 <https://github.com/ceph/ceph/pull/13344>`_, Greg Farnum)
-* filestore: os/filestore: Exclude BTRFS on FreeBSD (`pr#16171 <https://github.com/ceph/ceph/pull/16171>`_, Willem Jan Withagen)
-* filestore: os/filestore/FileJournal: Fix typo in the comment (`pr#14493 <https://github.com/ceph/ceph/pull/14493>`_, Zhou Zhengping)
-* filestore: os/filestore: use existing variable for same func (`pr#13742 <https://github.com/ceph/ceph/pull/13742>`_, Pan Liu)
-* filestore: os/filestore: when print log, use `__func__` instead of hard code function name (`pr#15261 <https://github.com/ceph/ceph/pull/15261>`_, mychoxin)
-* filestore: os/filestore: zfs add get_name() (`pr#15650 <https://github.com/ceph/ceph/pull/15650>`_, Yanhu Cao)
-    Fix full testing in cephtool/test.sh when used by rados suite
-    @Jing-Scott  updated, addressing @rzarzynski's change request
-* librados: add log channel to rados_monitor_log2 callback (`pr#15926 <https://github.com/ceph/ceph/pull/15926>`_, Sage Weil)
-* librados: add missing implementations for C service daemon API methods (`pr#16543 <https://github.com/ceph/ceph/pull/16543>`_, Jason Dillaman)
-* librados: add override for librados (`issue#18922 <http://tracker.ceph.com/issues/18922>`_, `pr#13442 <https://github.com/ceph/ceph/pull/13442>`_, liuchang0812)
-* librados: add override in headers (`pr#13775 <https://github.com/ceph/ceph/pull/13775>`_, liuchang0812)
-* librados: asynchronous selfmanaged_snap_create/selfmanaged_snap_remove APIs (`issue#16180 <http://tracker.ceph.com/issues/16180>`_, `pr#12050 <https://github.com/ceph/ceph/pull/12050>`_, Jason Dillaman)
-* librados: do not expose non-public symbols (`pr#13265 <https://github.com/ceph/ceph/pull/13265>`_, Kefu Chai)
-* librados: fix compile errors from simplified aio completions (`pr#12849 <https://github.com/ceph/ceph/pull/12849>`_, xie xingguo)
-* librados: fix rados_pool_list when buf is null (`pr#14859 <https://github.com/ceph/ceph/pull/14859>`_, Sage Weil)
-* librados: redirect balanced reads to acting primary when targeting object isn't recovered (`issue#17968 <http://tracker.ceph.com/issues/17968>`_, `pr#15489 <https://github.com/ceph/ceph/pull/15489>`_, Xuehan Xu)
-* librados: remove legacy object listing API, clean up newer api (`pr#13149 <https://github.com/ceph/ceph/pull/13149>`_, Sage Weil)
-* librados: replace the var name from onack to complete (`pr#13857 <https://github.com/ceph/ceph/pull/13857>`_, Pan Liu)
-* librados: set the flag CEPH_OSD_FLAG_FULL_TRY of Op in the right place (`pr#14193 <https://github.com/ceph/ceph/pull/14193>`_, Pan Liu)
-* librados: use cursor for nobjects listing (`pr#13323 <https://github.com/ceph/ceph/pull/13323>`_, Yehuda Sadeh, Sage Weil)
-* librbd: add compare and write API (`pr#14868 <https://github.com/ceph/ceph/pull/14868>`_, Zhengyong Wang, Jason Dillaman)
-* librbd: add create timestamp metadata for image (`pr#15757 <https://github.com/ceph/ceph/pull/15757>`_, runsisi)
-* librbd: added rbd_flatten_with_progress to API (`issue#15824 <http://tracker.ceph.com/issues/15824>`_, `pr#12905 <https://github.com/ceph/ceph/pull/12905>`_, Ricardo Dias)
-* librbd: add LIBRBD_SUPPORTS_WRITESAME support (`pr#16583 <https://github.com/ceph/ceph/pull/16583>`_, Xiubo Li)
-* librbd: add override keyword in header files (`issue#19012 <http://tracker.ceph.com/issues/19012>`_, `pr#13536 <https://github.com/ceph/ceph/pull/13536>`_, liuchang0812)
-* librbd: add SnapshotNamespace to ImageCtx (`pr#12970 <https://github.com/ceph/ceph/pull/12970>`_, Victor Denisov)
-* librbd: add writesame API (`pr#12645 <https://github.com/ceph/ceph/pull/12645>`_, Mingxin Liu, Gui Hecheng)
-* librbd: allow to open an image without opening the parent image (`issue#18325 <http://tracker.ceph.com/issues/18325>`_, `pr#12885 <https://github.com/ceph/ceph/pull/12885>`_, Ricardo Dias)
-* librbd: asynchronous clone state machine (`pr#12041 <https://github.com/ceph/ceph/pull/12041>`_, Dongsheng Yang)
-* librbd: asynchronous image removal state machine (`pr#12102 <https://github.com/ceph/ceph/pull/12102>`_, Dongsheng Yang, Venky Shankar)
-* librbd: avoid possible recursive lock when racing acquire lock (`issue#17447 <http://tracker.ceph.com/issues/17447>`_, `pr#12991 <https://github.com/ceph/ceph/pull/12991>`_, Jason Dillaman)
-* librbd: changed the return type of ImageRequestWQ::discard() (`issue#18511 <http://tracker.ceph.com/issues/18511>`_, `pr#14032 <https://github.com/ceph/ceph/pull/14032>`_, Jos Collin)
-* librbd: cleanup logging code under librbd/io (`pr#14975 <https://github.com/ceph/ceph/pull/14975>`_, runsisi)
-* librbd: corrected resize RPC message backwards compatibility (`issue#19636 <http://tracker.ceph.com/issues/19636>`_, `pr#14615 <https://github.com/ceph/ceph/pull/14615>`_, Jason Dillaman)
-* librbd: create fewer empty objects during copyup (`issue#15028 <http://tracker.ceph.com/issues/15028>`_, `pr#12326 <https://github.com/ceph/ceph/pull/12326>`_, Douglas Fuller, Venky Shankar)
-* librbd: deferred image deletion (`issue#18481 <http://tracker.ceph.com/issues/18481>`_, `pr#13105 <https://github.com/ceph/ceph/pull/13105>`_, Ricardo Dias)
-* librbd: delay mirror registration when creating clones (`issue#17993 <http://tracker.ceph.com/issues/17993>`_, `pr#12839 <https://github.com/ceph/ceph/pull/12839>`_, Jason Dillaman)
-* librbd: discard related IO should skip op if object non-existent (`issue#19962 <http://tracker.ceph.com/issues/19962>`_, `pr#15239 <https://github.com/ceph/ceph/pull/15239>`_, Mykola Golub)
-* librbd: do not instantiate templates while building tests (`issue#18938 <http://tracker.ceph.com/issues/18938>`_, `pr#14891 <https://github.com/ceph/ceph/pull/14891>`_, Kefu Chai)
-* librbd: do not raise an error if trash list returns -ENOENT (`pr#15085 <https://github.com/ceph/ceph/pull/15085>`_, runsisi)
-* librbd: don't continue to remove an image w/ incompatible features (`issue#18315 <http://tracker.ceph.com/issues/18315>`_, `pr#12638 <https://github.com/ceph/ceph/pull/12638>`_, Dongsheng Yang)
-* librbd: eliminate compiler warnings (`pr#13729 <https://github.com/ceph/ceph/pull/13729>`_, Jason Dillaman)
-* librbd: fail IO request when exclusive lock cannot be obtained (`pr#15860 <https://github.com/ceph/ceph/pull/15860>`_, Jason Dillaman)
-* librbd: filter expected error codes from is_exclusive_lock_owner (`issue#20182 <http://tracker.ceph.com/issues/20182>`_, `pr#15483 <https://github.com/ceph/ceph/pull/15483>`_, Jason Dillaman)
-* librbd: fix clang compilation error (`issue#19260 <http://tracker.ceph.com/issues/19260>`_, `pr#13926 <https://github.com/ceph/ceph/pull/13926>`_, Mykola Golub)
-* librbd: fixed initializer list ordering (`pr#13042 <https://github.com/ceph/ceph/pull/13042>`_, Jason Dillaman)
-* librbd: fix issues with image removal state machine (`pr#15734 <https://github.com/ceph/ceph/pull/15734>`_, Jason Dillaman)
-* librbd: fix rbd_metadata_list and rbd_metadata_get (`issue#19588 <http://tracker.ceph.com/issues/19588>`_, `pr#14471 <https://github.com/ceph/ceph/pull/14471>`_, Mykola Golub)
-* librbd: fix segfault on EOPNOTSUPP returned while fetching snapshot timestamp (`issue#18839 <http://tracker.ceph.com/issues/18839>`_, `pr#13287 <https://github.com/ceph/ceph/pull/13287>`_, Gui Hecheng)
-* librbd: fix valgrind errors and ensure tests detect future leaks (`pr#15415 <https://github.com/ceph/ceph/pull/15415>`_, Jason Dillaman)
-* librbd: fix valid coverity warnings (`pr#14023 <https://github.com/ceph/ceph/pull/14023>`_, Jason Dillaman)
-* librbd: image create validates that pool supports overwrites (`issue#19081 <http://tracker.ceph.com/issues/19081>`_, `pr#13986 <https://github.com/ceph/ceph/pull/13986>`_, Jason Dillaman)
-* librbd: image-extent cache needs to clip out-of-bounds read buffers (`pr#13679 <https://github.com/ceph/ceph/pull/13679>`_, Jason Dillaman)
-* librbd: Include WorkQueue.h since we use it (`issue#18862 <http://tracker.ceph.com/issues/18862>`_, `pr#13322 <https://github.com/ceph/ceph/pull/13322>`_, Boris Ranto)
-* librbd: initialize diff parent overlap to zero (`pr#13077 <https://github.com/ceph/ceph/pull/13077>`_, Gu Zhongyan)
-* librbd: introduce new constants for tracking max block name prefix (`issue#18653 <http://tracker.ceph.com/issues/18653>`_, `pr#13141 <https://github.com/ceph/ceph/pull/13141>`_, Jason Dillaman)
-* librbd: is_exclusive_lock_owner API should ping OSD (`issue#19287 <http://tracker.ceph.com/issues/19287>`_, `pr#14003 <https://github.com/ceph/ceph/pull/14003>`_, Jason Dillaman)
-* librbd: managed lock refactoring (`pr#12922 <https://github.com/ceph/ceph/pull/12922>`_, Mykola Golub)
-* librbd: metadata_set API operation should not change global config setting (`issue#18465 <http://tracker.ceph.com/issues/18465>`_, `pr#12843 <https://github.com/ceph/ceph/pull/12843>`_, Mykola Golub)
-* librbd: minor fixes for image trash move (`pr#14834 <https://github.com/ceph/ceph/pull/14834>`_, runsisi)
-* librbd: new API method to force break a peer's exclusive lock (`issue#18429 <http://tracker.ceph.com/issues/18429>`_, `issue#16988 <http://tracker.ceph.com/issues/16988>`_, `issue#18327 <http://tracker.ceph.com/issues/18327>`_, `pr#12639 <https://github.com/ceph/ceph/pull/12639>`_, Jason Dillaman)
-* librbd: Notifier::notify API improvement (`pr#14072 <https://github.com/ceph/ceph/pull/14072>`_, Mykola Golub)
-* librbd: optimize copy-up to add hints only once to object op (`issue#19875 <http://tracker.ceph.com/issues/19875>`_, `pr#15037 <https://github.com/ceph/ceph/pull/15037>`_, Mykola Golub)
-* librbd: pass an uint64_t to clip_io() as the third param (`issue#18938 <http://tracker.ceph.com/issues/18938>`_, `pr#14159 <https://github.com/ceph/ceph/pull/14159>`_, Kefu Chai)
-* librbd: permit removal of image being bootstrapped by rbd-mirror (`issue#16555 <http://tracker.ceph.com/issues/16555>`_, `pr#12549 <https://github.com/ceph/ceph/pull/12549>`_, Mykola Golub)
-* librbd: possible deadlock with flush if refresh in-progress (`issue#18419 <http://tracker.ceph.com/issues/18419>`_, `pr#12838 <https://github.com/ceph/ceph/pull/12838>`_, Jason Dillaman)
-* librbd: potential read IO hang when image is flattened (`issue#19832 <http://tracker.ceph.com/issues/19832>`_, `pr#15234 <https://github.com/ceph/ceph/pull/15234>`_, Jason Dillaman)
-* librbd: potential use of uninitialised value in ImageWatcher (`pr#14091 <https://github.com/ceph/ceph/pull/14091>`_, Mykola Golub)
-* librbd: prevent self-blacklisting during break lock (`issue#18666 <http://tracker.ceph.com/issues/18666>`_, `pr#13110 <https://github.com/ceph/ceph/pull/13110>`_, Jason Dillaman)
-* librbd: race initializing exclusive lock and configuring IO path (`pr#13086 <https://github.com/ceph/ceph/pull/13086>`_, Jason Dillaman)
-* librbd: random unit test failures due to shut down race (`issue#19389 <http://tracker.ceph.com/issues/19389>`_, `pr#14166 <https://github.com/ceph/ceph/pull/14166>`_, Jason Dillaman)
-* librbd: rbd ack cleanup (`pr#13791 <https://github.com/ceph/ceph/pull/13791>`_, runsisi)
-* librbd: reacquire lock should update lock owner client id (`issue#19929 <http://tracker.ceph.com/issues/19929>`_, `pr#15093 <https://github.com/ceph/ceph/pull/15093>`_, Jason Dillaman)
-* librbd: reduce potential of erroneous blacklisting on image close (`issue#19970 <http://tracker.ceph.com/issues/19970>`_, `pr#15162 <https://github.com/ceph/ceph/pull/15162>`_, Jason Dillaman)
-* librbd: refactor exclusive lock support into generic managed lock (`issue#17016 <http://tracker.ceph.com/issues/17016>`_, `pr#12846 <https://github.com/ceph/ceph/pull/12846>`_, Ricardo Dias, Jason Dillaman)
-* librbd: relax "is parent mirrored" check when enabling mirroring for pool (`issue#19130 <http://tracker.ceph.com/issues/19130>`_, `pr#13752 <https://github.com/ceph/ceph/pull/13752>`_, Mykola Golub)
-* librbd: remove redundant check for image id emptiness (`pr#14830 <https://github.com/ceph/ceph/pull/14830>`_, runsisi)
-* librbd: remove unnecessary dependencies of ManagedLock (`pr#12982 <https://github.com/ceph/ceph/pull/12982>`_, Jason Dillaman)
-* librbd: remove unused rbd_image_options_t ostream operator (`pr#15443 <https://github.com/ceph/ceph/pull/15443>`_, Mykola Golub)
-* librbd: resolve static analyser warnings (`pr#12863 <https://github.com/ceph/ceph/pull/12863>`_, Jason Dillaman)
-* librbd: scatter/gather support for the C API (`issue#13025 <http://tracker.ceph.com/issues/13025>`_, `pr#13447 <https://github.com/ceph/ceph/pull/13447>`_, Jason Dillaman)
-* librbd: silence -Wunused-variable warning (`pr#14953 <https://github.com/ceph/ceph/pull/14953>`_, Kefu Chai)
-* librbd: simplify image open/close semantics (`pr#13701 <https://github.com/ceph/ceph/pull/13701>`_, Jason Dillaman)
-* librbd: support for shared locking in ManagedLock (`pr#12886 <https://github.com/ceph/ceph/pull/12886>`_, Ricardo Dias)
-* librbd: support to list snapshot timestamp (`issue#808 <http://tracker.ceph.com/issues/808>`_, `pr#12817 <https://github.com/ceph/ceph/pull/12817>`_, Pan Liu)
-* librbd: Uninitialized variable used handle_refresh() (`pr#16724 <https://github.com/ceph/ceph/pull/16724>`_, amitkuma)
-* librbd: use 'override' keyword instead of 'virtual' (`issue#18922 <http://tracker.ceph.com/issues/18922>`_, `pr#13437 <https://github.com/ceph/ceph/pull/13437>`_, liuchang0812)
-* librbd: warning message for mirroring pool option (`issue#18125 <http://tracker.ceph.com/issues/18125>`_, `pr#12319 <https://github.com/ceph/ceph/pull/12319>`_, Gaurav Kumar Garg)
-* log: use one write system call per message (`pr#11955 <https://github.com/ceph/ceph/pull/11955>`_, Patrick Donnelly)
-* mds: add authority check for delay dirfrag split (`issue#18487 <http://tracker.ceph.com/issues/18487>`_, `pr#12994 <https://github.com/ceph/ceph/pull/12994>`_, "Yan, Zheng")
-* mds: add override in headers (`pr#13691 <https://github.com/ceph/ceph/pull/13691>`_, liuchang0812)
-* mds: add override in mds subsystem (`issue#18922 <http://tracker.ceph.com/issues/18922>`_, `pr#13438 <https://github.com/ceph/ceph/pull/13438>`_, liuchang0812)
-* mds: add perf counters for file system operations (`pr#14938 <https://github.com/ceph/ceph/pull/14938>`_, Michael Sevilla)
-* mds: automate MDS object count tracking (`pr#13591 <https://github.com/ceph/ceph/pull/13591>`_, Patrick Donnelly)
-* mds: bump client_reply debug to match client_req (`pr#14036 <https://github.com/ceph/ceph/pull/14036>`_, Patrick Donnelly)
-* mds: change_attr++ and set ctime for set_vxattr (`issue#19583 <http://tracker.ceph.com/issues/19583>`_, `pr#14726 <https://github.com/ceph/ceph/pull/14726>`_, Patrick Donnelly)
-* mds: change the type of data_pools (`pr#15278 <https://github.com/ceph/ceph/pull/15278>`_, Vicente Cheng)
-* mds: check export pin during replay (`issue#20039 <http://tracker.ceph.com/issues/20039>`_, `pr#15205 <https://github.com/ceph/ceph/pull/15205>`_, Patrick Donnelly)
-* mds: check for errors decoding backtraces (`issue#18311 <http://tracker.ceph.com/issues/18311>`_, `pr#12588 <https://github.com/ceph/ceph/pull/12588>`_, John Spray)
-* mds:  Client syncfs is slow (waits for next MDS tick) (`issue#20129 <http://tracker.ceph.com/issues/20129>`_, `pr#15544 <https://github.com/ceph/ceph/pull/15544>`_, dongdong tao)
-* mds: don't assert on read errors in RecoveryQueue (`issue#19282 <http://tracker.ceph.com/issues/19282>`_, `pr#14017 <https://github.com/ceph/ceph/pull/14017>`_, John Spray)
-* mds: don't modify inode that is not projected (`issue#16768 <http://tracker.ceph.com/issues/16768>`_, `pr#13052 <https://github.com/ceph/ceph/pull/13052>`_, "Yan, Zheng")
-* mds: drop partial entry and adjust write_pos when opening PurgeQueue (`issue#19450 <http://tracker.ceph.com/issues/19450>`_, `pr#14447 <https://github.com/ceph/ceph/pull/14447>`_, "Yan, Zheng")
-* mds: explicitly output error msg for dump cache asok command (`pr#15592 <https://github.com/ceph/ceph/pull/15592>`_, Zhi Zhang)
-* mds: extend 'p' auth cap to cover all vxattr stuff (`issue#19075 <http://tracker.ceph.com/issues/19075>`_, `pr#13628 <https://github.com/ceph/ceph/pull/13628>`_, John Spray)
-* mds: finish clientreplay requests before requesting active state (`issue#18461 <http://tracker.ceph.com/issues/18461>`_, `pr#12852 <https://github.com/ceph/ceph/pull/12852>`_, Yan, Zheng)
-* mds: fix bad iterator dereference reported by coverity (`issue#18830 <http://tracker.ceph.com/issues/18830>`_, `pr#13272 <https://github.com/ceph/ceph/pull/13272>`_, John Spray)
-* mds: fix CDir::merge() for mds_debug_auth_pins (`issue#19946 <http://tracker.ceph.com/issues/19946>`_, `pr#15130 <https://github.com/ceph/ceph/pull/15130>`_, "Yan, Zheng")
-* mds: fix client ID truncation (`pr#15258 <https://github.com/ceph/ceph/pull/15258>`_, Henry Chang)
-* mds: fix handling very fast delete ops (`issue#19245 <http://tracker.ceph.com/issues/19245>`_, `pr#13899 <https://github.com/ceph/ceph/pull/13899>`_, John Spray)
-* mds: fix hangs involving re-entrant calls to journaler (`issue#20165 <http://tracker.ceph.com/issues/20165>`_, `pr#15430 <https://github.com/ceph/ceph/pull/15430>`_, John Spray)
-* mds: fix incorrect assertion in Server::_dir_is_nonempty() (`issue#18578 <http://tracker.ceph.com/issues/18578>`_, `pr#12973 <https://github.com/ceph/ceph/pull/12973>`_, Yan, Zheng)
-* mds: fix IO error handling in SessionMap (`pr#13464 <https://github.com/ceph/ceph/pull/13464>`_, John Spray)
-* mds: fix mantle script to not fail for last rank (`issue#19589 <http://tracker.ceph.com/issues/19589>`_, `pr#14704 <https://github.com/ceph/ceph/pull/14704>`_, Patrick Donnelly)
-* mds: fix mgrc shutdown (`issue#19566 <http://tracker.ceph.com/issues/19566>`_, `pr#14505 <https://github.com/ceph/ceph/pull/14505>`_, John Spray)
-* mds: fix null pointer dereference in Locker::handle_client_caps (`issue#18306 <http://tracker.ceph.com/issues/18306>`_, `pr#12808 <https://github.com/ceph/ceph/pull/12808>`_, Yan, Zheng)
-* mds: fix stray creation/removal notification (`issue#19630 <http://tracker.ceph.com/issues/19630>`_, `pr#14554 <https://github.com/ceph/ceph/pull/14554>`_, "Yan, Zheng")
-* mds: fix use-after-free in Locker::file_update_finish() (`issue#19828 <http://tracker.ceph.com/issues/19828>`_, `pr#14991 <https://github.com/ceph/ceph/pull/14991>`_, "Yan, Zheng")
-* mds: ignore ENOENT on writing backtrace (`issue#19401 <http://tracker.ceph.com/issues/19401>`_, `pr#14207 <https://github.com/ceph/ceph/pull/14207>`_, John Spray)
-* mds: ignore fs full check for CEPH_MDS_OP_SETFILELOCK (`issue#18953 <http://tracker.ceph.com/issues/18953>`_, `pr#13455 <https://github.com/ceph/ceph/pull/13455>`_, "Yan, Zheng")
-* mds: improvements for stray reintegration (`pr#15548 <https://github.com/ceph/ceph/pull/15548>`_, "Yan, Zheng")
-* mds: include advisory `path` field in damage (`issue#18509 <http://tracker.ceph.com/issues/18509>`_, `pr#14104 <https://github.com/ceph/ceph/pull/14104>`_, John Spray)
-* mds: issue new caps when sending reply to client (`issue#19635 <http://tracker.ceph.com/issues/19635>`_, `pr#14743 <https://github.com/ceph/ceph/pull/14743>`_, "Yan, Zheng")
-* mds: limit client writable range increment (`issue#19955 <http://tracker.ceph.com/issues/19955>`_, `pr#15131 <https://github.com/ceph/ceph/pull/15131>`_, "Yan, Zheng")
-* mds: make C_MDSInternalNoop::complete() delete 'this' (`issue#19501 <http://tracker.ceph.com/issues/19501>`_, `pr#14347 <https://github.com/ceph/ceph/pull/14347>`_, "Yan, Zheng")
-* mds: mds perf item 'l_mdl_expos' always behind journaler (`pr#15621 <https://github.com/ceph/ceph/pull/15621>`_, redickwang)
-* mds: miscellaneous fixes (`issue#18646 <http://tracker.ceph.com/issues/18646>`_, `pr#12974 <https://github.com/ceph/ceph/pull/12974>`_, Yan, Zheng, "Yan, Zheng")
-* mds: miscellaneous multimds fixes (`issue#19022 <http://tracker.ceph.com/issues/19022>`_, `pr#13698 <https://github.com/ceph/ceph/pull/13698>`_, "Yan, Zheng")
-* mds: miscellaneous multimds fixes part2 (`pr#15125 <https://github.com/ceph/ceph/pull/15125>`_, "Yan, Zheng")
-* mds: miscellaneous multimds fixes (`pr#14550 <https://github.com/ceph/ceph/pull/14550>`_, "Yan, Zheng")
-* mds: misc multimds fixes (`issue#18717 <http://tracker.ceph.com/issues/18717>`_, `issue#18754 <http://tracker.ceph.com/issues/18754>`_, `pr#13227 <https://github.com/ceph/ceph/pull/13227>`_, "Yan, Zheng")
-* mds: misc multimds fixes part2 (`pr#12794 <https://github.com/ceph/ceph/pull/12794>`_, Yan, Zheng)
-* mds: misc multimds fixes (`pr#12274 <https://github.com/ceph/ceph/pull/12274>`_, Yan, Zheng)
-* mds,mon: Clean issues detected by cppcheck (`pr#13199 <https://github.com/ceph/ceph/pull/13199>`_, Ilya Shipitsin)
-* mds: multimds flock fixes (`pr#15440 <https://github.com/ceph/ceph/pull/15440>`_, "Yan, Zheng")
-* mds: Pass empty string to clear mantle balancer (`issue#20076 <http://tracker.ceph.com/issues/20076>`_, `pr#15282 <https://github.com/ceph/ceph/pull/15282>`_, Zhi Zhang)
-* mds: pretty json from `tell` commands (`pr#14105 <https://github.com/ceph/ceph/pull/14105>`_, John Spray)
-* mds: print rank as int (`issue#19201 <http://tracker.ceph.com/issues/19201>`_, `pr#13816 <https://github.com/ceph/ceph/pull/13816>`_, Patrick Donnelly)
-* mds: propagate error encountered during opening inode by number (`issue#18179 <http://tracker.ceph.com/issues/18179>`_, `pr#12749 <https://github.com/ceph/ceph/pull/12749>`_, Yan, Zheng)
-* mds: properly create aux subtrees for pinned directory (`issue#20083 <http://tracker.ceph.com/issues/20083>`_, `pr#15300 <https://github.com/ceph/ceph/pull/15300>`_, "Yan, Zheng")
-* mds: relocate PTRWAITER put near get (`pr#14921 <https://github.com/ceph/ceph/pull/14921>`_, Patrick Donnelly)
-* mds: remove boost::pool usage and use tcmalloc directly (`issue#18425 <http://tracker.ceph.com/issues/18425>`_, `pr#12792 <https://github.com/ceph/ceph/pull/12792>`_, Zhi Zhang)
-* mds: remove legacy "mds tell" command (`issue#19288 <http://tracker.ceph.com/issues/19288>`_, `pr#14015 <https://github.com/ceph/ceph/pull/14015>`_, John Spray)
-* mds: remove "mds log" config option (`issue#18816 <http://tracker.ceph.com/issues/18816>`_, `pr#14652 <https://github.com/ceph/ceph/pull/14652>`_, John Spray)
-* mds: remove some redundant object counters (`pr#13704 <https://github.com/ceph/ceph/pull/13704>`_, Patrick Donnelly)
-* mds: replace C_VoidFn in MDSDaemon with lambdas (`pr#13465 <https://github.com/ceph/ceph/pull/13465>`_, John Spray)
-* mds: Return error message instead of asserting (`pr#14469 <https://github.com/ceph/ceph/pull/14469>`_, Brad Hubbard)
-* mds: save  projected path into inode_t::stray_prior_path (`issue#20340 <http://tracker.ceph.com/issues/20340>`_, `pr#15800 <https://github.com/ceph/ceph/pull/15800>`_, "Yan, Zheng")
-* mds: set ceph-mds name uncond for external tools (`issue#19291 <http://tracker.ceph.com/issues/19291>`_, `pr#14021 <https://github.com/ceph/ceph/pull/14021>`_, Patrick Donnelly)
-* mds: shut down finisher before objecter (`issue#19204 <http://tracker.ceph.com/issues/19204>`_, `pr#13859 <https://github.com/ceph/ceph/pull/13859>`_, John Spray)
-* mds: skip fragment space check for replayed request (`issue#18660 <http://tracker.ceph.com/issues/18660>`_, `pr#13095 <https://github.com/ceph/ceph/pull/13095>`_, "Yan, Zheng")
-* mds: support export pinning on directories (`issue#17834 <http://tracker.ceph.com/issues/17834>`_, `pr#14598 <https://github.com/ceph/ceph/pull/14598>`_, "Yan, Zheng", Patrick Donnelly)
-* mds: try to avoid false positive heartbeat timeouts (`issue#19118 <http://tracker.ceph.com/issues/19118>`_, `pr#13807 <https://github.com/ceph/ceph/pull/13807>`_, John Spray)
-* mds: use debug_mds for most subsys (`issue#19734 <http://tracker.ceph.com/issues/19734>`_, `pr#15052 <https://github.com/ceph/ceph/pull/15052>`_, Patrick Donnelly)
-* mds: use same inode count in health check as in trim (`issue#19395 <http://tracker.ceph.com/issues/19395>`_, `pr#14197 <https://github.com/ceph/ceph/pull/14197>`_, John Spray)
-* mds: warn if insufficient standbys exist (`issue#17604 <http://tracker.ceph.com/issues/17604>`_, `pr#12074 <https://github.com/ceph/ceph/pull/12074>`_, Patrick Donnelly)
-* mgr: add a get_version to the python interface (`pr#13669 <https://github.com/ceph/ceph/pull/13669>`_, John Spray)
-* mgr: add machinery for python modules to send MCommands to daemons (`pr#14920 <https://github.com/ceph/ceph/pull/14920>`_, John Spray)
-* mgr: add mgr allow \* to client.admin (`pr#14864 <https://github.com/ceph/ceph/pull/14864>`_, huanwen ren)
-* mgr: add override in headers (`pr#13772 <https://github.com/ceph/ceph/pull/13772>`_, liuchang0812)
-* mgr: add override in mgr subsystem (`issue#18922 <http://tracker.ceph.com/issues/18922>`_, `pr#13436 <https://github.com/ceph/ceph/pull/13436>`_, liuchang0812)
-* mgr: add per-DaemonState lock (`pr#16432 <https://github.com/ceph/ceph/pull/16432>`_, Sage Weil)
-* mgr: always free allocated MgrPyModule (`issue#19590 <http://tracker.ceph.com/issues/19590>`_, `pr#14507 <https://github.com/ceph/ceph/pull/14507>`_, Kefu Chai)
-* mgr: ceph-create-keys: update client.admin if it already exists (`issue#19940 <http://tracker.ceph.com/issues/19940>`_, `pr#15112 <https://github.com/ceph/ceph/pull/15112>`_, John Spray)
-* mgr: ceph: introduce "tell x help" subcommand (`issue#19885 <http://tracker.ceph.com/issues/19885>`_, `pr#15111 <https://github.com/ceph/ceph/pull/15111>`_, liuchang0812)
-* mgr: ceph-mgr: Implement new pecan-based rest api (`pr#14457 <https://github.com/ceph/ceph/pull/14457>`_, Boris Ranto)
-* mgr: ceph-mgr: rotate logs on sighup (`issue#19568 <http://tracker.ceph.com/issues/19568>`_, `pr#14437 <https://github.com/ceph/ceph/pull/14437>`_, Dan van der Ster)
-* mgr: clean up daemon start process (`issue#20383 <http://tracker.ceph.com/issues/20383>`_, `pr#16020 <https://github.com/ceph/ceph/pull/16020>`_, John Spray)
-* mgr: clean up fsstatus module (`pr#15925 <https://github.com/ceph/ceph/pull/15925>`_, John Spray)
-* mgr: cleanup, stop clients sending in perf counters (`pr#15578 <https://github.com/ceph/ceph/pull/15578>`_, John Spray)
-* mgr: cluster log message on plugin load error (`pr#15927 <https://github.com/ceph/ceph/pull/15927>`_, John Spray)
-* mgr: dashboard code cleanup (`pr#15577 <https://github.com/ceph/ceph/pull/15577>`_, John Spray)
-* mgr: dashboard GUI module (`pr#14946 <https://github.com/ceph/ceph/pull/14946>`_, John Spray, Dan Mick)
-* mgr: dashboard improvements (`pr#16043 <https://github.com/ceph/ceph/pull/16043>`_, John Spray)
-* mgr: do shutdown using finisher so we can do it in the right order (`issue#19743 <http://tracker.ceph.com/issues/19743>`_, `pr#14835 <https://github.com/ceph/ceph/pull/14835>`_, Kefu Chai)
-* mgr: do the shutdown in the right order (`issue#19813 <http://tracker.ceph.com/issues/19813>`_, `pr#14952 <https://github.com/ceph/ceph/pull/14952>`_, Kefu Chai)
-* mgr: drop repeated log info. and unnecessary write permission (`pr#15896 <https://github.com/ceph/ceph/pull/15896>`_, Yan Jun)
-* mgr: enable ceph_send_command() to send pg command (`pr#15865 <https://github.com/ceph/ceph/pull/15865>`_, Kefu Chai)
-* mgr: fix bugs in init, beacons (`issue#19516 <http://tracker.ceph.com/issues/19516>`_, `issue#19502 <http://tracker.ceph.com/issues/19502>`_, `pr#14374 <https://github.com/ceph/ceph/pull/14374>`_, Sage Weil)
-* mgr: fix crash on missing 'ceph_version' in daemon metadata (fixes #18764) (`issue#18764 <http://tracker.ceph.com/issues/18764>`_, `pr#14129 <https://github.com/ceph/ceph/pull/14129>`_, Tim Serong)
-* mgr: fix crash on set_config from python module with insufficient caps (`issue#19629 <http://tracker.ceph.com/issues/19629>`_, `pr#14706 <https://github.com/ceph/ceph/pull/14706>`_, Tim Serong)
-* mgr: fix lock cycle (`pr#16508 <https://github.com/ceph/ceph/pull/16508>`_, Sage Weil)
-* mgr: fix metadata handling from old MDS daemons (`pr#14161 <https://github.com/ceph/ceph/pull/14161>`_, John Spray)
-* mgr: fix MgrStandby eating messages (`pr#15716 <https://github.com/ceph/ceph/pull/15716>`_, John Spray)
-* mgr: fix python module teardown & add tests (`issue#19407 <http://tracker.ceph.com/issues/19407>`_, `issue#19412 <http://tracker.ceph.com/issues/19412>`_, `issue#19258 <http://tracker.ceph.com/issues/19258>`_, `pr#14232 <https://github.com/ceph/ceph/pull/14232>`_, John Spray)
-* mgr: fix session leak (`issue#19591 <http://tracker.ceph.com/issues/19591>`_, `pr#14720 <https://github.com/ceph/ceph/pull/14720>`_, Sage Weil)
-* mgr: fix several init/re-init bugs (`issue#19491 <http://tracker.ceph.com/issues/19491>`_, `pr#14328 <https://github.com/ceph/ceph/pull/14328>`_, Sage Weil)
-* mgr: handle "module.set_config(.., None)" correctly (`pr#16749 <https://github.com/ceph/ceph/pull/16749>`_, Kefu Chai)
-* mgr: increase debug level for ticks 0 -> 10 (`pr#16301 <https://github.com/ceph/ceph/pull/16301>`_, Dan Mick)
-* mgr: load modules in separate python sub-interpreters (`pr#14971 <https://github.com/ceph/ceph/pull/14971>`_, Tim Serong)
-* mgr: luminous: mgr: add missing call to pick_addresses (`issue#20955 <http://tracker.ceph.com/issues/20955>`_, `issue#21049 <http://tracker.ceph.com/issues/21049>`_, `pr#17173 <https://github.com/ceph/ceph/pull/17173>`_, John Spray)
-* mgr: Make stats period configurable (`issue#17449 <http://tracker.ceph.com/issues/17449>`_, `pr#12732 <https://github.com/ceph/ceph/pull/12732>`_, liuchang0812)
-* mgr: Mark session connections down on shutdown (`issue#19900 <http://tracker.ceph.com/issues/19900>`_, `pr#15192 <https://github.com/ceph/ceph/pull/15192>`_, Brad Hubbard)
-* mgr: mgr/ClusterState: do not mangle PGMap outside of Incremental (`issue#20208 <http://tracker.ceph.com/issues/20208>`_, `pr#16262 <https://github.com/ceph/ceph/pull/16262>`_, Sage Weil)
-* mgr: mgr/DaemonServer.cc: log daemon type string as well as id (`pr#15560 <https://github.com/ceph/ceph/pull/15560>`_, Dan Mick)
-* mgr: mgr/dashboard: add OSD list view (`pr#16373 <https://github.com/ceph/ceph/pull/16373>`_, John Spray)
-* mgr: mgr/dashboard: fix type error in get_rate function (`issue#20276 <http://tracker.ceph.com/issues/20276>`_, `pr#15668 <https://github.com/ceph/ceph/pull/15668>`_, liuchang0812)
-* mgr: mgr/dashboard: load log lines on startup, split out audit log (`pr#15709 <https://github.com/ceph/ceph/pull/15709>`_, John Spray)
-* mgr: mgr/MgrClient: fix reconnect event leak (`issue#19580 <http://tracker.ceph.com/issues/19580>`_, `pr#14431 <https://github.com/ceph/ceph/pull/14431>`_, Sage Weil)
-* mgr: mgr/MgrStandby: prevent use-after-free on just-shut-down Mgr (`issue#19595 <http://tracker.ceph.com/issues/19595>`_, `pr#15297 <https://github.com/ceph/ceph/pull/15297>`_, Sage Weil)
-* mgr: mgr/MgrStandby: respawn when deactivated (`issue#19595 <http://tracker.ceph.com/issues/19595>`_, `issue#19549 <http://tracker.ceph.com/issues/19549>`_, `pr#15557 <https://github.com/ceph/ceph/pull/15557>`_, Sage Weil)
-* mgr: mgr_module interface to report health alerts (`pr#16487 <https://github.com/ceph/ceph/pull/16487>`_, Sage Weil)
-* mgr: mgr,osd:  ceph-mgr --help, unify usage text of other daemons (`pr#15176 <https://github.com/ceph/ceph/pull/15176>`_, Tim Serong)
-* mgr: mgr/PyState: shut up about get_config on nonexistent keys (`pr#16641 <https://github.com/ceph/ceph/pull/16641>`_, Sage Weil)
-* mgr: mgr/status: row has incorrect number of values (`issue#20750 <http://tracker.ceph.com/issues/20750>`_, `pr#16529 <https://github.com/ceph/ceph/pull/16529>`_, liuchang0812)
-* mgr: Misc. bug fixes (`issue#18994 <http://tracker.ceph.com/issues/18994>`_, `pr#14883 <https://github.com/ceph/ceph/pull/14883>`_, John Spray)
-* mgr: mkdir bootstrap-mgr (`pr#14824 <https://github.com/ceph/ceph/pull/14824>`_, huanwen ren)
-* mgr: mon/mgr: add detail error infomation (`pr#16048 <https://github.com/ceph/ceph/pull/16048>`_, Yan Jun)
-* mgr,mon: mgr,mon: debug init and mgrdigest subscriptions (`issue#20633 <http://tracker.ceph.com/issues/20633>`_, `pr#16351 <https://github.com/ceph/ceph/pull/16351>`_, Sage Weil)
-* mgr: mon/MgrMonitor: fix standby addition to mgrmap (`issue#20647 <http://tracker.ceph.com/issues/20647>`_, `pr#16397 <https://github.com/ceph/ceph/pull/16397>`_, Sage Weil)
-* mgr,mon: mon/AuthMonitor: generate bootstrap-mgr key on upgrade (`issue#20666 <http://tracker.ceph.com/issues/20666>`_, `pr#16395 <https://github.com/ceph/ceph/pull/16395>`_, Joao Eduardo Luis)
-* mgr,mon: mon,mgr: extricate PGmap from monitor (`issue#20067 <http://tracker.ceph.com/issues/20067>`_, `issue#20174 <http://tracker.ceph.com/issues/20174>`_, `issue#20050 <http://tracker.ceph.com/issues/20050>`_, `pr#15073 <https://github.com/ceph/ceph/pull/15073>`_, Kefu Chai, Sage Weil, Greg Farnum)
-* mgr,mon: mon/MgrMonitor: add 'mgr dump [epoch]' command (`pr#15158 <https://github.com/ceph/ceph/pull/15158>`_, Sage Weil)
-* mgr,mon: mon/MgrMonitor: only propose if we updated (`pr#14645 <https://github.com/ceph/ceph/pull/14645>`_, Sage Weil)
-* mgr,mon: mon/MgrMonitor: reset mgrdigest timer with new subscription (`issue#20633 <http://tracker.ceph.com/issues/20633>`_, `pr#16582 <https://github.com/ceph/ceph/pull/16582>`_, Sage Weil)
-* mgr,mon: mon,mgr: move reweight-by-\* to mgr (`pr#14404 <https://github.com/ceph/ceph/pull/14404>`_, Kefu Chai)
-* mgr,mon: mon,mgr: print pgmap reports to debug (not cluster) log (`pr#15740 <https://github.com/ceph/ceph/pull/15740>`_, Sage Weil)
-* mgr,mon: mon,mgr: trim osdmap without the help of pgmap (`pr#14504 <https://github.com/ceph/ceph/pull/14504>`_, Kefu Chai)
-* mgr: move 'osd perf' and 'osd blocked-by' to mgr (`pr#14303 <https://github.com/ceph/ceph/pull/14303>`_, Sage Weil)
-* mgr: move "osd pool stats" to mgr (`pr#14365 <https://github.com/ceph/ceph/pull/14365>`_, Kefu Chai)
-* mgr: optimization some judgment and adjust the debug remove value in register_new_pgs (`pr#14046 <https://github.com/ceph/ceph/pull/14046>`_, song baisen)
-* mgr: optimize DaemonStateIndex::cull() a little bit (`pr#14967 <https://github.com/ceph/ceph/pull/14967>`_, Kefu Chai)
-* mgr: pass through cluster log to plugins (`pr#13690 <https://github.com/ceph/ceph/pull/13690>`_, John Spray)
-* mgr: perf schema fns/change notification and Prometheus plugin (`pr#16406 <https://github.com/ceph/ceph/pull/16406>`_, Dan Mick)
-* mgr: print a more helpful error message for when users lack mgr ceph caps (`issue#20296 <http://tracker.ceph.com/issues/20296>`_, `pr#15697 <https://github.com/ceph/ceph/pull/15697>`_, Greg Farnum)
-* mgr,pybind: luminous: mgr/dashboard: fix duplicate images listed on iSCSI status page (`issue#21017 <http://tracker.ceph.com/issues/21017>`_, `pr#17282 <https://github.com/ceph/ceph/pull/17282>`_, Jason Dillaman)
-* mgr: pybind/mgr/dashboard: bind to :: by default (`pr#16223 <https://github.com/ceph/ceph/pull/16223>`_, Sage Weil)
-* mgr: pybind/mgr/dashboard: monkeypatch os.exit to stop cherrypy from taking down mgr (`issue#20216 <http://tracker.ceph.com/issues/20216>`_, `pr#15588 <https://github.com/ceph/ceph/pull/15588>`_, Sage Weil)
-* mgr: pybind/mgr: Delete `rest` module (`pr#15429 <https://github.com/ceph/ceph/pull/15429>`_, John Spray)
-* mgr: pybind/mgr/rest: completely terminate cherrypy in shutdown (`pr#14995 <https://github.com/ceph/ceph/pull/14995>`_, Tim Serong)
-* mgr: pybind/mgr/rest: don't set timezone to Chicago (`pr#14184 <https://github.com/ceph/ceph/pull/14184>`_, Tim Serong)
-* mgr: pybind/mgr/restful: improve cert handling; work with vstart (`pr#15405 <https://github.com/ceph/ceph/pull/15405>`_, Sage Weil)
-* mgr: pybind/mgr/zabbix: fix health in non-compat mode (`issue#20767 <http://tracker.ceph.com/issues/20767>`_, `pr#16580 <https://github.com/ceph/ceph/pull/16580>`_, Sage Weil)
-* mgr,pybind,rbd: mgr/dashboard: show rbd image features (`pr#16468 <https://github.com/ceph/ceph/pull/16468>`_, Yanhu Cao)
-* mgr: raise python exception on failure in send_command() (`pr#15704 <https://github.com/ceph/ceph/pull/15704>`_, Kefu Chai)
-* mgr,rbd: mgr/dashboard: RBD iSCSI daemon status page (`pr#16547 <https://github.com/ceph/ceph/pull/16547>`_, Jason Dillaman)
-* mgr,rbd: mgr/dashboard: rbd mirroring status page (`pr#16360 <https://github.com/ceph/ceph/pull/16360>`_, Jason Dillaman)
-* mgr,rbd: pybind/mgr/dashboard: initial block integration (`pr#15521 <https://github.com/ceph/ceph/pull/15521>`_, Jason Dillaman)
-* mgr: redirect python stdout,stderr to ceph log (`pr#14189 <https://github.com/ceph/ceph/pull/14189>`_, Kefu Chai, Tim Serong, Dan Mick)
-* mgr: release allocated PyString (`pr#14716 <https://github.com/ceph/ceph/pull/14716>`_, Kefu Chai)
-* mgr: remove default cert; disable both restful and dashboard by default (`pr#15601 <https://github.com/ceph/ceph/pull/15601>`_, Boris Ranto, Sage Weil)
-* mgr: remove non-existent MDS daemons from FSMap (`issue#17453 <http://tracker.ceph.com/issues/17453>`_, `pr#14937 <https://github.com/ceph/ceph/pull/14937>`_, Spandan Kumar Sahu)
-* mgr: remove unused function declarations (`pr#14366 <https://github.com/ceph/ceph/pull/14366>`_, Wei Jin)
-* mgr: rm nonused main function (`pr#14313 <https://github.com/ceph/ceph/pull/14313>`_, Wei Jin)
-* mgr: shutdown py_modules in Mgr::shutdown() (`issue#19258 <http://tracker.ceph.com/issues/19258>`_, `pr#14078 <https://github.com/ceph/ceph/pull/14078>`_, Kefu Chai)
-* mgr,tests: qa/suites: move mgr tests into rados suite (`pr#14687 <https://github.com/ceph/ceph/pull/14687>`_, John Spray)
-* mgr,tests: qa/upgrade/jewel-x/point-to-point: add a mgr during final upgrade (`pr#15637 <https://github.com/ceph/ceph/pull/15637>`_, Sage Weil)
-* mgr: use unique_ptr for MgrStandby::active_mgr (`pr#13667 <https://github.com/ceph/ceph/pull/13667>`_, John Spray)
-* mgr: various cleanups (`pr#14802 <https://github.com/ceph/ceph/pull/14802>`_, Kefu Chai)
-* mgr: vstart.sh: fix mgr vs restful command startup race (`pr#16564 <https://github.com/ceph/ceph/pull/16564>`_, Sage Weil)
-* mgr: Zabbix monitoring module (`pr#16019 <https://github.com/ceph/ceph/pull/16019>`_, Wido den Hollander)
-* misc: fix code typos in header files (`pr#12716 <https://github.com/ceph/ceph/pull/12716>`_, Xianxia Xiao)
-* misc: kill clang warnings (`pr#14549 <https://github.com/ceph/ceph/pull/14549>`_, Kefu Chai)
-* misc: Warning Elimination (`pr#14439 <https://github.com/ceph/ceph/pull/14439>`_, Adam C. Emerson)
-* mon: add crush type down health warnings (`pr#14914 <https://github.com/ceph/ceph/pull/14914>`_, Neha Ojha)
-* mon: added bootstrap-rbd auth profile (`pr#16633 <https://github.com/ceph/ceph/pull/16633>`_, Jason Dillaman)
-* mon: add force-create-pg back (`issue#20605 <http://tracker.ceph.com/issues/20605>`_, `pr#16353 <https://github.com/ceph/ceph/pull/16353>`_, Kefu Chai)
-* mon: add mgr metdata commands, and overall 'versions' command for all daemon versions (`pr#16460 <https://github.com/ceph/ceph/pull/16460>`_, Sage Weil)
-* mon: add mon_debug_no_require_luminous (`pr#14490 <https://github.com/ceph/ceph/pull/14490>`_, Sage Weil)
-* mon: Add override for FsNewHandler::handle() (`pr#15331 <https://github.com/ceph/ceph/pull/15331>`_, yonghengdexin735)
-* mon: add override in headers (`pr#13693 <https://github.com/ceph/ceph/pull/13693>`_, liuchang0812)
-* mon: add override in mon subsystem (`issue#18922 <http://tracker.ceph.com/issues/18922>`_, `pr#13440 <https://github.com/ceph/ceph/pull/13440>`_, liuchang0812)
-* mon: add support public_bind_addr option (`pr#16189 <https://github.com/ceph/ceph/pull/16189>`_, Bassam Tabbara)
-* mon: add warn info for osds were removed from osdmap but still kept in crushmap (`pr#12273 <https://github.com/ceph/ceph/pull/12273>`_, song baisen)
-* mon: a few health fixes (`pr#16415 <https://github.com/ceph/ceph/pull/16415>`_, xie xingguo)
-* mon: a few more upmap (and other) fixes (`pr#16239 <https://github.com/ceph/ceph/pull/16239>`_, xie xingguo)
-* mon: avoid segfault in wait_auth_rotating (`issue#19566 <http://tracker.ceph.com/issues/19566>`_, `pr#14430 <https://github.com/ceph/ceph/pull/14430>`_, John Spray)
-* mon: avoid start election twice when quorum enter (`pr#10150 <https://github.com/ceph/ceph/pull/10150>`_, song baisen)
-* mon: check is_shutdown() in timer callbacks (`issue#19825 <http://tracker.ceph.com/issues/19825>`_, `pr#14919 <https://github.com/ceph/ceph/pull/14919>`_, Kefu Chai)
-* mon: clean up in ceph_mon.cc (`pr#14102 <https://github.com/ceph/ceph/pull/14102>`_, huanwen ren)
-* mon: clean up some osdmon/pgmon interactions (`pr#12403 <https://github.com/ceph/ceph/pull/12403>`_, Sage Weil)
-* mon: cleanups (`pr#15272 <https://github.com/ceph/ceph/pull/15272>`_, Kefu Chai)
-* mon: collect mon metdata as part of the election (`issue#20434 <http://tracker.ceph.com/issues/20434>`_, `pr#16148 <https://github.com/ceph/ceph/pull/16148>`_, Sage Weil)
-* mon: common/config_opts.h: kill mon_pg_create_interval (`pr#13800 <https://github.com/ceph/ceph/pull/13800>`_, xie xingguo)
-* mon: 'config-key put' -> 'config-key set' (`pr#16569 <https://github.com/ceph/ceph/pull/16569>`_, Sage Weil)
-* mon:  crush straw_calc_version value is 0 or 1 not 0 to 2 (`pr#13554 <https://github.com/ceph/ceph/pull/13554>`_, song baisen)
-* mon: debug session feature tracking (`issue#20475 <http://tracker.ceph.com/issues/20475>`_, `pr#16128 <https://github.com/ceph/ceph/pull/16128>`_, Sage Weil)
-* mon: delete unused config opts of mon_sync_fs_threshold (`pr#15676 <https://github.com/ceph/ceph/pull/15676>`_, linbing)
-* mon: delete useless function definition (`pr#15188 <https://github.com/ceph/ceph/pull/15188>`_, shiqi)
-* mon: detect existing fs and duplicate name earlier (`issue#18964 <http://tracker.ceph.com/issues/18964>`_, `pr#13471 <https://github.com/ceph/ceph/pull/13471>`_, Patrick Donnelly)
-* mon: DIVIDE_BY_ZERO in PGMapDigest::dump_pool_stats_full() (`pr#15622 <https://github.com/ceph/ceph/pull/15622>`_, Jos Collin)
-* mon: Division by zero in PGMapDigest::dump_pool_stats_full() (`pr#15901 <https://github.com/ceph/ceph/pull/15901>`_, Jos Collin)
-* mon: do crushtool test with fork and timeout, but w/o exec of crushtool (`issue#19964 <http://tracker.ceph.com/issues/19964>`_, `pr#16025 <https://github.com/ceph/ceph/pull/16025>`_, Sage Weil)
-* mon: do not dereference empty mgr_commands (`pr#16501 <https://github.com/ceph/ceph/pull/16501>`_, Sage Weil)
-* mon: do not prime_pg_temp creating pgs; clean up pg create conditions (`issue#19826 <http://tracker.ceph.com/issues/19826>`_, `pr#14913 <https://github.com/ceph/ceph/pull/14913>`_, Sage Weil)
-* mon: don't call propose_pending in prepare_update() (`issue#19738 <http://tracker.ceph.com/issues/19738>`_, `pr#14711 <https://github.com/ceph/ceph/pull/14711>`_, John Spray)
-* mon: don't kill MDSs unless some beacons are getting through (`issue#19706 <http://tracker.ceph.com/issues/19706>`_, `pr#15308 <https://github.com/ceph/ceph/pull/15308>`_, John Spray)
-* mon: don't prefix mgr summary with epoch number (`pr#15512 <https://github.com/ceph/ceph/pull/15512>`_, John Spray)
-* mon: don't set last_osd_report when the pg stats msg is ignored (`pr#12975 <https://github.com/ceph/ceph/pull/12975>`_, Zhiqiang Wang)
-* mon: drop useless assignment statements (`pr#13958 <https://github.com/ceph/ceph/pull/13958>`_, wangzhengyong)
-* mon: emit cluster log messages on MDS health changes (`issue#19551 <http://tracker.ceph.com/issues/19551>`_, `pr#14398 <https://github.com/ceph/ceph/pull/14398>`_, John Spray)
-* mon: enable luminous monmap feature on full quorum (`pr#13379 <https://github.com/ceph/ceph/pull/13379>`_, Joao Eduardo Luis)
-* mon: extensible output format for health checks (`pr#16701 <https://github.com/ceph/ceph/pull/16701>`_, John Spray)
-* mon: Filter `log last` output by severity and channel (`pr#15924 <https://github.com/ceph/ceph/pull/15924>`_, John Spray)
-* mon: fix accesing pending_fsmap from peon (`issue#20040 <http://tracker.ceph.com/issues/20040>`_, `pr#15213 <https://github.com/ceph/ceph/pull/15213>`_, John Spray)
-* mon: fix a few bugs with the osd health reporting (`pr#15179 <https://github.com/ceph/ceph/pull/15179>`_, Sage Weil)
-* mon: fix a few nits (`pr#12670 <https://github.com/ceph/ceph/pull/12670>`_, Sage Weil)
-* mon: Fix deep_age copy paste error (`pr#16434 <https://github.com/ceph/ceph/pull/16434>`_, Brad Hubbard)
-* mon: Fixed typo in function comment blocks and in other comments (`pr#15304 <https://github.com/ceph/ceph/pull/15304>`_, linbing)
-* mon: Fixed typo in @post of _active() (`pr#15191 <https://github.com/ceph/ceph/pull/15191>`_, Linbing)
-* mon: fix force_pg_create pg stuck in creating bug (`issue#18298 <http://tracker.ceph.com/issues/18298>`_, `pr#12539 <https://github.com/ceph/ceph/pull/12539>`_, Sage Weil)
-* mon: fix hang on deprecated/removed 'pg set_full_ratio' commands (`issue#20600 <http://tracker.ceph.com/issues/20600>`_, `pr#16300 <https://github.com/ceph/ceph/pull/16300>`_, Sage Weil)
-* mon: fix hiding mdsmonitor informative strings (`issue#16709 <http://tracker.ceph.com/issues/16709>`_, `pr#13904 <https://github.com/ceph/ceph/pull/13904>`_, John Spray)
-* mon: fix kvstore type in mon compact command (`pr#15954 <https://github.com/ceph/ceph/pull/15954>`_, liuchang0812)
-* mon: fix legacy health checks in 'ceph status' during upgrade; fix jewel-x upgrade combo (`pr#17176 <https://github.com/ceph/ceph/pull/17176>`_, Sage Weil)
-* mon: fix mon_keyvaluedb application (`pr#15059 <https://github.com/ceph/ceph/pull/15059>`_, Sage Weil)
-* mon: Fix output text and doc (`pr#16367 <https://github.com/ceph/ceph/pull/16367>`_, Yan Jun)
-* mon: fix prime_pg_temp overrun (`issue#19874 <http://tracker.ceph.com/issues/19874>`_, `pr#14979 <https://github.com/ceph/ceph/pull/14979>`_, Sage Weil)
-* mon: Fix status output warning for mon_warn_osd_usage_min_max_delta (`issue#20544 <http://tracker.ceph.com/issues/20544>`_, `pr#16220 <https://github.com/ceph/ceph/pull/16220>`_, David Zafman)
-* mon: fix synchronise pgmap with others (`pr#14418 <https://github.com/ceph/ceph/pull/14418>`_, song baisen, z09440)
-* mon: fix wrongly delete routed pgstats op (`issue#18458 <http://tracker.ceph.com/issues/18458>`_, `pr#12784 <https://github.com/ceph/ceph/pull/12784>`_, Mingxin Liu)
-* mon: fix wrong mon-num counting logic of 'ceph features' command (`pr#17172 <https://github.com/ceph/ceph/pull/17172>`_, xie xingguo)
-* mon: handle cases where store->get() may return error (`issue#19601 <http://tracker.ceph.com/issues/19601>`_, `pr#14678 <https://github.com/ceph/ceph/pull/14678>`_, Jos Collin)
-* mon: include device class in tree view; hide shadow hierarchy (`pr#16016 <https://github.com/ceph/ceph/pull/16016>`_, Sage Weil)
-* mon: Incorrect expression in PGMap::get_health() (`pr#15648 <https://github.com/ceph/ceph/pull/15648>`_, Jos Collin)
-* mon: in output of "ceph osd df tree", display "-", not "0",  for pg amount of a bucket (`pr#13015 <https://github.com/ceph/ceph/pull/13015>`_, Chuanhong Hong)
-* mon: it's no need to get pg action_primary osd twice in pg scrub (`pr#15313 <https://github.com/ceph/ceph/pull/15313>`_, linbing)
-* mon: '\* list' -> '\* ls' (`pr#16423 <https://github.com/ceph/ceph/pull/16423>`_, Sage Weil)
-* mon: load mgr commands at runtime (`pr#16028 <https://github.com/ceph/ceph/pull/16028>`_, John Spray, Sage Weil)
-* mon: logclient: use the seq id of the 1st log entry when resetting session (`issue#19427 <http://tracker.ceph.com/issues/19427>`_, `pr#14927 <https://github.com/ceph/ceph/pull/14927>`_, Kefu Chai)
-* mon: Log errors at startup (`issue#14088 <http://tracker.ceph.com/issues/14088>`_, `pr#15723 <https://github.com/ceph/ceph/pull/15723>`_, Brad Hubbard)
-* mon: luminous: mon/MonCommands: fix copy-and-paste error (`pr#17274 <https://github.com/ceph/ceph/pull/17274>`_, xie xingguo)
-* mon: maintain the "cluster" PerfCounters when using ceph-mgr (`issue#20562 <http://tracker.ceph.com/issues/20562>`_, `pr#16249 <https://github.com/ceph/ceph/pull/16249>`_, Greg Farnum)
-* mon: mark `osd create` as deprecated (`pr#15641 <https://github.com/ceph/ceph/pull/15641>`_, Joao Eduardo Luis)
-* mon: mon,crush: create crush rules using device classes for replicated and ec pools via cli (`pr#16027 <https://github.com/ceph/ceph/pull/16027>`_, Sage Weil)
-* mon: mon/HealthMonitor: avoid sending unnecessary MMonHealthChecks to leader (`pr#16478 <https://github.com/ceph/ceph/pull/16478>`_, xie xingguo)
-* mon: mon/HealthMonitor: trigger a proposal if stat updated (`pr#16477 <https://github.com/ceph/ceph/pull/16477>`_, Kefu Chai)
-* mon: mon/LogMonitor: don't read list's end() for log last (`pr#16376 <https://github.com/ceph/ceph/pull/16376>`_, Joao Eduardo Luis)
-* mon: mon/MDSMonitor: close object section of formatter (`pr#16516 <https://github.com/ceph/ceph/pull/16516>`_, Chang Liu)
-* mon: mon/MDSMonitor: remove create_new_fs from header (`pr#14019 <https://github.com/ceph/ceph/pull/14019>`_, Henrik Korkuc)
-* mon: mon/MgrMonitor: only induce mgr epoch shortly after mkfs (`pr#16356 <https://github.com/ceph/ceph/pull/16356>`_, Sage Weil)
-* mon: mon/MgrMonitor: send digests only if is_active() (`pr#15109 <https://github.com/ceph/ceph/pull/15109>`_, Kefu Chai)
-* mon: mon/MgrStatMonitor: do not crash on luminous dev version upgrades (`pr#16287 <https://github.com/ceph/ceph/pull/16287>`_, Sage Weil)
-* mon: mon/MonClient: cancel pending commands on shutdown (`issue#20051 <http://tracker.ceph.com/issues/20051>`_, `pr#15227 <https://github.com/ceph/ceph/pull/15227>`_, Kefu Chai, Sage Weil)
-* mon: mon/MonClient: make get_mon_log_message() atomic (`issue#19427 <http://tracker.ceph.com/issues/19427>`_, `pr#14422 <https://github.com/ceph/ceph/pull/14422>`_, Kefu Chai)
-* mon: mon/MonClient: random all ranks then pick first_n (`pr#13479 <https://github.com/ceph/ceph/pull/13479>`_, Mingxin Liu)
-* mon: mon/Monitor.h: add const to member function (`pr#10412 <https://github.com/ceph/ceph/pull/10412>`_, Michal Jarzabek)
-* mon: mon/Monitor: recreate mon session if features changed (`issue#20433 <http://tracker.ceph.com/issues/20433>`_, `pr#16230 <https://github.com/ceph/ceph/pull/16230>`_, Joao Eduardo Luis)
-* mon: {mon,osd,mds} {versions,count-metadata} (`pr#15436 <https://github.com/ceph/ceph/pull/15436>`_, Sage Weil)
-* mon: mon/OSDMonitor: a couple of upmap and other fixes (`pr#15917 <https://github.com/ceph/ceph/pull/15917>`_, xie xingguo)
-* mon: mon/OSDMonitor: check get()'s return value instead of bl's length (`pr#14805 <https://github.com/ceph/ceph/pull/14805>`_, Kefu Chai)
-* mon: mon/OSDMonitor: check last_osd_report only when the whole cluster is lu… (`pr#14294 <https://github.com/ceph/ceph/pull/14294>`_, Kefu Chai)
-* mon: mon/OSDMonitor: Clean up: delete extra S signature for plural (`pr#14174 <https://github.com/ceph/ceph/pull/14174>`_, Shinobu Kinjo)
-* mon: mon/OSDMonitor: cleanup pending_created_pgs after done with it (`pr#14898 <https://github.com/ceph/ceph/pull/14898>`_, Kefu Chai)
-* mon: mon/OSDMonitor: do not alter the "created" epoch of a pg (`issue#19787 <http://tracker.ceph.com/issues/19787>`_, `pr#14849 <https://github.com/ceph/ceph/pull/14849>`_, Kefu Chai)
-* mon: mon/OSDMonitor: ensure UP is not set for newly-created OSDs (`issue#20751 <http://tracker.ceph.com/issues/20751>`_, `pr#16534 <https://github.com/ceph/ceph/pull/16534>`_, Sage Weil)
-* mon: mon/OSDMonitor: fix dividing by zero in OSDUtilizationDumper (`pr#13531 <https://github.com/ceph/ceph/pull/13531>`_, Mingxin Liu)
-* mon: mon/OSDMonitor: fix output func name in can_mark_out (`pr#14758 <https://github.com/ceph/ceph/pull/14758>`_, xie xingguo)
-* mon: mon/OSDMonitor: fix process osd failure (`pr#12938 <https://github.com/ceph/ceph/pull/12938>`_, Mingxin Liu)
-* mon: mon/OSDMonitor: guard 'osd crush set-device-class' (`pr#16217 <https://github.com/ceph/ceph/pull/16217>`_, Sage Weil)
-* mon: mon/OSDMonitor: increase last_epoch_clean's lower bound if possible (`pr#14855 <https://github.com/ceph/ceph/pull/14855>`_, Kefu Chai)
-* mon: mon/OSDMonitor: issue pool application related warning (`pr#16520 <https://github.com/ceph/ceph/pull/16520>`_, xie xingguo)
-* mon: mon/OSDMonitor: "osd crush class rename" support (`pr#15875 <https://github.com/ceph/ceph/pull/15875>`_, xie xingguo)
-* mon: mon/OSDMonitor: remove trivial PGMap dependency for 'osd primary-temp' command (`pr#13616 <https://github.com/ceph/ceph/pull/13616>`_, Sage Weil)
-* mon: mon/OSDMonitor: remove zeroed new_state updates (`issue#20751 <http://tracker.ceph.com/issues/20751>`_, `pr#16518 <https://github.com/ceph/ceph/pull/16518>`_, Sage Weil)
-* mon: mon/OSDMonitor: sanity check osd before performing 'osd purge' (`pr#16838 <https://github.com/ceph/ceph/pull/16838>`_, xie xingguo)
-* mon: mon/OSDMonitor: some cleanup for reweight-by-pg (`pr#13462 <https://github.com/ceph/ceph/pull/13462>`_, Haodong Tang)
-* mon: mon/OSDMonitor: spinlock -> std::mutex (`pr#14269 <https://github.com/ceph/ceph/pull/14269>`_, Sage Weil)
-* mon: mon/OSDMonitor: tolerate upgrade from post-kraken dev cluster (`pr#14442 <https://github.com/ceph/ceph/pull/14442>`_, Sage Weil)
-* mon: mon/OSDMonitor: transit creating_pgs from pgmap when upgrading (`issue#19584 <http://tracker.ceph.com/issues/19584>`_, `pr#14551 <https://github.com/ceph/ceph/pull/14551>`_, Kefu Chai)
-* mon: mon/OSDMonitor: two pool opts related fix (`pr#15968 <https://github.com/ceph/ceph/pull/15968>`_, xie xingguo)
-* mon: mon/OSDMonitor: update creating epoch if target osd changed (`issue#19515 <http://tracker.ceph.com/issues/19515>`_, `pr#14386 <https://github.com/ceph/ceph/pull/14386>`_, Kefu Chai)
-* mon: mon/OSDMonitor: update creating_pgs using pending_creatings (`issue#19814 <http://tracker.ceph.com/issues/19814>`_, `pr#14897 <https://github.com/ceph/ceph/pull/14897>`_, Kefu Chai)
-* mon: mon/OSDMonitor: update pg_creatings even the new acting set is empty (`issue#19744 <http://tracker.ceph.com/issues/19744>`_, `pr#14730 <https://github.com/ceph/ceph/pull/14730>`_, Kefu Chai)
-* mon: mon/PaxosService: use `__func__` instead of hard code function name (`pr#15863 <https://github.com/ceph/ceph/pull/15863>`_, Yanhu Cao)
-* mon: mon/PGMap: add up_primary pg number field for pg-dump cmd (`pr#13451 <https://github.com/ceph/ceph/pull/13451>`_, xie xingguo)
-* mon: mon/PGMap.cc: fix "osd_epochs" section of dump_basic (`pr#14996 <https://github.com/ceph/ceph/pull/14996>`_, xie xingguo)
-* mon: mon/PGMap: make si units more readable in PGMap summary (`pr#14185 <https://github.com/ceph/ceph/pull/14185>`_, liuhong)
-* mon: mon/PGMap: remove skewed utilizatoin warning (`issue#20730 <http://tracker.ceph.com/issues/20730>`_, `pr#16461 <https://github.com/ceph/ceph/pull/16461>`_, Sage Weil)
-* mon: mon/PGMap: show %used in formatted output (`issue#20123 <http://tracker.ceph.com/issues/20123>`_, `pr#15387 <https://github.com/ceph/ceph/pull/15387>`_, Joao Eduardo Luis)
-* mon: mon/PGMonitor: clean up min/max span warning (`pr#14611 <https://github.com/ceph/ceph/pull/14611>`_, Sage Weil)
-* mon: mon/PGMonitor: fix description for ceph pg ls (`pr#12807 <https://github.com/ceph/ceph/pull/12807>`_, runsisi)
-* mon: mon/PGMonitor: rm nonused function (`pr#14033 <https://github.com/ceph/ceph/pull/14033>`_, Wei Jin)
-* mon: move 'pg map' to OSDMonitor (`pr#14559 <https://github.com/ceph/ceph/pull/14559>`_, Sage Weil)
-* mon: no delay for single message MSG_ALIVE and MSG_PGTEMP (`pr#12107 <https://github.com/ceph/ceph/pull/12107>`_, yaoning)
-* mon: optracker's initiated_at timestamp should not be NULL (`pr#12826 <https://github.com/ceph/ceph/pull/12826>`_, Mingxin Liu)
-* mon: osd crush set crushmap need sanity check (`issue#19302 <http://tracker.ceph.com/issues/19302>`_, `pr#14029 <https://github.com/ceph/ceph/pull/14029>`_, Loic Dachary)
-* mon: OSDMonitor add check only concern our self cluster command (`pr#10309 <https://github.com/ceph/ceph/pull/10309>`_, song baisen)
-* mon/OSDMonitor: add plain output for "crush class ls-osd" command (`pr#17230 <https://github.com/ceph/ceph/pull/17230>`_, xie xingguo)
-* mon/OSDMonitor: check creating_pgs.last_scan_epoch instead when sending creates (`issue#20785 <http://tracker.ceph.com/issues/20785>`_, `pr#17257 <https://github.com/ceph/ceph/pull/17257>`_, Kefu Chai)
-* mon: OSDMonitor: check mon_max_pool_pg_num when set pool pg_num (`pr#16511 <https://github.com/ceph/ceph/pull/16511>`_, chenhg)
-* mon/OSDMonitor: do not send_pg_creates with stale info (`issue#20785 <http://tracker.ceph.com/issues/20785>`_, `pr#17191 <https://github.com/ceph/ceph/pull/17191>`_, Kefu Chai)
-* mon/OSDMonitor: fix improper input/testing range of crush somke testing (`pr#17232 <https://github.com/ceph/ceph/pull/17232>`_, xie xingguo)
-* mon: osd/PGMonitor: always update pgmap with latest osdmap (`issue#19398 <http://tracker.ceph.com/issues/19398>`_, `pr#14777 <https://github.com/ceph/ceph/pull/14777>`_, Kefu Chai)
-* mon/pgmap: add objects prefix for unfound type (`issue#21127 <http://tracker.ceph.com/issues/21127>`_, `pr#17264 <https://github.com/ceph/ceph/pull/17264>`_, huanwen ren, Sage Weil)
-* mon/PGMap: fix "0 stuck requests are blocked > 4096 sec" warn (`pr#17215 <https://github.com/ceph/ceph/pull/17215>`_, xie xingguo)
-* mon: PGMonitor add check only concern our self cluster command (`pr#9976 <https://github.com/ceph/ceph/pull/9976>`_, song baisen)
-* mon: post-jewel cleanups (`pr#13150 <https://github.com/ceph/ceph/pull/13150>`_, Kefu Chai)
-* mon: prime pg_temp and a few health warning fixes (`pr#16530 <https://github.com/ceph/ceph/pull/16530>`_, xie xingguo)
-* mon: refactor MDSMonitor command handling (`pr#13581 <https://github.com/ceph/ceph/pull/13581>`_, John Spray)
-* mon: Removed unnecessary function declaration in MDSMonitor.h (`pr#15374 <https://github.com/ceph/ceph/pull/15374>`_, yonghengdexin735)
-* mon: remove the redudant jugement in paxosservice is_writeable function (`pr#10240 <https://github.com/ceph/ceph/pull/10240>`_, song baisen)
-* mon: remove unnecessary function declaration (`pr#13762 <https://github.com/ceph/ceph/pull/13762>`_, liuchang0812)
-* mon: replace osds with `osd destroy` and `osd new` (`pr#14074 <https://github.com/ceph/ceph/pull/14074>`_, Joao Eduardo Luis, Sage Weil)
-* mon: restructure prime_pg_temp around a full pg mapping calculated on multiple CPUs (`pr#13207 <https://github.com/ceph/ceph/pull/13207>`_, Sage Weil)
-* mon: revamp health check/warning system (`pr#15643 <https://github.com/ceph/ceph/pull/15643>`_, John Spray, Sage Weil)
-* mon: revise "ceph status" output (`pr#15396 <https://github.com/ceph/ceph/pull/15396>`_, John Spray)
-* mon: show class in 'osd crush tree' output; sort output (`pr#16740 <https://github.com/ceph/ceph/pull/16740>`_, Sage Weil)
-* mon: show destroyed status in tree view; do not auto-out destroyed osds (`pr#16446 <https://github.com/ceph/ceph/pull/16446>`_, xie xingguo)
-* mon: show inactive % in ceph status (`pr#14810 <https://github.com/ceph/ceph/pull/14810>`_, Sage Weil)
-* mon: show io status quickly if no update in a long period (`pr#14176 <https://github.com/ceph/ceph/pull/14176>`_, Mingxin Liu)
-* mon: show the leader info on mon stat command (`pr#14178 <https://github.com/ceph/ceph/pull/14178>`_, song baisen)
-* mon: skip crush smoke test when running under valgrind (`issue#20602 <http://tracker.ceph.com/issues/20602>`_, `pr#16346 <https://github.com/ceph/ceph/pull/16346>`_, Sage Weil)
-* mon: smooth io/recovery stats over longer period (`pr#13249 <https://github.com/ceph/ceph/pull/13249>`_, Sage Weil)
-* mon: stop issuing not-[deep]-scrubbed warnings if disabled (`pr#16465 <https://github.com/ceph/ceph/pull/16465>`_, xie xingguo)
-* mon: support pool application metadata key/values (`pr#15763 <https://github.com/ceph/ceph/pull/15763>`_, Jason Dillaman)
-* mon,tests: qa/suites: add test exercising workunits/mon/auth_caps.sh (`pr#15754 <https://github.com/ceph/ceph/pull/15754>`_, Kefu Chai)
-* mon,tests: test: Initialize pointer msg in MonClientHelper (`pr#16784 <https://github.com/ceph/ceph/pull/16784>`_, amitkuma)
-* mon: Tidy up removal of debug mon features (`pr#14467 <https://github.com/ceph/ceph/pull/14467>`_, Brad Hubbard)
-* mon: track features from connect clients, and use it to gate set-require-min-compat-client (`pr#15371 <https://github.com/ceph/ceph/pull/15371>`_, Sage Weil)
-* mon: trim the creating_pgs after updating it with pgmap (`issue#20067 <http://tracker.ceph.com/issues/20067>`_, `pr#15318 <https://github.com/ceph/ceph/pull/15318>`_, Kefu Chai)
-* mon: update mgrmap when active goes offline (`issue#19407 <http://tracker.ceph.com/issues/19407>`_, `pr#14220 <https://github.com/ceph/ceph/pull/14220>`_, John Spray)
-* mon: Update OSDMon.cc comments (`pr#13750 <https://github.com/ceph/ceph/pull/13750>`_, Saumay Agrawal)
-* mon: warn about using osd new instead of osd create (`pr#17302 <https://github.com/ceph/ceph/pull/17302>`_, Neha Ojha)
-* msg: allow different ms type for cluster network and public network (`pr#12023 <https://github.com/ceph/ceph/pull/12023>`_, Haomai Wang)
-* msg: always set header.version in encode_payload() (`issue#19939 <http://tracker.ceph.com/issues/19939>`_, `pr#16421 <https://github.com/ceph/ceph/pull/16421>`_, Kefu Chai)
-* msg: client bind (`pr#12901 <https://github.com/ceph/ceph/pull/12901>`_, Zengran Zhang, Haomai Wang)
-* msg: do not enable client-side binding by default (`issue#20049 <http://tracker.ceph.com/issues/20049>`_, `pr#15392 <https://github.com/ceph/ceph/pull/15392>`_, Jason Dillaman)
-* msg: don't set msgr addr when disabing client bind (`pr#15243 <https://github.com/ceph/ceph/pull/15243>`_, Haomai Wang)
-* msg: end parameter in entity_addr_t::parse is optional (`pr#13650 <https://github.com/ceph/ceph/pull/13650>`_, Mykola Golub)
-* msg: Fix calls to Messenger::create with new parameter (`pr#13329 <https://github.com/ceph/ceph/pull/13329>`_, Sarit Zubakov)
-* msg: Increase loglevels on some messages (`pr#14707 <https://github.com/ceph/ceph/pull/14707>`_, Willem Jan Withagen)
-* msg: Initialize member variables in Infiniband (`pr#16781 <https://github.com/ceph/ceph/pull/16781>`_, amitkuma)
-* msg: Initializing uninitialized members MMonGetVersion (`pr#16811 <https://github.com/ceph/ceph/pull/16811>`_, amitkuma)
-* msg: Initializing uninitialized members MMonGetVersionReply (`pr#16813 <https://github.com/ceph/ceph/pull/16813>`_, amitkuma)
-* msg: Initializing uninitialized members MMonPaxos (`pr#16814 <https://github.com/ceph/ceph/pull/16814>`_, amitkuma)
-* msg: Initializing uninitialized members MMonProbe (`pr#16815 <https://github.com/ceph/ceph/pull/16815>`_, amitkuma)
-* msg: Initializing uninitialized members module messages (`pr#16817 <https://github.com/ceph/ceph/pull/16817>`_, amitkuma)
-* msg: Initializing uninitialized members MOSDAlive (`pr#16816 <https://github.com/ceph/ceph/pull/16816>`_, amitkuma)
-* msg: make listen backlog an option, increase from 128 to 512 (`issue#20330 <http://tracker.ceph.com/issues/20330>`_, `pr#15743 <https://github.com/ceph/ceph/pull/15743>`_, Haomai Wang)
-* msg: messages: coverity fixes (`pr#13473 <https://github.com/ceph/ceph/pull/13473>`_, Kefu Chai)
-* msg: msg/async: avoid atomic variable overhead (`pr#12809 <https://github.com/ceph/ceph/pull/12809>`_, Wei Jin)
-* msg: msg/async: cleanup code (`pr#13304 <https://github.com/ceph/ceph/pull/13304>`_, Jianpeng Ma)
-* msg: msg/async: cleanups (`pr#12832 <https://github.com/ceph/ceph/pull/12832>`_, Wei Jin)
-* msg: msg/async: fix file description leak in NetHandler (`pr#13271 <https://github.com/ceph/ceph/pull/13271>`_, liuchang0812)
-* msg: msg/async: increase worker reference with local listen table enabled backend (`issue#20390 <http://tracker.ceph.com/issues/20390>`_, `pr#15897 <https://github.com/ceph/ceph/pull/15897>`_, Haomai Wang)
-* msg: msg/async: Lower down the AsyncMessenger's standby warning from debug (`pr#15242 <https://github.com/ceph/ceph/pull/15242>`_, Pan Liu)
-* msg: msg/AsyncMessenger: remove unused method (`pr#10125 <https://github.com/ceph/ceph/pull/10125>`_, Michal Jarzabek)
-* msg: msg/async/net_handler: errno should be stored before calling next function (`pr#14985 <https://github.com/ceph/ceph/pull/14985>`_, Zhou Zhengping)
-* msg: msg/async/rdma: check if exp verbs avail (`pr#13391 <https://github.com/ceph/ceph/pull/13391>`_, Oren Duer, Adir Lev)
-* msg: msg/async/rdma: check if fin message completed (`pr#15624 <https://github.com/ceph/ceph/pull/15624>`_, Alexander Mikheev, Adir Lev)
-* msg: msg/async/rdma: Data path fixes (`pr#15903 <https://github.com/ceph/ceph/pull/15903>`_, Adir lev)
-* msg: msg/async/rdma: Debug prints for ibv* (`pr#14249 <https://github.com/ceph/ceph/pull/14249>`_, Amir Vadai)
-* msg: msg/async/rdma: Device::last_poll_dev must be positive (`pr#14250 <https://github.com/ceph/ceph/pull/14250>`_, Amir Vadai)
-* msg: msg/async/rdma: Fix broken compilation (`pr#13603 <https://github.com/ceph/ceph/pull/13603>`_, Sarit Zubakov)
-* msg: msg/async/rdma: Fix memory leak of OSD (`pr#13101 <https://github.com/ceph/ceph/pull/13101>`_, Sarit Zubakov)
-* msg: msg/async/rdma: fix outstanding queuepair when destruct RDMAStack (`pr#13905 <https://github.com/ceph/ceph/pull/13905>`_, Haomai Wang)
-* msg: msg/async/rdma: fix RoCE v2 deafult value (`pr#12648 <https://github.com/ceph/ceph/pull/12648>`_, Adir Lev, Oren Duer)
-* msg: msg/async/rdma: Fix small memory leaks detected by valgrind (`pr#14288 <https://github.com/ceph/ceph/pull/14288>`_, Amir Vadai)
-* msg: msg/async/rdma: handle buffers after close msg (`pr#15749 <https://github.com/ceph/ceph/pull/15749>`_, DanielBar-On, Alexander Mikheev, Adir Lev)
-* msg: msg/async/rdma: move active_queue_pairs perf counter dec to polling (`pr#13716 <https://github.com/ceph/ceph/pull/13716>`_, DanielBar-On)
-* msg: msg/async/rdma: Print error only on ENOMEM (`pr#13538 <https://github.com/ceph/ceph/pull/13538>`_, Sarit Zubakov)
-* msg: msg/async/rdma: RDMA-CM, Pass specific ConnMgr info in constructor (`pr#14409 <https://github.com/ceph/ceph/pull/14409>`_, Amir Vadai)
-* msg: msg/async/rdma: register buffer as continuous (`pr#15967 <https://github.com/ceph/ceph/pull/15967>`_, Adir Lev)
-* msg: msg/async/rdma: remove assert from ibv_dealloc_pd in ProtectionDomain (`pr#15832 <https://github.com/ceph/ceph/pull/15832>`_, DanielBar-On)
-* msg: msg/async/rdma: update destructor message (`pr#13539 <https://github.com/ceph/ceph/pull/13539>`_, Sarit Zubakov)
-* msg: msg/async/rdma: zero wqe inline (`pr#13392 <https://github.com/ceph/ceph/pull/13392>`_, Adir Lev)
-* msg: msg/async: remove false alert "assert" (`pr#15288 <https://github.com/ceph/ceph/pull/15288>`_, Haomai Wang)
-* msg: msg/async: remove useless close function (`pr#13286 <https://github.com/ceph/ceph/pull/13286>`_, liuchang0812)
-* msg: msg/async: rm nonused thread variable in posixworker (`pr#12777 <https://github.com/ceph/ceph/pull/12777>`_, Wei Jin)
-* msg: msg/async: use auto iterator having more simple code and good performance (`pr#16524 <https://github.com/ceph/ceph/pull/16524>`_, dingdangzhang)
-* msg: msg/Messenger.cc: add std::move (`pr#9760 <https://github.com/ceph/ceph/pull/9760>`_, Michal Jarzabek)
-* msg: msg/MOSDOpReply: fix missing trace decode (`pr#15999 <https://github.com/ceph/ceph/pull/15999>`_, Yan Jun)
-* msg: msg/RDMA: Fix broken compilation due to new argument in net.connect() (`pr#13096 <https://github.com/ceph/ceph/pull/13096>`_, Amir Vadai)
-* msg: msg/simple: Remove dead code in pipe.cc (`issue#12684 <http://tracker.ceph.com/issues/12684>`_, `pr#12601 <https://github.com/ceph/ceph/pull/12601>`_, Rishabh Kumar)
-* msg: msg/simple: use my addr when setting sock priority (`issue#19801 <http://tracker.ceph.com/issues/19801>`_, `pr#14878 <https://github.com/ceph/ceph/pull/14878>`_, Kefu Chai)
-* msg: no need to pass supported features to Messenger::Policy ctor (`pr#13785 <https://github.com/ceph/ceph/pull/13785>`_, Sage Weil)
-* msg: QueueStrategy::wait() joins all threads (`issue#20534 <http://tracker.ceph.com/issues/20534>`_, `pr#16194 <https://github.com/ceph/ceph/pull/16194>`_, Casey Bodley)
-* msg: Remove unused variable perf_counter in RDMAStack (`pr#16783 <https://github.com/ceph/ceph/pull/16783>`_, amitkuma)
-* msg: Revert the change from assert(0)-> ceph_abort() where is not applicable (`pr#12930 <https://github.com/ceph/ceph/pull/12930>`_, Dave Chen)
-* msg: src/msg/async/AsyncConnect.cc: Use of sizeof() on a Pointer Type (`pr#14773 <https://github.com/ceph/ceph/pull/14773>`_, Svyatoslav)
-* msg: src/msg/async: Update fix broken compilation for Posix (`pr#14336 <https://github.com/ceph/ceph/pull/14336>`_, Sarit Zubakov)
-* msg: src/msg/simple/Pipe.cc: Fix the inclusion of '}' (`pr#14843 <https://github.com/ceph/ceph/pull/14843>`_, Willem Jan Withagen)
-* os/bluestore: print leaked extents to debug output (`pr#17303 <https://github.com/ceph/ceph/pull/17303>`_, Sage Weil)
-* osd: add asock command to dump the scrub queue (`issue#17861 <http://tracker.ceph.com/issues/17861>`_, `pr#12728 <https://github.com/ceph/ceph/pull/12728>`_, liuchang0812)
-* osd: add default_device_class to metadata (`pr#16634 <https://github.com/ceph/ceph/pull/16634>`_, Neha Ojha)
-* osd: add dump filter for tracked ops (`pr#16561 <https://github.com/ceph/ceph/pull/16561>`_, Yan Jun)
-* osd: add "heap \*" admin command (`issue#15475 <http://tracker.ceph.com/issues/15475>`_, `pr#13073 <https://github.com/ceph/ceph/pull/13073>`_, Jesse Williamson)
-* osd: adding PerfCounters for backoff throttle (`pr#13017 <https://github.com/ceph/ceph/pull/13017>`_, Chuanhong Wang)
-* osd:  add is_split check before _start_split (`pr#13307 <https://github.com/ceph/ceph/pull/13307>`_, song baisen)
-* osd: add override in headers files (`pr#13962 <https://github.com/ceph/ceph/pull/13962>`_, liuchang0812)
-* osd: add override in osd subsystem (`issue#18922 <http://tracker.ceph.com/issues/18922>`_, `pr#13439 <https://github.com/ceph/ceph/pull/13439>`_, liuchang0812)
-* osd: Add recovery sleep configuration option for HDDs and SSDs (`pr#16328 <https://github.com/ceph/ceph/pull/16328>`_, Neha Ojha)
-* osd: add snap trim reservation and re-implement osd_snap_trim_sleep (`pr#13594 <https://github.com/ceph/ceph/pull/13594>`_, Samuel Just)
-* osd: adjust osd_min_pg_log_entries (`issue#21026 <http://tracker.ceph.com/issues/21026>`_, `pr#17202 <https://github.com/ceph/ceph/pull/17202>`_, J. Eric Ivancich)
-* osd: allow client throttler to be adjusted on-fly, without restart (`issue#18791 <http://tracker.ceph.com/issues/18791>`_, `pr#13213 <https://github.com/ceph/ceph/pull/13213>`_, Piotr Dałek)
-* osd: bail from _committed_osd_maps inside osd_lock (`issue#20273 <http://tracker.ceph.com/issues/20273>`_, `pr#15710 <https://github.com/ceph/ceph/pull/15710>`_, Sage Weil)
-* osd: Calculate degraded and misplaced more accurately (`issue#18619 <http://tracker.ceph.com/issues/18619>`_, `pr#13031 <https://github.com/ceph/ceph/pull/13031>`_, David Zafman)
-* osd: change a few messages at level 0 and 1; change default level to 1/5 (`pr#13407 <https://github.com/ceph/ceph/pull/13407>`_, Sage Weil)
-* osd: Check for and automatically repair object info soid during scrub (`issue#20471 <http://tracker.ceph.com/issues/20471>`_, `pr#16052 <https://github.com/ceph/ceph/pull/16052>`_, David Zafman)
-* osd: check fsid is normal before osd mkfs (`pr#13898 <https://github.com/ceph/ceph/pull/13898>`_, song baisen)
-* osd: check queue_transaction return value (`pr#15873 <https://github.com/ceph/ceph/pull/15873>`_, zhanglei)
-* osd: Check snapset for validity when selecting authoritative shard (`issue#20186 <http://tracker.ceph.com/issues/20186>`_, `issue#18409 <http://tracker.ceph.com/issues/18409>`_, `pr#15559 <https://github.com/ceph/ceph/pull/15559>`_, David Zafman)
-* osd: Check whether journal is rotational or not (`pr#16614 <https://github.com/ceph/ceph/pull/16614>`_, Neha Ojha)
-* osd: clarify REQUIRE_LUMINOUS error message (`pr#13363 <https://github.com/ceph/ceph/pull/13363>`_, Josh Durgin)
-* osd: clean nonused work queue (`pr#14990 <https://github.com/ceph/ceph/pull/14990>`_, Wei Jin)
-* osd: Cleanup-Updated OSDMap.cc with C++11 style range-for loops (`pr#14381 <https://github.com/ceph/ceph/pull/14381>`_, Jos Collin)
-* osd: cleanup: use string & to avoid unnecessary copy (`pr#12336 <https://github.com/ceph/ceph/pull/12336>`_, Yunchuan Wen)
-* osd: clear_queued_recovery() in on_shutdown() (`issue#20432 <http://tracker.ceph.com/issues/20432>`_, `pr#16093 <https://github.com/ceph/ceph/pull/16093>`_, Kefu Chai)
-* osd: cmpext operator should ignore -ENOENT on read (`pr#16622 <https://github.com/ceph/ceph/pull/16622>`_, Jason Dillaman)
-* osd: combine conditional statements (`pr#16391 <https://github.com/ceph/ceph/pull/16391>`_, Yan Jun)
-* osd: combine unstable stats with info.stats when publish stats to osd (`pr#14060 <https://github.com/ceph/ceph/pull/14060>`_, Mingxin Liu)
-* osd: compact osd feature (`issue#19592 <http://tracker.ceph.com/issues/19592>`_, `pr#16045 <https://github.com/ceph/ceph/pull/16045>`_, liuchang0812)
-* osd: condition object_info_t encoding on required (not up) features (`issue#18644 <http://tracker.ceph.com/issues/18644>`_, `pr#13114 <https://github.com/ceph/ceph/pull/13114>`_, Sage Weil)
-* osd: constify OpRequest::get_req(); fix a few cases of operator<< vs mutated message races (`pr#13545 <https://github.com/ceph/ceph/pull/13545>`_, Sage Weil)
-* osd: correct comment of perfcounter cached_crc in code (`pr#13256 <https://github.com/ceph/ceph/pull/13256>`_, lvshuhua)
-* osd: correct epoch setting of osd boot msg (`pr#12623 <https://github.com/ceph/ceph/pull/12623>`_, Mingxin Liu)
-* osd: correct the func name in execute_ctx() log messages (`pr#13582 <https://github.com/ceph/ceph/pull/13582>`_, Gu Zhongyan)
-* osd: Corrupt objects stop snaptrim and mark pg snaptrim_error (`issue#13837 <http://tracker.ceph.com/issues/13837>`_, `pr#15635 <https://github.com/ceph/ceph/pull/15635>`_, David Zafman)
-* osd: debug con in ms_handle_connect (`pr#13540 <https://github.com/ceph/ceph/pull/13540>`_, Sage Weil)
-* osd: do not send ENXIO on misdirected op by default (`issue#18751 <http://tracker.ceph.com/issues/18751>`_, `pr#13206 <https://github.com/ceph/ceph/pull/13206>`_, Sage Weil)
-* osd: do not send pg_created unless luminous (`issue#20785 <http://tracker.ceph.com/issues/20785>`_, `pr#16677 <https://github.com/ceph/ceph/pull/16677>`_, Kefu Chai)
-* osd: do not try to boot until we've seen the first osdmap (`pr#15732 <https://github.com/ceph/ceph/pull/15732>`_, Sage Weil)
-* osd: do not try to set device class before luminous (`issue#20850 <http://tracker.ceph.com/issues/20850>`_, `pr#16706 <https://github.com/ceph/ceph/pull/16706>`_, Josh Durgin)
-* osd: don't leak pgrefs or reservations in SnapTrimmer (`issue#19931 <http://tracker.ceph.com/issues/19931>`_, `pr#15214 <https://github.com/ceph/ceph/pull/15214>`_, Greg Farnum)
-* osd: don't share osdmap with objecter when preboot (`issue#15025 <http://tracker.ceph.com/issues/15025>`_, `pr#13946 <https://github.com/ceph/ceph/pull/13946>`_, Mingxin Liu)
-* osd: don't use ORDERSNAP for flush; always request/send ondisk ack (`issue#18961 <http://tracker.ceph.com/issues/18961>`_, `pr#13570 <https://github.com/ceph/ceph/pull/13570>`_, Samuel Just)
-* osd: drop support for listing objects at a given snap (`pr#13398 <https://github.com/ceph/ceph/pull/13398>`_, Sage Weil)
-* osd: dump the field name of object watchers  and cleanups (`pr#15946 <https://github.com/ceph/ceph/pull/15946>`_, Yan Jun)
-* osd: EC read handling: don't grab an objectstore error to use as the read error (`pr#16663 <https://github.com/ceph/ceph/pull/16663>`_, David Zafman)
-* osd: eliminate snapdir objects and move clone snaps vector into SnapSet (`pr#13610 <https://github.com/ceph/ceph/pull/13610>`_, Sage Weil)
-* osd: Execute crush_location_hook when configured in ceph.conf (`pr#15951 <https://github.com/ceph/ceph/pull/15951>`_, Wido den Hollander)
-* osd: _exit() intead of exit() for failure injection (`issue#18372 <http://tracker.ceph.com/issues/18372>`_, `pr#12726 <https://github.com/ceph/ceph/pull/12726>`_, Sage Weil)
-* osd: extend OMAP_GETKEYS and GETVALS to include a 'more' output field (`pr#12950 <https://github.com/ceph/ceph/pull/12950>`_, Sage Weil)
-* osd: fall back to failsafe threshold if osdmap doesn't set [near]full (`pr#14004 <https://github.com/ceph/ceph/pull/14004>`_, Sage Weil)
-* osd: faster dispatch (`pr#13343 <https://github.com/ceph/ceph/pull/13343>`_, Sage Weil)
-* osd: fix a couple bugs with persisting the missing set when it contains deletes (`issue#20704 <http://tracker.ceph.com/issues/20704>`_, `pr#16459 <https://github.com/ceph/ceph/pull/16459>`_, Josh Durgin)
-* osd: fix argument-dependent lookup of swap() (`pr#15124 <https://github.com/ceph/ceph/pull/15124>`_, Casey Bodley)
-* osd: fix a signed/unsigned warning in PG (`pr#13922 <https://github.com/ceph/ceph/pull/13922>`_, Greg Farnum)
-* osd: fix comments about pg refs and lock (`pr#14279 <https://github.com/ceph/ceph/pull/14279>`_, tang.jin)
-* osd: fix coverity warning for uninitialized members (`pr#12724 <https://github.com/ceph/ceph/pull/12724>`_, Li Wang)
-* osd: fix func name in log produced by handle_pg_peering_evt() (`pr#13801 <https://github.com/ceph/ceph/pull/13801>`_, xie xingguo)
-* osd: fix occasional MOSDMap leak (`issue#18293 <http://tracker.ceph.com/issues/18293>`_, `pr#14558 <https://github.com/ceph/ceph/pull/14558>`_, Sage Weil)
-* osd: fix OpRequest and tracked op dump information (`pr#16504 <https://github.com/ceph/ceph/pull/16504>`_, Yan Jun)
-* osd: fix past_intervals base case by adding epoch_pool_created to pg_history_t (`issue#19877 <http://tracker.ceph.com/issues/19877>`_, `pr#14989 <https://github.com/ceph/ceph/pull/14989>`_, Sage Weil)
-* osd: fix pg ref leaks when osd shutdown (`issue#20684 <http://tracker.ceph.com/issues/20684>`_, `pr#16408 <https://github.com/ceph/ceph/pull/16408>`_, Yang Honggang)
-* osd: fix some osd beacon bugs (`pr#14274 <https://github.com/ceph/ceph/pull/14274>`_, Sage Weil)
-* osd: fix stat sum update of recovery pushing (`pr#13328 <https://github.com/ceph/ceph/pull/13328>`_, Zhiqiang Wang)
-* osd: fix the setting of soid in sub_op_push (`pr#13353 <https://github.com/ceph/ceph/pull/13353>`_, Zhiqiang Wang)
-* osd: fix typo in comment (`pr#13061 <https://github.com/ceph/ceph/pull/13061>`_, Gu Zhongyan)
-* osd: Fix useless MAX(0, unsigned) to prevent out of wack misplaced (`issue#18718 <http://tracker.ceph.com/issues/18718>`_, `pr#13164 <https://github.com/ceph/ceph/pull/13164>`_, David Zafman)
-* osd: have clients resend ops on pg split (`pr#13235 <https://github.com/ceph/ceph/pull/13235>`_, Sage Weil)
-* osd: hdd vs ssd defaults for osd op thread pool (`pr#15422 <https://github.com/ceph/ceph/pull/15422>`_, Sage Weil)
-* osd: heartbeat with packets large enough to require working jumbo frames (`issue#20087 <http://tracker.ceph.com/issues/20087>`_, `pr#15535 <https://github.com/ceph/ceph/pull/15535>`_, Greg Farnum)
-* osd: Implement asynchronous recovery sleep (`pr#15212 <https://github.com/ceph/ceph/pull/15212>`_, Neha Ojha)
-* osd: Implement asynchronous scrub sleep (`issue#19497 <http://tracker.ceph.com/issues/19497>`_, `pr#14886 <https://github.com/ceph/ceph/pull/14886>`_, Brad Hubbard)
-* osd: Implement peering state timing (`pr#14627 <https://github.com/ceph/ceph/pull/14627>`_, Brad Hubbard)
-* osd: improve error message when FileStore op fails due to EPERM (`issue#18037 <http://tracker.ceph.com/issues/18037>`_, `pr#12181 <https://github.com/ceph/ceph/pull/12181>`_, Nathan Cutler)
-* osd: initialize waiting_for_pg_osdmap on startup (`issue#20748 <http://tracker.ceph.com/issues/20748>`_, `pr#16535 <https://github.com/ceph/ceph/pull/16535>`_, Sage Weil)
-* osd: kill all remaining MOSDSubOp users (`pr#13401 <https://github.com/ceph/ceph/pull/13401>`_, Sage Weil)
-* osd: kill sortbitwise (`pr#13321 <https://github.com/ceph/ceph/pull/13321>`_, Sage Weil)
-* osd: Log audit (`pr#16281 <https://github.com/ceph/ceph/pull/16281>`_, Brad Hubbard)
-* osd: make ec overwrites ready to use (`pr#14496 <https://github.com/ceph/ceph/pull/14496>`_, Josh Durgin)
-* osd: moved OpFinisher logic from OSDOp to OpContext (`issue#20783 <http://tracker.ceph.com/issues/20783>`_, `pr#16617 <https://github.com/ceph/ceph/pull/16617>`_, Jason Dillaman)
-* osd: Move scrub sleep timer to osdservice (`issue#19986 <http://tracker.ceph.com/issues/19986>`_, `pr#15217 <https://github.com/ceph/ceph/pull/15217>`_, Brad Hubbard)
-* osd: never send rados ack (only commit) (`pr#12451 <https://github.com/ceph/ceph/pull/12451>`_, Sage Weil)
-* osd: new op for calculating an extent checksum (`pr#14256 <https://github.com/ceph/ceph/pull/14256>`_, Jason Dillaman)
-* osd: objclass sdk (`pr#14723 <https://github.com/ceph/ceph/pull/14723>`_, Neha Ojha)
-* osd: Object level shard errors are tracked and used if no auth available (`issue#20089 <http://tracker.ceph.com/issues/20089>`_, `pr#15397 <https://github.com/ceph/ceph/pull/15397>`_, David Zafman)
-* osd: On EIO from read recover the primary replica from another copy (`issue#18165 <http://tracker.ceph.com/issues/18165>`_, `pr#14760 <https://github.com/ceph/ceph/pull/14760>`_, David Zafman)
-* osd: osdc/ObjectCacher: use state instead of get_state() (`pr#12544 <https://github.com/ceph/ceph/pull/12544>`_, huangjun)
-* osd: osdc/Objecter: more constness (`pr#14819 <https://github.com/ceph/ceph/pull/14819>`_, Kefu Chai)
-* osd: osdc: silence warning from `-Wsign-compare` (`pr#14729 <https://github.com/ceph/ceph/pull/14729>`_, Jos Collin)
-* osd: osd does not using MPing Messages,do not include unused include (`pr#15833 <https://github.com/ceph/ceph/pull/15833>`_, linbing)
-* osd: osd/OSDMap.cc: check if osd is out in subtree_type_is_down (`issue#19989 <http://tracker.ceph.com/issues/19989>`_, `pr#15250 <https://github.com/ceph/ceph/pull/15250>`_, Neha Ojha)
-* osd: osd/OSDMap: require OSD features only of OSDs (`issue#18831 <http://tracker.ceph.com/issues/18831>`_, `pr#13275 <https://github.com/ceph/ceph/pull/13275>`_, Ilya Dryomov)
-* osd: osd/PrimaryLogPG: nullptr not NULL (`pr#13973 <https://github.com/ceph/ceph/pull/13973>`_, Shinobu Kinjo)
-* osd: 'osd tree in|out|up|down' to filter tree results (`pr#15294 <https://github.com/ceph/ceph/pull/15294>`_, Sage Weil)
-* osd: os/kstore: some error handling (`pr#13960 <https://github.com/ceph/ceph/pull/13960>`_, wangzhengyong)
-* osd/PGBackend: delete reply if fails to complete delete request (`issue#20913 <http://tracker.ceph.com/issues/20913>`_, `pr#17233 <https://github.com/ceph/ceph/pull/17233>`_, Kefu Chai)
-* osd: pg: be more careful with locking around forced pg recovery (`issue#20808 <http://tracker.ceph.com/issues/20808>`_, `pr#16712 <https://github.com/ceph/ceph/pull/16712>`_, Greg Farnum)
-* osd: pglog trimming fixes (`pr#12882 <https://github.com/ceph/ceph/pull/12882>`_, Zhiqiang Wang)
-* osd: pglog: with config, don't assert in the presence of stale diverg… (`issue#17916 <http://tracker.ceph.com/issues/17916>`_, `pr#14648 <https://github.com/ceph/ceph/pull/14648>`_, Greg Farnum)
-* osd: pg-remap -> pg-upmap (`pr#14556 <https://github.com/ceph/ceph/pull/14556>`_, Sage Weil)
-* osd: populate last_epoch_split during build_initial_pg_history (`issue#20754 <http://tracker.ceph.com/issues/20754>`_, `pr#16519 <https://github.com/ceph/ceph/pull/16519>`_, Sage Weil)
-* osd: Preserve OSDOp information for historic ops (`pr#15265 <https://github.com/ceph/ceph/pull/15265>`_, Guo-Fu Tseng)
-* osd: PrimaryLogPG, PGBackend: complete callback even if interval changes (`issue#20747 <http://tracker.ceph.com/issues/20747>`_, `pr#16536 <https://github.com/ceph/ceph/pull/16536>`_, Josh Durgin)
-* osd: print pg_info_t::purged_snaps as array, not string (`issue#18584 <http://tracker.ceph.com/issues/18584>`_, `pr#14217 <https://github.com/ceph/ceph/pull/14217>`_, liuchang0812)
-* osd: process deletes during recovery instead of peering (`issue#19971 <http://tracker.ceph.com/issues/19971>`_, `pr#15952 <https://github.com/ceph/ceph/pull/15952>`_, Josh Durgin)
-* osd: put osdmap in mempool (`pr#14780 <https://github.com/ceph/ceph/pull/14780>`_, Sage Weil)
-* osd: reduce buffer pinning from EC entries (`pr#15120 <https://github.com/ceph/ceph/pull/15120>`_, Sage Weil)
-* osd: reduce map cache size (`pr#15292 <https://github.com/ceph/ceph/pull/15292>`_, Sage Weil)
-* osd: reduce rados_max_object_size from 100 GB -> 128 MB (`pr#15520 <https://github.com/ceph/ceph/pull/15520>`_, Sage Weil)
-* osd: remove copy-get-classic (`pr#13547 <https://github.com/ceph/ceph/pull/13547>`_, Sage Weil)
-* osd: remove sortbitwise thrashing (`pr#13296 <https://github.com/ceph/ceph/pull/13296>`_, Sage Weil)
-* osd: renamed the new vector name in OSDMap::build_simple_crush_map_from_conf (`pr#14583 <https://github.com/ceph/ceph/pull/14583>`_, Jos Collin)
-* osd: rename osd -> osd_pglog; include pglog-related bufferlists (`pr#15531 <https://github.com/ceph/ceph/pull/15531>`_, Sage Weil)
-* osd: rephrase "wrongly marked me down" clog message (`pr#16365 <https://github.com/ceph/ceph/pull/16365>`_, John Spray)
-* osd: replace object_info_t::operator=() with decode() (`pr#13938 <https://github.com/ceph/ceph/pull/13938>`_, tang.jin)
-* osd: ReplicatedBackend::prep_push() remove redundant variable assignments (`pr#14817 <https://github.com/ceph/ceph/pull/14817>`_, Jin Cai)
-* osd: restart boot process if waiting for luminous mons (`issue#20631 <http://tracker.ceph.com/issues/20631>`_, `pr#16341 <https://github.com/ceph/ceph/pull/16341>`_, Sage Weil)
-* osd: Return correct osd_objectstore in OSD metadata (`issue#18638 <http://tracker.ceph.com/issues/18638>`_, `pr#13072 <https://github.com/ceph/ceph/pull/13072>`_, Wido den Hollander)
-* osd: Return early on shutdown (`issue#19900 <http://tracker.ceph.com/issues/19900>`_, `pr#15345 <https://github.com/ceph/ceph/pull/15345>`_, Brad Hubbard)
-* osd: Reverse order of op_has_sufficient_caps and do_pg_op (`issue#19790 <http://tracker.ceph.com/issues/19790>`_, `pr#15354 <https://github.com/ceph/ceph/pull/15354>`_, Brad Hubbard)
-* osd: sched_scrub() lock pg only if all scrubbing conditions are fulfilled (`pr#14968 <https://github.com/ceph/ceph/pull/14968>`_, Jin Cai)
-* osd: scrub_to specifies clone ver, but transaction include head write… (`issue#20041 <http://tracker.ceph.com/issues/20041>`_, `pr#16404 <https://github.com/ceph/ceph/pull/16404>`_, David Zafman)
-* osd: silence warning from -Wint-in-bool-context (`pr#16744 <https://github.com/ceph/ceph/pull/16744>`_, Jos Collin)
-* osd: simplify past_intervals representation (`pr#14444 <https://github.com/ceph/ceph/pull/14444>`_, Samuel Just, Sage Weil)
-* osd: small clear up and optimize on _recover_now and should_share_map function (`pr#13476 <https://github.com/ceph/ceph/pull/13476>`_, song baisen)
-* osd: stop mgrc earlier in shutdown() (`issue#19638 <http://tracker.ceph.com/issues/19638>`_, `pr#14904 <https://github.com/ceph/ceph/pull/14904>`_, Kefu Chai)
-* osd: stop MgrClient callbacks on shutdown (`issue#19638 <http://tracker.ceph.com/issues/19638>`_, `pr#14896 <https://github.com/ceph/ceph/pull/14896>`_, Sage Weil)
-* osd: strip pglog op name (`pr#14764 <https://github.com/ceph/ceph/pull/14764>`_, liuchang0812)
-* osd: support cmpext operation on EC-backed pools (`pr#15693 <https://github.com/ceph/ceph/pull/15693>`_, Zhengyong Wang, Jason Dillaman)
-* osd: support dumping long ops (`pr#13019 <https://github.com/ceph/ceph/pull/13019>`_, Zhiqiang Wang)
-* osd: switch filestore to default to rocksdb (`pr#14814 <https://github.com/ceph/ceph/pull/14814>`_, Neha Ojha)
-* osd: tag fast dispatch messages with min_epoch (`pr#13681 <https://github.com/ceph/ceph/pull/13681>`_, Sage Weil)
-* osd: take PGRef for recovery sleep wakeup event (`issue#20226 <http://tracker.ceph.com/issues/20226>`_, `pr#15582 <https://github.com/ceph/ceph/pull/15582>`_, Sage Weil)
-* osd: the condition of last epoch <= superblock.newest_map epoch has been check twice (`pr#15590 <https://github.com/ceph/ceph/pull/15590>`_, linbing)
-* osd: the osd should not share map with others when it is in stopping state (`pr#13668 <https://github.com/ceph/ceph/pull/13668>`_, song baisen)
-* osd: unlock sdata_op_ordering_lock with sdata_lock hold to avoid miss… (`pr#15891 <https://github.com/ceph/ceph/pull/15891>`_, Ming Lin)
-* osd: use append(bufferlist &) to avoid unnecessary copy (`pr#12272 <https://github.com/ceph/ceph/pull/12272>`_, Yunchuan Wen)
-* osd: use separate waitlist for scrub (`pr#13136 <https://github.com/ceph/ceph/pull/13136>`_, Sage Weil)
-* osd: various changes for preventing internal ENOSPC condition (`issue#16878 <http://tracker.ceph.com/issues/16878>`_, `pr#13425 <https://github.com/ceph/ceph/pull/13425>`_, David Zafman)
-* osd: we know the definite epoch of marking down (`pr#13121 <https://github.com/ceph/ceph/pull/13121>`_, Mingxin Liu)
-* osd: when osd in not in failure_pending, we don't need to get osd inst from osdmap (`pr#15558 <https://github.com/ceph/ceph/pull/15558>`_, linbing)
-* osd: When scrub finds an attr error mark shard inconsistent (`issue#20089 <http://tracker.ceph.com/issues/20089>`_, `pr#15368 <https://github.com/ceph/ceph/pull/15368>`_, David Zafman)
-* osd: zipkin tracing (`pr#14305 <https://github.com/ceph/ceph/pull/14305>`_, Sage Weil, Marios-Evaggelos Kogias, Victor Araujo, Casey Bodley, Andrew Shewmaker, Chendi.Xue)
-* performance: buffer, osd: add missing crc cache miss perf counter (`pr#14957 <https://github.com/ceph/ceph/pull/14957>`_, Piotr Dałek)
-* performance: common/config_opts.h: Lower HDD throttle cost (`pr#15485 <https://github.com/ceph/ceph/pull/15485>`_, Mark Nelson)
-* performance: crc32c: optimize aarch64 crc32c implementation (`pr#12977 <https://github.com/ceph/ceph/pull/12977>`_, wei xiao)
-* performance: denc: add need_contiguous to denc_traits (`pr#15224 <https://github.com/ceph/ceph/pull/15224>`_, Kefu Chai)
-* performance: osd, messenger, librados: lttng oid tracing (`pr#12492 <https://github.com/ceph/ceph/pull/12492>`_, Anjaneya Chagam)
-* performance: osd/PG.cc: loop invariant code motion (`pr#12720 <https://github.com/ceph/ceph/pull/12720>`_, Li Wang)
-* performance: osd/ReplicatedBackend: do not set omap header if it is empty (`pr#12612 <https://github.com/ceph/ceph/pull/12612>`_, fang yuxiang)
-* performance,rgw: rgw_file: permit dirent offset computation (`pr#16275 <https://github.com/ceph/ceph/pull/16275>`_, Matt Benjamin)
-* pybind: better error msg (`pr#14497 <https://github.com/ceph/ceph/pull/14497>`_, Kefu Chai)
-* pybind: cephfs should be built without librados / python-rados (`pr#13431 <https://github.com/ceph/ceph/pull/13431>`_, Kefu Chai)
-* pybind: ceph.in: Check return value when connecting (`pr#16130 <https://github.com/ceph/ceph/pull/16130>`_, Douglas Fuller)
-* pybind: ceph-rest-api: Various REST API fixes (`pr#15910 <https://github.com/ceph/ceph/pull/15910>`_, Wido den Hollander)
-* pybind: conditional compile the linux specific constant (`pr#12198 <https://github.com/ceph/ceph/pull/12198>`_, Kefu Chai)
-* pybind: fix docstring for librbd Python binding (`pr#13977 <https://github.com/ceph/ceph/pull/13977>`_, runsisi)
-* pybind: fix open flags calculation (`issue#19890 <http://tracker.ceph.com/issues/19890>`_, `pr#15018 <https://github.com/ceph/ceph/pull/15018>`_, "Yan, Zheng")
-* pybind: pybind/ceph_argparse: fix empty string check (`issue#20135 <http://tracker.ceph.com/issues/20135>`_, `pr#15500 <https://github.com/ceph/ceph/pull/15500>`_, Sage Weil)
-* pybind: pybind/ceph_daemon.py: fix Termsize.update (`pr#15253 <https://github.com/ceph/ceph/pull/15253>`_, Kefu Chai)
-* pybind: pybind/ceph_daemon: use small chunk for recv (`pr#13804 <https://github.com/ceph/ceph/pull/13804>`_, Xiaoxi Chen)
-* pybind: pybind/mgr/dashboard: fix get kernel_version error (`pr#16094 <https://github.com/ceph/ceph/pull/16094>`_, Peng Zhang)
-* pybind: pybind/mgr/restful: fix typo (`pr#16560 <https://github.com/ceph/ceph/pull/16560>`_, Nick Erdmann)
-* pybind: pybind/mgr/restful: use list to pass hooks to create a `Pecan` instance (`issue#20258 <http://tracker.ceph.com/issues/20258>`_, `pr#15646 <https://github.com/ceph/ceph/pull/15646>`_, Kefu Chai)
-* pybind: pybind/rados: avoid call free() on invalid pointer (`pr#15159 <https://github.com/ceph/ceph/pull/15159>`_, Mingxin Liu)
-* pybind: pybind/rados: use new APIs instead of deprecated ones (`pr#16684 <https://github.com/ceph/ceph/pull/16684>`_, Kefu Chai)
-* pybind,rbd: pybind/rbd: OSError should be picklable (`issue#20223 <http://tracker.ceph.com/issues/20223>`_, `pr#15574 <https://github.com/ceph/ceph/pull/15574>`_, Jason Dillaman)
-* pybind: restore original API for backwards compatibility (`issue#20421 <http://tracker.ceph.com/issues/20421>`_, `pr#15932 <https://github.com/ceph/ceph/pull/15932>`_, Jason Dillaman)
-* pybind: support mon target in pybind (`pr#15409 <https://github.com/ceph/ceph/pull/15409>`_, liuchang0812)
-* qa: fix POOL_APP_NOT_ENABLED warning in krbd:unmap suite (`pr#17192 <https://github.com/ceph/ceph/pull/17192>`_, Ilya Dryomov)
-* rbd: add default note info to size (create and resize) (`pr#15561 <https://github.com/ceph/ceph/pull/15561>`_, Zheng Yin)
-* rbd: add error prompt when input command 'snap set limit' is incomplete (`pr#12945 <https://github.com/ceph/ceph/pull/12945>`_, Tang Jin)
-* rbd: additional validation for 'bench' optional parameters (`pr#12697 <https://github.com/ceph/ceph/pull/12697>`_, Yunchuan Wen)
-* rbd: bench-write should return error if io-size >= 4G (`issue#18422 <http://tracker.ceph.com/issues/18422>`_, `pr#12864 <https://github.com/ceph/ceph/pull/12864>`_, Gaurav Kumar Garg)
-* rbd: cleanup: fix the typo in namespace comment (`pr#12858 <https://github.com/ceph/ceph/pull/12858>`_, Dongsheng Yang)
-* rbd: cleanup: rbd: fix a typo in comment (`pr#14049 <https://github.com/ceph/ceph/pull/14049>`_, Dongsheng Yang)
-* rbd: cls_rbd: default initialize snapshot namespace for legacy clients (`issue#19413 <http://tracker.ceph.com/issues/19413>`_, `pr#14903 <https://github.com/ceph/ceph/pull/14903>`_, Jason Dillaman)
-* rbd: cls/rbd: silence warning from -Wunused-variable (`pr#16670 <https://github.com/ceph/ceph/pull/16670>`_, Yan Jun)
-* rbd: cls/rbd: trash_list should be iterable (`issue#20643 <http://tracker.ceph.com/issues/20643>`_, `pr#16372 <https://github.com/ceph/ceph/pull/16372>`_, Jason Dillaman)
-* rbd: common/bit_vector: utilize deep-copy during data decode (`issue#19863 <http://tracker.ceph.com/issues/19863>`_, `pr#15017 <https://github.com/ceph/ceph/pull/15017>`_, Jason Dillaman)
-* rbd: correct coverity warnings (`pr#12954 <https://github.com/ceph/ceph/pull/12954>`_, Jason Dillaman)
-* rbd: correct issues with image importing (`pr#14401 <https://github.com/ceph/ceph/pull/14401>`_, Jason Dillaman)
-* rbd: demote/promote all mirrored images in a pool (`issue#18748 <http://tracker.ceph.com/issues/18748>`_, `pr#13758 <https://github.com/ceph/ceph/pull/13758>`_, Jason Dillaman)
-* rbd: destination pool should be source pool if it is not specified (`issue#18326 <http://tracker.ceph.com/issues/18326>`_, `pr#13189 <https://github.com/ceph/ceph/pull/13189>`_, Gaurav Kumar Garg)
-* rbd: do not attempt to load key if auth is disabled (`issue#19035 <http://tracker.ceph.com/issues/19035>`_, `pr#16024 <https://github.com/ceph/ceph/pull/16024>`_, Jason Dillaman)
-* rbd: Drop unused member variable reopen in C_OpenComplete (`pr#16729 <https://github.com/ceph/ceph/pull/16729>`_, amitkuma)
-* rbd: enable rbd on FreeBSD (without KRBD) (`pr#12798 <https://github.com/ceph/ceph/pull/12798>`_, Willem Jan Withagen)
-* rbd: error out if import image format failed (`pr#13957 <https://github.com/ceph/ceph/pull/13957>`_, wangzhengyong)
-* rbd: fixed coverity 'Argument cannot be negative' warning (`pr#16686 <https://github.com/ceph/ceph/pull/16686>`_, amitkuma)
-* rbd: fix typo in Kernel.cc (`issue#19273 <http://tracker.ceph.com/issues/19273>`_, `pr#13983 <https://github.com/ceph/ceph/pull/13983>`_, Gaurav Kumar Garg)
-* rbd: 'image-meta remove' for missing key does not return error (`issue#16990 <http://tracker.ceph.com/issues/16990>`_, `pr#16393 <https://github.com/ceph/ceph/pull/16393>`_, PCzhangPC)
-* rbd: import-diff should discard any zeroed extents (`pr#14445 <https://github.com/ceph/ceph/pull/14445>`_, Jason Dillaman)
-* rbd: import needs to sanity check auto-generated image name (`issue#19128 <http://tracker.ceph.com/issues/19128>`_, `pr#14754 <https://github.com/ceph/ceph/pull/14754>`_, Mykola Golub)
-* rbd: import real thin-provision image (`issue#15648 <http://tracker.ceph.com/issues/15648>`_, `pr#12883 <https://github.com/ceph/ceph/pull/12883>`_, yaoning, Ning Yao)
-* rbd: info command should indicate if parent is in trash (`pr#14875 <https://github.com/ceph/ceph/pull/14875>`_, Jason Dillaman)
-* rbd: introduce v2 format for rbd export/import (`issue#13186 <http://tracker.ceph.com/issues/13186>`_, `pr#10487 <https://github.com/ceph/ceph/pull/10487>`_, Dongsheng Yang)
-* rbd: journal: don't hold future lock during assignment (`issue#18618 <http://tracker.ceph.com/issues/18618>`_, `pr#13033 <https://github.com/ceph/ceph/pull/13033>`_, Jason Dillaman)
-* rbd: journal: stop processing removal after error (`issue#18738 <http://tracker.ceph.com/issues/18738>`_, `pr#13193 <https://github.com/ceph/ceph/pull/13193>`_, Jason Dillaman)
-* rbd: luminous: librbd: default localize parent reads to false (`issue#20941 <http://tracker.ceph.com/issues/20941>`_, `pr#16899 <https://github.com/ceph/ceph/pull/16899>`_, Jason Dillaman)
-* rbd: luminous: librbd: remove consistency group rbd cli and API support (`pr#16875 <https://github.com/ceph/ceph/pull/16875>`_, Jason Dillaman)
-* rbd: luminous: rbd-ggate: tool to map images on FreeBSD via GEOM Gate (`pr#16895 <https://github.com/ceph/ceph/pull/16895>`_, Mykola Golub)
-* rbd: luminous: rbd-mirror: align use of uint64_t in service_daemon::AttributeType (`pr#16948 <https://github.com/ceph/ceph/pull/16948>`_, James Page)
-* rbd: luminous: rbd-mirror: simplify notifications for image assignment (`issue#15764 <http://tracker.ceph.com/issues/15764>`_, `pr#16878 <https://github.com/ceph/ceph/pull/16878>`_, Jason Dillaman)
-* rbd: luminous: rbd: parallelize rbd ls -l (`pr#16921 <https://github.com/ceph/ceph/pull/16921>`_, Piotr Dałek)
-* rbd: make it more understandable when adding peer returns error (`pr#16313 <https://github.com/ceph/ceph/pull/16313>`_, songweibin)
-* rbd-mirror: add support for active/passive daemon instances (`issue#17018 <http://tracker.ceph.com/issues/17018>`_, `issue#17019 <http://tracker.ceph.com/issues/17019>`_, `issue#17020 <http://tracker.ceph.com/issues/17020>`_, `pr#12948 <https://github.com/ceph/ceph/pull/12948>`_, Mykola Golub)
-* rbd-mirror: assertion failure during pool replayer shut down (`issue#20644 <http://tracker.ceph.com/issues/20644>`_, `pr#16704 <https://github.com/ceph/ceph/pull/16704>`_, Jason Dillaman)
-* rbd-mirror: avoid processing new events after stop requested (`issue#18441 <http://tracker.ceph.com/issues/18441>`_, `pr#12837 <https://github.com/ceph/ceph/pull/12837>`_, Jason Dillaman)
-* rbd-mirror: check remote image mirroring state when bootstrapping (`issue#18447 <http://tracker.ceph.com/issues/18447>`_, `pr#12820 <https://github.com/ceph/ceph/pull/12820>`_, Mykola Golub)
-* rbd-mirror: coordinate image syncs with leader (`issue#18789 <http://tracker.ceph.com/issues/18789>`_, `pr#14745 <https://github.com/ceph/ceph/pull/14745>`_, Mykola Golub)
-* rbd-mirror: delayed replication support (`issue#15371 <http://tracker.ceph.com/issues/15371>`_, `pr#11879 <https://github.com/ceph/ceph/pull/11879>`_, Mykola Golub)
-* rbd-mirror: deleting a snapshot during sync can result in read errors (`issue#18990 <http://tracker.ceph.com/issues/18990>`_, `pr#13568 <https://github.com/ceph/ceph/pull/13568>`_, Jason Dillaman)
-* rbd-mirror: ensure missing images are re-synced when detected (`issue#19811 <http://tracker.ceph.com/issues/19811>`_, `pr#14945 <https://github.com/ceph/ceph/pull/14945>`_, Jason Dillaman)
-* rbd-mirror: failover and failback of unmodified image results in split-brain (`issue#19858 <http://tracker.ceph.com/issues/19858>`_, `pr#14963 <https://github.com/ceph/ceph/pull/14963>`_, Jason Dillaman)
-* rbd-mirror: guard the deletion of non-primary images (`pr#16398 <https://github.com/ceph/ceph/pull/16398>`_, Jason Dillaman)
-* rbd-mirror: ignore permission errors on rbd_mirroring object (`issue#20571 <http://tracker.ceph.com/issues/20571>`_, `pr#16264 <https://github.com/ceph/ceph/pull/16264>`_, Jason Dillaman)
-* rbd-mirror: image deletions should be handled by assigned instance (`pr#14832 <https://github.com/ceph/ceph/pull/14832>`_, Jason Dillaman)
-* rbd-mirror: initialize timer context pointer to null (`pr#16603 <https://github.com/ceph/ceph/pull/16603>`_, Jason Dillaman)
-* rbd-mirror: InstanceWatcher watch/notify stub for leader/follower RPC (`issue#18783 <http://tracker.ceph.com/issues/18783>`_, `pr#13312 <https://github.com/ceph/ceph/pull/13312>`_, Mykola Golub)
-* rbd-mirror: lock loss during sync should wait for in-flight copies (`pr#15532 <https://github.com/ceph/ceph/pull/15532>`_, Jason Dillaman)
-* rbd-mirror: permit release of local image exclusive lock after force promotion (`issue#18963 <http://tracker.ceph.com/issues/18963>`_, `pr#15140 <https://github.com/ceph/ceph/pull/15140>`_, Jason Dillaman)
-* rbd-mirror: pool watcher should track mirror uuid (`pr#14240 <https://github.com/ceph/ceph/pull/14240>`_, Jason Dillaman)
-* rbd-mirror: remove tracking of image names from pool watcher (`pr#14712 <https://github.com/ceph/ceph/pull/14712>`_, Jason Dillaman)
-* rbd-mirror: replace remote pool polling with add/remove notifications (`issue#15029 <http://tracker.ceph.com/issues/15029>`_, `pr#12364 <https://github.com/ceph/ceph/pull/12364>`_, Jason Dillaman)
-* rbd-mirror: resolve admin socket path names collision (`issue#19907 <http://tracker.ceph.com/issues/19907>`_, `pr#15048 <https://github.com/ceph/ceph/pull/15048>`_, Mykola Golub)
-* rbd-mirror: separate ImageReplayer handling from Replayer (`issue#18785 <http://tracker.ceph.com/issues/18785>`_, `pr#13803 <https://github.com/ceph/ceph/pull/13803>`_, Mykola Golub)
-* rbd-mirror: Set the data pool correctly when creating images (`issue#20567 <http://tracker.ceph.com/issues/20567>`_, `pr#17023 <https://github.com/ceph/ceph/pull/17023>`_, Adam Wolfe Gordon)
-* rbd-mirror: track images via global image id (`pr#13416 <https://github.com/ceph/ceph/pull/13416>`_, Jason Dillaman)
-* rbd: modified some commands' description into imperative sentence (`pr#16694 <https://github.com/ceph/ceph/pull/16694>`_, songweibin)
-* rbd-nbd: check /sys/block/nbdX/size to ensure kernel mapped correctly (`issue#18335 <http://tracker.ceph.com/issues/18335>`_, `pr#13229 <https://github.com/ceph/ceph/pull/13229>`_, Mykola Golub)
-* rbd-nbd: clean up the doc and help information (`pr#14146 <https://github.com/ceph/ceph/pull/14146>`_, Pan Liu)
-* rbd-nbd: create admin socket only for map command (`issue#17951 <http://tracker.ceph.com/issues/17951>`_, `pr#12433 <https://github.com/ceph/ceph/pull/12433>`_, Pan Liu)
-* rbd-nbd: display pool/image/snap information in list output (`pr#15317 <https://github.com/ceph/ceph/pull/15317>`_, Pan Liu)
-* rbd-nbd: don't ignore --read-only option in BLKROSET ioctl (`pr#13944 <https://github.com/ceph/ceph/pull/13944>`_, Pan Liu)
-* rbd-nbd: ensure unmap returns error code (`pr#15593 <https://github.com/ceph/ceph/pull/15593>`_, guojiannan, chenfangxian)
-* rbd-nbd: fix a typo "moudle" (`pr#13652 <https://github.com/ceph/ceph/pull/13652>`_, Pan Liu)
-* rbd-nbd: fix typo in comment (`pr#14034 <https://github.com/ceph/ceph/pull/14034>`_, Pan Liu)
-* rbd-nbd: no need to check image format any more (`pr#13389 <https://github.com/ceph/ceph/pull/13389>`_, Mykola Golub)
-* rbd-nbd: relax size check for newer kernel versions (`issue#19871 <http://tracker.ceph.com/issues/19871>`_, `pr#14976 <https://github.com/ceph/ceph/pull/14976>`_, Mykola Golub)
-* rbd-nbd: remove debug messages from do_unmap (`pr#14253 <https://github.com/ceph/ceph/pull/14253>`_, Pan Liu)
-* rbd-nbd: s/cpp_error/cpp_strerror/ to fix FTBFS (`pr#14223 <https://github.com/ceph/ceph/pull/14223>`_, Kefu Chai)
-* rbd-nbd: support signal handle for SIGHUP, SIGINT and SIGTERM (`issue#19349 <http://tracker.ceph.com/issues/19349>`_, `pr#14079 <https://github.com/ceph/ceph/pull/14079>`_, Pan Liu)
-* rbd-nbd: update size only when NBD_SET_SIZE successful (`pr#14005 <https://github.com/ceph/ceph/pull/14005>`_, Pan Liu)
-* rbd-nbd: warn when kernel parameters are ignored (`issue#19108 <http://tracker.ceph.com/issues/19108>`_, `pr#13694 <https://github.com/ceph/ceph/pull/13694>`_, Pan Liu)
-* rbd: prevent adding multiple mirror peers to a single pool (`issue#19256 <http://tracker.ceph.com/issues/19256>`_, `pr#13919 <https://github.com/ceph/ceph/pull/13919>`_, Jason Dillaman)
-* rbd: properly decode features when using image name optional (`issue#20185 <http://tracker.ceph.com/issues/20185>`_, `pr#15492 <https://github.com/ceph/ceph/pull/15492>`_, Jason Dillaman)
-* rbd:  pybind/rbd: add image metadata methods (`issue#19451 <http://tracker.ceph.com/issues/19451>`_, `pr#14463 <https://github.com/ceph/ceph/pull/14463>`_, Mykola Golub)
-* rbd: pybind/rbd: fix crash if more than 1024 images in trash bin (`pr#15134 <https://github.com/ceph/ceph/pull/15134>`_, runsisi)
-* rbd: rbd/bench: add notes of default values, it's easy to use (`pr#14762 <https://github.com/ceph/ceph/pull/14762>`_, Zheng Yin)
-* rbd: rbd/bench: fix write gaps when doing sequential writes with io-threads > 1 (`pr#15206 <https://github.com/ceph/ceph/pull/15206>`_, Igor Fedotov)
-* rbd: rbd, librbd: migrate atomic_t to std::atomic (`pr#14656 <https://github.com/ceph/ceph/pull/14656>`_, Jesse Williamson)
-* rbd: rbd-mirror A/A: leader should track up/down rbd-mirror instances (`issue#18784 <http://tracker.ceph.com/issues/18784>`_, `pr#13571 <https://github.com/ceph/ceph/pull/13571>`_, Mykola Golub)
-* rbd: rbd-mirror A/A: proxy InstanceReplayer APIs via InstanceWatcher RPC (`issue#18787 <http://tracker.ceph.com/issues/18787>`_, `pr#13978 <https://github.com/ceph/ceph/pull/13978>`_, Mykola Golub)
-* rbd: recognize exclusive option (`pr#14785 <https://github.com/ceph/ceph/pull/14785>`_, Ilya Dryomov)
-* rbd: removed hardcoded default pool (`pr#15518 <https://github.com/ceph/ceph/pull/15518>`_, Jason Dillaman)
-* rbd: remove direct linking to static boost libraries (`pr#12962 <https://github.com/ceph/ceph/pull/12962>`_, Jason Dillaman)
-* rbd: removed spurious error message from mirror pool commands (`pr#14935 <https://github.com/ceph/ceph/pull/14935>`_, Jason Dillaman)
-* rbd: remove unused condition within group action handler (`pr#12723 <https://github.com/ceph/ceph/pull/12723>`_, Gaurav Kumar Garg)
-* rbd,rgw,tools: tools/rbd, rgw: Removed unreachable returns (`pr#16308 <https://github.com/ceph/ceph/pull/16308>`_, Jos Collin)
-* rbd: spell out image features unsupported by the kernel (`issue#19095 <http://tracker.ceph.com/issues/19095>`_, `pr#13812 <https://github.com/ceph/ceph/pull/13812>`_, Ilya Dryomov)
-* rbd: stop indefinite thread waiting in krbd udev handling (`issue#17195 <http://tracker.ceph.com/issues/17195>`_, `pr#14051 <https://github.com/ceph/ceph/pull/14051>`_, Spandan Kumar Sahu)
-* rbd: test: fix rbd unit test cases w/ striping feature (`issue#18888 <http://tracker.ceph.com/issues/18888>`_, `pr#13196 <https://github.com/ceph/ceph/pull/13196>`_, Venky Shankar)
-* rbd,tests: luminous: qa/workunits/rbd: use command line option to specify watcher asok (`issue#20954 <http://tracker.ceph.com/issues/20954>`_, `pr#16946 <https://github.com/ceph/ceph/pull/16946>`_, Mykola Golub)
-* rbd,tests: luminous: test/librbd: fix race condition with OSD map refresh (`issue#20918 <http://tracker.ceph.com/issues/20918>`_, `pr#16903 <https://github.com/ceph/ceph/pull/16903>`_, Jason Dillaman)
-* rbd,tests: qa: add workunit to test krbd data-pool support (`pr#13482 <https://github.com/ceph/ceph/pull/13482>`_, Ilya Dryomov)
-* rbd,tests: qa: integrate OpenStack 'gate-tempest-dsvm-full-devstack-plugin-ceph' (`issue#18594 <http://tracker.ceph.com/issues/18594>`_, `pr#13158 <https://github.com/ceph/ceph/pull/13158>`_, Jason Dillaman)
-* rbd,tests: qa: krbd_data_pool.sh: account for rbd_info metadata object (`pr#14631 <https://github.com/ceph/ceph/pull/14631>`_, Ilya Dryomov)
-* rbd,tests: qa: krbd discard/zeroout tests (`pr#15388 <https://github.com/ceph/ceph/pull/15388>`_, Ilya Dryomov)
-* rbd,tests: qa: krbd write-after-checksum tests (`pr#14836 <https://github.com/ceph/ceph/pull/14836>`_, Ilya Dryomov)
-* rbd,tests: qa/suites/krbd: unmap subsuite needs straw buckets (`pr#15290 <https://github.com/ceph/ceph/pull/15290>`_, Ilya Dryomov)
-* rbd,tests: qa/suites/rbd: restrict python memcheck validation to CentOS (`pr#15923 <https://github.com/ceph/ceph/pull/15923>`_, Jason Dillaman)
-* rbd,tests: qa/tasks/qemu: update default image url after ceph.com redesign (`issue#18542 <http://tracker.ceph.com/issues/18542>`_, `pr#12953 <https://github.com/ceph/ceph/pull/12953>`_, Jason Dillaman)
-* rbd,tests: qa/tasks/rbd_fio: bump default fio version to 2.21 (`pr#16656 <https://github.com/ceph/ceph/pull/16656>`_, Ilya Dryomov)
-* rbd,tests: qa/tasks: rbd-mirror daemon not properly run in foreground mode (`issue#20630 <http://tracker.ceph.com/issues/20630>`_, `pr#16340 <https://github.com/ceph/ceph/pull/16340>`_, Jason Dillaman)
-* rbd,tests: qa: thrash tests for backoff and upmap (`pr#16428 <https://github.com/ceph/ceph/pull/16428>`_, Ilya Dryomov)
-* rbd,tests: qa: update krbd_data_pool.sh to match the new rados ls behavior (`pr#15594 <https://github.com/ceph/ceph/pull/15594>`_, Ilya Dryomov)
-* rbd,tests: qa/workunits: adjust path to ceph-helpers.sh (`pr#16599 <https://github.com/ceph/ceph/pull/16599>`_, Sage Weil)
-* rbd,tests: qa/workunits: corrected issues with RBD cli test (`pr#14460 <https://github.com/ceph/ceph/pull/14460>`_, Jason Dillaman)
-* rbd,tests: qa/workunits/rbd: diff.sh failed removing nonexistent file (`pr#14482 <https://github.com/ceph/ceph/pull/14482>`_, Mykola Golub)
-* rbd,tests: qa/workunits/rbd: increased trash deferment period (`pr#14846 <https://github.com/ceph/ceph/pull/14846>`_, Jason Dillaman)
-* rbd,tests: qa/workunits/rbd: resolve potential rbd-mirror race conditions (`issue#18935 <http://tracker.ceph.com/issues/18935>`_, `pr#13421 <https://github.com/ceph/ceph/pull/13421>`_, Jason Dillaman)
-* rbd,tests: qa/workunits/rbd: test data pool is mirrored correctly (`pr#17077 <https://github.com/ceph/ceph/pull/17077>`_, Mykola Golub)
-* rbd,tests: qa/workunits/rbd: tweak rbd-mirror config to spead up testing (`pr#13228 <https://github.com/ceph/ceph/pull/13228>`_, Mykola Golub)
-* rbd,tests: qa/workunits: switch to OpenStack Ocata release for RBD testing (`pr#14465 <https://github.com/ceph/ceph/pull/14465>`_, Jason Dillaman)
-* rbd,tests: test: correct language mode in file headers (`pr#12924 <https://github.com/ceph/ceph/pull/12924>`_, Jason Dillaman)
-* rbd,tests: test: fix compile warning in ceph_test_cls_rbd (`pr#15919 <https://github.com/ceph/ceph/pull/15919>`_, Jason Dillaman)
-* rbd,tests: test: fix failing rbd devstack teuthology test (`pr#15956 <https://github.com/ceph/ceph/pull/15956>`_, Jason Dillaman)
-* rbd,tests: test/librados_test_stub: fixed cls_cxx_map_get_keys/vals return value (`issue#19597 <http://tracker.ceph.com/issues/19597>`_, `pr#14484 <https://github.com/ceph/ceph/pull/14484>`_, Jason Dillaman)
-* rbd,tests: test/librbd: add break_lock test (`pr#12842 <https://github.com/ceph/ceph/pull/12842>`_, Mykola Golub)
-* rbd,tests: test/librbd/CMakeLists.txt: ceph_test_librbd_fsx requires linux includes/libs (`pr#13630 <https://github.com/ceph/ceph/pull/13630>`_, Willem Jan Withagen)
-* rbd,tests: test/librbd/fsx: Add break in case OP_WRITESAME and OP_COMPARE_AND_WRITE (`pr#16742 <https://github.com/ceph/ceph/pull/16742>`_, Luo Kexue)
-* rbd,tests: test/librbd: move tests using non-public api to internal (`pr#13806 <https://github.com/ceph/ceph/pull/13806>`_, Venky Shankar)
-* rbd,tests: test/librbd/test_librbd.cc: set \*features even if RBD_FEATURES is unset (`issue#19865 <http://tracker.ceph.com/issues/19865>`_, `pr#14965 <https://github.com/ceph/ceph/pull/14965>`_, Dan Mick)
-* rbd,tests: test/librbd/test_notify.py: don't disable feature in slave (`issue#19716 <http://tracker.ceph.com/issues/19716>`_, `pr#14751 <https://github.com/ceph/ceph/pull/14751>`_, Mykola Golub)
-* rbd,tests: test/librbd: unit tests cleanup (`pr#15113 <https://github.com/ceph/ceph/pull/15113>`_, Mykola Golub)
-* rbd,tests: test: rbd master/slave notify test should test active features (`issue#19692 <http://tracker.ceph.com/issues/19692>`_, `pr#14638 <https://github.com/ceph/ceph/pull/14638>`_, Jason Dillaman)
-* rbd,tests: test/rbd_mirror: race in TestMockInstanceWatcher on destroy (`pr#14453 <https://github.com/ceph/ceph/pull/14453>`_, Mykola Golub)
-* rbd,tests: test/rbd_mirror: race in TestMockLeaderWatcher.AcquireError (`issue#19405 <http://tracker.ceph.com/issues/19405>`_, `pr#14741 <https://github.com/ceph/ceph/pull/14741>`_, Mykola Golub)
-* rbd,tests: test: remove hard-coded image name from RBD metadata test (`issue#19798 <http://tracker.ceph.com/issues/19798>`_, `pr#14848 <https://github.com/ceph/ceph/pull/14848>`_, Jason Dillaman)
-* rbd,tests: test: support blacklisting within librados_test_stub (`pr#13737 <https://github.com/ceph/ceph/pull/13737>`_, Jason Dillaman)
-* rbd,tests: test/unittest_librbd: remove unused variables (`pr#15720 <https://github.com/ceph/ceph/pull/15720>`_, shiqi)
-* rbd,tests: test: use librados API to retrieve config params (`issue#18617 <http://tracker.ceph.com/issues/18617>`_, `pr#13076 <https://github.com/ceph/ceph/pull/13076>`_, Jason Dillaman)
-* rbd,tools: rbdmap: consider /etc/ceph/rbdmap when unmapping images (`issue#18884 <http://tracker.ceph.com/issues/18884>`_, `pr#13361 <https://github.com/ceph/ceph/pull/13361>`_, David Disseldorp)
-* rbd,tools: tools/rbd_mirror: initialize non-static class member m_do_resync in ImageReplayer (`pr#15889 <https://github.com/ceph/ceph/pull/15889>`_, Jos Collin)
-* rbd,tools: tools/rbd_nbd: add --version show support (`pr#16254 <https://github.com/ceph/ceph/pull/16254>`_, Jin Cai)
-* rbd: use concurrent writes for imports (`issue#19034 <http://tracker.ceph.com/issues/19034>`_, `pr#13782 <https://github.com/ceph/ceph/pull/13782>`_, Venky Shankar)
-* rbd: use min<uint64_t>() explicitly (`issue#18938 <http://tracker.ceph.com/issues/18938>`_, `pr#14202 <https://github.com/ceph/ceph/pull/14202>`_, Kefu Chai)
-* rbd: validate pool and snap name optionals (`issue#14535 <http://tracker.ceph.com/issues/14535>`_, `pr#13836 <https://github.com/ceph/ceph/pull/13836>`_, Gaurav Kumar Garg)
-* rbd: warning, ‘devno’ may be used uninitialized in this function (`pr#14271 <https://github.com/ceph/ceph/pull/14271>`_, Jos Collin)
-* rbd: When Ceph cluster becomes full, should allow user to remove rbd … (`pr#12627 <https://github.com/ceph/ceph/pull/12627>`_, Pan Liu)
-* rdma: msg/async: Postpone bind if network stack is not ready (`pr#14414 <https://github.com/ceph/ceph/pull/14414>`_, Amir Vadai, Haomai Wang)
-* rdma: msg/async/rdma: Add DSCP support (`pr#15484 <https://github.com/ceph/ceph/pull/15484>`_, Sarit Zubakov)
-* rdma: msg/async/rdma: add inqueue rx chunks perf counter (`pr#14782 <https://github.com/ceph/ceph/pull/14782>`_, Haomai Wang)
-* rdma: msg/async/rdma: fix log line spacing (`pr#13263 <https://github.com/ceph/ceph/pull/13263>`_, Adir Lev)
-* rdma: msg/async/rdma: Make poll_blocking() poll for async events in additio… (`pr#14320 <https://github.com/ceph/ceph/pull/14320>`_, Amir Vadai)
-* rdma: msg/async/rdma: Make port number an attribute of the Connection not o… (`pr#14297 <https://github.com/ceph/ceph/pull/14297>`_, Amir Vadai)
-* rdma: msg/async/rdma: RDMA-CM, get_device() by ibv_context (`pr#14410 <https://github.com/ceph/ceph/pull/14410>`_, Amir Vadai)
-* rdma: msg/async: Revert RDMA-CM (`pr#15262 <https://github.com/ceph/ceph/pull/15262>`_, Amir Vadai)
-    Replace using sleep with new wait_for_health() bash function
-* rgw: abort early when s->length empty during putobj (`pr#15682 <https://github.com/ceph/ceph/pull/15682>`_, Jiaying Ren)
-* rgw: AbortMultipart request returns NoSuchUpload error if the meta obj doesn't exist (`pr#12793 <https://github.com/ceph/ceph/pull/12793>`_, Zhang Shaowen)
-* rgw: acl grants num limit (`pr#16291 <https://github.com/ceph/ceph/pull/16291>`_, Enming Zhang)
-* rgw: add a new error code for non-existed subuser (`pr#16095 <https://github.com/ceph/ceph/pull/16095>`_, Zhao Chao)
-* rgw: add a new error code for non-existed user (`issue#20468 <http://tracker.ceph.com/issues/20468>`_, `pr#16033 <https://github.com/ceph/ceph/pull/16033>`_, Zhao Chao)
-* rgw: add apis to support ragweed (`pr#13645 <https://github.com/ceph/ceph/pull/13645>`_, Yehuda Sadeh)
-* rgw: add a separate configuration for data notify interval (`pr#16551 <https://github.com/ceph/ceph/pull/16551>`_, fang yuxiang)
-* rgw: add bucket size limit check to radosgw-admin (`issue#17925 <http://tracker.ceph.com/issues/17925>`_, `pr#11796 <https://github.com/ceph/ceph/pull/11796>`_, Matt Benjamin)
-* rgw: Added a globbing method for AWS Policies (`pr#12445 <https://github.com/ceph/ceph/pull/12445>`_, Pritha Srivastava)
-* rgw: Added code for REST APIs for AWS Roles (`pr#12104 <https://github.com/ceph/ceph/pull/12104>`_, Pritha Srivastava)
-* rgw: Added code to correctly account for bytes sent/ received during a 'PUT' operation (`pr#14042 <https://github.com/ceph/ceph/pull/14042>`_, Pritha Srivastava)
-* rgw: Adding code to create tenanted user for s3 bucket policy tests (`pr#15028 <https://github.com/ceph/ceph/pull/15028>`_, Pritha Srivastava)
-* rgw: add lifecycle validation according to S3 (`issue#18394 <http://tracker.ceph.com/issues/18394>`_, `pr#12750 <https://github.com/ceph/ceph/pull/12750>`_, Zhang Shaowen)
-* rgw: add missing RGWPeriod::reflect() based on new atomic update_latest_epoch() (`issue#19816 <http://tracker.ceph.com/issues/19816>`_, `issue#19817 <http://tracker.ceph.com/issues/19817>`_, `pr#14915 <https://github.com/ceph/ceph/pull/14915>`_, Casey Bodley)
-* rgw: add --num-zonegroups option for multi test (`pr#14216 <https://github.com/ceph/ceph/pull/14216>`_, lvshuhua)
-* rgw: add override in header files mostly (`pr#13586 <https://github.com/ceph/ceph/pull/13586>`_, liuchang0812)
-* rgw: add override in rgw subsystem (`issue#18922 <http://tracker.ceph.com/issues/18922>`_, `pr#13441 <https://github.com/ceph/ceph/pull/13441>`_, liuchang0812)
-* rgw: add pool namespace to cache's key so that system obj can have unique key (`issue#19372 <http://tracker.ceph.com/issues/19372>`_, `pr#14125 <https://github.com/ceph/ceph/pull/14125>`_, Zhang Shaowen)
-* rgw: add radosclient finisher to perf counter (`issue#19011 <http://tracker.ceph.com/issues/19011>`_, `pr#13535 <https://github.com/ceph/ceph/pull/13535>`_, lvshuhua)
-* rgw: add "rgw_verify_ssl" config (`pr#15301 <https://github.com/ceph/ceph/pull/15301>`_, Shasha Lu)
-* rgw: add 'state==SyncState::IncrementalSync' condition when add item … (`pr#14552 <https://github.com/ceph/ceph/pull/14552>`_, Shasha Lu)
-* rgw: add support container and object levels of swift bulkupload (`pr#14775 <https://github.com/ceph/ceph/pull/14775>`_, Jing Wenjun)
-* rgw: add support for delete marker expiration in s3 lifecycle (`issue#19730 <http://tracker.ceph.com/issues/19730>`_, `pr#14703 <https://github.com/ceph/ceph/pull/14703>`_, Zhang Shaowen)
-* rgw: add support for FormPost of Swift API (`issue#17273 <http://tracker.ceph.com/issues/17273>`_, `pr#11179 <https://github.com/ceph/ceph/pull/11179>`_, Radoslaw Zarzynski, Orit Wasserman)
-* rgw: add support for multipart upload expiration (`issue#19088 <http://tracker.ceph.com/issues/19088>`_, `pr#13622 <https://github.com/ceph/ceph/pull/13622>`_, Zhang Shaowen)
-* rgw: add support for noncurrentversion expiration in s3 lifecycle (`issue#18916 <http://tracker.ceph.com/issues/18916>`_, `pr#13385 <https://github.com/ceph/ceph/pull/13385>`_, Zhang Shaowen)
-* rgw: add support for Swift's TempURLs with prefix-based scope (`issue#20398 <http://tracker.ceph.com/issues/20398>`_, `pr#16370 <https://github.com/ceph/ceph/pull/16370>`_, Radoslaw Zarzynski)
-* rgw: add support for the BulkUpload of Swift API (`pr#12243 <https://github.com/ceph/ceph/pull/12243>`_, Radoslaw Zarzynski)
-* rgw: add the remove-x-delete feature to cancel swift object expiration (`issue#19074 <http://tracker.ceph.com/issues/19074>`_, `pr#13621 <https://github.com/ceph/ceph/pull/13621>`_, Jing Wenjun)
-* rgw: add the Vim's modeline into rgw_orphan.cc (`pr#15431 <https://github.com/ceph/ceph/pull/15431>`_, Radoslaw Zarzynski)
-* rgw: add variadic string join for s3 signature generation (`pr#15678 <https://github.com/ceph/ceph/pull/15678>`_, Casey Bodley)
-* rgw: Add --zonegroup-new-name  in usage (`pr#12084 <https://github.com/ceph/ceph/pull/12084>`_, Hans van den Bogert)
-* rgw: allow larger payload for period commit (`issue#19505 <http://tracker.ceph.com/issues/19505>`_, `pr#14355 <https://github.com/ceph/ceph/pull/14355>`_, Casey Bodley)
-* rgw: allow system users to read SLO parts (`issue#19027 <http://tracker.ceph.com/issues/19027>`_, `pr#13561 <https://github.com/ceph/ceph/pull/13561>`_, Casey Bodley)
-* rgw: auto reshard old buckets (`pr#15665 <https://github.com/ceph/ceph/pull/15665>`_, Orit Wasserman)
-* rgw: avoid listing user buckets for rgw_delete_user (`pr#13991 <https://github.com/ceph/ceph/pull/13991>`_, liuchang0812)
-* rgw: avoid using null pointer in rgw_file.cc (`pr#14474 <https://github.com/ceph/ceph/pull/14474>`_, lihongjie)
-* rgw: be aware abount tenants on cls_user_bucket -> rgw_bucket conversion (`issue#18364 <http://tracker.ceph.com/issues/18364>`_, `issue#16355 <http://tracker.ceph.com/issues/16355>`_, `pr#13220 <https://github.com/ceph/ceph/pull/13220>`_, Radoslaw Zarzynski)
-* rgw: bucket index check in radosgw-admin removes valid index (`issue#18470 <http://tracker.ceph.com/issues/18470>`_, `pr#12851 <https://github.com/ceph/ceph/pull/12851>`_, Zhang Shaowen)
-* rgw: bucket stats display bucket index type (`pr#14466 <https://github.com/ceph/ceph/pull/14466>`_, fang yuxiang)
-* rgw: change default chunk size to 4MB (`issue#18621 <http://tracker.ceph.com/issues/18621>`_, `issue#18622 <http://tracker.ceph.com/issues/18622>`_, `issue#18623 <http://tracker.ceph.com/issues/18623>`_, `pr#13035 <https://github.com/ceph/ceph/pull/13035>`_, Yehuda Sadeh)
-* rgw: change loglevel to 20 for 'System already converted' message (`issue#18919 <http://tracker.ceph.com/issues/18919>`_, `pr#13399 <https://github.com/ceph/ceph/pull/13399>`_, Vikhyat Umrao)
-* rgw: change loglevel to 5 in user's quota sync (`issue#18921 <http://tracker.ceph.com/issues/18921>`_, `pr#13408 <https://github.com/ceph/ceph/pull/13408>`_, Zhang Shaowen)
-* rgw: Changes for s3test config file, to add user under a tenant (`pr#15753 <https://github.com/ceph/ceph/pull/15753>`_, Pritha Srivastava)
-* rgw: check placement existence when create bucket (`pr#16385 <https://github.com/ceph/ceph/pull/16385>`_, Jiaying Ren)
-* rgw: check placement target existence during bucket creation (`pr#16384 <https://github.com/ceph/ceph/pull/16384>`_, Jiaying Ren)
-* rgw: civetweb don't go past the array index while calling mg_start (`issue#19749 <http://tracker.ceph.com/issues/19749>`_, `pr#14750 <https://github.com/ceph/ceph/pull/14750>`_, Abhishek Lekshmanan, Jesse Williamson)
-* rgw: clean redundant code (`pr#13302 <https://github.com/ceph/ceph/pull/13302>`_, Yankun Li)
-* rgw: clean unuse code in cls_statelog_check_state (`pr#10260 <https://github.com/ceph/ceph/pull/10260>`_, weiqiaomiao)
-* rgw: clean-up error mapping in Swift's authentication strategy (`pr#15756 <https://github.com/ceph/ceph/pull/15756>`_, Radoslaw Zarzynski)
-* rgw: cleanup: fix variable name in RGWRados::create_pool() declaration (`pr#14547 <https://github.com/ceph/ceph/pull/14547>`_, Nathan Cutler)
-* rgw: cleanup lc continuation (`pr#14906 <https://github.com/ceph/ceph/pull/14906>`_, Jiaying Ren)
-* rgw: cleanup lifecycle managament (`pr#13820 <https://github.com/ceph/ceph/pull/13820>`_, Jiaying Ren)
-* rgw: cleanup rgw-admin duplicated judge during OLH GET/READLOG (`pr#15700 <https://github.com/ceph/ceph/pull/15700>`_, Jiaying Ren)
-* rgw: clean up the redundant assignment in last_entry_in_listing (`pr#13387 <https://github.com/ceph/ceph/pull/13387>`_, Jing Wenjun)
-* rgw: clean up the unneeded rgw::io::ChunkingFilter::has_content_length (`pr#13504 <https://github.com/ceph/ceph/pull/13504>`_, Radoslaw Zarzynski)
-* rgw: cleanup unused codes in rgw_admin.cc (`pr#15771 <https://github.com/ceph/ceph/pull/15771>`_, fang yuxiang)
-* rgw: cleanup unused var in rgw/rgw_rest_s3.cc (`pr#13434 <https://github.com/ceph/ceph/pull/13434>`_, Jiaying Ren)
-* rgw: clear master_zonegroup when reseting RGWPeriodMap (`issue#17239 <http://tracker.ceph.com/issues/17239>`_, `pr#12658 <https://github.com/ceph/ceph/pull/12658>`_, Orit Wasserman)
-* rgw: clear old zone short ids on period update (`issue#15618 <http://tracker.ceph.com/issues/15618>`_, `pr#13949 <https://github.com/ceph/ceph/pull/13949>`_, Casey Bodley)
-* rgw: cls: ceph::timespan tag_timeout wrong units (`issue#20380 <http://tracker.ceph.com/issues/20380>`_, `pr#16026 <https://github.com/ceph/ceph/pull/16026>`_, Matt Benjamin)
-* rgw: cls/rgw: Clean up the "magic string" usage in the cls layer for RGW (`pr#12536 <https://github.com/ceph/ceph/pull/12536>`_, Ira Cooper)
-* rgw: cls/rgw: list_plain_entries() stops before bi_log entries (`issue#19876 <http://tracker.ceph.com/issues/19876>`_, `pr#14981 <https://github.com/ceph/ceph/pull/14981>`_, Casey Bodley)
-* rgw: cls/user: cls_user_bucket backward compatibility (`issue#19367 <http://tracker.ceph.com/issues/19367>`_, `pr#14128 <https://github.com/ceph/ceph/pull/14128>`_, Yehuda Sadeh)
-* rgw: cls_user don't clobber existing bucket stats when creating bucket (`issue#16357 <http://tracker.ceph.com/issues/16357>`_, `pr#10121 <https://github.com/ceph/ceph/pull/10121>`_, Abhishek Lekshmanan)
-* rgw: complete versioning enablement after sending it to meta master (`issue#18003 <http://tracker.ceph.com/issues/18003>`_, `pr#12444 <https://github.com/ceph/ceph/pull/12444>`_, Orit Wasserman)
-* rgw: Compress crash bug refactor (`issue#20098 <http://tracker.ceph.com/issues/20098>`_, `pr#15569 <https://github.com/ceph/ceph/pull/15569>`_, Adam Kupczyk)
-* rgw: continuation of the auth rework -- AWSv4 (`issue#18800 <http://tracker.ceph.com/issues/18800>`_, `pr#14885 <https://github.com/ceph/ceph/pull/14885>`_, Radoslaw Zarzynski, Javier M. Mellid)
-* rgw: continuation of the auth rework (`pr#12893 <https://github.com/ceph/ceph/pull/12893>`_, Radoslaw Zarzynski, Matt Benjamin)
-* rgw: Correcting the condition in ceph_assert while parsing an AWS Principal (`pr#15997 <https://github.com/ceph/ceph/pull/15997>`_, Pritha Srivastava)
-* rgw: correct the debug info when unlink instance failed (`pr#13761 <https://github.com/ceph/ceph/pull/13761>`_, Zhang Shaowen)
-* rgw: Correct the return codes for the health check feature (`issue#19025 <http://tracker.ceph.com/issues/19025>`_, `pr#13557 <https://github.com/ceph/ceph/pull/13557>`_, Pavan Rallabhandi)
-* rgw: custom user data header (`issue#19644 <http://tracker.ceph.com/issues/19644>`_, `pr#14592 <https://github.com/ceph/ceph/pull/14592>`_, Pavan Rallabhandi)
-* rgw: datalog trim and mdlog trim handles the result returned by osd incorrectly (`issue#20190 <http://tracker.ceph.com/issues/20190>`_, `pr#15507 <https://github.com/ceph/ceph/pull/15507>`_, Zhang Shaowen)
-* rgw: data sync includes instance in rgw_obj_index_key (`pr#13948 <https://github.com/ceph/ceph/pull/13948>`_, Casey Bodley)
-* rgw: deduplicate variants of rgw_make_bucket_entry_name() (`pr#14299 <https://github.com/ceph/ceph/pull/14299>`_, Radoslaw Zarzynski)
-* rgw: delete non-empty buckets in slave zonegroup works not well (`issue#19313 <http://tracker.ceph.com/issues/19313>`_, `pr#14043 <https://github.com/ceph/ceph/pull/14043>`_, Zhang Shaowen)
-* rgw: delete object in error path (`issue#20620 <http://tracker.ceph.com/issues/20620>`_, `pr#16324 <https://github.com/ceph/ceph/pull/16324>`_, Yehuda Sadeh)
-* rgw: disable dynamic reshading for 1st L point release (`pr#16969 <https://github.com/ceph/ceph/pull/16969>`_, Matt Benjamin)
-* rgw: display more info when using  radosgw-admin bucket stats (`pr#15256 <https://github.com/ceph/ceph/pull/15256>`_, fang.yuxiang)
-* rgw: Do not decrement stats cache when the cache values are zero (`issue#20661 <http://tracker.ceph.com/issues/20661>`_, `pr#16389 <https://github.com/ceph/ceph/pull/16389>`_, Pavan Rallabhandi)
-* rgw: Do not fetch bucket stats by default upon bucket listing (`issue#20377 <http://tracker.ceph.com/issues/20377>`_, `pr#15834 <https://github.com/ceph/ceph/pull/15834>`_, Pavan Rallabhandi)
-* rgw: do not log debug output at level 0 (`pr#15633 <https://github.com/ceph/ceph/pull/15633>`_, Jens Rosenboom)
-* rgw: don't do unneccesary write if buffer with zero length (`pr#14925 <https://github.com/ceph/ceph/pull/14925>`_, fang yuxiang)
-* rgw: don't init rgw_obj from rgw_obj_key when it's incorrect to do so (`issue#19096 <http://tracker.ceph.com/issues/19096>`_, `pr#13676 <https://github.com/ceph/ceph/pull/13676>`_, Yehuda Sadeh)
-* rgw: don't log the env_map twice (`pr#13481 <https://github.com/ceph/ceph/pull/13481>`_, Abhishek Lekshmanan)
-* rgw: don't read all user input for a few param requests (`pr#13815 <https://github.com/ceph/ceph/pull/13815>`_, Abhishek Lekshmanan)
-* rgw: don't return skew time error in pre-signed url (`issue#18828 <http://tracker.ceph.com/issues/18828>`_, `pr#13354 <https://github.com/ceph/ceph/pull/13354>`_, liuchang0812)
-* rgw: dont spawn error_repo until lease is acquired (`issue#19446 <http://tracker.ceph.com/issues/19446>`_, `pr#14714 <https://github.com/ceph/ceph/pull/14714>`_, Casey Bodley)
-* rgw: don't specify a length when converting bl -> string (`issue#20037 <http://tracker.ceph.com/issues/20037>`_, `pr#15599 <https://github.com/ceph/ceph/pull/15599>`_, Abhishek Lekshmanan)
-* rgw: don't use strlen in constexprs to not brake Clang builds (`pr#15688 <https://github.com/ceph/ceph/pull/15688>`_, Radoslaw Zarzynski)
-* rgw: drop asio/{yield,coroutine}.hpp replacements (`pr#15413 <https://github.com/ceph/ceph/pull/15413>`_, Kefu Chai)
-* rgw: Drop dump_usage_bucket_info() to silence warning from -Wunused-function (`pr#16497 <https://github.com/ceph/ceph/pull/16497>`_, Wei Qiaomiao)
-* rgw: drop unused find_replacement() and some function docs (`pr#16386 <https://github.com/ceph/ceph/pull/16386>`_, Jiaying Ren)
-* rgw: drop unused function RGWRemoteDataLog::get_shard_info() (`pr#16236 <https://github.com/ceph/ceph/pull/16236>`_, Shasha Lu)
-* rgw: drop unused param "bucket" from select_bucket_placement (`pr#14390 <https://github.com/ceph/ceph/pull/14390>`_, Shasha Lu)
-* rgw: drop unused port var (`pr#14412 <https://github.com/ceph/ceph/pull/14412>`_, Jiaying Ren)
-* rgw: drop unused rgw_pool parameter, local variables and member variable (`pr#16154 <https://github.com/ceph/ceph/pull/16154>`_, Jiaying Ren)
-* rgw: drop unused var header_ended (`pr#15686 <https://github.com/ceph/ceph/pull/15686>`_, Jiaying Ren)
-* rgw: drop using std ns in header files and other cleanups (`pr#15137 <https://github.com/ceph/ceph/pull/15137>`_, Abhishek Lekshmanan)
-* rgw: dynamic resharding (`pr#15493 <https://github.com/ceph/ceph/pull/15493>`_, Yehuda Sadeh, Orit Wasserman)
-* rgw: enable to update acl of bucket created in slave zonegroup (`issue#16888 <http://tracker.ceph.com/issues/16888>`_, `pr#14082 <https://github.com/ceph/ceph/pull/14082>`_, Guo Zhandong)
-* rgw: error_code in error log is not right when data sync fails (`issue#18437 <http://tracker.ceph.com/issues/18437>`_, `pr#12810 <https://github.com/ceph/ceph/pull/12810>`_, Zhang Shaowen)
-* rgw: error more verbosely in RGWRados::create_pool (`pr#14642 <https://github.com/ceph/ceph/pull/14642>`_, Matt Benjamin)
-* rgw: external auth engines of S3 honor rgw_keystone_implicit_tenants (`issue#17779 <http://tracker.ceph.com/issues/17779>`_, `pr#15572 <https://github.com/ceph/ceph/pull/15572>`_, Radoslaw Zarzynski)
-* rgw: Fix a bug that multipart upload may exceed the quota (`issue#19602 <http://tracker.ceph.com/issues/19602>`_, `pr#12010 <https://github.com/ceph/ceph/pull/12010>`_, Zhang Shaowen)
-* rgw: fix asctime when logging in rgw_lc (`pr#16422 <https://github.com/ceph/ceph/pull/16422>`_, Abhishek Lekshmanan)
-* rgw: fix break inside of yield in RGWFetchAllMetaCR (`issue#17655 <http://tracker.ceph.com/issues/17655>`_, `pr#11586 <https://github.com/ceph/ceph/pull/11586>`_, Casey Bodley)
-* rgw: fix broken /crossdomain.xml, /info and /healthcheck of Swift API (`issue#19520 <http://tracker.ceph.com/issues/19520>`_, `pr#14373 <https://github.com/ceph/ceph/pull/14373>`_, Radoslaw Zarzynski)
-* rgw: fix build of conflict after auth rework (`pr#14203 <https://github.com/ceph/ceph/pull/14203>`_, Casey Bodley)
-* rgw: fix configurable write obj window size (`pr#13934 <https://github.com/ceph/ceph/pull/13934>`_, hechuang)
-* rgw: fix constexpr for string_size in clang (`pr#15738 <https://github.com/ceph/ceph/pull/15738>`_, Adam C. Emerson, Casey Bodley)
-* rgw: fix disabling Swift's object versioning through empty X-Versions-Location (`issue#18852 <http://tracker.ceph.com/issues/18852>`_, `pr#13303 <https://github.com/ceph/ceph/pull/13303>`_, Jing Wenjun)
-* rgw: Fix duplicate tag removal during GC (`issue#20107 <http://tracker.ceph.com/issues/20107>`_, `pr#15912 <https://github.com/ceph/ceph/pull/15912>`_, Jens Rosenboom)
-* rgw: fix error code of inexistence of versions location in swift api (`issue#18880 <http://tracker.ceph.com/issues/18880>`_, `pr#13350 <https://github.com/ceph/ceph/pull/13350>`_, Jing Wenjun)
-* rgw: fix error handling in get_params() of RGWPostObj_ObjStore_S3 (`pr#15670 <https://github.com/ceph/ceph/pull/15670>`_, Radoslaw Zarzynski)
-* rgw: fix error handling in the link() method of RGWBucket (`issue#20279 <http://tracker.ceph.com/issues/20279>`_, `pr#15669 <https://github.com/ceph/ceph/pull/15669>`_, Radoslaw Zarzynski)
-* rgw: fix error message in removing bucket with --bypass-gc flag (`issue#20688 <http://tracker.ceph.com/issues/20688>`_, `pr#16419 <https://github.com/ceph/ceph/pull/16419>`_, Abhishek Varshney)
-* rgw: fix err when copy object in bucket with specified placement rule (`issue#20378 <http://tracker.ceph.com/issues/20378>`_, `pr#15837 <https://github.com/ceph/ceph/pull/15837>`_, fang yuxiang)
-* rgw: fixes for AWSBrowserUploadAbstractor auth (`issue#20372 <http://tracker.ceph.com/issues/20372>`_, `pr#15882 <https://github.com/ceph/ceph/pull/15882>`_, Radoslaw Zarzynski, Casey Bodley)
-* rgw:Fixes typo in rgw_admin.cc (`issue#19026 <http://tracker.ceph.com/issues/19026>`_, `pr#13576 <https://github.com/ceph/ceph/pull/13576>`_, Ronak Jain)
-* rgw: fix for broken yields in RGWMetaSyncShardCR (`issue#18076 <http://tracker.ceph.com/issues/18076>`_, `pr#12223 <https://github.com/ceph/ceph/pull/12223>`_, Casey Bodley)
-* rgw: fix for EINVAL errors on forwarded bucket put_acl requests (`pr#14376 <https://github.com/ceph/ceph/pull/14376>`_, Casey Bodley)
-* rgw: fix for null version_id in fetch_remote_obj() (`pr#14375 <https://github.com/ceph/ceph/pull/14375>`_, Casey Bodley)
-* rgw: Fix for Policy Parse exception in case of multiple statements (`pr#16689 <https://github.com/ceph/ceph/pull/16689>`_, Pritha Srivastava)
-* rgw: fix forward request for bulkupload to be applied in multisite (`issue#19645 <http://tracker.ceph.com/issues/19645>`_, `pr#14601 <https://github.com/ceph/ceph/pull/14601>`_, Jing Wenjun)
-* rgw: fix 'gc list --include-all' command infinite loop the first items (`issue#19978 <http://tracker.ceph.com/issues/19978>`_, `pr#12774 <https://github.com/ceph/ceph/pull/12774>`_, Shasha Lu, fang yuxiang)
-* rgw: fix get bucket policy s3 compatible issue (`pr#15280 <https://github.com/ceph/ceph/pull/15280>`_, Enming Zhang)
-* rgw: fix handling of --remote in radosgw-admin period commands (`issue#19554 <http://tracker.ceph.com/issues/19554>`_, `pr#14407 <https://github.com/ceph/ceph/pull/14407>`_, Casey Bodley)
-* rgw: fix handling RGWUserInfo::system in RGWHandler_REST_SWIFT (`issue#18476 <http://tracker.ceph.com/issues/18476>`_, `pr#12865 <https://github.com/ceph/ceph/pull/12865>`_, Radoslaw Zarzynski)
-* rgw: fix infinite loop in rest api for log list (`issue#20386 <http://tracker.ceph.com/issues/20386>`_, `pr#15983 <https://github.com/ceph/ceph/pull/15983>`_, xierui, Casey Bodley)
-* rgw: fix init_bucket_for_sync retcode (`pr#13684 <https://github.com/ceph/ceph/pull/13684>`_, Shasha Lu)
-* rgw: fix lc list failure when shards not be all created (`issue#19898 <http://tracker.ceph.com/issues/19898>`_, `pr#15025 <https://github.com/ceph/ceph/pull/15025>`_, Jiaying Ren)
-* rgw: fix leaks with incomplete multiparts (`issue#17164 <http://tracker.ceph.com/issues/17164>`_, `pr#15630 <https://github.com/ceph/ceph/pull/15630>`_, Abhishek Varshney)
-* rgw: fix marker encoding problem (`issue#20463 <http://tracker.ceph.com/issues/20463>`_, `pr#15998 <https://github.com/ceph/ceph/pull/15998>`_, Marcus Watts)
-* rgw: fix memory leak in copy_obj_to_remote_dest (`pr#9974 <https://github.com/ceph/ceph/pull/9974>`_, weiqiaomiao)
-* rgw: fix memory leak in delete_obj_aio (`pr#13998 <https://github.com/ceph/ceph/pull/13998>`_, wangzhengyong)
-* rgw: fix memory leak in RGWGetObjLayout (`pr#14014 <https://github.com/ceph/ceph/pull/14014>`_, liuchang0812)
-* rgw: fix memory leaks during Swift Static Website's error handling (`issue#20757 <http://tracker.ceph.com/issues/20757>`_, `pr#16531 <https://github.com/ceph/ceph/pull/16531>`_, Radoslaw Zarzynski)
-* rgw: fix not initialized vars which cause rgw crash with ec data pool (`issue#20542 <http://tracker.ceph.com/issues/20542>`_, `pr#16177 <https://github.com/ceph/ceph/pull/16177>`_, Aleksei Gutikov)
-* rgw: fix off-by-one in RGWDataChangesLog::get_info (`issue#18488 <http://tracker.ceph.com/issues/18488>`_, `pr#12884 <https://github.com/ceph/ceph/pull/12884>`_, Casey Bodley)
-* rgw: fix parse/eval of policy conditions with IfExists (`issue#20708 <http://tracker.ceph.com/issues/20708>`_, `pr#16463 <https://github.com/ceph/ceph/pull/16463>`_, Casey Bodley)
-* rgw: fix period update crash (`issue#18631 <http://tracker.ceph.com/issues/18631>`_, `pr#13054 <https://github.com/ceph/ceph/pull/13054>`_, Orit Wasserman)
-* rgw: fix potential null pointer dereference in rgw_admin (`pr#15667 <https://github.com/ceph/ceph/pull/15667>`_, Radoslaw Zarzynski)
-* rgw: fix radosgw-admin data sync run crash (`issue#20423 <http://tracker.ceph.com/issues/20423>`_, `pr#15938 <https://github.com/ceph/ceph/pull/15938>`_, Shasha Lu)
-* rgw: fix radosgw-admin retcode (`pr#15257 <https://github.com/ceph/ceph/pull/15257>`_, Shasha Lu)
-* rgw: fix RadosGW hang during multi-chunk upload of AWSv4 (`issue#19754 <http://tracker.ceph.com/issues/19754>`_, `pr#14770 <https://github.com/ceph/ceph/pull/14770>`_, Radoslaw Zarzynski)
-* rgw: fix radosgw will crash when service is restarted during lifecycl… (`issue#20756 <http://tracker.ceph.com/issues/20756>`_, `pr#16495 <https://github.com/ceph/ceph/pull/16495>`_, Wei Qiaomiao)
-* rgw: fix response header of Swift API (`issue#19443 <http://tracker.ceph.com/issues/19443>`_, `pr#14280 <https://github.com/ceph/ceph/pull/14280>`_, tone-zhang)
-* rgw: fix rest client's order of args in get_v2_signature (`pr#15731 <https://github.com/ceph/ceph/pull/15731>`_, Casey Bodley)
-* rgw: fix rgw bucket policy IfExists position (`issue#20248 <http://tracker.ceph.com/issues/20248>`_, `pr#15607 <https://github.com/ceph/ceph/pull/15607>`_, yuliyang)
-* rgw: fix rgw hang when do RGWRealmReloader::reload after go SIGHUP (`issue#20686 <http://tracker.ceph.com/issues/20686>`_, `pr#16417 <https://github.com/ceph/ceph/pull/16417>`_, fang.yuxiang)
-* rgw: fix RGWPutBucketPolicy error when set BucketPolicy again without delete pre set Policy (`issue#20252 <http://tracker.ceph.com/issues/20252>`_, `pr#15617 <https://github.com/ceph/ceph/pull/15617>`_, yuliyang)
-* rgw: fix s3 object uploads with chunked transfers and v4 signatures (`issue#20447 <http://tracker.ceph.com/issues/20447>`_, `pr#15965 <https://github.com/ceph/ceph/pull/15965>`_, Marcus Watts)
-* rgw: fix segfault in RevokeThread during its shutdown procedure (`issue#19831 <http://tracker.ceph.com/issues/19831>`_, `pr#15033 <https://github.com/ceph/ceph/pull/15033>`_, Radoslaw Zarzynski)
-* rgw: fix slave zonegroup cannot enable the bucket versioning (`issue#18003 <http://tracker.ceph.com/issues/18003>`_, `pr#12175 <https://github.com/ceph/ceph/pull/12175>`_, lvshuhua)
-* rgw: fix SLO/DLO range requests (`pr#15060 <https://github.com/ceph/ceph/pull/15060>`_, Shasha Lu)
-    rgw: fix swift cannot disable object versioning
-* rgw: fix swift default auth error after auth strategy refactoring (`pr#15711 <https://github.com/ceph/ceph/pull/15711>`_, Casey Bodley)
-* rgw: fix test_multi.py default config file path (`pr#15306 <https://github.com/ceph/ceph/pull/15306>`_, Jiaying Ren)
-* rgw: fix the bug that part's index can't be removed after completing multipart upload (`issue#19604 <http://tracker.ceph.com/issues/19604>`_, `pr#14500 <https://github.com/ceph/ceph/pull/14500>`_, Zhang Shaowen)
-* rgw: fix the signature mismatch of FormPost in swift API (`issue#20220 <http://tracker.ceph.com/issues/20220>`_, `pr#15564 <https://github.com/ceph/ceph/pull/15564>`_, Jing Wenjun)
-* rgw: fix the UTF8 check on bucket entry name in rgw_log_op() (`issue#20779 <http://tracker.ceph.com/issues/20779>`_, `pr#16604 <https://github.com/ceph/ceph/pull/16604>`_, Radoslaw Zarzynski)
-* rgw: fix transition from full to incremental meta sync (`pr#13920 <https://github.com/ceph/ceph/pull/13920>`_, Casey Bodley)
-* rgw: fix typo in comment (`pr#13578 <https://github.com/ceph/ceph/pull/13578>`_, liuchang0812)
-* rgw: fix uninitialized fields (`pr#14120 <https://github.com/ceph/ceph/pull/14120>`_, wangzhengyong)
-* rgw: fix upgrate from hammer when zone doesn't have zoneparams (`issue#19231 <http://tracker.ceph.com/issues/19231>`_, `pr#13900 <https://github.com/ceph/ceph/pull/13900>`_, Orit Wasserman)
-* rgw: Fix up to 1000 entries at a time in check_bad_index_multipart (`issue#20772 <http://tracker.ceph.com/issues/20772>`_, `pr#16692 <https://github.com/ceph/ceph/pull/16692>`_, Orit Wasserman)
-* rgw: fix use of marker in List::list_objects() (`issue#18331 <http://tracker.ceph.com/issues/18331>`_, `pr#13147 <https://github.com/ceph/ceph/pull/13147>`_, Yehuda Sadeh)
-* rgw: fix versioned bucket data sync fail when upload is busy (`issue#18208 <http://tracker.ceph.com/issues/18208>`_, `pr#12357 <https://github.com/ceph/ceph/pull/12357>`_, lvshuhua)
-* rgw: fix wrong error code for expired Swift TempURL's links (`issue#20384 <http://tracker.ceph.com/issues/20384>`_, `pr#15850 <https://github.com/ceph/ceph/pull/15850>`_, Radoslaw Zarzynski)
-* rgw: fix X-Object-Meta-Static-Large-Object in SLO download (`issue#19951 <http://tracker.ceph.com/issues/19951>`_, `pr#15045 <https://github.com/ceph/ceph/pull/15045>`_, Shasha Lu)
-* rgw: fix zone did't update realm_id when added to zonegroup (`issue#17995 <http://tracker.ceph.com/issues/17995>`_, `pr#12139 <https://github.com/ceph/ceph/pull/12139>`_, Tianshan Qu)
-* rgw: forward RGWPutBucketPolicy to meta master (`issue#20297 <http://tracker.ceph.com/issues/20297>`_, `pr#15736 <https://github.com/ceph/ceph/pull/15736>`_, Casey Bodley)
-* rgw: get torrent request's parameter is not the same as amazon s3 (`issue#19136 <http://tracker.ceph.com/issues/19136>`_, `pr#13760 <https://github.com/ceph/ceph/pull/13760>`_, Zhang Shaowen)
-* rgw: get wrong content when download object with specific range with compression (`issue#20100 <http://tracker.ceph.com/issues/20100>`_, `pr#15323 <https://github.com/ceph/ceph/pull/15323>`_, fang yuxiang)
-* rgw: handle error return value in build_linked_oids_index (`pr#13955 <https://github.com/ceph/ceph/pull/13955>`_, wangzhengyong)
-* rgw: http_client clarify the debug msg function call (`pr#13688 <https://github.com/ceph/ceph/pull/13688>`_, Abhishek Lekshmanan)
-* rgw: if user.email is empty, dont try to delete (`issue#18980 <http://tracker.ceph.com/issues/18980>`_, `pr#13783 <https://github.com/ceph/ceph/pull/13783>`_, Casey Bodley)
-* rgw: implement get/put object tags for S3 (`pr#13753 <https://github.com/ceph/ceph/pull/13753>`_, Abhishek Lekshmanan)
-* rgw: improve handling of illformed Swift's container ACLs (`issue#18796 <http://tracker.ceph.com/issues/18796>`_, `pr#13248 <https://github.com/ceph/ceph/pull/13248>`_, Radoslaw Zarzynski)
-* rgw: /info claims we do support Swift's accounts ACLs (`issue#20394 <http://tracker.ceph.com/issues/20394>`_, `pr#15887 <https://github.com/ceph/ceph/pull/15887>`_, Radoslaw Zarzynski)
-* rgw: initialize non-static class members in ESQueryCompiler (`pr#15884 <https://github.com/ceph/ceph/pull/15884>`_, Jos Collin)
-* rgw: initialize Non-static class member val in ESQueryNodeLeafVal_Int (`pr#15888 <https://github.com/ceph/ceph/pull/15888>`_, Jos Collin)
-* rgw: initialize Non-static class member worker in RGWReshard (`pr#15886 <https://github.com/ceph/ceph/pull/15886>`_, Jos Collin)
-* rgw: Initialize of member variable admin_specified in RGWUserAdminOpState (`pr#16847 <https://github.com/ceph/ceph/pull/16847>`_, amitkuma)
-* rgw: Initialize pointer fields (`pr#16021 <https://github.com/ceph/ceph/pull/16021>`_, Jos Collin)
-* rgw: LCWorker's worktime is not the same as config rgw_lifecycle_work_time (`issue#18087 <http://tracker.ceph.com/issues/18087>`_, `pr#11963 <https://github.com/ceph/ceph/pull/11963>`_, Zhang Shaowen)
-* rgw: ldap: simple_bind() should set ldap version option on tldap (`pr#12616 <https://github.com/ceph/ceph/pull/12616>`_, Weibing Zhang)
-* rgw: lease_stack: use reset method instead of assignment (`pr#16185 <https://github.com/ceph/ceph/pull/16185>`_, Nathan Cutler)
-* rgw: Let the object stat command be shown in the usage (`issue#19013 <http://tracker.ceph.com/issues/19013>`_, `pr#13291 <https://github.com/ceph/ceph/pull/13291>`_, Pavan Rallabhandi)
-* rgw: librgw shut (`issue#18585 <http://tracker.ceph.com/issues/18585>`_, `pr#12972 <https://github.com/ceph/ceph/pull/12972>`_, Matt Benjamin)
-* rgw: lifecycle thread shouldn't process the bucket which has been deleted (`issue#20285 <http://tracker.ceph.com/issues/20285>`_, `pr#15677 <https://github.com/ceph/ceph/pull/15677>`_, Zhang Shaowen)
-* rgw: lock is not released when set sync marker is failed (`issue#18077 <http://tracker.ceph.com/issues/18077>`_, `pr#12197 <https://github.com/ceph/ceph/pull/12197>`_, Zhang Shaowen)
-* rgw: log_meta only for more than one zone (`issue#20357 <http://tracker.ceph.com/issues/20357>`_, `pr#15777 <https://github.com/ceph/ceph/pull/15777>`_, Orit Wasserman, Leo Zhang)
-* rgw: lower some log's level in gc process (`pr#15426 <https://github.com/ceph/ceph/pull/15426>`_, Zhang Shaowen)
-* rgw: luminous: rgw: Fix rgw not responding occasionally when receiving SIGHUP signal (`issue#20962 <http://tracker.ceph.com/issues/20962>`_, `pr#17113 <https://github.com/ceph/ceph/pull/17113>`_, Yao Zongyou)
-* rgw: luminous: RGW: Get Bucket ACL does not honor the s3:GetBucketACL action (`issue#21013 <http://tracker.ceph.com/issues/21013>`_, `issue#21056 <http://tracker.ceph.com/issues/21056>`_, `pr#17117 <https://github.com/ceph/ceph/pull/17117>`_, Abhishek Lekshmanan)
-* rgw: luminous: rgw: GetObject Tagging needs to exit earlier if the object has no attributes (`issue#21054 <http://tracker.ceph.com/issues/21054>`_, `issue#21010 <http://tracker.ceph.com/issues/21010>`_, `pr#17118 <https://github.com/ceph/ceph/pull/17118>`_, Abhishek Lekshmanan)
-* rgw: luminous: rgw_lc: support for AWSv4 authentication (`pr#16914 <https://github.com/ceph/ceph/pull/16914>`_, Abhishek Lekshmanan)
-* rgw: luminous: rgw: S3 v4 auth fails when query string contains (`issue#21000 <http://tracker.ceph.com/issues/21000>`_, `issue#21003 <http://tracker.ceph.com/issues/21003>`_, `issue#20501 <http://tracker.ceph.com/issues/20501>`_, `issue#21043 <http://tracker.ceph.com/issues/21043>`_, `pr#17114 <https://github.com/ceph/ceph/pull/17114>`_, Zhang Shaowen, Marcus Watts)
-* rgw: luminous: rgw: Use namespace for lc_pool and roles_pool (`issue#20177 <http://tracker.ceph.com/issues/20177>`_, `issue#20967 <http://tracker.ceph.com/issues/20967>`_, `pr#16943 <https://github.com/ceph/ceph/pull/16943>`_, Orit Wasserman)
-* rgw: make RGWEnv return a const ref. to its map (`pr#15269 <https://github.com/ceph/ceph/pull/15269>`_, Abhishek Lekshmanan)
-* rgw: make sending Content-Length in 204 and 304 responses controllable (`issue#16602 <http://tracker.ceph.com/issues/16602>`_, `pr#10156 <https://github.com/ceph/ceph/pull/10156>`_, Radoslaw Zarzynski)
-* rgw: make sync thread name clear (`issue#18860 <http://tracker.ceph.com/issues/18860>`_, `pr#13324 <https://github.com/ceph/ceph/pull/13324>`_, lvshuhua)
-* rgw: match wildcards in StringLike policy conditions (`issue#20308 <http://tracker.ceph.com/issues/20308>`_, `pr#16491 <https://github.com/ceph/ceph/pull/16491>`_, Casey Bodley)
-* rgw: metadata search part 2 (`pr#14351 <https://github.com/ceph/ceph/pull/14351>`_, Yehuda Sadeh)
-* rgw: meta sync thread crash at RGWMetaSyncShardCR (`issue#20251 <http://tracker.ceph.com/issues/20251>`_, `pr#15660 <https://github.com/ceph/ceph/pull/15660>`_, fang.yuxiang)
-* rgw: migrate atomic_t to std::atomic<> (ebirah) (`pr#14839 <https://github.com/ceph/ceph/pull/14839>`_, Jesse Williamson)
-* rgw: migrate atomic_t to std::atomic<> (`pr#15001 <https://github.com/ceph/ceph/pull/15001>`_, Jesse Williamson)
-* rgw: modify email to empty by admin RESTful api doesn't work (`pr#16309 <https://github.com/ceph/ceph/pull/16309>`_, fang.yuxiang)
-* rgw: move the S3 anonymous auth handling to a dedicated engine (`pr#16485 <https://github.com/ceph/ceph/pull/16485>`_, Radoslaw Zarzynski)
-* rgw: multipart copy-part remove '/' for s3 java sdk request header (`issue#20075 <http://tracker.ceph.com/issues/20075>`_, `pr#15283 <https://github.com/ceph/ceph/pull/15283>`_, root)
-* rgw: multisite enabled over multiple clusters (`pr#12535 <https://github.com/ceph/ceph/pull/12535>`_, Ali Maredia)
-* rgw: multisite: fixes for zonegroup redirect (`issue#19488 <http://tracker.ceph.com/issues/19488>`_, `pr#14319 <https://github.com/ceph/ceph/pull/14319>`_, Casey Bodley)
-* rgw:multisite: fix RGWRadosRemoveOmapKeysCR and change cn to intrusive_ptr (`issue#20539 <http://tracker.ceph.com/issues/20539>`_, `pr#16197 <https://github.com/ceph/ceph/pull/16197>`_, Shasha Lu)
-* rgw: never let http_redirect_code of RGWRedirectInfo to stay uninitialized (`issue#20774 <http://tracker.ceph.com/issues/20774>`_, `pr#16601 <https://github.com/ceph/ceph/pull/16601>`_, Radoslaw Zarzynski)
-* rgw: omit X-Account-Access-Control if there is no grant to serialize (`issue#20395 <http://tracker.ceph.com/issues/20395>`_, `pr#15883 <https://github.com/ceph/ceph/pull/15883>`_, Radoslaw Zarzynski)
-* rgw: only log metadata on metadata master zone (`issue#20244 <http://tracker.ceph.com/issues/20244>`_, `pr#15613 <https://github.com/ceph/ceph/pull/15613>`_, Casey Bodley)
-* rgw: optimize data sync. Add zones_trace in log to avoid needless sync (`issue#19219 <http://tracker.ceph.com/issues/19219>`_, `pr#13851 <https://github.com/ceph/ceph/pull/13851>`_, Zhang Shaowen)
-* rgw: optimize generating torrent file. Object data won't stay in memory  now (`pr#15153 <https://github.com/ceph/ceph/pull/15153>`_, Zhang Shaowen)
-* rgw: orphan: fix error messages (`pr#12782 <https://github.com/ceph/ceph/pull/12782>`_, Weibing Zhang)
-* rgw: pass authentication domain to civetweb (`issue#17657 <http://tracker.ceph.com/issues/17657>`_, `pr#12861 <https://github.com/ceph/ceph/pull/12861>`_, Abhishek Lekshmanan)
-* rgw: polymorphic error codes (`pr#10690 <https://github.com/ceph/ceph/pull/10690>`_, Pritha Srivastava, Marcus Watts)
-* rgw: print is_admin as int instead of __u8 (`pr#12264 <https://github.com/ceph/ceph/pull/12264>`_, Casey Bodley)
-* rgw: put object's acl can't work well on the latest object (`issue#18649 <http://tracker.ceph.com/issues/18649>`_, `pr#13078 <https://github.com/ceph/ceph/pull/13078>`_, Zhang Shaowen)
-* rgw: radosgw-admin: use zone id when creating a zone (`issue#19498 <http://tracker.ceph.com/issues/19498>`_, `pr#14340 <https://github.com/ceph/ceph/pull/14340>`_, Orit Wasserman)
-* rgw: radosgw-admin: warn that 'realm rename' does not update other clusters (`issue#19746 <http://tracker.ceph.com/issues/19746>`_, `pr#14722 <https://github.com/ceph/ceph/pull/14722>`_, Casey Bodley)
-* rgw: radosgw, crypto: simplified code in handle_data functions (`pr#15598 <https://github.com/ceph/ceph/pull/15598>`_, Adam Kupczyk)
-* rgw: radosgw: fix compilation with cryptopp (`pr#15960 <https://github.com/ceph/ceph/pull/15960>`_, Adam Kupczyk)
-* rgw: raise debug level of meta sync logging (`pr#15524 <https://github.com/ceph/ceph/pull/15524>`_, Casey Bodley)
-* rgw: raise debug level of RGWPostObj_ObjStore_S3::get_policy (`pr#16203 <https://github.com/ceph/ceph/pull/16203>`_, Shasha Lu)
-* rgw: reject request if decoded URI contains \0 in the middle (`issue#20418 <http://tracker.ceph.com/issues/20418>`_, `pr#15953 <https://github.com/ceph/ceph/pull/15953>`_, Radoslaw Zarzynski)
-* rgw: remove a redundant judgement in rgw_rados.cc:delete_obj (`pr#11124 <https://github.com/ceph/ceph/pull/11124>`_, Zhang Shaowen)
-* rgw: Removed Unwanted headers (`pr#14183 <https://github.com/ceph/ceph/pull/14183>`_, Jos Collin)
-* rgw: remove duplicate flush formatter (`pr#12437 <https://github.com/ceph/ceph/pull/12437>`_, Guo Zhandong)
-* rgw: remove extra RGWMPObj in rgw_multi.h (`pr#14619 <https://github.com/ceph/ceph/pull/14619>`_, Casey Bodley)
-* rgw: remove fastcgi from default rgw frontends (`pr#15098 <https://github.com/ceph/ceph/pull/15098>`_, Casey Bodley)
-* rgw: remove invalid read size4 (`issue#18071 <http://tracker.ceph.com/issues/18071>`_, `pr#12767 <https://github.com/ceph/ceph/pull/12767>`_, Matt Benjamin)
-    rgw: Remove pessimizing move
-* rgw: remove redundant codes in rgw_cache.h (`pr#13902 <https://github.com/ceph/ceph/pull/13902>`_, lihongjie)
-* rgw: Remove spurious XML header for GetBucketPolicy (`issue#20247 <http://tracker.ceph.com/issues/20247>`_, `pr#15586 <https://github.com/ceph/ceph/pull/15586>`_, Adam C. Emerson)
-* rgw: remove the useless output when listing zonegroups (`pr#16331 <https://github.com/ceph/ceph/pull/16331>`_, Zhang Shaowen)
-* rgw: remove unused func in rgw_file.h (`pr#15698 <https://github.com/ceph/ceph/pull/15698>`_, lihongjie)
-* rgw: remove useless --tier_type in radosgw-admin (`pr#13856 <https://github.com/ceph/ceph/pull/13856>`_, Zhang Shaowen)
-* rgw: rename s3_code to err_code for swift (`pr#12300 <https://github.com/ceph/ceph/pull/12300>`_, Guo Zhandong)
-* rgw: Replace get_zonegroup().is_master_zonegroup() with is_meta_master() in RGWBulkDelete::Deleter::delete_single() (`pr#16062 <https://github.com/ceph/ceph/pull/16062>`_, Fan Yang)
-* rgw: req xml params size limitation error msg (`pr#16310 <https://github.com/ceph/ceph/pull/16310>`_, Enming Zhang)
-* rgw: respect Swift's negative, HTTP referer-based ACL grants (`issue#18841 <http://tracker.ceph.com/issues/18841>`_, `pr#14344 <https://github.com/ceph/ceph/pull/14344>`_, Radoslaw Zarzynski)
-* rgw: restore admin socket path in mrgw.sh (`pr#16540 <https://github.com/ceph/ceph/pull/16540>`_, Casey Bodley)
-* rgw: return the version id in get object and object metadata request (`issue#19370 <http://tracker.ceph.com/issues/19370>`_, `pr#14117 <https://github.com/ceph/ceph/pull/14117>`_, Zhang Shaowen)
-* rgw: rgw-admin: fix bucket limit check argparse, div(0) (`pr#15316 <https://github.com/ceph/ceph/pull/15316>`_, Matt Benjamin)
-* rgw: rgw-admin: remove deprecated regionmap commands (`issue#18725 <http://tracker.ceph.com/issues/18725>`_, `pr#13963 <https://github.com/ceph/ceph/pull/13963>`_, Casey Bodley)
-* rgw: rgw_common: use string::npos for the results of str.find (`pr#14341 <https://github.com/ceph/ceph/pull/14341>`_, Abhishek Lekshmanan)
-* rgw: rgw_crypt: log error messages during failures (`pr#16726 <https://github.com/ceph/ceph/pull/16726>`_, Abhishek Lekshmanan)
-* rgw: rgw_file: add compression interop to RGW NFS (`issue#20462 <http://tracker.ceph.com/issues/20462>`_, `pr#15989 <https://github.com/ceph/ceph/pull/15989>`_, Matt Benjamin)
-* rgw: rgw_file: add lock protection for readdir against gc (`issue#20121 <http://tracker.ceph.com/issues/20121>`_, `pr#15329 <https://github.com/ceph/ceph/pull/15329>`_, Gui Hecheng)
-* rgw: rgw_file:  add service map registration (`pr#16251 <https://github.com/ceph/ceph/pull/16251>`_, Matt Benjamin)
-* rgw: rgw_file: add timed namespace invalidation (`issue#18651 <http://tracker.ceph.com/issues/18651>`_, `pr#13038 <https://github.com/ceph/ceph/pull/13038>`_, Matt Benjamin)
-* rgw: rgw_file: avoid a recursive lane lock in LRU drain (`issue#20374 <http://tracker.ceph.com/issues/20374>`_, `pr#15819 <https://github.com/ceph/ceph/pull/15819>`_, Matt Benjamin)
-* rgw: rgw_file: avoid stranding invalid-name bucket handles in fhcache (`issue#19036 <http://tracker.ceph.com/issues/19036>`_, `pr#13590 <https://github.com/ceph/ceph/pull/13590>`_, Matt Benjamin)
-* rgw: rgw_file cleanup names (`pr#15568 <https://github.com/ceph/ceph/pull/15568>`_, Gui Hecheng)
-* rgw: rgw_file: cleanup virtual keyword on derived functions (`pr#14908 <https://github.com/ceph/ceph/pull/14908>`_, Gui Hecheng)
-* rgw: rgw_file: ensure valid_s3_object_name for directories, too (`issue#19066 <http://tracker.ceph.com/issues/19066>`_, `pr#13614 <https://github.com/ceph/ceph/pull/13614>`_, Matt Benjamin)
-* rgw: rgw_file: fix assert upon setattr on bucket (`issue#20287 <http://tracker.ceph.com/issues/20287>`_, `pr#15679 <https://github.com/ceph/ceph/pull/15679>`_, Gui Hecheng)
-* rgw: rgw_file: fix double unref on rgw_fh for rename (`pr#13988 <https://github.com/ceph/ceph/pull/13988>`_, Gui Hecheng)
-* rgw: rgw_file: fix flags set on unsuccessful unlink (`pr#15222 <https://github.com/ceph/ceph/pull/15222>`_, Gui Hecheng)
-* rgw: rgw_file:  fix fs_inst progression (`issue#19214 <http://tracker.ceph.com/issues/19214>`_, `pr#13832 <https://github.com/ceph/ceph/pull/13832>`_, Matt Benjamin)
-* rgw: rgw_file: fix missing unlock in unlink (`issue#19435 <http://tracker.ceph.com/issues/19435>`_, `pr#14262 <https://github.com/ceph/ceph/pull/14262>`_, Gui Hecheng)
-* rgw: rgw_file: fix misuse of make_key_name before make_fhk (`pr#15108 <https://github.com/ceph/ceph/pull/15108>`_, Gui Hecheng)
-* rgw: rgw_file: fix non-negative return code for open operation (`pr#14045 <https://github.com/ceph/ceph/pull/14045>`_, Gui Hecheng)
-* rgw: rgw_file: fix non-posix errcode EINVAL to ENAMETOOLONG (`pr#13764 <https://github.com/ceph/ceph/pull/13764>`_, Gui Hecheng)
-* rgw: rgw_file: fix readdir after dirent-change (`issue#19634 <http://tracker.ceph.com/issues/19634>`_, `pr#14561 <https://github.com/ceph/ceph/pull/14561>`_, Matt Benjamin)
-* rgw: rgw_file: fix reversed return value of getattr (`pr#13895 <https://github.com/ceph/ceph/pull/13895>`_, Gui Hecheng)
-* rgw: rgw_file:  fix RGWLibFS::setattr for directory objects (`issue#18808 <http://tracker.ceph.com/issues/18808>`_, `pr#13252 <https://github.com/ceph/ceph/pull/13252>`_, Matt Benjamin)
-* rgw: rgw_file: fix up potential race condition (`pr#14553 <https://github.com/ceph/ceph/pull/14553>`_, Gui Hecheng)
-* rgw: rgw_file: implement reliable has-children check (unlink dir) (`issue#19270 <http://tracker.ceph.com/issues/19270>`_, `pr#13953 <https://github.com/ceph/ceph/pull/13953>`_, Matt Benjamin)
-* rgw: rgw_file:  interned RGWFileHandle objects need parent refs (`issue#18650 <http://tracker.ceph.com/issues/18650>`_, `pr#13084 <https://github.com/ceph/ceph/pull/13084>`_, Matt Benjamin)
-* rgw: rgw_file: posix style atime,ctime,mtime (`pr#13765 <https://github.com/ceph/ceph/pull/13765>`_, Gui Hecheng)
-* rgw: rgw_file:  pre-compute unix attrs in write_finish() (`issue#19653 <http://tracker.ceph.com/issues/19653>`_, `pr#14609 <https://github.com/ceph/ceph/pull/14609>`_, Matt Benjamin)
-* rgw: rgw_file: prevent conflict of mkdir between restarts (`issue#20275 <http://tracker.ceph.com/issues/20275>`_, `pr#15655 <https://github.com/ceph/ceph/pull/15655>`_, Gui Hecheng)
-* rgw: rgw_file: properly & or flags (`issue#20663 <http://tracker.ceph.com/issues/20663>`_, `pr#16448 <https://github.com/ceph/ceph/pull/16448>`_, Matt Benjamin)
-* rgw: rgw_file: release rgw_fh lock and ref on ENOTEMPTY (`issue#20061 <http://tracker.ceph.com/issues/20061>`_, `pr#15246 <https://github.com/ceph/ceph/pull/15246>`_, Matt Benjamin)
-* rgw: rgw_file: removed extra rele() on fs in rgw_umount() (`pr#15152 <https://github.com/ceph/ceph/pull/15152>`_, Gui Hecheng)
-* rgw: rgw_file: remove hidden uxattr objects from buckets on delete (`issue#20045 <http://tracker.ceph.com/issues/20045>`_, `pr#15210 <https://github.com/ceph/ceph/pull/15210>`_, Matt Benjamin)
-* rgw: rgw_file:  remove post-unlink lookup check (`issue#20047 <http://tracker.ceph.com/issues/20047>`_, `pr#15216 <https://github.com/ceph/ceph/pull/15216>`_, Matt Benjamin)
-* rgw: rgw_file: replace raw fs->fh_lru.unref with predefined fs->unref (`pr#15541 <https://github.com/ceph/ceph/pull/15541>`_, Gui Hecheng)
-* rgw: rgw_file: RGWFileHandle dtor must also cond-unlink from FHCache (`issue#19112 <http://tracker.ceph.com/issues/19112>`_, `pr#13712 <https://github.com/ceph/ceph/pull/13712>`_, Matt Benjamin)
-* rgw: rgw_file skip policy read for virtual components (`pr#16034 <https://github.com/ceph/ceph/pull/16034>`_, Gui Hecheng)
-* rgw: rgw_file:  split last argv on ws, if provided (`pr#12965 <https://github.com/ceph/ceph/pull/12965>`_, Matt Benjamin)
-* rgw: rgw_file: store bucket uxattrs on the bucket (`issue#20082 <http://tracker.ceph.com/issues/20082>`_, `pr#15293 <https://github.com/ceph/ceph/pull/15293>`_, Matt Benjamin)
-* rgw: rgw_file: support readdir cb type hints (plus fixes) (`issue#19623 <http://tracker.ceph.com/issues/19623>`_, `issue#19625 <http://tracker.ceph.com/issues/19625>`_, `issue#19624 <http://tracker.ceph.com/issues/19624>`_, `pr#14458 <https://github.com/ceph/ceph/pull/14458>`_, Matt Benjamin)
-* rgw: rgw_file:  use fh_hook::is_linked() to check residence (`issue#19111 <http://tracker.ceph.com/issues/19111>`_, `pr#13703 <https://github.com/ceph/ceph/pull/13703>`_, Matt Benjamin)
-* rgw: rgw_file: v3: fix write-timer action (`issue#19932 <http://tracker.ceph.com/issues/19932>`_, `pr#15097 <https://github.com/ceph/ceph/pull/15097>`_, Matt Benjamin)
-* rgw: rgw : fix race in RGWCompleteMultipart (`issue#20861 <http://tracker.ceph.com/issues/20861>`_, `pr#16732 <https://github.com/ceph/ceph/pull/16732>`_, Abhishek Varshney)
-* rgw: rgw:fix s3 aws v2 signature priority between header['X-Amz-Date'] and header['Date'] (`issue#20176 <http://tracker.ceph.com/issues/20176>`_, `pr#15467 <https://github.com/ceph/ceph/pull/15467>`_, yuliyang)
-* rgw:  rgw: fix the subdir without slash of s3 website url (`issue#20307 <http://tracker.ceph.com/issues/20307>`_, `pr#15703 <https://github.com/ceph/ceph/pull/15703>`_, liuhong)
-* rgw: rgw_lc: drop a bunch of unused headers (`pr#14342 <https://github.com/ceph/ceph/pull/14342>`_, Abhishek Lekshmanan)
-* rgw: rgw_ldap: log the ldap err in case of bind failure (`pr#14781 <https://github.com/ceph/ceph/pull/14781>`_, Abhishek Lekshmanan)
-* rgw: rgw/lifecycle: do not send lifecycle rules when GetLifeCycle failed (`issue#19363 <http://tracker.ceph.com/issues/19363>`_, `pr#14160 <https://github.com/ceph/ceph/pull/14160>`_, liuchang0812)
-* rgw: RGWMetaSyncShardControlCR retries with backoff on all error codes (`issue#19019 <http://tracker.ceph.com/issues/19019>`_, `pr#13546 <https://github.com/ceph/ceph/pull/13546>`_, Casey Bodley)
-* rgw: RGWMetaSyncShardCR drops stack refs on destruction (`issue#18412 <http://tracker.ceph.com/issues/18412>`_, `issue#18300 <http://tracker.ceph.com/issues/18300>`_, `pr#12605 <https://github.com/ceph/ceph/pull/12605>`_, Casey Bodley)
-* rgw: rgw multisite: automated mdlog trimming (`pr#13111 <https://github.com/ceph/ceph/pull/13111>`_, Casey Bodley)
-* rgw: rgw multisite: feature of bucket sync enable/disable (`pr#15801 <https://github.com/ceph/ceph/pull/15801>`_, Zhang Shaowen, Casey Bodley, Zengran Zhang)
-* rgw: rgw multisite: fixes for meta sync across periods (`issue#18639 <http://tracker.ceph.com/issues/18639>`_, `pr#13070 <https://github.com/ceph/ceph/pull/13070>`_, Casey Bodley)
-* rgw: rgw multisite: fix ref counting of completions (`issue#18414 <http://tracker.ceph.com/issues/18414>`_, `issue#18407 <http://tracker.ceph.com/issues/18407>`_, `pr#12841 <https://github.com/ceph/ceph/pull/12841>`_, Casey Bodley)
-* rgw: rgw-multisite: fix the problem of rgw website configure 'RedirectAllRequestsTo' failed to sync to slave zone (`pr#15036 <https://github.com/ceph/ceph/pull/15036>`_, yuliyang)
-* rgw: rgw-multisite: fix the problem of rgw website configure request not redirect to metadata master (`pr#15082 <https://github.com/ceph/ceph/pull/15082>`_, yuliyang)
-* rgw: rgw multisite: remove the redundant post in OPT_ZONEGROUP_MODIFY (`pr#14359 <https://github.com/ceph/ceph/pull/14359>`_, Jing Wenjun)
-* rgw: rgw/multisite: validate bucket location during bucket creation (`pr#15333 <https://github.com/ceph/ceph/pull/15333>`_, Jiaying Ren)
-* rgw: RGW NFS: add nfs.rst to doc/radosgw (`pr#15789 <https://github.com/ceph/ceph/pull/15789>`_, Matt Benjamin)
-* rgw: rgw_op: remove unused variable iter (`pr#14276 <https://github.com/ceph/ceph/pull/14276>`_, Weibing Zhang)
-* rgw: RGWPeriodPusher spawns http thread before cr thread (`issue#19834 <http://tracker.ceph.com/issues/19834>`_, `pr#14936 <https://github.com/ceph/ceph/pull/14936>`_, Casey Bodley)
-* rgw: rgw_rados: create sync module instances only if run_sync_thread is set (`issue#19830 <http://tracker.ceph.com/issues/19830>`_, `pr#14994 <https://github.com/ceph/ceph/pull/14994>`_, Abhishek Lekshmanan)
-* rgw: rgw_rados drop deprecated global var (`pr#14411 <https://github.com/ceph/ceph/pull/14411>`_, Jiaying Ren)
-* rgw: rgw_rados: initialize cur_shard (`pr#15735 <https://github.com/ceph/ceph/pull/15735>`_, Abhishek Lekshmanan)
-* rgw: rgw realm set fixes (`issue#18333 <http://tracker.ceph.com/issues/18333>`_, `pr#12731 <https://github.com/ceph/ceph/pull/12731>`_, Orit Wasserman)
-* rgw: rgw/rgw_frontend.h: Return negative value for empty uid in RGWLoadGenFrontend::init() (`pr#16204 <https://github.com/ceph/ceph/pull/16204>`_, jimifm)
-* rgw: rgw/rgw_main.cc: fix parenteses and function result (`pr#12295 <https://github.com/ceph/ceph/pull/12295>`_, Willem Jan Withagen)
-* rgw: rgw/rgw_op:Prevents memory leaks when calling func swift_versioning_copy() fails (`pr#15328 <https://github.com/ceph/ceph/pull/15328>`_, jimifm)
-* rgw: rgw/rgw_rados: Remove duplicate calls in RGWRados::finalize() (`pr#15281 <https://github.com/ceph/ceph/pull/15281>`_, jimifm)
-* rgw: rgw/rgw_string.h: FreeBSD would like errno.h included (`pr#15737 <https://github.com/ceph/ceph/pull/15737>`_, Willem Jan Withagen)
-* rgw: rgw/rgw_swift_auth.cc: using string::back() instead as the C++11 recommend (`pr#14827 <https://github.com/ceph/ceph/pull/14827>`_, liuyuhong)
-* rgw: rgw structures rework (`issue#17996 <http://tracker.ceph.com/issues/17996>`_, `issue#19249 <http://tracker.ceph.com/issues/19249>`_, `pr#11485 <https://github.com/ceph/ceph/pull/11485>`_, Yehuda Sadeh)
-* rgw: rgw,test: fix rgw placement rule pool config option (`pr#16084 <https://github.com/ceph/ceph/pull/16084>`_, Jiaying Ren)
-* rgw: S3 lifecycle now supports expiration date (`pr#15807 <https://github.com/ceph/ceph/pull/15807>`_, Zhang Shaowen)
-* rgw: s3 server-side encryption (SSE-C, SSE-KMS) (`pr#11049 <https://github.com/ceph/ceph/pull/11049>`_, Adam Kupczyk, Casey Bodley, Radoslaw Zarzynski)
-* rgw: segment fault when shard id out of range (`issue#19732 <http://tracker.ceph.com/issues/19732>`_, `pr#14389 <https://github.com/ceph/ceph/pull/14389>`_, redickwang)
-* rgw: set dumpable flag after setuid post ff0e521 (`issue#19089 <http://tracker.ceph.com/issues/19089>`_, `pr#13657 <https://github.com/ceph/ceph/pull/13657>`_, Brad Hubbard)
-* rgw: set FCGI_INCLUDE_DIR for cephd_rgw_base (`issue#18918 <http://tracker.ceph.com/issues/18918>`_, `pr#13393 <https://github.com/ceph/ceph/pull/13393>`_, David Disseldorp)
-* rgw: set object accounted size correctly (`issue#20071 <http://tracker.ceph.com/issues/20071>`_, `pr#14950 <https://github.com/ceph/ceph/pull/14950>`_, fang yuxiang)
-* rgw: set placement rule properly (`pr#15221 <https://github.com/ceph/ceph/pull/15221>`_, fang.yuxiang)
-* rgw: should delete in_stream_req  if conn->get_obj(...) return not zero value (`pr#9950 <https://github.com/ceph/ceph/pull/9950>`_, weiqiaomiao)
-* rgw: should not restrict location_constraint same when user not provide (`pr#16770 <https://github.com/ceph/ceph/pull/16770>`_, Tianshan Qu)
-* rgw: should unlock when reshard_log->update() reture non-zero in RGWB… (`pr#16502 <https://github.com/ceph/ceph/pull/16502>`_, Wei Qiaomiao)
-* rgw: silence compile warning from -Wmaybe-uninitialized (`pr#15996 <https://github.com/ceph/ceph/pull/15996>`_, Jiaying Ren)
-* rgw: silence warning from -Wmaybe-uninitialized (`pr#15949 <https://github.com/ceph/ceph/pull/15949>`_, Jos Collin)
-* rgw: stat requests skip compression, manifest handling, etc (`pr#14109 <https://github.com/ceph/ceph/pull/14109>`_, Casey Bodley)
-* rgw: Support certain archaic and antiquated distributions(`pr#15498 <https://github.com/ceph/ceph/pull/15498>`_, Adam C. Emerson)
-* rgw: swift: ability to update swift read and write acls separately (`issue#19289 <http://tracker.ceph.com/issues/19289>`_, `pr#14499 <https://github.com/ceph/ceph/pull/14499>`_, Marcus Watts)
-* rgw: swift: disable revocation thread if sleep == 0 (`issue#19499 <http://tracker.ceph.com/issues/19499>`_, `issue#9493 <http://tracker.ceph.com/issues/9493>`_, `pr#14501 <https://github.com/ceph/ceph/pull/14501>`_, Marcus Watts)
-* rgw: swift: fix anonymous user's error code of getting object (`issue#18806 <http://tracker.ceph.com/issues/18806>`_, `pr#13242 <https://github.com/ceph/ceph/pull/13242>`_, Jing Wenjun)
-* rgw: swift: the http referer acl in swift API should be shown (`issue#18665 <http://tracker.ceph.com/issues/18665>`_, `pr#13003 <https://github.com/ceph/ceph/pull/13003>`_, Jing Wenjun)
-* rgw: swift: The http referer should be parsed to compare in swift API (`issue#18685 <http://tracker.ceph.com/issues/18685>`_, `pr#13005 <https://github.com/ceph/ceph/pull/13005>`_, Jing Wenjun)
-* rgw: switch from "timegm()" to "internal_timegm()" for better portability (`issue#12863 <http://tracker.ceph.com/issues/12863>`_, `pr#14327 <https://github.com/ceph/ceph/pull/14327>`_, Rishabh Kumar)
-* rgw: switch to std::array in RGWBulkUploadOp due to C++11 and FreeBSD (`pr#14314 <https://github.com/ceph/ceph/pull/14314>`_, Radoslaw Zarzynski)
-* rgw: sync status compares the current master period (`issue#18064 <http://tracker.ceph.com/issues/18064>`_, `pr#12907 <https://github.com/ceph/ceph/pull/12907>`_, Abhishek Lekshmanan)
-* rgw: test,rgw: fix rgw placement rule pool config option (`pr#16380 <https://github.com/ceph/ceph/pull/16380>`_, Jiaying Ren)
-* rgw,tests: luminous: qa/rgw: use 'ceph osd pool application enable' on created pools (`pr#17259 <https://github.com/ceph/ceph/pull/17259>`_, Casey Bodley)
-* rgw,tests: qa/rgw: add cluster name to path when s3tests scans rgw log (`pr#14845 <https://github.com/ceph/ceph/pull/14845>`_, Casey Bodley)
-* rgw,tests: qa/rgw: add configuration for server-side encryption tests (`pr#13597 <https://github.com/ceph/ceph/pull/13597>`_, Casey Bodley)
-* rgw,tests: qa/rgw: add encryption config for s3tests under thrash (`pr#15694 <https://github.com/ceph/ceph/pull/15694>`_, Casey Bodley)
-* rgw,tests: qa/rgw: add multisite suite to configure and run multisite tests (`pr#14688 <https://github.com/ceph/ceph/pull/14688>`_, Casey Bodley)
-* rgw,tests: qa/rgw: disable lifecycle tests because of expiration failures (`pr#16760 <https://github.com/ceph/ceph/pull/16760>`_, Casey Bodley)
-* rgw,tests: qa/rgw: don't scan radosgw logs for encryption keys on jewel upgrade test (`pr#14697 <https://github.com/ceph/ceph/pull/14697>`_, Casey Bodley)
-* rgw,tests: qa/rgw: fix assertions in radosgw_admin task (`pr#14842 <https://github.com/ceph/ceph/pull/14842>`_, Casey Bodley)
-* rgw,tests: qa/rgw: remove apache/fastcgi and radosgw-agent tests (`pr#15184 <https://github.com/ceph/ceph/pull/15184>`_, Casey Bodley)
-* rgw,tests: qa/suites/rgw/thrash: add osd thrashing tests (`pr#13445 <https://github.com/ceph/ceph/pull/13445>`_, Sage Weil)
-* rgw,tests: qa/tasks: S3A hadoop task to test s3a with Ceph (`pr#14624 <https://github.com/ceph/ceph/pull/14624>`_, Vasu Kulkarni)
-* rgw,tests: test/rgw: add bucket acl and versioning tests to test_multi.py (`pr#12449 <https://github.com/ceph/ceph/pull/12449>`_, Casey Bodley)
-* rgw,tests: test/rgw: add test for versioned object sync (`pr#12474 <https://github.com/ceph/ceph/pull/12474>`_, Casey Bodley)
-* rgw,tests: test/rgw: fixes for test_multi_period_incremental_sync() (`pr#13067 <https://github.com/ceph/ceph/pull/13067>`_, Casey Bodley)
-* rgw,tests: test/rgw: fix for empty lists as default arguments (`pr#14816 <https://github.com/ceph/ceph/pull/14816>`_, Casey Bodley)
-* rgw,tests: test/rgw: refactor test_multi.py for use in qa suite (`pr#14433 <https://github.com/ceph/ceph/pull/14433>`_, Casey Bodley)
-* rgw,tests: test/rgw: test_bucket_delete_notempty in test_multi.py (`pr#14090 <https://github.com/ceph/ceph/pull/14090>`_, Casey Bodley)
-* rgw,tests: vstart: add rgw configuration needed to pass all s3tests (`pr#15782 <https://github.com/ceph/ceph/pull/15782>`_, Casey Bodley)
-* rgw,tests: vstart: remove rgw_enable_static_website (`pr#15856 <https://github.com/ceph/ceph/pull/15856>`_, Casey Bodley)
-* rgw: the swift container acl should support field .ref (`issue#18484 <http://tracker.ceph.com/issues/18484>`_, `pr#12874 <https://github.com/ceph/ceph/pull/12874>`_, Jing Wenjun)
-* rgw: Turn off fcgi as a frontend (`issue#16784 <http://tracker.ceph.com/issues/16784>`_, `pr#15070 <https://github.com/ceph/ceph/pull/15070>`_, Thomas Serlin)
-* rgw: Uninitialized member in LCRule (`pr#15827 <https://github.com/ceph/ceph/pull/15827>`_, Jos Collin)
-* rgw: update Beast for streaming reads in asio frontend (`pr#14273 <https://github.com/ceph/ceph/pull/14273>`_, Casey Bodley)
-* rgw: update bucket cors in secondary zonegroup should forward to master (`issue#16888 <http://tracker.ceph.com/issues/16888>`_, `pr#15260 <https://github.com/ceph/ceph/pull/15260>`_, Shasha Lu)
-* rgw: update function doc in rgw_rados.h  and rgw_rados.cc (`pr#15803 <https://github.com/ceph/ceph/pull/15803>`_, Jiaying Ren)
-* rgw: update is_truncated in function rgw_read_user_buckets (`issue#19365 <http://tracker.ceph.com/issues/19365>`_, `pr#14343 <https://github.com/ceph/ceph/pull/14343>`_, liuchang0812)
-* rgw: usage (`issue#16191 <http://tracker.ceph.com/issues/16191>`_, `pr#14287 <https://github.com/ceph/ceph/pull/14287>`_, Ji Chen, Orit Wasserman)
-* rgw: use 64-bit offsets for compression (`issue#20231 <http://tracker.ceph.com/issues/20231>`_, `pr#15656 <https://github.com/ceph/ceph/pull/15656>`_, Adam Kupczyk, fang yuxiang)
-* rgw: use a namespace for rgw reshard pool for upgrades as well (`issue#20289 <http://tracker.ceph.com/issues/20289>`_, `pr#16368 <https://github.com/ceph/ceph/pull/16368>`_, Karol Mroz, Abhishek Lekshmanan)
-* rgw: Use comparison instead of assignment (`pr#16653 <https://github.com/ceph/ceph/pull/16653>`_, amitkuma)
-* rgw: Use decoded URI when verifying TempURL (`issue#18590 <http://tracker.ceph.com/issues/18590>`_, `pr#13007 <https://github.com/ceph/ceph/pull/13007>`_, Michal Koutný)
-* rgw: use get_data_extra_pool() when get extra pool (`issue#20064 <http://tracker.ceph.com/issues/20064>`_, `pr#15219 <https://github.com/ceph/ceph/pull/15219>`_, fang yuxiang)
-* rgw: use pre-defined calls to replace raw flag operation (`pr#15107 <https://github.com/ceph/ceph/pull/15107>`_, Gui Hecheng)
-* rgw: use rgw_zone_root_pool for region_map like is done in hammer (`issue#19195 <http://tracker.ceph.com/issues/19195>`_, `pr#13928 <https://github.com/ceph/ceph/pull/13928>`_, Orit Wasserman)
-* rgw: use separate http_manager for read_sync_status (`issue#19236 <http://tracker.ceph.com/issues/19236>`_, `pr#13660 <https://github.com/ceph/ceph/pull/13660>`_, Shasha Lu)
-* rgw: use uncompressed size for range_to_ofs() in slo/dlo (`pr#15931 <https://github.com/ceph/ceph/pull/15931>`_, Casey Bodley)
-* rgw: using RGW_OBJ_NS_MULTIPART in check_bad_index_multipart (`pr#15774 <https://github.com/ceph/ceph/pull/15774>`_, Shasha Lu)
-* rgw: using the same bucket num_shards as master zg when create bucket in secondary zg (`issue#19745 <http://tracker.ceph.com/issues/19745>`_, `pr#14388 <https://github.com/ceph/ceph/pull/14388>`_, Shasha Lu)
-* rgw: validate tenant names during user create (`pr#16442 <https://github.com/ceph/ceph/pull/16442>`_, Abhishek Lekshmanan)
-* rgw: verify md5 in post obj (`issue#19739 <http://tracker.ceph.com/issues/19739>`_, `pr#14961 <https://github.com/ceph/ceph/pull/14961>`_, Yehuda Sadeh)
-* rgw: version id doesn't work in fetch_remote_obj (`pr#14010 <https://github.com/ceph/ceph/pull/14010>`_, Zhang Shaowen)
-* rgw: VersionIdMarker and NextVersionIdMarker should be returned when listing object versions (`issue#19886 <http://tracker.ceph.com/issues/19886>`_, `pr#15014 <https://github.com/ceph/ceph/pull/15014>`_, Zhang Shaowen)
-* rgw: warning, output may be truncated before the last format character (`pr#14194 <https://github.com/ceph/ceph/pull/14194>`_, Jos Collin)
-* rgw: when create_bucket use the same num_shards with info.num_shards (`issue#19745 <http://tracker.ceph.com/issues/19745>`_, `pr#15010 <https://github.com/ceph/ceph/pull/15010>`_, Shasha Lu)
-* rgw: wip dir orphan (`issue#18992 <http://tracker.ceph.com/issues/18992>`_, `issue#18989 <http://tracker.ceph.com/issues/18989>`_, `issue#19018 <http://tracker.ceph.com/issues/19018>`_, `issue#18991 <http://tracker.ceph.com/issues/18991>`_, `pr#13529 <https://github.com/ceph/ceph/pull/13529>`_, Matt Benjamin)
-* rgw: Wip librgw refcnt (`pr#13405 <https://github.com/ceph/ceph/pull/13405>`_, Matt Benjamin)
-* rgw: wip parentref (`issue#19060 <http://tracker.ceph.com/issues/19060>`_, `issue#19059 <http://tracker.ceph.com/issues/19059>`_, `pr#13607 <https://github.com/ceph/ceph/pull/13607>`_, Matt Benjamin)
-* rgw: Wip rgw fix prefix list (`issue#19432 <http://tracker.ceph.com/issues/19432>`_, `pr#15916 <https://github.com/ceph/ceph/pull/15916>`_, Giovani Rinaldi, Orit Wasserman)
-* rgw: Wip rgw openssl 7 (`issue#11239 <http://tracker.ceph.com/issues/11239>`_, `issue#16535 <http://tracker.ceph.com/issues/16535>`_, `pr#11776 <https://github.com/ceph/ceph/pull/11776>`_, Yehuda Sadeh, Marcus Watts)
-* rgw: wip: rgw: rest_admin/user avoid double checking input args (`pr#13460 <https://github.com/ceph/ceph/pull/13460>`_, Abhishek Lekshmanan)
-* tests: Add integration tests for admin socket output (`pr#15223 <https://github.com/ceph/ceph/pull/15223>`_, Brad Hubbard)
-* tests: add MGR=1 so 'pg dump' won't be blocked (`pr#14266 <https://github.com/ceph/ceph/pull/14266>`_, Kefu Chai)
-* tests: Add openstack requirements to smoke suite (`pr#12913 <https://github.com/ceph/ceph/pull/12913>`_, Zack Cerza)
-* tests: add setup/teardown for asok dir (`pr#16523 <https://github.com/ceph/ceph/pull/16523>`_, Kefu Chai)
-* tests: buildpackages: remove because it does not belong (`issue#18846 <http://tracker.ceph.com/issues/18846>`_, `pr#13297 <https://github.com/ceph/ceph/pull/13297>`_, Loic Dachary)
-* tests: ceph-disk: add setting for external py-modules for tox-testing (`pr#15433 <https://github.com/ceph/ceph/pull/15433>`_, Willem Jan Withagen)
-* tests: ceph-disk: use communicate() instead of wait() for output (`pr#16347 <https://github.com/ceph/ceph/pull/16347>`_, Kefu Chai)
-* tests: ceph-helpers.sh reduce get_timeout_delays() verbosity (`pr#13257 <https://github.com/ceph/ceph/pull/13257>`_, Kefu Chai)
-* tests: ceph_objectstore_tool.py: kill all daemons (`pr#14428 <https://github.com/ceph/ceph/pull/14428>`_, Kefu Chai)
-* tests: ceph_test_objectstore: tolerate fsck EOPNOTSUPP too (`pr#13325 <https://github.com/ceph/ceph/pull/13325>`_, Sage Weil)
-* tests: ceph_test_rados_api_tier: tolerate ENOENT from 'pg scrub' (`pr#14807 <https://github.com/ceph/ceph/pull/14807>`_, Sage Weil)
-* tests: ceph_test_rados_api_watch_notify: move global variables into test class (`issue#18395 <http://tracker.ceph.com/issues/18395>`_, `pr#12751 <https://github.com/ceph/ceph/pull/12751>`_, Kefu Chai)
-* tests: ceph_test_rados_api_watch_notify: test timeout using rados_wat… (`issue#19312 <http://tracker.ceph.com/issues/19312>`_, `pr#14061 <https://github.com/ceph/ceph/pull/14061>`_, Kefu Chai)
-* tests: cephtool/test.sh error on full tests (`issue#19698 <http://tracker.ceph.com/issues/19698>`_, `pr#14647 <https://github.com/ceph/ceph/pull/14647>`_, Willem Jan Withagen, David Zafman)
-* tests: cephtool/test.sh: Only delete a test pool when no longer needed (`pr#16443 <https://github.com/ceph/ceph/pull/16443>`_, Willem Jan Withagen)
-* tests: cls_lock: move lock_info_t definition to cls_lock_types.h (`pr#16091 <https://github.com/ceph/ceph/pull/16091>`_, runsisi)
-* tests: config_opts: drop unused opts (`pr#15031 <https://github.com/ceph/ceph/pull/15031>`_, Kefu Chai)
-* tests: Decreased amount of jobs on master, kraken, luminous runs (`pr#17074 <https://github.com/ceph/ceph/pull/17074>`_, Yuri Weinstein)
-* tests: Don't dump core when using EXPECT_DEATH (`pr#14821 <https://github.com/ceph/ceph/pull/14821>`_, Kefu Chai, Brad Hubbard)
-* tests: drop buildpackages.py (`issue#18846 <http://tracker.ceph.com/issues/18846>`_, `pr#13319 <https://github.com/ceph/ceph/pull/13319>`_, Nathan Cutler)
-* tests: drop obsolete Perl scripts (`pr#13951 <https://github.com/ceph/ceph/pull/13951>`_, Nathan Cutler)
-* tests: drop rbd_cli_tests.pl and RbdLib.pm (`issue#14825 <http://tracker.ceph.com/issues/14825>`_, `pr#12821 <https://github.com/ceph/ceph/pull/12821>`_, Nathan Cutler)
-* tests: drop unused rbd_functional_tests.pl script (`issue#14825 <http://tracker.ceph.com/issues/14825>`_, `pr#12818 <https://github.com/ceph/ceph/pull/12818>`_, Nathan Cutler)
-* tests: fio_ceph_objectstore: fixes improper write request data lifetime (`pr#14338 <https://github.com/ceph/ceph/pull/14338>`_, Adam Kupczyk)
-* tests: fix broken links in upgrade/hammer-jewel-x/stress-split (`issue#19793 <http://tracker.ceph.com/issues/19793>`_, `pr#14831 <https://github.com/ceph/ceph/pull/14831>`_, Nathan Cutler)
-* tests: fix NULL references to be acceptable by Clang (`pr#12880 <https://github.com/ceph/ceph/pull/12880>`_, Willem Jan Withagen)
-* tests: fix rados/upgrade/jewel-x-singleton and make workunit task handle repo URLs not ending in ".git" (`issue#20554 <http://tracker.ceph.com/issues/20554>`_, `issue#20368 <http://tracker.ceph.com/issues/20368>`_, `pr#16228 <https://github.com/ceph/ceph/pull/16228>`_, Nathan Cutler, Sage Weil)
-* tests: fix regression in qa/tasks/ceph_master.py (`issue#16263 <http://tracker.ceph.com/issues/16263>`_, `pr#13279 <https://github.com/ceph/ceph/pull/13279>`_, Nathan Cutler, Kefu Chai)
-* tests: fix template specialization of PromoteRequest class (`pr#12815 <https://github.com/ceph/ceph/pull/12815>`_, Ricardo Dias)
-* tests: ignore bogus ceph-objectstore-tool error in ceph_manager (`issue#16263 <http://tracker.ceph.com/issues/16263>`_, `pr#13194 <https://github.com/ceph/ceph/pull/13194>`_, Nathan Cutler)
-* tests: include/denc: support ENCODE_DUMP (`pr#14962 <https://github.com/ceph/ceph/pull/14962>`_, Sage Weil)
-* tests: libradosstriper: do not assign garbage to returned value (`pr#15009 <https://github.com/ceph/ceph/pull/15009>`_, Kefu Chai)
-* tests: luminous: tests: qa/standalone: misc fixes (`issue#20465 <http://tracker.ceph.com/issues/20465>`_, `issue#20921 <http://tracker.ceph.com/issues/20921>`_, `issue#20979 <http://tracker.ceph.com/issues/20979>`_, `pr#16985 <https://github.com/ceph/ceph/pull/16985>`_, David Zafman)
-* tests: mgr,os,test: kill clang analyzer warnings (`pr#16227 <https://github.com/ceph/ceph/pull/16227>`_, Kefu Chai)
-* tests: move swift.py task from teuthology to ceph, phase one (master) (`issue#20392 <http://tracker.ceph.com/issues/20392>`_, `pr#15859 <https://github.com/ceph/ceph/pull/15859>`_, Nathan Cutler, Sage Weil, Warren Usui, Greg Farnum, Ali Maredia, Tommi Virtanen, Zack Cerza, Sam Lang, Yehuda Sadeh, Joe Buck, Josh Durgin)
-* tests: nosetests: use /usr/bin/env to find nosetests (`pr#12091 <https://github.com/ceph/ceph/pull/12091>`_, Willem Jan Withagen)
-* tests: os: Argument cannot be negative (`pr#16688 <https://github.com/ceph/ceph/pull/16688>`_, amitkuma)
-* tests: os/bluestore,test/ceph_test_objectstore: silence gcc warnings (`pr#13924 <https://github.com/ceph/ceph/pull/13924>`_, Kefu Chai)
-* tests: osd-scrub-repair.sh disable scrub backoff in test (`pr#13334 <https://github.com/ceph/ceph/pull/13334>`_, Kefu Chai)
-* tests: qa: Added luminous to the mix in schedule_subset.sh (`pr#16430 <https://github.com/ceph/ceph/pull/16430>`_, Yuri Weinstein)
-* tests: qa/added overrides (`pr#14917 <https://github.com/ceph/ceph/pull/14917>`_, Yuri Weinstein)
-* tests: qa: Add reboot case for systemd test (`issue#19717 <http://tracker.ceph.com/issues/19717>`_, `pr#14229 <https://github.com/ceph/ceph/pull/14229>`_, Vasu Kulkarni)
-* tests: qa: add supported distros for ceph-ansible (`pr#13711 <https://github.com/ceph/ceph/pull/13711>`_, Tamil Muthamizhan)
-* tests: qa: add task for dnsmasq configuration (`pr#15071 <https://github.com/ceph/ceph/pull/15071>`_, Casey Bodley)
-* tests: [qa/ceph-deploy]:  run create mgr nodes as well (`pr#16216 <https://github.com/ceph/ceph/pull/16216>`_, Vasu Kulkarni)
-* tests: qa: Cleaned up distros to use `latest` versions (`pr#12804 <https://github.com/ceph/ceph/pull/12804>`_, Yuri Weinstein)
-* tests: qa/distros: make centos_latest 7.3 (`pr#12944 <https://github.com/ceph/ceph/pull/12944>`_, Sage Weil)
-* tests: qa,doc: document and fix tests for pool application warnings (`pr#16568 <https://github.com/ceph/ceph/pull/16568>`_, Sage Weil)
-* tests: qa: do not mention ceph branch explicitly (`pr#13225 <https://github.com/ceph/ceph/pull/13225>`_, Tamil Muthamizhan)
-* tests: qa: do not restrict valgrind runs to centos (`issue#18126 <http://tracker.ceph.com/issues/18126>`_, `pr#15893 <https://github.com/ceph/ceph/pull/15893>`_, Greg Farnum)
-* tests: qa/erasure-code: override min_size to 2 (`issue#19770 <http://tracker.ceph.com/issues/19770>`_, `pr#14872 <https://github.com/ceph/ceph/pull/14872>`_, Kefu Chai)
-* tests: qa: fixed distros links (`pr#12770 <https://github.com/ceph/ceph/pull/12770>`_, Yuri Weinstein)
-* tests: qa/run-standalone.sh: fix the find option to be compatible with GNU find (`pr#16646 <https://github.com/ceph/ceph/pull/16646>`_, Kefu Chai)
-* tests: qa: specify client for fs workunit (`pr#12914 <https://github.com/ceph/ceph/pull/12914>`_, Tamil Muthamizhan)
-* tests: qa: split test_tiering into smaller pieces (`pr#15146 <https://github.com/ceph/ceph/pull/15146>`_, Kefu Chai)
-* tests: qa/suite: Added a smoke suite for ceph-ansible (`pr#12610 <https://github.com/ceph/ceph/pull/12610>`_, Tamil Muthamizhan)
-* tests: qa/suite: replace reference to fs/xfs.yaml (`pr#14756 <https://github.com/ceph/ceph/pull/14756>`_, Yehuda Sadeh)
-* tests: qa/suites/ceph-ansible: removing fs workunit (`pr#12928 <https://github.com/ceph/ceph/pull/12928>`_, Tamil Muthamizhan)
-* tests: qa/suites/{ceph-ansible,rest}: OpenStack volumes (`pr#13672 <https://github.com/ceph/ceph/pull/13672>`_, Zack Cerza)
-* tests: qa/suites/ceph-deploy: Drop OpenStack volume count (`pr#13706 <https://github.com/ceph/ceph/pull/13706>`_, Zack Cerza)
-* tests: qa/suites: drop 'fs' facet, and add 'objectstore' facet where missing (`pr#14198 <https://github.com/ceph/ceph/pull/14198>`_, Sage Weil)
-* tests: qa/suites: escape the parenthesis of the whitelist text (`pr#16722 <https://github.com/ceph/ceph/pull/16722>`_, Kefu Chai)
-* tests: qa/suites: fix upgrade tests vs cluster full thrashing (`pr#13852 <https://github.com/ceph/ceph/pull/13852>`_, Sage Weil)
-* tests: qa/suites/fs: Add openstack volume configuration (`pr#13640 <https://github.com/ceph/ceph/pull/13640>`_, Zack Cerza)
-* tests: qa/suites/jewel-x/point-to-point: don't scane for keys on second s3tests either (`pr#14788 <https://github.com/ceph/ceph/pull/14788>`_, Sage Weil)
-* tests: qa/suites/kcephfs: Openstack volume configuration (`pr#13634 <https://github.com/ceph/ceph/pull/13634>`_, Zack Cerza)
-* tests: qa/suites/{knfs,hadoop,samba}: OpenStack volume configuration (`pr#13637 <https://github.com/ceph/ceph/pull/13637>`_, Zack Cerza)
-* tests: qa/suites/krbd: Add openstack volume configuration (`pr#13631 <https://github.com/ceph/ceph/pull/13631>`_, Zack Cerza)
-* tests: qa/suites/powercycle/osd/whitelist_health: whitelist more (`pr#17306 <https://github.com/ceph/ceph/pull/17306>`_, Sage Weil)
-* tests: qa/suites/powercycle: whitelist health for thrashing (`pr#16759 <https://github.com/ceph/ceph/pull/16759>`_, Sage Weil)
-* tests: qa/suites/rados: a bit more whitelisting (`pr#16820 <https://github.com/ceph/ceph/pull/16820>`_, Sage Weil)
-* tests: qa/suites/rados: fix ec thrashing (`pr#15087 <https://github.com/ceph/ceph/pull/15087>`_, Sage Weil)
-* tests: qa/suites/rados/objectstore: enable experimental features for testing bluestore (`pr#13456 <https://github.com/ceph/ceph/pull/13456>`_, Kefu Chai, Dan Mick)
-* tests: qa/suites/rados/singleton/all/erasure-code-nonregression: fix typo (`pr#16579 <https://github.com/ceph/ceph/pull/16579>`_, Sage Weil)
-* tests: qa/suites/rados/singleton/all/mon-auth-caps: more osds so we can go clean (`pr#16225 <https://github.com/ceph/ceph/pull/16225>`_, Sage Weil)
-* tests: qa/suites/rados/singleton-bluestore: concat settings (`pr#14884 <https://github.com/ceph/ceph/pull/14884>`_, Kefu Chai)
-* tests: qa/suites/rados/singleton-nomsgr/all/multi-backfill-reject: sleep longer (`pr#16739 <https://github.com/ceph/ceph/pull/16739>`_, Sage Weil)
-* tests: qa/suites/rados/singleton-nomsgr: fix syntax (`pr#15276 <https://github.com/ceph/ceph/pull/15276>`_, Sage Weil)
-* tests: qa/suites/rados/thrash: make sure osds have map before legacy scrub (`pr#15117 <https://github.com/ceph/ceph/pull/15117>`_, Sage Weil)
-* tests: qa/suites/rados/upgrade: restart mds (`pr#15517 <https://github.com/ceph/ceph/pull/15517>`_, Sage Weil)
-* tests: qa/suites: Reduce fs combination tests for smoke, use bluestore (`pr#14854 <https://github.com/ceph/ceph/pull/14854>`_, Vasu Kulkarni)
-* tests: qa/suites: Revert "qa/suites: add mon-reweight-min-pgs-per-osd = 4" (`pr#14584 <https://github.com/ceph/ceph/pull/14584>`_, Kefu Chai)
-* tests: qa/suites/rgw: Add openstack volume configuration (`pr#13611 <https://github.com/ceph/ceph/pull/13611>`_, Zack Cerza)
-* tests: qa/suites/upgarde/jewel-x/parallel: more whitelisting (`pr#16849 <https://github.com/ceph/ceph/pull/16849>`_, Sage Weil)
-* tests: qa/suites/upgrade: add tiering test to hammer-jewel-x (`issue#19185 <http://tracker.ceph.com/issues/19185>`_, `pr#13805 <https://github.com/ceph/ceph/pull/13805>`_, Kefu Chai)
-* tests: qa/suites/upgrade/hammer-jewel-x: add luminous.yaml (`issue#20342 <http://tracker.ceph.com/issues/20342>`_, `pr#15764 <https://github.com/ceph/ceph/pull/15764>`_, Kefu Chai)
-* tests: qa/suites/upgrade/jewel-x: add mgr.x role (`pr#14689 <https://github.com/ceph/ceph/pull/14689>`_, Sage Weil)
-* tests: qa/suites/upgrade/jewel-x: misc fixes for new health checks (`pr#16429 <https://github.com/ceph/ceph/pull/16429>`_, Sage Weil)
-* tests: qa/suites/upgrade/kraken-x: do not thrash cluster full during upgrade (`issue#19232 <http://tracker.ceph.com/issues/19232>`_, `pr#13892 <https://github.com/ceph/ceph/pull/13892>`_, Dan Mick)
-* tests: qa/suites/upgrade/kraken-x: misc fixes (`pr#14887 <https://github.com/ceph/ceph/pull/14887>`_, Sage Weil)
-* tests: qa/suites/upgrade/kraken-x (`pr#13517 <https://github.com/ceph/ceph/pull/13517>`_, Sage Weil, Yuri Weinstein)
-* tests: qa/suites/upgrade: set "sortbitwise" for jewel clusters (`pr#15661 <https://github.com/ceph/ceph/pull/15661>`_, Kefu Chai)
-* tests: qa/suite/upgrade/jewel-x: various fixes (`pr#13734 <https://github.com/ceph/ceph/pull/13734>`_, Sage Weil)
-* tests: qa/tasks: assert on pg status with a timeout (`issue#19594 <http://tracker.ceph.com/issues/19594>`_, `pr#14608 <https://github.com/ceph/ceph/pull/14608>`_, Kefu Chai)
-* tests: qa/tasks/ceph: debug osd setup (`pr#16841 <https://github.com/ceph/ceph/pull/16841>`_, Sage Weil)
-* tests: qa/tasks/ceph-deploy: create-keys explicitly (`pr#12867 <https://github.com/ceph/ceph/pull/12867>`_, Vasu Kulkarni)
-* tests: qa/tasks/ceph-deploy: Fix bluestore options for ceph-deploy (`pr#16571 <https://github.com/ceph/ceph/pull/16571>`_, Vasu Kulkarni)
-* tests: qa/tasks/ceph-deploy: use the new create option during instantiation (`pr#12892 <https://github.com/ceph/ceph/pull/12892>`_, Vasu Kulkarni)
-* tests: qa/tasks/ceph: don't hard-code cluster name when copying fsid (`pr#16212 <https://github.com/ceph/ceph/pull/16212>`_, Jason Dillaman)
-* tests: qa/tasks/ceph_manager: always fix pgp_num when done with thrashosd task (`issue#19771 <http://tracker.ceph.com/issues/19771>`_, `pr#14931 <https://github.com/ceph/ceph/pull/14931>`_, Kefu Chai)
-* tests: qa/tasks/ceph_manager: 'ceph $service tell ...' is obsolete (`pr#15252 <https://github.com/ceph/ceph/pull/15252>`_, Sage Weil)
-* tests: qa/tasks/ceph.py: debug which pgs aren't scrubbing (`pr#13649 <https://github.com/ceph/ceph/pull/13649>`_, Sage Weil)
-* tests: qa/tasks/ceph: raise exceptions if scrubbing fails or cannot proceed (`pr#15310 <https://github.com/ceph/ceph/pull/15310>`_, Sage Weil)
-* tests: qa/tasks/ceph: should be "Waiting for all PGs", not "all osds" (`pr#16122 <https://github.com/ceph/ceph/pull/16122>`_, Kefu Chai)
-* tests: qa/tasks/ceph: wait longer for scrub (`pr#16824 <https://github.com/ceph/ceph/pull/16824>`_, Sage Weil)
-* tests: qa/tasks: few fixes to get ceph-deploy 1node to working state (`pr#14400 <https://github.com/ceph/ceph/pull/14400>`_, Vasu Kulkarni)
-* tests: qa/tasks/radosbench: increase timeout (`pr#15885 <https://github.com/ceph/ceph/pull/15885>`_, Sage Weil)
-* tests: qa/tasks/rebuild_mondb: grant "mgr:allow \*" to client.admin (`issue#19439 <http://tracker.ceph.com/issues/19439>`_, `pr#14284 <https://github.com/ceph/ceph/pull/14284>`_, Kefu Chai)
-* tests: qa/tasks/reg11184: use literal 'foo' instead pool_name (`pr#16451 <https://github.com/ceph/ceph/pull/16451>`_, Kefu Chai)
-* tests: qa/tasks/repair_test: unset flags we set (`pr#15296 <https://github.com/ceph/ceph/pull/15296>`_, Sage Weil)
-* tests: qa/tasks/rgw.py: start Apache before RadosGW (`pr#13846 <https://github.com/ceph/ceph/pull/13846>`_, Radoslaw Zarzynski)
-* tests: qa/tasks/thrashosds-health.yaml: ignore MON_DOWN (`issue#20910 <http://tracker.ceph.com/issues/20910>`_, `pr#17003 <https://github.com/ceph/ceph/pull/17003>`_, Sage Weil)
-* tests: qa/tasks: use sudo to check ceph health for systemd test (`pr#14464 <https://github.com/ceph/ceph/pull/14464>`_, Vasu Kulkarni)
-* tests: qa/tasks/workunit.py: use "overrides" as the default settings of workunit (`issue#19429 <http://tracker.ceph.com/issues/19429>`_, `pr#14281 <https://github.com/ceph/ceph/pull/14281>`_, Kefu Chai)
-* tests: qa/tasks/workunit: use ceph.git as an alternative of ceph-ci.git for cloning workunit (`pr#13663 <https://github.com/ceph/ceph/pull/13663>`_, Kefu Chai)
-* tests: qa/tasks/workunit: use the suite repo for cloning workunit (`pr#13452 <https://github.com/ceph/ceph/pull/13452>`_, Kefu Chai)
-* tests: qa/tasks/workunit: use the suite repo for cloning workunit (`pr#13625 <https://github.com/ceph/ceph/pull/13625>`_, Kefu Chai)
-* tests: qa/test_rados_tool.sh: POSIX dd only accepts 'k' as multiplier (`pr#12699 <https://github.com/ceph/ceph/pull/12699>`_, Willem Jan Withagen)
-* tests: qa: timeout when waiting for mgr to be available in healthy() (`pr#16797 <https://github.com/ceph/ceph/pull/16797>`_, Josh Durgin)
-* tests: qa: Using centos 7.2 for `latest` version (`pr#12806 <https://github.com/ceph/ceph/pull/12806>`_, Yuri Weinstein)
-* tests: qa/workunits/ceph-helpers: display rejected string (`issue#20344 <http://tracker.ceph.com/issues/20344>`_, `pr#14468 <https://github.com/ceph/ceph/pull/14468>`_, Kefu Chai)
-* tests: qa/workunits/ceph-helpers: enable experimental features for osd (`pr#16319 <https://github.com/ceph/ceph/pull/16319>`_, Kefu Chai)
-* tests: qa/workunits/ceph-helpers.sh: use syntax understood by jq 1.3 (`pr#15530 <https://github.com/ceph/ceph/pull/15530>`_, Kefu Chai)
-* tests: qa/workunits/ceph-helpers: test wait_for_health_ok differently (`pr#16317 <https://github.com/ceph/ceph/pull/16317>`_, Kefu Chai)
-* tests: qa/workunits/ceph-helpers: wait_for_clean() races with pg creation (`pr#12866 <https://github.com/ceph/ceph/pull/12866>`_, David Zafman)
-* tests: qa/workunits/cephtool/test.sh: Be more liberal in testing health-output (`pr#14614 <https://github.com/ceph/ceph/pull/14614>`_, Willem Jan Withagen)
-* tests: qa/workunits/cephtool/test.sh: "ceph osd stat" output changed, update accordingly (`pr#16444 <https://github.com/ceph/ceph/pull/16444>`_, Willem Jan Withagen, Kefu Chai)
-* tests: qa/workunits/cephtool/test.sh: disable 'fs status' until bug is fixed (`issue#20761 <http://tracker.ceph.com/issues/20761>`_, `pr#16541 <https://github.com/ceph/ceph/pull/16541>`_, Sage Weil)
-* tests: qa/workunits/cephtool/test.sh: fix test to watch audit channel (`pr#16470 <https://github.com/ceph/ceph/pull/16470>`_, Sage Weil)
-* tests: qa/workunits/cephtool/test.sh: only include last line for epoch (`issue#20477 <http://tracker.ceph.com/issues/20477>`_, `pr#15770 <https://github.com/ceph/ceph/pull/15770>`_, Kefu Chai)
-* tests: qa/workunits/rados/test.sh: print test name when it fails (`pr#13264 <https://github.com/ceph/ceph/pull/13264>`_, Kefu Chai)
-* tests: rados: move cephtool.yaml to new singleton/bluestore subsuite (`issue#19797 <http://tracker.ceph.com/issues/19797>`_, `pr#14847 <https://github.com/ceph/ceph/pull/14847>`_, Nathan Cutler)
-* tests: rbd/test_lock_fence.sh: fix rbdrw.py relative path (`issue#18388 <http://tracker.ceph.com/issues/18388>`_, `pr#12747 <https://github.com/ceph/ceph/pull/12747>`_, Nathan Cutler)
-* tests: re-enable cephfs python tests on kclient (`issue#17193 <http://tracker.ceph.com/issues/17193>`_, `issue#18161 <http://tracker.ceph.com/issues/18161>`_, `pr#13200 <https://github.com/ceph/ceph/pull/13200>`_, Nathan Cutler)
-* tests: remove temporary file (`pr#12919 <https://github.com/ceph/ceph/pull/12919>`_, Kefu Chai)
-* tests: Revert "dummy: reduce run time, run user.yaml playbook" (`issue#18259 <http://tracker.ceph.com/issues/18259>`_, `pr#12506 <https://github.com/ceph/ceph/pull/12506>`_, Nathan Cutler)
-* tests: Revert "qa/tasks/workunit: use the suite repo for cloning workunit" (`pr#13495 <https://github.com/ceph/ceph/pull/13495>`_, Sage Weil)
-* tests: rgw.py: put client roles in a separate list (`issue#20417 <http://tracker.ceph.com/issues/20417>`_, `pr#15913 <https://github.com/ceph/ceph/pull/15913>`_, Nathan Cutler)
-* tests: rgw/singleton: drop duplicate filestore-xfs.yaml (`pr#15959 <https://github.com/ceph/ceph/pull/15959>`_, Nathan Cutler)
-* tests: set -x in suites/iozone.sh workunit (`issue#19740 <http://tracker.ceph.com/issues/19740>`_, `pr#14713 <https://github.com/ceph/ceph/pull/14713>`_, Nathan Cutler)
-* tests: src/test/test_denc.cc: Fix errors in buffer overflow (`pr#12653 <https://github.com/ceph/ceph/pull/12653>`_, Willem Jan Withagen)
-* tests: subst repo and branch in git.ceph.com URL in qa/tasks/cram.py and qa/tasks/qemu.py (`issue#18440 <http://tracker.ceph.com/issues/18440>`_, `pr#12816 <https://github.com/ceph/ceph/pull/12816>`_, Nathan Cutler)
-* tests: tasks/workunit.py: when cloning, use --depth=1 (`pr#14214 <https://github.com/ceph/ceph/pull/14214>`_, Dan Mick)
-* tests: test: add explicit braces to avoid ambiguous ‘else’ and to silence warnings (`pr#14472 <https://github.com/ceph/ceph/pull/14472>`_, Jos Collin)
-* tests: test: add override in test submodule (`pr#13773 <https://github.com/ceph/ceph/pull/13773>`_, liuchang0812)
-* tests: test: ceph osd stat out has changed, fix tests for that (`pr#16403 <https://github.com/ceph/ceph/pull/16403>`_, Willem Jan Withagen)
-* tests: test:Check make_writeable() return value (`pr#15266 <https://github.com/ceph/ceph/pull/15266>`_, zhanglei)
-* tests: test: clean up unused variable (`pr#12873 <https://github.com/ceph/ceph/pull/12873>`_, liuchang0812)
-* tests: test/CMakeLists: disable test_pidfile.sh (`issue#20975 <http://tracker.ceph.com/issues/20975>`_, `pr#17241 <https://github.com/ceph/ceph/pull/17241>`_, Sage Weil)
-* tests: test/compressor: disable isal tests if not available (`pr#14929 <https://github.com/ceph/ceph/pull/14929>`_, Kefu Chai)
-* tests: test: c_read_operations.cc: silence warning from -Wsign-compare (`pr#14888 <https://github.com/ceph/ceph/pull/14888>`_, Jos Collin)
-* tests: test: create asok files in a temp directory under $TMPDIR (`issue#16895 <http://tracker.ceph.com/issues/16895>`_, `pr#16445 <https://github.com/ceph/ceph/pull/16445>`_, Kefu Chai)
-* tests: test/crush: silence warnings from -Walloc-size-larger-than= and -Wstringop-overflow (`pr#15173 <https://github.com/ceph/ceph/pull/15173>`_, Jos Collin)
-* tests: test: c_write_operations.cc: silence warning from -Wsign-compare (`pr#14889 <https://github.com/ceph/ceph/pull/14889>`_, Jos Collin)
-* tests: test: Division by zero in Legacy::encode_n() (`pr#15902 <https://github.com/ceph/ceph/pull/15902>`_, Jos Collin)
-* tests: test/encoding: fix readable.sh bugs; fix ceph-object-corpus (`pr#13678 <https://github.com/ceph/ceph/pull/13678>`_, Sage Weil)
-* tests: test/fio_ceph_objectstore: fix fio plugin build failure by engine_data (`pr#15044 <https://github.com/ceph/ceph/pull/15044>`_, lisali)
-* tests: test/fio: Fix assert in set_cache_shards in bluestore fio (`pr#15659 <https://github.com/ceph/ceph/pull/15659>`_, Xiaoyan Li)
-* tests: test/fio: fix lack of setting for Sequencer::shard_hint (`pr#15571 <https://github.com/ceph/ceph/pull/15571>`_, Igor Fedotov)
-* tests: test/fio: print all perfcounters rather than objectstore itself (`pr#16339 <https://github.com/ceph/ceph/pull/16339>`_, Jianpeng Ma)
-* tests: test/fio: remove experimental option for bluestore & rocksdb (`pr#16263 <https://github.com/ceph/ceph/pull/16263>`_, Pan Liu)
-* tests: test: Fixes for test_pidfile (`issue#20770 <http://tracker.ceph.com/issues/20770>`_, `pr#16587 <https://github.com/ceph/ceph/pull/16587>`_, David Zafman)
-* tests: test: fixing assert that creates warning: comparison between signed and unsigned integer expressions (`pr#14794 <https://github.com/ceph/ceph/pull/14794>`_, Jos Collin)
-* tests: test: Fix mismatched sign comparison in histogram test (`pr#13362 <https://github.com/ceph/ceph/pull/13362>`_, Adam C. Emerson)
-* tests: test: Fix reg11184 test to remove extraneous pg (`pr#16265 <https://github.com/ceph/ceph/pull/16265>`_, David Zafman)
-* tests: test: fix test_pidfile (`pr#13646 <https://github.com/ceph/ceph/pull/13646>`_, yaoning)
-* tests: test/fsx:  Remove the dead code associated with aio backend (`pr#14905 <https://github.com/ceph/ceph/pull/14905>`_, Zhou Zhengping)
-* tests: test: Initialize pointer variables in TestMemIoCtxImpl (`pr#16785 <https://github.com/ceph/ceph/pull/16785>`_, amitkuma)
-* tests: test/librados: Initialize member variables in aio.cc (`pr#16845 <https://github.com/ceph/ceph/pull/16845>`_, amitkuma)
-* tests: test: librados_test_stub: tmap_update: return -ENOENT when removing nonexisent key (`pr#12667 <https://github.com/ceph/ceph/pull/12667>`_, Mykola Golub)
-* tests: test: migrate atomic_t to std::atomic (`pr#14655 <https://github.com/ceph/ceph/pull/14655>`_, Jesse Williamson)
-* tests: test,mon,msg: kill clang analyzer warnings (`pr#16320 <https://github.com/ceph/ceph/pull/16320>`_, Kefu Chai)
-* tests: test/mon: silence warnings from -Wreorder (`pr#15692 <https://github.com/ceph/ceph/pull/15692>`_, Jos Collin)
-* tests: test/msgr: fixed the hang issue for perf_msg_client (`pr#16358 <https://github.com/ceph/ceph/pull/16358>`_, Pan Liu)
-* tests: test/msgr: silence warnings from -Wsign-compare (`pr#15356 <https://github.com/ceph/ceph/pull/15356>`_, Jos Collin)
-* tests: test/msgr: silence warnings from -Wsign-compare (`pr#15570 <https://github.com/ceph/ceph/pull/15570>`_, Jos Collin)
-* tests: test: objectstore: chain_xattr: fix wrong memset usage to fill buf (`pr#14277 <https://github.com/ceph/ceph/pull/14277>`_, Weibing Zhang)
-* tests: test/objectstore: Check apply_transaction() return values (`pr#15171 <https://github.com/ceph/ceph/pull/15171>`_, zhanglei)
-* tests: test/objectstore/: Check put_ref return value (`pr#15007 <https://github.com/ceph/ceph/pull/15007>`_, zhanglei)
-* tests: test/old: Removed commented code (`pr#15366 <https://github.com/ceph/ceph/pull/15366>`_, Jos Collin)
-* tests: test/osdc: fix comparison error and silence warning from -Wunused-value (`pr#15353 <https://github.com/ceph/ceph/pull/15353>`_, Willem Jan Withagen)
-* tests: test/osd: kill compile warning (`pr#16669 <https://github.com/ceph/ceph/pull/16669>`_, Yan Jun)
-* tests: test/osd/osd-dup.sh: lower wb fd throttle limits (`pr#14984 <https://github.com/ceph/ceph/pull/14984>`_, Dan Mick)
-* tests: test/osd/osd-dup.sh: use wait_for_clean (`pr#15722 <https://github.com/ceph/ceph/pull/15722>`_, Dan Mick)
-* tests: test/osd/osd-scrub-repair.sh: disable ec_overwrite tests on FreeBSD (`pr#15445 <https://github.com/ceph/ceph/pull/15445>`_, Willem Jan Withagen)
-* tests: test/osd/osd-scrub-repair.sh: Fix diff options on FreeBSD (`pr#15914 <https://github.com/ceph/ceph/pull/15914>`_, Willem Jan Withagen)
-* tests: test/osd: Removed Commented Code - 2 (`issue#20207 <http://tracker.ceph.com/issues/20207>`_, `pr#15540 <https://github.com/ceph/ceph/pull/15540>`_, Jos Collin)
-* tests: test: osd/TestOSDMap.cc: fix Clang complain about promotion (`pr#15525 <https://github.com/ceph/ceph/pull/15525>`_, Willem Jan Withagen)
-* tests: test/rados: fix wrong parameter order of RETURN1_IF_NOT_VAL (`pr#16589 <https://github.com/ceph/ceph/pull/16589>`_, Yan Jun)
-* tests: test: reg11184 might not always find pg 2.0 prior to import (`pr#16610 <https://github.com/ceph/ceph/pull/16610>`_, David Zafman)
-* tests: test: Rename FileJournal object to distinguish (`pr#15279 <https://github.com/ceph/ceph/pull/15279>`_, Jos Collin)
-* tests: test: replace hard-code binary names with varibles (`pr#12675 <https://github.com/ceph/ceph/pull/12675>`_, liuchang0812)
-* tests: test: sed on FreeBSD requires "-i extension", so use gsed (`pr#13903 <https://github.com/ceph/ceph/pull/13903>`_, Willem Jan Withagen)
-* tests: test: s/osd_objectstore_type/osd_objectstore (`pr#16469 <https://github.com/ceph/ceph/pull/16469>`_, xie xingguo)
-* tests: test: test_denc.cc: silence warning from -Wsign-compare (`pr#15355 <https://github.com/ceph/ceph/pull/15355>`_, Jos Collin)
-* tests: test: Test fix for SnapSet change (`pr#15161 <https://github.com/ceph/ceph/pull/15161>`_, David Zafman)
-* tests: test: test_pidfile running 2nd mon has unreliable log output (`pr#16635 <https://github.com/ceph/ceph/pull/16635>`_, David Zafman)
-* tests: test: Thrasher: do not update pools_to_fix_pgp_num if nothing happens (`pr#13518 <https://github.com/ceph/ceph/pull/13518>`_, Kefu Chai)
-* tests: test: Thrasher: update pgp_num of all expanded pools if not yet (`pr#13367 <https://github.com/ceph/ceph/pull/13367>`_, Kefu Chai)
-* tests: test/unittest_bluefs: check whether mounted success (`pr#14988 <https://github.com/ceph/ceph/pull/14988>`_, shiqi)
-* tests: test/unittest_bluefs: remove unused variable (`pr#14006 <https://github.com/ceph/ceph/pull/14006>`_, shiqi)
-* tests: test: unittest_hostname compile error on freebsd (`pr#13739 <https://github.com/ceph/ceph/pull/13739>`_, liuchang0812)
-* tests: test: update test_rados_tool.sh, use POOL and OBJ var (`pr#12706 <https://github.com/ceph/ceph/pull/12706>`_, liuchang0812)
-* tests: test: use 7130 for crush-classes.sh (`pr#14783 <https://github.com/ceph/ceph/pull/14783>`_, Loic Dachary)
-* tests: test/vstart_wrapper.sh: display_log on test failure (`pr#15620 <https://github.com/ceph/ceph/pull/15620>`_, Kefu Chai)
-* tests: test: warning: comparison between signed and unsigned integer expressions (`pr#14705 <https://github.com/ceph/ceph/pull/14705>`_, Jos Collin)
-* tests: Thrasher: eliminate a race between kill_osd and __init__ (`issue#18799 <http://tracker.ceph.com/issues/18799>`_, `pr#13237 <https://github.com/ceph/ceph/pull/13237>`_, Nathan Cutler)
-* tests: Thrasher: handle "OSD has the store locked" gracefully (`issue#19556 <http://tracker.ceph.com/issues/19556>`_, `pr#14415 <https://github.com/ceph/ceph/pull/14415>`_, Nathan Cutler)
-* tests,tools: script/find_dups_in_pg_log: scrip to find dup requests due to short pg logs (`pr#13417 <https://github.com/ceph/ceph/pull/13417>`_, Sage Weil)
-* tests,tools: test, ceph-osdomap-tool: kill clang warnings (`pr#15905 <https://github.com/ceph/ceph/pull/15905>`_, Kefu Chai)
-* tests,tools: test: kill warnings (`pr#14892 <https://github.com/ceph/ceph/pull/14892>`_, Kefu Chai)
-* tests: update SUSE yaml facets in qa/distros/all (`issue#18856 <http://tracker.ceph.com/issues/18856>`_, `pr#13313 <https://github.com/ceph/ceph/pull/13313>`_, Nathan Cutler)
-* tests: workunit: request branch when cloning (`pr#14260 <https://github.com/ceph/ceph/pull/14260>`_, Kefu Chai, Dan Mick)
-* tools: add override in tool submodule (`pr#13776 <https://github.com/ceph/ceph/pull/13776>`_, liuchang0812)
-* tools: brag: count the number of mds in fsmap not in mdsmap (`issue#19192 <http://tracker.ceph.com/issues/19192>`_, `pr#13798 <https://github.com/ceph/ceph/pull/13798>`_, Peng Zhang)
-* tools: ceph_common.sh: fix syntax error (`issue#17826 <http://tracker.ceph.com/issues/17826>`_, `pr#13419 <https://github.com/ceph/ceph/pull/13419>`_, Dan Mick)
-* tools: ceph-conf: fix typo in usage: 'mon add' should be 'mon addr' (`pr#15935 <https://github.com/ceph/ceph/pull/15935>`_, Peng Zhang)
-* tools: ceph-create-keys: add an argument to override default 10-minute timeout (`pr#16049 <https://github.com/ceph/ceph/pull/16049>`_, Douglas Fuller)
-* tools: ceph-detect-init: adding Arch Linux support (`pr#12787 <https://github.com/ceph/ceph/pull/12787>`_, Jamin W. Collins)
-* tools: ceph-detect-init: Adds Oracle Linux Server and Oracle VM Server detect (`pr#13917 <https://github.com/ceph/ceph/pull/13917>`_, Nikita Gerasimov)
-* tools: ceph-detect-init: detect init system by poking the system (`issue#19884 <http://tracker.ceph.com/issues/19884>`_, `pr#15043 <https://github.com/ceph/ceph/pull/15043>`_, Kefu Chai)
-* tools: ceph-disk: Add fix subcommand (`pr#13310 <https://github.com/ceph/ceph/pull/13310>`_, Boris Ranto)
-* tools: ceph-disk: change the lockbox partition number to 5 (`issue#20556 <http://tracker.ceph.com/issues/20556>`_, `pr#16247 <https://github.com/ceph/ceph/pull/16247>`_, Shangzhong Zhu)
-* tools: ceph-disk: command invocation needs all fields separate (`pr#15733 <https://github.com/ceph/ceph/pull/15733>`_, Willem Jan Withagen)
-* tools: ceph-disk: convert none str to str before printing it (`issue#18371 <http://tracker.ceph.com/issues/18371>`_, `pr#12760 <https://github.com/ceph/ceph/pull/12760>`_, Kefu Chai)
-* tools: ceph-disk: do not remove mount point if deactive --once (`pr#16474 <https://github.com/ceph/ceph/pull/16474>`_, Song Shun)
-* tools: ceph-disk: Fix for missing 'not' in \*_is_diskdevice checks (`issue#20706 <http://tracker.ceph.com/issues/20706>`_, `pr#16481 <https://github.com/ceph/ceph/pull/16481>`_, Nikita Gerasimov)
-* tools: ceph_disk/main.py: FreeBSD root has wheel for group (`pr#16609 <https://github.com/ceph/ceph/pull/16609>`_, Willem Jan Withagen)
-* tools: ceph-disk: s/ceph_osd_mkfs/command_check_call/ (`issue#20685 <http://tracker.ceph.com/issues/20685>`_, `pr#16427 <https://github.com/ceph/ceph/pull/16427>`_, Zhu Shangzhong)
-* tools: ceph.in: add help for locally-handled commands (`pr#13288 <https://github.com/ceph/ceph/pull/13288>`_, Dan Mick)
-* tools: ceph.in: adjust usage width according to user's tty (`pr#15190 <https://github.com/ceph/ceph/pull/15190>`_, Kefu Chai)
-* tools: ceph.in: assert(state==connected) before help_for_target() (`pr#15156 <https://github.com/ceph/ceph/pull/15156>`_, Kefu Chai)
-* tools: ceph.in: drop the compatiiblity to handle non json commands (`pr#15508 <https://github.com/ceph/ceph/pull/15508>`_, Kefu Chai)
-* tools: ceph.in: filter out audit from ceph -w (`pr#16345 <https://github.com/ceph/ceph/pull/16345>`_, John Spray)
-* tools: ceph.in, mgr: misc cleanups (`pr#16229 <https://github.com/ceph/ceph/pull/16229>`_, liuchang0812)
-* tools: ceph.in: print return code when json_command failed (`pr#15378 <https://github.com/ceph/ceph/pull/15378>`_, liuchang0812)
-* tools: ceph-objectstore-tool: Handle object names that are also valid json (`pr#12848 <https://github.com/ceph/ceph/pull/12848>`_, David Zafman)
-* tools: ceph-release-notes: escape asterisks not for inline emphasis (`pr#16199 <https://github.com/ceph/ceph/pull/16199>`_, Kefu Chai)
-* tools: ceph-release-notes: escape _ for unintended links (`issue#17499 <http://tracker.ceph.com/issues/17499>`_, `pr#16528 <https://github.com/ceph/ceph/pull/16528>`_, Kefu Chai)
-* tools: ceph-release-notes: handle an edge case (`pr#16277 <https://github.com/ceph/ceph/pull/16277>`_, Nathan Cutler)
-* tools: ceph-release-notes: ignore low-numbered PRs (`issue#18695 <http://tracker.ceph.com/issues/18695>`_, `pr#13151 <https://github.com/ceph/ceph/pull/13151>`_, Nathan Cutler)
-* tools: ceph-release-notes: port it to py3 (`pr#16261 <https://github.com/ceph/ceph/pull/16261>`_, Kefu Chai)
-* tools: ceph-release-notes: prefixes and pep8 compliance (`pr#14156 <https://github.com/ceph/ceph/pull/14156>`_, Nathan Cutler)
-* tools: ceph-release-notes: refactor and fix regressions (`pr#16411 <https://github.com/ceph/ceph/pull/16411>`_, Nathan Cutler)
-* tools: ceph-release-notes: strip trailing punctuation (`pr#14385 <https://github.com/ceph/ceph/pull/14385>`_, Nathan Cutler)
-* tools: ceph-rest-api: be more tolerant on network failure (`issue#20115 <http://tracker.ceph.com/issues/20115>`_, `pr#15706 <https://github.com/ceph/ceph/pull/15706>`_, Kefu Chai)
-* tools: ceph-volume: adds functional CI testing #16919 (`pr#16970 <https://github.com/ceph/ceph/pull/16970>`_, Andrew Schoen, Alfredo Deza)
-* tools: ceph-volume docs (`pr#17124 <https://github.com/ceph/ceph/pull/17124>`_, Alfredo Deza)
-* tools: ceph-volume: initial take on ceph-volume CLI tool (`pr#16632 <https://github.com/ceph/ceph/pull/16632>`_, Dan Mick, Alfredo Deza)
-* tools: ceph-volume: Use a delimited CLI output parser instead of JSON (`pr#17123 <https://github.com/ceph/ceph/pull/17123>`_, Alfredo Deza)
-* tools: change compare_exchange_weak to compare_exchange_strong (`pr#15030 <https://github.com/ceph/ceph/pull/15030>`_, Jesse Williamson)
-* tools: Cleanup dead code in ceph-objectstore-tool (`pr#15812 <https://github.com/ceph/ceph/pull/15812>`_, David Zafman)
-* tools: fio_ceph_objectstore: Print db_statistics when rocksdb_perf is enabled (`pr#15796 <https://github.com/ceph/ceph/pull/15796>`_, Xiaoyan Li)
-* tools: init-ceph: print trailing n in "status" output (`pr#13351 <https://github.com/ceph/ceph/pull/13351>`_, Kefu Chai)
-* tools: init-ceph: should have a space before "]" (`pr#14796 <https://github.com/ceph/ceph/pull/14796>`_, Kefu Chai)
-* tools: os/bluestore/bluestore_tool: add sanity check to get rid of occasionally crash (`pr#16013 <https://github.com/ceph/ceph/pull/16013>`_, xie xingguo)
-* tools: rados: check for negative return value of rados_create_with_context() as its comment put (`pr#10893 <https://github.com/ceph/ceph/pull/10893>`_, zhang.zezhu)
-* tools: rados: fix typo in 'df' column name (`pr#15603 <https://github.com/ceph/ceph/pull/15603>`_, Ilya Dryomov)
-* tools: rados: out json 'df' values as numbers, not strings (`issue#15546 <http://tracker.ceph.com/issues/15546>`_, `pr#14644 <https://github.com/ceph/ceph/pull/14644>`_, Sage Weil)
-* tools: script: add docker core dump debugger (`pr#16375 <https://github.com/ceph/ceph/pull/16375>`_, Patrick Donnelly)
-* tools: script: ceph-release-notes check orig. issue only for backports (`pr#12979 <https://github.com/ceph/ceph/pull/12979>`_, Abhishek Lekshmanan)
-* tools: script/sepia_bt.sh: no need to pass version and sha1 anymore (`pr#13380 <https://github.com/ceph/ceph/pull/13380>`_, Kefu Chai)
-* tools: src/ceph-disk/ceph_disk/main.py: Make 'ceph-disk list' work on FreeBSD (`pr#14483 <https://github.com/ceph/ceph/pull/14483>`_, Willem Jan Withagen)
-* tools: stop.sh: boilerplate error (don't stop mon when stopping mgr) (`pr#14461 <https://github.com/ceph/ceph/pull/14461>`_, Dan Mick)
-* tools: support hammer in rbd_recover_tool (`pr#12413 <https://github.com/ceph/ceph/pull/12413>`_, Bartłomiej Święcki)
-* tools: tools/ceph_kvstore_tool: add "bluestore-kv" to usage (`pr#15326 <https://github.com/ceph/ceph/pull/15326>`_, xie xingguo)
-* tools: tools/crushtool: replicated-rule API support (`pr#15011 <https://github.com/ceph/ceph/pull/15011>`_, xie xingguo)
-* tools: tools/rados: add a parameter "--offset" to rados put command (`pr#12674 <https://github.com/ceph/ceph/pull/12674>`_, liuchang0812)
-* tools: tools/rados: Check return value of connect (`issue#19319 <http://tracker.ceph.com/issues/19319>`_, `pr#14057 <https://github.com/ceph/ceph/pull/14057>`_, Brad Hubbard)
-* tools: tools/rados: fixed typo in help information (`pr#15618 <https://github.com/ceph/ceph/pull/15618>`_, Pan Liu)
-* tools: tools/rados: remove useless function declaration (`pr#12566 <https://github.com/ceph/ceph/pull/12566>`_, liuchang0812)
-* tools: tools/rados: some cleanups (`pr#16147 <https://github.com/ceph/ceph/pull/16147>`_, Yan Jun)
-* tools: vstart: "debug_ms=1" for mgr by default (`pr#15127 <https://github.com/ceph/ceph/pull/15127>`_, Kefu Chai)
-* tools: vstart: don't configure rgw_dns_name (`pr#13411 <https://github.com/ceph/ceph/pull/13411>`_, Yehuda Sadeh)
-* tools: vstart: don't create cluster by default (`pr#13891 <https://github.com/ceph/ceph/pull/13891>`_, Yehuda Sadeh)
-* tools: vstart: print "start osd.$id" instead of "start osd$id" (`pr#15427 <https://github.com/ceph/ceph/pull/15427>`_, Kefu Chai)
-* tools: vstart.sh: bind restful, dashboard to ::, not 127.0.0.1 (`pr#16349 <https://github.com/ceph/ceph/pull/16349>`_, Sage Weil)
-* tools: vstart.sh: do not add host for mgr.\* section if not $overwrite_conf (`pr#13767 <https://github.com/ceph/ceph/pull/13767>`_, Kefu Chai)
-* tools: warning, ‘%.16x’ directive output truncated writing 16 bytes into a region of size 9 (`pr#14292 <https://github.com/ceph/ceph/pull/14292>`_, Jos Collin)
-* tracing: don't include oid when tracing at dequeue_op() (`pr#13410 <https://github.com/ceph/ceph/pull/13410>`_, Yehuda Sadeh)
diff --git a/ceph/doc/releases/mimic.rst b/ceph/doc/releases/mimic.rst
deleted file mode 100644 (file)
index c811556..0000000
+++ /dev/null
@@ -1,4475 +0,0 @@
-=====
-Mimic
-=====
-
-Mimic is the 13th stable release of Ceph.  It is named after the mimic
-octopus (thaumoctopus mimicus).
-
-v13.2.10 Mimic
-==============
-
-This is the tenth bugfix release of Ceph Mimic, this release fixes a RGW
-vulnerability affecting mimic, and we recommend that all mimic users upgrade.
-
-Notable Changes
----------------
-* CVE 2020 12059: Fix an issue with Post Object Requests with Tagging
-  (`issue#44967 <http://tracker.ceph.com/issues/44967>`_, Lei Cao, Abhishek
-  Lekshmanan)
-
-v13.2.9 Mimic
-=============
-
-This is the ninth and very likely the last stable release in the Ceph Mimic
-stable release series. This release fixes bugs across all components and also
-contains a RGW security fix. We recommend all mimic users to upgrade to this
-version.
-
-Notable Changes
----------------
-
-* CVE-2020-1760: Fixed XSS due to RGW GetObject header-splitting
-
-* The configuration value ``osd_calc_pg_upmaps_max_stddev`` used for upmap
-  balancing has been removed. Instead use the mgr balancer config
-  ``upmap_max_deviation`` which now is an integer number of PGs of deviation
-  from the target PGs per OSD.  This can be set with a command like
-  ``ceph config set mgr mgr/balancer/upmap_max_deviation 2``.  The default
-  ``upmap_max_deviation`` is 1.  There are situations where crush rules
-  would not allow a pool to ever have completely balanced PGs.  For example, if
-  crush requires 1 replica on each of 3 racks, but there are fewer OSDs in 1 of
-  the racks.  In those cases, the configuration value can be increased.
-
-* The ``cephfs-data-scan scan_links`` command now automatically repair inotables
-  and snaptable.
-
-
-Changelog
----------
-
-* bluestore: os/bluestore: fix improper setting of STATE_KV_SUBMITTED (`pr#31673 <https://github.com/ceph/ceph/pull/31673>`_, Igor Fedotov)
-* ceph-volume/batch: check lvs list before access (`pr#34479 <https://github.com/ceph/ceph/pull/34479>`_, Jan Fajerski)
-* ceph-volume/batch: fail on filtered devices when non-interactive (`pr#33201 <https://github.com/ceph/ceph/pull/33201>`_, Jan Fajerski)
-* ceph-volume/batch: return success when all devices are filtered (`pr#34476 <https://github.com/ceph/ceph/pull/34476>`_, Jan Fajerski)
-* ceph-volume/lvm/activate.py: clarify error message: fsid refers to osd_fsid (`pr#32865 <https://github.com/ceph/ceph/pull/32865>`_, Yaniv Kaul)
-* ceph-volume/test: patch VolumeGroups (`pr#32559 <https://github.com/ceph/ceph/pull/32559>`_, Jan Fajerski)
-* ceph-volume: Dereference symlink in lvm list (`pr#32876 <https://github.com/ceph/ceph/pull/32876>`_, Benoît Knecht)
-* ceph-volume: add db and wal support to raw mode (`pr#33622 <https://github.com/ceph/ceph/pull/33622>`_, Sébastien Han)
-* ceph-volume: add methods to pass filters to pvs, vgs and lvs commands (`pr#33215 <https://github.com/ceph/ceph/pull/33215>`_, Rishabh Dave)
-* ceph-volume: add proper size attribute to partitions (`pr#32529 <https://github.com/ceph/ceph/pull/32529>`_, Jan Fajerski)
-* ceph-volume: add raw mode (`pr#33580 <https://github.com/ceph/ceph/pull/33580>`_, Jan Fajerski, Sage Weil, Guillaume Abrioux)
-* ceph-volume: add sizing arguments to prepare (`pr#33578 <https://github.com/ceph/ceph/pull/33578>`_, Jan Fajerski)
-* ceph-volume: add utility functions (`pr#32544 <https://github.com/ceph/ceph/pull/32544>`_, Mohamad Gebai)
-* ceph-volume: allow raw block devices everywhere (`pr#32869 <https://github.com/ceph/ceph/pull/32869>`_, Jan Fajerski)
-* ceph-volume: allow to skip restorecon calls (`pr#32530 <https://github.com/ceph/ceph/pull/32530>`_, Alfredo Deza)
-* ceph-volume: avoid calling zap_lv with a LV-less VG (`pr#33610 <https://github.com/ceph/ceph/pull/33610>`_, Jan Fajerski)
-* ceph-volume: batch bluestore fix create_lvs call (`pr#33579 <https://github.com/ceph/ceph/pull/33579>`_, Jan Fajerski)
-* ceph-volume: batch bluestore fix create_lvs call (`pr#33623 <https://github.com/ceph/ceph/pull/33623>`_, Jan Fajerski)
-* ceph-volume: check if we run in an selinux environment (`pr#32866 <https://github.com/ceph/ceph/pull/32866>`_, Jan Fajerski)
-* ceph-volume: check if we run in an selinux environment, now also in py2 (`pr#32867 <https://github.com/ceph/ceph/pull/32867>`_, Jan Fajerski)
-* ceph-volume: devices/simple/scan: Fix string in log statement (`pr#34444 <https://github.com/ceph/ceph/pull/34444>`_, Jan Fajerski)
-* ceph-volume: don't create osd['block.db'] by default (`pr#33626 <https://github.com/ceph/ceph/pull/33626>`_, Jan Fajerski)
-* ceph-volume: don't remove vg twice when zapping filestore (`pr#33615 <https://github.com/ceph/ceph/pull/33615>`_, Jan Fajerski)
-* ceph-volume: finer grained availability notion in inventory (`pr#33606 <https://github.com/ceph/ceph/pull/33606>`_, Jan Fajerski)
-* ceph-volume: fix is_ceph_device for lvm batch (`pr#33608 <https://github.com/ceph/ceph/pull/33608>`_, Jan Fajerski, Dimitri Savineau)
-* ceph-volume: fix the integer overflow (`pr#32872 <https://github.com/ceph/ceph/pull/32872>`_, dongdong tao)
-* ceph-volume: import mock.mock instead of unittest.mock (py2) (`pr#32871 <https://github.com/ceph/ceph/pull/32871>`_, Jan Fajerski)
-* ceph-volume: lvm deactivate command (`pr#33208 <https://github.com/ceph/ceph/pull/33208>`_, Jan Fajerski)
-* ceph-volume: lvm/deactivate: add unit tests, remove --all (`pr#32862 <https://github.com/ceph/ceph/pull/32862>`_, Jan Fajerski)
-* ceph-volume: lvm: get_device_vgs() filter by provided prefix (`pr#33617 <https://github.com/ceph/ceph/pull/33617>`_, Jan Fajerski, Yehuda Sadeh)
-* ceph-volume: make get_devices fs location independent (`pr#33124 <https://github.com/ceph/ceph/pull/33124>`_, Jan Fajerski)
-* ceph-volume: minor clean-up of "simple scan" subcommand help (`pr#32557 <https://github.com/ceph/ceph/pull/32557>`_, Michael Fritch)
-* ceph-volume: mokeypatch calls to lvm related binaries (`pr#31406 <https://github.com/ceph/ceph/pull/31406>`_, Jan Fajerski)
-* ceph-volume: pass journal_size as Size not string (`pr#33611 <https://github.com/ceph/ceph/pull/33611>`_, Jan Fajerski)
-* ceph-volume: rearrange api/lvm.py (`pr#31407 <https://github.com/ceph/ceph/pull/31407>`_, Rishabh Dave)
-* ceph-volume: refactor listing.py + fixes (`pr#33603 <https://github.com/ceph/ceph/pull/33603>`_, Jan Fajerski, Rishabh Dave, Theofilos Mouratidis, Guillaume Abrioux)
-* ceph-volume: reject disks smaller then 5GB in inventory (`issue#40776 <http://tracker.ceph.com/issues/40776>`_, `pr#32528 <https://github.com/ceph/ceph/pull/32528>`_, Jan Fajerski)
-* ceph-volume: silence 'ceph-bluestore-tool' failures (`pr#33605 <https://github.com/ceph/ceph/pull/33605>`_, Sébastien Han)
-* ceph-volume: skip missing interpreters when running tox tests (`pr#33489 <https://github.com/ceph/ceph/pull/33489>`_, Andrew Schoen)
-* ceph-volume: skip osd creation when already done (`pr#33607 <https://github.com/ceph/ceph/pull/33607>`_, Guillaume Abrioux)
-* ceph-volume: strip _dmcrypt suffix in simple scan json output (`pr#33618 <https://github.com/ceph/ceph/pull/33618>`_, Jan Fajerski)
-* ceph-volume: use correct extents if using db-devices and >1 osds_per_device (`pr#32875 <https://github.com/ceph/ceph/pull/32875>`_, Fabian Niepelt)
-* ceph-volume: use fsync for dd command (`pr#31552 <https://github.com/ceph/ceph/pull/31552>`_, Rishabh Dave)
-* ceph-volume: use get_device_vgs in has_common_vg (`pr#33609 <https://github.com/ceph/ceph/pull/33609>`_, Jan Fajerski)
-* ceph-volume: util: look for executable in $PATH (`pr#32861 <https://github.com/ceph/ceph/pull/32861>`_, Shyukri Shyukriev)
-* cephfs: cephfs: osdc/objecter: Fix last_sent in scientific format and add age to ops (`pr#31384 <https://github.com/ceph/ceph/pull/31384>`_, Varsha Rao)
-* cephfs: cephfs: test_volume_client: declare only one default for python version (`issue#40460 <http://tracker.ceph.com/issues/40460>`_, `pr#30110 <https://github.com/ceph/ceph/pull/30110>`_, Rishabh Dave)
-* cephfs: client: more precise CEPH_CLIENT_CAPS_PENDING_CAPSNAP (`pr#31283 <https://github.com/ceph/ceph/pull/31283>`_, "Yan, Zheng")
-* cephfs: client: remove Inode.dir_contacts field and handle bad whence value to llseek gracefully (`pr#31380 <https://github.com/ceph/ceph/pull/31380>`_, Jeff Layton)
-* cephfs: mds: avoid calling clientreplay_done() prematurely (`pr#31282 <https://github.com/ceph/ceph/pull/31282>`_, "Yan, Zheng")
-* cephfs: mds: fix assert(omap_num_objs <= MAX_OBJECTS) of OpenFileTable (`pr#32757 <https://github.com/ceph/ceph/pull/32757>`_, "Yan, Zheng")
-* cephfs: mds: fix infinite loop in Locker::file_update_finish (`pr#31284 <https://github.com/ceph/ceph/pull/31284>`_, "Yan, Zheng")
-* cephfs: mds: mds returns -5(EIO) error when the deleted file does not exist (`pr#31381 <https://github.com/ceph/ceph/pull/31381>`_, huanwen ren)
-* cephfs: mds: split the dir if the op makes it oversized, because some ops maybe in flight (`pr#31379 <https://github.com/ceph/ceph/pull/31379>`_, simon gao)
-* cephfs: tools/cephfs: make 'cephfs-data-scan scan_links' reconstruct snaptable (`pr#31281 <https://github.com/ceph/ceph/pull/31281>`_, "Yan, Zheng")
-* common/config: parse --log-early option (`pr#33130 <https://github.com/ceph/ceph/pull/33130>`_, Sage Weil)
-* common: common/admin_socket: Increase socket timeouts (`pr#33323 <https://github.com/ceph/ceph/pull/33323>`_, Brad Hubbard)
-* common: common/config: update values when they are removed via mon (`pr#33327 <https://github.com/ceph/ceph/pull/33327>`_, Sage Weil)
-* common: common/util: use ifstream to read from /proc files (`pr#32902 <https://github.com/ceph/ceph/pull/32902>`_, Kefu Chai, songweibin)
-* core,mgr,tests: mgr: Release GIL and Balancer fixes (`pr#31957 <https://github.com/ceph/ceph/pull/31957>`_, Neha Ojha, Kefu Chai, Noah Watkins, David Zafman)
-* core,mgr: mgr/prometheus: assign a value to osd_dev_node when obj_store is not filestore or bluestore (`pr#31557 <https://github.com/ceph/ceph/pull/31557>`_, jiahuizeng)
-* core,tests: qa/tasks/cbt: install python3 deps (`pr#34193 <https://github.com/ceph/ceph/pull/34193>`_, Sage Weil)
-* core: mon/OSDMonitor: fix format error ceph osd stat --format json (`pr#33322 <https://github.com/ceph/ceph/pull/33322>`_, Zheng Yin)
-* core: mon: Don't put session during feature change (`pr#33154 <https://github.com/ceph/ceph/pull/33154>`_, Brad Hubbard)
-* core: osd/PeeringState.cc: don't let num_objects become negative (`pr#33331 <https://github.com/ceph/ceph/pull/33331>`_, Neha Ojha)
-* core: osd/PeeringState.cc: skip peer_purged when discovering all missing (`pr#33329 <https://github.com/ceph/ceph/pull/33329>`_, Neha Ojha)
-* core: osd/PeeringState.h: ignore MLogRec in Peering/GetInfo (`pr#33594 <https://github.com/ceph/ceph/pull/33594>`_, Neha Ojha)
-* core: osd/PeeringState: do not exclude up from acting_recovery_backfill (`pr#33324 <https://github.com/ceph/ceph/pull/33324>`_, Nathan Cutler, xie xingguo)
-* core: osd: Allow 64-char hostname to be added as the "host" in CRUSH (`pr#33145 <https://github.com/ceph/ceph/pull/33145>`_, Michal Skalski)
-* core: osd: Diagnostic logging for upmap cleaning (`pr#32717 <https://github.com/ceph/ceph/pull/32717>`_, David Zafman)
-* core: osd: backfill_toofull seen on cluster where the most full OSD is at 1% (`pr#32361 <https://github.com/ceph/ceph/pull/32361>`_, David Zafman)
-* core: osd: set collection pool opts on collection create, pg load (`pr#32125 <https://github.com/ceph/ceph/pull/32125>`_, Sage Weil)
-* core: selinux: Allow ceph to read udev db (`pr#32258 <https://github.com/ceph/ceph/pull/32258>`_, Boris Ranto)
-* core: selinux: Allow ceph-mgr access to httpd dir (`pr#34458 <https://github.com/ceph/ceph/pull/34458>`_, Brad Hubbard)
-* doc: remove invalid option mon_pg_warn_max_per_osd (`pr#31875 <https://github.com/ceph/ceph/pull/31875>`_, zhang daolong)
-* doc: doc/_templates/page.html: redirect to etherpad (`pr#32249 <https://github.com/ceph/ceph/pull/32249>`_, Neha Ojha)
-* doc: doc/cephfs/client-auth: description and example are inconsistent (`pr#32782 <https://github.com/ceph/ceph/pull/32782>`_, Ilya Dryomov)
-* doc: wrong datatype describing crush_rule (`pr#32255 <https://github.com/ceph/ceph/pull/32255>`_, Kefu Chai)
-* mgr,pybind: mgr/prometheus: report per-pool pg states (`pr#33158 <https://github.com/ceph/ceph/pull/33158>`_, Aleksei Zakharov)
-* mgr,pybind: mgr/telemetry: check get_metadata return val (`pr#33096 <https://github.com/ceph/ceph/pull/33096>`_, Yaarit Hatuka)
-* mount.ceph: give a hint message when no mds is up or cluster is laggy (`pr#32911 <https://github.com/ceph/ceph/pull/32911>`_, Xiubo Li)
-* pybind: pybind/mgr: Cancel output color control (`pr#31805 <https://github.com/ceph/ceph/pull/31805>`_, Zheng Yin)
-* qa: get rid of iterkeys for py3 compatibility (`pr#33999 <https://github.com/ceph/ceph/pull/33999>`_, Kyr Shatskyy)
-* rbd:  creating thick-provision image progress percent info exceeds 100% (`pr#33318 <https://github.com/ceph/ceph/pull/33318>`_, Xiangdong Mu)
-* rbd: librbd: diff iterate with fast-diff now correctly includes parent (`pr#32470 <https://github.com/ceph/ceph/pull/32470>`_, Jason Dillaman)
-* rbd: librbd: don't call refresh from mirror::GetInfoRequest state machine (`pr#32952 <https://github.com/ceph/ceph/pull/32952>`_, Mykola Golub)
-* rbd: librbd: fix rbd_open_by_id, rbd_open_by_id_read_only (`pr#33315 <https://github.com/ceph/ceph/pull/33315>`_, yangjun)
-* rbd: nautilus: rbd-mirror: fix 'rbd mirror status' asok command output (`pr#32714 <https://github.com/ceph/ceph/pull/32714>`_, Mykola Golub)
-* rbd: rbd-mirror: clone v2 mirroring improvements (`pr#31520 <https://github.com/ceph/ceph/pull/31520>`_, Mykola Golub)
-* rbd: rbd-mirror: improve detection of blacklisted state (`pr#33598 <https://github.com/ceph/ceph/pull/33598>`_, Mykola Golub)
-* rbd: rbd-mirror: make logrotate work (`pr#32598 <https://github.com/ceph/ceph/pull/32598>`_, Mykola Golub)
-* rgw: add bucket permission verify when copy obj (`pr#31377 <https://github.com/ceph/ceph/pull/31377>`_, NancySu05)
-* rgw: add list user admin OP API (`pr#31754 <https://github.com/ceph/ceph/pull/31754>`_, Oshyn Song)
-* rgw: add missing admin property when sync user info (`pr#30804 <https://github.com/ceph/ceph/pull/30804>`_, zhang Shaowen)
-* rgw: add num_shards to radosgw-admin bucket stats (`pr#31183 <https://github.com/ceph/ceph/pull/31183>`_, Paul Emmerich)
-* rgw: adding mfa code validation when bucket versioning status is changed (`pr#33303 <https://github.com/ceph/ceph/pull/33303>`_, Pritha Srivastava)
-* rgw: allow reshard log entries for non-existent buckets to be cancelled (`pr#33302 <https://github.com/ceph/ceph/pull/33302>`_, J. Eric Ivancich)
-* rgw: auto-clean reshard queue entries for non-existent buckets (`pr#33300 <https://github.com/ceph/ceph/pull/33300>`_, J. Eric Ivancich)
-* rgw: change the "rgw admin status" 'num_shards' output to signed int (`issue#37645 <http://tracker.ceph.com/issues/37645>`_, `pr#33305 <https://github.com/ceph/ceph/pull/33305>`_, Mark Kogan)
-* rgw: crypt: permit RGW-AUTO/default with SSE-S3 headers (`pr#31861 <https://github.com/ceph/ceph/pull/31861>`_, Matt Benjamin)
-* rgw: find oldest period and update RGWMetadataLogHistory() (`pr#33309 <https://github.com/ceph/ceph/pull/33309>`_, Shilpa Jagannath)
-* rgw: fix a bug that bucket instance obj can't be removed after resharding completed (`pr#33306 <https://github.com/ceph/ceph/pull/33306>`_, zhang Shaowen)
-* rgw: fix bad user stats on versioned bucket after reshard (`pr#33304 <https://github.com/ceph/ceph/pull/33304>`_, J. Eric Ivancich)
-* rgw: fix memory growth while deleting objects with (`pr#31378 <https://github.com/ceph/ceph/pull/31378>`_, Mark Kogan)
-* rgw: get barbican secret key request maybe return error code (`pr#33966 <https://github.com/ceph/ceph/pull/33966>`_, Richard Bai(白学余))
-* rgw: make max_connections configurable in beast (`pr#33341 <https://github.com/ceph/ceph/pull/33341>`_, Tiago Pasqualini)
-* rgw: making implicit_tenants backwards compatible (`issue#24348 <http://tracker.ceph.com/issues/24348>`_, `pr#33748 <https://github.com/ceph/ceph/pull/33748>`_, Marcus Watts)
-* rgw: maybe coredump when reload operator happened (`pr#33313 <https://github.com/ceph/ceph/pull/33313>`_, Richard Bai(白学余))
-* rgw: move forward marker even in case of many rgw.none indexes (`pr#33311 <https://github.com/ceph/ceph/pull/33311>`_, Ilsoo Byun)
-* rgw: prevent bucket reshard scheduling if bucket is resharding (`pr#31299 <https://github.com/ceph/ceph/pull/31299>`_, J. Eric Ivancich)
-* rgw: update the hash source for multipart entries during resharding (`pr#33312 <https://github.com/ceph/ceph/pull/33312>`_, dongdong tao)
-
-
-v13.2.8 Mimic
-=============
-
-This is the eighth release in the Ceph Mimic stable release series. Its sole
-purpose is to fix a regression that found its way into the previous release.
-
-Notable Changes
----------------
-
-* Due to a missed backport, clusters in the process of being upgraded from
-  13.2.6 to 13.2.7 might suffer an OSD crash in build_incremental_map_msg.
-  This regression was reported in https://tracker.ceph.com/issues/43106
-  and is fixed in 13.2.8 (this release). Users of 13.2.6 can upgrade to 13.2.8
-  directly - i.e., skip 13.2.7 - to avoid this.
-
-Changelog
----------
-
-* osd: fix sending incremental map messages (more) (`issue#43106 <https://tracker.ceph.com/issues/43106>`_, `pr#32000 <https://github.com/ceph/ceph/pull/32000>`_, Sage Weil)
-* tests: added missing point release versions (`pr#32087 <https://github.com/ceph/ceph/pull/32087>`_, Yuri Weinstein)
-* tests: rgw: add missing force-branch: ceph-mimic for swift tasks (`pr#32033 <https://github.com/ceph/ceph/pull/32033>`_, Casey Bodley)
-
-
-v13.2.7 Mimic
-=============
-
-This is the seventh bugfix release of the Mimic v13.2.x long-term stable release
-series. All Mimic users are advised to upgrade.
-
-Notable Changes
----------------
-
-MDS:
-
-* Cache trimming is now throttled. Dropping the MDS cache via the "ceph tell
-  mds.<foo> cache drop" command or large reductions in the cache size will no
-  longer cause service unavailability.
-
-* Behavior with recalling caps has been significantly improved to not attempt
-  recalling too many caps at once, leading to instability. MDS with a large
-  cache (64GB+) should be more stable.
-
-* MDS now provides a config option "mds_max_caps_per_client" (default: 1M) to
-  limit the number of caps a client session may hold. Long running client
-  sessions with a large number of caps have been a source of instability in the
-  MDS when all of these caps need to be processed during certain session
-  events. It is recommended to not unnecessarily increase this value.
-
-* The "mds_recall_state_timeout" config parameter has been removed. Late client
-  recall warnings are now generated based on the number of caps the MDS has
-  recalled which have not been released. The new config parameters
-  "mds_recall_warning_threshold" (default: 32K) and "mds_recall_warning_decay_rate"
-  (default: 60s) set the threshold for this warning.
-
-* The "cache drop" admin socket command has been removed. The "ceph tell mds.X
-  cache drop" remains.
-
-OSD:
-
-* A health warning is now generated if the average osd heartbeat ping time exceeds
-  a configurable threshold for any of the intervals computed. The OSD computes
-  1 minute, 5 minute and 15 minute intervals with average, minimum and maximum
-  values.  New configuration option "mon_warn_on_slow_ping_ratio" specifies
-  a percentage of "osd_heartbeat_grace" to determine the threshold.  A value of
-  zero disables the warning. A new configuration option "mon_warn_on_slow_ping_time",
-  specified in milliseconds, overrides the computed value, causing a warning
-  when OSD heartbeat pings take longer than the specified amount.  A new admin
-  command "ceph daemon mgr.# dump_osd_network [threshold]" lists all connections
-  with a ping time longer than the specified threshold or value determined by
-  the config options, for the average for any of the 3 intervals.  A new admin
-  command "ceph daemon osd.# dump_osd_network [threshold]" does the same but only
-  including heartbeats initiated by the specified OSD.
-
-* The default value of the "osd_deep_scrub_large_omap_object_key_threshold"
-  parameter has been lowered to detect an object with large number of omap keys
-  more easily.
-  
-RGW:
-
-* radosgw-admin introduces two subcommands that allow the managing of expire-stale
-  objects that might be left behind after a bucket reshard in earlier versions
-  of RGW. One subcommand lists such objects and the other deletes them. Read the
-  troubleshooting section of the dynamic resharding docs for details.
-
-Changelog
----------
-
-* bluestore: 50-100% iops lost due to bluefs_preextend_wal_files = false (`issue#40280 <http://tracker.ceph.com/issues/40280>`_, `pr#28574 <https://github.com/ceph/ceph/pull/28574>`_, Vitaliy Filippov)
-* bluestore: Change default for bluestore_fsck_on_mount_deep as false (`pr#29699 <https://github.com/ceph/ceph/pull/29699>`_, Neha Ojha)
-* bluestore: _txc_add_transaction error (39) Directory not empty not handled on operation 21 (op 1, counting from 0) (`issue#39692 <http://tracker.ceph.com/issues/39692>`_, `pr#29217 <https://github.com/ceph/ceph/pull/29217>`_, Sage Weil)
-* bluestore: apply shared_alloc_size to shared device with log level change (`pr#30219 <https://github.com/ceph/ceph/pull/30219>`_, Vikhyat Umrao, Josh Durgin, Sage Weil, Igor Fedotov)
-* bluestore: avoid length overflow in extents returned by Stupid Allocator (`issue#40758 <http://tracker.ceph.com/issues/40758>`_, `issue#40703 <http://tracker.ceph.com/issues/40703>`_, `pr#29024 <https://github.com/ceph/ceph/pull/29024>`_, Igor Fedotov)
-* bluestore: common/options: Set concurrent bluestore rocksdb compactions to 2 (`pr#30150 <https://github.com/ceph/ceph/pull/30150>`_, Mark Nelson)
-* bluestore: default to bitmap allocator for bluestore/bluefs (`pr#28970 <https://github.com/ceph/ceph/pull/28970>`_, Igor Fedotov)
-* bluestore: dump before "no-spanning blob id" abort (`pr#28029 <https://github.com/ceph/ceph/pull/28029>`_, Igor Fedotov)
-* bluestore: fix >2GB bluefs writes (`pr#28967 <https://github.com/ceph/ceph/pull/28967>`_, Sage Weil, kungf)
-* bluestore: fix duplicate allocations in bmap allocator (`issue#40080 <http://tracker.ceph.com/issues/40080>`_, `pr#28645 <https://github.com/ceph/ceph/pull/28645>`_, Igor Fedotov)
-* bluestore: load OSD all compression settings unconditionally (`issue#40480 <http://tracker.ceph.com/issues/40480>`_, `pr#28894 <https://github.com/ceph/ceph/pull/28894>`_, Igor Fedotov)
-* build/ops: Cython 0.29 removed support for subinterpreters: raises ImportError: Interpreter change detected (`issue#39593 <http://tracker.ceph.com/issues/39593>`_, `issue#39592 <http://tracker.ceph.com/issues/39592>`_, `pr#27971 <https://github.com/ceph/ceph/pull/27971>`_, Kefu Chai, Tim Serong)
-* build/ops: admin/build-doc: use python3 (`pr#30663 <https://github.com/ceph/ceph/pull/30663>`_, Kefu Chai)
-* build/ops: admin/build-doc: use python3 (follow-on fix) (`pr#30687 <https://github.com/ceph/ceph/pull/30687>`_, Nathan Cutler)
-* build/ops: backport miscellaneous install-deps.sh and ceph.spec.in fixes from master (`issue#37707 <http://tracker.ceph.com/issues/37707>`_, `pr#30718 <https://github.com/ceph/ceph/pull/30718>`_, Jeff Layton, Kefu Chai, Nathan Cutler, Brad Hubbard, Changcheng Liu, Sebastian Wagner, Yunchuan Wen, Tomasz Setkowski, Zack Cerza)
-* build/ops: ceph.spec.in: reserve 2500MB per build job (`pr#30355 <https://github.com/ceph/ceph/pull/30355>`_, Dan van der Ster)
-* build/ops: cmake,run-make-check.sh: disable SPDK by default (`pr#30183 <https://github.com/ceph/ceph/pull/30183>`_, Kefu Chai)
-* build/ops: cmake: detect armv8 crc and crypto feature using CHECK_C_COMPILER_FLAG (`issue#17516 <http://tracker.ceph.com/issues/17516>`_, `pr#30713 <https://github.com/ceph/ceph/pull/30713>`_, Kefu Chai)
-* build/ops: do_cmake.sh: source not found (`issue#39981 <http://tracker.ceph.com/issues/39981>`_, `issue#40005 <http://tracker.ceph.com/issues/40005>`_, `pr#28217 <https://github.com/ceph/ceph/pull/28217>`_, Nathan Cutler)
-* build/ops: fix build fail related to PYTHON_EXECUTABLE variable (`pr#30260 <https://github.com/ceph/ceph/pull/30260>`_, Ilsoo Byun)
-* build/ops: install-deps.sh: Remove CR repo (`issue#13997 <http://tracker.ceph.com/issues/13997>`_, `pr#30128 <https://github.com/ceph/ceph/pull/30128>`_, Alfredo Deza, Brad Hubbard)
-* build/ops: install-deps.sh: install `python\*-devel` for python\*rpm-macros (`pr#30244 <https://github.com/ceph/ceph/pull/30244>`_, Kefu Chai)
-* build/ops: make "patch" build dependency explicit (`issue#40269 <http://tracker.ceph.com/issues/40269>`_, `issue#40175 <http://tracker.ceph.com/issues/40175>`_, `pr#29150 <https://github.com/ceph/ceph/pull/29150>`_, Nathan Cutler)
-* build/ops: python3-cephfs should provide python36-cephfs (`pr#30982 <https://github.com/ceph/ceph/pull/30982>`_, Kefu Chai)
-* build/ops: rpm: always build ceph-test package (`pr#30188 <https://github.com/ceph/ceph/pull/30188>`_, Nathan Cutler)
-* ceph-volume: PVolumes.filter shouldn't purge itself (`pr#30806 <https://github.com/ceph/ceph/pull/30806>`_, Rishabh Dave)
-* ceph-volume: VolumeGroups.filter shouldn't purge itself (`pr#30808 <https://github.com/ceph/ceph/pull/30808>`_, Rishabh Dave)
-* ceph-volume: add Ceph's device id to inventory (`pr#31211 <https://github.com/ceph/ceph/pull/31211>`_, Sebastian Wagner)
-* ceph-volume: api/lvm: check if list of LVs is empty (`pr#31229 <https://github.com/ceph/ceph/pull/31229>`_, Rishabh Dave)
-* ceph-volume: assume msgrV1 for all branches containing mimic (`pr#31615 <https://github.com/ceph/ceph/pull/31615>`_, Jan Fajerski)
-* ceph-volume: batch functional idempotency test fails since message is now on stderr (`pr#29688 <https://github.com/ceph/ceph/pull/29688>`_, Jan Fajerski)
-* ceph-volume: broken assertion errors after pytest changes (`pr#28948 <https://github.com/ceph/ceph/pull/28948>`_, Alfredo Deza)
-* ceph-volume: do not fail when trying to remove crypt mapper (`pr#30555 <https://github.com/ceph/ceph/pull/30555>`_, Guillaume Abrioux)
-* ceph-volume: does not recognize wal/db partitions created by ceph-disk (`pr#29463 <https://github.com/ceph/ceph/pull/29463>`_, Jan Fajerski)
-* ceph-volume: ensure device lists are disjoint (`pr#30334 <https://github.com/ceph/ceph/pull/30334>`_, Jan Fajerski)
-* ceph-volume: extend batch (`issue#40919 <http://tracker.ceph.com/issues/40919>`_, `pr#29243 <https://github.com/ceph/ceph/pull/29243>`_, Andrew Schoen, Jan Fajerski, Sébastien Han, Volker Theile)
-* ceph-volume: fix stderr failure to decode/encode when redirected (`pr#30301 <https://github.com/ceph/ceph/pull/30301>`_, Alfredo Deza)
-* ceph-volume: fix warnings raised by pytest (`pr#30678 <https://github.com/ceph/ceph/pull/30678>`_, Rishabh Dave)
-* ceph-volume: implement __format__ in Size to format sizes in py3 (`pr#30333 <https://github.com/ceph/ceph/pull/30333>`_, Jan Fajerski)
-* ceph-volume: look for rotational data in lsblk (`pr#26991 <https://github.com/ceph/ceph/pull/26991>`_, Andrew Schoen)
-* ceph-volume: lvm.activate: Return an error if WAL/DB devices absent (`pr#29039 <https://github.com/ceph/ceph/pull/29039>`_, David Casier)
-* ceph-volume: lvm.zap fix cleanup for db partitions (`issue#40664 <http://tracker.ceph.com/issues/40664>`_, `pr#30303 <https://github.com/ceph/ceph/pull/30303>`_, Dominik Csapak)
-* ceph-volume: minor optimizations related to class Volumes's use (`pr#30096 <https://github.com/ceph/ceph/pull/30096>`_, Rishabh Dave)
-* ceph-volume: miscellaneous backports (`pr#31227 <https://github.com/ceph/ceph/pull/31227>`_, Mohamad Gebai, Andrew Schoen)
-* ceph-volume: missing string substitution when reporting mounts (`issue#40977 <http://tracker.ceph.com/issues/40977>`_, `pr#29350 <https://github.com/ceph/ceph/pull/29350>`_, Shyukri Shyukriev)
-* ceph-volume: more mimic backports (`pr#29631 <https://github.com/ceph/ceph/pull/29631>`_, Andrew Schoen, Alfredo Deza)
-* ceph-volume: more missing mimic backports (`pr#31362 <https://github.com/ceph/ceph/pull/31362>`_, Mohamad Gebai, Kefu Chai)
-* ceph-volume: pre-install python-apt and its variants before test runs (`pr#30295 <https://github.com/ceph/ceph/pull/30295>`_, Alfredo Deza)
-* ceph-volume: prints errors to stdout with --format json (`issue#38548 <http://tracker.ceph.com/issues/38548>`_, `pr#29507 <https://github.com/ceph/ceph/pull/29507>`_, Jan Fajerski)
-* ceph-volume: prints log messages to stdout (`pr#29602 <https://github.com/ceph/ceph/pull/29602>`_, Jan Fajerski, Alfredo Deza, Kefu Chai)
-* ceph-volume: replace testinfra command with py.test (`pr#28930 <https://github.com/ceph/ceph/pull/28930>`_, Alfredo Deza)
-* ceph-volume: simple functional tests drop test for lvm zap (`pr#29661 <https://github.com/ceph/ceph/pull/29661>`_, Jan Fajerski)
-* ceph-volume: simple: when 'type' file is not present activate fails (`pr#29417 <https://github.com/ceph/ceph/pull/29417>`_, Jan Fajerski, Alfredo Deza)
-* ceph-volume: tests add a sleep in tox for slow OSDs after booting (`pr#28947 <https://github.com/ceph/ceph/pull/28947>`_, Alfredo Deza)
-* ceph-volume: tests set the noninteractive flag for Debian (`pr#29900 <https://github.com/ceph/ceph/pull/29900>`_, Alfredo Deza)
-* ceph-volume: update testing playbook 'deploy.yml' (`pr#29074 <https://github.com/ceph/ceph/pull/29074>`_, Andrew Schoen, Guillaume Abrioux)
-* ceph-volume: use the OSD identifier when reporting success (`pr#29770 <https://github.com/ceph/ceph/pull/29770>`_, Alfredo Deza)
-* ceph-volume: zap always skips block.db, leaves them around (`issue#40664 <http://tracker.ceph.com/issues/40664>`_, `pr#30306 <https://github.com/ceph/ceph/pull/30306>`_, Alfredo Deza)
-* ceph_detect_init: Add support for ALT Linux (`pr#27028 <https://github.com/ceph/ceph/pull/27028>`_, Andrey Bychkov)
-* cephfs: MDSTableServer.cc: 83: FAILED assert(version == tid) (`issue#39212 <http://tracker.ceph.com/issues/39212>`_, `issue#38835 <http://tracker.ceph.com/issues/38835>`_, `pr#29222 <https://github.com/ceph/ceph/pull/29222>`_, "Yan, Zheng")
-* cephfs: avoid map been inserted by mistake (`pr#29833 <https://github.com/ceph/ceph/pull/29833>`_, XiaoGuoDong2019)
-* cephfs: ceph-fuse: client hang because its bad session PipeConnection to mds (`issue#39305 <http://tracker.ceph.com/issues/39305>`_, `issue#39685 <http://tracker.ceph.com/issues/39685>`_, `pr#29200 <https://github.com/ceph/ceph/pull/29200>`_, Guan yunfei)
-* cephfs: client: EINVAL may be returned when offset is 0 (`pr#30932 <https://github.com/ceph/ceph/pull/30932>`_, wenpengLi)
-* cephfs: client: _readdir_cache_cb() may use the readdir_cache already clear (`issue#41148 <http://tracker.ceph.com/issues/41148>`_, `pr#30933 <https://github.com/ceph/ceph/pull/30933>`_, huanwen ren)
-* cephfs: client: add procession of SEEK_HOLE and SEEK_DATA in lseek (`pr#30918 <https://github.com/ceph/ceph/pull/30918>`_, Shen Hang)
-* cephfs: client: bump ll_ref from int32 to uint64_t (`pr#29187 <https://github.com/ceph/ceph/pull/29187>`_, Xiaoxi CHEN)
-* cephfs: client: ceph.dir.rctime xattr value incorrectly prefixes 09 to the nanoseconds component (`issue#40168 <http://tracker.ceph.com/issues/40168>`_, `pr#28501 <https://github.com/ceph/ceph/pull/28501>`_, David Disseldorp)
-* cephfs: client: fix bad error handling in _lookup_parent (`issue#40085 <http://tracker.ceph.com/issues/40085>`_, `pr#29609 <https://github.com/ceph/ceph/pull/29609>`_, Jeff Layton)
-* cephfs: client: nfs-ganesha with cephfs client, removing dir reports not empty (`issue#40746 <http://tracker.ceph.com/issues/40746>`_, `pr#30443 <https://github.com/ceph/ceph/pull/30443>`_, Peng Xie)
-* cephfs: client: return -EIO when sync file which unsafe reqs have been dropped (`issue#40877 <http://tracker.ceph.com/issues/40877>`_, `pr#30241 <https://github.com/ceph/ceph/pull/30241>`_, simon gao)
-* cephfs: client: set snapdir's link count to 1 (`pr#30108 <https://github.com/ceph/ceph/pull/30108>`_, "Yan, Zheng")
-* cephfs: client: support the fallocate() when fuse version >= 2.9 (`issue#40615 <http://tracker.ceph.com/issues/40615>`_, `pr#30228 <https://github.com/ceph/ceph/pull/30228>`_, huanwen ren)
-* cephfs: client: unlink dentry for inode with llref=0 (`issue#40960 <http://tracker.ceph.com/issues/40960>`_, `pr#29479 <https://github.com/ceph/ceph/pull/29479>`_, Xiaoxi CHEN)
-* cephfs: fix a memory leak (`pr#29915 <https://github.com/ceph/ceph/pull/29915>`_, XiaoGuoDong2019)
-* cephfs: getattr on snap inode stuck (`issue#40437 <http://tracker.ceph.com/issues/40437>`_, `pr#29230 <https://github.com/ceph/ceph/pull/29230>`_, "Yan, Zheng")
-* cephfs: kcephfs TestClientLimits.test_client_pin fails with client caps fell below min (`issue#38270 <http://tracker.ceph.com/issues/38270>`_, `issue#38687 <http://tracker.ceph.com/issues/38687>`_, `pr#29211 <https://github.com/ceph/ceph/pull/29211>`_, "Yan, Zheng")
-* cephfs: mds: Fix duplicate client entries in eviction list (`pr#30950 <https://github.com/ceph/ceph/pull/30950>`_, Sidharth Anupkrishnan)
-* cephfs: mds: avoid sending too many osd requests at once after mds restarts (`issue#40042 <http://tracker.ceph.com/issues/40042>`_, `issue#40028 <http://tracker.ceph.com/issues/40028>`_, `pr#28650 <https://github.com/ceph/ceph/pull/28650>`_, simon gao)
-* cephfs: mds: behind on trimming and [dentry] was purgeable but no longer is! (`issue#39223 <http://tracker.ceph.com/issues/39223>`_, `issue#38679 <http://tracker.ceph.com/issues/38679>`_, `pr#29224 <https://github.com/ceph/ceph/pull/29224>`_, "Yan, Zheng")
-* cephfs: mds: cannot switch mds state from standby-replay to active (`issue#40213 <http://tracker.ceph.com/issues/40213>`_, `pr#29232 <https://github.com/ceph/ceph/pull/29232>`_, "Yan, Zheng", simon gao)
-* cephfs: mds: change how mds revoke stale caps (`issue#38043 <http://tracker.ceph.com/issues/38043>`_, `issue#17854 <http://tracker.ceph.com/issues/17854>`_, `pr#28585 <https://github.com/ceph/ceph/pull/28585>`_, "Yan, Zheng", Rishabh Dave)
-* cephfs: mds: check dir fragment to split dir if mkdir makes it oversized (`issue#39689 <http://tracker.ceph.com/issues/39689>`_, `pr#28381 <https://github.com/ceph/ceph/pull/28381>`_, Erqi Chen)
-* cephfs: mds: cleanup unneeded client_snap_caps when splitting snap inode (`issue#39987 <http://tracker.ceph.com/issues/39987>`_, `pr#30234 <https://github.com/ceph/ceph/pull/30234>`_, "Yan, Zheng")
-* cephfs: mds: delay exporting directory whose pin value exceeds max rank id (`issue#40603 <http://tracker.ceph.com/issues/40603>`_, `pr#29940 <https://github.com/ceph/ceph/pull/29940>`_, Zhi Zhang)
-* cephfs: mds: destroy reconnect msg when it is from non-existent session to avoid memory leak (`issue#40588 <http://tracker.ceph.com/issues/40588>`_, `pr#28796 <https://github.com/ceph/ceph/pull/28796>`_, Shen Hang)
-* cephfs: mds: evict an unresponsive client only when another client wants its caps (`pr#30239 <https://github.com/ceph/ceph/pull/30239>`_, Rishabh Dave)
-* cephfs: mds: fix SnapRealm::resolve_snapname for long name (`issue#39472 <http://tracker.ceph.com/issues/39472>`_, `pr#28186 <https://github.com/ceph/ceph/pull/28186>`_, "Yan, Zheng")
-* cephfs: mds: fix corner case of replaying open sessions (`pr#28579 <https://github.com/ceph/ceph/pull/28579>`_, "Yan, Zheng")
-* cephfs: mds: high debug logging with many subtrees is slow (`issue#38875 <http://tracker.ceph.com/issues/38875>`_, `pr#29219 <https://github.com/ceph/ceph/pull/29219>`_, Rishabh Dave)
-* cephfs: mds: make MDSIOContextBase delete itself when shutting down (`pr#30417 <https://github.com/ceph/ceph/pull/30417>`_, Xuehan Xu)
-* cephfs: mds: mds_cap_revoke_eviction_timeout is not used to initialize Server::cap_revoke_eviction_timeout (`issue#38844 <http://tracker.ceph.com/issues/38844>`_, `issue#39210 <http://tracker.ceph.com/issues/39210>`_, `pr#29220 <https://github.com/ceph/ceph/pull/29220>`_, simon gao)
-* cephfs: mds: output lock state in format dump (`issue#39669 <http://tracker.ceph.com/issues/39669>`_, `issue#39645 <http://tracker.ceph.com/issues/39645>`_, `pr#28274 <https://github.com/ceph/ceph/pull/28274>`_, Zhi Zhang)
-* cephfs: mds: remove cache drop admin socket command (`issue#38020 <http://tracker.ceph.com/issues/38020>`_, `issue#38099 <http://tracker.ceph.com/issues/38099>`_, `pr#29210 <https://github.com/ceph/ceph/pull/29210>`_, Patrick Donnelly)
-* cephfs: mds: reset heartbeat during long-running loops in recovery (`issue#40222 <http://tracker.ceph.com/issues/40222>`_, `pr#28918 <https://github.com/ceph/ceph/pull/28918>`_, "Yan, Zheng")
-* cephfs: mds: stopping MDS with a large cache (40+GB) causes it to miss heartbeats (`issue#38022 <http://tracker.ceph.com/issues/38022>`_, `issue#38129 <http://tracker.ceph.com/issues/38129>`_, `issue#37723 <http://tracker.ceph.com/issues/37723>`_, `issue#38131 <http://tracker.ceph.com/issues/38131>`_, `pr#28452 <https://github.com/ceph/ceph/pull/28452>`_, Patrick Donnelly)
-* cephfs: mds: there is an assertion when calling Beacon::shutdown() (`issue#39215 <http://tracker.ceph.com/issues/39215>`_, `issue#38822 <http://tracker.ceph.com/issues/38822>`_, `pr#29223 <https://github.com/ceph/ceph/pull/29223>`_, huanwen ren)
-* cephfs: mount.ceph.c: do not pass nofail to the kernel (`issue#39233 <http://tracker.ceph.com/issues/39233>`_, `pr#28090 <https://github.com/ceph/ceph/pull/28090>`_, Kenneth Waegeman)
-* cephfs: mount.ceph: properly handle -o strictatime (`pr#30240 <https://github.com/ceph/ceph/pull/30240>`_, Jeff Layton)
-* cephfs: mount: key parsing fail when doing a remount (`issue#40165 <http://tracker.ceph.com/issues/40165>`_, `pr#29225 <https://github.com/ceph/ceph/pull/29225>`_, Luis Henriques)
-* cephfs: pybind: added lseek() (`issue#39679 <http://tracker.ceph.com/issues/39679>`_, `pr#28337 <https://github.com/ceph/ceph/pull/28337>`_, Xiaowei Chu)
-* cephfs: test_volume_client: fix test_put_object_versioned() (`issue#39405 <http://tracker.ceph.com/issues/39405>`_, `issue#39510 <http://tracker.ceph.com/issues/39510>`_, `pr#30236 <https://github.com/ceph/ceph/pull/30236>`_, Rishabh Dave)
-* common/ceph_context: avoid unnecessary wait during service thread shutdown (`pr#31096 <https://github.com/ceph/ceph/pull/31096>`_, Jason Dillaman)
-* common/options.cc: Lower the default value of osd_deep_scrub_large_omap_object_key_threshold (`pr#29174 <https://github.com/ceph/ceph/pull/29174>`_, Neha Ojha)
-* common/util: handle long lines in /proc/cpuinfo (`issue#39475 <http://tracker.ceph.com/issues/39475>`_, `issue#38296 <http://tracker.ceph.com/issues/38296>`_, `pr#28206 <https://github.com/ceph/ceph/pull/28206>`_, Sage Weil)
-* common: Keyrings created by ceph auth get are not suitable for ceph auth import (`issue#22227 <http://tracker.ceph.com/issues/22227>`_, `issue#40547 <http://tracker.ceph.com/issues/40547>`_, `pr#28741 <https://github.com/ceph/ceph/pull/28741>`_, Kefu Chai)
-* common: data race in OutputDataSocket (`issue#40268 <http://tracker.ceph.com/issues/40268>`_, `issue#40188 <http://tracker.ceph.com/issues/40188>`_, `pr#29201 <https://github.com/ceph/ceph/pull/29201>`_, Casey Bodley)
-* common: parse ISO 8601 datetime format (`issue#40088 <http://tracker.ceph.com/issues/40088>`_, `pr#28326 <https://github.com/ceph/ceph/pull/28326>`_, Sage Weil)
-* core: .mgrstat failed to decode mgrstat state; luminous dev version? (`issue#38852 <http://tracker.ceph.com/issues/38852>`_, `issue#38839 <http://tracker.ceph.com/issues/38839>`_, `pr#29249 <https://github.com/ceph/ceph/pull/29249>`_, Sage Weil)
-* core: Better default value for osd_snap_trim_sleep (`pr#29732 <https://github.com/ceph/ceph/pull/29732>`_, Neha Ojha)
-* core: Health warnings on long network ping times (`issue#40640 <http://tracker.ceph.com/issues/40640>`_, `issue#40586 <http://tracker.ceph.com/issues/40586>`_, `pr#30225 <https://github.com/ceph/ceph/pull/30225>`_, xie xingguo, David Zafman)
-* core: ceph daemon mon.a config set mon_health_to_clog false cause leader mon assert (`issue#39625 <http://tracker.ceph.com/issues/39625>`_, `pr#29741 <https://github.com/ceph/ceph/pull/29741>`_, huangjun)
-* core: crc cache should be invalidated when posting preallocated rx buffers (`issue#38437 <http://tracker.ceph.com/issues/38437>`_, `pr#29247 <https://github.com/ceph/ceph/pull/29247>`_, Ilya Dryomov)
-* core: lazy omap stat collection (`pr#29189 <https://github.com/ceph/ceph/pull/29189>`_, Brad Hubbard)
-* core: mon, osd: parallel clean_pg_upmaps (`issue#40104 <http://tracker.ceph.com/issues/40104>`_, `issue#40230 <http://tracker.ceph.com/issues/40230>`_, `pr#28619 <https://github.com/ceph/ceph/pull/28619>`_, xie xingguo)
-* core: mon,osd: limit MOSDMap messages by size as well as map count (`issue#38277 <http://tracker.ceph.com/issues/38277>`_, `issue#38040 <http://tracker.ceph.com/issues/38040>`_, `pr#29242 <https://github.com/ceph/ceph/pull/29242>`_, Sage Weil)
-* core: mon/AuthMonitor: fix initial creation of rotating keys (`issue#40634 <http://tracker.ceph.com/issues/40634>`_, `pr#30181 <https://github.com/ceph/ceph/pull/30181>`_, Sage Weil)
-* core: mon/MDSMonitor: use stringstream instead of dout for mds repaired (`issue#40472 <http://tracker.ceph.com/issues/40472>`_, `pr#30235 <https://github.com/ceph/ceph/pull/30235>`_, Zhi Zhang)
-* core: mon/MgrMonitor: fix null deref when invalid formatter is specified (`pr#29593 <https://github.com/ceph/ceph/pull/29593>`_, Sage Weil)
-* core: mon/OSDMonitor.cc: better error message about min_size (`pr#29618 <https://github.com/ceph/ceph/pull/29618>`_, Neha Ojha)
-* core: mon/OSDMonitor: trim not-longer-exist failure reporters (`pr#30903 <https://github.com/ceph/ceph/pull/30903>`_, NancySu05)
-* core: mon: C_AckMarkedDown has not handled the Callback Arguments (`pr#30213 <https://github.com/ceph/ceph/pull/30213>`_, NancySu05)
-* core: mon: ensure prepare_failure() marks no_reply on op (`pr#30481 <https://github.com/ceph/ceph/pull/30481>`_, Joao Eduardo Luis)
-* core: mon: paxos: introduce new reset_pending_committing_finishers for safety (`issue#39744 <http://tracker.ceph.com/issues/39744>`_, `issue#39484 <http://tracker.ceph.com/issues/39484>`_, `pr#28540 <https://github.com/ceph/ceph/pull/28540>`_, Greg Farnum)
-* core: mon: show pool id in pool ls command (`issue#40287 <http://tracker.ceph.com/issues/40287>`_, `pr#30485 <https://github.com/ceph/ceph/pull/30485>`_, Chang Liu)
-* core: osd beacon sometimes has empty pg list (`issue#40464 <http://tracker.ceph.com/issues/40464>`_, `issue#40377 <http://tracker.ceph.com/issues/40377>`_, `pr#29253 <https://github.com/ceph/ceph/pull/29253>`_, Sage Weil)
-* core: osd/OSD.cc: make osd bench description consistent with parameters (`issue#39374 <http://tracker.ceph.com/issues/39374>`_, `issue#39006 <http://tracker.ceph.com/issues/39006>`_, `pr#28097 <https://github.com/ceph/ceph/pull/28097>`_, Neha Ojha)
-* core: osd/OSDCap: Check for empty namespace (`issue#40835 <http://tracker.ceph.com/issues/40835>`_, `pr#30214 <https://github.com/ceph/ceph/pull/30214>`_, Brad Hubbard)
-* core: osd/OSDMap: Replace get_out_osds with get_out_existing_osds (`issue#39422 <http://tracker.ceph.com/issues/39422>`_, `issue#39154 <http://tracker.ceph.com/issues/39154>`_, `pr#28142 <https://github.com/ceph/ceph/pull/28142>`_, Brad Hubbard)
-* core: osd/OSDMap: do not trust partially simplified pg_upmap_item (`pr#30898 <https://github.com/ceph/ceph/pull/30898>`_, xie xingguo)
-* core: osd/PG: Add PG to large omap log message (`pr#30924 <https://github.com/ceph/ceph/pull/30924>`_, Brad Hubbard)
-* core: osd/PG: fix last_complete re-calculation on splitting (`issue#39538 <http://tracker.ceph.com/issues/39538>`_, `issue#26958 <http://tracker.ceph.com/issues/26958>`_, `pr#28259 <https://github.com/ceph/ceph/pull/28259>`_, xie xingguo)
-* core: osd/PeeringState: do not complain about past_intervals constrained by oldest epoch (`pr#30222 <https://github.com/ceph/ceph/pull/30222>`_, Sage Weil)
-* core: osd/PeeringState: recover_got - add special handler for empty log (`pr#30895 <https://github.com/ceph/ceph/pull/30895>`_, xie xingguo)
-* core: osd/PrimaryLogPG: Avoid accessing destroyed references in finish_degr… (`pr#30291 <https://github.com/ceph/ceph/pull/30291>`_, Tao Ning)
-* core: osd/PrimaryLogPG: skip obcs that don't exist during backfill scan_range (`pr#31029 <https://github.com/ceph/ceph/pull/31029>`_, Sage Weil)
-* core: osd/PrimaryLogPG: update oi.size on write op implicitly truncating ob… (`pr#30275 <https://github.com/ceph/ceph/pull/30275>`_, xie xingguo)
-* core: osd: Better error message when OSD count is less than osd_pool_default_size (`issue#38617 <http://tracker.ceph.com/issues/38617>`_, `pr#30180 <https://github.com/ceph/ceph/pull/30180>`_, Kefu Chai, Sage Weil, zjh)
-* core: osd: Don't evict after a flush if intersecting scrub range (`issue#38840 <http://tracker.ceph.com/issues/38840>`_, `issue#39518 <http://tracker.ceph.com/issues/39518>`_, `pr#28232 <https://github.com/ceph/ceph/pull/28232>`_, David Zafman)
-* core: osd: Don't include user changeable flag in snaptrim related assert (`issue#38124 <http://tracker.ceph.com/issues/38124>`_, `issue#39698 <http://tracker.ceph.com/issues/39698>`_, `pr#28202 <https://github.com/ceph/ceph/pull/28202>`_, David Zafman)
-* core: osd: Fix for compatibility of encode/decode of osd_stat_t (`pr#31275 <https://github.com/ceph/ceph/pull/31275>`_, Kefu Chai, David Zafman)
-* core: osd: Include dups in copy_after() and copy_up_to() (`issue#39304 <http://tracker.ceph.com/issues/39304>`_, `pr#28089 <https://github.com/ceph/ceph/pull/28089>`_, David Zafman)
-* core: osd: Output Base64 encoding of CRC header if binary data present (`issue#39737 <http://tracker.ceph.com/issues/39737>`_, `pr#28503 <https://github.com/ceph/ceph/pull/28503>`_, David Zafman)
-* core: osd: Remove unused osdmap flags full, nearfull from output (`pr#30901 <https://github.com/ceph/ceph/pull/30901>`_, David Zafman)
-* core: osd: clear PG_STATE_CLEAN when repair object (`pr#30243 <https://github.com/ceph/ceph/pull/30243>`_, Zengran Zhang)
-* core: osd: fix build_incremental_map_msg (`issue#38282 <http://tracker.ceph.com/issues/38282>`_, `pr#31236 <https://github.com/ceph/ceph/pull/31236>`_, Sage Weil)
-* core: osd: make project_pg_history handle concurrent osdmap publish (`issue#26970 <http://tracker.ceph.com/issues/26970>`_, `pr#29976 <https://github.com/ceph/ceph/pull/29976>`_, Sage Weil)
-* core: osd: merge replica log on primary need according to replica log's crt (`pr#30916 <https://github.com/ceph/ceph/pull/30916>`_, Zengran Zhang)
-* core: osd: pg stuck in backfill_wait with plenty of disk space (`issue#38034 <http://tracker.ceph.com/issues/38034>`_, `pr#28201 <https://github.com/ceph/ceph/pull/28201>`_, xie xingguo, David Zafman)
-* core: osd: report omap/data/metadata usage (`issue#40639 <http://tracker.ceph.com/issues/40639>`_, `pr#28852 <https://github.com/ceph/ceph/pull/28852>`_, Sage Weil)
-* core: osd: rollforward may need to mark pglog dirty (`issue#40403 <http://tracker.ceph.com/issues/40403>`_, `pr#31035 <https://github.com/ceph/ceph/pull/31035>`_, Zengran Zhang)
-* core: osd: scrub error on big objects; make bluestore refuse to start on big objects (`pr#30784 <https://github.com/ceph/ceph/pull/30784>`_, David Zafman, Sage Weil)
-* core: osd: take heartbeat_lock when calling heartbeat() (`issue#39513 <http://tracker.ceph.com/issues/39513>`_, `issue#39439 <http://tracker.ceph.com/issues/39439>`_, `pr#28220 <https://github.com/ceph/ceph/pull/28220>`_, Sage Weil)
-* core: osds allows to partially start more than N+2 (`issue#38206 <http://tracker.ceph.com/issues/38206>`_, `issue#38076 <http://tracker.ceph.com/issues/38076>`_, `pr#29241 <https://github.com/ceph/ceph/pull/29241>`_, Sage Weil)
-* core: should report EINVAL in ErasureCode::parse() if m<=0 (`issue#38682 <http://tracker.ceph.com/issues/38682>`_, `issue#38751 <http://tracker.ceph.com/issues/38751>`_, `pr#28995 <https://github.com/ceph/ceph/pull/28995>`_, Sage Weil)
-* core: should set EPOLLET flag on del_event() (`issue#38856 <http://tracker.ceph.com/issues/38856>`_, `pr#29250 <https://github.com/ceph/ceph/pull/29250>`_, Roman Penyaev)
-* doc/ceph-fuse: mention -k option in ceph-fuse man page (`pr#30936 <https://github.com/ceph/ceph/pull/30936>`_, Rishabh Dave)
-* doc/rbd: s/guess/xml/ for codeblock lexer (`pr#31090 <https://github.com/ceph/ceph/pull/31090>`_, Kefu Chai)
-* doc/rgw: document use of 'realm pull' instead of 'period pull' (`issue#39655 <http://tracker.ceph.com/issues/39655>`_, `pr#30131 <https://github.com/ceph/ceph/pull/30131>`_, Casey Bodley)
-* doc: Document behaviour of fsync-after-close (`issue#24641 <http://tracker.ceph.com/issues/24641>`_, `pr#29765 <https://github.com/ceph/ceph/pull/29765>`_, Jos Collin, Jeff Layton)
-* doc: Object Gateway multisite document read-only argument error (`issue#40497 <http://tracker.ceph.com/issues/40497>`_, `pr#29289 <https://github.com/ceph/ceph/pull/29289>`_, Chenjiong Deng)
-* doc: default values for mon_health_to_clog\_\* were flipped (`pr#30227 <https://github.com/ceph/ceph/pull/30227>`_, James McClune)
-* doc: describe metadata_heap cleanup (`issue#18174 <http://tracker.ceph.com/issues/18174>`_, `pr#30070 <https://github.com/ceph/ceph/pull/30070>`_, Dan van der Ster)
-* doc: fix rgw_ldap_dnattr username token (`pr#30099 <https://github.com/ceph/ceph/pull/30099>`_, Thomas Kriechbaumer)
-* doc: rgw: CreateBucketConfiguration for s3 PUT Bucket request (`issue#39602 <http://tracker.ceph.com/issues/39602>`_, `issue#39597 <http://tracker.ceph.com/issues/39597>`_, `pr#29257 <https://github.com/ceph/ceph/pull/29257>`_, Casey Bodley)
-* doc: update bluestore cache settings and clarify data fraction (`issue#39522 <http://tracker.ceph.com/issues/39522>`_, `pr#31258 <https://github.com/ceph/ceph/pull/31258>`_, Jan Fajerski)
-* doc: wrong value of usage log default in logging section (`issue#37891 <http://tracker.ceph.com/issues/37891>`_, `issue#37856 <http://tracker.ceph.com/issues/37856>`_, `pr#29014 <https://github.com/ceph/ceph/pull/29014>`_, Abhishek Lekshmanan)
-* filestore: assure sufficient leaves in pre-split (`issue#39390 <http://tracker.ceph.com/issues/39390>`_, `pr#30182 <https://github.com/ceph/ceph/pull/30182>`_, Jeegn Chen)
-* krbd: avoid udev netlink socket overrun and retry on transient errors from udev_enumerate_scan_devices() (`pr#31322 <https://github.com/ceph/ceph/pull/31322>`_, Ilya Dryomov, Adam C. Emerson)
-* krbd: fix rbd map hang due to udev return subsystem unordered (`issue#39089 <http://tracker.ceph.com/issues/39089>`_, `pr#30176 <https://github.com/ceph/ceph/pull/30176>`_, Zhi Zhang)
-* mgr/balancer: fix fudge (`pr#28399 <https://github.com/ceph/ceph/pull/28399>`_, xie xingguo)
-* mgr/balancer: python3 compatibility issue (`pr#31013 <https://github.com/ceph/ceph/pull/31013>`_, Mykola Golub)
-* mgr/balancer: restrict automatic balancing to specific weekdays (`pr#26499 <https://github.com/ceph/ceph/pull/26499>`_, xie xingguo)
-* mgr/crash: fix python3 invalid syntax problems (`pr#29029 <https://github.com/ceph/ceph/pull/29029>`_, Ricardo Dias)
-* mgr/dashboard: Fix run-frontend-e2e-tests.sh (`issue#40707 <http://tracker.ceph.com/issues/40707>`_, `pr#28954 <https://github.com/ceph/ceph/pull/28954>`_, Kiefer Chang, Tiago Melo)
-* mgr/dashboard: Fix various RGW issues (`pr#28210 <https://github.com/ceph/ceph/pull/28210>`_, Volker Theile)
-* mgr/dashboard: RGW proxy can't handle self-signed SSL certificates (`pr#30543 <https://github.com/ceph/ceph/pull/30543>`_, Volker Theile)
-* mgr/dashboard: cephfs multimds graphs stack together (`issue#40660 <http://tracker.ceph.com/issues/40660>`_, `pr#28911 <https://github.com/ceph/ceph/pull/28911>`_, Kiefer Chang)
-* mgr/localpool: pg_num is an int arg to 'osd pool create' (`pr#30447 <https://github.com/ceph/ceph/pull/30447>`_, Sage Weil)
-* mgr/prometheus: Cast collect_timeout (scrape_interval) to float (`pr#31108 <https://github.com/ceph/ceph/pull/31108>`_, Ben Meekhof)
-* mgr/prometheus: replace whitespaces in metrics' names (`issue#39458 <http://tracker.ceph.com/issues/39458>`_, `pr#28165 <https://github.com/ceph/ceph/pull/28165>`_, Alfonso Martínez)
-* mgr/telemetry: Ignore crashes in report when module not enabled (`pr#30846 <https://github.com/ceph/ceph/pull/30846>`_, Wido den Hollander)
-* mgr: DaemonServer::handle_conf_change - broken locking (`issue#38899 <http://tracker.ceph.com/issues/38899>`_, `issue#38963 <http://tracker.ceph.com/issues/38963>`_, `pr#29197 <https://github.com/ceph/ceph/pull/29197>`_, xie xingguo)
-* mgr: deadlock (`issue#39040 <http://tracker.ceph.com/issues/39040>`_, `issue#39426 <http://tracker.ceph.com/issues/39426>`_, `pr#28161 <https://github.com/ceph/ceph/pull/28161>`_, xie xingguo)
-* mgr: do not reset reported if a new metric is not collected (`pr#30391 <https://github.com/ceph/ceph/pull/30391>`_, Ilsoo Byun)
-* radosgw-admin: bucket sync status not 'caught up' during full sync (`issue#40806 <http://tracker.ceph.com/issues/40806>`_, `pr#30170 <https://github.com/ceph/ceph/pull/30170>`_, Casey Bodley)
-* rbd-mirror: cannot restore deferred deletion mirrored images (`pr#30828 <https://github.com/ceph/ceph/pull/30828>`_, Jason Dillaman, Mykola Golub)
-* rbd-mirror: clear out bufferlist prior to listing mirror images (`issue#39461 <http://tracker.ceph.com/issues/39461>`_, `issue#39407 <http://tracker.ceph.com/issues/39407>`_, `pr#28123 <https://github.com/ceph/ceph/pull/28123>`_, Jason Dillaman)
-* rbd-mirror: don't overwrite status error returned by replay (`pr#29872 <https://github.com/ceph/ceph/pull/29872>`_, Mykola Golub)
-* rbd-mirror: handle duplicates in image sync throttler queue (`issue#40519 <http://tracker.ceph.com/issues/40519>`_, `issue#40593 <http://tracker.ceph.com/issues/40593>`_, `pr#28815 <https://github.com/ceph/ceph/pull/28815>`_, Mykola Golub)
-* rbd-mirror: ignore errors relating to parsing the cluster config file (`pr#30117 <https://github.com/ceph/ceph/pull/30117>`_, Jason Dillaman)
-* rbd/action: fix error getting positional argument (`issue#40095 <http://tracker.ceph.com/issues/40095>`_, `pr#29294 <https://github.com/ceph/ceph/pull/29294>`_, songweibin)
-* rbd/tests: avoid hexdump skip and length options in krbd test (`pr#30569 <https://github.com/ceph/ceph/pull/30569>`_, Ilya Dryomov)
-* rbd: Reduce log level for cls/journal and cls/rbd expected errors (`issue#40865 <http://tracker.ceph.com/issues/40865>`_, `pr#29565 <https://github.com/ceph/ceph/pull/29565>`_, Jason Dillaman)
-* rbd: filter out group/trash snapshots from snap_list (`issue#38538 <http://tracker.ceph.com/issues/38538>`_, `issue#39186 <http://tracker.ceph.com/issues/39186>`_, `pr#28138 <https://github.com/ceph/ceph/pull/28138>`_, songweibin, Jason Dillaman)
-* rbd: journal: properly advance read offset after skipping invalid range (`pr#28814 <https://github.com/ceph/ceph/pull/28814>`_, Mykola Golub)
-* rbd: librbd: add missing shutdown states to managed lock helper (`issue#38387 <http://tracker.ceph.com/issues/38387>`_, `issue#38509 <http://tracker.ceph.com/issues/38509>`_, `pr#28151 <https://github.com/ceph/ceph/pull/28151>`_, Jason Dillaman)
-* rbd: librbd: async open/close should free ImageCtx before issuing callback (`issue#39429 <http://tracker.ceph.com/issues/39429>`_, `issue#39031 <http://tracker.ceph.com/issues/39031>`_, `pr#28125 <https://github.com/ceph/ceph/pull/28125>`_, Jason Dillaman)
-* rbd: librbd: avoid dereferencing an empty container during deep-copy (`issue#40368 <http://tracker.ceph.com/issues/40368>`_, `pr#30177 <https://github.com/ceph/ceph/pull/30177>`_, Jason Dillaman)
-* rbd: librbd: disable image mirroring when moving to trash (`pr#28150 <https://github.com/ceph/ceph/pull/28150>`_, Mykola Golub)
-* rbd: librbd: ensure compare-and-write doesn't skip compare after copyup (`issue#38383 <http://tracker.ceph.com/issues/38383>`_, `issue#38441 <http://tracker.ceph.com/issues/38441>`_, `pr#28133 <https://github.com/ceph/ceph/pull/28133>`_, Ilya Dryomov)
-* rbd: librbd: properly handle potential object map failures (`issue#39952 <http://tracker.ceph.com/issues/39952>`_, `issue#36074 <http://tracker.ceph.com/issues/36074>`_, `pr#30796 <https://github.com/ceph/ceph/pull/30796>`_, Jason Dillaman, Mykola Golub)
-* rbd: librbd: properly track in-flight flush requests (`issue#40573 <http://tracker.ceph.com/issues/40573>`_, `pr#28770 <https://github.com/ceph/ceph/pull/28770>`_, Jason Dillaman)
-* rbd: librbd: race condition possible when validating RBD pool (`issue#38500 <http://tracker.ceph.com/issues/38500>`_, `issue#38563 <http://tracker.ceph.com/issues/38563>`_, `pr#28139 <https://github.com/ceph/ceph/pull/28139>`_, Jason Dillaman)
-* rbd: use the ordered throttle for the export action (`issue#40435 <http://tracker.ceph.com/issues/40435>`_, `pr#30178 <https://github.com/ceph/ceph/pull/30178>`_, Jason Dillaman)
-* restful: Query nodes_by_id for items (`pr#31273 <https://github.com/ceph/ceph/pull/31273>`_, Boris Ranto)
-* rgw admin: disable stale instance delete in a multiste env (`pr#30340 <https://github.com/ceph/ceph/pull/30340>`_, Abhishek Lekshmanan)
-* rgw/OutputDataSocket: append_output(buffer::list&) says it will (but does not) discard output at data_max_backlog (`issue#40178 <http://tracker.ceph.com/issues/40178>`_, `issue#40351 <http://tracker.ceph.com/issues/40351>`_, `pr#29279 <https://github.com/ceph/ceph/pull/29279>`_, Matt Benjamin)
-* rgw/cls: keep issuing bilog trim ops after reset (`issue#40187 <http://tracker.ceph.com/issues/40187>`_, `pr#30074 <https://github.com/ceph/ceph/pull/30074>`_, Casey Bodley)
-* rgw/multisite: Don't allow certain radosgw-admin commands to run on non-master zone (`issue#39548 <http://tracker.ceph.com/issues/39548>`_, `pr#30133 <https://github.com/ceph/ceph/pull/30133>`_, Shilpa Jagannath)
-* rgw/rgw_op: Remove get_val from hotpath via legacy options (`pr#30141 <https://github.com/ceph/ceph/pull/30141>`_, Mark Nelson)
-* rgw: Add support for --bypass-gc flag of radosgw-admin bucket rm command in RGW Multi-site (`issue#39748 <http://tracker.ceph.com/issues/39748>`_, `issue#24991 <http://tracker.ceph.com/issues/24991>`_, `pr#29262 <https://github.com/ceph/ceph/pull/29262>`_, Casey Bodley)
-* rgw: Don't crash on copy when metadata directive not supplied (`issue#40416 <http://tracker.ceph.com/issues/40416>`_, `pr#29500 <https://github.com/ceph/ceph/pull/29500>`_, Adam C. Emerson)
-* rgw: Fix bucket versioning vs. swift metadata bug (`pr#30140 <https://github.com/ceph/ceph/pull/30140>`_, Marcus Watts)
-* rgw: Fix rgw decompression log-print (`pr#30156 <https://github.com/ceph/ceph/pull/30156>`_, Han Fengzhe)
-* rgw: Multisite sync corruption for large multipart obj (`issue#40144 <http://tracker.ceph.com/issues/40144>`_, `pr#29273 <https://github.com/ceph/ceph/pull/29273>`_, Casey Bodley, Tianshan Qu, Xiaoxi CHEN)
-* rgw: RGWCoroutine::call(nullptr) sets retcode=0 (`pr#30159 <https://github.com/ceph/ceph/pull/30159>`_, Casey Bodley)
-* rgw: Return tenant field in bucket_stats function (`issue#40038 <http://tracker.ceph.com/issues/40038>`_, `pr#28209 <https://github.com/ceph/ceph/pull/28209>`_, Volker Theile)
-* rgw: S3 policy evaluated incorrectly (`issue#38638 <http://tracker.ceph.com/issues/38638>`_, `issue#39274 <http://tracker.ceph.com/issues/39274>`_, `pr#29255 <https://github.com/ceph/ceph/pull/29255>`_, Pritha Srivastava)
-* rgw: Save an unnecessary copy of RGWEnv (`pr#29483 <https://github.com/ceph/ceph/pull/29483>`_, Mark Kogan)
-* rgw: Swift interface: server side copy fails if object name contains '?' (`issue#27217 <http://tracker.ceph.com/issues/27217>`_, `issue#40128 <http://tracker.ceph.com/issues/40128>`_, `pr#29267 <https://github.com/ceph/ceph/pull/29267>`_, Casey Bodley)
-* rgw: TempURL should not allow PUTs with the X-Object-Manifest (`issue#40133 <http://tracker.ceph.com/issues/40133>`_, `issue#20797 <http://tracker.ceph.com/issues/20797>`_, `pr#28711 <https://github.com/ceph/ceph/pull/28711>`_, Radoslaw Zarzynski)
-* rgw: abort multipart fix (`pr#29016 <https://github.com/ceph/ceph/pull/29016>`_, J. Eric Ivancich)
-* rgw: asio: check the remote endpoint before processing requests (`pr#30977 <https://github.com/ceph/ceph/pull/30977>`_, Abhishek Lekshmanan)
-* rgw: conditionally allow builtin users with non-unique email addresses (`issue#40089 <http://tracker.ceph.com/issues/40089>`_, `issue#40507 <http://tracker.ceph.com/issues/40507>`_, `pr#28716 <https://github.com/ceph/ceph/pull/28716>`_, Matt Benjamin)
-* rgw: data/bilogs are trimmed when no peers are reading them (`issue#39487 <http://tracker.ceph.com/issues/39487>`_, `pr#30130 <https://github.com/ceph/ceph/pull/30130>`_, Casey Bodley)
-* rgw: datalog/mdlog trim commands loop until done (`pr#30868 <https://github.com/ceph/ceph/pull/30868>`_, Casey Bodley)
-* rgw: do necessary checking of website configuration (`issue#40678 <http://tracker.ceph.com/issues/40678>`_, `pr#30980 <https://github.com/ceph/ceph/pull/30980>`_, Enming Zhang)
-* rgw: don't throw when accept errors are happening on frontend (`pr#30154 <https://github.com/ceph/ceph/pull/30154>`_, Yuval Lifshitz)
-* rgw: fix CreateBucket with BucketLocation parameter failed under default zonegroup (`pr#30171 <https://github.com/ceph/ceph/pull/30171>`_, Enming Zhang)
-* rgw: fix bucket may redundantly list keys after BI_PREFIX_CHAR (`issue#40147 <http://tracker.ceph.com/issues/40147>`_, `issue#39984 <http://tracker.ceph.com/issues/39984>`_, `pr#28409 <https://github.com/ceph/ceph/pull/28409>`_, Casey Bodley, Tianshan Qu)
-* rgw: fix cls_bucket_list_unordered() partial results (`pr#30253 <https://github.com/ceph/ceph/pull/30253>`_, Mark Kogan)
-* rgw: fix data sync start delay if remote haven't init data_log (`pr#30510 <https://github.com/ceph/ceph/pull/30510>`_, Tianshan Qu)
-* rgw: fix drain handles error when deleting bucket with bypass-gc option (`pr#29984 <https://github.com/ceph/ceph/pull/29984>`_, dongdong tao)
-* rgw: fix list bucket with delimiter wrongly skip some special keys (`issue#40905 <http://tracker.ceph.com/issues/40905>`_, `pr#30168 <https://github.com/ceph/ceph/pull/30168>`_, Tianshan Qu)
-* rgw: fix list versions starts with version_id=null (`pr#30775 <https://github.com/ceph/ceph/pull/30775>`_, Tianshan Qu)
-* rgw: fix potential realm watch lost (`issue#40991 <http://tracker.ceph.com/issues/40991>`_, `pr#30167 <https://github.com/ceph/ceph/pull/30167>`_, Tianshan Qu)
-* rgw: fix race b/w bucket reshard and ops waiting on reshard completion (`pr#29139 <https://github.com/ceph/ceph/pull/29139>`_, J. Eric Ivancich)
-* rgw: fix refcount tags to match and update object's idtag (`pr#30891 <https://github.com/ceph/ceph/pull/30891>`_, J. Eric Ivancich)
-* rgw: fixed "unrecognized arg" error when using "radosgw-admin zone rm" (`pr#30172 <https://github.com/ceph/ceph/pull/30172>`_, Hongang Chen)
-* rgw: gc remove tag after all sub io finish (`issue#40903 <http://tracker.ceph.com/issues/40903>`_, `pr#30173 <https://github.com/ceph/ceph/pull/30173>`_, Tianshan Qu)
-* rgw: housekeeping of reset stats operation in radosgw-admin and cls back-end (`pr#30165 <https://github.com/ceph/ceph/pull/30165>`_, J. Eric Ivancich)
-* rgw: increase beast parse buffer size to 64k (`pr#30450 <https://github.com/ceph/ceph/pull/30450>`_, Casey Bodley)
-* rgw: ldap auth: S3 auth failure should return InvalidAccessKeyId (`pr#30652 <https://github.com/ceph/ceph/pull/30652>`_, Matt Benjamin)
-* rgw: make dns hostnames matching case insensitive (`issue#40995 <http://tracker.ceph.com/issues/40995>`_, `pr#30166 <https://github.com/ceph/ceph/pull/30166>`_, Casey Bodley, Abhishek Lekshmanan)
-* rgw: mitigate bucket list with max-entries excessively high (`pr#30134 <https://github.com/ceph/ceph/pull/30134>`_, J. Eric Ivancich)
-* rgw: multisite: 'radosgw-admin bucket sync status' should call syncs_from(source.name) instead of id (`issue#40022 <http://tracker.ceph.com/issues/40022>`_, `issue#40141 <http://tracker.ceph.com/issues/40141>`_, `pr#29270 <https://github.com/ceph/ceph/pull/29270>`_, Casey Bodley)
-* rgw: multisite: RGWListBucketIndexesCR for data full sync needs pagination (`issue#39551 <http://tracker.ceph.com/issues/39551>`_, `issue#40354 <http://tracker.ceph.com/issues/40354>`_, `pr#29284 <https://github.com/ceph/ceph/pull/29284>`_, Shilpa Jagannath)
-* rgw: multisite: data sync loops back to the start of the datalog after reaching the end (`issue#39033 <http://tracker.ceph.com/issues/39033>`_, `issue#39074 <http://tracker.ceph.com/issues/39074>`_, `pr#29021 <https://github.com/ceph/ceph/pull/29021>`_, Casey Bodley)
-* rgw: multisite: mismatch of bucket creation times from List Buckets (`issue#39635 <http://tracker.ceph.com/issues/39635>`_, `issue#39734 <http://tracker.ceph.com/issues/39734>`_, `pr#28483 <https://github.com/ceph/ceph/pull/28483>`_, Casey Bodley)
-* rgw: multisite: overwrites in versioning-suspended buckets fail to sync (`issue#38080 <http://tracker.ceph.com/issues/38080>`_, `issue#37792 <http://tracker.ceph.com/issues/37792>`_, `pr#29017 <https://github.com/ceph/ceph/pull/29017>`_, Casey Bodley)
-* rgw: multisite: period pusher gets 403 Forbidden against other zonegroups (`issue#39415 <http://tracker.ceph.com/issues/39415>`_, `issue#39287 <http://tracker.ceph.com/issues/39287>`_, `pr#29256 <https://github.com/ceph/ceph/pull/29256>`_, Casey Bodley)
-* rgw: non-existent mdlog failures logged at level 0 (`issue#38747 <http://tracker.ceph.com/issues/38747>`_, `issue#40033 <http://tracker.ceph.com/issues/40033>`_, `pr#28757 <https://github.com/ceph/ceph/pull/28757>`_, Abhishek Lekshmanan)
-* rgw: perfcounters: add gc retire counter (`pr#30073 <https://github.com/ceph/ceph/pull/30073>`_, Matt Benjamin)
-* rgw: permit rgw-admin to populate user info by access-key (`pr#30105 <https://github.com/ceph/ceph/pull/30105>`_, Matt Benjamin, Marc Koderer)
-* rgw: provide admin-friendly reshard status output (`issue#37615 <http://tracker.ceph.com/issues/37615>`_, `issue#40357 <http://tracker.ceph.com/issues/40357>`_, `pr#29285 <https://github.com/ceph/ceph/pull/29285>`_, Mark Kogan)
-* rgw: remove_olh_pending_entries() does not limit the number of xattrs to remove (`issue#39179 <http://tracker.ceph.com/issues/39179>`_, `issue#39118 <http://tracker.ceph.com/issues/39118>`_, `pr#28348 <https://github.com/ceph/ceph/pull/28348>`_, Casey Bodley)
-* rgw: resharding of a versioned bucket causes a bucket stats discrepancy (`issue#39532 <http://tracker.ceph.com/issues/39532>`_, `pr#28249 <https://github.com/ceph/ceph/pull/28249>`_, J. Eric Ivancich)
-* rgw: return ERR_NO_SUCH_BUCKET early while evaluating bucket policy (`issue#38420 <http://tracker.ceph.com/issues/38420>`_, `issue#39697 <http://tracker.ceph.com/issues/39697>`_, `pr#28422 <https://github.com/ceph/ceph/pull/28422>`_, Abhishek Lekshmanan)
-* rgw: rgw_file: all directories are virtual with respect to contents (`issue#40262 <http://tracker.ceph.com/issues/40262>`_, `issue#40204 <http://tracker.ceph.com/issues/40204>`_, `pr#28887 <https://github.com/ceph/ceph/pull/28887>`_, Matt Benjamin)
-* rgw: set null version object issues (`issue#36763 <http://tracker.ceph.com/issues/36763>`_, `issue#40360 <http://tracker.ceph.com/issues/40360>`_, `pr#29288 <https://github.com/ceph/ceph/pull/29288>`_, Tianshan Qu)
-* rgw: support delimiter longer then one symbol (`issue#39989 <http://tracker.ceph.com/issues/39989>`_, `issue#38776 <http://tracker.ceph.com/issues/38776>`_, `pr#29018 <https://github.com/ceph/ceph/pull/29018>`_, Tianshan Qu, Matt Benjamin)
-* rgw: swift object expiry fails when a bucket reshards (`issue#39741 <http://tracker.ceph.com/issues/39741>`_, `pr#29258 <https://github.com/ceph/ceph/pull/29258>`_, Casey Bodley, Abhishek Lekshmanan, J. Eric Ivancich)
-* rgw: swift: refrain from corrupting static large objects when using nginx as a GET cache (`pr#30135 <https://github.com/ceph/ceph/pull/30135>`_, Andrey Groshev)
-* rgw: the Multi-Object Delete operation of S3 API wrongly handles the Code response element (`issue#18241 <http://tracker.ceph.com/issues/18241>`_, `issue#40136 <http://tracker.ceph.com/issues/40136>`_, `pr#29268 <https://github.com/ceph/ceph/pull/29268>`_, Radoslaw Zarzynski)
-* rgw: update resharding documentation (`issue#39047 <http://tracker.ceph.com/issues/39047>`_, `pr#29020 <https://github.com/ceph/ceph/pull/29020>`_, J. Eric Ivancich)
-* rgw_file:  fix invalidation of top-level directories (`issue#40215 <http://tracker.ceph.com/issues/40215>`_, `pr#29276 <https://github.com/ceph/ceph/pull/29276>`_, Matt Benjamin)
-* rgw_file: advance_mtime() should consider namespace expiration (`issue#40415 <http://tracker.ceph.com/issues/40415>`_, `pr#30660 <https://github.com/ceph/ceph/pull/30660>`_, Matt Benjamin)
-* rgw_file: fix readdir eof() calc--caller stop implies !eof and introduce fast S3 Unix stats (immutable) (`issue#40375 <http://tracker.ceph.com/issues/40375>`_, `issue#40456 <http://tracker.ceph.com/issues/40456>`_, `pr#30077 <https://github.com/ceph/ceph/pull/30077>`_, Matt Benjamin)
-* rgw_file: include tenant when hashing bucket names (`issue#40225 <http://tracker.ceph.com/issues/40225>`_, `issue#40118 <http://tracker.ceph.com/issues/40118>`_, `pr#29277 <https://github.com/ceph/ceph/pull/29277>`_, Matt Benjamin)
-* rgw_file: readdir: do not construct markers w/leading '/' (`pr#30157 <https://github.com/ceph/ceph/pull/30157>`_, Matt Benjamin)
-* rgw_file: save etag and acl info in setattr (`issue#39229 <http://tracker.ceph.com/issues/39229>`_, `pr#28073 <https://github.com/ceph/ceph/pull/28073>`_, Tao Chen)
-* rpm: missing dependency on python34-ceph-argparse from python34-cephfs (and others?) (`issue#24918 <http://tracker.ceph.com/issues/24918>`_, `issue#24919 <http://tracker.ceph.com/issues/24919>`_, `issue#37613 <http://tracker.ceph.com/issues/37613>`_, `pr#27949 <https://github.com/ceph/ceph/pull/27949>`_, Kefu Chai)
-* tests: cls_rbd: removed mirror peer pool test cases (`pr#31485 <https://github.com/ceph/ceph/pull/31485>`_, Jason Dillaman)
-* tests: librbd: set nbd timeout due to newer kernels defaulting it on (`pr#30424 <https://github.com/ceph/ceph/pull/30424>`_, Jason Dillaman)
-* tests: ceph-disk: use a Python2.7 compatible version of pytest (`pr#31254 <https://github.com/ceph/ceph/pull/31254>`_, Alfredo Deza)
-* tests: rgw: don't use ceph-ansible in s3a-hadoop suite (`issue#39706 <http://tracker.ceph.com/issues/39706>`_, `pr#30069 <https://github.com/ceph/ceph/pull/30069>`_, Casey Bodley)
-* tests/workunits/rbd: wait for rbd-nbd unmap to complete (`issue#39598 <http://tracker.ceph.com/issues/39598>`_, `issue#39674 <http://tracker.ceph.com/issues/39674>`_, `pr#28310 <https://github.com/ceph/ceph/pull/28310>`_, Jason Dillaman)
-* tests: fix issues in vstart runner (`pr#28208 <https://github.com/ceph/ceph/pull/28208>`_, Volker Theile)
-* tests: limit loops waiting for force-backfill/force-recovery to happen (`issue#38351 <http://tracker.ceph.com/issues/38351>`_, `issue#38309 <http://tracker.ceph.com/issues/38309>`_, `pr#29245 <https://github.com/ceph/ceph/pull/29245>`_, David Zafman)
-* tests: remove s3tests ! (`pr#31640 <https://github.com/ceph/ceph/pull/31640>`_, Yuri Weinstein)
-* tests: cephfs: TestMisc.test_evict_client fails (`issue#40219 <http://tracker.ceph.com/issues/40219>`_, `pr#29228 <https://github.com/ceph/ceph/pull/29228>`_, "Yan, Zheng")
-* tests: do not take ceph.conf.template from ceph/teuthology.git (`pr#30841 <https://github.com/ceph/ceph/pull/30841>`_, Sage Weil)
-* tests: ignore expected MDS_CLIENT_LATE_RELEASE warning (`issue#40968 <http://tracker.ceph.com/issues/40968>`_, `pr#29812 <https://github.com/ceph/ceph/pull/29812>`_, Patrick Donnelly)
-* tests: install python3-cephfs for fs suite (`pr#31285 <https://github.com/ceph/ceph/pull/31285>`_, Kefu Chai)
-* tests: kclient unmount hangs after file system goes down (`issue#38709 <http://tracker.ceph.com/issues/38709>`_, `issue#38677 <http://tracker.ceph.com/issues/38677>`_, `pr#29218 <https://github.com/ceph/ceph/pull/29218>`_, Patrick Donnelly)
-* tests: krbd_msgr_segments.t: filter lvcreate output (`pr#31324 <https://github.com/ceph/ceph/pull/31324>`_, Ilya Dryomov)
-* tests: make get_mon_status use mon addr (`pr#31461 <https://github.com/ceph/ceph/pull/31461>`_, Sage Weil, Nathan Cutler)
-* tests: make: \*\*\* [hello_world_cpp] Error 127 in rados (`issue#40320 <http://tracker.ceph.com/issues/40320>`_, `pr#29203 <https://github.com/ceph/ceph/pull/29203>`_, Kefu Chai)
-* tests: qa/standalone/scrub/osd-scrub-snaps.sh sometimes fails (`issue#40179 <http://tracker.ceph.com/issues/40179>`_, `issue#40078 <http://tracker.ceph.com/issues/40078>`_, `pr#29251 <https://github.com/ceph/ceph/pull/29251>`_, David Zafman)
-* tests: qa/tasks/ceph.py: pass cluster_name to get_mons (`pr#31424 <https://github.com/ceph/ceph/pull/31424>`_, Nathan Cutler)
-* tests: qa/workunits/rbd: stress test "rbd mirror pool status --verbose" (`pr#29873 <https://github.com/ceph/ceph/pull/29873>`_, Mykola Golub)
-* tests: remove "1node" and "systemd" tests as ceph-deploy is not actively developed (`pr#28457 <https://github.com/ceph/ceph/pull/28457>`_, Yuri Weinstein)
-* tests: sleep briefly after resetting kclient (`pr#29751 <https://github.com/ceph/ceph/pull/29751>`_, Patrick Donnelly)
-* tests: test_volume_client: print python version correctly (`issue#40317 <http://tracker.ceph.com/issues/40317>`_, `issue#40184 <http://tracker.ceph.com/issues/40184>`_, `pr#29208 <https://github.com/ceph/ceph/pull/29208>`_, Lianne)
-* tests: use curl in wait_for_radosgw() in util/rgw.py (`pr#28668 <https://github.com/ceph/ceph/pull/28668>`_, Ali Maredia)
-* tests: use hard_reset to reboot kclient (`issue#37681 <http://tracker.ceph.com/issues/37681>`_, `pr#30233 <https://github.com/ceph/ceph/pull/30233>`_, Patrick Donnelly)
-* tests: whitelisted  'application not enabled' (`pr#28389 <https://github.com/ceph/ceph/pull/28389>`_, Yuri Weinstein)
-* tools/rados: list objects in a pg (`issue#36732 <http://tracker.ceph.com/issues/36732>`_, `pr#30893 <https://github.com/ceph/ceph/pull/30893>`_, Vikhyat Umrao, Li Wang)
-* tools/rbd-ggate: close log before running postfork (`pr#30121 <https://github.com/ceph/ceph/pull/30121>`_, Willem Jan Withagen)
-* tools: Add clear-data-digest command to objectstore tool (`issue#37749 <http://tracker.ceph.com/issues/37749>`_, `pr#29196 <https://github.com/ceph/ceph/pull/29196>`_, Li Yichao)
-* tools: ceph-objectstore-tool can't remove head with bad snapset (`pr#30081 <https://github.com/ceph/ceph/pull/30081>`_, David Zafman)
-* tools: ceph-objectstore-tool: return 0 if incmap is sane (`pr#31659 <https://github.com/ceph/ceph/pull/31659>`_, Kefu Chai)
-* tools: ceph-objectstore-tool: update-mon-db: do not fail if incmap is missing (`pr#30979 <https://github.com/ceph/ceph/pull/30979>`_, Kefu Chai)
-* tools: crushtool crash on Fedora 28 and newer (`issue#39174 <http://tracker.ceph.com/issues/39174>`_, `issue#39311 <http://tracker.ceph.com/issues/39311>`_, `pr#27986 <https://github.com/ceph/ceph/pull/27986>`_, Brad Hubbard)
-
-
-v13.2.6 Mimic
-=============
-
-This is the sixth bugfix release of the Mimic v13.2.x long term
-stable release series. We recommend all Mimic users upgrade.
-
-Notable Changes
----------------
-* Ceph v13.2.6 now packages python bindings for python3.6 instead of
-  python3.4, because EPEL7 recently switched from python3.4 to
-  python3.6 as the native python3. See the `announcement <https://lists.fedoraproject.org/archives/list/epel-announce@lists.fedoraproject.org/message/EGUMKAIMPK2UD5VSHXM53BH2MBDGDWMO/>_`
-  for more details on the background of this change.
-
-Changelog
----------
-* cephfs: MDSMonitor: do not assign standby-replay when degraded (`issue#36384 <http://tracker.ceph.com/issues/36384>`_, `pr#26643 <https://github.com/ceph/ceph/pull/26643>`_, Patrick Donnelly)
-* ceph-volume: add --all flag to simple activate (`pr#26655 <https://github.com/ceph/ceph/pull/26655>`_, Jan Fajerski)
-* ceph-volume: use our own testinfra suite for functional testing (`pr#26702 <https://github.com/ceph/ceph/pull/26702>`_, Andrew Schoen)
-* cli: ability to change file ownership (`issue#38370 <http://tracker.ceph.com/issues/38370>`_, `pr#26760 <https://github.com/ceph/ceph/pull/26760>`_, Sébastien Han)
-* cli: better output of 'ceph health detail' (`issue#39266 <http://tracker.ceph.com/issues/39266>`_, `pr#27847 <https://github.com/ceph/ceph/pull/27847>`_, Shen Hang)
-* cls/rgw: raise debug level of bi_log_iterate_entries output (`pr#27973 <https://github.com/ceph/ceph/pull/27973>`_, Casey Bodley)
-* common: ceph_timer: stop timer's thread when it is suspended (`issue#37766 <http://tracker.ceph.com/issues/37766>`_, `pr#26583 <https://github.com/ceph/ceph/pull/26583>`_, Peng Wang)
-* common/str_map: fix trim() on empty string (`issue#38329 <http://tracker.ceph.com/issues/38329>`_, `pr#26810 <https://github.com/ceph/ceph/pull/26810>`_, Sage Weil)
-* core: ENOENT in collection_move_rename on EC backfill target (`issue#36739 <http://tracker.ceph.com/issues/36739>`_, `pr#27943 <https://github.com/ceph/ceph/pull/27943>`_, Neha Ojha)
-* core: Fix recovery and backfill priority handling (`issue#38041 <http://tracker.ceph.com/issues/38041>`_, `pr#27081 <https://github.com/ceph/ceph/pull/27081>`_, David Zafman)
-* crush: add root_bucket to identify underfull buckets (`issue#38826 <http://tracker.ceph.com/issues/38826>`_, `pr#27257 <https://github.com/ceph/ceph/pull/27257>`_, huangjun)
-* crush: backport recent upmap fixes (`issue#37968 <http://tracker.ceph.com/issues/37968>`_, `issue#38897 <http://tracker.ceph.com/issues/38897>`_, `issue#37940 <http://tracker.ceph.com/issues/37940>`_, `pr#27963 <https://github.com/ceph/ceph/pull/27963>`_, xie xingguo)
-* crush/CrushWrapper: ensure crush_choose_arg_map.size == max_buckets (`issue#38664 <http://tracker.ceph.com/issues/38664>`_, `pr#27082 <https://github.com/ceph/ceph/pull/27082>`_, Sage Weil)
-* doc: Fix incorrect mention of 'osd_deep_mon_scrub_interval' (`pr#26860 <https://github.com/ceph/ceph/pull/26860>`_, Ashish Singh)
-* doc: Minor rados related documentation fixes (`issue#38896 <http://tracker.ceph.com/issues/38896>`_, `pr#27188 <https://github.com/ceph/ceph/pull/27188>`_, David Zafman)
-* doc: osd_recovery_priority is not documented (but osd_recovery_op_priority is) (`issue#23999 <http://tracker.ceph.com/issues/23999>`_, `pr#26901 <https://github.com/ceph/ceph/pull/26901>`_, David Zafman)
-* doc/radosgw: Document mappings of S3 Operations to ACL grants (`issue#38523 <http://tracker.ceph.com/issues/38523>`_, `pr#26968 <https://github.com/ceph/ceph/pull/26968>`_, Adam C. Emerson)
-* doc/rgw: document placement target configuration (`issue#24508 <http://tracker.ceph.com/issues/24508>`_, `pr#27032 <https://github.com/ceph/ceph/pull/27032>`_, Casey Bodley)
-* doc: Update bluestore config docs - fix typo (as -> has) (`pr#27845 <https://github.com/ceph/ceph/pull/27845>`_, Yaniv Kaul)
-* doc: updated reference link for log based PG (`issue#38465 <http://tracker.ceph.com/issues/38465>`_, `pr#26829 <https://github.com/ceph/ceph/pull/26829>`_, James McClune)
-* include/intarith: enforce the same type for p2\*() arguments (`pr#27318 <https://github.com/ceph/ceph/pull/27318>`_, Ilya Dryomov)
-* librbd: avoid aggregate-initializing any static_visitor (`issue#38659 <http://tracker.ceph.com/issues/38659>`_, `pr#27041 <https://github.com/ceph/ceph/pull/27041>`_, Willem Jan Withagen)
-* librbd: avoid aggregate-initializing IsWriteOpVisitor (`issue#38660 <http://tracker.ceph.com/issues/38660>`_, `pr#27039 <https://github.com/ceph/ceph/pull/27039>`_, Willem Jan Withagen)
-* mds: drop reconnect message from non-existent session (`issue#39026 <http://tracker.ceph.com/issues/39026>`_, `pr#27916 <https://github.com/ceph/ceph/pull/27916>`_, Shen Hang)
-* mds: inode filtering on 'dump cache' asok (`issue#11172 <http://tracker.ceph.com/issues/11172>`_, `pr#27058 <https://github.com/ceph/ceph/pull/27058>`_, dongdong tao)
-* mds/server: check directory split after rename (`issue#38994 <http://tracker.ceph.com/issues/38994>`_, `pr#27917 <https://github.com/ceph/ceph/pull/27917>`_, Shen Hang)
-* mds: wait for client to release shared cap when re-acquiring xlock (`issue#38491 <http://tracker.ceph.com/issues/38491>`_, `pr#27023 <https://github.com/ceph/ceph/pull/27023>`_, "Yan, Zheng")
-* mgr/balancer: blame if upmap won't actually work (`issue#38780 <http://tracker.ceph.com/issues/38780>`_, `pr#26497 <https://github.com/ceph/ceph/pull/26497>`_, xie xingguo)
-* mgr/BaseMgrModule: drop GIL for ceph_send_command (`issue#38537 <http://tracker.ceph.com/issues/38537>`_, `pr#26833 <https://github.com/ceph/ceph/pull/26833>`_, Sage Weil)
-* mgr: crashdump feature backport (`pr#24639 <https://github.com/ceph/ceph/pull/24639>`_, Noah Watkins, Sage Weil, Dan Mick)
-* mgr/dashboard: fix for using '::' on hosts without ipv6 (`issue#38575 <http://tracker.ceph.com/issues/38575>`_, `pr#26750 <https://github.com/ceph/ceph/pull/26750>`_, Noah Watkins)
-* mgr/dashboard: Manager should complain about wrong dashboard certificate (`issue#24453 <http://tracker.ceph.com/issues/24453>`_, `pr#27747 <https://github.com/ceph/ceph/pull/27747>`_, Volker Theile, Ricardo Dias)
-* mgr/dashboard: Search broken for entries with null values (`issue#38583 <http://tracker.ceph.com/issues/38583>`_, `pr#26944 <https://github.com/ceph/ceph/pull/26944>`_, Patrick Nawracay)
-* mgr/dashboard: show I/O stats in Pool list (`pr#27053 <https://github.com/ceph/ceph/pull/27053>`_, Alfonso Martínez)
-* mgr/dashboard: Update npm packages (`issue#39080 <http://tracker.ceph.com/issues/39080>`_, `pr#26670 <https://github.com/ceph/ceph/pull/26670>`_, Tiago Melo)
-* mgr/dashboard: Use human readable units on the OSD I/O graphs (`issue#25075 <http://tracker.ceph.com/issues/25075>`_, `pr#27558 <https://github.com/ceph/ceph/pull/27558>`_, Tiago Melo)
-* mgr: drop GIL in get_config (`pr#26612 <https://github.com/ceph/ceph/pull/26612>`_, John Spray)
-* mgr: enable inter-module calls (`pr#27638 <https://github.com/ceph/ceph/pull/27638>`_, John Spray)
-* mgr/prometheus: add interface and objectstore to osd metadata (`pr#26537 <https://github.com/ceph/ceph/pull/26537>`_, Jan Fajerski, Konstantin Shalygin)
-* mgr/PyModule: put mgr_module_path first in sys.path (`issue#38469 <http://tracker.ceph.com/issues/38469>`_, `pr#26777 <https://github.com/ceph/ceph/pull/26777>`_, Tim Serong)
-* mon/OSDMonitor: fix osd boot check (`pr#27351 <https://github.com/ceph/ceph/pull/27351>`_, Sage Weil)
-* mon/OSDMonitor: further improve prepare_command_pool_set E2BIG error message (`issue#39353 <http://tracker.ceph.com/issues/39353>`_, `pr#27647 <https://github.com/ceph/ceph/pull/27647>`_, Nathan Cutler)
-* msg: output peer address when detecting bad CRCs (`issue#39367 <http://tracker.ceph.com/issues/39367>`_, `pr#27860 <https://github.com/ceph/ceph/pull/27860>`_, Greg Farnum)
-* multisite: bucket full sync does not handle delete markers (`issue#38007 <http://tracker.ceph.com/issues/38007>`_, `pr#26194 <https://github.com/ceph/ceph/pull/26194>`_, Casey Bodley)
-* multisite: rgw_data_sync_status json decode failure breaks automated datalog trimming (`issue#38373 <http://tracker.ceph.com/issues/38373>`_, `pr#26615 <https://github.com/ceph/ceph/pull/26615>`_, Casey Bodley)
-* os/bluestore: backport new bitmap allocator (`pr#26983 <https://github.com/ceph/ceph/pull/26983>`_, Igor Fedotov, Sage Weil)
-* os/bluestore: bitmap allocator might fail to return contiguous chunk despite having enough space (`pr#27298 <https://github.com/ceph/ceph/pull/27298>`_, Igor Fedotov)
-* os/bluestore: call fault_range properly prior to looking for blob to … (`pr#27570 <https://github.com/ceph/ceph/pull/27570>`_, Igor Fedotov)
-* os/bluestore: fix improper backport for p2 macros for bmap allocator (`pr#27606 <https://github.com/ceph/ceph/pull/27606>`_, Igor Fedotov)
-* os/bluestore: fix length overflow (`issue#39245 <http://tracker.ceph.com/issues/39245>`_, `pr#27366 <https://github.com/ceph/ceph/pull/27366>`_, Jianpeng Ma)
-* os/bluestore: fix out-of-bound access in bmap allocator (`pr#27738 <https://github.com/ceph/ceph/pull/27738>`_, Igor Fedotov)
-* os/bluestore_tool: bluefs-bdev-expand: indicate bypassed for main dev (`pr#27447 <https://github.com/ceph/ceph/pull/27447>`_, Igor Fedotov)
-* osd: FAILED ceph_assert(attrs || !pg_log.get_missing().is_missing(soid) || (it_objects != pg_log.get_log().objects.end() && it_objects->second->op == pg_log_entry_t::LOST_REVERT)) in PrimaryLogPG::get_object_context() (`issue#38931 <http://tracker.ceph.com/issues/38931>`_, `issue#38784 <http://tracker.ceph.com/issues/38784>`_, `pr#27940 <https://github.com/ceph/ceph/pull/27940>`_, xie xingguo)
-* osd: fixup OpTracker destruct assert, waiting_for_osdmap take ref      with OpRequest (`issue#38377 <http://tracker.ceph.com/issues/38377>`_, `pr#26862 <https://github.com/ceph/ceph/pull/26862>`_, linbing)
-* osd/PG: discover missing objects when an OSD peers and PG is degraded (`pr#27745 <https://github.com/ceph/ceph/pull/27745>`_, Jonas Jelten)
-* osd/PGLog.h: print olog_can_rollback_to before deciding to rollback (`issue#38894 <http://tracker.ceph.com/issues/38894>`_, `pr#27284 <https://github.com/ceph/ceph/pull/27284>`_, Neha Ojha)
-* osd/PGLog: preserve original_crt to check rollbackability (`issue#39023 <http://tracker.ceph.com/issues/39023>`_, `issue#36739 <http://tracker.ceph.com/issues/36739>`_, `pr#27629 <https://github.com/ceph/ceph/pull/27629>`_, Neha Ojha)
-* osd/PrimaryLogPG: handle object !exists in handle_watch_timeout (`issue#38432 <http://tracker.ceph.com/issues/38432>`_, `pr#26709 <https://github.com/ceph/ceph/pull/26709>`_, Sage Weil)
-* osd: process_copy_chunk remove obc ref before pg unlock (`issue#38842 <http://tracker.ceph.com/issues/38842>`_, `pr#27587 <https://github.com/ceph/ceph/pull/27587>`_, Zengran Zhang)
-* osd: shutdown recovery_request_timer earlier (`issue#38945 <http://tracker.ceph.com/issues/38945>`_, `pr#27938 <https://github.com/ceph/ceph/pull/27938>`_, Zengran Zhang)
-* pybind/rados: fixed Python3 string conversion issue on get_fsid (`issue#38381 <http://tracker.ceph.com/issues/38381>`_, `pr#27259 <https://github.com/ceph/ceph/pull/27259>`_, Jason Dillaman)
-* rbd: API list_images() Segmentation fault (`issue#38468 <http://tracker.ceph.com/issues/38468>`_, `pr#26707 <https://github.com/ceph/ceph/pull/26707>`_, songweibin)
-* rbd: krbd: return -ETIMEDOUT in polling (`issue#38792 <http://tracker.ceph.com/issues/38792>`_, `pr#27588 <https://github.com/ceph/ceph/pull/27588>`_, Dongsheng Yang)
-* rbd_mirror: don't report error if image replay canceled (`pr#26140 <https://github.com/ceph/ceph/pull/26140>`_, Mykola Golub)
-* rgw: Adding tcp_nodelay option to Beast (`issue#34308 <http://tracker.ceph.com/issues/34308>`_, `pr#27367 <https://github.com/ceph/ceph/pull/27367>`_, Or Friedmann)
-* rgw admin: add tenant argument to reshard cancel (`issue#38214 <http://tracker.ceph.com/issues/38214>`_, `pr#27603 <https://github.com/ceph/ceph/pull/27603>`_, Abhishek Lekshmanan)
-* rgw-admin: fix data sync report for master zone (`issue#38938 <http://tracker.ceph.com/issues/38938>`_, `pr#27421 <https://github.com/ceph/ceph/pull/27421>`_, cfanz)
-* rgw: admin: handle delete_at attr in object stat output (`pr#27828 <https://github.com/ceph/ceph/pull/27828>`_, Abhishek Lekshmanan)
-* rgw: allow radosgw-admin to list bucket w --allow-unordered (`pr#28096 <https://github.com/ceph/ceph/pull/28096>`_, J. Eric Ivancich)
-* rgw: beast: set a default port for endpoints (`issue#39000 <http://tracker.ceph.com/issues/39000>`_, `pr#27661 <https://github.com/ceph/ceph/pull/27661>`_, Abhishek Lekshmanan)
-* rgw: bucket limit check misbehaves for > max-entries buckets (usually 1000) (`pr#26945 <https://github.com/ceph/ceph/pull/26945>`_, Matt Benjamin)
-* rgw: bug in versioning concurrent, list and get have consistency issue (`issue#38060 <http://tracker.ceph.com/issues/38060>`_, `pr#26664 <https://github.com/ceph/ceph/pull/26664>`_, Wang Hao)
-* rgw: check for non-existent bucket in RGWGetACLs (`issue#38116 <http://tracker.ceph.com/issues/38116>`_, `pr#26529 <https://github.com/ceph/ceph/pull/26529>`_, Matt Benjamin)
-* rgw: cls_bucket_list_unordered lists a single shard (`issue#39393 <http://tracker.ceph.com/issues/39393>`_, `pr#28086 <https://github.com/ceph/ceph/pull/28086>`_, Casey Bodley)
-* rgw: data sync drains lease stack on lease failure (`issue#38479 <http://tracker.ceph.com/issues/38479>`_, `pr#26762 <https://github.com/ceph/ceph/pull/26762>`_, Casey Bodley)
-* rgw: don't crash on missing /etc/mime.types (`issue#38328 <http://tracker.ceph.com/issues/38328>`_, `pr#27354 <https://github.com/ceph/ceph/pull/27354>`_, Casey Bodley)
-* rgw: failed to pass test_bucket_create_naming_bad_punctuation in s3test (`issue#23587 <http://tracker.ceph.com/issues/23587>`_, `issue#26965 <http://tracker.ceph.com/issues/26965>`_, `pr#27666 <https://github.com/ceph/ceph/pull/27666>`_, yuliyang, Abhishek Lekshmanan)
-* rgw: fix bug of apply default quota, for this create new a user may core using beast (`issue#38847 <http://tracker.ceph.com/issues/38847>`_, `pr#27335 <https://github.com/ceph/ceph/pull/27335>`_, liaoxin01)
-* rgw: fix read not exists null version return wrong (`issue#38811 <http://tracker.ceph.com/issues/38811>`_, `pr#27304 <https://github.com/ceph/ceph/pull/27304>`_, Tianshan Qu)
-* rgw: Fix S3 compatibility bug when CORS is not found (`issue#37945 <http://tracker.ceph.com/issues/37945>`_, `pr#27356 <https://github.com/ceph/ceph/pull/27356>`_, Nick Janus)
-* rgw: GetBucketCORS API returns Not Found error code when CORS configuration does not exist (`issue#26964 <http://tracker.ceph.com/issues/26964>`_, `pr#27122 <https://github.com/ceph/ceph/pull/27122>`_, yuliyang, ashitakasam)
-* rgw: get or set realm zonegroup zone should check user's caps for security (`issue#37352 <http://tracker.ceph.com/issues/37352>`_, `pr#27948 <https://github.com/ceph/ceph/pull/27948>`_, yuliyang, Casey Bodley)
-* rgw: ldap: fix LDAPAuthEngine::init() when uri !empty() (`issue#38699 <http://tracker.ceph.com/issues/38699>`_, `pr#27174 <https://github.com/ceph/ceph/pull/27174>`_, Matt Benjamin)
-* rgw: multiple es related fixes and improvements (`issue#38028 <http://tracker.ceph.com/issues/38028>`_, `issue#22877 <http://tracker.ceph.com/issues/22877>`_, `issue#36233 <http://tracker.ceph.com/issues/36233>`_, `issue#38030 <http://tracker.ceph.com/issues/38030>`_, `issue#36092 <http://tracker.ceph.com/issues/36092>`_, `pr#26517 <https://github.com/ceph/ceph/pull/26517>`_, Yehuda Sadeh, Abhishek Lekshmanan, Willem Jan Withagen)
-* rgw: nfs: skip empty (non-POSIX) path segments (`issue#38744 <http://tracker.ceph.com/issues/38744>`_, `pr#27179 <https://github.com/ceph/ceph/pull/27179>`_, Matt Benjamin)
-* rgw: only update last_trim marker on ENODATA (`issue#38075 <http://tracker.ceph.com/issues/38075>`_, `pr#26641 <https://github.com/ceph/ceph/pull/26641>`_, Casey Bodley)
-* rgw: resolve bugs and clean up garbage collection code (`issue#38454 <http://tracker.ceph.com/issues/38454>`_, `pr#27796 <https://github.com/ceph/ceph/pull/27796>`_, J. Eric Ivancich)
-* rgw: rgw_file: use correct secret key to check auth (`issue#37855 <http://tracker.ceph.com/issues/37855>`_, `pr#26687 <https://github.com/ceph/ceph/pull/26687>`_, MinSheng Lin)
-* rgw: sse c fixes (`issue#38700 <http://tracker.ceph.com/issues/38700>`_, `pr#27297 <https://github.com/ceph/ceph/pull/27297>`_, Adam Kupczyk, Casey Bodley, Abhishek Lekshmanan)
-* rgw: sync module: avoid printing attrs of objects in log (`issue#37646 <http://tracker.ceph.com/issues/37646>`_, `pr#27029 <https://github.com/ceph/ceph/pull/27029>`_, Abhishek Lekshmanan)
-* rgw: use chunked encoding to get partial results out faster (`issue#12713 <http://tracker.ceph.com/issues/12713>`_, `pr#28014 <https://github.com/ceph/ceph/pull/28014>`_, Robin H. Johnson)
-* rgw: when exclusive lock fails due existing lock, log add'l info (`issue#38171 <http://tracker.ceph.com/issues/38171>`_, `pr#26553 <https://github.com/ceph/ceph/pull/26553>`_, J. Eric Ivancich)
-* rgw: when using nfs-ganesha to upload file, rgw es sync module get failed (`issue#36233 <http://tracker.ceph.com/issues/36233>`_, `pr#27972 <https://github.com/ceph/ceph/pull/27972>`_, Abhishek Lekshmanan)
-* run-standalone.sh: Need double-quotes to handle | in core_pattern on all distributions (`issue#38325 <http://tracker.ceph.com/issues/38325>`_, `pr#26811 <https://github.com/ceph/ceph/pull/26811>`_, David Zafman)
-* spdk: update to latest spdk-18.05 branch (`pr#27451 <https://github.com/ceph/ceph/pull/27451>`_, Kefu Chai)
-* test: run-standalone.sh set local library location so mgr can find li… (`issue#38262 <http://tracker.ceph.com/issues/38262>`_, `pr#26495 <https://github.com/ceph/ceph/pull/26495>`_, David Zafman)
-* test/store_test: fix/workaround for BlobReuseOnOverwriteUT and garbageCollection (`pr#27055 <https://github.com/ceph/ceph/pull/27055>`_, Igor Fedotov)
-* test: Verify a log trim trims the dup_index (`pr#26578 <https://github.com/ceph/ceph/pull/26578>`_, Brad Hubbard)
-* tools: ceph-disk/tests: use random unused port for CEPH_MON (`issue#39066 <http://tracker.ceph.com/issues/39066>`_, `pr#27228 <https://github.com/ceph/ceph/pull/27228>`_, Kefu Chai)
-* tools: ceph-objectstore-tool: rename dump-import to dump-export (`issue#39284 <http://tracker.ceph.com/issues/39284>`_, `pr#27635 <https://github.com/ceph/ceph/pull/27635>`_, David Zafman)
-
-
-v13.2.5 Mimic
-=============
-
-This is the fifth bugfix release of the Mimic v13.2.x long term
-stable release series. We recommend all Mimic users upgrade.
-
-Notable Changes
----------------
-
-* This release fixes the pg log hard limit bug that was introduced in
-  13.2.2, https://tracker.ceph.com/issues/36686. A flag called
-  `pglog_hardlimit` has been introduced, which is off by default. Enabling
-  this flag will limit the length of the pg log. In order to enable
-  that, the flag must be set by running `ceph osd set pglog_hardlimit`
-  after completely upgrading to 13.2.2. Once the cluster has this flag
-  set, the length of the pg log will be capped by a hard limit. Once set,
-  this flag *must not* be unset anymore. In luminous, this feature was
-  introduced in 12.2.11. Users who are running 12.2.11, and want to
-  continue to use this feature, should upgrade to 13.2.5 or later.
-
-* This release also fixes a CVE on civetweb, CVE-2019-3821 where SSL file
-  descriptors were not closed in civetweb in case the initial negotiation fails.
-
-* There have been fixes to RGW dynamic and manual resharding, which no longer
-  leaves behind stale bucket instances to be removed manually. For finding and
-  cleaning up older instances from a reshard a radosgw-admin command `reshard
-  stale-instances list` and `reshard stale-instances rm` should do the necessary
-  cleanup. These commands should *not* be used on a multisite setup as the stale
-  instances may be unlikely to be from a reshard and can have consequences. In
-  the next version the admin CLI will prevent this command to be run on a
-  multisite cluster, however for the current release users are urged not to
-  use the delete command on a multisite cluster.
-
-Changelog
----------
-
-* build/ops: Destruction of basic_string _GLIBCXX_USE_CXX11_ABI=0 and C++17 mode results in invalid delete (`issue#38177 <http://tracker.ceph.com/issues/38177>`_, `pr#26593 <https://github.com/ceph/ceph/pull/26593>`_, Kefu Chai, Jason Dillaman)
-* build/ops: rpm: require ceph-base instead of ceph-common (`issue#37620 <http://tracker.ceph.com/issues/37620>`_, `pr#25809 <https://github.com/ceph/ceph/pull/25809>`_, Sébastien Han)
-* build/ops: run-make-check.sh ccache tweaks (`issue#24817 <http://tracker.ceph.com/issues/24817>`_, `issue#24777 <http://tracker.ceph.com/issues/24777>`_, `pr#25153 <https://github.com/ceph/ceph/pull/25153>`_, Nathan Cutler, Jonathan Brielmaier, Erwan Velu)
-* ceph-create-keys: fix octal notation for Python 3 without losing compatibility with Python 2 (`issue#37641 <http://tracker.ceph.com/issues/37641>`_, `pr#25531 <https://github.com/ceph/ceph/pull/25531>`_, James Page)
-* cephfs: MDCache::finish_snaprealm_reconnect() create and drop MClientSnap message (`issue#38285 <http://tracker.ceph.com/issues/38285>`_, `pr#26472 <https://github.com/ceph/ceph/pull/26472>`_, "Yan, Zheng")
-* cephfs: mgr/status: fix fs status subcommand did not show standby-replay MDS' perf info (`issue#36399 <http://tracker.ceph.com/issues/36399>`_, `pr#25031 <https://github.com/ceph/ceph/pull/25031>`_, Zhi Zhang)
-* ceph-objectstore-tool: Dump hashinfo (`issue#37597 <http://tracker.ceph.com/issues/37597>`_, `pr#25721 <https://github.com/ceph/ceph/pull/25721>`_, David Zafman)
-* ceph-volume-client: allow setting mode of CephFS volumes (`issue#36651 <http://tracker.ceph.com/issues/36651>`_, `pr#25413 <https://github.com/ceph/ceph/pull/25413>`_, Tom Barron)
-* ceph-volume: enable device discards (`issue#36532 <http://tracker.ceph.com/issues/36532>`_, `pr#25749 <https://github.com/ceph/ceph/pull/25749>`_, Jonas Jelten)
-* ceph-volume: fix JSON output in `inventory` (`issue#37390 <http://tracker.ceph.com/issues/37390>`_, `pr#25923 <https://github.com/ceph/ceph/pull/25923>`_, Sebastian Wagner)
-* ceph-volume: Fix TypeError: join() takes exactly one argument (2 given) (`issue#37595 <http://tracker.ceph.com/issues/37595>`_, `pr#25771 <https://github.com/ceph/ceph/pull/25771>`_, Sebastian Wagner)
-* ceph-volume normalize comma to dot for string to int conversions (`issue#37442 <http://tracker.ceph.com/issues/37442>`_, `pr#25775 <https://github.com/ceph/ceph/pull/25775>`_, Alfredo Deza)
-* ceph-volume: revert partition as disk (`issue#37506 <http://tracker.ceph.com/issues/37506>`_, `pr#26294 <https://github.com/ceph/ceph/pull/26294>`_, Jan Fajerski)
-* ceph-volume: set permissions right before prime-osd-dir (`issue#37486 <http://tracker.ceph.com/issues/37486>`_, `pr#25777 <https://github.com/ceph/ceph/pull/25777>`_, Andrew Schoen, Alfredo Deza)
-* ceph-volume tests/functional declare ceph-ansible roles instead of importing them (`issue#37805 <http://tracker.ceph.com/issues/37805>`_, `pr#25837 <https://github.com/ceph/ceph/pull/25837>`_, Alfredo Deza)
-* ceph-volume  zap: improve zapping to remove all partitions and all LVs, encrypted or not (`issue#37449 <http://tracker.ceph.com/issues/37449>`_, `pr#25351 <https://github.com/ceph/ceph/pull/25351>`_, Alfredo Deza)
-* cli: dump osd-fsid as part of osd find <id> (`issue#37966 <http://tracker.ceph.com/issues/37966>`_, `pr#26035 <https://github.com/ceph/ceph/pull/26035>`_, Noah Watkins)
-* client: do not move f->pos untill success write (`issue#37546 <http://tracker.ceph.com/issues/37546>`_, `pr#25683 <https://github.com/ceph/ceph/pull/25683>`_, Junhui Tang)
-* client: fix failure in quota size limitation when using samba (`issue#37547 <http://tracker.ceph.com/issues/37547>`_, `pr#25678 <https://github.com/ceph/ceph/pull/25678>`_, Junhui Tang)
-* client: fix fuse client hang because its pipe to mds is not ok (`issue#36079 <http://tracker.ceph.com/issues/36079>`_, `pr#25903 <https://github.com/ceph/ceph/pull/25903>`_, Guan yunfei)
-*  client: retry remount on dcache invalidation failure (`issue#27657 <http://tracker.ceph.com/issues/27657>`_, `pr#24695 <https://github.com/ceph/ceph/pull/24695>`_, Venky Shankar)
-* client: session flush does not cause cap release message flush (`issue#38009 <http://tracker.ceph.com/issues/38009>`_, `pr#26424 <https://github.com/ceph/ceph/pull/26424>`_, Patrick Donnelly)
-* cmake: do not pass -B{symbolic,symbolic-functions} to linker on FreeBSD (`issue#36717 <http://tracker.ceph.com/issues/36717>`_, `pr#25525 <https://github.com/ceph/ceph/pull/25525>`_, Willem Jan Withagen)
-* common: fix memory leaks in WeightedPriorityQueue (`issue#36248 <http://tracker.ceph.com/issues/36248>`_, `pr#25295 <https://github.com/ceph/ceph/pull/25295>`_, Radoslaw Zarzynski)
-* common: fix missing include boost/noncopyable.hpp (`issue#38178 <http://tracker.ceph.com/issues/38178>`_, `pr#26277 <https://github.com/ceph/ceph/pull/26277>`_, Willem Jan Withagen)
-* core: list-inconsistent-obj output truncated, causing osd-scrub-repair.sh failure (`issue#37653 <http://tracker.ceph.com/issues/37653>`_, `pr#25603 <https://github.com/ceph/ceph/pull/25603>`_, David Zafman)
-* core: luminous->(mimic,nautilus): PGMapDigest decode error on luminous end (`issue#38295 <http://tracker.ceph.com/issues/38295>`_, `pr#26451 <https://github.com/ceph/ceph/pull/26451>`_, Sage Weil)
-* core: Objecter::calc_op_budget: Fix invalid access to extent union member (`issue#37932 <http://tracker.ceph.com/issues/37932>`_, `pr#26066 <https://github.com/ceph/ceph/pull/26066>`_, Simon Ruggier)
-* core: scrub warning check incorrectly uses mon scrub interval (`issue#37264 <http://tracker.ceph.com/issues/37264>`_, `pr#26493 <https://github.com/ceph/ceph/pull/26493>`_, David Zafman)
-* deep fsck fails on inspecting very large onodes (`issue#38065 <http://tracker.ceph.com/issues/38065>`_, `pr#26291 <https://github.com/ceph/ceph/pull/26291>`_, Igor Fedotov)
-* doc: pin the version for "breathe" to 4.1.11 (`issue#38229 <http://tracker.ceph.com/issues/38229>`_, `pr#26333 <https://github.com/ceph/ceph/pull/26333>`_, Alfredo Deza)
-* doc: rados/configuration: refresh osdmap section (`issue#38051 <http://tracker.ceph.com/issues/38051>`_, `pr#26373 <https://github.com/ceph/ceph/pull/26373>`_, Ilya Dryomov)
-* doc: updated Ceph documentation links (`issue#37793 <http://tracker.ceph.com/issues/37793>`_, `pr#26180 <https://github.com/ceph/ceph/pull/26180>`_, James McClune)
-* doc/user-management: Remove obsolete reset caps command (`issue#37663 <http://tracker.ceph.com/issues/37663>`_, `pr#25607 <https://github.com/ceph/ceph/pull/25607>`_, Brad Hubbard)
-* journal: max journal order is incorrectly set at 64 (`issue#37541 <http://tracker.ceph.com/issues/37541>`_, `pr#25957 <https://github.com/ceph/ceph/pull/25957>`_, Mykola Golub)
-* librbd: fix missing unblock_writes if shrink is not allowed (`issue#36778 <http://tracker.ceph.com/issues/36778>`_, `pr#25252 <https://github.com/ceph/ceph/pull/25252>`_, runsisi)
-* librbd: reset snaps in rbd_snap_list() (`issue#37508 <http://tracker.ceph.com/issues/37508>`_, `pr#25459 <https://github.com/ceph/ceph/pull/25459>`_, Kefu Chai)
-* mds: broadcast quota message to client when disable quota (`issue#38054 <http://tracker.ceph.com/issues/38054>`_, `pr#26292 <https://github.com/ceph/ceph/pull/26292>`_, Junhui Tang)
-* mds: create separate config for heartbeat timeout (`issue#37674 <http://tracker.ceph.com/issues/37674>`_, `pr#26010 <https://github.com/ceph/ceph/pull/26010>`_, Patrick Donnelly)
-* mds: directories pinned keep being replicated back and forth between exporting mds and importing mds (`issue#37368 <http://tracker.ceph.com/issues/37368>`_, `pr#25521 <https://github.com/ceph/ceph/pull/25521>`_, Xuehan Xu)
-* mds: disallow dumping huge caches to formatter (`issue#36703 <http://tracker.ceph.com/issues/36703>`_, `pr#25642 <https://github.com/ceph/ceph/pull/25642>`_, Venky Shankar)
-* mds: do not call Journaler::_trim twice (`issue#37566 <http://tracker.ceph.com/issues/37566>`_, `pr#25561 <https://github.com/ceph/ceph/pull/25561>`_, Tang Junhui)
-* mds: fix bug filelock stuck at LOCK_XSYN leading client can't read data (`issue#37333 <http://tracker.ceph.com/issues/37333>`_, `pr#25676 <https://github.com/ceph/ceph/pull/25676>`_, Guan yunfei)
-* mds: fix incorrect l_pq_executing_ops statistics when meet an invalid item in purge queue (`issue#37567 <http://tracker.ceph.com/issues/37567>`_, `pr#25559 <https://github.com/ceph/ceph/pull/25559>`_, Junhui Tang)
-* mds: fix potential re-evaluate stray dentry in _unlink_local_finish (`issue#38263 <http://tracker.ceph.com/issues/38263>`_, `pr#26474 <https://github.com/ceph/ceph/pull/26474>`_, Zhi Zhang)
-* mds: fix races of updating wanted caps (`issue#37464 <http://tracker.ceph.com/issues/37464>`_, `pr#25680 <https://github.com/ceph/ceph/pull/25680>`_, "Yan, Zheng")
-* mds: handle fragment notify race (`issue#36035 <http://tracker.ceph.com/issues/36035>`_, `pr#26252 <https://github.com/ceph/ceph/pull/26252>`_, "Yan, Zheng")
-* mds: handle state change race (`issue#37594 <http://tracker.ceph.com/issues/37594>`_, `pr#26051 <https://github.com/ceph/ceph/pull/26051>`_, "Yan, Zheng")
-* mds: log evicted clients to clog/dbg (`issue#37639 <http://tracker.ceph.com/issues/37639>`_, `pr#25857 <https://github.com/ceph/ceph/pull/25857>`_, Patrick Donnelly)
-* MDSMonitor: allow beacons from stopping MDS that was laggy (`issue#37724 <http://tracker.ceph.com/issues/37724>`_, `pr#25685 <https://github.com/ceph/ceph/pull/25685>`_, Patrick Donnelly)
-* MDSMonitor: missing osdmon writeable check (`issue#37929 <http://tracker.ceph.com/issues/37929>`_, `pr#26069 <https://github.com/ceph/ceph/pull/26069>`_, Patrick Donnelly)
-* mds: purge queue recovery hangs during boot if PQ journal is damaged (`issue#37543 <http://tracker.ceph.com/issues/37543>`_, `pr#26055 <https://github.com/ceph/ceph/pull/26055>`_, Patrick Donnelly)
-* mds: PurgeQueue write error handler does not handle EBLACKLISTED (`issue#37394 <http://tracker.ceph.com/issues/37394>`_, `pr#25523 <https://github.com/ceph/ceph/pull/25523>`_, Patrick Donnelly)
-* mds: remove duplicated l_mdc_num_strays perfcounter set (`issue#37516 <http://tracker.ceph.com/issues/37516>`_, `pr#25681 <https://github.com/ceph/ceph/pull/25681>`_, Zhi Zhang)
-* mds: remove wrong assertion in Locker::snapflush_nudge (`issue#37721 <http://tracker.ceph.com/issues/37721>`_, `pr#25885 <https://github.com/ceph/ceph/pull/25885>`_, "Yan, Zheng")
-* mds: runs out of file descriptors after several respawns (`issue#35850 <http://tracker.ceph.com/issues/35850>`_, `pr#25822 <https://github.com/ceph/ceph/pull/25822>`_, Patrick Donnelly)
-* mds: severe internal fragment when decoding xattr_map from log event (`issue#37399 <http://tracker.ceph.com/issues/37399>`_, `pr#25519 <https://github.com/ceph/ceph/pull/25519>`_, "Yan, Zheng")
-* mds: trim cache after journal flush (`issue#38010 <http://tracker.ceph.com/issues/38010>`_, `pr#26214 <https://github.com/ceph/ceph/pull/26214>`_, Patrick Donnelly)
-* mds: wait shorter intervals if beacon not sent (`issue#36367 <http://tracker.ceph.com/issues/36367>`_, `pr#25980 <https://github.com/ceph/ceph/pull/25980>`_, Patrick Donnelly)
-* mgr: add get_latest_counter() to C++ -> Python interface (`issue#38138 <http://tracker.ceph.com/issues/38138>`_, `pr#26074 <https://github.com/ceph/ceph/pull/26074>`_, Jan Fajerski)
-* mgr/balancer: add cmd to list all plans (`issue#37418 <http://tracker.ceph.com/issues/37418>`_, `pr#25293 <https://github.com/ceph/ceph/pull/25293>`_, Yang Honggang)
-* mgr/balancer: add crush_compat_metrics param to change optimization keys (`issue#37412 <http://tracker.ceph.com/issues/37412>`_, `pr#25291 <https://github.com/ceph/ceph/pull/25291>`_, Dan van der Ster)
-* mgr/dashboard: Set mirror_mode to None (`issue#37870 <http://tracker.ceph.com/issues/37870>`_, `pr#26009 <https://github.com/ceph/ceph/pull/26009>`_, Sebastian Wagner)
-* mgr: deadlock: _check_auth_rotating possible clock skew, rotating keys expired way too early (`issue#23460 <http://tracker.ceph.com/issues/23460>`_, `pr#26426 <https://github.com/ceph/ceph/pull/26426>`_, Yan Jun)
-* mgr: prometheus: added bluestore db and wal devices to ceph_disk_occupation metric (`issue#36627 <http://tracker.ceph.com/issues/36627>`_, `pr#25218 <https://github.com/ceph/ceph/pull/25218>`_, Konstantin Shalygin)
-* mgr: race between daemon state and service map in 'service status' (`issue#36656 <http://tracker.ceph.com/issues/36656>`_, `pr#25368 <https://github.com/ceph/ceph/pull/25368>`_, Mykola Golub)
-* mgr/restful: fix py got exception when get osd info (`issue#38182 <http://tracker.ceph.com/issues/38182>`_, `pr#26200 <https://github.com/ceph/ceph/pull/26200>`_, Boris Ranto, zouaiguo)
-* mgr: various python3 fixes (`issue#37415 <http://tracker.ceph.com/issues/37415>`_, `pr#25292 <https://github.com/ceph/ceph/pull/25292>`_, Noah Watkins)
-* mgr will refuse connection from the monitor who starts behind it (`issue#37753 <http://tracker.ceph.com/issues/37753>`_, `pr#26235 <https://github.com/ceph/ceph/pull/26235>`_, Xinying Song)
-* mgr/zabbix: Send more PG information to Zabbix (`issue#38180 <http://tracker.ceph.com/issues/38180>`_, `pr#25944 <https://github.com/ceph/ceph/pull/25944>`_, Wido den Hollander)
-* mon: A PG with PG_STATE_REPAIR doesn't mean damaged data, PG_STATE_IN… (`issue#38070 <http://tracker.ceph.com/issues/38070>`_, `pr#26304 <https://github.com/ceph/ceph/pull/26304>`_, David Zafman)
-* mon: log last command skips latest entry (`issue#36679 <http://tracker.ceph.com/issues/36679>`_, `pr#25526 <https://github.com/ceph/ceph/pull/25526>`_, John Spray)
-* mon: mark REMOVE_SNAPS messages as no_reply (`issue#37568 <http://tracker.ceph.com/issues/37568>`_, `pr#25782 <https://github.com/ceph/ceph/pull/25782>`_, "Yan, Zheng")
-* mon/OSDMonitor: do not populate void pg_temp into nextmap (`issue#37784 <http://tracker.ceph.com/issues/37784>`_, `pr#25844 <https://github.com/ceph/ceph/pull/25844>`_, Aleksei Zakharov)
-* mon: shutdown messenger early to avoid accessing deleted logger (`issue#37780 <http://tracker.ceph.com/issues/37780>`_, `pr#25846 <https://github.com/ceph/ceph/pull/25846>`_, ningtao)
-* msg/async: backport recent messenger fixes (`issue#36497 <http://tracker.ceph.com/issues/36497>`_, `issue#37778 <http://tracker.ceph.com/issues/37778>`_, `pr#25958 <https://github.com/ceph/ceph/pull/25958>`_, xie xingguo)
-* msg/async: crashes when authenticator provided by verify_authorizer not implemented (`issue#36443 <http://tracker.ceph.com/issues/36443>`_, `pr#25299 <https://github.com/ceph/ceph/pull/25299>`_, Sage Weil)
-* multisite: es sync null versioned object failed because of olh info (`issue#23842 <http://tracker.ceph.com/issues/23842>`_, `issue#23841 <http://tracker.ceph.com/issues/23841>`_, `pr#25578 <https://github.com/ceph/ceph/pull/25578>`_, Tianshan Qu, Shang Ding)
-* os/bluestore: fixup access a destroy cond cause deadlock or undefine (`issue#37733 <http://tracker.ceph.com/issues/37733>`_, `pr#26260 <https://github.com/ceph/ceph/pull/26260>`_, linbing)
-* os/bluestore: KernelDevice::read() does the EIO mapping now (`issue#36455 <http://tracker.ceph.com/issues/36455>`_, `pr#25854 <https://github.com/ceph/ceph/pull/25854>`_, Radoslaw Zarzynski)
-* os/bluestore: rename does not old ref to replacement onode at old name (`issue#36541 <http://tracker.ceph.com/issues/36541>`_, `pr#25313 <https://github.com/ceph/ceph/pull/25313>`_, Sage Weil)
-* osd: Add support for osd_delete_sleep configuration value (`issue#36474 <http://tracker.ceph.com/issues/36474>`_, `pr#25507 <https://github.com/ceph/ceph/pull/25507>`_, Jianpeng Ma, David Zafman)
-* osd-backfill-stats.sh fails in rados/standalone/osd.yaml (`issue#37393 <http://tracker.ceph.com/issues/37393>`_, `issue#35982 <http://tracker.ceph.com/issues/35982>`_, `pr#26329 <https://github.com/ceph/ceph/pull/26329>`_, Sage Weil, David Zafman)
-* osd: backport recent upmap fixes (`issue#37940 <http://tracker.ceph.com/issues/37940>`_, `issue#37881 <http://tracker.ceph.com/issues/37881>`_, `pr#26128 <https://github.com/ceph/ceph/pull/26128>`_, huangjun, xie xingguo)
-* osdc/Objecter: update op_target_t::paused in _calc_target (`issue#37398 <http://tracker.ceph.com/issues/37398>`_, `pr#25718 <https://github.com/ceph/ceph/pull/25718>`_, Song Shun, runsisi)
-* osd: failed assert when osd_memory_target options mismatch (`issue#37507 <http://tracker.ceph.com/issues/37507>`_, `pr#25605 <https://github.com/ceph/ceph/pull/25605>`_, xie xingguo)
-* osd: force-backfill sets forced_recovery instead of forced_backfill in 13.2.1 (`issue#27985 <http://tracker.ceph.com/issues/27985>`_, `pr#26324 <https://github.com/ceph/ceph/pull/26324>`_, xie xingguo)
-* osd/mon: fix upgrades for pg log hard limit (`issue#36686 <http://tracker.ceph.com/issues/36686>`_, `pr#26206 <https://github.com/ceph/ceph/pull/26206>`_, Neha Ojha)
-* osd/OSDMap: cancel mapping if target osd is out (`issue#37501 <http://tracker.ceph.com/issues/37501>`_, `pr#25699 <https://github.com/ceph/ceph/pull/25699>`_, ningtao, xie xingguo)
-* osd/OSD: OSD::mkfs asserts when reusing disk with existing superblock (`issue#37404 <http://tracker.ceph.com/issues/37404>`_, `pr#25385 <https://github.com/ceph/ceph/pull/25385>`_, Igor Fedotov)
-* osd/PG.cc: account for missing set irrespective of last_complete (`issue#37919 <http://tracker.ceph.com/issues/37919>`_, `pr#26239 <https://github.com/ceph/ceph/pull/26239>`_, Neha Ojha)
-* osd/PrimaryLogPG: fix the extent length error of the sync read (`issue#37680 <http://tracker.ceph.com/issues/37680>`_, `pr#25708 <https://github.com/ceph/ceph/pull/25708>`_, Xiaofei Cui)
-* osd: Prioritize user specified scrubs (`issue#37269 <http://tracker.ceph.com/issues/37269>`_, `pr#25513 <https://github.com/ceph/ceph/pull/25513>`_, David Zafman)
-* os/filestore: ceph_abort() on fsync(2) or fdatasync(2) failure (`issue#38258 <http://tracker.ceph.com/issues/38258>`_, `pr#26438 <https://github.com/ceph/ceph/pull/26438>`_, Sage Weil)
-* pybind/mgr: drop unnecessary iterkeys usage to make py-3 compatible (`issue#37581 <http://tracker.ceph.com/issues/37581>`_, `pr#25759 <https://github.com/ceph/ceph/pull/25759>`_, Mykola Golub)
-* pybind/mgr/status: fix ceph fs status in py3 environments (`issue#37573 <http://tracker.ceph.com/issues/37573>`_, `pr#25694 <https://github.com/ceph/ceph/pull/25694>`_, Jan Fajerski)
-* qa: pjd test appears to require more than 3h timeout for some configurations (`issue#36594 <http://tracker.ceph.com/issues/36594>`_, `pr#25557 <https://github.com/ceph/ceph/pull/25557>`_, Patrick Donnelly)
-* qa/rados/upgrade: align thrashing with upgrade suite, don't import/export pgs (`issue#37665 <http://tracker.ceph.com/issues/37665>`_, `pr#25856 <https://github.com/ceph/ceph/pull/25856>`_, Sage Weil)
-* qa/tasks/radosbench: default to 64k writes (`issue#37797 <http://tracker.ceph.com/issues/37797>`_, `pr#26354 <https://github.com/ceph/ceph/pull/26354>`_, Sage Weil)
-* qa: test_damage needs to silence MDS_READ_ONLY (`issue#37944 <http://tracker.ceph.com/issues/37944>`_, `pr#26072 <https://github.com/ceph/ceph/pull/26072>`_, Patrick Donnelly)
-* qa: test_damage performs truncate test on same object repeatedly (`issue#37836 <http://tracker.ceph.com/issues/37836>`_, `issue#37837 <http://tracker.ceph.com/issues/37837>`_, `pr#26047 <https://github.com/ceph/ceph/pull/26047>`_, Patrick Donnelly)
-* qa: teuthology may hang on diagnostic commands for fuse mount (`issue#36390 <http://tracker.ceph.com/issues/36390>`_, `pr#25515 <https://github.com/ceph/ceph/pull/25515>`_, Patrick Donnelly)
-* qa: whitelist cap revoke warning (`issue#25188 <http://tracker.ceph.com/issues/25188>`_, `pr#26496 <https://github.com/ceph/ceph/pull/26496>`_, Patrick Donnelly)
-* qa/workunits/rados/test_health_warnings: prevent out osds (`issue#37776 <http://tracker.ceph.com/issues/37776>`_, `pr#25850 <https://github.com/ceph/ceph/pull/25850>`_, Sage Weil)
-* qa: wrong setting for msgr failures (`issue#36676 <http://tracker.ceph.com/issues/36676>`_, `pr#25517 <https://github.com/ceph/ceph/pull/25517>`_, Patrick Donnelly)
-* rbd: fix delay time calculation for trash move (`issue#37861 <http://tracker.ceph.com/issues/37861>`_, `pr#25954 <https://github.com/ceph/ceph/pull/25954>`_, Mykola Golub)
-* rgw: debug logging for v4 auth does not sanitize encryption keys (`issue#37847 <http://tracker.ceph.com/issues/37847>`_, `pr#26003 <https://github.com/ceph/ceph/pull/26003>`_, Casey Bodley)
-* rgw: Don't treat colons specially in resource part of ARN (`issue#23817 <http://tracker.ceph.com/issues/23817>`_, `pr#25386 <https://github.com/ceph/ceph/pull/25386>`_, Adam C. Emerson)
-* rgw: fails to start on Fedora 28 from default configuration (`issue#24228 <http://tracker.ceph.com/issues/24228>`_, `pr#26129 <https://github.com/ceph/ceph/pull/26129>`_, Matt Benjamin)
-* rgw: feature -- log successful bucket resharding events (`issue#37647 <http://tracker.ceph.com/issues/37647>`_, `pr#25740 <https://github.com/ceph/ceph/pull/25740>`_, J. Eric Ivancich)
-* rgw_file: user info never synced since librgw init (`issue#37527 <http://tracker.ceph.com/issues/37527>`_, `pr#25485 <https://github.com/ceph/ceph/pull/25485>`_, Tao Chen)
-* rgw: fix max-size in radosgw-admin and REST Admin API (`issue#37517 <http://tracker.ceph.com/issues/37517>`_, `pr#25449 <https://github.com/ceph/ceph/pull/25449>`_, Nick Erdmann)
-* rgw: fix version bucket stats (`issue#21429 <http://tracker.ceph.com/issues/21429>`_, `pr#25643 <https://github.com/ceph/ceph/pull/25643>`_, Shasha Lu)
-* rgw: handle S3 version 2 pre-signed urls with meta-data (`issue#23470 <http://tracker.ceph.com/issues/23470>`_, `pr#25899 <https://github.com/ceph/ceph/pull/25899>`_, Matt Benjamin)
-* rgw: master zone deletion without a zonegroup rm would break rgw rados init (`issue#37328 <http://tracker.ceph.com/issues/37328>`_, `pr#25511 <https://github.com/ceph/ceph/pull/25511>`_, Abhishek Lekshmanan)
-* rgw: multisite: sync gets stuck retrying deletes that fail with ERR_PRECONDITION_FAILED (`issue#37448 <http://tracker.ceph.com/issues/37448>`_, `pr#25505 <https://github.com/ceph/ceph/pull/25505>`_, Casey Bodley)
-* rgw: Object can still be deleted even if s3:DeleteObject policy is set (`issue#37403 <http://tracker.ceph.com/issues/37403>`_, `pr#26309 <https://github.com/ceph/ceph/pull/26309>`_, Enming.Zhang)
-* rgw: "radosgw-admin bucket rm ... --purge-objects" can hang (`issue#38134 <http://tracker.ceph.com/issues/38134>`_, `pr#26266 <https://github.com/ceph/ceph/pull/26266>`_, J. Eric Ivancich)
-* rgw: radosgw-admin: translate reshard status codes (trivial) (`issue#36486 <http://tracker.ceph.com/issues/36486>`_, `pr#25198 <https://github.com/ceph/ceph/pull/25198>`_, Matt Benjamin)
-* rgw: rgwgc: process coredump in some special case (`issue#23199 <http://tracker.ceph.com/issues/23199>`_, `pr#25624 <https://github.com/ceph/ceph/pull/25624>`_, zhaokun)
-* rpm: Use hardened LDFLAGS (`issue#36316 <http://tracker.ceph.com/issues/36316>`_, `pr#25171 <https://github.com/ceph/ceph/pull/25171>`_, Boris Ranto)
-
-v13.2.4 Mimic
-=============
-
-This is the fourth bugfix release of the Mimic v13.2.x long term
-stable release series.  This release includes two security fixes that
-were tested but inadvertently excluded from the final v13.2.3 release
-build.
-
-Changelog
----------
-
-* CVE-2018-16846: rgw: enforce bounds on max-keys/max-uploads/max-parts (`issue#35994 <http://tracker.ceph.com/issues/35994>`_)
-* CVE-2018-14662: mon: limit caps allowed to access the config store
-
-v13.2.3 Mimic
-=============
-
-This is the third bugfix release of the Mimic v13.2.x long term stable release
-series. This release contains many fixes across all components of Ceph.
-We recommend that all users upgrade.
-
-* The default memory utilization for the mons has been increased
-  somewhat.  Rocksdb now uses 512 MB of RAM by default, which should
-  be sufficient for small to medium-sized clusters; large clusters
-  should tune this up.  Also, the `mon_osd_cache_size` has been
-  increase from 10 OSDMaps to 500, which will translate to an
-  additional 500 MB to 1 GB of RAM for large clusters, and much less
-  for small clusters.
-
-* Ceph v13.2.2 includes a wrong backport, which may cause mds to go into
-  'damaged' state when upgrading Ceph cluster from previous version.
-  The bug is fixed in v13.2.3. If you are already running v13.2.2,
-  upgrading to v13.2.3 does not require special action.
-
-* The bluestore_cache_* options are no longer needed. They are replaced
-  by osd_memory_target, defaulting to 4GB. BlueStore will expand
-  and contract its cache to attempt to stay within this
-  limit. Users upgrading should note this is a higher default
-  than the previous bluestore_cache_size of 1GB, so OSDs using
-  BlueStore will use more memory by default.
-  For more details, see the `BlueStore docs <http://docs.ceph.com/docs/mimic/rados/configuration/bluestore-config-ref/#automatic-cache-sizing>`_.
-
-* This version contains an upgrade bug, http://tracker.ceph.com/issues/36686,
-  due to which upgrading during recovery/backfill can cause OSDs to fail. This
-  bug can be worked around, either by restarting all the OSDs after the upgrade,
-  or by upgrading when all PGs are in "active+clean" state. If you have already
-  successfully upgraded to 13.2.2, this issue should not impact you. Going
-  forward, we are working on a clean upgrade path for this feature.
-
-Changelog
----------
-
-* build/ops: Can't compile Ceph on Fedora 29 as it doesn't recognize python\*3\*-tox as an install Tox (`issue#18163 <http://tracker.ceph.com/issues/18163>`_, `issue#37301 <http://tracker.ceph.com/issues/37301>`_, `issue#37422 <http://tracker.ceph.com/issues/37422>`_, `pr#25294 <https://github.com/ceph/ceph/pull/25294>`_, Nathan Cutler, Brad Hubbard)
-* build/ops: debian: correct ceph-common relationship with older radosgw package (`pr#25115 <https://github.com/ceph/ceph/pull/25115>`_, Matthew Vernon)
-* ceph-bluestore-tool: fix set label functionality for specific keys (`pr#24352 <https://github.com/ceph/ceph/pull/24352>`_, Igor Fedotov)
-* ceph fs add_data_pool applies pool application metadata incorrectly (`issue#36203 <http://tracker.ceph.com/issues/36203>`_, `issue#36028 <http://tracker.ceph.com/issues/36028>`_, `pr#24470 <https://github.com/ceph/ceph/pull/24470>`_, John Spray)
-* cephfs: client: explicitly show blacklisted state via asok status command (`issue#36457 <http://tracker.ceph.com/issues/36457>`_, `issue#36352 <http://tracker.ceph.com/issues/36352>`_, `pr#24993 <https://github.com/ceph/ceph/pull/24993>`_, Jonathan Brielmaier, Zhi Zhang)
-* cephfs: client: request next osdmap for blacklisted client (`issue#36668 <http://tracker.ceph.com/issues/36668>`_, `issue#36690 <http://tracker.ceph.com/issues/36690>`_, `pr#24987 <https://github.com/ceph/ceph/pull/24987>`_, Zhi Zhang)
-* cephfs-journal-tool: wrong layout info used (`issue#24933 <http://tracker.ceph.com/issues/24933>`_, `issue#24644 <http://tracker.ceph.com/issues/24644>`_, `pr#24583 <https://github.com/ceph/ceph/pull/24583>`_, Gu Zhongyan)
-* cephfs: some tool commands silently operate on only rank 0, even if multiple ranks exist (`issue#36218 <http://tracker.ceph.com/issues/36218>`_, `pr#25036 <https://github.com/ceph/ceph/pull/25036>`_, Venky Shankar)
-* ceph-fuse: add to selinux profile (`issue#36103 <http://tracker.ceph.com/issues/36103>`_, `issue#36197 <http://tracker.ceph.com/issues/36197>`_, `pr#24439 <https://github.com/ceph/ceph/pull/24439>`_, Patrick Donnelly)
-* ceph-volume:  activate option --auto-detect-objectstore respects --no-systemd (`issue#36249 <http://tracker.ceph.com/issues/36249>`_, `pr#24357 <https://github.com/ceph/ceph/pull/24357>`_, Alfredo Deza)
-* ceph-volume add device_id to inventory listing (`pr#25349 <https://github.com/ceph/ceph/pull/25349>`_, Jan Fajerski)
-* ceph-volume: add inventory command (`issue#24972 <http://tracker.ceph.com/issues/24972>`_, `pr#25013 <https://github.com/ceph/ceph/pull/25013>`_, Jan Fajerski)
-* ceph-volume Additional work on ceph-volume to add some choose_disk capabilities (`issue#36446 <http://tracker.ceph.com/issues/36446>`_, `pr#24782 <https://github.com/ceph/ceph/pull/24782>`_, Erwan Velu)
-* ceph-volume add new ceph-handlers role from ceph-ansible (`issue#36251 <http://tracker.ceph.com/issues/36251>`_, `pr#24337 <https://github.com/ceph/ceph/pull/24337>`_, Alfredo Deza)
-* ceph-volume: adds a --prepare flag to `lvm batch` (`issue#36363 <http://tracker.ceph.com/issues/36363>`_, `pr#24760 <https://github.com/ceph/ceph/pull/24760>`_, Andrew Schoen)
-* ceph-volume: allow to specify --cluster-fsid instead of reading from ceph.conf (`issue#26953 <http://tracker.ceph.com/issues/26953>`_, `pr#25116 <https://github.com/ceph/ceph/pull/25116>`_, Alfredo Deza)
-* ceph_volume_client: py3 compatible (`issue#26850 <http://tracker.ceph.com/issues/26850>`_, `issue#17230 <http://tracker.ceph.com/issues/17230>`_, `pr#24443 <https://github.com/ceph/ceph/pull/24443>`_, Rishabh Dave, Patrick Donnelly)
-* ceph-volume custom cluster names fail on filestore trigger (`issue#27210 <http://tracker.ceph.com/issues/27210>`_, `pr#24279 <https://github.com/ceph/ceph/pull/24279>`_, Alfredo Deza)
-* ceph-volume: do not send (lvm) stderr/stdout to the terminal, use the logfile (`issue#36492 <http://tracker.ceph.com/issues/36492>`_, `pr#24740 <https://github.com/ceph/ceph/pull/24740>`_, Alfredo Deza)
-* ceph-volume enable  --no-systemd flag for simple sub-command (`issue#36470 <http://tracker.ceph.com/issues/36470>`_, `pr#25011 <https://github.com/ceph/ceph/pull/25011>`_, Alfredo Deza)
-* ceph-volume: fix journal and filestore data size in `lvm batch --report` (`issue#36242 <http://tracker.ceph.com/issues/36242>`_, `pr#24306 <https://github.com/ceph/ceph/pull/24306>`_, Andrew Schoen)
-* ceph-volume:  lsblk can fail to find PARTLABEL, must fallback to blkid (`issue#36098 <http://tracker.ceph.com/issues/36098>`_, `pr#24334 <https://github.com/ceph/ceph/pull/24334>`_, Alfredo Deza)
-* ceph-volume lvm.prepare update help to indicate partitions are needed, not devices (`issue#24795 <http://tracker.ceph.com/issues/24795>`_, `pr#24449 <https://github.com/ceph/ceph/pull/24449>`_, Alfredo Deza)
-* ceph-volume: make `lvm batch` idempotent (`pr#24588 <https://github.com/ceph/ceph/pull/24588>`_, Andrew Schoen)
-* ceph-volume: patch Device when testing (`issue#36768 <http://tracker.ceph.com/issues/36768>`_, `pr#25066 <https://github.com/ceph/ceph/pull/25066>`_, Alfredo Deza)
-* ceph-volume: reject devices that have existing GPT headers (`issue#27062 <http://tracker.ceph.com/issues/27062>`_, `pr#25103 <https://github.com/ceph/ceph/pull/25103>`_, Andrew Schoen)
-* ceph-volume: remove LVs when using zap --destroy (`pr#25100 <https://github.com/ceph/ceph/pull/25100>`_, Alfredo Deza)
-* ceph-volume remove version reporting from help menu (`issue#36386 <http://tracker.ceph.com/issues/36386>`_, `pr#24753 <https://github.com/ceph/ceph/pull/24753>`_, Alfredo Deza)
-* ceph-volume: rename Device property valid to available (`issue#36701 <http://tracker.ceph.com/issues/36701>`_, `pr#25133 <https://github.com/ceph/ceph/pull/25133>`_, Jan Fajerski)
-* ceph-volume: skip processing devices that don't exist when scanning system disks (`issue#36247 <http://tracker.ceph.com/issues/36247>`_, `pr#24381 <https://github.com/ceph/ceph/pull/24381>`_, Alfredo Deza)
-* ceph-volume systemd import main so console_scripts work for executable (`issue#36648 <http://tracker.ceph.com/issues/36648>`_, `pr#24852 <https://github.com/ceph/ceph/pull/24852>`_, Alfredo Deza)
-* ceph-volume tests install ceph-ansible's requirements.txt dependencies (`issue#36672 <http://tracker.ceph.com/issues/36672>`_, `pr#24959 <https://github.com/ceph/ceph/pull/24959>`_, Alfredo Deza)
-* ceph-volume tests.systemd update imports for systemd module (`issue#36704 <http://tracker.ceph.com/issues/36704>`_, `pr#24957 <https://github.com/ceph/ceph/pull/24957>`_, Alfredo Deza)
-* ceph-volume: use console_scripts (`issue#36601 <http://tracker.ceph.com/issues/36601>`_, `pr#24838 <https://github.com/ceph/ceph/pull/24838>`_, Mehdi Abaakouk)
-* ceph-volume util.encryption don't push stderr to terminal (`issue#36246 <http://tracker.ceph.com/issues/36246>`_, `pr#24826 <https://github.com/ceph/ceph/pull/24826>`_, Alfredo Deza)
-* ceph-volume util.encryption robust blkid+lsblk detection of lockbox (`pr#24980 <https://github.com/ceph/ceph/pull/24980>`_, Alfredo Deza)
-* client: fix use-after-free in Client::link() (`issue#35841 <http://tracker.ceph.com/issues/35841>`_, `issue#24557 <http://tracker.ceph.com/issues/24557>`_, `pr#24187 <https://github.com/ceph/ceph/pull/24187>`_, "Yan, Zheng")
-* client: statfs inode count odd (`issue#35940 <http://tracker.ceph.com/issues/35940>`_, `issue#24849 <http://tracker.ceph.com/issues/24849>`_, `pr#24377 <https://github.com/ceph/ceph/pull/24377>`_, Rishabh Dave)
-* client:two ceph-fuse client, one can not list out files created by an… (`issue#27051 <http://tracker.ceph.com/issues/27051>`_, `issue#35934 <http://tracker.ceph.com/issues/35934>`_, `pr#24295 <https://github.com/ceph/ceph/pull/24295>`_, Peng Xie)
-* client: update ctime when modifying file content (`issue#35945 <http://tracker.ceph.com/issues/35945>`_, `issue#36134 <http://tracker.ceph.com/issues/36134>`_, `pr#24385 <https://github.com/ceph/ceph/pull/24385>`_, "Yan, Zheng")
-* common: get real hostname from container/pod environment (`pr#23916 <https://github.com/ceph/ceph/pull/23916>`_, Sage Weil)
-* core: _aio_log_start inflight overlap of 0x10000~1000 with [65536~4096] (`issue#36754 <http://tracker.ceph.com/issues/36754>`_, `issue#36625 <http://tracker.ceph.com/issues/36625>`_, `pr#25062 <https://github.com/ceph/ceph/pull/25062>`_, Jonathan Brielmaier, Yang Honggang)
-* core: FAILED assert(osdmap_manifest.pinned.empty()) in OSDMonitor::prune_init() (`issue#24612 <http://tracker.ceph.com/issues/24612>`_, `issue#35071 <http://tracker.ceph.com/issues/35071>`_, `pr#24918 <https://github.com/ceph/ceph/pull/24918>`_, Joao Eduardo Luis)
-* core: Interactive mode CLI prints no output since Mimic (`issue#36358 <http://tracker.ceph.com/issues/36358>`_, `issue#36432 <http://tracker.ceph.com/issues/36432>`_, `pr#24971 <https://github.com/ceph/ceph/pull/24971>`_, John Spray, Mohamad Gebai)
-* core: mgr crash on scrub of unconnected osd (`issue#36110 <http://tracker.ceph.com/issues/36110>`_, `issue#36465 <http://tracker.ceph.com/issues/36465>`_, `pr#25029 <https://github.com/ceph/ceph/pull/25029>`_, Sage Weil)
-* core: mon osdmap cash too small during upgrade to mimic (`issue#36505 <http://tracker.ceph.com/issues/36505>`_, `pr#25019 <https://github.com/ceph/ceph/pull/25019>`_, Sage Weil)
-* core: monstore tool rebuild does not generate creating_pgs (`issue#36306 <http://tracker.ceph.com/issues/36306>`_, `issue#36433 <http://tracker.ceph.com/issues/36433>`_, `pr#25016 <https://github.com/ceph/ceph/pull/25016>`_, Sage Weil)
-* core: Objecter: add ignore cache flag if got redirect reply (`issue#36658 <http://tracker.ceph.com/issues/36658>`_, `pr#25075 <https://github.com/ceph/ceph/pull/25075>`_, Iain Buclaw, Jonathan Brielmaier)
-* core: objecter cannot resend split-dropped op when racing with con reset (`issue#22544 <http://tracker.ceph.com/issues/22544>`_, `issue#35843 <http://tracker.ceph.com/issues/35843>`_, `pr#24970 <https://github.com/ceph/ceph/pull/24970>`_, Sage Weil)
-* core: os/bluestore: cache autotuning and memory limit (`issue#37340 <http://tracker.ceph.com/issues/37340>`_, `pr#25283 <https://github.com/ceph/ceph/pull/25283>`_, Josh Durgin, Mark Nelson)
-* core: rados rm --force-full is blocked when cluster is in full status (`issue#36435 <http://tracker.ceph.com/issues/36435>`_, `pr#25017 <https://github.com/ceph/ceph/pull/25017>`_, Yang Honggang)
-* crush/CrushWrapper: fix crush tree json dumper (`issue#36150 <http://tracker.ceph.com/issues/36150>`_, `pr#24481 <https://github.com/ceph/ceph/pull/24481>`_, Oshyn Song)
-* debian/control: require fuse for ceph-fuse (`issue#21057 <http://tracker.ceph.com/issues/21057>`_, `pr#24037 <https://github.com/ceph/ceph/pull/24037>`_, Thomas Serlin)
-* doc: add ceph-volume inventory sections (`pr#25130 <https://github.com/ceph/ceph/pull/25130>`_, Jan Fajerski)
-* doc: fix broken fstab url in cephfs/fuse (`issue#36286 <http://tracker.ceph.com/issues/36286>`_, `issue#36313 <http://tracker.ceph.com/issues/36313>`_, `pr#24441 <https://github.com/ceph/ceph/pull/24441>`_, Jos Collin)
-* doc: Put command template into literal block (`pr#25000 <https://github.com/ceph/ceph/pull/25000>`_, Alexey Stupnikov)
-* doc: remove deprecated 'scrubq' from ceph(8) (`issue#35813 <http://tracker.ceph.com/issues/35813>`_, `issue#35855 <http://tracker.ceph.com/issues/35855>`_, `pr#24210 <https://github.com/ceph/ceph/pull/24210>`_, Ruben Kerkhof)
-* docs: backport edit on github changes (`pr#25362 <https://github.com/ceph/ceph/pull/25362>`_, Neha Ojha, Noah Watkins)
-* doc: Typo error on cephfs/fuse/ (`issue#36180 <http://tracker.ceph.com/issues/36180>`_, `issue#36308 <http://tracker.ceph.com/issues/36308>`_, `pr#24420 <https://github.com/ceph/ceph/pull/24420>`_, Karun Josy)
-* ec: src/common/interval_map.h: 161: FAILED assert(len > 0) (`issue#21931 <http://tracker.ceph.com/issues/21931>`_, `issue#22330 <http://tracker.ceph.com/issues/22330>`_, `pr#24581 <https://github.com/ceph/ceph/pull/24581>`_, Neha Ojha)
-* fsck: cid is improperly matched to oid (`issue#36146 <http://tracker.ceph.com/issues/36146>`_, `issue#36551 <http://tracker.ceph.com/issues/36551>`_, `issue#36099 <http://tracker.ceph.com/issues/36099>`_, `issue#32731 <http://tracker.ceph.com/issues/32731>`_, `pr#24480 <https://github.com/ceph/ceph/pull/24480>`_, Kefu Chai, Sage Weil)
-* kernel_untar_build.sh: bison: command not found (`issue#36121 <http://tracker.ceph.com/issues/36121>`_, `pr#24241 <https://github.com/ceph/ceph/pull/24241>`_, Neha Ojha)
-* libcephfs: expose CEPH_SETATTR_MTIME_NOW and CEPH_SETATTR_ATIME_NOW (`issue#36205 <http://tracker.ceph.com/issues/36205>`_, `issue#35961 <http://tracker.ceph.com/issues/35961>`_, `pr#24464 <https://github.com/ceph/ceph/pull/24464>`_, Zhu Shangzhong)
-* librados application's symbol could conflict with the libceph-common (`issue#26839 <http://tracker.ceph.com/issues/26839>`_, `issue#25154 <http://tracker.ceph.com/issues/25154>`_, `pr#24708 <https://github.com/ceph/ceph/pull/24708>`_, Kefu Chai)
-* librbd: blacklisted client might not notice it lost the lock (`issue#34534 <http://tracker.ceph.com/issues/34534>`_, `pr#24401 <https://github.com/ceph/ceph/pull/24401>`_, Jason Dillaman)
-* librbd: ensure exclusive lock acquired when removing sync point snaps… (`issue#35714 <http://tracker.ceph.com/issues/35714>`_, `issue#24898 <http://tracker.ceph.com/issues/24898>`_, `pr#24137 <https://github.com/ceph/ceph/pull/24137>`_, Mykola Golub)
-* librbd: fixed assert when flattening clone with zero overlap (`issue#35957 <http://tracker.ceph.com/issues/35957>`_, `issue#35702 <http://tracker.ceph.com/issues/35702>`_, `pr#24356 <https://github.com/ceph/ceph/pull/24356>`_, Jason Dillaman)
-* librbd: journaling unable request can not be sent to remote lock owner (`issue#26939 <http://tracker.ceph.com/issues/26939>`_, `issue#35712 <http://tracker.ceph.com/issues/35712>`_, `pr#24122 <https://github.com/ceph/ceph/pull/24122>`_, Mykola Golub)
-* librbd: object map improperly flagged as invalidated (`issue#24516 <http://tracker.ceph.com/issues/24516>`_, `issue#36225 <http://tracker.ceph.com/issues/36225>`_, `pr#24413 <https://github.com/ceph/ceph/pull/24413>`_, Jason Dillaman)
-* librgw: crashes in multisite configuration (`issue#36302 <http://tracker.ceph.com/issues/36302>`_, `issue#36415 <http://tracker.ceph.com/issues/36415>`_, `pr#24908 <https://github.com/ceph/ceph/pull/24908>`_, Casey Bodley)
-* mds: allows client to create .. and . dirents (`issue#32104 <http://tracker.ceph.com/issues/32104>`_, `pr#24384 <https://github.com/ceph/ceph/pull/24384>`_, Venky Shankar)
-* mds: curate priority of perf counters sent to mgr (`issue#35938 <http://tracker.ceph.com/issues/35938>`_, `issue#26991 <http://tracker.ceph.com/issues/26991>`_, `issue#32090 <http://tracker.ceph.com/issues/32090>`_, `issue#35837 <http://tracker.ceph.com/issues/35837>`_, `pr#24467 <https://github.com/ceph/ceph/pull/24467>`_, Patrick Donnelly, Venky Shankar)
-* mds: evict cap revoke non-responding clients (`pr#24661 <https://github.com/ceph/ceph/pull/24661>`_, Venky Shankar)
-* mimic:mds: fix mds damaged due to unexpected journal length (`issue#36199 <http://tracker.ceph.com/issues/36199>`_, `pr#24463 <https://github.com/ceph/ceph/pull/24463>`_, Zhi Zhang)
-* mds: internal op missing events time 'throttled', 'all_read', 'dispatched' (`issue#36114 <http://tracker.ceph.com/issues/36114>`_, `issue#36195 <http://tracker.ceph.com/issues/36195>`_, `pr#24411 <https://github.com/ceph/ceph/pull/24411>`_, Yanhu Cao)
-* mds: migrate strays part by part when shutdown mds (`issue#26926 <http://tracker.ceph.com/issues/26926>`_, `issue#32092 <http://tracker.ceph.com/issues/32092>`_, `pr#24435 <https://github.com/ceph/ceph/pull/24435>`_, "Yan, Zheng")
-* mds: optimize the way how max export size is enforced (`issue#25131 <http://tracker.ceph.com/issues/25131>`_, `pr#23952 <https://github.com/ceph/ceph/pull/23952>`_, "Yan, Zheng")
-* mds: print is_laggy message once (`issue#35250 <http://tracker.ceph.com/issues/35250>`_, `issue#35719 <http://tracker.ceph.com/issues/35719>`_, `pr#24161 <https://github.com/ceph/ceph/pull/24161>`_, Patrick Donnelly)
-* mds: rctime may go back (`issue#35916 <http://tracker.ceph.com/issues/35916>`_, `issue#36136 <http://tracker.ceph.com/issues/36136>`_, `pr#24379 <https://github.com/ceph/ceph/pull/24379>`_, "Yan, Zheng")
-* mds: rctime not set on system inode (root) at startup (`issue#36221 <http://tracker.ceph.com/issues/36221>`_, `issue#36461 <http://tracker.ceph.com/issues/36461>`_, `pr#25042 <https://github.com/ceph/ceph/pull/25042>`_, Patrick Donnelly)
-* mds: reset heartbeat map at potential time-consuming places (`issue#26858 <http://tracker.ceph.com/issues/26858>`_, `pr#23506 <https://github.com/ceph/ceph/pull/23506>`_, Yan, Zheng, "Yan, Zheng")
-* mds: src/mds/MDLog.cc: 281: FAILED ceph_assert(!capped) during max_mds thrashing (`issue#36350 <http://tracker.ceph.com/issues/36350>`_, `issue#37093 <http://tracker.ceph.com/issues/37093>`_, `pr#25095 <https://github.com/ceph/ceph/pull/25095>`_, "Yan, Zheng", Jonathan Brielmaier)
-* mgr/DaemonServer: fix Session leak (`pr#24233 <https://github.com/ceph/ceph/pull/24233>`_, Sage Weil)
-* mgr/dashboard: Add http support to dashboard (`issue#36069 <http://tracker.ceph.com/issues/36069>`_, `pr#24734 <https://github.com/ceph/ceph/pull/24734>`_, Boris Ranto, Wido den Hollander)
-* mgr/dashboard: Add support for URI encode (`issue#24621 <http://tracker.ceph.com/issues/24621>`_, `issue#26856 <http://tracker.ceph.com/issues/26856>`_, `issue#24907 <http://tracker.ceph.com/issues/24907>`_, `pr#24488 <https://github.com/ceph/ceph/pull/24488>`_, Tiago Melo)
-* mgr/dashboard: Progress bar does not stop in TableKeyValueComponent (`issue#35925 <http://tracker.ceph.com/issues/35925>`_, `pr#24258 <https://github.com/ceph/ceph/pull/24258>`_, Volker Theile)
-* mgr/dashboard: Remove fieldsets when using CdTable (`issue#27851 <http://tracker.ceph.com/issues/27851>`_, `issue#26999 <http://tracker.ceph.com/issues/26999>`_, `pr#24478 <https://github.com/ceph/ceph/pull/24478>`_, Tiago Melo)
-* mgr: hold lock while accessing the request list and submittin request (`pr#25113 <https://github.com/ceph/ceph/pull/25113>`_, Jerry Lee)
-* mgr: [restful] deep_scrub is not a valid OSD command (`issue#36720 <http://tracker.ceph.com/issues/36720>`_, `issue#36749 <http://tracker.ceph.com/issues/36749>`_, `pr#25040 <https://github.com/ceph/ceph/pull/25040>`_, Boris Ranto)
-* mon: mgr options not parse propertly (`issue#35076 <http://tracker.ceph.com/issues/35076>`_, `issue#35836 <http://tracker.ceph.com/issues/35836>`_, `pr#24176 <https://github.com/ceph/ceph/pull/24176>`_, Sage Weil)
-* mon/OSDMonitor: invalidate max_failed_since on cancel_report (`issue#35930 <http://tracker.ceph.com/issues/35930>`_, `issue#35860 <http://tracker.ceph.com/issues/35860>`_, `pr#24281 <https://github.com/ceph/ceph/pull/24281>`_, xie xingguo)
-* mon: test if gid exists in pending for prepare_beacon (`issue#35848 <http://tracker.ceph.com/issues/35848>`_, `pr#24272 <https://github.com/ceph/ceph/pull/24272>`_, Patrick Donnelly)
-* msg/async: clean up local buffers on dispatch (`issue#36127 <http://tracker.ceph.com/issues/36127>`_, `issue#35987 <http://tracker.ceph.com/issues/35987>`_, `pr#24386 <https://github.com/ceph/ceph/pull/24386>`_, Greg Farnum)
-* msg: ceph_abort() when there are enough accepter errors in msg server (`issue#36219 <http://tracker.ceph.com/issues/36219>`_, `pr#25045 <https://github.com/ceph/ceph/pull/25045>`_, penglaiyxy@gmail.com)
-* msg: challenging authorizer messages appear at debug_ms=0 (`issue#35251 <http://tracker.ceph.com/issues/35251>`_, `issue#35717 <http://tracker.ceph.com/issues/35717>`_, `pr#24113 <https://github.com/ceph/ceph/pull/24113>`_, Patrick Donnelly)
-* multisite: data full sync does not limit concurrent bucket sync (`issue#26897 <http://tracker.ceph.com/issues/26897>`_, `issue#36216 <http://tracker.ceph.com/issues/36216>`_, `pr#24536 <https://github.com/ceph/ceph/pull/24536>`_, Casey Bodley)
-* multisite: data sync error repo processing does not back off on empty (`issue#35979 <http://tracker.ceph.com/issues/35979>`_, `issue#26938 <http://tracker.ceph.com/issues/26938>`_, `pr#24319 <https://github.com/ceph/ceph/pull/24319>`_, Casey Bodley)
-* multisite: incremental data sync makes unnecessary call to RGWReadRemoteDataLogShardInfoCR (`issue#35977 <http://tracker.ceph.com/issues/35977>`_, `issue#26952 <http://tracker.ceph.com/issues/26952>`_, `pr#24710 <https://github.com/ceph/ceph/pull/24710>`_, Casey Bodley)
-* multisite: intermittent test_bucket_index_log_trim failures (`issue#36201 <http://tracker.ceph.com/issues/36201>`_, `issue#36034 <http://tracker.ceph.com/issues/36034>`_, `pr#24400 <https://github.com/ceph/ceph/pull/24400>`_, Casey Bodley)
-* multisite: invalid read in RGWCloneMetaLogCoroutine (`issue#36208 <http://tracker.ceph.com/issues/36208>`_, `issue#35851 <http://tracker.ceph.com/issues/35851>`_, `pr#24414 <https://github.com/ceph/ceph/pull/24414>`_, Casey Bodley)
-* multisite: segfault on shutdown/realm reload (`issue#35857 <http://tracker.ceph.com/issues/35857>`_, `issue#35543 <http://tracker.ceph.com/issues/35543>`_, `pr#24235 <https://github.com/ceph/ceph/pull/24235>`_, Casey Bodley)
-* os/bluestore: fix bloom filter num entry miscalculation in repairer (`issue#25001 <http://tracker.ceph.com/issues/25001>`_, `pr#24339 <https://github.com/ceph/ceph/pull/24339>`_, Igor Fedotov)
-* os/bluestore: handle spurious read errors (`issue#22464 <http://tracker.ceph.com/issues/22464>`_, `pr#24647 <https://github.com/ceph/ceph/pull/24647>`_, Paul Emmerich)
-* osd: add creating to pg_string_state (`issue#36174 <http://tracker.ceph.com/issues/36174>`_, `issue#36298 <http://tracker.ceph.com/issues/36298>`_, `pr#24601 <https://github.com/ceph/ceph/pull/24601>`_, Dan van der Ster)
-* osd: backport recent upmap fixes (`pr#25419 <https://github.com/ceph/ceph/pull/25419>`_, ningtao, xie xingguo)
-* osdc/Objecter: possible race condition with connection reset (`issue#36183 <http://tracker.ceph.com/issues/36183>`_, `issue#36296 <http://tracker.ceph.com/issues/36296>`_, `pr#24600 <https://github.com/ceph/ceph/pull/24600>`_, Jason Dillaman)
-* osd: crash in OpTracker::unregister_inflight_op via OSD::get_health_metrics (`issue#24889 <http://tracker.ceph.com/issues/24889>`_, `pr#23026 <https://github.com/ceph/ceph/pull/23026>`_, Radoslaw Zarzynski)
-* osdc: reduce ObjectCacher's memory fragments (`issue#36192 <http://tracker.ceph.com/issues/36192>`_, `issue#36643 <http://tracker.ceph.com/issues/36643>`_, `pr#24873 <https://github.com/ceph/ceph/pull/24873>`_, "Yan, Zheng")
-* osd/ECBackend: don't get result code of subchunk-read overwritten (`issue#35959 <http://tracker.ceph.com/issues/35959>`_, `issue#21769 <http://tracker.ceph.com/issues/21769>`_, `pr#24298 <https://github.com/ceph/ceph/pull/24298>`_, songweibin)
-* OSDMapMapping does not handle active.size() > pool size (`issue#26866 <http://tracker.ceph.com/issues/26866>`_, `issue#35936 <http://tracker.ceph.com/issues/35936>`_, `pr#24431 <https://github.com/ceph/ceph/pull/24431>`_, Sage Weil)
-* osd/PG: avoid choose_acting picking want with > pool size items (`issue#35963 <http://tracker.ceph.com/issues/35963>`_, `issue#35924 <http://tracker.ceph.com/issues/35924>`_, `pr#24344 <https://github.com/ceph/ceph/pull/24344>`_, Sage Weil)
-* osd/PrimaryLogPG: fix potential pg-log overtrimming (`pr#24309 <https://github.com/ceph/ceph/pull/24309>`_, xie xingguo)
-* osd: race condition opening heartbeat connection (`issue#36637 <http://tracker.ceph.com/issues/36637>`_, `issue#36602 <http://tracker.ceph.com/issues/36602>`_, `pr#25026 <https://github.com/ceph/ceph/pull/25026>`_, Sage Weil)
-* osd: RBD client IOPS pool stats are incorrect (2x higher; includes IO hints as an op) (`issue#24909 <http://tracker.ceph.com/issues/24909>`_, `issue#36557 <http://tracker.ceph.com/issues/36557>`_, `pr#25024 <https://github.com/ceph/ceph/pull/25024>`_, Jason Dillaman)
-* osd: Remove old bft= which has been superceded by backfill (`issue#36292 <http://tracker.ceph.com/issues/36292>`_, `issue#36170 <http://tracker.ceph.com/issues/36170>`_, `pr#24573 <https://github.com/ceph/ceph/pull/24573>`_, David Zafman)
-* qa: add test that builds example librados programs (`issue#36228 <http://tracker.ceph.com/issues/36228>`_, `issue#15100 <http://tracker.ceph.com/issues/15100>`_, `pr#24537 <https://github.com/ceph/ceph/pull/24537>`_, Nathan Cutler)
-* qa/ceph-ansible: Specify stable-3.2 branch (`pr#25191 <https://github.com/ceph/ceph/pull/25191>`_, Brad Hubbard)
-* qa: extend timeout for SessionMap flush (`issue#36156 <http://tracker.ceph.com/issues/36156>`_, `pr#24438 <https://github.com/ceph/ceph/pull/24438>`_, Patrick Donnelly)
-* qa: fsstress workunit does not execute in parallel on same host without clobbering files (`issue#36278 <http://tracker.ceph.com/issues/36278>`_, `issue#24177 <http://tracker.ceph.com/issues/24177>`_, `issue#36323 <http://tracker.ceph.com/issues/36323>`_, `issue#36184 <http://tracker.ceph.com/issues/36184>`_, `issue#36165 <http://tracker.ceph.com/issues/36165>`_, `issue#36153 <http://tracker.ceph.com/issues/36153>`_, `pr#24408 <https://github.com/ceph/ceph/pull/24408>`_, Patrick Donnelly)
-* qa: increase rm timeout for workunit cleanup (`issue#36501 <http://tracker.ceph.com/issues/36501>`_, `issue#36365 <http://tracker.ceph.com/issues/36365>`_, `pr#24684 <https://github.com/ceph/ceph/pull/24684>`_, Patrick Donnelly)
-* qa: install dependencies for rbd_workunit_kernel_untar_build (`issue#35074 <http://tracker.ceph.com/issues/35074>`_, `issue#35077 <http://tracker.ceph.com/issues/35077>`_, `pr#24240 <https://github.com/ceph/ceph/pull/24240>`_, Ilya Dryomov)
-* qa: remove knfs site from future releases (`issue#36075 <http://tracker.ceph.com/issues/36075>`_, `issue#36102 <http://tracker.ceph.com/issues/36102>`_, `pr#24269 <https://github.com/ceph/ceph/pull/24269>`_, Yuri Weinstein)
-* qa/suites/rados/thrash-old-clients: exclude packages for hammer, jewel (`pr#25193 <https://github.com/ceph/ceph/pull/25193>`_, Neha Ojha)
-* qa/suites/rgw/verify/tasks/cls_rgw: test cls_rgw (`issue#25024 <http://tracker.ceph.com/issues/25024>`_, `pr#23197 <https://github.com/ceph/ceph/pull/23197>`_, Casey Bodley, Sage Weil)
-* qa/tasks/qemu: use unique clone directory to avoid race with workunit (`issue#36542 <http://tracker.ceph.com/issues/36542>`_, `issue#36569 <http://tracker.ceph.com/issues/36569>`_, `pr#24811 <https://github.com/ceph/ceph/pull/24811>`_, Jason Dillaman)
-* qa: test_recovery_pool tries asok on wrong node (`issue#24928 <http://tracker.ceph.com/issues/24928>`_, `issue#24858 <http://tracker.ceph.com/issues/24858>`_, `pr#23087 <https://github.com/ceph/ceph/pull/23087>`_, Patrick Donnelly)
-* qa: tolerate failed rank while waiting for state (`issue#36280 <http://tracker.ceph.com/issues/36280>`_, `issue#35828 <http://tracker.ceph.com/issues/35828>`_, `pr#24572 <https://github.com/ceph/ceph/pull/24572>`_, Patrick Donnelly)
-* qa/workunits: replace 'realpath' with 'readlink -f' in fsstress.sh (`issue#36409 <http://tracker.ceph.com/issues/36409>`_, `issue#36430 <http://tracker.ceph.com/issues/36430>`_, `issue#35538 <http://tracker.ceph.com/issues/35538>`_, `pr#24622 <https://github.com/ceph/ceph/pull/24622>`_, Ilya Dryomov, Jason Dillaman)
-* RADOS: probably missing clone location for async_recovery_targets (`issue#35964 <http://tracker.ceph.com/issues/35964>`_, `issue#35546 <http://tracker.ceph.com/issues/35546>`_, `pr#24345 <https://github.com/ceph/ceph/pull/24345>`_, xie xingguo)
-* mimic:rbd: fix error import when the input is a pipe (`issue#35705 <http://tracker.ceph.com/issues/35705>`_, `issue#34536 <http://tracker.ceph.com/issues/34536>`_, `pr#24002 <https://github.com/ceph/ceph/pull/24002>`_, songweibin)
-* [rbd-mirror] failed assertion when updating mirror status (`issue#36084 <http://tracker.ceph.com/issues/36084>`_, `issue#36120 <http://tracker.ceph.com/issues/36120>`_, `pr#24321 <https://github.com/ceph/ceph/pull/24321>`_, Jason Dillaman)
-* rbd: [rbd-mirror] forced promotion after killing remote cluster results in stuck state (`issue#36659 <http://tracker.ceph.com/issues/36659>`_, `issue#36693 <http://tracker.ceph.com/issues/36693>`_, `pr#24952 <https://github.com/ceph/ceph/pull/24952>`_, Jonathan Brielmaier, Jason Dillaman)
-* rbd: [rbd-mirror] periodic mirror status timer might fail to be scheduled (`issue#36500 <http://tracker.ceph.com/issues/36500>`_, `issue#36555 <http://tracker.ceph.com/issues/36555>`_, `pr#24916 <https://github.com/ceph/ceph/pull/24916>`_, Jason Dillaman)
-* rbd: rbd-nbd: do not ceph_abort() after print the usages (`issue#36660 <http://tracker.ceph.com/issues/36660>`_, `issue#36713 <http://tracker.ceph.com/issues/36713>`_, `pr#24988 <https://github.com/ceph/ceph/pull/24988>`_, Shiyang Ruan)
-* rbd: TokenBucketThrottle: use reference to m_blockers.front() and then update it (`issue#36529 <http://tracker.ceph.com/issues/36529>`_, `issue#36475 <http://tracker.ceph.com/issues/36475>`_, `pr#24915 <https://github.com/ceph/ceph/pull/24915>`_, Dongsheng Yang)
-* Revert "mimic: cephfs-journal-tool: enable purge_queue journal's event commands" (`issue#36346 <http://tracker.ceph.com/issues/36346>`_, `issue#24604 <http://tracker.ceph.com/issues/24604>`_, `pr#24485 <https://github.com/ceph/ceph/pull/24485>`_, Xuehan Xu, "Yan, Zheng")
-* rgw: abort_bucket_multiparts() ignores individual NoSuchUpload errors (`issue#36129 <http://tracker.ceph.com/issues/36129>`_, `issue#35986 <http://tracker.ceph.com/issues/35986>`_, `pr#24388 <https://github.com/ceph/ceph/pull/24388>`_, Casey Bodley)
-* rgw-admin: reshard add can add a non existant bucket (`issue#36449 <http://tracker.ceph.com/issues/36449>`_, `issue#36756 <http://tracker.ceph.com/issues/36756>`_, `pr#25087 <https://github.com/ceph/ceph/pull/25087>`_, Jonathan Brielmaier, Abhishek Lekshmanan)
-* rgw: async sync_object and remove_object does not access coroutine me… (`issue#36138 <http://tracker.ceph.com/issues/36138>`_, `issue#35905 <http://tracker.ceph.com/issues/35905>`_, `pr#24417 <https://github.com/ceph/ceph/pull/24417>`_, Tianshan Qu)
-* rgw/beast: drop privileges after binding ports (`issue#36041 <http://tracker.ceph.com/issues/36041>`_, `pr#24436 <https://github.com/ceph/ceph/pull/24436>`_, Paul Emmerich)
-* rgw: beast frontend fails to parse ipv6 endpoints (`issue#36662 <http://tracker.ceph.com/issues/36662>`_, `issue#36734 <http://tracker.ceph.com/issues/36734>`_, `pr#25079 <https://github.com/ceph/ceph/pull/25079>`_, Jonathan Brielmaier, Casey Bodley)
-* rgw: cls_user_remove_bucket does not write the modified cls_user_stats (`issue#36496 <http://tracker.ceph.com/issues/36496>`_, `issue#36533 <http://tracker.ceph.com/issues/36533>`_, `pr#24910 <https://github.com/ceph/ceph/pull/24910>`_, Casey Bodley)
-* rgw: default quota not set in radosgw for Openstack users (`issue#24595 <http://tracker.ceph.com/issues/24595>`_, `issue#36223 <http://tracker.ceph.com/issues/36223>`_, `pr#24907 <https://github.com/ceph/ceph/pull/24907>`_, Casey Bodley)
-* mimic:rgw: fix chunked-encoding for chunks >1MiB (`issue#36125 <http://tracker.ceph.com/issues/36125>`_, `issue#35990 <http://tracker.ceph.com/issues/35990>`_, `pr#24363 <https://github.com/ceph/ceph/pull/24363>`_, Robin H. Johnson)
-* rgw: fix deadlock on RGWIndexCompletionManager::stop (`issue#26949 <http://tracker.ceph.com/issues/26949>`_, `issue#35710 <http://tracker.ceph.com/issues/35710>`_, `pr#24101 <https://github.com/ceph/ceph/pull/24101>`_, Yao Zongyou)
-* mimic:rgw: fix leak of curl handle on shutdown (`issue#35715 <http://tracker.ceph.com/issues/35715>`_, `issue#36213 <http://tracker.ceph.com/issues/36213>`_, `pr#24518 <https://github.com/ceph/ceph/pull/24518>`_, Casey Bodley)
-* mimic:rgw: list bucket can not show the object uploaded by RGWPostObj when enable bucket versioning (`pr#24571 <https://github.com/ceph/ceph/pull/24571>`_, yuliyang)
-* rgw: radosgw-admin user stats are incorrect when dynamic re-sharding is enabled (`issue#36535 <http://tracker.ceph.com/issues/36535>`_, `pr#24911 <https://github.com/ceph/ceph/pull/24911>`_, Casey Bodley)
-* rgw: raise debug level on redundant data sync error messages (`issue#35830 <http://tracker.ceph.com/issues/35830>`_, `issue#36140 <http://tracker.ceph.com/issues/36140>`_, `pr#24418 <https://github.com/ceph/ceph/pull/24418>`_, Casey Bodley)
-* rgw: raise default rgw_curl_low_speed_time to 300 seconds (`issue#35708 <http://tracker.ceph.com/issues/35708>`_, `issue#27989 <http://tracker.ceph.com/issues/27989>`_, `pr#24071 <https://github.com/ceph/ceph/pull/24071>`_, Casey Bodley)
-* rgw: renew resharding locks to prevent expiration (`issue#36687 <http://tracker.ceph.com/issues/36687>`_, `issue#27219 <http://tracker.ceph.com/issues/27219>`_, `issue#34307 <http://tracker.ceph.com/issues/34307>`_, `pr#24899 <https://github.com/ceph/ceph/pull/24899>`_, Orit Wasserman, J. Eric Ivancich)
-* rgw: resharding produces invalid values of bucket stats (`issue#36290 <http://tracker.ceph.com/issues/36290>`_, `issue#36381 <http://tracker.ceph.com/issues/36381>`_, `pr#24526 <https://github.com/ceph/ceph/pull/24526>`_, Abhishek Lekshmanan)
-* mimic:rgw: return x-amz-version-id: null when delete obj in versioning (`issue#35814 <http://tracker.ceph.com/issues/35814>`_, `pr#24189 <https://github.com/ceph/ceph/pull/24189>`_, yuliyang)
-* rgw: RGWAsyncGetBucketInstanceInfo does not access coroutine memory (`issue#36211 <http://tracker.ceph.com/issues/36211>`_, `issue#35812 <http://tracker.ceph.com/issues/35812>`_, `pr#24516 <https://github.com/ceph/ceph/pull/24516>`_, Casey Bodley)
-* rgw: set default objecter_inflight_ops = 24576 (`issue#36571 <http://tracker.ceph.com/issues/36571>`_, `issue#25109 <http://tracker.ceph.com/issues/25109>`_, `pr#24860 <https://github.com/ceph/ceph/pull/24860>`_, Jonathan Brielmaier, Matt Benjamin)
-* rgw: support server-side encryption when SSL is terminated in a proxy (`issue#36645 <http://tracker.ceph.com/issues/36645>`_, `issue#27221 <http://tracker.ceph.com/issues/27221>`_, `pr#24931 <https://github.com/ceph/ceph/pull/24931>`_, Jonathan Brielmaier, Casey Bodley)
-* rgw: use-after-free from RGWRadosGetOmapKeysCR::~RGWRadosGetOmapKeysCR (`issue#21154 <http://tracker.ceph.com/issues/21154>`_, `issue#36537 <http://tracker.ceph.com/issues/36537>`_, `issue#36539 <http://tracker.ceph.com/issues/36539>`_, `pr#24912 <https://github.com/ceph/ceph/pull/24912>`_, Casey Bodley, Sage Weil)
-* rpm: use updated gperftools (`issue#36508 <http://tracker.ceph.com/issues/36508>`_, `issue#35969 <http://tracker.ceph.com/issues/35969>`_, `pr#24260 <https://github.com/ceph/ceph/pull/24260>`_, Brad Hubbard, Kefu Chai)
-* segv in BlueStore::OldExtent::create (`issue#36592 <http://tracker.ceph.com/issues/36592>`_, `issue#36526 <http://tracker.ceph.com/issues/36526>`_, `pr#24745 <https://github.com/ceph/ceph/pull/24745>`_, Sage Weil)
-* test/librbd: not valid to have different parents between image snapshots (`issue#36117 <http://tracker.ceph.com/issues/36117>`_, `pr#24244 <https://github.com/ceph/ceph/pull/24244>`_, Jason Dillaman)
-* [test] periodic seg faults within unittest_librbd (`issue#36220 <http://tracker.ceph.com/issues/36220>`_, `issue#36238 <http://tracker.ceph.com/issues/36238>`_, `pr#24711 <https://github.com/ceph/ceph/pull/24711>`_, Jason Dillaman)
-* test/rbd_mirror: race in WaitingOnLeaderReleaseLeader (`issue#36236 <http://tracker.ceph.com/issues/36236>`_, `issue#36276 <http://tracker.ceph.com/issues/36276>`_, `pr#24551 <https://github.com/ceph/ceph/pull/24551>`_, Mykola Golub)
-* tests: ceph-admin-commands.sh workunit does not log what it's doing (`issue#37153 <http://tracker.ceph.com/issues/37153>`_, `issue#37089 <http://tracker.ceph.com/issues/37089>`_, `pr#25085 <https://github.com/ceph/ceph/pull/25085>`_, Nathan Cutler)
-* tests: librados api aio tests race condition (`issue#24587 <http://tracker.ceph.com/issues/24587>`_, `issue#36647 <http://tracker.ceph.com/issues/36647>`_, `pr#25027 <https://github.com/ceph/ceph/pull/25027>`_, Josh Durgin)
-* tests: make readable.sh fail if it doesn't run anything (`pr#25050 <https://github.com/ceph/ceph/pull/25050>`_, Greg Farnum)
-* tests: rbd: move OpenStack devstack test to rocky release (`issue#36410 <http://tracker.ceph.com/issues/36410>`_, `issue#36428 <http://tracker.ceph.com/issues/36428>`_, `pr#24913 <https://github.com/ceph/ceph/pull/24913>`_, Jason Dillaman)
-* tests: unittest_rbd_mirror: TestMockImageMap.AddInstancePingPongImageTest: Value of: it != peer_ack_ctxs->end() (`issue#36683 <http://tracker.ceph.com/issues/36683>`_, `issue#36689 <http://tracker.ceph.com/issues/36689>`_, `pr#24946 <https://github.com/ceph/ceph/pull/24946>`_, Mykola Golub, Jonathan Brielmaier)
-* tests: use timeout for fs asok operations (`issue#36335 <http://tracker.ceph.com/issues/36335>`_, `issue#36503 <http://tracker.ceph.com/issues/36503>`_, `pr#25332 <https://github.com/ceph/ceph/pull/25332>`_, Patrick Donnelly)
-* tests: /usr/bin/ld: cannot find -lradospp in rados mimic (`issue#37396 <http://tracker.ceph.com/issues/37396>`_, `pr#25285 <https://github.com/ceph/ceph/pull/25285>`_, Nathan Cutler)
-* test: Use a grep pattern that works across releases (`issue#35845 <http://tracker.ceph.com/issues/35845>`_, `issue#35909 <http://tracker.ceph.com/issues/35909>`_, `pr#24017 <https://github.com/ceph/ceph/pull/24017>`_, David Zafman)
-* tools: ceph-objectstore-tool: Allow target level as first positional … (`issue#35846 <http://tracker.ceph.com/issues/35846>`_, `issue#35992 <http://tracker.ceph.com/issues/35992>`_, `pr#24116 <https://github.com/ceph/ceph/pull/24116>`_, David Zafman)
-
-v13.2.2 Mimic
-=============
-
-This is the second bugfix release of the Mimic v13.2.x long term stable release
-series. This release contains many fixes across all components of Ceph.
-We recommend that all users upgrade.
-
-* This version contains an upgrade bug, http://tracker.ceph.com/issues/36686,
-  due to which upgrading during recovery/backfill can cause OSDs to fail. This
-  bug can be worked around, either by restarting all the OSDs after the upgrade,
-  or by upgrading when all PGs are in "active+clean" state.
-
-  If you have successfully upgraded to 13.2.2, this issue should not impact
-  you. Going forward, we are working on a clean upgrade path for this feature.
-
-Changelog
----------
-
-* build/ops: Boost system library is no longer required to compile and link example librados program (`issue#25073 <http://tracker.ceph.com/issues/25073>`_, `issue#25054 <http://tracker.ceph.com/issues/25054>`_, `pr#23201 <https://github.com/ceph/ceph/pull/23201>`_, Nathan Cutler)
-* build/ops: debian/rules: fix ceph-mgr .pyc files left behind (`issue#27059 <http://tracker.ceph.com/issues/27059>`_, `issue#26883 <http://tracker.ceph.com/issues/26883>`_, `pr#23831 <https://github.com/ceph/ceph/pull/23831>`_, Dan Mick)
-* build/ops: mimic 13.2.0 doesn't build in Fedora rawhide (`issue#24449 <http://tracker.ceph.com/issues/24449>`_, `issue#24905 <http://tracker.ceph.com/issues/24905>`_, `pr#23885 <https://github.com/ceph/ceph/pull/23885>`_, Kefu Chai)
-* ceph-disk: compatibility fix for python 3 (`pr#24008 <https://github.com/ceph/ceph/pull/24008>`_, Tim Serong)
-* ceph-disk: return a list instead of an iterator (`pr#23392 <https://github.com/ceph/ceph/pull/23392>`_, Alexander Graul)
-* cephfs-journal-tool: enable purge_queue journal's event commands (`issue#24604 <http://tracker.ceph.com/issues/24604>`_, `issue#26989 <http://tracker.ceph.com/issues/26989>`_, `pr#23818 <https://github.com/ceph/ceph/pull/23818>`_, Xuehan Xu)
-* ceph tell osd.x bench writes resulting JSON to stderr instead of stdout (`issue#35942 <http://tracker.ceph.com/issues/35942>`_, `issue#24022 <http://tracker.ceph.com/issues/24022>`_, `pr#24041 <https://github.com/ceph/ceph/pull/24041>`_, Коренберг Маркr, John Spray, Kefu Chai)
-* ceph-volume add a __release__ string, to help version-conditional calls (`issue#25169 <http://tracker.ceph.com/issues/25169>`_, `pr#23333 <https://github.com/ceph/ceph/pull/23333>`_, Alfredo Deza)
-* ceph-volume: adds test for `ceph-volume lvm list /dev/sda` (`issue#24784 <http://tracker.ceph.com/issues/24784>`_, `issue#24957 <http://tracker.ceph.com/issues/24957>`_, `pr#23349 <https://github.com/ceph/ceph/pull/23349>`_, Andrew Schoen)
-* ceph-volume: an OSD ID must exist and be destroyed before reuse (`pr#23101 <https://github.com/ceph/ceph/pull/23101>`_, Andrew Schoen, Ron Allred)
-* ceph-volume:  batch: allow journal+block.db sizing on the CLI (`issue#36088 <http://tracker.ceph.com/issues/36088>`_, `pr#24208 <https://github.com/ceph/ceph/pull/24208>`_, Alfredo Deza)
-* ceph-volume batch: allow --osds-per-device, default it to 1 (`issue#35913 <http://tracker.ceph.com/issues/35913>`_, `pr#24079 <https://github.com/ceph/ceph/pull/24079>`_, Alfredo Deza)
-* ceph-volume batch carve out lvs for bluestore (`issue#34535 <http://tracker.ceph.com/issues/34535>`_, `pr#24074 <https://github.com/ceph/ceph/pull/24074>`_, Alfredo Deza)
-* ceph-volume batch command (`pr#23777 <https://github.com/ceph/ceph/pull/23777>`_, Alfredo Deza)
-* ceph-volume: batch tests for mixed-type of devices (`issue#35535 <http://tracker.ceph.com/issues/35535>`_, `issue#27210 <http://tracker.ceph.com/issues/27210>`_, `pr#23966 <https://github.com/ceph/ceph/pull/23966>`_, Alfredo Deza)
-* ceph_volume_client: allow atomic update of RADOS objects (`issue#24173 <http://tracker.ceph.com/issues/24173>`_, `issue#24863 <http://tracker.ceph.com/issues/24863>`_, `pr#23878 <https://github.com/ceph/ceph/pull/23878>`_, Rishabh Dave)
-* CephVolumeClient: delay required after adding data pool to MDSMap (`issue#25206 <http://tracker.ceph.com/issues/25206>`_, `pr#23725 <https://github.com/ceph/ceph/pull/23725>`_, Patrick Donnelly)
-* ceph-volume: do not use stdin in luminous (`issue#25173 <http://tracker.ceph.com/issues/25173>`_, `pr#23368 <https://github.com/ceph/ceph/pull/23368>`_, Alfredo Deza)
-* ceph-volume: earlier detection for --journal and --filestore flag requirements (`issue#24794 <http://tracker.ceph.com/issues/24794>`_, `pr#24205 <https://github.com/ceph/ceph/pull/24205>`_, Alfredo Deza)
-* ceph-volume enable the ceph-osd during lvm activation (`issue#24152 <http://tracker.ceph.com/issues/24152>`_, `pr#23393 <https://github.com/ceph/ceph/pull/23393>`_, Dan van der Ster, Alfredo Deza)
-* ceph-volume expand auto engine for multiple devices on filestore (`pr#23807 <https://github.com/ceph/ceph/pull/23807>`_, Andrew Schoen, Alfredo Deza)
-* ceph-volume: expand auto engine for single type devices on filestore (`pr#23786 <https://github.com/ceph/ceph/pull/23786>`_, Alfredo Deza)
-* ceph-volume fix zap not working with LVs (`issue#35970 <http://tracker.ceph.com/issues/35970>`_, `pr#24081 <https://github.com/ceph/ceph/pull/24081>`_, Alfredo Deza)
-* ceph-volume lvm.activate conditional mon-config on prime-osd-dir (`issue#25216 <http://tracker.ceph.com/issues/25216>`_, `pr#23400 <https://github.com/ceph/ceph/pull/23400>`_, Alfredo Deza)
-* ceph-volume: `lvm batch` allow extra flags (like dmcrypt) for bluestore (`pr#23780 <https://github.com/ceph/ceph/pull/23780>`_, Alfredo Deza)
-* ceph-volume: `lvm batch` documentation and man page updates (`pr#23756 <https://github.com/ceph/ceph/pull/23756>`_, Alfredo Deza)
-* ceph-volume lvm.batch remove non-existent sys_api property (`issue#34310 <http://tracker.ceph.com/issues/34310>`_, `pr#23810 <https://github.com/ceph/ceph/pull/23810>`_, Alfredo Deza)
-* ceph-volume lvm.listing only include devices if they exist (`issue#24952 <http://tracker.ceph.com/issues/24952>`_, `pr#23149 <https://github.com/ceph/ceph/pull/23149>`_, Alfredo Deza)
-* ceph-volume: process.call with stdin in Python 3 fix (`issue#24993 <http://tracker.ceph.com/issues/24993>`_, `pr#23239 <https://github.com/ceph/ceph/pull/23239>`_, Alfredo Deza)
-* ceph-volume: PVolumes.get() should return one PV when using name or uuid (`issue#24784 <http://tracker.ceph.com/issues/24784>`_, `pr#23327 <https://github.com/ceph/ceph/pull/23327>`_, Andrew Schoen)
-* ceph-volume: refuse to zap mapper devices (`issue#24504 <http://tracker.ceph.com/issues/24504>`_, `pr#22965 <https://github.com/ceph/ceph/pull/22965>`_, Andrew Schoen)
-* ceph-volume: Restore SELinux context (`pr#23295 <https://github.com/ceph/ceph/pull/23295>`_, Boris Ranto)
-* ceph-volume: run tests without waiting on ceph repos (`pr#23806 <https://github.com/ceph/ceph/pull/23806>`_, Andrew Schoen)
-* ceph-volume tests/functional add mgrs daemons to lvm tests (`pr#23784 <https://github.com/ceph/ceph/pull/23784>`_, Alfredo Deza)
-* ceph-volume: tests.functional inherit SSH_ARGS from ansible (`pr#23812 <https://github.com/ceph/ceph/pull/23812>`_, Alfredo Deza)
-* ceph-volume: update batch documentation to explain filestore strategies (`issue#34309 <http://tracker.ceph.com/issues/34309>`_, `pr#23826 <https://github.com/ceph/ceph/pull/23826>`_, Alfredo Deza)
-* ceph-volume: update version of ansible to 2.6.x for simple tests (`pr#23269 <https://github.com/ceph/ceph/pull/23269>`_, Andrew Schoen)
-* client: add inst to asok status output (`issue#24724 <http://tracker.ceph.com/issues/24724>`_, `issue#24931 <http://tracker.ceph.com/issues/24931>`_, `pr#23109 <https://github.com/ceph/ceph/pull/23109>`_, Patrick Donnelly)
-* client: check for unmounted condition before printing debug output (`issue#25213 <http://tracker.ceph.com/issues/25213>`_, `issue#26914 <http://tracker.ceph.com/issues/26914>`_, `pr#23603 <https://github.com/ceph/ceph/pull/23603>`_, Jeff Layton)
-* client: requests that do name lookup may be sent to wrong mds (`issue#26984 <http://tracker.ceph.com/issues/26984>`_, `issue#26860 <http://tracker.ceph.com/issues/26860>`_, `pr#23700 <https://github.com/ceph/ceph/pull/23700>`_, "Yan, Zheng")
-* cls/rgw: add rgw_usage_log_entry type to ceph-dencoder (`issue#35070 <http://tracker.ceph.com/issues/35070>`_, `pr#23857 <https://github.com/ceph/ceph/pull/23857>`_, Vaibhav Bhembre)
-* common: check completion condition before waiting (`issue#25007 <http://tracker.ceph.com/issues/25007>`_, `issue#25222 <http://tracker.ceph.com/issues/25222>`_, `pr#23435 <https://github.com/ceph/ceph/pull/23435>`_, Patrick Donnelly)
-* core: deep scrub cannot find the bitrot if the object is cached (`issue#35068 <http://tracker.ceph.com/issues/35068>`_, `pr#23873 <https://github.com/ceph/ceph/pull/23873>`_, Adam C. Emerson, Xiaoguang Wang)
-* core: Fix 25085 and 24949 (`pr#23272 <https://github.com/ceph/ceph/pull/23272>`_, David Zafman)
-* core: force-create-pg broken (`issue#34532 <http://tracker.ceph.com/issues/34532>`_, `issue#26940 <http://tracker.ceph.com/issues/26940>`_, `pr#23872 <https://github.com/ceph/ceph/pull/23872>`_, Sage Weil)
-* core: Limit pg log length during recovery/backfill so that we don't run out of memory (`issue#21416 <http://tracker.ceph.com/issues/21416>`_, `pr#23403 <https://github.com/ceph/ceph/pull/23403>`_, Neha Ojha)
-* doc: broken bash example in bluestore migration (`issue#35078 <http://tracker.ceph.com/issues/35078>`_, `pr#23854 <https://github.com/ceph/ceph/pull/23854>`_, Alfredo Deza)
-* doc: Fix broken urls (`issue#25185 <http://tracker.ceph.com/issues/25185>`_, `issue#26916 <http://tracker.ceph.com/issues/26916>`_, `pr#23607 <https://github.com/ceph/ceph/pull/23607>`_, Jos Collin)
-* doc: http://docs.ceph.com/docs/mimic/rados/operations/pg-states/ (`issue#25055 <http://tracker.ceph.com/issues/25055>`_, `pr#23163 <https://github.com/ceph/ceph/pull/23163>`_, Jan Fajerski, Nathan Cutler)
-* docs: radosgw: ldap-auth: fixed option name 'rgw_ldap_searchfilter' (`issue#32129 <http://tracker.ceph.com/issues/32129>`_, `pr#23956 <https://github.com/ceph/ceph/pull/23956>`_, Konstantin Shalygin)
-* filestore: add pgid in filestore pg dir split log message (`issue#25225 <http://tracker.ceph.com/issues/25225>`_, `pr#23453 <https://github.com/ceph/ceph/pull/23453>`_, Vikhyat Umrao)
-* kv: MergeOperator name() returns string, and caller calls c_str() on the temporary (`issue#26907 <http://tracker.ceph.com/issues/26907>`_, `issue#26875 <http://tracker.ceph.com/issues/26875>`_, `pr#23865 <https://github.com/ceph/ceph/pull/23865>`_, Sage Weil)
-* libradosstriper conditional compile (`issue#27213 <http://tracker.ceph.com/issues/27213>`_, `pr#23869 <https://github.com/ceph/ceph/pull/23869>`_, Kefu Chai, Jesse Williamson)
-* librbd: deep-copy should not write to objects that cannot exist (`issue#25000 <http://tracker.ceph.com/issues/25000>`_, `issue#25083 <http://tracker.ceph.com/issues/25083>`_, `pr#23358 <https://github.com/ceph/ceph/pull/23358>`_, Jason Dillaman)
-* librbd: validate data pool for self-managed snapshot support (`issue#24945 <http://tracker.ceph.com/issues/24945>`_, `pr#23560 <https://github.com/ceph/ceph/pull/23560>`_, Mykola Golub)
-* link against libstdc++ statically (`issue#26880 <http://tracker.ceph.com/issues/26880>`_, `issue#25209 <http://tracker.ceph.com/issues/25209>`_, `pr#23490 <https://github.com/ceph/ceph/pull/23490>`_, Kefu Chai)
-* mds: avoid using g_conf->get_val<...>(...) in hot path (`issue#24820 <http://tracker.ceph.com/issues/24820>`_, `pr#23407 <https://github.com/ceph/ceph/pull/23407>`_, "Yan, Zheng")
-* mds: calculate load by checking self CPU usage (`issue#26834 <http://tracker.ceph.com/issues/26834>`_, `issue#26888 <http://tracker.ceph.com/issues/26888>`_, `pr#23503 <https://github.com/ceph/ceph/pull/23503>`_, "Yan, Zheng")
-* mds: crash when dumping ops in flight (`issue#26894 <http://tracker.ceph.com/issues/26894>`_, `issue#26982 <http://tracker.ceph.com/issues/26982>`_, `pr#23672 <https://github.com/ceph/ceph/pull/23672>`_, "Yan, Zheng")
-* mds: dump recent events on respawn (`issue#25040 <http://tracker.ceph.com/issues/25040>`_, `pr#23275 <https://github.com/ceph/ceph/pull/23275>`_, Patrick Donnelly)
-* mds: explain delayed client_request due to subtree migration (`issue#26988 <http://tracker.ceph.com/issues/26988>`_, `issue#24840 <http://tracker.ceph.com/issues/24840>`_, `pr#23792 <https://github.com/ceph/ceph/pull/23792>`_, Yan, Zheng, "Yan, Zheng")
-* mds: handle discontinuous mdsmap (`issue#24856 <http://tracker.ceph.com/issues/24856>`_, `pr#23180 <https://github.com/ceph/ceph/pull/23180>`_, "Yan, Zheng")
-* mds: health warning for slow metadata IO (`issue#24879 <http://tracker.ceph.com/issues/24879>`_, `issue#25045 <http://tracker.ceph.com/issues/25045>`_, `pr#23343 <https://github.com/ceph/ceph/pull/23343>`_, "Yan, Zheng")
-* mds: increase debug level for dropped client cap msg (`issue#25042 <http://tracker.ceph.com/issues/25042>`_, `pr#23309 <https://github.com/ceph/ceph/pull/23309>`_, Patrick Donnelly)
-* mds: introduce cephfs' own feature bits (`issue#14456 <http://tracker.ceph.com/issues/14456>`_, `issue#24914 <http://tracker.ceph.com/issues/24914>`_, `pr#23105 <https://github.com/ceph/ceph/pull/23105>`_, Yan, Zheng, "Yan, Zheng", Patrick Donnelly)
-* mds: mark beacons as high priority (`issue#26905 <http://tracker.ceph.com/issues/26905>`_, `issue#26899 <http://tracker.ceph.com/issues/26899>`_, `pr#23565 <https://github.com/ceph/ceph/pull/23565>`_, Patrick Donnelly)
-* mds: MDBalancer::try_rebalance() may stop prematurely (`issue#32086 <http://tracker.ceph.com/issues/32086>`_, `issue#26973 <http://tracker.ceph.com/issues/26973>`_, `pr#23883 <https://github.com/ceph/ceph/pull/23883>`_, "Yan, Zheng")
-* MDSMonitor: note ignored beacons/map changes at higher debug level (`issue#26898 <http://tracker.ceph.com/issues/26898>`_, `issue#26929 <http://tracker.ceph.com/issues/26929>`_, `pr#23704 <https://github.com/ceph/ceph/pull/23704>`_, Patrick Donnelly)
-* mds,osd,mon,msg: use intrusive_ptr for holding Connection::priv (`issue#20924 <http://tracker.ceph.com/issues/20924>`_, `pr#22339 <https://github.com/ceph/ceph/pull/22339>`_, "Yan, Zheng", Kefu Chai)
-* mds: print mdsmap processed at low debug level (`issue#25035 <http://tracker.ceph.com/issues/25035>`_, `pr#23196 <https://github.com/ceph/ceph/pull/23196>`_, Patrick Donnelly)
-* mds: scrub doesn't always return JSON results (`issue#23958 <http://tracker.ceph.com/issues/23958>`_, `issue#25037 <http://tracker.ceph.com/issues/25037>`_, `pr#23225 <https://github.com/ceph/ceph/pull/23225>`_, Venky Shankar)
-* mds: use fast dispatch to handle MDSBeacon (`issue#23519 <http://tracker.ceph.com/issues/23519>`_, `issue#26923 <http://tracker.ceph.com/issues/26923>`_, `pr#23703 <https://github.com/ceph/ceph/pull/23703>`_, "Yan, Zheng")
-* mgr balancer does not save optimized plan but latest (`issue#32082 <http://tracker.ceph.com/issues/32082>`_, `issue#27000 <http://tracker.ceph.com/issues/27000>`_, `pr#23782 <https://github.com/ceph/ceph/pull/23782>`_, Stefan Priebe)
-* mgr: "balancer execute" only requires read permissions (`issue#26912 <http://tracker.ceph.com/issues/26912>`_, `issue#25345 <http://tracker.ceph.com/issues/25345>`_, `pr#23583 <https://github.com/ceph/ceph/pull/23583>`_, John Spray)
-* mgrc: enable disabling stats via mgr_stats_threshold (`issue#25197 <http://tracker.ceph.com/issues/25197>`_, `issue#26837 <http://tracker.ceph.com/issues/26837>`_, `pr#23463 <https://github.com/ceph/ceph/pull/23463>`_, John Spray)
-* mgr/dashboard: Display RGW user/bucket quota max size in human readable form (`issue#35706 <http://tracker.ceph.com/issues/35706>`_, `pr#24047 <https://github.com/ceph/ceph/pull/24047>`_, Volker Theile)
-* mgr/dashboard: Escape regex pattern in DeletionModalComponent (`issue#24902 <http://tracker.ceph.com/issues/24902>`_, `issue#26920 <http://tracker.ceph.com/issues/26920>`_, `pr#23669 <https://github.com/ceph/ceph/pull/23669>`_, Tiago Melo)
-* mgr/dashboard: Prevent RGW API user deletion (`pr#22670 <https://github.com/ceph/ceph/pull/22670>`_, Volker Theile)
-* mgr/dashboard: RestClient can't handle ProtocolError exceptions (`pr#23875 <https://github.com/ceph/ceph/pull/23875>`_, Volker Theile)
-* mgr/dashboard: RGW is not working if an URL prefix is defined (`pr#23203 <https://github.com/ceph/ceph/pull/23203>`_, Volker Theile)
-* mgr/dashboard: URL prefix is not working (`issue#25120 <http://tracker.ceph.com/issues/25120>`_, `pr#23874 <https://github.com/ceph/ceph/pull/23874>`_, Ricardo Marques)
-* mgr: Ignore daemon if no metadata was returned (`pr#23356 <https://github.com/ceph/ceph/pull/23356>`_, Wido den Hollander)
-* mgr/MgrClient: Protect daemon_health_metrics (`issue#23352 <http://tracker.ceph.com/issues/23352>`_, `pr#23458 <https://github.com/ceph/ceph/pull/23458>`_, Kjetil Joergensen, Brad Hubbard)
-* mgr: Sync the prometheus module (`pr#23215 <https://github.com/ceph/ceph/pull/23215>`_, Boris Ranto)
-* mon: add purge-new (`pr#23259 <https://github.com/ceph/ceph/pull/23259>`_, Sage Weil)
-* mon: Automatically set expected_num_objects for new pools with >=100 PGs per OSD (`issue#24687 <http://tracker.ceph.com/issues/24687>`_, `issue#25144 <http://tracker.ceph.com/issues/25144>`_, `pr#23860 <https://github.com/ceph/ceph/pull/23860>`_, Douglas Fuller)
-* multisite: intermittent failures in test_bucket_sync_disable_enable (`issue#26895 <http://tracker.ceph.com/issues/26895>`_, `issue#26980 <http://tracker.ceph.com/issues/26980>`_, `pr#23856 <https://github.com/ceph/ceph/pull/23856>`_, Casey Bodley)
-* multisite: object metadata operations are skipped by sync (`issue#24367 <http://tracker.ceph.com/issues/24367>`_, `issue#24986 <http://tracker.ceph.com/issues/24986>`_, `pr#23172 <https://github.com/ceph/ceph/pull/23172>`_, Casey Bodley)
-* object errors found in be_select_auth_object() aren't logged the same (`issue#32108 <http://tracker.ceph.com/issues/32108>`_, `issue#25108 <http://tracker.ceph.com/issues/25108>`_, `pr#23870 <https://github.com/ceph/ceph/pull/23870>`_, David Zafman)
-* os/bluestore: bluestore_buffer_hit_bytes perf counter doesn't reset (`pr#23772 <https://github.com/ceph/ceph/pull/23772>`_, Igor Fedotov)
-* os/bluestore/BlueStore.cc: 1025: FAILED assert(buffer_bytes >= b->length) from ObjectStore/StoreTest.ColSplitTest2/2 (`issue#24439 <http://tracker.ceph.com/issues/24439>`_, `issue#26944 <http://tracker.ceph.com/issues/26944>`_, `pr#23748 <https://github.com/ceph/ceph/pull/23748>`_, Sage Weil)
-* os/bluestore: fix assertion in StupidAllocator::get_fragmentation (`pr#23676 <https://github.com/ceph/ceph/pull/23676>`_, Igor Fedotov)
-* osd: do_sparse_read(): Verify checksum earlier so we will try to repair (`issue#24875 <http://tracker.ceph.com/issues/24875>`_, `pr#23378 <https://github.com/ceph/ceph/pull/23378>`_, David Zafman)
-* osd,mon: increase mon_max_pg_per_osd to 300 (`issue#25176 <http://tracker.ceph.com/issues/25176>`_, `pr#23861 <https://github.com/ceph/ceph/pull/23861>`_, Neha Ojha)
-* osd/OSDMap: CRUSH_TUNABLES5 added in jewel, not kraken (`issue#25057 <http://tracker.ceph.com/issues/25057>`_, `issue#25101 <http://tracker.ceph.com/issues/25101>`_, `pr#23226 <https://github.com/ceph/ceph/pull/23226>`_, Sage Weil)
-* osd/PrimaryLogPG: avoid dereferencing invalid complete_to (`pr#23951 <https://github.com/ceph/ceph/pull/23951>`_, xie xingguo)
-* osd: segv in OSDMap::calc_pg_upmaps from balancer (`issue#22056 <http://tracker.ceph.com/issues/22056>`_, `issue#26933 <http://tracker.ceph.com/issues/26933>`_, `pr#23888 <https://github.com/ceph/ceph/pull/23888>`_, Brad Hubbard)
-* qa: cfuse_workunit_kernel_untar_build fails on Ubuntu 18.04 (`issue#26956 <http://tracker.ceph.com/issues/26956>`_, `issue#26967 <http://tracker.ceph.com/issues/26967>`_, `issue#24679 <http://tracker.ceph.com/issues/24679>`_, `pr#23769 <https://github.com/ceph/ceph/pull/23769>`_, Patrick Donnelly)
-* qa: fix ceph-disk suite and add coverage for ceph-detect-init (`pr#23337 <https://github.com/ceph/ceph/pull/23337>`_, Nathan Cutler)
-* qa/rgw: patch keystone requirements.txt (`issue#26946 <http://tracker.ceph.com/issues/26946>`_, `issue#23659 <http://tracker.ceph.com/issues/23659>`_, `pr#23771 <https://github.com/ceph/ceph/pull/23771>`_, Casey Bodley)
-* qa/suites/rados: move valgrind test to singleton-flat (`issue#24992 <http://tracker.ceph.com/issues/24992>`_, `pr#23744 <https://github.com/ceph/ceph/pull/23744>`_, Sage Weil)
-* qa/tasks: s3a fix mirror (`pr#24038 <https://github.com/ceph/ceph/pull/24038>`_, Vasu Kulkarni)
-* qa/tests:  added OBJECT_MISPLACED to the whitelist (`pr#23301 <https://github.com/ceph/ceph/pull/23301>`_, Yuri Weinstein)
-* qa/tests: added v13.2.1 to the mix (`pr#23218 <https://github.com/ceph/ceph/pull/23218>`_, Yuri Weinstein)
-* qa/tests: update ansible version to 2.5 (`pr#24091 <https://github.com/ceph/ceph/pull/24091>`_, Yuri Weinstein)
-* rados: not all exceptions accept keyargs (`issue#25178 <http://tracker.ceph.com/issues/25178>`_, `issue#24033 <http://tracker.ceph.com/issues/24033>`_, `pr#23335 <https://github.com/ceph/ceph/pull/23335>`_, Rishabh Dave)
-* rados python bindings use prval from stack (`issue#25204 <http://tracker.ceph.com/issues/25204>`_, `issue#25175 <http://tracker.ceph.com/issues/25175>`_, `pr#23863 <https://github.com/ceph/ceph/pull/23863>`_, Sage Weil)
-* rbd: improved trash snapshot namespace handling (`issue#25121 <http://tracker.ceph.com/issues/25121>`_, `issue#23398 <http://tracker.ceph.com/issues/23398>`_, `issue#25114 <http://tracker.ceph.com/issues/25114>`_, `pr#23559 <https://github.com/ceph/ceph/pull/23559>`_, Mykola Golub, Jason Dillaman)
-* rgw: add curl_low_speed_limit and curl_low_speed_time config to avoid (`issue#25021 <http://tracker.ceph.com/issues/25021>`_, `pr#23173 <https://github.com/ceph/ceph/pull/23173>`_, Mark Kogan, Zhang Shaowen)
-* rgw: change default rgw_thread_pool_size to 512 (`issue#25214 <http://tracker.ceph.com/issues/25214>`_, `issue#25088 <http://tracker.ceph.com/issues/25088>`_, `issue#25218 <http://tracker.ceph.com/issues/25218>`_, `issue#24544 <http://tracker.ceph.com/issues/24544>`_, `pr#23383 <https://github.com/ceph/ceph/pull/23383>`_, Douglas Fuller, Casey Bodley)
-* rgw: civetweb fails on urls with control characters (`issue#26849 <http://tracker.ceph.com/issues/26849>`_, `issue#24158 <http://tracker.ceph.com/issues/24158>`_, `pr#23855 <https://github.com/ceph/ceph/pull/23855>`_, Abhishek Lekshmanan)
-* rgw: civetweb: use poll instead of select while waiting on sockets (`issue#35954 <http://tracker.ceph.com/issues/35954>`_, `pr#24058 <https://github.com/ceph/ceph/pull/24058>`_, Abhishek Lekshmanan)
-* rgw: do not ignore EEXIST in RGWPutObj::execute (`issue#25078 <http://tracker.ceph.com/issues/25078>`_, `issue#22790 <http://tracker.ceph.com/issues/22790>`_, `pr#23206 <https://github.com/ceph/ceph/pull/23206>`_, Matt Benjamin)
-* rgw: fail to recover index from crash mimic backport (`issue#24640 <http://tracker.ceph.com/issues/24640>`_, `issue#24629 <http://tracker.ceph.com/issues/24629>`_, `issue#24280 <http://tracker.ceph.com/issues/24280>`_, `pr#23118 <https://github.com/ceph/ceph/pull/23118>`_, Tianshan Qu)
-* rgw_file: deep stat handling (`issue#26842 <http://tracker.ceph.com/issues/26842>`_, `issue#24915 <http://tracker.ceph.com/issues/24915>`_, `pr#23498 <https://github.com/ceph/ceph/pull/23498>`_, Matt Benjamin)
-* rgw: Fix log level of gc_iterate_entries (`issue#23801 <http://tracker.ceph.com/issues/23801>`_, `issue#26921 <http://tracker.ceph.com/issues/26921>`_, `pr#23686 <https://github.com/ceph/ceph/pull/23686>`_, iliul)
-* rgw: Limit the number of lifecycle rules on one bucket (`issue#26845 <http://tracker.ceph.com/issues/26845>`_, `issue#24572 <http://tracker.ceph.com/issues/24572>`_, `pr#23521 <https://github.com/ceph/ceph/pull/23521>`_, Zhang Shaowen)
-* rgw: radosgw-admin: 'sync error trim' loops until complete (`issue#24873 <http://tracker.ceph.com/issues/24873>`_, `issue#24984 <http://tracker.ceph.com/issues/24984>`_, `pr#23140 <https://github.com/ceph/ceph/pull/23140>`_, Casey Bodley)
-* rgw: The delete markers generated by object expiration should have owner (`issue#24568 <http://tracker.ceph.com/issues/24568>`_, `issue#26847 <http://tracker.ceph.com/issues/26847>`_, `pr#23541 <https://github.com/ceph/ceph/pull/23541>`_, Zhang Shaowen)
-* rpm: should change ceph-mgr package depency from py-bcrypt to python2-bcrypt (`issue#27212 <http://tracker.ceph.com/issues/27212>`_, `pr#23868 <https://github.com/ceph/ceph/pull/23868>`_, Konstantin Sakhinov)
-* rpm: silence osd block chown (`issue#25152 <http://tracker.ceph.com/issues/25152>`_, `pr#23324 <https://github.com/ceph/ceph/pull/23324>`_, Dan van der Ster)
-* run-rbd-unit-tests.sh test fails to finish in jenkin's make check run (`issue#27060 <http://tracker.ceph.com/issues/27060>`_, `issue#24910 <http://tracker.ceph.com/issues/24910>`_, `pr#23858 <https://github.com/ceph/ceph/pull/23858>`_, Mykola Golub)
-* scrub livelock (`issue#26931 <http://tracker.ceph.com/issues/26931>`_, `issue#26890 <http://tracker.ceph.com/issues/26890>`_, `pr#23722 <https://github.com/ceph/ceph/pull/23722>`_, Sage Weil)
-* spdk: compile with -march=core2 instead of -march=native (`issue#25032 <http://tracker.ceph.com/issues/25032>`_, `pr#23175 <https://github.com/ceph/ceph/pull/23175>`_, Nathan Cutler)
-* tests: cluster [WRN] 25 slow requests in powercycle (`issue#25119 <http://tracker.ceph.com/issues/25119>`_, `pr#23886 <https://github.com/ceph/ceph/pull/23886>`_, Neha Ojha)
-* test: Use pids instead of jobspecs which were wrong (`issue#32079 <http://tracker.ceph.com/issues/32079>`_, `issue#27056 <http://tracker.ceph.com/issues/27056>`_, `pr#23893 <https://github.com/ceph/ceph/pull/23893>`_, David Zafman)
-* tools/ceph-detect-init: support RHEL as a platform (`issue#18163 <http://tracker.ceph.com/issues/18163>`_, `pr#23303 <https://github.com/ceph/ceph/pull/23303>`_, Nathan Cutler)
-* tools: ceph-detect-init: support SLED (`issue#18163 <http://tracker.ceph.com/issues/18163>`_, `pr#23111 <https://github.com/ceph/ceph/pull/23111>`_, Nathan Cutler)
-* tools: cephfs-data-scan: print the max used ino (`issue#26978 <http://tracker.ceph.com/issues/26978>`_, `issue#26925 <http://tracker.ceph.com/issues/26925>`_, `pr#23880 <https://github.com/ceph/ceph/pull/23880>`_, "Yan, Zheng")
-
-
-v13.2.1 Mimic
-=============
-
-This is the first bugfix release of the Mimic v13.2.x long term stable release
-series. This release contains many fixes across all components of Ceph,
-including a few security fixes. We recommend that all users upgrade.
-
-Notable Changes
----------------
-
-* CVE 2018-1128: auth: cephx authorizer subject to replay attack (`issue#24836 <http://tracker.ceph.com/issues/24836>`_, Sage Weil)
-* CVE 2018-1129: auth: cephx signature check is weak (`issue#24837 <http://tracker.ceph.com/issues/24837>`_, Sage Weil)
-* CVE 2018-10861: mon: auth checks not correct for pool ops (`issue#24838 <http://tracker.ceph.com/issues/24838>`_, Jason Dillaman)
-
-Changelog
----------
-
-* bluestore:  common/hobject: improved hash calculation for hobject_t etc (`pr#22777 <https://github.com/ceph/ceph/pull/22777>`_, Adam Kupczyk, Sage Weil)
-* bluestore,core: mimic: os/bluestore: don't store/use path_block.{db,wal} from meta (`pr#22477 <https://github.com/ceph/ceph/pull/22477>`_, Sage Weil, Alfredo Deza)
-* bluestore: os/bluestore: backport 24319 and 24550 (`issue#24550 <http://tracker.ceph.com/issues/24550>`_, `issue#24502 <http://tracker.ceph.com/issues/24502>`_, `issue#24319 <http://tracker.ceph.com/issues/24319>`_, `issue#24581 <http://tracker.ceph.com/issues/24581>`_, `pr#22649 <https://github.com/ceph/ceph/pull/22649>`_, Sage Weil)
-* bluestore: os/bluestore: fix incomplete faulty range marking when doing compression (`pr#22910 <https://github.com/ceph/ceph/pull/22910>`_, Igor Fedotov)
-* bluestore: spdk: fix ceph-osd crash when activate SPDK (`issue#24472 <http://tracker.ceph.com/issues/24472>`_, `issue#24371 <http://tracker.ceph.com/issues/24371>`_, `pr#22684 <https://github.com/ceph/ceph/pull/22684>`_, tone-zhang)
-* build/ops: build/ops: ceph.git has two different versions of dpdk in the source tree (`issue#24942 <http://tracker.ceph.com/issues/24942>`_, `issue#24032 <http://tracker.ceph.com/issues/24032>`_, `pr#23070 <https://github.com/ceph/ceph/pull/23070>`_, Kefu Chai)
-* build/ops: build/ops: install-deps.sh fails on newest openSUSE Leap (`issue#25065 <http://tracker.ceph.com/issues/25065>`_, `pr#23178 <https://github.com/ceph/ceph/pull/23178>`_, Kyr Shatskyy)
-* build/ops: build/ops: Mimic build fails with -DWITH_RADOSGW=0 (`issue#24766 <http://tracker.ceph.com/issues/24766>`_, `pr#22851 <https://github.com/ceph/ceph/pull/22851>`_, Dan Mick)
-* build/ops: cmake: enable RTTI for both debug and release RocksDB builds (`pr#22299 <https://github.com/ceph/ceph/pull/22299>`_, Igor Fedotov)
-* build/ops: deb/rpm: add python-six as build-time and run-time dependency (`issue#24885 <http://tracker.ceph.com/issues/24885>`_, `pr#22948 <https://github.com/ceph/ceph/pull/22948>`_, Nathan Cutler, Kefu Chai)
-* build/ops: deb,rpm: fix block.db symlink ownership (`pr#23246 <https://github.com/ceph/ceph/pull/23246>`_, Sage Weil)
-* build/ops: include: fix build with older clang (OSX target) (`pr#23049 <https://github.com/ceph/ceph/pull/23049>`_, Christopher Blum)
-* build/ops: include: fix build with older clang (`pr#23034 <https://github.com/ceph/ceph/pull/23034>`_, Kefu Chai)
-* build/ops,rbd: build/ops: order rbdmap.service before remote-fs-pre.target (`issue#24713 <http://tracker.ceph.com/issues/24713>`_, `issue#24734 <http://tracker.ceph.com/issues/24734>`_, `pr#22843 <https://github.com/ceph/ceph/pull/22843>`_, Ilya Dryomov)
-* cephfs: cephfs: allow prohibiting user snapshots in CephFS (`issue#24705 <http://tracker.ceph.com/issues/24705>`_, `issue#24284 <http://tracker.ceph.com/issues/24284>`_, `pr#22812 <https://github.com/ceph/ceph/pull/22812>`_, "Yan, Zheng")
-* cephfs: cephfs-journal-tool: Fix purging when importing an zero-length journal (`issue#24861 <http://tracker.ceph.com/issues/24861>`_, `pr#22981 <https://github.com/ceph/ceph/pull/22981>`_, yupeng chen, zhongyan gu)
-* cephfs: client: fix bug #24491 _ll_drop_pins may access invalid iterator (`issue#24534 <http://tracker.ceph.com/issues/24534>`_, `pr#22791 <https://github.com/ceph/ceph/pull/22791>`_, Liu Yangkuan)
-* cephfs: client: update inode fields according to issued caps (`issue#24539 <http://tracker.ceph.com/issues/24539>`_, `issue#24269 <http://tracker.ceph.com/issues/24269>`_, `pr#22819 <https://github.com/ceph/ceph/pull/22819>`_, "Yan, Zheng")
-* cephfs: common/DecayCounter: set last_decay to current time when decoding dec… (`issue#24440 <http://tracker.ceph.com/issues/24440>`_, `issue#24537 <http://tracker.ceph.com/issues/24537>`_, `pr#22816 <https://github.com/ceph/ceph/pull/22816>`_, Zhi Zhang)
-* cephfs,core: mon/MDSMonitor: do not send redundant MDS health messages to cluster log (`issue#24308 <http://tracker.ceph.com/issues/24308>`_, `issue#24330 <http://tracker.ceph.com/issues/24330>`_, `pr#22265 <https://github.com/ceph/ceph/pull/22265>`_, Sage Weil)
-* cephfs: mds: add magic to header of open file table (`issue#24541 <http://tracker.ceph.com/issues/24541>`_, `issue#24240 <http://tracker.ceph.com/issues/24240>`_, `pr#22841 <https://github.com/ceph/ceph/pull/22841>`_, "Yan, Zheng")
-* cephfs: mds: low wrlock efficiency due to dirfrags traversal (`issue#24704 <http://tracker.ceph.com/issues/24704>`_, `issue#24467 <http://tracker.ceph.com/issues/24467>`_, `pr#22884 <https://github.com/ceph/ceph/pull/22884>`_, Xuehan Xu)
-* cephfs: PurgeQueue sometimes ignores Journaler errors (`issue#24533 <http://tracker.ceph.com/issues/24533>`_, `issue#24703 <http://tracker.ceph.com/issues/24703>`_, `pr#22810 <https://github.com/ceph/ceph/pull/22810>`_, John Spray)
-* cephfs,rbd: osdc: Fix the wrong BufferHead offset (`issue#24583 <http://tracker.ceph.com/issues/24583>`_, `pr#22869 <https://github.com/ceph/ceph/pull/22869>`_, dongdong tao)
-* cephfs: repeated eviction of idle client until some IO happens (`issue#24052 <http://tracker.ceph.com/issues/24052>`_, `issue#24296 <http://tracker.ceph.com/issues/24296>`_, `pr#22550 <https://github.com/ceph/ceph/pull/22550>`_, "Yan, Zheng")
-* cephfs: test gets ENOSPC from bluestore block device (`issue#24238 <http://tracker.ceph.com/issues/24238>`_, `issue#24913 <http://tracker.ceph.com/issues/24913>`_, `issue#24899 <http://tracker.ceph.com/issues/24899>`_, `issue#24758 <http://tracker.ceph.com/issues/24758>`_, `pr#22835 <https://github.com/ceph/ceph/pull/22835>`_, Patrick Donnelly, Sage Weil)
-* cephfs,tests: pjd: cd: too many arguments (`issue#24310 <http://tracker.ceph.com/issues/24310>`_, `pr#22882 <https://github.com/ceph/ceph/pull/22882>`_, Neha Ojha)
-* cephfs,tests: qa: client socket inaccessible without sudo (`issue#24872 <http://tracker.ceph.com/issues/24872>`_, `issue#24904 <http://tracker.ceph.com/issues/24904>`_, `pr#23030 <https://github.com/ceph/ceph/pull/23030>`_, Patrick Donnelly)
-* cephfs,tests: qa: fix ffsb cd argument (`issue#24719 <http://tracker.ceph.com/issues/24719>`_, `issue#24829 <http://tracker.ceph.com/issues/24829>`_, `issue#24680 <http://tracker.ceph.com/issues/24680>`_, `issue#24579 <http://tracker.ceph.com/issues/24579>`_, `pr#22956 <https://github.com/ceph/ceph/pull/22956>`_, Yan, Zheng, Patrick Donnelly)
-* cephfs,tests: qa/suites: Add supported-random-distro$ links (`issue#24706 <http://tracker.ceph.com/issues/24706>`_, `issue#24138 <http://tracker.ceph.com/issues/24138>`_, `pr#22700 <https://github.com/ceph/ceph/pull/22700>`_, Warren Usui)
-* ceph-volume describe better the options for migrating away from ceph-disk (`pr#22514 <https://github.com/ceph/ceph/pull/22514>`_, Alfredo Deza)
-* ceph-volume dmcrypt and activate --all documentation updates (`pr#22529 <https://github.com/ceph/ceph/pull/22529>`_, Alfredo Deza)
-* ceph-volume: error on commands that need ceph.conf to operate (`issue#23941 <http://tracker.ceph.com/issues/23941>`_, `pr#22747 <https://github.com/ceph/ceph/pull/22747>`_, Andrew Schoen)
-* ceph-volume expand on the LVM API to create multiple LVs at different sizes (`pr#22508 <https://github.com/ceph/ceph/pull/22508>`_, Alfredo Deza)
-* ceph-volume initial take on auto sub-command (`pr#22515 <https://github.com/ceph/ceph/pull/22515>`_, Alfredo Deza)
-* ceph-volume lvm.activate Do not search for a MON configuration (`pr#22398 <https://github.com/ceph/ceph/pull/22398>`_, Wido den Hollander)
-* ceph-volume lvm.common use destroy-new, doesn't need admin keyring (`issue#24585 <http://tracker.ceph.com/issues/24585>`_, `pr#22900 <https://github.com/ceph/ceph/pull/22900>`_, Alfredo Deza)
-* ceph-volume: provide a nice errror message when missing ceph.conf (`pr#22832 <https://github.com/ceph/ceph/pull/22832>`_, Andrew Schoen)
-* ceph-volume tests destroy osds on monitor hosts (`pr#22507 <https://github.com/ceph/ceph/pull/22507>`_, Alfredo Deza)
-* ceph-volume tests do not include admin keyring in OSD nodes (`pr#22425 <https://github.com/ceph/ceph/pull/22425>`_, Alfredo Deza)
-* ceph-volume tests.functional install new ceph-ansible dependencies (`pr#22535 <https://github.com/ceph/ceph/pull/22535>`_, Alfredo Deza)
-* ceph-volume: tests/functional run lvm list after OSD provisioning (`issue#24961 <http://tracker.ceph.com/issues/24961>`_, `pr#23148 <https://github.com/ceph/ceph/pull/23148>`_, Alfredo Deza)
-* ceph-volume tests/functional use Ansible 2.6 (`pr#23244 <https://github.com/ceph/ceph/pull/23244>`_, Alfredo Deza)
-* ceph-volume: unmount lvs correctly before zapping (`issue#24796 <http://tracker.ceph.com/issues/24796>`_, `pr#23127 <https://github.com/ceph/ceph/pull/23127>`_, Andrew Schoen)
-* cmake: bump up the required boost version to 1.67 (`pr#22412 <https://github.com/ceph/ceph/pull/22412>`_, Kefu Chai)
-* common: common: Abort in OSDMap::decode() during qa/standalone/erasure-code/test-erasure-eio.sh (`issue#24865 <http://tracker.ceph.com/issues/24865>`_, `issue#23492 <http://tracker.ceph.com/issues/23492>`_, `pr#23024 <https://github.com/ceph/ceph/pull/23024>`_, Sage Weil)
-* common: common: fix typo in rados bench write JSON output (`issue#24292 <http://tracker.ceph.com/issues/24292>`_, `issue#24199 <http://tracker.ceph.com/issues/24199>`_, `pr#22406 <https://github.com/ceph/ceph/pull/22406>`_, Sandor Zeestraten)
-* common,core: common: partially revert 95fc248 to make get_process_name work (`issue#24123 <http://tracker.ceph.com/issues/24123>`_, `issue#24215 <http://tracker.ceph.com/issues/24215>`_, `pr#22311 <https://github.com/ceph/ceph/pull/22311>`_, Mykola Golub)
-* common: osd: Change osd_skip_data_digest default to false and make it LEVEL_DEV (`pr#23084 <https://github.com/ceph/ceph/pull/23084>`_, Sage Weil, David Zafman)
-* common: tell ... config rm <foo> not idempotent (`issue#24468 <http://tracker.ceph.com/issues/24468>`_, `issue#24408 <http://tracker.ceph.com/issues/24408>`_, `pr#22552 <https://github.com/ceph/ceph/pull/22552>`_, Sage Weil)
-* core: bluestore: flush_commit is racy (`issue#24261 <http://tracker.ceph.com/issues/24261>`_, `issue#21480 <http://tracker.ceph.com/issues/21480>`_, `pr#22382 <https://github.com/ceph/ceph/pull/22382>`_, Sage Weil)
-* core: ceph osd safe-to-destroy crashes the mgr (`issue#24708 <http://tracker.ceph.com/issues/24708>`_, `issue#23249 <http://tracker.ceph.com/issues/23249>`_, `pr#22805 <https://github.com/ceph/ceph/pull/22805>`_, Sage Weil)
-* core: change default filestore_merge_threshold to -10 (`issue#24686 <http://tracker.ceph.com/issues/24686>`_, `issue#24747 <http://tracker.ceph.com/issues/24747>`_, `pr#22813 <https://github.com/ceph/ceph/pull/22813>`_, Douglas Fuller)
-* core: common/hobject: improved hash calculation (`pr#22722 <https://github.com/ceph/ceph/pull/22722>`_, Adam Kupczyk)
-* core: cosbench stuck at booting cosbench driver (`issue#24473 <http://tracker.ceph.com/issues/24473>`_, `pr#22887 <https://github.com/ceph/ceph/pull/22887>`_, Neha Ojha)
-* core: librados: fix buffer overflow for aio_exec python binding (`issue#24475 <http://tracker.ceph.com/issues/24475>`_, `pr#22707 <https://github.com/ceph/ceph/pull/22707>`_, Aleksei Gutikov)
-* core: mon: enable level_compaction_dynamic_level_bytes for rocksdb (`issue#24375 <http://tracker.ceph.com/issues/24375>`_, `issue#24361 <http://tracker.ceph.com/issues/24361>`_, `pr#22361 <https://github.com/ceph/ceph/pull/22361>`_, Kefu Chai)
-* core: mon/MgrMonitor: change 'unresponsive' message to info level (`issue#24246 <http://tracker.ceph.com/issues/24246>`_, `issue#24222 <http://tracker.ceph.com/issues/24222>`_, `pr#22333 <https://github.com/ceph/ceph/pull/22333>`_, Sage Weil)
-* core: mon/OSDMonitor: no_reply on MOSDFailure messages (`issue#24322 <http://tracker.ceph.com/issues/24322>`_, `issue#24350 <http://tracker.ceph.com/issues/24350>`_, `pr#22297 <https://github.com/ceph/ceph/pull/22297>`_, Sage Weil)
-* core: os/bluestore: firstly delete db then delete bluefs if open db met error (`pr#22525 <https://github.com/ceph/ceph/pull/22525>`_, Jianpeng Ma)
-* core: os/bluestore: fix races on SharedBlob::coll in ~SharedBlob (`issue#24859 <http://tracker.ceph.com/issues/24859>`_, `issue#24887 <http://tracker.ceph.com/issues/24887>`_, `pr#23065 <https://github.com/ceph/ceph/pull/23065>`_, Radoslaw Zarzynski)
-* core: osd: choose_acting loop (`issue#24383 <http://tracker.ceph.com/issues/24383>`_, `issue#24618 <http://tracker.ceph.com/issues/24618>`_, `pr#22889 <https://github.com/ceph/ceph/pull/22889>`_, Neha Ojha)
-* core: osd: do not blindly roll forward to log.head (`issue#24597 <http://tracker.ceph.com/issues/24597>`_, `pr#22997 <https://github.com/ceph/ceph/pull/22997>`_, Sage Weil)
-* core: osd: eternal stuck PG in 'unfound_recovery' (`issue#24500 <http://tracker.ceph.com/issues/24500>`_, `issue#24373 <http://tracker.ceph.com/issues/24373>`_, `pr#22545 <https://github.com/ceph/ceph/pull/22545>`_, Sage Weil)
-* core: osd: fix deep scrub with osd_skip_data_digest=true (default) and blue… (`issue#24922 <http://tracker.ceph.com/issues/24922>`_, `issue#24958 <http://tracker.ceph.com/issues/24958>`_, `pr#23094 <https://github.com/ceph/ceph/pull/23094>`_, Sage Weil)
-* core: osd: fix getting osd maps on initial osd startup (`pr#22651 <https://github.com/ceph/ceph/pull/22651>`_, Paul Emmerich)
-* core: osd: increase default hard pg limit (`issue#24355 <http://tracker.ceph.com/issues/24355>`_, `pr#22621 <https://github.com/ceph/ceph/pull/22621>`_, Josh Durgin)
-* core: osd: may get empty info at recovery (`issue#24771 <http://tracker.ceph.com/issues/24771>`_, `issue#24588 <http://tracker.ceph.com/issues/24588>`_, `pr#22861 <https://github.com/ceph/ceph/pull/22861>`_, Sage Weil)
-* core: osd/PrimaryLogPG: rebuild attrs from clients (`issue#24768 <http://tracker.ceph.com/issues/24768>`_, `issue#24805 <http://tracker.ceph.com/issues/24805>`_, `pr#22960 <https://github.com/ceph/ceph/pull/22960>`_, Sage Weil)
-* core: osd: retry to read object attrs at EC recovery (`issue#24406 <http://tracker.ceph.com/issues/24406>`_, `pr#22394 <https://github.com/ceph/ceph/pull/22394>`_, xiaofei cui)
-* core: osd/Session: fix invalid iterator dereference in Sessoin::have_backoff() (`issue#24486 <http://tracker.ceph.com/issues/24486>`_, `issue#24494 <http://tracker.ceph.com/issues/24494>`_, `pr#22730 <https://github.com/ceph/ceph/pull/22730>`_, Sage Weil)
-* core: PG: add custom_reaction Backfilled and release reservations after bac… (`issue#24332 <http://tracker.ceph.com/issues/24332>`_, `pr#22559 <https://github.com/ceph/ceph/pull/22559>`_, Neha Ojha)
-* core: set correctly shard for existed Collection (`issue#24769 <http://tracker.ceph.com/issues/24769>`_, `issue#24761 <http://tracker.ceph.com/issues/24761>`_, `pr#22859 <https://github.com/ceph/ceph/pull/22859>`_, Jianpeng Ma)
-* core,tests: Bring back diff -y for non-FreeBSD (`issue#24738 <http://tracker.ceph.com/issues/24738>`_, `issue#24470 <http://tracker.ceph.com/issues/24470>`_, `pr#22826 <https://github.com/ceph/ceph/pull/22826>`_, Sage Weil, David Zafman)
-* core,tests: ceph_test_rados_api_misc: fix LibRadosMiscPool.PoolCreationRace (`issue#24204 <http://tracker.ceph.com/issues/24204>`_, `issue#24150 <http://tracker.ceph.com/issues/24150>`_, `pr#22291 <https://github.com/ceph/ceph/pull/22291>`_, Sage Weil)
-* core,tests: qa/workunits/suites/blogbench.sh: use correct dir name (`pr#22775 <https://github.com/ceph/ceph/pull/22775>`_, Neha Ojha)
-* core,tests: Wip scrub omap (`issue#24366 <http://tracker.ceph.com/issues/24366>`_, `issue#24381 <http://tracker.ceph.com/issues/24381>`_, `pr#22374 <https://github.com/ceph/ceph/pull/22374>`_, David Zafman)
-* core,tools: ceph-detect-init: stop using platform.linux_distribution (`issue#18163 <http://tracker.ceph.com/issues/18163>`_, `pr#21523 <https://github.com/ceph/ceph/pull/21523>`_, Nathan Cutler)
-* core: ValueError: too many values to unpack due to lack of subdir (`issue#24617 <http://tracker.ceph.com/issues/24617>`_, `pr#22888 <https://github.com/ceph/ceph/pull/22888>`_, Neha Ojha)
-* doc: ceph-bluestore-tool manpage not getting rendered correctly (`issue#25062 <http://tracker.ceph.com/issues/25062>`_, `issue#24800 <http://tracker.ceph.com/issues/24800>`_, `pr#23176 <https://github.com/ceph/ceph/pull/23176>`_, Nathan Cutler)
-* doc: doc: update experimental features - snapshots (`pr#22803 <https://github.com/ceph/ceph/pull/22803>`_, Jos Collin)
-* doc: fix the links in releases/schedule.rst (`pr#22372 <https://github.com/ceph/ceph/pull/22372>`_, Kefu Chai)
-* doc: [mimic] doc/cephfs: remove lingering "experimental" note about multimds (`pr#22854 <https://github.com/ceph/ceph/pull/22854>`_, John Spray)
-* lvm: when osd creation fails log the exception (`issue#24456 <http://tracker.ceph.com/issues/24456>`_, `pr#22640 <https://github.com/ceph/ceph/pull/22640>`_, Andrew Schoen)
-* mgr/dashboard: Fix bug when creating S3 keys (`pr#22468 <https://github.com/ceph/ceph/pull/22468>`_, Volker Theile)
-* mgr/dashboard: fix lint error caused by codelyzer update (`pr#22713 <https://github.com/ceph/ceph/pull/22713>`_, Tiago Melo)
-* mgr/dashboard: Fix some datatable CSS issues (`pr#22274 <https://github.com/ceph/ceph/pull/22274>`_, Volker Theile)
-* mgr/dashboard: Float numbers incorrectly formatted (`issue#24081 <http://tracker.ceph.com/issues/24081>`_, `issue#24707 <http://tracker.ceph.com/issues/24707>`_, `pr#22886 <https://github.com/ceph/ceph/pull/22886>`_, Stephan Müller, Tiago Melo)
-* mgr/dashboard: Missing breadcrumb on monitor performance counters page (`issue#24764 <http://tracker.ceph.com/issues/24764>`_, `pr#22849 <https://github.com/ceph/ceph/pull/22849>`_, Ricardo Marques, Tiago Melo)
-* mgr/dashboard: Replace Pool with Pools (`issue#24699 <http://tracker.ceph.com/issues/24699>`_, `pr#22807 <https://github.com/ceph/ceph/pull/22807>`_, Lenz Grimmer)
-* mgr: mgr/dashboard: Listen on port 8443 by default and not 8080 (`pr#22449 <https://github.com/ceph/ceph/pull/22449>`_, Wido den Hollander)
-* mgr,mon: exception for dashboard in config-key warning (`pr#22770 <https://github.com/ceph/ceph/pull/22770>`_, John Spray)
-* mgr,pybind: Python bindings use iteritems method which is not Python 3 compatible (`issue#24803 <http://tracker.ceph.com/issues/24803>`_, `issue#24779 <http://tracker.ceph.com/issues/24779>`_, `pr#22917 <https://github.com/ceph/ceph/pull/22917>`_, Nathan Cutler)
-* mgr: Sync up ceph-mgr prometheus related changes (`pr#22341 <https://github.com/ceph/ceph/pull/22341>`_, Boris Ranto)
-* mon: don't require CEPHX_V2 from mons until nautilus (`pr#23233 <https://github.com/ceph/ceph/pull/23233>`_, Sage Weil)
-* mon/OSDMonitor: Respect paxos_propose_interval (`pr#22268 <https://github.com/ceph/ceph/pull/22268>`_, Xiaoxi CHEN)
-* osd: forward-port osd_distrust_data_digest from luminous (`pr#23184 <https://github.com/ceph/ceph/pull/23184>`_, Sage Weil)
-* osd/OSDMap: fix CEPHX_V2 osd requirement to nautilus, not mimic (`pr#23250 <https://github.com/ceph/ceph/pull/23250>`_, Sage Weil)
-* qa/rgw: disable testing on ec-cache pools (`issue#23965 <http://tracker.ceph.com/issues/23965>`_, `pr#23096 <https://github.com/ceph/ceph/pull/23096>`_, Casey Bodley)
-* qa/suites/upgrade/mimic-p2p: allow target version to apply (`pr#23262 <https://github.com/ceph/ceph/pull/23262>`_, Sage Weil)
-* qa/tests: added supported distro for powercycle suite (`pr#22224 <https://github.com/ceph/ceph/pull/22224>`_, Yuri Weinstein)
-* qa/tests: changed distro symlink to point to new way using supported OSes (`pr#22653 <https://github.com/ceph/ceph/pull/22653>`_, Yuri Weinstein)
-* rbd: librbd: deep_copy: resize head object map if needed (`issue#24499 <http://tracker.ceph.com/issues/24499>`_, `issue#24399 <http://tracker.ceph.com/issues/24399>`_, `pr#22768 <https://github.com/ceph/ceph/pull/22768>`_, Mykola Golub)
-* rbd: librbd: fix crash when opening nonexistent snapshot (`issue#24637 <http://tracker.ceph.com/issues/24637>`_, `issue#24698 <http://tracker.ceph.com/issues/24698>`_, `pr#22943 <https://github.com/ceph/ceph/pull/22943>`_, Mykola Golub)
-* rbd: librbd: force 'invalid object map' flag on-disk update (`issue#24496 <http://tracker.ceph.com/issues/24496>`_, `issue#24434 <http://tracker.ceph.com/issues/24434>`_, `pr#22754 <https://github.com/ceph/ceph/pull/22754>`_, Mykola Golub)
-* rbd: librbd: utilize the journal disabled policy when removing images (`issue#24388 <http://tracker.ceph.com/issues/24388>`_, `issue#23512 <http://tracker.ceph.com/issues/23512>`_, `pr#22662 <https://github.com/ceph/ceph/pull/22662>`_, Jason Dillaman)
-* rbd: Prevent the use of internal feature bits from outside cls/rbd (`issue#24165 <http://tracker.ceph.com/issues/24165>`_, `issue#24203 <http://tracker.ceph.com/issues/24203>`_, `pr#22222 <https://github.com/ceph/ceph/pull/22222>`_, Jason Dillaman)
-* rbd: rbd-mirror daemon failed to stop on active/passive test case (`issue#24390 <http://tracker.ceph.com/issues/24390>`_, `pr#22667 <https://github.com/ceph/ceph/pull/22667>`_, Jason Dillaman)
-* rbd: [rbd-mirror] entries_behind_master will not be zero after mirror over (`issue#24391 <http://tracker.ceph.com/issues/24391>`_, `issue#23516 <http://tracker.ceph.com/issues/23516>`_, `pr#22549 <https://github.com/ceph/ceph/pull/22549>`_, Jason Dillaman)
-* rbd: rbd-mirror simple image map policy doesn't always level-load instances (`issue#24519 <http://tracker.ceph.com/issues/24519>`_, `issue#24161 <http://tracker.ceph.com/issues/24161>`_, `pr#22892 <https://github.com/ceph/ceph/pull/22892>`_, Venky Shankar)
-* rbd: rbd trash purge --threshold should support data pool (`issue#24476 <http://tracker.ceph.com/issues/24476>`_, `issue#22872 <http://tracker.ceph.com/issues/22872>`_, `pr#22891 <https://github.com/ceph/ceph/pull/22891>`_, Mahati Chamarthy)
-* rbd,tests: qa: krbd_exclusive_option.sh: bump lock_timeout to 60 seconds (`issue#25081 <http://tracker.ceph.com/issues/25081>`_, `pr#23209 <https://github.com/ceph/ceph/pull/23209>`_, Ilya Dryomov)
-* rbd: yet another case when deep copying a clone may result in invalid object map (`issue#24596 <http://tracker.ceph.com/issues/24596>`_, `issue#24545 <http://tracker.ceph.com/issues/24545>`_, `pr#22894 <https://github.com/ceph/ceph/pull/22894>`_, Mykola Golub)
-* rgw: cls_bucket_list fails causes cascading osd crashes (`issue#24631 <http://tracker.ceph.com/issues/24631>`_, `issue#24117 <http://tracker.ceph.com/issues/24117>`_, `pr#22927 <https://github.com/ceph/ceph/pull/22927>`_, Yehuda Sadeh)
-* rgw: multisite: RGWSyncTraceNode released twice and crashed in reload (`issue#24432 <http://tracker.ceph.com/issues/24432>`_, `issue#24619 <http://tracker.ceph.com/issues/24619>`_, `pr#22926 <https://github.com/ceph/ceph/pull/22926>`_, Tianshan Qu)
-* rgw: objects in cache never refresh after rgw_cache_expiry_interval (`issue#24346 <http://tracker.ceph.com/issues/24346>`_, `issue#24385 <http://tracker.ceph.com/issues/24385>`_, `pr#22643 <https://github.com/ceph/ceph/pull/22643>`_, Casey Bodley)
-* rgw: add configurable AWS-compat invalid range get behavior (`issue#24317 <http://tracker.ceph.com/issues/24317>`_, `issue#24352 <http://tracker.ceph.com/issues/24352>`_, `pr#22590 <https://github.com/ceph/ceph/pull/22590>`_, Matt Benjamin)
-* rgw: Admin OPS Api overwrites email when user is modified (`issue#24253 <http://tracker.ceph.com/issues/24253>`_, `pr#22523 <https://github.com/ceph/ceph/pull/22523>`_, Volker Theile)
-* rgw: fix gc may cause a large number of read traffic (`issue#24807 <http://tracker.ceph.com/issues/24807>`_, `issue#24767 <http://tracker.ceph.com/issues/24767>`_, `pr#22941 <https://github.com/ceph/ceph/pull/22941>`_, Xin Liao)
-* rgw: have a configurable authentication order (`issue#23089 <http://tracker.ceph.com/issues/23089>`_, `issue#24547 <http://tracker.ceph.com/issues/24547>`_, `pr#22842 <https://github.com/ceph/ceph/pull/22842>`_, Abhishek Lekshmanan)
-* rgw: index complete miss zones_trace set (`issue#24701 <http://tracker.ceph.com/issues/24701>`_, `issue#24590 <http://tracker.ceph.com/issues/24590>`_, `pr#22818 <https://github.com/ceph/ceph/pull/22818>`_, Tianshan Qu)
-* rgw: Invalid Access-Control-Request-Request may bypass validate_cors_rule_method (`issue#24809 <http://tracker.ceph.com/issues/24809>`_, `issue#24223 <http://tracker.ceph.com/issues/24223>`_, `pr#22935 <https://github.com/ceph/ceph/pull/22935>`_, Jeegn Chen)
-* rgw: meta and data notify thread miss stop cr manager (`issue#24702 <http://tracker.ceph.com/issues/24702>`_, `issue#24589 <http://tracker.ceph.com/issues/24589>`_, `pr#22821 <https://github.com/ceph/ceph/pull/22821>`_, Tianshan Qu)
-* rgw:-multisite: endless loop in RGWBucketShardIncrementalSyncCR (`issue#24700 <http://tracker.ceph.com/issues/24700>`_, `issue#24603 <http://tracker.ceph.com/issues/24603>`_, `pr#22815 <https://github.com/ceph/ceph/pull/22815>`_, cfanz)
-* rgw: performance regression for luminous 12.2.4 (`issue#23379 <http://tracker.ceph.com/issues/23379>`_, `issue#24633 <http://tracker.ceph.com/issues/24633>`_, `pr#22929 <https://github.com/ceph/ceph/pull/22929>`_, Mark Kogan)
-* rgw: radogw-admin reshard status command should print text for reshar… (`issue#24834 <http://tracker.ceph.com/issues/24834>`_, `issue#23257 <http://tracker.ceph.com/issues/23257>`_, `pr#23021 <https://github.com/ceph/ceph/pull/23021>`_, Orit Wasserman)
-* rgw: "radosgw-admin objects expire" always returns ok even if the pro… (`issue#24831 <http://tracker.ceph.com/issues/24831>`_, `issue#24592 <http://tracker.ceph.com/issues/24592>`_, `pr#23001 <https://github.com/ceph/ceph/pull/23001>`_, Zhang Shaowen)
-* rgw: require --yes-i-really-mean-it to run radosgw-admin orphans find (`issue#24146 <http://tracker.ceph.com/issues/24146>`_, `issue#24843 <http://tracker.ceph.com/issues/24843>`_, `pr#22986 <https://github.com/ceph/ceph/pull/22986>`_, Matt Benjamin)
-* rgw: REST admin metadata API paging failure bucket & bucket.instance: InvalidArgument (`issue#23099 <http://tracker.ceph.com/issues/23099>`_, `issue#24813 <http://tracker.ceph.com/issues/24813>`_, `pr#22933 <https://github.com/ceph/ceph/pull/22933>`_, Matt Benjamin)
-* rgw: set cr state if aio_read err return in RGWCloneMetaLogCoroutine:state_send_rest_request (`issue#24566 <http://tracker.ceph.com/issues/24566>`_, `issue#24783 <http://tracker.ceph.com/issues/24783>`_, `pr#22880 <https://github.com/ceph/ceph/pull/22880>`_, Tianshan Qu)
-* rgw: test/rgw: fix for bucket checkpoints (`issue#24212 <http://tracker.ceph.com/issues/24212>`_, `issue#24313 <http://tracker.ceph.com/issues/24313>`_, `pr#22466 <https://github.com/ceph/ceph/pull/22466>`_, Casey Bodley)
-* rgw,tests: add unit test for cls bi list command (`issue#24736 <http://tracker.ceph.com/issues/24736>`_, `issue#24483 <http://tracker.ceph.com/issues/24483>`_, `pr#22845 <https://github.com/ceph/ceph/pull/22845>`_, Orit Wasserman)
-* tests: mimic - qa/tests: Set ansible-version: 2.4 (`issue#24926 <http://tracker.ceph.com/issues/24926>`_, `pr#23122 <https://github.com/ceph/ceph/pull/23122>`_, Yuri Weinstein)
-* tests: osd sends op_reply out of order (`issue#25010 <http://tracker.ceph.com/issues/25010>`_, `pr#23136 <https://github.com/ceph/ceph/pull/23136>`_, Neha Ojha)
-* tests: qa/tests - added overrides stanza to allow runs on ovh on rhel OS (`pr#23156 <https://github.com/ceph/ceph/pull/23156>`_, Yuri Weinstein)
-* tests: qa/tests - added skeleton for mimic point to point upgrades testing (`pr#22697 <https://github.com/ceph/ceph/pull/22697>`_, Yuri Weinstein)
-* tests: qa/tests: fix supported distro lists for ceph-deploy (`pr#23017 <https://github.com/ceph/ceph/pull/23017>`_, Vasu Kulkarni)
-* tests: qa: wait longer for osd to flush pg stats (`issue#24321 <http://tracker.ceph.com/issues/24321>`_, `pr#22492 <https://github.com/ceph/ceph/pull/22492>`_, Kefu Chai)
-* tests: tests: Health check failed: 1 MDSs report slow requests (MDS_SLOW_REQUEST) in powercycle (`issue#25034 <http://tracker.ceph.com/issues/25034>`_, `pr#23154 <https://github.com/ceph/ceph/pull/23154>`_, Neha Ojha)
-* tests: tests: make test_ceph_argparse.py pass on py3-only systems (`issue#24825 <http://tracker.ceph.com/issues/24825>`_, `issue#24816 <http://tracker.ceph.com/issues/24816>`_, `pr#22988 <https://github.com/ceph/ceph/pull/22988>`_, Nathan Cutler)
-* tests: upgrade/luminous-x: whitelist REQUEST_SLOW for rados_mon_thrash (`issue#25056 <http://tracker.ceph.com/issues/25056>`_, `issue#25051 <http://tracker.ceph.com/issues/25051>`_, `pr#23164 <https://github.com/ceph/ceph/pull/23164>`_, Nathan Cutler)
-
-v13.2.0 Mimic
-=============
-
-This is the first stable release of Mimic, the next long term release series.
-
-Major Changes from Luminous
----------------------------
-
-- *Dashboard*:
-
-  * The (read-only) Ceph manager dashboard introduced in Ceph Luminous has been
-    replaced with a new implementation inspired by and derived from the
-    `openATTIC <https://openattic.org>`_ Ceph management tool, providing a
-    drop-in replacement offering a :ref:`number of additional management
-    features <mgr-dashboard>`.
-
-- *RADOS*:
-
-  * Config options can now be centrally stored and managed by the monitor.
-  * The monitor daemon uses significantly less disk space when undergoing
-    recovery or rebalancing operations.
-  * An *async recovery* feature reduces the tail latency of requests
-    when the OSDs are recovering from a recent failure.
-  * OSD preemption of scrub by conflicting requests reduces tail latency.
-
-- *RGW*:
-
-  * RGW can now replicate a zone (or a subset of buckets) to an
-    external cloud storage service like S3.
-  * RGW now supports the S3 multi-factor authentication API on
-    versioned buckets.
-  * The Beast frontend is no longer experimental, and is considered
-    stable and ready for use.
-
-- *CephFS*:
-
-  * Snapshots are now stable when combined with multiple MDS daemons.
-
-- *RBD*:
-
-  * Image clones no longer require explicit *protect* and *unprotect*
-    steps.
-  * Images can be deep-copied (including any clone linkage to a parent
-    image and associated snapshots) to new pools or with altered data
-    layouts.
-
-- *Misc*:
-
-  * We have dropped the Debian builds for the Mimic release due to the
-    lack of GCC 8 in Stretch.  We expect Debian builds to return with
-    the release of Buster in early 2019, and hope to build a final
-    Luminous release (and possibly later Mimic point releases) once
-    Buster is available.
-
-
-Upgrading from Luminous
------------------------
-
-Notes
-~~~~~
-
-* We recommend you avoid creating any RADOS pools while the upgrade is
-  in process.
-
-* You can monitor the progress of your upgrade at each stage with the
-  ``ceph versions`` command, which will tell you what ceph version(s) are
-  running for each type of daemon.
-
-Instructions
-~~~~~~~~~~~~
-
-#. If your cluster was originally installed with a version prior to
-   Luminous, ensure that it has completed at least one full scrub of
-   all PGs while running Luminous.  Failure to do so will cause your
-   monitor daemons to refuse to join the quorum on start, leaving them
-   non-functional.
-
-   If you are unsure whether or not your Luminous cluster has
-   completed a full scrub of all PGs, you can check your cluster's
-   state by running::
-
-     # ceph osd dump | grep ^flags
-
-   In order to be able to proceed to Mimic, your OSD map must include
-   the ``recovery_deletes`` and ``purged_snapdirs`` flags.
-
-   If your OSD map does not contain both these flags, you can simply
-   wait for approximately 24-48 hours, which in a standard cluster
-   configuration should be ample time for all your placement groups to
-   be scrubbed at least once, and then repeat the above process to
-   recheck.
-
-   However, if you have just completed an upgrade to Luminous and want
-   to proceed to Mimic in short order, you can force a scrub on all
-   placement groups with a one-line shell command, like::
-
-     # ceph pg dump pgs_brief | cut -d " " -f 1 | xargs -n1 ceph pg scrub
-
-   You should take into consideration that this forced scrub may
-   possibly have a negative impact on your Ceph clients' performance.
-
-#. Make sure your cluster is stable and healthy (no down or
-   recovering OSDs).  (Optional, but recommended.)
-
-#. Set the ``noout`` flag for the duration of the upgrade. (Optional,
-   but recommended.)::
-
-     # ceph osd set noout
-
-#. Upgrade monitors by installing the new packages and restarting the
-   monitor daemons.::
-
-     # systemctl restart ceph-mon.target
-
-   Once all monitors are up, verify that the monitor upgrade is
-   complete by looking for the ``mimic`` feature string in the mon
-   map.  For example::
-
-     # ceph mon feature ls
-
-   should include `mimic` under persistent features::
-
-     on current monmap (epoch NNN)
-        persistent: [kraken,luminous,mimic]
-        required: [kraken,luminous,mimic]
-
-#. Upgrade ``ceph-mgr`` daemons by installing the new packages and
-   restarting with::
-
-     # systemctl restart ceph-mgr.target
-
-   Verify the ``ceph-mgr`` daemons are running by checking ``ceph
-   -s``::
-
-     # ceph -s
-
-     ...
-       services:
-        mon: 3 daemons, quorum foo,bar,baz
-        mgr: foo(active), standbys: bar, baz
-     ...
-
-#. Upgrade all OSDs by installing the new packages and restarting the
-   ceph-osd daemons on all hosts::
-
-     # systemctl restart ceph-osd.target
-
-   You can monitor the progress of the OSD upgrades with the new
-   ``ceph versions`` or ``ceph osd versions`` command::
-
-     # ceph osd versions
-     {
-        "ceph version 12.2.5 (...) luminous (stable)": 12,
-        "ceph version 13.2.0 (...) mimic (stable)": 22,
-     }
-
-#. Upgrade all CephFS MDS daemons.  For each CephFS file system,
-
-   #. Reduce the number of ranks to 1.  (Make note of the original
-      number of MDS daemons first if you plan to restore it later.)::
-
-       # ceph status
-       # ceph fs set <fs_name> max_mds 1
-
-   #. Wait for the cluster to deactivate any non-zero ranks by
-      periodically checking the status::
-
-       # ceph status
-
-   #. Take all standby MDS daemons offline on the appropriate hosts with::
-
-       # systemctl stop ceph-mds@<daemon_name>
-
-   #. Confirm that only one MDS is online and is rank 0 for your FS::
-
-       # ceph status
-
-   #. Upgrade the last remaining MDS daemon by installing the new
-      packages and restarting the daemon::
-
-        # systemctl restart ceph-mds.target
-
-   #. Restart all standby MDS daemons that were taken offline::
-
-       # systemctl start ceph-mds.target
-
-   #. Restore the original value of ``max_mds`` for the volume::
-
-       # ceph fs set <fs_name> max_mds <original_max_mds>
-
-#. Upgrade all radosgw daemons by upgrading packages and restarting
-   daemons on all hosts::
-
-     # systemctl restart radosgw.target
-
-#. Complete the upgrade by disallowing pre-Mimic OSDs and enabling
-   all new Mimic-only functionality::
-
-     # ceph osd require-osd-release mimic
-
-#. If you set ``noout`` at the beginning, be sure to clear it with::
-
-     # ceph osd unset noout
-
-#. Verify the cluster is healthy with ``ceph health``.
-
-Upgrading from pre-Luminous releases (like Jewel)
--------------------------------------------------
-
-You *must* first upgrade to Luminous (12.2.z) before attempting an
-upgrade to Mimic.  In addition, your cluster must have completed at
-least one scrub of all PGs while running Luminous, setting the
-``recovery_deletes`` and ``purged_snapdirs`` flags in the OSD map.
-
-Upgrade compatibility notes
----------------------------
-
-These changes occurred between the Luminous and Mimic releases.
-
-* *core*:
-
-  - The ``pg force-recovery`` command will not work for erasure-coded PGs when a
-    Luminous monitor is running along with a Mimic OSD. Please use the
-    recommended upgrade order of monitors before OSDs to avoid this issue.
-
-  - The sample ``crush-location-hook`` script has been removed. Its output is
-    equivalent to the built-in default behavior, so it has been replaced with an
-    example in the CRUSH documentation.
-
-  - The ``-f`` option of the rados tool now means ``--format`` instead
-    of ``--force``, for consistency with the ceph tool.
-
-  - The format of the ``config diff`` output via the admin socket has changed. It
-    now reflects the source of each config option (e.g., default, config file,
-    command line) as well as the final (active) value.
-
-  - Commands variously marked as `del`, `delete`, `remove`
-    etc. should now all be normalized as `rm`. Commands already
-    supporting alternatives to `rm` remain backward-compatible. This
-    changeset applies to the ``radosgw-admin`` tool as well.
-
-  - Monitors will now prune on-disk full maps if the number of maps grows above
-    a certain number (mon_osdmap_full_prune_min, default: 10000), thus
-    preventing unbounded growth of the monitor data store. This feature is
-    enabled by default, and can be disabled by setting
-    `mon_osdmap_full_prune_enabled` to false.
-
-  - *rados list-inconsistent-obj format changes:*
-
-    + Various error strings have been improved.  For example, the "oi"
-      or "oi_attr" in errors which stands for object info is now
-      "info" (e.g. oi_attr_missing is now info_missing).
-
-    + The object's "selected_object_info" is now in json format
-      instead of string.
-
-    + The attribute errors (attr_value_mismatch, attr_name_mismatch)
-      only apply to user attributes.  Only user attributes are output
-      and have the internal leading underscore stripped.
-
-    + If there are hash information errors (hinfo_missing, hinfo_corrupted,
-      hinfo_inconsistency) then "hashinfo" is added with the json format of the
-      information. If the information is corrupt then "hashinfo" is a string
-      containing the value.
-
-    + If there are snapset errors (snapset_missing, snapset_corrupted,
-      snapset_inconsistency) then "snapset" is added with the json format of the
-      information. If the information is corrupt then "snapset" is a string
-      containing the value.
-
-    + If there are object information errors (info_missing, info_corrupted,
-      obj_size_info_mismatch, object_info_inconsistency) then "object_info" is
-      added with the json format of the information instead of a string. If the
-      information is corrupt then "object_info" is a string containing the
-      value.
-
-  - *rados list-inconsistent-snapset format changes:*
-
-    + Various error strings have been improved. For example, the "ss_attr" in
-      errors which stands for snapset info is now "snapset" (e.g.
-      ss_attr_missing is now snapset_missing). The error snapset_mismatch has
-      been renamed to snapset_error to better reflect what it means.
-
-    + The head snapset information is output in json format as "snapset." This
-      means that even when there are no head errors, the head object will be
-      output when any shard has an error. This head object is there to show the
-      snapset that was used in determining errors.
-
-  - The `osd_mon_report_interval_min` option has been renamed to
-    `osd_mon_report_interval`, and the `osd_mon_report_interval_max`
-    (unused) has been eliminated. If this value has been customized on your
-    cluster then your configuration should be adjusted in order to avoid
-    reverting to the default value.
-
-  - The config-key interface can store arbitrary binary blobs but JSON can only
-    express printable strings. If binary blobs are present, the 'ceph config-key
-    dump' command will show them as something like `<<< binary blob of length N
-    >>>`.
-
-  - Bootstrap auth keys will now be generated automatically on a fresh
-    deployment; these keys will also be generated, if missing, during upgrade.
-
-  - The ``osd force-create-pg`` command now requires a force option to proceed
-    because the command is dangerous: it declares that data loss is permanent
-    and instructs the cluster to proceed with an empty PG in its place, without
-    making any further efforts to find the missing data.
-
-  *CephFS*:
-
-  - Upgrading an MDS cluster to 12.2.3+ will result in all active MDS
-    exiting due to feature incompatibilities once an upgraded MDS comes online
-    (even as standby). Operators may ignore the error messages and continue
-    upgrading/restarting or follow this upgrade sequence:
-
-    After upgrading the monitors to Mimic, reduce the number of ranks to 1
-    (`ceph fs set <fs_name> max_mds 1`), wait for all other MDS to deactivate,
-    leaving the one active MDS, stop all standbys, upgrade the single active
-    MDS, then upgrade/start standbys. Finally, restore the previous max_mds.
-
-    !! NOTE: see release notes on snapshots in CephFS if you have ever enabled
-    snapshots on your file system.
-
-    See also: https://tracker.ceph.com/issues/23172
-
-  - Several ``ceph mds ...`` commands have been obsoleted and replaced by
-    equivalent ``ceph fs ...`` commands:
-
-    + ``mds dump`` -> ``fs dump``
-    + ``mds getmap`` -> ``fs dump``
-    + ``mds stop`` -> ``mds deactivate``
-    + ``mds set_max_mds`` -> ``fs set max_mds``
-    + ``mds set`` -> ``fs set``
-    + ``mds cluster_down`` -> ``fs set cluster_down true``
-    + ``mds cluster_up`` -> ``fs set cluster_down false``
-    + ``mds add_data_pool`` -> ``fs add_data_pool``
-    + ``mds remove_data_pool`` -> ``fs rm_data_pool``
-    + ``mds rm_data_pool`` -> ``fs rm_data_pool``
-
-  - New CephFS file system attributes session_timeout and
-    session_autoclose are configurable via ``ceph fs set``. The MDS
-    config options `mds_session_timeout`, `mds_session_autoclose`, and
-    `mds_max_file_size` are now obsolete.
-
-  - As the multiple MDS feature is now standard, it is now enabled by
-    default. ``ceph fs set allow_multimds`` is now deprecated and will be
-    removed in a future release.
-
-  - As the directory fragmentation feature is now standard, it is now
-    enabled by default. ``ceph fs set allow_dirfrags`` is now deprecated and
-    will be removed in a future release.
-
-  - MDS daemons now activate and deactivate based on the value of
-    `max_mds`. Accordingly, ``ceph mds deactivate`` has been deprecated as it
-    is now redundant.
-
-  - Taking a CephFS cluster down is now done by setting the down flag which
-    deactivates all MDS. For example: `ceph fs set cephfs down true`.
-
-  - Preventing standbys from joining as new actives (formerly the now
-    deprecated cluster_down flag) on a file system is now accomplished by
-    setting the joinable flag.  This is useful mostly for testing so that a
-    file system may be quickly brought down and deleted.
-
-  - New CephFS file system attributes session_timeout and session_autoclose
-    are configurable via `ceph fs set`. The MDS config options
-    mds_session_timeout, mds_session_autoclose, and mds_max_file_size are now
-    obsolete.
-
-  - Each mds rank now maintains a table that tracks open files and their
-    ancestor directories. Recovering MDS can quickly get open files' paths,
-    significantly reducing the time of loading inodes for open files. MDS
-    creates the table automatically if it does not exist.
-
-  - CephFS snapshot is now stable and enabled by default on new filesystems.
-    To enable snapshot on existing filesystems, use the command::
-
-      ceph fs set <fs_name> allow_new_snaps
-
-    The on-disk format of snapshot metadata has changed. The old format
-    metadata can not be properly handled in multiple active MDS configuration.
-    To guarantee all snapshot metadata on existing filesystems get updated,
-    perform the sequence of upgrading the MDS cluster strictly.
-
-    See http://docs.ceph.com/docs/mimic/cephfs/upgrading/
-
-    For filesystems that have ever enabled snapshots, the multiple-active MDS
-    feature is disabled by the mimic monitor daemon. This will cause the "restore
-    previous max_mds" step in above URL to fail. To re-enable the feature,
-    either delete all old snapshots or scrub the whole filesystem:
-
-      - ``ceph daemon <mds of rank 0> scrub_path / force recursive repair``
-      - ``ceph daemon <mds of rank 0> scrub_path '~mdsdir' force recursive repair``
-
-  - Support has been added in Mimic for quotas in the Linux kernel client as of v4.17.
-
-    See http://docs.ceph.com/docs/mimic/cephfs/quota/
-
-  - Many fixes have been made to the MDS metadata balancer which distributes
-    load across MDS. It is expected that the automatic balancing should work
-    well for most use-cases. In Luminous, subtree pinning was advised as a
-    manual workaround for poor balancer behavior. This may no longer be
-    necessary so it is recommended to try experimentally disabling pinning as a
-    form of load balancing to see if the built-in balancer adequately works for
-    you. Please report any poor behavior post-upgrade.
-
-  - NFS-Ganesha is an NFS userspace server that can export shares from multiple
-    file systems, including CephFS. Support for this CephFS client has improved
-    significantly in Mimic. In particular, delegations are now supported through
-    the libcephfs library so that Ganesha may issue delegations to its NFS clients
-    allowing for safe write buffering and coherent read caching. Documentation
-    is also now available: http://docs.ceph.com/docs/mimic/cephfs/nfs/
-
-  - MDS uptime is now available in the output of the MDS admin socket ``status`` command.
-
-  - MDS performance counters for client requests now include average latency as well as the count.
-
-
-* *RBD*
-
-  - The RBD C API's `rbd_discard` method now enforces a maximum length of
-    2GB to match the C++ API's `Image::discard` method. This restriction
-    prevents overflow of the result code.
-
-  - The rbd CLI's ``lock list`` JSON and XML output has changed.
-
-  - The rbd CLI's ``showmapped`` JSON and XML output has changed.
-
-  - RBD now optionally supports simplified image clone semantics where
-    non-protected snapshots can be cloned; and snapshots with linked clones
-    can be removed and the space automatically reclaimed once all remaining
-    linked clones are detached. This feature is enabled by default if
-    the OSD "require-min-compat-client" flag is set to mimic or later; or can be
-    overridden via the "rbd_default_clone_format" configuration option.
-
-  - RBD now supports deep copy of images that preserves snapshot history.
-
-* *RGW*
-
-  - The RGW Beast frontend is now declared stable and ready for production use.
-    :ref:`rgw_frontends` for details.
-
-  - Civetweb frontend has been updated to the latest 1.10 release.
-
-  - The S3 API now has support for multi-factor authentication. Refer to
-    :ref:`rgw_mfa` for details.
-
-  - RGW now has a sync plugin to sync to AWS and clouds with S3-like APIs.
-
-* *MGR*
-
-  - The (read-only) Ceph manager dashboard introduced in Ceph Luminous has been
-    replaced with a new implementation, providing a drop-in replacement offering
-    a number of additional management features. To access the new dashboard, you
-    first need to define a username and password and create an SSL certificate.
-    See the :ref:`mgr-dashboard` for a feature overview and installation
-    instructions.
-
-  - The ``ceph-rest-api`` command-line tool (obsoleted by the MGR
-    `restful` module and deprecated since v12.2.5) has been dropped.
-
-    There is a MGR module called `restful` which provides similar functionality
-    via a "pass through" method. See http://docs.ceph.com/docs/master/mgr/restful
-    for details.
-
-  - New command to track throughput and IOPS statistics, also available in
-    ``ceph -s`` and previously in ``ceph -w``. To use this command, enable
-    the ``iostat`` Manager module and invoke it using ``ceph iostat``. See the
-    :ref:`iostat documentation <mgr-iostat-overview>` for details.
-
-* *build/packaging*
-
-  - The ``rcceph`` script (``systemd/ceph`` in the source code tree, shipped as
-    ``/usr/sbin/rcceph`` in the ceph-base package for CentOS and SUSE) has been
-    dropped. This script was used to perform admin operations (start, stop,
-    restart, etc.) on all OSD and/or MON daemons running on a given machine. This
-    functionality is provided by the systemd target units (``ceph-osd.target``,
-    ``ceph-mon.target``, etc.).
-
-  - The python-ceph-compat package is declared deprecated, and will be dropped
-    when all supported distros have completed the move to Python 3. It has
-    already been dropped from those supported distros where Python 3 is
-    standard and Python 2 is optional (currently only SUSE).
-
-  - Ceph codebase has now moved to the C++-17 standard.
-
-  - The Ceph LZ4 compression plugin is now enabled by default, and introduces a
-    new build dependency.
-
-
-Detailed Changelog
-------------------
-
-* arch/arm: set ceph_arch_aarch64_crc32 only if the build host supports crc32cx (`issue#19705 <http://tracker.ceph.com/issues/19705>`_, `pr#17420 <https://github.com/ceph/ceph/pull/17420>`_, Kefu Chai)
-* assert(false)->ceph_abort() (`pr#18072 <https://github.com/ceph/ceph/pull/18072>`_, Li Wang)
-* auth: keep /dev/urandom open for get_random_bytes (`issue#21401 <http://tracker.ceph.com/issues/21401>`_, `pr#17972 <https://github.com/ceph/ceph/pull/17972>`_, Casey Bodley)
-* bluestore: BlueStore::ExtentMap::dup impl (`pr#19719 <https://github.com/ceph/ceph/pull/19719>`_, Shinobu Kinjo)
-* bluestore: bluestore/NVMEDevice: accurate the latency perf counter of queue latency (`pr#17435 <https://github.com/ceph/ceph/pull/17435>`_, Ziye Yang, Pan Liu)
-* bluestore: bluestore/NVMEDevice: convert the legacy config opt related with SPDK (`pr#18502 <https://github.com/ceph/ceph/pull/18502>`_, Ziye Yang)
-* bluestore: bluestore/NVMEDevice: do not deference a dangling pointer (`pr#19067 <https://github.com/ceph/ceph/pull/19067>`_, Kefu Chai)
-* bluestore: bluestore/NVMEDevice: fix the bug in write function (`pr#17086 <https://github.com/ceph/ceph/pull/17086>`_, Ziye Yang, Pan Liu)
-* bluestore: bluestore/NVMeDevice: update NVMeDevice code due to SPDK upgrade (`pr#16927 <https://github.com/ceph/ceph/pull/16927>`_, Ziye Yang)
-* bluestore,build/ops: bluestore,cmake: enable building bluestore without aio (`pr#19017 <https://github.com/ceph/ceph/pull/19017>`_, Kefu Chai)
-* bluestore,build/ops: Build: create a proper WITH_BLUESTORE option (`pr#18357 <https://github.com/ceph/ceph/pull/18357>`_, Alan Somers)
-* bluestore,build/ops: ceph.spec.in,debian/rules: change aio-max-nr to 1048576 (`pr#17894 <https://github.com/ceph/ceph/pull/17894>`_, chenliuzhong)
-* bluestore,build/ops,tests: os: add compile option to build libbluefs.so (`pr#16733 <https://github.com/ceph/ceph/pull/16733>`_, Pan Liu)
-* bluestore,build/ops,tests: test/fio: fix build failure caused by sequencer replacement (`pr#20387 <https://github.com/ceph/ceph/pull/20387>`_, Igor Fedotov)
-* bluestore: ceph-bluestore-tool: better fsck/repair, bluefs-bdev-{expand,sizes} (`pr#17709 <https://github.com/ceph/ceph/pull/17709>`_, Sage Weil)
-* bluestore: ceph-bluestore-tool: check if bdev is empty on 'bluefs-bdev-expand' (`pr#17874 <https://github.com/ceph/ceph/pull/17874>`_, WANG Guoqin)
-* bluestore: ceph-bluestore-tool: link target shouldn't ending with "\n" (`pr#18585 <https://github.com/ceph/ceph/pull/18585>`_, Yao Zongyou)
-* bluestore,common: intarith: get rid of  P2\* and ROUND_UP\* macros (`pr#21085 <https://github.com/ceph/ceph/pull/21085>`_, xie xingguo)
-* bluestore:  comp_min_blob_size init error (`pr#18318 <https://github.com/ceph/ceph/pull/18318>`_, linbing)
-* bluestore: config: Change bluestore_cache_kv_max to type INT64 (`pr#20255 <https://github.com/ceph/ceph/pull/20255>`_, Zhi Zhang)
-* bluestore,core: ceph-bluestore-tool: prime-osd-dir: update symlinks instead of bailing (`pr#18565 <https://github.com/ceph/ceph/pull/18565>`_, Sage Weil)
-* bluestore,core: common/options: bluefs_buffered_io=true by default (`pr#20542 <https://github.com/ceph/ceph/pull/20542>`_, Sage Weil)
-* bluestore,core: os/bluestore: compensate for bad freelistmanager size/blocks metadata (`issue#21089 <http://tracker.ceph.com/issues/21089>`_, `pr#17268 <https://github.com/ceph/ceph/pull/17268>`_, Sage Weil)
-* bluestore,core: os/bluestore: fix data read error injection in bluestore (`pr#19866 <https://github.com/ceph/ceph/pull/19866>`_, Sage Weil)
-* bluestore,core: os/bluestore: kv_max -> kv_min (`pr#20544 <https://github.com/ceph/ceph/pull/20544>`_, Sage Weil)
-* bluestore,core: os/bluestore: switch default allocator to stupid; test both bitmap and stupid in qa (`pr#16906 <https://github.com/ceph/ceph/pull/16906>`_, Sage Weil)
-* bluestore,core: src/bluestore/NVMEDevice: make all read use aio_submit (`pr#17655 <https://github.com/ceph/ceph/pull/17655>`_, Ziye Yang, Pan Liu)
-* bluestore,core,tests: test/unittest_bluefs: check whether rmdir success (`pr#15363 <https://github.com/ceph/ceph/pull/15363>`_, shiqi)
-* bluestore,core: tool: ceph-kvstore-tool doesn't umount BlueStore properly (`issue#21625 <http://tracker.ceph.com/issues/21625>`_, `pr#18083 <https://github.com/ceph/ceph/pull/18083>`_, Chang Liu)
-* bluestore: define default value of LoglevelV only once (3 templates) (`pr#20727 <https://github.com/ceph/ceph/pull/20727>`_, Matt Benjamin)
-* bluestore: drop unused friend class in SharedDriverQueueData (`pr#16894 <https://github.com/ceph/ceph/pull/16894>`_, Pan Liu)
-* bluestore: fix aio_t::rval  type (`issue#23527 <http://tracker.ceph.com/issues/23527>`_, `pr#21136 <https://github.com/ceph/ceph/pull/21136>`_, kungf)
-* bluestore: fix build on armhf (`pr#20951 <https://github.com/ceph/ceph/pull/20951>`_, Kefu Chai)
-* bluestore: fixed compilation error when enable spdk with gcc 4.8.5 (`pr#16945 <https://github.com/ceph/ceph/pull/16945>`_, Ziye Yang, Pan Liu)
-* bluestore: kv/RocksDBStore: extract common code to a new function (`pr#16532 <https://github.com/ceph/ceph/pull/16532>`_, Pan Liu)
-* bluestore/NVMEDevice: code cleanup (`pr#17284 <https://github.com/ceph/ceph/pull/17284>`_, Ziye Yang, Pan Liu)
-* bluestore: os/bluestore: add bluestore_prefer_deferred_size_hdd/ssd to tracked keys (`pr#17459 <https://github.com/ceph/ceph/pull/17459>`_, xie xingguo)
-* bluestore: os/bluestore: add discard method for ssd's performance (`pr#14727 <https://github.com/ceph/ceph/pull/14727>`_, Taeksang Kim)
-* bluestore: os/bluestore: Add lat record of deferred_queued and deferred_aio_wait (`pr#17015 <https://github.com/ceph/ceph/pull/17015>`_, lisali)
-* bluestore: os/bluestore: Add missing __func__ in dout (`pr#17903 <https://github.com/ceph/ceph/pull/17903>`_, lisali)
-* bluestore: os/bluestore: add perf counter for allocator fragmentation (`pr#21377 <https://github.com/ceph/ceph/pull/21377>`_, Igor Fedotov)
-* bluestore: os/bluestore: allocate entire write in one go (`pr#17698 <https://github.com/ceph/ceph/pull/17698>`_, Sage Weil)
-* bluestore: os/bluestore: allow reconstruction of osd data dir from bluestore bdev label (`pr#18256 <https://github.com/ceph/ceph/pull/18256>`_, Sage Weil)
-* bluestore: os/bluestore: alter the allow_eio policy regarding kernel's error list (`issue#23333 <http://tracker.ceph.com/issues/23333>`_, `pr#21306 <https://github.com/ceph/ceph/pull/21306>`_, Radoslaw Zarzynski)
-* bluestore: os/bluestore: avoid excessive ops in _txc_release_alloc (`pr#18854 <https://github.com/ceph/ceph/pull/18854>`_, Igor Fedotov)
-* bluestore: os/bluestore: avoid omit cache for remove-collection (`pr#18785 <https://github.com/ceph/ceph/pull/18785>`_, Jianpeng Ma)
-* bluestore: os/bluestore: avoid overhead of std::function in blob_t (`pr#20294 <https://github.com/ceph/ceph/pull/20294>`_, Radoslaw Zarzynski)
-* bluestore: os/bluestore: avoid unneeded BlobRefing in _do_read() (`pr#19864 <https://github.com/ceph/ceph/pull/19864>`_, Radoslaw Zarzynski)
-* bluestore: os/bluestore: be more verbose when hitting unloaded shard in extent map (`pr#21245 <https://github.com/ceph/ceph/pull/21245>`_, Igor Fedotov)
-* bluestore: os/bluestore/BlueFS: compact log even when sync_metadata sees no work (`pr#17354 <https://github.com/ceph/ceph/pull/17354>`_, Sage Weil)
-* bluestore: os/bluestore/BlueFS: Don't call debug related code under any condition (`pr#17627 <https://github.com/ceph/ceph/pull/17627>`_, Jianpeng Ma)
-* bluestore: os/bluestore/BlueFS: don't need wait for aio when using _sync_write (`pr#16066 <https://github.com/ceph/ceph/pull/16066>`_, Haodong Tang)
-* bluestore: os/bluestore/BlueFS: fix race with log flush during async log compaction (`issue#21878 <http://tracker.ceph.com/issues/21878>`_, `pr#18428 <https://github.com/ceph/ceph/pull/18428>`_, Sage Weil)
-* bluestore: os/bluestore/BlueFS: move release unused extents work in _flush_and_syn_log (`pr#17684 <https://github.com/ceph/ceph/pull/17684>`_, Jianpeng Ma)
-* bluestore: os/bluestore/BlueFS: prevent _compact_log_async reentry (`issue#21250 <http://tracker.ceph.com/issues/21250>`_, `pr#17503 <https://github.com/ceph/ceph/pull/17503>`_, Sage Weil)
-* bluestore: os/bluestore/BlueFS: Reduce unnecessary operations in collect_metadata (`pr#17995 <https://github.com/ceph/ceph/pull/17995>`_, Luo Kexue)
-* bluestore: os/bluestore/BlueFS: sanity check that alloc->allocate() won't return 0 (`pr#18259 <https://github.com/ceph/ceph/pull/18259>`_, xie xingguo)
-* bluestore: os/bluestore/BlueFS: several cleanups (`pr#17966 <https://github.com/ceph/ceph/pull/17966>`_, xie xingguo)
-* bluestore: os/bluestore/bluefs_types: make block_mask 64-bit (`pr#21629 <https://github.com/ceph/ceph/pull/21629>`_, Sage Weil)
-* bluestore: os/bluestore/BlueStore: ASAP wake up _kv_finalize_thread (`pr#18203 <https://github.com/ceph/ceph/pull/18203>`_, Jianpeng Ma)
-* bluestore: os/bluestore/BlueStore: narrow deferred_lock in _deferred_submit_unlock (`pr#17628 <https://github.com/ceph/ceph/pull/17628>`_, Jianpeng Ma)
-* bluestore: os/bluestore: bluestore repair should use interval_set::union_insert (`pr#20900 <https://github.com/ceph/ceph/pull/20900>`_, Igor Fedotov)
-* bluestore: os/bluestore: cleanup around ExtentList, AllocExtent and bluestore_extent_t classes (`pr#20360 <https://github.com/ceph/ceph/pull/20360>`_, Igor Fedotov)
-* bluestore: os/bluestore:  clearer comments, not slower code (`pr#16872 <https://github.com/ceph/ceph/pull/16872>`_, Mark Nelson)
-* bluestore: os/bluestore: correctly check all block devices to decide if journal is_rotational (`issue#23141 <http://tracker.ceph.com/issues/23141>`_, `pr#20602 <https://github.com/ceph/ceph/pull/20602>`_, Greg Farnum)
-* bluestore: os/bluestore: delete redundant header file in KernelDevice.cc (`pr#18631 <https://github.com/ceph/ceph/pull/18631>`_, Jing Li)
-* bluestore: os/bluestore: do not assert if BlueFS rebalance is unable to allocate sufficient space (`pr#18494 <https://github.com/ceph/ceph/pull/18494>`_, Igor Fedotov)
-* bluestore: os/bluestore: do not core dump when BlueRocksEnv gets EEXIST error (`issue#20871 <http://tracker.ceph.com/issues/20871>`_, `pr#17357 <https://github.com/ceph/ceph/pull/17357>`_, liuchang0812)
-* bluestore: os/bluestore: do not core dump when we try to open kvstore twice (`pr#18161 <https://github.com/ceph/ceph/pull/18161>`_, Chang Liu)
-* bluestore: os/bluestore: do not release empty bluefs_extents_reclaiming (`pr#18671 <https://github.com/ceph/ceph/pull/18671>`_, Igor Fedotov)
-* bluestore: os/bluestore: do not segv on kraken upgrade debug print (`issue#20977 <http://tracker.ceph.com/issues/20977>`_, `pr#16992 <https://github.com/ceph/ceph/pull/16992>`_, Sage Weil)
-* bluestore: os/bluestore: don't re-initialize csum-setting for existing blobs (`issue#21175 <http://tracker.ceph.com/issues/21175>`_, `pr#17398 <https://github.com/ceph/ceph/pull/17398>`_, xie xingguo)
-* bluestore: os/bluestore: do SSD discard on mkfs (`pr#20897 <https://github.com/ceph/ceph/pull/20897>`_, Igor Fedotov)
-* bluestore: os/bluestore: drop deferred_submit_lock, fix aio leak (`issue#21171 <http://tracker.ceph.com/issues/21171>`_, `pr#17352 <https://github.com/ceph/ceph/pull/17352>`_, Sage Weil)
-* bluestore: os/bluestore: drop unused function declaration (`pr#18075 <https://github.com/ceph/ceph/pull/18075>`_, Li Wang)
-* bluestore: os/bluestore: drop unused param "what" in apply() (`pr#17251 <https://github.com/ceph/ceph/pull/17251>`_, songweibin)
-* bluestore: os/bluestore: _dump_onode() don't prolongate Onode anymore (`pr#19841 <https://github.com/ceph/ceph/pull/19841>`_, Radoslaw Zarzynski)
-* bluestore: os/bluestore: dynamic CF configuration; put pglog omap in separate CF (`pr#18224 <https://github.com/ceph/ceph/pull/18224>`_, Sage Weil)
-* bluestore: os/bluestore: enlarege aligned_size avoid too many vector(> IOV_MAX) (`issue#21932 <http://tracker.ceph.com/issues/21932>`_, `pr#18828 <https://github.com/ceph/ceph/pull/18828>`_, Jianpeng Ma)
-* bluestore: os/bluestore: ExtentMap::reshard - fix wrong shard length (`pr#17334 <https://github.com/ceph/ceph/pull/17334>`_, chenliuzhong)
-* bluestore: os/bluestore: fail early on very large objects (`issue#20923 <http://tracker.ceph.com/issues/20923>`_, `pr#16924 <https://github.com/ceph/ceph/pull/16924>`_, Sage Weil)
-* bluestore: os/bluestore: fix another aio stall/deadlock (`issue#21470 <http://tracker.ceph.com/issues/21470>`_, `pr#18118 <https://github.com/ceph/ceph/pull/18118>`_, Sage Weil)
-* bluestore: os/bluestore: fix broken cap in _balance_bluefs_freespace() (`pr#21097 <https://github.com/ceph/ceph/pull/21097>`_, Igor Fedotov)
-* bluestore: os/bluestore: fix clone dirty_range again (`issue#20983 <http://tracker.ceph.com/issues/20983>`_, `pr#16994 <https://github.com/ceph/ceph/pull/16994>`_, Sage Weil)
-* bluestore: os/bluestore: fix dirty_shard off-by-one (`pr#16850 <https://github.com/ceph/ceph/pull/16850>`_, Sage Weil)
-* bluestore: os/bluestore: fix exceeding the max IO queue depth in KernelDevice (`issue#23246 <http://tracker.ceph.com/issues/23246>`_, `pr#20996 <https://github.com/ceph/ceph/pull/20996>`_, Radoslaw Zarzynski)
-* bluestore: os/bluestore: fix potential assert when splitting collection (`pr#19519 <https://github.com/ceph/ceph/pull/19519>`_, Igor Fedotov)
-* bluestore: os/bluestore: fix SharedBlob unregistration (`issue#22039 <http://tracker.ceph.com/issues/22039>`_, `pr#18805 <https://github.com/ceph/ceph/pull/18805>`_, Sage Weil)
-* bluestore: os/bluestore: fix some code formatting (`pr#21037 <https://github.com/ceph/ceph/pull/21037>`_, Gu Zhongyan)
-* bluestore: os/bluestore: fix the allocate in bluefs (`pr#19030 <https://github.com/ceph/ceph/pull/19030>`_, tangwenjun)
-* bluestore: os/bluestore: fix the demotion in StupidAllocator::init_rm_free (`pr#20430 <https://github.com/ceph/ceph/pull/20430>`_, Kefu Chai)
-* bluestore: os/bluestore: fix the wrong usage for map_any (`pr#18939 <https://github.com/ceph/ceph/pull/18939>`_, Jianpeng Ma)
-* bluestore: os/bluestore: fix wrong usage for BlueFS::_allocate (`pr#20708 <https://github.com/ceph/ceph/pull/20708>`_, Jianpeng Ma)
-* bluestore: os/bluestore: free the spdk qpair resource correctly in destructor of SharedDriverQueueData (`pr#20929 <https://github.com/ceph/ceph/pull/20929>`_, Jianyu Li)
-* bluestore: os/bluestore: handle small main device properly (`pr#17416 <https://github.com/ceph/ceph/pull/17416>`_, xie xingguo)
-* bluestore: os/bluestore: ignore 0x2000~2000 extent oddity from luminous upgrade (`issue#21408 <http://tracker.ceph.com/issues/21408>`_, `pr#17845 <https://github.com/ceph/ceph/pull/17845>`_, Sage Weil)
-* bluestore: os/bluestore: implement BlueStore repair (`pr#19843 <https://github.com/ceph/ceph/pull/19843>`_, Igor Fedotov)
-* bluestore: os/bluestore: make bluefs behave better near enospc (`pr#18120 <https://github.com/ceph/ceph/pull/18120>`_, Sage Weil)
-* bluestore: os/bluestore: mark derivatives of AioContext as final (`pr#20227 <https://github.com/ceph/ceph/pull/20227>`_, Radoslaw Zarzynski)
-* bluestore: os/bluestore: move aio_callback{,_priv} to base class BlockDevice (`pr#17002 <https://github.com/ceph/ceph/pull/17002>`_, mychoxin)
-* bluestore: os/bluestore: move assert of read/write to base class (`pr#17033 <https://github.com/ceph/ceph/pull/17033>`_, mychoxin)
-* bluestore: os/bluestore: move size and block_size to the base class BlockDevice (`pr#16886 <https://github.com/ceph/ceph/pull/16886>`_, Pan Liu)
-* bluestore: os/bluestore: no need to fsync when failed to write label (`pr#20092 <https://github.com/ceph/ceph/pull/20092>`_, tangwenjun)
-* bluestore: os/bluestore: no trim debug noise if there is no trimming to be done (`pr#20684 <https://github.com/ceph/ceph/pull/20684>`_, Sage Weil)
-* bluestore: os/bluestore/NVMEDevice: change write_bl to bl (`pr#17145 <https://github.com/ceph/ceph/pull/17145>`_, Ziye Yang, Pan Liu)
-* bluestore: os/bluestore/NVMEDevice: fix the nvme queue depth issue (`pr#17200 <https://github.com/ceph/ceph/pull/17200>`_, Ziye Yang, Pan Liu)
-* bluestore: os/bluestore/NVMEDevice: Remove using dpdk thread (`pr#17769 <https://github.com/ceph/ceph/pull/17769>`_, Ziye Yang, Pan Liu)
-* bluestore: os/bluestore: OpSequencer: reduce kv_submitted_waiters if _is_all_kv_submitted() return true (`pr#18622 <https://github.com/ceph/ceph/pull/18622>`_, Jianpeng Ma)
-* bluestore: os/bluestore: optimize _collection_list (`pr#18777 <https://github.com/ceph/ceph/pull/18777>`_, Jianpeng Ma)
-* bluestore: os/bluestore: pass strict flag to bluestore_blob_use_tracker_t::equal() (`pr#15705 <https://github.com/ceph/ceph/pull/15705>`_, xie xingguo)
-* bluestore: os/bluestore: Prealloc memory avoid realloc in list_collection (`pr#18804 <https://github.com/ceph/ceph/pull/18804>`_, Jianpeng Ma)
-* bluestore: os/bluestore: prevent mount if osd_max_object_size >= 4G (`pr#19043 <https://github.com/ceph/ceph/pull/19043>`_, Sage Weil)
-* bluestore: os/bluestore: print aio in batch (`pr#18873 <https://github.com/ceph/ceph/pull/18873>`_, Kefu Chai)
-* bluestore: os/bluestore: print leaked extents to debug output (`pr#17225 <https://github.com/ceph/ceph/pull/17225>`_, Sage Weil)
-* bluestore: os/bluestore: propagate read-EIO to high level callers (`pr#17744 <https://github.com/ceph/ceph/pull/17744>`_, xie xingguo)
-* bluestore: os/bluestore: put cached attrs in correct mempool (`issue#21417 <http://tracker.ceph.com/issues/21417>`_, `pr#18001 <https://github.com/ceph/ceph/pull/18001>`_, Sage Weil)
-* bluestore: os/bluestore: recalc_allocated() when decoding bluefs_fnode_t (`issue#23212 <http://tracker.ceph.com/issues/23212>`_, `pr#20701 <https://github.com/ceph/ceph/pull/20701>`_, Jianpeng Ma, Kefu Chai)
-* bluestore: os/bluestore: reduce meaningless flush (`pr#19027 <https://github.com/ceph/ceph/pull/19027>`_, tangwenjun)
-* bluestore: os/bluestore: refactor FreeListManager to get clearer view on the number (`issue#22535 <http://tracker.ceph.com/issues/22535>`_, `pr#19718 <https://github.com/ceph/ceph/pull/19718>`_, Igor Fedotov)
-* bluestore: os/bluestore: release disk extents in bulky manner (`pr#17913 <https://github.com/ceph/ceph/pull/17913>`_, Radoslaw Zarzynski)
-* bluestore: os/bluestore: remove ineffective BlueFS fnode extent calculation (`pr#18905 <https://github.com/ceph/ceph/pull/18905>`_, Igor Fedotov)
-* bluestore: os/bluestore: remove unused parameters (`pr#18635 <https://github.com/ceph/ceph/pull/18635>`_, Jianpeng Ma)
-* bluestore: os/bluestore: remove unused variable (`pr#21063 <https://github.com/ceph/ceph/pull/21063>`_, Gu Zhongyan)
-* bluestore: os/bluestore: remove useless function submit (`pr#17537 <https://github.com/ceph/ceph/pull/17537>`_, mychoxin)
-* bluestore: os/bluestore: reorder members of bluefs_extent_t for space efficiency (`pr#21034 <https://github.com/ceph/ceph/pull/21034>`_, Radoslaw Zarzynski)
-* bluestore: os/bluestore: replace dout with ldout in StupidAllocator (`pr#17404 <https://github.com/ceph/ceph/pull/17404>`_, Radoslaw Zarzynski)
-* bluestore: os/bluestore: report error and quit correctly when disk error happens (`issue#21263 <http://tracker.ceph.com/issues/21263>`_, `pr#17522 <https://github.com/ceph/ceph/pull/17522>`_, Pan Liu)
-* bluestore: os/bluestore: Revert "os/bluestore: allow multiple DeferredBatches in flight at once" (`issue#20925 <http://tracker.ceph.com/issues/20925>`_, `issue#20295 <http://tracker.ceph.com/issues/20295>`_, `pr#16900 <https://github.com/ceph/ceph/pull/16900>`_, Sage Weil)
-* bluestore: os/bluestore: s/bluefs_total/bluefs_free/ (`pr#21036 <https://github.com/ceph/ceph/pull/21036>`_, xie xingguo)
-* bluestore: os/bluestore: separate finisher for deferred_try_submit (`issue#21207 <http://tracker.ceph.com/issues/21207>`_, `pr#17409 <https://github.com/ceph/ceph/pull/17409>`_, Sage Weil)
-* bluestore: os/bluestore: set bitmap freelist resolution to min_alloc_size (`pr#17610 <https://github.com/ceph/ceph/pull/17610>`_, Sage Weil)
-* bluestore: os/bluestore: shrink aio submit size to pending value (`pr#17588 <https://github.com/ceph/ceph/pull/17588>`_, kungf)
-* bluestore: os/bluestore: silence -Wreturn-type warning (`pr#18286 <https://github.com/ceph/ceph/pull/18286>`_, Kefu Chai)
-* bluestore: os/bluestore: support calculate cost when using spdk (`pr#17091 <https://github.com/ceph/ceph/pull/17091>`_, Ziye Yang, Pan Liu)
-* bluestore: os/bluestore: synchronous on_applied completions (`pr#18196 <https://github.com/ceph/ceph/pull/18196>`_, Sage Weil)
-* bluestore: os/bluestore: trim cache every 50ms (instead of 200ms) (`pr#20498 <https://github.com/ceph/ceph/pull/20498>`_, Sage Weil)
-* bluestore: os/bluestore: update description for bluestore_compression\_[min|max|_blob_size options (`pr#21244 <https://github.com/ceph/ceph/pull/21244>`_, Igor Fedotov)
-* bluestore: os/bluestore: using macro OBJECT_MAX_SIZE to check osd_max_object_size (`pr#19622 <https://github.com/ceph/ceph/pull/19622>`_, Jianpeng Ma)
-* bluestore: osd/bluestore: delete unused variable in KernelDevice (`pr#20857 <https://github.com/ceph/ceph/pull/20857>`_, Leo Zhang)
-* bluestore: osd,os/bluestore: Display current size of osd_max_object_size (`pr#19725 <https://github.com/ceph/ceph/pull/19725>`_, Shinobu Kinjo)
-* bluestore: Revert "os/bluestore: pass strict flag to bluestore_blob_use_tracker_t::equal()" (`issue#21293 <http://tracker.ceph.com/issues/21293>`_, `pr#17569 <https://github.com/ceph/ceph/pull/17569>`_, Sage Weil)
-* bluestore,rgw: rgw,unittest_bit_alloc: silence clang analyzer warning (`pr#17294 <https://github.com/ceph/ceph/pull/17294>`_, Kefu Chai)
-* bluestore,tests: objectstore/store_test: fix lack of flush prior to collection_empty()… (`issue#22409 <http://tracker.ceph.com/issues/22409>`_, `pr#19764 <https://github.com/ceph/ceph/pull/19764>`_, Igor Fedotov)
-* bluestore,tests: Revert "bluestore/fio: Fixed problem with all objects having the same hash (`pr#18352 <https://github.com/ceph/ceph/pull/18352>`_, Radoslaw Zarzynski)
-* bluestore,tools: ceph-bluestore-tool: create out_dir before create full path  of kvdb (`pr#18367 <https://github.com/ceph/ceph/pull/18367>`_, Leo Zhang)
-* bluestore,tools: os/bluestore/bluestore_tool: add log-dump command to dump bluefs's log (`pr#18535 <https://github.com/ceph/ceph/pull/18535>`_, Yang Honggang)
-* build: fix dpdk build error (`pr#18087 <https://github.com/ceph/ceph/pull/18087>`_, chunmei)
-* build mimic-dev1 with gcc 7 (`issue#22438 <http://tracker.ceph.com/issues/22438>`_, `pr#19548 <https://github.com/ceph/ceph/pull/19548>`_, Kefu Chai)
-* build/ops: automake: remove files required by automake (`pr#17937 <https://github.com/ceph/ceph/pull/17937>`_, Kefu Chai)
-* build/ops: blkin: link against lttng-ust-fork (`pr#17673 <https://github.com/ceph/ceph/pull/17673>`_, Mohamad Gebai)
-* build/ops: boost: remove boost submodule (`pr#17405 <https://github.com/ceph/ceph/pull/17405>`_, Kefu Chai)
-* build/ops: build: do_cmake: allow ARGS to be overridden (`pr#19876 <https://github.com/ceph/ceph/pull/19876>`_, Abhishek Lekshmanan)
-* build/ops: build: remove PGMap.cc from libcommon (`pr#18496 <https://github.com/ceph/ceph/pull/18496>`_, Sage Weil)
-* build/ops: ceph-disk activate unlocks bluestore data partition (`issue#20488 <http://tracker.ceph.com/issues/20488>`_, `pr#16357 <https://github.com/ceph/ceph/pull/16357>`_, Felix Winterhalter)
-* build/ops: ceph_disk: allow "no fsid" on activate (`pr#18991 <https://github.com/ceph/ceph/pull/18991>`_, Dan Mick)
-* build/ops,cephfs: ceph-object-corpus: update to fix make check (`pr#21261 <https://github.com/ceph/ceph/pull/21261>`_, Patrick Donnelly)
-* build/ops,cephfs: cmake, test/fs, client: fix build with clang (`pr#20392 <https://github.com/ceph/ceph/pull/20392>`_, Adam C. Emerson)
-* build/ops: ceph.spec: use devtoolset-6-gcc-c++ on aarch64 (`issue#22301 <http://tracker.ceph.com/issues/22301>`_, `pr#19341 <https://github.com/ceph/ceph/pull/19341>`_, Kefu Chai)
-* build/ops: ceph-volume: Require lvm2, move to osd package (`issue#22443 <http://tracker.ceph.com/issues/22443>`_, `pr#19529 <https://github.com/ceph/ceph/pull/19529>`_, Theofilos Mouratidis)
-* build/ops: ceph-volume: tests add tests for the is_mounted utility (`pr#16962 <https://github.com/ceph/ceph/pull/16962>`_, Alfredo Deza)
-* build/ops: change WITH_SYSTEMD default to ON (`pr#20404 <https://github.com/ceph/ceph/pull/20404>`_, Nathan Cutler)
-* build/ops: cmake/BuildBoost: fixes to ready seastar (`pr#20616 <https://github.com/ceph/ceph/pull/20616>`_, Kefu Chai, Casey Bodley)
-* build/ops: cmake,deb: install system units using cmake (`pr#20618 <https://github.com/ceph/ceph/pull/20618>`_, Kefu Chai)
-* build/ops:  cmake: link libcommon with libstdc++ statically if WITH_STATIC_LIBSTDCXX (`issue#22438 <http://tracker.ceph.com/issues/22438>`_, `pr#19515 <https://github.com/ceph/ceph/pull/19515>`_, Kefu Chai)
-* build/ops: cmake,make-dist: bump up boost version to 1.67 (`pr#21572 <https://github.com/ceph/ceph/pull/21572>`_, Kefu Chai)
-* build/ops: cmake,mds: detect std::map::merge() before using it (`pr#21211 <https://github.com/ceph/ceph/pull/21211>`_, Willem Jan Withagen, Kefu Chai)
-* build/ops: cmake/mgr: use Python 3 virtualenv if mgr subinterpreter is Python 3 (`pr#21446 <https://github.com/ceph/ceph/pull/21446>`_, Nathan Cutler)
-* build/ops,common: cmake, common: silence cmake and gcc warnings (`issue#23774 <http://tracker.ceph.com/issues/23774>`_, `pr#21484 <https://github.com/ceph/ceph/pull/21484>`_, Kefu Chai)
-* build/ops: common/time: add time.h for Alpine build (`pr#19863 <https://github.com/ceph/ceph/pull/19863>`_, huanwen ren)
-* build/ops,common: Update C++ standard to 14 and clean up (`pr#19490 <https://github.com/ceph/ceph/pull/19490>`_, Adam C. Emerson)
-* build/ops,core: ceph-crush-location: remove (`pr#19881 <https://github.com/ceph/ceph/pull/19881>`_, Sage Weil)
-* build/ops,core: ceph-volume: do not use --key during mkfs (`issue#22283 <http://tracker.ceph.com/issues/22283>`_, `pr#19276 <https://github.com/ceph/ceph/pull/19276>`_, Kefu Chai, Sage Weil)
-* build/ops,core: /etc/sysconfig/ceph: remove jemalloc option (`issue#20557 <http://tracker.ceph.com/issues/20557>`_, `pr#18487 <https://github.com/ceph/ceph/pull/18487>`_, Sage Weil)
-* build/ops,core: mimic: cmake,common,filestore: silence gcc-8 warnings/errors (`pr#21862 <https://github.com/ceph/ceph/pull/21862>`_, Kefu Chai)
-* build/ops,core: mimic: cmake: do not check for aligned_alloc() anymore (`issue#23653 <http://tracker.ceph.com/issues/23653>`_, `pr#22048 <https://github.com/ceph/ceph/pull/22048>`_, Kefu Chai)
-* build/ops,core: msg/async: update to work with dpdk shipped with spdk v17.10 (`pr#19470 <https://github.com/ceph/ceph/pull/19470>`_, Kefu Chai)
-* build/ops,core: zstd: Upgrade to v1.3.2 (`pr#18407 <https://github.com/ceph/ceph/pull/18407>`_, Adam C. Emerson)
-* build/ops: debian/control: adjust ceph-{osdomap,kvstore,monstore}-tool feature move (`issue#22319 <http://tracker.ceph.com/issues/22319>`_, `pr#19328 <https://github.com/ceph/ceph/pull/19328>`_, Sage Weil)
-* build/ops: debian/control: adjust ceph-{osdomap,kvstore,monstore}-tool feature move (`issue#22319 <http://tracker.ceph.com/issues/22319>`_, `pr#19395 <https://github.com/ceph/ceph/pull/19395>`_, Kefu Chai, Sage Weil)
-* build/ops: debian/control: adjust ceph-{osdomap,kvstore,monstore}-tool feature move (`pr#19356 <https://github.com/ceph/ceph/pull/19356>`_, Kefu Chai)
-* build/ops: debian: fix package relationships after 40caf6a6 (`issue#21762 <http://tracker.ceph.com/issues/21762>`_, `pr#18474 <https://github.com/ceph/ceph/pull/18474>`_, Kefu Chai)
-* build/ops: debian: lock ceph user during purge (`pr#15118 <https://github.com/ceph/ceph/pull/15118>`_, Caleb Boylan)
-* build/ops: debian/rules: no more ChangeLog (`pr#18023 <https://github.com/ceph/ceph/pull/18023>`_, Sage Weil)
-* build/ops: debian/rules: strip ceph-base libraries (`issue#22640 <http://tracker.ceph.com/issues/22640>`_, `pr#19870 <https://github.com/ceph/ceph/pull/19870>`_, Sage Weil)
-* build/ops: do\_{cmake,freebsd}: Don't invoke nproc(1) on FreeBSD (`pr#17949 <https://github.com/ceph/ceph/pull/17949>`_, Alan Somers)
-* build/ops: dpdk: remove redundant dpdk submodule (`pr#18712 <https://github.com/ceph/ceph/pull/18712>`_, chunmei)
-* build/ops: EventKqueue: Clang want realloc return to be typed (`pr#21550 <https://github.com/ceph/ceph/pull/21550>`_, Willem Jan Withagen)
-* build/ops: filestore,rgw: fix types/casts making clang on 32-Bit working (`pr#21055 <https://github.com/ceph/ceph/pull/21055>`_, Daniel Glaser)
-* build/ops: Fix ppc64 support for ceph (`pr#16753 <https://github.com/ceph/ceph/pull/16753>`_, Boris Ranto)
-* build/ops: Fix two dpdk assert happened in dpdk library (`pr#18409 <https://github.com/ceph/ceph/pull/18409>`_, chunmei)
-* build/ops: FreeBSD: add new required packages to be installed (`pr#21349 <https://github.com/ceph/ceph/pull/21349>`_, Willem Jan Withagen)
-* build/ops: githubmap: add some known Ceph reviewers (`pr#17507 <https://github.com/ceph/ceph/pull/17507>`_, Patrick Donnelly)
-* build/ops: .githubmap: Add wjwithagen as a known Ceph reviewer (`pr#17518 <https://github.com/ceph/ceph/pull/17518>`_, Willem Jan Withagen)
-* build/ops: .githubmap: Update (`pr#18230 <https://github.com/ceph/ceph/pull/18230>`_, Sage Weil)
-* build/ops: .gitignore: allow debian .patch files (`pr#17577 <https://github.com/ceph/ceph/pull/17577>`_, Ken Dreyer)
-* build/ops: include: compat.h, fix the return result of pthread_set_name() (`pr#20474 <https://github.com/ceph/ceph/pull/20474>`_, Willem Jan Withagen)
-* build/ops: install-deps: Add support for 'opensuse-tumbleweed' (`pr#21650 <https://github.com/ceph/ceph/pull/21650>`_, Ricardo Marques)
-* build/ops: install-deps.sh: avoid re-installing g++-7 (`pr#19468 <https://github.com/ceph/ceph/pull/19468>`_, Kefu Chai)
-* build/ops: install-deps.sh, cmake: use GCC-7 on xenial also (`pr#19418 <https://github.com/ceph/ceph/pull/19418>`_, Kefu Chai)
-* build/ops: install-deps.sh: install new gcc as the default the right way (`pr#19417 <https://github.com/ceph/ceph/pull/19417>`_, Kefu Chai)
-* build/ops: install-deps.sh: pass --no-recommends to zypper (`issue#22998 <http://tracker.ceph.com/issues/22998>`_, `pr#20434 <https://github.com/ceph/ceph/pull/20434>`_, Nathan Cutler)
-* build/ops: install-deps.sh: set python2 %bcond by environment (`issue#22999 <http://tracker.ceph.com/issues/22999>`_, `pr#20436 <https://github.com/ceph/ceph/pull/20436>`_, Nathan Cutler)
-* build/ops: install-deps.sh: use DTS on centos if GCC is too old (`pr#19398 <https://github.com/ceph/ceph/pull/19398>`_, Kefu Chai)
-* build/ops: install-deps.sh: use tee for writing a file (`pr#19516 <https://github.com/ceph/ceph/pull/19516>`_, Kefu Chai)
-* build/ops: install-deps: use DTS-7 on aarch64 and only download mirrored package indexes (`pr#19645 <https://github.com/ceph/ceph/pull/19645>`_, Kefu Chai, Songbo Wang)
-* build/ops: libmpem: Revert "submodule: make libmpem as a submodule." (`pr#18414 <https://github.com/ceph/ceph/pull/18414>`_, Jianpeng Ma)
-* build/ops: logrotate: add systemd reload in logrotate in case of centos minimal without killall (`pr#16586 <https://github.com/ceph/ceph/pull/16586>`_, Tianshan Qu)
-* build/ops: make-dist,cmake: avoid re-downloading boost (`pr#19124 <https://github.com/ceph/ceph/pull/19124>`_, Kefu Chai)
-* build/ops: make-dist,cmake: move boost tarball location to download.ceph.com (`pr#17980 <https://github.com/ceph/ceph/pull/17980>`_, Sage Weil)
-* build/ops: make-dist,cmake: Try multiple URLs to download boost before failing (`pr#18048 <https://github.com/ceph/ceph/pull/18048>`_, Brad Hubbard)
-* build/ops: make-dist: fall back to python3 (`pr#21127 <https://github.com/ceph/ceph/pull/21127>`_, Nathan Cutler)
-* build/ops,mgr: mgr/dashboard: build tweaks (`pr#20752 <https://github.com/ceph/ceph/pull/20752>`_, John Spray)
-* build/ops,mgr: mgr/dashboard: remove node/npm system installation (`pr#20898 <https://github.com/ceph/ceph/pull/20898>`_, Tiago Melo)
-* build/ops,mgr: packaging: explicit jinja2 dependency for dashboard (`issue#22457 <http://tracker.ceph.com/issues/22457>`_, `pr#19598 <https://github.com/ceph/ceph/pull/19598>`_, John Spray)
-* build/ops,mgr,tests: mgr/dashboard: replace dashboard with dashboard_v2 (`pr#20912 <https://github.com/ceph/ceph/pull/20912>`_, Ricardo Dias)
-* build/ops: mimic: cmake: use javac -h for creating JNI native headers (`issue#24012 <http://tracker.ceph.com/issues/24012>`_, `pr#21824 <https://github.com/ceph/ceph/pull/21824>`_, Kefu Chai)
-* build/ops: mimic: silence various warnings to enable GCC-8 build (`pr#22081 <https://github.com/ceph/ceph/pull/22081>`_, Adam C. Emerson, Kefu Chai)
-* build/ops: mon,osd: do not use crush_device_class file to initalize class for new osds (`pr#19939 <https://github.com/ceph/ceph/pull/19939>`_, Sage Weil)
-* build/ops: mstart.sh: support read CLUSTERS_LIST from env var (`pr#16988 <https://github.com/ceph/ceph/pull/16988>`_, Jiaying Ren)
-* build/ops: os/CMakeLists: fix link errro when enable WITH_PMEM=ON (`pr#20658 <https://github.com/ceph/ceph/pull/20658>`_, Jianpeng Ma)
-* build/ops: osdc,os,osd: fix build on osx (`pr#20029 <https://github.com/ceph/ceph/pull/20029>`_, Kefu Chai)
-* build/ops: python-numpy-devel build dependency for SUSE (`issue#21176 <http://tracker.ceph.com/issues/21176>`_, `pr#17366 <https://github.com/ceph/ceph/pull/17366>`_, Nathan Cutler)
-* build/ops: qa/tests - added for the suites with subset be able to use 'testing' … (`pr#21454 <https://github.com/ceph/ceph/pull/21454>`_, Yuri Weinstein)
-* build/ops,rbd: ceph-dencoder: moved RBD types outside of RGW preprocessor guard (`issue#22321 <http://tracker.ceph.com/issues/22321>`_, `pr#19343 <https://github.com/ceph/ceph/pull/19343>`_, Jason Dillaman)
-* build/ops: rbdmap: fix umount when multiple mounts use the same RBD (`pr#17978 <https://github.com/ceph/ceph/pull/17978>`_, Alexandre Marangone)
-* build/ops: Revert "make-dist: add OBS-specific release suffix on SUSE" (`pr#20813 <https://github.com/ceph/ceph/pull/20813>`_, Nathan Cutler)
-* build/ops,rgw: radosgw: Make compilation with CryptoPP possible (`pr#14955 <https://github.com/ceph/ceph/pull/14955>`_, Adam Kupczyk)
-* build/ops: rocksdb: do not use aligned_alloc (`issue#23653 <http://tracker.ceph.com/issues/23653>`_, `pr#21632 <https://github.com/ceph/ceph/pull/21632>`_, Kefu Chai)
-* build/ops: rpm: adjust ceph-{osdomap,kvstore,monstore}-tool feature move (`issue#22558 <http://tracker.ceph.com/issues/22558>`_, `pr#19777 <https://github.com/ceph/ceph/pull/19777>`_, Kefu Chai)
-* build/ops: rpm: build-depends on "cunit-devel" for suse (`pr#18997 <https://github.com/ceph/ceph/pull/18997>`_, Kefu Chai)
-* build/ops: rpm: conditionalize Python 2 availability to enable Ceph build on Python 3-only system (`pr#20018 <https://github.com/ceph/ceph/pull/20018>`_, Nathan Cutler)
-* build/ops: rpm,debian: Ensure all ceph-disk runtime dependencies are declared for ceph-base (`issue#23657 <http://tracker.ceph.com/issues/23657>`_, `pr#21356 <https://github.com/ceph/ceph/pull/21356>`_, Nathan Cutler)
-* build/ops: rpm,deb: package ceph-kvstore-tool man page (`pr#17387 <https://github.com/ceph/ceph/pull/17387>`_, Sage Weil)
-* build/ops: rpm: drop legacy librbd.so.1 symlink in /usr/lib64/qemu (`pr#17324 <https://github.com/ceph/ceph/pull/17324>`_, Nathan Cutler)
-* build/ops: rpm: fix _defined_if_python2_absent conditional (`pr#20166 <https://github.com/ceph/ceph/pull/20166>`_, Nathan Cutler)
-* build/ops: rpm: fix systemd macros for ceph-volume@.service (`issue#22217 <http://tracker.ceph.com/issues/22217>`_, `pr#19081 <https://github.com/ceph/ceph/pull/19081>`_, Nathan Cutler)
-* build/ops: rpm: move ceph-\*-tool binaries out of ceph-test subpackage (`issue#21762 <http://tracker.ceph.com/issues/21762>`_, `pr#18289 <https://github.com/ceph/ceph/pull/18289>`_, Nathan Cutler)
-* build/ops: rpm: Python 3-only ceph-disk and ceph-volume (`pr#20140 <https://github.com/ceph/ceph/pull/20140>`_, Nathan Cutler)
-* build/ops: rpm: recommend chrony instead of ntp-daemon (`pr#20138 <https://github.com/ceph/ceph/pull/20138>`_, Nathan Cutler)
-* build/ops: rpm: recommend python-influxdb with ceph-mgr (`pr#18511 <https://github.com/ceph/ceph/pull/18511>`_, Nathan Cutler, Tim Serong)
-* build/ops: rpm: Revert "ceph.spec: work around build.opensuse.org" (`pr#21716 <https://github.com/ceph/ceph/pull/21716>`_, Nathan Cutler)
-* build/ops: rpm: rip out rcceph script (`pr#19899 <https://github.com/ceph/ceph/pull/19899>`_, Nathan Cutler)
-* build/ops: rpm: selinux-policy fixes (`pr#19026 <https://github.com/ceph/ceph/pull/19026>`_, Brad Hubbard)
-* build/ops: rpm: set build parallelism based on available memory (`pr#19122 <https://github.com/ceph/ceph/pull/19122>`_, Nathan Cutler, Richard Brown)
-* build/ops: rpm: set permissions 0755 on rbd resource agent (`issue#22362 <http://tracker.ceph.com/issues/22362>`_, `pr#19494 <https://github.com/ceph/ceph/pull/19494>`_, Nathan Cutler)
-* build/ops: run-make-check.sh: fix SUSE support (`issue#22875 <http://tracker.ceph.com/issues/22875>`_, `pr#20234 <https://github.com/ceph/ceph/pull/20234>`_, Nathan Cutler)
-* build/ops: run-make-check.sh: handle Python 2 absence (`issue#23035 <http://tracker.ceph.com/issues/23035>`_, `pr#20480 <https://github.com/ceph/ceph/pull/20480>`_, Nathan Cutler)
-* build/ops: run-make-check.sh: run ulimit without sudo (`pr#17361 <https://github.com/ceph/ceph/pull/17361>`_, yang.wang)
-* build/ops: script/build-integration-branch: print pr url list with titles (`pr#17426 <https://github.com/ceph/ceph/pull/17426>`_, Sage Weil)
-* build/ops: selinux: Allow nvme devices (`issue#19200 <http://tracker.ceph.com/issues/19200>`_, `pr#15597 <https://github.com/ceph/ceph/pull/15597>`_, Boris Ranto)
-* build/ops: setup-virtualenv.sh: do not hardcode python binary (`issue#23437 <http://tracker.ceph.com/issues/23437>`_, `pr#21002 <https://github.com/ceph/ceph/pull/21002>`_, Nathan Cutler)
-* build/ops: spdk: update SPDK to fix the build failure on aarch64 (`pr#20134 <https://github.com/ceph/ceph/pull/20134>`_, Tone Zhang, Kefu Chai)
-* build/ops:  spdk: update SPDK to v17.10 (`pr#19208 <https://github.com/ceph/ceph/pull/19208>`_, Kefu Chai)
-* build/ops: spdk: update submodule to more recent upstream (`pr#20077 <https://github.com/ceph/ceph/pull/20077>`_, Nathan Cutler)
-* build/ops: specs: require of e2fsprogs (`pr#21345 <https://github.com/ceph/ceph/pull/21345>`_, Guillaume Abrioux)
-* build/ops: src/script/build-integration-branch (`pr#17382 <https://github.com/ceph/ceph/pull/17382>`_, Sage Weil)
-* build/ops: src: s/pip --use-wheel/pip/ (`pr#21159 <https://github.com/ceph/ceph/pull/21159>`_, Kefu Chai)
-* build/ops: submodule: make libmpem as a submodule (`pr#17036 <https://github.com/ceph/ceph/pull/17036>`_, Jianpeng Ma)
-* build/ops: sysctl.d: set kernel.pid_max=4194304 (`issue#21929 <http://tracker.ceph.com/issues/21929>`_, `pr#18544 <https://github.com/ceph/ceph/pull/18544>`_, David Disseldorp)
-* build/ops: systemd: rbd-mirror does not start on reboot (`pr#17969 <https://github.com/ceph/ceph/pull/17969>`_, Sébastien Han)
-* build/ops: test: delete asok directories correctly (`pr#21023 <https://github.com/ceph/ceph/pull/21023>`_, Chang Liu)
-* build/ops: test/fio: enable objectstore FIO plugin building without the need to install and build FIO source code (`pr#20535 <https://github.com/ceph/ceph/pull/20535>`_, Igor Fedotov)
-* build/ops,tests: common,test,cmake: various changes to re-enable build on osx (`pr#18888 <https://github.com/ceph/ceph/pull/18888>`_, Kefu Chai)
-* build/ops,tests: qa/tests: Changed rhel7.4 to rhel7.5 (`pr#21336 <https://github.com/ceph/ceph/pull/21336>`_, Yuri Weinstein)
-* build/ops,tests: test/fio: fix fio objectstore plugin building broken by (`pr#20514 <https://github.com/ceph/ceph/pull/20514>`_, Igor Fedotov)
-* build/ops: udev: Fix typo in udev OSD rules file (`pr#18976 <https://github.com/ceph/ceph/pull/18976>`_, Mitch Birti)
-* build/ops: use devtoolset-7 on centos/rhel-7 (`pr#18863 <https://github.com/ceph/ceph/pull/18863>`_, Kefu Chai)
-* cephfs: Client:Fix readdir bug (`pr#18784 <https://github.com/ceph/ceph/pull/18784>`_, dongdong tao)
-* cephfs: Client: setattr should drop "Fs" rather than "As" for mtime and size (`pr#18786 <https://github.com/ceph/ceph/pull/18786>`_, dongdong tao)
-* cephfs,common,rbd: common/common_init: disable ms subsystem log gathering for clients (`issue#21860 <http://tracker.ceph.com/issues/21860>`_, `pr#18418 <https://github.com/ceph/ceph/pull/18418>`_, Jason Dillaman)
-* cephfs,common,rbd: Various fixes for SCA issues (`pr#21708 <https://github.com/ceph/ceph/pull/21708>`_, Danny Al-Gaaf)
-* cephfs,core: mon/OSDMonitor: set FLAG_SELFMANAGED_SNAPS on cephfs snap removal (`issue#23949 <http://tracker.ceph.com/issues/23949>`_, `pr#21756 <https://github.com/ceph/ceph/pull/21756>`_, Sage Weil)
-* cephfs: MDS: add null check before we push_back "onfinish" (`pr#18892 <https://github.com/ceph/ceph/pull/18892>`_, dongdong tao)
-* cephfs: MDS: correct the error msg when init mon client (`pr#18836 <https://github.com/ceph/ceph/pull/18836>`_, dongdong tao)
-* cephfs: MDS: make popular counter decay at proper rate (`pr#18776 <https://github.com/ceph/ceph/pull/18776>`_, Jianyu Li)
-* cephfs: MDS: make rebalancer evaluate the overload state of each mds with the same criterion (`pr#19255 <https://github.com/ceph/ceph/pull/19255>`_, Jianyu Li)
-* cephfs: messages: Initialization of is_primary (`pr#16897 <https://github.com/ceph/ceph/pull/16897>`_, amitkuma)
-* cephfs: messages: Initialization of member variables (`pr#16898 <https://github.com/ceph/ceph/pull/16898>`_, amitkuma)
-* cephfs: mimic: MDSMonitor: clean up use of pending fsmap in uncommitted ops (`issue#23768 <http://tracker.ceph.com/issues/23768>`_, `pr#22005 <https://github.com/ceph/ceph/pull/22005>`_, Patrick Donnelly)
-* cephfs: mon/MDSMonitor: wait for readable OSDMap before sanitizing (`issue#21945 <http://tracker.ceph.com/issues/21945>`_, `pr#18603 <https://github.com/ceph/ceph/pull/18603>`_, Patrick Donnelly)
-* cephfs,mon: mon/MDSMonitor: fix a bug at preprocess_beacon (`pr#17415 <https://github.com/ceph/ceph/pull/17415>`_, wangshuguang)
-* cephfs: osdc/Journaler: use new style options (`pr#17806 <https://github.com/ceph/ceph/pull/17806>`_, Kefu Chai)
-* cephfs: qa: check pool full flags (`issue#22475 <http://tracker.ceph.com/issues/22475>`_, `pr#19588 <https://github.com/ceph/ceph/pull/19588>`_, Patrick Donnelly)
-* cephfs: qa: fix typo in test_full (`issue#23643 <http://tracker.ceph.com/issues/23643>`_, `pr#21334 <https://github.com/ceph/ceph/pull/21334>`_, Patrick Donnelly)
-* cephfs: Revert "ceph_context: re-expand admin_socket metavariables in child process" (`pr#18545 <https://github.com/ceph/ceph/pull/18545>`_, Patrick Donnelly)
-* cephfs,tests: qa/suites/powercycle/osd/whitelist_health: whitelist slow trimming (`pr#17307 <https://github.com/ceph/ceph/pull/17307>`_, Sage Weil)
-* cephfs,tests: qa/workunits/cephtool/test.sh: fix test_mon_mds() (`pr#21579 <https://github.com/ceph/ceph/pull/21579>`_, Kefu Chai)
-* cephfs,tools: mount.fuse.ceph: Fix typo (`pr#19128 <https://github.com/ceph/ceph/pull/19128>`_, Jos Collin)
-* cephfs: vstart_runner: fixes for recent cephfs changes (`pr#19533 <https://github.com/ceph/ceph/pull/19533>`_, Patrick Donnelly)
-* ceph-volume: add ANSIBLE_SSH_RETRIES=5 to functional tests (`pr#20592 <https://github.com/ceph/ceph/pull/20592>`_, Andrew Schoen)
-* ceph-volume add functional tests for simple, rearrange lvm tests (`pr#18882 <https://github.com/ceph/ceph/pull/18882>`_, Alfredo Deza)
-* ceph-volume: Add linesep/newline at end of JSON file when writing (`pr#19458 <https://github.com/ceph/ceph/pull/19458>`_, Wido den Hollander)
-* ceph-volume: adds a --destroy flag to ceph-volume lvm zap (`issue#22653 <http://tracker.ceph.com/issues/22653>`_, `pr#20010 <https://github.com/ceph/ceph/pull/20010>`_, Andrew Schoen)
-* ceph-volume: adds --crush-device-class flag for lvm prepare and create (`pr#19949 <https://github.com/ceph/ceph/pull/19949>`_, Andrew Schoen)
-* ceph-volume: adds custom cluster name support to simple (`pr#20367 <https://github.com/ceph/ceph/pull/20367>`_, Andrew Schoen)
-* ceph-volume: adds functional CI testing (`pr#16919 <https://github.com/ceph/ceph/pull/16919>`_, Andrew Schoen, Alfredo Deza)
-* ceph-volume: adds functional testing for bluestore (`pr#18656 <https://github.com/ceph/ceph/pull/18656>`_, Andrew Schoen)
-* ceph-volume: adds raw device support to 'lvm list' (`issue#23140 <http://tracker.ceph.com/issues/23140>`_, `pr#20620 <https://github.com/ceph/ceph/pull/20620>`_, Andrew Schoen)
-* ceph-volume: adds success messages for lvm prepare/activate/create (`issue#22307 <http://tracker.ceph.com/issues/22307>`_, `pr#19875 <https://github.com/ceph/ceph/pull/19875>`_, Andrew Schoen)
-* ceph-volume: adds support to zap encrypted devices (`issue#22878 <http://tracker.ceph.com/issues/22878>`_, `pr#20537 <https://github.com/ceph/ceph/pull/20537>`_, Andrew Schoen)
-* ceph-volume: adds the ceph-volume lvm zap subcommand (`pr#18513 <https://github.com/ceph/ceph/pull/18513>`_, Andrew Schoen)
-* ceph-volume allow filtering by `uuid`, do not require osd id (`pr#17606 <https://github.com/ceph/ceph/pull/17606>`_, Andrew Schoen, Alfredo Deza)
-* ceph-volume: allow parallel creates (`issue#23757 <http://tracker.ceph.com/issues/23757>`_, `pr#21489 <https://github.com/ceph/ceph/pull/21489>`_, Theofilos Mouratidis)
-* ceph-volume: allow skipping systemd interactions on activate/create (`issue#23678 <http://tracker.ceph.com/issues/23678>`_, `pr#21496 <https://github.com/ceph/ceph/pull/21496>`_, Alfredo Deza)
-* ceph-volume: allow using a device or partition for `lvm --data` (`pr#18924 <https://github.com/ceph/ceph/pull/18924>`_, Alfredo Deza)
-* ceph-volume be resilient to $PATH issues (`pr#20650 <https://github.com/ceph/ceph/pull/20650>`_, Alfredo Deza)
-* ceph-volume consume mount/format options from ceph.conf (`pr#20408 <https://github.com/ceph/ceph/pull/20408>`_, Alfredo Deza)
-* ceph-volume: correctly fallback to bluestore when no objectstore is specified (`pr#19213 <https://github.com/ceph/ceph/pull/19213>`_, Alfredo Deza)
-* ceph-volume correctly normalize mount flags (`pr#20543 <https://github.com/ceph/ceph/pull/20543>`_, Alfredo Deza)
-* ceph-volume: create the ceph-volume and ceph-volume-systemd man pages (`issue#21030 <http://tracker.ceph.com/issues/21030>`_, `pr#17152 <https://github.com/ceph/ceph/pull/17152>`_, Alfredo Deza)
-* ceph-volume: dmcrypt support for lvm (`issue#22619 <http://tracker.ceph.com/issues/22619>`_, `pr#20054 <https://github.com/ceph/ceph/pull/20054>`_, Alfredo Deza)
-* ceph-volume dmcrypt support for simple (`issue#22620 <http://tracker.ceph.com/issues/22620>`_, `pr#20264 <https://github.com/ceph/ceph/pull/20264>`_, Andrew Schoen, Alfredo Deza)
-* ceph-volume/doc: add missing subcommand in examples (`pr#19381 <https://github.com/ceph/ceph/pull/19381>`_, Guillaume Abrioux)
-* ceph-volume: ensure correct --filestore/--bluestore behavior (`pr#18518 <https://github.com/ceph/ceph/pull/18518>`_, Alfredo Deza)
-* ceph-volume  failed ceph-osd --mkfs command doesn't halt the OSD creation process (`issue#23874 <http://tracker.ceph.com/issues/23874>`_, `pr#21685 <https://github.com/ceph/ceph/pull/21685>`_, Alfredo Deza)
-* ceph-volume: fix action plugins path in tests (`pr#20910 <https://github.com/ceph/ceph/pull/20910>`_, Guillaume Abrioux)
-* ceph-volume fix filestore OSD creation after mon-config changes (`issue#23260 <http://tracker.ceph.com/issues/23260>`_, `pr#20787 <https://github.com/ceph/ceph/pull/20787>`_, Alfredo Deza)
-* ceph-volume: fix typo in ceph-volume lvm prepare help (`pr#21196 <https://github.com/ceph/ceph/pull/21196>`_, Jeffrey Zhang)
-* ceph-volume: fix usage of the --osd-id flag (`issue#22642 <http://tracker.ceph.com/issues/22642>`_, `issue#22836 <http://tracker.ceph.com/issues/22836>`_, `pr#20203 <https://github.com/ceph/ceph/pull/20203>`_, Andrew Schoen)
-* ceph-volume Format correctly when vg/lv cannot be used (`issue#22299 <http://tracker.ceph.com/issues/22299>`_, `pr#19285 <https://github.com/ceph/ceph/pull/19285>`_, Alfredo Deza)
-* ceph-volume  handle inline comments in the ceph.conf file (`issue#22297 <http://tracker.ceph.com/issues/22297>`_, `pr#19319 <https://github.com/ceph/ceph/pull/19319>`_, Alfredo Deza)
-* ceph-volume: handle leading whitespace/tabs in ceph.conf (`issue#22280 <http://tracker.ceph.com/issues/22280>`_, `pr#19259 <https://github.com/ceph/ceph/pull/19259>`_, Alfredo Deza)
-* ceph-volume  Implement an 'activate all' to help with dense servers or migrating OSDs (`pr#21130 <https://github.com/ceph/ceph/pull/21130>`_, Alfredo Deza)
-* ceph-volume improve robustness when reloading vms in tests (`pr#21070 <https://github.com/ceph/ceph/pull/21070>`_, Alfredo Deza)
-* ceph-volume: log the current running command for easier debugging (`issue#23004 <http://tracker.ceph.com/issues/23004>`_, `pr#20594 <https://github.com/ceph/ceph/pull/20594>`_, Andrew Schoen)
-* ceph-volume lvm api refactor/move (`pr#18110 <https://github.com/ceph/ceph/pull/18110>`_, Alfredo Deza)
-* ceph-volume lvm list (`pr#18095 <https://github.com/ceph/ceph/pull/18095>`_, Alfredo Deza)
-* ceph-volume lvm.prepare update to use create_osd_path (`pr#18514 <https://github.com/ceph/ceph/pull/18514>`_, Alfredo Deza)
-* ceph-volume: lvm zap will unmount osd paths used by zapped devices (`issue#22876 <http://tracker.ceph.com/issues/22876>`_, `pr#20265 <https://github.com/ceph/ceph/pull/20265>`_, Andrew Schoen)
-* ceph-volume: Nits noticed while studying code (`pr#21455 <https://github.com/ceph/ceph/pull/21455>`_, Dan Mick)
-* ceph-volume Persist non-lv devices for journals (`pr#17403 <https://github.com/ceph/ceph/pull/17403>`_, Alfredo Deza)
-* ceph-volume process the abspath of the executable first (`issue#23259 <http://tracker.ceph.com/issues/23259>`_, `pr#20824 <https://github.com/ceph/ceph/pull/20824>`_, Alfredo Deza)
-* ceph-volume: removed the explicit use of sudo (`issue#22282 <http://tracker.ceph.com/issues/22282>`_, `pr#19363 <https://github.com/ceph/ceph/pull/19363>`_, Andrew Schoen)
-* ceph-volume: remove extra space (`pr#21140 <https://github.com/ceph/ceph/pull/21140>`_, Sébastien Han)
-* ceph-volume rollback on failed OSD prepare/create (`issue#22281 <http://tracker.ceph.com/issues/22281>`_, `pr#19351 <https://github.com/ceph/ceph/pull/19351>`_, Alfredo Deza)
-* ceph-volume should be able to handle multiple LVM (VG/LV) tags (`issue#22305 <http://tracker.ceph.com/issues/22305>`_, `pr#19321 <https://github.com/ceph/ceph/pull/19321>`_, Alfredo Deza)
-* ceph-volume: support GPT and other deployed OSDs (`pr#18823 <https://github.com/ceph/ceph/pull/18823>`_, Alfredo Deza)
-* ceph-volume tests add optional flags for vagrant (`pr#20849 <https://github.com/ceph/ceph/pull/20849>`_, Alfredo Deza)
-* ceph-volume tests alleviate libvirt timeouts when reloading (`issue#23163 <http://tracker.ceph.com/issues/23163>`_, `pr#20718 <https://github.com/ceph/ceph/pull/20718>`_, Alfredo Deza)
-* ceph-volume tests.devices.lvm prepare isn't bluestore specific anymore (`pr#18984 <https://github.com/ceph/ceph/pull/18984>`_, Alfredo Deza)
-* ceph-volume tests remove unused import (`pr#20459 <https://github.com/ceph/ceph/pull/20459>`_, Alfredo Deza)
-* ceph-volume tests use granular env vars for vagrant (`pr#20864 <https://github.com/ceph/ceph/pull/20864>`_, Alfredo Deza)
-* ceph-volume: Try to cast OSD metadata to int while scanning directory (`pr#19477 <https://github.com/ceph/ceph/pull/19477>`_, Wido den Hollander)
-* ceph-volume update man page for prepare/activate flags (`pr#21570 <https://github.com/ceph/ceph/pull/21570>`_, Alfredo Deza)
-* ceph-volume use realpath when checking mounts (`issue#22988 <http://tracker.ceph.com/issues/22988>`_, `pr#20427 <https://github.com/ceph/ceph/pull/20427>`_, Alfredo Deza)
-* ceph-volume: use unique logical volumes (`pr#17207 <https://github.com/ceph/ceph/pull/17207>`_, Alfredo Deza)
-* ceph-volume: Using --readonly for {vg|pv|lv}s commands (`pr#21409 <https://github.com/ceph/ceph/pull/21409>`_, Erwan Velu)
-* ceph-volume: warn on missing ceph.conf file (`issue#22326 <http://tracker.ceph.com/issues/22326>`_, `pr#19347 <https://github.com/ceph/ceph/pull/19347>`_, Alfredo Deza)
-* ceph-volume warn on mix of filestore and bluestore flags (`issue#23003 <http://tracker.ceph.com/issues/23003>`_, `pr#20513 <https://github.com/ceph/ceph/pull/20513>`_, Alfredo Deza)
-* cleanup: Replacing MIN,MAX with std::min,std::max (`pr#18124 <https://github.com/ceph/ceph/pull/18124>`_, Amit Kumar)
-* cli: rados: support for high precision time using stat2 (`issue#21199 <http://tracker.ceph.com/issues/21199>`_, `pr#17395 <https://github.com/ceph/ceph/pull/17395>`_, Abhishek Lekshmanan)
-* cls_acl/_crypto: Add modeline (`pr#19010 <https://github.com/ceph/ceph/pull/19010>`_, Shinobu Kinjo)
-* cmake: add chrono to BOOST_COMPONENTS (`issue#23424 <http://tracker.ceph.com/issues/23424>`_, `pr#20977 <https://github.com/ceph/ceph/pull/20977>`_, Nathan Cutler)
-* cmake: add cython_rbd as a dependency to vstart target (`pr#18382 <https://github.com/ceph/ceph/pull/18382>`_, Ali Maredia)
-* cmake: bail out if GCC version is less than 5.1 (`pr#19344 <https://github.com/ceph/ceph/pull/19344>`_, Kefu Chai)
-* cmake: BuildBoost.cmake: use specified compiler for building boost (`pr#19898 <https://github.com/ceph/ceph/pull/19898>`_, Kefu Chai)
-* cmake: bump target jdk to 1.7 (`issue#23458 <http://tracker.ceph.com/issues/23458>`_, `pr#21082 <https://github.com/ceph/ceph/pull/21082>`_, Shengjing Zhu)
-* cmake: bump up required cmake version to 2.8.12 (`pr#18285 <https://github.com/ceph/ceph/pull/18285>`_, Kefu Chai)
-* cmake: changes of BuildBoost.cmake to ready seastar (`pr#21404 <https://github.com/ceph/ceph/pull/21404>`_, Kefu Chai)
-* cmake: check for aligned_alloc() instead of checking tcmalloc version (`pr#18557 <https://github.com/ceph/ceph/pull/18557>`_, Kefu Chai)
-* cmake: check gcc version not release date for libstdc++ saneness (`pr#18938 <https://github.com/ceph/ceph/pull/18938>`_, Kefu Chai)
-* cmake: check version of boost in src/boost (`pr#19914 <https://github.com/ceph/ceph/pull/19914>`_, Kefu Chai)
-* cmake: cleanups (`pr#18597 <https://github.com/ceph/ceph/pull/18597>`_, Kefu Chai)
-* cmake,common: changes to port part of ceph to osx (`pr#17615 <https://github.com/ceph/ceph/pull/17615>`_, Kefu Chai)
-* cmake: compile nvml as an external project (`pr#17462 <https://github.com/ceph/ceph/pull/17462>`_, Jianpeng Ma)
-* cmake: define HAVE_STDLIB_MAP_SPLICING for both libstdc++ and libc++ (`pr#21284 <https://github.com/ceph/ceph/pull/21284>`_, Kefu Chai)
-* cmake: disable DOWNLOAD_NO_PROGRESS if cmake ver is lower than 3.1 (`pr#20492 <https://github.com/ceph/ceph/pull/20492>`_, Kefu Chai)
-* cmake: disable FAIL_ON_WARNINGS for rocksdb (`pr#19426 <https://github.com/ceph/ceph/pull/19426>`_, Kefu Chai)
-* cmake: disable VTA on options.cc (`pr#17393 <https://github.com/ceph/ceph/pull/17393>`_, Kefu Chai)
-* cmake: do not find bzip2/lz4 for rocksdb (`pr#19963 <https://github.com/ceph/ceph/pull/19963>`_, runsisi)
-* cmake: do not link against librados.a (`pr#18576 <https://github.com/ceph/ceph/pull/18576>`_, Kefu Chai)
-* cmake: do not link against unused or duplicated libraries (`pr#18092 <https://github.com/ceph/ceph/pull/18092>`_, Kefu Chai)
-* cmake: enabled py3 only build (`pr#20064 <https://github.com/ceph/ceph/pull/20064>`_, Kefu Chai)
-* cmake: enable LZ4 by default (`pr#21332 <https://github.com/ceph/ceph/pull/21332>`_, Grant Slater, Casey Bodley)
-* cmake: enable new policies to silence cmake warnings (`pr#21662 <https://github.com/ceph/ceph/pull/21662>`_, Kefu Chai)
-* cmake: fix building without mgr module (`pr#21591 <https://github.com/ceph/ceph/pull/21591>`_, Yuan Zhou)
-* cmake: fix frontend cmake build (`pr#21449 <https://github.com/ceph/ceph/pull/21449>`_, Ricardo Dias)
-* cmake: fix libcephfs-test.jar build failure (`issue#22828 <http://tracker.ceph.com/issues/22828>`_, `pr#20175 <https://github.com/ceph/ceph/pull/20175>`_, Tone Zhang)
-* cmake: fix the include dir for building boost::python (`pr#20324 <https://github.com/ceph/ceph/pull/20324>`_, Kefu Chai)
-* cmake: fix typo in status message (`pr#21464 <https://github.com/ceph/ceph/pull/21464>`_, Lenz Grimmer)
-* cmake: hide symbols import from other libraries in libcls\_\* (`issue#23517 <http://tracker.ceph.com/issues/23517>`_, `pr#21571 <https://github.com/ceph/ceph/pull/21571>`_, Kefu Chai)
-* cmake: identify the possible incompatibility of rocksdb and tcmalloc (`issue#21422 <http://tracker.ceph.com/issues/21422>`_, `pr#17788 <https://github.com/ceph/ceph/pull/17788>`_, Kefu Chai)
-* cmake: in case of bad "ALLOCATOR" selected issue warning (`pr#17422 <https://github.com/ceph/ceph/pull/17422>`_, Adam Kupczyk)
-* cmake: include frontend build in 'all' target (`pr#21466 <https://github.com/ceph/ceph/pull/21466>`_, John Spray)
-* cmake: let "tests" depend on "mgr-dashboard-frontend-build" (`pr#21468 <https://github.com/ceph/ceph/pull/21468>`_, Kefu Chai)
-* cmake: 'make check' builds radosgw and its cls dependencies (`pr#20422 <https://github.com/ceph/ceph/pull/20422>`_, Casey Bodley)
-* cmake: mgr: exclude .gitignore (`pr#19174 <https://github.com/ceph/ceph/pull/19174>`_, Nathan Cutler)
-* cmake/modules/BuildRocksDB.cmake: enable compressions for rocksdb (`issue#24025 <http://tracker.ceph.com/issues/24025>`_, `pr#22183 <https://github.com/ceph/ceph/pull/22183>`_, Kefu Chai)
-* cmake: only create sysctl file on linux (`pr#19029 <https://github.com/ceph/ceph/pull/19029>`_, Kefu Chai)
-* cmake: pass static linkflags to the linker who links libcommon (`pr#19763 <https://github.com/ceph/ceph/pull/19763>`_, Kefu Chai)
-* cmake: s/boost_256/boost_sha256/ (`pr#21573 <https://github.com/ceph/ceph/pull/21573>`_, Kefu Chai)
-* cmake: set supported language the right way (`pr#18216 <https://github.com/ceph/ceph/pull/18216>`_, Kefu Chai)
-* cmake: should use the value of GPERFTOOLS_LIBRARIES as REQUIRED_VARS (`pr#18645 <https://github.com/ceph/ceph/pull/18645>`_, Kefu Chai)
-* cmake: s/sysconf/sysconfig/ (`pr#20631 <https://github.com/ceph/ceph/pull/20631>`_, Kefu Chai)
-* cmake: sync nvml submodule to latest code (`pr#20411 <https://github.com/ceph/ceph/pull/20411>`_, Jianpeng Ma)
-* cmake: System Includes to silence warnings from submodules and libraries! (`pr#18711 <https://github.com/ceph/ceph/pull/18711>`_, Adam C. Emerson)
-* cmake: typo fix when npm is not found (`pr#20801 <https://github.com/ceph/ceph/pull/20801>`_, Abhishek Lekshmanan)
-* cmake: update minimum boost version to 1.66 (`issue#20048 <http://tracker.ceph.com/issues/20048>`_, `issue#22600 <http://tracker.ceph.com/issues/22600>`_, `pr#19808 <https://github.com/ceph/ceph/pull/19808>`_, Casey Bodley)
-* cmake: update the error message for gperftools bug (`pr#17901 <https://github.com/ceph/ceph/pull/17901>`_, Kefu Chai)
-* cmake: warn if libstdc++ older than 5.1.0 is used (`pr#18837 <https://github.com/ceph/ceph/pull/18837>`_, Kefu Chai)
-* cmake: WITH_SPDK=ON by default (`pr#18944 <https://github.com/ceph/ceph/pull/18944>`_, Liu-Chunmei, Kefu Chai, wanjun.lp, Ziye Yang)
-* common: adding line break at end of some cli results (`issue#21019 <http://tracker.ceph.com/issues/21019>`_, `pr#16687 <https://github.com/ceph/ceph/pull/16687>`_, songweibin)
-* common: add line break for "ceph daemon TYPE.ID version" (`pr#17146 <https://github.com/ceph/ceph/pull/17146>`_, Zhu Shangzhong)
-* common: Add metadata with only Ceph version number and release (`pr#21095 <https://github.com/ceph/ceph/pull/21095>`_, Wido den Hollander)
-* common: Add min/max of ms_async_op_threads (`pr#19942 <https://github.com/ceph/ceph/pull/19942>`_, Shinobu Kinjo)
-* common: Add noreturn attribute to silence uninitialized warning (`pr#19348 <https://github.com/ceph/ceph/pull/19348>`_, Adam C. Emerson)
-* common: auth: add err reason for log info in load function (`pr#17256 <https://github.com/ceph/ceph/pull/17256>`_, Luo Kexue)
-* common: bench test fall into dead loop when <seconds>=0 (`pr#16382 <https://github.com/ceph/ceph/pull/16382>`_, PC)
-* common: buffer: avoid changing bufferlist ABI by removing new _mempool field (`issue#21573 <http://tracker.ceph.com/issues/21573>`_, `pr#18408 <https://github.com/ceph/ceph/pull/18408>`_, Sage Weil)
-* common: by default, do not assert on leaks in the shared_cache code (`issue#21737 <http://tracker.ceph.com/issues/21737>`_, `pr#18201 <https://github.com/ceph/ceph/pull/18201>`_, Greg Farnum)
-* common: ceph: add the right bracket to watch-channel argument in the help message (`pr#19698 <https://github.com/ceph/ceph/pull/19698>`_, Chang Liu)
-* common: ceph.in: execv using the same python (`pr#17713 <https://github.com/ceph/ceph/pull/17713>`_, Kefu Chai)
-* common: ceph_release: s/rc/stable/ (`pr#22264 <https://github.com/ceph/ceph/pull/22264>`_, Sage Weil)
-* common: change routines to public access (`pr#20003 <https://github.com/ceph/ceph/pull/20003>`_, Willem Jan Withagen)
-* common: Check this->data.op_size before use (`pr#18816 <https://github.com/ceph/ceph/pull/18816>`_, Amit Kumar)
-* common: cleanup address_helper (`pr#19643 <https://github.com/ceph/ceph/pull/19643>`_, Shinobu Kinjo)
-* common: cmake,common/RWLock: check for libpthread extensions (`pr#19202 <https://github.com/ceph/ceph/pull/19202>`_, Kefu Chai)
-* common:  common: add for_each_substr() for cheap string split (`pr#18798 <https://github.com/ceph/ceph/pull/18798>`_, Casey Bodley)
-* common:  common: add streaming interfaces for json/xml escaping (`pr#19806 <https://github.com/ceph/ceph/pull/19806>`_, Casey Bodley)
-* common: common/admin_socket: validate command json before feeding it to hook (`pr#20437 <https://github.com/ceph/ceph/pull/20437>`_, Kefu Chai)
-* common: common/blkdev: fix build in FreeBSD environment (`pr#19316 <https://github.com/ceph/ceph/pull/19316>`_, Mykola Golub)
-* common: common/buffer: cleanups (`pr#18312 <https://github.com/ceph/ceph/pull/18312>`_, Shinobu Kinjo)
-* common: common/buffer: switch crc cache to single pair instead of map (`pr#18906 <https://github.com/ceph/ceph/pull/18906>`_, Piotr Dałek)
-* common: common/config: add units to options (`issue#22747 <http://tracker.ceph.com/issues/22747>`_, `pr#20419 <https://github.com/ceph/ceph/pull/20419>`_, Kefu Chai)
-* common:  common/config: limit calls to normalize_key_name (`pr#20318 <https://github.com/ceph/ceph/pull/20318>`_, Piotr Dałek)
-* common: common/config: make internal_safe_to_start_threads internal (`pr#18884 <https://github.com/ceph/ceph/pull/18884>`_, Sage Weil)
-* common: common/ConfUtils: check key before actually normalizing (`pr#20370 <https://github.com/ceph/ceph/pull/20370>`_, Piotr Dałek)
-* common: common/dns_resolv.cc: Query for AAAA-record if ms_bind_ipv6 is True (`issue#23078 <http://tracker.ceph.com/issues/23078>`_, `pr#20530 <https://github.com/ceph/ceph/pull/20530>`_, Wido den Hollander)
-* common: common/dns_resolve: fix memory leak (`pr#19649 <https://github.com/ceph/ceph/pull/19649>`_, Yao Zongyou)
-* common: common/event_socket.h: include <errno.h> to use errno (`pr#18351 <https://github.com/ceph/ceph/pull/18351>`_, Kefu Chai)
-* common: common/Formatter: fix string_view usage for {json,xml}_stream_escaper (`issue#23622 <http://tracker.ceph.com/issues/23622>`_, `pr#21317 <https://github.com/ceph/ceph/pull/21317>`_, Sage Weil)
-* common: common/hobject: compare two objects' key directly (`pr#21062 <https://github.com/ceph/ceph/pull/21062>`_, xie xingguo)
-* common: common/hobject: preserve the order of hobject (`pr#21217 <https://github.com/ceph/ceph/pull/21217>`_, Kefu Chai)
-* common: common/ipaddr: Do not select link-local IPv6 addresses (`issue#21813 <http://tracker.ceph.com/issues/21813>`_, `pr#20862 <https://github.com/ceph/ceph/pull/20862>`_, Wido den Hollander)
-* common: common/lockdep: drop hash<pthread_t> specialization (`pr#20574 <https://github.com/ceph/ceph/pull/20574>`_, Kefu Chai)
-* common: common/LogClient: assign seq and queue atomically (`issue#18209 <http://tracker.ceph.com/issues/18209>`_, `pr#16828 <https://github.com/ceph/ceph/pull/16828>`_, Sage Weil)
-* common: common/log: Speed improvement for log (`pr#19100 <https://github.com/ceph/ceph/pull/19100>`_, Adam Kupczyk, Kefu Chai)
-* common: common/OpHistory: move insert/cleanup into separate thread (`pr#20540 <https://github.com/ceph/ceph/pull/20540>`_, Piotr Dałek)
-* common: common/options: drop unused options (`pr#20895 <https://github.com/ceph/ceph/pull/20895>`_, Kefu Chai)
-* common: common/options: long description for log_stderr_prefix (`pr#19869 <https://github.com/ceph/ceph/pull/19869>`_, Sage Weil)
-* common: common/options: pass by reference and use user-literals for size (`pr#18034 <https://github.com/ceph/ceph/pull/18034>`_, Kefu Chai)
-* common: common/options: use user-defined literals for default values (`pr#17180 <https://github.com/ceph/ceph/pull/17180>`_, Kefu Chai)
-* common: common/perf_counters: remove unused parameter (`pr#19805 <https://github.com/ceph/ceph/pull/19805>`_, Kefu Chai)
-* common: common/pick_address.cc: Cleanup (`pr#19707 <https://github.com/ceph/ceph/pull/19707>`_, Shinobu Kinjo)
-* common: common/pick_address: wrong prefix_len in pick_iface() (`pr#20128 <https://github.com/ceph/ceph/pull/20128>`_, Gu Zhongyan)
-* common: common/str_list: s/boost::string_view/std::string_view (`pr#20475 <https://github.com/ceph/ceph/pull/20475>`_, Kefu Chai)
-* common: common/strtol: fix strict_strtoll() so it accepts hex starting with 0x (`pr#21521 <https://github.com/ceph/ceph/pull/21521>`_, Kefu Chai)
-* common: common/strtoll: remove superfluous const modifier (`pr#21560 <https://github.com/ceph/ceph/pull/21560>`_, Jan Fajerski)
-* common: common/throttle: start using 64-bit values (`issue#22539 <http://tracker.ceph.com/issues/22539>`_, `pr#19759 <https://github.com/ceph/ceph/pull/19759>`_, Igor Fedotov)
-* common: common/types: make numbers a bit nicer when displaying space usage (`pr#17126 <https://github.com/ceph/ceph/pull/17126>`_, xie xingguo)
-* common: common/util: do not print error if VERSION_ID is missing (`pr#17787 <https://github.com/ceph/ceph/pull/17787>`_, Kefu Chai)
-* common: compressor: use generate_random_number() for type="random" (`pr#18272 <https://github.com/ceph/ceph/pull/18272>`_, Casey Bodley)
-* common: compressor/zstd: improvements (`pr#18879 <https://github.com/ceph/ceph/pull/18879>`_, Sage Weil)
-* common: compute SimpleLRU's size with contents.size() instead of lru.size() (`issue#22613 <http://tracker.ceph.com/issues/22613>`_, `pr#19813 <https://github.com/ceph/ceph/pull/19813>`_, Xuehan Xu)
-* common: config: expand tilde for ~/.ceph/$cluster.conf (`issue#23215 <http://tracker.ceph.com/issues/23215>`_, `pr#20774 <https://github.com/ceph/ceph/pull/20774>`_, Rishabh Dave)
-* common: config: notify config observers on set_mon_vals() (`pr#21161 <https://github.com/ceph/ceph/pull/21161>`_, Casey Bodley)
-* common: config: Remove _get_val (`pr#18222 <https://github.com/ceph/ceph/pull/18222>`_, Adam C. Emerson)
-* common/config: use with_val() for better performance (`pr#19056 <https://github.com/ceph/ceph/pull/19056>`_, Adam C. Emerson)
-* common: consolidate spinlocks (`pr#15816 <https://github.com/ceph/ceph/pull/15816>`_, Jesse Williamson)
-* common,core: common, osd: various cleanups (`pr#18149 <https://github.com/ceph/ceph/pull/18149>`_, Kefu Chai)
-* common,core: common/pick_address: add {public,cluster}_network_interface option (`pr#18028 <https://github.com/ceph/ceph/pull/18028>`_, Sage Weil)
-* common,core: common/Throttle: Clean up (`pr#16618 <https://github.com/ceph/ceph/pull/16618>`_, Adam C. Emerson)
-* common,core: fix broken use of streamstream::rdbuf() (`issue#22715 <http://tracker.ceph.com/issues/22715>`_, `pr#19998 <https://github.com/ceph/ceph/pull/19998>`_, Sage Weil)
-* common,core: include/ceph_features: deprecate a bunch of features (`pr#18546 <https://github.com/ceph/ceph/pull/18546>`_, Sage Weil)
-* common,core: include,messages,rbd: Initialize counter,group_pool (`pr#17774 <https://github.com/ceph/ceph/pull/17774>`_, Amit Kumar)
-* common,core: options: Do not use linked lists of pointers! (`pr#17984 <https://github.com/ceph/ceph/pull/17984>`_, Adam C. Emerson)
-* common,core: osdc/Objecter: take budgets across a LingerOp instead of on child Ops (`issue#22882 <http://tracker.ceph.com/issues/22882>`_, `pr#20519 <https://github.com/ceph/ceph/pull/20519>`_, Greg Farnum)
-* common,core: osd/OpRequest: reduce overhead when disabling tracking (`pr#18470 <https://github.com/ceph/ceph/pull/18470>`_, Haomai Wang)
-* common,core: rados: Prefer templates to macros (`pr#19913 <https://github.com/ceph/ceph/pull/19913>`_, Adam C. Emerson)
-* common,core,rbd,rgw: common,osd,rgw: Fixes for issues found during SCA (`pr#21419 <https://github.com/ceph/ceph/pull/21419>`_, Danny Al-Gaaf)
-* common,core,rbd,tests,tools: common,mds,mgr,mon,osd: store event only if it's added (`pr#16312 <https://github.com/ceph/ceph/pull/16312>`_, Kefu Chai)
-* common,core: Revert "msg/async/AsyncConnection: unregister connection when racing happened" (`issue#22231 <http://tracker.ceph.com/issues/22231>`_, `pr#19586 <https://github.com/ceph/ceph/pull/19586>`_, Sage Weil)
-* common,core: Revert "osd/OSDMap: allow bidirectional swap of pg-upmap-items" (`issue#21410 <http://tracker.ceph.com/issues/21410>`_, `pr#17760 <https://github.com/ceph/ceph/pull/17760>`_, Sage Weil)
-* common: Coverity and SCA fixes (`pr#17431 <https://github.com/ceph/ceph/pull/17431>`_, Danny Al-Gaaf)
-* common/crc/aarch64: Added cpu feature pmull and make aarch64 specific… (`pr#22184 <https://github.com/ceph/ceph/pull/22184>`_, Adam Kupczyk)
-* common: crush/CrushWrapper: fix out of bounds access (`issue#20926 <http://tracker.ceph.com/issues/20926>`_, `pr#16869 <https://github.com/ceph/ceph/pull/16869>`_, Sage Weil)
-* common: crypto: remove cryptopp library (`pr#20015 <https://github.com/ceph/ceph/pull/20015>`_, Casey Bodley)
-* common: denc cleanups and other fixes (`pr#19877 <https://github.com/ceph/ceph/pull/19877>`_, Adam C. Emerson)
-* common: denc: support enum with underlying type (`pr#18701 <https://github.com/ceph/ceph/pull/18701>`_, Kefu Chai)
-* common: Destroy attr of RWLock after initialized (`pr#17103 <https://github.com/ceph/ceph/pull/17103>`_, Wen Zhang)
-* common: dmclock: update mClockPriorityQueue with changes in subtree (`pr#20992 <https://github.com/ceph/ceph/pull/20992>`_, Casey Bodley)
-* common: dout: DoutPrefixProvider operates directly on stream (`pr#21608 <https://github.com/ceph/ceph/pull/21608>`_, Casey Bodley)
-* common: drop namespace using directives for std (`pr#19159 <https://github.com/ceph/ceph/pull/19159>`_, Shinobu Kinjo)
-* common: drop unused variables "bluestore_csum\_\*_block" in opts (`pr#17394 <https://github.com/ceph/ceph/pull/17394>`_, songweibin)
-* common: encoding: reset optional<> if it is uninitialized (`pr#17599 <https://github.com/ceph/ceph/pull/17599>`_, Kefu Chai)
-* common: Extends random.h: numeric types relaxed to compatible types (with (`pr#20670 <https://github.com/ceph/ceph/pull/20670>`_, Jesse Williamson)
-* common: fix BoundedKeyCounter const_pointer_iterator (`issue#22139 <http://tracker.ceph.com/issues/22139>`_, `pr#18953 <https://github.com/ceph/ceph/pull/18953>`_, Casey Bodley)
-* common: fix daemon abnormal exit at parsing invalid arguments (`issue#21365 <http://tracker.ceph.com/issues/21365>`_, `issue#21338 <http://tracker.ceph.com/issues/21338>`_, `pr#17664 <https://github.com/ceph/ceph/pull/17664>`_, Yan Jun)
-* common: fix potential memory leak in HTMLFormatter (`pr#20699 <https://github.com/ceph/ceph/pull/20699>`_, Yao Zongyou)
-* common: fix typo deamon in comments (`pr#17687 <https://github.com/ceph/ceph/pull/17687>`_, yonghengdexin735)
-* common: fix typo in options.cc (`pr#20549 <https://github.com/ceph/ceph/pull/20549>`_, songweibin)
-* common: FreeBSD wants the correct struct selection for ipv6 (`issue#21813 <http://tracker.ceph.com/issues/21813>`_, `pr#21143 <https://github.com/ceph/ceph/pull/21143>`_, Willem Jan Withagen)
-* common: global: output usage on -h, --help, or no args before contacting mons (`pr#20812 <https://github.com/ceph/ceph/pull/20812>`_, Sage Weil)
-* common: hint the main branch of dout() accordingly to default verbosity (`pr#21259 <https://github.com/ceph/ceph/pull/21259>`_, Radoslaw Zarzynski)
-* common: implement random number generator (following N3551) (`issue#18873 <http://tracker.ceph.com/issues/18873>`_, `pr#15341 <https://github.com/ceph/ceph/pull/15341>`_, Jesse Williamson)
-* common: Improving message sent to user when getting signals (`issue#23320 <http://tracker.ceph.com/issues/23320>`_, `pr#21000 <https://github.com/ceph/ceph/pull/21000>`_, Erwan Velu)
-* common: include/encoding: fix compat version error message (`pr#19660 <https://github.com/ceph/ceph/pull/19660>`_, Xinying Song)
-* common: include/interval_set: parameterize by map type and kill btree_interval_set.h (`pr#18611 <https://github.com/ceph/ceph/pull/18611>`_, Sage Weil)
-* common: include/rados: fix typo in librados.h (`pr#17988 <https://github.com/ceph/ceph/pull/17988>`_, wumingqiao)
-* common: include: Remove unused header, ciso646 (`pr#18320 <https://github.com/ceph/ceph/pull/18320>`_, Shinobu Kinjo)
-* common: include/types: format decimal numbers with decimal factor (`issue#22095 <http://tracker.ceph.com/issues/22095>`_, `pr#19117 <https://github.com/ceph/ceph/pull/19117>`_, Jan Fajerski)
-* common: include: xlist: Fix Clang error for missing string (`pr#19367 <https://github.com/ceph/ceph/pull/19367>`_, Willem Jan Withagen)
-* common: interval_set: kill subset_of() (`pr#21108 <https://github.com/ceph/ceph/pull/21108>`_, xie xingguo)
-* common: interval_set: optimize intersect_of insert operations (`issue#21229 <http://tracker.ceph.com/issues/21229>`_, `pr#17265 <https://github.com/ceph/ceph/pull/17265>`_, Zac Medico)
-* common: introduce md_config_cacher_t (`pr#20320 <https://github.com/ceph/ceph/pull/20320>`_, Radoslaw Zarzynski)
-* common: kick off mimic (`pr#16993 <https://github.com/ceph/ceph/pull/16993>`_, Sage Weil)
-* common: lockdep fixes (`issue#20988 <http://tracker.ceph.com/issues/20988>`_, `pr#17738 <https://github.com/ceph/ceph/pull/17738>`_, Jeff Layton)
-* common:  log: clear thread-local stream's ios flags on reuse (`pr#20174 <https://github.com/ceph/ceph/pull/20174>`_, Casey Bodley)
-* common: logically dead code inside shunique_lock.h (`pr#17341 <https://github.com/ceph/ceph/pull/17341>`_, Amit Kumar)
-* common: make ceph_clock_now() inlineable (`pr#20443 <https://github.com/ceph/ceph/pull/20443>`_, Radoslaw Zarzynski)
-* common: Make code to invoke assert() smaller (`pr#20445 <https://github.com/ceph/ceph/pull/20445>`_, Adam Kupczyk)
-* common: make some message informative, instead of error (`pr#16594 <https://github.com/ceph/ceph/pull/16594>`_, Willem Jan Withagen)
-* common: mark events of TrackedOp outside its constructor (`issue#22608 <http://tracker.ceph.com/issues/22608>`_, `pr#19828 <https://github.com/ceph/ceph/pull/19828>`_, Xuehan Xu)
-* common: mgr/dashboard_v2: Fix test_cluster_configuration test (`issue#23265 <http://tracker.ceph.com/issues/23265>`_, `pr#20782 <https://github.com/ceph/ceph/pull/20782>`_, Sebastian Wagner)
-* common: mimic: include/types: space between number and units (`pr#22107 <https://github.com/ceph/ceph/pull/22107>`_, Sage Weil)
-* common,mon: crush,mon: fix weight-set vs crush device classes (`issue#20939 <http://tracker.ceph.com/issues/20939>`_, `pr#16883 <https://github.com/ceph/ceph/pull/16883>`_, Sage Weil)
-* common,mon,osd,pybind: silence warning and remove executable mode bit (`pr#17512 <https://github.com/ceph/ceph/pull/17512>`_, Kefu Chai)
-* common: msg/async/AsyncConnection: less noisy debug (`pr#20600 <https://github.com/ceph/ceph/pull/20600>`_, Sage Weil)
-* common: msg/async: execute on core specified by core_id not its index (`pr#20659 <https://github.com/ceph/ceph/pull/20659>`_, Kefu Chai)
-* common: msg/msg_types: fix the entity_addr_t's decoder (`pr#17699 <https://github.com/ceph/ceph/pull/17699>`_, Kefu Chai)
-* common: msg/simple: s/ceph::size/std::size/ (`pr#19896 <https://github.com/ceph/ceph/pull/19896>`_, Kefu Chai)
-* common/options.cc: cleanup readable literals for default sizes (`pr#18425 <https://github.com/ceph/ceph/pull/18425>`_, Enming Zhang)
-* common/options.cc: Set Filestore rocksdb compaction readahead option (`issue#21505 <http://tracker.ceph.com/issues/21505>`_, `pr#17900 <https://github.com/ceph/ceph/pull/17900>`_, Mark Nelson)
-* common: OpTracker doesn't visit TrackedOp when nref == 0 (`issue#24037 <http://tracker.ceph.com/issues/24037>`_, `pr#22160 <https://github.com/ceph/ceph/pull/22160>`_, Radoslaw Zarzynski)
-* common: osdc/Objecter: fix warning (`pr#21757 <https://github.com/ceph/ceph/pull/21757>`_, Sage Weil)
-* common: osdc/Objecter: record correctly value for l_osdc_op_send_bytes (`issue#21982 <http://tracker.ceph.com/issues/21982>`_, `pr#18810 <https://github.com/ceph/ceph/pull/18810>`_, Jianpeng Ma)
-* common: osd/PrimaryLogPG: send requests to primary on cache miss (`issue#20919 <http://tracker.ceph.com/issues/20919>`_, `pr#16884 <https://github.com/ceph/ceph/pull/16884>`_, Sage Weil)
-* common: osd_types: define max in eversion_t::max() to static (`pr#17453 <https://github.com/ceph/ceph/pull/17453>`_, yang.wang)
-* common,os: initialize commit_data,cmount,iocb (`pr#17766 <https://github.com/ceph/ceph/pull/17766>`_, Amit Kumar)
-* common: posix_fallocate on ZFS returns EINVAL (`pr#20398 <https://github.com/ceph/ceph/pull/20398>`_, Willem Jan Withagen)
-* common: rados: clean up rados_getxattrs() and rados_striper_getxattrs() (`pr#20259 <https://github.com/ceph/ceph/pull/20259>`_, Gu Zhongyan)
-* common:  RAII-styled mechanism for updating PerfCounters (`pr#19149 <https://github.com/ceph/ceph/pull/19149>`_, Radoslaw Zarzynski)
-* common: random: revert change from boost::optional to std::optional (`issue#23778 <http://tracker.ceph.com/issues/23778>`_, `pr#21567 <https://github.com/ceph/ceph/pull/21567>`_, Casey Bodley)
-* common: Remove ceph_clock_gettime, extern keyword (`pr#19353 <https://github.com/ceph/ceph/pull/19353>`_, Shinobu Kinjo)
-* common: retry_sys_call no need take address of a function pointer (`pr#21281 <https://github.com/ceph/ceph/pull/21281>`_, Leo Zhang)
-* common: Revert "common/config: return const reference instead of a copy" (`pr#18934 <https://github.com/ceph/ceph/pull/18934>`_, Kefu Chai)
-* common: Revert "core: hint the dout()'s message crafting as a cold code." (`issue#23169 <http://tracker.ceph.com/issues/23169>`_, `pr#20636 <https://github.com/ceph/ceph/pull/20636>`_, Kefu Chai)
-* common,rgw: rgw,common,rbd: s/boost::regex/std::regex/ (`pr#19393 <https://github.com/ceph/ceph/pull/19393>`_, Kefu Chai)
-* common,rgw: rgw,common: remove already included header files (`pr#19390 <https://github.com/ceph/ceph/pull/19390>`_, Yao Zongyou)
-* common: silence jenkins's buiding warning in obj_bencher.cc (`pr#17272 <https://github.com/ceph/ceph/pull/17272>`_, Luo Kexue)
-* common: src/common: update some ms\_\* options to be more consistent (`pr#20652 <https://github.com/ceph/ceph/pull/20652>`_, shangfufei)
-* common: src/msg/async/rdma: decrease cpu usage by rdtsc instruction (`pr#16965 <https://github.com/ceph/ceph/pull/16965>`_, Jin Cai)
-* common: Static Pointer (`pr#19079 <https://github.com/ceph/ceph/pull/19079>`_, Adam C. Emerson)
-* common: strict_strtol INT_MAX and INT_MIN is valid (`pr#18574 <https://github.com/ceph/ceph/pull/18574>`_, Shasha Lu)
-* common: s/unique_lock/lock_guard/, if manual lock/unlock are not necessary (`pr#19770 <https://github.com/ceph/ceph/pull/19770>`_, Shinobu Kinjo)
-* common: Switch singletons to use immobile_any and cleanups (`pr#20273 <https://github.com/ceph/ceph/pull/20273>`_, Adam C. Emerson)
-* common: test: fix unittest memory leak to silence valgrind (`pr#19654 <https://github.com/ceph/ceph/pull/19654>`_, Yao Zongyou)
-* common,tests: test/common: unittest_mclock_priority_queue builds with "make" command (`pr#17582 <https://github.com/ceph/ceph/pull/17582>`_, J. Eric Ivancich)
-* common,tests: test/librados: create unique lock names (`issue#20798 <http://tracker.ceph.com/issues/20798>`_, `pr#16953 <https://github.com/ceph/ceph/pull/16953>`_, Neha Ojha)
-* common: tools/crushtool: skip device id if no name exists (`issue#22117 <http://tracker.ceph.com/issues/22117>`_, `pr#18901 <https://github.com/ceph/ceph/pull/18901>`_, Jan Fajerski)
-* common: use mono clock for HeartbeatMap (`pr#17827 <https://github.com/ceph/ceph/pull/17827>`_, Xinze Chi, Kefu Chai)
-* common: use move instead of copy in build_options() (`pr#18003 <https://github.com/ceph/ceph/pull/18003>`_, Casey Bodley)
-* common: utime: fix __32u sec time overflow (`pr#21113 <https://github.com/ceph/ceph/pull/21113>`_, kungf)
-* compressor: add zstd back (`pr#21106 <https://github.com/ceph/ceph/pull/21106>`_, Kefu Chai)
-* compressor: conditionalize on HAVE_LZ4 (`pr#17059 <https://github.com/ceph/ceph/pull/17059>`_, Kefu Chai)
-* compressor: kill AsyncCompressor which is broken (`pr#18472 <https://github.com/ceph/ceph/pull/18472>`_, Haomai Wang)
-* core: blkin: Fix unconditional tracing in OSD (`pr#19156 <https://github.com/ceph/ceph/pull/19156>`_, Yingxin)
-* core: ceph-debug-docker.sh: add ceph-osd-dbg package (`pr#17947 <https://github.com/ceph/ceph/pull/17947>`_, Patrick Donnelly)
-* core: ceph.in: Add blocking mode for scrub and deep-scrub (`pr#19793 <https://github.com/ceph/ceph/pull/19793>`_, Brad Hubbard)
-* core: ceph.in: do not panic at control+d in interactive mode (`pr#18374 <https://github.com/ceph/ceph/pull/18374>`_, Kefu Chai)
-* core: ceph.in: print all matched commands if arg missing (`issue#22344 <http://tracker.ceph.com/issues/22344>`_, `pr#19547 <https://github.com/ceph/ceph/pull/19547>`_, Kefu Chai)
-* core: ceph.in: use a different variable for holding thrown exception (`pr#20663 <https://github.com/ceph/ceph/pull/20663>`_, Kefu Chai)
-* core: ceph-kvstore-tool: copy to different store type and cleanup properly (`pr#18029 <https://github.com/ceph/ceph/pull/18029>`_, Josh Durgin)
-* core: ceph-mgr: exit after usage (`issue#23482 <http://tracker.ceph.com/issues/23482>`_, `pr#21401 <https://github.com/ceph/ceph/pull/21401>`_, Sage Weil)
-* core: ceph_osd.cc: Drop legacy or redundant code (`pr#18718 <https://github.com/ceph/ceph/pull/18718>`_, Shinobu Kinjo)
-* core: ceph-osd: some flags are not documented in the help output (`issue#20057 <http://tracker.ceph.com/issues/20057>`_, `pr#15565 <https://github.com/ceph/ceph/pull/15565>`_, Yanhu Cao)
-* core: ceph: print output of "status" as string not as bytes (`pr#21297 <https://github.com/ceph/ceph/pull/21297>`_, Kefu Chai)
-* core: ceph-rest-api: when port=0 use the DEFAULT_PORT instead (`pr#17443 <https://github.com/ceph/ceph/pull/17443>`_, You Ji)
-* core: ceph_test_objectstore: disable filestore_fiemap for tests (`issue#21880 <http://tracker.ceph.com/issues/21880>`_, `pr#18452 <https://github.com/ceph/ceph/pull/18452>`_, Sage Weil)
-* core: ceph_test_objectstore: do not change model for 0-length zero (`issue#21712 <http://tracker.ceph.com/issues/21712>`_, `pr#18519 <https://github.com/ceph/ceph/pull/18519>`_, Sage Weil)
-* core: ceph_test_rados_api_aio: fix race with full pool and osdmap (`issue#23916 <http://tracker.ceph.com/issues/23916>`_, `issue#23917 <http://tracker.ceph.com/issues/23917>`_, `pr#21709 <https://github.com/ceph/ceph/pull/21709>`_, Sage Weil)
-* core: ceph_test_rados_api_tier: add ListSnap test (`pr#17706 <https://github.com/ceph/ceph/pull/17706>`_, Xuehan Xu)
-* core: client,osd,test: Initialize fuse_req_key,snap,who,seq (`pr#17772 <https://github.com/ceph/ceph/pull/17772>`_, Amit Kumar)
-* core: common/admin_socket: various cleanups (`pr#20274 <https://github.com/ceph/ceph/pull/20274>`_, Adam C. Emerson)
-* core: common/config: cleanup remove some unused macros (`pr#19599 <https://github.com/ceph/ceph/pull/19599>`_, Yao Zongyou)
-* core: common,mds,osd: Explicitly delete copy ctor if noncopyable (`pr#19465 <https://github.com/ceph/ceph/pull/19465>`_, Shinobu Kinjo)
-* core: common/options: enable multiple rocksdb compaction threads for filestore (`pr#18232 <https://github.com/ceph/ceph/pull/18232>`_, Josh Durgin)
-* core: common, osd: duplicated "start" event in OpTracker, improve OpTracker::dump_ops (`pr#21119 <https://github.com/ceph/ceph/pull/21119>`_, Chang Liu)
-* core: compressor: Add Brotli Compressor (`pr#19549 <https://github.com/ceph/ceph/pull/19549>`_, BI SHUN KE)
-* core: config: lower default omap entries recovered at once (`issue#21897 <http://tracker.ceph.com/issues/21897>`_, `pr#19910 <https://github.com/ceph/ceph/pull/19910>`_, Josh Durgin)
-* core:  crush/CrushWrapper: fix potential invalid use of iterator (`pr#21325 <https://github.com/ceph/ceph/pull/21325>`_, xie xingguo)
-* core: dmclock: Delivery of the dmclock delta, rho and phase parameter + Enabling the client service tracker (`pr#16369 <https://github.com/ceph/ceph/pull/16369>`_, Byungsu Park, Taewoong Kim)
-* core: erasure-code: refactor the interfaces to hide internals from public (`pr#18683 <https://github.com/ceph/ceph/pull/18683>`_, Kefu Chai)
-* core: erasure-code: use jerasure_free_schedule to properly free a schedule (`pr#19650 <https://github.com/ceph/ceph/pull/19650>`_, Yao Zongyou)
-* core: erasure-code: use std::count() instead (`pr#19428 <https://github.com/ceph/ceph/pull/19428>`_, Kefu Chai)
-* core: etc/default/ceph: remove jemalloc option (`issue#20557 <http://tracker.ceph.com/issues/20557>`_, `pr#18486 <https://github.com/ceph/ceph/pull/18486>`_, Sage Weil)
-* core: filestore: include <linux/falloc.h> (`pr#20415 <https://github.com/ceph/ceph/pull/20415>`_, wumingqiao)
-* core: Fix a dead lock when doing rdma performance test by fio (`pr#17016 <https://github.com/ceph/ceph/pull/17016>`_, Wang Chuanhong)
-* core: Fix asserts caused by DNE pgs left behind after lots of OSD restarts (`issue#21833 <http://tracker.ceph.com/issues/21833>`_, `pr#20571 <https://github.com/ceph/ceph/pull/20571>`_, David Zafman)
-* core: include: kill MIN and MAX macros (`pr#20886 <https://github.com/ceph/ceph/pull/20886>`_, Sage Weil)
-* core: interval_set: optimize intersection_of (`pr#17088 <https://github.com/ceph/ceph/pull/17088>`_, Zac Medico)
-* core: kv/KeyValueDB: add column family (`pr#18049 <https://github.com/ceph/ceph/pull/18049>`_, Jianjian Huo, Adam C. Emerson, Sage Weil)
-* core: kv/RocksDB: get index and filter blocks memory usage (`pr#19934 <https://github.com/ceph/ceph/pull/19934>`_, Zhi Zhang)
-* core: kv/RocksDBStore: fix rocksdb error when block cache is disabled (`issue#23816 <http://tracker.ceph.com/issues/23816>`_, `pr#21583 <https://github.com/ceph/ceph/pull/21583>`_, Yang Honggang)
-* core:  librados: add OPERATION_ORDERSNAP flag and yet another aio_operate method (`pr#20343 <https://github.com/ceph/ceph/pull/20343>`_, Mykola Golub)
-* core: librados.h:  add LIBRADOS_SUPPORTS_APP_METADATA (`pr#16542 <https://github.com/ceph/ceph/pull/16542>`_, Matt Benjamin)
-* core: libradosstriper: fix the function declaration of rados_striper_trunc (`pr#20301 <https://github.com/ceph/ceph/pull/20301>`_, yuelongguang)
-* core: libradosstriper: silence warning from -Wreorder (`pr#16890 <https://github.com/ceph/ceph/pull/16890>`_, songweibin)
-* core: make the main dout() paths faster and more maintanable (`pr#20290 <https://github.com/ceph/ceph/pull/20290>`_, Radoslaw Zarzynski)
-* core: messages: Initialization of variable beat (`pr#17641 <https://github.com/ceph/ceph/pull/17641>`_, Amit Kumar)
-* core: messages: Initialize member variables (`pr#16846 <https://github.com/ceph/ceph/pull/16846>`_, amitkuma)
-* core: messages: initialize variable tid in MMDSFindIno (`pr#16793 <https://github.com/ceph/ceph/pull/16793>`_, amitkuma)
-* core: messages: Initializing members in MOSDPGUpdateLogMissing (`pr#16928 <https://github.com/ceph/ceph/pull/16928>`_, amitkuma)
-* core: messages: Initializing variable ceph_mds_reply_head (`pr#17090 <https://github.com/ceph/ceph/pull/17090>`_, amitkuma)
-* core: messages,journal: Initialization of stats_period,m_active_set (`pr#17792 <https://github.com/ceph/ceph/pull/17792>`_, Amit Kumar)
-* core: messages/MOSDMap: do compat reencode of crush map, too (`issue#21882 <http://tracker.ceph.com/issues/21882>`_, `pr#18454 <https://github.com/ceph/ceph/pull/18454>`_, Sage Weil)
-* core: messages/MOSDOp: a fixes of encode_payload (`pr#16836 <https://github.com/ceph/ceph/pull/16836>`_, Ying He)
-* core: messages: Silence uninitialized member warnings (`pr#17596 <https://github.com/ceph/ceph/pull/17596>`_, Amit Kumar)
-* core: mgr/DaemonServer.cc: add 'is_valid=false' when decode caps error (`issue#20990 <http://tracker.ceph.com/issues/20990>`_, `pr#16978 <https://github.com/ceph/ceph/pull/16978>`_, Yanhu Cao)
-* core,mgr: mgr/balancer: improve error message (`issue#22814 <http://tracker.ceph.com/issues/22814>`_, `pr#21427 <https://github.com/ceph/ceph/pull/21427>`_, Sage Weil)
-* core,mgr: osd,mgrclient: pass daemon_status by rvalue ref and other cleanups (`pr#18509 <https://github.com/ceph/ceph/pull/18509>`_, Kefu Chai)
-* core,mgr: osd,mgr: report slow requests and pending creating pgs to mgr (`pr#18614 <https://github.com/ceph/ceph/pull/18614>`_, Kefu Chai)
-* core: mimic: crush: update choose_args on bucket removal (`issue#24167 <http://tracker.ceph.com/issues/24167>`_, `pr#22120 <https://github.com/ceph/ceph/pull/22120>`_, Sage Weil)
-* core: mimic: osdc: guard op->on_notify_finish with lock (`issue#23966 <http://tracker.ceph.com/issues/23966>`_, `pr#21834 <https://github.com/ceph/ceph/pull/21834>`_, Kefu Chai)
-* core: mimic: osd: clean up smart probe (`issue#23899 <http://tracker.ceph.com/issues/23899>`_, `issue#24104 <http://tracker.ceph.com/issues/24104>`_, `pr#21959 <https://github.com/ceph/ceph/pull/21959>`_, Sage Weil, Gu Zhongyan)
-* core: mimic: osd: Don't evict even when preemption has restarted with smaller chunk (`pr#22041 <https://github.com/ceph/ceph/pull/22041>`_, David Zafman)
-* core: mimic: osd/PrimaryLogPG: fix try_flush_mark_clean write contention case (`issue#24200 <http://tracker.ceph.com/issues/24200>`_, `issue#24174 <http://tracker.ceph.com/issues/24174>`_, `pr#22113 <https://github.com/ceph/ceph/pull/22113>`_, Sage Weil)
-* core: mon/ConfigKeyService: dump: print placeholder value for binary blobs (`issue#23622 <http://tracker.ceph.com/issues/23622>`_, `pr#21329 <https://github.com/ceph/ceph/pull/21329>`_, Sage Weil)
-* core,mon: crush, mon: bump up map version only if we truly created a weight-set (`pr#20178 <https://github.com/ceph/ceph/pull/20178>`_, xie xingguo)
-* core: mon/LogMonitor: separate out summary by channel (`pr#21395 <https://github.com/ceph/ceph/pull/21395>`_, Sage Weil)
-* core,mon: mon/AuthMonitor: create bootstrap keys on create_initial() (`pr#21236 <https://github.com/ceph/ceph/pull/21236>`_, Joao Eduardo Luis)
-* core,mon: mon/LogMonitor: do not crash on log sub w/ no messages (`pr#21469 <https://github.com/ceph/ceph/pull/21469>`_, Sage Weil)
-* core,mon: mon,osd,crush: misc cleanup (`pr#20687 <https://github.com/ceph/ceph/pull/20687>`_, songweibin)
-* core,mon: mon/OSDMonitor: Comment out unused function (`pr#20275 <https://github.com/ceph/ceph/pull/20275>`_, Brad Hubbard)
-* core,mon: mon/OSDMonitor: don't create pgs if pool was deleted (`issue#21309 <http://tracker.ceph.com/issues/21309>`_, `pr#17600 <https://github.com/ceph/ceph/pull/17600>`_, Joao Eduardo Luis)
-* core,mon: mon/OSDMonitor: implement cluster pg limit (`pr#17427 <https://github.com/ceph/ceph/pull/17427>`_, Sage Weil)
-* core,mon: mon/OSDMonitor: list osd tree in named bucket (`pr#19564 <https://github.com/ceph/ceph/pull/19564>`_, kungf)
-* core: mon, osd: add create-time for pool (`pr#21690 <https://github.com/ceph/ceph/pull/21690>`_, xie xingguo)
-* core: mon, osd: fix potential collided \*Up Set\* after PG remapping (`issue#23118 <http://tracker.ceph.com/issues/23118>`_, `pr#20653 <https://github.com/ceph/ceph/pull/20653>`_, xie xingguo)
-* core,mon: osd,mon: add max-pg-per-osd limit (`pr#18358 <https://github.com/ceph/ceph/pull/18358>`_, Kefu Chai)
-* core: mon/OSDMonitor: filter out pgs that shouldn't exist from force-create-pg (`pr#20267 <https://github.com/ceph/ceph/pull/20267>`_, Sage Weil)
-* core: mon/OSDMonitor: fix min_size default for replicated pools (`pr#20555 <https://github.com/ceph/ceph/pull/20555>`_, Josh Durgin)
-* core: mon/OSDMonitor: Fix OSDMonitor error message outputs (`issue#22351 <http://tracker.ceph.com/issues/22351>`_, `pr#20022 <https://github.com/ceph/ceph/pull/20022>`_, Brad Hubbard)
-* core: mon/OSDMonitor: make 'osd crush class rename' idempotent (`pr#17330 <https://github.com/ceph/ceph/pull/17330>`_, xie xingguo)
-* core: mon/OSDMonitor: rename outer name declaration to avoid shadowing (`pr#20032 <https://github.com/ceph/ceph/pull/20032>`_, Sage Weil)
-* core: mon/OSDMonitor: require --yes-i-really-mean-it for force-create-pg (`pr#21619 <https://github.com/ceph/ceph/pull/21619>`_, Sage Weil)
-* core: mon,osd,osdc: refactor snap trimming (phase 1) (`pr#18276 <https://github.com/ceph/ceph/pull/18276>`_, Sage Weil)
-* core: mon, osd: per pool space-full flag support (`pr#17371 <https://github.com/ceph/ceph/pull/17371>`_, xie xingguo)
-* core: mon, osd: turn down non-error scrub message severity (`issue#20947 <http://tracker.ceph.com/issues/20947>`_, `pr#16916 <https://github.com/ceph/ceph/pull/16916>`_, John Spray)
-* core: mon/PGMap: fix PGMapDigest decode (`pr#22099 <https://github.com/ceph/ceph/pull/22099>`_, Sage Weil)
-* core: mon/PGMap: Fix %USED calculation bug (`issue#22247 <http://tracker.ceph.com/issues/22247>`_, `pr#19165 <https://github.com/ceph/ceph/pull/19165>`_, Xiaoxi Chen)
-* core: mon/PGMap: remove or narrow columns 'pg ls' output (`pr#20945 <https://github.com/ceph/ceph/pull/20945>`_, Sage Weil)
-* core: mon/PGMap: 'unclean' does not imply damaged (`pr#18493 <https://github.com/ceph/ceph/pull/18493>`_, Sage Weil)
-* core: MOSDPGRecoveryDelete[Reply]: bump header version (`pr#17585 <https://github.com/ceph/ceph/pull/17585>`_, Josh Durgin)
-* core: msg/asyc/rmda: fix the bug of assert when Infiniband::recv_msg receives disconnect message (`pr#17688 <https://github.com/ceph/ceph/pull/17688>`_, Jin Cai)
-* core: msg/async/AsyncConnection: combine multi alloc into one (`pr#18833 <https://github.com/ceph/ceph/pull/18833>`_, Haomai Wang)
-* core: msg/async/AsyncConnection: Fix FPE in process_connection (`issue#23618 <http://tracker.ceph.com/issues/23618>`_, `pr#21314 <https://github.com/ceph/ceph/pull/21314>`_, Brad Hubbard)
-* core: msg/async/AsyncConnection: state will be NONE if replacing by another one (`issue#21883 <http://tracker.ceph.com/issues/21883>`_, `pr#18467 <https://github.com/ceph/ceph/pull/18467>`_, Haomai Wang)
-* core: msg/async/AsyncConnection: unregister connection when racing happened (`pr#19013 <https://github.com/ceph/ceph/pull/19013>`_, Haomai Wang)
-* core: msg/async: batch handle numevents (`pr#18321 <https://github.com/ceph/ceph/pull/18321>`_, Jianpeng Ma)
-* core: msg/async: don't kill connection if replacing (`issue#21143 <http://tracker.ceph.com/issues/21143>`_, `pr#17288 <https://github.com/ceph/ceph/pull/17288>`_, Haomai Wang)
-* core: msg/async: don't stuck into resetsession/retrysession loop (`pr#17276 <https://github.com/ceph/ceph/pull/17276>`_, Haomai Wang)
-* core: msg/async: fix bug of data type conversion when uint64_t -> int -> uint64_t (`pr#18210 <https://github.com/ceph/ceph/pull/18210>`_, shangfufei)
-* core: msg/async: print error log if add_event fail (`pr#17102 <https://github.com/ceph/ceph/pull/17102>`_, mychoxin)
-* core: msg/async/rdma: fix multi cephcontext confllicting (`pr#16893 <https://github.com/ceph/ceph/pull/16893>`_, Haomai Wang)
-* core: msg/async/rdma: fix the bug that rdma polling thread uses the same thread name with msg worker (`pr#16936 <https://github.com/ceph/ceph/pull/16936>`_, Jin Cai)
-* core: msg/async/rdma: improves RX buffer management (`pr#16693 <https://github.com/ceph/ceph/pull/16693>`_, Alex Mikheev)
-* core: msg/async/rdma: uninitialized variable fix (`pr#18091 <https://github.com/ceph/ceph/pull/18091>`_, Vasily Philipov)
-* core: msg/DispatchQueue: clear queue after wait() (`issue#18351 <http://tracker.ceph.com/issues/18351>`_, `pr#20374 <https://github.com/ceph/ceph/pull/20374>`_, Sage Weil)
-* core: msgr/simple: set Pipe::out_seq to in_seq of the connecting side (`issue#23807 <http://tracker.ceph.com/issues/23807>`_, `pr#21585 <https://github.com/ceph/ceph/pull/21585>`_, Xuehan Xu)
-* core: os/bluestore: debug bluestore cache shutdown (`issue#21259 <http://tracker.ceph.com/issues/21259>`_, `pr#17844 <https://github.com/ceph/ceph/pull/17844>`_, Sage Weil)
-* core: os/bluestore: disable on_applied sync_complete (`issue#22668 <http://tracker.ceph.com/issues/22668>`_, `pr#20169 <https://github.com/ceph/ceph/pull/20169>`_, Sage Weil)
-* core: os/bluestore: make bdev label parsing error more meaningful and less noisy (`pr#20090 <https://github.com/ceph/ceph/pull/20090>`_, Sage Weil)
-* core: os/bluestore: make BlueStore opened by start_kv_only umountable (`issue#21624 <http://tracker.ceph.com/issues/21624>`_, `pr#18082 <https://github.com/ceph/ceph/pull/18082>`_, Chang Liu)
-* core: os/bluestore: use db->rm_range_keys to delete range of keys (`pr#18279 <https://github.com/ceph/ceph/pull/18279>`_, Xiaoyan Li)
-* core: OSD/admin_socket: add get_mapped_pools command (`pr#19112 <https://github.com/ceph/ceph/pull/19112>`_, Xiaoxi Chen)
-* core: osdc, class_api: kill implicit string conversions (`pr#16648 <https://github.com/ceph/ceph/pull/16648>`_, Piotr Dałek)
-* core: osdc: dec num_in_flight for pool_dne case (`pr#21110 <https://github.com/ceph/ceph/pull/21110>`_, Jianpeng Ma)
-* core: osdc: Do not use lock_guard as unique_lock (`pr#19756 <https://github.com/ceph/ceph/pull/19756>`_, Shinobu Kinjo)
-* core: osdc: invoke notify finish context on linger commit failure (`issue#23966 <http://tracker.ceph.com/issues/23966>`_, `pr#21786 <https://github.com/ceph/ceph/pull/21786>`_, Jason Dillaman)
-* core: osdc/Objecter: add ignore overlay flag if got redirect reply (`pr#21275 <https://github.com/ceph/ceph/pull/21275>`_, Ting Yi Lin)
-* core: osdc/Objecter: delay initialization of hobject_t in _send_op (`issue#21845 <http://tracker.ceph.com/issues/21845>`_, `pr#18427 <https://github.com/ceph/ceph/pull/18427>`_, Jason Dillaman)
-* core: osdc/Objecter: fix recursive locking in _finish_command (`issue#23940 <http://tracker.ceph.com/issues/23940>`_, `pr#21742 <https://github.com/ceph/ceph/pull/21742>`_, Sage Weil)
-* core: osdc/Objecter: misc cleanups (`pr#18476 <https://github.com/ceph/ceph/pull/18476>`_, Jianpeng Ma)
-* core: osdc/Objecter: prevent double-invocation of linger op callback (`issue#23872 <http://tracker.ceph.com/issues/23872>`_, `pr#21649 <https://github.com/ceph/ceph/pull/21649>`_, Jason Dillaman)
-* core: osdc/Objecter: skip sparse-read result decode if bufferlist is empty (`issue#21844 <http://tracker.ceph.com/issues/21844>`_, `pr#18400 <https://github.com/ceph/ceph/pull/18400>`_, Jason Dillaman)
-* core: osd,compressor: Expose compression algorithms via MOSDBoot (`issue#22420 <http://tracker.ceph.com/issues/22420>`_, `pr#20558 <https://github.com/ceph/ceph/pull/20558>`_, Jesse Williamson)
-* core: osdc: remove unused function (`pr#21081 <https://github.com/ceph/ceph/pull/21081>`_, Jianpeng Ma)
-* core: osd,dmclock: use pointer to ClientInfo instead of a copy of it (`pr#18387 <https://github.com/ceph/ceph/pull/18387>`_, Kefu Chai)
-* core:  osd: do not forget pg_stat acks which failed to send (`pr#16702 <https://github.com/ceph/ceph/pull/16702>`_, huangjun)
-* core: OSD: drop unsed parameter passed to check_osdmap_features (`pr#18466 <https://github.com/ceph/ceph/pull/18466>`_, Leo Zhang)
-* core: osd/ECBackend: inject sleep during deep scrub (`pr#20531 <https://github.com/ceph/ceph/pull/20531>`_, xie xingguo)
-* core: osd/ECBackend: only check required shards when finishing recovery reads (`issue#23195 <http://tracker.ceph.com/issues/23195>`_, `pr#21273 <https://github.com/ceph/ceph/pull/21273>`_, Josh Durgin)
-* core: osd/ECBackend: update misleading comment about EIO handling (`pr#21686 <https://github.com/ceph/ceph/pull/21686>`_, Josh Durgin)
-* core: osd/ECBackend: wait for apply for luminous peers (`pr#21604 <https://github.com/ceph/ceph/pull/21604>`_, Sage Weil)
-* core: osd/ECMsgTypes: fix ECSubRead compat decode (`pr#20948 <https://github.com/ceph/ceph/pull/20948>`_, Sage Weil)
-* core: osd, librados: add a rados op (TIER_PROMOTE) (`pr#19362 <https://github.com/ceph/ceph/pull/19362>`_, Myoungwon Oh)
-* core: osd,librados: add manifest, operations for chunked object (`pr#15482 <https://github.com/ceph/ceph/pull/15482>`_, Myoungwon Oh)
-* core: osd,messages: Initialize read_length,options,send_reply (`pr#17799 <https://github.com/ceph/ceph/pull/17799>`_, Amit Kumar)
-* core: osd/OSD: batch-list objects to reduce memory consumption (`pr#20767 <https://github.com/ceph/ceph/pull/20767>`_, xie xingguo)
-* core: osd/OSD.cc: add 'isvalid=false' when failed to parse caps (`pr#16888 <https://github.com/ceph/ceph/pull/16888>`_, Yanhu Cao)
-* core: osd/OSD.cc: use option 'osd_scrub_cost' instead (`pr#18479 <https://github.com/ceph/ceph/pull/18479>`_, Liao Weizhong)
-* core: osd/OSDMap: add osdmap epoch info when printing info summary (`pr#20184 <https://github.com/ceph/ceph/pull/20184>`_, shun-s)
-* core: osd/OSDMap: fix HAVE_FEATURE logic in encode() (`pr#20922 <https://github.com/ceph/ceph/pull/20922>`_, Ilya Dryomov)
-* core: osd/OSDMap: ignore PGs from pools of failure-domain OSD (`pr#20703 <https://github.com/ceph/ceph/pull/20703>`_, xie xingguo)
-* core: osd/OSDMap: misleading message in print_oneline_summary() (`issue#22350 <http://tracker.ceph.com/issues/22350>`_, `pr#20313 <https://github.com/ceph/ceph/pull/20313>`_, Gu Zhongyan)
-* core: osd/OSDMap: more pg upmap fixes (`issue#23878 <http://tracker.ceph.com/issues/23878>`_, `pr#21670 <https://github.com/ceph/ceph/pull/21670>`_, xiexingguo)
-* core: osd/OSDMap: remove the unnecessary checks for null (`pr#18636 <https://github.com/ceph/ceph/pull/18636>`_, Kefu Chai)
-* core: osd/OSDMap: skip out/crush-out osds (`pr#20655 <https://github.com/ceph/ceph/pull/20655>`_, xie xingguo)
-* core: osd/OSDMap: upmap should respect the osd reweights (`issue#21538 <http://tracker.ceph.com/issues/21538>`_, `pr#17944 <https://github.com/ceph/ceph/pull/17944>`_, Theofilos Mouratidis)
-* core: osd/osd_type: get_clone_bytes - inline size() for overlapping size (`pr#17823 <https://github.com/ceph/ceph/pull/17823>`_, xie xingguo)
-* core: osd/osd_types.cc: copy extents map too while making clone (`pr#18396 <https://github.com/ceph/ceph/pull/18396>`_, xie xingguo)
-* core: osd/osd_types: fix ideal lower bound object-id of pg (`pr#21235 <https://github.com/ceph/ceph/pull/21235>`_, xie xingguo)
-* core: osd/osd_types: fix object_stat_sum_t decode (`pr#18551 <https://github.com/ceph/ceph/pull/18551>`_, Sage Weil)
-* core: osd/osd_types: fix pg_pool_t encoding for hammer (`pr#21282 <https://github.com/ceph/ceph/pull/21282>`_, Sage Weil)
-* core: osd/osd_types: kill preferred field in pg_t (`pr#20567 <https://github.com/ceph/ceph/pull/20567>`_, Sage Weil)
-* core: osd/osd_types: object_info_t: remove unused function (`pr#17905 <https://github.com/ceph/ceph/pull/17905>`_, Kefu Chai)
-* core: osd/osd_types: pg_pool_t: remove crash_replay_interval member (`pr#18379 <https://github.com/ceph/ceph/pull/18379>`_, Sage Weil)
-* core: osd/osd_types: remove backlog type for pg_log_entry_t (`pr#20887 <https://github.com/ceph/ceph/pull/20887>`_, Sage Weil)
-* core: osd/OSD: Using Wait rather than WaitInterval to wait queue.is_empty() (`pr#17659 <https://github.com/ceph/ceph/pull/17659>`_, Jianpeng Ma)
-* core: osd/PG: allow scrub preemption (`pr#18971 <https://github.com/ceph/ceph/pull/18971>`_, Sage Weil)
-* core: osd/PGBackend: delete reply if fails to complete delete request (`issue#20913 <http://tracker.ceph.com/issues/20913>`_, `pr#17183 <https://github.com/ceph/ceph/pull/17183>`_, Kefu Chai)
-* core: osd/PGBackend: drop input "snapid_t" from objects_list_range() (`pr#21151 <https://github.com/ceph/ceph/pull/21151>`_, xie xingguo)
-* core: osd/PGBackend: fix large_omap_objects checking (`pr#21150 <https://github.com/ceph/ceph/pull/21150>`_, xie xingguo)
-* core: osd/PGBackend: release a msg using msg->put() not delete (`issue#20913 <http://tracker.ceph.com/issues/20913>`_, `pr#17246 <https://github.com/ceph/ceph/pull/17246>`_, Kefu Chai)
-* core: osd/PG: const cleanup for recoverable/readable predicates (`pr#18982 <https://github.com/ceph/ceph/pull/18982>`_, Neha Ojha)
-* core: osd/PG: decay scrub_chunk_max too if scrub is preempted (`pr#20552 <https://github.com/ceph/ceph/pull/20552>`_, xie xingguo)
-* core: osd/PG: discard msgs from down peers (`issue#19605 <http://tracker.ceph.com/issues/19605>`_, `pr#17217 <https://github.com/ceph/ceph/pull/17217>`_, Kefu Chai)
-* core: osd/PG: drop unused variable "oldest_update" in PG.h (`pr#17142 <https://github.com/ceph/ceph/pull/17142>`_, songweibin)
-* core: osd/PG:  extend pg state bits to fix pg ls commands error (`issue#21609 <http://tracker.ceph.com/issues/21609>`_, `pr#18058 <https://github.com/ceph/ceph/pull/18058>`_, Yan Jun)
-* core: osd/PG: fix calc of misplaced objects (`pr#18528 <https://github.com/ceph/ceph/pull/18528>`_, Kefu Chai)
-* core: osd/PG: fix DeferRecovery vs AllReplicasRecovered race (`issue#23860 <http://tracker.ceph.com/issues/23860>`_, `pr#21706 <https://github.com/ceph/ceph/pull/21706>`_, Sage Weil)
-* core: osd/PG: fix objects degraded higher than 100% (`issue#21803 <http://tracker.ceph.com/issues/21803>`_, `issue#21898 <http://tracker.ceph.com/issues/21898>`_, `pr#18297 <https://github.com/ceph/ceph/pull/18297>`_, Sage Weil, David Zafman)
-* core: osd/PG: fix out of order priority for PG deletion (`pr#21613 <https://github.com/ceph/ceph/pull/21613>`_, xie xingguo)
-* core: osd/PG: fix recovery op leak (`pr#18524 <https://github.com/ceph/ceph/pull/18524>`_, Sage Weil)
-* core: osd/PG: fix uninit read in Incomplete::react(AdvMap&) (`issue#23980 <http://tracker.ceph.com/issues/23980>`_, `pr#21798 <https://github.com/ceph/ceph/pull/21798>`_, Sage Weil)
-* core: osd/PG: force rebuild of missing set on jewel upgrade (`issue#20958 <http://tracker.ceph.com/issues/20958>`_, `pr#16950 <https://github.com/ceph/ceph/pull/16950>`_, Sage Weil)
-* core: osd/PG: include primary in PG operator<< for ec pools (`pr#19453 <https://github.com/ceph/ceph/pull/19453>`_, Sage Weil)
-* core: osd/PGLog: assert out on performing overflowed log trimming (`pr#21580 <https://github.com/ceph/ceph/pull/21580>`_, xie xingguo)
-* core: osd/PGLog: cleanup unused function revise_have (`pr#19329 <https://github.com/ceph/ceph/pull/19329>`_, Enming Zhang)
-* core: osd/PGLog: fix sanity check against \*\*complete-to\*\* iter (`pr#21612 <https://github.com/ceph/ceph/pull/21612>`_, songweibin)
-* core: osd/PGLog: get rid of ineffective container operations (`pr#19161 <https://github.com/ceph/ceph/pull/19161>`_, xie xingguo)
-* core: osd/PGLog: write only changed dup entries (`issue#21026 <http://tracker.ceph.com/issues/21026>`_, `pr#17245 <https://github.com/ceph/ceph/pull/17245>`_, Josh Durgin)
-* core: osd, pg, mgr: make snap trim queue problems visible (`issue#22448 <http://tracker.ceph.com/issues/22448>`_, `pr#19520 <https://github.com/ceph/ceph/pull/19520>`_, Piotr Dałek)
-* core: osd/PG: misc cleanups (`pr#18340 <https://github.com/ceph/ceph/pull/18340>`_, Yan Jun)
-* core: osd/PG: miscellaneous choose acting changes and cleanups (`pr#18481 <https://github.com/ceph/ceph/pull/18481>`_, xie xingguo)
-* core: osd/PG: pass scrub priority to replica (`pr#20317 <https://github.com/ceph/ceph/pull/20317>`_, Sage Weil)
-* core: osd/PG: perfer async_recovery_targets in reverse order of cost (`pr#21578 <https://github.com/ceph/ceph/pull/21578>`_, xie xingguo)
-* core: osd/PG: perfer EC async_recovery_targets in reverse order of cost (`pr#21588 <https://github.com/ceph/ceph/pull/21588>`_, xie xingguo)
-* core: osd/PG: PGPool::update: avoid expensive union_of (`pr#17239 <https://github.com/ceph/ceph/pull/17239>`_, Zac Medico)
-* core: osd/PGPool::update: optimize with subset_of (`pr#17820 <https://github.com/ceph/ceph/pull/17820>`_, Zac Medico)
-* core: osd/PG: reduce some overhead on operating MissingLoc (`pr#18186 <https://github.com/ceph/ceph/pull/18186>`_, xie xingguo)
-* core: osd/PG: remote recovery preemption, and new feature bit to condition it on (`pr#18553 <https://github.com/ceph/ceph/pull/18553>`_, Sage Weil)
-* core: osd/PG: remove unused parameter in calc_ec_acting (`pr#17304 <https://github.com/ceph/ceph/pull/17304>`_, yang.wang)
-* core: osd/PG: restart recovery if NotRecovering and unfound found (`issue#22145 <http://tracker.ceph.com/issues/22145>`_, `pr#18974 <https://github.com/ceph/ceph/pull/18974>`_, Sage Weil)
-* core: osd/PG: revert approx size (`issue#22654 <http://tracker.ceph.com/issues/22654>`_, `pr#18755 <https://github.com/ceph/ceph/pull/18755>`_, Adam Kupczyk)
-* core: osd/PG: re-write of _update_calc_stats and improve pg degraded state (`issue#20059 <http://tracker.ceph.com/issues/20059>`_, `pr#19850 <https://github.com/ceph/ceph/pull/19850>`_, David Zafman)
-* core: osd/PG: some cleanups && add should_gather filter for loop logging (`pr#19546 <https://github.com/ceph/ceph/pull/19546>`_, Enming Zhang)
-* core: osd/PG: two cleanups (`pr#17171 <https://github.com/ceph/ceph/pull/17171>`_, xie xingguo)
-* core: osd/PG: use osd_backfill_retry_interval for schedule_backfill_retry() (`pr#18686 <https://github.com/ceph/ceph/pull/18686>`_, xie xingguo)
-* core: osd/PrimaryLogPG: add condition "is_chunky_scrub_active" to check object in chunky_scrub (`pr#18506 <https://github.com/ceph/ceph/pull/18506>`_, Jianpeng Ma)
-* core: osd/PrimaryLogPG: arrange recovery order by number of missing objects (`pr#18292 <https://github.com/ceph/ceph/pull/18292>`_, xie xingguo)
-* core: osd/PrimaryLogPG: avoid infinite loop when flush collides with write lock (`pr#21653 <https://github.com/ceph/ceph/pull/21653>`_, Sage Weil)
-* core: osd/PrimaryLogPG: calc clone_overlap size in a more efficient and concise way (`pr#17928 <https://github.com/ceph/ceph/pull/17928>`_, xie xingguo)
-* core: osd/PrimaryLogPG: cleanup do_sub_op && do_sub_op_reply and define soid in prepare_transaction more appropriate (`pr#19495 <https://github.com/ceph/ceph/pull/19495>`_, Enming Zhang)
-* core: osd/PrimaryLogPG: clear data digest on WRITEFULL if skip_data_digest (`pr#21676 <https://github.com/ceph/ceph/pull/21676>`_, Sage Weil)
-* core: osd/PrimaryLogPG: clear pin_stats_invalid bit properly on scrub-repair completion (`pr#18052 <https://github.com/ceph/ceph/pull/18052>`_, xie xingguo)
-* core: osd/PrimaryLogPG: defer evict if head \*or\* object intersect scrub interval (`issue#23646 <http://tracker.ceph.com/issues/23646>`_, `pr#21628 <https://github.com/ceph/ceph/pull/21628>`_, Sage Weil)
-* core: osd/PrimaryLogPG: do not pull-up snapc to snapset (`pr#18713 <https://github.com/ceph/ceph/pull/18713>`_, Sage Weil)
-* core: osd/PrimaryLogPG: do not set data digest for bluestore (`pr#17515 <https://github.com/ceph/ceph/pull/17515>`_, xie xingguo)
-* core: osd/PrimaryLogPG: do not set data/omap digest blindly (`pr#18061 <https://github.com/ceph/ceph/pull/18061>`_, xie xingguo)
-* core: osd/PrimaryLogPG: do not use approx_size() for log trimming (`pr#18338 <https://github.com/ceph/ceph/pull/18338>`_, xie xingguo)
-* core: osd/PrimaryLogPG: do_osd_ops - propagate EAGAIN/EINPROGRESS on failok (`pr#17222 <https://github.com/ceph/ceph/pull/17222>`_, xie xingguo)
-* core: osd/PrimaryLogPG: drop unused parameters (`pr#18581 <https://github.com/ceph/ceph/pull/18581>`_, Liao Weizhong)
-* core: osd/PrimaryLogPG: fix dup stat for async read (`pr#18693 <https://github.com/ceph/ceph/pull/18693>`_, Xinze Chi)
-* core: osd/PrimaryLogPG: Fix log messages (`pr#21639 <https://github.com/ceph/ceph/pull/21639>`_, Gu Zhongyan)
-* core: osd/PrimaryLogPG: fix sparse read won't trigger repair correctly (`pr#17221 <https://github.com/ceph/ceph/pull/17221>`_, xie xingguo)
-* core: osd/PrimaryLogPG: fix the oi size mismatch with real object size (`issue#23701 <http://tracker.ceph.com/issues/23701>`_, `pr#21408 <https://github.com/ceph/ceph/pull/21408>`_, Peng Xie)
-* core: osd/PrimaryLogPG: kick off recovery on backoffing a degraded object (`pr#17987 <https://github.com/ceph/ceph/pull/17987>`_, xie xingguo)
-* core: osd/PrimaryLogPG: kill add_interval_usage (`pr#17807 <https://github.com/ceph/ceph/pull/17807>`_, xie xingguo)
-* core: osd/PrimaryLogPG: maybe_handle_manifest_detail - sanity check obc existence (`pr#17298 <https://github.com/ceph/ceph/pull/17298>`_, xie xingguo)
-* core: osd/PrimaryLogPG: misc cleanups (`pr#17830 <https://github.com/ceph/ceph/pull/17830>`_, Yan Jun)
-* core: osd/PrimaryLogPG: more oi.extents fixes (`pr#18616 <https://github.com/ceph/ceph/pull/18616>`_, xie xingguo)
-* core: osd/PrimaryLogPG: prepare_transaction - fix EDQUOT vs ENOSPC (`pr#17808 <https://github.com/ceph/ceph/pull/17808>`_, xie xingguo)
-* core: osd/PrimaryLogPG: request osdmap update in the right block (`issue#21428 <http://tracker.ceph.com/issues/21428>`_, `pr#17828 <https://github.com/ceph/ceph/pull/17828>`_, Josh Durgin)
-* core: osd/PrimaryLogPG: several oi.extents fixes (`pr#18527 <https://github.com/ceph/ceph/pull/18527>`_, xie xingguo)
-* core: osd/PrimaryLogPG: trigger auto-repair on full-object-size CRC error (`pr#18353 <https://github.com/ceph/ceph/pull/18353>`_, xie xingguo)
-* core: osd/ReplicatedBackend: clean up code (`pr#20127 <https://github.com/ceph/ceph/pull/20127>`_, Jianpeng Ma)
-* core: osd/ReplicatedBackend: 'osd_deep_scrub_keys' doesn't work (`pr#20221 <https://github.com/ceph/ceph/pull/20221>`_, fang yuxiang)
-* core: osd/ReplicatedPG: add omap write bytes to delta_stats (`pr#18471 <https://github.com/ceph/ceph/pull/18471>`_, Haomai Wang)
-* core: osd_types.cc: reorder fields in serialized pg_stat_t (`pr#19965 <https://github.com/ceph/ceph/pull/19965>`_, Piotr Dałek)
-* core: os/filestore: disable rocksdb compression (`pr#18707 <https://github.com/ceph/ceph/pull/18707>`_, Sage Weil)
-* core: os/filestore/FileStore: Initialized by nullptr, NULL or 0 instead (`pr#18980 <https://github.com/ceph/ceph/pull/18980>`_, Shinobu Kinjo)
-* core: os/filestore: fix device/partition metadata detection (`issue#20944 <http://tracker.ceph.com/issues/20944>`_, `pr#16913 <https://github.com/ceph/ceph/pull/16913>`_, Sage Weil)
-* core: os/filestore: fix do_copy_range replay bug (`issue#23298 <http://tracker.ceph.com/issues/23298>`_, `pr#20832 <https://github.com/ceph/ceph/pull/20832>`_, Sage Weil)
-* core: os/Filestore: fix wbthrottle assert (`pr#14213 <https://github.com/ceph/ceph/pull/14213>`_, Xiaoxi Chen)
-* core: os/filestore: print out the error if do_read_entry() fails (`pr#18346 <https://github.com/ceph/ceph/pull/18346>`_, Kefu Chai)
-* core: os: FileStore, Using stl min | max, MIN | MAX macros instead (`pr#19832 <https://github.com/ceph/ceph/pull/19832>`_, Shinobu Kinjo)
-* core: os: fix 0-length zero semantics, add tests (`issue#21712 <http://tracker.ceph.com/issues/21712>`_, `pr#18159 <https://github.com/ceph/ceph/pull/18159>`_, Sage Weil)
-* core: os/FuseStore: fix incorrect used space statistics for fuse's statfs interface (`pr#19033 <https://github.com/ceph/ceph/pull/19033>`_, Zhi Zhang)
-* core: os/kstore: Drop unused function declaration (`pr#18077 <https://github.com/ceph/ceph/pull/18077>`_, Jos Collin)
-* core: os/kstore: fix statfs problem and add vstart.sh support (`issue#23590 <http://tracker.ceph.com/issues/23590>`_, `pr#21287 <https://github.com/ceph/ceph/pull/21287>`_, Yang Honggang)
-* core: os/memstore: Fix wrong use of lock_guard (`pr#20914 <https://github.com/ceph/ceph/pull/20914>`_, Shen-Ta Hsieh)
-* core: os/ObjectStore: fix get_data_alignment return -1 causing problem in msg header (`pr#18475 <https://github.com/ceph/ceph/pull/18475>`_, Haomai Wang)
-* core: os/ObjectStore.h: fix mistake in comment TRANSACTION ISOLATION (`pr#16840 <https://github.com/ceph/ceph/pull/16840>`_, mychoxin)
-* core: os,osd: initial work to drop onreadable/onapplied callbacks (`issue#23029 <http://tracker.ceph.com/issues/23029>`_, `pr#20177 <https://github.com/ceph/ceph/pull/20177>`_, Sage Weil)
-* core: os: unify Sequencer and CollectionHandle (`pr#20173 <https://github.com/ceph/ceph/pull/20173>`_, Sage Weil)
-* core: PG: fix name of WaitActingChange (`pr#18768 <https://github.com/ceph/ceph/pull/18768>`_, wumingqiao)
-* core: pg: handle MNotifyRec event in down state (`pr#20959 <https://github.com/ceph/ceph/pull/20959>`_, Mingxin Liu)
-* core: PGPool::update: optimize removed_snaps comparison when possible (`pr#17410 <https://github.com/ceph/ceph/pull/17410>`_, Zac Medico)
-* core: PGPool::update: optimize with interval_set.swap (`pr#17121 <https://github.com/ceph/ceph/pull/17121>`_, Zac Medico)
-* core: PG: primary should not be in the peer_info, skip if it is (`pr#20189 <https://github.com/ceph/ceph/pull/20189>`_, Neha Ojha)
-* core: ptl-tool: checkout branch after creation (`pr#18157 <https://github.com/ceph/ceph/pull/18157>`_, Patrick Donnelly)
-* core: ptl-tool: load labeled PRs (`pr#18231 <https://github.com/ceph/ceph/pull/18231>`_, Patrick Donnelly)
-* core: ptl-tool: make branch name configurable (`pr#18499 <https://github.com/ceph/ceph/pull/18499>`_, Patrick Donnelly)
-* core: ptl-tool: print bzs/tickets cited in commit msgs/comments (`pr#18547 <https://github.com/ceph/ceph/pull/18547>`_, Patrick Donnelly)
-* core: pybind/ceph_argparse: fix cli output info (`pr#17667 <https://github.com/ceph/ceph/pull/17667>`_, Luo Kexue)
-* core: pybind/ceph_argparse: Fix UnboundLocalError if command doesn't validate (`pr#21342 <https://github.com/ceph/ceph/pull/21342>`_, Tim Serong)
-* core:  pybind/ceph_argparse.py:'timeout' must in kwargs when call run_in_thread (`pr#21659 <https://github.com/ceph/ceph/pull/21659>`_, yangdeliu)
-* core,pybind: pybind/ceph_argparse: accept flexible req (`pr#20791 <https://github.com/ceph/ceph/pull/20791>`_, Gu Zhongyan)
-* core,pybind: pybind/rados: add alignment getter to IoCtx (`pr#21222 <https://github.com/ceph/ceph/pull/21222>`_, Bruce Flynn)
-* core,pybind: pybind/rados: add rados_service\_\*() (`pr#18812 <https://github.com/ceph/ceph/pull/18812>`_, Kefu Chai)
-* core,pybind: pybind/rados: add support open_ioctx2 API (`pr#17710 <https://github.com/ceph/ceph/pull/17710>`_, songweibin)
-* core,pybind: rados: support python API of "set_osdmap_full_try" (`pr#17418 <https://github.com/ceph/ceph/pull/17418>`_, songweibin)
-* core: qa: fix the potential delay of pg state change (`pr#17253 <https://github.com/ceph/ceph/pull/17253>`_, huangjun)
-* core: qa/standalone/osd/repro_long_log: no-mon-config for cot (`pr#20919 <https://github.com/ceph/ceph/pull/20919>`_, Sage Weil)
-* core: qa/standalone/scrub/osd-scrub-repair: no -y to diff (`issue#21618 <http://tracker.ceph.com/issues/21618>`_, `pr#18079 <https://github.com/ceph/ceph/pull/18079>`_, Sage Weil)
-* core: qa/suite/rados: fix balancer vs firefly tunables failures (`pr#18826 <https://github.com/ceph/ceph/pull/18826>`_, Sage Weil)
-* core: qa/suites/rados: fewer msgr failures (`pr#20918 <https://github.com/ceph/ceph/pull/20918>`_, Sage Weil)
-* core: qa/suites/rados/perf: whitelist health warnings (`pr#18878 <https://github.com/ceph/ceph/pull/18878>`_, Sage Weil)
-* core: qa/suites/rados/rest/mgr: provision openstack volumes (`pr#20573 <https://github.com/ceph/ceph/pull/20573>`_, Sage Weil)
-* core: qa/suites/rados/singleton/all/mon-seesaw: whitelist MON_DOWN (`pr#18246 <https://github.com/ceph/ceph/pull/18246>`_, Sage Weil)
-* core: qa/suites/rados/singleton/all/recover-preemption: handle slow starting osd (`pr#18078 <https://github.com/ceph/ceph/pull/18078>`_, Sage Weil)
-* core: qa/suites/rados/singleton/all/recovery_preemption: whitelist SLOW_OPS (`pr#21250 <https://github.com/ceph/ceph/pull/21250>`_, Sage Weil)
-* core: qa/suites/rados/singleton/diverget_priors\*: broaden whitelist (`pr#17379 <https://github.com/ceph/ceph/pull/17379>`_, Sage Weil)
-* core: qa/suites/rados/thrash: extend mgr beacon grace when many msgr failures injected (`issue#21147 <http://tracker.ceph.com/issues/21147>`_, `pr#19242 <https://github.com/ceph/ceph/pull/19242>`_, Sage Weil)
-* core: qa/suites/rados/verify/tasks/rados_api_tests: whitelist OBJECT_MISPLACED (`pr#21646 <https://github.com/ceph/ceph/pull/21646>`_, Sage Weil)
-* core: qa/workunits/rest/test.py: stop trying to test obsolte cluster_up/down (`pr#18552 <https://github.com/ceph/ceph/pull/18552>`_, Sage Weil)
-* core: rados/objclass.h: fix build define CEPH_CLS_API in all cases (`pr#21606 <https://github.com/ceph/ceph/pull/21606>`_, Danny Al-Gaaf)
-* core: rados: use WaitInterval()'s return value instead of manual timing (`pr#20028 <https://github.com/ceph/ceph/pull/20028>`_, Mohamad Gebai)
-* core,rbd: common,rbd-nbd: fix up prefork behavior vs AsyncMessenger singletons (`issue#23143 <http://tracker.ceph.com/issues/23143>`_, `pr#20681 <https://github.com/ceph/ceph/pull/20681>`_, Sage Weil)
-* core,rbd: librbd,os: address coverity false positives (`pr#17793 <https://github.com/ceph/ceph/pull/17793>`_, Amit Kumar)
-* core,rbd: mgr,osd,kv: Fix various warnings for Clang and GCC7 (`pr#17976 <https://github.com/ceph/ceph/pull/17976>`_, Adam C. Emerson)
-* core,rbd: vstart.sh: fix mstart variables (`pr#20826 <https://github.com/ceph/ceph/pull/20826>`_, Sage Weil)
-* core: rdma: Assign instead of compare (`pr#16664 <https://github.com/ceph/ceph/pull/16664>`_, amitkuma)
-* core: remove startsync (`issue#20604 <http://tracker.ceph.com/issues/20604>`_, `pr#16396 <https://github.com/ceph/ceph/pull/16396>`_, Amit Kumar)
-* core: rocksdb: sync with upstream (`issue#20529 <http://tracker.ceph.com/issues/20529>`_, `pr#17388 <https://github.com/ceph/ceph/pull/17388>`_, Kefu Chai)
-* core: rocksdb: sync with upstream (`pr#21320 <https://github.com/ceph/ceph/pull/21320>`_, Kefu Chai)
-* core: scrub errors not cleared on replicas can cause inconsistent pg state when replica takes over primary (`issue#23267 <http://tracker.ceph.com/issues/23267>`_, `pr#21101 <https://github.com/ceph/ceph/pull/21101>`_, David Zafman)
-* core: Snapset inconsistency is detected with its own error (`issue#22996 <http://tracker.ceph.com/issues/22996>`_, `pr#20450 <https://github.com/ceph/ceph/pull/20450>`_, David Zafman)
-* core: src/messages/MOSDMap: reencode OSDMap for older clients (`issue#21660 <http://tracker.ceph.com/issues/21660>`_, `pr#18134 <https://github.com/ceph/ceph/pull/18134>`_, Sage Weil)
-* core: src/osd/PG.cc: 6455: FAILED assert(0 == "we got a bad state machine event") (`pr#20933 <https://github.com/ceph/ceph/pull/20933>`_, David Zafman)
-* core: src/test/osd: add two pool test for manifest objects (`pr#20096 <https://github.com/ceph/ceph/pull/20096>`_, Myoungwon Oh)
-* core: test/cli/osdmaptool/test-map-pgs.t: remove nondetermimistic test (`pr#20872 <https://github.com/ceph/ceph/pull/20872>`_, Sage Weil)
-* core: test/objectstore_bench: Don't forget judging whether call usage (`pr#21369 <https://github.com/ceph/ceph/pull/21369>`_, Jianpeng Ma)
-* core,tests: ceph_test_filestore_idempotent_sequence: many fixes (`issue#22920 <http://tracker.ceph.com/issues/22920>`_, `pr#20279 <https://github.com/ceph/ceph/pull/20279>`_, Sage Weil)
-* core,tests: ceph_test_objectstore: drop expect regex (`pr#16968 <https://github.com/ceph/ceph/pull/16968>`_, Sage Weil)
-* core,tests: Erasure code read test and code cleanup (`issue#14513 <http://tracker.ceph.com/issues/14513>`_, `pr#17703 <https://github.com/ceph/ceph/pull/17703>`_, David Zafman)
-* core,tests: Erasure code recovery should send additional reads if necessary (`issue#21382 <http://tracker.ceph.com/issues/21382>`_, `pr#17920 <https://github.com/ceph/ceph/pull/17920>`_, David Zafman)
-* core,tests: osd,dmclock: fix dmclock test simulator change (`pr#20270 <https://github.com/ceph/ceph/pull/20270>`_, J. Eric Ivancich)
-* core,tests: os: kstore fix unittest for FiemapHole (`pr#17313 <https://github.com/ceph/ceph/pull/17313>`_, Ning Yao)
-* core,tests: os/memstore: memstore_page_set=false (`issue#20738 <http://tracker.ceph.com/issues/20738>`_, `pr#16995 <https://github.com/ceph/ceph/pull/16995>`_, Sage Weil)
-* core,tests: qa/ceph_manager: check pg state again before timedout (`issue#21294 <http://tracker.ceph.com/issues/21294>`_, `pr#17810 <https://github.com/ceph/ceph/pull/17810>`_, huangjun)
-* core,tests: qa/clusters/fixed-[23]: 4 osds per node, not 3 (`pr#16799 <https://github.com/ceph/ceph/pull/16799>`_, Sage Weil)
-* core,tests: qa: modify rgw default pool names (`pr#21630 <https://github.com/ceph/ceph/pull/21630>`_, Neha Ojha)
-* core,tests: qa/objectstore/bluestore\*: less debug output (`issue#20910 <http://tracker.ceph.com/issues/20910>`_, `pr#17505 <https://github.com/ceph/ceph/pull/17505>`_, Sage Weil)
-* core,tests: qa/overrides/2-size-2-min-size: whitelist REQUEST_STUCK (`pr#17243 <https://github.com/ceph/ceph/pull/17243>`_, Sage Weil)
-* core,tests: qa/standalone/ceph-helpers: pass --verbose to ceph-disk (`pr#19456 <https://github.com/ceph/ceph/pull/19456>`_, Sage Weil)
-* core,tests: qa/standalone/scrub/osd-scrub-repair: fix grep pattern (`issue#21127 <http://tracker.ceph.com/issues/21127>`_, `pr#17258 <https://github.com/ceph/ceph/pull/17258>`_, Sage Weil)
-* core,tests: qa/standalone/scrub/osd-scrub-snaps: adjust test for lack of snapdir objects (`pr#17927 <https://github.com/ceph/ceph/pull/17927>`_, Sage Weil)
-* core,tests: qa/suites/rados/monthrash: tolerate PG_AVAILABILITY during mon thrashing (`pr#18122 <https://github.com/ceph/ceph/pull/18122>`_, Sage Weil)
-* core,tests: qa/suites/rados/monthrash: whitelist SLOW_OPS (`pr#21331 <https://github.com/ceph/ceph/pull/21331>`_, Sage Weil)
-* core,tests: qa/suites/rados/objectstore: logs (`issue#20738 <http://tracker.ceph.com/issues/20738>`_, `pr#16923 <https://github.com/ceph/ceph/pull/16923>`_, Sage Weil)
-* core,tests: qa/suites/rados/perf: create pool with lower pg_num (`pr#17819 <https://github.com/ceph/ceph/pull/17819>`_, Neha Ojha)
-* core,tests: qa/suites/rados/rest/mgr-restful: whitelist more health (`pr#18457 <https://github.com/ceph/ceph/pull/18457>`_, Sage Weil)
-* core,tests: qa/suites/rados/rest: move rest_test from qa/suites/rest/ (`pr#19175 <https://github.com/ceph/ceph/pull/19175>`_, Sage Weil)
-* core,tests: qa/suites/rados/thrash: fix thrashing with ec vs map discon (`pr#16842 <https://github.com/ceph/ceph/pull/16842>`_, Sage Weil)
-* core,tests: qa/suites/rados/thrash-old-clients: add hammer clients (`pr#21703 <https://github.com/ceph/ceph/pull/21703>`_, Sage Weil)
-* core,tests: qa/suites/rados/thrash-old-clients: add rbd tests (`pr#21704 <https://github.com/ceph/ceph/pull/21704>`_, Sage Weil)
-* core,tests: qa/suites/rados/thrash-old-clients: do some thrashing with jewel and luminous clients (`pr#21679 <https://github.com/ceph/ceph/pull/21679>`_, Sage Weil)
-* core,tests: qa/suites/rados/thrash-old-clients: only centos and 16.04 (`pr#22125 <https://github.com/ceph/ceph/pull/22125>`_, Sage Weil)
-* core,tests: qa/suites/upgrade/jewel-x/stress-split: tolerate sloppy past_intervals (`pr#17226 <https://github.com/ceph/ceph/pull/17226>`_, Sage Weil)
-* core,tests: qa/suites/upgrade/luminous-x/stress-split: avoid enospc (`pr#21753 <https://github.com/ceph/ceph/pull/21753>`_, Sage Weil)
-* core,tests: qa/tasks/ceph_manager: revive osds before doing final rerr reset (`issue#21206 <http://tracker.ceph.com/issues/21206>`_, `pr#17406 <https://github.com/ceph/ceph/pull/17406>`_, Sage Weil)
-* core,tests: qa/tasks/ceph_manager: tolerate tell osd.\* error (`pr#19365 <https://github.com/ceph/ceph/pull/19365>`_, Sage Weil)
-* core,tests: qa/tasks/ceph.py: tolerate flush pg stats exception (`pr#16905 <https://github.com/ceph/ceph/pull/16905>`_, Sage Weil)
-* core,tests: qa/tasks/filestore_idempotent: shorter test (`pr#20509 <https://github.com/ceph/ceph/pull/20509>`_, Sage Weil)
-* core,tests: qa/tasks/thrashosds: set min_in default to 4 (`issue#21997 <http://tracker.ceph.com/issues/21997>`_, `pr#18670 <https://github.com/ceph/ceph/pull/18670>`_, Sage Weil)
-* core,tests: qa/tests: run ceph-ansible task on installer.0 role/node (`pr#19605 <https://github.com/ceph/ceph/pull/19605>`_, Yuri Weinstein)
-* core,tests: qa: tolerate failure to force backfill (`issue#22614 <http://tracker.ceph.com/issues/22614>`_, `pr#19765 <https://github.com/ceph/ceph/pull/19765>`_, Sage Weil)
-* core,tests: qa/workunits/rados/test_rados_tool: fix stray ``|``, race (`issue#22676 <http://tracker.ceph.com/issues/22676>`_, `pr#19946 <https://github.com/ceph/ceph/pull/19946>`_, Sage Weil)
-* core,tests: qa/workunits/rados/test.sh: ensure tee output is valid filename (`pr#21507 <https://github.com/ceph/ceph/pull/21507>`_, Sage Weil)
-* core,tests: rados: Initialization of alignment (`pr#17723 <https://github.com/ceph/ceph/pull/17723>`_, Amit Kumar)
-* core,tests: rados: Initializing members of librados/TestCase.h (`pr#16896 <https://github.com/ceph/ceph/pull/16896>`_, amitkuma)
-* core,tests: test: Checking fd for negative before closing (`pr#17190 <https://github.com/ceph/ceph/pull/17190>`_, amitkuma)
-* core,tests: test: Check to avoid divide by zero (`pr#17220 <https://github.com/ceph/ceph/pull/17220>`_, amitkuma)
-* core: tool: change default objectstore from filestore to bluestore (`pr#18066 <https://github.com/ceph/ceph/pull/18066>`_, Song Shun)
-* core: tool: misc cleanup of ceph-kvstore-tool (`issue#22092 <http://tracker.ceph.com/issues/22092>`_, `pr#18815 <https://github.com/ceph/ceph/pull/18815>`_, Chang Liu)
-* core,tools: Add export and remove ceph-objectstore-tool command option (`issue#21272 <http://tracker.ceph.com/issues/21272>`_, `pr#17538 <https://github.com/ceph/ceph/pull/17538>`_, David Zafman)
-* core,tools: ceph-objectstore-tool: fix import of post-split pg from pre-split ancestor (`issue#21753 <http://tracker.ceph.com/issues/21753>`_, `pr#18229 <https://github.com/ceph/ceph/pull/18229>`_, Sage Weil)
-* core: tools/ceph-objectstore-tool: split filestore directories offline to target hash level (`issue#21366 <http://tracker.ceph.com/issues/21366>`_, `pr#17666 <https://github.com/ceph/ceph/pull/17666>`_, Zhi Zhang)
-* core,tools: common, tool: update kvstore-tool to repair key/value database (`issue#17730 <http://tracker.ceph.com/issues/17730>`_, `issue#21744 <http://tracker.ceph.com/issues/21744>`_, `pr#16745 <https://github.com/ceph/ceph/pull/16745>`_, liuchang0812, Chang Liu)
-* core,tools: osd,os/bluestore: kill clang analyzer warnings (`pr#18015 <https://github.com/ceph/ceph/pull/18015>`_, Kefu Chai)
-* core: tools/rados: add touch command to change object modification time (`pr#18913 <https://github.com/ceph/ceph/pull/18913>`_, Yao Zongyou)
-* core,tools: scripts: add ptl-tool for scripting merges (`pr#17926 <https://github.com/ceph/ceph/pull/17926>`_, Patrick Donnelly)
-* core: vstart.sh: drop .ceph_port and use randomly selected available port (`pr#19268 <https://github.com/ceph/ceph/pull/19268>`_, Shinobu Kinjo)
-* core: vstart.sh: drop --{mon,osd,mds,rgw,mgr}_num options (`pr#18648 <https://github.com/ceph/ceph/pull/18648>`_, Kefu Chai)
-* core: vstart.sh: Remove duplicate global section (`pr#17543 <https://github.com/ceph/ceph/pull/17543>`_, iliul)
-* crush: cleanup update_device_class() log messages (`pr#21174 <https://github.com/ceph/ceph/pull/21174>`_, Gu Zhongyan)
-* crush: fix CrushCompiler won't compile maps with empty shadow tree (`pr#17058 <https://github.com/ceph/ceph/pull/17058>`_, xie xingguo)
-* crush: fix device_class_clone for unpopulated/empty weight-sets (`issue#23386 <http://tracker.ceph.com/issues/23386>`_, `pr#22169 <https://github.com/ceph/ceph/pull/22169>`_, Sage Weil)
-* crush: fix fast rule lookup when uniform (`pr#17510 <https://github.com/ceph/ceph/pull/17510>`_, Sage Weil)
-* crush: force rebuilding shadow hierarchy after swapping buckets (`pr#17083 <https://github.com/ceph/ceph/pull/17083>`_, xie xingguo)
-* crush: improve straw2 algorithm's readability (`pr#20196 <https://github.com/ceph/ceph/pull/20196>`_, Yao Zongyou)
-* crush: "osd crush class rename" support (`pr#16961 <https://github.com/ceph/ceph/pull/16961>`_, xie xingguo)
-* crush, osd: handle multiple parents properly when applying pg upmaps (`issue#23921 <http://tracker.ceph.com/issues/23921>`_, `pr#21835 <https://github.com/ceph/ceph/pull/21835>`_, xiexingguo)
-* crush: safe check for 'ceph osd crush swap-bucket' (`pr#17335 <https://github.com/ceph/ceph/pull/17335>`_, Carudy)
-* crush: various CrushWrapper cleanups (`pr#17360 <https://github.com/ceph/ceph/pull/17360>`_, Kefu Chai)
-* crush: various weight-set fixes (`pr#17014 <https://github.com/ceph/ceph/pull/17014>`_, xie xingguo)
-* denc: should check element's type not 'size_t' (`pr#19986 <https://github.com/ceph/ceph/pull/19986>`_, Kefu Chai)
-* denc: use constexpr-if to replace some SFINAE impls (`pr#19662 <https://github.com/ceph/ceph/pull/19662>`_, Kefu Chai)
-* doc: 12.1.3 release notes (`pr#16975 <https://github.com/ceph/ceph/pull/16975>`_, Abhishek Lekshmanan)
-* doc: 12.2.0 major release announcements (`pr#16915 <https://github.com/ceph/ceph/pull/16915>`_, Abhishek Lekshmanan)
-* doc: 12.2.1 release notes (`pr#18014 <https://github.com/ceph/ceph/pull/18014>`_, Abhishek Lekshmanan)
-* doc: 12.2.4 release notes (`pr#20619 <https://github.com/ceph/ceph/pull/20619>`_, Abhishek Lekshmanan)
-* doc: add 12.2.2 release notes (`pr#19264 <https://github.com/ceph/ceph/pull/19264>`_, Abhishek Lekshmanan)
-* doc: add allow_multimds and fs_name parameter (`pr#15847 <https://github.com/ceph/ceph/pull/15847>`_, Jan Fajerski)
-* doc: add ceph-kvstore-tool's man (`pr#17092 <https://github.com/ceph/ceph/pull/17092>`_, liuchang0812)
-* doc: add changelog for 12.2.1 (`pr#18020 <https://github.com/ceph/ceph/pull/18020>`_, Abhishek Lekshmanan)
-* doc: add changelog for v11.2.1 (`pr#16956 <https://github.com/ceph/ceph/pull/16956>`_, Abhishek Lekshmanan)
-* doc: add changelog for v12.2.2 (`pr#19284 <https://github.com/ceph/ceph/pull/19284>`_, Abhishek Lekshmanan)
-* doc: Added CHAP configuration instructions for iSCSI (`pr#18423 <https://github.com/ceph/ceph/pull/18423>`_, Ashish Singh)
-* doc: add example of setting pool in cephfs layout (`pr#17372 <https://github.com/ceph/ceph/pull/17372>`_, John Spray)
-* doc: Adding changelog for 10.2.10 (`pr#18151 <https://github.com/ceph/ceph/pull/18151>`_, Abhishek Lekshmanan)
-* doc: Add introduction about different way to run rbd-mirror (`pr#19692 <https://github.com/ceph/ceph/pull/19692>`_, Yu Shengzuo)
-* doc: add --max-buckets to radosgw-admin(8) (`pr#17439 <https://github.com/ceph/ceph/pull/17439>`_, Clément Pellegrini)
-* doc: add missing blank line (`pr#18724 <https://github.com/ceph/ceph/pull/18724>`_, iliul)
-* doc: Add missing pg states from doc (`pr#20504 <https://github.com/ceph/ceph/pull/20504>`_, David Zafman)
-* doc: add mount.fuse.ceph to index (`issue#22595 <http://tracker.ceph.com/issues/22595>`_, `pr#19792 <https://github.com/ceph/ceph/pull/19792>`_, Jos Collin)
-* doc: Add newbie-friendly updates to Helm start doc (`pr#18886 <https://github.com/ceph/ceph/pull/18886>`_, Blaine Gardner)
-* doc: add osd_max_object_size in osd configuration (`pr#18115 <https://github.com/ceph/ceph/pull/18115>`_, Mohamad Gebai)
-* doc: build-doc: Upgrade ceph python libraries (`pr#20726 <https://github.com/ceph/ceph/pull/20726>`_, Boris Ranto)
-* doc: ceph-disk: create deprecation warnings (`issue#22154 <http://tracker.ceph.com/issues/22154>`_, `pr#18988 <https://github.com/ceph/ceph/pull/18988>`_, Alfredo Deza)
-* doc: ceph-volume: automatic VDO detection (`issue#23581 <http://tracker.ceph.com/issues/23581>`_, `pr#21451 <https://github.com/ceph/ceph/pull/21451>`_, Alfredo Deza)
-* doc: ceph-volume docs (`pr#17068 <https://github.com/ceph/ceph/pull/17068>`_, Alfredo Deza)
-* doc: ceph-volume document multipath support (`pr#20878 <https://github.com/ceph/ceph/pull/20878>`_, Alfredo Deza)
-* doc: ceph-volume doc updates (`pr#20758 <https://github.com/ceph/ceph/pull/20758>`_, Alfredo Deza)
-* doc: ceph-volume include physical devices associated with an LV when listing (`pr#21645 <https://github.com/ceph/ceph/pull/21645>`_, Alfredo Deza)
-* doc: ceph-volume lvm bluestore support (`pr#18448 <https://github.com/ceph/ceph/pull/18448>`_, Alfredo Deza)
-* doc/ceph-volume OSD use the fsid file, not the osd_fsid (`issue#22427 <http://tracker.ceph.com/issues/22427>`_, `pr#20059 <https://github.com/ceph/ceph/pull/20059>`_, Alfredo Deza)
-* doc: change boolean option default value from zero to false (`pr#17733 <https://github.com/ceph/ceph/pull/17733>`_, Yao Zongyou)
-* doc: change cn mirror to ustc domain (`pr#18081 <https://github.com/ceph/ceph/pull/18081>`_, Shengjing Zhu)
-* doc: changelog for v12.2.3 (`pr#20503 <https://github.com/ceph/ceph/pull/20503>`_, Abhishek Lekshmanan)
-* doc: cleanup erasure coded pool doc on cephfs use (`pr#20572 <https://github.com/ceph/ceph/pull/20572>`_, Patrick Donnelly)
-* doc: CodingStyle: add python and javascript/typescript (`pr#20186 <https://github.com/ceph/ceph/pull/20186>`_, Joao Eduardo Luis)
-* doc: common/options: document filestore and filejournal options (`pr#17739 <https://github.com/ceph/ceph/pull/17739>`_, Sage Weil)
-* doc: common/options: document objecter, filer, and journal options (`pr#17740 <https://github.com/ceph/ceph/pull/17740>`_, Sage Weil)
-* doc: complete and update the subsystem logging level info table (`pr#18500 <https://github.com/ceph/ceph/pull/18500>`_, Luo Kexue)
-* doc: correcting typos in bluestore-config-ref and bluestore-migration (`pr#19154 <https://github.com/ceph/ceph/pull/19154>`_, Katie Holly)
-* doc: correct wrong bluestore config types (`pr#18205 <https://github.com/ceph/ceph/pull/18205>`_, Yao Zongyou)
-* doc: delete duplicate words (`pr#17104 <https://github.com/ceph/ceph/pull/17104>`_, iliul)
-* doc: dev description of async recovery (`pr#21051 <https://github.com/ceph/ceph/pull/21051>`_, Neha Ojha, Josh Durgin)
-* doc: doc/bluestore: add SPDK usage for bluestore (`pr#17654 <https://github.com/ceph/ceph/pull/17654>`_, Haomai Wang)
-* doc:  doc/cephfs/experimental-features: kernel client snapshots limit (`pr#18579 <https://github.com/ceph/ceph/pull/18579>`_, Ilya Dryomov)
-* doc: doc/cephfs/posix: remove stale information for seekdir (`pr#17658 <https://github.com/ceph/ceph/pull/17658>`_, "Yan, Zheng")
-* doc: doc/conf.py: do not set html_use_smartypants explicitly (`pr#17127 <https://github.com/ceph/ceph/pull/17127>`_, Kefu Chai)
-* doc: doc/dev: add a brief guide to serialization (`pr#20131 <https://github.com/ceph/ceph/pull/20131>`_, John Spray)
-* doc: doc/dev/cxx: add C++11 ABI related doc (`pr#20030 <https://github.com/ceph/ceph/pull/20030>`_, Kefu Chai)
-* doc: doc/dev/iana: document our official IANA numbers (`pr#16910 <https://github.com/ceph/ceph/pull/16910>`_, Sage Weil)
-* doc: doc/dev/index: update rados lead (`pr#16911 <https://github.com/ceph/ceph/pull/16911>`_, Sage Weil)
-* doc: doc/dev/macos: add doc for building on MacOS (`pr#20031 <https://github.com/ceph/ceph/pull/20031>`_, Kefu Chai)
-* doc: doc/dev/msgr2.rst: a few notes on protocol goals (`pr#20083 <https://github.com/ceph/ceph/pull/20083>`_, Sage Weil)
-* doc: doc/dev/perf: add doc on disabling -fomit-frame-pointer (`pr#17358 <https://github.com/ceph/ceph/pull/17358>`_, Kefu Chai)
-* doc: doc for mount.fuse.ceph (`issue#21539 <http://tracker.ceph.com/issues/21539>`_, `pr#19172 <https://github.com/ceph/ceph/pull/19172>`_, Jos Collin)
-* doc: doc/man remove deprecation of ceph-disk man page title (`pr#19325 <https://github.com/ceph/ceph/pull/19325>`_, Alfredo Deza)
-* doc: doc/mgr: Add limitations section to plugin guide (`pr#21347 <https://github.com/ceph/ceph/pull/21347>`_, Tim Serong)
-* doc: doc/mgr: add "local pool" plugin to toc (`pr#17961 <https://github.com/ceph/ceph/pull/17961>`_, Kefu Chai)
-* doc: doc/mgr/balancer: document (`issue#22789 <http://tracker.ceph.com/issues/22789>`_, `pr#21421 <https://github.com/ceph/ceph/pull/21421>`_, Sage Weil)
-* doc: doc/mgr: document facilities methods using `automethod` directive (`pr#18680 <https://github.com/ceph/ceph/pull/18680>`_, Kefu Chai)
-* doc: doc/mgr/plugins: add note about distinction between config and kv store (`pr#21671 <https://github.com/ceph/ceph/pull/21671>`_, Jan Fajerski)
-* doc: doc/mgr: remove non user-facing code from doc (`pr#20372 <https://github.com/ceph/ceph/pull/20372>`_, Kefu Chai)
-* doc: doc,os,osdc: drop and modify comments (`pr#17732 <https://github.com/ceph/ceph/pull/17732>`_, songweibin)
-* doc: doc/rados: Add explanation of straw2 (`pr#19247 <https://github.com/ceph/ceph/pull/19247>`_, Shinobu Kinjo)
-* doc: doc/rados/operations/bluestore-migration: document bluestore migration process (`pr#16918 <https://github.com/ceph/ceph/pull/16918>`_, Sage Weil)
-* doc: doc/rados/operations/bluestore-migration: update docs a bit (`pr#17011 <https://github.com/ceph/ceph/pull/17011>`_, Sage Weil)
-* doc: doc raise exceptions with a base class (`pr#18152 <https://github.com/ceph/ceph/pull/18152>`_, Alfredo Deza)
-* doc: doc/rbd: add info for rbd group (`pr#17633 <https://github.com/ceph/ceph/pull/17633>`_, yonghengdexin735)
-* doc:  doc/rbd: add missing several commands in rbd CLI man page (`issue#14539 <http://tracker.ceph.com/issues/14539>`_, `issue#16999 <http://tracker.ceph.com/issues/16999>`_, `pr#19659 <https://github.com/ceph/ceph/pull/19659>`_, songweibin)
-* doc: doc/rbd: correct the path of librbd python APIs (`pr#19690 <https://github.com/ceph/ceph/pull/19690>`_, songweibin)
-* doc: doc/rbd: fix typo s/morror/mirror (`pr#19997 <https://github.com/ceph/ceph/pull/19997>`_, songweibin)
-* doc: doc/rbd: iSCSI Gateway Documentation (`issue#20437 <http://tracker.ceph.com/issues/20437>`_, `pr#17376 <https://github.com/ceph/ceph/pull/17376>`_, Aron Gunn, Jason Dillaman)
-* doc: doc/rbd: specify additional ESX prerequisites (`pr#18517 <https://github.com/ceph/ceph/pull/18517>`_, Jason Dillaman)
-* doc: doc/rbd: tweaks for the LIO iSCSI gateway (`issue#21763 <http://tracker.ceph.com/issues/21763>`_, `pr#18250 <https://github.com/ceph/ceph/pull/18250>`_, Jason Dillaman)
-* doc: doc/rbd: tweaks to the Windows iSCSI initiator directions (`pr#18704 <https://github.com/ceph/ceph/pull/18704>`_, Jason Dillaman)
-* doc: doc/release-notes: add jewel->kraken notes (`pr#18482 <https://github.com/ceph/ceph/pull/18482>`_, Sage Weil)
-* doc: doc/release-notes: clarify purpose of require-osd-release (`pr#17270 <https://github.com/ceph/ceph/pull/17270>`_, Sage Weil)
-* doc: doc/release-notes: clarify that you need to keep your existing OSD caps (`pr#18825 <https://github.com/ceph/ceph/pull/18825>`_, Jason Dillaman)
-* doc: doc/release-notes: ensure RBD users can blacklist prior to upgrade (`issue#21353 <http://tracker.ceph.com/issues/21353>`_, `pr#17755 <https://github.com/ceph/ceph/pull/17755>`_, Jason Dillaman)
-* doc: doc/release-notes: fix typo 'psd' to 'osd' (`pr#18695 <https://github.com/ceph/ceph/pull/18695>`_, wangsongbo)
-* doc: doc/releases: the Kraken sleepeth, faintest sunlights flee (`pr#17424 <https://github.com/ceph/ceph/pull/17424>`_, Abhishek Lekshmanan)
-* doc: doc/releases: update release cycle docs (`pr#18117 <https://github.com/ceph/ceph/pull/18117>`_, Sage Weil)
-* doc: doc/rgw: add page for http frontend configuration (`issue#13523 <http://tracker.ceph.com/issues/13523>`_, `pr#20058 <https://github.com/ceph/ceph/pull/20058>`_, Casey Bodley)
-* doc: doc/scripts: py3 compatible (`pr#17640 <https://github.com/ceph/ceph/pull/17640>`_, Kefu Chai)
-* doc: docs: Do not use "min size = 1" as an example (`pr#17912 <https://github.com/ceph/ceph/pull/17912>`_, Alfredo Deza)
-* doc: docs fix ceph-volume missing sub-commands (`issue#23148 <http://tracker.ceph.com/issues/23148>`_, `pr#20673 <https://github.com/ceph/ceph/pull/20673>`_, Alfredo Deza)
-* doc: doc/start/os-recommendations.rst: bump krbd kernels (`pr#21478 <https://github.com/ceph/ceph/pull/21478>`_, Ilya Dryomov)
-* doc: docs update ceph-deploy reference to reflect ceph-volume API (`pr#20510 <https://github.com/ceph/ceph/pull/20510>`_, Alfredo Deza)
-* doc: document ceph-disk prepare class hierarchy (`pr#17019 <https://github.com/ceph/ceph/pull/17019>`_, Loic Dachary)
-* doc: document include/ipaddr.h (`issue#12056 <http://tracker.ceph.com/issues/12056>`_, `pr#17613 <https://github.com/ceph/ceph/pull/17613>`_, Nathan Cutler)
-* doc: drop duplicate line in ceph-bluestore-tool man page (`pr#19169 <https://github.com/ceph/ceph/pull/19169>`_, Xiaojun Liao)
-* doc: eliminate useless cat statement (`pr#17154 <https://github.com/ceph/ceph/pull/17154>`_, Ken Dreyer)
-* doc: examples: add new librbd example (`pr#18314 <https://github.com/ceph/ceph/pull/18314>`_, Mahati Chamarthy)
-* doc: expand developer documentation of unit tests (`pr#19594 <https://github.com/ceph/ceph/pull/19594>`_, Nathan Cutler)
-* doc: Fix a grammar error in rbd-snapshot.rst (`pr#21470 <https://github.com/ceph/ceph/pull/21470>`_, Zeqing Tyler Qi)
-* doc: fix CFLAGS in doc/dev/cpu-profiler.rst (`pr#19752 <https://github.com/ceph/ceph/pull/19752>`_, Chang Liu)
-* doc: fix desc of option "mon cluster log file" (`pr#18770 <https://github.com/ceph/ceph/pull/18770>`_, Kefu Chai)
-* doc: fix doc/radosgw/admin.rst typos (`pr#17397 <https://github.com/ceph/ceph/pull/17397>`_, Enming Zhang)
-* doc: Fix dynamic resharding doc formatting (`pr#20970 <https://github.com/ceph/ceph/pull/20970>`_, Ashish Singh)
-* doc: fix error in osd scrub load threshold (`pr#21678 <https://github.com/ceph/ceph/pull/21678>`_, Dirk Sarpe)
-* doc: Fixes a spelling error and a broken hyperlink (`pr#20442 <https://github.com/ceph/ceph/pull/20442>`_, Jordan Hus)
-* doc: Fixes rbd snapshot flatten example (`issue#17723 <http://tracker.ceph.com/issues/17723>`_, `pr#17436 <https://github.com/ceph/ceph/pull/17436>`_, Ashish Singh)
-* doc: fixes syntax in osd-config-ref (`issue#21733 <http://tracker.ceph.com/issues/21733>`_, `pr#18188 <https://github.com/ceph/ceph/pull/18188>`_, Joshua Schmid)
-* doc: Fixes the name of the CephFS snapshot directory (`pr#18710 <https://github.com/ceph/ceph/pull/18710>`_, Jordan Rodgers)
-* doc: fix hyper link to radosgw/config-ref (`pr#17986 <https://github.com/ceph/ceph/pull/17986>`_, Kefu Chai)
-* doc: fix librbdpy example (`pr#20019 <https://github.com/ceph/ceph/pull/20019>`_, Yuan Zhou)
-* doc: fix order of options in osd new (`issue#21023 <http://tracker.ceph.com/issues/21023>`_, `pr#17326 <https://github.com/ceph/ceph/pull/17326>`_, Neha Ojha)
-* doc: fix sphinx build warnings and errors (`pr#17025 <https://github.com/ceph/ceph/pull/17025>`_, Alfredo Deza)
-* doc: fix the desc of "osd max pg per osd hard ratio" (`pr#18373 <https://github.com/ceph/ceph/pull/18373>`_, Kefu Chai)
-* doc: Fix typo and URL (`pr#18040 <https://github.com/ceph/ceph/pull/18040>`_, Jos Collin)
-* doc: fix typo e.g,. => e.g (`pr#18607 <https://github.com/ceph/ceph/pull/18607>`_, Yao Zongyou)
-* doc: fix typo in bluestore-migration.rst (`pr#18389 <https://github.com/ceph/ceph/pull/18389>`_, Yao Zongyou)
-* doc: Fix typo in mount.fuse.ceph (`pr#19215 <https://github.com/ceph/ceph/pull/19215>`_, Jos Collin)
-* doc: fix typo in php.rst (`pr#17762 <https://github.com/ceph/ceph/pull/17762>`_, Yao Zongyou)
-* doc: fix typo in radosgw/dynamicresharding.rst (`pr#18651 <https://github.com/ceph/ceph/pull/18651>`_, Alexander Ermolaev)
-* doc: fix typo on specify db block device (`pr#17590 <https://github.com/ceph/ceph/pull/17590>`_, Xiaoxi Chen)
-* doc: Fix typo s/applicatoin/application/ (`pr#20720 <https://github.com/ceph/ceph/pull/20720>`_, Francois Deppierraz)
-* doc: Fix typos in placement-groups.rst (`pr#17973 <https://github.com/ceph/ceph/pull/17973>`_, Matt Boyle)
-* doc: Fix typos in release notes (`pr#18950 <https://github.com/ceph/ceph/pull/18950>`_, Stefan Knorr)
-* doc: .githubmap: Add cbodley (`pr#18946 <https://github.com/ceph/ceph/pull/18946>`_, Jos Collin)
-* doc: githubmap: add map for GitHub contributor lookup (`pr#17457 <https://github.com/ceph/ceph/pull/17457>`_, Patrick Donnelly)
-* doc: .githubmap, .mailmap, .organizationmap, .peoplemap: update Igor (`pr#19314 <https://github.com/ceph/ceph/pull/19314>`_, Igor Fedotov)
-* doc: globally change CRUSH ruleset to CRUSH rule (`issue#20559 <http://tracker.ceph.com/issues/20559>`_, `pr#19435 <https://github.com/ceph/ceph/pull/19435>`_, Nathan Cutler)
-* doc: Improved dashboard documentation (`pr#21443 <https://github.com/ceph/ceph/pull/21443>`_, Lenz Grimmer)
-* doc: Improved hitset parameters description (`pr#19691 <https://github.com/ceph/ceph/pull/19691>`_, Alexey Stupnikov)
-* doc: improve links in doc/releases.rst (`pr#18155 <https://github.com/ceph/ceph/pull/18155>`_, Nathan Cutler)
-* doc: Improve mgr/restful module documentation (`pr#20717 <https://github.com/ceph/ceph/pull/20717>`_, Boris Ranto)
-* doc: Improve the ceph fs set max_mds command (`issue#21007 <http://tracker.ceph.com/issues/21007>`_, `pr#17044 <https://github.com/ceph/ceph/pull/17044>`_, Bara Ancincova)
-* doc: include ceph-disk and ceph-disk-volume man pages in index (`pr#17168 <https://github.com/ceph/ceph/pull/17168>`_, Alfredo Deza)
-* doc: init flags to 0 in rados example (`pr#20671 <https://github.com/ceph/ceph/pull/20671>`_, Patrick Donnelly)
-* doc: Kube + Helm installation (`pr#18520 <https://github.com/ceph/ceph/pull/18520>`_, Alexandre Marangone)
-* doc: legal: remove doc license ambiguity (`issue#23336 <http://tracker.ceph.com/issues/23336>`_, `pr#20876 <https://github.com/ceph/ceph/pull/20876>`_, Nathan Cutler)
-* doc: lock_timeout is a per mapping option (`pr#21563 <https://github.com/ceph/ceph/pull/21563>`_, Ilya Dryomov)
-* doc: log-and-debug: fix default value of "log max recent" (`pr#20316 <https://github.com/ceph/ceph/pull/20316>`_, Nathan Cutler)
-* doc: mailmap: Add Sibei, XueYu Affiliation (`pr#18395 <https://github.com/ceph/ceph/pull/18395>`_, Sibei Gao)
-* doc: mailmap: Fixed maintenance guide URL (`pr#18076 <https://github.com/ceph/ceph/pull/18076>`_, Jos Collin)
-* doc: mailmap, organizationmap: add Dongsheng, Liuzhong, Pengcheng, Yang Affiliation (`pr#17548 <https://github.com/ceph/ceph/pull/17548>`_, Dongsheng Yang)
-* doc: .mailmap, .organizationmap: add Fufei, Mingqiao and Ying Affiliation (`pr#17540 <https://github.com/ceph/ceph/pull/17540>`_, Ying He)
-* doc: .mailmap, .organizationmap: Add Liu Lei's mailmap and affiliation (`pr#17105 <https://github.com/ceph/ceph/pull/17105>`_, iliul)
-* doc: .mailmap, .organizationmap: update JingChen, ZongyouYao, ShanchunLv's… (`pr#18960 <https://github.com/ceph/ceph/pull/18960>`_, Chang Liu)
-* doc: mailmap: update affiliation for Mykola Golub (`pr#18069 <https://github.com/ceph/ceph/pull/18069>`_, Mykola Golub)
-* doc: mailmap: update affiliation for Mykola Golub (`pr#19667 <https://github.com/ceph/ceph/pull/19667>`_, Mykola Golub)
-* doc: mailmap: Update umcloud affiliation (`pr#17441 <https://github.com/ceph/ceph/pull/17441>`_, Yixing Yan)
-* doc: make the commands in README.md properly aligned (`pr#18639 <https://github.com/ceph/ceph/pull/18639>`_, Yao Zongyou)
-* doc/man: add "ls" to "ceph osd" command's subcommands list (`pr#19382 <https://github.com/ceph/ceph/pull/19382>`_, Rishabh Dave)
-* doc: "mds blacklist interval" vs manually blacklisting (`pr#18195 <https://github.com/ceph/ceph/pull/18195>`_, Ken Dreyer)
-* doc: mgr/dashboard.rst: mention ceph.conf and ceph mgr services (`pr#20961 <https://github.com/ceph/ceph/pull/20961>`_, Nathan Cutler)
-* doc/mgr/plugins: mgr accessor during init causes exception (`pr#16973 <https://github.com/ceph/ceph/pull/16973>`_, Jan Fajerski)
-* doc: mimic: doc: Updated dashboard documentation (features, SSL config) (`pr#22079 <https://github.com/ceph/ceph/pull/22079>`_, Lenz Grimmer)
-* doc: misc fix spell errors in osd/OSD and doc (`pr#17107 <https://github.com/ceph/ceph/pull/17107>`_, songweibin)
-* doc: misc: fix various spelling errors (`pr#20831 <https://github.com/ceph/ceph/pull/20831>`_, Shengjing Zhu)
-* doc: Misc iSCSI doc updates (`pr#19931 <https://github.com/ceph/ceph/pull/19931>`_, Mike Christie)
-* doc: move glance_api_version option to the right place (`pr#17337 <https://github.com/ceph/ceph/pull/17337>`_, Luo Kexue)
-* doc: options.cc: document rgw config options (`pr#18007 <https://github.com/ceph/ceph/pull/18007>`_, Yehuda Sadeh)
-* doc: organizationmap: Add Adam Wolfe Gordon's affiliation (`pr#18295 <https://github.com/ceph/ceph/pull/18295>`_, Adam Wolfe Gordon)
-* doc: organizationmap: Add Ashish Singh affiliation (`pr#17109 <https://github.com/ceph/ceph/pull/17109>`_, Ashish Singh)
-* doc: .organizationmap: add Xin Yuan and Yichao Li's affiliation (`pr#21170 <https://github.com/ceph/ceph/pull/21170>`_, Li Wang)
-* doc: PendingReleaseNotes: Added note about Dashboard v2, fixed typo (`pr#21597 <https://github.com/ceph/ceph/pull/21597>`_, Lenz Grimmer)
-* doc: PendingReleaseNotes:Announce FreeBSD availability (`pr#16782 <https://github.com/ceph/ceph/pull/16782>`_, Willem Jan Withagen)
-* doc: PendingReleaseNotes: mention some monitor changes (`pr#21474 <https://github.com/ceph/ceph/pull/21474>`_, Joao Eduardo Luis)
-* doc: PendingReleaseNotes: note about upmap mapping change in luminous release notes (`pr#17813 <https://github.com/ceph/ceph/pull/17813>`_, Sage Weil)
-* doc: qa,doc: drop support of ubuntu trusty (`pr#19307 <https://github.com/ceph/ceph/pull/19307>`_, Kefu Chai)
-* doc/rados/operations/bluestore-migration: typos and whitespace (`pr#16991 <https://github.com/ceph/ceph/pull/16991>`_, Sage Weil)
-* doc/rados/operations/bluestore-migration: typos (`pr#17581 <https://github.com/ceph/ceph/pull/17581>`_, Sage Weil)
-* doc: README: Improve vstart.sh usage (`pr#17644 <https://github.com/ceph/ceph/pull/17644>`_, Fabian Vogt)
-* doc: README.md: bump up cmake to 2.8.12 (`pr#18348 <https://github.com/ceph/ceph/pull/18348>`_, Yan Jun)
-* doc: redundant "cephfs" when set the "allow_multimds" (`pr#20045 <https://github.com/ceph/ceph/pull/20045>`_, Shangzhong Zhu)
-* doc: release notes: fix grammar/style nits (`pr#18876 <https://github.com/ceph/ceph/pull/18876>`_, Nathan Cutler)
-* doc: release notes for 12.2.3 (`pr#20500 <https://github.com/ceph/ceph/pull/20500>`_, Abhishek Lekshmanan)
-* doc: release notes for v12.1.4 Luminous (`pr#17037 <https://github.com/ceph/ceph/pull/17037>`_, Abhishek Lekshmanan)
-* doc/release-notes: remove mention of crush weight optimization (`pr#16974 <https://github.com/ceph/ceph/pull/16974>`_, Sage Weil)
-* doc: release-notes.rst: add Kraken v11.2.1 and update releases.rst (`pr#16879 <https://github.com/ceph/ceph/pull/16879>`_, Nathan Cutler)
-* doc: release notes update for 10.2.10 (`pr#18148 <https://github.com/ceph/ceph/pull/18148>`_, Abhishek Lekshmanan)
-* doc/releases: drop LTS/stable line from second chart (`pr#18153 <https://github.com/ceph/ceph/pull/18153>`_, Sage Weil)
-* doc: Remove additional arguments when replacing OSD (`pr#18345 <https://github.com/ceph/ceph/pull/18345>`_, Wido den Hollander)
-* doc: remove duplicated --max-buckets option desc (`pr#19737 <https://github.com/ceph/ceph/pull/19737>`_, Kefu Chai)
-* doc: remove references to unversioned repository addresses (`pr#21357 <https://github.com/ceph/ceph/pull/21357>`_, Greg Farnum)
-* doc: remove unused config: "osd op threads" (`pr#21319 <https://github.com/ceph/ceph/pull/21319>`_, Jianpeng Ma)
-* doc: rename changelog with a .txt extension (`pr#18156 <https://github.com/ceph/ceph/pull/18156>`_, Abhishek Lekshmanan)
-* doc: reorganize releases (`pr#20784 <https://github.com/ceph/ceph/pull/20784>`_, Abhishek Lekshmanan)
-* doc: replace injectargs usage with "config set" (`pr#18789 <https://github.com/ceph/ceph/pull/18789>`_, John Spray)
-* doc: replace region with zonegroup in configure bucket sharding section (`issue#21610 <http://tracker.ceph.com/issues/21610>`_, `pr#18063 <https://github.com/ceph/ceph/pull/18063>`_, Orit Wasserman)
-* doc: restructure bluestore migration insructions (`pr#17603 <https://github.com/ceph/ceph/pull/17603>`_, Sage Weil)
-* doc: Revise the Example of Bucket Policy (`pr#17362 <https://github.com/ceph/ceph/pull/17362>`_, zhangwen)
-* doc: rgw: add a note for resharding in 12.2.1 docs (`pr#17675 <https://github.com/ceph/ceph/pull/17675>`_, Abhishek Lekshmanan)
-* doc: rgw add some basic documentation for sync plugins & ES (`pr#15849 <https://github.com/ceph/ceph/pull/15849>`_, Abhishek Lekshmanan)
-* doc: rgw adminops binding libraries (`pr#19164 <https://github.com/ceph/ceph/pull/19164>`_, hrchu)
-* doc: rgw mention about tagging & bucket policies in s3api (`pr#16907 <https://github.com/ceph/ceph/pull/16907>`_, Abhishek Lekshmanan)
-* doc: rgw: mention the civetweb support for binding to multiple ports (`issue#20942 <http://tracker.ceph.com/issues/20942>`_, `pr#17141 <https://github.com/ceph/ceph/pull/17141>`_, Abhishek Lekshmanan)
-* doc: rm stray ")" character from mds config ref (`pr#18228 <https://github.com/ceph/ceph/pull/18228>`_, Ken Dreyer)
-* docs: ceph-volume CLI updates (`pr#17425 <https://github.com/ceph/ceph/pull/17425>`_, Alfredo Deza)
-* doc: s/deamon/daemon/ (`pr#20931 <https://github.com/ceph/ceph/pull/20931>`_, ashitakasam)
-* doc: some improvements to ceph-conf.rst (`pr#21268 <https://github.com/ceph/ceph/pull/21268>`_, Nathan Cutler)
-* doc: Specify mount details in ceph-fuse (`pr#20071 <https://github.com/ceph/ceph/pull/20071>`_, Jos Collin)
-* doc: SubmittingPatches: clarify PR title section (`pr#17143 <https://github.com/ceph/ceph/pull/17143>`_, Nathan Cutler)
-* doc/templates update toctree call to include hidden entries (`pr#17076 <https://github.com/ceph/ceph/pull/17076>`_, Alfredo Deza)
-* doc: the client inputs the pool name instead of pool ID (`pr#17672 <https://github.com/ceph/ceph/pull/17672>`_, Frank Yu)
-* doc: typo fix (`pr#21077 <https://github.com/ceph/ceph/pull/21077>`_, Ashita Dashottar)
-* doc: update Blacklisting and OSD epoch barrier (`issue#22542 <http://tracker.ceph.com/issues/22542>`_, `pr#19701 <https://github.com/ceph/ceph/pull/19701>`_, Jos Collin)
-* doc: update ceph-disk with a state-transition diagram (`pr#17639 <https://github.com/ceph/ceph/pull/17639>`_, Kefu Chai)
-* doc: update ceph iscsi kernel and package info (`pr#20020 <https://github.com/ceph/ceph/pull/20020>`_, Mike Christie)
-* doc: Update commands and options in radosgw-admin (`pr#18267 <https://github.com/ceph/ceph/pull/18267>`_, Jos Collin)
-* doc: update Component Technical Leads and maintainers to canonical location (`pr#18376 <https://github.com/ceph/ceph/pull/18376>`_, Patrick McGarry)
-* doc: Update config file search paths to reflect reality (`pr#19882 <https://github.com/ceph/ceph/pull/19882>`_, Adam Wolfe Gordon)
-* doc: updated add primary storage documentation for latest CloudStack release (4.11) (`pr#21050 <https://github.com/ceph/ceph/pull/21050>`_, James McClune, John Wilkins)
-* doc: Update dashboard feature list (added RGW management) (`pr#21781 <https://github.com/ceph/ceph/pull/21781>`_, Lenz Grimmer)
-* doc: updated dashboard feature list (added new RGW details, Pools) (`pr#21562 <https://github.com/ceph/ceph/pull/21562>`_, Lenz Grimmer)
-* doc: Updated dashboard feature list (`pr#21693 <https://github.com/ceph/ceph/pull/21693>`_, Lenz Grimmer)
-* doc: Updated dashboard v2 feature list (`pr#20755 <https://github.com/ceph/ceph/pull/20755>`_, Lenz Grimmer)
-* doc: Updated documentation for Zabbix Mgr module (`pr#18356 <https://github.com/ceph/ceph/pull/18356>`_, Wido den Hollander)
-* doc: update default value of option mon_sync_timeout (`pr#17802 <https://github.com/ceph/ceph/pull/17802>`_, Yao Guotao)
-* doc: update default value of parameter mon_subscribe_interval (`pr#17669 <https://github.com/ceph/ceph/pull/17669>`_, yaoguotao)
-* doc: Update docs to remove gitbuilder and add shaman references (`pr#17022 <https://github.com/ceph/ceph/pull/17022>`_, Alfredo Deza)
-* doc: updated the dashboard feature list (`pr#21531 <https://github.com/ceph/ceph/pull/21531>`_, Lenz Grimmer)
-* doc: Updated the get-packages.rst to luminous (`pr#20815 <https://github.com/ceph/ceph/pull/20815>`_, Kai Wagner)
-* doc: update firewall doc to mention ceph-mgr (`pr#17974 <https://github.com/ceph/ceph/pull/17974>`_, John Spray)
-* doc: update iSCSI upstream kernel to 4.16 (`pr#20695 <https://github.com/ceph/ceph/pull/20695>`_, Mike Christie)
-* doc: update link to placing-different-pools (`pr#17833 <https://github.com/ceph/ceph/pull/17833>`_, Mohamad Gebai)
-* doc: update Li Wang Affiliation (`pr#18060 <https://github.com/ceph/ceph/pull/18060>`_, Li Wang)
-* doc: update man page to explain ceph-volume support bluestore (`issue#22663 <http://tracker.ceph.com/issues/22663>`_, `pr#19960 <https://github.com/ceph/ceph/pull/19960>`_, lijing)
-* doc: Update manual deployment (`issue#20309 <http://tracker.ceph.com/issues/20309>`_, `pr#15811 <https://github.com/ceph/ceph/pull/15811>`_, Jens Rosenboom)
-* doc: update mgr/dashboard doc about standbys (`pr#19879 <https://github.com/ceph/ceph/pull/19879>`_, John Spray)
-* doc: Update mgr doc on how to enable Zabbix module (`pr#16861 <https://github.com/ceph/ceph/pull/16861>`_, Wido den Hollander)
-* doc: update mgr related auth settings (`pr#20126 <https://github.com/ceph/ceph/pull/20126>`_, Kefu Chai)
-* doc: Update monitoring.rst (`pr#20630 <https://github.com/ceph/ceph/pull/20630>`_, Jos Collin)
-* doc: update rbd-mirroring documentation (`issue#20701 <http://tracker.ceph.com/issues/20701>`_, `pr#16908 <https://github.com/ceph/ceph/pull/16908>`_, Jason Dillaman)
-* doc: update references to use ceph-volume (`pr#19241 <https://github.com/ceph/ceph/pull/19241>`_, Alfredo Deza)
-* doc: update releases to the current state (`pr#17364 <https://github.com/ceph/ceph/pull/17364>`_, Abhishek Lekshmanan)
-* doc: Updates to bluestore migration doc (`pr#17602 <https://github.com/ceph/ceph/pull/17602>`_, David Galloway)
-* doc: v12.2.5 luminous release notes (`pr#21621 <https://github.com/ceph/ceph/pull/21621>`_, Abhishek Lekshmanan)
-* doc: various cleanups (`pr#18480 <https://github.com/ceph/ceph/pull/18480>`_, Kefu Chai)
-* examples: fix link order in librados example Makefile (`pr#17842 <https://github.com/ceph/ceph/pull/17842>`_, Mahati Chamarthy)
-* Fix ceph-mgr restarts (`pr#22051 <https://github.com/ceph/ceph/pull/22051>`_, Boris Ranto)
-* follow-up fixups for atomic_t spinlocks (`pr#17611 <https://github.com/ceph/ceph/pull/17611>`_, Jesse Williamson)
-* githubmap: Add ktdreyer (`pr#19209 <https://github.com/ceph/ceph/pull/19209>`_, Jos Collin)
-* include/buffer.h: fix typo in comment (`pr#17489 <https://github.com/ceph/ceph/pull/17489>`_, mychoxin)
-* include/ceph_features: fix OS_PERF_STAT_NS's incarnation (`pr#21467 <https://github.com/ceph/ceph/pull/21467>`_, Kefu Chai)
-* install-deps.sh: fix an error condition expression (`pr#20819 <https://github.com/ceph/ceph/pull/20819>`_, Yao Guotao)
-* java/native: fix milliseconds to mtime/atime conversion (`pr#17460 <https://github.com/ceph/ceph/pull/17460>`_, dengquan)
-* java/native: s/jni: lstat/jni: stat in native_ceph_stat (`pr#20142 <https://github.com/ceph/ceph/pull/20142>`_, Shangzhong Zhu)
-* KStore: statfs needs extra includes on FreeBSD (`pr#21429 <https://github.com/ceph/ceph/pull/21429>`_, Willem Jan Withagen)
-* kv/leveldb: fix deadlock when close db (`pr#16643 <https://github.com/ceph/ceph/pull/16643>`_, Zengran)
-* kv: unify {create_and\_,}open() methods (`pr#18177 <https://github.com/ceph/ceph/pull/18177>`_, Kefu Chai)
-* librados: add async interfaces for use with Networking TS (`pr#19054 <https://github.com/ceph/ceph/pull/19054>`_, Casey Bodley)
-* librados: block MgrClient::start_command until mgrmap (`pr#21832 <https://github.com/ceph/ceph/pull/21832>`_, John Spray, Kefu Chai)
-* librados: extend C API for so it accepts keys with NUL chars (`pr#20314 <https://github.com/ceph/ceph/pull/20314>`_, Piotr Dałek)
-* librados: Fix a potential risk of buffer::list::claim_prepend(list& b… (`issue#21338 <http://tracker.ceph.com/issues/21338>`_, `pr#17661 <https://github.com/ceph/ceph/pull/17661>`_, Guan yunfei)
-* librados: fix potential race condition if notify immediately fails (`issue#23966 <http://tracker.ceph.com/issues/23966>`_, `pr#21859 <https://github.com/ceph/ceph/pull/21859>`_, Jason Dillaman)
-* librados: getter for min compatible client versions (`pr#20080 <https://github.com/ceph/ceph/pull/20080>`_, Jason Dillaman)
-* librados: invalid free() in rados_getxattrs_next() (`issue#22042 <http://tracker.ceph.com/issues/22042>`_, `pr#20260 <https://github.com/ceph/ceph/pull/20260>`_, Gu Zhongyan)
-* librados: make OPERATION_FULL_FORCE the default for rados_remove() (`issue#22413 <http://tracker.ceph.com/issues/22413>`_, `pr#20534 <https://github.com/ceph/ceph/pull/20534>`_, Kefu Chai)
-* librbd: abstract hard-coded journal and cache hooks on IO path (`pr#20682 <https://github.com/ceph/ceph/pull/20682>`_, Jason Dillaman)
-* librbd: Add a function to list image watchers (`pr#19188 <https://github.com/ceph/ceph/pull/19188>`_, Adam Wolfe Gordon)
-* librbd: add API function to get image name (`pr#20935 <https://github.com/ceph/ceph/pull/20935>`_, Mykola Golub)
-* librbd: added preprocessor macro for detecting compare-and-write support (`issue#22036 <http://tracker.ceph.com/issues/22036>`_, `pr#18708 <https://github.com/ceph/ceph/pull/18708>`_, Jason Dillaman)
-* librbd: add eventtrace support (`pr#19251 <https://github.com/ceph/ceph/pull/19251>`_, Mahati Chamarthy)
-* librbd: add preliminary support for new operation feature bit (`pr#19903 <https://github.com/ceph/ceph/pull/19903>`_, Jason Dillaman)
-* librbd: address coverity false positives (`pr#17696 <https://github.com/ceph/ceph/pull/17696>`_, Amit Kumar)
-* librbd: address coverity false positives (`pr#17721 <https://github.com/ceph/ceph/pull/17721>`_, Amit Kumar)
-* librbd: auto-remove trash snapshots when image is deleted (`issue#22873 <http://tracker.ceph.com/issues/22873>`_, `pr#20376 <https://github.com/ceph/ceph/pull/20376>`_, Jason Dillaman)
-* librbd: by default use new format for deep copy destination (`pr#20222 <https://github.com/ceph/ceph/pull/20222>`_, Mykola Golub)
-* librbd: cache last index position to accelerate snap create/rm (`issue#22716 <http://tracker.ceph.com/issues/22716>`_, `pr#19974 <https://github.com/ceph/ceph/pull/19974>`_, Song Shun)
-* librbd: cannot clone all image-metas if we have more than 64 key/value pairs (`pr#18327 <https://github.com/ceph/ceph/pull/18327>`_, PCzhangPC)
-* librbd: cannot copy all image-metas if we have more than 64 key/value pairs (`pr#18328 <https://github.com/ceph/ceph/pull/18328>`_, PCzhangPC)
-* librbd: clean up ManagedLock log prefix (`pr#20159 <https://github.com/ceph/ceph/pull/20159>`_, shun-s)
-* librbd: compare and write against a clone can result in failure (`issue#20789 <http://tracker.ceph.com/issues/20789>`_, `pr#18887 <https://github.com/ceph/ceph/pull/18887>`_, Jason Dillaman)
-* librbd: deep_copy: don't create snapshots above snap_id_end (`pr#19383 <https://github.com/ceph/ceph/pull/19383>`_, Mykola Golub)
-* librbd: default localize parent reads to false (`issue#20941 <http://tracker.ceph.com/issues/20941>`_, `pr#16882 <https://github.com/ceph/ceph/pull/16882>`_, Jason Dillaman)
-* librbd: default to sparse-reads for any IO operation over 64K (`issue#21849 <http://tracker.ceph.com/issues/21849>`_, `pr#18405 <https://github.com/ceph/ceph/pull/18405>`_, Jason Dillaman)
-* librbd: disable ENOENT tracking within the object cacher (`issue#23597 <http://tracker.ceph.com/issues/23597>`_, `pr#21308 <https://github.com/ceph/ceph/pull/21308>`_, Jason Dillaman)
-* librbd: disallow creation of v1 image format (`pr#20460 <https://github.com/ceph/ceph/pull/20460>`_, Julien COLLET, Julien Collet)
-* librbd: don't read metadata twice on image open (`pr#18542 <https://github.com/ceph/ceph/pull/18542>`_, Mykola Golub)
-* librbd: drop redundant check for null ImageCtx (`pr#18265 <https://github.com/ceph/ceph/pull/18265>`_, Jianpeng Ma)
-* librbd: filter out potential race with image rename (`issue#18435 <http://tracker.ceph.com/issues/18435>`_, `pr#19618 <https://github.com/ceph/ceph/pull/19618>`_, Jason Dillaman)
-* librbd: fix coverity warning for uninitialized member (`pr#18129 <https://github.com/ceph/ceph/pull/18129>`_, Li Wang)
-* librbd: fix deep copy a child-image (`pr#20099 <https://github.com/ceph/ceph/pull/20099>`_, songweibin)
-* librbd: fix don't send get_stripe_unit_count if striping is not enabled (`issue#21360 <http://tracker.ceph.com/issues/21360>`_, `pr#17660 <https://github.com/ceph/ceph/pull/17660>`_, Yanhu Cao)
-* librbd: fix issues discovered in clone v2 during upgrade tests (`issue#22979 <http://tracker.ceph.com/issues/22979>`_, `pr#20406 <https://github.com/ceph/ceph/pull/20406>`_, Jason Dillaman)
-* librbd: fix missing return in NotifyMessage::get_notify_op (`pr#20656 <https://github.com/ceph/ceph/pull/20656>`_, Yao Zongyou)
-* librbd: fix rbd close race with rewatch (`pr#21141 <https://github.com/ceph/ceph/pull/21141>`_, Song Shun)
-* librbd: fix refuse to release lock when cookie is the same at rewatch (`pr#20868 <https://github.com/ceph/ceph/pull/20868>`_, Song Shun)
-* librbd: fix structure size check in rbd_mirror_image_get_info/status (`pr#20478 <https://github.com/ceph/ceph/pull/20478>`_, Mykola Golub)
-* librbd: force removal of a snapshot cannot ignore dependent children (`issue#22791 <http://tracker.ceph.com/issues/22791>`_, `pr#20105 <https://github.com/ceph/ceph/pull/20105>`_, Jason Dillaman)
-* librbd: generalized deep copy function (`pr#16238 <https://github.com/ceph/ceph/pull/16238>`_, Mykola Golub)
-* librbd: group and snapshot cleanup (`pr#19990 <https://github.com/ceph/ceph/pull/19990>`_, Jason Dillaman)
-* librbd: group snapshots (`pr#11544 <https://github.com/ceph/ceph/pull/11544>`_, Victor Denisov, Jason Dillaman)
-* librbd: hold cache_lock while clearing cache nonexistence flags (`issue#21558 <http://tracker.ceph.com/issues/21558>`_, `pr#17992 <https://github.com/ceph/ceph/pull/17992>`_, Jason Dillaman)
-* librbd: image-meta config overrides should be dynamically refreshed (`issue#21529 <http://tracker.ceph.com/issues/21529>`_, `pr#18042 <https://github.com/ceph/ceph/pull/18042>`_, Dongsheng Yang, Jason Dillaman)
-* librbd: initial hooks for clone v2 support (`pr#20176 <https://github.com/ceph/ceph/pull/20176>`_, Jason Dillaman)
-* librbd: initialization of state member variables (`pr#16866 <https://github.com/ceph/ceph/pull/16866>`_, amitkuma)
-* librbd: Initializing members image,operation,journal (`pr#16934 <https://github.com/ceph/ceph/pull/16934>`_, amitkuma)
-* librbd: Initializing member variables (`pr#16867 <https://github.com/ceph/ceph/pull/16867>`_, amitkuma)
-* librbd: journal should ignore -EILSEQ errors from compare-and-write (`issue#21628 <http://tracker.ceph.com/issues/21628>`_, `pr#18099 <https://github.com/ceph/ceph/pull/18099>`_, Jason Dillaman)
-* librbd,librados: do not include stdbool.h in C++ headers (`pr#19945 <https://github.com/ceph/ceph/pull/19945>`_, Kefu Chai)
-* librbd: list_children should not attempt to refresh image (`issue#21670 <http://tracker.ceph.com/issues/21670>`_, `pr#18114 <https://github.com/ceph/ceph/pull/18114>`_, Jason Dillaman)
-* librbd: minor cleanup of the IO pathway (`pr#20560 <https://github.com/ceph/ceph/pull/20560>`_, Jason Dillaman)
-* librbd: minor code cleanup (`pr#21165 <https://github.com/ceph/ceph/pull/21165>`_, songweibin)
-* librbd: missing 'return' in deep_copy::ObjectCopyRequest::send_read_object (`pr#21493 <https://github.com/ceph/ceph/pull/21493>`_, Mykola Golub)
-* librbd: new tag should use on-disk committed position (`issue#22945 <http://tracker.ceph.com/issues/22945>`_, `pr#20423 <https://github.com/ceph/ceph/pull/20423>`_, Jason Dillaman)
-* librbd: object map batch update might cause OSD suicide timeout (`issue#21797 <http://tracker.ceph.com/issues/21797>`_, `pr#18315 <https://github.com/ceph/ceph/pull/18315>`_, Jason Dillaman)
-* librbd: possible deadlock with synchronous maintenance operations (`issue#22120 <http://tracker.ceph.com/issues/22120>`_, `pr#18909 <https://github.com/ceph/ceph/pull/18909>`_, Jason Dillaman)
-* librbd: potential crash if object map check encounters error (`issue#22819 <http://tracker.ceph.com/issues/22819>`_, `pr#20214 <https://github.com/ceph/ceph/pull/20214>`_, Jason Dillaman)
-* librbd: potential race between discard and writeback (`pr#21248 <https://github.com/ceph/ceph/pull/21248>`_, Jason Dillaman)
-* librbd: potential race in RewatchRequest when resetting watch_handle (`pr#20420 <https://github.com/ceph/ceph/pull/20420>`_, Mykola Golub)
-* librbd: prefer templates to macros (`pr#19912 <https://github.com/ceph/ceph/pull/19912>`_, Adam C. Emerson)
-* librbd: prevent overflow of discard API result code (`issue#21966 <http://tracker.ceph.com/issues/21966>`_, `pr#18923 <https://github.com/ceph/ceph/pull/18923>`_, Jason Dillaman)
-* librbd: prevent watcher from unregistering with in-flight actions (`issue#23955 <http://tracker.ceph.com/issues/23955>`_, `pr#21763 <https://github.com/ceph/ceph/pull/21763>`_, Jason Dillaman)
-* librbd: refresh image after applying new metadata (`issue#21711 <http://tracker.ceph.com/issues/21711>`_, `pr#18158 <https://github.com/ceph/ceph/pull/18158>`_, Jason Dillaman)
-* librbd: release lock executing deep copy progress callback (`issue#23929 <http://tracker.ceph.com/issues/23929>`_, `pr#21727 <https://github.com/ceph/ceph/pull/21727>`_, Mykola Golub)
-* librbd: remove unused member in FlattenRequest (`pr#19416 <https://github.com/ceph/ceph/pull/19416>`_, Mykola Golub)
-* librbd: remove unused variables from ReadResult refactor (`pr#18277 <https://github.com/ceph/ceph/pull/18277>`_, Jason Dillaman)
-* librbd: rename of non-existent image results in seg fault (`issue#21248 <http://tracker.ceph.com/issues/21248>`_, `pr#17502 <https://github.com/ceph/ceph/pull/17502>`_, Jason Dillaman)
-* librbd: set deleted parent pointer to null (`issue#22158 <http://tracker.ceph.com/issues/22158>`_, `pr#19003 <https://github.com/ceph/ceph/pull/19003>`_, Jason Dillaman)
-* librbd: should not set self as remote peer (`pr#17300 <https://github.com/ceph/ceph/pull/17300>`_, songweibin)
-* librbd: small cleanup for recently merged code (`pr#20578 <https://github.com/ceph/ceph/pull/20578>`_, Mykola Golub)
-* librbd: snapshots should be created/removed against data pool (`issue#21567 <http://tracker.ceph.com/issues/21567>`_, `pr#18043 <https://github.com/ceph/ceph/pull/18043>`_, Jason Dillaman)
-* librbd: speed up object map disk usage and resize (`pr#20218 <https://github.com/ceph/ceph/pull/20218>`_, shun-s)
-* librbd: speed up sparse copy when object map is available (`pr#18967 <https://github.com/ceph/ceph/pull/18967>`_, Song Shun)
-* librbd: update mirror::EnableRequest diagram according to code (`pr#19130 <https://github.com/ceph/ceph/pull/19130>`_, Mykola Golub)
-* librbd: use steady clock to measure elapsed time in AioCompletion (`pr#20007 <https://github.com/ceph/ceph/pull/20007>`_, Mohamad Gebai)
-* librbd: validate if dst group snap name is the same with src (`pr#20395 <https://github.com/ceph/ceph/pull/20395>`_, songweibin)
-* log: Fix AddressSanitizer: new-delete-type-mismatch (`issue#23324 <http://tracker.ceph.com/issues/23324>`_, `pr#20930 <https://github.com/ceph/ceph/pull/20930>`_, Brad Hubbard)
-* log: fix build on osx (`pr#18213 <https://github.com/ceph/ceph/pull/18213>`_, Kefu Chai)
-* log: silence warning from -Wsign-compare (`pr#18326 <https://github.com/ceph/ceph/pull/18326>`_, Jos Collin)
-* log: Use the coarse real time clock in log timestamps (`pr#18141 <https://github.com/ceph/ceph/pull/18141>`_, Adam C. Emerson)
-* mds: check metadata pool not cluster is full (`issue#22483 <http://tracker.ceph.com/issues/22483>`_, `pr#19602 <https://github.com/ceph/ceph/pull/19602>`_, Patrick Donnelly)
-* mds: fix CEPH_STAT_RSTAT definition (`pr#21633 <https://github.com/ceph/ceph/pull/21633>`_, "Yan, Zheng")
-* mds: get rid of the "if" check which is unnecessary inside a loop (`pr#18904 <https://github.com/ceph/ceph/pull/18904>`_, dongdong tao)
-* mds: Remove redundant null pointer check (`pr#19750 <https://github.com/ceph/ceph/pull/19750>`_, Brad Hubbard)
-* mds: simplify the code logic in replay_alloc_ids (`pr#18893 <https://github.com/ceph/ceph/pull/18893>`_, dongdong tao)
-* mempool: fix lack of pool names in mempool:dump output for JSON format (`pr#18329 <https://github.com/ceph/ceph/pull/18329>`_, Igor Fedotov)
-* messages: Initialization of uninitialized members various classes (`pr#16848 <https://github.com/ceph/ceph/pull/16848>`_, amitkuma)
-* messages/MDentryLink: add const to member function (`pr#15479 <https://github.com/ceph/ceph/pull/15479>`_, yonghengdexin735)
-* messages,test,msg: initialize h,reply_type,owner (`pr#17767 <https://github.com/ceph/ceph/pull/17767>`_, Amit Kumar)
-* mgr: add mgr daemon to DaemonStateIndex with metadata (hostname) (`issue#23286 <http://tracker.ceph.com/issues/23286>`_, `pr#20875 <https://github.com/ceph/ceph/pull/20875>`_, Jan Fajerski)
-* mgr: add missing call to pick_addresses (`issue#20955 <http://tracker.ceph.com/issues/20955>`_, `pr#16940 <https://github.com/ceph/ceph/pull/16940>`_, John Spray)
-* mgr: add the ip addr of standbys (`pr#16476 <https://github.com/ceph/ceph/pull/16476>`_, huanwen ren)
-* mgr: add units to performance counters (`issue#22747 <http://tracker.ceph.com/issues/22747>`_, `pr#20152 <https://github.com/ceph/ceph/pull/20152>`_, Rubab Syed)
-* mgr: allow service daemons to unregister from ServiceMap (`pr#20761 <https://github.com/ceph/ceph/pull/20761>`_, Sage Weil)
-* mgr: apply a threshold to perf counter prios (`pr#16699 <https://github.com/ceph/ceph/pull/16699>`_, John Spray)
-* mgr: balancer: fixed mistype "AttributeError: 'Logger' object has no attribute 'err'" (`pr#20130 <https://github.com/ceph/ceph/pull/20130>`_, Konstantin Shalygin)
-* mgr: centralized setting/getting of mgr configs (`pr#21442 <https://github.com/ceph/ceph/pull/21442>`_, John Spray, Rubab Syed)
-* mgr: ceph-mgr: can not change prometheus port for mgr (`pr#17746 <https://github.com/ceph/ceph/pull/17746>`_, wujian)
-* mgr: common interface for TSDB modules (`pr#17735 <https://github.com/ceph/ceph/pull/17735>`_, Jan Fajerski, John Spray, My Do)
-* mgr/dashboard: Adapt help text if server_addr is not set (`pr#21640 <https://github.com/ceph/ceph/pull/21640>`_, Volker Theile)
-* mgr/dashboard: Adapt RBD form to new application_metadata type (`pr#21602 <https://github.com/ceph/ceph/pull/21602>`_, Volker Theile)
-* mgr/dashboard: Add Api module (`pr#21126 <https://github.com/ceph/ceph/pull/21126>`_, Tiago Melo)
-* mgr/dashboard: Add 'autofocus' directive (`pr#21559 <https://github.com/ceph/ceph/pull/21559>`_, Volker Theile)
-* mgr/dashboard: Add CdDatePipe (`pr#21087 <https://github.com/ceph/ceph/pull/21087>`_, Ricardo Marques)
-* mgr/dashboard: Add 'cd-error-panel' component to display error messages (`pr#21558 <https://github.com/ceph/ceph/pull/21558>`_, Volker Theile)
-* mgr/dashboard: Add 'cd-loading-panel' component (`pr#21618 <https://github.com/ceph/ceph/pull/21618>`_, Volker Theile)
-* mgr/dashboard: Add custom validators (`pr#21041 <https://github.com/ceph/ceph/pull/21041>`_, Volker Theile)
-* mgr/dashboard: Add DimlessBinaryDirective (`pr#20972 <https://github.com/ceph/ceph/pull/20972>`_, Ricardo Marques)
-* mgr/dashboard: Add ErasureCodeProfile controller (`issue#23345 <http://tracker.ceph.com/issues/23345>`_, `pr#20920 <https://github.com/ceph/ceph/pull/20920>`_, Sebastian Wagner, Stephan Müller)
-* mgr/dashboard: Add 'forceIdentifier' attribute to datatable (`pr#21497 <https://github.com/ceph/ceph/pull/21497>`_, Volker Theile)
-* mgr/dashboard: Add helper component (`pr#20971 <https://github.com/ceph/ceph/pull/20971>`_, Ricardo Marques)
-* mgr/dashboard: additional fixes to block pages (`pr#20941 <https://github.com/ceph/ceph/pull/20941>`_, Jason Dillaman)
-* mgr/dashboard: Add minimalistic browsable API (`pr#20873 <https://github.com/ceph/ceph/pull/20873>`_, Sebastian Wagner)
-* mgr/dashboard: Add notification service/component (`pr#21078 <https://github.com/ceph/ceph/pull/21078>`_, Tiago Melo)
-* mgr/dashboard: Add Pool-create to the backend (`issue#23345 <http://tracker.ceph.com/issues/23345>`_, `pr#20865 <https://github.com/ceph/ceph/pull/20865>`_, Sebastian Wagner)
-* mgr/dashboard: Add RGW user and bucket management features (`pr#21351 <https://github.com/ceph/ceph/pull/21351>`_, Volker Theile)
-* mgr/dashboard: Adds reusable deletion dialog (`pr#20899 <https://github.com/ceph/ceph/pull/20899>`_, Stephan Müller, Tiago Melo)
-* mgr/dashboard: Add submit button component (`pr#21011 <https://github.com/ceph/ceph/pull/21011>`_, Tiago Melo)
-* mgr/dashboard: Add usage bar component (`pr#21128 <https://github.com/ceph/ceph/pull/21128>`_, Ricardo Marques)
-* mgr/dashboard: Angular modules cleanup (`pr#21402 <https://github.com/ceph/ceph/pull/21402>`_, Tiago Melo)
-* mgr/dashboard: Asynchronous tasks (frontend) (`pr#20962 <https://github.com/ceph/ceph/pull/20962>`_, Ricardo Marques)
-* mgr/dashboard: awsauth: fix python3 string decode problem (`pr#21875 <https://github.com/ceph/ceph/pull/21875>`_, Ricardo Dias)
-* mgr/dashboard: Change font-family of checkbox (`pr#21787 <https://github.com/ceph/ceph/pull/21787>`_, Tiago Melo)
-* mgr/dashboard: Clean up Pylint warnings (`pr#21694 <https://github.com/ceph/ceph/pull/21694>`_, Sebastian Wagner)
-* mgr/dashboard: Convert floating values to bytes (`pr#21677 <https://github.com/ceph/ceph/pull/21677>`_, Stephan Müller)
-* mgr/dashboard: Convert the RBD feature names to a list of strings (`pr#21024 <https://github.com/ceph/ceph/pull/21024>`_, Tatjana Dehler)
-* mgr/dashboard: Deletion dialog falsely executes deletion when pressing 'Cancel' (`pr#22032 <https://github.com/ceph/ceph/pull/22032>`_, Volker Theile)
-* mgr/dashboard: Display notification if RGW is not configured (`pr#21977 <https://github.com/ceph/ceph/pull/21977>`_, Volker Theile)
-* mgr/dashboard: Display RBD form errors on submission (`pr#21529 <https://github.com/ceph/ceph/pull/21529>`_, Ricardo Marques)
-* mgr/dashboard: Enable object rendering in KV-table (`pr#21701 <https://github.com/ceph/ceph/pull/21701>`_, Stephan Müller)
-* mgr/dashboard: fix 500 error on block device iSCSI status page (`pr#20928 <https://github.com/ceph/ceph/pull/20928>`_, Jason Dillaman)
-* mgr/dashboard: fix dashboard python 3 support (`pr#21007 <https://github.com/ceph/ceph/pull/21007>`_, Ricardo Dias)
-* mgr/dashboard: Fix data race and use-before-assignment (`pr#21590 <https://github.com/ceph/ceph/pull/21590>`_, Sebastian Wagner)
-* mgr/dashboard: fixed password generation in Auth controller (`issue#23404 <http://tracker.ceph.com/issues/23404>`_, `pr#21006 <https://github.com/ceph/ceph/pull/21006>`_, Ricardo Dias)
-* mgr/dashboard: Fixes documentation link- to open in new tab (`pr#22262 <https://github.com/ceph/ceph/pull/22262>`_, Kanika Murarka)
-* mgr/dashboard: Fixes type error in RBD form (`pr#21681 <https://github.com/ceph/ceph/pull/21681>`_, Stephan Müller)
-* mgr/dashboard: fix frontend e2e tests (`pr#20943 <https://github.com/ceph/ceph/pull/20943>`_, Tiago Melo)
-* mgr/dashboard: fix FS status on old MDS daemons (`issue#20692 <http://tracker.ceph.com/issues/20692>`_, `pr#16960 <https://github.com/ceph/ceph/pull/16960>`_, John Spray)
-* mgr/dashboard: fix linting problem (`pr#22277 <https://github.com/ceph/ceph/pull/22277>`_, Tiago Melo)
-* mgr/dashboard: Fix missing $event on deletion modal (`pr#21667 <https://github.com/ceph/ceph/pull/21667>`_, Ricardo Marques)
-* mgr/dashboard: Fix moment.js deprecation warning (`pr#22052 <https://github.com/ceph/ceph/pull/22052>`_, Tiago Melo)
-* mgr/dashboard: Fix objects named `default` are inaccessible (`pr#20976 <https://github.com/ceph/ceph/pull/20976>`_, Sebastian Wagner)
-* mgr/dashboard: Fix RBD task metadata (`pr#22152 <https://github.com/ceph/ceph/pull/22152>`_, Tiago Melo)
-* mgr/dashboard: Fix table without fetchData (`pr#21086 <https://github.com/ceph/ceph/pull/21086>`_, Ricardo Marques)
-* mgr/dashboard: Fix the data table action selector (`pr#21270 <https://github.com/ceph/ceph/pull/21270>`_, Stephan Müller)
-* mgr/dashboard: fix two type errors found by mypy (`pr#21774 <https://github.com/ceph/ceph/pull/21774>`_, Sebastian Wagner)
-* mgr/dashboard: Handle errors during deletion (`pr#22029 <https://github.com/ceph/ceph/pull/22029>`_, Volker Theile)
-* mgr/dashboard: Implement a RGW proxy (`pr#21258 <https://github.com/ceph/ceph/pull/21258>`_, Volker Theile, Patrick Nawracay)
-* mgr/dashboard: Improve background tasks style (`pr#21462 <https://github.com/ceph/ceph/pull/21462>`_, Ricardo Marques)
-* mgr/dashboard: improve error handling (`pr#18182 <https://github.com/ceph/ceph/pull/18182>`_, Nick Erdmann)
-* mgr/dashboard: Improve error panel (`pr#21978 <https://github.com/ceph/ceph/pull/21978>`_, Volker Theile)
-* mgr/dashboard: Improve `npm start` script (`pr#20989 <https://github.com/ceph/ceph/pull/20989>`_, Ricardo Marques)
-* mgr/dashboard: Improve table search (`pr#20807 <https://github.com/ceph/ceph/pull/20807>`_, Stephan Müller)
-* mgr/dashboard: Load the datatable content on component initialization (`pr#21595 <https://github.com/ceph/ceph/pull/21595>`_, Volker Theile)
-* mgr/dashboard: Navbar dropdown button does not respond for mobile browsers (`pr#21979 <https://github.com/ceph/ceph/pull/21979>`_, Volker Theile)
-* mgr/dashboard: Notification improvements (`pr#21350 <https://github.com/ceph/ceph/pull/21350>`_, Tiago Melo)
-* mgr/dashboard: pool: fix python3 dict_keys error (`pr#21636 <https://github.com/ceph/ceph/pull/21636>`_, Ricardo Dias)
-* mgr/dashboard: Pool listing (`pr#21353 <https://github.com/ceph/ceph/pull/21353>`_, Stephan Müller)
-* mgr/dashboard: rbd: add @AuthRequired to snapshots controller (`pr#21517 <https://github.com/ceph/ceph/pull/21517>`_, Ricardo Dias)
-* mgr/dashboard: RBD copy, RBD flatten and snapshot clone (frontend) (`pr#21526 <https://github.com/ceph/ceph/pull/21526>`_, Ricardo Marques, Ricardo Dias)
-* mgr/dashboard: RBD management (frontend) (`pr#21385 <https://github.com/ceph/ceph/pull/21385>`_, Ricardo Marques)
-* mgr/dashboard: Refactor multiple duplicates of `get_rate()` (`pr#21022 <https://github.com/ceph/ceph/pull/21022>`_, Sebastian Wagner)
-* mgr/dashboard: Refactor RGW backend (`pr#21855 <https://github.com/ceph/ceph/pull/21855>`_, Volker Theile)
-* mgr/dashboard: Rename and refactor ApiInterceptorService class (`pr#21386 <https://github.com/ceph/ceph/pull/21386>`_, Volker Theile)
-* mgr/dashboard: Replace font-awesome with fork-awesome (`pr#21327 <https://github.com/ceph/ceph/pull/21327>`_, Lenz Grimmer)
-* mgr/dashboard: restcontroller: fix detection of id args in element requests (`pr#21290 <https://github.com/ceph/ceph/pull/21290>`_, Ricardo Dias)
-* mgr/dashboard: RESTController improvements (`pr#21516 <https://github.com/ceph/ceph/pull/21516>`_, Ricardo Dias)
-* mgr/dashboard: run-tox: pass CEPH_BUILD_DIR value into tox script (`pr#21445 <https://github.com/ceph/ceph/pull/21445>`_, Ricardo Dias)
-* mgr: dashboard: show per pool IOPS on health page (#22495) (`issue#22495 <http://tracker.ceph.com/issues/22495>`_, `pr#19981 <https://github.com/ceph/ceph/pull/19981>`_, Konstantin Shalygin)
-* mgr/dashboard: Support aditional info on 'cd-view-cache' (`pr#21060 <https://github.com/ceph/ceph/pull/21060>`_, Ricardo Marques)
-* mgr/dashboard: TaskManager bug fixes (`pr#21240 <https://github.com/ceph/ceph/pull/21240>`_, Ricardo Dias)
-* mgr/dashboard: Update selected items on table refresh (`pr#21099 <https://github.com/ceph/ceph/pull/21099>`_, Ricardo Marques)
-* mgr/dashboard: Use Bootstrap CSS (`pr#21780 <https://github.com/ceph/ceph/pull/21780>`_, Volker Theile)
-* mgr/dashboard: using RoutesDispatcher as HTTP request dispatcher (`pr#21239 <https://github.com/ceph/ceph/pull/21239>`_, Ricardo Dias)
-* mgr/dashboard_v2: add mgr to the list of perf counters (`pr#20783 <https://github.com/ceph/ceph/pull/20783>`_, Tiago Melo)
-* mgr/dashboard_v2: add mocked service provider for TcmuIscsiService (`pr#20775 <https://github.com/ceph/ceph/pull/20775>`_, Tiago Melo)
-* mgr/dashboard_v2: Add toggle able columns (`pr#20806 <https://github.com/ceph/ceph/pull/20806>`_, Stephan Müller)
-* mgr/dashboard_v2: Configuration settings support (`pr#20743 <https://github.com/ceph/ceph/pull/20743>`_, Ricardo Dias)
-* mgr/dashboard_v2: fix and improve table details (`pr#20811 <https://github.com/ceph/ceph/pull/20811>`_, Tiago Melo)
-* mgr/dashboard_v2: Fix cephfs template table usage (`pr#20804 <https://github.com/ceph/ceph/pull/20804>`_, Stephan Müller)
-* mgr/dashboard_v2: fix cluster configuration page (`pr#20821 <https://github.com/ceph/ceph/pull/20821>`_, Tiago Melo)
-* mgr/dashboard_v2: Improve charts tooltips (`pr#20757 <https://github.com/ceph/ceph/pull/20757>`_, Tiago Melo)
-* mgr/dashboard_v2: Pool controller (`pr#20823 <https://github.com/ceph/ceph/pull/20823>`_, Ricardo Dias)
-* mgr/dashboard_v2: Rotate the refresh icon on load (`pr#20805 <https://github.com/ceph/ceph/pull/20805>`_, Stephan Müller)
-* mgr: die on bind() failure (`pr#20595 <https://github.com/ceph/ceph/pull/20595>`_, John Spray)
-* mgr: disconnect unregistered service daemon when report received (`issue#22286 <http://tracker.ceph.com/issues/22286>`_, `pr#19261 <https://github.com/ceph/ceph/pull/19261>`_, Jason Dillaman)
-* mgr: emit cluster log message on serve() exception (`issue#21999 <http://tracker.ceph.com/issues/21999>`_, `pr#18672 <https://github.com/ceph/ceph/pull/18672>`_, John Spray)
-* mgr: Expose rgw perf counters (`pr#21269 <https://github.com/ceph/ceph/pull/21269>`_, Boris Ranto)
-* mgr: fix "access denied" message (`pr#19518 <https://github.com/ceph/ceph/pull/19518>`_, John Spray)
-* mgr: fix crashable DaemonStateIndex::get calls (`issue#17737 <http://tracker.ceph.com/issues/17737>`_, `pr#17933 <https://github.com/ceph/ceph/pull/17933>`_, John Spray)
-* mgr: fix crash in MonCommandCompletion (`issue#21157 <http://tracker.ceph.com/issues/21157>`_, `pr#17308 <https://github.com/ceph/ceph/pull/17308>`_, John Spray)
-* mgr: fixes python error handling (`issue#23406 <http://tracker.ceph.com/issues/23406>`_, `pr#21005 <https://github.com/ceph/ceph/pull/21005>`_, Ricardo Dias)
-* mgr: fix MSG_MGR_MAP handling (`pr#20892 <https://github.com/ceph/ceph/pull/20892>`_, Gu Zhongyan)
-* mgr: fix "osd status" command exception if OSD not in pgmap stats (`issue#21707 <http://tracker.ceph.com/issues/21707>`_, `pr#18173 <https://github.com/ceph/ceph/pull/18173>`_, Yanhu Cao)
-* mgr: fix py3 support (`issue#22880 <http://tracker.ceph.com/issues/22880>`_, `pr#20362 <https://github.com/ceph/ceph/pull/20362>`_, Kefu Chai)
-* mgr: fix py calls for dne service perf counters (`issue#21253 <http://tracker.ceph.com/issues/21253>`_, `pr#17605 <https://github.com/ceph/ceph/pull/17605>`_, John Spray)
-* mgr: implement completion of osd MetadataUpdate (`issue#21159 <http://tracker.ceph.com/issues/21159>`_, `pr#16925 <https://github.com/ceph/ceph/pull/16925>`_, Yanhu Cao)
-* mgr: implement 'osd safe-to-destroy' and 'osd ok-to-stop' commands (`pr#16976 <https://github.com/ceph/ceph/pull/16976>`_, Sage Weil)
-* mgr: improved module loading for error reporting etc (`issue#21999 <http://tracker.ceph.com/issues/21999>`_, `issue#21683 <http://tracker.ceph.com/issues/21683>`_, `issue#21502 <http://tracker.ceph.com/issues/21502>`_, `pr#19235 <https://github.com/ceph/ceph/pull/19235>`_, John Spray)
-* mgr: improve reporting on unloadable modules (`issue#23358 <http://tracker.ceph.com/issues/23358>`_, `pr#20921 <https://github.com/ceph/ceph/pull/20921>`_, John Spray)
-* mgr: increase time resolution of Commit/Apply OSD latencies (`pr#19232 <https://github.com/ceph/ceph/pull/19232>`_, Коренберг Марк)
-* mgr: initialize PyModuleRegistry sooner (`issue#22918 <http://tracker.ceph.com/issues/22918>`_, `pr#20321 <https://github.com/ceph/ceph/pull/20321>`_, John Spray)
-* mgr: In plugins 'module' classes need not to be called "Module" anymore (`issue#17454 <http://tracker.ceph.com/issues/17454>`_, `pr#18526 <https://github.com/ceph/ceph/pull/18526>`_, Kefu Chai, bhavishyagopesh)
-* mgr: locking fixes (`issue#21158 <http://tracker.ceph.com/issues/21158>`_, `pr#17309 <https://github.com/ceph/ceph/pull/17309>`_, John Spray)
-* mgr: mgr/balancer: cast config vals to int or float (`issue#22429 <http://tracker.ceph.com/issues/22429>`_, `pr#19493 <https://github.com/ceph/ceph/pull/19493>`_, Dan van der Ster)
-* mgr: mgr/balancer: don't use 'foo' tags on commands (`issue#22361 <http://tracker.ceph.com/issues/22361>`_, `pr#19482 <https://github.com/ceph/ceph/pull/19482>`_, John Spray)
-* mgr: mgr/balancer: fix KeyError in balancer rm (`issue#22470 <http://tracker.ceph.com/issues/22470>`_, `pr#19578 <https://github.com/ceph/ceph/pull/19578>`_, Dan van der Ster)
-* mgr: mgr/balancer: fix OPTIONS definition (`pr#21620 <https://github.com/ceph/ceph/pull/21620>`_, John Spray)
-* mgr: mgr/balancer: fix upmap; default balancer module enabled (`pr#18691 <https://github.com/ceph/ceph/pull/18691>`_, Sage Weil)
-* mgr: mgr/balancer: make crush-compat mode work (`pr#17983 <https://github.com/ceph/ceph/pull/17983>`_, Sage Weil)
-* mgr: mgr/balancer: mgr module to automatically balance PGs across OSDs (`pr#16272 <https://github.com/ceph/ceph/pull/16272>`_, Spandan Kumar Sahu, Sage Weil)
-* mgr: mgr/balancer: more pool-specific enhancements (`pr#20225 <https://github.com/ceph/ceph/pull/20225>`_, xie xingguo)
-* mgr: mgr/balancer: pool-specific optimization support and bug fixes (`pr#20154 <https://github.com/ceph/ceph/pull/20154>`_, xie xingguo)
-* mgr:  mgr/balancer: replace magic value of -1 for DEFAULT_CHOOSE_ARGS (`pr#20258 <https://github.com/ceph/ceph/pull/20258>`_, Kefu Chai)
-* mgr: mgr/balancer: skip CRUSH_ITEM_NONE (`pr#18894 <https://github.com/ceph/ceph/pull/18894>`_, Sage Weil)
-* mgr: mgr/balancer: two more fixes (`pr#20180 <https://github.com/ceph/ceph/pull/20180>`_, xie xingguo)
-* mgr: mgrc: free MMgrClose in handle_mgr_close (`issue#23846 <http://tracker.ceph.com/issues/23846>`_, `pr#21626 <https://github.com/ceph/ceph/pull/21626>`_, Casey Bodley)
-* mgr: mgr/DaemonServer: add overrides value to 'config show' (`pr#21093 <https://github.com/ceph/ceph/pull/21093>`_, Gu Zhongyan)
-* mgr: mgr/DaemonServer.cc: [Cleanup] Change to using  get_val template function (`pr#18717 <https://github.com/ceph/ceph/pull/18717>`_, Shinobu Kinjo)
-* mgr: mgr/DaemonServer: [Cleanup] Remove redundant code (`pr#18716 <https://github.com/ceph/ceph/pull/18716>`_, Shinobu Kinjo)
-* mgr: mgr/dashboard: add configuration setting browser (`issue#22522 <http://tracker.ceph.com/issues/22522>`_, `pr#20043 <https://github.com/ceph/ceph/pull/20043>`_, Rubab Syed)
-* mgr: mgr/dashboard: add image id to mgr rbd info instead of block_name_prefix (`pr#20884 <https://github.com/ceph/ceph/pull/20884>`_, zouaiguo)
-* mgr: mgr/dashboard: Add monitor list (`pr#19632 <https://github.com/ceph/ceph/pull/19632>`_, Rubab Syed)
-* mgr: mgr/dashboard: Add RGW user and bucket lists (read-only) (`pr#20869 <https://github.com/ceph/ceph/pull/20869>`_, Volker Theile)
-* mgr: mgr/dashboard: add TLS (`pr#21627 <https://github.com/ceph/ceph/pull/21627>`_, John Spray)
-* mgr: mgr/dashboard: Add toBytes() method to FormatterService (`pr#20978 <https://github.com/ceph/ceph/pull/20978>`_, Volker Theile)
-* mgr: mgr/dashboard: asynchronous task support (`pr#20870 <https://github.com/ceph/ceph/pull/20870>`_, Ricardo Dias)
-* mgr: mgr/dashboard: change raw usage chart's color depending on usage (`pr#17421 <https://github.com/ceph/ceph/pull/17421>`_, Nick Erdmann)
-* mgr: mgr/dashboard: fix audit log loading (`pr#18848 <https://github.com/ceph/ceph/pull/18848>`_, John Spray)
-* mgr: mgr/dashboard: Fix backend tests for newer CherryPy versions (`pr#20778 <https://github.com/ceph/ceph/pull/20778>`_, Patrick Nawracay)
-* mgr: mgr/dashboard: Fix PG status coloring (`pr#19431 <https://github.com/ceph/ceph/pull/19431>`_, Wido den Hollander)
-* mgr: mgr/dashboard: format tooltip's label as user friendly string (`pr#18769 <https://github.com/ceph/ceph/pull/18769>`_, Yao Zongyou)
-* mgr: mgr/dashboard: handle null in format_number (`issue#21570 <http://tracker.ceph.com/issues/21570>`_, `pr#17991 <https://github.com/ceph/ceph/pull/17991>`_, John Spray)
-* mgr: mgr/dashboard: HTTP request logging (`pr#20797 <https://github.com/ceph/ceph/pull/20797>`_, Ricardo Dias)
-* mgr: mgr/dashboard: Improve auth interceptor (`pr#20847 <https://github.com/ceph/ceph/pull/20847>`_, Volker Theile)
-* mgr: mgr/dashboard: performance counter browsers (`issue#22521 <http://tracker.ceph.com/issues/22521>`_, `pr#19922 <https://github.com/ceph/ceph/pull/19922>`_, Rubab-Syed)
-* mgr: mgr/dashboard: RBD management (backend) (`pr#21360 <https://github.com/ceph/ceph/pull/21360>`_, Ricardo Dias)
-* mgr: mgr/dashboard: Remove unused code (`pr#21045 <https://github.com/ceph/ceph/pull/21045>`_, Volker Theile)
-* mgr: mgr/dashboard: Remove useless code (`pr#20958 <https://github.com/ceph/ceph/pull/20958>`_, Volker Theile)
-* mgr: mgr/dashboard: show warnings if data is out of date or mons are down (`pr#18847 <https://github.com/ceph/ceph/pull/18847>`_, John Spray)
-* mgr: mgr/dashboard: sort servers and OSDs in OSD list (`issue#21572 <http://tracker.ceph.com/issues/21572>`_, `pr#17993 <https://github.com/ceph/ceph/pull/17993>`_, John Spray)
-* mgr: mgr/dashboard: use rel="icon" for favicon (`pr#18013 <https://github.com/ceph/ceph/pull/18013>`_, Kefu Chai)
-* mgr: mgr/dashboard v2: Add CSS class for required form fields (`pr#20747 <https://github.com/ceph/ceph/pull/20747>`_, Volker Theile)
-* mgr: mgr/dashboard_v2: Add RBD create functionality to the Python backend (`pr#20751 <https://github.com/ceph/ceph/pull/20751>`_, Tatjana Dehler)
-* mgr: mgr/dashboard v2: Add units to performance counters (`pr#20742 <https://github.com/ceph/ceph/pull/20742>`_, Volker Theile)
-* mgr: mgr/dashboard v2: Display loading indicator in datatables during first load (`pr#20744 <https://github.com/ceph/ceph/pull/20744>`_, Volker Theile)
-* mgr: mgr/dashboard v2: Don't show details if multiple OSDs are selected (`pr#20772 <https://github.com/ceph/ceph/pull/20772>`_, Volker Theile)
-* mgr: mgr/dashboard v2: implement can_run method (`pr#20728 <https://github.com/ceph/ceph/pull/20728>`_, John Spray)
-* mgr: mgr/dashboard_v2: Initial submission of a web-based management UI (replacement for the existing dashboard) (`pr#20103 <https://github.com/ceph/ceph/pull/20103>`_, Stephan Müller, Lenz Grimmer, Tiago Melo, Ricardo Marques, Sebastian Wagner, Patrick Nawracay, Ricardo Dias, Volker Theile, Kai Wagner, Tatjana Dehler)
-* mgr: mgr/dashboard v2: Introduce CdTableSelection model (`pr#20746 <https://github.com/ceph/ceph/pull/20746>`_, Volker Theile)
-* mgr: mgr/dashboard_v2: Removed unused `tools.detail_route()` (`pr#20765 <https://github.com/ceph/ceph/pull/20765>`_, Sebastian Wagner)
-* mgr: mgr/influx: Added Additional Stats (`pr#21424 <https://github.com/ceph/ceph/pull/21424>`_, mhdo2)
-* mgr: mgr/influx: Add InfluxDB SSL Option (`pr#19374 <https://github.com/ceph/ceph/pull/19374>`_, Tobias Gall)
-* mgr: mgr/influx: Only split string on first occurence of dot (.) (`issue#23996 <http://tracker.ceph.com/issues/23996>`_, `pr#21795 <https://github.com/ceph/ceph/pull/21795>`_, Wido den Hollander)
-* mgr: mgr/influx: PEP-8 and other fixes to Influx module (`pr#19229 <https://github.com/ceph/ceph/pull/19229>`_, Wido den Hollander)
-* mgr: mgr/influx: Various fixes and improvements (`pr#20187 <https://github.com/ceph/ceph/pull/20187>`_, Wido den Hollander)
-* mgr: mgr/influx: Various time fixes (`pr#20494 <https://github.com/ceph/ceph/pull/20494>`_, Wido den Hollander)
-* mgr: mgr/localpool: default to 3x; allow min_size adjustment (`pr#18089 <https://github.com/ceph/ceph/pull/18089>`_, Sage Weil)
-* mgr: mgr/MgrClient: guard send_pgstats() with lock (`issue#23370 <http://tracker.ceph.com/issues/23370>`_, `pr#20909 <https://github.com/ceph/ceph/pull/20909>`_, Kefu Chai)
-* mgr: mgr/MgrClient: service registration filtered by service name instead of daemon name (`pr#21459 <https://github.com/ceph/ceph/pull/21459>`_, runsisi)
-* mgr: mgr/PGMap: drop REQUEST\_{SLOW,STUCK} HEALTH_WARNs (`pr#19114 <https://github.com/ceph/ceph/pull/19114>`_, Kefu Chai)
-* mgr: mgr/prometheus: add ceph_disk_occupation series (`issue#21594 <http://tracker.ceph.com/issues/21594>`_, `pr#18021 <https://github.com/ceph/ceph/pull/18021>`_, John Spray)
-* mgr: mgr/prometheus: add missing 'deep' state to PG_STATES in ceph-mgr prometheus plugin (`issue#22116 <http://tracker.ceph.com/issues/22116>`_, `pr#18890 <https://github.com/ceph/ceph/pull/18890>`_, Peter Woodman)
-* mgr: mgr/prometheus: Fix for MDS metrics (`issue#20899 <http://tracker.ceph.com/issues/20899>`_, `pr#17318 <https://github.com/ceph/ceph/pull/17318>`_, John Spray, Jeremy H Austin)
-* mgr: mgr/prometheus: fix PG state names (`pr#21288 <https://github.com/ceph/ceph/pull/21288>`_, John Spray)
-* mgr: mgr/prometheus: Skip bogus entries (`pr#20456 <https://github.com/ceph/ceph/pull/20456>`_, Boris Ranto)
-* mgr: mgr/prometheus: skip OSD output if missing from CRUSH devices (`pr#20644 <https://github.com/ceph/ceph/pull/20644>`_, John Spray)
-* mgr: mgr/restful: A couple of restful fixes (`pr#18649 <https://github.com/ceph/ceph/pull/18649>`_, Boris Ranto)
-* mgr: mgr/restful: cleaner message when not configured (`issue#21292 <http://tracker.ceph.com/issues/21292>`_, `pr#17573 <https://github.com/ceph/ceph/pull/17573>`_, John Spray)
-* mgr: mgr/smart: fix python3 module loading (`pr#21047 <https://github.com/ceph/ceph/pull/21047>`_, Ricardo Dias)
-* mgr: mgr/status: fix ceph fs status returns error (`issue#21752 <http://tracker.ceph.com/issues/21752>`_, `pr#18233 <https://github.com/ceph/ceph/pull/18233>`_, Yanhu Cao)
-* mgr: mgr/status: format byte quantities in base 2 multiples (`issue#21189 <http://tracker.ceph.com/issues/21189>`_, `pr#17380 <https://github.com/ceph/ceph/pull/17380>`_, John Spray)
-* mgr: mgr/telemetry: Add Ceph Telemetry module to send reports back to project (`pr#21970 <https://github.com/ceph/ceph/pull/21970>`_, Wido den Hollander)
-* mgr: mgr/zabbix: fix div by zero (`issue#21518 <http://tracker.ceph.com/issues/21518>`_, `pr#17931 <https://github.com/ceph/ceph/pull/17931>`_, John Spray)
-* mgr: mgr/zabbix: ignore osd with 0 kb capacity (`issue#21904 <http://tracker.ceph.com/issues/21904>`_, `pr#18809 <https://github.com/ceph/ceph/pull/18809>`_, Ilja Slepnev)
-* mgr: mgr/zabbix: Implement health checks (`pr#20198 <https://github.com/ceph/ceph/pull/20198>`_, Wido den Hollander)
-* mgr: mgr/zabbix: Send max, min and avg PGs of OSDs to Zabbix (`pr#21043 <https://github.com/ceph/ceph/pull/21043>`_, Wido den Hollander)
-* mgr: mgr/Zabbix: Various fixes to Zabbix module (`pr#19452 <https://github.com/ceph/ceph/pull/19452>`_, Wido den Hollander)
-* mgr: mimic: mgr/telegraf: Telegraf module for Ceph Mgr (`pr#22013 <https://github.com/ceph/ceph/pull/22013>`_, Wido den Hollander)
-* mgr: Modify mgr-influx module database check to not require admin privileges (`pr#18102 <https://github.com/ceph/ceph/pull/18102>`_, Benjeman Meekhof)
-* mgr: mon,mgr: improve 'mgr module disable' cmd (`pr#21188 <https://github.com/ceph/ceph/pull/21188>`_, Gu Zhongyan)
-* mgr: mon, mgr: move "osd pool stats" command to mgr and mgr python module (`pr#19985 <https://github.com/ceph/ceph/pull/19985>`_, Chang Liu)
-* mgr: mon/MgrStatMonitor: fix formatting of pending_digest (`issue#22991 <http://tracker.ceph.com/issues/22991>`_, `pr#20426 <https://github.com/ceph/ceph/pull/20426>`_, Patrick Donnelly)
-* mgr,mon: mon/MgrMonitor: read cmd descs if empty on update_from_paxos() (`issue#21300 <http://tracker.ceph.com/issues/21300>`_, `pr#17846 <https://github.com/ceph/ceph/pull/17846>`_, Joao Eduardo Luis)
-* mgr,mon: mon,mgr: remove single wildcard '\*' from ceph comand line description (`pr#21139 <https://github.com/ceph/ceph/pull/21139>`_, Gu Zhongyan)
-* mgr,mon: mon/mgr: sync "mgr_command_descs","osd_metadata" and "mgr_metadata" prefixes to new mons (`issue#21527 <http://tracker.ceph.com/issues/21527>`_, `pr#17929 <https://github.com/ceph/ceph/pull/17929>`_, huanwen ren)
-* mgr,mon: mon/MonCommands: mgr metadata - improve parameter naming consistency (`issue#23330 <http://tracker.ceph.com/issues/23330>`_, `pr#20866 <https://github.com/ceph/ceph/pull/20866>`_, Jan Fajerski)
-* mgr: preventing blank hostname in DaemonState (`issue#20887 <http://tracker.ceph.com/issues/20887>`_, `issue#21060 <http://tracker.ceph.com/issues/21060>`_, `pr#17138 <https://github.com/ceph/ceph/pull/17138>`_, liuchang0812)
-* mgr: prometheus: added osd commit/apply latency metrics (#22718) (`issue#22718 <http://tracker.ceph.com/issues/22718>`_, `pr#19980 <https://github.com/ceph/ceph/pull/19980>`_, Konstantin Shalygin)
-* mgr: prometheus: Don't crash on OSDs without metadata (`pr#20539 <https://github.com/ceph/ceph/pull/20539>`_, Christopher Blum)
-* mgr: prometheus fix metadata labels (`pr#21557 <https://github.com/ceph/ceph/pull/21557>`_, Jan Fajerski)
-* mgr: prometheus: set metadata metrics value to '1' (#22717) (`issue#22717 <http://tracker.ceph.com/issues/22717>`_, `pr#19979 <https://github.com/ceph/ceph/pull/19979>`_, Konstantin Shalygin)
-* mgr: pybind/mgr/balancer: add sanity check against empty adjusted_map (`pr#20836 <https://github.com/ceph/ceph/pull/20836>`_, xie xingguo)
-* mgr: pybind/mgr/balancer: fix pool-deletion vs auto-optimization race (`pr#20706 <https://github.com/ceph/ceph/pull/20706>`_, xie xingguo)
-* mgr: pybind/mgr/balancer: fix sanity check against empty weight-set (`pr#20278 <https://github.com/ceph/ceph/pull/20278>`_, xie xingguo)
-* mgr: pybind/mgr/balancer: increase bad_steps properly (`pr#20194 <https://github.com/ceph/ceph/pull/20194>`_, xie xingguo)
-* mgr: pybind/mgr/balancer: load weight-set from ms (`pr#20197 <https://github.com/ceph/ceph/pull/20197>`_, xie xingguo)
-* mgr: pybind/mgr/balancer: more specific command outputs (`pr#20305 <https://github.com/ceph/ceph/pull/20305>`_, xie xingguo)
-* mgr: pybind/mgr/balancer: remove optimization plan properly (`pr#20224 <https://github.com/ceph/ceph/pull/20224>`_, xie xingguo)
-* mgr: pybind/mgr/balancer: two more fixes (`pr#20788 <https://github.com/ceph/ceph/pull/20788>`_, xie xingguo)
-* mgr: pybind/mgr/dashboard: add url_prefix (`issue#20568 <http://tracker.ceph.com/issues/20568>`_, `pr#17119 <https://github.com/ceph/ceph/pull/17119>`_, Nick Erdmann)
-* mgr: pybind/mgr/dashboard: fix duplicated slash in html href (`issue#22851 <http://tracker.ceph.com/issues/22851>`_, `pr#20229 <https://github.com/ceph/ceph/pull/20229>`_, Shengjing Zhu)
-* mgr,pybind: mgr/dashboard: fix pool size base conversion (`pr#16771 <https://github.com/ceph/ceph/pull/16771>`_, Yixing Yan)
-* mgr: pybind/mgr/dashboard: fix reverse proxy support (`issue#22557 <http://tracker.ceph.com/issues/22557>`_, `pr#19758 <https://github.com/ceph/ceph/pull/19758>`_, Nick Erdmann)
-* mgr,pybind: mgr/iostat: print output as a table (`pr#21338 <https://github.com/ceph/ceph/pull/21338>`_, Mohamad Gebai)
-* mgr: pybind/mgr/localpool: module to automagically create localized pools (`pr#17528 <https://github.com/ceph/ceph/pull/17528>`_, Sage Weil)
-* mgr: pybind/mgr/mgr_module: add default param for MgrStandbyModule.get_con… (`pr#19948 <https://github.com/ceph/ceph/pull/19948>`_, Kefu Chai)
-* mgr: pybind/mgr/mgr_module: make rados handle available to all modules (`pr#19972 <https://github.com/ceph/ceph/pull/19972>`_, Sage Weil)
-* mgr: pybind/mgr_module: move PRIO\_\* and PERFCOUNTER\_\* to MgrModule class (`pr#18251 <https://github.com/ceph/ceph/pull/18251>`_, Jan Fajerski)
-* mgr: pybind/mgr: new 'hello world' mgr module skeleton (`pr#19491 <https://github.com/ceph/ceph/pull/19491>`_, Yaarit Hatuka)
-* mgr: pybind/mgr/prometheus: add file_sd_config command (`pr#21061 <https://github.com/ceph/ceph/pull/21061>`_, Jan Fajerski)
-* mgr: pybind/mgr/prometheus: add osd_in/out metric; make osd_weight a metric (`pr#18243 <https://github.com/ceph/ceph/pull/18243>`_, Jan Fajerski)
-* mgr: pybind/mgr/prometheus: add StandbyModule and handle failed MON cluster (`pr#19744 <https://github.com/ceph/ceph/pull/19744>`_, Jan Fajerski)
-* mgr: pybind/mgr/prometheus: don't crash when encountering an unknown PG state (`pr#18903 <https://github.com/ceph/ceph/pull/18903>`_, Jan Fajerski)
-* mgr: pybind/mgr/prometheus: don't export metrics for dead daemon; new metrics (`pr#20506 <https://github.com/ceph/ceph/pull/20506>`_, Jan Fajerski)
-* mgr: pybind/mgr/prometheus: fix creation of osd_metadata metric (`pr#21530 <https://github.com/ceph/ceph/pull/21530>`_, Jan Fajerski)
-* mgr: pybind/mgr/prometheus: fix metric type undef -> untyped (`issue#22313 <http://tracker.ceph.com/issues/22313>`_, `pr#19524 <https://github.com/ceph/ceph/pull/19524>`_, Ilya Margolin)
-* mgr: pybind/mgr/prometheus: fix metric type undef -> untyped (`pr#18208 <https://github.com/ceph/ceph/pull/18208>`_, Jan Fajerski)
-* mgr,pybind: pybing/mgr/prometheus: return default port if config-key get returns … (`pr#21696 <https://github.com/ceph/ceph/pull/21696>`_, Jan Fajerski)
-* mgr: python interface rework + enable modules to run in standby mode (`issue#21593 <http://tracker.ceph.com/issues/21593>`_, `issue#17460 <http://tracker.ceph.com/issues/17460>`_, `pr#16651 <https://github.com/ceph/ceph/pull/16651>`_, John Spray, Sage Weil)
-* mgr: quieten logging on missing OSD stats (`pr#20485 <https://github.com/ceph/ceph/pull/20485>`_, John Spray)
-* mgr,rbd: mgr/dashboard: added iSCSI IOPS/throughput metrics (`issue#21391 <http://tracker.ceph.com/issues/21391>`_, `pr#18653 <https://github.com/ceph/ceph/pull/18653>`_, Jason Dillaman)
-* mgr,rbd: mgr/dashboard: fix duplicate images listed on iSCSI status page (`issue#21017 <http://tracker.ceph.com/issues/21017>`_, `pr#17055 <https://github.com/ceph/ceph/pull/17055>`_, Jason Dillaman)
-* mgr: reconcile can_run checks and selftest (`pr#21607 <https://github.com/ceph/ceph/pull/21607>`_, John Spray, Kefu Chai)
-* mgr: remove a few junk lines (`pr#20005 <https://github.com/ceph/ceph/pull/20005>`_, John Spray)
-* mgr: remove unused static files from dashboard module (`pr#16762 <https://github.com/ceph/ceph/pull/16762>`_, John Spray)
-* mgr: request daemon's metadata when receiving a report from an unknown server (`issue#21687 <http://tracker.ceph.com/issues/21687>`_, `pr#18484 <https://github.com/ceph/ceph/pull/18484>`_, Chang Liu)
-* mgr,rgw: mgr/dashboard: RGW page (`pr#19512 <https://github.com/ceph/ceph/pull/19512>`_, Chang Liu)
-* mgr,rgw: prometheus: Implement rgw_metadata metric (`pr#21383 <https://github.com/ceph/ceph/pull/21383>`_, Boris Ranto)
-* mgr: safety checks on pyThreadState usage (`pr#18093 <https://github.com/ceph/ceph/pull/18093>`_, John Spray)
-* mgr: set explicit thread name (`issue#21404 <http://tracker.ceph.com/issues/21404>`_, `pr#17756 <https://github.com/ceph/ceph/pull/17756>`_, John Spray)
-* mgr: silence warning from -Wsign-compare (`pr#17881 <https://github.com/ceph/ceph/pull/17881>`_, Jos Collin)
-* mgr: skip first non-zero incremental in PGMap::apply_incremental() (`issue#21773 <http://tracker.ceph.com/issues/21773>`_, `pr#18347 <https://github.com/ceph/ceph/pull/18347>`_, Aleksei Gutikov)
-* mgr/status: output to stdout, not stderr (`issue#24175 <http://tracker.ceph.com/issues/24175>`_, `pr#22135 <https://github.com/ceph/ceph/pull/22135>`_, John Spray)
-* mgr: store declared_types in MgrSession (`issue#21197 <http://tracker.ceph.com/issues/21197>`_, `pr#17932 <https://github.com/ceph/ceph/pull/17932>`_, John Spray)
-* mgr: systemd: Wait 10 seconds before restarting ceph-mgr (`issue#23083 <http://tracker.ceph.com/issues/23083>`_, `pr#20533 <https://github.com/ceph/ceph/pull/20533>`_, Wido den Hollander)
-* mgr,tests: mgr/dashboard: skip data pool testcase for none-bluestore clusters (`pr#21004 <https://github.com/ceph/ceph/pull/21004>`_, Tatjana Dehler)
-* mgr,tests: mgr/dashboard_v2: fix test_perf_counters_mgr_get (`pr#20916 <https://github.com/ceph/ceph/pull/20916>`_, Tiago Melo)
-* mgr,tests: qa: add new prometheus test to rados/mgr suite (`pr#20047 <https://github.com/ceph/ceph/pull/20047>`_, John Spray)
-* mgr,tests: qa: configure zabbix properly before selftest (`issue#22514 <http://tracker.ceph.com/issues/22514>`_, `pr#19634 <https://github.com/ceph/ceph/pull/19634>`_, John Spray)
-* mgr,tests: qa: fix mgr _load_module helper (`pr#18685 <https://github.com/ceph/ceph/pull/18685>`_, John Spray)
-* mgr,tools: mgr/iostat: implement 'ceph iostat' as a mgr plugin (`pr#20100 <https://github.com/ceph/ceph/pull/20100>`_, Mohamad Gebai)
-* mgr: use new style config opts + add metadata (`pr#17374 <https://github.com/ceph/ceph/pull/17374>`_, John Spray)
-* mgr/zabbix: Fix wrong log message (`pr#21237 <https://github.com/ceph/ceph/pull/21237>`_, Gu Zhongyan)
-* mgr/zabbix: monitoring template improvements (`pr#19901 <https://github.com/ceph/ceph/pull/19901>`_, Marc Schoechlin)
-* mon: Add `ceph osd get-require-min-compat-client` command (`pr#19015 <https://github.com/ceph/ceph/pull/19015>`_, hansbogert)
-* mon: add  'ceph osd pool get erasure allow_ec_overwrites' command (`pr#21102 <https://github.com/ceph/ceph/pull/21102>`_, Mykola Golub)
-* mon: add MMonHealth back (`issue#22462 <http://tracker.ceph.com/issues/22462>`_, `pr#20528 <https://github.com/ceph/ceph/pull/20528>`_, Kefu Chai)
-* mon: add mon_health_preluminous_compat_warning (`pr#16902 <https://github.com/ceph/ceph/pull/16902>`_, Sage Weil)
-* mon: a few conversions to monotonic clock (`pr#18595 <https://github.com/ceph/ceph/pull/18595>`_, Patrick Donnelly)
-* mon: align lspools output (`pr#19597 <https://github.com/ceph/ceph/pull/19597>`_, Jos Collin)
-* mon: allow cluter and debug logs to go to stderr, with appropriate prefix (`pr#19385 <https://github.com/ceph/ceph/pull/19385>`_, Sage Weil)
-* mon: cache reencoded osdmaps (`issue#23713 <http://tracker.ceph.com/issues/23713>`_, `pr#21605 <https://github.com/ceph/ceph/pull/21605>`_, Sage Weil, Xiaoxi CHEN)
-* mon: centralized config (`pr#20172 <https://github.com/ceph/ceph/pull/20172>`_, Sage Weil)
-* mon: "ceph osd crush rule rename" support (`pr#17029 <https://github.com/ceph/ceph/pull/17029>`_, xie xingguo)
-* mon: check monitor address configuration (`pr#18073 <https://github.com/ceph/ceph/pull/18073>`_, Li Wang)
-* mon: clean up cluster logging on mon events (`issue#22082 <http://tracker.ceph.com/issues/22082>`_, `pr#18822 <https://github.com/ceph/ceph/pull/18822>`_, John Spray)
-* mon: cleanups to optracker code (`pr#21371 <https://github.com/ceph/ceph/pull/21371>`_, John Spray)
-* mon: cleanup unused option mon_health_data_update_interval (`pr#17728 <https://github.com/ceph/ceph/pull/17728>`_, Yao Guotao)
-* mon: common/options: set max_background_jobs instead of max_background_compactions (`pr#18397 <https://github.com/ceph/ceph/pull/18397>`_, Kefu Chai)
-* mon: Compress the warnings of pgs not scrubbed or deep-scrubbed (`pr#17295 <https://github.com/ceph/ceph/pull/17295>`_, Zhi Zhang)
-* mon: do not use per_pool_sum_delta to show recovery summary (`issue#22727 <http://tracker.ceph.com/issues/22727>`_, `pr#20009 <https://github.com/ceph/ceph/pull/20009>`_, Chang Liu)
-* mon: don't blow away bootstrap-mgr on upgrades (`issue#20950 <http://tracker.ceph.com/issues/20950>`_, `pr#18399 <https://github.com/ceph/ceph/pull/18399>`_, John Spray)
-* mon: double mon_mgr_mkfs_grace from 60s -> 120s (`pr#20955 <https://github.com/ceph/ceph/pull/20955>`_, Sage Weil)
-* mon: Drop redundant access specifier, etc (cleanup) (`pr#19028 <https://github.com/ceph/ceph/pull/19028>`_, Shinobu Kinjo)
-* mon: dump percent_used PGMap field as float (`pr#20439 <https://github.com/ceph/ceph/pull/20439>`_, John Spray)
-* mon: dump servicemap along with MgrStatMonitor dump info (`pr#18760 <https://github.com/ceph/ceph/pull/18760>`_, Zhi Zhang)
-* mon: expand cap validity check for mgr, osd, mds (`issue#22525 <http://tracker.ceph.com/issues/22525>`_, `pr#21311 <https://github.com/ceph/ceph/pull/21311>`_, Jing Li, Sage Weil)
-* mon: final luminous compatset feature and osdmap flag (`pr#17333 <https://github.com/ceph/ceph/pull/17333>`_, Sage Weil)
-* mon: fix commands advertised during mon cluster upgrade (`pr#16871 <https://github.com/ceph/ceph/pull/16871>`_, Sage Weil)
-* mon: fix dropping mgr metadata for active mgr (#21260) (`issue#21260 <http://tracker.ceph.com/issues/21260>`_, `pr#17571 <https://github.com/ceph/ceph/pull/17571>`_, John Spray)
-* mon: fix "fs new" pool metadata update, tests (`issue#20959 <http://tracker.ceph.com/issues/20959>`_, `pr#16954 <https://github.com/ceph/ceph/pull/16954>`_, Greg Farnum)
-* mon: fix legacy health checks in 'ceph status' during upgrade; fix jewel-x upgrade combo (`pr#16967 <https://github.com/ceph/ceph/pull/16967>`_, Sage Weil)
-* mon: fix mgr using auth_client_required policy (`pr#20048 <https://github.com/ceph/ceph/pull/20048>`_, John Spray)
-* mon: fix `osd out` clog message (`issue#21249 <http://tracker.ceph.com/issues/21249>`_, `pr#17525 <https://github.com/ceph/ceph/pull/17525>`_, John Spray)
-* mon: fix slow op warning on mon, improve slow op warnings (`issue#23769 <http://tracker.ceph.com/issues/23769>`_, `pr#21684 <https://github.com/ceph/ceph/pull/21684>`_, Sage Weil)
-* mon: fix structure of 'features' command (`pr#20115 <https://github.com/ceph/ceph/pull/20115>`_, Sage Weil)
-* mon: fix two stray legacy get_health() callers (`pr#17269 <https://github.com/ceph/ceph/pull/17269>`_, Sage Weil)
-* mon: fix wrong mon-num counting  logic of 'ceph features' command (`pr#16887 <https://github.com/ceph/ceph/pull/16887>`_, xie xingguo)
-* mon: handle bad snapshot removal reqs gracefully (`issue#18746 <http://tracker.ceph.com/issues/18746>`_, `pr#20835 <https://github.com/ceph/ceph/pull/20835>`_, Paul Emmerich)
-* mon: handle monitor lag when killing mgrs (`issue#20629 <http://tracker.ceph.com/issues/20629>`_, `pr#18268 <https://github.com/ceph/ceph/pull/18268>`_, John Spray)
-* mon: incorrect MAX AVAIL in "ceph df" (`issue#21243 <http://tracker.ceph.com/issues/21243>`_, `pr#17513 <https://github.com/ceph/ceph/pull/17513>`_, liuchang0812)
-* mon: invalid JSON returned when querying pool parameters (`issue#23200 <http://tracker.ceph.com/issues/23200>`_, `pr#20745 <https://github.com/ceph/ceph/pull/20745>`_, Chang Liu)
-* mon/LogMonitor: call no_reply() on ignored log message (`pr#22104 <https://github.com/ceph/ceph/pull/22104>`_, Sage Weil)
-* mon: mark mgr reports as no_reply (`issue#22114 <http://tracker.ceph.com/issues/22114>`_, `pr#21057 <https://github.com/ceph/ceph/pull/21057>`_, Kefu Chai)
-* mon: mark mon_allow_pool_delete as observed (`pr#18125 <https://github.com/ceph/ceph/pull/18125>`_, Dan van der Ster)
-* mon: mark OSD beacons and pg_create messages as no_reply (`issue#22114 <http://tracker.ceph.com/issues/22114>`_, `pr#20517 <https://github.com/ceph/ceph/pull/20517>`_, Greg Farnum)
-* mon: mon/AuthMonitor: don't validate `fs authorize` caps with `valid_caps()` (`pr#21418 <https://github.com/ceph/ceph/pull/21418>`_, Joao Eduardo Luis)
-* mon: mon/ConfigMonitor: clean up prepare_command() (`pr#20911 <https://github.com/ceph/ceph/pull/20911>`_, Gu Zhongyan)
-* mon: mon/Elector: force election epoch bump on start (`issue#20949 <http://tracker.ceph.com/issues/20949>`_, `pr#16944 <https://github.com/ceph/ceph/pull/16944>`_, Sage Weil)
-* mon: mon/Elector: remove unused member fields start_stamp and ack_stamp (`pr#21091 <https://github.com/ceph/ceph/pull/21091>`_, runsisi)
-* mon: mon/LogMonitor: "log last" should return up to n entries (`pr#18759 <https://github.com/ceph/ceph/pull/18759>`_, Kefu Chai)
-* mon: mon/MDSMonitor: fix clang build failure (`pr#20637 <https://github.com/ceph/ceph/pull/20637>`_, Willem Jan Withagen)
-* mon: mon,mgr: make  osd_metric more popular and report slow ops to mgr (`issue#23045 <http://tracker.ceph.com/issues/23045>`_, `pr#20660 <https://github.com/ceph/ceph/pull/20660>`_, lvshanchun)
-* mon: mon/MgrMonitor: limit mgrmap history (`issue#22257 <http://tracker.ceph.com/issues/22257>`_, `pr#19185 <https://github.com/ceph/ceph/pull/19185>`_, Sage Weil)
-* mon: mon/MonCommands: fix copy-and-paste error (`pr#17271 <https://github.com/ceph/ceph/pull/17271>`_, xie xingguo)
-* mon: mon,option: set default value for mon_dns_srv_name (`issue#21204 <http://tracker.ceph.com/issues/21204>`_, `pr#17539 <https://github.com/ceph/ceph/pull/17539>`_, Kefu Chai)
-* mon: mon/OSDMonitor: add location option for "crush add-bucket" command (`pr#17125 <https://github.com/ceph/ceph/pull/17125>`_, xie xingguo)
-* mon: mon/OSDMonitor: add 'osd crush set-all-straw-buckets-to-straw2' (`pr#18460 <https://github.com/ceph/ceph/pull/18460>`_, Sage Weil)
-* mon: mon/OSDMonitor: add plain output for "crush class ls-osd" command (`pr#17034 <https://github.com/ceph/ceph/pull/17034>`_, xie xingguo)
-* mon: mon/OSDMonitor: add space after __func__ in log msg (`pr#19127 <https://github.com/ceph/ceph/pull/19127>`_, Kefu Chai)
-* mon: mon/OSDMonitor: Better prepare_command_pool_set E2BIG error message (`pr#19944 <https://github.com/ceph/ceph/pull/19944>`_, Brad Hubbard)
-* mon: mon/OSDMonitor.cc: fix expected_num_objects interpret error (`issue#22530 <http://tracker.ceph.com/issues/22530>`_, `pr#19651 <https://github.com/ceph/ceph/pull/19651>`_, Yang Honggang)
-* mon: mon/OSDMonitor.cc : set erasure-code-profile to "" when create replicated pools (`pr#19673 <https://github.com/ceph/ceph/pull/19673>`_, zouaiguo)
-* mon: mon/OSDMonitor: check last_scan_epoch instead when sending creates (`issue#20785 <http://tracker.ceph.com/issues/20785>`_, `pr#17248 <https://github.com/ceph/ceph/pull/17248>`_, Kefu Chai)
-* mon: mon/OSDMonitor: clean up cmd 'osd tree-from' (`pr#20839 <https://github.com/ceph/ceph/pull/20839>`_, Gu Zhongyan)
-* mon: mon/OSDMonitor: do not send_pg_creates with stale info (`issue#20785 <http://tracker.ceph.com/issues/20785>`_, `pr#17065 <https://github.com/ceph/ceph/pull/17065>`_, Kefu Chai)
-* mon: mon/OSDMonitor: error out if setting ruleset-\* ec profile property (`pr#17848 <https://github.com/ceph/ceph/pull/17848>`_, Sage Weil)
-* mon: mon/OSDMonitor: fix improper input/testing range of crush somke testing (`pr#17179 <https://github.com/ceph/ceph/pull/17179>`_, xie xingguo)
-* mon: mon/OSDMonitor: fix 'osd pg temp' unable to cleanup pg-temp (`pr#16892 <https://github.com/ceph/ceph/pull/16892>`_, xie xingguo)
-* mon: mon/OSDMonitor: implement 'osd crush ls <node>' (`pr#16920 <https://github.com/ceph/ceph/pull/16920>`_, Sage Weil)
-* mon: mon/OSDMonitor: kill pending upmap changes too if pool is gone (`pr#20704 <https://github.com/ceph/ceph/pull/20704>`_, xie xingguo)
-* mon: mon/OSDMonitor: logging non-active osd id when handling osd beacon (`pr#21092 <https://github.com/ceph/ceph/pull/21092>`_, runsisi)
-* mon: mon/OSDMonitor: make 'osd crush rule rename' idempotent (`issue#21162 <http://tracker.ceph.com/issues/21162>`_, `pr#17329 <https://github.com/ceph/ceph/pull/17329>`_, xie xingguo)
-* mon: mon/OSDMonitor: "osd pool application get" support (`issue#20976 <http://tracker.ceph.com/issues/20976>`_, `pr#16955 <https://github.com/ceph/ceph/pull/16955>`_, xie xingguo)
-* mon: mon/OSDMonitor: txsize should be greater or eq to prune_interval - 1 (`pr#21430 <https://github.com/ceph/ceph/pull/21430>`_, Kefu Chai)
-* mon: mon/PGMap: drop DISK LOG column (`pr#17617 <https://github.com/ceph/ceph/pull/17617>`_, Sage Weil)
-* mon: mon/PGMap: fix "0 stuck requests are blocked > 4096 sec" warn (`pr#17099 <https://github.com/ceph/ceph/pull/17099>`_, xie xingguo)
-* mon: mon/PGMap: nice numbers for 'data' section of 'ceph df' command (`pr#17368 <https://github.com/ceph/ceph/pull/17368>`_, xie xingguo)
-* mon: mon/PGMap: Remove unnecessary header (`pr#18343 <https://github.com/ceph/ceph/pull/18343>`_, Shinobu Kinjo)
-* mon: mon/PGMap: reweight::by_utilization - skip DNE osds (`issue#20970 <http://tracker.ceph.com/issues/20970>`_, `pr#17064 <https://github.com/ceph/ceph/pull/17064>`_, xie xingguo)
-* mon: mon/pgmap: update pool nearfull display (`pr#17043 <https://github.com/ceph/ceph/pull/17043>`_, huanwen ren)
-* mon: more aggressively convert crush rulesets -> distinct rules (`pr#17508 <https://github.com/ceph/ceph/pull/17508>`_, John Spray, Sage Weil)
-* mon: more constness (`pr#17748 <https://github.com/ceph/ceph/pull/17748>`_, Kefu Chai)
-* mon: node ls improvement (`pr#20820 <https://github.com/ceph/ceph/pull/20820>`_, Gu Zhongyan)
-* mon: 'node ls' mgr support (`pr#20711 <https://github.com/ceph/ceph/pull/20711>`_, Gu Zhongyan)
-* mon: NULL check of logger before use (`pr#18788 <https://github.com/ceph/ceph/pull/18788>`_, Amit Kumar)
-* mon,osd: dump "compression_algorithms" in "mon metadata" (`issue#24135 <http://tracker.ceph.com/issues/24135>`_, `issue#22420 <http://tracker.ceph.com/issues/22420>`_, `pr#22004 <https://github.com/ceph/ceph/pull/22004>`_, Kefu Chai, Casey Bodley)
-* mon: osd feature checks with 0 up osds (`issue#21471 <http://tracker.ceph.com/issues/21471>`_, `issue#20751 <http://tracker.ceph.com/issues/20751>`_, `pr#17831 <https://github.com/ceph/ceph/pull/17831>`_, Brad Hubbard, Sage Weil)
-* mon: osdmap prune (`pr#19331 <https://github.com/ceph/ceph/pull/19331>`_, Joao Eduardo Luis)
-* mon/OSDMonitor: cleanup: move bufferlist before use (`pr#18258 <https://github.com/ceph/ceph/pull/18258>`_, Shinobu Kinjo)
-* mon/OSDMonitor: use new style options (`pr#18209 <https://github.com/ceph/ceph/pull/18209>`_, Kefu Chai)
-* mon: osd/OSDMap.h: toss osd out if it has no more pending states (`pr#19642 <https://github.com/ceph/ceph/pull/19642>`_, xie xingguo)
-* mon: paxos cleanup (`pr#20078 <https://github.com/ceph/ceph/pull/20078>`_, huanwen ren)
-* mon/PGMap: let pg_string_state() return boost::optional<> (`issue#21609 <http://tracker.ceph.com/issues/21609>`_, `pr#18218 <https://github.com/ceph/ceph/pull/18218>`_, Kefu Chai)
-* mon/PGMap: use new-style options and cleanup (`pr#18647 <https://github.com/ceph/ceph/pull/18647>`_, Kefu Chai)
-* mon: post-luminous cleanup (part 3 of ?) (`pr#17607 <https://github.com/ceph/ceph/pull/17607>`_, Sage Weil)
-* mon: rate limit on health check update logging (`issue#20888 <http://tracker.ceph.com/issues/20888>`_, `pr#16942 <https://github.com/ceph/ceph/pull/16942>`_, John Spray)
-* mon: reenable timer to send digest when paxos is temporarily inactive (`issue#22142 <http://tracker.ceph.com/issues/22142>`_, `pr#19404 <https://github.com/ceph/ceph/pull/19404>`_, Jan Fajerski)
-* mon: remove health service (`pr#20119 <https://github.com/ceph/ceph/pull/20119>`_, Chang Liu)
-* mon: remove_is_write_ready() (`pr#19191 <https://github.com/ceph/ceph/pull/19191>`_, Kefu Chai)
-* mon: remove pre-luminous compat cruft (2 of many) (`pr#17322 <https://github.com/ceph/ceph/pull/17322>`_, Sage Weil)
-* mon: remove unused waiting_for_commit (`pr#18617 <https://github.com/ceph/ceph/pull/18617>`_, Kefu Chai)
-* mon: return directly after health_events_cleanup (`pr#16964 <https://github.com/ceph/ceph/pull/16964>`_, wang yang)
-* mon: revert mds metadata argument name change (`issue#22527 <http://tracker.ceph.com/issues/22527>`_, `pr#19926 <https://github.com/ceph/ceph/pull/19926>`_, Patrick Donnelly)
-* mon: show feature flags when printing MonSession (`pr#17535 <https://github.com/ceph/ceph/pull/17535>`_, Paul Emmerich)
-* mon: some cleanup (`pr#17067 <https://github.com/ceph/ceph/pull/17067>`_, huanwen ren)
-* mon,tests: vstart: set osd_pool_default_erasure_code_profile in initial ceph.conf (`pr#21008 <https://github.com/ceph/ceph/pull/21008>`_, Mykola Golub)
-* mon: update get_store_prefixes implementations (`issue#21534 <http://tracker.ceph.com/issues/21534>`_, `pr#17940 <https://github.com/ceph/ceph/pull/17940>`_, John Spray, huanwen ren)
-* mon: update PaxosService::cached_first_committed in PaxosService::maybe_trim() (`issue#11332 <http://tracker.ceph.com/issues/11332>`_, `pr#19397 <https://github.com/ceph/ceph/pull/19397>`_, Xuehan Xu, yupeng chen)
-* mon: use ceph_clock_now if message is self-generated (`pr#17311 <https://github.com/ceph/ceph/pull/17311>`_, huangjun)
-* mon: warn about using osd new instead of osd create (`issue#21023 <http://tracker.ceph.com/issues/21023>`_, `pr#17242 <https://github.com/ceph/ceph/pull/17242>`_, Neha Ojha)
-* msg/async/AsyncConnection: remove legacy feature case handle (`pr#18469 <https://github.com/ceph/ceph/pull/18469>`_, Haomai Wang)
-* msg/async: avoid referencing the temporary string (`pr#20640 <https://github.com/ceph/ceph/pull/20640>`_, Kefu Chai)
-* msg/async: batch handle msg_iovlen (`pr#18415 <https://github.com/ceph/ceph/pull/18415>`_, Jianpeng Ma)
-* msg/async/dpdk: remove xsky copyright and LGPL copying (`pr#21121 <https://github.com/ceph/ceph/pull/21121>`_, Kefu Chai)
-* msg/async/EventKqueue: assert on OOM (`pr#21488 <https://github.com/ceph/ceph/pull/21488>`_, Kefu Chai)
-* msg/async: fix ms_dpdk_coremask and ms_dpdk_coremask conflict (`pr#18678 <https://github.com/ceph/ceph/pull/18678>`_, chunmei)
-* msg/async:fix the incoming parameter type of EventCenter::process_events() (`pr#20607 <https://github.com/ceph/ceph/pull/20607>`_, shangfufei)
-* msg/async misc cleanup (`pr#18531 <https://github.com/ceph/ceph/pull/18531>`_, Jianpeng Ma)
-* msg/async:  misc cleanup (`pr#18575 <https://github.com/ceph/ceph/pull/18575>`_, Jianpeng Ma)
-* msg/async/rdma: a tiny typo fix (`pr#18660 <https://github.com/ceph/ceph/pull/18660>`_, Yan Lei)
-* msg/async/rdma: fix a coredump introduced by PR #18053 (`pr#18204 <https://github.com/ceph/ceph/pull/18204>`_, Yan Lei)
-* msg/async/rdma: fix a potential coredump when handling tx_buffers under heavy RDMA (`pr#18036 <https://github.com/ceph/ceph/pull/18036>`_, Yan Lei)
-* msg/async/rdma: fixes crash for multi rados client within one process (`pr#16981 <https://github.com/ceph/ceph/pull/16981>`_, Alex Mikheev, Haomai Wang, Adir Lev)
-* msg/async/rdma: fix Tx buffer leakage that can introduce "heartbeat no reply" (`pr#18053 <https://github.com/ceph/ceph/pull/18053>`_, Yan Lei)
-* msg/async/rdma: refactor rx buffer pool allocator (`pr#17018 <https://github.com/ceph/ceph/pull/17018>`_, Alex Mikheev)
-* msg/async/rdma: unnecessary reinitiliazation of an iterator (`pr#18190 <https://github.com/ceph/ceph/pull/18190>`_, JustL)
-* msg/async: size of EventCenter::file_events should be greater than fd (`issue#23253 <http://tracker.ceph.com/issues/23253>`_, `pr#20764 <https://github.com/ceph/ceph/pull/20764>`_, Yupeng Chen)
-* msg/async: use bitset<> to do the popcnt (`pr#18681 <https://github.com/ceph/ceph/pull/18681>`_, Kefu Chai)
-* msg/async: use device before checking (`pr#19738 <https://github.com/ceph/ceph/pull/19738>`_, Xiaoyan Li)
-* msg: drop duplicate include (`pr#19623 <https://github.com/ceph/ceph/pull/19623>`_, /bin/bash)
-* msg: drop the unnecessary polling_stop() (`pr#17079 <https://github.com/ceph/ceph/pull/17079>`_, Jos Collin)
-* msg: Initialize lkey,bound,port_cnt,num_chunk,gid_idx (`pr#17797 <https://github.com/ceph/ceph/pull/17797>`_, Amit Kumar)
-* msg: Initializing class members in module msg (`pr#17568 <https://github.com/ceph/ceph/pull/17568>`_, Amit Kumar)
-* msg: reimplement sigpipe blocking (`pr#18105 <https://github.com/ceph/ceph/pull/18105>`_, Greg Farnum)
-* msg: remove the ),it's redundant (`pr#17544 <https://github.com/ceph/ceph/pull/17544>`_, linxuhua)
-* msg: resurrect support for !CEPH_FEATURE_MSG_AUTH (`pr#19044 <https://github.com/ceph/ceph/pull/19044>`_, Ilya Dryomov)
-* msgr: Optimization for connection establishment (`pr#16006 <https://github.com/ceph/ceph/pull/16006>`_, shangfufei)
-* msg/simple: pass a char for reading from shutdown_rd_fd (`pr#19094 <https://github.com/ceph/ceph/pull/19094>`_, Kefu Chai)
-* NVMDevice: fix issued caused by #17002 (`pr#17112 <https://github.com/ceph/ceph/pull/17112>`_, Ziye Yang)
-* objclass-sdk: expose __cls_init() to the world (`pr#21581 <https://github.com/ceph/ceph/pull/21581>`_, Kefu Chai)
-* objecter: minor cleanups (`pr#19994 <https://github.com/ceph/ceph/pull/19994>`_, runsisi)
-* os/bluestore/bluestore_tool: Move redundant code into one method (`pr#19160 <https://github.com/ceph/ceph/pull/19160>`_, Shinobu Kinjo)
-* os/bluestore: implement BlueRocksEnv::AreFilesSame() (`issue#21842 <http://tracker.ceph.com/issues/21842>`_, `pr#18392 <https://github.com/ceph/ceph/pull/18392>`_, Kefu Chai)
-* os/bluestore: simplify and fix SharedBlob::put() (`issue#24211 <http://tracker.ceph.com/issues/24211>`_, `pr#22170 <https://github.com/ceph/ceph/pull/22170>`_, Sage Weil)
-* osd: additional protection for out-of-bounds EC reads (`issue#21629 <http://tracker.ceph.com/issues/21629>`_, `pr#18088 <https://github.com/ceph/ceph/pull/18088>`_, Jason Dillaman)
-* osd: add multiple objecter finishers (`pr#16521 <https://github.com/ceph/ceph/pull/16521>`_, Myoungwon Oh)
-* osd: add num_object_manifest (`pr#20690 <https://github.com/ceph/ceph/pull/20690>`_, Myoungwon Oh)
-* osd: add numpg_removing metric (`pr#18450 <https://github.com/ceph/ceph/pull/18450>`_, Sage Weil)
-* osd: add processed_subop_count for cls_cxx_subop_version() (`issue#21964 <http://tracker.ceph.com/issues/21964>`_, `pr#18610 <https://github.com/ceph/ceph/pull/18610>`_, Casey Bodley)
-* osd: add scrub week day constraint (`pr#18368 <https://github.com/ceph/ceph/pull/18368>`_, kungf)
-* osd: adjust osd_min_pg_log_entries (`issue#21026 <http://tracker.ceph.com/issues/21026>`_, `pr#17075 <https://github.com/ceph/ceph/pull/17075>`_, J. Eric Ivancich)
-* osd: allow FULL_TRY after failsafe (`pr#17177 <https://github.com/ceph/ceph/pull/17177>`_, Pan Liu)
-* osd: allow PG recovery scheduling preemption (`pr#17839 <https://github.com/ceph/ceph/pull/17839>`_, Sage Weil)
-* osd: async recovery (`pr#19811 <https://github.com/ceph/ceph/pull/19811>`_, Neha Ojha)
-* osd: avoid encoding the same log entries repeatedly for different peers (`pr#20201 <https://github.com/ceph/ceph/pull/20201>`_, Jianpeng Ma)
-* osd: avoid the config's get_val() overhead on the read path (`pr#20217 <https://github.com/ceph/ceph/pull/20217>`_, Radoslaw Zarzynski)
-* osd: avoid unnecessary ref-counting across PrimaryLogPG::get_rw_locks (`pr#21028 <https://github.com/ceph/ceph/pull/21028>`_, Radoslaw Zarzynski)
-* osd: be more precise about our asserts and cases when rebuilding missing sets (`issue#20985 <http://tracker.ceph.com/issues/20985>`_, `pr#17000 <https://github.com/ceph/ceph/pull/17000>`_, Greg Farnum)
-* osd: bring in dmclock library changes (`pr#16755 <https://github.com/ceph/ceph/pull/16755>`_, J. Eric Ivancich)
-* osd: bring in latest dmclock library updates (`pr#17997 <https://github.com/ceph/ceph/pull/17997>`_, J. Eric Ivancich)
-* osd: cap snaptrimq_len at 2^32 (`pr#21107 <https://github.com/ceph/ceph/pull/21107>`_, Kefu Chai)
-* osd: change log level when withholding pg creation (`issue#22440 <http://tracker.ceph.com/issues/22440>`_, `pr#20167 <https://github.com/ceph/ceph/pull/20167>`_, Dan van der Ster)
-* osd: change op delayed state to 'waiting for scrub' (`pr#19295 <https://github.com/ceph/ceph/pull/19295>`_, kungf)
-* osd: Change shard digests to hex like object info digests (`pr#21362 <https://github.com/ceph/ceph/pull/21362>`_, David Zafman)
-* osd: change the conditional in _update_calc_stats (`pr#13383 <https://github.com/ceph/ceph/pull/13383>`_, Zhiqiang Wang)
-* osd: check feature bits when encoding objectstore_perf_stat_t (`pr#20378 <https://github.com/ceph/ceph/pull/20378>`_, Kefu Chai)
-* osd: clean up dup index logic; maintain index flag logic in fewer places (`pr#16829 <https://github.com/ceph/ceph/pull/16829>`_, J. Eric Ivancich)
-* osd: clean up pre-luminous compat cruft (part 1 of many) (`pr#17247 <https://github.com/ceph/ceph/pull/17247>`_, Sage Weil)
-* osd: cleanups (`pr#17753 <https://github.com/ceph/ceph/pull/17753>`_, Kefu Chai)
-* osdc/Objecter: using coarse_mono instead (`pr#18473 <https://github.com/ceph/ceph/pull/18473>`_, Haomai Wang)
-* osdc/Objector: use std::shared_mutex instead of boost::shared_mutex (`issue#23910 <http://tracker.ceph.com/issues/23910>`_, `pr#21702 <https://github.com/ceph/ceph/pull/21702>`_, Abhishek Lekshmanan)
-* osd: correct several spell errors in comments (`pr#21064 <https://github.com/ceph/ceph/pull/21064>`_, songweibin)
-* osdc: Remove a bit too redundant public label (`pr#19466 <https://github.com/ceph/ceph/pull/19466>`_, Shinobu Kinjo)
-* osdc: self-managed snapshot helper should catch decode exception (`issue#24103 <http://tracker.ceph.com/issues/24103>`_, `issue#24000 <http://tracker.ceph.com/issues/24000>`_, `pr#21958 <https://github.com/ceph/ceph/pull/21958>`_, Jason Dillaman)
-* osd: debug dispatch_context cases where queries not sent (`pr#20917 <https://github.com/ceph/ceph/pull/20917>`_, Sage Weil)
-* osd: Deleting dead code PrimaryLogPG.cc (`pr#17339 <https://github.com/ceph/ceph/pull/17339>`_, Amit Kumar)
-* osd: don't crash on empty snapset (`issue#23851 <http://tracker.ceph.com/issues/23851>`_, `pr#21058 <https://github.com/ceph/ceph/pull/21058>`_, Mykola Golub, Igor Fedotov)
-* osd: Don't include same header twice (`pr#18319 <https://github.com/ceph/ceph/pull/18319>`_, Shinobu Kinjo)
-* osd: Don't initialze pointers by NULL or 0 (`pr#18311 <https://github.com/ceph/ceph/pull/18311>`_, Shinobu Kinjo)
-* osd: don't memcpy hobject_t in PrimaryLogPG::close_op_ctx() (`pr#21029 <https://github.com/ceph/ceph/pull/21029>`_, Radoslaw Zarzynski)
-* osd: don't process ostream strings when not debugging (`pr#20298 <https://github.com/ceph/ceph/pull/20298>`_, Mark Nelson)
-* osd: drop redundant comment (`pr#20347 <https://github.com/ceph/ceph/pull/20347>`_, songweibin)
-* osd: Drop the unused code in OSD::_collect_metadata (`pr#17131 <https://github.com/ceph/ceph/pull/17131>`_, Luo Kexue)
-* osd: drop unused osd_disk_tp related options (`pr#21339 <https://github.com/ceph/ceph/pull/21339>`_, Gu Zhongyan)
-* osd: eliminate ineffective container operations (`pr#19099 <https://github.com/ceph/ceph/pull/19099>`_, Igor Fedotov)
-* osd: enumerate device names in a simple way (`pr#18453 <https://github.com/ceph/ceph/pull/18453>`_, Sage Weil)
-* osd: exit(1) directly without lock if init fails (`pr#16647 <https://github.com/ceph/ceph/pull/16647>`_, Kefu Chai)
-* osd: fast dispatch of peering events and pg_map + osd sharded wq refactor (`pr#19973 <https://github.com/ceph/ceph/pull/19973>`_, Sage Weil)
-* osd: fine-grained statistics of logical object space usage (`pr#15199 <https://github.com/ceph/ceph/pull/15199>`_, xie xingguo)
-* osd: Fix assert when checking missing version (`issue#21218 <http://tracker.ceph.com/issues/21218>`_, `pr#20410 <https://github.com/ceph/ceph/pull/20410>`_, David Zafman)
-* osd: fix a valgrind issue (conditional jump depends on uninitialized value) (`issue#22641 <http://tracker.ceph.com/issues/22641>`_, `pr#19874 <https://github.com/ceph/ceph/pull/19874>`_, Myoungwon Oh)
-* osd: fix bug which cause can't erase OSDShardPGSlot (`pr#21771 <https://github.com/ceph/ceph/pull/21771>`_, Jianpeng Ma)
-* osd: fix build_initial_pg_history (`issue#21203 <http://tracker.ceph.com/issues/21203>`_, `pr#17423 <https://github.com/ceph/ceph/pull/17423>`_, w11979, Sage Weil)
-* osd: fix crash caused by divide by zero in heartbeat code (`pr#21373 <https://github.com/ceph/ceph/pull/21373>`_, Piotr Dałek)
-* osd: fix dpdk memzon mz_name setting issue (`pr#19809 <https://github.com/ceph/ceph/pull/19809>`_, chunmei Liu)
-* osd: fix dpdk runtime issue based on spdk/dpdk libarary (`pr#19559 <https://github.com/ceph/ceph/pull/19559>`_, chunmei Liu)
-* osd: fix dpdk worker references issue (`pr#19886 <https://github.com/ceph/ceph/pull/19886>`_, chunmei Liu)
-* osd: Fixes for osd_scrub_during_recovery handling (`issue#18206 <http://tracker.ceph.com/issues/18206>`_, `pr#17039 <https://github.com/ceph/ceph/pull/17039>`_, David Zafman)
-* osd: fix out of order caused by letting old msg from down osd be processed (`issue#22570 <http://tracker.ceph.com/issues/22570>`_, `pr#19796 <https://github.com/ceph/ceph/pull/19796>`_, Mingxin Liu)
-* osd: fix _process handling for pg vs slot race (`pr#21745 <https://github.com/ceph/ceph/pull/21745>`_, Sage Weil)
-* osd: fix recovery reservation bugs, and implement remote reservation preemption (`pr#18485 <https://github.com/ceph/ceph/pull/18485>`_, Sage Weil)
-* osd: fix replica/backfill target handling of REJECT (`issue#21613 <http://tracker.ceph.com/issues/21613>`_, `pr#18070 <https://github.com/ceph/ceph/pull/18070>`_, Sage Weil)
-* osd: fix reqid assignment for reply messages in OpRequest (`pr#17060 <https://github.com/ceph/ceph/pull/17060>`_, Yingxin Cheng)
-* osd: fix s390x build failure (`issue#23238 <http://tracker.ceph.com/issues/23238>`_, `pr#20969 <https://github.com/ceph/ceph/pull/20969>`_, Nathan Cutler)
-* osd: fix typos and some cleanups (`pr#19211 <https://github.com/ceph/ceph/pull/19211>`_, Enming Zhang)
-* osd: fix unordered read bug (for chunked object) (`issue#22369 <http://tracker.ceph.com/issues/22369>`_, `pr#19464 <https://github.com/ceph/ceph/pull/19464>`_, Myoungwon Oh)
-* osd: fix waiting_for_peered vs flushing (`issue#21407 <http://tracker.ceph.com/issues/21407>`_, `pr#17759 <https://github.com/ceph/ceph/pull/17759>`_, Sage Weil)
-* osd: flush operations for chunked objects (`pr#19294 <https://github.com/ceph/ceph/pull/19294>`_, Myoungwon Oh)
-* osd: generalize queueing and lock interface for OpWq (`pr#16030 <https://github.com/ceph/ceph/pull/16030>`_, Myoungwon Oh, Kefu Chai, Samuel Just)
-* osd: get loadavg per cpu for scrub load threshold check (`pr#17718 <https://github.com/ceph/ceph/pull/17718>`_, kungf)
-* osd: get rid off extent map in object_info (`pr#19616 <https://github.com/ceph/ceph/pull/19616>`_, Igor Fedotov)
-* osd: hold lock while accessing recovery_needs_sleep (`issue#21566 <http://tracker.ceph.com/issues/21566>`_, `pr#18022 <https://github.com/ceph/ceph/pull/18022>`_, Neha Ojha)
-* osd: Improve recovery stat handling by using peer_missing and missing_loc info (`issue#22837 <http://tracker.ceph.com/issues/22837>`_, `pr#20220 <https://github.com/ceph/ceph/pull/20220>`_, Sage Weil, David Zafman)
-* osd: Improve size scrub error handling and ignore system attrs in xattr checking (`issue#20243 <http://tracker.ceph.com/issues/20243>`_, `issue#18836 <http://tracker.ceph.com/issues/18836>`_, `pr#16407 <https://github.com/ceph/ceph/pull/16407>`_, David Zafman)
-* osd: include front_iface+back_iface in metadata (`issue#20956 <http://tracker.ceph.com/issues/20956>`_, `pr#16941 <https://github.com/ceph/ceph/pull/16941>`_, John Spray)
-* osd: Initialization of data members (`pr#17691 <https://github.com/ceph/ceph/pull/17691>`_, Amit Kumar)
-* osd: Initialization of pointer cls (`pr#17115 <https://github.com/ceph/ceph/pull/17115>`_, amitkuma)
-* osd: Initializing start_offset,last_offset,offset (`pr#19333 <https://github.com/ceph/ceph/pull/19333>`_, Amit Kumar)
-* osd: initial minimal efforts to clean up PG interface (`pr#17708 <https://github.com/ceph/ceph/pull/17708>`_, Sage Weil)
-* osd: introduce sub-chunks to erasure code plugin interface (`issue#19278 <http://tracker.ceph.com/issues/19278>`_, `pr#15193 <https://github.com/ceph/ceph/pull/15193>`_, Myna Vajha)
-* osd: kill snapdirs (`pr#17579 <https://github.com/ceph/ceph/pull/17579>`_, Sage Weil)
-* osd: Make dmclock's anticipation timeout be configurable (`pr#18827 <https://github.com/ceph/ceph/pull/18827>`_, Taewoong Kim)
-* osd: make operations on ReplicatedBackend::in_progress_ops more effective (`pr#19035 <https://github.com/ceph/ceph/pull/19035>`_, Igor Fedotov)
-* osd: make PG::\*Force\* event structs public (`pr#21312 <https://github.com/ceph/ceph/pull/21312>`_, Willem Jan Withagen)
-* osd: make scrub no deadline when max interval is zero (`pr#18354 <https://github.com/ceph/ceph/pull/18354>`_, kungf)
-* osd: make scrub right now when pg stats_invalid is true (`pr#17884 <https://github.com/ceph/ceph/pull/17884>`_, kungf)
-* osd: make scrub wait for ec read/modify/writes to apply (`issue#23339 <http://tracker.ceph.com/issues/23339>`_, `pr#20944 <https://github.com/ceph/ceph/pull/20944>`_, Sage Weil)
-* osd: make snapmapper warn+clean up instead of assert (`issue#22752 <http://tracker.ceph.com/issues/22752>`_, `pr#20040 <https://github.com/ceph/ceph/pull/20040>`_, Sage Weil)
-* osd: make stat_bytes and stat_bytes_used counters PRIO_USEFUL (`issue#21981 <http://tracker.ceph.com/issues/21981>`_, `pr#18637 <https://github.com/ceph/ceph/pull/18637>`_, Yao Zongyou)
-* osd: make the PG's SORTBITWISE assert a more generous shutdown (`issue#20416 <http://tracker.ceph.com/issues/20416>`_, `pr#18047 <https://github.com/ceph/ceph/pull/18047>`_, Greg Farnum)
-* osd: Making use of find to reduce computational complexity (`pr#19732 <https://github.com/ceph/ceph/pull/19732>`_, Shinobu Kinjo)
-* osd: migrate PGLOG\_\* macros to constexpr (`issue#20811 <http://tracker.ceph.com/issues/20811>`_, `pr#19352 <https://github.com/ceph/ceph/pull/19352>`_, Jesse Williamson)
-* osd: minor optimizations for op wq (`pr#17704 <https://github.com/ceph/ceph/pull/17704>`_, Sage Weil, J. Eric Ivancich)
-* osd: min_pg_log_entries == max == pg_log_dups_tracked (`pr#20394 <https://github.com/ceph/ceph/pull/20394>`_, Sage Weil)
-* osd: misc cleanups (`pr#17430 <https://github.com/ceph/ceph/pull/17430>`_, songweibin)
-* osd: miscellaneous cleanups (`pr#21431 <https://github.com/ceph/ceph/pull/21431>`_, songweibin)
-* osd: more debugging for snapmapper bug (`issue#21557 <http://tracker.ceph.com/issues/21557>`_, `pr#19366 <https://github.com/ceph/ceph/pull/19366>`_, Sage Weil)
-* osd: object added to missing set for backfill, but is not in recovering, error! (`issue#18162 <http://tracker.ceph.com/issues/18162>`_, `pr#18145 <https://github.com/ceph/ceph/pull/18145>`_, David Zafman)
-* osd: only exit if \*latest\* map(s) say we are destroyed (`issue#22673 <http://tracker.ceph.com/issues/22673>`_, `pr#19988 <https://github.com/ceph/ceph/pull/19988>`_, Sage Weil)
-* osd: Only scan for omap corruption once (`issue#21328 <http://tracker.ceph.com/issues/21328>`_, `pr#17705 <https://github.com/ceph/ceph/pull/17705>`_, David Zafman)
-* osd,os,io: Initializing C_ProxyChunkRead members,queue,request (`pr#19336 <https://github.com/ceph/ceph/pull/19336>`_, amitkuma)
-* osd: pass ops_blocked_by_scrub() to requeue_scrub() (`pr#20319 <https://github.com/ceph/ceph/pull/20319>`_, Kefu Chai)
-* osd: pass pool options to ObjectStore on pg create (`issue#22419 <http://tracker.ceph.com/issues/22419>`_, `pr#19486 <https://github.com/ceph/ceph/pull/19486>`_, Sage Weil)
-* osd/PG: fix clang build vs private state events (`pr#18217 <https://github.com/ceph/ceph/pull/18217>`_, Sage Weil)
-* osd/PG: handle flushed event directly (`pr#19441 <https://github.com/ceph/ceph/pull/19441>`_, wumingqiao)
-* osd/PrimaryLogPG: derr when object size becomes over osd_max_object_size (`pr#19049 <https://github.com/ceph/ceph/pull/19049>`_, Shinobu Kinjo)
-* osd: process _scan_snaps() with all snapshots with head (`issue#22881 <http://tracker.ceph.com/issues/22881>`_, `issue#23909 <http://tracker.ceph.com/issues/23909>`_, `pr#21546 <https://github.com/ceph/ceph/pull/21546>`_, David Zafman)
-* osd: publish osdmap to OSDService before starting wq threads (`issue#21977 <http://tracker.ceph.com/issues/21977>`_, `pr#21623 <https://github.com/ceph/ceph/pull/21623>`_, Sage Weil)
-* osd: pull latest dmclock subtree (`pr#19345 <https://github.com/ceph/ceph/pull/19345>`_, J. Eric Ivancich)
-* osd: put peering events in main sharded wq (`pr#18752 <https://github.com/ceph/ceph/pull/18752>`_, Sage Weil)
-* osd: put pg removal in op_wq (`pr#19433 <https://github.com/ceph/ceph/pull/19433>`_, Sage Weil)
-* osd: reduce all_info map find to get primary (`pr#19425 <https://github.com/ceph/ceph/pull/19425>`_, kungf)
-* osd: refcount for manifest object (redirect, chunked) (`pr#19935 <https://github.com/ceph/ceph/pull/19935>`_, Myoungwon Oh)
-* osd: remove cost from mclock op queues; cost not handled well in dmclock (`pr#21428 <https://github.com/ceph/ceph/pull/21428>`_, J. Eric Ivancich)
-* osd: Remove double space (`pr#19296 <https://github.com/ceph/ceph/pull/19296>`_, Shinobu Kinjo)
-* osd: remove duplicated "commit_queued_for_journal_write" in OpTracker (`issue#23440 <http://tracker.ceph.com/issues/23440>`_, `pr#21018 <https://github.com/ceph/ceph/pull/21018>`_, ashitakasam)
-* osd: remove duplicated function ec_pool in pg_pool_t (`pr#18059 <https://github.com/ceph/ceph/pull/18059>`_, Chang Liu)
-* osd: Remove redundant local variable declaration (`pr#19812 <https://github.com/ceph/ceph/pull/19812>`_, Shinobu Kinjo)
-* osd: Remove unnecessary headers (`pr#19735 <https://github.com/ceph/ceph/pull/19735>`_, Shinobu Kinjo)
-* osd: remove unused ReplicatedBackend::objects_read_async() (`pr#18779 <https://github.com/ceph/ceph/pull/18779>`_, Kefu Chai)
-* osd: remove unused variable in do_proxy_write (`pr#17391 <https://github.com/ceph/ceph/pull/17391>`_, Myoungwon Oh)
-* osd: replace mclock subop opclass w/ rep_op opclass; combine duplicated code (`pr#18194 <https://github.com/ceph/ceph/pull/18194>`_, J. Eric Ivancich)
-* osd: replace vectors_equal() with operator==(vector<>, vector<>) (`pr#18064 <https://github.com/ceph/ceph/pull/18064>`_, Kefu Chai)
-* osd: request new map from PG when needed (`issue#21428 <http://tracker.ceph.com/issues/21428>`_, `pr#17795 <https://github.com/ceph/ceph/pull/17795>`_, Josh Durgin)
-* osd: resend osd_pgtemp if it's not acked (`issue#23610 <http://tracker.ceph.com/issues/23610>`_, `pr#21310 <https://github.com/ceph/ceph/pull/21310>`_, Kefu Chai)
-* osd: Revert use of dmclock message feature bit since not yet finalized (`pr#21398 <https://github.com/ceph/ceph/pull/21398>`_, J. Eric Ivancich)
-* osd,rgw,librbd: SCA fixes (`pr#18495 <https://github.com/ceph/ceph/pull/18495>`_, Danny Al-Gaaf)
-* osd: set min_version to newest version in maybe_force_recovery (`pr#17752 <https://github.com/ceph/ceph/pull/17752>`_, Xinze Chi)
-* osd: Sign in early SIGHUP signal (`issue#22746 <http://tracker.ceph.com/issues/22746>`_, `pr#19958 <https://github.com/ceph/ceph/pull/19958>`_, huanwen ren)
-* osd: silence maybe-uninitialized false positives (`pr#19820 <https://github.com/ceph/ceph/pull/19820>`_, Yao Zongyou)
-* osd: silence warnings from -Wsign-compare (`pr#17872 <https://github.com/ceph/ceph/pull/17872>`_, Jos Collin)
-* osd: skip dumping logical devices (`pr#20740 <https://github.com/ceph/ceph/pull/20740>`_, songweibin)
-* osd: speed up get_key_name (`issue#21026 <http://tracker.ceph.com/issues/21026>`_, `pr#17071 <https://github.com/ceph/ceph/pull/17071>`_, J. Eric Ivancich)
-* osd: s/random_shuffle()/shuffle()/ (`pr#19872 <https://github.com/ceph/ceph/pull/19872>`_, Willem Jan Withagen, Kefu Chai, Greg Farnum)
-* osd: subscribe osdmaps if any pending pgs (`issue#22113 <http://tracker.ceph.com/issues/22113>`_, `pr#18916 <https://github.com/ceph/ceph/pull/18916>`_, Kefu Chai)
-* osd: subscribe to new osdmap while waiting_for_healthy (`issue#21121 <http://tracker.ceph.com/issues/21121>`_, `pr#17244 <https://github.com/ceph/ceph/pull/17244>`_, Sage Weil)
-* osd: support class method whitelisting within caps (`pr#19786 <https://github.com/ceph/ceph/pull/19786>`_, Jason Dillaman)
-* osd: treat successful and erroroneous writes the same for log trimming (`issue#22050 <http://tracker.ceph.com/issues/22050>`_, `pr#20827 <https://github.com/ceph/ceph/pull/20827>`_, Josh Durgin)
-* osd: two cleanups (`pr#20830 <https://github.com/ceph/ceph/pull/20830>`_, songweibin)
-* osd: update dmclock library w git subtree pull (`pr#17737 <https://github.com/ceph/ceph/pull/17737>`_, J. Eric Ivancich)
-* osd: update info only if new_interval (`pr#17437 <https://github.com/ceph/ceph/pull/17437>`_, Kefu Chai)
-* osd: update store with options after pg is created (`issue#22419 <http://tracker.ceph.com/issues/22419>`_, `pr#20044 <https://github.com/ceph/ceph/pull/20044>`_, Kefu Chai)
-* osd: use dmclock library client_info_f function dynamically (`pr#17063 <https://github.com/ceph/ceph/pull/17063>`_, bspark)
-* osd: use existing osd_required variable for messenger policy (`pr#20223 <https://github.com/ceph/ceph/pull/20223>`_, Yan Jun)
-* osd: use prefix increment for non trivial iterator (`pr#19097 <https://github.com/ceph/ceph/pull/19097>`_, Kefu Chai)
-* osd: Use specializations, typedefs instead (`pr#19354 <https://github.com/ceph/ceph/pull/19354>`_, Shinobu Kinjo)
-* osd: Warn about objects with too many omap entries (`pr#16332 <https://github.com/ceph/ceph/pull/16332>`_, Brad Hubbard)
-* os/filestore/HashIndex.h: fixed a typo in comment (`pr#17685 <https://github.com/ceph/ceph/pull/17685>`_, yaoguotao)
-* os: Initializing uninitialized members aio_info (`pr#17066 <https://github.com/ceph/ceph/pull/17066>`_, amitkuma)
-* os: Removing dead code from LFNIndex.cc (`pr#17297 <https://github.com/ceph/ceph/pull/17297>`_, Amit Kumar)
-* prometheus: Handle the TIME perf counter type metrics (`pr#21749 <https://github.com/ceph/ceph/pull/21749>`_, Boris Ranto)
-* pybind: add return note in rbd.pyx (`pr#21768 <https://github.com/ceph/ceph/pull/21768>`_, Zheng Yin)
-* pybind/ceph_daemon: expand the order of magnitude of (`issue#23962 <http://tracker.ceph.com/issues/23962>`_, `pr#21836 <https://github.com/ceph/ceph/pull/21836>`_, Guan yunfei)
-* pybind: fix chart size become bigger when refresh (`issue#20746 <http://tracker.ceph.com/issues/20746>`_, `pr#16857 <https://github.com/ceph/ceph/pull/16857>`_, Yixing Yan)
-* pybind: mgr/dashboard: fix rbd's pool sub menu (`pr#16774 <https://github.com/ceph/ceph/pull/16774>`_, yanyx)
-* pybind,rbd: pybind/rbd: support open the image by image_id (`pr#19361 <https://github.com/ceph/ceph/pull/19361>`_, songweibin)
-* pybind: remove unused get_ceph_version() (`pr#17727 <https://github.com/ceph/ceph/pull/17727>`_, Kefu Chai)
-* qa: add cbt repo parameter (`pr#18543 <https://github.com/ceph/ceph/pull/18543>`_, Neha Ojha)
-* qa: Add cephmetrics suite (`pr#18451 <https://github.com/ceph/ceph/pull/18451>`_, Zack Cerza)
-* qa: add upgrade/luminous-x suite (`pr#17160 <https://github.com/ceph/ceph/pull/17160>`_, Yuri Weinstein)
-* qa/crontab: run the perf-basic suite every day (`pr#21252 <https://github.com/ceph/ceph/pull/21252>`_, Neha Ojha)
-* qa: Decreased amount of jobs on master, kraken, luminous runs (`pr#17069 <https://github.com/ceph/ceph/pull/17069>`_, Yuri Weinstein)
-* qa: install collectl with cbt task (`pr#19324 <https://github.com/ceph/ceph/pull/19324>`_, Neha Ojha)
-* qa: mimic-dev1 backports to avoid trusty nodes (`pr#19600 <https://github.com/ceph/ceph/pull/19600>`_, Kefu Chai)
-* qa: preserve cbt task results (`pr#19364 <https://github.com/ceph/ceph/pull/19364>`_, Neha Ojha)
-* qa:  qa/ceph-disk: enlarge the simulated SCSI disk (`issue#22136 <http://tracker.ceph.com/issues/22136>`_, `pr#19199 <https://github.com/ceph/ceph/pull/19199>`_, Kefu Chai)
-* qa/suites/perf-basic: add desc regarding test machines (`pr#21183 <https://github.com/ceph/ceph/pull/21183>`_, Neha Ojha)
-* qa/suites/rados/multimon/tasks/mon_lock_with_skew: whitelist PG (`pr#17004 <https://github.com/ceph/ceph/pull/17004>`_, Sage Weil)
-* qa/suites/rados/perf: add optimized settings (`pr#17786 <https://github.com/ceph/ceph/pull/17786>`_, Neha Ojha)
-* qa/suites/rados/perf: add workloads (`pr#18573 <https://github.com/ceph/ceph/pull/18573>`_, Neha Ojha)
-* qa/suites/rados/verify/validater/valgrind: whitelist PG (`pr#17005 <https://github.com/ceph/ceph/pull/17005>`_, Sage Weil)
-* qa/suites/upgrade/jewel-x/parallel: tolerate laggy mgr (`pr#17227 <https://github.com/ceph/ceph/pull/17227>`_, Sage Weil)
-* qa/suites/upgrade/kraken-x: fixes (`pr#16881 <https://github.com/ceph/ceph/pull/16881>`_, Sage Weil)
-* qa/suites/upgrade/luminous-x fixes (`pr#22101 <https://github.com/ceph/ceph/pull/22101>`_, Sage Weil)
-* qa/tests - Added options to use both cases: mon.a and installer.0 (`pr#19745 <https://github.com/ceph/ceph/pull/19745>`_, Yuri Weinstein)
-* qa/tests - Fixed typo in crontab entry (`pr#21482 <https://github.com/ceph/ceph/pull/21482>`_, Yuri Weinstein)
-* qa/tests: fixed typo (`pr#21728 <https://github.com/ceph/ceph/pull/21728>`_, Yuri Weinstein)
-* qa/tests - minor clean ups and made perf-suite run 3 times, so we can… (`pr#21309 <https://github.com/ceph/ceph/pull/21309>`_, Yuri Weinstein)
-* qa/tests - one more typo fixed :( (`pr#21483 <https://github.com/ceph/ceph/pull/21483>`_, Yuri Weinstein)
-* qa/tests: removed rest suite from the mix (`pr#21743 <https://github.com/ceph/ceph/pull/21743>`_, Yuri Weinstein)
-* qa: wait longer for osd to flush pg stats (`issue#24321 <http://tracker.ceph.com/issues/24321>`_, `pr#22288 <https://github.com/ceph/ceph/pull/22288>`_, Kefu Chai)
-* qa/workunits/ceph-disk: --no-mon-config (`pr#21956 <https://github.com/ceph/ceph/pull/21956>`_, Kefu Chai)
-* rados: make ceph_perf_msgr_client work for multiple jobs (`issue#22103 <http://tracker.ceph.com/issues/22103>`_, `pr#18877 <https://github.com/ceph/ceph/pull/18877>`_, Jeegn Chen)
-* rbd: add deep cp CLI method (`pr#19996 <https://github.com/ceph/ceph/pull/19996>`_, songweibin)
-* rbd: add group rename methods (`issue#22981 <http://tracker.ceph.com/issues/22981>`_, `pr#20577 <https://github.com/ceph/ceph/pull/20577>`_, songweibin)
-* rbd: add notrim option to rbd map (`pr#21056 <https://github.com/ceph/ceph/pull/21056>`_, Hitoshi Kamei)
-* rbd: add parent info when moving child into trash bin (`pr#19280 <https://github.com/ceph/ceph/pull/19280>`_, songweibin)
-* rbd: adjusted "lock list" JSON and XML formatted output (`pr#19900 <https://github.com/ceph/ceph/pull/19900>`_, Jason Dillaman)
-* rbd: adjusted "showmapped" JSON and XML formatted output (`pr#19937 <https://github.com/ceph/ceph/pull/19937>`_, Mykola Golub)
-* rbd: allow remove all unprotected snapshots (`issue#23126 <http://tracker.ceph.com/issues/23126>`_, `pr#20608 <https://github.com/ceph/ceph/pull/20608>`_, songweibin)
-* rbd: allow trash rm/purge when pool quota is full used (`pr#20697 <https://github.com/ceph/ceph/pull/20697>`_, songweibin)
-* rbd: backport of mimic bug fixes (`issue#24009 <http://tracker.ceph.com/issues/24009>`_, `issue#24008 <http://tracker.ceph.com/issues/24008>`_, `pr#21930 <https://github.com/ceph/ceph/pull/21930>`_, Jason Dillaman)
-* rbd: check if an image is already mapped before rbd map (`issue#20580 <http://tracker.ceph.com/issues/20580>`_, `pr#16517 <https://github.com/ceph/ceph/pull/16517>`_, Jing Li)
-* rbd: children list should support snapshot id optional (`issue#23399 <http://tracker.ceph.com/issues/23399>`_, `pr#20966 <https://github.com/ceph/ceph/pull/20966>`_, Jason Dillaman)
-* rbd: cleanup handling of IEC byte units (`pr#21564 <https://github.com/ceph/ceph/pull/21564>`_, Jason Dillaman)
-* rbd: clean up warnings when mirror commands used on non-setup pool (`issue#21319 <http://tracker.ceph.com/issues/21319>`_, `pr#17636 <https://github.com/ceph/ceph/pull/17636>`_, Jason Dillaman)
-* rbd: cls/journal: ensure tags are properly expired (`issue#21960 <http://tracker.ceph.com/issues/21960>`_, `pr#18604 <https://github.com/ceph/ceph/pull/18604>`_, Jason Dillaman)
-* rbd: cls/journal: fixed possible infinite loop in expire_tags (`issue#21956 <http://tracker.ceph.com/issues/21956>`_, `pr#18592 <https://github.com/ceph/ceph/pull/18592>`_, Jason Dillaman)
-* rbd: cls/journal: possible infinite loop within tag_list class method (`issue#21771 <http://tracker.ceph.com/issues/21771>`_, `pr#18270 <https://github.com/ceph/ceph/pull/18270>`_, Jason Dillaman)
-* rbd: cls/rbd: group_image_list incorrectly flagged as RW (`issue#23388 <http://tracker.ceph.com/issues/23388>`_, `pr#20939 <https://github.com/ceph/ceph/pull/20939>`_, Jason Dillaman)
-* rbd: cls/rbd: metadata_list not honoring max_return parameter (`issue#21247 <http://tracker.ceph.com/issues/21247>`_, `pr#17499 <https://github.com/ceph/ceph/pull/17499>`_, Jason Dillaman)
-* rbd: cls/rbd: Silence gcc7 maybe-uninitialized warning (`pr#18504 <https://github.com/ceph/ceph/pull/18504>`_, Brad Hubbard)
-* rbd: common/options,librbd/Utils: refactor RBD feature validation (`pr#20014 <https://github.com/ceph/ceph/pull/20014>`_, Sage Weil)
-* rbd: disk usage on empty pool no longer returns an error message (`issue#22200 <http://tracker.ceph.com/issues/22200>`_, `pr#19045 <https://github.com/ceph/ceph/pull/19045>`_, Jason Dillaman)
-* rbd: do not show title if there is no group snapshot (`pr#20311 <https://github.com/ceph/ceph/pull/20311>`_, songweibin)
-* rbd: don't overwrite the error code from the remove action (`pr#20481 <https://github.com/ceph/ceph/pull/20481>`_, Jason Dillaman)
-* rbd: drop unnecessary using declaration, etc (`pr#19005 <https://github.com/ceph/ceph/pull/19005>`_, Shinobu Kinjo)
-* rbd: eager-thick provisioning support (`pr#18317 <https://github.com/ceph/ceph/pull/18317>`_, Hitoshi Kamei)
-* rbd: export/import image-meta when we export/import an image (`pr#17134 <https://github.com/ceph/ceph/pull/17134>`_, PCzhangPC)
-* rbd: filter out UserSnapshotNamespace in do_disk_usage (`pr#20532 <https://github.com/ceph/ceph/pull/20532>`_, songweibin)
-* rbd: fix crash during map when "rw" option is specified (`issue#21808 <http://tracker.ceph.com/issues/21808>`_, `pr#18313 <https://github.com/ceph/ceph/pull/18313>`_, Peter Keresztes Schmidt)
-* rbd: fix logically dead code in function list_process_image (`pr#16971 <https://github.com/ceph/ceph/pull/16971>`_, Luo Kexue)
-* rbd: fix rbd children listing when child is in trash (`issue#21893 <http://tracker.ceph.com/issues/21893>`_, `pr#18483 <https://github.com/ceph/ceph/pull/18483>`_, songweibin)
-* rbd: fix thread_offsets calculation of rbd bench (`pr#20590 <https://github.com/ceph/ceph/pull/20590>`_, Hitoshi Kamei)
-* rbd: group misc cleanup and update rbd man page (`pr#20199 <https://github.com/ceph/ceph/pull/20199>`_, songweibin)
-* rbd: group snapshot rename (`pr#12431 <https://github.com/ceph/ceph/pull/12431>`_, Victor Denisov)
-* rbd: implement image qos in tokenbucket algorithm (`pr#17032 <https://github.com/ceph/ceph/pull/17032>`_, Dongsheng Yang)
-* rbd: import with option --export-format 2 fails to protect snapshot (`issue#23038 <http://tracker.ceph.com/issues/23038>`_, `pr#20613 <https://github.com/ceph/ceph/pull/20613>`_, songweibin)
-* rbd: improve 'import-diff' corrupt input error messages (`issue#18844 <http://tracker.ceph.com/issues/18844>`_, `pr#21249 <https://github.com/ceph/ceph/pull/21249>`_, Jason Dillaman)
-* rbd: Initializing m_finalize_ctx (`pr#17563 <https://github.com/ceph/ceph/pull/17563>`_, Amit Kumar)
-* rbd: introduce commands of "image-meta ls/rm" (`pr#16591 <https://github.com/ceph/ceph/pull/16591>`_, PCzhangPC)
-* rbd: journal: limit number of appends sent in one librados op (`issue#23526 <http://tracker.ceph.com/issues/23526>`_, `pr#21157 <https://github.com/ceph/ceph/pull/21157>`_, Mykola Golub)
-* rbd: journal: trivial cleanup (`pr#19317 <https://github.com/ceph/ceph/pull/19317>`_, Shinobu Kinjo)
-* rbd: krbd: include sys/sysmacros.h for major, minor and makedev (`pr#20773 <https://github.com/ceph/ceph/pull/20773>`_, Ilya Dryomov)
-* rbd: krbd: rewrite "already mapped" code (`pr#17638 <https://github.com/ceph/ceph/pull/17638>`_, Ilya Dryomov)
-* rbd: librados/snap_set_diff: don't assert on empty snapset (`pr#20648 <https://github.com/ceph/ceph/pull/20648>`_, Mykola Golub)
-* rbd:  librbd: create+truncate for whole-object layered discards (`issue#23285 <http://tracker.ceph.com/issues/23285>`_, `pr#20809 <https://github.com/ceph/ceph/pull/20809>`_, Ilya Dryomov)
-* rbd:  librbd: make rename request complete with filtered code (`issue#23068 <http://tracker.ceph.com/issues/23068>`_, `pr#20507 <https://github.com/ceph/ceph/pull/20507>`_, Mykola Golub)
-* rbd: librbd misc cleanup (`pr#18419 <https://github.com/ceph/ceph/pull/18419>`_, Jianpeng Ma)
-* rbd:  librbd: skip head object map update when deep copying object beyond image size (`pr#21586 <https://github.com/ceph/ceph/pull/21586>`_, Mykola Golub)
-* rbd:  librbd: sync flush should re-use existing async flush logic (`pr#18403 <https://github.com/ceph/ceph/pull/18403>`_, Jason Dillaman)
-* rbd: librbd,test: address coverity false positives (`pr#17825 <https://github.com/ceph/ceph/pull/17825>`_, Amit Kumar)
-* rbd: mimic: librbd: deep copy optionally support flattening cloned image (`issue#22787 <http://tracker.ceph.com/issues/22787>`_, `pr#22038 <https://github.com/ceph/ceph/pull/22038>`_, Mykola Golub)
-* rbd: mimic: rbd-mirror: optionally support active/active replication (`pr#22105 <https://github.com/ceph/ceph/pull/22105>`_, Jason Dillaman)
-* rbd: mimic: rbd-mirror: potential deadlock when running asok 'flush' command (`issue#24141 <http://tracker.ceph.com/issues/24141>`_, `pr#22039 <https://github.com/ceph/ceph/pull/22039>`_, Mykola Golub)
-* rbd-mirror: additional thrasher testing (`pr#21697 <https://github.com/ceph/ceph/pull/21697>`_, Jason Dillaman)
-* rbd-mirror: clean up spurious error log messages (`issue#21961 <http://tracker.ceph.com/issues/21961>`_, `pr#18601 <https://github.com/ceph/ceph/pull/18601>`_, Jason Dillaman)
-* rbd-mirror: cluster watcher should ensure it has latest OSD map (`issue#22461 <http://tracker.ceph.com/issues/22461>`_, `pr#19550 <https://github.com/ceph/ceph/pull/19550>`_, Jason Dillaman)
-* rbd-mirror: ensure unique service daemon name is utilized (`pr#19492 <https://github.com/ceph/ceph/pull/19492>`_, Jason Dillaman)
-* rbd-mirror: fix potential infinite loop when formatting status message (`issue#22932 <http://tracker.ceph.com/issues/22932>`_, `pr#20349 <https://github.com/ceph/ceph/pull/20349>`_, Mykola Golub)
-* rbd-mirror: forced promotion can result in incorrect status (`issue#21559 <http://tracker.ceph.com/issues/21559>`_, `pr#17979 <https://github.com/ceph/ceph/pull/17979>`_, Jason Dillaman)
-* rbd-mirror: ImageMap memory leak fixes (`pr#19163 <https://github.com/ceph/ceph/pull/19163>`_, Venky Shankar)
-* rbd-mirror: Improve data pool selection when creating images (`pr#18006 <https://github.com/ceph/ceph/pull/18006>`_, Adam Wolfe Gordon)
-* rbd-mirror: integrate image map policy as incremental step to active-active (`pr#21300 <https://github.com/ceph/ceph/pull/21300>`_, Jason Dillaman)
-* rbd-mirror: introduce basic image mapping policy (`issue#18786 <http://tracker.ceph.com/issues/18786>`_, `pr#15691 <https://github.com/ceph/ceph/pull/15691>`_, Venky Shankar)
-* rbd-mirror: missing lock when re-sending update_sync_point (`pr#19011 <https://github.com/ceph/ceph/pull/19011>`_, Mykola Golub)
-* rbd-mirror: persist image map timestamp (`pr#19338 <https://github.com/ceph/ceph/pull/19338>`_, Venky Shankar)
-* rbd-mirror: primary image should register in remote, non-primary image's journal (`issue#21561 <http://tracker.ceph.com/issues/21561>`_, `pr#18136 <https://github.com/ceph/ceph/pull/18136>`_, Jason Dillaman)
-* rbd-mirror: properly translate remote tag mirror uuid for local mirror (`issue#23876 <http://tracker.ceph.com/issues/23876>`_, `pr#21657 <https://github.com/ceph/ceph/pull/21657>`_, Jason Dillaman)
-* rbd-mirror: removed dedicated thread from image deleter (`issue#15322 <http://tracker.ceph.com/issues/15322>`_, `pr#19000 <https://github.com/ceph/ceph/pull/19000>`_, Jason Dillaman)
-* rbd-mirror: rename asok hook to match image name when not replaying (`issue#23888 <http://tracker.ceph.com/issues/23888>`_, `pr#21682 <https://github.com/ceph/ceph/pull/21682>`_, Jason Dillaman)
-* rbd-mirror: rollback state transitions in image policy (`pr#19577 <https://github.com/ceph/ceph/pull/19577>`_, Venky Shankar)
-* rbd-mirror: Set the data pool correctly when creating images (`issue#20567 <http://tracker.ceph.com/issues/20567>`_, `pr#17073 <https://github.com/ceph/ceph/pull/17073>`_, Adam Wolfe Gordon)
-* rbd-mirror: simplify notifications for image assignment (`issue#15764 <http://tracker.ceph.com/issues/15764>`_, `pr#16642 <https://github.com/ceph/ceph/pull/16642>`_, Jason Dillaman)
-* rbd-mirror: strip environment/CLI overrides for remote cluster (`issue#21894 <http://tracker.ceph.com/issues/21894>`_, `pr#18490 <https://github.com/ceph/ceph/pull/18490>`_, Jason Dillaman)
-* rbd-mirror: support deferred deletions of mirrored images (`pr#19536 <https://github.com/ceph/ceph/pull/19536>`_, Jason Dillaman)
-* rbd-mirror: sync image metadata when transfering remote image (`issue#21535 <http://tracker.ceph.com/issues/21535>`_, `pr#18026 <https://github.com/ceph/ceph/pull/18026>`_, Jason Dillaman)
-* rbd-mirror: track images in policy map in support of A/A (`issue#18786 <http://tracker.ceph.com/issues/18786>`_, `pr#15788 <https://github.com/ceph/ceph/pull/15788>`_, Venky Shankar)
-* rbd-mirror: update asok hook name on image rename (`issue#20860 <http://tracker.ceph.com/issues/20860>`_, `pr#16998 <https://github.com/ceph/ceph/pull/16998>`_, Mykola Golub)
-* rbd-mirror: use next transition state to check transition completeness (`pr#18969 <https://github.com/ceph/ceph/pull/18969>`_, Venky Shankar)
-* rbd-nbd: allow to unmap by image or snap spec (`pr#19666 <https://github.com/ceph/ceph/pull/19666>`_, Mykola Golub)
-* rbd-nbd: bug fix when running in container (`issue#22012 <http://tracker.ceph.com/issues/22012>`_, `issue#22011 <http://tracker.ceph.com/issues/22011>`_, `pr#18663 <https://github.com/ceph/ceph/pull/18663>`_, Li Wang)
-* rbd-nbd: certain kernels may not discover resized block devices (`issue#22131 <http://tracker.ceph.com/issues/22131>`_, `pr#18947 <https://github.com/ceph/ceph/pull/18947>`_, Jason Dillaman)
-* rbd-nbd: cleanup for NBDServer shut down (`pr#17283 <https://github.com/ceph/ceph/pull/17283>`_, Pan Liu)
-* rbd-nbd: fix ebusy when do map (`issue#23528 <http://tracker.ceph.com/issues/23528>`_, `pr#21142 <https://github.com/ceph/ceph/pull/21142>`_, Li Wang)
-* rbd-nbd: fix generic option issue (`issue#20426 <http://tracker.ceph.com/issues/20426>`_, `pr#17375 <https://github.com/ceph/ceph/pull/17375>`_, Pan Liu)
-* rbd-nbd: output format support for list-mapped command (`pr#19704 <https://github.com/ceph/ceph/pull/19704>`_, Mykola Golub)
-* rbd-nbd: support optionally setting device timeout (`issue#22333 <http://tracker.ceph.com/issues/22333>`_, `pr#19436 <https://github.com/ceph/ceph/pull/19436>`_, Mykola Golub)
-* rbd: null check before pool_name use (`pr#18790 <https://github.com/ceph/ceph/pull/18790>`_, Amit Kumar)
-* rbd: output notifyOp request name when watching (`pr#20551 <https://github.com/ceph/ceph/pull/20551>`_, shun-s)
-* rbd: parallelize "rbd ls -l" (`pr#15579 <https://github.com/ceph/ceph/pull/15579>`_, Piotr Dałek)
-* rbd: pool_percent_used should not divided by 100 (`pr#20795 <https://github.com/ceph/ceph/pull/20795>`_, songweibin)
-* rbd: properly pass ceph global command line args to subprocess (`pr#19821 <https://github.com/ceph/ceph/pull/19821>`_, Mykola Golub)
-* rbd: pybind/rbd: add deep_copy method (`pr#19406 <https://github.com/ceph/ceph/pull/19406>`_, Mykola Golub)
-* rbd: pybind/rbd: fix metadata functions error handling (`issue#22306 <http://tracker.ceph.com/issues/22306>`_, `pr#19337 <https://github.com/ceph/ceph/pull/19337>`_, Mykola Golub)
-* rbd: python bindings fixes and improvements (`issue#23609 <http://tracker.ceph.com/issues/23609>`_, `pr#21304 <https://github.com/ceph/ceph/pull/21304>`_, Ricardo Dias)
-* rbd: rbd-ggate: fix parsing ceph global options (`pr#19822 <https://github.com/ceph/ceph/pull/19822>`_, Mykola Golub)
-* rbd: rbd-ggate: fix syntax error (`pr#19919 <https://github.com/ceph/ceph/pull/19919>`_, Willem Jan Withagen)
-* rbd: rbd-ggate: make list command produce valid xml format output (`pr#19823 <https://github.com/ceph/ceph/pull/19823>`_, Mykola Golub)
-* rbd: rbd-ggate: small fixes and improvements (`pr#19679 <https://github.com/ceph/ceph/pull/19679>`_, Mykola Golub)
-* rbd: rbd-ggate: tool to map images on FreeBSD via GEOM Gate (`pr#15339 <https://github.com/ceph/ceph/pull/15339>`_, Mykola Golub)
-* rbd:  rbd:introduce rbd bench rw(for read and write mix) test (`pr#17461 <https://github.com/ceph/ceph/pull/17461>`_, PCzhangPC)
-* rbd:  rbd: set a default value for options in `nbd map` (`pr#20529 <https://github.com/ceph/ceph/pull/20529>`_, songweibin)
-* rbd: replace positional_path parameter with arg_index in get_path() (`pr#19722 <https://github.com/ceph/ceph/pull/19722>`_, songweibin)
-* rbd: replace trash delay option, add rbd trash purge command (`pr#18323 <https://github.com/ceph/ceph/pull/18323>`_, Theofilos Mouratidis)
-* rbd: resource agent needs to be executable (`issue#22980 <http://tracker.ceph.com/issues/22980>`_, `issue#22362 <http://tracker.ceph.com/issues/22362>`_, `pr#20397 <https://github.com/ceph/ceph/pull/20397>`_, Tim Bishop)
-* rbd:rm unnecessary conversion from string to char\* in image-meta function (`pr#17184 <https://github.com/ceph/ceph/pull/17184>`_, PCzhangPC)
-* rbd: show read:write proportion in the infomation of readwrite bench test (`pr#18249 <https://github.com/ceph/ceph/pull/18249>`_, PCzhangPC)
-* rbd: snap limit should't be set smaller than the number of  existing snaps (`pr#16597 <https://github.com/ceph/ceph/pull/16597>`_, PCzhangPC)
-* rbd: support cloning an image from a non-primary snapshot (`issue#18480 <http://tracker.ceph.com/issues/18480>`_, `pr#19724 <https://github.com/ceph/ceph/pull/19724>`_, Jason Dillaman)
-* rbd: support iterating over metadata items when listing (`issue#21179 <http://tracker.ceph.com/issues/21179>`_, `pr#17532 <https://github.com/ceph/ceph/pull/17532>`_, Jason Dillaman)
-* rbd: support lock_timeout in rbd mapping (`pr#21344 <https://github.com/ceph/ceph/pull/21344>`_, Dongsheng Yang)
-* rbd: support osd_request_timeout in rbd map command (`issue#23073 <http://tracker.ceph.com/issues/23073>`_, `pr#20792 <https://github.com/ceph/ceph/pull/20792>`_, Dongsheng Yang)
-* rbd: switched from legacy to new-style configuration options (`issue#20737 <http://tracker.ceph.com/issues/20737>`_, `pr#16737 <https://github.com/ceph/ceph/pull/16737>`_, Jason Dillaman)
-* rbd,tests: qa: additional krbd discard test cases (`pr#20499 <https://github.com/ceph/ceph/pull/20499>`_, Ilya Dryomov)
-* rbd,tests: qa: fix POOL_APP_NOT_ENABLED warning in krbd:unmap suite (`pr#16966 <https://github.com/ceph/ceph/pull/16966>`_, Ilya Dryomov)
-* rbd,tests: qa: introduce rbd-mirror thrasher to existing tests (`issue#18753 <http://tracker.ceph.com/issues/18753>`_, `pr#21541 <https://github.com/ceph/ceph/pull/21541>`_, Jason Dillaman)
-* rbd,tests:  qa: krbd_exclusive_option.sh: add lock_timeout test case (`pr#21522 <https://github.com/ceph/ceph/pull/21522>`_, Ilya Dryomov)
-* rbd,tests:  qa: krbd_fallocate.sh: add notrim test case (`pr#21513 <https://github.com/ceph/ceph/pull/21513>`_, Ilya Dryomov)
-* rbd,tests:  qa: krbd huge-image test (`pr#20692 <https://github.com/ceph/ceph/pull/20692>`_, Ilya Dryomov)
-* rbd,tests: qa: krbd latest-osdmap-on-map test (`pr#20591 <https://github.com/ceph/ceph/pull/20591>`_, Ilya Dryomov)
-* rbd,tests: qa: krbd msgr-segments test (`pr#20714 <https://github.com/ceph/ceph/pull/20714>`_, Ilya Dryomov)
-* rbd,tests: qa: krbd parent-overlap test (`pr#20721 <https://github.com/ceph/ceph/pull/20721>`_, Ilya Dryomov)
-* rbd,tests: qa: krbd whole-object-discard test (`pr#20750 <https://github.com/ceph/ceph/pull/20750>`_, Ilya Dryomov)
-* rbd,tests:  qa/suites/krbd: add krbd BLKROSET test (`pr#18652 <https://github.com/ceph/ceph/pull/18652>`_, Ilya Dryomov)
-* rbd,tests: qa/suites/krbd: enable generic/050 and generic/448 (`pr#18795 <https://github.com/ceph/ceph/pull/18795>`_, Ilya Dryomov)
-* rbd,tests: qa/suites/krbd: enable xfstests blockdev tests (`pr#17621 <https://github.com/ceph/ceph/pull/17621>`_, Ilya Dryomov)
-* rbd,tests: qa/suites/krbd: exclude shared/298 (`pr#17971 <https://github.com/ceph/ceph/pull/17971>`_, Ilya Dryomov)
-* rbd,tests: qa/suites/krbd: rbd_xfstests job overhaul (`pr#17346 <https://github.com/ceph/ceph/pull/17346>`_, Ilya Dryomov)
-* rbd,tests: qa/suites/rbd: fewer socket failures (`pr#19617 <https://github.com/ceph/ceph/pull/19617>`_, Sage Weil)
-* rbd,tests: qa/suites/rbd: miscellaneous test fixes (`issue#21251 <http://tracker.ceph.com/issues/21251>`_, `pr#17504 <https://github.com/ceph/ceph/pull/17504>`_, Jason Dillaman)
-* rbd,tests: qa/suites/rbd: segregated v1 image format tests (`issue#22738 <http://tracker.ceph.com/issues/22738>`_, `pr#20729 <https://github.com/ceph/ceph/pull/20729>`_, Jason Dillaman)
-* rbd,tests: qa/suites/rbd: set qemu task time_wait param (`pr#21131 <https://github.com/ceph/ceph/pull/21131>`_, Mykola Golub)
-* rbd,tests: qa/tasks/cram: include /usr/sbin in the PATH for all commands (`pr#18793 <https://github.com/ceph/ceph/pull/18793>`_, Ilya Dryomov)
-* rbd,tests: qa/tasks/rbd: run all xfstests runs to completion (`pr#18583 <https://github.com/ceph/ceph/pull/18583>`_, Ilya Dryomov)
-* rbd,tests: qa/workunits/rbd: fix cli_generic test_purge for rbd default format 1 (`pr#20389 <https://github.com/ceph/ceph/pull/20389>`_, Mykola Golub)
-* rbd,tests: qa/workunits/rbd: fixed variable name for resync image id (`issue#21663 <http://tracker.ceph.com/issues/21663>`_, `pr#18097 <https://github.com/ceph/ceph/pull/18097>`_, Jason Dillaman)
-* rbd,tests: qa/workunits/rbd: fix issues within permissions test (`issue#23043 <http://tracker.ceph.com/issues/23043>`_, `pr#20491 <https://github.com/ceph/ceph/pull/20491>`_, Jason Dillaman)
-* rbd,tests: qa/workunits/rbd: pool create may fail for small cluster (`pr#18067 <https://github.com/ceph/ceph/pull/18067>`_, Mykola Golub)
-* rbd,tests: qa/workunits/rbd: potential race in mirror disconnect test (`issue#23938 <http://tracker.ceph.com/issues/23938>`_, `pr#21733 <https://github.com/ceph/ceph/pull/21733>`_, Mykola Golub)
-* rbd,tests: qa/workunits/rbd: relax greps to support upgrade formatting change (`issue#21181 <http://tracker.ceph.com/issues/21181>`_, `pr#17559 <https://github.com/ceph/ceph/pull/17559>`_, Jason Dillaman)
-* rbd,tests: qa/workunits/rbd: remove sanity check in journal.sh test (`pr#20490 <https://github.com/ceph/ceph/pull/20490>`_, Jason Dillaman)
-* rbd,tests: qa/workunits/rbd: remove sanity check in test_admin_socket.sh (`pr#21116 <https://github.com/ceph/ceph/pull/21116>`_, Mykola Golub)
-* rbd,tests: qa/workunits/rbd: remove "trash purge --threshold" test (`issue#22803 <http://tracker.ceph.com/issues/22803>`_, `pr#20170 <https://github.com/ceph/ceph/pull/20170>`_, Mykola Golub)
-* rbd,tests: qa/workunits/rbd: simplify split-brain test to avoid potential race (`issue#22485 <http://tracker.ceph.com/issues/22485>`_, `pr#19604 <https://github.com/ceph/ceph/pull/19604>`_, Jason Dillaman)
-* rbd,tests: qa/workunits/rbd: switch devstack tempest to 17.2.0 tag (`issue#22961 <http://tracker.ceph.com/issues/22961>`_, `pr#20599 <https://github.com/ceph/ceph/pull/20599>`_, Jason Dillaman)
-* rbd,tests: qa/workunits/rbd: switch devstack to pike release (`pr#20124 <https://github.com/ceph/ceph/pull/20124>`_, Jason Dillaman)
-* rbd,tests: qa/workunits/rbd: test data pool is mirrored correctly (`pr#17062 <https://github.com/ceph/ceph/pull/17062>`_, Mykola Golub)
-* rbd,tests: qa/workunits/rbd: unnecessary sleep after failed remove (`pr#18619 <https://github.com/ceph/ceph/pull/18619>`_, Mykola Golub)
-* rbd,tests: qa/workunits/rbd: use command line option to specify watcher asok (`issue#20954 <http://tracker.ceph.com/issues/20954>`_, `pr#16917 <https://github.com/ceph/ceph/pull/16917>`_, Mykola Golub)
-* rbd,tests: qa/workunits/rbd: wait for demote status is propagated (`pr#19073 <https://github.com/ceph/ceph/pull/19073>`_, Mykola Golub)
-* rbd,tests: qa/workunits/rbd: wait for status propagated only if daemon started (`pr#19082 <https://github.com/ceph/ceph/pull/19082>`_, Mykola Golub)
-* rbd,tests: rbd/test: add snap protection test for ex/import (`pr#20689 <https://github.com/ceph/ceph/pull/20689>`_, songweibin)
-* rbd,tests: stop.sh: use --no-mon-config when trying to unmap rbd devices (`pr#21020 <https://github.com/ceph/ceph/pull/21020>`_, Mykola Golub)
-* rbd,tests: test: address coverity false positives (`pr#17803 <https://github.com/ceph/ceph/pull/17803>`_, Amit Kumar)
-* rbd,tests: test/cls_rbd: mask newer feature bits to support upgrade tests (`issue#21217 <http://tracker.ceph.com/issues/21217>`_, `pr#17509 <https://github.com/ceph/ceph/pull/17509>`_, Jason Dillaman)
-* rbd,tests: test/librados_test_stub: always create copy of buffers passed to operation (`pr#21074 <https://github.com/ceph/ceph/pull/21074>`_, Mykola Golub)
-* rbd,tests: test/librbd: added update_features RPC message to test_notify (`issue#21936 <http://tracker.ceph.com/issues/21936>`_, `pr#18561 <https://github.com/ceph/ceph/pull/18561>`_, Jason Dillaman)
-* rbd,tests: test/librbd: clean up for several mock function tests (`pr#18952 <https://github.com/ceph/ceph/pull/18952>`_, Jason Dillaman)
-* rbd,tests: test/librbd: Do not instantiate TrimRequest template class (`pr#19402 <https://github.com/ceph/ceph/pull/19402>`_, Boris Ranto)
-* rbd,tests: test/librbd: ensure OutOfOrder test has enough concurrent management ops (`pr#21436 <https://github.com/ceph/ceph/pull/21436>`_, Mykola Golub)
-* rbd,tests: test/librbd: fix mock method macro of set_journal_policy (`pr#17216 <https://github.com/ceph/ceph/pull/17216>`_, Yan Jun)
-* rbd,tests: test/librbd: fix race condition with OSD map refresh (`issue#20918 <http://tracker.ceph.com/issues/20918>`_, `pr#16877 <https://github.com/ceph/ceph/pull/16877>`_, Jason Dillaman)
-* rbd,tests: test/librbd: fix valgrind memory leak warning (`pr#17187 <https://github.com/ceph/ceph/pull/17187>`_, Mykola Golub)
-* rbd,tests: test/librbd: initialize on_finish,locker,force,snap_id (`pr#17800 <https://github.com/ceph/ceph/pull/17800>`_, Amit Kumar)
-* rbd,tests: test/librbd: make fsx build on non-linux platform (`pr#16939 <https://github.com/ceph/ceph/pull/16939>`_, Mykola Golub)
-* rbd,tests: test/librbd: memory leak in recently added test (`pr#18478 <https://github.com/ceph/ceph/pull/18478>`_, Mykola Golub)
-* rbd,tests: test/librbd: rbd-ggate mode for fsx (`pr#19315 <https://github.com/ceph/ceph/pull/19315>`_, Mykola Golub)
-* rbd,tests: test/librbd: test metadata_set/remove is applied (`pr#18288 <https://github.com/ceph/ceph/pull/18288>`_, Mykola Golub)
-* rbd,tests: test/librbd: TestMirroringWatcher unit tests should ignore duplicates (`issue#21029 <http://tracker.ceph.com/issues/21029>`_, `pr#17078 <https://github.com/ceph/ceph/pull/17078>`_, Jason Dillaman)
-* rbd,tests: test/librbd: utilize unique pool for cache tier testing (`issue#11502 <http://tracker.ceph.com/issues/11502>`_, `pr#20486 <https://github.com/ceph/ceph/pull/20486>`_, Jason Dillaman)
-* rbd,tests: test/librbd: valgrind warning in TestMockManagedLockBreakRequest.DeadLockOwner (`pr#18940 <https://github.com/ceph/ceph/pull/18940>`_, Mykola Golub)
-* rbd,tests: test/pybind/rbd: skip test_deep_copy_clone if layering not enabled (`pr#20295 <https://github.com/ceph/ceph/pull/20295>`_, Mykola Golub)
-* rbd,tests: test/rbd: cli_generic fails if v1 image format or deep-flatten disabled (`issue#22950 <http://tracker.ceph.com/issues/22950>`_, `pr#20364 <https://github.com/ceph/ceph/pull/20364>`_, songweibin)
-* rbd,tests: test/rbd_mirror: fix valgrind warnings in unittest (`pr#19016 <https://github.com/ceph/ceph/pull/19016>`_, Mykola Golub)
-* rbd,tests: test/rbd-mirror: image map policy test (`pr#19320 <https://github.com/ceph/ceph/pull/19320>`_, Venky Shankar)
-* rbd,tests: test/rbd-mirror: improve coverage for dead instance handling (`pr#21403 <https://github.com/ceph/ceph/pull/21403>`_, Jason Dillaman)
-* rbd,tests: test/rbd_mirror: "use of uninitialised value" valgrind warning (`pr#19437 <https://github.com/ceph/ceph/pull/19437>`_, Mykola Golub)
-* rbd,tools: rbd-fuse: make sure PATH_MAX is defined (`pr#18615 <https://github.com/ceph/ceph/pull/18615>`_, Roberto Oliveira)
-* rbd,tools: rbd-replay: remove boost dependency (`pr#21202 <https://github.com/ceph/ceph/pull/21202>`_, Kefu Chai)
-* rbd: tools/rbd: use steady clock in bencher (`pr#20008 <https://github.com/ceph/ceph/pull/20008>`_, Mohamad Gebai)
-* rbd: 'trash list --long' will return a failure on non-cloned images (`pr#19540 <https://github.com/ceph/ceph/pull/19540>`_, Jason Dillaman)
-* rbd: 'trash ls -l' will display column titles if existed non-USER trash image only (`pr#21343 <https://github.com/ceph/ceph/pull/21343>`_, songweibin)
-* rbd: unified way to map images using different drivers (`pr#19711 <https://github.com/ceph/ceph/pull/19711>`_, Mykola Golub)
-* rbd: use different logic to disturb thread's offset in bench seq test (`pr#17218 <https://github.com/ceph/ceph/pull/17218>`_, PCzhangPC)
-* Revert "ceph-fuse: Delete inode's bufferhead was in Tx state would le… (`pr#21976 <https://github.com/ceph/ceph/pull/21976>`_, "Yan, Zheng")
-* Revert "msg/async/rdma: fix multi cephcontext confllicting" (`pr#16980 <https://github.com/ceph/ceph/pull/16980>`_, Haomai Wang)
-* Revert "os/bluestore: compensate for bad freelistmanager size/blocks metadata" (`pr#17275 <https://github.com/ceph/ceph/pull/17275>`_, Xie Xingguo)
-* rgw: ability to list bucket contents in unsorted order for efficiency (`pr#21026 <https://github.com/ceph/ceph/pull/21026>`_, J. Eric Ivancich)
-* rgw: abort multipart if upload meta object doesn't exist (`pr#19918 <https://github.com/ceph/ceph/pull/19918>`_, fang yuxiang)
-* rgw: Access RGWConf through RGWEnv (`pr#17432 <https://github.com/ceph/ceph/pull/17432>`_, Jos Collin)
-* rgw: add "Accept-Ranges" to response header of Swift API (`issue#21554 <http://tracker.ceph.com/issues/21554>`_, `pr#17967 <https://github.com/ceph/ceph/pull/17967>`_, Tone Zhang)
-* rgw: add a default redirect field for zones (`pr#9571 <https://github.com/ceph/ceph/pull/9571>`_, Yehuda Sadeh)
-* rgw: add an option to clear all usage entries (`pr#19322 <https://github.com/ceph/ceph/pull/19322>`_, Abhishek Lekshmanan)
-* rgw: add an option to recalculate user stats (`issue#23335 <http://tracker.ceph.com/issues/23335>`_, `pr#20853 <https://github.com/ceph/ceph/pull/20853>`_, Abhishek Lekshmanan)
-* rgw: add buffering filter to compression for fetch_remote_obj (`issue#23547 <http://tracker.ceph.com/issues/23547>`_, `pr#21479 <https://github.com/ceph/ceph/pull/21479>`_, Casey Bodley)
-* rgw: add cors header rule check in cors option request (`issue#22002 <http://tracker.ceph.com/issues/22002>`_, `pr#18556 <https://github.com/ceph/ceph/pull/18556>`_, yuliyang)
-* rgw: Add dynamic resharding documentation (`issue#21553 <http://tracker.ceph.com/issues/21553>`_, `pr#15941 <https://github.com/ceph/ceph/pull/15941>`_, Orit Wasserman)
-* rgw: add logs if get_data returns error in RGWPutObj::execute (`pr#18642 <https://github.com/ceph/ceph/pull/18642>`_, Zhang Shaowen)
-* rgw: add metadata and data sync related cmd into radosgw-admin usage (`pr#18921 <https://github.com/ceph/ceph/pull/18921>`_, lvshanchun)
-* rgw: add missing override in list_keys_init() (`pr#17254 <https://github.com/ceph/ceph/pull/17254>`_, Jos Collin)
-* rgw: add radosgw-admin sync error trim to trim sync error log (`pr#19854 <https://github.com/ceph/ceph/pull/19854>`_, fang yuxiang)
-* rgw: add reshard commands (`issue#21617 <http://tracker.ceph.com/issues/21617>`_, `pr#18180 <https://github.com/ceph/ceph/pull/18180>`_, Orit Wasserman)
-* rgw: address warnings due to incorrect format code (`pr#18796 <https://github.com/ceph/ceph/pull/18796>`_, J. Eric Ivancich)
-    rgw: Add retry_raced_bucket_write
-* rgw: add rewrite cmd and options into radosgw-admin usage and doc (`pr#18918 <https://github.com/ceph/ceph/pull/18918>`_, Enming Zhang)
-* rgw: add ssl support to beast frontend (`issue#22832 <http://tracker.ceph.com/issues/22832>`_, `pr#20464 <https://github.com/ceph/ceph/pull/20464>`_, Casey Bodley)
-* rgw: add support for Swift's per storage policy statistics (`issue#17932 <http://tracker.ceph.com/issues/17932>`_, `pr#12704 <https://github.com/ceph/ceph/pull/12704>`_, Radoslaw Zarzynski)
-* rgw: add support for Swift's reversed account listings (`issue#21148 <http://tracker.ceph.com/issues/21148>`_, `pr#17320 <https://github.com/ceph/ceph/pull/17320>`_, Radoslaw Zarzynski)
-* rgw: add support for tagging and other conditionals in policy (`pr#17094 <https://github.com/ceph/ceph/pull/17094>`_, Abhishek Lekshmanan)
-* rgw: add tail tag to track tail instance (`issue#20234 <http://tracker.ceph.com/issues/20234>`_, `pr#16145 <https://github.com/ceph/ceph/pull/16145>`_, Yehuda Sadeh)
-* rgw: add tenant to shard_id in RGWDeleteLC::execute() (`pr#10460 <https://github.com/ceph/ceph/pull/10460>`_, Wei Qiaomiao)
-* rgw: add time skew check in function parse_v4_auth_header (`issue#22418 <http://tracker.ceph.com/issues/22418>`_, `pr#19476 <https://github.com/ceph/ceph/pull/19476>`_, Bingyin Zhang)
-    rgw: Add try_refresh_bucket_info function
-* rgw: add xml output header in RGWCopyObj_ObjStore_S3 response msg (`issue#22416 <http://tracker.ceph.com/issues/22416>`_, `pr#19475 <https://github.com/ceph/ceph/pull/19475>`_, Enming Zhang)
-* rgw: adjust log format for lifecycle (`pr#19576 <https://github.com/ceph/ceph/pull/19576>`_, Bingyin Zhang)
-* rgw: admin api - add ability to sync user stats from admin api (`issue#21301 <http://tracker.ceph.com/issues/21301>`_, `pr#17589 <https://github.com/ceph/ceph/pull/17589>`_, Nathan Johnson)
-* rgw: Admin API Support for bucket quota change (`issue#21811 <http://tracker.ceph.com/issues/21811>`_, `pr#18324 <https://github.com/ceph/ceph/pull/18324>`_, Jeegn Chen)
-* rgw: admin rest api shouldn't return error when getting user's stats if the user hasn't create any bucket (`pr#21551 <https://github.com/ceph/ceph/pull/21551>`_, Zhang Shaowen)
-* rgw: allow beast frontend to listen on specific IP address (`issue#22778 <http://tracker.ceph.com/issues/22778>`_, `pr#20000 <https://github.com/ceph/ceph/pull/20000>`_, Yuan Zhou)
-* rgw: Allow swift acls to be deleted (`issue#22897 <http://tracker.ceph.com/issues/22897>`_, `pr#20471 <https://github.com/ceph/ceph/pull/20471>`_, Marcus Watts)
-* rgw: avoid logging keystone revocation messages when not configured (`issue#21400 <http://tracker.ceph.com/issues/21400>`_, `pr#17775 <https://github.com/ceph/ceph/pull/17775>`_, Abhishek Lekshmanan)
-* rgw: aws4 auth supports PutBucketRequestPayment (`issue#23803 <http://tracker.ceph.com/issues/23803>`_, `pr#21569 <https://github.com/ceph/ceph/pull/21569>`_, Casey Bodley)
-* rgw: AWS v4 authorization work when INIT_MULTIPART is chunked (`issue#22129 <http://tracker.ceph.com/issues/22129>`_, `pr#18956 <https://github.com/ceph/ceph/pull/18956>`_, Jeegn Chen)
-* rgw: beast frontend can listen on multiple endpoints (`issue#22779 <http://tracker.ceph.com/issues/22779>`_, `pr#20188 <https://github.com/ceph/ceph/pull/20188>`_, Casey Bodley)
-* rgw: beast frontend no longer experimental (`pr#21272 <https://github.com/ceph/ceph/pull/21272>`_, Casey Bodley)
-* rgw: Better ERANGE error message (`issue#22351 <http://tracker.ceph.com/issues/22351>`_, `pr#20023 <https://github.com/ceph/ceph/pull/20023>`_, Brad Hubbard)
-* rgw: break sending data-log list infinitely (`issue#20951 <http://tracker.ceph.com/issues/20951>`_, `pr#16926 <https://github.com/ceph/ceph/pull/16926>`_, fang.yuxiang)
-* rgw: bucket resharding should not update bucket ACL or user stats (`issue#22742 <http://tracker.ceph.com/issues/22742>`_, `issue#22124 <http://tracker.ceph.com/issues/22124>`_, `pr#20038 <https://github.com/ceph/ceph/pull/20038>`_, Orit Wasserman)
-* rgw: Cache on the barrelhead (`issue#22517 <http://tracker.ceph.com/issues/22517>`_, `pr#19581 <https://github.com/ceph/ceph/pull/19581>`_, Adam C. Emerson)
-* rgw: Cache Register! (`issue#22604 <http://tracker.ceph.com/issues/22604>`_, `issue#22603 <http://tracker.ceph.com/issues/22603>`_, `pr#20144 <https://github.com/ceph/ceph/pull/20144>`_, Adam C. Emerson)
-* rgw: can't download object with range when compression enabled (`issue#22852 <http://tracker.ceph.com/issues/22852>`_, `pr#20226 <https://github.com/ceph/ceph/pull/20226>`_, fang yuxiang)
-* rgw: ceph-dencoder: add missing begin_iter & end_iter item for RGWObjManifest (`pr#19509 <https://github.com/ceph/ceph/pull/19509>`_, wangsongbo)
-* rgw: ceph-dencoder: add support for cls_rgw_lc_obj_head (`pr#18920 <https://github.com/ceph/ceph/pull/18920>`_, Yao Zongyou)
-* rgw: ceph-dencoder: add support for RGWLifecycleConfiguration (`pr#18959 <https://github.com/ceph/ceph/pull/18959>`_, wangsongbo)
-* rgw: change ObjectCache::lru from deque back to list (`issue#22560 <http://tracker.ceph.com/issues/22560>`_, `pr#19768 <https://github.com/ceph/ceph/pull/19768>`_, Casey Bodley)
-* rgw: changes to support ragweed (`pr#13644 <https://github.com/ceph/ceph/pull/13644>`_, Yehuda Sadeh)
-* rgw: Check bucket CORS operations in policy (`issue#21578 <http://tracker.ceph.com/issues/21578>`_, `pr#18000 <https://github.com/ceph/ceph/pull/18000>`_, Adam C. Emerson)
-* rgw: Check bucket GetBucketLocation in policy (`issue#21582 <http://tracker.ceph.com/issues/21582>`_, `pr#18002 <https://github.com/ceph/ceph/pull/18002>`_, Adam C. Emerson)
-* rgw: Check bucket Website operations in policy (`issue#21597 <http://tracker.ceph.com/issues/21597>`_, `pr#18024 <https://github.com/ceph/ceph/pull/18024>`_, Adam C. Emerson)
-* rgw: check going_down() when lifecycle processing (`issue#22099 <http://tracker.ceph.com/issues/22099>`_, `pr#18846 <https://github.com/ceph/ceph/pull/18846>`_, Yao Zongyou)
-* rgw: Check payment operations in policy (`issue#21389 <http://tracker.ceph.com/issues/21389>`_, `pr#17742 <https://github.com/ceph/ceph/pull/17742>`_, Adam C. Emerson)
-* rgw: check read_op.read return value in RGWRados::copy_obj_data (`pr#18962 <https://github.com/ceph/ceph/pull/18962>`_, Enming Zhang)
-* rgw: civetweb fixes for v1.1 upgrade (`pr#21123 <https://github.com/ceph/ceph/pull/21123>`_, Abhishek Lekshmanan)
-* rgw: clean code with helper function dump_header_if_nonempty (`pr#18979 <https://github.com/ceph/ceph/pull/18979>`_, Xinying Song)
-* rgw: clean up and fix some bugs for encryption (`issue#21581 <http://tracker.ceph.com/issues/21581>`_, `pr#17882 <https://github.com/ceph/ceph/pull/17882>`_, Enming Zhang)
-* rgw: cleanup MIN macro with std::min (`pr#17546 <https://github.com/ceph/ceph/pull/17546>`_, Jiaying Ren)
-* rgw: cleanup unused parameters in RGWRados::copy_obj_data (`pr#18917 <https://github.com/ceph/ceph/pull/18917>`_, Enming Zhang)
-* rgw: cloud sync fixes (`pr#21648 <https://github.com/ceph/ceph/pull/21648>`_, Yehuda Sadeh)
-* rgw: cls/log: cls_log_list always returns next marker (`issue#20906 <http://tracker.ceph.com/issues/20906>`_, `pr#17024 <https://github.com/ceph/ceph/pull/17024>`_, Casey Bodley)
-* rgw: cls/rgw: fix bi_log_iterate_entries return wrong truncated (`issue#22737 <http://tracker.ceph.com/issues/22737>`_, `pr#20021 <https://github.com/ceph/ceph/pull/20021>`_, Tianshan Qu)
-* rgw: cls/rgw: Initialization of uninitialized members (`pr#16932 <https://github.com/ceph/ceph/pull/16932>`_, amitkuma)
-* rgw: cls/rgw: mtime in rgw_bucket_dir_entry_meta not really decoded (`issue#22148 <http://tracker.ceph.com/issues/22148>`_, `pr#18981 <https://github.com/ceph/ceph/pull/18981>`_, Yao Zongyou)
-* rgw: cls/rgw: remove unused variable bl (`pr#19570 <https://github.com/ceph/ceph/pull/19570>`_, Yao Zongyou)
-* rgw: cls/rgw: trim all usage entries in cls_rgw (`issue#22234 <http://tracker.ceph.com/issues/22234>`_, `pr#19131 <https://github.com/ceph/ceph/pull/19131>`_, Abhishek Lekshmanan)
-* rgw: cls_rgw: use more effective container operations in get_obj_vals (`pr#19272 <https://github.com/ceph/ceph/pull/19272>`_, Xinying Song)
-* rgw: comparison between signed and unsigned integer expressions (`pr#21105 <https://github.com/ceph/ceph/pull/21105>`_, ashitakasam)
-* rgw: consolidate code that implements hashing algorithms (`pr#18248 <https://github.com/ceph/ceph/pull/18248>`_, J. Eric Ivancich)
-* rgw: copy object add response error messages (`pr#18291 <https://github.com/ceph/ceph/pull/18291>`_, Enming Zhang)
-* rgw: correct comment in function parse_credentials (`pr#19275 <https://github.com/ceph/ceph/pull/19275>`_, Bingyin Zhang)
-* rgw: correct log output for metadata section name in RGWListBucketIndexesCR (`pr#19508 <https://github.com/ceph/ceph/pull/19508>`_, Xinying Song)
-* rgw: Correct permission evaluation to allow only admin users to work with Roles (`pr#20332 <https://github.com/ceph/ceph/pull/20332>`_, Pritha Srivastava)
-* rgw: correct typo refity to refit (`pr#19064 <https://github.com/ceph/ceph/pull/19064>`_, Bingyin Zhang)
-* rgw: correct typo UNKOWN to UNKNOWN (`pr#19273 <https://github.com/ceph/ceph/pull/19273>`_, Bingyin Zhang)
-* rgw: create sync-module instance when execute radosgw-admin data sync run (`issue#22080 <http://tracker.ceph.com/issues/22080>`_, `pr#18898 <https://github.com/ceph/ceph/pull/18898>`_, lvshanchun)
-* rgw: create sync-module instance when radosgw-admin sync run (`pr#20611 <https://github.com/ceph/ceph/pull/20611>`_, lvshanchun)
-* rgw: curl\* reuse and for debian, use openssl not gnutls (`pr#20635 <https://github.com/ceph/ceph/pull/20635>`_, Marcus Watts)
-* rgw: Data encryption is not follow the AWS agreement (`pr#15994 <https://github.com/ceph/ceph/pull/15994>`_, hechuang)
-* rgw: datalog list support --shard-id and --marker (`pr#20649 <https://github.com/ceph/ceph/pull/20649>`_, Tianshan Qu)
-* rgw: data sync: set num_shards when building full maps (`issue#22083 <http://tracker.ceph.com/issues/22083>`_, `pr#18852 <https://github.com/ceph/ceph/pull/18852>`_, Abhishek Lekshmanan)
-* rgw: Delete to_string functions. stringify defined in include/stringify.h can provide the same feature (`pr#18522 <https://github.com/ceph/ceph/pull/18522>`_, zhangwen)
-* rgw: disable dynamic resharding in multisite environment (`issue#21725 <http://tracker.ceph.com/issues/21725>`_, `pr#18184 <https://github.com/ceph/ceph/pull/18184>`_, Orit Wasserman)
-* rgw: do not reflect period if not current (`issue#22844 <http://tracker.ceph.com/issues/22844>`_, `pr#20212 <https://github.com/ceph/ceph/pull/20212>`_, Tianshan Qu)
-* rgw: do not update all gateway caches upon creation of system obj w/ exclusive flag (`pr#19384 <https://github.com/ceph/ceph/pull/19384>`_, J. Eric Ivancich)
-* rgw: don't change rados object's mtime when update olh (`issue#21743 <http://tracker.ceph.com/issues/21743>`_, `pr#18214 <https://github.com/ceph/ceph/pull/18214>`_, Shasha Lu)
-* rgw: don't hold data_lock over frontend io (`pr#20621 <https://github.com/ceph/ceph/pull/20621>`_, Casey Bodley)
-* rgw: don't leak S3 LDAPHelper (`pr#12427 <https://github.com/ceph/ceph/pull/12427>`_, Matt Benjamin)
-* rgw: dont log EBUSY errors in 'sync error list' (`issue#22473 <http://tracker.ceph.com/issues/22473>`_, `pr#19580 <https://github.com/ceph/ceph/pull/19580>`_, Casey Bodley)
-* rgw: dont reuse stale RGWObjectCtx for get_bucket_info() (`issue#21506 <http://tracker.ceph.com/issues/21506>`_, `pr#17916 <https://github.com/ceph/ceph/pull/17916>`_, Casey Bodley)
-* rgw: don't write bucket_header when it is not changed in bucket_link/unlink (`pr#17356 <https://github.com/ceph/ceph/pull/17356>`_, Shasha Lu)
-* rgw: don't write bucket_header when it is not changed in rgw_bucket_prepare_op (`pr#18763 <https://github.com/ceph/ceph/pull/18763>`_, Xinying Song)
-* rgw: download object might fail for local invariable uninitialized (`issue#23146 <http://tracker.ceph.com/issues/23146>`_, `pr#20612 <https://github.com/ceph/ceph/pull/20612>`_, fang yuxiang)
-* rgw: drop a repeated statement for encode_xml() (`pr#20195 <https://github.com/ceph/ceph/pull/20195>`_, luomuyao)
-* rgw: drop commented functions (`pr#19671 <https://github.com/ceph/ceph/pull/19671>`_, Jos Collin)
-* rgw: drop dump_uri_from_state() which isn't used anymore (`pr#19924 <https://github.com/ceph/ceph/pull/19924>`_, Radoslaw Zarzynski)
-* rgw: drop iter in rgw_op.cc (`pr#19583 <https://github.com/ceph/ceph/pull/19583>`_, Bingyin Zhang)
-* rgw: drop marker in RGWLC::process() (`pr#19591 <https://github.com/ceph/ceph/pull/19591>`_, Bingyin Zhang)
-* rgw: drop outdated function doc (`pr#18370 <https://github.com/ceph/ceph/pull/18370>`_, Jiaying Ren)
-* rgw: drop "realm remove" in radosgw-admin (`pr#18212 <https://github.com/ceph/ceph/pull/18212>`_, Shasha Lu)
-* rgw: drop redundant RGW_OP_STAT_OBJ check (`pr#19933 <https://github.com/ceph/ceph/pull/19933>`_, Bingyin Zhang)
-* rgw: drop the unnecessary handling of Swift's X-Storage-Policy on objects (`pr#16383 <https://github.com/ceph/ceph/pull/16383>`_, Jiaying Ren)
-* rgw: drop the unused function init_anon_user() (`pr#16874 <https://github.com/ceph/ceph/pull/16874>`_, Radoslaw Zarzynski)
-* rgw: Drop unnecessary return (`pr#17520 <https://github.com/ceph/ceph/pull/17520>`_, Jos Collin)
-* rgw: drop unused function apply_epoch (`pr#17593 <https://github.com/ceph/ceph/pull/17593>`_, Shasha Lu)
-* rgw: drop unused iter in XMLObj::find_first (`pr#19709 <https://github.com/ceph/ceph/pull/19709>`_, luomuyao)
-* rgw: drop unused variable bucket_instance_ids (`pr#19708 <https://github.com/ceph/ceph/pull/19708>`_, Bingyin Zhang)
-* rgw: drop unused variable in copy_obj_data() (`pr#18477 <https://github.com/ceph/ceph/pull/18477>`_, Enming Zhang)
-* rgw: drop unused vector elements (`pr#19815 <https://github.com/ceph/ceph/pull/19815>`_, Bingyin Zhang)
-* rgw: drop useless includes in rgw\_{main.cc, common.h} (`pr#19109 <https://github.com/ceph/ceph/pull/19109>`_, Jiaying Ren)
-* rgw: drop useless lines (`pr#19817 <https://github.com/ceph/ceph/pull/19817>`_, Bingyin Zhang)
-* rgw: drop useless type conversion (`pr#19824 <https://github.com/ceph/ceph/pull/19824>`_, Bingyin Zhang)
-* rgw: drop variable bl in rgw_op.cc (`pr#19584 <https://github.com/ceph/ceph/pull/19584>`_, Bingyin Zhang)
-* rgw: Drop #warning TODO (`issue#19851 <http://tracker.ceph.com/issues/19851>`_, `pr#17012 <https://github.com/ceph/ceph/pull/17012>`_, Jos Collin)
-* rgw: dump Last-Modified in Swift's responses for GET/HEAD on container (`issue#20883 <http://tracker.ceph.com/issues/20883>`_, `pr#16757 <https://github.com/ceph/ceph/pull/16757>`_, Radoslaw Zarzynski)
-* rgw: enable 'qlen' & 'qactive' performance counters (`pr#20842 <https://github.com/ceph/ceph/pull/20842>`_, Mark Kogan)
-* rgw: encoding fixes (`issue#23779 <http://tracker.ceph.com/issues/23779>`_, `pr#21500 <https://github.com/ceph/ceph/pull/21500>`_, Yehuda Sadeh)
-* rgw: Error check on return of read_line() (`pr#17880 <https://github.com/ceph/ceph/pull/17880>`_, Amit Kumar)
-* rgw: es module: set compression type correctly (`issue#22758 <http://tracker.ceph.com/issues/22758>`_, `pr#20796 <https://github.com/ceph/ceph/pull/20796>`_, Abhishek Lekshmanan)
-* rgw: evaluate the correct bucket action for GetACL bucket operation (`issue#21013 <http://tracker.ceph.com/issues/21013>`_, `pr#17050 <https://github.com/ceph/ceph/pull/17050>`_, Abhishek Lekshmanan)
-* rgw: exit early if rgw_bucket_set_attrs() fails (`pr#17041 <https://github.com/ceph/ceph/pull/17041>`_, dengxiafubi)
-    rgw: Expire entries in bucket info cache
-* rgw_file: fix write error when the write offset overlaps (`issue#21455 <http://tracker.ceph.com/issues/21455>`_, `pr#17809 <https://github.com/ceph/ceph/pull/17809>`_, Yao Zongyou)
-* rgw: fix a bug in rgw cache in delete_system_obj and get_system_obj (`pr#10992 <https://github.com/ceph/ceph/pull/10992>`_, zhangshaowen)
-* rgw: fix accessing expired memory in PrefixableSignatureHelper (`issue#21085 <http://tracker.ceph.com/issues/21085>`_, `pr#17206 <https://github.com/ceph/ceph/pull/17206>`_, Radoslaw Zarzynski)
-* rgw: fix a typo in comment (`pr#19608 <https://github.com/ceph/ceph/pull/19608>`_, luomuyao)
-* rgw: fix a typo in comment (`pr#20164 <https://github.com/ceph/ceph/pull/20164>`_, luomuyao)
-* rgw: fix a typo in comment (`pr#20355 <https://github.com/ceph/ceph/pull/20355>`_, luomuyao)
-* rgw: fix a typo in rgw_perms[] (`pr#20024 <https://github.com/ceph/ceph/pull/20024>`_, luomuyao)
-* rgw: fix bilog entries on multipart complete (`issue#21772 <http://tracker.ceph.com/issues/21772>`_, `pr#18271 <https://github.com/ceph/ceph/pull/18271>`_, Casey Bodley)
-* rgw: fix BZ 1500904, stale bucket index entry remains after obj delete (`pr#18709 <https://github.com/ceph/ceph/pull/18709>`_, J. Eric Ivancich)
-* rgw: fix chained cache invalidation to prevent cache size growth (`issue#22410 <http://tracker.ceph.com/issues/22410>`_, `pr#19455 <https://github.com/ceph/ceph/pull/19455>`_, Mark Kogan)
-* rgw: Fix closing tag for Prefix (`pr#17663 <https://github.com/ceph/ceph/pull/17663>`_, Shasha Lu)
-* rgw: fix cls_bucket_head result order consistency (`pr#18700 <https://github.com/ceph/ceph/pull/18700>`_, Tianshan Qu)
-* rgw: fix collect()'s return in coroutine (`pr#19606 <https://github.com/ceph/ceph/pull/19606>`_, Xinying Song)
-* rgw: fix command argument error for radosgw-admin (`issue#21723 <http://tracker.ceph.com/issues/21723>`_, `pr#18175 <https://github.com/ceph/ceph/pull/18175>`_, Yao Zongyou)
-* rgw: fix 'copy part' without 'x-amz-copy-source-range' (`issue#22729 <http://tracker.ceph.com/issues/22729>`_, `pr#20002 <https://github.com/ceph/ceph/pull/20002>`_, Malcolm Lee)
-* rgw: fix 'copy part' without 'x-amz-copy-source-range' when compression enabled (`issue#23196 <http://tracker.ceph.com/issues/23196>`_, `pr#20686 <https://github.com/ceph/ceph/pull/20686>`_, fang yuxiang)
-* rgw: fix crash with rgw_run_sync_thread false (`issue#20448 <http://tracker.ceph.com/issues/20448>`_, `pr#20769 <https://github.com/ceph/ceph/pull/20769>`_, Orit Wasserman)
-* rgw: Fix dereference of empty optional (`issue#21962 <http://tracker.ceph.com/issues/21962>`_, `pr#18602 <https://github.com/ceph/ceph/pull/18602>`_, Adam C. Emerson)
-* rgw: fix error handling for GET with ?torrent (`issue#23506 <http://tracker.ceph.com/issues/23506>`_, `pr#21576 <https://github.com/ceph/ceph/pull/21576>`_, Casey Bodley)
-* rgw: fix error handling in Browser Uploads (`pr#15054 <https://github.com/ceph/ceph/pull/15054>`_, Radoslaw Zarzynski)
-* rgw: fix error handling in ListBucketIndexesCR (`issue#21735 <http://tracker.ceph.com/issues/21735>`_, `pr#18198 <https://github.com/ceph/ceph/pull/18198>`_, Casey Bodley)
-* rgw: fixes for multisite replication of encrypted objects (`issue#20668 <http://tracker.ceph.com/issues/20668>`_, `issue#20671 <http://tracker.ceph.com/issues/20671>`_, `pr#16612 <https://github.com/ceph/ceph/pull/16612>`_, Casey Bodley)
-* rgw: fix extra_data_len handling in PutObj filters (`issue#21895 <http://tracker.ceph.com/issues/21895>`_, `pr#18489 <https://github.com/ceph/ceph/pull/18489>`_, Casey Bodley)
-* rgw: fix for empty query string in beast frontend (`issue#22797 <http://tracker.ceph.com/issues/22797>`_, `pr#20120 <https://github.com/ceph/ceph/pull/20120>`_, Casey Bodley)
-* rgw: fix for issue #21647 (`issue#23859 <http://tracker.ceph.com/issues/23859>`_, `pr#21647 <https://github.com/ceph/ceph/pull/21647>`_, Yehuda Sadeh)
-* rgw: fix for pause in beast frontend (`issue#21831 <http://tracker.ceph.com/issues/21831>`_, `pr#18402 <https://github.com/ceph/ceph/pull/18402>`_, Casey Bodley)
-* rgw: fix for usage truncated flag (`pr#20926 <https://github.com/ceph/ceph/pull/20926>`_, Yehuda Sadeh, Greg Farnum, Robin H. Johnson)
-* rgw: Fix getter function names in RGWEnv (`pr#18377 <https://github.com/ceph/ceph/pull/18377>`_, Jos Collin)
-* rgw: fix GET website response error code (`issue#22272 <http://tracker.ceph.com/issues/22272>`_, `pr#19236 <https://github.com/ceph/ceph/pull/19236>`_, Dmitry Plyakin)
-* rgw: fix handling of ENOENT in RGWRadosGetOmapKeysCR (`pr#19878 <https://github.com/ceph/ceph/pull/19878>`_, Casey Bodley)
-* rgw: fix index cancel op miss update header (`pr#20396 <https://github.com/ceph/ceph/pull/20396>`_, Tianshan Qu)
-* rgw: Fix infinite call for bi list when resharding a bucket (`issue#22721 <http://tracker.ceph.com/issues/22721>`_, `pr#21584 <https://github.com/ceph/ceph/pull/21584>`_, Orit Wasserman)
-* rgw: fix lc process only schdule the first item of lc objects (`issue#21022 <http://tracker.ceph.com/issues/21022>`_, `pr#17061 <https://github.com/ceph/ceph/pull/17061>`_, Shasha Lu)
-* rgw:fix list objects with marker wrong result  when bucket is enable versioning (`issue#21500 <http://tracker.ceph.com/issues/21500>`_, `pr#17934 <https://github.com/ceph/ceph/pull/17934>`_, yuliyang)
-* rgw: fix memory fragmentation problem reading data from client (`pr#20724 <https://github.com/ceph/ceph/pull/20724>`_, Marcus Watts)
-* rgw: Fix multisite Synchronization failed when read and write delete … (`issue#22804 <http://tracker.ceph.com/issues/22804>`_, `pr#20814 <https://github.com/ceph/ceph/pull/20814>`_, Niu Pengju)
-* rgw: fix not responding when receiving SIGHUP signal (`pr#16854 <https://github.com/ceph/ceph/pull/16854>`_, Yao Zongyou)
-* rgw: fix null pointer crush (`pr#18861 <https://github.com/ceph/ceph/pull/18861>`_, Sibei Gao)
-* rgw: fix obj copied from remote gateway acl full_control issue (`issue#20658 <http://tracker.ceph.com/issues/20658>`_, `pr#16127 <https://github.com/ceph/ceph/pull/16127>`_, Enming Zhang)
-* rgw: fix opslog cannot record remote_addr (`issue#20931 <http://tracker.ceph.com/issues/20931>`_, `pr#16860 <https://github.com/ceph/ceph/pull/16860>`_, Jiaying Ren)
-* rgw: fix opslog can't record referrer when using curl as client (`issue#20935 <http://tracker.ceph.com/issues/20935>`_, `pr#16863 <https://github.com/ceph/ceph/pull/16863>`_, Jiaying Ren)
-* rgw: fix opslog uri as per Amazon s3 (`issue#20971 <http://tracker.ceph.com/issues/20971>`_, `pr#16958 <https://github.com/ceph/ceph/pull/16958>`_, Jiaying Ren)
-* rgw: fix radosgw-admin bucket rm with --purge-objects and --bypass-gc (`issue#22122 <http://tracker.ceph.com/issues/22122>`_, `issue#19959 <http://tracker.ceph.com/issues/19959>`_, `pr#18922 <https://github.com/ceph/ceph/pull/18922>`_, Aleksei Gutikov)
-* rgw: fix radosgw-admin quota enable return value bug (`issue#21608 <http://tracker.ceph.com/issues/21608>`_, `pr#18057 <https://github.com/ceph/ceph/pull/18057>`_, baixueyu)
-* rgw: fix radosgw linkage with WITH_RADOSGW_BEAST_FRONTEND=OFF (`issue#23680 <http://tracker.ceph.com/issues/23680>`_, `pr#21380 <https://github.com/ceph/ceph/pull/21380>`_, Casey Bodley)
-* rgw: fix recursive lock (`pr#19430 <https://github.com/ceph/ceph/pull/19430>`_, Tianshan Qu)
-* rgw: fix resource leak in rgw_bucket.cc and rgw_user.cc (`issue#21214 <http://tracker.ceph.com/issues/21214>`_, `pr#17353 <https://github.com/ceph/ceph/pull/17353>`_, Luo Kexue)
-* rgw: fix return value of auth v2/v4 (`issue#22439 <http://tracker.ceph.com/issues/22439>`_, `pr#19310 <https://github.com/ceph/ceph/pull/19310>`_, Bingyin Zhang)
-* rgw: fix rewrite a versioning object create a new object bug (`issue#21984 <http://tracker.ceph.com/issues/21984>`_, `pr#18662 <https://github.com/ceph/ceph/pull/18662>`_, Enming Zhang)
-* rgw: fix rewrite options usage text (`pr#18968 <https://github.com/ceph/ceph/pull/18968>`_, Jos Collin)
-* rgw: fix RGWCompletionManager get_next stuck after going down (`issue#22799 <http://tracker.ceph.com/issues/22799>`_, `pr#20095 <https://github.com/ceph/ceph/pull/20095>`_, Tianshan Qu)
-* rgw: fix RGWLibIO did not init RGWEnv (`pr#19065 <https://github.com/ceph/ceph/pull/19065>`_, Tianshan Qu)
-* rgw: fix s3 website redirection error (`pr#19252 <https://github.com/ceph/ceph/pull/19252>`_, yuliyang)
-* rgw: fix s3website redirect location string length (`pr#19826 <https://github.com/ceph/ceph/pull/19826>`_, yuliyang)
-* rgw: fix Swift container naming rules (`issue#19264 <http://tracker.ceph.com/issues/19264>`_, `pr#13992 <https://github.com/ceph/ceph/pull/13992>`_, Robin H. Johnson)
-* rgw: Fix swift object expiry not deleting objects (`issue#22084 <http://tracker.ceph.com/issues/22084>`_, `pr#18821 <https://github.com/ceph/ceph/pull/18821>`_, Pavan Rallabhandi)
-* rgw: fix sync status conflict with cloud sync (`pr#21425 <https://github.com/ceph/ceph/pull/21425>`_, Casey Bodley)
-* rgw: fix the bug of radowgw-admin zonegroup set requires realm (`issue#21583 <http://tracker.ceph.com/issues/21583>`_, `pr#19061 <https://github.com/ceph/ceph/pull/19061>`_, lvshanchun)
-* rgw: fix the max-uploads parameter not work (`issue#22825 <http://tracker.ceph.com/issues/22825>`_, `pr#20158 <https://github.com/ceph/ceph/pull/20158>`_, Xin Liao)
-* rgw: fix the return type is wrong (`pr#19773 <https://github.com/ceph/ceph/pull/19773>`_, hechuang)
-* rgw: fix total_time to msec as per AWS S3 (`pr#17541 <https://github.com/ceph/ceph/pull/17541>`_, Jiaying Ren)
-* rgw: fix typo anynoymous to anonymous (`pr#19281 <https://github.com/ceph/ceph/pull/19281>`_, Bingyin Zhang)
-* rgw: fix typo compete to complete (`pr#19675 <https://github.com/ceph/ceph/pull/19675>`_, Bingyin Zhang)
-* rgw: Fix typo in comment (`pr#21032 <https://github.com/ceph/ceph/pull/21032>`_, Simran Singhal)
-* rgw: fix typo in GetOmapKeysCR (`pr#19713 <https://github.com/ceph/ceph/pull/19713>`_, lvshanchun)
-* rgw: fix typo signle to single (`pr#19517 <https://github.com/ceph/ceph/pull/19517>`_, Bingyin Zhang)
-* rgw: fix typo woild to would (`pr#19472 <https://github.com/ceph/ceph/pull/19472>`_, Bingyin Zhang)
-* rgw: Fix use after free in IAM policy parser (`pr#16823 <https://github.com/ceph/ceph/pull/16823>`_, Adam C. Emerson)
-* rgw: fix use of libcurl with empty header values (`issue#23663 <http://tracker.ceph.com/issues/23663>`_, `pr#21358 <https://github.com/ceph/ceph/pull/21358>`_, Casey Bodley)
-* rgw: format logs in file rgw_lc.cc (`pr#19615 <https://github.com/ceph/ceph/pull/19615>`_, Bingyin Zhang)
-* rgw: format rgw_bucket_dir_header in ceph-dencoder (`pr#19753 <https://github.com/ceph/ceph/pull/19753>`_, Bingyin Zhang)
-* rgw: gc use aio (`pr#20546 <https://github.com/ceph/ceph/pull/20546>`_, Yehuda Sadeh)
-    rgw: Handle stale bucket info in RGWDeleteBucketPolicy
-    rgw: Handle stale bucket info in RGWDeleteBucketWebsite
-    rgw: Handle stale bucket info in RGWPutBucketPolicy
-    rgw: Handle stale bucket info in RGWPutMetadataBucket
-    rgw: Handle stale bucket info in RGWSetBucketVersioning
-    rgw: Handle stale bucket info in RGWSetBucketWebsite
-* rgw: honor the tenant part of rgw_bucket during comparisons (`issue#20897 <http://tracker.ceph.com/issues/20897>`_, `pr#16796 <https://github.com/ceph/ceph/pull/16796>`_, Radoslaw Zarzynski)
-* rgw: iam policy printing cleanups (`pr#18961 <https://github.com/ceph/ceph/pull/18961>`_, Kefu Chai)
-* rgw: Ignoring the returned error (`pr#17907 <https://github.com/ceph/ceph/pull/17907>`_, Amit Kumar)
-* rgw: implement ipv4 aws:SourceIp condition for bucket policy (`pr#19167 <https://github.com/ceph/ceph/pull/19167>`_, yuliyang)
-* rgw: improve handling of Swift's error messages and limits (`issue#17938 <http://tracker.ceph.com/issues/17938>`_, `issue#21169 <http://tracker.ceph.com/issues/21169>`_, `issue#17935 <http://tracker.ceph.com/issues/17935>`_, `issue#17934 <http://tracker.ceph.com/issues/17934>`_, `issue#17936 <http://tracker.ceph.com/issues/17936>`_, `pr#15369 <https://github.com/ceph/ceph/pull/15369>`_, Radoslaw Zarzynski)
-* rgw: improve sync status: display behind bucket shards (`pr#20027 <https://github.com/ceph/ceph/pull/20027>`_, lvshanchun)
-* rgw: improve sync status (`pr#19573 <https://github.com/ceph/ceph/pull/19573>`_, lvshanchun)
-* rgw: include SSE-KMS headers in encrypted upload response (`issue#21576 <http://tracker.ceph.com/issues/21576>`_, `pr#17999 <https://github.com/ceph/ceph/pull/17999>`_, Casey Bodley)
-* rgw: incorporate the Transfer-Encoding fix for CivetWeb (`issue#21015 <http://tracker.ceph.com/issues/21015>`_, `pr#17072 <https://github.com/ceph/ceph/pull/17072>`_, Radoslaw Zarzynski)
-* rgw: Initialization of epoch,len (`pr#17722 <https://github.com/ceph/ceph/pull/17722>`_, Amit Kumar)
-* rgw: Initialize is_master, max_aio, size (`pr#16933 <https://github.com/ceph/ceph/pull/16933>`_, amitkuma)
-* rgw: Initializes uninitialized members (`pr#16855 <https://github.com/ceph/ceph/pull/16855>`_, Amit Kumar)
-* rgw: init oldest period after setting run_sync_thread (`issue#21996 <http://tracker.ceph.com/issues/21996>`_, `pr#18664 <https://github.com/ceph/ceph/pull/18664>`_, Orit Wasserman, Casey Bodley)
-* rgw: keep compression type consistent between parts of s3 Multipart (`pr#19740 <https://github.com/ceph/ceph/pull/19740>`_, fang yuxiang)
-* rgw: keystone: bump up logging when error is received (`issue#22151 <http://tracker.ceph.com/issues/22151>`_, `pr#18985 <https://github.com/ceph/ceph/pull/18985>`_, Abhishek Lekshmanan)
-* rgw:lc fix expiration time (`issue#21533 <http://tracker.ceph.com/issues/21533>`_, `pr#17824 <https://github.com/ceph/ceph/pull/17824>`_, Shasha Lu)
-* rgw: lc support Content-MD5 request header and fix a rgw crash bug (`issue#21980 <http://tracker.ceph.com/issues/21980>`_, `pr#18534 <https://github.com/ceph/ceph/pull/18534>`_, Enming Zhang)
-* rgw: lease_cr->go_down is called twice, remove the needless one (`pr#19394 <https://github.com/ceph/ceph/pull/19394>`_, Zhang Shaowen)
-* rgw: librgw: export multitenancy support (`pr#19358 <https://github.com/ceph/ceph/pull/19358>`_, Tao Chen)
-* rgw: librgw: fix shutdown err with resources uncleaned (`issue#22296 <http://tracker.ceph.com/issues/22296>`_, `pr#19279 <https://github.com/ceph/ceph/pull/19279>`_, Tao Chen)
-* rgw: lifecycle omap entry was removed in abnormal situation (`pr#19921 <https://github.com/ceph/ceph/pull/19921>`_, fang yuxiang)
-* rgw: list_objects() honors end_marker regardless of namespace (`issue#18977 <http://tracker.ceph.com/issues/18977>`_, `pr#15273 <https://github.com/ceph/ceph/pull/15273>`_, Radoslaw Zarzynski)
-* rgw: loadgen fix generate random object name rgw crash issue (`issue#22006 <http://tracker.ceph.com/issues/22006>`_, `pr#18536 <https://github.com/ceph/ceph/pull/18536>`_, Enming Zhang)
-* rgw: log the right http status code in civetweb frontend's access log (`issue#22538 <http://tracker.ceph.com/issues/22538>`_, `pr#19678 <https://github.com/ceph/ceph/pull/19678>`_, Yao Zongyou)
-* rgw: log unlink_instance mtime as object's mtime (`issue#18885 <http://tracker.ceph.com/issues/18885>`_, `pr#20016 <https://github.com/ceph/ceph/pull/20016>`_, Yehuda Sadeh)
-* rgw: lttng: Trace rgw data transfer, bi entry and object header update processes (`pr#20556 <https://github.com/ceph/ceph/pull/20556>`_, Yang Honggang)
-* rgw:  make init env methods return an error (`issue#23039 <http://tracker.ceph.com/issues/23039>`_, `pr#20488 <https://github.com/ceph/ceph/pull/20488>`_, Abhishek Lekshmanan)
-* rgw: make radosgw object stat RGW_ATTR_COMPRESSION dump readable (`pr#19846 <https://github.com/ceph/ceph/pull/19846>`_, fang yuxiang)
-* rgw: mfa support (`pr#19283 <https://github.com/ceph/ceph/pull/19283>`_, Yehuda Sadeh)
-* rgw: mimic: rgw: policy: modify s3:ListBucketMultiPartUploads to s3:ListBucketMul (`issue#24062 <http://tracker.ceph.com/issues/24062>`_, `pr#21916 <https://github.com/ceph/ceph/pull/21916>`_, xiangxiang)
-* rgw: modify s3 type subuser access permissions fail through admin rest api (`issue#21983 <http://tracker.ceph.com/issues/21983>`_, `pr#18641 <https://github.com/ceph/ceph/pull/18641>`_, yuliyang)
-* rgw: move all pool creation into rgw_init_ioctx (`issue#23480 <http://tracker.ceph.com/issues/23480>`_, `pr#21534 <https://github.com/ceph/ceph/pull/21534>`_, Casey Bodley)
-* rgw: mrgw.sh uses instance name 'client.rgw' (`pr#18404 <https://github.com/ceph/ceph/pull/18404>`_, Casey Bodley)
-* rgw: multisite log tracing (`pr#16492 <https://github.com/ceph/ceph/pull/16492>`_, Yehuda Sadeh, Casey Bodley)
-* rgw,nfs: Add hint to use -o sync when mouting (`pr#16210 <https://github.com/ceph/ceph/pull/16210>`_, Adam Kupczyk)
-* rgw: no need to deal with md5 header in get_data (`pr#19144 <https://github.com/ceph/ceph/pull/19144>`_, Zhang Shaowen)
-* rgw: optimize function abort_bucket_multiparts (`pr#19710 <https://github.com/ceph/ceph/pull/19710>`_, Bingyin Zhang)
-* rgw: optimize function bucket_lc_prepare (`pr#19613 <https://github.com/ceph/ceph/pull/19613>`_, Bingyin Zhang)
-* rgw: optimize function parse_raw_oid (`pr#19814 <https://github.com/ceph/ceph/pull/19814>`_, Bingyin Zhang)
-* rgw: optimize function RGWHandler::do_init_permissions (`pr#19700 <https://github.com/ceph/ceph/pull/19700>`_, Bingyin Zhang)
-* rgw: optimize memory usage in function rgw_bucket::get_key (`pr#19391 <https://github.com/ceph/ceph/pull/19391>`_, Bingyin Zhang)
-* rgw: optimize next start time for lifecycle (`pr#19596 <https://github.com/ceph/ceph/pull/19596>`_, Bingyin Zhang)
-* rgw: optimize the rgw-attr del code logic (`pr#18895 <https://github.com/ceph/ceph/pull/18895>`_, wangsongbo)
-* rgw: optimize time skew check (`pr#19511 <https://github.com/ceph/ceph/pull/19511>`_, Bingyin Zhang)
-* rgw: parse old rgw_obj with namespace correctly (`issue#22982 <http://tracker.ceph.com/issues/22982>`_, `pr#20425 <https://github.com/ceph/ceph/pull/20425>`_, Yehuda Sadeh)
-* rgw: policy: support for s3 conditionals in ListBucket Op (`pr#16628 <https://github.com/ceph/ceph/pull/16628>`_, Abhishek Lekshmanan)
-* rgw: Potential fix for possible 500 on POST (`pr#18954 <https://github.com/ceph/ceph/pull/18954>`_, Adam C. Emerson)
-* rgw: Prevent overflow of cached stats values (`issue#20934 <http://tracker.ceph.com/issues/20934>`_, `pr#17116 <https://github.com/ceph/ceph/pull/17116>`_, Aleksei Gutikov)
-* rgw: proper error message when tier_type does not exist (`issue#22469 <http://tracker.ceph.com/issues/22469>`_, `pr#19575 <https://github.com/ceph/ceph/pull/19575>`_, lvshanchun, Chang Liu)
-* rgw: pull up beast submodule and update frontend (`pr#17923 <https://github.com/ceph/ceph/pull/17923>`_, Casey Bodley)
-* rgw: put bucket policy panics RGW process (`issue#22541 <http://tracker.ceph.com/issues/22541>`_, `pr#19687 <https://github.com/ceph/ceph/pull/19687>`_, Bingyin Zhang)
-* rgw: radosgw-admin abort early for user stats for empty uids (`issue#23322 <http://tracker.ceph.com/issues/23322>`_, `pr#20846 <https://github.com/ceph/ceph/pull/20846>`_, Abhishek Lekshmanan)
-* rgw: radosgw-admin should not use metadata cache for readonly commands (`issue#23468 <http://tracker.ceph.com/issues/23468>`_, `pr#21129 <https://github.com/ceph/ceph/pull/21129>`_, Orit Wasserman)
-* rgw: radosgw-admin zonegroup get and zone get return defaults when there is no realm (`issue#21615 <http://tracker.ceph.com/issues/21615>`_, `pr#18667 <https://github.com/ceph/ceph/pull/18667>`_, lvshanchun)
-* rgw: radosgw: fix awsv4 header line sort order (`issue#21607 <http://tracker.ceph.com/issues/21607>`_, `pr#18046 <https://github.com/ceph/ceph/pull/18046>`_, Marcus Watts)
-* rgw: radosgw: usage: fix bytes_sent bug (`issue#19870 <http://tracker.ceph.com/issues/19870>`_, `pr#16834 <https://github.com/ceph/ceph/pull/16834>`_, Marcus Watts)
-* rgw: raise log level on coroutine shutdown errors (`issue#23974 <http://tracker.ceph.com/issues/23974>`_, `pr#21791 <https://github.com/ceph/ceph/pull/21791>`_, Casey Bodley)
-* rgw: Reinstating error codes mapping for Roles (`pr#20309 <https://github.com/ceph/ceph/pull/20309>`_, Pritha Srivastava)
-* rgw: reject encrypted object COPY before supported (`issue#23232 <http://tracker.ceph.com/issues/23232>`_, `pr#20739 <https://github.com/ceph/ceph/pull/20739>`_, Jeegn Chen)
-* rgw: release cls lock if taken in RGWCompleteMultipart (`issue#21596 <http://tracker.ceph.com/issues/21596>`_, `pr#18104 <https://github.com/ceph/ceph/pull/18104>`_, Matt Benjamin)
-* rgw: Remove assertions in IAM Policy (`pr#18225 <https://github.com/ceph/ceph/pull/18225>`_, Adam C. Emerson)
-* rgw: remove get_system_obj_attrs in function RGWDeleteLC::execute and RGWDeleteCORS::execute (`pr#19582 <https://github.com/ceph/ceph/pull/19582>`_, Bingyin Zhang)
-* rgw: remove placement_rule from rgw_link_bucket() (`issue#21990 <http://tracker.ceph.com/issues/21990>`_, `pr#18657 <https://github.com/ceph/ceph/pull/18657>`_, Casey Bodley)
-* rgw: remove redundant parenthesis in logs (`pr#19375 <https://github.com/ceph/ceph/pull/19375>`_, Bingyin Zhang)
-* rgw: remove redundant S3AnonymousEngine (`pr#19474 <https://github.com/ceph/ceph/pull/19474>`_, Bingyin Zhang)
-* rgw: remove redundant signature compare in LocalEngine::authenticate (`pr#19676 <https://github.com/ceph/ceph/pull/19676>`_, Bingyin Zhang)
-* rgw: Remove the useless output when list zones (`pr#17434 <https://github.com/ceph/ceph/pull/17434>`_, iliul)
-* rgw: remove unused cls_user_add_bucket (`pr#19917 <https://github.com/ceph/ceph/pull/19917>`_, Yao Zongyou)
-* rgw: remove unused disable_signal_fd (`pr#18875 <https://github.com/ceph/ceph/pull/18875>`_, Yao Zongyou)
-* rgw: remove unused function get_system_obj_attrs (`pr#19852 <https://github.com/ceph/ceph/pull/19852>`_, Yao Zongyou)
-* rgw: Remove unused Parameter in Function RGWConf::init() (`pr#17129 <https://github.com/ceph/ceph/pull/17129>`_, Wen Zhang)
-* rgw: remove unused param in AWSGeneralAbstractor::get_auth_data_v4 (`pr#19250 <https://github.com/ceph/ceph/pull/19250>`_, Bingyin Zhang)
-* rgw: remove unused param in get_bucket_instance_policy_from_attr (`pr#19129 <https://github.com/ceph/ceph/pull/19129>`_, Bingyin Zhang)
-* rgw: remove unused variables (`pr#16649 <https://github.com/ceph/ceph/pull/16649>`_, Zhang Lei)
-* rgw: remove useless lines in RGWDeleteBucket::execute (`pr#19699 <https://github.com/ceph/ceph/pull/19699>`_, Bingyin Zhang)
-* rgw: reshard cancel command should clear bucket resharding flag (`issue#21619 <http://tracker.ceph.com/issues/21619>`_, `pr#21120 <https://github.com/ceph/ceph/pull/21120>`_, Orit Wasserman)
-* rgw: reshard should not update stats when linking new bucket instance (`issue#22124 <http://tracker.ceph.com/issues/22124>`_, `pr#19253 <https://github.com/ceph/ceph/pull/19253>`_, Orit Wasserman)
-* rgw: retry CORS put/delete operations on ECANCELLED (`issue#22517 <http://tracker.ceph.com/issues/22517>`_, `pr#19601 <https://github.com/ceph/ceph/pull/19601>`_, Adam C. Emerson)
-* rgw: return 'Access-Control-Allow-Origin' header when the set and delete bucket website through XMLHttpRequest (`pr#17632 <https://github.com/ceph/ceph/pull/17632>`_, yuliyang)
-* rgw: return 'Access-Control-Allow-Origin' header when the set bucket versioning through XMLHttpRequest (`pr#17631 <https://github.com/ceph/ceph/pull/17631>`_, yuliyang)
-* rgw: return bucket's location no matter which zonegroup it located in (`issue#21125 <http://tracker.ceph.com/issues/21125>`_, `pr#17250 <https://github.com/ceph/ceph/pull/17250>`_, Shasha Lu)
-* rgw: return EINVAL if max_keys can not convert correctly (`issue#23586 <http://tracker.ceph.com/issues/23586>`_, `pr#21285 <https://github.com/ceph/ceph/pull/21285>`_, yuliyang)
-* rgw: Return Error if Bucket Policy Contians Undefined Action (`pr#17433 <https://github.com/ceph/ceph/pull/17433>`_, zhangwen)
-* rgw: Returning when dst_ioctx.operate() returns error (`pr#17873 <https://github.com/ceph/ceph/pull/17873>`_, Amit Kumar)
-* rgw: return valid Location element, CompleteMultipartUpload (`pr#19902 <https://github.com/ceph/ceph/pull/19902>`_, Matt Benjamin)
-* rgw: revert PR #8765 (`pr#16807 <https://github.com/ceph/ceph/pull/16807>`_, fang.yuxiang)
-* rgw: Revert "radosgw: fix awsv4 header line sort order." (`issue#21832 <http://tracker.ceph.com/issues/21832>`_, `pr#18381 <https://github.com/ceph/ceph/pull/18381>`_, Casey Bodley)
-* rgw: Revert "rgw_file: disable FLAG_EXACT_MATCH enforcement" (`issue#22827 <http://tracker.ceph.com/issues/22827>`_, `pr#20171 <https://github.com/ceph/ceph/pull/20171>`_, Matt Benjamin)
-* rgw: Revert "rgw: reshard should not update stats when linking new bucket instance" (`pr#20052 <https://github.com/ceph/ceph/pull/20052>`_, Orit Wasserman)
-* rgw: rework json/xml escape usage follow #19806 (`pr#19845 <https://github.com/ceph/ceph/pull/19845>`_, fang yuxiang)
-* rgw: rgw-admin: check input parameters for friendly prompt (`pr#17343 <https://github.com/ceph/ceph/pull/17343>`_, Yao Zongyou)
-* rgw: rgw-admin: check the data extra pool supports omap (`pr#18978 <https://github.com/ceph/ceph/pull/18978>`_, Yao Zongyou)
-* rgw: rgw-admin: properly filtering bucket stats by user_id or bucket_name (`pr#19401 <https://github.com/ceph/ceph/pull/19401>`_, Yao Zongyou)
-* rgw: rgw-admin: require --yes-i-really-mean-it when using --inconsistent_index (`issue#20777 <http://tracker.ceph.com/issues/20777>`_, `pr#17185 <https://github.com/ceph/ceph/pull/17185>`_, Orit Wasserman)
-* rgw: rgw-admin: support for processing all gc objects including unexpired (`pr#17482 <https://github.com/ceph/ceph/pull/17482>`_, Yao Zongyou)
-* rgw: RGW: change function parameters from value to refrence (`pr#18355 <https://github.com/ceph/ceph/pull/18355>`_, Sibei Gao)
-* rgw: RGWCivetWeb::read_data: fix arguments to mg_read() call (`issue#23596 <http://tracker.ceph.com/issues/23596>`_, `pr#21291 <https://github.com/ceph/ceph/pull/21291>`_, Nathan Cutler)
-* rgw: rgw clean-up: remove unreferenced pure virtual class StreamObjData (`pr#18799 <https://github.com/ceph/ceph/pull/18799>`_, J. Eric Ivancich)
-* rgw: rgw clean-up: remove unused var & func in RGWRados::SystemObject (`pr#18987 <https://github.com/ceph/ceph/pull/18987>`_, J. Eric Ivancich)
-* rgw: rgw cleanup: some unnecessary function called and repeated assignment (`pr#18817 <https://github.com/ceph/ceph/pull/18817>`_, Enming Zhang)
-* rgw: rgw cloud sync (`issue#21802 <http://tracker.ceph.com/issues/21802>`_, `pr#18932 <https://github.com/ceph/ceph/pull/18932>`_, lvshanchun, Yehuda Sadeh, Chang Liu, Abhishek Lekshmanan)
-* rgw: RGWEnv::set() takes std::string (`issue#22101 <http://tracker.ceph.com/issues/22101>`_, `pr#18866 <https://github.com/ceph/ceph/pull/18866>`_, Casey Bodley)
-* rgw: rgw_file: alternate fix deadlock on lru eviction (`pr#20034 <https://github.com/ceph/ceph/pull/20034>`_, Matt Benjamin)
-* rgw: rgw_file: avoid evaluating nullptr for readdir offset (`pr#20145 <https://github.com/ceph/ceph/pull/20145>`_, Matt Benjamin)
-* rgw: rgw_file: conditionally unlink handles when direct deleted (`issue#23299 <http://tracker.ceph.com/issues/23299>`_, `pr#20834 <https://github.com/ceph/ceph/pull/20834>`_, Matt Benjamin)
-* rgw: rgw_file: explicit NFSv3 open() emulation (`pr#18365 <https://github.com/ceph/ceph/pull/18365>`_, Matt Benjamin)
-* rgw: rgw_file:  fix LRU lane lock in evict_block() (`issue#21141 <http://tracker.ceph.com/issues/21141>`_, `pr#17267 <https://github.com/ceph/ceph/pull/17267>`_, Matt Benjamin)
-* rgw: rgw_file: implement variant offset readdir processing (`pr#18335 <https://github.com/ceph/ceph/pull/18335>`_, Matt Benjamin)
-* rgw: rgw_file: introduce new fsid and rgw_mount (`pr#15330 <https://github.com/ceph/ceph/pull/15330>`_, Gui Hecheng)
-* rgw: rgw_file:  set s->obj_size from bytes_written (`issue#21940 <http://tracker.ceph.com/issues/21940>`_, `pr#18571 <https://github.com/ceph/ceph/pull/18571>`_, Matt Benjamin)
-* rgw: rgw_file: Silence unused-function warnings (`pr#19278 <https://github.com/ceph/ceph/pull/19278>`_, Brad Hubbard)
-* rgw: RGW: fix a bug about inconsistent unit of comparison (`issue#21590 <http://tracker.ceph.com/issues/21590>`_, `pr#17958 <https://github.com/ceph/ceph/pull/17958>`_, gaosibei)
-* rgw: rgw.iam: change '1' to '1ULL' in function print_actions (`pr#18900 <https://github.com/ceph/ceph/pull/18900>`_, Bingyin Zhang)
-* rgw: rgw_lc: add support for optional filter argument and make ID optional (`issue#19587 <http://tracker.ceph.com/issues/19587>`_, `issue#20872 <http://tracker.ceph.com/issues/20872>`_, `pr#16818 <https://github.com/ceph/ceph/pull/16818>`_, Abhishek Lekshmanan)
-* rgw: rgw_lc: support for AWSv4 authentication (`pr#16734 <https://github.com/ceph/ceph/pull/16734>`_, Abhishek Lekshmanan)
-* rgw: rgw_log, rgw_file: account for new required envvars (`issue#21942 <http://tracker.ceph.com/issues/21942>`_, `pr#18572 <https://github.com/ceph/ceph/pull/18572>`_, Matt Benjamin)
-* rgw: Rgw master fix plus (`issue#21000 <http://tracker.ceph.com/issues/21000>`_, `issue#21003 <http://tracker.ceph.com/issues/21003>`_, `issue#20501 <http://tracker.ceph.com/issues/20501>`_, `pr#17040 <https://github.com/ceph/ceph/pull/17040>`_, Zhang Shaowen, Marcus Watts)
-* rgw: rgw, mon: normalize delete/remove in admin console (cleanup 22444) (`issue#14363 <http://tracker.ceph.com/issues/14363>`_, `issue#22444 <http://tracker.ceph.com/issues/22444>`_, `pr#19439 <https://github.com/ceph/ceph/pull/19439>`_, Jesse Williamson)
-* rgw: RGW: Multipart upload may double the quota (`issue#21586 <http://tracker.ceph.com/issues/21586>`_, `pr#17959 <https://github.com/ceph/ceph/pull/17959>`_, Sibei Gao)
-* rgw: rgw multisite: automated trimming for bucket index logs (`issue#18229 <http://tracker.ceph.com/issues/18229>`_, `pr#17761 <https://github.com/ceph/ceph/pull/17761>`_, Casey Bodley)
-* rgw: RGW NFS:  mount cmdline example missing -osync (`pr#15855 <https://github.com/ceph/ceph/pull/15855>`_, Matt Benjamin)
-* rgw: RGW-NFS: Use rados cluster_stat to report filesystem usage (`issue#22202 <http://tracker.ceph.com/issues/22202>`_, `pr#20093 <https://github.com/ceph/ceph/pull/20093>`_, Supriti Singh)
-* rgw: rgw_op: Drop the Old LifecycleConfiguration from logs (`pr#16821 <https://github.com/ceph/ceph/pull/16821>`_, Abhishek Lekshmanan)
-* rgw: rgw_op: exit early if object has no attrs in GetObjectTagging (`issue#21010 <http://tracker.ceph.com/issues/21010>`_, `pr#17048 <https://github.com/ceph/ceph/pull/17048>`_, Abhishek Lekshmanan)
-* rgw: RGWPutLC return ERR_MALFORMED_XML  when missing <Rule> tag in lifecycle.xml (`issue#21377 <http://tracker.ceph.com/issues/21377>`_, `pr#17683 <https://github.com/ceph/ceph/pull/17683>`_, Shasha Lu)
-* rgw: rgw_put_system_obj takes bufferlist (`pr#19897 <https://github.com/ceph/ceph/pull/19897>`_, Casey Bodley)
-* rgw: rgw_rados: set_attrs now sets the same time for BI & object (`issue#21200 <http://tracker.ceph.com/issues/21200>`_, `pr#17400 <https://github.com/ceph/ceph/pull/17400>`_, Abhishek Lekshmanan)
-* rgw: rgw/rgw_op.cc: Fix error message in rgw_user_get_all_buckets_stats (`pr#18781 <https://github.com/ceph/ceph/pull/18781>`_, iliul)
-* rgw:  rgw: source data in 'default.rgw.buckets.data' may not be deleted after inter-bucket copy (`issue#21819 <http://tracker.ceph.com/issues/21819>`_, `pr#18369 <https://github.com/ceph/ceph/pull/18369>`_, baixueyu)
-* rgw: RGW: support for tagging in lifecycle policies (`pr#17305 <https://github.com/ceph/ceph/pull/17305>`_, Abhishek Lekshmanan)
-* rgw: RGW: update S3 POST policy handling of Content-Type (`issue#20201 <http://tracker.ceph.com/issues/20201>`_, `pr#18658 <https://github.com/ceph/ceph/pull/18658>`_, Matt Benjamin)
-* rgw:  rgw: use camelcase format in request headers (`pr#19210 <https://github.com/ceph/ceph/pull/19210>`_, lvshanchun, Chang Liu)
-* rgw: RGWUser::init no longer overwrites user_id (`issue#21685 <http://tracker.ceph.com/issues/21685>`_, `pr#18137 <https://github.com/ceph/ceph/pull/18137>`_, Casey Bodley)
-* rgw: S3 Bucket Policy Conditions IpAddress and NotIpAddress do not work (`issue#20991 <http://tracker.ceph.com/issues/20991>`_, `pr#17010 <https://github.com/ceph/ceph/pull/17010>`_, John Gibson)
-* rgw: s3website error handler uses original object name (`issue#23201 <http://tracker.ceph.com/issues/23201>`_, `pr#20693 <https://github.com/ceph/ceph/pull/20693>`_, Casey Bodley)
-* rgw:send x-amz-version-id header when upload files (`pr#18935 <https://github.com/ceph/ceph/pull/18935>`_, Xinying Song)
-* rgw: set bucket versioninig donot change versioning status if missing status in xml (`issue#21364 <http://tracker.ceph.com/issues/21364>`_, `pr#17662 <https://github.com/ceph/ceph/pull/17662>`_, Shasha Lu)
-* rgw: set num_shards on 'radosgw-admin data sync init' (`issue#22083 <http://tracker.ceph.com/issues/22083>`_, `pr#18883 <https://github.com/ceph/ceph/pull/18883>`_, Casey Bodley)
-* rgw: set priority on perf counters (`pr#20006 <https://github.com/ceph/ceph/pull/20006>`_, John Spray)
-* rgw: set sync_from_all as true when no value is seen (`issue#22062 <http://tracker.ceph.com/issues/22062>`_, `pr#18926 <https://github.com/ceph/ceph/pull/18926>`_, Abhishek Lekshmanan)
-* rgw: setup locks for libopenssl (`issue#22951 <http://tracker.ceph.com/issues/22951>`_, `issue#23203 <http://tracker.ceph.com/issues/23203>`_, `pr#20390 <https://github.com/ceph/ceph/pull/20390>`_, Abhishek Lekshmanan, Jesse Williamson)
-* rgw: share time skew check between v2 and v4 auth (`pr#20013 <https://github.com/ceph/ceph/pull/20013>`_, Casey Bodley)
-* rgw: Silence maybe-uninitialized false positives (`pr#19274 <https://github.com/ceph/ceph/pull/19274>`_, Brad Hubbard)
-* rgw: silence not allow register storage class specifier warning (`pr#19859 <https://github.com/ceph/ceph/pull/19859>`_, Yao Zongyou)
-* rgw: simplify use of map::emplace in iam (`pr#18706 <https://github.com/ceph/ceph/pull/18706>`_, Casey Bodley)
-* rgw: Small refactor and two bug fixes (`issue#21901 <http://tracker.ceph.com/issues/21901>`_, `issue#21896 <http://tracker.ceph.com/issues/21896>`_, `pr#18606 <https://github.com/ceph/ceph/pull/18606>`_, Adam C. Emerson)
-* rgw: some cleanup for sync status (`pr#20894 <https://github.com/ceph/ceph/pull/20894>`_, Enming Zhang)
-* rgw: stop/join TokenCache revoke thread only if started (`issue#21666 <http://tracker.ceph.com/issues/21666>`_, `pr#18106 <https://github.com/ceph/ceph/pull/18106>`_, Karol Mroz)
-* rgw: stream metadata full sync init (`issue#18079 <http://tracker.ceph.com/issues/18079>`_, `pr#12429 <https://github.com/ceph/ceph/pull/12429>`_, Yehuda Sadeh)
-* rgw: submodule: update Beast to ceph/ceph-master branch (`pr#19182 <https://github.com/ceph/ceph/pull/19182>`_, Casey Bodley)
-* rgw: switch beast frontend back to stackful coroutine (`issue#20048 <http://tracker.ceph.com/issues/20048>`_, `pr#20449 <https://github.com/ceph/ceph/pull/20449>`_, Casey Bodley)
-* rgw: sync tracing fixes (`issue#22833 <http://tracker.ceph.com/issues/22833>`_, `pr#20191 <https://github.com/ceph/ceph/pull/20191>`_, Yehuda Sadeh)
-* rgw: tenant fixes for dynamic resharding (`issue#22046 <http://tracker.ceph.com/issues/22046>`_, `pr#18811 <https://github.com/ceph/ceph/pull/18811>`_, Orit Wasserman)
-* rgw,tests: fix s3atests that are failing for sometime (`pr#20678 <https://github.com/ceph/ceph/pull/20678>`_, Vasu Kulkarni)
-* rgw,tests: qa: fix overrides for openssl_keys task (`pr#20981 <https://github.com/ceph/ceph/pull/20981>`_, Casey Bodley)
-* rgw,tests: qa: re enable LC tests (`pr#17020 <https://github.com/ceph/ceph/pull/17020>`_, Abhishek Lekshmanan)
-* rgw,tests: qa/rgw: add beast frontend to some rgw suites (`pr#17977 <https://github.com/ceph/ceph/pull/17977>`_, Casey Bodley)
-* rgw,tests: qa/rgw: combine swift, s3tests, ragweed into single verify task (`pr#20756 <https://github.com/ceph/ceph/pull/20756>`_, Casey Bodley)
-* rgw,tests: qa/rgw: disable log trim in multisite suite (`pr#19438 <https://github.com/ceph/ceph/pull/19438>`_, Casey Bodley)
-* rgw,tests: qa/rgw: hadoop-s3a suite targets centos_latest (`pr#17777 <https://github.com/ceph/ceph/pull/17777>`_, Casey Bodley)
-* rgw,tests: qa/rgw: ignore errors from 'pool application enable' (`issue#21715 <http://tracker.ceph.com/issues/21715>`_, `pr#18193 <https://github.com/ceph/ceph/pull/18193>`_, Casey Bodley)
-* rgw,tests: qa/rgw: remove some civetweb overrides for beast testing (`issue#23002 <http://tracker.ceph.com/issues/23002>`_, `pr#20440 <https://github.com/ceph/ceph/pull/20440>`_, Casey Bodley)
-* rgw,tests: qa/rgw: renamed ssl task to openssl_keys (`pr#20863 <https://github.com/ceph/ceph/pull/20863>`_, Ricardo Dias)
-* rgw,tests: qa/rgw: use 'ceph osd pool application enable' on created pools (`pr#17162 <https://github.com/ceph/ceph/pull/17162>`_, Casey Bodley)
-* rgw,tests: qa/rgw: verify suite tests civetweb with ssl (`pr#20444 <https://github.com/ceph/ceph/pull/20444>`_, Casey Bodley)
-* rgw,tests: qa/smoke: add rgw crypto config for s3tests (`pr#17700 <https://github.com/ceph/ceph/pull/17700>`_, Casey Bodley)
-* rgw,tests: qa/tasks/swift: add support for the "force-branch" configurable (`pr#21027 <https://github.com/ceph/ceph/pull/21027>`_, Radoslaw Zarzynski)
-* rgw,tests: rgw, qa: integrate Tempest to verify RadosGW's compliance with Swift API (`pr#16344 <https://github.com/ceph/ceph/pull/16344>`_, Radoslaw Zarzynski)
-* rgw,tests: test/rgw: fix test_encrypted_object_sync for 3+ zones (`pr#17377 <https://github.com/ceph/ceph/pull/17377>`_, Casey Bodley)
-* rgw: the metavariables in frontends-related config won't be expanded (`pr#19689 <https://github.com/ceph/ceph/pull/19689>`_, root)
-* rgw,tools: tools/rgw: add script to inspect admin socket "cr dump" (`pr#15554 <https://github.com/ceph/ceph/pull/15554>`_, Casey Bodley)
-* rgw: Torrents are not supported for objects encrypted using SSE-C (`issue#21720 <http://tracker.ceph.com/issues/21720>`_, `pr#17956 <https://github.com/ceph/ceph/pull/17956>`_, Zhang Shaowen)
-* rgw: trim all spaces inside a metadata value (`issue#23301 <http://tracker.ceph.com/issues/23301>`_, `pr#20841 <https://github.com/ceph/ceph/pull/20841>`_, Orit Wasserman)
-* rgw: udpate radosgw-admin usage with bi purge (`pr#18245 <https://github.com/ceph/ceph/pull/18245>`_, Yao Zongyou)
-* rgw: unlink deleted bucket from bucket's owner (`issue#22248 <http://tracker.ceph.com/issues/22248>`_, `pr#20017 <https://github.com/ceph/ceph/pull/20017>`_, Casey Bodley)
-* rgw: unreachable return in RGWRados::trim_bi_log_entries (`pr#17367 <https://github.com/ceph/ceph/pull/17367>`_, Amit Kumar)
-* rgw: update life cycle related log level (`pr#18845 <https://github.com/ceph/ceph/pull/18845>`_, Yao Zongyou)
-* rgw: update outdated debug func name (`pr#17440 <https://github.com/ceph/ceph/pull/17440>`_, Jiaying Ren)
-* rgw: update quota is inconsistent at add/del object with compression (`issue#22568 <http://tracker.ceph.com/issues/22568>`_, `pr#19772 <https://github.com/ceph/ceph/pull/19772>`_, fang yuxiang)
-* rgw: update the usage read iterator in truncated scenario (`issue#21196 <http://tracker.ceph.com/issues/21196>`_, `pr#17939 <https://github.com/ceph/ceph/pull/17939>`_, Mark Kogan)
-* rgw: update usage() with status (`pr#18178 <https://github.com/ceph/ceph/pull/18178>`_, Jos Collin)
-* rgw: update vstart.sh to support rgw ssl port notation : '--rgw_port 443s' (`issue#21151 <http://tracker.ceph.com/issues/21151>`_, `pr#17989 <https://github.com/ceph/ceph/pull/17989>`_, Mark Kogan)
-* rgw: upldate the max-buckets when the quota is uploaded (`pr#20063 <https://github.com/ceph/ceph/pull/20063>`_, zhaokun)
-* rgw: URL-decode S3 and Swift object-copy URLs (`issue#22121 <http://tracker.ceph.com/issues/22121>`_, `pr#19936 <https://github.com/ceph/ceph/pull/19936>`_, Matt Benjamin)
-* rgw: url_encode key name and instance in es sync module (`pr#20707 <https://github.com/ceph/ceph/pull/20707>`_, Chang Liu)
-* rgw: use explicit index pool placement (`issue#22928 <http://tracker.ceph.com/issues/22928>`_, `pr#20352 <https://github.com/ceph/ceph/pull/20352>`_, Yehuda Sadeh)
-* rgw: Use namespace for lc_pool and roles_pool (`issue#20177 <http://tracker.ceph.com/issues/20177>`_, `pr#16889 <https://github.com/ceph/ceph/pull/16889>`_, Orit Wasserman)
-* rgw: Various cleanups and options update in rgw_admin.cc (`pr#18302 <https://github.com/ceph/ceph/pull/18302>`_, Jos Collin)
-* rgw: vstart.sh: fix mstop.sh can not stop rgw (`pr#17438 <https://github.com/ceph/ceph/pull/17438>`_, Jiaying Ren)
-* rgw: 'zone placement' commands validate compression type (`issue#21775 <http://tracker.ceph.com/issues/21775>`_, `pr#18273 <https://github.com/ceph/ceph/pull/18273>`_, Casey Bodley)
-* rocksdb: sync with upstream (`issue#21603 <http://tracker.ceph.com/issues/21603>`_, `pr#18262 <https://github.com/ceph/ceph/pull/18262>`_, Kefu Chai)
-* rpm: rm macros in comments (`issue#22250 <http://tracker.ceph.com/issues/22250>`_, `pr#17070 <https://github.com/ceph/ceph/pull/17070>`_, Ken Dreyer)
-* script/build-integration-branch: check errors (`pr#17578 <https://github.com/ceph/ceph/pull/17578>`_, Sage Weil)
-* script/build-integration-branch: python3 compatible and pep8 clean (`pr#18035 <https://github.com/ceph/ceph/pull/18035>`_, Kefu Chai)
-* scripts: new backport-create-issue script (`pr#21480 <https://github.com/ceph/ceph/pull/21480>`_, Nathan Cutler)
-* selinux: Allow ceph to execute ldconfig (`pr#21974 <https://github.com/ceph/ceph/pull/21974>`_, Boris Ranto)
-* selinux: Allow getattr on lnk sysfs files (`pr#17891 <https://github.com/ceph/ceph/pull/17891>`_, Boris Ranto)
-* spdk: advance to upstream dc82989d (`pr#20713 <https://github.com/ceph/ceph/pull/20713>`_, Nathan Cutler)
-* src: fix various log messages (`pr#21112 <https://github.com/ceph/ceph/pull/21112>`_, Gu Zhongyan)
-* src/msg/rdma: fixes failure on assert in notify() (`pr#17007 <https://github.com/ceph/ceph/pull/17007>`_, Alex Mikheev)
-* suites/cephmetrics: Add Centos 7 (`pr#18594 <https://github.com/ceph/ceph/pull/18594>`_, Zack Cerza)
-* test: assert check for negative returns (`pr#17296 <https://github.com/ceph/ceph/pull/17296>`_, Amit Kumar)
-* test/fio: generate db histogram to help debug rocksdb performance (`pr#16808 <https://github.com/ceph/ceph/pull/16808>`_, Pan Liu, Xiaoyan Li)
-* test: fix bash path in shebangs (part 2) (`pr#17955 <https://github.com/ceph/ceph/pull/17955>`_, Alan Somers)
-* test: fix CLI unit formatting tests (`pr#22260 <https://github.com/ceph/ceph/pull/22260>`_, Jason Dillaman)
-* test: Incorrect conversion to double (`pr#18963 <https://github.com/ceph/ceph/pull/18963>`_, Amit Kumar)
-* test/librados: reorder ASSERT_EQ() arguments (`pr#16625 <https://github.com/ceph/ceph/pull/16625>`_, Yan Jun)
-* test,osd,kvstore_tool: silence warnings and prepare test buffer in the right way (`pr#18406 <https://github.com/ceph/ceph/pull/18406>`_, Adam C. Emerson)
-* tests: bluestore/fio: Fixed problem with all objects having the same hash (`pr#17770 <https://github.com/ceph/ceph/pull/17770>`_, Adam Kupczyk)
-* tests: CentOS 7.4 is now the latest (`pr#17776 <https://github.com/ceph/ceph/pull/17776>`_, Nathan Cutler)
-* tests - ceph-ansible vars additions (`issue#21822 <http://tracker.ceph.com/issues/21822>`_, `pr#18378 <https://github.com/ceph/ceph/pull/18378>`_, Yuri Weinstein)
-* tests: ceph-disk: ignore E722 in flake8 test (`issue#22207 <http://tracker.ceph.com/issues/22207>`_, `pr#19072 <https://github.com/ceph/ceph/pull/19072>`_, Nathan Cutler)
-* tests: ceph-disk: mock get fsid (`pr#19254 <https://github.com/ceph/ceph/pull/19254>`_, Kefu Chai)
-* tests: ceph-disk: Remove sitepackages=True (`issue#22823 <http://tracker.ceph.com/issues/22823>`_, `pr#20151 <https://github.com/ceph/ceph/pull/20151>`_, Brad Hubbard)
-* tests: ceph-objectstore-tool: don't destroy SnapMapper until the txn is completed (`issue#23121 <http://tracker.ceph.com/issues/23121>`_, `pr#20593 <https://github.com/ceph/ceph/pull/20593>`_, Kefu Chai)
-* tests: Changes required for teuthology's systemd support (`pr#18380 <https://github.com/ceph/ceph/pull/18380>`_, Zack Cerza)
-* tests: Check for empty output in test_dump_pgstate_history (`pr#20838 <https://github.com/ceph/ceph/pull/20838>`_, Brad Hubbard)
-* tests: cleanup: drop calamari tasks (`pr#17531 <https://github.com/ceph/ceph/pull/17531>`_, Nathan Cutler)
-* tests: cleanup: drop upgrade/jewel-x/point-to-point-x (`issue#22888 <http://tracker.ceph.com/issues/22888>`_, `pr#20245 <https://github.com/ceph/ceph/pull/20245>`_, Nathan Cutler)
-* tests: cmake,test/mgr: restructure dashboard tests and cmake related fixes (`pr#20768 <https://github.com/ceph/ceph/pull/20768>`_, Kefu Chai)
-* tests: common/obj_bencher: set {min,max}_iops if runtime < 1 sec (`pr#17182 <https://github.com/ceph/ceph/pull/17182>`_, Kefu Chai)
-* tests: c_read_operations.cc: Silence tautological-compare compiler warning (`pr#19953 <https://github.com/ceph/ceph/pull/19953>`_, Brad Hubbard)
-* tests: fix uninitialized value found by coverity scan (`pr#17895 <https://github.com/ceph/ceph/pull/17895>`_, J. Eric Ivancich)
-* tests: Increase sleep in test_pidfile.sh (`pr#17052 <https://github.com/ceph/ceph/pull/17052>`_, David Zafman)
-* tests: librgw_file: remove unused `using` statement (`pr#17085 <https://github.com/ceph/ceph/pull/17085>`_, Yao Zongyou)
-* tests: mark_unfound_lost fix and some other minor changes (`issue#21907 <http://tracker.ceph.com/issues/21907>`_, `pr#18449 <https://github.com/ceph/ceph/pull/18449>`_, David Zafman)
-* tests: mgr/dashboard: Allow sourcing `run-backend-api-tests.sh` (`pr#20874 <https://github.com/ceph/ceph/pull/20874>`_, Sebastian Wagner)
-* tests:  mgr/dashboard: create venv for running tox (`pr#21490 <https://github.com/ceph/ceph/pull/21490>`_, Kefu Chai)
-* tests: mgr/dashboard: notification queue: fix priority tests (`pr#21147 <https://github.com/ceph/ceph/pull/21147>`_, Ricardo Dias)
-* tests: mimic: qa: fix test on "ceph fs set cephfs allow_new_snaps" (`pr#21830 <https://github.com/ceph/ceph/pull/21830>`_, Kefu Chai)
-* tests: mimic: qa/workunits/rados/test_envlibrados_for_rocksdb: install g++ not g++-4.7 (`pr#22117 <https://github.com/ceph/ceph/pull/22117>`_, Kefu Chai)
-* tests: mimic: test: Need to escape parens in log-whitelist for grep (`pr#22075 <https://github.com/ceph/ceph/pull/22075>`_, David Zafman)
-* tests: mimic: test: wait_for_pg_stats() should do another check after last 13 secon… (`pr#22199 <https://github.com/ceph/ceph/pull/22199>`_, David Zafman)
-* tests: misc: Fix bash path in shebangs (`pr#16494 <https://github.com/ceph/ceph/pull/16494>`_, Alan Somers)
-* tests: mstart.sh: remove bashizm in /bin/sh script (`pr#18541 <https://github.com/ceph/ceph/pull/18541>`_, Mykola Golub)
-* tests: point-to-point-x: upgrade client.1 to -x along with cluster nodes (`issue#21499 <http://tracker.ceph.com/issues/21499>`_, `pr#17910 <https://github.com/ceph/ceph/pull/17910>`_, Nathan Cutler)
-* tests: qa: add cbt task for performance testing (`pr#17583 <https://github.com/ceph/ceph/pull/17583>`_, Neha Ojha)
-* tests: qa: add cosbench workloads and override teuthology default settings (`pr#21710 <https://github.com/ceph/ceph/pull/21710>`_, Neha Ojha)
-* tests/qa: Adding $ distro mix - rgw (`pr#22070 <https://github.com/ceph/ceph/pull/22070>`_, Yuri Weinstein)
-* tests/qa: adding rados/.. dirs (`pr#22068 <https://github.com/ceph/ceph/pull/22068>`_, Yuri Weinstein)
-* tests: qa: add "restful" to ceph_mgr_modules in ceph-ansible suite (`pr#18634 <https://github.com/ceph/ceph/pull/18634>`_, Kefu Chai)
-* tests: qa: add simple and dirty script to find ports being used (`pr#19102 <https://github.com/ceph/ceph/pull/19102>`_, Joao Eduardo Luis)
-* tests: qa: big: add openstack.yaml (`pr#16864 <https://github.com/ceph/ceph/pull/16864>`_, Nathan Cutler)
-* tests: qa: clean up dnsmasq task and fix EPERM error (`pr#20680 <https://github.com/ceph/ceph/pull/20680>`_, Casey Bodley)
-* tests: qa: create_cache_pool no longer runs 'pool application enable' (`issue#21155 <http://tracker.ceph.com/issues/21155>`_, `pr#17312 <https://github.com/ceph/ceph/pull/17312>`_, Casey Bodley)
-* tests: qa: decrease the msg_inject_socket_failures from 1/500 to 1/1000 (`issue#22093 <http://tracker.ceph.com/issues/22093>`_, `pr#19542 <https://github.com/ceph/ceph/pull/19542>`_, Kefu Chai)
-* tests: qa: disable mon-health-to-clog in upgrade test (`pr#19233 <https://github.com/ceph/ceph/pull/19233>`_, Kefu Chai)
-* tests: qa: disable -Werror when compiling env_librados_test (`pr#21433 <https://github.com/ceph/ceph/pull/21433>`_, Kefu Chai)
-* tests: qa: do not "ceph fs get cephfs" w/o a cephfs fs (`pr#18533 <https://github.com/ceph/ceph/pull/18533>`_, Kefu Chai)
-* tests: qa: do not wait for down/out osd for pg convergence (`pr#18808 <https://github.com/ceph/ceph/pull/18808>`_, Kefu Chai)
-* tests/qa - enabled `ceph-deploy` runs on `mira` nodes (`pr#21253 <https://github.com/ceph/ceph/pull/21253>`_, Yuri Weinstein)
-* tests: qa: fix pool-quota related tests (`issue#21409 <http://tracker.ceph.com/issues/21409>`_, `pr#17763 <https://github.com/ceph/ceph/pull/17763>`_, xie xingguo)
-* tests: qa: Fix shebangs on openstack scripts (`pr#16546 <https://github.com/ceph/ceph/pull/16546>`_, Alan Somers)
-* tests: qa: reduce "mon client hunt interval max multiple" to 2 for all clients (`pr#21658 <https://github.com/ceph/ceph/pull/21658>`_, Kefu Chai)
-* tests:  qa: reduce mon-client-hunt-interval-max-multiple to 2 (`pr#18283 <https://github.com/ceph/ceph/pull/18283>`_, Kefu Chai)
-* tests: qa: revert "qa: use config_path property instead of literal" (`pr#17850 <https://github.com/ceph/ceph/pull/17850>`_, Patrick Donnelly)
-* tests: qa/run-standalone.sh: set PYTHONPATH for FreeBSD also (`pr#20646 <https://github.com/ceph/ceph/pull/20646>`_, Kefu Chai)
-* tests: qa: s/backfill/backfilling/ (`pr#18235 <https://github.com/ceph/ceph/pull/18235>`_, Kefu Chai)
-* tests: qa/stanalone: pass options using --<option-name>=<value> (`pr#19544 <https://github.com/ceph/ceph/pull/19544>`_, Kefu Chai)
-* tests: qa/standalone: Add trap for signals to restore the kernel core pattern (`pr#17026 <https://github.com/ceph/ceph/pull/17026>`_, David Zafman)
-* tests: qa/standalone/ceph-helpers.sh: provide argument to dirname (`issue#23805 <http://tracker.ceph.com/issues/23805>`_, `pr#21552 <https://github.com/ceph/ceph/pull/21552>`_, Nathan Cutler)
-* tests: qa/standalone/ceph-helpers.sh: silence ceph-disk DEPRECATION_WARNING (`pr#19478 <https://github.com/ceph/ceph/pull/19478>`_, Kefu Chai)
-* tests: qa/standalone: extract delete_pool() (`pr#20634 <https://github.com/ceph/ceph/pull/20634>`_, Kefu Chai)
-* tests: qa/standalone: misc fixes (`issue#20465 <http://tracker.ceph.com/issues/20465>`_, `issue#20921 <http://tracker.ceph.com/issues/20921>`_, `pr#16709 <https://github.com/ceph/ceph/pull/16709>`_, David Zafman)
-* tests: qa/standalone/mon/misc.sh: Add osdmap-prune tests (`issue#23621 <http://tracker.ceph.com/issues/23621>`_, `pr#21318 <https://github.com/ceph/ceph/pull/21318>`_, Brad Hubbard)
-* tests: qa/standalone/osd/osd-mark-down: create pool to get updated osdmap faster (`pr#18191 <https://github.com/ceph/ceph/pull/18191>`_, huangjun)
-* tests: qa/standalone: remove osd-map-max-advance related tests (`issue#22596 <http://tracker.ceph.com/issues/22596>`_, `pr#19816 <https://github.com/ceph/ceph/pull/19816>`_, Kefu Chai)
-* tests: qa/standalone: respect $TEMPDIR (`pr#17747 <https://github.com/ceph/ceph/pull/17747>`_, Kefu Chai)
-* tests: qa/standalone/scrub/osd-scrub-repair.sh: add extents flag into object_info_t (`issue#21618 <http://tracker.ceph.com/issues/21618>`_, `pr#18094 <https://github.com/ceph/ceph/pull/18094>`_, xie xingguo)
-* tests: qa/standalone/scrub/osd-scrub-repair.sh: drop omap_digest flag (`pr#18150 <https://github.com/ceph/ceph/pull/18150>`_, xie xingguo, Sage Weil)
-* tests: qa/standalone: s/delete_erasure_pool/delete_erasure_coded_pool/ (`pr#20667 <https://github.com/ceph/ceph/pull/20667>`_, Kefu Chai)
-* tests: qa: stop testing deprecated "ceph osd create" (`issue#21993 <http://tracker.ceph.com/issues/21993>`_, `pr#18659 <https://github.com/ceph/ceph/pull/18659>`_, Kefu Chai)
-* tests: qa/suites: add minimal performance suite (`pr#21104 <https://github.com/ceph/ceph/pull/21104>`_, Neha Ojha)
-* tests: qa/suites/cephmetrics: Updates for new version (`pr#21146 <https://github.com/ceph/ceph/pull/21146>`_, Zack Cerza)
-* tests: qa/suites: change fixed-2.yaml users to get 4 openstack disks (`pr#16873 <https://github.com/ceph/ceph/pull/16873>`_, Sage Weil)
-* tests: qa/suites: mds.0 -> mds.a (`pr#20848 <https://github.com/ceph/ceph/pull/20848>`_, Sage Weil)
-* tests: qa/suites/rados: Disable scrub backoff (`issue#23578 <http://tracker.ceph.com/issues/23578>`_, `pr#21295 <https://github.com/ceph/ceph/pull/21295>`_, Brad Hubbard)
-* tests: qa/suites/rados/mgr/tasks/dashboard: add MDS_ALL_DOWN to whitelist (`pr#21549 <https://github.com/ceph/ceph/pull/21549>`_, Ricardo Dias)
-* tests: qa/suites/rados/mgr/tasks/dashboard_v2: add fail_on_skip = false (`pr#20925 <https://github.com/ceph/ceph/pull/20925>`_, Ricardo Dias)
-* tests: qa/suites/rados/multimon: whitelist mgr down vs clock skew test (`pr#16996 <https://github.com/ceph/ceph/pull/16996>`_, Sage Weil)
-* tests: qa/suites/rados/singleton: more whitelist (`pr#19225 <https://github.com/ceph/ceph/pull/19225>`_, Kefu Chai)
-* tests: qa/suites/rados/thrash-old-clients: ms_type=simple (`issue#23922 <http://tracker.ceph.com/issues/23922>`_, `pr#21739 <https://github.com/ceph/ceph/pull/21739>`_, Kefu Chai)
-* tests: qa/suites/rados/upgrade/jewel-x-singleton: tolerate sloppy past_intervals (`pr#17293 <https://github.com/ceph/ceph/pull/17293>`_, Kefu Chai)
-* tests: qa/suites/rest/basic/tasks/rest_test: more whitelisting (`issue#21425 <http://tracker.ceph.com/issues/21425>`_, `pr#17794 <https://github.com/ceph/ceph/pull/17794>`_, huangjun)
-* tests: qa/suites/rest/basic/tasks/rest_test: whiltelist OSD_DOWN (`issue#21425 <http://tracker.ceph.com/issues/21425>`_, `pr#18144 <https://github.com/ceph/ceph/pull/18144>`_, huangjun)
-* tests: qa/suites/upgarde/jewel-x/parallel: tolerate mgr warning (`pr#17203 <https://github.com/ceph/ceph/pull/17203>`_, Sage Weil)
-* tests: qa/suites/upgarde/jewel-x/point-to-point-x: disable app warnings (`pr#16947 <https://github.com/ceph/ceph/pull/16947>`_, Sage Weil)
-* tests: qa/suites: whitelist SLOW_OPS (`issue#23495 <http://tracker.ceph.com/issues/23495>`_, `pr#21324 <https://github.com/ceph/ceph/pull/21324>`_, Kefu Chai)
-* tests: qa/tasks: Add default timeout for wait for pg clean task (`pr#21313 <https://github.com/ceph/ceph/pull/21313>`_, Vasu Kulkarni)
-* tests: qa/tasks/ceph_deploy: gatherkeys before mgr deploy (`pr#17224 <https://github.com/ceph/ceph/pull/17224>`_, Sage Weil)
-* tests:  qa/tasks/ceph_manager: use set_config on revived osd (`pr#20901 <https://github.com/ceph/ceph/pull/20901>`_, Neha Ojha)
-* tests: qa/tasks/mgr/dashboard: Fix login expires too soon (`pr#21021 <https://github.com/ceph/ceph/pull/21021>`_, Sebastian Wagner)
-* tests: qa/tasks: prolong revive_osd() timeout to 6 min (`issue#21474 <http://tracker.ceph.com/issues/21474>`_, `pr#17902 <https://github.com/ceph/ceph/pull/17902>`_, Kefu Chai)
-* tests: qa/tasks: prolong revive_osd() timeout to 6 min (`issue#21474 <http://tracker.ceph.com/issues/21474>`_, `pr#19024 <https://github.com/ceph/ceph/pull/19024>`_, Kefu Chai)
-* tests: qa/tasks: run cosbench using the CBT task (`pr#21656 <https://github.com/ceph/ceph/pull/21656>`_, Neha Ojha)
-* tests: qa/tasks: update ceph-deploy task to use newer ceph-volume syntax (`pr#19244 <https://github.com/ceph/ceph/pull/19244>`_, Vasu Kulkarni)
-* tests: qa/tests: Add additional required ceph-ansible vars due to upstream changes (`pr#17757 <https://github.com/ceph/ceph/pull/17757>`_, Vasu Kulkarni)
-* tests: qa/tests: add ceph-deploy upgrade tests (`issue#20950 <http://tracker.ceph.com/issues/20950>`_, `pr#16826 <https://github.com/ceph/ceph/pull/16826>`_, Vasu Kulkarni)
-* tests: qa/tests: add openstack volume info + lvs for ceph-volume (`pr#20243 <https://github.com/ceph/ceph/pull/20243>`_, Vasu Kulkarni)
-* tests: qa/tests: Fix get_system_type failure due to invalid remote name (`pr#17650 <https://github.com/ceph/ceph/pull/17650>`_, Vasu Kulkarni)
-* tests: qa/tests: fix rbd pool creation for systemd tests (`pr#17536 <https://github.com/ceph/ceph/pull/17536>`_, Vasu Kulkarni)
-* tests: [qa/tests]: misc ceph-ansible fixes and udpate (`pr#17096 <https://github.com/ceph/ceph/pull/17096>`_, Vasu Kulkarni)
-* tests: qa/tests/rados: Remove unsupported 2-size-1-min-size config (`pr#17576 <https://github.com/ceph/ceph/pull/17576>`_, Vasu Kulkarni)
-* tests: qa/tests: use ceph-deploy stable branch for single node tests (`pr#20979 <https://github.com/ceph/ceph/pull/20979>`_, Vasu Kulkarni)
-* tests: qa/tests: Various whitelists for smoke suite (`issue#21376 <http://tracker.ceph.com/issues/21376>`_, `pr#17680 <https://github.com/ceph/ceph/pull/17680>`_, Vasu Kulkarni)
-* tests: qa/tests: Wip ceph deploy upgrade (`pr#17651 <https://github.com/ceph/ceph/pull/17651>`_, Vasu Kulkarni)
-* tests: qa/workunits/rados/test_large_omap_detection: Scrub pgs instead of OSDs (`pr#21410 <https://github.com/ceph/ceph/pull/21410>`_, Brad Hubbard)
-* tests: qa/workunits: silence py warnings for ceph-disk tests (`issue#22154 <http://tracker.ceph.com/issues/22154>`_, `pr#19075 <https://github.com/ceph/ceph/pull/19075>`_, Kefu Chai)
-* tests: rados: Copy payload in ceph_perf_msgr_client (`issue#22100 <http://tracker.ceph.com/issues/22100>`_, `pr#18862 <https://github.com/ceph/ceph/pull/18862>`_, Jeegn Chen)
-* tests: rados: Intializing members class StriperTest (`pr#16843 <https://github.com/ceph/ceph/pull/16843>`_, amitkuma)
-* tests: remove TestPGLog ASSERT_DEATH test (`issue#23504 <http://tracker.ceph.com/issues/23504>`_, `pr#21117 <https://github.com/ceph/ceph/pull/21117>`_, Nathan Cutler)
-* tests: run-standalone.sh improve error message (`pr#17093 <https://github.com/ceph/ceph/pull/17093>`_, David Zafman)
-* tests: run-standalone.sh skip core_pattern if already set (`pr#17098 <https://github.com/ceph/ceph/pull/17098>`_, David Zafman)
-* tests: test/admin_socket_output: add --vstart=path/to/asok option (`pr#20371 <https://github.com/ceph/ceph/pull/20371>`_, Kefu Chai)
-* tests: test/admin_socket_output: better error reporting (`pr#20409 <https://github.com/ceph/ceph/pull/20409>`_, Brad Hubbard)
-* tests: test/admin_socket_output: switch to std::experimental::filesystem (`pr#20307 <https://github.com/ceph/ceph/pull/20307>`_, Kefu Chai)
-* tests: test/ceph_test_objectstore: make settings update and restore less error prone (`pr#21145 <https://github.com/ceph/ceph/pull/21145>`_, Igor Fedotov)
-* tests: test: checking negative returns from creat() (`pr#18090 <https://github.com/ceph/ceph/pull/18090>`_, amitkuma)
-* tests: test/CMakeLists: disable test_pidfile.sh (`issue#20975 <http://tracker.ceph.com/issues/20975>`_, `pr#16977 <https://github.com/ceph/ceph/pull/16977>`_, Sage Weil)
-* tests: test/CMakeLists: disable test-pidfile.sh (`pr#17401 <https://github.com/ceph/ceph/pull/17401>`_, Sage Weil)
-* tests: test/coredumpctl: support freebsd (`pr#17447 <https://github.com/ceph/ceph/pull/17447>`_, Kefu Chai)
-* tests: test/dashboard: hardcode .coverage path to workaround tox bugs (`pr#21485 <https://github.com/ceph/ceph/pull/21485>`_, Kefu Chai)
-* tests: test/dashboard: specify workdir using tox.ini (`issue#23709 <http://tracker.ceph.com/issues/23709>`_, `pr#21416 <https://github.com/ceph/ceph/pull/21416>`_, Kefu Chai)
-* tests: test: Don't dump core when using EXPECT_DEATH (`pr#17390 <https://github.com/ceph/ceph/pull/17390>`_, Kefu Chai)
-* tests: test/fio: extend fio objectstore plugin to better simulate OSD behavior (`pr#19101 <https://github.com/ceph/ceph/pull/19101>`_, Igor Fedotov)
-* tests: test/fio: fix building of the fio_ceph_objectstore plugin (`pr#18332 <https://github.com/ceph/ceph/pull/18332>`_, Radoslaw Zarzynski)
-* tests: test: Fix and enable test_pidfile.sh (`issue#20770 <http://tracker.ceph.com/issues/20770>`_, `pr#16987 <https://github.com/ceph/ceph/pull/16987>`_, David Zafman)
-* tests: test: Fix ceph-objectstore-tool usage check (`pr#17785 <https://github.com/ceph/ceph/pull/17785>`_, David Zafman)
-* tests: test: fix misc fiemap testing (`issue#21716 <http://tracker.ceph.com/issues/21716>`_, `pr#18240 <https://github.com/ceph/ceph/pull/18240>`_, Kefu Chai, Ning Yao)
-* tests: test: Initialization of \*comp_racing_read class CopyFromOp (`pr#17369 <https://github.com/ceph/ceph/pull/17369>`_, Amit Kumar)
-* tests: test: Initializing ChunkReadOp members (`pr#19334 <https://github.com/ceph/ceph/pull/19334>`_, amitkuma)
-* tests: test/journal: Initialize member variable m_work_queue (`pr#17089 <https://github.com/ceph/ceph/pull/17089>`_, amitkuma)
-* tests: test/librados: be more tolerant with timed lock tests (`issue#20086 <http://tracker.ceph.com/issues/20086>`_, `pr#20161 <https://github.com/ceph/ceph/pull/20161>`_, Kefu Chai)
-* tests: test/librados: increase pgp_num along with pg_num (`issue#23763 <http://tracker.ceph.com/issues/23763>`_, `pr#21555 <https://github.com/ceph/ceph/pull/21555>`_, Kefu Chai)
-* tests: test/librados: s/invoke_result_t/result_of_t/ (`pr#20379 <https://github.com/ceph/ceph/pull/20379>`_, Kefu Chai)
-* tests: test/librados_test_stub: pass snap context to zero op (`pr#17186 <https://github.com/ceph/ceph/pull/17186>`_, Mykola Golub)
-* tests: test/log: fix for crash with libc++ (`pr#20233 <https://github.com/ceph/ceph/pull/20233>`_, Casey Bodley)
-* tests: test: Make clearer by moving code out of loop (`pr#20759 <https://github.com/ceph/ceph/pull/20759>`_, David Zafman)
-* tests: test/objectstore/test_bluefs: cleanups (`pr#17909 <https://github.com/ceph/ceph/pull/17909>`_, Kefu Chai)
-* tests: test: only test dashboard_v2 when it is enabled (`pr#20777 <https://github.com/ceph/ceph/pull/20777>`_, Willem Jan Withagen)
-* tests: test: only test enabled python bindings (`pr#21293 <https://github.com/ceph/ceph/pull/21293>`_, Kefu Chai)
-* tests: test/osd: initialize Non-static class members in WeightedTestGenerator (`pr#15922 <https://github.com/ceph/ceph/pull/15922>`_, Jos Collin)
-* tests: test/osd: Non-static class members not initialized in UnsetRedirectOp (`pr#15921 <https://github.com/ceph/ceph/pull/15921>`_, Jos Collin)
-* tests: test/osd: silence warnings from -Wsign-compare (`pr#17027 <https://github.com/ceph/ceph/pull/17027>`_, Jos Collin)
-* tests: test: put new BlueStore tests un ifdef WITH_BLUESTORE (`pr#20576 <https://github.com/ceph/ceph/pull/20576>`_, Willem Jan Withagen)
-* tests: test:qa:infra - Run update daily and use bash (`pr#21218 <https://github.com/ceph/ceph/pull/21218>`_, David Galloway)
-* tests: test:qa:infra - teuthology crontab items as of 3/27/18 (`pr#21075 <https://github.com/ceph/ceph/pull/21075>`_, Yuri Weinstein)
-* tests: test: reduce the chance to have degraded PGs (`issue#22711 <http://tracker.ceph.com/issues/22711>`_, `pr#20046 <https://github.com/ceph/ceph/pull/20046>`_, Kefu Chai)
-* tests: test: remove distro_version assert in distro detect test (`pr#21052 <https://github.com/ceph/ceph/pull/21052>`_, Shengjing Zhu)
-* tests: test: Replace bc command with printf command (`pr#21013 <https://github.com/ceph/ceph/pull/21013>`_, David Zafman)
-* tests: test: silence warning from -Wsign-compare (`pr#17790 <https://github.com/ceph/ceph/pull/17790>`_, Jos Collin)
-* tests: test: silence warnings from -Wsign-compare (`pr#17962 <https://github.com/ceph/ceph/pull/17962>`_, Jos Collin)
-* tests: tests - Replaced requests for "centos 7.3" to centos_latest (`pr#19262 <https://github.com/ceph/ceph/pull/19262>`_, Yuri Weinstein)
-* tests: test/store_test: fix FTBFS as Sequencer is removed (`pr#20382 <https://github.com/ceph/ceph/pull/20382>`_, Kefu Chai)
-* tests: test/store_test: update Many4KWritesTest\* test cases to finalize with… (`pr#20230 <https://github.com/ceph/ceph/pull/20230>`_, Igor Fedotov)
-* tests: test/throttle: kill tests exercising dtor of Throttle classes (`pr#17442 <https://github.com/ceph/ceph/pull/17442>`_, Kefu Chai)
-* tests: test/unittest_bufferlist: check retvals of syscalls (`pr#18238 <https://github.com/ceph/ceph/pull/18238>`_, Kefu Chai)
-* tests: test/unittest_pg_log: silence gcc warning (`pr#17328 <https://github.com/ceph/ceph/pull/17328>`_, Kefu Chai)
-* tests: test: Use jq in a compatible way and for easier diff analysis (`pr#21450 <https://github.com/ceph/ceph/pull/21450>`_, David Zafman)
-* tests: test: Whitelist corrections (`pr#22167 <https://github.com/ceph/ceph/pull/22167>`_, David Zafman)
-* tests,tools: crushtool: print error message to stderr not dout(1) (`issue#21758 <http://tracker.ceph.com/issues/21758>`_, `pr#18242 <https://github.com/ceph/ceph/pull/18242>`_, Kefu Chai)
-* tests: unittest_crypto: Don't exceed limit for getentropy (`pr#18505 <https://github.com/ceph/ceph/pull/18505>`_, Brad Hubbard)
-* tests: vstart: fix initial start when there is no ceph.conf (`pr#21019 <https://github.com/ceph/ceph/pull/21019>`_, Jianpeng Ma)
-* The Day Has Come! (`pr#19657 <https://github.com/ceph/ceph/pull/19657>`_, Adam C. Emerson)
-* tools: Align use of uint64_t in service_daemon::AttributeType (`pr#16938 <https://github.com/ceph/ceph/pull/16938>`_, James Page)
-* tools: ceph-disk: erase 110MB for nuking existing bluestore (`issue#22354 <http://tracker.ceph.com/issues/22354>`_, `pr#20400 <https://github.com/ceph/ceph/pull/20400>`_, Kefu Chai)
-* tools: ceph-disk: fix '--runtime' omission for ceph-osd service (`issue#21498 <http://tracker.ceph.com/issues/21498>`_, `pr#17904 <https://github.com/ceph/ceph/pull/17904>`_, Carl Xiong)
-* tools: ceph-disk: fix signed integer is greater than maximum when call major (`pr#19196 <https://github.com/ceph/ceph/pull/19196>`_, Song Shun)
-* tools: ceph-disk: include output of failed command in exception (`pr#20497 <https://github.com/ceph/ceph/pull/20497>`_, Kefu Chai)
-* tools: ceph-disk: more precise error message when a disk is specified (`pr#18018 <https://github.com/ceph/ceph/pull/18018>`_, Kefu Chai)
-* tools: ceph-disk: reduce the scope of activate_lock (`pr#20114 <https://github.com/ceph/ceph/pull/20114>`_, zhaokun)
-* tools: ceph-disk: retry on OSError (`issue#21728 <http://tracker.ceph.com/issues/21728>`_, `pr#18162 <https://github.com/ceph/ceph/pull/18162>`_, Kefu Chai)
-* tools: ceph-disk: unlock all partitions when activate (`pr#17363 <https://github.com/ceph/ceph/pull/17363>`_, Kefu Chai)
-* tools: ceph-disk: write log to /var/log/ceph not to /var/run/ceph (`pr#18375 <https://github.com/ceph/ceph/pull/18375>`_, Kefu Chai)
-* tools: ceph: fixes for "tell <service>.\*" command (`issue#21230 <http://tracker.ceph.com/issues/21230>`_, `pr#17463 <https://github.com/ceph/ceph/pull/17463>`_, Kefu Chai)
-* tools: ceph-kvstore-tool: make it a bit more friendly (`pr#21477 <https://github.com/ceph/ceph/pull/21477>`_, Sage Weil)
-* tools: ceph-kvstore-tool: use unique_ptr<> to manage the lifecycle of bluestore (`pr#18221 <https://github.com/ceph/ceph/pull/18221>`_, Kefu Chai)
-* tools: ceph-objectstore-tool: Add option "dump-import" to examine an export (`issue#22086 <http://tracker.ceph.com/issues/22086>`_, `pr#19368 <https://github.com/ceph/ceph/pull/19368>`_, David Zafman)
-* tools: ceph-objectstore-tool: Fix set-size to clear data_digest if changing … (`pr#18885 <https://github.com/ceph/ceph/pull/18885>`_, David Zafman)
-* tools: ceph-objectstore-tool: "$OBJ get-omaphdr" and "$OBJ list-omap" scan all pgs instead of using specific pg (`issue#21327 <http://tracker.ceph.com/issues/21327>`_, `pr#17985 <https://github.com/ceph/ceph/pull/17985>`_, David Zafman)
-* tools: ceph-objectstore-tool: skip object with generated version (`pr#18507 <https://github.com/ceph/ceph/pull/18507>`_, huangjun)
-* tools: ceph-syn: silence clang analyzer warning (`pr#18577 <https://github.com/ceph/ceph/pull/18577>`_, Kefu Chai)
-* tools: ceph-volume: Use a delimited CLI output parser instead of JSON (`pr#17097 <https://github.com/ceph/ceph/pull/17097>`_, Alfredo Deza)
-* tools: cleanup: rip out ceph-rest-api (`issue#21264 <http://tracker.ceph.com/issues/21264>`_, `issue#22457 <http://tracker.ceph.com/issues/22457>`_, `pr#17530 <https://github.com/ceph/ceph/pull/17530>`_, Nathan Cutler)
-* tools: correct total size formatting (`pr#21641 <https://github.com/ceph/ceph/pull/21641>`_, Zheng Yin)
-* tools: crushtool: add --add-bucket and --move options (`pr#20183 <https://github.com/ceph/ceph/pull/20183>`_, Kefu Chai)
-* tools: FreeBSD basic getopt does not use --options (`pr#21148 <https://github.com/ceph/ceph/pull/21148>`_, Willem Jan Withagen)
-* tools: Initialization of \*server, command variables (`pr#17135 <https://github.com/ceph/ceph/pull/17135>`_, amitkuma)
-* tools: make rados get/put/append command help txt clear (`issue#22958 <http://tracker.ceph.com/issues/22958>`_, `pr#20363 <https://github.com/ceph/ceph/pull/20363>`_, lvshuhua)
-* tools: Modify "rados df" header's alignment (`pr#17549 <https://github.com/ceph/ceph/pull/17549>`_, iliul)
-* tools: rados add a cli option to clear omap keys (`issue#22255 <http://tracker.ceph.com/issues/22255>`_, `pr#19180 <https://github.com/ceph/ceph/pull/19180>`_, Abhishek Lekshmanan)
-* tools: rados/tool: fixup rados stat command hint (`pr#16983 <https://github.com/ceph/ceph/pull/16983>`_, huanwen ren)
-* tools: script: build-integration-branch: avoid Unicode error (`issue#24003 <http://tracker.ceph.com/issues/24003>`_, `pr#21918 <https://github.com/ceph/ceph/pull/21918>`_, Nathan Cutler)
-* tools: script: ceph-release-notes: minor fixes for split_component (`pr#16605 <https://github.com/ceph/ceph/pull/16605>`_, Abhishek Lekshmanan)
-* tools: Special scrub handling of hinfo_key errors (`issue#23428 <http://tracker.ceph.com/issues/23428>`_, `issue#23364 <http://tracker.ceph.com/issues/23364>`_, `pr#20947 <https://github.com/ceph/ceph/pull/20947>`_, David Zafman)
-* tools: src/vstart.sh: default os to filestore for FreeBSD (`pr#17454 <https://github.com/ceph/ceph/pull/17454>`_, xie xingguo)
-* tools: stop.sh: add ceph configure file location (`pr#20888 <https://github.com/ceph/ceph/pull/20888>`_, Jianpeng Ma)
-* tools: tools/ceph-conf: dump parsed config in plain text or as json (`issue#21862 <http://tracker.ceph.com/issues/21862>`_, `pr#18350 <https://github.com/ceph/ceph/pull/18350>`_, Piotr Dałek)
-* tools: tools/ceph_monstore_tool: include mgrmap in initial paxos epoch (`issue#22266 <http://tracker.ceph.com/issues/22266>`_, `pr#19780 <https://github.com/ceph/ceph/pull/19780>`_, Kefu Chai)
-* tools: tools/ceph_monstore_tool: rebuild initial mgrmap also (`issue#22266 <http://tracker.ceph.com/issues/22266>`_, `pr#19238 <https://github.com/ceph/ceph/pull/19238>`_, Kefu Chai)
-* tools: tools/ceph-objectstore-tool: command to trim the pg log (`issue#23242 <http://tracker.ceph.com/issues/23242>`_, `pr#20786 <https://github.com/ceph/ceph/pull/20786>`_, Josh Durgin, David Zafman)
-* tools: tools/ceph_objectstore_tool: fix 'dup' unable to duplicate meta PG (`pr#17572 <https://github.com/ceph/ceph/pull/17572>`_, xie xingguo)
-* tools: tools/rados: improve the ls command usage (`pr#21553 <https://github.com/ceph/ceph/pull/21553>`_, Li Wang)
-* tools:  tools: rados: make -f be --format for consistency with ceph tool (`issue#15904 <http://tracker.ceph.com/issues/15904>`_, `pr#20147 <https://github.com/ceph/ceph/pull/20147>`_, Nathan Cutler)
-* tools: tools/rados: use the monotonic clock in rados bench (`issue#21375 <http://tracker.ceph.com/issues/21375>`_, `pr#18588 <https://github.com/ceph/ceph/pull/18588>`_, Mohamad Gebai)
-* tools: update monstore tool for fsmap, mgrmap (`issue#21577 <http://tracker.ceph.com/issues/21577>`_, `pr#18005 <https://github.com/ceph/ceph/pull/18005>`_, John Spray)
-* tools: Use --no-mon-config so ceph_objectstore_tool.py test doesn't hang (`pr#21274 <https://github.com/ceph/ceph/pull/21274>`_, David Zafman)
-* tools: vstart.sh: move rgw configuration to client.rgw section (`pr#18331 <https://github.com/ceph/ceph/pull/18331>`_, Yan Jun)
-* tools: vstart.sh: use bluestore as default osd objectstore backend (`pr#17100 <https://github.com/ceph/ceph/pull/17100>`_, mychoxin)
-* vstart: fix option (due to quotes) and allow disabling dashboard (`issue#23345 <http://tracker.ceph.com/issues/23345>`_, `pr#20986 <https://github.com/ceph/ceph/pull/20986>`_, Joao Eduardo Luis)
-* vstart.sh: fix a typo (`pr#18729 <https://github.com/ceph/ceph/pull/18729>`_, iliul)
-* vstart.sh: Fix help text in vstart.sh (`pr#21071 <https://github.com/ceph/ceph/pull/21071>`_, Marc Koderer)
-* vstart.sh: quote cmd params when display executing cmd (`pr#17057 <https://github.com/ceph/ceph/pull/17057>`_, Jiaying Ren)
-* vstart.sh: quote command only when necessary (`pr#18181 <https://github.com/ceph/ceph/pull/18181>`_, Kefu Chai)
-* vstart.sh: should quote the parameters to get them quoted (`pr#18523 <https://github.com/ceph/ceph/pull/18523>`_, Kefu Chai)
-* vstart.sh: simplify the objectstore related logic (`pr#17749 <https://github.com/ceph/ceph/pull/17749>`_, Kefu Chai)
diff --git a/ceph/doc/releases/nautilus.rst b/ceph/doc/releases/nautilus.rst
deleted file mode 100644 (file)
index 3c8af29..0000000
+++ /dev/null
@@ -1,5155 +0,0 @@
-========
-Nautilus
-========
-
-Nautilus is the 14th stable release of Ceph.  It is named after the
-nautilus, a family of cephalopods characterized by a whorled shell.
-
-v14.2.22 Nautilus
-=================
-
-This is the 22nd and likely the last backport release in the Nautilus series.
-Ultimately, we recommend all users upgrade to newer Ceph releases.
-
-Notable Changes
----------------
-
-* This release sets ``bluefs_buffered_io`` to true by default to improve performance
-  for metadata heavy workloads. Enabling this option has been reported to
-  occasionally cause excessive kernel swapping under certain workloads.
-  Currently, the most consistent performing combination is to enable
-  bluefs_buffered_io and disable system level swap.
-
-* The default value of ``bluestore_cache_trim_max_skip_pinned`` has been
-  increased to 1000 to control memory growth due to onodes.
-
-* Several other bug fixes in BlueStore, including a fix for an unexpected
-  ENOSPC bug in Avl/Hybrid allocators.
-
-* The trimming logic in the monitor has been made dynamic, with the
-  introduction of ``paxos_service_trim_max_multiplier``, a factor by which
-  ``paxos_service_trim_max`` is multiplied to make trimming faster,
-  when required. Setting it to 0 disables the upper bound check for trimming
-  and makes the monitors trim at the maximum rate.
-
-* A ``--max <n>`` option is available with the ``osd ok-to-stop`` command to
-  provide up to N OSDs that can be stopped together without making PGs
-  unavailable.
-
-* OSD: the option ``osd_fast_shutdown_notify_mon`` has been introduced to allow
-  the OSD to notify the monitor it is shutting down even if ``osd_fast_shutdown``
-  is enabled. This helps with the monitor logs on larger clusters, that may get
-  many 'osd.X reported immediately failed by osd.Y' messages, and confuse tools.
-
-* A long-standing bug that prevented 32-bit and 64-bit client/server
-  interoperability under msgr v2 has been fixed.  In particular, mixing armv7l
-  (armhf) and x86_64 or aarch64 servers in the same cluster now works.
-
-Changelog
----------
-
-* PendingReleaseNotes: note about 14.2.18 mgr fixes (`pr#40121 <https://github.com/ceph/ceph/pull/40121>`_, Josh Durgin)
-* bind on loopback address if no other addresses are available (`pr#41137 <https://github.com/ceph/ceph/pull/41137>`_, Kefu Chai, Matthew Oliver)
-* build python extensions using distutils (`pr#41167 <https://github.com/ceph/ceph/pull/41167>`_, Kefu Chai)
-* ceph-monstore-tool: use a large enough paxos/{first,last}_committed (`issue#38219 <http://tracker.ceph.com/issues/38219>`_, `pr#41874 <https://github.com/ceph/ceph/pull/41874>`_, Kefu Chai)
-* ceph-volume: disable cache for blkid calls (`pr#41114 <https://github.com/ceph/ceph/pull/41114>`_, Rafał Wądołowski)
-* ceph-volume: fix batch report and respect ceph.conf config values (`pr#41716 <https://github.com/ceph/ceph/pull/41716>`_, Andrew Schoen)
-* ceph-volume: fix batch report and respect ceph.conf config values (`pr#41713 <https://github.com/ceph/ceph/pull/41713>`_, Andrew Schoen)
-* ceph-volume: implement bluefs volume migration (`pr#41676 <https://github.com/ceph/ceph/pull/41676>`_, Kefu Chai, Igor Fedotov)
-* ceph.spec.in: Enable tcmalloc on IBM Power and Z (`pr#40283 <https://github.com/ceph/ceph/pull/40283>`_, Nathan Cutler, Yaakov Selkowitz)
-* cephfs: client: add ability to lookup snapped inodes by inode number (`pr#40769 <https://github.com/ceph/ceph/pull/40769>`_, Jeff Layton, Xiubo Li)
-* cephfs: client: only check pool permissions for regular files (`pr#40730 <https://github.com/ceph/ceph/pull/40730>`_, Xiubo Li)
-* cephfs: client: wake up the front pos waiter (`pr#40865 <https://github.com/ceph/ceph/pull/40865>`_, Xiubo Li)
-* client: Fix executeable access check for the root user (`pr#41297 <https://github.com/ceph/ceph/pull/41297>`_, Kotresh HR)
-* client: fire the finish_cap_snap() after buffer being flushed (`pr#40722 <https://github.com/ceph/ceph/pull/40722>`_, Xiubo Li)
-* cls/rgw: look for plain entries in non-ascii plain namespace too (`pr#41776 <https://github.com/ceph/ceph/pull/41776>`_, Mykola Golub)
-* cmake,zstd,debian: allow use libzstd in system (`pr#40516 <https://github.com/ceph/ceph/pull/40516>`_, Kefu Chai, Bryan Stillwell, Dan van der Ster)
-* cmake: build static libs if they are internal ones (`pr#39903 <https://github.com/ceph/ceph/pull/39903>`_, Kefu Chai)
-* cmake: detect gettid() presense (`pr#40333 <https://github.com/ceph/ceph/pull/40333>`_, Igor Fedotov)
-* cmake: set empty RPATH for some test executables (`pr#40619 <https://github.com/ceph/ceph/pull/40619>`_, Nathan Cutler, Kefu Chai)
-* common/buffer: adjust align before calling posix_memalign() (`pr#41246 <https://github.com/ceph/ceph/pull/41246>`_, Ilya Dryomov)
-* common/ipaddr: skip loopback interfaces named 'lo' and test it (`pr#40423 <https://github.com/ceph/ceph/pull/40423>`_, Dan van der Ster)
-* common/mempool: only fail tests if sharding is very bad (`pr#40567 <https://github.com/ceph/ceph/pull/40567>`_, singuliere)
-* common/options/global.yaml.in: increase default value of bluestore_cache_trim_max_skip_pinned (`pr#40920 <https://github.com/ceph/ceph/pull/40920>`_, Neha Ojha)
-* common/options: bluefs_buffered_io=true by default (`pr#40393 <https://github.com/ceph/ceph/pull/40393>`_, Dan van der Ster)
-* common: Fix assertion when disabling and re-enabling clog_to_monitors (`pr#39912 <https://github.com/ceph/ceph/pull/39912>`_, Gerald Yang)
-* common: remove log_early configuration option (`pr#40549 <https://github.com/ceph/ceph/pull/40549>`_, Changcheng Liu)
-* crush/CrushLocation: do not print logging message in constructor (`pr#40750 <https://github.com/ceph/ceph/pull/40750>`_, Alex Wu)
-* crush/CrushWrapper: update shadow trees on update_item() (`pr#39920 <https://github.com/ceph/ceph/pull/39920>`_, Sage Weil)
-* debian/ceph-common.postinst: do not chown cephadm log dirs (`pr#40698 <https://github.com/ceph/ceph/pull/40698>`_, Sage Weil)
-* debian/control: add missing commas, use python3 packages for "make check" on focal (`pr#40485 <https://github.com/ceph/ceph/pull/40485>`_, Kefu Chai, Alfredo Deza)
-* install-deps.sh: remove existing ceph-libboost of different version (`pr#40287 <https://github.com/ceph/ceph/pull/40287>`_, Kefu Chai)
-* libcephfs: ignore restoring the open files limit (`pr#41593 <https://github.com/ceph/ceph/pull/41593>`_, Xiubo Li)
-* librbd: allow interrupted trash move request to be restarted (`pr#40675 <https://github.com/ceph/ceph/pull/40675>`_, Jason Dillaman)
-* librbd: don't stop at the first unremovable image when purging (`pr#41662 <https://github.com/ceph/ceph/pull/41662>`_, Ilya Dryomov)
-* librbd: fix sporadic failures in TestMigration.StressLive (`pr#41788 <https://github.com/ceph/ceph/pull/41788>`_, Jason Dillaman)
-* librbd: race when disabling object map with overlapping in-flight writes (`pr#41787 <https://github.com/ceph/ceph/pull/41787>`_, Jason Dillaman)
-* make-dist: refuse to run if script path contains a colon (`pr#41088 <https://github.com/ceph/ceph/pull/41088>`_, Nathan Cutler)
-* mds: do not trim the inodes from the lru list in standby_replay (`pr#41144 <https://github.com/ceph/ceph/pull/41144>`_, Xiubo Li)
-* mds: fix race of fetching large dirfrag (`pr#40720 <https://github.com/ceph/ceph/pull/40720>`_, Erqi Chen)
-* mds: send scrub status to ceph-mgr only when scrub is running (`issue#45349 <http://tracker.ceph.com/issues/45349>`_, `pr#36183 <https://github.com/ceph/ceph/pull/36183>`_, Kefu Chai, Venky Shankar)
-* mds: trim cache regularly for standby-replay (`pr#40744 <https://github.com/ceph/ceph/pull/40744>`_, Patrick Donnelly)
-* mgr/ActivePyModules.cc: always release GIL before attempting to acquire a lock (`pr#40047 <https://github.com/ceph/ceph/pull/40047>`_, Kefu Chai)
-* mgr/Dashboard: Remove erroneous elements in hosts-overview Grafana dashboard (`pr#41650 <https://github.com/ceph/ceph/pull/41650>`_, Malcolm Holmes)
-* mgr/PyModule: put mgr_module_path before Py_GetPath() (`pr#40753 <https://github.com/ceph/ceph/pull/40753>`_, Kefu Chai)
-* mgr/dashboard: Fix for alert notification message being undefined (`pr#40590 <https://github.com/ceph/ceph/pull/40590>`_, Nizamudeen A)
-* mgr/dashboard: Fix missing root path of each session for CephFS (`pr#39869 <https://github.com/ceph/ceph/pull/39869>`_, Yongseok Oh)
-* mgr/dashboard: Monitoring alert badge includes suppressed alerts (`pr#39511 <https://github.com/ceph/ceph/pull/39511>`_, Aashish Sharma)
-* mgr/dashboard: Remove username, password fields from Manager Modules/dashboard,influx (`pr#40490 <https://github.com/ceph/ceph/pull/40490>`_, Aashish Sharma)
-* mgr/dashboard: Revoke read-only user's access to Manager modules (`pr#40650 <https://github.com/ceph/ceph/pull/40650>`_, Nizamudeen A)
-* mgr/dashboard: debug nodeenv hangs (`pr#40818 <https://github.com/ceph/ceph/pull/40818>`_, Ernesto Puerta)
-* mgr/dashboard: decouple unit tests from build artifacts (`pr#40547 <https://github.com/ceph/ceph/pull/40547>`_, Alfonso Martínez)
-* mgr/dashboard: encode non-ascii string before passing it to exec_cmd() (`pr#40522 <https://github.com/ceph/ceph/pull/40522>`_, Kefu Chai)
-* mgr/dashboard: filesystem pool size should use stored stat (`pr#41021 <https://github.com/ceph/ceph/pull/41021>`_, Avan Thakkar)
-* mgr/dashboard: fix API docs link (`pr#41521 <https://github.com/ceph/ceph/pull/41521>`_, Avan Thakkar)
-* mgr/dashboard: fix OSDs Host details/overview grafana graphs (`issue#49769 <http://tracker.ceph.com/issues/49769>`_, `pr#41531 <https://github.com/ceph/ceph/pull/41531>`_, Alfonso Martínez, Michael Wodniok)
-* mgr/dashboard: fix base-href: revert it to previous approach (`pr#41253 <https://github.com/ceph/ceph/pull/41253>`_, Avan Thakkar)
-* mgr/dashboard: fix bucket objects and size calculations (`pr#41648 <https://github.com/ceph/ceph/pull/41648>`_, Avan Thakkar)
-* mgr/dashboard: fix dashboard instance ssl certificate functionality (`pr#40003 <https://github.com/ceph/ceph/pull/40003>`_, Avan Thakkar)
-* mgr/dashboard: grafana panels for rgw multisite sync performance (`pr#41386 <https://github.com/ceph/ceph/pull/41386>`_, Alfonso Martínez)
-* mgr/dashboard: python 2: fix error when non-ASCII password (`pr#40610 <https://github.com/ceph/ceph/pull/40610>`_, Alfonso Martínez)
-* mgr/dashboard: report mgr fsid (`pr#39853 <https://github.com/ceph/ceph/pull/39853>`_, Ernesto Puerta)
-* mgr/dashboard: show partially deleted RBDs (`pr#41738 <https://github.com/ceph/ceph/pull/41738>`_, Tatjana Dehler)
-* mgr/dashboard: test prometheus rules through promtool (`pr#39984 <https://github.com/ceph/ceph/pull/39984>`_, Aashish Sharma, Kefu Chai)
-* mgr/progress: ensure progress stays between [0,1] (`pr#41310 <https://github.com/ceph/ceph/pull/41310>`_, Dan van der Ster)
-* mgr/telemetry: check if 'ident' channel is active (`pr#39923 <https://github.com/ceph/ceph/pull/39923>`_, Yaarit Hatuka)
-* mgr/telemetry: pass leaderboard flag even w/o ident (`pr#41839 <https://github.com/ceph/ceph/pull/41839>`_, Sage Weil)
-* mgr/volumes: Retain suid guid bits in clone (`pr#40270 <https://github.com/ceph/ceph/pull/40270>`_, Kotresh HR)
-* mgr: add --max <n> to 'osd ok-to-stop' command (`pr#40676 <https://github.com/ceph/ceph/pull/40676>`_, Sage Weil, Xuehan Xu)
-* mgr: add mon metada using type of "mon" (`pr#40359 <https://github.com/ceph/ceph/pull/40359>`_, Kefu Chai)
-* mon/ConfigMap: fix stray option leak (`pr#40299 <https://github.com/ceph/ceph/pull/40299>`_, Sage Weil)
-* mon/MonClient: reset authenticate_err in _reopen_session() (`pr#41016 <https://github.com/ceph/ceph/pull/41016>`_, Ilya Dryomov)
-* mon/MonClient: tolerate a rotating key that is slightly out of date (`pr#41448 <https://github.com/ceph/ceph/pull/41448>`_, Ilya Dryomov)
-* mon/OSDMonitor: drop stale failure_info after a grace period (`pr#41213 <https://github.com/ceph/ceph/pull/41213>`_, Kefu Chai)
-* mon/OSDMonitor: drop stale failure_info even if can_mark_down() (`pr#41519 <https://github.com/ceph/ceph/pull/41519>`_, Kefu Chai)
-* mon: Modifying trim logic to change paxos_service_trim_max dynamically (`pr#41099 <https://github.com/ceph/ceph/pull/41099>`_, Aishwarya Mathuria)
-* mon: ensure progress is [0,1] before printing (`pr#41098 <https://github.com/ceph/ceph/pull/41098>`_, Dan van der Ster)
-* mon: load stashed map before mkfs monmap (`pr#41762 <https://github.com/ceph/ceph/pull/41762>`_, Dan van der Ster)
-* monmaptool: Don't call set_port on an invalid address (`pr#40700 <https://github.com/ceph/ceph/pull/40700>`_, Brad Hubbard, Kefu Chai)
-* os/FileStore: don't propagate split/merge error to "create"/"remove" (`pr#40987 <https://github.com/ceph/ceph/pull/40987>`_, Mykola Golub)
-* os/FileStore: fix to handle readdir error correctly (`pr#41238 <https://github.com/ceph/ceph/pull/41238>`_, Misono Tomohiro)
-* os/bluestore/BlueFS: do not _flush_range deleted files (`pr#40752 <https://github.com/ceph/ceph/pull/40752>`_, weixinwei)
-* os/bluestore/BlueFS: use iterator_impl::copy instead of bufferlist::c_str() to avoid bufferlist rebuild (`pr#39883 <https://github.com/ceph/ceph/pull/39883>`_, weixinwei)
-* os/bluestore: be more verbose in _open_super_meta by default (`pr#41060 <https://github.com/ceph/ceph/pull/41060>`_, Igor Fedotov)
-* os/bluestore: do not count pinned entries as trimmed ones (`pr#41173 <https://github.com/ceph/ceph/pull/41173>`_, Igor Fedotov)
-* os/bluestore: fix unexpected ENOSPC in Avl/Hybrid allocators (`pr#41673 <https://github.com/ceph/ceph/pull/41673>`_, Igor Fedotov)
-* os/bluestore: introduce multithireading sync for bluestore's repairer (`pr#41749 <https://github.com/ceph/ceph/pull/41749>`_, Igor Fedotov)
-* os/bluestore: tolerate zero length for allocators' init\_[add/rm]_free() (`pr#41750 <https://github.com/ceph/ceph/pull/41750>`_, Igor Fedotov)
-* osd/PG.cc: handle removal of pgmeta object (`pr#41682 <https://github.com/ceph/ceph/pull/41682>`_, Neha Ojha)
-* osd/PeeringState: fix acting_set_writeable min_size check (`pr#41611 <https://github.com/ceph/ceph/pull/41611>`_, Dan van der Ster)
-* osd: add osd_fast_shutdown_notify_mon option (default false) (`issue#46978 <http://tracker.ceph.com/issues/46978>`_, `pr#40014 <https://github.com/ceph/ceph/pull/40014>`_, Mauricio Faria de Oliveira)
-* osd: compute OSD's space usage ratio via raw space utilization (`pr#41111 <https://github.com/ceph/ceph/pull/41111>`_, Igor Fedotov)
-* osd: do not dump an osd multiple times (`pr#40747 <https://github.com/ceph/ceph/pull/40747>`_, Xue Yantao)
-* pybind/ceph_daemon: do not fail if prettytable is not available (`pr#40335 <https://github.com/ceph/ceph/pull/40335>`_, Kefu Chai)
-* pybind/cephfs: DT_REG and DT_LNK values are wrong (`pr#40704 <https://github.com/ceph/ceph/pull/40704>`_, Varsha Rao)
-* pybind/mgr/balancer/module.py: assign weight-sets to all buckets before balancing (`pr#40128 <https://github.com/ceph/ceph/pull/40128>`_, Neha Ojha)
-* pybind/mgr/volumes: deadlock on async job hangs finisher thread (`pr#41394 <https://github.com/ceph/ceph/pull/41394>`_, Patrick Donnelly)
-* pybind/rados: should pass "name" to cstr() (`pr#41318 <https://github.com/ceph/ceph/pull/41318>`_, Kefu Chai)
-* pybind: volume_client handle purge of directory names encoded in utf-8 (`pr#36679 <https://github.com/ceph/ceph/pull/36679>`_, Jose Castro Leon)
-* qa/tasks/mgr/test_progress: fix wait_until_equal (`pr#39397 <https://github.com/ceph/ceph/pull/39397>`_, Kamoltat, Ricardo Dias)
-* qa/tasks/qemu: precise repos have been archived (`pr#41641 <https://github.com/ceph/ceph/pull/41641>`_, Ilya Dryomov)
-* qa/tasks/vstart_runner.py: start max required mgrs (`pr#40751 <https://github.com/ceph/ceph/pull/40751>`_, Alfonso Martínez)
-* qa/tests: added client-upgrade-nautilus-pacific tests (`pr#39818 <https://github.com/ceph/ceph/pull/39818>`_, Yuri Weinstein)
-* qa/tests: advanced nautilus initial version to 14.2.20 (`pr#41227 <https://github.com/ceph/ceph/pull/41227>`_, Yuri Weinstein)
-* qa/upgrade: disable update_features test_notify with older client as lockowner (`pr#41513 <https://github.com/ceph/ceph/pull/41513>`_, Deepika Upadhyay)
-* qa: add sleep for blocklisting to take effect (`pr#40714 <https://github.com/ceph/ceph/pull/40714>`_, Patrick Donnelly)
-* qa: bump osd heartbeat grace for ffsb workload (`pr#40713 <https://github.com/ceph/ceph/pull/40713>`_, Nathan Cutler)
-* qa: delete all fs during tearDown (`pr#40709 <https://github.com/ceph/ceph/pull/40709>`_, Patrick Donnelly)
-* qa: krbd_blkroset.t: update for separate hw and user read-only flags (`pr#40212 <https://github.com/ceph/ceph/pull/40212>`_, Ilya Dryomov)
-* qa: vstart_runner: TypeError: lstat: path should be string, bytes or os.PathLike, not NoneType (`pr#41485 <https://github.com/ceph/ceph/pull/41485>`_, Patrick Donnelly)
-* rbd-mirror: image replayer stop might race with instance replayer shut down (`pr#41792 <https://github.com/ceph/ceph/pull/41792>`_, Mykola Golub, Jason Dillaman)
-* rgw : catch non int exception (`pr#40356 <https://github.com/ceph/ceph/pull/40356>`_, caolei)
-* rgw/http: add timeout to http client (`pr#40667 <https://github.com/ceph/ceph/pull/40667>`_, Yuval Lifshitz)
-* rgw: Added caching for S3 credentials retrieved from keystone (`pr#41158 <https://github.com/ceph/ceph/pull/41158>`_, James Weaver)
-* rgw: Use correct bucket info when put or get large object with swift (`pr#40106 <https://github.com/ceph/ceph/pull/40106>`_, zhiming zhang, yupeng chen)
-* rgw: allow rgw-orphan-list to handle intermediate files w/ binary data (`pr#39767 <https://github.com/ceph/ceph/pull/39767>`_, J. Eric Ivancich)
-* rgw: beast frontend uses 512k mprotected coroutine stacks (`pr#39947 <https://github.com/ceph/ceph/pull/39947>`_, Yaakov Selkowitz, Mauricio Faria de Oliveira, Daniel Gryniewicz, Casey Bodley)
-* rgw: check object locks in multi-object delete (`issue#47586 <http://tracker.ceph.com/issues/47586>`_, `pr#41164 <https://github.com/ceph/ceph/pull/41164>`_, Mark Houghton, Matt Benjamin)
-* rgw: during reshard lock contention, adjust logging (`pr#41156 <https://github.com/ceph/ceph/pull/41156>`_, J. Eric Ivancich)
-* rgw: limit rgw_gc_max_objs to RGW_SHARDS_PRIME_1 (`pr#40670 <https://github.com/ceph/ceph/pull/40670>`_, Rafał Wądołowski)
-* rgw: radoslist incomplete multipart parts marker (`pr#40827 <https://github.com/ceph/ceph/pull/40827>`_, J. Eric Ivancich)
-* rgw: return ERR_NO_SUCH_BUCKET early while evaluating bucket policy (`issue#38420 <http://tracker.ceph.com/issues/38420>`_, `pr#40668 <https://github.com/ceph/ceph/pull/40668>`_, Abhishek Lekshmanan)
-* rgw: return error when trying to copy encrypted object without key (`pr#40671 <https://github.com/ceph/ceph/pull/40671>`_, Ilsoo Byun)
-* rgw: tooling to locate rgw objects with missing rados components (`pr#39771 <https://github.com/ceph/ceph/pull/39771>`_, Michael Kidd, J. Eric Ivancich)
-* run-make-check.sh: let ctest generate XML output (`pr#40407 <https://github.com/ceph/ceph/pull/40407>`_, Kefu Chai)
-* src/global/signal_handler.h: fix preprocessor logic for alpine (`pr#39942 <https://github.com/ceph/ceph/pull/39942>`_, Duncan Bellamy)
-* test/TestOSDScrub: fix mktime() error (`pr#40621 <https://github.com/ceph/ceph/pull/40621>`_, luo rixin)
-* test/pybind: s/nosetests/python3/ (`pr#40536 <https://github.com/ceph/ceph/pull/40536>`_, Kefu Chai)
-* test/rgw: test_datalog_autotrim filters out new entries (`pr#40674 <https://github.com/ceph/ceph/pull/40674>`_, Casey Bodley)
-* test: use std::atomic<bool> instead of volatile for cb_done var (`pr#40701 <https://github.com/ceph/ceph/pull/40701>`_, Jeff Layton)
-* tests: ceph_test_rados_api_watch_notify: Allow for reconnect (`pr#40697 <https://github.com/ceph/ceph/pull/40697>`_, Brad Hubbard)
-* vstart.sh: disable "auth_allow_insecure_global_id_reclaim" (`pr#40959 <https://github.com/ceph/ceph/pull/40959>`_, Kefu Chai)
-
-
-v14.2.21 Nautilus
-=================
-
-This is a hotfix release addressing a number of security issues and regressions. We recommend all users update to this release.
-
-Changelog
----------
-
-* mgr/dashboard: fix base-href: revert it to previous approach (`issue#50684 <https://tracker.ceph.com/issues/50684>`_, Avan Thakkar)
-* mgr/dashboard: fix cookie injection issue (:ref:`CVE-2021-3509`, Ernesto Puerta)
-* rgw: RGWSwiftWebsiteHandler::is_web_dir checks empty subdir_name (:ref:`CVE-2021-3531`, Felix Huettner)
-* rgw: sanitize \r in s3 CORSConfiguration's ExposeHeader (:ref:`CVE-2021-3524`, Sergey Bobrov, Casey Bodley)
-
-
-v14.2.20 Nautilus
-=================
-
-This is the 20th bugfix release in the Nautilus stable series.  It addresses a
-security vulnerability in the Ceph authentication framework.
-
-We recommend all Nautilus users upgrade.
-
-Security fixes
---------------
-
-* This release includes a security fix that ensures the global_id
-  value (a numeric value that should be unique for every authenticated
-  client or daemon in the cluster) is reclaimed after a network
-  disconnect or ticket renewal in a secure fashion.  Two new health
-  alerts may appear during the upgrade indicating that there are
-  clients or daemons that are not yet patched with the appropriate
-  fix.
-
-  It is possible to disable the health alerts around insecure clients::
-
-    ceph config set mon mon_warn_on_insecure_global_id_reclaim false
-    ceph config set mon mon_warn_on_insecure_global_id_reclaim_allowed false
-
-  However, if you disable these alerts, we strongly recommend that you
-  follow up by removing these settings after clients have been
-  upgraded or after upgrading to Octopus.  (Starting in Octopus, these
-  health alerts can be muted for a specific period of time.)
-
-  For more information, see :ref:`CVE-2021-20288`.
-
-
-v14.2.19 Nautilus
-=================
-
-This is the 19th update to the Ceph Nautilus release series. This is a hotfix
-release to prevent daemons from binding to loopback network interfaces. All
-nautilus users are advised to upgrade to this release.
-
-Notable Changes
----------------
-
-* This release fixes a regression introduced in v14.2.17 whereby in certain environments, OSDs will bind to 127.0.0.1.  See `issue#49938 <https://tracker.ceph.com/issues/49938>`_.
-
-Changelog
----------
-
-* common/ipaddr: also skip just `lo` (`pr#40423 <https://github.com/ceph/ceph/pull/40423>`_, Dan van der Ster)
-
-
-v14.2.18 Nautilus
-=================
-
-This is the 18th backport release in the Nautilus series. It fixes a regression
-introduced in 14.2.17 in which the manager module tries to use a couple python 
-modules that do not exist in some environments. We recommend users to 
-update to this release.
-
-Notable Changes
----------------
-
-* This release fixes issues loading the dashboard and volumes manager
-  modules in some environments.
-
-Changelog
----------
-* nautilus: .github: add workflow for adding labels and milestone (`pr#39926 <https://github.com/ceph/ceph/pull/39926>`_, Kefu Chai, Ernesto Puerta)
-* nautilus: mgr/dashboard: Python2 Cookie module import fails on Python3 (`pr#40116 <https://github.com/ceph/ceph/pull/40116>`_, Volker Theile)
-* nautilus: mgr/volumes: don't require typing (`pr#40095 <https://github.com/ceph/ceph/pull/40095>`_, Josh Durgin)
-* nautilus: qa/suites/krbd: address recent issues caused by newer kernels (`pr#40064 <https://github.com/ceph/ceph/pull/40064>`_, Ilya Dryomov)
-
-v14.2.17 Nautilus
-=================
-
-This is the 17th backport release in the Nautilus series. We recommend
-users to update to this release.
-
-Notable Changes
----------------
-
-* $pid expansion in config paths like ``admin_socket`` will now properly expand
-  to the daemon pid for commands like ``ceph-mds`` or ``ceph-osd``. Previously
-  only ``ceph-fuse``/``rbd-nbd`` expanded ``$pid`` with the actual daemon pid.
-* RADOS: PG removal has been optimized in this release.
-* RADOS: Memory allocations are tracked in finer detail in BlueStore and displayed as a part of the ``dump_mempools`` command.
-* cephfs: clients which acquire capabilities too quickly are throttled to prevent instability.  See new config option ``mds_session_cap_acquisition_throttle`` to control this behavior.
-
-Changelog
----------
-
-* nautilus mgr/dashboard: fix 'ceph dashboard iscsi-gateway-add' (`pr#39175 <https://github.com/ceph/ceph/pull/39175>`_, Alfonso Martínez)
-* nautilus: Do not add sensitive information in Ceph log files (`pr#38614 <https://github.com/ceph/ceph/pull/38614>`_, Neha Ojha)
-* nautilus: bluestore: Add protection against bluefs log file growth (`pr#37948 <https://github.com/ceph/ceph/pull/37948>`_, Adam Kupczyk)
-* nautilus: bluestore: provide a different name for fallback allocator (`pr#37793 <https://github.com/ceph/ceph/pull/37793>`_, Igor Fedotov)
-* nautilus: build-integration-branch: take PRs in chronological order (`pr#37693 <https://github.com/ceph/ceph/pull/37693>`_, Nathan Cutler)
-* nautilus: build/ops: install-deps.sh,deb,rpm: move python-saml deps into debian/control and ceph.spec.in (`pr#39184 <https://github.com/ceph/ceph/pull/39184>`_, Kefu Chai)
-* nautilus: ceph-volume batch: reject partitions in argparser (`pr#38279 <https://github.com/ceph/ceph/pull/38279>`_, Jan Fajerski)
-* nautilus: ceph-volume: Fix usage of is_lv (`pr#39221 <https://github.com/ceph/ceph/pull/39221>`_, Michał Nasiadka)
-* nautilus: ceph-volume: Update batch.py (`pr#39470 <https://github.com/ceph/ceph/pull/39470>`_, shenjiatong)
-* nautilus: ceph-volume: add no-systemd argument to zap (`pr#37723 <https://github.com/ceph/ceph/pull/37723>`_, wanghongxu)
-* nautilus: ceph-volume: add some flexibility to bytes_to_extents (`pr#39270 <https://github.com/ceph/ceph/pull/39270>`_, Jan Fajerski)
-* nautilus: ceph-volume: consume mount opt in simple activate (`pr#38015 <https://github.com/ceph/ceph/pull/38015>`_, Dimitri Savineau)
-* nautilus: ceph-volume: implement the --log-level flag (`pr#38372 <https://github.com/ceph/ceph/pull/38372>`_, Andrew Schoen)
-* nautilus: ceph-volume: remove mention of dmcache from docs and help text (`pr#38048 <https://github.com/ceph/ceph/pull/38048>`_, Dimitri Savineau, Andrew Schoen)
-* nautilus: cephfs: client: check rdonly file handle on truncate (`pr#39129 <https://github.com/ceph/ceph/pull/39129>`_, Patrick Donnelly)
-* nautilus: cephfs: client: dump which fs is used by client for multiple-fs (`pr#38552 <https://github.com/ceph/ceph/pull/38552>`_, Zhi Zhang)
-* nautilus: cephfs: client: ensure we take Fs caps when fetching directory link count from cached inode (`pr#38950 <https://github.com/ceph/ceph/pull/38950>`_, Jeff Layton)
-* nautilus: cephfs: client: fix inode ll_ref reference count leak (`pr#37838 <https://github.com/ceph/ceph/pull/37838>`_, sepia-liu)
-* nautilus: cephfs: client: increment file position on _read_sync near eof (`pr#37991 <https://github.com/ceph/ceph/pull/37991>`_, Patrick Donnelly)
-* nautilus: cephfs: client: set CEPH_STAT_RSTAT mask for dir in readdir_r_cb (`pr#38948 <https://github.com/ceph/ceph/pull/38948>`_, chencan)
-* nautilus: cephfs: mds: throttle cap acquisition via readdir (`pr#38101 <https://github.com/ceph/ceph/pull/38101>`_, Kotresh HR)
-* nautilus: cephfs: mount.ceph: collect v2 addresses for non-legacy ms_mode options (`pr#39133 <https://github.com/ceph/ceph/pull/39133>`_, Jeff Layton)
-* nautilus: cephfs: osdc: restart read on truncate/discard (`pr#37988 <https://github.com/ceph/ceph/pull/37988>`_, Patrick Donnelly)
-* nautilus: cephfs: release client dentry_lease before send caps release to mds (`pr#39127 <https://github.com/ceph/ceph/pull/39127>`_, Wei Qiaomiao)
-* nautilus: client: add ceph.{cluster_fsid/client_id} vxattrs suppport (`pr#39001 <https://github.com/ceph/ceph/pull/39001>`_, Xiubo Li)
-* nautilus: client: do not use g_conf().get_val<>() in libcephfs (`pr#38467 <https://github.com/ceph/ceph/pull/38467>`_, Xiubo Li)
-* nautilus: cmake: define BOOST_ASIO_USE_TS_EXECUTOR_AS_DEFAULT for Boost.Asio users (`pr#38760 <https://github.com/ceph/ceph/pull/38760>`_, Kefu Chai)
-* nautilus: cmake: detect and use sigdescr_np() if available (`pr#38952 <https://github.com/ceph/ceph/pull/38952>`_, David Disseldorp)
-* nautilus: common/mempool: Improve mempool shard selection (`pr#39651 <https://github.com/ceph/ceph/pull/39651>`_, Nathan Cutler, Adam Kupczyk)
-* nautilus: common: fix logfile create perms (`issue#7849 <http://tracker.ceph.com/issues/7849>`_, `pr#38558 <https://github.com/ceph/ceph/pull/38558>`_, Kefu Chai, Roman Penyaev)
-* nautilus: common: skip interfaces starting with "lo" in find_ipv{4,6}_in_subnet() (`pr#39342 <https://github.com/ceph/ceph/pull/39342>`_, Thomas Goirand, Jiawei Li)
-* nautilus: core: osd: An empty bucket or OSD is not an error (`pr#39126 <https://github.com/ceph/ceph/pull/39126>`_, Brad Hubbard)
-* nautilus: crush/CrushWrapper: rebuild reverse maps after rebuilding crush map (`pr#39197 <https://github.com/ceph/ceph/pull/39197>`_, Jason Dillaman)
-* nautilus: krbd: add support for msgr2 (kernel 5.11) (`pr#39202 <https://github.com/ceph/ceph/pull/39202>`_, Ilya Dryomov)
-* nautilus: librados, tests: allow to list objects with the NUL character in names (`pr#39324 <https://github.com/ceph/ceph/pull/39324>`_, Radoslaw Zarzynski)
-* nautilus: librbd: clear implicitly enabled feature bits when creating images (`pr#39121 <https://github.com/ceph/ceph/pull/39121>`_, Jason Dillaman)
-* nautilus: log: fix timestap precision of log can't set to millisecond (`pr#37659 <https://github.com/ceph/ceph/pull/37659>`_, Guan yunfei)
-* nautilus: lvm/create.py: fix a typo in the help message (`pr#38371 <https://github.com/ceph/ceph/pull/38371>`_, ZhenLiu94)
-* nautilus: mds : move start_files_to_recover() to recovery_done (`pr#37986 <https://github.com/ceph/ceph/pull/37986>`_, Simon Gao)
-* nautilus: mds: account for closing sessions in hit_session (`pr#37820 <https://github.com/ceph/ceph/pull/37820>`_, Dan van der Ster)
-* nautilus: mds: avoid spurious sleeps (`pr#39130 <https://github.com/ceph/ceph/pull/39130>`_, Patrick Donnelly)
-* nautilus: mds: dir->mark_new() should together with dir->mark_dirty() (`pr#39128 <https://github.com/ceph/ceph/pull/39128>`_, "Yan, Zheng")
-* nautilus: mds: update defaults for recall configs (`pr#39134 <https://github.com/ceph/ceph/pull/39134>`_, Patrick Donnelly)
-* nautilus: mgr/PyModule: correctly remove config options (`pr#38803 <https://github.com/ceph/ceph/pull/38803>`_, Tim Serong)
-* nautilus: mgr/crash: Serialize command handling (`pr#39338 <https://github.com/ceph/ceph/pull/39338>`_, Boris Ranto)
-* nautilus: mgr/dashboard: CLI commands: read passwords from file (`pr#38832 <https://github.com/ceph/ceph/pull/38832>`_, Ernesto Puerta, Alfonso Martínez, Juan Miguel Olmo Martínez)
-* nautilus: mgr/dashboard: Datatable catches select events from other datatables (`pr#37756 <https://github.com/ceph/ceph/pull/37756>`_, Volker Theile, Tiago Melo)
-* nautilus: mgr/dashboard: Disable TLS 1.0 and 1.1 (`pr#38332 <https://github.com/ceph/ceph/pull/38332>`_, Volker Theile)
-* nautilus: mgr/dashboard: Disable sso without python3-saml (`pr#38404 <https://github.com/ceph/ceph/pull/38404>`_, Kevin Meijer)
-* nautilus: mgr/dashboard: Display a warning message in Dashboard when debug mode is enabled (`pr#38799 <https://github.com/ceph/ceph/pull/38799>`_, Volker Theile)
-* nautilus: mgr/dashboard: Display users current bucket quota usage (`pr#38024 <https://github.com/ceph/ceph/pull/38024>`_, Avan Thakkar)
-* nautilus: mgr/dashboard: Drop invalid RGW client instances, improve logging (`pr#38584 <https://github.com/ceph/ceph/pull/38584>`_, Volker Theile)
-* nautilus: mgr/dashboard: Fix for datatable item not showing details after getting selected (`pr#38813 <https://github.com/ceph/ceph/pull/38813>`_, Nizamudeen A)
-* nautilus: mgr/dashboard: Fix for incorrect validation in rgw user form (`pr#39117 <https://github.com/ceph/ceph/pull/39117>`_, Nizamudeen A)
-* nautilus: mgr/dashboard: RGW User Form is validating disabled fields (`pr#39543 <https://github.com/ceph/ceph/pull/39543>`_, Aashish Sharma)
-* nautilus: mgr/dashboard: The /rgw/status endpoint does not check for running service (`pr#38771 <https://github.com/ceph/ceph/pull/38771>`_, Volker Theile)
-* nautilus: mgr/dashboard: Updating the inbuilt ssl providers error (`pr#38509 <https://github.com/ceph/ceph/pull/38509>`_, Nizamudeen A)
-* nautilus: mgr/dashboard: Use secure cookies to store JWT Token (`pr#38839 <https://github.com/ceph/ceph/pull/38839>`_, Avan Thakkar, Aashish Sharma)
-* nautilus: mgr/dashboard: add `--ssl` to `ng serve` (`pr#38972 <https://github.com/ceph/ceph/pull/38972>`_, Tatjana Dehler)
-* nautilus: mgr/dashboard: avoid using document.write() (`pr#39526 <https://github.com/ceph/ceph/pull/39526>`_, Avan Thakkar)
-* nautilus: mgr/dashboard: customize CherryPy Server Header (`pr#39419 <https://github.com/ceph/ceph/pull/39419>`_, anurag)
-* nautilus: mgr/dashboard: delete EOF when reading passwords from file (`pr#39438 <https://github.com/ceph/ceph/pull/39438>`_, Alfonso Martínez)
-* nautilus: mgr/dashboard: disable cluster selection in NFS export editing form (`pr#37995 <https://github.com/ceph/ceph/pull/37995>`_, Kiefer Chang)
-* nautilus: mgr/dashboard: enable different URL for users of browser to Grafana (`pr#39136 <https://github.com/ceph/ceph/pull/39136>`_, Patrick Seidensal)
-* nautilus: mgr/dashboard: fix MTU Mismatch alert (`pr#39518 <https://github.com/ceph/ceph/pull/39518>`_, Aashish Sharma)
-* nautilus: mgr/dashboard: fix issues related with PyJWT versions >=2.0.0 (`pr#39837 <https://github.com/ceph/ceph/pull/39837>`_, Alfonso Martínez)
-* nautilus: mgr/dashboard: fix security scopes of some NFS-Ganesha endpoints (`pr#37961 <https://github.com/ceph/ceph/pull/37961>`_, Kiefer Chang)
-* nautilus: mgr/dashboard: fix tooltip for Provisioned/Total Provisioned fields (`pr#39646 <https://github.com/ceph/ceph/pull/39646>`_, Avan Thakkar)
-* nautilus: mgr/dashboard: minimize console log traces of Ceph backend API tests (`pr#39544 <https://github.com/ceph/ceph/pull/39544>`_, Aashish Sharma)
-* nautilus: mgr/dashboard: prometheus alerting: add some leeway for package drops and errors (`pr#39509 <https://github.com/ceph/ceph/pull/39509>`_, Patrick Seidensal)
-* nautilus: mgr/dashboard: python 2: error when setting non-ASCII password (`pr#39441 <https://github.com/ceph/ceph/pull/39441>`_, Alfonso Martínez)
-* nautilus: mgr/dashboard: remove pyOpenSSL version pinning (`pr#38504 <https://github.com/ceph/ceph/pull/38504>`_, Kiefer Chang)
-* nautilus: mgr/dashboard: set security headers (`pr#39626 <https://github.com/ceph/ceph/pull/39626>`_, Avan Thakkar)
-* nautilus: mgr/dashboard: test_standby\* (tasks.mgr.test_dashboard.TestDashboard) failed locally (`pr#38527 <https://github.com/ceph/ceph/pull/38527>`_, Volker Theile)
-* nautilus: mgr/dashboard: trigger alert if some nodes have a MTU different than the median value (`pr#39104 <https://github.com/ceph/ceph/pull/39104>`_, Aashish Sharma)
-* nautilus: mgr/insights: Test environment requires 'six' (`pr#38382 <https://github.com/ceph/ceph/pull/38382>`_, Brad Hubbard)
-* nautilus: mgr/progress: delete all events over the wire (`pr#38416 <https://github.com/ceph/ceph/pull/38416>`_, Sage Weil)
-* nautilus: mgr/progress: make it so progress bar does not get stuck forever (`issue#40618 <http://tracker.ceph.com/issues/40618>`_, `pr#37589 <https://github.com/ceph/ceph/pull/37589>`_, Kamoltat (Junior) Sirivadhna, Kamoltat)
-* nautilus: mgr/prometheus: Add SLOW_OPS healthcheck as a metric (`pr#39747 <https://github.com/ceph/ceph/pull/39747>`_, Paul Cuzner)
-* nautilus: mgr/prometheus: Fix 'pool filling up' with >50% usage (`pr#39076 <https://github.com/ceph/ceph/pull/39076>`_, Daniël Vos)
-* nautilus: mgr/prometheus: Make module more stable (`pr#38334 <https://github.com/ceph/ceph/pull/38334>`_, Boris Ranto, Ken Dreyer)
-* nautilus: mgr/restful: fix TypeError occurring in _gather_osds() (`issue#48488 <http://tracker.ceph.com/issues/48488>`_, `pr#39339 <https://github.com/ceph/ceph/pull/39339>`_, Jerry Pu)
-* nautilus: mgr/telemetry: fix proxy usage (`pr#38816 <https://github.com/ceph/ceph/pull/38816>`_, Nathan Cutler)
-* nautilus: mgr/volume: subvolume auth_id management and few bug fixes (`pr#39292 <https://github.com/ceph/ceph/pull/39292>`_, Rishabh Dave, Patrick Donnelly, Kotresh HR, Ramana Raja)
-* nautilus: mgr/volumes: Make number of cloner threads configurable (`pr#37936 <https://github.com/ceph/ceph/pull/37936>`_, Kotresh HR)
-* nautilus: mgr: Pin importlib_metadata version 2.1.0 (`pr#38296 <https://github.com/ceph/ceph/pull/38296>`_, Brad Hubbard)
-* nautilus: mgr: don't update osd stat which is already out (`pr#38354 <https://github.com/ceph/ceph/pull/38354>`_, Zhi Zhang)
-* nautilus: mgr: fix deadlock in ActivePyModules::get_osdmap() (`pr#39340 <https://github.com/ceph/ceph/pull/39340>`_, peng jiaqi)
-* nautilus: mgr: update mon metadata when monmap is updated (`pr#39075 <https://github.com/ceph/ceph/pull/39075>`_, Kefu Chai)
-* nautilus: mon scrub testing (`pr#38362 <https://github.com/ceph/ceph/pull/38362>`_, Brad Hubbard)
-* nautilus: mon/MDSMonitor do not ignore mds's down:dne request (`pr#37822 <https://github.com/ceph/ceph/pull/37822>`_, chencan)
-* nautilus: mon/MDSMonitor: divide mds identifier and mds real name with dot (`pr#37821 <https://github.com/ceph/ceph/pull/37821>`_, Zhi Zhang)
-* nautilus: mon: Log "ceph health detail" periodically in cluster log (`pr#38118 <https://github.com/ceph/ceph/pull/38118>`_, Prashant Dhange)
-* nautilus: mon: have 'mon stat' output json as well (`pr#37706 <https://github.com/ceph/ceph/pull/37706>`_, Joao Eduardo Luis, Sage Weil)
-* nautilus: mon: paxos: Delete logger in destructor (`pr#39160 <https://github.com/ceph/ceph/pull/39160>`_, Brad Hubbard)
-* nautilus: mon: validate crush-failure-domain (`pr#39124 <https://github.com/ceph/ceph/pull/39124>`_, Prashant Dhange)
-* nautilus: monitoring: Use null yaxes min for OSD read latency (`pr#37959 <https://github.com/ceph/ceph/pull/37959>`_, Seena Fallah)
-* nautilus: msg/async/ProtocolV2: allow rxbuf/txbuf get bigger in testing, again (`pr#38268 <https://github.com/ceph/ceph/pull/38268>`_, Ilya Dryomov)
-* nautilus: ocf: add support for mapping images within an RBD namespace (`pr#39047 <https://github.com/ceph/ceph/pull/39047>`_, Jason Dillaman)
-* nautilus: os/bluestore: Add option to check BlueFS reads (`pr#39756 <https://github.com/ceph/ceph/pull/39756>`_, Adam Kupczyk)
-* nautilus: os/bluestore: detect and fix "zombie" spanning blobs using fsck (`pr#39255 <https://github.com/ceph/ceph/pull/39255>`_, Igor Fedotov)
-* nautilus: os/bluestore: fix huge read/writes in BlueFS (`pr#39698 <https://github.com/ceph/ceph/pull/39698>`_, Jianpeng Ma, Kefu Chai, Igor Fedotov)
-* nautilus: os/bluestore: fix inappropriate ENOSPC from avl/hybrid allocator (`pr#38475 <https://github.com/ceph/ceph/pull/38475>`_, Igor Fedotov)
-* nautilus: os/bluestore: fix segfault on out-of-bound offset provided to  claim\_… (`pr#38637 <https://github.com/ceph/ceph/pull/38637>`_, Igor Fedotov)
-* nautilus: os/bluestore: go beyond pinned onodes while trimming the cache (`pr#39720 <https://github.com/ceph/ceph/pull/39720>`_, Igor Fedotov)
-* nautilus: os/bluestore: mempool's finer granularity + adding missed structs (`pr#38310 <https://github.com/ceph/ceph/pull/38310>`_, Deepika Upadhyay, Igor Fedotov, Adam Kupczyk)
-* nautilus: osd: Check for nosrub/nodeep-scrub in between chunks, to avoid races (`pr#38411 <https://github.com/ceph/ceph/pull/38411>`_, David Zafman)
-* nautilus: osd: fix bluestore bitmap allocator calculate wrong last_pos with hint (`pr#39708 <https://github.com/ceph/ceph/pull/39708>`_, Xue Yantao)
-* nautilus: osd: optimize PG removal (part1) (`pr#38478 <https://github.com/ceph/ceph/pull/38478>`_, Neha Ojha, Igor Fedotov)
-* nautilus: pybind/ceph_volume_client: Update the 'volumes' key to 'subvolumes' in auth-metadata file (`pr#39658 <https://github.com/ceph/ceph/pull/39658>`_, Kotresh HR, Michael Fritch)
-* nautilus: pybind/cephfs: add special values for not reading conffile (`pr#37725 <https://github.com/ceph/ceph/pull/37725>`_, Kefu Chai)
-* nautilus: pybind/cephfs: fix missing terminating NULL char in readlink()'s C string (`pr#38894 <https://github.com/ceph/ceph/pull/38894>`_, Tuan Hoang)
-* nautilus: pybind/mgr/rbd_support: delay creation of progress module events (`pr#38833 <https://github.com/ceph/ceph/pull/38833>`_, Jason Dillaman)
-* nautilus: qa/cephfs: add session_timeout option support (`pr#37840 <https://github.com/ceph/ceph/pull/37840>`_, Xiubo Li)
-* nautilus: qa/distros: add rhel 7.9 (`pr#38188 <https://github.com/ceph/ceph/pull/38188>`_, rakeshgm)
-* nautilus: qa/tasks/ceph_manager.py: don't use log-early in raw_cluster_cmd (`pr#39960 <https://github.com/ceph/ceph/pull/39960>`_, Neha Ojha)
-* nautilus: qa/tasks/{ceph,ceph_manager}: drop py2 support (`pr#37906 <https://github.com/ceph/ceph/pull/37906>`_, Rishabh Dave, Deepika Upadhyay, Kefu Chai)
-* nautilus: qa: fix tox failures (`pr#38627 <https://github.com/ceph/ceph/pull/38627>`_, Patrick Donnelly)
-* nautilus: qa: krbd_stable_pages_required.sh: move to stable_writes attribute (`pr#38834 <https://github.com/ceph/ceph/pull/38834>`_, Ilya Dryomov)
-* nautilus: qa: restore file name (`pr#38772 <https://github.com/ceph/ceph/pull/38772>`_, Patrick Donnelly)
-* nautilus: qa: unmount volumes before removal (`pr#38690 <https://github.com/ceph/ceph/pull/38690>`_, Patrick Donnelly)
-* nautilus: qa: use normal build for valgrind (`pr#39584 <https://github.com/ceph/ceph/pull/39584>`_, Sage Weil)
-* nautilus: rados/upgrade/nautilus-x-singleton fails due to cluster [WRN] evicting unresponsive client (`pr#39706 <https://github.com/ceph/ceph/pull/39706>`_, Patrick Donnelly)
-* nautilus: rbd-nbd: reexpand the conf meta in child process (`pr#38830 <https://github.com/ceph/ceph/pull/38830>`_, Xiubo Li)
-* nautilus: rbd/bench: include used headers (`pr#39123 <https://github.com/ceph/ceph/pull/39123>`_, Kefu Chai)
-* nautilus: rbd: librbd: ensure that thread pool lock is held when processing throttled IOs (`pr#37895 <https://github.com/ceph/ceph/pull/37895>`_, Jason Dillaman)
-* nautilus: rbd: librbd: update hidden global config when removing pool config override (`pr#38831 <https://github.com/ceph/ceph/pull/38831>`_, Jason Dillaman)
-* nautilus: rgw: Disable prefetch of entire head object when GET request with range header (`pr#38556 <https://github.com/ceph/ceph/pull/38556>`_, Or Friedmann)
-* nautilus: rgw: S3 Put Bucket Policy should return 204 on success (`pr#38623 <https://github.com/ceph/ceph/pull/38623>`_, Matthew Oliver)
-* nautilus: rgw: avoid expiration early triggering caused by overflow (`pr#38823 <https://github.com/ceph/ceph/pull/38823>`_, jiahuizeng)
-* nautilus: rgw: cls/rgw/cls_rgw.cc: fix multiple lastest version problem (`pr#38085 <https://github.com/ceph/ceph/pull/38085>`_, Yang Honggang, Ruan Zitao)
-* nautilus: rgw: cls/user: set from_index for reset stats calls (`pr#38822 <https://github.com/ceph/ceph/pull/38822>`_, Mykola Golub, Abhishek Lekshmanan)
-* nautilus: rgw: distribute cache for exclusive put (`pr#38827 <https://github.com/ceph/ceph/pull/38827>`_, Or Friedmann)
-* nautilus: rgw: fix bucket limit check fill_status warnings (`issue#40255 <http://tracker.ceph.com/issues/40255>`_, `pr#38825 <https://github.com/ceph/ceph/pull/38825>`_, Paul Emmerich)
-* nautilus: rgw: fix invalid payload issue when serving s3website error page (`pr#38590 <https://github.com/ceph/ceph/pull/38590>`_, Ilsoo Byun)
-* nautilus: rgw: fix trailing null in object names of multipart reuploads (`pr#39276 <https://github.com/ceph/ceph/pull/39276>`_, Casey Bodley)
-* nautilus: rgw: in ordered bucket listing skip namespaced entries internally when possible (`pr#38493 <https://github.com/ceph/ceph/pull/38493>`_, J. Eric Ivancich)
-* nautilus: rgw: keep syncstopped flag when copying bucket shard headers (`pr#38589 <https://github.com/ceph/ceph/pull/38589>`_, Ilsoo Byun)
-* nautilus: rgw: multisite: Verify if the synced object is identical to source (`pr#38885 <https://github.com/ceph/ceph/pull/38885>`_, Prasad Krishnan, Yang Honggang, Casey Bodley)
-* nautilus: rgw: radosgw-admin: clarify error when email address already in use (`pr#39661 <https://github.com/ceph/ceph/pull/39661>`_, Matthew Vernon)
-* nautilus: rgw: rgw-admin: fixes BucketInfo for missing buckets (`pr#38588 <https://github.com/ceph/ceph/pull/38588>`_, Nick Janus, caolei)
-* nautilus: rgw_file: return common_prefixes in lexical order (`pr#38828 <https://github.com/ceph/ceph/pull/38828>`_, Matt Benjamin)
-* nautilus: rpm,deb: change sudoers file mode to 440 (`pr#39090 <https://github.com/ceph/ceph/pull/39090>`_, David Turner)
-* nautilus: rpm: ceph-mgr-dashboard recommends python3-saml on SUSE (`pr#38818 <https://github.com/ceph/ceph/pull/38818>`_, Nathan Cutler)
-* nautilus: run-make-check.sh: Don't run tests if build fails (`pr#38295 <https://github.com/ceph/ceph/pull/38295>`_, Brad Hubbard)
-* nautilus: test/librados: fix endian bugs in checksum test cases (`pr#37605 <https://github.com/ceph/ceph/pull/37605>`_, Ulrich Weigand)
-* nautilus: test/rbd-mirror: fix broken ceph_test_rbd_mirror_random_write (`pr#39650 <https://github.com/ceph/ceph/pull/39650>`_, Jason Dillaman)
-* nautilus: test/run-cli-tests: use cram from github (`pr#39072 <https://github.com/ceph/ceph/pull/39072>`_, Kefu Chai)
-* nautilus: tests: cancelling both noscrub \*and\* nodeep-scrub (`pr#39125 <https://github.com/ceph/ceph/pull/39125>`_, Ronen Friedman)
-* nautilus: tools/rados: add support for binary object names in the rados CLI (`pr#39329 <https://github.com/ceph/ceph/pull/39329>`_, Radoslaw Zarzynski, Kefu Chai)
-* nautilus: tools/rados: flush formatter periodically during json output of "rados ls" (`pr#37834 <https://github.com/ceph/ceph/pull/37834>`_, J. Eric Ivancich)
-* nautilus: vstart.sh: fix fs set max_mds bug (`pr#37836 <https://github.com/ceph/ceph/pull/37836>`_, Jinmyeong Lee)
-
-
-v14.2.16 Nautilus
-=================
-
-This is the 16th backport release in the Nautilus series. This release fixes a
-security flaw in CephFS. We recommend users to update to this release.
-
-Notable Changes
----------------
-
-* CVE-2020-27781 : OpenStack Manila use of ceph_volume_client.py library allowed
-  tenant access to any Ceph credential's secret. (Kotresh Hiremath Ravishankar,
-  Ramana Raja)
-
-
-Changelog
----------
-
-* pybind/ceph_volume_client: disallow authorize on existing auth ids (Kotresh
-  Hiremath Ravishankar, Ramana Raja)
-
-
-v14.2.15 Nautilus
-=================
-
-This is the 15th backport release in the Nautilus series. This release fixes a
-ceph-volume regression introduced in v14.2.13 and includes few other fixes. We
-recommend users to update to this release.
-
-Notable Changes
----------------
-
-* ceph-volume: Fixes lvm batch --auto, which breaks backward compatibility
-  when using non rotational devices only (SSD and/or NVMe).
-* BlueStore: Fixes a bug in collection_list_legacy which makes pgs inconsistent
-  during scrub when running mixed versions of osds, prior to 14.2.12 with newer.
-* MGR: progress module can now be turned on/off, using the commands:
-  ``ceph progress on`` and ``ceph progress off``.
-
-Changelog
----------
-
-* ceph-volume: fix filestore/dmcrypt activate (`pr#38198 <https://github.com/ceph/ceph/pull/38198>`_, Guillaume Abrioux)
-* ceph-volume: fix lvm batch auto with full SSDs (`pr#38046 <https://github.com/ceph/ceph/pull/38046>`_, Dimitri Savineau, Guillaume Abrioux)
-* os/bluestore: fix "end reached" check in collection_list_legacy (`pr#38100 <https://github.com/ceph/ceph/pull/38100>`_, Mykola Golub)
-* mgr/progress: introduce turn off/on feature (`pr#38173 <https://github.com/ceph/ceph/pull/38173>`_, kamoltat)
-
-
-v14.2.14 Nautilus
-=================
-
-This is the 14th backport release in the Nautilus series. This release fixes
-a security flaw affecting Messenger v2, among other fixes across components.
-We recommend users to update to this release.
-
-Notable Changes
----------------
-
-* CVE 2020-25660: CEPHX_V2 replay attack protection lost, for Messenger v2 (Ilya Dryomov)
-
-Changelog
----------
-
-* mgr/dashboard: Strange iSCSI discovery auth behavior (`pr#37333 <https://github.com/ceph/ceph/pull/37333>`_, Volker Theile)
-* mgr/dashboard: redirect to original URL after successful login (`pr#36834 <https://github.com/ceph/ceph/pull/36834>`_, Avan Thakkar)
-* mgr/prometheus: add pool compression stats (`pr#37563 <https://github.com/ceph/ceph/pull/37563>`_, Paul Cuzner)
-* bluestore: test/objectstore/store_test: kill ExcessiveFragmentation test case (`pr#37824 <https://github.com/ceph/ceph/pull/37824>`_, Igor Fedotov)
-* bluestore: BlockDevice.cc: use pending_aios instead of iovec size as ios num (`pr#37823 <https://github.com/ceph/ceph/pull/37823>`_, weixinwei)
-* bluestore: Support flock retry (`pr#37842 <https://github.com/ceph/ceph/pull/37842>`_, Kefu Chai, wanghongxu)
-* bluestore: attach csum for compressed blobs (`pr#37843 <https://github.com/ceph/ceph/pull/37843>`_, Igor Fedotov)
-* osdc/ObjectCacher: overwrite might cause stray read request callbacks (`pr#37813 <https://github.com/ceph/ceph/pull/37813>`_, Jason Dillaman)
-* mgr: avoid false alarm of MGR_MODULE_ERROR (`pr#38069 <https://github.com/ceph/ceph/pull/38069>`_, Kefu Chai, Sage Weil)
-* mgr: fix race between module load and notify (`pr#37844 <https://github.com/ceph/ceph/pull/37844>`_, Mykola Golub, Patrick Donnelly)
-* mon: set session_timeout when adding to session_map (`pr#37554 <https://github.com/ceph/ceph/pull/37554>`_, Ilya Dryomov)
-* mon/MonClient: bring back CEPHX_V2 authorizer challenges (Ilya Dryomov)
-* osd/osd-rep-recov-eio.sh: TEST_rados_repair_warning:  return 1 (`pr#37815 <https://github.com/ceph/ceph/pull/37815>`_, David Zafman)
-* rbd: librbd: ignore -ENOENT error when disabling object-map (`pr#37814 <https://github.com/ceph/ceph/pull/37814>`_, Jason Dillaman)
-* rbd: rbd-nbd: don't ignore namespace when unmapping by image spec (`pr#37811 <https://github.com/ceph/ceph/pull/37811>`_, Mykola Golub)
-* rgw/rgw_file: Fix the incorrect lru object eviction (`pr#37804 <https://github.com/ceph/ceph/pull/37804>`_, luo rixin)
-* rgw: fix expiration header returned even if there is only one tag in the object the same as the rule (`pr#37806 <https://github.com/ceph/ceph/pull/37806>`_, Or Friedmann)
-* rgw: fix: S3 API KeyCount incorrect return (`pr#37810 <https://github.com/ceph/ceph/pull/37810>`_, 胡玮文)
-* rgw: radosgw-admin should paginate internally when listing bucket (`pr#37802 <https://github.com/ceph/ceph/pull/37802>`_, J. Eric Ivancich)
-* rgw: rgw_file: avoid long-ish delay on shutdown (`pr#37552 <https://github.com/ceph/ceph/pull/37552>`_, Matt Benjamin)
-* rgw: use yum rather than dnf for teuthology testing of rgw-orphan-list (`pr#37805 <https://github.com/ceph/ceph/pull/37805>`_, J. Eric Ivancich)
-
-
-v14.2.13 Nautilus
-=================
-
-This is the 13th backport release in the Nautilus series. This release fixes a
-regression introduced in v14.2.12, and a few ceph-volume & RGW fixes. We
-recommend users to update to this release.
-
-Notable Changes
----------------
-
-* Fixed a regression that caused breakage in clusters that referred to ceph-mon
-  hosts using dns names instead of ip addresses in the ``mon_host`` param in
-  ``ceph.conf`` (`issue#47951 <https://tracker.ceph.com/issues/47951>`_)
-
-* ceph-volume: the ``lvm batch`` subcommand received a major rewrite
-
-Changelog
----------
-
-* ceph-volume: major batch refactor (`pr#37522 <https://github.com/ceph/ceph/pull/37522>`_, Jan Fajerski)
-* mgr/dashboard: Proper format iSCSI target portals (`pr#37060 <https://github.com/ceph/ceph/pull/37060>`_, Volker Theile)
-* rpm: move python-enum34 into rhel 7 conditional (`pr#37747 <https://github.com/ceph/ceph/pull/37747>`_, Nathan Cutler)
-* mon/MonMap: fix unconditional failure for init_with_hosts (`pr#37816 <https://github.com/ceph/ceph/pull/37816>`_, Nathan Cutler, Patrick Donnelly)
-* rgw: allow rgw-orphan-list to note when rados objects are in namespace (`pr#37799 <https://github.com/ceph/ceph/pull/37799>`_, J. Eric Ivancich)
-* rgw: fix setting of namespace in ordered and unordered bucket listing (`pr#37798 <https://github.com/ceph/ceph/pull/37798>`_, J. Eric Ivancich)
-
-
-v14.2.12 Nautilus
-=================
-
-This is the 12th backport release in the Nautilus series. This release
-brings a number of bugfixes across all major components of Ceph. We recommend
-that all Nautilus users upgrade to this release.
-
-Notable Changes
----------------
-
-* The ``ceph df`` command now lists the number of pgs in each pool.
-
-* Monitors now have a config option ``mon_osd_warn_num_repaired``, 10 by default.
-  If any OSD has repaired more than this many I/O errors in stored data a
-  ``OSD_TOO_MANY_REPAIRS`` health warning is generated.  In order to allow
-  clearing of the warning, a new command ``ceph tell osd.# clear_shards_repaired [count]``
-  has been added.  By default it will set the repair count to 0.  If you wanted
-  to be warned again if additional repairs are performed you can provide a value
-  to the command and specify the value of ``mon_osd_warn_num_repaired``.
-  This command will be replaced in future releases by the health mute/unmute feature.
-
-* It is now possible to specify the initial monitor to contact for Ceph tools
-  and daemons using the ``mon_host_override`` config option or
-  ``--mon-host-override <ip>`` command-line switch. This generally should only
-  be used for debugging and only affects initial communication with Ceph's
-  monitor cluster.
-
-* Fix an issue with osdmaps not being trimmed in a healthy cluster (`issue#47296
-  <https://tracker.ceph.com/issues/47296>`_, `pr#36982
-  <https://github.com/ceph/ceph/pull/36982>`_)
-
-Changelog
----------
-* bluestore/bluefs: make accounting resiliant to unlock() (`pr#36909 <https://github.com/ceph/ceph/pull/36909>`_, Adam Kupczyk)
-* bluestore: Rescue procedure for extremely large bluefs log (`pr#36930 <https://github.com/ceph/ceph/pull/36930>`_, Adam Kupczyk)
-* bluestore: dump onode that has too many spanning blobs (`pr#36756 <https://github.com/ceph/ceph/pull/36756>`_, Igor Fedotov)
-* bluestore: enable more flexible bluefs space management by default (`pr#37091 <https://github.com/ceph/ceph/pull/37091>`_, Igor Fedotov)
-* bluestore: fix collection_list ordering (`pr#37051 <https://github.com/ceph/ceph/pull/37051>`_, Mykola Golub)
-* ceph-iscsi: selinux fixes (`pr#36304 <https://github.com/ceph/ceph/pull/36304>`_, Mike Christie)
-* ceph-volume: add tests for new functions that run LVM commands (`pr#36615 <https://github.com/ceph/ceph/pull/36615>`_, Rishabh Dave)
-* ceph-volume: dont use container classes in api/lvm.py (`pr#35878 <https://github.com/ceph/ceph/pull/35878>`_, Guillaume Abrioux, Rishabh Dave')
-* ceph-volume: fix journal size argument not work (`pr#37377 <https://github.com/ceph/ceph/pull/37377>`_, wanghongxu)
-* ceph-volume: fix simple activate when legacy osd (`pr#37195 <https://github.com/ceph/ceph/pull/37195>`_, Guillaume Abrioux)
-* ceph-volume: fix test_lvm.TestVolume.test_is_not_ceph_device (`pr#36493 <https://github.com/ceph/ceph/pull/36493>`_, Jan Fajerski)
-* ceph-volume: handle idempotency with batch and explicit scenarios (`pr#35881 <https://github.com/ceph/ceph/pull/35881>`_, Andrew Schoen)
-* ceph-volume: remove container classes from api/lvm.py (`pr#36610 <https://github.com/ceph/ceph/pull/36610>`_, Rishabh Dave)
-* ceph-volume: remove unneeded call to get_devices() (`pr#37413 <https://github.com/ceph/ceph/pull/37413>`_, Marc Gariepy)
-* ceph-volume: report correct rejected reason in inventory if device type is invalid (`pr#36453 <https://github.com/ceph/ceph/pull/36453>`_, Satoru Takeuchi)
-* ceph-volume: retry when acquiring lock fails (`pr#36926 <https://github.com/ceph/ceph/pull/36926>`_, S\xc3\xa9bastien Han)
-* ceph-volume: simple scan should ignore tmpfs (`pr#36952 <https://github.com/ceph/ceph/pull/36952>`_, Andrew Schoen)
-* ceph.in: ignore failures to flush stdout (`pr#37226 <https://github.com/ceph/ceph/pull/37226>`_, Dan van der Ster)
-* ceph.spec.in, debian/control: add smartmontools and nvme-cli dependen\xe2\x80\xa6 (`pr#37288 <https://github.com/ceph/ceph/pull/37288>`_, Yaarit Hatuka)
-* cephfs-journal-tool: fix incorrect read_offset when finding missing objects (`pr#37479 <https://github.com/ceph/ceph/pull/37479>`_, Xue Yantao)
-* cephfs: client: fix extra open ref decrease (`pr#36966 <https://github.com/ceph/ceph/pull/36966>`_, Xiubo Li)
-* cephfs: client: make Client::open() pass proper cap mask to path_walk (`pr#37231 <https://github.com/ceph/ceph/pull/37231>`_, "Yan, Zheng")
-* cephfs: mds/CInode: Optimize only pinned by subtrees check (`pr#36965 <https://github.com/ceph/ceph/pull/36965>`_, Mark Nelson)
-* cephfs: mds: After restarting an mds, its standy-replay mds remained in the "resolve" state (`pr#37179 <https://github.com/ceph/ceph/pull/37179>`_, Wei Qiaomiao)
-* cephfs: mds: do not defer incoming mgrmap when mds is laggy (`issue#44638 <http://tracker.ceph.com/issues/44638>`_, `pr#36168 <https://github.com/ceph/ceph/pull/36168>`_, Nathan Cutler, Venky Shankar)
-* cephfs: mds: fix incorrect check for if dirfrag is being fragmented (`pr#37035 <https://github.com/ceph/ceph/pull/37035>`_, "Yan, Zheng")
-* cephfs: mds: fix mds forwarding request no_available_op_found (`pr#36963 <https://github.com/ceph/ceph/pull/36963>`_, Yanhu Cao')
-* cephfs: mds: fix purge_queues _calculate_ops is inaccurate (`pr#37481 <https://github.com/ceph/ceph/pull/37481>`_, Yanhu Cao')
-* cephfs: mds: kcephfs parse dirfrags ndist is always 0 (`pr#37177 <https://github.com/ceph/ceph/pull/37177>`_, Yanhu Cao')
-* cephfs: mds: place MDSGatherBuilder on the stack (`pr#36967 <https://github.com/ceph/ceph/pull/36967>`_, Patrick Donnelly)
-* cephfs: mds: recover files after normal session close (`pr#37178 <https://github.com/ceph/ceph/pull/37178>`_, "Yan, Zheng")
-* cephfs: mds: resolve SIGSEGV in waiting for uncommitted fragments (`pr#36968 <https://github.com/ceph/ceph/pull/36968>`_, Patrick Donnelly)
-* cephfs: osdc/Journaler: do not call onsafe->complete() if onsafe is 0 (`pr#37229 <https://github.com/ceph/ceph/pull/37229>`_, Xiubo Li)
-* client: handle readdir reply without Fs cap (`pr#37232 <https://github.com/ceph/ceph/pull/37232>`_, "Yan, Zheng")
-* common, osd: add sanity checks around osd_scrub_max_preemptions (`pr#37470 <https://github.com/ceph/ceph/pull/37470>`_, xie xingguo)
-* common/config: less noise about configs from mon we cant apply (`pr#36289 <https://github.com/ceph/ceph/pull/36289>`_, Sage Weil')
-* common:  ignore SIGHUP prior to fork (`issue#46269 <http://tracker.ceph.com/issues/46269>`_, `pr#36181 <https://github.com/ceph/ceph/pull/36181>`_, Willem Jan Withagen, hzwuhongsong)
-* compressor: Add a config option to specify Zstd compression level (`pr#37254 <https://github.com/ceph/ceph/pull/37254>`_, Bryan Stillwell)
-* core: include/encoding: Fix encode/decode of float types on big-endian systems (`pr#37033 <https://github.com/ceph/ceph/pull/37033>`_, Ulrich Weigand)
-* doc/rados: Fix osd_op_queue default value (`pr#36354 <https://github.com/ceph/ceph/pull/36354>`_, Beno\xc3\xaet Knecht)
-* doc/rados: Fix osd_scrub_during_recovery default value (`pr#37472 <https://github.com/ceph/ceph/pull/37472>`_, Beno\xc3\xaet Knecht)
-* doc/rbd: add rbd-target-gw enable and start (`pr#36415 <https://github.com/ceph/ceph/pull/36415>`_, Zac Dover)
-* doc: enable Read the Docs (`pr#37204 <https://github.com/ceph/ceph/pull/37204>`_, Kefu Chai)
-* krbd: optionally skip waiting for udev events (`pr#37284 <https://github.com/ceph/ceph/pull/37284>`_, Ilya Dryomov)
-* kv/RocksDBStore: make options compaction_threads/disableWAL/flusher_t\xe2\x80\xa6 (`pr#37055 <https://github.com/ceph/ceph/pull/37055>`_, Jianpeng Ma)
-* librados: add LIBRADOS_SUPPORTS_GETADDRS support (`pr#36853 <https://github.com/ceph/ceph/pull/36853>`_, Xiubo Li, Jason Dillaman, Kaleb S. KEITHLEY, Kefu Chai)
-* messages,mds: Fix decoding of enum types on big-endian systems (`pr#36814 <https://github.com/ceph/ceph/pull/36814>`_, Ulrich Weigand)
-* mgr/balancer: use "==" and "!=" for comparing str (`pr#37471 <https://github.com/ceph/ceph/pull/37471>`_, Kefu Chai)
-* mgr/dashboard/api: increase API health timeout (`pr#36607 <https://github.com/ceph/ceph/pull/36607>`_, Ernesto Puerta)
-* mgr/dashboard: Allow editing iSCSI targets with initiators logged-in (`pr#37278 <https://github.com/ceph/ceph/pull/37278>`_, Tiago Melo)
-* mgr/dashboard: Disabling the form inputs for the read_only modals (`pr#37241 <https://github.com/ceph/ceph/pull/37241>`_, Nizamudeen)
-* mgr/dashboard: Dont use any xlf file when building the default language (`pr#37550 <https://github.com/ceph/ceph/pull/37550>`_, Sebastian Krah')
-* mgr/dashboard: Fix many-to-many issue in host-details Grafana dashboard (`pr#37306 <https://github.com/ceph/ceph/pull/37306>`_, Patrick Seidensal)
-* mgr/dashboard: Fix pool renaming functionality (`pr#37510 <https://github.com/ceph/ceph/pull/37510>`_, Stephan M\xc3\xbcller, Ernesto Puerta)
-* mgr/dashboard: Hide table action input field if limit=0 (`pr#36783 <https://github.com/ceph/ceph/pull/36783>`_, Volker Theile)
-* mgr/dashboard: Monitoring: Fix for the infinite loading bar action (`pr#37161 <https://github.com/ceph/ceph/pull/37161>`_, Nizamudeen A)
-* mgr/dashboard: REST API returns 500 when no Content-Type is specified (`pr#37307 <https://github.com/ceph/ceph/pull/37307>`_, Avan Thakkar)
-* mgr/dashboard: Unable to edit iSCSI logged-in client (`pr#36613 <https://github.com/ceph/ceph/pull/36613>`_, Ricardo Marques)
-* mgr/dashboard: cpu stats incorrectly displayed (`pr#37295 <https://github.com/ceph/ceph/pull/37295>`_, Avan Thakkar)
-* mgr/dashboard: document Prometheus security model (`pr#36920 <https://github.com/ceph/ceph/pull/36920>`_, Patrick Seidensal)
-* mgr/dashboard: fix broken backporting (`pr#37505 <https://github.com/ceph/ceph/pull/37505>`_, Ernesto Puerta)
-* mgr/dashboard: fix perf. issue when listing large amounts of buckets (`pr#37280 <https://github.com/ceph/ceph/pull/37280>`_, Alfonso Mart\xc3\xadnez)
-* mgr/dashboard: fix pool usage calculation (`pr#37309 <https://github.com/ceph/ceph/pull/37309>`_, Ernesto Puerta)
-* mgr/dashboard: remove "This week/month/year" and "Today" time stamps (`pr#36790 <https://github.com/ceph/ceph/pull/36790>`_, Avan Thakkar)
-* mgr/dashboard: table detail rows overflow (`pr#37324 <https://github.com/ceph/ceph/pull/37324>`_, Aashish Sharma)
-* mgr/dashboard: wait longer for health status to be cleared (`pr#36784 <https://github.com/ceph/ceph/pull/36784>`_, Tatjana Dehler)
-* mgr/devicehealth: fix daemon filtering before scraping device (`pr#36741 <https://github.com/ceph/ceph/pull/36741>`_, Yaarit Hatuka)
-* mgr/diskprediction_local: Fix array size error (`pr#36578 <https://github.com/ceph/ceph/pull/36578>`_, Beno\xc3\xaet Knecht)
-* mgr/prometheus: automatically discover RBD pools for stats gathering (`pr#36412 <https://github.com/ceph/ceph/pull/36412>`_, Jason Dillaman)
-* mgr/restful: use dict.items() for py3 compatible (`pr#36670 <https://github.com/ceph/ceph/pull/36670>`_, Kefu Chai)
-* mgr/status: metadata is fetched async (`pr#37558 <https://github.com/ceph/ceph/pull/37558>`_, Michael Fritch)
-* mgr/telemetry: fix device id splitting when anonymizing serial (`pr#37318 <https://github.com/ceph/ceph/pull/37318>`_, Yaarit Hatuka)
-* mgr/volumes: add global lock debug (`pr#36828 <https://github.com/ceph/ceph/pull/36828>`_, Patrick Donnelly)
-* mgr: Add missing states to PG_STATES in mgr_module.py (`pr#36785 <https://github.com/ceph/ceph/pull/36785>`_, Harley Gorrell)
-* mgr: decrease pool stats if pg was removed (`pr#37476 <https://github.com/ceph/ceph/pull/37476>`_, Aleksei Gutikov)
-* mgr: don't update pending service map epoch on receiving map from mon (`pr#37181 <https://github.com/ceph/ceph/pull/37181>`_, Mykola Golub')
-* minor tweaks to fix compile issues under latest Fedora (`pr#36726 <https://github.com/ceph/ceph/pull/36726>`_, Willem Jan Withagen, Kaleb S. KEITHLEY, Kefu Chai)
-* mon/OSDMonitor: only take in osd into consideration when trimming osdmaps (`pr#36982 <https://github.com/ceph/ceph/pull/36982>`_, Kefu Chai)
-* mon/PGMap: add pg count for pools in the ceph df command (`pr#36944 <https://github.com/ceph/ceph/pull/36944>`_, Vikhyat Umrao)
-* mon: Warn when too many reads are repaired on an OSD (`pr#36379 <https://github.com/ceph/ceph/pull/36379>`_, David Zafman)
-* mon: fix the \Error ERANGE\ message when conf "osd_objectstore" is filestore' (`pr#37474 <https://github.com/ceph/ceph/pull/37474>`_, wangyunqing')
-* mon: mark pgtemp messages as no_reply more consistenly in preprocess\\_\xe2\x80\xa6 (`pr#37171 <https://github.com/ceph/ceph/pull/37171>`_, Greg Farnum)
-* mon: store mon updates in ceph context for future MonMap instantiation (`pr#36704 <https://github.com/ceph/ceph/pull/36704>`_, Patrick Donnelly, Shyamsundar Ranganathan)
-* monclient: schedule first tick using mon_client_hunt_interval (`pr#36634 <https://github.com/ceph/ceph/pull/36634>`_, Mykola Golub)
-* msg/async/ProtocolV2: allow rxbuf/txbuf get bigger in testing (`pr#37081 <https://github.com/ceph/ceph/pull/37081>`_, Ilya Dryomov)
-* osd/OSDCap: rbd profile permits use of "rbd_info" (`pr#36413 <https://github.com/ceph/ceph/pull/36413>`_, Florian Florensa)
-* osd/PeeringState: prevent peers num_objects going negative (`pr#37473 <https://github.com/ceph/ceph/pull/37473>`_, xie xingguo')
-* prometheus: Properly split the port off IPv6 addresses (`pr#36984 <https://github.com/ceph/ceph/pull/36984>`_, Matthew Oliver)
-* rbd: include RADOS namespace in krbd symlinks (`pr#37468 <https://github.com/ceph/ceph/pull/37468>`_, Ilya Dryomov)
-* rbd: librbd: Align rbd_write_zeroes declarations (`pr#36712 <https://github.com/ceph/ceph/pull/36712>`_, Corey Bryant)
-* rbd: librbd: dont resend async_complete if watcher is unregistered (`pr#37040 <https://github.com/ceph/ceph/pull/37040>`_, Mykola Golub')
-* rbd: librbd: global and pool-level config overrides require image refresh to apply (`pr#36725 <https://github.com/ceph/ceph/pull/36725>`_, Jason Dillaman)
-* rbd: librbd: using migration abort can result in the loss of data (`pr#37165 <https://github.com/ceph/ceph/pull/37165>`_, Jason Dillaman)
-* rbd: make common options override krbd-specific options (`pr#37407 <https://github.com/ceph/ceph/pull/37407>`_, Ilya Dryomov)
-* rgw/cls: preserve olh entrys name on last unlink (`pr#37462 <https://github.com/ceph/ceph/pull/37462>`_, Casey Bodley')
-* rgw: Add bucket name to bucket stats error logging (`pr#37378 <https://github.com/ceph/ceph/pull/37378>`_, Seena Fallah)
-* rgw: Empty reqs_change_state queue before unregistered_reqs (`pr#37461 <https://github.com/ceph/ceph/pull/37461>`_, Soumya Koduri)
-* rgw: Expiration days cant be zero and  transition days can be zero (`pr#37465 <https://github.com/ceph/ceph/pull/37465>`_, zhang Shaowen')
-* rgw: RGWObjVersionTracker tracks version over increments (`pr#37459 <https://github.com/ceph/ceph/pull/37459>`_, Casey Bodley)
-* rgw: Swift API anonymous access should 401 (`pr#37438 <https://github.com/ceph/ceph/pull/37438>`_, Matthew Oliver)
-* rgw: add access log to the beast frontend (`pr#36727 <https://github.com/ceph/ceph/pull/36727>`_, Mark Kogan)
-* rgw: add negative cache to the system object (`pr#37460 <https://github.com/ceph/ceph/pull/37460>`_, Or Friedmann)
-* rgw: append obj: prevent tail from being GCed (`pr#36390 <https://github.com/ceph/ceph/pull/36390>`_, Abhishek Lekshmanan')
-* rgw: dump transitions in RGWLifecycleConfiguration::dump() (`pr#36880 <https://github.com/ceph/ceph/pull/36880>`_, Shengming Zhang)
-* rgw: fail when get/set-bucket-versioning attempted on a non-existent \xe2\x80\xa6 (`pr#36188 <https://github.com/ceph/ceph/pull/36188>`_, Matt Benjamin)
-* rgw: fix boost::asio::async_write() does not return error (`pr#37157 <https://github.com/ceph/ceph/pull/37157>`_, Mark Kogan)
-* rgw: fix double slash (//) killing the gateway (`pr#36682 <https://github.com/ceph/ceph/pull/36682>`_, Theofilos Mouratidis)
-* rgw: fix shutdown crash in RGWAsyncReadMDLogEntries (`pr#37463 <https://github.com/ceph/ceph/pull/37463>`_, Casey Bodley)
-* rgw: hold reloader using unique_ptr (`pr#36770 <https://github.com/ceph/ceph/pull/36770>`_, Kefu Chai)
-* rgw: log resharding events at level 1 (formerly 20) (`pr#36843 <https://github.com/ceph/ceph/pull/36843>`_, Or Friedmann)
-* rgw: ordered bucket listing code clean-up (`pr#37169 <https://github.com/ceph/ceph/pull/37169>`_, J. Eric Ivancich)
-* rgw: policy: reuse eval_principal to evaluate the policy principal (`pr#36637 <https://github.com/ceph/ceph/pull/36637>`_, Abhishek Lekshmanan)
-* rgw: radosgw-admin: period pull command is not always a raw_storage_op (`pr#37464 <https://github.com/ceph/ceph/pull/37464>`_, Casey Bodley)
-* rgw: replace \+\ with "%20" in canonical query string for s3 v4 auth' (`pr#37467 <https://github.com/ceph/ceph/pull/37467>`_, yuliyang_yewu')
-* rgw: urlencode bucket name when forwarding request (`pr#37435 <https://github.com/ceph/ceph/pull/37435>`_, caolei)
-* run-make-check.sh: extract run-make.sh + run sudo with absolute path (`pr#36494 <https://github.com/ceph/ceph/pull/36494>`_, Kefu Chai, Ernesto Puerta)
-* systemd: Support Graceful Reboot for AIO Node (`pr#37301 <https://github.com/ceph/ceph/pull/37301>`_, Wong Hoi Sing Edison)
-* tools/osdmaptool.cc: add ability to clean_temps (`pr#37477 <https://github.com/ceph/ceph/pull/37477>`_, Neha Ojha)
-* tools/rados: Set locator key when exporting or importing a pool (`pr#37475 <https://github.com/ceph/ceph/pull/37475>`_, Iain Buclaw)
-
-
-v14.2.11 Nautilus
-=================
-
-This is the eleventh backport release in the Nautilus series. This release
-brings a number of bugfixes across all major components of Ceph. We recommend
-that all Nautilus users upgrade to this release.
-
-Notable Changes
----------------
-
-* RGW: The ``radosgw-admin`` sub-commands dealing with orphans --
-  ``radosgw-admin orphans find``, ``radosgw-admin orphans finish``,
-  ``radosgw-admin orphans list-jobs`` -- have been deprecated. They
-  have not been actively maintained and they store intermediate
-  results on the cluster, which could fill a nearly-full cluster.
-  They have been replaced by a tool, currently considered
-  experimental, ``rgw-orphan-list``.
-
-* Now when noscrub and/or nodeep-scrub flags are set globally or per pool,
-  scheduled scrubs of the type disabled will be aborted. All user initiated
-  scrubs are NOT interrupted.
-
-* Fixed a ceph-osd crash in _committed_osd_maps when there is a failure to encode
-  the first incremental map. `issue#46443 <https://tracker.ceph.com/issues/46443>`_
-
-Changelog
----------
-
-* bluestore: core: os/bluestore: fix large (>2GB) writes when bluefs_buffered_io = true (`pr#35404 <https://github.com/ceph/ceph/pull/35404>`_, Igor Fedotov)
-* bluestore: os/bluestore: implement Hybrid allocator (`pr#35500 <https://github.com/ceph/ceph/pull/35500>`_, Adam Kupczyk, Kefu Chai, Igor Fedotov, xie xingguo)
-* build/ops: build/ops: selinux: allow ceph_t amqp_port_t:tcp_socket (`pr#36190 <https://github.com/ceph/ceph/pull/36190>`_, Kaleb S. KEITHLEY, Thomas Serlin)
-* ceph-volume: add dmcrypt support in raw mode (`pr#35831 <https://github.com/ceph/ceph/pull/35831>`_, Guillaume Abrioux)
-* cephfs,pybind: pybind/cephfs: fix custom exception raised by cephfs.pyx (`pr#36180 <https://github.com/ceph/ceph/pull/36180>`_, Ramana Raja)
-* cephfs: ceph_fuse: add the '-d' option back for libfuse (`pr#35398 <https://github.com/ceph/ceph/pull/35398>`_, Xiubo Li)
-* cephfs: client: fix directory inode can not call release callback (`pr#36177 <https://github.com/ceph/ceph/pull/36177>`_, sepia-liu)
-* cephfs: client: fix setxattr for 0 size value (NULL value) (`pr#36173 <https://github.com/ceph/ceph/pull/36173>`_, Sidharth Anupkrishnan)
-* cephfs: client: fix snap directory atime (`pr#36169 <https://github.com/ceph/ceph/pull/36169>`_, Luis Henriques)
-* cephfs: client: introduce timeout for client shutdown (`issue#44276 <http://tracker.ceph.com/issues/44276>`_, `pr#36215 <https://github.com/ceph/ceph/pull/36215>`_, Venky Shankar)
-* cephfs: client: release the client_lock before copying data in read (`pr#36294 <https://github.com/ceph/ceph/pull/36294>`_, Chencan)
-* cephfs: client: static dirent for readdir is not thread-safe (`pr#36511 <https://github.com/ceph/ceph/pull/36511>`_, Patrick Donnelly)
-* cephfs: mds: add config to require forward to auth MDS (`pr#35377 <https://github.com/ceph/ceph/pull/35377>`_, simon gao)
-* cephfs: mds: cleanup uncommitted fragments before mds goes to active (`pr#35397 <https://github.com/ceph/ceph/pull/35397>`_, "Yan, Zheng")
-* cephfs: mds: do not raise "client failing to respond to cap release" when client working set is reasonable (`pr#36513 <https://github.com/ceph/ceph/pull/36513>`_, Patrick Donnelly)
-* cephfs: mds: do not submit omap_rm_keys if the dir is the basedir of merge (`pr#36178 <https://github.com/ceph/ceph/pull/36178>`_, Chencan)
-* cephfs: mds: fix filelock state when Fc is issued (`pr#35841 <https://github.com/ceph/ceph/pull/35841>`_, Xiubo Li)
-* cephfs: mds: fix hang issue when accessing a file under a lost parent directory (`pr#36179 <https://github.com/ceph/ceph/pull/36179>`_, Zhi Zhang)
-* cephfs: mds: fix nullptr dereference in MDCache::finish_rollback (`pr#36439 <https://github.com/ceph/ceph/pull/36439>`_, "Yan, Zheng")
-* cephfs: mds: flag backtrace scrub failures for new files as okay (`pr#35400 <https://github.com/ceph/ceph/pull/35400>`_, Milind Changire)
-* cephfs: mds: initialize MDSlaveUpdate::waiter (`pr#36462 <https://github.com/ceph/ceph/pull/36462>`_, "Yan, Zheng")
-* cephfs: mds: make threshold for MDS_TRIM configurable (`pr#36175 <https://github.com/ceph/ceph/pull/36175>`_, Paul Emmerich)
-* cephfs: mds: preserve ESlaveUpdate logevent until receiving OP_FINISH (`pr#35394 <https://github.com/ceph/ceph/pull/35394>`_, Varsha Rao, songxinying)
-* cephfs: mds: reset heartbeat in EMetaBlob replay (`pr#36170 <https://github.com/ceph/ceph/pull/36170>`_, Yanhu Cao)
-* cephfs: mgr/fs/volumes misc fixes (`pr#36167 <https://github.com/ceph/ceph/pull/36167>`_, Patrick Donnelly, Kotresh HR, Ramana Raja)
-* cephfs: mgr/volumes: Add snapshot info command (`pr#35672 <https://github.com/ceph/ceph/pull/35672>`_, Kotresh HR)
-* cephfs: mgr/volumes: Deprecate protect/unprotect CLI calls for subvolume snapshots (`pr#36166 <https://github.com/ceph/ceph/pull/36166>`_, Shyamsundar Ranganathan)
-* cephfs: qa: add debugging for volumes plugin use of libcephfs (`pr#36512 <https://github.com/ceph/ceph/pull/36512>`_, Patrick Donnelly)
-* cephfs: qa: skip cache_size check (`pr#36526 <https://github.com/ceph/ceph/pull/36526>`_, Patrick Donnelly)
-* cephfs: tools/cephfs: don't bind to public_addr (`pr#35401 <https://github.com/ceph/ceph/pull/35401>`_, "Yan, Zheng")
-* cephfs: vstart_runner: set mounted to True at the end of mount() (`pr#35396 <https://github.com/ceph/ceph/pull/35396>`_, Rishabh Dave)
-* core,mon: mon/OSDMonitor: Reset grace period if failure interval exceeds a threshold (`pr#35798 <https://github.com/ceph/ceph/pull/35798>`_, Sridhar Seshasayee)
-* core: mgr/DaemonServer.cc: make 'config show' on fsid work (`pr#36074 <https://github.com/ceph/ceph/pull/36074>`_, Neha Ojha)
-* core: mgr/alert: can't set inventory_cache_timeout/service_cache_timeout from CLI (`pr#36104 <https://github.com/ceph/ceph/pull/36104>`_, Kiefer Chang)
-* core: osd/PG: fix history.same_interval_since of merge target again (`pr#36161 <https://github.com/ceph/ceph/pull/36161>`_, xie xingguo)
-* core: osd/PeeringState.h: Fix pg stuck in WaitActingChange (`pr#35389 <https://github.com/ceph/ceph/pull/35389>`_, chen qiuzhang)
-* core: osd: Cancel in-progress scrubs (not user requested) (`pr#36292 <https://github.com/ceph/ceph/pull/36292>`_, David Zafman)
-* core: osd: fix crash in _committed_osd_maps if incremental osdmap crc fails (`pr#36339 <https://github.com/ceph/ceph/pull/36339>`_, Neha Ojha, Dan van der Ster)
-* core: osd: make "missing incremental map" a debug log message (`pr#35386 <https://github.com/ceph/ceph/pull/35386>`_, Nathan Cutler)
-* core: osd: make message cap option usable again (`pr#35738 <https://github.com/ceph/ceph/pull/35738>`_, Neha Ojha, Josh Durgin)
-* mgr/dashboard: Allow to edit iSCSI target with active session (`pr#35998 <https://github.com/ceph/ceph/pull/35998>`_, Ricardo Marques)
-* mgr/dashboard: Prevent dashboard breakdown on bad pool selection (`pr#35367 <https://github.com/ceph/ceph/pull/35367>`_, Stephan Müller)
-* mgr/dashboard: Prometheus query error in the metrics of Pools, OSDs and RBD images (`pr#35884 <https://github.com/ceph/ceph/pull/35884>`_, Avan Thakkar)
-* mgr/dashboard: add popover list of Stand-by Managers & Metadata Servers (MDS) in landing page (`pr#34095 <https://github.com/ceph/ceph/pull/34095>`_, Kiefer Chang, Avan Thakkar)
-* mgr/dashboard: fix Source column i18n issue in RBD configuration tables (`pr#35822 <https://github.com/ceph/ceph/pull/35822>`_, Kiefer Chang)
-* mgr/k8sevents: sanitise kubernetes events (`pr#35563 <https://github.com/ceph/ceph/pull/35563>`_, Paul Cuzner)
-* mgr/prometheus: improve Prometheus module cache (`pr#35918 <https://github.com/ceph/ceph/pull/35918>`_, Patrick Seidensal)
-* mgr: mgr/progress: Skip pg_summary update if _events dict is empty (`pr#36075 <https://github.com/ceph/ceph/pull/36075>`_, Manuel Lausch)
-* mgr: mgr/telemetry: force --license when sending while opted-out (`pr#35390 <https://github.com/ceph/ceph/pull/35390>`_, Yaarit Hatuka)
-* mgr: mon/PGMap: do not consider changing pg stuck (`pr#35959 <https://github.com/ceph/ceph/pull/35959>`_, Kefu Chai)
-* monitoring: fixing some issues in RBD detail dashboard (`pr#35464 <https://github.com/ceph/ceph/pull/35464>`_, Kiefer Chang)
-* msgr: New msgr2 crc and secure modes (msgr2.1) (`pr#35733 <https://github.com/ceph/ceph/pull/35733>`_, Jianpeng Ma, Ilya Dryomov)
-* rbd: librbd: new 'write_zeroes' API methods to suppliment the `discard` APIs (`pr#36250 <https://github.com/ceph/ceph/pull/36250>`_, Jason Dillaman)
-* rbd: mgr/dashboard: work with v1 RBD images (`pr#35712 <https://github.com/ceph/ceph/pull/35712>`_, Ernesto Puerta)
-* rbd: rbd: librbd: Watcher should not attempt to re-watch after detecting blacklisting (`pr#35385 <https://github.com/ceph/ceph/pull/35385>`_, Jason Dillaman)
-* rgw,tests: test/rgw: update hadoop versions (`pr#35778 <https://github.com/ceph/ceph/pull/35778>`_, Casey Bodley, Vasu Kulkarni)
-* rgw: Add subuser to OPA request (`pr#36187 <https://github.com/ceph/ceph/pull/36187>`_, Seena Fallah)
-* rgw: Add support wildcard subuser for bucket policy (`pr#36186 <https://github.com/ceph/ceph/pull/36186>`_, Seena Fallah)
-* rgw: add "rgw-orphan-list" tool and "radosgw-admin bucket radoslist ..." (`pr#34127 <https://github.com/ceph/ceph/pull/34127>`_, J. Eric Ivancich)
-* rgw: add check for index entry's existing when adding bucket stats during bucket reshard (`pr#36189 <https://github.com/ceph/ceph/pull/36189>`_, zhang Shaowen)
-* rgw: add quota enforcement to CopyObj (`pr#36184 <https://github.com/ceph/ceph/pull/36184>`_, Casey Bodley)
-* rgw: bucket list/stats truncates for user w/ >1000 buckets (`pr#36165 <https://github.com/ceph/ceph/pull/36165>`_, J. Eric Ivancich)
-* rgw: cls_bucket_list\_(un)ordered should clear results collection (`pr#36163 <https://github.com/ceph/ceph/pull/36163>`_, J. Eric Ivancich)
-* rgw: fix loop problem with swift stat on account (`pr#36185 <https://github.com/ceph/ceph/pull/36185>`_, Marcus Watts)
-* rgw: lc: fix Segmentation Fault when the tag of the object was not found (`pr#36086 <https://github.com/ceph/ceph/pull/36086>`_, yupeng chen, zhuo li)
-* rgw: ordered listing lcv not managed correctly (`pr#35882 <https://github.com/ceph/ceph/pull/35882>`_, J. Eric Ivancich)
-* rgw: radoslist incomplete multipart uploads fix marker progression (`pr#36191 <https://github.com/ceph/ceph/pull/36191>`_, J. Eric Ivancich)
-* rgw: rgw/iam: correcting the result of get role policy (`pr#36193 <https://github.com/ceph/ceph/pull/36193>`_, Pritha Srivastava)
-* rgw: rgw/url: fix amqp urls with vhosts (`pr#35384 <https://github.com/ceph/ceph/pull/35384>`_, Yuval Lifshitz)
-* rgw: stop realm reloader before store shutdown (`pr#36192 <https://github.com/ceph/ceph/pull/36192>`_, Casey Bodley)
-* tools: Add statfs operation to ceph-objecstore-tool (`pr#35713 <https://github.com/ceph/ceph/pull/35713>`_, David Zafman)
-
-
-v14.2.10 Nautilus
-=================
-
-This is the tenth release in the Nautilus series. In addition to fixing
-a security-related bug in RGW, this release brings a number of bugfixes
-across all major components of Ceph. We recommend that all Nautilus users
-upgrade to this release.
-
-Notable Changes
----------------
-
-* CVE-2020-10753: rgw: sanitize newlines in s3 CORSConfiguration's ExposeHeader
-  (William Bowling, Adam Mohammed, Casey Bodley)
-
-* RGW: Bucket notifications now support Kafka endpoints. This requires librdkafka of
-  version 0.9.2 and up. Note that Ubuntu 16.04.6 LTS (Xenial Xerus) has an older
-  version of librdkafka, and would require an update to the library.
-
-* The pool parameter ``target_size_ratio``, used by the pg autoscaler,
-  has changed meaning. It is now normalized across pools, rather than
-  specifying an absolute ratio. For details, see :ref:`pg-autoscaler`.
-  If you have set target size ratios on any pools, you may want to set
-  these pools to autoscale ``warn`` mode to avoid data movement during
-  the upgrade::
-
-    ceph osd pool set <pool-name> pg_autoscale_mode warn
-
-* The behaviour of the ``-o`` argument to the rados tool has been reverted to
-  its original behaviour of indicating an output file. This reverts it to a more
-  consistent behaviour when compared to other tools. Specifying object size is now
-  accomplished by using an upper case O ``-O``.
-
-* The format of MDSs in `ceph fs dump` has changed.
-
-* Ceph will issue a health warning if a RADOS pool's ``size`` is set to 1
-  or in other words the pool is configured with no redundancy. This can
-  be fixed by setting the pool size to the minimum recommended value
-  with::
-
-    ceph osd pool set <pool-name> size <num-replicas>
-
-  The warning can be silenced with::
-
-    ceph config set global mon_warn_on_pool_no_redundancy false
-
-* RGW: bucket listing performance on sharded bucket indexes has been
-  notably improved by heuristically -- and significantly, in many
-  cases -- reducing the number of entries requested from each bucket
-  index shard.
-
-Changelog
----------
-
-* build/ops: address SElinux denials observed in rgw/multisite test run (`pr#34539 <https://github.com/ceph/ceph/pull/34539>`_, Kefu Chai, Kaleb S. Keithley)
-* build/ops: ceph.spec.in: build on el8 (`pr#35599 <https://github.com/ceph/ceph/pull/35599>`_, Kefu Chai, Brad Hubbard, Alfonso Martínez, Nathan Cutler, Sage Weil, luo.runbing)
-* build/ops: cmake: Improve test for 16-byte atomic support on IBM Z (`pr#33716 <https://github.com/ceph/ceph/pull/33716>`_, Ulrich Weigand)
-* build/ops: do_cmake.sh: fix application of -DWITH_RADOSGW_KAFKA_ENDPOINT=OFF (`pr#34008 <https://github.com/ceph/ceph/pull/34008>`_, Nathan Cutler, Kefu Chai)
-* build/ops: install-deps.sh: Use dnf for rhel/centos 8 (`pr#35461 <https://github.com/ceph/ceph/pull/35461>`_, Brad Hubbard)
-* build/ops: rpm: add python3-saml as install dependency (`pr#34475 <https://github.com/ceph/ceph/pull/34475>`_, Kefu Chai, Ernesto Puerta)
-* build/ops: selinux: Allow ceph to setsched (`pr#34433 <https://github.com/ceph/ceph/pull/34433>`_, Brad Hubbard)
-* build/ops: selinux: Allow ceph-mgr access to httpd dir (`pr#34434 <https://github.com/ceph/ceph/pull/34434>`_, Brad Hubbard)
-* build/ops: selinux: Allow getattr access to /proc/kcore (`pr#34870 <https://github.com/ceph/ceph/pull/34870>`_, Brad Hubbard)
-* build/ops: spec: address some warnings raised by RPM 4.15.1 (`pr#34527 <https://github.com/ceph/ceph/pull/34527>`_, Nathan Cutler)
-* ceph-volume/batch: check lvs list before access (`pr#34481 <https://github.com/ceph/ceph/pull/34481>`_, Jan Fajerski)
-* ceph-volume/batch: return success when all devices are filtered (`pr#34478 <https://github.com/ceph/ceph/pull/34478>`_, Jan Fajerski)
-* ceph-volume: add and delete lvm tags in a single lvchange call (`pr#35453 <https://github.com/ceph/ceph/pull/35453>`_, Jan Fajerski)
-* ceph-volume: add ceph.osdspec_affinity tag (`pr#35132 <https://github.com/ceph/ceph/pull/35132>`_, Joshua Schmid)
-* ceph-volume: devices/simple/scan: Fix string in log statement (`pr#34445 <https://github.com/ceph/ceph/pull/34445>`_, Jan Fajerski)
-* ceph-volume: fix nautilus functional tests (`pr#33391 <https://github.com/ceph/ceph/pull/33391>`_, Jan Fajerski)
-* ceph-volume: lvm: get_device_vgs() filter by provided prefix (`pr#33616 <https://github.com/ceph/ceph/pull/33616>`_, Jan Fajerski, Yehuda Sadeh)
-* ceph-volume: prepare: use \*-slots arguments for implicit sizing (`pr#34278 <https://github.com/ceph/ceph/pull/34278>`_, Jan Fajerski)
-* ceph-volume: silence 'ceph-bluestore-tool' failures (`pr#33428 <https://github.com/ceph/ceph/pull/33428>`_, Sébastien Han)
-* ceph-volume: strip _dmcrypt suffix in simple scan json output (`pr#33722 <https://github.com/ceph/ceph/pull/33722>`_, Jan Fajerski)
-* cephfs/tools: add accounted_rstat/rstat when building file dentry (`pr#35185 <https://github.com/ceph/ceph/pull/35185>`_, Xiubo Li)
-* cephfs/tools: cephfs-journal-tool: correctly parse --dry_run argument (`pr#34784 <https://github.com/ceph/ceph/pull/34784>`_, Milind Changire)
-* cephfs: allow pool names with hyphen and period (`pr#35391 <https://github.com/ceph/ceph/pull/35391>`_, Rishabh Dave, Ramana Raja)
-* cephfs: ceph-fuse: link to libfuse3 and pass "-o big_writes" to libfuse if libfuse < 3.0.0 (`pr#34771 <https://github.com/ceph/ceph/pull/34771>`_, Kefu Chai, Xiubo Li, "Yan, Zheng")
-* cephfs: client: expose Client::ll_register_callback via libcephfs (`pr#35393 <https://github.com/ceph/ceph/pull/35393>`_, Kefu Chai, Jeff Layton)
-* cephfs: client: fix Finisher assert failure (`pr#35000 <https://github.com/ceph/ceph/pull/35000>`_, Xiubo Li)
-* cephfs: client: fix bad error handling in lseek SEEK_HOLE / SEEK_DATA (`pr#34308 <https://github.com/ceph/ceph/pull/34308>`_, Jeff Layton)
-* cephfs: client: only set MClientCaps::FLAG_SYNC when flushing dirty auth caps (`pr#35118 <https://github.com/ceph/ceph/pull/35118>`_, Jeff Layton)
-* cephfs: client: reset requested_max_size if file write is not wanted (`pr#34767 <https://github.com/ceph/ceph/pull/34767>`_, "Yan, Zheng")
-* cephfs: mds: Handle blacklisted error in purge queue (`pr#35149 <https://github.com/ceph/ceph/pull/35149>`_, Varsha Rao)
-* cephfs: mds: SIGSEGV in Migrator::export_sessions_flushed (`pr#33751 <https://github.com/ceph/ceph/pull/33751>`_, "Yan, Zheng")
-* cephfs: mds: Using begin() and empty() to iterate the xlist (`pr#34338 <https://github.com/ceph/ceph/pull/34338>`_, Shen Hang, "Yan, Zheng")
-* cephfs: mds: add configurable snapshot limit (`pr#33295 <https://github.com/ceph/ceph/pull/33295>`_, Milind Changire)
-* cephfs: mds: display scrub status in ceph status (`issue#41508 <http://tracker.ceph.com/issues/41508>`_, `issue#42713 <http://tracker.ceph.com/issues/42713>`_, `issue#44520 <http://tracker.ceph.com/issues/44520>`_, `issue#42168 <http://tracker.ceph.com/issues/42168>`_, `issue#42169 <http://tracker.ceph.com/issues/42169>`_, `issue#42569 <http://tracker.ceph.com/issues/42569>`_, `issue#41424 <http://tracker.ceph.com/issues/41424>`_, `issue#42835 <http://tracker.ceph.com/issues/42835>`_, `issue#36370 <http://tracker.ceph.com/issues/36370>`_, `issue#42325 <http://tracker.ceph.com/issues/42325>`_, `pr#30704 <https://github.com/ceph/ceph/pull/30704>`_, Venky Shankar, Patrick Donnelly, Sage Weil, Kefu Chai)
-* cephfs: mds: don't shallow copy when decoding xattr map (`pr#35199 <https://github.com/ceph/ceph/pull/35199>`_, "Yan, Zheng")
-* cephfs: mds: handle bad purge queue item encoding (`pr#34307 <https://github.com/ceph/ceph/pull/34307>`_, "Yan, Zheng")
-* cephfs: mds: handle ceph_assert on blacklisting (`pr#34435 <https://github.com/ceph/ceph/pull/34435>`_, Milind Changire)
-* cephfs: mds: just delete MDSIOContextBase during shutdown (`pr#34343 <https://github.com/ceph/ceph/pull/34343>`_, "Yan, Zheng", Patrick Donnelly)
-* cephfs: mds: take xlock in the order requests start locking (`pr#35392 <https://github.com/ceph/ceph/pull/35392>`_, "Yan, Zheng")
-* common/bl: fix memory corruption in bufferlist::claim_append() (`pr#34516 <https://github.com/ceph/ceph/pull/34516>`_, Radoslaw Zarzynski)
-* common/blkdev: compilation of telemetry and device backports (`pr#33726 <https://github.com/ceph/ceph/pull/33726>`_, Sage Weil, Difan Zhang, Patrick Seidensal, Kefu Chai)
-* common/blkdev: fix some problems with smart scraping (`pr#33421 <https://github.com/ceph/ceph/pull/33421>`_, Sage Weil)
-* common/ceph_time: tolerate mono time going backwards (`pr#34542 <https://github.com/ceph/ceph/pull/34542>`_, Sage Weil)
-* common/options: Disable bluefs_buffered_io by default again (`pr#34297 <https://github.com/ceph/ceph/pull/34297>`_, Mark Nelson)
-* compressor/lz4: work around bug in liblz4 versions <1.8.2 (`pr#35004 <https://github.com/ceph/ceph/pull/35004>`_, Sage Weil, Dan van der Ster)
-* core: bluestore/bdev: initialize size when creating object (`pr#34832 <https://github.com/ceph/ceph/pull/34832>`_, Willem Jan Withagen)
-* core: bluestore: Don't pollute old journal when add new device (`pr#34796 <https://github.com/ceph/ceph/pull/34796>`_, Yang Honggang)
-* core: bluestore: fix 'unused' calculation (`pr#34794 <https://github.com/ceph/ceph/pull/34794>`_, xie xingguo, Igor Fedotov)
-* core: bluestore: fix extent leak after main device expand (`pr#34711 <https://github.com/ceph/ceph/pull/34711>`_, Igor Fedotov)
-* core: bluestore: more flexible DB volume space usage (`pr#33889 <https://github.com/ceph/ceph/pull/33889>`_, Igor Fedotov)
-* core: bluestore: open DB in read-only when expanding DB/WAL (`pr#34611 <https://github.com/ceph/ceph/pull/34611>`_, Igor Fedotov, Jianpeng Ma, Adam Kupczyk)
-* core: bluestore: prevent BlueFS::dirty_files from being leaked when syncing metadata (`pr#34515 <https://github.com/ceph/ceph/pull/34515>`_, Xuehan Xu)
-* core: msg/async/rdma: fix bug event center is blocked by rdma construct connection for transport ib sync msg (`pr#34780 <https://github.com/ceph/ceph/pull/34780>`_, Peng Liu)
-* core: msgr: backport the EventCenter-related fixes (`pr#33820 <https://github.com/ceph/ceph/pull/33820>`_, Radoslaw Zarzynski, Jeff Layton, Kefu Chai)
-* core: rados: prevent ShardedOpWQ suicide_grace drop when waiting for work (`pr#34882 <https://github.com/ceph/ceph/pull/34882>`_, Dan Hill)
-* doc/mgr/telemetry: added device channel details (`pr#33684 <https://github.com/ceph/ceph/pull/33684>`_, Yaarit Hatuka)
-* doc/releases/nautilus: restart OSDs to make them bind to v2 addr (`pr#34524 <https://github.com/ceph/ceph/pull/34524>`_, Nathan Cutler)
-* doc: fix parameter to set pg autoscale mode (`pr#34518 <https://github.com/ceph/ceph/pull/34518>`_, Changcheng Liu)
-* doc: mds-config-ref: update 'mds_log_max_segments' value (`pr#35278 <https://github.com/ceph/ceph/pull/35278>`_, Konstantin Shalygin)
-* doc: reset PendingReleaseNotes following 14.2.8 release (`pr#33863 <https://github.com/ceph/ceph/pull/33863>`_, Nathan Cutler)
-* global: ensure CEPH_ARGS is decoded before early arg processing (`pr#33261 <https://github.com/ceph/ceph/pull/33261>`_, Kefu Chai, Jason Dillaman)
-* mgr/DaemonServer: fix pg merge checks (`pr#34354 <https://github.com/ceph/ceph/pull/34354>`_, Sage Weil)
-* mgr/PyModule: fix missing tracebacks in handle_pyerror() (`pr#34627 <https://github.com/ceph/ceph/pull/34627>`_, Tim Serong)
-* mgr/balancer: tolerate pgs outside of target weight map (`pr#34761 <https://github.com/ceph/ceph/pull/34761>`_, Sage Weil)
-* mgr/dashboard/grafana: Add rbd-image details dashboard (`pr#35248 <https://github.com/ceph/ceph/pull/35248>`_, Enno Gotthold)
-* mgr/dashboard: 'destroyed' view in CRUSH map viewer (`pr#33764 <https://github.com/ceph/ceph/pull/33764>`_, Avan Thakkar)
-* mgr/dashboard: Add more debug information to Dashboard RGW backend (`pr#34399 <https://github.com/ceph/ceph/pull/34399>`_, Volker Theile)
-* mgr/dashboard: Dashboard does not allow you to set norebalance OSD flag (`pr#33927 <https://github.com/ceph/ceph/pull/33927>`_, Nizamudeen)
-* mgr/dashboard: Disable cache for static files (`pr#33763 <https://github.com/ceph/ceph/pull/33763>`_, Tiago Melo)
-* mgr/dashboard: Display the aggregated number of request (`pr#35212 <https://github.com/ceph/ceph/pull/35212>`_, Tiago Melo)
-* mgr/dashboard: Fix HomeTest setup (`pr#35086 <https://github.com/ceph/ceph/pull/35086>`_, Tiago Melo)
-* mgr/dashboard: Fix cherrypy request logging error (`pr#31586 <https://github.com/ceph/ceph/pull/31586>`_, Kiefer Chang)
-* mgr/dashboard: Fix error in unit test caused by timezone (`pr#34473 <https://github.com/ceph/ceph/pull/34473>`_, Tiago Melo)
-* mgr/dashboard: Fix error when listing RBD while deleting or moving (`pr#34120 <https://github.com/ceph/ceph/pull/34120>`_, Tiago Melo)
-* mgr/dashboard: Fix iSCSI's username and password validation (`pr#34550 <https://github.com/ceph/ceph/pull/34550>`_, Tiago Melo)
-* mgr/dashboard: Fixes rbd image 'purge trash' button & modal text (`pr#33697 <https://github.com/ceph/ceph/pull/33697>`_, anurag)
-* mgr/dashboard: Improve workaround to redraw datatables (`pr#34413 <https://github.com/ceph/ceph/pull/34413>`_, Volker Theile)
-* mgr/dashboard: Not able to restrict bucket creation for new user (`pr#34692 <https://github.com/ceph/ceph/pull/34692>`_, Volker Theile)
-* mgr/dashboard: Pool read/write OPS shows too many decimal places (`pr#34039 <https://github.com/ceph/ceph/pull/34039>`_, anurag, Ernesto Puerta)
-* mgr/dashboard: Prevent iSCSI target recreation when editing controls (`pr#34551 <https://github.com/ceph/ceph/pull/34551>`_, Tiago Melo)
-* mgr/dashboard: REST API: OpenAPI docs require internet connection (`pr#33032 <https://github.com/ceph/ceph/pull/33032>`_, Patrick Seidensal)
-* mgr/dashboard: RGW port autodetection does not support "Beast" RGW frontend (`pr#34400 <https://github.com/ceph/ceph/pull/34400>`_, Volker Theile)
-* mgr/dashboard: Refactor Python unittests and controller (`pr#34662 <https://github.com/ceph/ceph/pull/34662>`_, Volker Theile)
-* mgr/dashboard: Repair broken grafana panels (`pr#34417 <https://github.com/ceph/ceph/pull/34417>`_, Kristoffer Grönlund)
-* mgr/dashboard: Searchable objects for table (`pr#32891 <https://github.com/ceph/ceph/pull/32891>`_, Stephan Müller)
-* mgr/dashboard: Tabs does not handle click events (`issue#39326 <http://tracker.ceph.com/issues/39326>`_, `pr#34282 <https://github.com/ceph/ceph/pull/34282>`_, Tiago Melo)
-* mgr/dashboard: UI fixes (`pr#34038 <https://github.com/ceph/ceph/pull/34038>`_, Avan Thakkar)
-* mgr/dashboard: Updated existing E2E tests to match new format (`pr#33024 <https://github.com/ceph/ceph/pull/33024>`_, Nathan Weinberg)
-* mgr/dashboard: Use booleanText pipe (`pr#33234 <https://github.com/ceph/ceph/pull/33234>`_, Alfonso Martínez, Volker Theile)
-* mgr/dashboard: Use default language when running "npm run build" (`pr#33668 <https://github.com/ceph/ceph/pull/33668>`_, Tiago Melo)
-* mgr/dashboard: do not show RGW API keys if only read-only privileges (`pr#33665 <https://github.com/ceph/ceph/pull/33665>`_, Alfonso Martínez)
-* mgr/dashboard: fix COVERAGE_PATH in run-backend-api-tests.sh (`pr#34489 <https://github.com/ceph/ceph/pull/34489>`_, Alfonso Martínez)
-* mgr/dashboard: fix backport #33764 (`pr#34640 <https://github.com/ceph/ceph/pull/34640>`_, Ernesto Puerta)
-* mgr/dashboard: fix error when enabling SSO with cert. file (`pr#34129 <https://github.com/ceph/ceph/pull/34129>`_, Alfonso Martínez)
-* mgr/dashboard: fix py2 strptime ImportError (not thread safe) (`pr#35016 <https://github.com/ceph/ceph/pull/35016>`_, Alfonso Martínez)
-* mgr/dashboard: fixing RBD purge error in backend (`pr#34847 <https://github.com/ceph/ceph/pull/34847>`_, Kiefer Chang)
-* mgr/dashboard: install teuthology using pip (`pr#35174 <https://github.com/ceph/ceph/pull/35174>`_, Nathan Cutler, Kefu Chai)
-* mgr/dashboard: list configured prometheus alerts (`pr#34373 <https://github.com/ceph/ceph/pull/34373>`_, Patrick Seidensal, Tiago Melo)
-* mgr/dashboard: monitoring menu entry should indicate firing alerts (`pr#34823 <https://github.com/ceph/ceph/pull/34823>`_, Tiago Melo, Volker Theile)
-* mgr/dashboard: remove 'config-opt: read' perm. from system roles (`pr#33739 <https://github.com/ceph/ceph/pull/33739>`_, Alfonso Martínez)
-* mgr/dashboard: show checkboxes for booleans (`pr#33388 <https://github.com/ceph/ceph/pull/33388>`_, Tatjana Dehler)
-* mgr/dashboard: use FQDN for failover redirection (`pr#34497 <https://github.com/ceph/ceph/pull/34497>`_, Ernesto Puerta)
-* mgr/insights: fix prune-health-history (`pr#35214 <https://github.com/ceph/ceph/pull/35214>`_, Sage Weil)
-* mgr/pg_autoscaler: fix division by zero (`pr#33420 <https://github.com/ceph/ceph/pull/33420>`_, Sage Weil)
-* mgr/pg_autoscaler: treat target ratios as weights (`pr#34087 <https://github.com/ceph/ceph/pull/34087>`_, Josh Durgin)
-* mgr/prometheus: ceph_pg\_\* metrics contains last value instead of sum across all reported states (`pr#34162 <https://github.com/ceph/ceph/pull/34162>`_, Jacek Suchenia)
-* mgr/run-tox-tests: Fix issue with PYTHONPATH (`pr#33688 <https://github.com/ceph/ceph/pull/33688>`_, Brad Hubbard)
-* mgr/telegraf: catch FileNotFoundError exception (`pr#34628 <https://github.com/ceph/ceph/pull/34628>`_, Kefu Chai)
-* mgr/telemetry: add 'last_upload' to status (`pr#33409 <https://github.com/ceph/ceph/pull/33409>`_, Yaarit Hatuka)
-* mgr/telemetry: catch exception during requests.put (`pr#33141 <https://github.com/ceph/ceph/pull/33141>`_, Sage Weil)
-* mgr/telemetry: fix UUID and STR concat (`pr#33666 <https://github.com/ceph/ceph/pull/33666>`_, Yaarit Hatuka)
-* mgr/telemetry: fix and document proxy usage (`pr#33649 <https://github.com/ceph/ceph/pull/33649>`_, Lars Marowsky-Bree)
-* mgr/volumes: Add interface to get subvolume metadata (`pr#34679 <https://github.com/ceph/ceph/pull/34679>`_, Kotresh HR)
-* mgr/volumes: fs subvolume clone cancel (`issue#44208 <http://tracker.ceph.com/issues/44208>`_, `pr#34036 <https://github.com/ceph/ceph/pull/34036>`_, Venky Shankar, Michael Fritch)
-* mgr/volumes: minor fixes (`pr#35482 <https://github.com/ceph/ceph/pull/35482>`_, Kotresh HR)
-* mgr/volumes: synchronize ownership (for symlinks) and inode timestamps for cloned subvolumes (`issue#24880 <http://tracker.ceph.com/issues/24880>`_, `issue#43965 <http://tracker.ceph.com/issues/43965>`_, `pr#33877 <https://github.com/ceph/ceph/pull/33877>`_, Ramana Raja, Rishabh Dave, huanwen ren, Venky Shankar, Jos Collin)
-* mgr: Add get_rates_from_data to mgr_util.py (`pr#33893 <https://github.com/ceph/ceph/pull/33893>`_, Stephan Müller, Ernesto Puerta)
-* mgr: Improve internal python to c++ interface (`pr#34356 <https://github.com/ceph/ceph/pull/34356>`_, David Zafman)
-* mgr: close restful socket after exec (`pr#35213 <https://github.com/ceph/ceph/pull/35213>`_, liushi)
-* mgr: force purge normal ceph entities from service map (`issue#44677 <http://tracker.ceph.com/issues/44677>`_, `pr#34563 <https://github.com/ceph/ceph/pull/34563>`_, Venky Shankar)
-* mgr: synchronize ClusterState's health and mon_status (`pr#34326 <https://github.com/ceph/ceph/pull/34326>`_, Radoslaw Zarzynski)
-* mgr: update "hostname" when we already have the daemon state from that entity (`pr#33834 <https://github.com/ceph/ceph/pull/33834>`_, Kefu Chai)
-* mon/FSCommands: Fix 'add_data_pool' command and 'fs new' command (`pr#34774 <https://github.com/ceph/ceph/pull/34774>`_, Ramana Raja)
-* mon/OSDMonitor: Always tune priority cache manager memory on all mons (`pr#34916 <https://github.com/ceph/ceph/pull/34916>`_, Sridhar Seshasayee)
-* mon/OSDMonitor: allow trimming maps even if osds are down (`pr#34983 <https://github.com/ceph/ceph/pull/34983>`_, Joao Eduardo Luis)
-* mon/PGMap: fix summary display of >32bit pg states (`pr#33275 <https://github.com/ceph/ceph/pull/33275>`_, Sage Weil, Adam C. Emerson)
-* mon: Get session_map_lock before remove_session (`pr#34677 <https://github.com/ceph/ceph/pull/34677>`_, Xiaofei Cui)
-* mon: calculate min_size on osd pool set size (`pr#34585 <https://github.com/ceph/ceph/pull/34585>`_, Deepika Upadhyay)
-* mon: disable min pg per osd warning (`pr#34618 <https://github.com/ceph/ceph/pull/34618>`_, Sage Weil)
-* mon: fix/improve mon sync over small keys (`pr#33765 <https://github.com/ceph/ceph/pull/33765>`_, Sage Weil)
-* mon: stash newer map on bootstrap when addr doesn't match (`pr#34500 <https://github.com/ceph/ceph/pull/34500>`_, Sage Weil)
-* monitoring: Fix "10% OSDs down" alert description (`pr#35211 <https://github.com/ceph/ceph/pull/35211>`_, Benoît Knecht)
-* monitoring: Fix pool capacity incorrect (`pr#34450 <https://github.com/ceph/ceph/pull/34450>`_, James Cheng)
-* monitoring: alert for pool fill up broken (`pr#35137 <https://github.com/ceph/ceph/pull/35137>`_, Volker Theile)
-* monitoring: alert for prediction of disk and pool fill up broken (`pr#34394 <https://github.com/ceph/ceph/pull/34394>`_, Patrick Seidensal)
-* monitoring: fix RGW grafana chart 'Average GET/PUT Latencies' (`pr#33860 <https://github.com/ceph/ceph/pull/33860>`_, Alfonso Martínez)
-* monitoring: fix decimal precision in Grafana %percentages (`pr#34829 <https://github.com/ceph/ceph/pull/34829>`_, Ernesto Puerta)
-* monitoring: root volume full alert fires false positives (`pr#34419 <https://github.com/ceph/ceph/pull/34419>`_, Patrick Seidensal)
-* osd/OSD: Log slow ops/types to cluster logs (`pr#33503 <https://github.com/ceph/ceph/pull/33503>`_, Sage Weil, Sridhar Seshasayee)
-* osd/OSDMap: Show health warning if a pool is configured with size 1 (`pr#31842 <https://github.com/ceph/ceph/pull/31842>`_, Sridhar Seshasayee)
-* osd/PeeringState.h: ignore RemoteBackfillReserved in WaitLocalBackfillReserved (`pr#34512 <https://github.com/ceph/ceph/pull/34512>`_, Neha Ojha)
-* osd/PeeringState: do not trim pg log past last_update_ondisk (`pr#34957 <https://github.com/ceph/ceph/pull/34957>`_, Samuel Just, xie xingguo)
-* osd/PeeringState: transit async_recovery_targets back into acting before backfilling (`pr#32849 <https://github.com/ceph/ceph/pull/32849>`_, xie xingguo)
-* osd: dispatch_context and queue split finish on early bail-out (`pr#35024 <https://github.com/ceph/ceph/pull/35024>`_, Sage Weil)
-* osd: fix racy accesses to OSD::osdmap (`pr#33530 <https://github.com/ceph/ceph/pull/33530>`_, Radoslaw Zarzynski)
-* pybind/mgr/\*: fix config_notify handling of default values (`pr#34116 <https://github.com/ceph/ceph/pull/34116>`_, Nathan Cutler, Sage Weil)
-* pybind/mgr: use six==1.14.0 (`pr#34316 <https://github.com/ceph/ceph/pull/34316>`_, Kefu Chai)
-* pybind/rbd: RBD.create() method's 'old_format' parameter now defaults to False (`pr#35183 <https://github.com/ceph/ceph/pull/35183>`_, Jason Dillaman)
-* pybind/rbd: ensure image is open before permitting operations (`pr#34424 <https://github.com/ceph/ceph/pull/34424>`_, Mykola Golub)
-* pybind/rbd: fix no lockers are obtained, ImageNotFound exception will be output (`pr#34388 <https://github.com/ceph/ceph/pull/34388>`_, zhangdaolong)
-* rbd: librbd: copy API should not inherit v1 image format by default (`pr#35182 <https://github.com/ceph/ceph/pull/35182>`_, Jason Dillaman)
-* rbd: rbd-mirror: improve detection of blacklisted state (`pr#33533 <https://github.com/ceph/ceph/pull/33533>`_, Mykola Golub)
-* rgw/kafka: add kafka endpoint support (`pr#32960 <https://github.com/ceph/ceph/pull/32960>`_, Yuval Lifshitz, Willem Jan Withagen, Kefu Chai)
-* rgw/notifications: backporting features and bug fix (`pr#34107 <https://github.com/ceph/ceph/pull/34107>`_, Yuval Lifshitz)
-* rgw/notifications: fix topic action fail with "MethodNotAllowed" (`issue#44614 <http://tracker.ceph.com/issues/44614>`_, `pr#33978 <https://github.com/ceph/ceph/pull/33978>`_, Yuval Lifshitz)
-* rgw/notifications: version id was not sent in versioned buckets (`pr#35181 <https://github.com/ceph/ceph/pull/35181>`_, Yuval Lifshitz)
-* rgw:  when you abort a multipart upload request, the quota may be not updated (`pr#33268 <https://github.com/ceph/ceph/pull/33268>`_, Richard Bai(白学余))
-* rgw: Add support bucket policy for subuser (`pr#33714 <https://github.com/ceph/ceph/pull/33714>`_, Seena Fallah)
-* rgw: Fix dynamic resharding not working for empty zonegroup in period (`pr#33266 <https://github.com/ceph/ceph/pull/33266>`_, Or Friedmann)
-* rgw: Fix upload part copy range able to get almost any string (`pr#33265 <https://github.com/ceph/ceph/pull/33265>`_, Or Friedmann)
-* rgw: GET/HEAD and PUT operations on buckets w/lifecycle expiration configured do not return x-amz-expiration header (`pr#32924 <https://github.com/ceph/ceph/pull/32924>`_, Matt Benjamin, Yuval Lifshitz)
-* rgw: MultipartObjectProcessor supports stripe size > chunk size (`pr#33271 <https://github.com/ceph/ceph/pull/33271>`_, Casey Bodley)
-* rgw: ReplaceKeyPrefixWith and ReplaceKeyWith can not set at the same … (`pr#34599 <https://github.com/ceph/ceph/pull/34599>`_, yuliyang)
-* rgw: anonomous swift to obj that dont exist should 401 (`pr#35045 <https://github.com/ceph/ceph/pull/35045>`_, Matthew Oliver)
-* rgw: clear ent_list for each loop of bucket list (`issue#44394 <http://tracker.ceph.com/issues/44394>`_, `pr#34099 <https://github.com/ceph/ceph/pull/34099>`_, Yao Zongyou)
-* rgw: dmclock: wait until the request is handled (`pr#34954 <https://github.com/ceph/ceph/pull/34954>`_, GaryHyg)
-* rgw: find oldest period and update RGWMetadataLogHistory() (`pr#34597 <https://github.com/ceph/ceph/pull/34597>`_, Shilpa Jagannath)
-* rgw: fix SignatureDoesNotMatch when use ipv6 address in s3 client (`pr#33267 <https://github.com/ceph/ceph/pull/33267>`_, yuliyang)
-* rgw: fix bug with (un)ordered bucket listing and marker w/ namespace (`pr#34609 <https://github.com/ceph/ceph/pull/34609>`_, J. Eric Ivancich)
-* rgw: fix lc does not delete objects that do not have exactly the same tags as the rule (`pr#35002 <https://github.com/ceph/ceph/pull/35002>`_, Or Friedmann)
-* rgw: fix multipart upload's error response (`pr#35019 <https://github.com/ceph/ceph/pull/35019>`_, GaryHyg)
-* rgw: fix rgw crash when duration is invalid in sts request (`pr#33273 <https://github.com/ceph/ceph/pull/33273>`_, yuliyang)
-* rgw: fix some list buckets handle leak (`pr#34986 <https://github.com/ceph/ceph/pull/34986>`_, Tianshan Qu)
-* rgw: get barbican secret key request maybe return error code (`pr#33965 <https://github.com/ceph/ceph/pull/33965>`_, Richard Bai(白学余))
-* rgw: increase log level for same or older period pull msg (`pr#34833 <https://github.com/ceph/ceph/pull/34833>`_, Ali Maredia)
-* rgw: make max_connections configurable in beast (`pr#33340 <https://github.com/ceph/ceph/pull/33340>`_, Tiago Pasqualini)
-* rgw: making implicit_tenants backwards compatible (`issue#24348 <http://tracker.ceph.com/issues/24348>`_, `pr#33749 <https://github.com/ceph/ceph/pull/33749>`_, Marcus Watts)
-* rgw: multisite: enforce spawn window for incremental data sync (`pr#33270 <https://github.com/ceph/ceph/pull/33270>`_, Casey Bodley)
-* rgw: radosgw-admin: add support for --bucket-id in bucket stats command (`pr#34815 <https://github.com/ceph/ceph/pull/34815>`_, Vikhyat Umrao)
-* rgw: radosgw-admin: fix infinite loops in 'datalog list' (`pr#35001 <https://github.com/ceph/ceph/pull/35001>`_, Casey Bodley)
-* rgw: reshard: skip stale bucket id entries from reshard queue (`pr#34735 <https://github.com/ceph/ceph/pull/34735>`_, Abhishek Lekshmanan)
-* rgw: set bucket attr twice when delete lifecycle config (`pr#34598 <https://github.com/ceph/ceph/pull/34598>`_, zhang Shaowen)
-* rgw: set correct storage class for append (`pr#34064 <https://github.com/ceph/ceph/pull/34064>`_, yuliyang)
-* rgw: sts: add all http args to req_info (`pr#33355 <https://github.com/ceph/ceph/pull/33355>`_, yuliyang)
-* rgw: tune sharded bucket listing (`pr#33675 <https://github.com/ceph/ceph/pull/33675>`_, J. Eric Ivancich)
-* tests: migrate qa/ to python3 (`pr#34171 <https://github.com/ceph/ceph/pull/34171>`_, Kefu Chai, Sage Weil, Casey Bodley, Rishabh Dave, Patrick Donnelly, Kyr Shatskyy, Michael Fritch, Xiubo Li, Ilya Dryomov, Alfonso Martínez, Thomas Bechtold)
-* tools/cli: bash_completion: Do not auto complete obsolete and hidden cmds (`pr#35117 <https://github.com/ceph/ceph/pull/35117>`_, Kotresh HR)
-* tools/cli: ceph_argparse: increment matchcnt on kwargs (`pr#33160 <https://github.com/ceph/ceph/pull/33160>`_, Matthew Oliver, Shyukri Shyukriev)
-* tools/rados: Unmask '-o' to restore original behaviour (`pr#33641 <https://github.com/ceph/ceph/pull/33641>`_, Brad Hubbard)
-
-v14.2.9 Nautilus
-================
-
-This is the ninth bugfix release of Nautilus. This release fixes a
-couple of security issues in RGW & Messenger V2. We recommend all users
-to upgrade to this release.
-
-Notable Changes
----------------
-
-- CVE-2020-1759: Fixed nonce reuse in msgr V2 secure mode
-- CVE-2020-1760: Fixed XSS due to RGW GetObject header-splitting
-
-v14.2.8 Nautilus
-================
-
-This is the eighth update to the Ceph Nautilus release series. This release
-fixes issues across a range of subsystems. We recommend that all users upgrade
-to this release.
-
-Notable Changes
----------------
-
-* The default value of ``bluestore_min_alloc_size_ssd`` has been changed to 4K to improve performance across all workloads.
-
-* The following OSD memory config options related to bluestore cache autotuning can now
-  be configured during runtime:
-
-    - osd_memory_base (default: 768 MB)
-    - osd_memory_cache_min (default: 128 MB)
-    - osd_memory_expected_fragmentation (default: 0.15)
-    - osd_memory_target (default: 4 GB)
-
-  The above options can be set with::
-
-    ceph config set osd <option> <value>
-
-* The MGR now accepts ``profile rbd`` and ``profile rbd-read-only`` user caps.
-  These caps can be used to provide users access to MGR-based RBD functionality
-  such as ``rbd perf image iostat`` an ``rbd perf image iotop``.
-
-* The configuration value ``osd_calc_pg_upmaps_max_stddev`` used for upmap
-  balancing has been removed. Instead use the mgr balancer config
-  ``upmap_max_deviation`` which now is an integer number of PGs of deviation
-  from the target PGs per OSD.  This can be set with a command like
-  ``ceph config set mgr mgr/balancer/upmap_max_deviation 2``.  The default
-  ``upmap_max_deviation`` is 5.  There are situations where crush rules
-  would not allow a pool to ever have completely balanced PGs.  For example, if
-  crush requires 1 replica on each of 3 racks, but there are fewer OSDs in 1 of
-  the racks.  In those cases, the configuration value can be increased.
-
-* RGW: a mismatch between the bucket notification documentation and the actual
-  message format was fixed. This means that any endpoints receiving bucket
-  notification, will now receive the same notifications inside a JSON array
-  named 'Records'. Note that this does not affect pulling bucket notification
-  from a subscription in a 'pubsub' zone, as these are already wrapped inside
-  that array.
-
-* CephFS: multiple active MDS forward scrub is now rejected. Scrub currently
-  only is permitted on a file system with a single rank. Reduce the ranks to one
-  via ``ceph fs set <fs_name> max_mds 1``.
-
-* Ceph now refuses to create a file system with a default EC data pool. For
-  further explanation, see:
-  https://docs.ceph.com/docs/nautilus/cephfs/createfs/#creating-pools
-
-* Ceph will now issue a health warning if a RADOS pool has a ``pg_num``
-  value that is not a power of two. This can be fixed by adjusting
-  the pool to a nearby power of two::
-
-    ceph osd pool set <pool-name> pg_num <new-pg-num>
-
-  Alternatively, the warning can be silenced with::
-
-    ceph config set global mon_warn_on_pool_pg_num_not_power_of_two false
-
-
-Changelog
----------
-
-* bluestore: common/options: bluestore 4k min_alloc_size for SSD (`pr#32998 <https://github.com/ceph/ceph/pull/32998>`_, Mark Nelson, Sage Weil)
-* bluestore: os/bluestore: Add config observer for osd memory specific options (`pr#31852 <https://github.com/ceph/ceph/pull/31852>`_, Sridhar Seshasayee)
-* bluestore: os/bluestore/BlueStore.cc: set priorities for compression stats (`pr#32845 <https://github.com/ceph/ceph/pull/32845>`_, Neha Ojha)
-* bluestore: os/bluestore: default bluestore_block_size 1T -> 100G (`pr#32283 <https://github.com/ceph/ceph/pull/32283>`_, Sage Weil)
-* build/ops: cmake: remove seastar tests from "make check" (`pr#32658 <https://github.com/ceph/ceph/pull/32658>`_, Kefu Chai)
-* build/ops: install-deps,rpm: enable devtoolset-8 on aarch64 also (`issue#38892 <http://tracker.ceph.com/issues/38892>`_, `pr#32651 <https://github.com/ceph/ceph/pull/32651>`_, Kefu Chai)
-* build/ops: rpm: add rpm-build to SUSE-specific make check deps (`pr#32208 <https://github.com/ceph/ceph/pull/32208>`_, Nathan Cutler)
-* build/ops: switch to boost 1.72 (`pr#32441 <https://github.com/ceph/ceph/pull/32441>`_, Willem Jan Withagen, Kefu Chai)
-* build/ops: tools/setup-virtualenv.sh: do not default to python2.7 (`pr#30739 <https://github.com/ceph/ceph/pull/30739>`_, Nathan Cutler)
-* cephfs: cephfs-journal-tool: fix crash and usage (`pr#32913 <https://github.com/ceph/ceph/pull/32913>`_, Xiubo Li)
-* cephfs: client: Add is_dir() check before changing directory (`pr#32916 <https://github.com/ceph/ceph/pull/32916>`_, Varsha Rao)
-* cephfs: client: add procession of SEEK_HOLE and SEEK_DATA in lseek (`pr#30764 <https://github.com/ceph/ceph/pull/30764>`_, Shen Hang)
-* cephfs: client: add warning when cap != in->auth_cap (`pr#32065 <https://github.com/ceph/ceph/pull/32065>`_, Shen Hang)
-* cephfs: client: EINVAL may be returned when offset is 0 (`pr#30762 <https://github.com/ceph/ceph/pull/30762>`_, wenpengLi)
-* cephfs: client: fix lazyio_synchronize() to update file size and libcephfs: Add Tests for LazyIO (`pr#30769 <https://github.com/ceph/ceph/pull/30769>`_, Sidharth Anupkrishnan)
-* cephfs: client: _readdir_cache_cb() may use the readdir_cache already clear (`issue#41148 <http://tracker.ceph.com/issues/41148>`_, `pr#30763 <https://github.com/ceph/ceph/pull/30763>`_, huanwen ren)
-* cephfs: client: remove Inode.dir_contacts field and handle bad whence value to llseek gracefully (`pr#30766 <https://github.com/ceph/ceph/pull/30766>`_, Jeff Layton)
-* cephfs,common: osdc/objecter: Fix last_sent in scientific format and add age to ops (`pr#31081 <https://github.com/ceph/ceph/pull/31081>`_, Varsha Rao)
-* cephfs: disallow changing fuse_default_permissions option at runtime (`pr#32915 <https://github.com/ceph/ceph/pull/32915>`_, Zhi Zhang)
-* cephfs: mds: add command that config individual client session (`issue#40811 <http://tracker.ceph.com/issues/40811>`_, `pr#32245 <https://github.com/ceph/ceph/pull/32245>`_, "Yan, Zheng")
-* cephfs: mds: "apply configuration changes through MDSRank" and "recall caps from quiescent sessions" and "drive cap recall while dropping cache" (`pr#30761 <https://github.com/ceph/ceph/pull/30761>`_, Patrick Donnelly, Jeff Layton)
-* cephfs: mds: fix assert(omap_num_objs <= MAX_OBJECTS) of OpenFileTable (`pr#32756 <https://github.com/ceph/ceph/pull/32756>`_, "Yan, Zheng")
-* cephfs: mds: fix revoking caps after after stale->resume circle (`pr#32909 <https://github.com/ceph/ceph/pull/32909>`_, "Yan, Zheng")
-* cephfs: mds: free heap memory may grow too large for some workloads (`pr#31802 <https://github.com/ceph/ceph/pull/31802>`_, Patrick Donnelly)
-* cephfs: MDSMonitor: warn if a new file system is being created with an EC default data pool (`pr#32600 <https://github.com/ceph/ceph/pull/32600>`_, Patrick Donnelly)
-* cephfs: mds: no assert on frozen dir when scrub path (`pr#32071 <https://github.com/ceph/ceph/pull/32071>`_, Zhi Zhang)
-* cephfs: mds: note client features when rejecting client (`pr#32914 <https://github.com/ceph/ceph/pull/32914>`_, Patrick Donnelly)
-* cephfs:  mds/OpenFileTable: match MAX_ITEMS_PER_OBJ to osd_deep_scrub_large_omap_object_key_threshold (`pr#32921 <https://github.com/ceph/ceph/pull/32921>`_, Vikhyat Umrao, Varsha Rao)
-* cephfs: mds: properly evaluate unstable locks when evicting client (`pr#32073 <https://github.com/ceph/ceph/pull/32073>`_, "Yan, Zheng")
-* cephfs: mds: reject forward scrubs when cluster has multiple active MDS (more than one rank) (`pr#32602 <https://github.com/ceph/ceph/pull/32602>`_, Patrick Donnelly, Milind Changire)
-* cephfs: mds: reject sessionless messages (`issue#40784 <http://tracker.ceph.com/issues/40784>`_, `pr#30843 <https://github.com/ceph/ceph/pull/30843>`_, "Yan, Zheng", Xiao Guodong, Shen Hang)
-* cephfs: mds: remove unnecessary debug warning (`pr#32077 <https://github.com/ceph/ceph/pull/32077>`_, Patrick Donnelly)
-* cephfs: mds returns -5(EIO) error when the deleted file does not exist (`pr#30767 <https://github.com/ceph/ceph/pull/30767>`_, huanwen ren)
-* cephfs: mds: split the dir if the op makes it oversized, because some ops maybe in flight (`pr#31302 <https://github.com/ceph/ceph/pull/31302>`_, simon gao)
-* cephfs: mds: tolerate no snaprealm encoded in on-disk root inode (`pr#32079 <https://github.com/ceph/ceph/pull/32079>`_, "Yan, Zheng")
-* cephfs: mgr: "mds metadata" to setup new DaemonState races with fsmap (`pr#31905 <https://github.com/ceph/ceph/pull/31905>`_, Patrick Donnelly)
-* cephfs: mgr/volumes: allow setting uid, gid of subvolume and subvolume group during creation (`issue#42923 <http://tracker.ceph.com/issues/42923>`_, `pr#31741 <https://github.com/ceph/ceph/pull/31741>`_, Venky Shankar, Jos Collin)
-* cephfs:  mgr/volumes: fetch trash and clone entries without blocking volume access (`issue#44282 <http://tracker.ceph.com/issues/44282>`_, `pr#33526 <https://github.com/ceph/ceph/pull/33526>`_, Venky Shankar)
-* cephfs:  mgr/volumes: fs subvolume resize command (`pr#31332 <https://github.com/ceph/ceph/pull/31332>`_, Jos Collin)
-* cephfs: mgr/volumes: misc fix and feature enhancements (`issue#42646 <http://tracker.ceph.com/issues/42646>`_, `issue#43645 <http://tracker.ceph.com/issues/43645>`_, `pr#33122 <https://github.com/ceph/ceph/pull/33122>`_, Rishabh Dave, Joshua Schmid, Venky Shankar, Ramana Raja, Jos Collin)
-* cephfs:  mgr/volumes: unregister job upon async threads exception (`issue#44315 <http://tracker.ceph.com/issues/44315>`_, `pr#33569 <https://github.com/ceph/ceph/pull/33569>`_, Venky Shankar)
-* cephfs:  mon: print FSMap regardless of file system count (`pr#32912 <https://github.com/ceph/ceph/pull/32912>`_, Patrick Donnelly)
-* cephfs:  pybind/mgr/volumes: idle connection drop is not working (`pr#33116 <https://github.com/ceph/ceph/pull/33116>`_, Patrick Donnelly)
-* cephfs: RuntimeError: Files in flight high water is unexpectedly low (0 / 6) (`pr#33115 <https://github.com/ceph/ceph/pull/33115>`_, Patrick Donnelly)
-* ceph.in: check ceph-conf returncode (`pr#31367 <https://github.com/ceph/ceph/pull/31367>`_, Dimitri Savineau)
-* ceph-monstore-tool: correct the key for storing mgr_command_descs (`pr#33278 <https://github.com/ceph/ceph/pull/33278>`_, Kefu Chai)
-* ceph-volume: add db and wal support to raw mode (`pr#32979 <https://github.com/ceph/ceph/pull/32979>`_, Sébastien Han)
-* ceph-volume: add methods to pass filters to pvs, vgs and lvs commands (`pr#33217 <https://github.com/ceph/ceph/pull/33217>`_, Rishabh Dave)
-* ceph-volume: add raw (--bluestore) mode (`pr#32733 <https://github.com/ceph/ceph/pull/32733>`_, Jan Fajerski, Sage Weil)
-* ceph-volume: add sizing arguments to prepare (`pr#33231 <https://github.com/ceph/ceph/pull/33231>`_, Jan Fajerski)
-* ceph-volume: allow raw block devices everywhere (`pr#32868 <https://github.com/ceph/ceph/pull/32868>`_, Jan Fajerski)
-* ceph-volume: assume msgrV1 for all branches containing mimic (`pr#31616 <https://github.com/ceph/ceph/pull/31616>`_, Jan Fajerski)
-* ceph-volume: avoid calling zap_lv with a LV-less VG (`pr#33297 <https://github.com/ceph/ceph/pull/33297>`_, Jan Fajerski)
-* ceph-volume: batch bluestore fix create_lvs call (`pr#33232 <https://github.com/ceph/ceph/pull/33232>`_, Jan Fajerski)
-* ceph-volume: batch bluestore fix create_lvs call (`pr#33301 <https://github.com/ceph/ceph/pull/33301>`_, Jan Fajerski)
-* ceph-volume/batch: fail on filtered devices when non-interactive (`pr#33202 <https://github.com/ceph/ceph/pull/33202>`_, Jan Fajerski)
-* ceph-volume: Dereference symlink in lvm list (`pr#32877 <https://github.com/ceph/ceph/pull/32877>`_, Benoît Knecht)
-* ceph-volume: don't remove vg twice when zapping filestore (`pr#33337 <https://github.com/ceph/ceph/pull/33337>`_, Jan Fajerski)
-* ceph-volume: finer grained availability notion in inventory (`pr#33240 <https://github.com/ceph/ceph/pull/33240>`_, Jan Fajerski)
-* ceph-volume: fix has_bluestore_label() function (`pr#33239 <https://github.com/ceph/ceph/pull/33239>`_, Guillaume Abrioux)
-* ceph-volume: fix is_ceph_device for lvm batch (`pr#33253 <https://github.com/ceph/ceph/pull/33253>`_, Jan Fajerski, Dimitri Savineau)
-* ceph-volume: fix the integer overflow (`pr#32873 <https://github.com/ceph/ceph/pull/32873>`_, dongdong tao)
-* ceph-volume: import mock.mock instead of unittest.mock (py2) (`pr#32870 <https://github.com/ceph/ceph/pull/32870>`_, Jan Fajerski)
-* ceph-volume/lvm/activate.py: clarify error message: fsid refers to osd_fsid (`pr#32864 <https://github.com/ceph/ceph/pull/32864>`_, Yaniv Kaul)
-* ceph-volume: lvm/deactivate: add unit tests, remove --all (`pr#32863 <https://github.com/ceph/ceph/pull/32863>`_, Jan Fajerski)
-* ceph-volume: lvm deactivate command (`pr#33209 <https://github.com/ceph/ceph/pull/33209>`_, Jan Fajerski)
-* ceph-volume: make get_devices fs location independent (`pr#33200 <https://github.com/ceph/ceph/pull/33200>`_, Jan Fajerski)
-* ceph-volume: minor clean-up of "simple scan" subcommand help (`pr#32556 <https://github.com/ceph/ceph/pull/32556>`_, Michael Fritch)
-* ceph-volume: pass journal_size as Size not string (`pr#33334 <https://github.com/ceph/ceph/pull/33334>`_, Jan Fajerski)
-* ceph-volume: refactor listing.py + fixes (`pr#33238 <https://github.com/ceph/ceph/pull/33238>`_, Jan Fajerski, Rishabh Dave, Guillaume Abrioux)
-* ceph-volume: reject disks smaller then 5GB in inventory (`issue#40776 <http://tracker.ceph.com/issues/40776>`_, `pr#31554 <https://github.com/ceph/ceph/pull/31554>`_, Jan Fajerski)
-* ceph-volume: skip osd creation when already done (`pr#33242 <https://github.com/ceph/ceph/pull/33242>`_, Guillaume Abrioux)
-* ceph-volume/test: patch VolumeGroups (`pr#32558 <https://github.com/ceph/ceph/pull/32558>`_, Jan Fajerski)
-* ceph-volume: use correct extents if using db-devices and >1 osds_per_device (`pr#32874 <https://github.com/ceph/ceph/pull/32874>`_, Fabian Niepelt)
-* ceph-volume: use fsync for dd command (`pr#31553 <https://github.com/ceph/ceph/pull/31553>`_, Rishabh Dave)
-* ceph-volume: use get_device_vgs in has_common_vg (`pr#33254 <https://github.com/ceph/ceph/pull/33254>`_, Jan Fajerski)
-* ceph-volume: util: look for executable in $PATH (`pr#32860 <https://github.com/ceph/ceph/pull/32860>`_, Shyukri Shyukriev)
-* ceph-volume/zfs: add the inventory command (`pr#31295 <https://github.com/ceph/ceph/pull/31295>`_, Willem Jan Withagen)
-* common/admin_socket: Increase socket timeouts (`pr#32063 <https://github.com/ceph/ceph/pull/32063>`_, Brad Hubbard)
-* common/bl: fix the dangling last_p issue (`pr#33277 <https://github.com/ceph/ceph/pull/33277>`_, Radoslaw Zarzynski)
-* common/config: update values when they are removed via mon (`pr#32846 <https://github.com/ceph/ceph/pull/32846>`_, Sage Weil)
-* common: FIPS: audit and switch some memset & bzero users (`pr#32167 <https://github.com/ceph/ceph/pull/32167>`_, Radoslaw Zarzynski)
-* common: fix deadlocky inflight op visiting in OpTracker (`pr#32858 <https://github.com/ceph/ceph/pull/32858>`_, Radoslaw Zarzynski)
-* common/options: remove unused ms_msgr2\_{sign,encrypt} (`pr#31850 <https://github.com/ceph/ceph/pull/31850>`_, Ilya Dryomov)
-* common/util: use ifstream to read from /proc files (`pr#32901 <https://github.com/ceph/ceph/pull/32901>`_, Kefu Chai, songweibin)
-* core: auth/Crypto: fallback to /dev/urandom if getentropy() fails (`pr#31301 <https://github.com/ceph/ceph/pull/31301>`_, Kefu Chai)
-* core: mon: keep v1 address type when explicitly set (`pr#32028 <https://github.com/ceph/ceph/pull/32028>`_, Ricardo Dias)
-* core: mon/OSDMonitor: Fix pool set target_size_bytes (etc) with unit suffix (`pr#31740 <https://github.com/ceph/ceph/pull/31740>`_, Prashant D)
-* core: osd/OSDMap: health alert for non-power-of-two pg_num (`pr#30689 <https://github.com/ceph/ceph/pull/30689>`_, Sage Weil)
-* crush/CrushWrapper: behave with empty weight vector (`pr#32905 <https://github.com/ceph/ceph/pull/32905>`_, Kefu Chai)
-* doc/cephfs/client-auth: description and example are inconsistent (`pr#32781 <https://github.com/ceph/ceph/pull/32781>`_, Ilya Dryomov)
-* doc/cephfs: improve add/remove MDS section (`issue#39620 <http://tracker.ceph.com/issues/39620>`_, `pr#31116 <https://github.com/ceph/ceph/pull/31116>`_, Patrick Donnelly)
-* doc/ceph-fuse: mention -k option in ceph-fuse man page (`pr#30765 <https://github.com/ceph/ceph/pull/30765>`_, Rishabh Dave)
-* doc/ceph-volume: initial docs for zfs/inventory and zfs/api (`pr#32746 <https://github.com/ceph/ceph/pull/32746>`_, Willem Jan Withagen)
-* doc: remove invalid option mon_pg_warn_max_per_osd (`pr#31300 <https://github.com/ceph/ceph/pull/31300>`_, zhang daolong)
-* doc/_templates/page.html: redirect to etherpad (`pr#32248 <https://github.com/ceph/ceph/pull/32248>`_, Neha Ojha)
-* doc: wrong datatype describing crush_rule (`pr#32254 <https://github.com/ceph/ceph/pull/32254>`_, Kefu Chai)
-* global: disable THP for Ceph daemons (`pr#31646 <https://github.com/ceph/ceph/pull/31646>`_, Patrick Donnelly, Mark Nelson)
-* kv: fix shutdown vs async compaction (`pr#32715 <https://github.com/ceph/ceph/pull/32715>`_, Sage Weil)
-* librbd: diff iterate with fast-diff now correctly includes parent (`pr#32469 <https://github.com/ceph/ceph/pull/32469>`_, Jason Dillaman)
-* librbd: fix rbd_open_by_id, rbd_open_by_id_read_only (`pr#32837 <https://github.com/ceph/ceph/pull/32837>`_, yangjun)
-* librbd: remove pool objects when removing a namespace (`pr#32839 <https://github.com/ceph/ceph/pull/32839>`_, Jason Dillaman)
-* librbd: skip stale child with non-existent pool for list descendants (`pr#32841 <https://github.com/ceph/ceph/pull/32841>`_, songweibin)
-* librbd: support compression allocation hints to the OSD (`pr#32842 <https://github.com/ceph/ceph/pull/32842>`_, Jason Dillaman)
-* mgr: add 'rbd' profiles to support 'rbd_support' module commands (`pr#32086 <https://github.com/ceph/ceph/pull/32086>`_, Jason Dillaman)
-* mgr/alerts: simple health alerts (`pr#30820 <https://github.com/ceph/ceph/pull/30820>`_, Sage Weil)
-* mgr: Balancer fixes (`pr#31956 <https://github.com/ceph/ceph/pull/31956>`_, Neha Ojha, Kefu Chai, David Zafman)
-* mgr/DaemonServer: fix 'osd ok-to-stop' for EC pools (`pr#32844 <https://github.com/ceph/ceph/pull/32844>`_, Sage Weil)
-* mgr/dashboard: add debug mode, and accept expected exception when SSL handshaking (`pr#31190 <https://github.com/ceph/ceph/pull/31190>`_, Kefu Chai, Ernesto Puerta, Joshua Schmid)
-* mgr/dashboard: block mirroring page results in internal server error (`pr#32133 <https://github.com/ceph/ceph/pull/32133>`_, Jason Dillaman)
-* mgr/dashboard: check embedded Grafana dashboard references (`issue#40008 <http://tracker.ceph.com/issues/40008>`_, `pr#31808 <https://github.com/ceph/ceph/pull/31808>`_, Kiefer Chang)
-* mgr/dashboard: check if user has config-opt permissions (`pr#32827 <https://github.com/ceph/ceph/pull/32827>`_, Alfonso Martínez)
-* mgr/dashboard: Cross sign button not working for some modals (`pr#32012 <https://github.com/ceph/ceph/pull/32012>`_, Ricardo Marques)
-* mgr/dashboard: Dashboard can't handle self-signed cert on Grafana API (`pr#31792 <https://github.com/ceph/ceph/pull/31792>`_, Volker Theile)
-* mgr/dashboard: disable 'Add Capability' button in rgw user edit (`pr#32930 <https://github.com/ceph/ceph/pull/32930>`_, Alfonso Martínez)
-* mgr/dashboard: fix restored RBD image naming issue (`pr#31810 <https://github.com/ceph/ceph/pull/31810>`_, Kiefer Chang)
-* mgr/dashboard: grafana charts match time picker selection (`pr#31999 <https://github.com/ceph/ceph/pull/31999>`_, Alfonso Martínez)
-* mgr/dashboard,grafana: remove shortcut menu (`pr#31980 <https://github.com/ceph/ceph/pull/31980>`_, Ernesto Puerta)
-* mgr/dashboard: Handle always-on Ceph Manager modules correctly (`pr#31782 <https://github.com/ceph/ceph/pull/31782>`_, Volker Theile)
-* mgr/dashboard: Hardening accessing the metadata (`pr#32128 <https://github.com/ceph/ceph/pull/32128>`_, Volker Theile)
-* mgr/dashboard: iSCSI targets not available if any gateway is down (and more...) (`pr#32304 <https://github.com/ceph/ceph/pull/32304>`_, Ricardo Marques)
-* mgr/dashboard: KeyError on dashboard reload (`pr#32233 <https://github.com/ceph/ceph/pull/32233>`_, Patrick Seidensal)
-* mgr/dashboard: key-value-table doesn't render booleans (`pr#31789 <https://github.com/ceph/ceph/pull/31789>`_, Patrick Seidensal)
-* mgr/dashboard: Remove compression mode unset in pool from (`pr#31784 <https://github.com/ceph/ceph/pull/31784>`_, Stephan Müller)
-* mgr/dashboard: show "Rename" in header & button when renaming RBD (`pr#31779 <https://github.com/ceph/ceph/pull/31779>`_, Alfonso Martínez)
-* mgr/dashboard: sort monitors by open sessions correctly (`pr#31791 <https://github.com/ceph/ceph/pull/31791>`_, Alfonso Martínez)
-* mgr/dashboard: Standby Dashboards don't handle all requests properly (`pr#32299 <https://github.com/ceph/ceph/pull/32299>`_, Volker Theile)
-* mgr/dashboard: Trim IQN on iSCSI target form (`pr#31942 <https://github.com/ceph/ceph/pull/31942>`_, Ricardo Marques)
-* mgr/dashboard: Unable to set boolean values to false when default is true (`pr#31941 <https://github.com/ceph/ceph/pull/31941>`_, Ricardo Marques)
-* mgr/dashboard: Using wrong identifiers in RGW user/bucket datatables (`pr#32888 <https://github.com/ceph/ceph/pull/32888>`_, Volker Theile)
-* mgr/devicehealth: ensure we don't store empty objects (`pr#31735 <https://github.com/ceph/ceph/pull/31735>`_, Sage Weil)
-* mgr/devicehealth: fix telemetry stops sending device reports after 48 hours (`pr#33346 <https://github.com/ceph/ceph/pull/33346>`_, Yaarit Hatuka, Sage Weil)
-* mgr: drop reference to msg on return (`pr#33498 <https://github.com/ceph/ceph/pull/33498>`_, Patrick Donnelly)
-* mgr/MgrClient: fix open condition (`pr#32769 <https://github.com/ceph/ceph/pull/32769>`_, Sage Weil)
-* mgr/pg_autoscaler: calculate pool_pg_target using pool size (`pr#33170 <https://github.com/ceph/ceph/pull/33170>`_, Dan van der Ster)
-* mgr/pg_autoscaler: default to pg_num[_min] = 16 (`pr#32069 <https://github.com/ceph/ceph/pull/32069>`_, Sage Weil)
-* mgr/pg_autoscaler: default to pg_num[_min] = 32 (`pr#32931 <https://github.com/ceph/ceph/pull/32931>`_, Neha Ojha)
-* mgr/pg_autoscaler: implement shutdown method (`pr#32068 <https://github.com/ceph/ceph/pull/32068>`_, Patrick Donnelly)
-* mgr/pg_autoscaler: only generate target\_\* health warnings if targets set (`pr#32067 <https://github.com/ceph/ceph/pull/32067>`_, Sage Weil)
-* mgr/prometheus: assign a value to osd_dev_node when obj_store is not filestore or bluestore (`pr#31556 <https://github.com/ceph/ceph/pull/31556>`_, jiahuizeng)
-* mgr/prometheus: report per-pool pg states (`pr#33157 <https://github.com/ceph/ceph/pull/33157>`_, Aleksei Zakharov)
-* mgr/telemetry: anonymizing smartctl report itself (`pr#33082 <https://github.com/ceph/ceph/pull/33082>`_, Yaarit Hatuka)
-* mgr/telemetry: check get_metadata return val (`pr#33095 <https://github.com/ceph/ceph/pull/33095>`_, Yaarit Hatuka)
-* mgr/telemetry: split entity_name only once (handle ids with dots) (`pr#33168 <https://github.com/ceph/ceph/pull/33168>`_, Dan Mick)
-* mgr/zabbix: Adds possibility to send data to multiple zabbix servers (`pr#30009 <https://github.com/ceph/ceph/pull/30009>`_, slivik, Jakub Sliva)
-* mon/ConfigMonitor: fix handling of NO_MON_UPDATE settings (`pr#32856 <https://github.com/ceph/ceph/pull/32856>`_, Sage Weil)
-* mon/ConfigMonitor: only propose if leader (`pr#33155 <https://github.com/ceph/ceph/pull/33155>`_, Sage Weil)
-* mon: Don't put session during feature change (`pr#33152 <https://github.com/ceph/ceph/pull/33152>`_, Brad Hubbard)
-* mon: elector: return after triggering a new election (`pr#33007 <https://github.com/ceph/ceph/pull/33007>`_, Greg Farnum)
-* monitoring: wait before firing osd full alert (`pr#32070 <https://github.com/ceph/ceph/pull/32070>`_, Patrick Seidensal)
-* mon/MgrMonitor.cc: add always_on_modules to the output of "ceph mgr module ls" (`pr#32997 <https://github.com/ceph/ceph/pull/32997>`_, Neha Ojha)
-* mon/MgrMonitor.cc: warn about missing mgr in a cluster with osds (`pr#33142 <https://github.com/ceph/ceph/pull/33142>`_, Neha Ojha)
-* mon/OSDMonitor: Don't update mon cache settings if rocksdb is not used (`pr#32520 <https://github.com/ceph/ceph/pull/32520>`_, Sridhar Seshasayee, Sage Weil)
-* mon/OSDMonitor: fix format error ceph osd stat --format json (`pr#32062 <https://github.com/ceph/ceph/pull/32062>`_, Zheng Yin)
-* mon/PGMap.h: disable network stats in dump_osd_stats (`pr#32466 <https://github.com/ceph/ceph/pull/32466>`_, Neha Ojha, David Zafman)
-* mon: remove the restriction of address type in init_with_hosts (`pr#31844 <https://github.com/ceph/ceph/pull/31844>`_, Hao Xiong)
-* mon/Session: only index osd ids >= 0 (`pr#32908 <https://github.com/ceph/ceph/pull/32908>`_, Sage Weil)
-* mount.ceph: give a hint message when no mds is up or cluster is laggy (`pr#32910 <https://github.com/ceph/ceph/pull/32910>`_, Xiubo Li)
-* mount.ceph: remove arbitrary limit on size of name= option (`pr#32807 <https://github.com/ceph/ceph/pull/32807>`_, Jeff Layton)
-* msg: async/net_handler.cc: Fix compilation (`pr#31736 <https://github.com/ceph/ceph/pull/31736>`_, Carlos Valiente)
-* osd: add osd_fast_shutdown option (default true) (`pr#32743 <https://github.com/ceph/ceph/pull/32743>`_, Sage Weil)
-* osd: Allow 64-char hostname to be added as the "host" in CRUSH (`pr#33147 <https://github.com/ceph/ceph/pull/33147>`_, Michal Skalski)
-* osd: Diagnostic logging for upmap cleaning (`pr#32716 <https://github.com/ceph/ceph/pull/32716>`_, David Zafman)
-* osd/OSD: enhance osd numa affinity compatibility (`pr#32843 <https://github.com/ceph/ceph/pull/32843>`_, luo rixin, Dai zhiwei)
-* osd/PeeringState.cc: don't let num_objects become negative (`pr#32857 <https://github.com/ceph/ceph/pull/32857>`_, Neha Ojha)
-* osd/PeeringState.cc: skip peer_purged when discovering all missing (`pr#32847 <https://github.com/ceph/ceph/pull/32847>`_, Neha Ojha)
-* osd/PeeringState: do not exclude up from acting_recovery_backfill (`pr#32064 <https://github.com/ceph/ceph/pull/32064>`_, Nathan Cutler, xie xingguo)
-* osd/PrimaryLogPG: skip obcs that don't exist during backfill scan_range (`pr#31028 <https://github.com/ceph/ceph/pull/31028>`_, Sage Weil)
-* osd: set affinity for \*all\* threads (`pr#31359 <https://github.com/ceph/ceph/pull/31359>`_, Sage Weil)
-* osd: set collection pool opts on collection create, pg load (`pr#32123 <https://github.com/ceph/ceph/pull/32123>`_, Sage Weil)
-* osd: Use physical ratio for nearfull (doesn't include backfill resserve) (`pr#32773 <https://github.com/ceph/ceph/pull/32773>`_, David Zafman)
-* pybind/mgr: Cancel output color control (`pr#31697 <https://github.com/ceph/ceph/pull/31697>`_, Zheng Yin)
-* rbd:  creating thick-provision image progress percent info exceeds 100% (`pr#32840 <https://github.com/ceph/ceph/pull/32840>`_, Xiangdong Mu)
-* rbd: librbd: don't call refresh from mirror::GetInfoRequest state machine (`pr#32900 <https://github.com/ceph/ceph/pull/32900>`_, Mykola Golub)
-* rbd-mirror: clone v2 mirroring improvements (`pr#31518 <https://github.com/ceph/ceph/pull/31518>`_, Mykola Golub)
-* rbd-mirror: fix 'rbd mirror status' asok command output (`pr#32447 <https://github.com/ceph/ceph/pull/32447>`_, Mykola Golub)
-* rbd-mirror: make logrotate work (`pr#32593 <https://github.com/ceph/ceph/pull/32593>`_, Mykola Golub)
-* rgw: add bucket permission verify when copy obj (`pr#31089 <https://github.com/ceph/ceph/pull/31089>`_, NancySu05)
-* rgw: Adding 'iam' namespace for Role and User Policy related REST APIs (`pr#32437 <https://github.com/ceph/ceph/pull/32437>`_, Pritha Srivastava)
-* rgw: adding mfa code validation when bucket versioning status is changed (`pr#32759 <https://github.com/ceph/ceph/pull/32759>`_, Pritha Srivastava)
-* rgw: add num_shards to radosgw-admin bucket stats (`pr#31182 <https://github.com/ceph/ceph/pull/31182>`_, Paul Emmerich)
-* rgw: allow reshard log entries for non-existent buckets to be cancelled (`pr#32056 <https://github.com/ceph/ceph/pull/32056>`_, J. Eric Ivancich)
-* rgw: auto-clean reshard queue entries for non-existent buckets (`pr#32055 <https://github.com/ceph/ceph/pull/32055>`_, J. Eric Ivancich)
-* rgw: build_linked_oids_for_bucket and build_buckets_instance_index should return negative value if it fails (`pr#32820 <https://github.com/ceph/ceph/pull/32820>`_, zhangshaowen)
-* rgw: crypt: permit RGW-AUTO/default with SSE-S3 headers (`pr#31862 <https://github.com/ceph/ceph/pull/31862>`_, Matt Benjamin)
-* rgw: data sync markers include timestamp from datalog entry (`pr#32819 <https://github.com/ceph/ceph/pull/32819>`_, Casey Bodley)
-* rgw_file: avoid string::front() on empty path (`pr#33008 <https://github.com/ceph/ceph/pull/33008>`_, Matt Benjamin)
-* rgw: fix a bug that bucket instance obj can't be removed after resharding completed (`pr#32822 <https://github.com/ceph/ceph/pull/32822>`_, zhang Shaowen)
-* rgw: fix an endless loop error when to show usage (`pr#31684 <https://github.com/ceph/ceph/pull/31684>`_, lvshuhua)
-* rgw: fix bugs in listobjectsv1 (`pr#32239 <https://github.com/ceph/ceph/pull/32239>`_, Albin Antony)
-* rgw: fix compile errors with boost 1.70 (`pr#31289 <https://github.com/ceph/ceph/pull/31289>`_, Casey Bodley)
-* rgw: fix data consistency error casued by rgw sent timeout (`pr#32821 <https://github.com/ceph/ceph/pull/32821>`_, 李纲彬82225)
-* rgw: fix list versions starts with version_id=null (`pr#30743 <https://github.com/ceph/ceph/pull/30743>`_, Tianshan Qu)
-* rgw: fix one part of the bulk delete(RGWDeleteMultiObj_ObjStore_S3) fails but no error messages (`pr#33151 <https://github.com/ceph/ceph/pull/33151>`_, Snow Si)
-* rgw: fix opslog operation field as per Amazon s3 (`issue#20978 <http://tracker.ceph.com/issues/20978>`_, `pr#32834 <https://github.com/ceph/ceph/pull/32834>`_, Jiaying Ren)
-* rgw: fix refcount tags to match and update object's idtag (`pr#30741 <https://github.com/ceph/ceph/pull/30741>`_, J. Eric Ivancich)
-* rgw: fix rgw crash when token is not base64 encode (`pr#32050 <https://github.com/ceph/ceph/pull/32050>`_, yuliyang)
-* rgw: gc remove tag after all sub io finish (`issue#40903 <http://tracker.ceph.com/issues/40903>`_, `pr#30733 <https://github.com/ceph/ceph/pull/30733>`_, Tianshan Qu)
-* rgw: Incorrectly calling ceph::buffer::list::decode_base64 in bucket policy (`pr#32832 <https://github.com/ceph/ceph/pull/32832>`_, GaryHyg)
-* rgw: maybe coredump when reload operator happened (`pr#33149 <https://github.com/ceph/ceph/pull/33149>`_, Richard Bai(白学余))
-* rgw: move forward marker even in case of many rgw.none indexes (`pr#32824 <https://github.com/ceph/ceph/pull/32824>`_, Ilsoo Byun)
-* rgw multisite: fixes for concurrent version creation (`pr#32057 <https://github.com/ceph/ceph/pull/32057>`_, Or Friedmann, Casey Bodley)
-* rgw: prevent bucket reshard scheduling if bucket is resharding (`pr#31298 <https://github.com/ceph/ceph/pull/31298>`_, J. Eric Ivancich)
-* rgw/pubsub: fix records/event json format to match documentation (`pr#32221 <https://github.com/ceph/ceph/pull/32221>`_, Yuval Lifshitz)
-* rgw: radosgw-admin: sync status displays id of shard furthest behind (`pr#32818 <https://github.com/ceph/ceph/pull/32818>`_, Casey Bodley)
-* rgw: return error if lock log shard fails (`pr#32825 <https://github.com/ceph/ceph/pull/32825>`_, zhangshaowen)
-* rgw/rgw_rest_conn.h: fix build with clang (`pr#32489 <https://github.com/ceph/ceph/pull/32489>`_, Bernd Zeimetz)
-* rgw: Select the std::bitset to resolv ambiguity (`pr#32504 <https://github.com/ceph/ceph/pull/32504>`_, Willem Jan Withagen)
-* rgw: support radosgw-admin zone/zonegroup placement get command (`pr#32835 <https://github.com/ceph/ceph/pull/32835>`_, jiahuizeng)
-* rgw: the http response code of delete bucket should not be 204-no-content (`pr#32833 <https://github.com/ceph/ceph/pull/32833>`_, Chang Liu)
-* rgw:  update s3-test download code for s3-test tasks (`pr#32229 <https://github.com/ceph/ceph/pull/32229>`_, Ali Maredia)
-* rgw: update the hash source for multipart entries during resharding (`pr#33183 <https://github.com/ceph/ceph/pull/33183>`_, dongdong tao)
-* rgw: url encode common prefixes for List Objects response (`pr#32058 <https://github.com/ceph/ceph/pull/32058>`_, Abhishek Lekshmanan)
-* rgw: when resharding store progress json (`pr#31683 <https://github.com/ceph/ceph/pull/31683>`_, Mark Kogan, Mark Nelson)
-* selinux: Allow ceph to read udev db (`pr#32259 <https://github.com/ceph/ceph/pull/32259>`_, Boris Ranto)
-
-
-v14.2.7 Nautilus
-================
-
-This is the seventh update to the Ceph Nautilus release series. This is
-a hotfix release primarily fixing a couple of security issues. We
-recommend that all users upgrade to this release.
-
-Notable Changes
----------------
-
-* CVE-2020-1699: Fixed a path traversal flaw in Ceph dashboard that
-  could allow for potential information disclosure (Ernesto Puerta)
-* CVE-2020-1700: Fixed a flaw in RGW beast frontend that could lead to
-  denial of service from an unauthenticated client (Or Friedmann)
-
-
-v14.2.6 Nautilus
-================
-
-This is the sixth update to the Ceph Nautilus release series. This is a hotfix
-release primarily fixing a regression introduced in v14.2.5, all nautilus users
-are advised to upgrade to this release.
-
-Notable Changes
----------------
-
-* This release fixes a ``ceph-mgr`` bug that caused mgr becoming unresponsive on
-  larger clusters `issue#43364 <https://tracker.ceph.com/issues/43364>`_ (`pr#32466 <https://github.com/ceph/ceph/pull/32466>`_, David Zafman, Neha Ojha)
-
-
-v14.2.5 Nautilus
-================
-
-This is the fifth release of the Ceph Nautilus release series. Among the many
-notable changes, this release fixes a critical BlueStore bug that was introduced
-in 14.2.3. All Nautilus users are advised to upgrade to this release.
-
-Notable Changes
----------------
-
-Critical fix:
-
-* This release fixes a `critical BlueStore bug <https://tracker.ceph.com/issues/42223>`_
-  introduced in 14.2.3 (and also present in 14.2.4) that can lead to data
-  corruption when a separate "WAL" device is used.
-
-New health warnings:
-
-* Ceph will now issue health warnings if daemons have recently crashed. Ceph
-  has been collecting crash reports since the initial Nautilus release, but the
-  health alerts are new. To view new crashes (or all crashes, if you've just
-  upgraded)::
-
-    ceph crash ls-new
-
-  To acknowledge a particular crash (or all crashes) and silence the health warning::
-
-    ceph crash archive <crash-id>
-    ceph crash archive-all
-
-* Ceph will issue a health warning if a RADOS pool's ``size`` is set to 1
-  or, in other words, if the pool is configured with no redundancy. Ceph will
-  stop issuing the warning if the pool size is set to the minimum
-  recommended value::
-
-    ceph osd pool set <pool-name> size <num-replicas>
-
-  The warning can be silenced with::
-
-    ceph config set global mon_warn_on_pool_no_redundancy false
-
-* A health warning is now generated if the average osd heartbeat ping
-  time exceeds a configurable threshold for any of the intervals
-  computed. The OSD computes 1 minute, 5 minute and 15 minute
-  intervals with average, minimum and maximum values.  New configuration
-  option `mon_warn_on_slow_ping_ratio` specifies a percentage of
-  `osd_heartbeat_grace` to determine the threshold.  A value of zero
-  disables the warning. New configuration option `mon_warn_on_slow_ping_time`
-  specified in milliseconds over-rides the computed value, causes a warning
-  when OSD heartbeat pings take longer than the specified amount.
-  A new admin command, `ceph daemon mgr.# dump_osd_network [threshold]`, will
-  list all connections with a ping time longer than the specified threshold or
-  value determined by the config options, for the average for any of the 3 intervals.
-  Another new admin command, `ceph daemon osd.# dump_osd_network [threshold]`,
-  will do the same but only including heartbeats initiated by the specified OSD.
-
-Changes in the telemetry module:
-
-* The telemetry module now reports more information.
-
-  First, there is a new 'device' channel, enabled by default, that
-  will report anonymized hard disk and SSD health metrics to
-  telemetry.ceph.com in order to build and improve device failure
-  prediction algorithms.  If you are not comfortable sharing device
-  metrics, you can disable that channel first before re-opting-in::
-
-    ceph config set mgr mgr/telemetry/channel_device false
-
-  Second, we now report more information about CephFS file systems,
-  including:
-
-    - how many MDS daemons (in total and per file system)
-    - which features are (or have been) enabled
-    - how many data pools
-    - approximate file system age (year + month of creation)
-    - how many files, bytes, and snapshots
-    - how much metadata is being cached
-
-  We have also added:
-
-    - which Ceph release the monitors are running
-    - whether msgr v1 or v2 addresses are used for the monitors
-    - whether IPv4 or IPv6 addresses are used for the monitors
-    - whether RADOS cache tiering is enabled (and which mode)
-    - whether pools are replicated or erasure coded, and
-      which erasure code profile plugin and parameters are in use
-    - how many hosts are in the cluster, and how many hosts have each type of daemon
-    - whether a separate OSD cluster network is being used
-    - how many RBD pools and images are in the cluster, and how many pools have RBD mirroring enabled
-    - how many RGW daemons, zones, and zonegroups are present; which RGW frontends are in use
-    - aggregate stats about the CRUSH map, like which algorithms are used, how
-      big buckets are, how many rules are defined, and what tunables are in
-      use
-
-  If you had telemetry enabled, you will need to re-opt-in with::
-
-    ceph telemetry on
-
-  You can view exactly what information will be reported first with::
-
-    ceph telemetry show        # see everything
-    ceph telemetry show basic  # basic cluster info (including all of the new info)
-
-OSD:
-
-* A new OSD daemon command, 'dump_recovery_reservations', reveals the
-  recovery locks held (in_progress) and waiting in priority queues.
-
-* Another new OSD daemon command, 'dump_scrub_reservations', reveals the
-  scrub reservations that are held for local (primary) and remote (replica) PGs.
-
-RGW:
-
-* RGW now supports S3 Object Lock set of APIs allowing for a WORM model for
-  storing objects. 6 new APIs have been added put/get bucket object lock,
-  put/get object retention, put/get object legal hold.
-
-* RGW now supports List Objects V2
-        
-Changelog
----------
-
-* bluestore/KernelDevice: fix RW_IO_MAX constant (`pr#31397 <https://github.com/ceph/ceph/pull/31397>`_, Sage Weil)
-* bluestore: Don't forget sub kv_submitted_waiters (`pr#30048 <https://github.com/ceph/ceph/pull/30048>`_, Jianpeng Ma)
-* bluestore: apply garbage collection against excessive blob count growth (`pr#30144 <https://github.com/ceph/ceph/pull/30144>`_, Igor Fedotov)
-* bluestore: apply shared_alloc_size to shared device with log level change (`pr#30229 <https://github.com/ceph/ceph/pull/30229>`_, Vikhyat Umrao, Sage Weil, Igor Fedotov, Neha Ojha)
-* bluestore: consolidate extents from the same device only (`pr#31644 <https://github.com/ceph/ceph/pull/31644>`_, Igor Fedotov)
-* bluestore: fix improper setting of STATE_KV_SUBMITTED (`pr#30755 <https://github.com/ceph/ceph/pull/30755>`_, Igor Fedotov)
-* bluestore: shallow fsck mode and legacy statfs auto repair (`pr#30685 <https://github.com/ceph/ceph/pull/30685>`_, Sage Weil, Igor Fedotov)
-* bluestore: tool to check fragmentation (`pr#29949 <https://github.com/ceph/ceph/pull/29949>`_, Adam Kupczyk)
-* build/ops: admin/build-doc: use python3 (`pr#30664 <https://github.com/ceph/ceph/pull/30664>`_, Kefu Chai)
-* build/ops: backport endian fixes (`issue#40114 <http://tracker.ceph.com/issues/40114>`_, `pr#30697 <https://github.com/ceph/ceph/pull/30697>`_, Ulrich Weigand, Jeff Layton)
-* build/ops: cmake,rgw: IBM Z build fixes (`pr#30696 <https://github.com/ceph/ceph/pull/30696>`_, Ulrich Weigand)
-* build/ops: cmake/BuildDPDK: ignore gcc8/9 warnings (`pr#30360 <https://github.com/ceph/ceph/pull/30360>`_, Yuval Lifshitz)
-* build/ops: cmake: Allow cephfs and ceph-mds to be build when building on FreeBSD (`pr#31011 <https://github.com/ceph/ceph/pull/31011>`_, Willem Jan Withagen)
-* build/ops: cmake: enforce C++17 instead of relying on cmake-compile-features (`pr#30283 <https://github.com/ceph/ceph/pull/30283>`_, Kefu Chai)
-* build/ops: fix build fail related to PYTHON_EXECUTABLE variable (`pr#30261 <https://github.com/ceph/ceph/pull/30261>`_, Ilsoo Byun)
-* build/ops: hidden corei7 requirement in binary packages (`pr#29772 <https://github.com/ceph/ceph/pull/29772>`_, Kefu Chai)
-* build/ops: install-deps.sh: add EPEL repo for non-x86_64 archs as well (`pr#30601 <https://github.com/ceph/ceph/pull/30601>`_, Kefu Chai, Nathan Cutler)
-* build/ops: install-deps.sh: install `python\*-devel` for python\*rpm-macros (`pr#30322 <https://github.com/ceph/ceph/pull/30322>`_, Kefu Chai)
-* build/ops: install-deps: do not install if rpm already installed and ceph.spec.in: s/pkgversion/version_nodots/ (`pr#30708 <https://github.com/ceph/ceph/pull/30708>`_, Jeff Layton, Kefu Chai)
-* build/ops: make patch build dependency explicit (`issue#40175 <http://tracker.ceph.com/issues/40175>`_, `pr#30046 <https://github.com/ceph/ceph/pull/30046>`_, Nathan Cutler)
-* build/ops: python3-cephfs should provide python36-cephfs (`pr#30983 <https://github.com/ceph/ceph/pull/30983>`_, Kefu Chai)
-* build/ops: rpm: always build ceph-test package (`pr#30049 <https://github.com/ceph/ceph/pull/30049>`_, Nathan Cutler)
-* build/ops: rpm: fdupes in SUSE builds to conform with packaging guidelines (`issue#40973 <http://tracker.ceph.com/issues/40973>`_, `pr#29784 <https://github.com/ceph/ceph/pull/29784>`_, Nathan Cutler)
-* build/ops: rpm: make librados2, libcephfs2 own (create) /etc/ceph (`pr#31125 <https://github.com/ceph/ceph/pull/31125>`_, Nathan Cutler)
-* build/ops: rpm: put librgw lttng SOs in the librgw-devel package (`issue#40975 <http://tracker.ceph.com/issues/40975>`_, `pr#29785 <https://github.com/ceph/ceph/pull/29785>`_, Nathan Cutler)
-* build/ops: seastar,dmclock: use CXX_FLAGS from parent project (`pr#30114 <https://github.com/ceph/ceph/pull/30114>`_, Kefu Chai)
-* build/ops: use gcc-8 (`issue#38892 <http://tracker.ceph.com/issues/38892>`_, `pr#30089 <https://github.com/ceph/ceph/pull/30089>`_, Kefu Chai)
-* tools: ceph-objectstore-tool: update-mon-db: do not fail if incmap is missing (`pr#30740 <https://github.com/ceph/ceph/pull/30740>`_, Kefu Chai)
-* ceph-volume: PVolumes.filter shouldn't purge itself (`pr#30805 <https://github.com/ceph/ceph/pull/30805>`_, Rishabh Dave)
-* ceph-volume: VolumeGroups.filter shouldn't purge itself (`pr#30807 <https://github.com/ceph/ceph/pull/30807>`_, Rishabh Dave)
-* ceph-volume: add Ceph's device id to inventory (`pr#31210 <https://github.com/ceph/ceph/pull/31210>`_, Sebastian Wagner)
-* ceph-volume: allow to skip restorecon calls (`pr#31555 <https://github.com/ceph/ceph/pull/31555>`_, Alfredo Deza)
-* ceph-volume: api/lvm: check if list of LVs is empty (`pr#31228 <https://github.com/ceph/ceph/pull/31228>`_, Rishabh Dave)
-* ceph-volume: check if we run in an selinux environment (`pr#31812 <https://github.com/ceph/ceph/pull/31812>`_, Jan Fajerski)
-* ceph-volume: do not fail when trying to remove crypt mapper (`pr#30554 <https://github.com/ceph/ceph/pull/30554>`_, Guillaume Abrioux)
-* ceph-volume: fix stderr failure to decode/encode when redirected (`pr#30300 <https://github.com/ceph/ceph/pull/30300>`_, Alfredo Deza)
-* ceph-volume: fix warnings raised by pytest (`pr#30676 <https://github.com/ceph/ceph/pull/30676>`_, Rishabh Dave)
-* ceph-volume: lvm list is O(n^2) (`pr#30093 <https://github.com/ceph/ceph/pull/30093>`_, Rishabh Dave)
-* ceph-volume: lvm.zap fix cleanup for db partitions (`issue#40664 <http://tracker.ceph.com/issues/40664>`_, `pr#30304 <https://github.com/ceph/ceph/pull/30304>`_, Dominik Csapak)
-* ceph-volume: mokeypatch calls to lvm related binaries (`pr#31405 <https://github.com/ceph/ceph/pull/31405>`_, Jan Fajerski)
-* ceph-volume: pre-install python-apt and its variants before test runs (`pr#30294 <https://github.com/ceph/ceph/pull/30294>`_, Alfredo Deza)
-* ceph-volume: rearrange api/lvm.py (`pr#31408 <https://github.com/ceph/ceph/pull/31408>`_, Rishabh Dave)
-* ceph-volume: systemd fix typo in log message (`pr#30520 <https://github.com/ceph/ceph/pull/30520>`_, Manu Zurmühl)
-* ceph-volume: use the OSD identifier when reporting success (`pr#29769 <https://github.com/ceph/ceph/pull/29769>`_, Alfredo Deza)
-* ceph-volume: zap always skips block.db, leaves them around (`issue#40664 <http://tracker.ceph.com/issues/40664>`_, `pr#30307 <https://github.com/ceph/ceph/pull/30307>`_, Alfredo Deza)
-* tools: ceph.in: do not preload ASan unless necessary (`pr#31676 <https://github.com/ceph/ceph/pull/31676>`_, Kefu Chai)
-* build/ops: ceph.spec.in: reserve 2500MB per build job (`pr#30370 <https://github.com/ceph/ceph/pull/30370>`_, Dan van der Ster)
-* tools: ceph_volume_client: convert string to bytes object (`issue#39405 <http://tracker.ceph.com/issues/39405>`_, `issue#40369 <http://tracker.ceph.com/issues/40369>`_, `issue#39510 <http://tracker.ceph.com/issues/39510>`_, `issue#40800 <http://tracker.ceph.com/issues/40800>`_, `issue#40460 <http://tracker.ceph.com/issues/40460>`_, `pr#30030 <https://github.com/ceph/ceph/pull/30030>`_, Rishabh Dave)
-* cephfs-shell: Convert paths type from string to bytes (`pr#30057 <https://github.com/ceph/ceph/pull/30057>`_, Varsha Rao)
-* cephfs: Allow mount.ceph to get mount info from ceph configs and keyrings (`pr#30521 <https://github.com/ceph/ceph/pull/30521>`_, Jeff Layton)
-* cephfs: avoid map been inserted by mistake (`pr#29878 <https://github.com/ceph/ceph/pull/29878>`_, XiaoGuoDong2019)
-* cephfs: client: more precise CEPH_CLIENT_CAPS_PENDING_CAPSNAP (`pr#30032 <https://github.com/ceph/ceph/pull/30032>`_, "Yan, Zheng")
-* cephfs: client: nfs-ganesha with cephfs client, removing dir reports not empty (`issue#40746 <http://tracker.ceph.com/issues/40746>`_, `pr#30442 <https://github.com/ceph/ceph/pull/30442>`_, Peng Xie)
-* cephfs: client: return -eio when sync file which unsafe reqs have been dropped (`issue#40877 <http://tracker.ceph.com/issues/40877>`_, `pr#30043 <https://github.com/ceph/ceph/pull/30043>`_, simon gao)
-* cephfs: fix a memory leak (`pr#29879 <https://github.com/ceph/ceph/pull/29879>`_, XiaoGuoDong2019)
-* cephfs: mds: Fix duplicate client entries in eviction list (`pr#30951 <https://github.com/ceph/ceph/pull/30951>`_, Sidharth Anupkrishnan)
-* cephfs: mds: cleanup truncating inodes when standby replay mds trim log segments (`pr#29591 <https://github.com/ceph/ceph/pull/29591>`_, "Yan, Zheng")
-* cephfs: mds: delay exporting directory whose pin value exceeds max rank id (`issue#40603 <http://tracker.ceph.com/issues/40603>`_, `pr#29938 <https://github.com/ceph/ceph/pull/29938>`_, Zhi Zhang)
-* cephfs: mds: evict an unresponsive client only when another client wants its caps (`pr#30031 <https://github.com/ceph/ceph/pull/30031>`_, Rishabh Dave)
-* cephfs: mds: fix InoTable::force_consume_to() (`pr#30041 <https://github.com/ceph/ceph/pull/30041>`_, "Yan, Zheng")
-* cephfs: mds: fix infinite loop in Locker::file_update_finish (`pr#31079 <https://github.com/ceph/ceph/pull/31079>`_, "Yan, Zheng")
-* cephfs: mds: make MDSIOContextBase delete itself when shutting down (`pr#30418 <https://github.com/ceph/ceph/pull/30418>`_, Xuehan Xu)
-* cephfs: mds: trim cache on regular schedule (`pr#30040 <https://github.com/ceph/ceph/pull/30040>`_, Patrick Donnelly)
-* cephfs: mds: wake up lock waiters after forcibly changing lock state (`issue#39987 <http://tracker.ceph.com/issues/39987>`_, `pr#30508 <https://github.com/ceph/ceph/pull/30508>`_, "Yan, Zheng")
-* cephfs: mount.ceph: properly handle -o strictatime (`pr#30039 <https://github.com/ceph/ceph/pull/30039>`_, Jeff Layton)
-* cephfs: qa: ignore expected MDS_CLIENT_LATE_RELEASE warning (`issue#40968 <http://tracker.ceph.com/issues/40968>`_, `pr#29811 <https://github.com/ceph/ceph/pull/29811>`_, Patrick Donnelly)
-* cephfs: qa: wait for MDS to come back after removing it (`issue#40967 <http://tracker.ceph.com/issues/40967>`_, `pr#29832 <https://github.com/ceph/ceph/pull/29832>`_, Patrick Donnelly)
-* cephfs: tests: power off still resulted in client sending session close (`issue#37681 <http://tracker.ceph.com/issues/37681>`_, `pr#29983 <https://github.com/ceph/ceph/pull/29983>`_, Patrick Donnelly)
-* common/ceph_context: avoid unnecessary wait during service thread shutdown (`pr#31097 <https://github.com/ceph/ceph/pull/31097>`_, Jason Dillaman)
-* common/config_proxy: hold lock while accessing mutable container (`pr#30661 <https://github.com/ceph/ceph/pull/30661>`_, Jason Dillaman)
-* common: fix typo in rgw_user_max_buckets option long description (`pr#31605 <https://github.com/ceph/ceph/pull/31605>`_, Alfonso Martínez)
-* core/osd: do not trust partially simplified pg_upmap_item (`issue#42052 <http://tracker.ceph.com/issues/42052>`_, `pr#30899 <https://github.com/ceph/ceph/pull/30899>`_, xie xingguo)
-* core: Health warnings on long network ping times (`issue#40640 <http://tracker.ceph.com/issues/40640>`_, `pr#30195 <https://github.com/ceph/ceph/pull/30195>`_, David Zafman)
-* core: If the nodeep-scrub/noscrub flags are set in pools instead of global cluster. List the pool names in the ceph status (`issue#38029 <http://tracker.ceph.com/issues/38029>`_, `pr#29991 <https://github.com/ceph/ceph/pull/29991>`_, Mohamad Gebai)
-* core: Improve health status for backfill_toofull and recovery_toofull and fix backfill_toofull seen on cluster where the most full OSD is at 1% (`pr#29999 <https://github.com/ceph/ceph/pull/29999>`_, David Zafman)
-* core: Make dumping of reservation info congruent between scrub and recovery (`pr#31444 <https://github.com/ceph/ceph/pull/31444>`_, David Zafman)
-* core: Revert "rocksdb: enable rocksdb_rmrange=true by default" (`pr#31612 <https://github.com/ceph/ceph/pull/31612>`_, Neha Ojha)
-* core: filestore pre-split may not split enough directories (`issue#39390 <http://tracker.ceph.com/issues/39390>`_, `pr#29988 <https://github.com/ceph/ceph/pull/29988>`_, Jeegn Chen)
-* core: kv/RocksDBStore: tell rocksdb to set mode to 0600, not 0644 (`pr#31031 <https://github.com/ceph/ceph/pull/31031>`_, Sage Weil)
-* core: mon/MonClient: ENXIO when sending command to down mon (`pr#31037 <https://github.com/ceph/ceph/pull/31037>`_, Sage Weil, Greg Farnum)
-* core: mon/MonCommands: "smart" only needs read permission (`pr#31111 <https://github.com/ceph/ceph/pull/31111>`_, Kefu Chai)
-* core: mon/MonMap: encode (more) valid compat monmap when we have v2-only addrs (`pr#31658 <https://github.com/ceph/ceph/pull/31658>`_, Sage Weil)
-* core: mon/Monitor.cc: fix condition that checks for unrecognized auth mode (`pr#31038 <https://github.com/ceph/ceph/pull/31038>`_, Neha Ojha)
-* core: mon/OSDMonitor: Use generic priority cache tuner for mon caches (`pr#30419 <https://github.com/ceph/ceph/pull/30419>`_, Sridhar Seshasayee, Kefu Chai, Mykola Golub, Mark Nelson)
-* core: mon/OSDMonitor: add check for crush rule size in pool set size command (`pr#30941 <https://github.com/ceph/ceph/pull/30941>`_, Vikhyat Umrao)
-* core: mon/OSDMonitor: trim not-longer-exist failure reporters (`pr#30904 <https://github.com/ceph/ceph/pull/30904>`_, NancySu05)
-* core: mon/PGMap: fix incorrect pg_pool_sum when delete pool (`pr#31704 <https://github.com/ceph/ceph/pull/31704>`_, luo rixin)
-* core: mon: C_AckMarkedDown has not handled the Callback Arguments (`pr#29997 <https://github.com/ceph/ceph/pull/29997>`_, NancySu05)
-* core: mon: ensure prepare_failure() marks no_reply on op (`pr#30480 <https://github.com/ceph/ceph/pull/30480>`_, Joao Eduardo Luis)
-* core: mon: show pool id in pool ls command (`issue#40287 <http://tracker.ceph.com/issues/40287>`_, `pr#30486 <https://github.com/ceph/ceph/pull/30486>`_, Chang Liu)
-* core: msg,mon/MonClient: fix auth for clients without CEPHX_V2 feature (`pr#30524 <https://github.com/ceph/ceph/pull/30524>`_, Sage Weil)
-* core: msg/auth: handle decode errors instead of throwing exceptions (`pr#31099 <https://github.com/ceph/ceph/pull/31099>`_, Sage Weil)
-* core: msg/simple: reset in_seq_acked to zero when session is reset (`pr#29592 <https://github.com/ceph/ceph/pull/29592>`_, Xiangyang Yu)
-* core: os/bluestore: fix objectstore_blackhole read-after-write (`pr#31019 <https://github.com/ceph/ceph/pull/31019>`_, Sage Weil)
-* core: osd/OSDCap: Check for empty namespace (`issue#40835 <http://tracker.ceph.com/issues/40835>`_, `pr#29998 <https://github.com/ceph/ceph/pull/29998>`_, Brad Hubbard)
-* core: mon/OSDMonitor: make memory autotune disable itself if no rocksdb (`pr#32045 <https://github.com/ceph/ceph/pull/32045>`_, Sage Weil)
-* core: osd/PG: Add PG to large omap log message (`pr#30923 <https://github.com/ceph/ceph/pull/30923>`_, Brad Hubbard)
-* core: osd/PGLog: persist num_objects_missing for replicas when peering is done (`pr#31077 <https://github.com/ceph/ceph/pull/31077>`_, xie xingguo)
-* core: osd/PeeringState: do not complain about past_intervals constrained by oldest epoch (`pr#30000 <https://github.com/ceph/ceph/pull/30000>`_, Sage Weil)
-* core: osd/PeeringState: fix wrong history of merge target (`pr#30280 <https://github.com/ceph/ceph/pull/30280>`_, xie xingguo)
-* core: osd/PeeringState: recover_got - add special handler for empty log and improvements to standalone tests (`pr#30528 <https://github.com/ceph/ceph/pull/30528>`_, Sage Weil, David Zafman, xie xingguo)
-* core: osd/PrimaryLogPG: Avoid accessing destroyed references in finish_degr… (`pr#29994 <https://github.com/ceph/ceph/pull/29994>`_, Tao Ning)
-* core: osd/PrimaryLogPG: update oi.size on write op implicitly truncating ob… (`pr#30278 <https://github.com/ceph/ceph/pull/30278>`_, xie xingguo)
-* core: osd/ReplicatedBackend: check against empty data_included before enabling crc (`pr#29716 <https://github.com/ceph/ceph/pull/29716>`_, xie xingguo)
-* core: osd/osd_types: fix {omap,hitset_bytes}_stats_invalid handling on spli… (`pr#30643 <https://github.com/ceph/ceph/pull/30643>`_, Sage Weil)
-* core: osd: Better error message when OSD count is less than osd_pool_default_size (`issue#38617 <http://tracker.ceph.com/issues/38617>`_, `pr#29992 <https://github.com/ceph/ceph/pull/29992>`_, Kefu Chai, Sage Weil, zjh)
-* core: osd: Remove unused osdmap flags full, nearfull from output (`pr#30900 <https://github.com/ceph/ceph/pull/30900>`_, David Zafman)
-* core: osd: add log information to record the cause of do_osd_ops failure (`pr#30546 <https://github.com/ceph/ceph/pull/30546>`_, NancySu05)
-* core: osd: clear PG_STATE_CLEAN when repair object (`pr#30050 <https://github.com/ceph/ceph/pull/30050>`_, Zengran Zhang)
-* core: osd: fix possible crash on sending dynamic perf stats report (`pr#30648 <https://github.com/ceph/ceph/pull/30648>`_, Mykola Golub)
-* core: osd: merge replica log on primary need according to replica log's crt (`pr#30051 <https://github.com/ceph/ceph/pull/30051>`_, Zengran Zhang)
-* core: osd: prime splits/merges for any potential fabricated split/merge par… (`issue#38483 <http://tracker.ceph.com/issues/38483>`_, `pr#30371 <https://github.com/ceph/ceph/pull/30371>`_, xie xingguo)
-* core: osd: release backoffs during merge (`pr#31822 <https://github.com/ceph/ceph/pull/31822>`_, Sage Weil)
-* core: osd: rollforward may need to mark pglog dirty (`issue#40403 <http://tracker.ceph.com/issues/40403>`_, `pr#31034 <https://github.com/ceph/ceph/pull/31034>`_, Zengran Zhang)
-* core: osd: scrub error on big objects; make bluestore refuse to start on big objects (`pr#30783 <https://github.com/ceph/ceph/pull/30783>`_, David Zafman, Sage Weil)
-* core: osd: support osd_repair_during_recovery (`issue#40620 <http://tracker.ceph.com/issues/40620>`_, `pr#29748 <https://github.com/ceph/ceph/pull/29748>`_, Jeegn Chen)
-* core: pool_stat.dump() - value of num_store_stats is wrong (`issue#39340 <http://tracker.ceph.com/issues/39340>`_, `pr#29946 <https://github.com/ceph/ceph/pull/29946>`_, xie xingguo)
-* doc/ceph-kvstore-tool: add description for 'stats' command (`pr#30245 <https://github.com/ceph/ceph/pull/30245>`_, Josh Durgin, Adam Kupczyk)
-* doc/mgr/telemetry: update default interval (`pr#31009 <https://github.com/ceph/ceph/pull/31009>`_, Tim Serong)
-* doc/rbd: s/guess/xml/ for codeblock lexer (`pr#31074 <https://github.com/ceph/ceph/pull/31074>`_, Kefu Chai)
-* doc: Fix rbd namespace documentation (`pr#29731 <https://github.com/ceph/ceph/pull/29731>`_, Ricardo Marques)
-* doc: cephfs: add section on fsync error reporting to posix.rst (`issue#24641 <http://tracker.ceph.com/issues/24641>`_, `pr#30025 <https://github.com/ceph/ceph/pull/30025>`_, Jeff Layton)
-* doc: default values for mon_health_to_clog\_\* were flipped (`pr#30003 <https://github.com/ceph/ceph/pull/30003>`_, James McClune)
-* doc: fix urls in posix.rst (`pr#30686 <https://github.com/ceph/ceph/pull/30686>`_, Jos Collin)
-* doc: max_misplaced option was renamed in Nautilus (`pr#30649 <https://github.com/ceph/ceph/pull/30649>`_, Nathan Fish)
-* doc: pg_num should always be a power of two (`pr#30004 <https://github.com/ceph/ceph/pull/30004>`_, Lars Marowsky-Bree, Kai Wagner)
-* doc: update bluestore cache settings and clarify data fraction (`issue#39522 <http://tracker.ceph.com/issues/39522>`_, `pr#31259 <https://github.com/ceph/ceph/pull/31259>`_, Jan Fajerski)
-* mgr/ActivePyModules: behave if a module queries a devid that does not exist (`pr#31411 <https://github.com/ceph/ceph/pull/31411>`_, Sage Weil)
-* mgr/BaseMgrStandbyModule: drop GIL in ceph_get_module_option() (`pr#30773 <https://github.com/ceph/ceph/pull/30773>`_, Kefu Chai)
-* mgr/balancer: python3 compatibility issue (`pr#31012 <https://github.com/ceph/ceph/pull/31012>`_, Mykola Golub)
-* mgr/crash: backport archive feature, health alerts (`pr#30851 <https://github.com/ceph/ceph/pull/30851>`_, Sage Weil)
-* mgr/crash: try client.crash[.host] before client.admin; add mon profile (`issue#40781 <http://tracker.ceph.com/issues/40781>`_, `pr#30844 <https://github.com/ceph/ceph/pull/30844>`_, Sage Weil, Dan Mick)
-* mgr/dashboard: Add transifex-i18ntool (`pr#31160 <https://github.com/ceph/ceph/pull/31160>`_, Sebastian Krah)
-* mgr/dashboard: Allow disabling redirection on standby dashboards (`issue#41813 <https://tracker.ceph.com/issues/41813>`_, `pr#30382 <https://github.com/ceph/ceph/pull/30382>`_, Volker Theile)
-* mgr/dashboard: Configuring an URL prefix does not work as expected (`pr#31375 <https://github.com/ceph/ceph/pull/31375>`_, Volker Theile)
-* mgr/dashbaord: Fix calculation of PG status percentage (`issue#41809 <https://tracker.ceph.com/issues/41089>`_, `pr#30394 <https://github.com/ceph/ceph/pull/30394>`_, Tiago Melo)
-* mgr/dashboard: Fix CephFS chart (`pr#30691 <https://github.com/ceph/ceph/pull/30691>`_, Stephan Müller)
-* mgr/dashboard: Fix grafana dashboards (`pr#31733 <https://github.com/ceph/ceph/pull/31733>`_, Radu Toader)
-* mgr/dashboard: Improve position of MDS chart tooltip (`pr#31565 <https://github.com/ceph/ceph/pull/31565>`_, Tiago Melo)
-* mgr/dashboard: Provide the name of the object being deleted (`pr#31263 <https://github.com/ceph/ceph/pull/31263>`_, Ricardo Marques)
-* mgr/dashboard: RBD tests must use pools with power-of-two pg_num (`pr#31522 <https://github.com/ceph/ceph/pull/31522>`_, Ricardo Marques)
-* mgr/dashboard: Set RO as the default access_type for RGW NFS exports (`pr#30516 <https://github.com/ceph/ceph/pull/30516>`_, Tiago Melo)
-* mgr/dashboard: Wait for breadcrumb text is present in e2e tests (`pr#31576 <https://github.com/ceph/ceph/pull/31576>`_, Volker Theile)
-* mgr/dashboard: access_control: add grafana scope read access to \*-manager roles (`pr#30259 <https://github.com/ceph/ceph/pull/30259>`_, Ricardo Dias)
-* mgr/dashboard: do not log tokens (`pr#31413 <https://github.com/ceph/ceph/pull/31413>`_, Kefu Chai)
-* mgr/dashboard: do not show non-pool data in pool details (`pr#31516 <https://github.com/ceph/ceph/pull/31516>`_, Alfonso Martínez)
-* mgr/dashboard: edit/clone/copy rbd image after its data is received (`pr#31349 <https://github.com/ceph/ceph/pull/31349>`_, Alfonso Martínez)
-* mgr/dashboard: internationalization support with AOT enabled (`pr#30910 <https://github.com/ceph/ceph/pull/30910>`_, Ricardo Dias, Tiago Melo)
-* mgr/dashboard: run-backend-api-tests.sh improvements (`pr#29487 <https://github.com/ceph/ceph/pull/29487>`_, Alfonso Martínez, Kefu Chai)
-* mgr/dashboard: tasks: only unblock controller thread after TaskManager thread (`pr#31526 <https://github.com/ceph/ceph/pull/31526>`_, Ricardo Dias)
-* mgr/devicehealth: do not scrape mon devices (`pr#31446 <https://github.com/ceph/ceph/pull/31446>`_, Sage Weil)
-* mgr/devicehealth: import _strptime directly (`pr#32082 <https://github.com/ceph/ceph/pull/32082>`_, Sage Weil)
-* mgr/k8sevents: Initial ceph -> k8s events integration (`pr#30215 <https://github.com/ceph/ceph/pull/30215>`_, Paul Cuzner, Sebastian Wagner)
-* mgr/pg_autoscaler: fix pool_logical_used (`pr#31100 <https://github.com/ceph/ceph/pull/31100>`_, Ansgar Jazdzewski)
-* mgr/pg_autoscaler: fix race with pool deletion (`pr#30008 <https://github.com/ceph/ceph/pull/30008>`_, Sage Weil)
-* mgr/prometheus: Cast collect_timeout (scrape_interval) to float (`pr#30007 <https://github.com/ceph/ceph/pull/30007>`_, Ben Meekhof)
-* mgr/prometheus: Fix KeyError in get_mgr_status (`pr#30774 <https://github.com/ceph/ceph/pull/30774>`_, Sebastian Wagner)
-* mgr/rbd_support: module.py:1088: error: Name 'image_spec' is not defined (`pr#29978 <https://github.com/ceph/ceph/pull/29978>`_, Jason Dillaman)
-* mgr/restful: requests api adds support multiple commands (`pr#31334 <https://github.com/ceph/ceph/pull/31334>`_, Duncan Chiang)
-* mgr/telemetry: backport a ton of stuff (`pr#30849 <https://github.com/ceph/ceph/pull/30849>`_, alfonsomthd, Kefu Chai, Sage Weil, Dan Mick)
-* mgr/volumes: fix incorrect snapshot path creation (`pr#31076 <https://github.com/ceph/ceph/pull/31076>`_, Ramana Raja)
-* mgr/volumes: handle exceptions in purge thread with retry (`issue#41218 <http://tracker.ceph.com/issues/41218>`_, `pr#30455 <https://github.com/ceph/ceph/pull/30455>`_, Venky Shankar)
-* mgr/volumes: list FS subvolumes, subvolume groups, and their snapshots (`pr#30827 <https://github.com/ceph/ceph/pull/30827>`_, Jos Collin)
-* mgr/volumes: minor fixes (`pr#29926 <https://github.com/ceph/ceph/pull/29926>`_, Venky Shankar, Jos Collin, Ramana Raja)
-* mgr/volumes: protection for "fs volume rm" command (`pr#30768 <https://github.com/ceph/ceph/pull/30768>`_, Jos Collin, Ramana Raja)
-* mgr/zabbix: Fix typo in key name for PGs in backfill_wait state (`issue#39666 <http://tracker.ceph.com/issues/39666>`_, `pr#30006 <https://github.com/ceph/ceph/pull/30006>`_, Wido den Hollander)
-* mgr/zabbix: encode string for Python 3 compatibility (`pr#30016 <https://github.com/ceph/ceph/pull/30016>`_, Nathan Cutler)
-* mgr/{dashboard,prometheus}: return FQDN instead of '0.0.0.0' (`pr#31482 <https://github.com/ceph/ceph/pull/31482>`_, Patrick Seidensal)
-* mgr: Release GIL before calling OSDMap::calc_pg_upmaps() (`pr#31682 <https://github.com/ceph/ceph/pull/31682>`_, David Zafman, Shyukri Shyukriev)
-* mgr: Unable to reset / unset module options (`issue#40779 <http://tracker.ceph.com/issues/40779>`_, `pr#29550 <https://github.com/ceph/ceph/pull/29550>`_, Sebastian Wagner)
-* mgr: do not reset reported if a new metric is not collected (`pr#30390 <https://github.com/ceph/ceph/pull/30390>`_, Ilsoo Byun)
-* mgr: fix weird health-alert daemon key (`pr#31039 <https://github.com/ceph/ceph/pull/31039>`_, xie xingguo)
-* mgr: set hostname in DeviceState::set_metadata() (`pr#30624 <https://github.com/ceph/ceph/pull/30624>`_, Kefu Chai)
-* pybind/cephfs: Modification to error message (`pr#30026 <https://github.com/ceph/ceph/pull/30026>`_, Varsha Rao)
-* pybind/rados: fix set_omap() crash on py3 (`pr#30622 <https://github.com/ceph/ceph/pull/30622>`_, Sage Weil)
-* pybind/rbd: deprecate `parent_info` (`pr#30818 <https://github.com/ceph/ceph/pull/30818>`_, Ricardo Marques)
-* rbd: rbd-mirror: cannot restore deferred deletion mirrored images (`pr#30825 <https://github.com/ceph/ceph/pull/30825>`_, Jason Dillaman, Mykola Golub)
-* rbd: rbd-mirror: don't overwrite status error returned by replay (`pr#29870 <https://github.com/ceph/ceph/pull/29870>`_, Mykola Golub)
-* rbd: rbd-mirror: ignore errors relating to parsing the cluster config file (`pr#30116 <https://github.com/ceph/ceph/pull/30116>`_, Jason Dillaman)
-* rbd: rbd-mirror: simplify peer bootstrapping (`pr#30821 <https://github.com/ceph/ceph/pull/30821>`_, Jason Dillaman)
-* rbd: rbd-nbd: add netlink support and nl resize (`pr#30532 <https://github.com/ceph/ceph/pull/30532>`_, Mike Christie)
-* rbd: cls/rbd: sanitize entity instance messenger version type (`pr#30822 <https://github.com/ceph/ceph/pull/30822>`_, Jason Dillaman)
-* rbd: cls/rbd: sanitize the mirror image status peer address after reading from disk (`pr#31833 <https://github.com/ceph/ceph/pull/31833>`_, Jason Dillaman)
-* rbd: krbd: avoid udev netlink socket overrun and retry on transient errors from udev_enumerate_scan_devices() (`pr#31075 <https://github.com/ceph/ceph/pull/31075>`_, Ilya Dryomov, Adam C. Emerson)
-* rbd: librbd: always try to acquire exclusive lock when removing image (`pr#29869 <https://github.com/ceph/ceph/pull/29869>`_, Mykola Golub)
-* rbd: librbd: behave more gracefully when data pool removed (`pr#30824 <https://github.com/ceph/ceph/pull/30824>`_, Mykola Golub)
-* rbd: librbd: v1 clones are restricted to the same namespace (`pr#30823 <https://github.com/ceph/ceph/pull/30823>`_, Jason Dillaman)
-* mgr/restful: Query nodes_by_id for items (`pr#31261 <https://github.com/ceph/ceph/pull/31261>`_, Boris Ranto)
-* rgw/amqp: fix race condition in AMQP unit test (`pr#30889 <https://github.com/ceph/ceph/pull/30889>`_, Yuval Lifshitz)
-* rgw/amqp: remove flaky amqp test (`pr#31628 <https://github.com/ceph/ceph/pull/31628>`_, Yuval Lifshitz)
-* rgw/pubsub: backport notifications and pubsub (`pr#30579 <https://github.com/ceph/ceph/pull/30579>`_, Yuval Lifshitz)
-* rgw/rgw_op: Remove get_val from hotpath via legacy options (`pr#30160 <https://github.com/ceph/ceph/pull/30160>`_, Mark Nelson)
-* rgw: Potential crash in putbj (`pr#29898 <https://github.com/ceph/ceph/pull/29898>`_, Adam C. Emerson)
-* rgw: Put User Policy is sensitive to whitespace (`pr#29970 <https://github.com/ceph/ceph/pull/29970>`_, Abhishek Lekshmanan)
-* rgw: RGWCoroutine::call(nullptr) sets retcode=0 (`pr#30248 <https://github.com/ceph/ceph/pull/30248>`_, Casey Bodley)
-* rgw: Swift metadata dropped after S3 bucket versioning enabled (`pr#29961 <https://github.com/ceph/ceph/pull/29961>`_, Marcus Watts)
-* rgw: add S3 object lock feature to support object worm (`pr#29905 <https://github.com/ceph/ceph/pull/29905>`_, Chang Liu, Casey Bodley, zhang Shaowen)
-* rgw: add minssing admin property when sync user info (`pr#30680 <https://github.com/ceph/ceph/pull/30680>`_, zhang Shaowen)
-* rgw: beast frontend throws an exception when running out of FDs (`pr#29963 <https://github.com/ceph/ceph/pull/29963>`_, Yuval Lifshitz)
-* rgw: data/bilogs are trimmed when no peers are reading them (`issue#39487 <http://tracker.ceph.com/issues/39487>`_, `pr#30999 <https://github.com/ceph/ceph/pull/30999>`_, Casey Bodley)
-* rgw: datalog/mdlog trim commands loop until done (`pr#30869 <https://github.com/ceph/ceph/pull/30869>`_, Casey Bodley)
-* rgw: dns name is not case sensitive (`issue#40995 <http://tracker.ceph.com/issues/40995>`_, `pr#29971 <https://github.com/ceph/ceph/pull/29971>`_, Casey Bodley, Abhishek Lekshmanan)
-* rgw: fix a bug that lifecycle expiraton generates delete marker continuously (`issue#40393 <http://tracker.ceph.com/issues/40393>`_, `pr#30037 <https://github.com/ceph/ceph/pull/30037>`_, zhang Shaowen)
-* rgw: fix cls_bucket_list_unordered() partial results (`pr#30252 <https://github.com/ceph/ceph/pull/30252>`_, Mark Kogan)
-* rgw: fix data sync start delay if remote haven't init data_log (`pr#30509 <https://github.com/ceph/ceph/pull/30509>`_, Tianshan Qu)
-* rgw: fix default storage class for get_compression_type (`pr#31026 <https://github.com/ceph/ceph/pull/31026>`_, Casey Bodley)
-* rgw: fix drain handles error when deleting bucket with bypass-gc option (`pr#29956 <https://github.com/ceph/ceph/pull/29956>`_, dongdong tao)
-* rgw: fix list bucket with delimiter wrongly skip some special keys (`issue#40905 <http://tracker.ceph.com/issues/40905>`_, `pr#30068 <https://github.com/ceph/ceph/pull/30068>`_, Tianshan Qu)
-* rgw: fix memory growth while deleteing objects with (`pr#30472 <https://github.com/ceph/ceph/pull/30472>`_, Mark Kogan)
-* rgw: fix the bug of rgw not doing necessary checking to website configuration (`issue#40678 <http://tracker.ceph.com/issues/40678>`_, `pr#30325 <https://github.com/ceph/ceph/pull/30325>`_, Enming Zhang)
-* rgw: fixed "unrecognized arg" error when using "radosgw-admin zone rm" (`pr#30247 <https://github.com/ceph/ceph/pull/30247>`_, Hongang Chen)
-* rgw: housekeeping reset stats (`pr#29803 <https://github.com/ceph/ceph/pull/29803>`_, J. Eric Ivancich)
-* rgw: increase beast parse buffer size to 64k (`pr#30437 <https://github.com/ceph/ceph/pull/30437>`_, Casey Bodley)
-* rgw: ldap auth: S3 auth failure should return InvalidAccessKeyId (`pr#30651 <https://github.com/ceph/ceph/pull/30651>`_, Matt Benjamin)
-* rgw: lifecycle days may be 0 (`pr#31073 <https://github.com/ceph/ceph/pull/31073>`_, Matt Benjamin)
-* rgw: lifecycle transitions on non existent placement targets (`pr#29955 <https://github.com/ceph/ceph/pull/29955>`_, Abhishek Lekshmanan)
-* rgw: list objects version 2 (`pr#29849 <https://github.com/ceph/ceph/pull/29849>`_, Albin Antony, zhang Shaowen)
-* rgw: multisite: radosgw-admin bucket sync status incorrectly reports "caught up" during full sync (`issue#40806 <http://tracker.ceph.com/issues/40806>`_, `pr#29974 <https://github.com/ceph/ceph/pull/29974>`_, Casey Bodley)
-* rgw: potential realm watch lost (`issue#40991 <http://tracker.ceph.com/issues/40991>`_, `pr#29972 <https://github.com/ceph/ceph/pull/29972>`_, Tianshan Qu)
-* rgw: protect AioResultList by a lock to avoid race condition (`pr#30746 <https://github.com/ceph/ceph/pull/30746>`_, Ilsoo Byun)
-* rgw: radosgw-admin: add --uid check in bucket list command (`pr#30604 <https://github.com/ceph/ceph/pull/30604>`_, Vikhyat Umrao)
-* rgw: returns one byte more data than the requested range from the SLO object (`pr#29960 <https://github.com/ceph/ceph/pull/29960>`_, Andrey Groshev)
-* rgw: rgw-admin: search for user by access key (`pr#29959 <https://github.com/ceph/ceph/pull/29959>`_, Matt Benjamin)
-* rgw: rgw-log issues the wrong message when decompression fails (`pr#29965 <https://github.com/ceph/ceph/pull/29965>`_, Han Fengzhe)
-* rgw: rgw_file: directory enumeration can be accelerated 1-2 orders of magnitude taking stats from bucket index Part I (stats from S3/Swift only) (`issue#40456 <http://tracker.ceph.com/issues/40456>`_, `pr#29954 <https://github.com/ceph/ceph/pull/29954>`_, Matt Benjamin)
-* rgw: rgw_file: readdir: do not construct markers w/leading '/' (`pr#29969 <https://github.com/ceph/ceph/pull/29969>`_, Matt Benjamin)
-* rgw: silence warning "control reaches end of non-void function" (`issue#40747 <http://tracker.ceph.com/issues/40747>`_, `pr#31742 <https://github.com/ceph/ceph/pull/31742>`_, Jos Collin)
-* rgw: sync with elastic search v7 (`pr#31027 <https://github.com/ceph/ceph/pull/31027>`_, Chang Liu)
-* rgw: use explicit to_string() overload for boost::string_ref (`issue#39611 <http://tracker.ceph.com/issues/39611>`_, `pr#31650 <https://github.com/ceph/ceph/pull/31650>`_, Casey Bodley, Ulrich Weigand)
-* rgw: when using radosgw-admin to list bucket, can set --max-entries excessively high (`pr#29777 <https://github.com/ceph/ceph/pull/29777>`_, J. Eric Ivancich)
-* tests: "CMake Error" in test_envlibrados_for_rocksdb.sh (`pr#29979 <https://github.com/ceph/ceph/pull/29979>`_, Kefu Chai)
-* tests: Get libcephfs and cephfs to compile with FreeBSD (`pr#31136 <https://github.com/ceph/ceph/pull/31136>`_, Willem Jan Withagen)
-* tests: add debugging failed osd-release setting (`pr#31040 <https://github.com/ceph/ceph/pull/31040>`_, Patrick Donnelly)
-* tests: cephfs: fix malformed qa suite config (`pr#30038 <https://github.com/ceph/ceph/pull/30038>`_, Patrick Donnelly)
-* tests: cls_rbd/test_cls_rbd: update TestClsRbd.sparsify (`pr#30354 <https://github.com/ceph/ceph/pull/30354>`_, Kefu Chai)
-* tests: cls_rbd: removed mirror peer pool test cases (`pr#30948 <https://github.com/ceph/ceph/pull/30948>`_, Jason Dillaman)
-* tests: enable dashboard tests to be run with "--suite rados/dashboard" (`pr#31248 <https://github.com/ceph/ceph/pull/31248>`_, Nathan Cutler)
-* tests: librbd: set nbd timeout due to newer kernels defaulting it on (`pr#30423 <https://github.com/ceph/ceph/pull/30423>`_, Jason Dillaman)
-* tests: qa/suites/krbd: run unmap subsuite with msgr1 only (`pr#31290 <https://github.com/ceph/ceph/pull/31290>`_, Ilya Dryomov)
-* tests: qa/tasks/cbt: run stop-all.sh while shutting down (`pr#31304 <https://github.com/ceph/ceph/pull/31304>`_, Sage Weil)
-* tests: qa/tasks/ceph.conf.template: increase mon tell retries (`pr#31641 <https://github.com/ceph/ceph/pull/31641>`_, Sage Weil)
-* tests: qa/workunits/rbd: stress test `rbd mirror pool status --verbose` (`pr#29871 <https://github.com/ceph/ceph/pull/29871>`_, Mykola Golub)
-* tests: qa: avoid page cache for krbd discard round off tests (`pr#30464 <https://github.com/ceph/ceph/pull/30464>`_, Ilya Dryomov)
-* tests: qa: sleep briefly after resetting kclient (`pr#29750 <https://github.com/ceph/ceph/pull/29750>`_, Patrick Donnelly)
-* tests: rados/mgr/tasks/module_selftest: whitelist mgr client getting blacklisted (`issue#40867 <http://tracker.ceph.com/issues/40867>`_, `pr#29649 <https://github.com/ceph/ceph/pull/29649>`_, Sage Weil)
-* tests: test_librados_build.sh: grab from nautilus branch in nautilus (`pr#31604 <https://github.com/ceph/ceph/pull/31604>`_, Nathan Cutler)
-* tests: valgrind: UninitCondition in ceph::crypto::onwire::AES128GCM_OnWireRxHandler::authenticated_decrypt_update_final() (`issue#38827 <http://tracker.ceph.com/issues/38827>`_, `pr#29928 <https://github.com/ceph/ceph/pull/29928>`_, Radoslaw Zarzynski)
-* tools/rados: add --pgid in help (`pr#30607 <https://github.com/ceph/ceph/pull/30607>`_, Vikhyat Umrao)
-* tools/rados: call pool_lookup() after rados is connected (`pr#30605 <https://github.com/ceph/ceph/pull/30605>`_, Vikhyat Umrao)
-* tools/rbd-ggate: close log before running postfork (`pr#30120 <https://github.com/ceph/ceph/pull/30120>`_, Willem Jan Withagen)
-* tools: ceph-backport.sh: add deprecation warning (`pr#30748 <https://github.com/ceph/ceph/pull/30748>`_, Nathan Cutler)
-* tools: ceph-objectstore-tool can't remove head with bad snapset (`pr#30080 <https://github.com/ceph/ceph/pull/30080>`_, David Zafman)
-
-
-v14.2.4 Nautilus
-================
-
-This is the fourth release in the Ceph Nautilus stable release series. Its sole
-purpose is to fix a regression that found its way into the previous release.
-
-Notable Changes
----------------
-
-* The ceph-volume in Nautilus v14.2.3 was found to contain a serious
-  regression, described in ``https://tracker.ceph.com/issues/41660``, which 
-  prevented deployment tools like ceph-ansible, DeepSea, Rook, etc. from 
-  deploying/removing OSDs.
-
-Changelog
----------
-
-* ceph-volume: fix stderr failure to decode/encode when redirected (`pr#30300 <https://github.com/ceph/ceph/pull/30300>`_, Alfredo Deza)
-
-
-v14.2.3 Nautilus
-================
-
-This is the third bug fix release of Ceph Nautilus release series. We recommend
-all Nautilus users upgrade to this release. For upgrading from older releases of
-ceph, general guidelines for upgrade to nautilus must be followed
-:ref:`nautilus-old-upgrade`.
-
-Notable Changes
----------------
-
-* `CVE-2019-10222` - Fixed a denial of service vulnerability where an
-  unauthenticated client of Ceph Object Gateway could trigger a crash from an
-  uncaught exception
-
-* Nautilus-based librbd clients can now open images on Jewel clusters.
-
-* The RGW `num_rados_handles` has been removed. If you were using a value of
-  `num_rados_handles` greater than 1, multiply your current
-  `objecter_inflight_ops` and `objecter_inflight_op_bytes` parameters by the
-  old `num_rados_handles` to get the same throttle behavior.
-
-* The secure mode of Messenger v2 protocol is no longer experimental with this
-  release. This mode is now the preferred mode of connection for monitors.
-
-* "osd_deep_scrub_large_omap_object_key_threshold" has been lowered to detect an
-  object with large number of omap keys more easily.
-
-* The Ceph Dashboard now supports silencing Prometheus alert notifications.
-
-Changelog
----------
-
-* bluestore: 50-100% iops lost due to bluefs_preextend_wal_files = false (`issue#38559 <http://tracker.ceph.com/issues/38559>`_, `pr#28573 <https://github.com/ceph/ceph/pull/28573>`_, Vitaliy Filippov)
-* bluestore: add slow op detection for collection_listing (`pr#29227 <https://github.com/ceph/ceph/pull/29227>`_, Igor Fedotov)
-* bluestore: avoid length overflow in extents returned by Stupid Allocator (`issue#40703 <http://tracker.ceph.com/issues/40703>`_, `pr#29023 <https://github.com/ceph/ceph/pull/29023>`_, Igor Fedotov)
-* bluestore/bluefs_types: consolidate contiguous extents (`pr#28862 <https://github.com/ceph/ceph/pull/28862>`_, Sage Weil)
-* bluestore/bluestore-tool: minor fixes around migrate (`pr#28893 <https://github.com/ceph/ceph/pull/28893>`_, Igor Fedotov)
-* bluestore: create the tail when first set FLAG_OMAP (`issue#36482 <http://tracker.ceph.com/issues/36482>`_, `pr#28963 <https://github.com/ceph/ceph/pull/28963>`_, Tao Ning)
-* bluestore: do not set osd_memory_target default from cgroup limit (`pr#29745 <https://github.com/ceph/ceph/pull/29745>`_, Sage Weil)
-* bluestore: fix >2GB bluefs writes (`pr#28966 <https://github.com/ceph/ceph/pull/28966>`_, kungf, Sage Weil)
-* bluestore: load OSD all compression settings unconditionally (`issue#40480 <http://tracker.ceph.com/issues/40480>`_, `pr#28892 <https://github.com/ceph/ceph/pull/28892>`_, Igor Fedotov)
-* bluestore: more smart allocator dump when lacking space for bluefs (`issue#40623 <http://tracker.ceph.com/issues/40623>`_, `pr#28891 <https://github.com/ceph/ceph/pull/28891>`_, Igor Fedotov)
-* bluestore: Set concurrent max_background_compactions in rocksdb to 2 (`issue#40769 <http://tracker.ceph.com/issues/40769>`_, `pr#29162 <https://github.com/ceph/ceph/pull/29162>`_, Mark Nelson)
-* bluestore: support RocksDB prefetch in buffered read mode (`pr#28962 <https://github.com/ceph/ceph/pull/28962>`_, Igor Fedotov)
-* build/ops: Module 'dashboard' has failed: No module named routes (`issue#24420 <http://tracker.ceph.com/issues/24420>`_, `pr#28992 <https://github.com/ceph/ceph/pull/28992>`_, Paul Emmerich)
-* build/ops: rpm: drop SuSEfirewall2 (`issue#40738 <http://tracker.ceph.com/issues/40738>`_, `pr#29007 <https://github.com/ceph/ceph/pull/29007>`_, Matthias Gerstner)
-* build/ops: rpm: Require ceph-grafana-dashboards (`pr#29682 <https://github.com/ceph/ceph/pull/29682>`_, Boris Ranto)
-* cephfs: ceph-fuse: mount does not support the fallocate() (`issue#40615 <http://tracker.ceph.com/issues/40615>`_, `pr#29157 <https://github.com/ceph/ceph/pull/29157>`_, huanwen ren)
-* cephfs: ceph_volume_client: d_name needs to be converted to string before using (`issue#39406 <http://tracker.ceph.com/issues/39406>`_, `pr#28609 <https://github.com/ceph/ceph/pull/28609>`_, Rishabh Dave)
-* cephfs: client: bump ll_ref from int32 to uint64_t (`pr#29186 <https://github.com/ceph/ceph/pull/29186>`_, Xiaoxi CHEN)
-* cephfs: client: set snapdir's link count to 1 (`issue#40101 <http://tracker.ceph.com/issues/40101>`_, `pr#29343 <https://github.com/ceph/ceph/pull/29343>`_, "Yan, Zheng")
-* cephfs: client: unlink dentry for inode with llref=0 (`issue#40960 <http://tracker.ceph.com/issues/40960>`_, `pr#29478 <https://github.com/ceph/ceph/pull/29478>`_, Xiaoxi CHEN)
-* cephfs: getattr on snap inode stuck (`issue#40361 <http://tracker.ceph.com/issues/40361>`_, `pr#29231 <https://github.com/ceph/ceph/pull/29231>`_, "Yan, Zheng")
-* cephfs: mds: cannot switch mds state from standby-replay to active (`issue#40213 <http://tracker.ceph.com/issues/40213>`_, `pr#29233 <https://github.com/ceph/ceph/pull/29233>`_, simon gao)
-* cephfs: mds: cleanup unneeded client_snap_caps when splitting snap inode (`issue#39987 <http://tracker.ceph.com/issues/39987>`_, `pr#29344 <https://github.com/ceph/ceph/pull/29344>`_, "Yan, Zheng")
-* cephfs-shell: name 'files' is not defined error in do_rm() (`issue#40489 <http://tracker.ceph.com/issues/40489>`_, `pr#29158 <https://github.com/ceph/ceph/pull/29158>`_, Varsha Rao)
-* cephfs-shell: TypeError in poutput (`issue#40679 <http://tracker.ceph.com/issues/40679>`_, `pr#29156 <https://github.com/ceph/ceph/pull/29156>`_, Varsha Rao)
-* ceph.spec.in: Drop systemd BuildRequires in case of building for SUSE (`pr#28937 <https://github.com/ceph/ceph/pull/28937>`_, Dominique Leuenberger)
-* ceph-volume: batch functional idempotency test fails since message is now on stderr (`pr#29689 <https://github.com/ceph/ceph/pull/29689>`_, Jan Fajerski)
-* ceph-volume: batch gets confused when the same device is passed in two device lists (`pr#29690 <https://github.com/ceph/ceph/pull/29690>`_, Jan Fajerski)
-* ceph-volume: does not recognize wal/db partitions created by ceph-disk (`pr#29464 <https://github.com/ceph/ceph/pull/29464>`_, Jan Fajerski)
-* ceph-volume: [filestore,bluestore] single type strategies fail after tracking devices as sets (`pr#29702 <https://github.com/ceph/ceph/pull/29702>`_, Jan Fajerski)
-* ceph-volume: lvm.activate: Return an error if WAL/DB devices absent (`pr#29040 <https://github.com/ceph/ceph/pull/29040>`_, David Casier)
-* ceph-volume: missing string substitution when reporting mounts (`issue#25030 <http://tracker.ceph.com/issues/25030>`_, `pr#29260 <https://github.com/ceph/ceph/pull/29260>`_, Shyukri Shyukriev)
-* ceph-volume: prints errors to stdout with --format json (`issue#38548 <http://tracker.ceph.com/issues/38548>`_, `pr#29506 <https://github.com/ceph/ceph/pull/29506>`_, Jan Fajerski)
-* ceph-volume: prints log messages to stdout (`pr#29600 <https://github.com/ceph/ceph/pull/29600>`_, Jan Fajerski, Kefu Chai, Alfredo Deza)
-* ceph-volume: run functional tests without dashboard (`pr#29694 <https://github.com/ceph/ceph/pull/29694>`_, Andrew Schoen)
-* ceph-volume: simple functional tests drop test for lvm zap (`pr#29660 <https://github.com/ceph/ceph/pull/29660>`_, Jan Fajerski)
-* ceph-volume: tests set the noninteractive flag for Debian (`pr#29899 <https://github.com/ceph/ceph/pull/29899>`_, Alfredo Deza)
-* ceph-volume: when 'type' file is not present activate fails (`pr#29416 <https://github.com/ceph/ceph/pull/29416>`_, Alfredo Deza)
-* cmake: update FindBoost.cmake (`pr#29436 <https://github.com/ceph/ceph/pull/29436>`_, Willem Jan Withagen)
-* common/config: respect POD_MEMORY_REQUEST \*and\* POD_MEMORY_LIMIT env vars (`pr#29562 <https://github.com/ceph/ceph/pull/29562>`_, Patrick Donnelly, Sage Weil)
-* common: Keyrings created by ceph auth get are not suitable for ceph auth import (`issue#22227 <http://tracker.ceph.com/issues/22227>`_, `pr#28740 <https://github.com/ceph/ceph/pull/28740>`_, Kefu Chai)
-* common: OutputDataSocket retakes mutex on error path (`issue#40188 <http://tracker.ceph.com/issues/40188>`_, `pr#29147 <https://github.com/ceph/ceph/pull/29147>`_, Casey Bodley)
-* core: Better default value for osd_snap_trim_sleep (`pr#29678 <https://github.com/ceph/ceph/pull/29678>`_, Neha Ojha)
-* core: Change default for bluestore_fsck_on_mount_deep as false (`pr#29697 <https://github.com/ceph/ceph/pull/29697>`_, Neha Ojha)
-* core: lazy omap stat collection (`pr#29188 <https://github.com/ceph/ceph/pull/29188>`_, Brad Hubbard)
-* core: librados: move buffer free functions to inline namespace (`issue#39972 <http://tracker.ceph.com/issues/39972>`_, `pr#29244 <https://github.com/ceph/ceph/pull/29244>`_, Jason Dillaman)
-* core: maybe_remove_pg_upmap can be super inefficient for large clusters (`issue#40104 <http://tracker.ceph.com/issues/40104>`_, `pr#28756 <https://github.com/ceph/ceph/pull/28756>`_, xie xingguo)
-* core: MDSMonitor: use stringstream instead of dout for mds repaired (`issue#40472 <http://tracker.ceph.com/issues/40472>`_, `pr#29159 <https://github.com/ceph/ceph/pull/29159>`_, Zhi Zhang)
-* core: osd beacon sometimes has empty pg list (`issue#40377 <http://tracker.ceph.com/issues/40377>`_, `pr#29254 <https://github.com/ceph/ceph/pull/29254>`_, Sage Weil)
-* core: s3tests-test-readwrite failed in rados run (Connection refused) (`issue#17882 <http://tracker.ceph.com/issues/17882>`_, `pr#29325 <https://github.com/ceph/ceph/pull/29325>`_, Casey Bodley)
-* doc: Document more cache modes (`issue#14153 <http://tracker.ceph.com/issues/14153>`_, `pr#28958 <https://github.com/ceph/ceph/pull/28958>`_, Nathan Cutler)
-* doc: fix rgw ldap username token (`pr#29455 <https://github.com/ceph/ceph/pull/29455>`_, Thomas Kriechbaumer)
-* doc: Improved dashboard feature overview (`pr#28919 <https://github.com/ceph/ceph/pull/28919>`_, Lenz Grimmer)
-* doc: Object Gateway multisite document read-only argument error (`issue#40458 <http://tracker.ceph.com/issues/40458>`_, `pr#29306 <https://github.com/ceph/ceph/pull/29306>`_, Chenjiong Deng)
-* doc/rados: Correcting some typos in the clay code documentation (`pr#29191 <https://github.com/ceph/ceph/pull/29191>`_, Myna)
-* doc/rbd: initial live-migration documentation (`issue#40486 <http://tracker.ceph.com/issues/40486>`_, `pr#29724 <https://github.com/ceph/ceph/pull/29724>`_, Jason Dillaman)
-* doc/rgw: document use of 'realm pull' instead of 'period pull' (`issue#39655 <http://tracker.ceph.com/issues/39655>`_, `pr#29484 <https://github.com/ceph/ceph/pull/29484>`_, Casey Bodley)
-* doc: steps to disable metadata_heap on existing rgw zones (`issue#18174 <http://tracker.ceph.com/issues/18174>`_, `pr#28738 <https://github.com/ceph/ceph/pull/28738>`_, Dan van der Ster)
-* doc: Update 'ceph-iscsi' min version (`pr#29444 <https://github.com/ceph/ceph/pull/29444>`_, Ricardo Marques)
-* journal: properly advance read offset after skipping invalid range (`pr#28816 <https://github.com/ceph/ceph/pull/28816>`_, Mykola Golub)
-* librbd: improve journal performance to match expected degredation (`issue#40072 <http://tracker.ceph.com/issues/40072>`_, `pr#29723 <https://github.com/ceph/ceph/pull/29723>`_, Mykola Golub, Jason Dillaman)
-* librbd: properly track in-flight flush requests (`issue#40555 <http://tracker.ceph.com/issues/40555>`_, `pr#28769 <https://github.com/ceph/ceph/pull/28769>`_, Jason Dillaman)
-* librbd: snapshot object maps can go inconsistent during copyup (`issue#39435 <http://tracker.ceph.com/issues/39435>`_, `pr#29722 <https://github.com/ceph/ceph/pull/29722>`_, Ilya Dryomov)
-* mds: change how mds revoke stale caps (`issue#17854 <http://tracker.ceph.com/issues/17854>`_, `pr#28583 <https://github.com/ceph/ceph/pull/28583>`_, Rishabh Dave, "Yan, Zheng")
-* mgr: Add mgr metdata to prometheus exporter module (`pr#29168 <https://github.com/ceph/ceph/pull/29168>`_, Paul Cuzner)
-* mgr/dashboard: Add, update and remove translations (`issue#39701 <http://tracker.ceph.com/issues/39701>`_, `pr#28938 <https://github.com/ceph/ceph/pull/28938>`_, Sebastian Krah)
-* mgr/dashboard: cephfs multimds graphs stack together (`issue#37579 <http://tracker.ceph.com/issues/37579>`_, `pr#28889 <https://github.com/ceph/ceph/pull/28889>`_, Kiefer Chang)
-* mgr/dashboard: Changing rgw-api-host does not get effective without disable/enable dashboard mgr module (`issue#40252 <http://tracker.ceph.com/issues/40252>`_, `pr#29044 <https://github.com/ceph/ceph/pull/29044>`_, Ricardo Marques)
-* mgr/dashboard: controllers/grafana is not Python3 compatible (`issue#40428 <http://tracker.ceph.com/issues/40428>`_, `pr#29524 <https://github.com/ceph/ceph/pull/29524>`_, Patrick Nawracay)
-* mgr/dashboard: Dentries value of MDS daemon in Filesystems page is inconsistent with ceph fs status output (`issue#40097 <http://tracker.ceph.com/issues/40097>`_, `pr#28912 <https://github.com/ceph/ceph/pull/28912>`_, Kiefer Chang)
-* mgr/dashboard: Display logged in information for each iSCSI client (`issue#40046 <http://tracker.ceph.com/issues/40046>`_, `pr#29045 <https://github.com/ceph/ceph/pull/29045>`_, Ricardo Marques)
-* mgr/dashboard: Fix e2e failures caused by webdriver version (`pr#29491 <https://github.com/ceph/ceph/pull/29491>`_, Tiago Melo)
-* mgr/dashboard: Fix npm vulnerabilities (`issue#40677 <http://tracker.ceph.com/issues/40677>`_, `pr#29102 <https://github.com/ceph/ceph/pull/29102>`_, Tiago Melo)
-* mgr/dashboard: Fix the table mouseenter event handling test (`issue#40580 <http://tracker.ceph.com/issues/40580>`_, `pr#29354 <https://github.com/ceph/ceph/pull/29354>`_, Stephan Müller)
-* mgr/dashboard: Interlock `fast-diff` and `object-map` (`issue#39451 <http://tracker.ceph.com/issues/39451>`_, `pr#29442 <https://github.com/ceph/ceph/pull/29442>`_, Patrick Nawracay)
-* mgr/dashboard: notify the user about unset 'mon_allow_pool_delete' flag beforehand (`issue#39533 <http://tracker.ceph.com/issues/39533>`_, `pr#28833 <https://github.com/ceph/ceph/pull/28833>`_, Tatjana Dehler)
-* mgr/dashboard: Optimize the calculation of portal IPs (`issue#39580 <http://tracker.ceph.com/issues/39580>`_, `pr#29061 <https://github.com/ceph/ceph/pull/29061>`_, Ricardo Marques, Kefu Chai)
-* mgr/dashboard: Pool graph/sparkline points do not display the correct values (`issue#39650 <http://tracker.ceph.com/issues/39650>`_, `pr#29352 <https://github.com/ceph/ceph/pull/29352>`_, Stephan Müller)
-* mgr/dashboard: RGW User quota validation is not working correctly (`pr#29650 <https://github.com/ceph/ceph/pull/29650>`_, Volker Theile)
-* mgr/dashboard: Silence Alertmanager alerts (`issue#36722 <http://tracker.ceph.com/issues/36722>`_, `pr#28968 <https://github.com/ceph/ceph/pull/28968>`_, Stephan Müller)
-* mgr/dashboard: SSL certificate upload command throws deprecation warning (`issue#39123 <http://tracker.ceph.com/issues/39123>`_, `pr#29065 <https://github.com/ceph/ceph/pull/29065>`_, Ricardo Dias)
-* mgr/dashboard: switch ng2-toastr to ngx-toastr (`pr#29050 <https://github.com/ceph/ceph/pull/29050>`_, Tiago Melo, Ernesto Puerta)
-* mgr/dashboard: Upgrade to ceph-iscsi config v10 (`issue#40566 <http://tracker.ceph.com/issues/40566>`_, `pr#28974 <https://github.com/ceph/ceph/pull/28974>`_, Ricardo Marques)
-* mgr/diskprediction_cloud: Service unavailable (`issue#40478 <http://tracker.ceph.com/issues/40478>`_, `pr#29454 <https://github.com/ceph/ceph/pull/29454>`_, Rick Chen)
-* mgr/influx: module fails due to missing close() method (`issue#40174 <http://tracker.ceph.com/issues/40174>`_, `pr#29207 <https://github.com/ceph/ceph/pull/29207>`_, Kefu Chai)
-* mgr/orchestrator: Cache and DeepSea iSCSI + NFS (`pr#29060 <https://github.com/ceph/ceph/pull/29060>`_, Sebastian Wagner, Tim Serong)
-* mgr/rbd_support: support scheduling long-running background operations (`issue#40621 <http://tracker.ceph.com/issues/40621>`_, `issue#40790 <http://tracker.ceph.com/issues/40790>`_, `pr#29725 <https://github.com/ceph/ceph/pull/29725>`_, Venky Shankar, Jason Dillaman)
-* mgr: use ipv4 default when ipv6 was disabled (`issue#40023 <http://tracker.ceph.com/issues/40023>`_, `pr#29194 <https://github.com/ceph/ceph/pull/29194>`_, kungf)
-* mgr/volumes: background purge queue for subvolumes (`issue#40036 <http://tracker.ceph.com/issues/40036>`_, `pr#29079 <https://github.com/ceph/ceph/pull/29079>`_, Patrick Donnelly, Venky Shankar, Kefu Chai)
-* mgr/volumes: minor enhancement and bug fix (`issue#40927 <http://tracker.ceph.com/issues/40927>`_, `issue#40617 <http://tracker.ceph.com/issues/40617>`_, `pr#29490 <https://github.com/ceph/ceph/pull/29490>`_, Ramana Raja)
-* mon: auth mon isn't loading full KeyServerData after restart (`issue#40634 <http://tracker.ceph.com/issues/40634>`_, `pr#28993 <https://github.com/ceph/ceph/pull/28993>`_, Sage Weil)
-* mon/MgrMonitor: fix null deref when invalid formatter is specified (`pr#29566 <https://github.com/ceph/ceph/pull/29566>`_, Sage Weil)
-* mon/OSDMonitor: allow pg_num to increase when require_osd_release < N (`issue#39570 <http://tracker.ceph.com/issues/39570>`_, `pr#29671 <https://github.com/ceph/ceph/pull/29671>`_, Neha Ojha, Sage Weil)
-* mon/OSDMonitor.cc: better error message about min_size (`pr#29617 <https://github.com/ceph/ceph/pull/29617>`_, Neha Ojha)
-* mon: paxos: introduce new reset_pending_committing_finishers for safety (`issue#39484 <http://tracker.ceph.com/issues/39484>`_, `pr#28528 <https://github.com/ceph/ceph/pull/28528>`_, Greg Farnum)
-* mon: set recovery priority etc on cephfs metadata pool (`pr#29275 <https://github.com/ceph/ceph/pull/29275>`_, Sage Weil)
-* mon: take the mon lock in handle_conf_change (`issue#39625 <http://tracker.ceph.com/issues/39625>`_, `pr#29373 <https://github.com/ceph/ceph/pull/29373>`_, huangjun)
-* msg/async: avoid unnecessary costly wakeups for outbound messages (`pr#29141 <https://github.com/ceph/ceph/pull/29141>`_, Jason Dillaman)
-* msg/async: enable secure mode by default, no longer experimental (`pr#29143 <https://github.com/ceph/ceph/pull/29143>`_, Sage Weil)
-* msg/async: no-need set connection for Message (`pr#29142 <https://github.com/ceph/ceph/pull/29142>`_, Jianpeng Ma)
-* msg/async, v2: make the reset_recv_state() unconditional (`issue#40115 <http://tracker.ceph.com/issues/40115>`_, `pr#29140 <https://github.com/ceph/ceph/pull/29140>`_, Radoslaw Zarzynski, Sage Weil)
-* nautilus:common/options.cc: Lower the default value of osd_deep_scrub_large_omap_object_key_threshold (`pr#29173 <https://github.com/ceph/ceph/pull/29173>`_, Neha Ojha)
-* osd: Don't randomize deep scrubs when noscrub set (`issue#40198 <http://tracker.ceph.com/issues/40198>`_, `pr#28768 <https://github.com/ceph/ceph/pull/28768>`_, David Zafman)
-* osd: Fix the way that auto repair triggers after regular scrub (`issue#40530 <http://tracker.ceph.com/issues/40530>`_, `issue#40073 <http://tracker.ceph.com/issues/40073>`_, `pr#28869 <https://github.com/ceph/ceph/pull/28869>`_, sjust@redhat.com, David Zafman)
-* osd/OSD: auto mark heartbeat sessions as stale and tear them down (`issue#40586 <http://tracker.ceph.com/issues/40586>`_, `pr#29391 <https://github.com/ceph/ceph/pull/29391>`_, xie xingguo)
-* osd/OSD: keep synchronizing with mon if stuck at booting (`pr#28639 <https://github.com/ceph/ceph/pull/28639>`_, xie xingguo)
-* osd/PG: do not queue scrub if PG is not active when unblock (`issue#40451 <http://tracker.ceph.com/issues/40451>`_, `pr#29372 <https://github.com/ceph/ceph/pull/29372>`_, Sage Weil)
-* osd/PG: fix cleanup of pgmeta-like objects on PG deletion (`pr#29115 <https://github.com/ceph/ceph/pull/29115>`_, Sage Weil)
-* pybind/mgr/rbd_support: ignore missing support for RBD namespaces (`issue#41475 <https://tracker.ceph.com/issues/41475>`_, `pr#29945 <https://github.com/ceph/ceph/pull/29945>`_, Mykola Golub)
-* rbd/action: fix error getting positional argument (`issue#40095 <http://tracker.ceph.com/issues/40095>`_, `pr#28870 <https://github.com/ceph/ceph/pull/28870>`_, songweibin)
-* rbd: [cli] 'export' should handle concurrent IO completions (`issue#40435 <http://tracker.ceph.com/issues/40435>`_, `pr#29329 <https://github.com/ceph/ceph/pull/29329>`_, Jason Dillaman)
-* rbd: librbd: do not unblock IO prior to growing object map during resize (`issue#39952 <http://tracker.ceph.com/issues/39952>`_, `pr#29246 <https://github.com/ceph/ceph/pull/29246>`_, Jason Dillaman)
-* rbd-mirror: handle duplicates in image sync throttler queue (`issue#40519 <http://tracker.ceph.com/issues/40519>`_, `pr#28817 <https://github.com/ceph/ceph/pull/28817>`_, Mykola Golub)
-* rbd-mirror: link against the specified alloc library (`issue#40110 <http://tracker.ceph.com/issues/40110>`_, `pr#29193 <https://github.com/ceph/ceph/pull/29193>`_, Jason Dillaman)
-* rbd-nbd: sscanf return 0 mean not-match (`issue#39269 <http://tracker.ceph.com/issues/39269>`_, `pr#29315 <https://github.com/ceph/ceph/pull/29315>`_, Jianpeng Ma)
-* rbd: profile rbd OSD cap should add class rbd metadata_list cap by default (`issue#39973 <http://tracker.ceph.com/issues/39973>`_, `pr#29328 <https://github.com/ceph/ceph/pull/29328>`_, songweibin)
-* rbd: Reduce log level for cls/journal and cls/rbd expected errors (`issue#40865 <http://tracker.ceph.com/issues/40865>`_, `pr#29551 <https://github.com/ceph/ceph/pull/29551>`_, Jason Dillaman)
-* rbd: tests: add "rbd diff" coverage to suite (`issue#39447 <http://tracker.ceph.com/issues/39447>`_, `pr#28575 <https://github.com/ceph/ceph/pull/28575>`_, Shyukri Shyukriev, Nathan Cutler)
-* rgw: add 'GET /admin/realm?list' api to list realms (`issue#39626 <http://tracker.ceph.com/issues/39626>`_, `pr#28751 <https://github.com/ceph/ceph/pull/28751>`_, Casey Bodley)
-* rgw: allow radosgw-admin to list bucket w --allow-unordered (`issue#39637 <http://tracker.ceph.com/issues/39637>`_, `pr#28230 <https://github.com/ceph/ceph/pull/28230>`_, J. Eric Ivancich)
-* rgw: conditionally allow builtin users with non-unique email addresses (`issue#40089 <http://tracker.ceph.com/issues/40089>`_, `pr#28715 <https://github.com/ceph/ceph/pull/28715>`_, Matt Benjamin)
-* rgw: deleting bucket can fail when it contains unfinished multipart uploads (`issue#40526 <http://tracker.ceph.com/issues/40526>`_, `pr#29154 <https://github.com/ceph/ceph/pull/29154>`_, J. Eric Ivancich)
-* rgw: Don't crash on copy when metadata directive not supplied (`issue#40416 <http://tracker.ceph.com/issues/40416>`_, `pr#29499 <https://github.com/ceph/ceph/pull/29499>`_, Adam C. Emerson)
-* rgw_file: advance_mtime() should consider namespace expiration (`issue#40415 <http://tracker.ceph.com/issues/40415>`_, `pr#29410 <https://github.com/ceph/ceph/pull/29410>`_, Matt Benjamin)
-* rgw_file:  advance_mtime() takes RGWFileHandle::mutex unconditionally (`pr#29801 <https://github.com/ceph/ceph/pull/29801>`_, Matt Benjamin)
-* rgw_file: all directories are virtual with respect to contents (`issue#40204 <http://tracker.ceph.com/issues/40204>`_, `pr#28886 <https://github.com/ceph/ceph/pull/28886>`_, Matt Benjamin)
-* rgw_file:  fix invalidation of top-level directories (`issue#40196 <http://tracker.ceph.com/issues/40196>`_, `pr#29309 <https://github.com/ceph/ceph/pull/29309>`_, Matt Benjamin)
-* rgw_file: fix readdir eof() calc--caller stop implies !eof (`issue#40375 <http://tracker.ceph.com/issues/40375>`_, `pr#29409 <https://github.com/ceph/ceph/pull/29409>`_, Matt Benjamin)
-* rgw_file: include tenant when hashing bucket names (`issue#40118 <http://tracker.ceph.com/issues/40118>`_, `pr#28854 <https://github.com/ceph/ceph/pull/28854>`_, Matt Benjamin)
-* rgw: fix miss get ret in STSService::storeARN (`issue#40386 <http://tracker.ceph.com/issues/40386>`_, `pr#28713 <https://github.com/ceph/ceph/pull/28713>`_, Tianshan Qu)
-* rgw: fix prefix handling in LCFilter (`issue#37879 <http://tracker.ceph.com/issues/37879>`_, `pr#28550 <https://github.com/ceph/ceph/pull/28550>`_, Matt Benjamin)
-* rgw: fix rgw crash and set correct error code (`pr#28729 <https://github.com/ceph/ceph/pull/28729>`_, yuliyang)
-* rgw: hadoop-s3a suite failing with more ansible errors (`issue#39706 <http://tracker.ceph.com/issues/39706>`_, `pr#28735 <https://github.com/ceph/ceph/pull/28735>`_, Casey Bodley)
-* rgw: hadoop-s3a suite failing with more ansible errors (`issue#39706 <http://tracker.ceph.com/issues/39706>`_, `pr#29265 <https://github.com/ceph/ceph/pull/29265>`_, Casey Bodley)
-* rgw: Librgw doesn't GC deleted object correctly (`issue#37734 <http://tracker.ceph.com/issues/37734>`_, `pr#28648 <https://github.com/ceph/ceph/pull/28648>`_, Tao Chen, Matt Benjamin)
-* rgw: multisite: DELETE Bucket CORS is not forwarded to master zone (`issue#39629 <http://tracker.ceph.com/issues/39629>`_, `pr#28714 <https://github.com/ceph/ceph/pull/28714>`_, Chang Liu)
-* rgw: multisite: fix --bypass-gc flag for 'radosgw-admin bucket rm' (`issue#24991 <http://tracker.ceph.com/issues/24991>`_, `pr#28549 <https://github.com/ceph/ceph/pull/28549>`_, Casey Bodley)
-* rgw: multisite: 'radosgw-admin bilog trim' stops after 1000 entries (`issue#40187 <http://tracker.ceph.com/issues/40187>`_, `pr#29326 <https://github.com/ceph/ceph/pull/29326>`_, Casey Bodley)
-* rgw: multisite: 'radosgw-admin bucket sync status' should call syncs_from(source.name) instead of id (`issue#40022 <http://tracker.ceph.com/issues/40022>`_, `pr#28739 <https://github.com/ceph/ceph/pull/28739>`_, Casey Bodley)
-* rgw: multisite: radosgw-admin commands should not modify metadata on a non-master zone (`issue#39548 <http://tracker.ceph.com/issues/39548>`_, `pr#29163 <https://github.com/ceph/ceph/pull/29163>`_, Shilpa Jagannath)
-* rgw: multisite: RGWListBucketIndexesCR for data full sync needs pagination (`issue#39551 <http://tracker.ceph.com/issues/39551>`_, `pr#29311 <https://github.com/ceph/ceph/pull/29311>`_, Shilpa Jagannath)
-* rgw/OutputDataSocket: append_output(buffer::list&) says it will (but does not) discard output at data_max_backlog (`issue#40178 <http://tracker.ceph.com/issues/40178>`_, `pr#29310 <https://github.com/ceph/ceph/pull/29310>`_, Matt Benjamin)
-* rgw, Policy should be url_decode when assume_role (`pr#28728 <https://github.com/ceph/ceph/pull/28728>`_, yuliyang)
-* rgw: provide admin-friendly reshard status output (`issue#37615 <http://tracker.ceph.com/issues/37615>`_, `pr#29286 <https://github.com/ceph/ceph/pull/29286>`_, Mark Kogan)
-* rgw: Put LC doesn't clear existing lifecycle (`issue#39654 <http://tracker.ceph.com/issues/39654>`_, `pr#29313 <https://github.com/ceph/ceph/pull/29313>`_, Abhishek Lekshmanan)
-* rgw: remove rgw_num_rados_handles; set autoscale parameters or rgw metadata pools (`pr#27684 <https://github.com/ceph/ceph/pull/27684>`_, Adam C. Emerson, Casey Bodley, Sage Weil)
-* rgw: RGWGC add perfcounter retire counter (`issue#38251 <http://tracker.ceph.com/issues/38251>`_, `pr#29308 <https://github.com/ceph/ceph/pull/29308>`_, Matt Benjamin)
-* rgw: Save an unnecessary copy of RGWEnv (`issue#40183 <http://tracker.ceph.com/issues/40183>`_, `pr#29205 <https://github.com/ceph/ceph/pull/29205>`_, Mark Kogan)
-* rgw: set null version object issues (`issue#36763 <http://tracker.ceph.com/issues/36763>`_, `pr#29287 <https://github.com/ceph/ceph/pull/29287>`_, Tianshan Qu)
-* rgw: Swift interface: server side copy fails if object name contains "?" (`issue#27217 <http://tracker.ceph.com/issues/27217>`_, `pr#28736 <https://github.com/ceph/ceph/pull/28736>`_, Casey Bodley)
-* rgw: TempURL should not allow PUTs with the X-Object-Manifest (`issue#20797 <http://tracker.ceph.com/issues/20797>`_, `pr#28712 <https://github.com/ceph/ceph/pull/28712>`_, Radoslaw Zarzynski)
-* rgw: the Multi-Object Delete operation of S3 API wrongly handles the Code response element (`issue#18241 <http://tracker.ceph.com/issues/18241>`_, `pr#28737 <https://github.com/ceph/ceph/pull/28737>`_, Radoslaw Zarzynski)
-* rocksdb: rocksdb_rmrange related improvements (`pr#29439 <https://github.com/ceph/ceph/pull/29439>`_, Zengran Zhang, Sage Weil)
-* rocksdb: Updated to v6.1.2 (`pr#29440 <https://github.com/ceph/ceph/pull/29440>`_, Mark Nelson)
-* tools: ceph-kvstore-tool: print db stats (`pr#28810 <https://github.com/ceph/ceph/pull/28810>`_, Igor Fedotov)
-
-
-v14.2.2 Nautilus
-================
-
-This is the second bug fix release of Ceph Nautilus release series. We recommend
-all Nautilus users upgrade to this release. For upgrading from older releases of
-ceph, general guidelines for upgrade to nautilus must be followed
-:ref:`nautilus-old-upgrade`.
-
-Notable Changes
----------------
-
-* The no{up,down,in,out} related commands have been revamped.
-  There are now 2 ways to set the no{up,down,in,out} flags:
-  the old 'ceph osd [un]set <flag>' command, which sets cluster-wide flags;
-  and the new 'ceph osd [un]set-group <flags> <who>' command,
-  which sets flags in batch at the granularity of any crush node,
-  or device class.
-
-* radosgw-admin introduces two subcommands that allow the
-  managing of expire-stale objects that might be left behind after a
-  bucket reshard in earlier versions of RGW. One subcommand lists such
-  objects and the other deletes them. Read the troubleshooting section
-  of the dynamic resharding docs for details.
-
-* Earlier Nautilus releases (14.2.1 and 14.2.0) have an issue where
-  deploying a single new (Nautilus) BlueStore OSD on an upgraded
-  cluster (i.e. one that was originally deployed pre-Nautilus) breaks
-  the pool utilization stats reported by ``ceph df``.  Until all OSDs
-  have been reprovisioned or updated (via ``ceph-bluestore-tool
-  repair``), the pool stats will show values that are lower than the
-  true value.  This is resolved in 14.2.2, such that the cluster only
-  switches to using the more accurate per-pool stats after *all* OSDs
-  are 14.2.2 (or later), are BlueStore, and (if they were created
-  prior to Nautilus) have been updated via the ``repair`` function.
-
-* The default value for `mon_crush_min_required_version` has been
-  changed from `firefly` to `hammer`, which means the cluster will
-  issue a health warning if your CRUSH tunables are older than hammer.
-  There is generally a small (but non-zero) amount of data that will
-  move around by making the switch to hammer tunables; for more information,
-  see :ref:`crush-map-tunables`.
-
-  If possible, we recommend that you set the oldest allowed client to `hammer`
-  or later.  You can tell what the current oldest allowed client is with::
-
-    ceph osd dump | grep min_compat_client
-
-  If the current value is older than hammer, you can tell whether it
-  is safe to make this change by verifying that there are no clients
-  older than hammer current connected to the cluster with::
-
-    ceph features
-
-  The newer `straw2` CRUSH bucket type was introduced in hammer, and
-  ensuring that all clients are hammer or newer allows new features
-  only supported for `straw2` buckets to be used, including the
-  `crush-compat` mode for the :ref:`balancer`.
-
-Changelog
----------
-
-* bluestore: backport more bluestore alerts (`pr#27645 <https://github.com/ceph/ceph/pull/27645>`_, Sage Weil, Igor Fedotov)
-* bluestore: call fault_range prior to looking for blob to reuse (`pr#27525 <https://github.com/ceph/ceph/pull/27525>`_, Igor Fedotov)
-* bluestore: correctly measure deferred writes into new blobs (`issue#38816 <http://tracker.ceph.com/issues/38816>`_, `pr#27819 <https://github.com/ceph/ceph/pull/27819>`_, Sage Weil)
-* bluestore: dump before "no-spanning blob id" abort (`pr#28028 <https://github.com/ceph/ceph/pull/28028>`_, Igor Fedotov)
-* bluestore: fix for FreeBSD iocb structure (`issue#39612 <http://tracker.ceph.com/issues/39612>`_, `pr#28007 <https://github.com/ceph/ceph/pull/28007>`_, Willem Jan Withagen)
-* bluestore: fix missing discard in BlueStore::_kv_sync_thread (`issue#39672 <http://tracker.ceph.com/issues/39672>`_, `pr#28258 <https://github.com/ceph/ceph/pull/28258>`_, Junhui Tang)
-* bluestore: fix out-of-bound access in bmap allocator (`pr#27740 <https://github.com/ceph/ceph/pull/27740>`_, Igor Fedotov)
-* bluestore: fix duplicate allocations in bmap allocator (`issue#40080 <http://tracker.ceph.com/issues/40080>`_, `pr#28646 <https://github.com/ceph/ceph/pull/28646>`_, Igor Fedotov)
-* build/ops: Ceph RPM build fails on openSUSE Tumbleweed with GCC 9 (`issue#40067 <http://tracker.ceph.com/issues/40067>`_, `issue#39974 <http://tracker.ceph.com/issues/39974>`_, `pr#28299 <https://github.com/ceph/ceph/pull/28299>`_, Martin Liška)
-* build/ops: cmake: Fix build against ncurses with separate libtinfo (`pr#27532 <https://github.com/ceph/ceph/pull/27532>`_, Lars Wendler)
-* build/ops: cmake: set empty-string RPATH for ceph-osd (`issue#40301 <http://tracker.ceph.com/issues/40301>`_, `issue#40295 <http://tracker.ceph.com/issues/40295>`_, `pr#28516 <https://github.com/ceph/ceph/pull/28516>`_, Nathan Cutler)
-* build/ops: do_cmake.sh: source not found (`issue#39981 <http://tracker.ceph.com/issues/39981>`_, `issue#40003 <http://tracker.ceph.com/issues/40003>`_, `pr#28215 <https://github.com/ceph/ceph/pull/28215>`_, Nathan Cutler)
-* build/ops: python3 pybind RPMs do not replace their python2 counterparts on upgrade even though they should (`issue#40099 <http://tracker.ceph.com/issues/40099>`_, `issue#40232 <http://tracker.ceph.com/issues/40232>`_, `pr#28469 <https://github.com/ceph/ceph/pull/28469>`_, Nathan Cutler)
-* build/ops: rpm: install grafana dashboards world readable (`pr#28392 <https://github.com/ceph/ceph/pull/28392>`_, Jan Fajerski)
-* build/ops: selinux: Update the policy for RHEL8 (`pr#28511 <https://github.com/ceph/ceph/pull/28511>`_, Boris Ranto)
-* ceph-volume: add utility functions (`pr#27791 <https://github.com/ceph/ceph/pull/27791>`_, Mohamad Gebai)
-* ceph-volume: broken assertion errors after pytest changes (`pr#28925 <https://github.com/ceph/ceph/pull/28925>`_, Alfredo Deza)
-* ceph-volume: look for rotational data in lsblk (`pr#27723 <https://github.com/ceph/ceph/pull/27723>`_, Andrew Schoen)
-* ceph-volume: tests add a sleep in tox for slow OSDs after booting (`pr#28924 <https://github.com/ceph/ceph/pull/28924>`_, Alfredo Deza)
-* ceph-volume: use the Device.rotational property instead of sys_api (`pr#29028 <https://github.com/ceph/ceph/pull/29028>`_, Andrew Schoen)
-* cephfs-shell: Revert "cephfs.pyx: add py3 compatibility (`pr#28641 <https://github.com/ceph/ceph/pull/28641>`_, Varsha Rao)
-* cephfs-shell: ls command produces error: no colorize attribute found error (`issue#39376 <http://tracker.ceph.com/issues/39376>`_, `issue#39378 <http://tracker.ceph.com/issues/39378>`_, `issue#38740 <http://tracker.ceph.com/issues/38740>`_, `issue#39379 <http://tracker.ceph.com/issues/39379>`_, `issue#39197 <http://tracker.ceph.com/issues/39197>`_, `issue#39377 <http://tracker.ceph.com/issues/39377>`_, `pr#27677 <https://github.com/ceph/ceph/pull/27677>`_, Milind Changire, Varsha Rao)
-* cephfs-shell: misc. cephfs-shell backports (`issue#40314 <http://tracker.ceph.com/issues/40314>`_, `issue#40471 <http://tracker.ceph.com/issues/40471>`_, `issue#40418 <http://tracker.ceph.com/issues/40418>`_, `issue#40469 <http://tracker.ceph.com/issues/40469>`_, `issue#40313 <http://tracker.ceph.com/issues/40313>`_, `issue#39937 <http://tracker.ceph.com/issues/39937>`_, `issue#39678 <http://tracker.ceph.com/issues/39678>`_, `issue#40244 <http://tracker.ceph.com/issues/40244>`_, `issue#39404 <http://tracker.ceph.com/issues/39404>`_, `issue#40243 <http://tracker.ceph.com/issues/40243>`_, `issue#39165 <http://tracker.ceph.com/issues/39165>`_, `issue#40470 <http://tracker.ceph.com/issues/40470>`_, `issue#40455 <http://tracker.ceph.com/issues/40455>`_, `issue#39936 <http://tracker.ceph.com/issues/39936>`_, `issue#40217 <http://tracker.ceph.com/issues/40217>`_, `pr#28681 <https://github.com/ceph/ceph/pull/28681>`_, Patrick Donnelly, Varsha Rao, Milind Changire)
-* cephfs-shell: mkdir error for relative path (`issue#39960 <http://tracker.ceph.com/issues/39960>`_, `pr#28616 <https://github.com/ceph/ceph/pull/28616>`_, Varsha Rao)
-* cephfs: FSAL_CEPH assertion failed in Client::_lookup_name: "parent->is_dir() (`issue#40085 <http://tracker.ceph.com/issues/40085>`_, `issue#40161 <http://tracker.ceph.com/issues/40161>`_, `pr#28612 <https://github.com/ceph/ceph/pull/28612>`_, Jeff Layton)
-* cephfs: ceph_volume_client: Too many arguments for "WriteOpCtx (`issue#39050 <http://tracker.ceph.com/issues/39050>`_, `issue#38946 <http://tracker.ceph.com/issues/38946>`_, `pr#27893 <https://github.com/ceph/ceph/pull/27893>`_, Ramana Raja)
-* cephfs: client: ceph.dir.rctime xattr value incorrectly prefixes 09 to the nanoseconds component (`issue#40167 <http://tracker.ceph.com/issues/40167>`_, `pr#28500 <https://github.com/ceph/ceph/pull/28500>`_, David Disseldorp)
-* cephfs: client: fix "ceph.snap.btime" vxattr value (`issue#40169 <http://tracker.ceph.com/issues/40169>`_, `pr#28499 <https://github.com/ceph/ceph/pull/28499>`_, David Disseldorp)
-* cephfs: client: fix fuse client hang because its bad session PipeConnection (`issue#39686 <http://tracker.ceph.com/issues/39686>`_, `issue#39305 <http://tracker.ceph.com/issues/39305>`_, `pr#28375 <https://github.com/ceph/ceph/pull/28375>`_, Guan yunfei)
-* cephfs: kclient: nofail option not supported (`issue#39232 <http://tracker.ceph.com/issues/39232>`_, `pr#27851 <https://github.com/ceph/ceph/pull/27851>`_, Kenneth Waegeman)
-* cephfs: mds: Expose CephFS snapshot creation time to clients (`issue#39471 <http://tracker.ceph.com/issues/39471>`_, `pr#27901 <https://github.com/ceph/ceph/pull/27901>`_, David Disseldorp)
-* cephfs: mds: MDSTableServer.cc: 83: FAILED assert(version == tid) (`issue#39211 <http://tracker.ceph.com/issues/39211>`_, `issue#38835 <http://tracker.ceph.com/issues/38835>`_, `pr#27853 <https://github.com/ceph/ceph/pull/27853>`_, "Yan, Zheng")
-* cephfs: mds: avoid sending too many osd requests at once after mds restarts (`issue#40028 <http://tracker.ceph.com/issues/40028>`_, `issue#40040 <http://tracker.ceph.com/issues/40040>`_, `pr#28582 <https://github.com/ceph/ceph/pull/28582>`_, simon gao)
-* cephfs: mds: behind on trimming and "[dentry] was purgeable but no longer is! (`issue#39222 <http://tracker.ceph.com/issues/39222>`_, `issue#38679 <http://tracker.ceph.com/issues/38679>`_, `pr#27879 <https://github.com/ceph/ceph/pull/27879>`_, "Yan, Zheng")
-* cephfs: mds: better output of 'ceph health detail (`issue#39266 <http://tracker.ceph.com/issues/39266>`_, `pr#27846 <https://github.com/ceph/ceph/pull/27846>`_, Shen Hang')
-* cephfs: mds: check dir fragment to split dir if mkdir makes it oversized (`issue#39690 <http://tracker.ceph.com/issues/39690>`_, `pr#28394 <https://github.com/ceph/ceph/pull/28394>`_, Erqi Chen)
-* cephfs: mds: check directory split after rename (`issue#39199 <http://tracker.ceph.com/issues/39199>`_, `issue#38994 <http://tracker.ceph.com/issues/38994>`_, `pr#27736 <https://github.com/ceph/ceph/pull/27736>`_, Shen Hang)
-* cephfs: mds: drop reconnect message from non-existent session (`issue#39026 <http://tracker.ceph.com/issues/39026>`_, `issue#39192 <http://tracker.ceph.com/issues/39192>`_, `pr#27714 <https://github.com/ceph/ceph/pull/27714>`_, Shen Hang)
-* cephfs: mds: fail to resolve snapshot name contains '_' (`issue#39473 <http://tracker.ceph.com/issues/39473>`_, `pr#27849 <https://github.com/ceph/ceph/pull/27849>`_, "Yan, Zheng')
-* cephfs: mds: fix 'is session in blacklist' check in Server::apply_blacklist() (`issue#40236 <http://tracker.ceph.com/issues/40236>`_, `issue#40061 <http://tracker.ceph.com/issues/40061>`_, `pr#28618 <https://github.com/ceph/ceph/pull/28618>`_, "Yan, Zheng')
-* cephfs: mds: fix corner case of replaying open sessions (`pr#28580 <https://github.com/ceph/ceph/pull/28580>`_, "Yan, Zheng")
-* cephfs: mds: high debug logging with many subtrees is slow (`issue#38876 <http://tracker.ceph.com/issues/38876>`_, `pr#27892 <https://github.com/ceph/ceph/pull/27892>`_, Rishabh Dave)
-* cephfs: mds: initialize cap_revoke_eviction_timeout with conf (`issue#39209 <http://tracker.ceph.com/issues/39209>`_, `issue#38844 <http://tracker.ceph.com/issues/38844>`_, `pr#27842 <https://github.com/ceph/ceph/pull/27842>`_, simon gao)
-* cephfs: mds: output lock state in format dump (`issue#39645 <http://tracker.ceph.com/issues/39645>`_, `issue#39670 <http://tracker.ceph.com/issues/39670>`_, `pr#28233 <https://github.com/ceph/ceph/pull/28233>`_, Zhi Zhang)
-* cephfs: mds: reset heartbeat during long-running loops in recovery (`issue#40223 <http://tracker.ceph.com/issues/40223>`_, `pr#28611 <https://github.com/ceph/ceph/pull/28611>`_, "Yan, Zheng")
-* cephfs: mds: there is an assertion when calling Beacon::shutdown() (`issue#39214 <http://tracker.ceph.com/issues/39214>`_, `issue#38822 <http://tracker.ceph.com/issues/38822>`_, `pr#27852 <https://github.com/ceph/ceph/pull/27852>`_, huanwen ren)
-* cephfs: mount: key parsing fail when doing a remount (`issue#40164 <http://tracker.ceph.com/issues/40164>`_, `pr#28610 <https://github.com/ceph/ceph/pull/28610>`_, Luis Henriques)
-* cephfs: pybind: added lseek() (`pr#28333 <https://github.com/ceph/ceph/pull/28333>`_, Xiaowei Chu)
-* common/assert: include ceph_abort_msg(arg) arg in log output (`pr#27824 <https://github.com/ceph/ceph/pull/27824>`_, Sage Weil)
-* common/options: annotate some options; enable some runtime updates (`pr#27818 <https://github.com/ceph/ceph/pull/27818>`_, Sage Weil)
-* common/options: update mon_crush_min_required_version=hammer (`pr#27625 <https://github.com/ceph/ceph/pull/27625>`_, Sage Weil)
-* common/util: handle long lines in /proc/cpuinfo (`issue#38296 <http://tracker.ceph.com/issues/38296>`_, `issue#39476 <http://tracker.ceph.com/issues/39476>`_, `pr#28141 <https://github.com/ceph/ceph/pull/28141>`_, Sage Weil)
-* common: Clang requires a default constructor, but it can be empty (`issue#39561 <http://tracker.ceph.com/issues/39561>`_, `issue#39573 <http://tracker.ceph.com/issues/39573>`_, `pr#28131 <https://github.com/ceph/ceph/pull/28131>`_, Willem Jan Withagen)
-* common: fix parse_env nullptr deref (`pr#28382 <https://github.com/ceph/ceph/pull/28382>`_, Patrick Donnelly)
-* common: make cluster_network work (`issue#39671 <http://tracker.ceph.com/issues/39671>`_, `pr#28248 <https://github.com/ceph/ceph/pull/28248>`_, Jianpeng Ma)
-* common: parse ISO 8601 datetime format (`issue#40087 <http://tracker.ceph.com/issues/40087>`_, `pr#28325 <https://github.com/ceph/ceph/pull/28325>`_, Sage Weil)
-* core: Give recovery for inactive PGs a higher priority (`issue#39504 <http://tracker.ceph.com/issues/39504>`_, `issue#38195 <http://tracker.ceph.com/issues/38195>`_, `pr#27854 <https://github.com/ceph/ceph/pull/27854>`_, David Zafman)
-* core: mon,osd: add no{out,down,in,out} flags on CRUSH nodes (`pr#27623 <https://github.com/ceph/ceph/pull/27623>`_, xie xingguo, Sage Weil)
-* core: mon/Elector: format mon_release correctly (`issue#39419 <http://tracker.ceph.com/issues/39419>`_, `pr#27771 <https://github.com/ceph/ceph/pull/27771>`_, Sage Weil)
-* core: mon/Monitor: allow probe if MMonProbe::mon_release == 0 (`issue#38850 <http://tracker.ceph.com/issues/38850>`_, `pr#28262 <https://github.com/ceph/ceph/pull/28262>`_, Sage Weil)
-* core: mon: fix off-by-one rendering progress bar (`pr#28398 <https://github.com/ceph/ceph/pull/28398>`_, Sage Weil)
-* core: mon: use per-pool stats only when all OSDs are reporting (`pr#29032 <https://github.com/ceph/ceph/pull/29032>`_, Sage Weil)
-* core: monitoring: Provide a base set of Prometheus alert manager rules that notify the user about common Ceph error conditions (`issue#39540 <http://tracker.ceph.com/issues/39540>`_, `pr#27998 <https://github.com/ceph/ceph/pull/27998>`_, Jan Fajerski)
-* core: monitoring: update Grafana dashboards (`issue#39652 <http://tracker.ceph.com/issues/39652>`_, `issue#40006 <http://tracker.ceph.com/issues/40006>`_, `issue#39971 <http://tracker.ceph.com/issues/39971>`_, `issue#39932 <http://tracker.ceph.com/issues/39932>`_, `pr#28101 <https://github.com/ceph/ceph/pull/28101>`_, Kiefer Chang, Jan Fajerski)
-* core: osd/OSD.cc: make osd bench description consistent with parameters (`issue#39006 <http://tracker.ceph.com/issues/39006>`_, `issue#39375 <http://tracker.ceph.com/issues/39375>`_, `pr#28035 <https://github.com/ceph/ceph/pull/28035>`_, Neha Ojha)
-* core: osd/OSDMap: Replace get_out_osds with get_out_existing_osds (`issue#39421 <http://tracker.ceph.com/issues/39421>`_, `issue#39154 <http://tracker.ceph.com/issues/39154>`_, `pr#28072 <https://github.com/ceph/ceph/pull/28072>`_, Brad Hubbard)
-* core: osd/PG: discover missing objects when an OSD peers and PG is degraded (`pr#27744 <https://github.com/ceph/ceph/pull/27744>`_, Jonas Jelten)
-* core: osd/PG: do not use approx_missing_objects pre-nautilus (`issue#39512 <http://tracker.ceph.com/issues/39512>`_, `pr#28160 <https://github.com/ceph/ceph/pull/28160>`_, Neha Ojha)
-* core: osd/PG: fix last_complete re-calculation on splitting (`issue#39539 <http://tracker.ceph.com/issues/39539>`_, `issue#26958 <http://tracker.ceph.com/issues/26958>`_, `pr#28219 <https://github.com/ceph/ceph/pull/28219>`_, xie xingguo)
-* core: osd/PG: skip rollforward when !transaction_applied during append_log() (`issue#36739 <http://tracker.ceph.com/issues/36739>`_, `issue#38881 <http://tracker.ceph.com/issues/38881>`_, `pr#27654 <https://github.com/ceph/ceph/pull/27654>`_, Neha Ojha)
-* core: osd/PGLog: preserve original_crt to check rollbackability (`issue#36739 <http://tracker.ceph.com/issues/36739>`_, `issue#39043 <http://tracker.ceph.com/issues/39043>`_, `pr#27632 <https://github.com/ceph/ceph/pull/27632>`_, Neha Ojha)
-* core: osd: Don't evict after a flush if intersecting scrub range (`issue#38840 <http://tracker.ceph.com/issues/38840>`_, `issue#39519 <http://tracker.ceph.com/issues/39519>`_, `pr#28205 <https://github.com/ceph/ceph/pull/28205>`_, David Zafman')
-* core: osd: Don't include user changeable flag in snaptrim related assert (`issue#39699 <http://tracker.ceph.com/issues/39699>`_, `issue#38124 <http://tracker.ceph.com/issues/38124>`_, `pr#28203 <https://github.com/ceph/ceph/pull/28203>`_, David Zafman')
-* core: osd: FAILED ceph_assert(attrs || !pg_log.get_missing().is_missing(soid) || (it_objects != pg_log.get_log().objects.end() && it_objects->second->op == pg_log_entry_t::LOST_REVERT)) in PrimaryLogPG::get_object_context() (`issue#38931 <http://tracker.ceph.com/issues/38931>`_, `issue#39219 <http://tracker.ceph.com/issues/39219>`_, `issue#38784 <http://tracker.ceph.com/issues/38784>`_, `pr#27839 <https://github.com/ceph/ceph/pull/27839>`_, xie xingguo)
-* core: osd: Include dups in copy_after() and copy_up_to() (`issue#39304 <http://tracker.ceph.com/issues/39304>`_, `pr#28088 <https://github.com/ceph/ceph/pull/28088>`_, David Zafman)
-* core: osd: Increase log level of messages which unnecessarily fill up logs (`pr#27687 <https://github.com/ceph/ceph/pull/27687>`_, David Zafman)
-* core: osd: Output Base64 encoding of CRC header if binary data present (`issue#39738 <http://tracker.ceph.com/issues/39738>`_, `pr#28504 <https://github.com/ceph/ceph/pull/28504>`_, David Zafman)
-* core: osd: Primary won't automatically repair replica on pulling error (`issue#39101 <http://tracker.ceph.com/issues/39101>`_, `issue#39184 <http://tracker.ceph.com/issues/39184>`_, `pr#27711 <https://github.com/ceph/ceph/pull/27711>`_, xie xingguo, David Zafman')
-* core: osd: revamp {noup,nodown,noin,noout} related commands (`pr#28400 <https://github.com/ceph/ceph/pull/28400>`_, xie xingguo)
-* core: osd: shutdown recovery_request_timer earlier (`issue#39205 <http://tracker.ceph.com/issues/39205>`_, `pr#27803 <https://github.com/ceph/ceph/pull/27803>`_, Zengran Zhang)
-* core: osd: take heartbeat_lock when calling heartbeat() (`issue#39514 <http://tracker.ceph.com/issues/39514>`_, `issue#39439 <http://tracker.ceph.com/issues/39439>`_, `pr#28164 <https://github.com/ceph/ceph/pull/28164>`_, Sage Weil)
-* doc: add LAZYIO (`issue#39051 <http://tracker.ceph.com/issues/39051>`_, `issue#38729 <http://tracker.ceph.com/issues/38729>`_, `pr#27899 <https://github.com/ceph/ceph/pull/27899>`_, "Yan, Zheng")
-* doc: add documentation for "fs set min_compat_client" (`issue#39130 <http://tracker.ceph.com/issues/39130>`_, `issue#39176 <http://tracker.ceph.com/issues/39176>`_, `pr#27900 <https://github.com/ceph/ceph/pull/27900>`_, Patrick Donnelly)
-* doc: cleanup HTTP Frontends documentation (`issue#38874 <http://tracker.ceph.com/issues/38874>`_, `pr#27922 <https://github.com/ceph/ceph/pull/27922>`_, Casey Bodley)
-* doc: dashboard documentation changes (`pr#27642 <https://github.com/ceph/ceph/pull/27642>`_, Tatjana Dehler, Lenz Grimmer)
-* doc: orchestrator_cli: Rook orch supports mon update (`issue#39169 <http://tracker.ceph.com/issues/39169>`_, `issue#39137 <http://tracker.ceph.com/issues/39137>`_, `pr#27488 <https://github.com/ceph/ceph/pull/27488>`_, Sebastian Wagner)
-* doc: osd_internals/async_recovery: update cost calculation (`pr#28046 <https://github.com/ceph/ceph/pull/28046>`_, Neha Ojha)
-* doc: rados/operations/devices: document device prediction (`pr#27752 <https://github.com/ceph/ceph/pull/27752>`_, Sage Weil)
-* mgr/ActivePyModules: handle_command - fix broken lock (`issue#39235 <http://tracker.ceph.com/issues/39235>`_, `issue#39308 <http://tracker.ceph.com/issues/39308>`_, `pr#27939 <https://github.com/ceph/ceph/pull/27939>`_, xie xingguo)
-* mgr/BaseMgrModule: run MonCommandCompletion on the finisher (`issue#39397 <http://tracker.ceph.com/issues/39397>`_, `issue#39335 <http://tracker.ceph.com/issues/39335>`_, `pr#27699 <https://github.com/ceph/ceph/pull/27699>`_, Sage Weil)
-* mgr/ansible: Host ls implementation (`issue#39559 <http://tracker.ceph.com/issues/39559>`_, `pr#27919 <https://github.com/ceph/ceph/pull/27919>`_, Juan Miguel Olmo Mart\xc3\xadnez)
-* mgr/balancer: various compat weight-set fixes (`pr#28279 <https://github.com/ceph/ceph/pull/28279>`_, xie xingguo)
-* mgr/dashboard: Add custom dialogue for configuring PG scrub parameters (`issue#40059 <http://tracker.ceph.com/issues/40059>`_, `pr#28555 <https://github.com/ceph/ceph/pull/28555>`_, Tatjana Dehler)
-* mgr/dashboard: Admin resource not honored (`issue#39338 <http://tracker.ceph.com/issues/39338>`_, `issue#39467 <http://tracker.ceph.com/issues/39467>`_, `pr#27868 <https://github.com/ceph/ceph/pull/27868>`_, Wido den Hollander)
-* mgr/dashboard: Angular is creating multiple instances of the same service (`issue#39996 <http://tracker.ceph.com/issues/39996>`_, `issue#40075 <http://tracker.ceph.com/issues/40075>`_, `pr#28312 <https://github.com/ceph/ceph/pull/28312>`_, Tiago Melo)
-* mgr/dashboard: Avoid merge conflicts in messages.xlf by auto-generating it at build time? (`issue#39658 <http://tracker.ceph.com/issues/39658>`_, `pr#28178 <https://github.com/ceph/ceph/pull/28178>`_, Sebastian Krah)
-* mgr/dashboard: Display correct dialog title (`pr#28189 <https://github.com/ceph/ceph/pull/28189>`_, Volker Theile)
-* mgr/dashboard: Error creating NFS client without squash (`issue#40074 <http://tracker.ceph.com/issues/40074>`_, `pr#28311 <https://github.com/ceph/ceph/pull/28311>`_, Tiago Melo)
-* mgr/dashboard: KV-table transforms dates through pipe (`issue#39558 <http://tracker.ceph.com/issues/39558>`_, `pr#28021 <https://github.com/ceph/ceph/pull/28021>`_, Stephan M\xc3\xbcller)
-* mgr/dashboard: Localization for date picker module (`issue#39371 <http://tracker.ceph.com/issues/39371>`_, `pr#27673 <https://github.com/ceph/ceph/pull/27673>`_, Stephan M\xc3\xbcller)
-* mgr/dashboard: Manager should complain about wrong dashboard certificate (`issue#39346 <http://tracker.ceph.com/issues/39346>`_, `pr#27742 <https://github.com/ceph/ceph/pull/27742>`_, Volker Theile)
-* mgr/dashboard: NFS clients information is not displayed in the details view (`issue#40057 <http://tracker.ceph.com/issues/40057>`_, `pr#28318 <https://github.com/ceph/ceph/pull/28318>`_, Tiago Melo)
-* mgr/dashboard: NFS export creation: Add more info to the validation message of the field Pseudo (`issue#39975 <http://tracker.ceph.com/issues/39975>`_, `issue#39327 <http://tracker.ceph.com/issues/39327>`_, `pr#28320 <https://github.com/ceph/ceph/pull/28320>`_, Tiago Melo)
-* mgr/dashboard: Only one root node is shown in the crush map viewer (`issue#39647 <http://tracker.ceph.com/issues/39647>`_, `issue#40077 <http://tracker.ceph.com/issues/40077>`_, `pr#28316 <https://github.com/ceph/ceph/pull/28316>`_, Tiago Melo)
-* mgr/dashboard: Push Grafana dashboards on startup (`pr#28635 <https://github.com/ceph/ceph/pull/28635>`_, Zack Cerza)
-* mgr/dashboard: Queue notifications as default (`issue#39560 <http://tracker.ceph.com/issues/39560>`_, `pr#28022 <https://github.com/ceph/ceph/pull/28022>`_, Stephan M\xc3\xbcller)
-* mgr/dashboard: RBD snapshot name suggestion with local time suffix (`issue#39534 <http://tracker.ceph.com/issues/39534>`_, `pr#27890 <https://github.com/ceph/ceph/pull/27890>`_, Stephan M\xc3\xbcller)
-* mgr/dashboard: Reduce the number of renders on the tables (`issue#39944 <http://tracker.ceph.com/issues/39944>`_, `issue#40076 <http://tracker.ceph.com/issues/40076>`_, `pr#28315 <https://github.com/ceph/ceph/pull/28315>`_, Tiago Melo)
-* mgr/dashboard: Some validations are not updated and prevent the submission of a form (`issue#40030 <http://tracker.ceph.com/issues/40030>`_, `pr#28319 <https://github.com/ceph/ceph/pull/28319>`_, Tiago Melo)
-* mgr/dashboard: Unable to see tcmu-runner perf counters (`issue#39988 <http://tracker.ceph.com/issues/39988>`_, `pr#28191 <https://github.com/ceph/ceph/pull/28191>`_, Ricardo Marques)
-* mgr/dashboard: Unify the look of dashboard charts (`issue#39384 <http://tracker.ceph.com/issues/39384>`_, `issue#39961 <http://tracker.ceph.com/issues/39961>`_, `pr#28175 <https://github.com/ceph/ceph/pull/28175>`_, Tiago Melo)
-* mgr/dashboard: Validate if any client belongs to more than one group (`issue#39036 <http://tracker.ceph.com/issues/39036>`_, `issue#39454 <http://tracker.ceph.com/issues/39454>`_, `pr#27760 <https://github.com/ceph/ceph/pull/27760>`_, Tiago Melo)
-* mgr/dashboard: code documentation (`issue#39345 <http://tracker.ceph.com/issues/39345>`_, `issue#36243 <http://tracker.ceph.com/issues/36243>`_, `pr#27746 <https://github.com/ceph/ceph/pull/27746>`_, Ernesto Puerta)
-* mgr/dashboard: iSCSI GET requests should not be logged (`pr#28024 <https://github.com/ceph/ceph/pull/28024>`_, Ricardo Marques)
-* mgr/dashboard: iSCSI form does not support IPv6 (`pr#28026 <https://github.com/ceph/ceph/pull/28026>`_, Ricardo Marques)
-* mgr/dashboard: iSCSI form is showing a warning (`issue#39452 <http://tracker.ceph.com/issues/39452>`_, `issue#39324 <http://tracker.ceph.com/issues/39324>`_, `pr#27758 <https://github.com/ceph/ceph/pull/27758>`_, Tiago Melo)
-* mgr/dashboard: iSCSI should allow exporting an RBD image with Journaling enabled (`pr#28011 <https://github.com/ceph/ceph/pull/28011>`_, Ricardo Marques)
-* mgr/dashboard: inconsistent result when editing a RBD image's features (`issue#39993 <http://tracker.ceph.com/issues/39993>`_, `issue#39933 <http://tracker.ceph.com/issues/39933>`_, `pr#28218 <https://github.com/ceph/ceph/pull/28218>`_, Kiefer Chang')
-* mgr/dashboard: incorrect help message for minimum blob size (`issue#39624 <http://tracker.ceph.com/issues/39624>`_, `issue#39664 <http://tracker.ceph.com/issues/39664>`_, `pr#28062 <https://github.com/ceph/ceph/pull/28062>`_, Kiefer Chang)
-* mgr/dashboard: local variable 'cluster_id' referenced before assignment error when trying to list NFS Ganesha daemons (`issue#40031 <http://tracker.ceph.com/issues/40031>`_, `pr#28261 <https://github.com/ceph/ceph/pull/28261>`_, Nur Faizin')
-* mgr/dashboard: make auth token work with UTC times only (`issue#39524 <http://tracker.ceph.com/issues/39524>`_, `issue#39300 <http://tracker.ceph.com/issues/39300>`_, `pr#27942 <https://github.com/ceph/ceph/pull/27942>`_, Ricardo Dias)
-* mgr/dashboard: openssl exception when verifying certificates of HTTPS requests (`issue#39962 <http://tracker.ceph.com/issues/39962>`_, `issue#39628 <http://tracker.ceph.com/issues/39628>`_, `pr#28163 <https://github.com/ceph/ceph/pull/28163>`_, Ricardo Dias)
-* mgr/dashboard: orchestrator mgr modules assert failure on iscsi service request (`issue#40037 <http://tracker.ceph.com/issues/40037>`_, `pr#28552 <https://github.com/ceph/ceph/pull/28552>`_, Sebastian Wagner)
-* mgr/dashboard: show degraded/misplaced/unfound objects (`pr#28584 <https://github.com/ceph/ceph/pull/28584>`_, Alfonso Mart\xc3\xadnez)
-* mgr/orchestrator: Remove "(add|test|remove)_stateful_service_rule (`issue#38808 <http://tracker.ceph.com/issues/38808>`_, `pr#27043 <https://github.com/ceph/ceph/pull/27043>`_, Sebastian Wagner)
-* mgr/orchestrator: add progress events to all orchestrators (`pr#28040 <https://github.com/ceph/ceph/pull/28040>`_, Sebastian Wagner)
-* mgr/progress: behave if pgs disappear (due to a racing pg merge) (`issue#38157 <http://tracker.ceph.com/issues/38157>`_, `issue#39344 <http://tracker.ceph.com/issues/39344>`_, `pr#27608 <https://github.com/ceph/ceph/pull/27608>`_, Sage Weil)
-* mgr/prometheus: replace whitespaces in metrics' names (`pr#27886 <https://github.com/ceph/ceph/pull/27886>`_, Alfonso Mart\xc3\xadnez')
-* mgr/rook: Added missing rgw daemons in service ls (`issue#39171 <http://tracker.ceph.com/issues/39171>`_, `issue#39312 <http://tracker.ceph.com/issues/39312>`_, `pr#27864 <https://github.com/ceph/ceph/pull/27864>`_, Sebastian Wagner)
-* mgr/rook: Fix RGW creation (`issue#39158 <http://tracker.ceph.com/issues/39158>`_, `issue#39313 <http://tracker.ceph.com/issues/39313>`_, `pr#27863 <https://github.com/ceph/ceph/pull/27863>`_, Sebastian Wagner)
-* mgr/rook: Remove support for Rook older than v0.9 (`issue#39356 <http://tracker.ceph.com/issues/39356>`_, `issue#39278 <http://tracker.ceph.com/issues/39278>`_, `pr#27862 <https://github.com/ceph/ceph/pull/27862>`_, Sebastian Wagner)
-* mgr/test_orchestrator: AttributeError: 'TestWriteCompletion' object has no attribute 'id (`issue#39536 <http://tracker.ceph.com/issues/39536>`_, `pr#27920 <https://github.com/ceph/ceph/pull/27920>`_, Sebastian Wagner')
-* mgr/volumes: FS subvolumes enhancements (`issue#40429 <http://tracker.ceph.com/issues/40429>`_, `pr#28767 <https://github.com/ceph/ceph/pull/28767>`_, Ramana Raja)
-* mgr/volumes: add CephFS subvolumes library (`issue#39750 <http://tracker.ceph.com/issues/39750>`_, `issue#40152 <http://tracker.ceph.com/issues/40152>`_, `issue#39949 <http://tracker.ceph.com/issues/39949>`_, `issue#40014 <http://tracker.ceph.com/issues/40014>`_, `issue#39610 <http://tracker.ceph.com/issues/39610>`_, `pr#28429 <https://github.com/ceph/ceph/pull/28429>`_, Sage Weil, Venky Shankar, Ramana Raja, Rishabh Dave)
-* mgr/volumes: refactor volume module (`issue#40378 <http://tracker.ceph.com/issues/40378>`_, `issue#39969 <http://tracker.ceph.com/issues/39969>`_, `pr#28595 <https://github.com/ceph/ceph/pull/28595>`_, Venky Shankar)
-* mgr: Update the restful module in nautilus (`pr#28291 <https://github.com/ceph/ceph/pull/28291>`_, Kefu Chai, Boris Ranto)
-* mgr: deadlock (`issue#39040 <http://tracker.ceph.com/issues/39040>`_, `issue#39425 <http://tracker.ceph.com/issues/39425>`_, `pr#28098 <https://github.com/ceph/ceph/pull/28098>`_, xie xingguo)
-* mgr: fix pgp_num adjustments (`issue#38626 <http://tracker.ceph.com/issues/38626>`_, `pr#27876 <https://github.com/ceph/ceph/pull/27876>`_, Sage Weil, Marius Schiffer)
-* mgr: log an error if we can't find any modules to load (`issue#40090 <http://tracker.ceph.com/issues/40090>`_, `pr#28347 <https://github.com/ceph/ceph/pull/28347>`_, Tim Serong')
-* monitoring: pybind/mgr: fix format for rbd-mirror prometheus metrics (`pr#28485 <https://github.com/ceph/ceph/pull/28485>`_, Mykola Golub)
-* msg/async: connection race + winner fault can leave connection stuck at replacing foreve (`issue#39241 <http://tracker.ceph.com/issues/39241>`_, `issue#37499 <http://tracker.ceph.com/issues/37499>`_, `issue#39448 <http://tracker.ceph.com/issues/39448>`_, `issue#38493 <http://tracker.ceph.com/issues/38493>`_, `pr#27915 <https://github.com/ceph/ceph/pull/27915>`_, Jason Dillaman, xie xingguo)
-* msg/async/ProtocolV[12]: add ms_learn_addr_from_peer (`pr#28589 <https://github.com/ceph/ceph/pull/28589>`_, Sage Weil)
-* msg: output peer address when detecting bad CRCs (`issue#39367 <http://tracker.ceph.com/issues/39367>`_, `pr#27857 <https://github.com/ceph/ceph/pull/27857>`_, Greg Farnum)
-* pybind: Add 'RBD_FEATURE_MIGRATING' to rbd.pyx (`issue#39609 <http://tracker.ceph.com/issues/39609>`_, `issue#39736 <http://tracker.ceph.com/issues/39736>`_, `pr#28482 <https://github.com/ceph/ceph/pull/28482>`_, Ricardo Marques')
-* pybind: Rados.get_fsid() returning bytes in python3 (`issue#40192 <http://tracker.ceph.com/issues/40192>`_, `issue#38381 <http://tracker.ceph.com/issues/38381>`_, `pr#28476 <https://github.com/ceph/ceph/pull/28476>`_, Jason Dillaman)
-* rbd: krbd: fix rbd map hang due to udev return subsystem unordered (`issue#39089 <http://tracker.ceph.com/issues/39089>`_, `issue#39315 <http://tracker.ceph.com/issues/39315>`_, `pr#28019 <https://github.com/ceph/ceph/pull/28019>`_, Zhi Zhang)
-* rbd: librbd: async open/close should free ImageCtx before issuing callback (`issue#39428 <http://tracker.ceph.com/issues/39428>`_, `issue#39031 <http://tracker.ceph.com/issues/39031>`_, `pr#28121 <https://github.com/ceph/ceph/pull/28121>`_, Jason Dillaman)
-* rbd: librbd: avoid dereferencing an empty container during deep-copy (`issue#40368 <http://tracker.ceph.com/issues/40368>`_, `issue#40379 <http://tracker.ceph.com/issues/40379>`_, `pr#28577 <https://github.com/ceph/ceph/pull/28577>`_, Jason Dillaman)
-* rbd: librbd: do not allow to deep copy migrating image (`issue#39224 <http://tracker.ceph.com/issues/39224>`_, `pr#27882 <https://github.com/ceph/ceph/pull/27882>`_, Mykola Golub)
-* rbd: librbd: fix issues with object-map/fast-diff feature interlock (`issue#39946 <http://tracker.ceph.com/issues/39946>`_, `issue#39521 <http://tracker.ceph.com/issues/39521>`_, `pr#28127 <https://github.com/ceph/ceph/pull/28127>`_, Jason Dillaman)
-* rbd: librbd: fixed several race conditions related to copyup (`issue#39195 <http://tracker.ceph.com/issues/39195>`_, `issue#39021 <http://tracker.ceph.com/issues/39021>`_, `pr#28132 <https://github.com/ceph/ceph/pull/28132>`_, Jason Dillaman)
-* rbd: librbd: make flush be queued by QOS throttler (`issue#38869 <http://tracker.ceph.com/issues/38869>`_, `pr#28120 <https://github.com/ceph/ceph/pull/28120>`_, Mykola Golub)
-* rbd: librbd: re-add support for nautilus clients talking to jewel clusters (`issue#39450 <http://tracker.ceph.com/issues/39450>`_, `pr#27936 <https://github.com/ceph/ceph/pull/27936>`_, Jason Dillaman)
-* rbd: librbd: support EC data pool images sparsify (`issue#39226 <http://tracker.ceph.com/issues/39226>`_, `pr#27903 <https://github.com/ceph/ceph/pull/27903>`_, Mykola Golub)
-* rbd: rbd-mirror: clear out bufferlist prior to listing mirror images (`issue#39462 <http://tracker.ceph.com/issues/39462>`_, `issue#39407 <http://tracker.ceph.com/issues/39407>`_, `pr#28122 <https://github.com/ceph/ceph/pull/28122>`_, Jason Dillaman)
-* rbd: rbd-mirror: image replayer should periodically flush IO and commit positions (`issue#39257 <http://tracker.ceph.com/issues/39257>`_, `issue#39288 <http://tracker.ceph.com/issues/39288>`_, `pr#27937 <https://github.com/ceph/ceph/pull/27937>`_, Jason Dillaman)
-* rgw: Evaluating bucket policies also while reading permissions for an\xe2\x80\xa6 (`issue#38638 <http://tracker.ceph.com/issues/38638>`_, `issue#39273 <http://tracker.ceph.com/issues/39273>`_, `pr#27918 <https://github.com/ceph/ceph/pull/27918>`_, Pritha Srivastava)
-* rgw: admin: handle delete_at attr in object stat output (`pr#27827 <https://github.com/ceph/ceph/pull/27827>`_, Abhishek Lekshmanan)
-* rgw: beast: multiple v4 and v6 endpoints with the same port will cause failure (`issue#39746 <http://tracker.ceph.com/issues/39746>`_, `issue#39038 <http://tracker.ceph.com/issues/39038>`_, `pr#28541 <https://github.com/ceph/ceph/pull/28541>`_, Abhishek Lekshmanan)
-* rgw: beast: set a default port for endpoints (`issue#39048 <http://tracker.ceph.com/issues/39048>`_, `issue#39000 <http://tracker.ceph.com/issues/39000>`_, `pr#27660 <https://github.com/ceph/ceph/pull/27660>`_, Abhishek Lekshmanan)
-* rgw: bucket stats report mtime in UTC (`pr#27826 <https://github.com/ceph/ceph/pull/27826>`_, Alfonso Mart\xc3\xadnez, Casey Bodley)
-* rgw: clean up some logging (`issue#39503 <http://tracker.ceph.com/issues/39503>`_, `pr#27953 <https://github.com/ceph/ceph/pull/27953>`_, J. Eric Ivancich)
-* rgw: cloud sync module fails to sync multipart objects (`issue#39684 <http://tracker.ceph.com/issues/39684>`_, `pr#28064 <https://github.com/ceph/ceph/pull/28064>`_, Abhishek Lekshmanan)
-* rgw: cloud sync module logs attrs in the log (`issue#39574 <http://tracker.ceph.com/issues/39574>`_, `pr#27954 <https://github.com/ceph/ceph/pull/27954>`_, Nathan Cutler)
-* rgw: crypto: throw DigestException from Digest and HMAC (`issue#39676 <http://tracker.ceph.com/issues/39676>`_, `issue#39456 <http://tracker.ceph.com/issues/39456>`_, `pr#28309 <https://github.com/ceph/ceph/pull/28309>`_, Matt Benjamin)
-* rgw: document CreateBucketConfiguration for s3 PUT Bucket request (`issue#39597 <http://tracker.ceph.com/issues/39597>`_, `issue#39601 <http://tracker.ceph.com/issues/39601>`_, `pr#28512 <https://github.com/ceph/ceph/pull/28512>`_, Casey Bodley)
-* rgw: fix Multisite sync corruption (`pr#28383 <https://github.com/ceph/ceph/pull/28383>`_, Tianshan Qu, Casey Bodley, Xiaoxi CHEN)
-* rgw: fix bucket may redundantly list keys after BI_PREFIX_CHAR (`issue#39984 <http://tracker.ceph.com/issues/39984>`_, `issue#40148 <http://tracker.ceph.com/issues/40148>`_, `pr#28410 <https://github.com/ceph/ceph/pull/28410>`_, Casey Bodley, Tianshan Qu)
-* rgw: fix default_placement containing "/" when storage_class is standard (`issue#39745 <http://tracker.ceph.com/issues/39745>`_, `issue#39380 <http://tracker.ceph.com/issues/39380>`_, `pr#28538 <https://github.com/ceph/ceph/pull/28538>`_, mkogan1)
-* rgw: inefficient unordered bucket listing (`issue#39410 <http://tracker.ceph.com/issues/39410>`_, `issue#39393 <http://tracker.ceph.com/issues/39393>`_, `pr#27924 <https://github.com/ceph/ceph/pull/27924>`_, Casey Bodley)
-* rgw: librgw: unexpected crash when creating bucket (`issue#39575 <http://tracker.ceph.com/issues/39575>`_, `pr#27955 <https://github.com/ceph/ceph/pull/27955>`_, Tao CHEN)
-* rgw: limit entries in remove_olh_pending_entries() (`issue#39178 <http://tracker.ceph.com/issues/39178>`_, `issue#39118 <http://tracker.ceph.com/issues/39118>`_, `pr#27664 <https://github.com/ceph/ceph/pull/27664>`_, Casey Bodley)
-* rgw: list bucket with start marker and delimiter will miss next object with char '0' (`issue#40762 <http://tracker.ceph.com/issues/40762>`_, `issue#39989 <http://tracker.ceph.com/issues/39989>`_, `pr#29022 <https://github.com/ceph/ceph/pull/29022>`_, Tianshan Qu)
-* rgw: multisite log trimming only checks peers that sync from us (`issue#39283 <http://tracker.ceph.com/issues/39283>`_, `pr#27814 <https://github.com/ceph/ceph/pull/27814>`_, Casey Bodley)
-* rgw: multisite: add perf counters to data sync (`issue#38549 <http://tracker.ceph.com/issues/38549>`_, `issue#38918 <http://tracker.ceph.com/issues/38918>`_, `pr#27921 <https://github.com/ceph/ceph/pull/27921>`_, Abhishek Lekshmanan, Casey Bodley)
-* rgw: multisite: mismatch of bucket creation times from List Buckets (`issue#39635 <http://tracker.ceph.com/issues/39635>`_, `issue#39735 <http://tracker.ceph.com/issues/39735>`_, `pr#28444 <https://github.com/ceph/ceph/pull/28444>`_, Casey Bodley)
-* rgw: multisite: period pusher gets 403 Forbidden against other zonegroups (`issue#39287 <http://tracker.ceph.com/issues/39287>`_, `issue#39414 <http://tracker.ceph.com/issues/39414>`_, `pr#27952 <https://github.com/ceph/ceph/pull/27952>`_, Casey Bodley)
-* rgw: race condition between resharding and ops waiting on resharding (`issue#39202 <http://tracker.ceph.com/issues/39202>`_, `pr#27800 <https://github.com/ceph/ceph/pull/27800>`_, J. Eric Ivancich)
-* rgw: radosgw-admin: add tenant argument to reshard cancel (`issue#39018 <http://tracker.ceph.com/issues/39018>`_, `pr#27630 <https://github.com/ceph/ceph/pull/27630>`_, Abhishek Lekshmanan)
-* rgw: rgw_file: save etag and acl info in setattr (`issue#39228 <http://tracker.ceph.com/issues/39228>`_, `pr#27904 <https://github.com/ceph/ceph/pull/27904>`_, Tao Chen)
-* rgw: swift object expiry fails when a bucket reshards (`issue#39740 <http://tracker.ceph.com/issues/39740>`_, `pr#28537 <https://github.com/ceph/ceph/pull/28537>`_, Abhishek Lekshmanan)
-* rgw: unittest_rgw_dmclock_scheduler does not need Boost_LIBRARIES (`issue#39577 <http://tracker.ceph.com/issues/39577>`_, `pr#27944 <https://github.com/ceph/ceph/pull/27944>`_, Willem Jan Withagen)
-* rgw: update resharding documentation (`issue#39046 <http://tracker.ceph.com/issues/39046>`_, `pr#27923 <https://github.com/ceph/ceph/pull/27923>`_, J. Eric Ivancich)
-* tests: added `bluestore_warn_on_legacy_statfs: false` setting (`issue#40467 <http://tracker.ceph.com/issues/40467>`_, `pr#28723 <https://github.com/ceph/ceph/pull/28723>`_, Yuri Weinstein)
-* tests: added ragweed coverage to stress-split\\* upgrade suites (`issue#40452 <http://tracker.ceph.com/issues/40452>`_, `issue#40467 <http://tracker.ceph.com/issues/40467>`_, `pr#28661 <https://github.com/ceph/ceph/pull/28661>`_, Yuri Weinstein)
-* tests: added v14.2.1 (`issue#40181 <http://tracker.ceph.com/issues/40181>`_, `pr#28416 <https://github.com/ceph/ceph/pull/28416>`_, Yuri Weinstein)
-* tests: cannot schedule kcephfs/multimds (`issue#40116 <http://tracker.ceph.com/issues/40116>`_, `pr#28369 <https://github.com/ceph/ceph/pull/28369>`_, Patrick Donnelly)
-* tests: centos 7.6 etc (`pr#27439 <https://github.com/ceph/ceph/pull/27439>`_, Sage Weil)
-* tests: ceph-ansible: ceph-ansible requires ansible 2.8 (`issue#40602 <http://tracker.ceph.com/issues/40602>`_, `issue#40669 <http://tracker.ceph.com/issues/40669>`_, `pr#28871 <https://github.com/ceph/ceph/pull/28871>`_, Brad Hubbard)
-* tests: ceph-ansible: cephfs_pools variable pgs should be pg_num (`issue#40670 <http://tracker.ceph.com/issues/40670>`_, `issue#40605 <http://tracker.ceph.com/issues/40605>`_, `pr#28872 <https://github.com/ceph/ceph/pull/28872>`_, Brad Hubbard)
-* tests: cephfs-shell: teuthology tests (`issue#39935 <http://tracker.ceph.com/issues/39935>`_, `issue#39526 <http://tracker.ceph.com/issues/39526>`_, `pr#28614 <https://github.com/ceph/ceph/pull/28614>`_, Milind Changire)
-* tests: cephfs: TestMisc.test_evict_client fails (`issue#40220 <http://tracker.ceph.com/issues/40220>`_, `pr#28613 <https://github.com/ceph/ceph/pull/28613>`_, "Yan, Zheng")
-* tests: cleaned up supported distro for nautilus (`pr#28065 <https://github.com/ceph/ceph/pull/28065>`_, Yuri Weinstein)
-* tests: ignore legacy bluestore stats errors (`issue#40374 <http://tracker.ceph.com/issues/40374>`_, `pr#28563 <https://github.com/ceph/ceph/pull/28563>`_, Patrick Donnelly)
-* tests: librbd: drop 'ceph_test_librbd_api' target (`issue#39423 <http://tracker.ceph.com/issues/39423>`_, `issue#39072 <http://tracker.ceph.com/issues/39072>`_, `pr#28091 <https://github.com/ceph/ceph/pull/28091>`_, Jason Dillaman')
-* tests: mgr: tox failures when running make check (`issue#39323 <http://tracker.ceph.com/issues/39323>`_, `issue#39530 <http://tracker.ceph.com/issues/39530>`_, `pr#27884 <https://github.com/ceph/ceph/pull/27884>`_, Nathan Cutler)
-* tests: pass --ssh-config to pytest to resolve hosts when connecting (`pr#28923 <https://github.com/ceph/ceph/pull/28923>`_, Alfredo Deza)
-* tests: rbd: qemu-iotests tests fail under latest Ubuntu kernel (`issue#39541 <http://tracker.ceph.com/issues/39541>`_, `issue#24668 <http://tracker.ceph.com/issues/24668>`_, `pr#27988 <https://github.com/ceph/ceph/pull/27988>`_, Jason Dillaman)
-* tests: removed `1node` and `systemd` tests as ceph-deploy is not a\xe2\x80\xa6 (`pr#28458 <https://github.com/ceph/ceph/pull/28458>`_, Yuri Weinstein)
-* tests: rgw: fix race in test_rgw_reshard_wait and test_rgw_reshard_wait uses same clock for timing (`issue#39479 <http://tracker.ceph.com/issues/39479>`_, `pr#27779 <https://github.com/ceph/ceph/pull/27779>`_, Casey Bodley)
-* tests: rgw: fix swift warning message (`issue#40304 <http://tracker.ceph.com/issues/40304>`_, `pr#28698 <https://github.com/ceph/ceph/pull/28698>`_, Casey Bodley)
-* tests: rgw: more fixes for swift task (`issue#40304 <http://tracker.ceph.com/issues/40304>`_, `pr#28922 <https://github.com/ceph/ceph/pull/28922>`_, Casey Bodley)
-* tests: rgw: skip swift tests on rhel 7.6+ (`issue#40402 <http://tracker.ceph.com/issues/40402>`_, `issue#40304 <http://tracker.ceph.com/issues/40304>`_, `pr#28604 <https://github.com/ceph/ceph/pull/28604>`_, Casey Bodley)
-* tests: stop testing simple messenger in fs qa (`issue#40373 <http://tracker.ceph.com/issues/40373>`_, `pr#28562 <https://github.com/ceph/ceph/pull/28562>`_, Patrick Donnelly)
-* tests: tasks/rbd_fio: fixed missing delimiter between 'cd' and 'configure (`issue#39590 <http://tracker.ceph.com/issues/39590>`_, `pr#27989 <https://github.com/ceph/ceph/pull/27989>`_, Jason Dillaman')
-* tests: test_sessionmap assumes simple messenger (`issue#39430 <http://tracker.ceph.com/issues/39430>`_, `pr#27772 <https://github.com/ceph/ceph/pull/27772>`_, Patrick Donnelly)
-* tests: use curl in wait_for_radosgw() in util/rgw.py (`issue#40346 <http://tracker.ceph.com/issues/40346>`_, `pr#28598 <https://github.com/ceph/ceph/pull/28598>`_, Ali Maredia)
-* tests: workunits/rbd: use https protocol for devstack git operations (`issue#39656 <http://tracker.ceph.com/issues/39656>`_, `issue#39729 <http://tracker.ceph.com/issues/39729>`_, `pr#28128 <https://github.com/ceph/ceph/pull/28128>`_, Jason Dillaman)
-* tests: workunits/rbd: wait for rbd-nbd unmap to complete (`issue#39675 <http://tracker.ceph.com/issues/39675>`_, `issue#39598 <http://tracker.ceph.com/issues/39598>`_, `pr#28273 <https://github.com/ceph/ceph/pull/28273>`_, Jason Dillaman)
-
-
-v14.2.1 Nautilus
-================
-
-This is the first bug fix release of Ceph Nautilus release series. We recommend
-all nautilus users upgrade to this release. For upgrading from older releases of
-ceph, general guidelines for upgrade to nautilus must be followed
-:ref:`nautilus-old-upgrade`.
-
-Notable Changes
----------------
-
-* Ceph now packages python bindings for python3.6 instead of
-  python3.4, because EPEL7 recently switched from python3.4 to
-  python3.6 as the native python3. see the `announcement <https://lists.fedoraproject.org/archives/list/epel-announce@lists.fedoraproject.org/message/EGUMKAIMPK2UD5VSHXM53BH2MBDGDWMO/>`_
-  for more details on the background of this change.
-
-Known Issues
-------------
-
-* Nautilus-based librbd clients cannot open images stored on pre-Luminous
-  clusters
-
-Changelog
----------
-* bluestore: ceph-bluestore-tool: bluefs-bdev-expand cmd might assert if no WAL is configured (`issue#39253 <http://tracker.ceph.com/issues/39253>`_, `pr#27523 <https://github.com/ceph/ceph/pull/27523>`_, Igor Fedotov)
-* bluestore: os/bluestore: fix bitmap allocator issues (`pr#27139 <https://github.com/ceph/ceph/pull/27139>`_, Igor Fedotov)
-* build/ops,rgw: rgw: build async scheduler only when beast is built (`pr#27191 <https://github.com/ceph/ceph/pull/27191>`_, Abhishek Lekshmanan)
-* build/ops: build/ops: Running ceph under Pacemaker control not supported by SUSE Linux Enterprise (`issue#38862 <http://tracker.ceph.com/issues/38862>`_, `pr#27127 <https://github.com/ceph/ceph/pull/27127>`_, Nathan Cutler)
-* build/ops: build/ops: ceph-mgr-diskprediction-local requires numpy and scipy on SUSE, but these packages do not exist on SUSE (`issue#38863 <http://tracker.ceph.com/issues/38863>`_, `pr#27125 <https://github.com/ceph/ceph/pull/27125>`_, Nathan Cutler)
-* build/ops: cmake/FindRocksDB: fix IMPORTED_LOCATION for ROCKSDB_LIBRARIES (`issue#38993 <http://tracker.ceph.com/issues/38993>`_, `pr#27601 <https://github.com/ceph/ceph/pull/27601>`_, dudengke)
-* build/ops: cmake: revert librados_tp.so version from 3 to 2 (`issue#39291 <http://tracker.ceph.com/issues/39291>`_, `issue#39293 <http://tracker.ceph.com/issues/39293>`_, `pr#27597 <https://github.com/ceph/ceph/pull/27597>`_, Nathan Cutler)
-* build/ops: qa,rpm,cmake: switch over to python3.6 (`issue#39236 <http://tracker.ceph.com/issues/39236>`_, `issue#39164 <http://tracker.ceph.com/issues/39164>`_, `pr#27505 <https://github.com/ceph/ceph/pull/27505>`_, Boris Ranto, Kefu Chai)
-* cephfs: fs: we lack a feature bit for nautilus (`issue#39078 <http://tracker.ceph.com/issues/39078>`_, `issue#39187 <http://tracker.ceph.com/issues/39187>`_, `pr#27497 <https://github.com/ceph/ceph/pull/27497>`_, Patrick Donnelly)
-* cephfs: ls -S command produces AttributeError: 'str' object has no attribute 'decode' (`pr#27531 <https://github.com/ceph/ceph/pull/27531>`_, Varsha Rao)
-* cephfs: mds|kclient: MDS_CLIENT_LATE_RELEASE warning caused by inline bug on RHEL 7.5 (`issue#39225 <http://tracker.ceph.com/issues/39225>`_, `pr#27500 <https://github.com/ceph/ceph/pull/27500>`_, "Yan, Zheng")
-* common,core: crush: various fixes for weight-sets, the osd_crush_update_weight_set option, and tests (`pr#27119 <https://github.com/ceph/ceph/pull/27119>`_, Sage Weil)
-* common/blkdev: get_device_id: behave if model is lvm and id_model_enc isn't there (`pr#27158 <https://github.com/ceph/ceph/pull/27158>`_, Sage Weil)
-* common/config: parse --default-$option as a default value (`pr#27217 <https://github.com/ceph/ceph/pull/27217>`_, Sage Weil)
-* core,mgr: mgr: autoscale down can lead to max_pg_per_osd limit (`issue#39271 <http://tracker.ceph.com/issues/39271>`_, `issue#38786 <http://tracker.ceph.com/issues/38786>`_, `pr#27547 <https://github.com/ceph/ceph/pull/27547>`_, Sage Weil)
-* core,mon: mon/Monitor.cc: print min_mon_release correctly (`pr#27168 <https://github.com/ceph/ceph/pull/27168>`_, Neha Ojha)
-* core,tests: tests: osd-markdown.sh can fail with CLI_DUP_COMMAND=1 (`issue#38359 <http://tracker.ceph.com/issues/38359>`_, `issue#39275 <http://tracker.ceph.com/issues/39275>`_, `pr#27550 <https://github.com/ceph/ceph/pull/27550>`_, Sage Weil)
-* core: Improvements to auto repair (`issue#38616 <http://tracker.ceph.com/issues/38616>`_, `pr#27220 <https://github.com/ceph/ceph/pull/27220>`_, xie xingguo, David Zafman)
-* core: Rook: Fix creation of Bluestore OSDs (`issue#39167 <http://tracker.ceph.com/issues/39167>`_, `issue#39062 <http://tracker.ceph.com/issues/39062>`_, `pr#27486 <https://github.com/ceph/ceph/pull/27486>`_, Sebastian Wagner)
-* core: ceph-objectstore-tool: rename dump-import to dump-export (`issue#39325 <http://tracker.ceph.com/issues/39325>`_, `issue#39284 <http://tracker.ceph.com/issues/39284>`_, `pr#27610 <https://github.com/ceph/ceph/pull/27610>`_, David Zafman)
-* core: common/blkdev: handle devices with ID_MODEL as "LVM PV ..." but valid ID_MODEL_ENC (`pr#27096 <https://github.com/ceph/ceph/pull/27096>`_, Sage Weil)
-* core: common: fix deferred log starting (`pr#27388 <https://github.com/ceph/ceph/pull/27388>`_, Sage Weil, Jason Dillaman)
-* core: crush/CrushCompiler: Fix __replacement_assert (`issue#39174 <http://tracker.ceph.com/issues/39174>`_, `pr#27620 <https://github.com/ceph/ceph/pull/27620>`_, Brad Hubbard)
-* core: global: explicitly call out EIO events in crash dumps (`pr#27440 <https://github.com/ceph/ceph/pull/27440>`_, Sage Weil)
-* core: log: log_to_file + --default-\* + fixes and improvements (`pr#27278 <https://github.com/ceph/ceph/pull/27278>`_, Sage Weil)
-* core: mon/MgrStatMonitor: ensure only one copy of initial service map (`issue#38839 <http://tracker.ceph.com/issues/38839>`_, `pr#27116 <https://github.com/ceph/ceph/pull/27116>`_, Sage Weil)
-* core: mon/OSDMonitor: allow 'osd pool set pgp_num_actual' (`pr#27060 <https://github.com/ceph/ceph/pull/27060>`_, Sage Weil)
-* core: mon: make mon_osd_down_out_subtree_limit update at runtime (`pr#27582 <https://github.com/ceph/ceph/pull/27582>`_, Sage Weil)
-* core: mon: ok-to-stop commands for mon and mds (`pr#27347 <https://github.com/ceph/ceph/pull/27347>`_, Sage Weil)
-* core: mon: quiet devname log noise (`pr#27314 <https://github.com/ceph/ceph/pull/27314>`_, Sage Weil)
-* core: osd/OSDMap: add 'zone' to default crush map (`pr#27117 <https://github.com/ceph/ceph/pull/27117>`_, Sage Weil)
-* core: osd/PGLog.h: print olog_can_rollback_to before deciding to rollback (`issue#38906 <http://tracker.ceph.com/issues/38906>`_, `issue#38894 <http://tracker.ceph.com/issues/38894>`_, `pr#27302 <https://github.com/ceph/ceph/pull/27302>`_, Neha Ojha)
-* core: osd/osd_types: fix object_stat_sum_t fast-path decode (`issue#39320 <http://tracker.ceph.com/issues/39320>`_, `issue#39281 <http://tracker.ceph.com/issues/39281>`_, `pr#27555 <https://github.com/ceph/ceph/pull/27555>`_, David Zafman)
-* core: osd: backport recent upmap fixes (`issue#38860 <http://tracker.ceph.com/issues/38860>`_, `issue#38967 <http://tracker.ceph.com/issues/38967>`_, `issue#38897 <http://tracker.ceph.com/issues/38897>`_, `issue#38826 <http://tracker.ceph.com/issues/38826>`_, `pr#27225 <https://github.com/ceph/ceph/pull/27225>`_, huangjun, xie xingguo)
-* core: osd: process_copy_chunk remove obc ref before pg unlock (`issue#38842 <http://tracker.ceph.com/issues/38842>`_, `issue#38973 <http://tracker.ceph.com/issues/38973>`_, `pr#27478 <https://github.com/ceph/ceph/pull/27478>`_, Zengran Zhang)
-* dashboard: NFS: failed to disable NFSv3 in export create (`issue#39104 <http://tracker.ceph.com/issues/39104>`_, `issue#38997 <http://tracker.ceph.com/issues/38997>`_, `pr#27368 <https://github.com/ceph/ceph/pull/27368>`_, Tiago Melo)
-* doc/releases/nautilus: fix config update step (`pr#27502 <https://github.com/ceph/ceph/pull/27502>`_, Sage Weil)
-* doc: doc/orchestrator: Fix broken bullet points (`issue#39168 <http://tracker.ceph.com/issues/39168>`_, `pr#27487 <https://github.com/ceph/ceph/pull/27487>`_, Sebastian Wagner)
-* doc: doc: Minor rados related documentation fixes (`issue#38896 <http://tracker.ceph.com/issues/38896>`_, `issue#38903 <http://tracker.ceph.com/issues/38903>`_, `pr#27189 <https://github.com/ceph/ceph/pull/27189>`_, David Zafman)
-* doc: doc: rgw: Added library/package for Golang (`issue#38730 <http://tracker.ceph.com/issues/38730>`_, `issue#38867 <http://tracker.ceph.com/issues/38867>`_, `pr#27549 <https://github.com/ceph/ceph/pull/27549>`_, Irek Fasikhov)
-* install-deps.sh: install '\*rpm-macros' (`issue#39164 <http://tracker.ceph.com/issues/39164>`_, `pr#27544 <https://github.com/ceph/ceph/pull/27544>`_, Kefu Chai)
-* mgr/dashboard add polish language (`issue#39052 <http://tracker.ceph.com/issues/39052>`_, `pr#27287 <https://github.com/ceph/ceph/pull/27287>`_, Sebastian Krah)
-* mgr/dashboard/qa: Improve tasks.mgr.test_dashboard.TestDashboard.test_standby (`pr#27237 <https://github.com/ceph/ceph/pull/27237>`_, Volker Theile)
-* mgr/dashboard: 1 osds exist in the crush map but not in the osdmap breaks OSD page (`issue#38885 <http://tracker.ceph.com/issues/38885>`_, `issue#36086 <http://tracker.ceph.com/issues/36086>`_, `pr#27543 <https://github.com/ceph/ceph/pull/27543>`_, Patrick Nawracay)
-* mgr/dashboard: Adapt iSCSI overview page to make use of ceph-iscsi (`pr#27541 <https://github.com/ceph/ceph/pull/27541>`_, Ricardo Marques)
-* mgr/dashboard: Add date range and log search functionality (`issue#37387 <http://tracker.ceph.com/issues/37387>`_, `issue#38878 <http://tracker.ceph.com/issues/38878>`_, `pr#27283 <https://github.com/ceph/ceph/pull/27283>`_, guodan1)
-* mgr/dashboard: Add refresh interval to the dashboard landing page (`issue#26872 <http://tracker.ceph.com/issues/26872>`_, `issue#38988 <http://tracker.ceph.com/issues/38988>`_, `pr#27267 <https://github.com/ceph/ceph/pull/27267>`_, guodan1)
-* mgr/dashboard: Add separate option to config SSL port (`issue#39001 <http://tracker.ceph.com/issues/39001>`_, `pr#27393 <https://github.com/ceph/ceph/pull/27393>`_, Volker Theile)
-* mgr/dashboard: Added breadcrumb tests to NFS menu (`issue#38981 <http://tracker.ceph.com/issues/38981>`_, `pr#27589 <https://github.com/ceph/ceph/pull/27589>`_, Nathan Weinberg)
-* mgr/dashboard: Back button component (`issue#39058 <http://tracker.ceph.com/issues/39058>`_, `pr#27405 <https://github.com/ceph/ceph/pull/27405>`_, Stephan Müller)
-* mgr/dashboard: Cannot submit NFS export form when NFSv4 is not selected (`issue#39105 <http://tracker.ceph.com/issues/39105>`_, `issue#39063 <http://tracker.ceph.com/issues/39063>`_, `pr#27370 <https://github.com/ceph/ceph/pull/27370>`_, Tiago Melo)
-* mgr/dashboard: Error creating NFS export without UDP (`issue#39107 <http://tracker.ceph.com/issues/39107>`_, `issue#39090 <http://tracker.ceph.com/issues/39090>`_, `pr#27372 <https://github.com/ceph/ceph/pull/27372>`_, Tiago Melo)
-* mgr/dashboard: Error on iSCSI disk diff (`pr#27460 <https://github.com/ceph/ceph/pull/27460>`_, Ricardo Marques)
-* mgr/dashboard: Filter iSCSI target images based on required features (`issue#39002 <http://tracker.ceph.com/issues/39002>`_, `pr#27363 <https://github.com/ceph/ceph/pull/27363>`_, Ricardo Marques)
-* mgr/dashboard: Fix env vars of `run-tox.sh` (`issue#38798 <http://tracker.ceph.com/issues/38798>`_, `issue#38864 <http://tracker.ceph.com/issues/38864>`_, `pr#27361 <https://github.com/ceph/ceph/pull/27361>`_, Patrick Nawracay)
-* mgr/dashboard: Fixes tooltip behavior (`pr#27395 <https://github.com/ceph/ceph/pull/27395>`_, Stephan Müller)
-* mgr/dashboard: FixtureHelper (`issue#39041 <http://tracker.ceph.com/issues/39041>`_, `pr#27398 <https://github.com/ceph/ceph/pull/27398>`_, Stephan Müller)
-* mgr/dashboard: NFS Squash field should be required (`issue#39106 <http://tracker.ceph.com/issues/39106>`_, `issue#39064 <http://tracker.ceph.com/issues/39064>`_, `pr#27371 <https://github.com/ceph/ceph/pull/27371>`_, Tiago Melo)
-* mgr/dashboard: PreventDefault isn't working on 400 errors (`pr#27389 <https://github.com/ceph/ceph/pull/27389>`_, Stephan Müller)
-* mgr/dashboard: Typo in "CephFS Name" field on NFS form (`issue#39067 <http://tracker.ceph.com/issues/39067>`_, `pr#27449 <https://github.com/ceph/ceph/pull/27449>`_, Tiago Melo)
-* mgr/dashboard: dashboard giving 401 unauthorized (`issue#38871 <http://tracker.ceph.com/issues/38871>`_, `pr#27219 <https://github.com/ceph/ceph/pull/27219>`_, ming416)
-* mgr/dashboard: fix sparkline component (`issue#38866 <http://tracker.ceph.com/issues/38866>`_, `pr#27260 <https://github.com/ceph/ceph/pull/27260>`_, Alfonso Martínez)
-* mgr/dashboard: readonly user can't see any pages (`issue#39240 <http://tracker.ceph.com/issues/39240>`_, `pr#27611 <https://github.com/ceph/ceph/pull/27611>`_, Stephan Müller)
-* mgr/dashboard: unify button/URL actions naming + bugfix (add whitelist to guard) (`issue#37337 <http://tracker.ceph.com/issues/37337>`_, `issue#39003 <http://tracker.ceph.com/issues/39003>`_, `pr#27492 <https://github.com/ceph/ceph/pull/27492>`_, Ernesto Puerta)
-* mgr/dashboard: update vstart to use new ssl_server_port (`issue#39124 <http://tracker.ceph.com/issues/39124>`_, `pr#27394 <https://github.com/ceph/ceph/pull/27394>`_, Ernesto Puerta)
-* mgr/deepsea: use ceph_volume output in get_inventory() (`issue#39083 <http://tracker.ceph.com/issues/39083>`_, `pr#27319 <https://github.com/ceph/ceph/pull/27319>`_, Tim Serong)
-* mgr/diskprediction_cloud: Correct base64 encode translate table (`pr#27167 <https://github.com/ceph/ceph/pull/27167>`_, Rick Chen)
-* mgr/orchestrator: Add error handling to interface (`issue#38837 <http://tracker.ceph.com/issues/38837>`_, `pr#27095 <https://github.com/ceph/ceph/pull/27095>`_, Sebastian Wagner)
-* mgr/pg_autoscaler: add pg_autoscale_bias (`pr#27387 <https://github.com/ceph/ceph/pull/27387>`_, Sage Weil)
-* mgr:  mgr/dashboard: Error on iSCSI target submission (`pr#27461 <https://github.com/ceph/ceph/pull/27461>`_, Ricardo Marques)
-* mgr: ceph-mgr:  ImportError: Interpreter change detected - this module can only be loaded into one interprer per process (`issue#38865 <http://tracker.ceph.com/issues/38865>`_, `pr#27128 <https://github.com/ceph/ceph/pull/27128>`_, Tim Serong)
-* mgr: mgr/DaemonServer: handle_conf_change - fix broken locking (`issue#38964 <http://tracker.ceph.com/issues/38964>`_, `issue#38899 <http://tracker.ceph.com/issues/38899>`_, `pr#27454 <https://github.com/ceph/ceph/pull/27454>`_, xie xingguo)
-* mgr: mgr/balancer: Python 3 compatibility fix (`issue#38831 <http://tracker.ceph.com/issues/38831>`_, `issue#38855 <http://tracker.ceph.com/issues/38855>`_, `pr#27227 <https://github.com/ceph/ceph/pull/27227>`_, Marius Schiffer)
-* mgr: mgr/dashboard: Check if gateway is in use before allowing the deletion via `iscsi-gateway-rm` command (`pr#27457 <https://github.com/ceph/ceph/pull/27457>`_, Ricardo Marques)
-* mgr: mgr/dashboard: Display the number of active sessions for each iSCSI target (`pr#27450 <https://github.com/ceph/ceph/pull/27450>`_, Ricardo Marques)
-* mgr: mgr/devicehealth: Fix python 3 incompatiblity (`issue#38957 <http://tracker.ceph.com/issues/38957>`_, `issue#38939 <http://tracker.ceph.com/issues/38939>`_, `pr#27390 <https://github.com/ceph/ceph/pull/27390>`_, Marius Schiffer)
-* mgr: mgr/telemetry: add report_timestamp to sent reports (`pr#27701 <https://github.com/ceph/ceph/pull/27701>`_, Dan Mick)
-* mgr: mgr/telemetry: use list; redact host; 24h default interval (`pr#27709 <https://github.com/ceph/ceph/pull/27709>`_, Sage Weil, Dan Mick)
-* mgr: mgr: Configure Py root logger for Mgr modules (`issue#38969 <http://tracker.ceph.com/issues/38969>`_, `pr#27261 <https://github.com/ceph/ceph/pull/27261>`_, Volker Theile)
-* mgr: mgr: Diskprediction unable to transfer data into the cloud server (`issue#38970 <http://tracker.ceph.com/issues/38970>`_, `pr#27240 <https://github.com/ceph/ceph/pull/27240>`_, Rick Chen)
-* mon/MonClient: do not dereference auth_supported.end() (`pr#27215 <https://github.com/ceph/ceph/pull/27215>`_, Kefu Chai)
-* mon/MonmapMonitor: clean up empty created stamp in monmap (`issue#39085 <http://tracker.ceph.com/issues/39085>`_, `pr#27399 <https://github.com/ceph/ceph/pull/27399>`_, Sage Weil)
-* mon: mon: add cluster log to file option (`pr#27346 <https://github.com/ceph/ceph/pull/27346>`_, Sage Weil)
-* msg/async v2: make v2 work on rdma (`pr#27216 <https://github.com/ceph/ceph/pull/27216>`_, Jianpeng Ma)
-* msg: default to debug_ms=0 (`pr#27197 <https://github.com/ceph/ceph/pull/27197>`_, Sage Weil)
-* osd: OSDMapRef access by multiple threads is unsafe (`pr#27402 <https://github.com/ceph/ceph/pull/27402>`_, Zengran Zhang, Kefu Chai)
-* qa/valgrind (`pr#27320 <https://github.com/ceph/ceph/pull/27320>`_, Radoslaw Zarzynski)
-* rbd,tests: backport krbd discard qa fixes to nautilus (`issue#38861 <http://tracker.ceph.com/issues/38861>`_, `pr#27258 <https://github.com/ceph/ceph/pull/27258>`_, Ilya Dryomov)
-* rbd,tests: backport krbd discard qa fixes to stable branches (`issue#38956 <http://tracker.ceph.com/issues/38956>`_, `pr#27239 <https://github.com/ceph/ceph/pull/27239>`_, Ilya Dryomov)
-* rbd: librbd: ignore -EOPNOTSUPP errors when retrieving image group membership (`issue#38834 <http://tracker.ceph.com/issues/38834>`_, `pr#27080 <https://github.com/ceph/ceph/pull/27080>`_, Jason Dillaman)
-* rbd: librbd: look for pool metadata in default namespace (`issue#38961 <http://tracker.ceph.com/issues/38961>`_, `pr#27423 <https://github.com/ceph/ceph/pull/27423>`_, Mykola Golub)
-* rbd: librbd: trash move return EBUSY instead of EINVAL for migrating image (`issue#38968 <http://tracker.ceph.com/issues/38968>`_, `pr#27475 <https://github.com/ceph/ceph/pull/27475>`_, Mykola Golub)
-* rbd: rbd: krbd: return -ETIMEDOUT in polling (`issue#38792 <http://tracker.ceph.com/issues/38792>`_, `issue#38977 <http://tracker.ceph.com/issues/38977>`_, `pr#27539 <https://github.com/ceph/ceph/pull/27539>`_, Dongsheng Yang)
-* rgw: Adding tcp_nodelay option to Beast (`issue#38926 <http://tracker.ceph.com/issues/38926>`_, `pr#27355 <https://github.com/ceph/ceph/pull/27355>`_, Or Friedmann)
-* rgw: Fix S3 compatibility bug when CORS is not found (`issue#38923 <http://tracker.ceph.com/issues/38923>`_, `issue#37945 <http://tracker.ceph.com/issues/37945>`_, `pr#27331 <https://github.com/ceph/ceph/pull/27331>`_, Nick Janus)
-* rgw: LC: handle resharded buckets (`pr#27559 <https://github.com/ceph/ceph/pull/27559>`_, Abhishek Lekshmanan)
-* rgw: Make rgw admin ops api get user info consistent with the command line (`issue#39135 <http://tracker.ceph.com/issues/39135>`_, `pr#27501 <https://github.com/ceph/ceph/pull/27501>`_, Li Shuhao)
-* rgw: don't crash on missing /etc/mime.types (`issue#38921 <http://tracker.ceph.com/issues/38921>`_, `issue#38328 <http://tracker.ceph.com/issues/38328>`_, `pr#27329 <https://github.com/ceph/ceph/pull/27329>`_, Casey Bodley)
-* rgw: don't recalculate etags for slo/dlo (`pr#27561 <https://github.com/ceph/ceph/pull/27561>`_, Casey Bodley)
-* rgw: fix RGWDeleteMultiObj::verify_permission() (`issue#38980 <http://tracker.ceph.com/issues/38980>`_, `pr#27586 <https://github.com/ceph/ceph/pull/27586>`_, Irek Fasikhov)
-* rgw: fix read not exists null version return wrong (`issue#38811 <http://tracker.ceph.com/issues/38811>`_, `issue#38909 <http://tracker.ceph.com/issues/38909>`_, `pr#27306 <https://github.com/ceph/ceph/pull/27306>`_, Tianshan Qu)
-* rgw: ldap: fix early return in LDAPAuthEngine::init w/uri not empty() (`issue#38754 <http://tracker.ceph.com/issues/38754>`_, `pr#26972 <https://github.com/ceph/ceph/pull/26972>`_, Matt Benjamin)
-* rgw: multisite: data sync loops back to the start of the datalog after reaching the end (`issue#39075 <http://tracker.ceph.com/issues/39075>`_, `issue#39033 <http://tracker.ceph.com/issues/39033>`_, `pr#27498 <https://github.com/ceph/ceph/pull/27498>`_, Casey Bodley)
-* rgw: nfs: skip empty (non-POSIX) path segments (`issue#38744 <http://tracker.ceph.com/issues/38744>`_, `issue#38773 <http://tracker.ceph.com/issues/38773>`_, `pr#27208 <https://github.com/ceph/ceph/pull/27208>`_, Matt Benjamin)
-* rgw: nfs: svc-enable RGWLib (`issue#38774 <http://tracker.ceph.com/issues/38774>`_, `pr#27232 <https://github.com/ceph/ceph/pull/27232>`_, Matt Benjamin)
-* rgw: orphans find perf improvements (`issue#39181 <http://tracker.ceph.com/issues/39181>`_, `pr#27560 <https://github.com/ceph/ceph/pull/27560>`_, Abhishek Lekshmanan)
-* rgw: rgw admin: disable stale instance deletion in multisite (`issue#39015 <http://tracker.ceph.com/issues/39015>`_, `pr#27602 <https://github.com/ceph/ceph/pull/27602>`_, Abhishek Lekshmanan)
-* rgw: sse c fixes (`issue#38700 <http://tracker.ceph.com/issues/38700>`_, `pr#27296 <https://github.com/ceph/ceph/pull/27296>`_, Adam Kupczyk, Casey Bodley, Abhishek Lekshmanan)
-* rgw: support delimiter longer then one symbol (`issue#38777 <http://tracker.ceph.com/issues/38777>`_, `pr#27548 <https://github.com/ceph/ceph/pull/27548>`_, Matt Benjamin)
-* rook-ceph-system namespace hardcoded in the rook orchestrator (`issue#38799 <http://tracker.ceph.com/issues/38799>`_, `issue#39250 <http://tracker.ceph.com/issues/39250>`_, `pr#27496 <https://github.com/ceph/ceph/pull/27496>`_, Sebastian Wagner)
-* rpm,cmake: use specified python3 version if any (`pr#27382 <https://github.com/ceph/ceph/pull/27382>`_, Kefu Chai)
-
-
-v14.2.0 Nautilus
-================
-
-This is the first stable release of Ceph Nautilus.
-
-Major Changes from Mimic
-------------------------
-
-- *Dashboard*:
-
-  The :ref:`mgr-dashboard` has gained a lot of new functionality:
-
-  * Support for multiple users / roles
-  * SSO (SAMLv2) for user authentication
-  * Auditing support
-  * New landing page, showing more metrics and health info
-  * I18N support
-  * REST API documentation with Swagger API
-
-  New Ceph management features include:
-
-  * OSD management (mark as down/out, change OSD settings, recovery profiles)
-  * Cluster config settings editor
-  * Ceph Pool management (create/modify/delete)
-  * ECP management
-  * RBD mirroring configuration
-  * Embedded Grafana Dashboards (derived from Ceph Metrics)
-  * CRUSH map viewer
-  * NFS Ganesha management
-  * iSCSI target management (via :ref:`ceph-iscsi`)
-  * RBD QoS configuration
-  * Ceph Manager (ceph-mgr) module management
-  * Prometheus alert Management
-
-  Also, the Ceph Dashboard is now split into its own package named
-  ``ceph-mgr-dashboard``. You might want to install it separately,
-  if your package management software fails to do so when it installs
-  ``ceph-mgr``.
-
-- *RADOS*:
-
-  * The number of placement groups (PGs) per pool can now be decreased
-    at any time, and the cluster can :ref:`automatically tune the PG count <pg-autoscaler>`
-    based on cluster utilization or administrator hints.
-  * The new :ref:`v2 wire protocol <msgr2>` brings support for encryption on the wire.
-  * Physical :ref:`storage devices <devices>` consumed by OSD and Monitor daemons are
-    now tracked by the cluster along with health metrics (i.e.,
-    SMART), and the cluster can apply a pre-trained prediction model
-    or a cloud-based prediction service to :ref:`warn about expected
-    HDD or SSD failures <diskprediction>`.
-  * The NUMA node for OSD daemons can easily be monitored via the
-    ``ceph osd numa-status`` command, and configured via the
-    ``osd_numa_node`` config option.
-  * When BlueStore OSDs are used, space utilization is now broken down
-    by object data, omap data, and internal metadata, by pool, and by
-    pre- and post- compression sizes.
-  * OSDs more effectively prioritize the most important PGs and
-    objects when performing recovery and backfill.
-  * Progress for long-running background processes--like recovery
-    after a device failure--is now reported as part of ``ceph
-    status``.
-  * An experimental `Coupled-Layer "Clay" erasure code
-    <https://www.usenix.org/conference/fast18/presentation/vajha>`_
-    plugin has been added that reduces network bandwidth and IO needed
-    for most recovery operations.
-
-- *RGW*:
-
-  * S3 lifecycle transition for tiering between storage classes.
-  * A new web frontend (Beast) has replaced civetweb as the default,
-    improving overall performance.
-  * A new publish/subscribe infrastructure allows RGW to feed events
-    to serverless frameworks like knative or data pipelies like Kafka.
-  * A range of authentication features, including STS federation using
-    OAuth2 and OpenID::connect and an OPA (Open Policy Agent)
-    authentication delegation prototype.
-  * The new archive zone federation feature enables full preservation
-    of all objects (including history) in a separate zone.
-
-- *CephFS*:
-
-  * MDS stability has been greatly improved for large caches and
-    long-running clients with a lot of RAM. Cache trimming and client
-    capability recall is now throttled to prevent overloading the MDS.
-  * CephFS may now be exported via NFS-Ganesha clusters in environments managed
-    by Rook. Ceph manages the clusters and ensures high-availability and
-    scalability. An `introductory demo
-    <https://ceph.com/community/deploying-a-cephnfs-server-cluster-with-rook/>`_
-    is available. More automation of this feature is expected to be forthcoming
-    in future minor releases of Nautilus.
-  * The MDS ``mds_standby_for_*``, ``mon_force_standby_active``, and
-    ``mds_standby_replay`` configuration options have been obsoleted. Instead,
-    the operator :ref:`may now set <mds-standby-replay>` the new
-    ``allow_standby_replay`` flag on the CephFS file system. This setting
-    causes standbys to become standby-replay for any available rank in the file
-    system.
-  * MDS now supports dropping its cache which concurrently asks clients
-    to trim their caches. This is done using MDS admin socket ``cache drop``
-    command.
-  * It is now possible to check the progress of an on-going scrub in the MDS.
-    Additionally, a scrub may be paused or aborted. See :ref:`the scrub
-    documentation <mds-scrub>` for more information.
-  * A new interface for creating volumes is provided via the ``ceph volume``
-    command-line-interface.
-  * A new cephfs-shell tool is available for manipulating a CephFS file
-    system without mounting.
-  * CephFS-related output from ``ceph status`` has been reformatted for brevity,
-    clarity, and usefulness.
-  * Lazy IO has been revamped. It can be turned on by the client using the new
-    CEPH_O_LAZY flag to the ``ceph_open`` C/C++ API or via the config option
-    ``client_force_lazyio``.
-  * CephFS file system can now be brought down rapidly via the ``ceph fs fail``
-    command. See :ref:`the administration page <cephfs-administration>` for
-    more information.
-
-- *RBD*:
-
-  * Images can be live-migrated with minimal downtime to assist with moving
-    images between pools or to new layouts.
-  * New ``rbd perf image iotop`` and ``rbd perf image iostat`` commands provide
-    an iotop- and iostat-like IO monitor for all RBD images.
-  * The *ceph-mgr* Prometheus exporter now optionally includes an IO monitor
-    for all RBD images.
-  * Support for separate image namespaces within a pool for tenant isolation.
-
-- *Misc*:
-
-  * Ceph has a new set of :ref:`orchestrator modules
-    <orchestrator-cli-module>` to directly interact with external
-    orchestrators like ceph-ansible, DeepSea, Rook, or simply ssh via
-    a consistent CLI (and, eventually, Dashboard) interface.
-
-.. _nautilus-old-upgrade:
-
-Upgrading from Mimic or Luminous
---------------------------------
-
-Notes
-~~~~~
-
-* During the upgrade from Luminous to Nautilus, it will not be
-  possible to create a new OSD using a Luminous ceph-osd daemon after
-  the monitors have been upgraded to Nautilus.  We recommend you avoid adding
-  or replacing any OSDs while the upgrade is in progress.
-
-* We recommend you avoid creating any RADOS pools while the upgrade is
-  in progress.
-
-* You can monitor the progress of your upgrade at each stage with the
-  ``ceph versions`` command, which will tell you what ceph version(s) are
-  running for each type of daemon.
-
-Instructions
-~~~~~~~~~~~~
-
-#. If your cluster was originally installed with a version prior to
-   Luminous, ensure that it has completed at least one full scrub of
-   all PGs while running Luminous.  Failure to do so will cause your
-   monitor daemons to refuse to join the quorum on start, leaving them
-   non-functional.
-
-   If you are unsure whether or not your Luminous cluster has
-   completed a full scrub of all PGs, you can check your cluster's
-   state by running::
-
-     # ceph osd dump | grep ^flags
-
-   In order to be able to proceed to Nautilus, your OSD map must include
-   the ``recovery_deletes`` and ``purged_snapdirs`` flags.
-
-   If your OSD map does not contain both these flags, you can simply
-   wait for approximately 24-48 hours, which in a standard cluster
-   configuration should be ample time for all your placement groups to
-   be scrubbed at least once, and then repeat the above process to
-   recheck.
-
-   However, if you have just completed an upgrade to Luminous and want
-   to proceed to Mimic in short order, you can force a scrub on all
-   placement groups with a one-line shell command, like::
-
-     # ceph pg dump pgs_brief | cut -d " " -f 1 | xargs -n1 ceph pg scrub
-
-   You should take into consideration that this forced scrub may
-   possibly have a negative impact on your Ceph clients' performance.
-
-#. Make sure your cluster is stable and healthy (no down or
-   recovering OSDs).  (Optional, but recommended.)
-
-#. Set the ``noout`` flag for the duration of the upgrade. (Optional,
-   but recommended.)::
-
-     # ceph osd set noout
-
-#. Upgrade monitors by installing the new packages and restarting the
-   monitor daemons.  For example, on each monitor host,::
-
-     # systemctl restart ceph-mon.target
-
-   Once all monitors are up, verify that the monitor upgrade is
-   complete by looking for the ``nautilus`` string in the mon
-   map.  The command::
-
-     # ceph mon dump | grep min_mon_release
-
-   should report::
-
-     min_mon_release 14 (nautilus)
-
-   If it doesn't, that implies that one or more monitors hasn't been
-   upgraded and restarted and/or the quorum does not include all monitors.
-
-#. Upgrade ``ceph-mgr`` daemons by installing the new packages and
-   restarting all manager daemons.  For example, on each manager host,::
-
-     # systemctl restart ceph-mgr.target
-
-   Please note, if you are using Ceph Dashboard, you will probably need to
-   install ``ceph-mgr-dashboard`` separately after upgrading ``ceph-mgr``
-   package. The install script of ``ceph-mgr-dashboard`` will restart the
-   manager daemons automatically for you. So in this case, you can just skip
-   the step to restart the daemons.
-
-   Verify the ``ceph-mgr`` daemons are running by checking ``ceph
-   -s``::
-
-     # ceph -s
-
-     ...
-       services:
-        mon: 3 daemons, quorum foo,bar,baz
-        mgr: foo(active), standbys: bar, baz
-     ...
-  
-#. Upgrade all OSDs by installing the new packages and restarting the
-   ceph-osd daemons on all OSD hosts::
-
-     # systemctl restart ceph-osd.target
-
-   You can monitor the progress of the OSD upgrades with the
-   ``ceph versions`` or ``ceph osd versions`` commands::
-
-     # ceph osd versions
-     {
-        "ceph version 13.2.5 (...) mimic (stable)": 12,
-        "ceph version 14.2.0 (...) nautilus (stable)": 22,
-     }
-
-#. If there are any OSDs in the cluster deployed with ceph-disk (e.g.,
-   almost any OSDs that were created before the Mimic release), you
-   need to tell ceph-volume to adopt responsibility for starting the
-   daemons.  On each host containing OSDs, ensure the OSDs are
-   currently running, and then::
-
-     # ceph-volume simple scan
-     # ceph-volume simple activate --all
-
-   We recommend that each OSD host be rebooted following this step to
-   verify that the OSDs start up automatically.
-
-   Note that ceph-volume doesn't have the same hot-plug capability
-   that ceph-disk did, where a newly attached disk is automatically
-   detected via udev events.  If the OSD isn't currently running when the
-   above ``scan`` command is run, or a ceph-disk-based OSD is moved to
-   a new host, or the host OSD is reinstalled, or the
-   ``/etc/ceph/osd`` directory is lost, you will need to scan the main
-   data partition for each ceph-disk OSD explicitly.  For example,::
-
-     # ceph-volume simple scan /dev/sdb1
-
-   The output will include the appopriate ``ceph-volume simple
-   activate`` command to enable the OSD.
-
-#. Upgrade all CephFS MDS daemons.  For each CephFS file system,
-
-   #. Reduce the number of ranks to 1.  (Make note of the original
-      number of MDS daemons first if you plan to restore it later.)::
-
-       # ceph status
-       # ceph fs set <fs_name> max_mds 1
-
-   #. Wait for the cluster to deactivate any non-zero ranks by
-      periodically checking the status::
-
-       # ceph status
-
-   #. Take all standby MDS daemons offline on the appropriate hosts with::
-
-       # systemctl stop ceph-mds@<daemon_name>
-
-   #. Confirm that only one MDS is online and is rank 0 for your FS::
-
-       # ceph status
-
-   #. Upgrade the last remaining MDS daemon by installing the new
-      packages and restarting the daemon::
-
-        # systemctl restart ceph-mds.target
-
-   #. Restart all standby MDS daemons that were taken offline::
-
-       # systemctl start ceph-mds.target
-
-   #. Restore the original value of ``max_mds`` for the volume::
-
-       # ceph fs set <fs_name> max_mds <original_max_mds>
-
-#. Upgrade all radosgw daemons by upgrading packages and restarting
-   daemons on all hosts::
-
-     # systemctl restart ceph-radosgw.target
-
-#. Complete the upgrade by disallowing pre-Nautilus OSDs and enabling
-   all new Nautilus-only functionality::
-
-     # ceph osd require-osd-release nautilus
-
-   .. important:: This step is mandatory. Failure to execute this step will make it impossible for OSDs to communicate after msgrv2 is enabled.
-
-#. If you set ``noout`` at the beginning, be sure to clear it with::
-
-     # ceph osd unset noout
-
-#. Verify the cluster is healthy with ``ceph health``.
-
-   If your CRUSH tunables are older than Hammer, Ceph will now issue a
-   health warning.  If you see a health alert to that effect, you can
-   revert this change with::
-
-     ceph config set mon mon_crush_min_required_version firefly
-
-   If Ceph does not complain, however, then we recommend you also
-   switch any existing CRUSH buckets to straw2, which was added back
-   in the Hammer release.  If you have any 'straw' buckets, this will
-   result in a modest amount of data movement, but generally nothing
-   too severe.::
-
-     ceph osd getcrushmap -o backup-crushmap
-     ceph osd crush set-all-straw-buckets-to-straw2
-
-   If there are problems, you can easily revert with::
-
-     ceph osd setcrushmap -i backup-crushmap
-
-   Moving to 'straw2' buckets will unlock a few recent features, like
-   the `crush-compat` :ref:`balancer <balancer>` mode added back in Luminous.
-
-#. To enable the new :ref:`v2 network protocol <msgr2>`, issue the
-   following command::
-
-     ceph mon enable-msgr2
-
-   This will instruct all monitors that bind to the old default port
-   6789 for the legacy v1 protocol to also bind to the new 3300 v2
-   protocol port.  To see if all monitors have been updated,::
-
-     ceph mon dump
-
-   and verify that each monitor has both a ``v2:`` and ``v1:`` address
-   listed.
-
-   Running nautilus OSDs will not bind to their v2 address automatically.
-   They must be restarted for that to happen.
-
-   .. important:: 
-      Before this step is run, the following command must already have been run:
-
-      # ceph osd require-osd-release nautilus
-
-      If this command (step 10 in this procedure) has not been run, OSDs will lose the ability to communicate.
-
-#. For each host that has been upgraded, you should update your
-   ``ceph.conf`` file so that it either specifies no monitor port (if
-   you are running the monitors on the default ports) or references
-   both the v2 and v1 addresses and ports explicitly.  Things will
-   still work if only the v1 IP and port are listed, but each CLI
-   instantiation or daemon will need to reconnect after learning the
-   monitors also speak the v2 protocol, slowing things down a bit and
-   preventing a full transition to the v2 protocol.
-
-   This is also a good time to fully transition any config options in
-   ``ceph.conf`` into the cluster's configuration database.  On each host,
-   you can use the following command to import any options into the
-   monitors with::
-
-     ceph config assimilate-conf -i /etc/ceph/ceph.conf
-
-   You can see the cluster's configuration database with::
-
-     ceph config dump
-     
-   To create a minimal but sufficient ``ceph.conf`` for each host,::
-
-     ceph config generate-minimal-conf > /etc/ceph/ceph.conf.new
-     mv /etc/ceph/ceph.conf.new /etc/ceph/ceph.conf
-
-   Be sure to use this new config only on hosts that have been
-   upgraded to Nautilus, as it may contain a ``mon_host`` value that
-   includes the new ``v2:`` and ``v1:`` prefixes for IP addresses that
-   is only understood by Nautilus.
-
-   For more information, see :ref:`msgr2_ceph_conf`.
-
-#. Consider enabling the :ref:`telemetry module <telemetry>` to send
-   anonymized usage statistics and crash information to the Ceph
-   upstream developers.  To see what would be reported (without actually
-   sending any information to anyone),::
-
-     ceph mgr module enable telemetry
-     ceph telemetry show
-
-   If you are comfortable with the data that is reported, you can opt-in to
-   automatically report the high-level cluster metadata with::
-
-     ceph telemetry on
-
-   For more information about the telemetry module, see :ref:`the
-   documentation <telemetry>`.
-
-
-Upgrading from pre-Luminous releases (like Jewel)
--------------------------------------------------
-
-You *must* first upgrade to Luminous (12.2.z) before attempting an
-upgrade to Nautilus.  In addition, your cluster must have completed at
-least one scrub of all PGs while running Luminous, setting the
-``recovery_deletes`` and ``purged_snapdirs`` flags in the OSD map.
-
-
-Upgrade compatibility notes
----------------------------
-
-These changes occurred between the Mimic and Nautilus releases.
-
-* ``ceph pg stat`` output has been modified in json
-  format to match ``ceph df`` output:
-
-  - "raw_bytes" field renamed to "total_bytes"
-  - "raw_bytes_avail" field renamed to "total_bytes_avail"
-  - "raw_bytes_avail" field renamed to "total_bytes_avail"
-  - "raw_bytes_used" field renamed to "total_bytes_raw_used"
-  - "total_bytes_used" field added to represent the space (accumulated over
-     all OSDs) allocated purely for data objects kept at block(slow) device
-  
-* ``ceph df [detail]`` output (GLOBAL section) has been modified in plain
-  format:
-
-  - new 'USED' column shows the space (accumulated over all OSDs) allocated
-    purely for data objects kept at block(slow) device.
-  - 'RAW USED' is now a sum of 'USED' space and space allocated/reserved at
-     block device for Ceph purposes, e.g. BlueFS part for BlueStore.
-
-* ``ceph df [detail]`` output (GLOBAL section) has been modified in json
-  format:
-  
-  - 'total_used_bytes' column now shows the space (accumulated over all OSDs)
-    allocated purely for data objects kept at block(slow) device
-  - new 'total_used_raw_bytes' column shows a sum of 'USED' space and space
-    allocated/reserved at block device for Ceph purposes, e.g. BlueFS part for
-    BlueStore.
-
-* ``ceph df [detail]`` output (POOLS section) has been modified in plain
-  format:
-  
-  - 'BYTES USED' column renamed to 'STORED'. Represents amount of data
-    stored by the user.
-  - 'USED' column now represent amount of space allocated purely for data
-    by all OSD nodes in KB.
-  - 'QUOTA BYTES', 'QUOTA OBJECTS' aren't showed anymore in non-detailed mode.
-  - new column 'USED COMPR' - amount of space allocated for compressed
-    data. i.e., compressed data plus all the allocation, replication and erasure
-    coding overhead.
-  - new column 'UNDER COMPR' - amount of data passed through compression
-    (summed over all replicas) and beneficial enough to be stored in a
-    compressed form.
-  - Some columns reordering
-
-* ``ceph df [detail]`` output (POOLS section) has been modified in json
-  format:
-  
-  - 'bytes used' column renamed to 'stored'. Represents amount of data
-    stored by the user.
-  - 'raw bytes used' column renamed to "stored_raw". Totals of user data
-     over all OSD excluding degraded.
-  - new 'bytes_used' column now represent amount of space allocated by 
-    all OSD nodes.
-  - 'kb_used' column - the same as 'bytes_used' but in KB.
-  - new column 'compress_bytes_used' - amount of space allocated for compressed
-    data. i.e., compressed data plus all the allocation, replication and erasure
-    coding overhead.
-  - new column 'compress_under_bytes' amount of data passed through compression
-    (summed over all replicas) and beneficial enough to be stored in a
-    compressed form.
-
-* ``rados df [detail]`` output (POOLS section) has been modified in plain
-  format:
-  
-  - 'USED' column now shows the space (accumulated over all OSDs) allocated
-    purely for data objects kept at block(slow) device.
-  - new column 'USED COMPR' - amount of space allocated for compressed
-    data. i.e., compressed data plus all the allocation, replication and erasure
-    coding overhead.
-  - new column 'UNDER COMPR' - amount of data passed through compression
-    (summed over all replicas) and beneficial enough to be stored in a
-    compressed form.
-
-* ``rados df [detail]`` output (POOLS section) has been modified in json
-  format:
-  
-  - 'size_bytes' and 'size_kb' columns now show the space (accumulated
-    over all OSDs) allocated purely for data objects kept at block
-    device.
-  - new column 'compress_bytes_used' - amount of space allocated for compressed
-    data. i.e., compressed data plus all the allocation, replication and erasure
-    coding overhead.
-  - new column 'compress_under_bytes' amount of data passed through compression
-    (summed over all replicas) and beneficial enough to be stored in a
-    compressed form.
-
-* ``ceph pg dump`` output (totals section) has been modified in json
-  format:
-  
-  - new 'USED' column shows the space (accumulated over all OSDs) allocated
-    purely for data objects kept at block(slow) device.
-  - 'USED_RAW' is now a sum of 'USED' space and space allocated/reserved at
-    block device for Ceph purposes, e.g. BlueFS part for BlueStore.
-
-* The ``ceph osd rm`` command has been deprecated.  Users should use
-  ``ceph osd destroy`` or ``ceph osd purge`` (but after first confirming it is
-  safe to do so via the ``ceph osd safe-to-destroy`` command).
-
-* The MDS now supports dropping its cache for the purposes of benchmarking.::
-
-    ceph tell mds.* cache drop <timeout>
-
-  Note that the MDS cache is cooperatively managed by the clients. It is
-  necessary for clients to give up capabilities in order for the MDS to fully
-  drop its cache. This is accomplished by asking all clients to trim as many
-  caps as possible. The timeout argument to the ``cache drop`` command controls
-  how long the MDS waits for clients to complete trimming caps. This is optional
-  and is 0 by default (no timeout). Keep in mind that clients may still retain
-  caps to open files which will prevent the metadata for those files from being
-  dropped by both the client and the MDS. (This is an equivalent scenario to
-  dropping the Linux page/buffer/inode/dentry caches with some processes pinning
-  some inodes/dentries/pages in cache.)
-
-* The ``mon_health_preluminous_compat`` and
-  ``mon_health_preluminous_compat_warning`` config options are
-  removed, as the related functionality is more than two versions old.
-  Any legacy monitoring system expecting Jewel-style health output
-  will need to be updated to work with Nautilus.
-
-* Nautilus is not supported on any distros still running upstart so upstart
-  specific files and references have been removed.
-
-* The ``ceph pg <pgid> list_missing`` command has been renamed to
-  ``ceph pg <pgid> list_unfound`` to better match its behaviour.
-
-* The *rbd-mirror* daemon can now retrieve remote peer cluster configuration
-  secrets from the monitor. To use this feature, the rbd-mirror daemon
-  CephX user for the local cluster must use the ``profile rbd-mirror`` mon cap.
-  The secrets can be set using the ``rbd mirror pool peer add`` and
-  ``rbd mirror pool peer set`` actions.
-
-* The 'rbd-mirror' daemon will now run in active/active mode by default, where
-  mirrored images are evenly distributed between all active 'rbd-mirror'
-  daemons. To revert to active/passive mode, override the
-  'rbd_mirror_image_policy_type' config key to 'none'.
-
-* The ``ceph mds deactivate`` is fully obsolete and references to it in the docs
-  have been removed or clarified.
-
-* The libcephfs bindings added the ``ceph_select_filesystem`` function
-  for use with multiple filesystems.
-
-* The cephfs python bindings now include ``mount_root`` and ``filesystem_name``
-  options in the mount() function.
-
-* erasure-code: add experimental *Coupled LAYer (CLAY)* erasure codes
-  support. It features less network traffic and disk I/O when performing
-  recovery.
-
-* The ``cache drop`` OSD command has been added to drop an OSD's caches:
-
-    - ``ceph tell osd.x cache drop``
-
-* The ``cache status`` OSD command has been added to get the cache stats of an
-  OSD:
-
-    - ``ceph tell osd.x cache status``
-
-* The libcephfs added several functions that allow restarted client to destroy
-  or reclaim state held by a previous incarnation. These functions are for NFS
-  servers.
-
-* The ``ceph`` command line tool now accepts keyword arguments in
-  the format ``--arg=value`` or ``--arg value``.
-
-* ``librados::IoCtx::nobjects_begin()`` and
-  ``librados::NObjectIterator`` now communicate errors by throwing a
-  ``std::system_error`` exception instead of ``std::runtime_error``.
-
-* The callback function passed to ``LibRGWFS.readdir()`` now accepts a ``flags``
-  parameter. it will be the last parameter passed to  ``readdir()`` method.
-
-* The ``cephfs-data-scan scan_links`` now automatically repair inotables and
-  snaptable.
-
-* Configuration values ``mon_warn_not_scrubbed`` and
-  ``mon_warn_not_deep_scrubbed`` have been renamed.  They are now
-  ``mon_warn_pg_not_scrubbed_ratio`` and ``mon_warn_pg_not_deep_scrubbed_ratio``
-  respectively.  This is to clarify that these warnings are related to
-  pg scrubbing and are a ratio of the related interval.  These options
-  are now enabled by default.
-
-* The MDS cache trimming is now throttled. Dropping the MDS cache
-  via the ``ceph tell mds.<foo> cache drop`` command or large reductions in the
-  cache size will no longer cause service unavailability.
-
-* The CephFS MDS behavior with recalling caps has been significantly improved
-  to not attempt recalling too many caps at once, leading to instability.
-  MDS with a large cache (64GB+) should be more stable.
-
-* MDS now provides a config option ``mds_max_caps_per_client`` (default: 1M) to
-  limit the number of caps a client session may hold. Long running client
-  sessions with a large number of caps have been a source of instability in the
-  MDS when all of these caps need to be processed during certain session
-  events. It is recommended to not unnecessarily increase this value.
-
-* The MDS config ``mds_recall_state_timeout`` has been removed. Late
-  client recall warnings are now generated based on the number of caps
-  the MDS has recalled which have not been released. The new configs
-  ``mds_recall_warning_threshold`` (default: 32K) and
-  ``mds_recall_warning_decay_rate`` (default: 60s) sets the threshold
-  for this warning.
-
-* The Telegraf module for the Manager allows for sending statistics to
-  an Telegraf Agent over TCP, UDP or a UNIX Socket. Telegraf can then
-  send the statistics to databases like InfluxDB, ElasticSearch, Graphite
-  and many more.
-
-* The graylog fields naming the originator of a log event have
-  changed: the string-form name is now included (e.g., ``"name":
-  "mgr.foo"``), and the rank-form name is now in a nested section
-  (e.g., ``"rank": {"type": "mgr", "num": 43243}``).
-
-* If the cluster log is directed at syslog, the entries are now
-  prefixed by both the string-form name and the rank-form name (e.g.,
-  ``mgr.x mgr.12345 ...`` instead of just ``mgr.12345 ...``).
-
-* The JSON output of the ``ceph osd find`` command has replaced the ``ip``
-  field with an ``addrs`` section to reflect that OSDs may bind to
-  multiple addresses.
-
-* CephFS clients without the 's' flag in their authentication capability
-  string will no longer be able to create/delete snapshots. To allow
-  ``client.foo`` to create/delete snapshots in the ``bar`` directory of
-  filesystem ``cephfs_a``, use command:
-
-    - ``ceph auth caps client.foo mon 'allow r' osd 'allow rw tag cephfs data=cephfs_a' mds 'allow rw, allow rws path=/bar'``
-
-* The ``osd_heartbeat_addr`` option has been removed as it served no
-  (good) purpose: the OSD should always check heartbeats on both the
-  public and cluster networks.
-
-* The ``rados`` tool's ``mkpool`` and ``rmpool`` commands have been
-  removed because they are redundant; please use the ``ceph osd pool
-  create`` and ``ceph osd pool rm`` commands instead.
-
-* The ``auid`` property for cephx users and RADOS pools has been
-  removed.  This was an undocumented and partially implemented
-  capability that allowed cephx users to map capabilities to RADOS
-  pools that they "owned".  Because there are no users we have removed
-  this support.  If any cephx capabilities exist in the cluster that
-  restrict based on auid then they will no longer parse, and the
-  cluster will report a health warning like::
-
-    AUTH_BAD_CAPS 1 auth entities have invalid capabilities
-        client.bad osd capability parse failed, stopped at 'allow rwx auid 123' of 'allow rwx auid 123'
-
-  The capability can be adjusted with the ``ceph auth caps``
-  command. For example,::
-
-    ceph auth caps client.bad osd 'allow rwx pool foo'
-
-* The ``ceph-kvstore-tool`` ``repair`` command has been renamed
-  ``destructive-repair`` since we have discovered it can corrupt an
-  otherwise healthy rocksdb database.  It should be used only as a last-ditch
-  attempt to recover data from an otherwise corrupted store.
-
-
-* The default memory utilization for the mons has been increased
-  somewhat.  Rocksdb now uses 512 MB of RAM by default, which should
-  be sufficient for small to medium-sized clusters; large clusters
-  should tune this up.  Also, the ``mon_osd_cache_size`` has been
-  increase from 10 OSDMaps to 500, which will translate to an
-  additional 500 MB to 1 GB of RAM for large clusters, and much less
-  for small clusters.
-
-* The ``mgr/balancer/max_misplaced`` option has been replaced by a new
-  global ``target_max_misplaced_ratio`` option that throttles both
-  balancer activity and automated adjustments to ``pgp_num`` (normally as a
-  result of ``pg_num`` changes).  If you have customized the balancer module
-  option, you will need to adjust your config to set the new global option
-  or revert to the default of .05 (5%).
-
-* By default, Ceph no longer issues a health warning when there are
-  misplaced objects (objects that are fully replicated but not stored
-  on the intended OSDs).  You can reenable the old warning by setting
-  ``mon_warn_on_misplaced`` to ``true``.
-
-* The ``ceph-create-keys`` tool is now obsolete.  The monitors
-  automatically create these keys on their own.  For now the script
-  prints a warning message and exits, but it will be removed in the
-  next release.  Note that ``ceph-create-keys`` would also write the
-  admin and bootstrap keys to /etc/ceph and /var/lib/ceph, but this
-  script no longer does that.  Any deployment tools that relied on
-  this behavior should instead make use of the ``ceph auth export
-  <entity-name>`` command for whichever key(s) they need.
-
-* The ``mon_osd_pool_ec_fast_read`` option has been renamed
-  ``osd_pool_default_ec_fast_read`` to be more consistent with other
-  ``osd_pool_default_*`` options that affect default values for newly
-  created RADOS pools.
-
-* The ``mon addr`` configuration option is now deprecated.  It can
-  still be used to specify an address for each monitor in the
-  ``ceph.conf`` file, but it only affects cluster creation and
-  bootstrapping, and it does not support listing multiple addresses
-  (e.g., both a v2 and v1 protocol address).  We strongly recommend
-  the option be removed and instead a single ``mon host`` option be
-  specified in the ``[global]`` section to allow daemons and clients
-  to discover the monitors.
-
-* New command ``ceph fs fail`` has been added to quickly bring down a file
-  system. This is a single command that unsets the joinable flag on the file
-  system and brings down all of its ranks.
-
-* The ``cache drop`` admin socket command has been removed. The ``ceph
-  tell mds.X cache drop`` remains.
-
-
-Detailed Changelog
-------------------
-* add monitoring subdir and Grafana cluster dashboard (`pr#21850 <https://github.com/ceph/ceph/pull/21850>`_, Jan Fajerski)
-* auth,common: include cleanups (`pr#23774 <https://github.com/ceph/ceph/pull/23774>`_, Kefu Chai)
-* bluestore: bluestore/NVMEDevice.cc: fix ceph_assert() when enable SPDK with 64KB kernel page size (`issue#36624 <http://tracker.ceph.com/issues/36624>`_, `pr#24817 <https://github.com/ceph/ceph/pull/24817>`_, tone.zhang)
-* bluestore: bluestore/NVMEDevice.cc: fix NVMEManager thread hang (`issue#37720 <http://tracker.ceph.com/issues/37720>`_, `pr#25646 <https://github.com/ceph/ceph/pull/25646>`_, tone.zhang, Steve Capper)
-* bluestore: bluestore/NVMe: use PCIe selector as the path name (`pr#24144 <https://github.com/ceph/ceph/pull/24144>`_, Kefu Chai)
-* bluestore,cephfs,core,rbd,rgw: buffer,denc: use ptr::const_iterator for decode (`pr#22015 <https://github.com/ceph/ceph/pull/22015>`_, Kefu Chai, Casey Bodley)
-* bluestore: ceph-kvstore-tool: dump fixes (`pr#25262 <https://github.com/ceph/ceph/pull/25262>`_, Adam Kupczyk)
-* bluestore: common/blkdev: check retval of stat() (`pr#26040 <https://github.com/ceph/ceph/pull/26040>`_, Kefu Chai)
-* bluestore,core: ceph-dencoder: add bluefs types (`pr#22463 <https://github.com/ceph/ceph/pull/22463>`_, Sage Weil)
-* bluestore,core,mon,performance: osd,mon: enable level_compaction_dynamic_level_bytes for rocksdb (`issue#24361 <http://tracker.ceph.com/issues/24361>`_, `pr#22337 <https://github.com/ceph/ceph/pull/22337>`_, Kefu Chai)
-* bluestore,core: os/bluestore: don't store/use path_block.{db,wal} from meta (`pr#22462 <https://github.com/ceph/ceph/pull/22462>`_, Sage Weil, Alfredo Deza)
-* bluestore: os/bluestore: add bluestore_ignore_data_csum option (`pr#26233 <https://github.com/ceph/ceph/pull/26233>`_, Sage Weil)
-* bluestore: os/bluestore: add boundary check for cache-autotune related settings (`issue#37507 <http://tracker.ceph.com/issues/37507>`_, `pr#25421 <https://github.com/ceph/ceph/pull/25421>`_, xie xingguo)
-* bluestore: os/bluestore/BlueFS: only flush dirty devices when do _fsync (`pr#22110 <https://github.com/ceph/ceph/pull/22110>`_, Jianpeng Ma)
-* bluestore: os/bluestore: bluestore_buffer_hit_bytes perf counter doesn't reset (`pr#23576 <https://github.com/ceph/ceph/pull/23576>`_, Igor Fedotov)
-* bluestore: os/bluestore: check return value of _open_bluefs (`pr#25471 <https://github.com/ceph/ceph/pull/25471>`_, Jianpeng Ma)
-* bluestore: os/bluestore: cleanups (`pr#22556 <https://github.com/ceph/ceph/pull/22556>`_, Jianpeng Ma)
-* bluestore: os/bluestore: deep fsck fails on inspecting very large onodes (`pr#26170 <https://github.com/ceph/ceph/pull/26170>`_, Igor Fedotov)
-* bluestore: os/bluestore: do not assert on non-zero err codes from  compress() call (`pr#25891 <https://github.com/ceph/ceph/pull/25891>`_, Igor Fedotov)
-* bluestore: os/bluestore: firstly delete db then delete bluefs if open db met error (`pr#22336 <https://github.com/ceph/ceph/pull/22336>`_, Jianpeng Ma)
-* bluestore: os/bluestore: fix and unify log output on allocation failure (`pr#25335 <https://github.com/ceph/ceph/pull/25335>`_, Igor Fedotov)
-* bluestore: os/bluestore: fix assertion in StupidAllocator::get_fragmentation (`pr#23606 <https://github.com/ceph/ceph/pull/23606>`_, Igor Fedotov)
-* bluestore: os/bluestore: fix bloom filter num entry miscalculation in repairer (`issue#25001 <http://tracker.ceph.com/issues/25001>`_, `pr#24076 <https://github.com/ceph/ceph/pull/24076>`_, Igor Fedotov)
-* bluestore: os/bluestore: fix bluefs extent miscalculations on small slow device (`pr#22563 <https://github.com/ceph/ceph/pull/22563>`_, Igor Fedotov)
-* bluestore: os/bluestore: fix race between remove_collection and object removals (`pr#23257 <https://github.com/ceph/ceph/pull/23257>`_, Igor Fedotov)
-* bluestore: os/bluestore: fixup access a destroy cond cause deadlock or undefine behavior (`pr#25659 <https://github.com/ceph/ceph/pull/25659>`_, linbing)
-* bluestore: os/bluestore: introduce new BlueFS perf counter to track the amount of (`pr#22086 <https://github.com/ceph/ceph/pull/22086>`_, Igor Fedotov)
-* bluestore: os/bluestore/KernelDevice: misc cleanup (`pr#21491 <https://github.com/ceph/ceph/pull/21491>`_, Jianpeng Ma)
-* bluestore: os/bluestore/KernelDevice: use flock(2) for block device lock (`issue#38150 <http://tracker.ceph.com/issues/38150>`_, `pr#26245 <https://github.com/ceph/ceph/pull/26245>`_, Sage Weil)
-* bluestore: os/bluestore: misc cleanup (`pr#22472 <https://github.com/ceph/ceph/pull/22472>`_, Jianpeng Ma)
-* bluestore: os/bluestore: Only use F_SET_FILE_RW_HINT when available (`pr#26431 <https://github.com/ceph/ceph/pull/26431>`_, Willem Jan Withagen)
-* bluestore: os/bluestore: Only use ``WRITE_LIFE_`` when available (`pr#25735 <https://github.com/ceph/ceph/pull/25735>`_, Willem Jan Withagen)
-* bluestore: os/bluestore: remove redundant fault_range (`pr#22898 <https://github.com/ceph/ceph/pull/22898>`_, Jianpeng Ma)
-* bluestore: os/bluestore: remove useless condtion (`pr#22335 <https://github.com/ceph/ceph/pull/22335>`_, Jianpeng Ma)
-* bluestore: os/bluestore: simplify and fix SharedBlob::put() (`issue#24211 <http://tracker.ceph.com/issues/24211>`_, `pr#22123 <https://github.com/ceph/ceph/pull/22123>`_, Sage Weil)
-* bluestore: os/bluestore: support for FreeBSD (`pr#25608 <https://github.com/ceph/ceph/pull/25608>`_, Alan Somers, Kefu Chai)
-* bluestore: osd/osd_types: fix pg_t::contains() to check pool id too (`issue#32731 <http://tracker.ceph.com/issues/32731>`_, `pr#24085 <https://github.com/ceph/ceph/pull/24085>`_, Sage Weil)
-* bluestore: os/objectstore: add a new op OP_CREATE (`pr#22385 <https://github.com/ceph/ceph/pull/22385>`_, Jianpeng Ma)
-* bluestore,performance: common/PriorityCache: First Step toward priority based caching (`pr#22009 <https://github.com/ceph/ceph/pull/22009>`_, Mark Nelson)
-* bluestore,performance: os/bluestore: allocator pruning (`pr#21854 <https://github.com/ceph/ceph/pull/21854>`_, Igor Fedotov)
-* bluestore,performance: os/bluestore/BlueFS: reduce bufferlist rebuilds during WAL writes (`pr#21689 <https://github.com/ceph/ceph/pull/21689>`_, Piotr Dałek)
-* bluestore,performance: os/bluestore: use the monotonic clock for perf counters latencies (`pr#22121 <https://github.com/ceph/ceph/pull/22121>`_, Mohamad Gebai)
-* bluestore: silence Clang warning on possible uninitialize usuage (`pr#25702 <https://github.com/ceph/ceph/pull/25702>`_, Willem Jan Withagen)
-* bluestore: spdk: fix ceph-osd crash when activate SPDK (`issue#24371 <http://tracker.ceph.com/issues/24371>`_, `pr#22356 <https://github.com/ceph/ceph/pull/22356>`_, tone-zhang)
-* bluestore: test/fio: add option single_pool_mode in ceph-bluestore.fio (`pr#21929 <https://github.com/ceph/ceph/pull/21929>`_, Jianpeng Ma)
-* bluestore,tests: test/objectstore: fix random generator in allocator_bench (`pr#22544 <https://github.com/ceph/ceph/pull/22544>`_, Igor Fedotov)
-* bluestore,tools: os/bluestore: allow ceph-bluestore-tool to coalesce, add and migrate BlueFS backing volumes (`pr#23103 <https://github.com/ceph/ceph/pull/23103>`_, Igor Fedotov)
-* bluestore,tools: tools/ceph-bluestore-tool: avoid mon/config access when calling global… (`pr#22085 <https://github.com/ceph/ceph/pull/22085>`_, Igor Fedotov)
-* build/ops: Add new OpenSUSE Leap id for install-deps.sh (`issue#25064 <http://tracker.ceph.com/issues/25064>`_, `pr#22793 <https://github.com/ceph/ceph/pull/22793>`_, Kyr Shatskyy)
-* build/ops: arch/arm: Allow ceph_crc32c_aarch64 to be chosen only if it is compil… (`pr#24126 <https://github.com/ceph/ceph/pull/24126>`_, David Wang)
-* build/ops:  auth: do not use GSS/KRB5 if ! HAVE_GSSAPI (`pr#25460 <https://github.com/ceph/ceph/pull/25460>`_, Kefu Chai)
-* build/ops: build: 32 bit architecture fixes (`pr#23485 <https://github.com/ceph/ceph/pull/23485>`_, James Page)
-* build/ops: build: further removal of `subman` configuration (`issue#38261 <http://tracker.ceph.com/issues/38261>`_, `pr#26368 <https://github.com/ceph/ceph/pull/26368>`_, Alfredo Deza)
-* build/ops: build: LLVM ld does not like the versioning scheme (`pr#26801 <https://github.com/ceph/ceph/pull/26801>`_, Willem Jan Withagen)
-* build/ops: ceph-create-keys: Misc Python 3 fixes (`issue#37641 <http://tracker.ceph.com/issues/37641>`_, `pr#25411 <https://github.com/ceph/ceph/pull/25411>`_, James Page)
-* build/ops,cephfs: deb,rpm: fix python-cephfs dependencies (`issue#24919 <http://tracker.ceph.com/issues/24919>`_, `issue#24918 <http://tracker.ceph.com/issues/24918>`_, `pr#23043 <https://github.com/ceph/ceph/pull/23043>`_, Kefu Chai)
-* build/ops: ceph.in: Add support for python 3 (`pr#24739 <https://github.com/ceph/ceph/pull/24739>`_, Tiago Melo)
-* build/ops: ceph.spec.in: Don't use noarch for mgr module subpackages, fix /usr/lib64/ceph/mgr dir ownership (`pr#26398 <https://github.com/ceph/ceph/pull/26398>`_, Tim Serong)
-* build/ops: change ceph-mgr package depency from py-bcrypt to python2-bcrypt (`issue#27206 <http://tracker.ceph.com/issues/27206>`_, `pr#23648 <https://github.com/ceph/ceph/pull/23648>`_, Konstantin Sakhinov)
-* build/ops: civetweb: pull up to ceph-master (`pr#26515 <https://github.com/ceph/ceph/pull/26515>`_, Abhishek Lekshmanan)
-* build/ops: cmake,do_freebsd.sh: disable rdma features (`pr#22752 <https://github.com/ceph/ceph/pull/22752>`_, Kefu Chai)
-* build/ops: cmake/modules/BuildDPDK.cmake: Build required DPDK libraries (`issue#36341 <http://tracker.ceph.com/issues/36341>`_, `pr#24487 <https://github.com/ceph/ceph/pull/24487>`_, Brad Hubbard)
-* build/ops: cmake/modules/BuildRocksDB.cmake: enable compressions for rocksdb (`issue#24025 <http://tracker.ceph.com/issues/24025>`_, `pr#22181 <https://github.com/ceph/ceph/pull/22181>`_, Kefu Chai)
-* build/ops: cmake,rgw: make amqp support optional (`pr#26555 <https://github.com/ceph/ceph/pull/26555>`_, Kefu Chai)
-* build/ops: cmake,rpm,deb: install mgr plugins into /usr/share/ceph/mgr (`pr#26446 <https://github.com/ceph/ceph/pull/26446>`_, Kefu Chai)
-* build/ops: cmake,seastar: pick up latest seastar (`pr#25474 <https://github.com/ceph/ceph/pull/25474>`_, Kefu Chai)
-* build/ops,common: compressor: Fix build of Brotli Compressor (`pr#24967 <https://github.com/ceph/ceph/pull/24967>`_, BI SHUN KE)
-* build/ops,common,core: test: make readable.sh fail if it doesn't run anything (`pr#24812 <https://github.com/ceph/ceph/pull/24812>`_, Greg Farnum)
-* build/ops,core: cmake,common,filestore: silence gcc-8 warnings/errors (`pr#21837 <https://github.com/ceph/ceph/pull/21837>`_, Kefu Chai)
-* build/ops,core,rbd: include/memory.h: remove memory.h (`pr#22690 <https://github.com/ceph/ceph/pull/22690>`_, Kefu Chai)
-* build/ops,core: systemd: only restart 3 times in 30 minutes, as fast as possible (`issue#24368 <http://tracker.ceph.com/issues/24368>`_, `pr#22349 <https://github.com/ceph/ceph/pull/22349>`_, Greg Farnum)
-* build/ops,core,tests: objectstore/test/fio: Fixed fio compilation when tcmalloc is used (`pr#23962 <https://github.com/ceph/ceph/pull/23962>`_, Adam Kupczyk)
-* build/ops: credits.sh: Ignore package-lock.json and .xlf files (`pr#24762 <https://github.com/ceph/ceph/pull/24762>`_, Tiago Melo)
-* build/ops: deb: drop redundant ceph-common recommends (`pr#20133 <https://github.com/ceph/ceph/pull/20133>`_, Nathan Cutler)
-* build/ops: debian/control: change Architecture python plugins to "all" (`pr#26377 <https://github.com/ceph/ceph/pull/26377>`_, Kefu Chai)
-* build/ops: debian/control: require fuse for ceph-fuse (`issue#21057 <http://tracker.ceph.com/issues/21057>`_, `pr#23675 <https://github.com/ceph/ceph/pull/23675>`_, Thomas Serlin)
-* build/ops: debian: correct ceph-common relationship with older radosgw package (`pr#24996 <https://github.com/ceph/ceph/pull/24996>`_, Matthew Vernon)
-* build/ops: debian: drop '-DUSE_CRYPTOPP=OFF' from cmake options (`pr#22471 <https://github.com/ceph/ceph/pull/22471>`_, Kefu Chai)
-* build/ops: debian: librados-dev should replace librados2-dev (`pr#25916 <https://github.com/ceph/ceph/pull/25916>`_, Kefu Chai)
-* build/ops: debian/rules: fix ceph-mgr .pyc files left behind (`issue#26883 <http://tracker.ceph.com/issues/26883>`_, `pr#23615 <https://github.com/ceph/ceph/pull/23615>`_, Dan Mick)
-* build/ops: deb,rpm,do_cmake: switch to cmake3 (`pr#22896 <https://github.com/ceph/ceph/pull/22896>`_, Kefu Chai)
-* build/ops: dmclock, cmake: sync up with ceph/dmclock, dmclock related cleanups (`issue#26998 <http://tracker.ceph.com/issues/26998>`_, `pr#23643 <https://github.com/ceph/ceph/pull/23643>`_, Kefu Chai)
-* build/ops: dmclock: update dmclock submodule sha1 to tip of ceph/dmclock.git master (`pr#23837 <https://github.com/ceph/ceph/pull/23837>`_, Ricardo Dias)
-* build/ops: do_cmake.sh: automate py3 build options for certain distros (`pr#25205 <https://github.com/ceph/ceph/pull/25205>`_, Nathan Cutler)
-* build/ops: do_cmake.sh: SUSE builds need WITH_RADOSGW_AMQP_ENDPOINT=OFF (`pr#26695 <https://github.com/ceph/ceph/pull/26695>`_, Nathan Cutler)
-* build/ops: do_freebsd.sh: FreeBSD building needs the llvm linker (`pr#25247 <https://github.com/ceph/ceph/pull/25247>`_, Willem Jan Withagen)
-* build/ops: dout: declare dpp using `decltype(auto)` instead of `auto` (`pr#22207 <https://github.com/ceph/ceph/pull/22207>`_, Kefu Chai)
-* build/ops: dpdk: drop dpdk submodule (`issue#24032 <http://tracker.ceph.com/issues/24032>`_, `pr#21856 <https://github.com/ceph/ceph/pull/21856>`_, Kefu Chai)
-* build/ops: examples/Makefile: add -Wno-unused-parameter to avoid compile error (`pr#23581 <https://github.com/ceph/ceph/pull/23581>`_, You Ji)
-* build/ops: Improving make check reliability (`pr#22441 <https://github.com/ceph/ceph/pull/22441>`_, Erwan Velu)
-* build/ops: include: define errnos if not defined for better portablity (`pr#25302 <https://github.com/ceph/ceph/pull/25302>`_, Willem Jan Withagen)
-* build/ops: install-deps: check the exit status for the $builddepcmd (`pr#22682 <https://github.com/ceph/ceph/pull/22682>`_, Yunchuan Wen)
-* build/ops: install-deps: do not specify unknown options (`pr#24315 <https://github.com/ceph/ceph/pull/24315>`_, Kefu Chai)
-* build/ops: install-deps: install setuptools before upgrading virtualenv (`pr#25039 <https://github.com/ceph/ceph/pull/25039>`_, Kefu Chai)
-* build/ops: install-deps: nuke wheelhouse if it's stale (`pr#22028 <https://github.com/ceph/ceph/pull/22028>`_, Kefu Chai)
-* build/ops: install-deps,run-make-check: use ceph-libboost repo (`issue#25186 <http://tracker.ceph.com/issues/25186>`_, `pr#23995 <https://github.com/ceph/ceph/pull/23995>`_, Kefu Chai)
-* build/ops: install-deps.sh: Add Kerberos requirement for FreeBSD (`pr#25688 <https://github.com/ceph/ceph/pull/25688>`_, Willem Jan Withagen)
-* build/ops: install-deps.sh: disable centos-sclo-rh-source (`issue#37707 <http://tracker.ceph.com/issues/37707>`_, `pr#25629 <https://github.com/ceph/ceph/pull/25629>`_, Brad Hubbard)
-* build/ops: install-deps.sh: fix gcc detection and install pre-built libboost on bionic (`pr#25169 <https://github.com/ceph/ceph/pull/25169>`_, Changcheng Liu, Kefu Chai)
-* build/ops: install-deps.sh: fix installing gcc on ubuntu when no old compiler (`pr#22488 <https://github.com/ceph/ceph/pull/22488>`_, Tomasz Setkowski)
-* build/ops: install-deps.sh: import ubuntu-toolchain-r's key without keyserver (`pr#22964 <https://github.com/ceph/ceph/pull/22964>`_, Kefu Chai)
-* build/ops: install-deps.sh: install libtool-ltdl-devel for building python-saml (`pr#25071 <https://github.com/ceph/ceph/pull/25071>`_, Kefu Chai)
-* build/ops: install-deps.sh: refrain from installing/using lsb_release, and other cleanup (`issue#18163 <http://tracker.ceph.com/issues/18163>`_, `pr#23361 <https://github.com/ceph/ceph/pull/23361>`_, Nathan Cutler)
-* build/ops: install-deps.sh: Remove CR repo (`issue#13997 <http://tracker.ceph.com/issues/13997>`_, `pr#25211 <https://github.com/ceph/ceph/pull/25211>`_, Brad Hubbard, Alfredo Deza)
-* build/ops:  install-deps.sh: selectively install dependencies (`pr#26402 <https://github.com/ceph/ceph/pull/26402>`_, Kefu Chai)
-* build/ops: install-deps.sh: set with_seastar (`pr#23079 <https://github.com/ceph/ceph/pull/23079>`_, Nathan Cutler)
-* build/ops: install-deps.sh: support install gcc7 in xenial aarch64 (`pr#22451 <https://github.com/ceph/ceph/pull/22451>`_, Yunchuan Wen)
-* build/ops: install-deps.sh: Update python requirements for FreeBSD (`pr#25245 <https://github.com/ceph/ceph/pull/25245>`_, Willem Jan Withagen)
-* build/ops: install-deps.sh: use the latest setuptools (`pr#26156 <https://github.com/ceph/ceph/pull/26156>`_, Kefu Chai)
-* build/ops: install-deps: s/openldap-client/openldap24-client/ (`pr#23912 <https://github.com/ceph/ceph/pull/23912>`_, Kefu Chai)
-* build/ops: libradosstriper: conditional compile (`pr#21983 <https://github.com/ceph/ceph/pull/21983>`_, Jesse Williamson)
-* build/ops: make-debs.sh: clean dir to allow building deb packages multiple times (`pr#25177 <https://github.com/ceph/ceph/pull/25177>`_, Changcheng Liu)
-* build/ops: man: skip directive starting with ".." (`pr#23580 <https://github.com/ceph/ceph/pull/23580>`_, Kefu Chai)
-* build/ops,mgr: build: mgr: check for python's ssl version linkage (`issue#24282 <http://tracker.ceph.com/issues/24282>`_, `pr#22659 <https://github.com/ceph/ceph/pull/22659>`_, Kefu Chai, Abhishek Lekshmanan)
-* build/ops,mgr: cmake,deb,rpm: remove cython 0.29's subinterpreter check, re-enable build with cython 0.29+ (`pr#25585 <https://github.com/ceph/ceph/pull/25585>`_, Tim Serong)
-* build/ops: mgr/dashboard: Add html-linter (`pr#24273 <https://github.com/ceph/ceph/pull/24273>`_, Tiago Melo)
-* build/ops: mgr/dashboard: Add i18n validation script (`pr#25179 <https://github.com/ceph/ceph/pull/25179>`_, Tiago Melo)
-* build/ops: mgr/dashboard: Add package-lock.json (`pr#23285 <https://github.com/ceph/ceph/pull/23285>`_, Tiago Melo)
-* build/ops: mgr/dashboard: Disable showing xi18n's progress (`pr#25427 <https://github.com/ceph/ceph/pull/25427>`_, Tiago Melo)
-* build/ops: mgr/dashboard: Fix run-frontend-e2e-tests.sh (`pr#25157 <https://github.com/ceph/ceph/pull/25157>`_, Tiago Melo)
-* build/ops: mgr/dashboard: fix the version of all frontend dependencies (`pr#22712 <https://github.com/ceph/ceph/pull/22712>`_, Tiago Melo)
-* build/ops: mgr/dashboard: Remove angular build progress logs during cmake (`pr#23115 <https://github.com/ceph/ceph/pull/23115>`_, Tiago Melo)
-* build/ops: mgr/dashboard: Update Node.js to current LTS (`pr#24932 <https://github.com/ceph/ceph/pull/24932>`_, Tiago Melo)
-* build/ops: mgr/dashboard: Update node version (`pr#22639 <https://github.com/ceph/ceph/pull/22639>`_, Tiago Melo)
-* build/ops: mgr/diskprediction: Replace local predictor model file (`pr#24484 <https://github.com/ceph/ceph/pull/24484>`_, Rick Chen)
-* build/ops,mgr: mgr/dashboard: Fix building under FreeBSD (`pr#22562 <https://github.com/ceph/ceph/pull/22562>`_, Willem Jan Withagen)
-* build/ops: move dmclock subtree into submodule (`pr#21651 <https://github.com/ceph/ceph/pull/21651>`_, Danny Al-Gaaf)
-* build/ops,pybind: ceph: do not raise StopIteration within generator (`pr#25400 <https://github.com/ceph/ceph/pull/25400>`_, Jason Dillaman)
-* build/ops,rbd: osd,mon,pybind: Make able to compile with Clang (`pr#21861 <https://github.com/ceph/ceph/pull/21861>`_, Adam C. Emerson)
-* build/ops,rbd: selinux: add support for ceph iscsi (`pr#24936 <https://github.com/ceph/ceph/pull/24936>`_, Mike Christie)
-* build/ops,rbd: systemd: enable ceph-rbd-mirror.target (`pr#24935 <https://github.com/ceph/ceph/pull/24935>`_, Sébastien Han)
-* build/ops,rgw: build/rgw: unittest_rgw_dmclock_scheduler does not need Boost_LIBRARIES (`pr#26799 <https://github.com/ceph/ceph/pull/26799>`_, Willem Jan Withagen)
-* build/ops,rgw: cls: build cls_otp only WITH_RADOSGW (`pr#22548 <https://github.com/ceph/ceph/pull/22548>`_, Piotr Dałek)
-* build/ops,rgw: deb,rpm: package librgw_admin_user.{h,so.\*} (`pr#22205 <https://github.com/ceph/ceph/pull/22205>`_, Kefu Chai)
-* build/ops: rocksdb: sync with upstream (`issue#23653 <http://tracker.ceph.com/issues/23653>`_, `pr#22236 <https://github.com/ceph/ceph/pull/22236>`_, Kefu Chai)
-* build/ops: rpm: bump up required GCC version to 7.3.1 (`pr#24130 <https://github.com/ceph/ceph/pull/24130>`_, Kefu Chai)
-* build/ops: rpm,deb: remove python-jinja2 dependency (`pr#26379 <https://github.com/ceph/ceph/pull/26379>`_, Kefu Chai)
-* build/ops: rpm: do not exclude s390x build on openSUSE (`pr#26268 <https://github.com/ceph/ceph/pull/26268>`_, Nathan Cutler)
-* build/ops: rpm: Fix Fedora error "No matching package to install: 'Cython3'" (`issue#35831 <http://tracker.ceph.com/issues/35831>`_, `pr#23993 <https://github.com/ceph/ceph/pull/23993>`_, Brad Hubbard)
-* build/ops: rpm: fix libradospp-devel runtime dependency (`pr#25491 <https://github.com/ceph/ceph/pull/25491>`_, Nathan Cutler)
-* build/ops: rpm: fix seastar build dependencies for SUSE (`pr#23089 <https://github.com/ceph/ceph/pull/23089>`_, Nathan Cutler)
-* build/ops: rpm: fix seastar build dependencies (`pr#23386 <https://github.com/ceph/ceph/pull/23386>`_, Nathan Cutler)
-* build/ops: rpm: fix xmlsec1 build dependency for dashboard make check (`pr#26119 <https://github.com/ceph/ceph/pull/26119>`_, Nathan Cutler)
-* build/ops: rpm: Install python2-Cython on f28 (`pr#26756 <https://github.com/ceph/ceph/pull/26756>`_, Brad Hubbard)
-* build/ops: rpm: make ceph-grafana-dashboards own its directories (`issue#37485 <http://tracker.ceph.com/issues/37485>`_, `pr#25347 <https://github.com/ceph/ceph/pull/25347>`_, Nathan Cutler, Tim Serong)
-* build/ops: rpm: make Python dependencies somewhat less confusing (`pr#25963 <https://github.com/ceph/ceph/pull/25963>`_, Nathan Cutler)
-* build/ops: rpm: make sudo a build dependency (`pr#23077 <https://github.com/ceph/ceph/pull/23077>`_, Nathan Cutler)
-* build/ops: rpm: package crypto libraries for all archs (`pr#26202 <https://github.com/ceph/ceph/pull/26202>`_, Nathan Cutler)
-* build/ops: rpm: Package grafana dashboards (`pr#24735 <https://github.com/ceph/ceph/pull/24735>`_, Boris Ranto)
-* build/ops: rpm: provide files moved from ceph-test … (`issue#22558 <http://tracker.ceph.com/issues/22558>`_, `pr#20401 <https://github.com/ceph/ceph/pull/20401>`_, Nathan Cutler)
-* build/ops: rpm: RHEL 8 fixes (`pr#26520 <https://github.com/ceph/ceph/pull/26520>`_, Ken Dreyer)
-* build/ops: rpm: RHEL 8 needs Python 3 build (`pr#25223 <https://github.com/ceph/ceph/pull/25223>`_, Nathan Cutler)
-* build/ops: rpm: stop install-deps.sh clobbering spec file Python build setting (`issue#37301 <http://tracker.ceph.com/issues/37301>`_, `pr#25181 <https://github.com/ceph/ceph/pull/25181>`_, Nathan Cutler, Brad Hubbard)
-* build/ops: rpm: Use hardened LDFLAGS (`issue#36316 <http://tracker.ceph.com/issues/36316>`_, `pr#24425 <https://github.com/ceph/ceph/pull/24425>`_, Boris Ranto)
-* build/ops: rpm: use updated gperftools (`issue#35969 <http://tracker.ceph.com/issues/35969>`_, `pr#24124 <https://github.com/ceph/ceph/pull/24124>`_, Kefu Chai)
-* build/ops: rpm: Use updated gperftools-libs at runtime (`issue#36508 <http://tracker.ceph.com/issues/36508>`_, `pr#24652 <https://github.com/ceph/ceph/pull/24652>`_, Brad Hubbard)
-* build/ops: run-make-check: enable --with-seastar option (`pr#22809 <https://github.com/ceph/ceph/pull/22809>`_, Kefu Chai)
-* build/ops: run-make-check: set WITH_SEASTAR with a non-empty string (`pr#23108 <https://github.com/ceph/ceph/pull/23108>`_, Kefu Chai)
-* build/ops: run-make-check.sh: Adding ccache tuning for the CI (`pr#22847 <https://github.com/ceph/ceph/pull/22847>`_, Erwan Velu)
-* build/ops: run-make-check.sh: ccache goodness for everyone (`issue#24817 <http://tracker.ceph.com/issues/24817>`_, `issue#24777 <http://tracker.ceph.com/issues/24777>`_, `pr#22867 <https://github.com/ceph/ceph/pull/22867>`_, Nathan Cutler)
-* build/ops: run-make-check: should use sudo for running sysctl (`pr#23708 <https://github.com/ceph/ceph/pull/23708>`_, Kefu Chai)
-* build/ops: run-make-check: Showing configuration before the build (`pr#23609 <https://github.com/ceph/ceph/pull/23609>`_, Erwan Velu)
-* build/ops: seastar: lower the required yaml-cpp version to 0.5.1 (`pr#23255 <https://github.com/ceph/ceph/pull/23255>`_, Kefu Chai)
-* build/ops: seastar: pickup the change to link pthread (`pr#25671 <https://github.com/ceph/ceph/pull/25671>`_, Kefu Chai)
-* build/ops: selinux: Allow ceph to execute ldconfig (`pr#20118 <https://github.com/ceph/ceph/pull/20118>`_, Boris Ranto)
-* build/ops: spdk: update to latest spdk-18.05 branch (`pr#22547 <https://github.com/ceph/ceph/pull/22547>`_, Kefu Chai)
-* build/ops: spec: requires ceph base instead of common (`issue#37620 <http://tracker.ceph.com/issues/37620>`_, `pr#25503 <https://github.com/ceph/ceph/pull/25503>`_, Sébastien Han)
-* build/ops: test: move ceph-dencoder to src/tools (`pr#23228 <https://github.com/ceph/ceph/pull/23228>`_, Kefu Chai)
-* build/ops: test,qa: s/.libs/lib/ (`pr#20734 <https://github.com/ceph/ceph/pull/20734>`_, Kefu Chai)
-* build/ops,tests: cmake,run-make-check: always enable WITH_GTEST_PARALLEL (`pr#23382 <https://github.com/ceph/ceph/pull/23382>`_, Kefu Chai)
-* build/ops,tests: deb,rpm,qa: split dashboard package (`pr#26380 <https://github.com/ceph/ceph/pull/26380>`_, Kefu Chai)
-* build/ops,tests: mgr/dashboard: Fix localStorage problem in Jest (`pr#23281 <https://github.com/ceph/ceph/pull/23281>`_, Tiago Melo)
-* build/ops,tests: mgr/dashboard: Object Gateway user configuration (`pr#25494 <https://github.com/ceph/ceph/pull/25494>`_, Laura Paduano)
-* build/ops,tests: src/test: Using gtest-parallel to speedup unittests (`pr#22577 <https://github.com/ceph/ceph/pull/22577>`_, Kefu Chai, Erwan Velu)
-* build/ops,tests: tests/fio: fix build failures and ensure this is covered by run-make-check.sh (`pr#23231 <https://github.com/ceph/ceph/pull/23231>`_, Kefu Chai, Igor Fedotov)
-* build/ops,tests: tests/qa: Adding $ distro mix - rgw (`pr#21932 <https://github.com/ceph/ceph/pull/21932>`_, Yuri Weinstein)
-* build/ops,tests: tools/ceph-dencoder: conditionally link against mds (`pr#25255 <https://github.com/ceph/ceph/pull/25255>`_, Kefu Chai)
-* build/ops,tools: tool: link rbd-ggate against librados-cxx (`pr#24901 <https://github.com/ceph/ceph/pull/24901>`_, Willem Jan Withagen)
-* ceph-disk: get_partition_dev() should fail until get_dev_path(partnam… (`pr#21415 <https://github.com/ceph/ceph/pull/21415>`_, Erwan Velu)
-* cephfs: doc/releases: update CephFS mimic notes (`issue#23775 <http://tracker.ceph.com/issues/23775>`_, `pr#22232 <https://github.com/ceph/ceph/pull/22232>`_, Patrick Donnelly)
-* cephfs: mgr/dashboard: NFS Ganesha management REST API (`pr#25918 <https://github.com/ceph/ceph/pull/25918>`_, Lenz Grimmer, Ricardo Dias, Jeff Layton)
-* cephfs,mgr,pybind: pybind/mgr: Unified bits of volumes and orchestrator (`pr#25492 <https://github.com/ceph/ceph/pull/25492>`_, Sebastian Wagner)
-* cephfs,mon: MDSMonitor: silence unable to load metadata (`pr#25693 <https://github.com/ceph/ceph/pull/25693>`_, Song Shun)
-* cephfs,mon: mon/MDSMonitor: do not send redundant MDS health messages to cluster log (`issue#24308 <http://tracker.ceph.com/issues/24308>`_, `pr#22252 <https://github.com/ceph/ceph/pull/22252>`_, Sage Weil)
-* cephfs: qa: fix symlink (`pr#23997 <https://github.com/ceph/ceph/pull/23997>`_, Patrick Donnelly)
-* cephfs,rbd: osdc: Fix the wrong BufferHead offset (`pr#22495 <https://github.com/ceph/ceph/pull/22495>`_, dongdong tao)
-* cephfs,rbd: osdc: optimize the code doing the BufferHead mapping (`pr#22509 <https://github.com/ceph/ceph/pull/22509>`_, dongdong tao)
-* cephfs,rbd: osdc: reduce ObjectCacher's memory fragments (`issue#36192 <http://tracker.ceph.com/issues/36192>`_, `pr#24297 <https://github.com/ceph/ceph/pull/24297>`_, "Yan, Zheng")
-* cephfs,tests: qa: fix run call args (`issue#36450 <http://tracker.ceph.com/issues/36450>`_, `pr#24597 <https://github.com/ceph/ceph/pull/24597>`_, Patrick Donnelly)
-* cephfs,tests: qa: install python3-cephfs for fs suite (`pr#23411 <https://github.com/ceph/ceph/pull/23411>`_, Kefu Chai)
-* cephfs,tests: qa/suites/powercycle: whitelist MDS_SLOW_REQUEST (`pr#23151 <https://github.com/ceph/ceph/pull/23151>`_, Neha Ojha)
-* cephfs,tests: qa/workunits/suites/pjd.sh: use correct dir name (`pr#22233 <https://github.com/ceph/ceph/pull/22233>`_, Neha Ojha)
-* ceph-volume:  activate option --auto-detect-objectstore respects --no-systemd (`issue#36249 <http://tracker.ceph.com/issues/36249>`_, `pr#24355 <https://github.com/ceph/ceph/pull/24355>`_, Alfredo Deza)
-* ceph-volume: Adapt code to support Python3 (`pr#25324 <https://github.com/ceph/ceph/pull/25324>`_, Volker Theile)
-* ceph-volume: add --all flag to simple activate (`pr#26225 <https://github.com/ceph/ceph/pull/26225>`_, Jan Fajerski)
-* ceph-volume add a __release__ string, to help version-conditional calls (`issue#25171 <http://tracker.ceph.com/issues/25171>`_, `pr#23332 <https://github.com/ceph/ceph/pull/23332>`_, Alfredo Deza)
-* ceph-volume: add inventory command (`issue#24972 <http://tracker.ceph.com/issues/24972>`_, `pr#24859 <https://github.com/ceph/ceph/pull/24859>`_, Jan Fajerski)
-* ceph-volume: Additional work on ceph-volume to add some choose_disk capabilities (`issue#36446 <http://tracker.ceph.com/issues/36446>`_, `pr#24504 <https://github.com/ceph/ceph/pull/24504>`_, Erwan Velu)
-* ceph-volume add new ceph-handlers role from ceph-ansible (`issue#36251 <http://tracker.ceph.com/issues/36251>`_, `pr#24336 <https://github.com/ceph/ceph/pull/24336>`_, Alfredo Deza)
-* ceph-volume: adds a --prepare flag to `lvm batch` (`issue#36363 <http://tracker.ceph.com/issues/36363>`_, `pr#24587 <https://github.com/ceph/ceph/pull/24587>`_, Andrew Schoen)
-* ceph-volume: add space between words (`pr#26246 <https://github.com/ceph/ceph/pull/26246>`_, Sébastien Han)
-* ceph-volume: adds test for `ceph-volume lvm list /dev/sda` (`issue#24784 <http://tracker.ceph.com/issues/24784>`_, `issue#24957 <http://tracker.ceph.com/issues/24957>`_, `pr#23348 <https://github.com/ceph/ceph/pull/23348>`_, Andrew Schoen)
-* ceph-volume: Add unit test (`pr#25321 <https://github.com/ceph/ceph/pull/25321>`_, Volker Theile)
-* ceph-volume: allow to specify --cluster-fsid instead of reading from ceph.conf (`issue#26953 <http://tracker.ceph.com/issues/26953>`_, `pr#24407 <https://github.com/ceph/ceph/pull/24407>`_, Alfredo Deza)
-* ceph-volume: an OSD ID must be exist and be destroyed before reuse (`pr#23093 <https://github.com/ceph/ceph/pull/23093>`_, Andrew Schoen, Ron Allred)
-* ceph-volume  batch: allow journal+block.db sizing on the CLI (`issue#36088 <http://tracker.ceph.com/issues/36088>`_, `pr#24201 <https://github.com/ceph/ceph/pull/24201>`_, Alfredo Deza)
-* ceph-volume batch: allow --osds-per-device, default it to 1 (`issue#35913 <http://tracker.ceph.com/issues/35913>`_, `pr#24060 <https://github.com/ceph/ceph/pull/24060>`_, Alfredo Deza)
-* ceph-volume  batch carve out lvs for bluestore (`pr#24019 <https://github.com/ceph/ceph/pull/24019>`_, Alfredo Deza)
-* ceph-volume batch command (`issue#24492 <http://tracker.ceph.com/issues/24492>`_, `pr#23075 <https://github.com/ceph/ceph/pull/23075>`_, Alfredo Deza)
-* ceph-volume:  batch tests for mixed-type of devices (`issue#35535 <http://tracker.ceph.com/issues/35535>`_, `issue#27210 <http://tracker.ceph.com/issues/27210>`_, `pr#23963 <https://github.com/ceph/ceph/pull/23963>`_, Alfredo Deza)
-* ceph-volume custom cluster names fail on filestore trigger (`issue#27210 <http://tracker.ceph.com/issues/27210>`_, `pr#24251 <https://github.com/ceph/ceph/pull/24251>`_, Alfredo Deza)
-* ceph-volume: do not pin the testinfra version for the simple tests (`pr#23268 <https://github.com/ceph/ceph/pull/23268>`_, Andrew Schoen)
-* ceph-volume: do not send (lvm) stderr/stdout to the terminal, use the logfile (`issue#36492 <http://tracker.ceph.com/issues/36492>`_, `pr#24738 <https://github.com/ceph/ceph/pull/24738>`_, Alfredo Deza)
-* ceph-volume do not use stdin in luminous (`issue#25173 <http://tracker.ceph.com/issues/25173>`_, `pr#23355 <https://github.com/ceph/ceph/pull/23355>`_, Alfredo Deza)
-* ceph-volume: don't create osd['block.db'] by default (`issue#38472 <http://tracker.ceph.com/issues/38472>`_, `pr#26627 <https://github.com/ceph/ceph/pull/26627>`_, Jan Fajerski)
-* ceph-volume: earlier detection for --journal and --filestore flag requirements (`issue#24794 <http://tracker.ceph.com/issues/24794>`_, `pr#24150 <https://github.com/ceph/ceph/pull/24150>`_, Alfredo Deza)
-* ceph-volume: enable device discards (`issue#36532 <http://tracker.ceph.com/issues/36532>`_, `pr#24676 <https://github.com/ceph/ceph/pull/24676>`_, Jonas Jelten)
-* ceph-volume enable  --no-systemd flag for simple sub-command (`issue#36470 <http://tracker.ceph.com/issues/36470>`_, `pr#24998 <https://github.com/ceph/ceph/pull/24998>`_, Alfredo Deza)
-* ceph-volume: enable the ceph-osd during lvm activation (`issue#24152 <http://tracker.ceph.com/issues/24152>`_, `pr#23321 <https://github.com/ceph/ceph/pull/23321>`_, Dan van der Ster)
-* ceph-volume ensure encoded bytes are always used (`issue#24993 <http://tracker.ceph.com/issues/24993>`_, `pr#23289 <https://github.com/ceph/ceph/pull/23289>`_, Alfredo Deza)
-* ceph-volume: error on commands that need ceph.conf to operate (`issue#23941 <http://tracker.ceph.com/issues/23941>`_, `pr#22724 <https://github.com/ceph/ceph/pull/22724>`_, Andrew Schoen)
-* ceph-volume  expand auto engine for multiple devices on filestore (`issue#24553 <http://tracker.ceph.com/issues/24553>`_, `pr#23731 <https://github.com/ceph/ceph/pull/23731>`_, Andrew Schoen, Alfredo Deza)
-* ceph-volume:  expand auto engine for single type devices on filestore (`issue#24960 <http://tracker.ceph.com/issues/24960>`_, `pr#23532 <https://github.com/ceph/ceph/pull/23532>`_, Alfredo Deza)
-* ceph-volume expand on the LVM API to create multiple LVs at different sizes (`issue#24020 <http://tracker.ceph.com/issues/24020>`_, `pr#22426 <https://github.com/ceph/ceph/pull/22426>`_, Alfredo Deza)
-* ceph-volume: extract flake8 config (`pr#24674 <https://github.com/ceph/ceph/pull/24674>`_, Mehdi Abaakouk)
-* ceph-volume: fix Batch object in py3 environments (`pr#25203 <https://github.com/ceph/ceph/pull/25203>`_, Jan Fajerski)
-* ceph-volume: fix journal and filestore data size in `lvm batch --report` (`issue#36242 <http://tracker.ceph.com/issues/36242>`_, `pr#24274 <https://github.com/ceph/ceph/pull/24274>`_, Andrew Schoen)
-* ceph-volume: fix JSON output in `inventory` (`issue#37390 <http://tracker.ceph.com/issues/37390>`_, `pr#25224 <https://github.com/ceph/ceph/pull/25224>`_, Sebastian Wagner)
-* ceph-volume: Fix TypeError: join() takes exactly one argument (2 given) (`issue#37595 <http://tracker.ceph.com/issues/37595>`_, `pr#25469 <https://github.com/ceph/ceph/pull/25469>`_, Sebastian Wagner)
-* ceph-volume fix TypeError on dmcrypt when using Python3 (`pr#26034 <https://github.com/ceph/ceph/pull/26034>`_, Alfredo Deza)
-* ceph-volume  fix zap not working with LVs (`issue#35970 <http://tracker.ceph.com/issues/35970>`_, `pr#24077 <https://github.com/ceph/ceph/pull/24077>`_, Alfredo Deza)
-* ceph-volume: implement __format__ in Size to format sizes in py3 (`issue#38291 <http://tracker.ceph.com/issues/38291>`_, `pr#26401 <https://github.com/ceph/ceph/pull/26401>`_, Jan Fajerski)
-* ceph-volume initial take on auto sub-command (`pr#21803 <https://github.com/ceph/ceph/pull/21803>`_, Alfredo Deza)
-* ceph-volume: introduce class hierachy for strategies (`issue#37389 <http://tracker.ceph.com/issues/37389>`_, `pr#25238 <https://github.com/ceph/ceph/pull/25238>`_, Jan Fajerski)
-* ceph-volume:  lsblk can fail to find PARTLABEL, must fallback to blkid (`issue#36098 <http://tracker.ceph.com/issues/36098>`_, `pr#24330 <https://github.com/ceph/ceph/pull/24330>`_, Alfredo Deza)
-* ceph-volume lvm.activate conditional mon-config on prime-osd-dir (`issue#25216 <http://tracker.ceph.com/issues/25216>`_, `pr#23375 <https://github.com/ceph/ceph/pull/23375>`_, Alfredo Deza)
-* ceph-volume lvm.activate Do not search for a MON configuration (`pr#22393 <https://github.com/ceph/ceph/pull/22393>`_, Wido den Hollander)
-* ceph-volume: `lvm batch` allow extra flags (like dmcrypt) for bluestore (`issue#26862 <http://tracker.ceph.com/issues/26862>`_, `pr#23448 <https://github.com/ceph/ceph/pull/23448>`_, Alfredo Deza)
-* ceph-volume lvm.batch remove non-existent sys_api property (`issue#34310 <http://tracker.ceph.com/issues/34310>`_, `pr#23787 <https://github.com/ceph/ceph/pull/23787>`_, Alfredo Deza)
-* ceph-volume lvm.listing only include devices if they exist (`issue#24952 <http://tracker.ceph.com/issues/24952>`_, `pr#23129 <https://github.com/ceph/ceph/pull/23129>`_, Alfredo Deza)
-* ceph-volume lvm.prepare update help to indicate partitions are needed, not devices (`issue#24795 <http://tracker.ceph.com/issues/24795>`_, `pr#24394 <https://github.com/ceph/ceph/pull/24394>`_, Alfredo Deza)
-* ceph-volume: make Device hashable to allow set of Device list in py3 (`issue#38290 <http://tracker.ceph.com/issues/38290>`_, `pr#26399 <https://github.com/ceph/ceph/pull/26399>`_, Jan Fajerski)
-* ceph-volume: make `lvm batch` idempotent (`issue#26864 <http://tracker.ceph.com/issues/26864>`_, `pr#24404 <https://github.com/ceph/ceph/pull/24404>`_, Andrew Schoen)
-* ceph-volume: mark a device not available if it belongs to ceph-disk (`pr#26084 <https://github.com/ceph/ceph/pull/26084>`_, Andrew Schoen)
-* ceph-volume normalize comma to dot for string to int conversions (`issue#37442 <http://tracker.ceph.com/issues/37442>`_, `pr#25674 <https://github.com/ceph/ceph/pull/25674>`_, Alfredo Deza)
-* ceph-volume: patch Device when testing (`issue#36768 <http://tracker.ceph.com/issues/36768>`_, `pr#25063 <https://github.com/ceph/ceph/pull/25063>`_, Alfredo Deza)
-* ceph-volume process.call with stdin in Python 3 fix (`issue#24993 <http://tracker.ceph.com/issues/24993>`_, `pr#23141 <https://github.com/ceph/ceph/pull/23141>`_, Alfredo Deza)
-* ceph-volume: provide a nice errror message when missing ceph.conf (`pr#22828 <https://github.com/ceph/ceph/pull/22828>`_, Andrew Schoen)
-* ceph-volume: PVolumes.get() should return one PV when using name or uuid (`issue#24784 <http://tracker.ceph.com/issues/24784>`_, `pr#23234 <https://github.com/ceph/ceph/pull/23234>`_, Andrew Schoen)
-* ceph-volume: refuse to zap mapper devices (`issue#24504 <http://tracker.ceph.com/issues/24504>`_, `pr#22764 <https://github.com/ceph/ceph/pull/22764>`_, Andrew Schoen)
-* ceph-volume: reject devices that have existing GPT headers (`issue#27062 <http://tracker.ceph.com/issues/27062>`_, `pr#25098 <https://github.com/ceph/ceph/pull/25098>`_, Andrew Schoen)
-* ceph-volume: remove iteritems instances (`issue#38299 <http://tracker.ceph.com/issues/38299>`_, `pr#26403 <https://github.com/ceph/ceph/pull/26403>`_, Jan Fajerski)
-* ceph-volume: remove LVs when using zap --destroy (`pr#25093 <https://github.com/ceph/ceph/pull/25093>`_, Alfredo Deza)
-* ceph-volume remove version reporting from help menu (`issue#36386 <http://tracker.ceph.com/issues/36386>`_, `pr#24531 <https://github.com/ceph/ceph/pull/24531>`_, Alfredo Deza)
-* ceph-volume: rename Device property valid to available (`issue#36701 <http://tracker.ceph.com/issues/36701>`_, `pr#25007 <https://github.com/ceph/ceph/pull/25007>`_, Jan Fajerski)
-* ceph-volume: replace testinfra command with py.test (`issue#38568 <http://tracker.ceph.com/issues/38568>`_, `pr#26739 <https://github.com/ceph/ceph/pull/26739>`_, Alfredo Deza)
-* ceph-volume: Restore SELinux context (`pr#23278 <https://github.com/ceph/ceph/pull/23278>`_, Boris Ranto)
-* ceph-volume: revert partition as disk (`issue#37506 <http://tracker.ceph.com/issues/37506>`_, `pr#25390 <https://github.com/ceph/ceph/pull/25390>`_, Jan Fajerski)
-* ceph-volume: run tests without waiting on ceph repos (`pr#23697 <https://github.com/ceph/ceph/pull/23697>`_, Andrew Schoen)
-* ceph-volume: set number of osd ports in the tests (`pr#26753 <https://github.com/ceph/ceph/pull/26753>`_, Andrew Schoen)
-* ceph-volume: set permissions right before prime-osd-dir (`issue#37486 <http://tracker.ceph.com/issues/37486>`_, `pr#25477 <https://github.com/ceph/ceph/pull/25477>`_, Andrew Schoen, Alfredo Deza)
-* ceph-volume: `simple scan` will now scan all running ceph-disk OSDs (`pr#26826 <https://github.com/ceph/ceph/pull/26826>`_, Andrew Schoen)
-* ceph-volume: skip processing devices that don't exist when scanning system disks (`issue#36247 <http://tracker.ceph.com/issues/36247>`_, `pr#24372 <https://github.com/ceph/ceph/pull/24372>`_, Alfredo Deza)
-* ceph-volume: sort and align `lvm list` output (`pr#21812 <https://github.com/ceph/ceph/pull/21812>`_, Theofilos Mouratidis)
-* ceph-volume systemd import main so console_scripts work for executable (`issue#36648 <http://tracker.ceph.com/issues/36648>`_, `pr#24840 <https://github.com/ceph/ceph/pull/24840>`_, Alfredo Deza)
-* ceph-volume tests destroy osds on monitor hosts (`pr#22437 <https://github.com/ceph/ceph/pull/22437>`_, Alfredo Deza)
-* ceph-volume tests do not include admin keyring in OSD nodes (`issue#24417 <http://tracker.ceph.com/issues/24417>`_, `pr#22399 <https://github.com/ceph/ceph/pull/22399>`_, Alfredo Deza)
-* ceph-volume tests/functional add mgrs daemons to lvm tests (`issue#26879 <http://tracker.ceph.com/issues/26879>`_, `pr#23489 <https://github.com/ceph/ceph/pull/23489>`_, Alfredo Deza)
-* ceph-volume tests.functional add notario dep for ceph-ansible (`pr#22116 <https://github.com/ceph/ceph/pull/22116>`_, Alfredo Deza)
-* ceph-volume tests/functional declare ceph-ansible roles instead of importing them (`issue#37805 <http://tracker.ceph.com/issues/37805>`_, `pr#25820 <https://github.com/ceph/ceph/pull/25820>`_, Alfredo Deza)
-* ceph-volume tests.functional fix typo when stopping osd.0 in filestore (`issue#37675 <http://tracker.ceph.com/issues/37675>`_, `pr#25594 <https://github.com/ceph/ceph/pull/25594>`_, Alfredo Deza)
-* ceph-volume: tests.functional inherit SSH_ARGS from ansible (`issue#34311 <http://tracker.ceph.com/issues/34311>`_, `pr#23788 <https://github.com/ceph/ceph/pull/23788>`_, Alfredo Deza)
-* ceph-volume tests/functional run lvm list after OSD provisioning (`issue#24961 <http://tracker.ceph.com/issues/24961>`_, `pr#23116 <https://github.com/ceph/ceph/pull/23116>`_, Alfredo Deza)
-* ceph-volume tests/functional use Ansible 2.6 (`pr#23182 <https://github.com/ceph/ceph/pull/23182>`_, Alfredo Deza)
-* ceph-volume tests install ceph-ansible's requirements.txt dependencies (`issue#36672 <http://tracker.ceph.com/issues/36672>`_, `pr#24881 <https://github.com/ceph/ceph/pull/24881>`_, Alfredo Deza)
-* ceph-volume tests patch __release__ to mimic always for stdin keys (`pr#23398 <https://github.com/ceph/ceph/pull/23398>`_, Alfredo Deza)
-* ceph-volume tests.systemd update imports for systemd module (`issue#36704 <http://tracker.ceph.com/issues/36704>`_, `pr#24937 <https://github.com/ceph/ceph/pull/24937>`_, Alfredo Deza)
-* ceph-volume: test with multiple NVME drives (`issue#37409 <http://tracker.ceph.com/issues/37409>`_, `pr#25354 <https://github.com/ceph/ceph/pull/25354>`_, Andrew Schoen)
-* ceph-volume: unmount lvs correctly before zapping (`issue#24796 <http://tracker.ceph.com/issues/24796>`_, `pr#23117 <https://github.com/ceph/ceph/pull/23117>`_, Andrew Schoen)
-* ceph-volume: update testing playbook 'deploy.yml' (`pr#26397 <https://github.com/ceph/ceph/pull/26397>`_, Guillaume Abrioux)
-* ceph-volume: update version of ansible to 2.6.x for simple tests (`pr#23263 <https://github.com/ceph/ceph/pull/23263>`_, Andrew Schoen)
-* ceph-volume: use console_scripts (`issue#36601 <http://tracker.ceph.com/issues/36601>`_, `pr#24773 <https://github.com/ceph/ceph/pull/24773>`_, Mehdi Abaakouk)
-* ceph-volume: use our own testinfra suite for functional testing (`pr#26685 <https://github.com/ceph/ceph/pull/26685>`_, Andrew Schoen)
-* ceph-volume util.encryption don't push stderr to terminal (`issue#36246 <http://tracker.ceph.com/issues/36246>`_, `pr#24399 <https://github.com/ceph/ceph/pull/24399>`_, Alfredo Deza)
-* ceph-volume util.encryption robust blkid+lsblk detection of lockbox (`pr#24977 <https://github.com/ceph/ceph/pull/24977>`_, Alfredo Deza)
-* ceph-volume zap devices associated with an OSD ID and/or OSD FSID (`pr#25429 <https://github.com/ceph/ceph/pull/25429>`_, Alfredo Deza)
-* ceph-volume  zap: improve zapping to remove all partitions and all LVs, encrypted or not (`issue#37449 <http://tracker.ceph.com/issues/37449>`_, `pr#25330 <https://github.com/ceph/ceph/pull/25330>`_, Alfredo Deza)
-* cleanup: Clean up warnings (`pr#23919 <https://github.com/ceph/ceph/pull/23919>`_, Adam C. Emerson)
-* cli: dump osd-fsid as part of osd find <id> (`pr#26015 <https://github.com/ceph/ceph/pull/26015>`_, Noah Watkins)
-* cmake: add "add_npm_command()" command (`pr#22636 <https://github.com/ceph/ceph/pull/22636>`_, Kefu Chai)
-* cmake: Add cls_opt for vstart target (`pr#22538 <https://github.com/ceph/ceph/pull/22538>`_, Ali Maredia)
-* cmake: add dpdk::dpdk if dpdk is built or found (`issue#24948 <http://tracker.ceph.com/issues/24948>`_, `pr#23620 <https://github.com/ceph/ceph/pull/23620>`_, Nathan Cutler, Kefu Chai)
-* cmake: add option WITH_LIBRADOSSTRIPER (`pr#23732 <https://github.com/ceph/ceph/pull/23732>`_, Kefu Chai)
-* cmake: allow setting of the CTest timeout during building (`pr#22800 <https://github.com/ceph/ceph/pull/22800>`_, Willem Jan Withagen)
-* cmake: always prefer local symbols (`issue#25154 <http://tracker.ceph.com/issues/25154>`_, `pr#23320 <https://github.com/ceph/ceph/pull/23320>`_, Kefu Chai)
-* cmake: always turn off bjam debugging output (`pr#22204 <https://github.com/ceph/ceph/pull/22204>`_, Kefu Chai)
-* cmake: bump up the required boost version to 1.67 (`pr#22392 <https://github.com/ceph/ceph/pull/22392>`_, Kefu Chai)
-* cmake: bump up the required fmt version (`pr#23283 <https://github.com/ceph/ceph/pull/23283>`_, Kefu Chai)
-* cmake: cleanups (`pr#23166 <https://github.com/ceph/ceph/pull/23166>`_, Kefu Chai)
-* cmake: cleanups (`pr#23279 <https://github.com/ceph/ceph/pull/23279>`_, Kefu Chai)
-* cmake: cleanups (`pr#23300 <https://github.com/ceph/ceph/pull/23300>`_, Kefu Chai)
-* cmake,crimson/net: add keepalive support, and enable unittest_seastar_messenger in "make check" (`pr#23642 <https://github.com/ceph/ceph/pull/23642>`_, Kefu Chai)
-* cmake: detect armv8 crc and crypto feature using CHECK_C_COMPILER_FLAG (`issue#17516 <http://tracker.ceph.com/issues/17516>`_, `pr#24168 <https://github.com/ceph/ceph/pull/24168>`_, Kefu Chai)
-* cmake: disable -Werror-stringop-truncation for rocksdb (`pr#22591 <https://github.com/ceph/ceph/pull/22591>`_, Kefu Chai)
-* cmake: do not check for aligned_alloc() anymore (`issue#23653 <http://tracker.ceph.com/issues/23653>`_, `pr#22046 <https://github.com/ceph/ceph/pull/22046>`_, Kefu Chai)
-* cmake: do not depend on ${DPDK_LIBRARIES} if not using bundled dpdk (`issue#24449 <http://tracker.ceph.com/issues/24449>`_, `pr#22938 <https://github.com/ceph/ceph/pull/22938>`_, Kefu Chai)
-* cmake: do not install `hello` demo module (`pr#21886 <https://github.com/ceph/ceph/pull/21886>`_, John Spray)
-* cmake: do not link against common_crc_aarch64 (`pr#23366 <https://github.com/ceph/ceph/pull/23366>`_, Kefu Chai)
-* cmake: do not pass -B{symbolic,symbolic-functions} to linker on FreeBSD (`pr#24920 <https://github.com/ceph/ceph/pull/24920>`_, Willem Jan Withagen)
-* cmake: do not pass unnecessary param to setup.py (`pr#25186 <https://github.com/ceph/ceph/pull/25186>`_, Kefu Chai)
-* cmake: do not use Findfmt.cmake for checking libfmt-dev (`pr#23390 <https://github.com/ceph/ceph/pull/23390>`_, Kefu Chai)
-* cmake: do not use plain target_link_libraries(rgw_a ...) (`pr#24515 <https://github.com/ceph/ceph/pull/24515>`_, Kefu Chai)
-* cmake: enable RTTI for both debug and release RocksDB builds (`pr#22286 <https://github.com/ceph/ceph/pull/22286>`_, Igor Fedotov)
-* cmake: find a python2 interpreter for gtest-parallel (`pr#22931 <https://github.com/ceph/ceph/pull/22931>`_, Kefu Chai)
-* cmake: find liboath using the correct name (`pr#22430 <https://github.com/ceph/ceph/pull/22430>`_, Kefu Chai)
-* cmake: fix a cmake error when with -DALLOCATOR=jemalloc (`pr#23380 <https://github.com/ceph/ceph/pull/23380>`_, Jianpeng Ma)
-* cmake: fix build WITH_SYSTEM_BOOST=ON (`pr#23510 <https://github.com/ceph/ceph/pull/23510>`_, Kefu Chai)
-* cmake: fix compilation with distcc and other compiler wrappers (`pr#24605 <https://github.com/ceph/ceph/pull/24605>`_, Alexey Sheplyakov, Kefu Chai)
-* cmake: fix cython target in test/CMakeFile.txt (`pr#22295 <https://github.com/ceph/ceph/pull/22295>`_, Jan Fajerski)
-* cmake: fix Debug build `WITH_SEASTAR=ON` (`pr#23567 <https://github.com/ceph/ceph/pull/23567>`_, Kefu Chai)
-* cmake: fixes to enable WITH_ASAN with clang and GCC (`pr#24692 <https://github.com/ceph/ceph/pull/24692>`_, Kefu Chai)
-* cmake: fix find system rockdb (`pr#22439 <https://github.com/ceph/ceph/pull/22439>`_, Alexey Shabalin)
-* cmake: fix std::filesystem detection and extract sanitizer detection into its own module (`pr#23384 <https://github.com/ceph/ceph/pull/23384>`_, Kefu Chai)
-* cmake: fix syntax error of set() (`pr#26582 <https://github.com/ceph/ceph/pull/26582>`_, Kefu Chai)
-* cmake: fix the build WITH_DPDK=ON (`pr#23650 <https://github.com/ceph/ceph/pull/23650>`_, Kefu Chai, Casey Bodley)
-* cmake: fix version matching for Findfmt (`pr#23996 <https://github.com/ceph/ceph/pull/23996>`_, Mohamad Gebai)
-* cmake: fix "WITH_STATIC_LIBSTDCXX" (`pr#22990 <https://github.com/ceph/ceph/pull/22990>`_, Kefu Chai)
-* cmake: let rbd_api depend on librbd-tp (`pr#25641 <https://github.com/ceph/ceph/pull/25641>`_, Kefu Chai)
-* cmake: link against gtest in a better way (`pr#23628 <https://github.com/ceph/ceph/pull/23628>`_, Kefu Chai)
-* cmake: link ceph-osd with common statically (`pr#22720 <https://github.com/ceph/ceph/pull/22720>`_, Radoslaw Zarzynski)
-* cmake: link compressor plugins against lib the modern way (`pr#23852 <https://github.com/ceph/ceph/pull/23852>`_, Kefu Chai)
-* cmake: make -DWITH_MGR=OFF work (`pr#22077 <https://github.com/ceph/ceph/pull/22077>`_, Jianpeng Ma)
-* cmake: Make the tests for finding Filesystem with more serious functions (`pr#26316 <https://github.com/ceph/ceph/pull/26316>`_, Willem Jan Withagen)
-* cmake: modularize src/perfglue (`pr#23254 <https://github.com/ceph/ceph/pull/23254>`_, Kefu Chai)
-* cmake: move ceph-osdomap-tool, ceph-monstore-tool out of ceph-test (`pr#19964 <https://github.com/ceph/ceph/pull/19964>`_, runsisi)
-* cmake: move crypto_plugins target (`pr#21891 <https://github.com/ceph/ceph/pull/21891>`_, Casey Bodley)
-* cmake: no libradosstriper headers if WITH_LIBRADOSSTRIPER=OFF (`issue#35922 <http://tracker.ceph.com/issues/35922>`_, `pr#24029 <https://github.com/ceph/ceph/pull/24029>`_, Nathan Cutler, Kefu Chai)
-* cmake: no need to add "-D" before definitions (`pr#23795 <https://github.com/ceph/ceph/pull/23795>`_, Kefu Chai)
-* cmake: oath lives in liboath (`pr#22494 <https://github.com/ceph/ceph/pull/22494>`_, Willem Jan Withagen)
-* cmake: only build extra boost libraries only if WITH_SEASTAR (`pr#22521 <https://github.com/ceph/ceph/pull/22521>`_, Kefu Chai)
-* cmake: remove checking for GCC 5.1 (`pr#24477 <https://github.com/ceph/ceph/pull/24477>`_, Kefu Chai)
-* cmake: remove deleted rgw_request.cc from CMakeLists.txt (`pr#22186 <https://github.com/ceph/ceph/pull/22186>`_, Casey Bodley)
-* cmake: Remove embedded 'cephd' code (`pr#21940 <https://github.com/ceph/ceph/pull/21940>`_, Dan Mick)
-* cmake: remove workarounds for supporting cmake 2.x (`pr#22912 <https://github.com/ceph/ceph/pull/22912>`_, Kefu Chai)
-* cmake: rgw_common should depend on tracing headers (`pr#22367 <https://github.com/ceph/ceph/pull/22367>`_, Kefu Chai)
-* cmake: rocksdb related cleanup (`pr#23441 <https://github.com/ceph/ceph/pull/23441>`_, Kefu Chai)
-* cmake: should link against libatomic if libcxx/libstdc++ does not off… (`pr#22952 <https://github.com/ceph/ceph/pull/22952>`_, Kefu Chai)
-* cmake: update fio version from 3.5 to 540e235dcd276e63c57 (`pr#22019 <https://github.com/ceph/ceph/pull/22019>`_, Jianpeng Ma)
-* cmake: use $CMAKE_BINARY_DIR for default $CEPH_BUILD_VIRTUALENV (`issue#36737 <http://tracker.ceph.com/issues/36737>`_, `pr#26091 <https://github.com/ceph/ceph/pull/26091>`_, Kefu Chai)
-* cmake: use javac -h for creating JNI native headers (`issue#24012 <http://tracker.ceph.com/issues/24012>`_, `pr#21822 <https://github.com/ceph/ceph/pull/21822>`_, Kefu Chai)
-* cmake: use OpenSSL::Crypto instead of OPENSSL_LIBRARIES (`pr#24368 <https://github.com/ceph/ceph/pull/24368>`_, Kefu Chai)
-* cmake: vstart target can build WITH_CEPHFS/RBD/MGR=OFF (`pr#25204 <https://github.com/ceph/ceph/pull/25204>`_, Casey Bodley)
-* common: add adaptor for seastar::temporary_buffer (`pr#22454 <https://github.com/ceph/ceph/pull/22454>`_, Kefu Chai, Casey Bodley)
-* common: add a generic async Completion for use with boost::asio (`pr#21914 <https://github.com/ceph/ceph/pull/21914>`_, Casey Bodley)
-* common: add lockless `md_config_t` (`pr#22710 <https://github.com/ceph/ceph/pull/22710>`_, Kefu Chai)
-* common: async/dpdk: when enable dpdk, multiple message queue defect (`pr#25404 <https://github.com/ceph/ceph/pull/25404>`_, zhangyongsheng)
-* common: auth/cephx: minor code cleanup (`pr#21155 <https://github.com/ceph/ceph/pull/21155>`_, runsisi)
-* common: auth, common: cleanups (`pr#26383 <https://github.com/ceph/ceph/pull/26383>`_, Kefu Chai)
-* common: auth,common: use ceph::mutex instead of LockMutex (`pr#24263 <https://github.com/ceph/ceph/pull/24263>`_, Kefu Chai)
-* common: avoid the overhead of ``ANNOTATE_HAPPENS_*`` in NDEBUG builds (`pr#25129 <https://github.com/ceph/ceph/pull/25129>`_, Radoslaw Zarzynski)
-* common: be more informative if set PID-file fails (`pr#23647 <https://github.com/ceph/ceph/pull/23647>`_, Willem Jan Withagen)
-* common: blkdev: Rework API and add FreeBSD support (`pr#24658 <https://github.com/ceph/ceph/pull/24658>`_, Alan Somers)
-* common: buffer: mark the iterator traits "public" (`pr#25409 <https://github.com/ceph/ceph/pull/25409>`_, Kefu Chai)
-* common: calculate stddev on the fly (`pr#21461 <https://github.com/ceph/ceph/pull/21461>`_, Yao Zongyou)
-* common: ceph.in: use correct module for cmd flags (`pr#26454 <https://github.com/ceph/ceph/pull/26454>`_, Patrick Donnelly)
-* common: ceph-volume add device_id to inventory listing (`pr#25201 <https://github.com/ceph/ceph/pull/25201>`_, Jan Fajerski)
-* common: changes to address FTBFS on fc30 (`pr#26301 <https://github.com/ceph/ceph/pull/26301>`_, Kefu Chai)
-* common: common/admin_socket: add new api unregister_commands(AdminSocketHook … (`pr#21718 <https://github.com/ceph/ceph/pull/21718>`_, Jianpeng Ma)
-* common: common,auth,crimson: add logging to crimson (`pr#23957 <https://github.com/ceph/ceph/pull/23957>`_, Kefu Chai)
-* common: common/buffer: fix compiler bug when enable DEBUG_BUFFER (`pr#25848 <https://github.com/ceph/ceph/pull/25848>`_, Jianpeng Ma)
-* common: common/buffer: remove repeated condtion-check (`pr#25420 <https://github.com/ceph/ceph/pull/25420>`_, Jianpeng Ma)
-* common: common/config: add ConfigProxy for crimson (`pr#23074 <https://github.com/ceph/ceph/pull/23074>`_, Kefu Chai)
-* common: common/config: fix the lock in ConfigProxy::diff() (`pr#23276 <https://github.com/ceph/ceph/pull/23276>`_, Kefu Chai)
-* common: common/config_values: friend md_config_impl<> (`pr#23020 <https://github.com/ceph/ceph/pull/23020>`_, Mykola Golub, Kefu Chai)
-* common:  common: drop the unused methods from SharedLRU (`pr#26224 <https://github.com/ceph/ceph/pull/26224>`_, Radoslaw Zarzynski)
-* common: common/KeyValueDB: Get rid of validate parameter (`pr#25377 <https://github.com/ceph/ceph/pull/25377>`_, Adam Kupczyk)
-* common: common/numa: Add shim routines for NUMA on FreeBSD (`pr#25920 <https://github.com/ceph/ceph/pull/25920>`_, Willem Jan Withagen)
-* common: common, osd: set mclock priority as 1 by default (`pr#26022 <https://github.com/ceph/ceph/pull/26022>`_, Abhishek Lekshmanan)
-* common: common/random_cache: remove unused RandomCache (`pr#26253 <https://github.com/ceph/ceph/pull/26253>`_, Kefu Chai)
-* common: common/shared_cache: add lockless SharedLRU (`pr#22736 <https://github.com/ceph/ceph/pull/22736>`_, Kefu Chai)
-* common: common/shared_cache: bumps it to the front of the LRU if key existed (`pr#25370 <https://github.com/ceph/ceph/pull/25370>`_, Jianpeng Ma)
-* common: common/shared_cache: fix racing issues (`pr#25150 <https://github.com/ceph/ceph/pull/25150>`_, Jianpeng Ma)
-* common: common/util: pass real hostname when running in kubernetes/rook container (`pr#23798 <https://github.com/ceph/ceph/pull/23798>`_, Sage Weil)
-* common: complete all throttle blockers when we set average or max to 0 (`issue#36715 <http://tracker.ceph.com/issues/36715>`_, `pr#24965 <https://github.com/ceph/ceph/pull/24965>`_, Dongsheng Yang)
-* common,core: msg/async: clean up local buffers on dispatch (`issue#35987 <http://tracker.ceph.com/issues/35987>`_, `pr#24111 <https://github.com/ceph/ceph/pull/24111>`_, Greg Farnum)
-* common,core,tests: qa/tests: update links for centos latest to point to 7.5 (`pr#22923 <https://github.com/ceph/ceph/pull/22923>`_, Vasu Kulkarni)
-* common/crc/aarch64: Added cpu feature pmull and make aarch64 specific… (`pr#22178 <https://github.com/ceph/ceph/pull/22178>`_, Adam Kupczyk)
-* common:  crimson/common: write configs synchronously on shard.0 (`pr#23284 <https://github.com/ceph/ceph/pull/23284>`_, Kefu Chai)
-* common,crimson: port perfcounters to seastar (`pr#24141 <https://github.com/ceph/ceph/pull/24141>`_, chunmei Liu)
-* common: crypto: QAT based Encryption for RGW (`pr#19386 <https://github.com/ceph/ceph/pull/19386>`_, Ganesh Maharaj Mahalingam)
-* common: crypto: use ceph_assert_always for assertions (`pr#23654 <https://github.com/ceph/ceph/pull/23654>`_, Casey Bodley)
-* common: define BOOST_COROUTINES_NO_DEPRECATION_WARNING if not yet (`pr#26502 <https://github.com/ceph/ceph/pull/26502>`_, Kefu Chai)
-* common: drop allocation tracking from bufferlist (`pr#25454 <https://github.com/ceph/ceph/pull/25454>`_, Radoslaw Zarzynski)
-* common: drop append_buffer from bufferlist. Use simple carriage instead (`pr#25077 <https://github.com/ceph/ceph/pull/25077>`_, Radoslaw Zarzynski)
-* common: drop at_buffer_{head,tail} from buffer::ptr (`pr#25422 <https://github.com/ceph/ceph/pull/25422>`_, Radoslaw Zarzynski)
-* common: drop/mark-as-final getters of buffer::raw for palign (`pr#24087 <https://github.com/ceph/ceph/pull/24087>`_, Radoslaw Zarzynski)
-* common: drop static_assert.h as it looks unused (`pr#22743 <https://github.com/ceph/ceph/pull/22743>`_, Radoslaw Zarzynski)
-* common: drop the unused buffer::raw_mmap_pages (`pr#24040 <https://github.com/ceph/ceph/pull/24040>`_, Radoslaw Zarzynski)
-* common: drop the unused zero-copy facilities in ceph::bufferlist (`pr#24031 <https://github.com/ceph/ceph/pull/24031>`_, Radoslaw Zarzynski)
-* common: drop unused get_max_pipe_size() in buffer.cc (`pr#25432 <https://github.com/ceph/ceph/pull/25432>`_, Radoslaw Zarzynski)
-* common: ec: lrc doesn't depend on crosstalks between bufferlists anymore (`pr#25595 <https://github.com/ceph/ceph/pull/25595>`_, Radoslaw Zarzynski)
-* common: expand meta in parse_argv() (`pr#23474 <https://github.com/ceph/ceph/pull/23474>`_, Kefu Chai)
-* common: fix access and add name for the token bucket throttle (`pr#25372 <https://github.com/ceph/ceph/pull/25372>`_, Shiyang Ruan)
-* common: Fix Alpine compatability for TEMP_FAILURE_RETRY and ACCESSPERMS (`pr#24813 <https://github.com/ceph/ceph/pull/24813>`_, Willem Jan Withagen)
-* common: fix a racing in PerfCounters::perf_counter_data_any_d::read_avg (`issue#25211 <http://tracker.ceph.com/issues/25211>`_, `pr#23362 <https://github.com/ceph/ceph/pull/23362>`_, ludehp)
-* common: fix for broken rbdmap parameter parsing (`pr#24446 <https://github.com/ceph/ceph/pull/24446>`_, Marc Schoechlin)
-* common: fix missing include boost/noncopyable.hpp (`pr#24278 <https://github.com/ceph/ceph/pull/24278>`_, Willem Jan Withagen)
-* common: fix typo in rados bench write JSON output (`issue#24199 <http://tracker.ceph.com/issues/24199>`_, `pr#22112 <https://github.com/ceph/ceph/pull/22112>`_, Sandor Zeestraten)
-* common: fix typos in BackoffThrottle (`pr#24691 <https://github.com/ceph/ceph/pull/24691>`_, Shiyang Ruan)
-* common: Formatters: improve precision of double numbers (`pr#25745 <https://github.com/ceph/ceph/pull/25745>`_, Коренберг Марк)
-* common: .gitignore: Ignore .idea directory (`pr#24237 <https://github.com/ceph/ceph/pull/24237>`_, Volker Theile)
-* common: hint bufferlist's buffer_track_c_str accordingly (`pr#25424 <https://github.com/ceph/ceph/pull/25424>`_, Radoslaw Zarzynski)
-* common: hypercombined bufferlist (`pr#24882 <https://github.com/ceph/ceph/pull/24882>`_, Radoslaw Zarzynski)
-* common: include/compat.h: make pthread_get_name_np work when available (`pr#23641 <https://github.com/ceph/ceph/pull/23641>`_, Willem Jan Withagen)
-* common: include include/types.h early, otherwise Clang will error (`pr#22493 <https://github.com/ceph/ceph/pull/22493>`_, Willem Jan Withagen)
-* common: include/types: move operator<< into the proper namespace (`pr#23767 <https://github.com/ceph/ceph/pull/23767>`_, Kefu Chai)
-* common: include/types: space between number and units (`pr#22063 <https://github.com/ceph/ceph/pull/22063>`_, Sage Weil)
-* common: librados,rpm,deb: various fixes to address librados3 transition and cleanups in librados (`pr#24896 <https://github.com/ceph/ceph/pull/24896>`_, Kefu Chai)
-* common: make CEPH_BUFFER_ALLOC_UNIT known at compile-time (`pr#26259 <https://github.com/ceph/ceph/pull/26259>`_, Radoslaw Zarzynski)
-* common: mark BlkDev::serial() const to match with its declaration (`pr#24702 <https://github.com/ceph/ceph/pull/24702>`_, Willem Jan Withagen)
-* common: messages: define HEAD_VERSION and COMPAT_VERSION inlined (`pr#23623 <https://github.com/ceph/ceph/pull/23623>`_, Kefu Chai)
-* common,mgr: mgr/MgrClient: make some noise for a user if no mgr daemon is running (`pr#23492 <https://github.com/ceph/ceph/pull/23492>`_, Sage Weil)
-* common: mon/MonClient: set configs via finisher (`issue#24118 <http://tracker.ceph.com/issues/24118>`_, `pr#21984 <https://github.com/ceph/ceph/pull/21984>`_, Sage Weil)
-* common: msg/async: fix FTBFS of dpdk (`pr#23168 <https://github.com/ceph/ceph/pull/23168>`_, Kefu Chai)
-* common: msg/async: Skip the duplicated processing of the same link (`pr#20952 <https://github.com/ceph/ceph/pull/20952>`_, shangfufei)
-* common: msg/msg_types.h: do not cast `ceph_entity_name` to `entity_name_t` for printing (`pr#26315 <https://github.com/ceph/ceph/pull/26315>`_, Kefu Chai)
-* common: msgr/async/rdma: Return from poll system call with EINTR should be retried (`pr#25138 <https://github.com/ceph/ceph/pull/25138>`_, Stig Telfer)
-* common: Mutex -> ceph::mutex (`issue#12614 <http://tracker.ceph.com/issues/12614>`_, `pr#25105 <https://github.com/ceph/ceph/pull/25105>`_, Kefu Chai, Sage Weil)
-* common: optimize reference counting in bufferlist (`pr#25082 <https://github.com/ceph/ceph/pull/25082>`_, Radoslaw Zarzynski)
-* common: OpTracker doesn't visit TrackedOp when nref == 0 (`issue#24037 <http://tracker.ceph.com/issues/24037>`_, `pr#22156 <https://github.com/ceph/ceph/pull/22156>`_, Radoslaw Zarzynski)
-* common: os/filestore: fix throttle configurations (`pr#21926 <https://github.com/ceph/ceph/pull/21926>`_, Li Wang)
-* common,performance: auth,common: add lockless auth (`pr#23591 <https://github.com/ceph/ceph/pull/23591>`_, Kefu Chai)
-* common,performance: common/assert: mark assert helpers with [[gnu::cold]] (`pr#23326 <https://github.com/ceph/ceph/pull/23326>`_, Kefu Chai)
-* common,performance: compressor: add QAT support (`pr#19714 <https://github.com/ceph/ceph/pull/19714>`_, Qiaowei Ren)
-* common,performance: denc: fix internal fragmentation when decoding ptr in bl (`pr#25264 <https://github.com/ceph/ceph/pull/25264>`_, Kefu Chai)
-* common,rbd: misc: mark constructors as explicit (`pr#21637 <https://github.com/ceph/ceph/pull/21637>`_, Danny Al-Gaaf)
-* common: reinit StackStringStream on clear (`pr#25751 <https://github.com/ceph/ceph/pull/25751>`_, Patrick Donnelly)
-* common: reintroduce async SharedMutex (`issue#24124 <http://tracker.ceph.com/issues/24124>`_, `pr#22698 <https://github.com/ceph/ceph/pull/22698>`_, Casey Bodley)
-* common: Reverse deleted include (`pr#23838 <https://github.com/ceph/ceph/pull/23838>`_, Willem Jan Withagen)
-* common: Revert "common: add an async SharedMutex" (`issue#24124 <http://tracker.ceph.com/issues/24124>`_, `pr#21986 <https://github.com/ceph/ceph/pull/21986>`_, Casey Bodley)
-* common,rgw: cls/rbd: init local var with known value (`pr#25588 <https://github.com/ceph/ceph/pull/25588>`_, Kefu Chai)
-* common,tests: run-standalone.sh: Need double-quotes to handle | in core_pattern on all distributions (`issue#38325 <http://tracker.ceph.com/issues/38325>`_, `pr#26436 <https://github.com/ceph/ceph/pull/26436>`_, David Zafman)
-* common,tests: test_shared_cache: fix memory leak (`pr#25215 <https://github.com/ceph/ceph/pull/25215>`_, Jianpeng Ma)
-* common: vstart: do not attempt to re-initialize dashboard for existing cluster (`pr#23261 <https://github.com/ceph/ceph/pull/23261>`_, Jason Dillaman)
-* core: Add support for osd_delete_sleep configuration value (`issue#36474 <http://tracker.ceph.com/issues/36474>`_, `pr#24749 <https://github.com/ceph/ceph/pull/24749>`_, David Zafman)
-* core: auth: drop the RWLock in AuthClientHandler (`pr#23699 <https://github.com/ceph/ceph/pull/23699>`_, Kefu Chai)
-* core: auth/krb: Fix Kerberos build warnings (`pr#25639 <https://github.com/ceph/ceph/pull/25639>`_, Daniel Oliveira)
-* core: build: disable kerberos for nautilus (`pr#26258 <https://github.com/ceph/ceph/pull/26258>`_, Sage Weil)
-* core: ceph_argparse: fix --verbose (`pr#25961 <https://github.com/ceph/ceph/pull/25961>`_, Patrick Nawracay)
-* core: ceph.in: friendlier message on EPERM (`issue#25172 <http://tracker.ceph.com/issues/25172>`_, `pr#23330 <https://github.com/ceph/ceph/pull/23330>`_, John Spray)
-* core: ceph.in: write bytes to stdout in raw_write() (`pr#25280 <https://github.com/ceph/ceph/pull/25280>`_, Kefu Chai)
-* core: ceph_test_rados_api_misc: remove obsolete LibRadosMiscPool.PoolCreationRace (`issue#24150 <http://tracker.ceph.com/issues/24150>`_, `pr#22042 <https://github.com/ceph/ceph/pull/22042>`_, Sage Weil)
-* core: Clang misses <optional> include (`pr#23768 <https://github.com/ceph/ceph/pull/23768>`_, Willem Jan Withagen)
-* core: common/blkdev.h: use std::string (`pr#25783 <https://github.com/ceph/ceph/pull/25783>`_, Neha Ojha)
-* core: common/options: remove unused ms async affinity options (`pr#26099 <https://github.com/ceph/ceph/pull/26099>`_, Josh Durgin)
-* core: common/util.cc: add CONTAINER_NAME processing for metadata (`pr#25383 <https://github.com/ceph/ceph/pull/25383>`_, Dan Mick)
-* core: compressor: building error for QAT decompress (`pr#22609 <https://github.com/ceph/ceph/pull/22609>`_, Qiaowei Ren)
-* core: crush, osd: handle multiple parents properly when applying pg upmaps (`issue#23921 <http://tracker.ceph.com/issues/23921>`_, `pr#21815 <https://github.com/ceph/ceph/pull/21815>`_, xiexingguo)
-* core: erasure-code: add clay codes (`issue#19278 <http://tracker.ceph.com/issues/19278>`_, `pr#24291 <https://github.com/ceph/ceph/pull/24291>`_, Myna V, Sage Weil)
-* core: erasure-code: fixes alignment issue when clay code is used with jerasure, cauchy_orig (`pr#24586 <https://github.com/ceph/ceph/pull/24586>`_, Myna)
-* core: global/signal_handler.cc: report assert_file as correct name (`pr#23738 <https://github.com/ceph/ceph/pull/23738>`_, Dan Mick)
-* core: include/rados: clarify which flags go where for copy_from (`pr#24497 <https://github.com/ceph/ceph/pull/24497>`_, Ilya Dryomov)
-* core: include/rados.h: hide CEPH_OSDMAP_PGLOG_HARDLIMIT from ceph -s (`pr#25887 <https://github.com/ceph/ceph/pull/25887>`_, Neha Ojha)
-* core: kv/KeyValueDB: Move PriCache implementation to ShardedCache (`pr#25925 <https://github.com/ceph/ceph/pull/25925>`_, Mark Nelson)
-* core: kv/KeyValueDB: return const char\* from MergeOperator::name() (`issue#26875 <http://tracker.ceph.com/issues/26875>`_, `pr#23477 <https://github.com/ceph/ceph/pull/23477>`_, Sage Weil)
-* core: messages/MOSDPGScan: fix initialization of query_epoch (`pr#22408 <https://github.com/ceph/ceph/pull/22408>`_, wumingqiao)
-* core: mgr/balancer: add cmd to list all plans (`issue#37418 <http://tracker.ceph.com/issues/37418>`_, `pr#21937 <https://github.com/ceph/ceph/pull/21937>`_, Yang Honggang)
-* core: mgr/BaseMgrModule: drop GIL for ceph_send_command (`issue#38537 <http://tracker.ceph.com/issues/38537>`_, `pr#26723 <https://github.com/ceph/ceph/pull/26723>`_, Sage Weil)
-* core: mgr/MgrClient: Protect daemon_health_metrics (`issue#23352 <http://tracker.ceph.com/issues/23352>`_, `pr#23404 <https://github.com/ceph/ceph/pull/23404>`_, Kjetil Joergensen, Brad Hubbard)
-* core,mgr: mon/MgrMonitor: change 'unresponsive' message to info level (`issue#24222 <http://tracker.ceph.com/issues/24222>`_, `pr#22158 <https://github.com/ceph/ceph/pull/22158>`_, Sage Weil)
-* core,mgr,rbd:  mgr: generalize osd perf query and make counters accessible from modules (`pr#25114 <https://github.com/ceph/ceph/pull/25114>`_, Mykola Golub)
-* core,mgr,rbd:  osd: support more dynamic perf query subkey types (`pr#25371 <https://github.com/ceph/ceph/pull/25371>`_, Mykola Golub)
-* core,mgr,rbd,rgw: rgw, common: Fixes SCA issues (`pr#22007 <https://github.com/ceph/ceph/pull/22007>`_, Danny Al-Gaaf)
-* core: mgr/smart: remove obsolete smart module (`pr#26411 <https://github.com/ceph/ceph/pull/26411>`_, Sage Weil)
-* core: mon/LogMonitor: call no_reply() on ignored log message (`pr#22098 <https://github.com/ceph/ceph/pull/22098>`_, Sage Weil)
-* core: mon/MonClient: avoid using magic number for the `MAuth::protocol` (`pr#23747 <https://github.com/ceph/ceph/pull/23747>`_, Kefu Chai)
-* core: mon/MonClient: extract MonSub out (`pr#23688 <https://github.com/ceph/ceph/pull/23688>`_, Kefu Chai)
-* core: mon/MonClient: use scoped_guard instead of goto (`pr#24304 <https://github.com/ceph/ceph/pull/24304>`_, Kefu Chai)
-* core,mon: mon,osd: dump "compression_algorithms" in "mon metadata" (`issue#22420 <http://tracker.ceph.com/issues/22420>`_, `pr#21809 <https://github.com/ceph/ceph/pull/21809>`_, Kefu Chai, Casey Bodley)
-* core,mon: mon/OSDMonitor: no_reply on MOSDFailure messages (`issue#24322 <http://tracker.ceph.com/issues/24322>`_, `pr#22259 <https://github.com/ceph/ceph/pull/22259>`_, Sage Weil)
-* core,mon: mon/OSDMonitor: Warnings for expected_num_objects (`issue#24687 <http://tracker.ceph.com/issues/24687>`_, `pr#23072 <https://github.com/ceph/ceph/pull/23072>`_, Douglas Fuller)
-* core: mon/OSDMonitor: two "ceph osd crush class rm" fixes (`pr#24657 <https://github.com/ceph/ceph/pull/24657>`_, xie xingguo)
-* core: mon/PGMap: fix PGMapDigest decode (`pr#22066 <https://github.com/ceph/ceph/pull/22066>`_, Sage Weil)
-* core: mon/PGMap: include unknown PGs in 'pg ls' (`pr#24032 <https://github.com/ceph/ceph/pull/24032>`_, Sage Weil)
-* core: msg/async: do not trigger RESETSESSION from connect fault during connection phase (`issue#36612 <http://tracker.ceph.com/issues/36612>`_, `pr#25343 <https://github.com/ceph/ceph/pull/25343>`_, Sage Weil)
-* core: msg/async/Event: clear time_events on shutdown (`issue#24162 <http://tracker.ceph.com/issues/24162>`_, `pr#22093 <https://github.com/ceph/ceph/pull/22093>`_, Sage Weil)
-* core: msg/async: fix banner_v1 check in ProtocolV2 (`pr#26714 <https://github.com/ceph/ceph/pull/26714>`_, Yingxin Cheng)
-* core: msg/async: fix include in frames_v2.h (`pr#26711 <https://github.com/ceph/ceph/pull/26711>`_, Yingxin Cheng)
-* core: msg/async: fix is_queued() semantics (`pr#24693 <https://github.com/ceph/ceph/pull/24693>`_, Ilya Dryomov)
-* core: msg/async: keep connection alive only actually sending (`pr#24301 <https://github.com/ceph/ceph/pull/24301>`_, Haomai Wang, Kefu Chai)
-* core: os/bluestore: fix deep-scrub operation againest disk silent errors (`pr#23629 <https://github.com/ceph/ceph/pull/23629>`_, Xiaoguang Wang)
-* core: os/bluestore: fix flush_commit locking (`issue#21480 <http://tracker.ceph.com/issues/21480>`_, `pr#22083 <https://github.com/ceph/ceph/pull/22083>`_, Sage Weil)
-* core: OSD: add impl for filestore to get dbstatistics (`issue#24591 <http://tracker.ceph.com/issues/24591>`_, `pr#22633 <https://github.com/ceph/ceph/pull/22633>`_, lvshuhua)
-* core: osdc: Change 'bool budgeted' to 'int budget' to avoid recalculating (`pr#21242 <https://github.com/ceph/ceph/pull/21242>`_, Jianpeng Ma)
-* core: OSD: ceph-osd parent process need to restart log service after fork (`issue#24956 <http://tracker.ceph.com/issues/24956>`_, `pr#23090 <https://github.com/ceph/ceph/pull/23090>`_, redickwang)
-* core: osdc/Objecter: fix split vs reconnect race (`issue#22544 <http://tracker.ceph.com/issues/22544>`_, `pr#23850 <https://github.com/ceph/ceph/pull/23850>`_, Sage Weil)
-* core: osdc/Objecter: no need null pointer check for op->session anymore (`pr#25230 <https://github.com/ceph/ceph/pull/25230>`_, runsisi)
-* core: osdc/Objecter: possible race condition with connection reset (`issue#36183 <http://tracker.ceph.com/issues/36183>`_, `pr#24276 <https://github.com/ceph/ceph/pull/24276>`_, Jason Dillaman)
-* core: osdc: self-managed snapshot helper should catch decode exception (`issue#24000 <http://tracker.ceph.com/issues/24000>`_, `pr#21804 <https://github.com/ceph/ceph/pull/21804>`_, Jason Dillaman)
-* core: osd, librados: add unset-manifest op (`pr#21999 <https://github.com/ceph/ceph/pull/21999>`_, Myoungwon Oh)
-* core: osd,mds: make 'config rm ...' idempotent (`issue#24408 <http://tracker.ceph.com/issues/24408>`_, `pr#22395 <https://github.com/ceph/ceph/pull/22395>`_, Sage Weil)
-* core: osd/mon: fix upgrades for pg log hard limit (`issue#36686 <http://tracker.ceph.com/issues/36686>`_, `pr#25816 <https://github.com/ceph/ceph/pull/25816>`_, Neha Ojha, Yuri Weinstein)
-* core: osd,mon: increase mon_max_pg_per_osd to 250 (`pr#23251 <https://github.com/ceph/ceph/pull/23251>`_, Neha Ojha)
-* core: osd,mon,msg: use intrusive_ptr for holding Connection::priv (`issue#20924 <http://tracker.ceph.com/issues/20924>`_, `pr#22292 <https://github.com/ceph/ceph/pull/22292>`_, Kefu Chai)
-* core: osd/OSD: choose heartbeat peers more carefully (`pr#23487 <https://github.com/ceph/ceph/pull/23487>`_, xie xingguo)
-* core: osd/OSD: drop extra/wrong \*unregister_pg\* (`pr#21816 <https://github.com/ceph/ceph/pull/21816>`_, xiexingguo)
-* core: osd/OSDMap: be more aggressive when trying to balance (`issue#37940 <http://tracker.ceph.com/issues/37940>`_, `pr#26039 <https://github.com/ceph/ceph/pull/26039>`_, xie xingguo)
-* core: osd/OSDMap: drop local pool filter in calc_pg_upmaps (`pr#26605 <https://github.com/ceph/ceph/pull/26605>`_, xie xingguo)
-* core: osd/OSDMap: fix CEPHX_V2 osd requirement to nautilus, not mimic (`pr#23249 <https://github.com/ceph/ceph/pull/23249>`_, Sage Weil)
-* core: osd/OSDMap: fix upmap mis-killing for erasure-coded PGs (`pr#25365 <https://github.com/ceph/ceph/pull/25365>`_, ningtao, xie xingguo)
-* core: osd/OSDMap: potential access violation fix (`issue#37881 <http://tracker.ceph.com/issues/37881>`_, `pr#25930 <https://github.com/ceph/ceph/pull/25930>`_, xie xingguo)
-* core: osd/OSDMap: using std::vector::reserve to reduce memory reallocation (`pr#26478 <https://github.com/ceph/ceph/pull/26478>`_, xie xingguo)
-* core: osd/OSD: ping monitor if we are stuck at __waiting_for_healthy__ (`pr#23958 <https://github.com/ceph/ceph/pull/23958>`_, xie xingguo)
-* core: osd/OSD: preallocate for _get_pgs/_get_pgids to avoid reallocate (`pr#25434 <https://github.com/ceph/ceph/pull/25434>`_, Jianpeng Ma)
-* core: osd/PG: async-recovery should respect historical missing objects (`pr#24004 <https://github.com/ceph/ceph/pull/24004>`_, xie xingguo)
-* core: osd/PG.cc: account for missing set irrespective of last_complete (`issue#37919 <http://tracker.ceph.com/issues/37919>`_, `pr#26175 <https://github.com/ceph/ceph/pull/26175>`_, Neha Ojha)
-* core: osd/PG: create new PGs from activate in last_peering_reset epoch (`issue#24452 <http://tracker.ceph.com/issues/24452>`_, `pr#22478 <https://github.com/ceph/ceph/pull/22478>`_, Sage Weil)
-* core: osd/PG: do not choose stray osds as async_recovery_targets (`pr#22330 <https://github.com/ceph/ceph/pull/22330>`_, Neha Ojha)
-* core: osd/PG: fix misused FORCE_RECOVERY[BACKFILL] flags (`issue#27985 <http://tracker.ceph.com/issues/27985>`_, `pr#23904 <https://github.com/ceph/ceph/pull/23904>`_, xie xingguo)
-* core: osd/PGLog.cc: check if complete_to points to log.end() (`pr#23450 <https://github.com/ceph/ceph/pull/23450>`_, Neha Ojha)
-* core: osd/PGLog: trim - avoid dereferencing invalid iter (`pr#23546 <https://github.com/ceph/ceph/pull/23546>`_, xie xingguo)
-* core: osd/PG: remove unused functions (`pr#26155 <https://github.com/ceph/ceph/pull/26155>`_, Kefu Chai)
-* core: osd/PG: reset PG on osd down->up; normalize query processing (`issue#24373 <http://tracker.ceph.com/issues/24373>`_, `pr#22456 <https://github.com/ceph/ceph/pull/22456>`_, Sage Weil)
-* core: osd/PG: restrict async_recovery_targets to up osds (`pr#22664 <https://github.com/ceph/ceph/pull/22664>`_, Neha Ojha)
-* core: osd/PG: unset history_les_bound if local-les is used (`pr#22524 <https://github.com/ceph/ceph/pull/22524>`_, Kefu Chai)
-* core: osd/PG: write pg epoch when resurrecting pg after delete vs merge race (`issue#35923 <http://tracker.ceph.com/issues/35923>`_, `pr#24061 <https://github.com/ceph/ceph/pull/24061>`_, Sage Weil)
-* core: osd/PrimaryLogPG: do not count failed read in delta_stats (`pr#25687 <https://github.com/ceph/ceph/pull/25687>`_, Kefu Chai)
-* core: osd/PrimaryLogPG: fix last_peering_reset checking on manifest flushing (`pr#26778 <https://github.com/ceph/ceph/pull/26778>`_, xie xingguo)
-* core: osd/PrimaryLogPG: fix on_local_recover crash on stray clone (`pr#22396 <https://github.com/ceph/ceph/pull/22396>`_, Sage Weil)
-* core: osd/PrimaryLogPG: fix potential pg-log overtrimming (`pr#23317 <https://github.com/ceph/ceph/pull/23317>`_, xie xingguo)
-* core: osd/PrimaryLogPG: fix the extent length error of the sync read (`pr#25584 <https://github.com/ceph/ceph/pull/25584>`_, Xiaofei Cui)
-* core: osd/PrimaryLogPG: fix try_flush_mark_clean write contention case (`issue#24174 <http://tracker.ceph.com/issues/24174>`_, `pr#22084 <https://github.com/ceph/ceph/pull/22084>`_, Sage Weil)
-* core: osd/PrimaryLogPG: optimize recover order (`pr#23587 <https://github.com/ceph/ceph/pull/23587>`_, xie xingguo)
-* core: osd/PrimaryLogPG: update missing_loc more carefully (`issue#35546 <http://tracker.ceph.com/issues/35546>`_, `pr#23895 <https://github.com/ceph/ceph/pull/23895>`_, xie xingguo)
-* core: osd/ReplicatedBackend: remove useless assert (`pr#21243 <https://github.com/ceph/ceph/pull/21243>`_, Jianpeng Ma)
-* core: osd/Session: fix invalid iterator dereference in Session::have_backoff() (`issue#24486 <http://tracker.ceph.com/issues/24486>`_, `pr#22497 <https://github.com/ceph/ceph/pull/22497>`_, Sage Weil)
-* core:  osd: write "debug dump_missing" output to stdout (`pr#21960 <https://github.com/ceph/ceph/pull/21960>`_, Коренберг Маркr)
-* core: os/kstore: support db statistic (`pr#21487 <https://github.com/ceph/ceph/pull/21487>`_, Yang Honggang)
-* core: os/memstore: use ceph::mutex and friends (`pr#26026 <https://github.com/ceph/ceph/pull/26026>`_, Kefu Chai)
-* core,performance:  core: avoid unnecessary refcounting of OSDMap on OSD's hot paths (`pr#24743 <https://github.com/ceph/ceph/pull/24743>`_, Radoslaw Zarzynski)
-* core,performance: msg/async: avoid put message within write_lock (`pr#20731 <https://github.com/ceph/ceph/pull/20731>`_, Haomai Wang)
-* core,performance: os/bluestore: make osd shard-thread do oncommits (`pr#22739 <https://github.com/ceph/ceph/pull/22739>`_, Jianpeng Ma)
-* core,performance: osd/filestore: Change default filestore_merge_threshold to -10 (`issue#24686 <http://tracker.ceph.com/issues/24686>`_, `pr#22761 <https://github.com/ceph/ceph/pull/22761>`_, Douglas Fuller)
-* core,performance: osd/OSDMap: map pgs with smaller batchs in calc_pg_upmaps (`pr#23734 <https://github.com/ceph/ceph/pull/23734>`_, huangjun)
-* core: PG: release reservations after backfill completes (`issue#23614 <http://tracker.ceph.com/issues/23614>`_, `pr#22255 <https://github.com/ceph/ceph/pull/22255>`_, Neha Ojha)
-* core: pg stuck in backfill_wait with plenty of disk space (`issue#38034 <http://tracker.ceph.com/issues/38034>`_, `pr#26375 <https://github.com/ceph/ceph/pull/26375>`_, xie xingguo, David Zafman)
-* core,pybind: pybind/rados: new methods for manipulating self-managed snapshots (`pr#22579 <https://github.com/ceph/ceph/pull/22579>`_, Jason Dillaman)
-* core: qa/suites/rados: minor fixes (`pr#22195 <https://github.com/ceph/ceph/pull/22195>`_, Neha Ojha)
-* core: qa/suites/rados/thrash-erasure-code\*/thrashers/\*: less likely resv rejection injection (`pr#24667 <https://github.com/ceph/ceph/pull/24667>`_, Sage Weil)
-* core: qa/suites/rados/thrash-old-clients: only centos and 16.04 (`pr#22106 <https://github.com/ceph/ceph/pull/22106>`_, Sage Weil)
-* core: qa/suites: set osd_pg_log_dups_tracked in cfuse_workunit_suites_fsync.yaml (`pr#21909 <https://github.com/ceph/ceph/pull/21909>`_, Neha Ojha)
-* core: qa/suites/upgrade/luminous-x: disable c-o-t import/export tests between versions (`issue#38294 <http://tracker.ceph.com/issues/38294>`_, `pr#27018 <https://github.com/ceph/ceph/pull/27018>`_, Sage Weil)
-* core: qa/suites/upgrade/mimic-x/parallel: enable all classes (`pr#27011 <https://github.com/ceph/ceph/pull/27011>`_, Sage Weil)
-* core: qa/workunits/mgr/test_localpool.sh: use new config syntax (`pr#22496 <https://github.com/ceph/ceph/pull/22496>`_, Sage Weil)
-* core: qa/workunits/rados/test_health_warnings: prevent out osds (`issue#37776 <http://tracker.ceph.com/issues/37776>`_, `pr#25732 <https://github.com/ceph/ceph/pull/25732>`_, Sage Weil)
-* core: rados.pyx: make all exceptions accept keyword arguments (`issue#24033 <http://tracker.ceph.com/issues/24033>`_, `pr#21853 <https://github.com/ceph/ceph/pull/21853>`_, Rishabh Dave)
-* core: rados: return legacy address in 'lock info' (`pr#26150 <https://github.com/ceph/ceph/pull/26150>`_, Jason Dillaman)
-* core: scrub warning check incorrectly uses mon scrub interval (`issue#37264 <http://tracker.ceph.com/issues/37264>`_, `pr#25112 <https://github.com/ceph/ceph/pull/25112>`_, David Zafman)
-* core: src: no 'dne' acronym in user cmd output (`pr#21094 <https://github.com/ceph/ceph/pull/21094>`_, Gu Zhongyan)
-* core,tests: Minor cleanups in tests and log output (`issue#38631 <http://tracker.ceph.com/issues/38631>`_, `issue#38678 <http://tracker.ceph.com/issues/38678>`_, `pr#26899 <https://github.com/ceph/ceph/pull/26899>`_, David Zafman)
-* core,tests: qa/overrides/short_pg_log.yaml: reduce osd_{min,max}_pg_log_entries (`issue#38025 <http://tracker.ceph.com/issues/38025>`_, `pr#26101 <https://github.com/ceph/ceph/pull/26101>`_, Neha Ojha)
-* core,tests: qa/suites/rados/thrash: change crush_tunables to jewel in rados_api_tests (`issue#38042 <http://tracker.ceph.com/issues/38042>`_, `pr#26122 <https://github.com/ceph/ceph/pull/26122>`_, Neha Ojha)
-* core,tests: qa/suites/upgrade/luminous-x: a few fixes (`pr#22092 <https://github.com/ceph/ceph/pull/22092>`_, Sage Weil)
-* core,tests: qa/tests: Set ansible-version: 2.5 (`issue#24926 <http://tracker.ceph.com/issues/24926>`_, `pr#23123 <https://github.com/ceph/ceph/pull/23123>`_, Yuri Weinstein)
-* core,tests: Removal of snapshot with corrupt replica crashes osd (`issue#23875 <http://tracker.ceph.com/issues/23875>`_, `pr#22476 <https://github.com/ceph/ceph/pull/22476>`_, David Zafman)
-* core,tests: test: Verify a log trim trims the dup_index (`pr#26533 <https://github.com/ceph/ceph/pull/26533>`_, Brad Hubbard)
-* core,tools: osdmaptool: fix wrong test_map_pgs_dump_all output (`pr#22280 <https://github.com/ceph/ceph/pull/22280>`_, huangjun)
-* core,tools: rados: provide user with more meaningful error message (`pr#26275 <https://github.com/ceph/ceph/pull/26275>`_, Mykola Golub)
-* core,tools: tools/rados: allow reuse object for write test (`pr#25128 <https://github.com/ceph/ceph/pull/25128>`_, Li Wang)
-* core: vstart.sh: Support SPDK in Ceph development deployment (`pr#22975 <https://github.com/ceph/ceph/pull/22975>`_, tone.zhang)
-* crimson: add MonClient (`pr#23849 <https://github.com/ceph/ceph/pull/23849>`_, Kefu Chai)
-* crimson: cache osdmap using LRU cache (`pr#26254 <https://github.com/ceph/ceph/pull/26254>`_, Kefu Chai, Jianpeng Ma)
-* crimson/common: apply config changes also on shard.0 (`pr#23631 <https://github.com/ceph/ceph/pull/23631>`_, Yingxin)
-* crimson/connection: misc changes (`pr#23044 <https://github.com/ceph/ceph/pull/23044>`_, Kefu Chai)
-* crimson: crimson/mon: remove timeout support from mon::Client::authenticate() (`pr#24660 <https://github.com/ceph/ceph/pull/24660>`_, Kefu Chai)
-* crimson/mon: move mon::Connection into .cc (`pr#24619 <https://github.com/ceph/ceph/pull/24619>`_, Kefu Chai)
-* crimson/net: concurrent dispatch for SocketMessenger (`pr#24090 <https://github.com/ceph/ceph/pull/24090>`_, Casey Bodley)
-* crimson/net: encapsulate protocol implementations with states (`pr#25176 <https://github.com/ceph/ceph/pull/25176>`_, Yingxin, Kefu Chai)
-* crimson/net: encapsulate protocol implementations with states (remaining part) (`pr#25207 <https://github.com/ceph/ceph/pull/25207>`_, Yingxin)
-* crimson/net: fix addresses during banner exchange (`pr#25580 <https://github.com/ceph/ceph/pull/25580>`_, Yingxin)
-* crimson/net: fix compile errors in test_alien_echo.cc (`pr#24629 <https://github.com/ceph/ceph/pull/24629>`_, Yingxin)
-* crimson/net: fix crimson msgr error leaks to caller (`pr#25716 <https://github.com/ceph/ceph/pull/25716>`_, Yingxin)
-* crimson/net: fix misc issues for segment-fault and test-failures (`pr#25939 <https://github.com/ceph/ceph/pull/25939>`_, Yingxin Cheng, Kefu Chai)
-* crimson/net: Fix racing for promise on_message (`pr#24097 <https://github.com/ceph/ceph/pull/24097>`_, Yingxin)
-* crimson/net: fix unittest_seastar_messenger errors (`pr#23539 <https://github.com/ceph/ceph/pull/23539>`_, Yingxin)
-* crimson/net: implement accepting/connecting states (`pr#24608 <https://github.com/ceph/ceph/pull/24608>`_, Yingxin)
-* crimson/net: miscellaneous fixes to seastar-msgr (`pr#23816 <https://github.com/ceph/ceph/pull/23816>`_, Yingxin, Casey Bodley)
-* crimson/net: misc fixes and features for crimson-messenger tests (`pr#26221 <https://github.com/ceph/ceph/pull/26221>`_, Yingxin Cheng)
-* crimson/net: seastar-msgr refactoring (`pr#24576 <https://github.com/ceph/ceph/pull/24576>`_, Yingxin)
-* crimson/net: s/repeat/keep_doing/ (`pr#23898 <https://github.com/ceph/ceph/pull/23898>`_, Kefu Chai)
-* crimson/osd: add heartbeat support (`pr#26222 <https://github.com/ceph/ceph/pull/26222>`_, Kefu Chai)
-* crimson/osd: add more heartbeat peers (`pr#26255 <https://github.com/ceph/ceph/pull/26255>`_, Kefu Chai)
-* crimson/osd: correct the order of parameters passed to OSD::_preboot() (`pr#26774 <https://github.com/ceph/ceph/pull/26774>`_, chunmei Liu)
-* crimson/osd: crimson osd driver (`pr#25304 <https://github.com/ceph/ceph/pull/25304>`_, Radoslaw Zarzynski, Kefu Chai)
-* crimson/osd: remove "force_new" from ms_get_authorizer() (`pr#26054 <https://github.com/ceph/ceph/pull/26054>`_, Kefu Chai)
-* crimson/osd: send known addresses at boot (`pr#26452 <https://github.com/ceph/ceph/pull/26452>`_, Kefu Chai)
-* crimson: persist/load osdmap to/from store (`pr#26090 <https://github.com/ceph/ceph/pull/26090>`_, Kefu Chai)
-* crimson: port messenger to seastar (`pr#22491 <https://github.com/ceph/ceph/pull/22491>`_, Kefu Chai, Casey Bodley)
-* crimson/thread: add thread pool (`pr#22565 <https://github.com/ceph/ceph/pull/22565>`_, Kefu Chai)
-* crimson/thread: pin thread pool to given CPU (`pr#22776 <https://github.com/ceph/ceph/pull/22776>`_, Kefu Chai)
-* crush/CrushWrapper: silence compiler warning (`pr#25336 <https://github.com/ceph/ceph/pull/25336>`_, Li Wang)
-* crush: fix device_class_clone for unpopulated/empty weight-sets (`issue#23386 <http://tracker.ceph.com/issues/23386>`_, `pr#22127 <https://github.com/ceph/ceph/pull/22127>`_, Sage Weil)
-* crush: fix memory leak (`pr#25959 <https://github.com/ceph/ceph/pull/25959>`_, xie xingguo)
-* crush: fix upmap overkill (`issue#37968 <http://tracker.ceph.com/issues/37968>`_, `pr#26179 <https://github.com/ceph/ceph/pull/26179>`_, xie xingguo)
-* dashboard/mgr: Save button doesn't prevent saving an invalid form (`issue#36426 <http://tracker.ceph.com/issues/36426>`_, `pr#24577 <https://github.com/ceph/ceph/pull/24577>`_, Patrick Nawracay)
-* dashboard: Return float if rate not available (`pr#22313 <https://github.com/ceph/ceph/pull/22313>`_, Boris Ranto)
-* doc: add Ceph Manager Dashboard to top-level TOC (`pr#26390 <https://github.com/ceph/ceph/pull/26390>`_, Nathan Cutler)
-* doc: add ceph-volume inventory sections (`pr#25092 <https://github.com/ceph/ceph/pull/25092>`_, Jan Fajerski)
-* doc: add documentation for iostat (`pr#22034 <https://github.com/ceph/ceph/pull/22034>`_, Mohamad Gebai)
-* doc: added demo document changes section (`pr#24791 <https://github.com/ceph/ceph/pull/24791>`_, James McClune)
-* doc: added rbd default features (`pr#24720 <https://github.com/ceph/ceph/pull/24720>`_, Gaurav Sitlani)
-* doc: added some Civetweb configuration options (`pr#24073 <https://github.com/ceph/ceph/pull/24073>`_, Anton Oks)
-* doc: Added some hints on how to further accelerate builds with ccache (`pr#25394 <https://github.com/ceph/ceph/pull/25394>`_, Lenz Grimmer)
-* doc: add instructions about using "serve-doc" to preview built document (`pr#24471 <https://github.com/ceph/ceph/pull/24471>`_, Kefu Chai)
-* doc: add mds state transition diagram (`issue#22989 <http://tracker.ceph.com/issues/22989>`_, `pr#22996 <https://github.com/ceph/ceph/pull/22996>`_, Patrick Donnelly)
-* doc: Add mention of ceph osd pool stats (`pr#25575 <https://github.com/ceph/ceph/pull/25575>`_, Thore Kruess)
-* doc: add missing 12.2.11 release note (`pr#26596 <https://github.com/ceph/ceph/pull/26596>`_, Nathan Cutler)
-* doc: add note about LVM volumes to ceph-deploy quick start (`pr#23879 <https://github.com/ceph/ceph/pull/23879>`_, David Wahler)
-* doc: add release notes for 12.2.11 luminous (`pr#26228 <https://github.com/ceph/ceph/pull/26228>`_, Abhishek Lekshmanan)
-* doc: add spacing to subcommand references (`pr#24669 <https://github.com/ceph/ceph/pull/24669>`_, James McClune)
-* doc: add "--timeout" option to rbd-nbd (`pr#24302 <https://github.com/ceph/ceph/pull/24302>`_, Stefan Kooman)
-* doc/bluestore: fix minor typos in compression section (`pr#22874 <https://github.com/ceph/ceph/pull/22874>`_, David Disseldorp)
-* doc: broken link on troubleshooting-mon page (`pr#25312 <https://github.com/ceph/ceph/pull/25312>`_, James McClune)
-* doc: bump up sphinx and pyyaml versions (`pr#26044 <https://github.com/ceph/ceph/pull/26044>`_, Kefu Chai)
-* doc: ceph-deploy would not support --cluster option anymore (`pr#26471 <https://github.com/ceph/ceph/pull/26471>`_, Tatsuya Naganawa)
-* doc: ceph: describe application subcommand in ceph man page (`pr#20645 <https://github.com/ceph/ceph/pull/20645>`_, Rishabh Dave)
-* doc: ceph-iscsi-api ports should not be public facing (`pr#24248 <https://github.com/ceph/ceph/pull/24248>`_, Jason Dillaman)
-* doc: ceph-volume describe better the options for migrating away from ceph-disk (`issue#24036 <http://tracker.ceph.com/issues/24036>`_, `pr#21890 <https://github.com/ceph/ceph/pull/21890>`_, Alfredo Deza)
-* doc: ceph-volume dmcrypt and activate --all documentation updates (`issue#24031 <http://tracker.ceph.com/issues/24031>`_, `pr#22062 <https://github.com/ceph/ceph/pull/22062>`_, Alfredo Deza)
-* doc: ceph-volume: expand on why ceph-disk was replaced (`pr#23194 <https://github.com/ceph/ceph/pull/23194>`_, Alfredo Deza)
-* doc: ceph-volume: `lvm batch` documentation and man page updates (`issue#24970 <http://tracker.ceph.com/issues/24970>`_, `pr#23443 <https://github.com/ceph/ceph/pull/23443>`_, Alfredo Deza)
-* doc: ceph-volume:  update batch documentation to explain filestore strategies (`issue#34309 <http://tracker.ceph.com/issues/34309>`_, `pr#23785 <https://github.com/ceph/ceph/pull/23785>`_, Alfredo Deza)
-* doc: ceph-volume: zfs, the initial first submit (`pr#23674 <https://github.com/ceph/ceph/pull/23674>`_, Willem Jan Withagen)
-* doc: cleaned up troubleshooting OSDs documentation (`pr#23519 <https://github.com/ceph/ceph/pull/23519>`_, James McClune)
-* doc: Clean up field names in ServiceDescription and add a service field (`pr#26006 <https://github.com/ceph/ceph/pull/26006>`_, Jeff Layton)
-* doc: cleanup: prune Argonaut-specific verbiage (`pr#22899 <https://github.com/ceph/ceph/pull/22899>`_, Nathan Cutler)
-* doc: cleanup rendering syntax (`pr#22389 <https://github.com/ceph/ceph/pull/22389>`_, Mahati Chamarthy)
-* doc: Clean up the snapshot consistency note (`pr#25655 <https://github.com/ceph/ceph/pull/25655>`_, Greg Farnum)
-* doc: common,mon: add implicit `#include` headers (`pr#23930 <https://github.com/ceph/ceph/pull/23930>`_, Kefu Chai)
-* doc: common/options: add description of osd objectstore backends (`issue#24147 <http://tracker.ceph.com/issues/24147>`_, `pr#22040 <https://github.com/ceph/ceph/pull/22040>`_, Alfredo Deza)
-* doc: corrected options of iscsiadm command (`pr#26395 <https://github.com/ceph/ceph/pull/26395>`_, ZhuJieWen)
-* doc: correct rbytes description (`pr#24966 <https://github.com/ceph/ceph/pull/24966>`_, Xiang Dai)
-* doc: describe RBD QoS settings (`pr#25202 <https://github.com/ceph/ceph/pull/25202>`_, Mykola Golub)
-* doc: doc/bluestore: data doesn't use two partitions (ceph-disk era) (`pr#22604 <https://github.com/ceph/ceph/pull/22604>`_, Alfredo Deza)
-* doc: doc/cephfs: fixup add/remove mds docs (`pr#23836 <https://github.com/ceph/ceph/pull/23836>`_, liu wei)
-* doc: doc/cephfs: remove lingering "experimental" note about multimds (`pr#22852 <https://github.com/ceph/ceph/pull/22852>`_, John Spray)
-* doc: doc/dashboard: don't advise mgr_initial_modules (`pr#22808 <https://github.com/ceph/ceph/pull/22808>`_, John Spray)
-* doc: doc/dashboard: fix formatting on Grafana instructions-2 (`pr#22706 <https://github.com/ceph/ceph/pull/22706>`_, Jos Collin)
-* doc: doc/dashboard: fix formatting on Grafana instructions (`pr#22657 <https://github.com/ceph/ceph/pull/22657>`_, John Spray)
-* doc: doc/dev/cephx_protocol: fix couple errors (`pr#23750 <https://github.com/ceph/ceph/pull/23750>`_, Kefu Chai)
-* doc: doc/dev/index: update rados lead (`pr#24160 <https://github.com/ceph/ceph/pull/24160>`_, Josh Durgin)
-* doc: doc/dev/msgr2.rst: update of the banner and authentication phases (`pr#20094 <https://github.com/ceph/ceph/pull/20094>`_, Ricardo Dias)
-* doc: doc/dev/seastore.rst: initial draft notes (`pr#21381 <https://github.com/ceph/ceph/pull/21381>`_, Sage Weil)
-* doc: doc/dev: Updated component leads table (`pr#24238 <https://github.com/ceph/ceph/pull/24238>`_, Lenz Grimmer)
-* doc:  doc: fix the links in releases/schedule.rst (`pr#22364 <https://github.com/ceph/ceph/pull/22364>`_, Kefu Chai)
-* doc: doc/man: mention import and export commands in rados manpage (`issue#4640 <http://tracker.ceph.com/issues/4640>`_, `pr#23186 <https://github.com/ceph/ceph/pull/23186>`_, Nathan Cutler)
-* doc:  doc: Mention PURGED_SNAPDIRS and RECOVERY_DELETES in Mimic release notes (`pr#22711 <https://github.com/ceph/ceph/pull/22711>`_, Florian Haas)
-* doc: doc/mgr/dashboard: fix typo in mgr ssl setup (`pr#24790 <https://github.com/ceph/ceph/pull/24790>`_, Mehdi Abaakouk)
-* doc: doc/mgr: mention how to clear config setting (`pr#22157 <https://github.com/ceph/ceph/pull/22157>`_, John Spray)
-* doc: doc/mgr: note need for module.py file in plugins (`pr#22622 <https://github.com/ceph/ceph/pull/22622>`_, John Spray)
-* doc: doc/mgr/orchestrator: Add Architecture Image (`pr#26331 <https://github.com/ceph/ceph/pull/26331>`_, Sebastian Wagner, Kefu Chai)
-* doc: doc/mgr/orchestrator: add `wal` to blink lights (`pr#25634 <https://github.com/ceph/ceph/pull/25634>`_, Sebastian Wagner)
-* doc: doc/mgr/prometheus: readd section about custom instance labels (`pr#25182 <https://github.com/ceph/ceph/pull/25182>`_, Jan Fajerski)
-* doc: doc/orchestrator: Aligned Documentation with specification (`pr#25893 <https://github.com/ceph/ceph/pull/25893>`_, Sebastian Wagner)
-* doc: doc/orchestrator: Integrate CLI specification into the documentation (`pr#25119 <https://github.com/ceph/ceph/pull/25119>`_, Sebastian Wagner)
-* doc:  doc: purge subcommand link broken (`pr#24785 <https://github.com/ceph/ceph/pull/24785>`_, James McClune)
-* doc: doc/rados: Add bluestore memory autotuning docs (`pr#25069 <https://github.com/ceph/ceph/pull/25069>`_, Mark Nelson)
-* doc: doc/rados/configuration: add osd scrub {begin,end} week day (`pr#25924 <https://github.com/ceph/ceph/pull/25924>`_, Neha Ojha)
-* doc: doc/rados/configuration/msgr2: some documentation about msgr2 (`pr#26867 <https://github.com/ceph/ceph/pull/26867>`_, Sage Weil)
-* doc: doc/rados/configuration: refresh osdmap section (`pr#26120 <https://github.com/ceph/ceph/pull/26120>`_, Ilya Dryomov)
-* doc: doc/rados: correct osd path in troubleshooting-mon.rst (`pr#24964 <https://github.com/ceph/ceph/pull/24964>`_, songweibin)
-* doc: doc/rados: fixed hit set type link (`pr#23833 <https://github.com/ceph/ceph/pull/23833>`_, James McClune)
-* doc: doc/radosgw/s3.rst: Adding AWS S3 `Storage Class` as `Not Supported` (`pr#19571 <https://github.com/ceph/ceph/pull/19571>`_, Katie Holly)
-* doc: doc/rados/operations: add balancer.rst to TOC (`pr#23684 <https://github.com/ceph/ceph/pull/23684>`_, Kefu Chai)
-* doc: doc/rados/operations: add clay to erasure-code-profile (`pr#26902 <https://github.com/ceph/ceph/pull/26902>`_, Kefu Chai)
-* doc: doc/rados/operations/crush-map-edits: fix 'take' syntax (`pr#24868 <https://github.com/ceph/ceph/pull/24868>`_, Remy Zandwijk, Sage Weil)
-* doc: doc/rados/operations/pg-states: fix PG state names, part 2 (`pr#23165 <https://github.com/ceph/ceph/pull/23165>`_, Nathan Cutler)
-* doc: doc/rados/operations/pg-states: fix PG state names (`pr#21520 <https://github.com/ceph/ceph/pull/21520>`_, Jan Fajerski)
-* doc: doc/rados update invalid bash on bluestore migration (`issue#34317 <http://tracker.ceph.com/issues/34317>`_, `pr#23801 <https://github.com/ceph/ceph/pull/23801>`_, Alfredo Deza)
-* doc: doc/rbd: corrected OpenStack Cinder permissions for Glance pool (`pr#22443 <https://github.com/ceph/ceph/pull/22443>`_, Jason Dillaman)
-* doc: doc/rbd: explicitly state that mirroring requires connectivity to clusters (`pr#24433 <https://github.com/ceph/ceph/pull/24433>`_, Jason Dillaman)
-* doc: doc/rbd/iscsi-target-cli: Update auth command (`pr#26788 <https://github.com/ceph/ceph/pull/26788>`_, Ricardo Marques)
-* doc: doc/rbd/iscsi-target-cli: Update disk separator (`pr#26669 <https://github.com/ceph/ceph/pull/26669>`_, Ricardo Marques)
-* doc: doc/release/luminous: v12.2.6 and v12.2.7 release notes (`pr#23057 <https://github.com/ceph/ceph/pull/23057>`_, Abhishek Lekshmanan, Sage Weil)
-* doc: doc/releases: Add luminous releases 12.2.9 and 10 (`pr#25361 <https://github.com/ceph/ceph/pull/25361>`_, Brad Hubbard)
-* doc: doc/releases: Add Mimic release 13.2.2 (`pr#24509 <https://github.com/ceph/ceph/pull/24509>`_, Brad Hubbard)
-* doc: doc/releases: Mark Jewel EOL (`pr#23698 <https://github.com/ceph/ceph/pull/23698>`_, Brad Hubbard)
-* doc: doc/releases: Mark Mimic first release as June (`pr#24099 <https://github.com/ceph/ceph/pull/24099>`_, Brad Hubbard)
-* doc: doc/releases/mimic.rst: make note of 13.2.2 upgrade bug (`pr#24979 <https://github.com/ceph/ceph/pull/24979>`_, Neha Ojha)
-* doc: doc/releases/mimic: tweak RBD major features (`pr#22011 <https://github.com/ceph/ceph/pull/22011>`_, Jason Dillaman)
-* doc: doc/releases/mimic: Updated dashboard description (`pr#22016 <https://github.com/ceph/ceph/pull/22016>`_, Lenz Grimmer)
-* doc: doc/releases/mimic: upgrade steps (`pr#21987 <https://github.com/ceph/ceph/pull/21987>`_, Sage Weil)
-* doc: doc/releases/nautilus: dashboard package notes (`pr#26815 <https://github.com/ceph/ceph/pull/26815>`_, Kefu Chai)
-* doc: doc/releases/schedule: Add Luminous 12.2.8 (`pr#23972 <https://github.com/ceph/ceph/pull/23972>`_, Brad Hubbard)
-* doc: doc/releases/schedule: add mimic column (`pr#22006 <https://github.com/ceph/ceph/pull/22006>`_, Sage Weil)
-* doc: doc/releases: Update releases to August '18 (`pr#23360 <https://github.com/ceph/ceph/pull/23360>`_, Brad Hubbard)
-* doc: doc/rgw: document placement targets and storage classes (`issue#24508 <http://tracker.ceph.com/issues/24508>`_, `issue#38008 <http://tracker.ceph.com/issues/38008>`_, `pr#26997 <https://github.com/ceph/ceph/pull/26997>`_, Casey Bodley)
-* doc: docs: add Clay code plugin documentation (`pr#24422 <https://github.com/ceph/ceph/pull/24422>`_, Myna)
-* doc: docs: Fixed swift client authentication fail (`pr#23729 <https://github.com/ceph/ceph/pull/23729>`_, Dai Dang Van)
-* doc: docs: radosgw: ldap-auth: fixed option name 'rgw_ldap_searchfilter' (`issue#23081 <http://tracker.ceph.com/issues/23081>`_, `pr#20526 <https://github.com/ceph/ceph/pull/20526>`_, Konstantin Shalygin)
-* doc: doc/start: fix kube-helm.rst typo: docuiment -> document (`pr#23423 <https://github.com/ceph/ceph/pull/23423>`_, Zhou Peng)
-* doc: doc/SubmittingPatches.rst: use Google style guide for doc patches (`pr#22190 <https://github.com/ceph/ceph/pull/22190>`_, Nathan Cutler)
-* doc: Document correction (`pr#23926 <https://github.com/ceph/ceph/pull/23926>`_, Gangbiao Liu)
-* doc: Document mappings of S3 Operations to ACL grants (`pr#26827 <https://github.com/ceph/ceph/pull/26827>`_, Adam C. Emerson)
-* doc: document sizing for `block.db` (`pr#23210 <https://github.com/ceph/ceph/pull/23210>`_, Alfredo Deza)
-* doc: document vstart options (`pr#22467 <https://github.com/ceph/ceph/pull/22467>`_, Mao Zhongyi)
-* doc: doc/user-management: Remove obsolete reset caps command (`issue#37663 <http://tracker.ceph.com/issues/37663>`_, `pr#25550 <https://github.com/ceph/ceph/pull/25550>`_, Brad Hubbard)
-* doc: edit on github (`pr#24452 <https://github.com/ceph/ceph/pull/24452>`_, Neha Ojha, Noah Watkins)
-* doc: erasure-code-clay fixes typos (`pr#24653 <https://github.com/ceph/ceph/pull/24653>`_, Myna)
-* doc: erasure-code-jerasure: removed default section of crush-device-class (`pr#21279 <https://github.com/ceph/ceph/pull/21279>`_, Junyoung Sung)
-* doc: examples/librados: Remove not needed else clauses (`pr#24939 <https://github.com/ceph/ceph/pull/24939>`_, Marcos Paulo de Souza)
-* doc: explain 'firstn v indep' in the CRUSH docs (`pr#24255 <https://github.com/ceph/ceph/pull/24255>`_, Greg Farnum)
-* doc: Fix a couple typos and improve diagram formatting (`pr#23496 <https://github.com/ceph/ceph/pull/23496>`_, Bryan Stillwell)
-* doc: fix a typo in doc/mgr/telegraf.rst (`pr#22267 <https://github.com/ceph/ceph/pull/22267>`_, Enming Zhang)
-* doc: fix cephfs spelling errors (`pr#23763 <https://github.com/ceph/ceph/pull/23763>`_, Chen Zhenghua)
-* doc: fix/cleanup freebsd osd disk creation (`pr#23600 <https://github.com/ceph/ceph/pull/23600>`_, Willem Jan Withagen)
-* doc: Fix Create a Cluster url in Running Multiple Clusters (`issue#37764 <http://tracker.ceph.com/issues/37764>`_, `pr#25705 <https://github.com/ceph/ceph/pull/25705>`_, Jos Collin)
-* doc: Fix EC k=3 m=2 profile overhead calculation example (`pr#20581 <https://github.com/ceph/ceph/pull/20581>`_, Charles Alva)
-* doc: fixed broken urls (`pr#23564 <https://github.com/ceph/ceph/pull/23564>`_, James McClune)
-* doc: fixed grammar in restore rbd image section (`pr#22944 <https://github.com/ceph/ceph/pull/22944>`_, James McClune)
-* doc: fixed links in Pools section (`pr#23431 <https://github.com/ceph/ceph/pull/23431>`_, James McClune)
-* doc: fixed minor typo in Debian packages section (`pr#22878 <https://github.com/ceph/ceph/pull/22878>`_, James McClune)
-* doc: fixed restful mgr module SSL configuration commands (`pr#21864 <https://github.com/ceph/ceph/pull/21864>`_, Lenz Grimmer)
-* doc: Fixed spelling errors in configuration section (`pr#23719 <https://github.com/ceph/ceph/pull/23719>`_, Bryan Stillwell)
-* doc: Fixed syntax in iscsi initiator windows doc (`pr#25467 <https://github.com/ceph/ceph/pull/25467>`_, Michel Raabe)
-* doc: Fixed the paragraph and boxes (`pr#25094 <https://github.com/ceph/ceph/pull/25094>`_, Scoots Hamilton)
-* doc: Fixed the wrong numbers in mgr/dashboard.rst (`pr#22658 <https://github.com/ceph/ceph/pull/22658>`_, Jos Collin)
-* doc: fixed typo in add-or-rm-mons.rst (`pr#26250 <https://github.com/ceph/ceph/pull/26250>`_, James McClune)
-* doc: fixed typo in cephfs snapshots (`pr#23764 <https://github.com/ceph/ceph/pull/23764>`_, Kai Wagner)
-* doc: fixed typo in CRUSH map docs (`pr#25953 <https://github.com/ceph/ceph/pull/25953>`_, James McClune)
-* doc: fixed typo in man page (`pr#24792 <https://github.com/ceph/ceph/pull/24792>`_, James McClune)
-* doc: Fix incorrect mention of 'osd_deep_mon_scrub_interval' (`pr#26522 <https://github.com/ceph/ceph/pull/26522>`_, Ashish Singh)
-* doc: Fix iSCSI docs URL (`pr#26296 <https://github.com/ceph/ceph/pull/26296>`_, Ricardo Marques)
-* doc: fix iscsi target name when configuring target (`pr#21906 <https://github.com/ceph/ceph/pull/21906>`_, Venky Shankar)
-* doc: fix long description error for rgw_period_root_pool (`pr#23814 <https://github.com/ceph/ceph/pull/23814>`_, yuliyang)
-* doc: fix some it's -> its typos (`pr#22802 <https://github.com/ceph/ceph/pull/22802>`_, Brad Fitzpatrick)
-* doc: Fix some typos (`pr#25060 <https://github.com/ceph/ceph/pull/25060>`_, mooncake)
-* doc: Fix Spelling Error In File "ceph.rst" (`pr#23917 <https://github.com/ceph/ceph/pull/23917>`_, Gangbiao Liu)
-* doc: Fix Spelling Error In File dynamicresharding.rst (`pr#24175 <https://github.com/ceph/ceph/pull/24175>`_, xiaomanh)
-* doc: Fix Spelling Error of Rados Deployment/Operations (`pr#23746 <https://github.com/ceph/ceph/pull/23746>`_, Li Bingyang)
-* doc: Fix Spelling Error of Radosgw (`pr#23948 <https://github.com/ceph/ceph/pull/23948>`_, Li Bingyang)
-* doc: Fix Spelling Error of Radosgw (`pr#24000 <https://github.com/ceph/ceph/pull/24000>`_, Li Bingyang)
-* doc: Fix Spelling Error of Radosgw (`pr#24021 <https://github.com/ceph/ceph/pull/24021>`_, Li Bingyang)
-* doc: Fix Spelling Error of Rados Operations (`pr#23891 <https://github.com/ceph/ceph/pull/23891>`_, Li Bingyang)
-* doc: Fix Spelling Error of Rados Operations (`pr#23900 <https://github.com/ceph/ceph/pull/23900>`_, Li Bingyang)
-* doc: Fix Spelling Error of Rados Operations (`pr#23903 <https://github.com/ceph/ceph/pull/23903>`_, Li Bingyang)
-* doc: fix spelling errors in rbd doc (`pr#23765 <https://github.com/ceph/ceph/pull/23765>`_, Chen Zhenghua)
-* doc: fix spelling errors of cephfs (`pr#23745 <https://github.com/ceph/ceph/pull/23745>`_, Chen Zhenghua)
-* doc: fix the broken urls (`issue#25185 <http://tracker.ceph.com/issues/25185>`_, `pr#23310 <https://github.com/ceph/ceph/pull/23310>`_, Jos Collin)
-* doc: fix the formatting of HTTP Frontends documentation (`pr#25723 <https://github.com/ceph/ceph/pull/25723>`_, James McClune)
-* doc: fix typo and format issues in quick start documentation (`pr#23705 <https://github.com/ceph/ceph/pull/23705>`_, Chen Zhenghua)
-* doc: fix typo in add-or-rm-mons (`pr#25661 <https://github.com/ceph/ceph/pull/25661>`_, Jos Collin)
-* doc: Fix typo in ceph-fuse(8) (`pr#22214 <https://github.com/ceph/ceph/pull/22214>`_, Jos Collin)
-* doc: fix typo in erasure coding example (`pr#25737 <https://github.com/ceph/ceph/pull/25737>`_, Arthur Liu)
-* doc: Fix typos in Developer Guide (`pr#24067 <https://github.com/ceph/ceph/pull/24067>`_, Li Bingyang)
-* doc: fix typos in doc/releases (`pr#24186 <https://github.com/ceph/ceph/pull/24186>`_, Li Bingyang)
-* doc: \*/: fix typos in docs,messages,logs,comments (`pr#24139 <https://github.com/ceph/ceph/pull/24139>`_, Kefu Chai)
-* doc: Fix Typos of Developer Guide (`pr#24094 <https://github.com/ceph/ceph/pull/24094>`_, Li Bingyang)
-* doc: fix typos (`pr#22174 <https://github.com/ceph/ceph/pull/22174>`_, Mao Zhongyi)
-* doc: .githubmap, .mailmap, .organizationmap: update contributors (`pr#24756 <https://github.com/ceph/ceph/pull/24756>`_, Tiago Melo)
-* doc: githubmap, organizationmap: cleanup and add/update contributors/affiliation (`pr#22734 <https://github.com/ceph/ceph/pull/22734>`_, Tatjana Dehler)
-* doc: give pool name if default pool rbd is not created (`pr#24750 <https://github.com/ceph/ceph/pull/24750>`_, Changcheng Liu)
-* doc: Improve docs osd_recovery_priority, osd_recovery_op_priority and related (`pr#26705 <https://github.com/ceph/ceph/pull/26705>`_, David Zafman)
-* doc: Improve OpenStack integration and multitenancy docs for radosgw (`issue#36765 <http://tracker.ceph.com/issues/36765>`_, `pr#25056 <https://github.com/ceph/ceph/pull/25056>`_, Florian Haas)
-* doc: install build-doc deps without git clone (`pr#24416 <https://github.com/ceph/ceph/pull/24416>`_, Noah Watkins)
-* doc: Luminous v12.2.10 release notes (`pr#25034 <https://github.com/ceph/ceph/pull/25034>`_, Nathan Cutler)
-* doc: Luminous v12.2.9 release notes (`pr#24779 <https://github.com/ceph/ceph/pull/24779>`_, Nathan Cutler)
-* doc: make it easier to reach the old dev doc TOC (`pr#23253 <https://github.com/ceph/ceph/pull/23253>`_, Nathan Cutler)
-* doc: mention CVEs in luminous v12.2.11 release notes (`pr#26312 <https://github.com/ceph/ceph/pull/26312>`_, Nathan Cutler, Abhishek Lekshmanan)
-* doc: mgr/dashboard: Add documentation about supported browsers (`issue#27207 <http://tracker.ceph.com/issues/27207>`_, `pr#23712 <https://github.com/ceph/ceph/pull/23712>`_, Tiago Melo)
-* doc: mgr/dashboard: Added missing tooltip to settings icon (`pr#23935 <https://github.com/ceph/ceph/pull/23935>`_, Lenz Grimmer)
-* doc: mgr/dashboard: Add hints to resolve unit test failures (`pr#23627 <https://github.com/ceph/ceph/pull/23627>`_, Stephan Müller)
-* doc: mgr/dashboard: Cleaner notifications (`pr#23315 <https://github.com/ceph/ceph/pull/23315>`_, Stephan Müller)
-* doc: mgr/dashboard: Cleanup of summary refresh test (`pr#25504 <https://github.com/ceph/ceph/pull/25504>`_, Stephan Müller)
-* doc: mgr/dashboard: Document custom RESTController endpoints (`pr#25322 <https://github.com/ceph/ceph/pull/25322>`_, Stephan Müller)
-* doc: mgr/dashboard: Fixed documentation link on RGW page (`pr#24612 <https://github.com/ceph/ceph/pull/24612>`_, Tina Kallio)
-* doc: mgr/dashboard: Fix some setup steps in HACKING.rst (`pr#24788 <https://github.com/ceph/ceph/pull/24788>`_, Ranjitha G)
-* doc: mgr/dashboard: Improve prettier scripts and documentation (`pr#22994 <https://github.com/ceph/ceph/pull/22994>`_, Tiago Melo)
-* doc: mgr/dashboard/qa: add missing dashboard suites (`pr#25084 <https://github.com/ceph/ceph/pull/25084>`_, Tatjana Dehler)
-* doc: mgr/dashboard: updated SSO documentation (`pr#25943 <https://github.com/ceph/ceph/pull/25943>`_, Alfonso Martínez)
-* doc: mgr/dashboard: Update I18N documentation (`pr#25159 <https://github.com/ceph/ceph/pull/25159>`_, Tiago Melo)
-* doc: mgr/orch: Fix remote_host doc reference (`issue#38254 <http://tracker.ceph.com/issues/38254>`_, `pr#26360 <https://github.com/ceph/ceph/pull/26360>`_, Ernesto Puerta)
-* doc/mgr/plugins.rst: explain more about the plugin command protocol (`pr#22629 <https://github.com/ceph/ceph/pull/22629>`_, Dan Mick)
-* doc: mimic is stable! (`pr#22350 <https://github.com/ceph/ceph/pull/22350>`_, Abhishek Lekshmanan)
-* doc: mimic rc1 release notes (`pr#20975 <https://github.com/ceph/ceph/pull/20975>`_, Abhishek Lekshmanan)
-* doc: Multiple spelling fixes (`pr#23514 <https://github.com/ceph/ceph/pull/23514>`_, Bryan Stillwell)
-* doc: numbered eviction situations (`pr#24618 <https://github.com/ceph/ceph/pull/24618>`_, Scoots Hamilton)
-* doc: osdmaptool/cleanup: Completed osdmaptool's usage (`issue#3214 <http://tracker.ceph.com/issues/3214>`_, `pr#13925 <https://github.com/ceph/ceph/pull/13925>`_, Vedant Nanda)
-* doc: osd/PrimaryLogPG: avoid dereferencing invalid complete_to (`pr#23894 <https://github.com/ceph/ceph/pull/23894>`_, xie xingguo)
-* doc: osd/PrimaryLogPG: rename list_missing -> list_unfound command (`pr#23723 <https://github.com/ceph/ceph/pull/23723>`_, xie xingguo)
-* doc: PendingReleaseNotes: note newly added CLAY code (`pr#24491 <https://github.com/ceph/ceph/pull/24491>`_, Kefu Chai)
-* doc: print pg peering in SVG instead of PNG (`pr#20366 <https://github.com/ceph/ceph/pull/20366>`_, Aleksei Gutikov)
-* doc: Put command template into literal block (`pr#24999 <https://github.com/ceph/ceph/pull/24999>`_, Alexey Stupnikov)
-* doc: qa/mgr/selftest: handle always-on module fall out (`issue#26994 <http://tracker.ceph.com/issues/26994>`_, `pr#23681 <https://github.com/ceph/ceph/pull/23681>`_, Noah Watkins)
-* doc: qa: Task to emulate network delay and packet drop between two given h… (`pr#23602 <https://github.com/ceph/ceph/pull/23602>`_, Shilpa Jagannath)
-* doc: qa/workunits/rbd: replace usage of 'rados rmpool' (`pr#23942 <https://github.com/ceph/ceph/pull/23942>`_, Mykola Golub)
-* doc: release/mimic: correct the changelog to the latest version (`pr#22319 <https://github.com/ceph/ceph/pull/22319>`_, Abhishek Lekshmanan)
-* doc: release notes for 12.2.8 luminous (`pr#23909 <https://github.com/ceph/ceph/pull/23909>`_, Abhishek Lekshmanan)
-* doc: release notes for 13.2.2 mimic (`pr#24266 <https://github.com/ceph/ceph/pull/24266>`_, Abhishek Lekshmanan)
-* doc: releases: mimic 13.2.1 release notes (`pr#23288 <https://github.com/ceph/ceph/pull/23288>`_, Abhishek Lekshmanan)
-* doc: releases: release notes for v10.2.11 Jewel (`pr#22989 <https://github.com/ceph/ceph/pull/22989>`_, Abhishek Lekshmanan)
-* doc: remove CZ mirror (`pr#21797 <https://github.com/ceph/ceph/pull/21797>`_, Tomáš Kukrál)
-* doc: remove deprecated 'scrubq' from ceph(8) (`issue#35813 <http://tracker.ceph.com/issues/35813>`_, `pr#23959 <https://github.com/ceph/ceph/pull/23959>`_, Ruben Kerkhof)
-* doc: remove documentation for installing google-perftools on Debian systems (`pr#22701 <https://github.com/ceph/ceph/pull/22701>`_, James McClune)
-* doc: remove duplicate python packages (`pr#22203 <https://github.com/ceph/ceph/pull/22203>`_, Stefan Kooman)
-* doc: Remove upstart files and references (`pr#23582 <https://github.com/ceph/ceph/pull/23582>`_, Brad Hubbard)
-* doc: Remove value 'mon_osd_max_split_count' (`pr#26584 <https://github.com/ceph/ceph/pull/26584>`_, Kai Wagner)
-* doc: replace rgw_namespace_expire_secs with rgw_nfs_namespace_expire_secs (`pr#20794 <https://github.com/ceph/ceph/pull/20794>`_, chnmagnus)
-* doc: rewrote the iscsi-target-cli installation (`pr#23190 <https://github.com/ceph/ceph/pull/23190>`_, Massimiliano Cuttini)
-* doc: rgw: fix tagging support status (`issue#24164 <http://tracker.ceph.com/issues/24164>`_, `pr#22206 <https://github.com/ceph/ceph/pull/22206>`_, Abhishek Lekshmanan)
-* doc: rgw: fix the default value of usage log setting (`issue#37856 <http://tracker.ceph.com/issues/37856>`_, `pr#25892 <https://github.com/ceph/ceph/pull/25892>`_, Abhishek Lekshmanan)
-* doc: Rook/orchestrator doc fixes (`pr#23472 <https://github.com/ceph/ceph/pull/23472>`_, John Spray)
-* doc: s/doc/ref for dashboard urls (`pr#22772 <https://github.com/ceph/ceph/pull/22772>`_, Jos Collin)
-* doc: sort releases by date and version (`pr#25972 <https://github.com/ceph/ceph/pull/25972>`_, Noah Watkins)
-* doc: Spelling fixes in BlueStore config reference (`pr#23715 <https://github.com/ceph/ceph/pull/23715>`_, Bryan Stillwell)
-* doc: Spelling fixes in Network config reference (`pr#23727 <https://github.com/ceph/ceph/pull/23727>`_, libingyang)
-* doc: SubmittingPatches: added inline markup to important references (`pr#25978 <https://github.com/ceph/ceph/pull/25978>`_, James McClune)
-* docs: update rgw info for mimic (`pr#22305 <https://github.com/ceph/ceph/pull/22305>`_, Yehuda Sadeh)
-* doc: test/crimson: do not use unit.cc as the driver of unittest_seastar_denc (`pr#23937 <https://github.com/ceph/ceph/pull/23937>`_, Kefu Chai)
-* doc: test/fio: Added tips for compilation of fio with 'rados' engine (`pr#24199 <https://github.com/ceph/ceph/pull/24199>`_, Adam Kupczyk)
-* doc: test/msgr: add missing #include (`pr#23947 <https://github.com/ceph/ceph/pull/23947>`_, Kefu Chai)
-* doc: Tidy up description wording and spelling (`pr#22599 <https://github.com/ceph/ceph/pull/22599>`_, Anthony D'Atri)
-* doc: tweak RBD iSCSI docs to point to merged tooling repo (`pr#24963 <https://github.com/ceph/ceph/pull/24963>`_, Jason Dillaman)
-* doc: typo fixes, s/Requered/Required/ (`pr#26406 <https://github.com/ceph/ceph/pull/26406>`_, Drunkard Zhang)
-* doc: update blkin changes (`pr#22317 <https://github.com/ceph/ceph/pull/22317>`_, Mahati Chamarthy)
-* doc: Update cpp.rst to accommodate the new APIs in libs3 (`pr#22162 <https://github.com/ceph/ceph/pull/22162>`_, Zhanhao Liu)
-* doc: Updated Ceph Dashboard documentation (`pr#26626 <https://github.com/ceph/ceph/pull/26626>`_, Lenz Grimmer)
-* doc: updated Ceph documentation links (`pr#25797 <https://github.com/ceph/ceph/pull/25797>`_, James McClune)
-* doc: updated cluster map reference link (`pr#24460 <https://github.com/ceph/ceph/pull/24460>`_, James McClune)
-* doc: updated crush map tunables link (`pr#24462 <https://github.com/ceph/ceph/pull/24462>`_, James McClune)
-* doc: Updated dashboard documentation (features, SSL config) (`pr#22059 <https://github.com/ceph/ceph/pull/22059>`_, Lenz Grimmer)
-* doc: Updated feature list and overview in dashboard.rst (`pr#26143 <https://github.com/ceph/ceph/pull/26143>`_, Lenz Grimmer)
-* doc: updated get-involved.rst for ceph-dashboard (`pr#22663 <https://github.com/ceph/ceph/pull/22663>`_, Jos Collin)
-* doc: Updated Mgr Dashboard documentation (`pr#24030 <https://github.com/ceph/ceph/pull/24030>`_, Lenz Grimmer)
-* doc: updated multisite documentation (`issue#26997 <http://tracker.ceph.com/issues/26997>`_, `pr#23660 <https://github.com/ceph/ceph/pull/23660>`_, James McClune)
-* doc: updated reference link for creating new disk offerings in cloudstack (`pr#22250 <https://github.com/ceph/ceph/pull/22250>`_, James McClune)
-* doc: updated reference link for log based PG (`pr#26611 <https://github.com/ceph/ceph/pull/26611>`_, James McClune)
-* doc: updated rgw multitenancy link (`pr#25929 <https://github.com/ceph/ceph/pull/25929>`_, James McClune)
-* doc: updated the overview and glossary for dashboard (`pr#22750 <https://github.com/ceph/ceph/pull/22750>`_, Jos Collin)
-* doc: updated wording from federated to multisite (`pr#24670 <https://github.com/ceph/ceph/pull/24670>`_, James McClune)
-* doc: Update mgr/zabbix plugin documentation with link to Zabbix template (`pr#24584 <https://github.com/ceph/ceph/pull/24584>`_, Wido den Hollander)
-* doc: update the description for SPDK in bluestore-config-ref.rst (`pr#22365 <https://github.com/ceph/ceph/pull/22365>`_, tone-zhang)
-* doc: use :command: for subcommands in ceph-bluestore-tool manpage (`issue#24800 <http://tracker.ceph.com/issues/24800>`_, `pr#23114 <https://github.com/ceph/ceph/pull/23114>`_, Nathan Cutler)
-* doc: use preferred commands for ceph config-key (`pr#26527 <https://github.com/ceph/ceph/pull/26527>`_, Changcheng Liu)
-* doc: warn about how 'rados put' works in the manpage (`pr#25757 <https://github.com/ceph/ceph/pull/25757>`_, Greg Farnum)
-* doc: Wip githubmap (`pr#25950 <https://github.com/ceph/ceph/pull/25950>`_, Greg Farnum)
-* erasure-code,test: silence -Wunused-variable warnings (`pr#25200 <https://github.com/ceph/ceph/pull/25200>`_, Kefu Chai)
-* example/librados: remove dependency on Boost system library (`issue#25054 <http://tracker.ceph.com/issues/25054>`_, `pr#23159 <https://github.com/ceph/ceph/pull/23159>`_, Nathan Cutler)
-* githubmap: update contributors (`pr#22522 <https://github.com/ceph/ceph/pull/22522>`_, Kefu Chai)
-* git: Ignore tags anywhere (`pr#26159 <https://github.com/ceph/ceph/pull/26159>`_, David Zafman)
-* include/buffer.h: do not use ceph_assert() unless __CEPH__ is defined (`pr#23803 <https://github.com/ceph/ceph/pull/23803>`_, Kefu Chai)
-* install-deps.sh: Fixes for RHEL 7 (`pr#26393 <https://github.com/ceph/ceph/pull/26393>`_, Zack Cerza)
-* kv/MemDB: add perfcounter (`pr#10305 <https://github.com/ceph/ceph/pull/10305>`_, Jianpeng Ma)
-* librados: add a rados_omap_iter_size function (`issue#26948 <http://tracker.ceph.com/issues/26948>`_, `pr#23593 <https://github.com/ceph/ceph/pull/23593>`_, Jeff Layton)
-* librados: block MgrClient::start_command until mgrmap (`pr#21811 <https://github.com/ceph/ceph/pull/21811>`_, John Spray, Kefu Chai)
-* librados: fix admin/build-doc warning (`pr#25706 <https://github.com/ceph/ceph/pull/25706>`_, Jos Collin)
-* librados: fix buffer overflow for aio_exec python binding (`pr#21775 <https://github.com/ceph/ceph/pull/21775>`_, Aleksei Gutikov)
-* librados: fix unitialized timeout in wait_for_osdmap (`pr#24721 <https://github.com/ceph/ceph/pull/24721>`_, Casey Bodley)
-* librados: Include memory for unique_ptr definition (`issue#35833 <http://tracker.ceph.com/issues/35833>`_, `pr#23992 <https://github.com/ceph/ceph/pull/23992>`_, Brad Hubbard)
-* librados: Reject the invalid pool create request at client side, rath… (`pr#21299 <https://github.com/ceph/ceph/pull/21299>`_, Yang Honggang)
-* librados: return ENOENT if pool_id invalid (`pr#21609 <https://github.com/ceph/ceph/pull/21609>`_, Li Wang)
-* librados: split C++ and C APIs into different source files (`pr#24616 <https://github.com/ceph/ceph/pull/24616>`_, Kefu Chai)
-* librados: use ceph::async::Completion for asio bindings (`pr#21920 <https://github.com/ceph/ceph/pull/21920>`_, Casey Bodley)
-* librados: use steady clock for rados_mon_op_timeout (`pr#20004 <https://github.com/ceph/ceph/pull/20004>`_, Mohamad Gebai)
-* librbd: add missing shutdown states to managed lock helper (`issue#38387 <http://tracker.ceph.com/issues/38387>`_, `pr#26523 <https://github.com/ceph/ceph/pull/26523>`_, Jason Dillaman)
-* librbd: add new configuration option to always move deleted items to the trash (`pr#24476 <https://github.com/ceph/ceph/pull/24476>`_, Jason Dillaman)
-* librbd: add rbd image access/modified timestamps (`pr#21114 <https://github.com/ceph/ceph/pull/21114>`_, Julien Collet)
-* librbd: add trash purge api calls (`pr#24427 <https://github.com/ceph/ceph/pull/24427>`_, Julien Collet, Theofilos Mouratidis, Jason Dillaman)
-* librbd: always open first parent image if it exists for a snapshot (`pr#23733 <https://github.com/ceph/ceph/pull/23733>`_, Jason Dillaman)
-* librbd: avoid aggregate-initializing any static_visitor (`pr#26876 <https://github.com/ceph/ceph/pull/26876>`_, Willem Jan Withagen)
-* librbd: blacklisted client might not notice it lost the lock (`issue#34534 <http://tracker.ceph.com/issues/34534>`_, `pr#23829 <https://github.com/ceph/ceph/pull/23829>`_, Jason Dillaman)
-* librbd: block_name_prefix is not created randomly (`issue#24634 <http://tracker.ceph.com/issues/24634>`_, `pr#22675 <https://github.com/ceph/ceph/pull/22675>`_, hyun-ha)
-* librbd: bypass pool validation if "rbd_validate_pool" is false (`pr#26878 <https://github.com/ceph/ceph/pull/26878>`_, Jason Dillaman)
-* librbd: commit IO as safe when complete if writeback cache is disabled (`issue#23516 <http://tracker.ceph.com/issues/23516>`_, `pr#22342 <https://github.com/ceph/ceph/pull/22342>`_, Jason Dillaman)
-* librbd: corrected usage of ImageState::open flag parameter (`pr#25428 <https://github.com/ceph/ceph/pull/25428>`_, Mykola Golub)
-* librbd: deep_copy: don't hide parent if zero overlap for snapshot (`issue#24545 <http://tracker.ceph.com/issues/24545>`_, `pr#22587 <https://github.com/ceph/ceph/pull/22587>`_, Mykola Golub)
-* librbd: deep copy optionally support flattening cloned image (`issue#22787 <http://tracker.ceph.com/issues/22787>`_, `pr#21624 <https://github.com/ceph/ceph/pull/21624>`_, Mykola Golub)
-* librbd: deep_copy: resize head object map if needed (`issue#24399 <http://tracker.ceph.com/issues/24399>`_, `pr#22415 <https://github.com/ceph/ceph/pull/22415>`_, Mykola Golub)
-* librbd: deep-copy should not write to objects that cannot exist (`issue#25000 <http://tracker.ceph.com/issues/25000>`_, `pr#23132 <https://github.com/ceph/ceph/pull/23132>`_, Jason Dillaman)
-* librbd: disable image mirroring when moving to trash (`pr#25509 <https://github.com/ceph/ceph/pull/25509>`_, Mykola Golub)
-* librbd: disallow trash restoring when image being migrated (`pr#25529 <https://github.com/ceph/ceph/pull/25529>`_, songweibin)
-* librbd: don't do create+truncate for discards with copyup (`pr#26825 <https://github.com/ceph/ceph/pull/26825>`_, Ilya Dryomov)
-* librbd: ensure compare-and-write doesn't skip compare after copyup (`issue#38383 <http://tracker.ceph.com/issues/38383>`_, `pr#26519 <https://github.com/ceph/ceph/pull/26519>`_, Ilya Dryomov)
-* librbd: extend API to include parent/child namespaces and image ids (`issue#36650 <http://tracker.ceph.com/issues/36650>`_, `pr#25194 <https://github.com/ceph/ceph/pull/25194>`_, Jason Dillaman)
-* librbd: fix crash when opening nonexistent snapshot (`issue#24637 <http://tracker.ceph.com/issues/24637>`_, `pr#22676 <https://github.com/ceph/ceph/pull/22676>`_, Mykola Golub)
-* librbd: fixed assert when flattening clone with zero overlap (`issue#35702 <http://tracker.ceph.com/issues/35702>`_, `pr#24045 <https://github.com/ceph/ceph/pull/24045>`_, Jason Dillaman)
-* librbd: fix missing unblock_writes if shrink is not allowed (`issue#36778 <http://tracker.ceph.com/issues/36778>`_, `pr#25055 <https://github.com/ceph/ceph/pull/25055>`_, runsisi)
-* librbd: fix possible unnecessary latency when requeue request (`pr#23815 <https://github.com/ceph/ceph/pull/23815>`_, Song Shun)
-* librbd: fix potential live migration after commit issues due to not refreshed image header (`pr#23839 <https://github.com/ceph/ceph/pull/23839>`_, Mykola Golub)
-* librbd: fix were_all_throttled() to avoid incorrect ret-value (`issue#38504 <http://tracker.ceph.com/issues/38504>`_, `pr#26688 <https://github.com/ceph/ceph/pull/26688>`_, Dongsheng Yang)
-* librbd: flatten operation should use object map (`issue#23445 <http://tracker.ceph.com/issues/23445>`_, `pr#23941 <https://github.com/ceph/ceph/pull/23941>`_, Mykola Golub)
-* librbd: force 'invalid object map' flag on-disk update (`issue#24434 <http://tracker.ceph.com/issues/24434>`_, `pr#22444 <https://github.com/ceph/ceph/pull/22444>`_, Mykola Golub)
-* librbd: get_parent API method should properly handle migrating image (`issue#37998 <http://tracker.ceph.com/issues/37998>`_, `pr#26337 <https://github.com/ceph/ceph/pull/26337>`_, Jason Dillaman)
-* librbd: handle aio failure in ManagedLock and PreReleaseRequest (`pr#20112 <https://github.com/ceph/ceph/pull/20112>`_, liyichao)
-* librbd: improve object map performance under high IOPS workloads (`issue#38538 <http://tracker.ceph.com/issues/38538>`_, `pr#26721 <https://github.com/ceph/ceph/pull/26721>`_, Jason Dillaman)
-* librbd: journaling unable request can not be sent to remote lock owner (`issue#26939 <http://tracker.ceph.com/issues/26939>`_, `pr#23649 <https://github.com/ceph/ceph/pull/23649>`_, Mykola Golub)
-* librbd: keep access/modified timestamp updates out of IO path (`issue#37745 <http://tracker.ceph.com/issues/37745>`_, `pr#25883 <https://github.com/ceph/ceph/pull/25883>`_, Jason Dillaman)
-* librbd: make it possible to migrate parent images (`pr#25945 <https://github.com/ceph/ceph/pull/25945>`_, Mykola Golub)
-* librbd: move mirror peer attribute handling from CLI to API (`pr#25096 <https://github.com/ceph/ceph/pull/25096>`_, Jason Dillaman)
-* librbd: namespace create/remove/list support (`pr#22608 <https://github.com/ceph/ceph/pull/22608>`_, Jason Dillaman)
-* librbd: object copy state machine might dereference a deleted object (`issue#36220 <http://tracker.ceph.com/issues/36220>`_, `pr#24293 <https://github.com/ceph/ceph/pull/24293>`_, Jason Dillaman)
-* librbd: object map improperly flagged as invalidated (`issue#24516 <http://tracker.ceph.com/issues/24516>`_, `pr#24105 <https://github.com/ceph/ceph/pull/24105>`_, Jason Dillaman)
-* librbd: optionally limit journal in-flight appends (`pr#22983 <https://github.com/ceph/ceph/pull/22983>`_, Mykola Golub)
-* librbd:optionally support FUA (force unit access) on write requests (`issue#19366 <http://tracker.ceph.com/issues/19366>`_, `pr#22945 <https://github.com/ceph/ceph/pull/22945>`_, ningtao)
-* librbd: pool and image level config overrides (`pr#23743 <https://github.com/ceph/ceph/pull/23743>`_, Mykola Golub)
-* librbd: potential object map race with copyup state machine (`issue#24516 <http://tracker.ceph.com/issues/24516>`_, `pr#24253 <https://github.com/ceph/ceph/pull/24253>`_, Jason Dillaman)
-* librbd: potential race on image create request complete (`issue#24910 <http://tracker.ceph.com/issues/24910>`_, `pr#23639 <https://github.com/ceph/ceph/pull/23639>`_, Mykola Golub)
-* librbd: prevent the use of internal feature bits from external users (`issue#24165 <http://tracker.ceph.com/issues/24165>`_, `pr#22072 <https://github.com/ceph/ceph/pull/22072>`_, Jason Dillaman)
-* librbd: prevent use of namespaces on pre-nautilus OSDs (`pr#23823 <https://github.com/ceph/ceph/pull/23823>`_, Jason Dillaman)
-* librbd: properly filter out trashed non-user images on purge (`pr#26079 <https://github.com/ceph/ceph/pull/26079>`_, Mykola Golub)
-* librbd: properly handle potential object map failures (`issue#36074 <http://tracker.ceph.com/issues/36074>`_, `pr#24179 <https://github.com/ceph/ceph/pull/24179>`_, Jason Dillaman)
-* librbd: race condition possible when validating RBD pool (`issue#38500 <http://tracker.ceph.com/issues/38500>`_, `pr#26683 <https://github.com/ceph/ceph/pull/26683>`_, Jason Dillaman)
-* librbd: reduce the TokenBucket fill cycle and support bursting io configuration (`pr#24214 <https://github.com/ceph/ceph/pull/24214>`_, Shiyang Ruan)
-* librbd: remove template declaration of a non-template function (`pr#23790 <https://github.com/ceph/ceph/pull/23790>`_, Shiyang Ruan)
-* librbd: reset snaps in rbd_snap_list() (`issue#37508 <http://tracker.ceph.com/issues/37508>`_, `pr#25379 <https://github.com/ceph/ceph/pull/25379>`_, Kefu Chai)
-* librbd: restart io if migration parent gone (`issue#36710 <http://tracker.ceph.com/issues/36710>`_, `pr#25175 <https://github.com/ceph/ceph/pull/25175>`_, Mykola Golub)
-* librbd: send_copyup() fixes and cleanups (`pr#26483 <https://github.com/ceph/ceph/pull/26483>`_, Ilya Dryomov)
-* librbd: simplify config override handling (`pr#24450 <https://github.com/ceph/ceph/pull/24450>`_, Jason Dillaman)
-* librbd: skip small, unaligned discard extents by default (`issue#38146 <http://tracker.ceph.com/issues/38146>`_, `pr#26432 <https://github.com/ceph/ceph/pull/26432>`_, Jason Dillaman)
-* librbd: support bps throttle and throttle read and write seperately (`pr#21635 <https://github.com/ceph/ceph/pull/21635>`_, Dongsheng Yang)
-* librbd: support migrating images with minimal downtime (`issue#18430 <http://tracker.ceph.com/issues/18430>`_, `issue#24439 <http://tracker.ceph.com/issues/24439>`_, `issue#26874 <http://tracker.ceph.com/issues/26874>`_, `issue#23659 <http://tracker.ceph.com/issues/23659>`_, `pr#15831 <https://github.com/ceph/ceph/pull/15831>`_, Patrick Donnelly, Sage Weil, Alfredo Deza, Kefu Chai, Patrick Nawracay, Pavani Rajula, Mykola Golub, Casey Bodley, Yingxin, Jason Dillaman)
-* librbd: support v2 cloning across namespaces (`pr#23662 <https://github.com/ceph/ceph/pull/23662>`_, Jason Dillaman)
-* librbd: use object map when doing snap rollback (`pr#23110 <https://github.com/ceph/ceph/pull/23110>`_, songweibin)
-* librbd: utilize the journal disabled policy when removing images (`issue#23512 <http://tracker.ceph.com/issues/23512>`_, `pr#22327 <https://github.com/ceph/ceph/pull/22327>`_, Jason Dillaman)
-* librbd: validate data pool for self-managed snapshot support (`pr#22737 <https://github.com/ceph/ceph/pull/22737>`_, Mykola Golub)
-* librbd: workaround an ICE of GCC (`issue#37719 <http://tracker.ceph.com/issues/37719>`_, `pr#25733 <https://github.com/ceph/ceph/pull/25733>`_, Kefu Chai)
-* log: avoid heap allocations for most log entries (`pr#23721 <https://github.com/ceph/ceph/pull/23721>`_, Patrick Donnelly)
-* lvm: when osd creation fails log the exception (`issue#24456 <http://tracker.ceph.com/issues/24456>`_, `pr#22627 <https://github.com/ceph/ceph/pull/22627>`_, Andrew Schoen)
-* mailmap,organization: Update sangfor affiliation (`pr#25225 <https://github.com/ceph/ceph/pull/25225>`_, Zengran Zhang)
-* mds: add reference when setting Connection::priv to existing session (`pr#22384 <https://github.com/ceph/ceph/pull/22384>`_, "Yan, Zheng")
-* mds: fix leak of MDSCacheObject::waiting (`issue#24289 <http://tracker.ceph.com/issues/24289>`_, `pr#22307 <https://github.com/ceph/ceph/pull/22307>`_, "Yan, Zheng")
-* mds: fix some memory leak (`issue#24289 <http://tracker.ceph.com/issues/24289>`_, `pr#22240 <https://github.com/ceph/ceph/pull/22240>`_, "Yan, Zheng")
-* mds,messages: silence -Wclass-memaccess warnings (`pr#21845 <https://github.com/ceph/ceph/pull/21845>`_, Kefu Chai)
-* mds: properly journal root inode's snaprealm (`issue#24343 <http://tracker.ceph.com/issues/24343>`_, `pr#22320 <https://github.com/ceph/ceph/pull/22320>`_, "Yan, Zheng")
-* mds: remove obsolete comments (`pr#25549 <https://github.com/ceph/ceph/pull/25549>`_, Patrick Donnelly)
-* mds: reply session reject for open request from blacklisted client (`pr#21941 <https://github.com/ceph/ceph/pull/21941>`_, Yan, Zheng, "Yan, Zheng")
-* mgr: Add ability to trigger a cluster/audit log message from Python (`pr#24239 <https://github.com/ceph/ceph/pull/24239>`_, Volker Theile)
-* mgr: Add `HandleCommandResult` namedtuple (`pr#25261 <https://github.com/ceph/ceph/pull/25261>`_, Sebastian Wagner)
-* mgr: add limit param to osd perf query (`pr#25151 <https://github.com/ceph/ceph/pull/25151>`_, Mykola Golub)
-* mgr: add per pool force-recovery/backfill commands (`issue#38456 <http://tracker.ceph.com/issues/38456>`_, `pr#26560 <https://github.com/ceph/ceph/pull/26560>`_, xie xingguo)
-* mgr: add per pool scrub commands (`pr#26532 <https://github.com/ceph/ceph/pull/26532>`_, xie xingguo)
-* mgr: Allow modules to get/set other module options (`pr#25651 <https://github.com/ceph/ceph/pull/25651>`_, Volker Theile)
-* mgr: Allow rook to scale the mon count (`pr#26405 <https://github.com/ceph/ceph/pull/26405>`_, Jeff Layton)
-* mgr: always on modules v2 (`pr#23970 <https://github.com/ceph/ceph/pull/23970>`_, Noah Watkins)
-* mgr/ansible: Add/remove hosts (`pr#26241 <https://github.com/ceph/ceph/pull/26241>`_, Juan Miguel Olmo Martínez)
-* mgr/ansible: Replace Ansible playbook used to retrieve storage devices data (`pr#26023 <https://github.com/ceph/ceph/pull/26023>`_, Juan Miguel Olmo Martínez)
-* mgr/ansible: Replace deprecated <get_config> calls (`pr#25964 <https://github.com/ceph/ceph/pull/25964>`_, Juan Miguel Olmo Martínez)
-* mgr: Centralize PG_STATES to MgrModule (`pr#22594 <https://github.com/ceph/ceph/pull/22594>`_, Wido den Hollander)
-* mgr: ceph-mgr: hold lock while accessing the request list and submitting request (`pr#25048 <https://github.com/ceph/ceph/pull/25048>`_, Jerry Lee)
-* mgr: change 'bytes' dynamic perf counters to COUNTER type (`pr#25908 <https://github.com/ceph/ceph/pull/25908>`_, Mykola Golub)
-* mgr: create always on class of modules (`pr#23106 <https://github.com/ceph/ceph/pull/23106>`_, Noah Watkins)
-* mgr: create shell OSD performance query class (`pr#24117 <https://github.com/ceph/ceph/pull/24117>`_, Mykola Golub)
-* mgr/dashboard: About modal proposed changes (`issue#35693 <http://tracker.ceph.com/issues/35693>`_, `pr#25376 <https://github.com/ceph/ceph/pull/25376>`_, Kanika Murarka)
-* mgr/dashboard: Add ability to list,set and unset cluster-wide OSD flags to the backend (`issue#24056 <http://tracker.ceph.com/issues/24056>`_, `pr#21998 <https://github.com/ceph/ceph/pull/21998>`_, Patrick Nawracay)
-* mgr/dashboard: Add a 'clear filter' button to configuration page (`issue#36173 <http://tracker.ceph.com/issues/36173>`_, `pr#25712 <https://github.com/ceph/ceph/pull/25712>`_, familyuu)
-* mgr/dashboard: add a script to run an API request on a rook cluster (`pr#25991 <https://github.com/ceph/ceph/pull/25991>`_, Jeff Layton)
-* mgr/dashboard: Add a unit test form helper class (`pr#24633 <https://github.com/ceph/ceph/pull/24633>`_, Stephan Müller)
-* mgr/dashboard: Add backend support for changing dashboard configuration settings via the REST API (`pr#22457 <https://github.com/ceph/ceph/pull/22457>`_, Patrick Nawracay)
-* mgr/dashboard: Add breadcrumbs component (`issue#24781 <http://tracker.ceph.com/issues/24781>`_, `pr#23414 <https://github.com/ceph/ceph/pull/23414>`_, Tiago Melo)
-* mgr/dashboard: add columns to Pools table (`pr#25791 <https://github.com/ceph/ceph/pull/25791>`_, Alfonso Martínez)
-* mgr/dashboard: Add decorator to skip parameter encoding (`issue#26856 <http://tracker.ceph.com/issues/26856>`_, `pr#23419 <https://github.com/ceph/ceph/pull/23419>`_, Tiago Melo)
-* mgr/dashboard: Add description to menu items on mobile navigation (`pr#26198 <https://github.com/ceph/ceph/pull/26198>`_, Sebastian Krah)
-* mgr/dashboard: added command to tox.ini (`pr#26073 <https://github.com/ceph/ceph/pull/26073>`_, Alfonso Martínez)
-* mgr/dashboard: added 'env_build' to 'npm run e2e' (`pr#26165 <https://github.com/ceph/ceph/pull/26165>`_, Alfonso Martínez)
-* mgr/dashboard: Added new validators (`pr#22526 <https://github.com/ceph/ceph/pull/22526>`_, Stephan Müller)
-* mgr/dashboard: Add error handling on the frontend (`pr#21820 <https://github.com/ceph/ceph/pull/21820>`_, Tiago Melo)
-* mgr/dashboard: add Feature Toggles (`issue#37530 <http://tracker.ceph.com/issues/37530>`_, `pr#26102 <https://github.com/ceph/ceph/pull/26102>`_, Ernesto Puerta)
-* mgr/dashboard: Add Filesystems list component (`pr#21913 <https://github.com/ceph/ceph/pull/21913>`_, Tiago Melo)
-* mgr/dashboard: Add filtered rows number in table footer (`pr#22504 <https://github.com/ceph/ceph/pull/22504>`_, Tiago Melo)
-* mgr/dashboard: Add gap between panel footer buttons (`pr#23796 <https://github.com/ceph/ceph/pull/23796>`_, Volker Theile)
-* mgr/dashboard: Add guideline how to brand the UI and update the color scheme (`pr#25988 <https://github.com/ceph/ceph/pull/25988>`_, Sebastian Krah)
-* mgr/dashboard: Add help menu entry (`pr#22303 <https://github.com/ceph/ceph/pull/22303>`_, Ricardo Marques)
-* mgr/dashboard: Add i18n support (`pr#24803 <https://github.com/ceph/ceph/pull/24803>`_, Sebastian Krah, Tiago Melo)
-* mgr/dashboard: Add implicit wait in e2e tests (`pr#26384 <https://github.com/ceph/ceph/pull/26384>`_, Tiago Melo)
-* mgr/dashboard: Add info to Pools table (`pr#25489 <https://github.com/ceph/ceph/pull/25489>`_, Alfonso Martínez)
-* mgr/dashboard: Add iSCSI discovery authentication UI (`pr#26320 <https://github.com/ceph/ceph/pull/26320>`_, Tiago Melo)
-* mgr/dashboard: Add iSCSI Target Edit UI (`issue#38014 <http://tracker.ceph.com/issues/38014>`_, `pr#26367 <https://github.com/ceph/ceph/pull/26367>`_, Tiago Melo)
-* mgr/dashboard: Add left padding to helper icon (`pr#24631 <https://github.com/ceph/ceph/pull/24631>`_, Stephan Müller)
-* mgr/dashboard: Add missing frontend I18N (`issue#36719 <http://tracker.ceph.com/issues/36719>`_, `pr#25654 <https://github.com/ceph/ceph/pull/25654>`_, Tiago Melo)
-* mgr/dashboard: Add missing test requirement "werkzeug" (`pr#24628 <https://github.com/ceph/ceph/pull/24628>`_, Stephan Müller)
-* mgr/dashboard: Add NFS status endpoint (`issue#38399 <http://tracker.ceph.com/issues/38399>`_, `pr#26539 <https://github.com/ceph/ceph/pull/26539>`_, Tiago Melo)
-* mgr/dashboard: Add 'no-unused-variable' rule to tslint (`pr#22328 <https://github.com/ceph/ceph/pull/22328>`_, Tiago Melo)
-* mgr/dashboard: Add permission validation to the  "Purge Trash" button (`issue#36272 <http://tracker.ceph.com/issues/36272>`_, `pr#24370 <https://github.com/ceph/ceph/pull/24370>`_, Tiago Melo)
-* mgr/dashboard: Add pool cache tiering details tab (`issue#25158 <http://tracker.ceph.com/issues/25158>`_, `pr#25602 <https://github.com/ceph/ceph/pull/25602>`_, familyuu)
-* mgr/dashboard: Add Pool update endpoint (`pr#21881 <https://github.com/ceph/ceph/pull/21881>`_, Sebastian Wagner, Stephan Müller)
-* mgr/dashboard: Add Prettier formatter to the frontend (`pr#21819 <https://github.com/ceph/ceph/pull/21819>`_, Tiago Melo)
-* mgr/dashboard: add profiles to set cluster's rebuild performance (`pr#24968 <https://github.com/ceph/ceph/pull/24968>`_, Tatjana Dehler)
-* mgr/dashboard: add pytest plugin: faulthandler (`pr#25053 <https://github.com/ceph/ceph/pull/25053>`_, Alfonso Martínez)
-* mgr/dashboard: Add REST API for role management (`pr#23322 <https://github.com/ceph/ceph/pull/23322>`_, Ricardo Marques)
-* mgr/dashboard: Add scrub action to the OSDs table (`pr#22122 <https://github.com/ceph/ceph/pull/22122>`_, Tiago Melo)
-* mgr/dashboard: Adds custom timepicker for grafana iframes (`pr#25583 <https://github.com/ceph/ceph/pull/25583>`_, Kanika Murarka)
-* mgr/dashboard: Adds ECP management to the frontend (`pr#24627 <https://github.com/ceph/ceph/pull/24627>`_, Stephan Müller)
-* mgr/dashboard: Add shared Confirmation Modal (`pr#22601 <https://github.com/ceph/ceph/pull/22601>`_, Tiago Melo)
-* mgr/dashboard: add supported flag information to config options documentation (`pr#22760 <https://github.com/ceph/ceph/pull/22760>`_, Tatjana Dehler)
-* mgr/dashboard: Add support for iSCSI's multi backstores (UI) (`pr#26575 <https://github.com/ceph/ceph/pull/26575>`_, Tiago Melo)
-* mgr/dashboard: Add support for managing individual OSD settings/characteristics in the frontend (`issue#36487 <http://tracker.ceph.com/issues/36487>`_, `issue#36444 <http://tracker.ceph.com/issues/36444>`_, `issue#35448 <http://tracker.ceph.com/issues/35448>`_, `issue#36188 <http://tracker.ceph.com/issues/36188>`_, `issue#35811 <http://tracker.ceph.com/issues/35811>`_, `issue#35816 <http://tracker.ceph.com/issues/35816>`_, `issue#36086 <http://tracker.ceph.com/issues/36086>`_, `pr#24606 <https://github.com/ceph/ceph/pull/24606>`_, Patrick Nawracay)
-* mgr/dashboard: Add support for managing individual OSD settings in the backend (`issue#24270 <http://tracker.ceph.com/issues/24270>`_, `pr#23491 <https://github.com/ceph/ceph/pull/23491>`_, Patrick Nawracay)
-* mgr/dashboard: Add support for managing RBD QoS (`issue#37572 <http://tracker.ceph.com/issues/37572>`_, `issue#38004 <http://tracker.ceph.com/issues/38004>`_, `issue#37570 <http://tracker.ceph.com/issues/37570>`_, `issue#37936 <http://tracker.ceph.com/issues/37936>`_, `issue#37574 <http://tracker.ceph.com/issues/37574>`_, `issue#36191 <http://tracker.ceph.com/issues/36191>`_, `issue#37845 <http://tracker.ceph.com/issues/37845>`_, `issue#37569 <http://tracker.ceph.com/issues/37569>`_, `pr#25233 <https://github.com/ceph/ceph/pull/25233>`_, Patrick Nawracay)
-* mgr/dashboard: Add support for RBD Trash (`issue#24272 <http://tracker.ceph.com/issues/24272>`_, `pr#23351 <https://github.com/ceph/ceph/pull/23351>`_, Tiago Melo)
-* mgr/dashboard: Add support for URI encode (`issue#24621 <http://tracker.ceph.com/issues/24621>`_, `pr#22672 <https://github.com/ceph/ceph/pull/22672>`_, Tiago Melo)
-* mgr/dashboard: Add table actions component (`pr#23779 <https://github.com/ceph/ceph/pull/23779>`_, Stephan Müller)
-* mgr/dashboard: Add table of contents to HACKING.rst (`pr#25812 <https://github.com/ceph/ceph/pull/25812>`_, Sebastian Krah)
-* mgr/dashboard: Add token authentication to Grafana proxy (`pr#22459 <https://github.com/ceph/ceph/pull/22459>`_, Patrick Nawracay)
-* mgr/dashboard: Add TSLint rule "no-unused-variable" (`pr#24699 <https://github.com/ceph/ceph/pull/24699>`_, Alfonso Martínez)
-* mgr/dashboard: Add UI for Cluster-wide OSD Flags configuration (`pr#22461 <https://github.com/ceph/ceph/pull/22461>`_, Tiago Melo)
-* mgr/dashboard: Add UI for disabling ACL authentication (`issue#38218 <http://tracker.ceph.com/issues/38218>`_, `pr#26388 <https://github.com/ceph/ceph/pull/26388>`_, Tiago Melo)
-* mgr/dashboard: Add UI to configure the telemetry mgr plugin (`pr#25989 <https://github.com/ceph/ceph/pull/25989>`_, Volker Theile)
-* mgr/dashboard: Add unique validator (`pr#23802 <https://github.com/ceph/ceph/pull/23802>`_, Volker Theile)
-* mgr/dashboard: Allow "/" in pool name (`issue#38302 <http://tracker.ceph.com/issues/38302>`_, `pr#26408 <https://github.com/ceph/ceph/pull/26408>`_, Tiago Melo)
-* mgr/dashboard: Allow insecure HTTPS in run-backend-api-request (`pr#21882 <https://github.com/ceph/ceph/pull/21882>`_, Sebastian Wagner)
-* mgr/dashboard: Allow renaming an existing Pool (`issue#36560 <http://tracker.ceph.com/issues/36560>`_, `pr#25107 <https://github.com/ceph/ceph/pull/25107>`_, guodan1)
-* mgr/dashboard: Audit REST API calls (`pr#24475 <https://github.com/ceph/ceph/pull/24475>`_, Volker Theile)
-* mgr/dashboard: Auto-create a name for RBD image snapshots (`pr#23735 <https://github.com/ceph/ceph/pull/23735>`_, Volker Theile)
-* mgr/dashboard: avoid blank content in Read/Write Card (`pr#25563 <https://github.com/ceph/ceph/pull/25563>`_, Alfonso Martínez)
-* mgr/dashboard: awsauth: fix python3 string decode problem (`pr#21794 <https://github.com/ceph/ceph/pull/21794>`_, Ricardo Dias)
-* mgr/dashboard: Can't handle user editing when tenants are specified (`pr#24757 <https://github.com/ceph/ceph/pull/24757>`_, Volker Theile)
-* mgr/dashboard: Catch LookupError when checking the RGW status (`pr#24028 <https://github.com/ceph/ceph/pull/24028>`_, Volker Theile)
-* mgr/dashboard: CdFormGroup (`pr#22644 <https://github.com/ceph/ceph/pull/22644>`_, Stephan Müller)
-* mgr/dashboard: Ceph dashboard user management from the UI (`pr#22758 <https://github.com/ceph/ceph/pull/22758>`_, Ricardo Marques)
-* mgr/dashboard: Change 'Client Recovery' title (`pr#26883 <https://github.com/ceph/ceph/pull/26883>`_, Ernesto Puerta)
-* mgr/dashboard: Changed background color of Masthead to brand gray (`issue#35690 <http://tracker.ceph.com/issues/35690>`_, `pr#25628 <https://github.com/ceph/ceph/pull/25628>`_, Neha Gupta)
-* mgr/dashboard: Changed default value of decimal point to 1 (`pr#22386 <https://github.com/ceph/ceph/pull/22386>`_, Tiago Melo)
-* mgr/dashboard: Change icon color in notifications (`pr#26586 <https://github.com/ceph/ceph/pull/26586>`_, Volker Theile)
-* mgr/dashboard: Check content-type before decode json response (`pr#24350 <https://github.com/ceph/ceph/pull/24350>`_, Ricardo Marques)
-* mgr/dashboard: check for existence of Grafana dashboard (`issue#36356 <http://tracker.ceph.com/issues/36356>`_, `pr#25154 <https://github.com/ceph/ceph/pull/25154>`_, Kanika Murarka)
-* mgr/dashboard: Cleanup of OSD list methods (`pr#24823 <https://github.com/ceph/ceph/pull/24823>`_, Stephan Müller)
-* mgr/dashboard: Cleanup of the cluster and audit log (`pr#26188 <https://github.com/ceph/ceph/pull/26188>`_, Sebastian Krah)
-* mgr/dashboard: Cleanup (`pr#24831 <https://github.com/ceph/ceph/pull/24831>`_, Patrick Nawracay)
-* mgr/dashboard: Clean up pylint's `disable:no-else-return` (`pr#26509 <https://github.com/ceph/ceph/pull/26509>`_, Patrick Nawracay)
-* mgr/dashboard: Cleanup Python code (`pr#26743 <https://github.com/ceph/ceph/pull/26743>`_, Volker Theile)
-* mgr/dashboard: Cleanup RGW config checks (`pr#22669 <https://github.com/ceph/ceph/pull/22669>`_, Volker Theile)
-* mgr/dashboard: Close modal dialogs on login screen (`pr#23328 <https://github.com/ceph/ceph/pull/23328>`_, Volker Theile)
-* mgr/dashboard: code cleanup (`pr#25502 <https://github.com/ceph/ceph/pull/25502>`_, Alfonso Martínez)
-* mgr/dashboard: Color variables for color codes (`issue#24575 <http://tracker.ceph.com/issues/24575>`_, `pr#22695 <https://github.com/ceph/ceph/pull/22695>`_, Kanika Murarka)
-* mgr/dashboard config options add (`issue#34528 <http://tracker.ceph.com/issues/34528>`_, `issue#24996 <http://tracker.ceph.com/issues/24996>`_, `issue#24455 <http://tracker.ceph.com/issues/24455>`_, `issue#36173 <http://tracker.ceph.com/issues/36173>`_, `pr#23230 <https://github.com/ceph/ceph/pull/23230>`_, Tatjana Dehler)
-* mgr/dashboard: Config options integration (read-only) depends on #22422 (`pr#21460 <https://github.com/ceph/ceph/pull/21460>`_, Tatjana Dehler)
-* mgr/dashboard: config options table cleanup (`issue#34533 <http://tracker.ceph.com/issues/34533>`_, `pr#24523 <https://github.com/ceph/ceph/pull/24523>`_, Tatjana Dehler)
-* mgr/dashboard: config option type names update (`issue#37843 <http://tracker.ceph.com/issues/37843>`_, `pr#25876 <https://github.com/ceph/ceph/pull/25876>`_, Tatjana Dehler)
-* mgr/dashboard: configs textarea disallow horizontal resize (`issue#36452 <http://tracker.ceph.com/issues/36452>`_, `pr#24614 <https://github.com/ceph/ceph/pull/24614>`_, Tatjana Dehler)
-* mgr/dashboard: Configure all mgr modules in UI (`pr#26116 <https://github.com/ceph/ceph/pull/26116>`_, Volker Theile)
-* mgr/dashboard: Confirmation modal doesn't close (`pr#24544 <https://github.com/ceph/ceph/pull/24544>`_, Volker Theile)
-* mgr/dashboard: Confusing tilted time stamps in the CephFS performance graph (`pr#25909 <https://github.com/ceph/ceph/pull/25909>`_, Volker Theile)
-* mgr/dashboard: consider config option default values (`issue#37683 <http://tracker.ceph.com/issues/37683>`_, `pr#25616 <https://github.com/ceph/ceph/pull/25616>`_, Tatjana Dehler)
-* mgr/dashboard: controller infrastructure refactor and new features (`pr#22210 <https://github.com/ceph/ceph/pull/22210>`_, Patrick Nawracay, Ricardo Dias)
-* mgr/dashboard: Correct permission decorator (`pr#26135 <https://github.com/ceph/ceph/pull/26135>`_, Tina Kallio)
-* mgr/dashboard: CRUSH map viewer (`issue#35684 <http://tracker.ceph.com/issues/35684>`_, `pr#24766 <https://github.com/ceph/ceph/pull/24766>`_, familyuu)
-* mgr/dashboard: CRUSH map viewer RFE (`issue#37794 <http://tracker.ceph.com/issues/37794>`_, `pr#26162 <https://github.com/ceph/ceph/pull/26162>`_, familyuu)
-* mgr/dashboard: Dashboard info cards refactoring (`pr#22902 <https://github.com/ceph/ceph/pull/22902>`_, Alfonso Martínez)
-* mgr/dashboard: Datatable error panel blinking on page loading (`pr#23316 <https://github.com/ceph/ceph/pull/23316>`_, Volker Theile)
-* mgr/dashboard: Deletion dialog falsely executes deletion when pressing 'Cancel' (`pr#22003 <https://github.com/ceph/ceph/pull/22003>`_, Volker Theile)
-* mgr/dashboard: Disable package-lock.json creation (`pr#22061 <https://github.com/ceph/ceph/pull/22061>`_, Tiago Melo)
-* mgr/dashboard: Disable RBD actions during task execution (`pr#23445 <https://github.com/ceph/ceph/pull/23445>`_, Ricardo Marques)
-* mgr/dashboard: disallow editing read-only config options (part 2) (`pr#26450 <https://github.com/ceph/ceph/pull/26450>`_, Tatjana Dehler)
-* mgr/dashboard: disallow editing read-only config options (`pr#26297 <https://github.com/ceph/ceph/pull/26297>`_, Tatjana Dehler)
-* mgr/dashboard: Display logged in user (`issue#24822 <http://tracker.ceph.com/issues/24822>`_, `pr#24213 <https://github.com/ceph/ceph/pull/24213>`_, guodan1, guodan)
-* mgr/dashboard: Display notification if RGW is not configured (`pr#21785 <https://github.com/ceph/ceph/pull/21785>`_, Volker Theile)
-* mgr/dashboard: Display RGW user/bucket quota max size in human readable form (`pr#23842 <https://github.com/ceph/ceph/pull/23842>`_, Volker Theile)
-* mgr/dashboard: Do not fetch pool list on RBD edit (`pr#22404 <https://github.com/ceph/ceph/pull/22404>`_, Ricardo Marques)
-* mgr/dashboard: Do not require cert for http (`issue#36069 <http://tracker.ceph.com/issues/36069>`_, `pr#24103 <https://github.com/ceph/ceph/pull/24103>`_, Boris Ranto)
-* mgr/dashboard: Drop iSCSI gateway name parameter (`pr#26984 <https://github.com/ceph/ceph/pull/26984>`_, Ricardo Marques)
-* mgr/dashboard: enable coverage for API tests (`pr#26851 <https://github.com/ceph/ceph/pull/26851>`_, Alfonso Martínez)
-* mgr/dashboard: Escape regex pattern in DeletionModalComponent (`issue#24902 <http://tracker.ceph.com/issues/24902>`_, `pr#23420 <https://github.com/ceph/ceph/pull/23420>`_, Tiago Melo)
-* mgr/dashboard: Exception.message doesn't exist on Python 3 (`pr#24349 <https://github.com/ceph/ceph/pull/24349>`_, Ricardo Marques)
-* mgr/dashboard: Extract/Refactor Task merge (`pr#23555 <https://github.com/ceph/ceph/pull/23555>`_, Stephan Müller, Tiago Melo)
-* mgr/dashboard: Filter out tasks depending on permissions (`pr#25426 <https://github.com/ceph/ceph/pull/25426>`_, Tina Kallio)
-* mgr/dashboard: Fix /api/grafana/validation (`pr#25997 <https://github.com/ceph/ceph/pull/25997>`_, Zack Cerza)
-* mgr/dashboard: Fix bug in user form when changing password (`pr#23939 <https://github.com/ceph/ceph/pull/23939>`_, Volker Theile)
-* mgr/dashboard: Fix cherrypy static content URL prefix config (`pr#23183 <https://github.com/ceph/ceph/pull/23183>`_, Ricardo Marques)
-* mgr/dashboard: Fix duplicate error messages (`pr#23287 <https://github.com/ceph/ceph/pull/23287>`_, Stephan Müller)
-* mgr/dashboard: Fix duplicate tasks (`pr#24930 <https://github.com/ceph/ceph/pull/24930>`_, Tiago Melo)
-* mgr/dashboard: Fix e2e script (`pr#22903 <https://github.com/ceph/ceph/pull/22903>`_, Tiago Melo)
-* mgr/dashboard: Fixed performance details context for host list row selection (`issue#37854 <http://tracker.ceph.com/issues/37854>`_, `pr#26020 <https://github.com/ceph/ceph/pull/26020>`_, Neha Gupta)
-* mgr/dashboard: Fixed typos in environment.build.js (`pr#26650 <https://github.com/ceph/ceph/pull/26650>`_, Lenz Grimmer)
-* mgr/dashboard: Fix error when clicking on newly created OSD (`issue#36245 <http://tracker.ceph.com/issues/36245>`_, `pr#24369 <https://github.com/ceph/ceph/pull/24369>`_, Patrick Nawracay)
-* mgr/dashboard: Fixes documentation link- to open in new tab (`pr#22237 <https://github.com/ceph/ceph/pull/22237>`_, a2batic)
-* mgr/dashboard: Fixes Grafana 500 error (`issue#37809 <http://tracker.ceph.com/issues/37809>`_, `pr#25830 <https://github.com/ceph/ceph/pull/25830>`_, Kanika Murarka)
-* mgr/dashboard: Fix failing QA test: test_safe_to_destroy (`issue#37290 <http://tracker.ceph.com/issues/37290>`_, `pr#25149 <https://github.com/ceph/ceph/pull/25149>`_, Patrick Nawracay)
-* mgr/dashboard: Fix flaky QA tests (`pr#24024 <https://github.com/ceph/ceph/pull/24024>`_, Patrick Nawracay)
-* mgr/dashboard: Fix Forbidden Error with some roles (`issue#37293 <http://tracker.ceph.com/issues/37293>`_, `pr#25141 <https://github.com/ceph/ceph/pull/25141>`_, Ernesto Puerta)
-* mgr/dashboard: fix for 'Cluster >> Hosts' page (`pr#24974 <https://github.com/ceph/ceph/pull/24974>`_, Alfonso Martínez)
-* mgr/dashboard: Fix formatter service unit test (`pr#22323 <https://github.com/ceph/ceph/pull/22323>`_, Tiago Melo)
-* mgr/dashboard: fix for using '::' on hosts without ipv6 (`pr#26635 <https://github.com/ceph/ceph/pull/26635>`_, Noah Watkins)
-* mgr/dashboard: Fix growing table in firefox (`issue#26999 <http://tracker.ceph.com/issues/26999>`_, `pr#23711 <https://github.com/ceph/ceph/pull/23711>`_, Tiago Melo)
-* mgr/dashboard: Fix HttpClient Module imports in unit tests (`pr#24679 <https://github.com/ceph/ceph/pull/24679>`_, Tiago Melo)
-* mgr/dashboard: Fix iSCSI mutual password input type (`pr#26854 <https://github.com/ceph/ceph/pull/26854>`_, Ricardo Marques)
-* mgr/dashboard: Fix iSCSI service unit tests (`pr#26319 <https://github.com/ceph/ceph/pull/26319>`_, Tiago Melo)
-* mgr/dashboard: Fix issues in controllers/docs (`pr#26738 <https://github.com/ceph/ceph/pull/26738>`_, Volker Theile)
-* mgr/dashboard: Fix Jest conflict with coverage files (`pr#22155 <https://github.com/ceph/ceph/pull/22155>`_, Tiago Melo)
-* mgr/dashboard: Fix layout issues in UI (`issue#24525 <http://tracker.ceph.com/issues/24525>`_, `pr#22597 <https://github.com/ceph/ceph/pull/22597>`_, Volker Theile)
-* mgr/dashboard: Fix links to external documentation (`pr#24829 <https://github.com/ceph/ceph/pull/24829>`_, Patrick Nawracay)
-* mgr/dashboard: fix lint error caused by codelyzer update (`pr#22693 <https://github.com/ceph/ceph/pull/22693>`_, Tiago Melo)
-* mgr/dashboard: fix lint error (`pr#22417 <https://github.com/ceph/ceph/pull/22417>`_, Tiago Melo)
-* mgr/dashboard: Fix long running RBD cloning / copying message (`pr#24641 <https://github.com/ceph/ceph/pull/24641>`_, Ricardo Marques)
-* mgr/dashboard: Fix missing failed restore notification (`issue#36513 <http://tracker.ceph.com/issues/36513>`_, `pr#24664 <https://github.com/ceph/ceph/pull/24664>`_, Tiago Melo)
-* mgr/dashboard: Fix modified files only (frontend) (`pr#25346 <https://github.com/ceph/ceph/pull/25346>`_, Patrick Nawracay)
-* mgr/dashboard: Fix moment.js deprecation warning (`pr#21981 <https://github.com/ceph/ceph/pull/21981>`_, Tiago Melo)
-* mgr/dashboard: Fix more layout issues in UI (`pr#22600 <https://github.com/ceph/ceph/pull/22600>`_, Volker Theile)
-* mgr/dashboard: Fix navbar focused color (`pr#25769 <https://github.com/ceph/ceph/pull/25769>`_, Volker Theile)
-* mgr/dashboard: Fix notifications in user list and form (`pr#23797 <https://github.com/ceph/ceph/pull/23797>`_, Volker Theile)
-* mgr/dashboard: Fix OSD down error display (`issue#24530 <http://tracker.ceph.com/issues/24530>`_, `pr#23754 <https://github.com/ceph/ceph/pull/23754>`_, Patrick Nawracay)
-* mgr/dashboard: Fix pool usage not displaying on filesystem page (`pr#22453 <https://github.com/ceph/ceph/pull/22453>`_, Tiago Melo)
-* mgr/dashboard: Fix problem with ErasureCodeProfileService (`pr#24694 <https://github.com/ceph/ceph/pull/24694>`_, Tiago Melo)
-* mgr/dashboard: Fix Python3 issue (`pr#24617 <https://github.com/ceph/ceph/pull/24617>`_, Patrick Nawracay)
-* mgr/dashboard: fix query parameters in task annotated endpoints (`issue#25096 <http://tracker.ceph.com/issues/25096>`_, `pr#23229 <https://github.com/ceph/ceph/pull/23229>`_, Ricardo Dias)
-* mgr/dashboard: Fix RBD actions disable (`pr#24637 <https://github.com/ceph/ceph/pull/24637>`_, Ricardo Marques)
-* mgr/dashboard: Fix RBD features style (`pr#22759 <https://github.com/ceph/ceph/pull/22759>`_, Ricardo Marques)
-* mgr/dashboard: Fix RBD object size dropdown options (`pr#22830 <https://github.com/ceph/ceph/pull/22830>`_, Ricardo Marques)
-* mgr/dashboard: Fix RBD task metadata (`pr#22088 <https://github.com/ceph/ceph/pull/22088>`_, Tiago Melo)
-* mgr/dashboard: Fix redirect to login page on session lost (`pr#23388 <https://github.com/ceph/ceph/pull/23388>`_, Ricardo Marques)
-* mgr/dashboard: fix reference to oA (`pr#24343 <https://github.com/ceph/ceph/pull/24343>`_, Joao Eduardo Luis)
-* mgr/dashboard: Fix regression on rbd form component (`issue#24757 <http://tracker.ceph.com/issues/24757>`_, `pr#22829 <https://github.com/ceph/ceph/pull/22829>`_, Tiago Melo)
-* mgr/dashboard: Fix reloading of pool listing (`pr#26182 <https://github.com/ceph/ceph/pull/26182>`_, Patrick Nawracay)
-* mgr/dashboard: Fix renaming of pools (`pr#25423 <https://github.com/ceph/ceph/pull/25423>`_, Patrick Nawracay)
-* mgr/dashboard: Fix search in `Source` column of RBD configuration list (`issue#37569 <http://tracker.ceph.com/issues/37569>`_, `pr#26765 <https://github.com/ceph/ceph/pull/26765>`_, Patrick Nawracay)
-* mgr/dashboard: fix skipped backend API tests (`pr#26172 <https://github.com/ceph/ceph/pull/26172>`_, Alfonso Martínez)
-* mgr/dashboard: Fix some datatable CSS issues (`pr#22216 <https://github.com/ceph/ceph/pull/22216>`_, Volker Theile)
-* mgr/dashboard: Fix spaces around status labels on OSD list (`pr#24607 <https://github.com/ceph/ceph/pull/24607>`_, Patrick Nawracay)
-* mgr/dashboard: Fix summary refresh call stack (`pr#25984 <https://github.com/ceph/ceph/pull/25984>`_, Tiago Melo)
-* mgr/dashboard: Fix test_full_health test (`issue#37872 <http://tracker.ceph.com/issues/37872>`_, `pr#25913 <https://github.com/ceph/ceph/pull/25913>`_, Tatjana Dehler)
-* mgr/dashboard: Fix test_remove_not_expired_trash qa test (`issue#37354 <http://tracker.ceph.com/issues/37354>`_, `pr#25221 <https://github.com/ceph/ceph/pull/25221>`_, Tiago Melo)
-* mgr/dashboard: fix: toast notifications hiding utility menu (`pr#26429 <https://github.com/ceph/ceph/pull/26429>`_, Alfonso Martínez)
-* mgr/dashboard: fix: tox not detecting deps changes (`pr#26409 <https://github.com/ceph/ceph/pull/26409>`_, Alfonso Martínez)
-* mgr/dashboard: Fix ts error on iSCSI page (`pr#24715 <https://github.com/ceph/ceph/pull/24715>`_, Ricardo Marques)
-* mgr/dashboard: Fix typo in NoOrchesrtatorConfiguredException class name (`pr#26334 <https://github.com/ceph/ceph/pull/26334>`_, Volker Theile)
-* mgr/dashboard: Fix typo in pools management (`pr#26323 <https://github.com/ceph/ceph/pull/26323>`_, Lenz Grimmer)
-* mgr/dashboard: Fix typo (`pr#23363 <https://github.com/ceph/ceph/pull/23363>`_, Volker Theile)
-* mgr/dashboard: Fix unit tests cli warnings (`pr#21933 <https://github.com/ceph/ceph/pull/21933>`_, Tiago Melo)
-* mgr/dashboard: Format small numbers correctly (`issue#24081 <http://tracker.ceph.com/issues/24081>`_, `pr#21980 <https://github.com/ceph/ceph/pull/21980>`_, Stephan Müller)
-* mgr/dashboard: Get user ID via RGW Admin Ops API (`pr#22416 <https://github.com/ceph/ceph/pull/22416>`_, Volker Theile)
-* mgr/dashboard: Grafana dashboard updates and additions (`pr#24314 <https://github.com/ceph/ceph/pull/24314>`_, Paul Cuzner)
-* mgr/dashboard: Grafana graphs integration with dashboard (`pr#23666 <https://github.com/ceph/ceph/pull/23666>`_, Kanika Murarka)
-* mgr/dashboard: Grafana proxy backend (`pr#21644 <https://github.com/ceph/ceph/pull/21644>`_, Patrick Nawracay)
-* mgr/dashboard: Group buttons together into one menu on OSD page (`issue#37380 <http://tracker.ceph.com/issues/37380>`_, `pr#26189 <https://github.com/ceph/ceph/pull/26189>`_, Tatjana Dehler)
-* mgr/dashboard: Handle class objects as regular objects in KV-table (`pr#24632 <https://github.com/ceph/ceph/pull/24632>`_, Stephan Müller)
-* mgr/dashboard: Handle errors during deletion (`pr#22002 <https://github.com/ceph/ceph/pull/22002>`_, Volker Theile)
-* mgr/dashboard: Hide empty fields and render all objects in KV-table (`pr#25894 <https://github.com/ceph/ceph/pull/25894>`_, Stephan Müller)
-* mgr/dashboard: Hide progress bar in case of an error (`pr#22419 <https://github.com/ceph/ceph/pull/22419>`_, Volker Theile)
-* mgr/dashboard: Implement OSD purge (`issue#35811 <http://tracker.ceph.com/issues/35811>`_, `pr#26242 <https://github.com/ceph/ceph/pull/26242>`_, Patrick Nawracay)
-* mgr/dashboard: Improve CRUSH map viewer (`pr#24934 <https://github.com/ceph/ceph/pull/24934>`_, Volker Theile)
-* mgr/dashboard: Improved support for generating OpenAPI Spec documentation (`issue#24763 <http://tracker.ceph.com/issues/24763>`_, `pr#26227 <https://github.com/ceph/ceph/pull/26227>`_, Tina Kallio)
-* mgr/dashboard: Improve error message handling (`pr#24322 <https://github.com/ceph/ceph/pull/24322>`_, Volker Theile)
-* mgr/dashboard: Improve error panel (`pr#21851 <https://github.com/ceph/ceph/pull/21851>`_, Volker Theile)
-* mgr/dashboard: Improve exception handling in /api/rgw/status (`pr#25836 <https://github.com/ceph/ceph/pull/25836>`_, Volker Theile)
-* mgr/dashboard: Improve exception handling (`issue#23823 <http://tracker.ceph.com/issues/23823>`_, `pr#21066 <https://github.com/ceph/ceph/pull/21066>`_, Sebastian Wagner)
-* mgr/dashboard: Improve `HACKING.rst` (`pr#22281 <https://github.com/ceph/ceph/pull/22281>`_, Patrick Nawracay)
-* mgr/dashboard: Improve 'no pool' message on rbd form (`pr#22150 <https://github.com/ceph/ceph/pull/22150>`_, Ricardo Marques)
-* mgr/dashboard: Improve RBD form (`issue#38303 <http://tracker.ceph.com/issues/38303>`_, `pr#26433 <https://github.com/ceph/ceph/pull/26433>`_, Tiago Melo)
-* mgr/dashboard: Improve RGW address parser (`pr#25870 <https://github.com/ceph/ceph/pull/25870>`_, Volker Theile)
-* mgr/dashboard: Improve RgwUser controller (`pr#25300 <https://github.com/ceph/ceph/pull/25300>`_, Volker Theile)
-* mgr/dashboard: Improves documentation for Grafana Setting (`issue#36371 <http://tracker.ceph.com/issues/36371>`_, `pr#24511 <https://github.com/ceph/ceph/pull/24511>`_, Kanika Murarka)
-* mgr/dashboard: Improve str_to_bool (`pr#22757 <https://github.com/ceph/ceph/pull/22757>`_, Volker Theile)
-* mgr/dashboard: Improve SummaryService and TaskWrapperService (`pr#22906 <https://github.com/ceph/ceph/pull/22906>`_, Tiago Melo)
-* mgr/dashboard: Improve table pagination style (`pr#22065 <https://github.com/ceph/ceph/pull/22065>`_, Ricardo Marques)
-* mgr/dashboard: Introduce pipe to convert bool to text (`pr#26507 <https://github.com/ceph/ceph/pull/26507>`_, Volker Theile)
-* mgr/dashboard: iscsi: adds CLI command to enable/disable API SSL verification (`pr#26891 <https://github.com/ceph/ceph/pull/26891>`_, Ricardo Dias)
-* mgr/dashboard: iSCSI - Adds support for pool/image names with dots (`pr#26503 <https://github.com/ceph/ceph/pull/26503>`_, Ricardo Marques)
-* mgr/dashboard: iSCSI - Add support for disabling ACL authentication (backend) (`pr#26382 <https://github.com/ceph/ceph/pull/26382>`_, Ricardo Marques)
-* mgr/dashboard: iSCSI discovery authentication API (`pr#26115 <https://github.com/ceph/ceph/pull/26115>`_, Ricardo Marques)
-* mgr/dashboard: iSCSI - Infrastructure for multiple backstores (backend) (`pr#26506 <https://github.com/ceph/ceph/pull/26506>`_, Ricardo Marques)
-* mgr/dashboard: iSCSI management API (`pr#25638 <https://github.com/ceph/ceph/pull/25638>`_, Ricardo Marques, Ricardo Dias)
-* mgr/dashboard: iSCSI management UI (`pr#25995 <https://github.com/ceph/ceph/pull/25995>`_, Ricardo Marques, Tiago Melo)
-* mgr/dashboard: iSCSI - Support iSCSI passwords with '/' (`pr#26790 <https://github.com/ceph/ceph/pull/26790>`_, Ricardo Marques)
-* mgr/dashboard: JWT authentication (`pr#22833 <https://github.com/ceph/ceph/pull/22833>`_, Ricardo Dias)
-* mgr/dashboard: Landing Page: chart improvements (`pr#24810 <https://github.com/ceph/ceph/pull/24810>`_, Alfonso Martínez)
-* mgr/dashboard: Landing Page: info visibility (`pr#24513 <https://github.com/ceph/ceph/pull/24513>`_, Alfonso Martínez)
-* mgr/dashboard: Log frontend errors + @UiController (`pr#22285 <https://github.com/ceph/ceph/pull/22285>`_, Ricardo Marques)
-* mgr/dashboard: Login failure should return HTTP 400 (`pr#22403 <https://github.com/ceph/ceph/pull/22403>`_, Ricardo Marques)
-* mgr/dashboard: 'Logs' links permission in Landing Page (`pr#25231 <https://github.com/ceph/ceph/pull/25231>`_, Alfonso Martínez)
-* mgr/dashboard: Make deletion dialog more touch device friendly (`pr#23897 <https://github.com/ceph/ceph/pull/23897>`_, Volker Theile)
-* mgr/dashboard: Map dev 'releases' to master (`pr#24763 <https://github.com/ceph/ceph/pull/24763>`_, Zack Cerza)
-* mgr/dashboard: Module dashboard.services.ganesha has several lint issues (`pr#26378 <https://github.com/ceph/ceph/pull/26378>`_, Volker Theile)
-* mgr/dashboard: More configs for table `updateSelectionOnRefresh` (`pr#24015 <https://github.com/ceph/ceph/pull/24015>`_, Ricardo Marques)
-* mgr/dashboard: Move Cluster/Audit logs from front page to dedicated Logs page (`pr#23834 <https://github.com/ceph/ceph/pull/23834>`_, Diksha Godbole)
-* mgr/dashboard: Move unit-test-helper into the new testing folder (`pr#22857 <https://github.com/ceph/ceph/pull/22857>`_, Tiago Melo)
-* mgr/dashboard: Navbar dropdown button does not respond for mobile browsers (`pr#21967 <https://github.com/ceph/ceph/pull/21967>`_, Volker Theile)
-* mgr/dashboard: New Landing Page: Milestone 2 (`pr#24326 <https://github.com/ceph/ceph/pull/24326>`_, Alfonso Martínez)
-* mgr/dashboard: New Landing Page (`pr#23568 <https://github.com/ceph/ceph/pull/23568>`_, Alfonso Martínez)
-* mgr/dashboard: nfs-ganesha: controller API documentation (`pr#26716 <https://github.com/ceph/ceph/pull/26716>`_, Ricardo Dias)
-* mgr/dashboard: NFS management UI (`pr#26085 <https://github.com/ceph/ceph/pull/26085>`_, Tiago Melo)
-* mgr/dashboard: ng serve bind to 0.0.0.0 (`pr#22058 <https://github.com/ceph/ceph/pull/22058>`_, Ricardo Marques)
-* mgr/dashboard: no side-effects on failed user creation (`pr#24200 <https://github.com/ceph/ceph/pull/24200>`_, Joao Eduardo Luis)
-* mgr/dashboard: Notification queue (`pr#25325 <https://github.com/ceph/ceph/pull/25325>`_, Stephan Müller)
-* mgr/dashboard: npm run e2e:dev (`pr#25136 <https://github.com/ceph/ceph/pull/25136>`_, Stephan Müller)
-* mgr/dashboard: Performance counter progress bar keeps infinitely looping (`pr#24448 <https://github.com/ceph/ceph/pull/24448>`_, Volker Theile)
-* mgr/dashboard: permanent pie chart slice hiding (`pr#25276 <https://github.com/ceph/ceph/pull/25276>`_, Alfonso Martínez)
-* mgr/dashboard: PGs will update as expected (`pr#26589 <https://github.com/ceph/ceph/pull/26589>`_, Stephan Müller)
-* mgr/dashboard: Pool management (`pr#21614 <https://github.com/ceph/ceph/pull/21614>`_, Stephan Müller)
-* mgr/dashboard: pool stats not returned by default (`pr#25635 <https://github.com/ceph/ceph/pull/25635>`_, Alfonso Martínez)
-* mgr/dashboard: Possible fix for some dashboard timing issues (`issue#36107 <http://tracker.ceph.com/issues/36107>`_, `pr#24219 <https://github.com/ceph/ceph/pull/24219>`_, Patrick Nawracay)
-* mgr/dashboard: Prettify package.json (`pr#22401 <https://github.com/ceph/ceph/pull/22401>`_, Ricardo Marques)
-* mgr/dashboard: Prettify RGW JS code (`pr#22278 <https://github.com/ceph/ceph/pull/22278>`_, Volker Theile)
-* mgr/dashboard: Prevent API call on every keystroke (`pr#23391 <https://github.com/ceph/ceph/pull/23391>`_, Volker Theile)
-* mgr/dashboard: Print a blank space between value and unit (`pr#22387 <https://github.com/ceph/ceph/pull/22387>`_, Volker Theile)
-* mgr/dashboard: Progress bar does not stop in TableKeyValueComponent (`pr#24016 <https://github.com/ceph/ceph/pull/24016>`_, Volker Theile)
-* mgr/dashboard: Prometheus integration (`pr#25309 <https://github.com/ceph/ceph/pull/25309>`_, Stephan Müller)
-* mgr/dashboard: Provide all four 'mandatory' OSD flags (`issue#37857 <http://tracker.ceph.com/issues/37857>`_, `pr#25905 <https://github.com/ceph/ceph/pull/25905>`_, Tatjana Dehler)
-* mgr/dashboard/qa: Fix ECP creation test (`pr#25120 <https://github.com/ceph/ceph/pull/25120>`_, Stephan Müller)
-* mgr/dashboard/qa: Fix various vstart_runner.py issues (`issue#36581 <http://tracker.ceph.com/issues/36581>`_, `pr#24767 <https://github.com/ceph/ceph/pull/24767>`_, Volker Theile)
-* mgr/dashboard: Redirect /block to /block/rbd (`pr#24722 <https://github.com/ceph/ceph/pull/24722>`_, Zack Cerza)
-* mgr/dashboard: Reduce Jest logs in CI (`pr#24764 <https://github.com/ceph/ceph/pull/24764>`_, Tiago Melo)
-* mgr/dashboard: Refactor autofocus directive (`pr#23910 <https://github.com/ceph/ceph/pull/23910>`_, Volker Theile)
-* mgr/dashboard: Refactoring of `DeletionModalComponent` (`pr#24005 <https://github.com/ceph/ceph/pull/24005>`_, Patrick Nawracay)
-* mgr/dashboard: Refactor perf counters (`pr#21673 <https://github.com/ceph/ceph/pull/21673>`_, Volker Theile)
-* mgr/dashboard: Refactor RGW backend (`pr#21784 <https://github.com/ceph/ceph/pull/21784>`_, Volker Theile)
-* mgr/dashboard: Refactor role management (`pr#23960 <https://github.com/ceph/ceph/pull/23960>`_, Volker Theile)
-* mgr/dashboard: Relocate empty pipe (`pr#26588 <https://github.com/ceph/ceph/pull/26588>`_, Volker Theile)
-* mgr/dashboard: Removed unnecessary fake services from unit tests (`pr#22473 <https://github.com/ceph/ceph/pull/22473>`_, Stephan Müller)
-* mgr/dashboard: Remove fieldsets when using CdTable (`pr#23730 <https://github.com/ceph/ceph/pull/23730>`_, Tiago Melo)
-* mgr/dashboard: Remove _filterValue from CdFormGroup (`issue#26861 <http://tracker.ceph.com/issues/26861>`_, `pr#24719 <https://github.com/ceph/ceph/pull/24719>`_, Stephan Müller)
-* mgr/dashboard: Remove husky package (`pr#21971 <https://github.com/ceph/ceph/pull/21971>`_, Tiago Melo)
-* mgr/dashboard: Remove karma packages (`pr#23181 <https://github.com/ceph/ceph/pull/23181>`_, Tiago Melo)
-* mgr/dashboard: Remove param when calling notificationService.show (`pr#26447 <https://github.com/ceph/ceph/pull/26447>`_, Volker Theile)
-* mgr/dashboard: Remove top-right actions text and add "About" page (`pr#22762 <https://github.com/ceph/ceph/pull/22762>`_, Ricardo Marques)
-* mgr/dashboard: Remove unused code (`pr#25439 <https://github.com/ceph/ceph/pull/25439>`_, Patrick Nawracay)
-* mgr/dashboard: Remove useless code (`pr#23911 <https://github.com/ceph/ceph/pull/23911>`_, Volker Theile)
-* mgr/dashboard: Remove useless observable unsubscriptions (`pr#21928 <https://github.com/ceph/ceph/pull/21928>`_, Ricardo Marques)
-* mgr/dashboard: replace configuration html table with cd-table (`pr#21643 <https://github.com/ceph/ceph/pull/21643>`_, Tatjana Dehler)
-* mgr/dashboard: Replaced "Pool" with "Pools" in navigation bar (`pr#22715 <https://github.com/ceph/ceph/pull/22715>`_, Lenz Grimmer)
-* mgr/dashboard: Replace RGW proxy controller (`issue#24436 <http://tracker.ceph.com/issues/24436>`_, `pr#22470 <https://github.com/ceph/ceph/pull/22470>`_, Volker Theile)
-* mgr/dashboard: Reset settings to their default values (`pr#22298 <https://github.com/ceph/ceph/pull/22298>`_, Patrick Nawracay)
-* mgr/dashboard: Resolve TestBed performance issue (`pr#21783 <https://github.com/ceph/ceph/pull/21783>`_, Stephan Müller)
-* mgr/dashboard: rest: add support for query params (`pr#22318 <https://github.com/ceph/ceph/pull/22318>`_, Ricardo Dias)
-* mgr/dashboard: RestClient can't handle ProtocolError exceptions (`pr#23347 <https://github.com/ceph/ceph/pull/23347>`_, Volker Theile)
-* mgr/dashboard: restcontroller: minor improvements and bug fixes (`pr#22528 <https://github.com/ceph/ceph/pull/22528>`_, Ricardo Dias)
-* mgr/dashboard: RGW is not working if an URL prefix is defined (`pr#23200 <https://github.com/ceph/ceph/pull/23200>`_, Volker Theile)
-* mgr/dashboard: RGW proxy can't handle self-signed SSL certificates (`pr#22735 <https://github.com/ceph/ceph/pull/22735>`_, Volker Theile)
-* mgr/dashboard: role based authentication/authorization system (`issue#23796 <http://tracker.ceph.com/issues/23796>`_, `pr#22283 <https://github.com/ceph/ceph/pull/22283>`_, Ricardo Marques, Ricardo Dias)
-* mgr/dashboard: Role management from the UI (`pr#23409 <https://github.com/ceph/ceph/pull/23409>`_, Ricardo Marques)
-* mgr/dashboard: Search broken for entries with null values (`issue#38583 <http://tracker.ceph.com/issues/38583>`_, `pr#26766 <https://github.com/ceph/ceph/pull/26766>`_, Patrick Nawracay)
-* mgr/dashboard: set errno via the parent class (`pr#21945 <https://github.com/ceph/ceph/pull/21945>`_, Kefu Chai, Ricardo Dias)
-* mgr/dashboard: Set MODULE_OPTIONS types and defaults (`pr#26386 <https://github.com/ceph/ceph/pull/26386>`_, Volker Theile)
-* mgr/dashboard: Set timeout in RestClient calls (`pr#23224 <https://github.com/ceph/ceph/pull/23224>`_, Volker Theile)
-* mgr/dashboard: Settings service (`pr#25327 <https://github.com/ceph/ceph/pull/25327>`_, Stephan Müller)
-* mgr/dashboard: Show/Hide Grafana tabs according to user role (`issue#36655 <http://tracker.ceph.com/issues/36655>`_, `pr#24851 <https://github.com/ceph/ceph/pull/24851>`_, Kanika Murarka)
-* mgr/dashboard: Show pool dropdown for block-mgr (`issue#37295 <http://tracker.ceph.com/issues/37295>`_, `pr#25144 <https://github.com/ceph/ceph/pull/25144>`_, Ernesto Puerta)
-* mgr/dashboard: Show success notification in RGW forms (`pr#26482 <https://github.com/ceph/ceph/pull/26482>`_, Volker Theile)
-* mgr/dashboard: Simplification of PoolForm method (`pr#24892 <https://github.com/ceph/ceph/pull/24892>`_, Patrick Nawracay)
-* mgr/dashboard: Simplify OSD disabled action test (`pr#24824 <https://github.com/ceph/ceph/pull/24824>`_, Stephan Müller)
-* mgr/dashboard: special casing for minikube in run-backend-rook-api-request.sh (`pr#26600 <https://github.com/ceph/ceph/pull/26600>`_, Jeff Layton)
-* mgr/dashboard: SSO - SAML 2.0 support (`pr#24489 <https://github.com/ceph/ceph/pull/24489>`_, Ricardo Marques, Ricardo Dias)
-* mgr/dashboard: SSO - UserDoesNotExist page (`pr#26058 <https://github.com/ceph/ceph/pull/26058>`_, Alfonso Martínez)
-* mgr/dashboard: Stacktrace is optional on 'js-error' endpoint (`pr#22402 <https://github.com/ceph/ceph/pull/22402>`_, Ricardo Marques)
-* mgr/dashboard: Status info cards' improvements (`pr#25155 <https://github.com/ceph/ceph/pull/25155>`_, Alfonso Martínez)
-* mgr/dashboard: Store user table configurations (`pr#20822 <https://github.com/ceph/ceph/pull/20822>`_, Stephan Müller)
-* mgr/dashboard: Stringify object[] in KV-table (`pr#22422 <https://github.com/ceph/ceph/pull/22422>`_, Stephan Müller)
-* mgr/dashboard: Swagger-UI based Dashboard REST API page (`issue#23898 <http://tracker.ceph.com/issues/23898>`_, `pr#22282 <https://github.com/ceph/ceph/pull/22282>`_, Ricardo Dias)
-* mgr/dashboard: Sync column style with the rest of the UI (`pr#26407 <https://github.com/ceph/ceph/pull/26407>`_, Volker Theile)
-* mgr/dashboard: tasks.mgr.dashboard.test_osd.OsdTest failures (`pr#24947 <https://github.com/ceph/ceph/pull/24947>`_, Volker Theile)
-* mgr/dashboard: Task wrapper service (`pr#22014 <https://github.com/ceph/ceph/pull/22014>`_, Stephan Müller)
-* mgr/dashboard: The RGW backend doesn't handle IPv6 properly (`pr#24222 <https://github.com/ceph/ceph/pull/24222>`_, Volker Theile)
-* mgr/dashboard: typescript cleanup (`pr#26338 <https://github.com/ceph/ceph/pull/26338>`_, Alfonso Martínez)
-* mgr/dashboard: Unit Tests cleanup (`pr#24591 <https://github.com/ceph/ceph/pull/24591>`_, Tiago Melo)
-* mgr/dashboard: Update Angular packages (`pr#23706 <https://github.com/ceph/ceph/pull/23706>`_, Tiago Melo)
-* mgr/dashboard: Update Angular to version 6 (`pr#22082 <https://github.com/ceph/ceph/pull/22082>`_, Tiago Melo)
-* mgr/dashboard: Update bootstrap to v3.4.1 (`pr#26410 <https://github.com/ceph/ceph/pull/26410>`_, Tiago Melo)
-* mgr/dashboard: Updated colors in PG Status chart (`pr#26203 <https://github.com/ceph/ceph/pull/26203>`_, Alfonso Martínez)
-* mgr/dashboard: updated health API test (`pr#25813 <https://github.com/ceph/ceph/pull/25813>`_, Alfonso Martínez)
-* mgr/dashboard: Updated image on 404 page (`pr#23820 <https://github.com/ceph/ceph/pull/23820>`_, Lenz Grimmer)
-* mgr/dashboard: Update frontend packages (`pr#23466 <https://github.com/ceph/ceph/pull/23466>`_, Tiago Melo)
-* mgr/dashboard: Update I18N translation (`pr#26649 <https://github.com/ceph/ceph/pull/26649>`_, Tiago Melo)
-* mgr/dashboard: Update npm packages (`pr#24681 <https://github.com/ceph/ceph/pull/24681>`_, Tiago Melo)
-* mgr/dashboard: Update npm packages (`pr#25656 <https://github.com/ceph/ceph/pull/25656>`_, Tiago Melo)
-* mgr/dashboard: Update npm packages (`pr#26437 <https://github.com/ceph/ceph/pull/26437>`_, Tiago Melo)
-* mgr/dashboard: Update npm packages (`pr#26647 <https://github.com/ceph/ceph/pull/26647>`_, Tiago Melo)
-* mgr/dashboard: update python dependency (`pr#24928 <https://github.com/ceph/ceph/pull/24928>`_, Alfonso Martínez)
-* mgr/dashboard: Update RxJS to version 6 (`pr#21826 <https://github.com/ceph/ceph/pull/21826>`_, Tiago Melo)
-* mgr/dashboard: upgraded python dev dependencies (`pr#26007 <https://github.com/ceph/ceph/pull/26007>`_, Alfonso Martínez)
-* mgr/dashboard: Upgrade Swimlane's data-table (`pr#21880 <https://github.com/ceph/ceph/pull/21880>`_, Volker Theile)
-* mgr/dashboard: Use HTTPS in dev proxy configuration and HACKING.rst (`pr#21777 <https://github.com/ceph/ceph/pull/21777>`_, Volker Theile)
-* mgr/dashboard: Use human readable units on the sparkline graphs (`issue#25075 <http://tracker.ceph.com/issues/25075>`_, `pr#23446 <https://github.com/ceph/ceph/pull/23446>`_, Tiago Melo)
-* mgr/dashboard: User password should be optional (`pr#24128 <https://github.com/ceph/ceph/pull/24128>`_, Ricardo Marques)
-* mgr/dashboard: Validate the OSD recovery priority form input values (`issue#37436 <http://tracker.ceph.com/issues/37436>`_, `pr#25472 <https://github.com/ceph/ceph/pull/25472>`_, Tatjana Dehler)
-* mgr/dashboard: Validation for duplicate RGW user email (`issue#37369 <http://tracker.ceph.com/issues/37369>`_, `pr#25334 <https://github.com/ceph/ceph/pull/25334>`_, Kanika Murarka)
-* mgr: define option defaults for MgrStandbyModule as well (`pr#25734 <https://github.com/ceph/ceph/pull/25734>`_, Kefu Chai)
-* mgr: devicehealth: dont error on dict iteritems (`pr#22827 <https://github.com/ceph/ceph/pull/22827>`_, Abhishek Lekshmanan)
-* mgr: Diskprediction cloud activate when config changes (`pr#25165 <https://github.com/ceph/ceph/pull/25165>`_, Rick Chen)
-* mgr: don't write to output if EOPNOTSUPP (`issue#37444 <http://tracker.ceph.com/issues/37444>`_, `pr#25317 <https://github.com/ceph/ceph/pull/25317>`_, Kefu Chai)
-* mgr: enable inter-module calls (`pr#22951 <https://github.com/ceph/ceph/pull/22951>`_, John Spray)
-* mgr: Expose avgcount to the python modules (`pr#22010 <https://github.com/ceph/ceph/pull/22010>`_, Boris Ranto)
-* mgr: expose avg data for long running avgs (`pr#22420 <https://github.com/ceph/ceph/pull/22420>`_, Boris Ranto)
-* mgr: expose ec profiles through manager (`pr#23010 <https://github.com/ceph/ceph/pull/23010>`_, Noah Watkins)
-* mgr: Extend batch to accept explicit device lists (`issue#37502 <http://tracker.ceph.com/issues/37502>`_, `issue#37086 <http://tracker.ceph.com/issues/37086>`_, `issue#37590 <http://tracker.ceph.com/issues/37590>`_, `pr#25542 <https://github.com/ceph/ceph/pull/25542>`_, Jan Fajerski)
-* mgr: fix beacon interruption caused by deadlock (`pr#23482 <https://github.com/ceph/ceph/pull/23482>`_, Yan Jun)
-* mgr: fix crash due to multiple sessions from daemons with same name (`pr#25534 <https://github.com/ceph/ceph/pull/25534>`_, Mykola Golub)
-* mgr: fix permissions on `balancer execute` (`issue#25345 <http://tracker.ceph.com/issues/25345>`_, `pr#23387 <https://github.com/ceph/ceph/pull/23387>`_, John Spray)
-* mgr: Fix rook spec and have service_describe provide rados_config_location field for nfs services (`pr#25970 <https://github.com/ceph/ceph/pull/25970>`_, Jeff Layton)
-* mgr: fix typo in variable name and cleanups (`pr#22069 <https://github.com/ceph/ceph/pull/22069>`_, Kefu Chai)
-* mgr: fixup pgs show in unknown state (`issue#25103 <http://tracker.ceph.com/issues/25103>`_, `pr#23622 <https://github.com/ceph/ceph/pull/23622>`_, huanwen ren)
-* mgr: Ignore daemon if no metadata was returned (`pr#22794 <https://github.com/ceph/ceph/pull/22794>`_, Wido den Hollander)
-* mgr: Ignore __pycache__ and wheelhouse dirs (`pr#26481 <https://github.com/ceph/ceph/pull/26481>`_, Volker Theile)
-* mgr: Improve ActivePyModules::get_typed_config implementation (`pr#26149 <https://github.com/ceph/ceph/pull/26149>`_, Volker Theile)
-* mgr: improve docs for MgrModule methods (`pr#22792 <https://github.com/ceph/ceph/pull/22792>`_, John Spray)
-* mgr: improvements for dynamic osd perf counters (`pr#25488 <https://github.com/ceph/ceph/pull/25488>`_, Mykola Golub)
-* mgr: Include daemon details in SLOW_OPS output (`issue#23205 <http://tracker.ceph.com/issues/23205>`_, `pr#21750 <https://github.com/ceph/ceph/pull/21750>`_, Brad Hubbard)
-* mgr: `#include <vector>` for clang (`pr#22756 <https://github.com/ceph/ceph/pull/22756>`_, Willem Jan Withagen)
-* mgr: keep status, balancer always on (`pr#23558 <https://github.com/ceph/ceph/pull/23558>`_, Sage Weil)
-* mgr: make module error message more descriptive (`pr#25537 <https://github.com/ceph/ceph/pull/25537>`_, Joao Eduardo Luis)
-* mgr: mgr/ansible: Ansible orchestrator module (`pr#24445 <https://github.com/ceph/ceph/pull/24445>`_, Juan Miguel Olmo Martínez)
-* mgr: mgr/ansible: Create/Remove OSDs (`pr#25497 <https://github.com/ceph/ceph/pull/25497>`_, Juan Miguel Olmo Martínez)
-* mgr: mgr/ansible: Python 3 fix (`pr#25645 <https://github.com/ceph/ceph/pull/25645>`_, Sebastian Wagner)
-* mgr: mgr/balancer: add min/max fields for weekday and be compatible with C (`pr#26505 <https://github.com/ceph/ceph/pull/26505>`_, xie xingguo)
-* mgr: mgr/balancer: auto balance a list of pools (`pr#25940 <https://github.com/ceph/ceph/pull/25940>`_, xie xingguo)
-* mgr: mgr/balancer: blame if upmap won't actually work (`pr#25941 <https://github.com/ceph/ceph/pull/25941>`_, xie xingguo)
-* mgr: mgr/balancer: deepcopy best plan - otherwise we get latest (`issue#27000 <http://tracker.ceph.com/issues/27000>`_, `pr#23682 <https://github.com/ceph/ceph/pull/23682>`_, Stefan Priebe)
-* mgr: mgr/balancer: restrict automatic balancing to specific weekdays (`pr#26440 <https://github.com/ceph/ceph/pull/26440>`_, xie xingguo)
-* mgr: mgr/balancer: skip auto-balancing for pools with pending pg-merge (`pr#25626 <https://github.com/ceph/ceph/pull/25626>`_, xie xingguo)
-* mgr: mgrc: enable disabling stats via mgr_stats_threshold (`issue#25197 <http://tracker.ceph.com/issues/25197>`_, `pr#23352 <https://github.com/ceph/ceph/pull/23352>`_, John Spray)
-* mgr: mgr/crash: add hour granularity crash summary (`pr#23121 <https://github.com/ceph/ceph/pull/23121>`_, Noah Watkins)
-* mgr: mgr/crash: add process name to crash metadata (`pr#25244 <https://github.com/ceph/ceph/pull/25244>`_, Mykola Golub)
-* mgr: mgr/crash: fix python3 invalid syntax problems (`pr#23800 <https://github.com/ceph/ceph/pull/23800>`_, Ricardo Dias)
-* mgr: mgr/DaemonServer: add js-output for "ceph osd safe-to-destroy" (`pr#24799 <https://github.com/ceph/ceph/pull/24799>`_, xie xingguo)
-* mgr: mgr/DaemonServer: log pgmap usage to cluster log (`pr#26105 <https://github.com/ceph/ceph/pull/26105>`_, Neha Ojha)
-* mgr: mgr/dashboard: Add option to disable SSL (`pr#22593 <https://github.com/ceph/ceph/pull/22593>`_, Wido den Hollander)
-* mgr: mgr/dashboard: disable backend tests coverage (`pr#24193 <https://github.com/ceph/ceph/pull/24193>`_, Alfonso Martínez)
-* mgr: mgr/dashboard: Fix dashboard shutdown/restart (`pr#22159 <https://github.com/ceph/ceph/pull/22159>`_, Boris Ranto)
-* mgr: mgr/dashboard: Listen on port 8443 by default and not 8080 (`pr#22409 <https://github.com/ceph/ceph/pull/22409>`_, Wido den Hollander)
-* mgr: mgr/dashboard: use the orchestrator_cli backend setting (`pr#26325 <https://github.com/ceph/ceph/pull/26325>`_, Jeff Layton)
-* mgr: mgr/deepsea: always use 'password' parameter for salt-api auth (`pr#26904 <https://github.com/ceph/ceph/pull/26904>`_, Tim Serong)
-* mgr: mgr/deepsea: check for inflight completions when starting event reader, cleanup logging and comments (`pr#25391 <https://github.com/ceph/ceph/pull/25391>`_, Tim Serong)
-* mgr: mgr/deepsea: DeepSea orchestrator module (`pr#24610 <https://github.com/ceph/ceph/pull/24610>`_, Tim Serong)
-* mgr: mgr/devicehealth: clean up error handling (`pr#23205 <https://github.com/ceph/ceph/pull/23205>`_, John Spray)
-* mgr: mgr/devicehealth: fix is_valid_daemon_name typo error (`pr#24822 <https://github.com/ceph/ceph/pull/24822>`_, Lan Liu)
-* mgr: mgr/diskprediction_cloud: fix divide by zero when total_size is 0 (`pr#26045 <https://github.com/ceph/ceph/pull/26045>`_, Rick Chen)
-* mgr: mgr/diskprediction_cloud: Remove needless library in the requirements file (`issue#37533 <http://tracker.ceph.com/issues/37533>`_, `pr#25433 <https://github.com/ceph/ceph/pull/25433>`_, Rick Chen)
-* mgr: mgr/influx: Use Queue to store points which need to be written (`pr#23464 <https://github.com/ceph/ceph/pull/23464>`_, Wido den Hollander)
-* mgr: mgr/insights: insights reporting module (`pr#23497 <https://github.com/ceph/ceph/pull/23497>`_, Noah Watkins)
-* mgr: mgr/mgr_module.py: fix doc for set_store/set_store_json (`pr#22654 <https://github.com/ceph/ceph/pull/22654>`_, Dan Mick)
-* mgr: mgr/orchestrator: Add RGW service support (`pr#23702 <https://github.com/ceph/ceph/pull/23702>`_, Rubab-Syed)
-* mgr: mgr/orchestrator: Add service_action method (`pr#25649 <https://github.com/ceph/ceph/pull/25649>`_, Tim Serong)
-* mgr: mgr/orchestrator: Add support for "ceph orchestrator service ls" (`pr#24863 <https://github.com/ceph/ceph/pull/24863>`_, Jeff Layton)
-* mgr: mgr/orchestrator: Improve debuggability (`pr#24147 <https://github.com/ceph/ceph/pull/24147>`_, Sebastian Wagner)
-* mgr: mgr/orchestrator: Improve docstrings, add type hinting (`pr#25669 <https://github.com/ceph/ceph/pull/25669>`_, Sebastian Wagner)
-* mgr: mgr/orchestrator: Simplify Orchestrator wait implementation (`pr#25401 <https://github.com/ceph/ceph/pull/25401>`_, Juan Miguel Olmo Martínez)
-* mgr: mgr/orchestrator: use result property in Completion classes (`pr#24672 <https://github.com/ceph/ceph/pull/24672>`_, Tim Serong)
-* mgr: mgr/progress: improve+test OSD out handling (`pr#23146 <https://github.com/ceph/ceph/pull/23146>`_, John Spray)
-* mgr: mgr/progress: introduce the `progress` module (`pr#22993 <https://github.com/ceph/ceph/pull/22993>`_, John Spray)
-* mgr: mgr/prometheus: Add recovery metrics (`pr#26880 <https://github.com/ceph/ceph/pull/26880>`_, Paul Cuzner)
-* mgr: mgr/prometheus: get osd_objectstore once instead twice (`pr#26558 <https://github.com/ceph/ceph/pull/26558>`_, Konstantin Shalygin)
-* mgr: mgr/restful: Fix deep-scrub typo (`issue#36720 <http://tracker.ceph.com/issues/36720>`_, `pr#24841 <https://github.com/ceph/ceph/pull/24841>`_, Boris Ranto)
-* mgr: mgr/restful: fix py got exception when get osd info (`pr#21138 <https://github.com/ceph/ceph/pull/21138>`_, zouaiguo)
-* mgr: mgr/restful: updated string formatting to str.format() (`pr#26210 <https://github.com/ceph/ceph/pull/26210>`_, James McClune)
-* mgr: mgr/rook: fix API version and object types for recent rook changes (`pr#25452 <https://github.com/ceph/ceph/pull/25452>`_, Jeff Layton)
-* mgr: mgr/rook: Fix Rook cluster name detection (`pr#24560 <https://github.com/ceph/ceph/pull/24560>`_, Sebastian Wagner)
-* mgr: mgr/rook: update for v1beta1 API (`pr#23570 <https://github.com/ceph/ceph/pull/23570>`_, John Spray)
-* mgr: mgr/status: Add standby-replay MDS ceph version (`pr#23624 <https://github.com/ceph/ceph/pull/23624>`_, Zhi Zhang)
-* mgr: mgr/status: output to stdout, not stderr (`issue#24175 <http://tracker.ceph.com/issues/24175>`_, `pr#22089 <https://github.com/ceph/ceph/pull/22089>`_, John Spray)
-* mgr: mgr/telegraf: Send more PG status information to Telegraf (`pr#22436 <https://github.com/ceph/ceph/pull/22436>`_, Wido den Hollander)
-* mgr: mgr/telegraf: Telegraf module for Ceph Mgr (`pr#21782 <https://github.com/ceph/ceph/pull/21782>`_, Wido den Hollander)
-* mgr: mgr/telegraf: Use Python generator and catch OSError (`pr#22418 <https://github.com/ceph/ceph/pull/22418>`_, Wido den Hollander)
-* mgr: mgr/telemetry: Add Ceph Telemetry module to send reports back to project (`pr#21982 <https://github.com/ceph/ceph/pull/21982>`_, Wido den Hollander)
-* mgr: mgr/telemetry: Check if boolean is False or not present (`pr#22223 <https://github.com/ceph/ceph/pull/22223>`_, Wido den Hollander)
-* mgr: mgr/telemetry: Fix various issues (`pr#25770 <https://github.com/ceph/ceph/pull/25770>`_, Volker Theile)
-* mgr: mgr/volumes: fix orchestrator remove operation (`pr#25339 <https://github.com/ceph/ceph/pull/25339>`_, Jeff Layton)
-* mgr: mgr/zabbix: drop "total_objects" field (`pr#26052 <https://github.com/ceph/ceph/pull/26052>`_, Kefu Chai)
-* mgr: mgr/zabbix: Send more PG information to Zabbix (`pr#22434 <https://github.com/ceph/ceph/pull/22434>`_, Wido den Hollander)
-* mgr: Miscellaneous small mgr fixes (`pr#22893 <https://github.com/ceph/ceph/pull/22893>`_, John Spray)
-* mgr: modules CLI commands declaration using @CLICommand decorator (`pr#25543 <https://github.com/ceph/ceph/pull/25543>`_, Ricardo Dias)
-* mgr,mon: mgr,mon: fix to apply changed mon_stat_smooth_intervals (`pr#23481 <https://github.com/ceph/ceph/pull/23481>`_, Yan Jun)
-* mgr/orchestrator: added useful attributes to ServiceDescription (`pr#25468 <https://github.com/ceph/ceph/pull/25468>`_, Ricardo Dias)
-* mgr/orchestrator: Add host mon mgr management to interface (`pr#26314 <https://github.com/ceph/ceph/pull/26314>`_, Sebastian Wagner, Noah Watkins)
-* mgr/orchestrator: Add JSON output to CLI commands (`pr#25340 <https://github.com/ceph/ceph/pull/25340>`_, Sebastian Wagner)
-* mgr: orchestrator: add the ability to remove services (`pr#25366 <https://github.com/ceph/ceph/pull/25366>`_, Jeff Layton)
-* mgr/orchestrator: Allow the orchestrator to scale the NFS server count (`pr#26633 <https://github.com/ceph/ceph/pull/26633>`_, Jeff Layton)
-* mgr/orchestrator: clarify error message about kubernetes python module (`pr#24525 <https://github.com/ceph/ceph/pull/24525>`_, Jeff Layton)
-* mgr/orchestrator_cli: Fix README.md (`pr#26443 <https://github.com/ceph/ceph/pull/26443>`_, Sebastian Wagner)
-* mgr/orchestrator: Extend DriveGroupSpec (`pr#25912 <https://github.com/ceph/ceph/pull/25912>`_, Sebastian Wagner)
-* mgr/orchestrator: fix device pretty print with None attributes (`pr#26357 <https://github.com/ceph/ceph/pull/26357>`_, Ricardo Dias)
-* mgr/orchestrator: fix _list_services display (`pr#25610 <https://github.com/ceph/ceph/pull/25610>`_, Jeff Layton)
-* mgr/orchestrator: Fix up rook osd create dispatcher (`pr#26317 <https://github.com/ceph/ceph/pull/26317>`_, Jeff Layton)
-* mgr/orchestrator: make use of @CLICommand (`pr#26094 <https://github.com/ceph/ceph/pull/26094>`_, Sebastian Wagner)
-* mgr/orchestrator: remove unicode whitespaces (`pr#25323 <https://github.com/ceph/ceph/pull/25323>`_, Sebastian Wagner)
-* mgr/orchestrator/rook: allow the creation of OSDs in directories (`pr#26570 <https://github.com/ceph/ceph/pull/26570>`_, Jeff Layton)
-* mgr/orchestrator: Unify `osd create` and `osd add` (`pr#26171 <https://github.com/ceph/ceph/pull/26171>`_, Sebastian Wagner)
-* mgr/orch: refresh option for inventory query (`pr#26346 <https://github.com/ceph/ceph/pull/26346>`_, Noah Watkins)
-* mgr: prometheus: added bluestore db and wal/journal devices to ceph_disk_occupation metric (`issue#36627 <http://tracker.ceph.com/issues/36627>`_, `pr#24821 <https://github.com/ceph/ceph/pull/24821>`_, Konstantin Shalygin)
-* mgr: prometheus: Expose number of degraded/misplaced/unfound objects (`pr#21793 <https://github.com/ceph/ceph/pull/21793>`_, Boris Ranto)
-* mgr: prometheus: Fix metric resets (`pr#22732 <https://github.com/ceph/ceph/pull/22732>`_, Boris Ranto)
-* mgr: prometheus: Fix prometheus shutdown/restart (`pr#21748 <https://github.com/ceph/ceph/pull/21748>`_, Boris Ranto)
-* mgr: pybind/mgr: add osd space utilization to insights report (`pr#25122 <https://github.com/ceph/ceph/pull/25122>`_, Noah Watkins)
-* mgr: pybind/mgr: PEP 8 code clean and fix typo (`pr#26181 <https://github.com/ceph/ceph/pull/26181>`_, Lei Liu)
-* mgr,pybind: mgr/prometheus: add interface and objectstore to osd metadata (`pr#25234 <https://github.com/ceph/ceph/pull/25234>`_, Jan Fajerski)
-* mgr: pybind/mgr/restful: Decode the output of b64decode (`issue#38522 <http://tracker.ceph.com/issues/38522>`_, `pr#26712 <https://github.com/ceph/ceph/pull/26712>`_, Brad Hubbard)
-* mgr,pybind: mgr/rook: fix urljoin import (`pr#24626 <https://github.com/ceph/ceph/pull/24626>`_, Jeff Layton)
-* mgr,pybind: mgr/volumes: Fix Python 3 import error (`pr#25344 <https://github.com/ceph/ceph/pull/25344>`_, Sebastian Wagner)
-* mgr,pybind: pybind/mgr: drop unnecessary iterkeys usage to make py-3 compatible (`issue#37581 <http://tracker.ceph.com/issues/37581>`_, `pr#25457 <https://github.com/ceph/ceph/pull/25457>`_, Mykola Golub)
-* mgr,pybind: pybind/mgr: identify invalid fs (`pr#24392 <https://github.com/ceph/ceph/pull/24392>`_, Jos Collin)
-* mgr,pybind: src/script: add run_mypy to run static type checking on Python code (`pr#26715 <https://github.com/ceph/ceph/pull/26715>`_, Sebastian Wagner)
-* mgr: race between daemon state and service map in 'service status' (`issue#36656 <http://tracker.ceph.com/issues/36656>`_, `pr#24878 <https://github.com/ceph/ceph/pull/24878>`_, Mykola Golub)
-* mgr,rbd: mgr/prometheus: provide RBD stats via osd dynamic perf counters (`pr#25358 <https://github.com/ceph/ceph/pull/25358>`_, Mykola Golub)
-* mgr,rbd: pybind/mgr/prometheus: improve 'rbd_stats_pools' param parsing (`pr#25860 <https://github.com/ceph/ceph/pull/25860>`_, Mykola Golub)
-* mgr,rbd: pybind/mgr/prometheus: rbd stats namespace support (`pr#25636 <https://github.com/ceph/ceph/pull/25636>`_, Mykola Golub)
-* mgr: replace "Unknown error" string on always_on (`pr#23645 <https://github.com/ceph/ceph/pull/23645>`_, John Spray)
-* mgr: restful: Fix regression when traversing leaf nodes (`pr#26421 <https://github.com/ceph/ceph/pull/26421>`_, Boris Ranto)
-* mgr/rook: remove dead code and fix bug in url fetching code (`pr#26032 <https://github.com/ceph/ceph/pull/26032>`_, Jeff Layton)
-* mgr: silence GCC warning (`pr#25199 <https://github.com/ceph/ceph/pull/25199>`_, Kefu Chai)
-* mgr/ssh: fix type and doc errors (`pr#26630 <https://github.com/ceph/ceph/pull/26630>`_, Sebastian Wagner)
-* mgr/telemetry: fix total_objects (`issue#37976 <http://tracker.ceph.com/issues/37976>`_, `pr#26046 <https://github.com/ceph/ceph/pull/26046>`_, Sage Weil)
-* mgr,tests: mgr/dashboard: use dedicated tox working dir (`pr#25290 <https://github.com/ceph/ceph/pull/25290>`_, Noah Watkins)
-* mgr,tests: mgr/insights: use dedicated tox working dir (`pr#25146 <https://github.com/ceph/ceph/pull/25146>`_, Noah Watkins)
-* mgr,tests: mgr/selftest: fix disabled module selection (`pr#24517 <https://github.com/ceph/ceph/pull/24517>`_, John Spray)
-* mgr: timely health updates between monitor and manager (`pr#23294 <https://github.com/ceph/ceph/pull/23294>`_, Noah Watkins)
-* mgr: update daemon_state when necessary (`issue#37753 <http://tracker.ceph.com/issues/37753>`_, `pr#25725 <https://github.com/ceph/ceph/pull/25725>`_, Xinying Song)
-* mgr: update MMgrConfigure message to include optional OSD perf queries (`pr#24180 <https://github.com/ceph/ceph/pull/24180>`_, Julien Collet)
-* mgr: Use Py_BuildValue to create the argument tuple (`pr#26240 <https://github.com/ceph/ceph/pull/26240>`_, Volker Theile)
-* mgr: volumes mgr module fixes (`pr#25331 <https://github.com/ceph/ceph/pull/25331>`_, Jeff Layton)
-* misc: mark functions with 'override' specifier (`pr#21790 <https://github.com/ceph/ceph/pull/21790>`_, Danny Al-Gaaf)
-* mon: add 'osd destroy-new' command that only destroys NEW osd slots (`issue#24428 <http://tracker.ceph.com/issues/24428>`_, `pr#22429 <https://github.com/ceph/ceph/pull/22429>`_, Sage Weil)
-* mon: A PG with PG_STATE_REPAIR doesn't mean damaged data, PG_STATE_IN… (`issue#38070 <http://tracker.ceph.com/issues/38070>`_, `pr#26178 <https://github.com/ceph/ceph/pull/26178>`_, David Zafman)
-* mon: change monitor compact command to run asynchronously (`issue#24160 <http://tracker.ceph.com/issues/24160>`_, `issue#24159 <http://tracker.ceph.com/issues/24159>`_, `pr#22056 <https://github.com/ceph/ceph/pull/22056>`_, penglaiyxy)
-* mon: common/cmdparse: cmd_getval_throws -> cmd_getval (`pr#23557 <https://github.com/ceph/ceph/pull/23557>`_, Sage Weil)
-* mon: don't commit osdmap on no-op application ops (`pr#23528 <https://github.com/ceph/ceph/pull/23528>`_, John Spray)
-* mon: fix mgr module config option handling (`issue#35076 <http://tracker.ceph.com/issues/35076>`_, `pr#23846 <https://github.com/ceph/ceph/pull/23846>`_, Sage Weil)
-* mon: fix pg_sum_old not copied correctly (`pr#26110 <https://github.com/ceph/ceph/pull/26110>`_, Yao Zongyou)
-* monitoring/grafana: Fix OSD Capacity Utlization Grafana graph (`pr#24426 <https://github.com/ceph/ceph/pull/24426>`_, Maxime)
-* mon: make rank ordering explicit (not tied to mon address sort order) (`pr#22193 <https://github.com/ceph/ceph/pull/22193>`_, Sage Weil)
-* mon: mon/config-key: increase max key entry size (`pr#24250 <https://github.com/ceph/ceph/pull/24250>`_, Joao Eduardo Luis)
-* mon: mon/MonClient: drop my_addr (`pr#26449 <https://github.com/ceph/ceph/pull/26449>`_, Kefu Chai)
-* mon: mon/MonClient: use mon_client_ping_timeout during ping_monitor (`pr#23563 <https://github.com/ceph/ceph/pull/23563>`_, Yao Zongyou)
-* mon: mon/MonMap: add more const'ness to its methods (`pr#23709 <https://github.com/ceph/ceph/pull/23709>`_, Kefu Chai)
-* mon: mon/MonMap: remove duplicate code in get_rank (`pr#23547 <https://github.com/ceph/ceph/pull/23547>`_, Yao Zongyou)
-* mon: mon,osd: avoid str copy in parse (`pr#25640 <https://github.com/ceph/ceph/pull/25640>`_, Jos Collin)
-* mon: mon/OSDMonitor: add boundary check for pool recovery_priority (`issue#38578 <http://tracker.ceph.com/issues/38578>`_, `pr#26729 <https://github.com/ceph/ceph/pull/26729>`_, xie xingguo)
-* mon: mon/PGMap: add more #include (`pr#26420 <https://github.com/ceph/ceph/pull/26420>`_, Kefu Chai)
-* mon: mon/PGMap: command 'ceph df -f json' output add total_percent_used (`pr#23588 <https://github.com/ceph/ceph/pull/23588>`_, Yanhu Cao)
-* mon: only share monmap after authenticating (`pr#23741 <https://github.com/ceph/ceph/pull/23741>`_, Sage Weil)
-* mon: shutdown messenger early to avoid accessing deleted logger (`issue#37780 <http://tracker.ceph.com/issues/37780>`_, `pr#25760 <https://github.com/ceph/ceph/pull/25760>`_, ningtao)
-* mon: some tiny cleanups related class forward declaration (`pr#26219 <https://github.com/ceph/ceph/pull/26219>`_, Yao Zongyou)
-* mon,tests: qa/cephtool: test bounds on pool's `hit_set_\*` (`pr#24858 <https://github.com/ceph/ceph/pull/24858>`_, Joao Eduardo Luis)
-* mon:validate hit_set values before set (`issue#22659 <http://tracker.ceph.com/issues/22659>`_, `pr#19983 <https://github.com/ceph/ceph/pull/19983>`_, lijing)
-* msg: addr -> addrvec (part 1) (`pr#22306 <https://github.com/ceph/ceph/pull/22306>`_, Sage Weil)
-* msg/async: do not force updating rotating keys inline (`pr#25859 <https://github.com/ceph/ceph/pull/25859>`_, yanjun, xie xingguo)
-* msg/async/Protocol\*: send keep alive if existing wins (`issue#38493 <http://tracker.ceph.com/issues/38493>`_, `pr#26668 <https://github.com/ceph/ceph/pull/26668>`_, xie xingguo)
-* msg/async/rdma: add iWARP RDMA protocol support (`pr#20297 <https://github.com/ceph/ceph/pull/20297>`_, Haodong Tang)
-* msg/async/rdma: Delete duplicate header file (`pr#25392 <https://github.com/ceph/ceph/pull/25392>`_, Jianpeng Ma)
-* msg/async/rdma: parse IBSYNMsg.lid as hex when receiving message (`pr#26525 <https://github.com/ceph/ceph/pull/26525>`_, Peng Liu)
-* msg/async: reduce additional ceph_msg_header copy (`pr#25938 <https://github.com/ceph/ceph/pull/25938>`_, Jianpeng Ma)
-* msg/async: the ceph_abort is needless in handle_connect_msg (`pr#21751 <https://github.com/ceph/ceph/pull/21751>`_, shangfufei)
-* msg: ceph_abort() when there are enough accepter errors in msg server (`issue#23649 <http://tracker.ceph.com/issues/23649>`_, `pr#23306 <https://github.com/ceph/ceph/pull/23306>`_, penglaiyxy@gmail.com)
-* msg: clear message middle when clearing encoded message buffer (`pr#24289 <https://github.com/ceph/ceph/pull/24289>`_, "Yan, Zheng")
-* msg: entity_addr_t::parse doesn't do memset(this, 0, ...) for clean-up (`issue#26937 <http://tracker.ceph.com/issues/26937>`_, `pr#23573 <https://github.com/ceph/ceph/pull/23573>`_, Radoslaw Zarzynski)
-* nautilus: mgr/dashboard: Validate `ceph-iscsi` config version (`pr#26951 <https://github.com/ceph/ceph/pull/26951>`_, Ricardo Marques)
-* objecter: avoid race when reset down osd's session (`pr#25437 <https://github.com/ceph/ceph/pull/25437>`_, Zengran Zhang)
-* orchestrator_cli: fix HandleCommandResult invocations in _status() (`pr#25329 <https://github.com/ceph/ceph/pull/25329>`_, Jeff Layton)
-* osd: add creating to pg_string_state (`issue#36174 <http://tracker.ceph.com/issues/36174>`_, `pr#24262 <https://github.com/ceph/ceph/pull/24262>`_, Dan van der Ster)
-* osd: add --dump-journal option in ceph-osd help info (`pr#24969 <https://github.com/ceph/ceph/pull/24969>`_, yuliyang)
-* osd: Additional fields for osd "bench" command (`pr#21962 <https://github.com/ceph/ceph/pull/21962>`_, Коренберг Маркr)
-* osd: add log when pg reg next scrub (`pr#23690 <https://github.com/ceph/ceph/pull/23690>`_, lvshuhua)
-* osd: add required cls libraries as dependencies of osd (`pr#24373 <https://github.com/ceph/ceph/pull/24373>`_, Mohamad Gebai)
-* osd: Allow repair of an object with a bad data_digest in object_info on all replicas (`pr#23217 <https://github.com/ceph/ceph/pull/23217>`_, David Zafman)
-* osd: always set query_epoch explicitly for MOSDPGLog (`pr#22487 <https://github.com/ceph/ceph/pull/22487>`_, Kefu Chai)
-* osd: avoid using null agent_state (`pr#25393 <https://github.com/ceph/ceph/pull/25393>`_, Zengran Zhang)
-* osd: Change assert() to ceph_assert() missed in the transition (`pr#23918 <https://github.com/ceph/ceph/pull/23918>`_, David Zafman)
-* osd: Change osd_skip_data_digest default to false and make it LEVEL_DEV (`issue#24950 <http://tracker.ceph.com/issues/24950>`_, `pr#23083 <https://github.com/ceph/ceph/pull/23083>`_, Sage Weil, David Zafman)
-* osdc: invoke notify finish context on linger commit failure (`issue#23966 <http://tracker.ceph.com/issues/23966>`_, `pr#21831 <https://github.com/ceph/ceph/pull/21831>`_, Kefu Chai, Jason Dillaman)
-* osd: clean up and avoid extra ref-counting in PrimaryLogPG::log_op_stats (`pr#23016 <https://github.com/ceph/ceph/pull/23016>`_, Radoslaw Zarzynski)
-* osd: clean up smart probe (`issue#23899 <http://tracker.ceph.com/issues/23899>`_, `pr#21950 <https://github.com/ceph/ceph/pull/21950>`_, Sage Weil, Gu Zhongyan)
-* osd: collect client perf stats when query is enabled (`pr#24265 <https://github.com/ceph/ceph/pull/24265>`_, Julien Collet, Mykola Golub)
-* osd: combine recovery/scrub/snap sleep timer into one (`pr#21711 <https://github.com/ceph/ceph/pull/21711>`_, Jianpeng Ma)
-* osd: Deny reservation if expected backfill size would put us over bac… (`issue#24801 <http://tracker.ceph.com/issues/24801>`_, `issue#19753 <http://tracker.ceph.com/issues/19753>`_, `pr#22797 <https://github.com/ceph/ceph/pull/22797>`_, David Zafman)
-* osd: do not include Messenger.h if not necessary (`pr#22483 <https://github.com/ceph/ceph/pull/22483>`_, Kefu Chai)
-* osd: do not overestimate the size of the object for reads with trimtrunc (`issue#21931 <http://tracker.ceph.com/issues/21931>`_, `issue#22330 <http://tracker.ceph.com/issues/22330>`_, `pr#24564 <https://github.com/ceph/ceph/pull/24564>`_, Neha Ojha)
-* osd: do not treat an IO hint as an IOP for PG stats (`issue#24909 <http://tracker.ceph.com/issues/24909>`_, `pr#23029 <https://github.com/ceph/ceph/pull/23029>`_, Jason Dillaman)
-* osd: don't check overwrite flag when handling copy-get (`issue#21756 <http://tracker.ceph.com/issues/21756>`_, `pr#18241 <https://github.com/ceph/ceph/pull/18241>`_, huangjun)
-* osd: Don't evict even when preemption has restarted with smaller chunk (`pr#21892 <https://github.com/ceph/ceph/pull/21892>`_, David Zafman)
-* osd: do_sparse_read(): Verify checksum earlier so we will try to repair (`issue#24875 <http://tracker.ceph.com/issues/24875>`_, `pr#23377 <https://github.com/ceph/ceph/pull/23377>`_, David Zafman)
-* osd: drop the unused request_redirect_t::osd_instructions (`pr#24458 <https://github.com/ceph/ceph/pull/24458>`_, Radoslaw Zarzynski)
-* osd: ec saves a write access to the memory under most circumstances (`pr#26053 <https://github.com/ceph/ceph/pull/26053>`_, Zengran Zhang, Kefu Chai)
-* osd: fix build_incremental_map_msg (`issue#38282 <http://tracker.ceph.com/issues/38282>`_, `pr#26413 <https://github.com/ceph/ceph/pull/26413>`_, Sage Weil)
-* osd: fix memory leak in EC fast and error read (`pr#22500 <https://github.com/ceph/ceph/pull/22500>`_, xiaofei cui)
-* osd: Fix recovery and backfill priority handling (`issue#38041 <http://tracker.ceph.com/issues/38041>`_, `pr#26213 <https://github.com/ceph/ceph/pull/26213>`_, David Zafman)
-* osd: fix shard_info_wrapper encode (`issue#37653 <http://tracker.ceph.com/issues/37653>`_, `pr#25548 <https://github.com/ceph/ceph/pull/25548>`_, David Zafman)
-* osd: Handle omap and data digests independently (`issue#24366 <http://tracker.ceph.com/issues/24366>`_, `pr#22346 <https://github.com/ceph/ceph/pull/22346>`_, David Zafman)
-* osd: increase default hard pg limit (`pr#22187 <https://github.com/ceph/ceph/pull/22187>`_, Josh Durgin)
-* osd: keep using cache even if op will invalid cache (`pr#25490 <https://github.com/ceph/ceph/pull/25490>`_, Zengran Zhang)
-* osd: limit pg log length under all circumstances (`pr#23098 <https://github.com/ceph/ceph/pull/23098>`_, Neha Ojha)
-* osd: make OSD::HEARTBEAT_MAX_CONN inline (`pr#23424 <https://github.com/ceph/ceph/pull/23424>`_, Kefu Chai)
-* osd: make random shuffle comply with C++17 (`pr#23533 <https://github.com/ceph/ceph/pull/23533>`_, Willem Jan Withagen)
-* osd/OSDMap: add osd status to utilization dumper (`issue#35544 <http://tracker.ceph.com/issues/35544>`_, `pr#23921 <https://github.com/ceph/ceph/pull/23921>`_, Paul Emmerich)
-* osd: per-pool osd stats collection (`pr#19454 <https://github.com/ceph/ceph/pull/19454>`_, Igor Fedotv, Igor Fedotov)
-* osd: Prevent negative local num_bytes sent to peer for backfill reser… (`issue#38344 <http://tracker.ceph.com/issues/38344>`_, `pr#26465 <https://github.com/ceph/ceph/pull/26465>`_, David Zafman)
-* osd: read object attrs failed at EC recovery (`pr#22196 <https://github.com/ceph/ceph/pull/22196>`_, xiaofei cui)
-* osd: refuse to start if we're > N+2 from recorded require_osd_release (`issue#38076 <http://tracker.ceph.com/issues/38076>`_, `pr#26177 <https://github.com/ceph/ceph/pull/26177>`_, Sage Weil)
-* osd: reliably send pg_created messages to the mon (`issue#37775 <http://tracker.ceph.com/issues/37775>`_, `pr#25731 <https://github.com/ceph/ceph/pull/25731>`_, Sage Weil)
-* osd: Remove old bft= which has been superceded by backfill (`issue#36170 <http://tracker.ceph.com/issues/36170>`_, `pr#24256 <https://github.com/ceph/ceph/pull/24256>`_, David Zafman)
-* osd: remove stray derr (`pr#24042 <https://github.com/ceph/ceph/pull/24042>`_, Sage Weil)
-* osd: remove unused class read_log_and_missing_error (`pr#26057 <https://github.com/ceph/ceph/pull/26057>`_, Yao Zongyou)
-* osd: remove unused fields (`pr#26021 <https://github.com/ceph/ceph/pull/26021>`_, Jianpeng Ma)
-* osd: remove unused function (`pr#26223 <https://github.com/ceph/ceph/pull/26223>`_, Jianpeng Ma)
-* osd: Remove useless conditon (`pr#21766 <https://github.com/ceph/ceph/pull/21766>`_, Jianpeng Ma)
-* osd: some recovery improvements and cleanups (`pr#23663 <https://github.com/ceph/ceph/pull/23663>`_, xie xingguo)
-* osd: two heartbeat fixes (`pr#25126 <https://github.com/ceph/ceph/pull/25126>`_, xie xingguo)
-* osd: unlock osd_lock when tweaking osd settings (`issue#37751 <http://tracker.ceph.com/issues/37751>`_, `pr#25726 <https://github.com/ceph/ceph/pull/25726>`_, Kefu Chai)
-* osd: unmount store after service.shutdown() (`issue#37975 <http://tracker.ceph.com/issues/37975>`_, `pr#26043 <https://github.com/ceph/ceph/pull/26043>`_, Kefu Chai)
-* osd: Weighted Random Sampling for dynamic perf stats (`pr#25582 <https://github.com/ceph/ceph/pull/25582>`_, Mykola Golub)
-* osd: When possible check CRC in build_push_op() so repair can eventually stop (`issue#25084 <http://tracker.ceph.com/issues/25084>`_, `pr#23518 <https://github.com/ceph/ceph/pull/23518>`_, David Zafman)
-* osd: write "bench" output to stdout (`issue#24022 <http://tracker.ceph.com/issues/24022>`_, `pr#21905 <https://github.com/ceph/ceph/pull/21905>`_, John Spray)
-* os: Minor fixes in comments describing a transaction (`pr#22329 <https://github.com/ceph/ceph/pull/22329>`_, Bryan Stillwell)
-* performance: Add performance counters breadcrumb (`pr#22060 <https://github.com/ceph/ceph/pull/22060>`_, Ricardo Marques)
-* performance: mgr/dashboard: Enable gzip compression (`issue#36453 <http://tracker.ceph.com/issues/36453>`_, `pr#24727 <https://github.com/ceph/ceph/pull/24727>`_, Zack Cerza)
-* performance: mgr/dashboard: Replace dashboard service (`issue#36675 <http://tracker.ceph.com/issues/36675>`_, `pr#24900 <https://github.com/ceph/ceph/pull/24900>`_, Zack Cerza)
-* performance: msg/async: improve read-prefetch logic (`pr#25758 <https://github.com/ceph/ceph/pull/25758>`_, xie xingguo)
-* performance: qa/tasks/cbt.py: changes to run on bionic (`pr#22405 <https://github.com/ceph/ceph/pull/22405>`_, Neha Ojha)
-* performance,rbd: common/Throttle: TokenBucketThrottle: use reference to m_blockers.front() (`issue#36475 <http://tracker.ceph.com/issues/36475>`_, `pr#24604 <https://github.com/ceph/ceph/pull/24604>`_, Dongsheng Yang)
-* performance,rbd: pybind/rbd: optimize rbd_list2 (`pr#25445 <https://github.com/ceph/ceph/pull/25445>`_, Mykola Golub)
-* Prevent duplicated rows during async tasks (`pr#22148 <https://github.com/ceph/ceph/pull/22148>`_, Ricardo Marques)
-* prometheus: Fix order of occupation values (`pr#22149 <https://github.com/ceph/ceph/pull/22149>`_, Boris Ranto)
-* pybind: do not check MFLAGS (`pr#23601 <https://github.com/ceph/ceph/pull/23601>`_, Kefu Chai)
-* pybind: pybind/ceph_daemon: expand the order of magnitude of daemonperf statistics to ZB (`issue#23962 <http://tracker.ceph.com/issues/23962>`_, `pr#21765 <https://github.com/ceph/ceph/pull/21765>`_, Guan yunfei)
-* pybind: pybind/rbd: make the code more concise (`pr#23664 <https://github.com/ceph/ceph/pull/23664>`_, Zheng Yin)
-* pybind,rbd: pybind/rbd: add allow_shrink=True as a parameter to def resize (`pr#23605 <https://github.com/ceph/ceph/pull/23605>`_, Zheng Yin)
-* pybind,rbd: pybind/rbd: fix a typo in metadata_get comments (`pr#26138 <https://github.com/ceph/ceph/pull/26138>`_, songweibin)
-* pybind,rgw: pybind/rgw: pass the flags to callback function (`pr#25766 <https://github.com/ceph/ceph/pull/25766>`_, Kefu Chai)
-* pybind: simplify timeout handling in run_in_thread() (`pr#24733 <https://github.com/ceph/ceph/pull/24733>`_, Kefu Chai)
-* qa/btrfs/test_rmdir_async_snap: remove binary file (`pr#24108 <https://github.com/ceph/ceph/pull/24108>`_, Cleber Rosa)
-* qa,pybind,tools: Correct usage of collections.abc (`pr#25318 <https://github.com/ceph/ceph/pull/25318>`_, James Page)
-* qa/test: Added rados, rbd and fs to run two time a week only (`pr#21839 <https://github.com/ceph/ceph/pull/21839>`_, Yuri Weinstein)
-* qa/tests: added 1st draft of mimic-x suite (`pr#23292 <https://github.com/ceph/ceph/pull/23292>`_, Yuri Weinstein)
-* qa/tests - added all supported distro (`pr#22647 <https://github.com/ceph/ceph/pull/22647>`_, Yuri Weinstein)
-* qa/tests - added all supported distro to the mix, … (`pr#22674 <https://github.com/ceph/ceph/pull/22674>`_, Yuri Weinstein)
-* qa/tests: added client-upgrade-luminous suit (`pr#21947 <https://github.com/ceph/ceph/pull/21947>`_, Yuri Weinstein)
-* qa/tests: added --filter-out="ubuntu_14.04" (`pr#21949 <https://github.com/ceph/ceph/pull/21949>`_, Yuri Weinstein)
-* qa/tests - added luminous-p2p suite to the schedule (`pr#22666 <https://github.com/ceph/ceph/pull/22666>`_, Yuri Weinstein)
-* qa/tests: added mimic-x to the schedule (`pr#23302 <https://github.com/ceph/ceph/pull/23302>`_, Yuri Weinstein)
-* qa/tests - added powercycle suite to run on weekly basis on master and mimic (`pr#22606 <https://github.com/ceph/ceph/pull/22606>`_, Yuri Weinstein)
-* qa/tests:  added supported distro for powercycle suite (`pr#22185 <https://github.com/ceph/ceph/pull/22185>`_, Yuri Weinstein)
-* qa/tests: changed ceph qa email address to bypass dreamhost's spam filter (`pr#23456 <https://github.com/ceph/ceph/pull/23456>`_, Yuri Weinstein)
-* qa/tests: changed disto symlink to point to new way using supported OS'es (`pr#22536 <https://github.com/ceph/ceph/pull/22536>`_, Yuri Weinstein)
-* qa/tests: fixed typo (`pr#21858 <https://github.com/ceph/ceph/pull/21858>`_, Yuri Weinstein)
-* qa/tests: removed all jewel runs and reduced runs on ovh (`pr#22531 <https://github.com/ceph/ceph/pull/22531>`_, Yuri Weinstein)
-* rbd: add 'config global' command to get/store overrides in mon config db (`pr#24428 <https://github.com/ceph/ceph/pull/24428>`_, Mykola Golub)
-* rbd: add data pool support to trash purge (`issue#22872 <http://tracker.ceph.com/issues/22872>`_, `pr#21247 <https://github.com/ceph/ceph/pull/21247>`_, Mahati Chamarthy)
-* rbd: add group snap rollback method (`issue#23550 <http://tracker.ceph.com/issues/23550>`_, `pr#23896 <https://github.com/ceph/ceph/pull/23896>`_, songweibin)
-* rbd: add protected in snap list (`pr#23853 <https://github.com/ceph/ceph/pull/23853>`_, Zheng Yin)
-* rbd: add snapshot count in rbd info (`pr#21292 <https://github.com/ceph/ceph/pull/21292>`_, Zheng Yin)
-* rbd: add the judgment of resizing the image (`pr#21770 <https://github.com/ceph/ceph/pull/21770>`_, zhengyin)
-* rbd: basic support for images within namespaces (`issue#24558 <http://tracker.ceph.com/issues/24558>`_, `pr#22673 <https://github.com/ceph/ceph/pull/22673>`_, Jason Dillaman)
-* rbd: close image when bench is interrupted (`pr#26693 <https://github.com/ceph/ceph/pull/26693>`_, Mykola Golub)
-* rbd: cls/lock: always store v1 addr in locker_info_t (`pr#25948 <https://github.com/ceph/ceph/pull/25948>`_, Sage Weil)
-* rbd: cls/rbd: fix build (`pr#22078 <https://github.com/ceph/ceph/pull/22078>`_, Kefu Chai)
-* rbd: cls/rbd: fixed uninitialized variable compiler warning (`pr#26896 <https://github.com/ceph/ceph/pull/26896>`_, Jason Dillaman)
-* rbd: cls/rbd: fix method comment (`pr#23277 <https://github.com/ceph/ceph/pull/23277>`_, Zheng Yin)
-* rbd: cls/rbd: silence the log of get metadata error (`pr#25436 <https://github.com/ceph/ceph/pull/25436>`_, songweibin)
-* rbd: correct parameter of namespace and verify it before set_namespace (`pr#23770 <https://github.com/ceph/ceph/pull/23770>`_, songweibin)
-* rbd: dashboard: support configuring block mirroring pools and peers (`pr#25210 <https://github.com/ceph/ceph/pull/25210>`_, Jason Dillaman)
-* rbd: disable cache for actions that open multiple images (`issue#24092 <http://tracker.ceph.com/issues/24092>`_, `pr#21946 <https://github.com/ceph/ceph/pull/21946>`_, Jason Dillaman)
-* rbd: disk-usage can now optionally compute exact on-disk usage (`issue#24064 <http://tracker.ceph.com/issues/24064>`_, `pr#21912 <https://github.com/ceph/ceph/pull/21912>`_, Jason Dillaman)
-* rbd: Document new RBD feature flags and version support (`pr#25192 <https://github.com/ceph/ceph/pull/25192>`_, Valentin Lorentz)
-* rbd: don't load config overrides from monitor initially (`pr#21910 <https://github.com/ceph/ceph/pull/21910>`_, Jason Dillaman)
-* rbd: error if new size is equal to original size (`pr#22637 <https://github.com/ceph/ceph/pull/22637>`_, zhengyin)
-* rbd: expose pool stats summary tool (`pr#24830 <https://github.com/ceph/ceph/pull/24830>`_, Jason Dillaman)
-* rbd: filter out group/trash snapshots from snap_list (`pr#23638 <https://github.com/ceph/ceph/pull/23638>`_, songweibin)
-* rbd: fix a typo in error output (`pr#25931 <https://github.com/ceph/ceph/pull/25931>`_, Dongsheng Yang)
-* rbd: fix delay time calculation for trash move (`pr#25896 <https://github.com/ceph/ceph/pull/25896>`_, Mykola Golub)
-* rbd: fix error import when the input is a pipe (`issue#34536 <http://tracker.ceph.com/issues/34536>`_, `pr#23835 <https://github.com/ceph/ceph/pull/23835>`_, songweibin)
-* rbd: fix segmentation fault when rbd_group_image_list() getting -ENOENT (`issue#38468 <http://tracker.ceph.com/issues/38468>`_, `pr#26622 <https://github.com/ceph/ceph/pull/26622>`_, songweibin)
-* rbd: fix some typos (`pr#25083 <https://github.com/ceph/ceph/pull/25083>`_, Shiyang Ruan)
-* rbd: implement new 'rbd perf image iostat/iotop' commands (`issue#37913 <http://tracker.ceph.com/issues/37913>`_, `pr#26133 <https://github.com/ceph/ceph/pull/26133>`_, Jason Dillaman)
-* rbd: improved trash snapshot namespace handling (`issue#23398 <http://tracker.ceph.com/issues/23398>`_, `pr#23191 <https://github.com/ceph/ceph/pull/23191>`_, Jason Dillaman)
-* rbd: interlock object-map/fast-diff features together (`pr#21969 <https://github.com/ceph/ceph/pull/21969>`_, Mao Zhongyi)
-* rbd: introduce abort_on_full option for rbd map (`pr#25662 <https://github.com/ceph/ceph/pull/25662>`_, Dongsheng Yang)
-* rbd: journal: allow remove set when jounal pool is full (`pr#25166 <https://github.com/ceph/ceph/pull/25166>`_, kungf)
-* rbd: journal: fix potential race when closing object recorder (`pr#26425 <https://github.com/ceph/ceph/pull/26425>`_, Mykola Golub)
-* rbd:  journal: set max journal order to 26 (`issue#37541 <http://tracker.ceph.com/issues/37541>`_, `pr#25743 <https://github.com/ceph/ceph/pull/25743>`_, Mykola Golub)
-* rbd: krbd: support for images within namespaces (`pr#23841 <https://github.com/ceph/ceph/pull/23841>`_, Ilya Dryomov)
-* rbd: librbd/api: misc fix migration (`pr#25765 <https://github.com/ceph/ceph/pull/25765>`_, songweibin)
-* rbd:  librbd: ensure exclusive lock acquired when removing sync point snapshots (`issue#24898 <http://tracker.ceph.com/issues/24898>`_, `pr#23095 <https://github.com/ceph/ceph/pull/23095>`_, Mykola Golub)
-* rbd:  librbd: misc fix potential invalid pointer (`pr#25462 <https://github.com/ceph/ceph/pull/25462>`_, songweibin)
-* rbd: make sure the return-value 'r' will be returned (`pr#24891 <https://github.com/ceph/ceph/pull/24891>`_, Shiyang Ruan)
-* rbd: mgr/dashboard: incorporate RBD overall performance grafana dashboard (`issue#37867 <http://tracker.ceph.com/issues/37867>`_, `pr#25927 <https://github.com/ceph/ceph/pull/25927>`_, Jason Dillaman)
-* rbd-mirror: always attempt to restart canceled status update task (`issue#36500 <http://tracker.ceph.com/issues/36500>`_, `pr#24646 <https://github.com/ceph/ceph/pull/24646>`_, Jason Dillaman)
-* rbd-mirror: bootstrap needs to handle local image id collision (`issue#24139 <http://tracker.ceph.com/issues/24139>`_, `pr#22043 <https://github.com/ceph/ceph/pull/22043>`_, Jason Dillaman)
-* rbd-mirror: create and export replication perf counters to mgr (`pr#25834 <https://github.com/ceph/ceph/pull/25834>`_, Mykola Golub)
-* rbd-mirror: ensure daemon can cleanly exit if pool is deleted (`pr#22348 <https://github.com/ceph/ceph/pull/22348>`_, Jason Dillaman)
-* rbd-mirror: ensure remote demotion is replayed locally (`issue#24009 <http://tracker.ceph.com/issues/24009>`_, `pr#21823 <https://github.com/ceph/ceph/pull/21823>`_, Jason Dillaman)
-* rbd-mirror: fixed potential crashes during shut down (`issue#24008 <http://tracker.ceph.com/issues/24008>`_, `pr#21817 <https://github.com/ceph/ceph/pull/21817>`_, Jason Dillaman)
-* rbd-mirror: guard access to image replayer perf counters (`pr#26097 <https://github.com/ceph/ceph/pull/26097>`_, Mykola Golub)
-* rbd-mirror: instantiate the status formatter before changing state (`issue#36084 <http://tracker.ceph.com/issues/36084>`_, `pr#24181 <https://github.com/ceph/ceph/pull/24181>`_, Jason Dillaman)
-* rbd-mirror: optionally extract peer secrets from config-key (`issue#24688 <http://tracker.ceph.com/issues/24688>`_, `pr#24036 <https://github.com/ceph/ceph/pull/24036>`_, Jason Dillaman)
-* rbd-mirror: optionally support active/active replication (`pr#21915 <https://github.com/ceph/ceph/pull/21915>`_, Mykola Golub, Jason Dillaman)
-* rbd-mirror: potential deadlock when running asok 'flush' command (`issue#24141 <http://tracker.ceph.com/issues/24141>`_, `pr#22027 <https://github.com/ceph/ceph/pull/22027>`_, Mykola Golub)
-* rbd-mirror: prevent creation of clones when parents are syncing (`issue#24140 <http://tracker.ceph.com/issues/24140>`_, `pr#24063 <https://github.com/ceph/ceph/pull/24063>`_, Jason Dillaman)
-* rbd-mirror: schedule rebalancer to level-load instances (`issue#24161 <http://tracker.ceph.com/issues/24161>`_, `pr#22304 <https://github.com/ceph/ceph/pull/22304>`_, Venky Shankar)
-* rbd-mirror: update mirror status when stopping (`issue#36659 <http://tracker.ceph.com/issues/36659>`_, `pr#24864 <https://github.com/ceph/ceph/pull/24864>`_, Jason Dillaman)
-* rbd-mirror: use active/active policy by default (`issue#38453 <http://tracker.ceph.com/issues/38453>`_, `pr#26603 <https://github.com/ceph/ceph/pull/26603>`_, Jason Dillaman)
-* rbd: move image to trash as first step when removing (`issue#24226 <http://tracker.ceph.com/issues/24226>`_, `issue#38404 <http://tracker.ceph.com/issues/38404>`_, `pr#25438 <https://github.com/ceph/ceph/pull/25438>`_, Mahati Chamarthy, Jason Dillaman)
-* rbd-nbd: do not ceph_abort() after print the usages (`issue#36660 <http://tracker.ceph.com/issues/36660>`_, `pr#24815 <https://github.com/ceph/ceph/pull/24815>`_, Shiyang Ruan)
-* rbd-nbd: support namespaces (`issue#24609 <http://tracker.ceph.com/issues/24609>`_, `pr#25260 <https://github.com/ceph/ceph/pull/25260>`_, Mykola Golub)
-* rbd: not allowed to restore an image when it is being deleted (`issue#25346 <http://tracker.ceph.com/issues/25346>`_, `pr#24078 <https://github.com/ceph/ceph/pull/24078>`_, songweibin)
-* rbd: online re-sparsify of images (`pr#26226 <https://github.com/ceph/ceph/pull/26226>`_, Mykola Golub)
-* rbd: pybind/rbd: add namespace helper API methods (`issue#36622 <http://tracker.ceph.com/issues/36622>`_, `pr#25206 <https://github.com/ceph/ceph/pull/25206>`_, Jason Dillaman)
-* rbd: qa/workunits: fixed mon address parsing for rbd-mirror (`issue#38385 <http://tracker.ceph.com/issues/38385>`_, `pr#26521 <https://github.com/ceph/ceph/pull/26521>`_, Jason Dillaman)
-* rbd:  rbd: fix error parse arg when getting key (`pr#25152 <https://github.com/ceph/ceph/pull/25152>`_, songweibin)
-* rbd: rbd-fuse: look for ceph.conf in standard locations (`issue#12219 <http://tracker.ceph.com/issues/12219>`_, `pr#20598 <https://github.com/ceph/ceph/pull/20598>`_, Jason Dillaman)
-* rbd: rbd-fuse: namespace support (`pr#25265 <https://github.com/ceph/ceph/pull/25265>`_, Mykola Golub)
-* rbd: rbd-ggate: support namespaces (`issue#24608 <http://tracker.ceph.com/issues/24608>`_, `pr#25266 <https://github.com/ceph/ceph/pull/25266>`_, Mykola Golub)
-* rbd: rbd-ggate: tag "level" with need_dynamic (`pr#22557 <https://github.com/ceph/ceph/pull/22557>`_, Kefu Chai)
-* rbd: rbd_mirror: assert no requests on destroying InstanceWatcher (`pr#25666 <https://github.com/ceph/ceph/pull/25666>`_, Mykola Golub)
-* rbd: rbd_mirror: don't report error if image replay canceled (`pr#25789 <https://github.com/ceph/ceph/pull/25789>`_, Mykola Golub)
-* rbd:  rbd-mirror: use pool level config overrides (`pr#24348 <https://github.com/ceph/ceph/pull/24348>`_, Mykola Golub)
-* rbd:  rbd: show info about mirror daemon instance in image mirror status output (`pr#24717 <https://github.com/ceph/ceph/pull/24717>`_, Mykola Golub)
-* rbd: return error code when the source and distination namespace are different (`pr#24893 <https://github.com/ceph/ceph/pull/24893>`_, Shiyang Ruan)
-* rbd: simplified code to remove do_clear_limit function (`pr#23954 <https://github.com/ceph/ceph/pull/23954>`_, Zheng Yin)
-* rbd: support namespaces for image migration (`issue#26951 <http://tracker.ceph.com/issues/26951>`_, `pr#24836 <https://github.com/ceph/ceph/pull/24836>`_, Jason Dillaman)
-* rbd:  systemd/rbdmap.service: order us before remote-fs-pre.target (`issue#24713 <http://tracker.ceph.com/issues/24713>`_, `pr#22769 <https://github.com/ceph/ceph/pull/22769>`_, Ilya Dryomov)
-* rbd: test/librbd: drop unused variable ‘num_aios’ (`pr#23085 <https://github.com/ceph/ceph/pull/23085>`_, songweibin)
-* rbd,tests: krbd: alloc_size map option and tests (`pr#26244 <https://github.com/ceph/ceph/pull/26244>`_, Ilya Dryomov)
-* rbd,tests: librbd,test: remove unused context_cb() function, silence GCC warnings (`pr#24673 <https://github.com/ceph/ceph/pull/24673>`_, Kefu Chai)
-* rbd,tests: pybind/rbd: add assert_raise in test set_snap (`pr#22570 <https://github.com/ceph/ceph/pull/22570>`_, Zheng Yin)
-* rbd,tests: qa: krbd_exclusive_option.sh: bump lock_timeout to 60 seconds (`issue#25080 <http://tracker.ceph.com/issues/25080>`_, `pr#22648 <https://github.com/ceph/ceph/pull/22648>`_, Ilya Dryomov)
-* rbd,tests: qa: krbd_msgr_segments.t: filter lvcreate output (`pr#22665 <https://github.com/ceph/ceph/pull/22665>`_, Ilya Dryomov)
-* rbd,tests: qa: krbd namespaces test (`pr#26339 <https://github.com/ceph/ceph/pull/26339>`_, Ilya Dryomov)
-* rbd,tests: qa: objectstore snippets for krbd (`pr#26279 <https://github.com/ceph/ceph/pull/26279>`_, Ilya Dryomov)
-* rbd,tests: qa: rbd_workunit_kernel_untar_build: install build dependencies (`issue#35074 <http://tracker.ceph.com/issues/35074>`_, `pr#23840 <https://github.com/ceph/ceph/pull/23840>`_, Ilya Dryomov)
-* rbd,tests: qa: rbd/workunits : Replace "rbd bench-write" with "rbd bench --io-type write" (`pr#26168 <https://github.com/ceph/ceph/pull/26168>`_, Shyukri Shyukriev)
-* rbd,tests: qa/suites/krbd: more fsx tests (`pr#24354 <https://github.com/ceph/ceph/pull/24354>`_, Ilya Dryomov)
-* rbd,tests: qa/suites/rbd: randomly select a supported distro (`pr#22008 <https://github.com/ceph/ceph/pull/22008>`_, Jason Dillaman)
-* rbd,tests:  qa/tasks/cram: tasks now must live in the repository (`pr#23976 <https://github.com/ceph/ceph/pull/23976>`_, Ilya Dryomov)
-* rbd,tests: qa/tasks/cram: use suite_repo repository for all cram jobs (`pr#23905 <https://github.com/ceph/ceph/pull/23905>`_, Ilya Dryomov)
-* rbd,tests: qa/tasks/qemu: use unique clone directory to avoid race with workunit (`issue#36542 <http://tracker.ceph.com/issues/36542>`_, `pr#24696 <https://github.com/ceph/ceph/pull/24696>`_, Jason Dillaman)
-* rbd,tests: qa/workunits/rbd: fix cli generic namespace test (`pr#24457 <https://github.com/ceph/ceph/pull/24457>`_, Mykola Golub)
-* rbd,tests: qa/workunits/rbd: force v2 image format for namespace test (`pr#24512 <https://github.com/ceph/ceph/pull/24512>`_, Mykola Golub)
-* rbd,tests: qa/workunits/rbd: replace usage of 'rados mkpool' (`pr#23938 <https://github.com/ceph/ceph/pull/23938>`_, Jason Dillaman)
-* rbd,tests: qa/workunits: replace 'realpath' with 'readlink -f' in fsstress.sh (`issue#36409 <http://tracker.ceph.com/issues/36409>`_, `pr#24550 <https://github.com/ceph/ceph/pull/24550>`_, Jason Dillaman)
-* rbd,tests: test/cli-integration/rbd: added new parent image attributes (`pr#25415 <https://github.com/ceph/ceph/pull/25415>`_, Jason Dillaman)
-* rbd,tests: test/librados_test_stub: deterministically load cls shared libraries (`pr#21524 <https://github.com/ceph/ceph/pull/21524>`_, Jason Dillaman)
-* rbd,tests: test/librados_test_stub: handle object doesn't exist gracefully (`pr#25667 <https://github.com/ceph/ceph/pull/25667>`_, Mykola Golub)
-* rbd,tests: test/librbd: fix compiler -Wsign-compare warnings (`pr#23657 <https://github.com/ceph/ceph/pull/23657>`_, Mykola Golub)
-* rbd,tests: test/librbd: fix gmock warning in snapshot rollback test (`pr#23736 <https://github.com/ceph/ceph/pull/23736>`_, Jason Dillaman)
-* rbd,tests: test/librbd: fix gmock warning in TestMockIoImageRequestWQ.AcquireLockError (`pr#22778 <https://github.com/ceph/ceph/pull/22778>`_, Mykola Golub)
-* rbd,tests: test/librbd: fix gmock warnings for get_modify_timestamp call (`pr#23707 <https://github.com/ceph/ceph/pull/23707>`_, Mykola Golub)
-* rbd,tests: test/librbd: fix 'Uninteresting mock function call' warning (`pr#26322 <https://github.com/ceph/ceph/pull/26322>`_, Mykola Golub)
-* rbd,tests:  test/librbd: fix valgrind warnings (`pr#23827 <https://github.com/ceph/ceph/pull/23827>`_, Mykola Golub)
-* rbd,tests: test/librbd: fix -Wsign-compare warnings (`pr#23608 <https://github.com/ceph/ceph/pull/23608>`_, Kefu Chai)
-* rbd,tests: test/librbd: metadata key for config should be prefixed with ``conf_`` (`pr#25209 <https://github.com/ceph/ceph/pull/25209>`_, runsisi)
-* rbd,tests: test/librbd: migration supporting namespace tests (`pr#24919 <https://github.com/ceph/ceph/pull/24919>`_, Mykola Golub)
-* rbd,tests: test/librbd: migration tests did not delete additional pool (`pr#24009 <https://github.com/ceph/ceph/pull/24009>`_, Mykola Golub)
-* rbd,tests: test: move OpenStack devstack test to rocky release (`issue#36410 <http://tracker.ceph.com/issues/36410>`_, `pr#24563 <https://github.com/ceph/ceph/pull/24563>`_, Jason Dillaman)
-* rbd,tests: test/pybind: fix test_rbd.TestClone.test_trash_snapshot (`issue#25114 <http://tracker.ceph.com/issues/25114>`_, `pr#23256 <https://github.com/ceph/ceph/pull/23256>`_, Mykola Golub)
-* rbd,tests: test/pybind/test_rbd: filter out unknown list_children2 keys (`issue#37729 <http://tracker.ceph.com/issues/37729>`_, `pr#25832 <https://github.com/ceph/ceph/pull/25832>`_, Mykola Golub)
-* rbd,tests: test/rbd-mirror: disable use of gtest-parallel (`pr#22694 <https://github.com/ceph/ceph/pull/22694>`_, Jason Dillaman)
-* rbd,tests:  test/rbd_mirror: fix gmock warnings (`pr#25863 <https://github.com/ceph/ceph/pull/25863>`_, Mykola Golub)
-* rbd,tests: test/rbd_mirror: race in TestMockImageMap.AddInstancePingPongImageTest (`issue#36683 <http://tracker.ceph.com/issues/36683>`_, `pr#24897 <https://github.com/ceph/ceph/pull/24897>`_, Mykola Golub)
-* rbd,tests: test/rbd_mirror: race in WaitingOnLeaderReleaseLeader (`issue#36236 <http://tracker.ceph.com/issues/36236>`_, `pr#24300 <https://github.com/ceph/ceph/pull/24300>`_, Mykola Golub)
-* rbd,tests: test/rbd_mirror: wait for release leader lock fully complete (`pr#25935 <https://github.com/ceph/ceph/pull/25935>`_, Mykola Golub)
-* rbd,tests: test/rbd: rbd_ggate test improvements (`pr#23630 <https://github.com/ceph/ceph/pull/23630>`_, Willem Jan Withagen)
-* rbd,tests: test: silence -Wsign-compare warnings (`pr#23655 <https://github.com/ceph/ceph/pull/23655>`_, Kefu Chai)
-* rbd: tools/rbd/action: align column headers left (`pr#22566 <https://github.com/ceph/ceph/pull/22566>`_, Sage Weil)
-* rbd: tools/rbd: assert(g_ceph_context) not g_conf (`pr#23167 <https://github.com/ceph/ceph/pull/23167>`_, Kefu Chai)
-* rbd: tools/rbd: minor fixes for rbd du display (`pr#23311 <https://github.com/ceph/ceph/pull/23311>`_, songweibin)
-* rbd,tools: rbd-mirror,common: fix typos in logging messages and comments (`pr#25197 <https://github.com/ceph/ceph/pull/25197>`_, Shiyang Ruan)
-* rbd,tools: tools/rbd: assert(g_ceph_context) not g_conf (`pr#23008 <https://github.com/ceph/ceph/pull/23008>`_, Kefu Chai)
-* rbd: wait for all io complete when bench is interrupted (`pr#26918 <https://github.com/ceph/ceph/pull/26918>`_, Mykola Golub)
-* rbd: workaround for llvm linker problem, avoid std:pair dtor (`pr#25301 <https://github.com/ceph/ceph/pull/25301>`_, Willem Jan Withagen)
-* Revert "cephfs-journal-tool: enable purge_queue journal's event comma… (`pr#23465 <https://github.com/ceph/ceph/pull/23465>`_, "Yan, Zheng")
-* Revert "ceph-fuse: Delete inode's bufferhead was in Tx state would le… (`pr#21975 <https://github.com/ceph/ceph/pull/21975>`_, "Yan, Zheng")
-* rgw: abort_bucket_multiparts() ignores individual NoSuchUpload errors (`issue#35986 <http://tracker.ceph.com/issues/35986>`_, `pr#24110 <https://github.com/ceph/ceph/pull/24110>`_, Casey Bodley)
-* rgw: adapt AioThrottle for RGWGetObj (`pr#25208 <https://github.com/ceph/ceph/pull/25208>`_, Casey Bodley)
-* rgw: Add append object api (`pr#22755 <https://github.com/ceph/ceph/pull/22755>`_, zhang Shaowen, Zhang Shaowen)
-* rgw: add bucket as option when show/trim usage (`pr#23819 <https://github.com/ceph/ceph/pull/23819>`_, lvshuhua)
-* rgw: add configurable AWS-compat invalid range get behavior (`issue#24317 <http://tracker.ceph.com/issues/24317>`_, `pr#22231 <https://github.com/ceph/ceph/pull/22231>`_, Matt Benjamin)
-* rgw: add curl_low_speed_limit and curl_low_speed_time config to avoid (`pr#23058 <https://github.com/ceph/ceph/pull/23058>`_, Mark Kogan, Zhang Shaowen)
-* rgw: add Http header 'Server' in response headers (`pr#23282 <https://github.com/ceph/ceph/pull/23282>`_, Zhang Shaowen)
-* rgw: Adding documentation for Roles (`pr#24714 <https://github.com/ceph/ceph/pull/24714>`_, Pritha Srivastava)
-* rgw: add latency info in the log of req done (`pr#23906 <https://github.com/ceph/ceph/pull/23906>`_, lvshuhua)
-* rgw: add list user admin OP API (`pr#25073 <https://github.com/ceph/ceph/pull/25073>`_, Oshyn Song)
-* rgw: add --op-mask in radosgw-admin help info (`pr#24848 <https://github.com/ceph/ceph/pull/24848>`_, yuliyang)
-* rgw: add optional_yield to block_while_resharding() (`pr#25357 <https://github.com/ceph/ceph/pull/25357>`_, Casey Bodley)
-* rgw: add option for relaxed region enforcement (`issue#24507 <http://tracker.ceph.com/issues/24507>`_, `pr#22533 <https://github.com/ceph/ceph/pull/22533>`_, Matt Benjamin)
-* rgw: Add rgw xml unit tests (`pr#26682 <https://github.com/ceph/ceph/pull/26682>`_, Yuval Lifshitz)
-* rgw: add s3 notification sub resources (`pr#23405 <https://github.com/ceph/ceph/pull/23405>`_, yuliyang)
-* rgw: admin rest api support op-mask (`pr#24869 <https://github.com/ceph/ceph/pull/24869>`_, yuliyang)
-* rgw: admin/user ops dump user 'system' flag (`pr#17414 <https://github.com/ceph/ceph/pull/17414>`_, fang.yuxiang)
-* rgw: All Your Fault (`issue#24962 <http://tracker.ceph.com/issues/24962>`_, `pr#23099 <https://github.com/ceph/ceph/pull/23099>`_, Adam C. Emerson)
-* rgw: apply quota config to users created via external auth (`issue#24595 <http://tracker.ceph.com/issues/24595>`_, `pr#24177 <https://github.com/ceph/ceph/pull/24177>`_, Casey Bodley)
-* rgw: archive zone (`pr#25137 <https://github.com/ceph/ceph/pull/25137>`_, Yehuda Sadeh, Javier M. Mellid)
-* rgw: async sync_object and remove_object does not access coroutine me… (`issue#35905 <http://tracker.ceph.com/issues/35905>`_, `pr#24007 <https://github.com/ceph/ceph/pull/24007>`_, Tianshan Qu)
-* rgw: async watch registration (`pr#21838 <https://github.com/ceph/ceph/pull/21838>`_, Yehuda Sadeh)
-* rgw: avoid race condition in RGWHTTPClient::wait() (`pr#21767 <https://github.com/ceph/ceph/pull/21767>`_, cfanz)
-* rgw: beast frontend logs socket errors at level 4 (`pr#24677 <https://github.com/ceph/ceph/pull/24677>`_, Casey Bodley)
-* rgw: beast frontend parses ipv6 addrs (`issue#36662 <http://tracker.ceph.com/issues/36662>`_, `pr#24887 <https://github.com/ceph/ceph/pull/24887>`_, Casey Bodley)
-* rgw: beast frontend reworks pause/stop and yields during body io (`pr#21271 <https://github.com/ceph/ceph/pull/21271>`_, Casey Bodley)
-* rgw: bucket full sync handles delete markers (`issue#38007 <http://tracker.ceph.com/issues/38007>`_, `pr#26081 <https://github.com/ceph/ceph/pull/26081>`_, Casey Bodley)
-* rgw: bucket limit check misbehaves for > max-entries buckets (usually… (`pr#26800 <https://github.com/ceph/ceph/pull/26800>`_, Matt Benjamin)
-* rgw: bucket sync status improvements, part 1 (`pr#21788 <https://github.com/ceph/ceph/pull/21788>`_, Casey Bodley)
-* rgw: bug in versioning concurrent, list and get have consistency issue (`pr#26197 <https://github.com/ceph/ceph/pull/26197>`_, Wang Hao)
-* rgw: catch exceptions from librados::NObjectIterator (`issue#37091 <http://tracker.ceph.com/issues/37091>`_, `pr#25081 <https://github.com/ceph/ceph/pull/25081>`_, Casey Bodley)
-* rgw: change default rgw_thread_pool_size to 512 (`issue#24544 <http://tracker.ceph.com/issues/24544>`_, `pr#22581 <https://github.com/ceph/ceph/pull/22581>`_, Douglas Fuller)
-* rgw: change the "rgw admin status" 'num_shards' output to signed int (`issue#37645 <http://tracker.ceph.com/issues/37645>`_, `pr#25538 <https://github.com/ceph/ceph/pull/25538>`_, Mark Kogan)
-* rgw: check for non-existent bucket in RGWGetACLs (`pr#26212 <https://github.com/ceph/ceph/pull/26212>`_, Matt Benjamin)
-* rgw: civetweb: update for url validation fixes (`issue#24158 <http://tracker.ceph.com/issues/24158>`_, `pr#22054 <https://github.com/ceph/ceph/pull/22054>`_, Abhishek Lekshmanan)
-* rgw: civetweb: use poll instead of select while waiting on sockets (`issue#24364 <http://tracker.ceph.com/issues/24364>`_, `pr#24027 <https://github.com/ceph/ceph/pull/24027>`_, Abhishek Lekshmanan)
-* rgw: clean-up -- insure C++ source code files contain editor directives (`pr#25495 <https://github.com/ceph/ceph/pull/25495>`_, J. Eric Ivancich)
-* rgw: cleanups for sync tracing (`pr#23828 <https://github.com/ceph/ceph/pull/23828>`_, Casey Bodley)
-* rgw: clean-up -- use enum class for stats category (`pr#25450 <https://github.com/ceph/ceph/pull/25450>`_, J. Eric Ivancich)
-* rgw: cls/rgw: don't assert in decode_list_index_key() (`issue#24117 <http://tracker.ceph.com/issues/24117>`_, `pr#22440 <https://github.com/ceph/ceph/pull/22440>`_, Yehuda Sadeh)
-* rgw: cls/rgw: raise debug level of bi_log_iterate_entries output (`pr#25570 <https://github.com/ceph/ceph/pull/25570>`_, Casey Bodley)
-* rgw: cls/user: cls_user_remove_bucket writes modified header (`issue#36496 <http://tracker.ceph.com/issues/36496>`_, `pr#24645 <https://github.com/ceph/ceph/pull/24645>`_, Casey Bodley)
-* rgw: Code for STS Authentication (`pr#23504 <https://github.com/ceph/ceph/pull/23504>`_, Pritha Srivastava)
-* rgw: common/options: correct the description of rgw_enable_lc_threads option (`pr#23511 <https://github.com/ceph/ceph/pull/23511>`_, excellentkf)
-* rgw: continue enoent index in dir_suggest (`issue#24640 <http://tracker.ceph.com/issues/24640>`_, `pr#22937 <https://github.com/ceph/ceph/pull/22937>`_, Tianshan Qu)
-* rgw: copy actual stats from the source shards during reshard (`issue#36290 <http://tracker.ceph.com/issues/36290>`_, `pr#24444 <https://github.com/ceph/ceph/pull/24444>`_, Abhishek Lekshmanan)
-* rgw: Copying object data should generate new tail tag for the new object (`issue#24562 <http://tracker.ceph.com/issues/24562>`_, `pr#22613 <https://github.com/ceph/ceph/pull/22613>`_, Zhang Shaowen)
-* rgw: Correcting logic for signature calculation for non s3 ops (`pr#26098 <https://github.com/ceph/ceph/pull/26098>`_, Pritha Srivastava)
-* rgw: cors rules num limit (`pr#23434 <https://github.com/ceph/ceph/pull/23434>`_, yuliyang)
-* rgw: crypto: add openssl support for RGW encryption (`pr#15168 <https://github.com/ceph/ceph/pull/15168>`_, Qiaowei Ren)
-* rgw: data sync accepts ERR_PRECONDITION_FAILED on remove_object() (`issue#37448 <http://tracker.ceph.com/issues/37448>`_, `pr#25310 <https://github.com/ceph/ceph/pull/25310>`_, Casey Bodley)
-* rgw: data sync drains lease stack on lease failure (`issue#38479 <http://tracker.ceph.com/issues/38479>`_, `pr#26639 <https://github.com/ceph/ceph/pull/26639>`_, Casey Bodley)
-* rgw: data sync respects error_retry_time for backoff on error_repo (`issue#26938 <http://tracker.ceph.com/issues/26938>`_, `pr#23571 <https://github.com/ceph/ceph/pull/23571>`_, Casey Bodley)
-* rgw: delete multi object num limit (`pr#23544 <https://github.com/ceph/ceph/pull/23544>`_, yuliyang)
-* rgw: delete some unused code about std::regex (`pr#23221 <https://github.com/ceph/ceph/pull/23221>`_, Xueyu Bai)
-* rgw: [DNM] rgw: Controlling STS authentication via a Policy (`pr#24818 <https://github.com/ceph/ceph/pull/24818>`_, Pritha Srivastava)
-* rgw: do not ignore EEXIST in RGWPutObj::execute (`issue#22790 <http://tracker.ceph.com/issues/22790>`_, `pr#23033 <https://github.com/ceph/ceph/pull/23033>`_, Matt Benjamin)
-* rgw: Do not modify email if argument is not set (`pr#22024 <https://github.com/ceph/ceph/pull/22024>`_, Volker Theile)
-* rgw: dont access rgw_http_req_data::client of canceled request (`issue#35851 <http://tracker.ceph.com/issues/35851>`_, `pr#23988 <https://github.com/ceph/ceph/pull/23988>`_, Casey Bodley)
-* rgw: Don't treat colons specially when matching resource field of ARNs in S3 Policy (`issue#23817 <http://tracker.ceph.com/issues/23817>`_, `pr#25145 <https://github.com/ceph/ceph/pull/25145>`_, Adam C. Emerson)
-* rgw: drop unused tmp in main() (`pr#23899 <https://github.com/ceph/ceph/pull/23899>`_, luomuyao)
-* rgw: escape markers in RGWOp_Metadata_List::execute (`issue#23099 <http://tracker.ceph.com/issues/23099>`_, `pr#22721 <https://github.com/ceph/ceph/pull/22721>`_, Matt Benjamin)
-* rgw: ES sync: be more restrictive on object system attrs (`issue#36233 <http://tracker.ceph.com/issues/36233>`_, `pr#24492 <https://github.com/ceph/ceph/pull/24492>`_, Abhishek Lekshmanan)
-* rgw: etag in rgw copy result response body rather in header (`pr#23751 <https://github.com/ceph/ceph/pull/23751>`_, yuliyang)
-* rgw: feature -- log successful bucket resharding events (`pr#25510 <https://github.com/ceph/ceph/pull/25510>`_, J. Eric Ivancich)
-* rgw: fetch_remote_obj filters out olh attrs (`issue#37792 <http://tracker.ceph.com/issues/37792>`_, `pr#25794 <https://github.com/ceph/ceph/pull/25794>`_, Casey Bodley)
-* rgw: fix bad user stats on versioned bucket after reshard (`pr#25414 <https://github.com/ceph/ceph/pull/25414>`_, J. Eric Ivancich)
-* rgw: fix build (`pr#22194 <https://github.com/ceph/ceph/pull/22194>`_, Yehuda Sadeh)
-* rgw: fix build (`pr#23248 <https://github.com/ceph/ceph/pull/23248>`_, Matt Benjamin)
-* rgw: fix chunked-encoding for chunks >1MiB (`issue#35990 <http://tracker.ceph.com/issues/35990>`_, `pr#24114 <https://github.com/ceph/ceph/pull/24114>`_, Robin H. Johnson)
-* rgw: fix compilation after pubsub conflict (`pr#25568 <https://github.com/ceph/ceph/pull/25568>`_, Casey Bodley)
-* rgw: fix copy response header etag format not correct (`issue#24563 <http://tracker.ceph.com/issues/24563>`_, `pr#22614 <https://github.com/ceph/ceph/pull/22614>`_, Tianshan Qu)
-* rgw: fix CreateBucket with BucketLocation parameter failed under default zonegroup (`pr#22312 <https://github.com/ceph/ceph/pull/22312>`_, Enming Zhang)
-* rgw: fix deadlock on RGWIndexCompletionManager::stop (`issue#26949 <http://tracker.ceph.com/issues/26949>`_, `pr#23590 <https://github.com/ceph/ceph/pull/23590>`_, Yao Zongyou)
-* rgw: fix dependencies/target_link_libraries (`pr#23056 <https://github.com/ceph/ceph/pull/23056>`_, Michal Jarzabek)
-* rgw: fixes for sync of versioned objects (`issue#24367 <http://tracker.ceph.com/issues/24367>`_, `pr#22347 <https://github.com/ceph/ceph/pull/22347>`_, Casey Bodley)
-* rgw: Fixes to permission evaluation related to user policies (`pr#25180 <https://github.com/ceph/ceph/pull/25180>`_, Pritha Srivastava)
-* rgw: fix Etag error in multipart copy response (`pr#23749 <https://github.com/ceph/ceph/pull/23749>`_, yuliyang)
-* rgw: Fix for buffer overflow in STS op_post() (`issue#36579 <http://tracker.ceph.com/issues/36579>`_, `pr#24510 <https://github.com/ceph/ceph/pull/24510>`_, Pritha Srivastava, Marcus Watts)
-* rgw: Fix for SignatureMismatchError in s3 commands (`pr#26204 <https://github.com/ceph/ceph/pull/26204>`_, Pritha Srivastava)
-* rgw: fix FTBFS introduced by abca9805 (`pr#23046 <https://github.com/ceph/ceph/pull/23046>`_, Kefu Chai)
-* rgw: fix index complete miss zones_trace set (`issue#24590 <http://tracker.ceph.com/issues/24590>`_, `pr#22632 <https://github.com/ceph/ceph/pull/22632>`_, Tianshan Qu)
-* rgw: fix index update in dir_suggest_changes (`issue#24280 <http://tracker.ceph.com/issues/24280>`_, `pr#22217 <https://github.com/ceph/ceph/pull/22217>`_, Tianshan Qu)
-* rgw: fix ldap secret parsing (`pr#25796 <https://github.com/ceph/ceph/pull/25796>`_, Matt Benjamin)
-* rgw: fix leak of curl handle on shutdown (`issue#35715 <http://tracker.ceph.com/issues/35715>`_, `pr#23986 <https://github.com/ceph/ceph/pull/23986>`_, Casey Bodley)
-* rgw: Fix log level of gc_iterate_entries (`issue#23801 <http://tracker.ceph.com/issues/23801>`_, `pr#22868 <https://github.com/ceph/ceph/pull/22868>`_, iliul)
-* rgw: fix max-size in radosgw-admin and REST Admin API (`pr#24062 <https://github.com/ceph/ceph/pull/24062>`_, Nick Erdmann)
-* rgw: fix meta and data notify thread miss stop cr manager (`issue#24589 <http://tracker.ceph.com/issues/24589>`_, `pr#22631 <https://github.com/ceph/ceph/pull/22631>`_, Tianshan Qu)
-* rgw: fix obj can still be deleted even if deleteobject policy is set (`issue#37403 <http://tracker.ceph.com/issues/37403>`_, `pr#25278 <https://github.com/ceph/ceph/pull/25278>`_, Enming.Zhang)
-* rgw: fix radosgw-admin build error (`pr#21599 <https://github.com/ceph/ceph/pull/21599>`_, cfanz)
-* rgw: fix rgw_data_sync_info::json_decode() (`issue#38373 <http://tracker.ceph.com/issues/38373>`_, `pr#26494 <https://github.com/ceph/ceph/pull/26494>`_, Casey Bodley)
-* rgw: fix RGWSyncTraceNode crash in reload (`issue#24432 <http://tracker.ceph.com/issues/24432>`_, `pr#22432 <https://github.com/ceph/ceph/pull/22432>`_, Tianshan Qu)
-* rgw: fix stats for versioned buckets after reshard (`pr#25333 <https://github.com/ceph/ceph/pull/25333>`_, J. Eric Ivancich)
-* rgw: fix uninitialized access (`pr#25002 <https://github.com/ceph/ceph/pull/25002>`_, Yehuda Sadeh)
-* rgw: fix unordered bucket listing when object names are adorned (`issue#38486 <http://tracker.ceph.com/issues/38486>`_, `pr#26658 <https://github.com/ceph/ceph/pull/26658>`_, J. Eric Ivancich)
-* rgw: fix vector index out of range in RGWReadDataSyncRecoveringShardsCR (`issue#36537 <http://tracker.ceph.com/issues/36537>`_, `pr#24680 <https://github.com/ceph/ceph/pull/24680>`_, Casey Bodley)
-* rgw: fix version bucket stats (`issue#21429 <http://tracker.ceph.com/issues/21429>`_, `pr#17789 <https://github.com/ceph/ceph/pull/17789>`_, Shasha Lu)
-* rgw: fix versioned obj copy generating tags (`issue#37588 <http://tracker.ceph.com/issues/37588>`_, `pr#25473 <https://github.com/ceph/ceph/pull/25473>`_, Abhishek Lekshmanan)
-* rgw: fix wrong debug related to user ACLs in rgw_build_bucket_policies() (`issue#19514 <http://tracker.ceph.com/issues/19514>`_, `pr#14369 <https://github.com/ceph/ceph/pull/14369>`_, Radoslaw Zarzynski)
-* rgw: get or set realm zonegroup zone need check user's caps (`pr#25178 <https://github.com/ceph/ceph/pull/25178>`_, yuliyang, Casey Bodley)
-* rgw: Get the user metadata of the user used to sign the request (`pr#22390 <https://github.com/ceph/ceph/pull/22390>`_, Volker Theile)
-* rgw: handle cases around zone deletion (`issue#37328 <http://tracker.ceph.com/issues/37328>`_, `pr#25160 <https://github.com/ceph/ceph/pull/25160>`_, Abhishek Lekshmanan)
-* rgw: handle S3 version 2 pre-signed urls with meta-data (`pr#24683 <https://github.com/ceph/ceph/pull/24683>`_, Matt Benjamin)
-* rgw: have a configurable authentication order (`issue#23089 <http://tracker.ceph.com/issues/23089>`_, `pr#21494 <https://github.com/ceph/ceph/pull/21494>`_, Abhishek Lekshmanan)
-* rgw: http client: print curl error messages during curl failures (`pr#23318 <https://github.com/ceph/ceph/pull/23318>`_, Abhishek Lekshmanan)
-* rgw: Improvements to STS Lite documentation (`pr#24847 <https://github.com/ceph/ceph/pull/24847>`_, Pritha Srivastava)
-* rgw: Initial commit for AssumeRoleWithWebIdentity (`pr#26002 <https://github.com/ceph/ceph/pull/26002>`_, Pritha Srivastava)
-* rgw: initial RGWRados refactoring work (`pr#24014 <https://github.com/ceph/ceph/pull/24014>`_, Yehuda Sadeh, Casey Bodley)
-* rgw: Initial work for OPA-Ceph integration (`pr#22624 <https://github.com/ceph/ceph/pull/22624>`_, Ashutosh Narkar)
-* rgw: librgw: initialize curl and http client for multisite (`issue#36302 <http://tracker.ceph.com/issues/36302>`_, `pr#24402 <https://github.com/ceph/ceph/pull/24402>`_, Casey Bodley)
-* rgw: librgw: support symbolic link (`pr#19684 <https://github.com/ceph/ceph/pull/19684>`_, Tao Chen)
-* rgw: lifcycle: don't reject compound rules with empty prefix (`issue#37879 <http://tracker.ceph.com/issues/37879>`_, `pr#25926 <https://github.com/ceph/ceph/pull/25926>`_, Matt Benjamin)
-* rgw: Limit the number of lifecycle rules on one bucket (`issue#24572 <http://tracker.ceph.com/issues/24572>`_, `pr#22623 <https://github.com/ceph/ceph/pull/22623>`_, Zhang Shaowen)
-* rgw: list bucket can not show the object uploaded by RGWPostObj when enable bucket versioning (`pr#24341 <https://github.com/ceph/ceph/pull/24341>`_, yuliyang)
-* rgw: log http status with op prefix if available (`pr#25102 <https://github.com/ceph/ceph/pull/25102>`_, Casey Bodley)
-* rgw: log refactoring for data sync (`pr#23843 <https://github.com/ceph/ceph/pull/23843>`_, Casey Bodley)
-* rgw: log refactoring for meta sync (`pr#23950 <https://github.com/ceph/ceph/pull/23950>`_, Casey Bodley, Ali Maredia)
-* rgw: make beast the default for rgw_frontends (`pr#26599 <https://github.com/ceph/ceph/pull/26599>`_, Casey Bodley)
-* rgw: Minor fixes to AssumeRole for boto compliance (`pr#24845 <https://github.com/ceph/ceph/pull/24845>`_, Pritha Srivastava)
-* rgw: Minor fixes to radosgw-admin commands for a role (`pr#24730 <https://github.com/ceph/ceph/pull/24730>`_, Pritha Srivastava)
-* rgw: move all reshard config options out of legacy_config_options (`pr#25356 <https://github.com/ceph/ceph/pull/25356>`_, J. Eric Ivancich)
-* rgw: move keystone secrets from ceph.conf to files (`issue#36621 <http://tracker.ceph.com/issues/36621>`_, `pr#24816 <https://github.com/ceph/ceph/pull/24816>`_, Matt Benjamin)
-* rgw: multiple es related fixes and improvements (`issue#22877 <http://tracker.ceph.com/issues/22877>`_, `issue#38028 <http://tracker.ceph.com/issues/38028>`_, `issue#38030 <http://tracker.ceph.com/issues/38030>`_, `issue#36092 <http://tracker.ceph.com/issues/36092>`_, `pr#26106 <https://github.com/ceph/ceph/pull/26106>`_, Yehuda Sadeh, Abhishek Lekshmanan)
-* rgw: need to give a type in list constructor (`pr#25161 <https://github.com/ceph/ceph/pull/25161>`_, Willem Jan Withagen)
-* rgw: new librgw_admin_us (`pr#21439 <https://github.com/ceph/ceph/pull/21439>`_, Orit Wasserman, Matt Benjamin)
-* rgw: policy: fix NotAction, NotPricipal, NotResource does not take effect (`pr#23625 <https://github.com/ceph/ceph/pull/23625>`_, xiangxiang)
-* rgw: policy: fix s3:x-amz-grant-read-acp keyword error (`pr#23610 <https://github.com/ceph/ceph/pull/23610>`_, xiangxiang)
-* rgw: policy: modify some operation permission keyword (`issue#24061 <http://tracker.ceph.com/issues/24061>`_, `pr#20974 <https://github.com/ceph/ceph/pull/20974>`_, xiangxiang)
-* rgw: pub-sub (`pr#23298 <https://github.com/ceph/ceph/pull/23298>`_, Yehuda Sadeh)
-* rgw: qa/suites/rgw/verify/tasks/cls_rgw: test cls_rgw (`pr#22919 <https://github.com/ceph/ceph/pull/22919>`_, Sage Weil)
-* rgw: radogw-admin reshard status command should print text for reshard status (`issue#23257 <http://tracker.ceph.com/issues/23257>`_, `pr#20779 <https://github.com/ceph/ceph/pull/20779>`_, Orit Wasserman)
-* rgw: radosgw-admin: add mfa related command and options (`pr#23416 <https://github.com/ceph/ceph/pull/23416>`_, Enming.Zhang)
-* rgw: `radosgw-admin bucket rm ... --purge-objects` can hang (`issue#38134 <http://tracker.ceph.com/issues/38134>`_, `pr#26231 <https://github.com/ceph/ceph/pull/26231>`_, J. Eric Ivancich)
-* rgw: "radosgw-admin objects expire" always returns ok even if the process fails (`issue#24592 <http://tracker.ceph.com/issues/24592>`_, `pr#22635 <https://github.com/ceph/ceph/pull/22635>`_, Zhang Shaowen)
-* rgw: radosgw-admin: 'sync error trim' loops until complete (`issue#24873 <http://tracker.ceph.com/issues/24873>`_, `pr#23032 <https://github.com/ceph/ceph/pull/23032>`_, Casey Bodley)
-* rgw: radosgw-admin: translate reshard status codes (trivial) (`issue#36486 <http://tracker.ceph.com/issues/36486>`_, `pr#24638 <https://github.com/ceph/ceph/pull/24638>`_, Matt Benjamin)
-* rgw: RADOS::Obj::operate takes optional_yield (`pr#25068 <https://github.com/ceph/ceph/pull/25068>`_, Casey Bodley)
-* rgw: rados tiering (`issue#19510 <http://tracker.ceph.com/issues/19510>`_, `pr#25774 <https://github.com/ceph/ceph/pull/25774>`_, yuliyang, Yehuda Sadeh, Zhang Shaowen)
-* rgw: raise debug level on redundant data sync error messages (`issue#35830 <http://tracker.ceph.com/issues/35830>`_, `pr#23981 <https://github.com/ceph/ceph/pull/23981>`_, Casey Bodley)
-* rgw: raise default rgw_curl_low_speed_time to 300 seconds (`issue#27989 <http://tracker.ceph.com/issues/27989>`_, `pr#23759 <https://github.com/ceph/ceph/pull/23759>`_, Casey Bodley)
-* rgw: refactor logging in gc and lc (`pr#24530 <https://github.com/ceph/ceph/pull/24530>`_, Ali Maredia)
-* rgw: refactor PutObjProcessor stack (`pr#24453 <https://github.com/ceph/ceph/pull/24453>`_, Casey Bodley)
-* rgw: reject invalid methods in validate_cors_rule_method (`issue#24223 <http://tracker.ceph.com/issues/24223>`_, `pr#22145 <https://github.com/ceph/ceph/pull/22145>`_, Jeegn Chen)
-* rgw: remove all traces of cls replica_log (`pr#21680 <https://github.com/ceph/ceph/pull/21680>`_, Casey Bodley)
-* rgw: remove duplicated ``RGWRados::list_buckets_`` helpers (`pr#25240 <https://github.com/ceph/ceph/pull/25240>`_, Casey Bodley)
-* rgw: remove expired entries from the cache (`issue#23379 <http://tracker.ceph.com/issues/23379>`_, `pr#22410 <https://github.com/ceph/ceph/pull/22410>`_, Mark Kogan)
-* rgw: remove repetitive conditional statement in RGWHandler_REST_Obj_S3 (`pr#24162 <https://github.com/ceph/ceph/pull/24162>`_, Zhang Shaowen)
-* rgw: remove rgw_aclparser.cc (`issue#36665 <http://tracker.ceph.com/issues/36665>`_, `pr#24866 <https://github.com/ceph/ceph/pull/24866>`_, Matt Benjamin)
-* rgw: remove the useless is_cors_op in RGWHandler_REST_Obj_S3 (`pr#22114 <https://github.com/ceph/ceph/pull/22114>`_, Zhang Shaowen)
-* rgw: remove unused aio helper functions (`pr#25239 <https://github.com/ceph/ceph/pull/25239>`_, Casey Bodley)
-* rgw: renew resharding locks to prevent expiration (`issue#27219 <http://tracker.ceph.com/issues/27219>`_, `issue#34307 <http://tracker.ceph.com/issues/34307>`_, `pr#24406 <https://github.com/ceph/ceph/pull/24406>`_, Orit Wasserman, J. Eric Ivancich)
-* rgw: repair olh attributes that were broken by sync (`issue#37792 <http://tracker.ceph.com/issues/37792>`_, `pr#26157 <https://github.com/ceph/ceph/pull/26157>`_, Casey Bodley)
-* rgw: require --yes-i-really-mean-it to run radosgw-admin orphans find (`issue#24146 <http://tracker.ceph.com/issues/24146>`_, `pr#22036 <https://github.com/ceph/ceph/pull/22036>`_, Matt Benjamin)
-* rgw: reshard add: fail correctly on a non existant bucket (`issue#36449 <http://tracker.ceph.com/issues/36449>`_, `pr#24594 <https://github.com/ceph/ceph/pull/24594>`_, Abhishek Lekshmanan)
-* rgw: reshard clean-up and associated commits (`pr#25142 <https://github.com/ceph/ceph/pull/25142>`_, J. Eric Ivancich)
-* rgw: reshard improvements (`pr#25003 <https://github.com/ceph/ceph/pull/25003>`_, J. Eric Ivancich)
-* rgw: reshard stale instance cleanup (`issue#24082 <http://tracker.ceph.com/issues/24082>`_, `pr#24662 <https://github.com/ceph/ceph/pull/24662>`_, Abhishek Lekshmanan)
-* rgw: resolve bugs and clean up garbage collection code (`issue#38454 <http://tracker.ceph.com/issues/38454>`_, `pr#26601 <https://github.com/ceph/ceph/pull/26601>`_, J. Eric Ivancich)
-* rgw: resolve bug where marker was not advanced during garbage collection (`issue#38408 <http://tracker.ceph.com/issues/38408>`_, `pr#26545 <https://github.com/ceph/ceph/pull/26545>`_, J. Eric Ivancich)
-* rgw: return err_malformed_xml when MaxAgeSeconds is an invalid integer (`issue#26957 <http://tracker.ceph.com/issues/26957>`_, `pr#23626 <https://github.com/ceph/ceph/pull/23626>`_, Chang Liu)
-* rgw: Return tenant field in bucket_stats function (`pr#24895 <https://github.com/ceph/ceph/pull/24895>`_, Volker Theile)
-* rgw: return valid Location element, PostObj (`issue#22927 <http://tracker.ceph.com/issues/22927>`_, `pr#20330 <https://github.com/ceph/ceph/pull/20330>`_, yuliyang)
-* rgw: return x-amz-version-id: null when delete obj in versioning suspended bucket (`issue#35814 <http://tracker.ceph.com/issues/35814>`_, `pr#23927 <https://github.com/ceph/ceph/pull/23927>`_, yuliyang)
-* rgw: Revert "rgw: lifcycle: don't reject compound rules with empty prefix" (`pr#26491 <https://github.com/ceph/ceph/pull/26491>`_, Matt Benjamin)
-* rgw: rgw-admin: add "--trim-delay-ms" introduction for 'sync error trim' (`pr#23342 <https://github.com/ceph/ceph/pull/23342>`_, Enming.Zhang)
-* rgw: rgw-admin: fix data sync report for master zone (`pr#23925 <https://github.com/ceph/ceph/pull/23925>`_, cfanz)
-* rgw: RGWAsyncGetBucketInstanceInfo does not access coroutine memory (`issue#35812 <http://tracker.ceph.com/issues/35812>`_, `pr#23987 <https://github.com/ceph/ceph/pull/23987>`_, Casey Bodley)
-* rgw: rgw/beast: drop privileges after binding ports (`issue#36041 <http://tracker.ceph.com/issues/36041>`_, `pr#24271 <https://github.com/ceph/ceph/pull/24271>`_, Paul Emmerich)
-* rgw: RGWBucket::link supports tenant (`issue#22666 <http://tracker.ceph.com/issues/22666>`_, `pr#23119 <https://github.com/ceph/ceph/pull/23119>`_, Casey Bodley)
-* rgw:     rgw: change the way sysobj filters raw attributes, fix bucket sync state xattrs (`issue#37281 <http://tracker.ceph.com/issues/37281>`_, `pr#25123 <https://github.com/ceph/ceph/pull/25123>`_, Yehuda Sadeh)
-* rgw: rgw, cls: remove cls_statelog and rgw opstate tracking (`pr#24059 <https://github.com/ceph/ceph/pull/24059>`_, Casey Bodley)
-* rgw: rgw_file: deep stat handling (`issue#24915 <http://tracker.ceph.com/issues/24915>`_, `pr#23038 <https://github.com/ceph/ceph/pull/23038>`_, Matt Benjamin)
-* rgw: rgw_file: not check max_objects when creating file (`pr#24846 <https://github.com/ceph/ceph/pull/24846>`_, Tao Chen)
-* rgw: rgw_file: use correct secret key to check auth (`pr#26130 <https://github.com/ceph/ceph/pull/26130>`_, MinSheng Lin)
-* rgw: rgw_file: user info never synced since librgw init (`pr#25406 <https://github.com/ceph/ceph/pull/25406>`_, Tao Chen)
-* rgw: [rgw]: Fix help of radosgw-admin user info in case no uid (`pr#25078 <https://github.com/ceph/ceph/pull/25078>`_, Marc Koderer)
-* rgw: rgwgc:process coredump in some special case (`issue#23199 <http://tracker.ceph.com/issues/23199>`_, `pr#25430 <https://github.com/ceph/ceph/pull/25430>`_, zhaokun)
-* rgw: rgw multisite: async rados requests don't access coroutine memory (`issue#35543 <http://tracker.ceph.com/issues/35543>`_, `pr#23920 <https://github.com/ceph/ceph/pull/23920>`_, Casey Bodley)
-* rgw: rgw multisite: bucket sync transitions back to StateInit on OP_SYNCSTOP (`issue#26895 <http://tracker.ceph.com/issues/26895>`_, `pr#23574 <https://github.com/ceph/ceph/pull/23574>`_, Casey Bodley)
-* rgw: rgw multisite: enforce spawn_window for data full sync (`issue#26897 <http://tracker.ceph.com/issues/26897>`_, `pr#23534 <https://github.com/ceph/ceph/pull/23534>`_, Casey Bodley)
-* rgw: rgw-multisite: fix endless loop in RGWBucketShardIncrementalSyncCR (`issue#24603 <http://tracker.ceph.com/issues/24603>`_, `pr#22660 <https://github.com/ceph/ceph/pull/22660>`_, cfanz)
-* rgw: rgw multisite: incremental data sync uses truncated flag to detect end of listing (`issue#26952 <http://tracker.ceph.com/issues/26952>`_, `pr#23596 <https://github.com/ceph/ceph/pull/23596>`_, Casey Bodley)
-* rgw: rgw multisite: only update last_trim marker on ENODATA (`issue#38075 <http://tracker.ceph.com/issues/38075>`_, `pr#26190 <https://github.com/ceph/ceph/pull/26190>`_, Casey Bodley)
-* rgw: rgw multisite: uses local DataChangesLog to track active buckets for trim (`issue#36034 <http://tracker.ceph.com/issues/36034>`_, `pr#24221 <https://github.com/ceph/ceph/pull/24221>`_, Casey Bodley)
-* rgw: rgw/pubsub: add amqp push endpoint (`pr#25866 <https://github.com/ceph/ceph/pull/25866>`_, Yuval Lifshitz)
-* rgw: rgw/pubsub: add pubsub tests (`pr#26299 <https://github.com/ceph/ceph/pull/26299>`_, Yuval Lifshitz)
-* rgw: RGWRadosGetOmapKeysCR takes result by shared_ptr (`issue#21154 <http://tracker.ceph.com/issues/21154>`_, `pr#23634 <https://github.com/ceph/ceph/pull/23634>`_, Casey Bodley)
-* rgw: RGWRadosGetOmapKeysCR uses 'more' flag from omap_get_keys2() (`pr#23401 <https://github.com/ceph/ceph/pull/23401>`_, Casey Bodley, Sage Weil)
-* rgw: remove duplicate include header files in rgw_rados.cc (`pr#18578 <https://github.com/ceph/ceph/pull/18578>`_, Sibei Gao)
-* rgw: rgw_sync: drop ENOENT error logs from mdlog (`pr#26971 <https://github.com/ceph/ceph/pull/26971>`_, Abhishek Lekshmanan)
-* rgw: Robustly notify (`issue#24963 <http://tracker.ceph.com/issues/24963>`_, `pr#23100 <https://github.com/ceph/ceph/pull/23100>`_, Adam C. Emerson)
-* rgw: s3: awsv4 drop special handling for x-amz-credential (`issue#26965 <http://tracker.ceph.com/issues/26965>`_, `pr#23652 <https://github.com/ceph/ceph/pull/23652>`_, Abhishek Lekshmanan)
-* rgw: sanitize customer encryption keys from log output in v4 auth (`issue#37847 <http://tracker.ceph.com/issues/37847>`_, `pr#25881 <https://github.com/ceph/ceph/pull/25881>`_, Casey Bodley)
-* rgw: scheduler (`pr#26008 <https://github.com/ceph/ceph/pull/26008>`_, Casey Bodley, Abhishek Lekshmanan)
-* rgw: set cr state if aio_read err return in RGWCloneMetaLogCoroutine (`issue#24566 <http://tracker.ceph.com/issues/24566>`_, `pr#22617 <https://github.com/ceph/ceph/pull/22617>`_, Tianshan Qu)
-* rgw: set default objecter_inflight_ops = 24576 (`issue#25109 <http://tracker.ceph.com/issues/25109>`_, `pr#23242 <https://github.com/ceph/ceph/pull/23242>`_, Matt Benjamin)
-* rgw:  should recode  canonical_uri when caculate s3 v4 auth (`issue#23587 <http://tracker.ceph.com/issues/23587>`_, `pr#21286 <https://github.com/ceph/ceph/pull/21286>`_, yuliyang)
-* rgw: some fix for es sync (`issue#23842 <http://tracker.ceph.com/issues/23842>`_, `issue#23841 <http://tracker.ceph.com/issues/23841>`_, `pr#21622 <https://github.com/ceph/ceph/pull/21622>`_, Tianshan Qu, Shang Ding)
-* rgw: support admin rest api get user info through user's access-key (`pr#22790 <https://github.com/ceph/ceph/pull/22790>`_, yuliyang)
-* rgw: support server-side encryption when SSL is terminated in a proxy (`issue#27221 <http://tracker.ceph.com/issues/27221>`_, `pr#24700 <https://github.com/ceph/ceph/pull/24700>`_, Casey Bodley)
-* rgw: Swift SLO size_bytes member is optional (`issue#18936 <http://tracker.ceph.com/issues/18936>`_, `pr#22967 <https://github.com/ceph/ceph/pull/22967>`_, Matt Benjamin)
-* rgw: Swift's TempURL can handle temp_url_expires written in ISO8601 (`issue#20795 <http://tracker.ceph.com/issues/20795>`_, `pr#16658 <https://github.com/ceph/ceph/pull/16658>`_, Radoslaw Zarzynski)
-* rgw: sync module: avoid printing attrs of objects in log (`issue#37646 <http://tracker.ceph.com/issues/37646>`_, `pr#25541 <https://github.com/ceph/ceph/pull/25541>`_, Abhishek Lekshmanan)
-* rgw: test bi list (`issue#24483 <http://tracker.ceph.com/issues/24483>`_, `pr#21772 <https://github.com/ceph/ceph/pull/21772>`_, Orit Wasserman)
-* rgw: test/rgw: add ifdef for HAVE_BOOST_CONTEXT (`pr#25744 <https://github.com/ceph/ceph/pull/25744>`_, Casey Bodley)
-* rgw,tests: qa: add test for https://github.com/ceph/ceph/pull/22790 (`pr#23143 <https://github.com/ceph/ceph/pull/23143>`_, yuliyang)
-* rgw,tests: qa/rgw: add cls_lock/log/refcount/version tests to verify suite (`pr#25381 <https://github.com/ceph/ceph/pull/25381>`_, Casey Bodley)
-* rgw,tests: qa/rgw: add missing import line (`pr#25298 <https://github.com/ceph/ceph/pull/25298>`_, Shilpa Jagannath)
-* rgw,tests: qa/rgw: add radosgw-admin-rest task to singleton suite (`pr#23145 <https://github.com/ceph/ceph/pull/23145>`_, Casey Bodley)
-* rgw,tests: qa/rgw: disable testing on ec-cache pools (`issue#23965 <http://tracker.ceph.com/issues/23965>`_, `pr#22126 <https://github.com/ceph/ceph/pull/22126>`_, Casey Bodley)
-* rgw,tests: qa/rgw: fix invalid syntax error in radosgw_admin_rest.py (`issue#37440 <http://tracker.ceph.com/issues/37440>`_, `pr#25305 <https://github.com/ceph/ceph/pull/25305>`_, Casey Bodley)
-* rgw,tests: qa/rgw: move ragweed upgrade test into upgrade/luminous-x (`pr#21707 <https://github.com/ceph/ceph/pull/21707>`_, Casey Bodley)
-* rgw,tests: qa/rgw: override valgrind --max-threads for radosgw (`issue#25214 <http://tracker.ceph.com/issues/25214>`_, `pr#23372 <https://github.com/ceph/ceph/pull/23372>`_, Casey Bodley)
-* rgw,tests: qa/rgw: patch keystone requirements.txt (`issue#23659 <http://tracker.ceph.com/issues/23659>`_, `pr#23402 <https://github.com/ceph/ceph/pull/23402>`_, Casey Bodley)
-* rgw,tests: qa/rgw: reduce number of multisite log shards (`pr#24011 <https://github.com/ceph/ceph/pull/24011>`_, Casey Bodley)
-* rgw,tests: qa/rgw: reorganize verify tasks (`pr#22249 <https://github.com/ceph/ceph/pull/22249>`_, Casey Bodley)
-* rgw,tests: qa/rgw/tempest: either force os_type or select random distro (`pr#25996 <https://github.com/ceph/ceph/pull/25996>`_, Yehuda Sadeh)
-* rgw,tests: test/rgw: fix for bucket checkpoints (`issue#24212 <http://tracker.ceph.com/issues/24212>`_, `pr#22124 <https://github.com/ceph/ceph/pull/22124>`_, Casey Bodley)
-* rgw,tests: test/rgw: fix race in test_rgw_reshard_wait (`pr#26741 <https://github.com/ceph/ceph/pull/26741>`_, Casey Bodley)
-* rgw,tests: test/rgw: silence -Wsign-compare warnings (`pr#26364 <https://github.com/ceph/ceph/pull/26364>`_, Kefu Chai)
-* rgw: The delete markers generated by object expiration should have owner attribute (`issue#24568 <http://tracker.ceph.com/issues/24568>`_, `pr#22619 <https://github.com/ceph/ceph/pull/22619>`_, Zhang Shaowen)
-* rgw: the error code returned by rgw is different from amz s3 when getting cors (`issue#26964 <http://tracker.ceph.com/issues/26964>`_, `pr#23646 <https://github.com/ceph/ceph/pull/23646>`_, ashitakasam)
-* rgw: thread DoutPrefixProvider into RGW::Auth_S3::authorize (`pr#24409 <https://github.com/ceph/ceph/pull/24409>`_, Ali Maredia)
-* rgw,tools: ceph-dencoder: add RGWRealm and RGWPeriod  support (`pr#25057 <https://github.com/ceph/ceph/pull/25057>`_, yuliyang)
-* rgw,tools: cls: refcount: add obj_refcount to ceph-dencoder (`pr#25441 <https://github.com/ceph/ceph/pull/25441>`_, Abhishek Lekshmanan)
-* rgw,tools: cls/rgw: ready rgw_usage_log_entry for extraction via ceph-dencoder (`issue#34537 <http://tracker.ceph.com/issues/34537>`_, `pr#22344 <https://github.com/ceph/ceph/pull/22344>`_, Vaibhav Bhembre)
-* rgw,tools: vstart: make beast as the default frontend for rgw (`pr#26566 <https://github.com/ceph/ceph/pull/26566>`_, Abhishek Lekshmanan)
-* rgw,tools: vstart: rgw: disable the lc debug interval option (`pr#25487 <https://github.com/ceph/ceph/pull/25487>`_, Abhishek Lekshmanan)
-* rgw,tools: vstart: set admin socket for RGW in conf (`pr#23983 <https://github.com/ceph/ceph/pull/23983>`_, Abhishek Lekshmanan)
-* rgw: update cls_rgw.cc and cls_rgw_const.h (`pr#24001 <https://github.com/ceph/ceph/pull/24001>`_, yuliyang)
-* rgw: update ObjectCacheInfo::time_added on overwrite (`issue#24346 <http://tracker.ceph.com/issues/24346>`_, `pr#22324 <https://github.com/ceph/ceph/pull/22324>`_, Casey Bodley)
-* rgw: update --url in usage and doc (`pr#22100 <https://github.com/ceph/ceph/pull/22100>`_, Jos Collin)
-* rgw: use chunked encoding to get partial results out faster (`issue#12713 <http://tracker.ceph.com/issues/12713>`_, `pr#23940 <https://github.com/ceph/ceph/pull/23940>`_, Robin H. Johnson)
-* rgw: use coarse_real_clock for req_state::time (`pr#21893 <https://github.com/ceph/ceph/pull/21893>`_, Casey Bodley)
-* rgw: use DoutPrefixProvider to add more context to log output (`pr#21700 <https://github.com/ceph/ceph/pull/21700>`_, Casey Bodley)
-* rgw: use partial-order bucket listing in RGWLC, add configurable processing delay (`issue#23956 <http://tracker.ceph.com/issues/23956>`_, `pr#21755 <https://github.com/ceph/ceph/pull/21755>`_, Matt Benjamin)
-* rgw: User Policy (`pr#21379 <https://github.com/ceph/ceph/pull/21379>`_, Pritha Srivastava)
-* rgw: user stats account for resharded buckets (`pr#24595 <https://github.com/ceph/ceph/pull/24595>`_, Casey Bodley)
-* rgw: warn if zone doesn't contain all zg's placement targets (`pr#22452 <https://github.com/ceph/ceph/pull/22452>`_, Abhishek Lekshmanan)
-* rgw: website routing rules num limit (`pr#23429 <https://github.com/ceph/ceph/pull/23429>`_, yuliyang)
-* rgw: when exclusive lock fails due existing lock, log add'l info (`issue#38171 <http://tracker.ceph.com/issues/38171>`_, `pr#26272 <https://github.com/ceph/ceph/pull/26272>`_, J. Eric Ivancich)
-* rgw: zone service only provides const access to its data (`pr#25412 <https://github.com/ceph/ceph/pull/25412>`_, Casey Bodley)
-* rocksdb: pick up a fix to be backward compatible (`issue#25146 <http://tracker.ceph.com/issues/25146>`_, `pr#25070 <https://github.com/ceph/ceph/pull/25070>`_, Kefu Chai)
-* script: build-integration-branch: avoid Unicode error (`issue#24003 <http://tracker.ceph.com/issues/24003>`_, `pr#21807 <https://github.com/ceph/ceph/pull/21807>`_, Nathan Cutler)
-* script/kubejacker: Add openSUSE based images (`pr#24055 <https://github.com/ceph/ceph/pull/24055>`_, Sebastian Wagner)
-* scripts: backport-create-issue: complain about duplicates and support mimic (`issue#24071 <http://tracker.ceph.com/issues/24071>`_, `pr#21634 <https://github.com/ceph/ceph/pull/21634>`_, Nathan Cutler)
-* seastar: pickup fix for segfault in POSIX stack (`pr#25861 <https://github.com/ceph/ceph/pull/25861>`_, Kefu Chai)
-* spec: add missing rbd mirror bootstrap directory (`pr#24856 <https://github.com/ceph/ceph/pull/24856>`_, Sébastien Han)
-* src: balance std::hex and std::dec manipulators (`pr#22287 <https://github.com/ceph/ceph/pull/22287>`_, Kefu Chai)
-* src/ceph.in: dev mode: add build path to beginning of PATH, not end (`issue#24578 <http://tracker.ceph.com/issues/24578>`_, `pr#22628 <https://github.com/ceph/ceph/pull/22628>`_, Dan Mick)
-* src: Eliminate new warnings in Fedora 28 (`pr#21898 <https://github.com/ceph/ceph/pull/21898>`_, Adam C. Emerson)
-* test/crimson: fixes of unittest_seastar_echo (`pr#26419 <https://github.com/ceph/ceph/pull/26419>`_, Yingxin Cheng, Kefu Chai)
-* test/fio: fix compiler failure (`pr#22728 <https://github.com/ceph/ceph/pull/22728>`_, Jianpeng Ma)
-* test/fio: new option to control file preallocation (`pr#23410 <https://github.com/ceph/ceph/pull/23410>`_, Igor Fedotov)
-* tests: Add hashinfo testing for dump command of ceph-objectstore-tool (`issue#38053 <http://tracker.ceph.com/issues/38053>`_, `pr#26158 <https://github.com/ceph/ceph/pull/26158>`_, David Zafman)
-* tests: add ubuntu 18.04 dockerfile (`pr#25251 <https://github.com/ceph/ceph/pull/25251>`_, Kefu Chai)
-* tests: auth, test: fix building on ARMs after the NSS -> OpenSSL transition (`pr#22129 <https://github.com/ceph/ceph/pull/22129>`_, Radoslaw Zarzynski)
-* tests: ceph_kvstorebench: include <errno.h> not asm-generic/errno.h (`pr#25256 <https://github.com/ceph/ceph/pull/25256>`_, Kefu Chai)
-* tests: ceph-volume: functional tests, add libvirt customization (`pr#25895 <https://github.com/ceph/ceph/pull/25895>`_, Jan Fajerski)
-* tests: do not check for invalid k/m combinations (`issue#16500 <http://tracker.ceph.com/issues/16500>`_, `pr#25046 <https://github.com/ceph/ceph/pull/25046>`_, Kefu Chai)
-* tests: Fixes for standalone tests (`pr#22480 <https://github.com/ceph/ceph/pull/22480>`_, David Zafman)
-* tests: fix to check server_conn in MessengerTest.NameAddrTest (`pr#23931 <https://github.com/ceph/ceph/pull/23931>`_, Yingxin)
-* tests: make ceph-admin-commands.sh log what it does (`issue#37089 <http://tracker.ceph.com/issues/37089>`_, `pr#25080 <https://github.com/ceph/ceph/pull/25080>`_, Nathan Cutler)
-* tests: make test_ceph_argparse.py pass on py3-only systems (`issue#24816 <http://tracker.ceph.com/issues/24816>`_, `pr#22922 <https://github.com/ceph/ceph/pull/22922>`_, Nathan Cutler)
-* tests: mgr/ansible: add install tox==2.9.1 (`pr#26313 <https://github.com/ceph/ceph/pull/26313>`_, Kefu Chai)
-* tests: mgr/dashboard: Added additional breadcrumb and tab tests to Cluster menu (`pr#26151 <https://github.com/ceph/ceph/pull/26151>`_, Nathan Weinberg)
-* tests: mgr/dashboard: Added additional breadcrumb tests to Cluster (`pr#25010 <https://github.com/ceph/ceph/pull/25010>`_, Nathan Weinberg)
-* tests: mgr/dashboard: Added breadcrumb and tab tests to Pools menu (`pr#25572 <https://github.com/ceph/ceph/pull/25572>`_, Nathan Weinberg)
-* tests: mgr/dashboard: Added breadcrumb tests to Block menu items (`pr#25143 <https://github.com/ceph/ceph/pull/25143>`_, Nathan Weinberg)
-* tests: mgr/dashboard: Added breadcrumb tests to Filesystems menu (`pr#26592 <https://github.com/ceph/ceph/pull/26592>`_, Nathan Weinberg)
-* tests: mgr/dashboard: Added NFS Ganesha suite to QA tests (`pr#26510 <https://github.com/ceph/ceph/pull/26510>`_, Laura Paduano)
-* tests: mgr/dashboard: Added tab tests to Block menu items (`pr#26243 <https://github.com/ceph/ceph/pull/26243>`_, Nathan Weinberg)
-* tests: mgr/dashboard: Add Jest Runner (`pr#22031 <https://github.com/ceph/ceph/pull/22031>`_, Tiago Melo)
-* tests: mgr/dashboard: Add unit test case for controller/erasure_code_profile.py (`pr#24789 <https://github.com/ceph/ceph/pull/24789>`_, Ranjitha G)
-* tests: mgr/dashboard: Add unit test for frontend api services (`pr#22284 <https://github.com/ceph/ceph/pull/22284>`_, Tiago Melo)
-* tests: mgr/dashboard: Add unit tests for all frontend pipes (`pr#22182 <https://github.com/ceph/ceph/pull/22182>`_, Tiago Melo)
-* tests: mgr/dashboard: Add unit test to the frontend services (`pr#22244 <https://github.com/ceph/ceph/pull/22244>`_, Tiago Melo)
-* tests: mgr/dashboard: Fix a broken ECP controller test (`pr#25363 <https://github.com/ceph/ceph/pull/25363>`_, Zack Cerza)
-* tests: mgr/dashboard: Fix PYTHONPATH for test runner (`pr#25359 <https://github.com/ceph/ceph/pull/25359>`_, Zack Cerza)
-* tests: mgr/dashboard: Improve max-line-length tslint rule (`pr#22279 <https://github.com/ceph/ceph/pull/22279>`_, Tiago Melo)
-* tests: mgr/dashboard: RbdMirroringService test suite fails in dev mode (`issue#37841 <http://tracker.ceph.com/issues/37841>`_, `pr#25865 <https://github.com/ceph/ceph/pull/25865>`_, Stephan Müller)
-* tests: mgr/dashboard: Small improvements for running teuthology tests (`pr#25121 <https://github.com/ceph/ceph/pull/25121>`_, Zack Cerza)
-* tests: mgr/dashboard: updated API test (`pr#25653 <https://github.com/ceph/ceph/pull/25653>`_, Alfonso Martínez)
-* tests: mgr/dashboard: updated API test to reflect changes in ModuleInfo (`pr#25761 <https://github.com/ceph/ceph/pull/25761>`_, Kefu Chai)
-* tests: mgr/test_orchestrator: correct ceph-volume path (`issue#37773 <http://tracker.ceph.com/issues/37773>`_, `pr#25839 <https://github.com/ceph/ceph/pull/25839>`_, Kefu Chai)
-* tests: object errors found in be_select_auth_object() aren't logged the same (`issue#25108 <http://tracker.ceph.com/issues/25108>`_, `pr#23376 <https://github.com/ceph/ceph/pull/23376>`_, David Zafman)
-* tests: osd/OSDMap: set pg_autoscale_mode with setting from conf (`pr#25746 <https://github.com/ceph/ceph/pull/25746>`_, Kefu Chai)
-* tests: os/tests: fix garbageCollection test case from store_test suite (`pr#23752 <https://github.com/ceph/ceph/pull/23752>`_, Igor Fedotov)
-* tests: os/tests: silence -Wsign-compare warning (`pr#25072 <https://github.com/ceph/ceph/pull/25072>`_, Kefu Chai)
-* tests: qa: add librados3 to exclude_packages for ugprade tests (`pr#25037 <https://github.com/ceph/ceph/pull/25037>`_, Kefu Chai)
-* tests: qa: add test that builds example librados programs (`issue#35989 <http://tracker.ceph.com/issues/35989>`_, `issue#15100 <http://tracker.ceph.com/issues/15100>`_, `pr#23131 <https://github.com/ceph/ceph/pull/23131>`_, Nathan Cutler)
-* tests: qa/ceph-ansible: Set ceph_stable_release to mimic (`issue#38231 <http://tracker.ceph.com/issues/38231>`_, `pr#26328 <https://github.com/ceph/ceph/pull/26328>`_, Brad Hubbard)
-* tests: qa/distros: add openSUSE Leap 42.3 and 15.0 (`pr#24380 <https://github.com/ceph/ceph/pull/24380>`_, Nathan Cutler)
-* tests: qa: Don't use sudo when moving logs (`pr#22763 <https://github.com/ceph/ceph/pull/22763>`_, David Zafman)
-* tests: qa: downgrade librados2,librbd1 for thrash-old-clients tests (`issue#37618 <http://tracker.ceph.com/issues/37618>`_, `pr#25463 <https://github.com/ceph/ceph/pull/25463>`_, Kefu Chai)
-* tests: qa: fix manager module paths (`pr#23637 <https://github.com/ceph/ceph/pull/23637>`_, Noah Watkins, David Zafman)
-* tests/qa - fix mimic subset for nightlies (`pr#21931 <https://github.com/ceph/ceph/pull/21931>`_, Yuri Weinstein)
-* tests: qa: fix test on "ceph fs set cephfs allow_new_snaps" (`pr#21829 <https://github.com/ceph/ceph/pull/21829>`_, Kefu Chai)
-* tests: qa: fix upgrade tests and test_envlibrados_for_rocksdb.sh (`pr#25106 <https://github.com/ceph/ceph/pull/25106>`_, Kefu Chai)
-* tests: qa: For teuthology copy logs to teuthology expected location (`pr#22702 <https://github.com/ceph/ceph/pull/22702>`_, David Zafman)
-* tests: qa/mgr/dashboard: Fix type annotation error (`pr#25235 <https://github.com/ceph/ceph/pull/25235>`_, Sebastian Wagner)
-* tests: qa/mon: fix cluster support for monmap bootstrap (`issue#38115 <http://tracker.ceph.com/issues/38115>`_, `pr#26205 <https://github.com/ceph/ceph/pull/26205>`_, Casey Bodley)
-* tests: qa/standalone: Minor test improvements (`issue#35912 <http://tracker.ceph.com/issues/35912>`_, `pr#24018 <https://github.com/ceph/ceph/pull/24018>`_, David Zafman)
-* tests: qa/standalone/scrub: When possible show side-by-side diff in addition to regular diff (`pr#22727 <https://github.com/ceph/ceph/pull/22727>`_, David Zafman)
-* tests:  qa/standalone: Standalone test corrections (`issue#35982 <http://tracker.ceph.com/issues/35982>`_, `pr#24088 <https://github.com/ceph/ceph/pull/24088>`_, David Zafman)
-* tests: qa/suites/rados/upgrade: remove stray link (`pr#22460 <https://github.com/ceph/ceph/pull/22460>`_, Sage Weil)
-* tests: qa/suites/rados/upgrade: set require-osd-release to nautilus (`issue#37432 <http://tracker.ceph.com/issues/37432>`_, `pr#25314 <https://github.com/ceph/ceph/pull/25314>`_, Kefu Chai)
-* tests: qa/suites/rados/verify: remove random-distro$ (`pr#22057 <https://github.com/ceph/ceph/pull/22057>`_, Kefu Chai)
-* tests: qa/suites/upgrade/mimic-x: fix rhel runs (`pr#25781 <https://github.com/ceph/ceph/pull/25781>`_, Neha Ojha)
-* tests: qa/tasks/mgr: fix test_pool.py (`issue#24077 <http://tracker.ceph.com/issues/24077>`_, `pr#21943 <https://github.com/ceph/ceph/pull/21943>`_, Kefu Chai)
-* tests: qa/tasks/thrashosds-health.yaml: whitelist slow requests (`issue#25104 <http://tracker.ceph.com/issues/25104>`_, `pr#23237 <https://github.com/ceph/ceph/pull/23237>`_, Neha Ojha)
-* tests: qa/tasks: update mirror link for maven (`pr#23944 <https://github.com/ceph/ceph/pull/23944>`_, Vasu Kulkarni)
-* tests: qa/tests: added filters to support distro tests for client-upgrade tests (`pr#22096 <https://github.com/ceph/ceph/pull/22096>`_, Yuri Weinstein)
-* tests: qa/tests - added mimic-p2p suite (`pr#22726 <https://github.com/ceph/ceph/pull/22726>`_, Yuri Weinstein)
-* tests: qa/tests: Added mimic runs, removed large suites (rados, rbd, etc) ru… (`pr#21827 <https://github.com/ceph/ceph/pull/21827>`_, Yuri Weinstein)
-* tests: qa/tests: added "-n 7" to make sure mimic-x runs on built master branch (`pr#25038 <https://github.com/ceph/ceph/pull/25038>`_, Yuri Weinstein)
-* tests: qa/tests: added rhel 7.6 (`pr#25919 <https://github.com/ceph/ceph/pull/25919>`_, Yuri Weinstein)
-* tests: qa/tests: fix volume size when running in ovh (`pr#21961 <https://github.com/ceph/ceph/pull/21961>`_, Vasu Kulkarni)
-* tests: qa/tests: Move ceph-ansible tests to ansible version 2.7 (`issue#37973 <http://tracker.ceph.com/issues/37973>`_, `pr#26068 <https://github.com/ceph/ceph/pull/26068>`_, Brad Hubbard)
-* tests: qa/tests: remove ceph-disk tests from ceph-deploy and default all tests to use ceph-volume (`pr#22921 <https://github.com/ceph/ceph/pull/22921>`_, Vasu Kulkarni)
-* tests: qa/upgrade: cleanup for nautilus (`pr#23305 <https://github.com/ceph/ceph/pull/23305>`_, Nathan Cutler)
-* tests: qa: use $TESTDIR for testing mkfs (`pr#22246 <https://github.com/ceph/ceph/pull/22246>`_, Kefu Chai)
-* tests: qa: wait longer for osd to flush pg stats (`issue#24321 <http://tracker.ceph.com/issues/24321>`_, `pr#22275 <https://github.com/ceph/ceph/pull/22275>`_, Kefu Chai)
-* tests: qa/workunits/ceph-disk: --no-mon-config (`pr#21942 <https://github.com/ceph/ceph/pull/21942>`_, Kefu Chai)
-* tests: qa/workunits/mon/test_mon_config_key.py: bump up the size limit (`issue#36260 <http://tracker.ceph.com/issues/36260>`_, `pr#24340 <https://github.com/ceph/ceph/pull/24340>`_, Kefu Chai)
-* tests: qa/workunits/rados/test_envlibrados_for_rocksdb: install g++ not g++-4.7 (`pr#22103 <https://github.com/ceph/ceph/pull/22103>`_, Kefu Chai)
-* tests: qa/workunits/rados/test_librados_build.sh: grab files from explicit git branch (`pr#25268 <https://github.com/ceph/ceph/pull/25268>`_, Nathan Cutler)
-* tests: run-make-check: increase fs.aio-max-nr to 1048576 (`pr#23689 <https://github.com/ceph/ceph/pull/23689>`_, Kefu Chai)
-* tests: test,common: silence GCC warnings (`pr#23692 <https://github.com/ceph/ceph/pull/23692>`_, Kefu Chai)
-* tests: test/crimson: add dummy_auth to test_async_echo (`pr#26783 <https://github.com/ceph/ceph/pull/26783>`_, Yingxin Cheng)
-* tests: test/crimson: fix build failure of test_alien_echo (`pr#26308 <https://github.com/ceph/ceph/pull/26308>`_, chunmei Liu)
-* tests: test/crimson: fix FTBFS of unittest_seastar_perfcounters on arm64 (`pr#25647 <https://github.com/ceph/ceph/pull/25647>`_, Kefu Chai)
-* tests: test/crimson: split async-msgr out of alien_echo (`pr#26620 <https://github.com/ceph/ceph/pull/26620>`_, Yingxin Cheng)
-* tests: test/dashboard: fix segfault when importing dm.xmlsec.binding (`issue#37081 <http://tracker.ceph.com/issues/37081>`_, `pr#25139 <https://github.com/ceph/ceph/pull/25139>`_, Kefu Chai)
-* tests: test: Disable duplicate request command test during scrub testing (`pr#25675 <https://github.com/ceph/ceph/pull/25675>`_, David Zafman)
-* tests: test/docker-test-helper.sh: move "cp .git/HEAD" out of loop (`pr#22978 <https://github.com/ceph/ceph/pull/22978>`_, Kefu Chai)
-* tests: test/encoding: Fix typo in encoding/types.h file (`pr#22332 <https://github.com/ceph/ceph/pull/22332>`_, TommyLike)
-* tests: test/fio:  pass config params to object store in a different manner (`pr#23267 <https://github.com/ceph/ceph/pull/23267>`_, Igor Fedotov)
-* tests: test: fix compile error in test/crimson/test_config.cc (`pr#23724 <https://github.com/ceph/ceph/pull/23724>`_, Yingxin)
-* tests: test: fix libc++ crash in Log.GarbleRecovery (`pr#25135 <https://github.com/ceph/ceph/pull/25135>`_, Casey Bodley)
-* tests: test/librados: fix LibRadosList.ListObjectsNS (`pr#22771 <https://github.com/ceph/ceph/pull/22771>`_, Kefu Chai)
-* tests: test: Limit loops waiting for force-backfill/force-recovery to happen (`issue#38309 <http://tracker.ceph.com/issues/38309>`_, `pr#26416 <https://github.com/ceph/ceph/pull/26416>`_, David Zafman)
-* tests: test: Need to escape parens in log-whitelist for grep (`pr#22074 <https://github.com/ceph/ceph/pull/22074>`_, David Zafman)
-* tests: test: osd-backfill-stats.sh Fix check of multi backfill OSDs, skip re… (`pr#26330 <https://github.com/ceph/ceph/pull/26330>`_, David Zafman)
-* tests: test/pybind/test_rados.py: collect output in stdout for "bench" cmd (`pr#21957 <https://github.com/ceph/ceph/pull/21957>`_, Kefu Chai)
-* tests: test: run-standalone.sh: point LD_LIBRARY_PATH to $(pwd)/lib (`issue#38262 <http://tracker.ceph.com/issues/38262>`_, `pr#26371 <https://github.com/ceph/ceph/pull/26371>`_, David Zafman)
-* tests: tests/qa: trying $ distro mix (`pr#21895 <https://github.com/ceph/ceph/pull/21895>`_, Yuri Weinstein)
-* tests: test: Start using GNU awk and fix archiving directory (`pr#23955 <https://github.com/ceph/ceph/pull/23955>`_, Willem Jan Withagen)
-* tests: test/strtol: add test case for parsing hex numbers (`pr#21582 <https://github.com/ceph/ceph/pull/21582>`_, Jan Fajerski)
-* tests: test: suppress core dumping in there tests as well (`pr#25311 <https://github.com/ceph/ceph/pull/25311>`_, Willem Jan Withagen)
-* tests: test: switch to GNU sed on FreeBSD (`pr#26318 <https://github.com/ceph/ceph/pull/26318>`_, Willem Jan Withagen)
-* tests: test: test_get_timeout_delays() fix (`pr#22837 <https://github.com/ceph/ceph/pull/22837>`_, David Zafman)
-* tests: test: Use a file that should be on all OSes (`pr#22428 <https://github.com/ceph/ceph/pull/22428>`_, David Zafman)
-* tests: test: Use a grep pattern that works across releases (`issue#35845 <http://tracker.ceph.com/issues/35845>`_, `pr#24013 <https://github.com/ceph/ceph/pull/24013>`_, David Zafman)
-* tests: test: Use pids instead of jobspecs which were wrong (`issue#27056 <http://tracker.ceph.com/issues/27056>`_, `pr#23695 <https://github.com/ceph/ceph/pull/23695>`_, David Zafman)
-* tests: test: wait_for_pg_stats() should do another check after last 13 secon… (`pr#22198 <https://github.com/ceph/ceph/pull/22198>`_, David Zafman)
-* tests: test: Whitelist corrections (`pr#22164 <https://github.com/ceph/ceph/pull/22164>`_, David Zafman)
-* tests: test: write log file to current directory (`issue#36737 <http://tracker.ceph.com/issues/36737>`_, `pr#25704 <https://github.com/ceph/ceph/pull/25704>`_, Kefu Chai)
-* tests,tools: ceph-objectstore-tool: Dump hashinfo (`issue#37597 <http://tracker.ceph.com/issues/37597>`_, `pr#25483 <https://github.com/ceph/ceph/pull/25483>`_, David Zafman)
-* tests: update Dockerfile to support fc-29 (`pr#26311 <https://github.com/ceph/ceph/pull/26311>`_, Kefu Chai)
-* tests: upgrade/luminous-x: fix order of final-workload directory (`pr#23162 <https://github.com/ceph/ceph/pull/23162>`_, Nathan Cutler)
-* tests: upgrade/luminous-x: whitelist REQUEST_SLOW for rados_mon_thrash (`issue#25051 <http://tracker.ceph.com/issues/25051>`_, `pr#23160 <https://github.com/ceph/ceph/pull/23160>`_, Nathan Cutler)
-* tests: Wip 38027 38195: osd/osd-backfill-space.sh fails (`issue#38027 <http://tracker.ceph.com/issues/38027>`_, `issue#38195 <http://tracker.ceph.com/issues/38195>`_, `pr#26290 <https://github.com/ceph/ceph/pull/26290>`_, David Zafman)
-* tools: Add clear-data-digest command to objectstore tool (`pr#25403 <https://github.com/ceph/ceph/pull/25403>`_, Li Yichao)
-* tools: add offset-align option to "rados" load-gen (`pr#20683 <https://github.com/ceph/ceph/pull/20683>`_, Zengran Zhang)
-* tools: backport-create-issue: rate-limit to avoid seeming like a spammer (`pr#24243 <https://github.com/ceph/ceph/pull/24243>`_, Nathan Cutler)
-* tools: ceph-menv: mrun shell environment (`pr#22132 <https://github.com/ceph/ceph/pull/22132>`_, Yehuda Sadeh)
-* tools: ceph-objectstore-tool: Allow target level as first positional argument (`issue#35846 <http://tracker.ceph.com/issues/35846>`_, `pr#23989 <https://github.com/ceph/ceph/pull/23989>`_, David Zafman)
-* tools: correct the description of Allowed options in osdomap tool (`pr#23488 <https://github.com/ceph/ceph/pull/23488>`_, xiaomanh)
-* tools, mgr: silence clang warnings (`pr#23430 <https://github.com/ceph/ceph/pull/23430>`_, Kefu Chai)
-* tools: mstop.sh allow kill -9 after failing to kill procs (`pr#26680 <https://github.com/ceph/ceph/pull/26680>`_, Yuval Lifshitz)
-* tools/rados: fix memory leak in error path (`pr#25410 <https://github.com/ceph/ceph/pull/25410>`_, Li Wang)
-* tools: script/kubejacker: include cls libs (`pr#23569 <https://github.com/ceph/ceph/pull/23569>`_, John Spray)
-* tools: script: new ceph-backport.sh script (`pr#22875 <https://github.com/ceph/ceph/pull/22875>`_, Nathan Cutler)
-* tools:  tools: ceph-authtool: report correct number of caps when creating keyring (`pr#23304 <https://github.com/ceph/ceph/pull/23304>`_, Nathan Cutler)
-* tools: tools/ceph_kvstore_tool: do not open rocksdb when repairing it (`pr#25108 <https://github.com/ceph/ceph/pull/25108>`_, Kefu Chai)
-* tools: tools/ceph_kvstore_tool: extract StoreTool into kvstore_tool.cc (`pr#26041 <https://github.com/ceph/ceph/pull/26041>`_, Kefu Chai)
-* tools: tools/ceph_kvstore_tool: Move summary output to print_summary (`pr#26666 <https://github.com/ceph/ceph/pull/26666>`_, Brad Hubbard)
-* tools: tools/rados: allow list objects in a specific pg in a pool (`pr#19041 <https://github.com/ceph/ceph/pull/19041>`_, Li Wang)
-* tools: tools/rados: always call rados.shutdown() before exit() (`issue#36732 <http://tracker.ceph.com/issues/36732>`_, `pr#24990 <https://github.com/ceph/ceph/pull/24990>`_, Li Wang)
-* tools: tools/rados: correct the read offset of bench (`pr#23667 <https://github.com/ceph/ceph/pull/23667>`_, Xiaofei Cui)
-* tools: tools/rados: fix the unit of target-throughput (`pr#23683 <https://github.com/ceph/ceph/pull/23683>`_, Xiaofei Cui)
-* vstart: disable dashboard when rbd not built (`pr#23336 <https://github.com/ceph/ceph/pull/23336>`_, Noah Watkins)
-* vstart.sh: fix params generation for monmaptool (`issue#38174 <http://tracker.ceph.com/issues/38174>`_, `pr#26273 <https://github.com/ceph/ceph/pull/26273>`_, Yehuda Sadeh)
diff --git a/ceph/doc/releases/octopus.rst b/ceph/doc/releases/octopus.rst
deleted file mode 100644 (file)
index 14b6bd3..0000000
+++ /dev/null
@@ -1,5864 +0,0 @@
-=======
-Octopus
-=======
-
-Octopus is the 15th stable release of Ceph.  It is named after an
-order of 8-limbed cephalopods.
-
-v15.2.15 Octopus
-================
-
-This is the 15th backport release in the Octopus series. We recommend all
-users update to this release.
-
-Notable Changes
----------------
-
-* The default value of `osd_client_message_cap` has been set to 256, to provide
-  better flow control by limiting maximum number of in-flight client requests.
-
-* A new ceph-erasure-code-tool has been added to help manually recover an
-  object from a damaged PG.
-
-Changelog
----------
-
-* auth,mon: don't log "unable to find a keyring" error when key is given (`pr#43312 <https://github.com/ceph/ceph/pull/43312>`_, Ilya Dryomov)
-* ceph-monstore-tool: use a large enough paxos/{first,last}_committed (`issue#38219 <http://tracker.ceph.com/issues/38219>`_, `pr#43263 <https://github.com/ceph/ceph/pull/43263>`_, Kefu Chai)
-* ceph-volume/tests: retry when destroying osd (`pr#42547 <https://github.com/ceph/ceph/pull/42547>`_, Guillaume Abrioux)
-* ceph-volume: disable cache for blkid calls (`pr#41115 <https://github.com/ceph/ceph/pull/41115>`_, Rafał Wądołowski)
-* ceph-volume: fix batch report and respect ceph.conf config values (`pr#41715 <https://github.com/ceph/ceph/pull/41715>`_, Andrew Schoen)
-* ceph-volume: fix lvm activate --all --no-systemd (`pr#43268 <https://github.com/ceph/ceph/pull/43268>`_, Dimitri Savineau)
-* ceph-volume: fix lvm activate arguments (`pr#43117 <https://github.com/ceph/ceph/pull/43117>`_, Dimitri Savineau)
-* ceph-volume: fix lvm migrate without args (`pr#43111 <https://github.com/ceph/ceph/pull/43111>`_, Dimitri Savineau)
-* ceph-volume: fix raw list with logical partition (`pr#43088 <https://github.com/ceph/ceph/pull/43088>`_, Guillaume Abrioux, Dimitri Savineau)
-* ceph-volume: lvm batch: fast_allocations(): avoid ZeroDivisionError (`pr#42494 <https://github.com/ceph/ceph/pull/42494>`_, Jonas Zeiger)
-* ceph-volume: pvs --noheadings replace pvs --no-heading (`pr#43077 <https://github.com/ceph/ceph/pull/43077>`_, FengJiankui)
-* ceph-volume: remove --all ref from deactivate help (`pr#43097 <https://github.com/ceph/ceph/pull/43097>`_, Dimitri Savineau)
-* ceph-volume: support no_systemd with lvm migrate (`pr#43092 <https://github.com/ceph/ceph/pull/43092>`_, Dimitri Savineau)
-* ceph-volume: work around phantom atari partitions (`pr#42752 <https://github.com/ceph/ceph/pull/42752>`_, Blaine Gardner)
-* ceph.spec: selinux scripts respect CEPH_AUTO_RESTART_ON_UPGRADE (`pr#43234 <https://github.com/ceph/ceph/pull/43234>`_, Dan van der Ster)
-* cephadm: add thread ident to log messages (`pr#43133 <https://github.com/ceph/ceph/pull/43133>`_, Michael Fritch)
-* cephadm: default to quay.io, not docker.io (`pr#42533 <https://github.com/ceph/ceph/pull/42533>`_, Sage Weil)
-* cephadm: use quay, not docker (`pr#43094 <https://github.com/ceph/ceph/pull/43094>`_, Sage Weil, Juan Miguel Olmo Martínez)
-* cmake: Replace boost download url (`pr#42694 <https://github.com/ceph/ceph/pull/42694>`_, Rafał Wądołowski)
-* cmake: s/Python_EXECUTABLE/Python3_EXECUTABLE/ (`pr#43265 <https://github.com/ceph/ceph/pull/43265>`_, Michael Fritch)
-* common/buffer: fix SIGABRT in  rebuild_aligned_size_and_memory (`pr#42975 <https://github.com/ceph/ceph/pull/42975>`_, Yin Congmin)
-* common/options: Set osd_client_message_cap to 256 (`pr#42616 <https://github.com/ceph/ceph/pull/42616>`_, Mark Nelson)
-* doc/ceph-volume: add lvm migrate/new-db/new-wal (`pr#43090 <https://github.com/ceph/ceph/pull/43090>`_, Dimitri Savineau)
-* Don't persist report data (`pr#42670 <https://github.com/ceph/ceph/pull/42670>`_, Brad Hubbard)
-* krbd: escape udev_enumerate_add_match_sysattr values (`pr#42968 <https://github.com/ceph/ceph/pull/42968>`_, Ilya Dryomov)
-* mgr/cephadm: pass --container-init to cephadm if specified (`pr#42666 <https://github.com/ceph/ceph/pull/42666>`_, Tim Serong)
-* mgr/dashboard: cephadm e2e start script: add --expanded option (`pr#42794 <https://github.com/ceph/ceph/pull/42794>`_, Alfonso Martínez)
-* mgr/dashboard: deprecated variable usage in Grafana dashboards (`pr#43189 <https://github.com/ceph/ceph/pull/43189>`_, Patrick Seidensal)
-* mgr/dashboard: Incorrect MTU mismatch warning (`pr#43186 <https://github.com/ceph/ceph/pull/43186>`_, Aashish Sharma)
-* mgr/dashboard: stats=false not working when listing buckets (`pr#42892 <https://github.com/ceph/ceph/pull/42892>`_, Avan Thakkar)
-* mgr/influx: use "N/A" for unknown hostname (`pr#43369 <https://github.com/ceph/ceph/pull/43369>`_, Kefu Chai)
-* mgr/prometheus: Fix metric types from gauge to counter (`pr#42674 <https://github.com/ceph/ceph/pull/42674>`_, Patrick Seidensal)
-* mon/OSDMonitor: account for PG merging in epoch_by_pg accounting (`pr#42837 <https://github.com/ceph/ceph/pull/42837>`_, Dan van der Ster)
-* mon/PGMap: remove DIRTY field in `ceph df detail` when cache tiering  is not in use (`pr#42862 <https://github.com/ceph/ceph/pull/42862>`_, Deepika Upadhyay)
-* mon: return -EINVAL when handling unknown option in 'ceph osd pool get' (`pr#43266 <https://github.com/ceph/ceph/pull/43266>`_, Zhao Cuicui)
-* monitoring/grafana/cluster: use per-unit max and limit values (`pr#42675 <https://github.com/ceph/ceph/pull/42675>`_, David Caro)
-* monitoring: fix Physical Device Latency unit (`pr#42676 <https://github.com/ceph/ceph/pull/42676>`_, Seena Fallah)
-* os/bluestore: accept undecodable multi-block bluefs transactions on log (`pr#43024 <https://github.com/ceph/ceph/pull/43024>`_, Igor Fedotov)
-* os/bluestore: fix bluefs migrate command (`pr#43140 <https://github.com/ceph/ceph/pull/43140>`_, Igor Fedotov)
-* os/bluestore: fix using incomplete bluefs log when dumping it (`pr#43008 <https://github.com/ceph/ceph/pull/43008>`_, Igor Fedotov)
-* osd/OSD: mkfs need wait for transcation completely finish (`pr#43418 <https://github.com/ceph/ceph/pull/43418>`_, Chen Fan)
-* pybind/rbd: fix mirror_image_get_status (`pr#42971 <https://github.com/ceph/ceph/pull/42971>`_, Ilya Dryomov, Will Smith)
-* qa/mgr/dashboard: add extra wait to test (`pr#43352 <https://github.com/ceph/ceph/pull/43352>`_, Ernesto Puerta)
-* qa/suites/rados: use centos_8.3_container_tools_3.0.yaml (`pr#43102 <https://github.com/ceph/ceph/pull/43102>`_, Sebastian Wagner)
-* qa/tests: advanced version to 15.2.14 to match the latest release (`pr#42761 <https://github.com/ceph/ceph/pull/42761>`_, Yuri Weinstein)
-* qa/workunits/mon/test_mon_config_key: use subprocess.run() instead of proc.communicate() (`pr#42498 <https://github.com/ceph/ceph/pull/42498>`_, Kefu Chai)
-* rbd-mirror: add perf counters to snapshot replayed (`pr#42986 <https://github.com/ceph/ceph/pull/42986>`_, Arthur Outhenin-Chalandre)
-* rbd-mirror: fix potential async op tracker leak in start_image_replayers (`pr#42978 <https://github.com/ceph/ceph/pull/42978>`_, Mykola Golub)
-* rbd-mirror: unbreak one-way snapshot-based mirroring (`pr#43314 <https://github.com/ceph/ceph/pull/43314>`_, Ilya Dryomov)
-* rgw : add check for tenant provided in RGWCreateRole (`pr#43270 <https://github.com/ceph/ceph/pull/43270>`_, caolei)
-* rgw: avoid infinite loop when deleting a bucket (`issue#49206 <http://tracker.ceph.com/issues/49206>`_, `pr#43272 <https://github.com/ceph/ceph/pull/43272>`_, Jeegn Chen)
-* rgw: fail as expected when set/delete-bucket-website attempted on a non-exis… (`pr#43424 <https://github.com/ceph/ceph/pull/43424>`_, xiangrui meng)
-* rgw: fix sts memory leak (`pr#43349 <https://github.com/ceph/ceph/pull/43349>`_, yuliyang_yewu)
-* rgw: remove quota soft threshold (`pr#43271 <https://github.com/ceph/ceph/pull/43271>`_, Zulai Wang)
-* rgw: when deleted obj removed in versioned bucket, extra del-marker added (`pr#43273 <https://github.com/ceph/ceph/pull/43273>`_, J. Eric Ivancich)
-* run-make-check.sh: Increase failure output log size (`pr#42849 <https://github.com/ceph/ceph/pull/42849>`_, David Galloway)
-* tools/erasure-code: new tool to encode/decode files (`pr#43407 <https://github.com/ceph/ceph/pull/43407>`_, Mykola Golub)
-
-v15.2.14 Octopus
-================
-
-This is the 14th backport release in the Octopus series. We recommend all
-users update to this release.
-
-Notable Changes
----------------
-
-* RGW: It is possible to specify ssl options and ciphers for beast frontend now.
-  The default ssl options setting is "no_sslv2:no_sslv3:no_tlsv1:no_tlsv1_1".
-  If you want to return back the old behavior add 'ssl_options=' (empty) to
-  ``rgw frontends`` configuration.
-
-* CephFS: old clusters (pre-Jewel) that did not use CephFS have legacy data
-  structures in the ceph-mon stores. These structures are not understood by
-  Pacific monitors. With Octopus v15.2.14, the monitors have been taught to flush
-  and trim these old structures out in preparation for an upgrade to Pacific or
-  Quincy. For more information, see
-  `Issue 51673 <https://tracker.ceph.com/issues/51673>`.
-
-* `ceph-mgr-modules-core` debian package does not recommend `ceph-mgr-rook`
-  anymore. As the latter depends on `python3-numpy` which cannot be imported in
-  different Python sub-interpreters multi-times if the version of
-  `python3-numpy` is older than 1.19. Since `apt-get` installs the `Recommends`
-  packages by default, `ceph-mgr-rook` was always installed along with
-  `ceph-mgr` debian package as an indirect dependency. If your workflow depends
-  on this behavior, you might want to install `ceph-mgr-rook` separately.
-
-* Several bug fixes in BlueStore, including a fix for an unexpected
-  ENOSPC bug in Avl/Hybrid allocators.
-
-* Includes a fix for a bug that affects recovery below *min_size* for EC pools.
-
-Changelog
----------
-
-* bind on loopback address if no other addresses are available (`pr#42478 <https://github.com/ceph/ceph/pull/42478>`_, Kefu Chai, Matthew Oliver)
-* bluestore: use string_view and strip trailing slash for dir listing (`pr#41757 <https://github.com/ceph/ceph/pull/41757>`_, Jonas Jelten, Kefu Chai)
-* ceph-volume/tests: update ansible environment variables in tox (`pr#42491 <https://github.com/ceph/ceph/pull/42491>`_, Dimitri Savineau)
-* ceph-volume: Consider /dev/root as mounted (`pr#41584 <https://github.com/ceph/ceph/pull/41584>`_, David Caro)
-* ceph-volume: implement bluefs volume migration (`pr#42377 <https://github.com/ceph/ceph/pull/42377>`_, Igor Fedotov, Kefu Chai)
-* ceph: ignore BrokenPipeError when printing help (`pr#41586 <https://github.com/ceph/ceph/pull/41586>`_, Ernesto Puerta)
-* cephadm: fix escaping/quoting of stderr-prefix arg for ceph daemons (`pr#40948 <https://github.com/ceph/ceph/pull/40948>`_, Michael Fritch, Sage Weil)
-* cephadm: fix port_in_use when IPv6 is disabled (`pr#41602 <https://github.com/ceph/ceph/pull/41602>`_, Patrick Seidensal)
-* cephfs: client: add ability to lookup snapped inodes by inode number (`pr#40768 <https://github.com/ceph/ceph/pull/40768>`_, Jeff Layton, Xiubo Li)
-* cls/rgw: look for plain entries in non-ascii plain namespace too (`pr#41775 <https://github.com/ceph/ceph/pull/41775>`_, Mykola Golub)
-* cmake: build static libs if they are internal ones (`pr#39904 <https://github.com/ceph/ceph/pull/39904>`_, Kefu Chai)
-* crush/crush: ensure alignof(crush_work_bucket) is 1 (`pr#41622 <https://github.com/ceph/ceph/pull/41622>`_, Kefu Chai)
-* debian/control: ceph-mgr-modules-core does not Recommend ceph-mgr-rook (`pr#41878 <https://github.com/ceph/ceph/pull/41878>`_, Kefu Chai)
-* doc/rados/operations: s/max_misplaced/target_max_misplaced_ratio/ (`pr#41624 <https://github.com/ceph/ceph/pull/41624>`_, Kefu Chai)
-* librbd: don't stop at the first unremovable image when purging (`pr#41663 <https://github.com/ceph/ceph/pull/41663>`_, Ilya Dryomov)
-* librbd: global config overrides do not apply to in-use images (`pr#41763 <https://github.com/ceph/ceph/pull/41763>`_, Jason Dillaman)
-* make-dist: refuse to run if script path contains a colon (`pr#41087 <https://github.com/ceph/ceph/pull/41087>`_, Nathan Cutler)
-* mds: avoid journaling overhead for setxattr("ceph.dir.subvolume") for no-op case (`pr#41996 <https://github.com/ceph/ceph/pull/41996>`_, Patrick Donnelly)
-* mds: completed_requests -> num_completed_requests and dump num_completed_flushes (`pr#41625 <https://github.com/ceph/ceph/pull/41625>`_, Dan van der Ster)
-* mds: fix cpu_profiler asok crash (`pr#41767 <https://github.com/ceph/ceph/pull/41767>`_, liu shi)
-* mds: place the journaler pointer under the mds_lock (`pr#41626 <https://github.com/ceph/ceph/pull/41626>`_, Xiubo Li)
-* MDSMonitor: monitor crash after upgrade from ceph 15.2.13 to 16.2.4 (`pr#42537 <https://github.com/ceph/ceph/pull/42537>`_, Patrick Donnelly)
-* mds: reject lookup ino requests for mds dirs (`pr#40782 <https://github.com/ceph/ceph/pull/40782>`_, Xiubo Li, Patrick Donnelly)
-* mgr/DaemonServer.cc: prevent mgr crashes caused by integer underflow that is triggered by large increases to pg_num/pgp_num (`pr#41764 <https://github.com/ceph/ceph/pull/41764>`_, Cory Snyder)
-* mgr/DaemonServer: skip redundant update of pgp_num_actual (`pr#42420 <https://github.com/ceph/ceph/pull/42420>`_, Dan van der Ster)
-* mgr/Dashboard: Remove erroneous elements in hosts-overview Grafana dashboard (`pr#41649 <https://github.com/ceph/ceph/pull/41649>`_, Malcolm Holmes)
-* mgr/cephadm: fix prometheus alerts (`pr#41660 <https://github.com/ceph/ceph/pull/41660>`_, Paul Cuzner, Sage Weil, Patrick Seidensal)
-* mgr/dashboard: Add configurable MOTD or wall notification (`pr#42412 <https://github.com/ceph/ceph/pull/42412>`_, Volker Theile)
-* mgr/dashboard: Fix bucket name input allowing space in the value (`pr#42241 <https://github.com/ceph/ceph/pull/42241>`_, Nizamudeen A)
-* mgr/dashboard: RGW buckets async validator performance enhancement and name constraints (`pr#42123 <https://github.com/ceph/ceph/pull/42123>`_, Nizamudeen A)
-* mgr/dashboard: User database migration has been cut out (`pr#42142 <https://github.com/ceph/ceph/pull/42142>`_, Volker Theile)
-* mgr/dashboard: disable NFSv3 support in dashboard (`pr#41199 <https://github.com/ceph/ceph/pull/41199>`_, Volker Theile)
-* mgr/dashboard: fix API docs link (`pr#41508 <https://github.com/ceph/ceph/pull/41508>`_, Avan Thakkar)
-* mgr/dashboard: fix OSD out count (`pr#42154 <https://github.com/ceph/ceph/pull/42154>`_, 胡玮文)
-* mgr/dashboard: fix OSDs Host details/overview grafana graphs (`issue#49769 <http://tracker.ceph.com/issues/49769>`_, `pr#41530 <https://github.com/ceph/ceph/pull/41530>`_, Alfonso Martínez, Michael Wodniok)
-* mgr/dashboard: fix bucket objects and size calculations (`pr#41647 <https://github.com/ceph/ceph/pull/41647>`_, Avan Thakkar)
-* mgr/dashboard: fix for right sidebar nav icon not clickable (`pr#42015 <https://github.com/ceph/ceph/pull/42015>`_, Aaryan Porwal)
-* mgr/dashboard: run cephadm-backend e2e tests with KCLI (`pr#42243 <https://github.com/ceph/ceph/pull/42243>`_, Alfonso Martínez)
-* mgr/dashboard: show partially deleted RBDs (`pr#41887 <https://github.com/ceph/ceph/pull/41887>`_, Tatjana Dehler)
-* mgr/telemetry: pass leaderboard flag even w/o ident (`pr#41870 <https://github.com/ceph/ceph/pull/41870>`_, Sage Weil)
-* mgr: do not load disabled modules (`pr#41617 <https://github.com/ceph/ceph/pull/41617>`_, Kefu Chai)
-* mon/MonClient: tolerate a rotating key that is slightly out of date (`pr#41449 <https://github.com/ceph/ceph/pull/41449>`_, Ilya Dryomov)
-* mon/OSDMonitor: drop stale failure_info even if can_mark_down() (`pr#41618 <https://github.com/ceph/ceph/pull/41618>`_, Kefu Chai)
-* mon: load stashed map before mkfs monmap (`pr#41621 <https://github.com/ceph/ceph/pull/41621>`_, Dan van der Ster)
-* os/bluestore: Remove possibility of replay log and file inconsistency (`pr#42374 <https://github.com/ceph/ceph/pull/42374>`_, Adam Kupczyk)
-* os/bluestore: compact db after bulk omap naming upgrade (`pr#42375 <https://github.com/ceph/ceph/pull/42375>`_, Igor Fedotov)
-* os/bluestore: fix erroneous SharedBlob record removal during repair (`pr#42373 <https://github.com/ceph/ceph/pull/42373>`_, Igor Fedotov)
-* os/bluestore: fix unexpected ENOSPC in Avl/Hybrid allocators (`pr#41658 <https://github.com/ceph/ceph/pull/41658>`_, Igor Fedotov)
-* os/bluestore: introduce multithireading sync for bluestore's repairer (`pr#41613 <https://github.com/ceph/ceph/pull/41613>`_, Igor Fedotov)
-* os/bluestore: tolerate zero length for allocators' init\_[add/rm]_free() (`pr#41612 <https://github.com/ceph/ceph/pull/41612>`_, Igor Fedotov)
-* osd/PG.cc: handle removal of pgmeta object (`pr#41623 <https://github.com/ceph/ceph/pull/41623>`_, Neha Ojha)
-* osd/PeeringState: fix acting_set_writeable min_size check (`pr#41609 <https://github.com/ceph/ceph/pull/41609>`_, Samuel Just)
-* osd/osd_type: use f->dump_unsigned() when appropriate (`pr#42257 <https://github.com/ceph/ceph/pull/42257>`_, Kefu Chai)
-* osd: clear data digest when write_trunc (`pr#41620 <https://github.com/ceph/ceph/pull/41620>`_, Zengran Zhang)
-* osd: fix scrub reschedule bug (`pr#41972 <https://github.com/ceph/ceph/pull/41972>`_, wencong wan)
-* osd: log snaptrim message to dout (`pr#42484 <https://github.com/ceph/ceph/pull/42484>`_, Arthur Outhenin-Chalandre)
-* osd: move down peers out from peer_purged (`pr#42239 <https://github.com/ceph/ceph/pull/42239>`_, Mykola Golub)
-* pacific: pybind/ceph_volume_client: stat on empty string (`pr#42161 <https://github.com/ceph/ceph/pull/42161>`_, Patrick Donnelly)
-* qa/\*/test_envlibrados_for_rocksdb.sh: install libarchive-3.3.3 (`pr#42421 <https://github.com/ceph/ceph/pull/42421>`_, Neha Ojha)
-* qa/cephadm/upgrade: use v15.2.9 for cephadm tests (`pr#41568 <https://github.com/ceph/ceph/pull/41568>`_, Deepika Upadhyay)
-* qa/config/rados: add dispatch delay testing params (`pr#42180 <https://github.com/ceph/ceph/pull/42180>`_, Deepika Upadhyay)
-* qa/distros: move to latest version on supported distro's (`pr#41478 <https://github.com/ceph/ceph/pull/41478>`_, Josh Durgin, Yuri Weinstein, Deepika Upadhyay, Sage Weil, Kefu Chai, Patrick Donnelly, rakeshgm)
-* qa/suites/rados/perf: pin to 18.04 (`pr#41922 <https://github.com/ceph/ceph/pull/41922>`_, Neha Ojha)
-* qa/suites/rados: add simultaneous scrubs to the thrasher (`pr#42422 <https://github.com/ceph/ceph/pull/42422>`_, Ronen Friedman)
-* qa/tasks/qemu: precise repos have been archived (`pr#41642 <https://github.com/ceph/ceph/pull/41642>`_, Ilya Dryomov)
-* qa/upgrade: disable update_features test_notify with older client as lockowner (`pr#41511 <https://github.com/ceph/ceph/pull/41511>`_, Deepika Upadhyay)
-* qa/workunits/rbd: use bionic version of qemu-iotests for focal (`pr#42025 <https://github.com/ceph/ceph/pull/42025>`_, Ilya Dryomov)
-* rbd-mirror: fix segfault in snapshot replayer shutdown (`pr#41502 <https://github.com/ceph/ceph/pull/41502>`_, Arthur Outhenin-Chalandre)
-* rbd: retrieve global config overrides from the MONs (`pr#41836 <https://github.com/ceph/ceph/pull/41836>`_, Ilya Dryomov, Jason Dillaman)
-* rgw : add check empty for sync url (`pr#41766 <https://github.com/ceph/ceph/pull/41766>`_, caolei)
-* rgw/amqp/kafka: prevent concurrent shutdowns from happening (`pr#40381 <https://github.com/ceph/ceph/pull/40381>`_, Yuval Lifshitz)
-* rgw/amqp/test: fix mock prototype for librabbitmq-0.11.0 (`pr#41418 <https://github.com/ceph/ceph/pull/41418>`_, Yuval Lifshitz)
-* rgw/notifications: delete bucket notification object when empty (`pr#41412 <https://github.com/ceph/ceph/pull/41412>`_, Yuval Lifshitz)
-* rgw/rgw_file: Fix the return value of read() and readlink() (`pr#41416 <https://github.com/ceph/ceph/pull/41416>`_, Dai zhiwei, luo rixin)
-* rgw/sts: read_obj_policy() consults iam_user_policies on ENOENT (`pr#41415 <https://github.com/ceph/ceph/pull/41415>`_, Casey Bodley)
-* rgw: Backport 51674 to Octopus (`pr#42347 <https://github.com/ceph/ceph/pull/42347>`_, Adam C. Emerson)
-* rgw: Improve error message on email id reuse (`pr#41784 <https://github.com/ceph/ceph/pull/41784>`_, Ponnuvel Palaniyappan)
-* rgw: allow rgw-orphan-list to process multiple data pools (`pr#41417 <https://github.com/ceph/ceph/pull/41417>`_, J. Eric Ivancich)
-* rgw: allow to set ssl options and ciphers for beast frontend (`pr#42368 <https://github.com/ceph/ceph/pull/42368>`_, Mykola Golub)
-* rgw: check object locks in multi-object delete (`issue#47586 <http://tracker.ceph.com/issues/47586>`_, `pr#41031 <https://github.com/ceph/ceph/pull/41031>`_, Mark Houghton)
-* rgw: fix bucket object listing when marker matches prefix (`pr#41413 <https://github.com/ceph/ceph/pull/41413>`_, J. Eric Ivancich)
-* rgw: fix segfault related to explicit object manifest handling (`pr#41420 <https://github.com/ceph/ceph/pull/41420>`_, Mark Kogan)
-* rgw: limit rgw_gc_max_objs to RGW_SHARDS_PRIME_1 (`pr#40383 <https://github.com/ceph/ceph/pull/40383>`_, Rafał Wądołowski)
-* rgw: qa/tasks/barbican.py: fix year2021 problem (`pr#40385 <https://github.com/ceph/ceph/pull/40385>`_, Marcus Watts)
-* rgw: radoslist incomplete multipart parts marker (`pr#40820 <https://github.com/ceph/ceph/pull/40820>`_, J. Eric Ivancich)
-* rgw: require bucket name in bucket chown (`pr#41765 <https://github.com/ceph/ceph/pull/41765>`_, Zulai Wang)
-* rgw: send headers of quota settings (`pr#41419 <https://github.com/ceph/ceph/pull/41419>`_, Or Friedmann)
-* rpm: drop use of $FIRST_ARG in ceph-immutable-object-cache (`pr#42509 <https://github.com/ceph/ceph/pull/42509>`_, Nathan Cutler)
-* rpm: three spec file cleanups (`pr#42440 <https://github.com/ceph/ceph/pull/42440>`_, Nathan Cutler, Franck Bui)
-* test: bump DecayCounter.steady acceptable error (`pr#41619 <https://github.com/ceph/ceph/pull/41619>`_, Patrick Donnelly)
-
-
-v15.2.13 Octopus
-================
-
-This is the 13th backport release in the Octopus series. We recommend all
-users update to this release.
-
-Notable Changes
----------------
-
-* RADOS: Ability to dynamically adjust trimming rate in the monitor and several other bug fixes.
-
-* A long-standing bug that prevented 32-bit and 64-bit client/server
-  interoperability under msgr v2 has been fixed.  In particular, mixing armv7l
-  (armhf) and x86_64 or aarch64 servers in the same cluster now works.
-
-Changelog
----------
-
-* blk/kernel: fix io_uring got (4) Interrupted system call (`pr#39899 <https://github.com/ceph/ceph/pull/39899>`_, Yanhu Cao)
-* ceph.spec.in: Enable tcmalloc on IBM Power and Z (`pr#39487 <https://github.com/ceph/ceph/pull/39487>`_, Nathan Cutler, Yaakov Selkowitz)
-* cephadm: `cephadm ls` broken for SUSE downstream alertmanager container (`pr#39802 <https://github.com/ceph/ceph/pull/39802>`_, Patrick Seidensal)
-* cephadm: Allow to use paths in all <_devices> drivegroup sections (`pr#40838 <https://github.com/ceph/ceph/pull/40838>`_, Juan Miguel Olmo Martínez)
-* cephadm: add docker.service dependency in systemd units (`pr#39804 <https://github.com/ceph/ceph/pull/39804>`_, Sage Weil)
-* cephadm: allow redeploy of daemons in error state if container running (`pr#39717 <https://github.com/ceph/ceph/pull/39717>`_, Adam King)
-* cephadm: fix failure when using --apply-spec and --shh-user (`pr#40737 <https://github.com/ceph/ceph/pull/40737>`_, Daniel Pivonka)
-* cephadm: run containers using `--init` (`pr#39914 <https://github.com/ceph/ceph/pull/39914>`_, Michael Fritch, Sage Weil)
-* cephfs: client: only check pool permissions for regular files (`pr#40779 <https://github.com/ceph/ceph/pull/40779>`_, Xiubo Li)
-* cephfs: client: wake up the front pos waiter (`pr#40771 <https://github.com/ceph/ceph/pull/40771>`_, Xiubo Li)
-* client: fire the finish_cap_snap() after buffer being flushed (`pr#40778 <https://github.com/ceph/ceph/pull/40778>`_, Xiubo Li)
-* cmake: build static libs if they are internal ones (`pr#40789 <https://github.com/ceph/ceph/pull/40789>`_, Kefu Chai)
-* cmake: define BOOST_ASIO_USE_TS_EXECUTOR_AS_DEFAULT globaly (`pr#40784 <https://github.com/ceph/ceph/pull/40784>`_, Kefu Chai)
-* common/buffer: adjust align before calling posix_memalign() (`pr#41247 <https://github.com/ceph/ceph/pull/41247>`_, Ilya Dryomov)
-* common/ipaddr: Allow binding on lo (`pr#39343 <https://github.com/ceph/ceph/pull/39343>`_, Thomas Goirand)
-* common/ipaddr: skip loopback interfaces named 'lo' and test it (`pr#40424 <https://github.com/ceph/ceph/pull/40424>`_, Dan van der Ster)
-* common/mempool: Improve mempool shard selection (`pr#39978 <https://github.com/ceph/ceph/pull/39978>`_, singuliere, Adam Kupczyk)
-* common/options/global.yaml.in: increase default value of bluestore_cache_trim_max_skip_pinned (`pr#40919 <https://github.com/ceph/ceph/pull/40919>`_, Neha Ojha)
-* common/options: bluefs_buffered_io=true by default (`pr#40392 <https://github.com/ceph/ceph/pull/40392>`_, Dan van der Ster)
-* common: Fix assertion when disabling and re-enabling clog_to_monitors (`pr#39935 <https://github.com/ceph/ceph/pull/39935>`_, Gerald Yang)
-* common: remove log_early configuration option (`pr#40550 <https://github.com/ceph/ceph/pull/40550>`_, Changcheng Liu)
-* crush/CrushLocation: do not print logging message in constructor (`pr#40791 <https://github.com/ceph/ceph/pull/40791>`_, Alex Wu)
-* crush/CrushWrapper: update shadow trees on update_item() (`pr#39919 <https://github.com/ceph/ceph/pull/39919>`_, Sage Weil)
-* debian/ceph-common.postinst: do not chown cephadm log dirs (`pr#40275 <https://github.com/ceph/ceph/pull/40275>`_, Sage Weil)
-* doc/cephfs/nfs: Add note about cephadm NFS-Ganesha daemon port (`pr#40777 <https://github.com/ceph/ceph/pull/40777>`_, Varsha Rao)
-* doc/cephfs/nfs: Add rook pod restart note, export and log block example (`pr#40766 <https://github.com/ceph/ceph/pull/40766>`_, Varsha Rao)
-* doc: snap-schedule documentation (`pr#40775 <https://github.com/ceph/ceph/pull/40775>`_, Jan Fajerski)
-* install-deps.sh: remove existing ceph-libboost of different version (`pr#40286 <https://github.com/ceph/ceph/pull/40286>`_, Kefu Chai)
-* krbd: make sure the device node is accessible after the mapping (`pr#39968 <https://github.com/ceph/ceph/pull/39968>`_, Ilya Dryomov)
-* librbd/api: avoid retrieving more than max mirror image info records (`pr#39964 <https://github.com/ceph/ceph/pull/39964>`_, Jason Dillaman)
-* librbd/io: conditionally disable move optimization (`pr#39958 <https://github.com/ceph/ceph/pull/39958>`_, Jason Dillaman)
-* librbd/io: send alloc_hint when compression hint is set (`pr#40386 <https://github.com/ceph/ceph/pull/40386>`_, Jason Dillaman)
-* librbd/mirror/snapshot: avoid UnlinkPeerRequest with a unlinked peer (`pr#41302 <https://github.com/ceph/ceph/pull/41302>`_, Arthur Outhenin-Chalandre)
-* librbd: allow interrupted trash move request to be restarted (`pr#40387 <https://github.com/ceph/ceph/pull/40387>`_, Jason Dillaman)
-* librbd: explicitly disable readahead for writearound cache (`pr#39962 <https://github.com/ceph/ceph/pull/39962>`_, Jason Dillaman)
-* librbd: refuse to release exclusive lock when removing (`pr#39966 <https://github.com/ceph/ceph/pull/39966>`_, Ilya Dryomov)
-* mds: fix race of fetching large dirfrag (`pr#40774 <https://github.com/ceph/ceph/pull/40774>`_, Erqi Chen)
-* mds: trim cache regularly for standby-replay (`pr#40743 <https://github.com/ceph/ceph/pull/40743>`_, Xiubo Li, Patrick Donnelly)
-* mds: update defaults for recall configs (`pr#40764 <https://github.com/ceph/ceph/pull/40764>`_, Patrick Donnelly)
-* mgr/PyModule: put mgr_module_path before Py_GetPath() (`pr#40534 <https://github.com/ceph/ceph/pull/40534>`_, Kefu Chai)
-* mgr/cephadm: alias rgw-nfs -> nfs (`pr#40009 <https://github.com/ceph/ceph/pull/40009>`_, Michael Fritch)
-* mgr/cephadm: on ssh connection error, advice chmod 0600 (`pr#40823 <https://github.com/ceph/ceph/pull/40823>`_, Sebastian Wagner)
-* mgr/dashboard: Add badge to the Label column in Host List (`pr#40433 <https://github.com/ceph/ceph/pull/40433>`_, Nizamudeen A)
-* mgr/dashboard: Device health status is not getting listed under hosts section (`pr#40495 <https://github.com/ceph/ceph/pull/40495>`_, Aashish Sharma)
-* mgr/dashboard: Fix for alert notification message being undefined (`pr#40589 <https://github.com/ceph/ceph/pull/40589>`_, Nizamudeen A)
-* mgr/dashboard: Fix for broken User management role cloning (`pr#40399 <https://github.com/ceph/ceph/pull/40399>`_, Nizamudeen A)
-* mgr/dashboard: OSDs placement text is unreadable (`pr#41124 <https://github.com/ceph/ceph/pull/41124>`_, Aashish Sharma)
-* mgr/dashboard: Remove redundant pytest requirement (`pr#40657 <https://github.com/ceph/ceph/pull/40657>`_, Kefu Chai)
-* mgr/dashboard: Remove username and password from request body (`pr#41057 <https://github.com/ceph/ceph/pull/41057>`_, Nizamudeen A)
-* mgr/dashboard: Remove username, password fields from Manager Modules/dashboard,influx (`pr#40491 <https://github.com/ceph/ceph/pull/40491>`_, Aashish Sharma)
-* mgr/dashboard: Revoke read-only user's access to Manager modules (`pr#40649 <https://github.com/ceph/ceph/pull/40649>`_, Nizamudeen A)
-* mgr/dashboard: Splitting tenant$user when creating rgw user (`pr#40297 <https://github.com/ceph/ceph/pull/40297>`_, Nizamudeen A)
-* mgr/dashboard: additional logging to SMART data retrieval (`pr#37972 <https://github.com/ceph/ceph/pull/37972>`_, Kiefer Chang, Patrick Seidensal)
-* mgr/dashboard: allow getting fresh inventory data from the orchestrator (`pr#41387 <https://github.com/ceph/ceph/pull/41387>`_, Kiefer Chang)
-* mgr/dashboard: debug nodeenv hangs (`pr#40816 <https://github.com/ceph/ceph/pull/40816>`_, Ernesto Puerta)
-* mgr/dashboard: filesystem pool size should use stored stat (`pr#41020 <https://github.com/ceph/ceph/pull/41020>`_, Avan Thakkar)
-* mgr/dashboard: fix base-href: revert it to previous approach (`pr#41252 <https://github.com/ceph/ceph/pull/41252>`_, Avan Thakkar)
-* mgr/dashboard: fix dashboard instance ssl certificate functionality (`pr#40001 <https://github.com/ceph/ceph/pull/40001>`_, Avan Thakkar)
-* mgr/dashboard: improve telemetry opt-in reminder notification message (`pr#40894 <https://github.com/ceph/ceph/pull/40894>`_, Waad Alkhoury)
-* mgr/dashboard: test prometheus rules through promtool (`pr#39987 <https://github.com/ceph/ceph/pull/39987>`_, Aashish Sharma, Kefu Chai)
-* mgr/progress: ensure progress stays between [0,1] (`pr#41311 <https://github.com/ceph/ceph/pull/41311>`_, Dan van der Ster)
-* mgr/rook: Add timezone info (`pr#39716 <https://github.com/ceph/ceph/pull/39716>`_, Varsha Rao)
-* mgr/telemetry: check if 'ident' channel is active (`pr#39922 <https://github.com/ceph/ceph/pull/39922>`_, Sage Weil, Yaarit Hatuka)
-* mgr/volumes: Retain suid guid bits in clone (`pr#40268 <https://github.com/ceph/ceph/pull/40268>`_, Kotresh HR)
-* mgr: fix deadlock in ActivePyModules::get_osdmap() (`pr#39341 <https://github.com/ceph/ceph/pull/39341>`_, peng jiaqi)
-* mgr: relax osd ok-to-stop condition on degraded pgs (`pr#39887 <https://github.com/ceph/ceph/pull/39887>`_, Xuehan Xu)
-* mgr: update mon metadata when monmap is updated (`pr#39219 <https://github.com/ceph/ceph/pull/39219>`_, Kefu Chai)
-* mon/ConfigMap: fix stray option leak (`pr#40298 <https://github.com/ceph/ceph/pull/40298>`_, Sage Weil)
-* mon/MgrMonitor: populate available_modules from promote_standby() (`pr#40757 <https://github.com/ceph/ceph/pull/40757>`_, Sage Weil)
-* mon/MonClient: reset authenticate_err in _reopen_session() (`pr#41017 <https://github.com/ceph/ceph/pull/41017>`_, Ilya Dryomov)
-* mon/OSDMonitor: drop stale failure_info after a grace period (`pr#40558 <https://github.com/ceph/ceph/pull/40558>`_, Kefu Chai)
-* mon/OSDMonitor: fix safety/idempotency of {set,rm}-device-class (`pr#40276 <https://github.com/ceph/ceph/pull/40276>`_, Sage Weil)
-* mon: Modifying trim logic to change paxos_service_trim_max dynamically (`pr#40699 <https://github.com/ceph/ceph/pull/40699>`_, Aishwarya Mathuria)
-* mon: check mdsmap is resizeable before promoting standby-replay (`pr#40783 <https://github.com/ceph/ceph/pull/40783>`_, Patrick Donnelly)
-* monmaptool: Don't call set_port on an invalid address (`pr#40758 <https://github.com/ceph/ceph/pull/40758>`_, Brad Hubbard, Kefu Chai)
-* mount.ceph: collect v2 addresses for non-legacy ms_mode options (`pr#40763 <https://github.com/ceph/ceph/pull/40763>`_, Jeff Layton)
-* os/FileStore: don't propagate split/merge error to "create"/"remove" (`pr#40988 <https://github.com/ceph/ceph/pull/40988>`_, Mykola Golub)
-* os/FileStore: fix to handle readdir error correctly (`pr#41237 <https://github.com/ceph/ceph/pull/41237>`_, Misono Tomohiro)
-* os/bluestore/BlueFS: do not _flush_range deleted files (`pr#40793 <https://github.com/ceph/ceph/pull/40793>`_, weixinwei)
-* os/bluestore/BlueFS: use iterator_impl::copy instead of bufferlist::c_str() to avoid bufferlist rebuild (`pr#39884 <https://github.com/ceph/ceph/pull/39884>`_, weixinwei)
-* os/bluestore: Make Onode::put/get resiliant to split_cache (`pr#40441 <https://github.com/ceph/ceph/pull/40441>`_, Igor Fedotov, Adam Kupczyk)
-* os/bluestore: be more verbose in _open_super_meta by default (`pr#41061 <https://github.com/ceph/ceph/pull/41061>`_, Igor Fedotov)
-* osd/OSDMap: An empty bucket or OSD is not an error (`pr#39970 <https://github.com/ceph/ceph/pull/39970>`_, Brad Hubbard)
-* osd: add osd_fast_shutdown_notify_mon option (default false) (`issue#46978 <http://tracker.ceph.com/issues/46978>`_, `pr#40013 <https://github.com/ceph/ceph/pull/40013>`_, Mauricio Faria de Oliveira)
-* osd: compute OSD's space usage ratio via raw space utilization (`pr#41112 <https://github.com/ceph/ceph/pull/41112>`_, Igor Fedotov)
-* osd: do not dump an osd multiple times (`pr#40788 <https://github.com/ceph/ceph/pull/40788>`_, Xue Yantao)
-* osd: don't assert in-flight backfill is always in recovery list (`pr#41321 <https://github.com/ceph/ceph/pull/41321>`_, Mykola Golub)
-* osd: fix potential null pointer dereference when sending ping (`pr#40277 <https://github.com/ceph/ceph/pull/40277>`_, Mykola Golub)
-* osd: propagate base pool application_metadata to tiers (`pr#40274 <https://github.com/ceph/ceph/pull/40274>`_, Sage Weil)
-* packaging: require ceph-common for immutable object cache daemon (`pr#40666 <https://github.com/ceph/ceph/pull/40666>`_, Ilya Dryomov)
-* pybind/ceph_argparse.py: use a safe value for timeout (`pr#40476 <https://github.com/ceph/ceph/pull/40476>`_, Kefu Chai)
-* pybind/cephfs: DT_REG and DT_LNK values are wrong (`pr#40770 <https://github.com/ceph/ceph/pull/40770>`_, Varsha Rao)
-* pybind/mgr/balancer/module.py: assign weight-sets to all buckets before balancing (`pr#40127 <https://github.com/ceph/ceph/pull/40127>`_, Neha Ojha)
-* pybind/mgr/dashboard: bump flake8 to 3.9.0 (`pr#40492 <https://github.com/ceph/ceph/pull/40492>`_, Kefu Chai, Volker Theile)
-* qa/\*/thrash_cache_writeback_proxy_none.yaml: disable writeback overlay tests (`pr#39578 <https://github.com/ceph/ceph/pull/39578>`_, Neha Ojha)
-* qa/ceph-ansible: Update ansible version and ceph_stable_release (`pr#40945 <https://github.com/ceph/ceph/pull/40945>`_, Brad Hubbard)
-* qa/suites/krbd: address recent issues caused by newer kernels (`pr#40065 <https://github.com/ceph/ceph/pull/40065>`_, Ilya Dryomov)
-* qa/suites/rados/cephadm/upgrade: change starting version by distro (`pr#40364 <https://github.com/ceph/ceph/pull/40364>`_, Sage Weil)
-* qa/suites/rados/cephadm: rm ubuntu_18.04_podman (`pr#39949 <https://github.com/ceph/ceph/pull/39949>`_, Sebastian Wagner)
-* qa/suites/rados/singletone: whitelist MON_DOWN when injecting msgr errors (`pr#40138 <https://github.com/ceph/ceph/pull/40138>`_, Sage Weil)
-* qa/tasks/mgr/test_progress.py:  remove calling of _osd_in_out_completed_events_count() (`pr#40225 <https://github.com/ceph/ceph/pull/40225>`_, Kamoltat)
-* qa/tasks/mgr/test_progress: fix wait_until_equal (`pr#39360 <https://github.com/ceph/ceph/pull/39360>`_, Kamoltat)
-* qa/tasks/vstart_runner.py: start max required mgrs (`pr#40792 <https://github.com/ceph/ceph/pull/40792>`_, Alfonso Martínez)
-* qa/tests: advanced octopus initial version to 15.2.10 (`pr#41228 <https://github.com/ceph/ceph/pull/41228>`_, Yuri Weinstein)
-* qa: add sleep for blocklisting to take effect (`pr#40773 <https://github.com/ceph/ceph/pull/40773>`_, Patrick Donnelly)
-* qa: bump osd heartbeat grace for ffsb workload (`pr#40767 <https://github.com/ceph/ceph/pull/40767>`_, Patrick Donnelly)
-* qa: delete all fs during tearDown (`pr#40772 <https://github.com/ceph/ceph/pull/40772>`_, Patrick Donnelly)
-* qa: for the latest kclient it will also return EIO (`pr#40765 <https://github.com/ceph/ceph/pull/40765>`_, Xiubo Li)
-* qa: krbd_blkroset.t: update for separate hw and user read-only flags (`pr#40211 <https://github.com/ceph/ceph/pull/40211>`_, Ilya Dryomov)
-* rbd-mirror: bad state and crashes in snapshot-based mirroring (`pr#39961 <https://github.com/ceph/ceph/pull/39961>`_, Jason Dillaman)
-* rbd-mirror: delay update snapshot mirror image state (`pr#39967 <https://github.com/ceph/ceph/pull/39967>`_, Jason Dillaman)
-* rbd-mirror: fix UB while registering perf counters (`pr#40790 <https://github.com/ceph/ceph/pull/40790>`_, Arthur Outhenin-Chalandre)
-* rbd/bench: include used headers (`pr#40388 <https://github.com/ceph/ceph/pull/40388>`_, Kefu Chai)
-* rgw/amqp: fix race condition in amqp manager initialization (`pr#40382 <https://github.com/ceph/ceph/pull/40382>`_, Yuval Lifshitz)
-* rgw/http: add timeout to http client (`pr#40384 <https://github.com/ceph/ceph/pull/40384>`_, Yuval Lifshitz)
-* rgw/notification: support GetTopicAttributes API (`pr#40812 <https://github.com/ceph/ceph/pull/40812>`_, Yuval Lifshitz)
-* rgw/notification: trigger notifications on changes from any user (`pr#40029 <https://github.com/ceph/ceph/pull/40029>`_, Yuval Lifshitz)
-* rgw: Use correct bucket info when put or get large object with swift (`pr#40296 <https://github.com/ceph/ceph/pull/40296>`_, zhiming zhang, yupeng chen)
-* rgw: add MD5 in forward_request (`pr#39758 <https://github.com/ceph/ceph/pull/39758>`_, caolei)
-* rgw: allow rgw-orphan-list to handle intermediate files w/ binary data (`pr#39766 <https://github.com/ceph/ceph/pull/39766>`_, J. Eric Ivancich)
-* rgw: catch non int exception (`pr#39746 <https://github.com/ceph/ceph/pull/39746>`_, caolei)
-* rgw: during reshard lock contention, adjust logging (`pr#41157 <https://github.com/ceph/ceph/pull/41157>`_, J. Eric Ivancich)
-* rgw: fix sts get_session_token duration check failed (`pr#39954 <https://github.com/ceph/ceph/pull/39954>`_, yuliyang_yewu)
-* rgw: multisite: fix single-part-MPU object etag misidentify problem (`pr#39611 <https://github.com/ceph/ceph/pull/39611>`_, Yang Honggang)
-* rgw: objectlock: improve client error messages (`pr#40755 <https://github.com/ceph/ceph/pull/40755>`_, Matt Benjamin)
-* rgw: return error when trying to copy encrypted object without key (`pr#40672 <https://github.com/ceph/ceph/pull/40672>`_, Ilsoo Byun)
-* rgw: tooling to locate rgw objects with missing rados components (`pr#39785 <https://github.com/ceph/ceph/pull/39785>`_, Michael Kidd, J. Eric Ivancich)
-* run-make-check.sh: let ctest generate XML output (`pr#40406 <https://github.com/ceph/ceph/pull/40406>`_, Kefu Chai)
-* src/global/signal_handler.h: fix preprocessor logic for alpine (`pr#39940 <https://github.com/ceph/ceph/pull/39940>`_, Duncan Bellamy)
-* test/rbd-mirror: fix broken ceph_test_rbd_mirror_random_write (`pr#39965 <https://github.com/ceph/ceph/pull/39965>`_, Jason Dillaman)
-* test/rgw: test_datalog_autotrim filters out new entries (`pr#40673 <https://github.com/ceph/ceph/pull/40673>`_, Casey Bodley)
-* test: cancelling both noscrub \*and\* nodeep-scrub (`pr#40278 <https://github.com/ceph/ceph/pull/40278>`_, Ronen Friedman)
-* test: reduce number of threads to 32 in LibCephFS.ShutdownRace (`pr#40776 <https://github.com/ceph/ceph/pull/40776>`_, Jeff Layton)
-* test: use std::atomic<bool> instead of volatile for cb_done var (`pr#40708 <https://github.com/ceph/ceph/pull/40708>`_, Jeff Layton)
-* tests: ceph_test_rados_api_watch_notify: Allow for reconnect (`pr#40756 <https://github.com/ceph/ceph/pull/40756>`_, Brad Hubbard)
-* tools/cephfs: don't bind to public_addr (`pr#40762 <https://github.com/ceph/ceph/pull/40762>`_, "Yan, Zheng")
-* vstart.sh: disable "auth_allow_insecure_global_id_reclaim" (`pr#40958 <https://github.com/ceph/ceph/pull/40958>`_, Kefu Chai)
-
-v15.2.12 Octopus
-================
-
-This is a hotfix release addressing a number of security issues and regressions. We recommend all users update to this release.
-
-Changelog
----------
-
-* mgr/dashboard: fix base-href: revert it to previous approach (`issue#50684 <https://tracker.ceph.com/issues/50684>`_, Avan Thakkar)
-* mgr/dashboard: fix cookie injection issue (:ref:`CVE-2021-3509`, Ernesto Puerta)
-* rgw: RGWSwiftWebsiteHandler::is_web_dir checks empty subdir_name (:ref:`CVE-2021-3531`, Felix Huettner)
-* rgw: sanitize \r in s3 CORSConfiguration's ExposeHeader (:ref:`CVE-2021-3524`, Sergey Bobrov, Casey Bodley)
-
-
-v15.2.11 Octopus
-================
-
-This is the 11th bugfix release in the Octopus stable series.  It addresses a
-security vulnerability in the Ceph authentication framework.
-
-We recommend all Octopus users upgrade.
-
-Security fixes
---------------
-
-* This release includes a security fix that ensures the global_id
-  value (a numeric value that should be unique for every authenticated
-  client or daemon in the cluster) is reclaimed after a network
-  disconnect or ticket renewal in a secure fashion.  Two new health
-  alerts may appear during the upgrade indicating that there are
-  clients or daemons that are not yet patched with the appropriate
-  fix.
-
-  To temporarily mute the health alerts around insecure clients for the duration of the
-  upgrade, you may want to::
-
-    ceph health mute AUTH_INSECURE_GLOBAL_ID_RECLAIM 1h
-    ceph health mute AUTH_INSECURE_GLOBAL_ID_RECLAIM_ALLOWED 1h
-
-  For more information, see :ref:`CVE-2021-20288`.
-
-
-v15.2.10 Octopus
-================
-
-This is the 10th backport release in the Octopus series. We recommend all
-users update to this release.
-
-Notable Changes
----------------
-
-* The containers include an updated tcmalloc that avoids crashes seen on 15.2.9.  See `issue#49618 <https://tracker.ceph.com/issues/49618>`_ for details.
-
-* RADOS: BlueStore handling of huge(>4GB) writes from RocksDB to BlueFS has been fixed.
-
-* When upgrading from a previous cephadm release, systemctl may hang when trying to start or restart the monitoring containers. (This is caused by a change in the systemd unit to use ``type=forking``.) After the upgrade, please run::
-
-    ceph orch redeploy nfs
-    ceph orch redeploy iscsi
-    ceph orch redeploy node-exporter
-    ceph orch redeploy prometheus
-    ceph orch redeploy grafana
-    ceph orch redeploy alertmanager
-
-Changelog
----------
-
-* octopus: .github: add workflow for adding label and milestone (`pr#39890 <https://github.com/ceph/ceph/pull/39890>`_, Kefu Chai, Ernesto Puerta)
-* octopus: ceph-volume: Fix usage of is_lv (`pr#39220 <https://github.com/ceph/ceph/pull/39220>`_, Michał Nasiadka)
-* octopus: ceph-volume: Update batch.py (`pr#39469 <https://github.com/ceph/ceph/pull/39469>`_, shenjiatong)
-* octopus: ceph-volume: add some flexibility to bytes_to_extents (`pr#39271 <https://github.com/ceph/ceph/pull/39271>`_, Jan Fajerski)
-* octopus: ceph-volume: pass --filter-for-batch from drive-group subcommand (`pr#39523 <https://github.com/ceph/ceph/pull/39523>`_, Jan Fajerski)
-* octopus: cephadm: Delete the unnecessary error line in open_ports (`pr#39633 <https://github.com/ceph/ceph/pull/39633>`_, Donggyu Park)
-* octopus: cephadm: fix 'inspect' and 'pull' (`pr#39715 <https://github.com/ceph/ceph/pull/39715>`_, Sage Weil)
-* octopus: cephfs: pybind/ceph_volume_client: Update the 'volumes' key to 'subvolumes' in auth-metadata file (`pr#39906 <https://github.com/ceph/ceph/pull/39906>`_, Kotresh HR)
-* octopus: cmake: boost>=1.74 adds BOOST_ASIO_USE_TS_EXECUTOR_AS_DEFAULT to radosgw (`pr#39885 <https://github.com/ceph/ceph/pull/39885>`_, Casey Bodley)
-* octopus: librbd: allow disabling journaling for snapshot based mirroring image (`pr#39864 <https://github.com/ceph/ceph/pull/39864>`_, Mykola Golub)
-* octopus: librbd: correct incremental deep-copy object-map inconsistencies (`pr#39577 <https://github.com/ceph/ceph/pull/39577>`_, Mykola Golub, Jason Dillaman)
-* octopus: librbd: don't log error if get mirror status fails due to mirroring disabled (`pr#39862 <https://github.com/ceph/ceph/pull/39862>`_, Mykola Golub)
-* octopus: librbd: use on-disk image name when storing mirror snapshot state (`pr#39866 <https://github.com/ceph/ceph/pull/39866>`_, Mykola Golub)
-* octopus: mgr/dashboard/monitoring: upgrade Grafana version due to CVE-2020-13379 (`pr#39306 <https://github.com/ceph/ceph/pull/39306>`_, Alfonso Martínez)
-* octopus: mgr/dashboard: CLI commands: read passwords from file (`pr#39436 <https://github.com/ceph/ceph/pull/39436>`_, Ernesto Puerta, Alfonso Martínez, Juan Miguel Olmo Martínez)
-* octopus: mgr/dashboard: Fix for incorrect validation in rgw user form (`pr#39027 <https://github.com/ceph/ceph/pull/39027>`_, Nizamudeen A)
-* octopus: mgr/dashboard: Fix missing root path of each session for CephFS (`pr#39868 <https://github.com/ceph/ceph/pull/39868>`_, Yongseok Oh)
-* octopus: mgr/dashboard: Monitoring alert badge includes suppressed alerts (`pr#39512 <https://github.com/ceph/ceph/pull/39512>`_, Aashish Sharma)
-* octopus: mgr/dashboard: add ssl verify option for prometheus and alert manager (`pr#39872 <https://github.com/ceph/ceph/pull/39872>`_, Jean "henyxia" Wasilewski)
-* octopus: mgr/dashboard: avoid using document.write() (`pr#39527 <https://github.com/ceph/ceph/pull/39527>`_, Avan Thakkar)
-* octopus: mgr/dashboard: delete EOF when reading passwords from file (`pr#40155 <https://github.com/ceph/ceph/pull/40155>`_, Alfonso Martínez)
-* octopus: mgr/dashboard: fix MTU Mismatch alert (`pr#39854 <https://github.com/ceph/ceph/pull/39854>`_, Aashish Sharma)
-* octopus: mgr/dashboard: fix issues related with PyJWT versions >=2.0.0 (`pr#39836 <https://github.com/ceph/ceph/pull/39836>`_, Alfonso Martínez)
-* octopus: mgr/dashboard: fix tooltip for Provisioned/Total Provisioned fields (`pr#39645 <https://github.com/ceph/ceph/pull/39645>`_, Avan Thakkar)
-* octopus: mgr/dashboard: prometheus alerting: add some leeway for package drops and errors (`pr#39507 <https://github.com/ceph/ceph/pull/39507>`_, Patrick Seidensal)
-* octopus: mgr/dashboard: report mgr fsid (`pr#39852 <https://github.com/ceph/ceph/pull/39852>`_, Ernesto Puerta)
-* octopus: mgr/dashboard: set security headers (`pr#39627 <https://github.com/ceph/ceph/pull/39627>`_, Avan Thakkar)
-* octopus: mgr/dashboard: trigger alert if some nodes have a MTU different than the median value (`pr#39103 <https://github.com/ceph/ceph/pull/39103>`_, Aashish Sharma)
-* octopus: mgr/dashboard:minimize console log traces of Ceph backend API tests (`pr#39545 <https://github.com/ceph/ceph/pull/39545>`_, Aashish Sharma)
-* octopus: mgr/rbd_support: create mirror snapshots asynchronously (`pr#39376 <https://github.com/ceph/ceph/pull/39376>`_, Mykola Golub, Kefu Chai)
-* octopus: mgr/rbd_support: mirror snapshot schedule should skip non-primary images (`pr#39863 <https://github.com/ceph/ceph/pull/39863>`_, Mykola Golub)
-* octopus: mgr/volume: subvolume auth_id management and few bug fixes (`pr#39390 <https://github.com/ceph/ceph/pull/39390>`_, Rishabh Dave, Patrick Donnelly, Kotresh HR, Ramana Raja)
-* octopus: mgr/zabbix: format ceph.[{#POOL},percent_used as float (`pr#39235 <https://github.com/ceph/ceph/pull/39235>`_, Kefu Chai)
-* octopus: os/bluestore: Add option to check BlueFS reads (`pr#39754 <https://github.com/ceph/ceph/pull/39754>`_, Adam Kupczyk)
-* octopus: os/bluestore: fix huge reads/writes at BlueFS (`pr#39701 <https://github.com/ceph/ceph/pull/39701>`_, Jianpeng Ma, Igor Fedotov)
-* octopus: os/bluestore: introduce bluestore_rocksdb_options_annex config parame… (`pr#39325 <https://github.com/ceph/ceph/pull/39325>`_, Igor Fedotov)
-* octopus: qa/suites/rados/dashboard: whitelist TELEMETRY_CHANGED (`pr#39704 <https://github.com/ceph/ceph/pull/39704>`_, Sage Weil)
-* octopus: qa/suites/upgrade: s/whitelist/ignorelist for octopus specific tests (`pr#40074 <https://github.com/ceph/ceph/pull/40074>`_, Deepika Upadhyay)
-* octopus: qa: use normal build for valgrind (`pr#39583 <https://github.com/ceph/ceph/pull/39583>`_, Sage Weil)
-* octopus: rbd-mirror: reset update_status_task pointer in timer thread (`pr#39867 <https://github.com/ceph/ceph/pull/39867>`_, Mykola Golub)
-* octopus: rgw: fix trailing null in object names of multipart reuploads (`pr#39277 <https://github.com/ceph/ceph/pull/39277>`_, Casey Bodley)
-* octopus: rgw: radosgw-admin: clarify error when email address already in use (`pr#39662 <https://github.com/ceph/ceph/pull/39662>`_, Matthew Vernon)
-* octopus: whitelist -> ignorelist for qa/\* only (`pr#39534 <https://github.com/ceph/ceph/pull/39534>`_, Neha Ojha, Sage Weil)
-* qa/tests: fixed branch entry (`pr#39819 <https://github.com/ceph/ceph/pull/39819>`_, Yuri Weinstein)
-
-
-v15.2.9 Octopus
-===============
-
-This is the 9th backport release in the Octopus series. We recommend all
-users update to this release.
-
-Notable Changes
----------------
-
-* MGR: progress module can now be turned on/off, using the commands:
-  ``ceph progress on`` and ``ceph progress off``.
-
-* OSD: PG removal has been optimized in this release.
-
-Changelog
----------
-
-* octopus: Do not add sensitive information in Ceph log files (`pr#38620 <https://github.com/ceph/ceph/pull/38620>`_, Neha Ojha)
-* octopus: PendingReleaseNotes: mgr/pg_autoscaler (`pr#39393 <https://github.com/ceph/ceph/pull/39393>`_, Kamoltat)
-* octopus: Revert "mgr/pg_autoscaler: avoid scale-down until there is pressure" (`pr#39560 <https://github.com/ceph/ceph/pull/39560>`_, Neha Ojha)
-* octopus: bluestore: Make mempool assignment same after bufferlist rebuild (`pr#38429 <https://github.com/ceph/ceph/pull/38429>`_, Adam Kupczyk)
-* octopus: bluestore: Support flock retry (`pr#37860 <https://github.com/ceph/ceph/pull/37860>`_, wanghongxu)
-* octopus: bluestore: attach csum for compressed blobs (`pr#37861 <https://github.com/ceph/ceph/pull/37861>`_, Igor Fedotov)
-* octopus: bluestore: fix "end reached" check in collection_list_legacy (`pr#38098 <https://github.com/ceph/ceph/pull/38098>`_, Mykola Golub)
-* octopus: bluestore: provide a different name for fallback allocator (`pr#37794 <https://github.com/ceph/ceph/pull/37794>`_, Igor Fedotov)
-* octopus: build/ops: doc: pass --use-feature=2020-resolver to pip (`pr#37859 <https://github.com/ceph/ceph/pull/37859>`_, Kefu Chai)
-* octopus: ceph-volume: lvm/create.py: fix a typo in the help message (`pr#38425 <https://github.com/ceph/ceph/pull/38425>`_, ZhenLiu94)
-* octopus: cephadm: Don't make sysctl spam the log file (`pr#39020 <https://github.com/ceph/ceph/pull/39020>`_, Sebastian Wagner)
-* octopus: cephadm: Revert "spec: Podman (temporarily) requires apparmor-abstractions on suse" (`pr#37766 <https://github.com/ceph/ceph/pull/37766>`_, Nathan Cutler)
-* octopus: cephadm: Various properties like 'last_refresh' do not contain timezone (`pr#39059 <https://github.com/ceph/ceph/pull/39059>`_, Volker Theile)
-* octopus: cephadm: batch backport January (1) (`pr#38782 <https://github.com/ceph/ceph/pull/38782>`_, Ricardo Marques, Patrick Donnelly, Ken Dreyer, Paul Cuzner, Daniel-Pivonka, Juan Miguel Olmo Martínez, Volker Theile, Sebastian Wagner, Varsha Rao, Adam King, Patrick Seidensal, Michael Fritch, Dan Mick)
-* octopus: cephadm: fix rgw osd cap tag (`pr#39170 <https://github.com/ceph/ceph/pull/39170>`_, Patrick Donnelly)
-* octopus: cephadm: make "ceph orch {restart|...}" asynchronous (`pr#39018 <https://github.com/ceph/ceph/pull/39018>`_, Sebastian Wagner)
-* octopus: cephadm: silence "Failed to evict container" log msg (`pr#39166 <https://github.com/ceph/ceph/pull/39166>`_, Sebastian Wagner, Sage Weil)
-* octopus: cephadm: use `apt-get` for package install/update (`pr#39297 <https://github.com/ceph/ceph/pull/39297>`_, Michael Fritch)
-* octopus: cephfs: client: add ceph.{cluster_fsid/client_id} vxattrs suppport (`pr#39000 <https://github.com/ceph/ceph/pull/39000>`_, Xiubo Li)
-* octopus: cephfs: client: check rdonly file handle on truncate (`pr#38424 <https://github.com/ceph/ceph/pull/38424>`_, Patrick Donnelly)
-* octopus: cephfs: client: do not use g_conf().get_val<>() in libcephfs (`pr#38466 <https://github.com/ceph/ceph/pull/38466>`_, Xiubo Li)
-* octopus: cephfs: client: ensure we take Fs caps when fetching directory link count from cached inode (`pr#38949 <https://github.com/ceph/ceph/pull/38949>`_, Jeff Layton)
-* octopus: cephfs: client: increment file position on _read_sync near eof (`pr#37989 <https://github.com/ceph/ceph/pull/37989>`_, Patrick Donnelly)
-* octopus: cephfs: client: set CEPH_STAT_RSTAT mask for dir in readdir_r_cb (`pr#38947 <https://github.com/ceph/ceph/pull/38947>`_, chencan)
-* octopus: cephfs: mds: dir->mark_new() should together with dir->mark_dirty() (`pr#38352 <https://github.com/ceph/ceph/pull/38352>`_, "Yan, Zheng")
-* octopus: cephfs: mds: move start_files_to_recover() to recovery_done (`pr#37985 <https://github.com/ceph/ceph/pull/37985>`_, Simon Gao)
-* octopus: cephfs: osdc: restart read on truncate/discard (`pr#37987 <https://github.com/ceph/ceph/pull/37987>`_, Patrick Donnelly)
-* octopus: cephfs: release client dentry_lease before send caps release to mds (`pr#38349 <https://github.com/ceph/ceph/pull/38349>`_, Wei Qiaomiao)
-* octopus: client: dump which fs is used by client for multiple-fs (`pr#38551 <https://github.com/ceph/ceph/pull/38551>`_, Zhi Zhang)
-* octopus: cmake: add empty RPATH to ceph-diff-sorted (`pr#38847 <https://github.com/ceph/ceph/pull/38847>`_, Nathan Cutler)
-* octopus: cmake: define BOOST_ASIO_USE_TS_EXECUTOR_AS_DEFAULT for Boost.Asio users (`pr#38759 <https://github.com/ceph/ceph/pull/38759>`_, Kefu Chai)
-* octopus: cmake: detect and use sigdescr_np() if available (`pr#38951 <https://github.com/ceph/ceph/pull/38951>`_, David Disseldorp)
-* octopus: do_cmake.sh: use python-3.9 with fedora version 33 (`pr#38943 <https://github.com/ceph/ceph/pull/38943>`_, Sunny Kumar)
-* octopus: doc: document MDS cache configuration (`pr#38202 <https://github.com/ceph/ceph/pull/38202>`_, Patrick Donnelly)
-* octopus: global: reexpand conf meta in child process (`pr#38340 <https://github.com/ceph/ceph/pull/38340>`_, Xiubo Li)
-* octopus: install-deps.sh: Make powertools repo case insensitive (`pr#38808 <https://github.com/ceph/ceph/pull/38808>`_, Brad Hubbard)
-* octopus: krbd: add support for msgr2 (kernel 5.11) (`pr#39203 <https://github.com/ceph/ceph/pull/39203>`_, Ilya Dryomov)
-* octopus: librbd: clear implicitly enabled feature bits when creating images (`pr#39122 <https://github.com/ceph/ceph/pull/39122>`_, Jason Dillaman)
-* octopus: librbd: fix regression in object map diff request (`pr#38455 <https://github.com/ceph/ceph/pull/38455>`_, Mykola Golub, Jason Dillaman)
-* octopus: librbd: update hidden global config when removing pool config override (`pr#38343 <https://github.com/ceph/ceph/pull/38343>`_, Jason Dillaman)
-* octopus: mds: dump granular cap info in mds_sessions (`pr#37362 <https://github.com/ceph/ceph/pull/37362>`_, Yanhu Cao)
-* octopus: mds: provide altrenatives to increase the total cephfs subvolume snapshot counts to greater than the current 400 across a Cephfs volume (`pr#38553 <https://github.com/ceph/ceph/pull/38553>`_, "Yan, Zheng")
-* octopus: mds: throttle cap acquisition via readdir (`pr#38095 <https://github.com/ceph/ceph/pull/38095>`_, Kotresh HR)
-* octopus: mgr/ActivePyModules.cc: always release GIL before attempting to acquire a lock (`pr#38801 <https://github.com/ceph/ceph/pull/38801>`_, Cory Snyder)
-* octopus: mgr/balancer: fix available pgs sent to calc_pg_upmaps (`pr#38337 <https://github.com/ceph/ceph/pull/38337>`_, Dan van der Ster)
-* octopus: mgr/cephadm: fix host refresh (`pr#39532 <https://github.com/ceph/ceph/pull/39532>`_, Sage Weil)
-* octopus: mgr/cephadm: lock multithreaded access to OSDRemovalQueue (`pr#39019 <https://github.com/ceph/ceph/pull/39019>`_, Sebastian Wagner)
-* octopus: mgr/cephadm: raise HEALTH_WARN when cephadm daemon in 'error' state (`pr#39169 <https://github.com/ceph/ceph/pull/39169>`_, Sage Weil)
-* octopus: mgr/cephadm: tolerate old host inventory without 'hostname' key (`pr#39167 <https://github.com/ceph/ceph/pull/39167>`_, Sage Weil)
-* octopus: mgr/cephadm: try again calling ceph-volume without --filter-for-batch (`pr#39300 <https://github.com/ceph/ceph/pull/39300>`_, Sebastian Wagner)
-* octopus: mgr/crash: Serialize command handling (`pr#38592 <https://github.com/ceph/ceph/pull/38592>`_, Boris Ranto)
-* octopus: mgr/dashboard: Add clay plugin support (`pr#38489 <https://github.com/ceph/ceph/pull/38489>`_, Stephan Müller)
-* octopus: mgr/dashboard: Create Ceph services via Orchestrator by using ServiceSpec (`pr#38888 <https://github.com/ceph/ceph/pull/38888>`_, Volker Theile)
-* octopus: mgr/dashboard: Display a warning message in Dashboard when debug mode is enabled (`pr#38798 <https://github.com/ceph/ceph/pull/38798>`_, Volker Theile)
-* octopus: mgr/dashboard: Drop invalid RGW client instances, improve logging (`pr#38583 <https://github.com/ceph/ceph/pull/38583>`_, Volker Theile)
-* octopus: mgr/dashboard: Fix CRUSH map viewer VirtualScroll (`pr#38607 <https://github.com/ceph/ceph/pull/38607>`_, Avan Thakkar)
-* octopus: mgr/dashboard: Fix for misleading "Orchestrator is not available" error (`pr#38598 <https://github.com/ceph/ceph/pull/38598>`_, Nizamudeen A)
-* octopus: mgr/dashboard: Fixing dashboard logs e2e test (`pr#38797 <https://github.com/ceph/ceph/pull/38797>`_, Nizamudeen A)
-* octopus: mgr/dashboard: Prevent table items from getting selected while expanding (`pr#37930 <https://github.com/ceph/ceph/pull/37930>`_, Nizamudeen A)
-* octopus: mgr/dashboard: RGW User Form is validating disabled fields (`pr#38594 <https://github.com/ceph/ceph/pull/38594>`_, Aashish Sharma)
-* octopus: mgr/dashboard: Temporary User Lockout if 10 Invalid Login attempts (`pr#38810 <https://github.com/ceph/ceph/pull/38810>`_, Nizamudeen A)
-* octopus: mgr/dashboard: The /rgw/status endpoint does not check for running service (`pr#38770 <https://github.com/ceph/ceph/pull/38770>`_, Volker Theile)
-* octopus: mgr/dashboard: Updating the inbuilt ssl providers error (`pr#38508 <https://github.com/ceph/ceph/pull/38508>`_, Nizamudeen A)
-* octopus: mgr/dashboard: Use secure cookies to store JWT Token (`pr#39120 <https://github.com/ceph/ceph/pull/39120>`_, Avan Thakkar, Aashish Sharma)
-* octopus: mgr/dashboard: add `--ssl` to `ng serve` (`pr#38973 <https://github.com/ceph/ceph/pull/38973>`_, Tatjana Dehler)
-* octopus: mgr/dashboard: adjust refresh intervals of Services and Daemons (`pr#38597 <https://github.com/ceph/ceph/pull/38597>`_, Kiefer Chang)
-* octopus: mgr/dashboard: allow selecting all daemons for Orchestrator NFS clusters (`pr#38496 <https://github.com/ceph/ceph/pull/38496>`_, Kiefer Chang)
-* octopus: mgr/dashboard: assign flags to single OSDs (`pr#38469 <https://github.com/ceph/ceph/pull/38469>`_, Tatjana Dehler)
-* octopus: mgr/dashboard: disable cluster selection in NFS export editing form (`pr#37969 <https://github.com/ceph/ceph/pull/37969>`_, Kiefer Chang)
-* octopus: mgr/dashboard: display placement column in service table (`pr#38336 <https://github.com/ceph/ceph/pull/38336>`_, Volker Theile)
-* octopus: mgr/dashboard: enable different URL for users of browser to Grafana (`pr#38761 <https://github.com/ceph/ceph/pull/38761>`_, Patrick Seidensal)
-* octopus: mgr/dashboard: fix Reads/Writes ratio of Clients IOPS donut chart (`pr#38867 <https://github.com/ceph/ceph/pull/38867>`_, Kiefer Chang)
-* octopus: mgr/dashboard: remove pyOpenSSL version pinning (`pr#38503 <https://github.com/ceph/ceph/pull/38503>`_, Kiefer Chang)
-* octopus: mgr/dashboard: test_standby\* (tasks.mgr.test_dashboard.TestDashboard) failed locally (`pr#38526 <https://github.com/ceph/ceph/pull/38526>`_, Volker Theile)
-* octopus: mgr/pg_autoscaler: avoid scale-down until there is pressure (`pr#39248 <https://github.com/ceph/ceph/pull/39248>`_, Kamoltat)
-* octopus: mgr/progress: introduce turn off/on feature (`pr#39289 <https://github.com/ceph/ceph/pull/39289>`_, kamoltat)
-* octopus: mgr/prometheus: Fix 'pool filling up' with >50% usage (`pr#38593 <https://github.com/ceph/ceph/pull/38593>`_, Daniël Vos)
-* octopus: mgr/prometheus: Sync and backport prometheus fixes (`pr#38333 <https://github.com/ceph/ceph/pull/38333>`_, Paul Cuzner, Boris Ranto, Kefu Chai, Ken Dreyer)
-* octopus: mgr/rbd_support: store global schedule without localized prefix (`pr#38342 <https://github.com/ceph/ceph/pull/38342>`_, Mykola Golub)
-* octopus: mgr/restful: fix TypeError occurring in _gather_osds() (`issue#48488 <http://tracker.ceph.com/issues/48488>`_, `pr#38595 <https://github.com/ceph/ceph/pull/38595>`_, Jerry Pu)
-* octopus: mgr/volumes: Add a per subvolume trash (`pr#38612 <https://github.com/ceph/ceph/pull/38612>`_, Venky Shankar, Shyamsundar Ranganathan)
-* octopus: mgr/volumes: Implement subvolume version v2 (`pr#36803 <https://github.com/ceph/ceph/pull/36803>`_, Shyamsundar Ranganathan)
-* octopus: mgr: Fix for dashboard/prometheus failure due to laggy pg state (`pr#38596 <https://github.com/ceph/ceph/pull/38596>`_, Alexander Sushko)
-* octopus: mgr: don't update osd stat which is already out (`pr#38353 <https://github.com/ceph/ceph/pull/38353>`_, Zhi Zhang)
-* octopus: mon: paxos: Delete logger in destructor (`pr#39161 <https://github.com/ceph/ceph/pull/39161>`_, Brad Hubbard)
-* octopus: mon: validate crush-failure-domain (`pr#38347 <https://github.com/ceph/ceph/pull/38347>`_, Prashant Dhange)
-* octopus: monitoring: Use null yaxes min for OSD read latency (`pr#37960 <https://github.com/ceph/ceph/pull/37960>`_, Seena Fallah)
-* octopus: msg/async/ProtocolV2: allow rxbuf/txbuf get bigger in testing, again (`pr#38267 <https://github.com/ceph/ceph/pull/38267>`_, Ilya Dryomov)
-* octopus: ocf: add support for mapping images within an RBD namespace (`pr#39046 <https://github.com/ceph/ceph/pull/39046>`_, Jason Dillaman)
-* octopus: os/bluestore: detect and fix "zombie" spanning blobs using fsck (`pr#39256 <https://github.com/ceph/ceph/pull/39256>`_, Igor Fedotov)
-* octopus: os/bluestore: fix huge (>4GB) bluefs reads (`pr#39253 <https://github.com/ceph/ceph/pull/39253>`_, Igor Fedotov)
-* octopus: os/bluestore: fix inappropriate ENOSPC from avl/hybrid allocator (`pr#38474 <https://github.com/ceph/ceph/pull/38474>`_, Igor Fedotov)
-* octopus: os/bluestore: fix segfault on out-of-bound offset provided to  claim_free_to_right() call (`pr#38428 <https://github.com/ceph/ceph/pull/38428>`_, Igor Fedotov)
-* octopus: os/bluestore: fixing onode pinning and more (`pr#39230 <https://github.com/ceph/ceph/pull/39230>`_, Adam Kupczyk, Igor Fedotov)
-* octopus: osd: fix bluestore bitmap allocator calculate wrong last_pos with hint (`pr#38430 <https://github.com/ceph/ceph/pull/38430>`_, Xue Yantao)
-* octopus: osd: optimize PG removal (part1) (`pr#38477 <https://github.com/ceph/ceph/pull/38477>`_, Igor Fedotov)
-* octopus: pybind/cephfs: fix missing terminating NULL char in readlink()'s C string (`pr#38893 <https://github.com/ceph/ceph/pull/38893>`_, Tuan Hoang)
-* octopus: pybind/mgr/rbd_support: delay creation of progress module events (`pr#38344 <https://github.com/ceph/ceph/pull/38344>`_, Jason Dillaman)
-* octopus: python-common/drivegroups: avoid dropping "rotational: 0" from Device Selection (`issue#49014 <http://tracker.ceph.com/issues/49014>`_, `pr#39171 <https://github.com/ceph/ceph/pull/39171>`_, Lukas Stockner)
-* octopus: python-common: fix test_datetime_to_str_2 on non-UTC hosts (`pr#39296 <https://github.com/ceph/ceph/pull/39296>`_, Sage Weil)
-* octopus: qa/cephadm: Add yaml output to smoke test (`pr#39168 <https://github.com/ceph/ceph/pull/39168>`_, Sebastian Wagner)
-* octopus: qa/mgr: mgr_test_case: raise SkipTest instead of calling skipTest() (`pr#38165 <https://github.com/ceph/ceph/pull/38165>`_, Rishabh Dave)
-* octopus: qa/tasks/cephfs/nfs: Check if host ip is in cluster info output (`pr#39004 <https://github.com/ceph/ceph/pull/39004>`_, Varsha Rao)
-* octopus: qa/tasks/mgr/test_progress: update test suite to check for specific progress events (`pr#38555 <https://github.com/ceph/ceph/pull/38555>`_, Kamoltat)
-* octopus: qa/tasks/vstart_runner: do not teardown test_path if "create-cluster-only" (`pr#39540 <https://github.com/ceph/ceph/pull/39540>`_, Kefu Chai)
-* octopus: qa/workunits/rbd: fix permission issue when removing mirror peer (`pr#38341 <https://github.com/ceph/ceph/pull/38341>`_, Jason Dillaman)
-* octopus: qa: accept timeout argument in run_shell (`pr#38550 <https://github.com/ceph/ceph/pull/38550>`_, Patrick Donnelly)
-* octopus: qa: ignore evicted client warnings (`pr#38422 <https://github.com/ceph/ceph/pull/38422>`_, Patrick Donnelly)
-* octopus: qa: ignore logrotate state rename error (`pr#37690 <https://github.com/ceph/ceph/pull/37690>`_, Patrick Donnelly)
-* octopus: qa: krbd_stable_pages_required.sh: move to stable_writes attribute (`pr#39321 <https://github.com/ceph/ceph/pull/39321>`_, Ilya Dryomov)
-* octopus: qa: tox failures (`pr#38626 <https://github.com/ceph/ceph/pull/38626>`_, Patrick Donnelly)
-* octopus: qa: unmount volumes before removal (`pr#38688 <https://github.com/ceph/ceph/pull/38688>`_, Patrick Donnelly)
-* octopus: rgw/multisite: Verify if the synced object is identical to source (`pr#38981 <https://github.com/ceph/ceph/pull/38981>`_, Prasad Krishnan, Casey Bodley)
-* octopus: rgw/rgw-admin: fixes BucketInfo for missing buckets (`pr#38184 <https://github.com/ceph/ceph/pull/38184>`_, Nick Janus, caolei)
-* octopus: rgw: S3 Put Bucket Policy should return 204 on success (`pr#38420 <https://github.com/ceph/ceph/pull/38420>`_, Matthew Oliver)
-* octopus: rgw: adding user related web token claims to ops log (`pr#38970 <https://github.com/ceph/ceph/pull/38970>`_, Pritha Srivastava)
-* octopus: rgw: avoid expiration early triggering caused by overflow (`pr#38421 <https://github.com/ceph/ceph/pull/38421>`_, jiahuizeng)
-* octopus: rgw: cls/rgw/cls_rgw.cc: fix multiple lastest version problem (`pr#38086 <https://github.com/ceph/ceph/pull/38086>`_, Yang Honggang, Ruan Zitao)
-* octopus: rgw: cls/user: set from_index for reset stats calls (`pr#38821 <https://github.com/ceph/ceph/pull/38821>`_, Mykola Golub, Abhishek Lekshmanan)
-* octopus: rgw: distribute cache for exclusive put (`pr#38971 <https://github.com/ceph/ceph/pull/38971>`_, Or Friedmann)
-* octopus: rgw: fix bucket limit check fill_status warnings (`issue#40255 <http://tracker.ceph.com/issues/40255>`_, `pr#38826 <https://github.com/ceph/ceph/pull/38826>`_, Paul Emmerich)
-* octopus: rgw: fix invalid payload issue when serving s3website error page (`pr#38339 <https://github.com/ceph/ceph/pull/38339>`_, Ilsoo Byun)
-* octopus: rgw: keep syncstopped flag when copying bucket shard headers (`pr#38338 <https://github.com/ceph/ceph/pull/38338>`_, Ilsoo Byun)
-* octopus: rgw: lc: correctly dimension lc shard index vector (`pr#38824 <https://github.com/ceph/ceph/pull/38824>`_, Matt Benjamin)
-* octopus: rgw_file: return common_prefixes in lexical order (`pr#38829 <https://github.com/ceph/ceph/pull/38829>`_, Matt Benjamin)
-* octopus: rpm,deb: change sudoers file mode to 440 (`pr#38427 <https://github.com/ceph/ceph/pull/38427>`_, David Turner)
-* octopus: rpm: require smartmontools on SUSE (`pr#38755 <https://github.com/ceph/ceph/pull/38755>`_, Nathan Cutler)
-* octopus: test/run-cli-tests: use cram from github (`pr#39071 <https://github.com/ceph/ceph/pull/39071>`_, Kefu Chai)
-* octopus: tests: qa/task/cephadm: run cephadm only on bootstrap_remote (`pr#38040 <https://github.com/ceph/ceph/pull/38040>`_, Kyr Shatskyy)
-
-v15.2.8 Octopus
-===============
-
-This is the 8th backport release in the Octopus series. This release fixes
-a security flaw in CephFS and includes a number of bug fixes. We recommend
-users to update to this release.
-
-Notable Changes
----------------
-
-* CVE-2020-27781 : OpenStack Manila use of ceph_volume_client.py library allowed
-  tenant access to any Ceph credential's secret. (Kotresh Hiremath Ravishankar,
-  Ramana Raja)
-
-* ceph-volume: The ``lvm batch`` subcommand received a major rewrite. This closed
-  a number of bugs and improves usability in terms of size specification and
-  calculation, as well as idempotency behaviour and disk replacement process.
-  Please refer to https://docs.ceph.com/en/latest/ceph-volume/lvm/batch/ for
-  more detailed information.
-
-* MON: The cluster log now logs health detail every ``mon_health_to_clog_interval``,
-  which has been changed from 1hr to 10min. Logging of health detail will be
-  skipped if there is no change in health summary since last known.
-
-* The ``ceph df`` command now lists the number of pgs in each pool.
-
-* The ``bluefs_preextend_wal_files`` option has been removed.
-
-* It is now possible to specify the initial monitor to contact for Ceph tools
-  and daemons using the ``mon_host_override`` config option or
-  ``--mon-host-override <ip>`` command-line switch. This generally should only
-  be used for debugging and only affects initial communication with Ceph's
-  monitor cluster.
-
-
-Changelog
----------
-
-* pybind/ceph_volume_client: disallow authorize on existing auth ids (Kotresh
-  Hiremath Ravishankar, Ramana Raja)
-* Enable per-RBD image monitoring (`pr#37697 <https://github.com/ceph/ceph/pull/37697>`_, Patrick Seidensal)
-* [ceph-volume]: remove unneeded call to get_devices() (`pr#37412 <https://github.com/ceph/ceph/pull/37412>`_, Marc Gariepy)
-* bluestore: fix collection_list ordering (`pr#37048 <https://github.com/ceph/ceph/pull/37048>`_, Mykola Golub)
-* bluestore: mempool's finer granularity + adding missed structs (`pr#37264 <https://github.com/ceph/ceph/pull/37264>`_, Deepika Upadhyay, Igor Fedotov, Adam Kupczyk)
-* bluestore: remove preextended WAL support (`pr#37373 <https://github.com/ceph/ceph/pull/37373>`_, Igor Fedotov)
-* ceph-volume batch: reject partitions in argparser (`pr#38280 <https://github.com/ceph/ceph/pull/38280>`_, Jan Fajerski)
-* ceph-volume inventory: make libstoragemgmt data retrieval optional (`pr#38299 <https://github.com/ceph/ceph/pull/38299>`_, Jan Fajerski)
-* ceph-volume: add libstoragemgmt support (`pr#36852 <https://github.com/ceph/ceph/pull/36852>`_, Paul Cuzner, Satoru Takeuchi)
-* ceph-volume: add no-systemd argument to zap (`pr#37722 <https://github.com/ceph/ceph/pull/37722>`_, wanghongxu)
-* ceph-volume: avoid format strings for now (`pr#37345 <https://github.com/ceph/ceph/pull/37345>`_, Jan Fajerski)
-* ceph-volume: consume mount opt in simple activate (`pr#38014 <https://github.com/ceph/ceph/pull/38014>`_, Dimitri Savineau)
-* ceph-volume: fix filestore/dmcrypt activate (`pr#38199 <https://github.com/ceph/ceph/pull/38199>`_, Guillaume Abrioux)
-* ceph-volume: fix journal size argument not work (`pr#37344 <https://github.com/ceph/ceph/pull/37344>`_, wanghongxu)
-* ceph-volume: fix lvm batch auto with full SSDs (`pr#38045 <https://github.com/ceph/ceph/pull/38045>`_, Dimitri Savineau, Guillaume Abrioux)
-* ceph-volume: fix simple activate when legacy osd (`pr#37194 <https://github.com/ceph/ceph/pull/37194>`_, Guillaume Abrioux)
-* ceph-volume: implement the --log-level flag (`pr#38426 <https://github.com/ceph/ceph/pull/38426>`_, Andrew Schoen)
-* ceph-volume: major batch refactor (`pr#37520 <https://github.com/ceph/ceph/pull/37520>`_, Jan Fajerski, Joshua Schmid)
-* ceph-volume: prepare: use \*-slots arguments for implicit sizing (`pr#38205 <https://github.com/ceph/ceph/pull/38205>`_, Jan Fajerski)
-* ceph-volume: remove mention of dmcache from docs and help text (`pr#38047 <https://github.com/ceph/ceph/pull/38047>`_, Dimitri Savineau, Andrew Schoen)
-* ceph-volume: retry when acquiring lock fails (`pr#36925 <https://github.com/ceph/ceph/pull/36925>`_, Sébastien Han)
-* ceph-volume: simple scan should ignore tmpfs (`pr#36953 <https://github.com/ceph/ceph/pull/36953>`_, Andrew Schoen)
-* ceph-volume: support for mpath devices (`pr#36928 <https://github.com/ceph/ceph/pull/36928>`_, Jan Fajerski)
-* ceph.in: ignore failures to flush stdout (`pr#37225 <https://github.com/ceph/ceph/pull/37225>`_, Dan van der Ster)
-* ceph.spec, debian: add smartmontools, nvme-cli dependencies (`pr#37257 <https://github.com/ceph/ceph/pull/37257>`_, Yaarit Hatuka)
-* cephadm batch backport November (`pr#38155 <https://github.com/ceph/ceph/pull/38155>`_, Ricardo Marques, Sebastian Wagner, Kyr Shatskyy, Dan Williams, Volker Theile, Varsha Rao, Tim Serong, Adam King, Dimitri Savineau, Patrick Seidensal, Dan Mick, Michael Fritch, Joshua Schmid)
-* cephadm batch backport September (1) (`pr#36975 <https://github.com/ceph/ceph/pull/36975>`_, Stephan Müller, Matthew Oliver, Sebastian Wagner, Paul Cuzner, Adam King, Patrick Seidensal, Shraddha Agrawal, Michael Fritch, Dan Mick)
-* cephadm batch backport September (2) (`pr#37436 <https://github.com/ceph/ceph/pull/37436>`_, Varsha Rao, Kiefer Chang, Patrick Donnelly, Sebastian Wagner, Kefu Chai, Guillaume Abrioux, Juan Miguel Olmo Martínez, Paul Cuzner, Volker Theile, Tim Serong, Zac Dover, Adam King, Michael Fritch, Joshua Schmid)
-* cephfs-journal-tool: fix incorrect read_offset when finding missing objects (`pr#37854 <https://github.com/ceph/ceph/pull/37854>`_, Xue Yantao)
-* cephfs: client: fix directory inode can not call release callback (`pr#37017 <https://github.com/ceph/ceph/pull/37017>`_, sepia-liu)
-* cephfs: client: fix extra open ref decrease (`pr#37249 <https://github.com/ceph/ceph/pull/37249>`_, Xiubo Li)
-* cephfs: client: fix inode ll_ref reference count leak (`pr#37839 <https://github.com/ceph/ceph/pull/37839>`_, sepia-liu)
-* cephfs: client: handle readdir reply without Fs cap (`pr#37370 <https://github.com/ceph/ceph/pull/37370>`_, "Yan, Zheng")
-* cephfs: client: make Client::open() pass proper cap mask to path_walk (`pr#37369 <https://github.com/ceph/ceph/pull/37369>`_, "Yan, Zheng")
-* cephfs: client: use non-static dirent for thread-safety (`pr#37351 <https://github.com/ceph/ceph/pull/37351>`_, Patrick Donnelly)
-* cephfs: libcephfs: ignore restoring the open files limit (`pr#37358 <https://github.com/ceph/ceph/pull/37358>`_, Xiubo Li)
-* cephfs: osdc/Journaler: do not call onsafe->complete() if onsafe is 0 (`pr#37368 <https://github.com/ceph/ceph/pull/37368>`_, Xiubo Li)
-* common/admin_socket: always validate the parameters (`pr#37341 <https://github.com/ceph/ceph/pull/37341>`_, Kefu Chai)
-* compressor: Add a config option to specify Zstd compression level (`pr#37253 <https://github.com/ceph/ceph/pull/37253>`_, Bryan Stillwell)
-* core: include/encoding: Fix encode/decode of float types on big-endian systems (`pr#37032 <https://github.com/ceph/ceph/pull/37032>`_, Ulrich Weigand)
-* debian: Add missing Python dependency for ceph-mgr (`pr#37422 <https://github.com/ceph/ceph/pull/37422>`_, Johannes M. Scheuermann)
-* doc/PendingReleaseNotes: mention bluefs_preextend_wal_files (`pr#37549 <https://github.com/ceph/ceph/pull/37549>`_, Nathan Cutler)
-* doc/mgr/orchestrator: Add hints related to custom containers to the docs (`pr#37962 <https://github.com/ceph/ceph/pull/37962>`_, Volker Theile)
-* doc: cephfs: improve documentation of "ceph nfs cluster create" and "ceph fs volume create" commands (`pr#37691 <https://github.com/ceph/ceph/pull/37691>`_, Nathan Cutler)
-* doc: enable Read the Docs (`pr#37201 <https://github.com/ceph/ceph/pull/37201>`_, Kefu Chai)
-* erasure-code: enable isa-l EC for aarch64 platform (`pr#37504 <https://github.com/ceph/ceph/pull/37504>`_, luo rixin, Hang Li)
-* krbd: optionally skip waiting for udev events (`pr#37285 <https://github.com/ceph/ceph/pull/37285>`_, Ilya Dryomov)
-* librbd: ensure that thread pool lock is held when processing throttled IOs (`pr#37116 <https://github.com/ceph/ceph/pull/37116>`_, Jason Dillaman)
-* librbd: handle DNE from immutable-object-cache (`pr#36860 <https://github.com/ceph/ceph/pull/36860>`_, Feng Hualong, Mykola Golub, Yin Congmin, Jason Dillaman)
-* librbd: using migration abort can result in the loss of data (`pr#37164 <https://github.com/ceph/ceph/pull/37164>`_, Jason Dillaman)
-* mds/CInode: Optimize only pinned by subtrees check (`pr#37248 <https://github.com/ceph/ceph/pull/37248>`_, Mark Nelson)
-* mds: account for closing sessions in hit_session (`pr#37856 <https://github.com/ceph/ceph/pull/37856>`_, Dan van der Ster)
-* mds: add request to batch_op before taking auth pins and locks (`pr#37022 <https://github.com/ceph/ceph/pull/37022>`_, "Yan, Zheng")
-* mds: do not raise "client failing to respond to cap release" when client working set is reasonable (`pr#37353 <https://github.com/ceph/ceph/pull/37353>`_, Patrick Donnelly)
-* mds: do not submit omap_rm_keys if the dir is the basedir of merge (`pr#37034 <https://github.com/ceph/ceph/pull/37034>`_, "Yan, Zheng", Chencan)
-* mds: don't recover files after normal session close (`pr#37334 <https://github.com/ceph/ceph/pull/37334>`_, "Yan, Zheng")
-* mds: fix 'forward loop' when forward_all_requests_to_auth is set (`pr#37360 <https://github.com/ceph/ceph/pull/37360>`_, "Yan, Zheng")
-* mds: fix hang issue when accessing a file under a lost parent directory (`pr#37020 <https://github.com/ceph/ceph/pull/37020>`_, Zhi Zhang)
-* mds: fix kcephfs parse dirfrag's ndist is always 0 (`pr#37357 <https://github.com/ceph/ceph/pull/37357>`_, Yanhu Cao)
-* mds: fix mds forwarding request 'no_available_op_found' (`pr#37240 <https://github.com/ceph/ceph/pull/37240>`_, Yanhu Cao)
-* mds: fix nullptr dereference in MDCache::finish_rollback (`pr#37243 <https://github.com/ceph/ceph/pull/37243>`_, "Yan, Zheng")
-* mds: fix purge_queue's _calculate_ops is inaccurate (`pr#37372 <https://github.com/ceph/ceph/pull/37372>`_, Yanhu Cao)
-* mds: make threshold for MDS_TRIM configurable (`pr#36970 <https://github.com/ceph/ceph/pull/36970>`_, Paul Emmerich)
-* mds: optimize random threshold lookup for dentry load (`pr#37247 <https://github.com/ceph/ceph/pull/37247>`_, Patrick Donnelly)
-* mds: place MDSGatherBuilder on the stack (`pr#37354 <https://github.com/ceph/ceph/pull/37354>`_, Patrick Donnelly)
-* mds: reduce memory usage of open file table prefetch #37382 (`pr#37383 <https://github.com/ceph/ceph/pull/37383>`_, "Yan, Zheng")
-* mds: resolve SIGSEGV in waiting for uncommitted fragments (`pr#37355 <https://github.com/ceph/ceph/pull/37355>`_, Patrick Donnelly)
-* mds: revert the decode version (`pr#37356 <https://github.com/ceph/ceph/pull/37356>`_, Jos Collin)
-* mds: send scrub status to ceph-mgr only when scrub is running (`issue#45349 <http://tracker.ceph.com/issues/45349>`_, `pr#36047 <https://github.com/ceph/ceph/pull/36047>`_, Kefu Chai, Venky Shankar)
-* mds: standy-replay mds remained in the "resolve" state after resta… (`pr#37363 <https://github.com/ceph/ceph/pull/37363>`_, Wei Qiaomiao)
-* messages,mds: Fix decoding of enum types on big-endian systems (`pr#36813 <https://github.com/ceph/ceph/pull/36813>`_, Ulrich Weigand)
-* mgr/dashboard/api: move/create OSD histogram in separate endpoint (`pr#37973 <https://github.com/ceph/ceph/pull/37973>`_, Aashish Sharma)
-* mgr/dashboard: Add short descriptions to the telemetry report preview (`pr#37597 <https://github.com/ceph/ceph/pull/37597>`_, Nizamudeen A)
-* mgr/dashboard: Allow editing iSCSI targets with initiators logged-in (`pr#37277 <https://github.com/ceph/ceph/pull/37277>`_, Tiago Melo)
-* mgr/dashboard: Auto close table column dropdown on click outside (`pr#36862 <https://github.com/ceph/ceph/pull/36862>`_, Tiago Melo)
-* mgr/dashboard: Copy to clipboard does not work in Firefox (`pr#37493 <https://github.com/ceph/ceph/pull/37493>`_, Volker Theile)
-* mgr/dashboard: Datatable catches select events from other datatables (`pr#36899 <https://github.com/ceph/ceph/pull/36899>`_, Volker Theile, Tiago Melo)
-* mgr/dashboard: Disable TLS 1.0 and 1.1 (`pr#38331 <https://github.com/ceph/ceph/pull/38331>`_, Volker Theile)
-* mgr/dashboard: Disable autocomplete on user form (`pr#36901 <https://github.com/ceph/ceph/pull/36901>`_, Volker Theile)
-* mgr/dashboard: Disable sso without python3-saml (`pr#38405 <https://github.com/ceph/ceph/pull/38405>`_, Kevin Meijer)
-* mgr/dashboard: Disabling the form inputs for the read_only modals (`pr#37239 <https://github.com/ceph/ceph/pull/37239>`_, Nizamudeen)
-* mgr/dashboard: Fix bugs in a unit test and i18n translation (`pr#36991 <https://github.com/ceph/ceph/pull/36991>`_, Volker Theile)
-* mgr/dashboard: Fix for CrushMap viewer items getting compressed vertically (`pr#36871 <https://github.com/ceph/ceph/pull/36871>`_, Nizamudeen A)
-* mgr/dashboard: Fix many-to-many issue in host-details Grafana dashboard (`pr#37299 <https://github.com/ceph/ceph/pull/37299>`_, Patrick Seidensal)
-* mgr/dashboard: Fix npm package's vulnerabilities (`pr#36921 <https://github.com/ceph/ceph/pull/36921>`_, Tiago Melo)
-* mgr/dashboard: Hide table action input field if limit=0 (`pr#36872 <https://github.com/ceph/ceph/pull/36872>`_, Volker Theile)
-* mgr/dashboard: Host delete action should be disabled if not managed by Orchestrator (`pr#36874 <https://github.com/ceph/ceph/pull/36874>`_, Volker Theile)
-* mgr/dashboard: Improve notification badge (`pr#37090 <https://github.com/ceph/ceph/pull/37090>`_, Aashish Sharma)
-* mgr/dashboard: Landing Page improvements (`pr#37390 <https://github.com/ceph/ceph/pull/37390>`_, Tiago Melo, Alfonso Martínez)
-* mgr/dashboard: Merge disable and disableDesc (`pr#37763 <https://github.com/ceph/ceph/pull/37763>`_, Tiago Melo)
-* mgr/dashboard: Proper format iSCSI target portals (`pr#36870 <https://github.com/ceph/ceph/pull/36870>`_, Volker Theile)
-* mgr/dashboard: REST API returns 500 when no Content-Type is specified (`pr#37308 <https://github.com/ceph/ceph/pull/37308>`_, Avan Thakkar)
-* mgr/dashboard: Remove useless tab in monitoring/alerts datatable details (`pr#36875 <https://github.com/ceph/ceph/pull/36875>`_, Volker Theile)
-* mgr/dashboard: Show warning when replicated size is 1 (`pr#37578 <https://github.com/ceph/ceph/pull/37578>`_, Sebastian Krah)
-* mgr/dashboard: The performance 'Client Read/Write' widget shows incorrect write values (`pr#38189 <https://github.com/ceph/ceph/pull/38189>`_, Volker Theile)
-* mgr/dashboard: Update datatable only when necessary (`pr#37331 <https://github.com/ceph/ceph/pull/37331>`_, Volker Theile)
-* mgr/dashboard: Use pipe instead of calling function within template (`pr#38094 <https://github.com/ceph/ceph/pull/38094>`_, Volker Theile)
-* mgr/dashboard: cluster > manager modules (`pr#37434 <https://github.com/ceph/ceph/pull/37434>`_, Avan Thakkar)
-* mgr/dashboard: display devices' health information within a tabset (`pr#37784 <https://github.com/ceph/ceph/pull/37784>`_, Kiefer Chang)
-* mgr/dashboard: fix error when typing existing paths in the Ganesha form (`pr#37688 <https://github.com/ceph/ceph/pull/37688>`_, Kiefer Chang)
-* mgr/dashboard: fix perf. issue when listing large amounts of buckets (`pr#37405 <https://github.com/ceph/ceph/pull/37405>`_, Alfonso Martínez)
-* mgr/dashboard: fix security scopes of some NFS-Ganesha endpoints (`pr#37450 <https://github.com/ceph/ceph/pull/37450>`_, Kiefer Chang)
-* mgr/dashboard: fix the error when exporting CephFS path "/" in NFS exports (`pr#37686 <https://github.com/ceph/ceph/pull/37686>`_, Kiefer Chang)
-* mgr/dashboard: get rgw daemon zonegroup name from mgr (`pr#37620 <https://github.com/ceph/ceph/pull/37620>`_, Alfonso Martinez)
-* mgr/dashboard: increase Grafana iframe height to avoid scroll bar (`pr#37182 <https://github.com/ceph/ceph/pull/37182>`_, Ngwa Sedrick Meh)
-* mgr/dashboard: log in non-admin users successfully if the telemetry notification is shown (`pr#37452 <https://github.com/ceph/ceph/pull/37452>`_, Tatjana Dehler)
-* mgr/dashboard: support Orchestrator and user-defined Ganesha cluster (`pr#37885 <https://github.com/ceph/ceph/pull/37885>`_, Kiefer Chang)
-* mgr/dashboard: table detail rows overflow (`pr#37332 <https://github.com/ceph/ceph/pull/37332>`_, Aashish Sharma)
-* mgr/devicehealth: device_health_metrics pool gets created even without any OSDs in the cluster (`pr#37533 <https://github.com/ceph/ceph/pull/37533>`_, Sunny Kumar)
-* mgr/insights: Test environment requires 'six' (`pr#38396 <https://github.com/ceph/ceph/pull/38396>`_, Brad Hubbard)
-* mgr/prometheus: add pool compression stats (`pr#37562 <https://github.com/ceph/ceph/pull/37562>`_, Paul Cuzner)
-* mgr/telemetry: fix device id splitting when anonymizing serial (`pr#37302 <https://github.com/ceph/ceph/pull/37302>`_, Yaarit Hatuka)
-* mgr/volumes/nfs: Check if orchestrator spec service_id is valid (`pr#37371 <https://github.com/ceph/ceph/pull/37371>`_, Varsha Rao)
-* mgr/volumes/nfs: Fix wrong error message for pseudo path (`pr#37855 <https://github.com/ceph/ceph/pull/37855>`_, Varsha Rao)
-* mgr/volumes: Make number of cloner threads configurable (`pr#37671 <https://github.com/ceph/ceph/pull/37671>`_, Kotresh HR)
-* mgr/zabbix: indent the output of "zabbix config-show" (`pr#37128 <https://github.com/ceph/ceph/pull/37128>`_, Kefu Chai)
-* mgr: PyModuleRegistry::unregister_client() can run endlessly (`issue#47329 <http://tracker.ceph.com/issues/47329>`_, `pr#37217 <https://github.com/ceph/ceph/pull/37217>`_, Venky Shankar)
-* mgr: don't update pending service map epoch on receiving map from mon (`pr#37180 <https://github.com/ceph/ceph/pull/37180>`_, Mykola Golub)
-* mon scrub testing (`pr#38361 <https://github.com/ceph/ceph/pull/38361>`_, Brad Hubbard)
-* mon/MDSMonitor do not ignore mds's down:dne request (`pr#37858 <https://github.com/ceph/ceph/pull/37858>`_, chencan)
-* mon/MDSMonitor: divide mds identifier and mds real name with dot (`pr#37857 <https://github.com/ceph/ceph/pull/37857>`_, Zhi Zhang)
-* mon/MonMap: fix unconditional failure for init_with_hosts (`pr#37817 <https://github.com/ceph/ceph/pull/37817>`_, Nathan Cutler, Patrick Donnelly)
-* mon/PGMap: add pg count for pools in the ceph df command (`pr#36945 <https://github.com/ceph/ceph/pull/36945>`_, Vikhyat Umrao)
-* mon: Log "ceph health detail" periodically in cluster log (`pr#38345 <https://github.com/ceph/ceph/pull/38345>`_, Prashant Dhange)
-* mon: deleting a CephFS and its pools causes MONs to crash (`pr#37256 <https://github.com/ceph/ceph/pull/37256>`_, Patrick Donnelly)
-* mon: have 'mon stat' output json as well (`pr#37705 <https://github.com/ceph/ceph/pull/37705>`_, Joao Eduardo Luis)
-* mon: mark pgtemp messages as no_reply more consistenly in preprocess\_… (`pr#37347 <https://github.com/ceph/ceph/pull/37347>`_, Greg Farnum)
-* mon: set session_timeout when adding to session_map (`pr#37553 <https://github.com/ceph/ceph/pull/37553>`_, Ilya Dryomov)
-* mon: store mon updates in ceph context for future MonMap instantiation (`pr#36705 <https://github.com/ceph/ceph/pull/36705>`_, Patrick Donnelly, Shyamsundar Ranganathan)
-* msg/async/ProtocolV2: allow rxbuf/txbuf get bigger in testing (`pr#37080 <https://github.com/ceph/ceph/pull/37080>`_, Ilya Dryomov)
-* os/bluestore: enable more flexible bluefs space management by default (`pr#37092 <https://github.com/ceph/ceph/pull/37092>`_, Igor Fedotov)
-* osd/osd-rep-recov-eio.sh: TEST_rados_repair_warning:  return 1 (`pr#37853 <https://github.com/ceph/ceph/pull/37853>`_, David Zafman)
-* osd: Check for nosrub/nodeep-scrub in between chunks, to avoid races (`pr#38359 <https://github.com/ceph/ceph/pull/38359>`_, David Zafman)
-* osdc/ObjectCacher: overwrite might cause stray read request callbacks (`pr#37674 <https://github.com/ceph/ceph/pull/37674>`_, Jason Dillaman)
-* osdc: add timeout configs for mons/osds (`pr#37530 <https://github.com/ceph/ceph/pull/37530>`_, Patrick Donnelly)
-* prometheus: Properly split the port off IPv6 addresses (`pr#36985 <https://github.com/ceph/ceph/pull/36985>`_, Matthew Oliver)
-* pybind/cephfs: add special values for not reading conffile (`pr#37724 <https://github.com/ceph/ceph/pull/37724>`_, Kefu Chai)
-* pybind/cephfs: fix custom exception raised by cephfs.pyx (`pr#37350 <https://github.com/ceph/ceph/pull/37350>`_, Ramana Raja)
-* pybind/mgr/volumes: add global lock debug (`pr#37366 <https://github.com/ceph/ceph/pull/37366>`_, Patrick Donnelly)
-* qa/\*/mon/mon-last-epoch-clean.sh: mark osd out instead of down (`pr#37349 <https://github.com/ceph/ceph/pull/37349>`_, Neha Ojha)
-* qa/cephfs: add session_timeout option support (`pr#37841 <https://github.com/ceph/ceph/pull/37841>`_, Xiubo Li)
-* qa/tasks/nfs: Test mounting of export created with nfs command (`pr#37365 <https://github.com/ceph/ceph/pull/37365>`_, Varsha Rao)
-* qa/tasks/{ceph,ceph_manager}: drop py2 support (`pr#37863 <https://github.com/ceph/ceph/pull/37863>`_, Kefu Chai)
-* qa/tests: added rhel 8.2 (`pr#38287 <https://github.com/ceph/ceph/pull/38287>`_, Yuri Weinstein)
-* qa/tests: use bionic only for old clients in rados/thrash-old-clients (`pr#36931 <https://github.com/ceph/ceph/pull/36931>`_, Yuri Weinstein)
-* qa/workunits/mon: fixed excessively large pool PG count (`pr#37346 <https://github.com/ceph/ceph/pull/37346>`_, Jason Dillaman)
-* qa: Enable debug_client for mgr tests (`pr#37270 <https://github.com/ceph/ceph/pull/37270>`_, Brad Hubbard)
-* qa: Fix traceback during fs cleanup between tests (`pr#36713 <https://github.com/ceph/ceph/pull/36713>`_, Kotresh HR)
-* qa: add debugging for volumes plugin use of libcephfs (`pr#37352 <https://github.com/ceph/ceph/pull/37352>`_, Patrick Donnelly)
-* qa: drop hammer branch qa tests (`pr#37728 <https://github.com/ceph/ceph/pull/37728>`_, Neha Ojha, Deepika Upadhyay)
-* qa: ignore expected mds failover message (`pr#37367 <https://github.com/ceph/ceph/pull/37367>`_, Patrick Donnelly)
-* rbd-mirror: peer setup can still race and fail creation of peer (`pr#37342 <https://github.com/ceph/ceph/pull/37342>`_, Jason Dillaman)
-* rbd: include RADOS namespace in krbd symlinks (`pr#37343 <https://github.com/ceph/ceph/pull/37343>`_, Ilya Dryomov)
-* rbd: journal: possible race condition between flush and append callback (`pr#37850 <https://github.com/ceph/ceph/pull/37850>`_, Jason Dillaman)
-* rbd: librbd: ignore -ENOENT error when disabling object-map (`pr#37852 <https://github.com/ceph/ceph/pull/37852>`_, Jason Dillaman)
-* rbd: librbd: update AioCompletion return value before evaluating pending count (`pr#37851 <https://github.com/ceph/ceph/pull/37851>`_, Jason Dillaman)
-* rbd: make common options override krbd-specific options (`pr#37408 <https://github.com/ceph/ceph/pull/37408>`_, Ilya Dryomov)
-* rbd: rbd-nbd: don't ignore namespace when unmapping by image spec (`pr#37812 <https://github.com/ceph/ceph/pull/37812>`_, Mykola Golub)
-* rgw/gc: fix for incrementing the perf counter 'gc_retire_object' (`pr#37847 <https://github.com/ceph/ceph/pull/37847>`_, Pritha Srivastava)
-* rgw/gc: fixing the condition when marker for a queue is (`pr#37846 <https://github.com/ceph/ceph/pull/37846>`_, Pritha Srivastava)
-* rgw/rgw_file: Fix the incorrect lru object eviction (`pr#37672 <https://github.com/ceph/ceph/pull/37672>`_, luo rixin)
-* rgw: Add bucket name to bucket stats error logging (`pr#37335 <https://github.com/ceph/ceph/pull/37335>`_, Seena Fallah)
-* rgw: Add request timeout to beast (`pr#37809 <https://github.com/ceph/ceph/pull/37809>`_, Adam C. Emerson, Or Friedmann)
-* rgw: RGWObjVersionTracker tracks version over increments (`pr#37337 <https://github.com/ceph/ceph/pull/37337>`_, Casey Bodley)
-* rgw: Swift API anonymous access should 401 (`pr#37339 <https://github.com/ceph/ceph/pull/37339>`_, Matthew Oliver)
-* rgw: adds code for creating and managing oidc provider entities in rgw and for offline validation of OpenID Connect Access and ID Token (`pr#37640 <https://github.com/ceph/ceph/pull/37640>`_, Pritha Srivastava, Casey Bodley)
-* rgw: allow rgw-orphan-list to note when rados objects are in namespace (`pr#37800 <https://github.com/ceph/ceph/pull/37800>`_, J. Eric Ivancich)
-* rgw: dump transitions in RGWLifecycleConfiguration::dump() (`pr#36812 <https://github.com/ceph/ceph/pull/36812>`_, Shengming Zhang)
-* rgw: during GC defer, prevent new GC enqueue (`pr#38249 <https://github.com/ceph/ceph/pull/38249>`_, Casey Bodley, J. Eric Ivancich)
-* rgw: fix expiration header returned even if there is only one tag in the object the same as the rule (`pr#37807 <https://github.com/ceph/ceph/pull/37807>`_, Or Friedmann)
-* rgw: fix setting of namespace in ordered and unordered bucket listing (`pr#37673 <https://github.com/ceph/ceph/pull/37673>`_, J. Eric Ivancich)
-* rgw: fix user stats iterative increment (`pr#37779 <https://github.com/ceph/ceph/pull/37779>`_, Mark Kogan)
-* rgw: fix: S3 API KeyCount incorrect return (`pr#37849 <https://github.com/ceph/ceph/pull/37849>`_, 胡玮文)
-* rgw: log resharding events at level 1 (formerly 20) (`pr#36840 <https://github.com/ceph/ceph/pull/36840>`_, Or Friedmann)
-* rgw: radosgw-admin should paginate internally when listing bucket (`pr#37803 <https://github.com/ceph/ceph/pull/37803>`_, J. Eric Ivancich)
-* rgw: radosgw-admin: period pull command is not always a raw_storage_op (`pr#37336 <https://github.com/ceph/ceph/pull/37336>`_, Casey Bodley)
-* rgw: replace '+' with "%20" in canonical query string for s3 v4 auth (`pr#37338 <https://github.com/ceph/ceph/pull/37338>`_, yuliyang_yewu)
-* rgw: rgw_file: avoid long-ish delay on shutdown (`pr#37551 <https://github.com/ceph/ceph/pull/37551>`_, Matt Benjamin)
-* rgw: s3: mark bucket encryption as not implemented (`pr#36691 <https://github.com/ceph/ceph/pull/36691>`_, Abhishek Lekshmanan)
-* rgw: urlencode bucket name when forwarding request (`pr#37340 <https://github.com/ceph/ceph/pull/37340>`_, caolei)
-* rgw: use yum rather than dnf for teuthology testing of rgw-orphan-list (`pr#37845 <https://github.com/ceph/ceph/pull/37845>`_, J. Eric Ivancich)
-* rpm,deb: drop /etc/sudoers.d/cephadm (`pr#37401 <https://github.com/ceph/ceph/pull/37401>`_, Nathan Cutler)
-* run-make-check.sh: Don't run tests if build fails (`pr#38294 <https://github.com/ceph/ceph/pull/38294>`_, Brad Hubbard)
-* systemd: Support Graceful Reboot for AIO Node (`pr#37300 <https://github.com/ceph/ceph/pull/37300>`_, Wong Hoi Sing Edison)
-* test/librados: fix endian bugs in checksum test cases (`pr#37604 <https://github.com/ceph/ceph/pull/37604>`_, Ulrich Weigand)
-* test/rbd-mirror: pool watcher registration error might result in race (`pr#37208 <https://github.com/ceph/ceph/pull/37208>`_, Jason Dillaman)
-* test/store_test: use 'threadsafe' style for death tests (`pr#37819 <https://github.com/ceph/ceph/pull/37819>`_, Igor Fedotov)
-* tools/osdmaptool.cc: add ability to clean_temps (`pr#37348 <https://github.com/ceph/ceph/pull/37348>`_, Neha Ojha)
-* tools/rados: flush formatter periodically during json output of "rados ls" (`pr#37835 <https://github.com/ceph/ceph/pull/37835>`_, J. Eric Ivancich)
-* vstart.sh: fix fs set max_mds bug (`pr#37837 <https://github.com/ceph/ceph/pull/37837>`_, Jinmyeong Lee)
-
-
-v15.2.7 Octopus
-===============
-
-This is the 7th backport release in the Octopus series. This release fixes
-a serious bug in RGW that has been shown to cause data loss when a read of
-a large RGW object (i.e., one with at least one tail segment) takes longer than
-one half the time specified in the configuration option ``rgw_gc_obj_min_wait``.
-The bug causes the tail segments of that read object to be added to the RGW
-garbage collection queue, which will in turn cause them to be deleted after
-a period of time.
-
-Changelog
----------
-
-* rgw: during GC defer, prevent new GC enqueue (`issue#47866 <https://tracker.ceph.com/issues/47866>`_, `pr#38249 <https://github.com/ceph/ceph/pull/38249>`_, Eric Ivancich, Casey Bodley)
-
-
-v15.2.6 Octopus
-===============
-
-This is the 6th backport release in the Octopus series. This release fixes
-a security flaw affecting Messenger v1 & v2. We recommend users to update to
-this release.
-
-Notable Changes
----------------
-
-* CVE 2020-25660: CEPHX_V2 replay attack protection lost, for Messenger v1 & v2 (Ilya Dryomov)
-
-Changelog
----------
-
-* mon/MonClient: bring back CEPHX_V2 authorizer challenges (Ilya Dryomov)
-
-
-v15.2.5 Octopus
-===============
-
-This is the fifth release of the Ceph Octopus stable release series. This
-release brings a range of fixes across all components. We recommend that all
-Octopus users upgrade to this release.
-
-Notable Changes
----------------
-
-* CephFS: Automatic static subtree partitioning policies may now be configured
-  using the new distributed and random ephemeral pinning extended attributes on
-  directories. See the documentation for more information:
-  https://docs.ceph.com/docs/master/cephfs/multimds/
-
-* Monitors now have a config option ``mon_osd_warn_num_repaired``, 10 by default.
-  If any OSD has repaired more than this many I/O errors in stored data a
-  ``OSD_TOO_MANY_REPAIRS`` health warning is generated.
-
-* Now when noscrub and/or no deep-scrub flags are set globally or per pool,
-  scheduled scrubs of the type disabled will be aborted. All user initiated
-  scrubs are NOT interrupted.
-
-* Fix an issue with osdmaps not being trimmed in a healthy cluster (
-  `issue#47297 <https://tracker.ceph.com/issues/47297>`_,
-  `pr#36981 <https://github.com/ceph/ceph/pull/36981>`_)
-
-Changelog
----------
-
-* bluestore,core: bluestore: blk:BlockDevice.cc: use pending_aios instead of iovec size as ios num (`pr#36668 <https://github.com/ceph/ceph/pull/36668>`_, weixinwei)
-* bluestore,tests: test/store_test: refactor bluestore spillover test (`pr#34943 <https://github.com/ceph/ceph/pull/34943>`_, Igor Fedotov)
-* bluestore,tests: tests: objectstore/store_test: kill ExcessiveFragmentation test case (`pr#36049 <https://github.com/ceph/ceph/pull/36049>`_, Igor Fedotov)
-* bluestore: bluestore: Rescue procedure for extremely large bluefs log (`pr#36123 <https://github.com/ceph/ceph/pull/36123>`_, Adam Kupczyk)
-* bluestore: octopus:os/bluestore: improve/fix bluefs stats reporting (`pr#35748 <https://github.com/ceph/ceph/pull/35748>`_, Igor Fedotov)
-* bluestore: os/bluestore: fix bluefs log growth (`pr#36621 <https://github.com/ceph/ceph/pull/36621>`_, Adam Kupczyk, Jianpeng Ma)
-* bluestore: os/bluestore: simplify Onode pin/unpin logic (`pr#36795 <https://github.com/ceph/ceph/pull/36795>`_, Igor Fedotov)
-* build/ops: Revert "mgr/osd_support: remove module and all traces" (`pr#36973 <https://github.com/ceph/ceph/pull/36973>`_, Sebastian Wagner)
-* build/ops: ceph-iscsi: selinux fixes (`pr#36302 <https://github.com/ceph/ceph/pull/36302>`_, Mike Christie)
-* build/ops: mgr/dashboard/api: reduce amount of daemon logs (`pr#36693 <https://github.com/ceph/ceph/pull/36693>`_, Ernesto Puerta)
-* ceph-volume: add dmcrypt support in raw mode (`pr#35830 <https://github.com/ceph/ceph/pull/35830>`_, Guillaume Abrioux)
-* ceph-volume: add drive-group subcommand (`pr#36558 <https://github.com/ceph/ceph/pull/36558>`_, Jan Fajerski, Sebastian Wagner)
-* ceph-volume: add tests for new functions that run LVM commands (`pr#36614 <https://github.com/ceph/ceph/pull/36614>`_, Rishabh Dave)
-* ceph-volume: don't use container classes in api/lvm.py (`pr#35879 <https://github.com/ceph/ceph/pull/35879>`_, Rishabh Dave, Guillaume Abrioux)
-* ceph-volume: fix lvm functional tests (`pr#36409 <https://github.com/ceph/ceph/pull/36409>`_, Jan Fajerski)
-* ceph-volume: handle idempotency with batch and explicit scenarios (`pr#35880 <https://github.com/ceph/ceph/pull/35880>`_, Andrew Schoen)
-* ceph-volume: remove container classes from api/lvm.py (`pr#36608 <https://github.com/ceph/ceph/pull/36608>`_, Rishabh Dave)
-* ceph-volume: report correct rejected reason in inventory if device type is invalid (`pr#36410 <https://github.com/ceph/ceph/pull/36410>`_, Satoru Takeuchi)
-* ceph-volume: run flake8 in python3 (`pr#36588 <https://github.com/ceph/ceph/pull/36588>`_, Jan Fajerski)
-* cephfs,common: common:  ignore SIGHUP prior to fork (`issue#46269 <http://tracker.ceph.com/issues/46269>`_, `pr#36195 <https://github.com/ceph/ceph/pull/36195>`_, Willem Jan Withagen, hzwuhongsong)
-* cephfs,core,mgr: mgr/status: metadata is fetched async (`pr#36630 <https://github.com/ceph/ceph/pull/36630>`_, Michael Fritch)
-* cephfs,core,rbd,rgw: librados: add LIBRADOS_SUPPORTS_GETADDRS support (`pr#36643 <https://github.com/ceph/ceph/pull/36643>`_, Xiubo Li)
-* cephfs,mgr: mgr/volumes/nfs: Add interface for adding user defined configuration (`pr#36635 <https://github.com/ceph/ceph/pull/36635>`_, Varsha Rao)
-* cephfs,mon: mon/MDSMonitor: copy MDS info which may be removed (`pr#36035 <https://github.com/ceph/ceph/pull/36035>`_, Patrick Donnelly)
-* cephfs,pybind: pybind/ceph_volume_client: Fix PEP-8 SyntaxWarning (`pr#36100 <https://github.com/ceph/ceph/pull/36100>`_, Đặng Minh Dũng)
-* cephfs,tests: mgr/fs/volumes: misc fixes (`pr#36327 <https://github.com/ceph/ceph/pull/36327>`_, Patrick Donnelly, Kotresh HR)
-* cephfs,tests: tests: Revert "Revert "qa/suites/rados/mgr/tasks/module_selftest: whitelist … (`issue#43943 <http://tracker.ceph.com/issues/43943>`_, `pr#36042 <https://github.com/ceph/ceph/pull/36042>`_, Venky Shankar)
-* cephfs,tests: tests: qa/tasks/cephfs/cephfs_test_case.py: skip cleaning the core dumps when in program case (`pr#36043 <https://github.com/ceph/ceph/pull/36043>`_, Xiubo Li)
-* cephfs,tests: tests: qa/tasks: make sh() in vstart_runner.py identical with teuthology.orchestra.remote.sh (`pr#36044 <https://github.com/ceph/ceph/pull/36044>`_, Jos Collin)
-* cephfs: Update nfs-ganesha package requirements doc backport (`pr#36063 <https://github.com/ceph/ceph/pull/36063>`_, Varsha Rao)
-* cephfs: cephfs: client: fix setxattr for 0 size value (NULL value) (`pr#36045 <https://github.com/ceph/ceph/pull/36045>`_, Sidharth Anupkrishnan)
-* cephfs: cephfs: client: fix snap directory atime (`pr#36039 <https://github.com/ceph/ceph/pull/36039>`_, Luis Henriques)
-* cephfs: cephfs: client: release the client_lock before copying data in read (`pr#36046 <https://github.com/ceph/ceph/pull/36046>`_, Chencan)
-* cephfs: client: expose ceph.quota.max_bytes xattr within snapshots (`pr#36403 <https://github.com/ceph/ceph/pull/36403>`_, Shyamsundar Ranganathan)
-* cephfs: client: introduce timeout for client shutdown (`issue#44276 <http://tracker.ceph.com/issues/44276>`_, `pr#35962 <https://github.com/ceph/ceph/pull/35962>`_, "Yan, Zheng", Venky Shankar)
-* cephfs: mds/MDSRank: fix typo in "unrecognized" (`pr#36197 <https://github.com/ceph/ceph/pull/36197>`_, Nathan Cutler)
-* cephfs: mds: add ephemeral random and distributed export pins (`pr#35759 <https://github.com/ceph/ceph/pull/35759>`_, Patrick Donnelly, Sidharth Anupkrishnan)
-* cephfs: mds: fix filelock state when Fc is issued (`pr#35842 <https://github.com/ceph/ceph/pull/35842>`_, Xiubo Li)
-* cephfs: mds: reset heartbeat in EMetaBlob replay (`pr#36040 <https://github.com/ceph/ceph/pull/36040>`_, Yanhu Cao)
-* cephfs: mgr/nfs: Check if pseudo path is absolute path (`pr#36299 <https://github.com/ceph/ceph/pull/36299>`_, Varsha Rao)
-* cephfs: mgr/nfs: Update MDCACHE block in ganesha config and doc about nfs-cephadm in vstart (`pr#36224 <https://github.com/ceph/ceph/pull/36224>`_, Varsha Rao)
-* cephfs: mgr/volumes: Deprecate protect/unprotect CLI calls for subvolume snapshots (`pr#36126 <https://github.com/ceph/ceph/pull/36126>`_, Shyamsundar Ranganathan)
-* cephfs: mgr/volumes: fix "ceph nfs export" help messages (`pr#36220 <https://github.com/ceph/ceph/pull/36220>`_, Nathan Cutler)
-* cephfs: nfs backport (`pr#35499 <https://github.com/ceph/ceph/pull/35499>`_, Jeff Layton, Varsha Rao, Ramana Raja, Kefu Chai)
-* common,core: common, osd: add sanity checks around osd_scrub_max_preemptions (`pr#36034 <https://github.com/ceph/ceph/pull/36034>`_, xie xingguo)
-* common,rbd,tools: rbd: immutable-object-cache: fixed crashes on start up (`pr#36660 <https://github.com/ceph/ceph/pull/36660>`_, Jason Dillaman)
-* common,rbd: crush/CrushWrapper: rebuild reverse maps after rebuilding crush map (`pr#36662 <https://github.com/ceph/ceph/pull/36662>`_, Jason Dillaman)
-* common: common: log: fix timestap precision of log can't set to millisecond (`pr#36048 <https://github.com/ceph/ceph/pull/36048>`_, Guan yunfei)
-* core,mgr: mgr: decrease pool stats if pg was removed (`pr#36667 <https://github.com/ceph/ceph/pull/36667>`_, Aleksei Gutikov)
-* core,rbd: osd/OSDCap: rbd profile permits use of "rbd_info" (`pr#36414 <https://github.com/ceph/ceph/pull/36414>`_, Florian Florensa)
-* core,tools: tools/rados: Set locator key when exporting or importing a pool (`pr#36666 <https://github.com/ceph/ceph/pull/36666>`_, Iain Buclaw)
-* core: mon/OSDMonitor: Reset grace period if failure interval exceeds a threshold (`pr#35799 <https://github.com/ceph/ceph/pull/35799>`_, Sridhar Seshasayee)
-* core: mon/OSDMonitor: only take in osd into consideration when trimming osd… (`pr#36981 <https://github.com/ceph/ceph/pull/36981>`_, Kefu Chai)
-* core: mon: fix the 'Error ERANGE' message when conf "osd_objectstore" is filestore (`pr#36665 <https://github.com/ceph/ceph/pull/36665>`_, wangyunqing)
-* core: monclient: schedule first tick using mon_client_hunt_interval (`pr#36633 <https://github.com/ceph/ceph/pull/36633>`_, Mykola Golub)
-* core: osd/OSD.cc: remove osd_lock for bench (`pr#36664 <https://github.com/ceph/ceph/pull/36664>`_, Neha Ojha, Adam Kupczyk)
-* core: osd/PG: fix history.same_interval_since of merge target again (`pr#36033 <https://github.com/ceph/ceph/pull/36033>`_, xie xingguo)
-* core: osd/PeeringState: prevent peer's num_objects going negative (`pr#36663 <https://github.com/ceph/ceph/pull/36663>`_, xie xingguo)
-* core: osd/PrimaryLogPG: don't populate watchers if replica (`pr#36029 <https://github.com/ceph/ceph/pull/36029>`_, Ilya Dryomov)
-* core: osd: Cancel in-progress scrubs (not user requested) (`pr#36291 <https://github.com/ceph/ceph/pull/36291>`_, David Zafman)
-* core: osd: expose osdspec_affinity to osd_metadata (`pr#35957 <https://github.com/ceph/ceph/pull/35957>`_, Joshua Schmid)
-* core: osd: fix crash in _committed_osd_maps if incremental osdmap crc fails (`pr#36340 <https://github.com/ceph/ceph/pull/36340>`_, Neha Ojha, Dan van der Ster)
-* core: osd: make message cap option usable again (`pr#35737 <https://github.com/ceph/ceph/pull/35737>`_, Neha Ojha, Josh Durgin)
-* core: osd: wakeup all threads of shard rather than one thread (`pr#36032 <https://github.com/ceph/ceph/pull/36032>`_, Jianpeng Ma)
-* core: test: osd-backfill-stats.sh use nobackfill to avoid races in remainin… (`pr#36030 <https://github.com/ceph/ceph/pull/36030>`_, David Zafman)
-* doc: cephadm batch backport (`pr#36450 <https://github.com/ceph/ceph/pull/36450>`_, Varsha Rao, Ricardo Marques, Kiefer Chang, Matthew Oliver, Paul Cuzner, Kefu Chai, Daniel-Pivonka, Sebastian Wagner, Volker Theile, Adam King, Michael Fritch, Joshua Schmid)
-* doc: doc/mgr/crash: Add missing command in rm example (`pr#36690 <https://github.com/ceph/ceph/pull/36690>`_, Daniël Vos)
-* doc: doc/rados: Fix osd_scrub_during_recovery default value (`pr#36661 <https://github.com/ceph/ceph/pull/36661>`_, Benoît Knecht)
-* doc: doc/rbd: add rbd-target-gw enable and start (`pr#36416 <https://github.com/ceph/ceph/pull/36416>`_, Zac Dover)
-* doc: doc: PendingReleaseNotes: clean slate for 15.2.5 (`pr#35753 <https://github.com/ceph/ceph/pull/35753>`_, Nathan Cutler)
-* mgr,pybind: pybind/mgr/balancer: use "==" and "!=" for comparing str (`pr#36036 <https://github.com/ceph/ceph/pull/36036>`_, Kefu Chai)
-* mgr,pybind: pybind/mgr/pg_autoscaler/module.py: do not update event if ev.pg_num== ev.pg_num_target (`pr#36037 <https://github.com/ceph/ceph/pull/36037>`_, Neha Ojha)
-* mgr,rbd: mgr/prometheus: automatically discover RBD pools for stats gathering (`pr#36411 <https://github.com/ceph/ceph/pull/36411>`_, Jason Dillaman)
-* mgr/dashboard/api: increase API health timeout (`pr#36562 <https://github.com/ceph/ceph/pull/36562>`_, Ernesto Puerta)
-* mgr/dashboard: Add button to copy the bootstrap token into the clipboard (`pr#35796 <https://github.com/ceph/ceph/pull/35796>`_, Ishan Rai)
-* mgr/dashboard: Add host labels in UI (`pr#35893 <https://github.com/ceph/ceph/pull/35893>`_, Volker Theile)
-* mgr/dashboard: Add hosts page unit tests (`pr#36350 <https://github.com/ceph/ceph/pull/36350>`_, Volker Theile)
-* mgr/dashboard: Allow to edit iSCSI target with active session (`pr#35997 <https://github.com/ceph/ceph/pull/35997>`_, Ricardo Marques)
-* mgr/dashboard: Always use fast angular unit tests (`pr#36267 <https://github.com/ceph/ceph/pull/36267>`_, Stephan Müller)
-* mgr/dashboard: Configure overflow of popover in health page (`pr#36460 <https://github.com/ceph/ceph/pull/36460>`_, Tiago Melo)
-* mgr/dashboard: Display check icon instead of true|false in various datatables (`pr#35892 <https://github.com/ceph/ceph/pull/35892>`_, Volker Theile)
-* mgr/dashboard: Display users current bucket quota usage (`pr#35926 <https://github.com/ceph/ceph/pull/35926>`_, Ernesto Puerta, Avan Thakkar)
-* mgr/dashboard: Extract documentation link to a component (`pr#36587 <https://github.com/ceph/ceph/pull/36587>`_, Tiago Melo)
-* mgr/dashboard: Fix host attributes like labels are not returned (`pr#36678 <https://github.com/ceph/ceph/pull/36678>`_, Kiefer Chang)
-* mgr/dashboard: Hide password notification when expiration date is far (`pr#35975 <https://github.com/ceph/ceph/pull/35975>`_, Tiago Melo)
-* mgr/dashboard: Improve Summary's subscribe methods (`pr#35705 <https://github.com/ceph/ceph/pull/35705>`_, Tiago Melo)
-* mgr/dashboard: Prometheus query error in the metrics of Pools, OSDs and RBD images (`pr#35885 <https://github.com/ceph/ceph/pull/35885>`_, Avan Thakkar)
-* mgr/dashboard: Re-enable OSD's table autoReload (`pr#36226 <https://github.com/ceph/ceph/pull/36226>`_, Kiefer Chang, Tiago Melo)
-* mgr/dashboard: Strange iSCSI discovery auth behavior (`pr#36782 <https://github.com/ceph/ceph/pull/36782>`_, Volker Theile)
-* mgr/dashboard: The max. buckets field in RGW user form should be pre-filled (`pr#35795 <https://github.com/ceph/ceph/pull/35795>`_, Volker Theile)
-* mgr/dashboard: Unable to edit iSCSI logged-in client (`pr#36611 <https://github.com/ceph/ceph/pull/36611>`_, Ricardo Marques)
-* mgr/dashboard: Use right size in pool form (`pr#35925 <https://github.com/ceph/ceph/pull/35925>`_, Stephan Müller)
-* mgr/dashboard: Use same required field message accross the UI (`pr#36277 <https://github.com/ceph/ceph/pull/36277>`_, Volker Theile)
-* mgr/dashboard: add API team to CODEOWNERS (`pr#36143 <https://github.com/ceph/ceph/pull/36143>`_, Ernesto Puerta)
-* mgr/dashboard: allow preserving OSD IDs when deleting OSDs (`pr#35766 <https://github.com/ceph/ceph/pull/35766>`_, Kiefer Chang)
-* mgr/dashboard: cpu stats incorrectly displayed (`pr#36322 <https://github.com/ceph/ceph/pull/36322>`_, Avan Thakkar)
-* mgr/dashboard: cropped actions menu in nested details (`pr#35620 <https://github.com/ceph/ceph/pull/35620>`_, Avan Thakkar)
-* mgr/dashboard: fix Source column i18n issue in RBD configuration tables (`pr#35819 <https://github.com/ceph/ceph/pull/35819>`_, Kiefer Chang)
-* mgr/dashboard: fix backporting issue #35926 (`pr#36073 <https://github.com/ceph/ceph/pull/36073>`_, Ernesto Puerta)
-* mgr/dashboard: fix pool usage calculation (`pr#36137 <https://github.com/ceph/ceph/pull/36137>`_, Ernesto Puerta)
-* mgr/dashboard: fix rbdmirroring dropdown menu (`pr#36382 <https://github.com/ceph/ceph/pull/36382>`_, Avan Thakkar)
-* mgr/dashboard: fix regression in delete OSD modal (`pr#36419 <https://github.com/ceph/ceph/pull/36419>`_, Kiefer Chang)
-* mgr/dashboard: fix tasks.mgr.dashboard.test_rbd.RbdTest.test_move_image_to_trash error (`pr#36563 <https://github.com/ceph/ceph/pull/36563>`_, Kiefer Chang)
-* mgr/dashboard: fix ui api endpoints (`pr#36160 <https://github.com/ceph/ceph/pull/36160>`_, Fabrizio D'Angelo)
-* mgr/dashboard: fix wal/db slots controls in the OSD form (`pr#35883 <https://github.com/ceph/ceph/pull/35883>`_, Kiefer Chang)
-* mgr/dashboard: increase API test coverage in API controllers (`pr#36260 <https://github.com/ceph/ceph/pull/36260>`_, Kefu Chai, Aashish Sharma)
-* mgr/dashboard: redirect to original URL after successful login (`pr#36831 <https://github.com/ceph/ceph/pull/36831>`_, Avan Thakkar)
-* mgr/dashboard: remove "This week/month/year" and "Today" time stamps (`pr#36789 <https://github.com/ceph/ceph/pull/36789>`_, Avan Thakkar)
-* mgr/dashboard: remove cdCopy2ClipboardButton `formatted` attribute (`pr#35889 <https://github.com/ceph/ceph/pull/35889>`_, Tatjana Dehler)
-* mgr/dashboard: remove password field if login is using SSO and fix error message in confirm password (`pr#36689 <https://github.com/ceph/ceph/pull/36689>`_, Ishan Rai)
-* mgr/dashboard: right-align dropdown menu of column filters (`pr#36369 <https://github.com/ceph/ceph/pull/36369>`_, Kiefer Chang)
-* mgr/dashboard: telemetry activation notification (`pr#35772 <https://github.com/ceph/ceph/pull/35772>`_, Tatjana Dehler)
-* mgr/dashboard: wait longer for health status to be cleared (`pr#36346 <https://github.com/ceph/ceph/pull/36346>`_, Tatjana Dehler)
-* mgr/k8sevents: sanitise kubernetes events (`pr#35684 <https://github.com/ceph/ceph/pull/35684>`_, Paul Cuzner)
-* mgr/prometheus: improve cache (`pr#35847 <https://github.com/ceph/ceph/pull/35847>`_, Patrick Seidensal)
-* mgr: avoid false alarm of MGR_MODULE_ERROR (`pr#35995 <https://github.com/ceph/ceph/pull/35995>`_, Kefu Chai)
-* mgr: mgr/DaemonServer.cc: make 'config show' on fsid work (`pr#35793 <https://github.com/ceph/ceph/pull/35793>`_, Neha Ojha)
-* mgr: mgr/cephadm: Adapt Vagrantfile to use octopus instead of master repo on shaman (`pr#35988 <https://github.com/ceph/ceph/pull/35988>`_, Volker Theile)
-* mgr: mgr/diskprediction_local: Fix array size error (`pr#36577 <https://github.com/ceph/ceph/pull/36577>`_, Benoît Knecht)
-* mgr: mgr/progress: Skip pg_summary update if _events dict is empty (`pr#36076 <https://github.com/ceph/ceph/pull/36076>`_, Manuel Lausch)
-* mgr: mgr/prometheus: log time it takes to collect metrics (`pr#36581 <https://github.com/ceph/ceph/pull/36581>`_, Patrick Seidensal)
-* mgr: mgr: Add missing states to PG_STATES in mgr_module.py (`pr#36786 <https://github.com/ceph/ceph/pull/36786>`_, Harley Gorrell)
-* mgr: mgr: fix race between module load and notify (`pr#35794 <https://github.com/ceph/ceph/pull/35794>`_, Mykola Golub)
-* mgr: mon/PGMap: do not consider changing pg stuck (`pr#35958 <https://github.com/ceph/ceph/pull/35958>`_, Kefu Chai)
-* monitoring: alert for pool fill up broken (`pr#35136 <https://github.com/ceph/ceph/pull/35136>`_, Volker Theile)
-* msgr: New msgr2 crc and secure modes (msgr2.1) (`pr#35720 <https://github.com/ceph/ceph/pull/35720>`_, Ilya Dryomov)
-* rbd,tests: tests/rbd_mirror: fix race on test shut down (`pr#36657 <https://github.com/ceph/ceph/pull/36657>`_, Mykola Golub)
-* rbd: librbd:  global and pool-level config overrides require image refresh to apply (`pr#36638 <https://github.com/ceph/ceph/pull/36638>`_, Jason Dillaman)
-* rbd: librbd: new 'write_zeroes' API methods to suppliment the `discard` APIs (`pr#36247 <https://github.com/ceph/ceph/pull/36247>`_, Jason Dillaman)
-* rbd: librbd: potential race conditions handling API IO completions (`pr#36331 <https://github.com/ceph/ceph/pull/36331>`_, Jason Dillaman)
-* rbd: mgr/dashboard: work with v1 RBD images (`pr#35711 <https://github.com/ceph/ceph/pull/35711>`_, Ernesto Puerta)
-* rbd: rbd: librbd: Align rbd_write_zeroes declarations (`pr#36717 <https://github.com/ceph/ceph/pull/36717>`_, Corey Bryant)
-* rbd: rbd: librbd: don't resend async_complete if watcher is unregistered (`pr#36659 <https://github.com/ceph/ceph/pull/36659>`_, Mykola Golub)
-* rbd: rbd: librbd: flush all queued object IO from simple scheduler (`pr#36658 <https://github.com/ceph/ceph/pull/36658>`_, Jason Dillaman)
-* rbd: rbd: librbd: race when disabling object map with overlapping in-flight writes (`pr#36656 <https://github.com/ceph/ceph/pull/36656>`_, Jason Dillaman)
-* rbd: rbd: recognize crush_location, read_from_replica and compression_hint map options (`pr#36061 <https://github.com/ceph/ceph/pull/36061>`_, Ilya Dryomov)
-* rgw,tests: qa/tasks/ragweed: always set ragweed_repo (`pr#36651 <https://github.com/ceph/ceph/pull/36651>`_, Kefu Chai)
-* rgw:  rgw: lc: fix Segmentation Fault when the tag of the object was not found (`pr#36085 <https://github.com/ceph/ceph/pull/36085>`_, yupeng chen, zhuo li)
-* rgw: Add subuser to OPA request (`pr#36023 <https://github.com/ceph/ceph/pull/36023>`_, Seena Fallah)
-* rgw: Add support wildcard subuser for bucket policy (`pr#36022 <https://github.com/ceph/ceph/pull/36022>`_, Seena Fallah)
-* rgw: Adding data cache and CDN capabilities (`pr#36646 <https://github.com/ceph/ceph/pull/36646>`_, Mark Kogan, Or Friedmann)
-* rgw: Empty reqs_change_state queue before unregistered_reqs (`pr#36650 <https://github.com/ceph/ceph/pull/36650>`_, Soumya Koduri)
-* rgw: add abort multipart date and rule-id header to init multipart upload response (`pr#36649 <https://github.com/ceph/ceph/pull/36649>`_, zhang Shaowen, zhangshaowen)
-* rgw: add access log to the beast frontend (`pr#36024 <https://github.com/ceph/ceph/pull/36024>`_, Mark Kogan)
-* rgw: add check for index entry's existing when adding bucket stats during bucket reshard (`pr#36025 <https://github.com/ceph/ceph/pull/36025>`_, zhang Shaowen)
-* rgw: add negative cache to the system object (`pr#36648 <https://github.com/ceph/ceph/pull/36648>`_, Or Friedmann)
-* rgw: add quota enforcement to CopyObj (`pr#36020 <https://github.com/ceph/ceph/pull/36020>`_, Casey Bodley)
-* rgw: append obj: prevent tail from being GC'ed (`pr#36389 <https://github.com/ceph/ceph/pull/36389>`_, Abhishek Lekshmanan)
-* rgw: bucket list/stats truncates for user w/ >1000 buckets (`pr#36019 <https://github.com/ceph/ceph/pull/36019>`_, J. Eric Ivancich)
-* rgw: cls/rgw: preserve olh entry's name on last unlink (`pr#36652 <https://github.com/ceph/ceph/pull/36652>`_, Casey Bodley)
-* rgw: cls/rgw_gc: Fixing the iterator used to access urgent data map (`pr#36017 <https://github.com/ceph/ceph/pull/36017>`_, Pritha Srivastava)
-* rgw: fix boost::asio::async_write() does not return error (`pr#36647 <https://github.com/ceph/ceph/pull/36647>`_, Mark Kogan)
-* rgw: fix bug where ordered bucket listing gets stuck (`pr#35877 <https://github.com/ceph/ceph/pull/35877>`_, J. Eric Ivancich)
-* rgw: fix double slash (//) killing the gateway (`pr#36654 <https://github.com/ceph/ceph/pull/36654>`_, Theofilos Mouratidis)
-* rgw: fix loop problem with swift stat on account (`pr#36021 <https://github.com/ceph/ceph/pull/36021>`_, Marcus Watts)
-* rgw: fix shutdown crash in RGWAsyncReadMDLogEntries (`pr#36653 <https://github.com/ceph/ceph/pull/36653>`_, Casey Bodley)
-* rgw: introduce safe user-reset-stats (`pr#36655 <https://github.com/ceph/ceph/pull/36655>`_, Yuval Lifshitz, Matt Benjamin)
-* rgw: lc: add lifecycle perf counters (`pr#36018 <https://github.com/ceph/ceph/pull/36018>`_, Mark Kogan, Matt Benjamin)
-* rgw: orphan list teuthology test & fully-qualified domain issue (`pr#36027 <https://github.com/ceph/ceph/pull/36027>`_, J. Eric Ivancich)
-* rgw: orphan-list timestamp fix (`pr#35929 <https://github.com/ceph/ceph/pull/35929>`_, J. Eric Ivancich)
-* rgw: policy: reuse eval_principal to evaluate the policy principal (`pr#36636 <https://github.com/ceph/ceph/pull/36636>`_, Abhishek Lekshmanan)
-* rgw: radoslist incomplete multipart uploads fix marker progression (`pr#36028 <https://github.com/ceph/ceph/pull/36028>`_, J. Eric Ivancich)
-* rgw: rgw/iam: correcting the result of get role policy (`pr#36645 <https://github.com/ceph/ceph/pull/36645>`_, Pritha Srivastava)
-* rgw: selinux: allow ceph_t amqp_port_t:tcp_socket (`pr#36026 <https://github.com/ceph/ceph/pull/36026>`_, Kaleb S. KEITHLEY, Thomas Serlin)
-* rgw: stop realm reloader before store shutdown (`pr#36644 <https://github.com/ceph/ceph/pull/36644>`_, Kefu Chai, Casey Bodley)
-* tools: tools: Add statfs operation to ceph-objecstore-tool (`pr#35715 <https://github.com/ceph/ceph/pull/35715>`_, David Zafman)
-
-v15.2.4 Octopus
-===============
-
-This is the fourth release of the Ceph Octopus stable release series.
-In addition to a security fix in RGW, this release brings a range of fixes
-across all components. We recommend that all Octopus users upgrade to this
-release.
-
-Notable Changes
----------------
-
-* CVE-2020-10753: rgw: sanitize newlines in s3 CORSConfiguration's ExposeHeader
-  (William Bowling, Adam Mohammed, Casey Bodley)
-
-* Cephadm: There were a lot of small usability improvements and bug fixes:
-
-  * Grafana when deployed by Cephadm now binds to all network interfaces.
-  * ``cephadm check-host`` now prints all detected problems at once.
-  * Cephadm now calls ``ceph dashboard set-grafana-api-ssl-verify false``
-    when generating an SSL certificate for Grafana.
-  * The Alertmanager is now correctly pointed to the Ceph Dashboard
-  * ``cephadm adopt`` now supports adopting an Alertmanager
-  * ``ceph orch ps`` now supports filtering by service name
-  * ``ceph orch host ls`` now marks hosts as offline, if they are not
-    accessible.
-
-* Cephadm can now deploy NFS Ganesha services. For example, to deploy NFS with
-  a service id of mynfs, that will use the RADOS pool nfs-ganesha and namespace
-  nfs-ns::
-
-    ceph orch apply nfs mynfs nfs-ganesha nfs-ns
-
-* Cephadm: ``ceph orch ls --export`` now returns all service specifications in
-  yaml representation that is consumable by ``ceph orch apply``. In addition,
-  the commands ``orch ps`` and ``orch ls`` now support ``--format yaml`` and
-  ``--format json-pretty``.
-
-* Cephadm: ``ceph orch apply osd`` supports a ``--preview`` flag that prints a preview of
-  the OSD specification before deploying OSDs. This makes it possible to
-  verify that the specification is correct, before applying it.
-
-* RGW: The ``radosgw-admin`` sub-commands dealing with orphans --
-  ``radosgw-admin orphans find``, ``radosgw-admin orphans finish``, and
-  ``radosgw-admin orphans list-jobs`` -- have been deprecated. They have
-  not been actively maintained and they store intermediate results on
-  the cluster, which could fill a nearly-full cluster.  They have been
-  replaced by a tool, currently considered experimental,
-  ``rgw-orphan-list``.
-
-* RBD: The name of the rbd pool object that is used to store
-  rbd trash purge schedule is changed from "rbd_trash_trash_purge_schedule"
-  to "rbd_trash_purge_schedule". Users that have already started using
-  ``rbd trash purge schedule`` functionality and have per pool or namespace
-  schedules configured should copy "rbd_trash_trash_purge_schedule"
-  object to "rbd_trash_purge_schedule" before the upgrade and remove
-  "rbd_trash_purge_schedule" using the following commands in every RBD
-  pool and namespace where a trash purge schedule was previously
-  configured::
-
-    rados -p <pool-name> [-N namespace] cp rbd_trash_trash_purge_schedule rbd_trash_purge_schedule
-    rados -p <pool-name> [-N namespace] rm rbd_trash_trash_purge_schedule
-
-  or use any other convenient way to restore the schedule after the
-  upgrade.
-
-Changelog
----------
-
-* build/ops: address SElinux denials observed in rgw/multisite test run (`pr#34538 <https://github.com/ceph/ceph/pull/34538>`_, Kefu Chai, Kaleb S. Keithley)
-* ceph-volume: add and delete lvm tags in a single lvchange call (`pr#35452 <https://github.com/ceph/ceph/pull/35452>`_, Jan Fajerski)
-* ceph-volume: add ceph.osdspec_affinity tag (`pr#35134 <https://github.com/ceph/ceph/pull/35134>`_, Joshua Schmid)
-* cephadm: batch backport May (1) (`pr#34893 <https://github.com/ceph/ceph/pull/34893>`_, Michael Fritch, Ricardo Marques, Matthew Oliver, Sebastian Wagner, Joshua Schmid, Zac Dover, Varsha Rao)
-* cephadm: batch backport May (2) (`pr#35188 <https://github.com/ceph/ceph/pull/35188>`_, Michael Fritch, Sebastian Wagner, Kefu Chai, Georgios Kyratsas, Kiefer Chang, Joshua Schmid, Patrick Seidensal, Varsha Rao, Matthew Oliver, Zac Dover, Juan Miguel Olmo Martínez, Tim Serong, Alexey Miasoedov, Ricardo Marques, Satoru Takeuchi)
-* cephadm: batch backport June (1) (`pr#35347 <https://github.com/ceph/ceph/pull/35347>`_, Sebastian Wagner, Zac Dover, Georgios Kyratsas, Kiefer Chang, Ricardo Marques, Patrick Seidensal, Patrick Donnelly, Joshua Schmid, Matthew Oliver, Varsha Rao, Juan Miguel Olmo Martínez, Michael Fritch)
-* cephadm: batch backport June (2) (`pr#35475 <https://github.com/ceph/ceph/pull/35475>`_, Sebastian Wagner, Kiefer Chang, Joshua Schmid, Michael Fritch, shinhwagk, Kefu Chai, Juan Miguel Olmo Martínez, Daniel Pivonka)
-* cephfs: allow pool names with hyphen and period (`pr#35251 <https://github.com/ceph/ceph/pull/35251>`_, Ramana Raja)
-* cephfs: bash_completion: Do not auto complete obsolete and hidden cmds (`pr#34996 <https://github.com/ceph/ceph/pull/34996>`_, Kotresh HR)
-* cephfs: cephfs-shell: Change tox testenv name to py3 (`pr#34998 <https://github.com/ceph/ceph/pull/34998>`_, Kefu Chai, Varsha Rao, Aditya Srivastava)
-* cephfs: client: expose Client::ll_register_callback via libcephfs (`pr#35150 <https://github.com/ceph/ceph/pull/35150>`_, Jeff Layton)
-* cephfs: client: fix Finisher assert failure (`pr#34999 <https://github.com/ceph/ceph/pull/34999>`_, Xiubo Li)
-* cephfs: client: only set MClientCaps::FLAG_SYNC when flushing dirty auth caps (`pr#34997 <https://github.com/ceph/ceph/pull/34997>`_, Jeff Layton)
-* cephfs: fuse: add the '-d' option back for libfuse (`pr#35449 <https://github.com/ceph/ceph/pull/35449>`_, Xiubo Li)
-* cephfs: mds: Handle blacklisted error in purge queue (`pr#35148 <https://github.com/ceph/ceph/pull/35148>`_, Varsha Rao)
-* cephfs: mds: preserve ESlaveUpdate logevent until receiving OP_FINISH (`pr#35253 <https://github.com/ceph/ceph/pull/35253>`_, songxinying)
-* cephfs: mds: take xlock in the order requests start locking (`pr#35252 <https://github.com/ceph/ceph/pull/35252>`_, "Yan, Zheng")
-* cephfs: src/client/fuse_ll: compatible with libfuse3.5 or higher (`pr#35450 <https://github.com/ceph/ceph/pull/35450>`_, Jeff Layton, Xiubo Li)
-* cephfs: vstart_runner: set mounted to True at the end of mount() (`pr#35447 <https://github.com/ceph/ceph/pull/35447>`_, Rishabh Dave)
-* core: bluestore: fix large (>2GB) writes when bluefs_buffered_io = true (`pr#35446 <https://github.com/ceph/ceph/pull/35446>`_, Igor Fedotov)
-* core: bluestore: introduce hybrid allocator (`pr#35498 <https://github.com/ceph/ceph/pull/35498>`_, Igor Fedotov, Adam Kupczyk)
-* core: cls/queue: fix empty markers when listing entries (`pr#35241 <https://github.com/ceph/ceph/pull/35241>`_, Pritha Srivastava, Yuval Lifshitz)
-* core: objecter: don't attempt to read from non-primary on EC pools (`pr#35444 <https://github.com/ceph/ceph/pull/35444>`_, Ilya Dryomov)
-* core: osd: add --osdspec-affinity flag (`pr#35382 <https://github.com/ceph/ceph/pull/35382>`_, Joshua Schmid)
-* core: osd: make "missing incremental map" a debug log message (`pr#35442 <https://github.com/ceph/ceph/pull/35442>`_, Nathan Cutler)
-* core: osd: prevent ShardedOpWQ suicide_grace drop when waiting for work (`pr#34881 <https://github.com/ceph/ceph/pull/34881>`_, Dan Hill)
-* core: rocksdb: Update to ceph-octopus-v5.8-1436 (`pr#35036 <https://github.com/ceph/ceph/pull/35036>`_, Brad Hubbard)
-* doc: drop obsolete cache tier options (`pr#35105 <https://github.com/ceph/ceph/pull/35105>`_, Nathan Cutler)
-* doc: mgr/dashboard: Add troubleshooting guide (`pr#34947 <https://github.com/ceph/ceph/pull/34947>`_, Tatjana Dehler)
-* doc: rgw: document 'rgw gc max concurrent io' (`pr#34987 <https://github.com/ceph/ceph/pull/34987>`_, Casey Bodley)
-* mds: cleanup uncommitted fragments before mds goes to active (`pr#35448 <https://github.com/ceph/ceph/pull/35448>`_, "Yan, Zheng")
-* mds: don't assert empty io context list when shutting down (`pr#34509 <https://github.com/ceph/ceph/pull/34509>`_, "Yan, Zheng")
-* mds: don't shallow copy when decoding xattr map (`pr#35147 <https://github.com/ceph/ceph/pull/35147>`_, "Yan, Zheng")
-* mds: flag backtrace scrub failures for new files as okay (`pr#35555 <https://github.com/ceph/ceph/pull/35555>`_, Milind Changire)
-* mgr/dashboard/grafana: Add rbd-image details dashboard (`pr#35247 <https://github.com/ceph/ceph/pull/35247>`_, Enno Gotthold)
-* mgr/dashboard: Asynchronous unique username validation for User Component (`pr#34849 <https://github.com/ceph/ceph/pull/34849>`_, Nizamudeen)
-* mgr/dashboard: ECP modal enhancement (`pr#35152 <https://github.com/ceph/ceph/pull/35152>`_, Stephan Müller)
-* mgr/dashboard: Fix HomeTest setup (`pr#35085 <https://github.com/ceph/ceph/pull/35085>`_, Tiago Melo)
-* mgr/dashboard: Fix e2e chromium binary validation (`pr#35679 <https://github.com/ceph/ceph/pull/35679>`_, Tiago Melo)
-* mgr/dashboard: Fix random E2E error in mgr-modules (`pr#35706 <https://github.com/ceph/ceph/pull/35706>`_, Tiago Melo)
-* mgr/dashboard: Fix redirect after changing password (`pr#35243 <https://github.com/ceph/ceph/pull/35243>`_, Tiago Melo)
-* mgr/dashboard: Prevent dashboard breakdown on bad pool selection (`pr#35135 <https://github.com/ceph/ceph/pull/35135>`_, Stephan Müller)
-* mgr/dashboard: Proposed About Modal box (`pr#35291 <https://github.com/ceph/ceph/pull/35291>`_, Ngwa Sedrick Meh, Tiago Melo)
-* mgr/dashboard: Reduce requests in Mirroring page (`pr#34992 <https://github.com/ceph/ceph/pull/34992>`_, Tiago Melo)
-* mgr/dashboard: Replace Protractor with Cypress (`pr#34910 <https://github.com/ceph/ceph/pull/34910>`_, Tiago Melo)
-* mgr/dashboard: Show labels in hosts page (`pr#35517 <https://github.com/ceph/ceph/pull/35517>`_, Volker Theile)
-* mgr/dashboard: Show table details inside the datatable (`pr#35270 <https://github.com/ceph/ceph/pull/35270>`_, Sebastian Krah)
-* mgr/dashboard: add telemetry report component (`pr#34850 <https://github.com/ceph/ceph/pull/34850>`_, Tatjana Dehler)
-* mgr/dashboard: displaying Service detail inside table (`pr#35269 <https://github.com/ceph/ceph/pull/35269>`_, Kiefer Chang)
-* mgr/dashboard: fix autocomplete input backgrounds in chrome and firefox (`pr#35718 <https://github.com/ceph/ceph/pull/35718>`_, Ishan Rai)
-* mgr/dashboard: grafana panels for rgw multisite sync performance (`pr#35693 <https://github.com/ceph/ceph/pull/35693>`_, Alfonso Martínez)
-* mgr/dashboard: monitoring menu entry should indicate firing alerts (`pr#34822 <https://github.com/ceph/ceph/pull/34822>`_, Tiago Melo, Volker Theile)
-* mgr/dashboard: redesign the login screen (`pr#35268 <https://github.com/ceph/ceph/pull/35268>`_, Ishan Rai)
-* mgr/dashboard: remove space after service name in the Hosts List table (`pr#35531 <https://github.com/ceph/ceph/pull/35531>`_, Kiefer Chang)
-* mgr/dashboard: replace hard coded telemetry URLs (`pr#35231 <https://github.com/ceph/ceph/pull/35231>`_, Tatjana Dehler)
-* mgr/rbd_support: rename "rbd_trash_trash_purge_schedule" oid (`pr#35436 <https://github.com/ceph/ceph/pull/35436>`_, Nathan Cutler, Mykola Golub)
-* mgr/status: Fix "ceph fs status" json format writing to stderr (`pr#34727 <https://github.com/ceph/ceph/pull/34727>`_, Kotresh HR)
-* mgr/test_orchestrator: fix _get_ceph_daemons() (`pr#34979 <https://github.com/ceph/ceph/pull/34979>`_, Alfonso Martínez)
-* mgr/volumes: Add snapshot info command (`pr#35670 <https://github.com/ceph/ceph/pull/35670>`_, Kotresh HR)
-* mgr/volumes: Create subvolume with isolated rados namespace (`pr#35671 <https://github.com/ceph/ceph/pull/35671>`_, Kotresh HR)
-* mgr/volumes: Fix subvolume create idempotency (`pr#35256 <https://github.com/ceph/ceph/pull/35256>`_, Kotresh HR)
-* mgr: synchronize ClusterState's health and mon_status (`pr#34995 <https://github.com/ceph/ceph/pull/34995>`_, Radoslaw Zarzynski)
-* monitoring: Fix "10% OSDs down" alert description (`pr#35151 <https://github.com/ceph/ceph/pull/35151>`_, Benoît Knecht)
-* monitoring: fixing some issues in RBD detail dashboard (`pr#35463 <https://github.com/ceph/ceph/pull/35463>`_, Kiefer Chang)
-* rbd: librbd: Watcher should not attempt to re-watch after detecting blacklisting (`pr#35439 <https://github.com/ceph/ceph/pull/35439>`_, Jason Dillaman)
-* rbd: librbd: avoid completing mirror:DisableRequest while holding its lock (`pr#35126 <https://github.com/ceph/ceph/pull/35126>`_, Jason Dillaman)
-* rbd: librbd: copy API should not inherit v1 image format by default (`pr#35255 <https://github.com/ceph/ceph/pull/35255>`_, Jason Dillaman)
-* rbd: librbd: make rbd_read_from_replica_policy actually work (`pr#35438 <https://github.com/ceph/ceph/pull/35438>`_, Ilya Dryomov)
-* rbd: pybind: RBD.create() method's 'old_format' parameter now defaults to False (`pr#35435 <https://github.com/ceph/ceph/pull/35435>`_, Jason Dillaman)
-* rbd: rbd-mirror: don't hold (stale) copy of local image journal pointer (`pr#35430 <https://github.com/ceph/ceph/pull/35430>`_, Jason Dillaman)
-* rbd: rbd-mirror: stop local journal replayer first during shut down (`pr#35440 <https://github.com/ceph/ceph/pull/35440>`_, Jason Dillaman, Mykola Golub)
-* rbd: rbd-mirror: wait for in-flight start/stop/restart (`pr#35437 <https://github.com/ceph/ceph/pull/35437>`_, Mykola Golub)
-* rgw: add "rgw-orphan-list" tool and "radosgw-admin bucket radoslist ..." (`pr#34991 <https://github.com/ceph/ceph/pull/34991>`_, J. Eric Ivancich)
-* rgw: amqp: fix the "routable" delivery mode (`pr#35433 <https://github.com/ceph/ceph/pull/35433>`_, Yuval Lifshitz)
-* rgw: anonomous swift to obj that dont exist should 401 (`pr#35120 <https://github.com/ceph/ceph/pull/35120>`_, Matthew Oliver)
-* rgw: fix bug where bucket listing end marker not always set correctly (`pr#34993 <https://github.com/ceph/ceph/pull/34993>`_, J. Eric Ivancich)
-* rgw: fix rgw tries to fetch anonymous user (`pr#34988 <https://github.com/ceph/ceph/pull/34988>`_, Or Friedmann)
-* rgw: fix some list buckets handle leak (`pr#34985 <https://github.com/ceph/ceph/pull/34985>`_, Tianshan Qu)
-* rgw: gc: Clearing off urgent data in bufferlist, before (`pr#35434 <https://github.com/ceph/ceph/pull/35434>`_, Pritha Srivastava)
-* rgw: lc: enable thread-parallelism in RGWLC (`pr#35431 <https://github.com/ceph/ceph/pull/35431>`_, Matt Benjamin)
-* rgw: notifications: fix zero size in notifications (`pr#34940 <https://github.com/ceph/ceph/pull/34940>`_, J. Eric Ivancich, Yuval Lifshitz)
-* rgw: notifications: version id was not sent in versioned buckets (`pr#35254 <https://github.com/ceph/ceph/pull/35254>`_, Yuval Lifshitz)
-* rgw: radosgw-admin: fix infinite loops in 'datalog list' (`pr#34989 <https://github.com/ceph/ceph/pull/34989>`_, Casey Bodley)
-* rgw: url: fix amqp urls with vhosts (`pr#35432 <https://github.com/ceph/ceph/pull/35432>`_, Yuval Lifshitz)
-* tests: migrate qa/ to Python3 (`pr#35364 <https://github.com/ceph/ceph/pull/35364>`_, Kyr Shatskyy, Ilya Dryomov, Xiubo Li, Kefu Chai, Casey Bodley, Rishabh Dave, Patrick Donnelly, Sidharth Anupkrishnan, Michael Fritch)
-
-
-v15.2.3 Octopus
-===============
-
-This is the third bug-fix release of the Ceph Octopus stable release series.
-This release mainly is a workaround for a potential OSD corruption in v15.2.2.
-We advise users to upgrade to v15.2.3 directly. For users running v15.2.2 please
-execute the following::
-
-  ceph config set osd bluefs_preextend_wal_files false
-
-Changelog
----------
-
-* bluestore: remove preextended WAL support (`issue#45613 <http://tracker.ceph.com/issues/45613>`_, Igor Fedotov, Neha Ojha)
-
-
-v15.2.2 Octopus
-===============
-
-This is the second bug-fix release of the Ceph Octopus stable release series. This release
-brings a range of fixes across all components, as well as patching a security flaw. We
-recommend that all Octopus users upgrade.
-
-Notable Changes
----------------
-
-* CVE-2020-10736: Fixed an authorization bypass in mons & mgrs (Olle SegerDahl, Josh Durgin)
-
-Changelog
----------
-
-* bluestore,core: common/options: Disable bluefs_buffered_io by default again (`pr#34353 <https://github.com/ceph/ceph/pull/34353>`_, Mark Nelson)
-* bluestore: os/bluestore: Don't pollute old journal when add new device (`pr#34795 <https://github.com/ceph/ceph/pull/34795>`_, Yang Honggang)
-* bluestore: os/bluestore: fix 'unused' calculation (`pr#34793 <https://github.com/ceph/ceph/pull/34793>`_, Igor Fedotov, xie xingguo)
-* bluestore: os/bluestore: open DB in read-only when expanding DB/WAL (`pr#34610 <https://github.com/ceph/ceph/pull/34610>`_, Adam Kupczyk, Igor Fedotov)
-* build/ops: rpm: add python3-saml as install dependency (`pr#34474 <https://github.com/ceph/ceph/pull/34474>`_, Ernesto Puerta)
-* build/ops: rpm: drop "is_opensuse" conditional in SUSE-specific bcond block (`pr#34790 <https://github.com/ceph/ceph/pull/34790>`_, Nathan Cutler)
-* build/ops: spec: address some warnings raised by RPM 4.15.1 (`pr#34526 <https://github.com/ceph/ceph/pull/34526>`_, Nathan Cutler)
-* ceph-volume/batch: check lvs list before access (`pr#34480 <https://github.com/ceph/ceph/pull/34480>`_, Jan Fajerski)
-* ceph-volume/batch: return success when all devices are filtered (`pr#34477 <https://github.com/ceph/ceph/pull/34477>`_, Jan Fajerski)
-* ceph-volume: update functional testing deploy.yml playbook (`pr#34886 <https://github.com/ceph/ceph/pull/34886>`_, Guillaume Abrioux)
-* cephadm: Fix check_ip_port to work with IPv6 (`pr#34350 <https://github.com/ceph/ceph/pull/34350>`_, Ricardo Marques)
-* cephadm: Update images used (`pr#34686 <https://github.com/ceph/ceph/pull/34686>`_, Sebastian Wagner)
-* cephadm: ceph-volume: disallow concurrent execution (`pr#34423 <https://github.com/ceph/ceph/pull/34423>`_, Sage Weil)
-* cephadm: rm-cluster clean up /etc/ceph (`pr#34299 <https://github.com/ceph/ceph/pull/34299>`_, Daniel-Pivonka)
-* cephfs,mgr: mgr/volumes: Add interface to get subvolume metadata (`pr#34681 <https://github.com/ceph/ceph/pull/34681>`_, Kotresh HR)
-* cephfs,mgr: mgr: force purge normal ceph entities from service map (`issue#44677 <http://tracker.ceph.com/issues/44677>`_, `pr#34800 <https://github.com/ceph/ceph/pull/34800>`_, Venky Shankar)
-* cephfs,tools: cephfs-journal-tool: correctly parse --dry_run argument (`pr#34804 <https://github.com/ceph/ceph/pull/34804>`_, Milind Changire)
-* cephfs,tools: tools/cephfs: add accounted_rstat/rstat when building file dentry (`pr#34803 <https://github.com/ceph/ceph/pull/34803>`_, Xiubo Li)
-* cephfs: ceph-fuse: link to libfuse3 and pass `-o big_writes` to libfuse if libfuse < 3.0.0 (`pr#34769 <https://github.com/ceph/ceph/pull/34769>`_, Xiubo Li, "Yan, Zheng", Kefu Chai)
-* cephfs: client: reset requested_max_size if file write is not wanted (`pr#34766 <https://github.com/ceph/ceph/pull/34766>`_, "Yan, Zheng")
-* cephfs: mds: fix 'if there is lock cache on dir' check (`pr#34273 <https://github.com/ceph/ceph/pull/34273>`_, "Yan, Zheng")
-* cephfs: mon/FSCommands: Fix 'add_data_pool' command and 'fs new' command (`pr#34775 <https://github.com/ceph/ceph/pull/34775>`_, Ramana Raja)
-* cephfs: qa: install task runs twice with double unwind causing fatal errors (`pr#34912 <https://github.com/ceph/ceph/pull/34912>`_, Patrick Donnelly)
-* core,mon: mon/OSDMonitor: allow trimming maps even if osds are down (`pr#34924 <https://github.com/ceph/ceph/pull/34924>`_, Joao Eduardo Luis)
-* core: ceph-object-corpus: update to octopus (`pr#34797 <https://github.com/ceph/ceph/pull/34797>`_, Josh Durgin)
-* core: mgr/DaemonServer: fetch metadata for new daemons (e.g., mons) (`pr#34416 <https://github.com/ceph/ceph/pull/34416>`_, Sage Weil)
-* core: mon/OSDMonitor: Always tune priority cache manager memory on all mons (`pr#34917 <https://github.com/ceph/ceph/pull/34917>`_, Sridhar Seshasayee)
-* core: mon: calculate min_size on osd pool set size (`pr#34528 <https://github.com/ceph/ceph/pull/34528>`_, Deepika Upadhyay)
-* core: osd/PeeringState: do not trim pg log past last_update_ondisk (`pr#34807 <https://github.com/ceph/ceph/pull/34807>`_, xie xingguo, Samuel Just)
-* core: osd/PrimaryLogPG: fix SPARSE_READ stat (`pr#34809 <https://github.com/ceph/ceph/pull/34809>`_, Yan Jun)
-* devices/simple/scan: Fix string in log statement (`pr#34446 <https://github.com/ceph/ceph/pull/34446>`_, Jan Fajerski)
-* doc: cephadm: Batch backport April (1) (`pr#34554 <https://github.com/ceph/ceph/pull/34554>`_, Matthew Oliver, Sage Weil, Sebastian Wagner, Michael Fritch, Tim, Jeff Layton, Juan Miguel Olmo Martínez, Joshua Schmid)
-* doc: cephadm: Batch backport April (2) (`issue#45029 <http://tracker.ceph.com/issues/45029>`_, `pr#34687 <https://github.com/ceph/ceph/pull/34687>`_, Maran Hidskes, Kiefer Chang, Matthew Oliver, Sebastian Wagner, Andreas Haase, Tim Serong, Zac Dover, Michael Fritch, Joshua Schmid)
-* doc: cephadm: Batch backport April (3) (`pr#34742 <https://github.com/ceph/ceph/pull/34742>`_, Sebastian Wagner, Dimitri Savineau, Michael Fritch)
-* doc: cephadm: batch backport March (`pr#34438 <https://github.com/ceph/ceph/pull/34438>`_, Jan Fajerski, Sebastian Wagner, Daniel-Pivonka, Michael Fritch, Sage Weil)
-* doc: doc/releases/nautilus: restart OSDs to make them bind to v2 addr (`pr#34523 <https://github.com/ceph/ceph/pull/34523>`_, Nathan Cutler)
-* mgr/dashboard: 'Prometheus / All Alerts' page shows progress bar (`pr#34631 <https://github.com/ceph/ceph/pull/34631>`_, Volker Theile)
-* mgr/dashboard: Fix ServiceDetails and PoolDetails unit tests (`pr#34760 <https://github.com/ceph/ceph/pull/34760>`_, Tiago Melo)
-* mgr/dashboard: Fix iSCSI's username and password validation (`pr#34547 <https://github.com/ceph/ceph/pull/34547>`_, Tiago Melo)
-* mgr/dashboard: Improve iSCSI CHAP message (`pr#34630 <https://github.com/ceph/ceph/pull/34630>`_, Ricardo Marques)
-* mgr/dashboard: Prevent iSCSI target recreation when editing controls (`pr#34548 <https://github.com/ceph/ceph/pull/34548>`_, Tiago Melo)
-* mgr/dashboard: RGW auto refresh is not working (`pr#34739 <https://github.com/ceph/ceph/pull/34739>`_, Avan Thakkar)
-* mgr/dashboard: Repair broken grafana panels (`pr#34495 <https://github.com/ceph/ceph/pull/34495>`_, Kristoffer Grönlund)
-* mgr/dashboard: Update translations on octopus (`pr#34309 <https://github.com/ceph/ceph/pull/34309>`_, Sebastian Krah)
-* mgr/dashboard: add crush rule test suite (`pr#34211 <https://github.com/ceph/ceph/pull/34211>`_, Tatjana Dehler)
-* mgr/dashboard: fix API tests to be py3 compatible (`pr#34759 <https://github.com/ceph/ceph/pull/34759>`_, Kefu Chai, Laura Paduano, Alfonso Martínez)
-* mgr/dashboard: fix errors related to frontend service subscriptions (`pr#34467 <https://github.com/ceph/ceph/pull/34467>`_, Alfonso Martínez)
-* mgr/dashboard: fix tasks.mgr.dashboard.test_rgw.RgwBucketTest.test_all (`pr#34708 <https://github.com/ceph/ceph/pull/34708>`_, Alfonso Martínez)
-* mgr/dashboard: lint error on plugins/debug.py (`pr#34625 <https://github.com/ceph/ceph/pull/34625>`_, Volker Theile)
-* mgr/dashboard: shorten "Container ID" and "Container image ID" in Services page (`pr#34648 <https://github.com/ceph/ceph/pull/34648>`_, Volker Theile)
-* mgr/dashboard: use FQDN for failover redirection (`pr#34498 <https://github.com/ceph/ceph/pull/34498>`_, Ernesto Puerta)
-* mgr: mgr/PyModule: fix missing tracebacks in handle_pyerror() (`pr#34626 <https://github.com/ceph/ceph/pull/34626>`_, Tim Serong)
-* mgr: mgr/telegraf: catch FileNotFoundError exception (`pr#34629 <https://github.com/ceph/ceph/pull/34629>`_, Kefu Chai)
-* monitoring: Fix pool capacity incorrect (`pr#34449 <https://github.com/ceph/ceph/pull/34449>`_, James Cheng)
-* monitoring: alert for prediction of disk and pool fill up broken (`pr#34395 <https://github.com/ceph/ceph/pull/34395>`_, Patrick Seidensal)
-* monitoring: fix decimal precision in Grafana %percentages (`pr#34828 <https://github.com/ceph/ceph/pull/34828>`_, Ernesto Puerta)
-* monitoring: root volume full alert fires false positives (`pr#34418 <https://github.com/ceph/ceph/pull/34418>`_, Patrick Seidensal)
-* pybind,rbd: pybind/rbd: ensure image is open before permitting operations (`pr#34425 <https://github.com/ceph/ceph/pull/34425>`_, Mykola Golub)
-* pybind,rbd: pybind/rbd: fix no lockers are obtained, ImageNotFound exception will be output (`pr#34387 <https://github.com/ceph/ceph/pull/34387>`_, zhangdaolong)
-* qa/suites/rados/cephadm/upgrade: start from v15.2.0 (`pr#34440 <https://github.com/ceph/ceph/pull/34440>`_, Sage Weil)
-* qa/tasks/cephadm: add 'roleless' mode (`pr#34407 <https://github.com/ceph/ceph/pull/34407>`_, Sage Weil)
-* rbd,tests: tests: update unmap.t for table spacing changes (`pr#34819 <https://github.com/ceph/ceph/pull/34819>`_, Ilya Dryomov)
-* rbd: rbd-mirror: improved replication statistics (`pr#34810 <https://github.com/ceph/ceph/pull/34810>`_, Mykola Golub, Jason Dillaman)
-* rbd: rbd: ignore tx-only mirror peers when adding new peers (`pr#34638 <https://github.com/ceph/ceph/pull/34638>`_, Jason Dillaman)
-* rgw: Disable prefetch of entire head object when GET request with range header (`pr#34826 <https://github.com/ceph/ceph/pull/34826>`_, Or Friedmann)
-* rgw: pubsub sync module ignores ERR_USER_EXIST (`pr#34825 <https://github.com/ceph/ceph/pull/34825>`_, Casey Bodley)
-* rgw: radosgw-admin: add support for --bucket-id in bucket stats command (`pr#34816 <https://github.com/ceph/ceph/pull/34816>`_, Vikhyat Umrao)
-* rgw: reshard: skip stale bucket id entries from reshard queue (`pr#34734 <https://github.com/ceph/ceph/pull/34734>`_, Abhishek Lekshmanan)
-* rgw: use DEFER_DROP_PRIVILEGES flag unconditionally (`pr#34731 <https://github.com/ceph/ceph/pull/34731>`_, Casey Bodley)
-
-
-v15.2.1 Octopus
-===============
-
-This is the first bugfix release of Ceph Octopus, we recommend all Octopus users
-upgrade. This release fixes an upgrade issue and also has 2 security fixes
-
-Notable Changes
----------------
-
-* issue#44759: Fixed luminous->nautilus->octopus upgrade asserts
-* CVE-2020-1759: Fixed nonce reuse in msgr V2 secure mode
-* CVE-2020-1760: Fixed XSS due to RGW GetObject header-splitting
-
-Changelog
----------
-
-* build/ops: fix ceph_release type to 'stable' (`pr#34194 <https://github.com/ceph/ceph/pull/34194>`_, Sage Weil)
-* build/ops: vstart_runner.py: fix OSError when checking if non-existent path is mounted (`pr#34132 <https://github.com/ceph/ceph/pull/34132>`_, Alfonso Martínez)
-* cephadm: Add alertmanager adopt (`pr#34157 <https://github.com/ceph/ceph/pull/34157>`_, Eric Jackson)
-* cephadm: Add alertmanager sample (`pr#34158 <https://github.com/ceph/ceph/pull/34158>`_, Eric Jackson)
-* cephadm: Fix truncated output of "ceph mgr dump" (`pr#34258 <https://github.com/ceph/ceph/pull/34258>`_, Sebastian Wagner)
-* mgr/cephadm: Add example to run when debugging ssh failures (`pr#34153 <https://github.com/ceph/ceph/pull/34153>`_, Sebastian Wagner)
-* mgr/cephadm: DriveGroupSpec needs to support/ignore _unmanaged_ (`pr#34185 <https://github.com/ceph/ceph/pull/34185>`_, Joshua Schmid)
-* mgr/cephadm: bind grafana to all interfaces (`pr#34191 <https://github.com/ceph/ceph/pull/34191>`_, Sage Weil)
-* mgr/cephadm: fix 'orch ps --refresh' (`pr#34190 <https://github.com/ceph/ceph/pull/34190>`_, Sage Weil)
-* mgr/cephadm: fix 'upgrade start' message when specifying a version (`pr#34186 <https://github.com/ceph/ceph/pull/34186>`_, Sage Weil)
-* mgr/cephadm: include alerts in prometheus deployment (`pr#34155 <https://github.com/ceph/ceph/pull/34155>`_, Sage Weil)
-* mgr/cephadm: point alertmanager at all mgr/dashboard URLs (`pr#34154 <https://github.com/ceph/ceph/pull/34154>`_, Sage Weil)
-* mgr/cephadm: provision nfs-ganesha via orchestrator (`pr#34192 <https://github.com/ceph/ceph/pull/34192>`_, Michael Fritch)
-* mgr/dashboard: Check for missing npm resolutions (`pr#34202 <https://github.com/ceph/ceph/pull/34202>`_, Tiago Melo)
-* mgr/dashboard: NoRebalance flag is added to the Dashboard (`pr#33939 <https://github.com/ceph/ceph/pull/33939>`_, Nizamudeen)
-* mgr/dashboard: correct Orchestrator documentation link (`pr#34212 <https://github.com/ceph/ceph/pull/34212>`_, Tatjana Dehler)
-* mgr/dashboard: do not fail on user creation (CLI) (`pr#34280 <https://github.com/ceph/ceph/pull/34280>`_, Tatjana Dehler)
-* mgr/orch: allow list daemons by service_name (`pr#34160 <https://github.com/ceph/ceph/pull/34160>`_, Kiefer Chang)
-* mgr/prometheus: ceph_pg\_\* metrics contains last value instead of sum across all reported states (`pr#34163 <https://github.com/ceph/ceph/pull/34163>`_, Jacek Suchenia)
-* mgr/rook: Blinking lights (`pr#34199 <https://github.com/ceph/ceph/pull/34199>`_, Juan Miguel Olmo Martínez)
-* osd/PeeringState: drop mimic assert (`pr#34204 <https://github.com/ceph/ceph/pull/34204>`_, Sage Weil)
-* osd/PeeringState: fix pending want_acting vs osd offline race (`pr#34123 <https://github.com/ceph/ceph/pull/34123>`_, xie xingguo)
-* pybind/mgr: fix config_notify handling of default values (`pr#34178 <https://github.com/ceph/ceph/pull/34178>`_, Nathan Cutler)
-* rbd: librbd: fix client backwards compatibility issues (`issue#39450 <http://tracker.ceph.com/issues/39450>`_, `issue#38834 <http://tracker.ceph.com/issues/38834>`_, `pr#34323 <https://github.com/ceph/ceph/pull/34323>`_, Jason Dillaman)
-* tools: ceph-backport.sh: add deprecation warning (`pr#34125 <https://github.com/ceph/ceph/pull/34125>`_, Nathan Cutler)
-
-
-v15.2.0 Octopus
-===============
-
-This is the first stable release of Ceph Octopus.
-
-Major Changes from Nautilus
----------------------------
-
-General
-~~~~~~~
-  
-* A new deployment tool called **cephadm** has been introduced that
-  integrates Ceph daemon deployment and management via containers
-  into the orchestration layer.  For more information see
-  :ref:`cephadm`.
-* Health alerts can now be muted, either temporarily or permanently.
-* Health alerts are now raised for recent Ceph daemons crashes.
-* A simple 'alerts' module has been introduced to send email
-  health alerts for clusters deployed without the benefit of an
-  existing external monitoring infrastructure.
-* :ref:`Packages <packages>` are built for the following distributions:
-
-  - CentOS 8
-  - CentOS 7 (partial--see below)
-  - Ubuntu 18.04 (Bionic)
-  - Debian Buster
-  - :ref:`Container image <containers>` (based on CentOS 8)
-
-  Note that the dashboard, prometheus, and restful manager modules
-  will not work on the CentOS 7 build due to Python 3 module
-  dependencies that are missing in CentOS 7.
-
-  Besides this packages built by the community will also available for the
-  following distros:
-
-  - Fedora (33/rawhide)
-  - openSUSE (15.2, Tumbleweed)
-
-
-Dashboard
-~~~~~~~~~
-
-The :ref:`mgr-dashboard` has gained a lot of new features and functionality:
-
-* UI Enhancements
-
-  - New vertical navigation bar
-  - New unified sidebar: better background task and events notification
-  - Shows all progress mgr module notifications
-  - Multi-select on tables to perform bulk operations
-
-* Dashboard user account security enhancements
-
-  - Disabling/enabling existing user accounts
-  - Clone an existing user role
-  - Users can change their own password
-  - Configurable password policies: Minimum password complexity/length
-    requirements
-  - Configurable password expiration
-  - Change password after first login
-
-New and enhanced management of Ceph features/services:
-
-* OSD/device management
-
-  - List all disks associated with an OSD
-  - Add support for blinking enclosure LEDs via the orchestrator
-  - List all hosts known by the orchestrator
-  - List all disks and their properties attached to a node
-  - Display disk health information (health prediction and SMART data)
-  - Deploy new OSDs on new disks/hosts
-  - Display and allow sorting by an OSD's default device class in the OSD
-    table
-  - Explicitly set/change the device class of an OSD, display and sort OSDs by
-    device class
-
-* Pool management
-
-  - Viewing and setting pool quotas
-  - Define and change per-pool PG autoscaling mode
-
-* RGW management enhancements
-
-  - Enable bucket versioning
-  - Enable MFA support
-  - Select placement target on bucket creation
-
-* CephFS management enhancements
-
-  - CephFS client eviction
-  - CephFS snapshot management
-  - CephFS quota management
-  - Browse CephFS directory
-
-* iSCSI management enhancements
-
-  - Show iSCSI GW status on landing page
-  - Prevent deletion of IQNs with open sessions
-  - Display iSCSI "logged in" info
-
-* Prometheus alert management
-
-  - List configured Prometheus alerts
-
-
-RADOS
-~~~~~
-  
-* Objects can now be brought in sync during recovery by copying only
-  the modified portion of the object, reducing tail latencies during
-  recovery.
-* Ceph will allow recovery below *min_size* for Erasure coded pools,
-  wherever possible.
-* The PG autoscaler feature introduced in Nautilus is enabled for
-  new pools by default, allowing new clusters to autotune *pg num*
-  without any user intervention.  The default values for new pools
-  and RGW/CephFS metadata pools have also been adjusted to perform
-  well for most users.
-* BlueStore has received several improvements and performance
-  updates, including improved accounting for "omap" (key/value)
-  object data by pool, improved cache memory management, and a
-  reduced allocation unit size for SSD devices.  (Note that by
-  default, the first time each OSD starts after upgrading to octopus
-  it will trigger a conversion that may take from a few minutes to a
-  few hours, depending on the amount of stored "omap" data.)
-* Snapshot trimming metadata is now managed in a more efficient and
-  scalable fashion.
-
-
-RBD block storage
-~~~~~~~~~~~~~~~~~
-  
-* Mirroring now supports a new snapshot-based mode that no longer requires
-  the journaling feature and its related impacts in exchange for the loss
-  of point-in-time consistency (it remains crash consistent).
-* Clone operations now preserve the sparseness of the underlying RBD image.
-* The trash feature has been improved to (optionally) automatically
-  move old parent images to the trash when their children are all
-  deleted or flattened.
-* The trash can be configured to automatically purge on a defined schedule.
-* Images can be online re-sparsified to reduce the usage of zeroed extents.
-* The ``rbd-nbd`` tool has been improved to use more modern kernel interfaces.
-* Caching has been improved to be more efficient and performant.
-* ``rbd-mirror`` automatically adjusts its per-image memory usage based
-  upon its memory target.
-* A new persistent read-only caching daemon is available to offload reads from
-  shared parent images.
-
-RGW object storage
-~~~~~~~~~~~~~~~~~~
-  
-* New `Multisite Sync Policy`_ primitives for per-bucket replication. (EXPERIMENTAL)
-* S3 feature support:
-
-  - Bucket Replication (EXPERIMENTAL)
-  - `Bucket Notifications`_ via HTTP/S, AMQP and Kafka
-  - Bucket Tagging
-  - Object Lock
-  - Public Access Block for buckets
-
-* Bucket sharding:
-
-  - Significantly improved listing performance on buckets with many shards.
-  - Dynamic resharding prefers prime shard counts for improved distribution.
-  - Raised the default number of bucket shards to 11.
-
-* Added `HashiCorp Vault Integration`_ for SSE-KMS.
-* Added Keystone token cache for S3 requests.
-
-CephFS distributed file system
-~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-  
-* Inline data support in CephFS has been deprecated and will likely be
-  removed in a future release.
-* MDS daemons can now be assigned to manage a particular file system via the
-  new ``mds_join_fs`` option.
-* MDS now aggressively asks idle clients to trim caps which improves stability
-  when file system load changes.
-* The mgr volumes plugin has received numerous improvements to support CephFS
-  via CSI, including snapshots and cloning.
-* cephfs-shell has had numerous incremental improvements and bug fixes.
-
-
-Upgrading from Mimic or Nautilus
---------------------------------
-
-.. note::
-
-  You can monitor the progress of your upgrade at each stage with the
-  ``ceph versions`` command, which will tell you what ceph version(s) are
-  running for each type of daemon.
-
-Instructions
-~~~~~~~~~~~~
-
-.. highlight:: console
-
-#. Make sure your cluster is stable and healthy (no down or
-   recovering OSDs).  (Optional, but recommended.)
-
-#. Set the ``noout`` flag for the duration of the upgrade. (Optional,
-   but recommended.)::
-
-     # ceph osd set noout
-
-#. Upgrade monitors by installing the new packages and restarting the
-   monitor daemons.  For example, on each monitor host,::
-
-     # systemctl restart ceph-mon.target
-
-   Once all monitors are up, verify that the monitor upgrade is
-   complete by looking for the ``octopus`` string in the mon
-   map.  The command::
-
-     # ceph mon dump | grep min_mon_release
-
-   should report::
-
-     min_mon_release 15 (octopus)
-
-   If it doesn't, that implies that one or more monitors hasn't been
-   upgraded and restarted and/or the quorum does not include all monitors.
-
-#. Upgrade ``ceph-mgr`` daemons by installing the new packages and
-   restarting all manager daemons.  For example, on each manager host,::
-
-     # systemctl restart ceph-mgr.target
-
-   Verify the ``ceph-mgr`` daemons are running by checking ``ceph
-   -s``::
-
-     # ceph -s
-
-     ...
-       services:
-        mon: 3 daemons, quorum foo,bar,baz
-        mgr: foo(active), standbys: bar, baz
-     ...
-
-#. Upgrade all OSDs by installing the new packages and restarting the
-   ceph-osd daemons on all OSD hosts::
-
-     # systemctl restart ceph-osd.target
-
-   Note that the first time each OSD starts, it will do a format
-   conversion to improve the accounting for "omap" data.  This may
-   take a few minutes to as much as a few hours (for an HDD with lots
-   of omap data).  You can disable this automatic conversion with::
-
-     # ceph config set osd bluestore_fsck_quick_fix_on_mount false
-
-   You can monitor the progress of the OSD upgrades with the
-   ``ceph versions`` or ``ceph osd versions`` commands::
-
-     # ceph osd versions
-     {
-        "ceph version 13.2.5 (...) mimic (stable)": 12,
-        "ceph version 15.2.0 (...) octopus (stable)": 22,
-     }
-
-#. Upgrade all CephFS MDS daemons.  For each CephFS file system,
-
-   #. Reduce the number of ranks to 1.  (Make note of the original
-      number of MDS daemons first if you plan to restore it later.)::
-
-       # ceph status
-       # ceph fs set <fs_name> max_mds 1
-
-   #. Wait for the cluster to deactivate any non-zero ranks by
-      periodically checking the status::
-
-       # ceph status
-
-   #. Take all standby MDS daemons offline on the appropriate hosts with::
-
-       # systemctl stop ceph-mds@<daemon_name>
-
-   #. Confirm that only one MDS is online and is rank 0 for your FS::
-
-       # ceph status
-
-   #. Upgrade the last remaining MDS daemon by installing the new
-      packages and restarting the daemon::
-
-        # systemctl restart ceph-mds.target
-
-   #. Restart all standby MDS daemons that were taken offline::
-
-       # systemctl start ceph-mds.target
-
-   #. Restore the original value of ``max_mds`` for the volume::
-
-       # ceph fs set <fs_name> max_mds <original_max_mds>
-
-#. Upgrade all radosgw daemons by upgrading packages and restarting
-   daemons on all hosts::
-
-     # systemctl restart ceph-radosgw.target
-
-#. Complete the upgrade by disallowing pre-Octopus OSDs and enabling
-   all new Octopus-only functionality::
-
-     # ceph osd require-osd-release octopus
-
-#. If you set ``noout`` at the beginning, be sure to clear it with::
-
-     # ceph osd unset noout
-
-#. Verify the cluster is healthy with ``ceph health``.
-
-   If your CRUSH tunables are older than Hammer, Ceph will now issue a
-   health warning.  If you see a health alert to that effect, you can
-   revert this change with::
-
-     ceph config set mon mon_crush_min_required_version firefly
-
-   If Ceph does not complain, however, then we recommend you also
-   switch any existing CRUSH buckets to straw2, which was added back
-   in the Hammer release.  If you have any 'straw' buckets, this will
-   result in a modest amount of data movement, but generally nothing
-   too severe.::
-
-     ceph osd getcrushmap -o backup-crushmap
-     ceph osd crush set-all-straw-buckets-to-straw2
-
-   If there are problems, you can easily revert with::
-
-     ceph osd setcrushmap -i backup-crushmap
-
-   Moving to 'straw2' buckets will unlock a few recent features, like
-   the `crush-compat` :ref:`balancer <balancer>` mode added back in Luminous.
-
-
-#. If you are upgrading from Mimic, or did not already do so when you
-   upgraded to Nautlius, we recommened you enable the new :ref:`v2
-   network protocol <msgr2>`, issue the following command::
-
-     ceph mon enable-msgr2
-
-   This will instruct all monitors that bind to the old default port
-   6789 for the legacy v1 protocol to also bind to the new 3300 v2
-   protocol port.  To see if all monitors have been updated,::
-
-     ceph mon dump
-
-   and verify that each monitor has both a ``v2:`` and ``v1:`` address
-   listed.
-
-#. Consider enabling the :ref:`telemetry module <telemetry>` to send
-   anonymized usage statistics and crash information to the Ceph
-   upstream developers.  To see what would be reported (without actually
-   sending any information to anyone),::
-
-     ceph mgr module enable telemetry
-     ceph telemetry show
-
-   If you are comfortable with the data that is reported, you can opt-in to
-   automatically report the high-level cluster metadata with::
-
-     ceph telemetry on
-
-   For more information about the telemetry module, see :ref:`the
-   documentation <telemetry>`.
-
-
-Upgrading from pre-Mimic releases (like Luminous)
--------------------------------------------------
-
-You *must* first upgrade to Mimic (13.2.z) or Nautilus (14.2.z) before
-upgrading to Octopus.
-
-
-Upgrade compatibility notes
----------------------------
-
-* Starting with Octopus, there is now a separate repository directory
-  for each version on `download.ceph.com` (e.g., ``rpm-15.2.0`` and
-  ``debian-15.2.0``).  The traditional package directory that is named
-  after the release (e.g., ``rpm-octopus`` and ``debian-octopus``) is
-  now a symlink to the most recently bug fix version for that release.
-  We no longer generate a single repository that combines all bug fix
-  versions for a single named release.
-
-* The RGW "num_rados_handles" has been removed.
-  If you were using a value of "num_rados_handles" greater than 1
-  multiply your current "objecter_inflight_ops" and
-  "objecter_inflight_op_bytes" parameters by the old
-  "num_rados_handles" to get the same throttle behavior.
-
-* Ceph now packages python bindings for python3.6 instead of
-  python3.4, because python3 in EL7/EL8 is now using python3.6
-  as the native python3. see the `announcement`_
-  for more details on the background of this change.
-
-* librbd now uses a write-around cache policy be default,
-  replacing the previous write-back cache policy default.
-  This cache policy allows librbd to immediately complete
-  write IOs while they are still in-flight to the OSDs.
-  Subsequent flush requests will ensure all in-flight
-  write IOs are completed prior to completing. The
-  librbd cache policy can be controlled via a new
-  "rbd_cache_policy" configuration option.
-
-* librbd now includes a simple IO scheduler which attempts to
-  batch together multiple IOs against the same backing RBD
-  data block object. The librbd IO scheduler policy can be
-  controlled via a new "rbd_io_scheduler" configuration
-  option.
-
-* RGW: radosgw-admin introduces two subcommands that allow the
-  managing of expire-stale objects that might be left behind after a
-  bucket reshard in earlier versions of RGW. One subcommand lists such
-  objects and the other deletes them. Read the troubleshooting section
-  of the dynamic resharding docs for details.
-
-* RGW: Bucket naming restrictions have changed and likely to cause
-  InvalidBucketName errors. We recommend to set ``rgw_relaxed_s3_bucket_names``
-  option to true as a workaround.
-
-* In the Zabbix Mgr Module there was a typo in the key being send
-  to Zabbix for PGs in backfill_wait state. The key that was sent
-  was 'wait_backfill' and the correct name is 'backfill_wait'.
-  Update your Zabbix template accordingly so that it accepts the
-  new key being send to Zabbix.
-
-* zabbix plugin for ceph manager now includes osd and pool
-  discovery. Update of zabbix_template.xml is needed
-  to receive per-pool (read/write throughput, diskspace usage)
-  and per-osd (latency, status, pgs) statistics
-
-* The format of all date + time stamps has been modified to fully
-  conform to ISO 8601.  The old format (``YYYY-MM-DD
-  HH:MM:SS.ssssss``) excluded the ``T`` separator between the date and
-  time and was rendered using the local time zone without any explicit
-  indication.  The new format includes the separator as well as a
-  ``+nnnn`` or ``-nnnn`` suffix to indicate the time zone, or a ``Z``
-  suffix if the time is UTC.  For example,
-  ``2019-04-26T18:40:06.225953+0100``.
-
-  Any code or scripts that was previously parsing date and/or time
-  values from the JSON or XML structure CLI output should be checked
-  to ensure it can handle ISO 8601 conformant values.  Any code
-  parsing date or time values from the unstructured human-readable
-  output should be modified to parse the structured output instead, as
-  the human-readable output may change without notice.
-
-* The ``bluestore_no_per_pool_stats_tolerance`` config option has been
-  replaced with ``bluestore_fsck_error_on_no_per_pool_stats``
-  (default: false).  The overall default behavior has not changed:
-  fsck will warn but not fail on legacy stores, and repair will
-  convert to per-pool stats.
-
-* The disaster-recovery related 'ceph mon sync force' command has been
-  replaced with 'ceph daemon <...> sync_force'.
-
-* The ``osd_recovery_max_active`` option now has
-  ``osd_recovery_max_active_hdd`` and ``osd_recovery_max_active_ssd``
-  variants, each with different default values for HDD and SSD-backed
-  OSDs, respectively.  By default ``osd_recovery_max_active`` now
-  defaults to zero, which means that the OSD will conditionally use
-  the HDD or SSD option values.  Administrators who have customized
-  this value may want to consider whether they have set this to a
-  value similar to the new defaults (3 for HDDs and 10 for SSDs) and,
-  if so, remove the option from their configuration entirely.
-
-* monitors now have a `ceph osd info` command that will provide information
-  on all osds, or provided osds, thus simplifying the process of having to
-  parse `osd dump` for the same information.
-
-* The structured output of ``ceph status`` or ``ceph -s`` is now more
-  concise, particularly the `mgrmap` and `monmap` sections, and the
-  structure of the `osdmap` section has been cleaned up.
-
-* A health warning is now generated if the average osd heartbeat ping
-  time exceeds a configurable threshold for any of the intervals
-  computed.  The OSD computes 1 minute, 5 minute and 15 minute
-  intervals with average, minimum and maximum values.  New
-  configuration option ``mon_warn_on_slow_ping_ratio`` specifies a
-  percentage of ``osd_heartbeat_grace`` to determine the threshold.  A
-  value of zero disables the warning.  New configuration option
-  ``mon_warn_on_slow_ping_time`` specified in milliseconds over-rides
-  the computed value, causes a warning when OSD heartbeat pings take
-  longer than the specified amount.  New admin command ``ceph daemon
-  mgr.# dump_osd_network [threshold]`` command will list all
-  connections with a ping time longer than the specified threshold or
-  value determined by the config options, for the average for any of
-  the 3 intervals.  New admin command ``ceph daemon osd.#
-  dump_osd_network [threshold]`` will do the same but only including
-  heartbeats initiated by the specified OSD.
-
-* Inline data support for CephFS has been deprecated. When setting the flag,
-  users will see a warning to that effect, and enabling it now requires the
-  ``--yes-i-really-really-mean-it`` flag. If the MDS is started on a
-  filesystem that has it enabled, a health warning is generated. Support for
-  this feature will be removed in a future release.
-
-* ``ceph {set,unset} full`` is not supported anymore. We have been using
-  ``full`` and ``nearfull`` flags in OSD map for tracking the fullness status
-  of a cluster back since the Hammer release, if the OSD map is marked ``full``
-  all write operations will be blocked until this flag is removed. In the
-  Infernalis release and Linux kernel 4.7 client, we introduced the per-pool
-  full/nearfull flags to track the status for a finer-grained control, so the
-  clients will hold the write operations if either the cluster-wide ``full``
-  flag or the per-pool ``full`` flag is set. This was a compromise, as we
-  needed to support the cluster with and without per-pool ``full`` flags
-  support. But this practically defeated the purpose of introducing the
-  per-pool flags. So, in the Mimic release, the new flags finally took the
-  place of their cluster-wide counterparts, as the monitor started removing
-  these two flags from OSD map. So the clients of Infernalis and up can benefit
-  from this change, as they won't be blocked by the full pools which they are
-  not writing to. In this release, ``ceph {set,unset} full`` is now considered
-  as an invalid command. And the clients will continue honoring both the
-  cluster-wide and per-pool flags to be backward comaptible with pre-infernalis
-  clusters.
-
-* The telemetry module now reports more information.
-
-  First, there is a new 'device' channel, enabled by default, that
-  will report anonymized hard disk and SSD health metrics to
-  telemetry.ceph.com in order to build and improve device failure
-  prediction algorithms.  If you are not comfortable sharing device
-  metrics, you can disable that channel first before re-opting-in::
-
-    ceph config set mgr mgr/telemetry/channel_device false
-
-  Second, we now report more information about CephFS file systems,
-  including:
-
-  - how many MDS daemons (in total and per file system)
-  - which features are (or have been) enabled
-  - how many data pools
-  - approximate file system age (year + month of creation)
-  - how many files, bytes, and snapshots
-  - how much metadata is being cached
-
-  We have also added:
-
-  - which Ceph release the monitors are running
-  - whether msgr v1 or v2 addresses are used for the monitors
-  - whether IPv4 or IPv6 addresses are used for the monitors
-  - whether RADOS cache tiering is enabled (and which mode)
-  - whether pools are replicated or erasure coded, and
-    which erasure code profile plugin and parameters are in use
-  - how many hosts are in the cluster, and how many hosts have each type of daemon
-  - whether a separate OSD cluster network is being used
-  - how many RBD pools and images are in the cluster, and how many pools have RBD mirroring enabled
-  - how many RGW daemons, zones, and zonegroups are present; which RGW frontends are in use
-  - aggregate stats about the CRUSH map, like which algorithms are used, how
-    big buckets are, how many rules are defined, and what tunables are in
-    use
-
-  If you had telemetry enabled, you will need to re-opt-in with::
-
-    ceph telemetry on
-
-  You can view exactly what information will be reported first with::
-
-    $ ceph telemetry show        # see everything
-    $ ceph telemetry show basic  # basic cluster info (including all of the new info)
-
-* Following invalid settings now are not tolerated anymore
-  for the command `ceph osd erasure-code-profile set xxx`.
-  * invalid `m` for "reed_sol_r6_op" erasure technique
-  * invalid `m` and invalid `w` for "liber8tion" erasure technique
-
-* New OSD daemon command dump_recovery_reservations which reveals the
-  recovery locks held (in_progress) and waiting in priority queues.
-
-* New OSD daemon command dump_scrub_reservations which reveals the
-  scrub reservations that are held for local (primary) and remote (replica) PGs.
-
-* Previously, ``ceph tell mgr ...`` could be used to call commands
-  implemented by mgr modules.  This is no longer supported.  Since
-  luminous, using ``tell`` has not been necessary: those same commands
-  are also accessible without the ``tell mgr`` portion (e.g., ``ceph
-  tell mgr influx foo`` is the same as ``ceph influx foo``.  ``ceph
-  tell mgr ...`` will now call admin commands--the same set of
-  commands accessible via ``ceph daemon ...`` when you are logged into
-  the appropriate host.
-
-* The ``ceph tell`` and ``ceph daemon`` commands have been unified,
-  such that all such commands are accessible via either interface.
-  Note that ceph-mgr tell commands are accessible via either ``ceph
-  tell mgr ...`` or ``ceph tell mgr.<id> ...``, and it is only
-  possible to send tell commands to the active daemon (the standbys do
-  not accept incoming connections over the network).
-
-* Ceph will now issue a health warning if a RADOS pool as a ``pg_num``
-  value that is not a power of two.  This can be fixed by adjusting
-  the pool to a nearby power of two::
-
-    ceph osd pool set <pool-name> pg_num <new-pg-num>
-
-  Alternatively, the warning can be silenced with::
-
-    ceph config set global mon_warn_on_pool_pg_num_not_power_of_two false
-
-* The format of MDSs in ``ceph fs dump`` has changed.
-
-* The ``mds_cache_size`` config option is completely removed. Since luminous,
-  the ``mds_cache_memory_limit`` config option has been preferred to configure
-  the MDS's cache limits.
-
-* The ``pg_autoscale_mode`` is now set to ``on`` by default for newly
-  created pools, which means that Ceph will automatically manage the
-  number of PGs.  To change this behavior, or to learn more about PG
-  autoscaling, see :ref:`pg-autoscaler`.  Note that existing pools in
-  upgraded clusters will still be set to ``warn`` by default.
-
-* The pool parameter ``target_size_ratio``, used by the pg autoscaler,
-  has changed meaning. It is now normalized across pools, rather than
-  specifying an absolute ratio. For details, see :ref:`pg-autoscaler`.
-  If you have set target size ratios on any pools, you may want to set
-  these pools to autoscale ``warn`` mode to avoid data movement during
-  the upgrade::
-
-    ceph osd pool set <pool-name> pg_autoscale_mode warn
-
-* The ``upmap_max_iterations`` config option of mgr/balancer has been
-  renamed to ``upmap_max_optimizations`` to better match its behaviour.
-
-* ``mClockClientQueue`` and ``mClockClassQueue`` OpQueue
-  implementations have been removed in favor of of a single
-  ``mClockScheduler`` implementation of a simpler OSD interface.
-  Accordingly, the ``osd_op_queue_mclock*`` family of config options
-  has been removed in favor of the ``osd_mclock_scheduler*`` family
-  of options.
-
-* The config subsystem now searches dot ('.') delimited prefixes for
-  options.  That means for an entity like ``client.foo.bar``, its
-  overall configuration will be a combination of the global options,
-  ``client``, ``client.foo``, and ``client.foo.bar``.  Previously,
-  only global, ``client``, and ``client.foo.bar`` options would apply.
-  This change may affect the configuration for clients that include a
-  ``.`` in their name.
-
-* MDS default cache memory limit is now 4GB.
-
-* The behaviour of the ``-o`` argument to the rados tool has been 
-  reverted to its original behaviour of indicating an output file. This 
-  reverts it to a more consistent behaviour when compared to other 
-  tools. Specifying obect size is now accomplished by using an 
-  upper-case O ``-O``.
-
-* In certain rare cases, OSDs would self-classify themselves as type
-  'nvme' instead of 'hdd' or 'ssd'.  This appears to be limited to
-  cases where BlueStore was deployed with older versions of ceph-disk,
-  or manually without ceph-volume and LVM.  Going forward, the OSD
-  will limit itself to only 'hdd' and 'ssd' (or whatever device class
-  the user manually specifies).
-
-* RGW: a mismatch between the bucket notification documentation and 
-  the actual message format was fixed. This means that any endpoints 
-  receiving bucket notification, will now receive the same notifications 
-  inside an JSON array named 'Records'. Note that this does not affect 
-  pulling bucket notification from a subscription in a 'pubsub' zone, 
-  as these are already wrapped inside that array.
-
-* The configuration value ``osd_calc_pg_upmaps_max_stddev`` used for 
-  upmap balancing has been removed. Instead use the mgr balancer config
-  ``upmap_max_deviation`` which now is an integer number of PGs of 
-  deviation from the target PGs per OSD.  This can be set with a command 
-  like ``ceph config set mgr mgr/balancer/upmap_max_deviation 2``. The 
-  default ``upmap_max_deviation`` is 1.  There are situations where 
-  crush rules would not allow a pool to ever have completely balanced 
-  PGs. For example, if crush requires 1 replica on each of 3 racks, but
-  there are fewer OSDs in one of the racks. In those cases, the 
-  configuration value can be increased.
-
-* MDS daemons can now be assigned to manage a particular file system via the
-  new ``mds_join_fs`` option. The monitors will try to use only MDS for a file
-  system with mds_join_fs equal to the file system name (strong affinity).
-  Monitors may also deliberately failover an active MDS to a standby when the
-  cluster is otherwise healthy if the standby has stronger affinity.
-
-* RGW Multisite: A new fine grained bucket-granularity policy configuration
-  system has been introduced and it supersedes the previous coarse zone sync
-  configuration (specifically the ``sync_from`` and ``sync_from_all`` fields
-  in the zonegroup configuration. New configuration should only be configured
-  after all relevant zones in the zonegroup have been upgraded.
-
-* RGW S3: Support has been added for BlockPublicAccess set of APIs at a bucket
-  level, currently blocking/ignoring public acls & policies are supported.
-  User/Account level APIs are planned to be added in the future
-
-* RGW: The default number of bucket index shards for new buckets was raised
-  from 1 to 11 to increase the amount of write throughput for small buckets
-  and delay the onset of dynamic resharding. This change only affects new
-  deployments/zones. To change this default value on existing deployments,
-  use ``radosgw-admin zonegroup modify --bucket-index-max-shards=11``.
-  If the zonegroup is part of a realm, the change must be committed with
-  ``radosgw-admin period update --commit`` - otherwise the change will take
-  effect after radosgws are restarted.
-
-
-Changelog
----------
-* .gitignore: add more stuff (`pr#29568 <https://github.com/ceph/ceph/pull/29568>`_, Volker Theile)
-* async/dpdk: fix compile errors from ceph::mutex update (`pr#30066 <https://github.com/ceph/ceph/pull/30066>`_, yehu)
-* bluestore,build/ops,common,rgw: Enable _GLIBCXX_ASSERTIONS and fix unittest problems (`pr#32387 <https://github.com/ceph/ceph/pull/32387>`_, Samuel Just)
-* bluestore,cephfs,common,core,mgr,mon,rbd,rgw: src/: s/Mutex/ceph::mutex/ (`pr#29113 <https://github.com/ceph/ceph/pull/29113>`_, Kefu Chai)
-* bluestore,common,core,mgr,rbd: common/RefCountedObj: cleanup con/des (`pr#29672 <https://github.com/ceph/ceph/pull/29672>`_, Patrick Donnelly)
-* bluestore,common,core,rgw: common, \\*: kill the bl::last_p member. Use iterator instead (`pr#32831 <https://github.com/ceph/ceph/pull/32831>`_, Radoslaw Zarzynski)
-* bluestore,common: os/bluestore: s/align_down/p2align/ (`pr#29379 <https://github.com/ceph/ceph/pull/29379>`_, Kefu Chai)
-* bluestore,core: common/options: Set bluestore min_alloc size to 4K (`pr#30698 <https://github.com/ceph/ceph/pull/30698>`_, Mark Nelson)
-* bluestore,core: common/options: Set concurrent bluestore rocksdb compactions to 2 (`pr#29027 <https://github.com/ceph/ceph/pull/29027>`_, Mark Nelson)
-* bluestore,core: mon,osd: only use new per-pool usage stats once \\*all\\* osds are reporting (`pr#28978 <https://github.com/ceph/ceph/pull/28978>`_, Sage Weil)
-* bluestore,core: os/bluestore,mon: segregate omap keys by pool; report via df (`pr#29292 <https://github.com/ceph/ceph/pull/29292>`_, Sage Weil)
-* bluestore,core: os/bluestore/BlueFS: explicit check for too-granular allocations (`pr#33027 <https://github.com/ceph/ceph/pull/33027>`_, Sage Weil)
-* bluestore,core: os/bluestore/bluefs_types: consolidate contiguous extents (`pr#28821 <https://github.com/ceph/ceph/pull/28821>`_, Sage Weil)
-* bluestore,core: os/bluestore/KernelDevice: fix RW_IO_MAX constant (`pr#29577 <https://github.com/ceph/ceph/pull/29577>`_, Sage Weil)
-* bluestore,core: os/bluestore: do not set osd_memory_target default from cgroup limit (`pr#29581 <https://github.com/ceph/ceph/pull/29581>`_, Sage Weil)
-* bluestore,core: os/bluestore: drop (semi-broken) nvme automatic class (`pr#31796 <https://github.com/ceph/ceph/pull/31796>`_, Sage Weil)
-* bluestore,core: os/bluestore: expand lttng tracepoints, improve fio_ceph_objectstore backend (`pr#29674 <https://github.com/ceph/ceph/pull/29674>`_, Samuel Just)
-* bluestore,core: os/bluestore: Keep separate onode cache pinned list (`pr#30964 <https://github.com/ceph/ceph/pull/30964>`_, Mark Nelson)
-* bluestore,core: os/bluestore: prefix omap of temp objects by real pool (`pr#29717 <https://github.com/ceph/ceph/pull/29717>`_, xie xingguo)
-* bluestore,core: os/bluestore: Unify on preadv for io_uring and future refactor (`pr#28025 <https://github.com/ceph/ceph/pull/28025>`_, Mark Nelson)
-* bluestore,core: os/bluestore: v.2 framework for more intelligent DB space usage (`pr#29687 <https://github.com/ceph/ceph/pull/29687>`_, Igor Fedotov)
-* bluestore,mgr,rgw: rgw,bluestore: fixes to address failures from check-generated.sh (`pr#29862 <https://github.com/ceph/ceph/pull/29862>`_, Kefu Chai)
-* bluestore,mon: os/bluestore: create the tail when first set FLAG_OMAP (`pr#27627 <https://github.com/ceph/ceph/pull/27627>`_, Tao Ning)
-* bluestore,tools: os/bluestore/bluestore-tool: minor fixes around migrate (`pr#28651 <https://github.com/ceph/ceph/pull/28651>`_, Igor Fedotov)
-* bluestore,tools: tools/ceph-objectstore-tool: implement onode metadata dump (`pr#27869 <https://github.com/ceph/ceph/pull/27869>`_, Igor Fedotov)
-* bluestore,tools: tools/ceph-objectstore-tool: introduce list-slow-omap command (`pr#27985 <https://github.com/ceph/ceph/pull/27985>`_, Igor Fedotov)
-* bluestore: BlueFS: prevent BlueFS::dirty_files from being leaked when syncing metadata (`pr#30631 <https://github.com/ceph/ceph/pull/30631>`_, Xuehan Xu)
-* bluestore: bluestore/allocator: Ageing test for bluestore allocators (`pr#22574 <https://github.com/ceph/ceph/pull/22574>`_, Adam Kupczyk)
-* bluestore: bluestore/bdev: initialize size when creating object (`pr#29968 <https://github.com/ceph/ceph/pull/29968>`_, Willem Jan Withagen)
-* bluestore: bluestore/bluefs: make accounting resiliant to unlock() (`pr#32584 <https://github.com/ceph/ceph/pull/32584>`_, Adam Kupczyk)
-* bluestore: common/options.cc: change default value of bluestore_fsck_on_mount_deep to false (`pr#29408 <https://github.com/ceph/ceph/pull/29408>`_, Neha Ojha)
-* bluestore: common/options: bluestore 64k min_alloc_size for HDD (`pr#32809 <https://github.com/ceph/ceph/pull/32809>`_, Sage Weil)
-* bluestore: NVMEDevice: Remove the unnecessary aio_wait in sync read (`pr#33597 <https://github.com/ceph/ceph/pull/33597>`_, Ziye Yang)
-* bluestore: NVMEDevice: Split the read I/O if the io size is large (`pr#32647 <https://github.com/ceph/ceph/pull/32647>`_, Ziye Yang)
-* bluestore: os/bluestore/Blue(FS|Store): uint64_t alloc_size (`pr#32484 <https://github.com/ceph/ceph/pull/32484>`_, Bernd Zeimetz)
-* bluestore: os/bluestore/BlueFS: clear newly allocated space for WAL logs (`pr#30549 <https://github.com/ceph/ceph/pull/30549>`_, Adam Kupczyk)
-* bluestore: os/bluestore/BlueFS: fixed printing stats (`pr#33235 <https://github.com/ceph/ceph/pull/33235>`_, Adam Kupczyk)
-* bluestore: os/bluestore/BlueFS: less verbose about alloc adjustments (`pr#33512 <https://github.com/ceph/ceph/pull/33512>`_, Sage Weil)
-* bluestore: os/bluestore/BlueFS: Move bluefs alloc size initialization log message to log level 1 (`pr#29822 <https://github.com/ceph/ceph/pull/29822>`_, Vikhyat Umrao)
-* bluestore: os/bluestore/BlueFS: replace flush_log with sync_metadata (`pr#32563 <https://github.com/ceph/ceph/pull/32563>`_, Jianpeng Ma)
-* bluestore: os/bluestore/BlueFS: use 64K alloc_size on the shared device (`pr#29537 <https://github.com/ceph/ceph/pull/29537>`_, Sage Weil, Neha Ojha)
-* bluestore: os/bluestore/BlueStore.cc: set priorities for compression stats (`pr#31959 <https://github.com/ceph/ceph/pull/31959>`_, Neha Ojha)
-* bluestore: os/bluestore/spdk: Fix the overflow error of parsing spdk coremask (`pr#32440 <https://github.com/ceph/ceph/pull/32440>`_, Hu Ye, Chunsong Feng, luo rixin)
-* bluestore: os/bluestore: Actually wait until completion in write_sync (`pr#26909 <https://github.com/ceph/ceph/pull/26909>`_, Vitaliy Filippov)
-* bluestore: os/bluestore: add bluestore_bluefs_max_free; smooth space balancing a bit (`pr#30231 <https://github.com/ceph/ceph/pull/30231>`_, xie xingguo)
-* bluestore: os/bluestore: add slow op detection for collection_listing (`issue#40741 <http://tracker.ceph.com/issues/40741>`_, `pr#29085 <https://github.com/ceph/ceph/pull/29085>`_, Igor Fedotov)
-* bluestore: os/bluestore: allocate Task on stack (`pr#33358 <https://github.com/ceph/ceph/pull/33358>`_, Jun Su)
-* bluestore: os/bluestore: apply garbage collection against excessive blob count growth (`pr#28229 <https://github.com/ceph/ceph/pull/28229>`_, Igor Fedotov)
-* bluestore: os/bluestore: AVL-tree & extent - based space allocator (`pr#30897 <https://github.com/ceph/ceph/pull/30897>`_, Adam Kupczyk, xie xingguo, Kefu Chai)
-* bluestore: os/bluestore: avoid length overflow in extents returned by Stupid (`issue#40703 <http://tracker.ceph.com/issues/40703>`_, `pr#28945 <https://github.com/ceph/ceph/pull/28945>`_, Igor Fedotov)
-* bluestore: os/bluestore: avoid race between split_cache and get/put pin/unpin (`pr#32665 <https://github.com/ceph/ceph/pull/32665>`_, Sage Weil)
-* bluestore: os/bluestore: avoid unnecessary notify (`pr#29345 <https://github.com/ceph/ceph/pull/29345>`_, Jianpeng Ma)
-* bluestore: os/bluestore: be more verbose doing bluefs log replay (`pr#27615 <https://github.com/ceph/ceph/pull/27615>`_, Igor Fedotov)
-* bluestore: os/bluestore: bluefs_preextend_wal_files=true (`pr#28322 <https://github.com/ceph/ceph/pull/28322>`_, Sage Weil)
-* bluestore: os/bluestore: call fault_range prior to looking for blob to reuse (`pr#27444 <https://github.com/ceph/ceph/pull/27444>`_, Igor Fedotov)
-* bluestore: os/bluestore: check bluefs allocations on log replay (`pr#31513 <https://github.com/ceph/ceph/pull/31513>`_, Igor Fedotov)
-* bluestore: os/bluestore: check return value of func _open_db_and_around (`pr#27477 <https://github.com/ceph/ceph/pull/27477>`_, Jianpeng Ma)
-* bluestore: os/bluestore: cleanup around allocator calls (`pr#29068 <https://github.com/ceph/ceph/pull/29068>`_, Igor Fedotov)
-* bluestore: os/bluestore: cleanups (`pr#30737 <https://github.com/ceph/ceph/pull/30737>`_, Kefu Chai)
-* bluestore: os/bluestore: consolidate extents from the same device only (`pr#31621 <https://github.com/ceph/ceph/pull/31621>`_, Igor Fedotov)
-* bluestore: os/bluestore: correctly measure deferred writes into new blobs (`issue#38816 <http://tracker.ceph.com/issues/38816>`_, `pr#27789 <https://github.com/ceph/ceph/pull/27789>`_, Sage Weil)
-* bluestore: os/bluestore: deferred IO notify and locking optimization (`pr#29522 <https://github.com/ceph/ceph/pull/29522>`_, Jianpeng Ma)
-* bluestore: os/bluestore: do not check osd_max_object_size in _open_path() (`pr#26176 <https://github.com/ceph/ceph/pull/26176>`_, Igor Fedotov)
-* bluestore: os/bluestore: do not mark per_pool_omap updated unless we fixed it (`pr#31167 <https://github.com/ceph/ceph/pull/31167>`_, Sage Weil)
-* bluestore: os/bluestore: dont round_up_to in apply_for_bitset_range (`pr#31903 <https://github.com/ceph/ceph/pull/31903>`_, Jianpeng Ma)
-* bluestore: os/bluestore: dump onode before no available blob id abort (`pr#27911 <https://github.com/ceph/ceph/pull/27911>`_, Igor Fedotov)
-* bluestore: os/bluestore: dump onode that has too many spanning blobs (`pr#28010 <https://github.com/ceph/ceph/pull/28010>`_, Igor Fedotov)
-* bluestore: os/bluestore: fix >2GB writes (`pr#27871 <https://github.com/ceph/ceph/pull/27871>`_, Sage Weil, kungf)
-* bluestore: os/bluestore: fix bitmap allocator issues (`pr#26939 <https://github.com/ceph/ceph/pull/26939>`_, Igor Fedotov)
-* bluestore: os/bluestore: fix duplicate allocations in bmap allocator (`issue#40080 <http://tracker.ceph.com/issues/40080>`_, `pr#28496 <https://github.com/ceph/ceph/pull/28496>`_, Igor Fedotov)
-* bluestore: os/bluestore: fix duplicative and misleading debug in KernelDevice::open() (`pr#28630 <https://github.com/ceph/ceph/pull/28630>`_, Radoslaw Zarzynski)
-* bluestore: os/bluestore: fix for FreeBSD iocb structure (`pr#27458 <https://github.com/ceph/ceph/pull/27458>`_, Willem Jan Withagen)
-* bluestore: os/bluestore: fix invalid stray shared blob detection in fsck (`pr#30616 <https://github.com/ceph/ceph/pull/30616>`_, Igor Fedotov)
-* bluestore: os/bluestore: fix missing discard in BlueStore::_kv_sync_thread (`pr#27843 <https://github.com/ceph/ceph/pull/27843>`_, Junhui Tang)
-* bluestore: os/bluestore: fix origin reference in logging slow ops (`pr#27951 <https://github.com/ceph/ceph/pull/27951>`_, Igor Fedotov)
-* bluestore: os/bluestore: fix out-of-bound access in bmap allocator (`pr#27691 <https://github.com/ceph/ceph/pull/27691>`_, Igor Fedotov)
-* bluestore: os/bluestore: fix per-pool omap repair (`pr#32925 <https://github.com/ceph/ceph/pull/32925>`_, Igor Fedotov)
-* bluestore: os/bluestore: fix space balancing overflow (`pr#30255 <https://github.com/ceph/ceph/pull/30255>`_, xie xingguo)
-* bluestore: os/bluestore: fix wakeup bug (`pr#31931 <https://github.com/ceph/ceph/pull/31931>`_, Jianpeng Ma)
-* bluestore: os/bluestore: introduce legacy statfs and dev size mismatch alerts (`pr#27519 <https://github.com/ceph/ceph/pull/27519>`_, Sage Weil, Igor Fedotov)
-* bluestore: os/bluestore: introduce new io_uring IO engine (`pr#27392 <https://github.com/ceph/ceph/pull/27392>`_, Roman Penyaev)
-* bluestore: os/bluestore: its better to erase spanning blob once (`pr#29238 <https://github.com/ceph/ceph/pull/29238>`_, Xiangyang Yu)
-* bluestore: os/bluestore: load OSD all compression settings unconditionally (`issue#40480 <http://tracker.ceph.com/issues/40480>`_, `pr#28688 <https://github.com/ceph/ceph/pull/28688>`_, Igor Fedotov)
-* bluestore: os/bluestore: log allocation stats on a daily basis (`pr#33565 <https://github.com/ceph/ceph/pull/33565>`_, Igor Fedotov)
-* bluestore: os/bluestore: memorize layout of BlueFS on management (`pr#30593 <https://github.com/ceph/ceph/pull/30593>`_, Radoslaw Zarzynski)
-* bluestore: os/bluestore: Merge deferred_finisher and finisher (`pr#29623 <https://github.com/ceph/ceph/pull/29623>`_, Jianpeng Ma)
-* bluestore: os/bluestore: minor improvements/cleanup around allocator (`pr#29738 <https://github.com/ceph/ceph/pull/29738>`_, Igor Fedotov)
-* bluestore: os/bluestore: more aggressive deferred submit when onode trim skipping (`issue#21531 <http://tracker.ceph.com/issues/21531>`_, `pr#25697 <https://github.com/ceph/ceph/pull/25697>`_, Zengran Zhang)
-* bluestore: os/bluestore: more smart allocator dump when lacking space for bluefs (`issue#40623 <http://tracker.ceph.com/issues/40623>`_, `pr#28845 <https://github.com/ceph/ceph/pull/28845>`_, Igor Fedotov)
-* bluestore: os/bluestore: new bluestore_debug_enforce_settings option (`pr#27132 <https://github.com/ceph/ceph/pull/27132>`_, Igor Fedotov)
-* bluestore: os/bluestore: no need protected by OpSequencer::qlock (`pr#29488 <https://github.com/ceph/ceph/pull/29488>`_, Jianpeng Ma)
-* bluestore: os/bluestore: no need to add tail length (revert PR#29185) (`pr#29465 <https://github.com/ceph/ceph/pull/29465>`_, Xiangyang Yu)
-* bluestore: os/bluestore: print correctly info (`pr#29939 <https://github.com/ceph/ceph/pull/29939>`_, Jianpeng Ma)
-* bluestore: os/bluestore: print error if spdk_nvme_ns_cmd_writev() fails (`pr#31932 <https://github.com/ceph/ceph/pull/31932>`_, NancySu05)
-* bluestore: os/bluestore: proper locking for BlueFS prefetching (`pr#29012 <https://github.com/ceph/ceph/pull/29012>`_, Igor Fedotov)
-* bluestore: os/bluestore: reduce wakeups (`pr#29130 <https://github.com/ceph/ceph/pull/29130>`_, Jianpeng Ma)
-* bluestore: os/bluestore: Refactor Bluestore Caches (`pr#28597 <https://github.com/ceph/ceph/pull/28597>`_, Mark Nelson)
-* bluestore: os/bluestore: remove unused arg to _get_deferred_op() (`issue#40918 <http://tracker.ceph.com/issues/40918>`_, `pr#29320 <https://github.com/ceph/ceph/pull/29320>`_, Sage Weil)
-* bluestore: os/bluestore: remove unused _tune_cache_size() method declaration (`pr#29393 <https://github.com/ceph/ceph/pull/29393>`_, Igor Fedotov)
-* bluestore: os/bluestore: restore and fix bug with onode cache pinning (`pr#31778 <https://github.com/ceph/ceph/pull/31778>`_, Josh Durgin)
-* bluestore: os/bluestore: revert cache pinned list (`pr#31180 <https://github.com/ceph/ceph/pull/31180>`_, Sage Weil)
-* bluestore: os/bluestore: set STATE_KV_SUBMITTED properly (`pr#30753 <https://github.com/ceph/ceph/pull/30753>`_, Igor Fedotov)
-* bluestore: os/bluestore: show device name in osd metadata output (`pr#28107 <https://github.com/ceph/ceph/pull/28107>`_, Igor Fedotov)
-* bluestore: os/bluestore: silence StupidAllocator reorder warning (`pr#29866 <https://github.com/ceph/ceph/pull/29866>`_, Jos Collin)
-* bluestore: os/bluestore: simplify multithreaded shallow fsck (`pr#31473 <https://github.com/ceph/ceph/pull/31473>`_, Igor Fedotov)
-* bluestore: os/bluestore: simplify per-pool-stat config options (`pr#30350 <https://github.com/ceph/ceph/pull/30350>`_, Sage Weil, Igor Fedotov)
-* bluestore: os/bluestore: support RocksDB prefetch in buffered read mode (`issue#36482 <http://tracker.ceph.com/issues/36482>`_, `pr#27782 <https://github.com/ceph/ceph/pull/27782>`_, Igor Fedotov)
-* bluestore: os/bluestore: tiny tracepoints improvement (`pr#31669 <https://github.com/ceph/ceph/pull/31669>`_, Adam Kupczyk)
-* bluestore: os/bluestore: upgrade legacy omap to per-pool format automatically (`pr#32758 <https://github.com/ceph/ceph/pull/32758>`_, Igor Fedotov)
-* bluestore: os/bluestore: verify disk layout of BlueFS (`issue#25098 <http://tracker.ceph.com/issues/25098>`_, `pr#30109 <https://github.com/ceph/ceph/pull/30109>`_, Radoslaw Zarzynski)
-* bluestore: os/bluestore:fix two calculation bugs (`pr#29185 <https://github.com/ceph/ceph/pull/29185>`_, Xiangyang Yu)
-* bluestore: os/ceph-bluestore-tool: bluefs-bdev-expand asserts if no WAL (`pr#27445 <https://github.com/ceph/ceph/pull/27445>`_, Igor Fedotov)
-* bluestore: os/objectstore: add new op OP_CREATE for create a new object (`pr#26251 <https://github.com/ceph/ceph/pull/26251>`_, Jianpeng Ma)
-* bluestore: Revert os/bluestore: add kv_drain_preceding_waiters indicate drain_preceding. (`pr#31503 <https://github.com/ceph/ceph/pull/31503>`_, Sage Weil)
-* bluestore: test/fio: handle nullptr when parsing throttle params (`pr#31681 <https://github.com/ceph/ceph/pull/31681>`_, Igor Fedotov)
-* bluestore: [bluestore][tools] Inspect allocations in bluestore (`pr#29425 <https://github.com/ceph/ceph/pull/29425>`_, Adam Kupczyk)
-* build(deps): bump lodash from 4.17.11 to 4.17.13 in /src/pybind/mgr/dashboard/frontend (`pr#29192 <https://github.com/ceph/ceph/pull/29192>`_, dependabot[bot])
-* build/ops,cephfs,common,core,rbd: Fix big-endian handling (`pr#30079 <https://github.com/ceph/ceph/pull/30079>`_, Ulrich Weigand)
-* build/ops,cephfs: mgr/ssh: make mds add work (`pr#31059 <https://github.com/ceph/ceph/pull/31059>`_, Sage Weil)
-* build/ops,common,core: common, include: bump the version of ceph::buffers C++ API (`pr#33373 <https://github.com/ceph/ceph/pull/33373>`_, Radoslaw Zarzynski)
-* build/ops,common,mgr: python-common:  Python common package (`pr#28915 <https://github.com/ceph/ceph/pull/28915>`_, Kefu Chai, Sebastian Wagner)
-* build/ops,common,rgw: rgw, common, build: drop NSS support (`pr#27834 <https://github.com/ceph/ceph/pull/27834>`_, Radoslaw Zarzynski)
-* build/ops,core,rbd: Windows support [part 1] (`pr#31981 <https://github.com/ceph/ceph/pull/31981>`_, Lucian Petrut, Alin Gabriel Serdean)
-* build/ops,core: ceph-crash: use client.crash[.host] to post, and provsion keys via mgr/ssh + ceph-daemon (`pr#30734 <https://github.com/ceph/ceph/pull/30734>`_, Sage Weil)
-* build/ops,core: debian: fix ceph-mgr-modules-core files (`pr#33468 <https://github.com/ceph/ceph/pull/33468>`_, Sage Weil)
-* build/ops,core: os/bluestore: fix pmem osd build problem (`pr#28761 <https://github.com/ceph/ceph/pull/28761>`_, Peterson, Scott, Li, Xiaoyan)
-* build/ops,core: qa: stop testing on 16.04 xenial (`pr#28943 <https://github.com/ceph/ceph/pull/28943>`_, Sage Weil)
-* build/ops,mgr: mgr/diskprediction_local: Replaced old models and updated predictor (`pr#29437 <https://github.com/ceph/ceph/pull/29437>`_, Karanraj Chauhan)
-* build/ops,mgr: systemd: ceph-mgr: set MemoryDenyWriteExecute to false (`issue#39628 <http://tracker.ceph.com/issues/39628>`_, `pr#28023 <https://github.com/ceph/ceph/pull/28023>`_, Ricardo Dias)
-* build/ops,pybind: cmake, pybind: fix build on armhf (`pr#28843 <https://github.com/ceph/ceph/pull/28843>`_, Kefu Chai)
-* build/ops,rbd: rpm,deb: fix python dateutil module dependency (`pr#33624 <https://github.com/ceph/ceph/pull/33624>`_, Mykola Golub)
-* build/ops,rgw: build/rgw: unittest_rgw_dmclock_scheduler does not need Boost_LIBRARIES (`pr#27466 <https://github.com/ceph/ceph/pull/27466>`_, Willem Jan Withagen)
-* build/ops,rgw: install-deps.sh, cmake: use boost 1.72 on bionic (`pr#32391 <https://github.com/ceph/ceph/pull/32391>`_, Kefu Chai)
-* build/ops,tests: ceph-daemon: a few fixes; functional test (`pr#31094 <https://github.com/ceph/ceph/pull/31094>`_, Sage Weil)
-* build/ops,tests: googletest: pick up change to suppress CMP0048 warning (`pr#29471 <https://github.com/ceph/ceph/pull/29471>`_, Kefu Chai)
-* build/ops,tests: install-deps.sh,deb,rpm: move python-saml deps into debian/control an\xe2\x80\xa6 (`pr#29840 <https://github.com/ceph/ceph/pull/29840>`_, Kefu Chai)
-* build/ops,tools: src/script/credits.sh - switch to bash (`pr#32736 <https://github.com/ceph/ceph/pull/32736>`_, Kai Wagner)
-* build/ops,tools: vstart: Now all OSDs are starting in parallel. Use --no-parallel to revert to sequential (`pr#31732 <https://github.com/ceph/ceph/pull/31732>`_, Adam Kupczyk)
-* build/ops: .github/stale.yml: warn at 60, close at 90; adjust message (`pr#24744 <https://github.com/ceph/ceph/pull/24744>`_, Lenz Grimmer, Sage Weil)
-* build/ops: admin/build-doc: keep-going when finding warnings (`pr#27050 <https://github.com/ceph/ceph/pull/27050>`_, Abhishek Lekshmanan)
-* build/ops: build-doc: allow building docs on fedora 30 (`pr#30136 <https://github.com/ceph/ceph/pull/30136>`_, Yuval Lifshitz)
-* build/ops: build-integration-branch: s/prefix/postfix/ (`pr#32303 <https://github.com/ceph/ceph/pull/32303>`_, Kefu Chai)
-* build/ops: build: add static analysis targets (`pr#31579 <https://github.com/ceph/ceph/pull/31579>`_, Yuval Lifshitz)
-* build/ops: build: FreeBSD does not have /etc/os-release (`pr#26731 <https://github.com/ceph/ceph/pull/26731>`_, Willem Jan Withagen)
-* build/ops: ceph-daemon: a couple fixes (`pr#31060 <https://github.com/ceph/ceph/pull/31060>`_, Sage Weil)
-* build/ops: ceph-daemon: add a logrotate.d file for each cluster (`pr#30882 <https://github.com/ceph/ceph/pull/30882>`_, Sage Weil)
-* build/ops: ceph-daemon: deploy ceph daemons with podman and systemd (`pr#30603 <https://github.com/ceph/ceph/pull/30603>`_, Sage Weil)
-* build/ops: ceph-daemon: fix logrotate su line (`pr#31823 <https://github.com/ceph/ceph/pull/31823>`_, Sage Weil)
-* build/ops: ceph-daemon: misc improvements (`pr#30826 <https://github.com/ceph/ceph/pull/30826>`_, Sage Weil)
-* build/ops: ceph-daemon: use /usr/bin/python, not /usr/bin/env python (`pr#31318 <https://github.com/ceph/ceph/pull/31318>`_, Sage Weil)
-* build/ops: ceph.spec.in: add missing python-yaml dependency for mgr-k8sevents (`pr#31178 <https://github.com/ceph/ceph/pull/31178>`_, Kefu Chai)
-* build/ops: ceph.spec.in: add runtime deps for mgr-diskprediction-cloud (`pr#32232 <https://github.com/ceph/ceph/pull/32232>`_, Kefu Chai)
-* build/ops: ceph.spec.in: always depends on python3.6-pyOpenSSL (`pr#32317 <https://github.com/ceph/ceph/pull/32317>`_, Kefu Chai)
-* build/ops: ceph.spec.in: Drop systemd BuildRequires in case of building for SUSE (`pr#28884 <https://github.com/ceph/ceph/pull/28884>`_, Dominique Leuenberger)
-* build/ops: ceph.spec.in: enable amqp_endpoint on RHEL8 by default (`pr#31143 <https://github.com/ceph/ceph/pull/31143>`_, Brad Hubbard)
-* build/ops: ceph.spec.in: fix Cython package dependency for Fedora (`pr#30590 <https://github.com/ceph/ceph/pull/30590>`_, Jeff Layton)
-* build/ops: ceph.spec.in: fix make check deps for centos8 (`pr#32798 <https://github.com/ceph/ceph/pull/32798>`_, Alfonso Mart\xc3\xadnez)
-* build/ops: ceph.spec.in: fix python coverage dependency for non-rhel distros (`pr#33361 <https://github.com/ceph/ceph/pull/33361>`_, Kiefer Chang)
-* build/ops: ceph.spec.in: fix python3 dependencies in centos7 (`pr#32775 <https://github.com/ceph/ceph/pull/32775>`_, liushi)
-* build/ops: ceph.spec.in: grafana-dashboards package depends on grafana (`pr#28228 <https://github.com/ceph/ceph/pull/28228>`_, Jan Fajerski)
-* build/ops: ceph.spec.in: move distro-conditional deps to dedicated section (`pr#32080 <https://github.com/ceph/ceph/pull/32080>`_, Nathan Cutler)
-* build/ops: ceph.spec.in: package prometheus default alerts for SUSE (`pr#27996 <https://github.com/ceph/ceph/pull/27996>`_, Jan Fajerski)
-* build/ops: ceph.spec.in: pin to gcc-c++-8.2.1 (`pr#28859 <https://github.com/ceph/ceph/pull/28859>`_, Kefu Chai)
-* build/ops: ceph.spec.in: re-enable make check deps for el8 (`pr#32412 <https://github.com/ceph/ceph/pull/32412>`_, Kefu Chai)
-* build/ops: ceph.spec.in: reserve more memory per build jo (`pr#30126 <https://github.com/ceph/ceph/pull/30126>`_, Dan van der Ster)
-* build/ops: ceph.spec.in: s/pkgversion/version_nodots/ (`pr#30036 <https://github.com/ceph/ceph/pull/30036>`_, Kefu Chai)
-* build/ops: ceph.spec.in: use g++ >= 8.3.1-3.1 (`pr#30088 <https://github.com/ceph/ceph/pull/30088>`_, Kefu Chai)
-* build/ops: ceph.spec.in: Use pkgconfig() style BuildRequires for udev/libudev-devel (`pr#32933 <https://github.com/ceph/ceph/pull/32933>`_, Dominique Leuenberger)
-* build/ops: ceph.spec.in: use python3 to bytecompile .py files (`pr#32608 <https://github.com/ceph/ceph/pull/32608>`_, Kefu Chai)
-* build/ops: ceph.spec: Recommend (but do not require) podman (`pr#33221 <https://github.com/ceph/ceph/pull/33221>`_, Sage Weil)
-* build/ops: ceph_release: octopus rc 15.1.0 (`pr#32623 <https://github.com/ceph/ceph/pull/32623>`_, Sage Weil)
-* build/ops: cmake,crimson: pick up latest seastar (`pr#27088 <https://github.com/ceph/ceph/pull/27088>`_, Kefu Chai)
-* build/ops: cmake,run-make-check.sh: disable SPDK by default (`pr#29728 <https://github.com/ceph/ceph/pull/29728>`_, Kefu Chai)
-* build/ops: cmake/Boost: Fix python3 version (`pr#32344 <https://github.com/ceph/ceph/pull/32344>`_, Kotresh HR)
-* build/ops: cmake/FindRocksDB: fix IMPORTED_LOCATION for ROCKSDB_LIBRARIES (`pr#26813 <https://github.com/ceph/ceph/pull/26813>`_, dudengke)
-* build/ops: cmake/modules/GetGitRevisionDescription: update to work with git-worktree (`pr#30772 <https://github.com/ceph/ceph/pull/30772>`_, Sage Weil)
-* build/ops: cmake/modules: replace ; with   in compile flags (`pr#28339 <https://github.com/ceph/ceph/pull/28339>`_, Kefu Chai)
-* build/ops: CMakeLists: add std::move warnings in gcc9 (`pr#27569 <https://github.com/ceph/ceph/pull/27569>`_, Patrick Donnelly)
-* build/ops: crimson: clang related cleanups (`pr#33680 <https://github.com/ceph/ceph/pull/33680>`_, Kefu Chai)
-* build/ops: crimson: fix build seastar with dpdk (`pr#31426 <https://github.com/ceph/ceph/pull/31426>`_, Yingxin Cheng)
-* build/ops: deb,rpm,doc: s/plugin/module/ (`pr#33435 <https://github.com/ceph/ceph/pull/33435>`_, Kefu Chai)
-* build/ops: debian/: use ceph-osd for packaging crimson-osd (`pr#28535 <https://github.com/ceph/ceph/pull/28535>`_, Kefu Chai)
-* build/ops: debian/control: add python-routes dependency for dashboard (`pr#28835 <https://github.com/ceph/ceph/pull/28835>`_, Paul Emmerich)
-* build/ops: debian/control: Build-Depends on g++ (`pr#30410 <https://github.com/ceph/ceph/pull/30410>`_, Kefu Chai)
-* build/ops: debian/control: fix Build-Depends (`pr#29913 <https://github.com/ceph/ceph/pull/29913>`_, Kefu Chai)
-* build/ops: debian/radosgw.install: correct path to libradosgw.so\\* (`pr#32539 <https://github.com/ceph/ceph/pull/32539>`_, Kefu Chai)
-* build/ops: debian/rules: run dh_python2 with ceph-daemon (`pr#31313 <https://github.com/ceph/ceph/pull/31313>`_, Kefu Chai)
-* build/ops: debian: modules-core replaces and breaks older ceph-mgr (`pr#33501 <https://github.com/ceph/ceph/pull/33501>`_, Kefu Chai)
-* build/ops: debian: remove dup ceph-fuse line (`pr#28788 <https://github.com/ceph/ceph/pull/28788>`_, huangjun)
-* build/ops: dmclock:  pick up change to use specified C++ settings if any (`pr#30113 <https://github.com/ceph/ceph/pull/30113>`_, Kefu Chai)
-* build/ops: do_cmake.sh: Add a heading to the minimal config (`pr#28776 <https://github.com/ceph/ceph/pull/28776>`_, Brad Hubbard)
-* build/ops: do_cmake.sh: Add CEPH_GIT_DIR (`pr#30863 <https://github.com/ceph/ceph/pull/30863>`_, Matthew Oliver)
-* build/ops: do_cmake.sh: bail out if something goes wrong (`pr#33016 <https://github.com/ceph/ceph/pull/33016>`_, Kefu Chai)
-* build/ops: do_cmake.sh: enable amqp and rdma for EL8 (`pr#30974 <https://github.com/ceph/ceph/pull/30974>`_, Kefu Chai)
-* build/ops: do_cmake.sh: optionally specify build dir with $BUILD_DIR env var (`pr#29786 <https://github.com/ceph/ceph/pull/29786>`_, Yuval Lifshitz)
-* build/ops: do_cmake.sh: remove -DCMAKE_BUILD_TYPE=Debug from cmake options (`pr#30250 <https://github.com/ceph/ceph/pull/30250>`_, Kefu Chai)
-* build/ops: do_cmake.sh: use bash (`issue#39981 <http://tracker.ceph.com/issues/39981>`_, `pr#28181 <https://github.com/ceph/ceph/pull/28181>`_, Nathan Cutler)
-* build/ops: do_cmake: Warn user about slow debug performance only for not set (`pr#31113 <https://github.com/ceph/ceph/pull/31113>`_, Junyoung, Sung)
-* build/ops: do_freebsd.sh: update build scripts to resemble Jenkins scripts (`pr#29400 <https://github.com/ceph/ceph/pull/29400>`_, Willem Jan Withagen)
-* build/ops: dpdk: drop dpdk submodule (`issue#24032 <http://tracker.ceph.com/issues/24032>`_, `pr#33001 <https://github.com/ceph/ceph/pull/33001>`_, Kefu Chai)
-* build/ops: fix build fail related to PYTHON_EXECUTABLE variable (`pr#30199 <https://github.com/ceph/ceph/pull/30199>`_, Ilsoo Byun)
-* build/ops: github: display phrase for signed-off check (`pr#29890 <https://github.com/ceph/ceph/pull/29890>`_, Ernesto Puerta)
-* build/ops: install-dep,rpm: use devtools-8 on amd64 (`issue#38892 <http://tracker.ceph.com/issues/38892>`_, `pr#27134 <https://github.com/ceph/ceph/pull/27134>`_, Kefu Chai)
-* build/ops: install-deps, rpm: use python_provide macro and cleanups (`pr#30830 <https://github.com/ceph/ceph/pull/30830>`_, Kefu Chai)
-* build/ops: install-deps,rpm,do_cmake: build on RHEL/CentOS 8 (`pr#30630 <https://github.com/ceph/ceph/pull/30630>`_, Kefu Chai)
-* build/ops: install-deps.sh,src: drop python2 support (`pr#31525 <https://github.com/ceph/ceph/pull/31525>`_, Kefu Chai)
-* build/ops: install-deps.sh: Actually set gpgcheck to false (`pr#33591 <https://github.com/ceph/ceph/pull/33591>`_, Brad Hubbard)
-* build/ops: install-deps.sh: add EPEL repo for non-x86_64 archs as well (`pr#30557 <https://github.com/ceph/ceph/pull/30557>`_, Kefu Chai, Nathan Cutler)
-* build/ops: install-deps.sh: add kens copr repo for el8 build (`pr#32324 <https://github.com/ceph/ceph/pull/32324>`_, Kefu Chai)
-* build/ops: install-deps.sh: add option to skip prebuilt boost-\\* pkgs installation (`pr#27776 <https://github.com/ceph/ceph/pull/27776>`_, Jun He)
-* build/ops: install-deps.sh: add support for Ubuntu Disco Dingo (`pr#30405 <https://github.com/ceph/ceph/pull/30405>`_, Patrick Seidensal)
-* build/ops: install-deps.sh: download wheel using pip wheel (`pr#29903 <https://github.com/ceph/ceph/pull/29903>`_, Kefu Chai)
-* build/ops: install-deps.sh: enable PowerTool repo for EL8 (`pr#30656 <https://github.com/ceph/ceph/pull/30656>`_, Kefu Chai)
-* build/ops: install-deps.sh: fix typo for krb5 on FreeBSD (`pr#28269 <https://github.com/ceph/ceph/pull/28269>`_, Thomas Johnson)
-* build/ops: install-deps.sh: install binutils 2.28 for xenial (`pr#31601 <https://github.com/ceph/ceph/pull/31601>`_, Kefu Chai)
-* build/ops: install-deps.sh: install libboost-test for seastar (`pr#28015 <https://github.com/ceph/ceph/pull/28015>`_, Kefu Chai)
-* build/ops: install-deps.sh: install python2-{virtualenv,devel} on SUSE if needed (`pr#32153 <https://github.com/ceph/ceph/pull/32153>`_, Nathan Cutler)
-* build/ops: install-deps.sh: install \\*rpm-macros (`issue#39164 <http://tracker.ceph.com/issues/39164>`_, `pr#27524 <https://github.com/ceph/ceph/pull/27524>`_, Kefu Chai)
-* build/ops: install-deps.sh: install `python\\*-devel` for python\\*rpm-macros (`pr#30190 <https://github.com/ceph/ceph/pull/30190>`_, Kefu Chai)
-* build/ops: install-deps.sh: only prepare wheels for make check (`pr#29912 <https://github.com/ceph/ceph/pull/29912>`_, Kefu Chai)
-* build/ops: install-deps.sh: use chacra for cmake repo (`pr#29475 <https://github.com/ceph/ceph/pull/29475>`_, Kefu Chai)
-* build/ops: install-deps.sh: Use dnf for rhel/centos 8 (`pr#31144 <https://github.com/ceph/ceph/pull/31144>`_, Brad Hubbard)
-* build/ops: install-deps.sh: use gcc-8 on xenial and trusty (`pr#28094 <https://github.com/ceph/ceph/pull/28094>`_, Kefu Chai)
-* build/ops: install-deps.sh: use GCC-9 on bionic (`pr#28454 <https://github.com/ceph/ceph/pull/28454>`_, Kefu Chai)
-* build/ops: install-deps.sh: use sepia/lab-extra/8 (`pr#31238 <https://github.com/ceph/ceph/pull/31238>`_, Kefu Chai)
-* build/ops: install-deps: do not install if rpm already installed (`pr#30612 <https://github.com/ceph/ceph/pull/30612>`_, Kefu Chai)
-* build/ops: install-deps: enable homebrew repos for RHEL8 (`pr#33905 <https://github.com/ceph/ceph/pull/33905>`_, Kefu Chai, Dan Mick)
-* build/ops: install-deps: revert 47d4351d (`pr#30122 <https://github.com/ceph/ceph/pull/30122>`_, Kefu Chai)
-* build/ops: make patch build dependency explicit (`issue#40175 <http://tracker.ceph.com/issues/40175>`_, `pr#28414 <https://github.com/ceph/ceph/pull/28414>`_, Nathan Cutler)
-* build/ops: make perf_async_msgr link jemalloc/tcmalloc (`pr#28039 <https://github.com/ceph/ceph/pull/28039>`_, Jianpeng Ma)
-* build/ops: make-dist: Bump Node.js to v10.18.1 (`pr#33059 <https://github.com/ceph/ceph/pull/33059>`_, Tiago Melo)
-* build/ops: make-dist: default to no dashboard frontend build parallelism (`pr#32037 <https://github.com/ceph/ceph/pull/32037>`_, Nathan Cutler)
-* build/ops: make-dist: drop Python 2/3 autoselect (`pr#27792 <https://github.com/ceph/ceph/pull/27792>`_, Nathan Cutler)
-* build/ops: make-dist: set version number only once (`pr#26281 <https://github.com/ceph/ceph/pull/26281>`_, Nathan Cutler)
-* build/ops: mgr/dashboard: Prevent angular of getting stuck during installation (`pr#29929 <https://github.com/ceph/ceph/pull/29929>`_, Tiago Melo)
-* build/ops: mgr/rook: Make use of rook-client-python when talking to Rook (`pr#29427 <https://github.com/ceph/ceph/pull/29427>`_, Sebastian Wagner)
-* build/ops: pybind/mgr/CMakeLists: exclude tox.ini, requirements.txt from install (`pr#31577 <https://github.com/ceph/ceph/pull/31577>`_, Sage Weil)
-* build/ops: pybind/mgr: Exclude tests/ (`pr#31671 <https://github.com/ceph/ceph/pull/31671>`_, Sebastian Wagner)
-* build/ops: pybind/mgr: Rename orchestrator_cli to orchestrator (`pr#32817 <https://github.com/ceph/ceph/pull/32817>`_, Sebastian Wagner)
-* build/ops: qa/tasks/ceph_deploy: do not rely on ceph-create-keys (`pr#29002 <https://github.com/ceph/ceph/pull/29002>`_, Sage Weil)
-* build/ops: Revert dpdk: drop dpdk submodule (`pr#32992 <https://github.com/ceph/ceph/pull/32992>`_, David Galloway)
-* build/ops: rpm,cmake: use specified python3 version if any (`pr#27358 <https://github.com/ceph/ceph/pull/27358>`_, Kefu Chai)
-* build/ops: rpm,deb: package always-enabled plugins in a separated package (`pr#33422 <https://github.com/ceph/ceph/pull/33422>`_, Kefu Chai)
-* build/ops: rpm,deb: python-requests is not needed for ceph-common (`pr#30420 <https://github.com/ceph/ceph/pull/30420>`_, luo.runbing)
-* build/ops: rpm,debian,install-deps: package crimson-osd (`pr#28428 <https://github.com/ceph/ceph/pull/28428>`_, Kefu Chai)
-* build/ops: rpm,etc/sysconfig: remove SuSEfirewall2 support (`issue#40738 <http://tracker.ceph.com/issues/40738>`_, `pr#28957 <https://github.com/ceph/ceph/pull/28957>`_, Matthias Gerstner)
-* build/ops: rpm/cephadm: move HOMEDIR to /var/lib and make scriptlets idempotent on SUSE (`pr#32212 <https://github.com/ceph/ceph/pull/32212>`_, Nathan Cutler)
-* build/ops: rpm: add cmake_verbose_logging switch (`pr#32805 <https://github.com/ceph/ceph/pull/32805>`_, Nathan Cutler)
-* build/ops: rpm: add Provides: python3-\\* for python packages and cleanup (`pr#27468 <https://github.com/ceph/ceph/pull/27468>`_, Kefu Chai)
-* build/ops: rpm: add rpm-build to SUSE-specific make check deps (`pr#32083 <https://github.com/ceph/ceph/pull/32083>`_, Nathan Cutler)
-* build/ops: rpm: always build ceph-test package (`pr#29685 <https://github.com/ceph/ceph/pull/29685>`_, Nathan Cutler)
-* build/ops: rpm: define weak_deps for el8 (`pr#33229 <https://github.com/ceph/ceph/pull/33229>`_, Kefu Chai)
-* build/ops: rpm: Disable LTO in spec when being used (`issue#39974 <http://tracker.ceph.com/issues/39974>`_, `pr#28170 <https://github.com/ceph/ceph/pull/28170>`_, Martin Li\xc5\xa1ka)
-* build/ops: rpm: drop vim-specific header (`pr#32331 <https://github.com/ceph/ceph/pull/32331>`_, Nathan Cutler)
-* build/ops: rpm: enable devtoolset-8 on aarch64 also (`issue#38892 <http://tracker.ceph.com/issues/38892>`_, `pr#27333 <https://github.com/ceph/ceph/pull/27333>`_, Kefu Chai)
-* build/ops: rpm: fdupes in SUSE builds to conform with packaging guidelines (`issue#40973 <http://tracker.ceph.com/issues/40973>`_, `pr#29346 <https://github.com/ceph/ceph/pull/29346>`_, Nathan Cutler)
-* build/ops: rpm: fix rhel <= 7 conditional (`pr#27045 <https://github.com/ceph/ceph/pull/27045>`_, Nathan Cutler)
-* build/ops: rpm: fix up a specfile syntax error (`pr#33066 <https://github.com/ceph/ceph/pull/33066>`_, Greg Farnum)
-* build/ops: rpm: have pybind RPMs provide/obsolete their python2 predecessors (`issue#40099 <http://tracker.ceph.com/issues/40099>`_, `pr#28352 <https://github.com/ceph/ceph/pull/28352>`_, Nathan Cutler)
-* build/ops: rpm: immutable-object-cache related changes (`pr#27150 <https://github.com/ceph/ceph/pull/27150>`_, Kefu Chai)
-* build/ops: rpm: improve ceph-mgr plugin package summaries (`issue#40974 <http://tracker.ceph.com/issues/40974>`_, `pr#29347 <https://github.com/ceph/ceph/pull/29347>`_, Nathan Cutler)
-* build/ops: rpm: make librados2, libcephfs2 own (create) /etc/ceph (`pr#30975 <https://github.com/ceph/ceph/pull/30975>`_, Nathan Cutler)
-* build/ops: rpm: put librgw lttng SOs in the librgw-devel package (`issue#40975 <http://tracker.ceph.com/issues/40975>`_, `pr#29349 <https://github.com/ceph/ceph/pull/29349>`_, Nathan Cutler)
-* build/ops: rpm: refrain from building ceph-resource-agents on SLE (`pr#27046 <https://github.com/ceph/ceph/pull/27046>`_, Nathan Cutler)
-* build/ops: rpm: Relax the selinux policy version for centos builds (`pr#32700 <https://github.com/ceph/ceph/pull/32700>`_, Boris Ranto)
-* build/ops: rpm: s/devtoolset-7/devtoolset-8/ (`pr#27183 <https://github.com/ceph/ceph/pull/27183>`_, Kefu Chai)
-* build/ops: rpm: use python 3.6 as the default python3 (`pr#27417 <https://github.com/ceph/ceph/pull/27417>`_, Kefu Chai)
-* build/ops: rpm: use python3.4 on RHEL7 by default (`pr#27407 <https://github.com/ceph/ceph/pull/27407>`_, Kefu Chai)
-* build/ops: rpm: use Recommends on fedora also (`pr#26819 <https://github.com/ceph/ceph/pull/26819>`_, Kefu Chai)
-* build/ops: run npm ci with a one-hour timeout (`pr#28994 <https://github.com/ceph/ceph/pull/28994>`_, Nathan Cutler)
-* build/ops: run-make-check.sh: extract run-make.sh (`pr#30184 <https://github.com/ceph/ceph/pull/30184>`_, Kefu Chai)
-* build/ops: run-make-check.sh: run sudo with absolute path (`pr#29753 <https://github.com/ceph/ceph/pull/29753>`_, Kefu Chai)
-* build/ops: run-make-check.sh: WITH_SEASTAR on demand (`pr#33723 <https://github.com/ceph/ceph/pull/33723>`_, Kefu Chai)
-* build/ops: script,doc: add gen-corpus.sh (`pr#28950 <https://github.com/ceph/ceph/pull/28950>`_, Kefu Chai)
-* build/ops: script/build-integration-branch: Add usage (`pr#32293 <https://github.com/ceph/ceph/pull/32293>`_, Sebastian Wagner)
-* build/ops: script/run-make.sh: do not pass cmake options twice (`pr#30318 <https://github.com/ceph/ceph/pull/30318>`_, Kefu Chai)
-* build/ops: script/run_tox.sh: Dont overwrite the build dir (`pr#29925 <https://github.com/ceph/ceph/pull/29925>`_, Sebastian Wagner)
-* build/ops: script: remove dep-report.sh (`pr#29296 <https://github.com/ceph/ceph/pull/29296>`_, Kefu Chai)
-* build/ops: scripts: ceph_dump_log.py (`pr#21729 <https://github.com/ceph/ceph/pull/21729>`_, Brad Hubbard)
-* build/ops: seastar: pickup change to add pthread linkage (`pr#33453 <https://github.com/ceph/ceph/pull/33453>`_, Kefu Chai)
-* build/ops: spec, debian: cephadm requires lvm2 (`pr#32323 <https://github.com/ceph/ceph/pull/32323>`_, Sebastian Wagner)
-* build/ops: spec,debian: ceph-mgr-ssh depends on openssh{-client{s}} (`pr#31806 <https://github.com/ceph/ceph/pull/31806>`_, Sebastian Wagner)
-* build/ops: spec: add missing python3-pyyaml (`pr#33387 <https://github.com/ceph/ceph/pull/33387>`_, Sebastian Wagner)
-* build/ops: spec: Podman (temporarily) requires apparmor-abstractions on suse (`pr#33850 <https://github.com/ceph/ceph/pull/33850>`_, Sebastian Wagner)
-* build/ops: src/CMakeLists: remove leading v from git describe version (`pr#31387 <https://github.com/ceph/ceph/pull/31387>`_, Sage Weil)
-* build/ops: test/fio: bump to fio-3.15 (`pr#31544 <https://github.com/ceph/ceph/pull/31544>`_, Igor Fedotov)
-* build/ops: test: only compile ceph_test_bmap_alloc_replay WITH_BLUESTORE (`pr#31306 <https://github.com/ceph/ceph/pull/31306>`_, Willem Jan Withagen)
-* build/ops: vstart: Remove duplicate option -N (`pr#31917 <https://github.com/ceph/ceph/pull/31917>`_, Kotresh HR)
-* ceph-crash: use ceph-crash as logger name (`pr#30989 <https://github.com/ceph/ceph/pull/30989>`_, Kefu Chai)
-* ceph-daemon -> cephadm, mgr/ssh -> mgr/cephadm (`pr#32193 <https://github.com/ceph/ceph/pull/32193>`_, Sage Weil)
-* ceph-daemon,mgr/ssh: add check-host (`pr#31795 <https://github.com/ceph/ceph/pull/31795>`_, Sage Weil)
-* ceph-daemon: -v|--verbose, not -d|--debug (`pr#31583 <https://github.com/ceph/ceph/pull/31583>`_, Sage Weil)
-* ceph-daemon: a few more py2 compatibility hacks (`pr#31264 <https://github.com/ceph/ceph/pull/31264>`_, Sage Weil)
-* ceph-daemon: add additional debug logging (`pr#31837 <https://github.com/ceph/ceph/pull/31837>`_, Michael Fritch)
-* ceph-daemon: Add basic mypy support (`pr#31609 <https://github.com/ceph/ceph/pull/31609>`_, Thomas Bechtold)
-* ceph-daemon: add explicit pull at bootstrap start (`pr#31478 <https://github.com/ceph/ceph/pull/31478>`_, Sage Weil)
-* ceph-daemon: Add more type hints (`pr#31631 <https://github.com/ceph/ceph/pull/31631>`_, Thomas Bechtold)
-* ceph-daemon: add osd create test (`pr#31679 <https://github.com/ceph/ceph/pull/31679>`_, Michael Fritch)
-* ceph-daemon: add standalone `adopt` tests (`pr#31486 <https://github.com/ceph/ceph/pull/31486>`_, Michael Fritch)
-* ceph-daemon: add `--base-dir` arg to `adopt` command (`pr#31487 <https://github.com/ceph/ceph/pull/31487>`_, Michael Fritch)
-* ceph-daemon: add `--legacy-dir` arg to `ls` command (`pr#31585 <https://github.com/ceph/ceph/pull/31585>`_, Michael Fritch)
-* ceph-daemon: Allow env var for setting the used image (`pr#31913 <https://github.com/ceph/ceph/pull/31913>`_, Thomas Bechtold)
-* ceph-daemon: append newline before public key string (`pr#31788 <https://github.com/ceph/ceph/pull/31788>`_, Ricardo Dias)
-* ceph-daemon: behave on rm-cluster when legacy dirs exist and ceph isnt installed (`pr#31499 <https://github.com/ceph/ceph/pull/31499>`_, Sage Weil)
-* ceph-daemon: bootstrap: make --output-\\* args optional (`pr#31695 <https://github.com/ceph/ceph/pull/31695>`_, Sage Weil)
-* ceph-daemon: ceph/daemon-base:latest-master-devel (`pr#31507 <https://github.com/ceph/ceph/pull/31507>`_, Sage Weil)
-* ceph-daemon: clean-up tempfiles on EXIT (`pr#32052 <https://github.com/ceph/ceph/pull/32052>`_, Michael Fritch)
-* ceph-daemon: combine SUDO and ARGS into a single var (`pr#32138 <https://github.com/ceph/ceph/pull/32138>`_, Michael Fritch)
-* ceph-daemon: configure firewalld for new daemons (`pr#31869 <https://github.com/ceph/ceph/pull/31869>`_, Sage Weil)
-* ceph-daemon: consolidate NamedTemporaryFile logic (`pr#31908 <https://github.com/ceph/ceph/pull/31908>`_, Michael Fritch)
-* ceph-daemon: create ~/.ssh if not exist (`pr#31315 <https://github.com/ceph/ceph/pull/31315>`_, Kefu Chai)
-* ceph-daemon: customize the bash prompt for shell + enter (`pr#31498 <https://github.com/ceph/ceph/pull/31498>`_, Sage Weil)
-* ceph-daemon: do not pass -it unless it is an interactive shell (`pr#31181 <https://github.com/ceph/ceph/pull/31181>`_, Sage Weil)
-* ceph-daemon: do not relabel system directories (`pr#31321 <https://github.com/ceph/ceph/pull/31321>`_, Sage Weil)
-* ceph-daemon: dont deref symlinks during chown (`pr#32137 <https://github.com/ceph/ceph/pull/32137>`_, Michael Fritch)
-* ceph-daemon: enable dashboard during bootstrap (`pr#31464 <https://github.com/ceph/ceph/pull/31464>`_, Sage Weil)
-* ceph-daemon: fix bootstrap ownership of tmp monmap file (`pr#32097 <https://github.com/ceph/ceph/pull/32097>`_, Sage Weil)
-* ceph-daemon: fix extract_uid_gid (`pr#31832 <https://github.com/ceph/ceph/pull/31832>`_, Sage Weil)
-* ceph-daemon: fix firewalld error case (`pr#32096 <https://github.com/ceph/ceph/pull/32096>`_, Sage Weil)
-* ceph-daemon: Fix handling for symlinks on python2 (`pr#31838 <https://github.com/ceph/ceph/pull/31838>`_, Michael Fritch)
-* ceph-daemon: fix os.mkdir call (`pr#31320 <https://github.com/ceph/ceph/pull/31320>`_, Sage Weil)
-* ceph-daemon: fix pod stop (`pr#32157 <https://github.com/ceph/ceph/pull/32157>`_, Sage Weil)
-* ceph-daemon: fix prompt (`pr#31603 <https://github.com/ceph/ceph/pull/31603>`_, Sage Weil)
-* ceph-daemon: fix standalone `adopt` OSD test (`pr#31772 <https://github.com/ceph/ceph/pull/31772>`_, Sage Weil, Michael Fritch)
-* ceph-daemon: fix traceback during `ls` command (`pr#31439 <https://github.com/ceph/ceph/pull/31439>`_, Michael Fritch)
-* ceph-daemon: fix version field for legacy `ls` (`pr#31443 <https://github.com/ceph/ceph/pull/31443>`_, Michael Fritch)
-* ceph-daemon: fix `systemctl is-enabled` bool (`pr#31870 <https://github.com/ceph/ceph/pull/31870>`_, Michael Fritch)
-* ceph-daemon: infer fsid for some commands (`pr#31702 <https://github.com/ceph/ceph/pull/31702>`_, Michael Fritch)
-* ceph-daemon: logs command (`pr#31575 <https://github.com/ceph/ceph/pull/31575>`_, Sage Weil)
-* ceph-daemon: make /var/run/ceph behavior better (`pr#31141 <https://github.com/ceph/ceph/pull/31141>`_, Sage Weil)
-* ceph-daemon: make infer_fsid behave when /var/lib/ceph dne (`pr#31831 <https://github.com/ceph/ceph/pull/31831>`_, Sage Weil)
-* ceph-daemon: make ls log less noisy (`pr#31448 <https://github.com/ceph/ceph/pull/31448>`_, Sage Weil)
-* ceph-daemon: make mon container privileged (`pr#31476 <https://github.com/ceph/ceph/pull/31476>`_, Sage Weil)
-* ceph-daemon: make ps1 a raw string (`pr#31540 <https://github.com/ceph/ceph/pull/31540>`_, Michael Fritch)
-* ceph-daemon: make rm-cluster faster (`pr#31538 <https://github.com/ceph/ceph/pull/31538>`_, Sage Weil)
-* ceph-daemon: make rm-cluster handle failed unit cleanup (`pr#31365 <https://github.com/ceph/ceph/pull/31365>`_, Sage Weil)
-* ceph-daemon: Move ceph-daemon executable to own directory (`pr#31467 <https://github.com/ceph/ceph/pull/31467>`_, Thomas Bechtold)
-* ceph-daemon: nicer errors (`pr#31886 <https://github.com/ceph/ceph/pull/31886>`_, Sage Weil, Michael Fritch)
-* ceph-daemon: Only run in the __main__ scope (`pr#31458 <https://github.com/ceph/ceph/pull/31458>`_, Thomas Bechtold)
-* ceph-daemon: only set up /var/run/ceph/$fsid if it exists (`pr#31341 <https://github.com/ceph/ceph/pull/31341>`_, Sage Weil)
-* ceph-daemon: only set up crash dir mount if it exists (`pr#31130 <https://github.com/ceph/ceph/pull/31130>`_, Sage Weil)
-* ceph-daemon: py2 compatibility (`pr#31168 <https://github.com/ceph/ceph/pull/31168>`_, Sage Weil)
-* ceph-daemon: py2: tolerate whitespace before config key name (`pr#32098 <https://github.com/ceph/ceph/pull/32098>`_, Sage Weil)
-* ceph-daemon: raise RuntimeError when CephContainer.run() fails (`pr#31328 <https://github.com/ceph/ceph/pull/31328>`_, Michael Fritch)
-* ceph-daemon: Remove data dir during adopt (`pr#31437 <https://github.com/ceph/ceph/pull/31437>`_, Michael Fritch)
-* ceph-daemon: remove prepare-host (`pr#32108 <https://github.com/ceph/ceph/pull/32108>`_, Sage Weil)
-* ceph-daemon: replace podman variables by container (`pr#31618 <https://github.com/ceph/ceph/pull/31618>`_, Dimitri Savineau)
-* ceph-daemon: seek relative to the start of file (`pr#31892 <https://github.com/ceph/ceph/pull/31892>`_, Michael Fritch)
-* ceph-daemon: set container_image during bootstrap (`pr#31445 <https://github.com/ceph/ceph/pull/31445>`_, Sage Weil)
-* ceph-daemon: set ssh public identity (`pr#31500 <https://github.com/ceph/ceph/pull/31500>`_, Sage Weil)
-* ceph-daemon: several fsid inference fixes (`pr#31798 <https://github.com/ceph/ceph/pull/31798>`_, Sage Weil)
-* ceph-daemon: switch default image (`pr#31463 <https://github.com/ceph/ceph/pull/31463>`_, Sage Weil)
-* ceph-daemon: unmount osd data dir during `adopt` (`pr#31477 <https://github.com/ceph/ceph/pull/31477>`_, Michael Fritch)
-* ceph-daemon: use client.admin keyring during bootstrap (`pr#31270 <https://github.com/ceph/ceph/pull/31270>`_, Sage Weil)
-* ceph-daemon: use `-e` instead of `--env` (`pr#31614 <https://github.com/ceph/ceph/pull/31614>`_, Michael Fritch)
-* ceph-daemon: Use `shutil.move` to move log files (`pr#31331 <https://github.com/ceph/ceph/pull/31331>`_, Michael Fritch)
-* ceph-daemon: `imp` module  DeprecationWarning (`pr#32161 <https://github.com/ceph/ceph/pull/32161>`_, Michael Fritch)
-* ceph-mon: keep v1 address type when explicitly set (`pr#31765 <https://github.com/ceph/ceph/pull/31765>`_, Ricardo Dias)
-* ceph-object-corpus: forward_incompat pg_missing_item and pg_missing_t (`pr#28034 <https://github.com/ceph/ceph/pull/28034>`_, lishuhao)
-* ceph-volume  simple: better detection when type file is not present (`pr#29386 <https://github.com/ceph/ceph/pull/29386>`_, Alfredo Deza)
-* ceph-volume  zap always skips block.db, leaves them around (`issue#40664 <http://tracker.ceph.com/issues/40664>`_, `pr#28998 <https://github.com/ceph/ceph/pull/28998>`_, Alfredo Deza)
-* ceph-volume broken assertion errors after pytest changes (`issue#40665 <http://tracker.ceph.com/issues/40665>`_, `pr#28866 <https://github.com/ceph/ceph/pull/28866>`_, Alfredo Deza)
-* ceph-volume lvm.zap fix cleanup for db partitions (`issue#40664 <http://tracker.ceph.com/issues/40664>`_, `pr#28267 <https://github.com/ceph/ceph/pull/28267>`_, Dominik Csapak)
-* ceph-volume tests add a sleep in tox for slow OSDs after booting (`issue#40619 <http://tracker.ceph.com/issues/40619>`_, `pr#28836 <https://github.com/ceph/ceph/pull/28836>`_, Alfredo Deza)
-* ceph-volume tests remove xenial from functional testing (`pr#31159 <https://github.com/ceph/ceph/pull/31159>`_, Alfredo Deza)
-* ceph-volume tests set the noninteractive flag for Debian (`pr#29804 <https://github.com/ceph/ceph/pull/29804>`_, Alfredo Deza)
-* ceph-volume-zfs: add the inventory command (`pr#30995 <https://github.com/ceph/ceph/pull/30995>`_, Willem Jan Withagen)
-* ceph-volume/batch: fail on filtered devices when non-interactive (`pr#31978 <https://github.com/ceph/ceph/pull/31978>`_, Jan Fajerski)
-* ceph-volume/lvm/activate.py: clarify error message: fsid refers to osd_fsid (`pr#32351 <https://github.com/ceph/ceph/pull/32351>`_, Yaniv Kaul)
-* ceph-volume/test: patch VolumeGroups (`pr#31979 <https://github.com/ceph/ceph/pull/31979>`_, Jan Fajerski)
-* ceph-volume: add Cephs device id to inventory (`pr#31072 <https://github.com/ceph/ceph/pull/31072>`_, Sebastian Wagner)
-* ceph-volume: add db and wal support to raw mode (`pr#32828 <https://github.com/ceph/ceph/pull/32828>`_, S\xc3\xa9bastien Han)
-* ceph-volume: add methods to pass filters to pvs, vgs and lvs commands (`pr#32242 <https://github.com/ceph/ceph/pull/32242>`_, Rishabh Dave)
-* ceph-volume: add proper size attribute to partitions (`pr#31492 <https://github.com/ceph/ceph/pull/31492>`_, Jan Fajerski)
-* ceph-volume: add raw (--bluestore) mode (`pr#32095 <https://github.com/ceph/ceph/pull/32095>`_, Sage Weil)
-* ceph-volume: add sizing arguments to prepare (`pr#32235 <https://github.com/ceph/ceph/pull/32235>`_, Jan Fajerski)
-* ceph-volume: add utility functions (`pr#27282 <https://github.com/ceph/ceph/pull/27282>`_, Mohamad Gebai)
-* ceph-volume: allow raw block devices everywhere (`pr#31410 <https://github.com/ceph/ceph/pull/31410>`_, Jan Fajerski)
-* ceph-volume: allow to skip restorecon calls (`pr#31421 <https://github.com/ceph/ceph/pull/31421>`_, Alfredo Deza)
-* ceph-volume: api/lvm: check if list of LVs is empty (`pr#30101 <https://github.com/ceph/ceph/pull/30101>`_, Rishabh Dave)
-* ceph-volume: assume msgrV1 for all branches containing mimic (`pr#31592 <https://github.com/ceph/ceph/pull/31592>`_, Jan Fajerski)
-* ceph-volume: avoid calling zap_lv with a LV-less VG (`pr#33283 <https://github.com/ceph/ceph/pull/33283>`_, Jan Fajerski)
-* ceph-volume: batch bluestore fix create_lvs call (`pr#32929 <https://github.com/ceph/ceph/pull/32929>`_, Jan Fajerski)
-* ceph-volume: batch ensure device lists are disjoint (`pr#27754 <https://github.com/ceph/ceph/pull/27754>`_, Jan Fajerski)
-* ceph-volume: check if we run in an selinux environment (`pr#31809 <https://github.com/ceph/ceph/pull/31809>`_, Jan Fajerski)
-* ceph-volume: check if we run in an selinux environment, now also in py2 (`pr#31814 <https://github.com/ceph/ceph/pull/31814>`_, Jan Fajerski)
-* ceph-volume: Dereference symlink in lvm list (`pr#32525 <https://github.com/ceph/ceph/pull/32525>`_, Beno\xc3\xaet Knecht)
-* ceph-volume: detect ceph-disk osd if PARTLABEL is missing (`issue#40917 <http://tracker.ceph.com/issues/40917>`_, `pr#29401 <https://github.com/ceph/ceph/pull/29401>`_, Jan Fajerski)
-* ceph-volume: do not fail when trying to remove crypt mapper (`pr#30490 <https://github.com/ceph/ceph/pull/30490>`_, Guillaume Abrioux)
-* ceph-volume: dont keep device lists as sets (`pr#29683 <https://github.com/ceph/ceph/pull/29683>`_, Jan Fajerski)
-* ceph-volume: dont remove vg twice when zapping filestore (`pr#33332 <https://github.com/ceph/ceph/pull/33332>`_, Jan Fajerski)
-* ceph-volume: dont try to test lvm zap on simple tests (`pr#29659 <https://github.com/ceph/ceph/pull/29659>`_, Jan Fajerski)
-* ceph-volume: finer grained availability notion in inventory (`pr#32634 <https://github.com/ceph/ceph/pull/32634>`_, Jan Fajerski)
-* ceph-volume: fix batch functional tests, idempotent test must check s\xe2\x80\xa6 (`pr#29684 <https://github.com/ceph/ceph/pull/29684>`_, Jan Fajerski)
-* ceph-volume: fix device unittest, mock has_bluestore_label (`pr#32655 <https://github.com/ceph/ceph/pull/32655>`_, Jan Fajerski)
-* ceph-volume: fix has_bluestore_label() function (`pr#33074 <https://github.com/ceph/ceph/pull/33074>`_, Guillaume Abrioux)
-* ceph-volume: fix is_ceph_device for lvm batch (`pr#33223 <https://github.com/ceph/ceph/pull/33223>`_, Jan Fajerski, Dimitri Savineau)
-* ceph-volume: fix lvm list (`pr#33077 <https://github.com/ceph/ceph/pull/33077>`_, Guillaume Abrioux)
-* ceph-volume: fix regression and improve output in lvm list (`pr#33112 <https://github.com/ceph/ceph/pull/33112>`_, Jan Fajerski)
-* ceph-volume: fix stderr failure to decode/encode when redirected (`pr#30274 <https://github.com/ceph/ceph/pull/30274>`_, Alfredo Deza)
-* ceph-volume: fix the integer overflow (`pr#32106 <https://github.com/ceph/ceph/pull/32106>`_, dongdong tao)
-* ceph-volume: fix warnings raised by pytest (`pr#30422 <https://github.com/ceph/ceph/pull/30422>`_, Rishabh Dave)
-* ceph-volume: import mock.mock instead of unittest.mock (py2) (`pr#31816 <https://github.com/ceph/ceph/pull/31816>`_, Jan Fajerski)
-* ceph-volume: look for rotational data in lsblk (`pr#26957 <https://github.com/ceph/ceph/pull/26957>`_, Andrew Schoen)
-* ceph-volume: lvm: get_device_vgs() filter by provided prefix (`pr#33478 <https://github.com/ceph/ceph/pull/33478>`_, Jan Fajerski, Yehuda Sadeh)
-* ceph-volume: make get_devices fs location independent (`pr#31574 <https://github.com/ceph/ceph/pull/31574>`_, Jan Fajerski)
-* ceph-volume: minor clean-up of `simple scan` subcommand help (`pr#31821 <https://github.com/ceph/ceph/pull/31821>`_, Michael Fritch)
-* ceph-volume: minor optimizations related to class Volumess use (`pr#29665 <https://github.com/ceph/ceph/pull/29665>`_, Rishabh Dave)
-* ceph-volume: mokeypatch calls to lvm related binaries (`pr#31197 <https://github.com/ceph/ceph/pull/31197>`_, Jan Fajerski)
-* ceph-volume: never log to stdout, use stderr instead (`pr#29547 <https://github.com/ceph/ceph/pull/29547>`_, Jan Fajerski)
-* ceph-volume: pass --ssh-config to pytest to resolve hosts when connecting (`issue#40063 <http://tracker.ceph.com/issues/40063>`_, `pr#28294 <https://github.com/ceph/ceph/pull/28294>`_, Alfredo Deza)
-* ceph-volume: pass journal_size as Size not string (`pr#33320 <https://github.com/ceph/ceph/pull/33320>`_, Jan Fajerski)
-* ceph-volume: pre-install python-apt and its variants before test runs (`pr#30115 <https://github.com/ceph/ceph/pull/30115>`_, Alfredo Deza)
-* ceph-volume: print most logging messages to stderr (`issue#38548 <http://tracker.ceph.com/issues/38548>`_, `pr#27675 <https://github.com/ceph/ceph/pull/27675>`_, Jan Fajerski)
-* ceph-volume: PVolumes.filter shouldnt purge itself (`pr#30703 <https://github.com/ceph/ceph/pull/30703>`_, Rishabh Dave)
-* ceph-volume: rearrange api/lvm.py (`pr#30867 <https://github.com/ceph/ceph/pull/30867>`_, Rishabh Dave)
-* ceph-volume: refactor listing.py (`pr#31700 <https://github.com/ceph/ceph/pull/31700>`_, Rishabh Dave)
-* ceph-volume: reject disks smaller then 5GB in inventory (`issue#40776 <http://tracker.ceph.com/issues/40776>`_, `pr#29041 <https://github.com/ceph/ceph/pull/29041>`_, Jan Fajerski)
-* ceph-volume: revert --no-tmpfs change (`pr#30788 <https://github.com/ceph/ceph/pull/30788>`_, Sage Weil)
-* ceph-volume: silence ceph-bluestore-tool failures (`pr#33371 <https://github.com/ceph/ceph/pull/33371>`_, S\xc3\xa9bastien Han)
-* ceph-volume: skip osd creation when already done (`pr#33086 <https://github.com/ceph/ceph/pull/33086>`_, Guillaume Abrioux)
-* ceph-volume: strip _dmcrypt suffix in simple scan json output (`pr#33079 <https://github.com/ceph/ceph/pull/33079>`_, Jan Fajerski)
-* ceph-volume: systemd fix typo in log message (`pr#30497 <https://github.com/ceph/ceph/pull/30497>`_, Manu Zurm\xc3\xbchl)
-* ceph-volume: terminal: encode unicode when writing to stdout (`pr#27148 <https://github.com/ceph/ceph/pull/27148>`_, Alfredo Deza, Kefu Chai)
-* ceph-volume: use centos8 for functional testing (`pr#33174 <https://github.com/ceph/ceph/pull/33174>`_, Jan Fajerski)
-* ceph-volume: use correct extents if using db-devices and >1 osds_per_device (`pr#32177 <https://github.com/ceph/ceph/pull/32177>`_, Fabian Niepelt)
-* ceph-volume: use fsync for dd command (`pr#31479 <https://github.com/ceph/ceph/pull/31479>`_, Rishabh Dave)
-* ceph-volume: use get_device_vgs in has_common_vg (`pr#33246 <https://github.com/ceph/ceph/pull/33246>`_, Jan Fajerski)
-* ceph-volume: use python3 compatible print (`pr#30790 <https://github.com/ceph/ceph/pull/30790>`_, Kyr Shatskyy)
-* ceph-volume: use the Device.rotational property instead of sys_api (`pr#28060 <https://github.com/ceph/ceph/pull/28060>`_, Andrew Schoen)
-* ceph-volume: use the OSD identifier when reporting success (`pr#29762 <https://github.com/ceph/ceph/pull/29762>`_, Alfredo Deza)
-* ceph-volume: util: look for executable in $PATH (`pr#31787 <https://github.com/ceph/ceph/pull/31787>`_, Shyukri Shyukriev)
-* ceph-volume: util: Use proper param substition (`pr#28448 <https://github.com/ceph/ceph/pull/28448>`_, Shyukri Shyukriev)
-* ceph-volume: VolumeGroups.filter shouldnt purge itself (`pr#30707 <https://github.com/ceph/ceph/pull/30707>`_, Rishabh Dave)
-* ceph-volume: when testing disable the dashboard (`pr#29387 <https://github.com/ceph/ceph/pull/29387>`_, Andrew Schoen)
-* ceph.in: disable ASAN if libasan is not found (`pr#28247 <https://github.com/ceph/ceph/pull/28247>`_, Kefu Chai)
-* ceph.in: do not preload asan even if not needed (`pr#28703 <https://github.com/ceph/ceph/pull/28703>`_, Kefu Chai)
-* ceph.in: do not preload libasan if it is found (`pr#28275 <https://github.com/ceph/ceph/pull/28275>`_, Kefu Chai)
-* ceph.in: print decoded output in interactive mode (`pr#33099 <https://github.com/ceph/ceph/pull/33099>`_, Jun Su)
-* cephadm: --cap-add=SYS_PTRACE (`pr#33442 <https://github.com/ceph/ceph/pull/33442>`_, Sage Weil)
-* cephadm: Add ability to deploy grafana container (`pr#32491 <https://github.com/ceph/ceph/pull/32491>`_, Paul Cuzner)
-* cephadm: add ability to specify a timeout (`pr#32049 <https://github.com/ceph/ceph/pull/32049>`_, Michael Fritch)
-* cephadm: add alertmanager deployment feature (`pr#32949 <https://github.com/ceph/ceph/pull/32949>`_, Sage Weil, Paul Cuzner)
-* cephadm: add assert foo is not None for mypy check (`pr#33876 <https://github.com/ceph/ceph/pull/33876>`_, Kefu Chai)
-* cephadm: add grafana adopt (`pr#33746 <https://github.com/ceph/ceph/pull/33746>`_, Eric Jackson)
-* cephadm: add locking (`pr#32334 <https://github.com/ceph/ceph/pull/32334>`_, Sage Weil)
-* cephadm: add nfs-ganesha deployment (`pr#33064 <https://github.com/ceph/ceph/pull/33064>`_, Michael Fritch)
-* cephadm: add prepare-host (`pr#33374 <https://github.com/ceph/ceph/pull/33374>`_, Sage Weil)
-* cephadm: add prometheus adopt (`pr#33438 <https://github.com/ceph/ceph/pull/33438>`_, Eric Jackson)
-* cephadm: add reconfig service action (`pr#32281 <https://github.com/ceph/ceph/pull/32281>`_, Sage Weil)
-* cephadm: add start/stop hooks and c-v activate on container start (`pr#32158 <https://github.com/ceph/ceph/pull/32158>`_, Sage Weil)
-* cephadm: Add Zypper packager (openSUSE/SLES) (`pr#33461 <https://github.com/ceph/ceph/pull/33461>`_, Kristoffer Gr\xc3\xb6nlund)
-* cephadm: add `--retry` arg (`pr#33342 <https://github.com/ceph/ceph/pull/33342>`_, Michael Fritch)
-* cephadm: add {add,rm}-repo commands (`pr#33062 <https://github.com/ceph/ceph/pull/33062>`_, Sage Weil)
-* cephadm: add-repo: add --version (`pr#33961 <https://github.com/ceph/ceph/pull/33961>`_, Sage Weil)
-* cephadm: adopt fixes (`pr#32995 <https://github.com/ceph/ceph/pull/32995>`_, Sage Weil)
-* cephadm: allow multiple get_parm() calls (`pr#33437 <https://github.com/ceph/ceph/pull/33437>`_, Sage Weil)
-* cephadm: allow skipping prepare_host in bootstrap step (`pr#33504 <https://github.com/ceph/ceph/pull/33504>`_, Kiefer Chang)
-* cephadm: allow users to provide their dashboard cert during bootstrap (`pr#33472 <https://github.com/ceph/ceph/pull/33472>`_, Daniel-Pivonka)
-* cephadm: also return JSON decode error (`pr#33433 <https://github.com/ceph/ceph/pull/33433>`_, Sebastian Wagner)
-* cephadm: bootstrap: avoid repeat chars in generated password (`pr#32332 <https://github.com/ceph/ceph/pull/32332>`_, Sage Weil)
-* cephadm: bootstrap: deploy monitoring stack by default (`pr#33936 <https://github.com/ceph/ceph/pull/33936>`_, Sage Weil)
-* cephadm: bootstrap: nag about telemetry (`pr#33517 <https://github.com/ceph/ceph/pull/33517>`_, Sage Weil)
-* cephadm: bootstrap: wait for mgr to restart after enabling a module (`pr#33857 <https://github.com/ceph/ceph/pull/33857>`_, Sage Weil)
-* cephadm: bootstrap: warn on fqdn hostname (`pr#33042 <https://github.com/ceph/ceph/pull/33042>`_, Sage Weil)
-* cephadm: check for both chrony service names (`pr#33369 <https://github.com/ceph/ceph/pull/33369>`_, Sage Weil)
-* cephadm: check for both ntp.service and ntpd.service (`pr#32302 <https://github.com/ceph/ceph/pull/32302>`_, Sage Weil)
-* cephadm: clean up the systemd unit and ceph-crash shutdown behavior (`pr#32685 <https://github.com/ceph/ceph/pull/32685>`_, Sage Weil)
-* cephadm: correct ipv6 support in port open detection (`pr#32286 <https://github.com/ceph/ceph/pull/32286>`_, Paul Cuzner)
-* cephadm: create /var/run/ceph/$fsid as needed (`pr#32390 <https://github.com/ceph/ceph/pull/32390>`_, Sage Weil)
-* cephadm: disable node-exporter cpu/memory limits for the time being (`pr#33133 <https://github.com/ceph/ceph/pull/33133>`_, Sage Weil)
-* cephadm: drop sha256: prefix on container id (`pr#32300 <https://github.com/ceph/ceph/pull/32300>`_, Sage Weil)
-* cephadm: error out on filestore OSDs (`pr#33395 <https://github.com/ceph/ceph/pull/33395>`_, Sage Weil)
-* cephadm: fix adoption safety check (`pr#33445 <https://github.com/ceph/ceph/pull/33445>`_, Sage Weil)
-* cephadm: fix ceph version probe (`pr#33136 <https://github.com/ceph/ceph/pull/33136>`_, Sage Weil)
-* cephadm: fix container cleanup (`pr#32282 <https://github.com/ceph/ceph/pull/32282>`_, Sage Weil)
-* cephadm: fix datetime regexp to capture at most 6 digits (`pr#33932 <https://github.com/ceph/ceph/pull/33932>`_, Michael Fritch)
-* cephadm: fix deploy crash when no `args.fsid` (`pr#33248 <https://github.com/ceph/ceph/pull/33248>`_, Michael Fritch)
-* cephadm: fix error handing in `command_check_host()` (`pr#33048 <https://github.com/ceph/ceph/pull/33048>`_, Guillaume Abrioux)
-* cephadm: fix failure when getting keyring for deploying daemons (`pr#33679 <https://github.com/ceph/ceph/pull/33679>`_, Kiefer Chang)
-* cephadm: fix help message for bootstrap --mgr-id (`pr#32640 <https://github.com/ceph/ceph/pull/32640>`_, Sage Weil)
-* cephadm: fix inspect-image (`pr#33109 <https://github.com/ceph/ceph/pull/33109>`_, Sage Weil)
-* cephadm: fix logging defaults (`pr#32641 <https://github.com/ceph/ceph/pull/32641>`_, Sage Weil)
-* cephadm: fix name argument parsing during image check for non-ceph components (`pr#33114 <https://github.com/ceph/ceph/pull/33114>`_, Daniel-Pivonka)
-* cephadm: Fix Py3 ConfigParser deprecation warnings (`pr#32218 <https://github.com/ceph/ceph/pull/32218>`_, Michael Fritch)
-* cephadm: fix tox DeprecationWarning (`pr#32753 <https://github.com/ceph/ceph/pull/32753>`_, Michael Fritch)
-* cephadm: fix v1/v2 ip/addrv handling; explicitly check bind to ip:port (`pr#32392 <https://github.com/ceph/ceph/pull/32392>`_, Sage Weil)
-* cephadm: fix `alertmanager not implemented yet` (`pr#33694 <https://github.com/ceph/ceph/pull/33694>`_, Patrick Seidensal)
-* cephadm: flag dashboard user to change password (`pr#32990 <https://github.com/ceph/ceph/pull/32990>`_, Daniel-Pivonka)
-* cephadm: further simplify mon setup (`pr#33952 <https://github.com/ceph/ceph/pull/33952>`_, Sage Weil)
-* cephadm: implement install command (`pr#33979 <https://github.com/ceph/ceph/pull/33979>`_, Sage Weil)
-* cephadm: improve handling of crash agent container (`pr#33189 <https://github.com/ceph/ceph/pull/33189>`_, Sage Weil)
-* cephadm: include daemon/unit id in unit name (`pr#32970 <https://github.com/ceph/ceph/pull/32970>`_, Sage Weil)
-* cephadm: Infer ceph image (`pr#33829 <https://github.com/ceph/ceph/pull/33829>`_, Sage Weil, Ricardo Marques)
-* cephadm: infer the fsid by name (`pr#32795 <https://github.com/ceph/ceph/pull/32795>`_, Michael Fritch)
-* cephadm: KillMode=none in unit file (`pr#33162 <https://github.com/ceph/ceph/pull/33162>`_, Sage Weil)
-* cephadm: leave backup when removing stateful daemons (`pr#33973 <https://github.com/ceph/ceph/pull/33973>`_, Sage Weil)
-* cephadm: make add-repo --release and --version independent (`pr#34034 <https://github.com/ceph/ceph/pull/34034>`_, Sage Weil)
-* cephadm: merge `--config-and-keyring` and `--config-json` args (`pr#33870 <https://github.com/ceph/ceph/pull/33870>`_, Michael Fritch)
-* cephadm: misc upgrade fixes (`pr#32794 <https://github.com/ceph/ceph/pull/32794>`_, Sage Weil)
-* cephadm: no --no-systemd arg to ceph-volume deactivate (`pr#32886 <https://github.com/ceph/ceph/pull/32886>`_, Sage Weil)
-* cephadm: only infer image for shell, run, inspect-image, pull, ceph-volume (`pr#34030 <https://github.com/ceph/ceph/pull/34030>`_, Sage Weil)
-* cephadm: podman inspect: image field was called `ImageID` (`pr#32616 <https://github.com/ceph/ceph/pull/32616>`_, Sebastian Wagner)
-* cephadm: prepare-host: do not create Packager unless we need it (`pr#33443 <https://github.com/ceph/ceph/pull/33443>`_, Sage Weil)
-* cephadm: pull: strip newline from version string (`pr#33446 <https://github.com/ceph/ceph/pull/33446>`_, Sage Weil)
-* cephadm: python3 shebang (`pr#32378 <https://github.com/ceph/ceph/pull/32378>`_, Sage Weil)
-* cephadm: re-introduce the `podman logs` command (`pr#33089 <https://github.com/ceph/ceph/pull/33089>`_, Michael Fritch)
-* cephadm: Read ceph version from io.ceph.version label if set (`pr#32982 <https://github.com/ceph/ceph/pull/32982>`_, Kristoffer Gr\xc3\xb6nlund)
-* cephadm: Refactor, prepare for other adoptions (`pr#33672 <https://github.com/ceph/ceph/pull/33672>`_, Eric Jackson)
-* cephadm: relabel /etc/ganesha mount (`pr#34098 <https://github.com/ceph/ceph/pull/34098>`_, Sage Weil)
-* cephadm: remove orphan daemons (`pr#33830 <https://github.com/ceph/ceph/pull/33830>`_, Sage Weil)
-* cephadm: remove `logs` command (`pr#32752 <https://github.com/ceph/ceph/pull/32752>`_, Michael Fritch)
-* cephadm: Rename tox tests ceph-daemon -> cephadm (`pr#32353 <https://github.com/ceph/ceph/pull/32353>`_, Michael Fritch)
-* cephadm: report image name for stopped daemons (`pr#33190 <https://github.com/ceph/ceph/pull/33190>`_, Sage Weil)
-* cephadm: report version for grafana prom etc (`pr#33804 <https://github.com/ceph/ceph/pull/33804>`_, Sage Weil)
-* cephadm: shell: allow -e (`pr#33191 <https://github.com/ceph/ceph/pull/33191>`_, Sage Weil)
-* cephadm: shell: default to config and keyring in /etc/ceph, if present (`pr#33793 <https://github.com/ceph/ceph/pull/33793>`_, Sage Weil)
-* cephadm: shell: do not bind ceph.conf twice (`pr#32425 <https://github.com/ceph/ceph/pull/32425>`_, Sage Weil)
-* cephadm: shell: keep .bash_history in /var/log/ceph/$fsid (`pr#33519 <https://github.com/ceph/ceph/pull/33519>`_, Sage Weil)
-* cephadm: show contextual message when port is in use (`pr#32560 <https://github.com/ceph/ceph/pull/32560>`_, Michael Fritch)
-* cephadm: simplify Monitoring.components structure (`pr#32977 <https://github.com/ceph/ceph/pull/32977>`_, Michael Fritch)
-* cephadm: SO_REUSEADDR when doing bind check (`pr#32712 <https://github.com/ceph/ceph/pull/32712>`_, Sage Weil)
-* cephadm: streamline bootstrap a bit (`pr#33980 <https://github.com/ceph/ceph/pull/33980>`_, Sage Weil)
-* cephadm: support deployment of node-exporter (`pr#32340 <https://github.com/ceph/ceph/pull/32340>`_, Paul Cuzner)
-* cephadm: support deployment of prometheus container (`pr#32198 <https://github.com/ceph/ceph/pull/32198>`_, Sebastian Wagner, Paul Cuzner)
-* cephadm: switch grafana image to the ceph repo (`pr#34082 <https://github.com/ceph/ceph/pull/34082>`_, Paul Cuzner)
-* cephadm: update unit.\\* atomically (`pr#33895 <https://github.com/ceph/ceph/pull/33895>`_, Sage Weil)
-* cephadm: use appropriate default image for non-ceph components (`pr#33069 <https://github.com/ceph/ceph/pull/33069>`_, Sage Weil)
-* cephadm: use spec to deploy crash on every host (`pr#33658 <https://github.com/ceph/ceph/pull/33658>`_, Sage Weil)
-* cephadm: use `sh` instead of `bash` during enter (`pr#33822 <https://github.com/ceph/ceph/pull/33822>`_, Michael Fritch)
-* cephadm: wait longer for things to come up (`pr#33216 <https://github.com/ceph/ceph/pull/33216>`_, Sage Weil)
-* cephfs,common,core: global: disable THP for Ceph daemons (`pr#31582 <https://github.com/ceph/ceph/pull/31582>`_, Patrick Donnelly, Mark Nelson)
-* cephfs,common,rbd: common/config_proxy: hold lock while accessing mutable container (`pr#29809 <https://github.com/ceph/ceph/pull/29809>`_, Jason Dillaman)
-* cephfs,common: common/secret.c: fix key parsing when doing a remount (`pr#28148 <https://github.com/ceph/ceph/pull/28148>`_, Luis Henriques)
-* cephfs,common: osdc: should release the rwlock before waiting (`pr#29686 <https://github.com/ceph/ceph/pull/29686>`_, Kefu Chai)
-* cephfs,core: mds/MDSDaemon: fix asok exit and respawn commands (`pr#32251 <https://github.com/ceph/ceph/pull/32251>`_, Sage Weil)
-* cephfs,core: msg/async: perform the v2 resets in proper EventCenter (`pr#30717 <https://github.com/ceph/ceph/pull/30717>`_, Radoslaw Zarzynski)
-* cephfs,core: qa/suites/rados/mgr/tasks/module_selftest: whitelist mgr client getting backlisted (`issue#40867 <http://tracker.ceph.com/issues/40867>`_, `pr#29169 <https://github.com/ceph/ceph/pull/29169>`_, Sage Weil)
-* cephfs,core: qa/suites/upgrade: a few more octopus fixes (`pr#32853 <https://github.com/ceph/ceph/pull/32853>`_, Sage Weil)
-* cephfs,core: qa: log warning on scrub error (`pr#32739 <https://github.com/ceph/ceph/pull/32739>`_, Patrick Donnelly)
-* cephfs,core: src/: define ceph_release_t and use it (`pr#27855 <https://github.com/ceph/ceph/pull/27855>`_, Kefu Chai)
-* cephfs,mgr,mon: mon/MDSMonitor: enforce mds_join_fs cluster affinity (`pr#33194 <https://github.com/ceph/ceph/pull/33194>`_, Patrick Donnelly)
-* cephfs,mgr,mon: mon/MgrMonitor: blacklist previous instance of ceph-mgr during failover (`pr#31797 <https://github.com/ceph/ceph/pull/31797>`_, Patrick Donnelly)
-* cephfs,mgr,pybind: mgr/prometheus: export standby mds metadata (`pr#29996 <https://github.com/ceph/ceph/pull/29996>`_, lei01.liu)
-* cephfs,mgr,pybind: mgr/volumes: minor enhancements and fixes (`issue#40429 <http://tracker.ceph.com/issues/40429>`_, `pr#28706 <https://github.com/ceph/ceph/pull/28706>`_, Ramana Raja)
-* cephfs,mgr: mds/MDSRank: report state to mgr as mds id, not rank (`pr#31231 <https://github.com/ceph/ceph/pull/31231>`_, Patrick Donnelly, Sage Weil)
-* cephfs,mgr: mgr/volume: ceph cephfs metadata pool pg_num_min and bias (`pr#27374 <https://github.com/ceph/ceph/pull/27374>`_, Sage Weil)
-* cephfs,mgr: mgr/volumes: cleanup libcephfs handles on plugin shutdown (`issue#42299 <http://tracker.ceph.com/issues/42299>`_, `pr#30890 <https://github.com/ceph/ceph/pull/30890>`_, Venky Shankar)
-* cephfs,mgr: pybind/mgr/volumes: use py3 items iterator (`pr#31986 <https://github.com/ceph/ceph/pull/31986>`_, Patrick Donnelly)
-* cephfs,mgr: qa: use skipTest method instead of exception (`pr#27761 <https://github.com/ceph/ceph/pull/27761>`_, Patrick Donnelly)
-* cephfs,mon: mon/MDSMonitor: cleanup check_subs (`pr#32308 <https://github.com/ceph/ceph/pull/32308>`_, Patrick Donnelly)
-* cephfs,mon: mon/MDSMonitor: handle standby already without fscid (`pr#32585 <https://github.com/ceph/ceph/pull/32585>`_, Patrick Donnelly)
-* cephfs,pybind: libcephfs: add missing declaration of ceph_getaddrs() (`pr#32629 <https://github.com/ceph/ceph/pull/32629>`_, Kefu Chai)
-* cephfs,pybind: mgr/volumes: add `ceph fs subvolumegroup getpath` command (`issue#40617 <http://tracker.ceph.com/issues/40617>`_, `pr#29103 <https://github.com/ceph/ceph/pull/29103>`_, Ramana Raja)
-* cephfs,pybind: mgr/volumes: set uid/gid of FS clients mount as 0/0 (`issue#40927 <http://tracker.ceph.com/issues/40927>`_, `pr#29355 <https://github.com/ceph/ceph/pull/29355>`_, Ramana Raja)
-* cephfs,pybind: pybind/cephfs: add cephfs python API removexattr() (`pr#30641 <https://github.com/ceph/ceph/pull/30641>`_, bingyi zhang)
-* cephfs,pybind: pybind/cephfs: Add listxattr (`pr#32804 <https://github.com/ceph/ceph/pull/32804>`_, Varsha Rao)
-* cephfs,rbd,tests: qa/tasks: drop object inherit (`pr#29843 <https://github.com/ceph/ceph/pull/29843>`_, Jos Collin)
-* cephfs,rbd: osdc: using decltype(auto) instead of trailing return type (`pr#29931 <https://github.com/ceph/ceph/pull/29931>`_, Yao Zongyou)
-* cephfs,tests: cephfs-shell: teuthology tests (`issue#39526 <http://tracker.ceph.com/issues/39526>`_, `pr#27872 <https://github.com/ceph/ceph/pull/27872>`_, Milind Changire)
-* cephfs,tests: mgr/volumes: fs subvolume resize command (`pr#30054 <https://github.com/ceph/ceph/pull/30054>`_, Jos Collin)
-* cephfs,tests: qa/cephfs: add test for ACLs (`pr#29421 <https://github.com/ceph/ceph/pull/29421>`_, Rishabh Dave)
-* cephfs,tests: qa/cephfs: change deps for xfstests-dev on centos8 (`pr#32524 <https://github.com/ceph/ceph/pull/32524>`_, Rishabh Dave)
-* cephfs,tests: qa/cephfs: dont test kclient on RHEL 7 (`pr#32582 <https://github.com/ceph/ceph/pull/32582>`_, Rishabh Dave)
-* cephfs,tests: qa/cephfs: update xfstests-dev deps for RHEL 8 (`pr#33427 <https://github.com/ceph/ceph/pull/33427>`_, Rishabh Dave)
-* cephfs,tests: qa/suites/powercycle: install build deps for building xfstest (`pr#33874 <https://github.com/ceph/ceph/pull/33874>`_, Kefu Chai)
-* cephfs,tests: qa/tasks/cephfs/fuse_mount: use python3 (`pr#32339 <https://github.com/ceph/ceph/pull/32339>`_, Sage Weil)
-* cephfs,tests: qa/tasks: add exception in do_thrash() (`pr#29067 <https://github.com/ceph/ceph/pull/29067>`_, Jos Collin)
-* cephfs,tests: qa/tasks: DaemonWatchdog Expansion (`issue#10369 <http://tracker.ceph.com/issues/10369>`_, `issue#11314 <http://tracker.ceph.com/issues/11314>`_, `pr#28378 <https://github.com/ceph/ceph/pull/28378>`_, Jos Collin)
-* cephfs,tests: qa/tasks: Fix raises that doesnt re-raise (`pr#30201 <https://github.com/ceph/ceph/pull/30201>`_, Jos Collin)
-* cephfs,tests: qa/tasks: fixed typo in the comment (`pr#29759 <https://github.com/ceph/ceph/pull/29759>`_, Jos Collin)
-* cephfs,tests: qa/tasks: improvements in vstart_runner.py and mount.py (`pr#27481 <https://github.com/ceph/ceph/pull/27481>`_, Rishabh Dave)
-* cephfs,tests: qa/tasks: upgrade command arguments checks in vstart_runner.py (`pr#28198 <https://github.com/ceph/ceph/pull/28198>`_, Rishabh Dave)
-* cephfs,tests: qa/tests: reduce number of jobs for `kcephfs` (`pr#27328 <https://github.com/ceph/ceph/pull/27328>`_, Yuri Weinstein)
-* cephfs,tests: qa/tests: reduced number of jobs for `kcephfs` (`pr#27165 <https://github.com/ceph/ceph/pull/27165>`_, Yuri Weinstein)
-* cephfs,tests: qa/vstart_runner.py: make run()s interface same as teuthologys run (`pr#33263 <https://github.com/ceph/ceph/pull/33263>`_, Rishabh Dave)
-* cephfs,tests: qa: note timeout in debug message (`pr#32162 <https://github.com/ceph/ceph/pull/32162>`_, Patrick Donnelly)
-* cephfs,tests: qa: stop DaemonWatchdog for each cluster in daemon roles (`pr#29821 <https://github.com/ceph/ceph/pull/29821>`_, Patrick Donnelly)
-* cephfs,tests: qa: test fs:upgrade when running upgrade suite (`pr#31206 <https://github.com/ceph/ceph/pull/31206>`_, Patrick Donnelly)
-* cephfs,tests: test: define ALLPERMS if not yet (`pr#30726 <https://github.com/ceph/ceph/pull/30726>`_, Kefu Chai)
-* cephfs,tests: test_cephfs_shell: fix test_du_works_for_hardlinks (`pr#32168 <https://github.com/ceph/ceph/pull/32168>`_, Rishabh Dave)
-* cephfs,tests: test_cephfs_shell: initialize stderr for run_cephfs_shell_cmd() (`pr#31626 <https://github.com/ceph/ceph/pull/31626>`_, Rishabh Dave)
-* cephfs,tests: test_sessionmap: use sudo_write_file() from teuthology.misc (`pr#29123 <https://github.com/ceph/ceph/pull/29123>`_, Rishabh Dave)
-* cephfs,tools: cephfs-journal-tool: fix crash and usage (`pr#32452 <https://github.com/ceph/ceph/pull/32452>`_, Xiubo Li)
-* cephfs,tools: mount.ceph: fix incorrect options parsing (`pr#33197 <https://github.com/ceph/ceph/pull/33197>`_, Xiubo Li)
-* cephfs,tools: vstart.sh: highlight presence of stray conf (`pr#31403 <https://github.com/ceph/ceph/pull/31403>`_, Milind Changire)
-* cephfs:  client: more precise CEPH_CLIENT_CAPS_PENDING_CAPSNAP (`pr#28685 <https://github.com/ceph/ceph/pull/28685>`_, Yan, Zheng)
-* cephfs:  mds: change how mds revoke stale caps (`issue#17854 <http://tracker.ceph.com/issues/17854>`_, `pr#26737 <https://github.com/ceph/ceph/pull/26737>`_, Yan, Zheng, Rishabh Dave)
-* cephfs:  mds: fix corner case of replaying open sessions (`pr#28456 <https://github.com/ceph/ceph/pull/28456>`_, Yan, Zheng)
-* cephfs: Add doc for deploying cephfs-nfs cluster using rook (`pr#30914 <https://github.com/ceph/ceph/pull/30914>`_, Varsha Rao)
-* cephfs: Allow mount.ceph to get mount info from ceph configs and keyrings (`pr#29817 <https://github.com/ceph/ceph/pull/29817>`_, Jeff Layton)
-* cephfs: avoid map client_caps  been inserted by mistake (`pr#29304 <https://github.com/ceph/ceph/pull/29304>`_, XiaoGuoDong2019)
-* cephfs: ceph-mds: dump all info of ceph_file_layout, InodeStoreBase, frag_inf\xe2\x80\xa6 (`pr#28874 <https://github.com/ceph/ceph/pull/28874>`_, simon gao)
-* cephfs: ceph-mds: set ceph_mds cpu affinity (`pr#31712 <https://github.com/ceph/ceph/pull/31712>`_, qilianghong)
-* cephfs: cephfs pybind: added lseek() function to cephfs pybind (`pr#27688 <https://github.com/ceph/ceph/pull/27688>`_, Xiaowei Chu)
-* cephfs: cephfs-shell: Add command for setxattr, getxattr and listxattr (`pr#32570 <https://github.com/ceph/ceph/pull/32570>`_, Varsha Rao)
-* cephfs: cephfs-shell: Add error message for invalid ls commands (`pr#28652 <https://github.com/ceph/ceph/pull/28652>`_, Varsha Rao)
-* cephfs: cephfs-shell: add quota management (`issue#39165 <http://tracker.ceph.com/issues/39165>`_, `pr#27483 <https://github.com/ceph/ceph/pull/27483>`_, Milind Changire)
-* cephfs: cephfs-shell: add snapshot management (`issue#38681 <http://tracker.ceph.com/issues/38681>`_, `pr#27467 <https://github.com/ceph/ceph/pull/27467>`_, Milind Changire)
-* cephfs: cephfs-shell: Add stat command (`pr#27753 <https://github.com/ceph/ceph/pull/27753>`_, Varsha Rao)
-* cephfs: cephfs-shell: Add tox for testing with flake8 (`pr#28239 <https://github.com/ceph/ceph/pull/28239>`_, Varsha Rao)
-* cephfs: cephfs-shell: better complain info, when deleting non-empty directory (`issue#40864 <http://tracker.ceph.com/issues/40864>`_, `pr#30341 <https://github.com/ceph/ceph/pull/30341>`_, Shen Hang)
-* cephfs: cephfs-shell: Catch OSError exceptions in lcd (`issue#40243 <http://tracker.ceph.com/issues/40243>`_, `pr#28473 <https://github.com/ceph/ceph/pull/28473>`_, Varsha Rao)
-* cephfs: cephfs-shell: cd with no args must change CWD to root (`issue#40476 <http://tracker.ceph.com/issues/40476>`_, `pr#28793 <https://github.com/ceph/ceph/pull/28793>`_, Rishabh Dave)
-* cephfs: cephfs-shell: changes related to read_ceph_conf() (`pr#32347 <https://github.com/ceph/ceph/pull/32347>`_, Rishabh Dave)
-* cephfs: cephfs-shell: changes to stderr and stdout messages (`pr#30365 <https://github.com/ceph/ceph/pull/30365>`_, Rishabh Dave)
-* cephfs: cephfs-shell: Convert paths type from string to bytes (`pr#29552 <https://github.com/ceph/ceph/pull/29552>`_, Varsha Rao)
-* cephfs: cephfs-shell: du should ignore non-directory files (`issue#40371 <http://tracker.ceph.com/issues/40371>`_, `pr#28560 <https://github.com/ceph/ceph/pull/28560>`_, Rishabh Dave, Varsha Rao)
-* cephfs: cephfs-shell: Fix df command errors (`pr#27894 <https://github.com/ceph/ceph/pull/27894>`_, Varsha Rao)
-* cephfs: cephfs-shell: Fix flake8 blank line and indentation error (`pr#29149 <https://github.com/ceph/ceph/pull/29149>`_, Varsha Rao)
-* cephfs: cephfs-shell: Fix hidden files and directories list by ls command (`pr#27266 <https://github.com/ceph/ceph/pull/27266>`_, Varsha Rao)
-* cephfs: cephfs-shell: Fix lls command errors (`issue#40244 <http://tracker.ceph.com/issues/40244>`_, `pr#28475 <https://github.com/ceph/ceph/pull/28475>`_, Varsha Rao)
-* cephfs: cephfs-shell: Fix ls -l (`pr#32801 <https://github.com/ceph/ceph/pull/32801>`_, Kotresh HR)
-* cephfs: cephfs-shell: Fix mkdir relative path error (`pr#27822 <https://github.com/ceph/ceph/pull/27822>`_, Varsha Rao)
-* cephfs: cephfs-shell: Fix multiple flake8 errors (`pr#28080 <https://github.com/ceph/ceph/pull/28080>`_, Varsha Rao)
-* cephfs: cephfs-shell: Fix multiple flake8 errors (`pr#28433 <https://github.com/ceph/ceph/pull/28433>`_, Varsha Rao)
-* cephfs: cephfs-shell: Fix multiple flake8 errors (`pr#29374 <https://github.com/ceph/ceph/pull/29374>`_, Varsha Rao)
-* cephfs: cephfs-shell: Fix onecmd TypeError (`pr#29554 <https://github.com/ceph/ceph/pull/29554>`_, Varsha Rao)
-* cephfs: cephfs-shell: Fix print of error messages to stdout (`pr#28447 <https://github.com/ceph/ceph/pull/28447>`_, Varsha Rao)
-* cephfs: cephfs-shell: Fix rmdir -p issues and add tests for rmdir (`pr#31633 <https://github.com/ceph/ceph/pull/31633>`_, Varsha Rao)
-* cephfs: cephfs-shell: fix string decoding for ls command (`issue#39404 <http://tracker.ceph.com/issues/39404>`_, `pr#27716 <https://github.com/ceph/ceph/pull/27716>`_, Milind Changire)
-* cephfs: cephfs-shell: Fix TypeError in poutput() (`pr#28906 <https://github.com/ceph/ceph/pull/28906>`_, Varsha Rao)
-* cephfs: cephfs-shell: Fix typo for mounting (`pr#28718 <https://github.com/ceph/ceph/pull/28718>`_, Varsha Rao)
-* cephfs: cephfs-shell: fix unecessary usage of to_bytes for file paths (`issue#40455 <http://tracker.ceph.com/issues/40455>`_, `pr#28663 <https://github.com/ceph/ceph/pull/28663>`_, Patrick Donnelly)
-* cephfs: cephfs-shell: fix various tracebacks (`issue#38743 <http://tracker.ceph.com/issues/38743>`_, `issue#38739 <http://tracker.ceph.com/issues/38739>`_, `issue#38741 <http://tracker.ceph.com/issues/38741>`_, `issue#38740 <http://tracker.ceph.com/issues/38740>`_, `pr#27235 <https://github.com/ceph/ceph/pull/27235>`_, Milind Changire)
-* cephfs: cephfs-shell: make compatible with cmd2 versions after 0.9.13 (`pr#30585 <https://github.com/ceph/ceph/pull/30585>`_, Rishabh Dave)
-* cephfs: cephfs-shell: make every command set a return value on failure (`pr#32213 <https://github.com/ceph/ceph/pull/32213>`_, Rishabh Dave)
-* cephfs: cephfs-shell: print helpful message when conf file is not found (`pr#31460 <https://github.com/ceph/ceph/pull/31460>`_, Rishabh Dave)
-* cephfs: cephfs-shell: py version fixes (`issue#40418 <http://tracker.ceph.com/issues/40418>`_, `pr#28638 <https://github.com/ceph/ceph/pull/28638>`_, Patrick Donnelly)
-* cephfs: cephfs-shell: read options from ceph.conf (`pr#29964 <https://github.com/ceph/ceph/pull/29964>`_, Rishabh Dave)
-* cephfs: cephfs-shell: rearrange code for convenience (`pr#31629 <https://github.com/ceph/ceph/pull/31629>`_, Rishabh Dave)
-* cephfs: cephfs-shell: Remove extra length argument passed to setxattr() (`pr#30802 <https://github.com/ceph/ceph/pull/30802>`_, Varsha Rao)
-* cephfs: cephfs-shell: Remove str object references to attribute decode (`pr#27345 <https://github.com/ceph/ceph/pull/27345>`_, Varsha Rao)
-* cephfs: cephfs-shell: Remove undefined variable files in do_rm() (`pr#28710 <https://github.com/ceph/ceph/pull/28710>`_, Varsha Rao)
-* cephfs: cephfs-shell: return non-zero value on error (`pr#30657 <https://github.com/ceph/ceph/pull/30657>`_, Rishabh Dave)
-* cephfs: cephfs-shell: rewrite help text for put and get commands (`pr#30297 <https://github.com/ceph/ceph/pull/30297>`_, Rishabh Dave)
-* cephfs: cephfs-shell: Use colorama module instead of colorize (`pr#27427 <https://github.com/ceph/ceph/pull/27427>`_, Varsha Rao)
-* cephfs: ceph_volume_client: convert string to bytes object (`issue#40369 <http://tracker.ceph.com/issues/40369>`_, `issue#40800 <http://tracker.ceph.com/issues/40800>`_, `pr#28557 <https://github.com/ceph/ceph/pull/28557>`_, Rishabh Dave)
-* cephfs: ceph_volume_client: decode d_name before using it (`issue#39406 <http://tracker.ceph.com/issues/39406>`_, `pr#28196 <https://github.com/ceph/ceph/pull/28196>`_, Rishabh Dave)
-* cephfs: client: add client_fs mount option support (`pr#33506 <https://github.com/ceph/ceph/pull/33506>`_, Xiubo Li)
-* cephfs: client: Add is_dir() check before changing directory (`pr#32637 <https://github.com/ceph/ceph/pull/32637>`_, Varsha Rao)
-* cephfs: client: add procession of SEEK_HOLE and SEEK_DATA in lseek (`pr#30416 <https://github.com/ceph/ceph/pull/30416>`_, Shen Hang)
-* cephfs: client: add stx_btime and stx_version in cephfs.pyx (`pr#30206 <https://github.com/ceph/ceph/pull/30206>`_, huanwen ren)
-* cephfs: client: add warning when cap != in->auth_cap (`pr#30402 <https://github.com/ceph/ceph/pull/30402>`_, Shen Hang)
-* cephfs: client: avoid length overflow by calling the lseek function (`pr#29626 <https://github.com/ceph/ceph/pull/29626>`_, wenpengLi)
-* cephfs: Client: bump ll_ref from int32 to uint64_t (`pr#29136 <https://github.com/ceph/ceph/pull/29136>`_, Xiaoxi CHEN)
-* cephfs: client: directory size always is zero lead to is_quota_bytes_approaching lose efficacy (`pr#26104 <https://github.com/ceph/ceph/pull/26104>`_, guoyong)
-* cephfs: client: disallow changing fuse_default_permissions option at runtime (`pr#32315 <https://github.com/ceph/ceph/pull/32315>`_, Zhi Zhang)
-* cephfs: client: dont report any vxattrs to listxattr (`pr#29339 <https://github.com/ceph/ceph/pull/29339>`_, Jeff Layton)
-* cephfs: client: fix bad error handling in ll_lookup_inode (`issue#40085 <http://tracker.ceph.com/issues/40085>`_, `pr#28324 <https://github.com/ceph/ceph/pull/28324>`_, Jeff Layton)
-* cephfs: client: fix bad error handling in lseek SEEK_HOLE / SEEK_DATA (`pr#33480 <https://github.com/ceph/ceph/pull/33480>`_, Jeff Layton)
-* cephfs: client: fix dir.rctime and snap.btime vxattr values (`pr#28116 <https://github.com/ceph/ceph/pull/28116>`_, David Disseldorp)
-* cephfs: client: fix fuse client hang because its bad session PipeConnection to mds (`issue#39305 <http://tracker.ceph.com/issues/39305>`_, `pr#27482 <https://github.com/ceph/ceph/pull/27482>`_, Guan yunfei)
-* cephfs: client: fix lazyio_synchronize() to update file size (`pr#29705 <https://github.com/ceph/ceph/pull/29705>`_, Sidharth Anupkrishnan)
-* cephfs: client: Fixes for missing consts SEEK_DATA and SEEK_HOLE on alpine linux (`pr#33104 <https://github.com/ceph/ceph/pull/33104>`_, Stefan Bischoff)
-* cephfs: client: nfs-ganesha with cephfs client, removing dir reports not empty (`issue#40746 <http://tracker.ceph.com/issues/40746>`_, `pr#29005 <https://github.com/ceph/ceph/pull/29005>`_, Peng Xie)
-* cephfs: client: optimize rename operation under different quota root (`issue#39715 <http://tracker.ceph.com/issues/39715>`_, `pr#28077 <https://github.com/ceph/ceph/pull/28077>`_, Zhi Zhang)
-* cephfs: client: remove Inode.dir_contacts field and handle bad whence value to llseek gracefully (`pr#30580 <https://github.com/ceph/ceph/pull/30580>`_, Jeff Layton)
-* cephfs: client: remove unused variable (`pr#31509 <https://github.com/ceph/ceph/pull/31509>`_, su_nan@inspur.com)
-* cephfs: client: return -EIO when sync file which unsafe reqs have been dropped (`issue#40877 <http://tracker.ceph.com/issues/40877>`_, `pr#29167 <https://github.com/ceph/ceph/pull/29167>`_, simon gao)
-* cephfs: client: set snapdirs link count to 1 (`pr#28545 <https://github.com/ceph/ceph/pull/28545>`_, Yan, Zheng)
-* cephfs: client: support the fallocate() when fuse version >= 2.9 (`issue#40615 <http://tracker.ceph.com/issues/40615>`_, `pr#28831 <https://github.com/ceph/ceph/pull/28831>`_, huanwen ren)
-* cephfs: Client: unlink dentry for inode with llref=0 (`issue#40960 <http://tracker.ceph.com/issues/40960>`_, `pr#29321 <https://github.com/ceph/ceph/pull/29321>`_, Xiaoxi CHEN)
-* cephfs: client: _readdir_cache_cb() may use the readdir_cache already clear (`issue#41148 <http://tracker.ceph.com/issues/41148>`_, `pr#29526 <https://github.com/ceph/ceph/pull/29526>`_, huanwen ren)
-* cephfs: client\xef\xbc\x9aEINVAL may be returned when offset is 0 (`pr#30312 <https://github.com/ceph/ceph/pull/30312>`_, wenpengLi)
-* cephfs: Deploy ganesha daemons with vstart (`pr#31527 <https://github.com/ceph/ceph/pull/31527>`_, Varsha Rao)
-* cephfs: expose snapshot creation time as new ceph.snap.btime vxattr (`pr#27077 <https://github.com/ceph/ceph/pull/27077>`_, David Disseldorp)
-* cephfs: include: fix interval_set const_iterator call operator type (`pr#32185 <https://github.com/ceph/ceph/pull/32185>`_, Patrick Donnelly)
-* cephfs: libcephfs: Add Tests for LazyIO (`issue#40283 <http://tracker.ceph.com/issues/40283>`_, `pr#28834 <https://github.com/ceph/ceph/pull/28834>`_, Sidharth Anupkrishnan)
-* cephfs: mds : clean up data written to unsafe inodes (`pr#30969 <https://github.com/ceph/ceph/pull/30969>`_, simon gao)
-* cephfs: mds : optimization functions,get_dirfrags_under, to speed up processing directories with tens of millions of files (`pr#31123 <https://github.com/ceph/ceph/pull/31123>`_, simon gao)
-* cephfs: mds,mon: deprecate CephFS inline_data support (`pr#29824 <https://github.com/ceph/ceph/pull/29824>`_, Jeff Layton)
-* cephfs: mds/client: inode number delegation (`pr#31817 <https://github.com/ceph/ceph/pull/31817>`_, Jeff Layton)
-* cephfs: mds/FSMap: fix adjust_standby_fscid (`pr#32709 <https://github.com/ceph/ceph/pull/32709>`_, Sage Weil)
-* cephfs: mds/OpenFileTable: match MAX_ITEMS_PER_OBJ to osd_deep_scrub_large_omap_object_key_threshold (`pr#31232 <https://github.com/ceph/ceph/pull/31232>`_, Vikhyat Umrao)
-* cephfs: mds/server:mds: drop reconnect message from non-existent session (`issue#39026 <http://tracker.ceph.com/issues/39026>`_, `pr#27256 <https://github.com/ceph/ceph/pull/27256>`_, Shen Hang)
-* cephfs: messages: make CephFS messages safe (`pr#31330 <https://github.com/ceph/ceph/pull/31330>`_, Patrick Donnelly)
-* cephfs: mgr / volume: refactor [sub]volume (`issue#39969 <http://tracker.ceph.com/issues/39969>`_, `pr#28082 <https://github.com/ceph/ceph/pull/28082>`_, Venky Shankar)
-* cephfs: mgr / volumes: background purge queue for subvolumes (`issue#40036 <http://tracker.ceph.com/issues/40036>`_, `pr#28003 <https://github.com/ceph/ceph/pull/28003>`_, Patrick Donnelly, Venky Shankar)
-* cephfs: mgr/dashboard: CephFS class issues with strings (`pr#29353 <https://github.com/ceph/ceph/pull/29353>`_, Volker Theile)
-* cephfs: mgr/volume: adapt arg passing to ServiceSpec (`pr#33687 <https://github.com/ceph/ceph/pull/33687>`_, Joshua Schmid)
-* cephfs: mgr/volumes: add `mypy` support (`pr#33674 <https://github.com/ceph/ceph/pull/33674>`_, Michael Fritch)
-* cephfs: mgr/volumes: check for string values in uid/gid (`pr#31961 <https://github.com/ceph/ceph/pull/31961>`_, Jos Collin)
-* cephfs: mgr/volumes: cleanup leftovers from earlier purge job implementation (`pr#30886 <https://github.com/ceph/ceph/pull/30886>`_, Venky Shankar)
-* cephfs: mgr/volumes: cleanup on fs create error (`pr#32459 <https://github.com/ceph/ceph/pull/32459>`_, Jos Collin)
-* cephfs: mgr/volumes: clone from snapshot (`issue#24880 <http://tracker.ceph.com/issues/24880>`_, `pr#32030 <https://github.com/ceph/ceph/pull/32030>`_, Venky Shankar)
-* cephfs: mgr/volumes: convert string to bytes object (`issue#39750 <http://tracker.ceph.com/issues/39750>`_, `pr#28380 <https://github.com/ceph/ceph/pull/28380>`_, Rishabh Dave)
-* cephfs: mgr/volumes: drop unused size (`pr#30185 <https://github.com/ceph/ceph/pull/30185>`_, Jos Collin)
-* cephfs: mgr/volumes: drop unused variable vol_name (`pr#31780 <https://github.com/ceph/ceph/pull/31780>`_, Joshua Schmid)
-* cephfs: mgr/volumes: fail removing subvolume with snapshots (`issue#43645 <http://tracker.ceph.com/issues/43645>`_, `pr#32696 <https://github.com/ceph/ceph/pull/32696>`_, Venky Shankar)
-* cephfs: mgr/volumes: fetch trash and clone entries without blocking volume access (`issue#44207 <http://tracker.ceph.com/issues/44207>`_, `pr#33413 <https://github.com/ceph/ceph/pull/33413>`_, Venky Shankar)
-* cephfs: mgr/volumes: fix error message (`issue#40014 <http://tracker.ceph.com/issues/40014>`_, `pr#28407 <https://github.com/ceph/ceph/pull/28407>`_, Ramana Raja)
-* cephfs: mgr/volumes: fix incorrect snapshot path creation (`pr#30654 <https://github.com/ceph/ceph/pull/30654>`_, Ramana Raja)
-* cephfs: mgr/volumes: fix placement default value (`pr#33476 <https://github.com/ceph/ceph/pull/33476>`_, Sage Weil)
-* cephfs: mgr/volumes: fix subvolume creation with quota (`issue#40152 <http://tracker.ceph.com/issues/40152>`_, `pr#28384 <https://github.com/ceph/ceph/pull/28384>`_, Ramana Raja)
-* cephfs: mgr/volumes: fs subvolume resize inf command (`pr#31157 <https://github.com/ceph/ceph/pull/31157>`_, Jos Collin)
-* cephfs: mgr/volumes: handle exceptions in purge thread with retry (`issue#41218 <http://tracker.ceph.com/issues/41218>`_, `issue#41219 <http://tracker.ceph.com/issues/41219>`_, `pr#29735 <https://github.com/ceph/ceph/pull/29735>`_, Venky Shankar)
-* cephfs: mgr/volumes: improve volume deletion process (`pr#31762 <https://github.com/ceph/ceph/pull/31762>`_, Joshua Schmid)
-* cephfs: mgr/volumes: list FS subvolumes, subvolume groups, and their snapshots (`pr#30476 <https://github.com/ceph/ceph/pull/30476>`_, Jos Collin)
-* cephfs: mgr/volumes: minor fixes (`pr#29760 <https://github.com/ceph/ceph/pull/29760>`_, Ramana Raja)
-* cephfs: mgr/volumes: prevent negative subvolume size (`pr#30058 <https://github.com/ceph/ceph/pull/30058>`_, Jos Collin)
-* cephfs: mgr/volumes: protection for `fs volume rm` command (`pr#30407 <https://github.com/ceph/ceph/pull/30407>`_, Jos Collin)
-* cephfs: mgr/volumes: refactor dir handle cleanup (`pr#30887 <https://github.com/ceph/ceph/pull/30887>`_, Jos Collin)
-* cephfs: mgr/volumes: remove stale subvolume module (`pr#32645 <https://github.com/ceph/ceph/pull/32645>`_, Venky Shankar)
-* cephfs: mgr/volumes: return string type to ceph-manager (`pr#30451 <https://github.com/ceph/ceph/pull/30451>`_, Venky Shankar)
-* cephfs: mgr/volumes: sync inode attributes for cloned subvolumes (`issue#43965 <http://tracker.ceph.com/issues/43965>`_, `pr#33120 <https://github.com/ceph/ceph/pull/33120>`_, Venky Shankar)
-* cephfs: mgr/volumes: uid, gid for subvolume create and subvolumegroup create commands (`pr#30336 <https://github.com/ceph/ceph/pull/30336>`_, Jos Collin)
-* cephfs: mgr/volumes: unregister job upon async threads exception (`issue#44293 <http://tracker.ceph.com/issues/44293>`_, `pr#33547 <https://github.com/ceph/ceph/pull/33547>`_, Venky Shankar)
-* cephfs: mgr/volumes: versioned subvolume provisioning (`pr#31763 <https://github.com/ceph/ceph/pull/31763>`_, Venky Shankar)
-* cephfs: mon,mds: map mds daemons to a particular fs (`pr#32015 <https://github.com/ceph/ceph/pull/32015>`_, Sage Weil)
-* cephfs: mon/MDSMonitor: use stringstream instead of dout for mds repaired (`issue#40472 <http://tracker.ceph.com/issues/40472>`_, `pr#28683 <https://github.com/ceph/ceph/pull/28683>`_, Zhi Zhang)
-* cephfs: mon/MDSMonitor: warn when creating fs with default EC data pool (`pr#31494 <https://github.com/ceph/ceph/pull/31494>`_, Patrick Donnelly)
-* cephfs: mount.ceph.c: do not pass nofail to the kernel (`pr#26992 <https://github.com/ceph/ceph/pull/26992>`_, Kenneth Waegeman)
-* cephfs: mount.ceph: give a hint message when no mds is up or cluster is laggy (`pr#32164 <https://github.com/ceph/ceph/pull/32164>`_, Xiubo Li)
-* cephfs: mount.ceph: new mount option alias -- translate fs= option to mds_namespace= (`pr#33491 <https://github.com/ceph/ceph/pull/33491>`_, Xiubo Li)
-* cephfs: mount.ceph: properly handle -o strictatime (`pr#29518 <https://github.com/ceph/ceph/pull/29518>`_, Jeff Layton)
-* cephfs: mount.ceph: remove arbitrary limit on size of name= option (`pr#32706 <https://github.com/ceph/ceph/pull/32706>`_, Jeff Layton)
-* cephfs: mount: fix the debug log when keyring getting secret failed (`pr#33499 <https://github.com/ceph/ceph/pull/33499>`_, Xiubo Li)
-* cephfs: octopus: Add FS subvolume clone cancel (`issue#44208 <http://tracker.ceph.com/issues/44208>`_, `pr#34018 <https://github.com/ceph/ceph/pull/34018>`_, Venky Shankar)
-* cephfs: osdc/objecter: Fix last_sent in scientific format and add age to ops (`pr#29818 <https://github.com/ceph/ceph/pull/29818>`_, Varsha Rao)
-* cephfs: propagate ll_releasedir errors (`pr#32548 <https://github.com/ceph/ceph/pull/32548>`_, David Disseldorp)
-* cephfs: pybind / cephfs: remove static typing in LibCephFS.chown (`issue#42923 <http://tracker.ceph.com/issues/42923>`_, `pr#31756 <https://github.com/ceph/ceph/pull/31756>`_, Venky Shankar)
-* cephfs: pybind/cephfs: Modification to error message (`pr#28628 <https://github.com/ceph/ceph/pull/28628>`_, Varsha Rao)
-* cephfs: pybind/mgr: add cephfs subvolumes module (`issue#39610 <http://tracker.ceph.com/issues/39610>`_, `pr#27594 <https://github.com/ceph/ceph/pull/27594>`_, Ramana Raja)
-* cephfs: pybind/test_volume_client: print python version correctly (`issue#40184 <http://tracker.ceph.com/issues/40184>`_, `pr#28221 <https://github.com/ceph/ceph/pull/28221>`_, Lianne)
-* cephfs: qa/cephfs: fix test_evict_client (`pr#28411 <https://github.com/ceph/ceph/pull/28411>`_, Yan, Zheng)
-* cephfs: qa/cephfs: make filelock_interrupt.py work with python3 (`pr#32741 <https://github.com/ceph/ceph/pull/32741>`_, Yan, Zheng)
-* cephfs: qa/cephfs: test case for auto reconnect after blacklisted (`pr#31200 <https://github.com/ceph/ceph/pull/31200>`_, Yan, Zheng)
-* cephfs: qa/suites/fs/multifs/tasks/failover.yaml: disable RECENT_CRASH (`pr#29363 <https://github.com/ceph/ceph/pull/29363>`_, Sage Weil)
-* cephfs: qa/suites/fs: mon_thrash test for fs (`issue#17309 <http://tracker.ceph.com/issues/17309>`_, `pr#27073 <https://github.com/ceph/ceph/pull/27073>`_, Jos Collin)
-* cephfs: qa/tasks/cephfs: os.write takes bytes, not str (`pr#32359 <https://github.com/ceph/ceph/pull/32359>`_, Sage Weil)
-* cephfs: qa/tasks: add remaining tests for fs volume (`pr#31884 <https://github.com/ceph/ceph/pull/31884>`_, Jos Collin)
-* cephfs: qa/tasks: Better handling of thrasher names and __init__ calls (`pr#31207 <https://github.com/ceph/ceph/pull/31207>`_, Jos Collin)
-* cephfs: qa/tasks: check if fs mounted in umount_wait (`pr#30553 <https://github.com/ceph/ceph/pull/30553>`_, Jos Collin)
-* cephfs: qa/tasks: Fix AttributeError: cant set attribute (`pr#31428 <https://github.com/ceph/ceph/pull/31428>`_, Jos Collin)
-* cephfs: qa/tasks: upgrade the check for -c sudo option in vstart_runner.py (`issue#39385 <http://tracker.ceph.com/issues/39385>`_, `pr#28199 <https://github.com/ceph/ceph/pull/28199>`_, Rishabh Dave)
-* cephfs: qa/vstart_runner.py: add more options (`pr#29906 <https://github.com/ceph/ceph/pull/29906>`_, Rishabh Dave)
-* cephfs: qa: add debugging failed osd-release setting (`pr#29715 <https://github.com/ceph/ceph/pull/29715>`_, Patrick Donnelly)
-* cephfs: qa: add upgrade test for volume upgrade from legacy (`pr#33636 <https://github.com/ceph/ceph/pull/33636>`_, Patrick Donnelly)
-* cephfs: qa: allow client mount to reset fully (`issue#42213 <http://tracker.ceph.com/issues/42213>`_, `pr#30986 <https://github.com/ceph/ceph/pull/30986>`_, Venky Shankar)
-* cephfs: qa: avoid subtree rep in test_version_splitting (`pr#33078 <https://github.com/ceph/ceph/pull/33078>`_, Patrick Donnelly)
-* cephfs: qa: build v5.4 kernel (`pr#32763 <https://github.com/ceph/ceph/pull/32763>`_, Patrick Donnelly)
-* cephfs: qa: decouple session map test from simple msgr (`issue#38803 <http://tracker.ceph.com/issues/38803>`_, `pr#27415 <https://github.com/ceph/ceph/pull/27415>`_, Patrick Donnelly)
-* cephfs: qa: define centos version for fs:verify (`pr#32535 <https://github.com/ceph/ceph/pull/32535>`_, Patrick Donnelly)
-* cephfs: qa: detect RHEL8 for yum package installation (`pr#32507 <https://github.com/ceph/ceph/pull/32507>`_, Patrick Donnelly)
-* cephfs: qa: do not check pg count for new data_isolated volume (`pr#31095 <https://github.com/ceph/ceph/pull/31095>`_, Patrick Donnelly)
-* cephfs: qa: fix malformed suite config (`pr#29431 <https://github.com/ceph/ceph/pull/29431>`_, Patrick Donnelly)
-* cephfs: qa: fix output check to not be sensitive to debugging (`pr#32163 <https://github.com/ceph/ceph/pull/32163>`_, Patrick Donnelly)
-* cephfs: qa: fix testing kernel branch link (`pr#32854 <https://github.com/ceph/ceph/pull/32854>`_, Patrick Donnelly)
-* cephfs: qa: fix various py3 cephfs qa bugs (`pr#32467 <https://github.com/ceph/ceph/pull/32467>`_, Patrick Donnelly)
-* cephfs: qa: fix various py3 cephfs qa bugs x2 (`pr#32533 <https://github.com/ceph/ceph/pull/32533>`_, Patrick Donnelly)
-* cephfs: qa: fs Ignore ceph.dir.pin: No such attribute errors in getfattr tests for old kernel client (`pr#27377 <https://github.com/ceph/ceph/pull/27377>`_, Sidharth Anupkrishnan)
-* cephfs: qa: fs/upgrade test fixes and cephfs feature bit updates for Octopus/Nautilus (`issue#39078 <http://tracker.ceph.com/issues/39078>`_, `issue#39077 <http://tracker.ceph.com/issues/39077>`_, `issue#39020 <http://tracker.ceph.com/issues/39020>`_, `pr#27303 <https://github.com/ceph/ceph/pull/27303>`_, Patrick Donnelly)
-* cephfs: qa: have kclient tests use new mount.ceph functionality (`pr#30462 <https://github.com/ceph/ceph/pull/30462>`_, Jeff Layton)
-* cephfs: qa: ignore expected MDS_CLIENT_LATE_RELEASE warning (`issue#40968 <http://tracker.ceph.com/issues/40968>`_, `pr#29338 <https://github.com/ceph/ceph/pull/29338>`_, Patrick Donnelly)
-* cephfs: qa: ignore RECENT_CRASH for multimds snapshot testing (`pr#29911 <https://github.com/ceph/ceph/pull/29911>`_, Patrick Donnelly)
-* cephfs: qa: ignore slow ops for ffsb workunit (`pr#32668 <https://github.com/ceph/ceph/pull/32668>`_, Patrick Donnelly)
-* cephfs: qa: ignore trimmed cache items for dead cache drop (`pr#32644 <https://github.com/ceph/ceph/pull/32644>`_, Patrick Donnelly)
-* cephfs: qa: install some dependencies for xfstests (`pr#32478 <https://github.com/ceph/ceph/pull/32478>`_, Patrick Donnelly)
-* cephfs: qa: only restart MDS between tests (`pr#32532 <https://github.com/ceph/ceph/pull/32532>`_, Patrick Donnelly)
-* cephfs: qa: remove requirement on simple msgr (`issue#39079 <http://tracker.ceph.com/issues/39079>`_, `pr#27301 <https://github.com/ceph/ceph/pull/27301>`_, Patrick Donnelly)
-* cephfs: qa: rename kcephfs distro overrides (`pr#32639 <https://github.com/ceph/ceph/pull/32639>`_, Patrick Donnelly)
-* cephfs: qa: save MDS epoch barrier (`pr#32642 <https://github.com/ceph/ceph/pull/32642>`_, Patrick Donnelly)
-* cephfs: qa: sleep briefly after resetting kclient (`pr#29388 <https://github.com/ceph/ceph/pull/29388>`_, Patrick Donnelly)
-* cephfs: qa: specify random distros in multimds (`pr#33080 <https://github.com/ceph/ceph/pull/33080>`_, Patrick Donnelly)
-* cephfs: qa: tolerate ECONNRESET errcode during logrotate (`issue#41800 <http://tracker.ceph.com/issues/41800>`_, `pr#30809 <https://github.com/ceph/ceph/pull/30809>`_, Venky Shankar)
-* cephfs: qa: update kclient testing to RHEL 7.6 (`pr#26662 <https://github.com/ceph/ceph/pull/26662>`_, Patrick Donnelly)
-* cephfs: qa: use -D_GNU_SOURCE when compiling fsync-tester.c (`pr#32480 <https://github.com/ceph/ceph/pull/32480>`_, Patrick Donnelly)
-* cephfs: qa: use hard_reset to reboot kclient (`issue#37681 <http://tracker.ceph.com/issues/37681>`_, `pr#28825 <https://github.com/ceph/ceph/pull/28825>`_, Patrick Donnelly)
-* cephfs: qa: use mimic-O upgrade process (`pr#27731 <https://github.com/ceph/ceph/pull/27731>`_, Patrick Donnelly)
-* cephfs: qa: use small default pg count for CephFS pools (`pr#30816 <https://github.com/ceph/ceph/pull/30816>`_, Patrick Donnelly)
-* cephfs: qa: wait for MDS to come back after removing it (`issue#40967 <http://tracker.ceph.com/issues/40967>`_, `pr#29336 <https://github.com/ceph/ceph/pull/29336>`_, Patrick Donnelly)
-* cephfs: qa: whitelist Error recovering journal for cephfs-data-scan (`pr#30971 <https://github.com/ceph/ceph/pull/30971>`_, Yan, Zheng)
-* cephfs: qa: whitelist TOO_FEW_PGS during Mimic deploy (`pr#31063 <https://github.com/ceph/ceph/pull/31063>`_, Patrick Donnelly)
-* cephfs: Resolve a memory leak in cephfs/Resetter.cc (`pr#29302 <https://github.com/ceph/ceph/pull/29302>`_, XiaoGuoDong2019)
-* cephfs: src/common: fix help text for echo option of cephfs-shell (`pr#33285 <https://github.com/ceph/ceph/pull/33285>`_, Rishabh Dave)
-* cephfs: stop: Cleanly umount cephFS volumes (`pr#32024 <https://github.com/ceph/ceph/pull/32024>`_, Kotresh HR)
-* cephfs: test/{fs,cephfs}: Get libcephfs and cephfs to compile with FreeBSD (`pr#30505 <https://github.com/ceph/ceph/pull/30505>`_, Willem Jan Withagen)
-* cephfs: test: extend `fs subvolume` test to cover new interfaces (`issue#39949 <http://tracker.ceph.com/issues/39949>`_, `pr#27856 <https://github.com/ceph/ceph/pull/27856>`_, Venky Shankar)
-* cephfs: test: use distinct subvolume/group/snapshot names (`issue#42646 <http://tracker.ceph.com/issues/42646>`_, `pr#31418 <https://github.com/ceph/ceph/pull/31418>`_, Venky Shankar)
-* cephfs: test_volumes: fix _verify_clone_attrs call (`pr#33788 <https://github.com/ceph/ceph/pull/33788>`_, Ramana Raja)
-* cephfs: test_volume_client: declare only one default for python version (`issue#40460 <http://tracker.ceph.com/issues/40460>`_, `pr#28194 <https://github.com/ceph/ceph/pull/28194>`_, Rishabh Dave)
-* cephfs: test_volume_client: fix test_put_object_versioned() (`issue#39405 <http://tracker.ceph.com/issues/39405>`_, `issue#39510 <http://tracker.ceph.com/issues/39510>`_, `pr#28692 <https://github.com/ceph/ceph/pull/28692>`_, Rishabh Dave)
-* cephfs: test_volume_client: simplify test_get_authorized_ids() (`pr#28171 <https://github.com/ceph/ceph/pull/28171>`_, Rishabh Dave)
-* cephfs: tools/cephfs: make cephfs-data-scan scan_links fix dentrys first (`pr#31680 <https://github.com/ceph/ceph/pull/31680>`_, Yan, Zheng)
-* cephfs: Trivial comment and cleanup fixes for cephfs (`pr#27199 <https://github.com/ceph/ceph/pull/27199>`_, Jeff Layton)
-* cephfs: vstart: add an alias for cephfs-shell to vstart_environment.sh (`pr#27437 <https://github.com/ceph/ceph/pull/27437>`_, Jeff Layton)
-* cephfs: vstart: generate environment script suitable for sourcing (`pr#27198 <https://github.com/ceph/ceph/pull/27198>`_, Jeff Layton)
-* cephfs: vstart_runner: allow the use of it with kernel mounts (`pr#30463 <https://github.com/ceph/ceph/pull/30463>`_, Jeff Layton)
-* ceph_argparse: increment matchcnt on kwargs (`pr#33004 <https://github.com/ceph/ceph/pull/33004>`_, Matthew Oliver)
-* check rdma configuration and fix some logic problem (`pr#28344 <https://github.com/ceph/ceph/pull/28344>`_, Changcheng Liu)
-* client/Client : Fix sign compare compiler warning (`pr#30719 <https://github.com/ceph/ceph/pull/30719>`_, Prashant D)
-* cls/queue: fix data corruption in urgent data (`pr#33686 <https://github.com/ceph/ceph/pull/33686>`_, Yuval Lifshitz)
-* cmake:  support parallel build for rocksd (`pr#31781 <https://github.com/ceph/ceph/pull/31781>`_, Deepika Upadhyay)
-* cmake: add add_tox_test() (`pr#29446 <https://github.com/ceph/ceph/pull/29446>`_, Kefu Chai)
-* cmake: add cython_cephfs to vstart target (`pr#28876 <https://github.com/ceph/ceph/pull/28876>`_, Kefu Chai)
-* cmake: Add dpdk numa support (`pr#31841 <https://github.com/ceph/ceph/pull/31841>`_, Chunsong Feng, Hu Ye)
-* cmake: Allow cephfs and ceph-mds to be build when building on FreeBSD (`pr#30494 <https://github.com/ceph/ceph/pull/30494>`_, Willem Jan Withagen)
-* cmake: avoid rebuilding extensions, and using python-config (`pr#28920 <https://github.com/ceph/ceph/pull/28920>`_, Kefu Chai)
-* cmake: boost fixes for ARM 32 bit (`pr#25729 <https://github.com/ceph/ceph/pull/25729>`_, Daniel Glaser)
-* cmake: bump libceph-common SO version for compliance (`pr#30976 <https://github.com/ceph/ceph/pull/30976>`_, Nathan Cutler)
-* cmake: check for MAJOR.MINOR version of python3 (`pr#27383 <https://github.com/ceph/ceph/pull/27383>`_, Kefu Chai, Boris Ranto)
-* cmake: check for unaligned access (`pr#28936 <https://github.com/ceph/ceph/pull/28936>`_, Kefu Chai)
-* cmake: check version of librdkafka (`pr#32237 <https://github.com/ceph/ceph/pull/32237>`_, Kefu Chai)
-* cmake: cleanups (`pr#28252 <https://github.com/ceph/ceph/pull/28252>`_, Kefu Chai)
-* cmake: cleanups (`pr#33500 <https://github.com/ceph/ceph/pull/33500>`_, Kefu Chai)
-* cmake: compile crimson-auth with crimson::cflags (`pr#33296 <https://github.com/ceph/ceph/pull/33296>`_, Kefu Chai)
-* cmake: dashboard: enable frontend on arm64 (`pr#30958 <https://github.com/ceph/ceph/pull/30958>`_, Kefu Chai)
-* cmake: define mgr_cap_obj library when WITH_MGR=OFF (`pr#31326 <https://github.com/ceph/ceph/pull/31326>`_, Casey Bodley)
-* cmake: detect librt for POSIX time functions (`pr#31543 <https://github.com/ceph/ceph/pull/31543>`_, Kefu Chai)
-* cmake: detect linker support (`pr#30781 <https://github.com/ceph/ceph/pull/30781>`_, Kefu Chai)
-* cmake: Do a debug build by default (`pr#30799 <https://github.com/ceph/ceph/pull/30799>`_, Brad Hubbard)
-* cmake: do not assume ${CMAKE_GENERATOR} == make (`pr#27089 <https://github.com/ceph/ceph/pull/27089>`_, Kefu Chai)
-* cmake: do not include ${CMAKE_SOURCE_DIR}/src/fmt/include (`pr#31761 <https://github.com/ceph/ceph/pull/31761>`_, Kefu Chai)
-* cmake: do not include global_context.cc multiple times (`pr#32607 <https://github.com/ceph/ceph/pull/32607>`_, Kefu Chai)
-* cmake: do not link against unused libs (`pr#33247 <https://github.com/ceph/ceph/pull/33247>`_, Kefu Chai)
-* cmake: do not use CMP0074 unless it is supported (`pr#31958 <https://github.com/ceph/ceph/pull/31958>`_, Kefu Chai)
-* cmake: do not use CMP0093 unless it is supported (`pr#31960 <https://github.com/ceph/ceph/pull/31960>`_, Kefu Chai)
-* cmake: exclude unittest_alloc_aging from all (`pr#33466 <https://github.com/ceph/ceph/pull/33466>`_, Kefu Chai)
-* cmake: Fix build against ncurses with separate libtinfo (`pr#27443 <https://github.com/ceph/ceph/pull/27443>`_, Lars Wendler)
-* cmake: Fix unaligned check on big-endian systems (`pr#30362 <https://github.com/ceph/ceph/pull/30362>`_, Ulrich Weigand)
-* cmake: fix WITH_UBSAN (`pr#28725 <https://github.com/ceph/ceph/pull/28725>`_, Casey Bodley)
-* cmake: Improve test for 16-byte atomic support on IBM Z (`pr#32802 <https://github.com/ceph/ceph/pull/32802>`_, Ulrich Weigand)
-* cmake: let vstart depend on radosgwd (`pr#32564 <https://github.com/ceph/ceph/pull/32564>`_, Kefu Chai)
-* cmake: link ceph-fuse against librt (`pr#31531 <https://github.com/ceph/ceph/pull/31531>`_, Yong Wang)
-* cmake: move crimson-crush to crimson/ (`pr#33481 <https://github.com/ceph/ceph/pull/33481>`_, Kefu Chai)
-* cmake: one run_tox.sh to rule them all (`pr#29457 <https://github.com/ceph/ceph/pull/29457>`_, Kefu Chai)
-* cmake: pass arguments to crimson tests (`pr#30655 <https://github.com/ceph/ceph/pull/30655>`_, Kefu Chai)
-* cmake: pmem/pmdk changes to cmake (`pr#28802 <https://github.com/ceph/ceph/pull/28802>`_, Scott Peterson, Xiaoyan Li)
-* cmake: remove cython 0.29s subinterpreter check during install (`pr#27067 <https://github.com/ceph/ceph/pull/27067>`_, Tim Serong)
-* cmake: Removed unittest_alloc_aging from make check (`pr#33397 <https://github.com/ceph/ceph/pull/33397>`_, Adam Kupczyk)
-* cmake: require CMake v3.10.2 (`pr#29291 <https://github.com/ceph/ceph/pull/29291>`_, Kefu Chai)
-* cmake: require RocksDB 5.14 or higher (`pr#29930 <https://github.com/ceph/ceph/pull/29930>`_, Ilsoo Byun)
-* cmake: revert librados_tp.so version from 3 to 2 (`issue#39291 <http://tracker.ceph.com/issues/39291>`_, `pr#27593 <https://github.com/ceph/ceph/pull/27593>`_, Nathan Cutler)
-* cmake: rewrite Findgenl to support components argument (`pr#28460 <https://github.com/ceph/ceph/pull/28460>`_, Kefu Chai)
-* cmake: s/bortli_libs/brotli_libs/ (`pr#30374 <https://github.com/ceph/ceph/pull/30374>`_, Kefu Chai)
-* cmake: selectively rewrite install rpath (`pr#30028 <https://github.com/ceph/ceph/pull/30028>`_, Kefu Chai)
-* cmake: set empty INSTALL_RPATH on crypto shared libs (`issue#40398 <http://tracker.ceph.com/issues/40398>`_, `pr#28593 <https://github.com/ceph/ceph/pull/28593>`_, Nathan Cutler)
-* cmake: set empty RPATH for some test executables (`pr#29922 <https://github.com/ceph/ceph/pull/29922>`_, Nathan Cutler)
-* cmake: set empty-string RPATH for ceph-osd (`issue#40295 <http://tracker.ceph.com/issues/40295>`_, `pr#28508 <https://github.com/ceph/ceph/pull/28508>`_, Nathan Cutler)
-* cmake: should expose ${C-ARES_BINARY_DIR} from c-ares (`pr#33256 <https://github.com/ceph/ceph/pull/33256>`_, Kefu Chai)
-* cmake: silence messages when cppcheck/IWYU is not found (`pr#32140 <https://github.com/ceph/ceph/pull/32140>`_, Kefu Chai)
-* cmake: support `Seastar_DPDK=ON` option (`pr#31110 <https://github.com/ceph/ceph/pull/31110>`_, Kefu Chai)
-* cmake: Test for 16-byte atomic support on IBM Z (`pr#30638 <https://github.com/ceph/ceph/pull/30638>`_, Ulrich Weigand)
-* cmake: update FindBoost.cmake (`pr#29396 <https://github.com/ceph/ceph/pull/29396>`_, Willem Jan Withagen)
-* cmake: update FindBoost.cmake for 1.71 (`pr#31317 <https://github.com/ceph/ceph/pull/31317>`_, Willem Jan Withagen)
-* cmake: Update pmdk version to 1.7 (`pr#32693 <https://github.com/ceph/ceph/pull/32693>`_, Yin, Congmin)
-* cmake: update SPDK to build with GCC-9 (`pr#28507 <https://github.com/ceph/ceph/pull/28507>`_, Kefu Chai)
-* cmake: use BUILD_ALWAYS for rebuilding external project (`pr#28984 <https://github.com/ceph/ceph/pull/28984>`_, Kefu Chai)
-* cmake: use GNU linker on FreeBSD (`pr#30621 <https://github.com/ceph/ceph/pull/30621>`_, Willem Jan Withagen)
-* cmake: use latest FindPython\\*.cmake (`pr#29100 <https://github.com/ceph/ceph/pull/29100>`_, Kefu Chai)
-* cmake: use python2 by default (`pr#29148 <https://github.com/ceph/ceph/pull/29148>`_, Kefu Chai)
-* cmake: use StdFilesystem::filesystem instead of stdc++fs (`pr#27149 <https://github.com/ceph/ceph/pull/27149>`_, Willem Jan Withagen)
-* cmake: workaround of false alarm from ubsan (`pr#27094 <https://github.com/ceph/ceph/pull/27094>`_, Kefu Chai)
-* CMakeLists.txt: fix typo in error message (`pr#28795 <https://github.com/ceph/ceph/pull/28795>`_, Kefu Chai)
-* codeowners: Add ceph2.py to @ceph/orchestrators (`pr#32131 <https://github.com/ceph/ceph/pull/32131>`_, Sebastian Wagner)
-* common,core,mon: src/: drop cct from cmd_getval() (`pr#33010 <https://github.com/ceph/ceph/pull/33010>`_, Kefu Chai)
-* common,core: common, auth: use boost::spirit to parse ceph.conf, escape quotes in exported auths (`issue#22227 <http://tracker.ceph.com/issues/22227>`_, `pr#28634 <https://github.com/ceph/ceph/pull/28634>`_, Kefu Chai, Gu Zhongyan)
-* common,core: common,mgr,osd: pass string_view as name (`pr#33167 <https://github.com/ceph/ceph/pull/33167>`_, Kefu Chai)
-* common,core: common,osd: add hash algorithms for dedup fingerprint (`pr#28254 <https://github.com/ceph/ceph/pull/28254>`_, Myoungwon Oh)
-* common,core: include/cpp-btree: use the same type when allocate/deallocate (`pr#33638 <https://github.com/ceph/ceph/pull/33638>`_, Kefu Chai)
-* common,core: message,mgr: drop MessageFactory and friends and use ref_t<> in mgr (`pr#27592 <https://github.com/ceph/ceph/pull/27592>`_, Patrick Donnelly, Kefu Chai)
-* common,core: Remove dependence on `using namespace`: Build of common through osdc/Objecter.cc (`pr#27255 <https://github.com/ceph/ceph/pull/27255>`_, Adam C. Emerson)
-* common,mgr: vstart.sh: set prometheus port for each mgr (`pr#33698 <https://github.com/ceph/ceph/pull/33698>`_, Alfonso Mart\xc3\xadnez)
-* common,mon: common/options: make mon_clean_pg_upmaps_per_chunk unsigned (`pr#28509 <https://github.com/ceph/ceph/pull/28509>`_, Kefu Chai)
-* common,rbd: common/ceph_context: avoid unnecessary wait during service thread shutdown (`pr#30947 <https://github.com/ceph/ceph/pull/30947>`_, Jason Dillaman)
-* common,rgw: common/Formatter: escape printed buffer in XMLFormatter::dump_format_va() (`issue#38121 <http://tracker.ceph.com/issues/38121>`_, `pr#26220 <https://github.com/ceph/ceph/pull/26220>`_, ashitakasam)
-* common,rgw: rgw/OutputDataSocket: actually discard data on full buffer (`issue#40178 <http://tracker.ceph.com/issues/40178>`_, `pr#28415 <https://github.com/ceph/ceph/pull/28415>`_, Matt Benjamin)
-* common,tests: python-common: Add mypy testing (`pr#31071 <https://github.com/ceph/ceph/pull/31071>`_, Sebastian Wagner)
-* common,tests: test/test_mempool: test accounting for btree_map (`pr#33621 <https://github.com/ceph/ceph/pull/33621>`_, Adam Kupczyk)
-* common,tools: src/common: add rabin chunking for dedup (`pr#26730 <https://github.com/ceph/ceph/pull/26730>`_, Myoungwon Oh, Hsuan-Heng, Wu)
-* common,tools: vstart.sh: enable creating multiple OSDs backed by spdk backend (`pr#27841 <https://github.com/ceph/ceph/pull/27841>`_, Richael Zhuang)
-* common,tools: vstart.sh: enable nfs-ganesha mgmt. in dashboard (`pr#33691 <https://github.com/ceph/ceph/pull/33691>`_, Alfonso Mart\xc3\xadnez)
-* common/config_values: set seastar logging level per that of ceph (`pr#28792 <https://github.com/ceph/ceph/pull/28792>`_, Kefu Chai)
-* common/options: remove unused ms_msgr2\\_{sign,encrypt}_messages (`pr#31818 <https://github.com/ceph/ceph/pull/31818>`_, Ilya Dryomov)
-* common:  crimson/osd: add --mkkey support (`pr#28534 <https://github.com/ceph/ceph/pull/28534>`_, Kefu Chai)
-* common: .gitignore: ignore /src/python-common/build (`pr#32967 <https://github.com/ceph/ceph/pull/32967>`_, Alfonso Mart\xc3\xadnez)
-* common: add --log-early command line option (`pr#27419 <https://github.com/ceph/ceph/pull/27419>`_, Sage Weil)
-* common: add bool log_to_file option (`pr#27044 <https://github.com/ceph/ceph/pull/27044>`_, Sage Weil)
-* common: add comment about pod memory requests/limits (`pr#29331 <https://github.com/ceph/ceph/pull/29331>`_, Patrick Donnelly)
-* common: add iterator-based string splitter (`pr#33696 <https://github.com/ceph/ceph/pull/33696>`_, Casey Bodley)
-* common: add ref header (`pr#29119 <https://github.com/ceph/ceph/pull/29119>`_, Patrick Donnelly)
-* common: auth/cephx: always initialize local variables (`pr#31154 <https://github.com/ceph/ceph/pull/31154>`_, Kefu Chai)
-* common: auth/krb: fix Kerberos compile error (`issue#39948 <http://tracker.ceph.com/issues/39948>`_, `pr#28113 <https://github.com/ceph/ceph/pull/28113>`_, huangjun)
-* common: avoid use of size_t in options (`pr#28277 <https://github.com/ceph/ceph/pull/28277>`_, James Page)
-* common: blobhash.h: remove extra [[fallthrough]] (`pr#28270 <https://github.com/ceph/ceph/pull/28270>`_, Thomas Johnson)
-* common: blobhash: do not use cast for unaligned access (`pr#28099 <https://github.com/ceph/ceph/pull/28099>`_, Kefu Chai)
-* common: buffer, denc: more constness (`pr#27767 <https://github.com/ceph/ceph/pull/27767>`_, Kefu Chai)
-* common: buffer,crypto,tools: extract digest methods out of bufferlist (`pr#28486 <https://github.com/ceph/ceph/pull/28486>`_, Kefu Chai)
-* common: buffer.h: remove list::iterator_impl::advance(size_t) (`pr#28278 <https://github.com/ceph/ceph/pull/28278>`_, Kefu Chai)
-* common: ceph.in: use sys._exit when we dont shut down (`pr#33950 <https://github.com/ceph/ceph/pull/33950>`_, Sage Weil)
-* common: ceph_argparse: put args from env before existing ones (`pr#33243 <https://github.com/ceph/ceph/pull/33243>`_, Kefu Chai)
-* common: Clang requires a default constructor, but it can be empty (`issue#39561 <http://tracker.ceph.com/issues/39561>`_, `pr#27844 <https://github.com/ceph/ceph/pull/27844>`_, Willem Jan Withagen)
-* common: clean up CLUSTER_CREATE and CREATE options (`pr#31584 <https://github.com/ceph/ceph/pull/31584>`_, Sage Weil)
-* common: common,crimson: fixes to compile with clang and libc++ (`pr#32485 <https://github.com/ceph/ceph/pull/32485>`_, Kefu Chai)
-* common: common,crimson: supporting admin-socket commands (`pr#32174 <https://github.com/ceph/ceph/pull/32174>`_, Ronen Friedman, Kefu Chai)
-* common: common,log: use ISO 8601 datetime format (`pr#27799 <https://github.com/ceph/ceph/pull/27799>`_, Sage Weil, Casey Bodley)
-* common: common,os: address string truncated warnings from GCC-9 (`pr#28289 <https://github.com/ceph/ceph/pull/28289>`_, Kefu Chai)
-* common: common/admin_socket: Added printing of error message (`pr#33380 <https://github.com/ceph/ceph/pull/33380>`_, Adam Kupczyk)
-* common: common/bl: carry the bufferlist::_carriage over std::moves (`pr#32937 <https://github.com/ceph/ceph/pull/32937>`_, Radoslaw Zarzynski)
-* common: common/bl: fix memory corruption in bufferlist::claim_append() (`pr#32823 <https://github.com/ceph/ceph/pull/32823>`_, Radoslaw Zarzynski)
-* common: common/bl: fix the dangling last_p issue (`pr#32702 <https://github.com/ceph/ceph/pull/32702>`_, Radoslaw Zarzynski)
-* common: common/bloom_filter: Fix endian issues (`pr#30527 <https://github.com/ceph/ceph/pull/30527>`_, Ulrich Weigand)
-* common: common/ceph_time: tolerate mono time going backwards (`pr#33699 <https://github.com/ceph/ceph/pull/33699>`_, Sage Weil)
-* common: common/config: cleanups (`pr#33362 <https://github.com/ceph/ceph/pull/33362>`_, Jianpeng Ma)
-* common: common/config: fix lack of normalize_key_name() apply (`pr#33558 <https://github.com/ceph/ceph/pull/33558>`_, Igor Fedotov)
-* common: common/config: Remove unused code (`pr#28940 <https://github.com/ceph/ceph/pull/28940>`_, Jianpeng Ma)
-* common: common/Finisher: remove some lock acquisitions (`pr#29495 <https://github.com/ceph/ceph/pull/29495>`_, Igor Fedotov)
-* common: common/options: change default erasure-code-profile to k=2 m=2 (`pr#27656 <https://github.com/ceph/ceph/pull/27656>`_, Sage Weil)
-* common: common/pick_address.cc: silence GCC warning (`pr#32025 <https://github.com/ceph/ceph/pull/32025>`_, Kefu Chai)
-* common: common/secret.c: dont pass uninitialized stack data to the kernel (`pr#30675 <https://github.com/ceph/ceph/pull/30675>`_, Ilya Dryomov)
-* common: common/thread: Fix race condition in make_named_thread (`pr#31057 <https://github.com/ceph/ceph/pull/31057>`_, Adam C. Emerson)
-* common: common/util: use ifstream to read from /proc files (`pr#32630 <https://github.com/ceph/ceph/pull/32630>`_, Kefu Chai)
-* common: common/WorkQueue: narrow ThreadPool::_lock in func worker (`pr#22411 <https://github.com/ceph/ceph/pull/22411>`_, Jianpeng Ma)
-* common: crimson, common: introduce ceph::atomic and apply it on bufferlist (`pr#32766 <https://github.com/ceph/ceph/pull/32766>`_, Radoslaw Zarzynski)
-* common: crimson, common: RefCountedObj doesnt use atomics in Seastar builds (`pr#28085 <https://github.com/ceph/ceph/pull/28085>`_, Radoslaw Zarzynski)
-* common: crimson/osd: implement readable/lease related methods (`pr#30639 <https://github.com/ceph/ceph/pull/30639>`_, Kefu Chai)
-* common: crimson/osd: Message has non-null ref to SocketConnection now (`pr#30124 <https://github.com/ceph/ceph/pull/30124>`_, Radoslaw Zarzynski)
-* common: crimson: cleanups (`pr#33797 <https://github.com/ceph/ceph/pull/33797>`_, Kefu Chai)
-* common: crimson: cleanups for clang build (`pr#32605 <https://github.com/ceph/ceph/pull/32605>`_, Kefu Chai)
-* common: Cycles: Add support for IBM Z (`pr#30874 <https://github.com/ceph/ceph/pull/30874>`_, Ulrich Weigand)
-* common: default pg_autoscale_mode=on for new pools (`pr#30112 <https://github.com/ceph/ceph/pull/30112>`_, Sage Weil)
-* common: default pg_autoscale_mode=on for new pools (`pr#30475 <https://github.com/ceph/ceph/pull/30475>`_, Sage Weil)
-* common: denc: fix build error by calling global snprintf (`pr#27572 <https://github.com/ceph/ceph/pull/27572>`_, Changcheng Liu)
-* common: denc: slightly optimize container_base::bound_encode (`pr#24636 <https://github.com/ceph/ceph/pull/24636>`_, Radoslaw Zarzynski, Kefu Chai)
-* common: denc: support enums wider than 8 bits (`pr#33673 <https://github.com/ceph/ceph/pull/33673>`_, Casey Bodley)
-* common: dmclock: pick up fix to replace uint (`pr#28829 <https://github.com/ceph/ceph/pull/28829>`_, Kefu Chai)
-* common: drop sharing of buffer::raw outside bufferlist (`pr#32806 <https://github.com/ceph/ceph/pull/32806>`_, Radoslaw Zarzynski)
-* common: encode for std::list<T> doesnt use bl::copy_in() anymore (`pr#32785 <https://github.com/ceph/ceph/pull/32785>`_, Radoslaw Zarzynski)
-* common: FIPS: audit and switch some memset & bzero users (`pr#31692 <https://github.com/ceph/ceph/pull/31692>`_, Radoslaw Zarzynski)
-* common: Fix 44373 and make a couple cleanups in ceph::timer (`pr#33771 <https://github.com/ceph/ceph/pull/33771>`_, Adam C. Emerson)
-* common: fix clang build failures, and clean up warnings (`pr#26701 <https://github.com/ceph/ceph/pull/26701>`_, Adam C. Emerson)
-* common: fix clang compile errors from cython_modules (`pr#33056 <https://github.com/ceph/ceph/pull/33056>`_, Mark Kogan)
-* common: fix compat of strerror_r (`pr#30279 <https://github.com/ceph/ceph/pull/30279>`_, luo.runbing)
-* common: fix deadlocky inflight op visiting in OpTracker (`pr#32364 <https://github.com/ceph/ceph/pull/32364>`_, Radoslaw Zarzynski)
-* common: fix missing <stdio.h> include (`pr#31209 <https://github.com/ceph/ceph/pull/31209>`_, Willem Jan Withagen)
-* common: fix parse_env nullptr deref (`pr#28159 <https://github.com/ceph/ceph/pull/28159>`_, Patrick Donnelly)
-* common: Fix the error handling logic in get_device_id (`pr#30636 <https://github.com/ceph/ceph/pull/30636>`_, Difan Zhang)
-* common: fix typo in rgw_user_max_buckets option long description (`pr#31571 <https://github.com/ceph/ceph/pull/31571>`_, Alfonso Mart\xc3\xadnez)
-* common: give lockdeps group name to OpenSSLs mutexes (`issue#40698 <http://tracker.ceph.com/issues/40698>`_, `pr#28987 <https://github.com/ceph/ceph/pull/28987>`_, Radoslaw Zarzynski)
-* common: global/global_context: always add \\0 after strncpy() (`pr#28365 <https://github.com/ceph/ceph/pull/28365>`_, Kefu Chai)
-* common: global/global_init: do first transport connection after setuid() (`pr#28012 <https://github.com/ceph/ceph/pull/28012>`_, Roman Penyaev)
-* common: global/pidfile: pass string_view instead of ConfigProxy to pidfile_wr\xe2\x80\xa6 (`pr#27975 <https://github.com/ceph/ceph/pull/27975>`_, Kefu Chai)
-* common: handle return value from read(2) (`pr#32192 <https://github.com/ceph/ceph/pull/32192>`_, Patrick Donnelly)
-* common: include, common: make ceph::bufferlist 32 bytes long on x86 (`pr#32934 <https://github.com/ceph/ceph/pull/32934>`_, Radoslaw Zarzynski)
-* common: include/buffer: add operator+=() for list::iterator (`pr#33003 <https://github.com/ceph/ceph/pull/33003>`_, Kefu Chai)
-* common: include/cpp-btree: drop btree::dump() (`pr#32692 <https://github.com/ceph/ceph/pull/32692>`_, Kefu Chai)
-* common: include/interval_set: rename some types (`pr#32415 <https://github.com/ceph/ceph/pull/32415>`_, Kefu Chai)
-* common: include: switch mempool.h to ceph::atomic (`pr#33034 <https://github.com/ceph/ceph/pull/33034>`_, Radoslaw Zarzynski)
-* common: json: JSONDecoder::err inherits from std::runtime_error (`pr#27957 <https://github.com/ceph/ceph/pull/27957>`_, Casey Bodley)
-* common: make cluster_network work (`pr#27811 <https://github.com/ceph/ceph/pull/27811>`_, Jianpeng Ma)
-* common: messages: MOSDPGCreate2 doesnt assume using namespace std (`pr#28342 <https://github.com/ceph/ceph/pull/28342>`_, Radoslaw Zarzynski)
-* common: messages: remove MNop (`pr#27585 <https://github.com/ceph/ceph/pull/27585>`_, Kefu Chai)
-* common: mgr/test_orchestrator: Add dummy data (`pr#32182 <https://github.com/ceph/ceph/pull/32182>`_, Sebastian Wagner, Volker Theile)
-* common: move gen_rand_alphanumeric() helpers into common (`pr#31567 <https://github.com/ceph/ceph/pull/31567>`_, Casey Bodley)
-* common: move xattr -> os/filestore/os_xattr (`pr#32219 <https://github.com/ceph/ceph/pull/32219>`_, David Disseldorp)
-* common: msg/Message: remove unused local variables (`pr#29155 <https://github.com/ceph/ceph/pull/29155>`_, Kefu Chai)
-* common: msg/msg_types: use inet_ntop(3) to render IP addresses (`pr#26987 <https://github.com/ceph/ceph/pull/26987>`_, Sage Weil)
-* common: no need to include ceph_assert.h (`pr#28255 <https://github.com/ceph/ceph/pull/28255>`_, Kefu Chai)
-* common: octopus (`pr#27009 <https://github.com/ceph/ceph/pull/27009>`_, Sage Weil)
-* common: optimize check_utf8 (`pr#27628 <https://github.com/ceph/ceph/pull/27628>`_, Yibo Cai)
-* common: optimize encode_utf8 (`pr#27807 <https://github.com/ceph/ceph/pull/27807>`_, Yibo Cai)
-* common: OutputDataSocket retakes mutex on error path (`issue#40188 <http://tracker.ceph.com/issues/40188>`_, `pr#28431 <https://github.com/ceph/ceph/pull/28431>`_, Casey Bodley)
-* common: preforker: remove useless code (`pr#31714 <https://github.com/ceph/ceph/pull/31714>`_, Xiubo Li)
-* common: python-common: Add drive selection (`pr#31021 <https://github.com/ceph/ceph/pull/31021>`_, Sebastian Wagner)
-* common: python-common: add py.typed (PEP 561) (`pr#33236 <https://github.com/ceph/ceph/pull/33236>`_, Sebastian Wagner)
-* common: python-common: Add small Readme (`pr#30587 <https://github.com/ceph/ceph/pull/30587>`_, Sebastian Wagner)
-* common: python-common: avoid using setup_requires in setup.py (`pr#31222 <https://github.com/ceph/ceph/pull/31222>`_, Sebastian Wagner)
-* common: python-common: enable lint in tox tests (`pr#31068 <https://github.com/ceph/ceph/pull/31068>`_, Kiefer Chang)
-* common: python-common: Fix typo in device type (`pr#31758 <https://github.com/ceph/ceph/pull/31758>`_, Volker Theile)
-* common: python-common: Make Drive Group filter by AND, instead of OR (`pr#33625 <https://github.com/ceph/ceph/pull/33625>`_, Sage Weil, Sebastian Wagner)
-* common: python-common: Make DriveGroupSpec a sub type of ServiceSpec (`pr#33817 <https://github.com/ceph/ceph/pull/33817>`_, Sebastian Wagner)
-* common: random: added a deduction guide to make using the function ob\xe2\x80\xa6 (`pr#30224 <https://github.com/ceph/ceph/pull/30224>`_, Jesse Williamson)
-* common: remove dead code in {safe,mutable}_item_history (`pr#32698 <https://github.com/ceph/ceph/pull/32698>`_, Radoslaw Zarzynski)
-* common: remove unused _STR and STRINGIFY macro (`pr#29605 <https://github.com/ceph/ceph/pull/29605>`_, Yao Zongyou)
-* common: rename image to container_image (`pr#30800 <https://github.com/ceph/ceph/pull/30800>`_, Sage Weil)
-* common: Revert Merge pull request #33673 from cbodley/wip-denc-enum (`pr#33832 <https://github.com/ceph/ceph/pull/33832>`_, Sage Weil)
-* common: selinux: Allow ceph to setsched (`pr#33404 <https://github.com/ceph/ceph/pull/33404>`_, Brad Hubbard)
-* common: skip interfaces starting with lo in find_ipv{4,6}_in_subnet() (`pr#32420 <https://github.com/ceph/ceph/pull/32420>`_, Jiawei Li)
-* common: sort best-matched commond by req argument count (`issue#40292 <http://tracker.ceph.com/issues/40292>`_, `pr#28510 <https://github.com/ceph/ceph/pull/28510>`_, Chang Liu)
-* common: src/: remove execute permissions on nine source files (`pr#28781 <https://github.com/ceph/ceph/pull/28781>`_, J. Eric Ivancich)
-* common: start logging for non-global_init users (`pr#27352 <https://github.com/ceph/ceph/pull/27352>`_, Sage Weil)
-* common: systemd: Wait 5 seconds before attempting a restart of an OSD (`pr#31550 <https://github.com/ceph/ceph/pull/31550>`_, Wido den Hollander)
-* common: use of malloc.h is deprecated (`pr#29397 <https://github.com/ceph/ceph/pull/29397>`_, Willem Jan Withagen)
-* common: zstd: upgrade to v1.4.0 (`pr#28656 <https://github.com/ceph/ceph/pull/28656>`_, Dan van der Ster)
-* core,mgr,tools: osd,tools: Balancer fixes without all of the calc_pg_upmaps() rewrites (`pr#31774 <https://github.com/ceph/ceph/pull/31774>`_, David Zafman)
-* core,mgr: mgr/ActivePyModules: drop GIL to register/unregister clients (`pr#33464 <https://github.com/ceph/ceph/pull/33464>`_, Sage Weil)
-* core,mgr: mgr/alerts: simple module to send health alerts (`pr#30738 <https://github.com/ceph/ceph/pull/30738>`_, Sage Weil)
-* core,mgr: mgr/DaemonServer: warn when we reject reports (`pr#31471 <https://github.com/ceph/ceph/pull/31471>`_, Sage Weil)
-* core,mgr: mgr/pg_autoscaler: add pg_autoscale_bias pool property and apply it to pg_num selection (`pr#27154 <https://github.com/ceph/ceph/pull/27154>`_, Sage Weil)
-* core,mgr: mgr/prometheus: report per-pool pg states (`pr#32370 <https://github.com/ceph/ceph/pull/32370>`_, Aleksei Zakharov)
-* core,mgr: mgr/telemetry: add report_timestamp to sent reports (`pr#27571 <https://github.com/ceph/ceph/pull/27571>`_, Dan Mick)
-* core,mgr: mgr/telemetry: catch exception during requests.put (`pr#33070 <https://github.com/ceph/ceph/pull/33070>`_, Sage Weil)
-* core,mgr: mgr/telemetry: obscure entity_name with a salt (`pr#29330 <https://github.com/ceph/ceph/pull/29330>`_, Sage Weil)
-* core,mgr: osd,mon,mgr: report /dev/disk/by-path paths for devices (`pr#32261 <https://github.com/ceph/ceph/pull/32261>`_, Sage Weil)
-* core,mon: mon,osd: use get_req<> instead of static_cast<>(get_req()) (`pr#30023 <https://github.com/ceph/ceph/pull/30023>`_, Kefu Chai)
-* core,mon: mon/AuthMonitor: fix initial creation of rotating keys (`issue#40634 <http://tracker.ceph.com/issues/40634>`_, `pr#28850 <https://github.com/ceph/ceph/pull/28850>`_, Sage Weil)
-* core,mon: mon/MonClient: add proper SRV priority support (`pr#27126 <https://github.com/ceph/ceph/pull/27126>`_, Kefu Chai)
-* core,mon: mon/Monitor.cc: fix condition that checks for unrecognized auth mode (`pr#30015 <https://github.com/ceph/ceph/pull/30015>`_, Neha Ojha)
-* core,mon: mon/Monitor.cc: print min_mon_release correctly (`pr#27107 <https://github.com/ceph/ceph/pull/27107>`_, Neha Ojha)
-* core,mon: mon/OSDMonitor: clean up removed_snap keys (`pr#30518 <https://github.com/ceph/ceph/pull/30518>`_, Sage Weil)
-* core,mon: mon/OSDMonitor: expand iec_options for osd pool set (`pr#31196 <https://github.com/ceph/ceph/pull/31196>`_, Sage Weil)
-* core,mon: mon/OSDMonitor: Use generic priority cache tuner for mon caches (`issue#40870 <http://tracker.ceph.com/issues/40870>`_, `pr#28227 <https://github.com/ceph/ceph/pull/28227>`_, Sridhar Seshasayee)
-* core,pybind: pybind/ceph_argparse: avoid int overflow (`pr#33101 <https://github.com/ceph/ceph/pull/33101>`_, Kefu Chai)
-* core,pybind: pybind/rados: fix set_omap() crash on py3 (`pr#29096 <https://github.com/ceph/ceph/pull/29096>`_, Sage Weil)
-* core,pybind: pybind/rados: fixed Python3 string conversion issue on get_fsid (`issue#38381 <http://tracker.ceph.com/issues/38381>`_, `pr#26514 <https://github.com/ceph/ceph/pull/26514>`_, Jason Dillaman)
-* core,rbd: common/config: use string_view for keys (`pr#27097 <https://github.com/ceph/ceph/pull/27097>`_, Kefu Chai)
-* core,rbd: osd/OSDCap: rbd profile permits use of rbd_info (`issue#39973 <http://tracker.ceph.com/issues/39973>`_, `pr#28253 <https://github.com/ceph/ceph/pull/28253>`_, songweibin)
-* core,rbd: osd/PrimaryLogPG: do not append outdata to TMAPUP ops (`pr#30457 <https://github.com/ceph/ceph/pull/30457>`_, Jason Dillaman)
-* core,rgw,tests: librados,test,rgw: cleanups to deprecate safe_cb related functions (`pr#31045 <https://github.com/ceph/ceph/pull/31045>`_, Kefu Chai)
-* core,tests: ceph_test_cls_hello: set RETURNVEC on the expected EINVAL request (`pr#33708 <https://github.com/ceph/ceph/pull/33708>`_, Sage Weil)
-* core,tests: ceph_test_rados_api\\_{watch_notify,misc}: tolerate some timeouts (`pr#34011 <https://github.com/ceph/ceph/pull/34011>`_, Sage Weil)
-* core,tests: Improvements to standalone tests (`pr#27279 <https://github.com/ceph/ceph/pull/27279>`_, David Zafman)
-* core,tests: kv_store_bench: fix teuthology_tests() return value (`pr#30293 <https://github.com/ceph/ceph/pull/30293>`_, luo rixin)
-* core,tests: mon.test: improve validation and add a test for osd pool create (`pr#30538 <https://github.com/ceph/ceph/pull/30538>`_, Kefu Chai)
-* core,tests: qa/objectstore: test with reduced value of osd_memory_target (`pr#27083 <https://github.com/ceph/ceph/pull/27083>`_, Neha Ojha)
-* core,tests: qa/standalone/ceph-helpers: more osd debug (`issue#40666 <http://tracker.ceph.com/issues/40666>`_, `pr#28867 <https://github.com/ceph/ceph/pull/28867>`_, Sage Weil)
-* core,tests: qa/standalone/misc/ok-to-stop: improve test (`pr#32738 <https://github.com/ceph/ceph/pull/32738>`_, Sage Weil)
-* core,tests: qa/standalone/mon/health-mute.sh: misc fixes (`pr#29744 <https://github.com/ceph/ceph/pull/29744>`_, Sage Weil)
-* core,tests: qa/standalone/osd/osd-backfill-recovery-log.sh: fix TEST_backfill_log\\_[1, 2] (`pr#32851 <https://github.com/ceph/ceph/pull/32851>`_, Neha Ojha)
-* core,tests: qa/standalone/scrub/osd-scrub-snaps: snapmapper omap is now m (`pr#29774 <https://github.com/ceph/ceph/pull/29774>`_, Sage Weil)
-* core,tests: qa/standalone/scrub/osd-scrub-test: wait longer for update (`pr#33809 <https://github.com/ceph/ceph/pull/33809>`_, Sage Weil)
-* core,tests: qa/suites/rados/multimon: whitelist SLOW_OPS while thrashing mons (`pr#29121 <https://github.com/ceph/ceph/pull/29121>`_, Sage Weil)
-* core,tests: qa/suites/rados/perf: run on ubuntu (`pr#32355 <https://github.com/ceph/ceph/pull/32355>`_, Sage Weil)
-* core,tests: qa/suites/rados/rest: run restful test on el8 (`pr#32920 <https://github.com/ceph/ceph/pull/32920>`_, Sage Weil)
-* core,tests: qa/suites/rados/singleton-bluestore/cephtool: whitelist MON_DOWN (`pr#33645 <https://github.com/ceph/ceph/pull/33645>`_, Sage Weil)
-* core,tests: qa/suites/rados/singleton/all/lost-unfound\\*: whitelist SLOW_OPS (`pr#32958 <https://github.com/ceph/ceph/pull/32958>`_, Sage Weil)
-* core,tests: qa/suites/rados/singleton/all/recovery-preemption: fix pg log length (`pr#32898 <https://github.com/ceph/ceph/pull/32898>`_, Sage Weil)
-* core,tests: qa/suites/rados/singleton/all/thrash-eio: whitelist slow request (`pr#33497 <https://github.com/ceph/ceph/pull/33497>`_, Sage Weil, Sridhar Seshasayee)
-* core,tests: qa/suites/rados/thrash-old-clients: exclude ceph-daemon on nautilus installs (`pr#30817 <https://github.com/ceph/ceph/pull/30817>`_, Sage Weil)
-* core,tests: qa/suites/rados/thrash-old-clients: rejigger v1 vs v2 settings (`pr#27249 <https://github.com/ceph/ceph/pull/27249>`_, Sage Weil)
-* core,tests: qa/suites/rados/thrash-old-clients: tolerate MON_DOWN (`pr#30577 <https://github.com/ceph/ceph/pull/30577>`_, Sage Weil)
-* core,tests: qa/suites/rados/thrash-old-clients: use cephadm (`pr#32377 <https://github.com/ceph/ceph/pull/32377>`_, Sage Weil)
-* core,tests: qa/suites/rados/thrash: force normal pg log length with cache tiering (`issue#38358 <http://tracker.ceph.com/issues/38358>`_, `issue#24320 <http://tracker.ceph.com/issues/24320>`_, `pr#28658 <https://github.com/ceph/ceph/pull/28658>`_, Sage Weil)
-* core,tests: qa/suites/rados/thrash: increase async and partial recovery test coverage (`pr#30699 <https://github.com/ceph/ceph/pull/30699>`_, Neha Ojha)
-* core,tests: qa/suites/rados/valgrind-leaks: independently verify we detect leaks on mon, osd, mgr (`pr#32946 <https://github.com/ceph/ceph/pull/32946>`_, Sage Weil)
-* core,tests: qa/suites/rados/verify/tasks/mon_recovery: whitelist SLOW_OPS (`pr#33644 <https://github.com/ceph/ceph/pull/33644>`_, Sage Weil)
-* core,tests: qa/suites/rados/verify: debug monc = 20 (`pr#32968 <https://github.com/ceph/ceph/pull/32968>`_, Sage Weil)
-* core,tests: qa/suites/rados/verify: debug_ms = 1 (`pr#33871 <https://github.com/ceph/ceph/pull/33871>`_, Sage Weil)
-* core,tests: qa/suites/rados: move cephadm_orchestrator to el8 (`pr#32407 <https://github.com/ceph/ceph/pull/32407>`_, Sage Weil)
-* core,tests: qa/suites/upgrade/mimic-x-singleton: suppress TOO_FEW_PGS warning (`pr#31054 <https://github.com/ceph/ceph/pull/31054>`_, Sage Weil)
-* core,tests: qa/suites/upgrade: fix mimic-x-singleton (`pr#32719 <https://github.com/ceph/ceph/pull/32719>`_, Sage Weil)
-* core,tests: qa/suites/upgrade: misc fixes for octopus (`pr#32750 <https://github.com/ceph/ceph/pull/32750>`_, Sage Weil, Josh Durgin)
-* core,tests: qa/tasks/cbt: run stop-all.sh while shutting down (`pr#31171 <https://github.com/ceph/ceph/pull/31171>`_, Sage Weil)
-* core,tests: qa/tasks/ceph: restart: stop osd, mark down, then start (`pr#30196 <https://github.com/ceph/ceph/pull/30196>`_, Sage Weil)
-* core,tests: qa/tasks/ceph_manager: add --log-early to raw_cluster_cmd (`pr#32989 <https://github.com/ceph/ceph/pull/32989>`_, Sage Weil)
-* core,tests: qa/tasks/ceph_manager: enable ceph-objectstore-tool via cephadm (`pr#32411 <https://github.com/ceph/ceph/pull/32411>`_, Sage Weil)
-* core,tests: qa/tasks/ceph_manager: fix ceph-objectstore-tool incantations (`pr#32701 <https://github.com/ceph/ceph/pull/32701>`_, Sage Weil)
-* core,tests: qa/tasks/ceph_manager: fix chmod on log dir during pg export copy (`pr#32943 <https://github.com/ceph/ceph/pull/32943>`_, Sage Weil)
-* core,tests: qa/tasks/ceph_manager: fix post-osd-kill pg peered check (`pr#32737 <https://github.com/ceph/ceph/pull/32737>`_, Sage Weil)
-* core,tests: qa/tasks/ceph_manager: make is\\_{clean,recovered,active_or_down} less racy (`pr#28969 <https://github.com/ceph/ceph/pull/28969>`_, Sage Weil)
-* core,tests: qa/tasks/mon_thrash: sync force requires some force flags (`pr#30361 <https://github.com/ceph/ceph/pull/30361>`_, Sage Weil)
-* core,tests: qa/tasks/radosbench: fix usage of -O (`pr#33744 <https://github.com/ceph/ceph/pull/33744>`_, Sage Weil)
-* core,tests: qa/tasks/thrashosds-health: disable osd_max_markdown behavior (`pr#33601 <https://github.com/ceph/ceph/pull/33601>`_, Sage Weil)
-* core,tests: qa/workunits/cephtool/test.sh: delete test_erasure pool (`pr#33188 <https://github.com/ceph/ceph/pull/33188>`_, Sage Weil)
-* core,tests: qa/workunits/rados/test_crash.sh: suppress core files (`pr#32724 <https://github.com/ceph/ceph/pull/32724>`_, Sage Weil)
-* core,tests: qa: add basic omap testing capability (`pr#29120 <https://github.com/ceph/ceph/pull/29120>`_, Neha Ojha)
-* core,tests: remove ceph_test_rados_watch_notify (`pr#34044 <https://github.com/ceph/ceph/pull/34044>`_, Sage Weil)
-* core,tests: test/CMakeLists: disable memstore make check test (`pr#33473 <https://github.com/ceph/ceph/pull/33473>`_, Sage Weil)
-* core,tests: test/librados: dont release handler if set_pg_num failed (`pr#32112 <https://github.com/ceph/ceph/pull/32112>`_, huangjun)
-* core,tests: test/osd/safe-to-destroy.sh: fix typo (`pr#27651 <https://github.com/ceph/ceph/pull/27651>`_, Sage Weil)
-* core,tests: test/pybind/test_rados.py: test test_aio_remove (`pr#31003 <https://github.com/ceph/ceph/pull/31003>`_, Zhang Jiao)
-* core,tests: test/unittest_lockdep: do not start extra threads (`pr#32772 <https://github.com/ceph/ceph/pull/32772>`_, Kefu Chai)
-* core,tests: test: Bump sleep time for slower machines (`pr#29494 <https://github.com/ceph/ceph/pull/29494>`_, David Zafman)
-* core,tests: test: Make sure that extra scheduled scrubs dont confuse test (`issue#40078 <http://tracker.ceph.com/issues/40078>`_, `pr#28302 <https://github.com/ceph/ceph/pull/28302>`_, David Zafman)
-* core,tests: tests/osd: fix typo in unittest_osdmap (`pr#29790 <https://github.com/ceph/ceph/pull/29790>`_, huangjun)
-* core,tests: tools/rados: use num ops instead of num objs for tracking outstanding IO (`pr#29734 <https://github.com/ceph/ceph/pull/29734>`_, Albert H Chen)
-* core,tests: unittest_lockdep: avoid any threads for death test (`pr#32765 <https://github.com/ceph/ceph/pull/32765>`_, Sage Weil)
-* core,tools: ceph-objectstore-tool cant remove head with bad snapset (`pr#29919 <https://github.com/ceph/ceph/pull/29919>`_, David Zafman)
-* core,tools: ceph.in: check ceph-conf returncode (`pr#30695 <https://github.com/ceph/ceph/pull/30695>`_, Dimitri Savineau)
-* core,tools: src/tools/ceph-dedup-tool: Fix chunk scru (`pr#28765 <https://github.com/ceph/ceph/pull/28765>`_, Myoungwon Oh)
-* core:  ceph.in: only preload asan library for Debug build (`pr#27190 <https://github.com/ceph/ceph/pull/27190>`_, Kefu Chai)
-* core:  osd/ClassHandler: cleanups (`pr#28363 <https://github.com/ceph/ceph/pull/28363>`_, Kefu Chai)
-* core:  osd: add hdd, ssd and hybrid variants for osd_snap_trim_sleep (`pr#28772 <https://github.com/ceph/ceph/pull/28772>`_, Neha Ojha)
-* core:  osdc/Objecter: use unique_ptr<OSDMap> for Objecter::osdmap (`issue#38403 <http://tracker.ceph.com/issues/38403>`_, `pr#28397 <https://github.com/ceph/ceph/pull/28397>`_, Kefu Chai)
-* core: Add structures for tracking in progress operations (`pr#28395 <https://github.com/ceph/ceph/pull/28395>`_, Samuel Just)
-* core: auth: treat mgr the same as mon when selecting auth mode (`pr#33226 <https://github.com/ceph/ceph/pull/33226>`_, Yehuda Sadeh)
-* core: backfill_toofull seen on cluster where the most full OSD is at 1% (`pr#29857 <https://github.com/ceph/ceph/pull/29857>`_, David Zafman)
-* core: ceph,pybind/mgr: a few py3 fixes (`pr#32187 <https://github.com/ceph/ceph/pull/32187>`_, Sage Weil)
-* core: ceph-objectstore-tool: better error message if pgid and object do not match (`pr#30501 <https://github.com/ceph/ceph/pull/30501>`_, Sage Weil)
-* core: ceph.in: Fix name retval is not defined error (`pr#33516 <https://github.com/ceph/ceph/pull/33516>`_, Varsha Rao)
-* core: ceph.in: improve control-c handling (`pr#33352 <https://github.com/ceph/ceph/pull/33352>`_, Sage Weil)
-* core: ceph.in: only shut down rados on clean exit (`pr#33825 <https://github.com/ceph/ceph/pull/33825>`_, Sage Weil)
-* core: client: fix FTBFS due to bl::iterator::advance() (`pr#33085 <https://github.com/ceph/ceph/pull/33085>`_, Radoslaw Zarzynski)
-* core: cls_hello: fix typo (`pr#32976 <https://github.com/ceph/ceph/pull/32976>`_, Sage Weil)
-* core: common,mon,osd: unify ceph tell and ceph daemon command sets (`pr#30217 <https://github.com/ceph/ceph/pull/30217>`_, Sage Weil)
-* core: common,tools,crush,test: misc converity & klocwork fixes (`pr#29316 <https://github.com/ceph/ceph/pull/29316>`_, songweibin)
-* core: common/admin_socket: Increase socket timeouts (`pr#31623 <https://github.com/ceph/ceph/pull/31623>`_, Brad Hubbard)
-* core: common/assert: include ceph_abort_msg(arg) arg in log output (`pr#27732 <https://github.com/ceph/ceph/pull/27732>`_, Sage Weil)
-* core: common/blkdev: fix some problems with smart scraping (`pr#28848 <https://github.com/ceph/ceph/pull/28848>`_, Sage Weil)
-* core: common/blkdev: get_device_id: behave if model is lvm and id_model_enc isnt there (`pr#27156 <https://github.com/ceph/ceph/pull/27156>`_, Sage Weil)
-* core: common/blkdev: handle devices with ID_MODEL as LVM PV ... but valid ID_MODEL_ENC (`pr#27020 <https://github.com/ceph/ceph/pull/27020>`_, Sage Weil)
-* core: common/condition_variable_debug: do not assert() if sloppy (`pr#29854 <https://github.com/ceph/ceph/pull/29854>`_, Kefu Chai)
-* core: common/config: behave when both POD_MEMORY_REQUEST and POD_MEMORY_LIMIT are set (`pr#29511 <https://github.com/ceph/ceph/pull/29511>`_, Sage Weil)
-* core: common/config: less noise about configs from mon we cant apply (`pr#31988 <https://github.com/ceph/ceph/pull/31988>`_, Sage Weil)
-* core: common/config: parse --default-$option as a default value (`pr#27169 <https://github.com/ceph/ceph/pull/27169>`_, Sage Weil)
-* core: common/config: update values when they are removed via mon (`pr#32091 <https://github.com/ceph/ceph/pull/32091>`_, Sage Weil)
-* core: common/kv/rocksdb: Fixed async compations (`pr#26786 <https://github.com/ceph/ceph/pull/26786>`_, Adam Kupczyk)
-* core: common/options.cc: Lower the default value of osd_deep_scrub_large_omap_object_key_threshold (`pr#28782 <https://github.com/ceph/ceph/pull/28782>`_, Neha Ojha)
-* core: common/options.cc: make rocksdb_delete_range_threshold very high (`pr#33439 <https://github.com/ceph/ceph/pull/33439>`_, Neha Ojha)
-* core: common/options: allow osd_pool_default_pg_autoscale_mode to update a runtime (`pr#27821 <https://github.com/ceph/ceph/pull/27821>`_, Sage Weil)
-* core: common/options: annotate some options; enable some runtime updates (`pr#27655 <https://github.com/ceph/ceph/pull/27655>`_, Sage Weil)
-* core: common/options: decrease the default max_omap_entries_per_request (`pr#31506 <https://github.com/ceph/ceph/pull/31506>`_, Yan Jun)
-* core: common/options: make secure mode non-experimental, and prefer/require it for mons (`pr#27012 <https://github.com/ceph/ceph/pull/27012>`_, Sage Weil)
-* core: common/options: update mon_crush_min_required_version=hammer (`pr#27568 <https://github.com/ceph/ceph/pull/27568>`_, Sage Weil)
-* core: common/PriorityCache: fix over-aggressive assert when mem limited (`pr#27763 <https://github.com/ceph/ceph/pull/27763>`_, Mark Nelson)
-* core: common/PriorityCache: Implement a Cache Manager (`pr#27381 <https://github.com/ceph/ceph/pull/27381>`_, Mark Nelson)
-* core: common/TextTable,mgr: standardize on 2 spaces between table columns (`pr#33138 <https://github.com/ceph/ceph/pull/33138>`_, Sage Weil)
-* core: common/util: handle long lines in /proc/cpuinfo (`issue#38296 <http://tracker.ceph.com/issues/38296>`_, `pr#27707 <https://github.com/ceph/ceph/pull/27707>`_, Sage Weil)
-* core: compressor/lz4: work around bug in liblz4 versions <1.8.2 (`pr#33584 <https://github.com/ceph/ceph/pull/33584>`_, Sage Weil, Dan van der Ster)
-* core: crimson, osd: add support for Ceph Classes, part 1 (`pr#29651 <https://github.com/ceph/ceph/pull/29651>`_, Radoslaw Zarzynski)
-* core: crimson/osd: add osd to crush when it boots (`pr#28689 <https://github.com/ceph/ceph/pull/28689>`_, Kefu Chai)
-* core: crush/CrushCompiler: Fix __replacement_assert (`issue#39174 <http://tracker.ceph.com/issues/39174>`_, `pr#27506 <https://github.com/ceph/ceph/pull/27506>`_, Brad Hubbard)
-* core: crush/CrushWrapper.cc: Fix sign compare compiler warning (`pr#31184 <https://github.com/ceph/ceph/pull/31184>`_, Prashant D)
-* core: crush/CrushWrapper: behave with empty weight vector (`pr#32673 <https://github.com/ceph/ceph/pull/32673>`_, Kefu Chai)
-* core: dencoder: include some missed types (`pr#27804 <https://github.com/ceph/ceph/pull/27804>`_, Greg Farnum)
-* core: dmclock server side refactor (`pr#30650 <https://github.com/ceph/ceph/pull/30650>`_, Samuel Just)
-* core: examples/librados: fix bufferlist::copy() in hello_world.cc (`pr#33075 <https://github.com/ceph/ceph/pull/33075>`_, Radoslaw Zarzynski)
-* core: Extract peering logic into a module for use in crimson (`pr#27874 <https://github.com/ceph/ceph/pull/27874>`_, Samuel Just, sjust@redhat.com)
-* core: feature: Health warnings on long network ping times, add dump_osd_network to get a report (`issue#40640 <http://tracker.ceph.com/issues/40640>`_, `pr#28755 <https://github.com/ceph/ceph/pull/28755>`_, David Zafman)
-* core: Feature: Improvements to auto repair (`issue#38616 <http://tracker.ceph.com/issues/38616>`_, `pr#26942 <https://github.com/ceph/ceph/pull/26942>`_, David Zafman)
-* core: global: ensure CEPH_ARGS is decoded before early arg processing (`pr#32830 <https://github.com/ceph/ceph/pull/32830>`_, Jason Dillaman)
-* core: global: explicitly call out EIO events in crash dumps (`pr#27386 <https://github.com/ceph/ceph/pull/27386>`_, Sage Weil)
-* core: include,os: Make ceph_le member private (`pr#30526 <https://github.com/ceph/ceph/pull/30526>`_, Ulrich Weigand)
-* core: include/ceph_features: fix typo (`pr#27353 <https://github.com/ceph/ceph/pull/27353>`_, Sage Weil)
-* core: include/cpp-btree: cleanups (`pr#32443 <https://github.com/ceph/ceph/pull/32443>`_, Kefu Chai)
-* core: init-ceph: wait longer before resending $signal (`pr#27308 <https://github.com/ceph/ceph/pull/27308>`_, Kefu Chai)
-* core: kv/KeyValueDB: fix estimate_prefix_size() (`pr#29842 <https://github.com/ceph/ceph/pull/29842>`_, Adam Kupczyk)
-* core: kv/RocksDBStore: Add minimum key limit before invoking DeleteRange (`pr#31442 <https://github.com/ceph/ceph/pull/31442>`_, Mark Nelson)
-* core: kv/RocksDBStore: make option: compaction_threads/disableWAL/flusher_t\xe2\x80\xa6 (`pr#32453 <https://github.com/ceph/ceph/pull/32453>`_, Jianpeng Ma)
-* core: kv/RocksDBStore: tell rocksdb to set mode to 0600, not 0644 (`pr#30679 <https://github.com/ceph/ceph/pull/30679>`_, Sage Weil)
-* core: kv: fix shutdown vs async compaction (`pr#32619 <https://github.com/ceph/ceph/pull/32619>`_, Sage Weil)
-* core: kv: make delete range optional on number of keys (`pr#27317 <https://github.com/ceph/ceph/pull/27317>`_, Zengran Zhang)
-* core: librados,osd,mon: remove traces of CEPH_OSDMAP_FULL (`pr#30614 <https://github.com/ceph/ceph/pull/30614>`_, Kefu Chai)
-* core: Make dumping of reservation info congruent between scrub and recovery (`pr#30192 <https://github.com/ceph/ceph/pull/30192>`_, David Zafman)
-* core: messages,osd: remove MPGStats::had_map_for (`pr#27026 <https://github.com/ceph/ceph/pull/27026>`_, Kefu Chai)
-* core: messages: #include necessary header (`pr#27590 <https://github.com/ceph/ceph/pull/27590>`_, Kefu Chai)
-* core: mgr/balancer: sort pool names in balancer ls output (`pr#32424 <https://github.com/ceph/ceph/pull/32424>`_, Sage Weil)
-* core: mgr/balancer: tolerate pgs outside of target weight map (`pr#34014 <https://github.com/ceph/ceph/pull/34014>`_, Sage Weil)
-* core: mgr/cephadm: health alert for stray services or hosts (`pr#32754 <https://github.com/ceph/ceph/pull/32754>`_, Sage Weil)
-* core: mgr/crash: behave when posted crash has no backtrace (`pr#31643 <https://github.com/ceph/ceph/pull/31643>`_, Sage Weil)
-* core: mgr/crash: raise warning about recent crashes and other improvements (`pr#29034 <https://github.com/ceph/ceph/pull/29034>`_, Sage Weil)
-* core: mgr/DaemonServer: fix osd ok-to-stop for EC pools (`pr#32046 <https://github.com/ceph/ceph/pull/32046>`_, Sage Weil)
-* core: mgr/DaemonServer: fix pg merge checks (`pr#34067 <https://github.com/ceph/ceph/pull/34067>`_, Sage Weil)
-* core: mgr/DaemonServer: prevent pgp_num reductions from outpacing pg_num merges (`issue#38786 <http://tracker.ceph.com/issues/38786>`_, `pr#27473 <https://github.com/ceph/ceph/pull/27473>`_, Sage Weil)
-* core: mgr/devicehealth: fix telemetry stops sending device reports after 48\xe2\x80\xa6 (`pr#32903 <https://github.com/ceph/ceph/pull/32903>`_, Yaarit Hatuka)
-* core: mgr/diskprediction_cloud: Service unavailable (`issue#40478 <http://tracker.ceph.com/issues/40478>`_, `pr#28687 <https://github.com/ceph/ceph/pull/28687>`_, Rick Chen)
-* core: mgr/diskprediction_local: import scipy early to fix self-test deadlock (`pr#32102 <https://github.com/ceph/ceph/pull/32102>`_, Sage Weil)
-* core: mgr/diskprediction_local: some debug output during predict (and self-test) (`pr#31572 <https://github.com/ceph/ceph/pull/31572>`_, Sage Weil)
-* core: mgr/MgrClient: fix open condition (`pr#31256 <https://github.com/ceph/ceph/pull/31256>`_, Sage Weil)
-* core: mgr/MgrClient: fix open condition fix (`pr#31422 <https://github.com/ceph/ceph/pull/31422>`_, Sage Weil)
-* core: mgr/MgrClient: fix tell mgr.x ... (`pr#31989 <https://github.com/ceph/ceph/pull/31989>`_, Sage Weil)
-* core: mgr/pg_autoscaler: complete event if pool disappears (`pr#30819 <https://github.com/ceph/ceph/pull/30819>`_, Sage Weil)
-* core: mgr/pg_autoscaler: default to pg_num[_min] = 16 (`pr#31636 <https://github.com/ceph/ceph/pull/31636>`_, Sage Weil)
-* core: mgr/pg_autoscaler: default to pg_num[_min] = 32 (`pr#32788 <https://github.com/ceph/ceph/pull/32788>`_, Neha Ojha)
-* core: mgr/pg_autoscaler: fix division by zero (`pr#33402 <https://github.com/ceph/ceph/pull/33402>`_, Sage Weil)
-* core: mgr/pg_autoscaler: only generate target\\_\\* health warnings if targets set (`pr#31638 <https://github.com/ceph/ceph/pull/31638>`_, Sage Weil)
-* core: mgr/progress: behave if pgs disappear (due to a racing pg merge) (`issue#38157 <http://tracker.ceph.com/issues/38157>`_, `pr#27546 <https://github.com/ceph/ceph/pull/27546>`_, Sage Weil)
-* core: mgr/progress: fix duration strings (`pr#34045 <https://github.com/ceph/ceph/pull/34045>`_, Sage Weil)
-* core: mgr/progress: progress clear command should clear events in ceph -s (`pr#33400 <https://github.com/ceph/ceph/pull/33400>`_, Sage Weil)
-* core: mgr/telemetry: add some more telemetry (`pr#31226 <https://github.com/ceph/ceph/pull/31226>`_, Sage Weil)
-* core: mgr/telemetry: include pg_autoscaler and balancer status (`pr#30871 <https://github.com/ceph/ceph/pull/30871>`_, Sage Weil)
-* core: mgr/telemetry: send device telemetry via per-host POST to device endpoint (`pr#31225 <https://github.com/ceph/ceph/pull/31225>`_, Sage Weil)
-* core: mgr/telemetry: split entity_name only once (handle ids with dots) (`pr#33094 <https://github.com/ceph/ceph/pull/33094>`_, Dan Mick)
-* core: Miscellaneous lost fixes (`pr#27599 <https://github.com/ceph/ceph/pull/27599>`_, Xinze Chi, Greg Farnum, linbing, shangfufei)
-* core: mon, osd: parallel clean_pg_upmaps (`issue#40104 <http://tracker.ceph.com/issues/40104>`_, `pr#28373 <https://github.com/ceph/ceph/pull/28373>`_, xie xingguo)
-* core: mon,msg/async: fix mon to mon authentication (`pr#27823 <https://github.com/ceph/ceph/pull/27823>`_, Sage Weil)
-* core: mon,osd: add dead_epoch, --dead flag to osd down (`pr#29221 <https://github.com/ceph/ceph/pull/29221>`_, Sage Weil)
-* core: mon,osd: add no{out,down,in,out} flags on CRUSH nodes (`pr#27563 <https://github.com/ceph/ceph/pull/27563>`_, Sage Weil)
-* core: mon,osd: deprecate forward and readforward cache modes (`pr#28944 <https://github.com/ceph/ceph/pull/28944>`_, Sage Weil)
-* core: mon,osd: track history and past_intervals for creating pgs (`pr#27696 <https://github.com/ceph/ceph/pull/27696>`_, Sage Weil)
-* core: mon,osd: various octopus feature bits (`pr#27141 <https://github.com/ceph/ceph/pull/27141>`_, Sage Weil)
-* core: mon/ConfigMap: search nested sections (`pr#31327 <https://github.com/ceph/ceph/pull/31327>`_, Sage Weil)
-* core: mon/ConfigMonitor: fix handling of NO_MON_UPDATE settings (`pr#32726 <https://github.com/ceph/ceph/pull/32726>`_, Sage Weil)
-* core: mon/ConfigMonitor: only propose if leader (`pr#32975 <https://github.com/ceph/ceph/pull/32975>`_, Sage Weil)
-* core: mon/ConfigMonitor: prefix all global config options with global/ (`pr#32786 <https://github.com/ceph/ceph/pull/32786>`_, Sage Weil)
-* core: mon/LogMonitor: add mon_cluster_log_to_file bool option (`pr#27343 <https://github.com/ceph/ceph/pull/27343>`_, Sage Weil)
-* core: mon/MgrMonitor: fix null deref when invalid formatter is specified (`pr#29089 <https://github.com/ceph/ceph/pull/29089>`_, Sage Weil)
-* core: mon/MgrMonitor: make mgr fail work with no arguments (`pr#33997 <https://github.com/ceph/ceph/pull/33997>`_, Sage Weil)
-* core: mon/MgrStatMonitor: ensure only one copy of initial service map (`issue#38839 <http://tracker.ceph.com/issues/38839>`_, `pr#27101 <https://github.com/ceph/ceph/pull/27101>`_, Sage Weil)
-* core: mon/MonClient: do not dereference auth_supported.end() (`pr#27196 <https://github.com/ceph/ceph/pull/27196>`_, Kefu Chai)
-* core: mon/MonClient: ENXIO when sending command to down mon (`pr#29090 <https://github.com/ceph/ceph/pull/29090>`_, Sage Weil, Greg Farnum)
-* core: mon/MonClient: send logs to mon on separate schedule than pings (`pr#33732 <https://github.com/ceph/ceph/pull/33732>`_, Sage Weil)
-* core: mon/MonClient: skip CEPHX_V2 challenge if client doesnt support it (`pr#30523 <https://github.com/ceph/ceph/pull/30523>`_, Sage Weil)
-* core: mon/Monitor: fail forwarded tell commands (`pr#33542 <https://github.com/ceph/ceph/pull/33542>`_, Sage Weil)
-* core: mon/MonMap: encode (more) valid compat monmap when we have v2-only addrs (`pr#31472 <https://github.com/ceph/ceph/pull/31472>`_, Sage Weil)
-* core: mon/MonmapMonitor: clean up empty created stamp in monmap (`issue#39085 <http://tracker.ceph.com/issues/39085>`_, `pr#27327 <https://github.com/ceph/ceph/pull/27327>`_, Sage Weil)
-* core: mon/OSDMonitor.cc: Add current numbers of objects and bytes (`pr#18694 <https://github.com/ceph/ceph/pull/18694>`_, Shinobu Kinjo)
-* core: mon/OSDMonitor.cc: better error message about min_size (`pr#29184 <https://github.com/ceph/ceph/pull/29184>`_, Neha Ojha)
-* core: mon/OSDMonitor: accept autoscale_mode argument to osd pool create (`pr#33092 <https://github.com/ceph/ceph/pull/33092>`_, Sage Weil)
-* core: mon/OSDMonitor: add check for crush rule size in pool set size command (`pr#30723 <https://github.com/ceph/ceph/pull/30723>`_, Vikhyat Umrao)
-* core: mon/OSDMonitor: allow osd pool set pgp_num_actual (`pr#27010 <https://github.com/ceph/ceph/pull/27010>`_, Sage Weil)
-* core: mon/OSDMonitor: allow pg_num to increase when require_osd_release < N (`issue#39570 <http://tracker.ceph.com/issues/39570>`_, `pr#27928 <https://github.com/ceph/ceph/pull/27928>`_, Sage Weil)
-* core: mon/OSDMonitor: Dont update mon cache settings if rocksdb is not used (`pr#32473 <https://github.com/ceph/ceph/pull/32473>`_, Sridhar Seshasayee)
-* core: mon/OSDMonitor: fix format error ceph osd stat --format json (`pr#31399 <https://github.com/ceph/ceph/pull/31399>`_, Zheng Yin)
-* core: mon/OSDMonitor: make memory autotune disable itself if no rocksd (`pr#32044 <https://github.com/ceph/ceph/pull/32044>`_, Sage Weil)
-* core: mon/OSDMonitor: tolerate duplicate MRemoveSnaps messages (`issue#40774 <http://tracker.ceph.com/issues/40774>`_, `pr#29051 <https://github.com/ceph/ceph/pull/29051>`_, Sage Weil)
-* core: mon/PGMap.h: disable network stats in dump_osd_stats (`pr#32406 <https://github.com/ceph/ceph/pull/32406>`_, Neha Ojha, David Zafman)
-* core: mon/PGMap: drop indentation on df human output (`pr#30848 <https://github.com/ceph/ceph/pull/30848>`_, Sage Weil)
-* core: mon/PGMap: fix summary display of >32bit pg states (`pr#33137 <https://github.com/ceph/ceph/pull/33137>`_, Sage Weil)
-* core: mon/PGMap: use NONE for pg ls[-\\*] output too (`pr#32048 <https://github.com/ceph/ceph/pull/32048>`_, Sage Weil)
-* core: mon/Session: only index osd ids >= 0 (`pr#32764 <https://github.com/ceph/ceph/pull/32764>`_, Sage Weil)
-* core: More PeeringState and related cleanups to ease use in crimson (`pr#28048 <https://github.com/ceph/ceph/pull/28048>`_, Samuel Just)
-* core: msg,auth: migrate msg/async V1 implementation to new Auth{Server,Client} interfaces (`pr#27566 <https://github.com/ceph/ceph/pull/27566>`_, Sage Weil)
-* core: msg/async/frames_v2.h: fix warning (`pr#27464 <https://github.com/ceph/ceph/pull/27464>`_, Sage Weil)
-* core: msg/async/ProtocolV2: fix typo in register_lossy_clients fix (`pr#33559 <https://github.com/ceph/ceph/pull/33559>`_, Sage Weil)
-* core: msg/async/ProtocolV[12]: add ms_learn_addr_from_peer (`pr#27341 <https://github.com/ceph/ceph/pull/27341>`_, Sage Weil)
-* core: msg/async: clear_payload when requeue_sent (`pr#30211 <https://github.com/ceph/ceph/pull/30211>`_, Jianpeng Ma)
-* core: msg/async: optimizations (`pr#26531 <https://github.com/ceph/ceph/pull/26531>`_, Jianpeng Ma)
-* core: msg/auth: handle decode errors instead of throwing exceptions (`pr#31052 <https://github.com/ceph/ceph/pull/31052>`_, Sage Weil)
-* core: msg/DispatchQueue: Set throttle stamp for local_delivery (`pr#31137 <https://github.com/ceph/ceph/pull/31137>`_, Brad Hubbard)
-* core: msg/Policy: limit unregistered anon connections to mon (`pr#33163 <https://github.com/ceph/ceph/pull/33163>`_, Sage Weil)
-* core: msg/Policy: make stateless_server default to anon (again) (`pr#33633 <https://github.com/ceph/ceph/pull/33633>`_, Sage Weil)
-* core: objclass, osd: clean up the cls-host interface. Turn ClassHandler into singleton (`pr#29322 <https://github.com/ceph/ceph/pull/29322>`_, Radoslaw Zarzynski)
-* core: object_stat_sum_t decode broken if given older version (`issue#39284 <http://tracker.ceph.com/issues/39284>`_, `issue#39281 <http://tracker.ceph.com/issues/39281>`_, `pr#27564 <https://github.com/ceph/ceph/pull/27564>`_, David Zafman)
-* core: os, osd: readv (`pr#30061 <https://github.com/ceph/ceph/pull/30061>`_, xie xingguo)
-* core: os/bluestore: Add config observer for osd memory specific options (`pr#29606 <https://github.com/ceph/ceph/pull/29606>`_, Sridhar Seshasayee)
-* core: os/filestore: assure sufficient leaves in pre-split (`issue#39390 <http://tracker.ceph.com/issues/39390>`_, `pr#27689 <https://github.com/ceph/ceph/pull/27689>`_, Jeegn Chen)
-* core: os/Transaction: dump alloc hint flags in op (`pr#28881 <https://github.com/ceph/ceph/pull/28881>`_, Zengran Zhang)
-* core: os: remove KineticStore (`pr#30653 <https://github.com/ceph/ceph/pull/30653>`_, Kefu Chai)
-* core: osd,crimson: use make_message for creating message (`pr#30412 <https://github.com/ceph/ceph/pull/30412>`_, Kefu Chai)
-* core: osd,messages: changes for preparing for crimson-osd (`pr#27003 <https://github.com/ceph/ceph/pull/27003>`_, Kefu Chai)
-* core: osd,mon: remove pg_pool_t::removed_snaps (`pr#28330 <https://github.com/ceph/ceph/pull/28330>`_, Sage Weil)
-* core: osd/ECTransaction,ReplicatedBackend: create op is new in octopus (`pr#29092 <https://github.com/ceph/ceph/pull/29092>`_, Sage Weil)
-* core: osd/MissingLoc, PeeringState: remove osd from missing loc in purge_strays() (`pr#30119 <https://github.com/ceph/ceph/pull/30119>`_, Neha Ojha)
-* core: osd/MissingLoc.cc: do not rely on missing_loc_sources only (`pr#30226 <https://github.com/ceph/ceph/pull/30226>`_, Neha Ojha)
-* core: osd/OSD.cc: make osd bench description consistent with parameters (`issue#39006 <http://tracker.ceph.com/issues/39006>`_, `pr#27600 <https://github.com/ceph/ceph/pull/27600>`_, Neha Ojha)
-* core: osd/osd: add an err log to set_numa_affinty (`pr#30870 <https://github.com/ceph/ceph/pull/30870>`_, luo rixin)
-* core: osd/OSD: auto mark heartbeat sessions as stale and tear them down (`issue#40586 <http://tracker.ceph.com/issues/40586>`_, `pr#28752 <https://github.com/ceph/ceph/pull/28752>`_, xie xingguo)
-* core: osd/OSD: choose more heartbeat peers from different subtrees (`pr#33037 <https://github.com/ceph/ceph/pull/33037>`_, xie xingguo)
-* core: osd/OSD: enhance osd numa affinity compatibility (`pr#31274 <https://github.com/ceph/ceph/pull/31274>`_, Dai zhiwei)
-* core: osd/OSD: keep synchronizing with mon if stuck at booting (`pr#28404 <https://github.com/ceph/ceph/pull/28404>`_, xie xingguo)
-* core: osd/OSD: Log slow ops/types to cluster logs (`pr#33328 <https://github.com/ceph/ceph/pull/33328>`_, Sridhar Seshasayee)
-* core: osd/OSD: only wake up empty pqueue (`pr#28832 <https://github.com/ceph/ceph/pull/28832>`_, Jianpeng Ma)
-* core: osd/OSD: prevent down osds from immediately rejoining the culster (`pr#33039 <https://github.com/ceph/ceph/pull/33039>`_, xie xingguo)
-* core: osd/osd: Refactor get_iface_numa_node (`pr#31965 <https://github.com/ceph/ceph/pull/31965>`_, Dai zhiwei, luo rixin)
-* core: osd/OSD: remove unused func enqueue_peering_evt_front (`pr#32496 <https://github.com/ceph/ceph/pull/32496>`_, Jianpeng Ma)
-* core: osd/OSD: remove unused parameter osdmap_lock_name (`pr#32514 <https://github.com/ceph/ceph/pull/32514>`_, Jianpeng Ma)
-* core: osd/OSDCap: Check for empty namespace (`issue#40835 <http://tracker.ceph.com/issues/40835>`_, `pr#29146 <https://github.com/ceph/ceph/pull/29146>`_, Brad Hubbard)
-* core: osd/OSDMap.cc: add more info in json output of osd stat (`pr#30344 <https://github.com/ceph/ceph/pull/30344>`_, Shen Hang)
-* core: osd/OSDMap.cc: dont output over/underfull messages to lderr (`pr#31542 <https://github.com/ceph/ceph/pull/31542>`_, Neha Ojha)
-* core: osd/OSDMap: add zone to default crush map (`pr#27070 <https://github.com/ceph/ceph/pull/27070>`_, Sage Weil)
-* core: osd/OSDMap: calc_pg_upmaps - restrict optimization to origin pools only (`issue#38897 <http://tracker.ceph.com/issues/38897>`_, `pr#27142 <https://github.com/ceph/ceph/pull/27142>`_, xie xingguo)
-* core: osd/OSDMap: consider overfull osds only when trying to do upmap (`pr#32368 <https://github.com/ceph/ceph/pull/32368>`_, xie xingguo)
-* core: osd/OSDMap: do not trust partially simplified pg_upmap_item (`pr#30576 <https://github.com/ceph/ceph/pull/30576>`_, xie xingguo)
-* core: osd/OSDMap: fix calc_pg_role (`pr#32132 <https://github.com/ceph/ceph/pull/32132>`_, Sage Weil)
-* core: osd/OSDMap: health alert for non-power-of-two pg_num (`pr#30525 <https://github.com/ceph/ceph/pull/30525>`_, Sage Weil)
-* core: osd/OSDMap: Replace get_out_osds with get_out_existing_osds (`issue#39154 <http://tracker.ceph.com/issues/39154>`_, `pr#27663 <https://github.com/ceph/ceph/pull/27663>`_, Brad Hubbard)
-* core: osd/OSDMap: Show health warning if a pool is configured with size 1 (`pr#31416 <https://github.com/ceph/ceph/pull/31416>`_, Sridhar Seshasayee)
-* core: osd/OSDMap: stop encoding osd_state with >8 bits wide states only for old client (`pr#33814 <https://github.com/ceph/ceph/pull/33814>`_, xie xingguo)
-* core: osd/osd_types: bump up some encoding versions (`pr#29923 <https://github.com/ceph/ceph/pull/29923>`_, xie xingguo)
-* core: osd/osd_types: drop last_backfill_bitwise member (`pr#28766 <https://github.com/ceph/ceph/pull/28766>`_, Sage Weil)
-* core: osd/osd_types: fix {omap,hitset_bytes}_stats_invalid handling on split/merge (`pr#30479 <https://github.com/ceph/ceph/pull/30479>`_, Sage Weil)
-* core: osd/osd_types: inc-recovery - add special handler for lost_revert (`pr#29893 <https://github.com/ceph/ceph/pull/29893>`_, xie xingguo)
-* core: osd/osd_types: pool_stat_t::dump - fix num_store_stats field (`issue#39340 <http://tracker.ceph.com/issues/39340>`_, `pr#27633 <https://github.com/ceph/ceph/pull/27633>`_, xie xingguo)
-* core: osd/PeeringState.cc: dont let num_objects become negative (`pr#32305 <https://github.com/ceph/ceph/pull/32305>`_, Neha Ojha)
-* core: osd/PeeringState.cc: skip peer_purged when discovering all missing (`pr#32195 <https://github.com/ceph/ceph/pull/32195>`_, Neha Ojha)
-* core: osd/PeeringState.h: Fix pg stuck in WaitActingChange (`pr#29669 <https://github.com/ceph/ceph/pull/29669>`_, chen qiuzhang)
-* core: osd/PeeringState.h: get_num_missing() should report num_missing() (`pr#30414 <https://github.com/ceph/ceph/pull/30414>`_, Neha Ojha)
-* core: osd/PeeringState.h: ignore RemoteBackfillReserved in WaitLocalBackfillReserved (`pr#33525 <https://github.com/ceph/ceph/pull/33525>`_, Neha Ojha)
-* core: osd/PeeringState: base lease support checks on features, not require_osd_release (`pr#30721 <https://github.com/ceph/ceph/pull/30721>`_, Sage Weil)
-* core: osd/PeeringState: clear LAGGY and WAIT states on exiting Started (`pr#31864 <https://github.com/ceph/ceph/pull/31864>`_, Sage Weil)
-* core: osd/PeeringState: disable read lease until require_osd_release >= octopus (`pr#30692 <https://github.com/ceph/ceph/pull/30692>`_, Sage Weil)
-* core: osd/PeeringState: do not complain about past_intervals constrained by oldest epoch (`pr#29747 <https://github.com/ceph/ceph/pull/29747>`_, Sage Weil)
-* core: osd/PeeringState: do not exclude up from acting_recovery_backfill (`pr#31703 <https://github.com/ceph/ceph/pull/31703>`_, xie xingguo)
-* core: osd/PeeringState: do not start renewing leases until PG is activated (`pr#33129 <https://github.com/ceph/ceph/pull/33129>`_, Sage Weil)
-* core: osd/PeeringState: fix wrong history of merge target (`pr#29835 <https://github.com/ceph/ceph/pull/29835>`_, xie xingguo)
-* core: osd/PeeringState: on_new_interval on child PG after split (`pr#29780 <https://github.com/ceph/ceph/pull/29780>`_, Sage Weil)
-* core: osd/PeeringState: recover_got - add special handler for empty log (`pr#30503 <https://github.com/ceph/ceph/pull/30503>`_, xie xingguo)
-* core: osd/PeeringState: require SERVER_OCTOPUS to respond to RenewLease (`pr#33339 <https://github.com/ceph/ceph/pull/33339>`_, Neha Ojha)
-* core: osd/PeeringState: send pg_info2 if release >= octopus (`pr#30836 <https://github.com/ceph/ceph/pull/30836>`_, Kefu Chai)
-* core: osd/PeeringState: transit async_recovery_targets back into acting before backfilling (`pr#32202 <https://github.com/ceph/ceph/pull/32202>`_, xie xingguo)
-* core: osd/PG: Add PG to large omap log message (`pr#30682 <https://github.com/ceph/ceph/pull/30682>`_, Brad Hubbard)
-* core: osd/PG: adjust pg history on fabricated merge target if necessary (`issue#38623 <http://tracker.ceph.com/issues/38623>`_, `pr#26822 <https://github.com/ceph/ceph/pull/26822>`_, Sage Weil)
-* core: osd/PG: clean up fastinfo key when last_update does not increase (`pr#32615 <https://github.com/ceph/ceph/pull/32615>`_, Sage Weil, Kefu Chai)
-* core: osd/PG: discover missing objects when an OSD peers and PG is degraded (`pr#27288 <https://github.com/ceph/ceph/pull/27288>`_, Jonas Jelten)
-* core: osd/PG: do not leak cluster message when theres no con (`pr#32897 <https://github.com/ceph/ceph/pull/32897>`_, Sage Weil)
-* core: osd/PG: do not queue scrub if PG is not active when unblock (`issue#40451 <http://tracker.ceph.com/issues/40451>`_, `pr#28660 <https://github.com/ceph/ceph/pull/28660>`_, Sage Weil)
-* core: osd/PG: do not use approx_missing_objects pre-nautilus (`pr#27798 <https://github.com/ceph/ceph/pull/27798>`_, Neha Ojha)
-* core: osd/PG: fix cleanup of pgmeta-like objects on PG deletion; disallow empty object names (`pr#27929 <https://github.com/ceph/ceph/pull/27929>`_, Sage Weil)
-* core: osd/PG: fix last_complete re-calculation on splitting (`issue#26958 <http://tracker.ceph.com/issues/26958>`_, `pr#27702 <https://github.com/ceph/ceph/pull/27702>`_, xie xingguo)
-* core: osd/PG: fix _finish_recovery vs repair race (`pr#30059 <https://github.com/ceph/ceph/pull/30059>`_, xie xingguo)
-* core: osd/PG: introduce all_missing_unfound helper (`issue#38784 <http://tracker.ceph.com/issues/38784>`_, `issue#38931 <http://tracker.ceph.com/issues/38931>`_, `pr#27205 <https://github.com/ceph/ceph/pull/27205>`_, xie xingguo)
-* core: osd/PG: move down peers out from peer_purged (`issue#38931 <http://tracker.ceph.com/issues/38931>`_, `pr#27182 <https://github.com/ceph/ceph/pull/27182>`_, xie xingguo)
-* core: osd/PG: move } to the proper place (`pr#27204 <https://github.com/ceph/ceph/pull/27204>`_, xie xingguo)
-* core: osd/PG: remove unused code (`pr#30930 <https://github.com/ceph/ceph/pull/30930>`_, Jianpeng Ma)
-* core: osd/PG: restart peering for undersized PG on any down stray peer coming back (`pr#33106 <https://github.com/ceph/ceph/pull/33106>`_, xie xingguo, Yan Jun)
-* core: osd/PG: skip rollforward when !transaction_applied during append_log() (`issue#36739 <http://tracker.ceph.com/issues/36739>`_, `pr#26996 <https://github.com/ceph/ceph/pull/26996>`_, Neha Ojha)
-* core: osd/PG: the warning seems more serious than what it wanna transmit (`pr#27509 <https://github.com/ceph/ceph/pull/27509>`_, Zengran Zhang)
-* core: osd/PG: use emplace() to construct new element in-place (`pr#27124 <https://github.com/ceph/ceph/pull/27124>`_, Zengran Zhang)
-* core: osd/PGLog.h: print olog_can_rollback_to before deciding to rollback (`issue#38894 <http://tracker.ceph.com/issues/38894>`_, `issue#21174 <http://tracker.ceph.com/issues/21174>`_, `pr#27105 <https://github.com/ceph/ceph/pull/27105>`_, Neha Ojha)
-* core: osd/PGLog: persist num_objects_missing for replicas when peering is done (`pr#30466 <https://github.com/ceph/ceph/pull/30466>`_, xie xingguo)
-* core: osd/PGLog: preserve original_crt to check rollbackability (`issue#36739 <http://tracker.ceph.com/issues/36739>`_, `pr#27200 <https://github.com/ceph/ceph/pull/27200>`_, Neha Ojha)
-* core: osd/PGLog: reset log.complete_to when recover obect failed (`pr#30533 <https://github.com/ceph/ceph/pull/30533>`_, Tao Ning)
-* core: osd/PGStateUtils: initialize NamedState::enter_time (`pr#33813 <https://github.com/ceph/ceph/pull/33813>`_, Jianpeng Ma)
-* core: osd/PrimaryLogPG: always use strict priority ordering for kicked recovery ops (`pr#30632 <https://github.com/ceph/ceph/pull/30632>`_, xie xingguo)
-* core: osd/PrimaryLogPG: Avoid accessing destroyed references in finish_degr\xe2\x80\xa6 (`pr#29663 <https://github.com/ceph/ceph/pull/29663>`_, Tao Ning)
-* core: osd/PrimaryLogPG: cancel in-flight manifest ops on interval changing; fix race with scru (`pr#29985 <https://github.com/ceph/ceph/pull/29985>`_, xie xingguo)
-* core: osd/PrimaryLogPG: do_op - do not create head object twice (`pr#28785 <https://github.com/ceph/ceph/pull/28785>`_, xie xingguo)
-* core: osd/PrimaryLogPG: finish_copyfrom - dirty omap if necessary (`pr#29729 <https://github.com/ceph/ceph/pull/29729>`_, xie xingguo)
-* core: osd/PrimaryLogPG: fix dirty range of write_full (`pr#29726 <https://github.com/ceph/ceph/pull/29726>`_, xie xingguo)
-* core: osd/PrimaryLogPG: fix warning (`pr#30716 <https://github.com/ceph/ceph/pull/30716>`_, Sage Weil)
-* core: osd/PrimaryLogPG: include op_returns in dup replies (`pr#30640 <https://github.com/ceph/ceph/pull/30640>`_, Sage Weil)
-* core: osd/PrimaryLogPG: kill obsolete ondisk\\_{read,write}_lock comments (`pr#29719 <https://github.com/ceph/ceph/pull/29719>`_, xie xingguo)
-* core: osd/PrimaryLogPG: more constness (`pr#28786 <https://github.com/ceph/ceph/pull/28786>`_, Kefu Chai)
-* core: osd/PrimaryLogPG: remove unused parent pgls-filter (`pr#29675 <https://github.com/ceph/ceph/pull/29675>`_, Radoslaw Zarzynski, Kefu Chai)
-* core: osd/PrimaryLogPG: simple debug message (`pr#32444 <https://github.com/ceph/ceph/pull/32444>`_, Jianpeng Ma)
-* core: osd/PrimaryLogPG: skip obcs that dont exist during backfill scan_range (`pr#30715 <https://github.com/ceph/ceph/pull/30715>`_, Sage Weil)
-* core: osd/PrimaryLogPG: update oi.size on write op implicitly truncating object up (`pr#30085 <https://github.com/ceph/ceph/pull/30085>`_, xie xingguo)
-* core: osd/PrimaryLogPG: use legacy timestamp rendering for hit_set objects (`pr#33117 <https://github.com/ceph/ceph/pull/33117>`_, Sage Weil)
-* core: osd/ReplicatedBackend: check against empty data_included before enabling crc (`pr#29621 <https://github.com/ceph/ceph/pull/29621>`_, xie xingguo)
-* core: osd/scheduler/OpSchedulerItem: schedule backoffs as client ops (`pr#32382 <https://github.com/ceph/ceph/pull/32382>`_, Samuel Just)
-* core: osd/SnapMapper: remove pre-octopus snapmapper keys after conversion (`pr#30368 <https://github.com/ceph/ceph/pull/30368>`_, Sage Weil)
-* core: osd/SnapMirror: no need to record purged_snaps every epoch (`pr#31866 <https://github.com/ceph/ceph/pull/31866>`_, Sage Weil)
-* core: OSD: modify n.cookie to op.notify.cookie (`pr#29418 <https://github.com/ceph/ceph/pull/29418>`_, yangjun)
-* core: osdc/Objecter: always add `\\0 after strncpy() (`pr#27286 <https://github.com/ceph/ceph/pull/27286>`_, Kefu Chai)
-* core: osdc/Objecter: Boost.Asio (I object!) (`pr#16715 <https://github.com/ceph/ceph/pull/16715>`_, Adam C. Emerson)
-* core: osdc/Objecter: debug pause/unpause transition (`pr#32850 <https://github.com/ceph/ceph/pull/32850>`_, Sage Weil)
-* core: osdc/Objecter: fix OSDMap leak in handle_osd_map (`issue#20491 <http://tracker.ceph.com/issues/20491>`_, `pr#28242 <https://github.com/ceph/ceph/pull/28242>`_, Sage Weil)
-* core: osdc/Objecter: only pause if respects_full() (`pr#33020 <https://github.com/ceph/ceph/pull/33020>`_, Sage Weil)
-* core: osdc/Objecter: pg-mapping cache (`pr#28487 <https://github.com/ceph/ceph/pull/28487>`_, xie xingguo)
-* core: osdc/Objecter: _calc_target - inline spgid (`pr#28570 <https://github.com/ceph/ceph/pull/28570>`_, xie xingguo)
-* core: osdc: Fix a missing : for the correct namespace (`pr#29472 <https://github.com/ceph/ceph/pull/29472>`_, Willem Jan Withagen)
-* core: pybind/ceph_argparse: improve ceph -h syntax (`pr#30431 <https://github.com/ceph/ceph/pull/30431>`_, Sage Weil)
-* core: pybind/mgr/mgr_module: fix standby module logging options (`pr#33639 <https://github.com/ceph/ceph/pull/33639>`_, Sage Weil)
-* core: pybind/mgr/mgr_util: fix pretty time delta (`pr#33794 <https://github.com/ceph/ceph/pull/33794>`_, Sage Weil)
-* core: pybind/mgr/\\*: fix config_notify handling of default values (`pr#32755 <https://github.com/ceph/ceph/pull/32755>`_, Sage Weil)
-* core: qa/distros: add rhel/centos 8.1 (`pr#33026 <https://github.com/ceph/ceph/pull/33026>`_, Sage Weil)
-* core: qa/distros: centos 7.6; update centos and ubuntu latest symlinks (`pr#27349 <https://github.com/ceph/ceph/pull/27349>`_, Sage Weil)
-* core: qa/standalone/mon/osd-create-pool: fix utf-8 grep LANG (`pr#32711 <https://github.com/ceph/ceph/pull/32711>`_, Sage Weil)
-* core: qa/standalone/osd/divergent-priors: add reproducer for bug 41816 (`pr#30506 <https://github.com/ceph/ceph/pull/30506>`_, Sage Weil)
-* core: qa/standalone/osd/osd-bench: debug bluestore (`pr#32961 <https://github.com/ceph/ceph/pull/32961>`_, Sage Weil)
-* core: qa/standalone/osd/osd-markdown: fix dup command disabling (`issue#38359 <http://tracker.ceph.com/issues/38359>`_, `pr#27499 <https://github.com/ceph/ceph/pull/27499>`_, Sage Weil)
-* core: qa/standalone/scrub/osd-scrub-snaps: misc fixes for removed_snaps change (`issue#40725 <http://tracker.ceph.com/issues/40725>`_, `pr#29003 <https://github.com/ceph/ceph/pull/29003>`_, Sage Weil)
-* core: qa/standalone: python -> python3 (`pr#32383 <https://github.com/ceph/ceph/pull/32383>`_, Sage Weil)
-* core: qa/suites/rados/multimon/tasks/mon_clock_with_skews: disable ntpd etc (`pr#33184 <https://github.com/ceph/ceph/pull/33184>`_, Sage Weil)
-* core: qa/suites/rados/multimon: fix failures (`issue#40112 <http://tracker.ceph.com/issues/40112>`_, `pr#28353 <https://github.com/ceph/ceph/pull/28353>`_, Sage Weil)
-* core: qa/suites/rados/singleton-nomsgr/all/balancer: whitelist PG_AVAILABILITY (`pr#31747 <https://github.com/ceph/ceph/pull/31747>`_, Sage Weil)
-* core: qa/suites/rados/singleton/all/ec-lost-unfound: no rbd pool (`pr#30596 <https://github.com/ceph/ceph/pull/30596>`_, Sage Weil)
-* core: qa/suites/rados/thrash-old-clients: centos -> ubuntu (`pr#32356 <https://github.com/ceph/ceph/pull/32356>`_, Sage Weil)
-* core: qa/suites/rados/thrash-old-clients: skip TestClsRbd.mirror test (`pr#31745 <https://github.com/ceph/ceph/pull/31745>`_, Sage Weil)
-* core: qa/suites/rados/thrash: debug monc (`pr#32885 <https://github.com/ceph/ceph/pull/32885>`_, Sage Weil)
-* core: qa/suites/upgrade/nautilus-x: misc updates (`pr#27138 <https://github.com/ceph/ceph/pull/27138>`_, Sage Weil)
-* core: qa/suites/upgrade/\\*-x-singleton: enable bluestore debugging settings (`pr#27786 <https://github.com/ceph/ceph/pull/27786>`_, Sage Weil)
-* core: qa/suites/upgrade: all upgrades to octopus on ubuntu only (`pr#32275 <https://github.com/ceph/ceph/pull/32275>`_, Sage Weil)
-* core: qa/suits/rados/basic/tasks/rados_api_tests: pgs can go degraded (`pr#30627 <https://github.com/ceph/ceph/pull/30627>`_, Sage Weil)
-* core: qa/tasks/ceph2: teuthology task to bring up a ceph-daemon+ssh cluster (`pr#31502 <https://github.com/ceph/ceph/pull/31502>`_, Sage Weil)
-* core: qa/tasks/ceph: only re-request scrub on unscrubbed pgs (`pr#32988 <https://github.com/ceph/ceph/pull/32988>`_, Sage Weil)
-* core: qa/tasks/ceph_manager: fix thrash_pg_upmap_items when no pools (`pr#29144 <https://github.com/ceph/ceph/pull/29144>`_, Sage Weil)
-* core: qa/tasks/ceph_manager: make upmap thrasher behave when no pools/pgs (`pr#29069 <https://github.com/ceph/ceph/pull/29069>`_, Sage Weil)
-* core: qa/tasks/ceph_manager: remove race from all_active_or_peered() (`pr#29498 <https://github.com/ceph/ceph/pull/29498>`_, Sage Weil)
-* core: qa/tasks/ceph_manager: wait for clean before asserting clean on minsize test (`pr#29109 <https://github.com/ceph/ceph/pull/29109>`_, Sage Weil)
-* core: qa/workunits/rados/test_large_omap_detection: py3-ify (`pr#32405 <https://github.com/ceph/ceph/pull/32405>`_, Sage Weil)
-* core: qa: increase mon tell retries when injecting msgr failures (`pr#30872 <https://github.com/ceph/ceph/pull/30872>`_, Sage Weil)
-* core: qa: more fixes for the removed_snaps changeset (`issue#40674 <http://tracker.ceph.com/issues/40674>`_, `pr#28901 <https://github.com/ceph/ceph/pull/28901>`_, Sage Weil)
-* core: qa: run various tests on ubuntu (`pr#32278 <https://github.com/ceph/ceph/pull/32278>`_, Sage Weil)
-* core: rados bench: fix the delayed checking of completed ops (`pr#32928 <https://github.com/ceph/ceph/pull/32928>`_, Jianshen Liu)
-* core: Revert common: default pg_autoscale_mode=on for new pools (`pr#30440 <https://github.com/ceph/ceph/pull/30440>`_, David Zafman)
-* core: Revert crush: remove invalid upmap items (`pr#32017 <https://github.com/ceph/ceph/pull/32017>`_, David Zafman)
-* core: Revert Merge pull request #16715 from adamemerson/wip-I-Object! (`pr#31790 <https://github.com/ceph/ceph/pull/31790>`_, Sage Weil)
-* core: Revert test: librados startup/shutdown racer test (`pr#31092 <https://github.com/ceph/ceph/pull/31092>`_, Sage Weil)
-* core: rgw/rgw_tools: fix osd pool set json syntax (`pr#27967 <https://github.com/ceph/ceph/pull/27967>`_, Sage Weil)
-* core: rocksdb: enable rocksdb_rmrange=true by default (`pr#29323 <https://github.com/ceph/ceph/pull/29323>`_, Sage Weil)
-* core: rocksdb: Updated to v6.1.2 (`pr#29026 <https://github.com/ceph/ceph/pull/29026>`_, Mark Nelson)
-* core: sample.ceph.conf: correct the default value of filestore merge threshold (`pr#28653 <https://github.com/ceph/ceph/pull/28653>`_, zhang Shaowen)
-* core: selinux: Allow ceph to read udev d (`pr#29071 <https://github.com/ceph/ceph/pull/29071>`_, Boris Ranto)
-* core: src/: Clean up endian handling (`pr#30409 <https://github.com/ceph/ceph/pull/30409>`_, Ulrich Weigand)
-* core: src/dmclock: bring in fixes for indirect_intrusive_heap (`pr#32380 <https://github.com/ceph/ceph/pull/32380>`_, Samuel Just)
-* core: src/osd: add tier-flush op (`pr#28778 <https://github.com/ceph/ceph/pull/28778>`_, Myoungwon Oh)
-* core: test: add librados-based startup/shutdown racer test (`pr#30552 <https://github.com/ceph/ceph/pull/30552>`_, Jeff Layton)
-* core: tools/rados: call pool_lookup() after rados is connected (`pr#30413 <https://github.com/ceph/ceph/pull/30413>`_, Vikhyat Umrao)
-* core: tools/rados: prevent put operation from recreating object when --offset=0 (`pr#31230 <https://github.com/ceph/ceph/pull/31230>`_, Adam Kupczyk)
-* core: tools/rados: Unmask -o to restore original behaviour (`pr#31310 <https://github.com/ceph/ceph/pull/31310>`_, Brad Hubbard)
-* core: Wip lazy omap test (`pr#28070 <https://github.com/ceph/ceph/pull/28070>`_, Brad Hubbard)
-* crimon/osd: serve read requests (`pr#26697 <https://github.com/ceph/ceph/pull/26697>`_, Kefu Chai)
-* Crimson build fixes (`pr#33345 <https://github.com/ceph/ceph/pull/33345>`_, Samuel Just)
-* crimson, common: Add ephemeral ObjectContext state to crimson (`pr#31202 <https://github.com/ceph/ceph/pull/31202>`_, Samuel Just)
-* crimson,auth: fix FTBFS of crimson-osd and fix v1/v2 auth (`pr#27809 <https://github.com/ceph/ceph/pull/27809>`_, Kefu Chai, Yingxin Cheng)
-* crimson,osd: performance fixes (`pr#28071 <https://github.com/ceph/ceph/pull/28071>`_, Kefu Chai, Radoslaw Zarzynski)
-* crimson/common/errorator.h: add handle_error() method (`pr#31856 <https://github.com/ceph/ceph/pull/31856>`_, Radoslaw Zarzynski)
-* crimson/common/errorator.h: simplify the compound safe_then() variant (`pr#31918 <https://github.com/ceph/ceph/pull/31918>`_, Radoslaw Zarzynski)
-* crimson/common: more friendly to seastar::do_with() (`pr#33199 <https://github.com/ceph/ceph/pull/33199>`_, Kefu Chai)
-* crimson/common: remove unused file .#log.cc (`pr#28828 <https://github.com/ceph/ceph/pull/28828>`_, Changcheng Liu)
-* crimson/mon: fix the v1 auth (`pr#28041 <https://github.com/ceph/ceph/pull/28041>`_, Kefu Chai)
-* crimson/mon: use shared_future for waiting MauthReply (`pr#30366 <https://github.com/ceph/ceph/pull/30366>`_, chunmei Liu)
-* crimson/net: bug fixes from v2 failover tests (`pr#29882 <https://github.com/ceph/ceph/pull/29882>`_, Yingxin Cheng)
-* crimson/net: clean-up and fixes of messenger (`pr#29057 <https://github.com/ceph/ceph/pull/29057>`_, Yingxin Cheng)
-* crimson/net: extract do_write_dispatch_sweep() (`pr#27428 <https://github.com/ceph/ceph/pull/27428>`_, Yingxin Cheng)
-* crimson/net: implement preemptive shutdown/close (`pr#28682 <https://github.com/ceph/ceph/pull/28682>`_, Yingxin Cheng)
-* crimson/net: improve batching in the write path (`pr#27788 <https://github.com/ceph/ceph/pull/27788>`_, Yingxin Cheng)
-* crimson/net: lossless policy for v2 protocol (`pr#29378 <https://github.com/ceph/ceph/pull/29378>`_, Yingxin Cheng)
-* crimson/net: lossy connection for ProtocolV2 (`pr#26710 <https://github.com/ceph/ceph/pull/26710>`_, Yingxin Cheng)
-* crimson/net: misc fixes in v1 read path (`pr#27837 <https://github.com/ceph/ceph/pull/27837>`_, Yingxin Cheng)
-* crimson/net: prefer <fmt/chrono.h> over <fmt/time.h> (`pr#27831 <https://github.com/ceph/ceph/pull/27831>`_, Kefu Chai)
-* crimson/net: prevent reusing the sent messages (`pr#28890 <https://github.com/ceph/ceph/pull/28890>`_, Yingxin Cheng)
-* crimson/net: print tx/rx messages using logger().info() (`pr#28798 <https://github.com/ceph/ceph/pull/28798>`_, Kefu Chai)
-* crimson/net: remove redundant std::move() (`pr#28317 <https://github.com/ceph/ceph/pull/28317>`_, Kefu Chai)
-* crimson/net: v2 racing tests, stall tests and bug fixes (`pr#30313 <https://github.com/ceph/ceph/pull/30313>`_, Yingxin Cheng)
-* crimson/os: do not fail if fsid file exists when mkfs (`pr#27006 <https://github.com/ceph/ceph/pull/27006>`_, chunmei Liu, Kefu Chai)
-* crimson/os: init PG with pg coll not meta coll (`pr#33084 <https://github.com/ceph/ceph/pull/33084>`_, Kefu Chai)
-* crimson/os: Object::read() returns bufferlist instead of never used errcode (`pr#30380 <https://github.com/ceph/ceph/pull/30380>`_, Radoslaw Zarzynski)
-* crimson/osd/osd_operation.h: clean up duplicative check (`pr#31859 <https://github.com/ceph/ceph/pull/31859>`_, Radoslaw Zarzynski)
-* crimson/osd/pg: start_operation for read_state, schedule_event_on_commit (`pr#28771 <https://github.com/ceph/ceph/pull/28771>`_, Samuel Just)
-* crimson/osd/pg_meta: use initializer list for passing set<> (`pr#28461 <https://github.com/ceph/ceph/pull/28461>`_, Kefu Chai)
-* crimson/osd: abort on unsupported objectstore type (`pr#28790 <https://github.com/ceph/ceph/pull/28790>`_, Kefu Chai)
-* crimson/osd: add --help-seastar command line option (`pr#28794 <https://github.com/ceph/ceph/pull/28794>`_, Kefu Chai)
-* crimson/osd: add minimal state machine for PG peering (`pr#27071 <https://github.com/ceph/ceph/pull/27071>`_, Kefu Chai)
-* crimson/osd: add pgls support (`pr#30433 <https://github.com/ceph/ceph/pull/30433>`_, Kefu Chai)
-* crimson/osd: cache object_info and snapset in PGBackend (`pr#27310 <https://github.com/ceph/ceph/pull/27310>`_, Kefu Chai)
-* crimson/osd: call at_exit() before stopping the engine (`pr#27177 <https://github.com/ceph/ceph/pull/27177>`_, Kefu Chai)
-* crimson/osd: call engine().exit(0) after mkfs (`pr#27061 <https://github.com/ceph/ceph/pull/27061>`_, Kefu Chai)
-* crimson/osd: capture watcher when calling its member function (`pr#33425 <https://github.com/ceph/ceph/pull/33425>`_, Kefu Chai)
-* crimson/osd: cleanups (`pr#30736 <https://github.com/ceph/ceph/pull/30736>`_, Kefu Chai)
-* crimson/osd: consolidate the code to initialize msgrs (`pr#27426 <https://github.com/ceph/ceph/pull/27426>`_, Kefu Chai)
-* crimson/osd: create msgrs in main.cc (`pr#27066 <https://github.com/ceph/ceph/pull/27066>`_, Kefu Chai)
-* crimson/osd: crimson/osd: do not load fullmap.0 (`pr#27004 <https://github.com/ceph/ceph/pull/27004>`_, chunmei Liu, Kefu Chai)
-* crimson/osd: differentiate write from writefull (`pr#28959 <https://github.com/ceph/ceph/pull/28959>`_, Kefu Chai)
-* crimson/osd: do not add whoami as hb peer and cleanups (`pr#27307 <https://github.com/ceph/ceph/pull/27307>`_, Kefu Chai)
-* crimson/osd: extend OpsExecuter to carry about op effects (`pr#30310 <https://github.com/ceph/ceph/pull/30310>`_, Radoslaw Zarzynski)
-* crimson/osd: fix the build broken by df771861 (`pr#28053 <https://github.com/ceph/ceph/pull/28053>`_, chunmei Liu)
-* crimson/osd: fix the Clang build in create_watch_info() (`pr#33350 <https://github.com/ceph/ceph/pull/33350>`_, Radoslaw Zarzynski)
-* crimson/osd: implement replicated write (`pr#29076 <https://github.com/ceph/ceph/pull/29076>`_, Kefu Chai)
-* crimson/osd: init PG with more info (`pr#27064 <https://github.com/ceph/ceph/pull/27064>`_, Kefu Chai)
-* crimson/osd: lower debug level on i/o path (`pr#27338 <https://github.com/ceph/ceph/pull/27338>`_, Kefu Chai)
-* crimson/osd: misc fixes and cleanup (`pr#33528 <https://github.com/ceph/ceph/pull/33528>`_, Yingxin Cheng)
-* crimson/osd: misc fixes for OSD reboot-ability (`pr#33595 <https://github.com/ceph/ceph/pull/33595>`_, Yingxin Cheng)
-* crimson/osd: partition args the right way (`pr#27211 <https://github.com/ceph/ceph/pull/27211>`_, Kefu Chai)
-* crimson/osd: pass unknown args to ConfigProxy::parse_args() (`pr#27062 <https://github.com/ceph/ceph/pull/27062>`_, Kefu Chai)
-* crimson/osd: remove unneeded captures - pg.cc (`pr#33349 <https://github.com/ceph/ceph/pull/33349>`_, Ronen Friedman)
-* crimson/osd: report pg_stats to mgr (`pr#27065 <https://github.com/ceph/ceph/pull/27065>`_, Kefu Chai)
-* crimson/osd: should handle pg_lease messages (`pr#30834 <https://github.com/ceph/ceph/pull/30834>`_, Kefu Chai)
-* crimson/osd: shutdown services in the right order (`pr#27987 <https://github.com/ceph/ceph/pull/27987>`_, Kefu Chai)
-* crimson/osd: some cleanups (`pr#28402 <https://github.com/ceph/ceph/pull/28402>`_, Kefu Chai)
-* crimson/osd: support write pid_file when osd start (`pr#27413 <https://github.com/ceph/ceph/pull/27413>`_, chunmei Liu)
-* crimson/osd: update peering_state in PG::on_activate_complete() (`pr#28747 <https://github.com/ceph/ceph/pull/28747>`_, Kefu Chai)
-* crimson/osd: use single-pg peering ops (`pr#30372 <https://github.com/ceph/ceph/pull/30372>`_, Kefu Chai)
-* crimson/thread: generalize Task so it works w/ func returns void (`pr#32742 <https://github.com/ceph/ceph/pull/32742>`_, Kefu Chai)
-* crimson/{net,mon,osd}: misc logging changes (`pr#27099 <https://github.com/ceph/ceph/pull/27099>`_, Kefu Chai)
-* crimson/{osd,heartbeat}: allow heartbeat to have access to authorizer (`pr#27059 <https://github.com/ceph/ceph/pull/27059>`_, Kefu Chai)
-* crimson/{osd,mon}: lower log level when sending a replicated op (`pr#30957 <https://github.com/ceph/ceph/pull/30957>`_, Kefu Chai)
-* crimson: add editor properties header (`pr#33408 <https://github.com/ceph/ceph/pull/33408>`_, Kefu Chai)
-* crimson: add FuturizedStore to encapsulate CyanStore (`pr#28358 <https://github.com/ceph/ceph/pull/28358>`_, chunmei Liu)
-* crimson: add missing include in common/errorator.h (`pr#32490 <https://github.com/ceph/ceph/pull/32490>`_, Radoslaw Zarzynski)
-* crimson: add support for basic write path (`pr#27873 <https://github.com/ceph/ceph/pull/27873>`_, Radoslaw Zarzynski)
-* crimson: add support for watch / notify, part 1 (`pr#32679 <https://github.com/ceph/ceph/pull/32679>`_, Radoslaw Zarzynski)
-* crimson: bring ceph::errorator with its first appliances (`pr#30387 <https://github.com/ceph/ceph/pull/30387>`_, Radoslaw Zarzynski)
-* crimson: CLANG-related fixes to errorator.h (`pr#32488 <https://github.com/ceph/ceph/pull/32488>`_, Ronen Friedman, Radoslaw Zarzynski)
-* crimson: clean up and refactor asok (`pr#33357 <https://github.com/ceph/ceph/pull/33357>`_, Kefu Chai)
-* crimson: enable cephx for v2 msgr (`pr#27514 <https://github.com/ceph/ceph/pull/27514>`_, Kefu Chai)
-* crimson: fix build with GCC-10 (`pr#33233 <https://github.com/ceph/ceph/pull/33233>`_, Kefu Chai)
-* crimson: fix crimson pg coll usage error (`pr#33076 <https://github.com/ceph/ceph/pull/33076>`_, Chunmei Liu)
-* crimson: fix lambda captures of non-variables (`pr#32494 <https://github.com/ceph/ceph/pull/32494>`_, Ronen Friedman)
-* crimson: futurized CyanStores member functions and Collection (`pr#29470 <https://github.com/ceph/ceph/pull/29470>`_, Kefu Chai, chunmei Liu)
-* crimson: handle MOSDPGQuery2 properly (`pr#30399 <https://github.com/ceph/ceph/pull/30399>`_, Kefu Chai)
-* crimson: make seastar::do_with() a friend of errorated futures (`pr#32175 <https://github.com/ceph/ceph/pull/32175>`_, Radoslaw Zarzynski)
-* crimson: move dummy impl of AuthServer to DummyAuth (`pr#27452 <https://github.com/ceph/ceph/pull/27452>`_, Kefu Chai)
-* crimson: move os/cyan\\_\\* down to os/cyanstore/\\* (`pr#31874 <https://github.com/ceph/ceph/pull/31874>`_, Kefu Chai)
-* crimson: pass `Connection\\*` to Dispatch::ms_dispatch() (`pr#27690 <https://github.com/ceph/ceph/pull/27690>`_, Yingxin Cheng, Kefu Chai)
-* crimson: pickup change to fix --cpuset support and cleanups (`pr#33250 <https://github.com/ceph/ceph/pull/33250>`_, Kefu Chai)
-* crimson: remove some attributes from lambda (`pr#32604 <https://github.com/ceph/ceph/pull/32604>`_, Ronen Friedman)
-* crimson: run in foreground if possible, silence warnings (`pr#30474 <https://github.com/ceph/ceph/pull/30474>`_, Samuel Just, Kefu Chai)
-* crimson: s/ceph/crimson/ in namespace names (`pr#31069 <https://github.com/ceph/ceph/pull/31069>`_, Kefu Chai)
-* crimson: serve basic RBD traffic coming from fio (`pr#30339 <https://github.com/ceph/ceph/pull/30339>`_, Radoslaw Zarzynski)
-* crimson: solve the problem that crimson-osd\s created pgs stuck in unknown state (`pr#33780 <https://github.com/ceph/ceph/pull/33780>`_, Xuehan Xu)
-* crimson: stop osd before stopping messengers (`pr#31904 <https://github.com/ceph/ceph/pull/31904>`_, Kefu Chai)
-* crimson: support pgnls and delete op (`pr#28079 <https://github.com/ceph/ceph/pull/28079>`_, Kefu Chai)
-* crimson: update osd when peer gets authenticated (`pr#27416 <https://github.com/ceph/ceph/pull/27416>`_, Kefu Chai)
-* crimson: use given osd_fsid when mkfs (`pr#28800 <https://github.com/ceph/ceph/pull/28800>`_, Kefu Chai)
-* crimson:: add alien blue store (`pr#31041 <https://github.com/ceph/ceph/pull/31041>`_, Samuel Just, Chunmei Liu, Kefu Chai)
-* crush: add root_bucket to identify underfull buckets (`issue#38826 <http://tracker.ceph.com/issues/38826>`_, `pr#27068 <https://github.com/ceph/ceph/pull/27068>`_, huangjun)
-* crush: remove invalid upmap items (`pr#31131 <https://github.com/ceph/ceph/pull/31131>`_, huangjun)
-* crush: remove invalid upmap items (`pr#32099 <https://github.com/ceph/ceph/pull/32099>`_, huangjun)
-* crush: various fixes for weight-sets, the osd_crush_update_weight_set option, and tests (`pr#26955 <https://github.com/ceph/ceph/pull/26955>`_, Sage Weil)
-* dashboard/services: fix lint error (`pr#30289 <https://github.com/ceph/ceph/pull/30289>`_, Willem Jan Withagen)
-* deb,rpm: switch to python 3 (`pr#32252 <https://github.com/ceph/ceph/pull/32252>`_, Sage Weil, Alfredo Deza)
-* debian: add python3-jsonpatch as dependency (`pr#33298 <https://github.com/ceph/ceph/pull/33298>`_, Sebastian Wagner)
-* denc: allow DencDumper to dump OOB buffer (`pr#27704 <https://github.com/ceph/ceph/pull/27704>`_, Kefu Chai)
-* doc/bootstrap: fixed default --keyring target (`pr#32643 <https://github.com/ceph/ceph/pull/32643>`_, Yaarit Hatuka)
-* doc/foundation: fix amihan (`pr#32999 <https://github.com/ceph/ceph/pull/32999>`_, Sage Weil)
-* doc: .organizationmap: Wido 42on -> 42on (`pr#32260 <https://github.com/ceph/ceph/pull/32260>`_, Sage Weil)
-* doc: add a deduplication document (`pr#28462 <https://github.com/ceph/ceph/pull/28462>`_, Myoungwon Oh)
-* doc: add a doc for vstart_runner.py (`pr#29907 <https://github.com/ceph/ceph/pull/29907>`_, Rishabh Dave)
-* doc: add a new document on distributed cephfs metadata cache (`pr#30265 <https://github.com/ceph/ceph/pull/30265>`_, Jeff Layton)
-* doc: Add a new document on Dynamic Metadata Management in CephFS (`pr#30348 <https://github.com/ceph/ceph/pull/30348>`_, Sidharth Anupkrishnan)
-* doc: Add a RGW swift auth note (`pr#31309 <https://github.com/ceph/ceph/pull/31309>`_, Matthew Oliver)
-* doc: add ceph fs volumes and subvolumes documentation (`pr#30381 <https://github.com/ceph/ceph/pull/30381>`_, Ramana Raja)
-* doc: add CephFS Octopus release notes (`pr#33450 <https://github.com/ceph/ceph/pull/33450>`_, Patrick Donnelly)
-* doc: add changelog for nautilus (`pr#27048 <https://github.com/ceph/ceph/pull/27048>`_, Abhishek Lekshmanan)
-* doc: add chrony to preflight checklist for Ubuntu 18.04 (`pr#31948 <https://github.com/ceph/ceph/pull/31948>`_, Zac Dover)
-* doc: add config help/get/set section for runtime client configuration (`issue#41688 <http://tracker.ceph.com/issues/41688>`_, `pr#32117 <https://github.com/ceph/ceph/pull/32117>`_, Venky Shankar)
-* doc: Add Dashboard Octopus release notes (`pr#33555 <https://github.com/ceph/ceph/pull/33555>`_, Lenz Grimmer)
-* doc: add description for fuse_disable_pagecache (`pr#31902 <https://github.com/ceph/ceph/pull/31902>`_, Yan, Zheng)
-* doc: add doc for blacklisting older CephFS clients (`issue#39130 <http://tracker.ceph.com/issues/39130>`_, `pr#27412 <https://github.com/ceph/ceph/pull/27412>`_, Patrick Donnelly)
-* doc: add doc for cephfs lazyio (`issue#38729 <http://tracker.ceph.com/issues/38729>`_, `pr#26976 <https://github.com/ceph/ceph/pull/26976>`_, Yan, Zheng)
-* doc: add guide for running tests with teuthology (`pr#32114 <https://github.com/ceph/ceph/pull/32114>`_, Rishabh Dave)
-* doc: add mds map to list of ceph monitor assets (`pr#32631 <https://github.com/ceph/ceph/pull/32631>`_, Zac Dover)
-* doc: add missed word than in doc/man/8/rbd.rst (`pr#31022 <https://github.com/ceph/ceph/pull/31022>`_, Drunkard Zhang)
-* doc: Add missing mgr cap for the bootstrap keyring (`pr#27201 <https://github.com/ceph/ceph/pull/27201>`_, Bryan Stillwell)
-* doc: add missing virtualenv for build-doc (`pr#31896 <https://github.com/ceph/ceph/pull/31896>`_, Rodrigo Severo)
-* doc: Add note to execute cephfs-shell (`pr#27369 <https://github.com/ceph/ceph/pull/27369>`_, Varsha Rao)
-* doc: add package for Golang (`issue#38730 <http://tracker.ceph.com/issues/38730>`_, `pr#26937 <https://github.com/ceph/ceph/pull/26937>`_, Irek Fasikhov)
-* doc: add Python 2 to Ubuntu 18.04 installations (`pr#31947 <https://github.com/ceph/ceph/pull/31947>`_, Zac Dover)
-* doc: add release notes for 13.2.5 mimic (`pr#26913 <https://github.com/ceph/ceph/pull/26913>`_, Abhishek Lekshmanan)
-* doc: add release notes for v13.2.6 mimic (`pr#28385 <https://github.com/ceph/ceph/pull/28385>`_, Abhishek Lekshmanan)
-* doc: Add sphinx_autodoc_typehints extension (`pr#33577 <https://github.com/ceph/ceph/pull/33577>`_, Sebastian Wagner)
-* doc: Add stat command usage in cephfs-shell (`pr#28236 <https://github.com/ceph/ceph/pull/28236>`_, Varsha Rao)
-* doc: Add usage for shortcuts command in cephfs-shell (`pr#27373 <https://github.com/ceph/ceph/pull/27373>`_, Varsha Rao)
-* doc: Add warning that the root directory cannot be fragmented (`pr#28354 <https://github.com/ceph/ceph/pull/28354>`_, Nathan Fish)
-* doc: Added a link to Ceph Community Calendar (`pr#31475 <https://github.com/ceph/ceph/pull/31475>`_, Zac Dover)
-* doc: added a remark to always use powers of two for pg_num (`pr#31541 <https://github.com/ceph/ceph/pull/31541>`_, Thomas Schneider)
-* doc: added an is where it was needed (`pr#32374 <https://github.com/ceph/ceph/pull/32374>`_, Zac Dover)
-* doc: Added dashboard features, improved wording (`pr#27997 <https://github.com/ceph/ceph/pull/27997>`_, Lenz Grimmer)
-* doc: added section on creating RESTful API user (`pr#26016 <https://github.com/ceph/ceph/pull/26016>`_, James McClune)
-* doc: Added the crisp getting started guide to index.rst (`pr#32531 <https://github.com/ceph/ceph/pull/32531>`_, Zac Dover)
-* doc: Adding US-Mid-West Mirror to docs (`pr#25099 <https://github.com/ceph/ceph/pull/25099>`_, Mike Perez)
-* doc: Adds cmake build options for optionally skipping few components (`pr#31066 <https://github.com/ceph/ceph/pull/31066>`_, Deepika Upadhyay)
-* doc: adjust for mon_status changes in octopus (`pr#33703 <https://github.com/ceph/ceph/pull/33703>`_, Nathan Cutler)
-* doc: admin,doc/_ext/ceph_releases.py: use yaml.safe_load() (`pr#28463 <https://github.com/ceph/ceph/pull/28463>`_, Kefu Chai)
-* doc: admin/build-doc: always install python3-\\* for build deps (`pr#32481 <https://github.com/ceph/ceph/pull/32481>`_, Kefu Chai)
-* doc: admin/build-doc: do not use system site-packages (`pr#32285 <https://github.com/ceph/ceph/pull/32285>`_, Sage Weil)
-* doc: admin/build-doc: Fix doxygen typo (`pr#32572 <https://github.com/ceph/ceph/pull/32572>`_, Varsha Rao)
-* doc: admin/build-doc: use python3 (`pr#29528 <https://github.com/ceph/ceph/pull/29528>`_, Kefu Chai)
-* doc: admin/doc-requirements.txt: bump up Sphinx and breathe (`pr#32301 <https://github.com/ceph/ceph/pull/32301>`_, Kefu Chai)
-* doc: admin/serve-doc: Switch to python3 only (`pr#33596 <https://github.com/ceph/ceph/pull/33596>`_, Brad Hubbard)
-* doc: always load resources via HTTPS (`pr#29544 <https://github.com/ceph/ceph/pull/29544>`_, Tiago Melo)
-* doc: ceph-monstore-tool: correct the key for storing mgr_command_descs (`pr#33172 <https://github.com/ceph/ceph/pull/33172>`_, Kefu Chai)
-* doc: cephfs: add section on fsync error reporting to posix.rst (`issue#24641 <http://tracker.ceph.com/issues/24641>`_, `pr#28300 <https://github.com/ceph/ceph/pull/28300>`_, Jeff Layton)
-* doc: change case from `apis` to `APIs` (`pr#33664 <https://github.com/ceph/ceph/pull/33664>`_, Deepika Upadhyay)
-* doc: clarify difference between fs and kcephfs suite (`pr#32144 <https://github.com/ceph/ceph/pull/32144>`_, Rishabh Dave)
-* doc: clarify priority use (`pr#32191 <https://github.com/ceph/ceph/pull/32191>`_, Yuri Weinstein)
-* doc: clarify support for rbd fancy striping (`pr#32176 <https://github.com/ceph/ceph/pull/32176>`_, Ilya Dryomov)
-* doc: cleanup CephFS Landing Page (`pr#30542 <https://github.com/ceph/ceph/pull/30542>`_, Milind Changire)
-* doc: coding-style: update a link and fix typos (`pr#33128 <https://github.com/ceph/ceph/pull/33128>`_, Ponnuvel Palaniyappan)
-* doc: common/admin_socket: Add doxygen for call and call_async (`pr#32547 <https://github.com/ceph/ceph/pull/32547>`_, Adam Kupczyk)
-* doc: common/hobject: Error invocation of formula in documentation (`pr#28366 <https://github.com/ceph/ceph/pull/28366>`_, Albert)
-* doc: config-ref: add a note on current scheduler settings (`pr#27243 <https://github.com/ceph/ceph/pull/27243>`_, Abhishek Lekshmanan)
-* doc: correct example to use vstart to run up cluster (`pr#26816 <https://github.com/ceph/ceph/pull/26816>`_, Changcheng Liu)
-* doc: cover more cache modes in rados/operations/cache-tiering.rst (`issue#14153 <http://tracker.ceph.com/issues/14153>`_, `pr#17614 <https://github.com/ceph/ceph/pull/17614>`_, Nathan Cutler)
-* doc: default values for mon_health_to_clog\\_\\* were flipped (`pr#29867 <https://github.com/ceph/ceph/pull/29867>`_, James McClune)
-* doc: describe metadata_heap cleanup (`issue#18174 <http://tracker.ceph.com/issues/18174>`_, `pr#26915 <https://github.com/ceph/ceph/pull/26915>`_, Dan van der Ster)
-* doc: Describe recovery and backfill prioritizations (`issue#39011 <http://tracker.ceph.com/issues/39011>`_, `pr#27941 <https://github.com/ceph/ceph/pull/27941>`_, David Zafman)
-* doc: doc : fixed capitalization (`pr#27379 <https://github.com/ceph/ceph/pull/27379>`_, Servesha Dudhgaonkar)
-* doc: doc, qa: remove invalid option mon_pg_warn_max_per_osd (`pr#30787 <https://github.com/ceph/ceph/pull/30787>`_, zhang daolong)
-* doc: doc,admin: fix the builtin search (`pr#33592 <https://github.com/ceph/ceph/pull/33592>`_, Kefu Chai)
-* doc: doc/architecture.rst: fix a typo in EC section (`pr#33241 <https://github.com/ceph/ceph/pull/33241>`_, Nag Pavan Chilakam)
-* doc: doc/bootstrap.rst: fix githus url (`pr#31086 <https://github.com/ceph/ceph/pull/31086>`_, Alexandre Bruyelles)
-* doc: doc/bootstrap: add mds and rgw steps to bootstrap (`pr#33088 <https://github.com/ceph/ceph/pull/33088>`_, Sage Weil)
-* doc: doc/ceph-fuse: describe -n option (`pr#30911 <https://github.com/ceph/ceph/pull/30911>`_, Rishabh Dave)
-* doc: doc/ceph-fuse: mention -k option in ceph-fuse man page (`pr#30561 <https://github.com/ceph/ceph/pull/30561>`_, Rishabh Dave)
-* doc: doc/ceph-kvstore-tool: add description for stats command (`pr#29990 <https://github.com/ceph/ceph/pull/29990>`_, Josh Durgin, Adam Kupczyk)
-* doc: doc/ceph-volume: initial docs for zfs/inventory and zfs/api (`pr#31252 <https://github.com/ceph/ceph/pull/31252>`_, Willem Jan Withagen)
-* doc: doc/cephadm/administration: clarify log gathering (`pr#33627 <https://github.com/ceph/ceph/pull/33627>`_, Nathan Cutler)
-* doc: doc/cephadm: adjust syntax for config set (`pr#33600 <https://github.com/ceph/ceph/pull/33600>`_, Joshua Schmid)
-* doc: doc/cephadm: big cleanup of cephadm docs (`pr#33981 <https://github.com/ceph/ceph/pull/33981>`_, Sage Weil)
-* doc: doc/cephadm: Troubleshooting (`pr#33460 <https://github.com/ceph/ceph/pull/33460>`_, Sebastian Wagner)
-* doc: doc/cephfs/client-auth: description and example are inconsistent (`pr#32762 <https://github.com/ceph/ceph/pull/32762>`_, Ilya Dryomov)
-* doc: doc/cephfs/disaster-recovery-experts: Add link for scrub and note for scrub_path (`pr#32124 <https://github.com/ceph/ceph/pull/32124>`_, Varsha Rao)
-* doc: doc/cephfs: add doc for cephfs io path (`pr#30369 <https://github.com/ceph/ceph/pull/30369>`_, Yan, Zheng)
-* doc: doc/cephfs: correct a description mistake about mds states (`issue#41893 <http://tracker.ceph.com/issues/41893>`_, `pr#30427 <https://github.com/ceph/ceph/pull/30427>`_, Xiao Guodong)
-* doc: doc/cephfs: improve add/remove MDS section (`issue#39620 <http://tracker.ceph.com/issues/39620>`_, `pr#28700 <https://github.com/ceph/ceph/pull/28700>`_, Patrick Donnelly)
-* doc: doc/cephfs: migrate best practices recommendations to relevant docs (`pr#32522 <https://github.com/ceph/ceph/pull/32522>`_, Rishabh Dave)
-* doc: doc/cleanup: drop repo-access.rst (`pr#32276 <https://github.com/ceph/ceph/pull/32276>`_, Nathan Cutler)
-* doc: doc/corpus: update to adapt the change from autotools to cmake (`pr#27552 <https://github.com/ceph/ceph/pull/27552>`_, Kefu Chai)
-* doc: doc/dev/corpus.rst: correct instructions (`pr#27741 <https://github.com/ceph/ceph/pull/27741>`_, Kefu Chai)
-* doc: doc/dev/corpus.rst: minor tweaks (`pr#28877 <https://github.com/ceph/ceph/pull/28877>`_, Kefu Chai)
-* doc: doc/dev/crimson.rst: document CBT testing (`pr#30290 <https://github.com/ceph/ceph/pull/30290>`_, Kefu Chai)
-* doc: doc/dev/crimson: transpose options of compare.py (`pr#30453 <https://github.com/ceph/ceph/pull/30453>`_, Kefu Chai)
-* doc: doc/dev/developer_guide/index.rst: add youtube reference for Getting Started (`pr#29712 <https://github.com/ceph/ceph/pull/29712>`_, Neha Ojha)
-* doc: doc/dev/developer_guide/index.rst: add youtube references (`pr#29033 <https://github.com/ceph/ceph/pull/29033>`_, Neha Ojha)
-* doc: doc/dev/developer_guide: fix heading level (`pr#30428 <https://github.com/ceph/ceph/pull/30428>`_, Nathan Cutler)
-* doc: doc/dev/developer_guide: remove web address (`pr#29183 <https://github.com/ceph/ceph/pull/29183>`_, gabriellasroman)
-* doc: doc/dev/kubernetes: Update (`pr#28081 <https://github.com/ceph/ceph/pull/28081>`_, Sebastian Wagner)
-* doc: doc/dev/osd_internals/async_recovery: update cost calculation (`pr#28036 <https://github.com/ceph/ceph/pull/28036>`_, Neha Ojha)
-* doc: doc/dev: add crimson.rst (`pr#28674 <https://github.com/ceph/ceph/pull/28674>`_, Kefu Chai)
-* doc: doc/dev: add teuthology priority recommendations (`pr#30308 <https://github.com/ceph/ceph/pull/30308>`_, Patrick Donnelly)
-* doc: doc/developer: fix dev mailing list address (`pr#32442 <https://github.com/ceph/ceph/pull/32442>`_, Willem Jan Withagen)
-* doc: doc/drivegroups: add docs for DriveGroups with excessive examples (`pr#33044 <https://github.com/ceph/ceph/pull/33044>`_, Joshua Schmid)
-* doc: doc/foundation: add ceph foundation info here (`pr#31955 <https://github.com/ceph/ceph/pull/31955>`_, Sage Weil)
-* doc: doc/foundation: add cloudbase and vexxhost (`pr#32013 <https://github.com/ceph/ceph/pull/32013>`_, Sage Weil)
-* doc: doc/foundation: add Samsung Electronics (`pr#33518 <https://github.com/ceph/ceph/pull/33518>`_, Sage Weil)
-* doc: doc/governance: add cbodey (`pr#27708 <https://github.com/ceph/ceph/pull/27708>`_, Sage Weil)
-* doc: doc/index: remove quick start from front page for now (`pr#33207 <https://github.com/ceph/ceph/pull/33207>`_, Sage Weil)
-* doc: doc/install/containers: add summary of containers and branches (`pr#31465 <https://github.com/ceph/ceph/pull/31465>`_, Sage Weil)
-* doc: doc/install/containers: note vX.Y.Z[-YYYYMMDD] tags (`pr#31975 <https://github.com/ceph/ceph/pull/31975>`_, Sage Weil)
-* doc: doc/install/manual-deployment: Change owner to ceph for the keyring file (`pr#31452 <https://github.com/ceph/ceph/pull/31452>`_, Jeffrey Chu)
-* doc: doc/install/upgrading-ceph: systemctl in Ubuntu instructions (`pr#32595 <https://github.com/ceph/ceph/pull/32595>`_, Rodrigo Severo)
-* doc: doc/install: rethink install doc installation methods order (`pr#33890 <https://github.com/ceph/ceph/pull/33890>`_, Zac Dover, Sebastian Wagner)
-* doc: doc/man/ceph: document ceph config (`pr#30645 <https://github.com/ceph/ceph/pull/30645>`_, Kefu Chai)
-* doc: doc/man: improve bluefs-bdev-expand option (`pr#32590 <https://github.com/ceph/ceph/pull/32590>`_, Kefu Chai)
-* doc: doc/mgr/ansible.rst: fix typo (`pr#28827 <https://github.com/ceph/ceph/pull/28827>`_, Lan Liu)
-* doc: doc/mgr/cephadm: document adoption process (`pr#33459 <https://github.com/ceph/ceph/pull/33459>`_, Sage Weil)
-* doc: doc/mgr/orchestrator.rst: updated current implementation status (`pr#33410 <https://github.com/ceph/ceph/pull/33410>`_, Kai Wagner)
-* doc: doc/mgr/orchestrator: Add Cephfs (`pr#33574 <https://github.com/ceph/ceph/pull/33574>`_, Sebastian Wagner)
-* doc: doc/mgr/orchestrator_cli: Rook orch supports mon update (`issue#39137 <http://tracker.ceph.com/issues/39137>`_, `pr#27431 <https://github.com/ceph/ceph/pull/27431>`_, Sebastian Wagner)
-* doc: doc/mgr/telemetry: added device channel details (`pr#33113 <https://github.com/ceph/ceph/pull/33113>`_, Yaarit Hatuka)
-* doc: doc/mgr/telemetry: update default interval (`pr#31008 <https://github.com/ceph/ceph/pull/31008>`_, Tim Serong)
-* doc: doc/mgr: Enhance placement specs (`pr#33924 <https://github.com/ceph/ceph/pull/33924>`_, Sebastian Wagner)
-* doc: doc/orchestrator: Fix broken bullet points (`issue#39094 <http://tracker.ceph.com/issues/39094>`_, `pr#27121 <https://github.com/ceph/ceph/pull/27121>`_, Sebastian Wagner)
-* doc: doc/orchestrator: Fix various issues in Orchestrator CLI documentation (`pr#31353 <https://github.com/ceph/ceph/pull/31353>`_, Volker Theile)
-* doc: doc/orchestrator: Sync status with reality (`pr#30281 <https://github.com/ceph/ceph/pull/30281>`_, Sebastian Wagner)
-* doc: doc/orchestrator: update rgw creation (`pr#33540 <https://github.com/ceph/ceph/pull/33540>`_, Yehuda Sadeh)
-* doc: doc/rados/api/python: Add documentation for mon_command (`pr#26934 <https://github.com/ceph/ceph/pull/26934>`_, Sebastian Wagner)
-* doc: doc/rados/configuration/osd-config-ref.rst: document osd_delete_sleep (`pr#28775 <https://github.com/ceph/ceph/pull/28775>`_, Neha Ojha)
-* doc: doc/rados/configuration: fix typo in mon-lookup-dns (`pr#27362 <https://github.com/ceph/ceph/pull/27362>`_, Vanush Misha Paturyan)
-* doc: doc/rados/configuration: fix typos in osd-config-ref.rst (`pr#28805 <https://github.com/ceph/ceph/pull/28805>`_, Lan Liu)
-* doc: doc/rados/configuration: update to be in sync with ConfUtils changes (`pr#28753 <https://github.com/ceph/ceph/pull/28753>`_, Kefu Chai)
-* doc: doc/rados/deployment/ceph-deploy-mon: fix typo (`pr#31164 <https://github.com/ceph/ceph/pull/31164>`_, Kefu Chai)
-* doc: doc/rados/operations/crush-map-edits: recompile and set instructions (`pr#32451 <https://github.com/ceph/ceph/pull/32451>`_, Rodrigo Severo)
-* doc: doc/rados/operations/devices: document device failure prediction (`pr#27472 <https://github.com/ceph/ceph/pull/27472>`_, Sage Weil)
-* doc: doc/rados/operations/erasure-code.rst: allow recovery below min_size (`pr#28750 <https://github.com/ceph/ceph/pull/28750>`_, Greg Farnum, Neha Ojha)
-* doc: doc/rados/operations: add safe-to-destroy check to OSD replacement workflow (`pr#28491 <https://github.com/ceph/ceph/pull/28491>`_, Sage Weil)
-* doc: doc/rados/operations: crush_rule is a name (`pr#29367 <https://github.com/ceph/ceph/pull/29367>`_, Kefu Chai)
-* doc: doc/rados/operations: document BLUEFS_SPILLOVER (`pr#27316 <https://github.com/ceph/ceph/pull/27316>`_, Sage Weil)
-* doc: doc/rados/operations: min_size is applicable to EC (`pr#33543 <https://github.com/ceph/ceph/pull/33543>`_, Brad Hubbard)
-* doc: doc/rados/operations: OSD_OUT_OF_ORDER_FULL fullness order is wrong (`pr#31588 <https://github.com/ceph/ceph/pull/31588>`_, Tsung-Ju Lii)
-* doc: doc/rados: Better block.db size recommendations for bluestore (`pr#32226 <https://github.com/ceph/ceph/pull/32226>`_, Neha Ojha)
-* doc: doc/rados: Correcting some typos in the clay code documentation (`pr#29889 <https://github.com/ceph/ceph/pull/29889>`_, Myna)
-* doc: doc/rados: update osd_min_pg_log_entries and add osd_max_pg_log_entries (`pr#32790 <https://github.com/ceph/ceph/pull/32790>`_, Neha Ojha)
-* doc: doc/radosgw/admin:fix how to modify subuser info (`pr#29839 <https://github.com/ceph/ceph/pull/29839>`_, Feng Hualong)
-* doc: doc/radosgw/compression.rst: fix typo (`pr#28749 <https://github.com/ceph/ceph/pull/28749>`_, hydro-)
-* doc: doc/radosgw/config-ref: paragraph to explain the gc settings (`pr#32367 <https://github.com/ceph/ceph/pull/32367>`_, Kai Wagner)
-* doc: doc/radosgw/multisite-sync-policy.rst: fix typo (`pr#33230 <https://github.com/ceph/ceph/pull/33230>`_, Liu Lan)
-* doc: doc/radosgw: fix typos (`pr#30642 <https://github.com/ceph/ceph/pull/30642>`_, Liu Lan)
-* doc: doc/radosgw: update documentation examples with the current S3 PHP client (`pr#25985 <https://github.com/ceph/ceph/pull/25985>`_, Laurent VOULLEMIER)
-* doc: doc/rbd/rbd-cloudstack: update disk offering URL to new docs (`pr#27713 <https://github.com/ceph/ceph/pull/27713>`_, Kefu Chai)
-* doc: doc/rbd: document the new snapshot-based mirroring feature (`pr#33561 <https://github.com/ceph/ceph/pull/33561>`_, Jason Dillaman)
-* doc: doc/rbd: fix small typos (`pr#33689 <https://github.com/ceph/ceph/pull/33689>`_, songweibin)
-* doc: doc/rbd: initial kubernetes / ceph-csi integration documentation (`pr#29429 <https://github.com/ceph/ceph/pull/29429>`_, Jason Dillaman)
-* doc: doc/rbd: re-organize top-level and add live-migration docs (`issue#40486 <http://tracker.ceph.com/issues/40486>`_, `pr#29135 <https://github.com/ceph/ceph/pull/29135>`_, Jason Dillaman)
-* doc: doc/rbd: refine rbd/libvirt usage (`pr#32273 <https://github.com/ceph/ceph/pull/32273>`_, Changcheng Liu)
-* doc: doc/rbd: s/guess/xml/ for codeblock lexer (`pr#30953 <https://github.com/ceph/ceph/pull/30953>`_, Kefu Chai)
-* doc: doc/rbd: simplify libvirt usage (`pr#32142 <https://github.com/ceph/ceph/pull/32142>`_, Changcheng Liu)
-* doc: doc/rbd: update krbd version support for RBD features (`issue#40802 <http://tracker.ceph.com/issues/40802>`_, `pr#29083 <https://github.com/ceph/ceph/pull/29083>`_, Jason Dillaman)
-* doc: doc/release/nautilus: 14.2.2 changes redone (`pr#29145 <https://github.com/ceph/ceph/pull/29145>`_, Sage Weil)
-* doc: doc/release/octopus: note about upgrade times (`pr#33401 <https://github.com/ceph/ceph/pull/33401>`_, Sage Weil)
-* doc: doc/releases/nautilus,PendingReleaseNotes: consolidate telemetry note (`pr#32160 <https://github.com/ceph/ceph/pull/32160>`_, Sage Weil)
-* doc: doc/releases/nautilus.rst: fix command to check min_compat_client (`pr#28526 <https://github.com/ceph/ceph/pull/28526>`_, Osama Elswah)
-* doc: doc/releases/nautilus.rst: remove a redundant \\* (`pr#32577 <https://github.com/ceph/ceph/pull/32577>`_, Servesha Dudhgaonkar)
-* doc: doc/releases/nautilus: Correct a systemctl command in an upgrade guide (`pr#27773 <https://github.com/ceph/ceph/pull/27773>`_, Teeranai Kormongkolkul)
-* doc: doc/releases/nautilus: final notes for v14.2.0 (`pr#27019 <https://github.com/ceph/ceph/pull/27019>`_, Sage Weil)
-* doc: doc/releases/nautilus: fix config update step (`pr#27495 <https://github.com/ceph/ceph/pull/27495>`_, Sage Weil)
-* doc: doc/releases/nautilus: fix release notes (crash->device) (`pr#32148 <https://github.com/ceph/ceph/pull/32148>`_, Sage Weil)
-* doc: doc/releases/octopus.rst: add note about ec recovery below min_size (`pr#34092 <https://github.com/ceph/ceph/pull/34092>`_, Neha Ojha)
-* doc: doc/releases/octopus.rst: format tweaks (`pr#33971 <https://github.com/ceph/ceph/pull/33971>`_, Kefu Chai)
-* doc: doc/releases/octopus.rst: formatting tweaks (`pr#33987 <https://github.com/ceph/ceph/pull/33987>`_, Kefu Chai)
-* doc: doc/releases/octopus: add additional RBD improvements (`pr#34032 <https://github.com/ceph/ceph/pull/34032>`_, Jason Dillaman)
-* doc: doc/releases/schedule.rst: add 14.2.3, 14.2.4, 15.0.0 and drop dumpling (`pr#30430 <https://github.com/ceph/ceph/pull/30430>`_, Nathan Cutler)
-* doc: doc/releases: access main releases page from top-level TOC (`pr#30598 <https://github.com/ceph/ceph/pull/30598>`_, Nathan Cutler)
-* doc: doc/releases: add 14.2.8 to release timeline (`pr#33721 <https://github.com/ceph/ceph/pull/33721>`_, Nathan Cutler)
-* doc: doc/releases: add mimic v13.2.7 to releases timeline (`pr#31872 <https://github.com/ceph/ceph/pull/31872>`_, Nathan Cutler)
-* doc: doc/releases: add release notes for mimic v13.2.7 (`pr#31777 <https://github.com/ceph/ceph/pull/31777>`_, Nathan Cutler)
-* doc: doc/releases: add release notes for mimic v13.2.8 (`pr#32040 <https://github.com/ceph/ceph/pull/32040>`_, Nathan Cutler)
-* doc: doc/releases: add release notes for nautilus v14.2.5 (`pr#31970 <https://github.com/ceph/ceph/pull/31970>`_, Nathan Cutler)
-* doc: doc/releases: Ceph Nautilus v14.2.4 Release Notes (`pr#30429 <https://github.com/ceph/ceph/pull/30429>`_, Nathan Cutler)
-* doc: doc/releases: octopus draft notes (`pr#33043 <https://github.com/ceph/ceph/pull/33043>`_, Sage Weil)
-* doc: doc/releases: Octopus is not stable yet (`pr#33729 <https://github.com/ceph/ceph/pull/33729>`_, Nathan Cutler)
-* doc: doc/releases: update for 12 month cycle (`pr#28864 <https://github.com/ceph/ceph/pull/28864>`_, Sage Weil)
-* doc: doc/rgw: add design doc for multisite resharding (`pr#33539 <https://github.com/ceph/ceph/pull/33539>`_, Casey Bodley)
-* doc: doc/rgw: document CreateBucketConfiguration for s3 PUT Bucket api (`issue#39597 <http://tracker.ceph.com/issues/39597>`_, `pr#27977 <https://github.com/ceph/ceph/pull/27977>`_, Casey Bodley)
-* doc: doc/rgw: document use of realm pull instead of period pull (`issue#39655 <http://tracker.ceph.com/issues/39655>`_, `pr#28052 <https://github.com/ceph/ceph/pull/28052>`_, Casey Bodley)
-* doc: doc/rgw: fix broken link to boto s3 extensions document (`pr#32740 <https://github.com/ceph/ceph/pull/32740>`_, Casey Bodley)
-* doc: doc/rgw: update civetweb rgw_frontends config example (`pr#27054 <https://github.com/ceph/ceph/pull/27054>`_, Casey Bodley)
-* doc: doc/start/documenting-ceph.rst: make better doc recommendations (`pr#30273 <https://github.com/ceph/ceph/pull/30273>`_, Neha Ojha)
-* doc: doc/start/hardware-recommendations.rst: minor tweaks (`pr#30837 <https://github.com/ceph/ceph/pull/30837>`_, Amrita Sakthivel)
-* doc: doc/_templates/page.html: redirect to etherpad (`pr#32197 <https://github.com/ceph/ceph/pull/32197>`_, Neha Ojha)
-* doc: Doc: Add Nautilus 14.2.2 to schedule and releases (`issue#40988 <http://tracker.ceph.com/issues/40988>`_, `pr#29362 <https://github.com/ceph/ceph/pull/29362>`_, JuanJose Galvez)
-* doc: Doc: update release schedule (`pr#28466 <https://github.com/ceph/ceph/pull/28466>`_, Torben H\xc3\xb8rup)
-* doc: docs: fix rgw_ldap_dnattr username token (`pr#27964 <https://github.com/ceph/ceph/pull/27964>`_, Thomas Kriechbaumer)
-* doc: docs: improve rgw ldap auth options (`pr#28157 <https://github.com/ceph/ceph/pull/28157>`_, Thomas Kriechbaumer)
-* doc: docs: rgw: fix bucket operation spelling: ListBucketMultipartUploads (`pr#28885 <https://github.com/ceph/ceph/pull/28885>`_, Thomas Kriechbaumer)
-* doc: docs: Update au.ceph.com maintainers, update README.md (`pr#32814 <https://github.com/ceph/ceph/pull/32814>`_, Matthew Taylor)
-* doc: Document Export Process during Subtree Migrations (`pr#30751 <https://github.com/ceph/ceph/pull/30751>`_, Sidharth Anupkrishnan)
-* doc: document mds journal event types (`issue#42190 <http://tracker.ceph.com/issues/42190>`_, `pr#30749 <https://github.com/ceph/ceph/pull/30749>`_, Venky Shankar)
-* doc: document mds journaling (`issue#41783 <http://tracker.ceph.com/issues/41783>`_, `pr#30396 <https://github.com/ceph/ceph/pull/30396>`_, Venky Shankar)
-* doc: document mode param for rbd mirror image enable command (`pr#32735 <https://github.com/ceph/ceph/pull/32735>`_, Mykola Golub)
-* doc: document rank option for journal reset (`pr#31201 <https://github.com/ceph/ceph/pull/31201>`_, Patrick Donnelly)
-* doc: document the new --addv argument (`issue#40568 <http://tracker.ceph.com/issues/40568>`_, `pr#28819 <https://github.com/ceph/ceph/pull/28819>`_, Luca Castoro)
-* doc: Documentation: Add missing ceph-volume lvm batch argument to ceph-volume.rst (`pr#29081 <https://github.com/ceph/ceph/pull/29081>`_, Andreas Krebs)
-* doc: Documentation: Centos ceph-deploys python dependencies (`pr#32591 <https://github.com/ceph/ceph/pull/32591>`_, Cl\xc3\xa9ment Hampa\xc3\xaf)
-* doc: documentation: Updated Dashboard Features, improved flow (`pr#33919 <https://github.com/ceph/ceph/pull/33919>`_, Lenz Grimmer)
-* doc: drop and update troubleshooting (`pr#28900 <https://github.com/ceph/ceph/pull/28900>`_, Jos Collin)
-* doc: emphasize the importance of require-osd-release nautilus (`pr#32587 <https://github.com/ceph/ceph/pull/32587>`_, Zac Dover)
-* doc: fix a typo in a command (`pr#32230 <https://github.com/ceph/ceph/pull/32230>`_, taeuk_kim)
-* doc: Fix a typo in balancer documentation (`pr#30210 <https://github.com/ceph/ceph/pull/30210>`_, Francois Deppierraz)
-* doc: fix boot transition in mds state diagram (`pr#27685 <https://github.com/ceph/ceph/pull/27685>`_, Patrick Donnelly)
-* doc: fix errors in search page and use relative address for releases.json (`pr#33423 <https://github.com/ceph/ceph/pull/33423>`_, Kefu Chai)
-* doc: Fix for new ceph-devel mailing list (`pr#29492 <https://github.com/ceph/ceph/pull/29492>`_, David Zafman)
-* doc: Fix FUSE expansion (`pr#30473 <https://github.com/ceph/ceph/pull/30473>`_, Sidharth Anupkrishnan)
-* doc: fix Getting Started with CephFS (`pr#32457 <https://github.com/ceph/ceph/pull/32457>`_, Jos Collin)
-* doc: fix links in developer_guide (`pr#32728 <https://github.com/ceph/ceph/pull/32728>`_, Rishabh Dave)
-* doc: fix LRC documentation (`pr#27106 <https://github.com/ceph/ceph/pull/27106>`_, Danny Al-Gaaf)
-* doc: fix parameter to set pg autoscale mode (`pr#27422 <https://github.com/ceph/ceph/pull/27422>`_, Changcheng Liu)
-* doc: Fix rbd namespace documentation (`pr#29445 <https://github.com/ceph/ceph/pull/29445>`_, Ricardo Marques)
-* doc: Fix the pg states and auto repair config options (`issue#38896 <http://tracker.ceph.com/issues/38896>`_, `pr#27143 <https://github.com/ceph/ceph/pull/27143>`_, David Zafman)
-* doc: fix typo (`pr#28888 <https://github.com/ceph/ceph/pull/28888>`_, Jos Collin)
-* doc: fix typo in doc/radosgw/layout.rst (`pr#29932 <https://github.com/ceph/ceph/pull/29932>`_, ypdai)
-* doc: fix typo to auto scale pg number (`pr#31065 <https://github.com/ceph/ceph/pull/31065>`_, Changcheng Liu)
-* doc: fix typos (`pr#30583 <https://github.com/ceph/ceph/pull/30583>`_, Michael Prokop)
-* doc: fix urls (`pr#29300 <https://github.com/ceph/ceph/pull/29300>`_, Jos Collin)
-* doc: fixed --read-only argument value in multisite doc (`pr#28655 <https://github.com/ceph/ceph/pull/28655>`_, Chenjiong Deng)
-* doc: fixed broken link in Swift Settings section (`pr#28774 <https://github.com/ceph/ceph/pull/28774>`_, James McClune)
-* doc: fixed broken links in nautilus release page (`pr#28074 <https://github.com/ceph/ceph/pull/28074>`_, James McClune)
-* doc: fixed broken reference link for Graphviz (`pr#32021 <https://github.com/ceph/ceph/pull/32021>`_, James McClune)
-* doc: fixed caps (`pr#27397 <https://github.com/ceph/ceph/pull/27397>`_, Servesha Dudhgaonkar)
-* doc: fixed telemetry module reference link (`pr#27624 <https://github.com/ceph/ceph/pull/27624>`_, James McClune)
-* doc: fixed typo in leadership names (`pr#27396 <https://github.com/ceph/ceph/pull/27396>`_, Servesha Dudhgaonkar)
-* doc: Fixes OSD node labels which based on the osd_devices name (`pr#23312 <https://github.com/ceph/ceph/pull/23312>`_, Siyu Sun)
-* doc: Fixes typo for ceph dashboard command (`pr#30292 <https://github.com/ceph/ceph/pull/30292>`_, Fabian Bonk)
-* doc: hide page contents for Ceph Internals (`pr#31046 <https://github.com/ceph/ceph/pull/31046>`_, Milind Changire)
-* doc: improve ceph-backport.sh comment block (`pr#28042 <https://github.com/ceph/ceph/pull/28042>`_, Nathan Cutler)
-* doc: improve developer guide doc (`pr#30435 <https://github.com/ceph/ceph/pull/30435>`_, Rishabh Dave)
-* doc: improve in mount.ceph man page (`pr#31024 <https://github.com/ceph/ceph/pull/31024>`_, Rishabh Dave)
-* doc: Improved the dashboard proxy config section (`pr#27581 <https://github.com/ceph/ceph/pull/27581>`_, Lenz Grimmer)
-* doc: indicate imperative mood for commit titles (`pr#29509 <https://github.com/ceph/ceph/pull/29509>`_, Patrick Donnelly)
-* doc: Make ceph-dashboard require grafana dashboards (`pr#28997 <https://github.com/ceph/ceph/pull/28997>`_, Boris Ranto)
-* doc: mds-config-ref: update mds_log_max_segments value (`pr#29412 <https://github.com/ceph/ceph/pull/29412>`_, Konstantin Shalygin)
-* doc: mention --namespace option in rados manpage (`pr#31871 <https://github.com/ceph/ceph/pull/31871>`_, Nathan Cutler)
-* doc: mgr/dashboard: Add frontend code documentation (`issue#36243 <http://tracker.ceph.com/issues/36243>`_, `pr#27433 <https://github.com/ceph/ceph/pull/27433>`_, Ernesto Puerta)
-* doc: mgr/dashboard: Document UiApiController with ApiController usage (`pr#29819 <https://github.com/ceph/ceph/pull/29819>`_, Stephan M\xc3\xbcller)
-* doc: mgr/dashboard: Extend Writing End-to-End Tests section (describe vs it) (`pr#29707 <https://github.com/ceph/ceph/pull/29707>`_, Adam King, Rafael Quintero)
-* doc: mgr/dashboard: fix hacking.rst (`pr#27222 <https://github.com/ceph/ceph/pull/27222>`_, Ernesto Puerta)
-* doc: mgr/dashboard: Fix link format to HACKING.rst (`pr#28897 <https://github.com/ceph/ceph/pull/28897>`_, Ernesto Puerta)
-* doc: mgr/dashboard: fix typos in HACKING.rst (`pr#30847 <https://github.com/ceph/ceph/pull/30847>`_, Ernesto Puerta)
-* doc: mgr/orchestrator: Add error handling to interface (`pr#26404 <https://github.com/ceph/ceph/pull/26404>`_, Sebastian Wagner)
-* doc: mgr/orchestrator: Fix disabling the orchestrator (`issue#40779 <http://tracker.ceph.com/issues/40779>`_, `pr#29042 <https://github.com/ceph/ceph/pull/29042>`_, Sebastian Wagner)
-* doc: mgr/orchestrator_cli: Update doc link in README (`pr#31731 <https://github.com/ceph/ceph/pull/31731>`_, Varsha Rao)
-* doc: mgr/ssh: HACKING.rst: Add Understanding `AsyncCompletion` (`pr#31967 <https://github.com/ceph/ceph/pull/31967>`_, Sebastian Wagner)
-* doc: mgr/ssh: update ssh-orch bootstrap guide (Vagrantfile & docs) (`pr#31457 <https://github.com/ceph/ceph/pull/31457>`_, Joshua Schmid)
-* doc: mgr/telemetry: force --license when sending while opted-out (`pr#33747 <https://github.com/ceph/ceph/pull/33747>`_, Yaarit Hatuka)
-* doc: minor fix in mount.ceph (`pr#32748 <https://github.com/ceph/ceph/pull/32748>`_, Rishabh Dave)
-* doc: Miscellaneous spelling fixes (`pr#27202 <https://github.com/ceph/ceph/pull/27202>`_, Bryan Stillwell)
-* doc: Modify nature theme (`pr#32312 <https://github.com/ceph/ceph/pull/32312>`_, Brad Hubbard)
-* doc: mon/OSDMonitor: Fix pool set target_size_bytes (etc) with unit suffix (`pr#30701 <https://github.com/ceph/ceph/pull/30701>`_, Prashant D)
-* doc: mounting CephFS subdirectory and Persistent Mounts cleanup (`pr#32498 <https://github.com/ceph/ceph/pull/32498>`_, Jos Collin)
-* doc: Move ceph-deploy docs to doc/install/ceph-deploy (`pr#33953 <https://github.com/ceph/ceph/pull/33953>`_, Sebastian Wagner)
-* doc: move cephadm files to its own directory (`pr#33551 <https://github.com/ceph/ceph/pull/33551>`_, Alexandra Settle, Sebastian Wagner)
-* doc: move Developer Guide to its own subdirectory (`pr#27159 <https://github.com/ceph/ceph/pull/27159>`_, Nathan Cutler)
-* doc: nautilus 14.2.2 release notes, take three (`pr#29171 <https://github.com/ceph/ceph/pull/29171>`_, Nathan Cutler)
-* doc: Nautilus mailmaps (`pr#27092 <https://github.com/ceph/ceph/pull/27092>`_, Abhishek Lekshmanan)
-* doc: note explicitly that profile rbd allows blacklisting (`pr#28296 <https://github.com/ceph/ceph/pull/28296>`_, Matthew Vernon)
-* doc: obsolete entries for allow_standby_replay (`pr#31897 <https://github.com/ceph/ceph/pull/31897>`_, Rodrigo Severo)
-* doc: operations: correct comma-delimited (`pr#29644 <https://github.com/ceph/ceph/pull/29644>`_, Anthony DAtri)
-* doc: operations: improve reweight-by-utilization (`pr#27657 <https://github.com/ceph/ceph/pull/27657>`_, Anthony DAtri)
-* doc: PendingReleaseNotes: 14.2.1 note on crush required version (`pr#27649 <https://github.com/ceph/ceph/pull/27649>`_, Sage Weil)
-* doc: PendingReleaseNotes: fix typo (`pr#31853 <https://github.com/ceph/ceph/pull/31853>`_, Sage Weil)
-* doc: PendingReleaseNotes: note on python3.6 changes (`issue#39164 <http://tracker.ceph.com/issues/39164>`_, `pr#27490 <https://github.com/ceph/ceph/pull/27490>`_, Kefu Chai)
-* doc: pg_num should always be a power of two (`pr#29364 <https://github.com/ceph/ceph/pull/29364>`_, Lars Marowsky-Bree, Kai Wagner)
-* doc: QAT Acceleration for Encryption and Compression (`pr#26967 <https://github.com/ceph/ceph/pull/26967>`_, Qiaowei Ren)
-* doc: quick-rbd.rst de-duplicate (`pr#32965 <https://github.com/ceph/ceph/pull/32965>`_, Tim)
-* doc: RBD exclusive locks (`pr#31893 <https://github.com/ceph/ceph/pull/31893>`_, Florian Haas)
-* doc: README.md: remove stale cmake prerequisite (`pr#32751 <https://github.com/ceph/ceph/pull/32751>`_, Kefu Chai)
-* doc: release note: Add pending release notes for already merged code (`pr#32041 <https://github.com/ceph/ceph/pull/32041>`_, David Zafman)
-* doc: release notes for 14.2.1 (`pr#27793 <https://github.com/ceph/ceph/pull/27793>`_, Abhishek Lekshmanan)
-* doc: release notes for Luminous v12.2.13 (`pr#33030 <https://github.com/ceph/ceph/pull/33030>`_, Nathan Cutler)
-* doc: release notes for nautilus 14.2.2 (`pr#29011 <https://github.com/ceph/ceph/pull/29011>`_, Sage Weil, Nathan Cutler)
-* doc: release notes for Nautilus 14.2.7 (`pr#33031 <https://github.com/ceph/ceph/pull/33031>`_, Nathan Cutler)
-* doc: release notes for v14.2.3 nautilus (`pr#29973 <https://github.com/ceph/ceph/pull/29973>`_, Abhishek Lekshmanan)
-* doc: release notes for v14.2.6 (`pr#32551 <https://github.com/ceph/ceph/pull/32551>`_, Abhishek Lekshmanan)
-* doc: releases/luminous: release notes for 12.2.12 (`pr#27553 <https://github.com/ceph/ceph/pull/27553>`_, Abhishek Lekshmanan)
-* doc: releases: 14.2.3 dashboard note (`pr#30145 <https://github.com/ceph/ceph/pull/30145>`_, Abhishek Lekshmanan)
-* doc: releases: v14.2.8 release notes (`pr#33670 <https://github.com/ceph/ceph/pull/33670>`_, Abhishek Lekshmanan)
-* doc: relicense LGPL-2.1 code as LGPL-2.1 or LGPL-3.0 (`pr#22446 <https://github.com/ceph/ceph/pull/22446>`_, Sage Weil)
-* doc: remove prod cluster examples from hardware recs (`pr#32670 <https://github.com/ceph/ceph/pull/32670>`_, Zac Dover)
-* doc: remove recommendation for kernel.pid_max (`pr#27965 <https://github.com/ceph/ceph/pull/27965>`_, Ben England)
-* doc: remove reference to obsolete scrub command (`pr#32508 <https://github.com/ceph/ceph/pull/32508>`_, Patrick Donnelly)
-* doc: remove the CephFS-Hadoop instructions (`pr#32980 <https://github.com/ceph/ceph/pull/32980>`_, Greg Farnum)
-* doc: removed OpenStack Kilo references in Keystone docs (`pr#27203 <https://github.com/ceph/ceph/pull/27203>`_, James McClune)
-* doc: removes kube-helm installation instructions (`pr#32009 <https://github.com/ceph/ceph/pull/32009>`_, Zac Dover)
-* doc: reorganize CephFS landing page and ToC (`pr#32038 <https://github.com/ceph/ceph/pull/32038>`_, Patrick Donnelly)
-* doc: Revert doc: do not add suffix for search result links (`pr#33562 <https://github.com/ceph/ceph/pull/33562>`_, Jason Dillaman)
-* doc: rgw/pubsub: add S3 compliant API to master zone (`pr#28971 <https://github.com/ceph/ceph/pull/28971>`_, Yuval Lifshitz)
-* doc: rgw/pubsub: clarify pubsub zone configuration (`pr#27493 <https://github.com/ceph/ceph/pull/27493>`_, Yuval Lifshitz)
-* doc: rgw/pubsub: fix topic arn. tenant support to multisite tests (`pr#27671 <https://github.com/ceph/ceph/pull/27671>`_, Yuval Lifshitz)
-* doc: rgw: Fixed bug on wrong name for user_id for OPA (`pr#31972 <https://github.com/ceph/ceph/pull/31972>`_, Seena Fallah)
-* doc: s/achieve/achieves/ (Fixed a verb disagreement) (`pr#32036 <https://github.com/ceph/ceph/pull/32036>`_, Zac Dover)
-* doc: script/ceph-backport.sh: add Troubleshooting notes (`pr#29948 <https://github.com/ceph/ceph/pull/29948>`_, Nathan Cutler)
-* doc: set ceph_perf_msgr_server arguments (`pr#29847 <https://github.com/ceph/ceph/pull/29847>`_, Changcheng Liu)
-* doc: show how to count jobs before triggering them (`pr#32145 <https://github.com/ceph/ceph/pull/32145>`_, Rishabh Dave)
-* doc: Show Jenkins commands (`pr#29423 <https://github.com/ceph/ceph/pull/29423>`_, Ernesto Puerta)
-* doc: Small update of SubmittingPatches-backports (`pr#31163 <https://github.com/ceph/ceph/pull/31163>`_, Laura Paduano)
-* doc: split up SubmittingPatches.rst (`issue#20953 <http://tracker.ceph.com/issues/20953>`_, `pr#30705 <https://github.com/ceph/ceph/pull/30705>`_, Nathan Cutler)
-* doc: Switch spelling of utilization (`pr#32537 <https://github.com/ceph/ceph/pull/32537>`_, Bryan Stillwell)
-* doc: tools/rados: add --pgid in help (`pr#30383 <https://github.com/ceph/ceph/pull/30383>`_, Vikhyat Umrao)
-* doc: typo fix in doc/dev/dev_cluster_deployement.rst: s/hostanme/hostname/ (`pr#31515 <https://github.com/ceph/ceph/pull/31515>`_, Drunkard Zhang)
-* doc: update --force flag to be precise (`pr#32343 <https://github.com/ceph/ceph/pull/32343>`_, Jos Collin)
-* doc: update adding an MDS (`pr#32291 <https://github.com/ceph/ceph/pull/32291>`_, Jos Collin)
-* doc: update and improve mounting with fuse/kernel docs (`pr#30754 <https://github.com/ceph/ceph/pull/30754>`_, Rishabh Dave)
-* doc: update bluestore cache settings and clarify data fraction (`issue#39522 <http://tracker.ceph.com/issues/39522>`_, `pr#27859 <https://github.com/ceph/ceph/pull/27859>`_, Jan Fajerski)
-* doc: update ceph ansible iscsi info (`pr#28665 <https://github.com/ceph/ceph/pull/28665>`_, Mike Christie)
-* doc: Update ceph-deploy docs from dumpling to nautilus (`pr#30269 <https://github.com/ceph/ceph/pull/30269>`_, Danny Abukalam)
-* doc: Update ceph-iscsi min version (`pr#29195 <https://github.com/ceph/ceph/pull/29195>`_, Ricardo Marques)
-* doc: update CephFS overview in introductory page (`pr#30014 <https://github.com/ceph/ceph/pull/30014>`_, Patrick Donnelly)
-* doc: update CephFS Quick Start doc (`pr#30406 <https://github.com/ceph/ceph/pull/30406>`_, Rishabh Dave)
-* doc: Update commands in bootstrap.rst (`pr#31800 <https://github.com/ceph/ceph/pull/31800>`_, Zac Dover)
-* doc: update default container images (`pr#33974 <https://github.com/ceph/ceph/pull/33974>`_, Sage Weil)
-* doc: Update documentation for LazyIO methods lazyio_synchronize() and lazyio_propagate() (`pr#29711 <https://github.com/ceph/ceph/pull/29711>`_, Sidharth Anupkrishnan)
-* doc: update documentation for the MANY_OBJECTS_PER_PG warning (`pr#27403 <https://github.com/ceph/ceph/pull/27403>`_, Vangelis Tasoulas)
-* doc: update documents on using kcephfs (`pr#30626 <https://github.com/ceph/ceph/pull/30626>`_, Jeff Layton)
-* doc: update erasure-code-profile.rst (`pr#33707 <https://github.com/ceph/ceph/pull/33707>`_, Guillaume Abrioux)
-* doc: Update link to Red Hat documentation (`pr#27976 <https://github.com/ceph/ceph/pull/27976>`_, Yaniv Kaul)
-* doc: update list of formats for --format flag for ceph pg dump (`pr#32373 <https://github.com/ceph/ceph/pull/32373>`_, Zac Dover)
-* doc: Update mailing lists (`pr#31666 <https://github.com/ceph/ceph/pull/31666>`_, hrchu)
-* doc: update mondb recovery script (`pr#28515 <https://github.com/ceph/ceph/pull/28515>`_, Hannes von Haugwitz)
-* doc: Update mount CephFS index (`pr#28955 <https://github.com/ceph/ceph/pull/28955>`_, Jos Collin)
-* doc: Update python-rtsli and tcmu-runner min versions (`pr#28494 <https://github.com/ceph/ceph/pull/28494>`_, Ricardo Marques)
-* doc: Update requirements for using CephFS (`pr#30251 <https://github.com/ceph/ceph/pull/30251>`_, Varsha Rao)
-* doc: update with osd addition (`pr#31244 <https://github.com/ceph/ceph/pull/31244>`_, Changcheng Liu)
-* doc: update with zone bucket and straw2 addition (`pr#31177 <https://github.com/ceph/ceph/pull/31177>`_, Changcheng Liu)
-* doc: update Zabbix template reference (`pr#33661 <https://github.com/ceph/ceph/pull/33661>`_, Mathijs Smit)
-* doc: updated ceph monitor config options (`pr#29982 <https://github.com/ceph/ceph/pull/29982>`_, James McClune)
-* doc: Updated dashboard iSCSI configuration, added labels (`pr#27074 <https://github.com/ceph/ceph/pull/27074>`_, Lenz Grimmer)
-* doc: updated OpenStack rbd documentation (`pr#28979 <https://github.com/ceph/ceph/pull/28979>`_, James McClune)
-* doc: updated OS recommendations and distro list (`pr#28643 <https://github.com/ceph/ceph/pull/28643>`_, Kai Wagner)
-* doc: Updates link to Sepia la (`pr#28780 <https://github.com/ceph/ceph/pull/28780>`_, Varsha Rao)
-* doc: use subsection for representing components in release notes (`pr#33940 <https://github.com/ceph/ceph/pull/33940>`_, Kefu Chai)
-* doc: use the console lexer for rendering command line sessions (`pr#32141 <https://github.com/ceph/ceph/pull/32141>`_, Kefu Chai)
-* do_cmake.sh: fedora-32 (rawhide) build with python-3.8 (`pr#32474 <https://github.com/ceph/ceph/pull/32474>`_, Kaleb S. Keithley)
-* errorator: improve general error handlers (`pr#33344 <https://github.com/ceph/ceph/pull/33344>`_, Samuel Just)
-* github/codeowners: Add orchestrator team (`pr#31441 <https://github.com/ceph/ceph/pull/31441>`_, Sebastian Wagner)
-* github: Add ceph-volume to list of jenkins commands (`pr#31191 <https://github.com/ceph/ceph/pull/31191>`_, Sebastian Wagner)
-* include/config-h.in.cmake: remove HAVE_XIO (`pr#28465 <https://github.com/ceph/ceph/pull/28465>`_, Kefu Chai)
-* include/utime: do not cast sec to time_t (`pr#27861 <https://github.com/ceph/ceph/pull/27861>`_, Kefu Chai)
-* include: buffer_raw.h: Copyright time fix (`pr#28481 <https://github.com/ceph/ceph/pull/28481>`_, Changcheng Liu)
-* install-deps.sh: remove failing error catching (`pr#29403 <https://github.com/ceph/ceph/pull/29403>`_, Ernesto Puerta)
-* Integrate PeeringState into crimson, fix related bugs (`pr#28180 <https://github.com/ceph/ceph/pull/28180>`_, Samuel Just)
-* krbd: do away with explicit memory management and other cleanups (`pr#31919 <https://github.com/ceph/ceph/pull/31919>`_, Ilya Dryomov)
-* librados: allow passing flags to operate sync APIs (`pr#33536 <https://github.com/ceph/ceph/pull/33536>`_, Yuval Lifshitz)
-* librados: fix leak in getxattr and getxattrs (`pr#32183 <https://github.com/ceph/ceph/pull/32183>`_, Adam Kupczyk)
-* librados: move buffer free functions to inline namespace (`issue#39972 <http://tracker.ceph.com/issues/39972>`_, `pr#28167 <https://github.com/ceph/ceph/pull/28167>`_, Jason Dillaman)
-* librados: prefer reinterpret_cast over c-style cast (`pr#33038 <https://github.com/ceph/ceph/pull/33038>`_, Kefu Chai)
-* librbd: add reference counting (`pr#30397 <https://github.com/ceph/ceph/pull/30397>`_, Mahati Chamarthy, Venky Shankar)
-* librbd: add snap_get_name and snap_get_id method API (`pr#31280 <https://github.com/ceph/ceph/pull/31280>`_, Zheng Yin)
-* librbd: added missing <string> include to PoolMetadata header (`pr#32614 <https://github.com/ceph/ceph/pull/32614>`_, Kaleb S. Keithley)
-* librbd: adjust the else-if conditions in validate_striping() (`pr#30053 <https://github.com/ceph/ceph/pull/30053>`_, mxdInspur)
-* librbd: always initialize local variables (`pr#31311 <https://github.com/ceph/ceph/pull/31311>`_, Kefu Chai)
-* librbd: always try to acquire exclusive lock when removing image (`pr#29775 <https://github.com/ceph/ceph/pull/29775>`_, Mykola Golub)
-* librbd: async open/close should free ImageCtx before issuing callback (`issue#39031 <http://tracker.ceph.com/issues/39031>`_, `pr#27682 <https://github.com/ceph/ceph/pull/27682>`_, Jason Dillaman)
-* librbd: avoid dereferencing an empty container during deep-copy (`issue#40368 <http://tracker.ceph.com/issues/40368>`_, `pr#28559 <https://github.com/ceph/ceph/pull/28559>`_, Jason Dillaman)
-* librbd: behave more gracefully when data pool removed (`pr#29613 <https://github.com/ceph/ceph/pull/29613>`_, Mykola Golub)
-* librbd: bump minor version to match octopus (`pr#32402 <https://github.com/ceph/ceph/pull/32402>`_, Jason Dillaman)
-* librbd: clean up unused variable (`pr#30019 <https://github.com/ceph/ceph/pull/30019>`_, mxdInspur)
-* librbd: clone copy-on-write operations should preserve sparseness (`pr#27999 <https://github.com/ceph/ceph/pull/27999>`_, Mykola Golub)
-* librbd: copyup read stats were incorrectly tied to child (`pr#27757 <https://github.com/ceph/ceph/pull/27757>`_, Jason Dillaman)
-* librbd: defer event socket completion until after callback issued (`pr#33994 <https://github.com/ceph/ceph/pull/33994>`_, Jason Dillaman)
-* librbd: diff iterate with fast-diff now correctly includes parent (`pr#32403 <https://github.com/ceph/ceph/pull/32403>`_, Jason Dillaman)
-* librbd: disable zero-copy writes by default (`pr#31794 <https://github.com/ceph/ceph/pull/31794>`_, Jason Dillaman)
-* librbd: dispatch delayed requests only if read intersects (`pr#27446 <https://github.com/ceph/ceph/pull/27446>`_, Mykola Golub)
-* librbd: do not allow to deep copy migrating image (`pr#27194 <https://github.com/ceph/ceph/pull/27194>`_, Mykola Golub)
-* librbd: do not unblock IO prior to growing object map during resize (`issue#39952 <http://tracker.ceph.com/issues/39952>`_, `pr#28295 <https://github.com/ceph/ceph/pull/28295>`_, Jason Dillaman)
-* librbd: dont call refresh from mirror::GetInfoRequest state machine (`pr#32734 <https://github.com/ceph/ceph/pull/32734>`_, Mykola Golub)
-* librbd: dont use complete_external_callback if ImageCtx destroyed (`pr#29263 <https://github.com/ceph/ceph/pull/29263>`_, Mykola Golub)
-* librbd: explicitly specify mode on mirror image enable (`pr#32217 <https://github.com/ceph/ceph/pull/32217>`_, Mykola Golub)
-* librbd: features converting bitmask and string API (`pr#31188 <https://github.com/ceph/ceph/pull/31188>`_, Zheng Yin)
-* librbd: finish write request early (`pr#32113 <https://github.com/ceph/ceph/pull/32113>`_, Li, Xiaoyan)
-* librbd: fix broken group snapshot handling (`pr#33448 <https://github.com/ceph/ceph/pull/33448>`_, Jason Dillaman)
-* librbd: fix build on freebsd (`pr#32938 <https://github.com/ceph/ceph/pull/32938>`_, Mykola Golub)
-* librbd: fix issues with object-map/fast-diff feature interlock (`issue#39521 <http://tracker.ceph.com/issues/39521>`_, `pr#28051 <https://github.com/ceph/ceph/pull/28051>`_, Jason Dillaman)
-* librbd: fix potential race conditions (`pr#33563 <https://github.com/ceph/ceph/pull/33563>`_, Mahati Chamarthy)
-* librbd: fix potential snapshot remove failure due to duplicate RPC messages (`pr#32760 <https://github.com/ceph/ceph/pull/32760>`_, Mykola Golub)
-* librbd: fix rbd_features_to_string output (`pr#31006 <https://github.com/ceph/ceph/pull/31006>`_, Zheng Yin)
-* librbd: fix rbd_open_by_id, rbd_open_by_id_read_only (`pr#32105 <https://github.com/ceph/ceph/pull/32105>`_, yangjun)
-* librbd: fix some edge cases for snapshot mirror mode promote (`pr#32567 <https://github.com/ceph/ceph/pull/32567>`_, Mykola Golub)
-* librbd: fix typo in deep_copy::ObjectCopyRequest::compute_read_ops (`pr#27049 <https://github.com/ceph/ceph/pull/27049>`_, Mykola Golub)
-* librbd: fixed several race conditions related to copyup (`issue#39021 <http://tracker.ceph.com/issues/39021>`_, `pr#27357 <https://github.com/ceph/ceph/pull/27357>`_, Jason Dillaman)
-* librbd: force reacquire lock if blacklist is disabled (`pr#30955 <https://github.com/ceph/ceph/pull/30955>`_, luo.runbing)
-* librbd: implement ordering for overlapping IOs (`pr#28952 <https://github.com/ceph/ceph/pull/28952>`_, Mahati Chamarthy)
-* librbd: improve journal performance to match expected degradation (`issue#40072 <http://tracker.ceph.com/issues/40072>`_, `pr#28539 <https://github.com/ceph/ceph/pull/28539>`_, Jason Dillaman)
-* librbd: improved support for balanced and localized reads (`pr#33493 <https://github.com/ceph/ceph/pull/33493>`_, Zheng Yin)
-* librbd: initial consolidation of internal locks (`pr#27756 <https://github.com/ceph/ceph/pull/27756>`_, Jason Dillaman)
-* librbd: introduce new default write-around cache policy (`pr#27229 <https://github.com/ceph/ceph/pull/27229>`_, Jason Dillaman)
-* librbd: leak on canceling simple io scheduler timer task (`pr#27755 <https://github.com/ceph/ceph/pull/27755>`_, Mykola Golub)
-* librbd: look for mirror peers in default namespace (`pr#32338 <https://github.com/ceph/ceph/pull/32338>`_, Mykola Golub)
-* librbd: look for pool metadata in default namespace (`pr#27151 <https://github.com/ceph/ceph/pull/27151>`_, Mykola Golub)
-* librbd: make flush be queued by QOS throttler (`pr#26931 <https://github.com/ceph/ceph/pull/26931>`_, Mykola Golub)
-* librbd: mirror image enable/disable should enable/disable journaling (`pr#28553 <https://github.com/ceph/ceph/pull/28553>`_, Mykola Golub)
-* librbd: optimize image copy state machine to use fast-diff (`pr#33867 <https://github.com/ceph/ceph/pull/33867>`_, Jason Dillaman)
-* librbd: optionally move parent image to trash on remove (`pr#27521 <https://github.com/ceph/ceph/pull/27521>`_, Mykola Golub)
-* librbd: prevent concurrent AIO callbacks to external clients (`issue#40417 <http://tracker.ceph.com/issues/40417>`_, `pr#28743 <https://github.com/ceph/ceph/pull/28743>`_, Jason Dillaman)
-* librbd: Remove duplicated AsyncOpTracker in librbd/Utils.h (`pr#29653 <https://github.com/ceph/ceph/pull/29653>`_, Xiaoyan Li)
-* librbd: remove pool objects when removing a namespace (`pr#32401 <https://github.com/ceph/ceph/pull/32401>`_, Jason Dillaman)
-* librbd: shared read-only cache hook (`pr#27285 <https://github.com/ceph/ceph/pull/27285>`_, Dehao Shang, Yuan Zhou)
-* librbd: silence -Wunused-variable warnings (`pr#27513 <https://github.com/ceph/ceph/pull/27513>`_, David Disseldorp)
-* librbd: simple scheduler plugin for object dispatcher layer (`pr#26675 <https://github.com/ceph/ceph/pull/26675>`_, Mykola Golub)
-* librbd: snapshot object maps can go inconsistent during copyup (`issue#39435 <http://tracker.ceph.com/issues/39435>`_, `pr#27724 <https://github.com/ceph/ceph/pull/27724>`_, Ilya Dryomov)
-* librbd: support compression allocation hints to the OSD (`pr#32687 <https://github.com/ceph/ceph/pull/32687>`_, Jason Dillaman)
-* librbd: support EC data pool images sparsify (`pr#27268 <https://github.com/ceph/ceph/pull/27268>`_, Mykola Golub)
-* librbd: support zero-copy writes via the C API (`pr#27895 <https://github.com/ceph/ceph/pull/27895>`_, Jason Dillaman)
-* librbd: trash move return EBUSY instead of EINVAL for migrating image (`pr#27136 <https://github.com/ceph/ceph/pull/27136>`_, Mykola Golub)
-* librbd: tweak deep-copy to avoid creating last snapshot until sync is complete (`pr#33097 <https://github.com/ceph/ceph/pull/33097>`_, Jason Dillaman)
-* librbd: tweaks to increase IOPS and reduce CPU usage (`pr#28044 <https://github.com/ceph/ceph/pull/28044>`_, Jason Dillaman)
-* librbd: use custom allocator for aligned boost::lockfree::queue (`issue#39703 <http://tracker.ceph.com/issues/39703>`_, `pr#28093 <https://github.com/ceph/ceph/pull/28093>`_, Jason Dillaman)
-* librbd: v1 clones are restricted to the same namespace (`pr#30711 <https://github.com/ceph/ceph/pull/30711>`_, Jason Dillaman)
-* librbd: when unlinking peer from mirror snaps do it in all namespaces (`pr#32463 <https://github.com/ceph/ceph/pull/32463>`_, Mykola Golub)
-* librbd:move all snapshot API functions in internal.cc over to api/Snapshot.cc (`pr#31589 <https://github.com/ceph/ceph/pull/31589>`_, Zheng Yin)
-* log: avoid logging anything when log_to_file=false (`pr#27133 <https://github.com/ceph/ceph/pull/27133>`_, Sage Weil)
-* log: fix store_statfs log line (`pr#28564 <https://github.com/ceph/ceph/pull/28564>`_, Mohamad Gebai)
-* log: just return if t is empty (`pr#31243 <https://github.com/ceph/ceph/pull/31243>`_, Xiubo Li)
-* log: print pthread ID / name mapping in recent events dump (`pr#32354 <https://github.com/ceph/ceph/pull/32354>`_, Radoslaw Zarzynski)
-* lvm deactivate command (`pr#32179 <https://github.com/ceph/ceph/pull/32179>`_, Jan Fajerski)
-* mds: add command that config individual client session (`issue#40811 <http://tracker.ceph.com/issues/40811>`_, `pr#29104 <https://github.com/ceph/ceph/pull/29104>`_, Yan, Zheng)
-* mds: add config to require forward to auth MDS (`pr#29995 <https://github.com/ceph/ceph/pull/29995>`_, simon gao)
-* mds: add configurable snapshot limit (`pr#30710 <https://github.com/ceph/ceph/pull/30710>`_, Milind Changire)
-* mds: add perf counter for finisher of MDSRank (`pr#29377 <https://github.com/ceph/ceph/pull/29377>`_, simon gao)
-* mds: add perf counters for openfiletable (`pr#33363 <https://github.com/ceph/ceph/pull/33363>`_, Milind Changire)
-* mds: add scrub_info_t into mempool (`pr#33180 <https://github.com/ceph/ceph/pull/33180>`_, Jun Su)
-* mds: answering all pending getattr/lookups targeting the same inode in one go (`issue#36608 <http://tracker.ceph.com/issues/36608>`_, `pr#24794 <https://github.com/ceph/ceph/pull/24794>`_, Patrick Donnelly, Xuehan Xu)
-* mds: apply configuration changes through MDSRank (`pr#28951 <https://github.com/ceph/ceph/pull/28951>`_, Patrick Donnelly)
-* mds: async dir operation support (`pr#27866 <https://github.com/ceph/ceph/pull/27866>`_, Yan, Zheng)
-* mds: async dirop support (`pr#32816 <https://github.com/ceph/ceph/pull/32816>`_, Yan, Zheng)
-* mds: avoid check session connections features when issuing caps (`pr#26881 <https://github.com/ceph/ceph/pull/26881>`_, Yan, Zheng)
-* mds: avoid revoking Fsx from loner during directory fragmentation (`pr#26817 <https://github.com/ceph/ceph/pull/26817>`_, Yan, Zheng)
-* mds: avoid sending too many osd requests at once after mds restarts (`issue#40028 <http://tracker.ceph.com/issues/40028>`_, `pr#27436 <https://github.com/ceph/ceph/pull/27436>`_, simon gao)
-* mds: better output of ceph health detail when some client is failing to advance oldest client/flush tid (`issue#39266 <http://tracker.ceph.com/issues/39266>`_, `pr#27537 <https://github.com/ceph/ceph/pull/27537>`_, Shen Hang)
-* mds: check dir fragment to split dir if mkdir makes it oversized (`pr#27480 <https://github.com/ceph/ceph/pull/27480>`_, Erqi Chen)
-* mds: check directory split after rename (`issue#38994 <http://tracker.ceph.com/issues/38994>`_, `pr#27214 <https://github.com/ceph/ceph/pull/27214>`_, Shen Hang)
-* mds: clarify comment (`pr#31401 <https://github.com/ceph/ceph/pull/31401>`_, Patrick Donnelly)
-* mds: cleanup truncating inodes when standby replay mds trim log segments (`pr#28686 <https://github.com/ceph/ceph/pull/28686>`_, Yan, Zheng)
-* mds: cleanup unneeded client_snap_caps when splitting snap inode (`issue#39987 <http://tracker.ceph.com/issues/39987>`_, `pr#28190 <https://github.com/ceph/ceph/pull/28190>`_, Yan, Zheng)
-* mds: complete all the replay op when mds is restarted (`issue#40784 <http://tracker.ceph.com/issues/40784>`_, `pr#29059 <https://github.com/ceph/ceph/pull/29059>`_, Shen Hang)
-* mds: convert unnecessary usage of std::list to std::vector (`pr#26895 <https://github.com/ceph/ceph/pull/26895>`_, Patrick Donnelly)
-* mds: count purge queue items left in journal (`issue#40121 <http://tracker.ceph.com/issues/40121>`_, `pr#28376 <https://github.com/ceph/ceph/pull/28376>`_, Zhi Zhang)
-* mds: delay exporting directory whose pin value exceeds max rank id (`issue#40603 <http://tracker.ceph.com/issues/40603>`_, `pr#28804 <https://github.com/ceph/ceph/pull/28804>`_, Zhi Zhang)
-* mds: display scrub status in ceph status (`pr#28855 <https://github.com/ceph/ceph/pull/28855>`_, Venky Shankar)
-* mds: do not include metric_spec in MClientSession from MDS (`pr#32659 <https://github.com/ceph/ceph/pull/32659>`_, Patrick Donnelly)
-* mds: dont add metadata to session close message (`pr#32318 <https://github.com/ceph/ceph/pull/32318>`_, Yan, Zheng)
-* mds: dont mark cap NEEDSNAPFLUSH if client has no pending capsnap (`pr#28551 <https://github.com/ceph/ceph/pull/28551>`_, Yan, Zheng)
-* mds: dont print subtrees if they are too big or too many (`pr#26056 <https://github.com/ceph/ceph/pull/26056>`_, Rishabh Dave)
-* mds: dont respond getattr with -EROFS when mds is readonly (`pr#32676 <https://github.com/ceph/ceph/pull/32676>`_, Yan, Zheng)
-* mds: drive cap recall while dropping cache (`pr#30389 <https://github.com/ceph/ceph/pull/30389>`_, Patrick Donnelly)
-* mds: evict an unresponsive client only when another client wants its caps (`issue#17854 <http://tracker.ceph.com/issues/17854>`_, `pr#22645 <https://github.com/ceph/ceph/pull/22645>`_, Rishabh Dave)
-* mds: execute PurgeQueue on_error handler in finisher (`pr#29064 <https://github.com/ceph/ceph/pull/29064>`_, Yan, Zheng)
-* mds: fix assert(omap_num_objs <= MAX_OBJECTS) of OpenFileTable (`pr#32020 <https://github.com/ceph/ceph/pull/32020>`_, Yan, Zheng)
-* mds: fix bug of batch getattr/lookup (`pr#32268 <https://github.com/ceph/ceph/pull/32268>`_, Yan, Zheng)
-* mds: fix can wrlock check in Locker::acquire_locks() (`pr#33005 <https://github.com/ceph/ceph/pull/33005>`_, Yan, Zheng)
-* mds: fix infinite loop in Locker::file_update_finish (`pr#29902 <https://github.com/ceph/ceph/pull/29902>`_, Yan, Zheng)
-* mds: fix InoTable::force_consume_to() (`pr#29411 <https://github.com/ceph/ceph/pull/29411>`_, Yan, Zheng)
-* mds: fix invalid access of mdr->dn[0].back() (`pr#31534 <https://github.com/ceph/ceph/pull/31534>`_, Yan, Zheng)
-* mds: fix is session in blacklist check in Server::apply_blacklist() (`issue#40061 <http://tracker.ceph.com/issues/40061>`_, `pr#28293 <https://github.com/ceph/ceph/pull/28293>`_, Yan, Zheng)
-* mds: Fix MDCache.h reorder compiler warnings (`pr#31409 <https://github.com/ceph/ceph/pull/31409>`_, Varsha Rao)
-* mds: fix null pointer dereference in Server::handle_client_link() (`pr#32722 <https://github.com/ceph/ceph/pull/32722>`_, Yan, Zheng)
-* mds: fix revoking caps after after stale->resume circle (`pr#31662 <https://github.com/ceph/ceph/pull/31662>`_, Yan, Zheng)
-* mds: fix SnapRealm::resolve_snapname for long name (`pr#27511 <https://github.com/ceph/ceph/pull/27511>`_, Yan, Zheng)
-* mds: fix use-after-free in Migrater (`pr#33291 <https://github.com/ceph/ceph/pull/33291>`_, Yan, Zheng)
-* mds: handle bad purge queue item encoding (`pr#33449 <https://github.com/ceph/ceph/pull/33449>`_, Yan, Zheng)
-* mds: handle ceph_assert on blacklisting (`pr#33662 <https://github.com/ceph/ceph/pull/33662>`_, Milind Changire)
-* mds: increase default cache memory limit to 4G (`pr#32042 <https://github.com/ceph/ceph/pull/32042>`_, Patrick Donnelly)
-* mds: initialize cap_revoke_eviction_timeout with conf (`issue#38844 <http://tracker.ceph.com/issues/38844>`_, `pr#26970 <https://github.com/ceph/ceph/pull/26970>`_, simon gao)
-* mds: initialize the monc later in init() (`pr#31715 <https://github.com/ceph/ceph/pull/31715>`_, Xiubo Li)
-* mds: just delete MDSIOContextBase during shutdown (`pr#33538 <https://github.com/ceph/ceph/pull/33538>`_, Patrick Donnelly)
-* mds: maintain client provided metric flags in client metadata (`pr#32201 <https://github.com/ceph/ceph/pull/32201>`_, Venky Shankar)
-* mds: make mds-mds per-message versioned (`issue#12107 <http://tracker.ceph.com/issues/12107>`_, `pr#20160 <https://github.com/ceph/ceph/pull/20160>`_, dongdong tao)
-* mds: make MDSIOContextBase delete itself when shutting down (`pr#29752 <https://github.com/ceph/ceph/pull/29752>`_, Xuehan Xu)
-* mds: mds returns -5(EIO) error when the deleted file does not exist (`pr#30403 <https://github.com/ceph/ceph/pull/30403>`_, huanwen ren)
-* mds: move some MDCache member init to header (`pr#29543 <https://github.com/ceph/ceph/pull/29543>`_, Patrick Donnelly)
-* mds: no assert on frozen dir when scrub path (`pr#30835 <https://github.com/ceph/ceph/pull/30835>`_, Zhi Zhang)
-* mds: note client features when rejecting client (`pr#32505 <https://github.com/ceph/ceph/pull/32505>`_, Patrick Donnelly)
-* mds: obsoleting mds_cache_size (`pr#31729 <https://github.com/ceph/ceph/pull/31729>`_, Patrick Donnelly, Ramana Raja)
-* mds: optimize function, fragset_t::simplify, to improve the efficiency of  merging fragment (`pr#31595 <https://github.com/ceph/ceph/pull/31595>`_, simon gao)
-* mds: output lock state in format dump (`issue#39645 <http://tracker.ceph.com/issues/39645>`_, `pr#27717 <https://github.com/ceph/ceph/pull/27717>`_, Zhi Zhang)
-* mds: pass proper MutationImpl::LockOp to Locker::wrlock_start() (`pr#33719 <https://github.com/ceph/ceph/pull/33719>`_, Yan, Zheng)
-* mds: preparation for async dir operation support (`pr#30972 <https://github.com/ceph/ceph/pull/30972>`_, Yan, Zheng)
-* mds: properly evaluate unstable locks when evicting client (`pr#31548 <https://github.com/ceph/ceph/pull/31548>`_, Yan, Zheng)
-* mds: recall caps from quiescent sessions (`pr#28702 <https://github.com/ceph/ceph/pull/28702>`_, Patrick Donnelly)
-* mds: register with mgr only after added to FSMap (`pr#31400 <https://github.com/ceph/ceph/pull/31400>`_, Patrick Donnelly)
-* mds: reject sessionless messages (`pr#29594 <https://github.com/ceph/ceph/pull/29594>`_, Xiao Guodong)
-* mds: release free heap pages after trim (`pr#31793 <https://github.com/ceph/ceph/pull/31793>`_, Patrick Donnelly)
-* mds: relevel debug message levels for balancer/migrator (`pr#33471 <https://github.com/ceph/ceph/pull/33471>`_, Patrick Donnelly)
-* mds: remove dead get_commands code (`pr#33390 <https://github.com/ceph/ceph/pull/33390>`_, Patrick Donnelly)
-* mds: remove duplicated check on balance amount (`pr#27087 <https://github.com/ceph/ceph/pull/27087>`_, Zhi Zhang)
-* mds: remove superfluous error in StrayManager::advance_delayed() (`issue#38679 <http://tracker.ceph.com/issues/38679>`_, `pr#27051 <https://github.com/ceph/ceph/pull/27051>`_, Yan, Zheng)
-* mds: remove the code that skip evicting the only client (`pr#28642 <https://github.com/ceph/ceph/pull/28642>`_, Yan, Zheng)
-* mds: remove the incorrect comments (`pr#31775 <https://github.com/ceph/ceph/pull/31775>`_, Xiubo Li)
-* mds: remove unnecessary debug warning (`pr#31898 <https://github.com/ceph/ceph/pull/31898>`_, Patrick Donnelly)
-* mds: remove unused CDir members (`pr#33227 <https://github.com/ceph/ceph/pull/33227>`_, Jun Su)
-* mds: Reorganize class members in Anchor header (`pr#30090 <https://github.com/ceph/ceph/pull/30090>`_, Varsha Rao)
-* mds: Reorganize class members in Capability header (`pr#29166 <https://github.com/ceph/ceph/pull/29166>`_, Varsha Rao)
-* mds: Reorganize class members in CDir header (`pr#28860 <https://github.com/ceph/ceph/pull/28860>`_, Varsha Rao)
-* mds: Reorganize class members in CInode header (`pr#29066 <https://github.com/ceph/ceph/pull/29066>`_, Varsha Rao)
-* mds: Reorganize class members in DamageTable header (`pr#29569 <https://github.com/ceph/ceph/pull/29569>`_, Varsha Rao)
-* mds: Reorganize class members in FSMap header (`pr#29572 <https://github.com/ceph/ceph/pull/29572>`_, Varsha Rao)
-* mds: Reorganize class members in FSMapUser header (`pr#29574 <https://github.com/ceph/ceph/pull/29574>`_, Varsha Rao)
-* mds: Reorganize class members in InoTable header (`pr#29883 <https://github.com/ceph/ceph/pull/29883>`_, Varsha Rao)
-* mds: Reorganize class members in JournalPointer header (`pr#29888 <https://github.com/ceph/ceph/pull/29888>`_, Varsha Rao)
-* mds: Reorganize class members in LocalLock header (`pr#30143 <https://github.com/ceph/ceph/pull/30143>`_, Varsha Rao)
-* mds: Reorganize class members in Locker header (`pr#30164 <https://github.com/ceph/ceph/pull/30164>`_, Varsha Rao)
-* mds: Reorganize class members in LogEvent header (`pr#30205 <https://github.com/ceph/ceph/pull/30205>`_, Varsha Rao)
-* mds: Reorganize class members in LogSegment header (`pr#30202 <https://github.com/ceph/ceph/pull/30202>`_, Varsha Rao)
-* mds: Reorganize class members in MDBalancer header (`pr#30559 <https://github.com/ceph/ceph/pull/30559>`_, Varsha Rao)
-* mds: Reorganize class members in MDCache header (`pr#30745 <https://github.com/ceph/ceph/pull/30745>`_, Varsha Rao)
-* mds: Reorganize class members in MDLog header (`pr#30744 <https://github.com/ceph/ceph/pull/30744>`_, Varsha Rao)
-* mds: Reorganize class members in MDSAuthCaps header (`pr#30915 <https://github.com/ceph/ceph/pull/30915>`_, Varsha Rao)
-* mds: Reorganize class members in MDSCacheObject header (`pr#30938 <https://github.com/ceph/ceph/pull/30938>`_, Varsha Rao)
-* mds: Reorganize class members in MDSDaemon header (`pr#30990 <https://github.com/ceph/ceph/pull/30990>`_, Varsha Rao)
-* mds: Reorganize class members in MDSMap header (`pr#31118 <https://github.com/ceph/ceph/pull/31118>`_, Varsha Rao)
-* mds: Reorganize class members in MDSRank header (`pr#31120 <https://github.com/ceph/ceph/pull/31120>`_, Varsha Rao)
-* mds: Reorganize class members in MDSTable header (`pr#31122 <https://github.com/ceph/ceph/pull/31122>`_, Varsha Rao)
-* mds: Reorganize class members in MDSTableClient header (`pr#31115 <https://github.com/ceph/ceph/pull/31115>`_, Varsha Rao)
-* mds: Reorganize class members in MDSTableServer header (`pr#31250 <https://github.com/ceph/ceph/pull/31250>`_, Varsha Rao)
-* mds: Reorganize class members in Migrator header (`pr#31253 <https://github.com/ceph/ceph/pull/31253>`_, Varsha Rao)
-* mds: Reorganize class members in OpenFileTable header (`pr#31597 <https://github.com/ceph/ceph/pull/31597>`_, Varsha Rao)
-* mds: Reorganize class members in PurgeQueue header (`pr#31596 <https://github.com/ceph/ceph/pull/31596>`_, Varsha Rao)
-* mds: Reorganize class members in RecoveryQueue header (`pr#31635 <https://github.com/ceph/ceph/pull/31635>`_, Varsha Rao)
-* mds: Reorganize class members in ScatterLock header (`pr#31716 <https://github.com/ceph/ceph/pull/31716>`_, Varsha Rao)
-* mds: Reorganize class members in ScrubHeader header (`pr#31717 <https://github.com/ceph/ceph/pull/31717>`_, Varsha Rao)
-* mds: Reorganize class members in ScrubStack header (`pr#31718 <https://github.com/ceph/ceph/pull/31718>`_, Varsha Rao)
-* mds: Reorganize class members in Server header (`pr#31719 <https://github.com/ceph/ceph/pull/31719>`_, Varsha Rao)
-* mds: Reorganize class members in SessionMap header (`pr#32320 <https://github.com/ceph/ceph/pull/32320>`_, Varsha Rao)
-* mds: Reorganize class members in SimpleLock header (`pr#32322 <https://github.com/ceph/ceph/pull/32322>`_, Varsha Rao)
-* mds: Reorganize class members in SnapClient header (`pr#32326 <https://github.com/ceph/ceph/pull/32326>`_, Varsha Rao)
-* mds: Reorganize class members in SnapServer header (`pr#32350 <https://github.com/ceph/ceph/pull/32350>`_, Varsha Rao)
-* mds: Reorganize struct members in Mutation header (`pr#31481 <https://github.com/ceph/ceph/pull/31481>`_, Varsha Rao)
-* mds: Reorganize structure and class members in mdstypes header (`pr#32435 <https://github.com/ceph/ceph/pull/32435>`_, Varsha Rao)
-* mds: Reorganize structure members in flock header (`pr#32416 <https://github.com/ceph/ceph/pull/32416>`_, Varsha Rao)
-* mds: Reorganize structure members in inode_backtrace header (`pr#32431 <https://github.com/ceph/ceph/pull/32431>`_, Varsha Rao)
-* mds: Reorganize structure members in snap header (`pr#32432 <https://github.com/ceph/ceph/pull/32432>`_, Varsha Rao)
-* mds: Reorganize structure members in SnapRealm header (`pr#32348 <https://github.com/ceph/ceph/pull/32348>`_, Varsha Rao)
-* mds: Reorganize structure members in StrayManager header (`pr#32397 <https://github.com/ceph/ceph/pull/32397>`_, Varsha Rao)
-* mds: reset heartbeat inside big loop (`pr#28406 <https://github.com/ceph/ceph/pull/28406>`_, Yan, Zheng)
-* mds: split the dir if the op makes it oversized, because some ops maybe in flight (`pr#29921 <https://github.com/ceph/ceph/pull/29921>`_, simon gao)
-* mds: there is an assertion when calling Beacon::shutdown() (`issue#38822 <http://tracker.ceph.com/issues/38822>`_, `pr#27063 <https://github.com/ceph/ceph/pull/27063>`_, huanwen ren)
-* mds: throttle scrub start for multiple active MDS (`pr#32521 <https://github.com/ceph/ceph/pull/32521>`_, Patrick Donnelly, Milind Changire)
-* mds: tolerate no snaprealm encoded in on-disk root inode (`pr#31455 <https://github.com/ceph/ceph/pull/31455>`_, Yan, Zheng)
-* mds: track high water mark for purges (`pr#32667 <https://github.com/ceph/ceph/pull/32667>`_, Patrick Donnelly)
-* mds: trim cache during standby-replay (`issue#40213 <http://tracker.ceph.com/issues/40213>`_, `pr#28212 <https://github.com/ceph/ceph/pull/28212>`_, simon gao)
-* mds: trim cache on regular schedule (`pr#29542 <https://github.com/ceph/ceph/pull/29542>`_, Patrick Donnelly)
-* mds: unify daemon and tell commands (`pr#31255 <https://github.com/ceph/ceph/pull/31255>`_, Sage Weil)
-* mds: update projected_version when upgrading snaptable (`issue#38835 <http://tracker.ceph.com/issues/38835>`_, `pr#27238 <https://github.com/ceph/ceph/pull/27238>`_, Yan, Zheng)
-* mds: use set to store to evict client (`pr#30029 <https://github.com/ceph/ceph/pull/30029>`_, Erqi Chen)
-* mds: use vector::empty in feature_bitset_t (`pr#32541 <https://github.com/ceph/ceph/pull/32541>`_, Jos Collin)
-* mds: wake up lock waiters after forcibly changing lock state (`issue#39987 <http://tracker.ceph.com/issues/39987>`_, `pr#28459 <https://github.com/ceph/ceph/pull/28459>`_, Yan, Zheng)
-* mgr,mon,rbd: mon/mgr: add rbd_support to list of always-on mgr modules (`issue#40790 <http://tracker.ceph.com/issues/40790>`_, `pr#29073 <https://github.com/ceph/ceph/pull/29073>`_, Jason Dillaman)
-* mgr,mon: mon,mgr: pass MessageRef to monc.send_mon_message()  \xe2\x80\xa6 (`pr#30449 <https://github.com/ceph/ceph/pull/30449>`_, Kefu Chai)
-* mgr,mon: mon/MgrMonitor.cc: add always_on_modules to the output of ceph mgr module ls (`pr#32939 <https://github.com/ceph/ceph/pull/32939>`_, Neha Ojha)
-* mgr,mon: mon/MgrMonitor.cc: warn about missing mgr in a cluster with osds (`pr#33025 <https://github.com/ceph/ceph/pull/33025>`_, Neha Ojha)
-* mgr,pybind: pybind/mgr/prometheus: remove scrape_duration metric (`pr#27034 <https://github.com/ceph/ceph/pull/27034>`_, Jan Fajerski)
-* mgr,rbd: mgr/dashboard: block mirroring page results in internal server error (`pr#31907 <https://github.com/ceph/ceph/pull/31907>`_, Jason Dillaman)
-* mgr,rbd: mgr/rbd_support: dont scan pools that dont have schedules (`pr#33840 <https://github.com/ceph/ceph/pull/33840>`_, Mykola Golub)
-* mgr,rbd: mgr/rbd_support: implement mirror snapshot scheduler (`pr#32434 <https://github.com/ceph/ceph/pull/32434>`_, Mykola Golub)
-* mgr,rbd: mgr/rbd_support: support scheduling long-running background operations (`issue#40621 <http://tracker.ceph.com/issues/40621>`_, `pr#29054 <https://github.com/ceph/ceph/pull/29054>`_, Jason Dillaman)
-* mgr,rbd: pybind/mgr: fix format for rbd-mirror prometheus metrics (`pr#28200 <https://github.com/ceph/ceph/pull/28200>`_, Mykola Golub)
-* mgr,rgw: mgr/ansible: RGW service (`pr#28468 <https://github.com/ceph/ceph/pull/28468>`_, Juan Miguel Olmo Mart\xc3\xadnez)
-* mgr,tests: install-deps.sh: preload wheel for all mgr requirements.txt files (`pr#32151 <https://github.com/ceph/ceph/pull/32151>`_, Sage Weil)
-* mgr,tests: mgr/orchestrator_cli: remove tox and move test to parent dir (`pr#31561 <https://github.com/ceph/ceph/pull/31561>`_, Sebastian Wagner)
-* mgr,tests: mgr/progress: Created first unit test for progress module (`pr#28758 <https://github.com/ceph/ceph/pull/28758>`_, Kamoltat (Junior) Sirivadhna)
-* mgr,tests: pybind/mgr: Add ceph_module.pyi to improve type checking (`pr#32502 <https://github.com/ceph/ceph/pull/32502>`_, Sebastian Wagner)
-* mgr,tests: pybind/mgr: install setuptools >= 12 (`pr#29414 <https://github.com/ceph/ceph/pull/29414>`_, Kefu Chai)
-* mgr,tests: pybind/tox: handle possible WITH_PYTHON3 values other than 3 (`pr#28002 <https://github.com/ceph/ceph/pull/28002>`_, Nathan Cutler)
-* mgr,tests: qa/mgr/balancer: Add cram based test for altering target_max_misplaced_ratio setting (`pr#30646 <https://github.com/ceph/ceph/pull/30646>`_, Shyukri Shyukriev)
-* mgr,tests: qa/mgr/progress: update the test suite for progress module (`issue#40618 <http://tracker.ceph.com/issues/40618>`_, `pr#29111 <https://github.com/ceph/ceph/pull/29111>`_, Kamoltat (Junior) Sirivadhna)
-* mgr,tools: Remove use of rules batching for upmap balancer and default for upmap_max_deviation to 5 (`pr#32247 <https://github.com/ceph/ceph/pull/32247>`_, David Zafman)
-* mgr/ansible: Host ls implementation (`pr#26185 <https://github.com/ceph/ceph/pull/26185>`_, Juan Miguel Olmo Mart\xc3\xadnez)
-* mgr/ansible: Integrate mgr/ansible/tox into mgr/tox (`pr#32149 <https://github.com/ceph/ceph/pull/32149>`_, Sebastian Wagner)
-* mgr/ansible: TLS Mutual Authentication (`pr#27512 <https://github.com/ceph/ceph/pull/27512>`_, Juan Miguel Olmo Mart\xc3\xadnez)
-* mgr/cephadm: a few fixes around daemon and device caches (`pr#33495 <https://github.com/ceph/ceph/pull/33495>`_, Sage Weil)
-* mgr/cephadm: adapt osd deployment to service_apply (`pr#33922 <https://github.com/ceph/ceph/pull/33922>`_, Sage Weil, Joshua Schmid)
-* mgr/cephadm: add drivegroup support; workaround c-v batch shortcoming (`pr#32972 <https://github.com/ceph/ceph/pull/32972>`_, Sage Weil, Joshua Schmid)
-* mgr/cephadm: add HostAssignment.validate() (`pr#34005 <https://github.com/ceph/ceph/pull/34005>`_, Sebastian Wagner)
-* mgr/cephadm: Add progress to update_mgr() (`pr#32372 <https://github.com/ceph/ceph/pull/32372>`_, Sebastian Wagner)
-* mgr/cephadm: Add unittest for osd removal (`pr#33602 <https://github.com/ceph/ceph/pull/33602>`_, Sage Weil, Sebastian Wagner)
-* mgr/cephadm: Add unittest for service_action (`pr#32209 <https://github.com/ceph/ceph/pull/32209>`_, Sebastian Wagner)
-* mgr/cephadm: allow osd replacement/removal in the background (`pr#32983 <https://github.com/ceph/ceph/pull/32983>`_, Joshua Schmid)
-* mgr/cephadm: auto-select python version to use remotely (`pr#32327 <https://github.com/ceph/ceph/pull/32327>`_, Sage Weil)
-* mgr/cephadm: cache device inventory; zap (`pr#33394 <https://github.com/ceph/ceph/pull/33394>`_, Sage Weil)
-* mgr/cephadm: catch exceptions when scraping ceph-volume inventory (`pr#33484 <https://github.com/ceph/ceph/pull/33484>`_, Sage Weil)
-* mgr/cephadm: catch excpetions in serve() thread (`pr#33139 <https://github.com/ceph/ceph/pull/33139>`_, Sage Weil)
-* mgr/cephadm: check-host on host add (`pr#32385 <https://github.com/ceph/ceph/pull/32385>`_, Sage Weil)
-* mgr/cephadm: clean up client.crash.\\* container_image settings after upgrade (`pr#34068 <https://github.com/ceph/ceph/pull/34068>`_, Sage Weil)
-* mgr/cephadm: consolidate/refactor all add\\_ and apply\\_ methods (`pr#33496 <https://github.com/ceph/ceph/pull/33496>`_, Sage Weil)
-* mgr/cephadm: Convert HostNotFound to OrchestratorError (`pr#33310 <https://github.com/ceph/ceph/pull/33310>`_, Sebastian Wagner)
-* mgr/cephadm: deploy Grafana (`pr#33515 <https://github.com/ceph/ceph/pull/33515>`_, Patrick Seidensal)
-* mgr/cephadm: do not include osd service in orch ls output (`pr#33968 <https://github.com/ceph/ceph/pull/33968>`_, Sage Weil)
-* mgr/cephadm: do not reconfig orphan daemons; fix test to not remote orphans (`pr#34027 <https://github.com/ceph/ceph/pull/34027>`_, Sage Weil)
-* mgr/cephadm: do not refresh daemon and device inventory as often (`pr#33734 <https://github.com/ceph/ceph/pull/33734>`_, Sage Weil)
-* mgr/cephadm: drop mixin parent (`pr#33514 <https://github.com/ceph/ceph/pull/33514>`_, Sage Weil)
-* mgr/cephadm: Enable provisioning alertmanager via orchestrator (`pr#33554 <https://github.com/ceph/ceph/pull/33554>`_, Kristoffer Gr\xc3\xb6nlund)
-* mgr/cephadm: fix dump output by formatting to yaml first (`pr#33891 <https://github.com/ceph/ceph/pull/33891>`_, Joshua Schmid)
-* mgr/cephadm: fix listing services by host (`pr#32314 <https://github.com/ceph/ceph/pull/32314>`_, Kiefer Chang)
-* mgr/cephadm: fix orch rm and upgrade (`pr#33772 <https://github.com/ceph/ceph/pull/33772>`_, Sage Weil)
-* mgr/cephadm: fix osd reconfig/redeploy (`pr#32812 <https://github.com/ceph/ceph/pull/32812>`_, Sage Weil)
-* mgr/cephadm: Fix placement for new services (`pr#33205 <https://github.com/ceph/ceph/pull/33205>`_, Sebastian Wagner)
-* mgr/cephadm: fix placement when existing + specified dont overlap (`pr#33766 <https://github.com/ceph/ceph/pull/33766>`_, Sage Weil)
-* mgr/cephadm: fix prom config generation when hosts have no labels or addrs (`pr#33800 <https://github.com/ceph/ceph/pull/33800>`_, Sage Weil)
-* mgr/cephadm: Fix remove_osds() (`pr#32146 <https://github.com/ceph/ceph/pull/32146>`_, Sebastian Wagner)
-* mgr/cephadm: fix section name for mon options in ceph.conf (`pr#32681 <https://github.com/ceph/ceph/pull/32681>`_, Sage Weil)
-* mgr/cephadm: fix service list filtering (`pr#33838 <https://github.com/ceph/ceph/pull/33838>`_, Kiefer Chang)
-* mgr/cephadm: fix type of timeout options (`pr#32316 <https://github.com/ceph/ceph/pull/32316>`_, Kiefer Chang)
-* mgr/cephadm: fix upgrade ok-to-stop condition check (`pr#33469 <https://github.com/ceph/ceph/pull/33469>`_, Sage Weil)
-* mgr/cephadm: fix upgrade order (`pr#33811 <https://github.com/ceph/ceph/pull/33811>`_, Sage Weil)
-* mgr/cephadm: fix upgrade wait loop (`pr#33447 <https://github.com/ceph/ceph/pull/33447>`_, Sage Weil)
-* mgr/cephadm: fix upgrade when daemon is stopped (`pr#33678 <https://github.com/ceph/ceph/pull/33678>`_, Sage Weil)
-* mgr/cephadm: if we had no record of deps, and deps are [], do not reconfig (`pr#33733 <https://github.com/ceph/ceph/pull/33733>`_, Sage Weil)
-* mgr/cephadm: implement apply mon, mon removal checks (`pr#33792 <https://github.com/ceph/ceph/pull/33792>`_, Sage Weil)
-* mgr/cephadm: implement pause/resume to suspect non-monitoring background work (`pr#33930 <https://github.com/ceph/ceph/pull/33930>`_, Sage Weil)
-* mgr/cephadm: improve pull behavior for upgrade (`pr#32878 <https://github.com/ceph/ceph/pull/32878>`_, Sage Weil)
-* mgr/cephadm: init attrs created by settattr() (`pr#32957 <https://github.com/ceph/ceph/pull/32957>`_, Kefu Chai)
-* mgr/cephadm: leverage service specs (`pr#33553 <https://github.com/ceph/ceph/pull/33553>`_, Sage Weil, Joshua Schmid)
-* mgr/cephadm: limit number of times check host is performed in the serve loop (`pr#33866 <https://github.com/ceph/ceph/pull/33866>`_, Daniel-Pivonka)
-* mgr/cephadm: log information to cluster log (`pr#33488 <https://github.com/ceph/ceph/pull/33488>`_, Sage Weil)
-* mgr/cephadm: make apply move daemons, do its work synchronously (`pr#33704 <https://github.com/ceph/ceph/pull/33704>`_, Sage Weil)
-* mgr/cephadm: make NodeAssignment return a simple host list (`pr#33669 <https://github.com/ceph/ceph/pull/33669>`_, Sage Weil)
-* mgr/cephadm: make osd create on an existing LV idempotent (`pr#33755 <https://github.com/ceph/ceph/pull/33755>`_, Sage Weil)
-* mgr/cephadm: make prometheus scrape all mgrs, node-exporters (`pr#33444 <https://github.com/ceph/ceph/pull/33444>`_, Sage Weil)
-* mgr/cephadm: Make sure we dont co-locate the same daemon (`pr#33853 <https://github.com/ceph/ceph/pull/33853>`_, Sebastian Wagner)
-* mgr/cephadm: misc fixes (`pr#33119 <https://github.com/ceph/ceph/pull/33119>`_, Sage Weil)
-* mgr/cephadm: misc fixes + smoke test (`pr#33730 <https://github.com/ceph/ceph/pull/33730>`_, Sage Weil)
-* mgr/cephadm: mon: Dont show traceback for user errors (`pr#33333 <https://github.com/ceph/ceph/pull/33333>`_, Sebastian Wagner)
-* mgr/cephadm: nicer error from cephadm check-host (`pr#33935 <https://github.com/ceph/ceph/pull/33935>`_, Sage Weil)
-* mgr/cephadm: point dashboard at cephadms grafana automatically (`pr#33700 <https://github.com/ceph/ceph/pull/33700>`_, Sage Weil)
-* mgr/cephadm: prefix daemon ids with hostname (`pr#33012 <https://github.com/ceph/ceph/pull/33012>`_, Sage Weil)
-* mgr/cephadm: progress for upgrade (`pr#33415 <https://github.com/ceph/ceph/pull/33415>`_, Sage Weil)
-* mgr/cephadm: provision node-exporter (`pr#33123 <https://github.com/ceph/ceph/pull/33123>`_, Sage Weil, Patrick Seidensal)
-* mgr/cephadm: provision prometheus (`pr#33073 <https://github.com/ceph/ceph/pull/33073>`_, Sage Weil)
-* mgr/cephadm: reduce boilerplate for unittests (`pr#33663 <https://github.com/ceph/ceph/pull/33663>`_, Joshua Schmid)
-* mgr/cephadm: refresh ceph.conf when mons change (`pr#33855 <https://github.com/ceph/ceph/pull/33855>`_, Sage Weil)
-* mgr/cephadm: refresh configs when dependencies change (`pr#33671 <https://github.com/ceph/ceph/pull/33671>`_, Sage Weil)
-* mgr/cephadm: refresh service state in the background (`pr#32859 <https://github.com/ceph/ceph/pull/32859>`_, Sebastian Wagner, Sage Weil)
-* mgr/cephadm: remove item from cache when removing (`pr#33071 <https://github.com/ceph/ceph/pull/33071>`_, Sage Weil)
-* mgr/cephadm: remove redundant /dev when blinking device light (`pr#32246 <https://github.com/ceph/ceph/pull/32246>`_, Sage Weil)
-* mgr/cephadm: revamp scheduling (`pr#33523 <https://github.com/ceph/ceph/pull/33523>`_, Sage Weil)
-* mgr/cephadm: set thread pool size to 10 (`pr#33463 <https://github.com/ceph/ceph/pull/33463>`_, Sebastian Wagner)
-* mgr/cephadm: show age of service ls (`pr#32686 <https://github.com/ceph/ceph/pull/32686>`_, Sage Weil)
-* mgr/cephadm: simplify and improve placement (`pr#33808 <https://github.com/ceph/ceph/pull/33808>`_, Sage Weil)
-* mgr/cephadm: simplify tracking of daemon inventory (`pr#33249 <https://github.com/ceph/ceph/pull/33249>`_, Sage Weil)
-* mgr/cephadm: two minor fixes (`pr#33736 <https://github.com/ceph/ceph/pull/33736>`_, Sage Weil)
-* mgr/cephadm: update osd removal report immediately (`pr#33713 <https://github.com/ceph/ceph/pull/33713>`_, Kiefer Chang)
-* mgr/cephadm: update type annotation (`pr#33784 <https://github.com/ceph/ceph/pull/33784>`_, Kefu Chai)
-* mgr/cephadm: upgrade requires root mode for now (`pr#33802 <https://github.com/ceph/ceph/pull/33802>`_, Sage Weil)
-* mgr/cephadm: upgrade: fix daemons missing image_id (`pr#33745 <https://github.com/ceph/ceph/pull/33745>`_, Sage Weil)
-* mgr/cephadm: upgrade: handle stopped daemons (`pr#33487 <https://github.com/ceph/ceph/pull/33487>`_, Sage Weil)
-* mgr/cephadm: verify hosts hostname matches cephadm host (`pr#33058 <https://github.com/ceph/ceph/pull/33058>`_, Sage Weil)
-* mgr/dashbaord: Fix E2E pools page failure (`pr#32635 <https://github.com/ceph/ceph/pull/32635>`_, Stephan M\xc3\xbcller)
-* mgr/dashboad: Improve iSCSI overview page (`pr#27254 <https://github.com/ceph/ceph/pull/27254>`_, Ricardo Marques)
-* mgr/dashboard Displays progress bar in notification tray for background tasks (`pr#27420 <https://github.com/ceph/ceph/pull/27420>`_, Pooja)
-* mgr/dashboard/qa: Improve tasks.mgr.test_dashboard.TestDashboard.test_standby (`pr#26925 <https://github.com/ceph/ceph/pull/26925>`_, Volker Theile)
-* mgr/dashboard/qa: Increase timeout for test_disable (tasks.mgr.dashboard.test_mgr_module.MgrModuleTelemetryTest) (`pr#27187 <https://github.com/ceph/ceph/pull/27187>`_, Volker Theile)
-* mgr/dashboard: 1 osds exist in the crush map but not in the osdmap breaks OSD page (`issue#36086 <http://tracker.ceph.com/issues/36086>`_, `pr#26836 <https://github.com/ceph/ceph/pull/26836>`_, Patrick Nawracay)
-* mgr/dashboard: A block-manager can not access the pool page (`pr#30001 <https://github.com/ceph/ceph/pull/30001>`_, Volker Theile)
-* mgr/dashboard: accept expected exception when SSL handshaking (`pr#31014 <https://github.com/ceph/ceph/pull/31014>`_, Kefu Chai)
-* mgr/dashboard: Access control database does not restore disabled users correctly (`pr#29614 <https://github.com/ceph/ceph/pull/29614>`_, Volker Theile)
-* mgr/dashboard: adapt bucket tenant API tests to new behaviour (`pr#29570 <https://github.com/ceph/ceph/pull/29570>`_, alfonsomthd)
-* mgr/dashboard: adapt create_osds interface change (`pr#34000 <https://github.com/ceph/ceph/pull/34000>`_, Kiefer Chang)
-* mgr/dashboard: Add Always-on column to mgr module list (`pr#33429 <https://github.com/ceph/ceph/pull/33429>`_, Volker Theile)
-* mgr/dashboard: Add date range and log search functionality (`issue#37387 <http://tracker.ceph.com/issues/37387>`_, `pr#26562 <https://github.com/ceph/ceph/pull/26562>`_, guodan1)
-* mgr/dashboard: add debug mode (`pr#30522 <https://github.com/ceph/ceph/pull/30522>`_, Ernesto Puerta)
-* mgr/dashboard: add feature toggle for NFS and fix feature toggles regression (`pr#32419 <https://github.com/ceph/ceph/pull/32419>`_, Ernesto Puerta)
-* mgr/dashboard: Add invalid pattern message for Pool name (`pr#31607 <https://github.com/ceph/ceph/pull/31607>`_, Tiago Melo)
-* mgr/dashboard: Add missing text translation (`pr#29934 <https://github.com/ceph/ceph/pull/29934>`_, Volker Theile)
-* mgr/dashboard: Add polish translation (`pr#27247 <https://github.com/ceph/ceph/pull/27247>`_, Sebastian Krah)
-* mgr/dashboard: Add protractor-screenshoter-plugin (`pr#27166 <https://github.com/ceph/ceph/pull/27166>`_, Alfonso Mart\xc3\xadnez)
-* mgr/dashboard: Add refresh  interval to the dashboard landing page (`issue#26872 <http://tracker.ceph.com/issues/26872>`_, `pr#26396 <https://github.com/ceph/ceph/pull/26396>`_, guodan1)
-* mgr/dashboard: Add separate option to config SSL port (`pr#26914 <https://github.com/ceph/ceph/pull/26914>`_, Volker Theile)
-* mgr/dashboard: Add support for blinking enclosure LEDs (`pr#31851 <https://github.com/ceph/ceph/pull/31851>`_, Volker Theile)
-* mgr/dashboard: Add time-diff unittest and docs (`pr#31357 <https://github.com/ceph/ceph/pull/31357>`_, Volker Theile)
-* mgr/dashboard: Add vertical menu (`pr#31923 <https://github.com/ceph/ceph/pull/31923>`_, Tiago Melo)
-* mgr/dashboard: Add whitelist to guard (`pr#27406 <https://github.com/ceph/ceph/pull/27406>`_, Ernesto Puerta)
-* mgr/dashboard: Allow deletion of RBD with snapshots (`pr#33067 <https://github.com/ceph/ceph/pull/33067>`_, Tiago Melo)
-* mgr/dashboard: Allow disabling redirection on standby Dashboards (`pr#29088 <https://github.com/ceph/ceph/pull/29088>`_, Volker Theile)
-* mgr/dashboard: allow refreshing inventory page (`pr#32423 <https://github.com/ceph/ceph/pull/32423>`_, Kiefer Chang)
-* mgr/dashboard: Allow users to change their password on the UI (`pr#28935 <https://github.com/ceph/ceph/pull/28935>`_, Volker Theile)
-* mgr/dashboard: auth ttl expired error (`pr#27098 <https://github.com/ceph/ceph/pull/27098>`_, ming416)
-* mgr/dashboard: Back button component (`pr#27164 <https://github.com/ceph/ceph/pull/27164>`_, Stephan M\xc3\xbcller)
-* mgr/dashboard: behave when pwdUpdateRequired key is missing (`pr#33513 <https://github.com/ceph/ceph/pull/33513>`_, Sage Weil)
-* mgr/dashboard: Bucket names cannot be formatted as IP address (`pr#30620 <https://github.com/ceph/ceph/pull/30620>`_, Volker Theile)
-* mgr/dashboard: ceph dashboard i18ntool (`pr#26953 <https://github.com/ceph/ceph/pull/26953>`_, Sebastian Krah)
-* mgr/dashboard: CephFS client tab switch (`pr#29556 <https://github.com/ceph/ceph/pull/29556>`_, Stephan M\xc3\xbcller)
-* mgr/dashboard: CephFS tab component (`pr#29800 <https://github.com/ceph/ceph/pull/29800>`_, Stephan M\xc3\xbcller)
-* mgr/dashboard: Change the provider of services to root (`issue#39996 <http://tracker.ceph.com/issues/39996>`_, `pr#28211 <https://github.com/ceph/ceph/pull/28211>`_, Tiago Melo)
-* mgr/dashboard: change warn_explicit to warn (`pr#30075 <https://github.com/ceph/ceph/pull/30075>`_, Ernesto Puerta)
-* mgr/dashboard: Check if gateway is in use before deletion (`pr#27262 <https://github.com/ceph/ceph/pull/27262>`_, Ricardo Marques)
-* mgr/dashboard: Check if `num_sessions` is available (`pr#30270 <https://github.com/ceph/ceph/pull/30270>`_, Ricardo Marques)
-* mgr/dashboard: cheroot moved into a separate project (`pr#31431 <https://github.com/ceph/ceph/pull/31431>`_, Joshua Schmid)
-* mgr/dashboard: Cleanup code (`pr#33107 <https://github.com/ceph/ceph/pull/33107>`_, Volker Theile)
-* mgr/dashboard: Cleanup feature toggle status output (`pr#32569 <https://github.com/ceph/ceph/pull/32569>`_, Volker Theile)
-* mgr/dashboard: Cleanup Python code (`pr#29604 <https://github.com/ceph/ceph/pull/29604>`_, Volker Theile)
-* mgr/dashboard: Clone an existing user role (`pr#32653 <https://github.com/ceph/ceph/pull/32653>`_, Volker Theile)
-* mgr/dashboard: commands to set SSL certificate and key (`pr#27463 <https://github.com/ceph/ceph/pull/27463>`_, Ricardo Dias)
-* mgr/dashboard: Configuring an URL prefix does not work as expected (`pr#30599 <https://github.com/ceph/ceph/pull/30599>`_, Volker Theile)
-* mgr/dashboard: consider mon_allow_pool_delete flag (`pr#28260 <https://github.com/ceph/ceph/pull/28260>`_, Tatjana Dehler)
-* mgr/dashboard: Controls UI inputs based on type (`pr#30208 <https://github.com/ceph/ceph/pull/30208>`_, Ricardo Marques)
-* mgr/dashboard: coverage venv python version same as mgr (`pr#33407 <https://github.com/ceph/ceph/pull/33407>`_, Alfonso Mart\xc3\xadnez)
-* mgr/dashboard: Create bucket with x-amz-bucket-object-lock-enabled (`pr#33821 <https://github.com/ceph/ceph/pull/33821>`_, Volker Theile)
-* mgr/dashboard: Crush rule modal (`pr#33620 <https://github.com/ceph/ceph/pull/33620>`_, Stephan M\xc3\xbcller)
-* mgr/dashboard: decouple backend unit tests from build (`pr#32565 <https://github.com/ceph/ceph/pull/32565>`_, Alfonso Mart\xc3\xadnez)
-* mgr/dashboard: destroyed view in CRUSH map viewer (`pr#33405 <https://github.com/ceph/ceph/pull/33405>`_, Avan Thakkar)
-* mgr/dashboard: Disable event propagation in the helper icon (`issue#40715 <http://tracker.ceph.com/issues/40715>`_, `pr#29105 <https://github.com/ceph/ceph/pull/29105>`_, Tiago Melo)
-* mgr/dashboard: Display correct dialog title (`pr#28168 <https://github.com/ceph/ceph/pull/28168>`_, Volker Theile)
-* mgr/dashboard: Display iSCSI logged in info (`pr#28265 <https://github.com/ceph/ceph/pull/28265>`_, Ricardo Marques)
-* mgr/dashboard: Display legend for CephFS standbys (`pr#29927 <https://github.com/ceph/ceph/pull/29927>`_, Volker Theile)
-* mgr/dashboard: display OSD IDs on inventory page (`pr#31189 <https://github.com/ceph/ceph/pull/31189>`_, Kiefer Chang)
-* mgr/dashboard: Display the number of iSCSI active sessions (`pr#27248 <https://github.com/ceph/ceph/pull/27248>`_, Ricardo Marques)
-* mgr/dashboard: Display WWN and LUN number in iSCSI target details (`pr#30288 <https://github.com/ceph/ceph/pull/30288>`_, Ricardo Marques)
-* mgr/dashboard: do not log tokens (`pr#30445 <https://github.com/ceph/ceph/pull/30445>`_, Kefu Chai)
-* mgr/dashboard: do not show RGW API keys if only read-only privileges (`pr#33178 <https://github.com/ceph/ceph/pull/33178>`_, Alfonso Mart\xc3\xadnez)
-* mgr/dashboard: Editing RGW bucket fails because of name is already in use (`pr#29767 <https://github.com/ceph/ceph/pull/29767>`_, Volker Theile)
-* mgr/dashboard: Enable compiler options used by Angular --strict flag (`pr#32553 <https://github.com/ceph/ceph/pull/32553>`_, Tiago Melo)
-* mgr/dashboard: Enable read only users to read again (`pr#27348 <https://github.com/ceph/ceph/pull/27348>`_, Stephan M\xc3\xbcller)
-* mgr/dashboard: enable/disable versioning on RGW bucket (`pr#29460 <https://github.com/ceph/ceph/pull/29460>`_, Alfonso Mart\xc3\xadnez)
-* mgr/dashboard: Enforce password change upon first login (`pr#32680 <https://github.com/ceph/ceph/pull/32680>`_, Volker Theile, Tatjana Dehler)
-* mgr/dashboard: Enhance user create CLI command to force password change (`pr#33552 <https://github.com/ceph/ceph/pull/33552>`_, Volker Theile)
-* mgr/dashboard: Evict a CephFS client (`pr#28898 <https://github.com/ceph/ceph/pull/28898>`_, Ricardo Marques)
-* mgr/dashboard: Explicitly set/change the device class of an OSD (`pr#32150 <https://github.com/ceph/ceph/pull/32150>`_, Ricardo Marques)
-* mgr/dashboard: Extend E2E test section (`pr#28858 <https://github.com/ceph/ceph/pull/28858>`_, Laura Paduano)
-* mgr/dashboard: extend types of `smart` response (`pr#30595 <https://github.com/ceph/ceph/pull/30595>`_, Patrick Seidensal)
-* mgr/dashboard: fix adding/removing host errors (`pr#34023 <https://github.com/ceph/ceph/pull/34023>`_, Kiefer Chang)
-* mgr/dashboard: fix backend error when updating RBD interlocked features (`issue#39933 <http://tracker.ceph.com/issues/39933>`_, `pr#28147 <https://github.com/ceph/ceph/pull/28147>`_, Kiefer Chang)
-* mgr/dashboard: fix cdEncode decorator is not working on class (`pr#30064 <https://github.com/ceph/ceph/pull/30064>`_, Kiefer Chang)
-* mgr/dashboard: Fix CephFS chart (`pr#29557 <https://github.com/ceph/ceph/pull/29557>`_, Stephan M\xc3\xbcller)
-* mgr/dashboard: Fix dashboard health test failure (`pr#29172 <https://github.com/ceph/ceph/pull/29172>`_, Ricardo Marques)
-* mgr/dashboard: Fix deletion of NFS protocol properties (`issue#38997 <http://tracker.ceph.com/issues/38997>`_, `pr#27244 <https://github.com/ceph/ceph/pull/27244>`_, Tiago Melo)
-* mgr/dashboard: Fix deletion of NFS transports properties (`issue#39090 <http://tracker.ceph.com/issues/39090>`_, `pr#27350 <https://github.com/ceph/ceph/pull/27350>`_, Tiago Melo)
-* mgr/dashboard: Fix e2e chromedriver problem (`pr#32224 <https://github.com/ceph/ceph/pull/32224>`_, Tiago Melo)
-* mgr/dashboard: Fix env vars of `run-tox.sh` (`issue#38798 <http://tracker.ceph.com/issues/38798>`_, `pr#26977 <https://github.com/ceph/ceph/pull/26977>`_, Patrick Nawracay)
-* mgr/dashboard: Fix error in unit test caused by timezone (`pr#31632 <https://github.com/ceph/ceph/pull/31632>`_, Tiago Melo)
-* mgr/dashboard: fix failing user test (`pr#32461 <https://github.com/ceph/ceph/pull/32461>`_, Tatjana Dehler)
-* mgr/dashboard: fix improper URL checking (`pr#32652 <https://github.com/ceph/ceph/pull/32652>`_, Ernesto Puerta)
-* mgr/dashboard: Fix iSCSI + Rook issues (`issue#39586 <http://tracker.ceph.com/issues/39586>`_, `pr#26341 <https://github.com/ceph/ceph/pull/26341>`_, Sebastian Wagner)
-* mgr/dashboard: Fix iSCSI Discovery user permissions (`issue#39328 <http://tracker.ceph.com/issues/39328>`_, `pr#27678 <https://github.com/ceph/ceph/pull/27678>`_, Tiago Melo)
-* mgr/dashboard: Fix iSCSI disk diff calculation (`pr#27378 <https://github.com/ceph/ceph/pull/27378>`_, Ricardo Marques)
-* mgr/dashboard: Fix iSCSI form when using IPv6 (`pr#27946 <https://github.com/ceph/ceph/pull/27946>`_, Ricardo Marques)
-* mgr/dashboard: Fix iSCSI target form warning (`issue#39324 <http://tracker.ceph.com/issues/39324>`_, `pr#27609 <https://github.com/ceph/ceph/pull/27609>`_, Tiago Melo)
-* mgr/dashboard: Fix iSCSI target submission (`pr#27380 <https://github.com/ceph/ceph/pull/27380>`_, Ricardo Marques)
-* mgr/dashboard: Fix issues in user form (`pr#28863 <https://github.com/ceph/ceph/pull/28863>`_, Volker Theile)
-* mgr/dashboard: fix LazyUUID4 not serializable (`pr#31266 <https://github.com/ceph/ceph/pull/31266>`_, Ernesto Puerta)
-* mgr/dashboard: fix MDS counter chart is not displayed (`pr#29371 <https://github.com/ceph/ceph/pull/29371>`_, Kiefer Chang)
-* mgr/dashboard: fix mgr module API tests (`pr#29634 <https://github.com/ceph/ceph/pull/29634>`_, alfonsomthd, Kefu Chai)
-* mgr/dashboard: fix missing constraints file in backend API tests (`pr#30720 <https://github.com/ceph/ceph/pull/30720>`_, Alfonso Mart\xc3\xadnez)
-* mgr/dashboard: Fix missing i18n (`pr#32650 <https://github.com/ceph/ceph/pull/32650>`_, Volker Theile)
-* mgr/dashboard: Fix mypy issues and enable it by default (`pr#33454 <https://github.com/ceph/ceph/pull/33454>`_, Volker Theile)
-* mgr/dashboard: Fix NFS pseudo validation (`issue#39063 <http://tracker.ceph.com/issues/39063>`_, `pr#27293 <https://github.com/ceph/ceph/pull/27293>`_, Tiago Melo)
-* mgr/dashboard: Fix NFS squash default value (`issue#39064 <http://tracker.ceph.com/issues/39064>`_, `pr#27294 <https://github.com/ceph/ceph/pull/27294>`_, Tiago Melo)
-* mgr/dashboard: Fix npm vulnerabilities (`pr#32699 <https://github.com/ceph/ceph/pull/32699>`_, Tiago Melo)
-* mgr/dashboard: Fix OSD IDs are not displayed when using cephadm backend (`pr#32207 <https://github.com/ceph/ceph/pull/32207>`_, Kiefer Chang)
-* mgr/dashboard: Fix pool deletion e2e (`pr#29993 <https://github.com/ceph/ceph/pull/29993>`_, Volker Theile)
-* mgr/dashboard: Fix pool renaming functionality (`pr#31617 <https://github.com/ceph/ceph/pull/31617>`_, Stephan M\xc3\xbcller)
-* mgr/dashboard: fix python2 failure in home controller (`pr#30937 <https://github.com/ceph/ceph/pull/30937>`_, Ricardo Dias)
-* mgr/dashboard: fix RGW subuser auto-generate key (`pr#32186 <https://github.com/ceph/ceph/pull/32186>`_, Alfonso Mart\xc3\xadnez)
-* mgr/dashboard: Fix RGW user/bucket quota issues (`pr#28174 <https://github.com/ceph/ceph/pull/28174>`_, Volker Theile)
-* mgr/dashboard: fix SAML input argument handling (`pr#29848 <https://github.com/ceph/ceph/pull/29848>`_, Ernesto Puerta)
-* mgr/dashboard: fix small typos in description message (`pr#30647 <https://github.com/ceph/ceph/pull/30647>`_, Tatjana Dehler)
-* mgr/dashboard: fix some performance data are not displayed (`issue#39971 <http://tracker.ceph.com/issues/39971>`_, `pr#28169 <https://github.com/ceph/ceph/pull/28169>`_, Kiefer Chang)
-* mgr/dashboard: fix sparkline component (`pr#26985 <https://github.com/ceph/ceph/pull/26985>`_, Alfonso Mart\xc3\xadnez)
-* mgr/dashboard: fix tasks.mgr.dashboard.test_rgw suite (`pr#33718 <https://github.com/ceph/ceph/pull/33718>`_, Alfonso Mart\xc3\xadnez)
-* mgr/dashboard: Fix the table mouseenter event handling test (`pr#28879 <https://github.com/ceph/ceph/pull/28879>`_, Stephan M\xc3\xbcller)
-* mgr/dashboard: fix tox test failure (`pr#29125 <https://github.com/ceph/ceph/pull/29125>`_, Kiefer Chang)
-* mgr/dashboard: Fix translation of variables (`pr#30671 <https://github.com/ceph/ceph/pull/30671>`_, Tiago Melo)
-* mgr/dashboard: Fix typo in NFS form (`issue#39067 <http://tracker.ceph.com/issues/39067>`_, `pr#27245 <https://github.com/ceph/ceph/pull/27245>`_, Tiago Melo)
-* mgr/dashboard: fix visibility of pwdExpirationDate field (`pr#32703 <https://github.com/ceph/ceph/pull/32703>`_, Tatjana Dehler)
-* mgr/dashboard: Fix zsh support in run-backend-api-tests.sh (`pr#31070 <https://github.com/ceph/ceph/pull/31070>`_, Sebastian Wagner)
-* mgr/dashboard: Fix `npm run fixmod` command (`pr#28176 <https://github.com/ceph/ceph/pull/28176>`_, Patrick Nawracay)
-* mgr/dashboard: Fixes defaultBuilder is not a function (`pr#29420 <https://github.com/ceph/ceph/pull/29420>`_, Ricardo Marques)
-* mgr/dashboard: Fixes random cephfs tab test failure (`pr#30814 <https://github.com/ceph/ceph/pull/30814>`_, Stephan M\xc3\xbcller)
-* mgr/dashboard: Fixes rbd image purge trash button & modal text (`pr#33321 <https://github.com/ceph/ceph/pull/33321>`_, anurag)
-* mgr/dashboard: Fixes tooltip behavior (`pr#27153 <https://github.com/ceph/ceph/pull/27153>`_, Stephan M\xc3\xbcller)
-* mgr/dashboard: FixtureHelper (`pr#27157 <https://github.com/ceph/ceph/pull/27157>`_, Stephan M\xc3\xbcller)
-* mgr/dashboard: Form fields do not show error messages/hints (`pr#29043 <https://github.com/ceph/ceph/pull/29043>`_, Volker Theile)
-* mgr/dashboard: ganesha: Specify the name of the filesystem (create_path) (`pr#29182 <https://github.com/ceph/ceph/pull/29182>`_, David Casier)
-* mgr/dashboard: hide daemon table when orchestrator is disabled (`pr#33941 <https://github.com/ceph/ceph/pull/33941>`_, Kiefer Chang)
-* mgr/dashboard: hide in-use devices when creating OSDs (`pr#31927 <https://github.com/ceph/ceph/pull/31927>`_, Kiefer Chang)
-* mgr/dashboard: improve device selection modal for creating OSDs (`pr#33081 <https://github.com/ceph/ceph/pull/33081>`_, Kiefer Chang)
-* mgr/dashboard: Improve hints shown when message.xlf is invalid (`issue#40064 <http://tracker.ceph.com/issues/40064>`_, `pr#28377 <https://github.com/ceph/ceph/pull/28377>`_, Patrick Nawracay)
-* mgr/dashboard: Improve NFS Pseudo pattern message (`issue#39327 <http://tracker.ceph.com/issues/39327>`_, `pr#27653 <https://github.com/ceph/ceph/pull/27653>`_, Tiago Melo)
-* mgr/dashboard: Improve Notification sidebar (`pr#32895 <https://github.com/ceph/ceph/pull/32895>`_, Tiago Melo)
-* mgr/dashboard: Improve RestClient error logging (`pr#29794 <https://github.com/ceph/ceph/pull/29794>`_, Volker Theile)
-* mgr/dashboard: Increase column size on mgr module form (`pr#29107 <https://github.com/ceph/ceph/pull/29107>`_, Ricardo Marques)
-* mgr/dashboard: install teuthology using pip (`pr#31815 <https://github.com/ceph/ceph/pull/31815>`_, Kefu Chai)
-* mgr/dashboard: internationalization support with AOT enabled (`pr#30694 <https://github.com/ceph/ceph/pull/30694>`_, Tiago Melo, Ricardo Dias)
-* mgr/dashboard: Invalid SSO configuration when certificate path does not exist (`pr#31920 <https://github.com/ceph/ceph/pull/31920>`_, Ricardo Marques)
-* mgr/dashboard: iSCSI GET requests should not be logged (`pr#27813 <https://github.com/ceph/ceph/pull/27813>`_, Ricardo Marques)
-* mgr/dashboard: iSCSI targets not available if any gateway is down (`pr#31819 <https://github.com/ceph/ceph/pull/31819>`_, Ricardo Marques)
-* mgr/dashboard: Isolate each RBD component (`pr#33520 <https://github.com/ceph/ceph/pull/33520>`_, Tiago Melo)
-* mgr/dashboard: KeyError on dashboard reload (`pr#31469 <https://github.com/ceph/ceph/pull/31469>`_, Patrick Seidensal)
-* mgr/dashboard: KV-table transforms dates through pipe (`pr#27612 <https://github.com/ceph/ceph/pull/27612>`_, Stephan M\xc3\xbcller)
-* mgr/dashboard: Left align badge datatable columns (`pr#32053 <https://github.com/ceph/ceph/pull/32053>`_, Volker Theile)
-* mgr/dashboard: list services and daemons (`pr#33531 <https://github.com/ceph/ceph/pull/33531>`_, Sage Weil, Kiefer Chang)
-* mgr/dashboard: Localization for date picker module (`pr#27275 <https://github.com/ceph/ceph/pull/27275>`_, Stephan M\xc3\xbcller)
-* mgr/dashboard: Make all columns sortable (`pr#27784 <https://github.com/ceph/ceph/pull/27784>`_, Stephan M\xc3\xbcller)
-* mgr/dashboard: make check mypy failure (`pr#33573 <https://github.com/ceph/ceph/pull/33573>`_, Volker Theile)
-* mgr/dashboard: Make password policy check configurable (`pr#32546 <https://github.com/ceph/ceph/pull/32546>`_, Volker Theile)
-* mgr/dashboard: Make preventDefault work with 400 errors (`pr#26561 <https://github.com/ceph/ceph/pull/26561>`_, Stephan M\xc3\xbcller)
-* mgr/dashboard: monitoring: improve generic Could not reach external API message (`pr#32648 <https://github.com/ceph/ceph/pull/32648>`_, Patrick Seidensal)
-* mgr/dashboard: Not able to restrict bucket creation for new user (`pr#33612 <https://github.com/ceph/ceph/pull/33612>`_, Volker Theile)
-* mgr/dashboard: Optimize portal IPs calculation (`pr#28084 <https://github.com/ceph/ceph/pull/28084>`_, Ricardo Marques)
-* mgr/dashboard: orchestrator integration initial works (`pr#29127 <https://github.com/ceph/ceph/pull/29127>`_, Kiefer Chang)
-* mgr/dashboard: OSD custom action button removal (`pr#28095 <https://github.com/ceph/ceph/pull/28095>`_, Stephan M\xc3\xbcller)
-* mgr/dashboard: OSD improvements (`pr#30493 <https://github.com/ceph/ceph/pull/30493>`_, Patrick Seidensal)
-* mgr/dashboard: pass a list of drive_group to create_osds (`pr#33014 <https://github.com/ceph/ceph/pull/33014>`_, Kefu Chai)
-* mgr/dashboard: Pool form uses different loading spinner (`pr#28649 <https://github.com/ceph/ceph/pull/28649>`_, Volker Theile)
-* mgr/dashboard: Prevent deletion of iSCSI IQNs with open sessions (`pr#29133 <https://github.com/ceph/ceph/pull/29133>`_, Ricardo Marques)
-* mgr/dashboard: Prevent KeyError when requesting always_on_modules (`pr#30426 <https://github.com/ceph/ceph/pull/30426>`_, Volker Theile)
-* mgr/dashboard: Process password complexity checks immediately (`pr#32032 <https://github.com/ceph/ceph/pull/32032>`_, Volker Theile, Tatjana Dehler)
-* mgr/dashboard: Provide the name of the object being deleted (`pr#30658 <https://github.com/ceph/ceph/pull/30658>`_, Ricardo Marques)
-* mgr/dashboard: Provide user enable/disable capability (`issue#25229 <http://tracker.ceph.com/issues/25229>`_, `pr#29046 <https://github.com/ceph/ceph/pull/29046>`_, Ricardo Dias, Patrick Nawracay)
-* mgr/dashboard: Push Grafana dashboards on startup (`pr#26415 <https://github.com/ceph/ceph/pull/26415>`_, Zack Cerza)
-* mgr/dashboard: qa: fix RBD test when matching error strings (`pr#29264 <https://github.com/ceph/ceph/pull/29264>`_, Ricardo Dias)
-* mgr/dashboard: qa: whitelist client eviction warning (`pr#29114 <https://github.com/ceph/ceph/pull/29114>`_, Ricardo Dias)
-* mgr/dashboard: RBD snapshot name suggestion with local time suffix (`pr#27613 <https://github.com/ceph/ceph/pull/27613>`_, Stephan M\xc3\xbcller)
-* mgr/dashboard: Reduce the number of renders on the tables (`issue#39944 <http://tracker.ceph.com/issues/39944>`_, `pr#28118 <https://github.com/ceph/ceph/pull/28118>`_, Tiago Melo)
-* mgr/dashboard: Refactor and cleanup tasks.mgr.dashboard.test_user (`pr#33743 <https://github.com/ceph/ceph/pull/33743>`_, Volker Theile)
-* mgr/dashboard: Refactor Python unittests and controller (`pr#31165 <https://github.com/ceph/ceph/pull/31165>`_, Volker Theile)
-* mgr/dashboard: Reload all CephFS directories (`pr#32552 <https://github.com/ceph/ceph/pull/32552>`_, Stephan M\xc3\xbcller)
-* mgr/dashboard: remove config-opt: read perm. from system roles (`pr#33690 <https://github.com/ceph/ceph/pull/33690>`_, Alfonso Mart\xc3\xadnez)
-* mgr/dashboard: Remove ngx-store (`pr#33756 <https://github.com/ceph/ceph/pull/33756>`_, Tiago Melo)
-* mgr/dashboard: remove traceback/version assertions (`pr#31720 <https://github.com/ceph/ceph/pull/31720>`_, Ernesto Puerta)
-* mgr/dashboard: Remove unused RBD configuration endpoint (`pr#30815 <https://github.com/ceph/ceph/pull/30815>`_, Ricardo Marques)
-* mgr/dashboard: Remove unused variable (`pr#31785 <https://github.com/ceph/ceph/pull/31785>`_, Volker Theile)
-* mgr/dashboard: Removes distracting search behavior (`pr#27438 <https://github.com/ceph/ceph/pull/27438>`_, Stephan M\xc3\xbcller)
-* mgr/dashboard: Rename pipe list -> join (`pr#31843 <https://github.com/ceph/ceph/pull/31843>`_, Volker Theile)
-* mgr/dashboard: Replace IP address validation with Python standard library functions (`pr#26184 <https://github.com/ceph/ceph/pull/26184>`_, Ashish Singh)
-* mgr/dashboard: Replace ng2-tree with angular-tree-component (`pr#33758 <https://github.com/ceph/ceph/pull/33758>`_, Tiago Melo)
-* mgr/dashboard: RGW bucket creation when no placement target received (`pr#29280 <https://github.com/ceph/ceph/pull/29280>`_, alfonsomthd)
-* mgr/dashboard: RGW port autodetection does not support Beast RGW frontend (`pr#33060 <https://github.com/ceph/ceph/pull/33060>`_, Volker Theile)
-* mgr/dashboard: RGW User quota validation is not working correctly (`pr#29132 <https://github.com/ceph/ceph/pull/29132>`_, Volker Theile)
-* mgr/dashboard: run e2e tests against prod build (jenkins job) (`pr#29198 <https://github.com/ceph/ceph/pull/29198>`_, alfonsomthd)
-* mgr/dashboard: run-frontend-e2e-tests.sh: allow user defined BASE_URL\xe2\x80\xa6 (`pr#32211 <https://github.com/ceph/ceph/pull/32211>`_, Alfonso Mart\xc3\xadnez)
-* mgr/dashboard: select placement target on RGW bucket creation (`pr#28764 <https://github.com/ceph/ceph/pull/28764>`_, alfonsomthd)
-* mgr/dashboard: Set RO as the default access_type for RGW NFS exports (`pr#30111 <https://github.com/ceph/ceph/pull/30111>`_, Tiago Melo)
-* mgr/dashboard: show checkboxes for booleans (`pr#32836 <https://github.com/ceph/ceph/pull/32836>`_, Tatjana Dehler)
-* mgr/dashboard: show correct RGW user system info (`pr#33206 <https://github.com/ceph/ceph/pull/33206>`_, Alfonso Mart\xc3\xadnez)
-* mgr/dashboard: Show iSCSI gateways status in the health page (`pr#29112 <https://github.com/ceph/ceph/pull/29112>`_, Ricardo Marques)
-* mgr/dashboard: smart: smart data read out on down osd causes error popup (`pr#32953 <https://github.com/ceph/ceph/pull/32953>`_, Volker Theile)
-* mgr/dashboard: Standby Dashboards dont handle all requests properly (`pr#30478 <https://github.com/ceph/ceph/pull/30478>`_, Volker Theile)
-* mgr/dashboard: Support ceph-iscsi config v9 (`pr#27448 <https://github.com/ceph/ceph/pull/27448>`_, Ricardo Marques)
-* mgr/dashboard: support multiple DriveGroups when creating OSDs (`pr#32678 <https://github.com/ceph/ceph/pull/32678>`_, Kiefer Chang)
-* mgr/dashboard: support removing OSDs in OSDs page (`pr#31997 <https://github.com/ceph/ceph/pull/31997>`_, Kiefer Chang)
-* mgr/dashboard: support setting password hashes (`pr#29138 <https://github.com/ceph/ceph/pull/29138>`_, Fabian Bonk)
-* mgr/dashboard: tasks: only unblock controller thread after TaskManager thread (`pr#30747 <https://github.com/ceph/ceph/pull/30747>`_, Ricardo Dias)
-* mgr/dashboard: Throw a more meaningful exception (`pr#32234 <https://github.com/ceph/ceph/pull/32234>`_, Volker Theile)
-* mgr/dashboard: tox.ini fixes (`pr#30779 <https://github.com/ceph/ceph/pull/30779>`_, Alfonso Mart\xc3\xadnez)
-* mgr/dashboard: UI fixes (`pr#33171 <https://github.com/ceph/ceph/pull/33171>`_, Avan Thakkar)
-* mgr/dashboard: Unable to set boolean values to false when default is true (`pr#31738 <https://github.com/ceph/ceph/pull/31738>`_, Ricardo Marques)
-* mgr/dashboard: unify button/URL actions naming (`issue#37337 <http://tracker.ceph.com/issues/37337>`_, `pr#26572 <https://github.com/ceph/ceph/pull/26572>`_, Ernesto Puerta)
-* mgr/dashboard: Unify the look of dashboard charts (`issue#39384 <http://tracker.ceph.com/issues/39384>`_, `pr#27681 <https://github.com/ceph/ceph/pull/27681>`_, Tiago Melo)
-* mgr/dashboard: update dashboard CODEOWNERShip (`pr#31193 <https://github.com/ceph/ceph/pull/31193>`_, Ernesto Puerta)
-* mgr/dashboard: Update tar to v4.4.8 (`pr#28092 <https://github.com/ceph/ceph/pull/28092>`_, Kefu Chai)
-* mgr/dashboard: update vstart to use new ssl port (`issue#26914 <http://tracker.ceph.com/issues/26914>`_, `pr#27269 <https://github.com/ceph/ceph/pull/27269>`_, Ernesto Puerta)
-* mgr/dashboard: Updated octopus image on 404 page (`pr#33920 <https://github.com/ceph/ceph/pull/33920>`_, Lenz Grimmer)
-* mgr/dashboard: Use booleanText pipe (`pr#26733 <https://github.com/ceph/ceph/pull/26733>`_, Volker Theile)
-* mgr/dashboard: Use default language when running npm run build (`pr#31563 <https://github.com/ceph/ceph/pull/31563>`_, Tiago Melo)
-* mgr/dashboard: Use ModalComponent in all modals (`pr#33858 <https://github.com/ceph/ceph/pull/33858>`_, Tiago Melo)
-* mgr/dashboard: Use Observable in auth.service (`pr#32084 <https://github.com/ceph/ceph/pull/32084>`_, Volker Theile)
-* mgr/dashboard: Use onCancel on any modal event (`pr#29402 <https://github.com/ceph/ceph/pull/29402>`_, Stephan M\xc3\xbcller)
-* mgr/dashboard: Validate iSCSI controls min/max value (`pr#28942 <https://github.com/ceph/ceph/pull/28942>`_, Ricardo Marques)
-* mgr/dashboard: Validate iSCSI images features (`pr#27135 <https://github.com/ceph/ceph/pull/27135>`_, Ricardo Marques)
-* mgr/dashboard: Validate `ceph-iscsi` config version (`pr#26835 <https://github.com/ceph/ceph/pull/26835>`_, Ricardo Marques)
-* mgr/dashboard: Various UI issues related to CephFS (`pr#29272 <https://github.com/ceph/ceph/pull/29272>`_, Volker Theile)
-* mgr/dashboard: Vertically align the Refresh label (`pr#29737 <https://github.com/ceph/ceph/pull/29737>`_, Tiago Melo)
-* mgr/dashboard: vstart: Fix /dev/tty No such device or address (`pr#31195 <https://github.com/ceph/ceph/pull/31195>`_, Volker Theile)
-* mgr/dashboard: wait for PG unknown state to be cleared (`pr#33013 <https://github.com/ceph/ceph/pull/33013>`_, Tatjana Dehler)
-* mgr/dashboard: Watch for pool pgs increase and decrease (`pr#28006 <https://github.com/ceph/ceph/pull/28006>`_, Ricardo Dias, Stephan M\xc3\xbcller)
-* mgr/modules: outsource SSL certificate creation (`pr#33550 <https://github.com/ceph/ceph/pull/33550>`_, Patrick Seidensal)
-* mgr/orch,cephadm: add timestamps to daemons and services (`pr#33728 <https://github.com/ceph/ceph/pull/33728>`_, Sage Weil)
-* mgr/orch: add --all-available-devices to orch apply osd (`pr#33990 <https://github.com/ceph/ceph/pull/33990>`_, Sage Weil)
-* mgr/orch: add missing CLI commands for grafana, alertmanager (`pr#33695 <https://github.com/ceph/ceph/pull/33695>`_, Sage Weil)
-* mgr/orch: associate addresses with hosts (`pr#33098 <https://github.com/ceph/ceph/pull/33098>`_, Sage Weil)
-* mgr/orch: ceph orchestrator ... -> ceph orch ... (`pr#33131 <https://github.com/ceph/ceph/pull/33131>`_, Sage Weil)
-* mgr/orch: ceph upgrade ... -> ceph orch upgrade ... (`pr#34046 <https://github.com/ceph/ceph/pull/34046>`_, Sage Weil)
-* mgr/orch: collapse SPEC and PLACEMENT columns in orch ls (`pr#33795 <https://github.com/ceph/ceph/pull/33795>`_, Sage Weil)
-* mgr/orch: dump service spec by name (`pr#33951 <https://github.com/ceph/ceph/pull/33951>`_, Michael Fritch)
-* mgr/orch: first phase of new cli (`pr#33212 <https://github.com/ceph/ceph/pull/33212>`_, Sage Weil)
-* mgr/orch: fix host ls (`pr#33486 <https://github.com/ceph/ceph/pull/33486>`_, Sage Weil)
-* mgr/orch: fix orch ls table spacing (`pr#33586 <https://github.com/ceph/ceph/pull/33586>`_, Sage Weil)
-* mgr/orch: fix ServiceSpec deserialization error (`pr#33779 <https://github.com/ceph/ceph/pull/33779>`_, Kiefer Chang)
-* mgr/orch: improve commandline parsing for update\\_\\* (`pr#31672 <https://github.com/ceph/ceph/pull/31672>`_, Joshua Schmid)
-* mgr/orch: include spec ref in ServiceDescription (`pr#33667 <https://github.com/ceph/ceph/pull/33667>`_, Sage Weil)
-* mgr/orch: make arg hostname, not host (`pr#33474 <https://github.com/ceph/ceph/pull/33474>`_, Sage Weil)
-* mgr/orch: new cli, phase 2 (`pr#33244 <https://github.com/ceph/ceph/pull/33244>`_, Sage Weil)
-* mgr/orch: pass unicode string to ipaddress.ip_network() (`pr#31755 <https://github.com/ceph/ceph/pull/31755>`_, Kefu Chai)
-* mgr/orch: PlacementSpec: add all_hosts property (`pr#33465 <https://github.com/ceph/ceph/pull/33465>`_, Sage Weil)
-* mgr/orch: Properly handle NotImplementedError (`pr#33914 <https://github.com/ceph/ceph/pull/33914>`_, Sebastian Wagner)
-* mgr/orch: remove ansible and deepsea (`pr#33126 <https://github.com/ceph/ceph/pull/33126>`_, Sage Weil)
-* mgr/orch: resurrect ServiceDescription, orch ls (`pr#33359 <https://github.com/ceph/ceph/pull/33359>`_, Sage Weil)
-* mgr/orch: take a single placement argument (`pr#33706 <https://github.com/ceph/ceph/pull/33706>`_, Sage Weil)
-* mgr/orchestrator,mgr/ssh: add host labels (`pr#31854 <https://github.com/ceph/ceph/pull/31854>`_, Sage Weil)
-* mgr/orchestrator: Add doc about how to use OrchestratorClientMixin (`pr#32893 <https://github.com/ceph/ceph/pull/32893>`_, Sebastian Wagner)
-* mgr/orchestrator: Add mypy static type checking (`pr#32010 <https://github.com/ceph/ceph/pull/32010>`_, Sebastian Wagner)
-* mgr/orchestrator: add optional format param for orchestrator host ls (`pr#31930 <https://github.com/ceph/ceph/pull/31930>`_, Kefu Chai)
-* mgr/orchestrator: add progress events to all orchestrators (`pr#26654 <https://github.com/ceph/ceph/pull/26654>`_, Sebastian Wagner)
-* mgr/orchestrator: Add simple scheduler (`pr#32003 <https://github.com/ceph/ceph/pull/32003>`_, Joshua Schmid)
-* mgr/orchestrator: addr is optional for constructing InventoryNode (`pr#33347 <https://github.com/ceph/ceph/pull/33347>`_, Kefu Chai)
-* mgr/orchestrator: device lights (`pr#26768 <https://github.com/ceph/ceph/pull/26768>`_, Sebastian Wagner, Sage Weil)
-* mgr/orchestrator: do not try to iterate through None (`pr#31705 <https://github.com/ceph/ceph/pull/31705>`_, Kefu Chai)
-* mgr/orchestrator: Document OSD replacement (`pr#29792 <https://github.com/ceph/ceph/pull/29792>`_, Sebastian Wagner)
-* mgr/orchestrator: fix orch host label rm help text (`pr#33585 <https://github.com/ceph/ceph/pull/33585>`_, Sage Weil)
-* mgr/orchestrator: Fix raise_if_exception for Python 3 (`pr#31015 <https://github.com/ceph/ceph/pull/31015>`_, Sebastian Wagner)
-* mgr/orchestrator: fix refs property of progresses (`pr#30197 <https://github.com/ceph/ceph/pull/30197>`_, Kiefer Chang)
-* mgr/orchestrator: fix `ceph orch apply -i` + yaml cleanup + Completion cleanup (`pr#34001 <https://github.com/ceph/ceph/pull/34001>`_, Sebastian Wagner)
-* mgr/orchestrator: functools.partial doesnt work for methods (`pr#33432 <https://github.com/ceph/ceph/pull/33432>`_, Sebastian Wagner)
-* mgr/orchestrator: get_hosts return `HostSpec` instead of `InventoryDevice` (`pr#33258 <https://github.com/ceph/ceph/pull/33258>`_, Sebastian Wagner)
-* mgr/orchestrator: Make Completions composable (`pr#30262 <https://github.com/ceph/ceph/pull/30262>`_, Sebastian Wagner, Tim Serong)
-* mgr/orchestrator: make hosts and label args consistent (`pr#32253 <https://github.com/ceph/ceph/pull/32253>`_, Sage Weil)
-* mgr/orchestrator: Raise more expressive Error, if completion already \xe2\x80\xa6 (`pr#32270 <https://github.com/ceph/ceph/pull/32270>`_, Sebastian Wagner)
-* mgr/orchestrator: raise_if_exception: Add exception type to message (`pr#32574 <https://github.com/ceph/ceph/pull/32574>`_, Sebastian Wagner)
-* mgr/orchestrator: Remove `(add|test|remove)_stateful_service_rule` (`pr#26772 <https://github.com/ceph/ceph/pull/26772>`_, Sebastian Wagner)
-* mgr/orchestrator: set node labels to empty list if none specified (`pr#31914 <https://github.com/ceph/ceph/pull/31914>`_, Tim Serong)
-* mgr/orchestrator: Split \\*_stateless_service and add get_feature_set (`pr#29063 <https://github.com/ceph/ceph/pull/29063>`_, Sebastian Wagner)
-* mgr/orchestrator: Substitute `hostname` for `nodename`, globally (`pr#33467 <https://github.com/ceph/ceph/pull/33467>`_, Sebastian Wagner)
-* mgr/orchestrator: unify StatelessServiceSpec and StatefulServiceSpec (`pr#33175 <https://github.com/ceph/ceph/pull/33175>`_, Sebastian Wagner)
-* mgr/orchestrator: use deepcopy for copying exceptions (`pr#32881 <https://github.com/ceph/ceph/pull/32881>`_, Kefu Chai)
-* mgr/orchestrator: Use `pickle` to pass exceptions across sub-interpreters (`pr#33179 <https://github.com/ceph/ceph/pull/33179>`_, Sebastian Wagner)
-* mgr/orchestrator_cli: clean up device ls table (`pr#32279 <https://github.com/ceph/ceph/pull/32279>`_, Sage Weil)
-* mgr/orchestrator_cli: Fix NFS (`pr#32272 <https://github.com/ceph/ceph/pull/32272>`_, Sebastian Wagner)
-* mgr/orchestrator_cli: improve service ls output, sorting (`pr#31539 <https://github.com/ceph/ceph/pull/31539>`_, Sage Weil)
-* mgr/orchestrator_cli: set type for orchestrator option (`pr#32189 <https://github.com/ceph/ceph/pull/32189>`_, Sage Weil)
-* mgr/orchestrator_cli: sort host list (`pr#33370 <https://github.com/ceph/ceph/pull/33370>`_, Sage Weil)
-* mgr/orchestrator_cli: _update_mons require host spec only (`pr#32499 <https://github.com/ceph/ceph/pull/32499>`_, Sebastian Wagner)
-* mgr/progress/module.py: s/events/_events/ (`pr#29625 <https://github.com/ceph/ceph/pull/29625>`_, Kamoltat (Junior) Sirivadhna)
-* mgr/rook: Add caching for the Dashboard (`pr#29131 <https://github.com/ceph/ceph/pull/29131>`_, Sebastian Wagner, Paul Cuzner)
-* mgr/rook: Added missing `rgw` daemons in `service ls` (`issue#39171 <http://tracker.ceph.com/issues/39171>`_, `pr#27491 <https://github.com/ceph/ceph/pull/27491>`_, Sebastian Wagner)
-* mgr/rook: Added Mypy static type checking (`pr#32127 <https://github.com/ceph/ceph/pull/32127>`_, Sebastian Wagner)
-* mgr/rook: Fix creation of bluestore OSDs (`issue#39062 <http://tracker.ceph.com/issues/39062>`_, `pr#27289 <https://github.com/ceph/ceph/pull/27289>`_, Sebastian Wagner)
-* mgr/rook: Fix error creating OSDs (`pr#33176 <https://github.com/ceph/ceph/pull/33176>`_, Juan Miguel Olmo Mart\xc3\xadnez)
-* mgr/rook: Fix Python 2 regression (`issue#39250 <http://tracker.ceph.com/issues/39250>`_, `pr#27516 <https://github.com/ceph/ceph/pull/27516>`_, Sebastian Wagner)
-* mgr/rook: Fix RGW creation (`issue#39158 <http://tracker.ceph.com/issues/39158>`_, `pr#27462 <https://github.com/ceph/ceph/pull/27462>`_, Sebastian Wagner)
-* mgr/rook: misc fixes for orch ps (`pr#33868 <https://github.com/ceph/ceph/pull/33868>`_, Sage Weil)
-* mgr/rook: provide full path for devices names in inventory (`pr#32654 <https://github.com/ceph/ceph/pull/32654>`_, Sage Weil)
-* mgr/rook: Remove support for Rook older than v0.9 (`issue#39278 <http://tracker.ceph.com/issues/39278>`_, `pr#27556 <https://github.com/ceph/ceph/pull/27556>`_, Sebastian Wagner)
-* mgr/rook: Support other system namespaces (`issue#38799 <http://tracker.ceph.com/issues/38799>`_, `pr#27290 <https://github.com/ceph/ceph/pull/27290>`_, Sebastian Wagner)
-* mgr/ssh/tests: fix RGWSpec test (`pr#31983 <https://github.com/ceph/ceph/pull/31983>`_, Sage Weil)
-* mgr/ssh: add per-service operations: start, stop, restart, redeploy (`pr#31292 <https://github.com/ceph/ceph/pull/31292>`_, Sage Weil)
-* mgr/ssh: add TemporaryDirectory impl for py2 compat (`pr#31835 <https://github.com/ceph/ceph/pull/31835>`_, Sage Weil)
-* mgr/ssh: allow passing LV to orchestrator osd create (`pr#31512 <https://github.com/ceph/ceph/pull/31512>`_, Sage Weil)
-* mgr/ssh: annotate object representation (`pr#31602 <https://github.com/ceph/ceph/pull/31602>`_, Joshua Schmid)
-* mgr/ssh: cache service inventory (`pr#31385 <https://github.com/ceph/ceph/pull/31385>`_, Sage Weil)
-* mgr/ssh: deploy and remove rgw daemons (`pr#31303 <https://github.com/ceph/ceph/pull/31303>`_, Sage Weil)
-* mgr/ssh: deploy rbd-mirror daemons (`pr#31493 <https://github.com/ceph/ceph/pull/31493>`_, Sage Weil)
-* mgr/ssh: fix redeploy (`pr#31613 <https://github.com/ceph/ceph/pull/31613>`_, Sage Weil)
-* mgr/ssh: fix service_action, remove_osds (`pr#31952 <https://github.com/ceph/ceph/pull/31952>`_, Sage Weil)
-* mgr/ssh: Fix various Python issues (`pr#31524 <https://github.com/ceph/ceph/pull/31524>`_, Volker Theile)
-* mgr/ssh: Ignore ssh-config file (`pr#31710 <https://github.com/ceph/ceph/pull/31710>`_, Volker Theile)
-* mgr/ssh: implement blink_device_light (`pr#31438 <https://github.com/ceph/ceph/pull/31438>`_, Sage Weil)
-* mgr/ssh: implement service ls (`pr#31169 <https://github.com/ceph/ceph/pull/31169>`_, Sage Weil)
-* mgr/ssh: improve service ls (`pr#31828 <https://github.com/ceph/ceph/pull/31828>`_, Sage Weil)
-* mgr/ssh: Install SSH public key in Vagrantfile box fails (`pr#31519 <https://github.com/ceph/ceph/pull/31519>`_, Volker Theile)
-* mgr/ssh: optionally specify service names (`pr#31537 <https://github.com/ceph/ceph/pull/31537>`_, Sage Weil)
-* mgr/ssh: packaged-ceph-daemon mode; ssh key mgmt (`pr#31698 <https://github.com/ceph/ceph/pull/31698>`_, Sage Weil)
-* mgr/ssh: Port raising exceptions from completion handlers to Py2 (`pr#31940 <https://github.com/ceph/ceph/pull/31940>`_, Sebastian Wagner)
-* mgr/ssh: raise RuntimeError when ceph-daemon invocation fails (`pr#31420 <https://github.com/ceph/ceph/pull/31420>`_, Sage Weil)
-* mgr/ssh: remove superfluous parameters (`pr#31462 <https://github.com/ceph/ceph/pull/31462>`_, Joshua Schmid)
-* mgr/ssh: set up dummy known_hosts file (`pr#31721 <https://github.com/ceph/ceph/pull/31721>`_, Sage Weil)
-* mgr/ssh: take IP, CIDR, or addrvec for new mon(s) (`pr#31505 <https://github.com/ceph/ceph/pull/31505>`_, Sage Weil)
-* mgr/ssh: upgrade check command (`pr#31827 <https://github.com/ceph/ceph/pull/31827>`_, Sage Weil)
-* mgr/ssh: `test_mon_update` needs to set a mon name (`pr#31933 <https://github.com/ceph/ceph/pull/31933>`_, Sebastian Wagner)
-* mgr/telemetry: anonymizing smartctl report itself (`pr#33029 <https://github.com/ceph/ceph/pull/33029>`_, Yaarit Hatuka)
-* mgr/telemetry: dict.pop() errs on nonexistent key (`pr#30854 <https://github.com/ceph/ceph/pull/30854>`_, Dan Mick)
-* mgr/telemetry: fix log typo (`pr#31984 <https://github.com/ceph/ceph/pull/31984>`_, Sage Weil)
-* mgr/test_orchestrator: Allow initializing dummy data (`pr#29595 <https://github.com/ceph/ceph/pull/29595>`_, Kiefer Chang)
-* mgr/test_orchestrator: fix tests (`pr#33541 <https://github.com/ceph/ceph/pull/33541>`_, Sage Weil)
-* mgr/test_orchestrator: Fix TestWriteCompletion object has no attribute id (`pr#27607 <https://github.com/ceph/ceph/pull/27607>`_, Sebastian Wagner)
-* mgr/test_orchestrator: fix update_mgrs assert (`pr#32417 <https://github.com/ceph/ceph/pull/32417>`_, Sage Weil)
-* mgr/volumes: add arg to fs volume create for mds daemons placement (`pr#33441 <https://github.com/ceph/ceph/pull/33441>`_, Daniel-Pivonka)
-* mgr: Add get_rates_from_data to mgr_util.py (`pr#28603 <https://github.com/ceph/ceph/pull/28603>`_, Stephan M\xc3\xbcller)
-* mgr: add rbd profiles to support rbd_support module commands (`pr#30912 <https://github.com/ceph/ceph/pull/30912>`_, Jason Dillaman)
-* mgr: better error handling when reading option (`pr#32730 <https://github.com/ceph/ceph/pull/32730>`_, Kefu Chai)
-* mgr: ceph fs status support json format (`pr#30985 <https://github.com/ceph/ceph/pull/30985>`_, Erqi Chen)
-* mgr: change perf-counter precision to float (`pr#30400 <https://github.com/ceph/ceph/pull/30400>`_, Ernesto Puerta)
-* mgr: check for unicode passed to set_health_checks() (`pr#29117 <https://github.com/ceph/ceph/pull/29117>`_, Kefu Chai)
-* mgr: cleanup idle debug log at level 4 (`pr#29164 <https://github.com/ceph/ceph/pull/29164>`_, Sebastian Wagner)
-* mgr: close restful socket after exec (`pr#32396 <https://github.com/ceph/ceph/pull/32396>`_, liushi)
-* mgr: Configure Py root logger for Mgr modules (`pr#27069 <https://github.com/ceph/ceph/pull/27069>`_, Volker Theile)
-* mgr: do not reset reported if a new metric is not collected (`pr#30285 <https://github.com/ceph/ceph/pull/30285>`_, Ilsoo Byun)
-* mgr: drop session with Ceph daemon when not ready (`pr#31899 <https://github.com/ceph/ceph/pull/31899>`_, Patrick Donnelly)
-* mgr: fix a few bugs with teh pgp_num adjustments (`pr#27875 <https://github.com/ceph/ceph/pull/27875>`_, Sage Weil)
-* mgr: fix ceph native option value types (`pr#29855 <https://github.com/ceph/ceph/pull/29855>`_, Sage Weil)
-* mgr: fix debug typo (`pr#31900 <https://github.com/ceph/ceph/pull/31900>`_, Patrick Donnelly)
-* mgr: fix errors on using a reference in a Lambda function (`pr#31786 <https://github.com/ceph/ceph/pull/31786>`_, Willem Jan Withagen)
-* mgr: fix reporting of per-module logging options to mon (`pr#33897 <https://github.com/ceph/ceph/pull/33897>`_, Sage Weil)
-* mgr: fix weird health-alert daemon key (`pr#30617 <https://github.com/ceph/ceph/pull/30617>`_, xie xingguo)
-* mgr: handle race with finisher after shutdown (`pr#31620 <https://github.com/ceph/ceph/pull/31620>`_, Patrick Donnelly)
-* mgr: Improve internal python to c++ interface (`pr#32554 <https://github.com/ceph/ceph/pull/32554>`_, David Zafman)
-* mgr: install tox deps from wheelhouse (`pr#30034 <https://github.com/ceph/ceph/pull/30034>`_, Kefu Chai)
-* mgr: mgr, osd: osd df by pool (`pr#28629 <https://github.com/ceph/ceph/pull/28629>`_, xie xingguo)
-* mgr: mgr/ActivePyModules: behave if a module queries a devid that does not exist (`pr#31291 <https://github.com/ceph/ceph/pull/31291>`_, Sage Weil)
-* mgr: mgr/ActivePyModules: drop GIL while we wait for mon reply in set_store, set_config (`issue#39335 <http://tracker.ceph.com/issues/39335>`_, `pr#27619 <https://github.com/ceph/ceph/pull/27619>`_, Sage Weil)
-* mgr: mgr/ActivePyModules: handle_command - fix broken lock (`issue#39235 <http://tracker.ceph.com/issues/39235>`_, `pr#27485 <https://github.com/ceph/ceph/pull/27485>`_, xie xingguo)
-* mgr: mgr/balancer: avoid pulling pg_dump twice (`pr#32266 <https://github.com/ceph/ceph/pull/32266>`_, xie xingguo)
-* mgr: mgr/balancer: eliminate usage of MS infrastructure for upmap mode (`pr#32289 <https://github.com/ceph/ceph/pull/32289>`_, xie xingguo)
-* mgr: mgr/balancer: enable pg_upmap cli for future use (`pr#30560 <https://github.com/ceph/ceph/pull/30560>`_, xie xingguo)
-* mgr: mgr/balancer: fix fudge (`pr#27994 <https://github.com/ceph/ceph/pull/27994>`_, xie xingguo)
-* mgr: mgr/balancer: fix initial weight-set value for newly created osds (`pr#28251 <https://github.com/ceph/ceph/pull/28251>`_, xie xingguo)
-* mgr: mgr/balancer: Python 3 compatibility fix (`issue#38831 <http://tracker.ceph.com/issues/38831>`_, `pr#27076 <https://github.com/ceph/ceph/pull/27076>`_, Marius Schiffer)
-* mgr: mgr/balancer: python3 compatibility issue (`pr#30987 <https://github.com/ceph/ceph/pull/30987>`_, Mykola Golub)
-* mgr: mgr/balancer: upmap_max_iterations -> upmap_max_optimizations; behave as it is per pool (`pr#30591 <https://github.com/ceph/ceph/pull/30591>`_, xie xingguo)
-* mgr: mgr/BaseMgrModule: tolerate Int or Long for health count (`pr#29806 <https://github.com/ceph/ceph/pull/29806>`_, Sage Weil)
-* mgr: mgr/BaseMgrModule: use PyInt_Check() to compatible with py2 (`pr#29831 <https://github.com/ceph/ceph/pull/29831>`_, Kefu Chai)
-* mgr: mgr/BaseMgrStandbyModule: drop GIL in ceph_get_module_option() (`pr#30625 <https://github.com/ceph/ceph/pull/30625>`_, Kefu Chai)
-* mgr: mgr/cephadm: custom certificates for Grafana deployment (`pr#33614 <https://github.com/ceph/ceph/pull/33614>`_, Patrick Seidensal)
-* mgr: mgr/cephadm: support (point release) upgrades (`pr#32006 <https://github.com/ceph/ceph/pull/32006>`_, Sage Weil)
-* mgr: mgr/crash: Calculate and add stack_sig to metadata (`pr#31394 <https://github.com/ceph/ceph/pull/31394>`_, Dan Mick)
-* mgr: mgr/crash: fix crash ls[-new] sorting (`pr#31973 <https://github.com/ceph/ceph/pull/31973>`_, Sage Weil)
-* mgr: mgr/DaemonServer: handle caps more carefully (`pr#26903 <https://github.com/ceph/ceph/pull/26903>`_, xie xingguo)
-* mgr: mgr/DaemonServer: handle_conf_change - fix broken locking (`issue#38899 <http://tracker.ceph.com/issues/38899>`_, `pr#27184 <https://github.com/ceph/ceph/pull/27184>`_, xie xingguo)
-* mgr: mgr/DaemonServer: refactor pgp_num changes throttling (`pr#27891 <https://github.com/ceph/ceph/pull/27891>`_, Kefu Chai)
-* mgr: mgr/DaemonServer: safe-to-destroy - do not consider irrelevant pgs (`pr#27962 <https://github.com/ceph/ceph/pull/27962>`_, xie xingguo)
-* mgr: mgr/DaemonServer: skip adjusting pgp_num when merging is in-progress (`pr#30139 <https://github.com/ceph/ceph/pull/30139>`_, xie xingguo)
-* mgr: mgr/dashboard: Do not default to admin as Admin Resource (`issue#39338 <http://tracker.ceph.com/issues/39338>`_, `pr#27626 <https://github.com/ceph/ceph/pull/27626>`_, Wido den Hollander)
-* mgr: mgr/dashboard: Handle always-on Ceph Manager modules correctly (`pr#30142 <https://github.com/ceph/ceph/pull/30142>`_, Volker Theile)
-* mgr: mgr/dashboard: integrate progress mgr module events into dashboard tasks list (`pr#29048 <https://github.com/ceph/ceph/pull/29048>`_, Ricardo Dias)
-* mgr: mgr/dashboard: Manager should complain about wrong dashboard certificate (`pr#27036 <https://github.com/ceph/ceph/pull/27036>`_, Volker Theile)
-* mgr: mgr/deepsea: return ganesha and iscsi endpoint URLs (`pr#27336 <https://github.com/ceph/ceph/pull/27336>`_, Tim Serong)
-* mgr: mgr/deepsea: use ceph_volume output in get_inventory() (`pr#26966 <https://github.com/ceph/ceph/pull/26966>`_, Tim Serong)
-* mgr: mgr/devicehealth: ensure we dont store empty objects (`pr#31474 <https://github.com/ceph/ceph/pull/31474>`_, Sage Weil)
-* mgr: mgr/devicehealth: Fix python 3 incompatiblity (`issue#38939 <http://tracker.ceph.com/issues/38939>`_, `pr#27172 <https://github.com/ceph/ceph/pull/27172>`_, Marius Schiffer)
-* mgr: mgr/devicehealth: set default monitoring to on (`pr#33091 <https://github.com/ceph/ceph/pull/33091>`_, Sage Weil, Yaarit Hatuka)
-* mgr: mgr/diskprediction: Add diskprediction local plugin dependencies (`pr#25530 <https://github.com/ceph/ceph/pull/25530>`_, Rick Chen)
-* mgr: mgr/diskprediction_cloud: Correct base64 encode translate table (`issue#38848 <http://tracker.ceph.com/issues/38848>`_, `pr#27113 <https://github.com/ceph/ceph/pull/27113>`_, Rick Chen)
-* mgr: mgr/diskprediction_cloud: refactor timeout() decorator (`pr#31176 <https://github.com/ceph/ceph/pull/31176>`_, Kefu Chai)
-* mgr: mgr/hello: some clean up and modernization (`pr#29514 <https://github.com/ceph/ceph/pull/29514>`_, Sage Weil)
-* mgr: mgr/influx: try to call close() (`issue#40174 <http://tracker.ceph.com/issues/40174>`_, `pr#28427 <https://github.com/ceph/ceph/pull/28427>`_, Kefu Chai)
-* mgr: mgr/insights: fix prune-health-history (`pr#32973 <https://github.com/ceph/ceph/pull/32973>`_, Sage Weil)
-* mgr: mgr/k8sevents: Add mgr module for kubernetes event integration (`pr#29520 <https://github.com/ceph/ceph/pull/29520>`_, Paul Cuzner)
-* mgr: mgr/k8sevents: Add support for remote kubernetes (`pr#30482 <https://github.com/ceph/ceph/pull/30482>`_, Paul Cuzner)
-* mgr: mgr/Mgr: kill redundant sub_unwant call (`pr#26950 <https://github.com/ceph/ceph/pull/26950>`_, xie xingguo)
-* mgr: mgr/MgrMonitor: print pending.always_on_modules before updating it (`pr#29917 <https://github.com/ceph/ceph/pull/29917>`_, Kefu Chai)
-* mgr: mgr/orch: logging - handle lists output (`pr#32879 <https://github.com/ceph/ceph/pull/32879>`_, Shyukri Shyukriev)
-* mgr: mgr/orchestrator: Add cache for Inventory and Services (`pr#28213 <https://github.com/ceph/ceph/pull/28213>`_, Tim Serong, Sebastian Wagner)
-* mgr: mgr/orchestrator_cli: pass default value to req=False params (`pr#31314 <https://github.com/ceph/ceph/pull/31314>`_, Kefu Chai)
-* mgr: mgr/osd_support: new module for osd utility (`pr#32677 <https://github.com/ceph/ceph/pull/32677>`_, Joshua Schmid)
-* mgr: mgr/pg_autoscaler: calculate pool_pg_target using pool size (`pr#32592 <https://github.com/ceph/ceph/pull/32592>`_, Dan van der Ster)
-* mgr: mgr/pg_autoscaler: fix pool_logical_used (`pr#29986 <https://github.com/ceph/ceph/pull/29986>`_, Ansgar Jazdzewski)
-* mgr: mgr/pg_autoscaler: Fix python3 incompatibility (`issue#38626 <http://tracker.ceph.com/issues/38626>`_, `pr#27079 <https://github.com/ceph/ceph/pull/27079>`_, Marius Schiffer)
-* mgr: mgr/pg_autoscaler: fix race with pool deletion (`pr#29807 <https://github.com/ceph/ceph/pull/29807>`_, Sage Weil)
-* mgr: mgr/pg_autoscaler: treat target ratios as weights (`pr#33035 <https://github.com/ceph/ceph/pull/33035>`_, Josh Durgin)
-* mgr: mgr/progress & mgr/pg_autoscaler: Added Pg Autoscaler Event (`pr#29035 <https://github.com/ceph/ceph/pull/29035>`_, Kamoltat (Junior) Sirivadhna)
-* mgr: mgr/progress: Add integration to pybind/mgr/tox.ini (`pr#32985 <https://github.com/ceph/ceph/pull/32985>`_, Sebastian Wagner)
-* mgr: mgr/progress: Add recovery event when OSD marked in (`pr#28498 <https://github.com/ceph/ceph/pull/28498>`_, Kamoltat (Junior) Sirivadhna)
-* mgr: mgr/progress: added the time an event has been in progress (`pr#28907 <https://github.com/ceph/ceph/pull/28907>`_, Kamoltat (Junior) Sirivadhna)
-* mgr: mgr/progress: Bug fix complete event when OSD marked in (`pr#28695 <https://github.com/ceph/ceph/pull/28695>`_, Kamoltat (Junior) Sirivadhna)
-* mgr: mgr/progress: clamp pg recovery ratio to 0 (`pr#29126 <https://github.com/ceph/ceph/pull/29126>`_, xie xingguo)
-* mgr: mgr/progress: estimated remaining time for events (`pr#30615 <https://github.com/ceph/ceph/pull/30615>`_, xie xingguo)
-* mgr: mgr/progress: Look at PG state when PG epoch >= OSDMap epoch (`pr#28368 <https://github.com/ceph/ceph/pull/28368>`_, Kamoltat (Junior) Sirivadhna)
-* mgr: mgr/progress: remove since from duration string (`pr#31007 <https://github.com/ceph/ceph/pull/31007>`_, Kefu Chai)
-* mgr: mgr/prometheus: Add mgr metdata to prometheus exporter module (`pr#28372 <https://github.com/ceph/ceph/pull/28372>`_, Paul Cuzner)
-* mgr: mgr/prometheus: assign a value to osd_dev_node when obj_store is not filestore or bluestore (`pr#30534 <https://github.com/ceph/ceph/pull/30534>`_, jiahuizeng)
-* mgr: mgr/prometheus: Cast collect_timeout (scrape_interval) to float (`pr#29382 <https://github.com/ceph/ceph/pull/29382>`_, Ben Meekhof)
-* mgr: mgr/prometheus: Fix KeyError in get_mgr_status (`pr#30421 <https://github.com/ceph/ceph/pull/30421>`_, Sebastian Wagner)
-* mgr: mgr/prometheus: replace whitespaces in metrics names (`pr#27722 <https://github.com/ceph/ceph/pull/27722>`_, Alfonso Mart\xc3\xadnez)
-* mgr: mgr/PyModule: correctly remove config options (`pr#31807 <https://github.com/ceph/ceph/pull/31807>`_, Tim Serong)
-* mgr: mgr/PyModuleRegistry: log error if we cant find any modules to load (`pr#28055 <https://github.com/ceph/ceph/pull/28055>`_, Tim Serong)
-* mgr: mgr/restful: allow shutdown before weve fully started up (`pr#32004 <https://github.com/ceph/ceph/pull/32004>`_, Sage Weil)
-* mgr: mgr/restful: do not use filter() for list (`pr#27925 <https://github.com/ceph/ceph/pull/27925>`_, Kefu Chai)
-* mgr: mgr/restful: jsonify lists instead of maps (`pr#32421 <https://github.com/ceph/ceph/pull/32421>`_, Kefu Chai)
-* mgr: mgr/restful: requests api adds support multiple commands (`pr#31152 <https://github.com/ceph/ceph/pull/31152>`_, Duncan Chiang)
-* mgr: mgr/status: fix ceph osd status ZeroDivisionError (`pr#28797 <https://github.com/ceph/ceph/pull/28797>`_, simon gao)
-* mgr: mgr/telemetry: add last_upload to status (`pr#33125 <https://github.com/ceph/ceph/pull/33125>`_, Yaarit Hatuka)
-* mgr: mgr/telemetry: change crash dict to a list (`pr#27631 <https://github.com/ceph/ceph/pull/27631>`_, Dan Mick)
-* mgr: mgr/telemetry: channels (`pr#28847 <https://github.com/ceph/ceph/pull/28847>`_, Sage Weil)
-* mgr: mgr/telemetry: check get_metadata return val (`pr#33051 <https://github.com/ceph/ceph/pull/33051>`_, Yaarit Hatuka)
-* mgr: mgr/telemetry: clear the event after being awaken by it (`pr#29546 <https://github.com/ceph/ceph/pull/29546>`_, Kefu Chai)
-* mgr: mgr/telemetry: exclude hostname field in crash reports (`pr#27693 <https://github.com/ceph/ceph/pull/27693>`_, Sage Weil)
-* mgr: mgr/telemetry: fix and document proxy usage (`pr#33575 <https://github.com/ceph/ceph/pull/33575>`_, Lars Marowsky-Bree)
-* mgr: mgr/telemetry: fix device serial number anonymization (`pr#32492 <https://github.com/ceph/ceph/pull/32492>`_, Yaarit Hatuka)
-* mgr: mgr/telemetry: include any config options that are customized (`pr#29334 <https://github.com/ceph/ceph/pull/29334>`_, Sage Weil)
-* mgr: mgr/telemetry: include device health telemetry (`pr#30724 <https://github.com/ceph/ceph/pull/30724>`_, Sage Weil)
-* mgr: mgr/telemetry: re-opt-in when telemetry content changes; nag on major releases (`pr#29337 <https://github.com/ceph/ceph/pull/29337>`_, Sage Weil)
-* mgr: mgr/telemetry: salt osd ids too (`pr#29358 <https://github.com/ceph/ceph/pull/29358>`_, Sage Weil)
-* mgr: mgr/telemetry: specify license when opting in (`pr#29340 <https://github.com/ceph/ceph/pull/29340>`_, Sage Weil)
-* mgr: mgr/volumes: do not import unused module (`pr#28875 <https://github.com/ceph/ceph/pull/28875>`_, Kefu Chai)
-* mgr: mgr/zabbix Added pools discovery and per-pool statistics (`pr#26152 <https://github.com/ceph/ceph/pull/26152>`_, Dmitriy Rabotjagov)
-* mgr: mgr/zabbix: Adds possibility to send data to multiple zabbix servers (`issue#38409 <http://tracker.ceph.com/issues/38409>`_, `pr#26547 <https://github.com/ceph/ceph/pull/26547>`_, slivik, Jakub Sliva)
-* mgr: mgr/zabbix: encode string for Python 3 compatibility (`pr#28624 <https://github.com/ceph/ceph/pull/28624>`_, Nathan Cutler)
-* mgr: mgr/zabbix: Fix raw_bytes_used key name (`pr#28058 <https://github.com/ceph/ceph/pull/28058>`_, Dmitriy Rabotjagov)
-* mgr: mgr/zabbix: Fix typo in key name for PGs in backfill_wait state (`issue#39666 <http://tracker.ceph.com/issues/39666>`_, `pr#28057 <https://github.com/ceph/ceph/pull/28057>`_, Wido den Hollander)
-* mgr: missing lock release in DaemonServer::handle_report() (`issue#42169 <http://tracker.ceph.com/issues/42169>`_, `pr#30706 <https://github.com/ceph/ceph/pull/30706>`_, Venky Shankar)
-* mgr: module logging infrastructure (`pr#30961 <https://github.com/ceph/ceph/pull/30961>`_, Ricardo Dias)
-* mgr: more GIL fixes (`issue#39040 <http://tracker.ceph.com/issues/39040>`_, `pr#27280 <https://github.com/ceph/ceph/pull/27280>`_, xie xingguo)
-* mgr: pybind/mgr/balancer/module.py: add max/min info in stats_by_root (`pr#30432 <https://github.com/ceph/ceph/pull/30432>`_, Yang Honggang)
-* mgr: pybind/mgr/pg_autoscaler: implement shutdown method (`pr#31398 <https://github.com/ceph/ceph/pull/31398>`_, Patrick Donnelly)
-* mgr: pybind/mgr/restful: use dict.items() for py3 compatible (`pr#29356 <https://github.com/ceph/ceph/pull/29356>`_, Kefu Chai)
-* mgr: pybind/mgr: Cancel output color control (`pr#31427 <https://github.com/ceph/ceph/pull/31427>`_, Zheng Yin)
-* mgr: pybind/mgr: convert str to int using int() (`pr#27926 <https://github.com/ceph/ceph/pull/27926>`_, Kefu Chai)
-* mgr: pybind/mgr: Make it easier to create a Module instance without the mgr (`pr#31969 <https://github.com/ceph/ceph/pull/31969>`_, Sebastian Wagner)
-* mgr: pybind/mgr: Remove code duplication (`issue#40698 <http://tracker.ceph.com/issues/40698>`_, `pr#28986 <https://github.com/ceph/ceph/pull/28986>`_, Sebastian Wagner)
-* mgr: pyind/mgr: add mgr_module.py and mgr_util.py to mypy (`pr#32597 <https://github.com/ceph/ceph/pull/32597>`_, Sebastian Wagner)
-* mgr: Python cleanup and type check (`pr#31559 <https://github.com/ceph/ceph/pull/31559>`_, Volker Theile)
-* mgr: qa/mgr/progress: fix timeout error when waiting for osd in event (`pr#30095 <https://github.com/ceph/ceph/pull/30095>`_, Ricardo Dias)
-* mgr: re-enable mds `scrub status` info in ceph status (`issue#42835 <http://tracker.ceph.com/issues/42835>`_, `pr#32657 <https://github.com/ceph/ceph/pull/32657>`_, Venky Shankar)
-* mgr: Reduce logging noise when handling commands (`pr#29305 <https://github.com/ceph/ceph/pull/29305>`_, Sebastian Wagner)
-* mgr: Release GIL before calling OSDMap::calc_pg_upmaps() (`pr#31064 <https://github.com/ceph/ceph/pull/31064>`_, David Zafman)
-* mgr: remove unused variable pool_name (`pr#28340 <https://github.com/ceph/ceph/pull/28340>`_, Alex Wu)
-* mgr: restful: Expose perf counters (`pr#27885 <https://github.com/ceph/ceph/pull/27885>`_, Boris Ranto)
-* mgr: restful: Query nodes_by_id for items (`pr#31153 <https://github.com/ceph/ceph/pull/31153>`_, Boris Ranto)
-* mgr: return perf_counters data timestamps in nanosecs (`pr#28882 <https://github.com/ceph/ceph/pull/28882>`_, Ricardo Dias)
-* mgr: Revert mgr/DaemonServer: safe-to-destroy - do not consider irrelevant pgs (`pr#32203 <https://github.com/ceph/ceph/pull/32203>`_, xie xingguo)
-* mgr: set hostname in DeviceState::set_metadata() (`pr#30448 <https://github.com/ceph/ceph/pull/30448>`_, Kefu Chai)
-* mgr: simply exit on SIGINT or SIGTERM (`pr#32051 <https://github.com/ceph/ceph/pull/32051>`_, Sage Weil)
-* mgr: telemetry/server: misc fixes (`pr#29365 <https://github.com/ceph/ceph/pull/29365>`_, user.email, Sage Weil)
-* mgr: telemetry: misc scripts (`pr#29781 <https://github.com/ceph/ceph/pull/29781>`_, sage@newdream.net, Sage Weil)
-* mgr: templatize metrics collection interface (`pr#29214 <https://github.com/ceph/ceph/pull/29214>`_, Venky Shankar)
-* mgr: update hostname when we already have the daemon state from the same entity (`pr#33752 <https://github.com/ceph/ceph/pull/33752>`_, Kefu Chai)
-* mgr: use a struct for DaemonKey (`pr#30635 <https://github.com/ceph/ceph/pull/30635>`_, Kefu Chai)
-* mgr: use ipv4 default when ipv6 was disabled (`pr#28246 <https://github.com/ceph/ceph/pull/28246>`_, kungf)
-* mgr: use new MMgrCommand for CLI commands sent to mgr (`pr#30155 <https://github.com/ceph/ceph/pull/30155>`_, Sage Weil)
-* mgr: zabbix triggers never triggered due to wrong trigger function (`pr#26146 <https://github.com/ceph/ceph/pull/26146>`_, Sebastiaan Nijhuis)
-* mgr: _exit(0) from signal handler even if we are standby (`pr#31685 <https://github.com/ceph/ceph/pull/31685>`_, Sage Weil)
-* mon,rbd,tests: mon,test: silence warnings from GCC and test (`pr#28250 <https://github.com/ceph/ceph/pull/28250>`_, Kefu Chai)
-* mon,tests: qa/tasks: Fix ambiguous store_thrash, thrash_store (`issue#39159 <http://tracker.ceph.com/issues/39159>`_, `pr#27542 <https://github.com/ceph/ceph/pull/27542>`_, Jos Collin)
-* mon,tools: monmaptool: added --addv option to usage description (`pr#29307 <https://github.com/ceph/ceph/pull/29307>`_, Ricardo Dias)
-* mon/MonClient: fix mon tell to older mons (`pr#31121 <https://github.com/ceph/ceph/pull/31121>`_, Sage Weil)
-* mon/OSDMonitor.cc: Allow pool set target_max\\_(objects/bytes) with SI/IEC units (`pr#31010 <https://github.com/ceph/ceph/pull/31010>`_, Prashant D)
-* mon/OSDMonitor: osd add-no{up,down,in,out} - remove state checker (`pr#27605 <https://github.com/ceph/ceph/pull/27605>`_, xie xingguo)
-* mon/pgmap: fix bluestore alerts output (`pr#30342 <https://github.com/ceph/ceph/pull/30342>`_, Igor Fedotov)
-* mon: add ability to mute health alerts (`pr#29422 <https://github.com/ceph/ceph/pull/29422>`_, Sage Weil)
-* mon: add mon, osd, mds ok-to-stop and related commands (`pr#27146 <https://github.com/ceph/ceph/pull/27146>`_, Sage Weil)
-* mon: add `ceph osd info` to obtain info on osds rather than parsing `osd dump` (`pr#26724 <https://github.com/ceph/ceph/pull/26724>`_, Joao Eduardo Luis)
-* mon: allow running without a config file (`pr#30498 <https://github.com/ceph/ceph/pull/30498>`_, Joao Eduardo Luis)
-* mon: always enable pg_autoscaler (`pr#29072 <https://github.com/ceph/ceph/pull/29072>`_, Sage Weil)
-* mon: disable min pg per osd warning (`pr#30352 <https://github.com/ceph/ceph/pull/30352>`_, Sage Weil)
-* mon: Dont put session during feature change (`pr#32365 <https://github.com/ceph/ceph/pull/32365>`_, Brad Hubbard)
-* mon: dump json from sessions asok/tell command (`pr#32974 <https://github.com/ceph/ceph/pull/32974>`_, Sage Weil)
-* mon: elector: return after triggering a new election (`pr#32981 <https://github.com/ceph/ceph/pull/32981>`_, Greg Farnum)
-* mon: ensure prepare_failure() marks no_reply on op (`pr#28177 <https://github.com/ceph/ceph/pull/28177>`_, Joao Eduardo Luis)
-* mon: fix INCOMPAT_OCTOPUS feature number (`pr#27622 <https://github.com/ceph/ceph/pull/27622>`_, Sage Weil)
-* mon: fix misc asok commands (`pr#30859 <https://github.com/ceph/ceph/pull/30859>`_, Sage Weil, Patrick Donnelly)
-* mon: fix off-by-one rendering progress bar (`pr#28268 <https://github.com/ceph/ceph/pull/28268>`_, Sage Weil)
-* mon: fix tell command description (and ceph CLI help behavior) (`pr#33135 <https://github.com/ceph/ceph/pull/33135>`_, Sage Weil)
-* mon: fix tell to hybrid octopus/pre-octopus mons (`pr#31138 <https://github.com/ceph/ceph/pull/31138>`_, Sage Weil)
-* mon: fix/improve mon sync over small keys (`pr#31581 <https://github.com/ceph/ceph/pull/31581>`_, Sage Weil)
-* mon: Get session_map_lock before remove_session (`pr#33682 <https://github.com/ceph/ceph/pull/33682>`_, Xiaofei Cui)
-* mon: Improve health status for backfill_toofull and recovery_toofull (`pr#28204 <https://github.com/ceph/ceph/pull/28204>`_, David Zafman)
-* mon: Improvements to slow heartbeat health messages (`pr#32342 <https://github.com/ceph/ceph/pull/32342>`_, David Zafman)
-* mon: make ceph -s much  more concise (`pr#29493 <https://github.com/ceph/ceph/pull/29493>`_, Sage Weil)
-* mon: make compact tell command, and add deprecate/obsolete check for tell commands (`pr#31722 <https://github.com/ceph/ceph/pull/31722>`_, Kefu Chai)
-* mon: make mon_osd_down_out_subtree_limit update at runtime (`pr#27517 <https://github.com/ceph/ceph/pull/27517>`_, Sage Weil)
-* mon: mon/ConfigMonitor: make config reset idempotent (`pr#27155 <https://github.com/ceph/ceph/pull/27155>`_, xie xingguo)
-* mon: mon/ConfigMonitor: make num of config reset optional; allow target version 0 (`pr#27090 <https://github.com/ceph/ceph/pull/27090>`_, xie xingguo)
-* mon: mon/HealthMonitor: remove unused label (`pr#29749 <https://github.com/ceph/ceph/pull/29749>`_, Kefu Chai)
-* mon: mon/MonClient: weight-based mon selection (`pr#26940 <https://github.com/ceph/ceph/pull/26940>`_, xie xingguo)
-* mon: mon/Monitor: no need to create a local variable for capturing it (`pr#28744 <https://github.com/ceph/ceph/pull/28744>`_, Kefu Chai)
-* mon: mon/MonMap: always set mon priority; add it to dump (`pr#26975 <https://github.com/ceph/ceph/pull/26975>`_, xie xingguo)
-* mon: mon/OSDMonitor: crush node flags - two fixes; add tests (`pr#27719 <https://github.com/ceph/ceph/pull/27719>`_, xie xingguo)
-* mon: mon/OSDMonitor: fix off-by-one when updating new_last_in_change (`pr#28568 <https://github.com/ceph/ceph/pull/28568>`_, xie xingguo)
-* mon: mon/OSDMonitor: report pg[pgp]_num_target instead of pg[pgp]_num (`issue#40193 <http://tracker.ceph.com/issues/40193>`_, `pr#28490 <https://github.com/ceph/ceph/pull/28490>`_, xie xingguo)
-* mon: mon/OSDMonitor: trim not-longer-exist failure reporters (`pr#30200 <https://github.com/ceph/ceph/pull/30200>`_, NancySu05)
-* mon: mon/OSDMonitor: use initializer_list<> for {si,iec}_options (`pr#31175 <https://github.com/ceph/ceph/pull/31175>`_, Kefu Chai)
-* mon: mon/PGMap: fix incorrect pg_pool_sum when delete pool (`pr#31560 <https://github.com/ceph/ceph/pull/31560>`_, luo rixin)
-* mon: optionally bind to public_addrv (instead of public_addr or public_network) (`pr#31501 <https://github.com/ceph/ceph/pull/31501>`_, Sage Weil)
-* mon: paxos: empty pending_finishers before retrying any of committing\xe2\x80\xa6 (`issue#39484 <http://tracker.ceph.com/issues/39484>`_, `pr#27877 <https://github.com/ceph/ceph/pull/27877>`_, Greg Farnum)
-* mon: print FSMap regardless of file system count (`pr#32307 <https://github.com/ceph/ceph/pull/32307>`_, Patrick Donnelly)
-* mon: quiet devname noise (`pr#27313 <https://github.com/ceph/ceph/pull/27313>`_, Sage Weil)
-* mon: remove the restriction of address type in init_with_hosts (`pr#31691 <https://github.com/ceph/ceph/pull/31691>`_, Hao Xiong)
-* mon: Revert mon/OSDMonitor: report pg[pgp]_num_target instead of pg[pgp]_\xe2\x80\xa6 (`pr#28567 <https://github.com/ceph/ceph/pull/28567>`_, xie xingguo)
-* mon: set recovery_priority, pg_num_min, pg_autoscale_bias via fs new command (`pr#29180 <https://github.com/ceph/ceph/pull/29180>`_, Sage Weil)
-* mon: should not take non-tell commands as tell ones (`pr#32517 <https://github.com/ceph/ceph/pull/32517>`_, Kefu Chai)
-* mon: show no[deep-]scrub flags per pool in the status (`issue#38029 <http://tracker.ceph.com/issues/38029>`_, `pr#26488 <https://github.com/ceph/ceph/pull/26488>`_, Mohamad Gebai)
-* mon: show pool id in pool ls command (`issue#40287 <http://tracker.ceph.com/issues/40287>`_, `pr#28488 <https://github.com/ceph/ceph/pull/28488>`_, Chang Liu)
-* mon: Split Elector into message-passing and logic/state components (`pr#28727 <https://github.com/ceph/ceph/pull/28727>`_, Greg Farnum)
-* mon: stash newer map on bootstrap when addr doesnt match (`pr#33418 <https://github.com/ceph/ceph/pull/33418>`_, Sage Weil)
-* mon: take the mon lock in handle_conf_change (`issue#39625 <http://tracker.ceph.com/issues/39625>`_, `pr#28018 <https://github.com/ceph/ceph/pull/28018>`_, huangjun)
-* mon: use non-obsolete mon scrub cmd (`pr#32510 <https://github.com/ceph/ceph/pull/32510>`_, Patrick Donnelly)
-* mon:C_AckMarkedDown has not handled the Callback Arguments (`pr#29624 <https://github.com/ceph/ceph/pull/29624>`_, NancySu05)
-* monitoring: fix prometheus alert for full pools (`pr#32325 <https://github.com/ceph/ceph/pull/32325>`_, Thomas Kriechbaumer)
-* monitoring: fix RGW grafana chart Average GET/PUT Latencies (`pr#33839 <https://github.com/ceph/ceph/pull/33839>`_, Alfonso Mart\xc3\xadnez)
-* monitoring: restore lost fix for `pool full` alert (`pr#33655 <https://github.com/ceph/ceph/pull/33655>`_, Patrick Seidensal)
-* monitoring: SNMP OID per every Prometheus alert rule (`pr#27978 <https://github.com/ceph/ceph/pull/27978>`_, Volker Theile)
-* monitoring: wait before firing osd full alert (`pr#31711 <https://github.com/ceph/ceph/pull/31711>`_, Patrick Seidensal)
-* msg/async, v2: make the reset_recv_state() unconditional (`issue#40115 <http://tracker.ceph.com/issues/40115>`_, `pr#28453 <https://github.com/ceph/ceph/pull/28453>`_, Sage Weil, Radoslaw Zarzynski)
-* msg/async/AsyncConnection: optimize check loopback connection (`pr#26923 <https://github.com/ceph/ceph/pull/26923>`_, Jianpeng Ma)
-* msg/async/dpdk: destroy fd in do_request (`pr#32690 <https://github.com/ceph/ceph/pull/32690>`_, Chunsong Feng, luo rixin)
-* msg/async/dpdk: Fix build when DPDK enabled (`pr#33203 <https://github.com/ceph/ceph/pull/33203>`_, Jun Su)
-* msg/async/dpdk: fix compilation errors when WITH_DPDK=on (`pr#31840 <https://github.com/ceph/ceph/pull/31840>`_, Chunsong Feng)
-* msg/async/dpdk: fix complie errors from fix FTBFS (`pr#30086 <https://github.com/ceph/ceph/pull/30086>`_, yehu)
-* msg/async/dpdk: fix FTBFS (`pr#28763 <https://github.com/ceph/ceph/pull/28763>`_, Kefu Chai)
-* msg/async/dpdk: Fix infinite loop when sending packets (`pr#32691 <https://github.com/ceph/ceph/pull/32691>`_, Chunsong Feng, luo rixin)
-* msg/async/dpdk: fix SEGV caused by zero length packet (`pr#31876 <https://github.com/ceph/ceph/pull/31876>`_, Chunsong Feng)
-* msg/async/dpdk: Fix the overflow while parsing dpdk coremask (`pr#32173 <https://github.com/ceph/ceph/pull/32173>`_, Hu Ye, Chunsong Feng, luo rixin)
-* msg/async/DPDK: refactor set_rss_table to support DPDK 19.05 (`pr#32170 <https://github.com/ceph/ceph/pull/32170>`_, Chunsong Feng, luo rixin)
-* msg/async/EventEpoll: set EPOLLET flag on del_event() (`pr#26926 <https://github.com/ceph/ceph/pull/26926>`_, Roman Penyaev)
-* msg/async/ProtocolV1: avoid unnecessary bufferlist::swap (`pr#30125 <https://github.com/ceph/ceph/pull/30125>`_, Jianpeng Ma)
-* msg/async/ProtocolV2: make v2 work on rdma (`pr#27022 <https://github.com/ceph/ceph/pull/27022>`_, Jianpeng Ma)
-* msg/async/ProtocolV2: optimize check state by replace (`pr#26812 <https://github.com/ceph/ceph/pull/26812>`_, Jianpeng Ma)
-* msg/async/rdma: add an option for choosing different RoCE protocol (`pr#31517 <https://github.com/ceph/ceph/pull/31517>`_, Changcheng Liu)
-* msg/async/rdma: do not init mutex before lockdeps is ready (`pr#31532 <https://github.com/ceph/ceph/pull/31532>`_, Kefu Chai)
-* msg/async/rdma: fix memory leak (`pr#27574 <https://github.com/ceph/ceph/pull/27574>`_, Changcheng Liu)
-* msg/async/rdma: set/get silence warning (`pr#26581 <https://github.com/ceph/ceph/pull/26581>`_, Kefu Chai)
-* msg/async/rdma: unblock event center if the peer is down when connecting (`pr#31109 <https://github.com/ceph/ceph/pull/31109>`_, Peng Liu)
-* msg/async: add comments for commit 294c41f18adada6a (`pr#28667 <https://github.com/ceph/ceph/pull/28667>`_, Jianpeng Ma)
-* msg/async: add timeout for connections which are not ready (`issue#38493 <http://tracker.ceph.com/issues/38493>`_, `issue#37499 <http://tracker.ceph.com/issues/37499>`_, `pr#27337 <https://github.com/ceph/ceph/pull/27337>`_, xie xingguo)
-* msg/async: avoid creating unnecessary AsyncConnectionRef (`pr#27323 <https://github.com/ceph/ceph/pull/27323>`_, Patrick Donnelly)
-* msg/async: Dont dec(msgr_active_connections) if conn still in accept\xe2\x80\xa6 (`pr#29836 <https://github.com/ceph/ceph/pull/29836>`_, Jianpeng Ma)
-* msg/async: Don\t miss record l_msgr_running_recv_time if pendingRead\xe2\x80\xa6 (`pr#27734 <https://github.com/ceph/ceph/pull/27734>`_, Jianpeng Ma)
-* msg/async: drop zero_copy_read() & co from ConnectedSocket (`pr#28921 <https://github.com/ceph/ceph/pull/28921>`_, Radoslaw Zarzynski)
-* msg/async: fix typo in Errormessage (`pr#31825 <https://github.com/ceph/ceph/pull/31825>`_, Willem Jan Withagen)
-* msg/async: mark down local_connection before draining the stack (`pr#32732 <https://github.com/ceph/ceph/pull/32732>`_, Radoslaw Zarzynski)
-* msg/async: move submit_message() into send_to() (`pr#30883 <https://github.com/ceph/ceph/pull/30883>`_, Jianpeng Ma)
-* msg/async: narrow scope of AsyncMessenger::lock in fun connect_to (`pr#30840 <https://github.com/ceph/ceph/pull/30840>`_, Jianpeng Ma)
-* msg/async: No need lock for func _filter_addrs (`pr#31995 <https://github.com/ceph/ceph/pull/31995>`_, Jianpeng Ma)
-* msg/async: no-need set connection for Message (`pr#27766 <https://github.com/ceph/ceph/pull/27766>`_, Jianpeng Ma)
-* msg/async: open() should be called with connection locked (`pr#33015 <https://github.com/ceph/ceph/pull/33015>`_, Roman Penyaev)
-* msg/async: perform recv reset immediately if called inside EC (`pr#33742 <https://github.com/ceph/ceph/pull/33742>`_, Radoslaw Zarzynski)
-* msg/async: remove unsued code (`pr#30833 <https://github.com/ceph/ceph/pull/30833>`_, Jianpeng Ma)
-* msg/async: rename outcoming_bl -> outgoing_bl in AsyncConnection (`pr#30709 <https://github.com/ceph/ceph/pull/30709>`_, Radoslaw Zarzynski)
-* msg/async: reset the V1s session_security in proper EventCenter (`pr#32352 <https://github.com/ceph/ceph/pull/32352>`_, Radoslaw Zarzynski)
-* msg/async: resolve gcc warning (`pr#27414 <https://github.com/ceph/ceph/pull/27414>`_, Patrick Donnelly)
-* msg/async: skip repeat calc crc header in Message::encode (`pr#26534 <https://github.com/ceph/ceph/pull/26534>`_, Jianpeng Ma)
-* msg/async: update refcount and perf counter properly (`pr#31929 <https://github.com/ceph/ceph/pull/31929>`_, Jianpeng Ma)
-* msg/async: use faster clear method to delete containers (`pr#27324 <https://github.com/ceph/ceph/pull/27324>`_, Patrick Donnelly)
-* msg/Message: Remove used code about XioMessenger (`pr#28719 <https://github.com/ceph/ceph/pull/28719>`_, Jianpeng Ma)
-* msg: add func is_blackhole to reduce duplicated code (`pr#30356 <https://github.com/ceph/ceph/pull/30356>`_, Jianpeng Ma)
-* msg: add some anonymous connection infrastructure (`pr#30223 <https://github.com/ceph/ceph/pull/30223>`_, Sage Weil)
-* msg: default to debug_ms=0 (`pr#26936 <https://github.com/ceph/ceph/pull/26936>`_, Sage Weil)
-* msg: fix addr2 encoding for sockaddrs (`issue#40114 <http://tracker.ceph.com/issues/40114>`_, `pr#28379 <https://github.com/ceph/ceph/pull/28379>`_, Jeff Layton)
-* msg: fix comments in Messenger.h after the set -> std::set switch (`pr#30693 <https://github.com/ceph/ceph/pull/30693>`_, Radoslaw Zarzynski)
-* msg: output peer address when detecting bad CRCs (`issue#39367 <http://tracker.ceph.com/issues/39367>`_, `pr#27658 <https://github.com/ceph/ceph/pull/27658>`_, Greg Farnum)
-* msg: remove unused header file in Messenger.h (`pr#27086 <https://github.com/ceph/ceph/pull/27086>`_, Jianpeng Ma)
-* msg: remove xiomessenger (`pr#27021 <https://github.com/ceph/ceph/pull/27021>`_, Sage Weil)
-* msg: set_require_authorizer on messenger, not dispatcher (`pr#27832 <https://github.com/ceph/ceph/pull/27832>`_, Sage Weil)
-* orchestrator: usability fixes (`pr#33118 <https://github.com/ceph/ceph/pull/33118>`_, Yehuda Sadeh)
-* os/bluestore,comon,erasure-code: chmod -x source files (`pr#31179 <https://github.com/ceph/ceph/pull/31179>`_, Sage Weil)
-* os/bluestore: default bluestore_block_size 1T -> 100G (`pr#32043 <https://github.com/ceph/ceph/pull/32043>`_, Sage Weil)
-* os/kstore: do not cache in-fight stripes on read ops to avoid leaks (`issue#39665 <http://tracker.ceph.com/issues/39665>`_, `pr#32538 <https://github.com/ceph/ceph/pull/32538>`_, Chang Liu)
-* os/memstore, crimson/os: introduce memstore_debug_omit_block_device_write (`pr#28601 <https://github.com/ceph/ceph/pull/28601>`_, Radoslaw Zarzynski)
-* osd: a few fixes for the removed_snaps changes (`pr#28865 <https://github.com/ceph/ceph/pull/28865>`_, Sage Weil)
-* osd: accident of rollforward may need to mark pglog dirty (`issue#40403 <http://tracker.ceph.com/issues/40403>`_, `pr#28621 <https://github.com/ceph/ceph/pull/28621>`_, Zengran Zhang)
-* osd: add a copy-from2 operation that includes truncate\\_{seq,size} parameters (`pr#31728 <https://github.com/ceph/ceph/pull/31728>`_, Luis Henriques)
-* osd: add ceph osd stop <osd.nnn> command (`pr#27595 <https://github.com/ceph/ceph/pull/27595>`_, xie xingguo)
-* osd: add cls_cxx_map_remove_range() (`issue#19975 <http://tracker.ceph.com/issues/19975>`_, `pr#15183 <https://github.com/ceph/ceph/pull/15183>`_, Casey Bodley)
-* osd: add common smartctl output to JSON output (`pr#30408 <https://github.com/ceph/ceph/pull/30408>`_, Patrick Seidensal)
-* osd: add device_id to list_devices to help get smart info easily (`pr#29548 <https://github.com/ceph/ceph/pull/29548>`_, Song Shun)
-* osd: add duration field to dump_historic_ops method (`pr#28801 <https://github.com/ceph/ceph/pull/28801>`_, Deepika Upadhyay)
-* osd: add flag to prevent truncate_seq copy in copy-from operation (`pr#25374 <https://github.com/ceph/ceph/pull/25374>`_, Luis Henriques)
-* osd: add hdd and ssd variants for osd_recovery_max_active (`pr#28677 <https://github.com/ceph/ceph/pull/28677>`_, Sage Weil)
-* osd: add log information to record the cause of do_osd_ops failure (`issue#41210 <http://tracker.ceph.com/issues/41210>`_, `pr#29787 <https://github.com/ceph/ceph/pull/29787>`_, NancySu05)
-* osd: add osd_fast_shutdown option (default true) (`pr#31677 <https://github.com/ceph/ceph/pull/31677>`_, Sage Weil)
-* osd: Again remove deprecated full/nearfull from osdmap (`pr#32506 <https://github.com/ceph/ceph/pull/32506>`_, David Zafman)
-* osd: Allow 64-char hostname to be added as the host in CRUSH (`pr#32947 <https://github.com/ceph/ceph/pull/32947>`_, Michal Skalski)
-* osd: allow EC PGs to do recovery below min_size (`issue#18749 <http://tracker.ceph.com/issues/18749>`_, `pr#17619 <https://github.com/ceph/ceph/pull/17619>`_, Chang Liu, Greg Farnum)
-* osd: allow rados write ops to return data and error codes (`pr#30581 <https://github.com/ceph/ceph/pull/30581>`_, Sage Weil)
-* osd: always initialize local variable (`pr#29757 <https://github.com/ceph/ceph/pull/29757>`_, Kefu Chai)
-* osd: assert that write ops have result==0 and no payload (`pr#30191 <https://github.com/ceph/ceph/pull/30191>`_, Sage Weil)
-* osd: automatically repair replicated replica on pulling error (`issue#39101 <http://tracker.ceph.com/issues/39101>`_, `pr#26806 <https://github.com/ceph/ceph/pull/26806>`_, xie xingguo, David Zafman)
-* osd: avoid prep_object_replica_pushes() on clone object when head missing (`issue#39286 <http://tracker.ceph.com/issues/39286>`_, `pr#27575 <https://github.com/ceph/ceph/pull/27575>`_, Zengran Zhang)
-* osd: Better error message when OSD count is less than osd_pool_default_size (`issue#38617 <http://tracker.ceph.com/issues/38617>`_, `pr#27806 <https://github.com/ceph/ceph/pull/27806>`_, Sage Weil, zjh)
-* osd: Change osd op queue cut off default to high (`pr#30441 <https://github.com/ceph/ceph/pull/30441>`_, Anthony DAtri)
-* osd: clean up osdmap sharing (`pr#27932 <https://github.com/ceph/ceph/pull/27932>`_, Sage Weil)
-* osd: clear osd op reply output only when writes success (`issue#38492 <http://tracker.ceph.com/issues/38492>`_, `pr#26652 <https://github.com/ceph/ceph/pull/26652>`_, huangjun)
-* osd: clear PG_STATE_CLEAN when repair object (`pr#29756 <https://github.com/ceph/ceph/pull/29756>`_, Zengran Zhang)
-* osd: copy (dont move) pg list when sending beacon (`issue#40377 <http://tracker.ceph.com/issues/40377>`_, `pr#28566 <https://github.com/ceph/ceph/pull/28566>`_, Sage Weil)
-* osd: copy ObjectOperation::BufferUpdate::Write::fadvise_flag to ceph::os::Transaction (`pr#29944 <https://github.com/ceph/ceph/pull/29944>`_, Xuehan Xu)
-* osd: copyfrom omitted to set mtime (`pr#28581 <https://github.com/ceph/ceph/pull/28581>`_, Zengran Zhang)
-* osd: correct a local variable type (`pr#26672 <https://github.com/ceph/ceph/pull/26672>`_, Kefu Chai)
-* osd: Diagnostic logging for upmap cleaning (`pr#32663 <https://github.com/ceph/ceph/pull/32663>`_, David Zafman)
-* osd: dispatch peering messages as messages, inside the PG lock (`pr#29820 <https://github.com/ceph/ceph/pull/29820>`_, Sage Weil)
-* osd: dispatch_context and queue split finish on early bail-out (`pr#32942 <https://github.com/ceph/ceph/pull/32942>`_, Sage Weil)
-* osd: do not hold osd_lock while requeuing snaps to purge (`pr#28941 <https://github.com/ceph/ceph/pull/28941>`_, Sage Weil)
-* osd: do not invalidate clear_regions of missing item at boot (`pr#29755 <https://github.com/ceph/ceph/pull/29755>`_, xie xingguo)
-* osd: dont carry PGLSFilter between multiple ops in MOSDOp (`pr#29575 <https://github.com/ceph/ceph/pull/29575>`_, Radoslaw Zarzynski)
-* osd: Dont evict after a flush if intersecting scrub range (`issue#38840 <http://tracker.ceph.com/issues/38840>`_, `pr#27209 <https://github.com/ceph/ceph/pull/27209>`_, David Zafman)
-* osd: Dont include user changeable flag in snaptrim related assert (`issue#38124 <http://tracker.ceph.com/issues/38124>`_, `pr#27830 <https://github.com/ceph/ceph/pull/27830>`_, David Zafman)
-* osd: Dont randomize deep scrubs when noscrub set (`issue#40198 <http://tracker.ceph.com/issues/40198>`_, `pr#28443 <https://github.com/ceph/ceph/pull/28443>`_, David Zafman)
-* osd: drop unnecessary includes of messages/MOSDPGTrim.h (`pr#33660 <https://github.com/ceph/ceph/pull/33660>`_, Radoslaw Zarzynski)
-* osd: Fix assert in the case that snapset is missing (`pr#29941 <https://github.com/ceph/ceph/pull/29941>`_, David Zafman)
-* osd: fix possible crash on sending dynamic perf stats report (`pr#30454 <https://github.com/ceph/ceph/pull/30454>`_, Mykola Golub)
-* osd: fix racy accesses to OSD::osdmap (`pr#33336 <https://github.com/ceph/ceph/pull/33336>`_, Radoslaw Zarzynski)
-* osd: fix the missing default value m=2 of reed_sol_r6_op in profile (`pr#29892 <https://github.com/ceph/ceph/pull/29892>`_, Yan Jun)
-* osd: Fix the way that auto repair triggers after regular scru (`issue#40073 <http://tracker.ceph.com/issues/40073>`_, `issue#40530 <http://tracker.ceph.com/issues/40530>`_, `pr#28334 <https://github.com/ceph/ceph/pull/28334>`_, David Zafman)
-* osd: fix wrong arguments when dropping refcount (`pr#29348 <https://github.com/ceph/ceph/pull/29348>`_, Myoungwon Oh)
-* osd: Give recovery for inactive PGs a higher priority (`issue#38195 <http://tracker.ceph.com/issues/38195>`_, `pr#27503 <https://github.com/ceph/ceph/pull/27503>`_, David Zafman)
-* osd: give recovery ops initialized by client op a higher priority (`pr#28418 <https://github.com/ceph/ceph/pull/28418>`_, xie xingguo)
-* osd: implement per-pg leases to avoid stale reads (`pr#29236 <https://github.com/ceph/ceph/pull/29236>`_, Sage Weil)
-* osd: Improve dump_pgstate_history json output (`issue#38846 <http://tracker.ceph.com/issues/38846>`_, `pr#27665 <https://github.com/ceph/ceph/pull/27665>`_, Brad Hubbard)
-* osd: Include dups in copy_after() and copy_up_to() (`issue#39304 <http://tracker.ceph.com/issues/39304>`_, `pr#27914 <https://github.com/ceph/ceph/pull/27914>`_, David Zafman)
-* osd: Increase log level of messages which unnecessarily fill up logs (`pr#27686 <https://github.com/ceph/ceph/pull/27686>`_, David Zafman)
-* osd: make osd recover more smoothly by avoiding failure peer info to resent (`pr#30404 <https://github.com/ceph/ceph/pull/30404>`_, \xe5\xae\x8b\xe9\xa1\xba10180185)
-* osd: make PastIntervals a member of pg_notify_t (`pr#29517 <https://github.com/ceph/ceph/pull/29517>`_, Sage Weil)
-* osd: merge replica log on primary need according to replica logs crt (`pr#29590 <https://github.com/ceph/ceph/pull/29590>`_, Zengran Zhang)
-* osd: misc cleanups (`pr#30022 <https://github.com/ceph/ceph/pull/30022>`_, Yan Jun)
-* osd: misc inc-recovery compat fixes (`pr#29754 <https://github.com/ceph/ceph/pull/29754>`_, xie xingguo)
-* osd: optimize send_message to peers (`pr#30968 <https://github.com/ceph/ceph/pull/30968>`_, Jianpeng Ma)
-* osd: OSDMapRef access by multiple threads is unsafe (`pr#26874 <https://github.com/ceph/ceph/pull/26874>`_, Kefu Chai, Zengran Zhang)
-* osd: Output Base64 encoding of CRC header if binary data present (`pr#27961 <https://github.com/ceph/ceph/pull/27961>`_, David Zafman)
-* osd: partial recovery strategy based on PGLog (`pr#21722 <https://github.com/ceph/ceph/pull/21722>`_, lishuhao, Ning Yao)
-* osd: peering updates peer_last_complete_ondisk via setter (`pr#33659 <https://github.com/ceph/ceph/pull/33659>`_, Radoslaw Zarzynski)
-* osd: pg as a mutex (`pr#29477 <https://github.com/ceph/ceph/pull/29477>`_, Kefu Chai)
-* osd: prime splits/merges for any potential fabricated split/merge participant (`issue#38483 <http://tracker.ceph.com/issues/38483>`_, `pr#30018 <https://github.com/ceph/ceph/pull/30018>`_, xie xingguo)
-* osd: process_copy_chunk remove obc ref before pg unlock (`issue#38842 <http://tracker.ceph.com/issues/38842>`_, `pr#27084 <https://github.com/ceph/ceph/pull/27084>`_, Zengran Zhang)
-* osd: propagate mlcod to replicas and fix problems with read from replica (`pr#32381 <https://github.com/ceph/ceph/pull/32381>`_, Samuel Just, Sage Weil)
-* osd: release backoffs during merge (`pr#31657 <https://github.com/ceph/ceph/pull/31657>`_, Sage Weil)
-* osd: remove orphan include after PGLSParentFilter (`pr#29709 <https://github.com/ceph/ceph/pull/29709>`_, Radoslaw Zarzynski)
-* osd: remove unused function (`pr#30644 <https://github.com/ceph/ceph/pull/30644>`_, Jianpeng Ma)
-* osd: remove unused functions (`pr#32515 <https://github.com/ceph/ceph/pull/32515>`_, Jianpeng Ma)
-* osd: Remove unused osdmap flags full, nearfull from output (`pr#30530 <https://github.com/ceph/ceph/pull/30530>`_, David Zafman)
-* osd: remove useless ceph_assert (`pr#31915 <https://github.com/ceph/ceph/pull/31915>`_, Jianpeng Ma)
-* osd: revamp {noup,nodown,noin,noout} related commands (`pr#27735 <https://github.com/ceph/ceph/pull/27735>`_, xie xingguo)
-* osd: rollforward may need to mark pglog dirty (`issue#36739 <http://tracker.ceph.com/issues/36739>`_, `pr#27015 <https://github.com/ceph/ceph/pull/27015>`_, Zengran Zhang)
-* osd: scrub error on big objects; make bluestore refuse to start on big objects (`pr#29579 <https://github.com/ceph/ceph/pull/29579>`_, David Zafman, Sage Weil)
-* osd: send smart asok result to stdout, not stderr (`pr#31412 <https://github.com/ceph/ceph/pull/31412>`_, Sage Weil)
-* osd: set affinity for \\*all\\* threads (`pr#30712 <https://github.com/ceph/ceph/pull/30712>`_, Sage Weil)
-* osd: set collection pool opts on collection create, pg load (`pr#29093 <https://github.com/ceph/ceph/pull/29093>`_, Sage Weil)
-* osd: share curmap in handle_osd_ping (`pr#28662 <https://github.com/ceph/ceph/pull/28662>`_, Sage Weil)
-* osd: shutdown recovery_request_timer earlier (`pr#27206 <https://github.com/ceph/ceph/pull/27206>`_, Zengran Zhang)
-* osd: some prelim changes (`pr#29052 <https://github.com/ceph/ceph/pull/29052>`_, Sage Weil)
-* osd: support osd_repair_during_recovery (`issue#40620 <http://tracker.ceph.com/issues/40620>`_, `pr#28839 <https://github.com/ceph/ceph/pull/28839>`_, Jeegn Chen)
-* osd: support osd_scrub_extended_sleep (`issue#40955 <http://tracker.ceph.com/issues/40955>`_, `pr#29342 <https://github.com/ceph/ceph/pull/29342>`_, Jeegn Chen)
-* osd: take heartbeat_lock when calling heartbeat() (`issue#39439 <http://tracker.ceph.com/issues/39439>`_, `pr#27729 <https://github.com/ceph/ceph/pull/27729>`_, Sage Weil)
-* osd: tiny clean-ups around the backfill (`pr#33583 <https://github.com/ceph/ceph/pull/33583>`_, Radoslaw Zarzynski)
-* osd: track monotonic clock deltas between osds who ping each other (`pr#29116 <https://github.com/ceph/ceph/pull/29116>`_, Sage Weil, Samuel Just)
-* osd: transpose two wait lists in comment (`pr#27017 <https://github.com/ceph/ceph/pull/27017>`_, Kefu Chai)
-* osd: trim pg logs based on a per-osd budget (`pr#32683 <https://github.com/ceph/ceph/pull/32683>`_, Sage Weil, Kefu Chai)
-* osd: Turn off repair pg state when leaving recovery (`pr#30852 <https://github.com/ceph/ceph/pull/30852>`_, David Zafman)
-* osd: unify sources of no{up,down,in,out} flags into singleton helpers (`pr#28403 <https://github.com/ceph/ceph/pull/28403>`_, xie xingguo)
-* osd: update comment as sub_op_scrub_map has been removed (`pr#28338 <https://github.com/ceph/ceph/pull/28338>`_, Jing Wenjun)
-* osd: Use physical ratio for nearfull (doesnt include backfill resserve) (`pr#31954 <https://github.com/ceph/ceph/pull/31954>`_, David Zafman)
-* osd: use steady clock in prepare_to_stop() (`pr#26457 <https://github.com/ceph/ceph/pull/26457>`_, Mohamad Gebai)
-* osd: use unique_ptr for managing life cycles (`pr#32007 <https://github.com/ceph/ceph/pull/32007>`_, Kefu Chai)
-* osdc/Striper: specialize std::min<> (`pr#28732 <https://github.com/ceph/ceph/pull/28732>`_, Kefu Chai)
-* osd_types: add ec profile to plain text osd pool ls detail output (`issue#40009 <http://tracker.ceph.com/issues/40009>`_, `pr#28224 <https://github.com/ceph/ceph/pull/28224>`_, Jan Fajerski)
-* pybind,rbd: Add RBD_FEATURE_MIGRATING to rbd.pyx (`issue#39609 <http://tracker.ceph.com/issues/39609>`_, `pr#28009 <https://github.com/ceph/ceph/pull/28009>`_, Ricardo Marques)
-* pybind,rbd: pybind/rbd: add config_set/get/remove api in rbd.pyx (`pr#29459 <https://github.com/ceph/ceph/pull/29459>`_, Zheng Yin)
-* pybind,rbd: pybind/rbd: add pool config_set/get/remove api in rbd.pyx (`pr#30865 <https://github.com/ceph/ceph/pull/30865>`_, Zheng Yin)
-* pybind,rbd: pybind/rbd: parent_info should return pool namespace (`pr#30793 <https://github.com/ceph/ceph/pull/30793>`_, Ricardo Marques)
-* pybind,rbd: rbd/pybind: fix unsupported format character of %lx (`pr#30314 <https://github.com/ceph/ceph/pull/30314>`_, songweibin)
-* pybind,tests: pybind/rados: do not slice zip() (`pr#31044 <https://github.com/ceph/ceph/pull/31044>`_, Kefu Chai)
-* pybind,tests: test/pybind/test_rados.py: test test_operate_aio_write_op() (`pr#31158 <https://github.com/ceph/ceph/pull/31158>`_, Zhang Jiao)
-* pybind/mgr: Add test_orchestrator to mypy (`pr#32500 <https://github.com/ceph/ceph/pull/32500>`_, Sebastian Wagner)
-* pybind/mgr: add_tox_test: Add mypy to TOX_ENVS (`pr#32236 <https://github.com/ceph/ceph/pull/32236>`_, Sebastian Wagner)
-* pybind/mgr: bump six to 1.14 (`pr#33185 <https://github.com/ceph/ceph/pull/33185>`_, Kefu Chai)
-* pybind/tox: pass additional command line arguments through to tox (`pr#27947 <https://github.com/ceph/ceph/pull/27947>`_, Nathan Cutler)
-* pybind: .gitignore: Add .mypy_cache to .gitignore (`pr#33510 <https://github.com/ceph/ceph/pull/33510>`_, Kristoffer Gr\xc3\xb6nlund)
-* pybind: add verbose error message (`pr#28054 <https://github.com/ceph/ceph/pull/28054>`_, Daniel Badea, Changcheng Liu, Ovidiu Poncea)
-* pybind: add WriteOp::set_xattr() & rm_xattr() (`pr#31829 <https://github.com/ceph/ceph/pull/31829>`_, Zhang Jiao)
-* pybind: add writesame API (`pr#31489 <https://github.com/ceph/ceph/pull/31489>`_, Zhang Jiao)
-* pybind: check CEPH_LIBDIR not MAKEFLAGS (`pr#29080 <https://github.com/ceph/ceph/pull/29080>`_, Kefu Chai)
-* pybind: customize compiler before checking cflags (`pr#33177 <https://github.com/ceph/ceph/pull/33177>`_, Kefu Chai)
-* pybind: fix use of WriteOpCtx and ReadOpCtx (`issue#38946 <http://tracker.ceph.com/issues/38946>`_, `pr#27213 <https://github.com/ceph/ceph/pull/27213>`_, Ramana Raja)
-* pybind: pybind/rados/rados.pyx: improve Rados.create_pool() (`pr#31241 <https://github.com/ceph/ceph/pull/31241>`_, Zhang Jiao)
-* pybind: pybind/rados: add application_metadata_get (`pr#30504 <https://github.com/ceph/ceph/pull/30504>`_, songweibin)
-* pybind: pybind/rados: add Ioctx.get_pool_id() and Ioctx.get_pool_name() (`pr#29646 <https://github.com/ceph/ceph/pull/29646>`_, Zheng Yin)
-* pybind: pybind/rados: add WriteOp::execute() (`pr#31546 <https://github.com/ceph/ceph/pull/31546>`_, Zhang Jiao)
-* pybind: pybind/rados: should pass name to cstr() (`pr#27111 <https://github.com/ceph/ceph/pull/27111>`_, Kefu Chai)
-* pybind: refactor monkey_with_compiler() (`pr#33061 <https://github.com/ceph/ceph/pull/33061>`_, Kefu Chai)
-* pybind: set language_level for cythonize explicitly (`pr#26607 <https://github.com/ceph/ceph/pull/26607>`_, Kefu Chai)
-* python-common, mgr/orchestrator, mgr/dashboard: Use common Devices (`pr#30662 <https://github.com/ceph/ceph/pull/30662>`_, Kiefer Chang, Sebastian Wagner)
-* python-common: add unmanaged property to PlacementSpec (`pr#33955 <https://github.com/ceph/ceph/pull/33955>`_, Sage Weil)
-* python-common: all:true -> \\* (`pr#33970 <https://github.com/ceph/ceph/pull/33970>`_, Sage Weil)
-* python-common: move pytest integration from setup.py to tox.ini (`pr#31943 <https://github.com/ceph/ceph/pull/31943>`_, Sebastian Wagner)
-* python-common: remove `all_hosts` from `PlacementSpec` (`pr#33948 <https://github.com/ceph/ceph/pull/33948>`_, Sebastian Wagner)
-* qa/distros: rhel and centos: whitelist cephadm logrotate selinux denial (`pr#33110 <https://github.com/ceph/ceph/pull/33110>`_, Sage Weil)
-* qa/standalone/test_ceph_daemon.sh: disable adoption for the moment (`pr#32178 <https://github.com/ceph/ceph/pull/32178>`_, Sage Weil)
-* qa/standalone/test_ceph_daemon.sh: fix overwrites of temp files (`pr#31748 <https://github.com/ceph/ceph/pull/31748>`_, Sage Weil)
-* qa/standalone/test_ceph_daemon: fix multi-version python test (`pr#31342 <https://github.com/ceph/ceph/pull/31342>`_, Sage Weil)
-* qa/suites/cephadm: move orchestrator_cli test into rados/cephadm (`pr#33648 <https://github.com/ceph/ceph/pull/33648>`_, Sage Weil)
-* qa/suites/rados/ceph: drop opensuse for now (`pr#33801 <https://github.com/ceph/ceph/pull/33801>`_, Sage Weil)
-* qa/suites/rados/cephadm/smoke: disable rgw role for now (`pr#33360 <https://github.com/ceph/ceph/pull/33360>`_, Sage Weil)
-* qa/suites/rados/cephadm/upgrade: change start version (`pr#33475 <https://github.com/ceph/ceph/pull/33475>`_, Sage Weil)
-* qa/suites/rados/cephadm/upgrade: fix initial version (`pr#33396 <https://github.com/ceph/ceph/pull/33396>`_, Sage Weil)
-* qa/suites/rados/cephadm: explicitly test many distros (`pr#32969 <https://github.com/ceph/ceph/pull/32969>`_, Sage Weil)
-* qa/suites/rados/cephadm: fix conflicts, missing .qa link (`pr#33132 <https://github.com/ceph/ceph/pull/33132>`_, Sage Weil)
-* qa/suites/rados/cephadm[-smoke]: test podman on ubuntu 18.04 (`pr#33111 <https://github.com/ceph/ceph/pull/33111>`_, Sage Weil)
-* qa/tasks/cephadm: ceph.git branches are now pushed to quay.io (`pr#32375 <https://github.com/ceph/ceph/pull/32375>`_, Sage Weil)
-* qa/tasks/cephadm: deploy rgw daemons too (`pr#33289 <https://github.com/ceph/ceph/pull/33289>`_, Sage Weil)
-* qa/tasks/cephadm: learn to pull cephadm from githu (`pr#32787 <https://github.com/ceph/ceph/pull/32787>`_, Sage Weil)
-* qa/tasks/cephadm: misc fixes (`pr#32713 <https://github.com/ceph/ceph/pull/32713>`_, Sage Weil)
-* qa/tasks/ceph_manager.py: always use self.logger (`pr#29239 <https://github.com/ceph/ceph/pull/29239>`_, Kefu Chai)
-* qa/tasks/ceph_manager: 5s -> 15s for osd out to be visible (`pr#29013 <https://github.com/ceph/ceph/pull/29013>`_, Sage Weil)
-* qa/tasks/ceph_manager: fix movement of cot exports with cephadm (`pr#32986 <https://github.com/ceph/ceph/pull/32986>`_, Sage Weil)
-* qa/tasks/ceph_manager: fix shell osd for ceph-objectstore-tool commands (`pr#32725 <https://github.com/ceph/ceph/pull/32725>`_, Sage Weil)
-* qa/tasks/ceph_manager: make fix_pgp_num behave when no pool is found (`pr#32987 <https://github.com/ceph/ceph/pull/32987>`_, Sage Weil)
-* qa/tasks/mgr/dashboard/test_health: update schema (`pr#30507 <https://github.com/ceph/ceph/pull/30507>`_, Kefu Chai)
-* qa/tasks/mgr/dashboard/test_orchestrator: support addr attribute in inventory (`pr#33211 <https://github.com/ceph/ceph/pull/33211>`_, Kiefer Chang)
-* qa/tasks/mgr/test_orchestrator_cli: fix device ls test (`pr#32384 <https://github.com/ceph/ceph/pull/32384>`_, Sage Weil)
-* qa/tasks/mgr/test_orchestrator_cli: fix rgw add test (`pr#32101 <https://github.com/ceph/ceph/pull/32101>`_, Sage Weil)
-* qa/tasks/mgr/test_orchestrator_cli: support multiple DriveGroups (`pr#33055 <https://github.com/ceph/ceph/pull/33055>`_, Kiefer Chang)
-* qa/test: reduce over all number of runs (`pr#27979 <https://github.com/ceph/ceph/pull/27979>`_, Yuri Weinstein)
-* qa/tests - cleaned up distro settings (`pr#27956 <https://github.com/ceph/ceph/pull/27956>`_, Yuri Weinstein)
-* qa/tests - upped priority for upgrades on master, otherwise they neve\xe2\x80\xa6 (`pr#29666 <https://github.com/ceph/ceph/pull/29666>`_, Yuri Weinstein)
-* qa/tests: added nautilus-x-singleton suite to rados as symlink (`pr#27291 <https://github.com/ceph/ceph/pull/27291>`_, Sage Weil)
-* qa/tests: added rados on master, reduced fs, rbd, multimds (`pr#27535 <https://github.com/ceph/ceph/pull/27535>`_, Yuri Weinstein)
-* qa/tests: added the subset clause for nautilus branch (`pr#27129 <https://github.com/ceph/ceph/pull/27129>`_, Yuri Weinstein)
-* qa/tests: changed the TO email to ceph-qa@ceph.io (`pr#28721 <https://github.com/ceph/ceph/pull/28721>`_, Yuri Weinstein)
-* qa/tests: moved some runs from ovh, removed ceph-disk/nautilus (`pr#27616 <https://github.com/ceph/ceph/pull/27616>`_, Yuri Weinstein)
-* qa/tests: reduced runs for nautilus, added runs for octopus (`pr#33214 <https://github.com/ceph/ceph/pull/33214>`_, Yuri Weinstein)
-* qa/tests: removed all runs on ovh (`pr#27960 <https://github.com/ceph/ceph/pull/27960>`_, Yuri Weinstein)
-* qa/tests: removed filters for client-upgrade-\\* suites (`pr#28271 <https://github.com/ceph/ceph/pull/28271>`_, Yuri Weinstein)
-* qa/tests: run luminous-x and mimic-x 2 times a week but with high priority (`pr#27527 <https://github.com/ceph/ceph/pull/27527>`_, Yuri Weinstein)
-* qa/tests: trying to fix syntax error that prevented mimic-x to be add\xe2\x80\xa6 (`pr#31799 <https://github.com/ceph/ceph/pull/31799>`_, Yuri Weinstein)
-* qa/valgrind.supp: abstract from ceph::buffers symbol versioning (`pr#33757 <https://github.com/ceph/ceph/pull/33757>`_, Radoslaw Zarzynski)
-* qa/workunits/cephadm/test_adoption: run as root (`pr#33485 <https://github.com/ceph/ceph/pull/33485>`_, Sage Weil)
-* qa/workunits/cephadm/test_cephadm.sh: consolidate wait loop logic (`pr#33544 <https://github.com/ceph/ceph/pull/33544>`_, Michael Fritch)
-* qa/workunits/cephadm/test_cephadm.sh: dump logs on exit (`pr#33634 <https://github.com/ceph/ceph/pull/33634>`_, Michael Fritch)
-* qa/workunits/cephadm/test_cephadm.sh: need --fsid always (`pr#32220 <https://github.com/ceph/ceph/pull/32220>`_, Sage Weil)
-* qa/workunits/cephadm/test_cephadm.sh: re-enable `adopt` tests (`pr#32244 <https://github.com/ceph/ceph/pull/32244>`_, Michael Fritch)
-* qa/workunits/cephadm/test_cephadm.sh: skip docker when service is disabled (`pr#33018 <https://github.com/ceph/ceph/pull/33018>`_, Michael Fritch)
-* qa/workunits/cephadm/test_cephadm.sh: use avialable pythons; test on ubuntu and centos (`pr#32333 <https://github.com/ceph/ceph/pull/32333>`_, Sage Weil)
-* qa/workunits/cephadm/test_cephadm: --skip-monitoring-stack (`pr#34013 <https://github.com/ceph/ceph/pull/34013>`_, Sage Weil)
-* qa/workunits/cephadm/test_cephadm: fix typo (`pr#33181 <https://github.com/ceph/ceph/pull/33181>`_, Sage Weil)
-* qa/workunits/cephadm/test_cephadm: workunit test cleanup (`pr#32625 <https://github.com/ceph/ceph/pull/32625>`_, Michael Fritch)
-* qa/workunits/cephadm/test_repos: dont try to use the refspec (`pr#33134 <https://github.com/ceph/ceph/pull/33134>`_, Sage Weil)
-* qa/workunits/cephadm: separate out test_adoption.sh; fix (`pr#33457 <https://github.com/ceph/ceph/pull/33457>`_, Sage Weil)
-* qa: fixes (`pr#29361 <https://github.com/ceph/ceph/pull/29361>`_, Kefu Chai)
-* qa: misc fixes for rados and py3 (`pr#32362 <https://github.com/ceph/ceph/pull/32362>`_, Sage Weil)
-* qa: pin rgw/verify to 8.0 (`pr#32761 <https://github.com/ceph/ceph/pull/32761>`_, Ali Maredia)
-* qa: Run flake8 on python2 and python3 (`pr#32222 <https://github.com/ceph/ceph/pull/32222>`_, Thomas Bechtold)
-* qa: vstart_runner fails because of string index out of range (`pr#28990 <https://github.com/ceph/ceph/pull/28990>`_, Volker Theile)
-* rbd,tests: cls/rbd: add snapshot limit UINT64_MAX test case (`pr#31350 <https://github.com/ceph/ceph/pull/31350>`_, Chen Pan)
-* rbd,tests: cls/rbd: add snapshot_add raise -ESTALE test case (`pr#31149 <https://github.com/ceph/ceph/pull/31149>`_, wonderpow)
-* rbd,tests: journal: always shutdown JournalRecoreder before destructing it (`pr#29501 <https://github.com/ceph/ceph/pull/29501>`_, Kefu Chai)
-* rbd,tests: journal: fix flush by age and in-flight byte tracking (`pr#31392 <https://github.com/ceph/ceph/pull/31392>`_, Jason Dillaman)
-* rbd,tests: mgr/dashboard: s/fsid/mirror_uuid/ (`pr#33348 <https://github.com/ceph/ceph/pull/33348>`_, Kefu Chai)
-* rbd,tests: qa/rbd: add cram-based snap diff test (`issue#39447 <http://tracker.ceph.com/issues/39447>`_, `pr#28346 <https://github.com/ceph/ceph/pull/28346>`_, Shyukri Shyukriev, Nathan Cutler)
-* rbd,tests: qa/suites/krbd: run unmap subsuite with msgr1 only (`pr#31265 <https://github.com/ceph/ceph/pull/31265>`_, Ilya Dryomov)
-* rbd,tests: qa/suites/rbd: add random distro selection to librbd tests (`pr#27577 <https://github.com/ceph/ceph/pull/27577>`_, Jason Dillaman)
-* rbd,tests: qa/suites/rbd: added writearound cache test permutations (`issue#39386 <http://tracker.ceph.com/issues/39386>`_, `pr#27694 <https://github.com/ceph/ceph/pull/27694>`_, Jason Dillaman)
-* rbd,tests: qa/suites/rbd: fix errant tab in yaml which is causing parsing failures (`pr#30942 <https://github.com/ceph/ceph/pull/30942>`_, Jason Dillaman)
-* rbd,tests: qa/suites/rbd: fixed download path for Ubuntu Bionic (`pr#32408 <https://github.com/ceph/ceph/pull/32408>`_, Jason Dillaman)
-* rbd,tests: qa/suites/rbd: removed OpenStack tempest test cases (`pr#33900 <https://github.com/ceph/ceph/pull/33900>`_, Jason Dillaman)
-* rbd,tests: qa/tests: added rbd task on ec (`pr#29541 <https://github.com/ceph/ceph/pull/29541>`_, Yuri Weinstein)
-* rbd,tests: qa/workunit/rbd: fixed QoS throughput unit parsing (`pr#32280 <https://github.com/ceph/ceph/pull/32280>`_, Jason Dillaman)
-* rbd,tests: qa/workunits/rbd: fix compare_images and compare_image_snapshots (`pr#28524 <https://github.com/ceph/ceph/pull/28524>`_, Mykola Golub)
-* rbd,tests: qa/workunits/rbd: fixed python interpreter for EL8 (`pr#32409 <https://github.com/ceph/ceph/pull/32409>`_, Jason Dillaman)
-* rbd,tests: qa/workunits/rbd: fixups for the new krbd discard behavior (`pr#27192 <https://github.com/ceph/ceph/pull/27192>`_, Ilya Dryomov)
-* rbd,tests: qa/workunits/rbd: override CEPH_ARGS when initializing the site name (`pr#33187 <https://github.com/ceph/ceph/pull/33187>`_, Jason Dillaman)
-* rbd,tests: qa/workunits/rbd: remove fast-diff from dynamic features test (`issue#39946 <http://tracker.ceph.com/issues/39946>`_, `pr#28135 <https://github.com/ceph/ceph/pull/28135>`_, Jason Dillaman)
-* rbd,tests: qa/workunits/rbd: stress test `rbd mirror pool status --verbose` (`pr#29655 <https://github.com/ceph/ceph/pull/29655>`_, Mykola Golub)
-* rbd,tests: qa/workunits/rbd: use context managers to control Rados lifespan (`pr#34035 <https://github.com/ceph/ceph/pull/34035>`_, Jason Dillaman)
-* rbd,tests: qa/workunits/rbd: use https protocol for devstack git operations (`issue#39656 <http://tracker.ceph.com/issues/39656>`_, `pr#28063 <https://github.com/ceph/ceph/pull/28063>`_, Jason Dillaman)
-* rbd,tests: qa/workunits/rbd: use more recent qemu-iotests that support Bionic (`issue#24668 <http://tracker.ceph.com/issues/24668>`_, `pr#27683 <https://github.com/ceph/ceph/pull/27683>`_, Jason Dillaman)
-* rbd,tests: qa/workunits/rbd: wait for nbd map to close after unmap (`pr#33898 <https://github.com/ceph/ceph/pull/33898>`_, Jason Dillaman)
-* rbd,tests: qa/workunits/rbd: wait for rbd-nbd unmap to complete (`issue#39598 <http://tracker.ceph.com/issues/39598>`_, `pr#27981 <https://github.com/ceph/ceph/pull/27981>`_, Jason Dillaman)
-* rbd,tests: qa: add device mapper and lvm test cases for stable pages (`pr#27271 <https://github.com/ceph/ceph/pull/27271>`_, Ilya Dryomov)
-* rbd,tests: qa: add krbd_discard_granularity.t test (`pr#27042 <https://github.com/ceph/ceph/pull/27042>`_, Ilya Dryomov)
-* rbd,tests: qa: add RBD QOS functional test (`pr#27137 <https://github.com/ceph/ceph/pull/27137>`_, Mykola Golub)
-* rbd,tests: qa: add script to test how libceph handles huge osdmaps (`pr#30363 <https://github.com/ceph/ceph/pull/30363>`_, Ilya Dryomov)
-* rbd,tests: qa: avoid hexdump skip and length options (`pr#30502 <https://github.com/ceph/ceph/pull/30502>`_, Ilya Dryomov)
-* rbd,tests: qa: avoid page cache for krbd discard round off tests (`pr#30452 <https://github.com/ceph/ceph/pull/30452>`_, Ilya Dryomov)
-* rbd,tests: qa: krbd_parent_overlap.t: fix read test (`pr#29966 <https://github.com/ceph/ceph/pull/29966>`_, Ilya Dryomov)
-* rbd,tests: test/cli-integration/rbd: fixed missing image and snap ids (`pr#29853 <https://github.com/ceph/ceph/pull/29853>`_, Jason Dillaman)
-* rbd,tests: test/cli-integration: fixed spacing issue for RBD formatted tables (`pr#33902 <https://github.com/ceph/ceph/pull/33902>`_, Jason Dillaman)
-* rbd,tests: test/cls_rbd/test_cls_rbd: update TestClsRbd.sparsify (`pr#30258 <https://github.com/ceph/ceph/pull/30258>`_, Kefu Chai)
-* rbd,tests: test/cls_rbd: include compat.h for ERESTART (`pr#32172 <https://github.com/ceph/ceph/pull/32172>`_, Willem Jan Withagen)
-* rbd,tests: test/journal: always close object (`pr#29476 <https://github.com/ceph/ceph/pull/29476>`_, Kefu Chai)
-* rbd,tests: test/librados_test_stub: ensure the log flusher thread is started (`pr#27326 <https://github.com/ceph/ceph/pull/27326>`_, Jason Dillaman)
-* rbd,tests: test/librbd: allow parallel runs of run-rbd-unit-tests (`pr#30072 <https://github.com/ceph/ceph/pull/30072>`_, Willem Jan Withagen)
-* rbd,tests: test/librbd: drop ceph_test_librbd_api target (`issue#39072 <http://tracker.ceph.com/issues/39072>`_, `pr#27695 <https://github.com/ceph/ceph/pull/27695>`_, Jason Dillaman)
-* rbd,tests: test/librbd: fix mock warnings in TestMockIoImageRequest (`pr#31497 <https://github.com/ceph/ceph/pull/31497>`_, Mykola Golub)
-* rbd,tests: test/librbd: set nbd timeout due to newer kernels defaulting it on (`pr#29858 <https://github.com/ceph/ceph/pull/29858>`_, Jason Dillaman)
-* rbd,tests: test/pybind/rbd.pyx: add test_remove_snap_by_id case in test_rbd.py (`pr#30927 <https://github.com/ceph/ceph/pull/30927>`_, Zhang Jiao)
-* rbd,tests: test/pybind: add create_snap rasie ImageExists test case (`pr#31140 <https://github.com/ceph/ceph/pull/31140>`_, Gangbiao Liu)
-* rbd,tests: test/pybind: inconsistent use of tabs and spaces in indentation (`pr#31606 <https://github.com/ceph/ceph/pull/31606>`_, Mykola Golub)
-* rbd,tests: test/rbd_mirror: fix mock warnings (`pr#31608 <https://github.com/ceph/ceph/pull/31608>`_, Mykola Golub)
-* rbd,tests: test/run-rbd-tests: properly initialize newly created rbd pool (`pr#33642 <https://github.com/ceph/ceph/pull/33642>`_, Mykola Golub)
-* rbd,tests: test: add test_remove_snap_ImageNotFound test case in remove snap part (`pr#31221 <https://github.com/ceph/ceph/pull/31221>`_, Yingze Wei)
-* rbd,tests: test:add test_remove_snap2 interface to remove  snap when its protected (`pr#31208 <https://github.com/ceph/ceph/pull/31208>`_, Yingze Wei)
-* rbd,tools: tools/rbd-ggate: close log before running postfork (`pr#30010 <https://github.com/ceph/ceph/pull/30010>`_, Willem Jan Withagen)
-* rbd,tools: tools/rbd_nbd: use POSIX basename() (`pr#28856 <https://github.com/ceph/ceph/pull/28856>`_, Kefu Chai)
-* rbd-ggate: fix fallout from bufferlist.copy() change (`pr#33057 <https://github.com/ceph/ceph/pull/33057>`_, Willem Jan Withagen)
-* rbd-mirror: add namespace support (`issue#37529 <http://tracker.ceph.com/issues/37529>`_, `pr#28939 <https://github.com/ceph/ceph/pull/28939>`_, Mykola Golub)
-* rbd-mirror: add namespace support to service daemon (`pr#31642 <https://github.com/ceph/ceph/pull/31642>`_, Mykola Golub)
-* rbd-mirror: add support for snapshot-based mirroring resyncs (`pr#33490 <https://github.com/ceph/ceph/pull/33490>`_, Jason Dillaman)
-* rbd-mirror: apply image state during snapshot replay (`pr#33335 <https://github.com/ceph/ceph/pull/33335>`_, Jason Dillaman)
-* rbd-mirror: cannot restore deferred deletion mirrored images (`pr#30351 <https://github.com/ceph/ceph/pull/30351>`_, Jason Dillaman)
-* rbd-mirror: clear out bufferlist prior to listing mirror images (`issue#39407 <http://tracker.ceph.com/issues/39407>`_, `pr#27720 <https://github.com/ceph/ceph/pull/27720>`_, Jason Dillaman)
-* rbd-mirror: continue to isolate journal replay logic (`pr#32399 <https://github.com/ceph/ceph/pull/32399>`_, Jason Dillaman)
-* rbd-mirror: do not auto-create peers in non-default namespaces (`pr#32341 <https://github.com/ceph/ceph/pull/32341>`_, Jason Dillaman)
-* rbd-mirror: dont expect image map is always initialized (`pr#33368 <https://github.com/ceph/ceph/pull/33368>`_, Mykola Golub)
-* rbd-mirror: dont overwrite status error returned by replay (`pr#28179 <https://github.com/ceph/ceph/pull/28179>`_, Mykola Golub)
-* rbd-mirror: ensure deterministic ordering of method calls (`pr#32274 <https://github.com/ceph/ceph/pull/32274>`_, Jason Dillaman)
-* rbd-mirror: extract journal replaying logic from image replayer (`pr#32257 <https://github.com/ceph/ceph/pull/32257>`_, Jason Dillaman)
-* rbd-mirror: fix pool replayer status for case when init failed (`pr#32483 <https://github.com/ceph/ceph/pull/32483>`_, Mykola Golub)
-* rbd-mirror: fix race on namespace replayer initialization failure (`pr#32243 <https://github.com/ceph/ceph/pull/32243>`_, Mykola Golub)
-* rbd-mirror: handle duplicates in image sync throttler queue (`issue#40519 <http://tracker.ceph.com/issues/40519>`_, `pr#28730 <https://github.com/ceph/ceph/pull/28730>`_, Mykola Golub)
-* rbd-mirror: hold lock while updating local image name (`pr#33988 <https://github.com/ceph/ceph/pull/33988>`_, Jason Dillaman)
-* rbd-mirror: ignore errors relating to parsing the cluster config file (`pr#29808 <https://github.com/ceph/ceph/pull/29808>`_, Jason Dillaman)
-* rbd-mirror: image status should report remote status (`pr#30558 <https://github.com/ceph/ceph/pull/30558>`_, Jason Dillaman)
-* rbd-mirror: improve detection of blacklisted state (`pr#33411 <https://github.com/ceph/ceph/pull/33411>`_, Mykola Golub)
-* rbd-mirror: initial end-to-end test and associated bug fixes (`pr#33588 <https://github.com/ceph/ceph/pull/33588>`_, Jason Dillaman)
-* rbd-mirror: initial snapshot replay state machine (`pr#33166 <https://github.com/ceph/ceph/pull/33166>`_, Jason Dillaman)
-* rbd-mirror: initial snapshot-based mirroring bootstrap logic (`pr#33002 <https://github.com/ceph/ceph/pull/33002>`_, Jason Dillaman)
-* rbd-mirror: link against the specified alloc library (`issue#40110 <http://tracker.ceph.com/issues/40110>`_, `pr#28434 <https://github.com/ceph/ceph/pull/28434>`_, Jason Dillaman)
-* rbd-mirror: make logrotate work (`pr#32456 <https://github.com/ceph/ceph/pull/32456>`_, Mykola Golub)
-* rbd-mirror: mirrored clone should be same format (`pr#31161 <https://github.com/ceph/ceph/pull/31161>`_, Mykola Golub)
-* rbd-mirror: peer_ping should send the local fsid to the remote (`pr#31950 <https://github.com/ceph/ceph/pull/31950>`_, Jason Dillaman)
-* rbd-mirror: periodically flush IO and commit positions (`issue#39257 <http://tracker.ceph.com/issues/39257>`_, `pr#27533 <https://github.com/ceph/ceph/pull/27533>`_, Jason Dillaman)
-* rbd-mirror: periodically poll remote mirror configuration (`pr#32671 <https://github.com/ceph/ceph/pull/32671>`_, Jason Dillaman)
-* rbd-mirror: potential nullptr dereference in ImageReplayer::handle_start_replay (`pr#30484 <https://github.com/ceph/ceph/pull/30484>`_, Mykola Golub)
-* rbd-mirror: prevent I/O modifications against a non-primary image (`pr#33831 <https://github.com/ceph/ceph/pull/33831>`_, Jason Dillaman)
-* rbd-mirror: provide initial snapshot replay status (`pr#33440 <https://github.com/ceph/ceph/pull/33440>`_, Jason Dillaman)
-* rbd-mirror: remove journal-specific logic from image replay and bootstrap state machines (`pr#32578 <https://github.com/ceph/ceph/pull/32578>`_, Jason Dillaman)
-* rbd-mirror: removing non-primary trash snapshot (`pr#31260 <https://github.com/ceph/ceph/pull/31260>`_, Mykola Golub)
-* rbd-mirror: rename per-image replication perf counters (`pr#32184 <https://github.com/ceph/ceph/pull/32184>`_, Mykola Golub)
-* rbd-mirror: simplify peer bootstrapping (`pr#30411 <https://github.com/ceph/ceph/pull/30411>`_, Jason Dillaman)
-* rbd-mirror: snapshot mirror mode (`pr#30548 <https://github.com/ceph/ceph/pull/30548>`_, Mykola Golub)
-* rbd-mirror: snapshot-based mirroring should use image sync throttler (`pr#34040 <https://github.com/ceph/ceph/pull/34040>`_, Jason Dillaman)
-* rbd-nbd: add netlink map/unmap support (`pr#27902 <https://github.com/ceph/ceph/pull/27902>`_, Mike Christie)
-* rbd-nbd: add nl resize (`pr#29036 <https://github.com/ceph/ceph/pull/29036>`_, Mike Christie)
-* rbd-nbd: sscanf return 0 mean not-match (`issue#39269 <http://tracker.ceph.com/issues/39269>`_, `pr#27484 <https://github.com/ceph/ceph/pull/27484>`_, Jianpeng Ma)
-* rbd:  creating thick-provision image progress percent info exceeds 100% (`pr#30954 <https://github.com/ceph/ceph/pull/30954>`_, Xiangdong Mu)
-* rbd:  journal: add support for aligned appends (`pr#28351 <https://github.com/ceph/ceph/pull/28351>`_, Mykola Golub)
-* rbd:  librbd: skip stale child with non-existent pool for list descendants (`pr#29654 <https://github.com/ceph/ceph/pull/29654>`_, songweibin)
-* rbd: add --merge to disk-usage (`pr#30994 <https://github.com/ceph/ceph/pull/30994>`_, Alexandre Bruyelles)
-* rbd: add mirror snapshot schedule commands (`pr#32882 <https://github.com/ceph/ceph/pull/32882>`_, Mykola Golub)
-* rbd: add snap_exists method API (`pr#32497 <https://github.com/ceph/ceph/pull/32497>`_, Zheng Yin)
-* rbd: client,common,mgr,rbd: clang related cleanups (`pr#33657 <https://github.com/ceph/ceph/pull/33657>`_, Kefu Chai)
-* rbd: cls/rbd: improve efficiency of mirror image status queries (`pr#31865 <https://github.com/ceph/ceph/pull/31865>`_, Jason Dillaman)
-* rbd: cls/rbd: sanitize entity instance messenger version type (`pr#30438 <https://github.com/ceph/ceph/pull/30438>`_, Jason Dillaman)
-* rbd: cls/rbd: sanitize the mirror image status peer address after reading from disk (`pr#31824 <https://github.com/ceph/ceph/pull/31824>`_, Jason Dillaman)
-* rbd: cls: reduce log level for non-fatal errors (`issue#40865 <http://tracker.ceph.com/issues/40865>`_, `pr#29165 <https://github.com/ceph/ceph/pull/29165>`_, Jason Dillaman)
-* rbd: delete redundant words when trash restore fails because of same name (`pr#30952 <https://github.com/ceph/ceph/pull/30952>`_, Xiangdong Mu)
-* rbd: fixed additional issues with CEPH_ARGS processing (`pr#33219 <https://github.com/ceph/ceph/pull/33219>`_, Jason Dillaman)
-* rbd: incorporate rbd-mirror daemon status in mirror pool status (`pr#31949 <https://github.com/ceph/ceph/pull/31949>`_, Jason Dillaman)
-* rbd: journal: fix race between player shut down and cache rebalance (`pr#28748 <https://github.com/ceph/ceph/pull/28748>`_, Mykola Golub)
-* rbd: journal: fix race between player shut down and cache rebalance (`pr#29796 <https://github.com/ceph/ceph/pull/29796>`_, Mykola Golub)
-* rbd: journal: optimize object overflow detection (`pr#28240 <https://github.com/ceph/ceph/pull/28240>`_, Mykola Golub)
-* rbd: journal: properly advance read offset after skipping invalid range (`pr#28627 <https://github.com/ceph/ceph/pull/28627>`_, Mykola Golub)
-* rbd: journal: return error after first corruption detected (`pr#28820 <https://github.com/ceph/ceph/pull/28820>`_, Mykola Golub)
-* rbd: journal: wait for in flight advance sets on stopping recorder (`pr#28529 <https://github.com/ceph/ceph/pull/28529>`_, Mykola Golub)
-* rbd: krbd: avoid udev netlink socket overrun (`pr#30965 <https://github.com/ceph/ceph/pull/30965>`_, Ilya Dryomov)
-* rbd: krbd: fix rbd map hang due to udev return subsystem unordered (`issue#39089 <http://tracker.ceph.com/issues/39089>`_, `pr#27339 <https://github.com/ceph/ceph/pull/27339>`_, Zhi Zhang)
-* rbd: krbd: modprobe before calling build_map_buf() (`pr#30978 <https://github.com/ceph/ceph/pull/30978>`_, Ilya Dryomov)
-* rbd: krbd: retry on transient errors from udev_enumerate_scan_devices() (`pr#31023 <https://github.com/ceph/ceph/pull/31023>`_, Ilya Dryomov)
-* rbd: krbd: return -ETIMEDOUT in polling (`issue#38792 <http://tracker.ceph.com/issues/38792>`_, `pr#27025 <https://github.com/ceph/ceph/pull/27025>`_, Dongsheng Yang)
-* rbd: mgr/dashboard: support RBD mirroring bootstrap create/import (`issue#42355 <http://tracker.ceph.com/issues/42355>`_, `pr#31062 <https://github.com/ceph/ceph/pull/31062>`_, Jason Dillaman)
-* rbd: msg/async: avoid unnecessary costly wakeups for outbound messages (`pr#28388 <https://github.com/ceph/ceph/pull/28388>`_, Jason Dillaman)
-* rbd: msg/async: reduce verbosity of connection timeout failures (`issue#39448 <http://tracker.ceph.com/issues/39448>`_, `pr#28050 <https://github.com/ceph/ceph/pull/28050>`_, Jason Dillaman)
-* rbd: pybind/mgr/rbd_support: fix missing variable in error path (`pr#29773 <https://github.com/ceph/ceph/pull/29773>`_, Jason Dillaman)
-* rbd: pybind/mgr/rbd_support: ignore missing support for RBD namespaces (`pr#29433 <https://github.com/ceph/ceph/pull/29433>`_, Jason Dillaman)
-* rbd: pybind/mgr/rbd_support: use image ids to detect duplicate tasks (`pr#29468 <https://github.com/ceph/ceph/pull/29468>`_, Jason Dillaman)
-* rbd: pybind/mgr/rbd_support: wait for latest OSD map prior to handling commands (`pr#33451 <https://github.com/ceph/ceph/pull/33451>`_, Jason Dillaman)
-* rbd: pybind/rbd: fix call to unregister_osd_perf_queries (`pr#29419 <https://github.com/ceph/ceph/pull/29419>`_, Venky Shankar)
-* rbd: pybind/rbd: provide snap remove flags (`pr#31627 <https://github.com/ceph/ceph/pull/31627>`_, Mykola Golub)
-* rbd: qa/suites/rbd/openstack: use 18.04, not 16.04 (`pr#32284 <https://github.com/ceph/ceph/pull/32284>`_, Sage Weil)
-* rbd: rbd-ggate: fix compile errors from ceph::mutex update (`pr#29474 <https://github.com/ceph/ceph/pull/29474>`_, Willem Jan Withagen)
-* rbd: rbd-mirror: adjust journal fetch properties based on memory target (`pr#27670 <https://github.com/ceph/ceph/pull/27670>`_, Mykola Golub)
-* rbd: rbd/action: display image id in rbd du/list output (`pr#29376 <https://github.com/ceph/ceph/pull/29376>`_, songweibin)
-* rbd: rbd/action: fix error getting positional argument (`issue#40095 <http://tracker.ceph.com/issues/40095>`_, `pr#28313 <https://github.com/ceph/ceph/pull/28313>`_, songweibin)
-* rbd: rbd/bench: outputs bytes/s format dynamically (`pr#31491 <https://github.com/ceph/ceph/pull/31491>`_, Zheng Yin)
-* rbd: rbd/cache: Replicated Write Log core codes part 1 (`pr#31279 <https://github.com/ceph/ceph/pull/31279>`_, Peterson, Scott, Li, Xiaoyan, Lu, Yuan, Chamarthy, Mahati)
-* rbd: rbd/cache: Replicated Write Log core codes part 2 (`pr#31963 <https://github.com/ceph/ceph/pull/31963>`_, Peterson, Scott, Li, Xiaoyan, Lu, Yuan, Chamarthy, Mahati)
-* rbd: rbd_replay: call the member decode() explicitly (`pr#27703 <https://github.com/ceph/ceph/pull/27703>`_, Kefu Chai)
-* rbd: schedule for running trash purge operations (`pr#33389 <https://github.com/ceph/ceph/pull/33389>`_, Mykola Golub)
-* rbd: src: use un-deprecated version of aio_create_completion (`pr#31333 <https://github.com/ceph/ceph/pull/31333>`_, Adam C. Emerson)
-* rbd: use the ordered throttle for the export action (`issue#40435 <http://tracker.ceph.com/issues/40435>`_, `pr#28657 <https://github.com/ceph/ceph/pull/28657>`_, Jason Dillaman)
-* remove cephadm-adoption-corpus as submodule (`pr#33587 <https://github.com/ceph/ceph/pull/33587>`_, Sage Weil)
-* Return an error, for Bluestore OSD, if WAL or DB are defined in the tags of the OSD but not present on the system (`pr#28791 <https://github.com/ceph/ceph/pull/28791>`_, David Casier)
-* rgw,tests: qa/rgw/pubsub: fix tests to sync from master (`pr#33049 <https://github.com/ceph/ceph/pull/33049>`_, Yuval Lifshitz)
-* rgw,tests: qa/rgw/pubsub: verify incremental sync is used in pubsu (`pr#33068 <https://github.com/ceph/ceph/pull/33068>`_, Yuval Lifshitz)
-* rgw,tests: qa/rgw: add integration test for sse-kms with barbican (`pr#30218 <https://github.com/ceph/ceph/pull/30218>`_, Casey Bodley, Adam Kupczyk)
-* rgw,tests: qa/rgw: add new rgw/website suite for static website tests (`pr#30193 <https://github.com/ceph/ceph/pull/30193>`_, Casey Bodley)
-* rgw,tests: qa/rgw: add rgw_obj and throttle tests to rgw verify suite (`pr#32188 <https://github.com/ceph/ceph/pull/32188>`_, Casey Bodley)
-* rgw,tests: qa/rgw: disable debuginfo packages (`pr#27528 <https://github.com/ceph/ceph/pull/27528>`_, Casey Bodley)
-* rgw,tests: qa/rgw: dont use ceph-ansible in s3a-hadoop suite (`issue#39706 <http://tracker.ceph.com/issues/39706>`_, `pr#28068 <https://github.com/ceph/ceph/pull/28068>`_, Casey Bodley)
-* rgw,tests: qa/rgw: drop some objectstore types (`pr#30997 <https://github.com/ceph/ceph/pull/30997>`_, Casey Bodley)
-* rgw,tests: qa/rgw: exercise DeleteRange in test_bucket_index_log_trim (`pr#33047 <https://github.com/ceph/ceph/pull/33047>`_, Casey Bodley)
-* rgw,tests: qa/rgw: extra s3tests tasks use rgw endpoint configuration (`issue#17882 <http://tracker.ceph.com/issues/17882>`_, `pr#28631 <https://github.com/ceph/ceph/pull/28631>`_, Casey Bodley)
-* rgw,tests: qa/rgw: fix import error in tasks/swift.py (`issue#40304 <http://tracker.ceph.com/issues/40304>`_, `pr#28605 <https://github.com/ceph/ceph/pull/28605>`_, Casey Bodley)
-* rgw,tests: qa/rgw: fix swift warning message (`pr#28697 <https://github.com/ceph/ceph/pull/28697>`_, Casey Bodley)
-* rgw,tests: qa/rgw: more fixes for swift task (`issue#40304 <http://tracker.ceph.com/issues/40304>`_, `pr#28823 <https://github.com/ceph/ceph/pull/28823>`_, Casey Bodley)
-* rgw,tests: qa/rgw: multisite checkpoints consider pubsub zone (`pr#32941 <https://github.com/ceph/ceph/pull/32941>`_, Casey Bodley)
-* rgw,tests: qa/rgw: refactor the kms backend configuration (`pr#30940 <https://github.com/ceph/ceph/pull/30940>`_, Casey Bodley)
-* rgw,tests: qa/rgw: remove failing radosgw_admin_rest from multisite suite (`pr#32550 <https://github.com/ceph/ceph/pull/32550>`_, Casey Bodley)
-* rgw,tests: qa/rgw: remove whitelist for SLOW_OPS against ec pools (`pr#31363 <https://github.com/ceph/ceph/pull/31363>`_, Casey Bodley)
-* rgw,tests: qa/rgw: s3a-hadoop task defaults to maven-version 3.6.3 (`pr#32620 <https://github.com/ceph/ceph/pull/32620>`_, Casey Bodley)
-* rgw,tests: qa/rgw: skip swift tests on rhel 7.6+ (`issue#40304 <http://tracker.ceph.com/issues/40304>`_, `pr#28532 <https://github.com/ceph/ceph/pull/28532>`_, Casey Bodley)
-* rgw,tests: qa/rgw: update run-s3tests.sh (`pr#28964 <https://github.com/ceph/ceph/pull/28964>`_, Casey Bodley)
-* rgw,tests: qa/rgw: use testing kms backend for multisite tests (`pr#31374 <https://github.com/ceph/ceph/pull/31374>`_, Casey Bodley)
-* rgw,tests: qa/rgw: use testing kms backend for other rgw subsuites (`pr#31414 <https://github.com/ceph/ceph/pull/31414>`_, Casey Bodley)
-* rgw,tests: qa/rgw: whitelist SLOW_OPS failures against ec pools (`pr#30944 <https://github.com/ceph/ceph/pull/30944>`_, Casey Bodley)
-* rgw,tests: qa/suites/rgw/website: run test on ubuntu (`pr#32791 <https://github.com/ceph/ceph/pull/32791>`_, Sage Weil)
-* rgw,tests: qa/suites/rgw: reenable ragweed (now py3) (`pr#32310 <https://github.com/ceph/ceph/pull/32310>`_, Sage Weil)
-* rgw,tests: qa/suites: use s3-tests with python3 support (`pr#32624 <https://github.com/ceph/ceph/pull/32624>`_, Ali Maredia)
-* rgw,tests: qa/tasks/swift: remove swift tests (`pr#32357 <https://github.com/ceph/ceph/pull/32357>`_, Sage Weil)
-* rgw,tests: qa/tests: added rgw into upgrade sequence to improve coverage (`pr#29234 <https://github.com/ceph/ceph/pull/29234>`_, Yuri Weinstein)
-* rgw,tests: qa/tests: added rgw into upgrade sequence to improve coverage - splits (`pr#29282 <https://github.com/ceph/ceph/pull/29282>`_, Yuri Weinstein)
-* rgw,tests: qa: add force-branch to suites running s3readwrite & s3roundtrip tasks (`pr#32225 <https://github.com/ceph/ceph/pull/32225>`_, Ali Maredia)
-* rgw,tests: qa: bump maven repo version in s3a_hadoop.py (`pr#30531 <https://github.com/ceph/ceph/pull/30531>`_, Ali Maredia)
-* rgw,tests: qa: radosgw-admin: remove dependency on bunch package (`pr#32100 <https://github.com/ceph/ceph/pull/32100>`_, Yehuda Sadeh)
-* rgw,tests: qa: radosgw_admin: validate a simple user stats output (`pr#30684 <https://github.com/ceph/ceph/pull/30684>`_, Abhishek Lekshmanan)
-* rgw,tests: qa: remove mon valgrind check in rgw verfiy suite (`issue#38827 <http://tracker.ceph.com/issues/38827>`_, `pr#28155 <https://github.com/ceph/ceph/pull/28155>`_, Ali Maredia)
-* rgw,tests: qa: remove s3-tests from rados/basic/tasks/rgw_snaps.yml (`pr#32940 <https://github.com/ceph/ceph/pull/32940>`_, Ali Maredia)
-* rgw,tests: qa: rgw: add user-policy caps for the s3tests users (`pr#31127 <https://github.com/ceph/ceph/pull/31127>`_, Abhishek Lekshmanan)
-* rgw,tests: qa: use curl in wait_for_radosgw() in util/rgw.py (`pr#28521 <https://github.com/ceph/ceph/pull/28521>`_, Ali Maredia)
-* rgw,tests: rgw/amqp: fix race condition in AMQP unit test (`pr#30735 <https://github.com/ceph/ceph/pull/30735>`_, Yuval Lifshitz)
-* rgw,tests: rgw/amqp: remove flaky amqp test (`pr#31510 <https://github.com/ceph/ceph/pull/31510>`_, Yuval Lifshitz)
-* rgw,tests: rgw/pubsub: add multisite pubsub tests to teuthology (`pr#27838 <https://github.com/ceph/ceph/pull/27838>`_, Yuval Lifshitz)
-* rgw,tests: rgw/pubsub: tests enhancements and fixes (`pr#28910 <https://github.com/ceph/ceph/pull/28910>`_, Yuval Lifshitz)
-* rgw,tests: rgw/pubsub: use incremental sync for pubsub module by default (`pr#28470 <https://github.com/ceph/ceph/pull/28470>`_, Yuval Lifshitz)
-* rgw,tests: test/rgw: fix test-rgw-multisite.sh script for creating multisite clusters (`pr#27984 <https://github.com/ceph/ceph/pull/27984>`_, Casey Bodley)
-* rgw,tests: test/rgw: fixes for test-rgw-multisite.sh (`pr#33537 <https://github.com/ceph/ceph/pull/33537>`_, Casey Bodley)
-* rgw,tests: test/rgw: raise timer durations for unittest_rgw_reshard_wait (`pr#32094 <https://github.com/ceph/ceph/pull/32094>`_, Casey Bodley)
-* rgw,tests: test/rgw: test_rgw_reshard_wait uses same clock for timing (`pr#27035 <https://github.com/ceph/ceph/pull/27035>`_, Casey Bodley)
-* rgw,tests: vstart: move common rgw config to [client.rgw] (`pr#29449 <https://github.com/ceph/ceph/pull/29449>`_, Casey Bodley)
-* rgw,tools: ceph-dencoder: add RGWPeriodLatestEpochInfo support (`pr#30613 <https://github.com/ceph/ceph/pull/30613>`_, yuliyang)
-* rgw,tools: rgw/examples: adding examples for boto3 extensions to AWS S3 (`pr#30600 <https://github.com/ceph/ceph/pull/30600>`_, Yuval Lifshitz)
-* rgw,tools: vstart.sh: run multiple rgws with different ids (`pr#26690 <https://github.com/ceph/ceph/pull/26690>`_, Joao Eduardo Luis)
-* rgw:  rgw: cls_bucket_list_unordered lists a single shard (`issue#39393 <http://tracker.ceph.com/issues/39393>`_, `pr#27697 <https://github.com/ceph/ceph/pull/27697>`_, Casey Bodley)
-* rgw:  rgw: make radosgw-admin user create and modify distinct (`pr#31901 <https://github.com/ceph/ceph/pull/31901>`_, Matthew Oliver)
-* rgw:  rgw: returns LimitExceeded when user creates too many ACLs (`issue#26835 <http://tracker.ceph.com/issues/26835>`_, `pr#25692 <https://github.com/ceph/ceph/pull/25692>`_, Chang Liu)
-* rgw: A task to run S3 Java tests against RGW (`pr#22788 <https://github.com/ceph/ceph/pull/22788>`_, Antoaneta Damyanova)
-* rgw: add --object-version in radosgw-admin help info (`pr#30091 <https://github.com/ceph/ceph/pull/30091>`_, yuliyang)
-* rgw: add a small efficiency (`pr#29178 <https://github.com/ceph/ceph/pull/29178>`_, J. Eric Ivancich)
-* rgw: add admin rest api for bucket sync (`pr#19020 <https://github.com/ceph/ceph/pull/19020>`_, zhang Shaowen, Zhang Shaowen)
-* rgw: add cls_queue and cls_rgw_gc for omap offload (`pr#28421 <https://github.com/ceph/ceph/pull/28421>`_, Pritha Srivastava, Casey Bodley)
-* rgw: add const correctness to some rest functions (`pr#31660 <https://github.com/ceph/ceph/pull/31660>`_, J. Eric Ivancich)
-* rgw: add creation time information into bucket stats (`pr#30384 <https://github.com/ceph/ceph/pull/30384>`_, Enming Zhang)
-* rgw: Add days0 to rgw lc (`pr#29937 <https://github.com/ceph/ceph/pull/29937>`_, Or Friedmann)
-* rgw: add detailed error message for PutACLs (`pr#30385 <https://github.com/ceph/ceph/pull/30385>`_, Enming Zhang)
-* rgw: add editor directive comments to rgw services source files (`pr#27897 <https://github.com/ceph/ceph/pull/27897>`_, J. Eric Ivancich)
-* rgw: add GET /admin/realm?list api to list realms (`pr#28156 <https://github.com/ceph/ceph/pull/28156>`_, Casey Bodley)
-* rgw: add missing admin property when sync user info (`pr#30127 <https://github.com/ceph/ceph/pull/30127>`_, zhang Shaowen)
-* rgw: add missing bilog status to help info (`pr#30357 <https://github.com/ceph/ceph/pull/30357>`_, zhang Shaowen)
-* rgw: add missing close_section in send_versioned_response (`pr#28946 <https://github.com/ceph/ceph/pull/28946>`_, Casey Bodley)
-* rgw: Add more details to the LC delete and transit log (`pr#30913 <https://github.com/ceph/ceph/pull/30913>`_, Or Friedmann)
-* rgw: add num_shards to radosgw-admin bucket stats (`pr#30845 <https://github.com/ceph/ceph/pull/30845>`_, Paul Emmerich)
-* rgw: add option to specify shard-id for bi list admin command (`pr#29394 <https://github.com/ceph/ceph/pull/29394>`_, Mark Kogan)
-* rgw: add optional_yield to http client interface (`pr#25355 <https://github.com/ceph/ceph/pull/25355>`_, Casey Bodley)
-* rgw: add optional_yield to SysObj service interfaces (`pr#25353 <https://github.com/ceph/ceph/pull/25353>`_, Casey Bodley)
-* rgw: add PublicAccessBlock set of APIs on buckets (`pr#30033 <https://github.com/ceph/ceph/pull/30033>`_, Abhishek Lekshmanan)
-* rgw: add rgw_rados_pool_recovery_priority (default 5) (`pr#29181 <https://github.com/ceph/ceph/pull/29181>`_, Sage Weil)
-* rgw: add roles_pool in RGWZoneParams dump/decode json (`issue#22162 <http://tracker.ceph.com/issues/22162>`_, `pr#17338 <https://github.com/ceph/ceph/pull/17338>`_, Tianshan Qu)
-* rgw: add S3 object lock feature to support object worm (`pr#26538 <https://github.com/ceph/ceph/pull/26538>`_, zhang Shaowen)
-* rgw: add some comments to rgw code to help explain functionality (`pr#27896 <https://github.com/ceph/ceph/pull/27896>`_, J. Eric Ivancich)
-* rgw: add SSE-KMS with Vault using token auth (`pr#29783 <https://github.com/ceph/ceph/pull/29783>`_, Andrea Baglioni, Sergio de Carvalho)
-* rgw: Add support bucket policy for subuser (`pr#33165 <https://github.com/ceph/ceph/pull/33165>`_, Seena Fallah)
-* rgw: add tenant as parameter to User in multisite tests (`pr#27969 <https://github.com/ceph/ceph/pull/27969>`_, Yuval Lifshitz)
-* rgw: add transaction id to ops log (`pr#30163 <https://github.com/ceph/ceph/pull/30163>`_, zhang Shaowen)
-* rgw: add YieldingAioThrottle for async PutObj/GetObj (`pr#26173 <https://github.com/ceph/ceph/pull/26173>`_, Casey Bodley)
-* rgw: Added caching for S3 credentials retrieved from keystone (`pr#26095 <https://github.com/ceph/ceph/pull/26095>`_, James Weaver)
-* rgw: adding documentation for AssumeRoleWithWebIdentity (`pr#31994 <https://github.com/ceph/ceph/pull/31994>`_, Pritha Srivastava)
-* rgw: Adding iam namespace for Role and User Policy related REST APIs (`pr#27178 <https://github.com/ceph/ceph/pull/27178>`_, Pritha Srivastava)
-* rgw: adding mfa code validation when bucket versioning status is changed (`pr#31767 <https://github.com/ceph/ceph/pull/31767>`_, Pritha Srivastava)
-* rgw: Adding tcp_nodelay option to Beast (`pr#27008 <https://github.com/ceph/ceph/pull/27008>`_, Or Friedmann)
-* rgw: address 0-length listing results when non-vis entries dominate (`pr#32636 <https://github.com/ceph/ceph/pull/32636>`_, J. Eric Ivancich)
-* rgw: adjust allowable bucket index shard counts for dynamic resharding (`pr#30795 <https://github.com/ceph/ceph/pull/30795>`_, J. Eric Ivancich)
-* rgw: admin: handle delete_at attr in object stat output (`pr#27781 <https://github.com/ceph/ceph/pull/27781>`_, Abhishek Lekshmanan)
-* rgw: Allow admin APIs that write metadata to be executed first on the mast\xe2\x80\xa6 (`issue#39549 <http://tracker.ceph.com/issues/39549>`_, `pr#29549 <https://github.com/ceph/ceph/pull/29549>`_, Shilpa Jagannath)
-* rgw: allow radosgw-admin to list bucket w --allow-unordered (`issue#39637 <http://tracker.ceph.com/issues/39637>`_, `pr#28031 <https://github.com/ceph/ceph/pull/28031>`_, J. Eric Ivancich)
-* rgw: allow reshard log entries for non-existent buckets to be cancelled (`pr#31271 <https://github.com/ceph/ceph/pull/31271>`_, J. Eric Ivancich)
-* rgw: apply_olh_log ignores RGW_ATTR_OLH_VER decode error (`pr#31976 <https://github.com/ceph/ceph/pull/31976>`_, Casey Bodley)
-* rgw: asio: check the remote endpoint before processing requests (`pr#29967 <https://github.com/ceph/ceph/pull/29967>`_, Abhishek Lekshmanan)
-* rgw: auth/Crypto: fallback to /dev/urandom if getentropy() fails (`pr#30544 <https://github.com/ceph/ceph/pull/30544>`_, Kefu Chai)
-* rgw: auto-clean reshard queue entries for non-existent buckets (`pr#31323 <https://github.com/ceph/ceph/pull/31323>`_, J. Eric Ivancich)
-* rgw: az: add archive zone tests (`pr#29359 <https://github.com/ceph/ceph/pull/29359>`_, Javier M. Mellid)
-* rgw: beast frontend uses 512k mprotected coroutine stacks (`pr#31580 <https://github.com/ceph/ceph/pull/31580>`_, Daniel Gryniewicz, Casey Bodley)
-* rgw: beast frontend uses yield_context to read/write body (`pr#27795 <https://github.com/ceph/ceph/pull/27795>`_, Casey Bodley)
-* rgw: beast port parsing (`issue#39000 <http://tracker.ceph.com/issues/39000>`_, `pr#27242 <https://github.com/ceph/ceph/pull/27242>`_, Abhishek Lekshmanan)
-* rgw: beast ssl certs config through config-key (`pr#33287 <https://github.com/ceph/ceph/pull/33287>`_, Yehuda Sadeh)
-* rgw: bucket granularity sync (`pr#31686 <https://github.com/ceph/ceph/pull/31686>`_, Yehuda Sadeh)
-* rgw: bucket re-creation fixes (`pr#32121 <https://github.com/ceph/ceph/pull/32121>`_, Yehuda Sadeh)
-* rgw: bucket stats report mtime in UTC (`pr#27617 <https://github.com/ceph/ceph/pull/27617>`_, Casey Bodley)
-* rgw: bucket tagging (`pr#27993 <https://github.com/ceph/ceph/pull/27993>`_, Chang Liu)
-* rgw: build async scheduler only when beast is built (`pr#26634 <https://github.com/ceph/ceph/pull/26634>`_, Abhishek Lekshmanan)
-* rgw: build radosgw daemon as a shared lib + small executable (`pr#32404 <https://github.com/ceph/ceph/pull/32404>`_, Kaleb S. Keithley)
-* rgw: build_linked_oids_for_bucket and build_buckets_instance_index should return negative value if it fails (`pr#31346 <https://github.com/ceph/ceph/pull/31346>`_, zhangshaowen)
-* rgw: change cls rgw reshard status to enum class (`pr#30611 <https://github.com/ceph/ceph/pull/30611>`_, J. Eric Ivancich)
-* rgw: change MAX_USAGE_TRIM_ENTRIES value from 128 to 1000 (`pr#30392 <https://github.com/ceph/ceph/pull/30392>`_, zhang Shaowen)
-* rgw: check lc objs not empty after fetching (`pr#26167 <https://github.com/ceph/ceph/pull/26167>`_, Yao Zongyou)
-* rgw: clean index and remove bucket instance info when setting resharding status fails (`pr#31103 <https://github.com/ceph/ceph/pull/31103>`_, zhangshaowen)
-* rgw: clean up ordered list (`pr#31338 <https://github.com/ceph/ceph/pull/31338>`_, J. Eric Ivancich)
-* rgw: clean up some logging (`pr#27411 <https://github.com/ceph/ceph/pull/27411>`_, J. Eric Ivancich)
-* rgw: cleanup the magic string usage in cls_rgw_client.cc (`pr#31432 <https://github.com/ceph/ceph/pull/31432>`_, zhangshaowen)
-* rgw: cleanup:remove un-used class member in RGWDeleteLC (`pr#31404 <https://github.com/ceph/ceph/pull/31404>`_, zhang Shaowen)
-* rgw: cleanup:remove un-used create_new_bucket_instance in rgw_admin.cc (`pr#31345 <https://github.com/ceph/ceph/pull/31345>`_, zhangshaowen)
-* rgw: clear ent_list for each loop of bucket list (`issue#44394 <http://tracker.ceph.com/issues/44394>`_, `pr#33693 <https://github.com/ceph/ceph/pull/33693>`_, Yao Zongyou)
-* rgw: cls/rgw: fix bilog trim tests in ceph_test_cls_rgw (`pr#30268 <https://github.com/ceph/ceph/pull/30268>`_, Casey Bodley)
-* rgw: cls/rgw: keep issuing bilog trim ops after reset (`issue#40187 <http://tracker.ceph.com/issues/40187>`_, `pr#28430 <https://github.com/ceph/ceph/pull/28430>`_, Casey Bodley)
-* rgw: cls/rgw: test before accessing pkeys->rbegin() (`issue#39984 <http://tracker.ceph.com/issues/39984>`_, `pr#28391 <https://github.com/ceph/ceph/pull/28391>`_, Casey Bodley)
-* rgw: cls/rgw: when object is versioned and lc transition it, the object is becoming non-current (`pr#32458 <https://github.com/ceph/ceph/pull/32458>`_, Or Friedmann)
-* rgw: cls/user: cls_user_set_buckets_info overwrites creation_time (`issue#39635 <http://tracker.ceph.com/issues/39635>`_, `pr#28045 <https://github.com/ceph/ceph/pull/28045>`_, Casey Bodley)
-* rgw: cls_bucket_list\\_(un)ordered should clear results collection (`pr#33702 <https://github.com/ceph/ceph/pull/33702>`_, J. Eric Ivancich)
-* rgw: compression info should be same during multipart uploading (`pr#30574 <https://github.com/ceph/ceph/pull/30574>`_, zhang Shaowen)
-* rgw: conditionally allow non-unique email addresses (`issue#40089 <http://tracker.ceph.com/issues/40089>`_, `pr#28327 <https://github.com/ceph/ceph/pull/28327>`_, Matt Benjamin)
-* rgw: continuation token doesnt work in list object v2 request (`pr#28988 <https://github.com/ceph/ceph/pull/28988>`_, zhang Shaowen)
-* rgw: continuationToken or startAfter shouldnt be returned if not specified (`pr#29298 <https://github.com/ceph/ceph/pull/29298>`_, zhang Shaowen)
-* rgw: correct some error log about reshard in cls_rgw.cc (`pr#31429 <https://github.com/ceph/ceph/pull/31429>`_, zhangshaowen)
-* rgw: crypt: permit RGW-AUTO/default with SSE-S3 headers (`pr#30189 <https://github.com/ceph/ceph/pull/30189>`_, Matt Benjamin)
-* rgw: crypto: throw DigestException from Digest and HMAC (`issue#39456 <http://tracker.ceph.com/issues/39456>`_, `pr#27765 <https://github.com/ceph/ceph/pull/27765>`_, Matt Benjamin)
-* rgw: data sync markers include timestamp from datalog entry (`pr#32309 <https://github.com/ceph/ceph/pull/32309>`_, Casey Bodley)
-* rgw: data/bilogs are trimmed when no peers are reading them (`issue#39487 <http://tracker.ceph.com/issues/39487>`_, `pr#27794 <https://github.com/ceph/ceph/pull/27794>`_, Casey Bodley)
-* rgw: datalog/mdlog trim commands loop until done (`pr#29448 <https://github.com/ceph/ceph/pull/29448>`_, Casey Bodley)
-* rgw: data_sync_source_zones only contains exporting zones (`pr#33193 <https://github.com/ceph/ceph/pull/33193>`_, Casey Bodley)
-* rgw: decrypt filter does not cross multipart boundaries (`issue#38700 <http://tracker.ceph.com/issues/38700>`_, `pr#27130 <https://github.com/ceph/ceph/pull/27130>`_, Adam Kupczyk, Casey Bodley, Abhishek Lekshmanan)
-* rgw: DefaultRetention requires either Days or Years (`pr#29680 <https://github.com/ceph/ceph/pull/29680>`_, Chang Liu)
-* rgw: delete_obj_index() takes mtime for bilog (`issue#24991 <http://tracker.ceph.com/issues/24991>`_, `pr#27980 <https://github.com/ceph/ceph/pull/27980>`_, Casey Bodley)
-* rgw: distinguish different get_usage for usage log (`pr#17719 <https://github.com/ceph/ceph/pull/17719>`_, Jiaying Ren)
-* rgw: dmclock: wait until the request is handled (`pr#30777 <https://github.com/ceph/ceph/pull/30777>`_, GaryHyg)
-* rgw: do not miss the 1000th element of every iteration during lifecycle processing (`pr#30861 <https://github.com/ceph/ceph/pull/30861>`_, Ilsoo Byun)
-* rgw: do not remove delete marker when fixing versioned bucket (`pr#32562 <https://github.com/ceph/ceph/pull/32562>`_, Ilsoo Byun)
-* rgw: Dont crash on copy when metadata directive not supplied (`issue#40416 <http://tracker.ceph.com/issues/40416>`_, `pr#28949 <https://github.com/ceph/ceph/pull/28949>`_, Adam C. Emerson)
-* rgw: dont crash on missing /etc/mime.types (`issue#38328 <http://tracker.ceph.com/issues/38328>`_, `pr#26998 <https://github.com/ceph/ceph/pull/26998>`_, Casey Bodley)
-* rgw: dont print error log when list reshard result is not truncated (`pr#31142 <https://github.com/ceph/ceph/pull/31142>`_, zhangshaowen)
-* rgw: dont recalculate etags for slo/dlo (`pr#27470 <https://github.com/ceph/ceph/pull/27470>`_, Casey Bodley)
-* rgw: dont throw when accept errors are happening on frontend (`pr#29587 <https://github.com/ceph/ceph/pull/29587>`_, Yuval Lifshitz)
-* rgw: drop cloud sync module logs attrs from the log (`pr#27820 <https://github.com/ceph/ceph/pull/27820>`_, Nathan Cutler)
-* rgw: drop dead flush_read_list declaration (`pr#29458 <https://github.com/ceph/ceph/pull/29458>`_, Jiaying Ren)
-* rgw: drop unused rgw_decode_pki_token() (`pr#27052 <https://github.com/ceph/ceph/pull/27052>`_, Radoslaw Zarzynski)
-* rgw: dump s3_code as the Code response element in RGWDeleteMultiObj_ObjStore_S3 (`issue#18241 <http://tracker.ceph.com/issues/18241>`_, `pr#12470 <https://github.com/ceph/ceph/pull/12470>`_, Radoslaw Zarzynski)
-* rgw: eliminates duplicated tags_bl var (`pr#27970 <https://github.com/ceph/ceph/pull/27970>`_, Chang Liu)
-* rgw: Evaluating bucket policies also while reading permissions for an\xe2\x80\xa6 (`issue#38638 <http://tracker.ceph.com/issues/38638>`_, `pr#27309 <https://github.com/ceph/ceph/pull/27309>`_, Pritha Srivastava)
-* rgw: examples: rgw: add boto3 append & get usage api extensions (`pr#33063 <https://github.com/ceph/ceph/pull/33063>`_, Abhishek Lekshmanan)
-* rgw: Expiration days cant be zero and  transition days can be zero (`pr#30878 <https://github.com/ceph/ceph/pull/30878>`_, zhang Shaowen)
-* rgw: extend SSE-KMS with Vault using transit secrets engine (`pr#31361 <https://github.com/ceph/ceph/pull/31361>`_, Andrea Baglioni, Sergio de Carvalho)
-* rgw: fetch_remote_obj() compares expected object size (`pr#28303 <https://github.com/ceph/ceph/pull/28303>`_, Xiaoxi CHEN, Casey Bodley)
-* rgw: find oldest period and update RGWMetadataLogHistory() (`pr#31873 <https://github.com/ceph/ceph/pull/31873>`_, Shilpa Jagannath)
-* rgw: fix a bug that bucket instance obj cant be removed after resharding completed (`pr#31483 <https://github.com/ceph/ceph/pull/31483>`_, zhang Shaowen)
-* rgw: fix a bug that lifecycle expiraton generates delete marker continuously (`issue#40393 <http://tracker.ceph.com/issues/40393>`_, `pr#28587 <https://github.com/ceph/ceph/pull/28587>`_, zhang Shaowen)
-* rgw: fix bucket may redundantly list keys after BI_PREFIX_CHAR (`issue#39984 <http://tracker.ceph.com/issues/39984>`_, `pr#28188 <https://github.com/ceph/ceph/pull/28188>`_, Tianshan Qu)
-* rgw: Fix bucket versioning vs. swift metadata bug (`pr#29240 <https://github.com/ceph/ceph/pull/29240>`_, Marcus Watts)
-* rgw: Fix bug on subuser policy identity checker (`pr#33398 <https://github.com/ceph/ceph/pull/33398>`_, Seena Fallah)
-* rgw: fix bug with (un)ordered bucket listing and marker w/ namespace (`pr#33046 <https://github.com/ceph/ceph/pull/33046>`_, J. Eric Ivancich)
-* rgw: fix bugs in listobjectsv1 (`pr#28873 <https://github.com/ceph/ceph/pull/28873>`_, Albin Antony)
-* rgw: fix cls_bucket_list_unordered() partial results (`pr#29692 <https://github.com/ceph/ceph/pull/29692>`_, Mark Kogan)
-* rgw: fix compile errors with boost 1.70 (`pr#27730 <https://github.com/ceph/ceph/pull/27730>`_, Casey Bodley)
-* rgw: fix data consistency error casued by rgw sent timeout (`pr#30257 <https://github.com/ceph/ceph/pull/30257>`_, \xe6\x9d\x8e\xe7\xba\xb2\xe5\xbd\xac82225)
-* rgw: fix data sync start delay if remote havent init data_log (`pr#30393 <https://github.com/ceph/ceph/pull/30393>`_, Tianshan Qu)
-* rgw: fix default storage class for get_compression_type (`pr#29909 <https://github.com/ceph/ceph/pull/29909>`_, Casey Bodley)
-* rgw: fix default_placement containing / when storage_class is standard (`issue#39380 <http://tracker.ceph.com/issues/39380>`_, `pr#27676 <https://github.com/ceph/ceph/pull/27676>`_, mkogan1)
-* rgw: fix dns name comparison for virtual hosting (`pr#30221 <https://github.com/ceph/ceph/pull/30221>`_, Casey Bodley)
-* rgw: Fix documentation for rgw_ldap_secret (`pr#29816 <https://github.com/ceph/ceph/pull/29816>`_, Robin M\xc3\xbcller)
-* rgw: fix drain handles error when deleting bucket with bypass-gc option (`pr#28789 <https://github.com/ceph/ceph/pull/28789>`_, dongdong tao)
-* rgw: Fix dynamic resharding not working for empty zonegroup in period (`pr#31977 <https://github.com/ceph/ceph/pull/31977>`_, Or Friedmann)
-* rgw: Fix expiration header does not return the earliest rule (`pr#29399 <https://github.com/ceph/ceph/pull/29399>`_, Or Friedmann)
-* rgw: fix incorrect radosgw-admin zonegroup rm info (`pr#30319 <https://github.com/ceph/ceph/pull/30319>`_, zhang Shaowen)
-* rgw: fix indentation for listobjectsv2 (`pr#28830 <https://github.com/ceph/ceph/pull/28830>`_, Albin Antony)
-* rgw: fix list bucket with delimiter wrongly skip some special keys (`issue#40905 <http://tracker.ceph.com/issues/40905>`_, `pr#29215 <https://github.com/ceph/ceph/pull/29215>`_, Tianshan Qu)
-* rgw: fix list bucket with start maker and delimiter / will miss next object\xe2\x80\xa6 (`issue#39989 <http://tracker.ceph.com/issues/39989>`_, `pr#28192 <https://github.com/ceph/ceph/pull/28192>`_, Tianshan Qu)
-* rgw: fix list versions starts with version_id=null (`pr#29897 <https://github.com/ceph/ceph/pull/29897>`_, Tianshan Qu)
-* rgw: fix MalformedXML errors in PutBucketObjectLock/PutObjRetention (`pr#28783 <https://github.com/ceph/ceph/pull/28783>`_, Casey Bodley)
-* rgw: fix memory growth while deleting objects with (`pr#30174 <https://github.com/ceph/ceph/pull/30174>`_, Mark Kogan)
-* rgw: fix minimum of unordered bucket listing (`pr#30146 <https://github.com/ceph/ceph/pull/30146>`_, J. Eric Ivancich)
-* rgw: fix minor compiler warning in keystone auth (`pr#27100 <https://github.com/ceph/ceph/pull/27100>`_, David Disseldorp)
-* rgw: fix miss get ret in STSService::storeARN (`issue#40386 <http://tracker.ceph.com/issues/40386>`_, `pr#28527 <https://github.com/ceph/ceph/pull/28527>`_, Tianshan Qu)
-* rgw: fix miss handle curl error return (`pr#28345 <https://github.com/ceph/ceph/pull/28345>`_, Casey Bodley, Tianshan Qu)
-* rgw: fix missing tenant prefix in bucket name during bucket link (`pr#29815 <https://github.com/ceph/ceph/pull/29815>`_, Shilpa Jagannath)
-* rgw: fix multipart uploads error response (`pr#32771 <https://github.com/ceph/ceph/pull/32771>`_, GaryHyg)
-* rgw: Fix narrowing conversion error (`pr#28905 <https://github.com/ceph/ceph/pull/28905>`_, Adam C. Emerson)
-* rgw: fix one part of the bulk delete(RGWDeleteMultiObj_ObjStore_S3) fails but no error messages (`pr#29795 <https://github.com/ceph/ceph/pull/29795>`_, Snow Si)
-* rgw: fix opslog operation field as per Amazon s3 (`issue#20978 <http://tracker.ceph.com/issues/20978>`_, `pr#30539 <https://github.com/ceph/ceph/pull/30539>`_, Jiaying Ren)
-* rgw: fix potential realm watch lost (`issue#40991 <http://tracker.ceph.com/issues/40991>`_, `pr#29369 <https://github.com/ceph/ceph/pull/29369>`_, Tianshan Qu)
-* rgw: fix read not exists null version return wrong (`issue#38811 <http://tracker.ceph.com/issues/38811>`_, `pr#27047 <https://github.com/ceph/ceph/pull/27047>`_, Tianshan Qu)
-* rgw: fix refcount tags to match and update objects idtag (`pr#30013 <https://github.com/ceph/ceph/pull/30013>`_, J. Eric Ivancich)
-* rgw: fix REQUEST_URI setting in the rgw_asio_client.cc (`pr#30540 <https://github.com/ceph/ceph/pull/30540>`_, Jiaying Ren)
-* rgw: fix rgw crash and set correct error code (`pr#28172 <https://github.com/ceph/ceph/pull/28172>`_, yuliyang)
-* rgw: fix rgw crash when duration is invalid in sts request (`pr#32119 <https://github.com/ceph/ceph/pull/32119>`_, yuliyang)
-* rgw: fix rgw crash when token is not base64 encode (`pr#31830 <https://github.com/ceph/ceph/pull/31830>`_, yuliyang)
-* rgw: fix rgw decompression log-print (`pr#29633 <https://github.com/ceph/ceph/pull/29633>`_, Han Fengzhe)
-* rgw: fix rgw lc does not delete objects that do not have exactly the same tags as the rule (`pr#30151 <https://github.com/ceph/ceph/pull/30151>`_, Or Friedmann)
-* rgw: fix RGWDeleteMultiObj::verify_permission() (`pr#26947 <https://github.com/ceph/ceph/pull/26947>`_, Irek Fasikhov)
-* rgw: fix RGWUserInfo decode current version (`pr#31591 <https://github.com/ceph/ceph/pull/31591>`_, Chang Liu)
-* rgw: fix S3 compatibility bug when CORS is not found (`issue#37945 <http://tracker.ceph.com/issues/37945>`_, `pr#25999 <https://github.com/ceph/ceph/pull/25999>`_, Nick Janus)
-* rgw: fix sharded bucket listing with prefix/delimiter (`pr#33628 <https://github.com/ceph/ceph/pull/33628>`_, Casey Bodley)
-* rgw: fix SignatureDoesNotMatch when use ipv6 address in s3 client (`pr#30778 <https://github.com/ceph/ceph/pull/30778>`_, yuliyang)
-* rgw: fix signed char truncation in delimiter check (`pr#27001 <https://github.com/ceph/ceph/pull/27001>`_, Matt Benjamin)
-* rgw: fix string_view formatting in RGWFormatter_Plain (`pr#33754 <https://github.com/ceph/ceph/pull/33754>`_, Casey Bodley)
-* rgw: fix the bug of rgw not doing necessary checking to website configuration (`issue#40678 <http://tracker.ceph.com/issues/40678>`_, `pr#28904 <https://github.com/ceph/ceph/pull/28904>`_, Enming Zhang)
-* rgw: fix unlock of shared lock in RGWCache (`pr#29558 <https://github.com/ceph/ceph/pull/29558>`_, Abhishek Lekshmanan)
-* rgw: fix unlock of shared lock in RGWDataChangesLog (`pr#29538 <https://github.com/ceph/ceph/pull/29538>`_, Casey Bodley)
-* rgw: Fix upload part copy range able to get almost any string (`pr#32487 <https://github.com/ceph/ceph/pull/32487>`_, Or Friedmann)
-* rgw: fix version tracking across bucket link steps (`pr#29851 <https://github.com/ceph/ceph/pull/29851>`_, Matt Benjamin)
-* rgw: fixed unrecognized arg error when using radosgw-admin zone rm (`pr#30060 <https://github.com/ceph/ceph/pull/30060>`_, Hongang Chen)
-* rgw: Fixes related to omap offload and gc (`pr#33372 <https://github.com/ceph/ceph/pull/33372>`_, Pritha Srivastava)
-* rgw: followup for user rename (`pr#29540 <https://github.com/ceph/ceph/pull/29540>`_, Casey Bodley)
-* rgw: forwarded some requests to master zone (`pr#28276 <https://github.com/ceph/ceph/pull/28276>`_, Chang Liu)
-* rgw: gc remove tag after all sub io finish (`issue#40903 <http://tracker.ceph.com/issues/40903>`_, `pr#29199 <https://github.com/ceph/ceph/pull/29199>`_, Tianshan Qu)
-* rgw: get barbican secret key request maybe return error code (`pr#29639 <https://github.com/ceph/ceph/pull/29639>`_, Richard Bai(\xe7\x99\xbd\xe5\xad\xa6\xe4\xbd\x99))
-* rgw: get elastic search info in start_sync, avoid creating new coroutines manager (`pr#32269 <https://github.com/ceph/ceph/pull/32269>`_, Chang Liu)
-* rgw: housekeeping of reset stats operation in radosgw-admin and cls back-end (`pr#29515 <https://github.com/ceph/ceph/pull/29515>`_, J. Eric Ivancich)
-* rgw: http client drops lock before suspending coroutine (`pr#29553 <https://github.com/ceph/ceph/pull/29553>`_, Casey Bodley)
-* rgw: iam: add all http args to req_info (`pr#31124 <https://github.com/ceph/ceph/pull/31124>`_, Abhishek Lekshmanan)
-* rgw: iam: use a function to calculate the Action Bit string (`pr#30152 <https://github.com/ceph/ceph/pull/30152>`_, Abhishek Lekshmanan)
-* rgw: ignore If-Unmodified-Since if If-Match exists, and ignore If-Modified-Since if If-None-Match exists (`pr#28625 <https://github.com/ceph/ceph/pull/28625>`_, zhang Shaowen)
-* rgw: improve beast (`pr#33017 <https://github.com/ceph/ceph/pull/33017>`_, Or Friedmann, Matt Benjamin)
-* rgw: improve data sync restart after failure (`pr#30175 <https://github.com/ceph/ceph/pull/30175>`_, Tianshan Qu)
-* rgw: improve debugs on the path of RGWRados::cls_bucket_head (`pr#12709 <https://github.com/ceph/ceph/pull/12709>`_, Radoslaw Zarzynski)
-* rgw: improvements to SSE-KMS with Vault (`pr#31025 <https://github.com/ceph/ceph/pull/31025>`_, Andrea Baglioni, Sergio de Carvalho)
-* rgw: Improving doc for Cross Project(Tenant) access with Openstack Ke\xe2\x80\xa6 (`pr#27507 <https://github.com/ceph/ceph/pull/27507>`_, Pritha Srivastava)
-* rgw: incorrect return value when processing CORS headers (`pr#28622 <https://github.com/ceph/ceph/pull/28622>`_, Ilsoo Byun)
-* rgw: Incorrectly calling ceph::buffer::list::decode_base64 in bucket policy (`pr#31356 <https://github.com/ceph/ceph/pull/31356>`_, GaryHyg)
-* rgw: increase beast parse buffer size to 64k (`pr#29776 <https://github.com/ceph/ceph/pull/29776>`_, Casey Bodley)
-* rgw: increase log level for same or older period pull msg (`pr#33527 <https://github.com/ceph/ceph/pull/33527>`_, Ali Maredia)
-* rgw: Increase the default number of RGW bucket shards (`pr#32660 <https://github.com/ceph/ceph/pull/32660>`_, Casey Bodley, Mark Nelson)
-* rgw: init-radosgw: use ceph-conf to get cluster configuration value (`pr#27538 <https://github.com/ceph/ceph/pull/27538>`_, Daniel Badea)
-* rgw: Initialize member variables in rgw_sync.h, rgw_rados.h (`pr#16929 <https://github.com/ceph/ceph/pull/16929>`_, amitkuma)
-* rgw: initialize member variables of rgw_log_entry (`pr#32430 <https://github.com/ceph/ceph/pull/32430>`_, Kefu Chai)
-* rgw: kill compile warnning in rgw_object_lock.h (`pr#30489 <https://github.com/ceph/ceph/pull/30489>`_, Chang Liu)
-* rgw: LC expiration header should present midnight expiration date (`pr#31887 <https://github.com/ceph/ceph/pull/31887>`_, Or Friedmann)
-* rgw: lc: check for valid placement target before processing transitions (`pr#28256 <https://github.com/ceph/ceph/pull/28256>`_, Abhishek Lekshmanan)
-* rgw: LC: handle resharded buckets (`pr#26564 <https://github.com/ceph/ceph/pull/26564>`_, Abhishek Lekshmanan)
-* rgw: ldap auth: S3 auth failure should return InvalidAccessKeyId (`pr#30332 <https://github.com/ceph/ceph/pull/30332>`_, Matt Benjamin)
-* rgw: ldap: fix LDAPAuthEngine::init() when uri !empty() (`pr#26911 <https://github.com/ceph/ceph/pull/26911>`_, Matt Benjamin)
-* rgw: lifecycle days may be 0 (`pr#26524 <https://github.com/ceph/ceph/pull/26524>`_, Matt Benjamin)
-* rgw: lifecycle: alternate solution to prefix_map conflict (`issue#37879 <http://tracker.ceph.com/issues/37879>`_, `pr#26518 <https://github.com/ceph/ceph/pull/26518>`_, Matt Benjamin)
-* rgw: limit entries in remove_olh_pending_entries() (`issue#39118 <http://tracker.ceph.com/issues/39118>`_, `pr#27400 <https://github.com/ceph/ceph/pull/27400>`_, Casey Bodley)
-* rgw: list buckets: dont return buckets if limit=0 (`pr#32109 <https://github.com/ceph/ceph/pull/32109>`_, Yehuda Sadeh)
-* rgw: list_bucket versions return NextVersionIdMarker = null if next_marker.instance is empty (`pr#17591 <https://github.com/ceph/ceph/pull/17591>`_, Shasha Lu)
-* rgw: log refactoring for putobj_processor (`pr#26107 <https://github.com/ceph/ceph/pull/26107>`_, Ali Maredia)
-* rgw: log refactoring for rgw_rest_s3/swift ops (`pr#27037 <https://github.com/ceph/ceph/pull/27037>`_, Ali Maredia)
-* rgw: make dns hostnames matching case insensitive (`issue#40995 <http://tracker.ceph.com/issues/40995>`_, `pr#29380 <https://github.com/ceph/ceph/pull/29380>`_, Abhishek Lekshmanan)
-* rgw: make max_connections configurable in beast (`pr#33053 <https://github.com/ceph/ceph/pull/33053>`_, Tiago Pasqualini)
-* rgw: Make rgw admin ops api get user info consistent with the command line (`pr#26183 <https://github.com/ceph/ceph/pull/26183>`_, Li Shuhao)
-* rgw: make sure modelines are correct for all files (`pr#29742 <https://github.com/ceph/ceph/pull/29742>`_, Daniel Gryniewicz)
-* rgw: maybe coredump when reload operator happened (`pr#29733 <https://github.com/ceph/ceph/pull/29733>`_, Richard Bai(\xe7\x99\xbd\xe5\xad\xa6\xe4\xbd\x99))
-* rgw: metadata refactoring (`pr#29118 <https://github.com/ceph/ceph/pull/29118>`_, Casey Bodley, Yehuda Sadeh)
-* rgw: mgr/ansible: Change default realm and zonegroup (`pr#29793 <https://github.com/ceph/ceph/pull/29793>`_, Sebastian Wagner)
-* rgw: mgr/dashboard: enable/disable MFA Delete on RGW bucket (`pr#31922 <https://github.com/ceph/ceph/pull/31922>`_, Alfonso Mart\xc3\xadnez)
-* rgw: mgr/orchestrator: name rgw by client.rgw.$realm.$zone[.$id] (`pr#31890 <https://github.com/ceph/ceph/pull/31890>`_, Sage Weil)
-* rgw: mitigate bucket list with max-entries excessively high (`pr#29179 <https://github.com/ceph/ceph/pull/29179>`_, J. Eric Ivancich)
-* rgw: move bucket reshard checks out of write path (`pr#29852 <https://github.com/ceph/ceph/pull/29852>`_, Casey Bodley)
-* rgw: move delimiter-based bucket listing/filtering logic to cls (`pr#30272 <https://github.com/ceph/ceph/pull/30272>`_, J. Eric Ivancich)
-* rgw: move forward marker even in case of many rgw.none indexes (`pr#32513 <https://github.com/ceph/ceph/pull/32513>`_, Ilsoo Byun)
-* rgw: Move upload_info declaration out of conditional (`pr#29559 <https://github.com/ceph/ceph/pull/29559>`_, Adam C. Emerson)
-* rgw: multipart upload abort is best-effort (`issue#40526 <http://tracker.ceph.com/issues/40526>`_, `pr#28724 <https://github.com/ceph/ceph/pull/28724>`_, J. Eric Ivancich)
-* rgw: MultipartObjectProcessor supports stripe size > chunk size (`pr#32996 <https://github.com/ceph/ceph/pull/32996>`_, Casey Bodley)
-* rgw: multisite log trimming only checks peers that sync from us (`issue#39283 <http://tracker.ceph.com/issues/39283>`_, `pr#27567 <https://github.com/ceph/ceph/pull/27567>`_, Casey Bodley)
-* rgw: nfs: skip empty (non-POSIX) path segments (`issue#38744 <http://tracker.ceph.com/issues/38744>`_, `pr#26954 <https://github.com/ceph/ceph/pull/26954>`_, Matt Benjamin)
-* rgw: nfs: svc-enable RGWLi (`pr#26981 <https://github.com/ceph/ceph/pull/26981>`_, Matt Benjamin)
-* rgw: normalize v6 endpoint behaviour for the beast frontend (`issue#39038 <http://tracker.ceph.com/issues/39038>`_, `pr#27270 <https://github.com/ceph/ceph/pull/27270>`_, Abhishek Lekshmanan)
-* rgw: object expirer fixes (`pr#27870 <https://github.com/ceph/ceph/pull/27870>`_, Abhishek Lekshmanan)
-* rgw: Object tags shouldnt work with deletemarker or multipart expiration (`issue#40405 <http://tracker.ceph.com/issues/40405>`_, `pr#28617 <https://github.com/ceph/ceph/pull/28617>`_, zhang Shaowen)
-* rgw: one log shard fails shouldnt block other shards process when reshard buckets (`pr#31155 <https://github.com/ceph/ceph/pull/31155>`_, zhangshaowen)
-* rgw: One Rados Handle to Rule Them All (`pr#27102 <https://github.com/ceph/ceph/pull/27102>`_, Adam C. Emerson)
-* rgw: orphan fixes (`pr#26412 <https://github.com/ceph/ceph/pull/26412>`_, Abhishek Lekshmanan)
-* rgw: parse_copy_location defers url-decode (`issue#27217 <http://tracker.ceph.com/issues/27217>`_, `pr#25498 <https://github.com/ceph/ceph/pull/25498>`_, Casey Bodley)
-* rgw: perfcounters: add gc retire counter (`pr#26351 <https://github.com/ceph/ceph/pull/26351>`_, Matt Benjamin)
-* rgw: permit rgw-admin to populate user info by access-key (`pr#28331 <https://github.com/ceph/ceph/pull/28331>`_, Matt Benjamin)
-* rgw: Policy should be url_decode when assume_role (`pr#28704 <https://github.com/ceph/ceph/pull/28704>`_, yuliyang)
-* rgw: prefix-delimiter listing: support >1 character delimiter (`pr#26863 <https://github.com/ceph/ceph/pull/26863>`_, Matt Benjamin)
-* rgw: prevent bucket reshard scheduling if bucket is resharding (`pr#30610 <https://github.com/ceph/ceph/pull/30610>`_, J. Eric Ivancich)
-* rgw: prevent LC from reading stale head when transitioning object (`pr#31214 <https://github.com/ceph/ceph/pull/31214>`_, Ilsoo Byun)
-* rgw: project and return lc expiration from GET/HEAD and PUT ops (`pr#26160 <https://github.com/ceph/ceph/pull/26160>`_, Matt Benjamin)
-* rgw: Project Zipper - Bucket (`pr#31436 <https://github.com/ceph/ceph/pull/31436>`_, Daniel Gryniewicz)
-* rgw: Project Zipper - Bucketlist (`pr#30619 <https://github.com/ceph/ceph/pull/30619>`_, Daniel Gryniewicz)
-* rgw: Project Zipper part 1 (`pr#28824 <https://github.com/ceph/ceph/pull/28824>`_, Daniel Gryniewicz)
-* rgw: qa/suite/rgw/verify: valgrind on centos again! (`pr#32727 <https://github.com/ceph/ceph/pull/32727>`_, Sage Weil)
-* rgw: qa/tasks/s3tests_java: move to gradle 6.0.1 (`pr#32335 <https://github.com/ceph/ceph/pull/32335>`_, Sage Weil)
-* rgw: qa/tests: update s3a hadoop versions used for test (`pr#26100 <https://github.com/ceph/ceph/pull/26100>`_, Vasu Kulkarni)
-* rgw: qa: remove force-branch from overrides of s3-tests (`pr#32462 <https://github.com/ceph/ceph/pull/32462>`_, Ali Maredia)
-* rgw: qa: update s3-test download code for s3-test tasks (`pr#31839 <https://github.com/ceph/ceph/pull/31839>`_, Ali Maredia)
-* rgw: queue like an Egyptian(`pr#26461 <https://github.com/ceph/ceph/pull/26461>`_, Adam C. Emerson)
-* rgw: race condition between resharding and ops waiting on resharding (`issue#38990 <http://tracker.ceph.com/issues/38990>`_, `pr#27223 <https://github.com/ceph/ceph/pull/27223>`_, J. Eric Ivancich)
-* rgw: radosgw-admin flush user stats output (`pr#30669 <https://github.com/ceph/ceph/pull/30669>`_, Abhishek Lekshmanan)
-* rgw: radosgw-admin zone placement rm and radosgw-admin zonegroup placement rm support --storage-class (`pr#31239 <https://github.com/ceph/ceph/pull/31239>`_, yuliyang)
-* rgw: radosgw-admin: add --uid check in bucket list command (`pr#30194 <https://github.com/ceph/ceph/pull/30194>`_, Vikhyat Umrao)
-* rgw: radosgw-admin: bucket sync status not caught up during full sync (`issue#40806 <http://tracker.ceph.com/issues/40806>`_, `pr#29094 <https://github.com/ceph/ceph/pull/29094>`_, Casey Bodley)
-* rgw: radosgw-admin: fix syncs_from in bucket sync status (`issue#40022 <http://tracker.ceph.com/issues/40022>`_, `pr#28243 <https://github.com/ceph/ceph/pull/28243>`_, Casey Bodley)
-* rgw: radosgw-admin: sync status displays id of shard furthest behind (`pr#32311 <https://github.com/ceph/ceph/pull/32311>`_, Casey Bodley)
-* rgw: radosgw-admin: update help for max-concurrent-ios (`pr#30742 <https://github.com/ceph/ceph/pull/30742>`_, Paul Emmerich)
-* rgw: reduce per-shard entry count during ordered bucket listing (`pr#30853 <https://github.com/ceph/ceph/pull/30853>`_, J. Eric Ivancich)
-* rgw: reject bucket tagging requests and document unsupported (`pr#26952 <https://github.com/ceph/ceph/pull/26952>`_, Casey Bodley)
-* rgw: relax es zone validity check (`pr#32290 <https://github.com/ceph/ceph/pull/32290>`_, jiahuizeng)
-* rgw: release unused callback argument (`pr#32669 <https://github.com/ceph/ceph/pull/32669>`_, Ilsoo Byun)
-* rgw: remove re-defined is_tagging_op in RGWHandler_REST_Bucket_S3 (`pr#29004 <https://github.com/ceph/ceph/pull/29004>`_, zhang Shaowen)
-* rgw: remove unused bucket parameter in check_bucket_shards (`pr#31186 <https://github.com/ceph/ceph/pull/31186>`_, zhang Shaowen)
-* rgw: remove unused last_run in reshard thread entry (`pr#31150 <https://github.com/ceph/ceph/pull/31150>`_, zhangshaowen)
-* rgw: Replace COMPLETE_MULTIPART_MAX_LEN with rgw_max_put_param_size (`issue#38002 <http://tracker.ceph.com/issues/38002>`_, `pr#26070 <https://github.com/ceph/ceph/pull/26070>`_, Lei Liu)
-* rgw: replace direct calls to ioctx.operate() (`pr#28569 <https://github.com/ceph/ceph/pull/28569>`_, Ali Maredia)
-* rgw: ReplaceKeyPrefixWith and ReplaceKeyWith can not set at the same \xe2\x80\xa6 (`pr#32609 <https://github.com/ceph/ceph/pull/32609>`_, yuliyang)
-* rgw: reshard list may return more than specified max_entries (`pr#31355 <https://github.com/ceph/ceph/pull/31355>`_, zhangshaowen)
-* rgw: rest client fixes for cloud sync XML outputs (`pr#27680 <https://github.com/ceph/ceph/pull/27680>`_, Abhishek Lekshmanan)
-* rgw: return error if lock log shard fails (`pr#31344 <https://github.com/ceph/ceph/pull/31344>`_, zhangshaowen)
-* rgw: return ERR_NO_SUCH_BUCKET early while evaluating bucket policy (`issue#38420 <http://tracker.ceph.com/issues/38420>`_, `pr#26569 <https://github.com/ceph/ceph/pull/26569>`_, Abhishek Lekshmanan)
-* rgw: rgw : Bucket mv, bucket chown and user rename utilities (`issue#35885 <http://tracker.ceph.com/issues/35885>`_, `issue#24348 <http://tracker.ceph.com/issues/24348>`_, `pr#28813 <https://github.com/ceph/ceph/pull/28813>`_, Shilpa Jagannath, Marcus Watts)
-* rgw: rgw admin: add tenant argument to reshard cancel (`pr#26887 <https://github.com/ceph/ceph/pull/26887>`_, Abhishek Lekshmanan)
-* rgw: rgw admin: disable stale instance delete in a multiste env (`pr#26852 <https://github.com/ceph/ceph/pull/26852>`_, Abhishek Lekshmanan)
-* rgw: rgw multisite: add perf counters to data sync (`issue#38549 <http://tracker.ceph.com/issues/38549>`_, `pr#26722 <https://github.com/ceph/ceph/pull/26722>`_, Casey Bodley)
-* rgw: rgw multisite: avoid writing bilog entries on PREPARE and CANCEL (`pr#26755 <https://github.com/ceph/ceph/pull/26755>`_, Casey Bodley)
-* rgw: rgw multisite: data sync checks empty next_marker for datalog (`issue#39033 <http://tracker.ceph.com/issues/39033>`_, `pr#27276 <https://github.com/ceph/ceph/pull/27276>`_, Casey Bodley)
-* rgw: rgw multisite: enforce spawn window for incremental data sync (`pr#32534 <https://github.com/ceph/ceph/pull/32534>`_, Casey Bodley)
-* rgw: rgw multisite: fixes for concurrent version creation (`pr#31325 <https://github.com/ceph/ceph/pull/31325>`_, Casey Bodley)
-* rgw: rgw/kafka: add ssl+sasl security to kafka (`pr#31834 <https://github.com/ceph/ceph/pull/31834>`_, Yuval Lifshitz)
-* rgw: rgw/multisite: Dont allow certain radosgw-admin commands to run on non-master zone (`issue#39548 <http://tracker.ceph.com/issues/39548>`_, `pr#28861 <https://github.com/ceph/ceph/pull/28861>`_, Shilpa Jagannath)
-* rgw: rgw/multisite: warn if bucket chown command is run on non-master zone (`pr#32932 <https://github.com/ceph/ceph/pull/32932>`_, Shilpa Jagannath)
-* rgw: rgw/multisite:RGWListBucketIndexesCR for data full sync pagination (`issue#39551 <http://tracker.ceph.com/issues/39551>`_, `pr#28146 <https://github.com/ceph/ceph/pull/28146>`_, Shilpa Jagannath)
-* rgw: rgw/notification: add opaque data (`pr#32723 <https://github.com/ceph/ceph/pull/32723>`_, Yuval Lifshitz)
-* rgw: rgw/pubsub: add kafka notification endpoint (`pr#30960 <https://github.com/ceph/ceph/pull/30960>`_, Yuval Lifshitz)
-* rgw: rgw/pubsub: fix doc on updates. fix multi-notifications (`pr#27931 <https://github.com/ceph/ceph/pull/27931>`_, Yuval Lifshitz, Casey Bodley)
-* rgw: rgw/pubsub: fix records/event json format to match documentation (`pr#31926 <https://github.com/ceph/ceph/pull/31926>`_, Yuval Lifshitz)
-* rgw: rgw/pubsub: handle subscription conf errors better (`pr#27530 <https://github.com/ceph/ceph/pull/27530>`_, Yuval Lifshitz)
-* rgw: rgw/pubsub: notification filtering by object tags (`pr#31878 <https://github.com/ceph/ceph/pull/31878>`_, Yuval Lifshitz)
-* rgw: rgw/pubsub: prevent kafka thread from spinning when there are no messages (`pr#31998 <https://github.com/ceph/ceph/pull/31998>`_, Yuval Lifshitz)
-* rgw: rgw/pubsub: send notifications from multi-delete op (`pr#32155 <https://github.com/ceph/ceph/pull/32155>`_, Yuval Lifshitz)
-* rgw: rgw/pubsub: service reordering issue (`pr#29877 <https://github.com/ceph/ceph/pull/29877>`_, Yuval Lifshitz)
-* rgw: rgw/rgw_client_io_filters.h: print size_t the portable way (`pr#28838 <https://github.com/ceph/ceph/pull/28838>`_, Kefu Chai)
-* rgw: rgw/rgw_crypt.cc: silence -Wsign-compare GCC warning (`pr#29151 <https://github.com/ceph/ceph/pull/29151>`_, Kefu Chai)
-* rgw: rgw/rgw_main: auto set radosgws cpu affinity according to numa_node configuration (`pr#31001 <https://github.com/ceph/ceph/pull/31001>`_, luo rixin)
-* rgw: rgw/rgw_op: Remove get_val from hotpath via legacy options (`pr#29943 <https://github.com/ceph/ceph/pull/29943>`_, Mark Nelson)
-* rgw: rgw/rgw_rados: set pg_autoscale_bias=4 for omap pools (`pr#27375 <https://github.com/ceph/ceph/pull/27375>`_, Sage Weil, Casey Bodley)
-* rgw: rgw/rgw_reshard: Dont dump RGWBucketReshard JSON in process_single_logshard (`pr#29894 <https://github.com/ceph/ceph/pull/29894>`_, Mark Nelson)
-* rgw: rgw/rgw_user: add [[maybe_unused]] for silencing -Wunused-variable wa\xe2\x80\xa6 (`pr#30035 <https://github.com/ceph/ceph/pull/30035>`_, Kefu Chai)
-* rgw: rgw/services: silence -Wunused-variable warning (`pr#30063 <https://github.com/ceph/ceph/pull/30063>`_, Lan Liu)
-* rgw: RGW: add bucket permission verify when copy obj (`pr#29628 <https://github.com/ceph/ceph/pull/29628>`_, NancySu05)
-* rgw: RGW: fix an endless loop error when to show usage (`pr#30470 <https://github.com/ceph/ceph/pull/30470>`_, lvshuhua)
-* rgw: RGW: Set appropriate bucket quota value (when quota value is less than 0) (`pr#30920 <https://github.com/ceph/ceph/pull/30920>`_, GaryHyg)
-* rgw: RGW:Listobjectsv2 (`pr#28102 <https://github.com/ceph/ceph/pull/28102>`_, Albin Antony)
-* rgw: RGWCoroutine::call(nullptr) sets retcode=0 (`pr#29856 <https://github.com/ceph/ceph/pull/29856>`_, Casey Bodley)
-* rgw: rgwfile reqid:  absorbs rgw_file: allocate new id for continued request #25664 (`issue#37734 <http://tracker.ceph.com/issues/37734>`_, `pr#28108 <https://github.com/ceph/ceph/pull/28108>`_, Matt Benjamin, Tao Chen)
-* rgw: RGWPeriodPusher uses zone system key for inter-zonegroup messages (`issue#39287 <http://tracker.ceph.com/issues/39287>`_, `pr#27576 <https://github.com/ceph/ceph/pull/27576>`_, Casey Bodley)
-* rgw: RGWSI_User_Module filters .buckets objects out of user listing (`pr#29695 <https://github.com/ceph/ceph/pull/29695>`_, Casey Bodley)
-* rgw: rgw_file: advance_mtime() should consider namespace expiration (`issue#40415 <http://tracker.ceph.com/issues/40415>`_, `pr#28632 <https://github.com/ceph/ceph/pull/28632>`_, Matt Benjamin)
-* rgw: rgw_file: all directories are virtual with respect to contents (`issue#40204 <http://tracker.ceph.com/issues/40204>`_, `pr#28451 <https://github.com/ceph/ceph/pull/28451>`_, Matt Benjamin)
-* rgw: rgw_file: avoid string::front() on empty path (`pr#32596 <https://github.com/ceph/ceph/pull/32596>`_, Matt Benjamin)
-* rgw: rgw_file: dont deadlock in advance_mtime() (`pr#29560 <https://github.com/ceph/ceph/pull/29560>`_, Matt Benjamin)
-* rgw: rgw_file: fix readdir eof() calc--caller stop implies !eof (`issue#40375 <http://tracker.ceph.com/issues/40375>`_, `pr#28565 <https://github.com/ceph/ceph/pull/28565>`_, Matt Benjamin)
-* rgw: rgw_file: include tenant when hashing bucket names (`issue#40118 <http://tracker.ceph.com/issues/40118>`_, `pr#28370 <https://github.com/ceph/ceph/pull/28370>`_, Matt Benjamin)
-* rgw: rgw_file: introduce fast S3 Unix stats (immutable) (`issue#40456 <http://tracker.ceph.com/issues/40456>`_, `pr#28664 <https://github.com/ceph/ceph/pull/28664>`_, Matt Benjamin)
-* rgw: rgw_file: permit lookup_handle to lookup root_fh (`pr#28440 <https://github.com/ceph/ceph/pull/28440>`_, Matt Benjamin)
-* rgw: rgw_file: readdir: do not construct markers w/leading / (`pr#29670 <https://github.com/ceph/ceph/pull/29670>`_, Matt Benjamin)
-* rgw: rgw_file: save etag and acl info in setattr (`pr#26439 <https://github.com/ceph/ceph/pull/26439>`_, Tao Chen)
-* rgw: rgw_lc: use a new bl while encoding RGW_ATTR_LC (`pr#28049 <https://github.com/ceph/ceph/pull/28049>`_, Abhishek Lekshmanan)
-* rgw: rgw_sync: drop ENOENT error logs from mdlog (`pr#26908 <https://github.com/ceph/ceph/pull/26908>`_, Abhishek Lekshmanan)
-* rgw: s/std::map/boost::container::flat_map/ cls_bucket_list_ordered (`pr#28637 <https://github.com/ceph/ceph/pull/28637>`_, Matt Benjamin)
-* rgw: S3 compatible pubsub API (`pr#27091 <https://github.com/ceph/ceph/pull/27091>`_, Yuval Lifshitz)
-* rgw: s3: dont require a body in S3 put-object-acl (`pr#31987 <https://github.com/ceph/ceph/pull/31987>`_, Matt Benjamin)
-* rgw: save an unnecessary copy of RGWEnv (`pr#28426 <https://github.com/ceph/ceph/pull/28426>`_, Mark Kogan)
-* rgw: Select the std::bitset to resolv ambiguity (`pr#31126 <https://github.com/ceph/ceph/pull/31126>`_, Willem Jan Withagen)
-* rgw: set bucket attr twice when delete lifecycle config (`pr#30862 <https://github.com/ceph/ceph/pull/30862>`_, zhang Shaowen)
-* rgw: set correct storage class for append (`pr#31088 <https://github.com/ceph/ceph/pull/31088>`_, yuliyang)
-* rgw: set correct storage class for post object upload (`pr#30956 <https://github.com/ceph/ceph/pull/30956>`_, yuliyang)
-* rgw: set null version object acl issues (`issue#36763 <http://tracker.ceph.com/issues/36763>`_, `pr#25044 <https://github.com/ceph/ceph/pull/25044>`_, Tianshan Qu)
-* rgw: shard number must be non-negative when resharding the bucket (`pr#29037 <https://github.com/ceph/ceph/pull/29037>`_, zhang Shaowen)
-* rgw: silence a -Wunused-function warning in pubsu (`pr#27578 <https://github.com/ceph/ceph/pull/27578>`_, Casey Bodley)
-* rgw: Silence warning: control reaches end of non-void function (`issue#40747 <http://tracker.ceph.com/issues/40747>`_, `pr#28809 <https://github.com/ceph/ceph/pull/28809>`_, Jos Collin)
-* rgw: split mdlog/datalog trimming into separate files (`pr#27579 <https://github.com/ceph/ceph/pull/27579>`_, Casey Bodley)
-* rgw: sts: add all http args to req_info (`pr#31661 <https://github.com/ceph/ceph/pull/31661>`_, yuliyang)
-* rgw: support encoding-type param for list bucket multiparts (`pr#30993 <https://github.com/ceph/ceph/pull/30993>`_, Abhishek Lekshmanan)
-* rgw: support radosgw-admin zone/zonegroup placement get command (`pr#30880 <https://github.com/ceph/ceph/pull/30880>`_, jiahuizeng)
-* rgw: support specify user default placement and placement_tags when create or modify user (`pr#31185 <https://github.com/ceph/ceph/pull/31185>`_, yuliyang)
-* rgw: svc.bucket: assign to optional<> using = (`pr#32433 <https://github.com/ceph/ceph/pull/32433>`_, Kefu Chai)
-* rgw: swift: bugfix: https://tracker.ceph.com/issues/37765 (`pr#25962 <https://github.com/ceph/ceph/pull/25962>`_, Andrey Groshev)
-* rgw: sync counters: drop spaces from counter names (`pr#27725 <https://github.com/ceph/ceph/pull/27725>`_, Abhishek Lekshmanan)
-* rgw: sync with elastic search v7 (`pr#29637 <https://github.com/ceph/ceph/pull/29637>`_, Chang Liu)
-* rgw: TempURL should not allow PUTs with the X-Object-Manifest (`issue#20797 <http://tracker.ceph.com/issues/20797>`_, `pr#16659 <https://github.com/ceph/ceph/pull/16659>`_, Radoslaw Zarzynski)
-* rgw: test/rgw: fix test_rgw_reshard_wait with -DHAVE_BOOST_CONTEXT=OFF (`pr#32811 <https://github.com/ceph/ceph/pull/32811>`_, Yaakov Selkowitz)
-* rgw: test: modify iam tests to use a function to set bits (`pr#32808 <https://github.com/ceph/ceph/pull/32808>`_, Abhishek Lekshmanan)
-* rgw: tests: Fix building with -DWITH_BOOST_CONTEXT=OFF (`pr#29430 <https://github.com/ceph/ceph/pull/29430>`_, Ulrich Weigand)
-* rgw: the http response code of delete bucket should not be 204-no-content (`pr#30471 <https://github.com/ceph/ceph/pull/30471>`_, Chang Liu)
-* rgw: Thread optional yield context through  get_bucket_info call path (`pr#27898 <https://github.com/ceph/ceph/pull/27898>`_, Ali Maredia)
-* rgw: thread option_yield through bucket index transaction prepare (`pr#28152 <https://github.com/ceph/ceph/pull/28152>`_, Ali Maredia)
-* rgw: unexpected crash when creating bucket in librgw (`pr#26089 <https://github.com/ceph/ceph/pull/26089>`_, Tao CHEN)
-* rgw: update op_mask of user via admin rest api (`issue#39084 <http://tracker.ceph.com/issues/39084>`_, `pr#21154 <https://github.com/ceph/ceph/pull/21154>`_, Ning Yao)
-* rgw: update the hash source for multipart entries during resharding (`pr#32617 <https://github.com/ceph/ceph/pull/32617>`_, dongdong tao)
-* rgw: update the radosgw-admin reshard status (`issue#37615 <http://tracker.ceph.com/issues/37615>`_, `pr#25496 <https://github.com/ceph/ceph/pull/25496>`_, Mark Kogan)
-* rgw: updates to resharding documentation (`issue#39007 <http://tracker.ceph.com/issues/39007>`_, `pr#27250 <https://github.com/ceph/ceph/pull/27250>`_, J. Eric Ivancich)
-* rgw: url decode PutUserPolicy params (`pr#29578 <https://github.com/ceph/ceph/pull/29578>`_, Abhishek Lekshmanan)
-* rgw: url encode common prefixes for List Objects response (`pr#30970 <https://github.com/ceph/ceph/pull/30970>`_, Abhishek Lekshmanan)
-* rgw: usage dump_unsigned instead dump_int (`pr#28308 <https://github.com/ceph/ceph/pull/28308>`_, yuliyang)
-* rgw: usage dump_unsigned instead dump_int in dump_usage_categories_info (`pr#25808 <https://github.com/ceph/ceph/pull/25808>`_, yuliyang)
-* rgw: use bucket creation time from bucket instance info (`pr#32180 <https://github.com/ceph/ceph/pull/32180>`_, Yehuda Sadeh)
-* rgw: use explicit to_string() overload for boost::string_ref (`issue#39611 <http://tracker.ceph.com/issues/39611>`_, `pr#28013 <https://github.com/ceph/ceph/pull/28013>`_, Casey Bodley)
-* rgw: use new Stopped state for special handling of bucket sync disable (`pr#33054 <https://github.com/ceph/ceph/pull/33054>`_, Casey Bodley)
-* rgw: use STSEngine::authenticate when post upload with x_amz_security_token (`pr#31879 <https://github.com/ceph/ceph/pull/31879>`_, yuliyang)
-* rgw: use the compatibilty function for pthread_setname (`pr#27456 <https://github.com/ceph/ceph/pull/27456>`_, Willem Jan Withagen)
-* rgw: user policy: forward write requests to master zone (`pr#32476 <https://github.com/ceph/ceph/pull/32476>`_, Abhishek Lekshmanan)
-* rgw: vstart: move [client.rgw] config into [client] (`pr#29778 <https://github.com/ceph/ceph/pull/29778>`_, Casey Bodley)
-* rgw: vstart: only add --debug-ms=1 in RGWDEBUG (`pr#27409 <https://github.com/ceph/ceph/pull/27409>`_, Casey Bodley)
-* rgw: warn on potential insecure mon connection (`pr#33777 <https://github.com/ceph/ceph/pull/33777>`_, Yehuda Sadeh)
-* rgw: when resharding store progress json (`pr#30575 <https://github.com/ceph/ceph/pull/30575>`_, Mark Kogan)
-* rgw: when you abort a multipart upload request, the quota may be not updated (`pr#29703 <https://github.com/ceph/ceph/pull/29703>`_, Richard Bai(\xe7\x99\xbd\xe5\xad\xa6\xe4\xbd\x99))
-* rgw: Zipper - RGWUser (`pr#32298 <https://github.com/ceph/ceph/pull/32298>`_, Daniel Gryniewicz)
-* rgw: [RFC] rgw: raise default rgw_bucket_index_max_aio to 128 (`pr#28558 <https://github.com/ceph/ceph/pull/28558>`_, Casey Bodley)
-* rgw: [rgw]:Validate bucket names as per revised s3 spec (`pr#26787 <https://github.com/ceph/ceph/pull/26787>`_, Soumya Koduri)
-* seastar,crimson: pickup change to pin socket to fixed core (`pr#32797 <https://github.com/ceph/ceph/pull/32797>`_, Kefu Chai)
-* seastar: pick up changes for better performance (`pr#28008 <https://github.com/ceph/ceph/pull/28008>`_, Kefu Chai)
-* seastar: pick up latest changes and cleanups (`pr#29942 <https://github.com/ceph/ceph/pull/29942>`_, Kefu Chai)
-* seastar: pick up the latest seastar (`pr#28709 <https://github.com/ceph/ceph/pull/28709>`_, Kefu Chai)
-* seastar: pickup change to fix cgroups V2 support (`pr#32978 <https://github.com/ceph/ceph/pull/32978>`_, Kefu Chai)
-* seastar: pickup the recent future optimizations (`pr#32296 <https://github.com/ceph/ceph/pull/32296>`_, Radoslaw Zarzynski)
-* seastar: pickup unix domain socket support (`pr#30578 <https://github.com/ceph/ceph/pull/30578>`_, Kefu Chai)
-* src/: silence GCC warnings (`pr#28684 <https://github.com/ceph/ceph/pull/28684>`_, Adam C. Emerson, Kefu Chai)
-* src/msg/async/net_handler.cc: Fix compilation (`pr#31637 <https://github.com/ceph/ceph/pull/31637>`_, Carlos Valiente)
-* src/script/kubejacker: Fix and simplify (`issue#39065 <http://tracker.ceph.com/issues/39065>`_, `pr#27292 <https://github.com/ceph/ceph/pull/27292>`_, Sebastian Wagner)
-* src/script: extract mypy config to mypy.ini (`pr#28264 <https://github.com/ceph/ceph/pull/28264>`_, Alfonso Mart\xc3\xadnez)
-* src/telemetry: remove, now lives in ceph-telemetry.git (`pr#31170 <https://github.com/ceph/ceph/pull/31170>`_, Dan Mick)
-* src: polish the wording (`pr#33224 <https://github.com/ceph/ceph/pull/33224>`_, Jun Su)
-* stop.sh: add --crimson option (`pr#28676 <https://github.com/ceph/ceph/pull/28676>`_, Kefu Chai)
-* stop.sh: do not try to contact mon unless cluster is up (`pr#32295 <https://github.com/ceph/ceph/pull/32295>`_, Kefu Chai)
-* support RDMA NIC without SRQ in msg/async/rdma (`pr#29947 <https://github.com/ceph/ceph/pull/29947>`_, Changcheng Liu, Roman Penyaev)
-* tasks/ceph_deploy: get rid of iteritems for python3 (`pr#30791 <https://github.com/ceph/ceph/pull/30791>`_, Kyr Shatskyy)
-* telemetry: make server compensate for older mgr modules, elasticsearch (`pr#27802 <https://github.com/ceph/ceph/pull/27802>`_, Dan Mick)
-* test/crimson: fix interpretability with perf_async_msgr (`pr#28913 <https://github.com/ceph/ceph/pull/28913>`_, Yingxin Cheng)
-* tests,tools: ceph-objectstore-tool: call collection_bits() crashes on the meta col\xe2\x80\xa6 (`pr#31133 <https://github.com/ceph/ceph/pull/31133>`_, David Zafman)
-* tests,tools: ceph-objectstore-tool: set log date format (`pr#29297 <https://github.com/ceph/ceph/pull/29297>`_, Robert Church)
-* tests,tools: tools/ceph-dencoder: split types.h into smaller pieces (`issue#39595 <http://tracker.ceph.com/issues/39595>`_, `pr#28359 <https://github.com/ceph/ceph/pull/28359>`_, Kefu Chai)
-* tests,tools: tools/setup-virtualenv.sh: do not default to python2.7 (`pr#30379 <https://github.com/ceph/ceph/pull/30379>`_, Nathan Cutler)
-* tests: add missing header cmath to test/mon/test_mon_memory_target.cc (`pr#30284 <https://github.com/ceph/ceph/pull/30284>`_, Su Yue)
-* tests: ceph-object-corpus: pick up 15.0.0-539-g191ab33faf (`pr#27867 <https://github.com/ceph/ceph/pull/27867>`_, Kefu Chai)
-* tests: cls/queue: add unit tests (`pr#33218 <https://github.com/ceph/ceph/pull/33218>`_, Yuval Lifshitz)
-* tests: corrected issues with RBD tests under EL8 distros (`pr#32684 <https://github.com/ceph/ceph/pull/32684>`_, Jason Dillaman)
-* tests: crimson/net: configure seastar to accept on a fixed core (`pr#32632 <https://github.com/ceph/ceph/pull/32632>`_, Yingxin Cheng)
-* tests: crimson/test: add CBT based perf tests (`pr#29612 <https://github.com/ceph/ceph/pull/29612>`_, Kefu Chai)
-* tests: crimson/test: v2 failover tests with crimson FailoverTestPeer (`pr#30162 <https://github.com/ceph/ceph/pull/30162>`_, Yingxin Cheng)
-* tests: crush, test: update editor variables (`pr#30537 <https://github.com/ceph/ceph/pull/30537>`_, Kefu Chai)
-* tests: fio_ceph_messenger: catch up v2 proto changes by using dummy auth (`pr#27264 <https://github.com/ceph/ceph/pull/27264>`_, Roman Penyaev)
-* tests: import-generated.sh: use PATH to get ceph-dencoder (`pr#27573 <https://github.com/ceph/ceph/pull/27573>`_, Changcheng Liu)
-* tests: introduce compiletest_cxx11_client for C++11 conformity (`pr#25395 <https://github.com/ceph/ceph/pull/25395>`_, Radoslaw Zarzynski)
-* tests: lvm/deactivate: add unit tests, remove --all (`pr#32277 <https://github.com/ceph/ceph/pull/32277>`_, Jan Fajerski)
-* tests: mgr/dashboard: ability to provide custom credentials for E2E tests (`pr#33549 <https://github.com/ceph/ceph/pull/33549>`_, Alfonso Mart\xc3\xadnez)
-* tests: mgr/dashboard: Add linter for unclosed HTML tags (`issue#40686 <http://tracker.ceph.com/issues/40686>`_, `pr#28916 <https://github.com/ceph/ceph/pull/28916>`_, Patrick Nawracay)
-* tests: mgr/dashboard: add python-common to $PYTHONPATH (`pr#29525 <https://github.com/ceph/ceph/pull/29525>`_, Kefu Chai)
-* tests: mgr/dashboard: Added breadcrumb tests to Manager modules and Alerts menu (`pr#26853 <https://github.com/ceph/ceph/pull/26853>`_, Nathan Weinberg)
-* tests: mgr/dashboard: Added breadcrumb tests to NFS menu (`pr#26850 <https://github.com/ceph/ceph/pull/26850>`_, Nathan Weinberg)
-* tests: mgr/dashboard: Added breadcrumb tests to Object Gateway menu items (`pr#25451 <https://github.com/ceph/ceph/pull/25451>`_, Nathan Weinberg, Tiago Melo)
-* tests: mgr/dashboard: comment failing QA suites out (`pr#30864 <https://github.com/ceph/ceph/pull/30864>`_, Tatjana Dehler)
-* tests: mgr/dashboard: disable pylints --py3k flag (`pr#30078 <https://github.com/ceph/ceph/pull/30078>`_, Ernesto Puerta)
-* tests: mgr/dashboard: E2E test to verify Configuration editing functionality (`pr#29216 <https://github.com/ceph/ceph/pull/29216>`_, Adam King, Rafael Quintero)
-* tests: mgr/dashboard: Explicitly type page variables (`pr#29324 <https://github.com/ceph/ceph/pull/29324>`_, Adam King, Rafael Quintero)
-* tests: mgr/dashboard: Fix e2e host test (`pr#30377 <https://github.com/ceph/ceph/pull/30377>`_, Tiago Melo)
-* tests: mgr/dashboard: fix existing issues in user integration tests (`pr#30789 <https://github.com/ceph/ceph/pull/30789>`_, Tatjana Dehler)
-* tests: mgr/dashboard: fix stray requests/error in Grafana unit test (`pr#33572 <https://github.com/ceph/ceph/pull/33572>`_, Patrick Seidensal)
-* tests: mgr/dashboard: fix tasks.mgr.dashboard.test_rgw suite (`pr#33426 <https://github.com/ceph/ceph/pull/33426>`_, Alfonso Mart\xc3\xadnez)
-* tests: mgr/dashboard: fix tests in order to match pg num conventions (`pr#31906 <https://github.com/ceph/ceph/pull/31906>`_, Tatjana Dehler)
-* tests: mgr/dashboard: Improve e2e script (`pr#29101 <https://github.com/ceph/ceph/pull/29101>`_, Valentin Bajrami)
-* tests: mgr/dashboard: RBD Image Purge Trash, Move to Trash and Restore (`pr#29673 <https://github.com/ceph/ceph/pull/29673>`_, Adam King, Rafael Quintero)
-* tests: mgr/dashboard: reactivate dashboard test suites (`pr#32005 <https://github.com/ceph/ceph/pull/32005>`_, Tatjana Dehler)
-* tests: mgr/dashboard: Reduce code duplication through TableActionComponent UnitTests (`issue#40399 <http://tracker.ceph.com/issues/40399>`_, `pr#28633 <https://github.com/ceph/ceph/pull/28633>`_, Patrick Nawracay)
-* tests: mgr/dashboard: restore working directory after creating venv (`pr#32371 <https://github.com/ceph/ceph/pull/32371>`_, Kefu Chai)
-* tests: mgr/dashboard: RGW bucket E2E Tests (`pr#28999 <https://github.com/ceph/ceph/pull/28999>`_, Adam King, Rafael Quintero)
-* tests: mgr/dashboard: RGW user E2E Tests (`pr#29237 <https://github.com/ceph/ceph/pull/29237>`_, Adam King, Rafael Quintero)
-* tests: mgr/dashboard: take portal_ip_addresses as a list (`pr#28495 <https://github.com/ceph/ceph/pull/28495>`_, Kefu Chai)
-* tests: mgr/dashboard: Update formatting of e2e test files (`pr#29070 <https://github.com/ceph/ceph/pull/29070>`_, Adam King, Rafael Quintero)
-* tests: mgr/dashboard: Updated existing E2E tests to match new format (`pr#27408 <https://github.com/ceph/ceph/pull/27408>`_, Nathan Weinberg)
-* tests: mgr/dashboard: Verify fields on Configuration page (`pr#29583 <https://github.com/ceph/ceph/pull/29583>`_, Adam King, Rafael Quintero)
-* tests: mgr/dashboard: Verify fields on OSDs page (`pr#29447 <https://github.com/ceph/ceph/pull/29447>`_, Adam King, Rafael Quintero)
-* tests: mgr/dashboard: Wait for iSCSI target put and delete (`pr#30588 <https://github.com/ceph/ceph/pull/30588>`_, Ricardo Marques)
-* tests: mgr/dashboard: Write E2E tests for pool creation, deletion and verification (`issue#40693 <http://tracker.ceph.com/issues/40693>`_, `issue#38093 <http://tracker.ceph.com/issues/38093>`_, `pr#28928 <https://github.com/ceph/ceph/pull/28928>`_, Patrick Nawracay)
-* tests: mgr/orch: try harder when pickle fails to marshal an exception (`pr#33701 <https://github.com/ceph/ceph/pull/33701>`_, Kefu Chai)
-* tests: mgr/ssh: add make check integration (`pr#31523 <https://github.com/ceph/ceph/pull/31523>`_, Sebastian Wagner)
-* tests: mgr/tox: make run-tox.sh scripts more robust (`issue#39323 <http://tracker.ceph.com/issues/39323>`_, `pr#27614 <https://github.com/ceph/ceph/pull/27614>`_, Nathan Cutler)
-* tests: osd-backfill-space.sh test failed in TEST_backfill_multi_partial() (`issue#39333 <http://tracker.ceph.com/issues/39333>`_, `pr#27769 <https://github.com/ceph/ceph/pull/27769>`_, David Zafman)
-* tests: pybind/mgr: apply_drivegroups should return Sequence[Completion] (`pr#33977 <https://github.com/ceph/ceph/pull/33977>`_, Kefu Chai)
-* tests: python: pin mypy requirement to mypy==0.770 (`pr#33926 <https://github.com/ceph/ceph/pull/33926>`_, Sebastian Wagner)
-* tests: qa.tests: added smoke suite to the schedule on mimic,nautilus (`pr#28479 <https://github.com/ceph/ceph/pull/28479>`_, Yuri Weinstein)
-* tests: qa/ceph-ansible: Disable dashboard (`pr#29916 <https://github.com/ceph/ceph/pull/29916>`_, Brad Hubbard)
-* tests: qa/ceph-ansible: Move to ansible 2.8 (`issue#40602 <http://tracker.ceph.com/issues/40602>`_, `pr#28803 <https://github.com/ceph/ceph/pull/28803>`_, Brad Hubbard)
-* tests: qa/ceph-ansible: Move to Nautilus (`pr#27013 <https://github.com/ceph/ceph/pull/27013>`_, Brad Hubbard)
-* tests: qa/ceph-ansible: Replace pgs with pg_num (`issue#40605 <http://tracker.ceph.com/issues/40605>`_, `pr#28807 <https://github.com/ceph/ceph/pull/28807>`_, Brad Hubbard)
-* tests: qa/ceph-ansible: Upgrade ansible version (`pr#33379 <https://github.com/ceph/ceph/pull/33379>`_, Brad Hubbard)
-* tests: qa/cephadm/smoke: run on opensuse_15.1 (`pr#33338 <https://github.com/ceph/ceph/pull/33338>`_, Nathan Cutler)
-* tests: qa/crontab/teuthology-cronjobs: fix suite-branch (`pr#27140 <https://github.com/ceph/ceph/pull/27140>`_, Neha Ojha)
-* tests: qa/distros/all: add openSUSE 15.1, drop openSUSE 12.2 (`pr#30597 <https://github.com/ceph/ceph/pull/30597>`_, Nathan Cutler)
-* tests: qa/distros: add SLE-12-SP3 and SLE-15-SP1 (`pr#31112 <https://github.com/ceph/ceph/pull/31112>`_, Nathan Cutler)
-* tests: qa/orchestrator: do not test mon update 3 host1 (`pr#32023 <https://github.com/ceph/ceph/pull/32023>`_, Sage Weil, Kefu Chai)
-* tests: qa/standalone/ceph-helpers: resurrect all OSD before waiting for health (`pr#28328 <https://github.com/ceph/ceph/pull/28328>`_, Kefu Chai)
-* tests: qa/standalone/test_ceph_daemon: Fix ceph daemon standalone test (`pr#31440 <https://github.com/ceph/ceph/pull/31440>`_, Thomas Bechtold)
-* tests: qa/suites/krbd: fsx with object-map and fast-diff (`pr#32376 <https://github.com/ceph/ceph/pull/32376>`_, Ilya Dryomov)
-* tests: qa/suites/rados/cephadm/upgrade: add simple upgrade test (`pr#33343 <https://github.com/ceph/ceph/pull/33343>`_, Sage Weil)
-* tests: qa/suites/rados/cephadm: deploy all monitoring components (`pr#33785 <https://github.com/ceph/ceph/pull/33785>`_, Sage Weil)
-* tests: qa/suites/rados/perf/objectstore: do not symlink to qa/objectstore (`pr#30309 <https://github.com/ceph/ceph/pull/30309>`_, Neha Ojha)
-* tests: qa/suites/rados/perf: test min recommended osd_memory_target (`pr#30347 <https://github.com/ceph/ceph/pull/30347>`_, Neha Ojha)
-* tests: qa/suites/rados: whitelist POOL_APP_NOT_ENABLED warning (`pr#29763 <https://github.com/ceph/ceph/pull/29763>`_, Kefu Chai)
-* tests: qa/suites/upgrade/nautilus-x/parallel: restart mgr.x before mons (`pr#33705 <https://github.com/ceph/ceph/pull/33705>`_, Neha Ojha)
-* tests: qa/suites/upgrade: use correct branch names (`pr#27764 <https://github.com/ceph/ceph/pull/27764>`_, Neha Ojha)
-* tests: qa/suites: do not test luminous-x upgrade path (`pr#27112 <https://github.com/ceph/ceph/pull/27112>`_, Kefu Chai)
-* tests: qa/tasks/cbt.py: add support for client_endpoints (`pr#28522 <https://github.com/ceph/ceph/pull/28522>`_, Neha Ojha)
-* tests: qa/tasks/cbt.py: change port to work with client_endpoints (`pr#28442 <https://github.com/ceph/ceph/pull/28442>`_, Neha Ojha)
-* tests: qa/tasks/cbt.py: use git --depth 1 for faster clone (`pr#29597 <https://github.com/ceph/ceph/pull/29597>`_, Kefu Chai)
-* tests: qa/tasks/ceph.py: quote <kind> in command line (`pr#33775 <https://github.com/ceph/ceph/pull/33775>`_, Kefu Chai)
-* tests: qa/tasks/ceph.py: remove unused variables (`pr#31005 <https://github.com/ceph/ceph/pull/31005>`_, Kefu Chai)
-* tests: qa/tasks/ceph2: add support for shell, packaged ceph-daemon (`pr#31891 <https://github.com/ceph/ceph/pull/31891>`_, Sage Weil)
-* tests: qa/tasks/cephfs_test_runner: setattr to class not instance (`pr#32571 <https://github.com/ceph/ceph/pull/32571>`_, Kefu Chai)
-* tests: qa/tasks/ceph_deploy: assume systemd and simplify shutdown wonkiness (`pr#29030 <https://github.com/ceph/ceph/pull/29030>`_, Sage Weil)
-* tests: qa/tasks/ceph_deploy: install python3.6 instead of python3.4 for py3 tests (`pr#27504 <https://github.com/ceph/ceph/pull/27504>`_, Kefu Chai)
-* tests: qa/tasks/ceph_manager.py: ignore errors in test_pool_min_size (`issue#40533 <http://tracker.ceph.com/issues/40533>`_, `pr#28731 <https://github.com/ceph/ceph/pull/28731>`_, Kefu Chai)
-* tests: qa/tasks/ceph_manager: capture stderr for COT (`pr#33805 <https://github.com/ceph/ceph/pull/33805>`_, Kefu Chai)
-* tests: qa/tasks/ceph_manager: do not panic if pg_num_target is missing (`pr#30973 <https://github.com/ceph/ceph/pull/30973>`_, Kefu Chai)
-* tests: qa/tasks/ceph_manager: do not pick a pool is there is no pools (`pr#32519 <https://github.com/ceph/ceph/pull/32519>`_, Kefu Chai)
-* tests: qa/tasks/mgr/dashboard/test_health: add allow_unknown in mgr_map (`pr#30517 <https://github.com/ceph/ceph/pull/30517>`_, Kefu Chai)
-* tests: qa/tasks/mgr/dashboard/test_health: add missing field for test_full_health (`pr#29615 <https://github.com/ceph/ceph/pull/29615>`_, Kefu Chai)
-* tests: qa/tasks/mgr/dashboard/test_health: update schema (`pr#32122 <https://github.com/ceph/ceph/pull/32122>`_, Tatjana Dehler)
-* tests: qa/tasks/mgr/dashboard/test_mgr_module: sync w/ telemetry (`pr#29461 <https://github.com/ceph/ceph/pull/29461>`_, Kefu Chai)
-* tests: qa/tasks/mgr/dashboard: set pg_num to 16 (`pr#32575 <https://github.com/ceph/ceph/pull/32575>`_, Kefu Chai)
-* tests: qa/tasks/mgr/test_orchestrator_cli: fix mon update test (`pr#32428 <https://github.com/ceph/ceph/pull/32428>`_, Kefu Chai)
-* tests: qa/tasks/mgr/test_orchestrator_cli: fix service action tests (`pr#32518 <https://github.com/ceph/ceph/pull/32518>`_, Kefu Chai)
-* tests: qa/tasks/mgr/test_orchestrator_cli: fix test_host_ls (`pr#33477 <https://github.com/ceph/ceph/pull/33477>`_, Sage Weil)
-* tests: qa/tasks/mgr/test_progress.py: fix bug in 9b4dbf0 (`pr#29385 <https://github.com/ceph/ceph/pull/29385>`_, Kamoltat (Junior) Sirivadhna)
-* tests: qa/tasks/mgr/test_progress.py: s/ev/new_event/ (`issue#40618 <http://tracker.ceph.com/issues/40618>`_, `pr#29368 <https://github.com/ceph/ceph/pull/29368>`_, Kefu Chai)
-* tests: qa/tasks/mgr: set mgr module option with --force (`pr#32588 <https://github.com/ceph/ceph/pull/32588>`_, Kefu Chai)
-* tests: qa/tasks/vstart_runner: write string to StringIO (`pr#32438 <https://github.com/ceph/ceph/pull/32438>`_, Kefu Chai)
-* tests: qa/tasks: call super classs setUp() (`pr#33325 <https://github.com/ceph/ceph/pull/33325>`_, Kefu Chai)
-* tests: qa/tasks: py3 compat (tasks exercised by rados suites) (`pr#33709 <https://github.com/ceph/ceph/pull/33709>`_, Kyr Shatskyy, Kefu Chai)
-* tests: qa/tasks: use items() for py3 compatibility (`pr#30813 <https://github.com/ceph/ceph/pull/30813>`_, Kyr Shatskyy)
-* tests: qa/tests:  filtered in only trusty (`issue#40195 <http://tracker.ceph.com/issues/40195>`_, `pr#28439 <https://github.com/ceph/ceph/pull/28439>`_, Yuri Weinstein)
-* tests: qa/tests: added mimic-x on master run (`pr#29428 <https://github.com/ceph/ceph/pull/29428>`_, Yuri Weinstein)
-* tests: qa/tests: added nautilus-p2p to cron (`pr#27218 <https://github.com/ceph/ceph/pull/27218>`_, Yuri Weinstein)
-* tests: qa/tests: added nautilus-x run (`pr#27252 <https://github.com/ceph/ceph/pull/27252>`_, Yuri Weinstein)
-* tests: qa/tests: added new client-upgrade-\\*-nautilus suites for jewel, luminous, mimic (`pr#28067 <https://github.com/ceph/ceph/pull/28067>`_, Yuri Weinstein)
-* tests: qa/tests: added ragweed coverage to stress-split\\* upgrade suites (`issue#40467 <http://tracker.ceph.com/issues/40467>`_, `issue#40452 <http://tracker.ceph.com/issues/40452>`_, `pr#28931 <https://github.com/ceph/ceph/pull/28931>`_, Yuri Weinstein)
-* tests: qa/tests: added ragweed coverage to stress-split\\* upgrade suites (`issue#40467 <http://tracker.ceph.com/issues/40467>`_, `issue#40452 <http://tracker.ceph.com/issues/40452>`_, `pr#28932 <https://github.com/ceph/ceph/pull/28932>`_, Yuri Weinstein)
-* tests: qa/tests: added rgw into upgrade sequence to improve coverage (`pr#29406 <https://github.com/ceph/ceph/pull/29406>`_, Yuri Weinstein)
-* tests: qa/tests: reduced distro to run to be random (`pr#28435 <https://github.com/ceph/ceph/pull/28435>`_, Yuri Weinstein)
-* tests: qa/tests: reduced frequency for luminous and mimic runs (`pr#27057 <https://github.com/ceph/ceph/pull/27057>`_, Yuri Weinstein)
-* tests: qa/tests: removed all runs for luminous - EOL (`pr#33186 <https://github.com/ceph/ceph/pull/33186>`_, Yuri Weinstein)
-* tests: qa/tests: removed upgrade/client-upgrade-hammer becasue ubuntu 14.04 \xe2\x80\xa6 (`pr#28518 <https://github.com/ceph/ceph/pull/28518>`_, Yuri Weinstein)
-* tests: qa/tests: removed `1node` and `systemd` tests as ceph-deploy is not actively developed (`issue#40207 <http://tracker.ceph.com/issues/40207>`_, `issue#40208 <http://tracker.ceph.com/issues/40208>`_, `pr#28455 <https://github.com/ceph/ceph/pull/28455>`_, Yuri Weinstein)
-* tests: qa/valgrind.supp: generalize the whiterule for aes-128-gcm to help rgw suite (`issue#38827 <http://tracker.ceph.com/issues/38827>`_, `pr#28305 <https://github.com/ceph/ceph/pull/28305>`_, Radoslaw Zarzynski)
-* tests: qa/workunits/cephadm/test_cephadm: drop stray exit 0 (`pr#32622 <https://github.com/ceph/ceph/pull/32622>`_, Sage Weil)
-* tests: qa/workunits/cephtool/test.sh: a handful fixes (`pr#31689 <https://github.com/ceph/ceph/pull/31689>`_, Kefu Chai)
-* tests: qa/workunits/mon/config.sh: s|bin/ceph|ceph| (`pr#27147 <https://github.com/ceph/ceph/pull/27147>`_, Kefu Chai)
-* tests: qa/workunits/rados/test_crash.sh: do not rm coredump (`pr#32883 <https://github.com/ceph/ceph/pull/32883>`_, Kefu Chai)
-* tests: qa/workunits/rados/test_envlibrados_for_rocksdb: accomodate rocksdb c\xe2\x80\xa6 (`pr#32143 <https://github.com/ceph/ceph/pull/32143>`_, Kefu Chai)
-* tests: qa/workunits/rados/test_envlibrados_for_rocksdb: install newer cmake (`pr#29584 <https://github.com/ceph/ceph/pull/29584>`_, Kefu Chai)
-* tests: qa/workunits/rados/test_librados_build.sh: download from current branch (`pr#31693 <https://github.com/ceph/ceph/pull/31693>`_, Kefu Chai)
-* tests: qa/workunits/rados/test_librados_build.sh: install build deps (`pr#28484 <https://github.com/ceph/ceph/pull/28484>`_, Kefu Chai)
-* tests: qa/workunits/rest: Better detection of rest url (`pr#26604 <https://github.com/ceph/ceph/pull/26604>`_, Brad Hubbard)
-* tests: qa: add .qa link (`pr#32363 <https://github.com/ceph/ceph/pull/32363>`_, Patrick Donnelly)
-* tests: qa: Add basic mypy support for the qa directory (`pr#32495 <https://github.com/ceph/ceph/pull/32495>`_, Thomas Bechtold)
-* tests: qa: add path to device output schema (`pr#32427 <https://github.com/ceph/ceph/pull/32427>`_, Kefu Chai)
-* tests: qa: add RHEL 7.7 and use as RHEL7 default (`pr#29908 <https://github.com/ceph/ceph/pull/29908>`_, Patrick Donnelly)
-* tests: qa: correct zap disk with ceph-deploy tool (`pr#31312 <https://github.com/ceph/ceph/pull/31312>`_, Changcheng Liu, Alfredo Deza)
-* tests: qa: distro helper symlinks (`pr#28371 <https://github.com/ceph/ceph/pull/28371>`_, Patrick Donnelly)
-* tests: qa: enable CRB repo for RHEL8 (`pr#32426 <https://github.com/ceph/ceph/pull/32426>`_, Kefu Chai)
-* tests: qa: enable dashboard tests to be run with --suite rados/dashboard (`pr#30434 <https://github.com/ceph/ceph/pull/30434>`_, Nathan Cutler)
-* tests: qa: Enable flake8 tox and fix failures (`pr#32129 <https://github.com/ceph/ceph/pull/32129>`_, Thomas Bechtold)
-* tests: qa: fix all the fsx.sh-invoking yaml files to install dependencies (`pr#33959 <https://github.com/ceph/ceph/pull/33959>`_, Greg Farnum)
-* tests: qa: fix lingering ceph-mgr-ssh -> ceph-mgr-cephadm refs (`pr#32250 <https://github.com/ceph/ceph/pull/32250>`_, Sage Weil)
-* tests: qa: get rid of iterkeys for py3 compatibility (`pr#30873 <https://github.com/ceph/ceph/pull/30873>`_, Kyr Shatskyy)
-* tests: qa: kernel.sh: update for read-only changes (`pr#31773 <https://github.com/ceph/ceph/pull/31773>`_, Ilya Dryomov)
-* tests: qa: krbd_exclusive_option.sh: fixup for json.tool ordering change (`pr#32358 <https://github.com/ceph/ceph/pull/32358>`_, Ilya Dryomov)
-* tests: qa: krbd_exclusive_option.sh: update for recent kernel changes (`pr#32088 <https://github.com/ceph/ceph/pull/32088>`_, Ilya Dryomov)
-* tests: qa: rbd_workunit_suites_fsx: install build dependencies (`pr#33412 <https://github.com/ceph/ceph/pull/33412>`_, Ilya Dryomov)
-* tests: qa: run cephadm/smoke on opensuse 15.2 instead of 15.1 (`pr#33535 <https://github.com/ceph/ceph/pull/33535>`_, Nathan Cutler)
-* tests: qa: update krbd tests for python3 (`pr#31968 <https://github.com/ceph/ceph/pull/31968>`_, Ilya Dryomov)
-* tests: qa: update krbd_blkroset.t and add krbd_get_features.t (`pr#31771 <https://github.com/ceph/ceph/pull/31771>`_, Ilya Dryomov)
-* tests: qa: whitelist FS_DEGRADED (`pr#32549 <https://github.com/ceph/ceph/pull/32549>`_, Kefu Chai)
-* tests: remove spurious whitespace (`pr#33848 <https://github.com/ceph/ceph/pull/33848>`_, Milind Changire)
-* tests: Revert qa/tasks/cbt: include py2 deps on ubuntu for now (`pr#32512 <https://github.com/ceph/ceph/pull/32512>`_, Kefu Chai)
-* tests: script/run-cbt.sh: add support for ceph-osd testing (`pr#30811 <https://github.com/ceph/ceph/pull/30811>`_, Radoslaw Zarzynski)
-* tests: script/run-cbt.sh: always use python3 (`pr#30321 <https://github.com/ceph/ceph/pull/30321>`_, Kefu Chai)
-* tests: script/run-cbt.sh: check option correctly (`pr#30287 <https://github.com/ceph/ceph/pull/30287>`_, Kefu Chai)
-* tests: script/run-cbt.sh: set fs.aio-max-nr for seastar (`pr#31667 <https://github.com/ceph/ceph/pull/31667>`_, Kefu Chai)
-* tests: script/run_mypy: Support mypy 0.740 (`pr#31192 <https://github.com/ceph/ceph/pull/31192>`_, Sebastian Wagner)
-* tests: script/run_tox.sh: do not use python2 if we have python3 (`pr#31751 <https://github.com/ceph/ceph/pull/31751>`_, Kefu Chai)
-* tests: selinux: Update the policy for RHEL8 (`pr#28290 <https://github.com/ceph/ceph/pull/28290>`_, Boris Ranto)
-* tests: src/test, qa/suites/rados/thrash: add dedup test (`pr#28983 <https://github.com/ceph/ceph/pull/28983>`_, Myoungwon Oh)
-* tests: src/test/compressor: Add missing gtest (`pr#33731 <https://github.com/ceph/ceph/pull/33731>`_, Willem Jan Withagen)
-* tests: src/test: fix creating two different objects for testing chunked object (`issue#39282 <http://tracker.ceph.com/issues/39282>`_, `pr#27667 <https://github.com/ceph/ceph/pull/27667>`_, Myoungwon Oh)
-* tests: src/valgrind.supp: replace with the teuthologys file. Whitelist OpenSSL (`pr#27265 <https://github.com/ceph/ceph/pull/27265>`_, Radoslaw Zarzynski)
-* tests: tasks/ceph: drop testdir replacement in skeleton_config (`pr#30829 <https://github.com/ceph/ceph/pull/30829>`_, Kyr Shatskyy)
-* tests: tasks/ceph: get rid of iteritems for python3 (`pr#30792 <https://github.com/ceph/ceph/pull/30792>`_, Kyr Shatskyy)
-* tests: test/bench_log: add usage function (`pr#31723 <https://github.com/ceph/ceph/pull/31723>`_, Xuqiang Chen)
-* tests: test/bufferlist.cc: encode/decode int64_t instead of long (`pr#29881 <https://github.com/ceph/ceph/pull/29881>`_, Alexandre Oliva)
-* tests: test/cli/ceph-conf: fix test (`pr#28818 <https://github.com/ceph/ceph/pull/28818>`_, Kefu Chai)
-* tests: test/cli: Make the ceph-conf test more liberal (`pr#29405 <https://github.com/ceph/ceph/pull/29405>`_, Willem Jan Withagen)
-* tests: test/common/test_util: skip it if /etc/os-release does not exist (`pr#27927 <https://github.com/ceph/ceph/pull/27927>`_, Kefu Chai)
-* tests: test/crimson/: use 256M mem and 1 cpu core for each test (`pr#29152 <https://github.com/ceph/ceph/pull/29152>`_, Kefu Chai)
-* tests: test/crimson/perf_async_msgr: remove unsued header file (`pr#28707 <https://github.com/ceph/ceph/pull/28707>`_, Jianpeng Ma)
-* tests: test/crimson: add acceptable section to tests (`pr#30315 <https://github.com/ceph/ceph/pull/30315>`_, Kefu Chai)
-* tests: test/crimson: add unit-test for ceph::net::Socket (`pr#28623 <https://github.com/ceph/ceph/pull/28623>`_, Yingxin Cheng)
-* tests: test/crimson: cbt test does rand-reads instead of seq-reads (`pr#30794 <https://github.com/ceph/ceph/pull/30794>`_, Radoslaw Zarzynski)
-* tests: test/crimson: fix a compiler error (`pr#27883 <https://github.com/ceph/ceph/pull/27883>`_, Jianpeng Ma)
-* tests: test/crimson: fix build of unittest_seastar_monc (`pr#27515 <https://github.com/ceph/ceph/pull/27515>`_, Kefu Chai, Yingxin Cheng)
-* tests: test/crimson: fix FTBFS (`pr#28902 <https://github.com/ceph/ceph/pull/28902>`_, Kefu Chai)
-* tests: test/crimson: fix msgr test of ref counter racing (`issue#36405 <http://tracker.ceph.com/issues/36405>`_, `pr#28362 <https://github.com/ceph/ceph/pull/28362>`_, Yingxin Cheng)
-* tests: test/crimson: implement a remote async TestPeer for crimson msgr tests (`pr#31156 <https://github.com/ceph/ceph/pull/31156>`_, Yingxin Cheng)
-* tests: test/crimson: improved perf_crimson_msgr with timer and sampled lat (`pr#28542 <https://github.com/ceph/ceph/pull/28542>`_, Yingxin Cheng)
-* tests: test/crimson: include writes in perf_crimson/async_server (`pr#27429 <https://github.com/ceph/ceph/pull/27429>`_, Yingxin Cheng)
-* tests: test/crimson: lower the bar for cbt test (`pr#30458 <https://github.com/ceph/ceph/pull/30458>`_, Kefu Chai)
-* tests: test/crimson: remove unittest_seastar_socket temporarily (`pr#32720 <https://github.com/ceph/ceph/pull/32720>`_, Kefu Chai)
-* tests: test/crimson: update to accomodate Dispatcher changes (`pr#27093 <https://github.com/ceph/ceph/pull/27093>`_, Kefu Chai)
-* tests: test/crimson: v2 failover tests with ack/keepalive (`pr#30803 <https://github.com/ceph/ceph/pull/30803>`_, Yingxin Cheng)
-* tests: test/crimson: verify msgr v2 behavior with different policies (`pr#30925 <https://github.com/ceph/ceph/pull/30925>`_, Yingxin Cheng)
-* tests: test/erasure-code: add exception handling to k & m (`pr#30087 <https://github.com/ceph/ceph/pull/30087>`_, Hang Li)
-* tests: test/fio/fio_ceph_messenger: make exec multi client on the same host (`pr#28464 <https://github.com/ceph/ceph/pull/28464>`_, Jianpeng Ma)
-* tests: test/fio: fix a compiler error (`pr#27880 <https://github.com/ceph/ceph/pull/27880>`_, Jianpeng Ma)
-* tests: test/fio: introduce fio ioengine: fio_ceph_messenger (`pr#24678 <https://github.com/ceph/ceph/pull/24678>`_, Roman Penyaev)
-* tests: test/kv_store_bench: Fix double free error (`pr#32439 <https://github.com/ceph/ceph/pull/32439>`_, Xuqiang Chen, luo rixin)
-* tests: test/librados: avoid residual crush rule after test case execution (`issue#40970 <http://tracker.ceph.com/issues/40970>`_, `pr#29341 <https://github.com/ceph/ceph/pull/29341>`_, Bingyi Zhang)
-* tests: test/librados: free AioCompletion using AioCompletion::release() (`pr#30204 <https://github.com/ceph/ceph/pull/30204>`_, Kefu Chai)
-* tests: test/librados: use GTEST_SKIP() to skip test (`pr#32770 <https://github.com/ceph/ceph/pull/32770>`_, Kefu Chai)
-* tests: test/msgr: fix ComplexTest fail when using DPDK protocal stack (`pr#31910 <https://github.com/ceph/ceph/pull/31910>`_, Chunsong Feng)
-* tests: test/msgr: make ceph_perf_msgr_client/server work (`pr#28842 <https://github.com/ceph/ceph/pull/28842>`_, Jianpeng Ma)
-* tests: test/objectstore: silence -Wsign-compare warning (`pr#27750 <https://github.com/ceph/ceph/pull/27750>`_, Kefu Chai)
-* tests: test/old: remove stale tests (`pr#29124 <https://github.com/ceph/ceph/pull/29124>`_, Kefu Chai)
-* tests: test/pybind/test_ceph_argparse.py: pg_num of pool creation now optional (`pr#30535 <https://github.com/ceph/ceph/pull/30535>`_, xie xingguo)
-* tests: test/python: remove stale tests (`pr#29413 <https://github.com/ceph/ceph/pull/29413>`_, Kefu Chai)
-* tests: test/TestOSDScrub: fix mktime() error (`pr#33430 <https://github.com/ceph/ceph/pull/33430>`_, luo rixin)
-* tests: test/test_socket: fix dispatch_sockets() unexpected exception (`pr#33482 <https://github.com/ceph/ceph/pull/33482>`_, luo rixin)
-* tests: test/test_weighted_shuffle: enlarge epsilon (`pr#27181 <https://github.com/ceph/ceph/pull/27181>`_, Kefu Chai)
-* tests: test/unittest_bluefs: always remove temp bdev file (`pr#29676 <https://github.com/ceph/ceph/pull/29676>`_, Kefu Chai)
-* tests: test/venv: do not hardwire to py2.7 for tox tests (`pr#29761 <https://github.com/ceph/ceph/pull/29761>`_, Willem Jan Withagen)
-* tests: test: Add flush_pg_stats to avoid race with getting num_shards_repaired (`pr#33776 <https://github.com/ceph/ceph/pull/33776>`_, David Zafman)
-* tests: test: Add `#include <array>` (`pr#27455 <https://github.com/ceph/ceph/pull/27455>`_, Willem Jan Withagen)
-* tests: test: Allow fractional milliseconds to make test possible (`pr#30220 <https://github.com/ceph/ceph/pull/30220>`_, David Zafman)
-* tests: test: do not include unnecessary includes (`pr#30065 <https://github.com/ceph/ceph/pull/30065>`_, Kefu Chai)
-* tests: test: Do not test unicode if boost::spirit >= 1.72 (`pr#32388 <https://github.com/ceph/ceph/pull/32388>`_, Willem Jan Withagen)
-* tests: test: Expect being off by up to 2 and make sure all PGs are active+clean (`pr#33566 <https://github.com/ceph/ceph/pull/33566>`_, David Zafman)
-* tests: test: Fix failing ceph_objectstore_tool.py test (`pr#33593 <https://github.com/ceph/ceph/pull/33593>`_, David Zafman)
-* tests: test: Fix race with osd restart and doing a scru (`pr#32039 <https://github.com/ceph/ceph/pull/32039>`_, David Zafman)
-* tests: test: fix unused asserts variable in ceph_test_osd_stale_read.cc (`pr#32789 <https://github.com/ceph/ceph/pull/32789>`_, Radoslaw Zarzynski)
-* tests: test: Fix wait_for_state() to wait for a PG to get into a state (`pr#32628 <https://github.com/ceph/ceph/pull/32628>`_, David Zafman)
-* tests: test: Ignore OSD_SLOW_PING_TIME\\* if injecting socket failures (`pr#30714 <https://github.com/ceph/ceph/pull/30714>`_, David Zafman)
-* tests: test: move bluestore dependent code under WITH_BLUESTORE (`pr#31335 <https://github.com/ceph/ceph/pull/31335>`_, Willem Jan Withagen)
-* tests: test: remove Dockerfile for centos7 and add Dockerfile for centos8 (`pr#33452 <https://github.com/ceph/ceph/pull/33452>`_, Kefu Chai)
-* tests: test: remove useless ASSERT_XXX macros for rgw test (`pr#30062 <https://github.com/ceph/ceph/pull/30062>`_, Zhi Zhang)
-* tests: test: silence warning unused variable nvme (`pr#33650 <https://github.com/ceph/ceph/pull/33650>`_, Jos Collin)
-* tests: test: Update pg log test for new trimming behavior (`pr#32945 <https://github.com/ceph/ceph/pull/32945>`_, David Zafman)
-* tests: use python3 compatible print (`pr#30758 <https://github.com/ceph/ceph/pull/30758>`_, Kyr Shatskyy)
-* tests: vstart.sh: Make sure mkdir succeeds (`pr#30005 <https://github.com/ceph/ceph/pull/30005>`_, Willem Jan Withagen)
-* test_alien_echo: update to use crimson:: namespace (`pr#31135 <https://github.com/ceph/ceph/pull/31135>`_, Samuel Just)
-* test_cephadm.sh: pass --fsid to shell command (`pr#32389 <https://github.com/ceph/ceph/pull/32389>`_, Sage Weil)
-* test_cephadm: use container shell for ceph cmds (`pr#32627 <https://github.com/ceph/ceph/pull/32627>`_, Michael Fritch)
-* tools: add maxread in rados listomapkeys (`pr#30637 <https://github.com/ceph/ceph/pull/30637>`_, lvshuhua)
-* tools: adding ceph level immutable obj cache daemon (`pr#25545 <https://github.com/ceph/ceph/pull/25545>`_, Yuan Zhou, Dehao Shang)
-* tools: backport-create-issue: flush line before overprinting (`pr#31688 <https://github.com/ceph/ceph/pull/31688>`_, Nathan Cutler)
-* tools: backport-create-issue: read redmine key from file (`pr#31533 <https://github.com/ceph/ceph/pull/31533>`_, Tiago Melo)
-* tools: backport-create-issue: resolve parent if all backports resolved/rejected (`pr#30752 <https://github.com/ceph/ceph/pull/30752>`_, Nathan Cutler)
-* tools: backport-create-issue: resolve parent only if parent has backport issues (`pr#31753 <https://github.com/ceph/ceph/pull/31753>`_, Nathan Cutler)
-* tools: backport-resolve-issue: narrow regular expression and read key/token from files (`pr#31594 <https://github.com/ceph/ceph/pull/31594>`_, Nathan Cutler)
-* tools: backport-resolve-issue: populate tracker_description method (`pr#33105 <https://github.com/ceph/ceph/pull/33105>`_, Nathan Cutler)
-* tools: backport-resolve-issue: recognize that Target version is populated and prune duplicate URLs (`pr#31247 <https://github.com/ceph/ceph/pull/31247>`_, Nathan Cutler)
-* tools: backport-resolve-issue: resolve multiple backport issues (`pr#30988 <https://github.com/ceph/ceph/pull/30988>`_, Nathan Cutler)
-* tools: backport-resolve-issue: use Basic Authentication instead of access_token (`pr#33173 <https://github.com/ceph/ceph/pull/33173>`_, Nathan Cutler)
-* tools: build-integration-branch: dont fail on existing branch (`pr#33093 <https://github.com/ceph/ceph/pull/33093>`_, Sage Weil)
-* tools: build-integration-branch: take PRs in chronological order (`pr#31132 <https://github.com/ceph/ceph/pull/31132>`_, Nathan Cutler)
-* tools: ceph-backport.sh: allow user to specify --fork explicitly (`pr#31734 <https://github.com/ceph/ceph/pull/31734>`_, Nathan Cutler)
-* tools: ceph-backport.sh: automate setting of milestone and component label, implement --version option (`pr#30725 <https://github.com/ceph/ceph/pull/30725>`_, Nathan Cutler)
-* tools: ceph-backport.sh: cherry-pick individual commits (`pr#30097 <https://github.com/ceph/ceph/pull/30097>`_, Jan Fajerski)
-* tools: ceph-backport.sh: fix setup routine (`pr#33456 <https://github.com/ceph/ceph/pull/33456>`_, Nathan Cutler)
-* tools: ceph-backport.sh: guess component with --existing-pr (`pr#31419 <https://github.com/ceph/ceph/pull/31419>`_, Nathan Cutler)
-* tools: ceph-backport.sh: implement --milestones feature and more-careful vetting (`pr#30879 <https://github.com/ceph/ceph/pull/30879>`_, Nathan Cutler)
-* tools: ceph-backport.sh: implement interactive setup routine and new options (`pr#31366 <https://github.com/ceph/ceph/pull/31366>`_, Nathan Cutler)
-* tools: ceph-backport.sh: use Basic Authentication instead of access_token (`pr#33182 <https://github.com/ceph/ceph/pull/33182>`_, Nathan Cutler)
-* tools: ceph-conf: added --show-config-value to usage (`pr#29981 <https://github.com/ceph/ceph/pull/29981>`_, James McClune)
-* tools: ceph-crash: use open(..,r) to read bytes for Python3 (`issue#40781 <http://tracker.ceph.com/issues/40781>`_, `pr#29053 <https://github.com/ceph/ceph/pull/29053>`_, Dan Mick)
-* tools: ceph-daemon: ExecStart=/bin/bash script (`pr#31319 <https://github.com/ceph/ceph/pull/31319>`_, Sage Weil)
-* tools: ceph-daemon: fix typo in the output_pub_ssh_key argument (`pr#31337 <https://github.com/ceph/ceph/pull/31337>`_, John McGowan)
-* tools: ceph-daemon: Fix `ls` cmd for legacy confs (`pr#31329 <https://github.com/ceph/ceph/pull/31329>`_, Michael Fritch)
-* tools: ceph-monstore-tool: print out caps when rebuilding monstore (`pr#27340 <https://github.com/ceph/ceph/pull/27340>`_, Kefu Chai)
-* tools: ceph-objectstore-tool: return 0 if incmap is sane (`pr#29704 <https://github.com/ceph/ceph/pull/29704>`_, Kefu Chai)
-* tools: ceph-objectstore-tool: update-mon-db: do not fail if incmap is missing (`pr#29571 <https://github.com/ceph/ceph/pull/29571>`_, Kefu Chai)
-* tools: ceph.in: fix verbose print (`pr#29486 <https://github.com/ceph/ceph/pull/29486>`_, luo.runbing)
-* tools: cls: add timeindex types to ceph-dencoder (`pr#27780 <https://github.com/ceph/ceph/pull/27780>`_, Abhishek Lekshmanan)
-* tools: github/codeowners: add ceph-volume (`pr#31883 <https://github.com/ceph/ceph/pull/31883>`_, Jan Fajerski)
-* tools: github: Add CODEOWNERs for designated code-owner reviews (`pr#29451 <https://github.com/ceph/ceph/pull/29451>`_, Ernesto Puerta)
-* tools: no-mon-config switch for ceph-objectstore-tool (`pr#26717 <https://github.com/ceph/ceph/pull/26717>`_, Igor Fedotov)
-* tools: pin the version of breathe that works with Python2 (`pr#27721 <https://github.com/ceph/ceph/pull/27721>`_, Alfredo Deza)
-* tools: script/backport-create-issue: add --resolve-parent feature (`pr#29904 <https://github.com/ceph/ceph/pull/29904>`_, Nathan Cutler)
-* tools: script/backport-create-issue: handle long Redmine issue names (`pr#27887 <https://github.com/ceph/ceph/pull/27887>`_, Nathan Cutler)
-* tools: script/backport-resolve-issue: better error message (`pr#30187 <https://github.com/ceph/ceph/pull/30187>`_, Nathan Cutler)
-* tools: script/backport-resolve-issue: handle tracker URLs better (`pr#29950 <https://github.com/ceph/ceph/pull/29950>`_, Nathan Cutler)
-* tools: script/ceph-backport-sh: add access_token parameter to all ghub api c\xe2\x80\xa6 (`pr#29261 <https://github.com/ceph/ceph/pull/29261>`_, Jan Fajerski)
-* tools: script/ceph-backport.sh: Add prepare function (`pr#28446 <https://github.com/ceph/ceph/pull/28446>`_, Tiago Melo)
-* tools: script/ceph-backport.sh: Allow to set component label (`pr#29318 <https://github.com/ceph/ceph/pull/29318>`_, Tiago Melo)
-* tools: script/ceph-backport.sh: allow user to specify remote repo (`pr#27233 <https://github.com/ceph/ceph/pull/27233>`_, Kefu Chai)
-* tools: script/ceph-backport.sh: carry https through to logical conclusion (`pr#29743 <https://github.com/ceph/ceph/pull/29743>`_, Nathan Cutler)
-* tools: script/ceph-backport.sh: Fix verification of git repository (`pr#30398 <https://github.com/ceph/ceph/pull/30398>`_, Tiago Melo)
-* tools: script/ceph-backport.sh: make the script idempotent (`pr#30106 <https://github.com/ceph/ceph/pull/30106>`_, Nathan Cutler)
-* tools: script/ceph-backport.sh: Use secure access for tracker.ceph.com (`pr#29438 <https://github.com/ceph/ceph/pull/29438>`_, Willem Jan Withagen)
-* tools: script/ceph-backport.sh: wholesale refactor (`pr#29957 <https://github.com/ceph/ceph/pull/29957>`_, Nathan Cutler)
-* tools: script/ceph-release-notes: alternate merge commit format (`pr#27281 <https://github.com/ceph/ceph/pull/27281>`_, Nathan Cutler)
-* tools: script/ptl-tool: update for python3 (`pr#29095 <https://github.com/ceph/ceph/pull/29095>`_, Patrick Donnelly)
-* tools: script/run_mypy: Sort groups (`pr#28225 <https://github.com/ceph/ceph/pull/28225>`_, Sebastian Wagner)
-* tools: script/run_tox.sh: remove unused code (`pr#30386 <https://github.com/ceph/ceph/pull/30386>`_, Kefu Chai)
-* tools: script/sepia_bt.sh: remove stale script (`pr#29129 <https://github.com/ceph/ceph/pull/29129>`_, Kefu Chai)
-* tools: script: add backport-resolve-issue (`pr#29797 <https://github.com/ceph/ceph/pull/29797>`_, Nathan Cutler)
-* tools: script: enable nautilus in backport scripts (`pr#26973 <https://github.com/ceph/ceph/pull/26973>`_, Nathan Cutler)
-* tools: script: Obtain milestones via github API (`pr#27221 <https://github.com/ceph/ceph/pull/27221>`_, Lenz Grimmer)
-* tools: script: raw_input was renamed to input in py3 (`pr#30346 <https://github.com/ceph/ceph/pull/30346>`_, Patrick Donnelly)
-* tools: scripts/kubejacker: Fix mgr_plugins target for centos (`pr#28078 <https://github.com/ceph/ceph/pull/28078>`_, Sebastian Wagner)
-* tools: scripts/run_mypy: add .gitignore (`pr#27118 <https://github.com/ceph/ceph/pull/27118>`_, Sebastian Wagner)
-* tools: scripts: use https url for redmine (`pr#29536 <https://github.com/ceph/ceph/pull/29536>`_, Patrick Donnelly)
-* tools: src/script/backport-create-issue: implement --force option (`pr#30571 <https://github.com/ceph/ceph/pull/30571>`_, Nathan Cutler)
-* tools: src/script/check_commands.sh: fix grep regex class range (`pr#29161 <https://github.com/ceph/ceph/pull/29161>`_, Valentin Bajrami)
-* tools: src/script/unhexdump-C: script to reverse a hexdump -C style hexdump (`pr#29098 <https://github.com/ceph/ceph/pull/29098>`_, Sage Weil)
-* tools: stop.sh: use bash shell to solve syntax error (`pr#32263 <https://github.com/ceph/ceph/pull/32263>`_, luo rixin)
-* tools: tool/ceph-conf: s/global_pre_init()/global_init()/ (`issue#7849 <http://tracker.ceph.com/issues/7849>`_, `pr#29058 <https://github.com/ceph/ceph/pull/29058>`_, Kefu Chai)
-* tools: tool: ceph_monstore_tool: --readable=0 => --readable (`pr#32265 <https://github.com/ceph/ceph/pull/32265>`_, simon gao)
-* tools: tools/ceph-kvstore-tool: print db stats (`pr#27162 <https://github.com/ceph/ceph/pull/27162>`_, Igor Fedotov)
-* tools: tools/osdmaptool.cc: do not use deprecated std::random_shuffle() (`pr#31990 <https://github.com/ceph/ceph/pull/31990>`_, Kefu Chai)
-* tools: tools/rados: update advisory lock break usage with --lock-cookie required (`pr#31348 <https://github.com/ceph/ceph/pull/31348>`_, Zhi Zhang)
-* tools: vstart.sh: fix CEPH_PORT check and cleanups (`pr#26782 <https://github.com/ceph/ceph/pull/26782>`_, Changcheng Liu, Kefu Chai)
-* tools: vstart: add --inc-osd option (`pr#30512 <https://github.com/ceph/ceph/pull/30512>`_, xie xingguo)
-* tools: vstart: add new option to pass list of block devices to bluestore (`pr#27518 <https://github.com/ceph/ceph/pull/27518>`_, Jeff Layton)
-* tools: vstart: fix error when getting CMake variables with the same prefix (`pr#31962 <https://github.com/ceph/ceph/pull/31962>`_, Kiefer Chang)
-* tools: vstart: fix run() invocation for rgw (`pr#28386 <https://github.com/ceph/ceph/pull/28386>`_, Casey Bodley)
-* Update grafana dashboards (`issue#39652 <http://tracker.ceph.com/issues/39652>`_, `pr#28043 <https://github.com/ceph/ceph/pull/28043>`_, Jan Fajerski)
-* vstart.sh: add an option to use crimson-osd (`pr#27108 <https://github.com/ceph/ceph/pull/27108>`_, chunmei Liu, Kefu Chai)
-* vstart.sh: correct ceph-run path (`pr#27968 <https://github.com/ceph/ceph/pull/27968>`_, Changcheng Liu)
-* vstart.sh: fix install of cephadm ssh keys from ~/.ssh (`pr#33647 <https://github.com/ceph/ceph/pull/33647>`_, Sage Weil)
-* vstart.sh: Fix problem that all extra_conf got merged into single line (`pr#28586 <https://github.com/ceph/ceph/pull/28586>`_, Adam Kupczyk)
-* vstart.sh: move extra_seastar_args up in vstart.sh (`pr#32366 <https://github.com/ceph/ceph/pull/32366>`_, Chunmei Liu)
-* vstart.sh: unify the indent (`pr#27995 <https://github.com/ceph/ceph/pull/27995>`_, Kefu Chai, Richael Zhuang)
-* vstart_runner: split unicode arguments into lists (`pr#28561 <https://github.com/ceph/ceph/pull/28561>`_, Rishabh Dave)
-
-.. _announcement: https://lists.fedoraproject.org/archives/list/epel-announce@lists.fedoraproject.org/message/EGUMKAIMPK2UD5VSHXM53BH2MBDGDWMO/
-.. _Bucket Notifications: ../../radosgw/notifications
-.. _HashiCorp Vault Integration: ../../radosgw/vault
-.. _Multisite Sync Policy: ../../radosgw/multisite-sync-policy
diff --git a/ceph/doc/releases/pacific.rst b/ceph/doc/releases/pacific.rst
deleted file mode 100644 (file)
index 5394545..0000000
+++ /dev/null
@@ -1,1362 +0,0 @@
-=======
-Pacific
-=======
-
-v16.2.7 Pacific   
-===============
-
-This is the seventh backport release in the Pacific series.
-
-Notable Changes
----------------
-
-* Critical bug in OMAP format upgrade is fixed. This could cause data corruption
-  (improperly formatted OMAP keys) after pre-Pacific cluster upgrade if
-  bluestore-quick-fix-on-mount parameter is set to true or ceph-bluestore-tool's
-  quick-fix/repair commands are invoked.
-  Relevant tracker: https://tracker.ceph.com/issues/53062
-  ``bluestore-quick-fix-on-mount`` continues to be set to false, by default.
-  
-* CephFS:  If you are not using cephadm, you must disable FSMap sanity checks *before starting the upgrade*::
-  
-      ceph config set mon mon_mds_skip_sanity true
-
-  After the upgrade has finished and the cluster is stable, please remove that setting::
-
-      ceph config rm mon mon_mds_skip_sanity
-
-  Clusters managed by and upgraded using cephadm take care of this step automatically.
-
-* MGR: The pg_autoscaler will use the 'scale-up' profile as the default profile.
-  16.2.6 changed the default profile to 'scale-down' but we ran into issues
-  with the device_health_metrics pool consuming too many PGs, which is not ideal
-  for performance. So we will continue to use the 'scale-up' profile by default,
-  until we implement a limit on the number of PGs default pools should consume,
-  in combination with the 'scale-down' profile.
-
-* Cephadm & Ceph Dashboard: NFS management has been completely reworked to
-  ensure that NFS exports are managed consistently across the different Ceph
-  components. Prior to this, there were 3 incompatible implementations for
-  configuring the NFS exports: Ceph-Ansible/OpenStack Manila, Ceph Dashboard and
-  'mgr/nfs' module. With this release the 'mgr/nfs' way becomes the official
-  interface, and the remaining components (Cephadm and Ceph Dashboard) adhere to
-  it. While this might require manually migrating from the deprecated
-  implementations, it will simplify the user experience for those heavily
-  relying on NFS exports.
-
-* Dashboard: "Cluster Expansion Wizard". After the 'cephadm bootstrap' step,
-  users that log into the Ceph Dashboard will be presented with a welcome
-  screen. If they choose to follow the installation wizard, they will be guided 
-  through a set of steps to help them configure their Ceph cluster: expanding
-  the cluster by adding more hosts, detecting and defining their storage
-  devices, and finally deploying and configuring the different Ceph services.
-
-* OSD: When using mclock_scheduler for QoS, there is no longer a need to run any
-  manual benchmark. The OSD now automatically sets an appropriate value for
-  `osd_mclock_max_capacity_iops` by running a simple benchmark during
-  initialization.
-
-* MGR: The global recovery event in the progress module has been optimized and
-  a `sleep_interval` of 5 seconds has been added between stats collection,
-  to reduce the impact of the progress module on the MGR, especially in large
-  clusters.
-  
-Changelog
----------
-
-* rpm, debian: move smartmontools and nvme-cli to ceph-base (`pr#44164 <https://github.com/ceph/ceph/pull/44164>`_, Yaarit Hatuka)
-* qa: miscellaneous perf suite fixes (`pr#44154 <https://github.com/ceph/ceph/pull/44154>`_, Neha Ojha)
-* qa/suites/orch/cephadm: mgr-nfs-upgrade: add missing 0-distro dir (`pr#44201 <https://github.com/ceph/ceph/pull/44201>`_, Sebastian Wagner)
-* \*: s/virtualenv/python -m venv/ (`pr#43002 <https://github.com/ceph/ceph/pull/43002>`_, Kefu Chai, Ken Dreyer)
-* admin/doc-requirements.txt: pin Sphinx at 3.5.4 (`pr#43748 <https://github.com/ceph/ceph/pull/43748>`_, Kefu Chai)
-* backport mgr/nfs bits (`pr#43811 <https://github.com/ceph/ceph/pull/43811>`_, Sage Weil, Michael Fritch)
-* ceph-volume: `get_first_lv()` refactor (`pr#43960 <https://github.com/ceph/ceph/pull/43960>`_, Guillaume Abrioux)
-* ceph-volume: fix a typo causing AttributeError (`pr#43949 <https://github.com/ceph/ceph/pull/43949>`_, Taha Jahangir)
-* ceph-volume: fix bug with miscalculation of required db/wal slot size for VGs with multiple PVs (`pr#43948 <https://github.com/ceph/ceph/pull/43948>`_, Guillaume Abrioux, Cory Snyder)
-* ceph-volume: fix lvm activate --all --no-systemd (`pr#43267 <https://github.com/ceph/ceph/pull/43267>`_, Dimitri Savineau)
-* ceph-volume: util/prepare fix osd_id_available() (`pr#43708 <https://github.com/ceph/ceph/pull/43708>`_, Guillaume Abrioux)
-* ceph.spec: selinux scripts respect CEPH_AUTO_RESTART_ON_UPGRADE (`pr#43235 <https://github.com/ceph/ceph/pull/43235>`_, Dan van der Ster)
-* cephadm: November batch (`pr#43906 <https://github.com/ceph/ceph/pull/43906>`_, Sebastian Wagner, Sage Weil, Daniel Pivonka, Andrew Sharapov, Paul Cuzner, Adam King, Melissa Li)
-* cephadm: October batch (`pr#43728 <https://github.com/ceph/ceph/pull/43728>`_, Patrick Donnelly, Sage Weil, Cory Snyder, Sebastian Wagner, Paul Cuzner, Joao Eduardo Luis, Zac Dover, Dmitry Kvashnin, Daniel Pivonka, Adam King, jianglong01, Guillaume Abrioux, Melissa Li, Roaa Sakr, Kefu Chai, Brad Hubbard, Michael Fritch, Javier Cacheiro)
-* cephfs-mirror, test: add thrasher for cephfs mirror daemon, HA test yamls (`issue#50372 <http://tracker.ceph.com/issues/50372>`_, `pr#43924 <https://github.com/ceph/ceph/pull/43924>`_, Venky Shankar)
-* cephfs-mirror: shutdown ClusterWatcher on termination (`pr#43198 <https://github.com/ceph/ceph/pull/43198>`_, Willem Jan Withagen, Venky Shankar)
-* cmake: link Threads::Threads instead of CMAKE_THREAD_LIBS_INIT (`pr#43167 <https://github.com/ceph/ceph/pull/43167>`_, Ken Dreyer)
-* cmake: s/Python_EXECUTABLE/Python3_EXECUTABLE/ (`pr#43264 <https://github.com/ceph/ceph/pull/43264>`_, Michael Fritch)
-* crush: cancel upmaps with up set size != pool size (`pr#43415 <https://github.com/ceph/ceph/pull/43415>`_, huangjun)
-* doc/radosgw/nfs: add note about NFSv3 deprecation (`pr#43941 <https://github.com/ceph/ceph/pull/43941>`_, Michael Fritch)
-* doc: document subvolume (group) pins (`pr#43925 <https://github.com/ceph/ceph/pull/43925>`_, Patrick Donnelly)
-* github: add dashboard PRs to Dashboard project (`pr#43610 <https://github.com/ceph/ceph/pull/43610>`_, Ernesto Puerta)
-* librbd/cache/pwl: persistant cache backports (`pr#43772 <https://github.com/ceph/ceph/pull/43772>`_, Kefu Chai, Yingxin Cheng, Yin Congmin, Feng Hualong, Jianpeng Ma, Ilya Dryomov, Hualong Feng)
-* librbd/cache/pwl: SSD caching backports (`pr#43918 <https://github.com/ceph/ceph/pull/43918>`_, Yin Congmin, Jianpeng Ma)
-* librbd/object_map: rbd diff between two snapshots lists entire image content (`pr#43805 <https://github.com/ceph/ceph/pull/43805>`_, Sunny Kumar)
-* librbd: fix pool validation lockup (`pr#43113 <https://github.com/ceph/ceph/pull/43113>`_, Ilya Dryomov)
-* mds/FSMap: do not assert allow_standby_replay on old FSMaps (`pr#43614 <https://github.com/ceph/ceph/pull/43614>`_, Patrick Donnelly)
-* mds: Add new flag to MClientSession (`pr#43251 <https://github.com/ceph/ceph/pull/43251>`_, Kotresh HR)
-* mds: do not trim stray dentries during opening the root (`pr#43815 <https://github.com/ceph/ceph/pull/43815>`_, Xiubo Li)
-* mds: skip journaling blocklisted clients when in `replay` state (`pr#43841 <https://github.com/ceph/ceph/pull/43841>`_, Venky Shankar)
-* mds: switch mds_lock to fair mutex to fix the slow performance issue (`pr#43148 <https://github.com/ceph/ceph/pull/43148>`_, Xiubo Li, Kefu Chai)
-* MDSMonitor: assertion during upgrade to v16.2.5+ (`pr#43890 <https://github.com/ceph/ceph/pull/43890>`_, Patrick Donnelly)
-* MDSMonitor: handle damaged state from standby-replay (`pr#43200 <https://github.com/ceph/ceph/pull/43200>`_, Patrick Donnelly)
-* MDSMonitor: no active MDS after cluster deployment (`pr#43891 <https://github.com/ceph/ceph/pull/43891>`_, Patrick Donnelly)
-* mgr/dashboard,prometheus: fix handling of server_addr (`issue#52002 <http://tracker.ceph.com/issues/52002>`_, `pr#43631 <https://github.com/ceph/ceph/pull/43631>`_, Scott Shambarger)
-* mgr/dashboard: all pyfakefs must be pinned on same version (`pr#43930 <https://github.com/ceph/ceph/pull/43930>`_, Rishabh Dave)
-* mgr/dashboard: BATCH incl.: NFS integration, Cluster Expansion Workflow, and Angular 11 upgrade (`pr#43682 <https://github.com/ceph/ceph/pull/43682>`_, Alfonso Martínez, Avan Thakkar, Aashish Sharma, Nizamudeen A, Pere Diaz Bou, Varsha Rao, Ramana Raja, Sage Weil, Kefu Chai)
-* mgr/dashboard: cephfs MDS Workload to use rate for counter type metric (`pr#43190 <https://github.com/ceph/ceph/pull/43190>`_, Jan Horacek)
-* mgr/dashboard: clean-up controllers and API backward versioning compatibility (`pr#43543 <https://github.com/ceph/ceph/pull/43543>`_, Ernesto Puerta, Avan Thakkar)
-* mgr/dashboard: Daemon Events listing using bootstrap class (`pr#44057 <https://github.com/ceph/ceph/pull/44057>`_, Nizamudeen A)
-* mgr/dashboard: deprecated variable usage in Grafana dashboards (`pr#43188 <https://github.com/ceph/ceph/pull/43188>`_, Patrick Seidensal)
-* mgr/dashboard: Device health status is not getting listed under hosts section (`pr#44053 <https://github.com/ceph/ceph/pull/44053>`_, Aashish Sharma)
-* mgr/dashboard: Edit a service feature (`pr#43939 <https://github.com/ceph/ceph/pull/43939>`_, Nizamudeen A)
-* mgr/dashboard: Fix failing config dashboard e2e check (`pr#43238 <https://github.com/ceph/ceph/pull/43238>`_, Nizamudeen A)
-* mgr/dashboard: fix flaky inventory e2e test (`pr#44056 <https://github.com/ceph/ceph/pull/44056>`_, Nizamudeen A)
-* mgr/dashboard: fix missing alert rule details (`pr#43812 <https://github.com/ceph/ceph/pull/43812>`_, Ernesto Puerta)
-* mgr/dashboard: Fix orchestrator/01-hosts.e2e-spec.ts failure (`pr#43541 <https://github.com/ceph/ceph/pull/43541>`_, Nizamudeen A)
-* mgr/dashboard: include mfa_ids in rgw user-details section (`pr#43893 <https://github.com/ceph/ceph/pull/43893>`_, Avan Thakkar)
-* mgr/dashboard: Incorrect MTU mismatch warning (`pr#43185 <https://github.com/ceph/ceph/pull/43185>`_, Aashish Sharma)
-* mgr/dashboard: monitoring: grafonnet refactoring for radosgw dashboards (`pr#43644 <https://github.com/ceph/ceph/pull/43644>`_, Aashish Sharma)
-* mgr/dashboard: Move force maintenance test to the workflow test suite (`pr#43347 <https://github.com/ceph/ceph/pull/43347>`_, Nizamudeen A)
-* mgr/dashboard: pin a version for autopep8 and pyfakefs (`pr#43646 <https://github.com/ceph/ceph/pull/43646>`_, Nizamudeen A)
-* mgr/dashboard: Predefine labels in create host form (`pr#44077 <https://github.com/ceph/ceph/pull/44077>`_, Nizamudeen A)
-* mgr/dashboard: provisioned values is misleading in RBD image table (`pr#44051 <https://github.com/ceph/ceph/pull/44051>`_, Avan Thakkar)
-* mgr/dashboard: replace "Ceph-cluster" Client connections with active-standby MGRs (`pr#43523 <https://github.com/ceph/ceph/pull/43523>`_, Avan Thakkar)
-* mgr/dashboard: rgw daemon list: add realm column (`pr#44047 <https://github.com/ceph/ceph/pull/44047>`_, Alfonso Martínez)
-* mgr/dashboard: Spelling mistake in host-form Network address field (`pr#43973 <https://github.com/ceph/ceph/pull/43973>`_, Avan Thakkar)
-* mgr/dashboard: Visual regression tests for ceph dashboard (`pr#42678 <https://github.com/ceph/ceph/pull/42678>`_, Aaryan Porwal)
-* mgr/dashboard: visual tests: Add more ignore regions for dashboard component (`pr#43240 <https://github.com/ceph/ceph/pull/43240>`_, Aaryan Porwal)
-* mgr/influx: use "N/A" for unknown hostname (`pr#43368 <https://github.com/ceph/ceph/pull/43368>`_, Kefu Chai)
-* mgr/mirroring: remove unnecessary fs_name arg from daemon status command (`issue#51989 <http://tracker.ceph.com/issues/51989>`_, `pr#43199 <https://github.com/ceph/ceph/pull/43199>`_, Venky Shankar)
-* mgr/nfs: nfs-rgw batch backport (`pr#43075 <https://github.com/ceph/ceph/pull/43075>`_, Sebastian Wagner, Sage Weil, Varsha Rao, Ramana Raja)
-* mgr/progress: optimize global recovery && introduce 5 seconds interval (`pr#43353 <https://github.com/ceph/ceph/pull/43353>`_, Kamoltat, Neha Ojha)
-* mgr/prometheus: offer ability to disable cache (`pr#43931 <https://github.com/ceph/ceph/pull/43931>`_, Patrick Seidensal)
-* mgr/volumes: Fix permission during subvol creation with mode (`pr#43223 <https://github.com/ceph/ceph/pull/43223>`_, Kotresh HR)
-* mgr: Add check to prevent mgr from crashing (`pr#43445 <https://github.com/ceph/ceph/pull/43445>`_, Aswin Toni)
-* mon,auth: fix proposal (and mon db rebuild) of rotating secrets (`pr#43697 <https://github.com/ceph/ceph/pull/43697>`_, Sage Weil)
-* mon/MDSMonitor: avoid crash when decoding old FSMap epochs (`pr#43615 <https://github.com/ceph/ceph/pull/43615>`_, Patrick Donnelly)
-* mon: Allow specifying new tiebreaker monitors (`pr#43457 <https://github.com/ceph/ceph/pull/43457>`_, Greg Farnum)
-* mon: MonMap: display disallowed_leaders whenever they're set (`pr#43972 <https://github.com/ceph/ceph/pull/43972>`_, Greg Farnum)
-* mon: MonMap: do not increase mon_info_t's compatv in stretch mode, really (`pr#43971 <https://github.com/ceph/ceph/pull/43971>`_, Greg Farnum)
-* monitoring: ethernet bonding filter in Network Load (`pr#43694 <https://github.com/ceph/ceph/pull/43694>`_, Pere Diaz Bou)
-* msg/async/ProtocolV2: Set the recv_stamp at the beginning of receiving a message (`pr#43511 <https://github.com/ceph/ceph/pull/43511>`_, dongdong tao)
-* msgr/async: fix unsafe access in unregister_conn() (`pr#43548 <https://github.com/ceph/ceph/pull/43548>`_, Sage Weil, Radoslaw Zarzynski)
-* os/bluestore: _do_write_small fix head_pad (`pr#43756 <https://github.com/ceph/ceph/pull/43756>`_, dheart)
-* os/bluestore: do not select absent device in volume selector (`pr#43970 <https://github.com/ceph/ceph/pull/43970>`_, Igor Fedotov)
-* os/bluestore: fix invalid omap name conversion when upgrading to per-pg (`pr#43793 <https://github.com/ceph/ceph/pull/43793>`_, Igor Fedotov)
-* os/bluestore: list obj which equals to pend (`pr#43512 <https://github.com/ceph/ceph/pull/43512>`_, Mykola Golub, Kefu Chai)
-* os/bluestore: multiple repair fixes (`pr#43731 <https://github.com/ceph/ceph/pull/43731>`_, Igor Fedotov)
-* osd/OSD: mkfs need wait for transcation completely finish (`pr#43417 <https://github.com/ceph/ceph/pull/43417>`_, Chen Fan)
-* osd: fix partial recovery become whole object recovery after restart osd (`pr#43513 <https://github.com/ceph/ceph/pull/43513>`_, Jianwei Zhang)
-* osd: fix to allow inc manifest leaked (`pr#43306 <https://github.com/ceph/ceph/pull/43306>`_, Myoungwon Oh)
-* osd: fix to recover adjacent clone when set_chunk is called (`pr#43099 <https://github.com/ceph/ceph/pull/43099>`_, Myoungwon Oh)
-* osd: handle inconsistent hash info during backfill and deep scrub gracefully (`pr#43544 <https://github.com/ceph/ceph/pull/43544>`_, Ronen Friedman, Mykola Golub)
-* osd: re-cache peer_bytes on every peering state activate (`pr#43437 <https://github.com/ceph/ceph/pull/43437>`_, Mykola Golub)
-* osd: Run osd bench test to override default max osd capacity for mclock (`pr#41731 <https://github.com/ceph/ceph/pull/41731>`_, Sridhar Seshasayee)
-* Pacific: BlueStore: Omap upgrade to per-pg fix fix (`pr#43922 <https://github.com/ceph/ceph/pull/43922>`_, Adam Kupczyk)
-* Pacific: client: do not defer releasing caps when revoking (`pr#43782 <https://github.com/ceph/ceph/pull/43782>`_, Xiubo Li)
-* Pacific: mds: add read/write io size metrics support (`pr#43784 <https://github.com/ceph/ceph/pull/43784>`_, Xiubo Li)
-* Pacific: test/libcephfs: put inodes after lookup (`pr#43562 <https://github.com/ceph/ceph/pull/43562>`_, Patrick Donnelly)
-* pybind/mgr/cephadm: set allow_standby_replay during CephFS upgrade (`pr#43559 <https://github.com/ceph/ceph/pull/43559>`_, Patrick Donnelly)
-* pybind/mgr/CMakeLists.txt: exclude files not used at runtime (`pr#43787 <https://github.com/ceph/ceph/pull/43787>`_, Duncan Bellamy)
-* pybind/mgr/pg_autoscale: revert to default profile scale-up (`pr#44032 <https://github.com/ceph/ceph/pull/44032>`_, Kamoltat)
-* qa/mgr/dashboard/test_pool: don't check HEALTH_OK (`pr#43440 <https://github.com/ceph/ceph/pull/43440>`_, Ernesto Puerta)
-* qa/mgr/dashboard: add extra wait to test (`pr#43351 <https://github.com/ceph/ceph/pull/43351>`_, Ernesto Puerta)
-* qa/rgw: pacific branch targets ceph-pacific branch of java_s3tests (`pr#43809 <https://github.com/ceph/ceph/pull/43809>`_, Casey Bodley)
-* qa/tasks/kubeadm: force docker cgroup engine to systemd (`pr#43937 <https://github.com/ceph/ceph/pull/43937>`_, Sage Weil)
-* qa/tasks/mgr: skip test_diskprediction_local on python>=3.8 (`pr#43421 <https://github.com/ceph/ceph/pull/43421>`_, Kefu Chai)
-* qa/tests: advanced version to reflect the latest 16.2.6 release (`pr#43242 <https://github.com/ceph/ceph/pull/43242>`_, Yuri Weinstein)
-* qa: disable metrics on kernel client during upgrade (`pr#44034 <https://github.com/ceph/ceph/pull/44034>`_, Patrick Donnelly)
-* qa: lengthen grace for fs map showing dead MDS (`pr#43702 <https://github.com/ceph/ceph/pull/43702>`_, Patrick Donnelly)
-* qa: reduce frag split confs for dir_split counter test (`pr#43828 <https://github.com/ceph/ceph/pull/43828>`_, Patrick Donnelly)
-* rbd-mirror: fix mirror image removal (`pr#43662 <https://github.com/ceph/ceph/pull/43662>`_, Arthur Outhenin-Chalandre)
-* rbd-mirror: unbreak one-way snapshot-based mirroring (`pr#43315 <https://github.com/ceph/ceph/pull/43315>`_, Ilya Dryomov)
-* rgw/notification: make notifications agnostic of bucket reshard (`pr#42946 <https://github.com/ceph/ceph/pull/42946>`_, Yuval Lifshitz)
-* rgw/notifications: cache object size to avoid accessing invalid memory (`pr#42949 <https://github.com/ceph/ceph/pull/42949>`_, Yuval Lifshitz)
-* rgw/notifications: send correct size in case of delete marker creation (`pr#42643 <https://github.com/ceph/ceph/pull/42643>`_, Yuval Lifshitz)
-* rgw/notifications: support v4 auth for topics and notifications (`pr#42947 <https://github.com/ceph/ceph/pull/42947>`_, Yuval Lifshitz)
-* rgw/rgw_rados: make RGW request IDs non-deterministic (`pr#43695 <https://github.com/ceph/ceph/pull/43695>`_, Cory Snyder)
-* rgw/sts: fix for copy object operation using sts (`pr#43703 <https://github.com/ceph/ceph/pull/43703>`_, Pritha Srivastava)
-* rgw/tracing: unify SO version numbers within librgw2 package (`pr#43619 <https://github.com/ceph/ceph/pull/43619>`_, Nathan Cutler)
-* rgw: add abstraction for ops log destination and add file logger (`pr#43740 <https://github.com/ceph/ceph/pull/43740>`_, Casey Bodley, Cory Snyder)
-* rgw: Ensure buckets too old to decode a layout have layout logs (`pr#43823 <https://github.com/ceph/ceph/pull/43823>`_, Adam C. Emerson)
-* rgw: fix bucket purge incomplete multipart uploads (`pr#43862 <https://github.com/ceph/ceph/pull/43862>`_, J. Eric Ivancich)
-* rgw: fix spelling of eTag in S3 message structure (`pr#42945 <https://github.com/ceph/ceph/pull/42945>`_, Tom Schoonjans)
-* rgw: fix sts memory leak (`pr#43348 <https://github.com/ceph/ceph/pull/43348>`_, yuliyang_yewu)
-* rgw: remove prefix & delim params for bucket removal & mp upload abort (`pr#43975 <https://github.com/ceph/ceph/pull/43975>`_, J. Eric Ivancich)
-* rgw: use existing s->bucket in s3 website retarget() (`pr#43777 <https://github.com/ceph/ceph/pull/43777>`_, Casey Bodley)
-* snap-schedule: count retained snapshots per retention policy (`pr#43434 <https://github.com/ceph/ceph/pull/43434>`_, Jan Fajerski)
-* test: shutdown the mounter after test finishes (`pr#43475 <https://github.com/ceph/ceph/pull/43475>`_, Xiubo Li)
-
-v16.2.6 Pacific
-===============
-
-.. DANGER:: DATE: 01 NOV 2021. 
-
-   DO NOT UPGRADE TO CEPH PACIFIC FROM AN OLDER VERSION.  
-
-   A recently-discovered bug (https://tracker.ceph.com/issues/53062) can cause
-   data corruption. This bug occurs during OMAP format conversion for
-   clusters that are updated to Pacific. New clusters are not affected by this
-   bug.
-
-   The trigger for this bug is BlueStore's repair/quick-fix functionality. This
-   bug can be triggered in two known ways: 
-
-    (1) manually via the ceph-bluestore-tool, or 
-    (2) automatically, by OSD if ``bluestore_fsck_quick_fix_on_mount`` is set 
-        to true.
-
-   The fix for this bug is expected to be available in Ceph v16.2.7.
-
-   DO NOT set ``bluestore_quick_fix_on_mount`` to true. If it is currently
-   set to true in your configuration, immediately set it to false.
-
-   DO NOT run ``ceph-bluestore-tool``'s repair/quick-fix commands.
-
-
-This is the sixth backport release in the Pacific series. 
-
-
-Notable Changes
----------------
-
-* MGR: The pg_autoscaler has a new default 'scale-down' profile which provides more
-  performance from the start for new pools (for newly created clusters).
-  Existing clusters will retain the old behavior, now called the 'scale-up' profile.
-  For more details, see:
-  https://docs.ceph.com/en/latest/rados/operations/placement-groups/
-
-* CephFS: the upgrade procedure for CephFS is now simpler. It is no longer
-  necessary to stop all MDS before upgrading the sole active MDS. After
-  disabling standby-replay, reducing max_mds to 1, and waiting for the file
-  systems to become stable (each fs with 1 active and 0 stopping daemons), a
-  rolling upgrade of all MDS daemons can be performed.
-
-* Dashboard: now allows users to set up and display a custom message (MOTD, warning,
-  etc.) in a sticky banner at the top of the page. For more details, see:
-  https://docs.ceph.com/en/pacific/mgr/dashboard/#message-of-the-day-motd
-
-* Several fixes in BlueStore, including a fix for the deferred write regression,
-  which led to excessive RocksDB flushes and compactions. Previously, when
-  `bluestore_prefer_deferred_size_hdd` was equal to or more than
-  `bluestore_max_blob_size_hdd` (both set to 64K), all the data was deferred,
-  which led to increased consumption of the column family used to store
-  deferred writes in RocksDB. Now, the `bluestore_prefer_deferred_size` parameter
-  independently controls deferred writes, and only writes smaller than
-  this size use the deferred write path.
-
-* The default value of `osd_client_message_cap` has been set to 256, to provide
-  better flow control by limiting maximum number of in-flight client requests.
-
-* PGs no longer show a `active+clean+scrubbing+deep+repair` state when
-  `osd_scrub_auto_repair` is set to true, for regular deep-scrubs with no repair
-  required.
-
-* `ceph-mgr-modules-core` debian package does not recommend `ceph-mgr-rook`
-  anymore. As the latter depends on `python3-numpy` which cannot be imported in
-  different Python sub-interpreters multi-times if the version of
-  `python3-numpy` is older than 1.19. Since `apt-get` installs the `Recommends`
-  packages by default, `ceph-mgr-rook` was always installed along with
-  `ceph-mgr` debian package as an indirect dependency. If your workflow depends
-  on this behavior, you might want to install `ceph-mgr-rook` separately.
-  
- * This is the first release built for Debian Bullseye.
-
-Changelog
----------
-
-* bind on loopback address if no other addresses are available (`pr#42477 <https://github.com/ceph/ceph/pull/42477>`_, Kefu Chai)
-* ceph-monstore-tool: use a large enough paxos/{first,last}_committed (`issue#38219 <http://tracker.ceph.com/issues/38219>`_, `pr#42411 <https://github.com/ceph/ceph/pull/42411>`_, Kefu Chai)
-* ceph-volume/tests: retry when destroying osd (`pr#42546 <https://github.com/ceph/ceph/pull/42546>`_, Guillaume Abrioux)
-* ceph-volume/tests: update ansible environment variables in tox (`pr#42490 <https://github.com/ceph/ceph/pull/42490>`_, Dimitri Savineau)
-* ceph-volume: Consider /dev/root as mounted (`pr#42755 <https://github.com/ceph/ceph/pull/42755>`_, David Caro)
-* ceph-volume: fix lvm activate arguments (`pr#43116 <https://github.com/ceph/ceph/pull/43116>`_, Dimitri Savineau)
-* ceph-volume: fix lvm migrate without args (`pr#43110 <https://github.com/ceph/ceph/pull/43110>`_, Dimitri Savineau)
-* ceph-volume: fix raw list with logical partition (`pr#43087 <https://github.com/ceph/ceph/pull/43087>`_, Guillaume Abrioux, Dimitri Savineau)
-* ceph-volume: implement bluefs volume migration (`pr#42219 <https://github.com/ceph/ceph/pull/42219>`_, Kefu Chai, Igor Fedotov)
-* ceph-volume: lvm batch: fast_allocations(): avoid ZeroDivisionError (`pr#42493 <https://github.com/ceph/ceph/pull/42493>`_, Jonas Zeiger)
-* ceph-volume: pvs --noheadings replace pvs --no-heading (`pr#43076 <https://github.com/ceph/ceph/pull/43076>`_, FengJiankui)
-* ceph-volume: remove --all ref from deactivate help (`pr#43098 <https://github.com/ceph/ceph/pull/43098>`_, Dimitri Savineau)
-* ceph-volume: support no_systemd with lvm migrate (`pr#43091 <https://github.com/ceph/ceph/pull/43091>`_, Dimitri Savineau)
-* ceph-volume: work around phantom atari partitions (`pr#42753 <https://github.com/ceph/ceph/pull/42753>`_, Blaine Gardner)
-* ceph.spec.in: drop gdbm from build deps (`pr#43000 <https://github.com/ceph/ceph/pull/43000>`_, Kefu Chai)
-* cephadm: August batch 1 (`pr#42736 <https://github.com/ceph/ceph/pull/42736>`_, Sage Weil, Dimitri Savineau, Guillaume Abrioux, Sebastian Wagner, Varsha Rao, Zac Dover, Adam King, Cory Snyder, Michael Fritch, Asbjørn Sannes, "Wang,Fei", Javier Cacheiro, 胡玮文, Daniel Pivonka)
-* cephadm: September batch 1 (`issue#52038 <http://tracker.ceph.com/issues/52038>`_, `pr#43029 <https://github.com/ceph/ceph/pull/43029>`_, Sebastian Wagner, Dimitri Savineau, Paul Cuzner, Oleander Reis, Adam King, Yuxiang Zhu, Zac Dover, Alfonso Martínez, Sage Weil, Daniel Pivonka)
-* cephadm: use quay, not docker (`pr#42534 <https://github.com/ceph/ceph/pull/42534>`_, Sage Weil)
-* cephfs-mirror: record directory path cancel in DirRegistry (`issue#51666 <http://tracker.ceph.com/issues/51666>`_, `pr#42458 <https://github.com/ceph/ceph/pull/42458>`_, Venky Shankar)
-* client: flush the mdlog in unsafe requests' relevant and auth MDSes only (`pr#42925 <https://github.com/ceph/ceph/pull/42925>`_, Xiubo Li)
-* client: make sure only to update dir dist from auth mds (`pr#42937 <https://github.com/ceph/ceph/pull/42937>`_, Xue Yantao)
-* cls/cmpomap: empty values are 0 in U64 comparisons (`pr#42908 <https://github.com/ceph/ceph/pull/42908>`_, Casey Bodley)
-* cmake, ceph.spec.in: build with header only fmt on RHEL (`pr#42472 <https://github.com/ceph/ceph/pull/42472>`_, Kefu Chai)
-* cmake: build static libs if they are internal ones (`pr#39902 <https://github.com/ceph/ceph/pull/39902>`_, Kefu Chai)
-* cmake: exclude "grafonnet-lib" target from "all" (`pr#42898 <https://github.com/ceph/ceph/pull/42898>`_, Kefu Chai)
-* cmake: link bundled fmt statically (`pr#42692 <https://github.com/ceph/ceph/pull/42692>`_, Kefu Chai)
-* cmake: Replace boost download url (`pr#42693 <https://github.com/ceph/ceph/pull/42693>`_, Rafał Wądołowski)
-* common/buffer: fix SIGABRT in  rebuild_aligned_size_and_memory (`pr#42976 <https://github.com/ceph/ceph/pull/42976>`_, Yin Congmin)
-* common/Formatter: include used header (`pr#42233 <https://github.com/ceph/ceph/pull/42233>`_, Kefu Chai)
-* common/options: Set osd_client_message_cap to 256 (`pr#42615 <https://github.com/ceph/ceph/pull/42615>`_, Mark Nelson)
-* compression/snappy: use uint32_t to be compatible with 1.1.9 (`pr#42542 <https://github.com/ceph/ceph/pull/42542>`_, Kefu Chai, Nathan Cutler)
-* debian/control: ceph-mgr-modules-core does not Recommend ceph-mgr-roo… (`pr#42300 <https://github.com/ceph/ceph/pull/42300>`_, Kefu Chai)
-* debian/control: dh-systemd is part of debhelper now (`pr#43151 <https://github.com/ceph/ceph/pull/43151>`_, David Galloway)
-* debian/control: remove cython from Build-Depends (`pr#43131 <https://github.com/ceph/ceph/pull/43131>`_, Kefu Chai)
-* doc/ceph-volume: add lvm migrate/new-db/new-wal (`pr#43089 <https://github.com/ceph/ceph/pull/43089>`_, Dimitri Savineau)
-* doc/rados/operations: s/max_misplaced/target_max_misplaced_ratio/ (`pr#42250 <https://github.com/ceph/ceph/pull/42250>`_, Paul Reece, Kefu Chai)
-* doc/releases/pacific.rst: remove notes about autoscaler (`pr#42265 <https://github.com/ceph/ceph/pull/42265>`_, Neha Ojha)
-* Don't persist report data (`pr#42888 <https://github.com/ceph/ceph/pull/42888>`_, Brad Hubbard)
-* krbd: escape udev_enumerate_add_match_sysattr values (`pr#42969 <https://github.com/ceph/ceph/pull/42969>`_, Ilya Dryomov)
-* kv/RocksDBStore: Add handling of block_cache option for resharding (`pr#42844 <https://github.com/ceph/ceph/pull/42844>`_, Adam Kupczyk)
-* kv/RocksDBStore: enrich debug message (`pr#42544 <https://github.com/ceph/ceph/pull/42544>`_, Toshikuni Fukaya, Satoru Takeuchi)
-* librgw/notifications: initialize kafka and amqp (`pr#42648 <https://github.com/ceph/ceph/pull/42648>`_, Yuval Lifshitz)
-* mds: add debugging when rejecting mksnap with EPERM (`pr#42935 <https://github.com/ceph/ceph/pull/42935>`_, Patrick Donnelly)
-* mds: create file system with specific ID (`pr#42900 <https://github.com/ceph/ceph/pull/42900>`_, Ramana Raja)
-* mds: MDCache.cc:5319 FAILED ceph_assert(rejoin_ack_gather.count(mds->get_nodeid())) (`pr#42938 <https://github.com/ceph/ceph/pull/42938>`_, chencan)
-* mds: META_POP_READDIR, META_POP_FETCH, META_POP_STORE, and cache_hit_rate are not updated (`pr#42939 <https://github.com/ceph/ceph/pull/42939>`_, Yongseok Oh)
-* mds: to print the unknow type value (`pr#42088 <https://github.com/ceph/ceph/pull/42088>`_, Xiubo Li, Jos Collin)
-* MDSMonitor: monitor crash after upgrade from ceph 15.2.13 to 16.2.4 (`pr#42536 <https://github.com/ceph/ceph/pull/42536>`_, Patrick Donnelly)
-* mgr/DaemonServer: skip redundant update of pgp_num_actual (`pr#42223 <https://github.com/ceph/ceph/pull/42223>`_, Dan van der Ster)
-* mgr/dashboard/api: set a UTF-8 locale when running pip (`pr#42829 <https://github.com/ceph/ceph/pull/42829>`_, Kefu Chai)
-* mgr/dashboard: Add configurable MOTD or wall notification (`pr#42414 <https://github.com/ceph/ceph/pull/42414>`_, Volker Theile)
-* mgr/dashboard: cephadm e2e start script: add --expanded option (`pr#42789 <https://github.com/ceph/ceph/pull/42789>`_, Alfonso Martínez)
-* mgr/dashboard: cephadm-e2e job script: improvements (`pr#42585 <https://github.com/ceph/ceph/pull/42585>`_, Alfonso Martínez)
-* mgr/dashboard: disable create snapshot with subvolumes (`pr#42819 <https://github.com/ceph/ceph/pull/42819>`_, Pere Diaz Bou)
-* mgr/dashboard: don't notify for suppressed alerts (`pr#42974 <https://github.com/ceph/ceph/pull/42974>`_, Tatjana Dehler)
-* mgr/dashboard: fix Accept-Language header parsing (`pr#42297 <https://github.com/ceph/ceph/pull/42297>`_, 胡玮文)
-* mgr/dashboard: fix rename inventory to disks (`pr#42810 <https://github.com/ceph/ceph/pull/42810>`_, Navin Barnwal)
-* mgr/dashboard: fix ssl cert validation for rgw service creation (`pr#42628 <https://github.com/ceph/ceph/pull/42628>`_, Avan Thakkar)
-* mgr/dashboard: Fix test_error force maintenance dashboard check (`pr#42354 <https://github.com/ceph/ceph/pull/42354>`_, Nizamudeen A)
-* mgr/dashboard: monitoring: replace Grafana JSON with Grafonnet based code (`pr#42812 <https://github.com/ceph/ceph/pull/42812>`_, Aashish Sharma)
-* mgr/dashboard: Refresh button on the iscsi targets page (`pr#42817 <https://github.com/ceph/ceph/pull/42817>`_, Nizamudeen A)
-* mgr/dashboard: remove usage of 'rgw_frontend_ssl_key' (`pr#42316 <https://github.com/ceph/ceph/pull/42316>`_, Avan Thakkar)
-* mgr/dashboard: show perf. counters for rgw svc. on Cluster > Hosts (`pr#42629 <https://github.com/ceph/ceph/pull/42629>`_, Alfonso Martínez)
-* mgr/dashboard: stats=false not working when listing buckets (`pr#42889 <https://github.com/ceph/ceph/pull/42889>`_, Avan Thakkar)
-* mgr/dashboard: tox.ini: delete useless env. 'apidocs' (`pr#42788 <https://github.com/ceph/ceph/pull/42788>`_, Alfonso Martínez)
-* mgr/dashboard: update translations for pacific (`pr#42606 <https://github.com/ceph/ceph/pull/42606>`_, Tatjana Dehler)
-* mgr/mgr_util: switch using unshared cephfs connections whenever possible (`issue#51256 <http://tracker.ceph.com/issues/51256>`_, `pr#42083 <https://github.com/ceph/ceph/pull/42083>`_, Venky Shankar)
-* mgr/pg_autoscaler: Introduce autoscaler scale-down feature (`pr#42428 <https://github.com/ceph/ceph/pull/42428>`_, Kamoltat, Kefu Chai)
-* mgr/rook: Add timezone info (`pr#39834 <https://github.com/ceph/ceph/pull/39834>`_, Varsha Rao, Sebastian Wagner)
-* mgr/telemetry: pass leaderboard flag even w/o ident (`pr#42228 <https://github.com/ceph/ceph/pull/42228>`_, Sage Weil)
-* mgr/volumes: Add config to insert delay at the beginning of the clone (`pr#42086 <https://github.com/ceph/ceph/pull/42086>`_, Kotresh HR)
-* mgr/volumes: use dedicated libcephfs handles for subvolume calls and … (`issue#51271 <http://tracker.ceph.com/issues/51271>`_, `pr#42914 <https://github.com/ceph/ceph/pull/42914>`_, Venky Shankar)
-* mgr: set debug_mgr=2/5 (so INFO goes to mgr log by default) (`pr#42225 <https://github.com/ceph/ceph/pull/42225>`_, Sage Weil)
-* mon/MDSMonitor: do not pointlessly kill standbys that are incompatible with current CompatSet (`pr#42578 <https://github.com/ceph/ceph/pull/42578>`_, Patrick Donnelly, Zhi Zhang)
-* mon/OSDMonitor: resize oversized Lec::epoch_by_pg, after PG merging, preventing osdmap trimming (`pr#42224 <https://github.com/ceph/ceph/pull/42224>`_, Dan van der Ster)
-* mon/PGMap: remove DIRTY field in ceph df detail when cache tiering is not in use (`pr#42860 <https://github.com/ceph/ceph/pull/42860>`_, Deepika Upadhyay)
-* mon: return -EINVAL when handling unknown option in 'ceph osd pool get' (`pr#42229 <https://github.com/ceph/ceph/pull/42229>`_, Zhao Cuicui)
-* mon: Sanely set the default CRUSH rule when creating pools in stretch… (`pr#42909 <https://github.com/ceph/ceph/pull/42909>`_, Greg Farnum)
-* monitoring/grafana/build/Makefile: revamp for arm64 builds, pushes to docker and quay, jenkins (`pr#42211 <https://github.com/ceph/ceph/pull/42211>`_, Dan Mick)
-* monitoring/grafana/cluster: use per-unit max and limit values (`pr#42679 <https://github.com/ceph/ceph/pull/42679>`_, David Caro)
-* monitoring: Clean up Grafana dashboards (`pr#42299 <https://github.com/ceph/ceph/pull/42299>`_, Patrick Seidensal)
-* monitoring: fix Physical Device Latency unit (`pr#42298 <https://github.com/ceph/ceph/pull/42298>`_, Seena Fallah)
-* msg: active_connections regression (`pr#42936 <https://github.com/ceph/ceph/pull/42936>`_, Sage Weil)
-* nfs backport June (`pr#42096 <https://github.com/ceph/ceph/pull/42096>`_, Varsha Rao)
-* os/bluestore: accept undecodable multi-block bluefs transactions on log (`pr#43023 <https://github.com/ceph/ceph/pull/43023>`_, Igor Fedotov)
-* os/bluestore: cap omap naming scheme upgrade transaction (`pr#42956 <https://github.com/ceph/ceph/pull/42956>`_, Igor Fedotov)
-* os/bluestore: compact db after bulk omap naming upgrade (`pr#42426 <https://github.com/ceph/ceph/pull/42426>`_, Igor Fedotov)
-* os/bluestore: fix bluefs migrate command (`pr#43100 <https://github.com/ceph/ceph/pull/43100>`_, Igor Fedotov)
-* os/bluestore: fix erroneous SharedBlob record removal during repair (`pr#42423 <https://github.com/ceph/ceph/pull/42423>`_, Igor Fedotov)
-* os/bluestore: fix using incomplete bluefs log when dumping it (`pr#43007 <https://github.com/ceph/ceph/pull/43007>`_, Igor Fedotov)
-* os/bluestore: make deferred writes less aggressive for large writes (`pr#42773 <https://github.com/ceph/ceph/pull/42773>`_, Igor Fedotov, Adam Kupczyk)
-* os/bluestore: Remove possibility of replay log and file inconsistency (`pr#42424 <https://github.com/ceph/ceph/pull/42424>`_, Adam Kupczyk)
-* os/bluestore: respect bluestore_warn_on_spurious_read_errors setting (`pr#42897 <https://github.com/ceph/ceph/pull/42897>`_, Igor Fedotov)
-* osd/scrub: separate between PG state flags and internal scrubber operation (`pr#42398 <https://github.com/ceph/ceph/pull/42398>`_, Ronen Friedman)
-* osd: log snaptrim message to dout (`pr#42482 <https://github.com/ceph/ceph/pull/42482>`_, Arthur Outhenin-Chalandre)
-* osd: move down peers out from peer_purged (`pr#42238 <https://github.com/ceph/ceph/pull/42238>`_, Mykola Golub)
-* pybind/mgr/stats: validate cmdtag (`pr#42702 <https://github.com/ceph/ceph/pull/42702>`_, Jos Collin)
-* pybind/mgr: Fix IPv6 url generation (`pr#42990 <https://github.com/ceph/ceph/pull/42990>`_, Sebastian Wagner)
-* pybind/rbd: fix mirror_image_get_status (`pr#42972 <https://github.com/ceph/ceph/pull/42972>`_, Ilya Dryomov, Will Smith)
-* qa/\*/test_envlibrados_for_rocksdb.sh: install libarchive-3.3.3 (`pr#42344 <https://github.com/ceph/ceph/pull/42344>`_, Neha Ojha)
-* qa/cephadm: centos_8.x_container_tools_3.0.yaml (`pr#42868 <https://github.com/ceph/ceph/pull/42868>`_, Sebastian Wagner)
-* qa/rgw: move ignore-pg-availability.yaml out of suites/rgw (`pr#40694 <https://github.com/ceph/ceph/pull/40694>`_, Casey Bodley)
-* qa/standalone: Add missing cleanups after completion of a subset of osd and scrub tests (`pr#42258 <https://github.com/ceph/ceph/pull/42258>`_, Sridhar Seshasayee)
-* qa/tests: advanced pacific version to reflect the latest 16.2.5 point (`pr#42264 <https://github.com/ceph/ceph/pull/42264>`_, Yuri Weinstein)
-* qa/workunits/mon/test_mon_config_key: use subprocess.run() instead of proc.communicate() (`pr#42221 <https://github.com/ceph/ceph/pull/42221>`_, Kefu Chai)
-* qa: FileNotFoundError: [Errno 2] No such file or directory: '/sys/kernel/debug/ceph/3fab6bea-f243-47a4-a956-8c03a62b61b5.client4721/mds_sessions' (`pr#42165 <https://github.com/ceph/ceph/pull/42165>`_, Patrick Donnelly)
-* qa: increase the pg_num for cephfs_data/metadata pools (`pr#42923 <https://github.com/ceph/ceph/pull/42923>`_, Xiubo Li)
-* qa: test_ls_H_prints_human_readable_file_size failure (`pr#42166 <https://github.com/ceph/ceph/pull/42166>`_, Patrick Donnelly)
-* radosgw-admin: skip GC init on read-only admin ops (`pr#42655 <https://github.com/ceph/ceph/pull/42655>`_, Mark Kogan)
-* radosgw: include realm\_{id,name} in service map (`pr#42213 <https://github.com/ceph/ceph/pull/42213>`_, Sage Weil)
-* rbd-mirror: add perf counters to snapshot replayer (`pr#42987 <https://github.com/ceph/ceph/pull/42987>`_, Arthur Outhenin-Chalandre)
-* rbd-mirror: fix potential async op tracker leak in start_image_replayers (`pr#42979 <https://github.com/ceph/ceph/pull/42979>`_, Mykola Golub)
-* rbd: fix default pool handling for nbd map/unmap (`pr#42980 <https://github.com/ceph/ceph/pull/42980>`_, Sunny Kumar)
-* Remove dependency on lsb_release (`pr#43001 <https://github.com/ceph/ceph/pull/43001>`_, Ken Dreyer)
-* RGW - Bucket Remove Op: Pass in user (`pr#42135 <https://github.com/ceph/ceph/pull/42135>`_, Daniel Gryniewicz)
-* RGW - Don't move attrs before setting them (`pr#42320 <https://github.com/ceph/ceph/pull/42320>`_, Daniel Gryniewicz)
-* rgw : add check empty for sync url (`pr#42653 <https://github.com/ceph/ceph/pull/42653>`_, caolei)
-* rgw : add check for tenant provided in RGWCreateRole (`pr#42637 <https://github.com/ceph/ceph/pull/42637>`_, caolei)
-* rgw : modfiy error XML for deleterole (`pr#42639 <https://github.com/ceph/ceph/pull/42639>`_, caolei)
-* rgw multisite: metadata sync treats all errors as 'transient' for retry (`pr#42656 <https://github.com/ceph/ceph/pull/42656>`_, Casey Bodley)
-* RGW Zipper - Make sure bucket list progresses (`pr#42625 <https://github.com/ceph/ceph/pull/42625>`_, Daniel Gryniewicz)
-* rgw/amqp/test: fix mock prototype for librabbitmq-0.11.0 (`pr#42649 <https://github.com/ceph/ceph/pull/42649>`_, Yuval Lifshitz)
-* rgw/http/notifications: support content type in HTTP POST messages (`pr#42644 <https://github.com/ceph/ceph/pull/42644>`_, Yuval Lifshitz)
-* rgw/multisite: return correct error code when op fails (`pr#42646 <https://github.com/ceph/ceph/pull/42646>`_, Yuval Lifshitz)
-* rgw/notification: add exception handling for persistent notification thread (`pr#42647 <https://github.com/ceph/ceph/pull/42647>`_, Yuval Lifshitz)
-* rgw/notification: fix persistent notification hang when ack-levl=none (`pr#40696 <https://github.com/ceph/ceph/pull/40696>`_, Yuval Lifshitz)
-* rgw/notification: fixing the "persistent=false" flag (`pr#40695 <https://github.com/ceph/ceph/pull/40695>`_, Yuval Lifshitz)
-* rgw/notifications: delete bucket notification object when empty (`pr#42631 <https://github.com/ceph/ceph/pull/42631>`_, Yuval Lifshitz)
-* rgw/notifications: support metadata filter in CompleteMultipartUpload and Copy events (`pr#42321 <https://github.com/ceph/ceph/pull/42321>`_, Yuval Lifshitz)
-* rgw/notifications: support metadata filter in CompleteMultipartUploa… (`pr#42566 <https://github.com/ceph/ceph/pull/42566>`_, Yuval Lifshitz)
-* rgw/rgw_file: Fix the return value of read() and readlink() (`pr#42654 <https://github.com/ceph/ceph/pull/42654>`_, Dai zhiwei, luo rixin)
-* rgw/sts: correcting the evaluation of session policies (`pr#42632 <https://github.com/ceph/ceph/pull/42632>`_, Pritha Srivastava)
-* rgw/sts: read_obj_policy() consults iam_user_policies on ENOENT (`pr#42650 <https://github.com/ceph/ceph/pull/42650>`_, Casey Bodley)
-* rgw: allow rgw-orphan-list to process multiple data pools (`pr#42635 <https://github.com/ceph/ceph/pull/42635>`_, J. Eric Ivancich)
-* rgw: allow to set ssl options and ciphers for beast frontend (`pr#42363 <https://github.com/ceph/ceph/pull/42363>`_, Mykola Golub)
-* rgw: avoid infinite loop when deleting a bucket (`issue#49206 <http://tracker.ceph.com/issues/49206>`_, `pr#42230 <https://github.com/ceph/ceph/pull/42230>`_, Jeegn Chen)
-* rgw: avoid occuring radosgw daemon crash when access a conditionally … (`pr#42626 <https://github.com/ceph/ceph/pull/42626>`_, xiangrui meng, yupeng chen)
-* rgw: Backport of 51674 to Pacific (`pr#42346 <https://github.com/ceph/ceph/pull/42346>`_, Adam C. Emerson)
-* rgw: deprecate the civetweb frontend (`pr#41367 <https://github.com/ceph/ceph/pull/41367>`_, Casey Bodley)
-* rgw: Don't segfault on datalog trim (`pr#42336 <https://github.com/ceph/ceph/pull/42336>`_, Adam C. Emerson)
-* rgw: during reshard lock contention, adjust logging (`pr#42641 <https://github.com/ceph/ceph/pull/42641>`_, J. Eric Ivancich)
-* rgw: extending existing ssl support for vault KMS (`pr#42093 <https://github.com/ceph/ceph/pull/42093>`_, Jiffin Tony Thottan)
-* rgw: fail as expected when set/delete-bucket-website attempted on a non-exis… (`pr#42642 <https://github.com/ceph/ceph/pull/42642>`_, xiangrui meng)
-* rgw: fix bucket object listing when marker matches prefix (`pr#42638 <https://github.com/ceph/ceph/pull/42638>`_, J. Eric Ivancich)
-* rgw: fix for mfa resync crash when supplied with only one totp_pin (`pr#42652 <https://github.com/ceph/ceph/pull/42652>`_, Pritha Srivastava)
-* rgw: fix segfault related to explicit object manifest handling (`pr#42633 <https://github.com/ceph/ceph/pull/42633>`_, Mark Kogan)
-* rgw: Improve error message on email id reuse (`pr#41783 <https://github.com/ceph/ceph/pull/41783>`_, Ponnuvel Palaniyappan)
-* rgw: objectlock: improve client error messages (`pr#40693 <https://github.com/ceph/ceph/pull/40693>`_, Matt Benjamin)
-* rgw: parse tenant name out of rgwx-bucket-instance (`pr#42231 <https://github.com/ceph/ceph/pull/42231>`_, Casey Bodley)
-* rgw: radosgw-admin errors if marker not specified on data/mdlog trim (`pr#42640 <https://github.com/ceph/ceph/pull/42640>`_, Adam C. Emerson)
-* rgw: remove quota soft threshold (`pr#42634 <https://github.com/ceph/ceph/pull/42634>`_, Zulai Wang)
-* rgw: require bucket name in bucket chown (`pr#42323 <https://github.com/ceph/ceph/pull/42323>`_, Zulai Wang)
-* rgw: when deleted obj removed in versioned bucket, extra del-marker added (`pr#42645 <https://github.com/ceph/ceph/pull/42645>`_, J. Eric Ivancich)
-* rpm/luarocks: simplify conditional and support Leap 15.3 (`pr#42561 <https://github.com/ceph/ceph/pull/42561>`_, Nathan Cutler)
-* rpm: drop use of $FIRST_ARG in ceph-immutable-object-cache (`pr#42480 <https://github.com/ceph/ceph/pull/42480>`_, Nathan Cutler)
-* run-make-check.sh: Increase failure output log size (`pr#42850 <https://github.com/ceph/ceph/pull/42850>`_, David Galloway)
-* SimpleRADOSStriper: use debug_cephsqlite (`pr#42659 <https://github.com/ceph/ceph/pull/42659>`_, Patrick Donnelly)
-* src/pybind/mgr/mirroring/fs/snapshot_mirror.py: do not assume a cephf… (`pr#42226 <https://github.com/ceph/ceph/pull/42226>`_, Sébastien Han)
-* test/rgw: fix use of poll() with timers in unittest_rgw_dmclock_scheduler (`pr#42651 <https://github.com/ceph/ceph/pull/42651>`_, Casey Bodley)
-* Warning Cleanup and Clang Compile Fix (`pr#40692 <https://github.com/ceph/ceph/pull/40692>`_, Adam C. Emerson)
-* workunits/rgw: semicolon terminates perl statements (`pr#43168 <https://github.com/ceph/ceph/pull/43168>`_, Matt Benjamin)
-
-v16.2.5 Pacific
-===============
-
-This is the fifth backport release in the Pacific series. We recommend all
-users update to this release.
-
-Notable Changes
----------------
-
-* `ceph-mgr-modules-core` debian package does not recommend `ceph-mgr-rook`
-  anymore. As the latter depends on `python3-numpy` which cannot be imported in
-  different Python sub-interpreters multi-times if the version of
-  `python3-numpy` is older than 1.19. Since `apt-get` installs the `Recommends`
-  packages by default, `ceph-mgr-rook` was always installed along with
-  `ceph-mgr` debian package as an indirect dependency. If your workflow depends
-  on this behavior, you might want to install `ceph-mgr-rook` separately.
-
-* mgr/nfs: ``nfs`` module is moved out of volumes plugin. Prior using the
-  ``ceph nfs`` commands, ``nfs`` mgr module must be enabled.
-
-* volumes/nfs: The ``cephfs`` cluster type has been removed from the
-  ``nfs cluster create`` subcommand. Clusters deployed by cephadm can
-  support an NFS export of both ``rgw`` and ``cephfs`` from a single
-  NFS cluster instance.
-
-* The ``nfs cluster update`` command has been removed.  You can modify
-  the placement of an existing NFS service (and/or its associated
-  ingress service) using ``orch ls --export`` and ``orch apply -i
-  ...``.
-
-* The ``orch apply nfs`` command no longer requires a pool or
-  namespace argument. We strongly encourage users to use the defaults
-  so that the ``nfs cluster ls`` and related commands will work
-  properly.
-
-* The ``nfs cluster delete`` and ``nfs export delete`` commands are
-  deprecated and will be removed in a future release.  Please use
-  ``nfs cluster rm`` and ``nfs export rm`` instead.
-
-* A long-standing bug that prevented 32-bit and 64-bit client/server
-  interoperability under msgr v2 has been fixed.  In particular, mixing armv7l
-  (armhf) and x86_64 or aarch64 servers in the same cluster now works.
-
-Changelog
----------
-
-* .github/labeler: add api-change label (`pr#41818 <https://github.com/ceph/ceph/pull/41818>`_, Ernesto Puerta)
-* Improve mon location handling for stretch clusters (`pr#40484 <https://github.com/ceph/ceph/pull/40484>`_, Greg Farnum)
-* MDS heartbeat timed out between during executing MDCache::start_files_to_recover() (`pr#42061 <https://github.com/ceph/ceph/pull/42061>`_, Yongseok Oh)
-* MDS slow request lookupino #0x100 on rank 1 block forever on dispatched (`pr#40856 <https://github.com/ceph/ceph/pull/40856>`_, Xiubo Li, Patrick Donnelly)
-* MDSMonitor: crash when attempting to mount cephfs (`pr#42068 <https://github.com/ceph/ceph/pull/42068>`_, Patrick Donnelly)
-* Pacific stretch mon state [Merge after 40484] (`pr#41130 <https://github.com/ceph/ceph/pull/41130>`_, Greg Farnum)
-* Pacific: Add DoutPrefixProvider for RGW Log Messages in Pacfic (`pr#40054 <https://github.com/ceph/ceph/pull/40054>`_, Ali Maredia, Kalpesh Pandya, Casey Bodley)
-* Pacific: Direct MMonJoin messages to leader, not first rank [Merge after 41130] (`pr#41131 <https://github.com/ceph/ceph/pull/41131>`_, Greg Farnum)
-* Revert "pacific: mgr/dashboard: Generate NPM dependencies manifest" (`pr#41549 <https://github.com/ceph/ceph/pull/41549>`_, Nizamudeen A)
-* Update boost url, fixing windows build (`pr#41259 <https://github.com/ceph/ceph/pull/41259>`_, Lucian Petrut)
-* bluestore: use string_view and strip trailing slash for dir listing (`pr#41755 <https://github.com/ceph/ceph/pull/41755>`_, Jonas Jelten, Kefu Chai)
-* build(deps): bump node-notifier from 8.0.0 to 8.0.1 in /src/pybind/mgr/dashboard/frontend (`pr#40813 <https://github.com/ceph/ceph/pull/40813>`_, Ernesto Puerta, dependabot[bot])
-* ceph-volume: fix batch report and respect ceph.conf config values (`pr#41714 <https://github.com/ceph/ceph/pull/41714>`_, Andrew Schoen)
-* ceph_test_rados_api_service: more retries for servicemkap (`pr#41182 <https://github.com/ceph/ceph/pull/41182>`_, Sage Weil)
-* cephadm june final batch (`pr#42117 <https://github.com/ceph/ceph/pull/42117>`_, Kefu Chai, Sage Weil, Zac Dover, Sebastian Wagner, Varsha Rao, Sandro Bonazzola, Juan Miguel Olmo Martínez)
-* cephadm: batch backport for May (2) (`pr#41219 <https://github.com/ceph/ceph/pull/41219>`_, Adam King, Sage Weil, Zac Dover, Dennis Körner, jianglong01, Avan Thakkar, Juan Miguel Olmo Martínez)
-* cephadm: june batch 1 (`pr#41684 <https://github.com/ceph/ceph/pull/41684>`_, Sage Weil, Paul Cuzner, Juan Miguel Olmo Martínez, VasishtaShastry, Zac Dover, Sebastian Wagner, Adam King, Michael Fritch, Daniel Pivonka, sunilkumarn417)
-* cephadm: june batch 2 (`pr#41815 <https://github.com/ceph/ceph/pull/41815>`_, Sebastian Wagner, Daniel Pivonka, Zac Dover, Michael Fritch)
-* cephadm: june batch 3 (`pr#41913 <https://github.com/ceph/ceph/pull/41913>`_, Zac Dover, Adam King, Michael Fritch, Patrick Donnelly, Sage Weil, Juan Miguel Olmo Martínez, jianglong01)
-* cephadm: may batch 1 (`pr#41151 <https://github.com/ceph/ceph/pull/41151>`_, Juan Miguel Olmo Martínez, Sage Weil, Zac Dover, Daniel Pivonka, Adam King, Stanislav Datskevych, jianglong01, Kefu Chai, Deepika Upadhyay, Joao Eduardo Luis)
-* cephadm: may batch 3 (`pr#41463 <https://github.com/ceph/ceph/pull/41463>`_, Sage Weil, Michael Fritch, Adam King, Patrick Seidensal, Juan Miguel Olmo Martínez, Dimitri Savineau, Zac Dover, Sebastian Wagner)
-* cephfs-mirror backports (`issue#50523 <http://tracker.ceph.com/issues/50523>`_, `issue#50035 <http://tracker.ceph.com/issues/50035>`_, `issue#50266 <http://tracker.ceph.com/issues/50266>`_, `issue#50442 <http://tracker.ceph.com/issues/50442>`_, `issue#50581 <http://tracker.ceph.com/issues/50581>`_, `issue#50229 <http://tracker.ceph.com/issues/50229>`_, `issue#49939 <http://tracker.ceph.com/issues/49939>`_, `issue#50224 <http://tracker.ceph.com/issues/50224>`_, `issue#50298 <http://tracker.ceph.com/issues/50298>`_, `pr#41475 <https://github.com/ceph/ceph/pull/41475>`_, Venky Shankar, Lucian Petrut)
-* cephfs-mirror: backports (`issue#50447 <http://tracker.ceph.com/issues/50447>`_, `issue#50867 <http://tracker.ceph.com/issues/50867>`_, `issue#51204 <http://tracker.ceph.com/issues/51204>`_, `pr#41947 <https://github.com/ceph/ceph/pull/41947>`_, Venky Shankar)
-* cephfs-mirror: reopen logs on SIGHUP (`issue#51413 <http://tracker.ceph.com/issues/51413>`_, `issue#51318 <http://tracker.ceph.com/issues/51318>`_, `pr#42097 <https://github.com/ceph/ceph/pull/42097>`_, Venky Shankar)
-* cephfs-top: self-adapt the display according the window size (`pr#41053 <https://github.com/ceph/ceph/pull/41053>`_, Xiubo Li)
-* client: Fix executeable access check for the root user (`pr#41294 <https://github.com/ceph/ceph/pull/41294>`_, Kotresh HR)
-* client: fix the opened inodes counter increasing (`pr#40685 <https://github.com/ceph/ceph/pull/40685>`_, Xiubo Li)
-* client: make Inode to inherit from RefCountedObject (`pr#41052 <https://github.com/ceph/ceph/pull/41052>`_, Xiubo Li)
-* cls/rgw: look for plain entries in non-ascii plain namespace too (`pr#41774 <https://github.com/ceph/ceph/pull/41774>`_, Mykola Golub)
-* common/buffer: adjust align before calling posix_memalign() (`pr#41249 <https://github.com/ceph/ceph/pull/41249>`_, Ilya Dryomov)
-* common/mempool: only fail tests if sharding is very bad (`pr#40566 <https://github.com/ceph/ceph/pull/40566>`_, singuliere)
-* common/options/global.yaml.in: increase default value of bluestore_cache_trim_max_skip_pinned (`pr#40918 <https://github.com/ceph/ceph/pull/40918>`_, Neha Ojha)
-* crush/crush: ensure alignof(crush_work_bucket) is 1 (`pr#41983 <https://github.com/ceph/ceph/pull/41983>`_, Kefu Chai)
-* debian,cmake,cephsqlite: hide non-public symbols (`pr#40689 <https://github.com/ceph/ceph/pull/40689>`_, Kefu Chai)
-* debian/control: ceph-mgr-modules-core does not Recommend ceph-mgr-rook (`pr#41877 <https://github.com/ceph/ceph/pull/41877>`_, Kefu Chai)
-* doc: pacific updates (`pr#42066 <https://github.com/ceph/ceph/pull/42066>`_, Patrick Donnelly)
-* librbd/cache/pwl: fix parsing of cache_type in create_image_cache_state() (`pr#41244 <https://github.com/ceph/ceph/pull/41244>`_, Ilya Dryomov)
-* librbd/mirror/snapshot: avoid UnlinkPeerRequest with a unlinked peer (`pr#41304 <https://github.com/ceph/ceph/pull/41304>`_, Arthur Outhenin-Chalandre)
-* librbd: don't stop at the first unremovable image when purging (`pr#41664 <https://github.com/ceph/ceph/pull/41664>`_, Ilya Dryomov)
-* make-dist: refuse to run if script path contains a colon (`pr#41086 <https://github.com/ceph/ceph/pull/41086>`_, Nathan Cutler)
-* mds: "FAILED ceph_assert(r == 0 || r == -2)" (`pr#42072 <https://github.com/ceph/ceph/pull/42072>`_, Xiubo Li)
-* mds: "cluster [ERR]   Error recovering journal 0x203: (2) No such file or directory" in cluster log" (`pr#42059 <https://github.com/ceph/ceph/pull/42059>`_, Xiubo Li)
-* mds: Add full caps to avoid osd full check (`pr#41691 <https://github.com/ceph/ceph/pull/41691>`_, Patrick Donnelly, Kotresh HR)
-* mds: CephFS kclient gets stuck when getattr() on a certain file (`pr#42062 <https://github.com/ceph/ceph/pull/42062>`_, "Yan, Zheng", Xiubo Li)
-* mds: Error ENOSYS: mds.a started profiler (`pr#42056 <https://github.com/ceph/ceph/pull/42056>`_, Xiubo Li)
-* mds: MDSLog::journaler pointer maybe crash with use-after-free (`pr#42060 <https://github.com/ceph/ceph/pull/42060>`_, Xiubo Li)
-* mds: avoid journaling overhead for setxattr("ceph.dir.subvolume") for no-op case (`pr#41995 <https://github.com/ceph/ceph/pull/41995>`_, Patrick Donnelly)
-* mds: do not assert when receiving a unknow metric type (`pr#41596 <https://github.com/ceph/ceph/pull/41596>`_, Patrick Donnelly, Xiubo Li)
-* mds: journal recovery thread is possibly asserting with mds_lock not locked (`pr#42058 <https://github.com/ceph/ceph/pull/42058>`_, Xiubo Li)
-* mds: mkdir on ephemerally pinned directory sometimes blocked on journal flush (`pr#42071 <https://github.com/ceph/ceph/pull/42071>`_, Xiubo Li)
-* mds: scrub error on inode 0x1 (`pr#41685 <https://github.com/ceph/ceph/pull/41685>`_, Milind Changire)
-* mds: standby-replay only trims cache when it reaches the end of the replay log (`pr#40855 <https://github.com/ceph/ceph/pull/40855>`_, Xiubo Li, Patrick Donnelly)
-* mgr/DaemonServer.cc: prevent mgr crashes caused by integer underflow that is triggered by large increases to pg_num/pgp_num (`pr#41862 <https://github.com/ceph/ceph/pull/41862>`_, Cory Snyder)
-* mgr/Dashboard: Remove erroneous elements in hosts-overview Grafana dashboard (`pr#40982 <https://github.com/ceph/ceph/pull/40982>`_, Malcolm Holmes)
-* mgr/dashboard: API Version changes do not apply to pre-defined methods (list, create etc.) (`pr#41675 <https://github.com/ceph/ceph/pull/41675>`_, Aashish Sharma)
-* mgr/dashboard: Alertmanager fails to POST alerts (`pr#41987 <https://github.com/ceph/ceph/pull/41987>`_, Avan Thakkar)
-* mgr/dashboard: Fix 500 error while exiting out of maintenance (`pr#41915 <https://github.com/ceph/ceph/pull/41915>`_, Nizamudeen A)
-* mgr/dashboard: Fix bucket name input allowing space in the value (`pr#42119 <https://github.com/ceph/ceph/pull/42119>`_, Nizamudeen A)
-* mgr/dashboard: Fix for query params resetting on change-password (`pr#41440 <https://github.com/ceph/ceph/pull/41440>`_, Nizamudeen A)
-* mgr/dashboard: Generate NPM dependencies manifest (`pr#41204 <https://github.com/ceph/ceph/pull/41204>`_, Nizamudeen A)
-* mgr/dashboard: Host Maintenance Follow ups (`pr#41056 <https://github.com/ceph/ceph/pull/41056>`_, Nizamudeen A)
-* mgr/dashboard: Include Network address and labels on Host Creation form (`pr#42027 <https://github.com/ceph/ceph/pull/42027>`_, Nizamudeen A)
-* mgr/dashboard: OSDs placement text is unreadable (`pr#41096 <https://github.com/ceph/ceph/pull/41096>`_, Aashish Sharma)
-* mgr/dashboard: RGW buckets async validator performance enhancement and name constraints (`pr#41296 <https://github.com/ceph/ceph/pull/41296>`_, Nizamudeen A)
-* mgr/dashboard: User database migration has been cut out (`pr#42140 <https://github.com/ceph/ceph/pull/42140>`_, Volker Theile)
-* mgr/dashboard: avoid data processing in crush-map component (`pr#41203 <https://github.com/ceph/ceph/pull/41203>`_, Avan Thakkar)
-* mgr/dashboard: bucket details: show lock retention period only in days (`pr#41948 <https://github.com/ceph/ceph/pull/41948>`_, Alfonso Martínez)
-* mgr/dashboard: crushmap tree doesn't display crush type other than root (`pr#42007 <https://github.com/ceph/ceph/pull/42007>`_, Kefu Chai, Avan Thakkar)
-* mgr/dashboard: disable NFSv3 support in dashboard (`pr#41200 <https://github.com/ceph/ceph/pull/41200>`_, Volker Theile)
-* mgr/dashboard: drop container image name and id from services list (`pr#41505 <https://github.com/ceph/ceph/pull/41505>`_, Avan Thakkar)
-* mgr/dashboard: fix API docs link (`pr#41507 <https://github.com/ceph/ceph/pull/41507>`_, Avan Thakkar)
-* mgr/dashboard: fix ESOCKETTIMEDOUT E2E failure (`pr#41427 <https://github.com/ceph/ceph/pull/41427>`_, Avan Thakkar)
-* mgr/dashboard: fix HAProxy (now called ingress) (`pr#41298 <https://github.com/ceph/ceph/pull/41298>`_, Avan Thakkar)
-* mgr/dashboard: fix OSD out count (`pr#42153 <https://github.com/ceph/ceph/pull/42153>`_, 胡玮文)
-* mgr/dashboard: fix OSDs Host details/overview grafana graphs (`issue#49769 <http://tracker.ceph.com/issues/49769>`_, `pr#41324 <https://github.com/ceph/ceph/pull/41324>`_, Alfonso Martínez, Michael Wodniok)
-* mgr/dashboard: fix base-href (`pr#41634 <https://github.com/ceph/ceph/pull/41634>`_, Avan Thakkar)
-* mgr/dashboard: fix base-href: revert it to previous approach (`pr#41251 <https://github.com/ceph/ceph/pull/41251>`_, Avan Thakkar)
-* mgr/dashboard: fix bucket objects and size calculations (`pr#41646 <https://github.com/ceph/ceph/pull/41646>`_, Avan Thakkar)
-* mgr/dashboard: fix bucket versioning when locking is enabled (`pr#41197 <https://github.com/ceph/ceph/pull/41197>`_, Avan Thakkar)
-* mgr/dashboard: fix for right sidebar nav icon not clickable (`pr#42008 <https://github.com/ceph/ceph/pull/42008>`_, Aaryan Porwal)
-* mgr/dashboard: fix set-ssl-certificate{,-key} commands (`pr#41170 <https://github.com/ceph/ceph/pull/41170>`_, Alfonso Martínez)
-* mgr/dashboard: fix typo: Filesystems to File Systems (`pr#42016 <https://github.com/ceph/ceph/pull/42016>`_, Navin Barnwal)
-* mgr/dashboard: ingress service creation follow-up (`pr#41428 <https://github.com/ceph/ceph/pull/41428>`_, Avan Thakkar)
-* mgr/dashboard: pass Grafana datasource in URL (`pr#41633 <https://github.com/ceph/ceph/pull/41633>`_, Ernesto Puerta)
-* mgr/dashboard: provide the service events when showing a service in the UI (`pr#41494 <https://github.com/ceph/ceph/pull/41494>`_, Aashish Sharma)
-* mgr/dashboard: run cephadm-backend e2e tests with KCLI (`pr#42156 <https://github.com/ceph/ceph/pull/42156>`_, Alfonso Martínez)
-* mgr/dashboard: set required env. variables in run-backend-api-tests.sh (`pr#41069 <https://github.com/ceph/ceph/pull/41069>`_, Alfonso Martínez)
-* mgr/dashboard: show RGW tenant user id correctly in 'NFS create export' form (`pr#41528 <https://github.com/ceph/ceph/pull/41528>`_, Alfonso Martínez)
-* mgr/dashboard: show partially deleted RBDs (`pr#41891 <https://github.com/ceph/ceph/pull/41891>`_, Tatjana Dehler)
-* mgr/dashboard: simplify object locking fields in 'Bucket Creation' form (`pr#41777 <https://github.com/ceph/ceph/pull/41777>`_, Alfonso Martínez)
-* mgr/dashboard: update frontend deps due to security vulnerabilities (`pr#41402 <https://github.com/ceph/ceph/pull/41402>`_, Alfonso Martínez)
-* mgr/dashboard:include compression stats on pool dashboard (`pr#41577 <https://github.com/ceph/ceph/pull/41577>`_, Ernesto Puerta, Paul Cuzner)
-* mgr/nfs: do not depend on cephadm.utils (`pr#41842 <https://github.com/ceph/ceph/pull/41842>`_, Sage Weil)
-* mgr/progress: ensure progress stays between [0,1] (`pr#41312 <https://github.com/ceph/ceph/pull/41312>`_, Dan van der Ster)
-* mgr/prometheus:Improve the pool metadata (`pr#40804 <https://github.com/ceph/ceph/pull/40804>`_, Paul Cuzner)
-* mgr/pybind/snap_schedule: do not fail when no fs snapshots are available (`pr#41044 <https://github.com/ceph/ceph/pull/41044>`_, Sébastien Han)
-* mgr/volumes/nfs: drop type param during cluster create (`pr#41005 <https://github.com/ceph/ceph/pull/41005>`_, Michael Fritch)
-* mon,doc: deprecate min_compat_client (`pr#41468 <https://github.com/ceph/ceph/pull/41468>`_, Patrick Donnelly)
-* mon/MonClient: reset authenticate_err in _reopen_session() (`pr#41019 <https://github.com/ceph/ceph/pull/41019>`_, Ilya Dryomov)
-* mon/MonClient: tolerate a rotating key that is slightly out of date (`pr#41450 <https://github.com/ceph/ceph/pull/41450>`_, Ilya Dryomov)
-* mon/OSDMonitor: drop stale failure_info after a grace period (`pr#41090 <https://github.com/ceph/ceph/pull/41090>`_, Kefu Chai)
-* mon/OSDMonitor: drop stale failure_info even if can_mark_down() (`pr#41982 <https://github.com/ceph/ceph/pull/41982>`_, Kefu Chai)
-* mon: load stashed map before mkfs monmap (`pr#41768 <https://github.com/ceph/ceph/pull/41768>`_, Dan van der Ster)
-* nfs backport May (`pr#41389 <https://github.com/ceph/ceph/pull/41389>`_, Varsha Rao)
-* os/FileStore: fix to handle readdir error correctly (`pr#41236 <https://github.com/ceph/ceph/pull/41236>`_, Misono Tomohiro)
-* os/bluestore: fix unexpected ENOSPC in Avl/Hybrid allocators (`pr#41655 <https://github.com/ceph/ceph/pull/41655>`_, Igor Fedotov, Neha Ojha)
-* os/bluestore: introduce multithreading sync for bluestore's repairer (`pr#41752 <https://github.com/ceph/ceph/pull/41752>`_, Igor Fedotov)
-* os/bluestore: tolerate zero length for allocators' init\_[add/rm]_free() (`pr#41753 <https://github.com/ceph/ceph/pull/41753>`_, Igor Fedotov)
-* osd/PG.cc: handle removal of pgmeta object (`pr#41680 <https://github.com/ceph/ceph/pull/41680>`_, Neha Ojha)
-* osd/osd_type: use f->dump_unsigned() when appropriate (`pr#42045 <https://github.com/ceph/ceph/pull/42045>`_, Kefu Chai)
-* osd/scrub: replace a ceph_assert() with a test (`pr#41944 <https://github.com/ceph/ceph/pull/41944>`_, Ronen Friedman)
-* osd: Override recovery, backfill and sleep related config options during OSD and mclock scheduler initialization (`pr#41125 <https://github.com/ceph/ceph/pull/41125>`_, Sridhar Seshasayee, Zac Dover)
-* osd: clear data digest when write_trunc (`pr#42019 <https://github.com/ceph/ceph/pull/42019>`_, Zengran Zhang)
-* osd: compute OSD's space usage ratio via raw space utilization (`pr#41113 <https://github.com/ceph/ceph/pull/41113>`_, Igor Fedotov)
-* osd: don't assert in-flight backfill is always in recovery list (`pr#41320 <https://github.com/ceph/ceph/pull/41320>`_, Mykola Golub)
-* osd: fix scrub reschedule bug (`pr#41971 <https://github.com/ceph/ceph/pull/41971>`_, wencong wan)
-* pacific: client: abort after MDS blocklist (`issue#50530 <http://tracker.ceph.com/issues/50530>`_, `pr#42070 <https://github.com/ceph/ceph/pull/42070>`_, Venky Shankar)
-* pybind/ceph_volume_client: use cephfs mkdirs api (`pr#42159 <https://github.com/ceph/ceph/pull/42159>`_, Patrick Donnelly)
-* pybind/mgr/devicehealth: scrape-health-metrics command accidentally renamed to scrape-daemon-health-metrics (`pr#41089 <https://github.com/ceph/ceph/pull/41089>`_, Patrick Donnelly)
-* pybind/mgr/progress: Disregard unreported pgs (`pr#41872 <https://github.com/ceph/ceph/pull/41872>`_, Kamoltat)
-* pybind/mgr/snap_schedule: Invalid command: Unexpected argument 'fs=cephfs' (`pr#42064 <https://github.com/ceph/ceph/pull/42064>`_, Patrick Donnelly)
-* qa/config/rados: add dispatch delay testing params (`pr#41136 <https://github.com/ceph/ceph/pull/41136>`_, Deepika Upadhyay)
-* qa/distros/podman: preserve registries.conf (`pr#40729 <https://github.com/ceph/ceph/pull/40729>`_, Sage Weil)
-* qa/suites/rados/standalone: remove mon_election symlink (`pr#41212 <https://github.com/ceph/ceph/pull/41212>`_, Neha Ojha)
-* qa/suites/rados: add simultaneous scrubs to the thrasher (`pr#42120 <https://github.com/ceph/ceph/pull/42120>`_, Ronen Friedman)
-* qa/tasks/qemu: precise repos have been archived (`pr#41643 <https://github.com/ceph/ceph/pull/41643>`_, Ilya Dryomov)
-* qa/tests: corrected point versions to reflect latest releases (`pr#41313 <https://github.com/ceph/ceph/pull/41313>`_, Yuri Weinstein)
-* qa/tests: initial checkin for pacific-p2p suite (2) (`pr#41208 <https://github.com/ceph/ceph/pull/41208>`_, Yuri Weinstein)
-* qa/tests: replaced ubuntu_latest.yaml with ubuntu 20.04 (`pr#41460 <https://github.com/ceph/ceph/pull/41460>`_, Patrick Donnelly, Kefu Chai)
-* qa/upgrade: conditionally disable update_features tests (`pr#41629 <https://github.com/ceph/ceph/pull/41629>`_, Deepika)
-* qa/workunits/rbd: use bionic version of qemu-iotests for focal (`pr#41195 <https://github.com/ceph/ceph/pull/41195>`_, Ilya Dryomov)
-* qa: AttributeError: 'RemoteProcess' object has no attribute 'split' (`pr#41811 <https://github.com/ceph/ceph/pull/41811>`_, Patrick Donnelly)
-* qa: add async dirops testing (`pr#41823 <https://github.com/ceph/ceph/pull/41823>`_, Patrick Donnelly)
-* qa: check mounts attribute in ctx (`pr#40634 <https://github.com/ceph/ceph/pull/40634>`_, Jos Collin)
-* qa: convert some legacy Filesystem.rados calls (`pr#40996 <https://github.com/ceph/ceph/pull/40996>`_, Patrick Donnelly)
-* qa: drop the distro~HEAD directory from the fs suite (`pr#41169 <https://github.com/ceph/ceph/pull/41169>`_, Radoslaw Zarzynski)
-* qa: fs:bugs does not specify distro (`pr#42063 <https://github.com/ceph/ceph/pull/42063>`_, Patrick Donnelly)
-* qa: fs:upgrade uses teuthology default distro (`pr#42067 <https://github.com/ceph/ceph/pull/42067>`_, Patrick Donnelly)
-* qa: scrub code does not join scrubopts with comma (`pr#42065 <https://github.com/ceph/ceph/pull/42065>`_, Kefu Chai, Patrick Donnelly)
-* qa: test_data_scan.TestDataScan.test_pg_files AssertionError: Items in the second set but not the first (`pr#42069 <https://github.com/ceph/ceph/pull/42069>`_, Xiubo Li)
-* qa: test_ephemeral_pin_distribution failure (`pr#41659 <https://github.com/ceph/ceph/pull/41659>`_, Patrick Donnelly)
-* qa: update RHEL to 8.4 (`pr#41822 <https://github.com/ceph/ceph/pull/41822>`_, Patrick Donnelly)
-* rbd-mirror: fix segfault in snapshot replayer shutdown (`pr#41503 <https://github.com/ceph/ceph/pull/41503>`_, Arthur Outhenin-Chalandre)
-* rbd: --source-spec-file should be --source-spec-path (`pr#41122 <https://github.com/ceph/ceph/pull/41122>`_, Ilya Dryomov)
-* rbd: don't attempt to interpret image cache state json (`pr#41281 <https://github.com/ceph/ceph/pull/41281>`_, Ilya Dryomov)
-* rgw: Simplify log shard probing and err on the side of omap (`pr#41576 <https://github.com/ceph/ceph/pull/41576>`_, Adam C. Emerson)
-* rgw: completion of multipart upload leaves delete marker (`pr#41769 <https://github.com/ceph/ceph/pull/41769>`_, J. Eric Ivancich)
-* rgw: crash on multipart upload to bucket with policy (`pr#41893 <https://github.com/ceph/ceph/pull/41893>`_, Or Friedmann)
-* rgw: radosgw_admin remove bucket not purging past 1,000 objects (`pr#41863 <https://github.com/ceph/ceph/pull/41863>`_, J. Eric Ivancich)
-* rgw: radoslist incomplete multipart parts marker (`pr#40819 <https://github.com/ceph/ceph/pull/40819>`_, J. Eric Ivancich)
-* rocksdb: pickup fix to detect PMULL instruction (`pr#41079 <https://github.com/ceph/ceph/pull/41079>`_, Kefu Chai)
-* session dump includes completed_requests twice, once as an integer and once as a list (`pr#42057 <https://github.com/ceph/ceph/pull/42057>`_, Dan van der Ster)
-* systemd: remove `ProtectClock=true` for `ceph-osd@.service` (`pr#41232 <https://github.com/ceph/ceph/pull/41232>`_, Wong Hoi Sing Edison)
-* test/librbd: use really invalid domain (`pr#42010 <https://github.com/ceph/ceph/pull/42010>`_, Mykola Golub)
-* win32\*.sh: disable libcephsqlite when targeting Windows (`pr#40557 <https://github.com/ceph/ceph/pull/40557>`_, Lucian Petrut)
-
-
-v16.2.4 Pacific
-===============
-
-This is a hotfix release addressing a number of security issues and regressions. We recommend all users update to this release.
-
-Changelog
----------
-
-* mgr/dashboard: fix base-href: revert it to previous approach (`issue#50684 <https://tracker.ceph.com/issues/50684>`_, Avan Thakkar)
-* mgr/dashboard: fix cookie injection issue (:ref:`CVE-2021-3509`, Ernesto Puerta)
-* mgr/dashboard: fix set-ssl-certificate{,-key} commands (`issue#50519 <https://tracker.ceph.com/issues/50519>`_, Alfonso Martínez)
-* rgw: RGWSwiftWebsiteHandler::is_web_dir checks empty subdir_name (:ref:`CVE-2021-3531`, Felix Huettner)
-* rgw: sanitize \r in s3 CORSConfiguration's ExposeHeader (:ref:`CVE-2021-3524`, Sergey Bobrov, Casey Bodley)
-* systemd: remove ProtectClock=true for ceph-osd@.service (`issue#50347 <https://tracker.ceph.com/issues/50347>`_, Wong Hoi Sing Edison)
-
-v16.2.3 Pacific
-===============
-
-This is the third backport release in the Pacific series.  We recommend all users
-update to this release.
-
-Notable Changes
----------------
-
-* This release fixes a cephadm upgrade bug that caused some systems to get stuck in a loop
-  restarting the first mgr daemon.
-
-
-v16.2.2 Pacific
-===============
-
-This is the second backport release in the Pacific series. We recommend all
-users update to this release.
-
-Notable Changes
----------------
-
-* Cephadm now supports an *ingress* service type that provides load
-  balancing and HA (via haproxy and keepalived on a virtual IP) for
-  RGW service (see :ref:`orchestrator-haproxy-service-spec`).  (The experimental
-  *rgw-ha* service has been removed.)
-
-Changelog
----------
-
-* ceph-fuse: src/include/buffer.h: 1187: FAILED ceph_assert(_num <= 1024) (`pr#40628 <https://github.com/ceph/ceph/pull/40628>`_, Yanhu Cao)
-* ceph-volume: fix "device" output (`pr#41054 <https://github.com/ceph/ceph/pull/41054>`_, Sébastien Han)
-* ceph-volume: fix raw listing when finding OSDs from different clusters (`pr#40985 <https://github.com/ceph/ceph/pull/40985>`_, Sébastien Han)
-* ceph.spec.in: Enable tcmalloc on IBM Power and Z (`pr#39488 <https://github.com/ceph/ceph/pull/39488>`_, Nathan Cutler, Yaakov Selkowitz)
-* cephadm april batch 3 (`issue#49737 <http://tracker.ceph.com/issues/49737>`_, `pr#40922 <https://github.com/ceph/ceph/pull/40922>`_, Adam King, Sage Weil, Daniel Pivonka, Shreyaa Sharma, Sebastian Wagner, Juan Miguel Olmo Martínez, Zac Dover, Jeff Layton, Guillaume Abrioux, 胡玮文, Melissa Li, Nathan Cutler, Yaakov Selkowitz)
-* cephadm: april batch 1 (`pr#40544 <https://github.com/ceph/ceph/pull/40544>`_, Sage Weil, Daniel Pivonka, Joao Eduardo Luis, Adam King)
-* cephadm: april batch backport 2 (`pr#40746 <https://github.com/ceph/ceph/pull/40746>`_, Guillaume Abrioux, Sage Weil, Paul Cuzner)
-* cephadm: specify addr on bootstrap's host add (`pr#40554 <https://github.com/ceph/ceph/pull/40554>`_, Joao Eduardo Luis)
-* cephfs: minor ceph-dokan improvements (`pr#40627 <https://github.com/ceph/ceph/pull/40627>`_, Lucian Petrut)
-* client: items pinned in cache preventing unmount (`pr#40629 <https://github.com/ceph/ceph/pull/40629>`_, Xiubo Li)
-* client: only check pool permissions for regular files (`pr#40686 <https://github.com/ceph/ceph/pull/40686>`_, Xiubo Li)
-* cmake: define BOOST_ASIO_USE_TS_EXECUTOR_AS_DEFAULT globally (`pr#40706 <https://github.com/ceph/ceph/pull/40706>`_, Kefu Chai)
-* cmake: pass unparsed args to add_ceph_test() (`pr#40523 <https://github.com/ceph/ceph/pull/40523>`_, Kefu Chai)
-* cmake: use --smp 1 --memory 256M to crimson tests (`pr#40568 <https://github.com/ceph/ceph/pull/40568>`_, Kefu Chai)
-* crush/CrushLocation: do not print logging message in constructor (`pr#40679 <https://github.com/ceph/ceph/pull/40679>`_, Alex Wu)
-* doc/cephfs/nfs: add user id, fs name and key to FSAL block (`pr#40687 <https://github.com/ceph/ceph/pull/40687>`_, Varsha Rao)
-* include/librados: fix doxygen syntax for docs build (`pr#40805 <https://github.com/ceph/ceph/pull/40805>`_, Josh Durgin)
-* mds: "cluster [WRN] Scrub error on inode 0x1000000039d (/client.0/tmp/blogbench-1.0/src/blogtest_in) see mds.a log and `damage ls` output for details" (`pr#40825 <https://github.com/ceph/ceph/pull/40825>`_, Milind Changire)
-* mds: skip the buffer in UnknownPayload::decode() (`pr#40682 <https://github.com/ceph/ceph/pull/40682>`_, Xiubo Li)
-* mgr/PyModule: put mgr_module_path before Py_GetPath() (`pr#40517 <https://github.com/ceph/ceph/pull/40517>`_, Kefu Chai)
-* mgr/dashboard: Device health status is not getting listed under hosts section (`pr#40494 <https://github.com/ceph/ceph/pull/40494>`_, Aashish Sharma)
-* mgr/dashboard: Fix for alert notification message being undefined (`pr#40588 <https://github.com/ceph/ceph/pull/40588>`_, Nizamudeen A)
-* mgr/dashboard: Fix for broken User management role cloning (`pr#40398 <https://github.com/ceph/ceph/pull/40398>`_, Nizamudeen A)
-* mgr/dashboard: Improve descriptions in some parts of the dashboard (`pr#40545 <https://github.com/ceph/ceph/pull/40545>`_, Nizamudeen A)
-* mgr/dashboard: Remove username and password from request body (`pr#40981 <https://github.com/ceph/ceph/pull/40981>`_, Nizamudeen A)
-* mgr/dashboard: Remove username, password fields from Manager Modules/dashboard,influx (`pr#40489 <https://github.com/ceph/ceph/pull/40489>`_, Aashish Sharma)
-* mgr/dashboard: Revoke read-only user's access to Manager modules (`pr#40648 <https://github.com/ceph/ceph/pull/40648>`_, Nizamudeen A)
-* mgr/dashboard: Unable to login to ceph dashboard until clearing cookies manually (`pr#40586 <https://github.com/ceph/ceph/pull/40586>`_, Avan Thakkar)
-* mgr/dashboard: debug nodeenv hangs (`pr#40815 <https://github.com/ceph/ceph/pull/40815>`_, Ernesto Puerta)
-* mgr/dashboard: filesystem pool size should use stored stat (`pr#40980 <https://github.com/ceph/ceph/pull/40980>`_, Avan Thakkar)
-* mgr/dashboard: fix broken feature toggles (`pr#40474 <https://github.com/ceph/ceph/pull/40474>`_, Ernesto Puerta)
-* mgr/dashboard: fix duplicated rows when creating NFS export (`pr#40990 <https://github.com/ceph/ceph/pull/40990>`_, Alfonso Martínez)
-* mgr/dashboard: fix errors when creating NFS export (`pr#40822 <https://github.com/ceph/ceph/pull/40822>`_, Alfonso Martínez)
-* mgr/dashboard: improve telemetry opt-in reminder notification message (`pr#40887 <https://github.com/ceph/ceph/pull/40887>`_, Waad Alkhoury)
-* mgr/dashboard: test prometheus rules through promtool (`pr#40929 <https://github.com/ceph/ceph/pull/40929>`_, Aashish Sharma, Kefu Chai)
-* mon: Modifying trim logic to change paxos_service_trim_max dynamically (`pr#40691 <https://github.com/ceph/ceph/pull/40691>`_, Aishwarya Mathuria)
-* monmaptool: Don't call set_port on an invalid address (`pr#40690 <https://github.com/ceph/ceph/pull/40690>`_, Brad Hubbard, Kefu Chai)
-* os/FileStore: don't propagate split/merge error to "create"/"remove" (`pr#40989 <https://github.com/ceph/ceph/pull/40989>`_, Mykola Golub)
-* os/bluestore/BlueFS: do not _flush_range deleted files (`pr#40677 <https://github.com/ceph/ceph/pull/40677>`_, weixinwei)
-* osd/PeeringState: fix acting_set_writeable min_size check (`pr#40759 <https://github.com/ceph/ceph/pull/40759>`_, Samuel Just)
-* packaging: require ceph-common for immutable object cache daemon (`pr#40665 <https://github.com/ceph/ceph/pull/40665>`_, Ilya Dryomov)
-* pybind/mgr/volumes: deadlock on async job hangs finisher thread (`pr#40630 <https://github.com/ceph/ceph/pull/40630>`_, Kefu Chai, Patrick Donnelly)
-* qa/suites/krbd: don't require CEPHX_V2 for unmap subsuite (`pr#40826 <https://github.com/ceph/ceph/pull/40826>`_, Ilya Dryomov)
-* qa/suites/rados/cephadm: stop testing on broken focal kubic podman (`pr#40512 <https://github.com/ceph/ceph/pull/40512>`_, Sage Weil)
-* qa/tasks/ceph.conf: shorten cephx TTL for testing (`pr#40663 <https://github.com/ceph/ceph/pull/40663>`_, Sage Weil)
-* qa/tasks/cephfs: create enough subvolumes (`pr#40688 <https://github.com/ceph/ceph/pull/40688>`_, Ramana Raja)
-* qa/tasks/vstart_runner.py: start max required mgrs (`pr#40612 <https://github.com/ceph/ceph/pull/40612>`_, Alfonso Martínez)
-* qa/tasks: Add wait_for_clean() check prior to initiating scrubbing (`pr#40461 <https://github.com/ceph/ceph/pull/40461>`_, Sridhar Seshasayee)
-* qa: "AttributeError: 'NoneType' object has no attribute 'mon_manager'" (`pr#40645 <https://github.com/ceph/ceph/pull/40645>`_, Rishabh Dave)
-* qa: "log [ERR] : error reading sessionmap 'mds2_sessionmap'" (`pr#40852 <https://github.com/ceph/ceph/pull/40852>`_, Patrick Donnelly)
-* qa: fix ino_release_cb racy behavior (`pr#40683 <https://github.com/ceph/ceph/pull/40683>`_, Patrick Donnelly)
-* qa: fs:cephadm mount does not wait for mds to be created (`pr#40528 <https://github.com/ceph/ceph/pull/40528>`_, Patrick Donnelly)
-* qa: test standby_replay in workloads (`pr#40853 <https://github.com/ceph/ceph/pull/40853>`_, Patrick Donnelly)
-* rbd-mirror: fix UB while registering perf counters (`pr#40680 <https://github.com/ceph/ceph/pull/40680>`_, Arthur Outhenin-Chalandre)
-* rgw: add latency to the request summary of an op (`pr#40448 <https://github.com/ceph/ceph/pull/40448>`_, Ali Maredia)
-* rgw: Backport of datalog improvements to Pacific (`pr#40559 <https://github.com/ceph/ceph/pull/40559>`_, Yuval Lifshitz, Adam C. Emerson)
-* test: disable mgr/mirroring for `test_mirroring_init_failure_with_recovery` test (`issue#50020 <http://tracker.ceph.com/issues/50020>`_, `pr#40684 <https://github.com/ceph/ceph/pull/40684>`_, Venky Shankar)
-* tools/cephfs_mirror/PeerReplayer.cc: add missing include (`pr#40678 <https://github.com/ceph/ceph/pull/40678>`_, Duncan Bellamy)
-* vstart.sh: disable "auth_allow_insecure_global_id_reclaim" (`pr#40957 <https://github.com/ceph/ceph/pull/40957>`_, Kefu Chai)
-
-
-v16.2.1 Pacific
-===============
-
-This is the first bugfix release in the Pacific stable series.  It addresses a
-security vulnerability in the Ceph authentication framework.
-
-We recommend all Pacific users upgrade.
-
-Security fixes
---------------
-
-* This release includes a security fix that ensures the global_id
-  value (a numeric value that should be unique for every authenticated
-  client or daemon in the cluster) is reclaimed after a network
-  disconnect or ticket renewal in a secure fashion.  Two new health
-  alerts may appear during the upgrade indicating that there are
-  clients or daemons that are not yet patched with the appropriate
-  fix.
-
-  To temporarily mute the health alerts around insecure clients for the duration of the
-  upgrade, you may want to::
-
-    ceph health mute AUTH_INSECURE_GLOBAL_ID_RECLAIM 1h
-    ceph health mute AUTH_INSECURE_GLOBAL_ID_RECLAIM_ALLOWED 1h
-
-  For more information, see :ref:`CVE-2021-20288`.
-
-
-v16.2.0 Pacific
-===============
-
-This is the first stable release of Ceph Pacific.
-
-Major Changes from Octopus
---------------------------
-
-General
-~~~~~~~
-
-* Cephadm can automatically upgrade an Octopus cluster to Pacific with a single
-  command to start the process.
-* Cephadm has improved significantly over the past year, with improved
-  support for RGW (standalone and multisite), and new support for NFS
-  and iSCSI.  Most of these changes have already been backported to
-  recent Octopus point releases, but with the Pacific release we will
-  switch to backporting bug fixes only.
-* :ref:`Packages <packages>` are built for the following distributions:
-
-  - CentOS 8
-  - Ubuntu 20.04 (Focal)
-  - Ubuntu 18.04 (Bionic)
-  - Debian Buster
-  - :ref:`Container image <containers>` (based on CentOS 8)
-
-  With the exception of Debian Buster, packages and containers are
-  built for both x86_64 and aarch64 (arm64) architectures.
-
-  Note that cephadm clusters may work on many other distributions,
-  provided Python 3 and a recent version of Docker or Podman is
-  available to manage containers.  For more information, see
-  :ref:`cephadm-host-requirements`.
-
-
-Dashboard
-~~~~~~~~~
-
-The :ref:`mgr-dashboard` brings improvements in the following management areas:
-
-* Orchestrator/Cephadm:
-
-  - Host management: maintenance mode, labels.
-  - Services: display placement specification.
-  - OSD: disk replacement, display status of ongoing deletion, and improved
-    health/SMART diagnostics reporting.
-
-* Official :ref:`mgr ceph api`:
-
-  - OpenAPI v3 compliant.
-  - Stability commitment starting from Pacific release.
-  - Versioned via HTTP ``Accept`` header (starting with v1.0).
-  - Thoroughly tested (>90% coverage and per Pull Request validation).
-  - Fully documented.
-
-* RGW:
-
-  - Multi-site synchronization monitoring.
-  - Management of multiple RGW daemons and their resources (buckets and users).
-  - Bucket and user quota usage visualization.
-  - Improved configuration of S3 tenanted users.
-
-* Security (multiple enhancements and fixes resulting from a pen testing conducted by IBM):
-
-  - Account lock-out after a configurable number of failed log-in attempts.
-  - Improved cookie policies to mitigate XSS/CSRF attacks.
-  - Reviewed and improved security in HTTP headers.
-  - Sensitive information reviewed and removed from logs and error messages.
-  - TLS 1.0 and 1.1 support disabled.
-  - Debug mode when enabled triggers HEALTH_WARN.
-
-* Pools:
-
-  - Improved visualization of replication and erasure coding modes.
-  - CLAY erasure code plugin supported.
-
-* Alerts and notifications:
-
-  - Alert triggered on MTU mismatches in the cluster network.
-  - Favicon changes according cluster status.
-
-* Other:
-
-  - Landing page: improved charts and visualization.
-  - Telemetry configuration wizard.
-  - OSDs: management of individual OSD flags.
-  - RBD: per-RBD image Grafana dashboards.
-  - CephFS: Dirs and Caps displayed.
-  - NFS: v4 support only (v3 backward compatibility planned).
-  - Front-end: Angular 10 update.
-
-
-RADOS
-~~~~~
-
-* Pacific introduces :ref:`bluestore-rocksdb-sharding`, which reduces disk space requirements.
-
-* Ceph now provides QoS between client I/O and background operations via the
-  mclock scheduler.
-
-* The balancer is now on by default in upmap mode to improve distribution of
-  PGs across OSDs.
-
-* The output of ``ceph -s`` has been improved to show recovery progress in
-  one progress bar. More detailed progress bars are visible via the
-  ``ceph progress`` command.
-
-
-RBD block storage
-~~~~~~~~~~~~~~~~~
-
-* Image live-migration feature has been extended to support external data
-  sources.  Images can now be instantly imported from local files, remote
-  files served over HTTP(S) or remote S3 buckets in ``raw`` (``rbd export v1``)
-  or basic ``qcow`` and ``qcow2`` formats.  Support for ``rbd export v2``
-  format, advanced QCOW features and ``rbd export-diff`` snapshot differentials
-  is expected in future releases.
-
-* Initial support for client-side encryption has been added.  This is based
-  on LUKS and in future releases will allow using per-image encryption keys
-  while maintaining snapshot and clone functionality -- so that parent image
-  and potentially multiple clone images can be encrypted with different keys.
-
-* A new persistent write-back cache is available.  The cache operates in
-  a log-structured manner, providing full point-in-time consistency for the
-  backing image.  It should be particularly suitable for PMEM devices.
-
-* A Windows client is now available in the form of ``librbd.dll`` and
-  ``rbd-wnbd`` (Windows Network Block Device) daemon.  It allows mapping,
-  unmapping and manipulating images similar to ``rbd-nbd``.
-
-* librbd API now offers quiesce/unquiesce hooks, allowing for coordinated
-  snapshot creation.
-
-
-RGW object storage
-~~~~~~~~~~~~~~~~~~
-
-* Initial support for S3 Select. See :ref:`s3-select-feature-table` for supported queries.
-
-* Bucket notification topics can be configured as ``persistent``, where events
-  are recorded in rados for reliable delivery.
-
-* Bucket notifications can be delivered to SSL-enabled AMQP endpoints.
-
-* Lua scripts can be run during requests and access their metadata.
-
-* SSE-KMS now supports KMIP as a key management service.
-
-* Multisite data logs can now be deployed on ``cls_fifo`` to avoid large omap
-  cluster warnings and make their trimming cheaper. See ``rgw_data_log_backing``.
-
-
-CephFS distributed file system
-~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-
-* The CephFS MDS modifies on-RADOS metadata such that the new format is no
-  longer backwards compatible. It is not possible to downgrade a file system from
-  Pacific (or later) to an older release.
-
-* Multiple file systems in a single Ceph cluster is now stable. New Ceph
-  clusters enable support for multiple file systems by default. Existing clusters
-  must still set the "enable_multiple" flag on the FS. See also
-  :ref:`cephfs-multifs`.
-
-* A new ``mds_autoscaler`` ``ceph-mgr`` plugin is available for automatically
-  deploying MDS daemons in response to changes to the ``max_mds`` configuration.
-  Expect further enhancements in the future to simplify and automate MDS scaling.
-
-* ``cephfs-top`` is a new utility for looking at performance metrics from CephFS
-  clients. It is development preview quality and will have bugs. For more
-  information, see :ref:`cephfs-top`.
-
-* A new ``snap_schedule`` ``ceph-mgr`` plugin provides a command toolset for
-  scheduling snapshots on a CephFS file system. For more information, see
-  :ref:`snap-schedule`.
-
-* First class NFS gateway support in Ceph is here! It's now possible to create
-  scale-out ("active-active") NFS gateway clusters that export CephFS using
-  a few commands. The gateways are deployed via cephadm (or Rook, in the future).
-  For more information, see :ref:`mgr-nfs`.
-
-* Multiple active MDS file system scrub is now stable. It is no longer necessary
-  to set ``max_mds`` to 1 and wait for non-zero ranks to stop. Scrub commands
-  can only be sent to rank 0: ``ceph tell mds.<fs_name>:0 scrub start /path ...``.
-  For more information, see :ref:`mds-scrub`.
-
-* Ephemeral pinning -- policy based subtree pinning -- is considered stable.
-  ``mds_export_ephemeral_random`` and ``mds_export_ephemeral_distributed`` now
-  default to true. For more information, see :ref:`cephfs-ephemeral-pinning`.
-
-* A new ``cephfs-mirror`` daemon is available to mirror CephFS file systems to
-  a remote Ceph cluster. For more information, see :ref:`cephfs-mirroring`.
-
-* A Windows client is now available for connecting to CephFS. This is offered
-  through a new ``ceph-dokan`` utility which operates via the Dokan userspace
-  API, similar to FUSE. For more information, see :ref:`ceph-dokan`.
-
-
-Upgrading from Octopus or Nautilus
-----------------------------------
-
-Before starting, make sure your cluster is stable and healthy (no down or
-recovering OSDs).  (This is optional, but recommended.)
-
-
-.. note::
-  WARNING: Please do not set `bluestore_fsck_quick_fix_on_mount` to true or
-  run `ceph-bluestore-tool` repair or quick-fix commands in Pacific versions
-  <= 16.2.6, because this can lead to data corruption, details in
-  https://tracker.ceph.com/issues/53062.
-
-Upgrading cephadm clusters
-~~~~~~~~~~~~~~~~~~~~~~~~~~
-
-If your cluster is deployed with cephadm (first introduced in Octopus), then
-the upgrade process is entirely automated.  To initiate the upgrade,
-
-  .. prompt:: bash #
-
-    ceph orch upgrade start --ceph-version 16.2.0
-
-The same process is used to upgrade to future minor releases.
-
-Upgrade progress can be monitored with ``ceph -s`` (which provides a simple
-progress bar) or more verbosely with
-
-  .. prompt:: bash #
-
-    ceph -W cephadm
-
-The upgrade can be paused or resumed with
-
-  .. prompt:: bash #
-
-    ceph orch upgrade pause   # to pause
-    ceph orch upgrade resume  # to resume
-
-or canceled with
-
-  .. prompt:: bash #
-
-    ceph orch upgrade stop
-
-Note that canceling the upgrade simply stops the process; there is no ability to
-downgrade back to Octopus.
-
-.. note:
-
-   If you have deployed an RGW service on Octopus using the default port (7280), you
-   will need to redeploy it because the default port changed (to 80 or 443, depending
-   on whether SSL is enabled):
-
-   .. prompt: bash #
-
-     ceph orch apply rgw <realm>.<zone> --port 7280
-
-
-Upgrading non-cephadm clusters
-~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-
-.. note::
-   If you cluster is running Octopus (15.2.x), you might choose
-   to first convert it to use cephadm so that the upgrade to Pacific
-   is automated (see above).  For more information, see
-   :ref:`cephadm-adoption`.
-
-#. Set the ``noout`` flag for the duration of the upgrade. (Optional,
-   but recommended.)::
-
-     # ceph osd set noout
-
-#. Upgrade monitors by installing the new packages and restarting the
-   monitor daemons.  For example, on each monitor host,::
-
-     # systemctl restart ceph-mon.target
-
-   Once all monitors are up, verify that the monitor upgrade is
-   complete by looking for the ``octopus`` string in the mon
-   map.  The command::
-
-     # ceph mon dump | grep min_mon_release
-
-   should report::
-
-     min_mon_release 16 (pacific)
-
-   If it doesn't, that implies that one or more monitors hasn't been
-   upgraded and restarted and/or the quorum does not include all monitors.
-
-#. Upgrade ``ceph-mgr`` daemons by installing the new packages and
-   restarting all manager daemons.  For example, on each manager host,::
-
-     # systemctl restart ceph-mgr.target
-
-   Verify the ``ceph-mgr`` daemons are running by checking ``ceph
-   -s``::
-
-     # ceph -s
-
-     ...
-       services:
-        mon: 3 daemons, quorum foo,bar,baz
-        mgr: foo(active), standbys: bar, baz
-     ...
-
-#. Upgrade all OSDs by installing the new packages and restarting the
-   ceph-osd daemons on all OSD hosts::
-
-     # systemctl restart ceph-osd.target
-
-   Note that if you are upgrading from Nautilus, the first time each
-   OSD starts, it will do a format conversion to improve the
-   accounting for "omap" data.  This may take a few minutes to as much
-   as a few hours (for an HDD with lots of omap data).  You can
-   disable this automatic conversion with::
-
-     # ceph config set osd bluestore_fsck_quick_fix_on_mount false
-
-   You can monitor the progress of the OSD upgrades with the
-   ``ceph versions`` or ``ceph osd versions`` commands::
-
-     # ceph osd versions
-     {
-        "ceph version 14.2.5 (...) nautilus (stable)": 12,
-        "ceph version 16.2.0 (...) pacific (stable)": 22,
-     }
-
-#. Upgrade all CephFS MDS daemons. For each CephFS file system,
-
-   #. Disable standby_replay:
-
-   # ceph fs set <fs_name> allow_standby_replay false
-
-   #. Reduce the number of ranks to 1.  (Make note of the original
-      number of MDS daemons first if you plan to restore it later.)::
-
-       # ceph status
-       # ceph fs set <fs_name> max_mds 1
-
-   #. Wait for the cluster to deactivate any non-zero ranks by
-      periodically checking the status::
-
-       # ceph status
-
-   #. Take all standby MDS daemons offline on the appropriate hosts with::
-
-       # systemctl stop ceph-mds@<daemon_name>
-
-   #. Confirm that only one MDS is online and is rank 0 for your FS::
-
-       # ceph status
-
-   #. Upgrade the last remaining MDS daemon by installing the new
-      packages and restarting the daemon::
-
-        # systemctl restart ceph-mds.target
-
-   #. Restart all standby MDS daemons that were taken offline::
-
-       # systemctl start ceph-mds.target
-
-   #. Restore the original value of ``max_mds`` for the volume::
-
-       # ceph fs set <fs_name> max_mds <original_max_mds>
-
-#. Upgrade all radosgw daemons by upgrading packages and restarting
-   daemons on all hosts::
-
-     # systemctl restart ceph-radosgw.target
-
-#. Complete the upgrade by disallowing pre-Pacific OSDs and enabling
-   all new Pacific-only functionality::
-
-     # ceph osd require-osd-release pacific
-
-#. If you set ``noout`` at the beginning, be sure to clear it with::
-
-     # ceph osd unset noout
-
-#. Consider transitioning your cluster to use the cephadm deployment
-   and orchestration framework to simplify cluster management and
-   future upgrades.  For more information on converting an existing
-   cluster to cephadm, see :ref:`cephadm-adoption`.
-
-
-Post-upgrade
-~~~~~~~~~~~~
-
-#. Verify the cluster is healthy with ``ceph health``.
-
-   If your CRUSH tunables are older than Hammer, Ceph will now issue a
-   health warning.  If you see a health alert to that effect, you can
-   revert this change with::
-
-     ceph config set mon mon_crush_min_required_version firefly
-
-   If Ceph does not complain, however, then we recommend you also
-   switch any existing CRUSH buckets to straw2, which was added back
-   in the Hammer release.  If you have any 'straw' buckets, this will
-   result in a modest amount of data movement, but generally nothing
-   too severe.::
-
-     ceph osd getcrushmap -o backup-crushmap
-     ceph osd crush set-all-straw-buckets-to-straw2
-
-   If there are problems, you can easily revert with::
-
-     ceph osd setcrushmap -i backup-crushmap
-
-   Moving to 'straw2' buckets will unlock a few recent features, like
-   the `crush-compat` :ref:`balancer <balancer>` mode added back in Luminous.
-
-#. If you did not already do so when upgrading from Mimic, we
-   recommened you enable the new :ref:`v2 network protocol <msgr2>`,
-   issue the following command::
-
-     ceph mon enable-msgr2
-
-   This will instruct all monitors that bind to the old default port
-   6789 for the legacy v1 protocol to also bind to the new 3300 v2
-   protocol port.  To see if all monitors have been updated,::
-
-     ceph mon dump
-
-   and verify that each monitor has both a ``v2:`` and ``v1:`` address
-   listed.
-
-#. Consider enabling the :ref:`telemetry module <telemetry>` to send
-   anonymized usage statistics and crash information to the Ceph
-   upstream developers.  To see what would be reported (without actually
-   sending any information to anyone),::
-
-     ceph mgr module enable telemetry
-     ceph telemetry show
-
-   If you are comfortable with the data that is reported, you can opt-in to
-   automatically report the high-level cluster metadata with::
-
-     ceph telemetry on
-
-   The public dashboard that aggregates Ceph telemetry can be found at
-   `https://telemetry-public.ceph.com/ <https://telemetry-public.ceph.com/>`_.
-   For more information about the telemetry module, see :ref:`the
-   documentation <telemetry>`.
-
-
-Upgrade from pre-Nautilus releases (like Mimic or Luminous)
------------------------------------------------------------
-
-You must first upgrade to Nautilus (14.2.z) or Octopus (15.2.z) before
-upgrading to Pacific.
-
-
-Notable Changes
----------------
-
-* A new library is available, libcephsqlite. It provides a SQLite Virtual File
-  System (VFS) on top of RADOS. The database and journals are striped over
-  RADOS across multiple objects for virtually unlimited scaling and throughput
-  only limited by the SQLite client. Applications using SQLite may change to
-  the Ceph VFS with minimal changes, usually just by specifying the alternate
-  VFS. We expect the library to be most impactful and useful for applications
-  that were storing state in RADOS omap, especially without striping which
-  limits scalability.
-
-* New ``bluestore_rocksdb_options_annex`` config parameter. Complements
-  ``bluestore_rocksdb_options`` and allows setting rocksdb options without
-  repeating the existing defaults.
-
-* $pid expansion in config paths like ``admin_socket`` will now properly expand
-  to the daemon pid for commands like ``ceph-mds`` or ``ceph-osd``. Previously
-  only ``ceph-fuse``/``rbd-nbd`` expanded ``$pid`` with the actual daemon pid.
-
-* The allowable options for some ``radosgw-admin`` commands have been changed.
-
-  * ``mdlog-list``, ``datalog-list``, ``sync-error-list`` no longer accepts
-    start and end dates, but does accept a single optional start marker.
-  * ``mdlog-trim``, ``datalog-trim``, ``sync-error-trim`` only accept a
-    single marker giving the end of the trimmed range.
-  * Similarly the date ranges and marker ranges have been removed on
-    the RESTful DATALog and MDLog list and trim operations.
-
-* ceph-volume: The ``lvm batch`` subcommand received a major rewrite. This
-  closed a number of bugs and improves usability in terms of size specification
-  and calculation, as well as idempotency behaviour and disk replacement 
-  process.
-  Please refer to https://docs.ceph.com/en/latest/ceph-volume/lvm/batch/ for
-  more detailed information.
-
-* Configuration variables for permitted scrub times have changed.  The legal
-  values for ``osd_scrub_begin_hour`` and ``osd_scrub_end_hour`` are 0 - 23.
-  The use of 24 is now illegal.  Specifying ``0`` for both values causes every
-  hour to be allowed.  The legal values for ``osd_scrub_begin_week_day`` and
-  ``osd_scrub_end_week_day`` are 0 - 6.  The use of 7 is now illegal.
-  Specifying ``0`` for both values causes every day of the week to be allowed.
-
-* volume/nfs: Recently "ganesha-" prefix from cluster id and nfs-ganesha common
-  config object was removed, to ensure consistent namespace across different
-  orchestrator backends. Please delete any existing nfs-ganesha clusters prior
-  to upgrading and redeploy new clusters after upgrading to Pacific.
-
-* A new health check, DAEMON_OLD_VERSION, will warn if different versions of Ceph are running
-  on daemons. It will generate a health error if multiple versions are detected.
-  This condition must exist for over mon_warn_older_version_delay (set to 1 week by default) in order for the
-  health condition to be triggered.  This allows most upgrades to proceed
-  without falsely seeing the warning.  If upgrade is paused for an extended
-  time period, health mute can be used like this
-  "ceph health mute DAEMON_OLD_VERSION --sticky".  In this case after
-  upgrade has finished use "ceph health unmute DAEMON_OLD_VERSION".
-
-* MGR: progress module can now be turned on/off, using the commands:
-  ``ceph progress on`` and ``ceph progress off``.
-
-* An AWS-compliant API: "GetTopicAttributes" was added to replace the existing "GetTopic" API. The new API
-  should be used to fetch information about topics used for bucket notifications.
-
-* librbd: The shared, read-only parent cache's config option ``immutable_object_cache_watermark`` now has been updated
-  to property reflect the upper cache utilization before space is reclaimed. The default ``immutable_object_cache_watermark``
-  now is ``0.9``. If the capacity reaches 90% the daemon will delete cold cache.
-
-* OSD: the option ``osd_fast_shutdown_notify_mon`` has been introduced to allow
-  the OSD to notify the monitor it is shutting down even if ``osd_fast_shutdown``
-  is enabled. This helps with the monitor logs on larger clusters, that may get
-  many 'osd.X reported immediately failed by osd.Y' messages, and confuse tools.
-
-* The mclock scheduler has been refined. A set of built-in profiles are now available that
-  provide QoS between the internal and external clients of Ceph. To enable the mclock
-  scheduler, set the config option "osd_op_queue" to "mclock_scheduler". The
-  "high_client_ops" profile is enabled by default, and allocates more OSD bandwidth to
-  external client operations than to internal client operations (such as background recovery
-  and scrubs). Other built-in profiles include "high_recovery_ops" and "balanced". These
-  built-in profiles optimize the QoS provided to clients of mclock scheduler.
-
-* The balancer is now on by default in upmap mode. Since upmap mode requires
-  ``require_min_compat_client`` luminous, new clusters will only support luminous
-  and newer clients by default. Existing clusters can enable upmap support by running
-  ``ceph osd set-require-min-compat-client luminous``. It is still possible to turn
-  the balancer off using the ``ceph balancer off`` command. In earlier versions,
-  the balancer was included in the ``always_on_modules`` list, but needed to be
-  turned on explicitly using the ``ceph balancer on`` command.
-
-* Version 2 of the cephx authentication protocol (``CEPHX_V2`` feature bit) is
-  now required by default.  It was introduced in 2018, adding replay attack
-  protection for authorizers and making msgr v1 message signatures stronger
-  (CVE-2018-1128 and CVE-2018-1129).  Support is present in Jewel 10.2.11,
-  Luminous 12.2.6, Mimic 13.2.1, Nautilus 14.2.0 and later; upstream kernels
-  4.9.150, 4.14.86, 4.19 and later; various distribution kernels, in particular
-  CentOS 7.6 and later.  To enable older clients, set ``cephx_require_version``
-  and ``cephx_service_require_version`` config options to 1.
-
-* `blacklist` has been replaced with `blocklist` throughout.  The following commands have changed:
-
-  - ``ceph osd blacklist ...`` are now ``ceph osd blocklist ...``
-  - ``ceph <tell|daemon> osd.<NNN> dump_blacklist`` is now ``ceph <tell|daemon> osd.<NNN> dump_blocklist``
-
-* The following config options have changed:
-
-  - ``mon osd blacklist default expire`` is now ``mon osd blocklist default expire``
-  - ``mon mds blacklist interval`` is now ``mon mds blocklist interval``
-  - ``mon mgr blacklist interval`` is now ''mon mgr blocklist interval``
-  - ``rbd blacklist on break lock`` is now ``rbd blocklist on break lock``
-  - ``rbd blacklist expire seconds`` is now ``rbd blocklist expire seconds``
-  - ``mds session blacklist on timeout`` is now ``mds session blocklist on timeout``
-  - ``mds session blacklist on evict`` is now ``mds session blocklist on evict``
-
-* The following librados API calls have changed:
-
-  - ``rados_blacklist_add`` is now ``rados_blocklist_add``; the former will issue a deprecation warning and be removed in a future release.
-  - ``rados.blacklist_add`` is now ``rados.blocklist_add`` in the C++ API.
-
-* The JSON output for the following commands now shows ``blocklist`` instead of ``blacklist``:
-
-  - ``ceph osd dump``
-  - ``ceph <tell|daemon> osd.<N> dump_blocklist``
-
-* Monitors now have config option ``mon_allow_pool_size_one``, which is disabled
-  by default. However, if enabled, user now have to pass the
-  ``--yes-i-really-mean-it`` flag to ``osd pool set size 1``, if they are really
-  sure of configuring pool size 1.
-
-* ``ceph pg #.# list_unfound`` output has been enhanced to provide
-  might_have_unfound information which indicates which OSDs may
-  contain the unfound objects.
-
-* OSD: A new configuration option ``osd_compact_on_start`` has been added which triggers
-  an OSD compaction on start. Setting this option to ``true`` and restarting an OSD
-  will result in an offline compaction of the OSD prior to booting.
-
-* OSD: the option named ``bdev_nvme_retry_count`` has been removed. Because
-  in SPDK v20.07, there is no easy access to bdev_nvme options, and this
-  option is hardly used, so it was removed.
-
-* Alpine build related script, documentation and test have been removed since
-  the most updated APKBUILD script of Ceph is already included by Alpine Linux's
-  aports repository.
-
diff --git a/ceph/doc/releases/quincy.rst b/ceph/doc/releases/quincy.rst
deleted file mode 100644 (file)
index c56f104..0000000
+++ /dev/null
@@ -1,445 +0,0 @@
-======
-Quincy
-======
-
-Quincy is the 17th stable release of Ceph.  It is named after Squidward
-Quincy Tentacles from Spongebob Squarepants.
-
-v17.2.0 Quincy
-==============
-
-This is the first stable release of Ceph Quincy.
-
-Major Changes from Pacific
---------------------------
-
-General
-~~~~~~~
-
-* Filestore has been deprecated in Quincy. BlueStore is Ceph's default object
-  store.
-
-* The `ceph-mgr-modules-core` debian package no longer recommends
-  `ceph-mgr-rook`. `ceph-mgr-rook` depends on `python3-numpy`, which
-  cannot be imported in different Python sub-interpreters multiple times
-  when the version of `python3-numpy` is older than 1.19. Because
-  `apt-get` installs the `Recommends` packages by default, `ceph-mgr-rook`
-  was always installed along with the `ceph-mgr` debian package as an
-  indirect dependency. If your workflow depends on this behavior, you
-  might want to install `ceph-mgr-rook` separately.
-
-* The ``device_health_metrics`` pool has been renamed ``.mgr``. It is now
-  used as a common store for all ``ceph-mgr`` modules. After upgrading to
-  Quincy, the ``device_health_metrics`` pool will be renamed to ``.mgr``
-  on existing clusters.
-
-* The ``ceph pg dump`` command now prints three additional columns:
-  `LAST_SCRUB_DURATION` shows the duration (in seconds) of the last completed
-  scrub;
-  `SCRUB_SCHEDULING` conveys whether a PG is scheduled to be scrubbed at a
-  specified time, whether it is queued for scrubbing, or whether it is being
-  scrubbed;
-  `OBJECTS_SCRUBBED` shows the number of objects scrubbed in a PG after a
-  scrub begins.
-
-* A health warning is now reported if the ``require-osd-release`` flag
-  is not set to the appropriate release after a cluster upgrade.
-
-* LevelDB support has been removed. ``WITH_LEVELDB`` is no longer a supported
-  build option. Users *should* migrate their monitors and OSDs to RocksDB
-  before upgrading to Quincy.
-
-* Cephadm: ``osd_memory_target_autotune`` is enabled by default, which sets
-  ``mgr/cephadm/autotune_memory_target_ratio`` to ``0.7`` of total RAM. This
-  is unsuitable for hyperconverged infrastructures. For hyperconverged Ceph,
-  please refer to the documentation or set
-  ``mgr/cephadm/autotune_memory_target_ratio`` to ``0.2``.
-
-* telemetry: Improved the opt-in flow so that users can keep sharing the same
-  data, even when new data collections are available. A new 'perf' channel that
-  collects various performance metrics is now avaiable to opt into with:
-  `ceph telemetry on`
-  `ceph telemetry enable channel perf`
-  See a sample report with `ceph telemetry preview`.
-  Note that generating a telemetry report with 'perf' channel data might
-  take a few moments in big clusters.
-  For more details, see:
-  https://docs.ceph.com/en/quincy/mgr/telemetry/
-
-* MGR: The progress module disables the pg recovery event by default since the
-  event is expensive and has interrupted other services when there are OSDs
-  being marked in/out from the the cluster. However, the user can still enable
-  this event anytime. For more detail, see:
-
-  https://docs.ceph.com/en/quincy/mgr/progress/
-
-* https://tracker.ceph.com/issues/55383 is a known issue -
-  ``mon_cluster_log_to_journald`` needs to be set to false, when
-  ``mon_cluster_log_to_file`` is set to true to continue to log cluster
-  log messages to file, after log rotation.
-
-Cephadm
--------
-
-* SNMP Support
-* Colocation of Daemons (mgr, mds, rgw)
-* osd memory autotuning
-* Integration with new NFS mgr module
-* Ability to zap osds as they are removed
-* cephadm agent for increased performance/scalability
-
-Dashboard
-~~~~~~~~~
-* Day 1: the new "Cluster Expansion Wizard" will guide users through post-install steps:
-  adding new hosts, storage devices or services.
-* NFS: the Dashboard now allows users to fully manage all NFS exports from a single place.
-* New mgr module (feedback): users can quickly report Ceph tracker issues
-  or suggestions directly from the Dashboard or the CLI.
-* New "Message of the Day": cluster admins can publish a custom message in a banner.
-* Cephadm integration improvements:
-   * Host management: maintenance, specs and labelling,
-   * Service management: edit and display logs,
-   * Daemon management (start, stop, restart, reload),
-   * New services supported: ingress (HAProxy) and SNMP-gateway.
-* Monitoring and alerting:
-   * 43 new alerts have been added (totalling 68) improving observability of events affecting:
-     cluster health, monitors, storage devices, PGs and CephFS.
-   * Alerts can now be sent externally as SNMP traps via the new SNMP gateway service
-     (the MIB is provided).
-   * Improved integrated full/nearfull event notifications.
-   * Grafana Dashboards now use grafonnet format (though they're still available
-     in JSON format).
-   * Stack update: images for monitoring containers have been updated.
-     Grafana 8.3.5, Prometheus 2.33.4, Alertmanager 0.23.0 and Node Exporter 1.3.1.
-     This reduced exposure to several Grafana vulnerabilities (CVE-2021-43798,
-     CVE-2021-39226, CVE-2021-43798,  CVE-2020-29510, CVE-2020-29511).
-
-RADOS
-~~~~~
-
-* OSD: Ceph now uses `mclock_scheduler` for BlueStore OSDs as its default
-  `osd_op_queue` to provide QoS. The 'mclock_scheduler' is not supported
-  for Filestore OSDs. Therefore, the default 'osd_op_queue' is set to `wpq`
-  for Filestore OSDs and is enforced even if the user attempts to change it.
-  For more details on configuring mclock see,
-
-  https://docs.ceph.com/en/quincy/rados/configuration/mclock-config-ref/
-
-  An outstanding issue exists during runtime where the mclock config options
-  related to reservation, weight and limit cannot be modified after switching
-  to the `custom` mclock profile using the `ceph config set ...` command.
-  This is tracked by: https://tracker.ceph.com/issues/55153. Until the issue
-  is fixed, users are advised to avoid using the 'custom' profile or use the
-  workaround mentioned in the tracker.
-
-* MGR: The pg_autoscaler can now be turned `on` and `off` globally
-  with the `noautoscale` flag. By default, it is set to `on`, but this flag
-  can come in handy to prevent rebalancing triggered by autoscaling during
-  cluster upgrade and maintenance. Pools can now be created with the `--bulk`
-  flag, which allows the autoscaler to allocate more PGs to such pools. This
-  can be useful to get better out of the box performance for data-heavy pools.
-
-  For more details about autoscaling, see:
-  https://docs.ceph.com/en/quincy/rados/operations/placement-groups/
-
-* OSD: Support for on-wire compression for osd-osd communication, `off` by
-  default.
-
-  For more details about compression modes, see:
-  https://docs.ceph.com/en/quincy/rados/configuration/msgr2/#compression-modes
-
-* OSD: Concise reporting of slow operations in the cluster log. The old
-  and more verbose logging behavior can be regained by setting
-  `osd_aggregated_slow_ops_logging` to false.
-
-* the "kvs" Ceph object class is not packaged anymore. The "kvs" Ceph
-  object class offers a distributed flat b-tree key-value store that
-  is implemented on top of the librados objects omap. Because there
-  are no existing internal users of this object class, it is not
-  packaged anymore.
-
-RBD block storage
-~~~~~~~~~~~~~~~~~
-
-* rbd-nbd: `rbd device attach` and `rbd device detach` commands added,
-  these allow for safe reattach after `rbd-nbd` daemon is restarted since
-  Linux kernel 5.14.
-
-* rbd-nbd: `notrim` map option added to support thick-provisioned images,
-  similar to krbd.
-
-* Large stabilization effort for client-side persistent caching on SSD
-  devices, also available in 16.2.8. For details on usage, see:
-
-  https://docs.ceph.com/en/quincy/rbd/rbd-persistent-write-log-cache/
-
-* Several bug fixes in diff calculation when using fast-diff image
-  feature + whole object (inexact) mode. In some rare cases these
-  long-standing issues could cause an incorrect `rbd export`. Also
-  fixed in 15.2.16 and 16.2.8.
-
-* Fix for a potential performance degradation when running Windows VMs
-  on krbd. For details, see `rxbounce` map option description:
-
-  https://docs.ceph.com/en/quincy/man/8/rbd/#kernel-rbd-krbd-options
-
-RGW object storage
-~~~~~~~~~~~~~~~~~~
-
-* RGW now supports rate limiting by user and/or by bucket. With this
-  feature it is possible to limit user and/or bucket, the total operations
-  and/or bytes per minute can be delivered. This feature allows the
-  admin to limit only READ operations and/or WRITE operations. The
-  rate-limiting configuration could be applied on all users and all buckets
-  by using global configuration.
-
-* `radosgw-admin realm delete` has been renamed to `radosgw-admin realm
-  rm`. This is consistent with the help message.
-
-* S3 bucket notification events now contain an `eTag` key instead of
-  `etag`, and eventName values no longer carry the `s3:` prefix, fixing
-  deviations from the message format that is observed on AWS.
-
-* It is possible to specify ssl options and ciphers for beast frontend
-  now. The default ssl options setting is
-  "no_sslv2:no_sslv3:no_tlsv1:no_tlsv1_1". If you want to return to the old
-  behavior, add 'ssl_options=' (empty) to the ``rgw frontends`` configuration.
-
-* The behavior for Multipart Upload was modified so that only
-  CompleteMultipartUpload notification is sent at the end of the multipart
-  upload. The POST notification at the beginning of the upload and the PUT
-  notifications that were sent on each part are no longer sent.
-
-
-CephFS distributed file system
-~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-
-* fs: A file system can be created with a specific ID ("fscid"). This is
-  useful in certain recovery scenarios (for example, when a monitor
-  database has been lost and rebuilt, and the restored file system is
-  expected to have the same ID as before).
-
-* fs: A file system can be renamed using the `fs rename` command. Any cephx
-  credentials authorized for the old file system name will need to be
-  reauthorized to the new file system name. Since the operations of the clients
-  using these re-authorized IDs may be disrupted, this command requires the
-  "--yes-i-really-mean-it" flag. Also, mirroring is expected to be disabled
-  on the file system.
-
-* MDS upgrades no longer require all standby MDS daemons to be stoped before
-  upgrading a file systems's sole active MDS.
-
-* CephFS: Failure to replay the journal by a standby-replay daemon now
-  causes the rank to be marked "damaged".
-
-Upgrading from Octopus or Pacific
-----------------------------------
-
-Quincy does not support LevelDB. Please migrate your OSDs and monitors
-to RocksDB before upgrading to Quincy.
-
-Before starting, make sure your cluster is stable and healthy (no down or
-recovering OSDs).  (This is optional, but recommended.) You can disable
-the autoscaler for all pools during the upgrade using the noautoscale flag.
-
-.. note::
-
-  You can monitor the progress of your upgrade at each stage with the
-  ``ceph versions`` command, which will tell you what ceph version(s) are
-  running for each type of daemon.
-
-Upgrading cephadm clusters
-~~~~~~~~~~~~~~~~~~~~~~~~~~
-
-If your cluster is deployed with cephadm (first introduced in Octopus), then
-the upgrade process is entirely automated.  To initiate the upgrade,
-
-  .. prompt:: bash #
-
-    ceph orch upgrade start --ceph-version 17.2.0
-
-The same process is used to upgrade to future minor releases.
-
-Upgrade progress can be monitored with ``ceph -s`` (which provides a simple
-progress bar) or more verbosely with
-
-  .. prompt:: bash #
-
-    ceph -W cephadm
-
-The upgrade can be paused or resumed with
-
-  .. prompt:: bash #
-
-    ceph orch upgrade pause   # to pause
-    ceph orch upgrade resume  # to resume
-
-or canceled with
-
-  .. prompt:: bash #
-
-    ceph orch upgrade stop
-
-Note that canceling the upgrade simply stops the process; there is no ability to
-downgrade back to Octopus or Pacific.
-
-
-Upgrading non-cephadm clusters
-~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-
-.. note::
-   If you cluster is running Octopus (15.2.x) or later, you might choose
-   to first convert it to use cephadm so that the upgrade to Quincy
-   is automated (see above).  For more information, see
-   :ref:`cephadm-adoption`.
-
-#. Set the ``noout`` flag for the duration of the upgrade. (Optional,
-   but recommended.)::
-
-     # ceph osd set noout
-
-#. Upgrade monitors by installing the new packages and restarting the
-   monitor daemons.  For example, on each monitor host,::
-
-     # systemctl restart ceph-mon.target
-
-   Once all monitors are up, verify that the monitor upgrade is
-   complete by looking for the ``quincy`` string in the mon
-   map.  The command::
-
-     # ceph mon dump | grep min_mon_release
-
-   should report::
-
-     min_mon_release 17 (quincy)
-
-   If it doesn't, that implies that one or more monitors hasn't been
-   upgraded and restarted and/or the quorum does not include all monitors.
-
-#. Upgrade ``ceph-mgr`` daemons by installing the new packages and
-   restarting all manager daemons.  For example, on each manager host,::
-
-     # systemctl restart ceph-mgr.target
-
-   Verify the ``ceph-mgr`` daemons are running by checking ``ceph
-   -s``::
-
-     # ceph -s
-
-     ...
-       services:
-        mon: 3 daemons, quorum foo,bar,baz
-        mgr: foo(active), standbys: bar, baz
-     ...
-
-#. Upgrade all OSDs by installing the new packages and restarting the
-   ceph-osd daemons on all OSD hosts::
-
-     # systemctl restart ceph-osd.target
-
-#. Upgrade all CephFS MDS daemons. For each CephFS file system,
-
-   #. Disable standby_replay::
-
-       # ceph fs set <fs_name> allow_standby_replay false
-
-   #. Reduce the number of ranks to 1.  (Make note of the original
-      number of MDS daemons first if you plan to restore it later.)::
-
-       # ceph status
-       # ceph fs set <fs_name> max_mds 1
-
-   #. Wait for the cluster to deactivate any non-zero ranks by
-      periodically checking the status::
-
-       # ceph status
-
-   #. Take all standby MDS daemons offline on the appropriate hosts with::
-
-       # systemctl stop ceph-mds@<daemon_name>
-
-   #. Confirm that only one MDS is online and is rank 0 for your FS::
-
-       # ceph status
-
-   #. Upgrade the last remaining MDS daemon by installing the new
-      packages and restarting the daemon::
-
-        # systemctl restart ceph-mds.target
-
-   #. Restart all standby MDS daemons that were taken offline::
-
-       # systemctl start ceph-mds.target
-
-   #. Restore the original value of ``max_mds`` for the volume::
-
-       # ceph fs set <fs_name> max_mds <original_max_mds>
-
-#. Upgrade all radosgw daemons by upgrading packages and restarting
-   daemons on all hosts::
-
-     # systemctl restart ceph-radosgw.target
-
-#. Complete the upgrade by disallowing pre-Quincy OSDs and enabling
-   all new Quincy-only functionality::
-
-     # ceph osd require-osd-release quincy
-
-#. If you set ``noout`` at the beginning, be sure to clear it with::
-
-     # ceph osd unset noout
-
-#. Consider transitioning your cluster to use the cephadm deployment
-   and orchestration framework to simplify cluster management and
-   future upgrades.  For more information on converting an existing
-   cluster to cephadm, see :ref:`cephadm-adoption`.
-
-Post-upgrade
-~~~~~~~~~~~~
-
-#. Verify the cluster is healthy with ``ceph health``. If your cluster is
-   running Filestore, a deprecation warning is expected. This warning can
-   be temporarily muted using the following command::
-
-     ceph health mute OSD_FILESTORE
-
-#. If you are upgrading from Mimic, or did not already do so when you
-   upgraded to Nautilus, we recommend you enable the new :ref:`v2
-   network protocol <msgr2>`, issue the following command::
-
-     ceph mon enable-msgr2
-
-   This will instruct all monitors that bind to the old default port
-   6789 for the legacy v1 protocol to also bind to the new 3300 v2
-   protocol port.  To see if all monitors have been updated,::
-
-     ceph mon dump
-
-   and verify that each monitor has both a ``v2:`` and ``v1:`` address
-   listed.
-
-#. Consider enabling the :ref:`telemetry module <telemetry>` to send
-   anonymized usage statistics and crash information to the Ceph
-   upstream developers.  To see what would be reported (without actually
-   sending any information to anyone),::
-
-     ceph telemetry preview-all
-
-   If you are comfortable with the data that is reported, you can opt-in to
-   automatically report the high-level cluster metadata with::
-
-     ceph telemetry on
-
-   The public dashboard that aggregates Ceph telemetry can be found at
-   `https://telemetry-public.ceph.com/ <https://telemetry-public.ceph.com/>`_.
-
-   For more information about the telemetry module, see :ref:`the
-   documentation <telemetry>`.
-
-
-Upgrading from pre-Octopus releases (like Nautilus)
----------------------------------------------------
-
-
-You *must* first upgrade to Octopus (15.2.z) or Pacific (16.2.z) before
-upgrading to Quincy.
diff --git a/ceph/doc/security/CVE-2022-0670.rst b/ceph/doc/security/CVE-2022-0670.rst
new file mode 100644 (file)
index 0000000..f2b90de
--- /dev/null
@@ -0,0 +1,43 @@
+.. _CVE-2022-0670:
+
+CVE-2022-0670: Native-CephFS Manila Path-restriction bypass
+===========================================================
+
+Summary
+-------
+
+Users who were running OpenStack Manila to export native CephFS and who
+upgraded their Ceph cluster from Nautilus (or earlier) to a later
+major version were vulnerable to an attack by malicious users. The
+vulnerability allowed users to obtain access to arbitrary portions of
+the CephFS filesystem hierarchy instead of being properly restricted
+to their own subvolumes. The vulnerability is due to a bug in the
+"volumes" plugin in Ceph Manager. This plugin is responsible for
+managing Ceph File System subvolumes, which are used by OpenStack
+Manila services as a way to provide shares to Manila users.
+
+Again, this vulnerability impacts only OpenStack Manila clusters that 
+provided native CephFS access to their users.
+
+Affected versions
+-----------------
+
+Any version of Ceph running OpenStack Manila that was upgraded from Nautilus
+or earlier.
+
+Fixed versions
+--------------
+
+* Quincy v17.2.2 (and later)
+* Pacific v16.2.10 (and later)
+* Octopus v15.2.17
+
+Recommendations
+---------------
+
+#. Users should upgrade to a patched version of Ceph at their earliest
+   convenience.
+
+#. Administrators who are
+   concerned they may have been impacted should audit the CephX keys in
+   their cluster for proper path restrictions.
index 223b61634fd498a564c7b7a899e926c0cec8657d..8bbccbf64d6ea4a04dd4a60470100029df6eadad 100644 (file)
@@ -2,81 +2,85 @@
 Past vulnerabilities
 ====================
 
 Past vulnerabilities
 ====================
 
-+------------+-------------------+-------------+--------------------------------------------+
-| Published  | CVE               | Severity    | Summary                                    |
-+------------+-------------------+-------------+--------------------------------------------+
-| 2021-05-13 | `CVE-2021-3531`_  | Medium      | Swift API denial of service                |
-+------------+-------------------+-------------+--------------------------------------------+
-| 2021-05-13 | `CVE-2021-3524`_  | Medium      | HTTP header injects via CORS in RGW        |
-+------------+-------------------+-------------+--------------------------------------------+
-| 2021-05-13 | `CVE-2021-3509`_  | High        | Dashboard XSS via token cookie             |
-+------------+-------------------+-------------+--------------------------------------------+
-| 2021-04-14 | `CVE-2021-20288`_ | High        | Unauthorized global_id reuse in cephx      |
-+------------+-------------------+-------------+--------------------------------------------+
-| 2020-12-18 | `CVE-2020-27781`_ | 7.1 High    | CephFS creds read/modified by Manila users |
-+------------+-------------------+-------------+--------------------------------------------+
-| 2021-01-08 | `CVE-2020-25678`_ | 4.9 Medium  | mgr module passwords in clear text         |
-+------------+-------------------+-------------+--------------------------------------------+
-| 2020-12-07 | `CVE-2020-25677`_ | 5.5 Medium  | ceph-ansible iscsi-gateway.conf perm       |
-+------------+-------------------+-------------+--------------------------------------------+
-| 2020-11-23 | `CVE-2020-25660`_ | 8.8 High    | Cephx replay vulnerability                 |
-+------------+-------------------+-------------+--------------------------------------------+
-| 2020-04-22 | `CVE-2020-12059`_ | 7.5 High    | malformed POST could crash RGW             |
-+------------+-------------------+-------------+--------------------------------------------+
-| 2020-06-26 | `CVE-2020-10753`_ | 6.5 Medium  | HTTP header injects via CORS in RGW        |
-+------------+-------------------+-------------+--------------------------------------------+
-| 2020-06-22 | `CVE-2020-10736`_ | 8.0 High    | authorization bypass in mon and mgr        |
-+------------+-------------------+-------------+--------------------------------------------+
-| 2020-04-23 | `CVE-2020-1760`_  | 6.1 Medium  | potential RGW XSS attack                   |
-+------------+-------------------+-------------+--------------------------------------------+
-| 2020-04-13 | `CVE-2020-1759`_  | 6.8 Medium  | Cephx nonce reuse in secure mode           |
-+------------+-------------------+-------------+--------------------------------------------+
-| 2020-02-07 | `CVE-2020-1700`_  | 6.5 Medium  | RGW disconnects leak sockets, can DoS      |
-+------------+-------------------+-------------+--------------------------------------------+
-| 2020-04-21 | `CVE-2020-1699`_  | 7.5 High    | Dashboard path traversal flaw              |
-+------------+-------------------+-------------+--------------------------------------------+
-| 2019-12-23 | `CVE-2019-19337`_ | 6.5 Medium  | RGW DoS via malformed headers              |
-+------------+-------------------+-------------+--------------------------------------------+
-| 2019-11-08 | `CVE-2019-10222`_ | 7.5 High    | Invalid HTTP headers could crash RGW       |
-+------------+-------------------+-------------+--------------------------------------------+
-| 2019-03-27 | `CVE-2019-3821`_  | 7.5 High    | RGW file descriptors could be exhausted    |
-+------------+-------------------+-------------+--------------------------------------------+
-| 2019-01-28 | `CVE-2018-16889`_ | 7.5 High    | encryption keys logged in plaintext        |
-+------------+-------------------+-------------+--------------------------------------------+
-| 2019-01-15 | `CVE-2018-16846`_ | 6.5 Medium  | authenticated RGW users can cause DoS      |
-+------------+-------------------+-------------+--------------------------------------------+
-| 2019-01-15 | `CVE-2018-14662`_ | 5.7 Medium  | read-only users could steal dm-crypt keys  |
-+------------+-------------------+-------------+--------------------------------------------+
-| 2018-07-10 | `CVE-2018-10861`_ | 8.1 High    | authenticated user can create/delete pools |
-+------------+-------------------+-------------+--------------------------------------------+
-| 2018-03-19 | `CVE-2018-7262`_  | 7.5 High    | malformed headers can cause RGW DoS        |
-+------------+-------------------+-------------+--------------------------------------------+
-| 2018-07-10 | `CVE-2018-1129`_  | 6.5 Medium  | network MITM can tamper with messages      |
-+------------+-------------------+-------------+--------------------------------------------+
-| 2018-07-10 | `CVE-2018-1128`_  | 7.5 High    | Cephx replay vulnerability                 |
-+------------+-------------------+-------------+--------------------------------------------+
-| 2018-07-27 | `CVE-2017-7519`_  | 4.4 Medium  | libradosstriper unvalidated format string  |
-+------------+-------------------+-------------+--------------------------------------------+
-| 2018-08-01 | `CVE-2016-9579`_  | 7.6 High    | potential RGW XSS attack                   |
-+------------+-------------------+-------------+--------------------------------------------+
-| 2018-07-31 | `CVE-2016-8626`_  | 6.5 Medium  | malformed POST can DoS RGW                 |
-+------------+-------------------+-------------+--------------------------------------------+
-| 2016-10-03 | `CVE-2016-7031`_  | 7.5 High    | RGW unauthorized bucket listing            |
-+------------+-------------------+-------------+--------------------------------------------+
-| 2016-07-12 | `CVE-2016-5009`_  | 6.5 Medium  | mon command handler DoS                    |
-+------------+-------------------+-------------+--------------------------------------------+
-| 2016-12-03 | `CVE-2015-5245`_  |             | RGW header injection                       |
-+------------+-------------------+-------------+--------------------------------------------+
++------------+-------------------+-------------+---------------------------------------------+
+| Published  | CVE               | Severity    | Summary                                     |
++------------+-------------------+-------------+---------------------------------------------+
+| 2022-07-21 | `CVE-2022-0670`_  | Medium      | Native-CephFS Manila Path-restriction bypass|
++------------+-------------------+-------------+---------------------------------------------+
+| 2021-05-13 | `CVE-2021-3531`_  | Medium      | Swift API denial of service                 |
++------------+-------------------+-------------+---------------------------------------------+
+| 2021-05-13 | `CVE-2021-3524`_  | Medium      | HTTP header injects via CORS in RGW         |
++------------+-------------------+-------------+---------------------------------------------+
+| 2021-05-13 | `CVE-2021-3509`_  | High        | Dashboard XSS via token cookie              |
++------------+-------------------+-------------+---------------------------------------------+
+| 2021-04-14 | `CVE-2021-20288`_ | High        | Unauthorized global_id reuse in cephx       |
++------------+-------------------+-------------+---------------------------------------------+
+| 2020-12-18 | `CVE-2020-27781`_ | 7.1 High    | CephFS creds read/modified by Manila users  |
++------------+-------------------+-------------+---------------------------------------------+
+| 2021-01-08 | `CVE-2020-25678`_ | 4.9 Medium  | mgr module passwords in clear text          |
++------------+-------------------+-------------+---------------------------------------------+
+| 2020-12-07 | `CVE-2020-25677`_ | 5.5 Medium  | ceph-ansible iscsi-gateway.conf perm        |
++------------+-------------------+-------------+---------------------------------------------+
+| 2020-11-23 | `CVE-2020-25660`_ | 8.8 High    | Cephx replay vulnerability                  |
++------------+-------------------+-------------+---------------------------------------------+
+| 2020-04-22 | `CVE-2020-12059`_ | 7.5 High    | malformed POST could crash RGW              |
++------------+-------------------+-------------+---------------------------------------------+
+| 2020-06-26 | `CVE-2020-10753`_ | 6.5 Medium  | HTTP header injects via CORS in RGW         |
++------------+-------------------+-------------+---------------------------------------------+
+| 2020-06-22 | `CVE-2020-10736`_ | 8.0 High    | authorization bypass in mon and mgr         |
++------------+-------------------+-------------+---------------------------------------------+
+| 2020-04-23 | `CVE-2020-1760`_  | 6.1 Medium  | potential RGW XSS attack                    |
++------------+-------------------+-------------+---------------------------------------------+
+| 2020-04-13 | `CVE-2020-1759`_  | 6.8 Medium  | Cephx nonce reuse in secure mode            |
++------------+-------------------+-------------+---------------------------------------------+
+| 2020-02-07 | `CVE-2020-1700`_  | 6.5 Medium  | RGW disconnects leak sockets, can DoS       |
++------------+-------------------+-------------+---------------------------------------------+
+| 2020-04-21 | `CVE-2020-1699`_  | 7.5 High    | Dashboard path traversal flaw               |
++------------+-------------------+-------------+---------------------------------------------+
+| 2019-12-23 | `CVE-2019-19337`_ | 6.5 Medium  | RGW DoS via malformed headers               |
++------------+-------------------+-------------+---------------------------------------------+
+| 2019-11-08 | `CVE-2019-10222`_ | 7.5 High    | Invalid HTTP headers could crash RGW        |
++------------+-------------------+-------------+---------------------------------------------+
+| 2019-03-27 | `CVE-2019-3821`_  | 7.5 High    | RGW file descriptors could be exhausted     |
++------------+-------------------+-------------+---------------------------------------------+
+| 2019-01-28 | `CVE-2018-16889`_ | 7.5 High    | encryption keys logged in plaintext         |
++------------+-------------------+-------------+---------------------------------------------+
+| 2019-01-15 | `CVE-2018-16846`_ | 6.5 Medium  | authenticated RGW users can cause DoS       |
++------------+-------------------+-------------+---------------------------------------------+
+| 2019-01-15 | `CVE-2018-14662`_ | 5.7 Medium  | read-only users could steal dm-crypt keys   |
++------------+-------------------+-------------+---------------------------------------------+
+| 2018-07-10 | `CVE-2018-10861`_ | 8.1 High    | authenticated user can create/delete pools  |
++------------+-------------------+-------------+---------------------------------------------+
+| 2018-03-19 | `CVE-2018-7262`_  | 7.5 High    | malformed headers can cause RGW DoS         |
++------------+-------------------+-------------+---------------------------------------------+
+| 2018-07-10 | `CVE-2018-1129`_  | 6.5 Medium  | network MITM can tamper with messages       |
++------------+-------------------+-------------+---------------------------------------------+
+| 2018-07-10 | `CVE-2018-1128`_  | 7.5 High    | Cephx replay vulnerability                  |
++------------+-------------------+-------------+---------------------------------------------+
+| 2018-07-27 | `CVE-2017-7519`_  | 4.4 Medium  | libradosstriper unvalidated format string   |
++------------+-------------------+-------------+---------------------------------------------+
+| 2018-08-01 | `CVE-2016-9579`_  | 7.6 High    | potential RGW XSS attack                    |
++------------+-------------------+-------------+---------------------------------------------+
+| 2018-07-31 | `CVE-2016-8626`_  | 6.5 Medium  | malformed POST can DoS RGW                  |
++------------+-------------------+-------------+---------------------------------------------+
+| 2016-10-03 | `CVE-2016-7031`_  | 7.5 High    | RGW unauthorized bucket listing             |
++------------+-------------------+-------------+---------------------------------------------+
+| 2016-07-12 | `CVE-2016-5009`_  | 6.5 Medium  | mon command handler DoS                     |
++------------+-------------------+-------------+---------------------------------------------+
+| 2016-12-03 | `CVE-2015-5245`_  |             | RGW header injection                        |
++------------+-------------------+-------------+---------------------------------------------+
 
 .. toctree::
    :hidden:
    :maxdepth: 0
 
 
 .. toctree::
    :hidden:
    :maxdepth: 0
 
+    CVE-2022-0670 <CVE-2022-0670.rst>
     CVE-2021-3531 <CVE-2021-3531.rst>
     CVE-2021-3524 <CVE-2021-3524.rst>
     CVE-2021-3509 <CVE-2021-3509.rst>
     CVE-2021-20288 <CVE-2021-20288.rst>
 
     CVE-2021-3531 <CVE-2021-3531.rst>
     CVE-2021-3524 <CVE-2021-3524.rst>
     CVE-2021-3509 <CVE-2021-3509.rst>
     CVE-2021-20288 <CVE-2021-20288.rst>
 
+.. _CVE-2022-0670: ../CVE-2022-0670
 .. _CVE-2021-3531: ../CVE-2021-3531
 .. _CVE-2021-3524: ../CVE-2021-3524
 .. _CVE-2021-3509: ../CVE-2021-3509
 .. _CVE-2021-3531: ../CVE-2021-3531
 .. _CVE-2021-3524: ../CVE-2021-3524
 .. _CVE-2021-3509: ../CVE-2021-3509
index a3fa03ccb237c8ae6436019895551ed99fe73dec..9d158cb969911c4ed2fe34f7b47ad7d1d43f7d1c 100644 (file)
@@ -36,4 +36,7 @@ the following GPG key:
 Supported versions
 ==================
 
 Supported versions
 ==================
 
-Security updates are applied only to the current :ref:`active-releases`.
+Security updates are applied only to the current `Active Releases`_.
+
+
+.. _Active Releases: https://docs.ceph.com/en/latest/releases/#active-releases
index 7df48d02c700c42733bd79b3e661e230b865940c..6390a2e1a11675baafe1bc33707283628cdd4b1b 100644 (file)
@@ -173,8 +173,8 @@ http://tracker.ceph.com/issues/4000.
    contributions in a single commit. When you keep documentation
    commits separate from source code commits, it simplifies the review
    process. We highly recommend that any pull request that adds a feature or
    contributions in a single commit. When you keep documentation
    commits separate from source code commits, it simplifies the review
    process. We highly recommend that any pull request that adds a feature or
-   a configuration option, should also include a documentation commit,
-   describing the relevant changes/options.
+   a configuration option should also include a documentation commit that
+   describes the changes.
 
 Before you create your branch name, ensure that it doesn't already exist in the
 local or remote repository. :
 
 Before you create your branch name, ensure that it doesn't already exist in the
 local or remote repository. :
@@ -644,32 +644,159 @@ The Ceph project uses `paragraph level markup`_ to highlight points.
    additional details.
 
 
    additional details.
 
 
-TOC and Hyperlinks
-------------------
+Table of Contents (TOC) and Hyperlinks
+---------------------------------------
 
 
-All documents must be linked from another document or a table of contents,
-otherwise you will receive a warning when building the documentation.
+The documents in the Ceph documentation suite follow certain conventions that
+are explained in this section.
 
 
-The Ceph project uses the ``.. toctree::`` directive. See `The TOC tree`_
-for details. When rendering a TOC, consider specifying the ``:maxdepth:`` 
-parameter so the rendered TOC is reasonably terse.
+Every document (every ``.rst`` file) in the Sphinx-controlled Ceph
+documentation suite must be linked either (1) from another document in the
+documentation suite or (2) from a table of contents (TOC). If any document in
+the documentation suite is not linked in this way, the ``build-doc`` script
+generates warnings when it tries to build the documentation. 
 
 
-Document authors should prefer to use the ``:ref:`` syntax where a link target
-contains a specific unique identifier (e.g., ``.. _unique-target-id:``), and  a
-reference to the target specifically references the target  (e.g.,
-``:ref:`unique-target-id```) so that if source files are moved or the
-information architecture changes, the links will still work. See
-`Cross referencing arbitrary locations`_ for details.
+The Ceph project uses the ``.. toctree::`` directive. See `The TOC tree`_ for
+details. When rendering a table of contents (TOC), specify the ``:maxdepth:``
+parameter so that the rendered TOC is not too long.
 
 
-Ceph documentation also uses the backtick (accent grave) character followed by
-the link text, another backtick and an underscore. Sphinx allows you to
-incorporate the link destination inline; however, we prefer to use the use the
-``.. _Link Text: ../path`` convention at the bottom of the document, because it
-improves the readability of the document in a command line interface.
+Use the ``:ref:`` syntax where a link target contains a specific unique
+identifier (for example, ``.. _unique-target-id:``). A link to the section
+designated by ``.. _unique-target-id:`` looks like this:
+``:ref:`unique-target-id```. If this convention is followed, the links within
+the ``.rst`` source files will work even if the source files are moved within
+the ``ceph/doc`` directory. See `Cross referencing arbitrary locations`_ for
+details.
 
 
+.. _start_external_hyperlink_example:
 
 
-.. _Python Sphinx: http://sphinx-doc.org
-.. _resturcturedText: http://docutils.sourceforge.net/rst.html
+External Hyperlink Example
+~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+It is also possible to create a link to a section of the documentation and to
+have custom text appear in the body of the link. This is useful when it is more
+important to preserve the text of the sentence containing the link than it is
+to refer explicitly to the title of the section being linked to.
+
+For example, RST that links to the Sphinx Python Document Generator homepage
+and generates a sentence reading "Click here to learn more about Python
+Sphinx." looks like this: 
+
+::
+
+    ``Click `here <https://www.sphinx-doc.org>`_ to learn more about Python
+    Sphinx.`` 
+
+And here it is, rendered:
+
+Click `here <https://www.sphinx-doc.org>`_ to learn more about Python Sphinx. 
+
+Pay special attention to the underscore after the backtick. If you forget to
+include it and this is your first day working with RST, there's a chance that
+you'll spend all day wondering what went wrong without realizing that you
+omitted that underscore. Also, pay special attention to the space between the
+substitution text (in this case, "here") and the less-than bracket that sets
+the explicit link apart from the substition text. The link will not render
+properly without this space.
+
+Linking Customs
+~~~~~~~~~~~~~~~
+
+By a custom established when Ceph was still being developed by Inktank,
+contributors to the documentation of the Ceph project preferred to use the
+convention of putting ``.. _Link Text: ../path`` links at the bottom of the
+document and linking to them using references of the form ``:ref:`path```. This
+convention was preferred because it made the documents more readable in a
+command line interface. As of 2023, though, we have no preference for one over
+the other. Use whichever convention makes the text easier to read.
+
+Quirks of ReStructured Text
+---------------------------
+
+External Links
+~~~~~~~~~~~~~~
+
+.. _external_link_with_inline_text:
+
+This is the formula for links to addresses external to the Ceph documentation:
+
+::
+
+   `inline text <http:www.foo.com>`_
+
+.. note:: Do not fail to include the space between the inline text and the
+   less-than sign. 
+   
+   Do not fail to include the underscore after the final backtick.
+
+   To link to addresses that are external to the Ceph documentation, include a
+   space between the inline text and the angle bracket that precedes the
+   external address. This is precisely the opposite of :ref:`the convention for
+   inline text that links to a location inside the Ceph
+   documentation<internal_link_with_inline_text>`. If this seems inconsistent
+   and confusing to you, then you're right. It is inconsistent and confusing.
+
+See also ":ref:`External Hyperlink Example<start_external_hyperlink_example>`".
+
+Internal Links
+~~~~~~~~~~~~~~
+
+To link to a section in the Ceph documentation, you must (1) define a target
+link before the section and then (2) link to that target from another location
+in the documentation. Here are the formulas for targets and links to those
+targets:
+
+Target::
+
+   .. _target:
+
+   Title of Targeted Section
+   =========================
+
+   Lorem ipsum...
+
+Link to target::
+
+   :ref:`target`
+
+.. _internal_link_with_inline_text:
+
+Link to target with inline text::
+
+   :ref:`inline text<target>`
+
+.. note:: 
+
+   There is no space between "inline text" and the angle bracket that
+   immediately follows it. This is precisely the opposite of :ref:`the
+   convention for inline text that links to a location outside of the Ceph
+   documentation<external_link_with_inline_text>`. If this seems inconsistent
+   and confusing to you, then you're right. It is inconsistent and confusing.
+
+Escaping Bold Characters within Words
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+This section explains how to make certain letters within a word bold while
+leaving the other letters in the word regular (non-bold). 
+
+The following single-line paragraph provides an example of this:
+
+**C**\eph **F**\ile **S**\ystem.
+
+In ReStructured Text, the following formula will not work:
+
+::
+
+   **C**eph **F**ile **S**ystem
+
+The bolded notation must be turned off by means of the escape character (\\), as shown here:
+
+::
+
+   **C**\eph **F**\ile **S**\ystem
+
+.. _Python Sphinx: https://www.sphinx-doc.org
+.. _restructuredText: http://docutils.sourceforge.net/rst.html
 .. _Fork and Pull: https://help.github.com/articles/using-pull-requests
 .. _github: http://github.com
 .. _ditaa: http://ditaa.sourceforge.net/
 .. _Fork and Pull: https://help.github.com/articles/using-pull-requests
 .. _github: http://github.com
 .. _ditaa: http://ditaa.sourceforge.net/
index df1d88ae3e307035b147357bfadc3bf9a66423a7..fea7cc1a247695e2d61f5c0fb35af1197954713b 100755 (executable)
@@ -132,7 +132,7 @@ build_dashboard_frontend() {
 
   $CURR_DIR/src/tools/setup-virtualenv.sh $TEMP_DIR
   $TEMP_DIR/bin/pip install nodeenv
 
   $CURR_DIR/src/tools/setup-virtualenv.sh $TEMP_DIR
   $TEMP_DIR/bin/pip install nodeenv
-  $TEMP_DIR/bin/nodeenv --verbose -p --node=12.18.2
+  $TEMP_DIR/bin/nodeenv --verbose -p --node=14.15.1
   cd src/pybind/mgr/dashboard/frontend
 
   . $TEMP_DIR/bin/activate
   cd src/pybind/mgr/dashboard/frontend
 
   . $TEMP_DIR/bin/activate
@@ -168,6 +168,19 @@ echo "including src/.git_version, ceph.spec"
 
 (git rev-parse HEAD ; echo $version) 2> /dev/null > src/.git_version
 
 
 (git rev-parse HEAD ; echo $version) 2> /dev/null > src/.git_version
 
+if [ -r /etc/os-release ]; then
+    source /etc/os-release
+    case $ID in
+        opensuse*|suse|sles)
+            if [ "x$rpm_release" != "x0" ] ; then
+                rpm_release=$(echo $rpm_release | sed 's/.g/+g/')
+                rpm_version="${rpm_version}.${rpm_release}"
+                rpm_release="0"
+            fi
+            ;;
+    esac
+fi
+
 for spec in ceph.spec.in; do
     cat $spec |
         sed "s/@PROJECT_VERSION@/$rpm_version/g" |
 for spec in ceph.spec.in; do
     cat $spec |
         sed "s/@PROJECT_VERSION@/$rpm_version/g" |
index 4b8b43035f2eb1d0fd4c2ba314476b884c45818c..4772021939ef7736def6ebbf0be88d34204c0d59 100644 (file)
@@ -15,7 +15,13 @@ In `dashboards_out` you can find a collection of
 These dashboards are based on metrics collected
 from [prometheus](https://prometheus.io/) scraping the [prometheus mgr
 plugin](http://docs.ceph.com/en/latest/mgr/prometheus/) and the
 These dashboards are based on metrics collected
 from [prometheus](https://prometheus.io/) scraping the [prometheus mgr
 plugin](http://docs.ceph.com/en/latest/mgr/prometheus/) and the
-[node_exporter](https://github.com/prometheus/node_exporter).
+[node_exporter (0.17.0)](https://github.com/prometheus/node_exporter).
+
+
+##### Recommended versions: 
+-grafana 8.3.5
+    -grafana-piechart-panel 1.6.2
+    -grafana-status-panel 1.0.11
 
 #### Requirements
 
 
 #### Requirements
 
@@ -40,12 +46,19 @@ showMultiCluster: true,
 clusterLabel: '<your cluster label>',
 ```
 
 clusterLabel: '<your cluster label>',
 ```
 
+##### Recommended versions: 
+-prometheus v2.33.4
+
 #### SNMP
 #### SNMP
-Ceph provides a MIB (CEPH-PROMETHEUS-ALERT-MIB.txt) to support sending Prometheus
-alerts through to an SNMP management platform. The translation from Prometheus
-alert to SNMP trap requires the Prometheus alert to contain an OID that maps to
-a definition within the MIB. When making changes to the Prometheus alert rules
-file, developers should include any necessary changes to the MIB.
+Ceph provides a MIB (CEPH-PROMETHEUS-ALERT-MIB.txt) to support sending
+Prometheus alerts to an SNMP management platform. The translation from
+Prometheus alert to SNMP trap requires the Prometheus alert to contain an OID
+that maps to a definition within the MIB. When making changes to the Prometheus
+alert rules file, developers should include any necessary changes to the MIB.
+
+
+##### Recommended: 
+-alertmanager 0.16.2
 
 ### Building from Jsonnet
 
 
 ### Building from Jsonnet
 
@@ -59,3 +72,5 @@ To rebuild all the generated files, you can run `tox -egrafonnet-fix`.
 The jsonnet code located in this directory depends on some Jsonnet third party
 libraries. To update those libraries you can run `jb update` and then update
 the generated files using `tox -egrafonnet-fix`.
 The jsonnet code located in this directory depends on some Jsonnet third party
 libraries. To update those libraries you can run `jb update` and then update
 the generated files using `tox -egrafonnet-fix`.
+
+##### Any upgrade or downgrade to different major versions of the recommended tools mentioned above is not supported.
index 3e0b31f2c4595fe110ffdc2b0f8bb390f8aee4e4..4fd35c3ede4d3594f1b80d304cdd05f1d1c0b7d0 100644 (file)
@@ -318,7 +318,7 @@ local g = import 'grafonnet/grafana.libsonnet';
     .addTemplate(
       $.addTemplateSchema('ceph_hosts',
                           '$datasource',
     .addTemplate(
       $.addTemplateSchema('ceph_hosts',
                           '$datasource',
-                          'label_values({%(clusterMatcher)s}, instance)' % $.matchers(),
+                          if $._config.showMultiCluster then ('label_values({%(clusterMatcher)s}, instance)' % $.matchers()) else 'label_values(instance)',
                           1,
                           false,
                           3,
                           1,
                           false,
                           3,
@@ -719,5 +719,30 @@ local g = import 'grafonnet/grafana.libsonnet';
         11,
         9
       ),
         11,
         9
       ),
+      $.addTableSchema(
+        '$datasource',
+        'This table shows the 10 hosts with the highest number of slow ops',
+        { col: 2, desc: true },
+        [
+          $.overviewStyle('Instance', 'instance', 'string', 'short'),
+          $.overviewStyle('Slow Ops', 'Value', 'number', 'none'),
+          $.overviewStyle('', '/.*/', 'hidden', 'short'),
+        ],
+        'Top Slow Ops per Host',
+        'table'
+      )
+      .addTarget(
+        $.addTargetSchema(
+          |||
+            topk(10,
+              (sum by (instance)(ceph_daemon_health_metrics{type="SLOW_OPS", ceph_daemon=~"osd.*"}))
+            )
+          ||| % $.matchers(),
+          '',
+          'table',
+          1,
+          true
+        )
+      ) + { gridPos: { x: 0, y: 40, w: 4, h: 8 } },
     ]),
 }
     ]),
 }
index 129b74ba6669112df29001a6f63345c860678afe..0ea43c96ff9f04f44d445ef6124c28abdd13fe52 100644 (file)
@@ -300,6 +300,31 @@ local g = import 'grafonnet/grafana.libsonnet';
       .addTargets([$.addTargetSchema(
         'round(sum(rate(ceph_pool_wr{%(matchers)s}[$__rate_interval])))' % $.matchers(), 'Writes'
       )]),
       .addTargets([$.addTargetSchema(
         'round(sum(rate(ceph_pool_wr{%(matchers)s}[$__rate_interval])))' % $.matchers(), 'Writes'
       )]),
+      $.addTableSchema(
+        '$datasource',
+        'This table shows the 10 OSDs with the highest number of slow ops',
+        { col: 2, desc: true },
+        [
+          $.overviewStyle('OSD ID', 'ceph_daemon', 'string', 'short'),
+          $.overviewStyle('Slow Ops', 'Value', 'number', 'none'),
+          $.overviewStyle('', '/.*/', 'hidden', 'short'),
+        ],
+        'Top Slow Ops',
+        'table'
+      )
+      .addTarget(
+        $.addTargetSchema(
+          |||
+            topk(10,
+              (ceph_daemon_health_metrics{type="SLOW_OPS", ceph_daemon=~"osd.*"})
+            )
+          ||| % $.matchers(),
+          '',
+          'table',
+          1,
+          true
+        )
+      ) + { gridPos: { x: 0, y: 20, w: 4, h: 8 } },
     ]),
   'osd-device-details.json':
     local OsdDeviceDetailsPanel(title,
     ]),
   'osd-device-details.json':
     local OsdDeviceDetailsPanel(title,
index 437eb783f1875ed10fa420b87d0fe0db93b7def5..892480d1ca0ff57bc7dfe8116779d4757552a7f6 100644 (file)
@@ -257,16 +257,19 @@ local u = import 'utils.libsonnet';
         gridPos: { x: 0, y: 0, w: 24, h: 1 },
       },
       RgwOverviewPanel(
         gridPos: { x: 0, y: 0, w: 24, h: 1 },
       },
       RgwOverviewPanel(
-        'Average GET/PUT Latencies',
+        'Average GET/PUT Latencies by RGW Instance',
         '',
         's',
         'short',
         |||
         '',
         's',
         'short',
         |||
-          rate(ceph_rgw_get_initial_lat_sum{%(matchers)s}[$__rate_interval]) /
-            rate(ceph_rgw_get_initial_lat_count{%(matchers)s}[$__rate_interval]) *
-            on (instance_id) group_left (ceph_daemon) ceph_rgw_metadata{%(matchers)s}
+          label_replace(
+            rate(ceph_rgw_get_initial_lat_sum{%(matchers)s}[$__rate_interval]) /
+              rate(ceph_rgw_get_initial_lat_count{%(matchers)s}[$__rate_interval]) *
+              on (instance_id) group_left (ceph_daemon) ceph_rgw_metadata{%(matchers)s},
+            "rgw_host", "$1", "ceph_daemon", "rgw.(.*)"
+          )
         ||| % $.matchers(),
         ||| % $.matchers(),
-        'GET AVG',
+        'GET {{rgw_host}}',
         0,
         1,
         8,
         0,
         1,
         8,
@@ -275,11 +278,14 @@ local u = import 'utils.libsonnet';
         [
           $.addTargetSchema(
             |||
         [
           $.addTargetSchema(
             |||
-              rate(ceph_rgw_put_initial_lat_sum{%(matchers)s}[$__rate_interval]) /
-                rate(ceph_rgw_put_initial_lat_count{%(matchers)s}[$__rate_interval]) *
-                on (instance_id) group_left (ceph_daemon) ceph_rgw_metadata{%(matchers)s}
+              label_replace(
+                rate(ceph_rgw_put_initial_lat_sum{%(matchers)s}[$__rate_interval]) /
+                  rate(ceph_rgw_put_initial_lat_count{%(matchers)s}[$__rate_interval]) *
+                  on (instance_id) group_left (ceph_daemon) ceph_rgw_metadata{%(matchers)s},
+                "rgw_host", "$1", "ceph_daemon", "rgw.(.*)"
+              )
             ||| % $.matchers(),
             ||| % $.matchers(),
-            'PUT AVG'
+            'PUT {{rgw_host}}'
           ),
         ]
       ),
           ),
         ]
       ),
index 6988a629986c3ab9b2a4bd49af254f532162e603..2cd151ae1ff89d465fc4e8f62cb6cb90707491da 100644 (file)
       "id": "singlestat",
       "name": "Singlestat",
       "version": "5.0.0"
       "id": "singlestat",
       "name": "Singlestat",
       "version": "5.0.0"
-    },
-    {
-      "type": "panel",
-      "id": "vonage-status-panel",
-      "name": "Status Panel",
-      "version": "1.0.8"
     }
   ],
   "annotations": {
     }
   ],
   "annotations": {
@@ -64,7 +58,7 @@
       },
       "gridPos": {
         "h": 3,
       },
       "gridPos": {
         "h": 3,
-        "w": 2,
+        "w": 6,
         "x": 0,
         "y": 0
       },
         "x": 0,
         "y": 0
       },
       "fontFormat": "Regular",
       "gridPos": {
         "h": 3,
       "fontFormat": "Regular",
       "gridPos": {
         "h": 3,
-        "w": 2,
-        "x": 2,
+        "w": 6,
+        "x": 6,
         "y": 0
       },
       "id": 43,
         "y": 0
       },
       "id": 43,
       "isHideAlertsOnDisable": false,
       "isIgnoreOKColors": false,
       "links": [],
       "isHideAlertsOnDisable": false,
       "isIgnoreOKColors": false,
       "links": [],
+      "options": {
+        "colorMode": "background",
+        "graphMode": "none",
+        "justifyMode": "auto",
+        "orientation": "auto",
+        "reduceOptions": {
+          "calcs": [
+            "lastNotNull"
+          ],
+          "fields": "",
+          "values": false
+        }
+      },
       "targets": [
         {
           "aggregation": "Last",
       "targets": [
         {
           "aggregation": "Last",
         }
       ],
       "title": "OSDs",
         }
       ],
       "title": "OSDs",
-      "type": "vonage-status-panel"
+      "type": "stat"
+    },
+    {
+      "clusterName": "",
+      "colorMode": "Panel",
+      "colors": {
+        "crit": "rgba(245, 54, 54, 0.9)",
+        "disable": "rgba(128, 128, 128, 0.9)",
+        "ok": "rgba(50, 128, 45, 0.9)",
+        "warn": "rgba(237, 129, 40, 0.9)"
+      },
+      "cornerRadius": 1,
+      "datasource": "$datasource",
+      "displayName": "",
+      "flipCard": false,
+      "flipTime": 5,
+      "fontFormat": "Regular",
+      "gridPos": {
+        "h": 3,
+        "w": 6,
+        "x": 12,
+        "y": 0
+      },
+      "id": 41,
+      "isAutoScrollOnOverflow": false,
+      "isGrayOnNoData": false,
+      "isHideAlertsOnDisable": false,
+      "isIgnoreOKColors": false,
+      "links": [],
+      "options": {
+        "colorMode": "background",
+        "graphMode": "none",
+        "justifyMode": "auto",
+        "orientation": "auto",
+        "reduceOptions": {
+          "calcs": [
+            "lastNotNull"
+          ],
+          "fields": "",
+          "values": false
+        }
+      },
+      "targets": [
+        {
+          "aggregation": "Last",
+          "alias": "In Quorum",
+          "decimals": 2,
+          "displayAliasType": "Always",
+          "displayType": "Regular",
+          "displayValueWithAlias": "When Alias Displayed",
+          "expr": "sum(ceph_mon_quorum_status)",
+          "format": "time_series",
+          "interval": "",
+          "intervalFactor": 1,
+          "legendFormat": "In Quorum",
+          "refId": "A",
+          "units": "none",
+          "valueHandler": "Text Only"
+        },
+        {
+          "aggregation": "Last",
+          "alias": "Total",
+          "crit": 1,
+          "decimals": 2,
+          "displayAliasType": "Always",
+          "displayType": "Regular",
+          "displayValueWithAlias": "When Alias Displayed",
+          "expr": "count(ceph_mon_quorum_status)",
+          "format": "time_series",
+          "intervalFactor": 1,
+          "legendFormat": "Total",
+          "refId": "B",
+          "units": "none",
+          "valueHandler": "Text Only",
+          "warn": 2
+        },
+        {
+          "aggregation": "Last",
+          "alias": "MONs out of Quorum",
+          "crit": 1.6,
+          "decimals": 2,
+          "displayAliasType": "Warning / Critical",
+          "displayType": "Annotation",
+          "displayValueWithAlias": "Never",
+          "expr": "count(ceph_mon_quorum_status) / sum(ceph_mon_quorum_status)",
+          "format": "time_series",
+          "intervalFactor": 1,
+          "legendFormat": "MONs out of Quorum",
+          "refId": "C",
+          "units": "none",
+          "valueHandler": "Number Threshold",
+          "warn": 1.1
+        }
+      ],
+      "title": "Monitors",
+      "type": "stat"
+    },
+    {
+      "colorMode": "Panel",
+      "colors": {
+        "crit": "rgba(245, 54, 54, 0.9)",
+        "disable": "rgba(128, 128, 128, 0.9)",
+        "ok": "rgba(50, 128, 45, 0.9)",
+        "warn": "rgba(237, 129, 40, 0.9)"
+      },
+      "cornerRadius": 1,
+      "datasource": "$datasource",
+      "displayName": "",
+      "flipCard": false,
+      "flipTime": 5,
+      "fontFormat": "Regular",
+      "gridPos": {
+        "h": 3,
+        "w": 6,
+        "x": 18,
+        "y": 0
+      },
+      "id": 68,
+      "isAutoScrollOnOverflow": false,
+      "isGrayOnNoData": false,
+      "isHideAlertsOnDisable": false,
+      "isIgnoreOKColors": false,
+      "links": [],
+      "options": {
+        "colorMode": "background",
+        "graphMode": "none",
+        "justifyMode": "auto",
+        "orientation": "auto",
+        "reduceOptions": {
+          "calcs": [
+            "lastNotNull"
+          ],
+          "fields": "",
+          "values": false
+        }
+      },
+      "targets": [
+        {
+          "aggregation": "Last",
+          "alias": "Active",
+          "decimals": 2,
+          "displayAliasType": "Always",
+          "displayType": "Regular",
+          "displayValueWithAlias": "When Alias Displayed",
+          "expr": "count(ceph_mgr_status == 1) or vector(0)",
+          "format": "time_series",
+          "intervalFactor": 1,
+          "instant": true,
+          "legendFormat": "Active",
+          "refId": "A",
+          "units": "none",
+          "valueHandler": "Number Threshold"
+        },
+        {
+          "aggregation": "Last",
+          "alias": "Standby",
+          "decimals": 2,
+          "displayAliasType": "Always",
+          "displayType": "Regular",
+          "displayValueWithAlias": "When Alias Displayed",
+          "expr": "count(ceph_mgr_status == 0) or vector(0)",
+          "format": "time_series",
+          "instant": true,
+          "intervalFactor": 1,
+          "legendFormat": "Standby",
+          "refId": "B",
+          "units": "none",
+          "valueHandler": "Number Threshold"
+        }
+      ],
+      "title": "MGRs",
+      "type": "stat"
     },
     {
       "cacheTimeout": null,
     },
     {
       "cacheTimeout": null,
       },
       "gridPos": {
         "h": 6,
       },
       "gridPos": {
         "h": 6,
-        "w": 4,
-        "x": 4,
-        "y": 0
+        "w": 6,
+        "x": 0,
+        "y": 6
       },
       "id": 47,
       "interval": null,
       },
       "id": 47,
       "interval": null,
       "fill": 0,
       "gridPos": {
         "h": 6,
       "fill": 0,
       "gridPos": {
         "h": 6,
-        "w": 8,
-        "x": 8,
-        "y": 0
+        "w": 9,
+        "x": 6,
+        "y": 6
       },
       "id": 53,
       "legend": {
       },
       "id": 53,
       "legend": {
       "fill": 0,
       "gridPos": {
         "h": 6,
       "fill": 0,
       "gridPos": {
         "h": 6,
-        "w": 8,
-        "x": 16,
-        "y": 0
+        "w": 9,
+        "x": 15,
+        "y": 6
       },
       "id": 66,
       "legend": {
       },
       "id": 66,
       "legend": {
         }
       ]
     },
         }
       ]
     },
-    {
-      "clusterName": "",
-      "colorMode": "Panel",
-      "colors": {
-        "crit": "rgba(245, 54, 54, 0.9)",
-        "disable": "rgba(128, 128, 128, 0.9)",
-        "ok": "rgba(50, 128, 45, 0.9)",
-        "warn": "rgba(237, 129, 40, 0.9)"
-      },
-      "cornerRadius": 1,
-      "datasource": "$datasource",
-      "displayName": "",
-      "flipCard": false,
-      "flipTime": 5,
-      "fontFormat": "Regular",
-      "gridPos": {
-        "h": 3,
-        "w": 2,
-        "x": 0,
-        "y": 3
-      },
-      "id": 41,
-      "isAutoScrollOnOverflow": false,
-      "isGrayOnNoData": false,
-      "isHideAlertsOnDisable": false,
-      "isIgnoreOKColors": false,
-      "links": [],
-      "targets": [
-        {
-          "aggregation": "Last",
-          "alias": "In Quorum",
-          "decimals": 2,
-          "displayAliasType": "Always",
-          "displayType": "Regular",
-          "displayValueWithAlias": "When Alias Displayed",
-          "expr": "sum(ceph_mon_quorum_status)",
-          "format": "time_series",
-          "interval": "",
-          "intervalFactor": 1,
-          "legendFormat": "In Quorum",
-          "refId": "A",
-          "units": "none",
-          "valueHandler": "Text Only"
-        },
-        {
-          "aggregation": "Last",
-          "alias": "Total",
-          "crit": 1,
-          "decimals": 2,
-          "displayAliasType": "Always",
-          "displayType": "Regular",
-          "displayValueWithAlias": "When Alias Displayed",
-          "expr": "count(ceph_mon_quorum_status)",
-          "format": "time_series",
-          "intervalFactor": 1,
-          "legendFormat": "Total",
-          "refId": "B",
-          "units": "none",
-          "valueHandler": "Text Only",
-          "warn": 2
-        },
-        {
-          "aggregation": "Last",
-          "alias": "MONs out of Quorum",
-          "crit": 1.6,
-          "decimals": 2,
-          "displayAliasType": "Warning / Critical",
-          "displayType": "Annotation",
-          "displayValueWithAlias": "Never",
-          "expr": "count(ceph_mon_quorum_status) / sum(ceph_mon_quorum_status)",
-          "format": "time_series",
-          "intervalFactor": 1,
-          "legendFormat": "MONs out of Quorum",
-          "refId": "C",
-          "units": "none",
-          "valueHandler": "Number Threshold",
-          "warn": 1.1
-        }
-      ],
-      "title": "Monitors",
-      "type": "vonage-status-panel"
-    },
-    {
-      "colorMode": "Panel",
-      "colors": {
-        "crit": "rgba(245, 54, 54, 0.9)",
-        "disable": "rgba(128, 128, 128, 0.9)",
-        "ok": "rgba(50, 128, 45, 0.9)",
-        "warn": "rgba(237, 129, 40, 0.9)"
-      },
-      "cornerRadius": 0,
-      "datasource": "$datasource",
-      "displayName": "",
-      "flipCard": false,
-      "flipTime": 5,
-      "fontFormat": "Regular",
-      "gridPos": {
-        "h": 3,
-        "w": 2,
-        "x": 2,
-        "y": 3
-      },
-      "id": 68,
-      "isAutoScrollOnOverflow": false,
-      "isGrayOnNoData": false,
-      "isHideAlertsOnDisable": false,
-      "isIgnoreOKColors": false,
-      "links": [],
-      "targets": [
-        {
-          "aggregation": "Last",
-          "alias": "Active",
-          "decimals": 2,
-          "displayAliasType": "Always",
-          "displayType": "Regular",
-          "displayValueWithAlias": "When Alias Displayed",
-          "expr": "count(ceph_mgr_status == 1) or vector(0)",
-          "format": "time_series",
-          "intervalFactor": 1,
-          "legendFormat": "Active",
-          "refId": "A",
-          "units": "none",
-          "valueHandler": "Number Threshold"
-        },
-        {
-          "aggregation": "Last",
-          "alias": "Standby",
-          "decimals": 2,
-          "displayAliasType": "Always",
-          "displayType": "Regular",
-          "displayValueWithAlias": "When Alias Displayed",
-          "expr": "count(ceph_mgr_status == 0) or vector(0)",
-          "format": "time_series",
-          "intervalFactor": 1,
-          "legendFormat": "Standby",
-          "refId": "B",
-          "units": "none",
-          "valueHandler": "Number Threshold"
-        }
-      ],
-      "title": "MGRs",
-      "type": "vonage-status-panel"
-    },
     {
       "aliasColors": {},
       "bars": false,
     {
       "aliasColors": {},
       "bars": false,
         "h": 9,
         "w": 12,
         "x": 0,
         "h": 9,
         "w": 12,
         "x": 0,
-        "y": 6
+        "y": 9
       },
       "id": 45,
       "legend": {
       },
       "id": 45,
       "legend": {
         "h": 9,
         "w": 12,
         "x": 12,
         "h": 9,
         "w": 12,
         "x": 12,
-        "y": 6
+        "y": 9
       },
       "id": 62,
       "legend": {
       },
       "id": 62,
       "legend": {
index 93c51f00941072123cc56e7e7a7651b8f4432f22..7a5ac25917a07b7a812454bea678fb0faf2c2816 100644 (file)
                "show": true
             }
          ]
                "show": true
             }
          ]
+      },
+      {
+         "columns": [ ],
+         "datasource": "$datasource",
+         "description": "This table shows the 10 hosts with the highest number of slow ops",
+         "gridPos": {
+            "h": 8,
+            "w": 4,
+            "x": 0,
+            "y": 40
+         },
+         "id": 15,
+         "links": [ ],
+         "sort": {
+            "col": 2,
+            "desc": true
+         },
+         "styles": [
+            {
+               "alias": "Instance",
+               "colorMode": null,
+               "colors": [
+                  "rgba(245, 54, 54, 0.9)",
+                  "rgba(237, 129, 40, 0.89)",
+                  "rgba(50, 172, 45, 0.97)"
+               ],
+               "dateFormat": "YYYY-MM-DD HH:mm:ss",
+               "decimals": 2,
+               "mappingType": 1,
+               "pattern": "instance",
+               "thresholds": [ ],
+               "type": "string",
+               "unit": "short",
+               "valueMaps": [ ]
+            },
+            {
+               "alias": "Slow Ops",
+               "colorMode": null,
+               "colors": [
+                  "rgba(245, 54, 54, 0.9)",
+                  "rgba(237, 129, 40, 0.89)",
+                  "rgba(50, 172, 45, 0.97)"
+               ],
+               "dateFormat": "YYYY-MM-DD HH:mm:ss",
+               "decimals": 2,
+               "mappingType": 1,
+               "pattern": "Value",
+               "thresholds": [ ],
+               "type": "number",
+               "unit": "none",
+               "valueMaps": [ ]
+            },
+            {
+               "alias": "",
+               "colorMode": null,
+               "colors": [
+                  "rgba(245, 54, 54, 0.9)",
+                  "rgba(237, 129, 40, 0.89)",
+                  "rgba(50, 172, 45, 0.97)"
+               ],
+               "dateFormat": "YYYY-MM-DD HH:mm:ss",
+               "decimals": 2,
+               "mappingType": 1,
+               "pattern": "/.*/",
+               "thresholds": [ ],
+               "type": "hidden",
+               "unit": "short",
+               "valueMaps": [ ]
+            }
+         ],
+         "targets": [
+            {
+               "expr": "topk(10,\n  (sum by (instance)(ceph_daemon_health_metrics{type=\"SLOW_OPS\", ceph_daemon=~\"osd.*\"}))\n)\n",
+               "format": "table",
+               "instant": true,
+               "intervalFactor": 1,
+               "legendFormat": "",
+               "refId": "A"
+            }
+         ],
+         "timeFrom": null,
+         "timeShift": null,
+         "title": "Top Slow Ops per Host",
+         "transform": "table",
+         "type": "table"
       }
    ],
    "refresh": "30s",
       }
    ],
    "refresh": "30s",
             "multi": false,
             "name": "ceph_hosts",
             "options": [ ],
             "multi": false,
             "name": "ceph_hosts",
             "options": [ ],
-            "query": "label_values({}, instance)",
+            "query": "label_values(instance)",
             "refresh": 1,
             "regex": "([^.:]*).*",
             "sort": 3,
             "refresh": 1,
             "regex": "([^.:]*).*",
             "sort": 3,
index 5ea8955b29740c028a2edf3cea311b287f42e666..b34c6642263da46c6b5049b0f11b1fdde3c1cd91 100644 (file)
                "show": true
             }
          ]
                "show": true
             }
          ]
+      },
+      {
+         "columns": [ ],
+         "datasource": "$datasource",
+         "description": "This table shows the 10 OSDs with the highest number of slow ops",
+         "gridPos": {
+            "h": 8,
+            "w": 4,
+            "x": 0,
+            "y": 20
+         },
+         "id": 13,
+         "links": [ ],
+         "sort": {
+            "col": 2,
+            "desc": true
+         },
+         "styles": [
+            {
+               "alias": "OSD ID",
+               "colorMode": null,
+               "colors": [
+                  "rgba(245, 54, 54, 0.9)",
+                  "rgba(237, 129, 40, 0.89)",
+                  "rgba(50, 172, 45, 0.97)"
+               ],
+               "dateFormat": "YYYY-MM-DD HH:mm:ss",
+               "decimals": 2,
+               "mappingType": 1,
+               "pattern": "ceph_daemon",
+               "thresholds": [ ],
+               "type": "string",
+               "unit": "short",
+               "valueMaps": [ ]
+            },
+            {
+               "alias": "Slow Ops",
+               "colorMode": null,
+               "colors": [
+                  "rgba(245, 54, 54, 0.9)",
+                  "rgba(237, 129, 40, 0.89)",
+                  "rgba(50, 172, 45, 0.97)"
+               ],
+               "dateFormat": "YYYY-MM-DD HH:mm:ss",
+               "decimals": 2,
+               "mappingType": 1,
+               "pattern": "Value",
+               "thresholds": [ ],
+               "type": "number",
+               "unit": "none",
+               "valueMaps": [ ]
+            },
+            {
+               "alias": "",
+               "colorMode": null,
+               "colors": [
+                  "rgba(245, 54, 54, 0.9)",
+                  "rgba(237, 129, 40, 0.89)",
+                  "rgba(50, 172, 45, 0.97)"
+               ],
+               "dateFormat": "YYYY-MM-DD HH:mm:ss",
+               "decimals": 2,
+               "mappingType": 1,
+               "pattern": "/.*/",
+               "thresholds": [ ],
+               "type": "hidden",
+               "unit": "short",
+               "valueMaps": [ ]
+            }
+         ],
+         "targets": [
+            {
+               "expr": "topk(10,\n  (ceph_daemon_health_metrics{type=\"SLOW_OPS\", ceph_daemon=~\"osd.*\"})\n)\n",
+               "format": "table",
+               "instant": true,
+               "intervalFactor": 1,
+               "legendFormat": "",
+               "refId": "A"
+            }
+         ],
+         "timeFrom": null,
+         "timeShift": null,
+         "title": "Top Slow Ops",
+         "transform": "table",
+         "type": "table"
       }
    ],
    "refresh": "30s",
       }
    ],
    "refresh": "30s",
index 4332aac5ee502942652c645f945f999be5713039..77d69e4f31524d6502694752bb51283370e327a5 100644 (file)
          "steppedLine": false,
          "targets": [
             {
          "steppedLine": false,
          "targets": [
             {
-               "expr": "rate(ceph_rgw_get_initial_lat_sum{job=~\"$job\"}[$__rate_interval]) /\n  rate(ceph_rgw_get_initial_lat_count{job=~\"$job\"}[$__rate_interval]) *\n  on (instance_id) group_left (ceph_daemon) ceph_rgw_metadata{job=~\"$job\"}\n",
+               "expr": "label_replace(\n  rate(ceph_rgw_get_initial_lat_sum{job=~\"$job\"}[$__rate_interval]) /\n    rate(ceph_rgw_get_initial_lat_count{job=~\"$job\"}[$__rate_interval]) *\n    on (instance_id) group_left (ceph_daemon) ceph_rgw_metadata{job=~\"$job\"},\n  \"rgw_host\", \"$1\", \"ceph_daemon\", \"rgw.(.*)\"\n)\n",
                "format": "time_series",
                "intervalFactor": 1,
                "format": "time_series",
                "intervalFactor": 1,
-               "legendFormat": "GET AVG",
+               "legendFormat": "GET {{rgw_host}}",
                "refId": "A"
             },
             {
                "refId": "A"
             },
             {
-               "expr": "rate(ceph_rgw_put_initial_lat_sum{job=~\"$job\"}[$__rate_interval]) /\n  rate(ceph_rgw_put_initial_lat_count{job=~\"$job\"}[$__rate_interval]) *\n  on (instance_id) group_left (ceph_daemon) ceph_rgw_metadata{job=~\"$job\"}\n",
+               "expr": "label_replace(\n  rate(ceph_rgw_put_initial_lat_sum{job=~\"$job\"}[$__rate_interval]) /\n    rate(ceph_rgw_put_initial_lat_count{job=~\"$job\"}[$__rate_interval]) *\n    on (instance_id) group_left (ceph_daemon) ceph_rgw_metadata{job=~\"$job\"},\n  \"rgw_host\", \"$1\", \"ceph_daemon\", \"rgw.(.*)\"\n)\n",
                "format": "time_series",
                "intervalFactor": 1,
                "format": "time_series",
                "intervalFactor": 1,
-               "legendFormat": "PUT AVG",
+               "legendFormat": "PUT {{rgw_host}}",
                "refId": "B"
             }
          ],
          "thresholds": [ ],
          "timeFrom": null,
          "timeShift": null,
                "refId": "B"
             }
          ],
          "thresholds": [ ],
          "timeFrom": null,
          "timeShift": null,
-         "title": "Average GET/PUT Latencies",
+         "title": "Average GET/PUT Latencies by RGW Instance",
          "tooltip": {
             "shared": true,
             "sort": 0,
          "tooltip": {
             "shared": true,
             "sort": 0,
index 0430b39fc3674f39207fcbed6f76b68759ece17d..3c9d38d935ce69793a14c6dd8d69b7424464e3b0 100644 (file)
@@ -8,8 +8,8 @@
           "subdir": "grafonnet"
         }
       },
           "subdir": "grafonnet"
         }
       },
-      "version": "3626fc4dc2326931c530861ac5bebe39444f6cbf",
-      "sum": "gF8foHByYcB25jcUOBqP6jxk0OPifQMjPvKY0HaCk6w="
+      "version": "30280196507e0fe6fa978a3e0eaca3a62844f817",
+      "sum": "342u++/7rViR/zj2jeJOjshzglkZ1SY+hFNuyCBFMdc="
     }
   ],
   "legacyImports": false
     }
   ],
   "legacyImports": false
index bed89a8790648e7d10b70f31db33938783c67fd2..7977e4035ecb7b9ff054a1d0a09faa570e6bb791 100644 (file)
             description: '{{ $value }} OSD requests are taking too long to process (osd_op_complaint_time exceeded)',
           },
         },
             description: '{{ $value }} OSD requests are taking too long to process (osd_op_complaint_time exceeded)',
           },
         },
+        {
+          alert: 'CephDaemonSlowOps',
+          'for': '30s',
+          expr: 'ceph_daemon_health_metrics{type="SLOW_OPS"} > 0',
+          labels: { severity: 'warning', type: 'ceph_default' },
+          annotations: {
+            documentation: 'https://docs.ceph.com/en/latest/rados/operations/health-checks#slow-ops',
+            summary: '{{ $labels.ceph_daemon }} operations are slow to complete',
+            description: '{{ $labels.ceph_daemon }} operations are taking too long to process (complaint time exceeded)',
+          },
+        },
       ],
     },
     {
       ],
     },
     {
index a544d41eb0ee0ac15806a52c93ea5c36856c20cf..33a5c5059b89cebd56ef6cf0558816cb70f722b6 100644 (file)
@@ -518,7 +518,7 @@ groups:
         annotations:
           description: "Pool '{{ $labels.name }}' will be full in less than 5 days assuming the average fill-up rate of the past 48 hours."
           summary: "Pool growth rate may soon exceed capacity"
         annotations:
           description: "Pool '{{ $labels.name }}' will be full in less than 5 days assuming the average fill-up rate of the past 48 hours."
           summary: "Pool growth rate may soon exceed capacity"
-        expr: "(predict_linear(ceph_pool_percent_used[2d], 3600 * 24 * 5) * on(pool_id)    group_right ceph_pool_metadata) >= 95"
+        expr: "(predict_linear(ceph_pool_percent_used[2d], 3600 * 24 * 5) * on(pool_id, instance) group_right() ceph_pool_metadata) >= 95"
         labels:
           oid: "1.3.6.1.4.1.50495.1.2.1.9.2"
           severity: "warning"
         labels:
           oid: "1.3.6.1.4.1.50495.1.2.1.9.2"
           severity: "warning"
@@ -563,6 +563,16 @@ groups:
         labels:
           severity: "warning"
           type: "ceph_default"
         labels:
           severity: "warning"
           type: "ceph_default"
+      - alert: "CephDaemonSlowOps"
+        for: "30s"
+        expr: "ceph_daemon_health_metrics{type=\"SLOW_OPS\"} > 0"
+        labels: 
+          severity: 'warning'
+          type: 'ceph_default'
+        annotations:
+          summary: "{{ $labels.ceph_daemon }} operations are slow to complete"
+          description: "{{ $labels.ceph_daemon }} operations are taking too long to process (complaint time exceeded)"
+          documentation: "https://docs.ceph.com/en/latest/rados/operations/health-checks#slow-ops"
   - name: "cephadm"
     rules:
       - alert: "CephadmUpgradeFailed"
   - name: "cephadm"
     rules:
       - alert: "CephadmUpgradeFailed"
index 7b7e7db7301bddc9f0d55e2ca2b56198fb89652c..d68b43badf2b42784096e825a965bd2440267700 100644 (file)
@@ -679,6 +679,33 @@ tests:
            summary: OSD operations are slow to complete
            description: "1 OSD requests are taking too long to process (osd_op_complaint_time exceeded)"
 
            summary: OSD operations are slow to complete
            description: "1 OSD requests are taking too long to process (osd_op_complaint_time exceeded)"
 
+ # slow daemon ops
+ - interval : 1m
+   input_series:
+    - series: 'ceph_daemon_health_metrics{ceph_daemon="osd.1", instance="ceph:9283",job="ceph", type="SLOW_OPS"}'
+      values: '1+0x120'
+   promql_expr_test:
+     - expr: 'ceph_daemon_health_metrics{type="SLOW_OPS"} > 0'
+       eval_time: 1m
+       exp_samples:
+         - labels: '{__name__="ceph_daemon_health_metrics", ceph_daemon="osd.1",instance="ceph:9283",
+           job="ceph", type="SLOW_OPS"}'
+           value: 1
+   alert_rule_test:
+     - eval_time: 20m
+       alertname: CephDaemonSlowOps
+       exp_alerts:
+       - exp_labels:
+           instance: ceph:9283
+           ceph_daemon: "osd.1"
+           job: ceph
+           severity: warning
+           type: ceph_default
+         exp_annotations:
+           documentation: https://docs.ceph.com/en/latest/rados/operations/health-checks#slow-ops
+           summary: osd.1 operations are slow to complete
+           description: "osd.1 operations are taking too long to process (complaint time exceeded)"
+
 # CEPHADM orchestrator alert triggers
  - interval: 30s
    input_series:
 # CEPHADM orchestrator alert triggers
  - interval: 30s
    input_series:
@@ -1472,35 +1499,44 @@ tests:
    # trigger percent full prediction on pools 1 and 2 only
  - interval: 12h
    input_series:
    # trigger percent full prediction on pools 1 and 2 only
  - interval: 12h
    input_series:
-    - series: 'ceph_pool_percent_used{pool_id="1"}'
-      values: '70 75 80 87 92'
-    - series: 'ceph_pool_percent_used{pool_id="2"}'
+    - series: 'ceph_pool_percent_used{pool_id="1", instance="9090"}'
+      values: '1 1 1 1 1'
+    - series: 'ceph_pool_percent_used{pool_id="1", instance="8090"}'
+      values: '78 89 79 98 78'
+    - series: 'ceph_pool_percent_used{pool_id="2", instance="9090"}'
+      values: '1 1 1 1 1'
+    - series: 'ceph_pool_percent_used{pool_id="2", instance="8090"}'
       values: '22 22 23 23 24'
       values: '22 22 23 23 24'
-    - series: 'ceph_pool_metadata{pool_id="1",name="rbd",type="replicated"}'
+    - series: 'ceph_pool_metadata{pool_id="1" , instance="9090" ,name="rbd",type="replicated"}'
+      values: '1 1 1 1 1'
+    - series: 'ceph_pool_metadata{pool_id="1", instance="8090",name="default.rgw.index",type="replicated"}'
+      values: '1 1 1 1 1'
+    - series: 'ceph_pool_metadata{pool_id="2" , instance="9090" ,name="rbd",type="replicated"}'
       values: '1 1 1 1 1'
       values: '1 1 1 1 1'
-    - series: 'ceph_pool_metadata{pool_id="2",name="default.rgw.index",type="replicated"}'
+    - series: 'ceph_pool_metadata{pool_id="2", instance="8090",name="default.rgw.index",type="replicated"}'
       values: '1 1 1 1 1'
    promql_expr_test:
      - expr: |
       values: '1 1 1 1 1'
    promql_expr_test:
      - expr: |
-         (predict_linear(ceph_pool_percent_used[2d], 3600 * 24 * 5) * on(pool_id)
-              group_right ceph_pool_metadata) >= 95
+         (predict_linear(ceph_pool_percent_used[2d], 3600 * 24 * 5) * on(pool_id, instance)
+              group_right() ceph_pool_metadata) >= 95
        eval_time: 36h
        exp_samples:
        eval_time: 36h
        exp_samples:
-         - labels: '{name="rbd",pool_id="1",type="replicated"}'
-           value: 1.424E+02 # 142%
+         - labels: '{instance="8090",name="default.rgw.index",pool_id="1",type="replicated"}'
+           value: 1.435E+02 # 142%
    alert_rule_test:
     - eval_time: 48h
       alertname: CephPoolGrowthWarning
       exp_alerts:
       - exp_labels:
    alert_rule_test:
     - eval_time: 48h
       alertname: CephPoolGrowthWarning
       exp_alerts:
       - exp_labels:
-          name: rbd
+          instance: 8090
+          name: default.rgw.index
           pool_id: 1
           severity: warning
           type: ceph_default
           oid: 1.3.6.1.4.1.50495.1.2.1.9.2
         exp_annotations:
           summary: Pool growth rate may soon exceed capacity
           pool_id: 1
           severity: warning
           type: ceph_default
           oid: 1.3.6.1.4.1.50495.1.2.1.9.2
         exp_annotations:
           summary: Pool growth rate may soon exceed capacity
-          description: Pool 'rbd' will be full in less than 5 days assuming the average fill-up rate of the past 48 hours.
+          description: Pool 'default.rgw.index' will be full in less than 5 days assuming the average fill-up rate of the past 48 hours.
  - interval: 1m
    input_series:
     - series: 'ceph_health_detail{name="POOL_BACKFILLFULL"}'
  - interval: 1m
    input_series:
     - series: 'ceph_health_detail{name="POOL_BACKFILLFULL"}'
index b095392a21bcf53bd6831fadc5ab527f96b41ee4..642e4397878287cd8a030cc44c1776b3a3009b26 100644 (file)
@@ -7,9 +7,9 @@ Scenario: "Test Average GET Latencies"
     | ceph_rgw_get_initial_lat_count{instance="127.0.0.1", instance_id="58892247", job="ceph"} | 20 60 80 |
     | ceph_rgw_metadata{ceph_daemon="rgw.foo", hostname="localhost", instance="127.0.0.1", instance_id="58892247", job="ceph"} | 1 1 1 |
   When interval is `30s`
     | ceph_rgw_get_initial_lat_count{instance="127.0.0.1", instance_id="58892247", job="ceph"} | 20 60 80 |
     | ceph_rgw_metadata{ceph_daemon="rgw.foo", hostname="localhost", instance="127.0.0.1", instance_id="58892247", job="ceph"} | 1 1 1 |
   When interval is `30s`
-  Then Grafana panel `Average GET/PUT Latencies` with legend `GET AVG` shows:
+  Then Grafana panel `Average GET/PUT Latencies by RGW Instance` with legend `GET {{rgw_host}}` shows:
     | metrics | values |
     | metrics | values |
-    | {ceph_daemon="rgw.foo",instance="127.0.0.1", instance_id="58892247", job="ceph"} | 1.5 |
+    | {ceph_daemon="rgw.foo", instance="127.0.0.1", instance_id="58892247", job="ceph", rgw_host="foo"} | 1.5 |
 
 Scenario: "Test Average PUT Latencies"
   Given the following series:
 
 Scenario: "Test Average PUT Latencies"
   Given the following series:
@@ -18,9 +18,9 @@ Scenario: "Test Average PUT Latencies"
     | ceph_rgw_put_initial_lat_count{instance="127.0.0.1", instance_id="58892247", job="ceph"} | 10 30 50 |
     | ceph_rgw_metadata{ceph_daemon="rgw.foo", hostname="localhost", instance="127.0.0.1", instance_id="58892247", job="ceph"} | 1 1 1 |
   When interval is `30s`
     | ceph_rgw_put_initial_lat_count{instance="127.0.0.1", instance_id="58892247", job="ceph"} | 10 30 50 |
     | ceph_rgw_metadata{ceph_daemon="rgw.foo", hostname="localhost", instance="127.0.0.1", instance_id="58892247", job="ceph"} | 1 1 1 |
   When interval is `30s`
-  Then Grafana panel `Average GET/PUT Latencies` with legend `PUT AVG` shows:
+  Then Grafana panel `Average GET/PUT Latencies by RGW Instance` with legend `PUT {{rgw_host}}` shows:
     | metrics | values |
     | metrics | values |
-    | {ceph_daemon="rgw.foo",instance="127.0.0.1", instance_id="58892247", job="ceph"} | 1 |
+    | {ceph_daemon="rgw.foo", instance="127.0.0.1", instance_id="58892247", job="ceph", rgw_host="foo"} | 1 |
 
 Scenario: "Test Total Requests/sec by RGW Instance"
   Given the following series:
 
 Scenario: "Test Total Requests/sec by RGW Instance"
   Given the following series:
index 821a5cd5640b732ee8339ee50a4a998ac80b9333..d0d97fc98b9da0466718c8cfc9d9781b0cecdea5 100644 (file)
@@ -1,9 +1,14 @@
 [tox]
 [tox]
-envlist = lint,jsonnet-{check,lint,fix},promql-query-{test,lint},alerts-check
+envlist =
+    lint,
+    jsonnet-{check,lint,fix},
+    jsonnet-bundler-{install,update},
+    promql-query-{test,lint},
+    alerts-check
 skipsdist = true
 
 [testenv:jsonnet-bundler-{install,update}]
 skipsdist = true
 
 [testenv:jsonnet-bundler-{install,update}]
-whitelist_externals =
+allowlist_externals =
     jb
 description =
     install: Install the jsonnet dependencies
     jb
 description =
     install: Install the jsonnet dependencies
@@ -14,7 +19,7 @@ commands =
 
 [testenv:jsonnet-{check,fix,lint}]
 basepython = python3
 
 [testenv:jsonnet-{check,fix,lint}]
 basepython = python3
-whitelist_externals =
+allowlist_externals =
     find
     jb
     jsonnet
     find
     jb
     jsonnet
@@ -51,7 +56,7 @@ deps =
     -rrequirements-lint.txt
 depends = grafonnet-check
 setenv =
     -rrequirements-lint.txt
 depends = grafonnet-check
 setenv =
-whitelist_externals =
+allowlist_externals =
   promtool
 commands =
     behave tests_dashboards/features 
   promtool
 commands =
     behave tests_dashboards/features 
@@ -61,7 +66,7 @@ deps =
     -rrequirements-alerts.txt
     pytest
 depends = grafonnet-check
     -rrequirements-alerts.txt
     pytest
 depends = grafonnet-check
-whitelist_externals =
+allowlist_externals =
   promtool
 commands =
     fix: jsonnet -J vendor -S alerts.jsonnet -o prometheus_alerts.yml
   promtool
 commands =
     fix: jsonnet -J vendor -S alerts.jsonnet -o prometheus_alerts.yml
index b8d4872ac0e152786f1cc81115da092da3fbd791..a8726141bc4742752219f9b7f0cb10fa1af768b2 100644 (file)
@@ -5,5 +5,5 @@ endif()
 
 if(WITH_TESTS)
   include(AddCephTest)
 
 if(WITH_TESTS)
   include(AddCephTest)
-  add_tox_test(qa TOX_ENVS py3 flake8 mypy deadsymlinks)
+  add_tox_test(qa TOX_ENVS flake8 mypy deadsymlinks)
 endif()
 endif()
diff --git a/ceph/qa/cephfs/overrides/ignorelist_health.yaml b/ceph/qa/cephfs/overrides/ignorelist_health.yaml
new file mode 100644 (file)
index 0000000..7f0d49e
--- /dev/null
@@ -0,0 +1,12 @@
+overrides:
+  ceph:
+    log-ignorelist:
+      - overall HEALTH_
+      - \(FS_DEGRADED\)
+      - \(MDS_FAILED\)
+      - \(MDS_DEGRADED\)
+      - \(FS_WITH_FAILED_MDS\)
+      - \(MDS_DAMAGE\)
+      - \(MDS_ALL_DOWN\)
+      - \(MDS_UP_LESS_THAN_MAX\)
+      - \(FS_INLINE_DATA_DEPRECATED\)
diff --git a/ceph/qa/cephfs/overrides/ignorelist_wrongly_marked_down.yaml b/ceph/qa/cephfs/overrides/ignorelist_wrongly_marked_down.yaml
new file mode 100644 (file)
index 0000000..41ba84f
--- /dev/null
@@ -0,0 +1,9 @@
+overrides:
+  ceph:
+    log-ignorelist:
+      - overall HEALTH_
+      - \(OSD_DOWN\)
+      - \(OSD_
+      - but it is still running
+# MDS daemon 'b' is not responding, replacing it as rank 0 with standby 'a'
+      - is not responding
diff --git a/ceph/qa/cephfs/overrides/whitelist_health.yaml b/ceph/qa/cephfs/overrides/whitelist_health.yaml
deleted file mode 100644 (file)
index 7f0d49e..0000000
+++ /dev/null
@@ -1,12 +0,0 @@
-overrides:
-  ceph:
-    log-ignorelist:
-      - overall HEALTH_
-      - \(FS_DEGRADED\)
-      - \(MDS_FAILED\)
-      - \(MDS_DEGRADED\)
-      - \(FS_WITH_FAILED_MDS\)
-      - \(MDS_DAMAGE\)
-      - \(MDS_ALL_DOWN\)
-      - \(MDS_UP_LESS_THAN_MAX\)
-      - \(FS_INLINE_DATA_DEPRECATED\)
diff --git a/ceph/qa/cephfs/overrides/whitelist_wrongly_marked_down.yaml b/ceph/qa/cephfs/overrides/whitelist_wrongly_marked_down.yaml
deleted file mode 100644 (file)
index 41ba84f..0000000
+++ /dev/null
@@ -1,9 +0,0 @@
-overrides:
-  ceph:
-    log-ignorelist:
-      - overall HEALTH_
-      - \(OSD_DOWN\)
-      - \(OSD_
-      - but it is still running
-# MDS daemon 'b' is not responding, replacing it as rank 0 with standby 'a'
-      - is not responding
index 2f5779b0e9c38e1395d4377e0d48519238c1ba87..1785089fb4b2e49b118b26cc6a440607b2049083 100644 (file)
@@ -7,5 +7,6 @@ overrides:
         osd debug verify missing on start: true
         osd debug verify cached snaps: true
         bluestore zero block detection: true
         osd debug verify missing on start: true
         osd debug verify cached snaps: true
         bluestore zero block detection: true
+        osd mclock override recovery settings: true
       mon:
         mon scrub interval: 300
       mon:
         mon scrub interval: 300
diff --git a/ceph/qa/distros/all/ubuntu_22.04.yaml b/ceph/qa/distros/all/ubuntu_22.04.yaml
new file mode 100644 (file)
index 0000000..6ff18ba
--- /dev/null
@@ -0,0 +1,2 @@
+os_type: ubuntu
+os_version: "22.04"
index 4a9578e60d4925b2ba209ca26c4ccbc76de625e2..4a76306f19d5994590a9f51458a424948dfbd896 100644 (file)
@@ -10,5 +10,5 @@ tasks:
     all:
     - sudo cp /etc/containers/registries.conf /etc/containers/registries.conf.backup
     - sudo dnf -y  module reset container-tools
     all:
     - sudo cp /etc/containers/registries.conf /etc/containers/registries.conf.backup
     - sudo dnf -y  module reset container-tools
-    - sudo dnf -y  module install container-tools
+    - sudo dnf -y  module install container-tools --allowerasing --nobest
     - sudo cp /etc/containers/registries.conf.backup /etc/containers/registries.conf
     - sudo cp /etc/containers/registries.conf.backup /etc/containers/registries.conf
index e50003ca8af0e24160de3b284afba53b1896ecc5..b06e1c87d7c20c1eed677d41e728e52c7e0da206 100644 (file)
@@ -10,7 +10,7 @@ tasks:
     all:
     - sudo cp /etc/containers/registries.conf /etc/containers/registries.conf.backup
     - sudo dnf -y  module reset container-tools
     all:
     - sudo cp /etc/containers/registries.conf /etc/containers/registries.conf.backup
     - sudo dnf -y  module reset container-tools
-    - sudo dnf -y  module install container-tools
+    - sudo dnf -y  module install container-tools --allowerasing --nobest
     - sudo cp /etc/containers/registries.conf.backup /etc/containers/registries.conf
     - sudo sed -i 's/runtime = "runc"/#runtime = "runc"/g' /usr/share/containers/containers.conf
     - sudo sed -i 's/#runtime = "crun"/runtime = "crun"/g' /usr/share/containers/containers.conf
     - sudo cp /etc/containers/registries.conf.backup /etc/containers/registries.conf
     - sudo sed -i 's/runtime = "runc"/#runtime = "runc"/g' /usr/share/containers/containers.conf
     - sudo sed -i 's/#runtime = "crun"/runtime = "crun"/g' /usr/share/containers/containers.conf
index a01eec9522853e0a730d6b89bab4fde602b6f1a0..01b1ad51ebb3a68889fed6c801f202793eba1ca7 100644 (file)
@@ -9,5 +9,5 @@ tasks:
     all:
     - sudo cp /etc/containers/registries.conf /etc/containers/registries.conf.backup
     - sudo dnf -y  module reset container-tools
     all:
     - sudo cp /etc/containers/registries.conf /etc/containers/registries.conf.backup
     - sudo dnf -y  module reset container-tools
-    - sudo dnf -y  module install container-tools:3.0
+    - sudo dnf -y  module install container-tools:3.0 --allowerasing --nobest
     - sudo cp /etc/containers/registries.conf.backup /etc/containers/registries.conf
     - sudo cp /etc/containers/registries.conf.backup /etc/containers/registries.conf
index fdce9e83749f2ef99985655ec87f805d00525ad7..741868eb4f66118871dd4dcaf477549f0075bcee 100644 (file)
@@ -9,5 +9,5 @@ tasks:
     all:
     - sudo cp /etc/containers/registries.conf /etc/containers/registries.conf.backup
     - sudo dnf -y  module reset container-tools
     all:
     - sudo cp /etc/containers/registries.conf /etc/containers/registries.conf.backup
     - sudo dnf -y  module reset container-tools
-    - sudo dnf -y  module install container-tools:rhel8
+    - sudo dnf -y  module install container-tools:rhel8 --allowerasing --nobest
     - sudo cp /etc/containers/registries.conf.backup /etc/containers/registries.conf
     - sudo cp /etc/containers/registries.conf.backup /etc/containers/registries.conf
index 4a9578e60d4925b2ba209ca26c4ccbc76de625e2..4a76306f19d5994590a9f51458a424948dfbd896 100644 (file)
@@ -10,5 +10,5 @@ tasks:
     all:
     - sudo cp /etc/containers/registries.conf /etc/containers/registries.conf.backup
     - sudo dnf -y  module reset container-tools
     all:
     - sudo cp /etc/containers/registries.conf /etc/containers/registries.conf.backup
     - sudo dnf -y  module reset container-tools
-    - sudo dnf -y  module install container-tools
+    - sudo dnf -y  module install container-tools --allowerasing --nobest
     - sudo cp /etc/containers/registries.conf.backup /etc/containers/registries.conf
     - sudo cp /etc/containers/registries.conf.backup /etc/containers/registries.conf
index a01eec9522853e0a730d6b89bab4fde602b6f1a0..01b1ad51ebb3a68889fed6c801f202793eba1ca7 100644 (file)
@@ -9,5 +9,5 @@ tasks:
     all:
     - sudo cp /etc/containers/registries.conf /etc/containers/registries.conf.backup
     - sudo dnf -y  module reset container-tools
     all:
     - sudo cp /etc/containers/registries.conf /etc/containers/registries.conf.backup
     - sudo dnf -y  module reset container-tools
-    - sudo dnf -y  module install container-tools:3.0
+    - sudo dnf -y  module install container-tools:3.0 --allowerasing --nobest
     - sudo cp /etc/containers/registries.conf.backup /etc/containers/registries.conf
     - sudo cp /etc/containers/registries.conf.backup /etc/containers/registries.conf
index fdce9e83749f2ef99985655ec87f805d00525ad7..741868eb4f66118871dd4dcaf477549f0075bcee 100644 (file)
@@ -9,5 +9,5 @@ tasks:
     all:
     - sudo cp /etc/containers/registries.conf /etc/containers/registries.conf.backup
     - sudo dnf -y  module reset container-tools
     all:
     - sudo cp /etc/containers/registries.conf /etc/containers/registries.conf.backup
     - sudo dnf -y  module reset container-tools
-    - sudo dnf -y  module install container-tools:rhel8
+    - sudo dnf -y  module install container-tools:rhel8 --allowerasing --nobest
     - sudo cp /etc/containers/registries.conf.backup /etc/containers/registries.conf
     - sudo cp /etc/containers/registries.conf.backup /etc/containers/registries.conf
diff --git a/ceph/qa/overrides/ignorelist_wrongly_marked_down.yaml b/ceph/qa/overrides/ignorelist_wrongly_marked_down.yaml
new file mode 100644 (file)
index 0000000..2ce7ffd
--- /dev/null
@@ -0,0 +1,10 @@
+overrides:
+  ceph:
+    log-ignorelist:
+    - but it is still running
+    conf:
+      mds:
+        debug mds: 20
+        debug ms: 1
+      client:
+        debug client: 10
\ No newline at end of file
diff --git a/ceph/qa/overrides/whitelist_wrongly_marked_down.yaml b/ceph/qa/overrides/whitelist_wrongly_marked_down.yaml
deleted file mode 100644 (file)
index 2ce7ffd..0000000
+++ /dev/null
@@ -1,10 +0,0 @@
-overrides:
-  ceph:
-    log-ignorelist:
-    - but it is still running
-    conf:
-      mds:
-        debug mds: 20
-        debug ms: 1
-      client:
-        debug client: 10
\ No newline at end of file
index 4393c7c866c575c3c84e2db602c3fbc078fb9305..48afff879f53b920da04b89083cee8b6ae493549 100644 (file)
@@ -33,7 +33,7 @@ PROGNAME=$(basename $0)
 
 # xfstests is downloaded from this git repository and then built.
 # XFSTESTS_REPO="git://oss.sgi.com/xfs/cmds/xfstests.git"
 
 # xfstests is downloaded from this git repository and then built.
 # XFSTESTS_REPO="git://oss.sgi.com/xfs/cmds/xfstests.git"
-XFSTESTS_REPO="git://git.ceph.com/xfstests.git"
+XFSTESTS_REPO="git://git.kernel.org/pub/scm/fs/xfs/xfstests-dev.git"
 
 # Default command line option values
 COUNT="1"
 
 # Default command line option values
 COUNT="1"
@@ -277,7 +277,7 @@ function install_xfstests() {
 
        git clone "${XFSTESTS_REPO}"
 
 
        git clone "${XFSTESTS_REPO}"
 
-       cd xfstests
+       cd xfstests-dev
 
        # FIXME: use an older version before the tests were rearranged!
        git reset --hard e5f1a13792f20cfac097fef98007610b422f2cac
 
        # FIXME: use an older version before the tests were rearranged!
        git reset --hard e5f1a13792f20cfac097fef98007610b422f2cac
@@ -296,7 +296,7 @@ function install_xfstests() {
 function remove_xfstests() {
        arg_count 0 $#
 
 function remove_xfstests() {
        arg_count 0 $#
 
-       rm -rf "${TESTDIR}/xfstests"
+       rm -rf "${TESTDIR}/xfstests-dev"
        rm -rf "${XFSTESTS_DIR}"
 }
 
        rm -rf "${XFSTESTS_DIR}"
 }
 
index 4849a6c1ef57e88b99814a0e6cc865f14370a7be..651c754014ac83537f2232630da98ffc88411dee 100644 (file)
@@ -12,7 +12,7 @@ SCRIPT="run_xfstests-obsolete.sh"
 
 cd "${TESTDIR}"
 
 
 cd "${TESTDIR}"
 
-wget -O "${SCRIPT}" "${URL_BASE}/${SCRIPT}"
+curl -O "${URL_BASE}/${SCRIPT}"
 # mark executable only if the file isn't empty since ./"${SCRIPT}"
 # on an empty file would succeed
 if [[ -s "${SCRIPT}" ]]; then
 # mark executable only if the file isn't empty since ./"${SCRIPT}"
 # on an empty file would succeed
 if [[ -s "${SCRIPT}" ]]; then
index 0901815ee9bb2282670602f5edd8584216b29125..66a9dca54e041abcf69ec8f0e46b44538fd0657a 100755 (executable)
@@ -496,7 +496,7 @@ function test_run_mon() {
 
     setup $dir || return 1
 
 
     setup $dir || return 1
 
-    run_mon $dir a --mon-initial-members=a || return 1
+    run_mon $dir a || return 1
     ceph mon dump | grep "mon.a" || return 1
     kill_daemons $dir || return 1
 
     ceph mon dump | grep "mon.a" || return 1
     kill_daemons $dir || return 1
 
@@ -754,24 +754,14 @@ function test_run_osd() {
     echo "$backfills" | grep --quiet 'osd_max_backfills' || return 1
 
     run_osd $dir 1 --osd-max-backfills 20 || return 1
     echo "$backfills" | grep --quiet 'osd_max_backfills' || return 1
 
     run_osd $dir 1 --osd-max-backfills 20 || return 1
-    local scheduler=$(get_op_scheduler 1)
     local backfills=$(CEPH_ARGS='' ceph --format=json daemon $(get_asok_path osd.1) \
         config get osd_max_backfills)
     local backfills=$(CEPH_ARGS='' ceph --format=json daemon $(get_asok_path osd.1) \
         config get osd_max_backfills)
-    if [ "$scheduler" = "mclock_scheduler" ]; then
-      test "$backfills" = '{"osd_max_backfills":"1000"}' || return 1
-    else
-      test "$backfills" = '{"osd_max_backfills":"20"}' || return 1
-    fi
+    test "$backfills" = '{"osd_max_backfills":"20"}' || return 1
 
     CEPH_ARGS="$CEPH_ARGS --osd-max-backfills 30" run_osd $dir 2 || return 1
 
     CEPH_ARGS="$CEPH_ARGS --osd-max-backfills 30" run_osd $dir 2 || return 1
-    local scheduler=$(get_op_scheduler 2)
     local backfills=$(CEPH_ARGS='' ceph --format=json daemon $(get_asok_path osd.2) \
         config get osd_max_backfills)
     local backfills=$(CEPH_ARGS='' ceph --format=json daemon $(get_asok_path osd.2) \
         config get osd_max_backfills)
-    if [ "$scheduler" = "mclock_scheduler" ]; then
-      test "$backfills" = '{"osd_max_backfills":"1000"}' || return 1
-    else
-      test "$backfills" = '{"osd_max_backfills":"30"}' || return 1
-    fi
+    test "$backfills" = '{"osd_max_backfills":"30"}' || return 1
 
     teardown $dir || return 1
 }
 
     teardown $dir || return 1
 }
@@ -906,14 +896,9 @@ function test_activate_osd() {
     kill_daemons $dir TERM osd || return 1
 
     activate_osd $dir 0 --osd-max-backfills 20 || return 1
     kill_daemons $dir TERM osd || return 1
 
     activate_osd $dir 0 --osd-max-backfills 20 || return 1
-    local scheduler=$(get_op_scheduler 0)
     local backfills=$(CEPH_ARGS='' ceph --format=json daemon $(get_asok_path osd.0) \
         config get osd_max_backfills)
     local backfills=$(CEPH_ARGS='' ceph --format=json daemon $(get_asok_path osd.0) \
         config get osd_max_backfills)
-    if [ "$scheduler" = "mclock_scheduler" ]; then
-      test "$backfills" = '{"osd_max_backfills":"1000"}' || return 1
-    else
-      test "$backfills" = '{"osd_max_backfills":"20"}' || return 1
-    fi
+    test "$backfills" = '{"osd_max_backfills":"20"}' || return 1
 
     teardown $dir || return 1
 }
 
     teardown $dir || return 1
 }
@@ -936,14 +921,9 @@ function test_activate_osd_after_mark_down() {
     wait_for_osd down 0 || return 1
 
     activate_osd $dir 0 --osd-max-backfills 20 || return 1
     wait_for_osd down 0 || return 1
 
     activate_osd $dir 0 --osd-max-backfills 20 || return 1
-    local scheduler=$(get_op_scheduler 0)
     local backfills=$(CEPH_ARGS='' ceph --format=json daemon $(get_asok_path osd.0) \
         config get osd_max_backfills)
     local backfills=$(CEPH_ARGS='' ceph --format=json daemon $(get_asok_path osd.0) \
         config get osd_max_backfills)
-    if [ "$scheduler" = "mclock_scheduler" ]; then
-      test "$backfills" = '{"osd_max_backfills":"1000"}' || return 1
-    else
-      test "$backfills" = '{"osd_max_backfills":"20"}' || return 1
-    fi
+    test "$backfills" = '{"osd_max_backfills":"20"}' || return 1
 
     teardown $dir || return 1
 }
 
     teardown $dir || return 1
 }
index e08c68377f6977d5438815449e1519981abd455b..85c2763307f5b50243baebac04925d45045f0aec 100755 (executable)
@@ -27,6 +27,7 @@ function run() {
     CEPH_ARGS+="--fsid=$(uuidgen) --auth-supported=none "
     CEPH_ARGS+="--mon-host=$CEPH_MON "
     CEPH_ARGS+="--osd-mclock-profile=high_recovery_ops "
     CEPH_ARGS+="--fsid=$(uuidgen) --auth-supported=none "
     CEPH_ARGS+="--mon-host=$CEPH_MON "
     CEPH_ARGS+="--osd-mclock-profile=high_recovery_ops "
+    CEPH_ARGS+="--osd_mclock_override_recovery_settings=true "
 
     local funcs=${@:-$(set | sed -n -e 's/^\(TEST_[0-9a-z_]*\) .*/\1/p')}
     for func in $funcs ; do
 
     local funcs=${@:-$(set | sed -n -e 's/^\(TEST_[0-9a-z_]*\) .*/\1/p')}
     for func in $funcs ; do
diff --git a/ceph/qa/standalone/misc/mclock-config.sh b/ceph/qa/standalone/misc/mclock-config.sh
new file mode 100755 (executable)
index 0000000..17260b1
--- /dev/null
@@ -0,0 +1,314 @@
+#!/usr/bin/env bash
+#
+# Copyright (C) 2022 Red Hat <contact@redhat.com>
+#
+# Author: Sridhar Seshasayee <sseshasa@redhat.com>
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU Library Public License as published by
+# the Free Software Foundation; either version 2, or (at your option)
+# any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU Library Public License for more details.
+#
+
+source $CEPH_ROOT/qa/standalone/ceph-helpers.sh
+
+function run() {
+    local dir=$1
+    shift
+
+    export CEPH_MON="127.0.0.1:7124" # git grep '\<7124\>' : there must be only one
+    export CEPH_ARGS
+    CEPH_ARGS+="--fsid=$(uuidgen) --auth-supported=none "
+    CEPH_ARGS+="--mon-host=$CEPH_MON "
+    CEPH_ARGS+="--debug-mclock 20 "
+
+    local funcs=${@:-$(set | sed -n -e 's/^\(TEST_[0-9a-z_]*\) .*/\1/p')}
+    for func in $funcs ; do
+        setup $dir || return 1
+        $func $dir || return 1
+        teardown $dir || return 1
+    done
+}
+
+function TEST_profile_builtin_to_custom() {
+    local dir=$1
+    local OSDS=3
+
+    setup $dir || return 1
+    run_mon $dir a --osd_pool_default_size=$OSDS || return 1
+    run_mgr $dir x || return 1
+    for osd in $(seq 0 $(expr $OSDS - 1))
+    do
+      run_osd $dir $osd --osd_op_queue=mclock_scheduler || return 1
+    done
+
+    # Verify that the default mclock profile is set on the OSDs
+    for id in $(seq 0 $(expr $OSDS - 1))
+    do
+      local mclock_profile=$(ceph config get osd.$id osd_mclock_profile)
+      test "$mclock_profile" = "high_client_ops" || return 1
+    done
+
+    # Change the mclock profile to 'custom'
+    ceph config set osd osd_mclock_profile custom || return 1
+
+    # Verify that the mclock profile is set to 'custom' on the OSDs
+    for id in $(seq 0 $(expr $OSDS - 1))
+    do
+      local mclock_profile=$(ceph config get osd.$id osd_mclock_profile)
+      test "$mclock_profile" = "custom" || return 1
+    done
+
+    # Change a mclock config param and confirm the change
+    local client_res=$(CEPH_ARGS='' ceph --format=json daemon $(get_asok_path \
+      osd.$id) config get osd_mclock_scheduler_client_res | \
+      jq .osd_mclock_scheduler_client_res | bc)
+    echo "client_res = $client_res"
+    local client_res_new=$(expr $client_res + 10)
+    echo "client_res_new = $client_res_new"
+    ceph config set osd osd_mclock_scheduler_client_res \
+      $client_res_new || return 1
+    for id in $(seq 0 $(expr $OSDS - 1))
+    do
+      # Check value in config monitor db
+      local res=$(ceph config get osd.$id \
+        osd_mclock_scheduler_client_res) || return 1
+      test $res -eq $client_res_new || return 1
+      # Check value in the in-memory 'values' map
+      res=$(CEPH_ARGS='' ceph --format=json daemon $(get_asok_path \
+        osd.$id) config get osd_mclock_scheduler_client_res | \
+        jq .osd_mclock_scheduler_client_res | bc)
+      test $res -eq $client_res_new || return 1
+    done
+
+    teardown $dir || return 1
+}
+
+function TEST_profile_custom_to_builtin() {
+    local dir=$1
+    local OSDS=3
+
+    setup $dir || return 1
+    run_mon $dir a --osd_pool_default_size=$OSDS || return 1
+    run_mgr $dir x || return 1
+    for osd in $(seq 0 $(expr $OSDS - 1))
+    do
+      run_osd $dir $osd --osd_op_queue=mclock_scheduler || return 1
+    done
+
+    # Verify that the default mclock profile is set on the OSDs
+    for id in $(seq 0 $(expr $OSDS - 1))
+    do
+      local mclock_profile=$(ceph config get osd.$id osd_mclock_profile)
+      test "$mclock_profile" = "high_client_ops" || return 1
+    done
+
+    # Change the mclock profile to 'custom'
+    ceph config set osd osd_mclock_profile custom || return 1
+
+    # Verify that the mclock profile is set to 'custom' on the OSDs
+    for id in $(seq 0 $(expr $OSDS - 1))
+    do
+      local mclock_profile=$(ceph config get osd.$id osd_mclock_profile)
+      test "$mclock_profile" = "custom" || return 1
+    done
+
+    # Save the original client reservations allocated to the OSDs
+    local client_res=()
+    for id in $(seq 0 $(expr $OSDS - 1))
+    do
+      client_res+=( $(CEPH_ARGS='' ceph --format=json daemon $(get_asok_path \
+        osd.$id) config get osd_mclock_scheduler_client_res | \
+        jq .osd_mclock_scheduler_client_res | bc) )
+      echo "Original client_res for osd.$id = ${client_res[$id]}"
+    done
+
+    # Change a mclock config param and confirm the change
+    local client_res_new=$(expr ${client_res[0]} + 10)
+    echo "client_res_new = $client_res_new"
+    ceph config set osd osd_mclock_scheduler_client_res \
+      $client_res_new || return 1
+    for id in $(seq 0 $(expr $OSDS - 1))
+    do
+      # Check value in config monitor db
+      local res=$(ceph config get osd.$id \
+        osd_mclock_scheduler_client_res) || return 1
+      test $res -eq $client_res_new || return 1
+      # Check value in the in-memory 'values' map
+      res=$(CEPH_ARGS='' ceph --format=json daemon $(get_asok_path \
+        osd.$id) config get osd_mclock_scheduler_client_res | \
+        jq .osd_mclock_scheduler_client_res | bc)
+      test $res -eq $client_res_new || return 1
+    done
+
+    # Switch the mclock profile back to the original built-in profile.
+    # The config subsystem prevents the overwrite of the changed QoS config
+    # option above i.e. osd_mclock_scheduler_client_res. This fact is verified
+    # before proceeding to remove the entry from the config monitor db. After
+    # the config entry is removed, the original value for the config option is
+    # restored and is verified.
+    ceph config set osd osd_mclock_profile high_client_ops || return 1
+    # Verify that the mclock profile is set to 'high_client_ops' on the OSDs
+    for id in $(seq 0 $(expr $OSDS - 1))
+    do
+      local mclock_profile=$(ceph config get osd.$id osd_mclock_profile)
+      test "$mclock_profile" = "high_client_ops" || return 1
+    done
+
+    # Verify that the new value is still in effect
+    for id in $(seq 0 $(expr $OSDS - 1))
+    do
+      # Check value in config monitor db
+      local res=$(ceph config get osd.$id \
+        osd_mclock_scheduler_client_res) || return 1
+      test $res -eq $client_res_new || return 1
+      # Check value in the in-memory 'values' map
+      res=$(CEPH_ARGS='' ceph --format=json daemon $(get_asok_path \
+        osd.$id) config get osd_mclock_scheduler_client_res | \
+        jq .osd_mclock_scheduler_client_res | bc)
+      test $res -eq $client_res_new || return 1
+    done
+
+    # Remove the changed QoS config option from monitor db
+    ceph config rm osd osd_mclock_scheduler_client_res || return 1
+
+    # Verify that the original values are now restored
+    for id in $(seq 0 $(expr $OSDS - 1))
+    do
+      # Check value in the in-memory 'values' map
+      res=$(CEPH_ARGS='' ceph --format=json daemon $(get_asok_path \
+        osd.$id) config get osd_mclock_scheduler_client_res | \
+        jq .osd_mclock_scheduler_client_res | bc)
+      test $res -eq ${client_res[$id]} || return 1
+    done
+
+    teardown $dir || return 1
+}
+
+function TEST_recovery_limit_adjustment_mclock() {
+    local dir=$1
+
+    setup $dir || return 1
+    run_mon $dir a || return 1
+    run_mgr $dir x || return 1
+
+    run_osd $dir 0 --osd_op_queue=mclock_scheduler || return 1
+    local recoveries=$(CEPH_ARGS='' ceph --format=json daemon $(get_asok_path osd.0) \
+        config get osd_recovery_max_active)
+    # Get default value
+    echo "$recoveries" | grep --quiet 'osd_recovery_max_active' || return 1
+
+    # Change the recovery limit without setting
+    # osd_mclock_override_recovery_settings option. Verify that the recovery
+    # limit is retained at its default value.
+    ceph config set osd.0 osd_recovery_max_active 10 || return 1
+    sleep 2 # Allow time for change to take effect
+    local max_recoveries=$(CEPH_ARGS='' ceph --format=json daemon $(get_asok_path osd.0) \
+        config get osd_recovery_max_active)
+    test "$max_recoveries" = "$recoveries" || return 1
+
+    # Change recovery limit after setting osd_mclock_override_recovery_settings.
+    # Verify that the recovery limit is modified.
+    ceph config set osd.0 osd_mclock_override_recovery_settings true || return 1
+    ceph config set osd.0 osd_recovery_max_active 10 || return 1
+    sleep 2 # Allow time for change to take effect
+    max_recoveries=$(CEPH_ARGS='' ceph --format=json daemon $(get_asok_path osd.0) \
+        config get osd_recovery_max_active)
+    test "$max_recoveries" = '{"osd_recovery_max_active":"10"}' || return 1
+
+    teardown $dir || return 1
+}
+
+function TEST_backfill_limit_adjustment_mclock() {
+    local dir=$1
+
+    setup $dir || return 1
+    run_mon $dir a || return 1
+    run_mgr $dir x || return 1
+
+    run_osd $dir 0 --osd_op_queue=mclock_scheduler || return 1
+    local backfills=$(CEPH_ARGS='' ceph --format=json daemon $(get_asok_path osd.0) \
+        config get osd_max_backfills)
+    # Get default value
+    echo "$backfills" | grep --quiet 'osd_max_backfills' || return 1
+
+    # Change the backfill limit without setting
+    # osd_mclock_override_recovery_settings option. Verify that the backfill
+    # limit is retained at its default value.
+    ceph config set osd.0 osd_max_backfills 20 || return 1
+    sleep 2 # Allow time for change to take effect
+    local max_backfills=$(CEPH_ARGS='' ceph --format=json daemon $(get_asok_path osd.0) \
+        config get osd_max_backfills)
+    test "$max_backfills" = "$backfills" || return 1
+
+    # Change backfills limit after setting osd_mclock_override_recovery_settings.
+    # Verify that the backfills limit is modified.
+    ceph config set osd.0 osd_mclock_override_recovery_settings true || return 1
+    ceph config set osd.0 osd_max_backfills 20 || return 1
+    sleep 2 # Allow time for change to take effect
+    max_backfills=$(CEPH_ARGS='' ceph --format=json daemon $(get_asok_path osd.0) \
+        config get osd_max_backfills)
+    test "$max_backfills" =  '{"osd_max_backfills":"20"}' || return 1
+
+    teardown $dir || return 1
+}
+
+function TEST_profile_disallow_builtin_params_modify() {
+    local dir=$1
+
+    setup $dir || return 1
+    run_mon $dir a || return 1
+    run_mgr $dir x || return 1
+
+    run_osd $dir 0 --osd_op_queue=mclock_scheduler || return 1
+
+    # Verify that the default mclock profile is set on the OSD
+    local mclock_profile=$(ceph config get osd.0 osd_mclock_profile)
+    test "$mclock_profile" = "high_client_ops" || return 1
+
+    declare -a options=("osd_mclock_scheduler_background_recovery_res"
+      "osd_mclock_scheduler_client_res")
+
+    for opt in "${options[@]}"
+    do
+      # Try and change a mclock config param and confirm that no change occurred
+      local opt_val_orig=$(CEPH_ARGS='' ceph --format=json daemon \
+        $(get_asok_path osd.0) config get $opt | jq .$opt | bc)
+      local opt_val_new=$(expr $opt_val_orig + 10)
+      ceph config set osd.0 $opt $opt_val_new || return 1
+      sleep 2 # Allow time for changes to take effect
+
+      # Check configuration value on Mon store (or the default) for the osd
+      local res=$(ceph config get osd.0 $opt) || return 1
+      echo "Mon db (or default): osd.0 $opt = $res"
+      test $res -ne $opt_val_new || return 1
+
+      # Check running configuration value using "config show" cmd
+      res=$(ceph config show osd.0 | grep $opt |\
+        awk '{ print $2 }' | bc ) || return 1
+      echo "Running config: osd.0 $opt = $res"
+      test $res -ne $opt_val_new || return 1
+      test $res -eq $opt_val_orig || return 1
+
+      # Check value in the in-memory 'values' map is unmodified
+      res=$(CEPH_ARGS='' ceph --format=json daemon $(get_asok_path \
+        osd.0) config get $opt | jq .$opt | bc)
+      echo "Values map: osd.0 $opt = $res"
+      test $res -ne $opt_val_new || return 1
+      test $res -eq $opt_val_orig || return 1
+    done
+
+    teardown $dir || return 1
+}
+
+main mclock-config "$@"
+
+# Local Variables:
+# compile-command: "cd build ; make -j4 && \
+#   ../qa/run-standalone.sh mclock-config.sh"
+# End:
diff --git a/ceph/qa/standalone/misc/test-mclock-profile-switch.sh b/ceph/qa/standalone/misc/test-mclock-profile-switch.sh
deleted file mode 100644 (file)
index 1bbd6ee..0000000
+++ /dev/null
@@ -1,198 +0,0 @@
-#!/usr/bin/env bash
-#
-# Copyright (C) 2022 Red Hat <contact@redhat.com>
-#
-# Author: Sridhar Seshasayee <sseshasa@redhat.com>
-#
-# This program is free software; you can redistribute it and/or modify
-# it under the terms of the GNU Library Public License as published by
-# the Free Software Foundation; either version 2, or (at your option)
-# any later version.
-#
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-# GNU Library Public License for more details.
-#
-
-source $CEPH_ROOT/qa/standalone/ceph-helpers.sh
-
-function run() {
-    local dir=$1
-    shift
-
-    export CEPH_MON="127.0.0.1:7124" # git grep '\<7124\>' : there must be only one
-    export CEPH_ARGS
-    CEPH_ARGS+="--fsid=$(uuidgen) --auth-supported=none "
-    CEPH_ARGS+="--mon-host=$CEPH_MON "
-    CEPH_ARGS+="--debug-bluestore 20 "
-
-    local funcs=${@:-$(set | sed -n -e 's/^\(TEST_[0-9a-z_]*\) .*/\1/p')}
-    for func in $funcs ; do
-        setup $dir || return 1
-        $func $dir || return 1
-        teardown $dir || return 1
-    done
-}
-
-function TEST_profile_builtin_to_custom() {
-    local dir=$1
-    local OSDS=3
-
-    setup $dir || return 1
-    run_mon $dir a --osd_pool_default_size=$OSDS || return 1
-    run_mgr $dir x || return 1
-    for osd in $(seq 0 $(expr $OSDS - 1))
-    do
-      run_osd $dir $osd --osd_op_queue=mclock_scheduler || return 1
-    done
-
-    # Verify that the default mclock profile is set on the OSDs
-    for id in $(seq 0 $(expr $OSDS - 1))
-    do
-      local mclock_profile=$(ceph config get osd.$id osd_mclock_profile)
-      test "$mclock_profile" = "high_client_ops" || return 1
-    done
-
-    # Change the mclock profile to 'custom'
-    ceph config set osd osd_mclock_profile custom || return 1
-
-    # Verify that the mclock profile is set to 'custom' on the OSDs
-    for id in $(seq 0 $(expr $OSDS - 1))
-    do
-      local mclock_profile=$(ceph config get osd.$id osd_mclock_profile)
-      test "$mclock_profile" = "custom" || return 1
-    done
-
-    # Change a mclock config param and confirm the change
-    local client_res=$(CEPH_ARGS='' ceph --format=json daemon $(get_asok_path \
-      osd.$id) config get osd_mclock_scheduler_client_res | \
-      jq .osd_mclock_scheduler_client_res | bc)
-    echo "client_res = $client_res"
-    local client_res_new=$(expr $client_res + 10)
-    echo "client_res_new = $client_res_new"
-    ceph config set osd osd_mclock_scheduler_client_res \
-      $client_res_new || return 1
-    for id in $(seq 0 $(expr $OSDS - 1))
-    do
-      # Check value in config monitor db
-      local res=$(ceph config get osd.$id \
-        osd_mclock_scheduler_client_res) || return 1
-      test $res -eq $client_res_new || return 1
-      # Check value in the in-memory 'values' map
-      res=$(CEPH_ARGS='' ceph --format=json daemon $(get_asok_path \
-        osd.$id) config get osd_mclock_scheduler_client_res | \
-        jq .osd_mclock_scheduler_client_res | bc)
-      test $res -eq $client_res_new || return 1
-    done
-
-    teardown $dir || return 1
-}
-
-function TEST_profile_custom_to_builtin() {
-    local dir=$1
-    local OSDS=3
-
-    setup $dir || return 1
-    run_mon $dir a --osd_pool_default_size=$OSDS || return 1
-    run_mgr $dir x || return 1
-    for osd in $(seq 0 $(expr $OSDS - 1))
-    do
-      run_osd $dir $osd --osd_op_queue=mclock_scheduler || return 1
-    done
-
-    # Verify that the default mclock profile is set on the OSDs
-    for id in $(seq 0 $(expr $OSDS - 1))
-    do
-      local mclock_profile=$(ceph config get osd.$id osd_mclock_profile)
-      test "$mclock_profile" = "high_client_ops" || return 1
-    done
-
-    # Change the mclock profile to 'custom'
-    ceph config set osd osd_mclock_profile custom || return 1
-
-    # Verify that the mclock profile is set to 'custom' on the OSDs
-    for id in $(seq 0 $(expr $OSDS - 1))
-    do
-      local mclock_profile=$(ceph config get osd.$id osd_mclock_profile)
-      test "$mclock_profile" = "custom" || return 1
-    done
-
-    # Save the original client reservations allocated to the OSDs
-    local client_res=()
-    for id in $(seq 0 $(expr $OSDS - 1))
-    do
-      client_res+=( $(CEPH_ARGS='' ceph --format=json daemon $(get_asok_path \
-        osd.$id) config get osd_mclock_scheduler_client_res | \
-        jq .osd_mclock_scheduler_client_res | bc) )
-      echo "Original client_res for osd.$id = ${client_res[$id]}"
-    done
-
-    # Change a mclock config param and confirm the change
-    local client_res_new=$(expr ${client_res[0]} + 10)
-    echo "client_res_new = $client_res_new"
-    ceph config set osd osd_mclock_scheduler_client_res \
-      $client_res_new || return 1
-    for id in $(seq 0 $(expr $OSDS - 1))
-    do
-      # Check value in config monitor db
-      local res=$(ceph config get osd.$id \
-        osd_mclock_scheduler_client_res) || return 1
-      test $res -eq $client_res_new || return 1
-      # Check value in the in-memory 'values' map
-      res=$(CEPH_ARGS='' ceph --format=json daemon $(get_asok_path \
-        osd.$id) config get osd_mclock_scheduler_client_res | \
-        jq .osd_mclock_scheduler_client_res | bc)
-      test $res -eq $client_res_new || return 1
-    done
-
-    # Switch the mclock profile back to the original built-in profile.
-    # The config subsystem prevents the overwrite of the changed QoS config
-    # option above i.e. osd_mclock_scheduler_client_res. This fact is verified
-    # before proceeding to remove the entry from the config monitor db. After
-    # the config entry is removed, the original value for the config option is
-    # restored and is verified.
-    ceph config set osd osd_mclock_profile high_client_ops || return 1
-    # Verify that the mclock profile is set to 'high_client_ops' on the OSDs
-    for id in $(seq 0 $(expr $OSDS - 1))
-    do
-      local mclock_profile=$(ceph config get osd.$id osd_mclock_profile)
-      test "$mclock_profile" = "high_client_ops" || return 1
-    done
-
-    # Verify that the new value is still in effect
-    for id in $(seq 0 $(expr $OSDS - 1))
-    do
-      # Check value in config monitor db
-      local res=$(ceph config get osd.$id \
-        osd_mclock_scheduler_client_res) || return 1
-      test $res -eq $client_res_new || return 1
-      # Check value in the in-memory 'values' map
-      res=$(CEPH_ARGS='' ceph --format=json daemon $(get_asok_path \
-        osd.$id) config get osd_mclock_scheduler_client_res | \
-        jq .osd_mclock_scheduler_client_res | bc)
-      test $res -eq $client_res_new || return 1
-    done
-
-    # Remove the changed QoS config option from monitor db
-    ceph config rm osd osd_mclock_scheduler_client_res || return 1
-
-    # Verify that the original values are now restored
-    for id in $(seq 0 $(expr $OSDS - 1))
-    do
-      # Check value in the in-memory 'values' map
-      res=$(CEPH_ARGS='' ceph --format=json daemon $(get_asok_path \
-        osd.$id) config get osd_mclock_scheduler_client_res | \
-        jq .osd_mclock_scheduler_client_res | bc)
-      test $res -eq ${client_res[$id]} || return 1
-    done
-
-    teardown $dir || return 1
-}
-
-main test-mclock-profile-switch "$@"
-
-# Local Variables:
-# compile-command: "cd build ; make -j4 && \
-#   ../qa/run-standalone.sh test-mclock-profile-switch.sh"
-# End:
index 900501fa367365c38b60de08b81e403e36c67ea4..667d5f3e4ec061c0873694d234a19bfbd740abc9 100755 (executable)
@@ -169,7 +169,6 @@ function TEST_mon_features() {
     MONC=127.0.0.1:7129 # git grep '\<7129\>' ; there must be only one
     CEPH_ARGS_orig=$CEPH_ARGS
     CEPH_ARGS="--fsid=$fsid --auth-supported=none "
     MONC=127.0.0.1:7129 # git grep '\<7129\>' ; there must be only one
     CEPH_ARGS_orig=$CEPH_ARGS
     CEPH_ARGS="--fsid=$fsid --auth-supported=none "
-    CEPH_ARGS+="--mon-initial-members=a,b,c "
     CEPH_ARGS+="--mon-host=$MONA,$MONB,$MONC "
     CEPH_ARGS+="--mon-debug-no-initial-persistent-features "
     CEPH_ARGS+="--mon-debug-no-require-quincy "
     CEPH_ARGS+="--mon-host=$MONA,$MONB,$MONC "
     CEPH_ARGS+="--mon-debug-no-initial-persistent-features "
     CEPH_ARGS+="--mon-debug-no-require-quincy "
index b0a092a533abb6066c87d34d15bbb344319de4c3..41982b9160a9e083fd01ba6d207411c490b6ea9a 100755 (executable)
@@ -60,7 +60,6 @@ function TEST_mon_client_connect_fails() {
 
     # start the mon with a public-bind-addr that is different
     # from the public-addr.
 
     # start the mon with a public-bind-addr that is different
     # from the public-addr.
-    CEPH_ARGS+="--mon-initial-members=a "
     CEPH_ARGS+="--mon-host=${MON_IP}:${MONA_PUBLIC} "
     run_mon $dir a --mon-host=${MON_IP}:${MONA_PUBLIC} --public-bind-addr=${MON_IP}:${MONA_BIND} || return 1
 
     CEPH_ARGS+="--mon-host=${MON_IP}:${MONA_PUBLIC} "
     run_mon $dir a --mon-host=${MON_IP}:${MONA_PUBLIC} --public-bind-addr=${MON_IP}:${MONA_BIND} || return 1
 
@@ -74,7 +73,6 @@ function TEST_mon_client_connect() {
 
     # start the mon with a public-bind-addr that is different
     # from the public-addr.
 
     # start the mon with a public-bind-addr that is different
     # from the public-addr.
-    CEPH_ARGS+="--mon-initial-members=a "
     CEPH_ARGS+="--mon-host=${MON_IP}:${MONA_PUBLIC} "
     run_mon $dir a --mon-host=${MON_IP}:${MONA_PUBLIC} --public-bind-addr=${MON_IP}:${MONA_BIND} || return 1
 
     CEPH_ARGS+="--mon-host=${MON_IP}:${MONA_PUBLIC} "
     run_mon $dir a --mon-host=${MON_IP}:${MONA_PUBLIC} --public-bind-addr=${MON_IP}:${MONA_BIND} || return 1
 
@@ -90,7 +88,6 @@ function TEST_mon_quorum() {
 
     # start the mon with a public-bind-addr that is different
     # from the public-addr.
 
     # start the mon with a public-bind-addr that is different
     # from the public-addr.
-    CEPH_ARGS+="--mon-initial-members=a,b,c "
     CEPH_ARGS+="--mon-host=${MON_IP}:${MONA_PUBLIC},${MON_IP}:${MONB_PUBLIC},${MON_IP}:${MONC_PUBLIC} "
     run_mon $dir a --public-addr=${MON_IP}:${MONA_PUBLIC} --public-bind-addr=${MON_IP}:${MONA_BIND} || return 1
     run_mon $dir b --public-addr=${MON_IP}:${MONB_PUBLIC} --public-bind-addr=${MON_IP}:${MONB_BIND} || return 1
     CEPH_ARGS+="--mon-host=${MON_IP}:${MONA_PUBLIC},${MON_IP}:${MONB_PUBLIC},${MON_IP}:${MONC_PUBLIC} "
     run_mon $dir a --public-addr=${MON_IP}:${MONA_PUBLIC} --public-bind-addr=${MON_IP}:${MONA_BIND} || return 1
     run_mon $dir b --public-addr=${MON_IP}:${MONB_PUBLIC} --public-bind-addr=${MON_IP}:${MONB_BIND} || return 1
@@ -117,7 +114,6 @@ function TEST_put_get() {
 
     # start the mon with a public-bind-addr that is different
     # from the public-addr.
 
     # start the mon with a public-bind-addr that is different
     # from the public-addr.
-    CEPH_ARGS+="--mon-initial-members=a,b,c "
     CEPH_ARGS+="--mon-host=${MON_IP}:${MONA_PUBLIC},${MON_IP}:${MONB_PUBLIC},${MON_IP}:${MONC_PUBLIC} "
     run_mon $dir a --public-addr=${MON_IP}:${MONA_PUBLIC} --public-bind-addr=${MON_IP}:${MONA_BIND} || return 1
     run_mon $dir b --public-addr=${MON_IP}:${MONB_PUBLIC} --public-bind-addr=${MON_IP}:${MONB_BIND} || return 1
     CEPH_ARGS+="--mon-host=${MON_IP}:${MONA_PUBLIC},${MON_IP}:${MONB_PUBLIC},${MON_IP}:${MONC_PUBLIC} "
     run_mon $dir a --public-addr=${MON_IP}:${MONA_PUBLIC} --public-bind-addr=${MON_IP}:${MONA_BIND} || return 1
     run_mon $dir b --public-addr=${MON_IP}:${MONB_PUBLIC} --public-bind-addr=${MON_IP}:${MONB_BIND} || return 1
index 8633959d5f2a4a979e55688c3bccaa9ca99176a9..01c8f130f54628c1762f4a843a2e5512758aad35 100755 (executable)
@@ -28,7 +28,7 @@ function run() {
         FSID=$(uuidgen)
         export CEPH_ARGS
         CEPH_ARGS+="--fsid=$FSID --auth-supported=none "
         FSID=$(uuidgen)
         export CEPH_ARGS
         CEPH_ARGS+="--fsid=$FSID --auth-supported=none "
-        CEPH_ARGS+="--mon-initial-members=a,b --mon-host=$MONA,$MONB "
+        CEPH_ARGS+="--mon-host=$MONA,$MONB "
         run_mon $dir a --public-addr $MONA || return 1
         run_mon $dir b --public-addr $MONB || return 1
     )
         run_mon $dir a --public-addr $MONA || return 1
         run_mon $dir b --public-addr $MONB || return 1
     )
index 6f20d90b5b5add968d39ff64900d919a4e79ccc3..f9a14493215d2dec256bae71738c1db2cedd841e 100755 (executable)
@@ -26,6 +26,7 @@ function run() {
     export CEPH_ARGS
     CEPH_ARGS+="--fsid=$(uuidgen) --auth-supported=none "
     CEPH_ARGS+="--mon-host=$CEPH_MON --osd_max_backfills=1 --debug_reserver=20 "
     export CEPH_ARGS
     CEPH_ARGS+="--fsid=$(uuidgen) --auth-supported=none "
     CEPH_ARGS+="--mon-host=$CEPH_MON --osd_max_backfills=1 --debug_reserver=20 "
+    CEPH_ARGS+="--osd_mclock_override_recovery_settings=true "
 
     local funcs=${@:-$(set | sed -n -e 's/^\(TEST_[0-9a-z_]*\) .*/\1/p')}
     for func in $funcs ; do
 
     local funcs=${@:-$(set | sed -n -e 's/^\(TEST_[0-9a-z_]*\) .*/\1/p')}
     for func in $funcs ; do
index 8bc452d6cbbfc2b401bd5cfd24027d0d66016bdc..671bcdee138fd22118e8f1b0bb97b4d32833d585 100755 (executable)
@@ -29,6 +29,7 @@ function run() {
     CEPH_ARGS+="--fake_statfs_for_testing=3686400 "
     CEPH_ARGS+="--osd_max_backfills=10 "
     CEPH_ARGS+="--osd_mclock_profile=high_recovery_ops "
     CEPH_ARGS+="--fake_statfs_for_testing=3686400 "
     CEPH_ARGS+="--osd_max_backfills=10 "
     CEPH_ARGS+="--osd_mclock_profile=high_recovery_ops "
+    CEPH_ARGS+="--osd_mclock_override_recovery_settings=true "
     export objects=600
     export poolprefix=test
 
     export objects=600
     export poolprefix=test
 
index 07ed09b4380fa0ad41c350287ddbcf952a387bae..3bafc5138bb328cdf2cb134730ee24b4f6f8f2b0 100755 (executable)
@@ -26,6 +26,7 @@ function run() {
     CEPH_ARGS+="--fsid=$(uuidgen) --auth-supported=none "
     CEPH_ARGS+="--mon-host=$CEPH_MON "
     CEPH_ARGS+="--osd_max_backfills=10 "
     CEPH_ARGS+="--fsid=$(uuidgen) --auth-supported=none "
     CEPH_ARGS+="--mon-host=$CEPH_MON "
     CEPH_ARGS+="--osd_max_backfills=10 "
+    CEPH_ARGS+="--osd_mclock_override_recovery_settings=true "
     export objects=600
     export poolprefix=test
 
     export objects=600
     export poolprefix=test
 
diff --git a/ceph/qa/suites/fs/32bits/overrides/ignorelist_health.yaml b/ceph/qa/suites/fs/32bits/overrides/ignorelist_health.yaml
new file mode 120000 (symlink)
index 0000000..5cb891a
--- /dev/null
@@ -0,0 +1 @@
+.qa/cephfs/overrides/ignorelist_health.yaml
\ No newline at end of file
diff --git a/ceph/qa/suites/fs/32bits/overrides/ignorelist_wrongly_marked_down.yaml b/ceph/qa/suites/fs/32bits/overrides/ignorelist_wrongly_marked_down.yaml
new file mode 120000 (symlink)
index 0000000..f317cb7
--- /dev/null
@@ -0,0 +1 @@
+.qa/cephfs/overrides/ignorelist_wrongly_marked_down.yaml
\ No newline at end of file
diff --git a/ceph/qa/suites/fs/32bits/overrides/whitelist_health.yaml b/ceph/qa/suites/fs/32bits/overrides/whitelist_health.yaml
deleted file mode 120000 (symlink)
index 74f39a4..0000000
+++ /dev/null
@@ -1 +0,0 @@
-.qa/cephfs/overrides/whitelist_health.yaml
\ No newline at end of file
diff --git a/ceph/qa/suites/fs/32bits/overrides/whitelist_wrongly_marked_down.yaml b/ceph/qa/suites/fs/32bits/overrides/whitelist_wrongly_marked_down.yaml
deleted file mode 120000 (symlink)
index b4528c0..0000000
+++ /dev/null
@@ -1 +0,0 @@
-.qa/cephfs/overrides/whitelist_wrongly_marked_down.yaml
\ No newline at end of file
diff --git a/ceph/qa/suites/fs/bugs/client_trim_caps/overrides/ignorelist_health.yaml b/ceph/qa/suites/fs/bugs/client_trim_caps/overrides/ignorelist_health.yaml
new file mode 120000 (symlink)
index 0000000..5cb891a
--- /dev/null
@@ -0,0 +1 @@
+.qa/cephfs/overrides/ignorelist_health.yaml
\ No newline at end of file
diff --git a/ceph/qa/suites/fs/bugs/client_trim_caps/overrides/ignorelist_wrongly_marked_down.yaml b/ceph/qa/suites/fs/bugs/client_trim_caps/overrides/ignorelist_wrongly_marked_down.yaml
new file mode 120000 (symlink)
index 0000000..f317cb7
--- /dev/null
@@ -0,0 +1 @@
+.qa/cephfs/overrides/ignorelist_wrongly_marked_down.yaml
\ No newline at end of file
diff --git a/ceph/qa/suites/fs/bugs/client_trim_caps/overrides/whitelist_health.yaml b/ceph/qa/suites/fs/bugs/client_trim_caps/overrides/whitelist_health.yaml
deleted file mode 120000 (symlink)
index 74f39a4..0000000
+++ /dev/null
@@ -1 +0,0 @@
-.qa/cephfs/overrides/whitelist_health.yaml
\ No newline at end of file
diff --git a/ceph/qa/suites/fs/bugs/client_trim_caps/overrides/whitelist_wrongly_marked_down.yaml b/ceph/qa/suites/fs/bugs/client_trim_caps/overrides/whitelist_wrongly_marked_down.yaml
deleted file mode 120000 (symlink)
index b4528c0..0000000
+++ /dev/null
@@ -1 +0,0 @@
-.qa/cephfs/overrides/whitelist_wrongly_marked_down.yaml
\ No newline at end of file
diff --git a/ceph/qa/suites/fs/cephadm/renamevolume/overrides/ignorelist_health.yaml b/ceph/qa/suites/fs/cephadm/renamevolume/overrides/ignorelist_health.yaml
new file mode 120000 (symlink)
index 0000000..5cb891a
--- /dev/null
@@ -0,0 +1 @@
+.qa/cephfs/overrides/ignorelist_health.yaml
\ No newline at end of file
diff --git a/ceph/qa/suites/fs/cephadm/renamevolume/overrides/whitelist_health.yaml b/ceph/qa/suites/fs/cephadm/renamevolume/overrides/whitelist_health.yaml
deleted file mode 120000 (symlink)
index 74f39a4..0000000
+++ /dev/null
@@ -1 +0,0 @@
-.qa/cephfs/overrides/whitelist_health.yaml
\ No newline at end of file
diff --git a/ceph/qa/suites/fs/full/overrides/ignorelist_health.yaml b/ceph/qa/suites/fs/full/overrides/ignorelist_health.yaml
new file mode 120000 (symlink)
index 0000000..5cb891a
--- /dev/null
@@ -0,0 +1 @@
+.qa/cephfs/overrides/ignorelist_health.yaml
\ No newline at end of file
diff --git a/ceph/qa/suites/fs/full/overrides/ignorelist_wrongly_marked_down.yaml b/ceph/qa/suites/fs/full/overrides/ignorelist_wrongly_marked_down.yaml
new file mode 120000 (symlink)
index 0000000..f317cb7
--- /dev/null
@@ -0,0 +1 @@
+.qa/cephfs/overrides/ignorelist_wrongly_marked_down.yaml
\ No newline at end of file
diff --git a/ceph/qa/suites/fs/full/overrides/whitelist_health.yaml b/ceph/qa/suites/fs/full/overrides/whitelist_health.yaml
deleted file mode 120000 (symlink)
index 74f39a4..0000000
+++ /dev/null
@@ -1 +0,0 @@
-.qa/cephfs/overrides/whitelist_health.yaml
\ No newline at end of file
diff --git a/ceph/qa/suites/fs/full/overrides/whitelist_wrongly_marked_down.yaml b/ceph/qa/suites/fs/full/overrides/whitelist_wrongly_marked_down.yaml
deleted file mode 120000 (symlink)
index b4528c0..0000000
+++ /dev/null
@@ -1 +0,0 @@
-.qa/cephfs/overrides/whitelist_wrongly_marked_down.yaml
\ No newline at end of file
diff --git a/ceph/qa/suites/fs/functional/overrides/ignorelist_health.yaml b/ceph/qa/suites/fs/functional/overrides/ignorelist_health.yaml
new file mode 120000 (symlink)
index 0000000..5cb891a
--- /dev/null
@@ -0,0 +1 @@
+.qa/cephfs/overrides/ignorelist_health.yaml
\ No newline at end of file
diff --git a/ceph/qa/suites/fs/functional/overrides/ignorelist_wrongly_marked_down.yaml b/ceph/qa/suites/fs/functional/overrides/ignorelist_wrongly_marked_down.yaml
new file mode 120000 (symlink)
index 0000000..f317cb7
--- /dev/null
@@ -0,0 +1 @@
+.qa/cephfs/overrides/ignorelist_wrongly_marked_down.yaml
\ No newline at end of file
diff --git a/ceph/qa/suites/fs/functional/overrides/whitelist_health.yaml b/ceph/qa/suites/fs/functional/overrides/whitelist_health.yaml
deleted file mode 120000 (symlink)
index 74f39a4..0000000
+++ /dev/null
@@ -1 +0,0 @@
-.qa/cephfs/overrides/whitelist_health.yaml
\ No newline at end of file
diff --git a/ceph/qa/suites/fs/functional/overrides/whitelist_wrongly_marked_down.yaml b/ceph/qa/suites/fs/functional/overrides/whitelist_wrongly_marked_down.yaml
deleted file mode 120000 (symlink)
index b4528c0..0000000
+++ /dev/null
@@ -1 +0,0 @@
-.qa/cephfs/overrides/whitelist_wrongly_marked_down.yaml
\ No newline at end of file
diff --git a/ceph/qa/suites/fs/libcephfs/overrides/ignorelist_health.yaml b/ceph/qa/suites/fs/libcephfs/overrides/ignorelist_health.yaml
new file mode 120000 (symlink)
index 0000000..5cb891a
--- /dev/null
@@ -0,0 +1 @@
+.qa/cephfs/overrides/ignorelist_health.yaml
\ No newline at end of file
diff --git a/ceph/qa/suites/fs/libcephfs/overrides/ignorelist_wrongly_marked_down.yaml b/ceph/qa/suites/fs/libcephfs/overrides/ignorelist_wrongly_marked_down.yaml
new file mode 120000 (symlink)
index 0000000..f317cb7
--- /dev/null
@@ -0,0 +1 @@
+.qa/cephfs/overrides/ignorelist_wrongly_marked_down.yaml
\ No newline at end of file
diff --git a/ceph/qa/suites/fs/libcephfs/overrides/whitelist_health.yaml b/ceph/qa/suites/fs/libcephfs/overrides/whitelist_health.yaml
deleted file mode 120000 (symlink)
index 74f39a4..0000000
+++ /dev/null
@@ -1 +0,0 @@
-.qa/cephfs/overrides/whitelist_health.yaml
\ No newline at end of file
diff --git a/ceph/qa/suites/fs/libcephfs/overrides/whitelist_wrongly_marked_down.yaml b/ceph/qa/suites/fs/libcephfs/overrides/whitelist_wrongly_marked_down.yaml
deleted file mode 120000 (symlink)
index b4528c0..0000000
+++ /dev/null
@@ -1 +0,0 @@
-.qa/cephfs/overrides/whitelist_wrongly_marked_down.yaml
\ No newline at end of file
diff --git a/ceph/qa/suites/fs/mixed-clients/distro/$ b/ceph/qa/suites/fs/mixed-clients/distro/$
new file mode 100644 (file)
index 0000000..e69de29
diff --git a/ceph/qa/suites/fs/mixed-clients/distro/.qa b/ceph/qa/suites/fs/mixed-clients/distro/.qa
new file mode 120000 (symlink)
index 0000000..a602a03
--- /dev/null
@@ -0,0 +1 @@
+../.qa/
\ No newline at end of file
diff --git a/ceph/qa/suites/fs/mixed-clients/distro/centos_8.yaml b/ceph/qa/suites/fs/mixed-clients/distro/centos_8.yaml
new file mode 120000 (symlink)
index 0000000..380a144
--- /dev/null
@@ -0,0 +1 @@
+.qa/distros/all/centos_8.yaml
\ No newline at end of file
diff --git a/ceph/qa/suites/fs/mixed-clients/distro/rhel_8.yaml b/ceph/qa/suites/fs/mixed-clients/distro/rhel_8.yaml
new file mode 120000 (symlink)
index 0000000..133acf2
--- /dev/null
@@ -0,0 +1 @@
+.qa/distros/all/rhel_8.yaml
\ No newline at end of file
diff --git a/ceph/qa/suites/fs/mixed-clients/distro/ubuntu/+ b/ceph/qa/suites/fs/mixed-clients/distro/ubuntu/+
new file mode 100644 (file)
index 0000000..e69de29
diff --git a/ceph/qa/suites/fs/mixed-clients/distro/ubuntu/.qa b/ceph/qa/suites/fs/mixed-clients/distro/ubuntu/.qa
new file mode 120000 (symlink)
index 0000000..a602a03
--- /dev/null
@@ -0,0 +1 @@
+../.qa/
\ No newline at end of file
diff --git a/ceph/qa/suites/fs/mixed-clients/distro/ubuntu/latest.yaml b/ceph/qa/suites/fs/mixed-clients/distro/ubuntu/latest.yaml
new file mode 120000 (symlink)
index 0000000..0a708b4
--- /dev/null
@@ -0,0 +1 @@
+.qa/distros/all/ubuntu_22.04.yaml
\ No newline at end of file
diff --git a/ceph/qa/suites/fs/mixed-clients/distro/ubuntu/overrides.yaml b/ceph/qa/suites/fs/mixed-clients/distro/ubuntu/overrides.yaml
new file mode 100644 (file)
index 0000000..fdd7f5e
--- /dev/null
@@ -0,0 +1,4 @@
+overrides:
+  ceph:
+    valgrind:
+      exit_on_first_error: false
diff --git a/ceph/qa/suites/fs/mixed-clients/overrides/ignorelist_health.yaml b/ceph/qa/suites/fs/mixed-clients/overrides/ignorelist_health.yaml
new file mode 120000 (symlink)
index 0000000..5cb891a
--- /dev/null
@@ -0,0 +1 @@
+.qa/cephfs/overrides/ignorelist_health.yaml
\ No newline at end of file
diff --git a/ceph/qa/suites/fs/mixed-clients/overrides/ignorelist_wrongly_marked_down.yaml b/ceph/qa/suites/fs/mixed-clients/overrides/ignorelist_wrongly_marked_down.yaml
new file mode 120000 (symlink)
index 0000000..f317cb7
--- /dev/null
@@ -0,0 +1 @@
+.qa/cephfs/overrides/ignorelist_wrongly_marked_down.yaml
\ No newline at end of file
diff --git a/ceph/qa/suites/fs/mixed-clients/overrides/whitelist_health.yaml b/ceph/qa/suites/fs/mixed-clients/overrides/whitelist_health.yaml
deleted file mode 120000 (symlink)
index 74f39a4..0000000
+++ /dev/null
@@ -1 +0,0 @@
-.qa/cephfs/overrides/whitelist_health.yaml
\ No newline at end of file
diff --git a/ceph/qa/suites/fs/mixed-clients/overrides/whitelist_wrongly_marked_down.yaml b/ceph/qa/suites/fs/mixed-clients/overrides/whitelist_wrongly_marked_down.yaml
deleted file mode 120000 (symlink)
index b4528c0..0000000
+++ /dev/null
@@ -1 +0,0 @@
-.qa/cephfs/overrides/whitelist_wrongly_marked_down.yaml
\ No newline at end of file
diff --git a/ceph/qa/suites/fs/multiclient/overrides/ignorelist_health.yaml b/ceph/qa/suites/fs/multiclient/overrides/ignorelist_health.yaml
new file mode 120000 (symlink)
index 0000000..5cb891a
--- /dev/null
@@ -0,0 +1 @@
+.qa/cephfs/overrides/ignorelist_health.yaml
\ No newline at end of file
diff --git a/ceph/qa/suites/fs/multiclient/overrides/ignorelist_wrongly_marked_down.yaml b/ceph/qa/suites/fs/multiclient/overrides/ignorelist_wrongly_marked_down.yaml
new file mode 120000 (symlink)
index 0000000..f317cb7
--- /dev/null
@@ -0,0 +1 @@
+.qa/cephfs/overrides/ignorelist_wrongly_marked_down.yaml
\ No newline at end of file
diff --git a/ceph/qa/suites/fs/multiclient/overrides/whitelist_health.yaml b/ceph/qa/suites/fs/multiclient/overrides/whitelist_health.yaml
deleted file mode 120000 (symlink)
index 74f39a4..0000000
+++ /dev/null
@@ -1 +0,0 @@
-.qa/cephfs/overrides/whitelist_health.yaml
\ No newline at end of file
diff --git a/ceph/qa/suites/fs/multiclient/overrides/whitelist_wrongly_marked_down.yaml b/ceph/qa/suites/fs/multiclient/overrides/whitelist_wrongly_marked_down.yaml
deleted file mode 120000 (symlink)
index b4528c0..0000000
+++ /dev/null
@@ -1 +0,0 @@
-.qa/cephfs/overrides/whitelist_wrongly_marked_down.yaml
\ No newline at end of file
diff --git a/ceph/qa/suites/fs/multifs/overrides/ignorelist_health.yaml b/ceph/qa/suites/fs/multifs/overrides/ignorelist_health.yaml
new file mode 120000 (symlink)
index 0000000..5cb891a
--- /dev/null
@@ -0,0 +1 @@
+.qa/cephfs/overrides/ignorelist_health.yaml
\ No newline at end of file
diff --git a/ceph/qa/suites/fs/multifs/overrides/ignorelist_wrongly_marked_down.yaml b/ceph/qa/suites/fs/multifs/overrides/ignorelist_wrongly_marked_down.yaml
new file mode 120000 (symlink)
index 0000000..f317cb7
--- /dev/null
@@ -0,0 +1 @@
+.qa/cephfs/overrides/ignorelist_wrongly_marked_down.yaml
\ No newline at end of file
diff --git a/ceph/qa/suites/fs/multifs/overrides/whitelist_health.yaml b/ceph/qa/suites/fs/multifs/overrides/whitelist_health.yaml
deleted file mode 120000 (symlink)
index 74f39a4..0000000
+++ /dev/null
@@ -1 +0,0 @@
-.qa/cephfs/overrides/whitelist_health.yaml
\ No newline at end of file
diff --git a/ceph/qa/suites/fs/multifs/overrides/whitelist_wrongly_marked_down.yaml b/ceph/qa/suites/fs/multifs/overrides/whitelist_wrongly_marked_down.yaml
deleted file mode 120000 (symlink)
index b4528c0..0000000
+++ /dev/null
@@ -1 +0,0 @@
-.qa/cephfs/overrides/whitelist_wrongly_marked_down.yaml
\ No newline at end of file
diff --git a/ceph/qa/suites/fs/permission/overrides/ignorelist_health.yaml b/ceph/qa/suites/fs/permission/overrides/ignorelist_health.yaml
new file mode 120000 (symlink)
index 0000000..5cb891a
--- /dev/null
@@ -0,0 +1 @@
+.qa/cephfs/overrides/ignorelist_health.yaml
\ No newline at end of file
diff --git a/ceph/qa/suites/fs/permission/overrides/ignorelist_wrongly_marked_down.yaml b/ceph/qa/suites/fs/permission/overrides/ignorelist_wrongly_marked_down.yaml
new file mode 120000 (symlink)
index 0000000..f317cb7
--- /dev/null
@@ -0,0 +1 @@
+.qa/cephfs/overrides/ignorelist_wrongly_marked_down.yaml
\ No newline at end of file
diff --git a/ceph/qa/suites/fs/permission/overrides/whitelist_health.yaml b/ceph/qa/suites/fs/permission/overrides/whitelist_health.yaml
deleted file mode 120000 (symlink)
index 74f39a4..0000000
+++ /dev/null
@@ -1 +0,0 @@
-.qa/cephfs/overrides/whitelist_health.yaml
\ No newline at end of file
diff --git a/ceph/qa/suites/fs/permission/overrides/whitelist_wrongly_marked_down.yaml b/ceph/qa/suites/fs/permission/overrides/whitelist_wrongly_marked_down.yaml
deleted file mode 120000 (symlink)
index b4528c0..0000000
+++ /dev/null
@@ -1 +0,0 @@
-.qa/cephfs/overrides/whitelist_wrongly_marked_down.yaml
\ No newline at end of file
diff --git a/ceph/qa/suites/fs/shell/overrides/ignorelist_health.yaml b/ceph/qa/suites/fs/shell/overrides/ignorelist_health.yaml
new file mode 120000 (symlink)
index 0000000..5cb891a
--- /dev/null
@@ -0,0 +1 @@
+.qa/cephfs/overrides/ignorelist_health.yaml
\ No newline at end of file
diff --git a/ceph/qa/suites/fs/shell/overrides/ignorelist_wrongly_marked_down.yaml b/ceph/qa/suites/fs/shell/overrides/ignorelist_wrongly_marked_down.yaml
new file mode 120000 (symlink)
index 0000000..f317cb7
--- /dev/null
@@ -0,0 +1 @@
+.qa/cephfs/overrides/ignorelist_wrongly_marked_down.yaml
\ No newline at end of file
diff --git a/ceph/qa/suites/fs/shell/overrides/whitelist_health.yaml b/ceph/qa/suites/fs/shell/overrides/whitelist_health.yaml
deleted file mode 120000 (symlink)
index 74f39a4..0000000
+++ /dev/null
@@ -1 +0,0 @@
-.qa/cephfs/overrides/whitelist_health.yaml
\ No newline at end of file
diff --git a/ceph/qa/suites/fs/shell/overrides/whitelist_wrongly_marked_down.yaml b/ceph/qa/suites/fs/shell/overrides/whitelist_wrongly_marked_down.yaml
deleted file mode 120000 (symlink)
index b4528c0..0000000
+++ /dev/null
@@ -1 +0,0 @@
-.qa/cephfs/overrides/whitelist_wrongly_marked_down.yaml
\ No newline at end of file
diff --git a/ceph/qa/suites/fs/snaps/overrides/ignorelist_health.yaml b/ceph/qa/suites/fs/snaps/overrides/ignorelist_health.yaml
new file mode 120000 (symlink)
index 0000000..5cb891a
--- /dev/null
@@ -0,0 +1 @@
+.qa/cephfs/overrides/ignorelist_health.yaml
\ No newline at end of file
diff --git a/ceph/qa/suites/fs/snaps/overrides/ignorelist_wrongly_marked_down.yaml b/ceph/qa/suites/fs/snaps/overrides/ignorelist_wrongly_marked_down.yaml
new file mode 120000 (symlink)
index 0000000..f317cb7
--- /dev/null
@@ -0,0 +1 @@
+.qa/cephfs/overrides/ignorelist_wrongly_marked_down.yaml
\ No newline at end of file
diff --git a/ceph/qa/suites/fs/snaps/overrides/whitelist_health.yaml b/ceph/qa/suites/fs/snaps/overrides/whitelist_health.yaml
deleted file mode 120000 (symlink)
index 74f39a4..0000000
+++ /dev/null
@@ -1 +0,0 @@
-.qa/cephfs/overrides/whitelist_health.yaml
\ No newline at end of file
diff --git a/ceph/qa/suites/fs/snaps/overrides/whitelist_wrongly_marked_down.yaml b/ceph/qa/suites/fs/snaps/overrides/whitelist_wrongly_marked_down.yaml
deleted file mode 120000 (symlink)
index b4528c0..0000000
+++ /dev/null
@@ -1 +0,0 @@
-.qa/cephfs/overrides/whitelist_wrongly_marked_down.yaml
\ No newline at end of file
diff --git a/ceph/qa/suites/fs/thrash/multifs/overrides/ignorelist_health.yaml b/ceph/qa/suites/fs/thrash/multifs/overrides/ignorelist_health.yaml
new file mode 120000 (symlink)
index 0000000..5cb891a
--- /dev/null
@@ -0,0 +1 @@
+.qa/cephfs/overrides/ignorelist_health.yaml
\ No newline at end of file
diff --git a/ceph/qa/suites/fs/thrash/multifs/overrides/ignorelist_wrongly_marked_down.yaml b/ceph/qa/suites/fs/thrash/multifs/overrides/ignorelist_wrongly_marked_down.yaml
new file mode 120000 (symlink)
index 0000000..f317cb7
--- /dev/null
@@ -0,0 +1 @@
+.qa/cephfs/overrides/ignorelist_wrongly_marked_down.yaml
\ No newline at end of file
diff --git a/ceph/qa/suites/fs/thrash/multifs/overrides/whitelist_health.yaml b/ceph/qa/suites/fs/thrash/multifs/overrides/whitelist_health.yaml
deleted file mode 120000 (symlink)
index 74f39a4..0000000
+++ /dev/null
@@ -1 +0,0 @@
-.qa/cephfs/overrides/whitelist_health.yaml
\ No newline at end of file
diff --git a/ceph/qa/suites/fs/thrash/multifs/overrides/whitelist_wrongly_marked_down.yaml b/ceph/qa/suites/fs/thrash/multifs/overrides/whitelist_wrongly_marked_down.yaml
deleted file mode 120000 (symlink)
index b4528c0..0000000
+++ /dev/null
@@ -1 +0,0 @@
-.qa/cephfs/overrides/whitelist_wrongly_marked_down.yaml
\ No newline at end of file
diff --git a/ceph/qa/suites/fs/thrash/workloads/overrides/ignorelist_health.yaml b/ceph/qa/suites/fs/thrash/workloads/overrides/ignorelist_health.yaml
new file mode 120000 (symlink)
index 0000000..5cb891a
--- /dev/null
@@ -0,0 +1 @@
+.qa/cephfs/overrides/ignorelist_health.yaml
\ No newline at end of file
diff --git a/ceph/qa/suites/fs/thrash/workloads/overrides/ignorelist_wrongly_marked_down.yaml b/ceph/qa/suites/fs/thrash/workloads/overrides/ignorelist_wrongly_marked_down.yaml
new file mode 120000 (symlink)
index 0000000..f317cb7
--- /dev/null
@@ -0,0 +1 @@
+.qa/cephfs/overrides/ignorelist_wrongly_marked_down.yaml
\ No newline at end of file
diff --git a/ceph/qa/suites/fs/thrash/workloads/overrides/whitelist_health.yaml b/ceph/qa/suites/fs/thrash/workloads/overrides/whitelist_health.yaml
deleted file mode 120000 (symlink)
index 74f39a4..0000000
+++ /dev/null
@@ -1 +0,0 @@
-.qa/cephfs/overrides/whitelist_health.yaml
\ No newline at end of file
diff --git a/ceph/qa/suites/fs/thrash/workloads/overrides/whitelist_wrongly_marked_down.yaml b/ceph/qa/suites/fs/thrash/workloads/overrides/whitelist_wrongly_marked_down.yaml
deleted file mode 120000 (symlink)
index b4528c0..0000000
+++ /dev/null
@@ -1 +0,0 @@
-.qa/cephfs/overrides/whitelist_wrongly_marked_down.yaml
\ No newline at end of file
diff --git a/ceph/qa/suites/fs/top/overrides/ignorelist_health.yaml b/ceph/qa/suites/fs/top/overrides/ignorelist_health.yaml
new file mode 120000 (symlink)
index 0000000..5cb891a
--- /dev/null
@@ -0,0 +1 @@
+.qa/cephfs/overrides/ignorelist_health.yaml
\ No newline at end of file
diff --git a/ceph/qa/suites/fs/top/overrides/whitelist_health.yaml b/ceph/qa/suites/fs/top/overrides/whitelist_health.yaml
deleted file mode 120000 (symlink)
index 3f8d0af..0000000
+++ /dev/null
@@ -1 +0,0 @@
-./.qa/cephfs/overrides/whitelist_health.yaml
\ No newline at end of file
diff --git a/ceph/qa/suites/fs/traceless/overrides/ignorelist_health.yaml b/ceph/qa/suites/fs/traceless/overrides/ignorelist_health.yaml
new file mode 120000 (symlink)
index 0000000..5cb891a
--- /dev/null
@@ -0,0 +1 @@
+.qa/cephfs/overrides/ignorelist_health.yaml
\ No newline at end of file
diff --git a/ceph/qa/suites/fs/traceless/overrides/ignorelist_wrongly_marked_down.yaml b/ceph/qa/suites/fs/traceless/overrides/ignorelist_wrongly_marked_down.yaml
new file mode 120000 (symlink)
index 0000000..f317cb7
--- /dev/null
@@ -0,0 +1 @@
+.qa/cephfs/overrides/ignorelist_wrongly_marked_down.yaml
\ No newline at end of file
diff --git a/ceph/qa/suites/fs/traceless/overrides/whitelist_health.yaml b/ceph/qa/suites/fs/traceless/overrides/whitelist_health.yaml
deleted file mode 120000 (symlink)
index 74f39a4..0000000
+++ /dev/null
@@ -1 +0,0 @@
-.qa/cephfs/overrides/whitelist_health.yaml
\ No newline at end of file
diff --git a/ceph/qa/suites/fs/traceless/overrides/whitelist_wrongly_marked_down.yaml b/ceph/qa/suites/fs/traceless/overrides/whitelist_wrongly_marked_down.yaml
deleted file mode 120000 (symlink)
index b4528c0..0000000
+++ /dev/null
@@ -1 +0,0 @@
-.qa/cephfs/overrides/whitelist_wrongly_marked_down.yaml
\ No newline at end of file
diff --git a/ceph/qa/suites/fs/upgrade/featureful_client/old_client/overrides/ignorelist_health.yaml b/ceph/qa/suites/fs/upgrade/featureful_client/old_client/overrides/ignorelist_health.yaml
new file mode 120000 (symlink)
index 0000000..5cb891a
--- /dev/null
@@ -0,0 +1 @@
+.qa/cephfs/overrides/ignorelist_health.yaml
\ No newline at end of file
diff --git a/ceph/qa/suites/fs/upgrade/featureful_client/old_client/overrides/ignorelist_wrongly_marked_down.yaml b/ceph/qa/suites/fs/upgrade/featureful_client/old_client/overrides/ignorelist_wrongly_marked_down.yaml
new file mode 120000 (symlink)
index 0000000..f317cb7
--- /dev/null
@@ -0,0 +1 @@
+.qa/cephfs/overrides/ignorelist_wrongly_marked_down.yaml
\ No newline at end of file
diff --git a/ceph/qa/suites/fs/upgrade/featureful_client/old_client/overrides/whitelist_health.yaml b/ceph/qa/suites/fs/upgrade/featureful_client/old_client/overrides/whitelist_health.yaml
deleted file mode 120000 (symlink)
index 74f39a4..0000000
+++ /dev/null
@@ -1 +0,0 @@
-.qa/cephfs/overrides/whitelist_health.yaml
\ No newline at end of file
diff --git a/ceph/qa/suites/fs/upgrade/featureful_client/old_client/overrides/whitelist_wrongly_marked_down.yaml b/ceph/qa/suites/fs/upgrade/featureful_client/old_client/overrides/whitelist_wrongly_marked_down.yaml
deleted file mode 120000 (symlink)
index b4528c0..0000000
+++ /dev/null
@@ -1 +0,0 @@
-.qa/cephfs/overrides/whitelist_wrongly_marked_down.yaml
\ No newline at end of file
diff --git a/ceph/qa/suites/fs/upgrade/featureful_client/upgraded_client/overrides/ignorelist_health.yaml b/ceph/qa/suites/fs/upgrade/featureful_client/upgraded_client/overrides/ignorelist_health.yaml
new file mode 120000 (symlink)
index 0000000..5cb891a
--- /dev/null
@@ -0,0 +1 @@
+.qa/cephfs/overrides/ignorelist_health.yaml
\ No newline at end of file
diff --git a/ceph/qa/suites/fs/upgrade/featureful_client/upgraded_client/overrides/ignorelist_wrongly_marked_down.yaml b/ceph/qa/suites/fs/upgrade/featureful_client/upgraded_client/overrides/ignorelist_wrongly_marked_down.yaml
new file mode 120000 (symlink)
index 0000000..f317cb7
--- /dev/null
@@ -0,0 +1 @@
+.qa/cephfs/overrides/ignorelist_wrongly_marked_down.yaml
\ No newline at end of file
diff --git a/ceph/qa/suites/fs/upgrade/featureful_client/upgraded_client/overrides/whitelist_health.yaml b/ceph/qa/suites/fs/upgrade/featureful_client/upgraded_client/overrides/whitelist_health.yaml
deleted file mode 120000 (symlink)
index 74f39a4..0000000
+++ /dev/null
@@ -1 +0,0 @@
-.qa/cephfs/overrides/whitelist_health.yaml
\ No newline at end of file
diff --git a/ceph/qa/suites/fs/upgrade/featureful_client/upgraded_client/overrides/whitelist_wrongly_marked_down.yaml b/ceph/qa/suites/fs/upgrade/featureful_client/upgraded_client/overrides/whitelist_wrongly_marked_down.yaml
deleted file mode 120000 (symlink)
index b4528c0..0000000
+++ /dev/null
@@ -1 +0,0 @@
-.qa/cephfs/overrides/whitelist_wrongly_marked_down.yaml
\ No newline at end of file
diff --git a/ceph/qa/suites/fs/upgrade/mds_upgrade_sequence/overrides/ignorelist_health.yaml b/ceph/qa/suites/fs/upgrade/mds_upgrade_sequence/overrides/ignorelist_health.yaml
new file mode 120000 (symlink)
index 0000000..5cb891a
--- /dev/null
@@ -0,0 +1 @@
+.qa/cephfs/overrides/ignorelist_health.yaml
\ No newline at end of file
diff --git a/ceph/qa/suites/fs/upgrade/mds_upgrade_sequence/overrides/ignorelist_wrongly_marked_down.yaml b/ceph/qa/suites/fs/upgrade/mds_upgrade_sequence/overrides/ignorelist_wrongly_marked_down.yaml
new file mode 120000 (symlink)
index 0000000..f317cb7
--- /dev/null
@@ -0,0 +1 @@
+.qa/cephfs/overrides/ignorelist_wrongly_marked_down.yaml
\ No newline at end of file
diff --git a/ceph/qa/suites/fs/upgrade/mds_upgrade_sequence/overrides/whitelist_health.yaml b/ceph/qa/suites/fs/upgrade/mds_upgrade_sequence/overrides/whitelist_health.yaml
deleted file mode 120000 (symlink)
index 74f39a4..0000000
+++ /dev/null
@@ -1 +0,0 @@
-.qa/cephfs/overrides/whitelist_health.yaml
\ No newline at end of file
diff --git a/ceph/qa/suites/fs/upgrade/mds_upgrade_sequence/overrides/whitelist_wrongly_marked_down.yaml b/ceph/qa/suites/fs/upgrade/mds_upgrade_sequence/overrides/whitelist_wrongly_marked_down.yaml
deleted file mode 120000 (symlink)
index b4528c0..0000000
+++ /dev/null
@@ -1 +0,0 @@
-.qa/cephfs/overrides/whitelist_wrongly_marked_down.yaml
\ No newline at end of file
diff --git a/ceph/qa/suites/fs/upgrade/nofs/overrides/ignorelist_health.yaml b/ceph/qa/suites/fs/upgrade/nofs/overrides/ignorelist_health.yaml
new file mode 120000 (symlink)
index 0000000..5cb891a
--- /dev/null
@@ -0,0 +1 @@
+.qa/cephfs/overrides/ignorelist_health.yaml
\ No newline at end of file
diff --git a/ceph/qa/suites/fs/upgrade/nofs/overrides/ignorelist_wrongly_marked_down.yaml b/ceph/qa/suites/fs/upgrade/nofs/overrides/ignorelist_wrongly_marked_down.yaml
new file mode 120000 (symlink)
index 0000000..f317cb7
--- /dev/null
@@ -0,0 +1 @@
+.qa/cephfs/overrides/ignorelist_wrongly_marked_down.yaml
\ No newline at end of file
diff --git a/ceph/qa/suites/fs/upgrade/nofs/overrides/whitelist_health.yaml b/ceph/qa/suites/fs/upgrade/nofs/overrides/whitelist_health.yaml
deleted file mode 120000 (symlink)
index 74f39a4..0000000
+++ /dev/null
@@ -1 +0,0 @@
-.qa/cephfs/overrides/whitelist_health.yaml
\ No newline at end of file
diff --git a/ceph/qa/suites/fs/upgrade/nofs/overrides/whitelist_wrongly_marked_down.yaml b/ceph/qa/suites/fs/upgrade/nofs/overrides/whitelist_wrongly_marked_down.yaml
deleted file mode 120000 (symlink)
index b4528c0..0000000
+++ /dev/null
@@ -1 +0,0 @@
-.qa/cephfs/overrides/whitelist_wrongly_marked_down.yaml
\ No newline at end of file
diff --git a/ceph/qa/suites/fs/upgrade/upgraded_client/.qa b/ceph/qa/suites/fs/upgrade/upgraded_client/.qa
new file mode 120000 (symlink)
index 0000000..a602a03
--- /dev/null
@@ -0,0 +1 @@
+../.qa/
\ No newline at end of file
diff --git a/ceph/qa/suites/fs/upgrade/upgraded_client/from_nautilus/% b/ceph/qa/suites/fs/upgrade/upgraded_client/from_nautilus/%
new file mode 100644 (file)
index 0000000..e69de29
diff --git a/ceph/qa/suites/fs/upgrade/upgraded_client/from_nautilus/.qa b/ceph/qa/suites/fs/upgrade/upgraded_client/from_nautilus/.qa
new file mode 120000 (symlink)
index 0000000..a602a03
--- /dev/null
@@ -0,0 +1 @@
+../.qa/
\ No newline at end of file
diff --git a/ceph/qa/suites/fs/upgrade/upgraded_client/from_nautilus/bluestore-bitmap.yaml b/ceph/qa/suites/fs/upgrade/upgraded_client/from_nautilus/bluestore-bitmap.yaml
new file mode 120000 (symlink)
index 0000000..17ad98e
--- /dev/null
@@ -0,0 +1 @@
+../../../../../cephfs/objectstore-ec/bluestore-bitmap.yaml
\ No newline at end of file
diff --git a/ceph/qa/suites/fs/upgrade/upgraded_client/from_nautilus/centos_latest.yaml b/ceph/qa/suites/fs/upgrade/upgraded_client/from_nautilus/centos_latest.yaml
new file mode 120000 (symlink)
index 0000000..bd9854e
--- /dev/null
@@ -0,0 +1 @@
+.qa/distros/supported/centos_latest.yaml
\ No newline at end of file
diff --git a/ceph/qa/suites/fs/upgrade/upgraded_client/from_nautilus/clusters/% b/ceph/qa/suites/fs/upgrade/upgraded_client/from_nautilus/clusters/%
new file mode 100644 (file)
index 0000000..e69de29
diff --git a/ceph/qa/suites/fs/upgrade/upgraded_client/from_nautilus/clusters/.qa b/ceph/qa/suites/fs/upgrade/upgraded_client/from_nautilus/clusters/.qa
new file mode 120000 (symlink)
index 0000000..fea2489
--- /dev/null
@@ -0,0 +1 @@
+../.qa
\ No newline at end of file
diff --git a/ceph/qa/suites/fs/upgrade/upgraded_client/from_nautilus/clusters/1-mds-1-client-micro.yaml b/ceph/qa/suites/fs/upgrade/upgraded_client/from_nautilus/clusters/1-mds-1-client-micro.yaml
new file mode 120000 (symlink)
index 0000000..50ffb6d
--- /dev/null
@@ -0,0 +1 @@
+.qa/cephfs/clusters/1-mds-1-client-micro.yaml
\ No newline at end of file
diff --git a/ceph/qa/suites/fs/upgrade/upgraded_client/from_nautilus/conf b/ceph/qa/suites/fs/upgrade/upgraded_client/from_nautilus/conf
new file mode 120000 (symlink)
index 0000000..6d47129
--- /dev/null
@@ -0,0 +1 @@
+.qa/cephfs/conf/
\ No newline at end of file
diff --git a/ceph/qa/suites/fs/upgrade/upgraded_client/from_nautilus/overrides/% b/ceph/qa/suites/fs/upgrade/upgraded_client/from_nautilus/overrides/%
new file mode 100644 (file)
index 0000000..e69de29
diff --git a/ceph/qa/suites/fs/upgrade/upgraded_client/from_nautilus/overrides/.qa b/ceph/qa/suites/fs/upgrade/upgraded_client/from_nautilus/overrides/.qa
new file mode 120000 (symlink)
index 0000000..a602a03
--- /dev/null
@@ -0,0 +1 @@
+../.qa/
\ No newline at end of file
diff --git a/ceph/qa/suites/fs/upgrade/upgraded_client/from_nautilus/overrides/ignorelist_health.yaml b/ceph/qa/suites/fs/upgrade/upgraded_client/from_nautilus/overrides/ignorelist_health.yaml
new file mode 120000 (symlink)
index 0000000..5cb891a
--- /dev/null
@@ -0,0 +1 @@
+.qa/cephfs/overrides/ignorelist_health.yaml
\ No newline at end of file
diff --git a/ceph/qa/suites/fs/upgrade/upgraded_client/from_nautilus/overrides/ignorelist_wrongly_marked_down.yaml b/ceph/qa/suites/fs/upgrade/upgraded_client/from_nautilus/overrides/ignorelist_wrongly_marked_down.yaml
new file mode 120000 (symlink)
index 0000000..f317cb7
--- /dev/null
@@ -0,0 +1 @@
+.qa/cephfs/overrides/ignorelist_wrongly_marked_down.yaml
\ No newline at end of file
diff --git a/ceph/qa/suites/fs/upgrade/upgraded_client/from_nautilus/overrides/pg-warn.yaml b/ceph/qa/suites/fs/upgrade/upgraded_client/from_nautilus/overrides/pg-warn.yaml
new file mode 100644 (file)
index 0000000..4ae54a4
--- /dev/null
@@ -0,0 +1,5 @@
+overrides:
+  ceph:
+    conf:
+      global:
+        mon pg warn min per osd: 0
diff --git a/ceph/qa/suites/fs/upgrade/upgraded_client/from_nautilus/tasks/% b/ceph/qa/suites/fs/upgrade/upgraded_client/from_nautilus/tasks/%
new file mode 100644 (file)
index 0000000..e69de29
diff --git a/ceph/qa/suites/fs/upgrade/upgraded_client/from_nautilus/tasks/.qa b/ceph/qa/suites/fs/upgrade/upgraded_client/from_nautilus/tasks/.qa
new file mode 120000 (symlink)
index 0000000..a602a03
--- /dev/null
@@ -0,0 +1 @@
+../.qa/
\ No newline at end of file
diff --git a/ceph/qa/suites/fs/upgrade/upgraded_client/from_nautilus/tasks/0-nautilus.yaml b/ceph/qa/suites/fs/upgrade/upgraded_client/from_nautilus/tasks/0-nautilus.yaml
new file mode 100644 (file)
index 0000000..2b6d375
--- /dev/null
@@ -0,0 +1,44 @@
+meta:
+- desc: |
+   install ceph/nautilus latest
+tasks:
+- install:
+    branch: nautilus
+    exclude_packages:
+      - cephadm
+      - ceph-mgr-cephadm
+      - ceph-immutable-object-cache
+      - python3-rados
+      - python3-rgw
+      - python3-rbd
+      - python3-cephfs
+      - ceph-volume
+    extra_packages:
+      - python-rados
+      - python-rgw
+      - python-rbd
+      - python-cephfs
+- print: "**** done installing nautilus"
+- ceph:
+    log-ignorelist:
+      - overall HEALTH_
+      - \(FS_
+      - \(MDS_
+      - \(OSD_
+      - \(MON_DOWN\)
+      - \(CACHE_POOL_
+      - \(POOL_
+      - \(MGR_DOWN\)
+      - \(PG_
+      - \(SMALLER_PGP_NUM\)
+      - Monitor daemon marked osd
+      - Behind on trimming
+      - Manager daemon
+    conf:
+      global:
+        mon warn on pool no app: false
+        ms bind msgr2: false
+- exec:
+    osd.0:
+      - ceph osd set-require-min-compat-client nautilus
+- print: "**** done ceph"
diff --git a/ceph/qa/suites/fs/upgrade/upgraded_client/from_nautilus/tasks/1-client-upgrade.yaml b/ceph/qa/suites/fs/upgrade/upgraded_client/from_nautilus/tasks/1-client-upgrade.yaml
new file mode 100644 (file)
index 0000000..99b99e6
--- /dev/null
@@ -0,0 +1,7 @@
+tasks:
+- install.upgrade:
+    client.0:
+- print: "**** done install.upgrade on client.0"
+- ceph-fuse:
+    client.0:
+- print: "**** done remount client"
diff --git a/ceph/qa/suites/fs/upgrade/upgraded_client/from_nautilus/tasks/2-client-sanity.yaml b/ceph/qa/suites/fs/upgrade/upgraded_client/from_nautilus/tasks/2-client-sanity.yaml
new file mode 100644 (file)
index 0000000..9508cce
--- /dev/null
@@ -0,0 +1,4 @@
+tasks:
+  - cephfs_test_runner:
+      modules:
+        - tasks.cephfs.test_newops
diff --git a/ceph/qa/suites/fs/verify/overrides/ignorelist_health.yaml b/ceph/qa/suites/fs/verify/overrides/ignorelist_health.yaml
new file mode 120000 (symlink)
index 0000000..5cb891a
--- /dev/null
@@ -0,0 +1 @@
+.qa/cephfs/overrides/ignorelist_health.yaml
\ No newline at end of file
diff --git a/ceph/qa/suites/fs/verify/overrides/ignorelist_wrongly_marked_down.yaml b/ceph/qa/suites/fs/verify/overrides/ignorelist_wrongly_marked_down.yaml
new file mode 120000 (symlink)
index 0000000..f317cb7
--- /dev/null
@@ -0,0 +1 @@
+.qa/cephfs/overrides/ignorelist_wrongly_marked_down.yaml
\ No newline at end of file
diff --git a/ceph/qa/suites/fs/verify/overrides/whitelist_health.yaml b/ceph/qa/suites/fs/verify/overrides/whitelist_health.yaml
deleted file mode 120000 (symlink)
index 74f39a4..0000000
+++ /dev/null
@@ -1 +0,0 @@
-.qa/cephfs/overrides/whitelist_health.yaml
\ No newline at end of file
diff --git a/ceph/qa/suites/fs/verify/overrides/whitelist_wrongly_marked_down.yaml b/ceph/qa/suites/fs/verify/overrides/whitelist_wrongly_marked_down.yaml
deleted file mode 120000 (symlink)
index b4528c0..0000000
+++ /dev/null
@@ -1 +0,0 @@
-.qa/cephfs/overrides/whitelist_wrongly_marked_down.yaml
\ No newline at end of file
diff --git a/ceph/qa/suites/fs/volumes/overrides/ignorelist_health.yaml b/ceph/qa/suites/fs/volumes/overrides/ignorelist_health.yaml
new file mode 120000 (symlink)
index 0000000..5cb891a
--- /dev/null
@@ -0,0 +1 @@
+.qa/cephfs/overrides/ignorelist_health.yaml
\ No newline at end of file
diff --git a/ceph/qa/suites/fs/volumes/overrides/ignorelist_wrongly_marked_down.yaml b/ceph/qa/suites/fs/volumes/overrides/ignorelist_wrongly_marked_down.yaml
new file mode 120000 (symlink)
index 0000000..f317cb7
--- /dev/null
@@ -0,0 +1 @@
+.qa/cephfs/overrides/ignorelist_wrongly_marked_down.yaml
\ No newline at end of file
diff --git a/ceph/qa/suites/fs/volumes/overrides/whitelist_health.yaml b/ceph/qa/suites/fs/volumes/overrides/whitelist_health.yaml
deleted file mode 120000 (symlink)
index 74f39a4..0000000
+++ /dev/null
@@ -1 +0,0 @@
-.qa/cephfs/overrides/whitelist_health.yaml
\ No newline at end of file
diff --git a/ceph/qa/suites/fs/volumes/overrides/whitelist_wrongly_marked_down.yaml b/ceph/qa/suites/fs/volumes/overrides/whitelist_wrongly_marked_down.yaml
deleted file mode 120000 (symlink)
index b4528c0..0000000
+++ /dev/null
@@ -1 +0,0 @@
-.qa/cephfs/overrides/whitelist_wrongly_marked_down.yaml
\ No newline at end of file
diff --git a/ceph/qa/suites/fs/workload/overrides/ignorelist_health.yaml b/ceph/qa/suites/fs/workload/overrides/ignorelist_health.yaml
new file mode 120000 (symlink)
index 0000000..5cb891a
--- /dev/null
@@ -0,0 +1 @@
+.qa/cephfs/overrides/ignorelist_health.yaml
\ No newline at end of file
diff --git a/ceph/qa/suites/fs/workload/overrides/ignorelist_wrongly_marked_down.yaml b/ceph/qa/suites/fs/workload/overrides/ignorelist_wrongly_marked_down.yaml
new file mode 120000 (symlink)
index 0000000..f317cb7
--- /dev/null
@@ -0,0 +1 @@
+.qa/cephfs/overrides/ignorelist_wrongly_marked_down.yaml
\ No newline at end of file
diff --git a/ceph/qa/suites/fs/workload/overrides/whitelist_health.yaml b/ceph/qa/suites/fs/workload/overrides/whitelist_health.yaml
deleted file mode 120000 (symlink)
index 74f39a4..0000000
+++ /dev/null
@@ -1 +0,0 @@
-.qa/cephfs/overrides/whitelist_health.yaml
\ No newline at end of file
diff --git a/ceph/qa/suites/fs/workload/overrides/whitelist_wrongly_marked_down.yaml b/ceph/qa/suites/fs/workload/overrides/whitelist_wrongly_marked_down.yaml
deleted file mode 120000 (symlink)
index b4528c0..0000000
+++ /dev/null
@@ -1 +0,0 @@
-.qa/cephfs/overrides/whitelist_wrongly_marked_down.yaml
\ No newline at end of file
diff --git a/ceph/qa/suites/orch/cephadm/with-work/tasks/rotate-keys.yaml b/ceph/qa/suites/orch/cephadm/with-work/tasks/rotate-keys.yaml
new file mode 100644 (file)
index 0000000..5b91c6e
--- /dev/null
@@ -0,0 +1,16 @@
+tasks:
+- cephadm.shell:
+    mon.a:
+    - |
+      set -ex
+      for f in osd.0 osd.1 osd.2 osd.3 osd.4 osd.5 osd.6 osd.7 mgr.y mgr.x
+      do
+          echo "rotating key for $f"
+          K=$(ceph auth get-key $f)
+          NK="$K"
+          ceph orch daemon rotate-key $f
+          while [ "$K" == "$NK" ]; do
+              sleep 5
+              NK=$(ceph auth get-key $f)
+          done
+      done
diff --git a/ceph/qa/suites/orch/cephadm/workunits/task/test_iscsi_pids_limit.yaml b/ceph/qa/suites/orch/cephadm/workunits/task/test_iscsi_pids_limit.yaml
new file mode 100644 (file)
index 0000000..b271777
--- /dev/null
@@ -0,0 +1,20 @@
+roles:
+- - host.a
+  - osd.0
+  - osd.1
+  - osd.2
+  - mon.a
+  - mgr.a
+  - client.0
+tasks:
+- install:
+- cephadm:
+- cephadm.shell:
+    host.a:
+      - ceph osd pool create foo
+      - rbd pool init foo
+      - ceph orch apply iscsi foo u p
+- workunit:
+    clients:
+      client.0:
+        - cephadm/test_iscsi_pids_limit.sh
diff --git a/ceph/qa/suites/orch/cephadm/workunits/task/test_orch_cli_mon.yaml b/ceph/qa/suites/orch/cephadm/workunits/task/test_orch_cli_mon.yaml
new file mode 100644 (file)
index 0000000..2a33dc8
--- /dev/null
@@ -0,0 +1,45 @@
+roles:
+- - host.a
+  - osd.0
+  - osd.1
+  - osd.2
+  - mon.a
+  - mgr.a
+  - client.0
+- - host.b
+  - osd.3
+  - osd.4
+  - osd.5
+  - mon.b
+  - mgr.b
+  - client.1
+- - host.c
+  - osd.6
+  - osd.7
+  - osd.8
+  - mon.c
+  - mgr.c
+  - client.2
+- - host.d
+  - osd.9
+  - osd.10
+  - osd.11
+  - mon.d
+  - mgr.d
+  - client.3
+- - host.e
+  - osd.12
+  - osd.13
+  - osd.14
+  - mon.e
+  - mgr.e
+  - client.4
+tasks:
+- install:
+- cephadm:
+- cephadm.shell:
+    host.a:
+      - ceph orch apply mds a
+- cephfs_test_runner:
+    modules:
+      - tasks.cephadm_cases.test_cli_mon
diff --git a/ceph/qa/suites/powercycle/osd/ignorelist_health.yaml b/ceph/qa/suites/powercycle/osd/ignorelist_health.yaml
new file mode 100644 (file)
index 0000000..bce5e95
--- /dev/null
@@ -0,0 +1,7 @@
+overrides:
+  ceph:
+    log-ignorelist:
+      - \(MDS_TRIM\)
+      - \(MDS_SLOW_REQUEST\)
+      - MDS_SLOW_METADATA_IO
+      - Behind on trimming
diff --git a/ceph/qa/suites/powercycle/osd/whitelist_health.yaml b/ceph/qa/suites/powercycle/osd/whitelist_health.yaml
deleted file mode 100644 (file)
index bce5e95..0000000
+++ /dev/null
@@ -1,7 +0,0 @@
-overrides:
-  ceph:
-    log-ignorelist:
-      - \(MDS_TRIM\)
-      - \(MDS_SLOW_REQUEST\)
-      - MDS_SLOW_METADATA_IO
-      - Behind on trimming
index fd2c47cba5e35743522446fe626db8a3838b1a04..c781061de9c3427b3db71fea1809eff9bb396b99 100644 (file)
@@ -2,6 +2,12 @@ roles:
 - [mgr.x, mon.a, mon.c, mds.a, mds.c, osd.0, client.0]
 - [mgr.y, mgr.z, mon.b, mds.b, osd.1, osd.2, osd.3, client.1]
 
 - [mgr.x, mon.a, mon.c, mds.a, mds.c, osd.0, client.0]
 - [mgr.y, mgr.z, mon.b, mds.b, osd.1, osd.2, osd.3, client.1]
 
+overrides:
+  ceph:
+    conf:
+      osd:
+        osd mclock override recovery settings: true
+
 tasks:
   - install:
   - ceph:
 tasks:
   - install:
   - ceph:
index f7c45d43fd42afb10ed8f992e3036841374a60be..a56d164a50a4219958a7dedda18aca9de6da9cd7 100644 (file)
@@ -17,3 +17,4 @@ tasks:
     clients:
       all:
         - mon/auth_caps.sh
     clients:
       all:
         - mon/auth_caps.sh
+        - mon/auth_key_rotation.sh
index 30016d96e7f55060146f5a6091d6d315f509aa73..86fc0732fc79478b68858cb7f4da5a3d2848b063 100644 (file)
@@ -16,8 +16,5 @@ overrides:
           - name: test-zone2
             is_default: true
             endpoints: [c2.client.0]
           - name: test-zone2
             is_default: true
             endpoints: [c2.client.0]
-          - name: test-zone3
-            endpoints: [c2.client.1]
-            is_pubsub: true
   rgw-multisite-tests:
   rgw-multisite-tests:
-    args: [tests.py, tests_ps.py]
+    args: [tests.py]
diff --git a/ceph/qa/suites/rgw/cloud-transition/+ b/ceph/qa/suites/rgw/cloud-transition/+
new file mode 100644 (file)
index 0000000..e69de29
diff --git a/ceph/qa/suites/rgw/cloud-transition/.qa b/ceph/qa/suites/rgw/cloud-transition/.qa
new file mode 120000 (symlink)
index 0000000..fea2489
--- /dev/null
@@ -0,0 +1 @@
+../.qa
\ No newline at end of file
diff --git a/ceph/qa/suites/rgw/cloud-transition/cluster.yaml b/ceph/qa/suites/rgw/cloud-transition/cluster.yaml
new file mode 100644 (file)
index 0000000..8e0712e
--- /dev/null
@@ -0,0 +1,3 @@
+roles:
+- [mon.a, osd.0, osd.1, osd.2, mgr.0, client.0, client.1]
+#- [mon.b, osd.3, osd.4, osd.5, mgr.1, client.2, client.3]
diff --git a/ceph/qa/suites/rgw/cloud-transition/overrides.yaml b/ceph/qa/suites/rgw/cloud-transition/overrides.yaml
new file mode 100644 (file)
index 0000000..40ca355
--- /dev/null
@@ -0,0 +1,14 @@
+overrides:
+  ceph:
+    conf:
+      client:
+        setuser: ceph
+        setgroup: ceph
+        debug rgw: 20
+        rgw crypt s3 kms backend: testing
+        rgw crypt s3 kms encryption keys: testkey-1=YmluCmJvb3N0CmJvb3N0LWJ1aWxkCmNlcGguY29uZgo= testkey-2=aWIKTWFrZWZpbGUKbWFuCm91dApzcmMKVGVzdGluZwo=
+        rgw crypt require ssl: false
+        rgw lc debug interval: 10
+  rgw:
+    storage classes: LUKEWARM, FROZEN
+    frontend: beast
diff --git a/ceph/qa/suites/rgw/cloud-transition/supported-random-distro$ b/ceph/qa/suites/rgw/cloud-transition/supported-random-distro$
new file mode 120000 (symlink)
index 0000000..0862b44
--- /dev/null
@@ -0,0 +1 @@
+.qa/distros/supported-random-distro$
\ No newline at end of file
diff --git a/ceph/qa/suites/rgw/cloud-transition/tasks/cloud_transition_s3tests.yaml b/ceph/qa/suites/rgw/cloud-transition/tasks/cloud_transition_s3tests.yaml
new file mode 100644 (file)
index 0000000..03ed2fb
--- /dev/null
@@ -0,0 +1,62 @@
+tasks:
+- install:
+- ceph:
+- rgw:
+    storage classes: LUKEWARM, FROZEN
+    client.0:
+      port: 8000
+    client.1:
+      port: 8001
+    #client.2:
+      #port: 8002
+    #client.3:
+      #port: 8003
+- rgw-cloudtier:
+    client.0:
+      # cloudtier storage class params
+      # retain_head_object = false
+      cloud_storage_class: CLOUDTIER-CLIENT0
+      cloud_client: client.1
+      cloud_regular_storage_class: LUKEWARM
+      cloud_target_storage_class: FROZEN
+      cloud_retain_head_object: "false"
+      cloud_target_path: "teuthology-client0"
+      cloudtier_user:
+        # cloud-user creds to be created on cloud-client
+        cloud_secret: "abcefgh"
+        cloud_access_key: "12345678"
+    #client.2:
+      # cloudtier storage class params
+      # retain_head_object = true
+      #
+      # Having multiple cloudtier storage classes
+      # in the same task is increasing the transition
+      # time and resulting in spurious failures.
+      # Hence disabling this until there is a
+      # consistent way of running the tests
+      # without having to depend on lc_debug_interval.
+      #
+      #cloud_storage_class: CLOUDTIER-CLIENT2
+      #cloud_client: client.3
+      #cloud_regular_storage_class: LUKEWARM
+      #cloud_retain_head_object: "true"
+      #cloud_target_path: "teuthology-client2"
+      #cloudtier_user:
+        # cloud-user creds to be created on cloud-client
+        #cloud_secret: "foobar"
+        #cloud_access_key: "87654321"
+- s3tests:
+    client.0:
+      force-branch: ceph-quincy
+      rgw_server: client.0
+      storage classes: LUKEWARM, FROZEN
+      extra_attrs: ["cloud_transition"]
+      lc_debug_interval: 10
+      cloudtier_tests: True
+    #client.2:
+      #force-branch: ceph-quincy
+      #rgw_server: client.2
+      #storage classes: LUKEWARM, FROZEN
+      #extra_attrs: ["cloud_transition"]
+      #lc_debug_interval: 10
+      #cloudtier_tests: True
index 94c43895f52adb832bba2c8b2c52b02d8ef5f7ef..bc059c0a34da031a175546490304dcdb898f041a 100644 (file)
@@ -27,8 +27,7 @@ tasks:
 - tox: [ client.0 ]
 - keystone:
     client.0:
 - tox: [ client.0 ]
 - keystone:
     client.0:
-      sha1: 17.0.0.0rc2
-      force-branch: master
+      force-branch: stable/xena
       projects:
         - name: rgwcrypt
           description: Encryption Tenant
       projects:
         - name: rgwcrypt
           description: Encryption Tenant
@@ -69,8 +68,7 @@ tasks:
           description: Swift Service
 - barbican:
     client.0:
           description: Swift Service
 - barbican:
     client.0:
-      sha1: 5.0.1
-      force-branch: master
+      force-branch: stable/xena
       use-keystone-role: client.0
       keystone_authtoken:
         auth_plugin: password
       use-keystone-role: client.0
       keystone_authtoken:
         auth_plugin: password
diff --git a/ceph/qa/suites/rgw/multisite/realms/three-zone-plus-pubsub.yaml b/ceph/qa/suites/rgw/multisite/realms/three-zone-plus-pubsub.yaml
deleted file mode 100644 (file)
index 4d93e7a..0000000
+++ /dev/null
@@ -1,25 +0,0 @@
-overrides:
-  rgw-multisite:
-    realm:
-      name: test-realm
-      is default: true
-    zonegroups:
-      - name: test-zonegroup
-        is_master: true
-        is_default: true
-        endpoints: [c1.client.0]
-        zones:
-          - name: test-zone1
-            is_master: true
-            is_default: true
-            endpoints: [c1.client.0]
-          - name: test-zone2
-            is_default: true
-            endpoints: [c2.client.0]
-          - name: test-zone3
-            endpoints: [c1.client.1]
-          - name: test-zone4
-            endpoints: [c2.client.1]
-            is_pubsub: true
-  rgw-multisite-tests:
-    args: [tests.py, tests_ps.py]
diff --git a/ceph/qa/suites/rgw/multisite/realms/three-zones.yaml b/ceph/qa/suites/rgw/multisite/realms/three-zones.yaml
new file mode 100644 (file)
index 0000000..cfa17e9
--- /dev/null
@@ -0,0 +1,22 @@
+overrides:
+  rgw-multisite:
+    realm:
+      name: test-realm
+      is default: true
+    zonegroups:
+      - name: test-zonegroup
+        is_master: true
+        is_default: true
+        endpoints: [c1.client.0]
+        zones:
+          - name: test-zone1
+            is_master: true
+            is_default: true
+            endpoints: [c1.client.0]
+          - name: test-zone2
+            is_default: true
+            endpoints: [c2.client.0]
+          - name: test-zone3
+            endpoints: [c1.client.1]
+  rgw-multisite-tests:
+    args: [tests.py]
index 68cb35cc4e03243e4a1f9bd941b764fb29d3f10b..1413465a36b0918b61197ada732760c20efb05ba 100644 (file)
@@ -4,8 +4,7 @@ tasks:
 - tox: [ client.0 ]
 - keystone:
     client.0:
 - tox: [ client.0 ]
 - keystone:
     client.0:
-      sha1: 17.0.0.0rc2
-      force-branch: master
+      force-branch: stable/xena
       services:
         - name: swift
           type: object-store
       services:
         - name: swift
           type: object-store
@@ -16,7 +15,7 @@ tasks:
       use-keystone-role: client.0
 - tempest:
     client.0:
       use-keystone-role: client.0
 - tempest:
     client.0:
-      sha1: train-last
+      sha1: 30.0.0
       force-branch: master
       use-keystone-role: client.0
       auth:
       force-branch: master
       use-keystone-role: client.0
       auth:
@@ -45,6 +44,10 @@ tasks:
         - .*test_container_synchronization.*
         - .*test_object_services.PublicObjectTest.test_access_public_container_object_without_using_creds
         - .*test_object_services.ObjectTest.test_create_object_with_transfer_encoding
         - .*test_container_synchronization.*
         - .*test_object_services.PublicObjectTest.test_access_public_container_object_without_using_creds
         - .*test_object_services.ObjectTest.test_create_object_with_transfer_encoding
+        - .*test_container_services.ContainerTest.test_create_container_with_remove_metadata_key
+        - .*test_container_services.ContainerTest.test_create_container_with_remove_metadata_value
+        - .*test_object_expiry.ObjectExpiryTest.test_get_object_after_expiry_time
+        - .*test_object_expiry.ObjectExpiryTest.test_get_object_at_expiry_time
 
 overrides:
   ceph:
 
 overrides:
   ceph:
diff --git a/ceph/qa/suites/upgrade-clients/client-upgrade-quincy-reef/.qa b/ceph/qa/suites/upgrade-clients/client-upgrade-quincy-reef/.qa
new file mode 120000 (symlink)
index 0000000..a23f7e0
--- /dev/null
@@ -0,0 +1 @@
+../../.qa
\ No newline at end of file
diff --git a/ceph/qa/suites/upgrade-clients/client-upgrade-quincy-reef/quincy-client-x/rbd/% b/ceph/qa/suites/upgrade-clients/client-upgrade-quincy-reef/quincy-client-x/rbd/%
new file mode 100644 (file)
index 0000000..e69de29
diff --git a/ceph/qa/suites/upgrade-clients/client-upgrade-quincy-reef/quincy-client-x/rbd/.qa b/ceph/qa/suites/upgrade-clients/client-upgrade-quincy-reef/quincy-client-x/rbd/.qa
new file mode 120000 (symlink)
index 0000000..a23f7e0
--- /dev/null
@@ -0,0 +1 @@
+../../.qa
\ No newline at end of file
diff --git a/ceph/qa/suites/upgrade-clients/client-upgrade-quincy-reef/quincy-client-x/rbd/0-cluster/+ b/ceph/qa/suites/upgrade-clients/client-upgrade-quincy-reef/quincy-client-x/rbd/0-cluster/+
new file mode 100644 (file)
index 0000000..e69de29
diff --git a/ceph/qa/suites/upgrade-clients/client-upgrade-quincy-reef/quincy-client-x/rbd/0-cluster/.qa b/ceph/qa/suites/upgrade-clients/client-upgrade-quincy-reef/quincy-client-x/rbd/0-cluster/.qa
new file mode 120000 (symlink)
index 0000000..a602a03
--- /dev/null
@@ -0,0 +1 @@
+../.qa/
\ No newline at end of file
diff --git a/ceph/qa/suites/upgrade-clients/client-upgrade-quincy-reef/quincy-client-x/rbd/0-cluster/openstack.yaml b/ceph/qa/suites/upgrade-clients/client-upgrade-quincy-reef/quincy-client-x/rbd/0-cluster/openstack.yaml
new file mode 100644 (file)
index 0000000..b0f3b9b
--- /dev/null
@@ -0,0 +1,4 @@
+openstack:
+  - volumes: # attached to each instance
+      count: 4
+      size: 30 # GB
diff --git a/ceph/qa/suites/upgrade-clients/client-upgrade-quincy-reef/quincy-client-x/rbd/0-cluster/start.yaml b/ceph/qa/suites/upgrade-clients/client-upgrade-quincy-reef/quincy-client-x/rbd/0-cluster/start.yaml
new file mode 100644 (file)
index 0000000..b2bce03
--- /dev/null
@@ -0,0 +1,19 @@
+meta:
+- desc: |
+   Install and run ceph on one node,
+   with a separate client 1.
+   Upgrade client 1 to reef
+   Run tests against old cluster
+roles:
+- - mon.a
+  - mon.b
+  - mon.c
+  - osd.0
+  - osd.1
+  - osd.2
+  - client.0
+  - mgr.x
+- - client.1
+overrides:
+  ceph:
+    fs: xfs
diff --git a/ceph/qa/suites/upgrade-clients/client-upgrade-quincy-reef/quincy-client-x/rbd/1-install/.qa b/ceph/qa/suites/upgrade-clients/client-upgrade-quincy-reef/quincy-client-x/rbd/1-install/.qa
new file mode 120000 (symlink)
index 0000000..a602a03
--- /dev/null
@@ -0,0 +1 @@
+../.qa/
\ No newline at end of file
diff --git a/ceph/qa/suites/upgrade-clients/client-upgrade-quincy-reef/quincy-client-x/rbd/1-install/quincy-client-x.yaml b/ceph/qa/suites/upgrade-clients/client-upgrade-quincy-reef/quincy-client-x/rbd/1-install/quincy-client-x.yaml
new file mode 100644 (file)
index 0000000..f333ef3
--- /dev/null
@@ -0,0 +1,11 @@
+tasks:
+- install:
+    branch: quincy
+    exclude_packages: ['ceph-mgr','libcephfs2','libcephfs-devel','libcephfs-dev','python34-cephfs','python34-rados']
+- print: "**** done install quincy"
+- install.upgrade:
+   exclude_packages: ['ceph-test', 'ceph-test-dbg','libcephfs1', 'python-ceph']
+   client.1:
+- print: "**** done install.upgrade to -x on client.1"
+- ceph:
+- print: "**** done ceph task"
diff --git a/ceph/qa/suites/upgrade-clients/client-upgrade-quincy-reef/quincy-client-x/rbd/2-workload/.qa b/ceph/qa/suites/upgrade-clients/client-upgrade-quincy-reef/quincy-client-x/rbd/2-workload/.qa
new file mode 120000 (symlink)
index 0000000..a602a03
--- /dev/null
@@ -0,0 +1 @@
+../.qa/
\ No newline at end of file
diff --git a/ceph/qa/suites/upgrade-clients/client-upgrade-quincy-reef/quincy-client-x/rbd/2-workload/rbd_notification_tests.yaml b/ceph/qa/suites/upgrade-clients/client-upgrade-quincy-reef/quincy-client-x/rbd/2-workload/rbd_notification_tests.yaml
new file mode 100644 (file)
index 0000000..d3f5306
--- /dev/null
@@ -0,0 +1,34 @@
+tasks:
+- parallel:
+  - workunit:
+      branch: quincy
+      clients:
+        client.0:
+          - rbd/notify_master.sh
+      env:
+        RBD_FEATURES: "61"
+  - workunit:
+      branch: reef
+      clients:
+        client.1:
+          - rbd/notify_slave.sh
+      env:
+        RBD_FEATURES: "61"
+        RBD_DISABLE_UPDATE_FEATURES: "1"
+- print: "**** done rbd: old librbd -> new librbd"
+- parallel:
+  - workunit:
+      branch: quincy
+      clients:
+        client.0:
+          - rbd/notify_slave.sh
+      env:
+        RBD_FEATURES: "61"
+  - workunit:
+      branch: reef
+      clients:
+        client.1:
+          - rbd/notify_master.sh
+      env:
+        RBD_FEATURES: "61"
+- print: "**** done rbd: new librbd -> old librbd"
diff --git a/ceph/qa/suites/upgrade-clients/client-upgrade-quincy-reef/quincy-client-x/rbd/supported/.qa b/ceph/qa/suites/upgrade-clients/client-upgrade-quincy-reef/quincy-client-x/rbd/supported/.qa
new file mode 120000 (symlink)
index 0000000..a602a03
--- /dev/null
@@ -0,0 +1 @@
+../.qa/
\ No newline at end of file
diff --git a/ceph/qa/suites/upgrade-clients/client-upgrade-quincy-reef/quincy-client-x/rbd/supported/ubuntu_20.04.yaml b/ceph/qa/suites/upgrade-clients/client-upgrade-quincy-reef/quincy-client-x/rbd/supported/ubuntu_20.04.yaml
new file mode 120000 (symlink)
index 0000000..834ac14
--- /dev/null
@@ -0,0 +1 @@
+../../../../../../distros/all/ubuntu_20.04.yaml
\ No newline at end of file
index 30016d96e7f55060146f5a6091d6d315f509aa73..86fc0732fc79478b68858cb7f4da5a3d2848b063 100644 (file)
@@ -16,8 +16,5 @@ overrides:
           - name: test-zone2
             is_default: true
             endpoints: [c2.client.0]
           - name: test-zone2
             is_default: true
             endpoints: [c2.client.0]
-          - name: test-zone3
-            endpoints: [c2.client.1]
-            is_pubsub: true
   rgw-multisite-tests:
   rgw-multisite-tests:
-    args: [tests.py, tests_ps.py]
+    args: [tests.py]
diff --git a/ceph/qa/suites/upgrade/quincy-p2p/quincy-p2p-parallel/% b/ceph/qa/suites/upgrade/quincy-p2p/quincy-p2p-parallel/%
new file mode 100644 (file)
index 0000000..e69de29
diff --git a/ceph/qa/suites/upgrade/quincy-p2p/quincy-p2p-parallel/point-to-point-upgrade.yaml b/ceph/qa/suites/upgrade/quincy-p2p/quincy-p2p-parallel/point-to-point-upgrade.yaml
new file mode 100644 (file)
index 0000000..160f1cd
--- /dev/null
@@ -0,0 +1,179 @@
+meta:
+- desc: |
+   Run ceph on two nodes, using one of them as a client,
+   with a separate client-only node.
+   Use xfs beneath the osds.
+   install ceph/quincy v17.2.5 and the v17.2.x point versions
+   run workload and upgrade-sequence in parallel
+   (every point release should be tested)
+   run workload and upgrade-sequence in parallel
+   install ceph/quincy  latest version
+   run workload and upgrade-sequence in parallel
+   Overall upgrade path is - quincy-latest.point-1 => quincy-latest.point => quincy-latest
+overrides:
+  ceph:
+    log-ignorelist:
+    - reached quota
+    - scrub
+    - osd_map_max_advance
+    - wrongly marked
+    - FS_DEGRADED
+    - POOL_APP_NOT_ENABLED
+    - CACHE_POOL_NO_HIT_SET
+    - POOL_FULL
+    - SMALLER_PG
+    - pool\(s\) full
+    - OSD_DOWN
+    - missing hit_sets
+    - CACHE_POOL_NEAR_FULL
+    - PG_AVAILABILITY
+    - PG_DEGRADED
+    - application not enabled
+    - cache pools at or near target size
+    - filesystem is degraded
+    - OBJECT_MISPLACED
+    ### ref: https://tracker.ceph.com/issues/40251
+    #removed see ^ - failed to encode map
+
+    fs: xfs
+
+    conf:
+      global:
+        mon_warn_on_pool_no_app: false
+        mon_mds_skip_sanity: true
+      mon:
+        mon debug unsafe allow tier with nonempty snaps: true
+      osd:
+        osd map max advance: 1000
+        osd_class_default_list: "*"
+        osd_class_load_list: "*"
+      client:
+        rgw_crypt_require_ssl: false
+        rgw crypt s3 kms backend: testing
+        rgw crypt s3 kms encryption keys: testkey-1=YmluCmJvb3N0CmJvb3N0LWJ1aWxkCmNlcGguY29uZgo= testkey-2=aWIKTWFrZWZpbGUKbWFuCm91dApzcmMKVGVzdGluZwo=
+roles:
+- - mon.a
+  - mds.a
+  - osd.0
+  - osd.1
+  - osd.2
+  - mgr.x
+- - mon.b
+  - mon.c
+  - osd.3
+  - osd.4
+  - osd.5
+  - client.0
+- - client.1
+openstack:
+- volumes: # attached to each instance
+    count: 3
+    size: 30 # GB
+tasks:
+- print: "****  done quincy about to install v17.2.0 "
+- install:
+    tag: v17.2.0
+    # line below can be removed its from jewel test
+    #exclude_packages: ['ceph-mgr','libcephfs2','libcephfs-devel','libcephfs-dev', 'librgw2']
+- print: "**** done v17.2.0 install"
+- ceph:
+   fs: xfs
+   add_osds_to_crush: true
+- print: "**** done ceph xfs"
+- sequential:
+   - workload
+- print: "**** done workload v17.2.0"
+
+
+#######  upgrade to v17.2.5
+- install.upgrade:
+    #exclude_packages: ['ceph-mgr','libcephfs2','libcephfs-devel','libcephfs-dev']
+    mon.a:
+      tag: v17.2.5
+    mon.b:
+      tag: v17.2.5
+- parallel:
+   - workload_quincy
+   - upgrade-sequence_quincy
+- print: "**** done parallel quincy v17.2.5"
+
+####  upgrade to latest quincy
+- install.upgrade:
+    mon.a:
+    mon.b:
+- parallel:
+   - workload_quincy
+   - upgrade-sequence_quincy
+- print: "**** done parallel quincy branch"
+
+#######################
+workload:
+   sequential:
+   - workunit:
+       clients:
+         client.0:
+           - suites/blogbench.sh
+
+workload_quincy:
+   full_sequential:
+   - workunit:
+       branch: quincy
+       # tag: v17.2.5
+       clients:
+         client.1:
+         - rados/test.sh
+         - cls
+       env:
+         CLS_RBD_GTEST_FILTER: '*:-TestClsRbd.snapshots_namespaces'
+   - print: "**** done rados/test.sh &  cls workload_quincy"
+   - sequential:
+     - rgw: [client.0]
+     - print: "**** done rgw workload_quincy"
+     - s3tests:
+         client.0:
+           force-branch: ceph-quincy
+           rgw_server: client.0
+           scan_for_encryption_keys: false
+     - print: "**** done s3tests workload_quincy"
+     - rbd_fsx:
+         clients: [client.0]
+         size: 134217728
+     - print: "**** done rbd_fsx workload_quincy"
+         
+upgrade-sequence_quincy:
+   sequential:
+   - print: "**** done branch: quincy install.upgrade"
+   - ceph.restart: [mds.a]
+   - sleep:
+       duration: 60
+   - ceph.restart: [osd.0]
+   - sleep:
+       duration: 30
+   - ceph.restart: [osd.1]
+   - sleep:
+       duration: 30
+   - ceph.restart: [osd.2]
+   - sleep:
+       duration: 30
+   - ceph.restart: [osd.3]
+   - sleep:
+       duration: 30
+   - ceph.restart: [osd.4]
+   - sleep:
+       duration: 30
+   - ceph.restart: [osd.5]
+   - sleep:
+       duration: 60
+   - ceph.restart: [mgr.x]
+   - sleep:
+       duration: 60
+   - ceph.restart: [mon.a]
+   - sleep:
+       duration: 60
+   - ceph.restart: [mon.b]
+   - sleep:
+       duration: 60
+   - ceph.restart: [mon.c]
+   - sleep:
+       duration: 60
+   - print: "**** done ceph.restart all quincy branch mds/osd/mon"
diff --git a/ceph/qa/suites/upgrade/quincy-p2p/quincy-p2p-parallel/supported-all-distro/centos_8.yaml b/ceph/qa/suites/upgrade/quincy-p2p/quincy-p2p-parallel/supported-all-distro/centos_8.yaml
new file mode 120000 (symlink)
index 0000000..bb4a6aa
--- /dev/null
@@ -0,0 +1 @@
+../../../../../distros/supported-all-distro/centos_8.yaml
\ No newline at end of file
diff --git a/ceph/qa/suites/upgrade/quincy-p2p/quincy-p2p-parallel/supported-all-distro/ubuntu_latest.yaml b/ceph/qa/suites/upgrade/quincy-p2p/quincy-p2p-parallel/supported-all-distro/ubuntu_latest.yaml
new file mode 100644 (file)
index 0000000..f203982
--- /dev/null
@@ -0,0 +1,2 @@
+os_type: ubuntu
+os_version: "20.04"
diff --git a/ceph/qa/suites/upgrade/quincy-p2p/quincy-p2p-stress-split/% b/ceph/qa/suites/upgrade/quincy-p2p/quincy-p2p-stress-split/%
new file mode 100644 (file)
index 0000000..e69de29
diff --git a/ceph/qa/suites/upgrade/quincy-p2p/quincy-p2p-stress-split/0-cluster/+ b/ceph/qa/suites/upgrade/quincy-p2p/quincy-p2p-stress-split/0-cluster/+
new file mode 100644 (file)
index 0000000..e69de29
diff --git a/ceph/qa/suites/upgrade/quincy-p2p/quincy-p2p-stress-split/0-cluster/openstack.yaml b/ceph/qa/suites/upgrade/quincy-p2p/quincy-p2p-stress-split/0-cluster/openstack.yaml
new file mode 100644 (file)
index 0000000..5caffc3
--- /dev/null
@@ -0,0 +1,6 @@
+openstack:
+  - machine:
+      disk: 100 # GB
+  - volumes: # attached to each instance
+      count: 4
+      size: 30 # GB
diff --git a/ceph/qa/suites/upgrade/quincy-p2p/quincy-p2p-stress-split/0-cluster/start.yaml b/ceph/qa/suites/upgrade/quincy-p2p/quincy-p2p-stress-split/0-cluster/start.yaml
new file mode 100644 (file)
index 0000000..1271edd
--- /dev/null
@@ -0,0 +1,33 @@
+meta:
+- desc: |
+   Run ceph on two nodes,
+   with a separate client-only node.
+   Use xfs beneath the osds.
+overrides:
+  ceph:
+    fs: xfs
+    log-ignorelist:
+      - overall HEALTH_
+      - \(MON_DOWN\)
+      - \(MGR_DOWN\)
+      ### ref: https://tracker.ceph.com/issues/40251
+      #removed see ^ - failed to encode map
+    conf:
+      global:
+        enable experimental unrecoverable data corrupting features: "*"
+      mon:
+        mon warn on osd down out interval zero: false
+roles:
+- - mon.a
+  - mon.b
+  - mon.c
+  - mgr.x
+  - osd.0
+  - osd.1
+  - osd.2
+  - osd.3
+- - osd.4
+  - osd.5
+  - osd.6
+  - osd.7
+- - client.0
diff --git a/ceph/qa/suites/upgrade/quincy-p2p/quincy-p2p-stress-split/1-ceph-install/quincy.yaml b/ceph/qa/suites/upgrade/quincy-p2p/quincy-p2p-stress-split/1-ceph-install/quincy.yaml
new file mode 100644 (file)
index 0000000..a284cc8
--- /dev/null
@@ -0,0 +1,21 @@
+meta:
+- desc: |
+   install ceph/quincy v17.2.0
+   Overall upgrade path is - quincy-latest.point -1 => quincy-latest
+tasks:
+- install:
+    tag: v17.2.0
+    exclude_packages: ['librados3']
+    extra_packages: ['librados2']
+- print: "**** done install quincy v17.2.0"
+- ceph:
+- exec:
+    osd.0:
+      - ceph osd require-osd-release quincy
+      - ceph osd set-require-min-compat-client quincy
+- print: "**** done ceph"
+overrides:
+  ceph:
+    conf:
+      mon:
+        mon warn on osd down out interval zero: false
diff --git a/ceph/qa/suites/upgrade/quincy-p2p/quincy-p2p-stress-split/1.1.short_pg_log.yaml b/ceph/qa/suites/upgrade/quincy-p2p/quincy-p2p-stress-split/1.1.short_pg_log.yaml
new file mode 100644 (file)
index 0000000..20cc101
--- /dev/null
@@ -0,0 +1,6 @@
+overrides:
+  ceph:
+    conf:
+      global:
+        osd_min_pg_log_entries: 1
+        osd_max_pg_log_entries: 2
diff --git a/ceph/qa/suites/upgrade/quincy-p2p/quincy-p2p-stress-split/2-partial-upgrade/firsthalf.yaml b/ceph/qa/suites/upgrade/quincy-p2p/quincy-p2p-stress-split/2-partial-upgrade/firsthalf.yaml
new file mode 100644 (file)
index 0000000..02ba5c1
--- /dev/null
@@ -0,0 +1,13 @@
+meta:
+- desc: |
+   install upgrade ceph/-x on one node only
+   1st half
+   restart : osd.0,1,2,3
+tasks:
+- install.upgrade:
+    osd.0:
+- print: "**** done install.upgrade osd.0"
+- ceph.restart:
+    daemons: [mon.a,mon.b,mon.c,mgr.x,osd.0,osd.1,osd.2,osd.3]
+    mon-health-to-clog: false
+- print: "**** done ceph.restart 1st half"
diff --git a/ceph/qa/suites/upgrade/quincy-p2p/quincy-p2p-stress-split/3-thrash/default.yaml b/ceph/qa/suites/upgrade/quincy-p2p/quincy-p2p-stress-split/3-thrash/default.yaml
new file mode 100644 (file)
index 0000000..c739d8f
--- /dev/null
@@ -0,0 +1,27 @@
+meta:
+- desc: |
+   randomly kill and revive osd
+   small chance to increase the number of pgs
+overrides:
+  ceph:
+    log-ignorelist:
+    - but it is still running
+    - wrongly marked me down
+    - objects unfound and apparently lost
+    - log bound mismatch
+    ### ref: https://tracker.ceph.com/issues/40251
+    - failed to encode map
+tasks:
+- parallel:
+  - stress-tasks
+stress-tasks:
+- thrashosds:
+    timeout: 1200
+    chance_pgnum_grow: 1
+    chance_pgpnum_fix: 1
+    chance_thrash_cluster_full: 0
+    chance_thrash_pg_upmap: 0
+    chance_thrash_pg_upmap_items: 0
+    disable_objectstore_tool_tests: true
+    chance_force_recovery: 0
+- print: "**** done thrashosds 3-thrash"
diff --git a/ceph/qa/suites/upgrade/quincy-p2p/quincy-p2p-stress-split/4-workload/+ b/ceph/qa/suites/upgrade/quincy-p2p/quincy-p2p-stress-split/4-workload/+
new file mode 100644 (file)
index 0000000..e69de29
diff --git a/ceph/qa/suites/upgrade/quincy-p2p/quincy-p2p-stress-split/4-workload/fsx.yaml b/ceph/qa/suites/upgrade/quincy-p2p/quincy-p2p-stress-split/4-workload/fsx.yaml
new file mode 100644 (file)
index 0000000..fd4081f
--- /dev/null
@@ -0,0 +1,8 @@
+meta:
+- desc: |
+   run basic fsx tests for rbd
+stress-tasks:
+- rbd_fsx:
+    clients: [client.0]
+    size: 134217728
+- print: "**** done rbd_fsx 4-workload"
diff --git a/ceph/qa/suites/upgrade/quincy-p2p/quincy-p2p-stress-split/4-workload/radosbench.yaml b/ceph/qa/suites/upgrade/quincy-p2p/quincy-p2p-stress-split/4-workload/radosbench.yaml
new file mode 100644 (file)
index 0000000..c545936
--- /dev/null
@@ -0,0 +1,52 @@
+meta:
+- desc: |
+   run randomized correctness test for rados operations
+   generate write load with rados bench
+stress-tasks:
+- full_sequential:
+  - radosbench:
+      clients: [client.0]
+      time: 90
+  - radosbench:
+      clients: [client.0]
+      time: 90
+  - radosbench:
+      clients: [client.0]
+      time: 90
+  - radosbench:
+      clients: [client.0]
+      time: 90
+  - radosbench:
+      clients: [client.0]
+      time: 90
+  - radosbench:
+      clients: [client.0]
+      time: 90
+  - radosbench:
+      clients: [client.0]
+      time: 90
+  - radosbench:
+      clients: [client.0]
+      time: 90
+  - radosbench:
+      clients: [client.0]
+      time: 90
+  - radosbench:
+      clients: [client.0]
+      time: 90
+  - radosbench:
+      clients: [client.0]
+      time: 90
+  - radosbench:
+      clients: [client.0]
+      time: 90
+  - radosbench:
+      clients: [client.0]
+      time: 90
+  - radosbench:
+      clients: [client.0]
+      time: 90
+  - radosbench:
+      clients: [client.0]
+      time: 90
+- print: "**** done radosbench 4-workload"
diff --git a/ceph/qa/suites/upgrade/quincy-p2p/quincy-p2p-stress-split/4-workload/rbd-cls.yaml b/ceph/qa/suites/upgrade/quincy-p2p/quincy-p2p-stress-split/4-workload/rbd-cls.yaml
new file mode 100644 (file)
index 0000000..3d01d37
--- /dev/null
@@ -0,0 +1,10 @@
+meta:
+- desc: |
+   run basic cls tests for rbd
+stress-tasks:
+- workunit:
+    branch: quincy
+    clients:
+      client.0:
+        - cls/test_cls_rbd.sh
+- print: "**** done cls/test_cls_rbd.sh 4-workload"
diff --git a/ceph/qa/suites/upgrade/quincy-p2p/quincy-p2p-stress-split/4-workload/rbd-import-export.yaml b/ceph/qa/suites/upgrade/quincy-p2p/quincy-p2p-stress-split/4-workload/rbd-import-export.yaml
new file mode 100644 (file)
index 0000000..4accb11
--- /dev/null
@@ -0,0 +1,12 @@
+meta:
+- desc: |
+   run basic import/export cli tests for rbd
+stress-tasks:
+- workunit:
+    branch: quincy
+    clients:
+      client.0:
+        - rbd/import_export.sh
+    env:
+      RBD_CREATE_ARGS: --new-format
+- print: "**** done rbd/import_export.sh 4-workload"
diff --git a/ceph/qa/suites/upgrade/quincy-p2p/quincy-p2p-stress-split/4-workload/rbd_api.yaml b/ceph/qa/suites/upgrade/quincy-p2p/quincy-p2p-stress-split/4-workload/rbd_api.yaml
new file mode 100644 (file)
index 0000000..09a6060
--- /dev/null
@@ -0,0 +1,18 @@
+meta:
+- desc: |
+   librbd C and C++ api tests
+overrides:
+  ceph:
+    log-ignorelist:
+      - overall HEALTH_
+      - \(CACHE_POOL_NO_HIT_SET\)
+      - \(POOL_APP_NOT_ENABLED\)
+      - is full \(reached quota
+      - \(POOL_FULL\)
+stress-tasks:
+- workunit:
+     branch: quincy
+     clients:
+        client.0:
+           - rbd/test_librbd.sh
+- print: "**** done rbd/test_librbd.sh 4-workload"
diff --git a/ceph/qa/suites/upgrade/quincy-p2p/quincy-p2p-stress-split/4-workload/readwrite.yaml b/ceph/qa/suites/upgrade/quincy-p2p/quincy-p2p-stress-split/4-workload/readwrite.yaml
new file mode 100644 (file)
index 0000000..4568689
--- /dev/null
@@ -0,0 +1,16 @@
+meta:
+- desc: |
+   randomized correctness test for rados operations on a replicated pool,
+   using only reads, writes, and deletes
+stress-tasks:
+- full_sequential:
+  - rados:
+      clients: [client.0]
+      ops: 4000
+      objects: 500
+      write_append_excl: false
+      op_weights:
+        read: 45
+        write: 45
+        delete: 10
+- print: "**** done rados/readwrite 4-workload"
diff --git a/ceph/qa/suites/upgrade/quincy-p2p/quincy-p2p-stress-split/4-workload/snaps-few-objects.yaml b/ceph/qa/suites/upgrade/quincy-p2p/quincy-p2p-stress-split/4-workload/snaps-few-objects.yaml
new file mode 100644 (file)
index 0000000..ae232d8
--- /dev/null
@@ -0,0 +1,18 @@
+meta:
+- desc: |
+   randomized correctness test for rados operations on a replicated pool with snapshot operations
+stress-tasks:
+- full_sequential:
+  - rados:
+      clients: [client.0]
+      ops: 4000
+      objects: 50
+      write_append_excl: false
+      op_weights:
+        read: 100
+        write: 100
+        delete: 50
+        snap_create: 50
+        snap_remove: 50
+        rollback: 50
+- print: "**** done rados/snaps-few-objects 4-workload"
diff --git a/ceph/qa/suites/upgrade/quincy-p2p/quincy-p2p-stress-split/5-finish-upgrade.yaml b/ceph/qa/suites/upgrade/quincy-p2p/quincy-p2p-stress-split/5-finish-upgrade.yaml
new file mode 100644 (file)
index 0000000..803737c
--- /dev/null
@@ -0,0 +1,8 @@
+tasks:
+- install.upgrade:
+    osd.4:
+    client.0:
+- ceph.restart:
+    daemons: [osd.4, osd.5, osd.6, osd.7]
+    wait-for-healthy: false
+    wait-for-osds-up: true
diff --git a/ceph/qa/suites/upgrade/quincy-p2p/quincy-p2p-stress-split/6-final-workload/+ b/ceph/qa/suites/upgrade/quincy-p2p/quincy-p2p-stress-split/6-final-workload/+
new file mode 100644 (file)
index 0000000..e69de29
diff --git a/ceph/qa/suites/upgrade/quincy-p2p/quincy-p2p-stress-split/6-final-workload/rbd-python.yaml b/ceph/qa/suites/upgrade/quincy-p2p/quincy-p2p-stress-split/6-final-workload/rbd-python.yaml
new file mode 100644 (file)
index 0000000..02170d8
--- /dev/null
@@ -0,0 +1,10 @@
+meta:
+- desc: |
+   librbd python api tests
+tasks:
+- workunit:
+    tag: v17.2.5
+    clients:
+      client.0:
+        - rbd/test_librbd_python.sh
+- print: "**** done rbd/test_librbd_python.sh 7-workload"
diff --git a/ceph/qa/suites/upgrade/quincy-p2p/quincy-p2p-stress-split/6-final-workload/snaps-many-objects.yaml b/ceph/qa/suites/upgrade/quincy-p2p/quincy-p2p-stress-split/6-final-workload/snaps-many-objects.yaml
new file mode 100644 (file)
index 0000000..805bf97
--- /dev/null
@@ -0,0 +1,16 @@
+meta:
+- desc: |
+   randomized correctness test for rados operations on a replicated pool with snapshot operations
+tasks:
+- rados:
+    clients: [client.0]
+    ops: 4000
+    objects: 500
+    write_append_excl: false
+    op_weights:
+      read: 100
+      write: 100
+      delete: 50
+      snap_create: 50
+      snap_remove: 50
+      rollback: 50
diff --git a/ceph/qa/suites/upgrade/quincy-p2p/quincy-p2p-stress-split/objectstore/bluestore-bitmap.yaml b/ceph/qa/suites/upgrade/quincy-p2p/quincy-p2p-stress-split/objectstore/bluestore-bitmap.yaml
new file mode 100644 (file)
index 0000000..b18e04b
--- /dev/null
@@ -0,0 +1,43 @@
+overrides:
+  thrashosds:
+    bdev_inject_crash: 2
+    bdev_inject_crash_probability: .5
+  ceph:
+    fs: xfs
+    conf:
+      osd:
+        osd objectstore: bluestore
+        bluestore block size: 96636764160
+        debug bluestore: 20
+        debug bluefs: 20
+        debug rocksdb: 10
+        bluestore fsck on mount: true
+        bluestore allocator: bitmap
+        # lower the full ratios since we can fill up a 100gb osd so quickly
+        mon osd full ratio: .9
+        mon osd backfillfull_ratio: .85
+        mon osd nearfull ratio: .8
+        osd failsafe full ratio: .95
+# this doesn't work with failures bc the log writes are not atomic across the two backends
+#        bluestore bluefs env mirror: true
+        bdev enable discard: true
+        bdev async discard: true
+  ceph-deploy:
+    fs: xfs
+    bluestore: yes
+    conf:
+      osd:
+        osd objectstore: bluestore
+        bluestore block size: 96636764160
+        debug bluestore: 20
+        debug bluefs: 20
+        debug rocksdb: 10
+        bluestore fsck on mount: true
+        # lower the full ratios since we can fill up a 100gb osd so quickly
+        mon osd full ratio: .9
+        mon osd backfillfull_ratio: .85
+        mon osd nearfull ratio: .8
+        osd failsafe full ratio: .95
+        bdev enable discard: true
+        bdev async discard: true
+
diff --git a/ceph/qa/suites/upgrade/quincy-p2p/quincy-p2p-stress-split/objectstore/bluestore-comp.yaml b/ceph/qa/suites/upgrade/quincy-p2p/quincy-p2p-stress-split/objectstore/bluestore-comp.yaml
new file mode 100644 (file)
index 0000000..b408032
--- /dev/null
@@ -0,0 +1,23 @@
+overrides:
+  thrashosds:
+    bdev_inject_crash: 2
+    bdev_inject_crash_probability: .5
+  ceph:
+    fs: xfs
+    conf:
+      osd:
+        osd objectstore: bluestore
+        bluestore block size: 96636764160
+        debug bluestore: 20
+        debug bluefs: 20
+        debug rocksdb: 10
+        bluestore compression mode: aggressive
+        bluestore fsck on mount: true
+        # lower the full ratios since we can fill up a 100gb osd so quickly
+        mon osd full ratio: .9
+        mon osd backfillfull_ratio: .85
+        mon osd nearfull ratio: .8
+        osd failsafe full ratio: .95
+
+# this doesn't work with failures bc the log writes are not atomic across the two backends
+#        bluestore bluefs env mirror: true
diff --git a/ceph/qa/suites/upgrade/quincy-p2p/quincy-p2p-stress-split/objectstore/bluestore-stupid.yaml b/ceph/qa/suites/upgrade/quincy-p2p/quincy-p2p-stress-split/objectstore/bluestore-stupid.yaml
new file mode 100644 (file)
index 0000000..ca811f1
--- /dev/null
@@ -0,0 +1,43 @@
+overrides:
+  thrashosds:
+    bdev_inject_crash: 2
+    bdev_inject_crash_probability: .5
+  ceph:
+    fs: xfs
+    conf:
+      osd:
+        osd objectstore: bluestore
+        bluestore block size: 96636764160
+        debug bluestore: 20
+        debug bluefs: 20
+        debug rocksdb: 10
+        bluestore fsck on mount: true
+        bluestore allocator: stupid
+        # lower the full ratios since we can fill up a 100gb osd so quickly
+        mon osd full ratio: .9
+        mon osd backfillfull_ratio: .85
+        mon osd nearfull ratio: .8
+        osd failsafe full ratio: .95
+# this doesn't work with failures bc the log writes are not atomic across the two backends
+#        bluestore bluefs env mirror: true
+        bdev enable discard: true
+        bdev async discard: true
+  ceph-deploy:
+    fs: xfs
+    bluestore: yes
+    conf:
+      osd:
+        osd objectstore: bluestore
+        bluestore block size: 96636764160
+        debug bluestore: 20
+        debug bluefs: 20
+        debug rocksdb: 10
+        bluestore fsck on mount: true
+        # lower the full ratios since we can fill up a 100gb osd so quickly
+        mon osd full ratio: .9
+        mon osd backfillfull_ratio: .85
+        mon osd nearfull ratio: .8
+        osd failsafe full ratio: .95
+        bdev enable discard: true
+        bdev async discard: true
+
diff --git a/ceph/qa/suites/upgrade/quincy-p2p/quincy-p2p-stress-split/objectstore/filestore-xfs.yaml b/ceph/qa/suites/upgrade/quincy-p2p/quincy-p2p-stress-split/objectstore/filestore-xfs.yaml
new file mode 100644 (file)
index 0000000..f7aa0dd
--- /dev/null
@@ -0,0 +1,15 @@
+overrides:
+  ceph:
+    fs: xfs
+    conf:
+      osd:
+        osd objectstore: filestore
+        osd sloppy crc: true
+  ceph-deploy:
+    fs: xfs
+    filestore: True
+    conf:
+      osd:
+        osd objectstore: filestore
+        osd sloppy crc: true
+
diff --git a/ceph/qa/suites/upgrade/quincy-p2p/quincy-p2p-stress-split/supported-all-distro/ubuntu_latest.yaml b/ceph/qa/suites/upgrade/quincy-p2p/quincy-p2p-stress-split/supported-all-distro/ubuntu_latest.yaml
new file mode 100644 (file)
index 0000000..f203982
--- /dev/null
@@ -0,0 +1,2 @@
+os_type: ubuntu
+os_version: "20.04"
diff --git a/ceph/qa/suites/upgrade/quincy-p2p/quincy-p2p-stress-split/thrashosds-health.yaml b/ceph/qa/suites/upgrade/quincy-p2p/quincy-p2p-stress-split/thrashosds-health.yaml
new file mode 100644 (file)
index 0000000..9903fa5
--- /dev/null
@@ -0,0 +1,15 @@
+overrides:
+  ceph:
+    log-ignorelist:
+      - overall HEALTH_
+      - \(OSDMAP_FLAGS\)
+      - \(OSD_
+      - \(PG_
+      - \(POOL_
+      - \(CACHE_POOL_
+      - \(SMALLER_PGP_NUM\)
+      - \(OBJECT_
+      - \(SLOW_OPS\)
+      - \(REQUEST_SLOW\)
+      - \(TOO_FEW_PGS\)
+      - slow request
index d43568c6103a0ff973a66421c3abcf3d4b95b79f..70bd734053aee66f5ee1a2d9119e6dd5003dc239 100644 (file)
@@ -157,12 +157,6 @@ def fix_barbican_api(ctx, cclient):
                          '/prop_dir =/ s#etc/barbican#{}/etc/barbican#'.format(get_barbican_dir(ctx)),
                          'bin/barbican-api'])
 
                          '/prop_dir =/ s#etc/barbican#{}/etc/barbican#'.format(get_barbican_dir(ctx)),
                          'bin/barbican-api'])
 
-def copy_policy_json(ctx, cclient):
-    run_in_barbican_dir(ctx, cclient,
-                        ['cp',
-                         get_barbican_dir(ctx)+'/etc/barbican/policy.json',
-                         get_barbican_dir(ctx)])
-
 def create_barbican_conf(ctx, cclient):
     barbican_host, barbican_port = ctx.barbican.endpoints[cclient]
     barbican_url = 'http://{host}:{port}'.format(host=barbican_host,
 def create_barbican_conf(ctx, cclient):
     barbican_host, barbican_port = ctx.barbican.endpoints[cclient]
     barbican_url = 'http://{host}:{port}'.format(host=barbican_host,
@@ -174,6 +168,14 @@ def create_barbican_conf(ctx, cclient):
                          'echo -n -e "[DEFAULT]\nhost_href=' + barbican_url + '\n" ' + \
                          '>barbican.conf'])
 
                          'echo -n -e "[DEFAULT]\nhost_href=' + barbican_url + '\n" ' + \
                          '>barbican.conf'])
 
+    log.info("run barbican db upgrade")
+    config_path = get_barbican_dir(ctx) + '/barbican.conf'
+    run_in_barbican_venv(ctx, cclient, ['barbican-manage', '--config-file', config_path,
+                                        'db', 'upgrade'])
+    log.info("run barbican db sync_secret_stores")
+    run_in_barbican_venv(ctx, cclient, ['barbican-manage', '--config-file', config_path,
+                                        'db', 'sync_secret_stores'])
+
 @contextlib.contextmanager
 def configure_barbican(ctx, config):
     """
 @contextlib.contextmanager
 def configure_barbican(ctx, config):
     """
@@ -189,7 +191,6 @@ def configure_barbican(ctx, config):
     set_authtoken_params(ctx, cclient, cconfig)
     fix_barbican_api(ctx, cclient)
     fix_barbican_api_paste(ctx, cclient)
     set_authtoken_params(ctx, cclient, cconfig)
     fix_barbican_api(ctx, cclient)
     fix_barbican_api_paste(ctx, cclient)
-    copy_policy_json(ctx, cclient)
     create_barbican_conf(ctx, cclient)
     try:
         yield
     create_barbican_conf(ctx, cclient)
     try:
         yield
index 602676eed7f736c77b5a3c256bec51307324fe7a..e54a9d98faa3f388259420969f09b1d50b3ba52b 100644 (file)
@@ -156,14 +156,15 @@ def download_cephadm(ctx, config, ref):
         else:
             ctx.cluster.run(
                 args=[
         else:
             ctx.cluster.run(
                 args=[
-                    'git', 'archive',
-                    '--remote=' + git_url,
-                    ref,
-                    'src/cephadm/cephadm',
-                    run.Raw('|'),
-                    'tar', '-xO', 'src/cephadm/cephadm',
+                    'git', 'clone', git_url, 'testrepo',
+                    run.Raw('&&'),
+                    'cd', 'testrepo',
+                    run.Raw('&&'),
+                    'git', 'show', f'{ref}:src/cephadm/cephadm',
                     run.Raw('>'),
                     ctx.cephadm,
                     run.Raw('>'),
                     ctx.cephadm,
+                    run.Raw('&&'),
+                    'ls', '-l', ctx.cephadm,
                 ],
             )
         # sanity-check the resulting file and set executable bit
                 ],
             )
         # sanity-check the resulting file and set executable bit
diff --git a/ceph/qa/tasks/cephadm_cases/test_cli_mon.py b/ceph/qa/tasks/cephadm_cases/test_cli_mon.py
new file mode 100644 (file)
index 0000000..72aee09
--- /dev/null
@@ -0,0 +1,71 @@
+import json
+import logging
+
+from tasks.mgr.mgr_test_case import MgrTestCase
+
+log = logging.getLogger(__name__)
+
+
+class TestCephadmCLI(MgrTestCase):
+
+    APPLY_MON_PERIOD = 60
+
+    def _cmd(self, *args) -> str:
+        assert self.mgr_cluster is not None
+        return self.mgr_cluster.mon_manager.raw_cluster_cmd(*args)
+
+    def _orch_cmd(self, *args) -> str:
+        return self._cmd("orch", *args)
+
+    def setUp(self):
+        super(TestCephadmCLI, self).setUp()
+
+    def _create_and_write_pool(self, pool_name):
+        # Create new pool and write to it, simulating a small workload.
+        self.mgr_cluster.mon_manager.create_pool(pool_name)
+        args = [
+            "rados", "-p", pool_name, "bench", "30", "write", "-t", "16"]
+        self.mgr_cluster.admin_remote.run(args=args, wait=True)
+    
+    def _get_quorum_size(self) -> int:
+        # Evaluate if the quorum size of the cluster is correct.
+        # log the quorum_status before reducing the monitors
+        retstr = self._cmd('quorum_status')
+        log.info("test_apply_mon._check_quorum_size: %s" % json.dumps(retstr, indent=2))
+        quorum_size = len(json.loads(retstr)['quorum']) # get quorum size
+        return quorum_size
+
+    def _check_no_crashes(self):
+        # Evaluate if there are no crashes
+        # log the crash
+        retstr = self.mgr_cluster.mon_manager.raw_cluster_cmd(
+            'crash', 'ls',
+        )
+        log.info("test_apply_mon._check_no_crashes: %s" % retstr)
+        self.assertEqual(0, len(retstr)) # check if there are no crashes
+
+    def test_apply_mon_three(self):
+        # Evaluating the process of reducing the number of 
+        # monitors from 5 to 3 and increasing the number of
+        # monitors from 3 to 5, using the `ceph orch apply mon <num>` command.
+
+        self.wait_until_equal(lambda : self._get_quorum_size(), 5,
+                      timeout=self.APPLY_MON_PERIOD, period=10)
+
+        self._orch_cmd('apply', 'mon', '3') # reduce the monitors from 5 -> 3
+
+        self._create_and_write_pool('test_pool1')
+
+        self.wait_until_equal(lambda : self._get_quorum_size(), 3,
+                      timeout=self.APPLY_MON_PERIOD, period=10)
+
+        self._check_no_crashes()
+
+        self._orch_cmd('apply', 'mon', '5') # increase the monitors from 3 -> 5
+
+        self._create_and_write_pool('test_pool2')
+
+        self.wait_until_equal(lambda : self._get_quorum_size(), 5,
+                      timeout=self.APPLY_MON_PERIOD, period=10)
+
+        self._check_no_crashes()
\ No newline at end of file
index bccf2d3fa24856d35c412b6f8b5a52a332c7801c..c76d28ba62fae8666f3aa163698dd866704da2b2 100644 (file)
@@ -89,6 +89,27 @@ class CephFSTestCase(CephTestCase):
         self._orig_mount_details = [MountDetails(m) for m in self.mounts]
         log.info(self._orig_mount_details)
 
         self._orig_mount_details = [MountDetails(m) for m in self.mounts]
         log.info(self._orig_mount_details)
 
+    def _remove_blocklist(self):
+        # In case anything is in the OSD blocklist list, clear it out.  This is to avoid
+        # the OSD map changing in the background (due to blocklist expiry) while tests run.
+        try:
+            self.mds_cluster.mon_manager.run_cluster_cmd(args="osd blocklist clear")
+        except CommandFailedError:
+            # Fallback for older Ceph cluster
+            try:
+                blocklist = json.loads(self.mds_cluster.mon_manager.raw_cluster_cmd("osd",
+                                      "dump", "--format=json-pretty"))['blocklist']
+                log.info(f"Removing {len(blocklist)} blocklist entries")
+                for addr, blocklisted_at in blocklist.items():
+                    self.mds_cluster.mon_manager.raw_cluster_cmd("osd", "blocklist", "rm", addr)
+            except KeyError:
+                # Fallback for more older Ceph clusters, who will use 'blacklist' instead.
+                blacklist = json.loads(self.mds_cluster.mon_manager.raw_cluster_cmd("osd",
+                                      "dump", "--format=json-pretty"))['blacklist']
+                log.info(f"Removing {len(blacklist)} blacklist entries")
+                for addr, blocklisted_at in blacklist.items():
+                    self.mds_cluster.mon_manager.raw_cluster_cmd("osd", "blacklist", "rm", addr)
+
     def setUp(self):
         super(CephFSTestCase, self).setUp()
 
     def setUp(self):
         super(CephFSTestCase, self).setUp()
 
@@ -128,17 +149,7 @@ class CephFSTestCase(CephTestCase):
         self.backup_fs = None
         self.recovery_fs = None
 
         self.backup_fs = None
         self.recovery_fs = None
 
-        # In case anything is in the OSD blocklist list, clear it out.  This is to avoid
-        # the OSD map changing in the background (due to blocklist expiry) while tests run.
-        try:
-            self.mds_cluster.mon_manager.run_cluster_cmd(args="osd blocklist clear")
-        except CommandFailedError:
-            # Fallback for older Ceph cluster
-            blocklist = json.loads(self.mds_cluster.mon_manager.raw_cluster_cmd("osd",
-                                  "dump", "--format=json-pretty"))['blocklist']
-            log.info("Removing {0} blocklist entries".format(len(blocklist)))
-            for addr, blocklisted_at in blocklist.items():
-                self.mds_cluster.mon_manager.raw_cluster_cmd("osd", "blocklist", "rm", addr)
+        self._remove_blocklist()
 
         client_mount_ids = [m.client_id for m in self.mounts]
         # In case there were any extra auth identities around from a previous
 
         client_mount_ids = [m.client_id for m in self.mounts]
         # In case there were any extra auth identities around from a previous
index 8788070e7170c31df6ca33deb0bc3d6d925c070f..61b6057305910229de8a3682b319124d49156814 100644 (file)
@@ -640,15 +640,27 @@ class Filesystem(MDSCluster):
 
         log.debug("Creating filesystem '{0}'".format(self.name))
 
 
         log.debug("Creating filesystem '{0}'".format(self.name))
 
-        self.mon_manager.raw_cluster_cmd('osd', 'pool', 'create',
-                                         self.metadata_pool_name,
-                                         '--pg_num_min', str(self.pg_num_min))
+        try:
+            self.mon_manager.raw_cluster_cmd('osd', 'pool', 'create',
+                                             self.metadata_pool_name,
+                                             '--pg_num_min', str(self.pg_num_min))
 
 
-        self.mon_manager.raw_cluster_cmd('osd', 'pool', 'create',
-                                         data_pool_name, str(self.pg_num),
-                                         '--pg_num_min', str(self.pg_num_min),
-                                         '--target_size_ratio',
-                                         str(self.target_size_ratio))
+            self.mon_manager.raw_cluster_cmd('osd', 'pool', 'create',
+                                             data_pool_name, str(self.pg_num),
+                                             '--pg_num_min', str(self.pg_num_min),
+                                             '--target_size_ratio',
+                                             str(self.target_size_ratio))
+        except CommandFailedError as e:
+            if e.exitstatus == 22: # nautilus couldn't specify --pg_num_min option
+                self.mon_manager.raw_cluster_cmd('osd', 'pool', 'create',
+                                                 self.metadata_pool_name,
+                                                 str(self.pg_num_min))
+
+                self.mon_manager.raw_cluster_cmd('osd', 'pool', 'create',
+                                                 data_pool_name, str(self.pg_num),
+                                                 str(self.pg_num_min))
+            else:
+                raise
 
         if self.metadata_overlay:
             self.mon_manager.raw_cluster_cmd('fs', 'new',
 
         if self.metadata_overlay:
             self.mon_manager.raw_cluster_cmd('fs', 'new',
@@ -666,11 +678,19 @@ class Filesystem(MDSCluster):
                 cmd = ['osd', 'erasure-code-profile', 'set', ec_data_pool_name]
                 cmd.extend(self.ec_profile)
                 self.mon_manager.raw_cluster_cmd(*cmd)
                 cmd = ['osd', 'erasure-code-profile', 'set', ec_data_pool_name]
                 cmd.extend(self.ec_profile)
                 self.mon_manager.raw_cluster_cmd(*cmd)
-                self.mon_manager.raw_cluster_cmd(
-                    'osd', 'pool', 'create', ec_data_pool_name,
-                    'erasure', ec_data_pool_name,
-                    '--pg_num_min', str(self.pg_num_min),
-                    '--target_size_ratio', str(self.target_size_ratio_ec))
+                try:
+                    self.mon_manager.raw_cluster_cmd(
+                        'osd', 'pool', 'create', ec_data_pool_name,
+                        'erasure', ec_data_pool_name,
+                        '--pg_num_min', str(self.pg_num_min),
+                        '--target_size_ratio', str(self.target_size_ratio_ec))
+                except CommandFailedError as e:
+                    if e.exitstatus == 22: # nautilus couldn't specify --pg_num_min option
+                        self.mon_manager.raw_cluster_cmd(
+                            'osd', 'pool', 'create', ec_data_pool_name,
+                            str(self.pg_num_min), 'erasure', ec_data_pool_name)
+                    else:
+                        raise
                 self.mon_manager.raw_cluster_cmd(
                     'osd', 'pool', 'set',
                     ec_data_pool_name, 'allow_ec_overwrites', 'true')
                 self.mon_manager.raw_cluster_cmd(
                     'osd', 'pool', 'set',
                     ec_data_pool_name, 'allow_ec_overwrites', 'true')
@@ -832,8 +852,15 @@ class Filesystem(MDSCluster):
 
     def add_data_pool(self, name, create=True):
         if create:
 
     def add_data_pool(self, name, create=True):
         if create:
-            self.mon_manager.raw_cluster_cmd('osd', 'pool', 'create', name,
-                                             '--pg_num_min', str(self.pg_num_min))
+            try:
+                self.mon_manager.raw_cluster_cmd('osd', 'pool', 'create', name,
+                                                 '--pg_num_min', str(self.pg_num_min))
+            except CommandFailedError as e:
+                if e.exitstatus == 22: # nautilus couldn't specify --pg_num_min option
+                  self.mon_manager.raw_cluster_cmd('osd', 'pool', 'create', name,
+                                                   str(self.pg_num_min))
+                else:
+                    raise
         self.mon_manager.raw_cluster_cmd('fs', 'add_data_pool', self.name, name)
         self.get_pool_names(refresh = True)
         for poolid, fs_name in self.data_pools.items():
         self.mon_manager.raw_cluster_cmd('fs', 'add_data_pool', self.name, name)
         self.get_pool_names(refresh = True)
         for poolid, fs_name in self.data_pools.items():
index 1102f887b5f0a6cd28ac2f20cc5ba6a22a0ae6d5..7d35ec0dfd53ec25c4301ec2ccb38043a2da7797 100644 (file)
@@ -317,3 +317,43 @@ class TestFragmentation(CephFSTestCase):
             lambda: _count_fragmented() > 0,
             timeout=30
         )
             lambda: _count_fragmented() > 0,
             timeout=30
         )
+
+    def test_dir_merge_with_snap_items(self):
+        """
+        That directory remain fragmented when snapshot items are taken into account.
+        """
+        split_size = 1000
+        merge_size = 100
+        self._configure(
+            mds_bal_split_size=split_size,
+            mds_bal_merge_size=merge_size,
+            mds_bal_split_bits=1
+        )
+
+        # split the dir
+        create_files = split_size + 50
+        self.mount_a.create_n_files("splitdir/file_", create_files)
+
+        self.wait_until_true(
+            lambda: self.get_splits() == 1,
+            timeout=30
+        )
+
+        frags = self.get_dir_ino("/splitdir")['dirfrags']
+        self.assertEqual(len(frags), 2)
+        self.assertEqual(frags[0]['dirfrag'], "0x10000000000.0*")
+        self.assertEqual(frags[1]['dirfrag'], "0x10000000000.1*")
+        self.assertEqual(
+            sum([len(f['dentries']) for f in frags]), create_files
+        )
+
+        self.assertEqual(self.get_merges(), 0)
+
+        self.mount_a.run_shell(["mkdir", "splitdir/.snap/snap_a"])
+        self.mount_a.run_shell(["mkdir", "splitdir/.snap/snap_b"])
+        self.mount_a.run_shell(["rm", "-f", run.Raw("splitdir/file*")])
+
+        time.sleep(30)
+
+        self.assertEqual(self.get_merges(), 0)
+        self.assertEqual(len(self.get_dir_ino("/splitdir")["dirfrags"]), 2)
index 962a3d036d1fce6658a9fc402a3290d97b2531e2..2b3a7d5f95c748360489da4b09d877a70cf57d64 100644 (file)
@@ -2,11 +2,7 @@ import json
 import logging
 import os
 from textwrap import dedent
 import logging
 import os
 from textwrap import dedent
-try:
-    from typing import Optional
-except:
-    # make it work for python2
-    pass
+from typing import Optional
 from teuthology.exceptions import CommandFailedError
 from tasks.cephfs.fuse_mount import FuseMount
 from tasks.cephfs.cephfs_test_case import CephFSTestCase
 from teuthology.exceptions import CommandFailedError
 from tasks.cephfs.fuse_mount import FuseMount
 from tasks.cephfs.cephfs_test_case import CephFSTestCase
@@ -22,7 +18,7 @@ class FullnessTestCase(CephFSTestCase):
     data_only = False
 
     # Subclasses define how many bytes should be written to achieve fullness
     data_only = False
 
     # Subclasses define how many bytes should be written to achieve fullness
-    pool_capacity = None  # type: Optional[int]
+    pool_capacity: Optional[int] = None
     fill_mb = None
 
     def is_full(self):
     fill_mb = None
 
     def is_full(self):
index 727b80c6a91bf63e2c6df8a3ad980175b71c0616..ad877f62280a7e3781fa91d366b5a31e9748789b 100644 (file)
@@ -31,23 +31,28 @@ class TestMDSMetrics(CephFSTestCase):
         if curr_max_mds > 1:
             self.fs.shrink(1)
 
         if curr_max_mds > 1:
             self.fs.shrink(1)
 
-    def verify_mds_metrics(self, active_mds_count=1, client_count=1, ranks=[]):
+    def verify_mds_metrics(self, active_mds_count=1, client_count=1, ranks=[], mul_fs=[]):
         def verify_metrics_cbk(metrics):
             mds_metrics = metrics['metrics']
             if not len(mds_metrics) == active_mds_count + 1: # n active mdss + delayed set
                 return False
             fs_status = self.fs.status()
         def verify_metrics_cbk(metrics):
             mds_metrics = metrics['metrics']
             if not len(mds_metrics) == active_mds_count + 1: # n active mdss + delayed set
                 return False
             fs_status = self.fs.status()
-            nonlocal ranks
+            nonlocal ranks, mul_fs
             if not ranks:
             if not ranks:
-                ranks = set([info['rank'] for info in fs_status.get_ranks(self.fs.id)])
+                if not mul_fs:
+                    mul_fs = [self.fs.id]
+                for filesystem in mul_fs:
+                    ranks = set([info['rank'] for info in fs_status.get_ranks(filesystem)])
             for rank in ranks:
                 r = mds_metrics.get("mds.{}".format(rank), None)
                 if not r or not len(mds_metrics['delayed_ranks']) == 0:
                     return False
             for rank in ranks:
                 r = mds_metrics.get("mds.{}".format(rank), None)
                 if not r or not len(mds_metrics['delayed_ranks']) == 0:
                     return False
-            global_metrics = metrics['global_metrics']
-            client_metadata = metrics['client_metadata']
-            if not len(global_metrics) >= client_count or not len(client_metadata) >= client_count:
-                return False
+            for item in mul_fs:
+                key = fs_status.get_fsmap(item)['mdsmap']['fs_name']
+                global_metrics = metrics['global_metrics'].get(key, {})
+                client_metadata = metrics['client_metadata'].get(key, {})
+                if not len(global_metrics) >= client_count or not len(client_metadata) >= client_count:
+                    return False
             return True
         return verify_metrics_cbk
 
             return True
         return verify_metrics_cbk
 
@@ -102,12 +107,12 @@ class TestMDSMetrics(CephFSTestCase):
 
     def _setup_fs(self, fs_name):
         fs_a = self.mds_cluster.newfs(name=fs_name)
 
     def _setup_fs(self, fs_name):
         fs_a = self.mds_cluster.newfs(name=fs_name)
-        
+
         self.mds_cluster.mds_restart()
 
         # Wait for filesystem to go healthy
         fs_a.wait_for_daemons()
         self.mds_cluster.mds_restart()
 
         # Wait for filesystem to go healthy
         fs_a.wait_for_daemons()
-        
+
         # Reconfigure client auth caps
         for mount in self.mounts:
             self.mds_cluster.mon_manager.raw_cluster_cmd_result(
         # Reconfigure client auth caps
         for mount in self.mounts:
             self.mds_cluster.mon_manager.raw_cluster_cmd_result(
@@ -292,14 +297,29 @@ class TestMDSMetrics(CephFSTestCase):
         log.debug("metrics={0}".format(metrics))
         self.assertTrue(valid)
 
         log.debug("metrics={0}".format(metrics))
         self.assertTrue(valid)
 
+        filtered_mds = 1
+        def verify_filtered_mds_rank_metrics(metrics):
+        # checks if the metrics has only client_metadata and
+        # global_metrics filtered using --mds_rank=1
+            global_metrics = metrics['global_metrics'].get(self.fs.name, {})
+            client_metadata = metrics['client_metadata'].get(self.fs.name, {})
+            mds_metrics = metrics['metrics']
+            if len(mds_metrics) != 2 or f"mds.{filtered_mds}" not in mds_metrics:
+                return False
+            if len(global_metrics) > TestMDSMetrics.CLIENTS_REQUIRED or\
+                    len(client_metadata) > TestMDSMetrics.CLIENTS_REQUIRED:
+                return False
+            if len(set(global_metrics) - set(mds_metrics[f"mds.{filtered_mds}"])) or\
+                    len(set(client_metadata) - set(mds_metrics[f"mds.{filtered_mds}"])):
+                return False
+            return True
         # initiate a new query with `--mds_rank` filter and validate if
         # we get metrics *only* from that mds.
         # initiate a new query with `--mds_rank` filter and validate if
         # we get metrics *only* from that mds.
-        filtered_mds = 1
-        valid, metrics = self._get_metrics(
-            self.verify_mds_metrics(client_count=TestMDSMetrics.CLIENTS_REQUIRED,
-                                    ranks=[filtered_mds]), 30, '--mds_rank={}'.format(filtered_mds))
-        log.debug("metrics={0}".format(metrics))
-        self.assertTrue(valid)
+        valid, metrics = self._get_metrics(verify_filtered_mds_rank_metrics, 30,
+                                           f'--mds_rank={filtered_mds}')
+        log.debug(f"metrics={metrics}")
+        self.assertTrue(valid, "Incorrect 'ceph fs perf stats' output"
+                        f" with filter '--mds_rank={filtered_mds}'")
 
     def test_query_client_filter(self):
         # validate
 
     def test_query_client_filter(self):
         # validate
@@ -326,7 +346,7 @@ class TestMDSMetrics(CephFSTestCase):
         log.debug("metrics={0}".format(metrics))
         self.assertTrue(valid)
 
         log.debug("metrics={0}".format(metrics))
         self.assertTrue(valid)
 
-        client_matadata = metrics['client_metadata']
+        client_matadata = metrics['client_metadata'][self.fs.name]
         # pick an random client
         client = random.choice(list(client_matadata.keys()))
         # get IP of client to use in filter
         # pick an random client
         client = random.choice(list(client_matadata.keys()))
         # get IP of client to use in filter
@@ -338,8 +358,8 @@ class TestMDSMetrics(CephFSTestCase):
         self.assertTrue(valid)
 
         # verify IP from output with filter IP
         self.assertTrue(valid)
 
         # verify IP from output with filter IP
-        for i in metrics['client_metadata']:
-            self.assertEqual(client_ip, metrics['client_metadata'][i]['IP'])
+        for i in metrics['client_metadata'][self.fs.name]:
+            self.assertEqual(client_ip, metrics['client_metadata'][self.fs.name][i]['IP'])
 
     def test_query_mds_and_client_filter(self):
         # validate
 
     def test_query_mds_and_client_filter(self):
         # validate
@@ -423,21 +443,20 @@ class TestMDSMetrics(CephFSTestCase):
         log.debug(f'metrics={metrics}')
         self.assertTrue(valid)
 
         log.debug(f'metrics={metrics}')
         self.assertTrue(valid)
 
-        #mount_a and mount_b are the clients mounted for TestMDSMetrics. So get their
-        #entries from the global_metrics.
+        # mount_a and mount_b are the clients mounted for TestMDSMetrics. So get their
+        # entries from the global_metrics.
         client_a_name = f'client.{self.mount_a.get_global_id()}'
         client_b_name = f'client.{self.mount_b.get_global_id()}'
 
         global_metrics = metrics['global_metrics']
         client_a_name = f'client.{self.mount_a.get_global_id()}'
         client_b_name = f'client.{self.mount_b.get_global_id()}'
 
         global_metrics = metrics['global_metrics']
-        client_a_metrics = global_metrics[client_a_name]
-        client_b_metrics = global_metrics[client_b_name]
+        client_a_metrics = global_metrics[self.fs.name][client_a_name]
+        client_b_metrics = global_metrics[self.fs.name][client_b_name]
 
 
-        #fail rank0 mds
+        # fail rank0 mds
         self.fs.rank_fail(rank=0)
 
         self.fs.rank_fail(rank=0)
 
-        # Wait for 10 seconds for the failover to complete and
-        # the mgr to get initial metrics from the new rank0 mds.
-        time.sleep(10)
+        # Wait for rank0 up:active state
+        self.fs.wait_for_state('up:active', rank=0, timeout=30)
 
         fscid = self.fs.id
 
 
         fscid = self.fs.id
 
@@ -457,15 +476,22 @@ class TestMDSMetrics(CephFSTestCase):
             log.debug(f'metrics={metrics_new}')
             self.assertTrue(valid)
 
             log.debug(f'metrics={metrics_new}')
             self.assertTrue(valid)
 
-            global_metrics = metrics_new['global_metrics']
-            client_a_metrics_new = global_metrics[client_a_name]
-            client_b_metrics_new = global_metrics[client_b_name]
+            client_metadata = metrics_new['client_metadata']
+            client_a_metadata = client_metadata.get(self.fs.name, {}).get(client_a_name, {})
+            client_b_metadata = client_metadata.get(self.fs.name, {}).get(client_b_name, {})
 
 
-            #the metrics should be different for the test to succeed.
-            self.assertNotEqual(client_a_metrics, client_a_metrics_new)
-            self.assertNotEqual(client_b_metrics, client_b_metrics_new)
+            global_metrics = metrics_new['global_metrics']
+            client_a_metrics_new = global_metrics.get(self.fs.name, {}).get(client_a_name, {})
+            client_b_metrics_new = global_metrics.get(self.fs.name, {}).get(client_b_name, {})
+
+            # the metrics should be different for the test to succeed.
+            self.assertTrue(client_a_metadata and client_b_metadata and
+                            client_a_metrics_new and client_b_metrics_new and
+                            (client_a_metrics_new != client_a_metrics) and
+                            (client_b_metrics_new != client_b_metrics),
+                            "Invalid 'ceph fs perf stats' metrics after rank0 mds failover")
         except MaxWhileTries:
         except MaxWhileTries:
-            raise RuntimeError("Failed to fetch `ceph fs perf stats` metrics")
+            raise RuntimeError("Failed to fetch 'ceph fs perf stats' metrics")
         finally:
             # cleanup test directories
             self._cleanup_test_dirs()
         finally:
             # cleanup test directories
             self._cleanup_test_dirs()
@@ -473,13 +499,13 @@ class TestMDSMetrics(CephFSTestCase):
     def test_client_metrics_and_metadata(self):
         self.mount_a.umount_wait()
         self.mount_b.umount_wait()
     def test_client_metrics_and_metadata(self):
         self.mount_a.umount_wait()
         self.mount_b.umount_wait()
+        self.fs.delete_all_filesystems()
 
         self.mds_cluster.mon_manager.raw_cluster_cmd("fs", "flag", "set",
 
         self.mds_cluster.mon_manager.raw_cluster_cmd("fs", "flag", "set",
-            "enable_multiple", "true",
-            "--yes-i-really-mean-it")
-            
-        #creating filesystem
-        fs_a = self._setup_fs(fs_name = "fs1")
+            "enable_multiple", "true", "--yes-i-really-mean-it")
+
+        # creating filesystem
+        fs_a = self._setup_fs(fs_name="fs1")
 
         # Mount a client on fs_a
         self.mount_a.mount_wait(cephfs_name=fs_a.name)
 
         # Mount a client on fs_a
         self.mount_a.mount_wait(cephfs_name=fs_a.name)
@@ -488,8 +514,8 @@ class TestMDSMetrics(CephFSTestCase):
         self.mount_a.path_to_ino("test.bin")
         self.mount_a.create_files()
 
         self.mount_a.path_to_ino("test.bin")
         self.mount_a.create_files()
 
-        #creating another filesystem
-        fs_b = self._setup_fs(fs_name = "fs2")
+        # creating another filesystem
+        fs_b = self._setup_fs(fs_name="fs2")
 
         # Mount a client on fs_b
         self.mount_b.mount_wait(cephfs_name=fs_b.name)
 
         # Mount a client on fs_b
         self.mount_b.mount_wait(cephfs_name=fs_b.name)
@@ -497,17 +523,121 @@ class TestMDSMetrics(CephFSTestCase):
         self.mount_b.path_to_ino("test.bin")
         self.mount_b.create_files()
 
         self.mount_b.path_to_ino("test.bin")
         self.mount_b.create_files()
 
+        fscid_list = [fs_a.id, fs_b.id]
+
         # validate
         valid, metrics = self._get_metrics(
         # validate
         valid, metrics = self._get_metrics(
-            self.verify_mds_metrics(client_count=TestMDSMetrics.CLIENTS_REQUIRED), 30)
+            self.verify_mds_metrics(client_count=1, mul_fs=fscid_list), 30)
+        log.debug(f"metrics={metrics}")
+        self.assertTrue(valid)
+
+        client_metadata_a = metrics['client_metadata']['fs1']
+        client_metadata_b = metrics['client_metadata']['fs2']
+
+        for i in client_metadata_a:
+            if not (client_metadata_a[i]['hostname']):
+                raise RuntimeError("hostname of fs1 not found!")
+            if not (client_metadata_a[i]['valid_metrics']):
+                raise RuntimeError("valid_metrics of fs1 not found!")
+
+        for i in client_metadata_b:
+            if not (client_metadata_b[i]['hostname']):
+                raise RuntimeError("hostname of fs2 not found!")
+            if not (client_metadata_b[i]['valid_metrics']):
+                raise RuntimeError("valid_metrics of fs2 not found!")
+
+    def test_non_existing_mds_rank(self):
+        def verify_filtered_metrics(metrics):
+        # checks if the metrics has non empty client_metadata and global_metrics
+            if metrics['client_metadata'].get(self.fs.name, {})\
+              or metrics['global_metrics'].get(self.fs.name, {}):
+                return True
+            return False
+
+        try:
+            # validate
+            filter_rank = random.randint(1, 10)
+            valid, metrics = self._get_metrics(verify_filtered_metrics, 30,
+                                               '--mds_rank={}'.format(filter_rank))
+            log.info(f'metrics={metrics}')
+            self.assertFalse(valid, "Fetched 'ceph fs perf stats' metrics using nonexistent MDS rank")
+        except MaxWhileTries:
+            # success
+            pass
+
+    def test_perf_stats_stale_metrics_with_multiple_filesystem(self):
+        self.mount_a.umount_wait()
+        self.mount_b.umount_wait()
+
+        self.mds_cluster.mon_manager.raw_cluster_cmd("fs", "flag", "set",
+                    "enable_multiple", "true", "--yes-i-really-mean-it")
+
+        # creating filesystem
+        fs_b = self._setup_fs(fs_name="fs2")
+
+        # Mount a client on fs_b
+        self.mount_b.mount_wait(cephfs_name=fs_b.name)
+        self.mount_b.write_n_mb("test.bin", 1)
+        self.mount_b.path_to_ino("test.bin")
+        self.mount_b.create_files()
+
+        # creating another filesystem
+        fs_a = self._setup_fs(fs_name="fs1")
+
+        # Mount a client on fs_a
+        self.mount_a.mount_wait(cephfs_name=fs_a.name)
+        self.mount_a.write_n_mb("pad.bin", 1)
+        self.mount_a.write_n_mb("test.bin", 2)
+        self.mount_a.path_to_ino("test.bin")
+        self.mount_a.create_files()
+
+        # validate
+        valid, metrics = self._get_metrics(
+            self.verify_mds_metrics(client_count=1, mul_fs=[fs_a.id, fs_b.id]), 30)
         log.debug(f"metrics={metrics}")
         self.assertTrue(valid)
         log.debug(f"metrics={metrics}")
         self.assertTrue(valid)
-        
-        client_metadata = metrics['client_metadata']
-
-        for i in client_metadata:
-            if not (client_metadata[i]['hostname']):
-                raise RuntimeError("hostname not found!")
-            if not (client_metadata[i]['valid_metrics']):
-                raise RuntimeError("valid_metrics not found!")
+
+        # get mounted client's entries from the global_metrics.
+        client_a_name = f'client.{self.mount_a.get_global_id()}'
+
+        global_metrics = metrics['global_metrics']
+        client_a_metrics = global_metrics.get("fs1", {}).get(client_a_name, {})
+
+        # fail active mds of fs_a
+        fs_a_mds = fs_a.get_active_names()[0]
+        self.mds_cluster.mds_fail(fs_a_mds)
+        fs_a.wait_for_state('up:active', rank=0, timeout=30)
+
+        # spread directory per rank
+        self._spread_directory_on_all_ranks(fs_a.id)
+
+        # spread some I/O
+        self._do_spread_io_all_clients(fs_a.id)
+
+        # wait a bit for mgr to get updated metrics
+        time.sleep(5)
+
+        # validate
+        try:
+            valid, metrics_new = self._get_metrics(
+                self.verify_mds_metrics(client_count=1, mul_fs=[fs_a.id, fs_b.id]), 30)
+            log.debug(f'metrics={metrics_new}')
+            self.assertTrue(valid)
+
+            client_metadata = metrics_new['client_metadata']
+            client_a_metadata = client_metadata.get("fs1", {}).get(client_a_name, {})
+
+            global_metrics = metrics_new['global_metrics']
+            client_a_metrics_new = global_metrics.get("fs1", {}).get(client_a_name, {})
+
+            # the metrics should be different for the test to succeed.
+            self.assertTrue(client_a_metadata and client_a_metrics_new
+                            and (client_a_metrics_new != client_a_metrics),
+                            "Invalid 'ceph fs perf stats' metrics after"
+                            f" rank0 mds of {fs_a.name} failover")
+        except MaxWhileTries:
+            raise RuntimeError("Failed to fetch `ceph fs perf stats` metrics")
+        finally:
+            # cleanup test directories
+            self._cleanup_test_dirs()
 
 
diff --git a/ceph/qa/tasks/cephfs/test_newops.py b/ceph/qa/tasks/cephfs/test_newops.py
new file mode 100644 (file)
index 0000000..4c34dab
--- /dev/null
@@ -0,0 +1,25 @@
+import logging
+from tasks.cephfs.cephfs_test_case import CephFSTestCase
+from tasks.cephfs.fuse_mount import FuseMount
+from tasks.cephfs.kernel_mount import KernelMount
+
+log = logging.getLogger(__name__)
+
+class TestNewOps(CephFSTestCase):
+    def test_newops_getvxattr(self):
+        """
+        For nautilus it will crash the MDSs when receive unknown OPs, as a workaround
+        the clients should avoid sending them to nautilus
+        """
+        if isinstance(self.mount_a, FuseMount):
+            log.info('client is fuse mounted')
+        elif isinstance(self.mount_a, KernelMount):
+            log.info('client is kernel mounted')
+            self.skipTest("Currently kclient hasn't fixed new ops issue yet.")
+
+        log.info("Test for new getvxattr op...")
+        self.mount_a.run_shell(["mkdir", "newop_getvxattr_dir"])
+
+        # to test whether will nautilus crash the MDSs
+        self.mount_a.getfattr("./newop_getvxattr_dir", "ceph.dir.pin.random")
+        log.info("Test for new getvxattr op succeeds")
index 1f439cd3183144206b47b07b1588365c023533e4..4d6bf9f1858a3391abdf0e0f7a347a1e42e38117 100644 (file)
@@ -730,3 +730,12 @@ class TestNFS(MgrTestCase):
         exec_cmd_invalid('export', 'info')
         exec_cmd_invalid('export', 'info', 'clusterid')
         exec_cmd_invalid('export', 'apply')
         exec_cmd_invalid('export', 'info')
         exec_cmd_invalid('export', 'info', 'clusterid')
         exec_cmd_invalid('export', 'apply')
+
+    def test_non_existent_cluster(self):
+        """
+        Test that cluster info doesn't throw junk data for non-existent cluster
+        """
+        cluseter_ls = self._nfs_cmd('cluster', 'ls')
+        self.assertNotIn('foo', cluseter_ls, 'cluster foo exists')
+        cluster_info = self._nfs_cmd('cluster', 'info', 'foo')
+        self.assertIn('cluster does not exist', cluster_info)
index dd7c11af50b39a6517b2267d1f5e88c4f99a8e6a..647860129d8d9aaa07cb53b516d95ecbf93d12c1 100644 (file)
@@ -176,3 +176,12 @@ class TestScrub(CephFSTestCase):
 
     def test_scrub_dup_inode(self):
         self._scrub(DupInodeWorkload(self, self.fs, self.mount_a))
 
     def test_scrub_dup_inode(self):
         self._scrub(DupInodeWorkload(self, self.fs, self.mount_a))
+
+    def test_mdsdir_scrub_backtrace(self):
+        damage_count = self._get_damage_count()
+        self.assertNotIn("MDS_DAMAGE", self.mds_cluster.mon_manager.get_mon_health()['checks'])
+
+        out_json = self.fs.run_scrub(["start", "~mdsdir", "recursive"])
+        self.assertEqual(self.fs.wait_until_scrub_complete(tag=out_json["scrub_tag"]), True)
+        self.assertEqual(self._get_damage_count(), damage_count)
+        self.assertNotIn("MDS_DAMAGE", self.mds_cluster.mon_manager.get_mon_health()['checks'])
index ac86b24f0a57f16ac26859408a072c5a8c7e5d1a..0e84f7ed2645cfdacc8b89f05359da68a1497595 100644 (file)
@@ -139,8 +139,7 @@ done
 
         # resume and verify
         self._resume_scrub(0)
 
         # resume and verify
         self._resume_scrub(0)
-        out_json = self.fs.get_scrub_status()
-        self.assertTrue("no active" in out_json['status'])
+        self.assertTrue(self.fs.wait_until_scrub_complete(sleep=5, timeout=30))
 
         checked = self._check_task_status_na()
         self.assertTrue(checked)
 
         checked = self._check_task_status_na()
         self.assertTrue(checked)
index 4a9ce838ef7fc22ff2551c78ad3271eb20dd85f2..dbd8007638290e84691451ce336d5170025efe5f 100644 (file)
@@ -363,7 +363,7 @@ class TestSnapSchedules(TestSnapSchedulesHelper):
         log.debug(f'snapshots: {snapshots}')
 
         result = self.fs_snap_schedule_cmd('status', path=dir_path,
         log.debug(f'snapshots: {snapshots}')
 
         result = self.fs_snap_schedule_cmd('status', path=dir_path,
-                                           snap_schedule='1M', format='json')
+                                           format='json')
         json_res = json.loads(result)[0]
         db_count = int(json_res['created_count'])
         log.debug(f'json_res: {json_res}')
         json_res = json.loads(result)[0]
         db_count = int(json_res['created_count'])
         log.debug(f'json_res: {json_res}')
index bc3e6a16c8a5a760d05e71f5262525fc59f4469c..51dcf80abd08b28c5c3bf86a5e5a4eb1905debd2 100644 (file)
@@ -534,3 +534,62 @@ class TestSnapshots(CephFSTestCase):
             # after reducing limit we expect the new snapshot creation to fail
             pass
         self.delete_dir_and_snaps("accounts", new_limit + 1)
             # after reducing limit we expect the new snapshot creation to fail
             pass
         self.delete_dir_and_snaps("accounts", new_limit + 1)
+
+
+class TestMonSnapsAndFsPools(CephFSTestCase):
+    MDSS_REQUIRED = 3
+
+    def test_disallow_monitor_managed_snaps_for_fs_pools(self):
+        """
+        Test that creation of monitor managed snaps fails for pools attached
+        to any file-system
+        """
+        with self.assertRaises(CommandFailedError):
+            self.fs.rados(["mksnap", "snap1"], pool=self.fs.get_data_pool_name())
+
+        with self.assertRaises(CommandFailedError):
+            self.fs.rados(["mksnap", "snap2"], pool=self.fs.get_metadata_pool_name())
+
+    def test_attaching_pools_with_snaps_to_fs_fails(self):
+        """
+        Test that attempt to attach pool with snapshots to an fs fails
+        """
+        test_pool_name = 'snap-test-pool'
+        base_cmd = f'osd pool create {test_pool_name}'
+        ret = self.run_cluster_cmd_result(base_cmd)
+        self.assertEqual(ret, 0)
+
+        self.fs.rados(["mksnap", "snap3"], pool=test_pool_name)
+
+        base_cmd = f'fs add_data_pool {self.fs.name} {test_pool_name}'
+        ret = self.run_cluster_cmd_result(base_cmd)
+        self.assertEqual(ret, errno.EOPNOTSUPP)
+
+        # cleanup
+        self.fs.rados(["rmsnap", "snap3"], pool=test_pool_name)
+        base_cmd = f'osd pool delete {test_pool_name}'
+        ret = self.run_cluster_cmd_result(base_cmd)
+
+    def test_using_pool_with_snap_fails_fs_creation(self):
+        """
+        Test that using a pool with snaps for fs creation fails
+        """
+        base_cmd = 'osd pool create test_data_pool'
+        ret = self.run_cluster_cmd_result(base_cmd)
+        self.assertEqual(ret, 0)
+        base_cmd = 'osd pool create test_metadata_pool'
+        ret = self.run_cluster_cmd_result(base_cmd)
+        self.assertEqual(ret, 0)
+
+        self.fs.rados(["mksnap", "snap4"], pool='test_data_pool')
+
+        base_cmd = 'fs new testfs test_metadata_pool test_data_pool'
+        ret = self.run_cluster_cmd_result(base_cmd)
+        self.assertEqual(ret, errno.EOPNOTSUPP)
+
+        # cleanup
+        self.fs.rados(["rmsnap", "snap4"], pool='test_data_pool')
+        base_cmd = 'osd pool delete test_data_pool'
+        ret = self.run_cluster_cmd_result(base_cmd)
+        base_cmd = 'osd pool delete test_metadata_pool'
+        ret = self.run_cluster_cmd_result(base_cmd)
index 330b6cb941fe3a59db763e8fb9cfefb826c8b1ab..c326a58667fed173301748067e8b2d11604f035c 100644 (file)
@@ -207,8 +207,11 @@ class TestVolumesHelper(CephFSTestCase):
         else:
             self.volname = result[0]['name']
 
         else:
             self.volname = result[0]['name']
 
-    def  _get_volume_info(self, vol_name):
-        args = ["volume", "info", vol_name]
+    def  _get_volume_info(self, vol_name, human_readable=False):
+        if human_readable:
+            args = ["volume", "info", vol_name, human_readable]
+        else:
+            args = ["volume", "info", vol_name]
         args = tuple(args)
         vol_md = self._fs_cmd(*args)
         return vol_md
         args = tuple(args)
         vol_md = self._fs_cmd(*args)
         return vol_md
@@ -662,6 +665,49 @@ class TestVolumes(TestVolumesHelper):
                          "'pending_subvolume_deletions' should not be present in absence"
                          " of subvolumegroup")
 
                          "'pending_subvolume_deletions' should not be present in absence"
                          " of subvolumegroup")
 
+    def test_volume_info_with_human_readable_flag(self):
+        """
+        Tests the 'fs volume info --human_readable' command
+        """
+        vol_fields = ["pools", "used_size", "pending_subvolume_deletions", "mon_addrs"]
+        group = self._generate_random_group_name()
+        # create subvolumegroup
+        self._fs_cmd("subvolumegroup", "create", self.volname, group)
+        # get volume metadata
+        vol_info = json.loads(self._get_volume_info(self.volname, "--human_readable"))
+        for md in vol_fields:
+            self.assertIn(md, vol_info,
+                          f"'{md}' key not present in metadata of volume")
+        units = [' ', 'k', 'M', 'G', 'T', 'P', 'E']
+        assert vol_info["used_size"][-1] in units, "unit suffix in used_size is absent"
+        assert vol_info["pools"]["data"][0]["avail"][-1] in units, "unit suffix in avail data is absent"
+        assert vol_info["pools"]["data"][0]["used"][-1] in units, "unit suffix in used data is absent"
+        assert vol_info["pools"]["metadata"][0]["avail"][-1] in units, "unit suffix in avail metadata is absent"
+        assert vol_info["pools"]["metadata"][0]["used"][-1] in units, "unit suffix in used metadata is absent"
+        self.assertEqual(int(vol_info["used_size"]), 0,
+                         "Size should be zero when volumes directory is empty")
+
+    def test_volume_info_with_human_readable_flag_without_subvolumegroup(self):
+        """
+        Tests the 'fs volume info --human_readable' command without subvolume group
+        """
+        vol_fields = ["pools", "mon_addrs"]
+        # get volume metadata
+        vol_info = json.loads(self._get_volume_info(self.volname, "--human_readable"))
+        for md in vol_fields:
+            self.assertIn(md, vol_info,
+                          f"'{md}' key not present in metadata of volume")
+        units = [' ', 'k', 'M', 'G', 'T', 'P', 'E']
+        assert vol_info["pools"]["data"][0]["avail"][-1] in units, "unit suffix in avail data is absent"
+        assert vol_info["pools"]["data"][0]["used"][-1] in units, "unit suffix in used data is absent"
+        assert vol_info["pools"]["metadata"][0]["avail"][-1] in units, "unit suffix in avail metadata is absent"
+        assert vol_info["pools"]["metadata"][0]["used"][-1] in units, "unit suffix in used metadata is absent"
+        self.assertNotIn("used_size", vol_info,
+                         "'used_size' should not be present in absence of subvolumegroup")
+        self.assertNotIn("pending_subvolume_deletions", vol_info,
+                         "'pending_subvolume_deletions' should not be present in absence"
+                         " of subvolumegroup")
+
 
 class TestSubvolumeGroups(TestVolumesHelper):
     """Tests for FS subvolume group operations."""
 
 class TestSubvolumeGroups(TestVolumesHelper):
     """Tests for FS subvolume group operations."""
@@ -1673,6 +1719,9 @@ class TestSubvolumeGroups(TestVolumesHelper):
         # clone snapshot which will create '_index' directory
         self._fs_cmd("subvolume", "snapshot", "clone", self.volname, subvolume, snapshot, clone)
 
         # clone snapshot which will create '_index' directory
         self._fs_cmd("subvolume", "snapshot", "clone", self.volname, subvolume, snapshot, clone)
 
+        # wait for clone to complete
+        self._wait_for_clone_to_complete(clone)
+
         # remove snapshot
         self._fs_cmd("subvolume", "snapshot", "rm", self.volname, subvolume, snapshot)
 
         # remove snapshot
         self._fs_cmd("subvolume", "snapshot", "rm", self.volname, subvolume, snapshot)
 
@@ -1688,6 +1737,11 @@ class TestSubvolumeGroups(TestVolumesHelper):
 
         self.assertEqual(all(elem in subvolumegroups for elem in ret_list), True)
 
 
         self.assertEqual(all(elem in subvolumegroups for elem in ret_list), True)
 
+        # cleanup
+        self._fs_cmd("subvolume", "rm", self.volname, clone)
+        for groupname in subvolumegroups:
+            self._fs_cmd("subvolumegroup", "rm", self.volname, groupname)
+
     def test_subvolume_group_ls_for_nonexistent_volume(self):
         # tests the 'fs subvolumegroup ls' command when /volume doesn't exist
         # prerequisite: we expect that the test volume is created and a subvolumegroup is NOT created
     def test_subvolume_group_ls_for_nonexistent_volume(self):
         # tests the 'fs subvolumegroup ls' command when /volume doesn't exist
         # prerequisite: we expect that the test volume is created and a subvolumegroup is NOT created
@@ -5771,7 +5825,7 @@ class TestSubvolumeSnapshotClones(TestVolumesHelper):
         self._fs_cmd("subvolume", "snapshot", "create", self.volname, subvolume, snapshot)
 
         # insert delay at the beginning of snapshot clone
         self._fs_cmd("subvolume", "snapshot", "create", self.volname, subvolume, snapshot)
 
         # insert delay at the beginning of snapshot clone
-        self.config_set('mgr', 'mgr/volumes/snapshot_clone_delay', 5)
+        self.config_set('mgr', 'mgr/volumes/snapshot_clone_delay', 15)
 
         # schedule a clones
         for clone in clone_list:
 
         # schedule a clones
         for clone in clone_list:
@@ -5779,7 +5833,7 @@ class TestSubvolumeSnapshotClones(TestVolumesHelper):
 
         # remove track file for third clone to make it orphan
         meta_path = os.path.join(".", "volumes", "_nogroup", subvolume, ".meta")
 
         # remove track file for third clone to make it orphan
         meta_path = os.path.join(".", "volumes", "_nogroup", subvolume, ".meta")
-        pending_clones_result = self.mount_a.run_shell(f"sudo grep \"clone snaps\" -A3 {meta_path}", omit_sudo=False, stdout=StringIO(), stderr=StringIO())
+        pending_clones_result = self.mount_a.run_shell(['sudo', 'grep', 'clone snaps', '-A3', meta_path], omit_sudo=False, stdout=StringIO(), stderr=StringIO())
         third_clone_track_id = pending_clones_result.stdout.getvalue().splitlines()[3].split(" = ")[0]
         third_clone_track_path = os.path.join(".", "volumes", "_index", "clone", third_clone_track_id)
         self.mount_a.run_shell(f"sudo rm -f {third_clone_track_path}", omit_sudo=False)
         third_clone_track_id = pending_clones_result.stdout.getvalue().splitlines()[3].split(" = ")[0]
         third_clone_track_path = os.path.join(".", "volumes", "_index", "clone", third_clone_track_id)
         self.mount_a.run_shell(f"sudo rm -f {third_clone_track_path}", omit_sudo=False)
@@ -6619,7 +6673,11 @@ class TestSubvolumeSnapshotClones(TestVolumesHelper):
         self._fs_cmd("subvolume", "create", self.volname, subvolume,"--mode=777", "--size", str(osize))
 
         # do IO, write 50 files of 1MB each to exceed quota. This mostly succeeds as quota enforcement takes time.
         self._fs_cmd("subvolume", "create", self.volname, subvolume,"--mode=777", "--size", str(osize))
 
         # do IO, write 50 files of 1MB each to exceed quota. This mostly succeeds as quota enforcement takes time.
-        self._do_subvolume_io(subvolume, number_of_files=50)
+        try:
+            self._do_subvolume_io(subvolume, number_of_files=50)
+        except CommandFailedError:
+            # ignore quota enforcement error.
+            pass
 
         # snapshot subvolume
         self._fs_cmd("subvolume", "snapshot", "create", self.volname, subvolume, snapshot)
 
         # snapshot subvolume
         self._fs_cmd("subvolume", "snapshot", "create", self.volname, subvolume, snapshot)
index fe957b0045e656137f1bfb8eb5b63d1c31e18fc4..d6c906533394a1293474ab55d8e35b44f39461c3 100644 (file)
@@ -37,16 +37,13 @@ class XFSTestsDev(CephFSTestCase):
         """
         Clone xfstests_dev repository. If already present, update it.
         """
         """
         Clone xfstests_dev repository. If already present, update it.
         """
-        from teuthology.orchestra import run
-
         # TODO: make sure that repo is not cloned for every test. it should
         # happen only once.
         # TODO: make sure that repo is not cloned for every test. it should
         # happen only once.
-        remoteurl = 'git://git.ceph.com/xfstests-dev.git'
+        remoteurl = 'https://git.ceph.com/xfstests-dev.git'
         self.repo_path = self.mount_a.client_remote.mkdtemp(suffix=
                                                             'xfstests-dev')
         self.repo_path = self.mount_a.client_remote.mkdtemp(suffix=
                                                             'xfstests-dev')
-        self.mount_a.run_shell(['git', 'archive', '--remote=' + remoteurl,
-                                'HEAD', run.Raw('|'),
-                                'tar', '-C', self.repo_path, '-x', '-f', '-'])
+        self.mount_a.run_shell(['git', 'clone', remoteurl, '--depth', '1',
+                                self.repo_path])
 
     def get_admin_key(self):
         import configparser
 
     def get_admin_key(self):
         import configparser
index dae9f6b2c95255112868a1fd41b30d4ad9a4a310..00417fc8622cb04a6fdc4c0aa8119f9dc1320c1c 100644 (file)
@@ -404,7 +404,7 @@ def pod_network(ctx, config):
 
     elif pnet == 'calico':
         _kubectl(ctx, config, [
 
     elif pnet == 'calico':
         _kubectl(ctx, config, [
-            'apply', '-f',
+            'create', '-f',
             'https://docs.projectcalico.org/manifests/tigera-operator.yaml'
         ])
         cr = {
             'https://docs.projectcalico.org/manifests/tigera-operator.yaml'
         ])
         cr = {
index 53577a87a9617d5b914acd4b47b25d90ee7b7542..16ad6324ed732d2fba418c0d104666d54e5818b6 100644 (file)
@@ -804,7 +804,7 @@ class RgwUserSubuserTest(RgwTestCase):
                 'access': 'readwrite',
                 'key_type': 'swift'
             })
                 'access': 'readwrite',
                 'key_type': 'swift'
             })
-        self.assertStatus(201)
+        self.assertStatus(200)
         data = self.jsonBody()
         subuser = self.find_object_in_list('id', 'teuth-test-user:tux', data)
         self.assertIsInstance(subuser, object)
         data = self.jsonBody()
         subuser = self.find_object_in_list('id', 'teuth-test-user:tux', data)
         self.assertIsInstance(subuser, object)
@@ -827,7 +827,7 @@ class RgwUserSubuserTest(RgwTestCase):
                 'access_key': 'yyy',
                 'secret_key': 'xxx'
             })
                 'access_key': 'yyy',
                 'secret_key': 'xxx'
             })
-        self.assertStatus(201)
+        self.assertStatus(200)
         data = self.jsonBody()
         subuser = self.find_object_in_list('id', 'teuth-test-user:hugo', data)
         self.assertIsInstance(subuser, object)
         data = self.jsonBody()
         subuser = self.find_object_in_list('id', 'teuth-test-user:hugo', data)
         self.assertIsInstance(subuser, object)
index 0f3dd18862eadafa789dedd698cc6236dd70b7bf..959d07d49ae0e8e06cf884c159b2ecb3245b96e6 100644 (file)
@@ -123,7 +123,7 @@ def run_fio(remote, config, rbd_test_dir):
 
     formats=[1,2]
     features=[['layering'],['striping'],['exclusive-lock','object-map']]
 
     formats=[1,2]
     features=[['layering'],['striping'],['exclusive-lock','object-map']]
-    fio_version='3.16'
+    fio_version='3.32'
     if config.get('formats'):
         formats=config['formats']
     if config.get('features'):
     if config.get('formats'):
         formats=config['formats']
     if config.get('features'):
index 716148a7566c1c3180ea30d2b312fff82c065959..4053bd2cb443359cf811913828d1393aa7e22736 100644 (file)
@@ -3,6 +3,7 @@ Daemon restart
 """
 import logging
 import pipes
 """
 import logging
 import pipes
+import os
 
 from teuthology import misc as teuthology
 from teuthology.orchestra import run as tor
 
 from teuthology import misc as teuthology
 from teuthology.orchestra import run as tor
@@ -48,17 +49,16 @@ def get_tests(ctx, config, role, remote, testdir):
             'mkdir', '--', srcdir,
             run.Raw('&&'),
             'git',
             'mkdir', '--', srcdir,
             run.Raw('&&'),
             'git',
-            'archive',
-            '--remote=git://git.ceph.com/ceph.git',
-            '%s:qa/workunits' % refspec,
-            run.Raw('|'),
-            'tar',
-            '-C', srcdir,
-            '-x',
-            '-f-',
+            'clone',
+            'https://git.ceph.com/ceph.git',
+            srcdir,
             run.Raw('&&'),
             'cd', '--', srcdir,
             run.Raw('&&'),
             run.Raw('&&'),
             'cd', '--', srcdir,
             run.Raw('&&'),
+            'git', 'checkout', '-b', 'restart_test', str(refspec),
+            run.Raw('&&'),
+            'cd', '--', 'qa/workunits',
+            run.Raw('&&'),
             'if', 'test', '-e', 'Makefile', run.Raw(';'), 'then', 'make', run.Raw(';'), 'fi',
             run.Raw('&&'),
             'find', '-executable', '-type', 'f', '-printf', r'%P\0',
             'if', 'test', '-e', 'Makefile', run.Raw(';'), 'then', 'make', run.Raw(';'), 'fi',
             run.Raw('&&'),
             'find', '-executable', '-type', 'f', '-printf', r'%P\0',
@@ -66,7 +66,7 @@ def get_tests(ctx, config, role, remote, testdir):
             ],
         )
     restarts = sorted(remote.read_file(f'{testdir}/restarts.list').decode().split('\0'))
             ],
         )
     restarts = sorted(remote.read_file(f'{testdir}/restarts.list').decode().split('\0'))
-    return (srcdir, restarts)
+    return (os.path.join(srcdir, 'qa/workunits'), restarts)
 
 def task(ctx, config):
     """
 
 def task(ctx, config):
     """
index bde82de41756c97691f5fdfae8dd3233c21fe302..a10266d050e28f8652397304f199a8b61ed75ac7 100644 (file)
@@ -407,6 +407,7 @@ def task(ctx, config):
     teuthology.deep_merge(config, overrides.get('rgw', {}))
 
     ctx.rgw = argparse.Namespace()
     teuthology.deep_merge(config, overrides.get('rgw', {}))
 
     ctx.rgw = argparse.Namespace()
+    ctx.rgw_cloudtier = None
 
     ctx.rgw.ec_data_pool = bool(config.pop('ec-data-pool', False))
     ctx.rgw.erasure_code_profile = config.pop('erasure_code_profile', {})
 
     ctx.rgw.ec_data_pool = bool(config.pop('ec-data-pool', False))
     ctx.rgw.erasure_code_profile = config.pop('erasure_code_profile', {})
diff --git a/ceph/qa/tasks/rgw_cloudtier.py b/ceph/qa/tasks/rgw_cloudtier.py
new file mode 100644 (file)
index 0000000..88f7d0d
--- /dev/null
@@ -0,0 +1,122 @@
+"""
+rgw_cloudtier configuration routines
+"""
+import argparse
+import logging
+
+from teuthology import misc as teuthology
+from teuthology.exceptions import ConfigError
+from tasks.util.rgw import rgwadmin, wait_for_radosgw
+from teuthology.task import Task
+
+log = logging.getLogger(__name__)
+
+class RGWCloudTier(Task):
+    """
+    Configure CloudTier storage class.
+
+    To configure cloudtiering on any client::
+
+        tasks:
+        - ceph:
+        - rgw:
+        - rgw-cloudtier:
+            client.0:
+              cloud_storage_class:
+              cloud_client:
+              cloud_regular_storage_class:
+              cloud_target_storage_class:
+              cloud_retain_head_object:
+              cloud_target_path:
+              cloudtier_user:
+                cloud_secret:
+                cloud_access_key:
+
+    """
+    def __init__(self, ctx, config):
+        super(RGWCloudTier, self).__init__(ctx, config)
+
+    def setup(self):
+        super(RGWCloudTier, self).setup()
+
+        overrides = self.ctx.config.get('overrides', {})
+        teuthology.deep_merge(self.config, overrides.get('rgw-cloudtier', {}))
+
+        if not self.ctx.rgw:
+            raise ConfigError('rgw-cloudtier must run after the rgw task')
+
+        self.ctx.rgw_cloudtier = argparse.Namespace()
+        self.ctx.rgw_cloudtier.config = self.config
+
+        log.info('Configuring rgw cloudtier ...')
+        clients = self.config.keys() # http://tracker.ceph.com/issues/20417
+        for client in clients:
+            client_config = self.config.get(client)
+            if client_config is None:
+                client_config = {}
+
+            if client_config is not None:
+                log.info('client %s - cloudtier config is -----------------%s ', client, client_config)
+                # configuring cloudtier
+
+                cloud_client = client_config.get('cloud_client')
+                cloud_storage_class = client_config.get('cloud_storage_class')
+                cloud_target_path = client_config.get('cloud_target_path')
+                cloud_target_storage_class = client_config.get('cloud_target_storage_class')
+                cloud_retain_head_object = client_config.get('cloud_retain_head_object')
+
+                cloudtier_user = client_config.get('cloudtier_user')
+                cloud_access_key = cloudtier_user.get('cloud_access_key')
+                cloud_secret = cloudtier_user.get('cloud_secret')
+
+                # XXX: the 'default' zone and zonegroup aren't created until we run RGWRados::init_complete().
+                # issue a 'radosgw-admin user list' command to trigger this
+                rgwadmin(self.ctx, client, cmd=['user', 'list'], check_status=True)
+
+                endpoint = self.ctx.rgw.role_endpoints[cloud_client]
+
+                # create cloudtier storage class
+                tier_config_params = "endpoint=" + endpoint.url() + \
+                           ",access_key=" + cloud_access_key + \
+                            ",secret=" + cloud_secret + \
+                            ",retain_head_object=" + cloud_retain_head_object
+
+                if (cloud_target_path != None):
+                    tier_config_params += ",target_path=" + cloud_target_path
+                if (cloud_target_storage_class != None):
+                    tier_config_params += ",target_storage_class=" + cloud_target_storage_class
+
+                log.info('Configuring cloud-s3 tier storage class type = %s', cloud_storage_class)
+
+                rgwadmin(self.ctx, client,
+                      cmd=['zonegroup', 'placement', 'add',
+                            '--rgw-zone', 'default',
+                            '--placement-id', 'default-placement',
+                            '--storage-class', cloud_storage_class,
+                            '--tier-type', 'cloud-s3',
+                            '--tier-config', tier_config_params],
+                      check_status=True)
+
+                ## create cloudtier user with the access keys given on the cloud client
+                cloud_tier_user_id = "cloud-tier-user-" + cloud_client
+                cloud_tier_user_name = "CLOUD TIER USER - " + cloud_client
+                rgwadmin(self.ctx, cloud_client,
+                     cmd=['user', 'create', '--uid', cloud_tier_user_id,
+                        '--display-name', cloud_tier_user_name,
+                        '--access-key', cloud_access_key,
+                        '--secret', cloud_secret,
+                        '--caps', 'user-policy=*'],
+                        check_status=True)
+
+                log.info('Finished Configuring rgw cloudtier ...')
+                
+                cluster_name, daemon_type, client_id = teuthology.split_role(client)
+                client_with_id = daemon_type + '.' + client_id
+                self.ctx.daemons.get_daemon('rgw', client_with_id, cluster_name).restart()
+                log.info('restarted rgw daemon ...')
+
+                (remote,) = self.ctx.cluster.only(client).remotes.keys()
+                wait_for_radosgw(endpoint.url(), remote)
+                
+
+task = RGWCloudTier
index 266d0fb694fd7b51ce6978fc06c452a1649073fc..f5a6f5a261519e184426d9fcb844a1bb9ae29371 100644 (file)
@@ -10,7 +10,6 @@ from tasks.util.rgw import rgwadmin, wait_for_radosgw
 from tasks.util.rados import create_ec_pool, create_replicated_pool
 from tasks.rgw_multi import multisite
 from tasks.rgw_multi.zone_rados import RadosZone as RadosZone
 from tasks.util.rados import create_ec_pool, create_replicated_pool
 from tasks.rgw_multi import multisite
 from tasks.rgw_multi.zone_rados import RadosZone as RadosZone
-from tasks.rgw_multi.zone_ps import PSZone as PSZone
 
 from teuthology.orchestra import run
 from teuthology import misc
 
 from teuthology.orchestra import run
 from teuthology import misc
@@ -33,7 +32,6 @@ class RGWMultisite(Task):
 
     * 'is_master' is passed on the command line as --master
     * 'is_default' is passed on the command line as --default
 
     * 'is_master' is passed on the command line as --master
     * 'is_default' is passed on the command line as --default
-    * 'is_pubsub' is used to create a zone with tier-type=pubsub
     * 'endpoints' given as client names are replaced with actual endpoints
 
             zonegroups:
     * 'endpoints' given as client names are replaced with actual endpoints
 
             zonegroups:
@@ -79,9 +77,6 @@ class RGWMultisite(Task):
                   - name: test-zone2
                     is_default: true
                     endpoints: [c2.client.0]
                   - name: test-zone2
                     is_default: true
                     endpoints: [c2.client.0]
-                  - name: test-zone3
-                    is_pubsub: true
-                    endpoints: [c1.client.1]
 
     """
     def __init__(self, ctx, config):
 
     """
     def __init__(self, ctx, config):
@@ -373,10 +368,7 @@ def create_zonegroup(cluster, gateways, period, config):
 def create_zone(ctx, cluster, gateways, creds, zonegroup, config):
     """ create a zone with the given configuration """
     zone = multisite.Zone(config['name'], zonegroup, cluster)
 def create_zone(ctx, cluster, gateways, creds, zonegroup, config):
     """ create a zone with the given configuration """
     zone = multisite.Zone(config['name'], zonegroup, cluster)
-    if config.pop('is_pubsub', False):
-        zone = PSZone(config['name'], zonegroup, cluster)
-    else:
-        zone = RadosZone(config['name'], zonegroup, cluster)
+    zone = RadosZone(config['name'], zonegroup, cluster)
 
     # collect Gateways for the zone's endpoints
     endpoints = config.get('endpoints')
 
     # collect Gateways for the zone's endpoints
     endpoints = config.get('endpoints')
index 5354e756fd737715bb4da5bf9f43f0f25989d7a2..623309c06157a4629716685b8c726fc80e852ee8 100644 (file)
@@ -72,7 +72,7 @@ class RGWMultisiteTests(Task):
         log.info('creating test user..')
         user = multisite.User('rgw-multisite-test-user')
         user.create(master_zone, ['--display-name', 'Multisite Test User',
         log.info('creating test user..')
         user = multisite.User('rgw-multisite-test-user')
         user.create(master_zone, ['--display-name', 'Multisite Test User',
-                                  '--gen-access-key', '--gen-secret'])
+                                  '--gen-access-key', '--gen-secret', '--caps', 'roles=*'])
 
         config = self.config.get('config', {})
         tests.init_multi(realm, user, tests.Config(**config))
 
         config = self.config.get('config', {})
         tests.init_multi(realm, user, tests.Config(**config))
index 4ee388f5db2e600d3612fffca2f82fea23df08ce..8a30b2f2944ec62d99ece2ba71d23b751971ea76 100644 (file)
@@ -44,13 +44,13 @@ def download(ctx, config):
                 'git', 'clone',
                 '-b', s3tests_branch,
                 git_remote + 's3-tests.git',
                 'git', 'clone',
                 '-b', s3tests_branch,
                 git_remote + 's3-tests.git',
-                '{tdir}/s3-tests'.format(tdir=testdir),
+                '{tdir}/s3-tests-{client}'.format(tdir=testdir, client=client),
                 ],
             )
         if sha1 is not None:
             ctx.cluster.only(client).run(
                 args=[
                 ],
             )
         if sha1 is not None:
             ctx.cluster.only(client).run(
                 args=[
-                    'cd', '{tdir}/s3-tests'.format(tdir=testdir),
+                    'cd', '{tdir}/s3-tests-{client}'.format(tdir=testdir, client=client),
                     run.Raw('&&'),
                     'git', 'reset', '--hard', sha1,
                     ],
                     run.Raw('&&'),
                     'git', 'reset', '--hard', sha1,
                     ],
@@ -65,7 +65,7 @@ def download(ctx, config):
                 args=[
                     'rm',
                     '-rf',
                 args=[
                     'rm',
                     '-rf',
-                    '{tdir}/s3-tests'.format(tdir=testdir),
+                    '{tdir}/s3-tests-{client}'.format(tdir=testdir, client=client),
                     ],
                 )
 
                     ],
                 )
 
@@ -364,11 +364,33 @@ def configure(ctx, config):
         if lc_debug_interval:
             s3tests_conf['s3 main']['lc_debug_interval'] = lc_debug_interval
 
         if lc_debug_interval:
             s3tests_conf['s3 main']['lc_debug_interval'] = lc_debug_interval
 
+        if ctx.rgw_cloudtier is not None:
+            log.info(' ctx.rgw_cloudtier config  is %s ...', ctx.rgw_cloudtier.config)
+            client_rgw_config = ctx.rgw_cloudtier.config.get(client)
+            if client_rgw_config:
+                log.info(' ctx.rgw_cloudtier config  is %s ...', client_rgw_config)
+                cloudtier_user = client_rgw_config.get('cloudtier_user')
+                cloud_client = client_rgw_config.get('cloud_client')
+                endpoint = ctx.rgw.role_endpoints.get(cloud_client)
+                s3tests_conf['s3 cloud']['host'] = endpoint.dns_name
+                s3tests_conf['s3 cloud']['port'] = endpoint.port
+                s3tests_conf['s3 cloud']['access_key'] = cloudtier_user.get('cloud_access_key')
+                s3tests_conf['s3 cloud']['secret_key'] = cloudtier_user.get('cloud_secret')
+                s3tests_conf['s3 cloud']['cloud_storage_class'] = client_rgw_config.get('cloud_storage_class')
+                s3tests_conf['s3 cloud']['storage_class'] = client_rgw_config.get('cloud_regular_storage_class')
+                s3tests_conf['s3 cloud']['retain_head_object'] = client_rgw_config.get('cloud_retain_head_object')
+                cloud_target_path = client_rgw_config.get('cloud_target_path')
+                cloud_target_storage_class = client_rgw_config.get('cloud_target_storage_class')
+                if (cloud_target_path != None):
+                    s3tests_conf['s3 cloud']['target_path'] = cloud_target_path
+                if (cloud_target_storage_class != None):
+                    s3tests_conf['s3 cloud']['target_storage_class'] = cloud_target_storage_class
+
         (remote,) = ctx.cluster.only(client).remotes.keys()
         remote.run(
             args=[
                 'cd',
         (remote,) = ctx.cluster.only(client).remotes.keys()
         remote.run(
             args=[
                 'cd',
-                '{tdir}/s3-tests'.format(tdir=testdir),
+                '{tdir}/s3-tests-{client}'.format(tdir=testdir, client=client),
                 run.Raw('&&'),
                 './bootstrap',
                 ],
                 run.Raw('&&'),
                 './bootstrap',
                 ],
@@ -388,7 +410,7 @@ def configure(ctx, config):
             conf = f.read().format(
                 idle_timeout=config.get('idle_timeout', 30)
                 )
             conf = f.read().format(
                 idle_timeout=config.get('idle_timeout', 30)
                 )
-            remote.write_file('{tdir}/boto.cfg'.format(tdir=testdir), conf)
+            remote.write_file('{tdir}/boto-{client}.cfg'.format(tdir=testdir, client=client), conf)
 
     try:
         yield
 
     try:
         yield
@@ -400,7 +422,7 @@ def configure(ctx, config):
             remote.run(
                 args=[
                     'rm',
             remote.run(
                 args=[
                     'rm',
-                    '{tdir}/boto.cfg'.format(tdir=testdir),
+                    '{tdir}/boto-{client}.cfg'.format(tdir=testdir, client=client),
                     ],
                 )
 
                     ],
                 )
 
@@ -420,7 +442,7 @@ def run_tests(ctx, config):
         (remote,) = ctx.cluster.only(client).remotes.keys()
         args = [
             'S3TEST_CONF={tdir}/archive/s3-tests.{client}.conf'.format(tdir=testdir, client=client),
         (remote,) = ctx.cluster.only(client).remotes.keys()
         args = [
             'S3TEST_CONF={tdir}/archive/s3-tests.{client}.conf'.format(tdir=testdir, client=client),
-            'BOTO_CONFIG={tdir}/boto.cfg'.format(tdir=testdir)
+            'BOTO_CONFIG={tdir}/boto-{client}.cfg'.format(tdir=testdir, client=client)
             ]
         # the 'requests' library comes with its own ca bundle to verify ssl
         # certificates - override that to use the system's ca bundle, which
             ]
         # the 'requests' library comes with its own ca bundle to verify ssl
         # certificates - override that to use the system's ca bundle, which
@@ -443,10 +465,10 @@ def run_tests(ctx, config):
         if 'extra_attrs' in client_config:
             attrs = client_config.get('extra_attrs') 
         args += [
         if 'extra_attrs' in client_config:
             attrs = client_config.get('extra_attrs') 
         args += [
-            '{tdir}/s3-tests/virtualenv/bin/python'.format(tdir=testdir),
+            '{tdir}/s3-tests-{client}/virtualenv/bin/python'.format(tdir=testdir, client=client),
             '-m', 'nose',
             '-w',
             '-m', 'nose',
             '-w',
-            '{tdir}/s3-tests'.format(tdir=testdir),
+            '{tdir}/s3-tests-{client}'.format(tdir=testdir, client=client),
             '-v',
             '-a', ','.join(attrs),
             ]
             '-v',
             '-a', ','.join(attrs),
             ]
@@ -553,6 +575,16 @@ def task(ctx, config):
               sts_tests: True
               rgw_server: client.0
 
               sts_tests: True
               rgw_server: client.0
 
+    To run any cloud-transition tests don't forget to set a config variable named 'cloudtier_tests' to 'True' as follows::
+
+        tasks:
+        - ceph:
+        - rgw: [client.0 client.1]
+        - s3tests:
+            client.0:
+              cloudtier_tests: True
+              rgw_server: client.0
+
     """
     assert hasattr(ctx, 'rgw'), 's3tests must run after the rgw task'
     assert config is None or isinstance(config, list) \
     """
     assert hasattr(ctx, 'rgw'), 's3tests must run after the rgw task'
     assert config is None or isinstance(config, list) \
@@ -582,6 +614,10 @@ def task(ctx, config):
             ctx.sts_variable = True
         else:
             ctx.sts_variable = False
             ctx.sts_variable = True
         else:
             ctx.sts_variable = False
+        if 'cloudtier_tests' in client_config:
+            ctx.cloudtier_variable = True
+        else:
+            ctx.cloudtier_variable = False
         #This will be the structure of config file when you want to run webidentity_test (sts-test)
         if ctx.sts_variable and "TOKEN" in os.environ:
             for client in clients:
         #This will be the structure of config file when you want to run webidentity_test (sts-test)
         if ctx.sts_variable and "TOKEN" in os.environ:
             for client in clients:
@@ -629,6 +665,28 @@ def task(ctx, config):
                         }
                     ) 
 
                         }
                     ) 
 
+        elif ctx.cloudtier_variable:
+            #This will be the structure of config file when you want to run normal s3-tests
+            for client in clients:
+                endpoint = ctx.rgw.role_endpoints.get(client)
+                assert endpoint, 's3tests: no rgw endpoint for {}'.format(client)
+
+                s3tests_conf[client] = ConfigObj(
+                    indent_type='',
+                    infile={
+                        'DEFAULT':
+                            {
+                            'port'      : endpoint.port,
+                            'is_secure' : endpoint.cert is not None,
+                            'api_name'  : 'default',
+                            },
+                        'fixtures'   : {},
+                        's3 main'    : {},
+                        's3 alt'     : {},
+                        's3 tenant'  : {},
+                        's3 cloud'   : {},
+                        }
+                    ) 
         else:
             #This will be the structure of config file when you want to run normal s3-tests
             for client in clients:
         else:
             #This will be the structure of config file when you want to run normal s3-tests
             for client in clients:
index 82c1d704c0349fbdd69fd2e7a728799dddff30ed..5b2149c4989bf89cc68e9fa8b1116ce9b088cf01 100644 (file)
@@ -2,6 +2,11 @@
 envlist = flake8, mypy, pytest, deadsymlinks
 skipsdist = True
 
 envlist = flake8, mypy, pytest, deadsymlinks
 skipsdist = True
 
+[testenv]
+setenv =
+  LC_ALL = C.UTF-8
+  LANG = C
+
 [testenv:flake8]
 basepython = python3
 deps=
 [testenv:flake8]
 basepython = python3
 deps=
@@ -27,6 +32,7 @@ basepython = python3
 deps =
   {env:TEUTHOLOGY_GIT:git+https://github.com/ceph/teuthology.git@main}#egg=teuthology[coverage,orchestra,test]
   httplib2
 deps =
   {env:TEUTHOLOGY_GIT:git+https://github.com/ceph/teuthology.git@main}#egg=teuthology[coverage,orchestra,test]
   httplib2
+  pytest
 commands =
   pytest --assert=plain test_import.py
   pytest tasks/tests --suite-dir {toxinidir}/suites {posargs}
 commands =
   pytest --assert=plain test_import.py
   pytest tasks/tests --suite-dir {toxinidir}/suites {posargs}
index fa3375b0fa2d88efeb5de19c6b65d36286174e2a..ab33ab54245c53b5828e664f1005baa6df56c9f8 100644 (file)
        fun:_dl_lookup_symbol_x
        ...
 }
        fun:_dl_lookup_symbol_x
        ...
 }
+{
+       dl-init.c possible lost init
+       Memcheck:Leak
+       ...
+       fun:__trans_list_add
+       fun:call_init.part.0
+       fun:call_init
+       ...
+}
 {
        weird thing from libc
        Memcheck:Leak
 {
        weird thing from libc
        Memcheck:Leak
        fun:*BGThreadWrapper*
        ...
 }
        fun:*BGThreadWrapper*
        ...
 }
+{
+       rocksdb VersionStorageInfo
+       Memcheck:Leak
+       ...
+       fun:*VersionStorageInfo
+       ...
+}
 {
        libstdc++ leak on xenial
        Memcheck:Leak
 {
        libstdc++ leak on xenial
        Memcheck:Leak
index 31ebf0a5dd98d1791b8c3fb56d86bacf9c41f7a2..026b00841920b31d85b55110729478bd83110ab0 100755 (executable)
@@ -9,10 +9,11 @@ SCRIPT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
 FSID='00000000-0000-0000-0000-0000deadbeef'
 
 # images that are used
 FSID='00000000-0000-0000-0000-0000deadbeef'
 
 # images that are used
-IMAGE_MASTER=${IMAGE_MASTER:-'quay.ceph.io/ceph-ci/ceph:master'}
+IMAGE_MAIN=${IMAGE_MAIN:-'quay.ceph.io/ceph-ci/ceph:main'}
+IMAGE_QUINCY=${IMAGE_QUINCY:-'quay.ceph.io/ceph-ci/ceph:quincy'}
 IMAGE_PACIFIC=${IMAGE_PACIFIC:-'quay.ceph.io/ceph-ci/ceph:pacific'}
 #IMAGE_OCTOPUS=${IMAGE_OCTOPUS:-'quay.ceph.io/ceph-ci/ceph:octopus'}
 IMAGE_PACIFIC=${IMAGE_PACIFIC:-'quay.ceph.io/ceph-ci/ceph:pacific'}
 #IMAGE_OCTOPUS=${IMAGE_OCTOPUS:-'quay.ceph.io/ceph-ci/ceph:octopus'}
-IMAGE_DEFAULT=${IMAGE_MASTER}
+IMAGE_DEFAULT=${IMAGE_QUINCY}
 
 OSD_IMAGE_NAME="${SCRIPT_NAME%.*}_osd.img"
 OSD_IMAGE_SIZE='6G'
 
 OSD_IMAGE_NAME="${SCRIPT_NAME%.*}_osd.img"
 OSD_IMAGE_SIZE='6G'
@@ -168,7 +169,7 @@ $SUDO CEPHADM_IMAGE=$IMAGE_PACIFIC $CEPHADM_BIN version \
 #$SUDO CEPHADM_IMAGE=$IMAGE_OCTOPUS $CEPHADM_BIN version
 #$SUDO CEPHADM_IMAGE=$IMAGE_OCTOPUS $CEPHADM_BIN version \
 #    | grep 'ceph version 15'
 #$SUDO CEPHADM_IMAGE=$IMAGE_OCTOPUS $CEPHADM_BIN version
 #$SUDO CEPHADM_IMAGE=$IMAGE_OCTOPUS $CEPHADM_BIN version \
 #    | grep 'ceph version 15'
-$SUDO $CEPHADM_BIN --image $IMAGE_MASTER version | grep 'ceph version'
+$SUDO $CEPHADM_BIN --image $IMAGE_MAIN version | grep 'ceph version'
 
 # try force docker; this won't work if docker isn't installed
 systemctl status docker > /dev/null && ( $CEPHADM --docker version | grep 'ceph version' ) || echo "docker not installed"
 
 # try force docker; this won't work if docker isn't installed
 systemctl status docker > /dev/null && ( $CEPHADM --docker version | grep 'ceph version' ) || echo "docker not installed"
@@ -180,6 +181,14 @@ $CEPHADM shell --fsid $FSID -e FOO=BAR -- printenv | grep FOO=BAR
 # test stdin
 echo foo | $CEPHADM shell -- cat | grep -q foo
 
 # test stdin
 echo foo | $CEPHADM shell -- cat | grep -q foo
 
+# the shell commands a bit above this seems to cause the
+# /var/lib/ceph/<fsid> directory to be made. Since we now
+# check in bootstrap that there are no clusters with the same
+# fsid based on the directory existing, we need to make sure
+# this directory is gone before bootstrapping. We can
+# accomplish this with another rm-cluster
+$CEPHADM rm-cluster --fsid $FSID --force
+
 ## bootstrap
 ORIG_CONFIG=`mktemp -p $TMPDIR`
 CONFIG=`mktemp -p $TMPDIR`
 ## bootstrap
 ORIG_CONFIG=`mktemp -p $TMPDIR`
 CONFIG=`mktemp -p $TMPDIR`
diff --git a/ceph/qa/workunits/cephadm/test_iscsi_pids_limit.sh b/ceph/qa/workunits/cephadm/test_iscsi_pids_limit.sh
new file mode 100755 (executable)
index 0000000..32326f1
--- /dev/null
@@ -0,0 +1,24 @@
+#!/bin/bash
+
+# checks if the containers default pids-limit (4096) is removed and Iscsi
+# containers continue to run
+# exits 1 if fails
+
+set -ex
+
+ISCSI_CONT_IDS=$(sudo podman ps -qa --filter='name=iscsi')
+CONT_COUNT=$(echo ${ISCSI_CONT_IDS} | wc -w)
+test ${CONT_COUNT} -eq 2
+
+for i in ${ISCSI_CONT_IDS}
+do
+  sudo podman exec ${i} /bin/sh -c 'for j in {0..20000}; do sleep 30 & done'
+done
+
+for i in ${ISCSI_CONT_IDS}
+do
+  SLEEP_COUNT=$(sudo podman exec ${i} /bin/sh -c 'ps -ef | grep -c sleep')
+  test ${SLEEP_COUNT} -gt 20000
+done
+
+echo OK
index bac102c089307b097fa16a6f92207fa65ed549cc..9ab05c187accebd9440abf0050721c82934167de 100755 (executable)
@@ -600,8 +600,7 @@ function test_auth()
   ceph auth caps client.xx mon 'allow command "osd tree"'
   ceph auth export | grep client.xx
   ceph auth export -o authfile
   ceph auth caps client.xx mon 'allow command "osd tree"'
   ceph auth export | grep client.xx
   ceph auth export -o authfile
-  ceph auth import -i authfile 2>$TMPFILE
-  check_response "imported keyring"
+  ceph auth import -i authfile
 
   ceph auth export -o authfile2
   diff authfile authfile2
 
   ceph auth export -o authfile2
   diff authfile authfile2
index e203fd8823fe2b43ea205a59712cdea853b3d37a..33ba738cbad2d4fc3a60a08221086e092a7de25c 100755 (executable)
@@ -8,10 +8,10 @@ trap -- 'retry' EXIT
 retry() {
     rm -rf ceph
     # double the timeout value
 retry() {
     rm -rf ceph
     # double the timeout value
-    timeout 3600 git clone git://git.ceph.com/ceph.git
+    timeout 3600 git clone https://git.ceph.com/ceph.git
 }
 rm -rf ceph
 }
 rm -rf ceph
-timeout 1800 git clone git://git.ceph.com/ceph.git
+timeout 1800 git clone https://git.ceph.com/ceph.git
 trap - EXIT
 cd ceph
 
 trap - EXIT
 cd ceph
 
index 9d3656be735c2fb2890448897694601668e5d0fd..23fccfc4eb941d96c11abee1e4b192db2777ac42 100755 (executable)
@@ -4,5 +4,6 @@ ceph_test_libcephfs
 ceph_test_libcephfs_access
 ceph_test_libcephfs_reclaim
 ceph_test_libcephfs_lazyio
 ceph_test_libcephfs_access
 ceph_test_libcephfs_reclaim
 ceph_test_libcephfs_lazyio
+ceph_test_libcephfs_newops
 
 exit 0
 
 exit 0
diff --git a/ceph/qa/workunits/mon/auth_key_rotation.sh b/ceph/qa/workunits/mon/auth_key_rotation.sh
new file mode 100755 (executable)
index 0000000..1a53bab
--- /dev/null
@@ -0,0 +1,58 @@
+#!/usr/bin/bash -ex
+
+function expect_false()
+{
+       set -x
+       if "$@"; then return 1; else return 0; fi
+}
+
+
+ceph auth export
+ceph auth rm client.rot
+
+ceph auth get-or-create client.rot mon 'allow rwx'
+ceph auth export client.rot | grep key
+ceph auth export client.rot | expect_false grep pending.key
+
+ceph auth get-or-create-pending client.rot
+ceph auth export client.rot | grep key
+ceph auth export client.rot | grep pending.key
+
+ceph auth clear-pending client.rot
+ceph auth export client.rot | expect_false grep pending.key
+
+ceph auth get-or-create-pending client.rot
+ceph auth export client.rot | grep key
+ceph auth export client.rot | grep pending.key
+K=$(ceph auth export client.rot | grep 'key = ' | head -n 1 | awk '{print $3}')
+PK=$(ceph auth export client.rot | grep pending.key | awk '{print $4}')
+echo "K is $K"
+echo "PK is $PK"
+ceph -n client.rot --key $K -s
+
+ceph auth commit-pending client.rot
+ceph auth export client.rot | expect_false grep pending.key
+ceph auth export client.rot | grep key | grep $PK
+
+ceph auth get-or-create-pending client.rot
+ceph auth export client.rot | grep key
+ceph auth export client.rot | grep pending.key
+K=$(ceph auth export client.rot | grep 'key = ' | head -n 1 | awk '{print $3}')
+PK=$(ceph auth export client.rot | grep pending.key | awk '{print $4}')
+echo "2, K is $K"
+echo "2, PK is $PK"
+
+ceph auth export client.rot
+
+while ceph -n client.rot --key $K -s ; do
+    ceph auth export client.rot
+    ceph -n client.rot --key $PK -s
+    sleep 1
+done
+
+ceph auth export client.rot | expect_false grep pending.key
+ceph auth export client.rot | grep key | grep $PK
+
+ceph -n client.rot --key $PK -s
+
+echo ok
index 6608d7872e232b12ac5b9586ca84e63d37d4bc2b..26a4c9bdc151f71fcd085b8f5938f0cb0ed3945f 100755 (executable)
@@ -24,6 +24,11 @@ for f in $(find $TESTDIR/archive/coredump -type f); do
        fi
 done
 
        fi
 done
 
+# ceph-crash runs as the unprivileged "ceph" user, but when under test
+# the ceph osd daemons are running as root, so their crash files aren't
+# readable.  let's chown them so they behave as they would in real life.
+sudo chown -R ceph:ceph /var/lib/ceph/crash
+
 # let daemon find crashdumps on startup
 sudo systemctl restart ceph-crash
 sleep 30
 # let daemon find crashdumps on startup
 sudo systemctl restart ceph-crash
 sleep 30
index 2fec7c80d6691bc8c10ff8457d252413af8125fa..207dcb01b7ff922e454981ed9f2c10f264cefe0d 100755 (executable)
@@ -44,7 +44,7 @@ function cleanup () {
 
 function get_sources () {
     for s in $SOURCES ; do
 
 function get_sources () {
     for s in $SOURCES ; do
-        curl --progress-bar --output $s ${DL_PREFIX}$s
+        curl --progress-bar --output $s -L ${DL_PREFIX}$s
     done
 }
 
     done
 }
 
index 042d67faddaf7c2da71e4f1d46fb5d1f404227d1..94d55d930270673b87172f78b4ee13dbed94fa52 100755 (executable)
@@ -1459,6 +1459,55 @@ test_mirror_pool_peer_bootstrap_create() {
     ceph osd pool rm rbd1 rbd1 --yes-i-really-really-mean-it
 }
 
     ceph osd pool rm rbd1 rbd1 --yes-i-really-really-mean-it
 }
 
+test_tasks_removed_pool() {
+    echo "testing removing pool under running tasks..."
+    remove_images
+
+    ceph osd pool create rbd2 8
+    rbd pool init rbd2
+
+    rbd create $RBD_CREATE_ARGS --size 1G foo
+    rbd snap create foo@snap
+    rbd snap protect foo@snap
+    rbd clone foo@snap bar
+
+    rbd create $RBD_CREATE_ARGS --size 1G rbd2/dummy
+    rbd bench --io-type write --io-pattern seq --io-size 1M --io-total 1G rbd2/dummy
+    rbd snap create rbd2/dummy@snap
+    rbd snap protect rbd2/dummy@snap
+    for i in {1..5}; do
+        rbd clone rbd2/dummy@snap rbd2/dummy$i
+    done
+
+    # queue flattens on a few dummy images and remove that pool
+    test "$(ceph rbd task list)" = "[]"
+    for i in {1..5}; do
+        ceph rbd task add flatten rbd2/dummy$i
+    done
+    ceph osd pool delete rbd2 rbd2 --yes-i-really-really-mean-it
+    test "$(ceph rbd task list)" != "[]"
+
+    # queue flatten on another image and check that it completes
+    rbd info bar | grep 'parent: '
+    expect_fail rbd snap unprotect foo@snap
+    ceph rbd task add flatten bar
+    for i in {1..12}; do
+        rbd info bar | grep 'parent: ' || break
+        sleep 10
+    done
+    rbd info bar | expect_fail grep 'parent: '
+    rbd snap unprotect foo@snap
+
+    # check that flattens disrupted by pool removal are cleaned up
+    for i in {1..12}; do
+        test "$(ceph rbd task list)" = "[]" && break
+        sleep 10
+    done
+    test "$(ceph rbd task list)" = "[]"
+
+    remove_images
+}
+
 test_pool_image_args
 test_rename
 test_ls
 test_pool_image_args
 test_rename
 test_ls
@@ -1483,5 +1532,6 @@ test_trash_purge_schedule
 test_mirror_snapshot_schedule
 test_perf_image_iostat
 test_mirror_pool_peer_bootstrap_create
 test_mirror_snapshot_schedule
 test_perf_image_iostat
 test_mirror_pool_peer_bootstrap_create
+test_tasks_removed_pool
 
 echo OK
 
 echo OK
index 0fc777168a29f619a0ec9cfcb45bad36ec503d7e..122df3d6f35a52a47afecbc2b5d36281cfc1d6ff 100755 (executable)
@@ -113,10 +113,10 @@ function get_pid()
 
 unmap_device()
 {
 
 unmap_device()
 {
-    local dev=$1
+    local args=$1
     local pid=$2
 
     local pid=$2
 
-    _sudo rbd device --device-type nbd unmap ${dev}
+    _sudo rbd device --device-type nbd unmap ${args}
     rbd device --device-type nbd list | expect_false grep "^${pid}\\b" || return 1
     ps -C rbd-nbd | expect_false grep "^ *${pid}\\b" || return 1
 
     rbd device --device-type nbd list | expect_false grep "^${pid}\\b" || return 1
     ps -C rbd-nbd | expect_false grep "^ *${pid}\\b" || return 1
 
@@ -253,6 +253,13 @@ get_pid ${POOL}
 unmap_device "${IMAGE}@snap" ${PID}
 DEV=
 
 unmap_device "${IMAGE}@snap" ${PID}
 DEV=
 
+# map/unmap snap test with --snap-id
+SNAPID=`rbd snap ls ${POOL}/${IMAGE} | awk '$2 == "snap" {print $1}'`
+DEV=`_sudo rbd device --device-type nbd map --snap-id ${SNAPID} ${POOL}/${IMAGE}`
+get_pid ${POOL}
+unmap_device "--snap-id ${SNAPID} ${IMAGE}" ${PID}
+DEV=
+
 # map/unmap namespace test
 rbd snap create ${POOL}/${NS}/${IMAGE}@snap
 DEV=`_sudo rbd device --device-type nbd map ${POOL}/${NS}/${IMAGE}@snap`
 # map/unmap namespace test
 rbd snap create ${POOL}/${NS}/${IMAGE}@snap
 DEV=`_sudo rbd device --device-type nbd map ${POOL}/${NS}/${IMAGE}@snap`
@@ -260,6 +267,22 @@ get_pid ${POOL} ${NS}
 unmap_device "${POOL}/${NS}/${IMAGE}@snap" ${PID}
 DEV=
 
 unmap_device "${POOL}/${NS}/${IMAGE}@snap" ${PID}
 DEV=
 
+# map/unmap namespace test with --snap-id
+SNAPID=`rbd snap ls ${POOL}/${NS}/${IMAGE} | awk '$2 == "snap" {print $1}'`
+DEV=`_sudo rbd device --device-type nbd map --snap-id ${SNAPID} ${POOL}/${NS}/${IMAGE}`
+get_pid ${POOL} ${NS}
+unmap_device "--snap-id ${SNAPID} ${POOL}/${NS}/${IMAGE}" ${PID}
+DEV=
+
+# map/unmap namespace using options test
+DEV=`_sudo rbd device --device-type nbd map --pool ${POOL} --namespace ${NS} --image ${IMAGE}`
+get_pid ${POOL} ${NS}
+unmap_device "--pool ${POOL} --namespace ${NS} --image ${IMAGE}" ${PID}
+DEV=`_sudo rbd device --device-type nbd map --pool ${POOL} --namespace ${NS} --image ${IMAGE} --snap snap`
+get_pid ${POOL} ${NS}
+unmap_device "--pool ${POOL} --namespace ${NS} --image ${IMAGE} --snap snap" ${PID}
+DEV=
+
 # unmap by image name test 2
 DEV=`_sudo rbd device --device-type nbd map ${POOL}/${IMAGE}`
 get_pid ${POOL}
 # unmap by image name test 2
 DEV=`_sudo rbd device --device-type nbd map ${POOL}/${IMAGE}`
 get_pid ${POOL}
@@ -399,5 +422,69 @@ if [ -n "${COOKIE}" ]; then
     test "${ANOTHER_COOKIE}" = "abc de"
     unmap_device ${DEV} ${PID}
 fi
     test "${ANOTHER_COOKIE}" = "abc de"
     unmap_device ${DEV} ${PID}
 fi
+DEV=
+
+# test detach/attach with --snap-id
+SNAPID=`rbd snap ls ${POOL}/${IMAGE} | awk '$2 == "snap" {print $1}'`
+OUT=`_sudo rbd device --device-type nbd --options try-netlink,show-cookie map --snap-id ${SNAPID} ${POOL}/${IMAGE}`
+read DEV COOKIE <<< "${OUT}"
+get_pid ${POOL}
+_sudo rbd device detach ${POOL}/${IMAGE} --snap-id ${SNAPID} --device-type nbd
+expect_false get_pid ${POOL}
+expect_false _sudo rbd device attach --device ${DEV} --snap-id ${SNAPID} ${POOL}/${IMAGE} --device-type nbd
+if [ -n "${COOKIE}" ]; then
+    _sudo rbd device attach --device ${DEV} --cookie ${COOKIE} --snap-id ${SNAPID} ${POOL}/${IMAGE} --device-type nbd
+else
+    _sudo rbd device attach --device ${DEV} --snap-id ${SNAPID} ${POOL}/${IMAGE} --device-type nbd --force
+fi
+get_pid ${POOL}
+_sudo rbd device detach ${DEV} --device-type nbd
+expect_false get_pid ${POOL}
+DEV=
+
+# test discard granularity with journaling
+rbd config image set ${POOL}/${IMAGE} rbd_discard_granularity_bytes 4096
+rbd feature enable ${POOL}/${IMAGE} journaling
+DEV=`_sudo rbd device --device-type nbd map ${POOL}/${IMAGE}`
+get_pid ${POOL}
+# since a discard will now be pruned to only whole blocks (0..4095, 4096..8191)
+# let us test all the cases around those alignments. 512 is the smallest
+# possible block blkdiscard allows us to use. Thus the test checks
+# 512 before, on the alignment, 512 after.
+_sudo blkdiscard --offset 0 --length $((4096-512)) ${DEV}
+_sudo blkdiscard --offset 0 --length 4096 ${DEV}
+_sudo blkdiscard --offset 0 --length $((4096+512)) ${DEV}
+_sudo blkdiscard --offset 512 --length $((8192-1024)) ${DEV}
+_sudo blkdiscard --offset 512 --length $((8192-512)) ${DEV}
+_sudo blkdiscard --offset 512 --length 8192 ${DEV}
+# wait for commit log to be empty, 10 seconds should be well enough
+tries=0
+queue_length=`rbd journal inspect --pool ${POOL} --image ${IMAGE} | awk '/entries inspected/ {print $1}'`
+while [ ${tries} -lt 10 ] && [ ${queue_length} -gt 0 ]; do
+    rbd journal inspect --pool ${POOL} --image ${IMAGE} --verbose
+    sleep 1
+    queue_length=`rbd journal inspect --pool ${POOL} --image ${IMAGE} | awk '/entries inspected/ {print $1}'`
+    tries=$((tries+1))
+done
+[ ${queue_length} -eq 0 ]
+unmap_device ${DEV} ${PID}
+DEV=
+rbd feature disable ${POOL}/${IMAGE} journaling
+rbd config image rm ${POOL}/${IMAGE} rbd_discard_granularity_bytes
+
+# test that rbd_op_threads setting takes effect
+EXPECTED=`ceph-conf --show-config-value librados_thread_count`
+DEV=`_sudo rbd device --device-type nbd map ${POOL}/${IMAGE}`
+get_pid ${POOL}
+ACTUAL=`ps -p ${PID} -T | grep -c io_context_pool`
+[ ${ACTUAL} -eq ${EXPECTED} ]
+unmap_device ${DEV} ${PID}
+EXPECTED=$((EXPECTED * 3 + 1))
+DEV=`_sudo rbd device --device-type nbd --rbd-op-threads ${EXPECTED} map ${POOL}/${IMAGE}`
+get_pid ${POOL}
+ACTUAL=`ps -p ${PID} -T | grep -c io_context_pool`
+[ ${ACTUAL} -eq ${EXPECTED} ]
+unmap_device ${DEV} ${PID}
+DEV=
 
 echo OK
 
 echo OK
index 2c9fd318f3c1db25196a2b4f307663db2f5224d8..a3261848441f046ee53a9ce1dcafe352e9156d6a 100755 (executable)
@@ -1,4 +1,6 @@
-#!/bin/sh -ex
+#!/usr/bin/env bash
+
+set -ex
 
 #
 # rbd_consistency_groups.sh - test consistency groups cli commands
 
 #
 # rbd_consistency_groups.sh - test consistency groups cli commands
@@ -111,6 +113,16 @@ create_snapshot()
     rbd group snap create $group_name@$snap_name
 }
 
     rbd group snap create $group_name@$snap_name
 }
 
+create_snapshots()
+{
+    local group_name=$1
+    local snap_name=$2
+    local snap_count=$3
+    for i in `seq 1 $snap_count`; do
+        rbd group snap create $group_name@$snap_name$i
+    done
+}
+
 remove_snapshot()
 {
     local group_name=$1
 remove_snapshot()
 {
     local group_name=$1
@@ -118,6 +130,16 @@ remove_snapshot()
     rbd group snap remove $group_name@$snap_name
 }
 
     rbd group snap remove $group_name@$snap_name
 }
 
+remove_snapshots()
+{
+    local group_name=$1
+    local snap_name=$2
+    local snap_count=$3
+    for i in `seq 1 $snap_count`; do
+        rbd group snap remove $group_name@$snap_name$i
+    done
+}
+
 rename_snapshot()
 {
     local group_name=$1
 rename_snapshot()
 {
     local group_name=$1
@@ -146,6 +168,16 @@ check_snapshot_in_group()
     list_snapshots $group_name | grep $snap_name
 }
 
     list_snapshots $group_name | grep $snap_name
 }
 
+check_snapshots_count_in_group()
+{
+    local group_name=$1
+    local snap_name=$2
+    local expected_count=$3
+    local actual_count
+    actual_count=$(list_snapshots $group_name | grep -c $snap_name)
+    (( actual_count == expected_count ))
+}
+
 check_snapshot_not_in_group()
 {
     local group_name=$1
 check_snapshot_not_in_group()
 {
     local group_name=$1
@@ -206,4 +238,21 @@ remove_group $group
 remove_image $image
 echo "PASSED"
 
 remove_image $image
 echo "PASSED"
 
+echo "TEST: list snapshots of consistency group"
+image="test_image"
+group="test_consistency_group"
+snap="group_snap"
+create_image $image
+create_group $group
+add_image_to_group $image $group
+create_snapshots $group $snap 10
+check_snapshots_count_in_group $group $snap 10
+remove_snapshots $group $snap 10
+create_snapshots $group $snap 100
+check_snapshots_count_in_group $group $snap 100
+remove_snapshots $group $snap 100
+remove_group $group
+remove_image $image
+echo "PASSED"
+
 echo "OK"
 echo "OK"
index fb77c0d9bf869f5665042c4666e5ce30446296dd..6ef06f2b82cbb27d56b9afd91b00c2402e487266 100755 (executable)
@@ -24,8 +24,13 @@ start_mirrors ${CLUSTER1}
 start_mirrors ${CLUSTER2}
 
 testlog "TEST: verify rx-only direction"
 start_mirrors ${CLUSTER2}
 
 testlog "TEST: verify rx-only direction"
-[ "$(rbd --cluster ${CLUSTER1} --pool ${POOL} mirror pool info --format xml |
-       ${XMLSTARLET} sel -t -v  '//mirror/peers/peer[1]/uuid')" = "" ]
+# rx-only peer is added immediately by "rbd mirror pool peer bootstrap import"
+rbd --cluster ${CLUSTER2} --pool ${POOL} mirror pool info --format json | jq -e '.peers[0].direction == "rx-only"'
+# tx-only peer is added asynchronously by mirror_peer_ping class method
+while ! rbd --cluster ${CLUSTER1} --pool ${POOL} mirror pool info --format json | jq -e '.peers | length > 0'; do
+    sleep 1
+done
+rbd --cluster ${CLUSTER1} --pool ${POOL} mirror pool info --format json | jq -e '.peers[0].direction == "tx-only"'
 
 create_image_and_enable_mirror ${CLUSTER1} ${POOL} image1
 
 
 create_image_and_enable_mirror ${CLUSTER1} ${POOL} image1
 
@@ -34,6 +39,10 @@ write_image ${CLUSTER1} ${POOL} image1 100
 wait_for_replay_complete ${CLUSTER2} ${CLUSTER1} ${POOL} image1
 
 testlog "TEST: verify rx-tx direction"
 wait_for_replay_complete ${CLUSTER2} ${CLUSTER1} ${POOL} image1
 
 testlog "TEST: verify rx-tx direction"
+# both rx-tx peers are added immediately by "rbd mirror pool peer bootstrap import"
+rbd --cluster ${CLUSTER1} --pool ${PARENT_POOL} mirror pool info --format json | jq -e '.peers[0].direction == "rx-tx"'
+rbd --cluster ${CLUSTER2} --pool ${PARENT_POOL} mirror pool info --format json | jq -e '.peers[0].direction == "rx-tx"'
+
 create_image ${CLUSTER1} ${PARENT_POOL} image1
 create_image ${CLUSTER2} ${PARENT_POOL} image2
 
 create_image ${CLUSTER1} ${PARENT_POOL} image1
 create_image ${CLUSTER2} ${PARENT_POOL} image2
 
index a6ec7d198af9cdfbc4d6f9686b5ba2bc231288a5..bf95a05c4e8338cc8e9acdba48a6d88eb145cf3a 100755 (executable)
@@ -9,10 +9,10 @@ trap -- 'retry' EXIT
 retry() {
     rm -rf ffsb
     # double the timeout value
 retry() {
     rm -rf ffsb
     # double the timeout value
-    timeout 3600 git clone git://git.ceph.com/ffsb.git --depth 1
+    timeout 3600 git clone https://git.ceph.com/ffsb.git --depth 1
 }
 rm -rf ffsb
 }
 rm -rf ffsb
-timeout 1800 git clone git://git.ceph.com/ffsb.git --depth 1
+timeout 1800 git clone https://git.ceph.com/ffsb.git --depth 1
 trap - EXIT
 
 cd ffsb
 trap - EXIT
 
 cd ffsb
index 813e211dc32e1f5df82b2038d508bc9102d7ace3..0d5ba3a58baf54f4fa39fc5eeb8c0052fb858e0b 100755 (executable)
@@ -2,12 +2,12 @@
 
 set -e
 
 
 set -e
 
-git clone git://git.ceph.com/xfstests.git
-cd xfstests
+git clone https://git.ceph.com/xfstests-dev.git
+cd xfstests-dev
 git checkout 12973fc04fd10d4af086901e10ffa8e48866b735
 make -j4
 cd ..
 git checkout 12973fc04fd10d4af086901e10ffa8e48866b735
 make -j4
 cd ..
-cp xfstests/ltp/fsx .
+cp xfstests-dev/ltp/fsx .
 
 OPTIONS="-z"  # don't use zero range calls; not supported by cephfs
 
 
 OPTIONS="-z"  # don't use zero range calls; not supported by cephfs
 
diff --git a/ceph/qa/workunits/windows/run-tests.ps1 b/ceph/qa/workunits/windows/run-tests.ps1
new file mode 100644 (file)
index 0000000..9aef612
--- /dev/null
@@ -0,0 +1,31 @@
+$ProgressPreference = "SilentlyContinue"
+$ErrorActionPreference = "Stop"
+
+$scriptLocation = [System.IO.Path]::GetDirectoryName(
+    $myInvocation.MyCommand.Definition)
+
+$testRbdWnbd = "$scriptLocation/test_rbd_wnbd.py"
+
+function safe_exec() {
+    # Powershell doesn't check the command exit code, we'll need to
+    # do it ourselves. Also, in case of native commands, it treats stderr
+    # output as an exception, which is why we'll have to capture it.
+    cmd /c "$args 2>&1"
+    if ($LASTEXITCODE) {
+        throw "Command failed: $args"
+    }
+}
+
+safe_exec python.exe $testRbdWnbd --test-name RbdTest --iterations 100
+safe_exec python.exe $testRbdWnbd --test-name RbdFioTest --iterations 100
+safe_exec python.exe $testRbdWnbd --test-name RbdStampTest --iterations 100
+
+# It can take a while to setup the partition (~10s), we'll use fewer iterations.
+safe_exec python.exe $testRbdWnbd --test-name RbdFsTest --iterations 4
+safe_exec python.exe $testRbdWnbd --test-name RbdFsFioTest --iterations 4
+safe_exec python.exe $testRbdWnbd --test-name RbdFsStampTest --iterations 4
+
+# The live resize feature is not available in Quincy. Uncomment the following if
+# it gets backported.
+# safe_exec python.exe $testRbdWnbd `
+#     --test-name RbdResizeFioTest --image-size-mb 64
diff --git a/ceph/qa/workunits/windows/test_rbd_wnbd.py b/ceph/qa/workunits/windows/test_rbd_wnbd.py
new file mode 100644 (file)
index 0000000..f22810e
--- /dev/null
@@ -0,0 +1,919 @@
+import argparse
+import collections
+import functools
+import json
+import logging
+import math
+import os
+import prettytable
+import random
+import subprocess
+import time
+import threading
+import typing
+import uuid
+from concurrent import futures
+
+LOG = logging.getLogger()
+
+parser = argparse.ArgumentParser(description='rbd-wnbd tests')
+parser.add_argument('--test-name',
+                    help='The test to be run.',
+                    default="RbdFioTest")
+parser.add_argument('--iterations',
+                    help='Total number of test iterations',
+                    default=1, type=int)
+parser.add_argument('--concurrency',
+                    help='The number of tests to run in parallel',
+                    default=4, type=int)
+parser.add_argument('--fio-iterations',
+                    help='Total number of benchmark iterations per disk.',
+                    default=1, type=int)
+parser.add_argument('--fio-workers',
+                    help='Total number of fio workers per disk.',
+                    default=1, type=int)
+parser.add_argument('--fio-depth',
+                    help='The number of concurrent asynchronous operations '
+                         'executed per disk',
+                    default=64, type=int)
+parser.add_argument('--fio-verify',
+                    help='The mechanism used to validate the written '
+                         'data. Examples: crc32c, md5, sha1, null, etc. '
+                         'If set to null, the written data will not be '
+                         'verified.',
+                    default='crc32c')
+parser.add_argument('--bs',
+                    help='Benchmark block size.',
+                    default="2M")
+parser.add_argument('--op',
+                    help='Benchmark operation. '
+                         'Examples: read, randwrite, rw, etc.',
+                    default="rw")
+parser.add_argument('--image-prefix',
+                    help='The image name prefix.',
+                    default="cephTest-")
+parser.add_argument('--image-size-mb',
+                    help='The image size in megabytes.',
+                    default=1024, type=int)
+parser.add_argument('--map-timeout',
+                    help='Image map timeout.',
+                    default=60, type=int)
+parser.add_argument('--skip-enabling-disk', action='store_true',
+                    help='If set, the disk will not be turned online and the '
+                         'read-only flag will not be removed. Useful when '
+                         'the SAN policy is set to "onlineAll".')
+parser.add_argument('--verbose', action='store_true',
+                    help='Print info messages.')
+parser.add_argument('--debug', action='store_true',
+                    help='Print debug messages.')
+parser.add_argument('--stop-on-error', action='store_true',
+                    help='Stop testing when hitting errors.')
+parser.add_argument('--skip-cleanup-on-error', action='store_true',
+                    help='Skip cleanup when hitting errors.')
+
+
+class CephTestException(Exception):
+    msg_fmt = "An exception has been encountered."
+
+    def __init__(self, message: str = None, **kwargs):
+        self.kwargs = kwargs
+        if not message:
+            message = self.msg_fmt % kwargs
+        self.message = message
+        super(CephTestException, self).__init__(message)
+
+
+class CommandFailed(CephTestException):
+    msg_fmt = (
+        "Command failed: %(command)s. "
+        "Return code: %(returncode)s. "
+        "Stdout: %(stdout)s. Stderr: %(stderr)s.")
+
+
+class CephTestTimeout(CephTestException):
+    msg_fmt = "Operation timeout."
+
+
+def setup_logging(log_level: int = logging.INFO):
+    handler = logging.StreamHandler()
+    handler.setLevel(log_level)
+
+    log_fmt = '[%(asctime)s] %(levelname)s - %(message)s'
+    formatter = logging.Formatter(log_fmt)
+    handler.setFormatter(formatter)
+
+    LOG.addHandler(handler)
+    LOG.setLevel(logging.DEBUG)
+
+
+def retry_decorator(timeout: int = 60,
+                    retry_interval: int = 2,
+                    silent_interval: int = 10,
+                    additional_details: str = "",
+                    retried_exceptions:
+                        typing.Union[
+                            typing.Type[Exception],
+                            collections.abc.Iterable[
+                                typing.Type[Exception]]] = Exception):
+    def wrapper(f: typing.Callable[..., typing.Any]):
+        @functools.wraps(f)
+        def inner(*args, **kwargs):
+            tstart: float = time.time()
+            elapsed: float = 0
+            exc = None
+            details = additional_details or "%s failed" % f.__qualname__
+
+            while elapsed < timeout or not timeout:
+                try:
+                    return f(*args, **kwargs)
+                except retried_exceptions as ex:
+                    exc = ex
+                    elapsed = time.time() - tstart
+                    if elapsed > silent_interval:
+                        level = logging.WARNING
+                    else:
+                        level = logging.DEBUG
+                    LOG.log(level,
+                            "Exception: %s. Additional details: %s. "
+                            "Time elapsed: %d. Timeout: %d",
+                            ex, details, elapsed, timeout)
+
+                    time.sleep(retry_interval)
+                    elapsed = time.time() - tstart
+
+            msg = (
+                "Operation timed out. Exception: %s. Additional details: %s. "
+                "Time elapsed: %d. Timeout: %d.")
+            raise CephTestTimeout(
+                msg % (exc, details, elapsed, timeout))
+        return inner
+    return wrapper
+
+
+def execute(*args, **kwargs):
+    LOG.debug("Executing: %s", args)
+    result = subprocess.run(
+        args,
+        stdout=subprocess.PIPE,
+        stderr=subprocess.PIPE,
+        **kwargs)
+    LOG.debug("Command %s returned %d.", args, result.returncode)
+    if result.returncode:
+        exc = CommandFailed(
+            command=args, returncode=result.returncode,
+            stdout=result.stdout, stderr=result.stderr)
+        LOG.error(exc)
+        raise exc
+    return result
+
+
+def ps_execute(*args, **kwargs):
+    # Disable PS progress bar, causes issues when invoked remotely.
+    prefix = "$global:ProgressPreference = 'SilentlyContinue' ; "
+    return execute(
+        "powershell.exe", "-NonInteractive",
+        "-Command", prefix, *args, **kwargs)
+
+
+def array_stats(array: list):
+    mean = sum(array) / len(array) if len(array) else 0
+    variance = (sum((i - mean) ** 2 for i in array) / len(array)
+                if len(array) else 0)
+    std_dev = math.sqrt(variance)
+    sorted_array = sorted(array)
+
+    return {
+        'min': min(array) if len(array) else 0,
+        'max': max(array) if len(array) else 0,
+        'sum': sum(array) if len(array) else 0,
+        'mean': mean,
+        'median': sorted_array[len(array) // 2] if len(array) else 0,
+        'max_90': sorted_array[int(len(array) * 0.9)] if len(array) else 0,
+        'min_90': sorted_array[int(len(array) * 0.1)] if len(array) else 0,
+        'variance': variance,
+        'std_dev': std_dev,
+        'count': len(array)
+    }
+
+
+class Tracer:
+    data: collections.OrderedDict = collections.OrderedDict()
+    lock = threading.Lock()
+
+    @classmethod
+    def trace(cls, func):
+        def wrapper(*args, **kwargs):
+            tstart = time.time()
+            exc_str = None
+
+            # Preserve call order
+            with cls.lock:
+                if func.__qualname__ not in cls.data:
+                    cls.data[func.__qualname__] = list()
+
+            try:
+                return func(*args, **kwargs)
+            except Exception as exc:
+                exc_str = str(exc)
+                raise
+            finally:
+                tend = time.time()
+
+                with cls.lock:
+                    cls.data[func.__qualname__] += [{
+                        "duration": tend - tstart,
+                        "error": exc_str,
+                    }]
+
+        return wrapper
+
+    @classmethod
+    def get_results(cls):
+        stats = collections.OrderedDict()
+        for f in cls.data.keys():
+            stats[f] = array_stats([i['duration'] for i in cls.data[f]])
+            errors = []
+            for i in cls.data[f]:
+                if i['error']:
+                    errors.append(i['error'])
+
+            stats[f]['errors'] = errors
+        return stats
+
+    @classmethod
+    def print_results(cls):
+        r = cls.get_results()
+
+        table = prettytable.PrettyTable(title="Duration (s)")
+        table.field_names = [
+            "function", "min", "max", "total",
+            "mean", "median", "std_dev",
+            "max 90%", "min 90%", "count", "errors"]
+        table.float_format = ".4"
+        for f, s in r.items():
+            table.add_row([f, s['min'], s['max'], s['sum'],
+                           s['mean'], s['median'], s['std_dev'],
+                           s['max_90'], s['min_90'],
+                           s['count'], len(s['errors'])])
+        print(table)
+
+
+class RbdImage(object):
+    def __init__(self,
+                 name: str,
+                 size_mb: int,
+                 is_shared: bool = True,
+                 disk_number: int = -1,
+                 mapped: bool = False):
+        self.name = name
+        self.size_mb = size_mb
+        self.is_shared = is_shared
+        self.disk_number = disk_number
+        self.mapped = mapped
+        self.removed = False
+        self.drive_letter = ""
+
+    @classmethod
+    @Tracer.trace
+    def create(cls,
+               name: str,
+               size_mb: int = 1024,
+               is_shared: bool = True):
+        LOG.info("Creating image: %s. Size: %s.", name, "%sM" % size_mb)
+        cmd = ["rbd", "create", name, "--size", "%sM" % size_mb]
+        if is_shared:
+            cmd += ["--image-shared"]
+        execute(*cmd)
+
+        return RbdImage(name, size_mb, is_shared)
+
+    @Tracer.trace
+    def get_disk_number(self,
+                        timeout: int = 60,
+                        retry_interval: int = 2):
+        @retry_decorator(
+            retried_exceptions=CephTestException,
+            timeout=timeout,
+            retry_interval=retry_interval)
+        def _get_disk_number():
+            LOG.info("Retrieving disk number: %s", self.name)
+
+            result = execute("rbd-wnbd", "show", self.name, "--format=json")
+            disk_info = json.loads(result.stdout)
+            disk_number = disk_info["disk_number"]
+            if disk_number > 0:
+                LOG.debug("Image %s disk number: %d", self.name, disk_number)
+                return disk_number
+
+            raise CephTestException(
+                f"Could not get disk number: {self.name}.")
+
+        return _get_disk_number()
+
+    @Tracer.trace
+    def _wait_for_disk(self,
+                       timeout: int = 60,
+                       retry_interval: int = 2):
+        @retry_decorator(
+            retried_exceptions=(FileNotFoundError, OSError),
+            additional_details="the mapped disk isn't available yet",
+            timeout=timeout,
+            retry_interval=retry_interval)
+        def wait_for_disk():
+            LOG.debug("Waiting for disk to be accessible: %s %s",
+                      self.name, self.path)
+
+            with open(self.path, 'rb'):
+                pass
+
+        return wait_for_disk()
+
+    @property
+    def path(self):
+        return f"\\\\.\\PhysicalDrive{self.disk_number}"
+
+    @Tracer.trace
+    @retry_decorator(additional_details="couldn't clear disk read-only flag")
+    def set_writable(self):
+        ps_execute(
+            "Set-Disk", "-Number", str(self.disk_number),
+            "-IsReadOnly", "$false")
+
+    @Tracer.trace
+    @retry_decorator(additional_details="couldn't bring the disk online")
+    def set_online(self):
+        ps_execute(
+            "Set-Disk", "-Number", str(self.disk_number),
+            "-IsOffline", "$false")
+
+    @Tracer.trace
+    def map(self, timeout: int = 60):
+        LOG.info("Mapping image: %s", self.name)
+        tstart = time.time()
+
+        execute("rbd-wnbd", "map", self.name)
+        self.mapped = True
+
+        self.disk_number = self.get_disk_number(timeout=timeout)
+
+        elapsed = time.time() - tstart
+        self._wait_for_disk(timeout=timeout - elapsed)
+
+    @Tracer.trace
+    def unmap(self):
+        if self.mapped:
+            LOG.info("Unmapping image: %s", self.name)
+            execute("rbd-wnbd", "unmap", self.name)
+            self.mapped = False
+
+    @Tracer.trace
+    def remove(self):
+        if not self.removed:
+            LOG.info("Removing image: %s", self.name)
+            execute("rbd", "rm", self.name)
+            self.removed = True
+
+    def cleanup(self):
+        try:
+            self.unmap()
+        finally:
+            self.remove()
+
+    @Tracer.trace
+    @retry_decorator()
+    def _init_disk(self):
+        cmd = f"Get-Disk -Number {self.disk_number} | Initialize-Disk"
+        ps_execute(cmd)
+
+    @Tracer.trace
+    @retry_decorator()
+    def _create_partition(self):
+        cmd = (f"Get-Disk -Number {self.disk_number} | "
+               "New-Partition -AssignDriveLetter -UseMaximumSize")
+        ps_execute(cmd)
+
+    @Tracer.trace
+    @retry_decorator()
+    def _format_volume(self):
+        cmd = (
+            f"(Get-Partition -DiskNumber {self.disk_number}"
+            " | ? { $_.DriveLetter }) | Format-Volume -Force -Confirm:$false")
+        ps_execute(cmd)
+
+    @Tracer.trace
+    @retry_decorator()
+    def _get_drive_letter(self):
+        cmd = (f"(Get-Partition -DiskNumber {self.disk_number}"
+               " | ? { $_.DriveLetter }).DriveLetter")
+        result = ps_execute(cmd)
+
+        # The PowerShell command will place a null character if no drive letter
+        # is available. For example, we can receive "\x00\r\n".
+        self.drive_letter = result.stdout.decode().strip()
+        if not self.drive_letter.isalpha() or len(self.drive_letter) != 1:
+            raise CephTestException(
+                "Invalid drive letter received: %s" % self.drive_letter)
+
+    @Tracer.trace
+    def init_fs(self):
+        if not self.mapped:
+            raise CephTestException("Unable to create fs, image not mapped.")
+
+        LOG.info("Initializing fs, image: %s.", self.name)
+
+        self._init_disk()
+        self._create_partition()
+        self._format_volume()
+        self._get_drive_letter()
+
+    @Tracer.trace
+    def get_fs_capacity(self):
+        if not self.drive_letter:
+            raise CephTestException("No drive letter available")
+
+        cmd = f"(Get-Volume -DriveLetter {self.drive_letter}).Size"
+        result = ps_execute(cmd)
+
+        return int(result.stdout.decode().strip())
+
+    @Tracer.trace
+    def resize(self, new_size_mb, allow_shrink=False):
+        LOG.info(
+            "Resizing image: %s. New size: %s MB, old size: %s MB",
+            self.name, new_size_mb, self.size_mb)
+
+        cmd = ["rbd", "resize", self.name,
+               "--size", f"{new_size_mb}M", "--no-progress"]
+        if allow_shrink:
+            cmd.append("--allow-shrink")
+
+        execute(*cmd)
+
+        self.size_mb = new_size_mb
+
+    @Tracer.trace
+    def get_disk_size(self):
+        """Retrieve the virtual disk size (bytes) reported by Windows."""
+        cmd = f"(Get-Disk -Number {self.disk_number}).Size"
+        result = ps_execute(cmd)
+
+        disk_size = result.stdout.decode().strip()
+        if not disk_size.isdigit():
+            raise CephTestException(
+                "Invalid disk size received: %s" % disk_size)
+
+        return int(disk_size)
+
+    @Tracer.trace
+    @retry_decorator(timeout=30)
+    def wait_for_disk_resize(self):
+        # After resizing the rbd image, the daemon is expected to receive
+        # the notification, inform the WNBD driver and then trigger a disk
+        # rescan (IOCTL_DISK_UPDATE_PROPERTIES). This might take a few seconds,
+        # so we'll need to do some polling.
+        disk_size = self.get_disk_size()
+        disk_size_mb = disk_size // (1 << 20)
+
+        if disk_size_mb != self.size_mb:
+            raise CephTestException(
+                "The disk size hasn't been updated yet. Retrieved size: "
+                f"{disk_size_mb}MB. Expected size: {self.size_mb}MB.")
+
+
+class RbdTest(object):
+    image: RbdImage
+
+    requires_disk_online = False
+    requires_disk_write = False
+
+    def __init__(self,
+                 image_prefix: str = "cephTest-",
+                 image_size_mb: int = 1024,
+                 map_timeout: int = 60,
+                 **kwargs):
+        self.image_size_mb = image_size_mb
+        self.image_name = image_prefix + str(uuid.uuid4())
+        self.map_timeout = map_timeout
+        self.skip_enabling_disk = kwargs.get("skip_enabling_disk")
+
+    @Tracer.trace
+    def initialize(self):
+        self.image = RbdImage.create(
+            self.image_name,
+            self.image_size_mb)
+        self.image.map(timeout=self.map_timeout)
+
+        if not self.skip_enabling_disk:
+            if self.requires_disk_write:
+                self.image.set_writable()
+
+            if self.requires_disk_online:
+                self.image.set_online()
+
+    def run(self):
+        pass
+
+    def cleanup(self):
+        if self.image:
+            self.image.cleanup()
+
+    @classmethod
+    def print_results(cls,
+                      title: str = "Test results",
+                      description: str = None):
+        pass
+
+
+class RbdFsTestMixin(object):
+    # Windows disks must be turned online before accessing partitions.
+    requires_disk_online = True
+    requires_disk_write = True
+
+    @Tracer.trace
+    def initialize(self):
+        super(RbdFsTestMixin, self).initialize()
+
+        self.image.init_fs()
+
+    def get_subpath(self, *args):
+        drive_path = f"{self.image.drive_letter}:\\"
+        return os.path.join(drive_path, *args)
+
+
+class RbdFsTest(RbdFsTestMixin, RbdTest):
+    pass
+
+
+class RbdFioTest(RbdTest):
+    data: typing.DefaultDict[str, typing.List[typing.Dict[str, str]]] = (
+        collections.defaultdict(list))
+    lock = threading.Lock()
+
+    def __init__(self,
+                 *args,
+                 fio_size_mb: int = None,
+                 iterations: int = 1,
+                 workers: int = 1,
+                 bs: str = "2M",
+                 iodepth: int = 64,
+                 op: str = "rw",
+                 verify: str = "crc32c",
+                 **kwargs):
+
+        super(RbdFioTest, self).__init__(*args, **kwargs)
+
+        self.fio_size_mb = fio_size_mb or self.image_size_mb
+        self.iterations = iterations
+        self.workers = workers
+        self.bs = bs
+        self.iodepth = iodepth
+        self.op = op
+        if op not in ("read", "randread"):
+            self.requires_disk_write = True
+        self.verify = verify
+
+    def process_result(self, raw_fio_output: str):
+        result = json.loads(raw_fio_output)
+        with self.lock:
+            for job in result["jobs"]:
+                # Fio doesn't support trim on Windows
+                for op in ['read', 'write']:
+                    if op in job:
+                        self.data[op].append({
+                            'error': job['error'],
+                            'io_bytes': job[op]['io_bytes'],
+                            'bw_bytes': job[op]['bw_bytes'],
+                            'runtime': job[op]['runtime'] / 1000,  # seconds
+                            'total_ios': job[op]['short_ios'],
+                            'short_ios': job[op]['short_ios'],
+                            'dropped_ios': job[op]['short_ios'],
+                            'clat_ns_min': job[op]['clat_ns']['min'],
+                            'clat_ns_max': job[op]['clat_ns']['max'],
+                            'clat_ns_mean': job[op]['clat_ns']['mean'],
+                            'clat_ns_stddev': job[op]['clat_ns']['stddev'],
+                            'clat_ns_10': job[op].get('clat_ns', {})
+                                                 .get('percentile', {})
+                                                 .get('10.000000', 0),
+                            'clat_ns_90': job[op].get('clat_ns', {})
+                                                 .get('percentile', {})
+                                                 .get('90.000000', 0)
+                        })
+
+    def _get_fio_path(self):
+        return self.image.path
+
+    @Tracer.trace
+    def _run_fio(self, fio_size_mb=None):
+        LOG.info("Starting FIO test.")
+        cmd = [
+            "fio", "--thread", "--output-format=json",
+            "--randrepeat=%d" % self.iterations,
+            "--direct=1", "--name=test",
+            "--bs=%s" % self.bs, "--iodepth=%s" % self.iodepth,
+            "--size=%sM" % (fio_size_mb or self.fio_size_mb),
+            "--readwrite=%s" % self.op,
+            "--numjobs=%s" % self.workers,
+            "--filename=%s" % self._get_fio_path(),
+        ]
+        if self.verify:
+            cmd += ["--verify=%s" % self.verify]
+        result = execute(*cmd)
+        LOG.info("Completed FIO test.")
+        self.process_result(result.stdout)
+
+    @Tracer.trace
+    def run(self):
+        self._run_fio()
+
+    @classmethod
+    def print_results(cls,
+                      title: str = "Benchmark results",
+                      description: str = None):
+        if description:
+            title = "%s (%s)" % (title, description)
+
+        for op in cls.data.keys():
+            op_title = "%s op=%s" % (title, op)
+
+            table = prettytable.PrettyTable(title=op_title)
+            table.field_names = ["stat", "min", "max", "mean",
+                                 "median", "std_dev",
+                                 "max 90%", "min 90%", "total"]
+            table.float_format = ".4"
+
+            op_data = cls.data[op]
+
+            s = array_stats([float(i["bw_bytes"]) / 1000_000 for i in op_data])
+            table.add_row(["bandwidth (MB/s)",
+                           s['min'], s['max'], s['mean'],
+                           s['median'], s['std_dev'],
+                           s['max_90'], s['min_90'], 'N/A'])
+
+            s = array_stats([float(i["runtime"]) for i in op_data])
+            table.add_row(["duration (s)",
+                          s['min'], s['max'], s['mean'],
+                          s['median'], s['std_dev'],
+                          s['max_90'], s['min_90'], s['sum']])
+
+            s = array_stats([i["error"] for i in op_data])
+            table.add_row(["errors",
+                           s['min'], s['max'], s['mean'],
+                           s['median'], s['std_dev'],
+                           s['max_90'], s['min_90'], s['sum']])
+
+            s = array_stats([i["short_ios"] for i in op_data])
+            table.add_row(["incomplete IOs",
+                           s['min'], s['max'], s['mean'],
+                           s['median'], s['std_dev'],
+                           s['max_90'], s['min_90'], s['sum']])
+
+            s = array_stats([i["dropped_ios"] for i in op_data])
+            table.add_row(["dropped IOs",
+                           s['min'], s['max'], s['mean'],
+                           s['median'], s['std_dev'],
+                           s['max_90'], s['min_90'], s['sum']])
+
+            clat_min = array_stats([i["clat_ns_min"] for i in op_data])
+            clat_max = array_stats([i["clat_ns_max"] for i in op_data])
+            clat_mean = array_stats([i["clat_ns_mean"] for i in op_data])
+            clat_stddev = math.sqrt(
+                sum([float(i["clat_ns_stddev"]) ** 2 for i in op_data]) / len(op_data)
+                if len(op_data) else 0)
+            clat_10 = array_stats([i["clat_ns_10"] for i in op_data])
+            clat_90 = array_stats([i["clat_ns_90"] for i in op_data])
+            # For convenience, we'll convert it from ns to seconds.
+            table.add_row(["completion latency (s)",
+                           clat_min['min'] / 1e+9,
+                           clat_max['max'] / 1e+9,
+                           clat_mean['mean'] / 1e+9,
+                           clat_mean['median'] / 1e+9,
+                           clat_stddev / 1e+9,
+                           clat_10['mean'] / 1e+9,
+                           clat_90['mean'] / 1e+9,
+                           clat_mean['sum'] / 1e+9])
+            print(table)
+
+
+class RbdResizeFioTest(RbdFioTest):
+    """Image resize test.
+
+    This test extends and then shrinks the image, performing FIO tests to
+    validate the resized image.
+    """
+
+    @Tracer.trace
+    def run(self):
+        self.image.resize(self.image_size_mb * 2)
+        self.image.wait_for_disk_resize()
+
+        self._run_fio(fio_size_mb=self.image_size_mb * 2)
+
+        self.image.resize(self.image_size_mb // 2, allow_shrink=True)
+        self.image.wait_for_disk_resize()
+
+        self._run_fio(fio_size_mb=self.image_size_mb // 2)
+
+        # Just like rbd-nbd, rbd-wnbd is masking out-of-bounds errors.
+        # For this reason, we don't have a negative test that writes
+        # passed the disk boundary.
+
+
+class RbdFsFioTest(RbdFsTestMixin, RbdFioTest):
+    def initialize(self):
+        super(RbdFsFioTest, self).initialize()
+
+        if not self.fio_size_mb or self.fio_size_mb == self.image_size_mb:
+            # Out of caution, we'll use up to 80% of the FS by default
+            self.fio_size_mb = int(
+                self.image.get_fs_capacity() * 0.8 / (1024 * 1024))
+
+    @staticmethod
+    def _fio_escape_path(path):
+        # FIO allows specifying multiple files separated by colon.
+        # This means that ":" has to be escaped, so
+        # F:\filename becomes F\:\filename.
+        return path.replace(":", "\\:")
+
+    def _get_fio_path(self):
+        return self._fio_escape_path(self.get_subpath("test-fio"))
+
+
+class RbdStampTest(RbdTest):
+    requires_disk_write = True
+
+    _write_open_mode = "rb+"
+    _read_open_mode = "rb"
+    _expect_path_exists = True
+
+    @staticmethod
+    def _rand_float(min_val: float, max_val: float):
+        return min_val + (random.random() * max_val - min_val)
+
+    def _get_stamp(self):
+        buff = self.image_name.encode()
+        padding = 512 - len(buff)
+        buff += b'\0' * padding
+        return buff
+
+    def _get_stamp_path(self):
+        return self.image.path
+
+    @Tracer.trace
+    def _write_stamp(self):
+        with open(self._get_stamp_path(), self._write_open_mode) as disk:
+            stamp = self._get_stamp()
+            disk.write(stamp)
+
+    @Tracer.trace
+    def _read_stamp(self):
+        with open(self._get_stamp_path(), self._read_open_mode) as disk:
+            return disk.read(len(self._get_stamp()))
+
+    @Tracer.trace
+    def run(self):
+        if self._expect_path_exists:
+            # Wait up to 5 seconds and then check the disk, ensuring that
+            # nobody else wrote to it. This is particularly useful when
+            # running a high number of tests in parallel, ensuring that
+            # we aren't writing to the wrong disk.
+            time.sleep(self._rand_float(0, 5))
+
+            stamp = self._read_stamp()
+            assert stamp == b'\0' * len(self._get_stamp())
+
+        self._write_stamp()
+
+        stamp = self._read_stamp()
+        assert stamp == self._get_stamp()
+
+
+class RbdFsStampTest(RbdFsTestMixin, RbdStampTest):
+    _write_open_mode = "wb"
+    _expect_path_exists = False
+
+    def _get_stamp_path(self):
+        return self.get_subpath("test-stamp")
+
+
+class TestRunner(object):
+    def __init__(self,
+                 test_cls: typing.Type[RbdTest],
+                 test_params: dict = {},
+                 iterations: int = 1,
+                 workers: int = 1,
+                 stop_on_error: bool = False,
+                 cleanup_on_error: bool = True):
+        self.test_cls = test_cls
+        self.test_params = test_params
+        self.iterations = iterations
+        self.workers = workers
+        self.executor = futures.ThreadPoolExecutor(max_workers=workers)
+        self.lock = threading.Lock()
+        self.completed = 0
+        self.errors = 0
+        self.stopped = False
+        self.stop_on_error = stop_on_error
+        self.cleanup_on_error = cleanup_on_error
+
+    @Tracer.trace
+    def run(self):
+        tasks = []
+        for i in range(self.iterations):
+            task = self.executor.submit(self.run_single_test)
+            tasks.append(task)
+
+        LOG.info("Waiting for %d tests to complete.", self.iterations)
+        for task in tasks:
+            task.result()
+
+    def run_single_test(self):
+        failed = False
+        if self.stopped:
+            return
+
+        try:
+            test = self.test_cls(**self.test_params)
+            test.initialize()
+            test.run()
+        except KeyboardInterrupt:
+            LOG.warning("Received Ctrl-C.")
+            self.stopped = True
+        except Exception as ex:
+            failed = True
+            if self.stop_on_error:
+                self.stopped = True
+            with self.lock:
+                self.errors += 1
+                LOG.exception(
+                    "Test exception: %s. Total exceptions: %d",
+                    ex, self.errors)
+        finally:
+            if not failed or self.cleanup_on_error:
+                try:
+                    test.cleanup()
+                except KeyboardInterrupt:
+                    LOG.warning("Received Ctrl-C.")
+                    self.stopped = True
+                    # Retry the cleanup
+                    test.cleanup()
+                except Exception:
+                    LOG.exception("Test cleanup failed.")
+
+            with self.lock:
+                self.completed += 1
+                LOG.info("Completed tests: %d. Pending: %d",
+                         self.completed, self.iterations - self.completed)
+
+
+TESTS: typing.Dict[str, typing.Type[RbdTest]] = {
+    'RbdTest': RbdTest,
+    'RbdFioTest': RbdFioTest,
+    'RbdResizeFioTest': RbdResizeFioTest,
+    'RbdStampTest': RbdStampTest,
+    # FS tests
+    'RbdFsTest': RbdFsTest,
+    'RbdFsFioTest': RbdFsFioTest,
+    'RbdFsStampTest': RbdFsStampTest,
+}
+
+if __name__ == '__main__':
+    args = parser.parse_args()
+
+    log_level = logging.WARNING
+    if args.verbose:
+        log_level = logging.INFO
+    if args.debug:
+        log_level = logging.DEBUG
+    setup_logging(log_level)
+
+    test_params = dict(
+        image_size_mb=args.image_size_mb,
+        image_prefix=args.image_prefix,
+        bs=args.bs,
+        op=args.op,
+        verify=args.fio_verify,
+        iodepth=args.fio_depth,
+        map_timeout=args.map_timeout,
+        skip_enabling_disk=args.skip_enabling_disk,
+    )
+
+    try:
+        test_cls = TESTS[args.test_name]
+    except KeyError:
+        raise CephTestException("Unkown test: {}".format(args.test_name))
+
+    runner = TestRunner(
+        test_cls,
+        test_params=test_params,
+        iterations=args.iterations,
+        workers=args.concurrency,
+        stop_on_error=args.stop_on_error,
+        cleanup_on_error=not args.skip_cleanup_on_error)
+    runner.run()
+
+    Tracer.print_results()
+    test_cls.print_results(
+        description="count: %d, concurrency: %d" %
+        (args.iterations, args.concurrency))
+
+    assert runner.errors == 0, f"encountered {runner.errors} error(s)."
index 2389a2f81f6af33ef87149117a466619d39bf971..cd1fbbdbc8c3248144758f13a509c0c19259c3fc 100644 (file)
@@ -1,2 +1,2 @@
-98318ae89f1a893a6ded3a640405cdbb33e08757
-17.2.5
+d7ff0d10654d2280e08f1ab989c7cdf3064446a5
+17.2.6
index c779c8521ff1271df36da06f77b95992960ef17b..b03f76bff8043f89c857919ff4a479b9e597519a 100644 (file)
@@ -276,27 +276,6 @@ if(WITH_CEPHFS_JAVA)
   add_subdirectory(java)
 endif()
 
   add_subdirectory(java)
 endif()
 
-# sort out which allocator to use
-if(ALLOCATOR STREQUAL "tcmalloc")
-  set(ALLOC_LIBS gperftools::tcmalloc)
-  add_compile_options($<$<COMPILE_LANGUAGE:CXX>:-fno-builtin-malloc>)
-  add_compile_options($<$<COMPILE_LANGUAGE:CXX>:-fno-builtin-calloc>)
-  add_compile_options($<$<COMPILE_LANGUAGE:CXX>:-fno-builtin-realloc>)
-  add_compile_options($<$<COMPILE_LANGUAGE:CXX>:-fno-builtin-free>)
-elseif(ALLOCATOR STREQUAL "tcmalloc_minimal")
-  set(ALLOC_LIBS gperftools::tcmalloc_minimal)
-  add_compile_options($<$<COMPILE_LANGUAGE:CXX>:-fno-builtin-malloc>)
-  add_compile_options($<$<COMPILE_LANGUAGE:CXX>:-fno-builtin-calloc>)
-  add_compile_options($<$<COMPILE_LANGUAGE:CXX>:-fno-builtin-realloc>)
-  add_compile_options($<$<COMPILE_LANGUAGE:CXX>:-fno-builtin-free>)
-elseif(ALLOCATOR STREQUAL "jemalloc")
-  set(ALLOC_LIBS JeMalloc::JeMalloc)
-  add_compile_options($<$<COMPILE_LANGUAGE:CXX>:-fno-builtin-malloc>)
-  add_compile_options($<$<COMPILE_LANGUAGE:CXX>:-fno-builtin-calloc>)
-  add_compile_options($<$<COMPILE_LANGUAGE:CXX>:-fno-builtin-realloc>)
-  add_compile_options($<$<COMPILE_LANGUAGE:CXX>:-fno-builtin-free>)
-endif()
-
 if (WITH_BLKIN)
   add_subdirectory(blkin/blkin-lib)
 endif(WITH_BLKIN)
 if (WITH_BLKIN)
   add_subdirectory(blkin/blkin-lib)
 endif(WITH_BLKIN)
@@ -627,8 +606,10 @@ add_executable(ceph-mon ${ceph_mon_srcs}
   $<TARGET_OBJECTS:common_texttable_obj>)
 add_dependencies(ceph-mon erasure_code_plugins)
 target_link_libraries(ceph-mon mon os global-static ceph-common
   $<TARGET_OBJECTS:common_texttable_obj>)
 add_dependencies(ceph-mon erasure_code_plugins)
 target_link_libraries(ceph-mon mon os global-static ceph-common
+  ${ALLOC_LIBS}
   ${EXTRALIBS}
   ${EXTRALIBS}
-  ${CMAKE_DL_LIBS} ${GSSAPI_LIBRARIES})
+  ${CMAKE_DL_LIBS}
+  ${GSSAPI_LIBRARIES})
 install(TARGETS ceph-mon DESTINATION bin)
 
 # OSD/ObjectStore
 install(TARGETS ceph-mon DESTINATION bin)
 
 # OSD/ObjectStore
@@ -656,6 +637,7 @@ set(ceph_osd_srcs
 add_executable(ceph-osd ${ceph_osd_srcs})
 add_dependencies(ceph-osd erasure_code_plugins)
 target_link_libraries(ceph-osd osd os global-static common
 add_executable(ceph-osd ${ceph_osd_srcs})
 add_dependencies(ceph-osd erasure_code_plugins)
 target_link_libraries(ceph-osd osd os global-static common
+  ${ALLOC_LIBS}
   ${BLKID_LIBRARIES})
 if(WITH_FUSE)
   target_link_libraries(ceph-osd FUSE::FUSE)
   ${BLKID_LIBRARIES})
 if(WITH_FUSE)
   target_link_libraries(ceph-osd FUSE::FUSE)
@@ -673,7 +655,8 @@ if (WITH_CEPHFS)
     ceph_mds.cc)
   add_executable(ceph-mds ${ceph_mds_srcs})
   target_link_libraries(ceph-mds mds ${CMAKE_DL_LIBS} global-static ceph-common
     ceph_mds.cc)
   add_executable(ceph-mds ${ceph_mds_srcs})
   target_link_libraries(ceph-mds mds ${CMAKE_DL_LIBS} global-static ceph-common
-    Boost::thread)
+    Boost::thread
+    ${ALLOC_LIBS})
   install(TARGETS ceph-mds DESTINATION bin)
 endif()
 
   install(TARGETS ceph-mds DESTINATION bin)
 endif()
 
index 845f56c9bd662424e39bdf952846308994c244ec..5521c8d3fcf0e719796846876205fcb73e6c9468 100644 (file)
@@ -34,14 +34,16 @@ enum {
 struct EntityAuth {
   CryptoKey key;
   std::map<std::string, ceph::buffer::list> caps;
 struct EntityAuth {
   CryptoKey key;
   std::map<std::string, ceph::buffer::list> caps;
+  CryptoKey pending_key; ///< new but uncommitted key
 
   void encode(ceph::buffer::list& bl) const {
 
   void encode(ceph::buffer::list& bl) const {
-    __u8 struct_v = 2;
+    __u8 struct_v = 3;
     using ceph::encode;
     encode(struct_v, bl);
     encode((uint64_t)CEPH_AUTH_UID_DEFAULT, bl);
     encode(key, bl);
     encode(caps, bl);
     using ceph::encode;
     encode(struct_v, bl);
     encode((uint64_t)CEPH_AUTH_UID_DEFAULT, bl);
     encode(key, bl);
     encode(caps, bl);
+    encode(pending_key, bl);
   }
   void decode(ceph::buffer::list::const_iterator& bl) {
     using ceph::decode;
   }
   void decode(ceph::buffer::list::const_iterator& bl) {
     using ceph::decode;
@@ -53,12 +55,21 @@ struct EntityAuth {
     }
     decode(key, bl);
     decode(caps, bl);
     }
     decode(key, bl);
     decode(caps, bl);
+    if (struct_v >= 3) {
+      decode(pending_key, bl);
+    }
   }
 };
 WRITE_CLASS_ENCODER(EntityAuth)
 
   }
 };
 WRITE_CLASS_ENCODER(EntityAuth)
 
-inline std::ostream& operator<<(std::ostream& out, const EntityAuth& a) {
-  return out << "auth(key=" << a.key << ")";
+inline std::ostream& operator<<(std::ostream& out, const EntityAuth& a)
+{
+  out << "auth(key=" << a.key;
+  if (!a.pending_key.empty()) {
+    out << " pending_key=" << a.pending_key;
+  }
+  out << ")";
+  return out;
 }
 
 struct AuthCapsInfo {
 }
 
 struct AuthCapsInfo {
index 3691d97feee0f80c8ac37add93e960003da3e65f..a29ac1abd8116fd2dcb940acba39f4c64036c97d 100644 (file)
@@ -112,6 +112,10 @@ public:
   void encode(ceph::buffer::list& bl) const;
   void decode(ceph::buffer::list::const_iterator& bl);
 
   void encode(ceph::buffer::list& bl) const;
   void decode(ceph::buffer::list::const_iterator& bl);
 
+  void clear() {
+    *this = CryptoKey();
+  }
+
   int get_type() const { return type; }
   utime_t get_created() const { return created; }
   void print(std::ostream& out) const;
   int get_type() const { return type; }
   utime_t get_created() const { return created; }
   void print(std::ostream& out) const;
index 0b28ff6106393fc8493759f6ece37f60e157cc55..eca429d0bd0489fcef351dd71eb2259f3ae2e217 100644 (file)
@@ -19,6 +19,7 @@
 #include <algorithm>
 #include <boost/algorithm/string/replace.hpp>
 #include "auth/KeyRing.h"
 #include <algorithm>
 #include <boost/algorithm/string/replace.hpp>
 #include "auth/KeyRing.h"
+#include "include/stringify.h"
 #include "common/ceph_context.h"
 #include "common/config.h"
 #include "common/debug.h"
 #include "common/ceph_context.h"
 #include "common/config.h"
 #include "common/debug.h"
@@ -136,24 +137,19 @@ void KeyRing::encode_plaintext(bufferlist& bl)
 void KeyRing::encode_formatted(string label, Formatter *f, bufferlist& bl)
 {
   f->open_array_section(label.c_str());
 void KeyRing::encode_formatted(string label, Formatter *f, bufferlist& bl)
 {
   f->open_array_section(label.c_str());
-  for (map<EntityName, EntityAuth>::iterator p = keys.begin();
-       p != keys.end();
-       ++p) {
-
+  for (const auto &[ename, eauth] : keys) {
     f->open_object_section("auth_entities");
     f->open_object_section("auth_entities");
-    f->dump_string("entity", p->first.to_str().c_str());
-    std::ostringstream keyss;
-    keyss << p->second.key;
-    f->dump_string("key", keyss.str());
+    f->dump_string("entity", ename.to_str().c_str());
+    f->dump_string("key", stringify(eauth.key));
+    if (!eauth.pending_key.empty()) {
+      f->dump_string("pending_key", stringify(eauth.pending_key));
+    }
     f->open_object_section("caps");
     f->open_object_section("caps");
-    for (map<string, bufferlist>::iterator q = p->second.caps.begin();
-        q != p->second.caps.end();
-        ++q) {
-      auto dataiter = q->second.cbegin();
+    for (auto& [sys, capsbl] : eauth.caps) {
+      auto dataiter = capsbl.cbegin();
       string caps;
       string caps;
-      using ceph::decode;
-      decode(caps, dataiter);
-      f->dump_string(q->first.c_str(), caps);
+      ceph::decode(caps, dataiter);
+      f->dump_string(sys.c_str(), caps);
     }
     f->close_section();        /* caps */
     f->close_section();        /* auth_entities */
     }
     f->close_section();        /* caps */
     f->close_section();        /* auth_entities */
@@ -229,21 +225,19 @@ int KeyRing::load(CephContext *cct, const std::string &filename)
 
 void KeyRing::print(ostream& out)
 {
 
 void KeyRing::print(ostream& out)
 {
-  for (map<EntityName, EntityAuth>::iterator p = keys.begin();
-       p != keys.end();
-       ++p) {
-    out << "[" << p->first << "]" << std::endl;
-    out << "\tkey = " << p->second.key << std::endl;
+  for (auto& [ename, eauth] : keys) {
+    out << "[" << ename << "]" << std::endl;
+    out << "\tkey = " << eauth.key << std::endl;
+    if (!eauth.pending_key.empty()) {
+      out << "\tpending key = " << eauth.pending_key << std::endl;
+    }
 
 
-    for (map<string, bufferlist>::iterator q = p->second.caps.begin();
-        q != p->second.caps.end();
-        ++q) {
-      auto dataiter = q->second.cbegin();
+    for (auto& [sys, capbl] : eauth.caps) {
+      auto dataiter = capbl.cbegin();
       string caps;
       string caps;
-      using ceph::decode;
-      decode(caps, dataiter);
+      ceph::decode(caps, dataiter);
       boost::replace_all(caps, "\"", "\\\"");
       boost::replace_all(caps, "\"", "\\\"");
-      out << "\tcaps " << q->first << " = \"" << caps << '"' << std::endl;
+      out << "\tcaps " << sys << " = \"" << caps << '"' << std::endl;
     }
   }
 }
     }
   }
 }
index ed15af4eccec3f85d23f2087bdfd5c1210ccf575..c0fa28615ae192a39f5c82dc407f22a4460451f7 100644 (file)
@@ -72,14 +72,20 @@ public:
   }
 
   // modifiers
   }
 
   // modifiers
-  void add(const EntityName& name, EntityAuth &a) {
+  void add(const EntityName& name, const EntityAuth &a) {
     keys[name] = a;
   }
     keys[name] = a;
   }
-  void add(const EntityName& name, CryptoKey &k) {
+  void add(const EntityName& name, const CryptoKey &k) {
     EntityAuth a;
     a.key = k;
     keys[name] = a;
   }
     EntityAuth a;
     a.key = k;
     keys[name] = a;
   }
+  void add(const EntityName& name, const CryptoKey &k, const CryptoKey &pk) {
+    EntityAuth a;
+    a.key = k;
+    a.pending_key = pk;
+    keys[name] = a;
+  }
   void remove(const EntityName& name) {
     keys.erase(name);
   }
   void remove(const EntityName& name) {
     keys.erase(name);
   }
index 86ccc1ca2fbb78e8c3da6da5f4597df742326ba4..236ac451add9ab72ea769c3d22da3f914c5b9245 100644 (file)
@@ -122,7 +122,7 @@ bool KeyServerData::get_caps(CephContext *cct, const EntityName& name,
   ldout(cct, 10) << "get_caps: name=" << name.to_str() << dendl;
   auto iter = secrets.find(name);
   if (iter != secrets.end()) {
   ldout(cct, 10) << "get_caps: name=" << name.to_str() << dendl;
   auto iter = secrets.find(name);
   if (iter != secrets.end()) {
-    ldout(cct, 10) << "get_secret: num of caps=" << iter->second.caps.size() << dendl;
+    ldout(cct, 10) << "get_caps: num of caps=" << iter->second.caps.size() << dendl;
     auto capsiter = iter->second.caps.find(type);
     if (capsiter != iter->second.caps.end()) {
       caps_info.caps = capsiter->second;
     auto capsiter = iter->second.caps.find(type);
     if (capsiter != iter->second.caps.end()) {
       caps_info.caps = capsiter->second;
@@ -148,7 +148,6 @@ KeyServer::KeyServer(CephContext *cct_, KeyRing *extra_secrets)
 int KeyServer::start_server()
 {
   std::scoped_lock l{lock};
 int KeyServer::start_server()
 {
   std::scoped_lock l{lock};
-
   _dump_rotating_secrets();
   return 0;
 }
   _dump_rotating_secrets();
   return 0;
 }
@@ -238,6 +237,26 @@ bool KeyServer::get_service_secret(uint32_t service_id,
   return data.get_service_secret(cct, service_id, secret_id, secret);
 }
 
   return data.get_service_secret(cct, service_id, secret_id, secret);
 }
 
+void KeyServer::note_used_pending_key(const EntityName& name, const CryptoKey& key)
+{
+  std::scoped_lock l(lock);
+  used_pending_keys[name] = key;
+}
+
+void KeyServer::clear_used_pending_keys()
+{
+  std::scoped_lock l(lock);
+  used_pending_keys.clear();
+}
+
+std::map<EntityName,CryptoKey> KeyServer::get_used_pending_keys()
+{
+  std::map<EntityName,CryptoKey> ret;
+  std::scoped_lock l(lock);
+  ret.swap(used_pending_keys);
+  return ret;
+}
+
 bool KeyServer::generate_secret(CryptoKey& secret)
 {
   bufferptr bp;
 bool KeyServer::generate_secret(CryptoKey& secret)
 {
   bufferptr bp;
index 945a7f4dcd8979f64643e6924173c22104c5d687..64915c8ce4aaca2724b7dad027276db0c85cf651 100644 (file)
@@ -193,6 +193,7 @@ WRITE_CLASS_ENCODER(KeyServerData::Incremental)
 class KeyServer : public KeyStore {
   CephContext *cct;
   KeyServerData data;
 class KeyServer : public KeyStore {
   CephContext *cct;
   KeyServerData data;
+  std::map<EntityName, CryptoKey> used_pending_keys;
   mutable ceph::mutex lock;
 
   int _rotate_secret(uint32_t service_id, KeyServerData &pending_data);
   mutable ceph::mutex lock;
 
   int _rotate_secret(uint32_t service_id, KeyServerData &pending_data);
@@ -211,6 +212,11 @@ public:
   bool get_auth(const EntityName& name, EntityAuth& auth) const;
   bool get_caps(const EntityName& name, const std::string& type, AuthCapsInfo& caps) const;
   bool get_active_rotating_secret(const EntityName& name, CryptoKey& secret) const;
   bool get_auth(const EntityName& name, EntityAuth& auth) const;
   bool get_caps(const EntityName& name, const std::string& type, AuthCapsInfo& caps) const;
   bool get_active_rotating_secret(const EntityName& name, CryptoKey& secret) const;
+
+  void note_used_pending_key(const EntityName& name, const CryptoKey& key);
+  void clear_used_pending_keys();
+  std::map<EntityName,CryptoKey> get_used_pending_keys();
+
   int start_server();
   void rotate_timeout(double timeout);
 
   int start_server();
   void rotate_timeout(double timeout);
 
index a7c67757c5825136bfc4fe0abf3c0e2cc214a7eb..977a43ad64f293483f52fc80cf0bb3067119c431 100644 (file)
@@ -170,8 +170,8 @@ int CephxServiceHandler::handle_request(
        break;
       }
 
        break;
       }
 
-      CryptoKey secret;
-      if (!key_server->get_secret(entity_name, secret)) {
+      EntityAuth eauth;
+      if (!key_server->get_auth(entity_name, eauth)) {
         ldout(cct, 0) << "couldn't find entity name: " << entity_name << dendl;
        ret = -EACCES;
        break;
         ldout(cct, 0) << "couldn't find entity name: " << entity_name << dendl;
        ret = -EACCES;
        break;
@@ -183,9 +183,25 @@ int CephxServiceHandler::handle_request(
       }      
 
       uint64_t expected_key;
       }      
 
       uint64_t expected_key;
+      CryptoKey *used_key = &eauth.key;
       std::string error;
       std::string error;
-      cephx_calc_client_server_challenge(cct, secret, server_challenge,
+      cephx_calc_client_server_challenge(cct, eauth.key, server_challenge,
                                         req.client_challenge, &expected_key, error);
                                         req.client_challenge, &expected_key, error);
+      if ((!error.empty() || req.key != expected_key) &&
+         !eauth.pending_key.empty()) {
+       ldout(cct, 10) << "normal key failed for " << entity_name
+                      << ", trying pending_key" << dendl;
+       // try pending_key instead
+       error.clear();
+       cephx_calc_client_server_challenge(cct, eauth.pending_key,
+                                          server_challenge,
+                                          req.client_challenge, &expected_key,
+                                          error);
+       if (error.empty()) {
+         used_key = &eauth.pending_key;
+         key_server->note_used_pending_key(entity_name, eauth.pending_key);
+       }
+      }
       if (!error.empty()) {
        ldout(cct, 0) << " cephx_calc_client_server_challenge error: " << error << dendl;
        ret = -EACCES;
       if (!error.empty()) {
        ldout(cct, 0) << " cephx_calc_client_server_challenge error: " << error << dendl;
        ret = -EACCES;
@@ -205,12 +221,6 @@ int CephxServiceHandler::handle_request(
       CephXSessionAuthInfo info;
       bool should_enc_ticket = false;
 
       CephXSessionAuthInfo info;
       bool should_enc_ticket = false;
 
-      EntityAuth eauth;
-      if (! key_server->get_auth(entity_name, eauth)) {
-       ret = -EACCES;
-       break;
-      }
-
       CephXServiceTicketInfo old_ticket_info;
       ret = verify_old_ticket(req, old_ticket_info, should_enc_ticket);
       if (ret) {
       CephXServiceTicketInfo old_ticket_info;
       ret = verify_old_ticket(req, old_ticket_info, should_enc_ticket);
       if (ret) {
@@ -245,7 +255,7 @@ int CephxServiceHandler::handle_request(
 
       build_cephx_response_header(cephx_header.request_type, 0, *result_bl);
       if (!cephx_build_service_ticket_reply(
 
       build_cephx_response_header(cephx_header.request_type, 0, *result_bl);
       if (!cephx_build_service_ticket_reply(
-           cct, eauth.key, info_vec, should_enc_ticket,
+           cct, *used_key, info_vec, should_enc_ticket,
            old_ticket_info.session_key, *result_bl)) {
        ret = -EIO;
        break;
            old_ticket_info.session_key, *result_bl)) {
        ret = -EIO;
        break;
index ae0e4f516464fd4d63a96d497cfe3d7545f89eda..0e02837fadd4dde8abd66985b485836402e10a37 100755 (executable)
@@ -3,8 +3,10 @@
 # vim: ts=4 sw=4 smarttab expandtab
 
 import argparse
 # vim: ts=4 sw=4 smarttab expandtab
 
 import argparse
+import grp
 import logging
 import os
 import logging
 import os
+import pwd
 import signal
 import socket
 import subprocess
 import signal
 import socket
 import subprocess
@@ -18,6 +20,7 @@ auth_names = ['client.crash.%s' % socket.gethostname(),
               'client.crash',
               'client.admin']
 
               'client.crash',
               'client.admin']
 
+
 def parse_args():
     parser = argparse.ArgumentParser()
     parser.add_argument(
 def parse_args():
     parser = argparse.ArgumentParser()
     parser.add_argument(
@@ -29,7 +32,8 @@ def parse_args():
     )
     parser.add_argument(
         '--name', '-n',
     )
     parser.add_argument(
         '--name', '-n',
-        help='ceph name to authenticate as (default: try client.crash, client.admin)')
+        help='ceph name to authenticate as '
+             '(default: try client.crash, client.admin)')
     parser.add_argument(
         '--log-level', '-l',
         help='log level output (default: INFO), support INFO or DEBUG')
     parser.add_argument(
         '--log-level', '-l',
         help='log level output (default: INFO), support INFO or DEBUG')
@@ -48,7 +52,8 @@ def post_crash(path):
             stderr=subprocess.PIPE,
         )
         f = open(os.path.join(path, 'meta'), 'rb')
             stderr=subprocess.PIPE,
         )
         f = open(os.path.join(path, 'meta'), 'rb')
-        stderr = pr.communicate(input=f.read())
+        (_, stderr) = pr.communicate(input=f.read())
+        stderr = stderr.decode()
         rc = pr.wait()
         f.close()
         if rc != 0 or stderr != "":
         rc = pr.wait()
         f.close()
         if rc != 0 or stderr != "":
@@ -61,6 +66,9 @@ def post_crash(path):
 def scrape_path(path):
     for p in os.listdir(path):
         crashpath = os.path.join(path, p)
 def scrape_path(path):
     for p in os.listdir(path):
         crashpath = os.path.join(path, p)
+        if not os.access(crashpath, os.R_OK):
+            log.warning('unable to read crash path %s' % (crashpath))
+            continue
         metapath = os.path.join(crashpath, 'meta')
         donepath = os.path.join(crashpath, 'done')
         if os.path.isfile(metapath):
         metapath = os.path.join(crashpath, 'meta')
         donepath = os.path.join(crashpath, 'done')
         if os.path.isfile(metapath):
@@ -79,12 +87,31 @@ def scrape_path(path):
                     (metapath, p, os.path.join('posted/', p))
                 )
 
                     (metapath, p, os.path.join('posted/', p))
                 )
 
-def handler(signum):
+
+def handler(signum, frame):
     print('*** Interrupted with signal %d ***' % signum)
     sys.exit(0)
 
     print('*** Interrupted with signal %d ***' % signum)
     sys.exit(0)
 
+
+def drop_privs():
+    if os.getuid() == 0:
+        try:
+            ceph_uid = pwd.getpwnam("ceph").pw_uid
+            ceph_gid = grp.getgrnam("ceph").gr_gid
+            os.setgroups([])
+            os.setgid(ceph_gid)
+            os.setuid(ceph_uid)
+        except Exception as e:
+            log.error(f"Unable to drop privileges: {e}")
+            sys.exit(1)
+
+
 def main():
     global auth_names
 def main():
     global auth_names
+
+    # run as unprivileged ceph user
+    drop_privs()
+
     # exit code 0 on SIGINT, SIGTERM
     signal.signal(signal.SIGINT, handler)
     signal.signal(signal.SIGTERM, handler)
     # exit code 0 on SIGINT, SIGTERM
     signal.signal(signal.SIGINT, handler)
     signal.signal(signal.SIGTERM, handler)
@@ -101,9 +128,16 @@ def main():
         log.error("directory %s does not exist; please create" % postdir)
         time.sleep(30)
 
         log.error("directory %s does not exist; please create" % postdir)
         time.sleep(30)
 
+    log.info("pinging cluster to exercise our key")
+    pr = subprocess.Popen(args=['timeout', '30', 'ceph', '-s'])
+    pr.wait()
+
     log.info("monitoring path %s, delay %ds" % (args.path, args.delay * 60.0))
     while True:
     log.info("monitoring path %s, delay %ds" % (args.path, args.delay * 60.0))
     while True:
-        scrape_path(args.path)
+        try:
+            scrape_path(args.path)
+        except Exception as e:
+            log.error(f"Error scraping {args.path}: {e}")
         if args.delay == 0:
             sys.exit(0)
         time.sleep(args.delay * 60)
         if args.delay == 0:
             sys.exit(0)
         time.sleep(args.delay * 60)
index b23466b7aa3cc53f315685e2059295cdad73ec65..5277102da9b26c4b73d654756890e2cb30787ac8 100644 (file)
@@ -794,7 +794,7 @@ def get_all_devices_vgs(name_prefix=''):
         verbose_on_failure=False
     )
     vgs = _output_parser(stdout, vg_fields)
         verbose_on_failure=False
     )
     vgs = _output_parser(stdout, vg_fields)
-    return [VolumeGroup(**vg) for vg in vgs]
+    return [VolumeGroup(**vg) for vg in vgs if vg['vg_name']]
 
 #################################
 #
 
 #################################
 #
index 508d1b4c6cd0211ff358c2372f694b3a18373308..45dd7e7335f9a24ed8e8ec84d5a033eb1f84d8eb 100644 (file)
@@ -4,7 +4,7 @@ skipsdist = True
 
 [testenv]
 deps = mock
 
 [testenv]
 deps = mock
-whitelist_externals =
+allowlist_externals =
     vagrant
     bash
     git
     vagrant
     bash
     git
index aca1f40a652c6b3dd8d5dd1c9b2599d2b554693c..a9b6aa2677849d8b7c0872ae58dbf24730386137 100644 (file)
       environment:
         CEPH_VOLUME_DEBUG: 1
 
       environment:
         CEPH_VOLUME_DEBUG: 1
 
-    # osd.0 journal device (zap without --destroy that removes the LV)
+    # osd.0 journal device
     - name: zap /dev/vdc1
     - name: zap /dev/vdc1
-      command: "ceph-volume --cluster {{ cluster }} lvm zap /dev/vdc1"
+      command: "ceph-volume --cluster {{ cluster }} lvm zap --destroy /dev/vdc1"
       environment:
         CEPH_VOLUME_DEBUG: 1
 
       environment:
         CEPH_VOLUME_DEBUG: 1
 
+    - name: re-create partition /dev/vdc1
+      parted:
+        device: /dev/vdc
+        number: 1
+        part_start: 0%
+        part_end: 50%
+        unit: '%'
+        state: present
+        label: gpt
+
     - name: prepare osd.0 again using test_group/data-lv1
       command: "ceph-volume --cluster {{ cluster }} lvm prepare --filestore --data test_group/data-lv1 --journal /dev/vdc1 --osd-id 0"
       environment:
     - name: prepare osd.0 again using test_group/data-lv1
       command: "ceph-volume --cluster {{ cluster }} lvm prepare --filestore --data test_group/data-lv1 --journal /dev/vdc1 --osd-id 0"
       environment:
index bec30e6d7cb4f6ec92333cbcf424960ef17bcf33..0a01a79e62206c4c8bd426999d1d8fe2280c70fe 100644 (file)
@@ -4,7 +4,7 @@ skipsdist = True
 
 [testenv]
 deps = mock
 
 [testenv]
 deps = mock
-whitelist_externals =
+allowlist_externals =
     vagrant
     bash
     git
     vagrant
     bash
     git
index 1fdfe26a8768256a17bff6b570e17e0d96faa06d..2d8f8980535d7b4a5173b6ac019b4561205f995e 100644 (file)
@@ -4,7 +4,7 @@ skipsdist = True
 
 [testenv]
 deps = mock
 
 [testenv]
 deps = mock
-whitelist_externals =
+allowlist_externals =
     vagrant
     bash
     git
     vagrant
     bash
     git
index d2459e1208674d6b49e63348b29138f4350d315e..544848a9a391003241f6b9a32fb84ea25559f7f8 100644 (file)
@@ -2,6 +2,7 @@ import logging
 import os
 import re
 import stat
 import os
 import re
 import stat
+import time
 from ceph_volume import process
 from ceph_volume.api import lvm
 from ceph_volume.util.system import get_file_contents
 from ceph_volume import process
 from ceph_volume.api import lvm
 from ceph_volume.util.system import get_file_contents
@@ -134,8 +135,16 @@ def remove_partition(device):
 
     :param device: A ``Device()`` object
     """
 
     :param device: A ``Device()`` object
     """
-    udev_info = udevadm_property(device.path)
-    partition_number = udev_info.get('ID_PART_ENTRY_NUMBER')
+    # Sometimes there's a race condition that makes 'ID_PART_ENTRY_NUMBER' be not present
+    # in the output of `udevadm info --query=property`.
+    # Probably not ideal and not the best fix but this allows to get around that issue.
+    # The idea is to make it retry multiple times before actually failing.
+    for i in range(10):
+        udev_info = udevadm_property(device.path)
+        partition_number = udev_info.get('ID_PART_ENTRY_NUMBER')
+        if partition_number:
+            break
+        time.sleep(0.2)
     if not partition_number:
         raise RuntimeError('Unable to detect the partition number for device: %s' % device.path)
 
     if not partition_number:
         raise RuntimeError('Unable to detect the partition number for device: %s' % device.path)
 
@@ -229,9 +238,16 @@ def _udevadm_info(device):
 
 
 def lsblk(device, columns=None, abspath=False):
 
 
 def lsblk(device, columns=None, abspath=False):
-    return lsblk_all(device=device,
-                     columns=columns,
-                     abspath=abspath)
+    result = []
+    if not os.path.isdir(device):
+        result = lsblk_all(device=device,
+                           columns=columns,
+                           abspath=abspath)
+    if not result:
+        logger.debug(f"{device} not found is lsblk report")
+        return {}
+
+    return result[0]
 
 def lsblk_all(device='', columns=None, abspath=False):
     """
 
 def lsblk_all(device='', columns=None, abspath=False):
     """
@@ -311,6 +327,9 @@ def lsblk_all(device='', columns=None, abspath=False):
         base_command.append('-p')
     base_command.append('-o')
     base_command.append(','.join(columns))
         base_command.append('-p')
     base_command.append('-o')
     base_command.append(','.join(columns))
+    if device:
+        base_command.append('--nodeps')
+        base_command.append(device)
 
     out, err, rc = process.call(base_command)
 
 
     out, err, rc = process.call(base_command)
 
@@ -322,14 +341,8 @@ def lsblk_all(device='', columns=None, abspath=False):
     for line in out:
         result.append(_lsblk_parser(line))
 
     for line in out:
         result.append(_lsblk_parser(line))
 
-    if not device:
-        return result
-
-    for dev in result:
-        if dev['NAME'] == os.path.basename(device):
-            return dev
+    return result
 
 
-    return {}
 
 def is_device(dev):
     """
 
 def is_device(dev):
     """
index cefd6094bd09eb7d4fcaafbc8e74f4819e4621ac..3310ab78c37f49a5a9144a3696904dc4a2098910 100644 (file)
@@ -234,6 +234,7 @@ def legacy_encrypted(device):
 
     This function assumes that ``device`` will be a partition.
     """
 
     This function assumes that ``device`` will be a partition.
     """
+    disk_meta = {}
     if os.path.isdir(device):
         mounts = system.Mounts(paths=True).get_mounts()
         # yes, rebind the device variable here because a directory isn't going
     if os.path.isdir(device):
         mounts = system.Mounts(paths=True).get_mounts()
         # yes, rebind the device variable here because a directory isn't going
@@ -265,7 +266,8 @@ def legacy_encrypted(device):
     # parent device name for the device so that we can query all of its
     # associated devices and *then* look for one that has the 'lockbox' label
     # on it. Thanks for being awesome ceph-disk
     # parent device name for the device so that we can query all of its
     # associated devices and *then* look for one that has the 'lockbox' label
     # on it. Thanks for being awesome ceph-disk
-    disk_meta = lsblk(device, abspath=True)
+    if not device == 'tmpfs':
+        disk_meta = lsblk(device, abspath=True)
     if not disk_meta:
         return metadata
     parent_device = disk_meta['PKNAME']
     if not disk_meta:
         return metadata
     parent_device = disk_meta['PKNAME']
index e5c390271344bc591bc59fed54dc26e81f35f8fa..2950c8a09db2288f0156c985fb930c37285ce6db 100644 (file)
@@ -4,7 +4,7 @@ skip_missing_interpreters = true
 
 [testenv]
 passenv=*
 
 [testenv]
 passenv=*
-whitelist_externals=
+allowlist_externals=
   bash
   grep
   mktemp
   bash
   grep
   mktemp
index 820cf6fb3475f624919b0cdcbf4f9f7916804113..696d6dcc837aa637b26106d0ce84827741c19d63 100644 (file)
@@ -8,6 +8,8 @@ deps=
   pytest-xdist
   mock
   pyfakefs
   pytest-xdist
   mock
   pyfakefs
+allowlist_externals=
+  ./tox_install_command.sh
 install_command=./tox_install_command.sh {opts} {packages}
 commands=py.test --numprocesses=auto -vv {posargs:ceph_volume/tests} --ignore=ceph_volume/tests/functional
 
 install_command=./tox_install_command.sh {opts} {packages}
 commands=py.test --numprocesses=auto -vv {posargs:ceph_volume/tests} --ignore=ceph_volume/tests/functional
 
index 115856f381cfd9cbfcd0bf7d8cee99b44677fce9..3fa5346b4634d4729ee15894cd7fd101ae6e8ec3 100644 (file)
@@ -198,14 +198,21 @@ int main(int argc, const char **argv, const char *envp[]) {
       ~RemountTest() override {}
       void *entry() override {
 #if defined(__linux__)
       ~RemountTest() override {}
       void *entry() override {
 #if defined(__linux__)
-       int ver = get_linux_version();
-       ceph_assert(ver != 0);
-        bool client_try_dentry_invalidate = g_conf().get_val<bool>(
-          "client_try_dentry_invalidate");
-       bool can_invalidate_dentries =
-          client_try_dentry_invalidate && ver < KERNEL_VERSION(3, 18, 0);
-       auto test_result = client->test_dentry_handling(can_invalidate_dentries);
-       int tr = test_result.first;
+        bool can_invalidate_dentries = g_conf().get_val<bool>(
+         "client_try_dentry_invalidate");
+        uint64_t max_retries = g_conf().get_val<uint64_t>(
+          "client_max_retries_on_remount_failure");
+        std::pair<int, bool> test_result;
+        uint64_t i = 0;
+        int tr = 0;
+        do {
+          test_result = client->test_dentry_handling(can_invalidate_dentries);
+          tr = test_result.first;
+          if (tr) {
+            sleep(1);
+          }
+        } while (++i < max_retries && tr);
+
        bool abort_on_failure = test_result.second;
         bool client_die_on_failed_dentry_invalidate = g_conf().get_val<bool>(
           "client_die_on_failed_dentry_invalidate");
        bool abort_on_failure = test_result.second;
         bool client_die_on_failed_dentry_invalidate = g_conf().get_val<bool>(
           "client_die_on_failed_dentry_invalidate");
index 4410e0dcb567b9a79b8222f792a2566b29ae67d8..ebd110b4254b863c87ab99d8e5d2be34107cf909 100644 (file)
@@ -886,18 +886,12 @@ int main(int argc, const char **argv)
   }
 
   // bind
   }
 
   // bind
-  err = msgr->bindv(bind_addrs);
+  err = msgr->bindv(bind_addrs, public_addrs);
   if (err < 0) {
     derr << "unable to bind monitor to " << bind_addrs << dendl;
     prefork.exit(1);
   }
 
   if (err < 0) {
     derr << "unable to bind monitor to " << bind_addrs << dendl;
     prefork.exit(1);
   }
 
-  // if the public and bind addr are different set the msgr addr
-  // to the public one, now that the bind is complete.
-  if (public_addrs != bind_addrs) {
-    msgr->set_addrs(public_addrs);
-  }
-
   if (g_conf()->daemonize) {
     global_init_postfork_finish(g_ceph_context);
     prefork.daemonize();
   if (g_conf()->daemonize) {
     global_init_postfork_finish(g_ceph_context);
     prefork.daemonize();
index b10c799b4a3bb9263c4ad13dde095ba4a0571df4..1c15dfff5477c0b02a493e179996440ec973fd48 100644 (file)
@@ -605,12 +605,26 @@ flushjournal_out:
 
   ms_objecter->set_default_policy(Messenger::Policy::lossy_client(CEPH_FEATURE_OSDREPLYMUX));
 
 
   ms_objecter->set_default_policy(Messenger::Policy::lossy_client(CEPH_FEATURE_OSDREPLYMUX));
 
-  entity_addrvec_t public_addrs, cluster_addrs;
+  entity_addrvec_t public_addrs, public_bind_addrs, cluster_addrs;
   r = pick_addresses(g_ceph_context, CEPH_PICK_ADDRESS_PUBLIC, &public_addrs,
                     iface_preferred_numa_node);
   if (r < 0) {
     derr << "Failed to pick public address." << dendl;
     forker.exit(1);
   r = pick_addresses(g_ceph_context, CEPH_PICK_ADDRESS_PUBLIC, &public_addrs,
                     iface_preferred_numa_node);
   if (r < 0) {
     derr << "Failed to pick public address." << dendl;
     forker.exit(1);
+  } else {
+    dout(10) << "picked public_addrs " << public_addrs << dendl;
+  }
+  r = pick_addresses(g_ceph_context, CEPH_PICK_ADDRESS_PUBLIC_BIND,
+                    &public_bind_addrs, iface_preferred_numa_node);
+  if (r == -ENOENT) {
+    dout(10) << "there is no public_bind_addrs, defaulting to public_addrs"
+            << dendl;
+    public_bind_addrs = public_addrs;
+  } else if (r < 0) {
+    derr << "Failed to pick public bind address." << dendl;
+    forker.exit(1);
+  } else {
+    dout(10) << "picked public_bind_addrs " << public_bind_addrs << dendl;
   }
   r = pick_addresses(g_ceph_context, CEPH_PICK_ADDRESS_CLUSTER, &cluster_addrs,
                     iface_preferred_numa_node);
   }
   r = pick_addresses(g_ceph_context, CEPH_PICK_ADDRESS_CLUSTER, &cluster_addrs,
                     iface_preferred_numa_node);
@@ -619,8 +633,10 @@ flushjournal_out:
     forker.exit(1);
   }
 
     forker.exit(1);
   }
 
-  if (ms_public->bindv(public_addrs) < 0)
+  if (ms_public->bindv(public_bind_addrs, public_addrs) < 0) {
+    derr << "Failed to bind to " << public_bind_addrs << dendl;
     forker.exit(1);
     forker.exit(1);
+  }
 
   if (ms_cluster->bindv(cluster_addrs) < 0)
     forker.exit(1);
 
   if (ms_cluster->bindv(cluster_addrs) < 0)
     forker.exit(1);
@@ -633,7 +649,7 @@ flushjournal_out:
     ms_hb_front_server->set_socket_priority(SOCKET_PRIORITY_MIN_DELAY);
   }
 
     ms_hb_front_server->set_socket_priority(SOCKET_PRIORITY_MIN_DELAY);
   }
 
-  entity_addrvec_t hb_front_addrs = public_addrs;
+  entity_addrvec_t hb_front_addrs = public_bind_addrs;
   for (auto& a : hb_front_addrs.v) {
     a.set_port(0);
   }
   for (auto& a : hb_front_addrs.v) {
     a.set_port(0);
   }
index 000e9adb88965a7ede1bfb4d8d4dff61e86e1039..6c4dd7fd782957e711963d2be4192f03e9b84949 100755 (executable)
@@ -17,7 +17,7 @@ from util import (
     run_shell_command,
 )
 
     run_shell_command,
 )
 
-CEPH_IMAGE = 'quay.ceph.io/ceph-ci/ceph:master'
+CEPH_IMAGE = 'quay.ceph.io/ceph-ci/ceph:main'
 BOX_IMAGE = 'cephadm-box:latest'
 
 # NOTE: this image tar is a trickeroo so cephadm won't pull the image everytime
 BOX_IMAGE = 'cephadm-box:latest'
 
 # NOTE: this image tar is a trickeroo so cephadm won't pull the image everytime
@@ -112,11 +112,11 @@ class Cluster(Target):
 
         run_shell_command('docker load < /cephadm/box/docker/ceph/image/quay.ceph.image.tar')
         # cephadm guid error because it sometimes tries to use quay.ceph.io/ceph-ci/ceph:<none>
 
         run_shell_command('docker load < /cephadm/box/docker/ceph/image/quay.ceph.image.tar')
         # cephadm guid error because it sometimes tries to use quay.ceph.io/ceph-ci/ceph:<none>
-        # instead of master's tag
+        # instead of main branch's tag
         run_shell_command('export CEPH_SOURCE_FOLDER=/ceph')
         run_shell_command('export CEPH_SOURCE_FOLDER=/ceph')
-        run_shell_command('export CEPHADM_IMAGE=quay.ceph.io/ceph-ci/ceph:master')
+        run_shell_command('export CEPHADM_IMAGE=quay.ceph.io/ceph-ci/ceph:main')
         run_shell_command(
         run_shell_command(
-            'echo "export CEPHADM_IMAGE=quay.ceph.io/ceph-ci/ceph:master" >> ~/.bashrc'
+            'echo "export CEPHADM_IMAGE=quay.ceph.io/ceph-ci/ceph:main" >> ~/.bashrc'
         )
 
         extra_args = []
         )
 
         extra_args = []
index ed5a48d87968689a43d65c90a13bcb67932e1d69..dbe2e639b661455d16e4dcd0a1bb5695d64d2876 100755 (executable)
@@ -26,7 +26,7 @@ import errno
 import struct
 import ssl
 from enum import Enum
 import struct
 import ssl
 from enum import Enum
-from typing import Dict, List, Tuple, Optional, Union, Any, NoReturn, Callable, IO, Sequence, TypeVar, cast, Set, Iterable
+from typing import Dict, List, Tuple, Optional, Union, Any, NoReturn, Callable, IO, Sequence, TypeVar, cast, Set, Iterable, TextIO
 
 import re
 import uuid
 
 import re
 import uuid
@@ -78,6 +78,7 @@ DATA_DIR_MODE = 0o700
 CONTAINER_INIT = True
 MIN_PODMAN_VERSION = (2, 0, 2)
 CGROUPS_SPLIT_PODMAN_VERSION = (2, 1, 0)
 CONTAINER_INIT = True
 MIN_PODMAN_VERSION = (2, 0, 2)
 CGROUPS_SPLIT_PODMAN_VERSION = (2, 1, 0)
+PIDS_LIMIT_UNLIMITED_PODMAN_VERSION = (3, 4, 1)
 CUSTOM_PS1 = r'[ceph: \u@\h \W]\$ '
 DEFAULT_TIMEOUT = None  # in seconds
 DEFAULT_RETRY = 15
 CUSTOM_PS1 = r'[ceph: \u@\h \W]\$ '
 DEFAULT_TIMEOUT = None  # in seconds
 DEFAULT_RETRY = 15
@@ -371,7 +372,8 @@ class UnauthorizedRegistryError(Error):
 
 class Ceph(object):
     daemons = ('mon', 'mgr', 'osd', 'mds', 'rgw', 'rbd-mirror',
 
 class Ceph(object):
     daemons = ('mon', 'mgr', 'osd', 'mds', 'rgw', 'rbd-mirror',
-               'crash', 'cephfs-mirror')
+               'crash', 'cephfs-mirror', 'ceph-exporter')
+    gateways = ('iscsi', 'nfs')
 
 ##################################
 
 
 ##################################
 
@@ -627,10 +629,11 @@ class Monitoring(object):
         cmd = daemon_type.replace('-', '_')
         code = -1
         err = ''
         cmd = daemon_type.replace('-', '_')
         code = -1
         err = ''
+        out = ''
         version = ''
         if daemon_type == 'alertmanager':
             for cmd in ['alertmanager', 'prometheus-alertmanager']:
         version = ''
         if daemon_type == 'alertmanager':
             for cmd in ['alertmanager', 'prometheus-alertmanager']:
-                _, err, code = call(ctx, [
+                out, err, code = call(ctx, [
                     ctx.container_engine.path, 'exec', container_id, cmd,
                     '--version'
                 ], verbosity=CallVerbosity.QUIET)
                     ctx.container_engine.path, 'exec', container_id, cmd,
                     '--version'
                 ], verbosity=CallVerbosity.QUIET)
@@ -638,12 +641,14 @@ class Monitoring(object):
                     break
             cmd = 'alertmanager'  # reset cmd for version extraction
         else:
                     break
             cmd = 'alertmanager'  # reset cmd for version extraction
         else:
-            _, err, code = call(ctx, [
+            out, err, code = call(ctx, [
                 ctx.container_engine.path, 'exec', container_id, cmd, '--version'
             ], verbosity=CallVerbosity.QUIET)
                 ctx.container_engine.path, 'exec', container_id, cmd, '--version'
             ], verbosity=CallVerbosity.QUIET)
-        if code == 0 and \
-                err.startswith('%s, version ' % cmd):
-            version = err.split(' ')[2]
+        if code == 0:
+            if err.startswith('%s, version ' % cmd):
+                version = err.split(' ')[2]
+            elif out.startswith('%s, version ' % cmd):
+                version = out.split(' ')[2]
         return version
 
 ##################################
         return version
 
 ##################################
@@ -927,11 +932,70 @@ class CephIscsi(object):
         # remove extra container args for tcmu container.
         # extra args could cause issue with forking service type
         tcmu_container.container_args = []
         # remove extra container args for tcmu container.
         # extra args could cause issue with forking service type
         tcmu_container.container_args = []
+        set_pids_limit_unlimited(self.ctx, tcmu_container.container_args)
         return tcmu_container
 
 ##################################
 
 
         return tcmu_container
 
 ##################################
 
 
+class CephExporter(object):
+    """Defines a Ceph exporter container"""
+
+    daemon_type = 'ceph-exporter'
+    entrypoint = '/usr/bin/ceph-exporter'
+    DEFAULT_PORT = 9926
+    port_map = {
+        'ceph-exporter': DEFAULT_PORT,
+    }
+
+    def __init__(self,
+                 ctx: CephadmContext,
+                 fsid: str, daemon_id: Union[int, str],
+                 config_json: Dict[str, Any],
+                 image: str = DEFAULT_IMAGE) -> None:
+        self.ctx = ctx
+        self.fsid = fsid
+        self.daemon_id = daemon_id
+        self.image = image
+
+        self.sock_dir = config_json.get('sock-dir', '/var/run/ceph/')
+        self.addrs = config_json.get('addrs', socket.gethostbyname(socket.gethostname()))
+        self.port = config_json.get('port', self.DEFAULT_PORT)
+        self.prio_limit = config_json.get('prio-limit', 5)
+        self.stats_period = config_json.get('stats-period', 5)
+
+        self.validate()
+
+    @classmethod
+    def init(cls, ctx: CephadmContext, fsid: str,
+             daemon_id: Union[int, str]) -> 'CephExporter':
+        return cls(ctx, fsid, daemon_id,
+                   get_parm(ctx.config_json), ctx.image)
+
+    @staticmethod
+    def get_container_mounts() -> Dict[str, str]:
+        mounts = dict()
+        mounts['/var/run/ceph'] = '/var/run/ceph:z'
+        return mounts
+
+    def get_daemon_args(self) -> List[str]:
+        args = [
+            f'--sock-dir={self.sock_dir}',
+            f'--addrs={self.addrs}',
+            f'--port={self.port}',
+            f'--prio-limit={self.prio_limit}',
+            f'--stats-period={self.stats_period}',
+        ]
+        return args
+
+    def validate(self) -> None:
+        if not os.path.isdir(self.sock_dir):
+            raise Error(f'Directory does not exist. Got: {self.sock_dir}')
+
+
+##################################
+
+
 class HAproxy(object):
     """Defines an HAproxy container"""
     daemon_type = 'haproxy'
 class HAproxy(object):
     """Defines an HAproxy container"""
     daemon_type = 'haproxy'
@@ -1012,8 +1076,9 @@ class HAproxy(object):
     @staticmethod
     def get_sysctl_settings() -> List[str]:
         return [
     @staticmethod
     def get_sysctl_settings() -> List[str]:
         return [
-            '# IP forwarding',
+            '# IP forwarding and non-local bind',
             'net.ipv4.ip_forward = 1',
             'net.ipv4.ip_forward = 1',
+            'net.ipv4.ip_nonlocal_bind = 1',
         ]
 
 ##################################
         ]
 
 ##################################
@@ -1929,6 +1994,11 @@ def get_hostname():
     return socket.gethostname()
 
 
     return socket.gethostname()
 
 
+def get_short_hostname():
+    # type: () -> str
+    return get_hostname().split('.', 1)[0]
+
+
 def get_fqdn():
     # type: () -> str
     return socket.getfqdn() or socket.gethostname()
 def get_fqdn():
     # type: () -> str
     return socket.getfqdn() or socket.gethostname()
@@ -1941,8 +2011,8 @@ def get_arch():
 
 def generate_service_id():
     # type: () -> str
 
 def generate_service_id():
     # type: () -> str
-    return get_hostname() + '.' + ''.join(random.choice(string.ascii_lowercase)
-                                          for _ in range(6))
+    return get_short_hostname() + '.' + ''.join(random.choice(string.ascii_lowercase)
+                                                for _ in range(6))
 
 
 def generate_password():
 
 
 def generate_password():
@@ -2551,7 +2621,7 @@ def get_daemon_args(ctx, fsid, daemon_type, daemon_id):
     # type: (CephadmContext, str, str, Union[int, str]) -> List[str]
     r = list()  # type: List[str]
 
     # type: (CephadmContext, str, str, Union[int, str]) -> List[str]
     r = list()  # type: List[str]
 
-    if daemon_type in Ceph.daemons and daemon_type != 'crash':
+    if daemon_type in Ceph.daemons and daemon_type not in ['crash', 'ceph-exporter']:
         r += [
             '--setuser', 'ceph',
             '--setgroup', 'ceph',
         r += [
             '--setuser', 'ceph',
             '--setgroup', 'ceph',
@@ -2594,6 +2664,11 @@ def get_daemon_args(ctx, fsid, daemon_type, daemon_id):
                     port = meta['ports'][0]
             r += [f'--web.listen-address={ip}:{port}']
             if daemon_type == 'prometheus':
                     port = meta['ports'][0]
             r += [f'--web.listen-address={ip}:{port}']
             if daemon_type == 'prometheus':
+                config = get_parm(ctx.config_json)
+                retention_time = config.get('retention_time', '15d')
+                retention_size = config.get('retention_size', '0')  # default to disabled
+                r += [f'--storage.tsdb.retention.time={retention_time}']
+                r += [f'--storage.tsdb.retention.size={retention_size}']
                 scheme = 'http'
                 host = get_fqdn()
                 r += [f'--web.external-url={scheme}://{host}:{port}']
                 scheme = 'http'
                 host = get_fqdn()
                 r += [f'--web.external-url={scheme}://{host}:{port}']
@@ -2613,6 +2688,9 @@ def get_daemon_args(ctx, fsid, daemon_type, daemon_id):
     elif daemon_type == NFSGanesha.daemon_type:
         nfs_ganesha = NFSGanesha.init(ctx, fsid, daemon_id)
         r += nfs_ganesha.get_daemon_args()
     elif daemon_type == NFSGanesha.daemon_type:
         nfs_ganesha = NFSGanesha.init(ctx, fsid, daemon_id)
         r += nfs_ganesha.get_daemon_args()
+    elif daemon_type == CephExporter.daemon_type:
+        ceph_exporter = CephExporter.init(ctx, fsid, daemon_id)
+        r.extend(ceph_exporter.get_daemon_args())
     elif daemon_type == HAproxy.daemon_type:
         haproxy = HAproxy.init(ctx, fsid, daemon_id)
         r += haproxy.get_daemon_args()
     elif daemon_type == HAproxy.daemon_type:
         haproxy = HAproxy.init(ctx, fsid, daemon_id)
         r += haproxy.get_daemon_args()
@@ -2874,7 +2952,7 @@ def get_container_mounts(ctx, fsid, daemon_type, daemon_id,
             mounts[data_dir] = cdata_dir + ':z'
         if not no_config:
             mounts[data_dir + '/config'] = '/etc/ceph/ceph.conf:z'
             mounts[data_dir] = cdata_dir + ':z'
         if not no_config:
             mounts[data_dir + '/config'] = '/etc/ceph/ceph.conf:z'
-        if daemon_type in ['rbd-mirror', 'cephfs-mirror', 'crash']:
+        if daemon_type in ['rbd-mirror', 'cephfs-mirror', 'crash', 'ceph-exporter']:
             # these do not search for their keyrings in a data directory
             mounts[data_dir + '/keyring'] = '/etc/ceph/ceph.client.%s.%s.keyring' % (daemon_type, daemon_id)
 
             # these do not search for their keyrings in a data directory
             mounts[data_dir + '/keyring'] = '/etc/ceph/ceph.client.%s.%s.keyring' % (daemon_type, daemon_id)
 
@@ -2994,6 +3072,20 @@ def get_ceph_volume_container(ctx: CephadmContext,
     )
 
 
     )
 
 
+def set_pids_limit_unlimited(ctx: CephadmContext, container_args: List[str]) -> None:
+    # set container's pids-limit to unlimited rather than default (Docker 4096 / Podman 2048)
+    # Useful for daemons like iscsi where the default pids-limit limits the number of luns
+    # per iscsi target or rgw where increasing the rgw_thread_pool_size to a value near
+    # the default pids-limit may cause the container to crash.
+    if (
+        isinstance(ctx.container_engine, Podman)
+        and ctx.container_engine.version >= PIDS_LIMIT_UNLIMITED_PODMAN_VERSION
+    ):
+        container_args.append('--pids-limit=-1')
+    else:
+        container_args.append('--pids-limit=0')
+
+
 def get_container(ctx: CephadmContext,
                   fsid: str, daemon_type: str, daemon_id: Union[int, str],
                   privileged: bool = False,
 def get_container(ctx: CephadmContext,
                   fsid: str, daemon_type: str, daemon_id: Union[int, str],
                   privileged: bool = False,
@@ -3009,6 +3101,8 @@ def get_container(ctx: CephadmContext,
         envs.append('TCMALLOC_MAX_TOTAL_THREAD_CACHE_BYTES=134217728')
     if container_args is None:
         container_args = []
         envs.append('TCMALLOC_MAX_TOTAL_THREAD_CACHE_BYTES=134217728')
     if container_args is None:
         container_args = []
+    if daemon_type in Ceph.daemons or daemon_type in Ceph.gateways:
+        set_pids_limit_unlimited(ctx, container_args)
     if daemon_type in ['mon', 'osd']:
         # mon and osd need privileged in order for libudev to query devices
         privileged = True
     if daemon_type in ['mon', 'osd']:
         # mon and osd need privileged in order for libudev to query devices
         privileged = True
@@ -3033,6 +3127,9 @@ def get_container(ctx: CephadmContext,
         entrypoint = NFSGanesha.entrypoint
         name = '%s.%s' % (daemon_type, daemon_id)
         envs.extend(NFSGanesha.get_container_envs())
         entrypoint = NFSGanesha.entrypoint
         name = '%s.%s' % (daemon_type, daemon_id)
         envs.extend(NFSGanesha.get_container_envs())
+    elif daemon_type == CephExporter.daemon_type:
+        entrypoint = CephExporter.entrypoint
+        name = 'client.ceph-exporter.%s' % daemon_id
     elif daemon_type == HAproxy.daemon_type:
         name = '%s.%s' % (daemon_type, daemon_id)
         container_args.extend(['--user=root'])  # haproxy 2.4 defaults to a different user
     elif daemon_type == HAproxy.daemon_type:
         name = '%s.%s' % (daemon_type, daemon_id)
         container_args.extend(['--user=root'])  # haproxy 2.4 defaults to a different user
@@ -3088,7 +3185,7 @@ def get_container(ctx: CephadmContext,
             '--cidfile',
             runtime_dir + '/ceph-%s@%s.%s.service-cid' % (fsid, daemon_type, daemon_id),
         ])
             '--cidfile',
             runtime_dir + '/ceph-%s@%s.%s.service-cid' % (fsid, daemon_type, daemon_id),
         ])
-        if ctx.container_engine.version >= CGROUPS_SPLIT_PODMAN_VERSION:
+        if ctx.container_engine.version >= CGROUPS_SPLIT_PODMAN_VERSION and not ctx.no_cgroups_split:
             container_args.append('--cgroups=split')
 
     return CephContainer.for_daemon(
             container_args.append('--cgroups=split')
 
     return CephContainer.for_daemon(
@@ -3238,7 +3335,7 @@ def deploy_daemon(ctx, fsid, daemon_type, daemon_id, c, uid, gid,
     # Open ports explicitly required for the daemon
     if ports:
         fw = Firewalld(ctx)
     # Open ports explicitly required for the daemon
     if ports:
         fw = Firewalld(ctx)
-        fw.open_ports(ports)
+        fw.open_ports(ports + fw.external_ports.get(daemon_type, []))
         fw.apply_rules()
 
     if reconfig and daemon_type not in Ceph.daemons:
         fw.apply_rules()
 
     if reconfig and daemon_type not in Ceph.daemons:
@@ -3315,6 +3412,15 @@ def deploy_daemon_units(
     ports: Optional[List[int]] = None,
 ) -> None:
     # cmd
     ports: Optional[List[int]] = None,
 ) -> None:
     # cmd
+
+    def add_stop_actions(f: TextIO) -> None:
+        # following generated script basically checks if the container exists
+        # before stopping it. Exit code will be success either if it doesn't
+        # exist or if it exists and is stopped successfully.
+        container_exists = f'{ctx.container_engine.path} inspect %s &>/dev/null'
+        f.write(f'! {container_exists % c.old_cname} || {" ".join(c.stop_cmd(old_cname=True))} \n')
+        f.write(f'! {container_exists % c.cname} || {" ".join(c.stop_cmd())} \n')
+
     data_dir = get_data_dir(fsid, ctx.data_dir, daemon_type, daemon_id)
     with open(data_dir + '/unit.run.new', 'w') as f, \
             open(data_dir + '/unit.meta.new', 'w') as metaf:
     data_dir = get_data_dir(fsid, ctx.data_dir, daemon_type, daemon_id)
     with open(data_dir + '/unit.run.new', 'w') as f, \
             open(data_dir + '/unit.meta.new', 'w') as metaf:
@@ -3401,6 +3507,9 @@ def deploy_daemon_units(
 
     # post-stop command(s)
     with open(data_dir + '/unit.poststop.new', 'w') as f:
 
     # post-stop command(s)
     with open(data_dir + '/unit.poststop.new', 'w') as f:
+        # this is a fallback to eventually stop any underlying container that was not stopped properly by unit.stop,
+        # this could happen in very slow setups as described in the issue https://tracker.ceph.com/issues/58242.
+        add_stop_actions(f)
         if daemon_type == 'osd':
             assert osd_fsid
             poststop = get_ceph_volume_container(
         if daemon_type == 'osd':
             assert osd_fsid
             poststop = get_ceph_volume_container(
@@ -3427,13 +3536,7 @@ def deploy_daemon_units(
 
     # post-stop command(s)
     with open(data_dir + '/unit.stop.new', 'w') as f:
 
     # post-stop command(s)
     with open(data_dir + '/unit.stop.new', 'w') as f:
-        # following generated script basically checks if the container exists
-        # before stopping it. Exit code will be success either if it doesn't
-        # exist or if it exists and is stopped successfully.
-        container_exists = f'{ctx.container_engine.path} inspect %s &>/dev/null'
-        f.write(f'! {container_exists % c.old_cname} || {" ".join(c.stop_cmd(old_cname=True))} \n')
-        f.write(f'! {container_exists % c.cname} || {" ".join(c.stop_cmd())} \n')
-
+        add_stop_actions(f)
         os.fchmod(f.fileno(), 0o600)
         os.rename(data_dir + '/unit.stop.new',
                   data_dir + '/unit.stop')
         os.fchmod(f.fileno(), 0o600)
         os.rename(data_dir + '/unit.stop.new',
                   data_dir + '/unit.stop')
@@ -3471,6 +3574,18 @@ def deploy_daemon_units(
 
 
 class Firewalld(object):
 
 
 class Firewalld(object):
+
+    # for specifying ports we should always open when opening
+    # ports for a daemon of that type. Main use case is for ports
+    # that we should open when deploying the daemon type but that
+    # the daemon itself may not necessarily need to bind to the port.
+    # This needs to be handed differently as we don't want to fail
+    # deployment if the port cannot be bound to but we still want to
+    # open the port in the firewall.
+    external_ports: Dict[str, List[int]] = {
+        'iscsi': [3260]  # 3260 is the well known iSCSI port
+    }
+
     def __init__(self, ctx):
         # type: (CephadmContext) -> None
         self.ctx = ctx
     def __init__(self, ctx):
         # type: (CephadmContext) -> None
         self.ctx = ctx
@@ -3700,6 +3815,10 @@ def install_base_units(ctx, fsid):
         call_throws(ctx, ['systemctl', 'enable', 'ceph-%s.target' % fsid])
         call_throws(ctx, ['systemctl', 'start', 'ceph-%s.target' % fsid])
 
         call_throws(ctx, ['systemctl', 'enable', 'ceph-%s.target' % fsid])
         call_throws(ctx, ['systemctl', 'start', 'ceph-%s.target' % fsid])
 
+    # don't overwrite file in order to allow users to manipulate it
+    if os.path.exists(ctx.logrotate_dir + f'/ceph-{fsid}'):
+        return
+
     # logrotate for the cluster
     with open(ctx.logrotate_dir + '/ceph-%s' % fsid, 'w') as f:
         """
     # logrotate for the cluster
     with open(ctx.logrotate_dir + '/ceph-%s' % fsid, 'w') as f:
         """
@@ -3763,7 +3882,7 @@ ExecStopPost=-/bin/bash {data_dir}/{fsid}/%i/unit.poststop
 KillMode=none
 Restart=on-failure
 RestartSec=10s
 KillMode=none
 Restart=on-failure
 RestartSec=10s
-TimeoutStartSec=120
+TimeoutStartSec=200
 TimeoutStopSec=120
 StartLimitInterval=30min
 StartLimitBurst=5
 TimeoutStopSec=120
 StartLimitInterval=30min
 StartLimitBurst=5
@@ -4780,7 +4899,7 @@ def get_public_net_from_cfg(ctx: CephadmContext) -> Optional[str]:
         return None
 
     # Ensure all public CIDR networks are valid
         return None
 
     # Ensure all public CIDR networks are valid
-    public_network = cp.get('global', 'public_network')
+    public_network = cp.get('global', 'public_network').strip('"').strip("'")
     rc, _, err_msg = check_subnet(public_network)
     if rc:
         raise Error(f'Invalid public_network {public_network} parameter: {err_msg}')
     rc, _, err_msg = check_subnet(public_network)
     if rc:
         raise Error(f'Invalid public_network {public_network} parameter: {err_msg}')
@@ -4877,7 +4996,7 @@ def prepare_cluster_network(ctx: CephadmContext) -> Tuple[str, bool]:
     cp = read_config(ctx.config)
     cluster_network = ctx.cluster_network
     if cluster_network is None and cp.has_option('global', 'cluster_network'):
     cp = read_config(ctx.config)
     cluster_network = ctx.cluster_network
     if cluster_network is None and cp.has_option('global', 'cluster_network'):
-        cluster_network = cp.get('global', 'cluster_network')
+        cluster_network = cp.get('global', 'cluster_network').strip('"').strip("'")
 
     if cluster_network:
         cluser_nets = set([x.strip() for x in cluster_network.split(',')])
 
     if cluster_network:
         cluser_nets = set([x.strip() for x in cluster_network.split(',')])
@@ -5151,7 +5270,7 @@ def prepare_ssh(
         cli(['orch', 'apply', 'crash'])
 
     if not ctx.skip_monitoring_stack:
         cli(['orch', 'apply', 'crash'])
 
     if not ctx.skip_monitoring_stack:
-        for t in ['prometheus', 'grafana', 'node-exporter', 'alertmanager']:
+        for t in ['ceph-exporter', 'prometheus', 'grafana', 'node-exporter', 'alertmanager']:
             logger.info('Deploying %s service with default placement...' % t)
             cli(['orch', 'apply', t])
 
             logger.info('Deploying %s service with default placement...' % t)
             cli(['orch', 'apply', t])
 
@@ -5343,62 +5462,105 @@ def finish_bootstrap_config(
     pass
 
 
     pass
 
 
-# funcs to process spec file for apply spec
-def _parse_yaml_docs(f: Iterable[str]) -> List[List[str]]:
-    docs = []
-    current_doc = []  # type: List[str]
+def _extract_host_info_from_applied_spec(f: Iterable[str]) -> List[Dict[str, str]]:
+    # overall goal of this function is to go through an applied spec and find
+    # the hostname (and addr is provided) for each host spec in the applied spec.
+    # Generally, we should be able to just pass the spec to the mgr module where
+    # proper yaml parsing can happen, but for host specs in particular we want to
+    # be able to distribute ssh keys, which requires finding the hostname (and addr
+    # if possible) for each potential host spec in the applied spec.
+
+    specs: List[List[str]] = []
+    current_spec: List[str] = []
     for line in f:
         if re.search(r'^---\s+', line):
     for line in f:
         if re.search(r'^---\s+', line):
-            if current_doc:
-                docs.append(current_doc)
-            current_doc = []
-        else:
-            current_doc.append(line.rstrip())
-    if current_doc:
-        docs.append(current_doc)
-    return docs
-
-
-def _parse_yaml_obj(doc: List[str]) -> Dict[str, str]:
-    # note: this only parses the first layer of yaml
-    obj = {}  # type: Dict[str, str]
-    current_key = ''
-    for line in doc:
-        if line.startswith(' '):
-            obj[current_key] += line.strip()
-        elif line.endswith(':'):
-            current_key = line.strip(':')
-            obj[current_key] = ''
+            if current_spec:
+                specs.append(current_spec)
+            current_spec = []
         else:
         else:
-            current_key, val = line.split(':')
-            obj[current_key] = val.strip()
-    return obj
-
+            line = line.strip()
+            if line:
+                current_spec.append(line)
+    if current_spec:
+        specs.append(current_spec)
+
+    host_specs: List[List[str]] = []
+    for spec in specs:
+        for line in spec:
+            if 'service_type' in line:
+                try:
+                    _, type = line.split(':')
+                    type = type.strip()
+                    if type == 'host':
+                        host_specs.append(spec)
+                except ValueError as e:
+                    spec_str = '\n'.join(spec)
+                    logger.error(f'Failed to pull service_type from spec:\n{spec_str}. Got error: {e}')
+                break
+            spec_str = '\n'.join(spec)
+            logger.error(f'Failed to find service_type within spec:\n{spec_str}')
+
+    host_dicts = []
+    for s in host_specs:
+        host_dict = _extract_host_info_from_spec(s)
+        # if host_dict is empty here, we failed to pull the hostname
+        # for the host from the spec. This should have already been logged
+        # so at this point we just don't want to include it in our output
+        if host_dict:
+            host_dicts.append(host_dict)
+
+    return host_dicts
+
+
+def _extract_host_info_from_spec(host_spec: List[str]) -> Dict[str, str]:
+    # note:for our purposes here, we only really want the hostname
+    # and address of the host from each of these specs in order to
+    # be able to distribute ssh keys. We will later apply the spec
+    # through the mgr module where proper yaml parsing can be done
+    # The returned dicts from this function should only contain
+    # one or two entries, one (required) for hostname, one (optional) for addr
+    # {
+    #   hostname: <hostname>
+    #   addr: <ip-addr>
+    # }
+    # if we fail to find the hostname, an empty dict is returned
+
+    host_dict = {}  # type: Dict[str, str]
+    for line in host_spec:
+        for field in ['hostname', 'addr']:
+            if field in line:
+                try:
+                    _, field_value = line.split(':')
+                    field_value = field_value.strip()
+                    host_dict[field] = field_value
+                except ValueError as e:
+                    spec_str = '\n'.join(host_spec)
+                    logger.error(f'Error trying to pull {field} from host spec:\n{spec_str}. Got error: {e}')
 
 
-def parse_yaml_objs(f: Iterable[str]) -> List[Dict[str, str]]:
-    objs = []
-    for d in _parse_yaml_docs(f):
-        objs.append(_parse_yaml_obj(d))
-    return objs
+    if 'hostname' not in host_dict:
+        spec_str = '\n'.join(host_spec)
+        logger.error(f'Could not find hostname in host spec:\n{spec_str}')
+        return {}
+    return host_dict
 
 
 
 
-def _distribute_ssh_keys(ctx: CephadmContext, host_spec: Dict[str, str], bootstrap_hostname: str) -> int:
+def _distribute_ssh_keys(ctx: CephadmContext, host_info: Dict[str, str], bootstrap_hostname: str) -> int:
     # copy ssh key to hosts in host spec (used for apply spec)
     ssh_key = CEPH_DEFAULT_PUBKEY
     if ctx.ssh_public_key:
         ssh_key = ctx.ssh_public_key.name
 
     # copy ssh key to hosts in host spec (used for apply spec)
     ssh_key = CEPH_DEFAULT_PUBKEY
     if ctx.ssh_public_key:
         ssh_key = ctx.ssh_public_key.name
 
-    if bootstrap_hostname != host_spec['hostname']:
-        if 'addr' in host_spec:
-            addr = host_spec['addr']
+    if bootstrap_hostname != host_info['hostname']:
+        if 'addr' in host_info:
+            addr = host_info['addr']
         else:
         else:
-            addr = host_spec['hostname']
+            addr = host_info['hostname']
         out, err, code = call(ctx, ['sudo', '-u', ctx.ssh_user, 'ssh-copy-id', '-f', '-i', ssh_key, '-o StrictHostKeyChecking=no', '%s@%s' % (ctx.ssh_user, addr)])
         if code:
         out, err, code = call(ctx, ['sudo', '-u', ctx.ssh_user, 'ssh-copy-id', '-f', '-i', ssh_key, '-o StrictHostKeyChecking=no', '%s@%s' % (ctx.ssh_user, addr)])
         if code:
-            logger.info('\nCopying ssh key to host %s at address %s failed!\n' % (host_spec['hostname'], addr))
+            logger.error('\nCopying ssh key to host %s at address %s failed!\n' % (host_info['hostname'], addr))
             return 1
         else:
             return 1
         else:
-            logger.info('Added ssh key to host %s at address %s\n' % (host_spec['hostname'], addr))
+            logger.info('Added ssh key to host %s at address %s' % (host_info['hostname'], addr))
     return 0
 
 
     return 0
 
 
@@ -5480,7 +5642,7 @@ def command_bootstrap(ctx):
     hostname = get_hostname()
     if '.' in hostname and not ctx.allow_fqdn_hostname:
         raise Error('hostname is a fully qualified domain name (%s); either fix (e.g., "sudo hostname %s" or similar) or pass --allow-fqdn-hostname' % (hostname, hostname.split('.')[0]))
     hostname = get_hostname()
     if '.' in hostname and not ctx.allow_fqdn_hostname:
         raise Error('hostname is a fully qualified domain name (%s); either fix (e.g., "sudo hostname %s" or similar) or pass --allow-fqdn-hostname' % (hostname, hostname.split('.')[0]))
-    mon_id = ctx.mon_id or hostname
+    mon_id = ctx.mon_id or get_short_hostname()
     mgr_id = ctx.mgr_id or generate_service_id()
 
     lock = FileLock(ctx, fsid)
     mgr_id = ctx.mgr_id or generate_service_id()
 
     lock = FileLock(ctx, fsid)
@@ -5632,12 +5794,9 @@ def command_bootstrap(ctx):
         logger.info('Applying %s to cluster' % ctx.apply_spec)
         # copy ssh key to hosts in spec file
         with open(ctx.apply_spec) as f:
         logger.info('Applying %s to cluster' % ctx.apply_spec)
         # copy ssh key to hosts in spec file
         with open(ctx.apply_spec) as f:
-            try:
-                for spec in parse_yaml_objs(f):
-                    if spec.get('service_type') == 'host':
-                        _distribute_ssh_keys(ctx, spec, hostname)
-            except ValueError:
-                logger.info('Unable to parse %s succesfully' % ctx.apply_spec)
+            host_dicts = _extract_host_info_from_applied_spec(f)
+            for h in host_dicts:
+                _distribute_ssh_keys(ctx, h, hostname)
 
         mounts = {}
         mounts[pathify(ctx.apply_spec)] = '/tmp/spec.yml:ro'
 
         mounts = {}
         mounts[pathify(ctx.apply_spec)] = '/tmp/spec.yml:ro'
@@ -5750,6 +5909,8 @@ def get_deployment_container(ctx: CephadmContext,
     c = get_container(ctx, fsid, daemon_type, daemon_id, privileged, ptrace, container_args)
     if 'extra_container_args' in ctx and ctx.extra_container_args:
         c.container_args.extend(ctx.extra_container_args)
     c = get_container(ctx, fsid, daemon_type, daemon_id, privileged, ptrace, container_args)
     if 'extra_container_args' in ctx and ctx.extra_container_args:
         c.container_args.extend(ctx.extra_container_args)
+    if 'extra_entrypoint_args' in ctx and ctx.extra_entrypoint_args:
+        c.args.extend(ctx.extra_entrypoint_args)
     if 'config_json' in ctx and ctx.config_json:
         conf_files = get_custom_config_files(ctx.config_json)
         mandatory_keys = ['mount_path', 'content']
     if 'config_json' in ctx and ctx.config_json:
         conf_files = get_custom_config_files(ctx.config_json)
         mandatory_keys = ['mount_path', 'content']
@@ -8116,6 +8277,7 @@ class HostFacts():
     def __init__(self, ctx: CephadmContext):
         self.ctx: CephadmContext = ctx
         self.cpu_model: str = 'Unknown'
     def __init__(self, ctx: CephadmContext):
         self.ctx: CephadmContext = ctx
         self.cpu_model: str = 'Unknown'
+        self.sysctl_options: Dict[str, str] = self._populate_sysctl_options()
         self.cpu_count: int = 0
         self.cpu_cores: int = 0
         self.cpu_threads: int = 0
         self.cpu_count: int = 0
         self.cpu_cores: int = 0
         self.cpu_threads: int = 0
@@ -8127,6 +8289,15 @@ class HostFacts():
         self.arch: str = platform.processor()
         self.kernel: str = platform.release()
 
         self.arch: str = platform.processor()
         self.kernel: str = platform.release()
 
+    def _populate_sysctl_options(self) -> Dict[str, str]:
+        sysctl_options = {}
+        out, _, _ = call_throws(self.ctx, ['sysctl', '-a'], verbosity=CallVerbosity.QUIET_UNLESS_ERROR)
+        if out:
+            for line in out.splitlines():
+                option, value = line.split('=')
+                sysctl_options[option.strip()] = value.strip()
+        return sysctl_options
+
     def _get_cpuinfo(self):
         # type: () -> None
         """Determine cpu information via /proc/cpuinfo"""
     def _get_cpuinfo(self):
         # type: () -> None
         """Determine cpu information via /proc/cpuinfo"""
@@ -8219,12 +8390,15 @@ class HostFacts():
 
     def _get_capacity(self, dev):
         # type: (str) -> int
 
     def _get_capacity(self, dev):
         # type: (str) -> int
-        """Determine the size of a given device"""
+        """Determine the size of a given device
+
+        The kernel always bases device size calculations based on a 512 byte
+        sector. For more information see
+        https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git/tree/include/linux/types.h?h=v5.15.63#n120
+        """
         size_path = os.path.join('/sys/block', dev, 'size')
         size_blocks = int(read_file([size_path]))
         size_path = os.path.join('/sys/block', dev, 'size')
         size_blocks = int(read_file([size_path]))
-        blk_path = os.path.join('/sys/block', dev, 'queue', 'logical_block_size')
-        blk_count = int(read_file([blk_path]))
-        return size_blocks * blk_count
+        return size_blocks * 512
 
     def _get_capacity_by_type(self, rota='0'):
         # type: (str) -> int
 
     def _get_capacity_by_type(self, rota='0'):
         # type: (str) -> int
@@ -8761,6 +8935,11 @@ def _get_parser():
         action='store_true',
         default=not CONTAINER_INIT,
         help='Do not run podman/docker with `--init`')
         action='store_true',
         default=not CONTAINER_INIT,
         help='Do not run podman/docker with `--init`')
+    parser.add_argument(
+        '--no-cgroups-split',
+        action='store_true',
+        default=False,
+        help='Do not run containers with --cgroups=split (currently only relevant when using podman)')
 
     subparsers = parser.add_subparsers(help='sub-command')
 
 
     subparsers = parser.add_subparsers(help='sub-command')
 
@@ -9254,6 +9433,12 @@ def _get_parser():
         default=[],
         help='Additional container arguments to apply to deamon'
     )
         default=[],
         help='Additional container arguments to apply to deamon'
     )
+    parser_deploy.add_argument(
+        '--extra-entrypoint-args',
+        action='append',
+        default=[],
+        help='Additional entrypoint arguments to apply to deamon'
+    )
 
     parser_check_host = subparsers.add_parser(
         'check-host', help='check host configuration')
 
     parser_check_host = subparsers.add_parser(
         'check-host', help='check host configuration')
index 1f5f171214863ff577a2b6fa20277925b6c58fa4..fffab9085f18c0190527c0cfe43d146c8eabe20d 100644 (file)
@@ -1,3 +1,4 @@
+from calendar import c
 import mock
 import os
 import pytest
 import mock
 import os
 import pytest
@@ -68,13 +69,17 @@ def cephadm_fs(
          mock.patch('platform.processor', return_value='x86_64'), \
          mock.patch('cephadm.extract_uid_gid', return_value=(uid, gid)):
 
          mock.patch('platform.processor', return_value='x86_64'), \
          mock.patch('cephadm.extract_uid_gid', return_value=(uid, gid)):
 
-            fs.create_dir(cd.DATA_DIR)
-            fs.create_dir(cd.LOG_DIR)
-            fs.create_dir(cd.LOCK_DIR)
-            fs.create_dir(cd.LOGROTATE_DIR)
-            fs.create_dir(cd.UNIT_DIR)
+        if not fake_filesystem.is_root():
+            fake_filesystem.set_uid(0)
 
 
-            yield fs
+        fs.create_dir(cd.DATA_DIR)
+        fs.create_dir(cd.LOG_DIR)
+        fs.create_dir(cd.LOCK_DIR)
+        fs.create_dir(cd.LOGROTATE_DIR)
+        fs.create_dir(cd.UNIT_DIR)
+        fs.create_dir('/sys/block')
+
+        yield fs
 
 
 @contextmanager
 
 
 @contextmanager
index eb78fe3d32d73630981fb8fd103304d5b1ec51e0..1900de67e5f5acfb480d00b2ed96d204e8531738 100644 (file)
@@ -17,6 +17,7 @@ from .fixtures import (
     mock_bad_firewalld,
 )
 
     mock_bad_firewalld,
 )
 
+from pyfakefs import fake_filesystem
 from pyfakefs import fake_filesystem_unittest
 
 with mock.patch('builtins.open', create=True):
 from pyfakefs import fake_filesystem_unittest
 
 with mock.patch('builtins.open', create=True):
@@ -440,7 +441,7 @@ class TestCephAdm(object):
                                  '514e6a882f6e74806a5856468489eeff8d7106095557578da96935e4d0ba4d9d',
                                  '2022-04-19 13:45:20.97146228 +0000 UTC',
                                  '')
                                  '514e6a882f6e74806a5856468489eeff8d7106095557578da96935e4d0ba4d9d',
                                  '2022-04-19 13:45:20.97146228 +0000 UTC',
                                  '')
-        out = '''quay.ceph.io/ceph-ci/ceph@sha256:87f200536bb887b36b959e887d5984dd7a3f008a23aa1f283ab55d48b22c6185|dad864ee21e9|master|2022-03-23 16:29:19 +0000 UTC
+        out = '''quay.ceph.io/ceph-ci/ceph@sha256:87f200536bb887b36b959e887d5984dd7a3f008a23aa1f283ab55d48b22c6185|dad864ee21e9|main|2022-03-23 16:29:19 +0000 UTC
         quay.ceph.io/ceph-ci/ceph@sha256:b50b130fcda2a19f8507ddde3435bb4722266956e1858ac395c838bc1dcf1c0e|514e6a882f6e|pacific|2022-03-23 15:58:34 +0000 UTC
         docker.io/ceph/ceph@sha256:939a46c06b334e094901560c8346de33c00309e3e3968a2db240eb4897c6a508|666bbfa87e8d|v15.2.5|2020-09-16 14:15:15 +0000 UTC'''
         with mock.patch('cephadm.call_throws', return_value=(out, '', '')):
         quay.ceph.io/ceph-ci/ceph@sha256:b50b130fcda2a19f8507ddde3435bb4722266956e1858ac395c838bc1dcf1c0e|514e6a882f6e|pacific|2022-03-23 15:58:34 +0000 UTC
         docker.io/ceph/ceph@sha256:939a46c06b334e094901560c8346de33c00309e3e3968a2db240eb4897c6a508|666bbfa87e8d|v15.2.5|2020-09-16 14:15:15 +0000 UTC'''
         with mock.patch('cephadm.call_throws', return_value=(out, '', '')):
@@ -449,7 +450,7 @@ class TestCephAdm(object):
                 assert image == 'quay.ceph.io/ceph-ci/ceph@sha256:b50b130fcda2a19f8507ddde3435bb4722266956e1858ac395c838bc1dcf1c0e'
 
         # make sure first valid image is used when no container_info is found
                 assert image == 'quay.ceph.io/ceph-ci/ceph@sha256:b50b130fcda2a19f8507ddde3435bb4722266956e1858ac395c838bc1dcf1c0e'
 
         # make sure first valid image is used when no container_info is found
-        out = '''quay.ceph.io/ceph-ci/ceph@sha256:87f200536bb887b36b959e887d5984dd7a3f008a23aa1f283ab55d48b22c6185|dad864ee21e9|master|2022-03-23 16:29:19 +0000 UTC
+        out = '''quay.ceph.io/ceph-ci/ceph@sha256:87f200536bb887b36b959e887d5984dd7a3f008a23aa1f283ab55d48b22c6185|dad864ee21e9|main|2022-03-23 16:29:19 +0000 UTC
         quay.ceph.io/ceph-ci/ceph@sha256:b50b130fcda2a19f8507ddde3435bb4722266956e1858ac395c838bc1dcf1c0e|514e6a882f6e|pacific|2022-03-23 15:58:34 +0000 UTC
         docker.io/ceph/ceph@sha256:939a46c06b334e094901560c8346de33c00309e3e3968a2db240eb4897c6a508|666bbfa87e8d|v15.2.5|2020-09-16 14:15:15 +0000 UTC'''
         with mock.patch('cephadm.call_throws', return_value=(out, '', '')):
         quay.ceph.io/ceph-ci/ceph@sha256:b50b130fcda2a19f8507ddde3435bb4722266956e1858ac395c838bc1dcf1c0e|514e6a882f6e|pacific|2022-03-23 15:58:34 +0000 UTC
         docker.io/ceph/ceph@sha256:939a46c06b334e094901560c8346de33c00309e3e3968a2db240eb4897c6a508|666bbfa87e8d|v15.2.5|2020-09-16 14:15:15 +0000 UTC'''
         with mock.patch('cephadm.call_throws', return_value=(out, '', '')):
@@ -1160,6 +1161,7 @@ class TestMonitoring(object):
 
     def test_prometheus_external_url(self):
         ctx = cd.CephadmContext()
 
     def test_prometheus_external_url(self):
         ctx = cd.CephadmContext()
+        ctx.config_json = json.dumps({'files': {}, 'retention_time': '15d'})
         daemon_type = 'prometheus'
         daemon_id = 'home'
         fsid = 'aaf5a720-13fe-4a3b-82b9-2d99b7fd9704'
         daemon_type = 'prometheus'
         daemon_id = 'home'
         fsid = 'aaf5a720-13fe-4a3b-82b9-2d99b7fd9704'
@@ -1698,11 +1700,11 @@ if ! grep -qs /var/lib/ceph/9b9d7609-f4d5-4aba-94c8-effa764d96c9/iscsi.daemon_id
 # iscsi tcmu-runner container
 ! /usr/bin/podman rm -f ceph-9b9d7609-f4d5-4aba-94c8-effa764d96c9-iscsi.daemon_id-tcmu 2> /dev/null
 ! /usr/bin/podman rm -f ceph-9b9d7609-f4d5-4aba-94c8-effa764d96c9-iscsi-daemon_id-tcmu 2> /dev/null
 # iscsi tcmu-runner container
 ! /usr/bin/podman rm -f ceph-9b9d7609-f4d5-4aba-94c8-effa764d96c9-iscsi.daemon_id-tcmu 2> /dev/null
 ! /usr/bin/podman rm -f ceph-9b9d7609-f4d5-4aba-94c8-effa764d96c9-iscsi-daemon_id-tcmu 2> /dev/null
-/usr/bin/podman run --rm --ipc=host --stop-signal=SIGTERM --net=host --entrypoint /usr/bin/tcmu-runner --privileged --group-add=disk --init --name ceph-9b9d7609-f4d5-4aba-94c8-effa764d96c9-iscsi-daemon_id-tcmu -e CONTAINER_IMAGE=ceph/ceph -e NODE_NAME=host1 -e CEPH_USE_RANDOM_NONCE=1 -v /var/lib/ceph/9b9d7609-f4d5-4aba-94c8-effa764d96c9/iscsi.daemon_id/config:/etc/ceph/ceph.conf:z -v /var/lib/ceph/9b9d7609-f4d5-4aba-94c8-effa764d96c9/iscsi.daemon_id/keyring:/etc/ceph/keyring:z -v /var/lib/ceph/9b9d7609-f4d5-4aba-94c8-effa764d96c9/iscsi.daemon_id/iscsi-gateway.cfg:/etc/ceph/iscsi-gateway.cfg:z -v /var/lib/ceph/9b9d7609-f4d5-4aba-94c8-effa764d96c9/iscsi.daemon_id/configfs:/sys/kernel/config -v /var/log/ceph/9b9d7609-f4d5-4aba-94c8-effa764d96c9:/var/log:z -v /dev:/dev --mount type=bind,source=/lib/modules,destination=/lib/modules,ro=true ceph/ceph &
+/usr/bin/podman run --rm --ipc=host --stop-signal=SIGTERM --net=host --entrypoint /usr/bin/tcmu-runner --privileged --group-add=disk --init --name ceph-9b9d7609-f4d5-4aba-94c8-effa764d96c9-iscsi-daemon_id-tcmu --pids-limit=0 -e CONTAINER_IMAGE=ceph/ceph -e NODE_NAME=host1 -e CEPH_USE_RANDOM_NONCE=1 -v /var/lib/ceph/9b9d7609-f4d5-4aba-94c8-effa764d96c9/iscsi.daemon_id/config:/etc/ceph/ceph.conf:z -v /var/lib/ceph/9b9d7609-f4d5-4aba-94c8-effa764d96c9/iscsi.daemon_id/keyring:/etc/ceph/keyring:z -v /var/lib/ceph/9b9d7609-f4d5-4aba-94c8-effa764d96c9/iscsi.daemon_id/iscsi-gateway.cfg:/etc/ceph/iscsi-gateway.cfg:z -v /var/lib/ceph/9b9d7609-f4d5-4aba-94c8-effa764d96c9/iscsi.daemon_id/configfs:/sys/kernel/config -v /var/log/ceph/9b9d7609-f4d5-4aba-94c8-effa764d96c9:/var/log:z -v /dev:/dev --mount type=bind,source=/lib/modules,destination=/lib/modules,ro=true ceph/ceph &
 # iscsi.daemon_id
 ! /usr/bin/podman rm -f ceph-9b9d7609-f4d5-4aba-94c8-effa764d96c9-iscsi.daemon_id 2> /dev/null
 ! /usr/bin/podman rm -f ceph-9b9d7609-f4d5-4aba-94c8-effa764d96c9-iscsi-daemon_id 2> /dev/null
 # iscsi.daemon_id
 ! /usr/bin/podman rm -f ceph-9b9d7609-f4d5-4aba-94c8-effa764d96c9-iscsi.daemon_id 2> /dev/null
 ! /usr/bin/podman rm -f ceph-9b9d7609-f4d5-4aba-94c8-effa764d96c9-iscsi-daemon_id 2> /dev/null
-/usr/bin/podman run --rm --ipc=host --stop-signal=SIGTERM --net=host --entrypoint /usr/bin/rbd-target-api --privileged --group-add=disk --init --name ceph-9b9d7609-f4d5-4aba-94c8-effa764d96c9-iscsi-daemon_id -e CONTAINER_IMAGE=ceph/ceph -e NODE_NAME=host1 -e CEPH_USE_RANDOM_NONCE=1 -v /var/lib/ceph/9b9d7609-f4d5-4aba-94c8-effa764d96c9/iscsi.daemon_id/config:/etc/ceph/ceph.conf:z -v /var/lib/ceph/9b9d7609-f4d5-4aba-94c8-effa764d96c9/iscsi.daemon_id/keyring:/etc/ceph/keyring:z -v /var/lib/ceph/9b9d7609-f4d5-4aba-94c8-effa764d96c9/iscsi.daemon_id/iscsi-gateway.cfg:/etc/ceph/iscsi-gateway.cfg:z -v /var/lib/ceph/9b9d7609-f4d5-4aba-94c8-effa764d96c9/iscsi.daemon_id/configfs:/sys/kernel/config -v /var/log/ceph/9b9d7609-f4d5-4aba-94c8-effa764d96c9:/var/log:z -v /dev:/dev --mount type=bind,source=/lib/modules,destination=/lib/modules,ro=true ceph/ceph
+/usr/bin/podman run --rm --ipc=host --stop-signal=SIGTERM --net=host --entrypoint /usr/bin/rbd-target-api --privileged --group-add=disk --init --name ceph-9b9d7609-f4d5-4aba-94c8-effa764d96c9-iscsi-daemon_id --pids-limit=0 -e CONTAINER_IMAGE=ceph/ceph -e NODE_NAME=host1 -e CEPH_USE_RANDOM_NONCE=1 -v /var/lib/ceph/9b9d7609-f4d5-4aba-94c8-effa764d96c9/iscsi.daemon_id/config:/etc/ceph/ceph.conf:z -v /var/lib/ceph/9b9d7609-f4d5-4aba-94c8-effa764d96c9/iscsi.daemon_id/keyring:/etc/ceph/keyring:z -v /var/lib/ceph/9b9d7609-f4d5-4aba-94c8-effa764d96c9/iscsi.daemon_id/iscsi-gateway.cfg:/etc/ceph/iscsi-gateway.cfg:z -v /var/lib/ceph/9b9d7609-f4d5-4aba-94c8-effa764d96c9/iscsi.daemon_id/configfs:/sys/kernel/config -v /var/log/ceph/9b9d7609-f4d5-4aba-94c8-effa764d96c9:/var/log:z -v /dev:/dev --mount type=bind,source=/lib/modules,destination=/lib/modules,ro=true ceph/ceph
 """
 
     def test_get_container(self):
 """
 
     def test_get_container(self):
@@ -2096,7 +2098,7 @@ class TestPull:
 
 class TestApplySpec:
 
 
 class TestApplySpec:
 
-    def test_parse_yaml(self, cephadm_fs):
+    def test_extract_host_info_from_applied_spec(self, cephadm_fs):
         yaml = '''---
 service_type: host
 hostname: vm-00
         yaml = '''---
 service_type: host
 hostname: vm-00
@@ -2113,7 +2115,6 @@ labels:
 ---      
 service_type: host
 hostname: vm-02
 ---      
 service_type: host
 hostname: vm-02
-addr: 192.168.122.165
 ---
 ---      
 service_type: rgw
 ---
 ---      
 service_type: rgw
@@ -2139,20 +2140,12 @@ spec:
 '''
 
         cephadm_fs.create_file('spec.yml', contents=yaml)
 '''
 
         cephadm_fs.create_file('spec.yml', contents=yaml)
-        retdic = [{'service_type': 'host', 'hostname': 'vm-00', 'addr': '192.168.122.44', 'labels': '- example1- example2'},
-                  {'service_type': 'host', 'hostname': 'vm-01', 'addr': '192.168.122.247', 'labels': '- grafana'},
-                  {'service_type': 'host', 'hostname': 'vm-02', 'addr': '192.168.122.165'},
-                  {'service_id': 'myrgw',
-                   'service_type': 'rgw',
-                   'spec':
-                   'rgw_frontend_ssl_certificate: |-----BEGIN PRIVATE '
-                   'KEY-----V2VyIGRhcyBsaWVzdCBpc3QgZG9vZi4gTG9yZW0gaXBzdW0gZG9sb3Igc2l0IGFtZXQsIGNvbnNldGV0dXIgc2FkaXBzY2luZyBlbGl0ciwgc2VkIGRpYW0gbm9udW15IGVpcm1vZCB0ZW1wb3IgaW52aWR1bnQgdXQgbGFib3JlIGV0IGRvbG9yZSBtYWduYSBhbGlxdXlhbSBlcmF0LCBzZWQgZGlhbSB2b2x1cHR1YS4gQXQgdmVybyBlb3MgZXQgYWNjdXNhbSBldCBqdXN0byBkdW8=-----END '
-                   'PRIVATE KEY----------BEGIN '
-                   'CERTIFICATE-----V2VyIGRhcyBsaWVzdCBpc3QgZG9vZi4gTG9yZW0gaXBzdW0gZG9sb3Igc2l0IGFtZXQsIGNvbnNldGV0dXIgc2FkaXBzY2luZyBlbGl0ciwgc2VkIGRpYW0gbm9udW15IGVpcm1vZCB0ZW1wb3IgaW52aWR1bnQgdXQgbGFib3JlIGV0IGRvbG9yZSBtYWduYSBhbGlxdXlhbSBlcmF0LCBzZWQgZGlhbSB2b2x1cHR1YS4gQXQgdmVybyBlb3MgZXQgYWNjdXNhbSBldCBqdXN0byBkdW8=-----END '
-                   'CERTIFICATE-----ssl: true'}]
+        retdic = [{'hostname': 'vm-00', 'addr': '192.168.122.44'},
+                  {'hostname': 'vm-01', 'addr': '192.168.122.247'},
+                  {'hostname': 'vm-02',}]
 
         with open('spec.yml') as f:
 
         with open('spec.yml') as f:
-            dic = cd.parse_yaml_objs(f)
+            dic = cd._extract_host_info_from_applied_spec(f)
             assert dic == retdic
 
     @mock.patch('cephadm.call', return_value=('', '', 0))
             assert dic == retdic
 
     @mock.patch('cephadm.call', return_value=('', '', 0))
@@ -2404,10 +2397,50 @@ class TestNetworkValidation:
         with pytest.raises(Exception):
             rc = cd.ip_in_sublets('fe80:2030:31:24', 'fe80::/64')
 
         with pytest.raises(Exception):
             rc = cd.ip_in_sublets('fe80:2030:31:24', 'fe80::/64')
 
+
+    @pytest.mark.parametrize("conf", [
+"""[global]
+public_network='1.1.1.0/24,2.2.2.0/24'
+cluster_network="3.3.3.0/24, 4.4.4.0/24"
+""",
+"""[global]
+public_network=" 1.1.1.0/24,2.2.2.0/24 "
+cluster_network=3.3.3.0/24, 4.4.4.0/24
+""",
+"""[global]
+public_network= 1.1.1.0/24,  2.2.2.0/24 
+cluster_network='3.3.3.0/24,4.4.4.0/24'
+"""])
+    @mock.patch('cephadm.list_networks')
+    def test_get_networks_from_conf(self, _list_networks, conf, cephadm_fs):
+        cephadm_fs.create_file('ceph.conf', contents=conf)
+        _list_networks.return_value = {'1.1.1.0/24': {'eth0': ['1.1.1.1']},
+                                       '2.2.2.0/24': {'eth1': ['2.2.2.2']},
+                                       '3.3.3.0/24': {'eth2': ['3.3.3.3']},
+                                       '4.4.4.0/24': {'eth3': ['4.4.4.4']}}
+        ctx = cd.CephadmContext()
+        ctx.config = 'ceph.conf'
+        ctx.mon_ip = '1.1.1.1'
+        ctx.cluster_network = None
+        # what the cephadm module does with the public network string is
+        # [x.strip() for x in out.split(',')]
+        # so we must make sure our output, through that alteration,
+        # generates correctly formatted networks
+        def _str_to_networks(s):
+            return [x.strip() for x in s.split(',')]
+        public_network = cd.get_public_net_from_cfg(ctx)
+        assert _str_to_networks(public_network) == ['1.1.1.0/24', '2.2.2.0/24']
+        cluster_network, ipv6 = cd.prepare_cluster_network(ctx)
+        assert not ipv6
+        assert _str_to_networks(cluster_network) == ['3.3.3.0/24', '4.4.4.0/24']
+
 class TestRescan(fake_filesystem_unittest.TestCase):
 
     def setUp(self):
         self.setUpPyfakefs()
 class TestRescan(fake_filesystem_unittest.TestCase):
 
     def setUp(self):
         self.setUpPyfakefs()
+        if not fake_filesystem.is_root():
+            fake_filesystem.set_uid(0)
+
         self.fs.create_dir('/sys/class')
         self.ctx = cd.CephadmContext()
         self.ctx.func = cd.command_rescan_disks
         self.fs.create_dir('/sys/class')
         self.ctx = cd.CephadmContext()
         self.ctx.func = cd.command_rescan_disks
index 095bced7a74feb165908d9d70d86b261e6593992..c1d9cf6faf8f143b32ea73ac3c559a7007642a16 100644 (file)
@@ -5,7 +5,6 @@ envlist =
     fix
     flake8
 skipsdist = true
     fix
     flake8
 skipsdist = true
-requires = cython
 
 [flake8]
 max-line-length = 100
 
 [flake8]
 max-line-length = 100
@@ -34,7 +33,7 @@ addopts =
 [testenv]
 skip_install=true
 deps =
 [testenv]
 skip_install=true
 deps =
-  pyfakefs
+  pyfakefs == 5.0
   mock
   pytest
 commands=pytest {posargs}
   mock
   pytest
 commands=pytest {posargs}
@@ -58,7 +57,7 @@ commands =
 basepython = python3
 allowlist_externals = bash
 deps =
 basepython = python3
 allowlist_externals = bash
 deps =
-    flake8
+    flake8 == 5.0.4
     flake8-quotes
 commands =
     flake8 --config=tox.ini {posargs:cephadm}
     flake8-quotes
 commands =
     flake8 --config=tox.ini {posargs:cephadm}
index 5572446f20b1ae6136762c56b1a36125e8549754..ac41495b72a03a10fc3ee4d83a8d598b8ea35a91 100644 (file)
@@ -211,6 +211,7 @@ Client::CommandHook::CommandHook(Client *client) :
 int Client::CommandHook::call(
   std::string_view command,
   const cmdmap_t& cmdmap,
 int Client::CommandHook::call(
   std::string_view command,
   const cmdmap_t& cmdmap,
+  const bufferlist&,
   Formatter *f,
   std::ostream& errss,
   bufferlist& out)
   Formatter *f,
   std::ostream& errss,
   bufferlist& out)
@@ -1045,6 +1046,7 @@ Inode * Client::add_update_inode(InodeStat *st, utime_t from,
   issued |= in->caps_dirty();
   int new_issued = ~issued & (int)st->cap.caps;
 
   issued |= in->caps_dirty();
   int new_issued = ~issued & (int)st->cap.caps;
 
+  bool need_snapdir_attr_refresh = false;
   if ((new_version || (new_issued & CEPH_CAP_AUTH_SHARED)) &&
       !(issued & CEPH_CAP_AUTH_EXCL)) {
     in->mode = st->mode;
   if ((new_version || (new_issued & CEPH_CAP_AUTH_SHARED)) &&
       !(issued & CEPH_CAP_AUTH_EXCL)) {
     in->mode = st->mode;
@@ -1053,6 +1055,7 @@ Inode * Client::add_update_inode(InodeStat *st, utime_t from,
     in->btime = st->btime;
     in->snap_btime = st->snap_btime;
     in->snap_metadata = st->snap_metadata;
     in->btime = st->btime;
     in->snap_btime = st->snap_btime;
     in->snap_metadata = st->snap_metadata;
+    need_snapdir_attr_refresh = true;
   }
 
   if ((new_version || (new_issued & CEPH_CAP_LINK_SHARED)) &&
   }
 
   if ((new_version || (new_issued & CEPH_CAP_LINK_SHARED)) &&
@@ -1061,6 +1064,7 @@ Inode * Client::add_update_inode(InodeStat *st, utime_t from,
   }
 
   if (new_version || (new_issued & CEPH_CAP_ANY_RD)) {
   }
 
   if (new_version || (new_issued & CEPH_CAP_ANY_RD)) {
+    need_snapdir_attr_refresh = true;
     update_inode_file_time(in, issued, st->time_warp_seq,
                           st->ctime, st->mtime, st->atime);
   }
     update_inode_file_time(in, issued, st->time_warp_seq,
                           st->ctime, st->mtime, st->atime);
   }
@@ -1097,6 +1101,7 @@ Inode * Client::add_update_inode(InodeStat *st, utime_t from,
     auto p = st->xattrbl.cbegin();
     decode(in->xattrs, p);
     in->xattr_version = st->xattr_version;
     auto p = st->xattrbl.cbegin();
     decode(in->xattrs, p);
     in->xattr_version = st->xattr_version;
+    need_snapdir_attr_refresh = true;
   }
 
   if (st->inline_version > in->inline_version) {
   }
 
   if (st->inline_version > in->inline_version) {
@@ -1105,6 +1110,7 @@ Inode * Client::add_update_inode(InodeStat *st, utime_t from,
   }
 
   /* always take a newer change attr */
   }
 
   /* always take a newer change attr */
+  ldout(cct, 12) << __func__ << " client inode change_attr: " << in->change_attr << " , mds inodestat change_attr:  " << st->change_attr << dendl;
   if (st->change_attr > in->change_attr)
     in->change_attr = st->change_attr;
 
   if (st->change_attr > in->change_attr)
     in->change_attr = st->change_attr;
 
@@ -1150,6 +1156,13 @@ Inode * Client::add_update_inode(InodeStat *st, utime_t from,
   }
 
   in->fscrypt = st->fscrypt;
   }
 
   in->fscrypt = st->fscrypt;
+  if (need_snapdir_attr_refresh && in->is_dir() && in->snapid == CEPH_NOSNAP) {
+    vinodeno_t vino(in->ino, CEPH_SNAPDIR);
+    if (inode_map.count(vino)) {
+      refresh_snapdir_attrs(inode_map[vino], in);
+    }
+  }
+
   return in;
 }
 
   return in;
 }
 
@@ -1882,7 +1895,8 @@ int Client::make_request(MetaRequest *request,
                         const UserPerm& perms,
                         InodeRef *ptarget, bool *pcreated,
                         mds_rank_t use_mds,
                         const UserPerm& perms,
                         InodeRef *ptarget, bool *pcreated,
                         mds_rank_t use_mds,
-                        bufferlist *pdirbl)
+                        bufferlist *pdirbl,
+                        size_t feature_needed)
 {
   int r = 0;
 
 {
   int r = 0;
 
@@ -1966,6 +1980,11 @@ int Client::make_request(MetaRequest *request,
       session = mds_sessions.at(mds);
     }
 
       session = mds_sessions.at(mds);
     }
 
+    if (feature_needed != ULONG_MAX && !session->mds_features.test(feature_needed)) {
+      request->abort(-CEPHFS_EOPNOTSUPP);
+      break;
+    }
+
     // send request.
     send_request(request, session.get());
 
     // send request.
     send_request(request, session.get());
 
@@ -1982,7 +2001,7 @@ int Client::make_request(MetaRequest *request,
     request->caller_cond = nullptr;
 
     // did we get a reply?
     request->caller_cond = nullptr;
 
     // did we get a reply?
-    if (request->reply) 
+    if (request->reply)
       break;
   }
 
       break;
   }
 
@@ -2322,6 +2341,18 @@ void Client::handle_client_session(const MConstRef<MClientSession>& m)
   switch (m->get_op()) {
   case CEPH_SESSION_OPEN:
     {
   switch (m->get_op()) {
   case CEPH_SESSION_OPEN:
     {
+      if (session->state == MetaSession::STATE_OPEN) {
+        ldout(cct, 10) << "mds." << from << " already opened, ignore it"
+                       << dendl;
+        return;
+      }
+      /*
+       * The connection maybe broken and the session in client side
+       * has been reinitialized, need to update the seq anyway.
+       */
+      if (!session->seq && m->get_seq())
+        session->seq = m->get_seq();
+
       feature_bitset_t missing_features(CEPHFS_FEATURES_CLIENT_REQUIRED);
       missing_features -= m->supported_features;
       if (!missing_features.empty()) {
       feature_bitset_t missing_features(CEPHFS_FEATURES_CLIENT_REQUIRED);
       missing_features -= m->supported_features;
       if (!missing_features.empty()) {
@@ -4497,7 +4528,7 @@ void Client::remove_session_caps(MetaSession *s, int err)
 
 std::pair<int, bool> Client::_do_remount(bool retry_on_error)
 {
 
 std::pair<int, bool> Client::_do_remount(bool retry_on_error)
 {
-  uint64_t max_retries = cct->_conf.get_val<uint64_t>("mds_max_retries_on_remount_failure");
+  uint64_t max_retries = cct->_conf.get_val<uint64_t>("client_max_retries_on_remount_failure");
   bool abort_on_failure = false;
 
   errno = 0;
   bool abort_on_failure = false;
 
   errno = 0;
@@ -4535,7 +4566,10 @@ public:
   explicit C_Client_Remount(Client *c) : client(c) {}
   void finish(int r) override {
     ceph_assert(r == 0);
   explicit C_Client_Remount(Client *c) : client(c) {}
   void finish(int r) override {
     ceph_assert(r == 0);
-    client->_do_remount(true);
+    auto result = client->_do_remount(true);
+    if (result.second) {
+      ceph_abort();
+    }
   }
 };
 
   }
 };
 
@@ -6611,6 +6645,17 @@ void Client::_unmount(bool abort)
 
   mref_writer.update_state(CLIENT_UNMOUNTED);
 
 
   mref_writer.update_state(CLIENT_UNMOUNTED);
 
+  /*
+   * Stop the remount_queue before clearing the mountpoint memory
+   * to avoid possible use-after-free bug.
+   */
+  if (remount_cb) {
+    ldout(cct, 10) << "unmount stopping remount finisher" << dendl;
+    remount_finisher.wait_for_empty();
+    remount_finisher.stop();
+    remount_cb = nullptr;
+  }
+
   ldout(cct, 2) << "unmounted." << dendl;
 }
 
   ldout(cct, 2) << "unmounted." << dendl;
 }
 
@@ -7610,10 +7655,14 @@ int Client::_getvxattr(
   req->set_string2(xattr_name);
 
   bufferlist bl;
   req->set_string2(xattr_name);
 
   bufferlist bl;
-  int res = make_request(req, perms, nullptr, nullptr, rank, &bl);
+  int res = make_request(req, perms, nullptr, nullptr, rank, &bl,
+                         CEPHFS_FEATURE_OP_GETVXATTR);
   ldout(cct, 10) << __func__ << " result=" << res << dendl;
 
   if (res < 0) {
   ldout(cct, 10) << __func__ << " result=" << res << dendl;
 
   if (res < 0) {
+    if (res == -CEPHFS_EOPNOTSUPP) {
+      return -CEPHFS_ENODATA;
+    }
     return res;
   }
 
     return res;
   }
 
@@ -7876,6 +7925,12 @@ int Client::_do_setattr(Inode *in, struct ceph_statx *stx, int mask,
 
   if (!mask) {
     in->change_attr++;
 
   if (!mask) {
     in->change_attr++;
+    if (in->is_dir() && in->snapid == CEPH_NOSNAP) {
+      vinodeno_t vino(in->ino, CEPH_SNAPDIR);
+      if (inode_map.count(vino)) {
+        refresh_snapdir_attrs(inode_map[vino], in);
+      }
+    }
     return 0;
   }
 
     return 0;
   }
 
@@ -8173,10 +8228,17 @@ int Client::fill_stat(Inode *in, struct stat *st, frag_info_t *dirstat, nest_inf
   stat_set_mtime_sec(st, in->mtime.sec());
   stat_set_mtime_nsec(st, in->mtime.nsec());
   if (in->is_dir()) {
   stat_set_mtime_sec(st, in->mtime.sec());
   stat_set_mtime_nsec(st, in->mtime.nsec());
   if (in->is_dir()) {
-    if (cct->_conf->client_dirsize_rbytes)
+    if (cct->_conf->client_dirsize_rbytes) {
       st->st_size = in->rstat.rbytes;
       st->st_size = in->rstat.rbytes;
-    else
+    } else if (in->snapid == CEPH_SNAPDIR) {
+      SnapRealm *realm = get_snap_realm_maybe(in->vino().ino);
+      if (realm) {
+        st->st_size = realm->my_snaps.size();
+        put_snap_realm(realm);
+      }
+    } else {
       st->st_size = in->dirstat.size();
       st->st_size = in->dirstat.size();
+    }
 // The Windows "stat" structure provides just a subset of the fields that are
 // available on Linux.
 #ifndef _WIN32
 // The Windows "stat" structure provides just a subset of the fields that are
 // available on Linux.
 #ifndef _WIN32
@@ -8204,7 +8266,7 @@ void Client::fill_statx(Inode *in, unsigned int mask, struct ceph_statx *stx)
 {
   ldout(cct, 10) << __func__ << " on " << in->ino << " snap/dev" << in->snapid
           << " mode 0" << oct << in->mode << dec
 {
   ldout(cct, 10) << __func__ << " on " << in->ino << " snap/dev" << in->snapid
           << " mode 0" << oct << in->mode << dec
-          << " mtime " << in->mtime << " ctime " << in->ctime << dendl;
+          << " mtime " << in->mtime << " ctime " << in->ctime << " change_attr " << in->change_attr << dendl;
   memset(stx, 0, sizeof(struct ceph_statx));
 
   /*
   memset(stx, 0, sizeof(struct ceph_statx));
 
   /*
@@ -8258,10 +8320,17 @@ void Client::fill_statx(Inode *in, unsigned int mask, struct ceph_statx *stx)
     in->mtime.to_timespec(&stx->stx_mtime);
 
     if (in->is_dir()) {
     in->mtime.to_timespec(&stx->stx_mtime);
 
     if (in->is_dir()) {
-      if (cct->_conf->client_dirsize_rbytes)
+      if (cct->_conf->client_dirsize_rbytes) {
        stx->stx_size = in->rstat.rbytes;
        stx->stx_size = in->rstat.rbytes;
-      else
+      } else if (in->snapid == CEPH_SNAPDIR) {
+        SnapRealm *realm = get_snap_realm_maybe(in->vino().ino);
+       if (realm) {
+          stx->stx_size = realm->my_snaps.size();
+          put_snap_realm(realm);
+       }
+      } else {
        stx->stx_size = in->dirstat.size();
        stx->stx_size = in->dirstat.size();
+      }
       stx->stx_blocks = 1;
     } else {
       stx->stx_size = in->size;
       stx->stx_blocks = 1;
     } else {
       stx->stx_size = in->size;
@@ -10093,7 +10162,6 @@ int64_t Client::_read(Fh *f, int64_t offset, uint64_t size, bufferlist *bl)
 
   int want, have = 0;
   bool movepos = false;
 
   int want, have = 0;
   bool movepos = false;
-  std::unique_ptr<C_SaferCond> onuninline;
   int64_t rc = 0;
   const auto& conf = cct->_conf;
   Inode *in = f->inode.get();
   int64_t rc = 0;
   const auto& conf = cct->_conf;
   Inode *in = f->inode.get();
@@ -10136,31 +10204,26 @@ retry:
     have &= ~(CEPH_CAP_FILE_CACHE | CEPH_CAP_FILE_LAZYIO);
 
   if (in->inline_version < CEPH_INLINE_NONE) {
     have &= ~(CEPH_CAP_FILE_CACHE | CEPH_CAP_FILE_LAZYIO);
 
   if (in->inline_version < CEPH_INLINE_NONE) {
-    if (!(have & CEPH_CAP_FILE_CACHE)) {
-      onuninline.reset(new C_SaferCond("Client::_read_uninline_data flock"));
-      uninline_data(in, onuninline.get());
-    } else {
-      uint32_t len = in->inline_data.length();
-      uint64_t endoff = offset + size;
-      if (endoff > in->size)
-        endoff = in->size;
-
-      if (offset < len) {
-        if (endoff <= len) {
-          bl->substr_of(in->inline_data, offset, endoff - offset);
-        } else {
-          bl->substr_of(in->inline_data, offset, len - offset);
-          bl->append_zero(endoff - len);
-        }
-        rc = endoff - offset;
-      } else if ((uint64_t)offset < endoff) {
-        bl->append_zero(endoff - offset);
-        rc = endoff - offset;
+    uint32_t len = in->inline_data.length();
+    uint64_t endoff = offset + size;
+    if (endoff > in->size)
+      endoff = in->size;
+
+    if (offset < len) {
+      if (endoff <= len) {
+        bl->substr_of(in->inline_data, offset, endoff - offset);
       } else {
       } else {
-        rc = 0;
+        bl->substr_of(in->inline_data, offset, len - offset);
+        bl->append_zero(endoff - len);
       }
       }
-      goto success;
+      rc = endoff - offset;
+    } else if ((uint64_t)offset < endoff) {
+      bl->append_zero(endoff - offset);
+      rc = endoff - offset;
+    } else {
+      rc = 0;
     }
     }
+    goto success;
   }
 
   if (!conf->client_debug_force_sync_read &&
   }
 
   if (!conf->client_debug_force_sync_read &&
@@ -10218,19 +10281,6 @@ success:
 
 done:
   // done!
 
 done:
   // done!
-  
-  if (onuninline) {
-    client_lock.unlock();
-    int ret = onuninline->wait();
-    client_lock.lock();
-    if (ret >= 0 || ret == -CEPHFS_ECANCELED) {
-      in->inline_data.clear();
-      in->inline_version = CEPH_INLINE_NONE;
-      in->mark_caps_dirty(CEPH_CAP_FILE_WR);
-      check_caps(in, 0);
-    } else
-      rc = ret;
-  }
   if (have) {
     put_cap_ref(in, CEPH_CAP_FILE_RD);
   }
   if (have) {
     put_cap_ref(in, CEPH_CAP_FILE_RD);
   }
@@ -11569,6 +11619,17 @@ std::pair<int, bool> Client::test_dentry_handling(bool can_invalidate)
 
   can_invalidate_dentries = can_invalidate;
 
 
   can_invalidate_dentries = can_invalidate;
 
+  /*
+   * Force to use the old and slow method to invalidate the dcache
+   * if the euid is non-root, or the remount may fail with return
+   * code 1 or 32.
+   */
+  uid_t euid = geteuid();
+  ldout(cct, 10) << "euid: " << euid << dendl;
+  if (euid != 0) {
+    can_invalidate_dentries = true;
+  }
+
   if (can_invalidate_dentries) {
     ceph_assert(dentry_invalidate_cb);
     ldout(cct, 1) << "using dentry_invalidate_cb" << dendl;
   if (can_invalidate_dentries) {
     ceph_assert(dentry_invalidate_cb);
     ldout(cct, 1) << "using dentry_invalidate_cb" << dendl;
@@ -11796,28 +11857,40 @@ int Client::get_caps_issued(const char *path, const UserPerm& perms)
 // =========================================
 // low level
 
 // =========================================
 // low level
 
+void Client::refresh_snapdir_attrs(Inode *in, Inode *diri) {
+  ldout(cct, 10) << __func__ << ": snapdir inode=" << *in
+                 << ", inode=" << *diri << dendl;
+  in->ino = diri->ino;
+  in->snapid = CEPH_SNAPDIR;
+  in->mode = diri->mode;
+  in->uid = diri->uid;
+  in->gid = diri->gid;
+  in->nlink = 1;
+  in->mtime = diri->mtime;
+  in->ctime = diri->ctime;
+  in->btime = diri->btime;
+  in->atime = diri->atime;
+  in->size = diri->size;
+  in->change_attr = diri->change_attr;
+
+  in->dirfragtree.clear();
+  in->snapdir_parent = diri;
+  // copy posix acls to snapshotted inode
+  in->xattrs.clear();
+  for (auto &[xattr_key, xattr_value] : diri->xattrs) {
+    if (xattr_key.rfind("system.", 0) == 0) {
+      in->xattrs[xattr_key] = xattr_value;
+    }
+  }
+}
+
 Inode *Client::open_snapdir(Inode *diri)
 {
   Inode *in;
   vinodeno_t vino(diri->ino, CEPH_SNAPDIR);
   if (!inode_map.count(vino)) {
     in = new Inode(this, vino, &diri->layout);
 Inode *Client::open_snapdir(Inode *diri)
 {
   Inode *in;
   vinodeno_t vino(diri->ino, CEPH_SNAPDIR);
   if (!inode_map.count(vino)) {
     in = new Inode(this, vino, &diri->layout);
-
-    in->ino = diri->ino;
-    in->snapid = CEPH_SNAPDIR;
-    in->mode = diri->mode;
-    in->uid = diri->uid;
-    in->gid = diri->gid;
-    in->nlink = 1;
-    in->mtime = diri->mtime;
-    in->ctime = diri->ctime;
-    in->btime = diri->btime;
-    in->atime = diri->atime;
-    in->size = diri->size;
-    in->change_attr = diri->change_attr;
-
-    in->dirfragtree.clear();
-    in->snapdir_parent = diri;
+    refresh_snapdir_attrs(in, diri);
     diri->flags |= I_SNAPDIR_OPEN;
     inode_map[vino] = in;
     if (use_faked_inos())
     diri->flags |= I_SNAPDIR_OPEN;
     inode_map[vino] = in;
     if (use_faked_inos())
index 3d0985964e78cd9c4a0f2f32325f75ac2d165a5c..c55c20e9a01537c6da4d3f54e86711e0799f4b0f 100644 (file)
@@ -268,6 +268,7 @@ public:
   public:
     explicit CommandHook(Client *client);
     int call(std::string_view command, const cmdmap_t& cmdmap,
   public:
     explicit CommandHook(Client *client);
     int call(std::string_view command, const cmdmap_t& cmdmap,
+            const bufferlist&,
             Formatter *f,
             std::ostream& errss,
             bufferlist& out) override;
             Formatter *f,
             std::ostream& errss,
             bufferlist& out) override;
@@ -900,6 +901,7 @@ public:
   bool _collect_and_send_global_metrics;
 
 protected:
   bool _collect_and_send_global_metrics;
 
 protected:
+  std::list<ceph::condition_variable*> waiting_for_reclaim;
   /* Flags for check_caps() */
   static const unsigned CHECK_CAPS_NODELAY = 0x1;
   static const unsigned CHECK_CAPS_SYNCHRONOUS = 0x2;
   /* Flags for check_caps() */
   static const unsigned CHECK_CAPS_NODELAY = 0x1;
   static const unsigned CHECK_CAPS_SYNCHRONOUS = 0x2;
@@ -933,8 +935,9 @@ protected:
   void dump_mds_sessions(Formatter *f, bool cap_dump=false);
 
   int make_request(MetaRequest *req, const UserPerm& perms,
   void dump_mds_sessions(Formatter *f, bool cap_dump=false);
 
   int make_request(MetaRequest *req, const UserPerm& perms,
-                  InodeRef *ptarget = 0, bool *pcreated = 0,
-                  mds_rank_t use_mds=-1, bufferlist *pdirbl=0);
+                   InodeRef *ptarget = 0, bool *pcreated = 0,
+                   mds_rank_t use_mds=-1, bufferlist *pdirbl=0,
+                   size_t feature_needed=ULONG_MAX);
   void put_request(MetaRequest *request);
   void unregister_request(MetaRequest *request);
 
   void put_request(MetaRequest *request);
   void unregister_request(MetaRequest *request);
 
@@ -981,6 +984,7 @@ protected:
   void update_snap_trace(const bufferlist& bl, SnapRealm **realm_ret, bool must_flush=true);
   void invalidate_snaprealm_and_children(SnapRealm *realm);
 
   void update_snap_trace(const bufferlist& bl, SnapRealm **realm_ret, bool must_flush=true);
   void invalidate_snaprealm_and_children(SnapRealm *realm);
 
+  void refresh_snapdir_attrs(Inode *in, Inode *diri);
   Inode *open_snapdir(Inode *diri);
 
   int get_fd() {
   Inode *open_snapdir(Inode *diri);
 
   int get_fd() {
@@ -1562,7 +1566,6 @@ private:
   uint64_t retries_on_invalidate = 0;
 
   // state reclaim
   uint64_t retries_on_invalidate = 0;
 
   // state reclaim
-  std::list<ceph::condition_variable*> waiting_for_reclaim;
   int reclaim_errno = 0;
   epoch_t reclaim_osd_epoch = 0;
   entity_addrvec_t reclaim_target_addrs;
   int reclaim_errno = 0;
   epoch_t reclaim_osd_epoch = 0;
   entity_addrvec_t reclaim_target_addrs;
index 5c1523f2f427e52410f9de038f4c777a3570d709..51a0b4b1fe499ba26076ac3ff5123ef26fd58d9c 100644 (file)
@@ -56,6 +56,7 @@ ostream& operator<<(ostream &out, const Inode &in)
       << " btime=" << in.btime
       << " mtime=" << in.mtime
       << " ctime=" << in.ctime
       << " btime=" << in.btime
       << " mtime=" << in.mtime
       << " ctime=" << in.ctime
+      << " change_attr=" << in.change_attr
       << " caps=" << ccap_string(in.caps_issued());
   if (!in.caps.empty()) {
     out << "(";
       << " caps=" << ccap_string(in.caps_issued());
   if (!in.caps.empty()) {
     out << "(";
index 14313a7351655ed02094447881926ec109ec9837..3cbb4636c9d9f28e027c1eac98948bf5f85ab060 100644 (file)
@@ -76,8 +76,7 @@ std::string new_oid_prefix(std::string id, std::optional<std::string>& val)
 }
 
 int write_header(cls_method_context_t hctx,
 }
 
 int write_header(cls_method_context_t hctx,
-                info& header,
-                bool inc_ver = true)
+                info& header)
 {
   static constexpr auto HEADER_INSTANCE_SIZE = 16;
   if (header.version.instance.empty()) {
 {
   static constexpr auto HEADER_INSTANCE_SIZE = 16;
   if (header.version.instance.empty()) {
@@ -86,9 +85,6 @@ int write_header(cls_method_context_t hctx,
     cls_gen_rand_base64(buf, sizeof(buf) - 1);
     header.version.instance = buf;
   }
     cls_gen_rand_base64(buf, sizeof(buf) - 1);
     header.version.instance = buf;
   }
-  if (inc_ver) {
-    ++header.version.ver;
-  }
   ceph::buffer::list bl;
   encode(header, bl);
   return cls_cxx_write_full(hctx, &bl);
   ceph::buffer::list bl;
   encode(header, bl);
   return cls_cxx_write_full(hctx, &bl);
@@ -117,7 +113,6 @@ int read_part_header(cls_method_context_t hctx,
   std::ostringstream ss;
   ss << part_header->max_time;
   CLS_LOG(5, "%s:%d read part_header:\n"
   std::ostringstream ss;
   ss << part_header->max_time;
   CLS_LOG(5, "%s:%d read part_header:\n"
-         "\ttag=%s\n"
          "\tmagic=0x%" PRIx64 "\n"
          "\tmin_ofs=%" PRId64 "\n"
          "\tlast_ofs=%" PRId64 "\n"
          "\tmagic=0x%" PRIx64 "\n"
          "\tmin_ofs=%" PRId64 "\n"
          "\tlast_ofs=%" PRId64 "\n"
@@ -126,7 +121,6 @@ int read_part_header(cls_method_context_t hctx,
          "\tmax_index=%" PRId64 "\n"
          "\tmax_time=%s\n",
          __PRETTY_FUNCTION__, __LINE__,
          "\tmax_index=%" PRId64 "\n"
          "\tmax_time=%s\n",
          __PRETTY_FUNCTION__, __LINE__,
-         part_header->tag.c_str(),
          part_header->magic,
          part_header->min_ofs,
          part_header->last_ofs,
          part_header->magic,
          part_header->min_ofs,
          part_header->last_ofs,
@@ -300,7 +294,7 @@ int create_meta(cls_method_context_t hctx,
   header.params.max_entry_size = op.max_entry_size;
   header.params.full_size_threshold = op.max_part_size - op.max_entry_size - part_entry_overhead;
 
   header.params.max_entry_size = op.max_entry_size;
   header.params.full_size_threshold = op.max_part_size - op.max_entry_size - part_entry_overhead;
 
-  r = write_header(hctx, header, false);
+  r = write_header(hctx, header);
   if (r < 0) {
     CLS_ERR("%s: failed to write header: r=%d", __PRETTY_FUNCTION__, r);
     return r;
   if (r < 0) {
     CLS_ERR("%s: failed to write header: r=%d", __PRETTY_FUNCTION__, r);
     return r;
@@ -344,19 +338,16 @@ int update_meta(cls_method_context_t hctx, ceph::buffer::list* in,
     .journal_entries_rm(
       std::move(op.journal_entries_rm));
 
     .journal_entries_rm(
       std::move(op.journal_entries_rm));
 
-  auto err = header.apply_update(u);
-  if (err) {
-    std::ostringstream ss;
-    ss << u;
-    CLS_ERR("%s: %s: %s", __PRETTY_FUNCTION__, err->c_str(),
-           ss.str().c_str());
-    return -EINVAL;
-  }
-
-  r = write_header(hctx, header);
-  if (r < 0) {
-    CLS_ERR("%s: failed to write header: r=%d", __PRETTY_FUNCTION__, r);
-    return r;
+  auto changed = header.apply_update(u);
+  if (changed) {
+    r = write_header(hctx, header);
+    if (r < 0) {
+      CLS_ERR("%s: failed to write header: r=%d", __PRETTY_FUNCTION__, r);
+      return r;
+    }
+  } else {
+    CLS_LOG(10, "%s: No change, nothing to write.",
+           __PRETTY_FUNCTION__);
   }
 
   return 0;
   }
 
   return 0;
@@ -406,11 +397,6 @@ int init_part(cls_method_context_t hctx, ceph::buffer::list* in,
 
   std::uint64_t size;
 
 
   std::uint64_t size;
 
-  if (op.tag.empty()) {
-    CLS_ERR("%s: tag required", __PRETTY_FUNCTION__);
-    return -EINVAL;
-  }
-
   int r = cls_cxx_stat2(hctx, &size, nullptr);
   if (r < 0 && r != -ENOENT) {
     CLS_ERR("ERROR: %s: cls_cxx_stat2() on obj returned %d", __PRETTY_FUNCTION__, r);
   int r = cls_cxx_stat2(hctx, &size, nullptr);
   if (r < 0 && r != -ENOENT) {
     CLS_ERR("ERROR: %s: cls_cxx_stat2() on obj returned %d", __PRETTY_FUNCTION__, r);
@@ -424,8 +410,7 @@ int init_part(cls_method_context_t hctx, ceph::buffer::list* in,
       return r;
     }
 
       return r;
     }
 
-    if (!(part_header.tag == op.tag &&
-          part_header.params == op.params)) {
+    if (!(part_header.params == op.params)) {
       CLS_ERR("%s: failed to re-create existing part with different "
              "params", __PRETTY_FUNCTION__);
       return -EEXIST;
       CLS_ERR("%s: failed to re-create existing part with different "
              "params", __PRETTY_FUNCTION__);
       return -EEXIST;
@@ -436,7 +421,6 @@ int init_part(cls_method_context_t hctx, ceph::buffer::list* in,
 
   part_header part_header;
 
 
   part_header part_header;
 
-  part_header.tag = op.tag;
   part_header.params = op.params;
 
   part_header.min_ofs = CLS_FIFO_MAX_PART_HEADER_SIZE;
   part_header.params = op.params;
 
   part_header.min_ofs = CLS_FIFO_MAX_PART_HEADER_SIZE;
@@ -475,11 +459,6 @@ int push_part(cls_method_context_t hctx, ceph::buffer::list* in,
     return -EINVAL;
   }
 
     return -EINVAL;
   }
 
-  if (op.tag.empty()) {
-    CLS_ERR("%s: tag required", __PRETTY_FUNCTION__);
-    return -EINVAL;
-  }
-
   part_header part_header;
   int r = read_part_header(hctx, &part_header);
   if (r < 0) {
   part_header part_header;
   int r = read_part_header(hctx, &part_header);
   if (r < 0) {
@@ -487,11 +466,6 @@ int push_part(cls_method_context_t hctx, ceph::buffer::list* in,
     return r;
   }
 
     return r;
   }
 
-  if (!(part_header.tag == op.tag)) {
-    CLS_ERR("%s: bad tag", __PRETTY_FUNCTION__);
-    return -EINVAL;
-  }
-
   std::uint64_t effective_len = op.total_len + op.data_bufs.size() *
     part_entry_overhead;
 
   std::uint64_t effective_len = op.total_len + op.data_bufs.size() *
     part_entry_overhead;
 
@@ -782,12 +756,6 @@ int trim_part(cls_method_context_t hctx,
     return r;
   }
 
     return r;
   }
 
-  if (op.tag &&
-      !(part_header.tag == *op.tag)) {
-    CLS_ERR("%s: bad tag", __PRETTY_FUNCTION__);
-    return -EINVAL;
-  }
-
   if (op.ofs < part_header.min_ofs) {
     return 0;
   }
   if (op.ofs < part_header.min_ofs) {
     return 0;
   }
@@ -866,12 +834,6 @@ int list_part(cls_method_context_t hctx, ceph::buffer::list* in,
     return r;
   }
 
     return r;
   }
 
-  if (op.tag &&
-      !(part_header.tag == *op.tag)) {
-    CLS_ERR("%s: bad tag", __PRETTY_FUNCTION__);
-    return -EINVAL;
-  }
-
   EntryReader reader(hctx, part_header, op.ofs);
 
   if (op.ofs >= part_header.min_ofs &&
   EntryReader reader(hctx, part_header, op.ofs);
 
   if (op.ofs >= part_header.min_ofs &&
@@ -885,8 +847,6 @@ int list_part(cls_method_context_t hctx, ceph::buffer::list* in,
 
   op::list_part_reply reply;
 
 
   op::list_part_reply reply;
 
-  reply.tag = part_header.tag;
-
   auto max_entries = std::min(op.max_entries, op::MAX_LIST_ENTRIES);
 
   for (int i = 0; i < max_entries && !reader.end(); ++i) {
   auto max_entries = std::min(op.max_entries, op::MAX_LIST_ENTRIES);
 
   for (int i = 0; i < max_entries && !reader.end(); ++i) {
index 91a012c0847ec4c842d3cc6b7e1b1aaa4cd2213d..e850c635c0b82e02c9a53044610911d46d5dc0a4 100644 (file)
@@ -149,17 +149,18 @@ WRITE_CLASS_ENCODER(update_meta)
 
 struct init_part
 {
 
 struct init_part
 {
-  std::string tag;
   data_params params;
 
   void encode(ceph::buffer::list& bl) const {
     ENCODE_START(1, 1, bl);
   data_params params;
 
   void encode(ceph::buffer::list& bl) const {
     ENCODE_START(1, 1, bl);
+    std::string tag;
     encode(tag, bl);
     encode(params, bl);
     ENCODE_FINISH(bl);
   }
   void decode(ceph::buffer::list::const_iterator& bl) {
     DECODE_START(1, bl);
     encode(tag, bl);
     encode(params, bl);
     ENCODE_FINISH(bl);
   }
   void decode(ceph::buffer::list::const_iterator& bl) {
     DECODE_START(1, bl);
+    std::string tag;
     decode(tag, bl);
     decode(params, bl);
     DECODE_FINISH(bl);
     decode(tag, bl);
     decode(params, bl);
     DECODE_FINISH(bl);
@@ -169,12 +170,12 @@ WRITE_CLASS_ENCODER(init_part)
 
 struct push_part
 {
 
 struct push_part
 {
-  std::string tag;
   std::deque<ceph::buffer::list> data_bufs;
   std::uint64_t total_len{0};
 
   void encode(ceph::buffer::list& bl) const {
     ENCODE_START(1, 1, bl);
   std::deque<ceph::buffer::list> data_bufs;
   std::uint64_t total_len{0};
 
   void encode(ceph::buffer::list& bl) const {
     ENCODE_START(1, 1, bl);
+    std::string tag;
     encode(tag, bl);
     encode(data_bufs, bl);
     encode(total_len, bl);
     encode(tag, bl);
     encode(data_bufs, bl);
     encode(total_len, bl);
@@ -182,6 +183,7 @@ struct push_part
   }
   void decode(ceph::buffer::list::const_iterator& bl) {
     DECODE_START(1, bl);
   }
   void decode(ceph::buffer::list::const_iterator& bl) {
     DECODE_START(1, bl);
+    std::string tag;
     decode(tag, bl);
     decode(data_bufs, bl);
     decode(total_len, bl);
     decode(tag, bl);
     decode(data_bufs, bl);
     decode(total_len, bl);
@@ -192,12 +194,12 @@ WRITE_CLASS_ENCODER(push_part)
 
 struct trim_part
 {
 
 struct trim_part
 {
-  std::optional<std::string> tag;
   std::uint64_t ofs{0};
   bool exclusive = false;
 
   void encode(ceph::buffer::list& bl) const {
     ENCODE_START(1, 1, bl);
   std::uint64_t ofs{0};
   bool exclusive = false;
 
   void encode(ceph::buffer::list& bl) const {
     ENCODE_START(1, 1, bl);
+    std::optional<std::string> tag;
     encode(tag, bl);
     encode(ofs, bl);
     encode(exclusive, bl);
     encode(tag, bl);
     encode(ofs, bl);
     encode(exclusive, bl);
@@ -205,6 +207,7 @@ struct trim_part
   }
   void decode(ceph::buffer::list::const_iterator& bl) {
     DECODE_START(1, bl);
   }
   void decode(ceph::buffer::list::const_iterator& bl) {
     DECODE_START(1, bl);
+    std::optional<std::string> tag;
     decode(tag, bl);
     decode(ofs, bl);
     decode(exclusive, bl);
     decode(tag, bl);
     decode(ofs, bl);
     decode(exclusive, bl);
@@ -215,12 +218,12 @@ WRITE_CLASS_ENCODER(trim_part)
 
 struct list_part
 {
 
 struct list_part
 {
-  std::optional<std::string> tag;
   std::uint64_t ofs{0};
   int max_entries{100};
 
   void encode(ceph::buffer::list& bl) const {
     ENCODE_START(1, 1, bl);
   std::uint64_t ofs{0};
   int max_entries{100};
 
   void encode(ceph::buffer::list& bl) const {
     ENCODE_START(1, 1, bl);
+    std::optional<std::string> tag;
     encode(tag, bl);
     encode(ofs, bl);
     encode(max_entries, bl);
     encode(tag, bl);
     encode(ofs, bl);
     encode(max_entries, bl);
@@ -228,6 +231,7 @@ struct list_part
   }
   void decode(ceph::buffer::list::const_iterator& bl) {
     DECODE_START(1, bl);
   }
   void decode(ceph::buffer::list::const_iterator& bl) {
     DECODE_START(1, bl);
+    std::optional<std::string> tag;
     decode(tag, bl);
     decode(ofs, bl);
     decode(max_entries, bl);
     decode(tag, bl);
     decode(ofs, bl);
     decode(max_entries, bl);
@@ -239,7 +243,6 @@ inline constexpr int MAX_LIST_ENTRIES = 512;
 
 struct list_part_reply
 {
 
 struct list_part_reply
 {
-  std::string tag;
   std::vector<part_list_entry> entries;
   bool more{false};
   bool full_part{false}; /* whether part is full or still can be written to.
   std::vector<part_list_entry> entries;
   bool more{false};
   bool full_part{false}; /* whether part is full or still can be written to.
@@ -247,6 +250,7 @@ struct list_part_reply
 
   void encode(ceph::buffer::list& bl) const {
     ENCODE_START(1, 1, bl);
 
   void encode(ceph::buffer::list& bl) const {
     ENCODE_START(1, 1, bl);
+    std::string tag;
     encode(tag, bl);
     encode(entries, bl);
     encode(more, bl);
     encode(tag, bl);
     encode(entries, bl);
     encode(more, bl);
@@ -255,6 +259,7 @@ struct list_part_reply
   }
   void decode(ceph::buffer::list::const_iterator& bl) {
     DECODE_START(1, bl);
   }
   void decode(ceph::buffer::list::const_iterator& bl) {
     DECODE_START(1, bl);
+    std::string tag;
     decode(tag, bl);
     decode(entries, bl);
     decode(more, bl);
     decode(tag, bl);
     decode(entries, bl);
     decode(more, bl);
index 8a471828b7a5ac139b8876cebdc53d2aaa5822f0..99101c10fb764ccbf54a9cee0ff45bbdee8834c0 100644 (file)
@@ -15,6 +15,7 @@
 
 #pragma once
 
 
 #pragma once
 
+#include <algorithm>
 #include <cstdint>
 #include <map>
 #include <optional>
 #include <cstdint>
 #include <map>
 #include <optional>
@@ -22,6 +23,8 @@
 #include <string>
 #include <vector>
 
 #include <string>
 #include <vector>
 
+#include <boost/container/flat_set.hpp>
+
 #undef FMT_HEADER_ONLY
 #define FMT_HEADER_ONLY 1
 #include <fmt/format.h>
 #undef FMT_HEADER_ONLY
 #define FMT_HEADER_ONLY 1
 #include <fmt/format.h>
@@ -63,7 +66,7 @@ struct objv {
            ver != rhs.ver);
   }
   bool same_or_later(const objv& rhs) const {
            ver != rhs.ver);
   }
   bool same_or_later(const objv& rhs) const {
-    return (instance == rhs.instance ||
+    return (instance == rhs.instance &&
            ver >= rhs.ver);
   }
 
            ver >= rhs.ver);
   }
 
@@ -118,19 +121,36 @@ inline std::ostream& operator <<(std::ostream& m, const data_params& d) {
 
 struct journal_entry {
   enum class Op {
 
 struct journal_entry {
   enum class Op {
-    unknown  = 0,
+    unknown  = -1,
     create   = 1,
     set_head = 2,
     remove   = 3,
   } op{Op::unknown};
 
     create   = 1,
     set_head = 2,
     remove   = 3,
   } op{Op::unknown};
 
-  std::int64_t part_num{0};
-  std::string part_tag;
+  std::int64_t part_num{-1};
+
+  bool valid() const {
+    switch (op) {
+    case fifo::journal_entry::Op::create: [[fallthrough]];
+    case fifo::journal_entry::Op::set_head: [[fallthrough]];
+    case fifo::journal_entry::Op::remove:
+      return part_num >= 0;
+
+    default:
+      return false;
+    }
+  }
+
+  journal_entry() = default;
+  journal_entry(Op op, std::int64_t part_num)
+    : op(op), part_num(part_num) {}
 
   void encode(ceph::buffer::list& bl) const {
 
   void encode(ceph::buffer::list& bl) const {
+    ceph_assert(valid());
     ENCODE_START(1, 1, bl);
     encode((int)op, bl);
     encode(part_num, bl);
     ENCODE_START(1, 1, bl);
     encode((int)op, bl);
     encode(part_num, bl);
+    std::string part_tag;
     encode(part_tag, bl);
     ENCODE_FINISH(bl);
   }
     encode(part_tag, bl);
     ENCODE_FINISH(bl);
   }
@@ -140,15 +160,24 @@ struct journal_entry {
     decode(i, bl);
     op = static_cast<Op>(i);
     decode(part_num, bl);
     decode(i, bl);
     op = static_cast<Op>(i);
     decode(part_num, bl);
+    std::string part_tag;
     decode(part_tag, bl);
     DECODE_FINISH(bl);
   }
   void dump(ceph::Formatter* f) const;
 
     decode(part_tag, bl);
     DECODE_FINISH(bl);
   }
   void dump(ceph::Formatter* f) const;
 
-  bool operator ==(const journal_entry& e) {
-    return (op == e.op &&
-           part_num == e.part_num &&
-           part_tag == e.part_tag);
+  friend bool operator ==(const journal_entry& lhs, const journal_entry& rhs) {
+    return (lhs.op == rhs.op &&
+           lhs.part_num == rhs.part_num);
+  }
+  friend bool operator <(const journal_entry& lhs, const journal_entry& rhs) {
+    if (lhs.op < rhs.op) {
+      return true;
+    } else if (lhs.op == rhs.op) {
+      return lhs.part_num < rhs.part_num;
+    } else {
+      return false;
+    }
   }
 };
 WRITE_CLASS_ENCODER(journal_entry)
   }
 };
 WRITE_CLASS_ENCODER(journal_entry)
@@ -167,23 +196,22 @@ inline std::ostream& operator <<(std::ostream& m, const journal_entry::Op& o) {
 }
 inline std::ostream& operator <<(std::ostream& m, const journal_entry& j) {
   return m << "op: " << j.op << ", "
 }
 inline std::ostream& operator <<(std::ostream& m, const journal_entry& j) {
   return m << "op: " << j.op << ", "
-          << "part_num: " << j.part_num <<  ", "
-          << "part_tag: " << j.part_tag;
+          << "part_num: " << j.part_num;
 }
 
 // This is actually a useful builder, since otherwise we end up with
 // four uint64_ts in a row and only care about a subset at a time.
 class update {
 }
 
 // This is actually a useful builder, since otherwise we end up with
 // four uint64_ts in a row and only care about a subset at a time.
 class update {
-  std::optional<std::uint64_t> tail_part_num_;
-  std::optional<std::uint64_t> head_part_num_;
-  std::optional<std::uint64_t> min_push_part_num_;
-  std::optional<std::uint64_t> max_push_part_num_;
+  std::optional<std::int64_t> tail_part_num_;
+  std::optional<std::int64_t> head_part_num_;
+  std::optional<std::int64_t> min_push_part_num_;
+  std::optional<std::int64_t> max_push_part_num_;
   std::vector<fifo::journal_entry> journal_entries_add_;
   std::vector<fifo::journal_entry> journal_entries_rm_;
 
 public:
 
   std::vector<fifo::journal_entry> journal_entries_add_;
   std::vector<fifo::journal_entry> journal_entries_rm_;
 
 public:
 
-  update&& tail_part_num(std::optional<std::uint64_t> num) noexcept {
+  update&& tail_part_num(std::optional<std::int64_t> num) noexcept {
     tail_part_num_ = num;
     return std::move(*this);
   }
     tail_part_num_ = num;
     return std::move(*this);
   }
@@ -191,7 +219,7 @@ public:
     return tail_part_num_;
   }
 
     return tail_part_num_;
   }
 
-  update&& head_part_num(std::optional<std::uint64_t> num) noexcept {
+  update&& head_part_num(std::optional<std::int64_t> num) noexcept {
     head_part_num_ = num;
     return std::move(*this);
   }
     head_part_num_ = num;
     return std::move(*this);
   }
@@ -199,7 +227,7 @@ public:
     return head_part_num_;
   }
 
     return head_part_num_;
   }
 
-  update&& min_push_part_num(std::optional<std::uint64_t> num)
+  update&& min_push_part_num(std::optional<std::int64_t> num)
     noexcept {
     min_push_part_num_ = num;
     return std::move(*this);
     noexcept {
     min_push_part_num_ = num;
     return std::move(*this);
@@ -208,7 +236,7 @@ public:
     return min_push_part_num_;
   }
 
     return min_push_part_num_;
   }
 
-  update&& max_push_part_num(std::optional<std::uint64_t> num) noexcept {
+  update&& max_push_part_num(std::optional<std::int64_t> num) noexcept {
     max_push_part_num_ = num;
     return std::move(*this);
   }
     max_push_part_num_ = num;
     return std::move(*this);
   }
@@ -309,11 +337,38 @@ struct info {
   std::int64_t min_push_part_num{0};
   std::int64_t max_push_part_num{-1};
 
   std::int64_t min_push_part_num{0};
   std::int64_t max_push_part_num{-1};
 
-  std::string head_tag;
-  std::map<int64_t, std::string> tags;
-
-  std::multimap<int64_t, journal_entry> journal;
+  boost::container::flat_set<journal_entry> journal;
+  static_assert(journal_entry::Op::create < journal_entry::Op::set_head);
+
+  // So we can get rid of the multimap without breaking compatibility
+  void encode_journal(bufferlist& bl) const {
+    using ceph::encode;
+    assert(journal.size() <= std::numeric_limits<uint32_t>::max());
+    uint32_t n = static_cast<uint32_t>(journal.size());
+    encode(n, bl);
+    for (const auto& entry : journal) {
+      encode(entry.part_num, bl);
+      encode(entry, bl);
+    }
+  }
 
 
+  void decode_journal( bufferlist::const_iterator& p) {
+    using ceph::decode;
+    uint32_t n;
+    decode(n, p);
+    journal.clear();
+    while (n--) {
+      decltype(journal_entry::part_num) dummy;
+      decode(dummy, p);
+      journal_entry e;
+      decode(e, p);
+      if (!e.valid()) {
+       throw ceph::buffer::malformed_input();
+      } else {
+       journal.insert(std::move(e));
+      }
+    }
+  }
   bool need_new_head() const {
     return (head_part_num < min_push_part_num);
   }
   bool need_new_head() const {
     return (head_part_num < min_push_part_num);
   }
@@ -332,9 +387,11 @@ struct info {
     encode(head_part_num, bl);
     encode(min_push_part_num, bl);
     encode(max_push_part_num, bl);
     encode(head_part_num, bl);
     encode(min_push_part_num, bl);
     encode(max_push_part_num, bl);
+    std::string head_tag;
+    std::map<int64_t, std::string> tags;
     encode(tags, bl);
     encode(head_tag, bl);
     encode(tags, bl);
     encode(head_tag, bl);
-    encode(journal, bl);
+    encode_journal(bl);
     ENCODE_FINISH(bl);
   }
   void decode(ceph::buffer::list::const_iterator& bl) {
     ENCODE_FINISH(bl);
   }
   void decode(ceph::buffer::list::const_iterator& bl) {
@@ -347,9 +404,11 @@ struct info {
     decode(head_part_num, bl);
     decode(min_push_part_num, bl);
     decode(max_push_part_num, bl);
     decode(head_part_num, bl);
     decode(min_push_part_num, bl);
     decode(max_push_part_num, bl);
+    std::string head_tag;
+    std::map<int64_t, std::string> tags;
     decode(tags, bl);
     decode(head_tag, bl);
     decode(tags, bl);
     decode(head_tag, bl);
-    decode(journal, bl);
+    decode_journal(bl);
     DECODE_FINISH(bl);
   }
   void dump(ceph::Formatter* f) const;
     DECODE_FINISH(bl);
   }
   void dump(ceph::Formatter* f) const;
@@ -359,61 +418,47 @@ struct info {
     return fmt::format("{}.{}", oid_prefix, part_num);
   }
 
     return fmt::format("{}.{}", oid_prefix, part_num);
   }
 
-  journal_entry next_journal_entry(std::string tag) const {
-    journal_entry entry;
-    entry.op = journal_entry::Op::create;
-    entry.part_num = max_push_part_num + 1;
-    entry.part_tag = std::move(tag);
-    return entry;
-  }
-
-  std::optional<std::string>
-  apply_update(const update& update) {
-    if (update.tail_part_num()) {
+  bool apply_update(const update& update) {
+    bool changed = false;
+    if (update.tail_part_num() && (tail_part_num != *update.tail_part_num())) {
       tail_part_num = *update.tail_part_num();
       tail_part_num = *update.tail_part_num();
+      changed = true;
     }
 
     }
 
-    if (update.min_push_part_num()) {
+    if (update.min_push_part_num() &&
+       (min_push_part_num !=  *update.min_push_part_num())) {
       min_push_part_num = *update.min_push_part_num();
       min_push_part_num = *update.min_push_part_num();
+      changed = true;
     }
 
     }
 
-    if (update.max_push_part_num()) {
+    if (update.max_push_part_num() &&
+       (max_push_part_num != *update.max_push_part_num())) {
       max_push_part_num = *update.max_push_part_num();
       max_push_part_num = *update.max_push_part_num();
+      changed = true;
     }
 
     for (const auto& entry : update.journal_entries_add()) {
     }
 
     for (const auto& entry : update.journal_entries_add()) {
-      auto iter = journal.find(entry.part_num);
-      if (iter != journal.end() &&
-         iter->second.op == entry.op) {
-       /* don't allow multiple concurrent (same) operations on the same part,
-          racing clients should use objv to avoid races anyway */
-       return fmt::format("multiple concurrent operations on same part are not "
-                          "allowed, part num={}", entry.part_num);
-      }
-
-      if (entry.op == journal_entry::Op::create) {
-       tags[entry.part_num] = entry.part_tag;
+      auto [iter, inserted] = journal.insert(entry);
+      if (inserted) {
+       changed = true;
       }
       }
-
-      journal.emplace(entry.part_num, entry);
     }
 
     for (const auto& entry : update.journal_entries_rm()) {
     }
 
     for (const auto& entry : update.journal_entries_rm()) {
-      journal.erase(entry.part_num);
+      auto count = journal.erase(entry);
+      if (count > 0) {
+       changed = true;
+      }
     }
 
     }
 
-    if (update.head_part_num()) {
-      tags.erase(head_part_num);
+    if (update.head_part_num() && (head_part_num != *update.head_part_num())) {
       head_part_num = *update.head_part_num();
       head_part_num = *update.head_part_num();
-      auto iter = tags.find(head_part_num);
-      if (iter != tags.end()) {
-       head_tag = iter->second;
-      } else {
-       head_tag.erase();
-      }
+      changed = true;
     }
     }
-
-    return std::nullopt;
+    if (changed) {
+      ++version.ver;
+    }
+    return changed;
   }
 };
 WRITE_CLASS_ENCODER(info)
   }
 };
 WRITE_CLASS_ENCODER(info)
@@ -426,8 +471,6 @@ inline std::ostream& operator <<(std::ostream& m, const info& i) {
           << "head_part_num: " << i.head_part_num << ", "
           << "min_push_part_num: " << i.min_push_part_num << ", "
           << "max_push_part_num: " << i.max_push_part_num << ", "
           << "head_part_num: " << i.head_part_num << ", "
           << "min_push_part_num: " << i.min_push_part_num << ", "
           << "max_push_part_num: " << i.max_push_part_num << ", "
-          << "head_tag: " << i.head_tag << ", "
-          << "tags: {" << i.tags << "}, "
           << "journal: {" << i.journal;
 }
 
           << "journal: {" << i.journal;
 }
 
@@ -468,8 +511,6 @@ inline std::ostream& operator <<(std::ostream& m,
 }
 
 struct part_header {
 }
 
 struct part_header {
-  std::string tag;
-
   data_params params;
 
   std::uint64_t magic{0};
   data_params params;
 
   std::uint64_t magic{0};
@@ -483,6 +524,7 @@ struct part_header {
 
   void encode(ceph::buffer::list& bl) const {
     ENCODE_START(1, 1, bl);
 
   void encode(ceph::buffer::list& bl) const {
     ENCODE_START(1, 1, bl);
+    std::string tag;
     encode(tag, bl);
     encode(params, bl);
     encode(magic, bl);
     encode(tag, bl);
     encode(params, bl);
     encode(magic, bl);
@@ -496,6 +538,7 @@ struct part_header {
   }
   void decode(ceph::buffer::list::const_iterator& bl) {
     DECODE_START(1, bl);
   }
   void decode(ceph::buffer::list::const_iterator& bl) {
     DECODE_START(1, bl);
+    std::string tag;
     decode(tag, bl);
     decode(params, bl);
     decode(magic, bl);
     decode(tag, bl);
     decode(params, bl);
     decode(magic, bl);
@@ -511,8 +554,7 @@ struct part_header {
 WRITE_CLASS_ENCODER(part_header)
 inline std::ostream& operator <<(std::ostream& m, const part_header& p) {
   using ceph::operator <<;
 WRITE_CLASS_ENCODER(part_header)
 inline std::ostream& operator <<(std::ostream& m, const part_header& p) {
   using ceph::operator <<;
-  return m << "tag: " << p.tag << ", "
-          << "params: {" << p.params << "}, "
+  return m << "params: {" << p.params << "}, "
           << "magic: " << p.magic << ", "
           << "min_ofs: " << p.min_ofs << ", "
           << "last_ofs: " << p.last_ofs << ", "
           << "magic: " << p.magic << ", "
           << "min_ofs: " << p.min_ofs << ", "
           << "last_ofs: " << p.last_ofs << ", "
index bd973352d425d88609d4e24c6a2ebb67af3f433e..b34d9929b93a136e6d7fa34db86d1e983b8c0b56 100644 (file)
@@ -14,6 +14,9 @@ using ceph::bufferlist;
 using ceph::decode;
 using ceph::encode;
 
 using ceph::decode;
 using ceph::encode;
 
+const uint64_t page_size = 4096;
+const uint64_t large_chunk_size = 1ul << 22;
+
 int queue_write_head(cls_method_context_t hctx, cls_queue_head& head)
 {
   bufferlist bl;
 int queue_write_head(cls_method_context_t hctx, cls_queue_head& head)
 {
   bufferlist bl;
@@ -43,7 +46,7 @@ int queue_write_head(cls_method_context_t hctx, cls_queue_head& head)
 
 int queue_read_head(cls_method_context_t hctx, cls_queue_head& head)
 {
 
 int queue_read_head(cls_method_context_t hctx, cls_queue_head& head)
 {
-  uint64_t chunk_size = 1024, start_offset = 0;
+  uint64_t chunk_size = page_size, start_offset = 0;
 
   bufferlist bl_head;
   const auto  ret = cls_cxx_read(hctx, start_offset, chunk_size, &bl_head);
 
   bufferlist bl_head;
   const auto  ret = cls_cxx_read(hctx, start_offset, chunk_size, &bl_head);
@@ -281,7 +284,6 @@ int queue_list_entries(cls_method_context_t hctx, const cls_queue_list_op& op, c
   }
 
   op_ret.is_truncated = true;
   }
 
   op_ret.is_truncated = true;
-  uint64_t chunk_size = 1024;
   uint64_t contiguous_data_size = 0, size_to_read = 0;
   bool wrap_around = false;
 
   uint64_t contiguous_data_size = 0, size_to_read = 0;
   bool wrap_around = false;
 
@@ -310,11 +312,7 @@ int queue_list_entries(cls_method_context_t hctx, const cls_queue_list_op& op, c
   
     bufferlist bl_chunk;
     //Read chunk size at a time, if it is less than contiguous data size, else read contiguous data size
   
     bufferlist bl_chunk;
     //Read chunk size at a time, if it is less than contiguous data size, else read contiguous data size
-    if (contiguous_data_size > chunk_size) {
-      size_to_read = chunk_size;
-    } else {
-      size_to_read = contiguous_data_size;
-    }
+    size_to_read = std::min(contiguous_data_size, large_chunk_size);
     CLS_LOG(10, "INFO: queue_list_entries(): size_to_read is %lu", size_to_read);
     if (size_to_read == 0) {
       next_marker = head.tail;
     CLS_LOG(10, "INFO: queue_list_entries(): size_to_read is %lu", size_to_read);
     if (size_to_read == 0) {
       next_marker = head.tail;
index 6c22256fd0d9774e0c82d277b56dcdb9b454010e..06a49f2343bf6b7368433202f26792d57abe3f98 100644 (file)
@@ -6957,6 +6957,9 @@ int snap_list(cls_method_context_t hctx, cls::rbd::GroupSnapshot start_after,
       group_snaps->push_back(snap);
     }
 
       group_snaps->push_back(snap);
     }
 
+    if (!vals.empty()) {
+      last_read = vals.rbegin()->first;
+    }
   } while (more && (group_snaps->size() < max_return));
 
   return 0;
   } while (more && (group_snaps->size() < max_return));
 
   return 0;
index d0046e87dc1f868618e1823afb69db07dd9a5d1f..f88a85e8d9e66fb4cbb00bd15391f1cc0d3b1d4f 100644 (file)
@@ -1102,12 +1102,28 @@ int rgw_bucket_complete_op(cls_method_context_t hctx, bufferlist *in, bufferlist
   if (op.op == CLS_RGW_OP_CANCEL) {
     log_op = false; // don't log cancelation
     if (op.tag.size()) {
   if (op.op == CLS_RGW_OP_CANCEL) {
     log_op = false; // don't log cancelation
     if (op.tag.size()) {
-      // we removed this tag from pending_map so need to write the changes
-      bufferlist new_key_bl;
-      encode(entry, new_key_bl);
-      rc = cls_cxx_map_set_val(hctx, idx, &new_key_bl);
-      if (rc < 0) {
-        return rc;
+      if (!entry.exists && entry.pending_map.empty()) {
+        // a racing delete succeeded, and we canceled the last pending op
+        CLS_LOG(20, "INFO: %s: removing map entry with key=%s",
+                __func__, escape_str(idx).c_str());
+        rc = cls_cxx_map_remove_key(hctx, idx);
+        if (rc < 0) {
+          CLS_LOG(1, "ERROR: %s: unable to remove map key, key=%s, rc=%d",
+                  __func__, escape_str(idx).c_str(), rc);
+          return rc;
+        }
+      } else {
+        // we removed this tag from pending_map so need to write the changes
+        CLS_LOG(20, "INFO: %s: setting map entry at key=%s",
+                __func__, escape_str(idx).c_str());
+        bufferlist new_key_bl;
+        encode(entry, new_key_bl);
+        rc = cls_cxx_map_set_val(hctx, idx, &new_key_bl);
+        if (rc < 0) {
+          CLS_LOG(1, "ERROR: %s: unable to set map val, key=%s, rc=%d",
+                  __func__, escape_str(idx).c_str(), rc);
+          return rc;
+        }
       }
     }
   } // CLS_RGW_OP_CANCEL
       }
     }
   } // CLS_RGW_OP_CANCEL
@@ -2762,7 +2778,9 @@ static int list_instance_entries(cls_method_context_t hctx,
   if (ret < 0 && ret != -ENOENT) {
     return ret;
   }
   if (ret < 0 && ret != -ENOENT) {
     return ret;
   }
-  bool found_first = (ret == 0);
+  // we need to include the exact match if a filter (name) is
+  // specified and the marker has not yet advanced (i.e., been set)
+  bool found_first = (ret == 0) && (start_after_key != marker);
   if (found_first) {
     --max;
   }
   if (found_first) {
     --max;
   }
@@ -2852,7 +2870,9 @@ static int list_olh_entries(cls_method_context_t hctx,
   if (ret < 0 && ret != -ENOENT) {
     return ret;
   }
   if (ret < 0 && ret != -ENOENT) {
     return ret;
   }
-  bool found_first = (ret == 0);
+    // we need to include the exact match if a filter (name) is
+   // specified and the marker has not yet advanced (i.e., been set)
+  bool found_first = (ret == 0) && (start_after_key != marker);
   if (found_first) {
     --max;
   }
   if (found_first) {
     --max;
   }
index 4667de8994d5a70d98348ddc497065d9e2d7d22f..32c5559a5d892c12916f4e5d9d5f053cf390fde5 100644 (file)
@@ -1196,6 +1196,7 @@ static bool issue_set_bucket_resharding(librados::IoCtx& io_ctx,
   call.entry = entry;
   encode(call, in);
   librados::ObjectWriteOperation op;
   call.entry = entry;
   encode(call, in);
   librados::ObjectWriteOperation op;
+  op.assert_exists(); // the shard must exist; if not fail rather than recreate
   op.exec(RGW_CLASS, RGW_SET_BUCKET_RESHARDING, in);
   return manager->aio_operate(io_ctx, shard_id, oid, &op);
 }
   op.exec(RGW_CLASS, RGW_SET_BUCKET_RESHARDING, in);
   return manager->aio_operate(io_ctx, shard_id, oid, &op);
 }
index c5e252e645a4785d4b2f8e9e0d3042117bf1d308..0bff6ad5d16804a64a57eeeb956a11cadb73e5ac 100644 (file)
@@ -838,6 +838,12 @@ struct cls_rgw_gc_set_entry_op {
 
   void dump(ceph::Formatter *f) const;
   static void generate_test_instances(std::list<cls_rgw_gc_set_entry_op*>& ls);
 
   void dump(ceph::Formatter *f) const;
   static void generate_test_instances(std::list<cls_rgw_gc_set_entry_op*>& ls);
+
+  size_t estimate_encoded_size() const {
+    constexpr size_t start_overhead = sizeof(__u8) + sizeof(__u8) + sizeof(ceph_le32); // version and length prefix
+    constexpr size_t expr_secs_overhead = sizeof(__u32); // expiration_seconds_overhead
+    return start_overhead + expr_secs_overhead + info.estimate_encoded_size();
+  }
 };
 WRITE_CLASS_ENCODER(cls_rgw_gc_set_entry_op)
 
 };
 WRITE_CLASS_ENCODER(cls_rgw_gc_set_entry_op)
 
index 67535841e2fc2831801c7501e6bda191f115f70c..54532c895668e23ad4b1f7d73e129c38d72af7df 100644 (file)
@@ -763,3 +763,21 @@ void cls_rgw_lc_obj_head::dump(Formatter *f) const
 void cls_rgw_lc_obj_head::generate_test_instances(list<cls_rgw_lc_obj_head*>& ls)
 {
 }
 void cls_rgw_lc_obj_head::generate_test_instances(list<cls_rgw_lc_obj_head*>& ls)
 {
 }
+
+std::ostream& operator<<(std::ostream& out, cls_rgw_reshard_status status) {
+  switch (status) {
+  case cls_rgw_reshard_status::NOT_RESHARDING:
+    out << "NOT_RESHARDING";
+    break;
+  case cls_rgw_reshard_status::IN_PROGRESS:
+    out << "IN_PROGRESS";
+    break;
+  case cls_rgw_reshard_status::DONE:
+    out << "DONE";
+    break;
+  default:
+    out << "UNKNOWN_STATUS";
+  }
+
+  return out;
+}
index cdaebe5ce21cda47669ffb6a9826ffca2e07954e..ddb527f00a02fdeaa4ebc9ce440cdbfc5e6d8c92 100644 (file)
@@ -417,6 +417,14 @@ struct cls_rgw_obj_key {
     ls.back()->name = "name";
     ls.back()->instance = "instance";
   }
     ls.back()->name = "name";
     ls.back()->instance = "instance";
   }
+
+  size_t estimate_encoded_size() const {
+    constexpr size_t start_overhead = sizeof(__u8) + sizeof(__u8) + sizeof(ceph_le32); // version and length prefix
+    constexpr size_t string_overhead = sizeof(__u32); // strings are encoded with 32-bit length prefix
+    return start_overhead +
+        string_overhead + name.size() +
+        string_overhead + instance.size();
+  }
 };
 WRITE_CLASS_ENCODER(cls_rgw_obj_key)
 
 };
 WRITE_CLASS_ENCODER(cls_rgw_obj_key)
 
@@ -775,6 +783,7 @@ enum class cls_rgw_reshard_status : uint8_t {
   IN_PROGRESS     = 1,
   DONE            = 2
 };
   IN_PROGRESS     = 1,
   DONE            = 2
 };
+std::ostream& operator<<(std::ostream&, cls_rgw_reshard_status);
 
 inline std::string to_string(const cls_rgw_reshard_status status)
 {
 
 inline std::string to_string(const cls_rgw_reshard_status status)
 {
@@ -833,9 +842,16 @@ struct cls_rgw_bucket_instance_entry {
   bool resharding() const {
     return reshard_status != RESHARD_STATUS::NOT_RESHARDING;
   }
   bool resharding() const {
     return reshard_status != RESHARD_STATUS::NOT_RESHARDING;
   }
+
   bool resharding_in_progress() const {
     return reshard_status == RESHARD_STATUS::IN_PROGRESS;
   }
   bool resharding_in_progress() const {
     return reshard_status == RESHARD_STATUS::IN_PROGRESS;
   }
+
+  friend std::ostream& operator<<(std::ostream& out, const cls_rgw_bucket_instance_entry& v) {
+    out << "cls_rgw_bucket_instance_entry:{ " << v.reshard_status <<
+      ", \"" << v.new_bucket_instance_id << "\", " << v.num_shards << " }";
+    return out;
+  }
 };
 WRITE_CLASS_ENCODER(cls_rgw_bucket_instance_entry)
 
 };
 WRITE_CLASS_ENCODER(cls_rgw_bucket_instance_entry)
 
@@ -1146,6 +1162,16 @@ struct cls_rgw_obj {
     ls.back()->key.name = "myoid";
     ls.back()->loc = "mykey";
   }
     ls.back()->key.name = "myoid";
     ls.back()->loc = "mykey";
   }
+
+  size_t estimate_encoded_size() const {
+    constexpr size_t start_overhead = sizeof(__u8) + sizeof(__u8) + sizeof(ceph_le32); // version and length prefix
+    constexpr size_t string_overhead = sizeof(__u32); // strings are encoded with 32-bit length prefix
+    return start_overhead +
+        string_overhead + pool.size() +
+        string_overhead + key.name.size() +
+        string_overhead + loc.size() +
+        key.estimate_encoded_size();
+  }
 };
 WRITE_CLASS_ENCODER(cls_rgw_obj)
 
 };
 WRITE_CLASS_ENCODER(cls_rgw_obj)
 
@@ -1190,6 +1216,16 @@ struct cls_rgw_obj_chain {
   bool empty() {
     return objs.empty();
   }
   bool empty() {
     return objs.empty();
   }
+
+  size_t estimate_encoded_size() const {
+    constexpr size_t start_overhead = sizeof(__u8) + sizeof(__u8) + sizeof(ceph_le32);
+    constexpr size_t size_overhead = sizeof(__u32); // size of the chain
+    size_t chain_overhead = 0;
+    for (auto& it : objs) {
+      chain_overhead += it.estimate_encoded_size();
+    }
+    return (start_overhead + size_overhead + chain_overhead);
+  }
 };
 WRITE_CLASS_ENCODER(cls_rgw_obj_chain)
 
 };
 WRITE_CLASS_ENCODER(cls_rgw_obj_chain)
 
@@ -1231,6 +1267,14 @@ struct cls_rgw_gc_obj_info
     ceph_timespec ts{ceph_le32(21), ceph_le32(32)};
     ls.back()->time = ceph::real_clock::from_ceph_timespec(ts);
   }
     ceph_timespec ts{ceph_le32(21), ceph_le32(32)};
     ls.back()->time = ceph::real_clock::from_ceph_timespec(ts);
   }
+
+  size_t estimate_encoded_size() const {
+    constexpr size_t start_overhead = sizeof(__u8) + sizeof(__u8) + sizeof(ceph_le32); // version and length prefix
+    constexpr size_t string_overhead = sizeof(__u32); // strings are encoded with 32-bit length prefix
+    constexpr size_t time_overhead = 2 * sizeof(ceph_le32); // time is stored as tv_sec and tv_nsec
+    return start_overhead + string_overhead + tag.size() +
+            time_overhead + chain.estimate_encoded_size();
+  }
 };
 WRITE_CLASS_ENCODER(cls_rgw_gc_obj_info)
 
 };
 WRITE_CLASS_ENCODER(cls_rgw_gc_obj_info)
 
index 2221de6462f37bac4b664cc5e4823e09bee9c75a..5828daebc17ccd4d6bbbb515024eb27ef4b74e66 100644 (file)
@@ -396,6 +396,8 @@ void OutputDataSocket::append_output(ceph::buffer::list& bl)
       skipped = 1;
     } else
       ++skipped;
       skipped = 1;
     } else
       ++skipped;
+
+    cond.notify_all();
     return;
   }
 
     return;
   }
 
index 01021d94193bf10034828f61a2196b2b61ad5fa8..2211dd7340f215d2061da8a15d9b87c7395d0b2c 100644 (file)
@@ -623,6 +623,7 @@ void AdminSocket::unregister_commands(const AdminSocketHook *hook)
 class VersionHook : public AdminSocketHook {
 public:
   int call(std::string_view command, const cmdmap_t& cmdmap,
 class VersionHook : public AdminSocketHook {
 public:
   int call(std::string_view command, const cmdmap_t& cmdmap,
+          const bufferlist&,
           Formatter *f,
           std::ostream& errss,
           bufferlist& out) override {
           Formatter *f,
           std::ostream& errss,
           bufferlist& out) override {
@@ -649,6 +650,7 @@ class HelpHook : public AdminSocketHook {
 public:
   explicit HelpHook(AdminSocket *as) : m_as(as) {}
   int call(std::string_view command, const cmdmap_t& cmdmap,
 public:
   explicit HelpHook(AdminSocket *as) : m_as(as) {}
   int call(std::string_view command, const cmdmap_t& cmdmap,
+          const bufferlist&,
           Formatter *f,
           std::ostream& errss,
           bufferlist& out) override {
           Formatter *f,
           std::ostream& errss,
           bufferlist& out) override {
@@ -667,6 +669,7 @@ class GetdescsHook : public AdminSocketHook {
 public:
   explicit GetdescsHook(AdminSocket *as) : m_as(as) {}
   int call(std::string_view command, const cmdmap_t& cmdmap,
 public:
   explicit GetdescsHook(AdminSocket *as) : m_as(as) {}
   int call(std::string_view command, const cmdmap_t& cmdmap,
+          const bufferlist&,
           Formatter *f,
           std::ostream& errss,
           bufferlist& out) override {
           Formatter *f,
           std::ostream& errss,
           bufferlist& out) override {
index c5d2b48e563bf0414f19e2e4362f7ad177a75886..3f364a5b711c7db22a9e14e13af5f64afd97d5fc 100644 (file)
@@ -60,6 +60,7 @@ public:
   virtual int call(
     std::string_view command,
     const cmdmap_t& cmdmap,
   virtual int call(
     std::string_view command,
     const cmdmap_t& cmdmap,
+    const ceph::buffer::list& inbl,
     ceph::Formatter *f,
     std::ostream& errss,
     ceph::buffer::list& out) = 0;
     ceph::Formatter *f,
     std::ostream& errss,
     ceph::buffer::list& out) = 0;
@@ -96,7 +97,7 @@ public:
     // by default, call the synchronous handler and then finish
     ceph::buffer::list out;
     std::ostringstream errss;
     // by default, call the synchronous handler and then finish
     ceph::buffer::list out;
     std::ostringstream errss;
-    int r = call(command, cmdmap, f, errss, out);
+    int r = call(command, cmdmap, inbl, f, errss, out);
     on_finish(r, errss.str(), out);
   }
   virtual ~AdminSocketHook() {}
     on_finish(r, errss.str(), out);
   }
   virtual ~AdminSocketHook() {}
index df23ae7a60f1842ef03bbcba828bfeb3c0b59c61..f902e842d68a4fb14d8fb19f5b6c76fea76d75ce 100644 (file)
@@ -182,6 +182,7 @@ public:
 
   // AdminSocketHook
   int call(std::string_view command, const cmdmap_t& cmdmap,
 
   // AdminSocketHook
   int call(std::string_view command, const cmdmap_t& cmdmap,
+          const bufferlist& inbl,
           ceph::Formatter *f,
           std::ostream& errss,
           bufferlist& out) override {
           ceph::Formatter *f,
           std::ostream& errss,
           bufferlist& out) override {
@@ -442,6 +443,7 @@ public:
   explicit CephContextHook(CephContext *cct) : m_cct(cct) {}
 
   int call(std::string_view command, const cmdmap_t& cmdmap,
   explicit CephContextHook(CephContext *cct) : m_cct(cct) {}
 
   int call(std::string_view command, const cmdmap_t& cmdmap,
+          const bufferlist& inbl,
           Formatter *f,
           std::ostream& errss,
           bufferlist& out) override {
           Formatter *f,
           std::ostream& errss,
           bufferlist& out) override {
@@ -502,6 +504,14 @@ int CephContext::do_command(std::string_view command, const cmdmap_t& cmdmap,
   }
 }
 
   }
 }
 
+#pragma GCC push_options
+#pragma GCC optimize ("O0")
+static void leak_some_memory() {
+  volatile char *foo = new char[1234];
+  (void)foo;
+}
+#pragma GCC pop_options
+
 int CephContext::_do_command(
   std::string_view command, const cmdmap_t& cmdmap,
   Formatter *f,
 int CephContext::_do_command(
   std::string_view command, const cmdmap_t& cmdmap,
   Formatter *f,
@@ -520,8 +530,7 @@ int CephContext::_do_command(
     }
   }
   if (command == "leak_some_memory") {
     }
   }
   if (command == "leak_some_memory") {
-    char *foo = new char[1234];
-    (void)foo;
+    leak_some_memory();
   }
   else if (command == "perfcounters_dump" || command == "1" ||
       command == "perf dump") {
   }
   else if (command == "perfcounters_dump" || command == "1" ||
       command == "perf dump") {
index 113a3ca894a7d407fb3187c33b4ccc908bdd9b60..ced037d384286a1afea036789e28c4f137d4d751 100644 (file)
@@ -277,6 +277,7 @@ const char *ceph_mds_op_name(int op)
        case CEPH_MDS_OP_LOOKUPINO:  return "lookupino";
        case CEPH_MDS_OP_LOOKUPNAME:  return "lookupname";
        case CEPH_MDS_OP_GETATTR:  return "getattr";
        case CEPH_MDS_OP_LOOKUPINO:  return "lookupino";
        case CEPH_MDS_OP_LOOKUPNAME:  return "lookupname";
        case CEPH_MDS_OP_GETATTR:  return "getattr";
+       case CEPH_MDS_OP_DUMMY:  return "dummy";
        case CEPH_MDS_OP_SETXATTR: return "setxattr";
        case CEPH_MDS_OP_SETATTR: return "setattr";
        case CEPH_MDS_OP_RMXATTR: return "rmxattr";
        case CEPH_MDS_OP_SETXATTR: return "setxattr";
        case CEPH_MDS_OP_SETATTR: return "setattr";
        case CEPH_MDS_OP_RMXATTR: return "rmxattr";
index 3bba588296951c7002032366f8dcc5f4f5b74888..2e8d3304bf6c01f1783358d47a585ea3762641a0 100644 (file)
@@ -4005,6 +4005,18 @@ options:
   desc: Allocation unit size for primary/shared device
   default: 64_K
   with_legacy: true
   desc: Allocation unit size for primary/shared device
   default: 64_K
   with_legacy: true
+- name: bluefs_failed_shared_alloc_cooldown
+  type: float
+  level: advanced
+  desc: duration(in seconds) untill the next attempt to use
+   'bluefs_shared_alloc_size' after facing ENOSPC failure.
+  long_desc: Cooldown period(in seconds) when BlueFS uses shared/slow device
+   allocation size instead of "bluefs_shared_alloc_size' one after facing
+   recoverable (via fallback to smaller chunk size) ENOSPC failure. Intended
+   primarily to avoid repetitive unsuccessful allocations which might be
+   expensive.
+  default: 600
+  with_legacy: true
 - name: bluefs_max_prefetch
   type: size
   level: advanced
 - name: bluefs_max_prefetch
   type: size
   level: advanced
@@ -4161,7 +4173,7 @@ options:
 - name: bluestore_bluefs_alloc_failure_dump_interval
   type: float
   level: advanced
 - name: bluestore_bluefs_alloc_failure_dump_interval
   type: float
   level: advanced
-  desc: How frequently (in seconds) to dump allocator onBlueFS space allocation failure
+  desc: How frequently (in seconds) to dump allocator on BlueFS space allocation failure
   default: 0
   with_legacy: true
 - name: bluestore_spdk_mem
   default: 0
   with_legacy: true
 - name: bluestore_spdk_mem
@@ -4974,6 +4986,14 @@ options:
   desc: Remove allocation info from RocksDB and store the info in a new allocation file
   default: true
   with_legacy: true
   desc: Remove allocation info from RocksDB and store the info in a new allocation file
   default: true
   with_legacy: true
+- name: bluestore_debug_inject_allocation_from_file_failure
+  type: float
+  level: dev
+  desc: Enables random error injections when restoring allocation map from file.
+  long_desc: Specifies error injection probability for restoring allocation map from file
+    hence causing full recovery. Intended primarily for testing.
+  default: 0
+  with_legacy: true
 - name: bluestore_fsck_on_umount_deep
   type: bool
   level: dev
 - name: bluestore_fsck_on_umount_deep
   type: bool
   level: dev
index fa9327e5e3a7157587f35fed37772b63b81cdcca..7725901a42db5b5159f1f89c2c6d837863d11dfc 100644 (file)
@@ -453,6 +453,14 @@ options:
   services:
   - mds_client
   with_legacy: true
   services:
   - mds_client
   with_legacy: true
+- name: client_max_retries_on_remount_failure
+  type: uint
+  level: advanced
+  desc: number of consecutive failed remount attempts for invalidating kernel dcache
+    after which client would abort.
+  default: 5
+  services:
+  - mds_client
 - name: client_die_on_failed_remount
   type: bool
   level: dev
 - name: client_die_on_failed_remount
   type: bool
   level: dev
index 45a7862f76537d34683a994d4a51f74d0d3c721c..905de50593a964cc64672a27806647cbe0b458b9 100644 (file)
@@ -1324,14 +1324,6 @@ options:
   default: 0
   services:
   - mds
   default: 0
   services:
   - mds
-- name: mds_max_retries_on_remount_failure
-  type: uint
-  level: advanced
-  desc: number of consecutive failed remount attempts for invalidating kernel dcache
-    after which client would abort.
-  default: 5
-  services:
-  - mds
 - name: mds_dump_cache_threshold_formatter
   type: size
   level: dev
 - name: mds_dump_cache_threshold_formatter
   type: size
   level: dev
index d8c98b1f271eba6b57634f0bb15c06a37fa51587..926c4bee6505a372b8a56bf6f7fa8ac5590841c6 100644 (file)
@@ -973,7 +973,7 @@ options:
     cost factor in QoS calculations. Only considered for osd_op_queue = mclock_scheduler
   fmt_desc: Cost per IO in microseconds to consider per OSD (for rotational
     media)
     cost factor in QoS calculations. Only considered for osd_op_queue = mclock_scheduler
   fmt_desc: Cost per IO in microseconds to consider per OSD (for rotational
     media)
-  default: 25000
+  default: 11400
   flags:
   - runtime
 - name: osd_mclock_cost_per_io_usec_ssd
   flags:
   - runtime
 - name: osd_mclock_cost_per_io_usec_ssd
@@ -1012,7 +1012,7 @@ options:
     = mclock_scheduler
   fmt_desc: Cost per byte in microseconds to consider per OSD (for rotational
     media)
     = mclock_scheduler
   fmt_desc: Cost per byte in microseconds to consider per OSD (for rotational
     media)
-  default: 5.2
+  default: 2.6
   flags:
   - runtime
 - name: osd_mclock_cost_per_byte_usec_ssd
   flags:
   - runtime
 - name: osd_mclock_cost_per_byte_usec_ssd
@@ -1107,6 +1107,53 @@ options:
   - custom
   flags:
   - runtime
   - custom
   flags:
   - runtime
+- name: osd_mclock_override_recovery_settings
+  type: bool
+  level: advanced
+  desc: Setting this option enables the override of recovery/backfill limits
+    for the mClock scheduler.
+  long_desc: This option when set enables the override of the max recovery
+    active and the max backfills limits with mClock scheduler active. These
+    options are not modifiable when mClock scheduler is active. Any attempt
+    to modify these values without setting this option will reset the
+    recovery or backfill option back to its default value.
+  fmt_desc: Setting this option will enable the override of the
+    recovery/backfill limits for the mClock scheduler as defined by the
+    ``osd_recovery_max_active_hdd``, ``osd_recovery_max_active_ssd`` and
+    ``osd_max_backfills`` options.
+  default: false
+  see_also:
+  - osd_recovery_max_active_hdd
+  - osd_recovery_max_active_ssd
+  - osd_max_backfills
+  flags:
+  - runtime
+- name: osd_mclock_iops_capacity_threshold_hdd
+  type: float
+  level: basic
+  desc: The threshold IOPs capacity (at 4KiB block size) beyond which to ignore
+    the OSD bench results for an OSD (for rotational media)
+  long_desc: This option specifies the threshold IOPS capacity for an OSD under
+    which the OSD bench results can be considered for QoS calculations. Only
+    considered for osd_op_queue = mclock_scheduler
+  fmt_desc: The threshold IOPS capacity (at 4KiB block size) beyond which to
+    ignore OSD bench results for an OSD (for rotational media)
+  default: 500
+  flags:
+  - runtime
+- name: osd_mclock_iops_capacity_threshold_ssd
+  type: float
+  level: basic
+  desc: The threshold IOPs capacity (at 4KiB block size) beyond which to ignore
+    the OSD bench results for an OSD (for solid state media)
+  long_desc: This option specifies the threshold IOPS capacity for an OSD under
+    which the OSD bench results can be considered for QoS calculations. Only
+    considered for osd_op_queue = mclock_scheduler
+  fmt_desc: The threshold IOPS capacity (at 4KiB block size) beyond which to
+    ignore OSD bench results for an OSD (for solid state media)
+  default: 80000
+  flags:
+  - runtime
 # Set to true for testing.  Users should NOT set this.
 # If set to true even after reading enough shards to
 # decode the object, any error will be reported.
 # Set to true for testing.  Users should NOT set this.
 # If set to true even after reading enough shards to
 # decode the object, any error will be reported.
index 0ab19292582b5d8701e3e458d6220d5782a66e0e..b1a36e0729128024c13b83adc2b4fe862c168c9e 100644 (file)
@@ -14,6 +14,7 @@
 
 #include "common/pick_address.h"
 
 
 #include "common/pick_address.h"
 
+#include <bitset>
 #include <netdb.h>
 #include <netinet/in.h>
 #include <string>
 #include <netdb.h>
 #include <netinet/in.h>
 #include <string>
@@ -354,10 +355,13 @@ int pick_addresses(
   addrs->v.clear();
 
   unsigned addrt = (flags & (CEPH_PICK_ADDRESS_PUBLIC |
   addrs->v.clear();
 
   unsigned addrt = (flags & (CEPH_PICK_ADDRESS_PUBLIC |
+                            CEPH_PICK_ADDRESS_PUBLIC_BIND |
                             CEPH_PICK_ADDRESS_CLUSTER));
                             CEPH_PICK_ADDRESS_CLUSTER));
-  if (addrt == 0 ||
-      addrt == (CEPH_PICK_ADDRESS_PUBLIC |
-               CEPH_PICK_ADDRESS_CLUSTER)) {
+  // TODO: move to std::popcount when it's available for all release lines
+  // we are interested in (quincy was a blocker at the time of writing)
+  if (std::bitset<sizeof(addrt)*CHAR_BIT>(addrt).count() != 1) {
+    // these flags are mutually exclusive and one of them must be
+    // always set (in other words: it's mode selection).
     return -EINVAL;
   }
   unsigned msgrv = flags & (CEPH_PICK_ADDRESS_MSGR1 |
     return -EINVAL;
   }
   unsigned msgrv = flags & (CEPH_PICK_ADDRESS_MSGR1 |
@@ -400,6 +404,13 @@ int pick_addresses(
     networks = cct->_conf.get_val<std::string>("public_network");
     interfaces =
       cct->_conf.get_val<std::string>("public_network_interface");
     networks = cct->_conf.get_val<std::string>("public_network");
     interfaces =
       cct->_conf.get_val<std::string>("public_network_interface");
+  } else if (addrt & CEPH_PICK_ADDRESS_PUBLIC_BIND) {
+    addr = cct->_conf.get_val<entity_addr_t>("public_bind_addr");
+    // XXX: we don't support _network nor _network_interface for
+    // the public_bind addrs yet.
+    if (addr.is_blank_ip()) {
+      return -ENOENT;
+    }
   } else {
     addr = cct->_conf.get_val<entity_addr_t>("cluster_addr");
     networks = cct->_conf.get_val<std::string>("cluster_network");
   } else {
     addr = cct->_conf.get_val<entity_addr_t>("cluster_addr");
     networks = cct->_conf.get_val<std::string>("cluster_network");
index 1faf60dbd75bcf65f183311df305d7f2cbcc377e..4fd77e546f1081051e808dcf80adf3dedced9cc7 100644 (file)
@@ -20,6 +20,7 @@ class entity_addrvec_t;
 #define CEPH_PICK_ADDRESS_IPV6        0x20
 #define CEPH_PICK_ADDRESS_PREFER_IPV4 0x40
 #define CEPH_PICK_ADDRESS_DEFAULT_MON_PORTS  0x80
 #define CEPH_PICK_ADDRESS_IPV6        0x20
 #define CEPH_PICK_ADDRESS_PREFER_IPV4 0x40
 #define CEPH_PICK_ADDRESS_DEFAULT_MON_PORTS  0x80
+#define CEPH_PICK_ADDRESS_PUBLIC_BIND 0x100
 
 #ifndef WITH_SEASTAR
 /*
 
 #ifndef WITH_SEASTAR
 /*
index 52171809b23fde1cf84e56a8b0ff1af22a20006f..bd7cc439e8dc3e8417a2cf46a159032a2e2de9b2 100644 (file)
@@ -17,6 +17,7 @@
 
 #include <algorithm>
 #include <array>
 
 #include <algorithm>
 #include <array>
+#include <cstdint>
 
 enum ceph_subsys_id_t {
   ceph_subsys_,   // default
 
 enum ceph_subsys_id_t {
   ceph_subsys_,   // default
index 9b10fff53301ce28055f48cdb97de614c1317603..ed2ad31552a0b87b750b04af4558670f2c189b53 100644 (file)
@@ -12,6 +12,7 @@ if(HAVE_QATZIP AND HAVE_QATDRV)
                         qatzip::qatzip
                        )
 endif()
                         qatzip::qatzip
                        )
 endif()
+add_dependencies(compressor_objs legacy-option-headers)
 
 ## compressor plugins
 
 
 ## compressor plugins
 
index 372e0b9d4603901df016a489c154c4133a60f568..4f99cffaaa9ef30e9f7b147a984b0f6e54605391 100644 (file)
 #include "include/stringify.h"
 #include "CrushTester.h"
 #include "CrushTreeDumper.h"
 #include "include/stringify.h"
 #include "CrushTester.h"
 #include "CrushTreeDumper.h"
+#include "common/ceph_context.h"
 #include "include/ceph_features.h"
 #include "include/ceph_features.h"
+#include "common/debug.h"
 
 
+#define dout_subsys ceph_subsys_crush
+#undef dout_prefix
+#define dout_prefix *_dout << "CrushTester: "
 
 using std::cerr;
 using std::cout;
 
 using std::cerr;
 using std::cout;
@@ -365,11 +370,12 @@ void CrushTester::write_integer_indexed_scalar_data_string(vector<string> &dst,
   dst.push_back( data_buffer.str() );
 }
 
   dst.push_back( data_buffer.str() );
 }
 
-int CrushTester::test_with_fork(int timeout)
+int CrushTester::test_with_fork(CephContext* cct, int timeout)
 {
 {
+  ldout(cct, 20) << __func__ << dendl;
   ostringstream sink;
   int r = fork_function(timeout, sink, [&]() {
   ostringstream sink;
   int r = fork_function(timeout, sink, [&]() {
-      return test();
+      return test(cct);
     });
   if (r == -ETIMEDOUT) {
     err << "timed out during smoke test (" << timeout << " seconds)";
     });
   if (r == -ETIMEDOUT) {
     err << "timed out during smoke test (" << timeout << " seconds)";
@@ -429,8 +435,9 @@ bool CrushTester::check_name_maps(unsigned max_id) const
   return true;
 }
 
   return true;
 }
 
-int CrushTester::test()
+int CrushTester::test(CephContext* cct)
 {
 {
+  ldout(cct, 20) << dendl;
   if (min_rule < 0 || max_rule < 0) {
     min_rule = 0;
     max_rule = crush.get_max_rules() - 1;
   if (min_rule < 0 || max_rule < 0) {
     min_rule = 0;
     max_rule = crush.get_max_rules() - 1;
@@ -477,6 +484,8 @@ int CrushTester::test()
     crush.start_choose_profile();
   
   for (int r = min_rule; r < crush.get_max_rules() && r <= max_rule; r++) {
     crush.start_choose_profile();
   
   for (int r = min_rule; r < crush.get_max_rules() && r <= max_rule; r++) {
+    ldout(cct, 20) << "rule: " << r << dendl;
+
     if (!crush.rule_exists(r)) {
       if (output_statistics)
         err << "rule " << r << " dne" << std::endl;
     if (!crush.rule_exists(r)) {
       if (output_statistics)
         err << "rule " << r << " dne" << std::endl;
@@ -490,6 +499,8 @@ int CrushTester::test()
       << std::endl;
 
     for (int nr = min_rep; nr <= max_rep; nr++) {
       << std::endl;
 
     for (int nr = min_rep; nr <= max_rep; nr++) {
+      ldout(cct, 20) << "current numrep: " << nr << dendl;
+
       vector<int> per(crush.get_max_devices());
       map<int,int> sizes;
 
       vector<int> per(crush.get_max_devices());
       map<int,int> sizes;
 
@@ -635,6 +646,8 @@ int CrushTester::test()
           }
         }
 
           }
         }
 
+      ldout(cct, 20) << "output statistics created" << dendl;
+
       if (output_data_file)
         for (unsigned i = 0; i < per.size(); i++) {
           vector_data_buffer_f.clear();
       if (output_data_file)
         for (unsigned i = 0; i < per.size(); i++) {
           vector_data_buffer_f.clear();
@@ -655,10 +668,13 @@ int CrushTester::test()
         }
       }
 
         }
       }
 
+      ldout(cct, 20) << "output data file created" << dendl;
       string rule_tag = crush.get_rule_name(r);
 
       if (output_csv)
         write_data_set_to_csv(output_data_file_name+rule_tag,tester_data);
       string rule_tag = crush.get_rule_name(r);
 
       if (output_csv)
         write_data_set_to_csv(output_data_file_name+rule_tag,tester_data);
+
+      ldout(cct, 20) << "successfully written csv" << dendl;
     }
   }
 
     }
   }
 
index aa3d904b6222fbc3735bd861840a5247a1052904..54f597651f845c34dd31de966f50565c2530c6ac 100644 (file)
@@ -5,6 +5,7 @@
 #define CEPH_CRUSH_TESTER_H
 
 #include "crush/CrushWrapper.h"
 #define CEPH_CRUSH_TESTER_H
 
 #include "crush/CrushWrapper.h"
+#include "include/common_fwd.h"
 
 #include <fstream>
 
 
 #include <fstream>
 
@@ -347,8 +348,8 @@ public:
    *         large, true otherwise
    */
   bool check_name_maps(unsigned max_id = 0) const;
    *         large, true otherwise
    */
   bool check_name_maps(unsigned max_id = 0) const;
-  int test();
-  int test_with_fork(int timeout);
+  int test(CephContext* cct);
+  int test_with_fork(CephContext* cct, int timeout);
 
   int compare(CrushWrapper& other);
 };
 
   int compare(CrushWrapper& other);
 };
index 7f88113b9905690e6abc426041b64fef70654190..a8fef46548e92aa05bab4d0293beb3015b59fa2d 100644 (file)
@@ -1,13 +1,4 @@
 #include "DaemonMetricCollector.h"
 #include "DaemonMetricCollector.h"
-#include "common/admin_socket_client.h"
-#include "common/debug.h"
-#include "common/hostname.h"
-#include "common/perf_counters.h"
-#include "global/global_init.h"
-#include "global/global_context.h"
-#include "common/split.h"
-#include "include/common_fwd.h"
-#include "util.h"
 
 #include <boost/json/src.hpp>
 #include <chrono>
 
 #include <boost/json/src.hpp>
 #include <chrono>
 #include <string>
 #include <utility>
 
 #include <string>
 #include <utility>
 
+#include "common/admin_socket_client.h"
+#include "common/debug.h"
+#include "common/hostname.h"
+#include "common/perf_counters.h"
+#include "common/split.h"
+#include "global/global_context.h"
+#include "global/global_init.h"
+#include "include/common_fwd.h"
+#include "util.h"
+
 #define dout_context g_ceph_context
 #define dout_subsys ceph_subsys_ceph_exporter
 
 #define dout_context g_ceph_context
 #define dout_subsys ceph_subsys_ceph_exporter
 
@@ -86,48 +87,62 @@ void DaemonMetricCollector::dump_asok_metrics() {
 
   std::vector<std::pair<std::string, int>> daemon_pids;
 
 
   std::vector<std::pair<std::string, int>> daemon_pids;
 
+  int failures = 0;
   bool sort = g_conf().get_val<bool>("exporter_sort_metrics");
   if (sort) {
   bool sort = g_conf().get_val<bool>("exporter_sort_metrics");
   if (sort) {
-    builder = std::unique_ptr<OrderedMetricsBuilder>(new OrderedMetricsBuilder());
+    builder =
+        std::unique_ptr<OrderedMetricsBuilder>(new OrderedMetricsBuilder());
   } else {
   } else {
-    builder = std::unique_ptr<UnorderedMetricsBuilder>(new UnorderedMetricsBuilder());
+    builder =
+        std::unique_ptr<UnorderedMetricsBuilder>(new UnorderedMetricsBuilder());
   }
   for (auto &[daemon_name, sock_client] : clients) {
     bool ok;
     sock_client.ping(&ok);
     if (!ok) {
   }
   for (auto &[daemon_name, sock_client] : clients) {
     bool ok;
     sock_client.ping(&ok);
     if (!ok) {
+      failures++;
       continue;
     }
       continue;
     }
-    std::string perf_dump_response = asok_request(sock_client, "perf dump", daemon_name);
+    std::string perf_dump_response =
+        asok_request(sock_client, "perf dump", daemon_name);
     if (perf_dump_response.size() == 0) {
     if (perf_dump_response.size() == 0) {
+      failures++;
       continue;
     }
       continue;
     }
-    std::string perf_schema_response = asok_request(sock_client, "perf schema", daemon_name);
+    std::string perf_schema_response =
+        asok_request(sock_client, "perf schema", daemon_name);
     if (perf_schema_response.size() == 0) {
     if (perf_schema_response.size() == 0) {
+      failures++;
+      continue;
+    }
+    std::string config_show =
+        asok_request(sock_client, "config show", daemon_name);
+    if (config_show.size() == 0) {
+      failures++;
       continue;
     }
       continue;
     }
-    std::string config_show = asok_request(sock_client, "config show", daemon_name);
     json_object pid_file_json = boost::json::parse(config_show).as_object();
     std::string pid_path =
     json_object pid_file_json = boost::json::parse(config_show).as_object();
     std::string pid_path =
-      boost_string_to_std(pid_file_json["pid_file"].as_string());
+        boost_string_to_std(pid_file_json["pid_file"].as_string());
     std::string pid_str = read_file_to_string(pid_path);
     if (!pid_path.size()) {
     std::string pid_str = read_file_to_string(pid_path);
     if (!pid_path.size()) {
-      continue;
+      dout(1) << "pid path is empty; process metrics won't be fetched for: "
+              << daemon_name << dendl;
+    }
+    if (!pid_str.empty()) {
+      daemon_pids.push_back({daemon_name, std::stoi(pid_str)});
     }
     }
-    daemon_pids.push_back({daemon_name, std::stoi(pid_str)});
     json_object dump = boost::json::parse(perf_dump_response).as_object();
     json_object schema = boost::json::parse(perf_schema_response).as_object();
     for (auto &perf : schema) {
     json_object dump = boost::json::parse(perf_dump_response).as_object();
     json_object schema = boost::json::parse(perf_schema_response).as_object();
     for (auto &perf : schema) {
-      auto sv = perf.key();
-      std::string perf_group = {sv.begin(), sv.end()};
+      std::string perf_group = {perf.key().begin(), perf.key().end()};
       json_object perf_group_object = perf.value().as_object();
       for (auto &perf_counter : perf_group_object) {
       json_object perf_group_object = perf.value().as_object();
       for (auto &perf_counter : perf_group_object) {
-        auto sv1 = perf_counter.key();
-        std::string perf_name = {sv1.begin(), sv1.end()};
+        std::string perf_name = {perf_counter.key().begin(),
+                                 perf_counter.key().end()};
         json_object perf_info = perf_counter.value().as_object();
         auto prio_limit = g_conf().get_val<int64_t>("exporter_prio_limit");
         json_object perf_info = perf_counter.value().as_object();
         auto prio_limit = g_conf().get_val<int64_t>("exporter_prio_limit");
-        if (perf_info["priority"].as_int64() <
-            prio_limit) {
+        if (perf_info["priority"].as_int64() < prio_limit) {
           continue;
         }
         std::string name = "ceph_" + perf_group + "_" + perf_name;
           continue;
         }
         std::string name = "ceph_" + perf_group + "_" + perf_name;
@@ -143,10 +158,12 @@ void DaemonMetricCollector::dump_asok_metrics() {
       }
     }
   }
       }
     }
   }
-  dout(10) << "Perf counters retrieved for " << clients.size() << " daemons." << dendl;
+  dout(10) << "Perf counters retrieved for " << clients.size() - failures << "/"
+           << clients.size() << " daemons." << dendl;
   // get time spent on this function
   timer.stop();
   // get time spent on this function
   timer.stop();
-  std::string scrap_desc("Time spent scraping and transforming perfcounters to metrics");
+  std::string scrap_desc(
+      "Time spent scraping and transforming perf counters to metrics");
   labels_t scrap_labels;
   scrap_labels["host"] = quote(ceph_get_hostname());
   scrap_labels["function"] = quote(__FUNCTION__);
   labels_t scrap_labels;
   scrap_labels["host"] = quote(ceph_get_hostname());
   scrap_labels["function"] = quote(__FUNCTION__);
@@ -154,7 +171,10 @@ void DaemonMetricCollector::dump_asok_metrics() {
              "gauge", scrap_labels);
 
   const std::lock_guard<std::mutex> lock(metrics_mutex);
              "gauge", scrap_labels);
 
   const std::lock_guard<std::mutex> lock(metrics_mutex);
-  get_process_metrics(daemon_pids);
+  // only get metrics if there's pid path for some or all daemons isn't empty
+  if (daemon_pids.size() != 0) {
+    get_process_metrics(daemon_pids);
+  }
   metrics = builder->dump();
 }
 
   metrics = builder->dump();
 }
 
@@ -181,7 +201,8 @@ struct pstat read_pid_stat(int pid) {
   return stat;
 }
 
   return stat;
 }
 
-void DaemonMetricCollector::get_process_metrics(std::vector<std::pair<std::string, int>> daemon_pids) {
+void DaemonMetricCollector::get_process_metrics(
+    std::vector<std::pair<std::string, int>> daemon_pids) {
   std::string path("/proc");
   std::stringstream ss;
   for (auto &[daemon_name, pid] : daemon_pids) {
   std::string path("/proc");
   std::stringstream ss;
   for (auto &[daemon_name, pid] : daemon_pids) {
@@ -194,7 +215,7 @@ void DaemonMetricCollector::get_process_metrics(std::vector<std::pair<std::strin
     double total_time_seconds = user_time + kernel_time;
     double uptime = std::stod(uptimes[0]);
     double elapsed_time = uptime - start_time_seconds;
     double total_time_seconds = user_time + kernel_time;
     double uptime = std::stod(uptimes[0]);
     double elapsed_time = uptime - start_time_seconds;
-    double idle_time = elapsed_time  - total_time_seconds;
+    double idle_time = elapsed_time - total_time_seconds;
     double usage = total_time_seconds * 100 / elapsed_time;
 
     labels_t labels;
     double usage = total_time_seconds * 100 / elapsed_time;
 
     labels_t labels;
@@ -205,8 +226,8 @@ void DaemonMetricCollector::get_process_metrics(std::vector<std::pair<std::strin
                "Number of major page faults of daemon", "counter", labels);
     add_metric(builder, stat.num_threads, "ceph_exporter_num_threads",
                "Number of threads used by daemon", "gauge", labels);
                "Number of major page faults of daemon", "counter", labels);
     add_metric(builder, stat.num_threads, "ceph_exporter_num_threads",
                "Number of threads used by daemon", "gauge", labels);
-    add_metric(builder, usage, "ceph_exporter_cpu_usage", "CPU usage of a daemon",
-               "gauge", labels);
+    add_metric(builder, usage, "ceph_exporter_cpu_usage",
+               "CPU usage of a daemon", "gauge", labels);
 
     std::string cpu_time_desc = "Process time in kernel/user/idle mode";
     labels_t cpu_total_labels;
 
     std::string cpu_time_desc = "Process time in kernel/user/idle mode";
     labels_t cpu_total_labels;
@@ -220,21 +241,22 @@ void DaemonMetricCollector::get_process_metrics(std::vector<std::pair<std::strin
     cpu_total_labels["mode"] = quote("idle");
     add_metric(builder, idle_time, "ceph_exporter_cpu_total", cpu_time_desc,
                "counter", cpu_total_labels);
     cpu_total_labels["mode"] = quote("idle");
     add_metric(builder, idle_time, "ceph_exporter_cpu_total", cpu_time_desc,
                "counter", cpu_total_labels);
-    add_metric(builder, stat.vm_size, "ceph_exporter_vm_size", "Virtual memory used in a daemon",
-               "gauge", labels);
+    add_metric(builder, stat.vm_size, "ceph_exporter_vm_size",
+               "Virtual memory used in a daemon", "gauge", labels);
     add_metric(builder, stat.resident_size, "ceph_exporter_resident_size",
                "Resident memory in a daemon", "gauge", labels);
   }
 }
 
 std::string DaemonMetricCollector::asok_request(AdminSocketClient &asok,
     add_metric(builder, stat.resident_size, "ceph_exporter_resident_size",
                "Resident memory in a daemon", "gauge", labels);
   }
 }
 
 std::string DaemonMetricCollector::asok_request(AdminSocketClient &asok,
-                                                std::string command, std::string daemon_name) {
+                                                std::string command,
+                                                std::string daemon_name) {
   std::string request("{\"prefix\": \"" + command + "\"}");
   std::string response;
   std::string err = asok.do_request(request, &response);
   if (err.length() > 0 || response.substr(0, 5) == "ERROR") {
   std::string request("{\"prefix\": \"" + command + "\"}");
   std::string response;
   std::string err = asok.do_request(request, &response);
   if (err.length() > 0 || response.substr(0, 5) == "ERROR") {
-    dout(1) << "command " << command << "failed for daemon " << daemon_name 
-      << "with error: " << err << dendl;
+    dout(1) << "command " << command << "failed for daemon " << daemon_name
+            << "with error: " << err << dendl;
     return "";
   }
   return response;
     return "";
   }
   return response;
@@ -253,8 +275,9 @@ DaemonMetricCollector::get_labels_and_metric_name(std::string daemon_name,
   } else {
     labels["ceph_daemon"] = quote(daemon_name);
     if (daemon_name.find("rbd-mirror") != std::string::npos) {
   } else {
     labels["ceph_daemon"] = quote(daemon_name);
     if (daemon_name.find("rbd-mirror") != std::string::npos) {
-      std::regex re("^rbd_mirror_image_([^/]+)/(?:(?:([^/]+)/"
-                    ")?)(.*)\\.(replay(?:_bytes|_latency)?)$");
+      std::regex re(
+          "^rbd_mirror_image_([^/]+)/(?:(?:([^/]+)/"
+          ")?)(.*)\\.(replay(?:_bytes|_latency)?)$");
       std::smatch match;
       if (std::regex_search(daemon_name, match, re) == true) {
         new_metric_name = "ceph_rbd_mirror_image_" + match.str(4);
       std::smatch match;
       if (std::regex_search(daemon_name, match, re) == true) {
         new_metric_name = "ceph_rbd_mirror_image_" + match.str(4);
@@ -277,9 +300,9 @@ void DaemonMetricCollector::dump_asok_metric(json_object perf_info,
                                              labels_t labels) {
   int64_t type = perf_info["type"].as_int64();
   std::string metric_type =
                                              labels_t labels) {
   int64_t type = perf_info["type"].as_int64();
   std::string metric_type =
-    boost_string_to_std(perf_info["metric_type"].as_string());
+      boost_string_to_std(perf_info["metric_type"].as_string());
   std::string description =
   std::string description =
-    boost_string_to_std(perf_info["description"].as_string());
+      boost_string_to_std(perf_info["description"].as_string());
 
   if (type & PERFCOUNTER_LONGRUNAVG) {
     int64_t count = perf_values.as_object()["avgcount"].as_int64();
 
   if (type & PERFCOUNTER_LONGRUNAVG) {
     int64_t count = perf_values.as_object()["avgcount"].as_int64();
@@ -306,16 +329,15 @@ void DaemonMetricCollector::update_sockets() {
   std::string sock_dir = g_conf().get_val<std::string>("exporter_sock_dir");
   clients.clear();
   std::filesystem::path sock_path = sock_dir;
   std::string sock_dir = g_conf().get_val<std::string>("exporter_sock_dir");
   clients.clear();
   std::filesystem::path sock_path = sock_dir;
-  if(!std::filesystem::is_directory(sock_path.parent_path())) {
+  if (!std::filesystem::is_directory(sock_path.parent_path())) {
     dout(1) << "ERROR: No such directory exist" << sock_dir << dendl;
     return;
   }
     dout(1) << "ERROR: No such directory exist" << sock_dir << dendl;
     return;
   }
-  for (const auto &entry :
-         std::filesystem::directory_iterator(sock_dir)) {
+  for (const auto &entry : std::filesystem::directory_iterator(sock_dir)) {
     if (entry.path().extension() == ".asok") {
       std::string daemon_socket_name = entry.path().filename().string();
       std::string daemon_name =
     if (entry.path().extension() == ".asok") {
       std::string daemon_socket_name = entry.path().filename().string();
       std::string daemon_name =
-        daemon_socket_name.substr(0, daemon_socket_name.size() - 5);
+          daemon_socket_name.substr(0, daemon_socket_name.size() - 5);
       if (clients.find(daemon_name) == clients.end() &&
           !(daemon_name.find("mgr") != std::string::npos) &&
           !(daemon_name.find("ceph-exporter") != std::string::npos)) {
       if (clients.find(daemon_name) == clients.end() &&
           !(daemon_name.find("mgr") != std::string::npos) &&
           !(daemon_name.find("ceph-exporter") != std::string::npos)) {
@@ -329,7 +351,6 @@ void DaemonMetricCollector::update_sockets() {
 void OrderedMetricsBuilder::add(std::string value, std::string name,
                                 std::string description, std::string mtype,
                                 labels_t labels) {
 void OrderedMetricsBuilder::add(std::string value, std::string name,
                                 std::string description, std::string mtype,
                                 labels_t labels) {
-
   if (metrics.find(name) == metrics.end()) {
     Metric metric(name, mtype, description);
     metrics[name] = std::move(metric);
   if (metrics.find(name) == metrics.end()) {
     Metric metric(name, mtype, description);
     metrics[name] = std::move(metric);
@@ -348,7 +369,6 @@ std::string OrderedMetricsBuilder::dump() {
 void UnorderedMetricsBuilder::add(std::string value, std::string name,
                                   std::string description, std::string mtype,
                                   labels_t labels) {
 void UnorderedMetricsBuilder::add(std::string value, std::string name,
                                   std::string description, std::string mtype,
                                   labels_t labels) {
-
   Metric metric(name, mtype, description);
   metric.add(labels, value);
   out += metric.dump() + "\n\n";
   Metric metric(name, mtype, description);
   metric.add(labels, value);
   out += metric.dump() + "\n\n";
index e3caae31d3ca303cf6e4e1466f61be3e69f54534..efc8449f6f9da0555f6f5637a61a558540d94b3e 100644 (file)
@@ -388,6 +388,7 @@ enum {
        CEPH_MDS_OP_LOOKUPINO  = 0x00104,
        CEPH_MDS_OP_LOOKUPNAME = 0x00105,
        CEPH_MDS_OP_GETVXATTR  = 0x00106,
        CEPH_MDS_OP_LOOKUPINO  = 0x00104,
        CEPH_MDS_OP_LOOKUPNAME = 0x00105,
        CEPH_MDS_OP_GETVXATTR  = 0x00106,
+       CEPH_MDS_OP_DUMMY = 0x00107,
 
        CEPH_MDS_OP_SETXATTR   = 0x01105,
        CEPH_MDS_OP_RMXATTR    = 0x01106,
 
        CEPH_MDS_OP_SETXATTR   = 0x01105,
        CEPH_MDS_OP_RMXATTR    = 0x01106,
index 47d9e35933e74adc9148367cdfd1c2930d361545..929c6fb4ee2b2bf7ef0135b3e1dd61b41208b3fb 100644 (file)
@@ -42,6 +42,7 @@ extern "C" {
 #define LIBRBD_SUPPORTS_AIO_FLUSH 1
 #define LIBRBD_SUPPORTS_AIO_OPEN 1
 #define LIBRBD_SUPPORTS_COMPARE_AND_WRITE 1
 #define LIBRBD_SUPPORTS_AIO_FLUSH 1
 #define LIBRBD_SUPPORTS_AIO_OPEN 1
 #define LIBRBD_SUPPORTS_COMPARE_AND_WRITE 1
+#define LIBRBD_SUPPORTS_COMPARE_AND_WRITE_IOVEC 1
 #define LIBRBD_SUPPORTS_LOCKING 1
 #define LIBRBD_SUPPORTS_INVALIDATE 1
 #define LIBRBD_SUPPORTS_IOVEC 1
 #define LIBRBD_SUPPORTS_LOCKING 1
 #define LIBRBD_SUPPORTS_INVALIDATE 1
 #define LIBRBD_SUPPORTS_IOVEC 1
@@ -1195,6 +1196,15 @@ CEPH_RBD_API ssize_t rbd_aio_compare_and_write(rbd_image_t image,
                                                rbd_completion_t c,
                                                uint64_t *mismatch_off,
                                                int op_flags);
                                                rbd_completion_t c,
                                                uint64_t *mismatch_off,
                                                int op_flags);
+CEPH_RBD_API ssize_t rbd_aio_compare_and_writev(rbd_image_t image,
+                                                uint64_t off,
+                                                const struct iovec *cmp_iov,
+                                                int cmp_iovcnt,
+                                                const struct iovec *iov,
+                                                int iovcnt,
+                                                rbd_completion_t c,
+                                                uint64_t *mismatch_off,
+                                                int op_flags);
 
 CEPH_RBD_API int rbd_aio_create_completion(void *cb_arg,
                                            rbd_callback_t complete_cb,
 
 CEPH_RBD_API int rbd_aio_create_completion(void *cb_arg,
                                            rbd_callback_t complete_cb,
index f1ddc2965e5451143fd09d8097481af519413ed3..669f17a2cf50aff91103163db38959abc96d460f 100644 (file)
@@ -710,6 +710,27 @@ public:
   ssize_t writesame(uint64_t ofs, size_t len, ceph::bufferlist &bl, int op_flags);
   ssize_t write_zeroes(uint64_t ofs, size_t len, int zero_flags, int op_flags);
 
   ssize_t writesame(uint64_t ofs, size_t len, ceph::bufferlist &bl, int op_flags);
   ssize_t write_zeroes(uint64_t ofs, size_t len, int zero_flags, int op_flags);
 
+  /**
+   * compare and write from/to image
+   *
+   * Compare data in compare bufferlist to data at offset in image.
+   * len bytes of the compare bufferlist are compared, i.e. the compare
+   * bufferlist has to be at least len bytes long.
+   * If the compare is successful len bytes from the write bufferlist
+   * are written to the image, i.e. the write bufferlist also has to be
+   * at least len bytes long.
+   * If the compare is unsuccessful no data is written and the
+   * offset in the bufferlist where the compare first differed
+   * is returned through mismatch_off.
+   *
+   * @param off offset in image
+   * @param len length of compare, length of write
+   * @param cmp_bl bufferlist to compare from
+   * @param bl bufferlist to write to image if compare succeeds
+   * @param c aio completion to notify when compare and write is complete
+   * @param mismatch_off (out) offset in bufferlist where compare first differed
+   * @param op_flags see librados.h constants beginning with LIBRADOS_OP_FLAG
+   */
   ssize_t compare_and_write(uint64_t ofs, size_t len, ceph::bufferlist &cmp_bl,
                             ceph::bufferlist& bl, uint64_t *mismatch_off, int op_flags);
 
   ssize_t compare_and_write(uint64_t ofs, size_t len, ceph::bufferlist &cmp_bl,
                             ceph::bufferlist& bl, uint64_t *mismatch_off, int op_flags);
 
index 1a46b590479d69fa27a3db2f0266b087f5d2446e..8e2beb49cfd91db696e689aeb280d8cf90086c83 100644 (file)
@@ -3,7 +3,6 @@
 
 #include "librbd/AsioEngine.h"
 #include "include/Context.h"
 
 #include "librbd/AsioEngine.h"
 #include "include/Context.h"
-#include "include/stringify.h"
 #include "include/neorados/RADOS.hpp"
 #include "include/rados/librados.hpp"
 #include "common/dout.h"
 #include "include/neorados/RADOS.hpp"
 #include "include/rados/librados.hpp"
 #include "common/dout.h"
@@ -31,7 +30,9 @@ AsioEngine::AsioEngine(std::shared_ptr<librados::Rados> rados)
   if (rbd_threads > rados_threads) {
     // inherit the librados thread count -- but increase it if librbd wants to
     // utilize more threads
   if (rbd_threads > rados_threads) {
     // inherit the librados thread count -- but increase it if librbd wants to
     // utilize more threads
-    m_cct->_conf.set_val("librados_thread_count", stringify(rbd_threads));
+    m_cct->_conf.set_val_or_die("librados_thread_count",
+                                std::to_string(rbd_threads));
+    m_cct->_conf.apply_changes(nullptr);
   }
 }
 
   }
 }
 
index 0cd38b22adaa9ee29b0f3bc17f82ebbc0c3e3e06..8ddce2e8f7d4f4b476d5886d2135c38007b988f1 100644 (file)
@@ -792,6 +792,49 @@ uint64_t Journal<I>::append_write_event(uint64_t offset, size_t length,
                           length, flush_entry, 0);
 }
 
                           length, flush_entry, 0);
 }
 
+template <typename I>
+uint64_t Journal<I>::append_compare_and_write_event(uint64_t offset,
+                                                    size_t length,
+                                                    const bufferlist &cmp_bl,
+                                                    const bufferlist &write_bl,
+                                                    bool flush_entry) {
+  ceph_assert(
+    m_max_append_size > journal::AioCompareAndWriteEvent::get_fixed_size());
+  uint64_t max_compare_and_write_data_size =
+    m_max_append_size - journal::AioCompareAndWriteEvent::get_fixed_size();
+  // we need double the size because we store cmp and write buffers
+  max_compare_and_write_data_size /= 2;
+
+  // ensure that the compare and write event fits within the journal entry
+  Bufferlists bufferlists;
+  uint64_t bytes_remaining = length;
+  uint64_t event_offset = 0;
+  do {
+    uint64_t event_length = std::min(bytes_remaining,
+                                     max_compare_and_write_data_size);
+
+    bufferlist event_cmp_bl;
+    event_cmp_bl.substr_of(cmp_bl, event_offset, event_length);
+    bufferlist event_write_bl;
+    event_write_bl.substr_of(write_bl, event_offset, event_length);
+    journal::EventEntry event_entry(
+      journal::AioCompareAndWriteEvent(offset + event_offset,
+                                       event_length,
+                                       event_cmp_bl,
+                                       event_write_bl),
+      ceph_clock_now());
+
+    bufferlists.emplace_back();
+    encode(event_entry, bufferlists.back());
+
+    event_offset += event_length;
+    bytes_remaining -= event_length;
+  } while (bytes_remaining > 0);
+
+  return append_io_events(journal::EVENT_TYPE_AIO_COMPARE_AND_WRITE,
+                          bufferlists, offset, length, flush_entry, -EILSEQ);
+}
+
 template <typename I>
 uint64_t Journal<I>::append_io_event(journal::EventEntry &&event_entry,
                                      uint64_t offset, size_t length,
 template <typename I>
 uint64_t Journal<I>::append_io_event(journal::EventEntry &&event_entry,
                                      uint64_t offset, size_t length,
index 406c0e34cbf0eccc65d302a11bdcac32502a613f..1ef9ffa8830fe0beffa4d5a3f418e273e2ddab80 100644 (file)
@@ -136,6 +136,11 @@ public:
   uint64_t append_write_event(uint64_t offset, size_t length,
                               const bufferlist &bl,
                               bool flush_entry);
   uint64_t append_write_event(uint64_t offset, size_t length,
                               const bufferlist &bl,
                               bool flush_entry);
+  uint64_t append_compare_and_write_event(uint64_t offset,
+                                          size_t length,
+                                          const bufferlist &cmp_bl,
+                                          const bufferlist &write_bl,
+                                          bool flush_entry);
   uint64_t append_io_event(journal::EventEntry &&event_entry,
                            uint64_t offset, size_t length,
                            bool flush_entry, int filter_ret_val);
   uint64_t append_io_event(journal::EventEntry &&event_entry,
                            uint64_t offset, size_t length,
                            bool flush_entry, int filter_ret_val);
index f91bda3f0d2fbe23c73ffda53da141ea36e5a27c..159c9eda570bbe6434a54904b32e7476697a7aee 100644 (file)
@@ -80,6 +80,7 @@ LibrbdAdminSocketHook::~LibrbdAdminSocketHook() {
 
 int LibrbdAdminSocketHook::call(std::string_view command,
                                const cmdmap_t& cmdmap,
 
 int LibrbdAdminSocketHook::call(std::string_view command,
                                const cmdmap_t& cmdmap,
+                               const bufferlist&,
                                Formatter *f,
                                std::ostream& errss,
                                bufferlist& out) {
                                Formatter *f,
                                std::ostream& errss,
                                bufferlist& out) {
index d07a9280e583385cab6f8f98434f712caa73a2e6..98ff06abb30006aaa5794a9714514cee645017bb 100644 (file)
@@ -18,6 +18,7 @@ namespace librbd {
     ~LibrbdAdminSocketHook() override;
 
     int call(std::string_view command, const cmdmap_t& cmdmap,
     ~LibrbdAdminSocketHook() override;
 
     int call(std::string_view command, const cmdmap_t& cmdmap,
+            const bufferlist&,
             Formatter *f,
             std::ostream& errss,
             bufferlist& out) override;
             Formatter *f,
             std::ostream& errss,
             bufferlist& out) override;
index 772dd7f058eaff756cdfd6169989812d369e2711..b887ecdae75e13f56726c83d6f41036d71e6798a 100644 (file)
@@ -737,8 +737,7 @@ int Image<I>::snap_set(I *ictx,
   std::string name(snap_name == nullptr ? "" : snap_name);
   if (!name.empty()) {
     std::shared_lock image_locker{ictx->image_lock};
   std::string name(snap_name == nullptr ? "" : snap_name);
   if (!name.empty()) {
     std::shared_lock image_locker{ictx->image_lock};
-    snap_id = ictx->get_snap_id(cls::rbd::UserSnapshotNamespace{},
-                                snap_name);
+    snap_id = ictx->get_snap_id(snap_namespace, snap_name);
     if (snap_id == CEPH_NOSNAP) {
       return -ENOENT;
     }
     if (snap_id == CEPH_NOSNAP) {
       return -ENOENT;
     }
@@ -787,12 +786,24 @@ int Image<I>::remove(IoCtx& io_ctx, const std::string &image_name,
     r = Trash<I>::list(io_ctx, trash_entries, false);
     if (r < 0) {
       return r;
     r = Trash<I>::list(io_ctx, trash_entries, false);
     if (r < 0) {
       return r;
-    } else if (r >= 0) {
-      for (auto& entry : trash_entries) {
-        if (entry.name == image_name &&
-            entry.source == RBD_TRASH_IMAGE_SOURCE_REMOVING) {
-          return Trash<I>::remove(io_ctx, entry.id, true, prog_ctx);
+    }
+    for (auto& entry : trash_entries) {
+      if (entry.name == image_name &&
+          entry.source == RBD_TRASH_IMAGE_SOURCE_REMOVING) {
+        cls::rbd::TrashImageSpec spec;
+        r = cls_client::trash_get(&io_ctx, entry.id, &spec);
+        if (r < 0) {
+          lderr(cct) << "error getting image id " << entry.id
+                     << " info from trash: " << cpp_strerror(r) << dendl;
+          return r;
+        }
+        if (spec.state == cls::rbd::TRASH_IMAGE_STATE_MOVING) {
+          r = Trash<I>::move(io_ctx, entry.source, entry.name, entry.id, 0);
+          if (r < 0) {
+            return r;
+          }
         }
         }
+        return Trash<I>::remove(io_ctx, entry.id, true, prog_ctx);
       }
     }
 
       }
     }
 
index 81d5a71885b01d6cd100e93f212366ab56d76c6b..822a053e1431c414563ed1c5f96318a45c0b919b 100644 (file)
@@ -389,18 +389,37 @@ bool ObjectCacherObjectDispatch<I>::compare_and_write(
   // pass-through the compare-and-write request since it's not a supported
   // operation of the ObjectCacher
 
   // pass-through the compare-and-write request since it's not a supported
   // operation of the ObjectCacher
 
+  ObjectExtents object_extents;
+  object_extents.emplace_back(data_object_name(m_image_ctx, object_no),
+                              object_no, object_off, cmp_data.length(), 0);
+
+  // if compare succeeds, discard the cache state after changes are
+  // committed to disk
+  auto ctx = *on_finish;
+  *on_finish = new LambdaContext(
+    [this, object_extents, ctx](int r) {
+      // ObjectCacher doesn't provide a way to reliably invalidate
+      // extents: in case of a racing read (if the bh is in RX state),
+      // release_set() just returns while discard_set() populates the
+      // extent with zeroes.  Neither is OK but the latter is better
+      // because it is at least deterministic...
+      if (r == 0) {
+        m_cache_lock.lock();
+        m_object_cacher->discard_set(m_object_set, object_extents);
+        m_cache_lock.unlock();
+      }
+
+      ctx->complete(r);
+    });
+
   // ensure we aren't holding the cache lock post-flush
   on_dispatched = util::create_async_context_callback(*m_image_ctx,
                                                       on_dispatched);
 
   // ensure we aren't holding the cache lock post-flush
   on_dispatched = util::create_async_context_callback(*m_image_ctx,
                                                       on_dispatched);
 
-  // flush any pending writes from the cache
+  // flush any pending writes from the cache before compare
   ZTracer::Trace trace(parent_trace);
   *dispatch_result = io::DISPATCH_RESULT_CONTINUE;
 
   ZTracer::Trace trace(parent_trace);
   *dispatch_result = io::DISPATCH_RESULT_CONTINUE;
 
-  ObjectExtents object_extents;
-  object_extents.emplace_back(data_object_name(m_image_ctx, object_no),
-                              object_no, object_off, cmp_data.length(), 0);
-
   std::lock_guard cache_locker{m_cache_lock};
   m_object_cacher->flush_set(m_object_set, object_extents, &trace,
                              on_dispatched);
   std::lock_guard cache_locker{m_cache_lock};
   m_object_cacher->flush_set(m_object_set, object_extents, &trace,
                              on_dispatched);
index 580726ddffc67e7b93eeab9798649bece78ecbd5..a59a59d1ca03d7d90a767eb9fbcc2eb1fcd37b72 100644 (file)
@@ -1068,12 +1068,11 @@ void AbstractWriteLog<I>::compare_and_write(Extents &&image_extents,
                                      << "cw_req=" << cw_req << dendl;
 
           /* Compare read_bl to cmp_bl to determine if this will produce a write */
                                      << "cw_req=" << cw_req << dendl;
 
           /* Compare read_bl to cmp_bl to determine if this will produce a write */
-          buffer::list aligned_read_bl;
-          if (cw_req->cmp_bl.length() < cw_req->read_bl.length()) {
-            aligned_read_bl.substr_of(cw_req->read_bl, 0, cw_req->cmp_bl.length());
-          }
-          if (cw_req->cmp_bl.contents_equal(cw_req->read_bl) ||
-              cw_req->cmp_bl.contents_equal(aligned_read_bl)) {
+          ceph_assert(cw_req->read_bl.length() <= cw_req->cmp_bl.length());
+          ceph_assert(cw_req->read_bl.length() == cw_req->image_extents_summary.total_bytes);
+          bufferlist sub_cmp_bl;
+          sub_cmp_bl.substr_of(cw_req->cmp_bl, 0, cw_req->read_bl.length());
+          if (sub_cmp_bl.contents_equal(cw_req->read_bl)) {
             /* Compare phase succeeds. Begin write */
             ldout(m_image_ctx.cct, 5) << " cw_req=" << cw_req << " compare matched" << dendl;
             cw_req->compare_succeeded = true;
             /* Compare phase succeeds. Begin write */
             ldout(m_image_ctx.cct, 5) << " cw_req=" << cw_req << " compare matched" << dendl;
             cw_req->compare_succeeded = true;
@@ -1087,8 +1086,8 @@ void AbstractWriteLog<I>::compare_and_write(Extents &&image_extents,
             ldout(m_image_ctx.cct, 15) << " cw_req=" << cw_req << " compare failed" << dendl;
             /* Bufferlist doesn't tell us where they differed, so we'll have to determine that here */
             uint64_t bl_index = 0;
             ldout(m_image_ctx.cct, 15) << " cw_req=" << cw_req << " compare failed" << dendl;
             /* Bufferlist doesn't tell us where they differed, so we'll have to determine that here */
             uint64_t bl_index = 0;
-            for (bl_index = 0; bl_index < cw_req->cmp_bl.length(); bl_index++) {
-              if (cw_req->cmp_bl[bl_index] != cw_req->read_bl[bl_index]) {
+            for (bl_index = 0; bl_index < sub_cmp_bl.length(); bl_index++) {
+              if (sub_cmp_bl[bl_index] != cw_req->read_bl[bl_index]) {
                 ldout(m_image_ctx.cct, 15) << " cw_req=" << cw_req << " mismatch at " << bl_index << dendl;
                 break;
               }
                 ldout(m_image_ctx.cct, 15) << " cw_req=" << cw_req << " mismatch at " << bl_index << dendl;
                 break;
               }
@@ -1308,7 +1307,6 @@ void AbstractWriteLog<I>::complete_op_log_entries(GenericLogOperations &&ops,
 {
   GenericLogEntries dirty_entries;
   int published_reserves = 0;
 {
   GenericLogEntries dirty_entries;
   int published_reserves = 0;
-  bool need_update_state = false;
   ldout(m_image_ctx.cct, 20) << __func__ << ": completing" << dendl;
   for (auto &op : ops) {
     utime_t now = ceph_clock_now();
   ldout(m_image_ctx.cct, 20) << __func__ << ": completing" << dendl;
   for (auto &op : ops) {
     utime_t now = ceph_clock_now();
@@ -1328,11 +1326,6 @@ void AbstractWriteLog<I>::complete_op_log_entries(GenericLogOperations &&ops,
       std::lock_guard locker(m_lock);
       m_unpublished_reserves -= published_reserves;
       m_dirty_log_entries.splice(m_dirty_log_entries.end(), dirty_entries);
       std::lock_guard locker(m_lock);
       m_unpublished_reserves -= published_reserves;
       m_dirty_log_entries.splice(m_dirty_log_entries.end(), dirty_entries);
-      if (m_cache_state->clean && !this->m_dirty_log_entries.empty()) {
-        m_cache_state->clean = false;
-        update_image_cache_state();
-        need_update_state = true;
-      }
     }
     op->complete(result);
     m_perfcounter->tinc(l_librbd_pwl_log_op_dis_to_app_t,
     }
     op->complete(result);
     m_perfcounter->tinc(l_librbd_pwl_log_op_dis_to_app_t,
@@ -1347,10 +1340,6 @@ void AbstractWriteLog<I>::complete_op_log_entries(GenericLogOperations &&ops,
                       log_entry->ram_entry.write_bytes);
     m_perfcounter->tinc(l_librbd_pwl_log_op_app_to_cmp_t, now - op->log_append_start_time);
   }
                       log_entry->ram_entry.write_bytes);
     m_perfcounter->tinc(l_librbd_pwl_log_op_app_to_cmp_t, now - op->log_append_start_time);
   }
-  if (need_update_state) {
-    std::unique_lock locker(m_lock);
-    write_image_cache_state(locker);
-  }
   // New entries may be flushable
   {
     std::lock_guard locker(m_lock);
   // New entries may be flushable
   {
     std::lock_guard locker(m_lock);
@@ -1540,7 +1529,7 @@ bool AbstractWriteLog<I>::check_allocation(
   }
 
   if (alloc_succeeds) {
   }
 
   if (alloc_succeeds) {
-    std::lock_guard locker(m_lock);
+    std::unique_lock locker(m_lock);
     /* We need one free log entry per extent (each is a separate entry), and
      * one free "lane" for remote replication. */
     if ((m_free_lanes >= num_lanes) &&
     /* We need one free log entry per extent (each is a separate entry), and
      * one free "lane" for remote replication. */
     if ((m_free_lanes >= num_lanes) &&
@@ -1552,6 +1541,11 @@ bool AbstractWriteLog<I>::check_allocation(
       m_bytes_allocated += bytes_allocated;
       m_bytes_cached += bytes_cached;
       m_bytes_dirty += bytes_dirtied;
       m_bytes_allocated += bytes_allocated;
       m_bytes_cached += bytes_cached;
       m_bytes_dirty += bytes_dirtied;
+      if (m_cache_state->clean && bytes_dirtied > 0) {
+        m_cache_state->clean = false;
+        update_image_cache_state();
+        write_image_cache_state(locker);
+      }
     } else {
       alloc_succeeds = false;
     }
     } else {
       alloc_succeeds = false;
     }
index 5f8d2f0da39bf750c61febc46c56338762aa869a..9c87c9d8c5fceb1498332752176385d2ee9e27de 100644 (file)
@@ -455,6 +455,19 @@ void AbstractImageWriteRequest<I>::send_request() {
     return;
   }
 
     return;
   }
 
+  // reflect changes in object_extents back to m_image_extents
+  if (ret == 1) {
+    this->m_image_extents.clear();
+    for (auto& object_extent : object_extents) {
+      io::Extents image_extents;
+      io::util::extent_to_file(&image_ctx, object_extent.object_no,
+                               object_extent.offset, object_extent.length,
+                               image_extents);
+      this->m_image_extents.insert(this->m_image_extents.end(),
+                                   image_extents.begin(), image_extents.end());
+    }
+  }
+
   aio_comp->set_request_count(object_extents.size());
   if (!object_extents.empty()) {
     uint64_t journal_tid = 0;
   aio_comp->set_request_count(object_extents.size());
   if (!object_extents.empty()) {
     uint64_t journal_tid = 0;
@@ -601,11 +614,12 @@ int ImageDiscardRequest<I>::prune_object_extents(
   // discard_granularity_bytes >= object_size && tail truncation
   // is a special case for filestore
   bool prune_required = false;
   // discard_granularity_bytes >= object_size && tail truncation
   // is a special case for filestore
   bool prune_required = false;
+  bool length_modified = false;
   auto object_size = this->m_image_ctx.layout.object_size;
   auto discard_granularity_bytes = std::min(m_discard_granularity_bytes,
                                             object_size);
   auto xform_lambda =
   auto object_size = this->m_image_ctx.layout.object_size;
   auto discard_granularity_bytes = std::min(m_discard_granularity_bytes,
                                             object_size);
   auto xform_lambda =
-    [discard_granularity_bytes, object_size, &prune_required]
+    [discard_granularity_bytes, object_size, &prune_required, &length_modified]
     (LightweightObjectExtent& object_extent) {
       auto& offset = object_extent.offset;
       auto& length = object_extent.length;
     (LightweightObjectExtent& object_extent) {
       auto& offset = object_extent.offset;
       auto& length = object_extent.length;
@@ -619,7 +633,11 @@ int ImageDiscardRequest<I>::prune_object_extents(
           prune_required = true;
           length = 0;
         } else {
           prune_required = true;
           length = 0;
         } else {
-          length = next_offset - offset;
+          auto new_length = next_offset - offset;
+          if (length != new_length) {
+            length_modified = true;
+            length = new_length;
+          }
         }
       }
     };
         }
       }
     };
@@ -637,6 +655,12 @@ int ImageDiscardRequest<I>::prune_object_extents(
                      remove_lambda),
       object_extents->end());
   }
                      remove_lambda),
       object_extents->end());
   }
+
+  // object extents were modified, image extents needs updating
+  if (length_modified || prune_required) {
+    return 1;
+  }
+
   return 0;
 }
 
   return 0;
 }
 
@@ -748,24 +772,28 @@ uint64_t ImageCompareAndWriteRequest<I>::append_journal_event(
   uint64_t tid = 0;
   ceph_assert(this->m_image_extents.size() == 1);
   auto &extent = this->m_image_extents.front();
   uint64_t tid = 0;
   ceph_assert(this->m_image_extents.size() == 1);
   auto &extent = this->m_image_extents.front();
-  journal::EventEntry event_entry(
-    journal::AioCompareAndWriteEvent(extent.first, extent.second, m_cmp_bl,
-                                     m_bl));
-  tid = image_ctx.journal->append_io_event(std::move(event_entry),
-                                           extent.first, extent.second,
-                                           synchronous, -EILSEQ);
+  tid = image_ctx.journal->append_compare_and_write_event(extent.first,
+                                                          extent.second,
+                                                          m_cmp_bl,
+                                                          m_bl,
+                                                          synchronous);
 
   return tid;
 }
 
 template <typename I>
 void ImageCompareAndWriteRequest<I>::assemble_extent(
 
   return tid;
 }
 
 template <typename I>
 void ImageCompareAndWriteRequest<I>::assemble_extent(
-  const LightweightObjectExtent &object_extent, bufferlist *bl) {
+    const LightweightObjectExtent &object_extent, bufferlist *bl,
+    bufferlist *cmp_bl) {
   for (auto q = object_extent.buffer_extents.begin();
        q != object_extent.buffer_extents.end(); ++q) {
     bufferlist sub_bl;
     sub_bl.substr_of(m_bl, q->first, q->second);
     bl->claim_append(sub_bl);
   for (auto q = object_extent.buffer_extents.begin();
        q != object_extent.buffer_extents.end(); ++q) {
     bufferlist sub_bl;
     sub_bl.substr_of(m_bl, q->first, q->second);
     bl->claim_append(sub_bl);
+
+    bufferlist sub_cmp_bl;
+    sub_cmp_bl.substr_of(m_cmp_bl, q->first, q->second);
+    cmp_bl->claim_append(sub_cmp_bl);
   }
 }
 
   }
 }
 
@@ -775,13 +803,12 @@ ObjectDispatchSpec *ImageCompareAndWriteRequest<I>::create_object_request(
     uint64_t journal_tid, bool single_extent, Context *on_finish) {
   I &image_ctx = this->m_image_ctx;
 
     uint64_t journal_tid, bool single_extent, Context *on_finish) {
   I &image_ctx = this->m_image_ctx;
 
-  // NOTE: safe to move m_cmp_bl since we only support this op against
-  // a single object
   bufferlist bl;
   bufferlist bl;
-  assemble_extent(object_extent, &bl);
+  bufferlist cmp_bl;
+  assemble_extent(object_extent, &bl, &cmp_bl);
   auto req = ObjectDispatchSpec::create_compare_and_write(
     &image_ctx, OBJECT_DISPATCH_LAYER_NONE, object_extent.object_no,
   auto req = ObjectDispatchSpec::create_compare_and_write(
     &image_ctx, OBJECT_DISPATCH_LAYER_NONE, object_extent.object_no,
-    object_extent.offset, std::move(m_cmp_bl), std::move(bl), io_context,
+    object_extent.offset, std::move(cmp_bl), std::move(bl), io_context,
     m_mismatch_offset, m_op_flags, journal_tid, this->m_trace, on_finish);
   return req;
 }
     m_mismatch_offset, m_op_flags, journal_tid, this->m_trace, on_finish);
   return req;
 }
@@ -800,11 +827,9 @@ int ImageCompareAndWriteRequest<I>::prune_object_extents(
     return -EINVAL;
 
   I &image_ctx = this->m_image_ctx;
     return -EINVAL;
 
   I &image_ctx = this->m_image_ctx;
-  uint64_t sector_size = 512ULL;
   uint64_t su = image_ctx.layout.stripe_unit;
   auto& object_extent = object_extents->front();
   uint64_t su = image_ctx.layout.stripe_unit;
   auto& object_extent = object_extents->front();
-  if (object_extent.offset % sector_size + object_extent.length > sector_size ||
-      (su != 0 && (object_extent.offset % su + object_extent.length > su)))
+  if (su == 0 || (object_extent.offset % su + object_extent.length > su))
     return -EINVAL;
 
   return 0;
     return -EINVAL;
 
   return 0;
index 2c05c3847f0d98fb7733e0082fb63472713c1eb9..919a7381d378db30b1e72cce77662af34d66dfa8 100644 (file)
@@ -317,7 +317,7 @@ public:
 
 protected:
   void assemble_extent(const LightweightObjectExtent &object_extent,
 
 protected:
   void assemble_extent(const LightweightObjectExtent &object_extent,
-                       bufferlist *bl);
+                       bufferlist *bl, bufferlist *cmp_bl);
 
   ObjectDispatchSpec *create_object_request(
       const LightweightObjectExtent &object_extent, IOContext io_context,
 
   ObjectDispatchSpec *create_object_request(
       const LightweightObjectExtent &object_extent, IOContext io_context,
index 28bb2449d75208cde7f4453e53f6e0a13ead002f..2fba85ebdc07e4eac103ba7b02957ea0c1390eba 100644 (file)
@@ -2674,8 +2674,8 @@ namespace librbd {
                ictx->read_only, ofs, len, cmp_bl.length() < len ? NULL : cmp_bl.c_str(),
                bl.length() < len ? NULL : bl.c_str(), op_flags);
 
                ictx->read_only, ofs, len, cmp_bl.length() < len ? NULL : cmp_bl.c_str(),
                bl.length() < len ? NULL : bl.c_str(), op_flags);
 
-    if (bl.length() < len) {
-      tracepoint(librbd, write_exit, -EINVAL);
+    if (bl.length() < len || cmp_bl.length() < len) {
+      tracepoint(librbd, compare_and_write_exit, -EINVAL);
       return -EINVAL;
     }
 
       return -EINVAL;
     }
 
@@ -2825,8 +2825,8 @@ namespace librbd {
                ictx->read_only, off, len, cmp_bl.length() < len ? NULL : cmp_bl.c_str(),
                bl.length() < len ? NULL : bl.c_str(), c->pc, op_flags);
 
                ictx->read_only, off, len, cmp_bl.length() < len ? NULL : cmp_bl.c_str(),
                bl.length() < len ? NULL : bl.c_str(), c->pc, op_flags);
 
-    if (bl.length() < len) {
-      tracepoint(librbd, compare_and_write_exit, -EINVAL);
+    if (bl.length() < len || cmp_bl.length() < len) {
+      tracepoint(librbd, aio_compare_and_write_exit, -EINVAL);
       return -EINVAL;
     }
 
       return -EINVAL;
     }
 
@@ -6352,6 +6352,52 @@ extern "C" ssize_t rbd_aio_compare_and_write(rbd_image_t image, uint64_t off,
   return 0;
 }
 
   return 0;
 }
 
+extern "C" ssize_t rbd_aio_compare_and_writev(rbd_image_t image,
+                                              uint64_t off,
+                                              const struct iovec *cmp_iov,
+                                              int cmp_iovcnt,
+                                              const struct iovec *iov,
+                                              int iovcnt,
+                                              rbd_completion_t c,
+                                              uint64_t *mismatch_off,
+                                              int op_flags)
+{
+  librbd::ImageCtx *ictx = (librbd::ImageCtx *)image;
+  librbd::RBD::AioCompletion *comp = (librbd::RBD::AioCompletion *)c;
+
+  size_t cmp_len;
+  int r = get_iovec_length(cmp_iov, cmp_iovcnt, cmp_len);
+
+  tracepoint(librbd, aio_compare_and_write_enter, ictx, ictx->name.c_str(),
+             ictx->snap_name.c_str(), ictx->read_only, off, cmp_len, NULL, NULL,
+             comp->pc, op_flags);
+  if (r != 0) {
+    tracepoint(librbd, aio_compare_and_write_exit, r);
+    return r;
+  }
+
+  size_t write_len;
+  r = get_iovec_length(iov, iovcnt, write_len);
+  if (r != 0) {
+    tracepoint(librbd, aio_compare_and_write_exit, r);
+    return r;
+  }
+  if (cmp_len != write_len) {
+    tracepoint(librbd, aio_compare_and_write_exit, -EINVAL);
+    return -EINVAL;
+  }
+
+  auto aio_completion = get_aio_completion(comp);
+  auto cmp_bl = iovec_to_bufferlist(ictx, cmp_iov, cmp_iovcnt, aio_completion);
+  auto bl = iovec_to_bufferlist(ictx, iov, iovcnt, aio_completion);
+  librbd::api::Io<>::aio_compare_and_write(*ictx, aio_completion, off, cmp_len,
+                                           std::move(cmp_bl), std::move(bl),
+                                           mismatch_off, op_flags, false);
+
+  tracepoint(librbd, aio_compare_and_write_exit, 0);
+  return 0;
+}
+
 extern "C" int rbd_invalidate_cache(rbd_image_t image)
 {
   librbd::ImageCtx *ictx = (librbd::ImageCtx *)image;
 extern "C" int rbd_invalidate_cache(rbd_image_t image)
 {
   librbd::ImageCtx *ictx = (librbd::ImageCtx *)image;
index dff250bcac332f2309492a4fae84f43c36dac842..efd27719283e953d2c7a1aeb78fcc90d6e78df31 100644 (file)
@@ -29,6 +29,7 @@
 #include "BatchOp.h"
 #include "MDSCacheObject.h"
 #include "MDSContext.h"
 #include "BatchOp.h"
 #include "MDSCacheObject.h"
 #include "MDSContext.h"
+#include "Mutation.h"
 #include "SimpleLock.h"
 #include "LocalLockC.h"
 #include "ScrubHeader.h"
 #include "SimpleLock.h"
 #include "LocalLockC.h"
 #include "ScrubHeader.h"
@@ -86,18 +87,23 @@ public:
   static const int STATE_EVALUATINGSTRAY = (1<<4);
   static const int STATE_PURGINGPINNED =  (1<<5);
   static const int STATE_BOTTOMLRU =    (1<<6);
   static const int STATE_EVALUATINGSTRAY = (1<<4);
   static const int STATE_PURGINGPINNED =  (1<<5);
   static const int STATE_BOTTOMLRU =    (1<<6);
+  static const int STATE_UNLINKING =    (1<<7);
   // stray dentry needs notification of releasing reference
   static const int STATE_STRAY =       STATE_NOTIFYREF;
   static const int MASK_STATE_IMPORT_KEPT = STATE_BOTTOMLRU;
 
   // -- pins --
   // stray dentry needs notification of releasing reference
   static const int STATE_STRAY =       STATE_NOTIFYREF;
   static const int MASK_STATE_IMPORT_KEPT = STATE_BOTTOMLRU;
 
   // -- pins --
-  static const int PIN_INODEPIN =     1;  // linked inode is pinned
-  static const int PIN_FRAGMENTING = -2;  // containing dir is refragmenting
-  static const int PIN_PURGING =      3;
-  static const int PIN_SCRUBPARENT =  4;
+  static const int PIN_INODEPIN =         1;  // linked inode is pinned
+  static const int PIN_FRAGMENTING =     -2;  // containing dir is refragmenting
+  static const int PIN_PURGING =          3;
+  static const int PIN_SCRUBPARENT =      4;
+  static const int PIN_WAITUNLINKSTATE  = 5;
 
   static const unsigned EXPORT_NONCE = 1;
 
 
   static const unsigned EXPORT_NONCE = 1;
 
+  const static uint64_t WAIT_UNLINK_STATE  = (1<<0);
+  const static uint64_t WAIT_UNLINK_FINISH = (1<<1);
+  uint32_t replica_unlinking_ref = 0;
 
   CDentry(std::string_view n, __u32 h,
           mempool::mds_co::string alternate_name,
 
   CDentry(std::string_view n, __u32 h,
           mempool::mds_co::string alternate_name,
@@ -136,6 +142,7 @@ public:
     case PIN_FRAGMENTING: return "fragmenting";
     case PIN_PURGING: return "purging";
     case PIN_SCRUBPARENT: return "scrubparent";
     case PIN_FRAGMENTING: return "fragmenting";
     case PIN_PURGING: return "purging";
     case PIN_SCRUBPARENT: return "scrubparent";
+    case PIN_WAITUNLINKSTATE: return "waitunlinkstate";
     default: return generic_pin_name(p);
     }
   }
     default: return generic_pin_name(p);
     }
   }
index 7e18263d85704abe95858a3492c79c561e305bc1..0edc798294843f5c05c45aaa13665592d3e73f77 100644 (file)
@@ -2300,6 +2300,13 @@ void CDir::_omap_commit_ops(int r, int op_prio, int64_t metapool, version_t vers
   auto commit_one = [&](bool header=false) {
     ObjectOperation op;
 
   auto commit_one = [&](bool header=false) {
     ObjectOperation op;
 
+    /*
+     * Shouldn't submit empty op to Rados, which could cause
+     * the cephfs to become readonly.
+     */
+    ceph_assert(header || !_set.empty() || !_rm.empty());
+
+
     // don't create new dirfrag blindly
     if (!_new)
       op.stat(nullptr, nullptr, nullptr);
     // don't create new dirfrag blindly
     if (!_new)
       op.stat(nullptr, nullptr, nullptr);
@@ -2335,7 +2342,7 @@ void CDir::_omap_commit_ops(int r, int op_prio, int64_t metapool, version_t vers
   int count = 0;
   for (auto &key : stales) {
     unsigned size = key.length() + sizeof(__u32);
   int count = 0;
   for (auto &key : stales) {
     unsigned size = key.length() + sizeof(__u32);
-    if (write_size + size > max_write_size)
+    if (write_size > 0 && write_size + size > max_write_size)
       commit_one();
 
     write_size += size;
       commit_one();
 
     write_size += size;
@@ -2347,7 +2354,7 @@ void CDir::_omap_commit_ops(int r, int op_prio, int64_t metapool, version_t vers
 
   for (auto &key : to_remove) {
     unsigned size = key.length() + sizeof(__u32);
 
   for (auto &key : to_remove) {
     unsigned size = key.length() + sizeof(__u32);
-    if (write_size + size > max_write_size)
+    if (write_size > 0 && write_size + size > max_write_size)
       commit_one();
 
     write_size += size;
       commit_one();
 
     write_size += size;
@@ -2375,7 +2382,7 @@ void CDir::_omap_commit_ops(int r, int op_prio, int64_t metapool, version_t vers
     }
 
     unsigned size = item.key.length() + bl.length() + 2 * sizeof(__u32);
     }
 
     unsigned size = item.key.length() + bl.length() + 2 * sizeof(__u32);
-    if (write_size + size > max_write_size)
+    if (write_size > 0 && write_size + size > max_write_size)
       commit_one();
 
     write_size += size;
       commit_one();
 
     write_size += size;
@@ -3673,7 +3680,7 @@ bool CDir::should_merge() const
       return false;
   }
 
       return false;
   }
 
-  return (int)get_frag_size() < g_conf()->mds_bal_merge_size;
+  return ((int)get_frag_size() + (int)get_num_snap_items()) < g_conf()->mds_bal_merge_size;
 }
 
 MEMPOOL_DEFINE_OBJECT_FACTORY(CDir, co_dir, mds_co);
 }
 
 MEMPOOL_DEFINE_OBJECT_FACTORY(CDir, co_dir, mds_co);
index b2dcdafde756b57a2f363a1290c3ddbb936fdd2c..b01abc200cd8f6e2fa34a5616f9ef268ac1eb5ad 100644 (file)
@@ -398,7 +398,7 @@ public:
 
   bool should_split() const {
     return g_conf()->mds_bal_split_size > 0 &&
 
   bool should_split() const {
     return g_conf()->mds_bal_split_size > 0 &&
-           (int)get_frag_size() > g_conf()->mds_bal_split_size;
+      ((int)get_frag_size() + (int)get_num_snap_items()) > g_conf()->mds_bal_split_size;
   }
   bool should_split_fast() const;
   bool should_merge() const;
   }
   bool should_split_fast() const;
   bool should_merge() const;
index 1231ca293624581b522e28f628d0bc47bee2b223..f6062d9c4e2662d7490d036010505db8d0a4375e 100644 (file)
@@ -2536,7 +2536,8 @@ void CInode::finish_scatter_gather_update(int type, MutationRef& mut)
       if (touched_mtime)
        pi->mtime = pi->ctime = pi->dirstat.mtime;
       if (touched_chattr)
       if (touched_mtime)
        pi->mtime = pi->ctime = pi->dirstat.mtime;
       if (touched_chattr)
-       pi->change_attr = pi->dirstat.change_attr;
+       pi->change_attr++;
+
       dout(20) << " final dirstat " << pi->dirstat << dendl;
 
       if (dirstat_valid && !dirstat.same_sums(pi->dirstat)) {
       dout(20) << " final dirstat " << pi->dirstat << dendl;
 
       if (dirstat_valid && !dirstat.same_sums(pi->dirstat)) {
@@ -3792,7 +3793,9 @@ int CInode::encode_inodestat(bufferlist& bl, Session *session,
   dout(20) << " pfile " << pfile << " pauth " << pauth
           << " plink " << plink << " pxattr " << pxattr
           << " plocal " << plocal
   dout(20) << " pfile " << pfile << " pauth " << pauth
           << " plink " << plink << " pxattr " << pxattr
           << " plocal " << plocal
+          << " mtime " << any_i->mtime
           << " ctime " << any_i->ctime
           << " ctime " << any_i->ctime
+          << " change_attr " << any_i->change_attr
           << " valid=" << valid << dendl;
 
   // file
           << " valid=" << valid << dendl;
 
   // file
@@ -4138,7 +4141,7 @@ void CInode::encode_cap_message(const ref_t<MClientCaps> &m, Capability *cap)
 
   dout(20) << __func__ << " pfile " << pfile
           << " pauth " << pauth << " plink " << plink << " pxattr " << pxattr
 
   dout(20) << __func__ << " pfile " << pfile
           << " pauth " << pauth << " plink " << plink << " pxattr " << pxattr
-          << " ctime " << i->ctime << dendl;
+          << " mtime " << i->mtime << " ctime " << i->ctime << " change_attr " << i->change_attr << dendl;
 
   i = pfile ? pi:oi;
   m->set_layout(i->layout);
 
   i = pfile ? pi:oi;
   m->set_layout(i->layout);
@@ -4703,6 +4706,10 @@ void CInode::validate_disk_state(CInode::validated_data *results,
         results->backtrace.error_str << "failed to read off disk; see retval";
         // we probably have a new unwritten file!
         // so skip the backtrace scrub for this entry and say that all's well
         results->backtrace.error_str << "failed to read off disk; see retval";
         // we probably have a new unwritten file!
         // so skip the backtrace scrub for this entry and say that all's well
+        if (in->is_mdsdir()){
+          dout(20) << "forcing backtrace as passed since mdsdir actually doesn't have backtrace" << dendl;
+          results->backtrace.passed = true;
+        }
         if (in->is_dirty_parent()) {
           dout(20) << "forcing backtrace as passed since inode is dirty parent" << dendl;
           results->backtrace.passed = true;
         if (in->is_dirty_parent()) {
           dout(20) << "forcing backtrace as passed since inode is dirty parent" << dendl;
           results->backtrace.passed = true;
index 150ad5764825712d592e0ac98220d121dfa57a0e..22802079d85d4879b64bfdf71d3cbc4167b9cf69 100644 (file)
@@ -147,12 +147,11 @@ bool DamageTable::notify_dentry(
     return true;
   }
 
     return true;
   }
 
-  auto key = DirFragIdent(ino, frag);
-  if (dentries.count(key) == 0) {
-    DamageEntryRef entry = std::make_shared<DentryDamage>(
-        ino, frag, dname, snap_id);
+  auto& df_dentries = dentries[DirFragIdent(ino, frag)];
+  if (auto [it, inserted] = df_dentries.try_emplace(DentryIdent(dname, snap_id)); inserted) {
+    auto entry = std::make_shared<DentryDamage>(ino, frag, dname, snap_id);
     entry->path = path;
     entry->path = path;
-    dentries[key][DentryIdent(dname, snap_id)] = entry;
+    it->second = entry;
     by_id[entry->id] = std::move(entry);
   }
 
     by_id[entry->id] = std::move(entry);
   }
 
@@ -175,11 +174,10 @@ bool DamageTable::notify_dirfrag(inodeno_t ino, frag_t frag,
     return true;
   }
 
     return true;
   }
 
-  auto key = DirFragIdent(ino, frag);
-  if (dirfrags.count(key) == 0) {
+  if (auto [it, inserted] = dirfrags.try_emplace(DirFragIdent(ino, frag)); inserted) {
     DamageEntryRef entry = std::make_shared<DirFragDamage>(ino, frag);
     entry->path = path;
     DamageEntryRef entry = std::make_shared<DirFragDamage>(ino, frag);
     entry->path = path;
-    dirfrags[key] = entry;
+    it->second = entry;
     by_id[entry->id] = std::move(entry);
   }
 
     by_id[entry->id] = std::move(entry);
   }
 
@@ -192,10 +190,10 @@ bool DamageTable::notify_remote_damaged(inodeno_t ino, std::string_view path)
     return true;
   }
 
     return true;
   }
 
-  if (remotes.count(ino) == 0) {
+  if (auto [it, inserted] = remotes.try_emplace(ino); inserted) {
     auto entry = std::make_shared<BacktraceDamage>(ino);
     entry->path = path;
     auto entry = std::make_shared<BacktraceDamage>(ino);
     entry->path = path;
-    remotes[ino] = entry;
+    it->second = entry;
     by_id[entry->id] = std::move(entry);
   }
 
     by_id[entry->id] = std::move(entry);
   }
 
index 099c1337ceb864b1da9e30a71bab8d550e60284a..5bf2f6b267f1d2ab75c5aa2c478f4fc1a4013461 100644 (file)
 #include "common/Formatter.h"
 #include "mds/mdstypes.h"
 
 #include "common/Formatter.h"
 #include "mds/mdstypes.h"
 
+#if __cplusplus <= 201703L
+template<class Key, class T, class Compare, class Alloc, class Pred>
+typename std::map<Key, T, Compare, Alloc>::size_type
+erase_if(std::map<Key, T, Compare, Alloc>& c, Pred pred) {
+  auto old_size = c.size();
+  for (auto i = c.begin(), last = c.end(); i != last; ) {
+    if (pred(*i)) {
+      i = c.erase(i);
+    } else {
+      ++i;
+    }
+  }
+  return old_size - c.size();
+}
+#endif
+
 class health_check_map_t;
 
 struct ClusterInfo {
 class health_check_map_t;
 
 struct ClusterInfo {
@@ -259,19 +275,13 @@ public:
       return;
     }
 
       return;
     }
 
-    for (auto &f : filesystems) {
-      std::string_view fs_name = f.second->mds_map.get_fs_name();
-      if (std::find(allowed.begin(), allowed.end(), fs_name) == allowed.end()) {
-       filesystems.erase(f.first);
-      }
-    }
+    erase_if(filesystems, [&](const auto& f) {
+      return std::find(allowed.begin(), allowed.end(), f.second->mds_map.get_fs_name()) == allowed.end();
+    });
 
 
-    for (auto r : mds_roles) {
-      std::string_view fs_name = fs_name_from_gid(r.first);
-      if (std::find(allowed.begin(), allowed.end(), fs_name) == allowed.end()) {
-       mds_roles.erase(r.first);
-      }
-    }
+    erase_if(mds_roles, [&](const auto& r) {
+      return std::find(allowed.begin(), allowed.end(), fs_name_from_gid(r.first)) == allowed.end();
+    });
   }
 
   void set_enable_multiple(const bool v)
   }
 
   void set_enable_multiple(const bool v)
index a73c4225cbf27d58986db974401249b03058faee..409185f7398ff95a7763f31e950302da6a795e3b 100644 (file)
@@ -1925,8 +1925,13 @@ bool Locker::xlock_start(SimpleLock *lock, MDRequestRef& mut)
       }
 
       if (!lock->is_stable() && (lock->get_state() != LOCK_XLOCKDONE ||
       }
 
       if (!lock->is_stable() && (lock->get_state() != LOCK_XLOCKDONE ||
-                                lock->get_xlock_by_client() != client ||
-                                lock->is_waiter_for(SimpleLock::WAIT_STABLE)))
+                                lock->get_xlock_by_client() != client ||
+                                lock->is_waiter_for(SimpleLock::WAIT_STABLE)))
+       break;
+      // Avoid unstable XLOCKDONE state reset,
+      // see: https://tracker.ceph.com/issues/49132
+      if (lock->get_state() == LOCK_XLOCKDONE &&
+          lock->get_type() == CEPH_LOCK_IFILE)
        break;
 
       if (lock->get_state() == LOCK_LOCK || lock->get_state() == LOCK_XLOCKDONE) {
        break;
 
       if (lock->get_state() == LOCK_LOCK || lock->get_state() == LOCK_XLOCKDONE) {
index 387cd9b478b0e71c22f72dfb8207b390e6b74dbc..7ceea6769b38364312c1c3a83868b9e54d15bada 100644 (file)
@@ -2182,7 +2182,7 @@ void MDCache::predirty_journal_parents(MutationRef mut, EMetaBlob *blob,
       if (do_parent_mtime) {
        pf->fragstat.mtime = mut->get_op_stamp();
        pf->fragstat.change_attr++;
       if (do_parent_mtime) {
        pf->fragstat.mtime = mut->get_op_stamp();
        pf->fragstat.change_attr++;
-       dout(10) << "predirty_journal_parents bumping change_attr to " << pf->fragstat.change_attr << " on " << parent << dendl;
+       dout(10) << "predirty_journal_parents bumping fragstat change_attr to " << pf->fragstat.change_attr << " on " << parent << dendl;
        if (pf->fragstat.mtime > pf->rstat.rctime) {
          dout(10) << "predirty_journal_parents updating mtime on " << *parent << dendl;
          pf->rstat.rctime = pf->fragstat.mtime;
        if (pf->fragstat.mtime > pf->rstat.rctime) {
          dout(10) << "predirty_journal_parents updating mtime on " << *parent << dendl;
          pf->rstat.rctime = pf->fragstat.mtime;
@@ -2308,7 +2308,7 @@ void MDCache::predirty_journal_parents(MutationRef mut, EMetaBlob *blob,
       if (touched_mtime)
        pi.inode->mtime = pi.inode->ctime = pi.inode->dirstat.mtime;
       if (touched_chattr)
       if (touched_mtime)
        pi.inode->mtime = pi.inode->ctime = pi.inode->dirstat.mtime;
       if (touched_chattr)
-       pi.inode->change_attr = pi.inode->dirstat.change_attr;
+       pi.inode->change_attr++;
       dout(20) << "predirty_journal_parents     gives " << pi.inode->dirstat << " on " << *pin << dendl;
 
       if (parent->get_frag() == frag_t()) { // i.e., we are the only frag
       dout(20) << "predirty_journal_parents     gives " << pi.inode->dirstat << " on " << *pin << dendl;
 
       if (parent->get_frag() == frag_t()) { // i.e., we are the only frag
@@ -8116,6 +8116,10 @@ void MDCache::dispatch(const cref_t<Message> &m)
   case MSG_MDS_DENTRYUNLINK:
     handle_dentry_unlink(ref_cast<MDentryUnlink>(m));
     break;
   case MSG_MDS_DENTRYUNLINK:
     handle_dentry_unlink(ref_cast<MDentryUnlink>(m));
     break;
+  case MSG_MDS_DENTRYUNLINK_ACK:
+    handle_dentry_unlink_ack(ref_cast<MDentryUnlinkAck>(m));
+    break;
+
 
   case MSG_MDS_FRAGMENTNOTIFY:
     handle_fragment_notify(ref_cast<MMDSFragmentNotify>(m));
 
   case MSG_MDS_FRAGMENTNOTIFY:
     handle_fragment_notify(ref_cast<MMDSFragmentNotify>(m));
@@ -9952,6 +9956,7 @@ void MDCache::scan_stray_dir(dirfrag_t next)
        }
       }
     }
        }
       }
     }
+    next.frag = frag_t();
   }
 }
 
   }
 }
 
@@ -11034,7 +11039,8 @@ void MDCache::handle_dentry_link(const cref_t<MDentryLink> &m)
 
 // UNLINK
 
 
 // UNLINK
 
-void MDCache::send_dentry_unlink(CDentry *dn, CDentry *straydn, MDRequestRef& mdr)
+void MDCache::send_dentry_unlink(CDentry *dn, CDentry *straydn,
+                                 MDRequestRef& mdr, bool unlinking)
 {
   dout(10) << __func__ << " " << *dn << dendl;
   // share unlink news with replicas
 {
   dout(10) << __func__ << " " << *dn << dendl;
   // share unlink news with replicas
@@ -11046,6 +11052,11 @@ void MDCache::send_dentry_unlink(CDentry *dn, CDentry *straydn, MDRequestRef& md
     CInode *strayin = straydn->get_linkage()->get_inode();
     strayin->encode_snap_blob(snapbl);
   }
     CInode *strayin = straydn->get_linkage()->get_inode();
     strayin->encode_snap_blob(snapbl);
   }
+
+  if (unlinking) {
+    ceph_assert(!straydn);
+    dn->replica_unlinking_ref = 0;
+  }
   for (set<mds_rank_t>::iterator it = replicas.begin();
        it != replicas.end();
        ++it) {
   for (set<mds_rank_t>::iterator it = replicas.begin();
        it != replicas.end();
        ++it) {
@@ -11058,12 +11069,21 @@ void MDCache::send_dentry_unlink(CDentry *dn, CDentry *straydn, MDRequestRef& md
         rejoin_gather.count(*it)))
       continue;
 
         rejoin_gather.count(*it)))
       continue;
 
-    auto unlink = make_message<MDentryUnlink>(dn->get_dir()->dirfrag(), dn->get_name());
+    auto unlink = make_message<MDentryUnlink>(dn->get_dir()->dirfrag(),
+                                              dn->get_name(), unlinking);
     if (straydn) {
       encode_replica_stray(straydn, *it, unlink->straybl);
       unlink->snapbl = snapbl;
     }
     mds->send_message_mds(unlink, *it);
     if (straydn) {
       encode_replica_stray(straydn, *it, unlink->straybl);
       unlink->snapbl = snapbl;
     }
     mds->send_message_mds(unlink, *it);
+    if (unlinking) {
+      dn->replica_unlinking_ref++;
+      dn->get(CDentry::PIN_WAITUNLINKSTATE);
+    }
+  }
+
+  if (unlinking && dn->replica_unlinking_ref) {
+    dn->add_waiter(CDentry::WAIT_UNLINK_STATE, new C_MDS_RetryRequest(this, mdr));
   }
 }
 
   }
 }
 
@@ -11072,23 +11092,40 @@ void MDCache::handle_dentry_unlink(const cref_t<MDentryUnlink> &m)
   // straydn
   CDentry *straydn = nullptr;
   CInode *strayin = nullptr;
   // straydn
   CDentry *straydn = nullptr;
   CInode *strayin = nullptr;
+
   if (m->straybl.length())
     decode_replica_stray(straydn, &strayin, m->straybl, mds_rank_t(m->get_source().num()));
 
   if (m->straybl.length())
     decode_replica_stray(straydn, &strayin, m->straybl, mds_rank_t(m->get_source().num()));
 
+  boost::intrusive_ptr<MDentryUnlinkAck> ack;
+  CDentry::linkage_t *dnl;
+  CDentry *dn;
+  CInode *in;
+  bool hadrealm;
+
   CDir *dir = get_dirfrag(m->get_dirfrag());
   if (!dir) {
     dout(7) << __func__ << " don't have dirfrag " << m->get_dirfrag() << dendl;
   CDir *dir = get_dirfrag(m->get_dirfrag());
   if (!dir) {
     dout(7) << __func__ << " don't have dirfrag " << m->get_dirfrag() << dendl;
+    if (m->is_unlinking())
+      goto ack;
   } else {
   } else {
-    CDentry *dn = dir->lookup(m->get_dn());
+    dn = dir->lookup(m->get_dn());
     if (!dn) {
       dout(7) << __func__ << " don't have dentry " << *dir << " dn " << m->get_dn() << dendl;
     if (!dn) {
       dout(7) << __func__ << " don't have dentry " << *dir << " dn " << m->get_dn() << dendl;
+      if (m->is_unlinking())
+        goto ack;
     } else {
       dout(7) << __func__ << " on " << *dn << dendl;
     } else {
       dout(7) << __func__ << " on " << *dn << dendl;
-      CDentry::linkage_t *dnl = dn->get_linkage();
+
+      if (m->is_unlinking()) {
+        dn->state_set(CDentry::STATE_UNLINKING);
+        goto ack;
+      }
+
+      dnl = dn->get_linkage();
 
       // open inode?
       if (dnl->is_primary()) {
 
       // open inode?
       if (dnl->is_primary()) {
-       CInode *in = dnl->get_inode();
+       in = dnl->get_inode();
        dn->dir->unlink_inode(dn);
        ceph_assert(straydn);
        straydn->dir->link_primary_inode(straydn, in);
        dn->dir->unlink_inode(dn);
        ceph_assert(straydn);
        straydn->dir->link_primary_inode(straydn, in);
@@ -11099,11 +11136,12 @@ void MDCache::handle_dentry_unlink(const cref_t<MDentryUnlink> &m)
        in->first = straydn->first;
 
        // update subtree map?
        in->first = straydn->first;
 
        // update subtree map?
-       if (in->is_dir()) 
+       if (in->is_dir()) {
          adjust_subtree_after_rename(in, dir, false);
          adjust_subtree_after_rename(in, dir, false);
+       }
 
        if (m->snapbl.length()) {
 
        if (m->snapbl.length()) {
-         bool hadrealm = (in->snaprealm ? true : false);
+         hadrealm = (in->snaprealm ? true : false);
          in->decode_snap_blob(m->snapbl);
          ceph_assert(in->snaprealm);
          if (!hadrealm)
          in->decode_snap_blob(m->snapbl);
          ceph_assert(in->snaprealm);
          if (!hadrealm)
@@ -11114,7 +11152,7 @@ void MDCache::handle_dentry_unlink(const cref_t<MDentryUnlink> &m)
        if (in->is_any_caps() &&
            !in->state_test(CInode::STATE_EXPORTINGCAPS))
          migrator->export_caps(in);
        if (in->is_any_caps() &&
            !in->state_test(CInode::STATE_EXPORTINGCAPS))
          migrator->export_caps(in);
-       
+
        straydn = NULL;
       } else {
        ceph_assert(!straydn);
        straydn = NULL;
       } else {
        ceph_assert(!straydn);
@@ -11122,6 +11160,7 @@ void MDCache::handle_dentry_unlink(const cref_t<MDentryUnlink> &m)
        dn->dir->unlink_inode(dn);
       }
       ceph_assert(dnl->is_null());
        dn->dir->unlink_inode(dn);
       }
       ceph_assert(dnl->is_null());
+      dn->state_clear(CDentry::STATE_UNLINKING);
     }
   }
 
     }
   }
 
@@ -11133,8 +11172,36 @@ void MDCache::handle_dentry_unlink(const cref_t<MDentryUnlink> &m)
     trim_dentry(straydn, ex);
     send_expire_messages(ex);
   }
     trim_dentry(straydn, ex);
     send_expire_messages(ex);
   }
+  return;
+
+ack:
+  ack = make_message<MDentryUnlinkAck>(m->get_dirfrag(), m->get_dn());
+  mds->send_message(ack, m->get_connection());
 }
 
 }
 
+void MDCache::handle_dentry_unlink_ack(const cref_t<MDentryUnlinkAck> &m)
+{
+  CDir *dir = get_dirfrag(m->get_dirfrag());
+  if (!dir) {
+    dout(7) << __func__ << " don't have dirfrag " << m->get_dirfrag() << dendl;
+  } else {
+    CDentry *dn = dir->lookup(m->get_dn());
+    if (!dn) {
+      dout(7) << __func__ << " don't have dentry " << *dir << " dn " << m->get_dn() << dendl;
+    } else {
+      dout(7) << __func__ << " on " << *dn << " ref "
+             << dn->replica_unlinking_ref << " -> "
+             << dn->replica_unlinking_ref - 1 << dendl;
+      dn->replica_unlinking_ref--;
+      if (!dn->replica_unlinking_ref) {
+        MDSContext::vec finished;
+        dn->take_waiting(CDentry::WAIT_UNLINK_STATE, finished);
+        mds->queue_waiters(finished);
+      }
+      dn->put(CDentry::PIN_WAITUNLINKSTATE);
+    }
+  }
+}
 
 
 
 
 
 
index f5b4e2a06124da80789da1a622c047067f1eb3d0..66eae6c293327e1936691ef5c37adc655d700ffa 100644 (file)
@@ -879,7 +879,7 @@ class MDCache {
   void encode_remote_dentry_link(CDentry::linkage_t *dnl, bufferlist& bl);
   void decode_remote_dentry_link(CDir *dir, CDentry *dn, bufferlist::const_iterator& p);
   void send_dentry_link(CDentry *dn, MDRequestRef& mdr);
   void encode_remote_dentry_link(CDentry::linkage_t *dnl, bufferlist& bl);
   void decode_remote_dentry_link(CDir *dir, CDentry *dn, bufferlist::const_iterator& p);
   void send_dentry_link(CDentry *dn, MDRequestRef& mdr);
-  void send_dentry_unlink(CDentry *dn, CDentry *straydn, MDRequestRef& mdr);
+  void send_dentry_unlink(CDentry *dn, CDentry *straydn, MDRequestRef& mdr, bool unlinking=false);
 
   void wait_for_uncommitted_fragment(dirfrag_t dirfrag, MDSContext *c) {
     uncommitted_fragments.at(dirfrag).waiters.push_back(c);
 
   void wait_for_uncommitted_fragment(dirfrag_t dirfrag, MDSContext *c) {
     uncommitted_fragments.at(dirfrag).waiters.push_back(c);
@@ -1115,6 +1115,7 @@ class MDCache {
   void handle_discover_reply(const cref_t<MDiscoverReply> &m);
   void handle_dentry_link(const cref_t<MDentryLink> &m);
   void handle_dentry_unlink(const cref_t<MDentryUnlink> &m);
   void handle_discover_reply(const cref_t<MDiscoverReply> &m);
   void handle_dentry_link(const cref_t<MDentryLink> &m);
   void handle_dentry_unlink(const cref_t<MDentryUnlink> &m);
+  void handle_dentry_unlink_ack(const cref_t<MDentryUnlinkAck> &m);
 
   int dump_cache(std::string_view fn, Formatter *f, double timeout);
 
 
   int dump_cache(std::string_view fn, Formatter *f, double timeout);
 
index eea60b48ae527d475d22aaf8a69166d1c24e4971..337c1025a3cbc7586ee683ee6fa0cabde186cc45 100644 (file)
@@ -1159,17 +1159,7 @@ void MDLog::_reformat_journal(JournalPointer const &jp_in, Journaler *old_journa
   // state doesn't change in between.
   uint32_t events_transcribed = 0;
   while (1) {
   // state doesn't change in between.
   uint32_t events_transcribed = 0;
   while (1) {
-    while (!old_journal->is_readable() &&
-          old_journal->get_read_pos() < old_journal->get_write_pos() &&
-          !old_journal->get_error()) {
-
-      // Issue a journal prefetch
-      C_SaferCond readable_waiter;
-      old_journal->wait_for_readable(&readable_waiter);
-
-      // Wait for a journal prefetch to complete
-      readable_waiter.wait();
-    }
+    old_journal->check_isreadable();
     if (old_journal->get_error()) {
       r = old_journal->get_error();
       dout(0) << "_replay journaler got error " << r << ", aborting" << dendl;
     if (old_journal->get_error()) {
       r = old_journal->get_error();
       dout(0) << "_replay journaler got error " << r << ", aborting" << dendl;
@@ -1309,13 +1299,7 @@ void MDLog::_replay_thread()
   int r = 0;
   while (1) {
     // wait for read?
   int r = 0;
   while (1) {
     // wait for read?
-    while (!journaler->is_readable() &&
-          journaler->get_read_pos() < journaler->get_write_pos() &&
-          !journaler->get_error()) {
-      C_SaferCond readable_waiter;
-      journaler->wait_for_readable(&readable_waiter);
-      r = readable_waiter.wait();
-    }
+    journaler->check_isreadable(); 
     if (journaler->get_error()) {
       r = journaler->get_error();
       dout(0) << "_replay journaler got error " << r << ", aborting" << dendl;
     if (journaler->get_error()) {
       r = journaler->get_error();
       dout(0) << "_replay journaler got error " << r << ", aborting" << dendl;
index 6111f85a97f97bea5a221ca429954cd23f5a4e46..b42fa5dd7159445dd9637096ab1b0d1af2e1bab4 100644 (file)
@@ -14,6 +14,7 @@
 #ifndef CEPH_MDLOG_H
 #define CEPH_MDLOG_H
 
 #ifndef CEPH_MDLOG_H
 #define CEPH_MDLOG_H
 
+#include "common/fair_mutex.h"
 #include "include/common_fwd.h"
 
 enum {
 #include "include/common_fwd.h"
 
 enum {
@@ -285,8 +286,8 @@ protected:
 
   int64_t mdsmap_up_features = 0;
   std::map<uint64_t,std::list<PendingEvent> > pending_events; // log segment -> event list
 
   int64_t mdsmap_up_features = 0;
   std::map<uint64_t,std::list<PendingEvent> > pending_events; // log segment -> event list
-  ceph::mutex submit_mutex = ceph::make_mutex("MDLog::submit_mutex");
-  ceph::condition_variable submit_cond;
+  ceph::fair_mutex submit_mutex{"MDLog::submit_mutex"};
+  std::condition_variable_any submit_cond;
 
 private:
   friend class C_MaybeExpiredSegment;
 
 private:
   friend class C_MaybeExpiredSegment;
index fef8a18e002b5312de6a25b99ae517ad817a087c..e45cb142b7aeaa9726094fe7cb4417c28756f9c3 100644 (file)
@@ -116,6 +116,7 @@ public:
   int call(
     std::string_view command,
     const cmdmap_t& cmdmap,
   int call(
     std::string_view command,
     const cmdmap_t& cmdmap,
+    const bufferlist&,
     Formatter *f,
     std::ostream& errss,
     ceph::buffer::list& out) override {
     Formatter *f,
     std::ostream& errss,
     ceph::buffer::list& out) override {
@@ -546,7 +547,8 @@ int MDSDaemon::init()
       continue;
     }
     derr << "ERROR: failed to refresh rotating keys, "
       continue;
     }
     derr << "ERROR: failed to refresh rotating keys, "
-         << "maximum retry time reached." << dendl;
+         << "maximum retry time reached."
+        << " Maybe I have a clock skew against the monitors?" << dendl;
     std::lock_guard locker{mds_lock};
     suicide();
     return -CEPHFS_ETIMEDOUT;
     std::lock_guard locker{mds_lock};
     suicide();
     return -CEPHFS_ETIMEDOUT;
index cb6c389dd431a7e69dc002f3ea475bcc14ec801e..e8f416bd97ac7112e60943cd2c2d263ec70c797b 100644 (file)
@@ -376,7 +376,7 @@ uint32_t PurgeQueue::_calculate_ops(const PurgeItem &item) const
     const uint64_t num = (item.size > 0) ?
       Striper::get_num_objects(item.layout, item.size) : 1;
 
     const uint64_t num = (item.size > 0) ?
       Striper::get_num_objects(item.layout, item.size) : 1;
 
-    ops_required = std::min(num, g_conf()->filer_max_purge_ops);
+    ops_required = num;
 
     // Account for deletions for old pools
     if (item.action != PurgeItem::TRUNCATE_FILE) {
 
     // Account for deletions for old pools
     if (item.action != PurgeItem::TRUNCATE_FILE) {
@@ -850,4 +850,3 @@ std::string_view PurgeItem::get_type_str() const
     return "UNKNOWN";
   }
 }
     return "UNKNOWN";
   }
 }
-
index b01eb92b368495267b73ed4717244e92858205a3..7097eb675ead272096b2690f21fde571e6945027 100644 (file)
@@ -60,6 +60,8 @@
 
 #include "common/config.h"
 
 
 #include "common/config.h"
 
+#include "msg/Message.h"
+
 #define dout_context g_ceph_context
 #define dout_subsys ceph_subsys_mds
 #undef dout_prefix
 #define dout_context g_ceph_context
 #define dout_subsys ceph_subsys_mds
 #undef dout_prefix
@@ -361,8 +363,8 @@ void Server::dispatch(const cref_t<Message> &m)
     handle_peer_request(ref_cast<MMDSPeerRequest>(m));
     return;
   default:
     handle_peer_request(ref_cast<MMDSPeerRequest>(m));
     return;
   default:
-    derr << "server unknown message " << m->get_type() << dendl;
-    ceph_abort_msg("server unknown message");  
+    derr << "Server unknown message " << m->get_type() << " from peer type " << m->get_connection()->get_peer_type() << dendl;
+    ceph_abort_msg("server unknown message  " + to_string(m->get_type()) + " from peer type " + to_string(m->get_connection()->get_peer_type()));  
   }
 }
 
   }
 }
 
@@ -438,7 +440,7 @@ void Server::reclaim_session(Session *session, const cref_t<MClientReclaim> &m)
   unsigned flags = m->get_flags();
   if (flags != CEPH_RECLAIM_RESET) { // currently only support reset
     dout(10) << __func__ << " unsupported flags" << dendl;
   unsigned flags = m->get_flags();
   if (flags != CEPH_RECLAIM_RESET) { // currently only support reset
     dout(10) << __func__ << " unsupported flags" << dendl;
-    reply->set_result(-CEPHFS_EOPNOTSUPP);
+    reply->set_result(-CEPHFS_EINVAL);
     mds->send_message_client(reply, session);
     return;
   }
     mds->send_message_client(reply, session);
     return;
   }
@@ -460,10 +462,7 @@ void Server::reclaim_session(Session *session, const cref_t<MClientReclaim> &m)
 
   if (flags & CEPH_RECLAIM_RESET) {
     finish_reclaim_session(session, reply);
 
   if (flags & CEPH_RECLAIM_RESET) {
     finish_reclaim_session(session, reply);
-    return;
-  }
-
-  ceph_abort();
+  } else ceph_assert(0); /* no other flags are handled at this time */
 }
 
 void Server::finish_reclaim_session(Session *session, const ref_t<MClientReclaimReply> &reply)
 }
 
 void Server::finish_reclaim_session(Session *session, const ref_t<MClientReclaimReply> &reply)
@@ -507,8 +506,9 @@ void Server::finish_reclaim_session(Session *session, const ref_t<MClientReclaim
 void Server::handle_client_reclaim(const cref_t<MClientReclaim> &m)
 {
   Session *session = mds->get_session(m);
 void Server::handle_client_reclaim(const cref_t<MClientReclaim> &m)
 {
   Session *session = mds->get_session(m);
+  uint32_t flags = m->get_flags();
   dout(3) << __func__ <<  " " << *m << " from " << m->get_source() << dendl;
   dout(3) << __func__ <<  " " << *m << " from " << m->get_source() << dendl;
-  ceph_assert(m->get_source().is_client()); // should _not_ come from an mds!
+  ceph_assert(m->is_a_client()); // should _not_ come from an mds!
 
   if (!session) {
     dout(0) << " ignoring sessionless msg " << *m << dendl;
 
   if (!session) {
     dout(0) << " ignoring sessionless msg " << *m << dendl;
@@ -526,7 +526,15 @@ void Server::handle_client_reclaim(const cref_t<MClientReclaim> &m)
     return;
   }
 
     return;
   }
 
-  if (m->get_flags() & MClientReclaim::FLAG_FINISH) {
+  if (flags & MClientReclaim::FLAG_FINISH) {
+    if (flags ^ MClientReclaim::FLAG_FINISH) {
+      dout(0) << __func__ << " client specified FLAG_FINISH with other flags."
+                             " Other flags:" << flags << dendl;
+      auto reply = make_message<MClientReclaimReply>(0);
+      reply->set_result(-CEPHFS_EINVAL);
+      mds->send_message_client(reply, session);
+      return;
+    }
     finish_reclaim_session(session);
   } else {
     reclaim_session(session, m);
     finish_reclaim_session(session);
   } else {
     reclaim_session(session, m);
@@ -539,7 +547,7 @@ void Server::handle_client_session(const cref_t<MClientSession> &m)
   Session *session = mds->get_session(m);
 
   dout(3) << "handle_client_session " << *m << " from " << m->get_source() << dendl;
   Session *session = mds->get_session(m);
 
   dout(3) << "handle_client_session " << *m << " from " << m->get_source() << dendl;
-  ceph_assert(m->get_source().is_client()); // should _not_ come from an mds!
+  ceph_assert(m->is_a_client()); // should _not_ come from an mds!
 
   if (!session) {
     dout(0) << " ignoring sessionless msg " << *m << dendl;
 
   if (!session) {
     dout(0) << " ignoring sessionless msg " << *m << dendl;
@@ -585,7 +593,23 @@ void Server::handle_client_session(const cref_t<MClientSession> &m)
        session->is_stale() ||
        session->is_killing() ||
        terminating_sessions) {
        session->is_stale() ||
        session->is_killing() ||
        terminating_sessions) {
-      dout(10) << "currently open|opening|stale|killing, dropping this req" << dendl;
+      if (m->supported_features.test(CEPHFS_FEATURE_NOTIFY_SESSION_STATE)) {
+       if (session->is_open() && !mds->is_stopping()) {
+          dout(10) << "currently already opened" << dendl;
+
+          auto reply = make_message<MClientSession>(CEPH_SESSION_OPEN,
+                                                    session->get_push_seq());
+          if (session->info.has_feature(CEPHFS_FEATURE_MIMIC))
+            reply->supported_features = supported_features;
+          mds->send_message_client(reply, session);
+          if (mdcache->is_readonly()) {
+            auto m = make_message<MClientSession>(CEPH_SESSION_FORCE_RO);
+            mds->send_message_client(m, session);
+          }
+       }
+      }
+      dout(10) << "currently " << session->get_state_name()
+               << ", dropping this req" << dendl;
       return;
     }
     ceph_assert(session->is_closed() || session->is_closing());
       return;
     }
     ceph_assert(session->is_closed() || session->is_closing());
@@ -782,7 +806,11 @@ void Server::handle_client_session(const cref_t<MClientSession> &m)
     break;
 
   default:
     break;
 
   default:
-    ceph_abort();
+    auto m = make_message<MClientSession>(CEPH_SESSION_REJECT);
+    mds->send_message_client(m, session);
+    derr << "Server received unknown message " << m->get_type() << ", closing session and blocklisting the client " << session->get_client() << dendl;
+    CachedStackStringStream css;
+    mds->evict_client(session->get_client().v, false, true, *css, nullptr);
   }
 }
 
   }
 }
 
@@ -1920,20 +1948,23 @@ void Server::journal_and_reply(MDRequestRef& mdr, CInode *in, CDentry *dn, LogEv
     mdr->pin(dn);
 
   early_reply(mdr, in, dn);
     mdr->pin(dn);
 
   early_reply(mdr, in, dn);
-  
+
   mdr->committing = true;
   submit_mdlog_entry(le, fin, mdr, __func__);
   mdr->committing = true;
   submit_mdlog_entry(le, fin, mdr, __func__);
-  
+
   if (mdr->client_request && mdr->client_request->is_queued_for_replay()) {
     if (mds->queue_one_replay()) {
       dout(10) << " queued next replay op" << dendl;
     } else {
       dout(10) << " journaled last replay op" << dendl;
     }
   if (mdr->client_request && mdr->client_request->is_queued_for_replay()) {
     if (mds->queue_one_replay()) {
       dout(10) << " queued next replay op" << dendl;
     } else {
       dout(10) << " journaled last replay op" << dendl;
     }
-  } else if (mdr->did_early_reply)
+  } else if (mdr->did_early_reply) {
     mds->locker->drop_rdlocks_for_early_reply(mdr.get());
     mds->locker->drop_rdlocks_for_early_reply(mdr.get());
-  else
+    if (dn && dn->is_waiter_for(CDentry::WAIT_UNLINK_FINISH))
+      mdlog->flush();
+  } else {
     mdlog->flush();
     mdlog->flush();
+  }
 }
 
 void Server::submit_mdlog_entry(LogEvent *le, MDSLogContextBase *fin, MDRequestRef& mdr,
 }
 
 void Server::submit_mdlog_entry(LogEvent *le, MDSLogContextBase *fin, MDRequestRef& mdr,
@@ -2345,7 +2376,7 @@ void Server::handle_client_request(const cref_t<MClientRequest> &req)
   bool sessionclosed_isok = replay_unsafe_with_closed_session;
   // active session?
   Session *session = 0;
   bool sessionclosed_isok = replay_unsafe_with_closed_session;
   // active session?
   Session *session = 0;
-  if (req->get_source().is_client()) {
+  if (req->is_a_client()) {
     session = mds->get_session(req);
     if (!session) {
       dout(5) << "no session for " << req->get_source() << ", dropping" << dendl;
     session = mds->get_session(req);
     if (!session) {
       dout(5) << "no session for " << req->get_source() << ", dropping" << dendl;
@@ -2449,7 +2480,7 @@ void Server::handle_client_request(const cref_t<MClientRequest> &req)
 
   // process embedded cap releases?
   //  (only if NOT replay!)
 
   // process embedded cap releases?
   //  (only if NOT replay!)
-  if (!req->releases.empty() && req->get_source().is_client() && !req->is_replay()) {
+  if (!req->releases.empty() && req->is_a_client() && !req->is_replay()) {
     client_t client = req->get_source().num();
     for (const auto &r : req->releases) {
       mds->locker->process_request_cap_release(mdr, client, r.item, r.dname);
     client_t client = req->get_source().num();
     for (const auto &r : req->releases) {
       mds->locker->process_request_cap_release(mdr, client, r.item, r.dname);
@@ -2860,7 +2891,7 @@ void Server::handle_peer_request_reply(const cref_t<MMDSPeerRequest> &m)
     break;
 
   default:
     break;
 
   default:
-    ceph_abort();
+    ceph_abort_msg("unknown op " + to_string(m->get_op()) + " requested");
   }
 }
 
   }
 }
 
@@ -2887,7 +2918,7 @@ void Server::dispatch_peer_request(MDRequestRef& mdr)
 
       if (!lock) {
        dout(10) << "don't have object, dropping" << dendl;
 
       if (!lock) {
        dout(10) << "don't have object, dropping" << dendl;
-       ceph_abort(); // can this happen, if we auth pinned properly.
+       ceph_abort_msg("don't have object"); // can this happen, if we auth pinned properly.
       }
       if (op == MMDSPeerRequest::OP_XLOCK && !lock->get_parent()->is_auth()) {
        dout(10) << "not auth for remote xlock attempt, dropping on " 
       }
       if (op == MMDSPeerRequest::OP_XLOCK && !lock->get_parent()->is_auth()) {
        dout(10) << "not auth for remote xlock attempt, dropping on " 
@@ -2974,7 +3005,7 @@ void Server::dispatch_peer_request(MDRequestRef& mdr)
     break;
 
   default: 
     break;
 
   default: 
-    ceph_abort();
+    ceph_abort_msg("unknown op "+ to_string(op)+ " received");
   }
 }
 
   }
 }
 
@@ -4432,6 +4463,11 @@ void Server::handle_client_openc(MDRequestRef& mdr)
   if (!dn)
     return;
 
   if (!dn)
     return;
 
+  if (is_unlink_pending(dn)) {
+    wait_for_pending_unlink(dn, mdr);
+    return;
+  }
+
   CDentry::linkage_t *dnl = dn->get_projected_linkage();
   if (!excl && !dnl->is_null()) {
     // it existed.
   CDentry::linkage_t *dnl = dn->get_projected_linkage();
   if (!excl && !dnl->is_null()) {
     // it existed.
@@ -6602,6 +6638,45 @@ void Server::handle_client_getvxattr(MDRequestRef& mdr)
 
 // ------------------------------------------------
 
 
 // ------------------------------------------------
 
+struct C_WaitUnlinkToFinish : public MDSContext {
+protected:
+  MDCache *mdcache;
+  CDentry *dn;
+  MDSContext *fin;
+
+  MDSRank *get_mds() override
+  {
+    ceph_assert(mdcache != NULL);
+    return mdcache->mds;
+  }
+
+public:
+  C_WaitUnlinkToFinish(MDCache *m, CDentry *d, MDSContext *f) :
+    mdcache(m), dn(d), fin(f) {}
+  void finish(int r) override {
+    fin->complete(r);
+    dn->put(CDentry::PIN_PURGING);
+  }
+};
+
+bool Server::is_unlink_pending(CDentry *dn)
+{
+  CDentry::linkage_t *dnl = dn->get_projected_linkage();
+  if (!dnl->is_null() && dn->state_test(CDentry::STATE_UNLINKING)) {
+      return true;
+  }
+  return false;
+}
+
+void Server::wait_for_pending_unlink(CDentry *dn, MDRequestRef& mdr)
+{
+  dout(20) << __func__ << " dn " << *dn << dendl;
+  mds->locker->drop_locks(mdr.get());
+  auto fin = new C_MDS_RetryRequest(mdcache, mdr);
+  dn->get(CDentry::PIN_PURGING);
+  dn->add_waiter(CDentry::WAIT_UNLINK_FINISH, new C_WaitUnlinkToFinish(mdcache, dn, fin));
+}
+
 // MKNOD
 
 class C_MDS_mknod_finish : public ServerLogContext {
 // MKNOD
 
 class C_MDS_mknod_finish : public ServerLogContext {
@@ -6665,6 +6740,11 @@ void Server::handle_client_mknod(MDRequestRef& mdr)
   if (!dn)
     return;
 
   if (!dn)
     return;
 
+  if (is_unlink_pending(dn)) {
+    wait_for_pending_unlink(dn, mdr);
+    return;
+  }
+
   CDir *dir = dn->get_dir();
   CInode *diri = dir->get_inode();
   if (!check_access(mdr, diri, MAY_WRITE))
   CDir *dir = dn->get_dir();
   CInode *diri = dir->get_inode();
   if (!check_access(mdr, diri, MAY_WRITE))
@@ -6763,6 +6843,11 @@ void Server::handle_client_mkdir(MDRequestRef& mdr)
   if (!dn)
     return;
 
   if (!dn)
     return;
 
+  if (is_unlink_pending(dn)) {
+    wait_for_pending_unlink(dn, mdr);
+    return;
+  }
+
   CDir *dir = dn->get_dir();
   CInode *diri = dir->get_inode();
 
   CDir *dir = dn->get_dir();
   CInode *diri = dir->get_inode();
 
@@ -6858,6 +6943,11 @@ void Server::handle_client_symlink(MDRequestRef& mdr)
   if (!dn)
     return;
 
   if (!dn)
     return;
 
+  if (is_unlink_pending(dn)) {
+    wait_for_pending_unlink(dn, mdr);
+    return;
+  }
+
   CDir *dir = dn->get_dir();
   CInode *diri = dir->get_inode();
 
   CDir *dir = dn->get_dir();
   CInode *diri = dir->get_inode();
 
@@ -6964,6 +7054,11 @@ void Server::handle_client_link(MDRequestRef& mdr)
     targeti = ret.second->get_projected_linkage()->get_inode();
   }
 
     targeti = ret.second->get_projected_linkage()->get_inode();
   }
 
+  if (is_unlink_pending(destdn)) {
+    wait_for_pending_unlink(destdn, mdr);
+    return;
+  }
+
   ceph_assert(destdn->get_projected_linkage()->is_null());
   if (req->get_alternate_name().size() > alternate_name_max) {
     dout(10) << " alternate_name longer than " << alternate_name_max << dendl;
   ceph_assert(destdn->get_projected_linkage()->is_null());
   if (req->get_alternate_name().size() > alternate_name_max) {
     dout(10) << " alternate_name longer than " << alternate_name_max << dendl;
@@ -7248,11 +7343,17 @@ void Server::_link_remote_finish(MDRequestRef& mdr, bool inc,
   mdr->apply();
 
   MDRequestRef null_ref;
   mdr->apply();
 
   MDRequestRef null_ref;
-  if (inc)
+  if (inc) {
     mdcache->send_dentry_link(dn, null_ref);
     mdcache->send_dentry_link(dn, null_ref);
-  else
+  } else {
+    dn->state_clear(CDentry::STATE_UNLINKING);
     mdcache->send_dentry_unlink(dn, NULL, null_ref);
     mdcache->send_dentry_unlink(dn, NULL, null_ref);
-  
+
+    MDSContext::vec finished;
+    dn->take_waiting(CDentry::WAIT_UNLINK_FINISH, finished);
+    mdcache->mds->queue_waiters(finished);
+  }
+
   // bump target popularity
   mds->balancer->hit_inode(targeti, META_POP_IWR);
   mds->balancer->hit_dir(dn->get_dir(), META_POP_IWR);
   // bump target popularity
   mds->balancer->hit_inode(targeti, META_POP_IWR);
   mds->balancer->hit_dir(dn->get_dir(), META_POP_IWR);
@@ -7626,10 +7727,20 @@ void Server::handle_client_unlink(MDRequestRef& mdr)
 
   if (rmdir)
     mdr->disable_lock_cache();
 
   if (rmdir)
     mdr->disable_lock_cache();
+
   CDentry *dn = rdlock_path_xlock_dentry(mdr, false, true);
   if (!dn)
     return;
 
   CDentry *dn = rdlock_path_xlock_dentry(mdr, false, true);
   if (!dn)
     return;
 
+  // notify replica MDSes the dentry is under unlink
+  if (!dn->state_test(CDentry::STATE_UNLINKING)) {
+    dn->state_set(CDentry::STATE_UNLINKING);
+    mdcache->send_dentry_unlink(dn, nullptr, mdr, true);
+    if (dn->replica_unlinking_ref) {
+      return;
+    }
+  }
+
   CDentry::linkage_t *dnl = dn->get_linkage(client, mdr);
   ceph_assert(!dnl->is_null());
   CInode *in = dnl->get_inode();
   CDentry::linkage_t *dnl = dn->get_linkage(client, mdr);
   ceph_assert(!dnl->is_null());
   CInode *in = dnl->get_inode();
@@ -7646,11 +7757,13 @@ void Server::handle_client_unlink(MDRequestRef& mdr)
     if (rmdir) {
       // do empty directory checks
       if (_dir_is_nonempty_unlocked(mdr, in)) {
     if (rmdir) {
       // do empty directory checks
       if (_dir_is_nonempty_unlocked(mdr, in)) {
-       respond_to_request(mdr, -CEPHFS_ENOTEMPTY);
+        dn->state_clear(CDentry::STATE_UNLINKING);
+        respond_to_request(mdr, -CEPHFS_ENOTEMPTY);
        return;
       }
     } else {
       dout(7) << "handle_client_unlink on dir " << *in << ", returning error" << dendl;
        return;
       }
     } else {
       dout(7) << "handle_client_unlink on dir " << *in << ", returning error" << dendl;
+      dn->state_clear(CDentry::STATE_UNLINKING);
       respond_to_request(mdr, -CEPHFS_EISDIR);
       return;
     }
       respond_to_request(mdr, -CEPHFS_EISDIR);
       return;
     }
@@ -7658,6 +7771,7 @@ void Server::handle_client_unlink(MDRequestRef& mdr)
     if (rmdir) {
       // unlink
       dout(7) << "handle_client_rmdir on non-dir " << *in << ", returning error" << dendl;
     if (rmdir) {
       // unlink
       dout(7) << "handle_client_rmdir on non-dir " << *in << ", returning error" << dendl;
+      dn->state_clear(CDentry::STATE_UNLINKING);
       respond_to_request(mdr, -CEPHFS_ENOTDIR);
       return;
     }
       respond_to_request(mdr, -CEPHFS_ENOTDIR);
       return;
     }
@@ -7665,8 +7779,10 @@ void Server::handle_client_unlink(MDRequestRef& mdr)
 
   CInode *diri = dn->get_dir()->get_inode();
   if ((!mdr->has_more() || mdr->more()->witnessed.empty())) {
 
   CInode *diri = dn->get_dir()->get_inode();
   if ((!mdr->has_more() || mdr->more()->witnessed.empty())) {
-    if (!check_access(mdr, diri, MAY_WRITE))
+    if (!check_access(mdr, diri, MAY_WRITE)) {
+      dn->state_clear(CDentry::STATE_UNLINKING);
       return;
       return;
+    }
   }
 
   // -- create stray dentry? --
   }
 
   // -- create stray dentry? --
@@ -7705,6 +7821,7 @@ void Server::handle_client_unlink(MDRequestRef& mdr)
   if (in->is_dir() &&
       _dir_is_nonempty(mdr, in)) {
     respond_to_request(mdr, -CEPHFS_ENOTEMPTY);
   if (in->is_dir() &&
       _dir_is_nonempty(mdr, in)) {
     respond_to_request(mdr, -CEPHFS_ENOTEMPTY);
+    dn->state_clear(CDentry::STATE_UNLINKING);
     return;
   }
 
     return;
   }
 
@@ -7904,9 +8021,14 @@ void Server::_unlink_local_finish(MDRequestRef& mdr,
   }
 
   mdr->apply();
   }
 
   mdr->apply();
-  
+
+  dn->state_clear(CDentry::STATE_UNLINKING);
   mdcache->send_dentry_unlink(dn, straydn, mdr);
   mdcache->send_dentry_unlink(dn, straydn, mdr);
-  
+
+  MDSContext::vec finished;
+  dn->take_waiting(CDentry::WAIT_UNLINK_FINISH, finished);
+  mdcache->mds->queue_waiters(finished);
+
   if (straydn) {
     // update subtree map?
     if (strayin->is_dir())
   if (straydn) {
     // update subtree map?
     if (strayin->is_dir())
@@ -7921,7 +8043,7 @@ void Server::_unlink_local_finish(MDRequestRef& mdr,
 
   // reply
   respond_to_request(mdr, 0);
 
   // reply
   respond_to_request(mdr, 0);
-  
+
   // removing a new dn?
   dn->get_dir()->try_remove_unlinked_dn(dn);
 
   // removing a new dn?
   dn->get_dir()->try_remove_unlinked_dn(dn);
 
@@ -8380,6 +8502,16 @@ void Server::handle_client_rename(MDRequestRef& mdr)
   if (!destdn)
     return;
 
   if (!destdn)
     return;
 
+  if (is_unlink_pending(destdn)) {
+    wait_for_pending_unlink(destdn, mdr);
+    return;
+  }
+
+  if (is_unlink_pending(srcdn)) {
+    wait_for_pending_unlink(srcdn, mdr);
+    return;
+  }
+
   dout(10) << " destdn " << *destdn << dendl;
   CDir *destdir = destdn->get_dir();
   ceph_assert(destdir->is_auth());
   dout(10) << " destdn " << *destdn << dendl;
   CDir *destdir = destdn->get_dir();
   ceph_assert(destdir->is_auth());
index 33054bd067eb7db02f04a77f2516b4a909636e6d..4217252ed7ba83b6b0aa062f06f44d90acdd9d75 100644 (file)
@@ -234,6 +234,9 @@ public:
 
   void handle_client_fsync(MDRequestRef& mdr);
 
 
   void handle_client_fsync(MDRequestRef& mdr);
 
+  bool is_unlink_pending(CDentry *dn);
+  void wait_for_pending_unlink(CDentry *dn, MDRequestRef& mdr);
+
   // open
   void handle_client_open(MDRequestRef& mdr);
   void handle_client_openc(MDRequestRef& mdr);  // O_CREAT variant.
   // open
   void handle_client_open(MDRequestRef& mdr);
   void handle_client_openc(MDRequestRef& mdr);  // O_CREAT variant.
index 3709ca8b9b4aff61359c8cb3ecfa3b82b77bc2d3..dda64edfcd2a6210bbbf32d2c13c40adab957e92 100644 (file)
@@ -23,6 +23,8 @@ static const std::array feature_names
   "deleg_ino",
   "metric_collect",
   "alternate_name",
   "deleg_ino",
   "metric_collect",
   "alternate_name",
+  "notify_session_state",
+  "op_getvxattr",
 };
 static_assert(feature_names.size() == CEPHFS_FEATURE_MAX + 1);
 
 };
 static_assert(feature_names.size() == CEPHFS_FEATURE_MAX + 1);
 
index 85a636e9b3f2e6d80176bf9b808d908312338744..75402f3eb85393589db007828b47ba9978bc430e 100644 (file)
@@ -30,20 +30,22 @@ namespace ceph {
 #define CEPHFS_CURRENT_RELEASE  CEPH_RELEASE_QUINCY
 
 // The first 5 bits are reserved for old ceph releases.
 #define CEPHFS_CURRENT_RELEASE  CEPH_RELEASE_QUINCY
 
 // The first 5 bits are reserved for old ceph releases.
-#define CEPHFS_FEATURE_JEWEL           5
-#define CEPHFS_FEATURE_KRAKEN          6
-#define CEPHFS_FEATURE_LUMINOUS                7
-#define CEPHFS_FEATURE_MIMIC           8
-#define CEPHFS_FEATURE_REPLY_ENCODING   9
-#define CEPHFS_FEATURE_RECLAIM_CLIENT  10
-#define CEPHFS_FEATURE_LAZY_CAP_WANTED  11
-#define CEPHFS_FEATURE_MULTI_RECONNECT  12
-#define CEPHFS_FEATURE_NAUTILUS         12
-#define CEPHFS_FEATURE_DELEG_INO        13
-#define CEPHFS_FEATURE_OCTOPUS          13
-#define CEPHFS_FEATURE_METRIC_COLLECT   14
-#define CEPHFS_FEATURE_ALTERNATE_NAME   15
-#define CEPHFS_FEATURE_MAX              15
+#define CEPHFS_FEATURE_JEWEL                5
+#define CEPHFS_FEATURE_KRAKEN               6
+#define CEPHFS_FEATURE_LUMINOUS             7
+#define CEPHFS_FEATURE_MIMIC                8
+#define CEPHFS_FEATURE_REPLY_ENCODING       9
+#define CEPHFS_FEATURE_RECLAIM_CLIENT       10
+#define CEPHFS_FEATURE_LAZY_CAP_WANTED      11
+#define CEPHFS_FEATURE_MULTI_RECONNECT      12
+#define CEPHFS_FEATURE_NAUTILUS             12
+#define CEPHFS_FEATURE_DELEG_INO            13
+#define CEPHFS_FEATURE_OCTOPUS              13
+#define CEPHFS_FEATURE_METRIC_COLLECT       14
+#define CEPHFS_FEATURE_ALTERNATE_NAME       15
+#define CEPHFS_FEATURE_NOTIFY_SESSION_STATE 16
+#define CEPHFS_FEATURE_OP_GETVXATTR         17
+#define CEPHFS_FEATURE_MAX                  17
 
 #define CEPHFS_FEATURES_ALL {          \
   0, 1, 2, 3, 4,                       \
 
 #define CEPHFS_FEATURES_ALL {          \
   0, 1, 2, 3, 4,                       \
@@ -60,6 +62,8 @@ namespace ceph {
   CEPHFS_FEATURE_OCTOPUS,               \
   CEPHFS_FEATURE_METRIC_COLLECT,        \
   CEPHFS_FEATURE_ALTERNATE_NAME,        \
   CEPHFS_FEATURE_OCTOPUS,               \
   CEPHFS_FEATURE_METRIC_COLLECT,        \
   CEPHFS_FEATURE_ALTERNATE_NAME,        \
+  CEPHFS_FEATURE_NOTIFY_SESSION_STATE,  \
+  CEPHFS_FEATURE_OP_GETVXATTR,          \
 }
 
 #define CEPHFS_METRIC_FEATURES_ALL {           \
 }
 
 #define CEPHFS_METRIC_FEATURES_ALL {           \
index 500a6fc83b1ae5495f65ca2bccb5737ca4654b82..77e8db1d0992bd201b693dab77e9ae2b531bbc24 100644 (file)
@@ -191,7 +191,9 @@ public:
     out << " size " << size << "/" << max_size;
     if (truncate_seq)
       out << " ts " << truncate_seq << "/" << truncate_size;
     out << " size " << size << "/" << max_size;
     if (truncate_seq)
       out << " ts " << truncate_seq << "/" << truncate_size;
-    out << " mtime " << mtime;
+    out << " mtime " << mtime
+        << " ctime " << ctime
+        << " change_attr " << change_attr;
     if (time_warp_seq)
       out << " tws " << time_warp_seq;
 
     if (time_warp_seq)
       out << " tws " << time_warp_seq;
 
index 210fa033c5219219616129d053795862df0b5768..fc52284416659ae4075084d18edeb24b26e16835 100644 (file)
 
 class MDentryUnlink final : public MMDSOp {
 private:
 
 class MDentryUnlink final : public MMDSOp {
 private:
-  static constexpr int HEAD_VERSION = 1;
+  static constexpr int HEAD_VERSION = 2;
   static constexpr int COMPAT_VERSION = 1;
   static constexpr int COMPAT_VERSION = 1;
-  
+
   dirfrag_t dirfrag;
   std::string dn;
   dirfrag_t dirfrag;
   std::string dn;
+  bool unlinking = false;
 
  public:
   dirfrag_t get_dirfrag() const { return dirfrag; }
   const std::string& get_dn() const { return dn; }
 
  public:
   dirfrag_t get_dirfrag() const { return dirfrag; }
   const std::string& get_dn() const { return dn; }
+  bool is_unlinking() const { return unlinking; }
 
   ceph::buffer::list straybl;
   ceph::buffer::list snapbl;
 
   ceph::buffer::list straybl;
   ceph::buffer::list snapbl;
@@ -38,10 +40,9 @@ private:
 protected:
   MDentryUnlink() :
     MMDSOp(MSG_MDS_DENTRYUNLINK, HEAD_VERSION, COMPAT_VERSION) { }
 protected:
   MDentryUnlink() :
     MMDSOp(MSG_MDS_DENTRYUNLINK, HEAD_VERSION, COMPAT_VERSION) { }
-  MDentryUnlink(dirfrag_t df, std::string_view n) :
+  MDentryUnlink(dirfrag_t df, std::string_view n, bool u=false) :
     MMDSOp(MSG_MDS_DENTRYUNLINK, HEAD_VERSION, COMPAT_VERSION),
     MMDSOp(MSG_MDS_DENTRYUNLINK, HEAD_VERSION, COMPAT_VERSION),
-    dirfrag(df),
-    dn(n) {}
+    dirfrag(df), dn(n), unlinking(u) {}
   ~MDentryUnlink() final {}
 
 public:
   ~MDentryUnlink() final {}
 
 public:
@@ -49,19 +50,66 @@ public:
   void print(std::ostream& o) const override {
     o << "dentry_unlink(" << dirfrag << " " << dn << ")";
   }
   void print(std::ostream& o) const override {
     o << "dentry_unlink(" << dirfrag << " " << dn << ")";
   }
-  
+
   void decode_payload() override {
     using ceph::decode;
     auto p = payload.cbegin();
     decode(dirfrag, p);
     decode(dn, p);
     decode(straybl, p);
   void decode_payload() override {
     using ceph::decode;
     auto p = payload.cbegin();
     decode(dirfrag, p);
     decode(dn, p);
     decode(straybl, p);
+    if (header.version >= 2)
+      decode(unlinking, p);
   }
   void encode_payload(uint64_t features) override {
     using ceph::encode;
     encode(dirfrag, payload);
     encode(dn, payload);
     encode(straybl, payload);
   }
   void encode_payload(uint64_t features) override {
     using ceph::encode;
     encode(dirfrag, payload);
     encode(dn, payload);
     encode(straybl, payload);
+    encode(unlinking, payload);
+  }
+private:
+  template<class T, typename... Args>
+  friend boost::intrusive_ptr<T> ceph::make_message(Args&&... args);
+  template<class T, typename... Args>
+  friend MURef<T> crimson::make_message(Args&&... args);
+};
+
+class MDentryUnlinkAck final : public MMDSOp {
+private:
+  static constexpr int HEAD_VERSION = 1;
+  static constexpr int COMPAT_VERSION = 1;
+
+  dirfrag_t dirfrag;
+  std::string dn;
+
+ public:
+  dirfrag_t get_dirfrag() const { return dirfrag; }
+  const std::string& get_dn() const { return dn; }
+
+protected:
+  MDentryUnlinkAck() :
+    MMDSOp(MSG_MDS_DENTRYUNLINK_ACK, HEAD_VERSION, COMPAT_VERSION) { }
+  MDentryUnlinkAck(dirfrag_t df, std::string_view n) :
+    MMDSOp(MSG_MDS_DENTRYUNLINK_ACK, HEAD_VERSION, COMPAT_VERSION),
+    dirfrag(df), dn(n) {}
+  ~MDentryUnlinkAck() final {}
+
+public:
+  std::string_view get_type_name() const override { return "dentry_unlink_ack";}
+  void print(std::ostream& o) const override {
+    o << "dentry_unlink_ack(" << dirfrag << " " << dn << ")";
+  }
+
+  void decode_payload() override {
+    using ceph::decode;
+    auto p = payload.cbegin();
+    decode(dirfrag, p);
+    decode(dn, p);
+  }
+  void encode_payload(uint64_t features) override {
+    using ceph::encode;
+    encode(dirfrag, payload);
+    encode(dn, payload);
   }
 private:
   template<class T, typename... Args>
   }
 private:
   template<class T, typename... Args>
diff --git a/ceph/src/messages/MMonUsedPendingKeys.h b/ceph/src/messages/MMonUsedPendingKeys.h
new file mode 100644 (file)
index 0000000..482330a
--- /dev/null
@@ -0,0 +1,48 @@
+// -*- mode:C++; tab-width:8; c-basic-offset:2; indent-tabs-mode:t -*- 
+// vim: ts=8 sw=2 smarttab
+/*
+ * Ceph - scalable distributed file system
+ *
+ * Copyright (C) 2004-2006 Sage Weil <sage@newdream.net>
+ *
+ * This is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License version 2.1, as published by the Free Software 
+ * Foundation.  See file COPYING.
+ * 
+ */
+
+#pragma once
+
+#include "messages/PaxosServiceMessage.h"
+
+class MMonUsedPendingKeys final : public PaxosServiceMessage {
+public:
+  std::map<EntityName,CryptoKey> used_pending_keys;
+  
+  MMonUsedPendingKeys() : PaxosServiceMessage{MSG_MON_USED_PENDING_KEYS, 0}
+  {}
+private:
+  ~MMonUsedPendingKeys() final {}
+
+public:
+  std::string_view get_type_name() const override { return "used_pending_keys"; }
+  void print(std::ostream& out) const override {
+    out << "used_pending_keys(" << used_pending_keys.size() << " keys)";
+  }
+
+  void decode_payload() override {
+    using ceph::decode;
+    auto p = payload.cbegin();
+    paxos_decode(p);
+    decode(used_pending_keys, p);
+  }
+  void encode_payload(uint64_t features) override {
+    using ceph::encode;
+    paxos_encode();
+    encode(used_pending_keys, payload);
+  }
+private:
+  template<class T, typename... Args>
+  friend boost::intrusive_ptr<T> ceph::make_message(Args&&... args);
+};
index 58c3d9ee4d6f4d9fc062150f645fa518313e9048..8c070dd8cbf414148f2ec5264744db69a341c25d 100644 (file)
@@ -1515,3 +1515,26 @@ void ActivePyModules::unregister_client(std::string_view name, std::string addrs
   dout(7) << "unregistering msgr client handle " << addrv << dendl;
   py_module_registry.unregister_client(name, addrv);
 }
   dout(7) << "unregistering msgr client handle " << addrv << dendl;
   py_module_registry.unregister_client(name, addrv);
 }
+
+PyObject* ActivePyModules::get_daemon_health_metrics()
+{
+  without_gil_t no_gil;
+  return daemon_state.with_daemons_by_server([&no_gil]
+      (const std::map<std::string, DaemonStateCollection> &all) {
+      no_gil.acquire_gil();
+      PyFormatter f;
+      for (const auto &[hostname, daemon_state] : all) {
+        for (const auto &[key, state] : daemon_state) {
+          f.open_array_section(ceph::to_string(key));
+          for (const auto &metric : state->daemon_health_metrics) {
+            f.open_object_section(metric.get_type_name());
+            f.dump_int("value", metric.get_n1());
+            f.dump_string("type", metric.get_type_name());
+            f.close_section();
+          }
+          f.close_section();
+        }
+      }
+      return f.get();
+  });
+}
index 218497c1e8982dd574fc3105c5176158e9787c11..6015084e3cdcd057426853e63a0343aea185291a 100644 (file)
@@ -222,6 +222,7 @@ public:
 
   void cluster_log(const std::string &channel, clog_type prio,
     const std::string &message);
 
   void cluster_log(const std::string &channel, clog_type prio,
     const std::string &message);
+  PyObject* get_daemon_health_metrics();
 
   bool inject_python_on() const;
   void update_cache_metrics();
 
   bool inject_python_on() const;
   void update_cache_metrics();
index ca441d5e539df1046c8b02ae0a6dc5231c1be345..4fb5b250b98b9cc79c404a8a27a454fae10f606a 100644 (file)
@@ -1411,6 +1411,12 @@ ceph_unregister_client(BaseMgrModule *self, PyObject *args)
   Py_RETURN_NONE;
 }
 
   Py_RETURN_NONE;
 }
 
+static PyObject*
+ceph_get_daemon_health_metrics(BaseMgrModule *self, PyObject *args)
+{
+  return self->py_modules->get_daemon_health_metrics();
+}
+
 PyMethodDef BaseMgrModule_methods[] = {
   {"_ceph_get", (PyCFunction)ceph_state_get, METH_VARARGS,
    "Get a cluster object"},
 PyMethodDef BaseMgrModule_methods[] = {
   {"_ceph_get", (PyCFunction)ceph_state_get, METH_VARARGS,
    "Get a cluster object"},
@@ -1540,6 +1546,9 @@ PyMethodDef BaseMgrModule_methods[] = {
   {"_ceph_unregister_client", (PyCFunction)ceph_unregister_client,
     METH_VARARGS, "Unregister RADOS instance for potential blocklisting"},
 
   {"_ceph_unregister_client", (PyCFunction)ceph_unregister_client,
     METH_VARARGS, "Unregister RADOS instance for potential blocklisting"},
 
+  {"_ceph_get_daemon_health_metrics", (PyCFunction)ceph_get_daemon_health_metrics,
+    METH_VARARGS, "Get health metrics for all daemons"},
+
   {NULL, NULL, 0, NULL}
 };
 
   {NULL, NULL, 0, NULL}
 };
 
index b11c40c42bc922e20c9622e86d4c4a77dbe5c422..f9ec04317f4be64fde5fe59af382a5b70d66bb9b 100644 (file)
@@ -44,7 +44,10 @@ if(WITH_MGR)
     osdc client heap_profiler
     global-static ceph-common
     Boost::python${MGR_PYTHON_VERSION_MAJOR}${MGR_PYTHON_VERSION_MINOR}
     osdc client heap_profiler
     global-static ceph-common
     Boost::python${MGR_PYTHON_VERSION_MAJOR}${MGR_PYTHON_VERSION_MINOR}
-    Python3::Python ${CMAKE_DL_LIBS} ${GSSAPI_LIBRARIES})
+    Python3::Python
+    ${ALLOC_LIBS}
+    ${CMAKE_DL_LIBS}
+    ${GSSAPI_LIBRARIES})
   set_target_properties(ceph-mgr PROPERTIES
     POSITION_INDEPENDENT_CODE ${EXE_LINKER_USE_PIE})
   install(TARGETS ceph-mgr DESTINATION bin)
   set_target_properties(ceph-mgr PROPERTIES
     POSITION_INDEPENDENT_CODE ${EXE_LINKER_USE_PIE})
   install(TARGETS ceph-mgr DESTINATION bin)
index 2d7efe4dfd8660b33f1f9ee940bb134e60e27430..7f811a5e41597852c91cd031e9f5e60f8b67e977 100644 (file)
@@ -198,6 +198,7 @@ class ClusterSocketHook : public AdminSocketHook {
 public:
   explicit ClusterSocketHook(ClusterState *o) : cluster_state(o) {}
   int call(std::string_view admin_command, const cmdmap_t& cmdmap,
 public:
   explicit ClusterSocketHook(ClusterState *o) : cluster_state(o) {}
   int call(std::string_view admin_command, const cmdmap_t& cmdmap,
+          const bufferlist&,
           Formatter *f,
           std::ostream& errss,
           bufferlist& out) override {
           Formatter *f,
           std::ostream& errss,
           bufferlist& out) override {
@@ -239,6 +240,7 @@ bool ClusterState::asok_command(
   ostream& ss)
 {
   std::lock_guard l(lock);
   ostream& ss)
 {
   std::lock_guard l(lock);
+
   if (admin_command == "dump_osd_network") {
     int64_t value = 0;
     // Default to health warning level if nothing specified
   if (admin_command == "dump_osd_network") {
     int64_t value = 0;
     // Default to health warning level if nothing specified
index ad3ea29efd46b14916fb961759a50744a184e3e6..ce0dad2c87e317ee43e374a682ae57e325f2555e 100644 (file)
@@ -44,8 +44,9 @@ public:
     : type(type_), value(n)
   {}
   DaemonHealthMetric(daemon_metric type_, uint32_t n1, uint32_t n2)
     : type(type_), value(n)
   {}
   DaemonHealthMetric(daemon_metric type_, uint32_t n1, uint32_t n2)
-    : type(type_), value(n1, n2)
+    : type(type_), value(n1, n2) 
   {}
   {}
+
   daemon_metric get_type() const {
     return type;
   }
   daemon_metric get_type() const {
     return type;
   }
@@ -58,6 +59,7 @@ public:
   uint32_t get_n2() const {
     return value.n2;
   }
   uint32_t get_n2() const {
     return value.n2;
   }
+
   DENC(DaemonHealthMetric, v, p) {
     DENC_START(1, 1, p);
     denc(v.type, p);
   DENC(DaemonHealthMetric, v, p) {
     DENC_START(1, 1, p);
     denc(v.type, p);
@@ -65,6 +67,10 @@ public:
     DENC_FINISH(p);
   }
 
     DENC_FINISH(p);
   }
 
+  std::string get_type_name() const {
+    return daemon_metric_name(get_type());
+  }
+
   friend std::ostream& operator<<(std::ostream& out, const DaemonHealthMetric& m) {
     return out << daemon_metric_name(m.get_type()) << "("
               << m.get_n() << "|(" << m.get_n1() << "," << m.get_n2() << "))";
   friend std::ostream& operator<<(std::ostream& out, const DaemonHealthMetric& m) {
     return out << daemon_metric_name(m.get_type()) << "("
               << m.get_n() << "|(" << m.get_n1() << "," << m.get_n2() << "))";
index 1b4744cf6b3516a5be1de28b8fdf80ddf1dd4c7c..4afae0c20d8c35a0ae7c5e16332aaa97f5a0722a 100644 (file)
@@ -2640,8 +2640,6 @@ void DaemonServer::send_report()
                 << std::dec << dendl;
             continue;
           }
                 << std::dec << dendl;
             continue;
           }
-         dout(20) << " + " << state->key << " "
-                  << metric << dendl;
           tie(acc, std::ignore) = accumulated.emplace(metric.get_type(),
               std::move(collector));
         }
           tie(acc, std::ignore) = accumulated.emplace(metric.get_type(),
               std::move(collector));
         }
index d7aebd8fceca8a24cc26e04c7e6ead6ecf90e31b..48e50d2ae23cc915f71e13f9461a8531afce6ce5 100644 (file)
@@ -806,6 +806,7 @@ std::map<std::string, std::string> Mgr::get_services() const
 int Mgr::call(
   std::string_view admin_command,
   const cmdmap_t& cmdmap,
 int Mgr::call(
   std::string_view admin_command,
   const cmdmap_t& cmdmap,
+  const bufferlist&,
   Formatter *f,
   std::ostream& errss,
   bufferlist& out)
   Formatter *f,
   std::ostream& errss,
   bufferlist& out)
index 28a7da93de08312fc3ece50de516af6791e37050..22ebdb680410e89e335ed2232eac435fba68fd2b 100644 (file)
@@ -103,6 +103,7 @@ public:
   int call(
     std::string_view command,
     const cmdmap_t& cmdmap,
   int call(
     std::string_view command,
     const cmdmap_t& cmdmap,
+    const bufferlist& inbl,
     Formatter *f,
     std::ostream& errss,
     ceph::buffer::list& out) override;
     Formatter *f,
     std::ostream& errss,
     ceph::buffer::list& out) override;
index f6b035fb2eb35e70222482af0b5176c31e2ff32c..840ca38fcc4d6fa9a3c61e77965c631bedec743b 100644 (file)
@@ -25,6 +25,7 @@
 #include "messages/MAuth.h"
 #include "messages/MAuthReply.h"
 #include "messages/MMonGlobalID.h"
 #include "messages/MAuth.h"
 #include "messages/MAuthReply.h"
 #include "messages/MMonGlobalID.h"
+#include "messages/MMonUsedPendingKeys.h"
 #include "msg/Messenger.h"
 
 #include "auth/AuthServiceHandler.h"
 #include "msg/Messenger.h"
 
 #include "auth/AuthServiceHandler.h"
@@ -91,6 +92,38 @@ bool AuthMonitor::check_rotate()
   return false;
 }
 
   return false;
 }
 
+void AuthMonitor::process_used_pending_keys(
+  const std::map<EntityName,CryptoKey>& used_pending_keys)
+{
+  for (auto& [name, used_key] : used_pending_keys) {
+    dout(10) << __func__ << " used pending_key for " << name << dendl;
+    KeyServerData::Incremental inc;
+    inc.op = KeyServerData::AUTH_INC_ADD;
+    inc.name = name;
+
+    mon.key_server.get_auth(name, inc.auth);
+    for (auto& p : pending_auth) {
+      if (p.inc_type == AUTH_DATA) {
+       KeyServerData::Incremental auth_inc;
+       auto q = p.auth_data.cbegin();
+       decode(auth_inc, q);
+       if (auth_inc.op == KeyServerData::AUTH_INC_ADD &&
+           auth_inc.name == name) {
+         dout(10) << __func__ << "  starting with pending uncommitted" << dendl;
+         inc.auth = auth_inc.auth;
+       }
+      }
+    }
+    if (stringify(inc.auth.pending_key) == stringify(used_key)) {
+      dout(10) << __func__ << " committing pending_key -> key for "
+              << name << dendl;
+      inc.auth.key = inc.auth.pending_key;
+      inc.auth.pending_key.clear();
+      push_cephx_inc(inc);
+    }
+  }
+}
+
 /*
  Tick function to update the map based on performance every N seconds
 */
 /*
  Tick function to update the map based on performance every N seconds
 */
@@ -114,10 +147,25 @@ void AuthMonitor::tick()
       propose = true;
     } else {
       dout(10) << __func__ << "requesting more ids from leader" << dendl;
       propose = true;
     } else {
       dout(10) << __func__ << "requesting more ids from leader" << dendl;
-      int leader = mon.get_leader();
       MMonGlobalID *req = new MMonGlobalID();
       req->old_max_id = max_global_id;
       MMonGlobalID *req = new MMonGlobalID();
       req->old_max_id = max_global_id;
-      mon.send_mon_message(req, leader);
+      mon.send_mon_message(req, mon.get_leader());
+    }
+  }
+
+  if (mon.monmap->min_mon_release >= ceph_release_t::quincy) {
+    auto used_pending_keys = mon.key_server.get_used_pending_keys();
+    if (!used_pending_keys.empty()) {
+      dout(10) << __func__ << " " << used_pending_keys.size() << " used pending_keys"
+              << dendl;
+      if (mon.is_leader()) {
+       process_used_pending_keys(used_pending_keys);
+       propose = true;
+      } else {
+       MMonUsedPendingKeys *req = new MMonUsedPendingKeys();
+       req->used_pending_keys = used_pending_keys;
+       mon.send_mon_message(req, mon.get_leader());
+      }
     }
   }
 
     }
   }
 
@@ -142,6 +190,7 @@ void AuthMonitor::on_active()
     return;
 
   mon.key_server.start_server();
     return;
 
   mon.key_server.start_server();
+  mon.key_server.clear_used_pending_keys();
 
   if (is_writeable()) {
     bool propose = false;
 
   if (is_writeable()) {
     bool propose = false;
@@ -523,6 +572,9 @@ bool AuthMonitor::preprocess_query(MonOpRequestRef op)
   case MSG_MON_GLOBAL_ID:
     return false;
 
   case MSG_MON_GLOBAL_ID:
     return false;
 
+  case MSG_MON_USED_PENDING_KEYS:
+    return false;
+
   default:
     ceph_abort();
     return true;
   default:
     ceph_abort();
     return true;
@@ -544,6 +596,8 @@ bool AuthMonitor::prepare_update(MonOpRequestRef op)
     }
   case MSG_MON_GLOBAL_ID:
     return prepare_global_id(op);
     }
   case MSG_MON_GLOBAL_ID:
     return prepare_global_id(op);
+  case MSG_MON_USED_PENDING_KEYS:
+    return prepare_used_pending_keys(op);
   case CEPH_MSG_AUTH:
     return prep_auth(op, true);
   default:
   case CEPH_MSG_AUTH:
     return prep_auth(op, true);
   default:
@@ -819,6 +873,9 @@ bool AuthMonitor::preprocess_command(MonOpRequestRef op)
       prefix == "auth rm" ||
       prefix == "auth get-or-create" ||
       prefix == "auth get-or-create-key" ||
       prefix == "auth rm" ||
       prefix == "auth get-or-create" ||
       prefix == "auth get-or-create-key" ||
+      prefix == "auth get-or-create-pending" ||
+      prefix == "auth clear-pending" ||
+      prefix == "auth commit-pending" ||
       prefix == "fs authorize" ||
       prefix == "auth import" ||
       prefix == "auth caps") {
       prefix == "fs authorize" ||
       prefix == "auth import" ||
       prefix == "auth caps") {
@@ -856,7 +913,6 @@ bool AuthMonitor::preprocess_command(MonOpRequestRef op)
          kr.encode_formatted("auth", f.get(), rdata);
        else
          kr.encode_plaintext(rdata);
          kr.encode_formatted("auth", f.get(), rdata);
        else
          kr.encode_plaintext(rdata);
-       ss << "export " << eauth;
        r = 0;
       } else {
        ss << "no key for " << eauth;
        r = 0;
       } else {
        ss << "no key for " << eauth;
@@ -867,14 +923,12 @@ bool AuthMonitor::preprocess_command(MonOpRequestRef op)
        keyring.encode_formatted("auth", f.get(), rdata);
       else
        keyring.encode_plaintext(rdata);
        keyring.encode_formatted("auth", f.get(), rdata);
       else
        keyring.encode_plaintext(rdata);
-
-      ss << "exported master keyring";
       r = 0;
     }
   } else if (prefix == "auth get" && !entity_name.empty()) {
     KeyRing keyring;
     EntityAuth entity_auth;
       r = 0;
     }
   } else if (prefix == "auth get" && !entity_name.empty()) {
     KeyRing keyring;
     EntityAuth entity_auth;
-    if(!mon.key_server.get_auth(entity, entity_auth)) {
+    if (!mon.key_server.get_auth(entity, entity_auth)) {
       ss << "failed to find " << entity_name << " in keyring";
       r = -ENOENT;
     } else {
       ss << "failed to find " << entity_name << " in keyring";
       r = -ENOENT;
     } else {
@@ -883,7 +937,6 @@ bool AuthMonitor::preprocess_command(MonOpRequestRef op)
        keyring.encode_formatted("auth", f.get(), rdata);
       else
        keyring.encode_plaintext(rdata);
        keyring.encode_formatted("auth", f.get(), rdata);
       else
        keyring.encode_plaintext(rdata);
-      ss << "exported keyring for " << entity_name;
       r = 0;
     }
   } else if (prefix == "auth print-key" ||
       r = 0;
     }
   } else if (prefix == "auth print-key" ||
@@ -907,10 +960,6 @@ bool AuthMonitor::preprocess_command(MonOpRequestRef op)
       mon.key_server.encode_formatted("auth", f.get(), rdata);
     } else {
       mon.key_server.encode_plaintext(rdata);
       mon.key_server.encode_formatted("auth", f.get(), rdata);
     } else {
       mon.key_server.encode_plaintext(rdata);
-      if (rdata.length() > 0)
-        ss << "installed auth entries:" << std::endl;
-      else
-        ss << "no installed auth entries!" << std::endl;
     }
     r = 0;
     goto done;
     }
     r = 0;
     goto done;
@@ -1404,8 +1453,6 @@ bool AuthMonitor::prepare_command(MonOpRequestRef op)
       mon.reply_command(op, -EINVAL, rs, get_last_committed());
       return true;
     }
       mon.reply_command(op, -EINVAL, rs, get_last_committed());
       return true;
     }
-    ss << "imported keyring";
-    getline(ss, rs);
     err = 0;
     wait_for_finished_proposal(op, new Monitor::C_Command(mon, op, 0, rs,
                                              get_last_committed() + 1));
     err = 0;
     wait_for_finished_proposal(op, new Monitor::C_Command(mon, op, 0, rs,
                                              get_last_committed() + 1));
@@ -1506,6 +1553,90 @@ bool AuthMonitor::prepare_command(MonOpRequestRef op)
     wait_for_finished_proposal(op, new Monitor::C_Command(mon, op, 0, rs,
                                                   get_last_committed() + 1));
     return true;
     wait_for_finished_proposal(op, new Monitor::C_Command(mon, op, 0, rs,
                                                   get_last_committed() + 1));
     return true;
+  } else if ((prefix == "auth get-or-create-pending" ||
+             prefix == "auth clear-pending" ||
+             prefix == "auth commit-pending")) {
+    if (mon.monmap->min_mon_release < ceph_release_t::quincy) {
+      err = -EPERM;
+      ss << "pending_keys are not available until after upgrading to quincy";
+      goto done;
+    }
+
+    EntityAuth entity_auth;
+    if (!mon.key_server.get_auth(entity, entity_auth)) {
+      ss << "entity " << entity << " does not exist";
+      err = -ENOENT;
+      goto done;
+    }
+
+    // is there an uncommitted pending_key? (or any change for this entity)
+    for (auto& p : pending_auth) {
+      if (p.inc_type == AUTH_DATA) {
+       KeyServerData::Incremental auth_inc;
+       auto q = p.auth_data.cbegin();
+       decode(auth_inc, q);
+       if (auth_inc.op == KeyServerData::AUTH_INC_ADD &&
+           auth_inc.name == entity) {
+         wait_for_finished_proposal(op, new Monitor::C_Command(mon, op, 0, rs,
+                                               get_last_committed() + 1));
+         return true;
+       }
+      }
+    }
+
+    if (prefix == "auth get-or-create-pending") {
+      KeyRing kr;
+      bool exists = false;
+      if (!entity_auth.pending_key.empty()) {
+       kr.add(entity, entity_auth.key, entity_auth.pending_key);
+       err = 0;
+       exists = true;
+      } else {
+       KeyServerData::Incremental auth_inc;
+       auth_inc.op = KeyServerData::AUTH_INC_ADD;
+       auth_inc.name = entity;
+       auth_inc.auth = entity_auth;
+       auth_inc.auth.pending_key.create(g_ceph_context, CEPH_CRYPTO_AES);
+       push_cephx_inc(auth_inc);
+       kr.add(entity, auth_inc.auth.key, auth_inc.auth.pending_key);
+        push_cephx_inc(auth_inc);
+      }
+      if (f) {
+       kr.encode_formatted("auth", f.get(), rdata);
+      } else {
+       kr.encode_plaintext(rdata);
+      }
+      if (exists) {
+       goto done;
+      }
+    } else if (prefix == "auth clear-pending") {
+      if (entity_auth.pending_key.empty()) {
+       err = 0;
+       goto done;
+      }
+      KeyServerData::Incremental auth_inc;
+      auth_inc.op = KeyServerData::AUTH_INC_ADD;
+      auth_inc.name = entity;
+      auth_inc.auth = entity_auth;
+      auth_inc.auth.pending_key.clear();
+      push_cephx_inc(auth_inc);
+    } else if (prefix == "auth commit-pending") {
+      if (entity_auth.pending_key.empty()) {
+       err = 0;
+       ss << "no pending key";
+       goto done;
+      }
+      KeyServerData::Incremental auth_inc;
+      auth_inc.op = KeyServerData::AUTH_INC_ADD;
+      auth_inc.name = entity;
+      auth_inc.auth = entity_auth;
+      auth_inc.auth.key = auth_inc.auth.pending_key;
+      auth_inc.auth.pending_key.clear();
+      push_cephx_inc(auth_inc);
+    }
+    wait_for_finished_proposal(op, new Monitor::C_Command(mon, op, 0, rs, rdata,
+                                             get_last_committed() + 1));
+    return true;
   } else if ((prefix == "auth get-or-create-key" ||
              prefix == "auth get-or-create") &&
             !entity_name.empty()) {
   } else if ((prefix == "auth get-or-create-key" ||
              prefix == "auth get-or-create") &&
             !entity_name.empty()) {
@@ -1548,7 +1679,7 @@ bool AuthMonitor::prepare_command(MonOpRequestRef op)
         }
       } else {
        KeyRing kr;
         }
       } else {
        KeyRing kr;
-       kr.add(entity, entity_auth.key);
+       kr.add(entity, entity_auth.key, entity_auth.pending_key);
         if (f) {
           kr.set_caps(entity, entity_auth.caps);
           kr.encode_formatted("auth", f.get(), rdata);
         if (f) {
           kr.set_caps(entity, entity_auth.caps);
           kr.encode_formatted("auth", f.get(), rdata);
@@ -1781,15 +1912,12 @@ bool AuthMonitor::prepare_command(MonOpRequestRef op)
     KeyServerData::Incremental auth_inc;
     auth_inc.name = entity;
     if (!mon.key_server.contains(auth_inc.name)) {
     KeyServerData::Incremental auth_inc;
     auth_inc.name = entity;
     if (!mon.key_server.contains(auth_inc.name)) {
-      ss << "entity " << entity << " does not exist";
       err = 0;
       goto done;
     }
     auth_inc.op = KeyServerData::AUTH_INC_DEL;
     push_cephx_inc(auth_inc);
 
       err = 0;
       goto done;
     }
     auth_inc.op = KeyServerData::AUTH_INC_DEL;
     push_cephx_inc(auth_inc);
 
-    ss << "updated";
-    getline(ss, rs);
     wait_for_finished_proposal(op, new Monitor::C_Command(mon, op, 0, rs,
                                              get_last_committed() + 1));
     return true;
     wait_for_finished_proposal(op, new Monitor::C_Command(mon, op, 0, rs,
                                              get_last_committed() + 1));
     return true;
@@ -1805,7 +1933,14 @@ bool AuthMonitor::prepare_global_id(MonOpRequestRef op)
 {
   dout(10) << "AuthMonitor::prepare_global_id" << dendl;
   increase_max_global_id();
 {
   dout(10) << "AuthMonitor::prepare_global_id" << dendl;
   increase_max_global_id();
+  return true;
+}
 
 
+bool AuthMonitor::prepare_used_pending_keys(MonOpRequestRef op)
+{
+  dout(10) << __func__ << " " << op << dendl;
+  auto m = op->get_req<MMonUsedPendingKeys>();
+  process_used_pending_keys(m->used_pending_keys);
   return true;
 }
 
   return true;
 }
 
index 4312b56071f4b7503ddee6468c58a9a616efbdf7..993b18a02b2423a0a8df952cd715b55c297a2d83 100644 (file)
@@ -151,6 +151,8 @@ public:
   void _set_mon_num_rank(int num, int rank); ///< called under mon->auth_lock
 
 private:
   void _set_mon_num_rank(int num, int rank); ///< called under mon->auth_lock
 
 private:
+  bool prepare_used_pending_keys(MonOpRequestRef op);
+
   // propose pending update to peers
   void encode_pending(MonitorDBStore::TransactionRef t) override;
   void encode_full(MonitorDBStore::TransactionRef t) override;
   // propose pending update to peers
   void encode_pending(MonitorDBStore::TransactionRef t) override;
   void encode_full(MonitorDBStore::TransactionRef t) override;
@@ -165,6 +167,7 @@ private:
   bool prepare_command(MonOpRequestRef op);
 
   bool check_rotate();
   bool prepare_command(MonOpRequestRef op);
 
   bool check_rotate();
+  void process_used_pending_keys(const std::map<EntityName,CryptoKey>& keys);
 
   bool entity_is_pending(EntityName& entity);
   int exists_and_matches_entity(
 
   bool entity_is_pending(EntityName& entity);
   int exists_and_matches_entity(
index 4d7f5e458094eb083e1691153ed1605f0418c57b..272ad40c27461498d45dc7705cbb29231c7dc47e 100644 (file)
 
 #include "ConnectionTracker.h"
 #include "common/Formatter.h"
 
 #include "ConnectionTracker.h"
 #include "common/Formatter.h"
+#include "common/dout.h"
+#include "include/ceph_assert.h"
+
+#define dout_subsys ceph_subsys_mon
+#undef dout_prefix
+#define dout_prefix _prefix(_dout, rank, epoch, version)
+
+static std::ostream& _prefix(std::ostream *_dout, int rank, epoch_t epoch, uint64_t version) {
+  return *_dout << "rank: " << rank << " version: "<< version << " ConnectionTracker(" << epoch << ") ";
+}
 
 std::ostream& operator<<(std::ostream&o, const ConnectionReport& c) {
   o << "rank=" << c.rank << ",epoch=" << c.epoch << ",version=" << c.epoch_version
 
 std::ostream& operator<<(std::ostream&o, const ConnectionReport& c) {
   o << "rank=" << c.rank << ",epoch=" << c.epoch << ",version=" << c.epoch_version
@@ -49,13 +59,17 @@ const ConnectionReport *ConnectionTracker::reports(int p) const
 
 void ConnectionTracker::receive_peer_report(const ConnectionTracker& o)
 {
 
 void ConnectionTracker::receive_peer_report(const ConnectionTracker& o)
 {
+  ldout(cct, 30) << __func__ << dendl;
   for (auto& i : o.peer_reports) {
     const ConnectionReport& report = i.second;
   for (auto& i : o.peer_reports) {
     const ConnectionReport& report = i.second;
-    if (report.rank == rank) continue;
-    ConnectionReport& existing = *reports(report.rank);
+    if (i.first == rank) continue;
+    ConnectionReport& existing = *reports(i.first);
     if (report.epoch > existing.epoch ||
        (report.epoch == existing.epoch &&
         report.epoch_version > existing.epoch_version)) {
     if (report.epoch > existing.epoch ||
        (report.epoch == existing.epoch &&
         report.epoch_version > existing.epoch_version)) {
+      ldout(cct, 30) << " new peer_report is more updated" << dendl;
+      ldout(cct, 30) << "existing: " << existing << dendl;
+      ldout(cct, 30) << "new: " << report << dendl;
       existing = report;
     }
   }
       existing = report;
     }
   }
@@ -64,6 +78,7 @@ void ConnectionTracker::receive_peer_report(const ConnectionTracker& o)
 
 bool ConnectionTracker::increase_epoch(epoch_t e)
 {
 
 bool ConnectionTracker::increase_epoch(epoch_t e)
 {
+  ldout(cct, 30) << __func__ << " to " << e << dendl;
   if (e > epoch) {
     my_reports.epoch_version = version = 0;
     my_reports.epoch = epoch = e;
   if (e > epoch) {
     my_reports.epoch_version = version = 0;
     my_reports.epoch = epoch = e;
@@ -76,52 +91,77 @@ bool ConnectionTracker::increase_epoch(epoch_t e)
 
 void ConnectionTracker::increase_version()
 {
 
 void ConnectionTracker::increase_version()
 {
+  ldout(cct, 30) << __func__ << " to " << version+1 << dendl;
   encoding.clear();
   ++version;
   my_reports.epoch_version = version;
   peer_reports[rank] = my_reports;
   if ((version % persist_interval) == 0 ) {
   encoding.clear();
   ++version;
   my_reports.epoch_version = version;
   peer_reports[rank] = my_reports;
   if ((version % persist_interval) == 0 ) {
+    ldout(cct, 30) << version << " % " << persist_interval << " == 0" << dendl;
     owner->persist_connectivity_scores();
   }
 }
 
 void ConnectionTracker::report_live_connection(int peer_rank, double units_alive)
 {
     owner->persist_connectivity_scores();
   }
 }
 
 void ConnectionTracker::report_live_connection(int peer_rank, double units_alive)
 {
+  ldout(cct, 30) << __func__ << " peer_rank: " << peer_rank << " units_alive: " << units_alive << dendl;
+  ldout(cct, 30) << "my_reports before: " << my_reports << dendl;
+  if (peer_rank == rank) {
+    lderr(cct) << "Got a report from my own rank, hopefully this is startup weirdness, dropping" << dendl;
+    return;
+  }
   // we need to "auto-initialize" to 1, do shenanigans
   auto i = my_reports.history.find(peer_rank);
   if (i == my_reports.history.end()) {
   // we need to "auto-initialize" to 1, do shenanigans
   auto i = my_reports.history.find(peer_rank);
   if (i == my_reports.history.end()) {
+    ldout(cct, 30) << "couldn't find: " << peer_rank
+      << " in my_reports.history" << "... inserting: "
+      << "(" << peer_rank << ", 1" << dendl;
     auto[j,k] = my_reports.history.insert(std::pair<int,double>(peer_rank,1.0));
     i = j;
   }
   double& pscore = i->second;
     auto[j,k] = my_reports.history.insert(std::pair<int,double>(peer_rank,1.0));
     i = j;
   }
   double& pscore = i->second;
+  ldout(cct, 30) << "adding new pscore to my_reports" << dendl;
   pscore = pscore * (1 - units_alive / (2 * half_life)) +
     (units_alive / (2 * half_life));
   pscore = std::min(pscore, 1.0);
   my_reports.current[peer_rank] = true;
 
   increase_version();
   pscore = pscore * (1 - units_alive / (2 * half_life)) +
     (units_alive / (2 * half_life));
   pscore = std::min(pscore, 1.0);
   my_reports.current[peer_rank] = true;
 
   increase_version();
+  ldout(cct, 30) << "my_reports after: " << my_reports << dendl;
 }
 
 void ConnectionTracker::report_dead_connection(int peer_rank, double units_dead)
 {
 }
 
 void ConnectionTracker::report_dead_connection(int peer_rank, double units_dead)
 {
+  ldout(cct, 30) << __func__ << " peer_rank: " << peer_rank << " units_dead: " << units_dead << dendl;
+  ldout(cct, 30) << "my_reports before: " << my_reports << dendl;
+  if (peer_rank == rank) {
+    lderr(cct) << "Got a report from my own rank, hopefully this is startup weirdness, dropping" << dendl;
+    return;
+  }
   // we need to "auto-initialize" to 1, do shenanigans
   auto i = my_reports.history.find(peer_rank);
   if (i == my_reports.history.end()) {
   // we need to "auto-initialize" to 1, do shenanigans
   auto i = my_reports.history.find(peer_rank);
   if (i == my_reports.history.end()) {
+    ldout(cct, 30) << "couldn't find: " << peer_rank
+    << " in my_reports.history" << "... inserting: "
+    << "(" << peer_rank << ", 1" << dendl;
     auto[j,k] = my_reports.history.insert(std::pair<int,double>(peer_rank,1.0));
     i = j;
   }
   double& pscore = i->second;
     auto[j,k] = my_reports.history.insert(std::pair<int,double>(peer_rank,1.0));
     i = j;
   }
   double& pscore = i->second;
+  ldout(cct, 30) << "adding new pscore to my_reports" << dendl;
   pscore = pscore * (1 - units_dead / (2 * half_life)) -
     (units_dead / (2*half_life));
   pscore = std::max(pscore, 0.0);
   my_reports.current[peer_rank] = false;
   
   increase_version();
   pscore = pscore * (1 - units_dead / (2 * half_life)) -
     (units_dead / (2*half_life));
   pscore = std::max(pscore, 0.0);
   my_reports.current[peer_rank] = false;
   
   increase_version();
+  ldout(cct, 30) << "my_reports after: " << my_reports << dendl;
 }
 
 void ConnectionTracker::get_total_connection_score(int peer_rank, double *rating,
                                                    int *live_count) const
 {
 }
 
 void ConnectionTracker::get_total_connection_score(int peer_rank, double *rating,
                                                    int *live_count) const
 {
+  ldout(cct, 30) << __func__ << dendl;
   *rating = 0;
   *live_count = 0;
   double rate = 0;
   *rating = 0;
   *live_count = 0;
   double rate = 0;
@@ -145,16 +185,34 @@ void ConnectionTracker::get_total_connection_score(int peer_rank, double *rating
   *live_count = live;
 }
 
   *live_count = live;
 }
 
-void ConnectionTracker::notify_rank_removed(int rank_removed)
+void ConnectionTracker::notify_rank_changed(int new_rank)
+{
+  ldout(cct, 20) << __func__ << " to " << new_rank << dendl;
+  if (new_rank == rank) return;
+  ldout(cct, 20) << "peer_reports before: " << peer_reports << dendl;
+  peer_reports.erase(rank);
+  peer_reports.erase(new_rank);
+  my_reports.rank = new_rank;
+  rank = new_rank;
+  encoding.clear();
+  ldout(cct, 20) << "peer_reports after: " << peer_reports << dendl;
+
+  increase_version();
+}
+
+void ConnectionTracker::notify_rank_removed(int rank_removed, int new_rank)
 {
 {
+  ldout(cct, 20) << __func__ << " " << rank_removed
+    << " new_rank: " << new_rank << dendl;
+  ldout(cct, 20) << "my_reports before: " << my_reports << dendl;
+  ldout(cct, 20) << "peer_reports before: " << peer_reports << dendl;
+  ldout(cct, 20) << "my rank before: " << rank << dendl;
+
   encoding.clear();
   encoding.clear();
-  size_t starting_size = my_reports.current.size();
-  // erase the removed rank from everywhere
+  size_t starting_size_current = my_reports.current.size();
+  // Lets adjust everything in my report.
   my_reports.current.erase(rank_removed);
   my_reports.history.erase(rank_removed);
   my_reports.current.erase(rank_removed);
   my_reports.history.erase(rank_removed);
-  peer_reports.erase(rank_removed);
-  // Move ranks > rank_removed down by 1
-  // First in my_reports' history+current
   auto ci = my_reports.current.upper_bound(rank_removed);
   auto hi = my_reports.history.upper_bound(rank_removed);
   while (ci != my_reports.current.end()) {
   auto ci = my_reports.current.upper_bound(rank_removed);
   auto hi = my_reports.history.upper_bound(rank_removed);
   while (ci != my_reports.current.end()) {
@@ -164,23 +222,52 @@ void ConnectionTracker::notify_rank_removed(int rank_removed)
     my_reports.current.erase(ci++);
     my_reports.history.erase(hi++);
   }
     my_reports.current.erase(ci++);
     my_reports.history.erase(hi++);
   }
-  ceph_assert((my_reports.current.size() == starting_size) ||
-             (my_reports.current.size() + 1 == starting_size));
+  ceph_assert((my_reports.current.size() == starting_size_current) ||
+    (my_reports.current.size() + 1 == starting_size_current));
 
 
-  // now move ranks down one in peer_reports
-  starting_size = peer_reports.size();
+  size_t starting_size = peer_reports.size();
   auto pi = peer_reports.upper_bound(rank_removed);
   auto pi = peer_reports.upper_bound(rank_removed);
+  // Remove the target rank and adjust everything that comes after.
+  // Note that we don't adjust current and history for our peer_reports
+  // because it is better to rely on our peers on that information.
+  peer_reports.erase(rank_removed);
   while (pi != peer_reports.end()) {
   while (pi != peer_reports.end()) {
-    peer_reports[pi->first - 1] = pi->second;
-    peer_reports.erase(pi++);
+    peer_reports[pi->first - 1] = pi->second; // copy content of next rank to ourself.
+    peer_reports.erase(pi++); // destroy our next rank and move on.
   }
   }
+
   ceph_assert((peer_reports.size() == starting_size) ||
   ceph_assert((peer_reports.size() == starting_size) ||
-             (peer_reports.size() + 1 == starting_size));
+         (peer_reports.size() + 1 == starting_size));
 
 
-  if (rank_removed < rank) {
+  if (rank_removed < rank) { // if the rank removed is lower than us, we need to adjust.
     --rank;
     --rank;
-    my_reports.rank = rank;
+    my_reports.rank = rank; // also adjust my_reports.rank.
+  }
+
+  ldout(cct, 20) << "my rank after: " << rank << dendl;
+  ldout(cct, 20) << "peer_reports after: " << peer_reports << dendl;
+  ldout(cct, 20) << "my_reports after: " << my_reports << dendl;
+
+  //check if the new_rank from monmap is equal to our adjusted rank.
+  ceph_assert(rank == new_rank);
+
+  increase_version();
+}
+
+bool ConnectionTracker::is_clean(int mon_rank, int monmap_size)
+{
+  ldout(cct, 30) << __func__ << dendl;
+  // check consistency between our rank according
+  // to monmap and our rank according to our report.
+  if (rank != mon_rank ||
+    my_reports.rank != mon_rank) {
+    return false;
+  } else if (!peer_reports.empty()){
+    // if peer_report max rank is greater than monmap max rank
+    // then there is a problem.
+    if (peer_reports.rbegin()->first > monmap_size - 1) return false;
   }
   }
+  return true;
 }
 
 void ConnectionTracker::encode(bufferlist &bl) const
 }
 
 void ConnectionTracker::encode(bufferlist &bl) const
index c62d3c200d7408630e3cb0da3ed2e7e85c004cad..c1a32c08fe0617f0ed56cc24a4b53c24ac111225 100644 (file)
@@ -120,6 +120,13 @@ class ConnectionTracker {
    */
   void get_total_connection_score(int peer_rank, double *rating,
                                  int *live_count) const;
    */
   void get_total_connection_score(int peer_rank, double *rating,
                                  int *live_count) const;
+  /**
+  * Check if our ranks are clean and make
+  * sure there are no extra peer_report lingering.
+  * In the future we also want to check the reports
+  * current and history of each peer_report.
+  */
+  bool is_clean(int mon_rank, int monmap_size);
   /**
    * Encode this ConnectionTracker. Useful both for storing on disk
    * and for sending off to peers for decoding and import
   /**
    * Encode this ConnectionTracker. Useful both for storing on disk
    * and for sending off to peers for decoding and import
@@ -143,6 +150,7 @@ class ConnectionTracker {
   int rank;
   int persist_interval;
   bufferlist encoding;
   int rank;
   int persist_interval;
   bufferlist encoding;
+  CephContext *cct;
   int get_my_rank() const { return rank; }
   ConnectionReport *reports(int p);
   const ConnectionReport *reports(int p) const;
   int get_my_rank() const { return rank; }
   ConnectionReport *reports(int p);
   const ConnectionReport *reports(int p) const;
@@ -151,6 +159,7 @@ class ConnectionTracker {
     encoding.clear();
     peer_reports.clear();
     my_reports = ConnectionReport();
     encoding.clear();
     peer_reports.clear();
     my_reports = ConnectionReport();
+    my_reports.rank = rank;
   }
 
  public:
   }
 
  public:
@@ -158,14 +167,14 @@ class ConnectionTracker {
                        owner(NULL), rank(-1), persist_interval(10) {
   }
   ConnectionTracker(RankProvider *o, int rank, double hl,
                        owner(NULL), rank(-1), persist_interval(10) {
   }
   ConnectionTracker(RankProvider *o, int rank, double hl,
-                   int persist_i) :
+                   int persist_i, CephContext *c) :
     epoch(0), version(0),
     epoch(0), version(0),
-    half_life(hl), owner(o), rank(rank), persist_interval(persist_i) {
+    half_life(hl), owner(o), rank(rank), persist_interval(persist_i), cct(c) {
     my_reports.rank = rank;
   }
     my_reports.rank = rank;
   }
-  ConnectionTracker(const bufferlist& bl) :
+  ConnectionTracker(const bufferlist& bl, CephContext *c) :
     epoch(0), version(0),
     epoch(0), version(0),
-    half_life(0), owner(NULL), rank(-1)
+    half_life(0), owner(NULL), rank(-1), persist_interval(10), cct(c)
   {
     auto bi = bl.cbegin();
     decode(bi);
   {
     auto bi = bl.cbegin();
     decode(bi);
@@ -173,21 +182,19 @@ class ConnectionTracker {
   ConnectionTracker(const ConnectionTracker& o) :
     epoch(o.epoch), version(o.version),
     half_life(o.half_life), owner(o.owner), rank(o.rank),
   ConnectionTracker(const ConnectionTracker& o) :
     epoch(o.epoch), version(o.version),
     half_life(o.half_life), owner(o.owner), rank(o.rank),
-    persist_interval(o.persist_interval)
+    persist_interval(o.persist_interval), cct(o.cct)
   {
     peer_reports = o.peer_reports;
     my_reports = o.my_reports;
   }
   void notify_reset() { clear_peer_reports(); }
   {
     peer_reports = o.peer_reports;
     my_reports = o.my_reports;
   }
   void notify_reset() { clear_peer_reports(); }
-  void notify_rank_changed(int new_rank) {
-    if (new_rank == rank) return;
-    peer_reports.erase(rank);
-    peer_reports.erase(new_rank);
-    my_reports.rank = new_rank;
+  void set_rank(int new_rank) {
     rank = new_rank;
     rank = new_rank;
-    encoding.clear();
+    my_reports.rank = rank;
   }
   }
-  void notify_rank_removed(int rank_removed);
+
+  void notify_rank_changed(int new_rank);
+  void notify_rank_removed(int rank_removed, int new_rank);
   friend std::ostream& operator<<(std::ostream& o, const ConnectionTracker& c);
   friend ConnectionReport *get_connection_reports(ConnectionTracker& ct);
   friend std::map<int,ConnectionReport> *get_peer_reports(ConnectionTracker& ct);
   friend std::ostream& operator<<(std::ostream& o, const ConnectionTracker& c);
   friend ConnectionReport *get_connection_reports(ConnectionTracker& ct);
   friend std::map<int,ConnectionReport> *get_peer_reports(ConnectionTracker& ct);
index 757c86165f5a1d375834791f7dd51077d056e3c5..e22a85bed56f8bddb17351d3f64356c1255f7b66 100644 (file)
@@ -68,7 +68,7 @@ void ElectionLogic::init()
 
 void ElectionLogic::bump_epoch(epoch_t e)
 {
 
 void ElectionLogic::bump_epoch(epoch_t e)
 {
-  ldout(cct, 10) << __func__ << epoch << " to " << e << dendl;
+  ldout(cct, 10) << __func__ << " to "  << e << dendl;
   ceph_assert(epoch <= e);
   epoch = e;
   peer_tracker->increase_epoch(e);
   ceph_assert(epoch <= e);
   epoch = e;
   peer_tracker->increase_epoch(e);
@@ -101,6 +101,7 @@ void ElectionLogic::reset_stable_tracker()
 
 void ElectionLogic::connectivity_bump_epoch_in_election(epoch_t mepoch)
 {
 
 void ElectionLogic::connectivity_bump_epoch_in_election(epoch_t mepoch)
 {
+  ldout(cct, 30) << __func__ << " to " << mepoch << dendl;
   ceph_assert(mepoch > epoch);
   bump_epoch(mepoch);
   reset_stable_tracker();
   ceph_assert(mepoch > epoch);
   bump_epoch(mepoch);
   reset_stable_tracker();
@@ -223,6 +224,7 @@ bool ElectionLogic::propose_classic_prefix(int from, epoch_t mepoch)
 void ElectionLogic::receive_propose(int from, epoch_t mepoch,
                                    const ConnectionTracker *ct)
 {
 void ElectionLogic::receive_propose(int from, epoch_t mepoch,
                                    const ConnectionTracker *ct)
 {
+  ldout(cct, 20) << __func__ << " from " << from << dendl;
   if (from == elector->get_my_rank()) {
     lderr(cct) << "I got a propose from my own rank, hopefully this is startup weirdness,dropping" << dendl;
     return;
   if (from == elector->get_my_rank()) {
     lderr(cct) << "I got a propose from my own rank, hopefully this is startup weirdness,dropping" << dendl;
     return;
@@ -311,14 +313,17 @@ void ElectionLogic::propose_classic_handler(int from, epoch_t mepoch)
 
 double ElectionLogic::connectivity_election_score(int rank)
 {
 
 double ElectionLogic::connectivity_election_score(int rank)
 {
+  ldout(cct, 30) << __func__ << " of " << rank << dendl;
   if (elector->get_disallowed_leaders().count(rank)) {
     return -1;
   }
   double score;
   int liveness;
   if (stable_peer_tracker) {
   if (elector->get_disallowed_leaders().count(rank)) {
     return -1;
   }
   double score;
   int liveness;
   if (stable_peer_tracker) {
+    ldout(cct, 30) << "stable_peer_tracker exists so using that ..." << dendl;
     stable_peer_tracker->get_total_connection_score(rank, &score, &liveness);
   } else {
     stable_peer_tracker->get_total_connection_score(rank, &score, &liveness);
   } else {
+    ldout(cct, 30) << "stable_peer_tracker does not exists, using peer_tracker ..." << dendl;
     peer_tracker->get_total_connection_score(rank, &score, &liveness);
   }
   return score;
     peer_tracker->get_total_connection_score(rank, &score, &liveness);
   }
   return score;
@@ -327,14 +332,19 @@ double ElectionLogic::connectivity_election_score(int rank)
 void ElectionLogic::propose_connectivity_handler(int from, epoch_t mepoch,
                                                 const ConnectionTracker *ct)
 {
 void ElectionLogic::propose_connectivity_handler(int from, epoch_t mepoch,
                                                 const ConnectionTracker *ct)
 {
+  ldout(cct, 10) << __func__ << " from " << from << " mepoch: "
+    << mepoch << " epoch: " << epoch << dendl;
+  ldout(cct, 30) << "last_election_winner: " << last_election_winner << dendl;
   if ((epoch % 2 == 0) &&
       last_election_winner != elector->get_my_rank() &&
       !elector->is_current_member(from)) {
     // To prevent election flapping, peons ignore proposals from out-of-quorum
     // peers unless their vote would materially change from the last election
   if ((epoch % 2 == 0) &&
       last_election_winner != elector->get_my_rank() &&
       !elector->is_current_member(from)) {
     // To prevent election flapping, peons ignore proposals from out-of-quorum
     // peers unless their vote would materially change from the last election
+    ldout(cct, 30) << "Lets see if this out-of-quorum peer is worth it " << dendl;
     int best_scorer = 0;
     double best_score = 0;
     double last_voted_for_score = 0;
     int best_scorer = 0;
     double best_score = 0;
     double last_voted_for_score = 0;
+    ldout(cct, 30) << "elector->paxos_size(): " << elector->paxos_size() << dendl;
     for (unsigned i = 0; i < elector->paxos_size(); ++i) {
       double score = connectivity_election_score(i);
       if (score > best_score) {
     for (unsigned i = 0; i < elector->paxos_size(); ++i) {
       double score = connectivity_election_score(i);
       if (score > best_score) {
@@ -345,13 +355,18 @@ void ElectionLogic::propose_connectivity_handler(int from, epoch_t mepoch,
        last_voted_for_score = score;
       }
     }
        last_voted_for_score = score;
       }
     }
+    ldout(cct, 30) << "best_scorer: " << best_scorer << " best_score: " << best_score
+      << " last_voted_for: " << last_voted_for << " last_voted_for_score: " 
+      << last_voted_for_score << dendl;
     if (best_scorer == last_voted_for ||
        (best_score - last_voted_for_score < ignore_propose_margin)) {
       // drop this message; it won't change our vote so we defer to leader
     if (best_scorer == last_voted_for ||
        (best_score - last_voted_for_score < ignore_propose_margin)) {
       // drop this message; it won't change our vote so we defer to leader
+      ldout(cct, 30) << "drop this message; it won't change our vote so we defer to leader " << dendl;
       return;
     }
   }
   if (mepoch > epoch) {
       return;
     }
   }
   if (mepoch > epoch) {
+    ldout(cct, 20) << "mepoch > epoch" << dendl;
     connectivity_bump_epoch_in_election(mepoch);
   } else if (mepoch < epoch) {
     // got an "old" propose,
     connectivity_bump_epoch_in_election(mepoch);
   } else if (mepoch < epoch) {
     // got an "old" propose,
@@ -360,6 +375,7 @@ void ElectionLogic::propose_connectivity_handler(int from, epoch_t mepoch,
       // a mon just started up, call a new election so they can rejoin!
       ldout(cct, 5) << " got propose from old epoch, "
              << from << " must have just started" << dendl;
       // a mon just started up, call a new election so they can rejoin!
       ldout(cct, 5) << " got propose from old epoch, "
              << from << " must have just started" << dendl;
+      ldout(cct, 10) << "triggering new election" << dendl;
       // we may be active; make sure we reset things in the monitor appropriately.
       elector->trigger_new_election();
     } else {
       // we may be active; make sure we reset things in the monitor appropriately.
       elector->trigger_new_election();
     } else {
@@ -376,13 +392,13 @@ void ElectionLogic::propose_connectivity_handler(int from, epoch_t mepoch,
     leader_score = connectivity_election_score(leader_acked);
   }
 
     leader_score = connectivity_election_score(leader_acked);
   }
 
-  ldout(cct, 30) << "propose from rank=" << from << ", tracker: "
+  ldout(cct, 20) << "propose from rank=" << from << ", tracker: "
                 << (stable_peer_tracker ? *stable_peer_tracker : *peer_tracker) << dendl;
 
                 << (stable_peer_tracker ? *stable_peer_tracker : *peer_tracker) << dendl;
 
-  ldout(cct, 10) << "propose from rank=" << from << ",score=" << from_score
+  ldout(cct, 10) << "propose from rank=" << from << ",from_score=" << from_score
                 << "; my score=" << my_score
                 << "; currently acked " << leader_acked
                 << "; my score=" << my_score
                 << "; currently acked " << leader_acked
-                << ",score=" << leader_score << dendl;
+                << ",leader_score=" << leader_score << dendl;
 
   bool my_win = (my_score >= 0) && // My score is non-zero; I am allowed to lead
     ((my_rank < from && my_score >= from_score) || // We have same scores and I have lower rank, or
 
   bool my_win = (my_score >= 0) && // My score is non-zero; I am allowed to lead
     ((my_rank < from && my_score >= from_score) || // We have same scores and I have lower rank, or
@@ -395,6 +411,7 @@ void ElectionLogic::propose_connectivity_handler(int from, epoch_t mepoch,
      (from_score > leader_score));
 
   if (my_win) {
      (from_score > leader_score));
 
   if (my_win) {
+    ldout(cct, 10) << " conditionally I win" << dendl;
     // i would win over them.
     if (leader_acked >= 0) {        // we already acked someone
       ceph_assert(leader_score >= from_score);  // and they still win, of course
     // i would win over them.
     if (leader_acked >= 0) {        // we already acked someone
       ceph_assert(leader_score >= from_score);  // and they still win, of course
@@ -402,15 +419,18 @@ void ElectionLogic::propose_connectivity_handler(int from, epoch_t mepoch,
     } else {
       // wait, i should win!
       if (!electing_me) {
     } else {
       // wait, i should win!
       if (!electing_me) {
+      ldout(cct, 10) << " wait, i should win! triggering new election ..." << dendl;
        elector->trigger_new_election();
       }
     }
   } else {
        elector->trigger_new_election();
       }
     }
   } else {
+    ldout(cct, 10) << " conditionally they win" << dendl;
     // they would win over me
     if (their_win || from == leader_acked) {
       if (leader_acked >= 0 && from != leader_acked) {
        // we have to make sure our acked leader will ALSO defer to them, or else
        // we can't, to maintain guarantees!
     // they would win over me
     if (their_win || from == leader_acked) {
       if (leader_acked >= 0 && from != leader_acked) {
        // we have to make sure our acked leader will ALSO defer to them, or else
        // we can't, to maintain guarantees!
+  ldout(cct, 10) << " make sure acked leader defer to: " << from << dendl;
        double leader_from_score;
        int leader_from_liveness;
        leader_peer_tracker->
        double leader_from_score;
        int leader_from_liveness;
        leader_peer_tracker->
@@ -423,6 +443,7 @@ void ElectionLogic::propose_connectivity_handler(int from, epoch_t mepoch,
                                     &leader_leader_liveness);
        if ((from < leader_acked && leader_from_score >= leader_leader_score) ||
            (leader_from_score > leader_leader_score)) {
                                     &leader_leader_liveness);
        if ((from < leader_acked && leader_from_score >= leader_leader_score) ||
            (leader_from_score > leader_leader_score)) {
+    ldout(cct, 10) << "defering to " << from << dendl;
          defer(from);
          leader_peer_tracker.reset(new ConnectionTracker(*ct));
        } else { // we can't defer to them *this* round even though they should win...
          defer(from);
          leader_peer_tracker.reset(new ConnectionTracker(*ct));
        } else { // we can't defer to them *this* round even though they should win...
@@ -444,6 +465,7 @@ void ElectionLogic::propose_connectivity_handler(int from, epoch_t mepoch,
          }
        }
       } else {
          }
        }
       } else {
+  ldout(cct, 10) << "defering to " << from << dendl;
        defer(from);
        leader_peer_tracker.reset(new ConnectionTracker(*ct));
       }
        defer(from);
        leader_peer_tracker.reset(new ConnectionTracker(*ct));
       }
index 42be292d45146a3f14c1eca3c030243735825ea0..671c08d85929b5ea37aabc98955814962b7a108e 100644 (file)
@@ -64,7 +64,7 @@ Elector::Elector(Monitor *m, int strategy) : logic(this, static_cast<ElectionLog
                                                   m->cct),
                                             peer_tracker(this, m->rank,
                                            m->cct->_conf.get_val<uint64_t>("mon_con_tracker_score_halflife"),
                                                   m->cct),
                                             peer_tracker(this, m->rank,
                                            m->cct->_conf.get_val<uint64_t>("mon_con_tracker_score_halflife"),
-                                           m->cct->_conf.get_val<uint64_t>("mon_con_tracker_persist_interval")),
+                                           m->cct->_conf.get_val<uint64_t>("mon_con_tracker_persist_interval"), m->cct),
                               ping_timeout(m->cct->_conf.get_val<double>("mon_elector_ping_timeout")),
                               PING_DIVISOR(m->cct->_conf.get_val<uint64_t>("mon_elector_ping_divisor")),
                               mon(m), elector(this) {
                               ping_timeout(m->cct->_conf.get_val<double>("mon_elector_ping_timeout")),
                               PING_DIVISOR(m->cct->_conf.get_val<uint64_t>("mon_elector_ping_divisor")),
                               mon(m), elector(this) {
@@ -87,6 +87,7 @@ void Elector::persist_epoch(epoch_t e)
 
 void Elector::persist_connectivity_scores()
 {
 
 void Elector::persist_connectivity_scores()
 {
+  dout(20) << __func__ << dendl;
   auto t(std::make_shared<MonitorDBStore::Transaction>());
   t->put(Monitor::MONITOR_NAME, "connectivity_scores", peer_tracker.get_encoded_bl());
   mon->store->apply_transaction(t);
   auto t(std::make_shared<MonitorDBStore::Transaction>());
   t->put(Monitor::MONITOR_NAME, "connectivity_scores", peer_tracker.get_encoded_bl());
   mon->store->apply_transaction(t);
@@ -222,7 +223,8 @@ void Elector::cancel_timer()
 
 void Elector::assimilate_connection_reports(const bufferlist& tbl)
 {
 
 void Elector::assimilate_connection_reports(const bufferlist& tbl)
 {
-  ConnectionTracker pct(tbl);
+  dout(10) << __func__ << dendl;
+  ConnectionTracker pct(tbl, mon->cct);
   peer_tracker.receive_peer_report(pct);
 }
 
   peer_tracker.receive_peer_report(pct);
 }
 
@@ -311,7 +313,7 @@ void Elector::handle_propose(MonOpRequestRef op)
   }
   ConnectionTracker *oct = NULL;
   if (m->sharing_bl.length()) {
   }
   ConnectionTracker *oct = NULL;
   if (m->sharing_bl.length()) {
-    oct = new ConnectionTracker(m->sharing_bl);
+    oct = new ConnectionTracker(m->sharing_bl, mon->cct);
   }
   logic.receive_propose(from, m->epoch, oct);
   delete oct;
   }
   logic.receive_propose(from, m->epoch, oct);
   delete oct;
@@ -451,7 +453,9 @@ void Elector::handle_nak(MonOpRequestRef op)
 
 void Elector::begin_peer_ping(int peer)
 {
 
 void Elector::begin_peer_ping(int peer)
 {
+  dout(20) << __func__ << " against " << peer << dendl;
   if (live_pinging.count(peer)) {
   if (live_pinging.count(peer)) {
+    dout(20) << peer << " already in live_pinging ... return " << dendl;
     return;
   }
 
     return;
   }
 
@@ -460,23 +464,30 @@ void Elector::begin_peer_ping(int peer)
     return;
   }
 
     return;
   }
 
-  dout(5) << __func__ << " against " << peer << dendl;
-
   peer_tracker.report_live_connection(peer, 0); // init this peer as existing
   live_pinging.insert(peer);
   dead_pinging.erase(peer);
   peer_acked_ping[peer] = ceph_clock_now();
   peer_tracker.report_live_connection(peer, 0); // init this peer as existing
   live_pinging.insert(peer);
   dead_pinging.erase(peer);
   peer_acked_ping[peer] = ceph_clock_now();
-  send_peer_ping(peer);
+  if (!send_peer_ping(peer)) return;
   mon->timer.add_event_after(ping_timeout / PING_DIVISOR,
                             new C_MonContext{mon, [this, peer](int) {
                                 ping_check(peer);
                               }});
 }
 
   mon->timer.add_event_after(ping_timeout / PING_DIVISOR,
                             new C_MonContext{mon, [this, peer](int) {
                                 ping_check(peer);
                               }});
 }
 
-void Elector::send_peer_ping(int peer, const utime_t *n)
+bool Elector::send_peer_ping(int peer, const utime_t *n)
 {
   dout(10) << __func__ << " to peer " << peer << dendl;
 {
   dout(10) << __func__ << " to peer " << peer << dendl;
-
+  if (peer >= mon->monmap->ranks.size()) {
+    // Monitor no longer exists in the monmap,
+    // therefore, we shouldn't ping this monitor
+    // since we cannot lookup the address!
+    dout(5) << "peer: " << peer << " >= ranks_size: "
+      << mon->monmap->ranks.size() << " ... dropping to prevent "
+      << "https://tracker.ceph.com/issues/50089" << dendl;
+    live_pinging.erase(peer);
+    return false;
+  }
   utime_t now;
   if (n != NULL) {
     now = *n;
   utime_t now;
   if (n != NULL) {
     now = *n;
@@ -486,11 +497,13 @@ void Elector::send_peer_ping(int peer, const utime_t *n)
   MMonPing *ping = new MMonPing(MMonPing::PING, now, peer_tracker.get_encoded_bl());
   mon->messenger->send_to_mon(ping, mon->monmap->get_addrs(peer));
   peer_sent_ping[peer] = now;
   MMonPing *ping = new MMonPing(MMonPing::PING, now, peer_tracker.get_encoded_bl());
   mon->messenger->send_to_mon(ping, mon->monmap->get_addrs(peer));
   peer_sent_ping[peer] = now;
+  return true;
 }
 
 void Elector::ping_check(int peer)
 {
   dout(20) << __func__ << " to peer " << peer << dendl;
 }
 
 void Elector::ping_check(int peer)
 {
   dout(20) << __func__ << " to peer " << peer << dendl;
+
   if (!live_pinging.count(peer) &&
       !dead_pinging.count(peer)) {
     dout(20) << __func__ << peer << " is no longer marked for pinging" << dendl;
   if (!live_pinging.count(peer) &&
       !dead_pinging.count(peer)) {
     dout(20) << __func__ << peer << " is no longer marked for pinging" << dendl;
@@ -507,7 +520,7 @@ void Elector::ping_check(int peer)
   }
 
   if (acked_ping == newest_ping) {
   }
 
   if (acked_ping == newest_ping) {
-    send_peer_ping(peer, &now);
+    if (!send_peer_ping(peer, &now)) return;
   }
 
   mon->timer.add_event_after(ping_timeout / PING_DIVISOR,
   }
 
   mon->timer.add_event_after(ping_timeout / PING_DIVISOR,
@@ -518,6 +531,7 @@ void Elector::ping_check(int peer)
 
 void Elector::begin_dead_ping(int peer)
 {
 
 void Elector::begin_dead_ping(int peer)
 {
+  dout(20) << __func__ << " to peer " << peer << dendl;  
   if (dead_pinging.count(peer)) {
     return;
   }
   if (dead_pinging.count(peer)) {
     return;
   }
@@ -553,9 +567,8 @@ void Elector::dead_ping(int peer)
 void Elector::handle_ping(MonOpRequestRef op)
 {
   MMonPing *m = static_cast<MMonPing*>(op->get_req());
 void Elector::handle_ping(MonOpRequestRef op)
 {
   MMonPing *m = static_cast<MMonPing*>(op->get_req());
-  dout(10) << __func__ << " " << *m << dendl;
-
   int prank = mon->monmap->get_rank(m->get_source_addr());
   int prank = mon->monmap->get_rank(m->get_source_addr());
+  dout(20) << __func__ << " from: " << prank << dendl;
   begin_peer_ping(prank);
   assimilate_connection_reports(m->tracker_bl);
   switch(m->op) {
   begin_peer_ping(prank);
   assimilate_connection_reports(m->tracker_bl);
   switch(m->op) {
@@ -567,20 +580,28 @@ void Elector::handle_ping(MonOpRequestRef op)
     break;
 
   case MMonPing::PING_REPLY:
     break;
 
   case MMonPing::PING_REPLY:
+
     const utime_t& previous_acked = peer_acked_ping[prank];
     const utime_t& newest = peer_sent_ping[prank];
     const utime_t& previous_acked = peer_acked_ping[prank];
     const utime_t& newest = peer_sent_ping[prank];
+
     if (m->stamp > newest && !newest.is_zero()) {
       derr << "dropping PING_REPLY stamp " << m->stamp
           << " as it is newer than newest sent " << newest << dendl;
       return;
     }
     if (m->stamp > newest && !newest.is_zero()) {
       derr << "dropping PING_REPLY stamp " << m->stamp
           << " as it is newer than newest sent " << newest << dendl;
       return;
     }
+
     if (m->stamp > previous_acked) {
     if (m->stamp > previous_acked) {
+      dout(20) << "m->stamp > previous_acked" << dendl;
       peer_tracker.report_live_connection(prank, m->stamp - previous_acked);
       peer_acked_ping[prank] = m->stamp;
       peer_tracker.report_live_connection(prank, m->stamp - previous_acked);
       peer_acked_ping[prank] = m->stamp;
+    } else{
+      dout(20) << "m->stamp <= previous_acked .. we don't report_live_connection" << dendl;
     }
     utime_t now = ceph_clock_now();
     }
     utime_t now = ceph_clock_now();
+    dout(30) << "now: " << now << " m->stamp: " << m->stamp << " ping_timeout: "
+      << ping_timeout << " PING_DIVISOR: " << PING_DIVISOR << dendl;
     if (now - m->stamp > ping_timeout / PING_DIVISOR) {
     if (now - m->stamp > ping_timeout / PING_DIVISOR) {
-      send_peer_ping(prank, &now);
+      if (!send_peer_ping(prank, &now)) return;
     }
     break;
   }
     }
     break;
   }
@@ -605,7 +626,7 @@ void Elector::dispatch(MonOpRequestRef op)
       }
 
       auto em = op->get_req<MMonElection>();
       }
 
       auto em = op->get_req<MMonElection>();
-
+      dout(20) << __func__ << " from: " << mon->monmap->get_rank(em->get_source_addr()) << dendl;
       // assume an old message encoding would have matched
       if (em->fsid != mon->monmap->fsid) {
        dout(0) << " ignoring election msg fsid " 
       // assume an old message encoding would have matched
       if (em->fsid != mon->monmap->fsid) {
        dout(0) << " ignoring election msg fsid " 
@@ -696,21 +717,32 @@ void Elector::start_participating()
   logic.participating = true;
 }
 
   logic.participating = true;
 }
 
+bool Elector::peer_tracker_is_clean()
+{
+  return peer_tracker.is_clean(mon->rank, paxos_size());
+}
+
 void Elector::notify_clear_peer_state()
 {
 void Elector::notify_clear_peer_state()
 {
+  dout(10) << __func__ << dendl;
+  dout(20) << " peer_tracker before: " << peer_tracker << dendl;
   peer_tracker.notify_reset();
   peer_tracker.notify_reset();
+  peer_tracker.set_rank(mon->rank);
+  dout(20) << " peer_tracker after: " << peer_tracker << dendl;
 }
 
 void Elector::notify_rank_changed(int new_rank)
 {
 }
 
 void Elector::notify_rank_changed(int new_rank)
 {
+  dout(10) << __func__ << " to " << new_rank << dendl; 
   peer_tracker.notify_rank_changed(new_rank);
   live_pinging.erase(new_rank);
   dead_pinging.erase(new_rank);
 }
 
   peer_tracker.notify_rank_changed(new_rank);
   live_pinging.erase(new_rank);
   dead_pinging.erase(new_rank);
 }
 
-void Elector::notify_rank_removed(int rank_removed)
+void Elector::notify_rank_removed(int rank_removed, int new_rank)
 {
 {
-  peer_tracker.notify_rank_removed(rank_removed);
+  dout(10) << __func__ << ": " << rank_removed << dendl; 
+  peer_tracker.notify_rank_removed(rank_removed, new_rank);
   /* we have to clean up the pinging state, which is annoying
      because it's not indexed anywhere (and adding indexing
      would also be annoying).
   /* we have to clean up the pinging state, which is annoying
      because it's not indexed anywhere (and adding indexing
      would also be annoying).
index a581daa7ff5cc882ab8b99b1f0630eaf05acecec..1d8e66fcc0ec72e1facf8f6e182794199b29874c 100644 (file)
@@ -188,7 +188,7 @@ class Elector : public ElectionOwner, RankProvider {
    * Send a ping to the specified peer.
    * @n optional time that we will use instead of calling ceph_clock_now()
    */
    * Send a ping to the specified peer.
    * @n optional time that we will use instead of calling ceph_clock_now()
    */
-  void send_peer_ping(int peer, const utime_t *n=NULL);
+  bool send_peer_ping(int peer, const utime_t *n=NULL);
   /**
    * Check the state of pinging the specified peer. This is our
    * "tick" for heartbeating; scheduled by itself and begin_peer_ping().
   /**
    * Check the state of pinging the specified peer. This is our
    * "tick" for heartbeating; scheduled by itself and begin_peer_ping().
@@ -357,6 +357,11 @@ class Elector : public ElectionOwner, RankProvider {
    * @post  @p participating is true
    */
   void start_participating();
    * @post  @p participating is true
    */
   void start_participating();
+  /**
+  * Check if our peer_tracker is self-consistent, not suffering from
+  * https://tracker.ceph.com/issues/58049
+  */
+  bool peer_tracker_is_clean();
   /**
    * Forget everything about our peers. :(
    */
   /**
    * Forget everything about our peers. :(
    */
@@ -371,7 +376,7 @@ class Elector : public ElectionOwner, RankProvider {
    * This is safe to call even if we haven't joined or are currently
    * in a quorum.
    */
    * This is safe to call even if we haven't joined or are currently
    * in a quorum.
    */
-  void notify_rank_removed(int rank_removed);
+  void notify_rank_removed(int rank_removed, int new_rank);
   void notify_strategy_maybe_changed(int strategy);
   /**
    * Set the disallowed leaders.
   void notify_strategy_maybe_changed(int strategy);
   /**
    * Set the disallowed leaders.
index b5f8b6ce373c3d5ceac4ce17cefa4fe378b20176..5acafb1ff91d9537fc55fd6a988a5e0ae177f7d0 100644 (file)
@@ -1524,6 +1524,12 @@ int FileSystemCommandHandler::_check_pool(
     return -ENOENT;
   }
 
     return -ENOENT;
   }
 
+  if (pool->has_snaps()) {
+    *ss << "pool(" << pool_id <<") already has mon-managed snaps; "
+          "can't attach pool to fs";
+    return -EOPNOTSUPP;
+  }
+
   const string& pool_name = osd_map.get_pool_name(pool_id);
 
   if (pool->is_erasure()) {
   const string& pool_name = osd_map.get_pool_name(pool_id);
 
   if (pool->is_erasure()) {
index 80e069d593af0f37132ac58eeaef07a77582b50f..2b628cebaafa1340ffbf5a2bf4a381cbf483f379 100644 (file)
@@ -913,7 +913,7 @@ bool LogMonitor::preprocess_command(MonOpRequestRef op)
          } else {
            start = from;
          }
          } else {
            start = from;
          }
-         dout(10) << __func__ << " channnel " << p.first
+         dout(10) << __func__ << " channel " << p.first
                   << " from " << from << " to " << to << dendl;
          for (version_t v = start; v < to; ++v) {
            bufferlist ebl;
                   << " from " << from << " to " << to << dendl;
          for (version_t v = start; v < to; ++v) {
            bufferlist ebl;
@@ -934,6 +934,9 @@ bool LogMonitor::preprocess_command(MonOpRequestRef op)
          entries.erase(entries.begin());
        }
        for (auto& p : entries) {
          entries.erase(entries.begin());
        }
        for (auto& p : entries) {
+         if (!match(p.second)) {
+           continue;
+         }
          if (f) {
            f->dump_object("entry", p.second);
          } else {
          if (f) {
            f->dump_object("entry", p.second);
          } else {
@@ -965,10 +968,12 @@ bool LogMonitor::preprocess_command(MonOpRequestRef op)
            LogEntry le;
            auto p = ebl.cbegin();
            decode(le, p);
            LogEntry le;
            auto p = ebl.cbegin();
            decode(le, p);
-           if (f) {
-             f->dump_object("entry", le);
-           } else {
-             ss << le << "\n";
+           if (match(le)) {
+             if (f) {
+               f->dump_object("entry", le);
+             } else {
+               ss << le << "\n";
+             }
            }
          }
        }
            }
          }
        }
index 5342fc51fc3deda4e013fa88672e182e86064914..c06a691b04add583673b3f46f57825734ce02486 100644 (file)
@@ -514,13 +514,13 @@ public:
       }
       f->close_section();
     }
       }
       f->close_section();
     }
+    f->close_section(); // always_on_modules
     f->dump_int("last_failure_osd_epoch", last_failure_osd_epoch);
     f->open_array_section("active_clients");
     for (const auto &c : clients) {
       f->dump_object("client", c);
     }
     f->dump_int("last_failure_osd_epoch", last_failure_osd_epoch);
     f->open_array_section("active_clients");
     for (const auto &c : clients) {
       f->dump_object("client", c);
     }
-    f->close_section();
-    f->close_section();
+    f->close_section(); // active_clients
   }
 
   static void generate_test_instances(std::list<MgrMap*> &l) {
   }
 
   static void generate_test_instances(std::list<MgrMap*> &l) {
index 38ad26f61bdcf346db20b357a3f05b30a4b34580..3acb11c4a864e3fa598ca94f04fcffe343c38fdb 100644 (file)
@@ -517,12 +517,20 @@ int MonClient::init()
   timer.init();
   schedule_tick();
 
   timer.init();
   schedule_tick();
 
+  cct->get_admin_socket()->register_command(
+    "rotate-key",
+    this,
+    "rotate live authentication key");
+
   return 0;
 }
 
 void MonClient::shutdown()
 {
   ldout(cct, 10) << __func__ << dendl;
   return 0;
 }
 
 void MonClient::shutdown()
 {
   ldout(cct, 10) << __func__ << dendl;
+
+  cct->get_admin_socket()->unregister_commands(this);
+  
   monc_lock.lock();
   stopping = true;
   while (!version_requests.empty()) {
   monc_lock.lock();
   stopping = true;
   while (!version_requests.empty()) {
@@ -603,6 +611,33 @@ int MonClient::authenticate(double timeout)
   return authenticate_err;
 }
 
   return authenticate_err;
 }
 
+int MonClient::call(
+    std::string_view command,
+    const cmdmap_t& cmdmap,
+    const ceph::buffer::list &inbl,
+    ceph::Formatter *f,
+    std::ostream& errss,
+    ceph::buffer::list& out)
+{
+  if (command == "rotate-key") {
+    CryptoKey key;
+    try {
+      key.decode_base64(inbl.to_str());
+    } catch (buffer::error& e) {
+      errss << "error decoding key: " << e.what();
+      return -EINVAL;
+    }
+    if (keyring) {
+      ldout(cct, 1) << "rotate live key for " << entity_name << dendl;
+      keyring->add(entity_name, key);
+    } else {
+      errss << "cephx not enabled; no key to rotate";
+      return -EINVAL;
+    }
+  }
+  return 0;
+}
+
 void MonClient::handle_auth(MAuthReply *m)
 {
   ceph_assert(ceph_mutex_is_locked(monc_lock));
 void MonClient::handle_auth(MAuthReply *m)
 {
   ceph_assert(ceph_mutex_is_locked(monc_lock));
index de6bba574ff1a296fd539e6ccee2290da4414ad2..b72bf1f65749f750efd0d4c06361d2a156f540e3 100644 (file)
@@ -27,6 +27,7 @@
 #include "MonMap.h"
 #include "MonSub.h"
 
 #include "MonMap.h"
 #include "MonSub.h"
 
+#include "common/admin_socket.h"
 #include "common/async/completion.h"
 #include "common/Timer.h"
 #include "common/config.h"
 #include "common/async/completion.h"
 #include "common/Timer.h"
 #include "common/config.h"
@@ -269,7 +270,8 @@ const boost::system::error_category& monc_category() noexcept;
 
 class MonClient : public Dispatcher,
                  public AuthClient,
 
 class MonClient : public Dispatcher,
                  public AuthClient,
-                 public AuthServer /* for mgr, osd, mds */ {
+                 public AuthServer, /* for mgr, osd, mds */
+                 public AdminSocketHook {
   static constexpr auto dout_subsys = ceph_subsys_monc;
 public:
   // Error, Newest, Oldest
   static constexpr auto dout_subsys = ceph_subsys_monc;
 public:
   // Error, Newest, Oldest
@@ -315,6 +317,14 @@ private:
 
   void handle_auth(MAuthReply *m);
 
 
   void handle_auth(MAuthReply *m);
 
+  int call(
+    std::string_view command,
+    const cmdmap_t& cmdmap,
+    const ceph::buffer::list &inbl,
+    ceph::Formatter *f,
+    std::ostream& errss,
+    ceph::buffer::list& out) override;
+  
   // monitor session
   utime_t last_keepalive;
   utime_t last_send_log;
   // monitor session
   utime_t last_keepalive;
   utime_t last_send_log;
index 097f3f74e94304a8bd780069c4af0a24c033a296..4894deec981d9487dcb6f358e0a37634808fb4a1 100644 (file)
@@ -173,6 +173,18 @@ COMMAND("auth get-or-create "
        "name=caps,type=CephString,n=N,req=false",
        "add auth info for <entity> from input file, or random key if no input given, and/or any caps specified in the command",
        "auth", "rwx")
        "name=caps,type=CephString,n=N,req=false",
        "add auth info for <entity> from input file, or random key if no input given, and/or any caps specified in the command",
        "auth", "rwx")
+COMMAND("auth get-or-create-pending "
+       "name=entity,type=CephString",
+       "generate and/or retrieve existing pending key (rotated into place on first use)",
+       "auth", "rwx")
+COMMAND("auth clear-pending "
+       "name=entity,type=CephString",
+       "clear pending key",
+       "auth", "rwx")
+COMMAND("auth commit-pending "
+       "name=entity,type=CephString",
+       "rotate pending key into active position",
+       "auth", "rwx")
 COMMAND("fs authorize "
    "name=filesystem,type=CephString "
    "name=entity,type=CephString "
 COMMAND("fs authorize "
    "name=filesystem,type=CephString "
    "name=entity,type=CephString "
@@ -1375,6 +1387,10 @@ COMMAND_WITH_FLAG("sessions",
             "mon", "r",
             FLAG(TELL))
 COMMAND_WITH_FLAG("dump_historic_ops",
             "mon", "r",
             FLAG(TELL))
 COMMAND_WITH_FLAG("dump_historic_ops",
-            "dump_historic_ops",
+            "show recent ops",
+            "mon", "r",
+            FLAG(TELL))
+COMMAND_WITH_FLAG("dump_historic_slow_ops",
+            "show recent slow ops",
             "mon", "r",
             FLAG(TELL))
             "mon", "r",
             FLAG(TELL))
index d60da1b99725ddae57db659949f6371241edcc21..33b9aa8fa2880e5f4fd79a3e1c5e6368d723cf33 100644 (file)
@@ -368,7 +368,7 @@ void MonMap::print_summary(ostream& out) const
     out << p->first << "=" << p->second.public_addrs;
     has_printed = true;
   }
     out << p->first << "=" << p->second.public_addrs;
     has_printed = true;
   }
-  out << "}";
+  out << "}" << " removed_ranks: {" << removed_ranks << "}";
 }
  
 void MonMap::print(ostream& out) const
 }
  
 void MonMap::print(ostream& out) const
@@ -412,6 +412,7 @@ void MonMap::dump(Formatter *f) const
   f->dump_stream("disallowed_leaders: ") << disallowed_leaders;
   f->dump_bool("stretch_mode", stretch_mode_enabled);
   f->dump_string("tiebreaker_mon", tiebreaker_mon);
   f->dump_stream("disallowed_leaders: ") << disallowed_leaders;
   f->dump_bool("stretch_mode", stretch_mode_enabled);
   f->dump_string("tiebreaker_mon", tiebreaker_mon);
+  f->dump_stream("removed_ranks: ") << removed_ranks;
   f->open_object_section("features");
   persistent_features.dump(f, "persistent");
   optional_features.dump(f, "optional");
   f->open_object_section("features");
   persistent_features.dump(f, "persistent");
   optional_features.dump(f, "optional");
index f756c1f07e4477e6e662a8866d0dc4d068045acb..b4c2f7288736ae86e012b13efe98b6fa2d435f1d 100644 (file)
@@ -291,6 +291,7 @@ class AdminHook : public AdminSocketHook {
 public:
   explicit AdminHook(Monitor *m) : mon(m) {}
   int call(std::string_view command, const cmdmap_t& cmdmap,
 public:
   explicit AdminHook(Monitor *m) : mon(m) {}
   int call(std::string_view command, const cmdmap_t& cmdmap,
+          const bufferlist&,
           Formatter *f,
           std::ostream& errss,
           bufferlist& out) override {
           Formatter *f,
           std::ostream& errss,
           bufferlist& out) override {
@@ -941,7 +942,15 @@ int Monitor::init()
   osdmon()->get_filestore_osd_list();
 
   state = STATE_PROBING;
   osdmon()->get_filestore_osd_list();
 
   state = STATE_PROBING;
+
   bootstrap();
   bootstrap();
+
+  if (!elector.peer_tracker_is_clean()){
+    dout(10) << "peer_tracker looks inconsistent"
+      << " previous bad logic, clearing ..." << dendl;
+    elector.notify_clear_peer_state();
+  }
+
   // add features of myself into feature_map
   session_map.feature_map.add_mon(con_self->get_features());
   return 0;
   // add features of myself into feature_map
   session_map.feature_map.add_mon(con_self->get_features());
   return 0;
@@ -1994,10 +2003,16 @@ void Monitor::handle_probe_reply(MonOpRequestRef op)
                               !has_ever_joined)) {
       dout(10) << " got newer/committed monmap epoch " << newmap->get_epoch()
               << ", mine was " << monmap->get_epoch() << dendl;
                               !has_ever_joined)) {
       dout(10) << " got newer/committed monmap epoch " << newmap->get_epoch()
               << ", mine was " << monmap->get_epoch() << dendl;
+      int epoch_diff = newmap->get_epoch() - monmap->get_epoch();
       delete newmap;
       monmap->decode(m->monmap_bl);
       delete newmap;
       monmap->decode(m->monmap_bl);
-      notify_new_monmap(false);
-
+      dout(20) << "has_ever_joined: " << has_ever_joined << dendl;
+      if (epoch_diff == 1 && has_ever_joined) {
+        notify_new_monmap(false);
+      } else {
+        notify_new_monmap(false, false);
+        elector.notify_clear_peer_state();
+      }
       bootstrap();
       return;
     }
       bootstrap();
       return;
     }
@@ -2974,7 +2989,7 @@ void Monitor::update_pending_metadata()
   const std::string current_version = mon_metadata[rank]["ceph_version_short"];
   const std::string pending_version = metadata["ceph_version_short"];
 
   const std::string current_version = mon_metadata[rank]["ceph_version_short"];
   const std::string pending_version = metadata["ceph_version_short"];
 
-  if (current_version.compare(0, version_size, pending_version) < 0) {
+  if (current_version.compare(0, version_size, pending_version) != 0) {
     mgr_client.update_daemon_metadata("mon", name, metadata);
   }
 }
     mgr_client.update_daemon_metadata("mon", name, metadata);
   }
 }
@@ -3442,9 +3457,9 @@ void Monitor::handle_command(MonOpRequestRef op)
   // Catch bad_cmd_get exception if _generate_command_map() throws it
   try {
     _generate_command_map(cmdmap, param_str_map);
   // Catch bad_cmd_get exception if _generate_command_map() throws it
   try {
     _generate_command_map(cmdmap, param_str_map);
-  }
-  catch(bad_cmd_get& e) {
+  } catch (const bad_cmd_get& e) {
     reply_command(op, -EINVAL, e.what(), 0);
     reply_command(op, -EINVAL, e.what(), 0);
+    return;
   }
 
   if (!_allowed_command(session, service, prefix, cmdmap,
   }
 
   if (!_allowed_command(session, service, prefix, cmdmap,
@@ -3678,7 +3693,16 @@ void Monitor::handle_command(MonOpRequestRef op)
     rs = "";
     r = 0;
   } else if (prefix == "report") {
     rs = "";
     r = 0;
   } else if (prefix == "report") {
-
+    // some of the report data is only known by leader, e.g. osdmap_clean_epochs
+    if (!is_leader() && !is_peon()) {
+      dout(10) << " waiting for quorum" << dendl;
+      waitfor_quorum.push_back(new C_RetryMessage(this, op));
+      return;
+    }
+    if (!is_leader()) {
+      forward_request_leader(op);
+      return;
+    }
     // this must be formatted, in its current form
     if (!f)
       f.reset(Formatter::create("json-pretty"));
     // this must be formatted, in its current form
     if (!f)
       f.reset(Formatter::create("json-pretty"));
@@ -4492,6 +4516,7 @@ void Monitor::dispatch_op(MonOpRequestRef op)
   switch (op->get_req()->get_type()) {
     // auth
     case MSG_MON_GLOBAL_ID:
   switch (op->get_req()->get_type()) {
     // auth
     case MSG_MON_GLOBAL_ID:
+    case MSG_MON_USED_PENDING_KEYS:
     case CEPH_MSG_AUTH:
       op->set_type_service();
       /* no need to check caps here */
     case CEPH_MSG_AUTH:
       op->set_type_service();
       /* no need to check caps here */
@@ -6558,7 +6583,7 @@ void Monitor::set_mon_crush_location(const string& loc)
   need_set_crush_loc = true;
 }
 
   need_set_crush_loc = true;
 }
 
-void Monitor::notify_new_monmap(bool can_change_external_state)
+void Monitor::notify_new_monmap(bool can_change_external_state, bool remove_rank_elector)
 {
   if (need_set_crush_loc) {
     auto my_info_i = monmap->mon_info.find(name);
 {
   if (need_set_crush_loc) {
     auto my_info_i = monmap->mon_info.find(name);
@@ -6568,12 +6593,25 @@ void Monitor::notify_new_monmap(bool can_change_external_state)
     }
   }
   elector.notify_strategy_maybe_changed(monmap->strategy);
     }
   }
   elector.notify_strategy_maybe_changed(monmap->strategy);
-  dout(30) << __func__ << "we have " << monmap->removed_ranks.size() << " removed ranks" << dendl;
-  for (auto i = monmap->removed_ranks.rbegin();
-       i != monmap->removed_ranks.rend(); ++i) {
-    int rank = *i;
-    dout(10) << __func__ << "removing rank " << rank << dendl;
-    elector.notify_rank_removed(rank);
+  if (remove_rank_elector){
+    dout(10) << __func__ << " we have " << monmap->ranks.size()<< " ranks" << dendl;
+    dout(10) << __func__ << " we have " << monmap->removed_ranks.size() << " removed ranks" << dendl;
+    for (auto i = monmap->removed_ranks.rbegin();
+        i != monmap->removed_ranks.rend(); ++i) {
+      int remove_rank = *i;
+      dout(10) << __func__ << " removing rank " << remove_rank << dendl;
+      if (rank == remove_rank) {
+        dout(5) << "We are removing our own rank, probably we"
+          << " are removed from monmap before we shutdown ... dropping." << dendl;
+        continue;
+      }
+      int new_rank = monmap->get_rank(messenger->get_myaddrs());
+      if (new_rank == -1) {
+        dout(5) << "We no longer exists in the monmap! ... dropping." << dendl;
+        continue;
+      }
+      elector.notify_rank_removed(remove_rank, new_rank);
+    }
   }
 
   if (monmap->stretch_mode_enabled) {
   }
 
   if (monmap->stretch_mode_enabled) {
index 575fef0a9c886059241b9fca30725a075a2d4445..41fde178a97e264c50473131aa757b803f0091b6 100644 (file)
@@ -876,7 +876,7 @@ public:
   /** can_change_external_state if we can do things like
    *  call elections as a result of the new map.
    */
   /** can_change_external_state if we can do things like
    *  call elections as a result of the new map.
    */
-  void notify_new_monmap(bool can_change_external_state=false);
+  void notify_new_monmap(bool can_change_external_state=false, bool remove_rank_elector=true);
 
 public:
   struct C_Command : public C_MonOp {
 
 public:
   struct C_Command : public C_MonOp {
index 6c5a9ce5736a7fa1e12593d3450d1f517fd7573f..d162b8e9414cf798228ba44b898bb6d124693abf 100644 (file)
@@ -129,7 +129,7 @@ void MonmapMonitor::create_pending()
   pending_map = *mon.monmap;
   pending_map.epoch++;
   pending_map.last_changed = ceph_clock_now();
   pending_map = *mon.monmap;
   pending_map.epoch++;
   pending_map.last_changed = ceph_clock_now();
-  dout(10) << __func__ << " monmap epoch " << pending_map.epoch << dendl;
+  pending_map.removed_ranks.clear();
 }
 
 void MonmapMonitor::encode_pending(MonitorDBStore::TransactionRef t)
 }
 
 void MonmapMonitor::encode_pending(MonitorDBStore::TransactionRef t)
@@ -755,8 +755,6 @@ bool MonmapMonitor::prepare_command(MonOpRequestRef op)
     pending_map.remove(name);
     pending_map.disallowed_leaders.erase(name);
     pending_map.last_changed = ceph_clock_now();
     pending_map.remove(name);
     pending_map.disallowed_leaders.erase(name);
     pending_map.last_changed = ceph_clock_now();
-    ss << "removing mon." << name << " at " << addrs
-       << ", there will be " << pending_map.size() << " monitors" ;
     propose = true;
     err = 0;
 
     propose = true;
     err = 0;
 
index 5d76862e0a8346a593879f0f69b55870a04fc912..2e03406643565288da34a9a52aa7ab77ca9e7ae4 100644 (file)
@@ -7902,65 +7902,74 @@ int OSDMonitor::get_crush_rule(const string &rule_name,
   return 0;
 }
 
   return 0;
 }
 
-int OSDMonitor::check_pg_num(int64_t pool, int pg_num, int size, int crush_rule, ostream *ss)
+/*
+* Get the number of 'in' osds according to the crush_rule,
+*/
+uint32_t OSDMonitor::get_osd_num_by_crush(int crush_rule)
+{
+  set<int> out_osds;
+  set<int> crush_in_osds;
+  set<int> roots;
+  CrushWrapper newcrush = _get_pending_crush();
+  newcrush.find_takes_by_rule(crush_rule, &roots);
+  for (auto root : roots) {
+    const char *rootname = newcrush.get_item_name(root);
+    set<int> crush_all_osds;
+    newcrush.get_leaves(rootname, &crush_all_osds);
+    std::set_difference(crush_all_osds.begin(), crush_all_osds.end(),
+                        out_osds.begin(), out_osds.end(),
+                        std::inserter(crush_in_osds, crush_in_osds.end()));
+  }
+  return crush_in_osds.size();
+}
+
+int OSDMonitor::check_pg_num(int64_t pool,
+                             int pg_num,
+                             int size,
+                             int crush_rule,
+                             ostream *ss)
 {
   auto max_pgs_per_osd = g_conf().get_val<uint64_t>("mon_max_pg_per_osd");
   uint64_t projected = 0;
 {
   auto max_pgs_per_osd = g_conf().get_val<uint64_t>("mon_max_pg_per_osd");
   uint64_t projected = 0;
-  unsigned osd_num = 0;
-  // assume min cluster size 3
-  auto num_osds = std::max(osdmap.get_num_in_osds(), 3u);
+  uint32_t osd_num_by_crush = 0;
+  set<int64_t> crush_pool_ids;
   if (pool < 0) {
     // a new pool
     projected += pg_num * size;
   }
   if (pool < 0) {
     // a new pool
     projected += pg_num * size;
   }
-  if (mapping.get_epoch() >= osdmap.get_epoch()) {
-    set<int> roots;
-    CrushWrapper newcrush = _get_pending_crush();
-    newcrush.find_takes_by_rule(crush_rule, &roots);
-    int max_osd = osdmap.get_max_osd();
-    for (auto root : roots) {
-      const char *rootname = newcrush.get_item_name(root);
-      set<int> osd_ids;
-      newcrush.get_leaves(rootname, &osd_ids);
-      unsigned out_osd = 0;
-      for (auto id : osd_ids) {
-       if (id > max_osd) { 
-         out_osd++;
-         continue;
-       }
-       projected += mapping.get_osd_acting_pgs(id).size();
-      }
-      osd_num += osd_ids.size() - out_osd;
-    }
-    if (pool >= 0) {   
-      // update an existing pool's pg num
-      const auto& pg_info = osdmap.get_pools().at(pool);    
-      // already counted the pgs of this `pool` by iterating crush map, so 
-      // remove them using adding the specified pg num
-      projected += pg_num * size;
-      projected -= pg_info.get_pg_num_target() * pg_info.get_size();
-    }
-    num_osds = std::max(osd_num, 3u);  // assume min cluster size 3
-  } else {
-    // use pg_num target for evaluating the projected pg num
-    for (const auto& [pool_id, pool_info] : osdmap.get_pools()) {
+
+  osd_num_by_crush = get_osd_num_by_crush(crush_rule);
+  osdmap.get_pool_ids_by_rule(crush_rule, &crush_pool_ids);
+
+  for (const auto& [pool_id, pool_info] : osdmap.get_pools()) {
+    // Check only for pools affected by crush rule
+    if (crush_pool_ids.count(pool_id)) {
       if (pool_id == pool) {
       if (pool_id == pool) {
-       projected += pg_num * size;
+        // Specified pool, use given pg_num and size values.
+        projected += pg_num * size;
       } else {
       } else {
-       projected += pool_info.get_pg_num_target() * pool_info.get_size();
+        // Use pg_num_target for evaluating the projected pg num
+        projected += pool_info.get_pg_num_target() * pool_info.get_size();
       }
     }
   }
       }
     }
   }
-  auto max_pgs = max_pgs_per_osd * num_osds;
-  if (projected > max_pgs) {
+  // assume min cluster size 3
+  osd_num_by_crush = std::max(osd_num_by_crush, 3u);
+  auto projected_pgs_per_osd = projected / osd_num_by_crush;
+
+  if (projected_pgs_per_osd > max_pgs_per_osd) {
     if (pool >= 0) {
       *ss << "pool id " << pool;
     }
     if (pool >= 0) {
       *ss << "pool id " << pool;
     }
-    *ss << " pg_num " << pg_num << " size " << size
-       << " would mean " << projected
-       << " total pgs, which exceeds max " << max_pgs
-       << " (mon_max_pg_per_osd " << max_pgs_per_osd
-       << " * num_in_osds " << num_osds << ")";
+    *ss << " pg_num " << pg_num
+        << " size " << size
+        << " for this pool would result in "
+        << projected_pgs_per_osd
+        << " cumulative PGs per OSD (" << projected
+        << " total PG replicas on " << osd_num_by_crush
+        << " 'in' root OSDs by crush rule) "
+        << "which exceeds the mon_max_pg_per_osd "
+        << "value of " << max_pgs_per_osd;
     return -ERANGE;
   }
   return 0;
     return -ERANGE;
   }
   return 0;
@@ -8055,7 +8064,8 @@ int OSDMonitor::prepare_new_pool(string& name,
     tester.set_rule(crush_rule);
     tester.set_num_rep(size);
     auto start = ceph::coarse_mono_clock::now();
     tester.set_rule(crush_rule);
     tester.set_num_rep(size);
     auto start = ceph::coarse_mono_clock::now();
-    r = tester.test_with_fork(g_conf()->mon_lease);
+    r = tester.test_with_fork(cct, g_conf()->mon_lease);
+    dout(10) << __func__ << " crush test_with_fork tester created " << dendl;
     auto duration = ceph::coarse_mono_clock::now() - start;
     if (r < 0) {
       dout(10) << "tester.test_with_fork returns " << r
     auto duration = ceph::coarse_mono_clock::now() - start;
     if (r < 0) {
       dout(10) << "tester.test_with_fork returns " << r
@@ -8344,9 +8354,12 @@ int OSDMonitor::prepare_command_pool_set(const cmdmap_t& cmdmap,
       ss << "crush rule " << p.get_crush_rule() << " type does not match pool";
       return -EINVAL;
     }
       ss << "crush rule " << p.get_crush_rule() << " type does not match pool";
       return -EINVAL;
     }
-    int r = check_pg_num(pool, p.get_pg_num(), n, p.get_crush_rule(), &ss);
-    if (r < 0) {
-      return r;
+    if (n > p.size) {
+      // only when increasing pool size
+      int r = check_pg_num(pool, p.get_pg_num(), n, p.get_crush_rule(), &ss);
+      if (r < 0) {
+        return r;
+      }
     }
     p.size = n;
     p.min_size = g_conf().get_osd_pool_default_min_size(p.size);
     }
     p.size = n;
     p.min_size = g_conf().get_osd_pool_default_min_size(p.size);
@@ -10033,7 +10046,7 @@ bool OSDMonitor::prepare_command_impl(MonOpRequestRef op,
       tester.set_max_x(50);
       tester.set_num_rep(3);  // arbitrary
       auto start = ceph::coarse_mono_clock::now();
       tester.set_max_x(50);
       tester.set_num_rep(3);  // arbitrary
       auto start = ceph::coarse_mono_clock::now();
-      int r = tester.test_with_fork(g_conf()->mon_lease);
+      int r = tester.test_with_fork(cct, g_conf()->mon_lease);
       auto duration = ceph::coarse_mono_clock::now() - start;
       if (r < 0) {
        dout(10) << " tester.test_with_fork returns " << r
       auto duration = ceph::coarse_mono_clock::now() - start;
       if (r < 0) {
        dout(10) << " tester.test_with_fork returns " << r
@@ -14049,6 +14062,16 @@ bool OSDMonitor::prepare_pool_op(MonOpRequestRef op)
 
   const pg_pool_t *pool = osdmap.get_pg_pool(m->pool);
 
 
   const pg_pool_t *pool = osdmap.get_pg_pool(m->pool);
 
+  if (m->op == POOL_OP_CREATE_SNAP ||
+      m->op == POOL_OP_CREATE_UNMANAGED_SNAP) {
+    if (const auto& fsmap = mon.mdsmon()->get_fsmap(); fsmap.pool_in_use(m->pool)) {
+      dout(20) << "monitor-managed snapshots have been disabled for pools "
+                 " attached to an fs - pool:" << m->pool << dendl;
+      _pool_op_reply(op, -EOPNOTSUPP, osdmap.get_epoch());
+      return false;
+    }
+  }
+
   switch (m->op) {
     case POOL_OP_CREATE_SNAP:
       if (pool->is_tier()) {
   switch (m->op) {
     case POOL_OP_CREATE_SNAP:
       if (pool->is_tier()) {
index 55d4e8c10f3aaea3928d250efb47a74b7653107f..992fb9deadc9ec00f2fb0987f7dec3b8e2cc8066 100644 (file)
@@ -515,6 +515,7 @@ private:
                                const std::string &erasure_code_profile,
                                unsigned *stripe_width,
                                std::ostream *ss);
                                const std::string &erasure_code_profile,
                                unsigned *stripe_width,
                                std::ostream *ss);
+  uint32_t get_osd_num_by_crush(int crush_rule);
   int check_pg_num(int64_t pool, int pg_num, int size, int crush_rule, std::ostream* ss);
   int prepare_new_pool(std::string& name,
                       int crush_rule,
   int check_pg_num(int64_t pool, int pg_num, int size, int crush_rule, std::ostream* ss);
   int prepare_new_pool(std::string& name,
                       int crush_rule,
index 032c22e6c23f00c09f3122f42d7fca518a1c65de..ff1b12c474e57772e7530d6923e0e05356e33a24 100644 (file)
@@ -164,7 +164,9 @@ static int remove_opt(struct ceph_mount_info *cmi, const char *key, char **value
                memmove(key_start, value_end, len2);
        } else {
                 /* last kv pair - swallow the comma */
                memmove(key_start, value_end, len2);
        } else {
                 /* last kv pair - swallow the comma */
-               --key_start;
+               if (*(key_start - 1) == ',') {
+                       --key_start;
+               }
                *key_start = '\0';
        }
 
                *key_start = '\0';
        }
 
index 266eb7676786b85ea7481855fa6d8bd94c600a56..d0e8eccb7535e600006fd5ac5f477b5dec7117ac 100644 (file)
 #include "messages/MMonSubscribe.h"
 #include "messages/MMonSubscribeAck.h"
 #include "messages/MMonGlobalID.h"
 #include "messages/MMonSubscribe.h"
 #include "messages/MMonSubscribeAck.h"
 #include "messages/MMonGlobalID.h"
+#include "messages/MMonUsedPendingKeys.h"
 #include "messages/MClientSession.h"
 #include "messages/MClientReconnect.h"
 #include "messages/MClientRequest.h"
 #include "messages/MClientSession.h"
 #include "messages/MClientReconnect.h"
 #include "messages/MClientRequest.h"
@@ -652,6 +653,9 @@ Message *decode_message(CephContext *cct,
   case MSG_MON_GLOBAL_ID:
     m = make_message<MMonGlobalID>();
     break; 
   case MSG_MON_GLOBAL_ID:
     m = make_message<MMonGlobalID>();
     break; 
+  case MSG_MON_USED_PENDING_KEYS:
+    m = make_message<MMonUsedPendingKeys>();
+    break; 
 
     // clients
   case CEPH_MSG_MON_SUBSCRIBE:
 
     // clients
   case CEPH_MSG_MON_SUBSCRIBE:
@@ -822,6 +826,9 @@ Message *decode_message(CephContext *cct,
     break;
 
 
     break;
 
 
+  case MSG_MDS_DENTRYUNLINK_ACK:
+    m = make_message<MDentryUnlinkAck>();
+    break;
   case MSG_MDS_DENTRYUNLINK:
     m = make_message<MDentryUnlink>();
     break;
   case MSG_MDS_DENTRYUNLINK:
     m = make_message<MDentryUnlink>();
     break;
index a7aff1e27a603fbc4f3274ad47a447a8ea27d246..649df93f07925a0dc1f074246fff241e8b2e2b37 100644 (file)
@@ -58,6 +58,7 @@
 #define MSG_GETPOOLSTATSREPLY      59
 
 #define MSG_MON_GLOBAL_ID          60
 #define MSG_GETPOOLSTATSREPLY      59
 
 #define MSG_MON_GLOBAL_ID          60
+#define MSG_MON_USED_PENDING_KEYS  141
 
 #define MSG_ROUTE                  47
 #define MSG_FORWARD                46
 
 #define MSG_ROUTE                  47
 #define MSG_FORWARD                46
 #define MSG_MDS_OPENINOREPLY       0x210
 #define MSG_MDS_SNAPUPDATE         0x211
 #define MSG_MDS_FRAGMENTNOTIFYACK  0x212
 #define MSG_MDS_OPENINOREPLY       0x210
 #define MSG_MDS_SNAPUPDATE         0x211
 #define MSG_MDS_FRAGMENTNOTIFYACK  0x212
+#define MSG_MDS_DENTRYUNLINK_ACK   0x213
 #define MSG_MDS_LOCK               0x300 // 0x3xx are for locker of mds
 #define MSG_MDS_INODEFILECAPS      0x301
 
 #define MSG_MDS_LOCK               0x300 // 0x3xx are for locker of mds
 #define MSG_MDS_INODEFILECAPS      0x301
 
@@ -544,6 +546,10 @@ extern Message *decode_message(CephContext *cct, int crcflags,
 class SafeMessage : public Message {
 public:
   using Message::Message;
 class SafeMessage : public Message {
 public:
   using Message::Message;
+  bool is_a_client() const {
+    return get_connection()->get_peer_type() == CEPH_ENTITY_TYPE_CLIENT;
+  }
+
 private:
   using RefCountedObject::get;
   using RefCountedObject::put;
 private:
   using RefCountedObject::get;
   using RefCountedObject::put;
index edc74a9a4904b0a50b979d810b404a256f80e51a..5bcfb56e1048e104affc51faa3d16751749f0df6 100644 (file)
@@ -104,8 +104,9 @@ int get_default_crc_flags(const ConfigProxy& conf)
   return r;
 }
 
   return r;
 }
 
-int Messenger::bindv(const entity_addrvec_t& addrs)
+int Messenger::bindv(const entity_addrvec_t& bind_addrs,
+                     std::optional<entity_addrvec_t> public_addrs)
 {
 {
-  return bind(addrs.legacy_addr());
+  return bind(bind_addrs.legacy_addr(), std::move(public_addrs));
 }
 
 }
 
index c832589e88ea5ba46530704d9ec70c532b8736ae..71b7d2549c51f12e9618356da53555968fbbdca3 100644 (file)
@@ -17,8 +17,9 @@
 #ifndef CEPH_MESSENGER_H
 #define CEPH_MESSENGER_H
 
 #ifndef CEPH_MESSENGER_H
 #define CEPH_MESSENGER_H
 
-#include <map>
 #include <deque>
 #include <deque>
+#include <map>
+#include <optional>
 
 #include <errno.h>
 #include <sstream>
 
 #include <errno.h>
 #include <sstream>
@@ -269,14 +270,7 @@ public:
    * @param addr The address to use as a template.
    */
   virtual bool set_addr_unknowns(const entity_addrvec_t &addrs) = 0;
    * @param addr The address to use as a template.
    */
   virtual bool set_addr_unknowns(const entity_addrvec_t &addrs) = 0;
-  /**
-   * set the address for this Messenger. This is useful if the Messenger
-   * binds to a specific address but advertises a different address on the
-   * the network.
-   *
-   * @param addr The address to use.
-   */
-  virtual void set_addrs(const entity_addrvec_t &addr) = 0;
+
   /// Get the default send priority.
   int get_default_send_priority() { return default_send_priority; }
   /**
   /// Get the default send priority.
   int get_default_send_priority() { return default_send_priority; }
   /**
@@ -426,12 +420,15 @@ public:
    * in an unspecified order.
    *
    * @param bind_addr The address to bind to.
    * in an unspecified order.
    *
    * @param bind_addr The address to bind to.
+   * @patam public_addrs The addresses to announce over the network
    * @return 0 on success, or -1 on error, or -errno if
    * we can be more specific about the failure.
    */
    * @return 0 on success, or -1 on error, or -errno if
    * we can be more specific about the failure.
    */
-  virtual int bind(const entity_addr_t& bind_addr) = 0;
+  virtual int bind(const entity_addr_t& bind_addr,
+                  std::optional<entity_addrvec_t> public_addrs=std::nullopt) = 0;
 
 
-  virtual int bindv(const entity_addrvec_t& addrs);
+  virtual int bindv(const entity_addrvec_t& bind_addrs,
+                    std::optional<entity_addrvec_t> public_addrs=std::nullopt);
 
   /**
    * This function performs a full restart of the Messenger component,
 
   /**
    * This function performs a full restart of the Messenger component,
index f5dd03295e92add48cf3dd88e199c33e9589ce2b..3971e91ffd015c908fadab3ebb3c7e2adb623bd4 100644 (file)
@@ -324,7 +324,7 @@ void AsyncMessenger::ready()
 
   stack->ready();
   if (pending_bind) {
 
   stack->ready();
   if (pending_bind) {
-    int err = bindv(pending_bind_addrs);
+    int err = bindv(pending_bind_addrs, saved_public_addrs);
     if (err) {
       lderr(cct) << __func__ << " postponed bind failed" << dendl;
       ceph_abort();
     if (err) {
       lderr(cct) << __func__ << " postponed bind failed" << dendl;
       ceph_abort();
@@ -357,9 +357,11 @@ int AsyncMessenger::shutdown()
   return 0;
 }
 
   return 0;
 }
 
-int AsyncMessenger::bind(const entity_addr_t &bind_addr)
+int AsyncMessenger::bind(const entity_addr_t &bind_addr,
+                         std::optional<entity_addrvec_t> public_addrs)
 {
 {
-  ldout(cct,10) << __func__ << " " << bind_addr << dendl;
+  ldout(cct, 10) << __func__ << " " << bind_addr
+                 << " public " << public_addrs << dendl;
   // old bind() can take entity_addr_t(). new bindv() can take a
   // 0.0.0.0-like address but needs type and family to be set.
   auto a = bind_addr;
   // old bind() can take entity_addr_t(). new bindv() can take a
   // 0.0.0.0-like address but needs type and family to be set.
   auto a = bind_addr;
@@ -371,10 +373,11 @@ int AsyncMessenger::bind(const entity_addr_t &bind_addr)
       a.set_family(AF_INET);
     }
   }
       a.set_family(AF_INET);
     }
   }
-  return bindv(entity_addrvec_t(a));
+  return bindv(entity_addrvec_t(a), public_addrs);
 }
 
 }
 
-int AsyncMessenger::bindv(const entity_addrvec_t &bind_addrs)
+int AsyncMessenger::bindv(const entity_addrvec_t &bind_addrs,
+                          std::optional<entity_addrvec_t> public_addrs)
 {
   lock.lock();
 
 {
   lock.lock();
 
@@ -384,7 +387,14 @@ int AsyncMessenger::bindv(const entity_addrvec_t &bind_addrs)
     return -1;
   }
 
     return -1;
   }
 
-  ldout(cct,10) << __func__ << " " << bind_addrs << dendl;
+  ldout(cct, 10) << __func__ << " " << bind_addrs
+                 << " public " << public_addrs << dendl;
+  if (public_addrs && bind_addrs != public_addrs) {
+    // for the sake of rebind() and the is-not-ready case let's
+    // store public_addrs. there is no point in that if public
+    // addrs are indifferent from bind_addrs.
+    saved_public_addrs = std::move(public_addrs);
+  }
 
   if (!stack->is_ready()) {
     ldout(cct, 10) << __func__ << " Network Stack is not ready for bind yet - postponed" << dendl;
 
   if (!stack->is_ready()) {
     ldout(cct, 10) << __func__ << " Network Stack is not ready for bind yet - postponed" << dendl;
@@ -491,9 +501,29 @@ void AsyncMessenger::_finish_bind(const entity_addrvec_t& bind_addrs,
   if (get_myaddrs().front().get_port() == 0) {
     set_myaddrs(listen_addrs);
   }
   if (get_myaddrs().front().get_port() == 0) {
     set_myaddrs(listen_addrs);
   }
-  entity_addrvec_t newaddrs = *my_addrs;
-  for (auto& a : newaddrs.v) {
-    a.set_nonce(nonce);
+
+  entity_addrvec_t newaddrs;
+  if (saved_public_addrs) {
+    newaddrs = *saved_public_addrs;
+    for (auto& public_addr : newaddrs.v) {
+      public_addr.set_nonce(nonce);
+      if (public_addr.is_ip() && public_addr.get_port() == 0) {
+       // port is not explicitly set. This is fine as it can be figured
+       // out by msgr. For instance, the low-level `Processor::bind`
+       // scans for free ports in a range controlled by ms_bind_port_min
+       // and ms_bind_port_max.
+        for (const auto& a : my_addrs->v) {
+          if (public_addr.get_type() == a.get_type() && a.is_ip()) {
+             public_addr.set_port(a.get_port());
+          }
+        }
+      }
+    }
+  } else {
+    newaddrs = *my_addrs;
+    for (auto& a : newaddrs.v) {
+      a.set_nonce(nonce);
+    }
   }
   set_myaddrs(newaddrs);
 
   }
   set_myaddrs(newaddrs);
 
@@ -765,17 +795,6 @@ bool AsyncMessenger::set_addr_unknowns(const entity_addrvec_t &addrs)
   return ret;
 }
 
   return ret;
 }
 
-void AsyncMessenger::set_addrs(const entity_addrvec_t &addrs)
-{
-  std::lock_guard l{lock};
-  auto t = addrs;
-  for (auto& a : t.v) {
-    a.set_nonce(nonce);
-  }
-  set_myaddrs(t);
-  _init_local_connection();
-}
-
 void AsyncMessenger::shutdown_connections(bool queue_reset)
 {
   ldout(cct,1) << __func__ << " " << dendl;
 void AsyncMessenger::shutdown_connections(bool queue_reset)
 {
   ldout(cct,1) << __func__ << " " << dendl;
index 17b1f57f527f8f69913aede66dcb4d0e629f150d..0a3227dec5d313d53e8a534ce2ae9f47f56b271e 100644 (file)
@@ -18,6 +18,7 @@
 #define CEPH_ASYNCMESSENGER_H
 
 #include <map>
 #define CEPH_ASYNCMESSENGER_H
 
 #include <map>
+#include <optional>
 
 #include "include/types.h"
 #include "include/xlist.h"
 
 #include "include/types.h"
 #include "include/xlist.h"
@@ -94,7 +95,6 @@ public:
    * @{
    */
   bool set_addr_unknowns(const entity_addrvec_t &addr) override;
    * @{
    */
   bool set_addr_unknowns(const entity_addrvec_t &addr) override;
-  void set_addrs(const entity_addrvec_t &addrs) override;
 
   int get_dispatch_queue_len() override {
     return dispatch_queue.get_queue_len();
 
   int get_dispatch_queue_len() override {
     return dispatch_queue.get_queue_len();
@@ -114,9 +114,11 @@ public:
     cluster_protocol = p;
   }
 
     cluster_protocol = p;
   }
 
-  int bind(const entity_addr_t& bind_addr) override;
+  int bind(const entity_addr_t& bind_addr,
+          std::optional<entity_addrvec_t> public_addrs=std::nullopt) override;
   int rebind(const std::set<int>& avoid_ports) override;
   int rebind(const std::set<int>& avoid_ports) override;
-  int bindv(const entity_addrvec_t& bind_addrs) override;
+  int bindv(const entity_addrvec_t& bind_addrs,
+           std::optional<entity_addrvec_t> public_addrs=std::nullopt) override;
 
   int client_bind(const entity_addr_t& bind_addr) override;
 
 
   int client_bind(const entity_addr_t& bind_addr) override;
 
@@ -230,11 +232,19 @@ private:
   bool need_addr = true;
 
   /**
   bool need_addr = true;
 
   /**
-   * set to bind addresses if bind was called before NetworkStack was ready to
-   * bind
+   * set to bind addresses if bind or bindv were called before NetworkStack
+   * was ready to bind
    */
   entity_addrvec_t pending_bind_addrs;
 
    */
   entity_addrvec_t pending_bind_addrs;
 
+  /**
+   * set to public addresses (those announced by the msgr's protocols).
+   * they are stored to handle the cases when either:
+   *   a) bind or bindv were called before NetworkStack was ready to bind,
+   *   b) rebind is called down the road.
+   */
+  std::optional<entity_addrvec_t> saved_public_addrs;
+
   /**
    * false; set to true if a pending bind exists
    */
   /**
    * false; set to true if a pending bind exists
    */
index 3c7aee7c6fea02a00d2246822cad554adc27e590..c66043ac9f9413410585779eeaf974f7353eab5b 100644 (file)
@@ -39,6 +39,3 @@ target_link_libraries(libneorados PRIVATE
 #   ${BLKID_LIBRARIES} ${CRYPTO_LIBS} ${EXTRALIBS})
 # target_link_libraries(libneorados ${rados_libs})
 # install(TARGETS libneorados DESTINATION ${CMAKE_INSTALL_LIBDIR})
 #   ${BLKID_LIBRARIES} ${CRYPTO_LIBS} ${EXTRALIBS})
 # target_link_libraries(libneorados ${rados_libs})
 # install(TARGETS libneorados DESTINATION ${CMAKE_INSTALL_LIBDIR})
-add_library(neorados_cls_fifo STATIC cls/fifo.cc)
-target_link_libraries(neorados_cls_fifo PRIVATE
-       libneorados ceph-common fmt::fmt)
diff --git a/ceph/src/neorados/cls/fifo.cc b/ceph/src/neorados/cls/fifo.cc
deleted file mode 100644 (file)
index f95ede5..0000000
+++ /dev/null
@@ -1,387 +0,0 @@
-// -*- mode:C++; tab-width:8; c-basic-offset:2; indent-tabs-mode:t -*-
-// vim: ts=8 sw=2 smarttab
-/*
- * Ceph - scalable distributed file system
- *
- * Copyright (C) 2020 Red Hat <contact@redhat.com>
- * Author: Adam C. Emerson
- *
- * This is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License version 2.1, as published by the Free Software
- * Foundation.  See file COPYING.
- *
- */
-
-#include <cstdint>
-#include <numeric>
-#include <optional>
-#include <string_view>
-
-#undef FMT_HEADER_ONLY
-#define FMT_HEADER_ONLY 1
-#include <fmt/format.h>
-
-#include <boost/system/error_code.hpp>
-
-#include "include/neorados/RADOS.hpp"
-
-#include "include/buffer.h"
-
-#include "common/random_string.h"
-
-#include "cls/fifo/cls_fifo_types.h"
-#include "cls/fifo/cls_fifo_ops.h"
-
-#include "fifo.h"
-
-using namespace std;
-
-namespace neorados::cls::fifo {
-namespace bs = boost::system;
-namespace cb = ceph::buffer;
-namespace fifo = rados::cls::fifo;
-
-void create_meta(WriteOp& op, std::string_view id,
-                std::optional<fifo::objv> objv,
-                std::optional<std::string_view> oid_prefix,
-                bool exclusive,
-                std::uint64_t max_part_size,
-                std::uint64_t max_entry_size)
-{
-  fifo::op::create_meta cm;
-
-  cm.id = id;
-  cm.version = objv;
-  cm.oid_prefix = oid_prefix;
-  cm.max_part_size = max_part_size;
-  cm.max_entry_size = max_entry_size;
-  cm.exclusive = exclusive;
-
-  cb::list in;
-  encode(cm, in);
-  op.exec(fifo::op::CLASS, fifo::op::CREATE_META, in);
-}
-
-void get_meta(ReadOp& op, std::optional<fifo::objv> objv,
-             bs::error_code* ec_out, fifo::info* info,
-             std::uint32_t* part_header_size,
-             std::uint32_t* part_entry_overhead)
-{
-  fifo::op::get_meta gm;
-  gm.version = objv;
-  cb::list in;
-  encode(gm, in);
-  op.exec(fifo::op::CLASS, fifo::op::GET_META, in,
-         [ec_out, info, part_header_size,
-          part_entry_overhead](bs::error_code ec, const cb::list& bl) {
-           fifo::op::get_meta_reply reply;
-           if (!ec) try {
-               auto iter = bl.cbegin();
-               decode(reply, iter);
-             } catch (const cb::error& err) {
-               ec = err.code();
-             }
-           if (ec_out) *ec_out = ec;
-           if (info) *info = std::move(reply.info);
-           if (part_header_size) *part_header_size = reply.part_header_size;
-           if (part_entry_overhead)
-               *part_entry_overhead = reply.part_entry_overhead;
-         });
-};
-
-void update_meta(WriteOp& op, const fifo::objv& objv,
-                const fifo::update& update)
-{
-  fifo::op::update_meta um;
-
-  um.version = objv;
-  um.tail_part_num = update.tail_part_num();
-  um.head_part_num = update.head_part_num();
-  um.min_push_part_num = update.min_push_part_num();
-  um.max_push_part_num = update.max_push_part_num();
-  um.journal_entries_add = std::move(update).journal_entries_add();
-  um.journal_entries_rm = std::move(update).journal_entries_rm();
-
-  cb::list in;
-  encode(um, in);
-  op.exec(fifo::op::CLASS, fifo::op::UPDATE_META, in);
-}
-
-void part_init(WriteOp& op, std::string_view tag,
-              fifo::data_params params)
-{
-  fifo::op::init_part ip;
-
-  ip.tag = tag;
-  ip.params = params;
-
-  cb::list in;
-  encode(ip, in);
-  op.exec(fifo::op::CLASS, fifo::op::INIT_PART, in);
-}
-
-void push_part(WriteOp& op, std::string_view tag,
-              std::deque<cb::list> data_bufs,
-              fu2::unique_function<void(bs::error_code, int)> f)
-{
-  fifo::op::push_part pp;
-
-  pp.tag = tag;
-  pp.data_bufs = data_bufs;
-  pp.total_len = 0;
-
-  for (const auto& bl : data_bufs)
-    pp.total_len += bl.length();
-
-  cb::list in;
-  encode(pp, in);
-  op.exec(fifo::op::CLASS, fifo::op::PUSH_PART, in,
-         [f = std::move(f)](bs::error_code ec, int r, const cb::list&) mutable {
-           std::move(f)(ec, r);
-         });
-  op.returnvec();
-}
-
-void trim_part(WriteOp& op,
-              std::optional<std::string_view> tag,
-              std::uint64_t ofs, bool exclusive)
-{
-  fifo::op::trim_part tp;
-
-  tp.tag = tag;
-  tp.ofs = ofs;
-  tp.exclusive = exclusive;
-
-  bufferlist in;
-  encode(tp, in);
-  op.exec(fifo::op::CLASS, fifo::op::TRIM_PART, in);
-}
-
-void list_part(ReadOp& op,
-              std::optional<string_view> tag,
-              std::uint64_t ofs,
-              std::uint64_t max_entries,
-              bs::error_code* ec_out,
-              std::vector<fifo::part_list_entry>* entries,
-              bool* more,
-              bool* full_part,
-              std::string* ptag)
-{
-  fifo::op::list_part lp;
-
-  lp.tag = tag;
-  lp.ofs = ofs;
-  lp.max_entries = max_entries;
-
-  bufferlist in;
-  encode(lp, in);
-  op.exec(fifo::op::CLASS, fifo::op::LIST_PART, in,
-         [entries, more, full_part, ptag, ec_out](bs::error_code ec,
-                                                  const cb::list& bl) {
-           if (ec) {
-             if (ec_out) *ec_out = ec;
-             return;
-           }
-
-           fifo::op::list_part_reply reply;
-           auto iter = bl.cbegin();
-           try {
-             decode(reply, iter);
-           } catch (const cb::error& err) {
-             if (ec_out) *ec_out = ec;
-             return;
-           }
-
-           if (entries) *entries = std::move(reply.entries);
-           if (more) *more = reply.more;
-           if (full_part) *full_part = reply.full_part;
-           if (ptag) *ptag = reply.tag;
-         });
-}
-
-void get_part_info(ReadOp& op,
-                  bs::error_code* out_ec,
-                  fifo::part_header* header)
-{
-  fifo::op::get_part_info gpi;
-
-  bufferlist in;
-  encode(gpi, in);
-  op.exec(fifo::op::CLASS, fifo::op::GET_PART_INFO, in,
-         [out_ec, header](bs::error_code ec, const cb::list& bl) {
-           if (ec) {
-             if (out_ec) *out_ec = ec;
-           }
-           fifo::op::get_part_info_reply reply;
-           auto iter = bl.cbegin();
-           try {
-             decode(reply, iter);
-           } catch (const cb::error& err) {
-             if (out_ec) *out_ec = ec;
-             return;
-           }
-
-           if (header) *header = std::move(reply.header);
-         });
-}
-
-std::optional<marker> FIFO::to_marker(std::string_view s) {
-  marker m;
-  if (s.empty()) {
-    m.num = info.tail_part_num;
-    m.ofs = 0;
-    return m;
-  }
-
-  auto pos = s.find(':');
-  if (pos == string::npos) {
-    return std::nullopt;
-  }
-
-  auto num = s.substr(0, pos);
-  auto ofs = s.substr(pos + 1);
-
-  auto n = ceph::parse<decltype(m.num)>(num);
-  if (!n) {
-    return std::nullopt;
-  }
-  m.num = *n;
-  auto o = ceph::parse<decltype(m.ofs)>(ofs);
-  if (!o) {
-    return std::nullopt;
-  }
-  m.ofs = *o;
-  return m;
-}
-
-bs::error_code FIFO::apply_update(fifo::info* info,
-                                 const fifo::objv& objv,
-                                 const fifo::update& update) {
-  std::unique_lock l(m);
-  auto err = info->apply_update(update);
-  if (objv != info->version) {
-    ldout(r->cct(), 0) << __func__ << "(): Raced locally!" << dendl;
-    return errc::raced;
-  }
-  if (err) {
-    ldout(r->cct(), 0) << __func__ << "(): ERROR: " << err << dendl;
-    return errc::update_failed;
-  }
-
-  ++info->version.ver;
-
-  return {};
-}
-
-std::string FIFO::generate_tag() const
-{
-  static constexpr auto HEADER_TAG_SIZE = 16;
-  return gen_rand_alphanumeric_plain(r->cct(), HEADER_TAG_SIZE);
-}
-
-#pragma GCC diagnostic push
-#pragma GCC diagnostic ignored "-Wnon-virtual-dtor"
-#pragma clang diagnostic push
-#pragma clang diagnostic ignored "-Wnon-virtual-dtor"
-class error_category : public ceph::converting_category {
-public:
-  error_category(){}
-  const char* name() const noexcept override;
-  const char* message(int ev, char*, std::size_t) const noexcept override;
-  std::string message(int ev) const override;
-  bs::error_condition default_error_condition(int ev) const noexcept
-    override;
-  bool equivalent(int ev, const bs::error_condition& c) const
-    noexcept override;
-  using ceph::converting_category::equivalent;
-  int from_code(int ev) const noexcept override;
-};
-#pragma GCC diagnostic pop
-#pragma clang diagnostic pop
-
-const char* error_category::name() const noexcept {
-  return "FIFO";
-}
-
-const char* error_category::message(int ev, char*, std::size_t) const noexcept {
-  if (ev == 0)
-    return "No error";
-
-  switch (static_cast<errc>(ev)) {
-  case errc::raced:
-    return "Retry-race count exceeded";
-
-  case errc::inconsistency:
-    return "Inconsistent result! New head before old head";
-
-  case errc::entry_too_large:
-    return "Pushed entry too large";
-
-  case errc::invalid_marker:
-    return "Invalid marker string";
-
-  case errc::update_failed:
-    return "Update failed";
-  }
-
-  return "Unknown error";
-}
-
-std::string error_category::message(int ev) const {
-  return message(ev, nullptr, 0);
-}
-
-bs::error_condition
-error_category::default_error_condition(int ev) const noexcept {
-  switch (static_cast<errc>(ev)) {
-  case errc::raced:
-    return bs::errc::operation_canceled;
-
-  case errc::inconsistency:
-    return bs::errc::io_error;
-
-  case errc::entry_too_large:
-    return bs::errc::value_too_large;
-
-  case errc::invalid_marker:
-    return bs::errc::invalid_argument;
-
-  case errc::update_failed:
-    return bs::errc::invalid_argument;
-  }
-
-  return { ev, *this };
-}
-
-bool error_category::equivalent(int ev, const bs::error_condition& c) const noexcept {
-  return default_error_condition(ev) == c;
-}
-
-int error_category::from_code(int ev) const noexcept {
-  switch (static_cast<errc>(ev)) {
-  case errc::raced:
-    return -ECANCELED;
-
-  case errc::inconsistency:
-    return -EIO;
-
-  case errc::entry_too_large:
-    return -E2BIG;
-
-  case errc::invalid_marker:
-    return -EINVAL;
-
-  case errc::update_failed:
-    return -EINVAL;
-
-  }
-  return -EDOM;
-}
-
-const bs::error_category& error_category() noexcept {
-  static const class error_category c;
-  return c;
-}
-
-}
diff --git a/ceph/src/neorados/cls/fifo.h b/ceph/src/neorados/cls/fifo.h
deleted file mode 100644 (file)
index 4c7ba47..0000000
+++ /dev/null
@@ -1,1754 +0,0 @@
-// -*- mode:C++; tab-width:8; c-basic-offset:2; indent-tabs-mode:t -*-
-// vim: ts=8 sw=2 smarttab
-/*
- * Ceph - scalable distributed file system
- *
- * Copyright (C) 2020 Red Hat <contact@redhat.com>
- * Author: Adam C. Emerson
- *
- * This is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License version 2.1, as published by the Free Software
- * Foundation.  See file COPYING.
- *
- */
-
-#ifndef CEPH_NEORADOS_CLS_FIFIO_H
-#define CEPH_NEORADOS_CLS_FIFIO_H
-
-#include <cstdint>
-#include <deque>
-#include <map>
-#include <memory>
-#include <mutex>
-#include <optional>
-#include <string_view>
-#include <vector>
-
-#include <boost/asio.hpp>
-#include <boost/system/error_code.hpp>
-
-#undef FMT_HEADER_ONLY
-#define FMT_HEADER_ONLY 1
-#include <fmt/format.h>
-
-#include "include/neorados/RADOS.hpp"
-#include "include/buffer.h"
-
-#include "common/allocate_unique.h"
-#include "common/async/bind_handler.h"
-#include "common/async/bind_like.h"
-#include "common/async/completion.h"
-#include "common/async/forward_handler.h"
-
-#include "common/dout.h"
-
-#include "cls/fifo/cls_fifo_types.h"
-#include "cls/fifo/cls_fifo_ops.h"
-
-namespace neorados::cls::fifo {
-namespace ba = boost::asio;
-namespace bs = boost::system;
-namespace ca = ceph::async;
-namespace cb = ceph::buffer;
-namespace fifo = rados::cls::fifo;
-
-inline constexpr auto dout_subsys = ceph_subsys_rados;
-inline constexpr std::uint64_t default_max_part_size = 4 * 1024 * 1024;
-inline constexpr std::uint64_t default_max_entry_size = 32 * 1024;
-inline constexpr auto MAX_RACE_RETRIES = 10;
-
-
-const boost::system::error_category& error_category() noexcept;
-
-enum class errc {
-  raced = 1,
-  inconsistency,
-  entry_too_large,
-  invalid_marker,
-  update_failed
-};
-}
-
-namespace boost::system {
-template<>
-struct is_error_code_enum<::neorados::cls::fifo::errc> {
-  static const bool value = true;
-};
-template<>
-struct is_error_condition_enum<::neorados::cls::fifo::errc> {
-  static const bool value = false;
-};
-}
-
-namespace neorados::cls::fifo {
-//  explicit conversion:
-inline bs::error_code make_error_code(errc e) noexcept {
-  return { static_cast<int>(e), error_category() };
-}
-
-inline bs::error_code make_error_category(errc e) noexcept {
-  return { static_cast<int>(e), error_category() };
-}
-
-void create_meta(WriteOp& op, std::string_view id,
-                std::optional<fifo::objv> objv,
-                std::optional<std::string_view> oid_prefix,
-                bool exclusive = false,
-                std::uint64_t max_part_size = default_max_part_size,
-                std::uint64_t max_entry_size = default_max_entry_size);
-void get_meta(ReadOp& op, std::optional<fifo::objv> objv,
-             bs::error_code* ec_out, fifo::info* info,
-             std::uint32_t* part_header_size,
-             std::uint32_t* part_entry_overhead);
-
-void update_meta(WriteOp& op, const fifo::objv& objv,
-                const fifo::update& desc);
-
-void part_init(WriteOp& op, std::string_view tag,
-              fifo::data_params params);
-
-void push_part(WriteOp& op, std::string_view tag,
-              std::deque<cb::list> data_bufs,
-              fu2::unique_function<void(bs::error_code, int)>);
-void trim_part(WriteOp& op, std::optional<std::string_view> tag,
-              std::uint64_t ofs,
-              bool exclusive);
-void list_part(ReadOp& op,
-              std::optional<std::string_view> tag,
-              std::uint64_t ofs,
-              std::uint64_t max_entries,
-              bs::error_code* ec_out,
-              std::vector<fifo::part_list_entry>* entries,
-              bool* more,
-              bool* full_part,
-              std::string* ptag);
-void get_part_info(ReadOp& op,
-                  bs::error_code* out_ec,
-                  fifo::part_header* header);
-
-struct marker {
-  std::int64_t num = 0;
-  std::uint64_t ofs = 0;
-
-  marker() = default;
-  marker(std::int64_t num, std::uint64_t ofs) : num(num), ofs(ofs) {}
-  static marker max() {
-    return { std::numeric_limits<decltype(num)>::max(),
-            std::numeric_limits<decltype(ofs)>::max() };
-  }
-
-  std::string to_string() {
-    return fmt::format("{:0>20}:{:0>20}", num, ofs);
-  }
-};
-
-struct list_entry {
-  cb::list data;
-  std::string marker;
-  ceph::real_time mtime;
-};
-
-using part_info = fifo::part_header;
-
-namespace detail {
-template<typename Handler>
-class JournalProcessor;
-}
-
-/// Completions, Handlers, and CompletionTokens
-/// ===========================================
-///
-/// This class is based on Boost.Asio. For information, see
-/// https://www.boost.org/doc/libs/1_74_0/doc/html/boost_asio.html
-///
-/// As summary, Asio's design is that of functions taking completion
-/// handlers. Every handler has a signature, like
-/// (boost::system::error_code, std::string). The completion handler
-/// receives the result of the function, and the signature is the type
-/// of that result.
-///
-/// The completion handler is specified with a CompletionToken. The
-/// CompletionToken is any type that has a specialization of
-/// async_complete and async_result. See
-/// https://www.boost.org/doc/libs/1_74_0/doc/html/boost_asio/reference/async_completion.html
-/// and https://www.boost.org/doc/libs/1_74_0/doc/html/boost_asio/reference/async_result.html
-///
-/// The return type of a function taking a CompletionToken is
-/// async_result<CompletionToken, Signature>::return_type.
-///
-/// Functions
-/// ---------
-///
-/// The default implementations treat whatever value is described as a
-/// function, whose parameters correspond to the signature, and calls
-/// it upon completion.
-///
-/// EXAMPLE:
-/// Let f be an asynchronous function whose signature is (bs::error_code, int)
-/// Let g be an asynchronous function whose signature is
-/// (bs::error_code, int, std::string).
-///
-///
-///    f([](bs::error_code ec, int i) { ... });
-///    g([](bs::error_code ec, int i, std::string s) { ... });
-///
-/// Will schedule asynchronous tasks, and the provided lambdas will be
-/// called on completion. In this case, f and g return void.
-///
-/// There are other specializations. Commonly used ones are.
-///
-/// Futures
-/// -------
-///
-/// A CompletionToken of boost::asio::use_future will complete with a
-/// promise whose type matches (minus any initial error_code) the
-/// function's signature. The corresponding future is returned. If the
-/// error_code of the result is non-zero, the future is set with an
-/// exception of type boost::asio::system_error.
-///
-/// See https://www.boost.org/doc/libs/1_74_0/doc/html/boost_asio/reference/use_future_t.html
-///
-/// EXAMPLE:
-///
-/// std::future<int> = f(ba::use_future);
-/// std::future<std::tuple<int, std::string> = g(ba::use_future).
-///
-/// Coroutines
-/// ----------
-///
-/// A CompletionToken of type spawn::yield_context suspends execution
-/// of the current coroutine until completion of the operation. See
-/// src/spawn/README.md
-/// https://www.boost.org/doc/libs/1_74_0/doc/html/boost_asio/reference/spawn.html and
-/// https://www.boost.org/doc/libs/1_74_0/doc/html/boost_asio/reference/yield_context.html
-///
-/// Operations given this CompletionToken return their results, modulo
-/// any leading error_code. A non-zero error code will be thrown, by
-/// default, but may be bound to a variable instead with the overload
-/// of the array-subscript oeprator.
-///
-/// EXAMPLE:
-/// // Within a function with a yield_context parameter named y
-///
-/// try {
-///    int i = f(y);
-/// } catch (const bs::system_error& ec) { ... }
-///
-/// bs::error_code ec;
-/// auto [i, s] = g(y[ec]);
-///
-/// Blocking calls
-/// --------------
-///
-/// ceph::async::use_blocked, defined in src/common/async/blocked_completion.h
-/// Suspends the current thread of execution, returning the results of
-/// the operation on resumption. Its calling convention is analogous to
-/// that of yield_context.
-///
-/// EXAMPLE:
-/// try {
-///    int i = f(ca::use_blocked);
-/// } catch (const bs::system_error& e) { ... }
-///
-/// bs::error_code ec;
-/// auto [i, s] = g(ca::use_blocked[ec]);
-///
-/// librados Completions
-/// --------------------
-///
-/// If src/common/async/librados_completion.h is included in the
-/// current translation unit, then librados::AioCompletion* may be used
-/// as a CompletionToken. This is only permitted when the completion
-/// signature is either bs::system_error or void. The return type of
-/// functions provided a CompletionToken of AioCompletion* is void. If
-/// the signature includes an error code and the error code is set,
-/// then the error is translated to an int which is set as the result
-/// of the AioCompletion.
-///
-/// EXAMPLE:
-/// // Assume an asynchronous function h whose signature is bs::error_code.
-///
-/// AioCompletion* c = Rados::aio_create_completion();
-/// h(c);
-/// int r = c.get_return_value();
-///
-/// See also src/test/cls_fifo/bench_cls_fifo.cc for a full, simple
-/// example of a program using this class with coroutines.
-///
-///
-/// Markers
-/// =======
-///
-/// Markers represent a position within the FIFO. Internally, they are
-/// part/offset pairs. Externally, they are ordered but otherwise
-/// opaque strings. Markers that compare lower denote positions closer
-/// to the tail.
-///
-/// A marker is returned with every entry from a list() operation. They
-/// may be supplied to a list operation to resume from a given
-/// position, and must be supplied to trim give the position to which
-/// to trim.
-
-class FIFO {
-public:
-
-  FIFO(const FIFO&) = delete;
-  FIFO& operator =(const FIFO&) = delete;
-  FIFO(FIFO&&) = delete;
-  FIFO& operator =(FIFO&&) = delete;
-
-  /// Open an existing FIFO.
-  /// Signature: (bs::error_code ec, std::unique_ptr<FIFO> f)
-  template<typename CT>
-  static auto open(RADOS& r, //< RADOS handle
-                  const IOContext& ioc, //< Context for pool, namespace, etc.
-                  Object oid, //< OID for the 'main' object of the FIFO
-                  CT&& ct, //< CompletionToken
-                  /// Fail if is not this version
-                  std::optional<fifo::objv> objv = std::nullopt,
-                  /// Default executor. By default use the one
-                  /// associated with the RADOS handle.
-                  std::optional<ba::executor> executor = std::nullopt) {
-    ba::async_completion<CT, void(bs::error_code,
-                                 std::unique_ptr<FIFO>)> init(ct);
-    auto e = ba::get_associated_executor(init.completion_handler,
-                                        executor.value_or(r.get_executor()));
-    auto a = ba::get_associated_allocator(init.completion_handler);
-    _read_meta_(
-      &r, oid, ioc, objv,
-      ca::bind_ea(
-       e, a,
-       [&r, ioc, oid, executor, handler = std::move(init.completion_handler)]
-       (bs::error_code ec, fifo::info info,
-        std::uint32_t size, std::uint32_t over) mutable {
-         std::unique_ptr<FIFO> f(
-           new FIFO(r, ioc, oid, executor.value_or(r.get_executor())));
-         f->info = info;
-         f->part_header_size = size;
-         f->part_entry_overhead = over;
-         // If there are journal entries, process them, in case
-         // someone crashed mid-transaction.
-         if (!ec && !info.journal.empty()) {
-           auto e = ba::get_associated_executor(handler, f->get_executor());
-           auto a = ba::get_associated_allocator(handler);
-           auto g = f.get();
-           g->_process_journal(
-             ca::bind_ea(
-               e, a,
-               [f = std::move(f),
-                handler = std::move(handler)](bs::error_code ec) mutable {
-                 std::move(handler)(ec, std::move(f));
-               }));
-           return;
-         }
-         std::move(handler)(ec, std::move(f));
-         return;
-       }));
-    return init.result.get();
-  }
-
-  /// Open an existing or create a new FIFO.
-  /// Signature: (bs::error_code ec, std::unique_ptr<FIFO> f)
-  template<typename CT>
-  static auto create(RADOS& r, /// RADOS handle
-                    const IOContext& ioc, /// Context for pool, namespace, etc.
-                    Object oid, /// OID for the 'main' object of the FIFO
-                    CT&& ct, /// CompletionToken
-                    /// Fail if FIFO exists and is not this version
-                    std::optional<fifo::objv> objv = std::nullopt,
-                    /// Custom prefix for parts
-                    std::optional<std::string_view> oid_prefix = std::nullopt,
-                    /// Fail if FIFO already exists
-                    bool exclusive = false,
-                    /// Size at which a part is considered full
-                    std::uint64_t max_part_size = default_max_part_size,
-                    /// Maximum size of any entry
-                    std::uint64_t max_entry_size = default_max_entry_size,
-                    /// Default executor. By default use the one
-                    /// associated with the RADOS handle.
-                    std::optional<ba::executor> executor = std::nullopt) {
-    ba::async_completion<CT, void(bs::error_code,
-                                 std::unique_ptr<FIFO>)> init(ct);
-    WriteOp op;
-    create_meta(op, oid, objv, oid_prefix, exclusive, max_part_size,
-               max_entry_size);
-    auto e = ba::get_associated_executor(init.completion_handler,
-                                        executor.value_or(r.get_executor()));
-    auto a = ba::get_associated_allocator(init.completion_handler);
-    r.execute(
-      oid, ioc, std::move(op),
-      ca::bind_ea(
-       e, a,
-       [objv, &r, ioc, oid, executor, handler = std::move(init.completion_handler)]
-       (bs::error_code ec) mutable {
-         if (ec) {
-           std::move(handler)(ec, nullptr);
-           return;
-         }
-         auto e = ba::get_associated_executor(
-           handler, executor.value_or(r.get_executor()));
-         auto a = ba::get_associated_allocator(handler);
-         FIFO::_read_meta_(
-           &r, oid, ioc, objv,
-           ca::bind_ea(
-             e, a,
-             [&r, ioc, executor, oid, handler = std::move(handler)]
-             (bs::error_code ec, fifo::info info,
-              std::uint32_t size, std::uint32_t over) mutable {
-               std::unique_ptr<FIFO> f(
-                 new FIFO(r, ioc, oid, executor.value_or(r.get_executor())));
-               f->info = info;
-               f->part_header_size = size;
-               f->part_entry_overhead = over;
-               if (!ec && !info.journal.empty()) {
-                 auto e = ba::get_associated_executor(handler,
-                                                      f->get_executor());
-                 auto a = ba::get_associated_allocator(handler);
-                 auto g = f.get();
-                 g->_process_journal(
-                   ca::bind_ea(
-                     e, a,
-                     [f = std::move(f), handler = std::move(handler)]
-                     (bs::error_code ec) mutable {
-                       std::move(handler)(ec, std::move(f));
-                     }));
-                 return;
-               }
-               std::move(handler)(ec, std::move(f));
-             }));
-           }));
-    return init.result.get();
-  }
-
-  /// Force a re-read of FIFO metadata.
-  /// Signature: (bs::error_code ec)
-  template<typename CT>
-  auto read_meta(CT&& ct, //< CompletionToken
-                /// Fail if FIFO not at this version
-                std::optional<fifo::objv> objv = std::nullopt) {
-    std::unique_lock l(m);
-    auto version = info.version;
-    l.unlock();
-    ba::async_completion<CT, void(bs::error_code)> init(ct);
-    auto e = ba::get_associated_executor(init.completion_handler,
-                                        get_executor());
-    auto a = ba::get_associated_allocator(init.completion_handler);
-    _read_meta_(
-      r, oid, ioc, objv,
-      ca::bind_ea(
-       e, a,
-       [this, version, handler = std::move(init.completion_handler)]
-       (bs::error_code ec, fifo::info newinfo,
-        std::uint32_t size, std::uint32_t over) mutable {
-         std::unique_lock l(m);
-         if (version == info.version) {
-           info = newinfo;
-           part_header_size = size;
-           part_entry_overhead = over;
-         }
-         l.unlock();
-         return std::move(handler)(ec);
-       }));
-    return init.result.get();
-  }
-
-  /// Return a reference to currently known metadata
-  const fifo::info& meta() const {
-    return info;
-  }
-
-  /// Return header size and entry overhead of partitions.
-  std::pair<std::uint32_t, std::uint32_t> get_part_layout_info() {
-    return {part_header_size, part_entry_overhead};
-  }
-
-  /// Push a single entry to the FIFO.
-  /// Signature: (bs::error_code)
-  template<typename CT>
-  auto push(const cb::list& bl, //< Bufferlist holding entry to push
-           CT&& ct //< CompletionToken
-    ) {
-    return push(std::vector{ bl }, std::forward<CT>(ct));
-  }
-
-  /// Push a many entries to the FIFO.
-  /// Signature: (bs::error_code)
-  template<typename CT>
-  auto push(const std::vector<cb::list>& data_bufs, //< Entries to push
-           CT&& ct //< CompletionToken
-    ) {
-    ba::async_completion<CT, void(bs::error_code)> init(ct);
-    std::unique_lock l(m);
-    auto max_entry_size = info.params.max_entry_size;
-    auto need_new_head = info.need_new_head();
-    l.unlock();
-    auto e = ba::get_associated_executor(init.completion_handler,
-                                        get_executor());
-    auto a = ba::get_associated_allocator(init.completion_handler);
-    if (data_bufs.empty() ) {
-      // Can't fail if you don't try.
-      e.post(ca::bind_handler(std::move(init.completion_handler),
-                                 bs::error_code{}), a);
-      return init.result.get();
-    }
-
-    // Validate sizes
-    for (const auto& bl : data_bufs) {
-      if (bl.length() > max_entry_size) {
-       ldout(r->cct(), 10) << __func__ << "(): entry too large: "
-                           << bl.length() << " > "
-                           << info.params.max_entry_size << dendl;
-       e.post(ca::bind_handler(std::move(init.completion_handler),
-                                   errc::entry_too_large), a);
-       return init.result.get();
-      }
-    }
-
-    auto p = ca::bind_ea(e, a,
-                        Pusher(this, {data_bufs.begin(), data_bufs.end()},
-                                 {}, 0, std::move(init.completion_handler)));
-
-    if (need_new_head) {
-      _prepare_new_head(std::move(p));
-    } else {
-      e.dispatch(std::move(p), a);
-    }
-    return init.result.get();
-  }
-
-  /// List the entries in a FIFO
-  /// Signature(bs::error_code ec, bs::vector<list_entry> entries, bool more)
-  ///
-  /// More is true if entries beyond the last exist.
-  /// The list entries are of the form:
-  /// data - Contents of the entry
-  /// marker - String representing the position of this entry within the FIFO.
-  /// mtime - Time (on the OSD) at which the entry was pushed.
-  template<typename CT>
-  auto list(int max_entries, //< Maximum number of entries to fetch
-           /// Optionally, a marker indicating the position after
-           /// which to begin listing. If null, begin at the tail.
-           std::optional<std::string_view> markstr,
-           CT&& ct //< CompletionToken
-    ) {
-    ba::async_completion<CT, void(bs::error_code,
-                                 std::vector<list_entry>, bool)> init(ct);
-    std::unique_lock l(m);
-    std::int64_t part_num = info.tail_part_num;
-    l.unlock();
-    std::uint64_t ofs = 0;
-    auto a = ba::get_associated_allocator(init.completion_handler);
-    auto e = ba::get_associated_executor(init.completion_handler);
-
-    if (markstr) {
-      auto marker = to_marker(*markstr);
-      if (!marker) {
-       ldout(r->cct(), 0) << __func__
-                          << "(): failed to parse marker (" << *markstr
-                          << ")" << dendl;
-       e.post(ca::bind_handler(std::move(init.completion_handler),
-                               errc::invalid_marker,
-                               std::vector<list_entry>{}, false), a);
-       return init.result.get();
-      }
-      part_num = marker->num;
-      ofs = marker->ofs;
-    }
-
-    using handler_type = decltype(init.completion_handler);
-    auto ls = ceph::allocate_unique<Lister<handler_type>>(
-      a, this, part_num, ofs, max_entries,
-      std::move(init.completion_handler));
-    ls.release()->list();
-    return init.result.get();
-  }
-
-  /// Trim entries from the tail to the given position
-  /// Signature: (bs::error_code)
-  template<typename CT>
-  auto trim(std::string_view markstr, //< Position to which to trim, inclusive
-           bool exclusive, //< If true, trim markers up to but NOT INCLUDING
-                           //< markstr, otherwise trim markstr as well.
-           CT&& ct //< CompletionToken
-    ) {
-    auto m = to_marker(markstr);
-    ba::async_completion<CT, void(bs::error_code)> init(ct);
-    auto a = ba::get_associated_allocator(init.completion_handler);
-    auto e = ba::get_associated_executor(init.completion_handler);
-    if (!m) {
-      ldout(r->cct(), 0) << __func__ << "(): failed to parse marker: marker="
-                        << markstr << dendl;
-      e.post(ca::bind_handler(std::move(init.completion_handler),
-                             errc::invalid_marker), a);
-      return init.result.get();
-    } else {
-      using handler_type = decltype(init.completion_handler);
-      auto t = ceph::allocate_unique<Trimmer<handler_type>>(
-       a, this, m->num, m->ofs, exclusive, std::move(init.completion_handler));
-      t.release()->trim();
-    }
-    return init.result.get();
-  }
-
-  /// Get information about a specific partition
-  /// Signature: (bs::error_code, part_info)
-  ///
-  /// part_info has the following entries
-  /// tag - A random string identifying this partition. Used internally
-  ///       as a sanity check to make sure operations haven't been misdirected
-  /// params - Data parameters, identical for every partition within a
-  ///          FIFO and the same as what is returned from get_part_layout()
-  /// magic - A random magic number, used internally as a prefix to
-  ///         every entry stored on the OSD to ensure sync
-  /// min_ofs - Offset of the first entry
-  /// max_ofs - Offset of the highest entry
-  /// min_index - Minimum entry index
-  /// max_index - Maximum entry index
-  /// max_time - Time of the latest push
-  ///
-  /// The difference between ofs and index is that ofs is a byte
-  /// offset. Index is a count. Nothing really uses indices, but
-  /// they're tracked and sanity-checked as an invariant on the OSD.
-  ///
-  /// max_ofs and max_time are the two that have been used externally
-  /// so far.
-  template<typename CT>
-  auto get_part_info(int64_t part_num, // The number of the partition
-                    CT&& ct // CompletionToken
-    ) {
-
-    ba::async_completion<CT, void(bs::error_code, part_info)> init(ct);
-    fifo::op::get_part_info gpi;
-    cb::list in;
-    encode(gpi, in);
-    ReadOp op;
-    auto e = ba::get_associated_executor(init.completion_handler,
-                                        get_executor());
-    auto a = ba::get_associated_allocator(init.completion_handler);
-    auto reply = ceph::allocate_unique<
-      ExecDecodeCB<fifo::op::get_part_info_reply>>(a);
-
-    op.exec(fifo::op::CLASS, fifo::op::GET_PART_INFO, in,
-           std::ref(*reply));
-    std::unique_lock l(m);
-    auto part_oid = info.part_oid(part_num);
-    l.unlock();
-    r->execute(part_oid, ioc, std::move(op), nullptr,
-              ca::bind_ea(e, a,
-                          PartInfoGetter(std::move(init.completion_handler),
-                                         std::move(reply))));
-    return init.result.get();
-  }
-
-  using executor_type = ba::executor;
-
-  /// Return the default executor, as specified at creation.
-  ba::executor get_executor() const {
-    return executor;
-  }
-
-private:
-  template<typename Handler>
-  friend class detail::JournalProcessor;
-  RADOS* const r;
-  const IOContext ioc;
-  const Object oid;
-  std::mutex m;
-
-  fifo::info info;
-
-  std::uint32_t part_header_size = 0xdeadbeef;
-  std::uint32_t part_entry_overhead = 0xdeadbeef;
-
-  ba::executor executor;
-
-  std::optional<marker> to_marker(std::string_view s);
-
-  template<typename Handler, typename T>
-  static void assoc_delete(const Handler& handler, T* t) {
-    typename std::allocator_traits<typename ba::associated_allocator<Handler>::type>
-      ::template rebind_alloc<T> a(
-       ba::get_associated_allocator(handler));
-    a.destroy(t);
-    a.deallocate(t, 1);
-  }
-
-  FIFO(RADOS& r,
-       IOContext ioc,
-       Object oid,
-       ba::executor executor)
-    : r(&r), ioc(std::move(ioc)), oid(oid), executor(executor) {}
-
-  std::string generate_tag() const;
-
-  template <typename T>
-  struct ExecDecodeCB {
-    bs::error_code ec;
-    T result;
-    void operator()(bs::error_code e, const cb::list& r) {
-      if (e) {
-        ec = e;
-        return;
-      }
-      try {
-        auto p = r.begin();
-        using ceph::decode;
-        decode(result, p);
-      } catch (const cb::error& err) {
-        ec = err.code();
-      }
-    }
-  };
-
-  template<typename Handler>
-  class MetaReader {
-    Handler handler;
-    using allocator_type = boost::asio::associated_allocator_t<Handler>;
-    using decoder_type = ExecDecodeCB<fifo::op::get_meta_reply>;
-    using decoder_ptr = ceph::allocated_unique_ptr<decoder_type, allocator_type>;
-    decoder_ptr decoder;
-  public:
-    MetaReader(Handler&& handler, decoder_ptr&& decoder)
-      : handler(std::move(handler)), decoder(std::move(decoder)) {}
-
-    void operator ()(bs::error_code ec) {
-      if (!ec) {
-        ec = decoder->ec;
-      }
-      auto reply = std::move(decoder->result);
-      decoder.reset(); // free handler-allocated memory before dispatching
-
-      std::move(handler)(ec, std::move(reply.info),
-                        std::move(reply.part_header_size),
-                        std::move(reply.part_entry_overhead));
-    }
-  };
-
-  // Renamed to get around a compiler bug in Bionic that kept
-  // complaining we weren't capturing 'this' to make a static function call.
-  template<typename Handler>
-  static void _read_meta_(RADOS* r, const Object& oid, const IOContext& ioc,
-                         std::optional<fifo::objv> objv,
-                         Handler&& handler, /* error_code, info, uint64,
-                                               uint64 */
-                         std::optional<ba::executor> executor = std::nullopt){
-    fifo::op::get_meta gm;
-
-    gm.version = objv;
-
-    cb::list in;
-    encode(gm, in);
-    ReadOp op;
-
-    auto a = ba::get_associated_allocator(handler);
-    auto reply =
-      ceph::allocate_unique<ExecDecodeCB<fifo::op::get_meta_reply>>(a);
-
-    auto e = ba::get_associated_executor(handler);
-    op.exec(fifo::op::CLASS, fifo::op::GET_META, in, std::ref(*reply));
-    r->execute(oid, ioc, std::move(op), nullptr,
-              ca::bind_ea(e, a, MetaReader(std::move(handler),
-                                           std::move(reply))));
-  };
-
-  template<typename Handler>
-  void _read_meta(Handler&& handler /* error_code */) {
-    auto e = ba::get_associated_executor(handler, get_executor());
-    auto a = ba::get_associated_allocator(handler);
-    _read_meta_(r, oid, ioc,
-               std::nullopt,
-               ca::bind_ea(
-                 e, a,
-                 [this,
-                  handler = std::move(handler)](bs::error_code ec,
-                                                fifo::info&& info,
-                                                std::uint64_t phs,
-                                                std::uint64_t peo) mutable {
-                   std::unique_lock l(m);
-                   if (ec) {
-                     l.unlock();
-                     std::move(handler)(ec);
-                     return;
-                   }
-                   // We have a newer version already!
-                   if (!info.version.same_or_later(this->info.version)) {
-                     l.unlock();
-                     std::move(handler)(bs::error_code{});
-                     return;
-                   }
-                   this->info = std::move(info);
-                   part_header_size = phs;
-                   part_entry_overhead = peo;
-                   l.unlock();
-                   std::move(handler)(bs::error_code{});
-                 }), get_executor());
-  }
-
-  bs::error_code apply_update(fifo::info* info,
-                             const fifo::objv& objv,
-                             const fifo::update& update);
-
-
-  template<typename Handler>
-  void _update_meta(const fifo::update& update,
-                   fifo::objv version,
-                   Handler&& handler /* error_code, bool */) {
-    WriteOp op;
-
-    cls::fifo::update_meta(op, info.version, update);
-
-    auto a = ba::get_associated_allocator(handler);
-    auto e = ba::get_associated_executor(handler, get_executor());
-
-    r->execute(
-      oid, ioc, std::move(op),
-      ca::bind_ea(
-       e, a,
-       [this, e, a, version, update,
-        handler = std::move(handler)](bs::error_code ec) mutable {
-         if (ec && ec != bs::errc::operation_canceled) {
-           std::move(handler)(ec, bool{});
-           return;
-         }
-
-         auto canceled = (ec == bs::errc::operation_canceled);
-
-         if (!canceled) {
-           ec = apply_update(&info,
-                             version,
-                             update);
-           if (ec) {
-             canceled = true;
-           }
-         }
-
-         if (canceled) {
-           _read_meta(
-             ca::bind_ea(
-               e, a,
-               [handler = std::move(handler)](bs::error_code ec) mutable {
-                 std::move(handler)(ec, ec ? false : true);
-               }));
-           return;
-         }
-         std::move(handler)(ec, false);
-         return;
-       }));
-  }
-
-  template<typename Handler>
-  auto _process_journal(Handler&& handler /* error_code */) {
-    auto a = ba::get_associated_allocator(std::ref(handler));
-    auto j = ceph::allocate_unique<detail::JournalProcessor<Handler>>(
-      a, this, std::move(handler));
-    auto p = j.release();
-    p->process();
-  }
-
-  template<typename Handler>
-  class NewPartPreparer {
-    FIFO* f;
-    Handler handler;
-    std::vector<fifo::journal_entry> jentries;
-    int i;
-    std::int64_t new_head_part_num;
-
-  public:
-
-    void operator ()(bs::error_code ec, bool canceled) {
-      if (ec) {
-       std::move(handler)(ec);
-       return;
-      }
-
-      if (canceled) {
-       std::unique_lock l(f->m);
-       auto iter = f->info.journal.find(jentries.front().part_num);
-       auto max_push_part_num = f->info.max_push_part_num;
-       auto head_part_num = f->info.head_part_num;
-       auto version = f->info.version;
-       auto found = (iter != f->info.journal.end());
-       l.unlock();
-       if ((max_push_part_num >= jentries.front().part_num &&
-           head_part_num >= new_head_part_num)) {
-         /* raced, but new part was already written */
-         std::move(handler)(bs::error_code{});
-         return;
-       }
-       if (i >= MAX_RACE_RETRIES) {
-         std::move(handler)(errc::raced);
-         return;
-       }
-       if (!found) {
-         auto e = ba::get_associated_executor(handler, f->get_executor());
-         auto a = ba::get_associated_allocator(handler);
-         f->_update_meta(fifo::update{}
-                         .journal_entries_add(jentries),
-                          version,
-                         ca::bind_ea(
-                           e, a,
-                           NewPartPreparer(f, std::move(handler),
-                                           jentries,
-                                           i + 1, new_head_part_num)));
-         return;
-       }
-       // Fall through. We still need to process the journal.
-      }
-      f->_process_journal(std::move(handler));
-      return;
-    }
-
-    NewPartPreparer(FIFO* f,
-                   Handler&& handler,
-                   std::vector<fifo::journal_entry> jentries,
-                   int i, std::int64_t new_head_part_num)
-      : f(f), handler(std::move(handler)), jentries(std::move(jentries)),
-       i(i), new_head_part_num(new_head_part_num) {}
-  };
-
-  template<typename Handler>
-  void _prepare_new_part(bool is_head,
-                        Handler&& handler /* error_code */) {
-    std::unique_lock l(m);
-    std::vector jentries = { info.next_journal_entry(generate_tag()) };
-    std::int64_t new_head_part_num = info.head_part_num;
-    auto version = info.version;
-
-    if (is_head) {
-      auto new_head_jentry = jentries.front();
-      new_head_jentry.op = fifo::journal_entry::Op::set_head;
-      new_head_part_num = jentries.front().part_num;
-      jentries.push_back(std::move(new_head_jentry));
-    }
-    l.unlock();
-
-    auto e = ba::get_associated_executor(handler, get_executor());
-    auto a = ba::get_associated_allocator(handler);
-    _update_meta(fifo::update{}.journal_entries_add(jentries),
-                version,
-                ca::bind_ea(
-                  e, a,
-                  NewPartPreparer(this, std::move(handler),
-                                  jentries, 0, new_head_part_num)));
-  }
-
-  template<typename Handler>
-  class NewHeadPreparer {
-    FIFO* f;
-    Handler handler;
-    int i;
-    std::int64_t new_head_num;
-
-  public:
-
-    void operator ()(bs::error_code ec, bool canceled) {
-      std::unique_lock l(f->m);
-      auto head_part_num = f->info.head_part_num;
-      auto version = f->info.version;
-      l.unlock();
-
-      if (ec) {
-       std::move(handler)(ec);
-       return;
-      }
-      if (canceled) {
-       if (i >= MAX_RACE_RETRIES) {
-         std::move(handler)(errc::raced);
-         return;
-       }
-
-       // Raced, but there's still work to do!
-       if (head_part_num < new_head_num) {
-         auto e = ba::get_associated_executor(handler, f->get_executor());
-         auto a = ba::get_associated_allocator(handler);
-         f->_update_meta(fifo::update{}.head_part_num(new_head_num),
-                         version,
-                         ca::bind_ea(
-                           e, a,
-                           NewHeadPreparer(f, std::move(handler),
-                                           i + 1,
-                                           new_head_num)));
-         return;
-       }
-      }
-      // Either we succeeded, or we were raced by someone who did it for us.
-      std::move(handler)(bs::error_code{});
-      return;
-    }
-
-    NewHeadPreparer(FIFO* f,
-                   Handler&& handler,
-                   int i, std::int64_t new_head_num)
-      : f(f), handler(std::move(handler)), i(i), new_head_num(new_head_num) {}
-  };
-
-  template<typename Handler>
-  void _prepare_new_head(Handler&& handler /* error_code */) {
-    std::unique_lock l(m);
-    int64_t new_head_num = info.head_part_num + 1;
-    auto max_push_part_num = info.max_push_part_num;
-    auto version = info.version;
-    l.unlock();
-
-    if (max_push_part_num < new_head_num) {
-      auto e = ba::get_associated_executor(handler, get_executor());
-      auto a = ba::get_associated_allocator(handler);
-      _prepare_new_part(
-       true,
-       ca::bind_ea(
-         e, a,
-         [this, new_head_num,
-          handler = std::move(handler)](bs::error_code ec) mutable {
-           if (ec) {
-             handler(ec);
-             return;
-           }
-           std::unique_lock l(m);
-           if (info.max_push_part_num < new_head_num) {
-             l.unlock();
-             ldout(r->cct(), 0)
-               << "ERROR: " << __func__
-               << ": after new part creation: meta_info.max_push_part_num="
-               << info.max_push_part_num << " new_head_num="
-               << info.max_push_part_num << dendl;
-             std::move(handler)(errc::inconsistency);
-           } else {
-             l.unlock();
-             std::move(handler)(bs::error_code{});
-           }
-         }));
-      return;
-    }
-    auto e = ba::get_associated_executor(handler, get_executor());
-    auto a = ba::get_associated_allocator(handler);
-    _update_meta(fifo::update{}.head_part_num(new_head_num),
-                version,
-                ca::bind_ea(
-                  e, a,
-                  NewHeadPreparer(this, std::move(handler), 0,
-                                  new_head_num)));
-  }
-
-  template<typename T>
-  struct ExecHandleCB {
-    bs::error_code ec;
-    T result;
-    void operator()(bs::error_code e, const T& t) {
-      if (e) {
-        ec = e;
-        return;
-      }
-      result = t;
-    }
-  };
-
-  template<typename Handler>
-  class EntryPusher {
-    Handler handler;
-    using allocator_type = boost::asio::associated_allocator_t<Handler>;
-    using decoder_type = ExecHandleCB<int>;
-    using decoder_ptr = ceph::allocated_unique_ptr<decoder_type, allocator_type>;
-    decoder_ptr decoder;
-
-  public:
-
-    EntryPusher(Handler&& handler, decoder_ptr&& decoder)
-      : handler(std::move(handler)), decoder(std::move(decoder)) {}
-
-    void operator ()(bs::error_code ec) {
-      if (!ec) {
-        ec = decoder->ec;
-      }
-      auto reply = std::move(decoder->result);
-      decoder.reset(); // free handler-allocated memory before dispatching
-
-      std::move(handler)(ec, std::move(reply));
-    }
-  };
-
-  template<typename Handler>
-  auto push_entries(const std::deque<cb::list>& data_bufs,
-                   Handler&& handler /* error_code, int */) {
-    WriteOp op;
-    std::unique_lock l(m);
-    auto head_part_num = info.head_part_num;
-    auto tag = info.head_tag;
-    auto oid = info.part_oid(head_part_num);
-    l.unlock();
-
-    auto a = ba::get_associated_allocator(handler);
-    auto reply = ceph::allocate_unique<ExecHandleCB<int>>(a);
-
-    auto e = ba::get_associated_executor(handler, get_executor());
-    push_part(op, tag, data_bufs, std::ref(*reply));
-    return r->execute(oid, ioc, std::move(op),
-                     ca::bind_ea(e, a, EntryPusher(std::move(handler),
-                                                   std::move(reply))));
-  }
-
-  template<typename CT>
-  auto trim_part(int64_t part_num,
-                uint64_t ofs,
-                std::optional<std::string_view> tag,
-                bool exclusive,
-                CT&& ct) {
-    WriteOp op;
-    cls::fifo::trim_part(op, tag, ofs, exclusive);
-    return r->execute(info.part_oid(part_num), ioc, std::move(op),
-                     std::forward<CT>(ct));
-  }
-
-
-  template<typename Handler>
-  class Pusher {
-    FIFO* f;
-    std::deque<cb::list> remaining;
-    std::deque<cb::list> batch;
-    int i;
-    Handler handler;
-
-    void prep_then_push(const unsigned successes) {
-      std::unique_lock l(f->m);
-      auto max_part_size = f->info.params.max_part_size;
-      auto part_entry_overhead = f->part_entry_overhead;
-      l.unlock();
-
-      uint64_t batch_len = 0;
-      if (successes > 0) {
-       if (successes == batch.size()) {
-         batch.clear();
-       } else  {
-         batch.erase(batch.begin(), batch.begin() + successes);
-         for (const auto& b : batch) {
-           batch_len +=  b.length() + part_entry_overhead;
-         }
-       }
-      }
-
-      if (batch.empty() && remaining.empty()) {
-       std::move(handler)(bs::error_code{});
-       return;
-      }
-
-      while (!remaining.empty() &&
-            (remaining.front().length() + batch_len <= max_part_size)) {
-
-       /* We can send entries with data_len up to max_entry_size,
-          however, we want to also account the overhead when
-          dealing with multiple entries. Previous check doesn't
-          account for overhead on purpose. */
-       batch_len += remaining.front().length() + part_entry_overhead;
-       batch.push_back(std::move(remaining.front()));
-       remaining.pop_front();
-      }
-      push();
-    }
-
-    void push() {
-      auto e = ba::get_associated_executor(handler, f->get_executor());
-      auto a = ba::get_associated_allocator(handler);
-      f->push_entries(batch,
-                     ca::bind_ea(e, a,
-                                 Pusher(f, std::move(remaining),
-                                        batch, i,
-                                        std::move(handler))));
-    }
-
-  public:
-
-    // Initial call!
-    void operator ()() {
-      prep_then_push(0);
-    }
-
-    // Called with response to push_entries
-    void operator ()(bs::error_code ec, int r) {
-      if (ec == bs::errc::result_out_of_range) {
-       auto e = ba::get_associated_executor(handler, f->get_executor());
-       auto a = ba::get_associated_allocator(handler);
-       f->_prepare_new_head(
-         ca::bind_ea(e, a,
-                     Pusher(f, std::move(remaining),
-                            std::move(batch), i,
-                            std::move(handler))));
-       return;
-      }
-      if (ec) {
-       std::move(handler)(ec);
-       return;
-      }
-      i = 0; // We've made forward progress, so reset the race counter!
-      prep_then_push(r);
-    }
-
-    // Called with response to prepare_new_head
-    void operator ()(bs::error_code ec) {
-      if (ec == bs::errc::operation_canceled) {
-       if (i == MAX_RACE_RETRIES) {
-         ldout(f->r->cct(), 0)
-           << "ERROR: " << __func__
-           << "(): race check failed too many times, likely a bug" << dendl;
-         std::move(handler)(make_error_code(errc::raced));
-         return;
-       }
-       ++i;
-      } else if (ec) {
-       std::move(handler)(ec);
-       return;
-      }
-
-      if (batch.empty()) {
-       prep_then_push(0);
-       return;
-      } else {
-       push();
-       return;
-      }
-    }
-
-    Pusher(FIFO* f, std::deque<cb::list>&& remaining,
-          std::deque<cb::list> batch, int i,
-          Handler&& handler)
-      : f(f), remaining(std::move(remaining)),
-       batch(std::move(batch)), i(i),
-       handler(std::move(handler)) {}
-  };
-
-  template<typename Handler>
-  class Lister {
-    FIFO* f;
-    std::vector<list_entry> result;
-    bool more = false;
-    std::int64_t part_num;
-    std::uint64_t ofs;
-    int max_entries;
-    bs::error_code ec_out;
-    std::vector<fifo::part_list_entry> entries;
-    bool part_more = false;
-    bool part_full = false;
-    Handler handler;
-
-    void handle(bs::error_code ec) {
-      auto h = std::move(handler);
-      auto m = more;
-      auto r = std::move(result);
-
-      FIFO::assoc_delete(h, this);
-      std::move(h)(ec, std::move(r), m);
-    }
-
-  public:
-    Lister(FIFO* f, std::int64_t part_num, std::uint64_t ofs, int max_entries,
-          Handler&& handler)
-      : f(f), part_num(part_num), ofs(ofs), max_entries(max_entries),
-       handler(std::move(handler)) {
-      result.reserve(max_entries);
-    }
-
-
-    Lister(const Lister&) = delete;
-    Lister& operator =(const Lister&) = delete;
-    Lister(Lister&&) = delete;
-    Lister& operator =(Lister&&) = delete;
-
-    void list() {
-      if (max_entries > 0) {
-       ReadOp op;
-       ec_out.clear();
-       part_more = false;
-       part_full = false;
-       entries.clear();
-
-       std::unique_lock l(f->m);
-       auto part_oid = f->info.part_oid(part_num);
-       l.unlock();
-
-       list_part(op,
-                 {},
-                 ofs,
-                 max_entries,
-                 &ec_out,
-                 &entries,
-                 &part_more,
-                 &part_full,
-                 nullptr);
-       auto e = ba::get_associated_executor(handler, f->get_executor());
-       auto a = ba::get_associated_allocator(handler);
-       f->r->execute(
-         part_oid,
-         f->ioc,
-         std::move(op),
-         nullptr,
-         ca::bind_ea(
-           e, a,
-           [t = std::unique_ptr<Lister>(this), this,
-            part_oid](bs::error_code ec) mutable {
-             t.release();
-             if (ec == bs::errc::no_such_file_or_directory) {
-               auto e = ba::get_associated_executor(handler,
-                                                    f->get_executor());
-               auto a = ba::get_associated_allocator(handler);
-               f->_read_meta(
-                 ca::bind_ea(
-                   e, a,
-                   [this](bs::error_code ec) mutable {
-                     if (ec) {
-                       handle(ec);
-                       return;
-                     }
-
-                     if (part_num < f->info.tail_part_num) {
-                       /* raced with trim? restart */
-                       max_entries += result.size();
-                       result.clear();
-                       part_num = f->info.tail_part_num;
-                       ofs = 0;
-                       list();
-                     }
-                     /* assuming part was not written yet, so end of data */
-                     more = false;
-                     handle({});
-                     return;
-                   }));
-               return;
-             }
-             if (ec) {
-               ldout(f->r->cct(), 0)
-                 << __func__
-                 << "(): list_part() on oid=" << part_oid
-                 << " returned ec=" << ec.message() << dendl;
-               handle(ec);
-               return;
-             }
-             if (ec_out) {
-               ldout(f->r->cct(), 0)
-                 << __func__
-                 << "(): list_part() on oid=" << f->info.part_oid(part_num)
-                 << " returned ec=" << ec_out.message() << dendl;
-               handle(ec_out);
-               return;
-             }
-
-             more = part_full || part_more;
-             for (auto& entry : entries) {
-               list_entry e;
-               e.data = std::move(entry.data);
-               e.marker = marker{part_num, entry.ofs}.to_string();
-               e.mtime = entry.mtime;
-               result.push_back(std::move(e));
-             }
-             max_entries -= entries.size();
-             entries.clear();
-             if (max_entries > 0 &&
-                 part_more) {
-               list();
-               return;
-             }
-
-             if (!part_full) { /* head part is not full */
-               handle({});
-               return;
-             }
-             ++part_num;
-             ofs = 0;
-           list();
-           }));
-      } else {
-       handle({});
-       return;
-      }
-    }
-  };
-
-  template<typename Handler>
-  class Trimmer {
-    FIFO* f;
-    std::int64_t part_num;
-    std::uint64_t ofs;
-    bool exclusive;
-    Handler handler;
-    std::int64_t pn;
-    int i = 0;
-
-    void handle(bs::error_code ec) {
-      auto h = std::move(handler);
-
-      FIFO::assoc_delete(h, this);
-      return std::move(h)(ec);
-    }
-
-    void update() {
-      std::unique_lock l(f->m);
-      auto objv = f->info.version;
-      l.unlock();
-      auto a = ba::get_associated_allocator(handler);
-      auto e = ba::get_associated_executor(handler, f->get_executor());
-      f->_update_meta(
-       fifo::update{}.tail_part_num(part_num),
-       objv,
-       ca::bind_ea(
-         e, a,
-         [this, t = std::unique_ptr<Trimmer>(this)](bs::error_code ec,
-                                                    bool canceled) mutable {
-           t.release();
-           if (canceled)
-             if (i >= MAX_RACE_RETRIES) {
-               ldout(f->r->cct(), 0)
-                 << "ERROR: " << __func__
-                 << "(): race check failed too many times, likely a bug"
-                 << dendl;
-               handle(errc::raced);
-               return;
-             }
-           std::unique_lock l(f->m);
-           auto tail_part_num = f->info.tail_part_num;
-           l.unlock();
-           if (tail_part_num < part_num) {
-             ++i;
-             update();
-             return;
-           }
-           handle({});
-           return;
-         }));
-    }
-
-  public:
-    Trimmer(FIFO* f, std::int64_t part_num, std::uint64_t ofs,
-           bool exclusive, Handler&& handler)
-      : f(f), part_num(part_num), ofs(ofs), exclusive(exclusive),
-       handler(std::move(handler)) {
-      std::unique_lock l(f->m);
-      pn = f->info.tail_part_num;
-    }
-
-    void trim() {
-      auto a = ba::get_associated_allocator(handler);
-      auto e = ba::get_associated_executor(handler, f->get_executor());
-      if (pn < part_num) {
-       std::unique_lock l(f->m);
-       auto max_part_size = f->info.params.max_part_size;
-       l.unlock();
-       f->trim_part(
-         pn, max_part_size, std::nullopt,
-         false,
-         ca::bind_ea(
-           e, a,
-           [t = std::unique_ptr<Trimmer>(this),
-            this](bs::error_code ec) mutable {
-             t.release();
-             if (ec && ec != bs::errc::no_such_file_or_directory) {
-               ldout(f->r->cct(), 0)
-                 << __func__ << "(): ERROR: trim_part() on part="
-                 << pn << " returned ec=" << ec.message() << dendl;
-               handle(ec);
-               return;
-             }
-             ++pn;
-             trim();
-           }));
-       return;
-      }
-      f->trim_part(
-       part_num, ofs, std::nullopt, exclusive,
-       ca::bind_ea(
-         e, a,
-         [t = std::unique_ptr<Trimmer>(this),
-           this](bs::error_code ec) mutable {
-           t.release();
-           if (ec && ec != bs::errc::no_such_file_or_directory) {
-             ldout(f->r->cct(), 0)
-               << __func__ << "(): ERROR: trim_part() on part=" << part_num
-               << " returned ec=" << ec.message() << dendl;
-             handle(ec);
-             return;
-           }
-           std::unique_lock l(f->m);
-           auto tail_part_num = f->info.tail_part_num;
-           l.unlock();
-           if (part_num <= tail_part_num) {
-             /* don't need to modify meta info */
-             handle({});
-             return;
-           }
-           update();
-         }));
-    }
-  };
-
-  template<typename Handler>
-  class PartInfoGetter {
-    Handler handler;
-    using allocator_type = boost::asio::associated_allocator_t<Handler>;
-    using decoder_type = ExecDecodeCB<fifo::op::get_part_info_reply>;
-    using decoder_ptr = ceph::allocated_unique_ptr<decoder_type, allocator_type>;
-    decoder_ptr decoder;
-  public:
-    PartInfoGetter(Handler&& handler, decoder_ptr&& decoder)
-      : handler(std::move(handler)), decoder(std::move(decoder)) {}
-
-    void operator ()(bs::error_code ec) {
-      if (!ec) {
-        ec = decoder->ec;
-      }
-      auto reply = std::move(decoder->result);
-      decoder.reset(); // free handler-allocated memory before dispatching
-
-      auto p = ca::bind_handler(std::move(handler),
-                               ec, std::move(reply.header));
-      std::move(p)();
-    }
-  };
-
-
-};
-
-namespace detail {
-template<typename Handler>
-class JournalProcessor {
-private:
-  FIFO* const fifo;
-  Handler handler;
-
-  std::vector<fifo::journal_entry> processed;
-  std::multimap<std::int64_t, fifo::journal_entry> journal;
-  std::multimap<std::int64_t, fifo::journal_entry>::iterator iter;
-  std::int64_t new_tail;
-  std::int64_t new_head;
-  std::int64_t new_max;
-  int race_retries = 0;
-
-  template<typename CT>
-  auto create_part(int64_t part_num, std::string_view tag, CT&& ct) {
-    WriteOp op;
-    op.create(false); /* We don't need exclusivity, part_init ensures
-                        we're creating from the  same journal entry. */
-    std::unique_lock l(fifo->m);
-    part_init(op, tag, fifo->info.params);
-    auto oid = fifo->info.part_oid(part_num);
-    l.unlock();
-    return fifo->r->execute(oid, fifo->ioc,
-                           std::move(op), std::forward<CT>(ct));
-  }
-
-  template<typename CT>
-  auto remove_part(int64_t part_num, std::string_view tag, CT&& ct) {
-    WriteOp op;
-    op.remove();
-    std::unique_lock l(fifo->m);
-    auto oid = fifo->info.part_oid(part_num);
-    l.unlock();
-    return fifo->r->execute(oid, fifo->ioc,
-                           std::move(op), std::forward<CT>(ct));
-  }
-
-  template<typename PP>
-  void process_journal_entry(const fifo::journal_entry& entry,
-                            PP&& pp) {
-    switch (entry.op) {
-    case fifo::journal_entry::Op::unknown:
-      std::move(pp)(errc::inconsistency);
-      return;
-      break;
-
-    case fifo::journal_entry::Op::create:
-      create_part(entry.part_num, entry.part_tag, std::move(pp));
-      return;
-      break;
-    case fifo::journal_entry::Op::set_head:
-      ba::post(ba::get_associated_executor(handler, fifo->get_executor()),
-                     [pp = std::move(pp)]() mutable {
-                       std::move(pp)(bs::error_code{});
-                     });
-      return;
-      break;
-    case fifo::journal_entry::Op::remove:
-      remove_part(entry.part_num, entry.part_tag, std::move(pp));
-      return;
-      break;
-    }
-    std::move(pp)(errc::inconsistency);
-    return;
-  }
-
-  auto journal_entry_finisher(const fifo::journal_entry& entry) {
-    auto a = ba::get_associated_allocator(handler);
-    auto e = ba::get_associated_executor(handler, fifo->get_executor());
-    return
-      ca::bind_ea(
-       e, a,
-       [t = std::unique_ptr<JournalProcessor>(this), this,
-        entry](bs::error_code ec) mutable {
-         t.release();
-         if (entry.op == fifo::journal_entry::Op::remove &&
-             ec == bs::errc::no_such_file_or_directory)
-           ec.clear();
-
-         if (ec) {
-           ldout(fifo->r->cct(), 0)
-             << __func__
-             << "(): ERROR: failed processing journal entry for part="
-             << entry.part_num << " with error " << ec.message()
-             << " Bug or inconsistency." << dendl;
-           handle(errc::inconsistency);
-           return;
-         } else {
-           switch (entry.op) {
-           case fifo::journal_entry::Op::unknown:
-             // Can't happen. Filtered out in process_journal_entry.
-             abort();
-             break;
-
-           case fifo::journal_entry::Op::create:
-             if (entry.part_num > new_max) {
-               new_max = entry.part_num;
-             }
-             break;
-           case fifo::journal_entry::Op::set_head:
-             if (entry.part_num > new_head) {
-               new_head = entry.part_num;
-             }
-             break;
-           case fifo::journal_entry::Op::remove:
-             if (entry.part_num >= new_tail) {
-               new_tail = entry.part_num + 1;
-             }
-             break;
-           }
-           processed.push_back(entry);
-         }
-         ++iter;
-         process();
-       });
-  }
-
-  struct JournalPostprocessor {
-    std::unique_ptr<JournalProcessor> j_;
-    bool first;
-    void operator ()(bs::error_code ec, bool canceled) {
-      std::optional<int64_t> tail_part_num;
-      std::optional<int64_t> head_part_num;
-      std::optional<int64_t> max_part_num;
-
-      auto j = j_.release();
-
-      if (!first && !ec && !canceled) {
-       j->handle({});
-       return;
-      }
-
-      if (canceled) {
-       if (j->race_retries >= MAX_RACE_RETRIES) {
-         ldout(j->fifo->r->cct(), 0) << "ERROR: " << __func__ <<
-           "(): race check failed too many times, likely a bug" << dendl;
-         j->handle(errc::raced);
-         return;
-       }
-
-       ++j->race_retries;
-
-       std::vector<fifo::journal_entry> new_processed;
-       std::unique_lock l(j->fifo->m);
-       for (auto& e : j->processed) {
-         auto jiter = j->fifo->info.journal.find(e.part_num);
-         /* journal entry was already processed */
-         if (jiter == j->fifo->info.journal.end() ||
-             !(jiter->second == e)) {
-           continue;
-         }
-         new_processed.push_back(e);
-       }
-       j->processed = std::move(new_processed);
-      }
-
-      std::unique_lock l(j->fifo->m);
-      auto objv = j->fifo->info.version;
-      if (j->new_tail > j->fifo->info.tail_part_num) {
-       tail_part_num = j->new_tail;
-      }
-
-      if (j->new_head > j->fifo->info.head_part_num) {
-       head_part_num = j->new_head;
-      }
-
-      if (j->new_max > j->fifo->info.max_push_part_num) {
-       max_part_num = j->new_max;
-      }
-      l.unlock();
-
-      if (j->processed.empty() &&
-         !tail_part_num &&
-         !max_part_num) {
-       /* nothing to update anymore */
-       j->handle({});
-       return;
-      }
-      auto a = ba::get_associated_allocator(j->handler);
-      auto e = ba::get_associated_executor(j->handler, j->fifo->get_executor());
-      j->fifo->_update_meta(fifo::update{}
-                           .tail_part_num(tail_part_num)
-                           .head_part_num(head_part_num)
-                           .max_push_part_num(max_part_num)
-                           .journal_entries_rm(j->processed),
-                            objv,
-                            ca::bind_ea(
-                             e, a,
-                             JournalPostprocessor{j, false}));
-      return;
-    }
-
-    JournalPostprocessor(JournalProcessor* j, bool first)
-      : j_(j), first(first) {}
-  };
-
-  void postprocess() {
-    if (processed.empty()) {
-      handle({});
-      return;
-    }
-    JournalPostprocessor(this, true)({}, false);
-  }
-
-  void handle(bs::error_code ec) {
-    auto e = ba::get_associated_executor(handler, fifo->get_executor());
-    auto a = ba::get_associated_allocator(handler);
-    auto h = std::move(handler);
-    FIFO::assoc_delete(h, this);
-    e.dispatch(ca::bind_handler(std::move(h), ec), a);
-    return;
-  }
-
-public:
-
-  JournalProcessor(FIFO* fifo, Handler&& handler)
-    : fifo(fifo), handler(std::move(handler)) {
-    std::unique_lock l(fifo->m);
-    journal = fifo->info.journal;
-    iter = journal.begin();
-    new_tail = fifo->info.tail_part_num;
-    new_head = fifo->info.head_part_num;
-    new_max = fifo->info.max_push_part_num;
-  }
-
-  JournalProcessor(const JournalProcessor&) = delete;
-  JournalProcessor& operator =(const JournalProcessor&) = delete;
-  JournalProcessor(JournalProcessor&&) = delete;
-  JournalProcessor& operator =(JournalProcessor&&) = delete;
-
-  void process() {
-    if (iter != journal.end()) {
-      const auto entry = iter->second;
-      process_journal_entry(entry,
-                           journal_entry_finisher(entry));
-      return;
-    } else {
-      postprocess();
-      return;
-    }
-  }
-};
-}
-}
-
-#endif // CEPH_RADOS_CLS_FIFIO_H
index 44d67c26e88f9a48b58434eee2d82eabbd472aee..4c837b84d01074ff33ce8317aeff37e0a3b9cb82 100644 (file)
@@ -289,7 +289,7 @@ public:
   virtual bool wants_journal() = 0;  //< prefers a journal
   virtual bool allows_journal() = 0; //< allows a journal
   virtual void prepare_for_fast_shutdown() {}
   virtual bool wants_journal() = 0;  //< prefers a journal
   virtual bool allows_journal() = 0; //< allows a journal
   virtual void prepare_for_fast_shutdown() {}
-  virtual bool has_null_manager() { return false; }
+  virtual bool has_null_manager() const { return false; }
   // return store min allocation size, if applicable
   virtual uint64_t get_min_alloc_size() const {
     return 0;
   // return store min allocation size, if applicable
   virtual uint64_t get_min_alloc_size() const {
     return 0;
index 731ae5de73c5b7768e3408fa98148aa5f6f0880e..602fb60ce8e887cffe9e110bdf7076b08eab1b38 100644 (file)
@@ -64,6 +64,7 @@ public:
 
   int call(std::string_view command,
           const cmdmap_t& cmdmap,
 
   int call(std::string_view command,
           const cmdmap_t& cmdmap,
+          const bufferlist&,
           Formatter *f,
           std::ostream& ss,
           bufferlist& out) override {
           Formatter *f,
           std::ostream& ss,
           bufferlist& out) override {
index 70fa142b717743a6eda67f907ae69279feae6b40..64fbe1e88039f91155dc55b2d195293b1870f841 100644 (file)
@@ -1,6 +1,6 @@
 // -*- mode:C++; tab-width:8; c-basic-offset:2; indent-tabs-mode:t -*-
 // vim: ts=8 sw=2 smarttab
 // -*- mode:C++; tab-width:8; c-basic-offset:2; indent-tabs-mode:t -*-
 // vim: ts=8 sw=2 smarttab
-
+#include <chrono>
 #include "boost/algorithm/string.hpp" 
 #include "bluestore_common.h"
 #include "BlueFS.h"
 #include "boost/algorithm/string.hpp" 
 #include "bluestore_common.h"
 #include "BlueFS.h"
@@ -28,6 +28,9 @@ using std::set;
 using std::string;
 using std::to_string;
 using std::vector;
 using std::string;
 using std::to_string;
 using std::vector;
+using std::chrono::duration;
+using std::chrono::duration_cast;
+using std::chrono::seconds;
 
 using ceph::bufferlist;
 using ceph::decode;
 
 using ceph::bufferlist;
 using ceph::decode;
@@ -107,6 +110,7 @@ private:
   SocketHook(BlueFS* bluefs) :
     bluefs(bluefs) {}
   int call(std::string_view command, const cmdmap_t& cmdmap,
   SocketHook(BlueFS* bluefs) :
     bluefs(bluefs) {}
   int call(std::string_view command, const cmdmap_t& cmdmap,
+          const bufferlist&,
           Formatter *f,
           std::ostream& errss,
           bufferlist& out) override {
           Formatter *f,
           std::ostream& errss,
           bufferlist& out) override {
@@ -368,6 +372,24 @@ void BlueFS::_init_logger()
                    "Bytes requested in prefetch read mode",
                     NULL,
                    PerfCountersBuilder::PRIO_USEFUL, unit_t(UNIT_BYTES));
                    "Bytes requested in prefetch read mode",
                     NULL,
                    PerfCountersBuilder::PRIO_USEFUL, unit_t(UNIT_BYTES));
+ b.add_time_avg     (l_bluefs_compaction_lat, "compact_lat",
+                    "Average bluefs log compaction latency",
+                    "c__t",
+                    PerfCountersBuilder::PRIO_INTERESTING);
+ b.add_time_avg     (l_bluefs_compaction_lock_lat, "compact_lock_lat",
+                    "Average lock duration while compacting bluefs log",
+                    "c_lt",
+                    PerfCountersBuilder::PRIO_INTERESTING);
+  b.add_u64_counter(l_bluefs_alloc_shared_dev_fallbacks, "alloc_slow_fallback",
+                   "Amount of allocations that required fallback to "
+                    " slow/shared device",
+                    "asdf",
+                   PerfCountersBuilder::PRIO_USEFUL);
+  b.add_u64_counter(l_bluefs_alloc_shared_size_fallbacks, "alloc_slow_size_fallback",
+                   "Amount of allocations that required fallback to shared device's "
+                    "regular unit size",
+                    "assf",
+                   PerfCountersBuilder::PRIO_USEFUL);
   b.add_u64(l_bluefs_read_zeros_candidate, "read_zeros_candidate",
            "How many times bluefs read found page with all 0s");
   b.add_u64(l_bluefs_read_zeros_errors, "read_zeros_errors",
   b.add_u64(l_bluefs_read_zeros_candidate, "read_zeros_candidate",
            "How many times bluefs read found page with all 0s");
   b.add_u64(l_bluefs_read_zeros_errors, "read_zeros_errors",
@@ -563,7 +585,7 @@ int BlueFS::mkfs(uuid_d osd_uuid, const bluefs_layout_t& layout)
   _init_logger();
   _init_alloc();
 
   _init_logger();
   _init_alloc();
 
-  super.version = 1;
+  super.version = 0;
   super.block_size = bdev[BDEV_DB]->get_block_size();
   super.osd_uuid = osd_uuid;
   super.uuid.generate_random();
   super.block_size = bdev[BDEV_DB]->get_block_size();
   super.osd_uuid = osd_uuid;
   super.uuid.generate_random();
@@ -576,6 +598,7 @@ int BlueFS::mkfs(uuid_d osd_uuid, const bluefs_layout_t& layout)
   int r = _allocate(
     vselector->select_prefer_bdev(log_file->vselector_hint),
     cct->_conf->bluefs_max_log_runway,
   int r = _allocate(
     vselector->select_prefer_bdev(log_file->vselector_hint),
     cct->_conf->bluefs_max_log_runway,
+    0,
     &log_file->fnode);
   vselector->add_usage(log_file->vselector_hint, log_file->fnode);
   ceph_assert(r == 0);
     &log_file->fnode);
   vselector->add_usage(log_file->vselector_hint, log_file->fnode);
   ceph_assert(r == 0);
@@ -986,7 +1009,6 @@ int BlueFS::prepare_new_device(int id, const bluefs_layout_t& layout)
       new_log_dev_next,
       RENAME_DB2SLOW,
       layout);
       new_log_dev_next,
       RENAME_DB2SLOW,
       layout);
-    //}
   } else if(id == BDEV_NEWWAL) {
     _rewrite_log_and_layout_sync_LNF_LD(false,
       BDEV_DB,
   } else if(id == BDEV_NEWWAL) {
     _rewrite_log_and_layout_sync_LNF_LD(false,
       BDEV_DB,
@@ -1026,6 +1048,7 @@ int BlueFS::fsck()
 
 int BlueFS::_write_super(int dev)
 {
 
 int BlueFS::_write_super(int dev)
 {
+  ++super.version;
   // build superblock
   bufferlist bl;
   encode(super, bl);
   // build superblock
   bufferlist bl;
   encode(super, bl);
@@ -1088,12 +1111,17 @@ int BlueFS::_check_allocations(const bluefs_fnode_t& fnode,
     auto id = e.bdev;
     bool fail = false;
     ceph_assert(id < MAX_BDEV);
     auto id = e.bdev;
     bool fail = false;
     ceph_assert(id < MAX_BDEV);
+    ceph_assert(bdev[id]);
+    // let's use minimal allocation unit we can have
+    auto alloc_unit = bdev[id]->get_block_size();
+
     if (int r = _verify_alloc_granularity(id, e.offset, e.length,
     if (int r = _verify_alloc_granularity(id, e.offset, e.length,
+                                          alloc_unit,
                                          op_name); r < 0) {
       return r;
     }
 
                                          op_name); r < 0) {
       return r;
     }
 
-    apply_for_bitset_range(e.offset, e.length, alloc_size[id], used_blocks[id],
+    apply_for_bitset_range(e.offset, e.length, alloc_unit, used_blocks[id],
       [&](uint64_t pos, boost::dynamic_bitset<uint64_t> &bs) {
        if (is_alloc == bs.test(pos)) {
          fail = true;
       [&](uint64_t pos, boost::dynamic_bitset<uint64_t> &bs) {
        if (is_alloc == bs.test(pos)) {
          fail = true;
@@ -1115,31 +1143,14 @@ int BlueFS::_check_allocations(const bluefs_fnode_t& fnode,
 }
 
 int BlueFS::_verify_alloc_granularity(
 }
 
 int BlueFS::_verify_alloc_granularity(
-  __u8 id, uint64_t offset, uint64_t length, const char *op)
+  __u8 id, uint64_t offset, uint64_t length, uint64_t alloc_unit, const char *op)
 {
 {
-  if ((offset & (alloc_size[id] - 1)) ||
-      (length & (alloc_size[id] - 1))) {
+  if ((offset & (alloc_unit - 1)) ||
+      (length & (alloc_unit - 1))) {
     derr << __func__ << " " << op << " of " << (int)id
         << ":0x" << std::hex << offset << "~" << length << std::dec
         << " does not align to alloc_size 0x"
     derr << __func__ << " " << op << " of " << (int)id
         << ":0x" << std::hex << offset << "~" << length << std::dec
         << " does not align to alloc_size 0x"
-        << std::hex << alloc_size[id] << std::dec << dendl;
-    // be helpful
-    auto need = alloc_size[id];
-    while (need && ((offset & (need - 1)) ||
-                   (length & (need - 1)))) {
-      need >>= 1;
-    }
-    if (need) {
-      const char *which;
-      if (id == BDEV_SLOW ||
-         (id == BDEV_DB && !bdev[BDEV_SLOW])) {
-       which = "bluefs_shared_alloc_size";
-      } else {
-       which = "bluefs_alloc_size";
-      }
-      derr << "work-around by setting " << which << " = " << need
-          << " for this OSD" << dendl;
-    }
+        << std::hex << alloc_unit << std::dec << dendl;
     return -EFAULT;
   }
   return 0;
     return -EFAULT;
   }
   return 0;
@@ -1158,11 +1169,6 @@ int BlueFS::_replay(bool noop, bool to_stdout)
   if (!noop) {
     log_file->vselector_hint =
       vselector->get_hint_for_log();
   if (!noop) {
     log_file->vselector_hint =
       vselector->get_hint_for_log();
-  } else {
-    // do not use fnode from superblock in 'noop' mode - log_file's one should
-    // be fine and up-to-date
-    ceph_assert(log_file->fnode.ino == 1);
-    ceph_assert(log_file->fnode.extents.size() != 0);
   }
   dout(10) << __func__ << " log_fnode " << super.log_fnode << dendl;
   if (unlikely(to_stdout)) {
   }
   dout(10) << __func__ << " log_fnode " << super.log_fnode << dendl;
   if (unlikely(to_stdout)) {
@@ -1181,8 +1187,11 @@ int BlueFS::_replay(bool noop, bool to_stdout)
   if (!noop) {
     if (cct->_conf->bluefs_log_replay_check_allocations) {
       for (size_t i = 0; i < MAX_BDEV; ++i) {
   if (!noop) {
     if (cct->_conf->bluefs_log_replay_check_allocations) {
       for (size_t i = 0; i < MAX_BDEV; ++i) {
-       if (alloc_size[i] != 0 && bdev[i] != nullptr) {
-         used_blocks[i].resize(round_up_to(bdev[i]->get_size(), alloc_size[i]) / alloc_size[i]);
+       if (bdev[i] != nullptr) {
+          // let's use minimal allocation unit we can have
+          auto au = bdev[i]->get_block_size();
+          //hmm... on 32TB/4K drive this would take 1GB RAM!!!
+         used_blocks[i].resize(round_up_to(bdev[i]->get_size(), au) / au);
        }
       }
       // check initial log layout
        }
       }
       // check initial log layout
@@ -1305,7 +1314,9 @@ int BlueFS::_replay(bool noop, bool to_stdout)
     }
 
     auto p = t.op_bl.cbegin();
     }
 
     auto p = t.op_bl.cbegin();
+    auto pos0 = pos;
     while (!p.end()) {
     while (!p.end()) {
+      pos = pos0 + p.get_off();
       __u8 op;
       decode(op, p);
       switch (op) {
       __u8 op;
       decode(op, p);
       switch (op) {
@@ -1723,26 +1734,27 @@ int BlueFS::device_migrate_to_existing(
 
   for (auto& [ino, file_ref] : nodes.file_map) {
     //do not copy log
 
   for (auto& [ino, file_ref] : nodes.file_map) {
     //do not copy log
-    if (file_ref->fnode.ino == 1) {
+    if (ino == 1) {
       continue;
     }
     dout(10) << __func__ << " " << ino << " " << file_ref->fnode << dendl;
 
       continue;
     }
     dout(10) << __func__ << " " << ino << " " << file_ref->fnode << dendl;
 
-    auto& fnode_extents = file_ref->fnode.extents;
     vselector->sub_usage(file_ref->vselector_hint, file_ref->fnode);
 
     bool rewrite = std::any_of(
     vselector->sub_usage(file_ref->vselector_hint, file_ref->fnode);
 
     bool rewrite = std::any_of(
-      fnode_extents.begin(),
-      fnode_extents.end(),
+      file_ref->fnode.extents.begin(),
+      file_ref->fnode.extents.end(),
       [=](auto& ext) {
        return ext.bdev != dev_target && devs_source.count(ext.bdev);
       });
     if (rewrite) {
       dout(10) << __func__ << "  migrating" << dendl;
       [=](auto& ext) {
        return ext.bdev != dev_target && devs_source.count(ext.bdev);
       });
     if (rewrite) {
       dout(10) << __func__ << "  migrating" << dendl;
-
+      bluefs_fnode_t old_fnode;
+      old_fnode.swap_extents(file_ref->fnode);
+      auto& old_fnode_extents = old_fnode.extents;
       // read entire file
       bufferlist bl;
       // read entire file
       bufferlist bl;
-      for (auto old_ext : fnode_extents) {
+      for (const auto &old_ext : old_fnode_extents) {
        buf.resize(old_ext.length);
        int r = _bdev_read_random(old_ext.bdev,
          old_ext.offset,
        buf.resize(old_ext.length);
        int r = _bdev_read_random(old_ext.bdev,
          old_ext.offset,
@@ -1759,8 +1771,8 @@ int BlueFS::device_migrate_to_existing(
       }
 
       // write entire file
       }
 
       // write entire file
-      PExtentVector extents;
-      auto l = _allocate_without_fallback(dev_target, bl.length(), &extents);
+      auto l = _allocate(dev_target, bl.length(), 0,
+        &file_ref->fnode, 0, false);
       if (l < 0) {
        derr << __func__ << " unable to allocate len 0x" << std::hex
             << bl.length() << std::dec << " from " << (int)dev_target
       if (l < 0) {
        derr << __func__ << " unable to allocate len 0x" << std::hex
             << bl.length() << std::dec << " from " << (int)dev_target
@@ -1769,7 +1781,7 @@ int BlueFS::device_migrate_to_existing(
       }
 
       uint64_t off = 0;
       }
 
       uint64_t off = 0;
-      for (auto& i : extents) {
+      for (auto& i : file_ref->fnode.extents) {
        bufferlist cur;
        uint64_t cur_len = std::min<uint64_t>(i.length, bl.length() - off);
        ceph_assert(cur_len > 0);
        bufferlist cur;
        uint64_t cur_len = std::min<uint64_t>(i.length, bl.length() - off);
        ceph_assert(cur_len > 0);
@@ -1780,7 +1792,7 @@ int BlueFS::device_migrate_to_existing(
       }
 
       // release old extents
       }
 
       // release old extents
-      for (auto old_ext : fnode_extents) {
+      for (const auto &old_ext : old_fnode_extents) {
        PExtentVector to_release;
        to_release.emplace_back(old_ext.offset, old_ext.length);
        alloc[old_ext.bdev]->release(to_release);
        PExtentVector to_release;
        to_release.emplace_back(old_ext.offset, old_ext.length);
        alloc[old_ext.bdev]->release(to_release);
@@ -1790,12 +1802,11 @@ int BlueFS::device_migrate_to_existing(
       }
 
       // update fnode
       }
 
       // update fnode
-      fnode_extents.clear();
-      for (auto& i : extents) {
-       fnode_extents.emplace_back(dev_target_new, i.offset, i.length);
+      for (auto& i : file_ref->fnode.extents) {
+       i.bdev = dev_target_new;
       }
     } else {
       }
     } else {
-      for (auto& ext : fnode_extents) {
+      for (auto& ext : file_ref->fnode.extents) {
        if (dev_target != dev_target_new && ext.bdev == dev_target) {
          dout(20) << __func__ << "  " << " ... adjusting extent 0x"
                   << std::hex << ext.offset << std::dec
        if (dev_target != dev_target_new && ext.bdev == dev_target) {
          dout(20) << __func__ << "  " << " ... adjusting extent 0x"
                   << std::hex << ext.offset << std::dec
@@ -1861,30 +1872,29 @@ int BlueFS::device_migrate_to_new(
   flags |= devs_source.count(BDEV_WAL) ? REMOVE_WAL : 0;
   int dev_target_new = dev_target; //FIXME: remove, makes no sense
 
   flags |= devs_source.count(BDEV_WAL) ? REMOVE_WAL : 0;
   int dev_target_new = dev_target; //FIXME: remove, makes no sense
 
-  for (auto& p : nodes.file_map) {
+  for (auto& [ino, file_ref] : nodes.file_map) {
     //do not copy log
     //do not copy log
-    if (p.second->fnode.ino == 1) {
+    if (ino == 1) {
       continue;
     }
       continue;
     }
-    dout(10) << __func__ << " " << p.first << " " << p.second->fnode << dendl;
+    dout(10) << __func__ << " " << ino << " " << file_ref->fnode << dendl;
 
 
-    auto& fnode_extents = p.second->fnode.extents;
+    vselector->sub_usage(file_ref->vselector_hint, file_ref->fnode);
 
 
-    bool rewrite = false;
-    for (auto ext_it = fnode_extents.begin();
-        ext_it != p.second->fnode.extents.end();
-        ++ext_it) {
-      if (ext_it->bdev != dev_target && devs_source.count(ext_it->bdev)) {
-       rewrite = true;
-       break;
-      }
-    }
+    bool rewrite = std::any_of(
+      file_ref->fnode.extents.begin(),
+      file_ref->fnode.extents.end(),
+      [=](auto& ext) {
+       return ext.bdev != dev_target && devs_source.count(ext.bdev);
+      });
     if (rewrite) {
       dout(10) << __func__ << "  migrating" << dendl;
     if (rewrite) {
       dout(10) << __func__ << "  migrating" << dendl;
-
+      bluefs_fnode_t old_fnode;
+      old_fnode.swap_extents(file_ref->fnode);
+      auto& old_fnode_extents = old_fnode.extents;
       // read entire file
       bufferlist bl;
       // read entire file
       bufferlist bl;
-      for (auto old_ext : fnode_extents) {
+      for (const auto &old_ext : old_fnode_extents) {
        buf.resize(old_ext.length);
        int r = _bdev_read_random(old_ext.bdev,
          old_ext.offset,
        buf.resize(old_ext.length);
        int r = _bdev_read_random(old_ext.bdev,
          old_ext.offset,
@@ -1901,8 +1911,8 @@ int BlueFS::device_migrate_to_new(
       }
 
       // write entire file
       }
 
       // write entire file
-      PExtentVector extents;
-      auto l = _allocate_without_fallback(dev_target, bl.length(), &extents);
+      auto l = _allocate(dev_target, bl.length(), 0,
+        &file_ref->fnode, 0, false);
       if (l < 0) {
        derr << __func__ << " unable to allocate len 0x" << std::hex
             << bl.length() << std::dec << " from " << (int)dev_target
       if (l < 0) {
        derr << __func__ << " unable to allocate len 0x" << std::hex
             << bl.length() << std::dec << " from " << (int)dev_target
@@ -1911,7 +1921,7 @@ int BlueFS::device_migrate_to_new(
       }
 
       uint64_t off = 0;
       }
 
       uint64_t off = 0;
-      for (auto& i : extents) {
+      for (auto& i : file_ref->fnode.extents) {
        bufferlist cur;
        uint64_t cur_len = std::min<uint64_t>(i.length, bl.length() - off);
        ceph_assert(cur_len > 0);
        bufferlist cur;
        uint64_t cur_len = std::min<uint64_t>(i.length, bl.length() - off);
        ceph_assert(cur_len > 0);
@@ -1922,7 +1932,7 @@ int BlueFS::device_migrate_to_new(
       }
 
       // release old extents
       }
 
       // release old extents
-      for (auto old_ext : fnode_extents) {
+      for (const auto &old_ext : old_fnode_extents) {
        PExtentVector to_release;
        to_release.emplace_back(old_ext.offset, old_ext.length);
        alloc[old_ext.bdev]->release(to_release);
        PExtentVector to_release;
        to_release.emplace_back(old_ext.offset, old_ext.length);
        alloc[old_ext.bdev]->release(to_release);
@@ -1932,9 +1942,8 @@ int BlueFS::device_migrate_to_new(
       }
 
       // update fnode
       }
 
       // update fnode
-      fnode_extents.clear();
-      for (auto& i : extents) {
-       fnode_extents.emplace_back(dev_target_new, i.offset, i.length);
+      for (auto& i : file_ref->fnode.extents) {
+       i.bdev = dev_target_new;
       }
     }
   }
       }
     }
   }
@@ -2129,7 +2138,9 @@ int64_t BlueFS::_read_random(
       buf->pos += r;
     }
   }
       buf->pos += r;
     }
   }
-  dout(20) << __func__ << " got " << ret << dendl;
+  dout(20) << __func__ << std::hex
+           << " got 0x" << ret
+           << std::dec  << dendl;
   --h->file->num_reading;
   return ret;
 }
   --h->file->num_reading;
   return ret;
 }
@@ -2206,13 +2217,16 @@ int64_t BlueFS::_read(
                  << std::hex << x_off << "~" << l << std::dec
                  << " of " << *p << dendl;
        int r;
                  << std::hex << x_off << "~" << l << std::dec
                  << " of " << *p << dendl;
        int r;
+       // when reading BlueFS log (only happens on startup) use non-buffered io
+       // it makes it in sync with logic in _flush_range()
+       bool use_buffered_io = h->file->fnode.ino == 1 ? false : cct->_conf->bluefs_buffered_io;
        if (!cct->_conf->bluefs_check_for_zeros) {
          r = _bdev_read(p->bdev, p->offset + x_off, l, &buf->bl, ioc[p->bdev],
        if (!cct->_conf->bluefs_check_for_zeros) {
          r = _bdev_read(p->bdev, p->offset + x_off, l, &buf->bl, ioc[p->bdev],
-                        cct->_conf->bluefs_buffered_io);
+                        use_buffered_io);
        } else {
          r = _read_and_check(
            p->bdev, p->offset + x_off, l, &buf->bl, ioc[p->bdev],
        } else {
          r = _read_and_check(
            p->bdev, p->offset + x_off, l, &buf->bl, ioc[p->bdev],
-           cct->_conf->bluefs_buffered_io);
+           use_buffered_io);
        }
        logger->inc(l_bluefs_read_disk_count, 1);
        logger->inc(l_bluefs_read_disk_bytes, l);
        }
        logger->inc(l_bluefs_read_disk_count, 1);
        logger->inc(l_bluefs_read_disk_bytes, l);
@@ -2254,7 +2268,9 @@ int64_t BlueFS::_read(
     buf->pos += r;
   }
 
     buf->pos += r;
   }
 
-  dout(20) << __func__ << " got " << ret << dendl;
+  dout(20) << __func__ << std::hex
+           << " got 0x" << ret
+           << std::dec  << dendl;
   ceph_assert(!outbl || (int)outbl->length() == ret);
   --h->file->num_reading;
   return ret;
   ceph_assert(!outbl || (int)outbl->length() == ret);
   --h->file->num_reading;
   return ret;
@@ -2282,6 +2298,44 @@ void BlueFS::invalidate_cache(FileRef f, uint64_t offset, uint64_t length)
   }
 }
 
   }
 }
 
+
+uint64_t BlueFS::_estimate_transaction_size(bluefs_transaction_t* t)
+{
+  uint64_t max_alloc_size = std::max(alloc_size[BDEV_WAL],
+                                    std::max(alloc_size[BDEV_DB],
+                                             alloc_size[BDEV_SLOW]));
+
+  // conservative estimate for final encoded size
+  return round_up_to(t->op_bl.length() + super.block_size * 2, max_alloc_size);
+}
+
+uint64_t BlueFS::_make_initial_transaction(uint64_t start_seq,
+                                           bluefs_fnode_t& fnode,
+                                           uint64_t expected_final_size,
+                                           bufferlist* out)
+{
+  bluefs_transaction_t t0;
+  t0.seq = start_seq;
+  t0.uuid = super.uuid;
+  t0.op_init();
+  t0.op_file_update_inc(fnode);
+  t0.op_jump(start_seq, expected_final_size); // this is a fixed size op,
+                                              // hence it's valid with fake
+                                              // params for overall txc size
+                                              // estimation
+  if (!out) {
+    return _estimate_transaction_size(&t0);
+  }
+
+  ceph_assert(expected_final_size > 0);
+  out->reserve(expected_final_size);
+  encode(t0, *out);
+  // make sure we're not wrong aboth the size
+  ceph_assert(out->length() <= expected_final_size);
+  _pad_bl(*out, expected_final_size);
+  return expected_final_size;
+}
+
 uint64_t BlueFS::_estimate_log_size_N()
 {
   std::lock_guard nl(nodes.lock);
 uint64_t BlueFS::_estimate_log_size_N()
 {
   std::lock_guard nl(nodes.lock);
@@ -2329,77 +2383,51 @@ bool BlueFS::_should_start_compact_log_L_N()
   return true;
 }
 
   return true;
 }
 
-void BlueFS::_compact_log_dump_metadata_NF(bluefs_transaction_t *t,
-                                       int flags)
+void BlueFS::_compact_log_dump_metadata_NF(uint64_t start_seq,
+                                        bluefs_transaction_t *t,
+                                       int bdev_update_flags,
+                                        uint64_t capture_before_seq)
 {
 {
-  std::lock_guard nl(nodes.lock);
-
-  t->seq = 1;
+  dout(20) << __func__ << dendl;
+  t->seq = start_seq;
   t->uuid = super.uuid;
   t->uuid = super.uuid;
-  dout(20) << __func__ << " op_init" << dendl;
 
 
-  t->op_init();
-  for (auto& [ino, file_ref] : nodes.file_map) {
-    if (ino == 1)
-      continue;
-    ceph_assert(ino > 1);
-    std::lock_guard fl(file_ref->lock);
-    for(auto& e : file_ref->fnode.extents) {
-      auto bdev = e.bdev;
-      auto bdev_new = bdev;
-      ceph_assert(!((flags & REMOVE_WAL) && bdev == BDEV_WAL));
-      if ((flags & RENAME_SLOW2DB) && bdev == BDEV_SLOW) {
-       bdev_new = BDEV_DB;
-      }
-      if ((flags & RENAME_DB2SLOW) && bdev == BDEV_DB) {
-       bdev_new = BDEV_SLOW;
-      }
-      if (bdev == BDEV_NEWDB) {
-       // REMOVE_DB xor RENAME_DB
-       ceph_assert(!(flags & REMOVE_DB) != !(flags & RENAME_DB2SLOW));
-       ceph_assert(!(flags & RENAME_SLOW2DB));
-       bdev_new = BDEV_DB;
-      }
-      if (bdev == BDEV_NEWWAL) {
-       ceph_assert(flags & REMOVE_WAL);
-       bdev_new = BDEV_WAL;
-      }
-      e.bdev = bdev_new;
-    }
-    dout(20) << __func__ << " op_file_update " << file_ref->fnode << dendl;
-    t->op_file_update(file_ref->fnode);
-  }
-  for (auto& [path, dir_ref] : nodes.dir_map) {
-    dout(20) << __func__ << " op_dir_create " << path << dendl;
-    t->op_dir_create(path);
-    for (auto& [fname, file_ref] : dir_ref->file_map) {
-      dout(20) << __func__ << " op_dir_link " << path << "/" << fname
-              << " to " << file_ref->fnode.ino << dendl;
-      t->op_dir_link(path, fname, file_ref->fnode.ino);
-    }
-  }
-}
-/* Streams to t files modified before *capture_before_seq* and all dirs */
-void BlueFS::_compact_log_async_dump_metadata_NF(bluefs_transaction_t *t,
-                                                uint64_t capture_before_seq)
-{
   std::lock_guard nl(nodes.lock);
 
   std::lock_guard nl(nodes.lock);
 
-  t->seq = 1;
-  t->uuid = super.uuid;
-  dout(20) << __func__ << " op_init" << dendl;
-
-  t->op_init();
   for (auto& [ino, file_ref] : nodes.file_map) {
     if (ino == 1)
       continue;
     ceph_assert(ino > 1);
     std::lock_guard fl(file_ref->lock);
   for (auto& [ino, file_ref] : nodes.file_map) {
     if (ino == 1)
       continue;
     ceph_assert(ino > 1);
     std::lock_guard fl(file_ref->lock);
-    if (file_ref->dirty_seq < capture_before_seq) {
+    if (bdev_update_flags) {
+      for(auto& e : file_ref->fnode.extents) {
+        auto bdev = e.bdev;
+        auto bdev_new = bdev;
+        ceph_assert(!((bdev_update_flags & REMOVE_WAL) && bdev == BDEV_WAL));
+        if ((bdev_update_flags & RENAME_SLOW2DB) && bdev == BDEV_SLOW) {
+         bdev_new = BDEV_DB;
+        }
+        if ((bdev_update_flags & RENAME_DB2SLOW) && bdev == BDEV_DB) {
+         bdev_new = BDEV_SLOW;
+        }
+        if (bdev == BDEV_NEWDB) {
+         // REMOVE_DB xor RENAME_DB
+         ceph_assert(!(bdev_update_flags & REMOVE_DB) != !(bdev_update_flags & RENAME_DB2SLOW));
+         ceph_assert(!(bdev_update_flags & RENAME_SLOW2DB));
+         bdev_new = BDEV_DB;
+        }
+        if (bdev == BDEV_NEWWAL) {
+         ceph_assert(bdev_update_flags & REMOVE_WAL);
+         bdev_new = BDEV_WAL;
+        }
+        e.bdev = bdev_new;
+      }
+    }
+    if (capture_before_seq == 0 || file_ref->dirty_seq < capture_before_seq) {
       dout(20) << __func__ << " op_file_update " << file_ref->fnode << dendl;
     } else {
       dout(20) << __func__ << " op_file_update just modified, dirty_seq="
       dout(20) << __func__ << " op_file_update " << file_ref->fnode << dendl;
     } else {
       dout(20) << __func__ << " op_file_update just modified, dirty_seq="
-              << file_ref->dirty_seq << " " << file_ref->fnode << dendl;
+               << file_ref->dirty_seq << " " << file_ref->fnode << dendl;
     }
     t->op_file_update(file_ref->fnode);
   }
     }
     t->op_file_update(file_ref->fnode);
   }
@@ -2432,17 +2460,49 @@ void BlueFS::_compact_log_sync_LNF_LD()
   logger->inc(l_bluefs_log_compactions);
 }
 
   logger->inc(l_bluefs_log_compactions);
 }
 
-void BlueFS::_rewrite_log_and_layout_sync_LNF_LD(bool allocate_with_fallback,
+/*
+ * SYNC LOG COMPACTION
+ *
+ * 0. Lock the log completely through the whole procedure
+ *
+ * 1. Build new log. It will include log's starter and compacted metadata
+ *    body. Jump op appended to the starter will link the pieces together.
+ *
+ * 2. Write out new log's content
+ *
+ * 3. Write out new superblock. This includes relevant device layout update.
+ *
+ * 4. Finalization. Old space release.
+ */
+
+void BlueFS::_rewrite_log_and_layout_sync_LNF_LD(bool permit_dev_fallback,
                                         int super_dev,
                                         int log_dev,
                                         int log_dev_new,
                                         int flags,
                                         std::optional<bluefs_layout_t> layout)
 {
                                         int super_dev,
                                         int log_dev,
                                         int log_dev_new,
                                         int flags,
                                         std::optional<bluefs_layout_t> layout)
 {
+  // we substitute log_dev with log_dev_new for new allocations below
+  // and permitting fallback allocations prevents such a substitution
+  ceph_assert((permit_dev_fallback && log_dev == log_dev_new) ||
+              !permit_dev_fallback);
+
+  dout(10) << __func__ << " super_dev:" << super_dev
+                       << " log_dev:" << log_dev
+                       << " log_dev_new:" << log_dev_new
+                      << " flags:" << flags
+                      << " seq:" << log.seq_live
+                      << dendl;
+  utime_t mtime = ceph_clock_now();
+  uint64_t starter_seq = 1;
+
+  // Part 0.
+  // Lock the log totally till the end of the procedure
   std::lock_guard ll(log.lock);
   std::lock_guard ll(log.lock);
+  auto t0 = mono_clock::now();
 
   File *log_file = log.writer->file.get();
 
   File *log_file = log.writer->file.get();
-
+  bluefs_fnode_t fnode_tail;
   // log.t.seq is always set to current live seq
   ceph_assert(log.t.seq == log.seq_live);
   // Capturing entire state. Dump anything that has been stored there.
   // log.t.seq is always set to current live seq
   ceph_assert(log.t.seq == log.seq_live);
   // Capturing entire state. Dump anything that has been stored there.
@@ -2451,53 +2511,145 @@ void BlueFS::_rewrite_log_and_layout_sync_LNF_LD(bool allocate_with_fallback,
   // From now on, no changes to log.t are permitted until we finish rewriting log.
   // Can allow dirty to remain dirty - log.seq_live will not change.
 
   // From now on, no changes to log.t are permitted until we finish rewriting log.
   // Can allow dirty to remain dirty - log.seq_live will not change.
 
-  dout(20) << __func__ << " super_dev:" << super_dev
-                       << " log_dev:" << log_dev
-                       << " log_dev_new:" << log_dev_new
-                      << " flags:" << flags
-                      << dendl;
-  bluefs_transaction_t t;
-  _compact_log_dump_metadata_NF(&t, flags);
+  //
+  // Part 1.
+  // Build new log starter and compacted metadata body
+  // 1.1. Build full compacted meta transaction.
+  //      Encode a bluefs transaction that dumps all of the in-memory fnodes
+  //      and names.
+  //      This might be pretty large and its allocation map can exceed
+  //      superblock size. Hence instead we'll need log starter part which
+  //      goes to superblock and refers that new meta through op_update_inc.
+  // 1.2.  Allocate space for the above transaction
+  //       using its size estimation.
+  // 1.3.  Allocate the space required for the starter part of the new log.
+  //       It should be small enough to fit into superblock.
+  // 1.4   Building new log persistent fnode representation which will
+  //       finally land to disk.
+  //       Depending on input parameters we might need to perform device ids
+  //       rename - runtime and persistent replicas should be different when we
+  //       are in the device migration process.
+  // 1.5   Store starter fnode to run-time superblock, to be written out later.
+  //       It doesn't contain compacted meta to fit relevant alocation map into
+  //       superblock.
+  // 1.6   Proceed building new log persistent fnode representation.
+  //       Will add log tail with compacted meta extents from 1.1.
+  //       Device rename applied as well
+  //
+  // 1.7.  Encode new log fnode starter,
+  //       It will include op_init, new log's op_update_inc
+  //       and jump to the compacted meta transaction beginning.
+  //       Superblock will reference this starter part
+  //
+  // 1.8.  Encode compacted meta transaction,
+  //       extend the transaction with a jump to proper sequence no
+  //
+
+
+  // 1.1 Build full compacted meta transaction
+  bluefs_transaction_t compacted_meta_t;
+  _compact_log_dump_metadata_NF(starter_seq + 1, &compacted_meta_t, flags, 0);
+
+  // 1.2 Allocate the space required for the compacted meta transaction
+  uint64_t compacted_meta_need =
+    _estimate_transaction_size(&compacted_meta_t) +
+      cct->_conf->bluefs_max_log_runway;
+
+  dout(20) << __func__ << " compacted_meta_need " << compacted_meta_need << dendl;
+
+  int r = _allocate(log_dev, compacted_meta_need, 0, &fnode_tail, 0,
+    permit_dev_fallback);
+  ceph_assert(r == 0);
 
 
-  dout(20) << __func__ << " op_jump_seq " << log.seq_live << dendl;
-  t.op_jump_seq(log.seq_live);
 
 
-  bufferlist bl;
-  encode(t, bl);
-  _pad_bl(bl);
+  // 1.3 Allocate the space required for the starter part of the new log.
+  // estimate new log fnode size to be referenced from superblock
+  // hence use dummy fnode and jump parameters
+  uint64_t starter_need = _make_initial_transaction(starter_seq, fnode_tail, 0, nullptr);
 
 
-  uint64_t need = bl.length() + cct->_conf->bluefs_max_log_runway;
-  dout(20) << __func__ << " need " << need << dendl;
+  bluefs_fnode_t fnode_starter(log_file->fnode.ino, 0, mtime);
+  r = _allocate(log_dev, starter_need, 0, &fnode_starter, 0,
+    permit_dev_fallback);
+  ceph_assert(r == 0);
 
 
-  bluefs_fnode_t old_fnode;
-  int r;
-  vselector->sub_usage(log_file->vselector_hint, log_file->fnode);
-  log_file->fnode.swap_extents(old_fnode);
-  if (allocate_with_fallback) {
-    r = _allocate(log_dev, need, &log_file->fnode);
-    ceph_assert(r == 0);
-  } else {
-    PExtentVector extents;
-    r = _allocate_without_fallback(log_dev,
-                              need,
-                              &extents);
-    ceph_assert(r == 0);
-    for (auto& p : extents) {
-      log_file->fnode.append_extent(
-       bluefs_extent_t(log_dev, p.offset, p.length));
+  // 1.4 Building starter fnode
+  bluefs_fnode_t fnode_persistent(fnode_starter.ino, 0, mtime);
+  for (auto p : fnode_starter.extents) {
+    // rename device if needed - this is possible when fallback allocations
+    // are prohibited only. Which means every extent is targeted to the same
+    // device and we can unconditionally update them.
+    if (log_dev != log_dev_new) {
+      dout(10) << __func__ << " renaming log extents to "
+               << log_dev_new << dendl;
+      p.bdev = log_dev_new;
     }
     }
+    fnode_persistent.append_extent(p);
+  }
+
+  // 1.5 Store starter fnode to run-time superblock, to be written out later
+  super.log_fnode = fnode_persistent;
+
+  // 1.6 Proceed building new log persistent fnode representation
+  // we'll build incremental update starting from this point
+  fnode_persistent.reset_delta();
+  for (auto p : fnode_tail.extents) {
+    // rename device if needed - this is possible when fallback allocations
+    // are prohibited only. Which means every extent is targeted to the same
+    // device and we can unconditionally update them.
+    if (log_dev != log_dev_new) {
+      dout(10) << __func__ << " renaming log extents to "
+               << log_dev_new << dendl;
+      p.bdev = log_dev_new;
+    }
+    fnode_persistent.append_extent(p);
   }
 
   }
 
-  _close_writer(log.writer);
-
-  // we will write it to super
-  log_file->fnode.reset_delta();
-  log_file->fnode.size = bl.length();
+  // 1.7 Encode new log fnode
+  // This will flush incremental part of fnode_persistent only.
+  bufferlist starter_bl;
+  _make_initial_transaction(starter_seq, fnode_persistent, starter_need, &starter_bl);
 
 
+  // 1.8 Encode compacted meta transaction
+  dout(20) << __func__ << " op_jump_seq " << log.seq_live << dendl;
+  // hopefully "compact_meta_need" estimation provides enough extra space
+  // for this op, assert below if not
+  compacted_meta_t.op_jump_seq(log.seq_live);
+
+  bufferlist compacted_meta_bl;
+  encode(compacted_meta_t, compacted_meta_bl);
+  _pad_bl(compacted_meta_bl);
+  ceph_assert(compacted_meta_bl.length() <= compacted_meta_need);
+
+  //
+  // Part 2
+  // Write out new log's content
+  // 2.1. Build the full runtime new log's fnode
+  //
+  // 2.2. Write out new log's
+  //
+  // 2.3. Do flush and wait for completion through flush_bdev()
+  //
+  // 2.4. Finalize log update
+  //      Update all sequence numbers
+  //
+
+  // 2.1 Build the full runtime new log's fnode
+  bluefs_fnode_t old_log_fnode;
+  old_log_fnode.swap(fnode_starter);
+  old_log_fnode.clone_extents(fnode_tail);
+  old_log_fnode.reset_delta();
+  log_file->fnode.swap(old_log_fnode);
+
+  // 2.2 Write out new log's content
+  // Get rid off old writer
+  _close_writer(log.writer);
+  // Make new log writer and stage new log's content writing
   log.writer = _create_writer(log_file);
   log.writer = _create_writer(log_file);
-  log.writer->append(bl);
+  log.writer->append(starter_bl);
+  log.writer->append(compacted_meta_bl);
+
+  // 2.3 Do flush and wait for completion through flush_bdev()
   _flush_special(log.writer);
   _flush_special(log.writer);
-  vselector->add_usage(log_file->vselector_hint, log_file->fnode);
 #ifdef HAVE_LIBAIO
   if (!cct->_conf->bluefs_sync_write) {
     list<aio_t> completed_ios;
 #ifdef HAVE_LIBAIO
   if (!cct->_conf->bluefs_sync_write) {
     list<aio_t> completed_ios;
@@ -2507,74 +2659,86 @@ void BlueFS::_rewrite_log_and_layout_sync_LNF_LD(bool allocate_with_fallback,
   }
 #endif
   _flush_bdev();
   }
 #endif
   _flush_bdev();
+
+  // 2.4 Finalize log update
   ++log.seq_live;
   dirty.seq_live = log.seq_live;
   log.t.seq = log.seq_live;
   ++log.seq_live;
   dirty.seq_live = log.seq_live;
   log.t.seq = log.seq_live;
+  vselector->sub_usage(log_file->vselector_hint, old_log_fnode);
+  vselector->add_usage(log_file->vselector_hint, log_file->fnode);
 
 
-  super.memorized_layout = layout;
-  super.log_fnode = log_file->fnode;
-  // rename device if needed
-  if (log_dev != log_dev_new) {
-    dout(10) << __func__ << " renaming log extents to " << log_dev_new << dendl;
-    for (auto& p : super.log_fnode.extents) {
-      p.bdev = log_dev_new;
-    }
-  }
-  dout(10) << __func__ << " writing super, log fnode: " << super.log_fnode << dendl;
+  // Part 3.
+  // Write out new superblock to reflect all the changes.
+  //
 
 
-  ++super.version;
+  super.memorized_layout = layout;
   _write_super(super_dev);
   _flush_bdev();
 
   _write_super(super_dev);
   _flush_bdev();
 
-  dout(10) << __func__ << " release old log extents " << old_fnode.extents << dendl;
-  std::lock_guard dl(dirty.lock);
-  for (auto& r : old_fnode.extents) {
-    dirty.pending_release[r.bdev].insert(r.offset, r.length);
+  // we're mostly done
+  dout(10) << __func__ << " log extents " << log_file->fnode.extents << dendl;
+  logger->inc(l_bluefs_log_compactions);
+
+  // Part 4
+  // Finalization. Release old space.
+  //
+  {
+    dout(10) << __func__
+             << " release old log extents " << old_log_fnode.extents
+             << dendl;
+    std::lock_guard dl(dirty.lock);
+    for (auto& r : old_log_fnode.extents) {
+      dirty.pending_release[r.bdev].insert(r.offset, r.length);
+    }
   }
   }
+  logger->tinc(l_bluefs_compaction_lock_lat, mono_clock::now() - t0);
 }
 
 /*
 }
 
 /*
- * 1. Allocate a new extent to continue the log, and then log an event
- * that jumps the log write position to the new extent.  At this point, the
- * old extent(s) won't be written to, and reflect everything to compact.
- * New events will be written to the new region that we'll keep.
+ * ASYNC LOG COMPACTION
  *
  *
- * 2. While still holding the lock, encode a bufferlist that dumps all of the
- * in-memory fnodes and names.  This will become the new beginning of the
- * log.  The last event will jump to the log continuation extent from #1.
- *
- * 3. Queue a write to a new extent for the new beginnging of the log.
+ * 0. Lock the log and forbid its extension. The former covers just
+ *    a part of the below procedure while the latter spans over it
+ *    completely.
+ * 1. Allocate a new extent to continue the log, and then log an event
+ *    that jumps the log write position to the new extent.  At this point, the
+ *    old extent(s) won't be written to, and reflect everything to compact.
+ *    New events will be written to the new region that we'll keep.
+ *    The latter will finally become new log tail on compaction completion.
  *
  *
- * 4. Drop lock and wait
+ * 2. Build new log. It will include log's starter, compacted metadata
+ *    body and the above tail. Jump ops appended to the starter and meta body
+ *    will link the pieces togather. Log's lock is releases in the mid of the
+ *    process to permit parallel access to it.
  *
  *
- * 5. Retake the lock.
+ * 3. Write out new log's content.
  *
  *
- * 6. Update the log_fnode to splice in the new beginning.
+ * 4. Write out new superblock to reflect all the changes.
  *
  *
- * 7. Write the new superblock.
+ * 5. Apply new log fnode, log is locked for a while.
  *
  *
- * 8. Release the old log space.  Clean up.
+ * 6. Finalization. Clean up, old space release and total unlocking.
  */
 
 void BlueFS::_compact_log_async_LD_LNF_D() //also locks FW for new_writer
 {
   dout(10) << __func__ << dendl;
  */
 
 void BlueFS::_compact_log_async_LD_LNF_D() //also locks FW for new_writer
 {
   dout(10) << __func__ << dendl;
+  utime_t mtime = ceph_clock_now();
+  uint64_t starter_seq = 1;
+  uint64_t old_log_jump_to = 0;
+
+  // Part 0.
+  // Lock the log and forbid its expansion and other compactions
+
   // only one compaction allowed at one time
   bool old_is_comp = std::atomic_exchange(&log_is_compacting, true);
   if (old_is_comp) {
     dout(10) << __func__ << " ongoing" <<dendl;
     return;
   }
   // only one compaction allowed at one time
   bool old_is_comp = std::atomic_exchange(&log_is_compacting, true);
   if (old_is_comp) {
     dout(10) << __func__ << " ongoing" <<dendl;
     return;
   }
-
+  // lock log's run-time structures for a while
   log.lock.lock();
   log.lock.lock();
-  File *log_file = log.writer->file.get();
-  FileWriter *new_log_writer = nullptr;
-  FileRef new_log = nullptr;
-  uint64_t new_log_jump_to = 0;
-  uint64_t old_log_jump_to = 0;
-
-  new_log = ceph::make_ref<File>();
-  new_log->fnode.ino = 0;   // we use _flush_special to avoid log of the fnode
+  auto t0 = mono_clock::now();
 
   // Part 1.
   // Prepare current log for jumping into it.
 
   // Part 1.
   // Prepare current log for jumping into it.
@@ -2588,25 +2752,42 @@ void BlueFS::_compact_log_async_LD_LNF_D() //also locks FW for new_writer
   bool old_forbidden = atomic_exchange(&log_forbidden_to_expand, true);
   ceph_assert(old_forbidden == false);
 
   bool old_forbidden = atomic_exchange(&log_forbidden_to_expand, true);
   ceph_assert(old_forbidden == false);
 
-  vselector->sub_usage(log_file->vselector_hint, log_file->fnode);
+  //
+  // Part 1.
+  // Prepare current log for jumping into it.
+  // 1.1. Allocate extent
+  // 1.2. Save log's fnode extents and add new extents
+  // 1.3. Update op to log
+  // 1.4. Jump op to log
+  // During that, no one else can write to log, otherwise we risk jumping backwards.
+  // We need to sync log, because we are injecting discontinuity, and writer is not prepared for that.
 
 
-  // 1.1 allocate new log space and jump to it.
+  // 1.1 allocate new log extents and store them at fnode_tail
+  File *log_file = log.writer->file.get();
   old_log_jump_to = log_file->fnode.get_allocated();
   old_log_jump_to = log_file->fnode.get_allocated();
+  bluefs_fnode_t fnode_tail;
   uint64_t runway = log_file->fnode.get_allocated() - log.writer->get_effective_write_pos();
   dout(10) << __func__ << " old_log_jump_to 0x" << std::hex << old_log_jump_to
   uint64_t runway = log_file->fnode.get_allocated() - log.writer->get_effective_write_pos();
   dout(10) << __func__ << " old_log_jump_to 0x" << std::hex << old_log_jump_to
-           << " need 0x" << (old_log_jump_to + cct->_conf->bluefs_max_log_runway) << std::dec << dendl;
+           << " need 0x" << cct->_conf->bluefs_max_log_runway << std::dec << dendl;
   int r = _allocate(vselector->select_prefer_bdev(log_file->vselector_hint),
                    cct->_conf->bluefs_max_log_runway,
   int r = _allocate(vselector->select_prefer_bdev(log_file->vselector_hint),
                    cct->_conf->bluefs_max_log_runway,
-                    &log_file->fnode);
+                    0,
+                    &fnode_tail);
   ceph_assert(r == 0);
   ceph_assert(r == 0);
+
+  // 1.2 save log's fnode extents and add new extents
+  bluefs_fnode_t old_log_fnode(log_file->fnode);
+  log_file->fnode.clone_extents(fnode_tail);
   //adjust usage as flush below will need it
   //adjust usage as flush below will need it
+  vselector->sub_usage(log_file->vselector_hint, old_log_fnode);
   vselector->add_usage(log_file->vselector_hint, log_file->fnode);
   dout(10) << __func__ << " log extents " << log_file->fnode.extents << dendl;
 
   vselector->add_usage(log_file->vselector_hint, log_file->fnode);
   dout(10) << __func__ << " log extents " << log_file->fnode.extents << dendl;
 
-  // update the log file change and log a jump to the offset where we want to
+  // 1.3 update the log file change and log a jump to the offset where we want to
   // write the new entries
   // write the new entries
-  log.t.op_file_update(log_file->fnode);
-  // jump to new position should mean next seq
+  log.t.op_file_update_inc(log_file->fnode);
+
+  // 1.4 jump to new position should mean next seq
   log.t.op_jump(log.seq_live + 1, old_log_jump_to);
   uint64_t seq_now = log.seq_live;
   // we need to flush all bdev because we will be streaming all dirty files to log
   log.t.op_jump(log.seq_live + 1, old_log_jump_to);
   uint64_t seq_now = log.seq_live;
   // we need to flush all bdev because we will be streaming all dirty files to log
@@ -2615,143 +2796,203 @@ void BlueFS::_compact_log_async_LD_LNF_D() //also locks FW for new_writer
   _flush_bdev();
   _flush_and_sync_log_jump_D(old_log_jump_to, runway);
 
   _flush_bdev();
   _flush_and_sync_log_jump_D(old_log_jump_to, runway);
 
-  // out of jump section
-
-  // 2. prepare compacted log
-  bluefs_transaction_t t;
-  _compact_log_async_dump_metadata_NF(&t, seq_now);
-
-  // now state is captured to bufferlist
-  // log can be used to write to, ops in log will be continuation of captured state
+  //
+  // Part 2.
+  // Build new log starter and compacted metadata body
+  // 2.1.  Build full compacted meta transaction.
+  //       While still holding the lock, encode a bluefs transaction
+  //       that dumps all of the in-memory fnodes and names.
+  //       This might be pretty large and its allocation map can exceed
+  //       superblock size. Hence instead we'll need log starter part which
+  //       goes to superblock and refers that new meta through op_update_inc.
+  // 2.2.  After releasing the lock allocate space for the above transaction
+  //       using its size estimation.
+  //       Then build tailing list of extents which consists of these
+  //       newly allocated extents followed by ones from Part 1.
+  // 2.3.  Allocate the space required for the starter part of the new log.
+  //       It should be small enough to fit into superblock.
+  //       Effectively we start building new log fnode here.
+  // 2.4.  Store starter fnode to run-time superblock, to be written out later
+  // 2.5.  Finalize new log's fnode building
+  //       This will include log's starter and tailing extents built at 2.2
+  // 2.6.  Encode new log fnode starter,
+  //       It will include op_init, new log's op_update_inc
+  //       and jump to the compacted meta transaction beginning.
+  //       Superblock will reference this starter part
+  // 2.7.  Encode compacted meta transaction,
+  //       extend the transaction with a jump to the log tail from 1.1 before
+  //       encoding.
+  //
+
+  // 2.1 Build full compacted meta transaction
+  bluefs_transaction_t compacted_meta_t;
+  _compact_log_dump_metadata_NF(starter_seq + 1, &compacted_meta_t, 0, seq_now);
+
+  // now state is captured to compacted_meta_t,
+  // current log can be used to write to,
+  //ops in log will be continuation of captured state
+  logger->tinc(l_bluefs_compaction_lock_lat, mono_clock::now() - t0);
   log.lock.unlock();
 
   log.lock.unlock();
 
-  uint64_t max_alloc_size = std::max(alloc_size[BDEV_WAL],
-                                    std::max(alloc_size[BDEV_DB],
-                                             alloc_size[BDEV_SLOW]));
+  // 2.2 Allocate the space required for the compacted meta transaction
+  uint64_t compacted_meta_need = _estimate_transaction_size(&compacted_meta_t);
+  dout(20) << __func__ << " compacted_meta_need " << compacted_meta_need
+           << dendl;
+  {
+    bluefs_fnode_t fnode_pre_tail;
+    // do allocate
+    r = _allocate(vselector->select_prefer_bdev(log_file->vselector_hint),
+                  compacted_meta_need,
+                  0,
+                  &fnode_pre_tail);
+    ceph_assert(r == 0);
+    // build trailing list of extents in fnode_tail,
+    // this will include newly allocated extents for compacted meta
+    // and aux extents allocated at step 1.1
+    fnode_pre_tail.claim_extents(fnode_tail.extents);
+    fnode_tail.swap_extents(fnode_pre_tail);
+  }
 
 
-  // conservative estimate for final encoded size
-  new_log_jump_to = round_up_to(t.op_bl.length() + super.block_size * 2,
-                                max_alloc_size);
-  //newly constructed log head will jump to what we had before
-  t.op_jump(seq_now, new_log_jump_to);
-
-  // allocate
-  //FIXME: check if we want DB here?
-  r = _allocate(BlueFS::BDEV_DB, new_log_jump_to,
-                    &new_log->fnode);
+  // 2.3 Allocate the space required for the starter part of the new log.
+  // Start building New log fnode
+  FileRef new_log = nullptr;
+  new_log = ceph::make_ref<File>();
+  new_log->fnode.ino = log_file->fnode.ino;
+  new_log->fnode.mtime = mtime;
+  // Estimate the required space
+  uint64_t starter_need =
+    _make_initial_transaction(starter_seq, fnode_tail, 0, nullptr);
+  // and now allocate and store at new_log_fnode
+  r = _allocate(vselector->select_prefer_bdev(log_file->vselector_hint),
+                starter_need,
+                0,
+                &new_log->fnode);
   ceph_assert(r == 0);
 
   ceph_assert(r == 0);
 
-  bufferlist bl;
-  encode(t, bl);
-  _pad_bl(bl);
+  // 2.4 Store starter fnode to run-time superblock, to be written out later
+  super.log_fnode = new_log->fnode;
 
 
-  dout(10) << __func__ << " new_log_jump_to 0x" << std::hex << new_log_jump_to
-          << std::dec << dendl;
+  // 2.5 Finalize new log's fnode building
+  // start collecting new log fnode updates (to make op_update_inc later)
+  // since this point. This will include compacted meta from 2.2 and aux
+  // extents from 1.1.
+  new_log->fnode.reset_delta();
+  new_log->fnode.claim_extents(fnode_tail.extents);
 
 
-  new_log_writer = _create_writer(new_log);
+  // 2.6 Encode new log fnode
+  bufferlist starter_bl;
+  _make_initial_transaction(starter_seq, new_log->fnode, starter_need,
+    &starter_bl);
 
 
-  new_log_writer->append(bl);
-  // 3. flush
+  // 2.7 Encode compacted meta transaction,
+  dout(20) << __func__
+           << " new_log jump seq " << seq_now
+           << std::hex << " offset 0x" << starter_need + compacted_meta_need
+          << std::dec << dendl;
+  // Extent compacted_meta transaction with a just to new log tail.
+  // Hopefully "compact_meta_need" estimation provides enough extra space
+  // for this new jump, assert below if not
+  compacted_meta_t.op_jump(seq_now, starter_need + compacted_meta_need);
+  // Now do encodeing and padding
+  bufferlist compacted_meta_bl;
+  compacted_meta_bl.reserve(compacted_meta_need);
+  encode(compacted_meta_t, compacted_meta_bl);
+  ceph_assert(compacted_meta_bl.length() <= compacted_meta_need);
+  _pad_bl(compacted_meta_bl, compacted_meta_need);
+
+  //
+  // Part 3.
+  // Write out new log's content
+  // 3.1 Stage new log's content writing
+  // 3.2 Do flush and wait for completion through flush_bdev()
+  //
+
+  // 3.1 Stage new log's content writing
+  // Make new log writer and append bufferlists to write out.
+  FileWriter *new_log_writer = _create_writer(new_log);
+  // And append all new log's bufferlists to write out.
+  new_log_writer->append(starter_bl);
+  new_log_writer->append(compacted_meta_bl);
+
+  // 3.2. flush and wait
   _flush_special(new_log_writer);
   _flush_special(new_log_writer);
+  _flush_bdev(new_log_writer, false); // do not check log.lock is locked
 
 
-  // 4. wait
-  _flush_bdev(new_log_writer);
-  // 5. update our log fnode
-  // we need to append to new_log the extents that were allocated in step 1.1
-  // we do it by inverse logic - we drop 'old_log_jump_to' bytes and keep rest
-  // todo - maybe improve _allocate so we will give clear set of new allocations
-  uint64_t processed = 0;
-  mempool::bluefs::vector<bluefs_extent_t> old_extents;
-  for (auto& e : log_file->fnode.extents) {
-    if (processed + e.length <= old_log_jump_to) {
-      // drop whole extent
-      dout(10) << __func__ << " remove old log extent " << e << dendl;
-      old_extents.push_back(e);
-    } else {
-      // keep, but how much?
-      if (processed < old_log_jump_to) {
-       ceph_assert(processed + e.length > old_log_jump_to);
-       ceph_assert(old_log_jump_to - processed <= std::numeric_limits<uint32_t>::max());
-       uint32_t cut_at = uint32_t(old_log_jump_to - processed);
-       // need to cut, first half gets dropped
-       bluefs_extent_t retire(e.bdev, e.offset, cut_at);
-       old_extents.push_back(retire);
-       // second half goes to new log
-       bluefs_extent_t keep(e.bdev, e.offset + cut_at, e.length - cut_at);
-       new_log->fnode.append_extent(keep);
-       dout(10) << __func__ << " kept " << keep << " removed " << retire << dendl;
-      } else {
-       // take entire extent
-       ceph_assert(processed >= old_log_jump_to);
-       new_log->fnode.append_extent(e);
-       dout(10) << __func__ << " kept " << e << dendl;
-      }
-    }
-    processed += e.length;
-  }
-  // we will write it to super
-  new_log->fnode.reset_delta();
+  // Part 4.
+  // Write out new superblock to reflect all the changes.
+  //
 
 
-  // 6. write the super block to reflect the changes
-  dout(10) << __func__ << " writing super" << dendl;
-  new_log->fnode.ino = log_file->fnode.ino;
-  new_log->fnode.size = 0;
-  new_log->fnode.mtime = ceph_clock_now();
-  super.log_fnode = new_log->fnode;
-  ++super.version;
   _write_super(BDEV_DB);
   _flush_bdev();
 
   _write_super(BDEV_DB);
   _flush_bdev();
 
+  // Part 5.
+  // Apply new log fnode
+  //
+
+  // we need to acquire log's lock back at this point
   log.lock.lock();
   log.lock.lock();
-  // swapping log_file and new_log
+  // Reconstruct actual log object from the new one.
   vselector->sub_usage(log_file->vselector_hint, log_file->fnode);
   vselector->sub_usage(log_file->vselector_hint, log_file->fnode);
-
-  // clear the extents from old log file, they are added to new log
-  log_file->fnode.clear_extents();
-  // swap the log files. New log file is the log file now.
-  new_log->fnode.swap_extents(log_file->fnode);
-
-  log.writer->pos = log.writer->file->fnode.size =
-    log.writer->pos - old_log_jump_to + new_log_jump_to;
-
+  log_file->fnode.size =
+    log.writer->pos - old_log_jump_to + starter_need + compacted_meta_need;
+  log_file->fnode.mtime = std::max(mtime, log_file->fnode.mtime);
+  log_file->fnode.swap_extents(new_log->fnode);
+  // update log's writer
+  log.writer->pos = log.writer->file->fnode.size;
   vselector->add_usage(log_file->vselector_hint, log_file->fnode);
   vselector->add_usage(log_file->vselector_hint, log_file->fnode);
-
+  // and unlock
   log.lock.unlock();
 
   log.lock.unlock();
 
+  // we're mostly done
+  dout(10) << __func__ << " log extents " << log_file->fnode.extents << dendl;
+  logger->inc(l_bluefs_log_compactions);
+
+  //Part 6.
+  // Finalization
+  // 6.1 Permit log's extension, forbidden at step 0.
+  //
+  // 6.2 Release the new log writer
+  //
+  // 6.3 Release old space
+  //
+  // 6.4. Enable other compactions
+  //
+
+  // 6.1 Permit log's extension, forbidden at step 0.
   old_forbidden = atomic_exchange(&log_forbidden_to_expand, false);
   ceph_assert(old_forbidden == true);
   //to wake up if someone was in need of expanding log
   log_cond.notify_all();
 
   old_forbidden = atomic_exchange(&log_forbidden_to_expand, false);
   ceph_assert(old_forbidden == true);
   //to wake up if someone was in need of expanding log
   log_cond.notify_all();
 
-  // 7. release old space
-  dout(10) << __func__ << " release old log extents " << old_extents << dendl;
+  // 6.2 Release the new log writer
+  _close_writer(new_log_writer);
+  new_log_writer = nullptr;
+  new_log = nullptr;
+
+  // 6.3 Release old space
   {
   {
+    dout(10) << __func__
+             << " release old log extents " << old_log_fnode.extents
+             << dendl;
     std::lock_guard dl(dirty.lock);
     std::lock_guard dl(dirty.lock);
-    for (auto& r : old_extents) {
+    for (auto& r : old_log_fnode.extents) {
       dirty.pending_release[r.bdev].insert(r.offset, r.length);
     }
   }
 
       dirty.pending_release[r.bdev].insert(r.offset, r.length);
     }
   }
 
-  // delete the new log, remove from the dirty files list
-  _close_writer(new_log_writer);
-  new_log_writer = nullptr;
-  new_log = nullptr;
-  log_cond.notify_all();
-
-  dout(10) << __func__ << " log extents " << log_file->fnode.extents << dendl;
-  logger->inc(l_bluefs_log_compactions);
-
+  // 6.4. Enable other compactions
   old_is_comp = atomic_exchange(&log_is_compacting, false);
   ceph_assert(old_is_comp);
 }
 
   old_is_comp = atomic_exchange(&log_is_compacting, false);
   ceph_assert(old_is_comp);
 }
 
-void BlueFS::_pad_bl(bufferlist& bl)
+void BlueFS::_pad_bl(bufferlist& bl, uint64_t pad_size)
 {
 {
-  uint64_t partial = bl.length() % super.block_size;
+  pad_size = std::max(pad_size, uint64_t(super.block_size));
+  uint64_t partial = bl.length() % pad_size;
   if (partial) {
     dout(10) << __func__ << " padding with 0x" << std::hex
   if (partial) {
     dout(10) << __func__ << " padding with 0x" << std::hex
-            << super.block_size - partial << " zeros" << std::dec << dendl;
-    bl.append_zero(super.block_size - partial);
+            << pad_size - partial << " zeros" << std::dec << dendl;
+    bl.append_zero(pad_size - partial);
   }
 }
 
   }
 }
 
@@ -2832,6 +3073,7 @@ int64_t BlueFS::_maybe_extend_log()
     int r = _allocate(
       vselector->select_prefer_bdev(log.writer->file->vselector_hint),
       cct->_conf->bluefs_max_log_runway,
     int r = _allocate(
       vselector->select_prefer_bdev(log.writer->file->vselector_hint),
       cct->_conf->bluefs_max_log_runway,
+      0,
       &log.writer->file->fnode);
     ceph_assert(r == 0);
     vselector->add_usage(log.writer->file->vselector_hint, log.writer->file->fnode);
       &log.writer->file->fnode);
     ceph_assert(r == 0);
     vselector->add_usage(log.writer->file->vselector_hint, log.writer->file->fnode);
@@ -3128,6 +3370,7 @@ int BlueFS::_flush_range_F(FileWriter *h, uint64_t offset, uint64_t length)
     // in _flush_and_sync_log.
     int r = _allocate(vselector->select_prefer_bdev(h->file->vselector_hint),
                      offset + length - allocated,
     // in _flush_and_sync_log.
     int r = _allocate(vselector->select_prefer_bdev(h->file->vselector_hint),
                      offset + length - allocated,
+                      0,
                      &h->file->fnode);
     if (r < 0) {
       derr << __func__ << " allocated: 0x" << std::hex << allocated
                      &h->file->fnode);
     if (r < 0) {
       derr << __func__ << " allocated: 0x" << std::hex << allocated
@@ -3434,12 +3677,14 @@ int BlueFS::fsync(FileWriter *h)/*_WF_WD_WLD_WLNF_WNF*/
 }
 
 // be careful - either h->file->lock or log.lock must be taken
 }
 
 // be careful - either h->file->lock or log.lock must be taken
-void BlueFS::_flush_bdev(FileWriter *h)
+void BlueFS::_flush_bdev(FileWriter *h, bool check_mutext_locked)
 {
 {
-  if (h->file->fnode.ino > 1) {
-    ceph_assert(ceph_mutex_is_locked(h->lock));
-  } else if (h->file->fnode.ino == 1) {
-    ceph_assert(ceph_mutex_is_locked(log.lock));
+  if (check_mutext_locked) {
+    if (h->file->fnode.ino > 1) {
+      ceph_assert(ceph_mutex_is_locked(h->lock));
+    } else if (h->file->fnode.ino == 1) {
+      ceph_assert(ceph_mutex_is_locked(log.lock));
+    }
   }
   std::array<bool, MAX_BDEV> flush_devs = h->dirty_devs;
   h->dirty_devs.fill(false);
   }
   std::array<bool, MAX_BDEV> flush_devs = h->dirty_devs;
   h->dirty_devs.fill(false);
@@ -3484,86 +3729,107 @@ const char* BlueFS::get_device_name(unsigned id)
   return names[id];
 }
 
   return names[id];
 }
 
-int BlueFS::_allocate_without_fallback(uint8_t id, uint64_t len,
-                     PExtentVector* extents)
-{
-  dout(10) << __func__ << " len 0x" << std::hex << len << std::dec
-           << " from " << (int)id << dendl;
-  assert(id < alloc.size());
-  if (!alloc[id]) {
-    return -ENOENT;
-  }
-  extents->reserve(4);  // 4 should be (more than) enough for most allocations
-  int64_t need = round_up_to(len, alloc_size[id]);
-  int64_t alloc_len = alloc[id]->allocate(need, alloc_size[id], 0, extents);
-  if (alloc_len < 0 || alloc_len < need) {
-    if (alloc_len > 0) {
-      alloc[id]->release(*extents);
-    }
-    derr << __func__ << " unable to allocate 0x" << std::hex << need
-        << " on bdev " << (int)id
-         << ", allocator name " << alloc[id]->get_name()
-         << ", allocator type " << alloc[id]->get_type()
-         << ", capacity 0x" << alloc[id]->get_capacity()
-         << ", block size 0x" << alloc[id]->get_block_size()
-         << ", alloc size 0x" << alloc_size[id]
-         << ", free 0x" << alloc[id]->get_free()
-         << ", fragmentation " << alloc[id]->get_fragmentation()
-         << ", allocated 0x" << (alloc_len > 0 ? alloc_len : 0)
-        << std::dec << dendl;
-    alloc[id]->dump();
-    return -ENOSPC;
-  }
-  if (is_shared_alloc(id)) {
-    shared_alloc->bluefs_used += alloc_len;
-  }
-
-  return 0;
-}
-
 int BlueFS::_allocate(uint8_t id, uint64_t len,
 int BlueFS::_allocate(uint8_t id, uint64_t len,
-                     bluefs_fnode_t* node)
+                     uint64_t alloc_unit,
+                     bluefs_fnode_t* node,
+                      size_t alloc_attempts,
+                      bool permit_dev_fallback)
 {
 {
-  dout(10) << __func__ << " len 0x" << std::hex << len << std::dec
-           << " from " << (int)id << dendl;
+  dout(10) << __func__ << " len 0x" << std::hex << len
+           << " au 0x" << alloc_unit
+           << std::dec << " from " << (int)id
+           << " cooldown " << cooldown_deadline
+           << dendl;
   ceph_assert(id < alloc.size());
   int64_t alloc_len = 0;
   PExtentVector extents;
   uint64_t hint = 0;
   int64_t need = len;
   ceph_assert(id < alloc.size());
   int64_t alloc_len = 0;
   PExtentVector extents;
   uint64_t hint = 0;
   int64_t need = len;
+  bool shared = is_shared_alloc(id);
+  auto shared_unit = shared_alloc ? shared_alloc->alloc_unit : 0;
+  bool was_cooldown = false;
   if (alloc[id]) {
   if (alloc[id]) {
-    need = round_up_to(len, alloc_size[id]);
+    if (!alloc_unit) {
+      alloc_unit = alloc_size[id];
+    }
+    // do not attempt shared_allocator with bluefs alloc unit
+    // when cooling down, fallback to slow dev alloc unit.
+    if (shared && alloc_unit != shared_unit) {
+       if (duration_cast<seconds>(real_clock::now().time_since_epoch()).count() <
+           cooldown_deadline) {
+         logger->inc(l_bluefs_alloc_shared_size_fallbacks);
+         alloc_unit = shared_unit;
+         was_cooldown = true;
+       } else if (cooldown_deadline.fetch_and(0)) {
+         // we might get false cooldown_deadline reset at this point
+         // but that's mostly harmless.
+         dout(1) << __func__ << " shared allocation cooldown period elapsed"
+                 << dendl;
+       }
+    }
+    need = round_up_to(len, alloc_unit);
     if (!node->extents.empty() && node->extents.back().bdev == id) {
       hint = node->extents.back().end();
     }   
     if (!node->extents.empty() && node->extents.back().bdev == id) {
       hint = node->extents.back().end();
     }   
+    ++alloc_attempts;
     extents.reserve(4);  // 4 should be (more than) enough for most allocations
     extents.reserve(4);  // 4 should be (more than) enough for most allocations
-    alloc_len = alloc[id]->allocate(need, alloc_size[id], hint, &extents);
+    alloc_len = alloc[id]->allocate(need, alloc_unit, hint, &extents);
   }
   if (alloc_len < 0 || alloc_len < need) {
     if (alloc[id]) {
       if (alloc_len > 0) {
         alloc[id]->release(extents);
       }
   }
   if (alloc_len < 0 || alloc_len < need) {
     if (alloc[id]) {
       if (alloc_len > 0) {
         alloc[id]->release(extents);
       }
+      if (!was_cooldown && shared) {
+        auto delay_s = cct->_conf->bluefs_failed_shared_alloc_cooldown;
+        cooldown_deadline = delay_s +
+          duration_cast<seconds>(real_clock::now().time_since_epoch()).count();
+        dout(1) << __func__ << " shared allocation cooldown set for "
+                << delay_s << "s"
+                << dendl;
+      }
       dout(1) << __func__ << " unable to allocate 0x" << std::hex << need
              << " on bdev " << (int)id
               << ", allocator name " << alloc[id]->get_name()
               << ", allocator type " << alloc[id]->get_type()
               << ", capacity 0x" << alloc[id]->get_capacity()
               << ", block size 0x" << alloc[id]->get_block_size()
       dout(1) << __func__ << " unable to allocate 0x" << std::hex << need
              << " on bdev " << (int)id
               << ", allocator name " << alloc[id]->get_name()
               << ", allocator type " << alloc[id]->get_type()
               << ", capacity 0x" << alloc[id]->get_capacity()
               << ", block size 0x" << alloc[id]->get_block_size()
-              << ", alloc size 0x" << alloc_size[id]
+              << ", alloc unit 0x" << alloc_unit
               << ", free 0x" << alloc[id]->get_free()
               << ", fragmentation " << alloc[id]->get_fragmentation()
               << ", allocated 0x" << (alloc_len > 0 ? alloc_len : 0)
              << std::dec << dendl;
     } else {
               << ", free 0x" << alloc[id]->get_free()
               << ", fragmentation " << alloc[id]->get_fragmentation()
               << ", allocated 0x" << (alloc_len > 0 ? alloc_len : 0)
              << std::dec << dendl;
     } else {
-      dout(20) << __func__ << " alloc-id not set on index="<< (int)id << " unable to allocate 0x" << std::hex << need
+      dout(20) << __func__ << " alloc-id not set on index="<< (int)id
+               << " unable to allocate 0x" << std::hex << need
               << " on bdev " << (int)id << std::dec << dendl;
     }
               << " on bdev " << (int)id << std::dec << dendl;
     }
-    if (id != BDEV_SLOW) {
+    if (alloc[id] && shared && alloc_unit != shared_unit) {
+      alloc_unit = shared_unit;
+      dout(20) << __func__ << " fallback to bdev "
+              << (int)id
+               << " with alloc unit 0x" << std::hex << alloc_unit
+               << std::dec << dendl;
+      logger->inc(l_bluefs_alloc_shared_size_fallbacks);
+      return _allocate(id,
+                       len,
+                       alloc_unit,
+                       node,
+                       alloc_attempts,
+                       permit_dev_fallback);
+    } else if (permit_dev_fallback && id != BDEV_SLOW && alloc[id + 1]) {
       dout(20) << __func__ << " fallback to bdev "
               << (int)id + 1
               << dendl;
       dout(20) << __func__ << " fallback to bdev "
               << (int)id + 1
               << dendl;
-      return _allocate(id + 1, len, node);
+      if (alloc_attempts > 0 && is_shared_alloc(id + 1)) {
+        logger->inc(l_bluefs_alloc_shared_dev_fallbacks);
+      }
+      return _allocate(id + 1,
+                       len,
+                       0, // back to default alloc unit
+                       node,
+                       alloc_attempts,
+                       permit_dev_fallback);
     } else {
       derr << __func__ << " allocation failed, needed 0x" << std::hex << need
            << dendl;
     } else {
       derr << __func__ << " allocation failed, needed 0x" << std::hex << need
            << dendl;
@@ -3575,7 +3841,7 @@ int BlueFS::_allocate(uint8_t id, uint64_t len,
       logger->set(max_bytes_pcounters[id], used);
       max_bytes[id] = used;
     }
       logger->set(max_bytes_pcounters[id], used);
       max_bytes[id] = used;
     }
-    if (is_shared_alloc(id)) {
+    if (shared) {
       shared_alloc->bluefs_used += alloc_len;
     }
   }
       shared_alloc->bluefs_used += alloc_len;
     }
   }
@@ -3605,6 +3871,7 @@ int BlueFS::preallocate(FileRef f, uint64_t off, uint64_t len)/*_LF*/
     vselector->sub_usage(f->vselector_hint, f->fnode);
     int r = _allocate(vselector->select_prefer_bdev(f->vselector_hint),
       want,
     vselector->sub_usage(f->vselector_hint, f->fnode);
     int r = _allocate(vselector->select_prefer_bdev(f->vselector_hint),
       want,
+      0,
       &f->fnode);
     vselector->add_usage(f->vselector_hint, f->fnode);
     if (r < 0)
       &f->fnode);
     vselector->add_usage(f->vselector_hint, f->fnode);
     if (r < 0)
@@ -3644,11 +3911,13 @@ void BlueFS::_maybe_compact_log_LNF_NF_LD_D()
 {
   if (!cct->_conf->bluefs_replay_recovery_disable_compact &&
       _should_start_compact_log_L_N()) {
 {
   if (!cct->_conf->bluefs_replay_recovery_disable_compact &&
       _should_start_compact_log_L_N()) {
+    auto t0 = mono_clock::now();
     if (cct->_conf->bluefs_compact_log_sync) {
       _compact_log_sync_LNF_LD();
     } else {
       _compact_log_async_LD_LNF_D();
     }
     if (cct->_conf->bluefs_compact_log_sync) {
       _compact_log_sync_LNF_LD();
     } else {
       _compact_log_async_LD_LNF_D();
     }
+    logger->tinc(l_bluefs_compaction_lat, mono_clock::now() - t0);
   }
 }
 
   }
 }
 
index 3f0905a59916b48a7b5046913609a978f53113a4..736450c5e99391d16d195a0ea3a967f9794bba0e 100644 (file)
@@ -61,9 +61,12 @@ enum {
   l_bluefs_read_disk_bytes_slow,
   l_bluefs_read_prefetch_count,
   l_bluefs_read_prefetch_bytes,
   l_bluefs_read_disk_bytes_slow,
   l_bluefs_read_prefetch_count,
   l_bluefs_read_prefetch_bytes,
+  l_bluefs_compaction_lat,
+  l_bluefs_compaction_lock_lat,
+  l_bluefs_alloc_shared_dev_fallbacks,
+  l_bluefs_alloc_shared_size_fallbacks,
   l_bluefs_read_zeros_candidate,
   l_bluefs_read_zeros_errors,
   l_bluefs_read_zeros_candidate,
   l_bluefs_read_zeros_errors,
-
   l_bluefs_last,
 };
 
   l_bluefs_last,
 };
 
@@ -92,16 +95,19 @@ public:
 struct bluefs_shared_alloc_context_t {
   bool need_init = false;
   Allocator* a = nullptr;
 struct bluefs_shared_alloc_context_t {
   bool need_init = false;
   Allocator* a = nullptr;
+  uint64_t alloc_unit = 0;
 
   std::atomic<uint64_t> bluefs_used = 0;
 
 
   std::atomic<uint64_t> bluefs_used = 0;
 
-  void set(Allocator* _a) {
+  void set(Allocator* _a, uint64_t _au) {
     a = _a;
     a = _a;
+    alloc_unit = _au;
     need_init = true;
     bluefs_used = 0;
   }
   void reset() {
     a = nullptr;
     need_init = true;
     bluefs_used = 0;
   }
   void reset() {
     a = nullptr;
+    alloc_unit = 0;
   }
 };
 
   }
 };
 
@@ -331,6 +337,8 @@ private:
     l_bluefs_max_bytes_wal,
     l_bluefs_max_bytes_db,
     l_bluefs_max_bytes_slow,
     l_bluefs_max_bytes_wal,
     l_bluefs_max_bytes_db,
     l_bluefs_max_bytes_slow,
+    l_bluefs_max_bytes_wal,
+    l_bluefs_max_bytes_db,
   };
 
   // cache
   };
 
   // cache
@@ -391,6 +399,7 @@ private:
   inline bool is_shared_alloc(unsigned id) const {
     return id == shared_alloc_id;
   }
   inline bool is_shared_alloc(unsigned id) const {
     return id == shared_alloc_id;
   }
+  std::atomic<int64_t> cooldown_deadline = 0;
 
   class SocketHook;
   SocketHook* asok_hook = nullptr;
 
   class SocketHook;
   SocketHook* asok_hook = nullptr;
@@ -404,7 +413,8 @@ private:
   void _init_alloc();
   void _stop_alloc();
 
   void _init_alloc();
   void _stop_alloc();
 
-  void _pad_bl(ceph::buffer::list& bl);  ///< pad ceph::buffer::list to block size w/ zeros
+  ///< pad ceph::buffer::list to max(block size, pad_size) w/ zeros
+  void _pad_bl(ceph::buffer::list& bl, uint64_t pad_size = 0);
 
   uint64_t _get_used(unsigned id) const;
   uint64_t _get_total(unsigned id) const;
 
   uint64_t _get_used(unsigned id) const;
   uint64_t _get_total(unsigned id) const;
@@ -418,9 +428,10 @@ private:
   }
   const char* get_device_name(unsigned id);
   int _allocate(uint8_t bdev, uint64_t len,
   }
   const char* get_device_name(unsigned id);
   int _allocate(uint8_t bdev, uint64_t len,
-               bluefs_fnode_t* node);
-  int _allocate_without_fallback(uint8_t id, uint64_t len,
-                                PExtentVector* extents);
+                uint64_t alloc_unit,
+               bluefs_fnode_t* node,
+                size_t alloc_attempts = 0,
+                bool permit_dev_fallback = true);
 
   /* signal replay log to include h->file in nearest log flush */
   int _signal_dirty_to_log_D(FileWriter *h);
 
   /* signal replay log to include h->file in nearest log flush */
   int _signal_dirty_to_log_D(FileWriter *h);
@@ -447,6 +458,11 @@ private:
                               int64_t available_runway);
   int _flush_and_sync_log_LD(uint64_t want_seq = 0);
 
                               int64_t available_runway);
   int _flush_and_sync_log_LD(uint64_t want_seq = 0);
 
+  uint64_t _estimate_transaction_size(bluefs_transaction_t* t);
+  uint64_t _make_initial_transaction(uint64_t start_seq,
+                                     bluefs_fnode_t& fnode,
+                                     uint64_t expected_final_size,
+                                     bufferlist* out);
   uint64_t _estimate_log_size_N();
   bool _should_start_compact_log_L_N();
 
   uint64_t _estimate_log_size_N();
   bool _should_start_compact_log_L_N();
 
@@ -456,15 +472,15 @@ private:
     RENAME_SLOW2DB = 4,
     RENAME_DB2SLOW = 8,
   };
     RENAME_SLOW2DB = 4,
     RENAME_DB2SLOW = 8,
   };
-  void _compact_log_dump_metadata_NF(bluefs_transaction_t *t,
-                                int flags);
-  void _compact_log_async_dump_metadata_NF(bluefs_transaction_t *t,
-                                          uint64_t capture_before_seq);
+  void _compact_log_dump_metadata_NF(uint64_t start_seq,
+                                     bluefs_transaction_t *t,
+                                    int flags,
+                                    uint64_t capture_before_seq);
 
   void _compact_log_sync_LNF_LD();
   void _compact_log_async_LD_LNF_D();
 
 
   void _compact_log_sync_LNF_LD();
   void _compact_log_async_LD_LNF_D();
 
-  void _rewrite_log_and_layout_sync_LNF_LD(bool allocate_with_fallback,
+  void _rewrite_log_and_layout_sync_LNF_LD(bool permit_dev_fallback,
                                    int super_dev,
                                    int log_dev,
                                    int new_log_dev,
                                    int super_dev,
                                    int log_dev,
                                    int new_log_dev,
@@ -473,7 +489,7 @@ private:
 
   //void _aio_finish(void *priv);
 
 
   //void _aio_finish(void *priv);
 
-  void _flush_bdev(FileWriter *h);
+  void _flush_bdev(FileWriter *h, bool check_mutex_locked = true);
   void _flush_bdev();  // this is safe to call without a lock
   void _flush_bdev(std::array<bool, MAX_BDEV>& dirty_bdevs);  // this is safe to call without a lock
 
   void _flush_bdev();  // this is safe to call without a lock
   void _flush_bdev(std::array<bool, MAX_BDEV>& dirty_bdevs);  // this is safe to call without a lock
 
@@ -500,6 +516,7 @@ private:
     const char* op_name);
   int _verify_alloc_granularity(
     __u8 id, uint64_t offset, uint64_t length,
     const char* op_name);
   int _verify_alloc_granularity(
     __u8 id, uint64_t offset, uint64_t length,
+    uint64_t alloc_unit,
     const char *op);
   int _replay(bool noop, bool to_stdout = false); ///< replay journal
 
     const char *op);
   int _replay(bool noop, bool to_stdout = false); ///< replay journal
 
index 3239a825846d8bf65e7598d78d7f8fbb9c56749a..bfc6c71f4e607960ceb949aae7e9a6d9fe563e62 100644 (file)
@@ -21,6 +21,8 @@
 
 #include <boost/container/flat_set.hpp>
 #include <boost/algorithm/string.hpp>
 
 #include <boost/container/flat_set.hpp>
 #include <boost/algorithm/string.hpp>
+#include <boost/random/mersenne_twister.hpp>
+#include <boost/random/uniform_real.hpp>
 
 #include "include/cpp-btree/btree_set.h"
 
 
 #include "include/cpp-btree/btree_set.h"
 
@@ -379,6 +381,7 @@ static const char *_key_decode_prefix(const char *p, ghobject_t *oid)
   return p;
 }
 
   return p;
 }
 
+
 #define ENCODED_KEY_PREFIX_LEN (1 + 8 + 4)
 
 static int _get_key_object(const char *p, ghobject_t *oid)
 #define ENCODED_KEY_PREFIX_LEN (1 + 8 + 4)
 
 static int _get_key_object(const char *p, ghobject_t *oid)
@@ -1108,12 +1111,11 @@ struct LruOnodeCacheShard : public BlueStore::OnodeCacheShard {
 
   void _add(BlueStore::Onode* o, int level) override
   {
 
   void _add(BlueStore::Onode* o, int level) override
   {
-    if (o->put_cache()) {
+    o->set_cached();
+    if (o->pin_nref == 1) {
       (level > 0) ? lru.push_front(*o) : lru.push_back(*o);
       o->cache_age_bin = age_bins.front();
       *(o->cache_age_bin) += 1;
       (level > 0) ? lru.push_front(*o) : lru.push_back(*o);
       o->cache_age_bin = age_bins.front();
       *(o->cache_age_bin) += 1;
-    } else {
-      ++num_pinned;
     }
     ++num; // we count both pinned and unpinned entries
     dout(20) << __func__ << " " << this << " " << o->oid << " added, num="
     }
     ++num; // we count both pinned and unpinned entries
     dout(20) << __func__ << " " << this << " " << o->oid << " added, num="
@@ -1121,86 +1123,100 @@ struct LruOnodeCacheShard : public BlueStore::OnodeCacheShard {
   }
   void _rm(BlueStore::Onode* o) override
   {
   }
   void _rm(BlueStore::Onode* o) override
   {
-    if (o->pop_cache()) {
+    o->clear_cached();
+    if (o->lru_item.is_linked()) {
       *(o->cache_age_bin) -= 1;
       lru.erase(lru.iterator_to(*o));
       *(o->cache_age_bin) -= 1;
       lru.erase(lru.iterator_to(*o));
-    } else {
-      ceph_assert(num_pinned);
-      --num_pinned;
     }
     ceph_assert(num);
     --num;
     dout(20) << __func__ << " " << this << " " << " " << o->oid << " removed, num=" << num << dendl;
   }
     }
     ceph_assert(num);
     --num;
     dout(20) << __func__ << " " << this << " " << " " << o->oid << " removed, num=" << num << dendl;
   }
-  void _pin(BlueStore::Onode* o) override
-  {
-    *(o->cache_age_bin) -= 1;
-    lru.erase(lru.iterator_to(*o));
-    ++num_pinned;
-    dout(20) << __func__ << " " << this << " " << " " << " " << o->oid << " pinned" << dendl;
-  }
-  void _unpin(BlueStore::Onode* o) override
-  {
-    lru.push_front(*o);
-    o->cache_age_bin = age_bins.front();
-    *(o->cache_age_bin) += 1;
-    ceph_assert(num_pinned);
-    --num_pinned;
-    dout(20) << __func__ << " " << this << " " << " " << " " << o->oid << " unpinned" << dendl;
-  }
-  void _unpin_and_rm(BlueStore::Onode* o) override
+
+  void maybe_unpin(BlueStore::Onode* o) override
   {
   {
-    o->pop_cache();
-    ceph_assert(num_pinned);
-    --num_pinned;
-    ceph_assert(num);
-    --num;
+    OnodeCacheShard* ocs = this;
+    ocs->lock.lock();
+    // It is possible that during waiting split_cache moved us to different OnodeCacheShard.
+    while (ocs != o->c->get_onode_cache()) {
+      ocs->lock.unlock();
+      ocs = o->c->get_onode_cache();
+      ocs->lock.lock();
+    }
+    if (o->is_cached() && o->pin_nref == 1) {
+      if(!o->lru_item.is_linked()) {
+        if (o->exists) {
+         lru.push_front(*o);
+         o->cache_age_bin = age_bins.front();
+         *(o->cache_age_bin) += 1;
+         dout(20) << __func__ << " " << this << " " << o->oid << " unpinned"
+                   << dendl;
+        } else {
+         ceph_assert(num);
+         --num;
+         o->clear_cached();
+         dout(20) << __func__ << " " << this << " " << o->oid << " removed"
+                   << dendl;
+          // remove will also decrement nref
+          o->c->onode_space._remove(o->oid);
+        }
+      } else if (o->exists) {
+        // move onode within LRU
+        lru.erase(lru.iterator_to(*o));
+        lru.push_front(*o);
+        if (o->cache_age_bin != age_bins.front()) {
+          *(o->cache_age_bin) -= 1;
+          o->cache_age_bin = age_bins.front();
+          *(o->cache_age_bin) += 1;
+        }
+        dout(20) << __func__ << " " << this << " " << o->oid << " touched"
+                 << dendl;
+      }
+    }
+    ocs->lock.unlock();
   }
   }
+
   void _trim_to(uint64_t new_size) override
   {
     if (new_size >= lru.size()) {
       return; // don't even try
     } 
   void _trim_to(uint64_t new_size) override
   {
     if (new_size >= lru.size()) {
       return; // don't even try
     } 
-    uint64_t n = lru.size() - new_size;
-    auto p = lru.end();
-    ceph_assert(p != lru.begin());
-    --p;
-    ceph_assert(num >= n);
-    num -= n;
-    while (n-- > 0) {
-      BlueStore::Onode *o = &*p;
+    uint64_t n = num - new_size; // note: we might get empty LRU
+                                 // before n == 0 due to pinned
+                                 // entries. And hence being unable
+                                 // to reach new_size target.
+    while (n-- > 0 && lru.size() > 0) {
+      BlueStore::Onode *o = &lru.back();
+      lru.pop_back();
+
       dout(20) << __func__ << "  rm " << o->oid << " "
       dout(20) << __func__ << "  rm " << o->oid << " "
-               << o->nref << " " << o->cached << " " << o->pinned << dendl;
-      if (p != lru.begin()) {
-        lru.erase(p--);
+               << o->nref << " " << o->cached << dendl;
+
+      *(o->cache_age_bin) -= 1;
+      if (o->pin_nref > 1) {
+        dout(20) << __func__ << " " << this << " " << " " << " " << o->oid << dendl;
       } else {
       } else {
-        ceph_assert(n == 0);
-        lru.erase(p);
+       ceph_assert(num);
+        --num;
+        o->clear_cached();
+        o->c->onode_space._remove(o->oid);
       }
       }
-      *(o->cache_age_bin) -= 1;
-      auto pinned = !o->pop_cache();
-      ceph_assert(!pinned);
-      o->c->onode_map._remove(o->oid);
     }
   }
     }
   }
-  void move_pinned(OnodeCacheShard *to, BlueStore::Onode *o) override
+  void _move_pinned(OnodeCacheShard *to, BlueStore::Onode *o) override
   {
     if (to == this) {
       return;
     }
   {
     if (to == this) {
       return;
     }
-    ceph_assert(o->cached);
-    ceph_assert(o->pinned);
-    ceph_assert(num);
-    ceph_assert(num_pinned);
-    --num_pinned;
-    --num;
-    ++to->num_pinned;
-    ++to->num;
+    _rm(o);
+    ceph_assert(o->nref > 1);
+    to->_add(o, 0);
   }
   void add_stats(uint64_t *onodes, uint64_t *pinned_onodes) override
   {
   }
   void add_stats(uint64_t *onodes, uint64_t *pinned_onodes) override
   {
+    std::lock_guard l(lock);
     *onodes += num;
     *onodes += num;
-    *pinned_onodes += num_pinned;
+    *pinned_onodes += num - lru.size();
   }
 };
 
   }
 };
 
@@ -1921,19 +1937,19 @@ void BlueStore::BufferSpace::split(BufferCacheShard* cache, size_t pos, BlueStor
 #undef dout_prefix
 #define dout_prefix *_dout << "bluestore.OnodeSpace(" << this << " in " << cache << ") "
 
 #undef dout_prefix
 #define dout_prefix *_dout << "bluestore.OnodeSpace(" << this << " in " << cache << ") "
 
-BlueStore::OnodeRef BlueStore::OnodeSpace::add(const ghobject_t& oid,
+BlueStore::OnodeRef BlueStore::OnodeSpace::add_onode(const ghobject_t& oid,
   OnodeRef& o)
 {
   std::lock_guard l(cache->lock);
   OnodeRef& o)
 {
   std::lock_guard l(cache->lock);
-  auto p = onode_map.find(oid);
-  if (p != onode_map.end()) {
+  // add entry or return existing one
+  auto p = onode_map.emplace(oid, o);
+  if (!p.second) {
     ldout(cache->cct, 30) << __func__ << " " << oid << " " << o
     ldout(cache->cct, 30) << __func__ << " " << oid << " " << o
-                         << " raced, returning existing " << p->second
+                         << " raced, returning existing " << p.first->second
                          << dendl;
                          << dendl;
-    return p->second;
+    return p.first->second;
   }
   ldout(cache->cct, 20) << __func__ << " " << oid << " " << o << dendl;
   }
   ldout(cache->cct, 20) << __func__ << " " << oid << " " << o << dendl;
-  onode_map[oid] = o;
   cache->_add(o.get(), 1);
   cache->_trim();
   return o;
   cache->_add(o.get(), 1);
   cache->_trim();
   return o;
@@ -1954,18 +1970,16 @@ BlueStore::OnodeRef BlueStore::OnodeSpace::lookup(const ghobject_t& oid)
     std::lock_guard l(cache->lock);
     ceph::unordered_map<ghobject_t,OnodeRef>::iterator p = onode_map.find(oid);
     if (p == onode_map.end()) {
     std::lock_guard l(cache->lock);
     ceph::unordered_map<ghobject_t,OnodeRef>::iterator p = onode_map.find(oid);
     if (p == onode_map.end()) {
-      cache->logger->inc(l_bluestore_onode_misses);
       ldout(cache->cct, 30) << __func__ << " " << oid << " miss" << dendl;
       ldout(cache->cct, 30) << __func__ << " " << oid << " miss" << dendl;
+      cache->logger->inc(l_bluestore_onode_misses);
     } else {
       ldout(cache->cct, 30) << __func__ << " " << oid << " hit " << p->second
                             << " " << p->second->nref
                             << " " << p->second->cached
     } else {
       ldout(cache->cct, 30) << __func__ << " " << oid << " hit " << p->second
                             << " " << p->second->nref
                             << " " << p->second->cached
-                            << " " << p->second->pinned
                            << dendl;
       // This will pin onode and implicitly touch the cache when Onode
       // eventually will become unpinned
       o = p->second;
                            << dendl;
       // This will pin onode and implicitly touch the cache when Onode
       // eventually will become unpinned
       o = p->second;
-      ceph_assert(!o->cached || o->pinned);
 
       cache->logger->inc(l_bluestore_onode_hits);
     }
 
       cache->logger->inc(l_bluestore_onode_hits);
     }
@@ -2021,7 +2035,6 @@ void BlueStore::OnodeSpace::rename(
   // This will pin 'o' and implicitly touch cache
   // when it will eventually become unpinned
   onode_map.insert(make_pair(new_oid, o));
   // This will pin 'o' and implicitly touch cache
   // when it will eventually become unpinned
   onode_map.insert(make_pair(new_oid, o));
-  ceph_assert(o->pinned);
 
   o->oid = new_oid;
   o->key = new_okey;
 
   o->oid = new_oid;
   o->key = new_okey;
@@ -2047,7 +2060,6 @@ void BlueStore::OnodeSpace::dump(CephContext *cct)
     ldout(cct, LogLevelV) << i.first << " : " << i.second
       << " " << i.second->nref
       << " " << i.second->cached
     ldout(cct, LogLevelV) << i.first << " : " << i.second
       << " " << i.second->nref
       << " " << i.second->cached
-      << " " << i.second->pinned
       << dendl;
   }
 }
       << dendl;
   }
 }
@@ -2388,11 +2400,11 @@ void BlueStore::Blob::split(Collection *coll, uint32_t blob_offset, Blob *r)
 
 #ifndef CACHE_BLOB_BL
 void BlueStore::Blob::decode(
 
 #ifndef CACHE_BLOB_BL
 void BlueStore::Blob::decode(
-  Collection *coll,
   bufferptr::const_iterator& p,
   uint64_t struct_v,
   uint64_t* sbid,
   bufferptr::const_iterator& p,
   uint64_t struct_v,
   uint64_t* sbid,
-  bool include_ref_map)
+  bool include_ref_map,
+  Collection *coll)
 {
   denc(blob, p, struct_v);
   if (blob.is_shared()) {
 {
   denc(blob, p, struct_v);
   if (blob.is_shared()) {
@@ -2405,11 +2417,13 @@ void BlueStore::Blob::decode(
       used_in_blob.clear();
       bluestore_extent_ref_map_t legacy_ref_map;
       legacy_ref_map.decode(p);
       used_in_blob.clear();
       bluestore_extent_ref_map_t legacy_ref_map;
       legacy_ref_map.decode(p);
-      for (auto r : legacy_ref_map.ref_map) {
-        get_ref(
-          coll,
-          r.first,
-          r.second.refs * r.second.length);
+      if (coll) {
+        for (auto r : legacy_ref_map.ref_map) {
+          get_ref(
+            coll,
+            r.first,
+            r.second.refs * r.second.length);
+        }
       }
     }
   }
       }
     }
   }
@@ -2452,10 +2466,9 @@ BlueStore::OldExtent* BlueStore::OldExtent::create(CollectionRef c,
 #undef dout_context
 #define dout_context onode->c->store->cct
 
 #undef dout_context
 #define dout_context onode->c->store->cct
 
-BlueStore::ExtentMap::ExtentMap(Onode *o)
+BlueStore::ExtentMap::ExtentMap(Onode *o, size_t inline_shard_prealloc_size)
   : onode(o),
   : onode(o),
-    inline_bl(
-      o->c->store->cct->_conf->bluestore_extent_map_inline_shard_prealloc_size) {
+    inline_bl(inline_shard_prealloc_size) {
 }
 
 void BlueStore::ExtentMap::dump(Formatter* f) const
 }
 
 void BlueStore::ExtentMap::dump(Formatter* f) const
@@ -2908,9 +2921,9 @@ void BlueStore::ExtentMap::reshard(
     bool was_too_many_blobs_check = false;
     auto too_many_blobs_threshold =
       g_conf()->bluestore_debug_too_many_blobs_threshold;
     bool was_too_many_blobs_check = false;
     auto too_many_blobs_threshold =
       g_conf()->bluestore_debug_too_many_blobs_threshold;
-    auto& dumped_onodes = onode->c->onode_map.cache->dumped_onodes;
-    decltype(onode->c->onode_map.cache->dumped_onodes)::value_type* oid_slot = nullptr;
-    decltype(onode->c->onode_map.cache->dumped_onodes)::value_type* oldest_slot = nullptr;
+    auto& dumped_onodes = onode->c->onode_space.cache->dumped_onodes;
+    decltype(onode->c->onode_space.cache->dumped_onodes)::value_type* oid_slot = nullptr;
+    decltype(onode->c->onode_space.cache->dumped_onodes)::value_type* oldest_slot = nullptr;
 
     for (auto e = extent_map.lower_bound(dummy); e != extent_map.end(); ++e) {
       if (e->logical_offset >= needs_reshard_end) {
 
     for (auto e = extent_map.lower_bound(dummy); e != extent_map.end(); ++e) {
       if (e->logical_offset >= needs_reshard_end) {
@@ -3126,80 +3139,144 @@ bool BlueStore::ExtentMap::encode_some(
   return false;
 }
 
   return false;
 }
 
-unsigned BlueStore::ExtentMap::decode_some(bufferlist& bl)
+/////////////////// BlueStore::ExtentMap::DecoderExtent ///////////
+void BlueStore::ExtentMap::ExtentDecoder::decode_extent(
+  Extent* le,
+  __u8 struct_v,
+  bptr_c_it_t& p,
+  Collection* c)
 {
 {
-  /*
-  derr << __func__ << ":";
-  bl.hexdump(*_dout);
-  *_dout << dendl;
-  */
+  uint64_t blobid;
+  denc_varint(blobid, p);
+  if ((blobid & BLOBID_FLAG_CONTIGUOUS) == 0) {
+    uint64_t gap;
+    denc_varint_lowz(gap, p);
+    pos += gap;
+  }
+  le->logical_offset = pos;
+  if ((blobid & BLOBID_FLAG_ZEROOFFSET) == 0) {
+    denc_varint_lowz(le->blob_offset, p);
+  } else {
+    le->blob_offset = 0;
+  }
+  if ((blobid & BLOBID_FLAG_SAMELENGTH) == 0) {
+    denc_varint_lowz(prev_len, p);
+  }
+  le->length = prev_len;
+  if (blobid & BLOBID_FLAG_SPANNING) {
+    consume_blobid(le, true, blobid >> BLOBID_SHIFT_BITS);
+  } else {
+    blobid >>= BLOBID_SHIFT_BITS;
+    if (blobid) {
+      consume_blobid(le, false, blobid - 1);
+    } else {
+      Blob *b = new Blob();
+      uint64_t sbid = 0;
+      b->decode(p, struct_v, &sbid, false, c);
+      consume_blob(le, extent_pos, sbid, b);
+    }
+  }
+  pos += prev_len;
+  ++extent_pos;
+}
+
+unsigned BlueStore::ExtentMap::ExtentDecoder::decode_some(
+  const bufferlist& bl, Collection* c)
+{
+  __u8 struct_v;
+  uint32_t num;
 
   ceph_assert(bl.get_num_buffers() <= 1);
   auto p = bl.front().begin_deep();
 
   ceph_assert(bl.get_num_buffers() <= 1);
   auto p = bl.front().begin_deep();
-  __u8 struct_v;
   denc(struct_v, p);
   // Version 2 differs from v1 in blob's ref_map
   // serialization only. Hence there is no specific
   // handling at ExtentMap level below.
   ceph_assert(struct_v == 1 || struct_v == 2);
   denc(struct_v, p);
   // Version 2 differs from v1 in blob's ref_map
   // serialization only. Hence there is no specific
   // handling at ExtentMap level below.
   ceph_assert(struct_v == 1 || struct_v == 2);
-
-  uint32_t num;
   denc_varint(num, p);
   denc_varint(num, p);
-  vector<BlobRef> blobs(num);
-  uint64_t pos = 0;
-  uint64_t prev_len = 0;
-  unsigned n = 0;
 
 
+  extent_pos = 0;
   while (!p.end()) {
   while (!p.end()) {
-    Extent *le = new Extent();
-    uint64_t blobid;
-    denc_varint(blobid, p);
-    if ((blobid & BLOBID_FLAG_CONTIGUOUS) == 0) {
-      uint64_t gap;
-      denc_varint_lowz(gap, p);
-      pos += gap;
-    }
-    le->logical_offset = pos;
-    if ((blobid & BLOBID_FLAG_ZEROOFFSET) == 0) {
-      denc_varint_lowz(le->blob_offset, p);
-    } else {
-      le->blob_offset = 0;
-    }
-    if ((blobid & BLOBID_FLAG_SAMELENGTH) == 0) {
-      denc_varint_lowz(prev_len, p);
-    }
-    le->length = prev_len;
+    Extent* le = get_next_extent();
+    decode_extent(le, struct_v, p, c);
+    add_extent(le);
+  }
+  ceph_assert(extent_pos == num);
+  return num;
+}
 
 
-    if (blobid & BLOBID_FLAG_SPANNING) {
-      dout(30) << __func__ << "  getting spanning blob "
-              << (blobid >> BLOBID_SHIFT_BITS) << dendl;
-      le->assign_blob(get_spanning_blob(blobid >> BLOBID_SHIFT_BITS));
-    } else {
-      blobid >>= BLOBID_SHIFT_BITS;
-      if (blobid) {
-       le->assign_blob(blobs[blobid - 1]);
-       ceph_assert(le->blob);
-      } else {
-       Blob *b = new Blob();
-        uint64_t sbid = 0;
-        b->decode(onode->c, p, struct_v, &sbid, false);
-       blobs[n] = b;
-       onode->c->open_shared_blob(sbid, b);
-       le->assign_blob(b);
-      }
-      // we build ref_map dynamically for non-spanning blobs
-      le->blob->get_ref(
-       onode->c,
-       le->blob_offset,
-       le->length);
-    }
-    pos += prev_len;
-    ++n;
-    extent_map.insert(*le);
+void BlueStore::ExtentMap::ExtentDecoder::decode_spanning_blobs(
+  bptr_c_it_t& p, Collection* c)
+{
+  __u8 struct_v;
+  denc(struct_v, p);
+  // Version 2 differs from v1 in blob's ref_map
+  // serialization only. Hence there is no specific
+  // handling at ExtentMap level.
+  ceph_assert(struct_v == 1 || struct_v == 2);
+
+  unsigned n;
+  denc_varint(n, p);
+  while (n--) {
+    BlueStore::BlobRef b(new Blob());
+    denc_varint(b->id, p);
+    uint64_t sbid = 0;
+    b->decode(p, struct_v, &sbid, true, c);
+    consume_spanning_blob(sbid, b);
   }
   }
+}
 
 
-  ceph_assert(n == num);
-  return num;
+/////////////////// BlueStore::ExtentMap::DecoderExtentFull ///////////
+void BlueStore::ExtentMap::ExtentDecoderFull::consume_blobid(
+  BlueStore::Extent* le, bool spanning, uint64_t blobid) {
+  ceph_assert(le);
+  if (spanning) {
+    le->assign_blob(extent_map.get_spanning_blob(blobid));
+  } else {
+    ceph_assert(blobid < blobs.size());
+    le->assign_blob(blobs[blobid]);
+    // we build ref_map dynamically for non-spanning blobs
+    le->blob->get_ref(
+      extent_map.onode->c,
+      le->blob_offset,
+      le->length);
+  }
+}
+
+void BlueStore::ExtentMap::ExtentDecoderFull::consume_blob(
+  BlueStore::Extent* le, uint64_t extent_no, uint64_t sbid, BlobRef b) {
+  ceph_assert(le);
+  blobs.resize(extent_no + 1);
+  blobs[extent_no] = b;
+  extent_map.onode->c->open_shared_blob(sbid, b);
+  le->assign_blob(b);
+  le->blob->get_ref(
+    extent_map.onode->c,
+    le->blob_offset,
+    le->length);
+}
+
+void BlueStore::ExtentMap::ExtentDecoderFull::consume_spanning_blob(
+  uint64_t sbid, BlueStore::BlobRef b) {
+  extent_map.spanning_blob_map[b->id] = b;
+  extent_map.onode->c->open_shared_blob(sbid, b);
+}
+
+BlueStore::Extent* BlueStore::ExtentMap::ExtentDecoderFull::get_next_extent()
+{
+  return new Extent();
+}
+
+void BlueStore::ExtentMap::ExtentDecoderFull::add_extent(BlueStore::Extent* le)
+{
+  extent_map.extent_map.insert(*le);
+}
+
+unsigned BlueStore::ExtentMap::decode_some(bufferlist& bl)
+{
+  ExtentDecoderFull edecoder(*this);
+  unsigned n = edecoder.decode_some(bl, onode->c);
+  return n;
 }
 
 void BlueStore::ExtentMap::bound_encode_spanning_blobs(size_t& p)
 }
 
 void BlueStore::ExtentMap::bound_encode_spanning_blobs(size_t& p)
@@ -3235,28 +3312,6 @@ void BlueStore::ExtentMap::encode_spanning_blobs(
   }
 }
 
   }
 }
 
-void BlueStore::ExtentMap::decode_spanning_blobs(
-  bufferptr::const_iterator& p)
-{
-  __u8 struct_v;
-  denc(struct_v, p);
-  // Version 2 differs from v1 in blob's ref_map
-  // serialization only. Hence there is no specific
-  // handling at ExtentMap level.
-  ceph_assert(struct_v == 1 || struct_v == 2);
-
-  unsigned n;
-  denc_varint(n, p);
-  while (n--) {
-    BlobRef b(new Blob());
-    denc_varint(b->id, p);
-    spanning_blob_map[b->id] = b;
-    uint64_t sbid = 0;
-    b->decode(onode->c, p, struct_v, &sbid, true);
-    onode->c->open_shared_blob(sbid, b);
-  }
-}
-
 void BlueStore::ExtentMap::init_shards(bool loaded, bool dirty)
 {
   shards.resize(onode->onode.extent_map_shards.size());
 void BlueStore::ExtentMap::init_shards(bool loaded, bool dirty)
 {
   shards.resize(onode->onode.extent_map_shards.size());
@@ -3657,81 +3712,63 @@ void BlueStore::Onode::calc_omap_tail(
   out->push_back('~');
 }
 
   out->push_back('~');
 }
 
-void BlueStore::Onode::get() {
-  if (++nref >= 2 && !pinned) {
-    OnodeCacheShard* ocs = c->get_onode_cache();
-    ocs->lock.lock();
-    // It is possible that during waiting split_cache moved us to different OnodeCacheShard.
-    while (ocs != c->get_onode_cache()) {
-      ocs->lock.unlock();
-      ocs = c->get_onode_cache();
-      ocs->lock.lock();
-    }
-    bool was_pinned = pinned;
-    pinned = nref >= 2;
-    bool r = !was_pinned && pinned;
-    if (cached && r) {
-      ocs->_pin(this);
-    }
-    ocs->lock.unlock();
-  }
+void BlueStore::Onode::get()
+{
+  ++nref;
+  ++pin_nref;
 }
 }
-void BlueStore::Onode::put() {
-  ++put_nref;
-  int n = --nref;
-  if (n == 1) {
-    OnodeCacheShard* ocs = c->get_onode_cache();
-    ocs->lock.lock();
-    // It is possible that during waiting split_cache moved us to different OnodeCacheShard.
-    while (ocs != c->get_onode_cache()) {
-      ocs->lock.unlock();
-      ocs = c->get_onode_cache();
-      ocs->lock.lock();
-    }
-    bool need_unpin = pinned;
-    pinned = pinned && nref >= 2;
-    need_unpin = need_unpin && !pinned;
-    if (cached && need_unpin) {
-      if (exists) {
-        ocs->_unpin(this);
-      } else {
-        ocs->_unpin_and_rm(this);
-        // remove will also decrement nref
-        c->onode_map._remove(oid);
-      }
-    }
-    ocs->lock.unlock();
+void BlueStore::Onode::put()
+{
+  if (--pin_nref == 1) {
+    c->get_onode_cache()->maybe_unpin(this);
   }
   }
-  auto pn = --put_nref;
-  if (nref == 0 && pn == 0) {
+  if (--nref == 0) {
     delete this;
   }
 }
 
     delete this;
   }
 }
 
-BlueStore::Onode* BlueStore::Onode::decode(
-  CollectionRef c,
-  const ghobject_t& oid,
-  const string& key,
-  const bufferlist& v)
+void BlueStore::Onode::decode_raw(
+  BlueStore::Onode* on,
+  const bufferlist& v,
+  BlueStore::ExtentMap::ExtentDecoder& edecoder)
 {
 {
-  Onode* on = new Onode(c.get(), oid, key);
   on->exists = true;
   auto p = v.front().begin_deep();
   on->onode.decode(p);
   on->exists = true;
   auto p = v.front().begin_deep();
   on->onode.decode(p);
-  for (auto& i : on->onode.attrs) {
-    i.second.reassign_to_mempool(mempool::mempool_bluestore_cache_meta);
-  }
 
   // initialize extent_map
 
   // initialize extent_map
-  on->extent_map.decode_spanning_blobs(p);
+  edecoder.decode_spanning_blobs(p, on->c);
   if (on->onode.extent_map_shards.empty()) {
     denc(on->extent_map.inline_bl, p);
   if (on->onode.extent_map_shards.empty()) {
     denc(on->extent_map.inline_bl, p);
-    on->extent_map.decode_some(on->extent_map.inline_bl);
-    on->extent_map.inline_bl.reassign_to_mempool(
-      mempool::mempool_bluestore_cache_data);
+    edecoder.decode_some(on->extent_map.inline_bl, on->c);
   }
   }
-  else {
-    on->extent_map.init_shards(false, false);
+}
+
+BlueStore::Onode* BlueStore::Onode::create_decode(
+  CollectionRef c,
+  const ghobject_t& oid,
+  const string& key,
+  const bufferlist& v,
+  bool allow_empty)
+{
+  ceph_assert(v.length() || allow_empty);
+  Onode* on = new Onode(c.get(), oid, key);
+
+  if (v.length()) {
+    ExtentMap::ExtentDecoderFull edecoder(on->extent_map);
+    decode_raw(on, v, edecoder);
+
+    for (auto& i : on->onode.attrs) {
+      i.second.reassign_to_mempool(mempool::mempool_bluestore_cache_meta);
+    }
+
+    // initialize extent_map
+    if (on->onode.extent_map_shards.empty()) {
+      on->extent_map.inline_bl.reassign_to_mempool(
+        mempool::mempool_bluestore_cache_data);
+    } else {
+      on->extent_map.init_shards(false, false);
+    }
   }
   return on;
 }
   }
   return on;
 }
@@ -3930,7 +3967,7 @@ BlueStore::Collection::Collection(BlueStore *store_, OnodeCacheShard *oc, Buffer
     store(store_),
     cache(bc),
     exists(true),
     store(store_),
     cache(bc),
     exists(true),
-    onode_map(oc),
+    onode_space(oc),
     commit_queue(nullptr)
 {
 }
     commit_queue(nullptr)
 {
 }
@@ -4050,7 +4087,7 @@ BlueStore::OnodeRef BlueStore::Collection::get_onode(
     }
   }
 
     }
   }
 
-  OnodeRef o = onode_map.lookup(oid);
+  OnodeRef o = onode_space.lookup(oid);
   if (o)
     return o;
 
   if (o)
     return o;
 
@@ -4071,16 +4108,14 @@ BlueStore::OnodeRef BlueStore::Collection::get_onode(
     ceph_assert(r == -ENOENT);
     if (!create)
       return OnodeRef();
     ceph_assert(r == -ENOENT);
     if (!create)
       return OnodeRef();
-
-    // new object, new onode
-    on = new Onode(this, oid, key);
   } else {
   } else {
-    // loaded
     ceph_assert(r >= 0);
     ceph_assert(r >= 0);
-    on = Onode::decode(this, oid, key, v);
   }
   }
+
+  // new object, load onode if available
+  on = Onode::create_decode(this, oid, key, v, true);
   o.reset(on);
   o.reset(on);
-  return onode_map.add(oid, o);
+  return onode_space.add_onode(oid, o);
 }
 
 void BlueStore::Collection::split_cache(
 }
 
 void BlueStore::Collection::split_cache(
@@ -4103,8 +4138,8 @@ void BlueStore::Collection::split_cache(
   bool is_pg = dest->cid.is_pg(&destpg);
   ceph_assert(is_pg);
 
   bool is_pg = dest->cid.is_pg(&destpg);
   ceph_assert(is_pg);
 
-  auto p = onode_map.onode_map.begin();
-  while (p != onode_map.onode_map.end()) {
+  auto p = onode_space.onode_map.begin();
+  while (p != onode_space.onode_map.end()) {
     OnodeRef o = p->second;
     if (!p->second->oid.match(destbits, destpg.pgid.ps())) {
       // onode does not belong to this child
     OnodeRef o = p->second;
     if (!p->second->oid.match(destbits, destpg.pgid.ps())) {
       // onode does not belong to this child
@@ -4115,15 +4150,13 @@ void BlueStore::Collection::split_cache(
       ldout(store->cct, 20) << __func__ << " moving " << o << " " << o->oid
                            << dendl;
 
       ldout(store->cct, 20) << __func__ << " moving " << o << " " << o->oid
                            << dendl;
 
-      // ensuring that nref is always >= 2 and hence onode is pinned and 
-      // physically out of cache during the transition
+      // ensuring that nref is always >= 2 and hence onode is pinned
       OnodeRef o_pin = o;
       OnodeRef o_pin = o;
-      ceph_assert(o->pinned);
 
 
-      p = onode_map.onode_map.erase(p);
-      dest->onode_map.onode_map[o->oid] = o;
+      p = onode_space.onode_map.erase(p);
+      dest->onode_space.onode_map[o->oid] = o;
       if (o->cached) {
       if (o->cached) {
-        get_onode_cache()->move_pinned(dest->get_onode_cache(), o.get());
+        get_onode_cache()->_move_pinned(dest->get_onode_cache(), o.get());
       }
       o->c = dest;
 
       }
       o->c = dest;
 
@@ -4412,7 +4445,7 @@ void BlueStore::MempoolThread::_update_cache_settings()
 #define dout_prefix *_dout << "bluestore.OmapIteratorImpl(" << this << ") "
 
 BlueStore::OmapIteratorImpl::OmapIteratorImpl(
 #define dout_prefix *_dout << "bluestore.OmapIteratorImpl(" << this << ") "
 
 BlueStore::OmapIteratorImpl::OmapIteratorImpl(
-  CollectionRef c, OnodeRef o, KeyValueDB::Iterator it)
+  CollectionRef c, OnodeRef& o, KeyValueDB::Iterator it)
   : c(c), o(o), it(it)
 {
   std::shared_lock l(c->lock);
   : c(c), o(o), it(it)
 {
   std::shared_lock l(c->lock);
@@ -5553,7 +5586,10 @@ void BlueStore::_close_bdev()
   bdev = NULL;
 }
 
   bdev = NULL;
 }
 
-int BlueStore::_open_fm(KeyValueDB::Transaction t, bool read_only, bool fm_restore)
+int BlueStore::_open_fm(KeyValueDB::Transaction t,
+                        bool read_only,
+                        bool db_avail,
+                        bool fm_restore)
 {
   int r;
 
 {
   int r;
 
@@ -5564,19 +5600,20 @@ int BlueStore::_open_fm(KeyValueDB::Transaction t, bool read_only, bool fm_resto
   // fm restore must pass in a valid transaction
   ceph_assert(!fm_restore || (t != nullptr));
 
   // fm restore must pass in a valid transaction
   ceph_assert(!fm_restore || (t != nullptr));
 
+  // when function is called in repair mode (to_repair=true) we skip db->open()/create()
+  bool can_have_null_fm = !is_db_rotational() &&
+                          !read_only &&
+                          db_avail &&
+                          cct->_conf->bluestore_allocation_from_file &&
+                          !bdev->is_smr();
+
   // When allocation-info is stored in a single file we set freelist_type to "null"
   // When allocation-info is stored in a single file we set freelist_type to "null"
-  bool set_null_freemap = false;
-  if (freelist_type == "null") {
-    // use BitmapFreelistManager with the null option to stop allocations from going to RocksDB
-    // we will store the allocation info in a single file during umount()
-    freelist_type = "bitmap";
-    set_null_freemap = true;
+  if (can_have_null_fm) {
+    freelist_type = "null";
+    need_to_destage_allocation_file = true;
   }
   fm = FreelistManager::create(cct, freelist_type, PREFIX_ALLOC);
   ceph_assert(fm);
   }
   fm = FreelistManager::create(cct, freelist_type, PREFIX_ALLOC);
   ceph_assert(fm);
-  if (set_null_freemap) {
-    fm->set_null_manager();
-  }
   if (t) {
     // create mode. initialize freespace
     dout(20) << __func__ << " initializing freespace" << dendl;
   if (t) {
     // create mode. initialize freespace
     dout(20) << __func__ << " initializing freespace" << dendl;
@@ -5590,16 +5627,12 @@ int BlueStore::_open_fm(KeyValueDB::Transaction t, bool read_only, bool fm_resto
     ceph_assert(cct->_conf->bdev_block_size <= min_alloc_size);
 
     uint64_t alloc_size = min_alloc_size;
     ceph_assert(cct->_conf->bdev_block_size <= min_alloc_size);
 
     uint64_t alloc_size = min_alloc_size;
-#ifdef HAVE_LIBZBD
-    if (bdev->is_smr()) {
-      if (freelist_type != "zoned") {
-       derr << "SMR device but freelist_type = " << freelist_type << " (not zoned)"
-            << dendl;
-       return -EINVAL;
-      }
-    } else
-#endif
-    if (freelist_type == "zoned") {
+    if (bdev->is_smr() && freelist_type != "zoned") {
+      derr << "SMR device but freelist_type = " << freelist_type << " (not zoned)"
+           << dendl;
+      return -EINVAL;
+    }
+    if (!bdev->is_smr() && freelist_type == "zoned") {
       derr << "non-SMR device (or SMR support not built-in) but freelist_type = zoned"
           << dendl;
       return -EINVAL;
       derr << "non-SMR device (or SMR support not built-in) but freelist_type = zoned"
           << dendl;
       return -EINVAL;
@@ -5668,12 +5701,15 @@ int BlueStore::_open_fm(KeyValueDB::Transaction t, bool read_only, bool fm_resto
     r = _write_out_fm_meta(0);
     ceph_assert(r == 0);
   } else {
     r = _write_out_fm_meta(0);
     ceph_assert(r == 0);
   } else {
+    if (can_have_null_fm) {
+      commit_to_null_manager();
+    }
     r = fm->init(db, read_only,
       [&](const std::string& key, std::string* result) {
         return read_meta(key, result);
     });
     if (r < 0) {
     r = fm->init(db, read_only,
       [&](const std::string& key, std::string* result) {
         return read_meta(key, result);
     });
     if (r < 0) {
-      derr << __func__ << " freelist init failed: " << cpp_strerror(r) << dendl;
+      derr << __func__ << " failed: " << cpp_strerror(r) << dendl;
       delete fm;
       fm = NULL;
       return r;
       delete fm;
       fm = NULL;
       return r;
@@ -5762,12 +5798,12 @@ int BlueStore::_create_alloc()
       delete alloc;
       return -EINVAL;
     }
       delete alloc;
       return -EINVAL;
     }
-    shared_alloc.set(a);
+    shared_alloc.set(a, alloc_size);
   } else
 #endif
   {
     // BlueFS will share the same allocator
   } else
 #endif
   {
     // BlueFS will share the same allocator
-    shared_alloc.set(alloc);
+    shared_alloc.set(alloc, alloc_size);
   }
 
   return 0;
   }
 
   return 0;
@@ -5867,7 +5903,6 @@ int BlueStore::_init_alloc(std::map<uint64_t, uint64_t> *zone_adjustments)
       derr << __func__ << "::NCB::Please change the value of bluestore_allocation_from_file to TRUE in your ceph.conf file" << dendl;
       return -ENOTSUP; // Operation not supported
     }
       derr << __func__ << "::NCB::Please change the value of bluestore_allocation_from_file to TRUE in your ceph.conf file" << dendl;
       return -ENOTSUP; // Operation not supported
     }
-
     if (restore_allocator(alloc, &num, &bytes) == 0) {
       dout(5) << __func__ << "::NCB::restore_allocator() completed successfully alloc=" << alloc << dendl;
     } else {
     if (restore_allocator(alloc, &num, &bytes) == 0) {
       dout(5) << __func__ << "::NCB::restore_allocator() completed successfully alloc=" << alloc << dendl;
     } else {
@@ -5897,21 +5932,33 @@ int BlueStore::_init_alloc(std::map<uint64_t, uint64_t> *zone_adjustments)
 
 void BlueStore::_post_init_alloc(const std::map<uint64_t, uint64_t>& zone_adjustments)
 {
 
 void BlueStore::_post_init_alloc(const std::map<uint64_t, uint64_t>& zone_adjustments)
 {
+  int r = 0;
 #ifdef HAVE_LIBZBD
 #ifdef HAVE_LIBZBD
-  assert(bdev->is_smr());
-  dout(1) << __func__ << " adjusting freelist based on device write pointers" << dendl;
-  auto f = dynamic_cast<ZonedFreelistManager*>(fm);
-  ceph_assert(f);
-  KeyValueDB::Transaction t = db->get_transaction();
-  for (auto& i : zone_adjustments) {
-    // allocate AND release since this gap is now dead space
-    // note that the offset is imprecise, but only need to select the zone
-    f->allocate(i.first, i.second, t);
-    f->release(i.first, i.second, t);
-  }
-  int r = db->submit_transaction_sync(t);
-  ceph_assert(r == 0);
+  if (bdev->is_smr()) {
+    if (zone_adjustments.empty()) {
+      return;
+    }
+    dout(1) << __func__ << " adjusting freelist based on device write pointers" << dendl;
+    auto f = dynamic_cast<ZonedFreelistManager*>(fm);
+    ceph_assert(f);
+    KeyValueDB::Transaction t = db->get_transaction();
+    for (auto& i : zone_adjustments) {
+      // allocate AND release since this gap is now dead space
+      // note that the offset is imprecise, but only need to select the zone
+      f->allocate(i.first, i.second, t);
+      f->release(i.first, i.second, t);
+    }
+    r = db->submit_transaction_sync(t);
+  } else
 #endif
 #endif
+  if (fm->is_null_manager()) {
+    // Now that we load the allocation map we need to invalidate the file as new allocation won't be reflected
+    // Changes to the allocation map (alloc/release) are not updated inline and will only be stored on umount()
+    // This means that we should not use the existing file on failure case (unplanned shutdown) and must resort
+    //  to recovery from RocksDB::ONodes
+    r = invalidate_allocation_file_on_bluefs();
+  }
+  ceph_assert(r >= 0);
 }
 
 void BlueStore::_close_alloc()
 }
 
 void BlueStore::_close_alloc()
@@ -6079,6 +6126,12 @@ bool BlueStore::_use_rotational_settings()
   return bdev->is_rotational();
 }
 
   return bdev->is_rotational();
 }
 
+bool BlueStore::is_statfs_recoverable() const
+{
+  // abuse fm for now
+  return has_null_manager();
+}
+
 bool BlueStore::test_mount_in_use()
 {
   // most error conditions mean the mount is not in use (e.g., because
 bool BlueStore::test_mount_in_use()
 {
   // most error conditions mean the mount is not in use (e.g., because
@@ -6355,7 +6408,7 @@ int BlueStore::_open_db_and_around(bool read_only, bool to_repair)
     goto out_db;
   }
 
     goto out_db;
   }
 
-  r = _open_fm(nullptr, true);
+  r = _open_fm(nullptr, true, false);
   if (r < 0)
     goto out_db;
 
   if (r < 0)
     goto out_db;
 
@@ -6375,8 +6428,7 @@ int BlueStore::_open_db_and_around(bool read_only, bool to_repair)
     goto out_alloc;
   }
 
     goto out_alloc;
   }
 
-  if (!read_only && !zone_adjustments.empty()) {
-    // for SMR devices that have freelist mismatch with device write pointers
+  if (!read_only) {
     _post_init_alloc(zone_adjustments);
   }
 
     _post_init_alloc(zone_adjustments);
   }
 
@@ -6428,6 +6480,11 @@ void BlueStore::_close_db_and_around()
   if (db) {
     _close_db();
   }
   if (db) {
     _close_db();
   }
+  _close_around_db();
+}
+
+void BlueStore::_close_around_db()
+{
   if (bluefs) {
     _close_bluefs();
   }
   if (bluefs) {
     _close_bluefs();
   }
@@ -6452,7 +6509,11 @@ int BlueStore::open_db_environment(KeyValueDB **pdb, bool to_repair)
 
 int BlueStore::close_db_environment()
 {
 
 int BlueStore::close_db_environment()
 {
-  _close_db_and_around();
+  if (db) {
+    delete db;
+    db = nullptr;
+  }
+  _close_around_db();
   return 0;
 }
 
   return 0;
 }
 
@@ -6668,20 +6729,64 @@ int BlueStore::_open_db(bool create, bool to_repair_db, bool read_only)
   return 0;
 }
 
   return 0;
 }
 
-void BlueStore::_close_db_leave_bluefs()
+void BlueStore::_close_db()
 {
 {
+  dout(10) << __func__ << ":read_only=" << db_was_opened_read_only
+           << " fm=" << fm
+           << " destage_alloc_file=" << need_to_destage_allocation_file
+           << " per_pool=" << per_pool_stat_collection
+           << " pool stats=" << osd_pools.size()
+           << dendl;
+  bool do_destage = !db_was_opened_read_only && need_to_destage_allocation_file;
+  if (do_destage && is_statfs_recoverable()) {
+    auto t = db->get_transaction();
+    store_statfs_t s;
+    if (per_pool_stat_collection) {
+      KeyValueDB::Iterator it = db->get_iterator(PREFIX_STAT, KeyValueDB::ITERATOR_NOCACHE);
+      uint64_t pool_id;
+      for (it->upper_bound(string()); it->valid(); it->next()) {
+        int r = get_key_pool_stat(it->key(), &pool_id);
+        if (r >= 0) {
+          dout(10) << __func__ << " wiping statfs for: " << pool_id << dendl;
+        } else {
+          derr << __func__ << " wiping invalid statfs key: " << it->key() << dendl;
+        }
+        t->rmkey(PREFIX_STAT, it->key());
+      }
+
+      std::lock_guard l(vstatfs_lock);
+      for(auto &p : osd_pools) {
+        string key;
+        get_pool_stat_key(p.first, &key);
+        bufferlist bl;
+        if (!p.second.is_empty()) {
+          p.second.encode(bl);
+          p.second.publish(&s);
+          t->set(PREFIX_STAT, key, bl);
+          dout(10) << __func__ << " persisting: "
+                   << p.first << "->"  << s
+                   << dendl;
+        }
+      }
+    } else {
+      bufferlist bl;
+      {
+        std::lock_guard l(vstatfs_lock);
+        vstatfs.encode(bl);
+        vstatfs.publish(&s);
+      }
+      t->set(PREFIX_STAT, BLUESTORE_GLOBAL_STATFS_KEY, bl);
+      dout(10) << __func__ << "persisting: " << s << dendl;
+    }
+    int r = db->submit_transaction_sync(t);
+    dout(10) << __func__ << " statfs persisted." << dendl;
+    ceph_assert(r >= 0);
+  }
   ceph_assert(db);
   delete db;
   db = nullptr;
   ceph_assert(db);
   delete db;
   db = nullptr;
-}
 
 
-void BlueStore::_close_db()
-{
-  dout(10) << __func__ << ":read_only=" << db_was_opened_read_only << " fm=" << fm << " destage_alloc_file=" << need_to_destage_allocation_file << dendl;
-  _close_db_leave_bluefs();
-
-  if (need_to_destage_allocation_file) {
-    ceph_assert(fm && fm->is_null_manager());
+  if (do_destage && fm && fm->is_null_manager()) {
     int ret = store_allocator(alloc);
     if (ret != 0) {
       derr << __func__ << "::NCB::store_allocator() failed (continue with bitmapFreelistManager)" << dendl;
     int ret = store_allocator(alloc);
     if (ret != 0) {
       derr << __func__ << "::NCB::store_allocator() failed (continue with bitmapFreelistManager)" << dendl;
@@ -6828,15 +6933,17 @@ void BlueStore::_open_statfs()
         st.decode(p);
         vstatfs += st;
 
         st.decode(p);
         vstatfs += st;
 
-        dout(30) << __func__ << " pool " << pool_id
-                << " statfs " << st << dendl;
+        dout(10) << __func__ << " pool " << std::hex << pool_id
+                << " statfs(hex) " << st
+                << std::dec << dendl;
       } catch (ceph::buffer::error& e) {
         derr << __func__ << " failed to decode pool stats, key:"
              << pretty_binary_string(it->key()) << dendl;
       }   
     }
   }
       } catch (ceph::buffer::error& e) {
         derr << __func__ << " failed to decode pool stats, key:"
              << pretty_binary_string(it->key()) << dendl;
       }   
     }
   }
-  dout(30) << __func__ << " statfs " << vstatfs << dendl;
+  dout(10) << __func__ << " statfs " << std::hex
+           << vstatfs  << std::dec << dendl;
 
 }
 
 
 }
 
@@ -7104,7 +7211,7 @@ int BlueStore::mkfs()
 
   {
     KeyValueDB::Transaction t = db->get_transaction();
 
   {
     KeyValueDB::Transaction t = db->get_transaction();
-    r = _open_fm(t, true);
+    r = _open_fm(t, false, true);
     if (r < 0)
       goto out_close_db;
     {
     if (r < 0)
       goto out_close_db;
     {
@@ -7578,7 +7685,7 @@ void BlueStore::set_cache_shards(unsigned num)
 }
 
 //---------------------------------------------
 }
 
 //---------------------------------------------
-bool BlueStore::has_null_manager()
+bool BlueStore::has_null_manager() const
 {
   return (fm && fm->is_null_manager());
 }
 {
   return (fm && fm->is_null_manager());
 }
@@ -7666,11 +7773,6 @@ int BlueStore::_mount()
     dout(1) << __func__ << " quick-fix on mount" << dendl;
     _fsck_on_open(FSCK_SHALLOW, true);
 
     dout(1) << __func__ << " quick-fix on mount" << dendl;
     _fsck_on_open(FSCK_SHALLOW, true);
 
-    //reread statfs
-    //FIXME minor: replace with actual open/close?
-    _open_statfs();
-    _check_legacy_statfs_alert();
-
     //set again as hopefully it has been fixed
     if (was_per_pool_omap != OMAP_PER_PG) {
       _set_per_pool_omap();
     //set again as hopefully it has been fixed
     if (was_per_pool_omap != OMAP_PER_PG) {
       _set_per_pool_omap();
@@ -7810,110 +7912,95 @@ int BlueStore::_fsck_check_extents(
   return errors;
 }
 
   return errors;
 }
 
-void BlueStore::_fsck_check_pool_statfs(
-  BlueStore::per_pool_statfs& expected_pool_statfs,
+void BlueStore::_fsck_check_statfs(
+  const store_statfs_t& expected_statfs,
+  const per_pool_statfs& expected_pool_statfs,
   int64_t& errors,
   int64_t& warnings,
   BlueStoreRepairer* repairer)
 {
   int64_t& errors,
   int64_t& warnings,
   BlueStoreRepairer* repairer)
 {
-  auto it = db->get_iterator(PREFIX_STAT, KeyValueDB::ITERATOR_NOCACHE);
-  if (it) {
-    for (it->lower_bound(string()); it->valid(); it->next()) {
-      string key = it->key();
-      if (key == BLUESTORE_GLOBAL_STATFS_KEY) {
-        if (repairer) {
-         ++errors;
-         repairer->remove_key(db, PREFIX_STAT, BLUESTORE_GLOBAL_STATFS_KEY);
-         derr << "fsck error: " << "legacy statfs record found, removing"
-              << dendl;
-       }
-       continue;
-      }
-      uint64_t pool_id;
-      if (get_key_pool_stat(key, &pool_id) < 0) {
-       derr << "fsck error: bad key " << key
-            << "in statfs namespece" << dendl;
-       if (repairer) {
-         repairer->remove_key(db, PREFIX_STAT, key);
-       }
-       ++errors;
-       continue;
-      }
-
-      volatile_statfs vstatfs;
-      bufferlist bl = it->value();
-      auto blp = bl.cbegin();
-      try {
-       vstatfs.decode(blp);
-      } catch (ceph::buffer::error& e) {
-        derr << "fsck error: failed to decode Pool StatFS record"
-            << pretty_binary_string(key) << dendl;
+  string key;
+  store_statfs_t actual_statfs;
+  store_statfs_t s;
+  {
+    // make a copy
+    per_pool_statfs my_expected_pool_statfs(expected_pool_statfs);
+    auto op = osd_pools.begin();
+    while (op != osd_pools.end()) {
+      get_pool_stat_key(op->first, &key);
+      op->second.publish(&s);
+      auto it_expected = my_expected_pool_statfs.find(op->first);
+      if (it_expected == my_expected_pool_statfs.end()) {
+        auto op0 = op++;
+        if (op0->second.is_empty()) {
+          // It's OK to lack relevant empty statfs record
+          continue;
+        }
+        derr << __func__ << "::fsck error: " << std::hex
+             << "pool " << op0->first << " has got no statfs to match against: "
+             << s
+             << std::dec << dendl;
+        ++errors;
         if (repairer) {
         if (repairer) {
-         dout(20) << __func__ << " undecodable Pool StatFS record, key:'"
-                  << pretty_binary_string(key)
-                  << "', removing" << dendl;
+          osd_pools.erase(op0);
           repairer->remove_key(db, PREFIX_STAT, key);
         }
           repairer->remove_key(db, PREFIX_STAT, key);
         }
-        ++errors;
-       vstatfs.reset();
-      }
-      auto stat_it = expected_pool_statfs.find(pool_id);
-      if (stat_it == expected_pool_statfs.end()) {
-        if (vstatfs.is_empty()) {
-          // we don't consider that as an error since empty pool statfs
-          // are left in DB for now
-         dout(20) << "fsck inf: found empty stray Pool StatFS record for pool id 0x"
-                   << std::hex << pool_id << std::dec << dendl;
+      } else {
+        if (!(s == it_expected->second)) {
+          derr << "fsck error: actual " << s
+              << " != expected " << it_expected->second
+              << " for pool "
+              << std::hex << op->first << std::dec << dendl;
+         ++errors;
          if (repairer) {
          if (repairer) {
-           // but we need to increment error count in case of repair
-           // to have proper counters at the end
-           // (as repairer increments recovery counter anyway).
-           ++errors;
+           // repair in-memory in a hope this would be flushed properly on shutdown
+           s = it_expected->second;
+           op->second = it_expected->second;
+           repairer->fix_statfs(db, key, it_expected->second);
          }
          }
-        } else {
-         derr << "fsck error: found stray Pool StatFS record for pool id 0x"
-              << std::hex << pool_id << std::dec << dendl;
-         ++errors;
        }
        }
-       if (repairer) {
-         repairer->remove_key(db, PREFIX_STAT, key);
-       }
-       continue;
-      }
-      store_statfs_t statfs;
-      vstatfs.publish(&statfs);
-      if (!(stat_it->second == statfs)) {
-        derr << "fsck error: actual " << statfs
-            << " != expected " << stat_it->second
-            << " for pool "
-            << std::hex << pool_id << std::dec << dendl;
-       if (repairer) {
-         repairer->fix_statfs(db, key, stat_it->second);
-       }
-        ++errors;
+        actual_statfs.add(s);
+        my_expected_pool_statfs.erase(it_expected);
+        ++op;
       }
       }
-      expected_pool_statfs.erase(stat_it);
-    }
-  } // if (it)
-  for (auto& s : expected_pool_statfs) {
-    if (s.second.is_zero()) {
-      // we might lack empty statfs recs in DB
-      continue;
     }
     }
-    derr << "fsck error: missing Pool StatFS record for pool "
-        << std::hex << s.first << std::dec << dendl;
-    if (repairer) {
-      string key;
-      get_pool_stat_key(s.first, &key);
-      repairer->fix_statfs(db, key, s.second);
+    // check stats that lack matching entities in osd_pools
+    for (auto &p : my_expected_pool_statfs) {
+      if (p.second.is_zero()) {
+        // It's OK to lack relevant empty statfs record
+        continue;
+      }
+      get_pool_stat_key(p.first, &key);
+      derr << __func__ << "::fsck error: " << std::hex
+           << "pool " << p.first << " has got no actual statfs: "
+           << std::dec << p.second
+           << dendl;
+      ++errors;
+      if (repairer) {
+       osd_pools[p.first] = p.second;
+        repairer->fix_statfs(db, key, p.second);
+        actual_statfs.add(p.second);
+      }
+    }
+  }
+  // process global statfs
+  if (repairer) {
+    if (!per_pool_stat_collection) {
+      // by virtue of running this method, we correct the top-level
+      // error of having global stats
+      repairer->remove_key(db, PREFIX_STAT, BLUESTORE_GLOBAL_STATFS_KEY);
+      per_pool_stat_collection = true;
+    }
+    vstatfs = actual_statfs;
+    dout(20) << __func__ << " setting vstatfs to " << actual_statfs << dendl;
+  } else if (!per_pool_stat_collection) {
+    // check global stats only if fscking (not repairing) w/o per-pool stats
+    vstatfs.publish(&s);
+    if (!(s == expected_statfs)) {
+      derr << "fsck error: actual " << s
+           << " != expected " << expected_statfs << dendl;
+      ++errors;
     }
     }
-    ++errors;
-  }
-  if (!per_pool_stat_collection &&
-      repairer) {
-    // by virtue of running this method, we correct the top-level
-    // error of having global stats
-    repairer->inc_repaired();
   }
 }
 
   }
 }
 
@@ -7973,7 +8060,7 @@ void BlueStore::_fsck_repair_shared_blobs(
                   << dendl;
 
           OnodeRef o;
                   << dendl;
 
           OnodeRef o;
-          o.reset(Onode::decode(c, oid, it->key(), it->value()));
+          o.reset(Onode::create_decode(c, oid, it->key(), it->value()));
           o->extent_map.fault_range(db, 0, OBJECT_MAX_SIZE);
 
           _dump_onode<30>(cct, *o);
           o->extent_map.fault_range(db, 0, OBJECT_MAX_SIZE);
 
           _dump_onode<30>(cct, *o);
@@ -8112,7 +8199,7 @@ BlueStore::OnodeRef BlueStore::fsck_check_objects_shallow(
 
   dout(10) << __func__ << "  " << oid << dendl;
   OnodeRef o;
 
   dout(10) << __func__ << "  " << oid << dendl;
   OnodeRef o;
-  o.reset(Onode::decode(c, oid, key, value));
+  o.reset(Onode::create_decode(c, oid, key, value));
   ++num_objects;
 
   num_spanning_blobs += o->extent_map.spanning_blob_map.size();
   ++num_objects;
 
   num_spanning_blobs += o->extent_map.spanning_blob_map.size();
@@ -8304,6 +8391,8 @@ BlueStore::OnodeRef BlueStore::fsck_check_objects_shallow(
         if (!broken) {
           first_broken = it1->second;
           ++errors;
         if (!broken) {
           first_broken = it1->second;
           ++errors;
+          derr << "fsck error:" << " stray spanning blob found:" << it1->first
+               << dendl;
         }
         broken++;
         if (repairer) {
         }
         broken++;
         if (repairer) {
@@ -9120,7 +9209,7 @@ int BlueStore::_fsck_on_open(BlueStore::FSCKDepth depth, bool repair)
 
   mempool_dynamic_bitset used_blocks, bluefs_used_blocks;
   KeyValueDB::Iterator it;
 
   mempool_dynamic_bitset used_blocks, bluefs_used_blocks;
   KeyValueDB::Iterator it;
-  store_statfs_t expected_store_statfs, actual_statfs;
+  store_statfs_t expected_store_statfs;
   per_pool_statfs expected_pool_statfs;
 
   sb_info_space_efficient_map_t sb_info;
   per_pool_statfs expected_pool_statfs;
 
   sb_info_space_efficient_map_t sb_info;
@@ -9212,15 +9301,6 @@ int BlueStore::_fsck_on_open(BlueStore::FSCKDepth depth, bool repair)
         << dendl;
   }
 
         << dendl;
   }
 
-  // get expected statfs; reset unaffected fields to be able to compare
-  // structs
-  statfs(&actual_statfs);
-  actual_statfs.total = 0;
-  actual_statfs.internally_reserved = 0;
-  actual_statfs.available = 0;
-  actual_statfs.internal_metadata = 0;
-  actual_statfs.omap_allocated = 0;
-
   if (g_conf()->bluestore_debug_fsck_abort) {
     dout(1) << __func__ << " debug abort" << dendl;
     goto out_scan;
   if (g_conf()->bluestore_debug_fsck_abort) {
     dout(1) << __func__ << " debug abort" << dendl;
     goto out_scan;
@@ -9369,8 +9449,9 @@ int BlueStore::_fsck_on_open(BlueStore::FSCKDepth depth, bool repair)
 
   sb_ref_mismatches = sb_ref_counts.count_non_zero();
   if (sb_ref_mismatches != 0) {
 
   sb_ref_mismatches = sb_ref_counts.count_non_zero();
   if (sb_ref_mismatches != 0) {
-    derr << "fsck error: shared blob references aren't matching, at least "
-      << sb_ref_mismatches << " found" << dendl;
+    derr << "fsck error:" << "*" << sb_ref_mismatches
+         << " shared blob references aren't matching, at least "
+         << sb_ref_mismatches << " found" << dendl;
     errors += sb_ref_mismatches;
   }
 
     errors += sb_ref_mismatches;
   }
 
@@ -9509,7 +9590,7 @@ int BlueStore::_fsck_on_open(BlueStore::FSCKDepth depth, bool repair)
                  << " obj:" << oid << dendl;
 
         OnodeRef o;
                  << " obj:" << oid << dendl;
 
         OnodeRef o;
-        o.reset(Onode::decode(c, oid, it->key(), it->value()));
+        o.reset(Onode::create_decode(c, oid, it->key(), it->value()));
        o->extent_map.fault_range(db, 0, OBJECT_MAX_SIZE);
        mempool::bluestore_fsck::set<BlobRef> blobs;
 
        o->extent_map.fault_range(db, 0, OBJECT_MAX_SIZE);
        mempool::bluestore_fsck::set<BlobRef> blobs;
 
@@ -9657,23 +9738,9 @@ int BlueStore::_fsck_on_open(BlueStore::FSCKDepth depth, bool repair)
   sb_info.clear();
   sb_ref_counts.reset();
 
   sb_info.clear();
   sb_ref_counts.reset();
 
-  // check global stats only if fscking (not repairing) w/o per-pool stats
-  if (!per_pool_stat_collection &&
-      !repair &&
-      !(actual_statfs == expected_store_statfs)) {
-    derr << "fsck error: actual " << actual_statfs
-        << " != expected " << expected_store_statfs << dendl;
-    if (repair) {
-      repairer.fix_statfs(db, BLUESTORE_GLOBAL_STATFS_KEY,
-                         expected_store_statfs);
-    }
-    ++errors;
-  }
-
   dout(1) << __func__ << " checking pool_statfs" << dendl;
   dout(1) << __func__ << " checking pool_statfs" << dendl;
-  _fsck_check_pool_statfs(expected_pool_statfs,
-                         errors, warnings, repair ? &repairer : nullptr);
-
+  _fsck_check_statfs(expected_store_statfs, expected_pool_statfs,
+    errors, warnings, repair ? &repairer : nullptr);
   if (depth != FSCK_SHALLOW) {
     dout(1) << __func__ << " checking for stray omap data " << dendl;
     it = db->get_iterator(PREFIX_OMAP, KeyValueDB::ITERATOR_NOCACHE);
   if (depth != FSCK_SHALLOW) {
     dout(1) << __func__ << " checking for stray omap data " << dendl;
     it = db->get_iterator(PREFIX_OMAP, KeyValueDB::ITERATOR_NOCACHE);
@@ -10020,7 +10087,7 @@ void BlueStore::inject_stray_shared_blob_key(uint64_t sbid)
   string key;
   get_shared_blob_key(sbid, &key);
   bluestore_shared_blob_t persistent(sbid);
   string key;
   get_shared_blob_key(sbid, &key);
   bluestore_shared_blob_t persistent(sbid);
-  persistent.ref_map.get(0xdead0000, 0x1000);
+  persistent.ref_map.get(0xdead0000, min_alloc_size);
   bufferlist bl;
   encode(persistent, bl);
   dout(20) << __func__ << " sbid " << sbid
   bufferlist bl;
   encode(persistent, bl);
   dout(20) << __func__ << " sbid " << sbid
@@ -10556,7 +10623,7 @@ void BlueStore::_reap_collections()
   while (p != removed_colls.end()) {
     CollectionRef c = *p;
     dout(10) << __func__ << " " << c << " " << c->cid << dendl;
   while (p != removed_colls.end()) {
     CollectionRef c = *p;
     dout(10) << __func__ << " " << c << " " << c->cid << dendl;
-    if (c->onode_map.map_any([&](Onode* o) {
+    if (c->onode_space.map_any([&](Onode* o) {
          ceph_assert(!o->exists);
          if (o->flushing_count.load()) {
            dout(10) << __func__ << " " << c << " " << c->cid << " " << o->oid
          ceph_assert(!o->exists);
          if (o->flushing_count.load()) {
            dout(10) << __func__ << " " << c << " " << c->cid << " " << o->oid
@@ -10568,7 +10635,7 @@ void BlueStore::_reap_collections()
       ++p;
       continue;
     }
       ++p;
       continue;
     }
-    c->onode_map.clear();
+    c->onode_space.clear();
     p = removed_colls.erase(p);
     dout(10) << __func__ << " " << c << " " << c->cid << " done" << dendl;
   }
     p = removed_colls.erase(p);
     dout(10) << __func__ << " " << c << " " << c->cid << " done" << dendl;
   }
@@ -10763,7 +10830,7 @@ int BlueStore::read(
 }
 
 void BlueStore::_read_cache(
 }
 
 void BlueStore::_read_cache(
-  OnodeRef o,
+  OnodeRef& o,
   uint64_t offset,
   size_t length,
   int read_cache_policy,
   uint64_t offset,
   size_t length,
   int read_cache_policy,
@@ -10929,7 +10996,7 @@ int BlueStore::_prepare_read_ioc(
 }
 
 int BlueStore::_generate_read_result_bl(
 }
 
 int BlueStore::_generate_read_result_bl(
-  OnodeRef o,
+  OnodeRef& o,
   uint64_t offset,
   size_t length,
   ready_regions_t& ready_regions,
   uint64_t offset,
   size_t length,
   ready_regions_t& ready_regions,
@@ -11023,7 +11090,7 @@ int BlueStore::_generate_read_result_bl(
 
 int BlueStore::_do_read(
   Collection *c,
 
 int BlueStore::_do_read(
   Collection *c,
-  OnodeRef o,
+  OnodeRef& o,
   uint64_t offset,
   size_t length,
   bufferlist& bl,
   uint64_t offset,
   size_t length,
   bufferlist& bl,
@@ -11392,7 +11459,7 @@ int BlueStore::readv(
 
 int BlueStore::_do_readv(
   Collection *c,
 
 int BlueStore::_do_readv(
   Collection *c,
-  OnodeRef o,
+  OnodeRef& o,
   const interval_set<uint64_t>& m,
   bufferlist& bl,
   uint32_t op_flags,
   const interval_set<uint64_t>& m,
   bufferlist& bl,
   uint32_t op_flags,
@@ -12398,7 +12465,7 @@ int BlueStore::_upgrade_super()
   return 0;
 }
 
   return 0;
 }
 
-void BlueStore::_assign_nid(TransContext *txc, OnodeRef o)
+void BlueStore::_assign_nid(TransContext *txc, OnodeRef& o)
 {
   if (o->onode.nid) {
     ceph_assert(o->exists);
 {
   if (o->onode.nid) {
     ceph_assert(o->exists);
@@ -12470,12 +12537,14 @@ void BlueStore::_txc_update_store_statfs(TransContext *txc)
   logger->inc(l_bluestore_compressed_allocated, txc->statfs_delta.compressed_allocated());
   logger->inc(l_bluestore_compressed_original, txc->statfs_delta.compressed_original());
 
   logger->inc(l_bluestore_compressed_allocated, txc->statfs_delta.compressed_allocated());
   logger->inc(l_bluestore_compressed_original, txc->statfs_delta.compressed_original());
 
-  bufferlist bl;
-  txc->statfs_delta.encode(bl);
   if (per_pool_stat_collection) {
   if (per_pool_stat_collection) {
-    string key;
-    get_pool_stat_key(txc->osd_pool_id, &key);
-    txc->t->merge(PREFIX_STAT, key, bl);
+    if (!is_statfs_recoverable()) {
+      bufferlist bl;
+      txc->statfs_delta.encode(bl);
+      string key;
+      get_pool_stat_key(txc->osd_pool_id, &key);
+      txc->t->merge(PREFIX_STAT, key, bl);
+    }
 
     std::lock_guard l(vstatfs_lock);
     auto& stats = osd_pools[txc->osd_pool_id];
 
     std::lock_guard l(vstatfs_lock);
     auto& stats = osd_pools[txc->osd_pool_id];
@@ -12484,7 +12553,11 @@ void BlueStore::_txc_update_store_statfs(TransContext *txc)
     vstatfs += txc->statfs_delta; //non-persistent in this mode
 
   } else {
     vstatfs += txc->statfs_delta; //non-persistent in this mode
 
   } else {
-    txc->t->merge(PREFIX_STAT, BLUESTORE_GLOBAL_STATFS_KEY, bl);
+    if (!is_statfs_recoverable()) {
+      bufferlist bl;
+      txc->statfs_delta.encode(bl);
+      txc->t->merge(PREFIX_STAT, BLUESTORE_GLOBAL_STATFS_KEY, bl);
+    }
 
     std::lock_guard l(vstatfs_lock);
     vstatfs += txc->statfs_delta;
 
     std::lock_guard l(vstatfs_lock);
     vstatfs += txc->statfs_delta;
@@ -14549,7 +14622,7 @@ void BlueStore::_txc_add_transaction(TransContext *txc, Transaction *t)
 
 int BlueStore::_touch(TransContext *txc,
                      CollectionRef& c,
 
 int BlueStore::_touch(TransContext *txc,
                      CollectionRef& c,
-                     OnodeRef &o)
+                     OnodeRefo)
 {
   dout(15) << __func__ << " " << c->cid << " " << o->oid << dendl;
   int r = 0;
 {
   dout(15) << __func__ << " " << c->cid << " " << o->oid << dendl;
   int r = 0;
@@ -14624,7 +14697,7 @@ void BlueStore::_pad_zeros(
 void BlueStore::_do_write_small(
     TransContext *txc,
     CollectionRef &c,
 void BlueStore::_do_write_small(
     TransContext *txc,
     CollectionRef &c,
-    OnodeRef o,
+    OnodeRef& o,
     uint64_t offset, uint64_t length,
     bufferlist::iterator& blp,
     WriteContext *wctx)
     uint64_t offset, uint64_t length,
     bufferlist::iterator& blp,
     WriteContext *wctx)
@@ -15045,11 +15118,6 @@ void BlueStore::_do_write_small(
   return;
 }
 
   return;
 }
 
-bool BlueStore::has_null_fm()
-{
-  return fm->is_null_manager();
-}
-
 bool BlueStore::BigDeferredWriteContext::can_defer(
     BlueStore::extent_map_t::iterator ep,
     uint64_t prefer_deferred_size,
 bool BlueStore::BigDeferredWriteContext::can_defer(
     BlueStore::extent_map_t::iterator ep,
     uint64_t prefer_deferred_size,
@@ -15108,7 +15176,7 @@ bool BlueStore::BigDeferredWriteContext::apply_defer()
 void BlueStore::_do_write_big_apply_deferred(
     TransContext* txc,
     CollectionRef& c,
 void BlueStore::_do_write_big_apply_deferred(
     TransContext* txc,
     CollectionRef& c,
-    OnodeRef o,
+    OnodeRef& o,
     BlueStore::BigDeferredWriteContext& dctx,
     bufferlist::iterator& blp,
     WriteContext* wctx)
     BlueStore::BigDeferredWriteContext& dctx,
     bufferlist::iterator& blp,
     WriteContext* wctx)
@@ -15171,7 +15239,7 @@ void BlueStore::_do_write_big_apply_deferred(
 void BlueStore::_do_write_big(
     TransContext *txc,
     CollectionRef &c,
 void BlueStore::_do_write_big(
     TransContext *txc,
     CollectionRef &c,
-    OnodeRef o,
+    OnodeRef& o,
     uint64_t offset, uint64_t length,
     bufferlist::iterator& blp,
     WriteContext *wctx)
     uint64_t offset, uint64_t length,
     bufferlist::iterator& blp,
     WriteContext *wctx)
@@ -15384,7 +15452,7 @@ void BlueStore::_do_write_big(
 int BlueStore::_do_alloc_write(
   TransContext *txc,
   CollectionRef coll,
 int BlueStore::_do_alloc_write(
   TransContext *txc,
   CollectionRef coll,
-  OnodeRef o,
+  OnodeRef& o,
   WriteContext *wctx)
 {
   dout(20) << __func__ << " txc " << txc
   WriteContext *wctx)
 {
   dout(20) << __func__ << " txc " << txc
@@ -15448,6 +15516,18 @@ int BlueStore::_do_alloc_write(
 
   // compress (as needed) and calc needed space
   uint64_t need = 0;
 
   // compress (as needed) and calc needed space
   uint64_t need = 0;
+  uint64_t data_size = 0;
+  // 'need' is amount of space that must be provided by allocator.
+  // 'data_size' is a size of data that will be transferred to disk.
+  // Note that data_size is always <= need. This comes from:
+  // - write to blob was unaligned, and there is free space
+  // - data has been compressed
+  //
+  // We make one decision and apply it to all blobs.
+  // All blobs will be deferred or none will.
+  // We assume that allocator does its best to provide contiguous space,
+  // and the condition is : (data_size < deferred).
+
   auto max_bsize = std::max(wctx->target_blob_size, min_alloc_size);
   for (auto& wi : wctx->writes) {
     if (c && wi.blob_length > min_alloc_size) {
   auto max_bsize = std::max(wctx->target_blob_size, min_alloc_size);
   for (auto& wi : wctx->writes) {
     if (c && wi.blob_length > min_alloc_size) {
@@ -15494,6 +15574,7 @@ int BlueStore::_do_alloc_write(
          txc->statfs_delta.compressed_allocated() += result_len;
          logger->inc(l_bluestore_compress_success_count);
          need += result_len;
          txc->statfs_delta.compressed_allocated() += result_len;
          logger->inc(l_bluestore_compress_success_count);
          need += result_len;
+         data_size += result_len;
        } else {
          rejected = true;
        }
        } else {
          rejected = true;
        }
@@ -15506,6 +15587,7 @@ int BlueStore::_do_alloc_write(
                 << dendl;
        logger->inc(l_bluestore_compress_rejected_count);
        need += wi.blob_length;
                 << dendl;
        logger->inc(l_bluestore_compress_rejected_count);
        need += wi.blob_length;
+       data_size += wi.bl.length();
       } else {
        rejected = true;
       }
       } else {
        rejected = true;
       }
@@ -15520,6 +15602,7 @@ int BlueStore::_do_alloc_write(
                 << std::dec << dendl;
        logger->inc(l_bluestore_compress_rejected_count);
        need += wi.blob_length;
                 << std::dec << dendl;
        logger->inc(l_bluestore_compress_rejected_count);
        need += wi.blob_length;
+       data_size += wi.bl.length();
       }
       log_latency("compress@_do_alloc_write",
        l_bluestore_compress_lat,
       }
       log_latency("compress@_do_alloc_write",
        l_bluestore_compress_lat,
@@ -15527,10 +15610,11 @@ int BlueStore::_do_alloc_write(
        cct->_conf->bluestore_log_op_age );
     } else {
       need += wi.blob_length;
        cct->_conf->bluestore_log_op_age );
     } else {
       need += wi.blob_length;
+      data_size += wi.bl.length();
     }
   }
   PExtentVector prealloc;
     }
   }
   PExtentVector prealloc;
-  prealloc.reserve(2 * wctx->writes.size());;
+  prealloc.reserve(2 * wctx->writes.size());
   int64_t prealloc_left = 0;
   prealloc_left = alloc->allocate(
     need, min_alloc_size, need,
   int64_t prealloc_left = 0;
   prealloc_left = alloc->allocate(
     need, min_alloc_size, need,
@@ -15548,10 +15632,10 @@ int BlueStore::_do_alloc_write(
   }
   _collect_allocation_stats(need, min_alloc_size, prealloc);
 
   }
   _collect_allocation_stats(need, min_alloc_size, prealloc);
 
-  dout(20) << __func__ << " prealloc " << prealloc << dendl;
+  dout(20) << __func__ << std::hex << " need=0x" << need << " data=0x" << data_size
+          << " prealloc " << prealloc << dendl;
   auto prealloc_pos = prealloc.begin();
   ceph_assert(prealloc_pos != prealloc.end());
   auto prealloc_pos = prealloc.begin();
   ceph_assert(prealloc_pos != prealloc.end());
-  uint64_t prealloc_pos_length = prealloc_pos->length;
 
   for (auto& wi : wctx->writes) {
     bluestore_blob_t& dblob = wi.b->dirty_blob();
 
   for (auto& wi : wctx->writes) {
     bluestore_blob_t& dblob = wi.b->dirty_blob();
@@ -15614,20 +15698,15 @@ int BlueStore::_do_alloc_write(
 
     PExtentVector extents;
     int64_t left = final_length;
 
     PExtentVector extents;
     int64_t left = final_length;
-    bool has_chunk2defer = false;
     auto prefer_deferred_size_snapshot = prefer_deferred_size.load();
     while (left > 0) {
       ceph_assert(prealloc_left > 0);
     auto prefer_deferred_size_snapshot = prefer_deferred_size.load();
     while (left > 0) {
       ceph_assert(prealloc_left > 0);
-      has_chunk2defer |= (prealloc_pos_length < prefer_deferred_size_snapshot);
       if (prealloc_pos->length <= left) {
        prealloc_left -= prealloc_pos->length;
        left -= prealloc_pos->length;
        txc->statfs_delta.allocated() += prealloc_pos->length;
        extents.push_back(*prealloc_pos);
        ++prealloc_pos;
       if (prealloc_pos->length <= left) {
        prealloc_left -= prealloc_pos->length;
        left -= prealloc_pos->length;
        txc->statfs_delta.allocated() += prealloc_pos->length;
        extents.push_back(*prealloc_pos);
        ++prealloc_pos;
-       if (prealloc_pos != prealloc.end()) {
-         prealloc_pos_length = prealloc_pos->length;
-       }
       } else {
        extents.emplace_back(prealloc_pos->offset, left);
        prealloc_pos->offset += left;
       } else {
        extents.emplace_back(prealloc_pos->offset, left);
        prealloc_pos->offset += left;
@@ -15673,7 +15752,7 @@ int BlueStore::_do_alloc_write(
 
     // queue io
     if (!g_conf()->bluestore_debug_omit_block_device_write) {
 
     // queue io
     if (!g_conf()->bluestore_debug_omit_block_device_write) {
-      if (has_chunk2defer && l->length() < prefer_deferred_size_snapshot) {
+      if (data_size < prefer_deferred_size_snapshot) {
        dout(20) << __func__ << " deferring 0x" << std::hex
                 << l->length() << std::dec << " write via deferred" << dendl;
        bluestore_deferred_op_t *op = _get_deferred_op(txc, l->length());
        dout(20) << __func__ << " deferring 0x" << std::hex
                 << l->length() << std::dec << " write via deferred" << dendl;
        bluestore_deferred_op_t *op = _get_deferred_op(txc, l->length());
@@ -15704,7 +15783,7 @@ int BlueStore::_do_alloc_write(
 void BlueStore::_wctx_finish(
   TransContext *txc,
   CollectionRef& c,
 void BlueStore::_wctx_finish(
   TransContext *txc,
   CollectionRef& c,
-  OnodeRef o,
+  OnodeRef& o,
   WriteContext *wctx,
   set<SharedBlob*> *maybe_unshared_blobs)
 {
   WriteContext *wctx,
   set<SharedBlob*> *maybe_unshared_blobs)
 {
@@ -15829,7 +15908,7 @@ void BlueStore::_wctx_finish(
 void BlueStore::_do_write_data(
   TransContext *txc,
   CollectionRef& c,
 void BlueStore::_do_write_data(
   TransContext *txc,
   CollectionRef& c,
-  OnodeRef o,
+  OnodeRef& o,
   uint64_t offset,
   uint64_t length,
   bufferlist& bl,
   uint64_t offset,
   uint64_t length,
   bufferlist& bl,
@@ -15870,7 +15949,7 @@ void BlueStore::_do_write_data(
 
 void BlueStore::_choose_write_options(
    CollectionRef& c,
 
 void BlueStore::_choose_write_options(
    CollectionRef& c,
-   OnodeRef o,
+   OnodeRef& o,
    uint32_t fadvise_flags,
    WriteContext *wctx)
 {
    uint32_t fadvise_flags,
    WriteContext *wctx)
 {
@@ -15976,7 +16055,7 @@ void BlueStore::_choose_write_options(
 int BlueStore::_do_gc(
   TransContext *txc,
   CollectionRef& c,
 int BlueStore::_do_gc(
   TransContext *txc,
   CollectionRef& c,
-  OnodeRef o,
+  OnodeRef& o,
   const WriteContext& wctx,
   uint64_t *dirty_start,
   uint64_t *dirty_end)
   const WriteContext& wctx,
   uint64_t *dirty_start,
   uint64_t *dirty_end)
@@ -16031,7 +16110,7 @@ int BlueStore::_do_gc(
 int BlueStore::_do_write(
   TransContext *txc,
   CollectionRef& c,
 int BlueStore::_do_write(
   TransContext *txc,
   CollectionRef& c,
-  OnodeRef o,
+  OnodeRef& o,
   uint64_t offset,
   uint64_t length,
   bufferlist& bl,
   uint64_t offset,
   uint64_t length,
   bufferlist& bl,
@@ -16200,7 +16279,7 @@ int BlueStore::_do_zero(TransContext *txc,
 }
 
 void BlueStore::_do_truncate(
 }
 
 void BlueStore::_do_truncate(
-  TransContext *txc, CollectionRef& c, OnodeRef o, uint64_t offset,
+  TransContext *txc, CollectionRef& c, OnodeRef& o, uint64_t offset,
   set<SharedBlob*> *maybe_unshared_blobs)
 {
   dout(15) << __func__ << " " << c->cid << " " << o->oid
   set<SharedBlob*> *maybe_unshared_blobs)
 {
   dout(15) << __func__ << " " << c->cid << " " << o->oid
@@ -16275,7 +16354,7 @@ int BlueStore::_truncate(TransContext *txc,
 int BlueStore::_do_remove(
   TransContext *txc,
   CollectionRef& c,
 int BlueStore::_do_remove(
   TransContext *txc,
   CollectionRef& c,
-  OnodeRef o)
+  OnodeRef& o)
 {
   set<SharedBlob*> maybe_unshared_blobs;
   bool is_gen = !o->oid.is_no_gen();
 {
   set<SharedBlob*> maybe_unshared_blobs;
   bool is_gen = !o->oid.is_no_gen();
@@ -16375,7 +16454,7 @@ int BlueStore::_do_remove(
 
 int BlueStore::_remove(TransContext *txc,
                       CollectionRef& c,
 
 int BlueStore::_remove(TransContext *txc,
                       CollectionRef& c,
-                      OnodeRef &o)
+                      OnodeRefo)
 {
   dout(15) << __func__ << " " << c->cid << " " << o->oid
           << " onode " << o.get()
 {
   dout(15) << __func__ << " " << c->cid << " " << o->oid
           << " onode " << o.get()
@@ -16574,7 +16653,7 @@ int BlueStore::_omap_setkeys(TransContext *txc,
 
 int BlueStore::_omap_setheader(TransContext *txc,
                               CollectionRef& c,
 
 int BlueStore::_omap_setheader(TransContext *txc,
                               CollectionRef& c,
-                              OnodeRef &o,
+                              OnodeRefo,
                               bufferlist& bl)
 {
   dout(15) << __func__ << " " << c->cid << " " << o->oid << dendl;
                               bufferlist& bl)
 {
   dout(15) << __func__ << " " << c->cid << " " << o->oid << dendl;
@@ -16925,7 +17004,7 @@ int BlueStore::_rename(TransContext *txc,
 
   // this adjusts oldo->{oid,key}, and reset oldo to a fresh empty
   // Onode in the old slot
 
   // this adjusts oldo->{oid,key}, and reset oldo to a fresh empty
   // Onode in the old slot
-  c->onode_map.rename(oldo, old_oid, new_oid, new_okey);
+  c->onode_space.rename(oldo, old_oid, new_oid, new_okey);
   r = 0;
 
   // hold a ref to new Onode in old name position, to ensure we don't drop
   r = 0;
 
   // hold a ref to new Onode in old name position, to ensure we don't drop
@@ -17009,7 +17088,7 @@ int BlueStore::_remove_collection(TransContext *txc, const coll_t &cid,
     }
     size_t nonexistent_count = 0;
     ceph_assert((*c)->exists);
     }
     size_t nonexistent_count = 0;
     ceph_assert((*c)->exists);
-    if ((*c)->onode_map.map_any([&](Onode* o) {
+    if ((*c)->onode_space.map_any([&](Onode* o) {
       if (o->exists) {
         dout(1) << __func__ << " " << o->oid << " " << o
                << " exists in onode_map" << dendl;
       if (o->exists) {
         dout(1) << __func__ << " " << o->oid << " " << o
                << " exists in onode_map" << dendl;
@@ -17034,7 +17113,7 @@ int BlueStore::_remove_collection(TransContext *txc, const coll_t &cid,
       bool exists = (!next.is_max());
       for (auto it = ls.begin(); !exists && it < ls.end(); ++it) {
         dout(10) << __func__ << " oid " << *it << dendl;
       bool exists = (!next.is_max());
       for (auto it = ls.begin(); !exists && it < ls.end(); ++it) {
         dout(10) << __func__ << " oid " << *it << dendl;
-        auto onode = (*c)->onode_map.lookup(*it);
+        auto onode = (*c)->onode_space.lookup(*it);
         exists = !onode || onode->exists;
         if (exists) {
           dout(1) << __func__ << " " << *it
         exists = !onode || onode->exists;
         if (exists) {
           dout(1) << __func__ << " " << *it
@@ -17100,7 +17179,7 @@ int BlueStore::_split_collection(TransContext *txc,
   ceph_assert(is_pg);
 
   // the destination should initially be empty.
   ceph_assert(is_pg);
 
   // the destination should initially be empty.
-  ceph_assert(d->onode_map.empty());
+  ceph_assert(d->onode_space.empty());
   ceph_assert(d->shared_blob_set.empty());
   ceph_assert(d->cnode.bits == bits);
 
   ceph_assert(d->shared_blob_set.empty());
   ceph_assert(d->cnode.bits == bits);
 
@@ -17491,12 +17570,12 @@ void BlueStore::_shutdown_cache()
     ceph_assert(i->empty());
   }
   for (auto& p : coll_map) {
     ceph_assert(i->empty());
   }
   for (auto& p : coll_map) {
-    p.second->onode_map.clear();
+    p.second->onode_space.clear();
     if (!p.second->shared_blob_set.empty()) {
       derr << __func__ << " stray shared blobs on " << p.first << dendl;
       p.second->shared_blob_set.dump<0>(cct);
     }
     if (!p.second->shared_blob_set.empty()) {
       derr << __func__ << " stray shared blobs on " << p.first << dendl;
       p.second->shared_blob_set.dump<0>(cct);
     }
-    ceph_assert(p.second->onode_map.empty());
+    ceph_assert(p.second->onode_space.empty());
     ceph_assert(p.second->shared_blob_set.empty());
   }
   coll_map.clear();
     ceph_assert(p.second->shared_blob_set.empty());
   }
   coll_map.clear();
@@ -17539,7 +17618,7 @@ void BlueStore::_apply_padding(uint64_t head_pad,
   }
 }
 
   }
 }
 
-void BlueStore::_record_onode(OnodeRef &o, KeyValueDB::Transaction &txn)
+void BlueStore::_record_onode(OnodeRefo, KeyValueDB::Transaction &txn)
 {
   // finalize extent_map shards
   o->extent_map.update(txn, false);
 {
   // finalize extent_map shards
   o->extent_map.update(txn, false);
@@ -18309,7 +18388,7 @@ int BlueStore::invalidate_allocation_file_on_bluefs()
 {
   // mark that allocation-file was invalidated and we should destage a new copy whne closing db
   need_to_destage_allocation_file = true;
 {
   // mark that allocation-file was invalidated and we should destage a new copy whne closing db
   need_to_destage_allocation_file = true;
-  dout(10) << "need_to_destage_allocation_file was set" << dendl;
+  dout(10) << __func__ << " need_to_destage_allocation_file was set" << dendl;
 
   BlueFS::FileWriter *p_handle = nullptr;
   if (!bluefs->dir_exists(allocator_dir)) {
 
   BlueFS::FileWriter *p_handle = nullptr;
   if (!bluefs->dir_exists(allocator_dir)) {
@@ -18320,7 +18399,7 @@ int BlueStore::invalidate_allocation_file_on_bluefs()
 
   int ret = bluefs->stat(allocator_dir, allocator_file, nullptr, nullptr);
   if (ret != 0) {
 
   int ret = bluefs->stat(allocator_dir, allocator_file, nullptr, nullptr);
   if (ret != 0) {
-    dout(5) << "allocator_file(" << allocator_file << ") doesn't exist" << dendl;
+    dout(5) << __func__ << " allocator_file(" << allocator_file << ") doesn't exist" << dendl;
     // nothing to do -> return
     return 0;
   }
     // nothing to do -> return
     return 0;
   }
@@ -18328,14 +18407,16 @@ int BlueStore::invalidate_allocation_file_on_bluefs()
 
   ret = bluefs->open_for_write(allocator_dir, allocator_file, &p_handle, true);
   if (ret != 0) {
 
   ret = bluefs->open_for_write(allocator_dir, allocator_file, &p_handle, true);
   if (ret != 0) {
-    derr << "Failed open_for_write with error-code " << ret << dendl;
+    derr << __func__ << "::NCB:: Failed open_for_write with error-code "
+         << ret << dendl;
     return -1;
   }
 
   dout(5) << "invalidate using bluefs->truncate(p_handle, 0)" << dendl;
   ret = bluefs->truncate(p_handle, 0);
   if (ret != 0) {
     return -1;
   }
 
   dout(5) << "invalidate using bluefs->truncate(p_handle, 0)" << dendl;
   ret = bluefs->truncate(p_handle, 0);
   if (ret != 0) {
-    derr << "Failed truncate with error-code " << ret << dendl;
+    derr << __func__ << "::NCB:: Failed truncaste with error-code "
+         << ret << dendl;
     bluefs->close_writer(p_handle);
     return -1;
   }
     bluefs->close_writer(p_handle);
     return -1;
   }
@@ -18602,6 +18683,14 @@ int calc_allocator_image_trailer_size()
 //-----------------------------------------------------------------------------------
 int BlueStore::__restore_allocator(Allocator* allocator, uint64_t *num, uint64_t *bytes)
 {
 //-----------------------------------------------------------------------------------
 int BlueStore::__restore_allocator(Allocator* allocator, uint64_t *num, uint64_t *bytes)
 {
+  if (cct->_conf->bluestore_debug_inject_allocation_from_file_failure > 0) {
+     boost::mt11213b rng(time(NULL));
+    boost::uniform_real<> ur(0, 1);
+    if (ur(rng) < cct->_conf->bluestore_debug_inject_allocation_from_file_failure) {
+      derr << __func__ << " failure injected." << dendl;
+      return -1;
+    }
+  }
   utime_t start_time = ceph_clock_now();
   BlueFS::FileReader *p_temp_handle = nullptr;
   int ret = bluefs->open_for_read(allocator_dir, allocator_file, &p_temp_handle, false);
   utime_t start_time = ceph_clock_now();
   BlueFS::FileReader *p_temp_handle = nullptr;
   int ret = bluefs->open_for_read(allocator_dir, allocator_file, &p_temp_handle, false);
@@ -18766,228 +18855,248 @@ int BlueStore::restore_allocator(Allocator* dest_allocator, uint64_t *num, uint6
   return ret;
 }
 
   return ret;
 }
 
-//-------------------------------------------------------------------------
-void BlueStore::ExtentMap::provide_shard_info_to_onode(bufferlist v, uint32_t shard_id)
-{
-  [[maybe_unused]] auto cct  = onode->c->store->cct;
-  auto path = onode->c->store->path;
-  if (shard_id < shards.size()) {
-    auto p = &shards[shard_id];
-    if (!p->loaded) {
-      dout(30) << "opening shard 0x" << std::hex << p->shard_info->offset << std::dec << dendl;
-      p->extents = decode_some(v);
-      p->loaded = true;
-      dout(20) << "open shard 0x" << std::hex << p->shard_info->offset << std::dec << dendl;
-      ceph_assert(p->dirty == false);
-      ceph_assert(v.length() == p->shard_info->bytes);
-    }
-  } else {
-    derr << "illegal shard-id=" << shard_id << " shards.size()=" << shards.size() << dendl;
-    ceph_assert(shard_id < shards.size());
-  }
-}
-
 //-----------------------------------------------------------------------------------
 void BlueStore::set_allocation_in_simple_bmap(SimpleBitmap* sbmap, uint64_t offset, uint64_t length)
 {
 //-----------------------------------------------------------------------------------
 void BlueStore::set_allocation_in_simple_bmap(SimpleBitmap* sbmap, uint64_t offset, uint64_t length)
 {
+  dout(30) << __func__ << " 0x" << std::hex
+           << offset << "~" << length
+           << " " << min_alloc_size_mask
+           << dendl;
   ceph_assert((offset & min_alloc_size_mask) == 0);
   ceph_assert((length & min_alloc_size_mask) == 0);
   sbmap->set(offset >> min_alloc_size_order, length >> min_alloc_size_order);
 }
 
   ceph_assert((offset & min_alloc_size_mask) == 0);
   ceph_assert((length & min_alloc_size_mask) == 0);
   sbmap->set(offset >> min_alloc_size_order, length >> min_alloc_size_order);
 }
 
-//---------------------------------------------------------
-// Process all physical extents from a given Onode (including all its shards)
-void BlueStore::read_allocation_from_single_onode(
-  SimpleBitmap*        sbmap,
-  BlueStore::OnodeRef& onode_ref,
-  read_alloc_stats_t&  stats)
-{
-  // create a map holding all physical-extents of this Onode to prevent duplication from being added twice and more
-  std::unordered_map<uint64_t, uint32_t> lcl_extnt_map;
-  unsigned blobs_count = 0;
-  uint64_t pos = 0;
+void BlueStore::ExtentDecoderPartial::_consume_new_blob(bool spanning,
+                                                        uint64_t extent_no,
+                                                        uint64_t sbid,
+                                                        BlobRef b)
+{
+  [[maybe_unused]] auto cct = store.cct;
+  ceph_assert(per_pool_statfs);
+  ceph_assert(oid != ghobject_t());
 
 
-  stats.spanning_blob_count += onode_ref->extent_map.spanning_blob_map.size();
-  // first iterate over all logical-extents
-  for (struct Extent& l_extent : onode_ref->extent_map.extent_map) {
-    ceph_assert(l_extent.logical_offset >= pos);
+  auto &blob = b->get_blob();
+  if(spanning) {
+    dout(20) << __func__ << " " << spanning << " " << b->id << dendl;
+    ceph_assert(b->id >= 0);
+    spanning_blobs[b->id] = b;
+    ++stats.spanning_blob_count;
+  } else {
+    dout(20) << __func__ << " " << spanning << " " << extent_no << dendl;
+    blobs[extent_no] = b;
+  }
+  bool compressed = blob.is_compressed();
+  if (!blob.is_shared()) {
+    for (auto& pe : blob.get_extents()) {
+      if (pe.offset == bluestore_pextent_t::INVALID_OFFSET) {
+        ++stats.skipped_illegal_extent;
+        continue;
+      }
+      store.set_allocation_in_simple_bmap(&sbmap, pe.offset, pe.length);
 
 
-    pos = l_extent.logical_offset + l_extent.length;
-    ceph_assert(l_extent.blob);
-    const bluestore_blob_t& blob         = l_extent.blob->get_blob();
-    const PExtentVector&    p_extent_vec = blob.get_extents();
-    blobs_count++;
-    if (blob.is_compressed()) {
-      stats.compressed_blob_count++;
+      per_pool_statfs->allocated() += pe.length;
+      if (compressed) {
+        per_pool_statfs->compressed_allocated() += pe.length;
+      }
     }
     }
-
-    if (blob.is_shared()) {
-      stats.shared_blobs_count++;
+    if (compressed) {
+      per_pool_statfs->compressed() +=
+        blob.get_compressed_payload_length();
+      ++stats.compressed_blob_count;
     }
     }
-
-    // process all physical extent in this blob
-    for (auto p_extent = p_extent_vec.begin(); p_extent != p_extent_vec.end(); p_extent++) {
-      auto offset = p_extent->offset;
-      auto length = p_extent->length;
-
-      // Offset of -1 means that the extent was removed (and it is only a place holder) and can be safely skipped
-      if (offset == (uint64_t)-1) {
-       stats.skipped_illegal_extent++;
-       continue;
+  } else {
+    auto it = sb_info.find(sbid);
+    if (it == sb_info.end()) {
+      derr << __func__ << " shared blob not found:" << sbid
+           << dendl;
+    }
+    auto &sbi = *it;
+    auto pool_id = oid.hobj.get_logical_pool();
+    if (sbi.pool_id == sb_info_t::INVALID_POOL_ID) {
+      sbi.pool_id = pool_id;
+      size_t alloc_delta = sbi.allocated_chunks << min_alloc_size_order;
+      per_pool_statfs->allocated() += alloc_delta;
+      if (compressed) {
+        per_pool_statfs->compressed_allocated() += alloc_delta;
+        ++stats.compressed_blob_count;
       }
       }
+    }
+    if (compressed) {
+      per_pool_statfs->compressed() +=
+        blob.get_compressed_payload_length();
+    }
+  }
+}
 
 
-      if (!blob.is_shared()) {
-       // skip repeating extents
-       auto lcl_itr = lcl_extnt_map.find(offset);
-       // extents using shared blobs might have differnt length
-       if (lcl_itr != lcl_extnt_map.end() ) {
-         // repeated extents must have the same length!
-         ceph_assert(lcl_extnt_map[offset] == length);
-         stats.skipped_repeated_extent++;
-       } else {
-         lcl_extnt_map[offset] = length;
-         set_allocation_in_simple_bmap(sbmap, offset, length);
-         stats.extent_count++;
-       }
-      } else {
-       // extents using shared blobs might have differnt length
-       set_allocation_in_simple_bmap(sbmap, offset, length);
-       stats.extent_count++;
-      }
+void BlueStore::ExtentDecoderPartial::consume_blobid(Extent* le,
+                                                     bool spanning,
+                                                     uint64_t blobid)
+{
+  [[maybe_unused]] auto cct = store.cct;
+  dout(20) << __func__ << " " << spanning << " " << blobid << dendl;
+  auto &map = spanning ? spanning_blobs : blobs;
+  auto it = map.find(blobid);
+  ceph_assert(it != map.end());
+  per_pool_statfs->stored() += le->length;
+  if (it->second->get_blob().is_compressed()) {
+    per_pool_statfs->compressed_original() += le->length;
+  }
+}
 
 
-    } // physical-extents loop
+void BlueStore::ExtentDecoderPartial::consume_blob(Extent* le,
+                                                   uint64_t extent_no,
+                                                   uint64_t sbid,
+                                                   BlobRef b)
+{
+  _consume_new_blob(false, extent_no, sbid, b);
+  per_pool_statfs->stored() += le->length;
+  if (b->get_blob().is_compressed()) {
+    per_pool_statfs->compressed_original() += le->length;
+  }
+}
 
 
-  } // logical-extents loop
+void BlueStore::ExtentDecoderPartial::consume_spanning_blob(uint64_t sbid,
+                                                            BlobRef b)
+{
+  _consume_new_blob(true, 0/*doesn't matter*/, sbid, b);
+}
 
 
-  if (blobs_count < MAX_BLOBS_IN_ONODE) {
-    stats.blobs_in_onode[blobs_count]++;
-  } else {
-    // store all counts higher than MAX_BLOBS_IN_ONODE in a single bucket at offset zero
-    stats.blobs_in_onode[MAX_BLOBS_IN_ONODE]++;
-  }
+void BlueStore::ExtentDecoderPartial::reset(const ghobject_t _oid,
+                                            volatile_statfs* _per_pool_statfs)
+{
+  oid = _oid;
+  per_pool_statfs = _per_pool_statfs;
+  blob_map_t empty;
+  blob_map_t empty2;
+  std::swap(blobs, empty);
+  std::swap(spanning_blobs, empty2);
 }
 
 }
 
-//-------------------------------------------------------------------------
 int BlueStore::read_allocation_from_onodes(SimpleBitmap *sbmap, read_alloc_stats_t& stats)
 {
 int BlueStore::read_allocation_from_onodes(SimpleBitmap *sbmap, read_alloc_stats_t& stats)
 {
-  // finally add all space take by user data
-  auto it = db->get_iterator(PREFIX_OBJ, KeyValueDB::ITERATOR_NOCACHE);
+  sb_info_space_efficient_map_t sb_info;
+  // iterate over all shared blobs
+  auto it = db->get_iterator(PREFIX_SHARED_BLOB, KeyValueDB::ITERATOR_NOCACHE);
   if (!it) {
   if (!it) {
-    // TBD - find a better error code
-    derr << "failed db->get_iterator(PREFIX_OBJ)" << dendl;
-    return -1;
+    derr << "failed getting shared blob's iterator" << dendl;
+    return -ENOENT;
+  }
+  if (it) {
+    for (it->lower_bound(string()); it->valid(); it->next()) {
+      const auto& key = it->key();
+      dout(20) << __func__ << " decode sb " << pretty_binary_string(key) << dendl;
+      uint64_t sbid = 0;
+      if (get_key_shared_blob(key, &sbid) != 0) {
+       derr << __func__ << " bad shared blob key '" << pretty_binary_string(key)
+            << "'" << dendl;
+      }
+      bluestore_shared_blob_t shared_blob(sbid);
+      bufferlist bl = it->value();
+      auto blp = bl.cbegin();
+      try {
+        decode(shared_blob, blp);
+      }
+      catch (ceph::buffer::error& e) {
+       derr << __func__ << " failed to decode Shared Blob"
+            << pretty_binary_string(key) << dendl;
+       continue;
+      }
+      dout(20) << __func__ << "  " << shared_blob << dendl;
+      uint64_t allocated = 0;
+      for (auto& r : shared_blob.ref_map.ref_map) {
+        ceph_assert(r.first != bluestore_pextent_t::INVALID_OFFSET);
+        set_allocation_in_simple_bmap(sbmap, r.first, r.second.length);
+        allocated += r.second.length;
+      }
+      auto &sbi = sb_info.add_or_adopt(sbid);
+      ceph_assert(p2phase(allocated, min_alloc_size) == 0);
+      sbi.allocated_chunks += (allocated >> min_alloc_size_order);
+      ++stats.shared_blob_count;
+    }
+  }
+
+  it = db->get_iterator(PREFIX_OBJ, KeyValueDB::ITERATOR_NOCACHE);
+  if (!it) {
+    derr << "failed getting onode's iterator" << dendl;
+    return -ENOENT;
   }
 
   }
 
-  CollectionRef       collection_ref;
-  spg_t               pgid;
-  BlueStore::OnodeRef onode_ref;
-  bool                has_open_onode = false;
-  uint32_t            shard_id       = 0;
   uint64_t            kv_count       = 0;
   uint64_t            count_interval = 1'000'000;
   uint64_t            kv_count       = 0;
   uint64_t            count_interval = 1'000'000;
+  ExtentDecoderPartial edecoder(*this,
+                                stats,
+                                *sbmap,
+                                sb_info,
+                                min_alloc_size_order);
+
   // iterate over all ONodes stored in RocksDB
   for (it->lower_bound(string()); it->valid(); it->next(), kv_count++) {
     // trace an even after every million processed objects (typically every 5-10 seconds)
     if (kv_count && (kv_count % count_interval == 0) ) {
   // iterate over all ONodes stored in RocksDB
   for (it->lower_bound(string()); it->valid(); it->next(), kv_count++) {
     // trace an even after every million processed objects (typically every 5-10 seconds)
     if (kv_count && (kv_count % count_interval == 0) ) {
-      dout(5) << "processed objects count = " << kv_count << dendl;
-    }
-
-    // Shards - Code
-    // add the extents from the shards to the main Obj
-    if (is_extent_shard_key(it->key())) {
-      // shards must follow a valid main object
-      if (has_open_onode) {
-       // shards keys must start with the main object key
-       if (it->key().find(onode_ref->key) == 0) {
-         // shards count can't exceed declared shard-count in the main-object
-         if (shard_id < onode_ref->extent_map.shards.size()) {
-           onode_ref->extent_map.provide_shard_info_to_onode(it->value(), shard_id);
-           stats.shard_count++;
-           shard_id++;
-         } else {
-           derr << "illegal shard_id=" << shard_id << ", shards.size()=" << onode_ref->extent_map.shards.size() << dendl;
-           derr << "shard->key=" << pretty_binary_string(it->key()) << dendl;
-           ceph_assert(shard_id < onode_ref->extent_map.shards.size());
-         }
-       } else {
-         derr << "illegal shard-key::onode->key=" << pretty_binary_string(onode_ref->key) << " shard->key=" << pretty_binary_string(it->key()) << dendl;
-         ceph_assert(it->key().find(onode_ref->key) == 0);
-       }
-      } else {
-       derr << "error::shard without main objects for key=" << pretty_binary_string(it->key()) << dendl;
-       ceph_assert(has_open_onode);
-      }
-
-    } else {
-      // Main Object Code
+      dout(5) << __func__ << " processed objects count = " << kv_count << dendl;
+    }
 
 
-      if (has_open_onode) {
-       // make sure we got all shards of this object
-       if (shard_id == onode_ref->extent_map.shards.size()) {
-         // We completed an Onode Object -> pass it to be processed
-         read_allocation_from_single_onode(sbmap, onode_ref, stats);
-       } else {
-         derr << "Missing shards! shard_id=" << shard_id << ", shards.size()=" << onode_ref->extent_map.shards.size() << dendl;
-         ceph_assert(shard_id == onode_ref->extent_map.shards.size());
-       }
-      } else {
-       // We opened a new Object
-       has_open_onode =  true;
+    auto key = it->key();
+    auto okey = key;
+    dout(20) << __func__ << " decode onode " << pretty_binary_string(key) << dendl;
+    ghobject_t oid;
+    if (!is_extent_shard_key(it->key())) {
+      int r = get_key_object(okey, &oid);
+      if (r != 0) {
+        derr << __func__ << " failed to decode onode key = "
+             << pretty_binary_string(okey) << dendl;
+        return -EIO;
       }
       }
-
-      // The main Obj is always first in RocksDB so we can start with shard_id set to zero
-      shard_id = 0;
-      stats.onode_count++;
-      ghobject_t oid;
-      int ret = get_key_object(it->key(), &oid);
-      if (ret < 0) {
-       derr << "bad object key " << pretty_binary_string(it->key()) << dendl;
-       ceph_assert(ret == 0);
-       continue;
+      edecoder.reset(oid,
+        &stats.actual_pool_vstatfs[oid.hobj.get_logical_pool()]);
+      Onode dummy_on(cct);
+      Onode::decode_raw(&dummy_on,
+        it->value(),
+        edecoder);
+      ++stats.onode_count;
+    } else {
+      uint32_t offset;
+      int r = get_key_extent_shard(key, &okey, &offset);
+      if (r != 0) {
+        derr << __func__ << " failed to decode onode extent key = "
+             << pretty_binary_string(key) << dendl;
+        return -EIO;
       }
       }
-
-      // fill collection_ref if doesn't exist yet
-      // We process all the obejcts in a given collection and then move to the next collection
-      // This means we only search once for every given collection
-      if (!collection_ref                                     ||
-         oid.shard_id                != pgid.shard           ||
-         oid.hobj.get_logical_pool() != (int64_t)pgid.pool() ||
-         !collection_ref->contains(oid)) {
-       stats.collection_search++;
-       collection_ref = nullptr;
-
-       for (auto& p : coll_map) {
-         if (p.second->contains(oid)) {
-           collection_ref = p.second;
-           break;
-         }
-       }
-
-       if (!collection_ref) {
-         derr << "stray object " << oid << " not owned by any collection" << dendl;
-         ceph_assert(collection_ref);
-         continue;
-       }
-
-       collection_ref->cid.is_pg(&pgid);
+      r = get_key_object(okey, &oid);
+      if (r != 0) {
+        derr << __func__
+             << " failed to decode onode key= " << pretty_binary_string(okey)
+             << " from extent key= " << pretty_binary_string(key)
+             << dendl;
+        return -EIO;
       }
       }
-      onode_ref.reset(BlueStore::Onode::decode(collection_ref, oid, it->key(), it->value()));
+      ceph_assert(oid == edecoder.get_oid());
+      edecoder.decode_some(it->value(), nullptr);
+      ++stats.shard_count;
     }
   }
 
     }
   }
 
-  // process the last object
-  if (has_open_onode) {
-    // make sure we got all shards of this object
-    if (shard_id == onode_ref->extent_map.shards.size()) {
-      // We completed an Onode Object -> pass it to be processed
-      read_allocation_from_single_onode(sbmap, onode_ref, stats);
-    } else {
-      derr << "Last Object is missing shards! shard_id=" << shard_id << ", shards.size()=" << onode_ref->extent_map.shards.size() << dendl;
-      ceph_assert(shard_id == onode_ref->extent_map.shards.size());
-    }
+  std::lock_guard l(vstatfs_lock);
+  store_statfs_t s;
+  osd_pools.clear();
+  for (auto& p : stats.actual_pool_vstatfs) {
+    if (per_pool_stat_collection) {
+      osd_pools[p.first] = p.second;
+    }
+    stats.actual_store_vstatfs += p.second;
+    p.second.publish(&s);
+    dout(5) << __func__ << " recovered pool "
+            << std::hex
+            << p.first << "->" << s
+            << std::dec
+            << " per-pool:" << per_pool_stat_collection
+            << dendl;
   }
   }
-  dout(5) << "onode_count=" << stats.onode_count << " ,shard_count=" << stats.shard_count << dendl;
-
+  vstatfs = stats.actual_store_vstatfs;
+  vstatfs.publish(&s);
+  dout(5) << __func__ << " recovered " << s
+          << dendl;
   return 0;
 }
 
   return 0;
 }
 
@@ -19329,7 +19438,7 @@ int BlueStore::reset_fm_for_restore()
   KeyValueDB::Transaction t = db->get_transaction();
   // call _open_fm() with fm_restore set to TRUE
   // this will mark the full device space as allocated (and not just the reserved space)
   KeyValueDB::Transaction t = db->get_transaction();
   // call _open_fm() with fm_restore set to TRUE
   // this will mark the full device space as allocated (and not just the reserved space)
-  _open_fm(t, true, true);
+  _open_fm(t, true, true, true);
   if (fm == nullptr) {
     derr << "Failed _open_fm()" << dendl;
     return -1;
   if (fm == nullptr) {
     derr << "Failed _open_fm()" << dendl;
     return -1;
@@ -19444,7 +19553,7 @@ int BlueStore::push_allocation_to_rocksdb()
 #endif // CEPH_BLUESTORE_TOOL_RESTORE_ALLOCATION
 
 //-------------------------------------------------------------------------------------
 #endif // CEPH_BLUESTORE_TOOL_RESTORE_ALLOCATION
 
 //-------------------------------------------------------------------------------------
-static int commit_freelist_type(KeyValueDB *db, const std::string& freelist_type, CephContext *cct, const std::string &path)
+int BlueStore::commit_freelist_type()
 {
   // When freelist_type to "bitmap" we will store allocation in RocksDB
   // When allocation-info is stored in a single file we set freelist_type to "null"
 {
   // When freelist_type to "bitmap" we will store allocation in RocksDB
   // When allocation-info is stored in a single file we set freelist_type to "null"
@@ -19469,14 +19578,14 @@ static int commit_freelist_type(KeyValueDB *db, const std::string& freelist_type
 //-------------------------------------------------------------------------------------
 int BlueStore::commit_to_null_manager()
 {
 //-------------------------------------------------------------------------------------
 int BlueStore::commit_to_null_manager()
 {
-  dout(5) << "Set FreelistManager to NULL FM..." << dendl;
+  dout(5) << __func__ << " Set FreelistManager to NULL FM..." << dendl;
   fm->set_null_manager();
   freelist_type = "null";
 #if 1
   fm->set_null_manager();
   freelist_type = "null";
 #if 1
-  return commit_freelist_type(db, freelist_type, cct, path);
+  return commit_freelist_type();
 #else
   // should check how long this step take on a big configuration as deletes are expensive
 #else
   // should check how long this step take on a big configuration as deletes are expensive
-  if (commit_freelist_type(db, freelist_type, cct, path) == 0) {
+  if (commit_freelist_type() == 0) {
     // remove all objects of PREFIX_ALLOC_BITMAP from RocksDB to guarantee a clean start
     clear_allocation_objects_from_rocksdb(db, cct, path);
   }
     // remove all objects of PREFIX_ALLOC_BITMAP from RocksDB to guarantee a clean start
     clear_allocation_objects_from_rocksdb(db, cct, path);
   }
@@ -19490,7 +19599,7 @@ int BlueStore::commit_to_real_manager()
   dout(5) << "Set FreelistManager to Real FM..." << dendl;
   ceph_assert(!fm->is_null_manager());
   freelist_type = "bitmap";
   dout(5) << "Set FreelistManager to Real FM..." << dendl;
   ceph_assert(!fm->is_null_manager());
   freelist_type = "bitmap";
-  int ret = commit_freelist_type(db, freelist_type, cct, path);
+  int ret = commit_freelist_type();
   if (ret == 0) {
     //remove the allocation_file
     invalidate_allocation_file_on_bluefs();
   if (ret == 0) {
     //remove the allocation_file
     invalidate_allocation_file_on_bluefs();
index 5f1b84d9100ac97a22297487672ac44a27dfc66b..f98d55b40077cfbf33896af068023e7c844d209e 100644 (file)
@@ -210,6 +210,7 @@ enum {
 };
 
 #define META_POOL_ID ((uint64_t)-1ull)
 };
 
 #define META_POOL_ID ((uint64_t)-1ull)
+using bptr_c_it_t = buffer::ptr::const_iterator;
 
 class BlueStore : public ObjectStore,
                  public md_config_obs_t {
 
 class BlueStore : public ObjectStore,
                  public md_config_obs_t {
@@ -708,9 +709,9 @@ public:
       }
     }
     void decode(
       }
     }
     void decode(
-      Collection */*coll*/,
       ceph::buffer::ptr::const_iterator& p,
       ceph::buffer::ptr::const_iterator& p,
-      bool include_ref_map) {
+      bool include_ref_map,
+      Collection */*coll*/) {
       const char *start = p.get_pos();
       denc(blob, p);
       const char *end = p.get_pos();
       const char *start = p.get_pos();
       denc(blob, p);
       const char *end = p.get_pos();
@@ -748,11 +749,11 @@ public:
       }
     }
     void decode(
       }
     }
     void decode(
-      Collection *coll,
       ceph::buffer::ptr::const_iterator& p,
       uint64_t struct_v,
       uint64_t* sbid,
       ceph::buffer::ptr::const_iterator& p,
       uint64_t struct_v,
       uint64_t* sbid,
-      bool include_ref_map);
+      bool include_ref_map,
+      Collection *coll);
 #endif
   };
   typedef boost::intrusive_ptr<Blob> BlobRef;
 #endif
   };
   typedef boost::intrusive_ptr<Blob> BlobRef;
@@ -864,6 +865,7 @@ public:
       bool loaded = false;   ///< true if shard is loaded
       bool dirty = false;    ///< true if shard is dirty and needs reencoding
     };
       bool loaded = false;   ///< true if shard is loaded
       bool dirty = false;    ///< true if shard is dirty and needs reencoding
     };
+
     mempool::bluestore_cache_meta::vector<Shard> shards;    ///< shards
 
     ceph::buffer::list inline_bl;    ///< cached encoded map, if unsharded; empty=>dirty
     mempool::bluestore_cache_meta::vector<Shard> shards;    ///< shards
 
     ceph::buffer::list inline_bl;    ///< cached encoded map, if unsharded; empty=>dirty
@@ -893,7 +895,7 @@ public:
       void operator()(Extent *e) { delete e; }
     };
 
       void operator()(Extent *e) { delete e; }
     };
 
-    ExtentMap(Onode *o);
+    ExtentMap(Onode *o, size_t inline_shard_prealloc_size);
     ~ExtentMap() {
       extent_map.clear_and_dispose(DeleteDisposer());
     }
     ~ExtentMap() {
       extent_map.clear_and_dispose(DeleteDisposer());
     }
@@ -909,12 +911,56 @@ public:
 
     bool encode_some(uint32_t offset, uint32_t length, ceph::buffer::list& bl,
                     unsigned *pn);
 
     bool encode_some(uint32_t offset, uint32_t length, ceph::buffer::list& bl,
                     unsigned *pn);
+
+    class ExtentDecoder {
+      uint64_t pos = 0;
+      uint64_t prev_len = 0;
+      uint64_t extent_pos = 0;
+    protected:
+      virtual void consume_blobid(Extent* le,
+                                  bool spanning,
+                                  uint64_t blobid) = 0;
+      virtual void consume_blob(Extent* le,
+                                uint64_t extent_no,
+                                uint64_t sbid,
+                                BlobRef b) = 0;
+      virtual void consume_spanning_blob(uint64_t sbid, BlobRef b) = 0;
+      virtual Extent* get_next_extent() = 0;
+      virtual void add_extent(Extent*) = 0;
+
+      void decode_extent(Extent* le,
+                         __u8 struct_v,
+                         bptr_c_it_t& p,
+                         Collection* c);
+    public:
+      virtual ~ExtentDecoder() {
+      }
+
+      unsigned decode_some(const ceph::buffer::list& bl, Collection* c);
+      void decode_spanning_blobs(bptr_c_it_t& p, Collection* c);
+    };
+
+    class ExtentDecoderFull : public ExtentDecoder {
+      ExtentMap& extent_map;
+      std::vector<BlobRef> blobs;
+    protected:
+      void consume_blobid(Extent* le, bool spanning, uint64_t blobid) override;
+      void consume_blob(Extent* le,
+                        uint64_t extent_no,
+                        uint64_t sbid,
+                        BlobRef b) override;
+      void consume_spanning_blob(uint64_t sbid, BlobRef b) override;
+      Extent* get_next_extent() override;
+      void add_extent(Extent* ) override;
+    public:
+      ExtentDecoderFull (ExtentMap& _extent_map) : extent_map(_extent_map) {
+      }
+    };
+
     unsigned decode_some(ceph::buffer::list& bl);
 
     void bound_encode_spanning_blobs(size_t& p);
     void encode_spanning_blobs(ceph::buffer::list::contiguous_appender& p);
     unsigned decode_some(ceph::buffer::list& bl);
 
     void bound_encode_spanning_blobs(size_t& p);
     void encode_spanning_blobs(ceph::buffer::list::contiguous_appender& p);
-    void decode_spanning_blobs(ceph::buffer::ptr::const_iterator& p);
-
     BlobRef get_spanning_blob(int id) {
       auto p = spanning_blob_map.find(id);
       ceph_assert(p != spanning_blob_map.end());
     BlobRef get_spanning_blob(int id) {
       auto p = spanning_blob_map.find(id);
       ceph_assert(p != spanning_blob_map.end());
@@ -1014,8 +1060,6 @@ public:
 
     /// split a blob (and referring extents)
     BlobRef split_blob(BlobRef lb, uint32_t blob_offset, uint32_t pos);
 
     /// split a blob (and referring extents)
     BlobRef split_blob(BlobRef lb, uint32_t blob_offset, uint32_t pos);
-
-    void provide_shard_info_to_onode(bufferlist v, uint32_t shard_id);
   };
 
   /// Compressed Blob Garbage collector
   };
 
   /// Compressed Blob Garbage collector
@@ -1124,12 +1168,13 @@ public:
   };
 
   struct OnodeSpace;
   };
 
   struct OnodeSpace;
+  struct OnodeCacheShard;
   /// an in-memory object
   struct Onode {
     MEMPOOL_CLASS_HELPERS();
 
   /// an in-memory object
   struct Onode {
     MEMPOOL_CLASS_HELPERS();
 
-    std::atomic_int nref;  ///< reference count
-    std::atomic_int put_nref = {0};
+    std::atomic_int nref = 0;      ///< reference count
+    std::atomic_int pin_nref = 0;  ///< reference count replica to track pinning
     Collection *c;
     ghobject_t oid;
 
     Collection *c;
     ghobject_t oid;
 
@@ -1143,8 +1188,6 @@ public:
     bool cached;              ///< Onode is logically in the cache
                               /// (it can be pinned and hence physically out
                               /// of it at the moment though)
     bool cached;              ///< Onode is logically in the cache
                               /// (it can be pinned and hence physically out
                               /// of it at the moment though)
-    std::atomic_bool pinned;  ///< Onode is pinned
-                              /// (or should be pinned when cached)
     ExtentMap extent_map;
 
     // track txc's that have not been committed to kv store (and whose
     ExtentMap extent_map;
 
     // track txc's that have not been committed to kv store (and whose
@@ -1158,43 +1201,56 @@ public:
 
     Onode(Collection *c, const ghobject_t& o,
          const mempool::bluestore_cache_meta::string& k)
 
     Onode(Collection *c, const ghobject_t& o,
          const mempool::bluestore_cache_meta::string& k)
-      : nref(0),
-       c(c),
+      : c(c),
        oid(o),
        key(k),
        exists(false),
         cached(false),
        oid(o),
        key(k),
        exists(false),
         cached(false),
-        pinned(false),
-       extent_map(this) {
+       extent_map(this,
+         c->store->cct->_conf->
+           bluestore_extent_map_inline_shard_prealloc_size) {
     }
     Onode(Collection* c, const ghobject_t& o,
       const std::string& k)
     }
     Onode(Collection* c, const ghobject_t& o,
       const std::string& k)
-      : nref(0),
-      c(c),
-      oid(o),
-      key(k),
-      exists(false),
-      cached(false),
-      pinned(false),
-      extent_map(this) {
+      : c(c),
+        oid(o),
+        key(k),
+        exists(false),
+        cached(false),
+        extent_map(this,
+         c->store->cct->_conf->
+           bluestore_extent_map_inline_shard_prealloc_size) {
     }
     Onode(Collection* c, const ghobject_t& o,
       const char* k)
     }
     Onode(Collection* c, const ghobject_t& o,
       const char* k)
-      : nref(0),
-      c(c),
-      oid(o),
-      key(k),
-      exists(false),
-      cached(false),
-      pinned(false),
-      extent_map(this) {
+      : c(c),
+        oid(o),
+        key(k),
+        exists(false),
+        cached(false),
+        extent_map(this,
+         c->store->cct->_conf->
+           bluestore_extent_map_inline_shard_prealloc_size) {
     }
     }
+    Onode(CephContext* cct)
+      : c(nullptr),
+        exists(false),
+        cached(false),
+        extent_map(this,
+         cct->_conf->
+           bluestore_extent_map_inline_shard_prealloc_size) {
+    }
+    static void decode_raw(
+      BlueStore::Onode* on,
+      const bufferlist& v,
+      ExtentMap::ExtentDecoder& dencoder);
 
 
-    static Onode* decode(
+    static Onode* create_decode(
       CollectionRef c,
       const ghobject_t& oid,
       const std::string& key,
       CollectionRef c,
       const ghobject_t& oid,
       const std::string& key,
-      const ceph::buffer::list& v);
+      const ceph::buffer::list& v,
+      bool allow_empty = false);
 
     void dump(ceph::Formatter* f) const;
 
 
     void dump(ceph::Formatter* f) const;
 
@@ -1202,15 +1258,16 @@ public:
     void get();
     void put();
 
     void get();
     void put();
 
-    inline bool put_cache() {
+    inline bool is_cached() const {
+      return cached;
+    }
+    inline void set_cached() {
       ceph_assert(!cached);
       cached = true;
       ceph_assert(!cached);
       cached = true;
-      return !pinned;
     }
     }
-    inline bool pop_cache() {
+    inline void clear_cached() {
       ceph_assert(cached);
       cached = false;
       ceph_assert(cached);
       cached = false;
-      return !pinned;
     }
 
     static const std::string& calc_omap_prefix(uint8_t flags);
     }
 
     static const std::string& calc_omap_prefix(uint8_t flags);
@@ -1248,7 +1305,8 @@ public:
          get_blob().calc_offset(0, nullptr);
     }
 #endif
          get_blob().calc_offset(0, nullptr);
     }
 #endif
-    
+private:
+    void _decode(const ceph::buffer::list& v);
   };
   typedef boost::intrusive_ptr<Onode> OnodeRef;
 
   };
   typedef boost::intrusive_ptr<Onode> OnodeRef;
 
@@ -1333,21 +1391,20 @@ public:
 
   /// A Generic onode Cache Shard
   struct OnodeCacheShard : public CacheShard {
 
   /// A Generic onode Cache Shard
   struct OnodeCacheShard : public CacheShard {
-    std::atomic<uint64_t> num_pinned = {0};
     std::array<std::pair<ghobject_t, ceph::mono_clock::time_point>, 64> dumped_onodes;
 
     std::array<std::pair<ghobject_t, ceph::mono_clock::time_point>, 64> dumped_onodes;
 
-    virtual void _pin(Onode* o) = 0;
-    virtual void _unpin(Onode* o) = 0;
-
   public:
     OnodeCacheShard(CephContext* cct) : CacheShard(cct) {}
     static OnodeCacheShard *create(CephContext* cct, std::string type,
                                    PerfCounters *logger);
   public:
     OnodeCacheShard(CephContext* cct) : CacheShard(cct) {}
     static OnodeCacheShard *create(CephContext* cct, std::string type,
                                    PerfCounters *logger);
+
+    //The following methods prefixed with '_' to be called under
+    // Shard's lock
     virtual void _add(Onode* o, int level) = 0;
     virtual void _rm(Onode* o) = 0;
     virtual void _add(Onode* o, int level) = 0;
     virtual void _rm(Onode* o) = 0;
-    virtual void _unpin_and_rm(Onode* o) = 0;
+    virtual void _move_pinned(OnodeCacheShard *to, Onode *o) = 0;
 
 
-    virtual void move_pinned(OnodeCacheShard *to, Onode *o) = 0;
+    virtual void maybe_unpin(Onode* o) = 0;
     virtual void add_stats(uint64_t *onodes, uint64_t *pinned_onodes) = 0;
     bool empty() {
       return _get_num() == 0;
     virtual void add_stats(uint64_t *onodes, uint64_t *pinned_onodes) = 0;
     bool empty() {
       return _get_num() == 0;
@@ -1416,7 +1473,7 @@ public:
       clear();
     }
 
       clear();
     }
 
-    OnodeRef add(const ghobject_t& oid, OnodeRef& o);
+    OnodeRef add_onode(const ghobject_t& oid, OnodeRef& o);
     OnodeRef lookup(const ghobject_t& o);
     void rename(OnodeRef& o, const ghobject_t& old_oid,
                const ghobject_t& new_oid,
     OnodeRef lookup(const ghobject_t& o);
     void rename(OnodeRef& o, const ghobject_t& old_oid,
                const ghobject_t& new_oid,
@@ -1448,14 +1505,14 @@ public:
 
     // cache onodes on a per-collection basis to avoid lock
     // contention.
 
     // cache onodes on a per-collection basis to avoid lock
     // contention.
-    OnodeSpace onode_map;
+    OnodeSpace onode_space;
 
     //pool options
     pool_opts_t pool_opts;
     ContextQueue *commit_queue;
 
     OnodeCacheShard* get_onode_cache() const {
 
     //pool options
     pool_opts_t pool_opts;
     ContextQueue *commit_queue;
 
     OnodeCacheShard* get_onode_cache() const {
-      return onode_map.cache;
+      return onode_space.cache;
     }
     OnodeRef get_onode(const ghobject_t& oid, bool create, bool is_createop=false);
 
     }
     OnodeRef get_onode(const ghobject_t& oid, bool create, bool is_createop=false);
 
@@ -1514,7 +1571,7 @@ public:
     std::string _stringify() const;
 
   public:
     std::string _stringify() const;
 
   public:
-    OmapIteratorImpl(CollectionRef c, OnodeRef o, KeyValueDB::Iterator it);
+    OmapIteratorImpl(CollectionRef c, OnodeRef& o, KeyValueDB::Iterator it);
     int seek_to_first() override;
     int upper_bound(const std::string &after) override;
     int lower_bound(const std::string &to) override;
     int seek_to_first() override;
     int upper_bound(const std::string &after) override;
     int lower_bound(const std::string &to) override;
@@ -1547,6 +1604,14 @@ public:
     void reset() {
       *this = volatile_statfs();
     }
     void reset() {
       *this = volatile_statfs();
     }
+    bool empty() const {
+      for (size_t i = 0; i < STATFS_LAST; ++i) {
+       if (values[i]) {
+         return false;
+       }
+      }
+      return true;
+    }
     void publish(store_statfs_t* buf) const {
       buf->allocated = allocated();
       buf->data_stored = stored();
     void publish(store_statfs_t* buf) const {
       buf->allocated = allocated();
       buf->data_stored = stored();
@@ -1756,7 +1821,7 @@ public:
       delete deferred_txn;
     }
 
       delete deferred_txn;
     }
 
-    void write_onode(OnodeRef &o) {
+    void write_onode(OnodeRefo) {
       onodes.insert(o);
     }
     void write_shared_blob(SharedBlobRef &sb) {
       onodes.insert(o);
     }
     void write_shared_blob(SharedBlobRef &sb) {
@@ -1767,7 +1832,7 @@ public:
     }
 
     /// note we logically modified object (when onode itself is unmodified)
     }
 
     /// note we logically modified object (when onode itself is unmodified)
-    void note_modified_object(OnodeRef &o) {
+    void note_modified_object(OnodeRefo) {
       // onode itself isn't written, though
       modified_objects.insert(o);
     }
       // onode itself isn't written, though
       modified_objects.insert(o);
     }
@@ -2123,7 +2188,6 @@ public:
     bool apply_defer();
   };
 
     bool apply_defer();
   };
 
-  bool has_null_fm();
   // --------------------------------------------------------
   // members
 private:
   // --------------------------------------------------------
   // members
 private:
@@ -2569,6 +2633,7 @@ private:
   */
   int _open_db_and_around(bool read_only, bool to_repair = false);
   void _close_db_and_around();
   */
   int _open_db_and_around(bool read_only, bool to_repair = false);
   void _close_db_and_around();
+  void _close_around_db();
 
   int _prepare_db_environment(bool create, bool read_only,
                              std::string* kv_dir, std::string* kv_backend);
 
   int _prepare_db_environment(bool create, bool read_only,
                              std::string* kv_dir, std::string* kv_backend);
@@ -2581,8 +2646,10 @@ private:
               bool to_repair_db=false,
               bool read_only = false);
   void _close_db();
               bool to_repair_db=false,
               bool read_only = false);
   void _close_db();
-  void _close_db_leave_bluefs();
-  int _open_fm(KeyValueDB::Transaction t, bool read_only, bool fm_restore = false);
+  int _open_fm(KeyValueDB::Transaction t,
+               bool read_only,
+               bool db_avail,
+               bool fm_restore = false);
   void _close_fm();
   int _write_out_fm_meta(uint64_t target_size);
   int _create_alloc();
   void _close_fm();
   int _write_out_fm_meta(uint64_t target_size);
   int _create_alloc();
@@ -2624,7 +2691,7 @@ private:
   void _reap_collections();
   void _update_cache_logger();
 
   void _reap_collections();
   void _update_cache_logger();
 
-  void _assign_nid(TransContext *txc, OnodeRef o);
+  void _assign_nid(TransContext *txc, OnodeRef& o);
   uint64_t _assign_blobid(TransContext *txc);
 
   template <int LogLevelV>
   uint64_t _assign_blobid(TransContext *txc);
 
   template <int LogLevelV>
@@ -2714,8 +2781,9 @@ private:
     store_statfs_t& expected_statfs,
     FSCKDepth depth);
 
     store_statfs_t& expected_statfs,
     FSCKDepth depth);
 
-  void _fsck_check_pool_statfs(
-    per_pool_statfs& expected_pool_statfs,
+  void _fsck_check_statfs(
+    const store_statfs_t& expected_store_statfs,
+    const per_pool_statfs& expected_pool_statfs,
     int64_t& errors,
     int64_t &warnings,
     BlueStoreRepairer* repairer);
     int64_t& errors,
     int64_t &warnings,
     BlueStoreRepairer* repairer);
@@ -2786,7 +2854,7 @@ public:
   bool allows_journal() override { return false; };
 
   void prepare_for_fast_shutdown() override;
   bool allows_journal() override { return false; };
 
   void prepare_for_fast_shutdown() override;
-  virtual bool has_null_manager();
+  bool has_null_manager() const override;
 
   uint64_t get_min_alloc_size() const override {
     return min_alloc_size;
 
   uint64_t get_min_alloc_size() const override {
     return min_alloc_size;
@@ -2796,7 +2864,8 @@ public:
 
   bool is_rotational() override;
   bool is_journal_rotational() override;
 
   bool is_rotational() override;
   bool is_journal_rotational() override;
-  bool is_db_rotational() ;
+  bool is_db_rotational();
+  bool is_statfs_recoverable() const;
 
   std::string get_default_device_class() override {
     std::string device_class;
 
   std::string get_default_device_class() override {
     std::string device_class;
@@ -2980,7 +3049,7 @@ private:
   typedef std::map<BlueStore::BlobRef, regions2read_t> blobs2read_t;
 
   void _read_cache(
   typedef std::map<BlueStore::BlobRef, regions2read_t> blobs2read_t;
 
   void _read_cache(
-    OnodeRef o,
+    OnodeRef& o,
     uint64_t offset,
     size_t length,
     int read_cache_policy,
     uint64_t offset,
     size_t length,
     int read_cache_policy,
@@ -2994,7 +3063,7 @@ private:
     IOContext* ioc);
 
   int _generate_read_result_bl(
     IOContext* ioc);
 
   int _generate_read_result_bl(
-    OnodeRef o,
+    OnodeRef& o,
     uint64_t offset,
     size_t length,
     ready_regions_t& ready_regions,
     uint64_t offset,
     size_t length,
     ready_regions_t& ready_regions,
@@ -3006,7 +3075,7 @@ private:
 
   int _do_read(
     Collection *c,
 
   int _do_read(
     Collection *c,
-    OnodeRef o,
+    OnodeRef& o,
     uint64_t offset,
     size_t len,
     ceph::buffer::list& bl,
     uint64_t offset,
     size_t len,
     ceph::buffer::list& bl,
@@ -3015,7 +3084,7 @@ private:
 
   int _do_readv(
     Collection *c,
 
   int _do_readv(
     Collection *c,
-    OnodeRef o,
+    OnodeRef& o,
     const interval_set<uint64_t>& m,
     ceph::buffer::list& bl,
     uint32_t op_flags = 0,
     const interval_set<uint64_t>& m,
     ceph::buffer::list& bl,
     uint32_t op_flags = 0,
@@ -3082,7 +3151,7 @@ public:
     std::map<std::string, ceph::buffer::list> *out /// < [out] Key to value map
     );
   int _onode_omap_get(
     std::map<std::string, ceph::buffer::list> *out /// < [out] Key to value map
     );
   int _onode_omap_get(
-    const OnodeRef &o,           ///< [in] Object containing omap
+    const OnodeRefo,           ///< [in] Object containing omap
     ceph::buffer::list *header,          ///< [out] omap header
     std::map<std::string, ceph::buffer::list> *out /// < [out] Key to value map
   );
     ceph::buffer::list *header,          ///< [out] omap header
     std::map<std::string, ceph::buffer::list> *out /// < [out] Key to value map
   );
@@ -3402,33 +3471,33 @@ private:
   void _do_write_small(
     TransContext *txc,
     CollectionRef &c,
   void _do_write_small(
     TransContext *txc,
     CollectionRef &c,
-    OnodeRef o,
+    OnodeRef& o,
     uint64_t offset, uint64_t length,
     ceph::buffer::list::iterator& blp,
     WriteContext *wctx);
   void _do_write_big_apply_deferred(
     TransContext* txc,
     CollectionRef& c,
     uint64_t offset, uint64_t length,
     ceph::buffer::list::iterator& blp,
     WriteContext *wctx);
   void _do_write_big_apply_deferred(
     TransContext* txc,
     CollectionRef& c,
-    OnodeRef o,
+    OnodeRef& o,
     BigDeferredWriteContext& dctx,
     bufferlist::iterator& blp,
     WriteContext* wctx);
   void _do_write_big(
     TransContext *txc,
     CollectionRef &c,
     BigDeferredWriteContext& dctx,
     bufferlist::iterator& blp,
     WriteContext* wctx);
   void _do_write_big(
     TransContext *txc,
     CollectionRef &c,
-    OnodeRef o,
+    OnodeRef& o,
     uint64_t offset, uint64_t length,
     ceph::buffer::list::iterator& blp,
     WriteContext *wctx);
   int _do_alloc_write(
     TransContext *txc,
     CollectionRef c,
     uint64_t offset, uint64_t length,
     ceph::buffer::list::iterator& blp,
     WriteContext *wctx);
   int _do_alloc_write(
     TransContext *txc,
     CollectionRef c,
-    OnodeRef o,
+    OnodeRef& o,
     WriteContext *wctx);
   void _wctx_finish(
     TransContext *txc,
     CollectionRef& c,
     WriteContext *wctx);
   void _wctx_finish(
     TransContext *txc,
     CollectionRef& c,
-    OnodeRef o,
+    OnodeRef& o,
     WriteContext *wctx,
     std::set<SharedBlob*> *maybe_unshared_blobs=0);
 
     WriteContext *wctx,
     std::set<SharedBlob*> *maybe_unshared_blobs=0);
 
@@ -3442,26 +3511,26 @@ private:
                  uint64_t chunk_size);
 
   void _choose_write_options(CollectionRef& c,
                  uint64_t chunk_size);
 
   void _choose_write_options(CollectionRef& c,
-                             OnodeRef o,
+                             OnodeRef& o,
                              uint32_t fadvise_flags,
                              WriteContext *wctx);
 
   int _do_gc(TransContext *txc,
              CollectionRef& c,
                              uint32_t fadvise_flags,
                              WriteContext *wctx);
 
   int _do_gc(TransContext *txc,
              CollectionRef& c,
-             OnodeRef o,
+             OnodeRef& o,
              const WriteContext& wctx,
              uint64_t *dirty_start,
              uint64_t *dirty_end);
 
   int _do_write(TransContext *txc,
                CollectionRef &c,
              const WriteContext& wctx,
              uint64_t *dirty_start,
              uint64_t *dirty_end);
 
   int _do_write(TransContext *txc,
                CollectionRef &c,
-               OnodeRef o,
+               OnodeRef& o,
                uint64_t offset, uint64_t length,
                ceph::buffer::list& bl,
                uint32_t fadvise_flags);
   void _do_write_data(TransContext *txc,
                       CollectionRef& c,
                uint64_t offset, uint64_t length,
                ceph::buffer::list& bl,
                uint32_t fadvise_flags);
   void _do_write_data(TransContext *txc,
                       CollectionRef& c,
-                      OnodeRef o,
+                      OnodeRef& o,
                       uint64_t offset,
                       uint64_t length,
                       ceph::buffer::list& bl,
                       uint64_t offset,
                       uint64_t length,
                       ceph::buffer::list& bl,
@@ -3480,7 +3549,7 @@ private:
            uint64_t offset, size_t len);
   void _do_truncate(TransContext *txc,
                   CollectionRef& c,
            uint64_t offset, size_t len);
   void _do_truncate(TransContext *txc,
                   CollectionRef& c,
-                  OnodeRef o,
+                  OnodeRef& o,
                   uint64_t offset,
                   std::set<SharedBlob*> *maybe_unshared_blobs=0);
   int _truncate(TransContext *txc,
                   uint64_t offset,
                   std::set<SharedBlob*> *maybe_unshared_blobs=0);
   int _truncate(TransContext *txc,
@@ -3492,7 +3561,7 @@ private:
              OnodeRef& o);
   int _do_remove(TransContext *txc,
                 CollectionRef& c,
              OnodeRef& o);
   int _do_remove(TransContext *txc,
                 CollectionRef& c,
-                OnodeRef o);
+                OnodeRef& o);
   int _setattr(TransContext *txc,
               CollectionRef& c,
               OnodeRef& o,
   int _setattr(TransContext *txc,
               CollectionRef& c,
               OnodeRef& o,
@@ -3509,7 +3578,7 @@ private:
   int _rmattrs(TransContext *txc,
               CollectionRef& c,
               OnodeRef& o);
   int _rmattrs(TransContext *txc,
               CollectionRef& c,
               OnodeRef& o);
-  void _do_omap_clear(TransContext *txc, OnodeRef &o);
+  void _do_omap_clear(TransContext *txc, OnodeRefo);
   int _omap_clear(TransContext *txc,
                  CollectionRef& c,
                  OnodeRef& o);
   int _omap_clear(TransContext *txc,
                  CollectionRef& c,
                  OnodeRef& o);
@@ -3660,67 +3729,83 @@ public:
   int  push_allocation_to_rocksdb();
   int  read_allocation_from_drive_for_bluestore_tool();
 #endif
   int  push_allocation_to_rocksdb();
   int  read_allocation_from_drive_for_bluestore_tool();
 #endif
+  void set_allocation_in_simple_bmap(SimpleBitmap* sbmap, uint64_t offset, uint64_t length);
+
 private:
 private:
-#define MAX_BLOBS_IN_ONODE 128
   struct  read_alloc_stats_t {
   struct  read_alloc_stats_t {
-    //read_alloc_stats_t() { memset(&this, 0, sizeof(read_alloc_stats_t)); }
     uint32_t onode_count             = 0;
     uint32_t shard_count             = 0;
 
     uint32_t onode_count             = 0;
     uint32_t shard_count             = 0;
 
-    uint32_t skipped_repeated_extent = 0;
     uint32_t skipped_illegal_extent  = 0;
 
     uint32_t skipped_illegal_extent  = 0;
 
-    uint32_t collection_search       = 0;
-    uint32_t pad_limit_count         = 0;
-
-    uint64_t shared_blobs_count      = 0;
+    uint64_t shared_blob_count      = 0;
     uint64_t compressed_blob_count   = 0;
     uint64_t spanning_blob_count     = 0;
     uint64_t insert_count            = 0;
     uint64_t extent_count            = 0;
 
     uint64_t compressed_blob_count   = 0;
     uint64_t spanning_blob_count     = 0;
     uint64_t insert_count            = 0;
     uint64_t extent_count            = 0;
 
-    uint64_t saved_inplace_count     = 0;
-    uint32_t merge_insert_count      = 0;
-    uint32_t merge_inplace_count     = 0;
-
-    std::array<uint32_t, MAX_BLOBS_IN_ONODE+1>blobs_in_onode = {};
-    //uint32_t blobs_in_onode[MAX_BLOBS_IN_ONODE+1];
+    std::map<uint64_t, volatile_statfs> actual_pool_vstatfs;
+    volatile_statfs actual_store_vstatfs;
+  };
+  class ExtentDecoderPartial : public ExtentMap::ExtentDecoder {
+    BlueStore& store;
+    read_alloc_stats_t& stats;
+    SimpleBitmap& sbmap;
+    sb_info_space_efficient_map_t& sb_info;
+    uint8_t min_alloc_size_order;
+    Extent extent;
+    ghobject_t oid;
+    volatile_statfs* per_pool_statfs = nullptr;
+    blob_map_t blobs;
+    blob_map_t spanning_blobs;
+
+    void _consume_new_blob(bool spanning,
+                           uint64_t extent_no,
+                           uint64_t sbid,
+                           BlobRef b);
+  protected:
+    void consume_blobid(Extent*, bool spanning, uint64_t blobid) override;
+    void consume_blob(Extent* le,
+                      uint64_t extent_no,
+                      uint64_t sbid,
+                      BlobRef b) override;
+    void consume_spanning_blob(uint64_t sbid, BlobRef b) override;
+    Extent* get_next_extent() override {
+      ++stats.extent_count;
+      extent = Extent();
+      return &extent;
+    }
+    void add_extent(Extent*) override {
+    }
+  public:
+    ExtentDecoderPartial(BlueStore& _store,
+                         read_alloc_stats_t& _stats,
+                         SimpleBitmap& _sbmap,
+                         sb_info_space_efficient_map_t& _sb_info,
+                         uint8_t _min_alloc_size_order)
+      : store(_store), stats(_stats), sbmap(_sbmap), sb_info(_sb_info),
+        min_alloc_size_order(_min_alloc_size_order)
+    {}
+    const ghobject_t& get_oid() const {
+      return oid;
+    }
+    void reset(const ghobject_t _oid,
+      volatile_statfs* _per_pool_statfs);
   };
 
   friend std::ostream& operator<<(std::ostream& out, const read_alloc_stats_t& stats) {
     out << "==========================================================" << std::endl;
     out << "NCB::onode_count             = " ;out.width(10);out << stats.onode_count << std::endl
        << "NCB::shard_count             = " ;out.width(10);out << stats.shard_count << std::endl
   };
 
   friend std::ostream& operator<<(std::ostream& out, const read_alloc_stats_t& stats) {
     out << "==========================================================" << std::endl;
     out << "NCB::onode_count             = " ;out.width(10);out << stats.onode_count << std::endl
        << "NCB::shard_count             = " ;out.width(10);out << stats.shard_count << std::endl
-       << "NCB::shared_blobs_count      = " ;out.width(10);out << stats.shared_blobs_count << std::endl
+       << "NCB::shared_blob_count      = " ;out.width(10);out << stats.shared_blob_count << std::endl
        << "NCB::compressed_blob_count   = " ;out.width(10);out << stats.compressed_blob_count << std::endl
        << "NCB::spanning_blob_count     = " ;out.width(10);out << stats.spanning_blob_count << std::endl
        << "NCB::compressed_blob_count   = " ;out.width(10);out << stats.compressed_blob_count << std::endl
        << "NCB::spanning_blob_count     = " ;out.width(10);out << stats.spanning_blob_count << std::endl
-       << "NCB::collection search       = " ;out.width(10);out << stats.collection_search << std::endl
-       << "NCB::skipped_repeated_extent = " ;out.width(10);out << stats.skipped_repeated_extent << std::endl
        << "NCB::skipped_illegal_extent  = " ;out.width(10);out << stats.skipped_illegal_extent << std::endl
        << "NCB::extent_count            = " ;out.width(10);out << stats.extent_count << std::endl
        << "NCB::insert_count            = " ;out.width(10);out << stats.insert_count << std::endl;
 
        << "NCB::skipped_illegal_extent  = " ;out.width(10);out << stats.skipped_illegal_extent << std::endl
        << "NCB::extent_count            = " ;out.width(10);out << stats.extent_count << std::endl
        << "NCB::insert_count            = " ;out.width(10);out << stats.insert_count << std::endl;
 
-    if (stats.merge_insert_count) {
-      out << "NCB::merge_insert_count      = " ;out.width(10);out << stats.merge_insert_count  << std::endl;
-    }
-    if (stats.merge_inplace_count ) {
-      out << "NCB::merge_inplace_count     = " ;out.width(10);out << stats.merge_inplace_count << std::endl;
-      out << "NCB::saved_inplace_count     = " ;out.width(10);out << stats.saved_inplace_count << std::endl;
-      out << "NCB::saved inplace per call  = " ;out.width(10);out << stats.saved_inplace_count/stats.merge_inplace_count << std::endl;
-    }
     out << "==========================================================" << std::endl;
 
     out << "==========================================================" << std::endl;
 
-    for (unsigned i = 0; i < MAX_BLOBS_IN_ONODE; i++ ) {
-      if (stats.blobs_in_onode[i]) {
-       out << "NCB::We had " ;out.width(9); out << stats.blobs_in_onode[i]
-           << " ONodes with "; out.width(3); out << i << " blobs" << std::endl;
-      }
-    }
-
-    if (stats.blobs_in_onode[MAX_BLOBS_IN_ONODE]) {
-      out << "NCB::We had " ;out.width(9);out << stats.blobs_in_onode[MAX_BLOBS_IN_ONODE]
-         << " ONodes with more than " << MAX_BLOBS_IN_ONODE << " blobs" << std::endl;
-    }
     return out;
   }
 
     return out;
   }
 
@@ -3738,8 +3823,7 @@ private:
   int  read_allocation_from_drive_on_startup();
   int  reconstruct_allocations(SimpleBitmap *smbmp, read_alloc_stats_t &stats);
   int  read_allocation_from_onodes(SimpleBitmap *smbmp, read_alloc_stats_t& stats);
   int  read_allocation_from_drive_on_startup();
   int  reconstruct_allocations(SimpleBitmap *smbmp, read_alloc_stats_t &stats);
   int  read_allocation_from_onodes(SimpleBitmap *smbmp, read_alloc_stats_t& stats);
-  void read_allocation_from_single_onode(SimpleBitmap *smbmp, BlueStore::OnodeRef& onode_ref, read_alloc_stats_t&  stats);
-  void set_allocation_in_simple_bmap(SimpleBitmap* sbmap, uint64_t offset, uint64_t length);
+  int  commit_freelist_type();
   int  commit_to_null_manager();
   int  commit_to_real_manager();
   int  db_cleanup(int ret);
   int  commit_to_null_manager();
   int  commit_to_real_manager();
   int  db_cleanup(int ret);
index 5907df443e00b9a7134f6a569a7d86c3a2aa1413..69866fa40cb5f493a4b365eb027c404e9738ebb6 100644 (file)
@@ -17,8 +17,15 @@ FreelistManager *FreelistManager::create(
   // op is per prefix, has to done pre-db-open, and we don't know the
   // freelist type until after we open the db.
   ceph_assert(prefix == "B");
   // op is per prefix, has to done pre-db-open, and we don't know the
   // freelist type until after we open the db.
   ceph_assert(prefix == "B");
-  if (type == "bitmap")
+  if (type == "bitmap") {
     return new BitmapFreelistManager(cct, "B", "b");
     return new BitmapFreelistManager(cct, "B", "b");
+  }
+  if (type == "null") {
+    // use BitmapFreelistManager with the null option to stop allocations from going to RocksDB
+    auto *fm = new BitmapFreelistManager(cct, "B", "b");
+    fm->set_null_manager();
+    return fm;
+  }
 
 #ifdef HAVE_LIBZBD
   // With zoned drives there is only one FreelistManager implementation that we
 
 #ifdef HAVE_LIBZBD
   // With zoned drives there is only one FreelistManager implementation that we
index 54d27f10804be9c9a91b17f574ae84131e5c9fc8..7f44fe957316c1070fb5eb63476490e3a8fa6023 100644 (file)
@@ -56,7 +56,7 @@ public:
   void set_null_manager() {
     null_manager = true;
   }
   void set_null_manager() {
     null_manager = true;
   }
-  bool is_null_manager() {
+  bool is_null_manager() const {
     return null_manager;
   }
 };
     return null_manager;
   }
 };
index 3a812cf5f018d0acec69246bf4a0a243bb11712b..c8d2ede7bed92abfb7f561283e03e9e7f84d08da 100644 (file)
@@ -167,7 +167,6 @@ bluefs_fnode_delta_t* bluefs_fnode_t::make_delta(bluefs_fnode_delta_t* delta) {
       delta->extents.push_back(*p);
       ++p;
     }
       delta->extents.push_back(*p);
       ++p;
     }
-    reset_delta();
   }
   return delta;
 }
   }
   return delta;
 }
index b53000188ae77e57ffd8a9ca370a65ca1620ea7c..d5d8ee5a62826f979d8ad9d7106c15c45abc54a0 100644 (file)
@@ -62,7 +62,7 @@ struct bluefs_fnode_t {
   uint64_t ino;
   uint64_t size;
   utime_t mtime;
   uint64_t ino;
   uint64_t size;
   utime_t mtime;
-  uint8_t __unused__; // was prefer_bdev
+  uint8_t __unused__ = 0; // was prefer_bdev
   mempool::bluefs::vector<bluefs_extent_t> extents;
 
   // precalculated logical offsets for extents vector entries
   mempool::bluefs::vector<bluefs_extent_t> extents;
 
   // precalculated logical offsets for extents vector entries
@@ -72,7 +72,15 @@ struct bluefs_fnode_t {
   uint64_t allocated;
   uint64_t allocated_commited;
 
   uint64_t allocated;
   uint64_t allocated_commited;
 
-  bluefs_fnode_t() : ino(0), size(0), __unused__(0), allocated(0), allocated_commited(0) {}
+  bluefs_fnode_t() : ino(0), size(0), allocated(0), allocated_commited(0) {}
+  bluefs_fnode_t(uint64_t _ino, uint64_t _size, utime_t _mtime) :
+    ino(_ino), size(_size), mtime(_mtime), allocated(0), allocated_commited(0) {}
+  bluefs_fnode_t(const bluefs_fnode_t& other) :
+    ino(other.ino), size(other.size), mtime(other.mtime),
+    allocated(other.allocated),
+    allocated_commited(other.allocated_commited) {
+    clone_extents(other);
+  }
 
   uint64_t get_allocated() const {
     return allocated;
 
   uint64_t get_allocated() const {
     return allocated;
@@ -111,10 +119,14 @@ struct bluefs_fnode_t {
     denc(v.extents, p);
     DENC_FINISH(p);
   }
     denc(v.extents, p);
     DENC_FINISH(p);
   }
-
   void reset_delta() {
     allocated_commited = allocated;
   }
   void reset_delta() {
     allocated_commited = allocated;
   }
+  void clone_extents(const bluefs_fnode_t& fnode) {
+    for (const auto& p : fnode.extents) {
+      append_extent(p);
+    }
+  }
   void claim_extents(mempool::bluefs::vector<bluefs_extent_t>& extents) {
     for (const auto& p : extents) {
       append_extent(p);
   void claim_extents(mempool::bluefs::vector<bluefs_extent_t>& extents) {
     for (const auto& p : extents) {
       append_extent(p);
@@ -144,6 +156,12 @@ struct bluefs_fnode_t {
     extents.erase(it);
   }
   
     extents.erase(it);
   }
   
+  void swap(bluefs_fnode_t& other) {
+    std::swap(ino, other.ino);
+    std::swap(size, other.size);
+    std::swap(mtime, other.mtime);
+    swap_extents(other);
+  }
   void swap_extents(bluefs_fnode_t& other) {
     other.extents.swap(extents);
     other.extents_index.swap(extents_index);
   void swap_extents(bluefs_fnode_t& other) {
     other.extents.swap(extents);
     other.extents_index.swap(extents_index);
@@ -285,9 +303,10 @@ struct bluefs_transaction_t {
   void op_file_update_inc(bluefs_fnode_t& file) {
     using ceph::encode;
     bluefs_fnode_delta_t delta;
   void op_file_update_inc(bluefs_fnode_t& file) {
     using ceph::encode;
     bluefs_fnode_delta_t delta;
-    file.make_delta(&delta); //also resets delta to zero
+    file.make_delta(&delta);
     encode((__u8)OP_FILE_UPDATE_INC, op_bl);
     encode(delta, op_bl);
     encode((__u8)OP_FILE_UPDATE_INC, op_bl);
     encode(delta, op_bl);
+    file.reset_delta();
   }
   void op_file_remove(uint64_t ino) {
     using ceph::encode;
   }
   void op_file_remove(uint64_t ino) {
     using ceph::encode;
index 5609db360c702fdcbeaab98f9a91dbe021883929..e0a607270d12ade1fe9ae336998fecfc579fd5ea 100644 (file)
@@ -1820,5 +1820,5 @@ int MemStore::PageSetObject::truncate(uint64_t size)
 MemStore::ObjectRef MemStore::Collection::create_object() const {
   if (use_page_set)
     return ceph::make_ref<PageSetObject>(cct->_conf->memstore_page_size);
 MemStore::ObjectRef MemStore::Collection::create_object() const {
   if (use_page_set)
     return ceph::make_ref<PageSetObject>(cct->_conf->memstore_page_size);
-  return new BufferlistObject();
+  return make_ref<BufferlistObject>();
 }
 }
index a21b04a688db063601d40a786af63e2b2c12e0a9..aed5057b455970b7c79b8f9a8d04352f54b489c8 100644 (file)
@@ -2132,6 +2132,17 @@ int OSD::write_meta(CephContext *cct, ObjectStore *store, uuid_d& cluster_fsid,
       return r;
   }
 
       return r;
   }
 
+  r = store->write_meta("ceph_version_when_created", pretty_version_to_str());
+  if (r < 0)
+    return r;
+
+  ostringstream created_at;
+  utime_t now = ceph_clock_now();
+  now.gmtime(created_at);
+  r = store->write_meta("created_at", created_at.str());
+  if (r < 0)
+    return r;
+
   r = store->write_meta("ready", "ready");
   if (r < 0)
     return r;
   r = store->write_meta("ready", "ready");
   if (r < 0)
     return r;
@@ -2422,6 +2433,7 @@ class OSDSocketHook : public AdminSocketHook {
 public:
   explicit OSDSocketHook(OSD *o) : osd(o) {}
   int call(std::string_view prefix, const cmdmap_t& cmdmap,
 public:
   explicit OSDSocketHook(OSD *o) : osd(o) {}
   int call(std::string_view prefix, const cmdmap_t& cmdmap,
+          const bufferlist& inbl,
           Formatter *f,
           std::ostream& ss,
           bufferlist& out) override {
           Formatter *f,
           std::ostream& ss,
           bufferlist& out) override {
@@ -2786,6 +2798,8 @@ will start to track new ops received afterwards.";
     store->generate_db_histogram(f);
   } else if (prefix == "flush_store_cache") {
     store->flush_cache(&ss);
     store->generate_db_histogram(f);
   } else if (prefix == "flush_store_cache") {
     store->flush_cache(&ss);
+  } else if (prefix == "rotate-stored-key") {
+    store->write_meta("osd_key", inbl.to_str());
   } else if (prefix == "dump_pgstate_history") {
     f->open_object_section("pgstate_history");
     f->open_array_section("pgs");
   } else if (prefix == "dump_pgstate_history") {
     f->open_object_section("pgstate_history");
     f->open_array_section("pgs");
@@ -3171,6 +3185,7 @@ int OSD::run_osd_bench_test(
   ostream &ss)
 {
   int ret = 0;
   ostream &ss)
 {
   int ret = 0;
+  srand(time(NULL) % (unsigned long) -1);
   uint32_t duration = cct->_conf->osd_bench_duration;
 
   if (bsize > (int64_t) cct->_conf->osd_bench_max_block_size) {
   uint32_t duration = cct->_conf->osd_bench_duration;
 
   if (bsize > (int64_t) cct->_conf->osd_bench_max_block_size) {
@@ -3252,12 +3267,6 @@ int OSD::run_osd_bench_test(
     }
   }
 
     }
   }
 
-  bufferlist bl;
-  bufferptr bp(bsize);
-  memset(bp.c_str(), 'a', bp.length());
-  bl.push_back(std::move(bp));
-  bl.rebuild_page_aligned();
-
   {
     C_SaferCond waiter;
     if (!service.meta_ch->flush_commit(&waiter)) {
   {
     C_SaferCond waiter;
     if (!service.meta_ch->flush_commit(&waiter)) {
@@ -3265,10 +3274,15 @@ int OSD::run_osd_bench_test(
     }
   }
 
     }
   }
 
+  bufferlist bl;
   utime_t start = ceph_clock_now();
   for (int64_t pos = 0; pos < count; pos += bsize) {
     char nm[30];
     unsigned offset = 0;
   utime_t start = ceph_clock_now();
   for (int64_t pos = 0; pos < count; pos += bsize) {
     char nm[30];
     unsigned offset = 0;
+    bufferptr bp(bsize);
+    memset(bp.c_str(), rand() & 0xff, bp.length());
+    bl.push_back(std::move(bp));
+    bl.rebuild_page_aligned();
     if (onum && osize) {
       snprintf(nm, sizeof(nm), "disk_bw_test_%d", (int)(rand() % onum));
       offset = rand() % (osize / bsize) * bsize;
     if (onum && osize) {
       snprintf(nm, sizeof(nm), "disk_bw_test_%d", (int)(rand() % onum));
       offset = rand() % (osize / bsize) * bsize;
@@ -3283,6 +3297,7 @@ int OSD::run_osd_bench_test(
     if (!onum || !osize) {
       cleanupt.remove(coll_t::meta(), ghobject_t(soid));
     }
     if (!onum || !osize) {
       cleanupt.remove(coll_t::meta(), ghobject_t(soid));
     }
+    bl.clear();
   }
 
   {
   }
 
   {
@@ -3312,6 +3327,7 @@ class TestOpsSocketHook : public AdminSocketHook {
 public:
   TestOpsSocketHook(OSDService *s, ObjectStore *st) : service(s), store(st) {}
   int call(std::string_view command, const cmdmap_t& cmdmap,
 public:
   TestOpsSocketHook(OSDService *s, ObjectStore *st) : service(s), store(st) {}
   int call(std::string_view command, const cmdmap_t& cmdmap,
+          const bufferlist&,
           Formatter *f,
           std::ostream& errss,
           bufferlist& out) override {
           Formatter *f,
           std::ostream& errss,
           bufferlist& out) override {
@@ -3813,7 +3829,8 @@ int OSD::init()
     derr << "unable to obtain rotating service keys; retrying" << dendl;
     ++rotating_auth_attempts;
     if (rotating_auth_attempts > g_conf()->max_rotating_auth_attempts) {
     derr << "unable to obtain rotating service keys; retrying" << dendl;
     ++rotating_auth_attempts;
     if (rotating_auth_attempts > g_conf()->max_rotating_auth_attempts) {
-        derr << __func__ << " wait_auth_rotating timed out" << dendl;
+        derr << __func__ << " wait_auth_rotating timed out"
+            <<" -- maybe I have a clock skew against the monitors?" << dendl;
        exit(1);
     }
   }
        exit(1);
     }
   }
@@ -3861,8 +3878,9 @@ int OSD::init()
   start_boot();
 
   // Override a few options if mclock scheduler is enabled.
   start_boot();
 
   // Override a few options if mclock scheduler is enabled.
-  maybe_override_max_osd_capacity_for_qos();
+  maybe_override_sleep_options_for_qos();
   maybe_override_options_for_qos();
   maybe_override_options_for_qos();
+  maybe_override_max_osd_capacity_for_qos();
 
   return 0;
 
 
   return 0;
 
@@ -3973,6 +3991,10 @@ void OSD::final_init()
                                      asok_hook,
                                      "Flush bluestore internal cache");
   ceph_assert(r == 0);
                                      asok_hook,
                                      "Flush bluestore internal cache");
   ceph_assert(r == 0);
+  r = admin_socket->register_command("rotate-stored-key",
+                                     asok_hook,
+                                     "Update the stored osd_key");
+  ceph_assert(r == 0);
   r = admin_socket->register_command("dump_pgstate_history",
                                     asok_hook,
                                     "show recent state history");
   r = admin_socket->register_command("dump_pgstate_history",
                                     asok_hook,
                                     "show recent state history");
@@ -4310,6 +4332,12 @@ int OSD::shutdown()
     cct->_conf.apply_changes(nullptr);
   }
 
     cct->_conf.apply_changes(nullptr);
   }
 
+  // stop MgrClient earlier as it's more like an internal consumer of OSD
+  // 
+  // should occur before unmounting the database in fast-shutdown to avoid
+  // a race condition (see https://tracker.ceph.com/issues/56101)
+  mgrc.shutdown();
+
   if (cct->_conf->osd_fast_shutdown) {
     // first, stop new task from being taken from op_shardedwq
     // and clear all pending tasks
   if (cct->_conf->osd_fast_shutdown) {
     // first, stop new task from being taken from op_shardedwq
     // and clear all pending tasks
@@ -4349,9 +4377,6 @@ int OSD::shutdown()
     _exit(0);
   }
 
     _exit(0);
   }
 
-  // stop MgrClient earlier as it's more like an internal consumer of OSD
-  mgrc.shutdown();
-
   service.start_shutdown();
 
   // stop sending work to pgs.  this just prevents any new work in _process
   service.start_shutdown();
 
   // stop sending work to pgs.  this just prevents any new work in _process
@@ -6784,6 +6809,18 @@ void OSD::_collect_metadata(map<string,string> *pm)
     osdspec_affinity = "";
   }
   (*pm)["osdspec_affinity"] = osdspec_affinity;
     osdspec_affinity = "";
   }
   (*pm)["osdspec_affinity"] = osdspec_affinity;
+  string ceph_version_when_created;
+  r = store->read_meta("ceph_version_when_created", &ceph_version_when_created);
+  if (r <0 || ceph_version_when_created.empty()) {
+    ceph_version_when_created = "";
+  }
+  (*pm)["ceph_version_when_created"] = ceph_version_when_created;
+  string created_at;
+  r = store->read_meta("created_at", &created_at);
+  if (r < 0 || created_at.empty()) {
+    created_at = "";
+  }
+  (*pm)["created_at"] = created_at;
   store->collect_metadata(pm);
 
   collect_sys_info(pm, cct);
   store->collect_metadata(pm);
 
   collect_sys_info(pm, cct);
@@ -9964,7 +10001,17 @@ void OSD::handle_conf_change(const ConfigProxy& conf,
   std::lock_guard l{osd_lock};
 
   if (changed.count("osd_max_backfills") ||
   std::lock_guard l{osd_lock};
 
   if (changed.count("osd_max_backfills") ||
-      changed.count("osd_delete_sleep") ||
+      changed.count("osd_recovery_max_active") ||
+      changed.count("osd_recovery_max_active_hdd") ||
+      changed.count("osd_recovery_max_active_ssd")) {
+    if (!maybe_override_options_for_qos(&changed) &&
+        changed.count("osd_max_backfills")) {
+      // Scheduler is not "mclock". Fallback to earlier behavior
+      service.local_reserver.set_max(cct->_conf->osd_max_backfills);
+      service.remote_reserver.set_max(cct->_conf->osd_max_backfills);
+    }
+  }
+  if (changed.count("osd_delete_sleep") ||
       changed.count("osd_delete_sleep_hdd") ||
       changed.count("osd_delete_sleep_ssd") ||
       changed.count("osd_delete_sleep_hybrid") ||
       changed.count("osd_delete_sleep_hdd") ||
       changed.count("osd_delete_sleep_ssd") ||
       changed.count("osd_delete_sleep_hybrid") ||
@@ -9976,16 +10023,8 @@ void OSD::handle_conf_change(const ConfigProxy& conf,
       changed.count("osd_recovery_sleep") ||
       changed.count("osd_recovery_sleep_hdd") ||
       changed.count("osd_recovery_sleep_ssd") ||
       changed.count("osd_recovery_sleep") ||
       changed.count("osd_recovery_sleep_hdd") ||
       changed.count("osd_recovery_sleep_ssd") ||
-      changed.count("osd_recovery_sleep_hybrid") ||
-      changed.count("osd_recovery_max_active") ||
-      changed.count("osd_recovery_max_active_hdd") ||
-      changed.count("osd_recovery_max_active_ssd")) {
-    if (!maybe_override_options_for_qos() &&
-        changed.count("osd_max_backfills")) {
-      // Scheduler is not "mclock". Fallback to earlier behavior
-      service.local_reserver.set_max(cct->_conf->osd_max_backfills);
-      service.remote_reserver.set_max(cct->_conf->osd_max_backfills);
-    }
+      changed.count("osd_recovery_sleep_hybrid")) {
+    maybe_override_sleep_options_for_qos();
   }
   if (changed.count("osd_min_recovery_priority")) {
     service.local_reserver.set_min_priority(cct->_conf->osd_min_recovery_priority);
   }
   if (changed.count("osd_min_recovery_priority")) {
     service.local_reserver.set_min_priority(cct->_conf->osd_min_recovery_priority);
@@ -10094,11 +10133,11 @@ void OSD::maybe_override_max_osd_capacity_for_qos()
       max_capacity_iops_config = "osd_mclock_max_capacity_iops_ssd";
     }
 
       max_capacity_iops_config = "osd_mclock_max_capacity_iops_ssd";
     }
 
+    double default_iops = 0.0;
+    double cur_iops = 0.0;
     if (!force_run_benchmark) {
     if (!force_run_benchmark) {
-      double default_iops = 0.0;
-
       // Get the current osd iops capacity
       // Get the current osd iops capacity
-      double cur_iops = cct->_conf.get_val<double>(max_capacity_iops_config);
+      cur_iops = cct->_conf.get_val<double>(max_capacity_iops_config);
 
       // Get the default max iops capacity
       auto val = cct->_conf.get_val_default(max_capacity_iops_config);
 
       // Get the default max iops capacity
       auto val = cct->_conf.get_val_default(max_capacity_iops_config);
@@ -10149,44 +10188,133 @@ void OSD::maybe_override_max_osd_capacity_for_qos()
             << " elapsed_sec: " << elapsed
             << dendl;
 
             << " elapsed_sec: " << elapsed
             << dendl;
 
-    // Persist iops to the MON store
-    ret = mon_cmd_set_config(max_capacity_iops_config, std::to_string(iops));
-    if (ret < 0) {
-      // Fallback to setting the config within the in-memory "values" map.
-      cct->_conf.set_val(max_capacity_iops_config, std::to_string(iops));
+    // Get the threshold IOPS set for the underlying hdd/ssd.
+    double threshold_iops = 0.0;
+    if (store_is_rotational) {
+      threshold_iops = cct->_conf.get_val<double>(
+        "osd_mclock_iops_capacity_threshold_hdd");
+    } else {
+      threshold_iops = cct->_conf.get_val<double>(
+        "osd_mclock_iops_capacity_threshold_ssd");
+    }
+
+    // Persist the iops value to the MON store or throw cluster warning
+    // if the measured iops exceeds the set threshold. If the iops exceed
+    // the threshold, the default value is used.
+    if (iops > threshold_iops) {
+      clog->warn() << "OSD bench result of " << std::to_string(iops)
+                   << " IOPS exceeded the threshold limit of "
+                   << std::to_string(threshold_iops) << " IOPS for osd."
+                   << std::to_string(whoami) << ". IOPS capacity is unchanged"
+                   << " at " << std::to_string(cur_iops) << " IOPS. The"
+                   << " recommendation is to establish the osd's IOPS capacity"
+                   << " using other benchmark tools (e.g. Fio) and then"
+                   << " override osd_mclock_max_capacity_iops_[hdd|ssd].";
+    } else {
+      mon_cmd_set_config(max_capacity_iops_config, std::to_string(iops));
     }
     }
+  }
+}
 
 
-    // Override the max osd capacity for all shards
-    for (auto& shard : shards) {
-      shard->update_scheduler_config();
+bool OSD::maybe_override_options_for_qos(const std::set<std::string> *changed)
+{
+  // Override options only if the scheduler enabled is mclock and the
+  // underlying objectstore is supported by mclock
+  if (cct->_conf.get_val<std::string>("osd_op_queue") == "mclock_scheduler" &&
+      !unsupported_objstore_for_qos()) {
+    static const std::map<std::string, uint64_t> recovery_qos_defaults {
+      {"osd_recovery_max_active", 0},
+      {"osd_recovery_max_active_hdd", 10},
+      {"osd_recovery_max_active_ssd", 20},
+      {"osd_max_backfills", 10},
+    };
+
+    // Check if we were called because of a configuration change
+    if (changed != nullptr) {
+      if (cct->_conf.get_val<bool>("osd_mclock_override_recovery_settings")) {
+        if (changed->count("osd_max_backfills")) {
+          dout(1) << __func__ << " Set local and remote max backfills to "
+                   << cct->_conf->osd_max_backfills << dendl;
+          service.local_reserver.set_max(cct->_conf->osd_max_backfills);
+          service.remote_reserver.set_max(cct->_conf->osd_max_backfills);
+        }
+      } else {
+        // Recovery options change was attempted without setting
+        // the 'osd_mclock_override_recovery_settings' option.
+        // Find the key to remove from the configuration db.
+        std::string key;
+        if (changed->count("osd_max_backfills")) {
+          key = "osd_max_backfills";
+        } else if (changed->count("osd_recovery_max_active")) {
+          key = "osd_recovery_max_active";
+        } else if (changed->count("osd_recovery_max_active_hdd")) {
+          key = "osd_recovery_max_active_hdd";
+        } else if (changed->count("osd_recovery_max_active_ssd")) {
+          key = "osd_recovery_max_active_ssd";
+        } else {
+          // No key that we are interested in. Return.
+          return true;
+        }
+
+        // Remove the current entry from the configuration if
+        // different from its default value.
+        auto val = recovery_qos_defaults.find(key);
+        if (val != recovery_qos_defaults.end() &&
+            cct->_conf.get_val<uint64_t>(key) != val->second) {
+          static const std::vector<std::string> osds = {
+            "osd",
+            "osd." + std::to_string(whoami)
+          };
+
+          for (auto osd : osds) {
+            std::string cmd =
+              "{"
+                "\"prefix\": \"config rm\", "
+                "\"who\": \"" + osd + "\", "
+                "\"name\": \"" + key + "\""
+              "}";
+            vector<std::string> vcmd{cmd};
+
+            dout(1) << __func__ << " Removing Key: " << key
+                    << " for " << osd << " from Mon db" << dendl;
+            monc->start_mon_command(vcmd, {}, nullptr, nullptr, nullptr);
+          }
+
+          // Raise a cluster warning indicating that the changes did not
+          // take effect and indicate the reason why.
+          clog->warn() << "Change to " << key << " on osd."
+                       << std::to_string(whoami) << " did not take effect."
+                       << " Enable osd_mclock_override_recovery_settings before"
+                       << " setting this option.";
+        }
+      }
+    } else { // if (changed != nullptr) (osd boot-up)
+      // Override the default recovery max active and max backfills to
+      // higher values based on the type of backing device (hdd/ssd).
+      // This section is executed only during osd boot-up.
+      for (auto opt : recovery_qos_defaults) {
+        cct->_conf.set_val_default(opt.first, std::to_string(opt.second));
+        if (opt.first == "osd_max_backfills") {
+          service.local_reserver.set_max(opt.second);
+          service.remote_reserver.set_max(opt.second);
+        }
+        dout(1) << __func__ << " Set default value for " << opt.first
+                << " to " << opt.second << dendl;
+      }
     }
     }
+    return true;
   }
   }
+  return false;
 }
 
 }
 
-bool OSD::maybe_override_options_for_qos()
+void OSD::maybe_override_sleep_options_for_qos()
 {
 {
-  // If the scheduler enabled is mclock, override the recovery, backfill
-  // and sleep options so that mclock can meet the QoS goals.
+  // Override options only if the scheduler enabled is mclock and the
+  // underlying objectstore is supported by mclock
   if (cct->_conf.get_val<std::string>("osd_op_queue") == "mclock_scheduler" &&
       !unsupported_objstore_for_qos()) {
   if (cct->_conf.get_val<std::string>("osd_op_queue") == "mclock_scheduler" &&
       !unsupported_objstore_for_qos()) {
-    dout(1) << __func__
-            << ": Changing recovery/backfill/sleep settings for QoS" << dendl;
-
-    // Set high value for recovery max active
-    uint32_t rec_max_active = 1000;
-    cct->_conf.set_val(
-      "osd_recovery_max_active", std::to_string(rec_max_active));
-    cct->_conf.set_val(
-      "osd_recovery_max_active_hdd", std::to_string(rec_max_active));
-    cct->_conf.set_val(
-      "osd_recovery_max_active_ssd", std::to_string(rec_max_active));
-
-    // Set high value for osd_max_backfill
-    uint32_t max_backfills = 1000;
-    cct->_conf.set_val("osd_max_backfills", std::to_string(max_backfills));
-    service.local_reserver.set_max(max_backfills);
-    service.remote_reserver.set_max(max_backfills);
 
 
+    // Override the various sleep settings
     // Disable recovery sleep
     cct->_conf.set_val("osd_recovery_sleep", std::to_string(0));
     cct->_conf.set_val("osd_recovery_sleep_hdd", std::to_string(0));
     // Disable recovery sleep
     cct->_conf.set_val("osd_recovery_sleep", std::to_string(0));
     cct->_conf.set_val("osd_recovery_sleep_hdd", std::to_string(0));
@@ -10207,12 +10335,44 @@ bool OSD::maybe_override_options_for_qos()
 
     // Disable scrub sleep
     cct->_conf.set_val("osd_scrub_sleep", std::to_string(0));
 
     // Disable scrub sleep
     cct->_conf.set_val("osd_scrub_sleep", std::to_string(0));
-    return true;
   }
   }
-  return false;
 }
 
 }
 
-int OSD::mon_cmd_set_config(const std::string &key, const std::string &val)
+/**
+ * A context for receiving status from a background mon command to set
+ * a config option and optionally apply the changes on each op shard.
+ */
+class MonCmdSetConfigOnFinish : public Context {
+  OSD *osd;
+  CephContext *cct;
+  std::string key;
+  std::string val;
+  bool update_shard;
+public:
+  explicit MonCmdSetConfigOnFinish(
+    OSD *o,
+    CephContext *cct,
+    const std::string &k,
+    const std::string &v,
+    const bool s)
+      : osd(o), cct(cct), key(k), val(v), update_shard(s) {}
+  void finish(int r) override {
+    if (r != 0) {
+      // Fallback to setting the config within the in-memory "values" map.
+      cct->_conf.set_val_default(key, val);
+    }
+
+    // If requested, apply this option on the
+    // active scheduler of each op shard.
+    if (update_shard) {
+      for (auto& shard : osd->shards) {
+        shard->update_scheduler_config();
+      }
+    }
+  }
+};
+
+void OSD::mon_cmd_set_config(const std::string &key, const std::string &val)
 {
   std::string cmd =
     "{"
 {
   std::string cmd =
     "{"
@@ -10221,21 +10381,20 @@ int OSD::mon_cmd_set_config(const std::string &key, const std::string &val)
       "\"name\": \"" + key + "\", "
       "\"value\": \"" + val + "\""
     "}";
       "\"name\": \"" + key + "\", "
       "\"value\": \"" + val + "\""
     "}";
-
   vector<std::string> vcmd{cmd};
   vector<std::string> vcmd{cmd};
-  bufferlist inbl;
-  std::string outs;
-  C_SaferCond cond;
-  monc->start_mon_command(vcmd, inbl, nullptr, &outs, &cond);
-  int r = cond.wait();
-  if (r < 0) {
-    derr << __func__ << " Failed to set config key " << key
-         << " err: " << cpp_strerror(r)
-         << " errstr: " << outs << dendl;
-    return r;
-  }
 
 
-  return 0;
+  // List of config options to be distributed across each op shard.
+  // Currently limited to a couple of mClock options.
+  static const std::vector<std::string> shard_option =
+    { "osd_mclock_max_capacity_iops_hdd", "osd_mclock_max_capacity_iops_ssd" };
+  const bool update_shard = std::find(shard_option.begin(),
+                                      shard_option.end(),
+                                      key) != shard_option.end();
+
+  auto on_finish = new MonCmdSetConfigOnFinish(this, cct, key,
+                                               val, update_shard);
+  dout(10) << __func__ << " Set " << key << " = " << val << dendl;
+  monc->start_mon_command(vcmd, {}, nullptr, nullptr, on_finish);
 }
 
 bool OSD::unsupported_objstore_for_qos()
 }
 
 bool OSD::unsupported_objstore_for_qos()
@@ -10764,8 +10923,8 @@ OSDShard::OSDShard(
     shard_lock_name(shard_name + "::shard_lock"),
     shard_lock{make_mutex(shard_lock_name)},
     scheduler(ceph::osd::scheduler::make_scheduler(
     shard_lock_name(shard_name + "::shard_lock"),
     shard_lock{make_mutex(shard_lock_name)},
     scheduler(ceph::osd::scheduler::make_scheduler(
-      cct, osd->num_shards, osd->store->is_rotational(),
-      osd->store->get_type())),
+      cct, osd->whoami, osd->num_shards, id, osd->store->is_rotational(),
+      osd->store->get_type(), osd->monc)),
     context_queue(sdata_wait_lock, sdata_cond)
 {
   dout(0) << "using op scheduler " << *scheduler << dendl;
     context_queue(sdata_wait_lock, sdata_cond)
 {
   dout(0) << "using op scheduler " << *scheduler << dendl;
index 2da5de10aa69bb426dff0287109d404b75c3fcde..18946f1e967829300e17250e7231a5c10bc15945 100644 (file)
@@ -2057,14 +2057,16 @@ private:
 
   int get_recovery_max_active();
   void maybe_override_max_osd_capacity_for_qos();
 
   int get_recovery_max_active();
   void maybe_override_max_osd_capacity_for_qos();
-  bool maybe_override_options_for_qos();
+  void maybe_override_sleep_options_for_qos();
+  bool maybe_override_options_for_qos(
+    const std::set<std::string> *changed = nullptr);
   int run_osd_bench_test(int64_t count,
                          int64_t bsize,
                          int64_t osize,
                          int64_t onum,
                          double *elapsed,
                          std::ostream& ss);
   int run_osd_bench_test(int64_t count,
                          int64_t bsize,
                          int64_t osize,
                          int64_t onum,
                          double *elapsed,
                          std::ostream& ss);
-  int mon_cmd_set_config(const std::string &key, const std::string &val);
+  void mon_cmd_set_config(const std::string &key, const std::string &val);
   bool unsupported_objstore_for_qos();
 
   void scrub_purged_snaps();
   bool unsupported_objstore_for_qos();
 
   void scrub_purged_snaps();
index 216c30446a95a216230681f94feb73cf3f7db3bd..8f779c41e6698a39a390feab47ff4e941ec32e43 100644 (file)
@@ -325,7 +325,7 @@ public:
     }
   }
 
     }
   }
 
-  const mempool::osdmap_mapping::vector<pg_t>& get_osd_acting_pgs(unsigned osd) { 
+  const mempool::osdmap_mapping::vector<pg_t>& get_osd_acting_pgs(unsigned osd) {
     ceph_assert(osd < acting_rmap.size());
     return acting_rmap[osd];
   }
     ceph_assert(osd < acting_rmap.size());
     return acting_rmap[osd];
   }
index 9ae6b2c14e5c2670dcffbf70984cc9fbdda801c6..d79dc518809623c35f83574d9c6551f277800969 100644 (file)
@@ -157,8 +157,6 @@ void PGBackend::handle_recovery_delete(OpRequestRef op)
     [=](int r) {
       if (r != -EAGAIN) {
        get_parent()->send_message_osd_cluster(reply, conn.get());
     [=](int r) {
       if (r != -EAGAIN) {
        get_parent()->send_message_osd_cluster(reply, conn.get());
-      } else {
-       reply->put();
       }
     }));
   gather.activate();
       }
     }));
   gather.activate();
index 4a54e6ebe2cd7de884dedb1a6842675b692df270..1a2c1149c7b75c97c7edf780618c83c055575bb4 100644 (file)
@@ -572,7 +572,7 @@ public:
   }
   void send_message_osd_cluster(
     MessageRef m, Connection *con) override {
   }
   void send_message_osd_cluster(
     MessageRef m, Connection *con) override {
-    osd->send_message_osd_cluster(m, con);
+    osd->send_message_osd_cluster(std::move(m), con);
   }
   void send_message_osd_cluster(
     Message *m, const ConnectionRef& con) override {
   }
   void send_message_osd_cluster(
     Message *m, const ConnectionRef& con) override {
index 55c1bc582b49f36daf116f46a0233690c5632ac2..0d0e743fc8c8b0f5aadd7327a0603ed8bf0a8f0f 100644 (file)
@@ -1525,6 +1525,10 @@ public:
     grade_table.resize(0);
   }
 
     grade_table.resize(0);
   }
 
+  bool has_snaps() const {
+    return snaps.size() > 0;
+  }
+
   bool is_stretch_pool() const {
     return peering_crush_bucket_count != 0;
   }
   bool is_stretch_pool() const {
     return peering_crush_bucket_count != 0;
   }
index b0d14b496b5dd367e4ed517ba87f233bc2bc5453..cb5ef13b6f67770fd91b2ff6ed30d9abf978dc9e 100644 (file)
@@ -22,8 +22,8 @@
 namespace ceph::osd::scheduler {
 
 OpSchedulerRef make_scheduler(
 namespace ceph::osd::scheduler {
 
 OpSchedulerRef make_scheduler(
-  CephContext *cct, uint32_t num_shards,
-  bool is_rotational, std::string_view osd_objectstore)
+  CephContext *cct, int whoami, uint32_t num_shards, int shard_id,
+  bool is_rotational, std::string_view osd_objectstore, MonClient *monc)
 {
   const std::string *type = &cct->_conf->osd_op_queue;
   if (*type == "debug_random") {
 {
   const std::string *type = &cct->_conf->osd_op_queue;
   if (*type == "debug_random") {
@@ -45,7 +45,8 @@ OpSchedulerRef make_scheduler(
     );
   } else if (*type == "mclock_scheduler") {
     // default is 'mclock_scheduler'
     );
   } else if (*type == "mclock_scheduler") {
     // default is 'mclock_scheduler'
-    return std::make_unique<mClockScheduler>(cct, num_shards, is_rotational);
+    return std::make_unique<
+      mClockScheduler>(cct, whoami, num_shards, shard_id, is_rotational, monc);
   } else {
     ceph_assert("Invalid choice of wq" == 0);
   }
   } else {
     ceph_assert("Invalid choice of wq" == 0);
   }
index dc524314f251017468504db28e99e6cd973555bd..1575bcae4f6d9cb845d50c5360608be9058b1efa 100644 (file)
@@ -18,6 +18,7 @@
 #include <variant>
 
 #include "common/ceph_context.h"
 #include <variant>
 
 #include "common/ceph_context.h"
+#include "mon/MonClient.h"
 #include "osd/scheduler/OpSchedulerItem.h"
 
 namespace ceph::osd::scheduler {
 #include "osd/scheduler/OpSchedulerItem.h"
 
 namespace ceph::osd::scheduler {
@@ -61,8 +62,8 @@ std::ostream &operator<<(std::ostream &lhs, const OpScheduler &);
 using OpSchedulerRef = std::unique_ptr<OpScheduler>;
 
 OpSchedulerRef make_scheduler(
 using OpSchedulerRef = std::unique_ptr<OpScheduler>;
 
 OpSchedulerRef make_scheduler(
-  CephContext *cct, uint32_t num_shards, bool is_rotational,
-  std::string_view osd_objectstore);
+  CephContext *cct, int whoami, uint32_t num_shards, int shard_id,
+  bool is_rotational, std::string_view osd_objectstore, MonClient *monc);
 
 /**
  * Implements OpScheduler in terms of OpQueue
 
 /**
  * Implements OpScheduler in terms of OpQueue
index 0f2abf87b68cf99b372156f0fbaa46a750359dc8..4b388bd5217aa2de4fd01049c772f663cca5617e 100644 (file)
@@ -31,11 +31,17 @@ using namespace std::placeholders;
 namespace ceph::osd::scheduler {
 
 mClockScheduler::mClockScheduler(CephContext *cct,
 namespace ceph::osd::scheduler {
 
 mClockScheduler::mClockScheduler(CephContext *cct,
+  int whoami,
   uint32_t num_shards,
   uint32_t num_shards,
-  bool is_rotational)
+  int shard_id,
+  bool is_rotational,
+  MonClient *monc)
   : cct(cct),
   : cct(cct),
+    whoami(whoami),
     num_shards(num_shards),
     num_shards(num_shards),
+    shard_id(shard_id),
     is_rotational(is_rotational),
     is_rotational(is_rotational),
+    monc(monc),
     scheduler(
       std::bind(&mClockScheduler::ClientRegistry::get_info,
                 &client_registry,
     scheduler(
       std::bind(&mClockScheduler::ClientRegistry::get_info,
                 &client_registry,
@@ -102,9 +108,11 @@ void mClockScheduler::set_max_osd_capacity()
   if (is_rotational) {
     max_osd_capacity =
       cct->_conf.get_val<double>("osd_mclock_max_capacity_iops_hdd");
   if (is_rotational) {
     max_osd_capacity =
       cct->_conf.get_val<double>("osd_mclock_max_capacity_iops_hdd");
+    cct->_conf.set_val("osd_mclock_max_capacity_iops_ssd", "0");
   } else {
     max_osd_capacity =
       cct->_conf.get_val<double>("osd_mclock_max_capacity_iops_ssd");
   } else {
     max_osd_capacity =
       cct->_conf.get_val<double>("osd_mclock_max_capacity_iops_ssd");
+    cct->_conf.set_val("osd_mclock_max_capacity_iops_hdd", "0");
   }
   // Set per op-shard iops limit
   max_osd_capacity /= num_shards;
   }
   // Set per op-shard iops limit
   max_osd_capacity /= num_shards;
@@ -337,6 +345,11 @@ void mClockScheduler::enable_mclock_profile_settings()
 
 void mClockScheduler::set_profile_config()
 {
 
 void mClockScheduler::set_profile_config()
 {
+  // Let only a single osd shard (id:0) set the profile configs
+  if (shard_id > 0) {
+    return;
+  }
+
   ClientAllocs client = client_allocs[
     static_cast<size_t>(op_scheduler_class::client)];
   ClientAllocs rec = client_allocs[
   ClientAllocs client = client_allocs[
     static_cast<size_t>(op_scheduler_class::client)];
   ClientAllocs rec = client_allocs[
@@ -376,6 +389,9 @@ void mClockScheduler::set_profile_config()
   dout(10) << __func__ << " Best effort QoS params: " << "["
     << best_effort.res << "," << best_effort.wgt << "," << best_effort.lim
     << "]" << dendl;
   dout(10) << __func__ << " Best effort QoS params: " << "["
     << best_effort.res << "," << best_effort.wgt << "," << best_effort.lim
     << "]" << dendl;
+
+  // Apply the configuration changes
+  update_configuration();
 }
 
 int mClockScheduler::calc_scaled_cost(int item_cost)
 }
 
 int mClockScheduler::calc_scaled_cost(int item_cost)
@@ -542,17 +558,56 @@ void mClockScheduler::handle_conf_change(
       client_registry.update_from_config(conf);
     }
   }
       client_registry.update_from_config(conf);
     }
   }
-  if (changed.count("osd_mclock_scheduler_client_res") ||
-      changed.count("osd_mclock_scheduler_client_wgt") ||
-      changed.count("osd_mclock_scheduler_client_lim") ||
-      changed.count("osd_mclock_scheduler_background_recovery_res") ||
-      changed.count("osd_mclock_scheduler_background_recovery_wgt") ||
-      changed.count("osd_mclock_scheduler_background_recovery_lim") ||
-      changed.count("osd_mclock_scheduler_background_best_effort_res") ||
-      changed.count("osd_mclock_scheduler_background_best_effort_wgt") ||
-      changed.count("osd_mclock_scheduler_background_best_effort_lim")) {
+
+  auto get_changed_key = [&changed]() -> std::optional<std::string> {
+    static const std::vector<std::string> qos_params = {
+      "osd_mclock_scheduler_client_res",
+      "osd_mclock_scheduler_client_wgt",
+      "osd_mclock_scheduler_client_lim",
+      "osd_mclock_scheduler_background_recovery_res",
+      "osd_mclock_scheduler_background_recovery_wgt",
+      "osd_mclock_scheduler_background_recovery_lim",
+      "osd_mclock_scheduler_background_best_effort_res",
+      "osd_mclock_scheduler_background_best_effort_wgt",
+      "osd_mclock_scheduler_background_best_effort_lim"
+    };
+
+    for (auto &qp : qos_params) {
+      if (changed.count(qp)) {
+        return qp;
+      }
+    }
+    return std::nullopt;
+  };
+
+  if (auto key = get_changed_key(); key.has_value()) {
     if (mclock_profile == "custom") {
       client_registry.update_from_config(conf);
     if (mclock_profile == "custom") {
       client_registry.update_from_config(conf);
+    } else {
+      // Attempt to change QoS parameter for a built-in profile. Restore the
+      // profile defaults by making one of the OSD shards remove the key from
+      // config monitor store. Note: monc is included in the check since the
+      // mock unit test currently doesn't initialize it.
+      if (shard_id == 0 && monc) {
+        static const std::vector<std::string> osds = {
+          "osd",
+          "osd." + std::to_string(whoami)
+        };
+
+        for (auto osd : osds) {
+          std::string cmd =
+            "{"
+              "\"prefix\": \"config rm\", "
+              "\"who\": \"" + osd + "\", "
+              "\"name\": \"" + *key + "\""
+            "}";
+          std::vector<std::string> vcmd{cmd};
+
+          dout(10) << __func__ << " Removing Key: " << *key
+                   << " for " << osd << " from Mon db" << dendl;
+          monc->start_mon_command(vcmd, {}, nullptr, nullptr, nullptr);
+        }
+      }
     }
   }
 }
     }
   }
 }
index cb53412c7e0f8f97f9d465fc97860e866d9914a7..f133c7b383a36cbf3798be9190f14f0cfd3cb683 100644 (file)
@@ -78,8 +78,11 @@ WRITE_CMP_OPERATORS_2(scheduler_id_t, class_id, client_profile_id)
 class mClockScheduler : public OpScheduler, md_config_obs_t {
 
   CephContext *cct;
 class mClockScheduler : public OpScheduler, md_config_obs_t {
 
   CephContext *cct;
+  const int whoami;
   const uint32_t num_shards;
   const uint32_t num_shards;
+  const int shard_id;
   bool is_rotational;
   bool is_rotational;
+  MonClient *monc;
   double max_osd_capacity;
   double osd_mclock_cost_per_io;
   double osd_mclock_cost_per_byte;
   double max_osd_capacity;
   double osd_mclock_cost_per_io;
   double osd_mclock_cost_per_byte;
@@ -150,7 +153,8 @@ class mClockScheduler : public OpScheduler, md_config_obs_t {
   }
 
 public:
   }
 
 public:
-  mClockScheduler(CephContext *cct, uint32_t num_shards, bool is_rotational);
+  mClockScheduler(CephContext *cct, int whoami, uint32_t num_shards,
+    int shard_id, bool is_rotational, MonClient *monc);
   ~mClockScheduler() override;
 
   // Set the max osd capacity in iops
   ~mClockScheduler() override;
 
   // Set the max osd capacity in iops
index 220d2933cd00b601d8bb8633cabc27a63cd0ea17..839b57d8d490a50894f8f8563727fc298e03fc63 100644 (file)
@@ -860,7 +860,7 @@ void PgScrubber::get_replicas_maps(bool replica_can_preempt)
   m_primary_scrubmap_pos.reset();
 
   // ask replicas to scan and send maps
   m_primary_scrubmap_pos.reset();
 
   // ask replicas to scan and send maps
-  for (const auto& i : m_pg->get_acting_recovery_backfill()) {
+  for (const auto& i : m_pg->get_actingset()) {
 
     if (i == m_pg_whoami)
       continue;
 
     if (i == m_pg_whoami)
       continue;
@@ -1377,7 +1377,7 @@ void PgScrubber::scrub_compare_maps()
   map<pg_shard_t, ScrubMap*> maps;
   maps[m_pg_whoami] = &m_primary_scrubmap;
 
   map<pg_shard_t, ScrubMap*> maps;
   maps[m_pg_whoami] = &m_primary_scrubmap;
 
-  for (const auto& i : m_pg->get_acting_recovery_backfill()) {
+  for (const auto& i : m_pg->get_actingset()) {
     if (i == m_pg_whoami)
       continue;
     dout(2) << __func__ << " replica " << i << " has "
     if (i == m_pg_whoami)
       continue;
     dout(2) << __func__ << " replica " << i << " has "
@@ -1401,7 +1401,7 @@ void PgScrubber::scrub_compare_maps()
     m_osds->clog->warn(ss);
   }
 
     m_osds->clog->warn(ss);
   }
 
-  if (m_pg->recovery_state.get_acting_recovery_backfill().size() > 1) {
+  if (m_pg->recovery_state.get_actingset().size() > 1) {
 
     dout(10) << __func__ << "  comparing replica scrub maps" << dendl;
 
 
     dout(10) << __func__ << "  comparing replica scrub maps" << dendl;
 
index 7987559d0261f1cd399fd3fc5daa7ae1a0ca2d38..7187679569d633bd7ac6f9da0286c89b1d4337de 100644 (file)
@@ -104,6 +104,14 @@ sc::result NotActive::react(const StartScrub&)
   return transit<ReservingReplicas>();
 }
 
   return transit<ReservingReplicas>();
 }
 
+sc::result NotActive::react(const AfterRepairScrub&)
+{
+  dout(10) << "NotActive::react(const AfterRepairScrub&)" << dendl;
+  DECLARE_LOCALS;
+  scrbr->set_scrub_begin_time();
+  return transit<ReservingReplicas>();
+}
+
 // ----------------------- ReservingReplicas ---------------------------------
 
 ReservingReplicas::ReservingReplicas(my_context ctx) : my_base(ctx)
 // ----------------------- ReservingReplicas ---------------------------------
 
 ReservingReplicas::ReservingReplicas(my_context ctx) : my_base(ctx)
index 41669138a9cc2fb6dedc0a343439014537092629..dbdc50d327adb59710b98774f40e2438309aeda1 100644 (file)
@@ -154,12 +154,12 @@ struct NotActive : sc::state<NotActive, ScrubMachine> {
   explicit NotActive(my_context ctx);
 
   using reactions = mpl::list<sc::custom_reaction<StartScrub>,
   explicit NotActive(my_context ctx);
 
   using reactions = mpl::list<sc::custom_reaction<StartScrub>,
-                             // a scrubbing that was initiated at recovery completion,
-                             // and requires no resource reservations:
-                             sc::transition<AfterRepairScrub, ReservingReplicas>,
+                             // a scrubbing that was initiated at recovery completion
+                             sc::custom_reaction<AfterRepairScrub>,
                              sc::transition<StartReplica, ReplicaWaitUpdates>,
                              sc::transition<StartReplicaNoWait, ActiveReplica>>;
   sc::result react(const StartScrub&);
                              sc::transition<StartReplica, ReplicaWaitUpdates>,
                              sc::transition<StartReplicaNoWait, ActiveReplica>>;
   sc::result react(const StartScrub&);
+  sc::result react(const AfterRepairScrub&);
 };
 
 struct ReservingReplicas : sc::state<ReservingReplicas, ScrubMachine> {
 };
 
 struct ReservingReplicas : sc::state<ReservingReplicas, ScrubMachine> {
index 8084a661d7d34be5cc04986dea37cc83a27d2fb6..04b90fb5952aaf2b430fa0cd97fa0bbc4dd49192 100644 (file)
@@ -991,7 +991,7 @@ void Journaler::_assimilate_prefetch()
 
     // Update readability (this will also hit any decode errors resulting
     // from bad data)
 
     // Update readability (this will also hit any decode errors resulting
     // from bad data)
-    readable = _is_readable();
+    readable = _have_next_entry();
   }
 
   if ((got_any && !was_readable && readable) || read_pos == write_pos) {
   }
 
   if ((got_any && !was_readable && readable) || read_pos == write_pos) {
@@ -1115,9 +1115,9 @@ void Journaler::_prefetch()
 
 
 /*
 
 
 /*
- * _is_readable() - return true if next entry is ready.
+ * _have_next_entry() - return true if next entry is ready.
  */
  */
-bool Journaler::_is_readable()
+bool Journaler::_have_next_entry()
 {
   // anything to read?
   if (read_pos == write_pos)
 {
   // anything to read?
   if (read_pos == write_pos)
@@ -1129,13 +1129,13 @@ bool Journaler::_is_readable()
     return true;
   }
 
     return true;
   }
 
-  ldout (cct, 10) << "_is_readable read_buf.length() == " << read_buf.length()
+  ldout (cct, 10) << "_have_next_entry read_buf.length() == " << read_buf.length()
                  << ", but need " << need << " for next entry; fetch_len is "
                  << fetch_len << dendl;
 
   // partial fragment at the end?
   if (received_pos == write_pos) {
                  << ", but need " << need << " for next entry; fetch_len is "
                  << fetch_len << dendl;
 
   // partial fragment at the end?
   if (received_pos == write_pos) {
-    ldout(cct, 10) << "is_readable() detected partial entry at tail, "
+    ldout(cct, 10) << "_have_next_entry() detected partial entry at tail, "
       "adjusting write_pos to " << read_pos << dendl;
 
     // adjust write_pos
       "adjusting write_pos to " << read_pos << dendl;
 
     // adjust write_pos
@@ -1154,11 +1154,11 @@ bool Journaler::_is_readable()
 
   if (need > fetch_len) {
     temp_fetch_len = need;
 
   if (need > fetch_len) {
     temp_fetch_len = need;
-    ldout(cct, 10) << "_is_readable noting temp_fetch_len " << temp_fetch_len
+    ldout(cct, 10) << "_have_next_entry noting temp_fetch_len " << temp_fetch_len
                   << dendl;
   }
 
                   << dendl;
   }
 
-  ldout(cct, 10) << "_is_readable: not readable, returning false" << dendl;
+  ldout(cct, 10) << "_have_next_entry: not readable, returning false" << dendl;
   return false;
 }
 
   return false;
 }
 
@@ -1168,7 +1168,11 @@ bool Journaler::_is_readable()
 bool Journaler::is_readable()
 {
   lock_guard l(lock);
 bool Journaler::is_readable()
 {
   lock_guard l(lock);
+  return _is_readable();
+}
 
 
+bool Journaler::_is_readable()
+{
   if (error != 0) {
     return false;
   }
   if (error != 0) {
     return false;
   }
@@ -1264,9 +1268,9 @@ bool Journaler::try_read_entry(bufferlist& bl)
   read_pos += consumed;
   try {
     // We were readable, we might not be any more
   read_pos += consumed;
   try {
     // We were readable, we might not be any more
-    readable = _is_readable();
+    readable = _have_next_entry();
   } catch (const buffer::error &e) {
   } catch (const buffer::error &e) {
-    lderr(cct) << __func__ << ": decode error from _is_readable" << dendl;
+    lderr(cct) << __func__ << ": decode error from _have_next_entry" << dendl;
     error = -EINVAL;
     return false;
   }
     error = -EINVAL;
     return false;
   }
@@ -1286,6 +1290,11 @@ bool Journaler::try_read_entry(bufferlist& bl)
 void Journaler::wait_for_readable(Context *onreadable)
 {
   lock_guard l(lock);
 void Journaler::wait_for_readable(Context *onreadable)
 {
   lock_guard l(lock);
+  _wait_for_readable(onreadable); 
+}
+
+void Journaler::_wait_for_readable(Context *onreadable)
+{
   if (is_stopping()) {
     finisher->queue(onreadable, -EAGAIN);
     return;
   if (is_stopping()) {
     finisher->queue(onreadable, -EAGAIN);
     return;
@@ -1606,3 +1615,17 @@ void Journaler::shutdown()
   waitfor_safe.clear();
 }
 
   waitfor_safe.clear();
 }
 
+void Journaler::check_isreadable()
+{
+  std::unique_lock l(lock);
+  while (!_is_readable() &&
+      get_read_pos() < get_write_pos() &&
+      !get_error()) {
+    C_SaferCond readable_waiter;
+    _wait_for_readable(&readable_waiter);
+    l.unlock();
+    readable_waiter.wait();
+    l.lock();
+  }
+  return ;
+}
index 2dcc1197e61119a841228edd6aaca5fad157b5eb..1b40eadec1696d89397c69cf26ee073c58f75999 100644 (file)
@@ -383,7 +383,7 @@ private:
    */
   void handle_write_error(int r);
 
    */
   void handle_write_error(int r);
 
-  bool _is_readable();
+  bool _have_next_entry();
 
   void _finish_erase(int data_result, C_OnFinisher *completion);
   class C_EraseFinish;
 
   void _finish_erase(int data_result, C_OnFinisher *completion);
   class C_EraseFinish;
@@ -459,6 +459,7 @@ public:
   void wait_for_flush(Context *onsafe = 0);
   void flush(Context *onsafe = 0);
   void wait_for_readable(Context *onfinish);
   void wait_for_flush(Context *onsafe = 0);
   void flush(Context *onsafe = 0);
   void wait_for_readable(Context *onfinish);
+  void _wait_for_readable(Context *onfinish);
   bool have_waiter() const;
   void wait_for_prezero(Context *onfinish);
 
   bool have_waiter() const;
   void wait_for_prezero(Context *onfinish);
 
@@ -527,6 +528,7 @@ public:
   int get_error() { return error; }
   bool is_readonly() { return readonly; }
   bool is_readable();
   int get_error() { return error; }
   bool is_readonly() { return readonly; }
   bool is_readable();
+  bool _is_readable();
   bool try_read_entry(bufferlist& bl);
   uint64_t get_write_pos() const { return write_pos; }
   uint64_t get_write_safe_pos() const { return safe_pos; }
   bool try_read_entry(bufferlist& bl);
   uint64_t get_write_pos() const { return write_pos; }
   uint64_t get_write_safe_pos() const { return safe_pos; }
@@ -536,6 +538,7 @@ public:
   size_t get_journal_envelope_size() const { 
     return journal_stream.get_envelope_size(); 
   }
   size_t get_journal_envelope_size() const { 
     return journal_stream.get_envelope_size(); 
   }
+  void check_isreadable();
 };
 WRITE_CLASS_ENCODER(Journaler::Header)
 
 };
 WRITE_CLASS_ENCODER(Journaler::Header)
 
index 708c12cc9e6ec631ed4e26fdbe7cda06ad33e538..e821b4ee00f0443a750726fe8d06d5dfbd0586eb 100644 (file)
@@ -193,6 +193,7 @@ class Objecter::RequestStateHook : public AdminSocketHook {
 public:
   explicit RequestStateHook(Objecter *objecter);
   int call(std::string_view command, const cmdmap_t& cmdmap,
 public:
   explicit RequestStateHook(Objecter *objecter);
   int call(std::string_view command, const cmdmap_t& cmdmap,
+          const bufferlist&,
           Formatter *f,
           std::ostream& ss,
           cb::list& out) override;
           Formatter *f,
           std::ostream& ss,
           cb::list& out) override;
@@ -4707,6 +4708,7 @@ Objecter::RequestStateHook::RequestStateHook(Objecter *objecter) :
 
 int Objecter::RequestStateHook::call(std::string_view command,
                                     const cmdmap_t& cmdmap,
 
 int Objecter::RequestStateHook::call(std::string_view command,
                                     const cmdmap_t& cmdmap,
+                                    const bufferlist&,
                                     Formatter *f,
                                     std::ostream& ss,
                                     cb::list& out)
                                     Formatter *f,
                                     std::ostream& ss,
                                     cb::list& out)
index 71a6a3f044af5733ec8be2c3baedde7f70f85de4..251302fb262ccbb3dcb6fff2a3f300f6084fa7f1 100644 (file)
@@ -1903,9 +1903,9 @@ cdef class LibCephFS(object):
 
     def lstat(self, path):
         """
 
     def lstat(self, path):
         """
-        Get a file's extended statistics and attributes. When file's a
-        symbolic link, return the informaion of the link itself rather
-        than that of the file it points too.
+        Get a file's extended statistics and attributes. If the file is a
+        symbolic link, return the information of the link itself rather than
+        the information of the file it points to.
 
         :param path: the file or directory to get the statistics of.
         """
 
         :param path: the file or directory to get the statistics of.
         """
index d313bc4de848dc801a79ac9582a4dd2276210926..19d4b09cfe539a76d1e723fcf30038e1c61c5b79 100644 (file)
@@ -324,6 +324,7 @@ class Module(MgrModule):
     last_optimize_started = ''
     last_optimize_duration = ''
     optimize_result = ''
     last_optimize_started = ''
     last_optimize_duration = ''
     optimize_result = ''
+    no_optimization_needed = False
     success_string = 'Optimization plan created successfully'
     in_progress_string = 'in progress'
 
     success_string = 'Optimization plan created successfully'
     in_progress_string = 'in progress'
 
@@ -342,6 +343,7 @@ class Module(MgrModule):
             'last_optimize_started': self.last_optimize_started,
             'last_optimize_duration': self.last_optimize_duration,
             'optimize_result': self.optimize_result,
             'last_optimize_started': self.last_optimize_started,
             'last_optimize_duration': self.last_optimize_duration,
             'optimize_result': self.optimize_result,
+            'no_optimization_needed': self.no_optimization_needed,
             'mode': self.get_module_option('mode'),
         }
         return (0, json.dumps(s, indent=4, sort_keys=True), '')
             'mode': self.get_module_option('mode'),
         }
         return (0, json.dumps(s, indent=4, sort_keys=True), '')
@@ -1023,6 +1025,7 @@ class Module(MgrModule):
                 break
         self.log.info('prepared %d/%d changes' % (total_did, max_optimizations))
         if total_did == 0:
                 break
         self.log.info('prepared %d/%d changes' % (total_did, max_optimizations))
         if total_did == 0:
+            self.no_optimization_needed = True
             return -errno.EALREADY, 'Unable to find further optimization, ' \
                                     'or pool(s) pg_num is decreasing, ' \
                                     'or distribution is already perfect'
             return -errno.EALREADY, 'Unable to find further optimization, ' \
                                     'or pool(s) pg_num is decreasing, ' \
                                     'or distribution is already perfect'
index 1719192957611c7bfb34332d98a9afc43a89f33d..b89402d01be09ef6a53f5d1ef46e5463d3ea7e7e 100644 (file)
@@ -115,3 +115,4 @@ class BaseMgrModule(object):
     def _ceph_unregister_client(self, addrs: str) -> None: ...
     def _ceph_register_client(self, addrs: str) -> None: ...
     def _ceph_is_authorized(self, arguments: Dict[str, str]) -> bool: ...
     def _ceph_unregister_client(self, addrs: str) -> None: ...
     def _ceph_register_client(self, addrs: str) -> None: ...
     def _ceph_is_authorized(self, arguments: Dict[str, str]) -> bool: ...
+    def _ceph_get_daemon_health_metrics(self) -> Dict[str, List[Dict[str, Any]]]: ...
index fa75a8759bbcf3907ef8bd941b25b612106418f6..053652c45575131f163214b2b9a5bde84ed1f1a5 100644 (file)
@@ -15,7 +15,7 @@ from orchestrator._interface import daemon_type_to_service
 from ceph.utils import datetime_now
 from ceph.deployment.inventory import Devices
 from ceph.deployment.service_spec import ServiceSpec, PlacementSpec
 from ceph.utils import datetime_now
 from ceph.deployment.inventory import Devices
 from ceph.deployment.service_spec import ServiceSpec, PlacementSpec
-from cephadm.services.cephadmservice import CephadmDaemonDeploySpec
+from cephadm.services.cephadmservice import CephadmDaemonDeploySpec, CephExporterService
 from cephadm.services.ingress import IngressSpec
 
 from datetime import datetime, timedelta
 from cephadm.services.ingress import IngressSpec
 
 from datetime import datetime, timedelta
@@ -183,6 +183,8 @@ class Root(object):
             return self.node_exporter_sd_config()
         elif service == 'haproxy':
             return self.haproxy_sd_config()
             return self.node_exporter_sd_config()
         elif service == 'haproxy':
             return self.haproxy_sd_config()
+        elif service == 'ceph-exporter':
+            return self.ceph_exporter_sd_config()
         else:
             return []
 
         else:
             return []
 
@@ -237,6 +239,19 @@ class Root(object):
                     })
         return srv_entries
 
                     })
         return srv_entries
 
+    def ceph_exporter_sd_config(self) -> List[Dict[str, Collection[str]]]:
+        """Return <http_sd_config> compatible prometheus config for ceph-exporter service."""
+        srv_entries = []
+        for dd in self.mgr.cache.get_daemons_by_service('ceph-exporter'):
+            assert dd.hostname is not None
+            addr = dd.ip if dd.ip else self.mgr.inventory.get_addr(dd.hostname)
+            port = dd.ports[0] if dd.ports else CephExporterService.DEFAULT_SERVICE_PORT
+            srv_entries.append({
+                'targets': [build_url(host=addr, port=port).lstrip('/')],
+                'labels': {'instance': dd.hostname}
+            })
+        return srv_entries
+
     @cherrypy.expose(alias='prometheus/rules')
     def get_prometheus_rules(self) -> str:
         """Return currently configured prometheus rules as Yaml."""
     @cherrypy.expose(alias='prometheus/rules')
     def get_prometheus_rules(self) -> str:
         """Return currently configured prometheus rules as Yaml."""
index 04385a4fa81cc8e31b420133fcc487bb7b27ecbe..bb7be85f67ff5ebe71c87a6569baa017402f3eda 100644 (file)
@@ -642,12 +642,10 @@ class HostCache():
             del self.last_autotune[host]
 
     def devices_changed(self, host: str, b: List[inventory.Device]) -> bool:
             del self.last_autotune[host]
 
     def devices_changed(self, host: str, b: List[inventory.Device]) -> bool:
-        a = self.devices[host]
-        if len(a) != len(b):
-            return True
-        aj = {d.path: d.to_json() for d in a}
-        bj = {d.path: d.to_json() for d in b}
-        if aj != bj:
+        old_devs = inventory.Devices(self.devices[host])
+        new_devs = inventory.Devices(b)
+        # relying on Devices class __eq__ function here
+        if old_devs != new_devs:
             self.mgr.log.info("Detected new or changed devices on %s" % host)
             return True
         return False
             self.mgr.log.info("Detected new or changed devices on %s" % host)
             return True
         return False
@@ -1236,6 +1234,7 @@ class HostCache():
             'reconfig': 3,
             'redeploy': 4,
             'stop': 5,
             'reconfig': 3,
             'redeploy': 4,
             'stop': 5,
+            'rotate-key': 6,
         }
         existing_action = self.scheduled_daemon_actions.get(host, {}).get(daemon_name, None)
         if existing_action and priorities[existing_action] > priorities[action]:
         }
         existing_action = self.scheduled_daemon_actions.get(host, {}).get(daemon_name, None)
         if existing_action and priorities[existing_action] > priorities[action]:
index 69f39cb9107703eb286b7ce0ee7085ace3bde420..a3a35a900e9069fc3d7701db79770399bcac6e30 100644 (file)
@@ -31,8 +31,7 @@ class Migrations:
         # We have the cache, the inventory, the config store, the upgrade (imagine changing the
         # upgrade code, while an old upgrade is still in progress), naming of daemons,
         # fs-layout of the daemons, etc.
         # We have the cache, the inventory, the config store, the upgrade (imagine changing the
         # upgrade code, while an old upgrade is still in progress), naming of daemons,
         # fs-layout of the daemons, etc.
-        if self.mgr.migration_current is None:
-            self.set(LAST_MIGRATION)
+        self.set_sane_migration_current()
 
         v = mgr.get_store('nfs_migration_queue')
         self.nfs_migration_queue = json.loads(v) if v else []
 
         v = mgr.get_store('nfs_migration_queue')
         self.nfs_migration_queue = json.loads(v) if v else []
@@ -46,8 +45,29 @@ class Migrations:
         self.mgr.set_module_option('migration_current', val)
         self.mgr.migration_current = val
 
         self.mgr.set_module_option('migration_current', val)
         self.mgr.migration_current = val
 
+    def set_sane_migration_current(self) -> None:
+        # migration current should always be an integer
+        # between 0 and LAST_MIGRATION (inclusive) in order to
+        # actually carry out migration. If we find
+        # it is None or too high of a value here we should
+        # set it to some sane value
+        mc: Optional[int] = self.mgr.migration_current
+        if mc is None:
+            logger.info('Found migration_current of "None". Setting to last migration.')
+            self.set(LAST_MIGRATION)
+            return
+
+        if mc > LAST_MIGRATION:
+            logger.error(f'Found migration_current of {mc} when max should be {LAST_MIGRATION}. Setting back to 0.')
+            # something has gone wrong and caused migration_current
+            # to be higher than it should be able to be. Best option
+            # we have here is to just set it back to 0
+            self.set(0)
+
     def is_migration_ongoing(self) -> bool:
     def is_migration_ongoing(self) -> bool:
-        return self.mgr.migration_current != LAST_MIGRATION
+        self.set_sane_migration_current()
+        mc: Optional[int] = self.mgr.migration_current
+        return mc is None or mc < LAST_MIGRATION
 
     def verify_no_migration(self) -> None:
         if self.is_migration_ongoing():
 
     def verify_no_migration(self) -> None:
         if self.is_migration_ongoing():
index b2a48801cc2d779a1faf603718b53de5fed78169..6c8e7497f5540f7447ead8f6cd1c885619241177 100644 (file)
@@ -26,7 +26,7 @@ from ceph.deployment.drive_group import DriveGroupSpec
 from ceph.deployment.service_spec import \
     ServiceSpec, PlacementSpec, \
     HostPlacementSpec, IngressSpec, \
 from ceph.deployment.service_spec import \
     ServiceSpec, PlacementSpec, \
     HostPlacementSpec, IngressSpec, \
-    TunedProfileSpec
+    TunedProfileSpec, IscsiServiceSpec, PrometheusSpec
 from ceph.utils import str_to_datetime, datetime_to_str, datetime_now
 from cephadm.serve import CephadmServe
 from cephadm.services.cephadmservice import CephadmDaemonDeploySpec
 from ceph.utils import str_to_datetime, datetime_to_str, datetime_now
 from cephadm.serve import CephadmServe
 from cephadm.services.cephadmservice import CephadmDaemonDeploySpec
@@ -47,7 +47,8 @@ from . import utils
 from . import ssh
 from .migrations import Migrations
 from .services.cephadmservice import MonService, MgrService, MdsService, RgwService, \
 from . import ssh
 from .migrations import Migrations
 from .services.cephadmservice import MonService, MgrService, MdsService, RgwService, \
-    RbdMirrorService, CrashService, CephadmService, CephfsMirrorService, CephadmAgent
+    RbdMirrorService, CrashService, CephadmService, CephfsMirrorService, CephadmAgent, \
+    CephExporterService
 from .services.ingress import IngressService
 from .services.container import CustomContainerService
 from .services.iscsi import IscsiService
 from .services.ingress import IngressService
 from .services.container import CustomContainerService
 from .services.iscsi import IscsiService
@@ -395,6 +396,18 @@ class CephadmOrchestrator(orchestrator.Orchestrator, MgrModule,
             default=10,
             desc='max number of osds that will be drained simultaneously when osds are removed'
         ),
             default=10,
             desc='max number of osds that will be drained simultaneously when osds are removed'
         ),
+        Option(
+            'cgroups_split',
+            type='bool',
+            default=True,
+            desc='Pass --cgroups=split when cephadm creates containers (currently podman only)'
+        ),
+        Option(
+            'log_refresh_metadata',
+            type='bool',
+            default=False,
+            desc='Log all refresh metadata. Includes daemon, device, and host info collected regularly. Only has effect if logging at debug level'
+        ),
     ]
 
     def __init__(self, *args: Any, **kwargs: Any):
     ]
 
     def __init__(self, *args: Any, **kwargs: Any):
@@ -465,6 +478,8 @@ class CephadmOrchestrator(orchestrator.Orchestrator, MgrModule,
             self.apply_spec_fails: List[Tuple[str, str]] = []
             self.max_osd_draining_count = 10
             self.device_enhanced_scan = False
             self.apply_spec_fails: List[Tuple[str, str]] = []
             self.max_osd_draining_count = 10
             self.device_enhanced_scan = False
+            self.cgroups_split = True
+            self.log_refresh_metadata = False
 
         self.notify(NotifyType.mon_map, None)
         self.config_notify()
 
         self.notify(NotifyType.mon_map, None)
         self.config_notify()
@@ -531,7 +546,7 @@ class CephadmOrchestrator(orchestrator.Orchestrator, MgrModule,
             RgwService, RbdMirrorService, GrafanaService, AlertmanagerService,
             PrometheusService, NodeExporterService, LokiService, PromtailService, CrashService, IscsiService,
             IngressService, CustomContainerService, CephfsMirrorService,
             RgwService, RbdMirrorService, GrafanaService, AlertmanagerService,
             PrometheusService, NodeExporterService, LokiService, PromtailService, CrashService, IscsiService,
             IngressService, CustomContainerService, CephfsMirrorService,
-            CephadmAgent, SNMPGatewayService
+            CephadmAgent, SNMPGatewayService, CephExporterService
         ]
 
         # https://github.com/python/mypy/issues/8993
         ]
 
         # https://github.com/python/mypy/issues/8993
@@ -540,6 +555,9 @@ class CephadmOrchestrator(orchestrator.Orchestrator, MgrModule,
 
         self.mgr_service: MgrService = cast(MgrService, self.cephadm_services['mgr'])
         self.osd_service: OSDService = cast(OSDService, self.cephadm_services['osd'])
 
         self.mgr_service: MgrService = cast(MgrService, self.cephadm_services['mgr'])
         self.osd_service: OSDService = cast(OSDService, self.cephadm_services['osd'])
+        self.iscsi_service: IscsiService = cast(IscsiService, self.cephadm_services['iscsi'])
+
+        self.scheduled_async_actions: List[Callable] = []
 
         self.template = TemplateMgr(self)
 
 
         self.template = TemplateMgr(self)
 
@@ -683,7 +701,7 @@ class CephadmOrchestrator(orchestrator.Orchestrator, MgrModule,
         Generate a unique random service name
         """
         suffix = daemon_type not in [
         Generate a unique random service name
         """
         suffix = daemon_type not in [
-            'mon', 'crash',
+            'mon', 'crash', 'ceph-exporter',
             'prometheus', 'node-exporter', 'grafana', 'alertmanager',
             'container', 'agent', 'snmp-gateway', 'loki', 'promtail'
         ]
             'prometheus', 'node-exporter', 'grafana', 'alertmanager',
             'container', 'agent', 'snmp-gateway', 'loki', 'promtail'
         ]
@@ -772,6 +790,7 @@ class CephadmOrchestrator(orchestrator.Orchestrator, MgrModule,
             sd.rank_generation = int(d['rank_generation']) if d.get(
                 'rank_generation') is not None else None
             sd.extra_container_args = d.get('extra_container_args')
             sd.rank_generation = int(d['rank_generation']) if d.get(
                 'rank_generation') is not None else None
             sd.extra_container_args = d.get('extra_container_args')
+            sd.extra_entrypoint_args = d.get('extra_entrypoint_args')
             if 'state' in d:
                 sd.status_desc = d['state']
                 sd.status = {
             if 'state' in d:
                 sd.status_desc = d['state']
                 sd.status = {
@@ -1049,6 +1068,10 @@ class CephadmOrchestrator(orchestrator.Orchestrator, MgrModule,
                                                                              error_ok=True, no_fsid=True))
             if code:
                 return 1, '', ('check-host failed:\n' + '\n'.join(err))
                                                                              error_ok=True, no_fsid=True))
             if code:
                 return 1, '', ('check-host failed:\n' + '\n'.join(err))
+        except ssh.HostConnectionError as e:
+            self.log.exception(f"check-host failed for '{host}' at addr ({e.addr}) due to connection failure: {str(e)}")
+            return 1, '', ('check-host failed:\n'
+                           + f"Failed to connect to {host} at address ({e.addr}): {str(e)}")
         except OrchestratorError:
             self.log.exception(f"check-host failed for '{host}'")
             return 1, '', ('check-host failed:\n'
         except OrchestratorError:
             self.log.exception(f"check-host failed for '{host}'")
             return 1, '', ('check-host failed:\n'
@@ -1502,8 +1525,8 @@ Then run the following:
                 self.log.info(f"removing: {d.name()}")
 
                 if d.daemon_type != 'osd':
                 self.log.info(f"removing: {d.name()}")
 
                 if d.daemon_type != 'osd':
-                    self.cephadm_services[str(d.daemon_type)].pre_remove(d)
-                    self.cephadm_services[str(d.daemon_type)].post_remove(d, is_failed_deploy=False)
+                    self.cephadm_services[daemon_type_to_service(str(d.daemon_type))].pre_remove(d)
+                    self.cephadm_services[daemon_type_to_service(str(d.daemon_type))].post_remove(d, is_failed_deploy=False)
                 else:
                     cmd_args = {
                         'prefix': 'osd purge-actual',
                 else:
                     cmd_args = {
                         'prefix': 'osd purge-actual',
@@ -1521,6 +1544,7 @@ Then run the following:
         self.inventory.rm_host(host)
         self.cache.rm_host(host)
         self.ssh.reset_con(host)
         self.inventory.rm_host(host)
         self.cache.rm_host(host)
         self.ssh.reset_con(host)
+        self.offline_hosts_remove(host)  # if host was in offline host list, we should remove it now.
         self.event.set()  # refresh stray health check
         self.log.info('Removed host %s' % host)
         return "Removed {} host '{}'".format('offline' if offline else '', host)
         self.event.set()  # refresh stray health check
         self.log.info('Removed host %s' % host)
         return "Removed {} host '{}'".format('offline' if offline else '', host)
@@ -1940,6 +1964,52 @@ Then run the following:
             for dd in dds
         ]
 
             for dd in dds
         ]
 
+    def _rotate_daemon_key(self, daemon_spec: CephadmDaemonDeploySpec) -> str:
+        self.log.info(f'Rotating authentication key for {daemon_spec.name()}')
+        rc, out, err = self.mon_command({
+            'prefix': 'auth get-or-create-pending',
+            'entity': daemon_spec.entity_name(),
+            'format': 'json',
+        })
+        j = json.loads(out)
+        pending_key = j[0]['pending_key']
+
+        # deploy a new keyring file
+        if daemon_spec.daemon_type != 'osd':
+            daemon_spec = self.cephadm_services[daemon_type_to_service(
+                daemon_spec.daemon_type)].prepare_create(daemon_spec)
+        self.wait_async(CephadmServe(self)._create_daemon(daemon_spec, reconfig=True))
+
+        # try to be clever, or fall back to restarting the daemon
+        rc = -1
+        if daemon_spec.daemon_type == 'osd':
+            rc, out, err = self.tool_exec(
+                args=['ceph', 'tell', daemon_spec.name(), 'rotate-stored-key', '-i', '-'],
+                stdin=pending_key.encode()
+            )
+            if not rc:
+                rc, out, err = self.tool_exec(
+                    args=['ceph', 'tell', daemon_spec.name(), 'rotate-key', '-i', '-'],
+                    stdin=pending_key.encode()
+                )
+        elif daemon_spec.daemon_type == 'mds':
+            rc, out, err = self.tool_exec(
+                args=['ceph', 'tell', daemon_spec.name(), 'rotate-key', '-i', '-'],
+                stdin=pending_key.encode()
+            )
+        elif (
+                daemon_spec.daemon_type == 'mgr'
+                and daemon_spec.daemon_id == self.get_mgr_id()
+        ):
+            rc, out, err = self.tool_exec(
+                args=['ceph', 'tell', daemon_spec.name(), 'rotate-key', '-i', '-'],
+                stdin=pending_key.encode()
+            )
+        if rc:
+            self._daemon_action(daemon_spec, 'restart')
+
+        return f'Rotated key for {daemon_spec.name()}'
+
     def _daemon_action(self,
                        daemon_spec: CephadmDaemonDeploySpec,
                        action: str,
     def _daemon_action(self,
                        daemon_spec: CephadmDaemonDeploySpec,
                        action: str,
@@ -1952,6 +2022,9 @@ Then run the following:
             self.mgr_service.fail_over()
             return ''  # unreachable
 
             self.mgr_service.fail_over()
             return ''  # unreachable
 
+        if action == 'rotate-key':
+            return self._rotate_daemon_key(daemon_spec)
+
         if action == 'redeploy' or action == 'reconfig':
             if daemon_spec.daemon_type != 'osd':
                 daemon_spec = self.cephadm_services[daemon_type_to_service(
         if action == 'redeploy' or action == 'reconfig':
             if daemon_spec.daemon_type != 'osd':
                 daemon_spec = self.cephadm_services[daemon_type_to_service(
@@ -1959,7 +2032,8 @@ Then run the following:
             else:
                 # for OSDs, we still need to update config, just not carry out the full
                 # prepare_create function
             else:
                 # for OSDs, we still need to update config, just not carry out the full
                 # prepare_create function
-                daemon_spec.final_config, daemon_spec.deps = self.osd_service.generate_config(daemon_spec)
+                daemon_spec.final_config, daemon_spec.deps = self.osd_service.generate_config(
+                    daemon_spec)
             return self.wait_async(CephadmServe(self)._create_daemon(daemon_spec, reconfig=(action == 'reconfig')))
 
         actions = {
             return self.wait_async(CephadmServe(self)._create_daemon(daemon_spec, reconfig=(action == 'reconfig')))
 
         actions = {
@@ -2008,6 +2082,13 @@ Then run the following:
             raise OrchestratorError(
                 f'Unable to schedule redeploy for {daemon_name}: No standby MGRs')
 
             raise OrchestratorError(
                 f'Unable to schedule redeploy for {daemon_name}: No standby MGRs')
 
+        if action == 'rotate-key':
+            if d.daemon_type not in ['mgr', 'osd', 'mds',
+                                     'rgw', 'crash', 'nfs', 'rbd-mirror', 'iscsi']:
+                raise OrchestratorError(
+                    f'key rotation not supported for {d.daemon_type}'
+                )
+
         self._daemon_action_set_image(action, image, d.daemon_type, d.daemon_id)
 
         self.log.info(f'Schedule {action} daemon {daemon_name}')
         self._daemon_action_set_image(action, image, d.daemon_type, d.daemon_id)
 
         self.log.info(f'Schedule {action} daemon {daemon_name}')
@@ -2031,6 +2112,7 @@ Then run the following:
             raise OrchestratorError(
                 f'Unable to schedule redeploy for {daemon_name}: No standby MGRs')
         self.cache.schedule_daemon_action(dd.hostname, dd.name(), action)
             raise OrchestratorError(
                 f'Unable to schedule redeploy for {daemon_name}: No standby MGRs')
         self.cache.schedule_daemon_action(dd.hostname, dd.name(), action)
+        self.cache.save_host(dd.hostname)
         msg = "Scheduled to {} {} on host '{}'".format(action, daemon_name, dd.hostname)
         self._kick_serve_loop()
         return msg
         msg = "Scheduled to {} {} on host '{}'".format(action, daemon_name, dd.hostname)
         self._kick_serve_loop()
         return msg
@@ -2360,10 +2442,14 @@ Then run the following:
             deps = sorted([self.get_mgr_ip(), server_port, root_cert,
                            str(self.device_enhanced_scan)])
         elif daemon_type == 'iscsi':
             deps = sorted([self.get_mgr_ip(), server_port, root_cert,
                            str(self.device_enhanced_scan)])
         elif daemon_type == 'iscsi':
-            deps = [self.get_mgr_ip()]
+            if spec:
+                iscsi_spec = cast(IscsiServiceSpec, spec)
+                deps = [self.iscsi_service.get_trusted_ips(iscsi_spec)]
+            else:
+                deps = [self.get_mgr_ip()]
         else:
             need = {
         else:
             need = {
-                'prometheus': ['mgr', 'alertmanager', 'node-exporter', 'ingress'],
+                'prometheus': ['mgr', 'alertmanager', 'node-exporter', 'ingress', 'ceph-exporter'],
                 'grafana': ['prometheus', 'loki'],
                 'alertmanager': ['mgr', 'alertmanager', 'snmp-gateway'],
                 'promtail': ['loki'],
                 'grafana': ['prometheus', 'loki'],
                 'alertmanager': ['mgr', 'alertmanager', 'snmp-gateway'],
                 'promtail': ['loki'],
@@ -2476,15 +2562,85 @@ Then run the following:
             # should only refresh if a change has been detected
             self._trigger_preview_refresh(specs=[cast(DriveGroupSpec, spec)])
 
             # should only refresh if a change has been detected
             self._trigger_preview_refresh(specs=[cast(DriveGroupSpec, spec)])
 
+        if spec.service_type == 'prometheus':
+            spec = cast(PrometheusSpec, spec)
+            if spec.retention_time:
+                valid_units = ['y', 'w', 'd', 'h', 'm', 's']
+                m = re.search(rf"^(\d+)({'|'.join(valid_units)})$", spec.retention_time)
+                if not m:
+                    raise OrchestratorError(f"Invalid retention time. Valid units are: {', '.join(valid_units)}")
+            if spec.retention_size:
+                valid_units = ['B', 'KB', 'MB', 'GB', 'TB', 'PB', 'EB']
+                m = re.search(rf"^(\d+)({'|'.join(valid_units)})$", spec.retention_size)
+                if not m:
+                    raise OrchestratorError(f"Invalid retention size. Valid units are: {', '.join(valid_units)}")
+
         return self._apply_service_spec(cast(ServiceSpec, spec))
 
         return self._apply_service_spec(cast(ServiceSpec, spec))
 
+    def _get_candidate_hosts(self, placement: PlacementSpec) -> List[str]:
+        """Return a list of candidate hosts according to the placement specification."""
+        all_hosts = self.cache.get_schedulable_hosts()
+        draining_hosts = [dh.hostname for dh in self.cache.get_draining_hosts()]
+        candidates = []
+        if placement.hosts:
+            candidates = [h.hostname for h in placement.hosts if h.hostname in placement.hosts]
+        elif placement.label:
+            candidates = [x.hostname for x in [h for h in all_hosts if placement.label in h.labels]]
+        elif placement.host_pattern:
+            candidates = [x for x in placement.filter_matching_hostspecs(all_hosts)]
+        elif (placement.count is not None or placement.count_per_host is not None):
+            candidates = [x.hostname for x in all_hosts]
+        return [h for h in candidates if h not in draining_hosts]
+
+    def _validate_one_shot_placement_spec(self, spec: PlacementSpec) -> None:
+        """Validate placement specification for TunedProfileSpec and ClientKeyringSpec."""
+        if spec.count is not None:
+            raise OrchestratorError(
+                "Placement 'count' field is no supported for this specification.")
+        if spec.count_per_host is not None:
+            raise OrchestratorError(
+                "Placement 'count_per_host' field is no supported for this specification.")
+        if spec.hosts:
+            all_hosts = [h.hostname for h in self.inventory.all_specs()]
+            invalid_hosts = [h.hostname for h in spec.hosts if h.hostname not in all_hosts]
+            if invalid_hosts:
+                raise OrchestratorError(f"Found invalid host(s) in placement section: {invalid_hosts}. "
+                                        f"Please check 'ceph orch host ls' for available hosts.")
+        elif not self._get_candidate_hosts(spec):
+            raise OrchestratorError("Invalid placement specification. No host(s) matched placement spec.\n"
+                                    "Please check 'ceph orch host ls' for available hosts.\n"
+                                    "Note: draining hosts are excluded from the candidate list.")
+
+    def _validate_tunedprofile_settings(self, spec: TunedProfileSpec) -> Dict[str, List[str]]:
+        candidate_hosts = spec.placement.filter_matching_hostspecs(self.inventory.all_specs())
+        invalid_options: Dict[str, List[str]] = {}
+        for host in candidate_hosts:
+            host_sysctl_options = self.cache.get_facts(host).get('sysctl_options', {})
+            invalid_options[host] = []
+            for option in spec.settings:
+                if option not in host_sysctl_options:
+                    invalid_options[host].append(option)
+        return invalid_options
+
+    def _validate_tuned_profile_spec(self, spec: TunedProfileSpec) -> None:
+        if not spec.settings:
+            raise OrchestratorError("Invalid spec: settings section cannot be empty.")
+        self._validate_one_shot_placement_spec(spec.placement)
+        invalid_options = self._validate_tunedprofile_settings(spec)
+        if any(e for e in invalid_options.values()):
+            raise OrchestratorError(
+                f'Failed to apply tuned profile. Invalid sysctl option(s) for host(s) detected: {invalid_options}')
+
     @handle_orch_error
     def apply_tuned_profiles(self, specs: List[TunedProfileSpec], no_overwrite: bool = False) -> str:
         outs = []
         for spec in specs:
     @handle_orch_error
     def apply_tuned_profiles(self, specs: List[TunedProfileSpec], no_overwrite: bool = False) -> str:
         outs = []
         for spec in specs:
+            self._validate_tuned_profile_spec(spec)
             if no_overwrite and self.tuned_profiles.exists(spec.profile_name):
             if no_overwrite and self.tuned_profiles.exists(spec.profile_name):
-                outs.append(f"Tuned profile '{spec.profile_name}' already exists (--no-overwrite was passed)")
+                outs.append(
+                    f"Tuned profile '{spec.profile_name}' already exists (--no-overwrite was passed)")
             else:
             else:
+                # done, let's save the specs
                 self.tuned_profiles.add_profile(spec)
                 outs.append(f'Saved tuned profile {spec.profile_name}')
         self._kick_serve_loop()
                 self.tuned_profiles.add_profile(spec)
                 outs.append(f'Saved tuned profile {spec.profile_name}')
         self._kick_serve_loop()
@@ -2591,6 +2747,7 @@ Then run the following:
                 'alertmanager': PlacementSpec(count=1),
                 'prometheus': PlacementSpec(count=1),
                 'node-exporter': PlacementSpec(host_pattern='*'),
                 'alertmanager': PlacementSpec(count=1),
                 'prometheus': PlacementSpec(count=1),
                 'node-exporter': PlacementSpec(host_pattern='*'),
+                'ceph-exporter': PlacementSpec(host_pattern='*'),
                 'loki': PlacementSpec(count=1),
                 'promtail': PlacementSpec(host_pattern='*'),
                 'crash': PlacementSpec(host_pattern='*'),
                 'loki': PlacementSpec(count=1),
                 'promtail': PlacementSpec(host_pattern='*'),
                 'crash': PlacementSpec(host_pattern='*'),
@@ -2701,6 +2858,10 @@ Then run the following:
     def apply_node_exporter(self, spec: ServiceSpec) -> str:
         return self._apply(spec)
 
     def apply_node_exporter(self, spec: ServiceSpec) -> str:
         return self._apply(spec)
 
+    @handle_orch_error
+    def apply_ceph_exporter(self, spec: ServiceSpec) -> str:
+        return self._apply(spec)
+
     @handle_orch_error
     def apply_crash(self, spec: ServiceSpec) -> str:
         return self._apply(spec)
     @handle_orch_error
     def apply_crash(self, spec: ServiceSpec) -> str:
         return self._apply(spec)
@@ -2783,7 +2944,9 @@ Then run the following:
     def upgrade_start(self, image: str, version: str, daemon_types: Optional[List[str]] = None, host_placement: Optional[str] = None,
                       services: Optional[List[str]] = None, limit: Optional[int] = None) -> str:
         if self.inventory.get_host_with_state("maintenance"):
     def upgrade_start(self, image: str, version: str, daemon_types: Optional[List[str]] = None, host_placement: Optional[str] = None,
                       services: Optional[List[str]] = None, limit: Optional[int] = None) -> str:
         if self.inventory.get_host_with_state("maintenance"):
-            raise OrchestratorError("upgrade aborted - you have host(s) in maintenance state")
+            raise OrchestratorError("Upgrade aborted - you have host(s) in maintenance state")
+        if self.offline_hosts:
+            raise OrchestratorError(f"Upgrade aborted - Some host(s) are currently offline: {self.offline_hosts}")
         if daemon_types is not None and services is not None:
             raise OrchestratorError('--daemon-types and --services are mutually exclusive')
         if daemon_types is not None:
         if daemon_types is not None and services is not None:
             raise OrchestratorError('--daemon-types and --services are mutually exclusive')
         if daemon_types is not None:
index b80f5104eca4ceb3e750179779696fd1fa27136b..2b7751dfc34d8118833ef1c597f1cc5cb370a3c2 100644 (file)
@@ -38,7 +38,7 @@ class OfflineHostWatcher(threading.Thread):
     def check_host(self, host: str) -> None:
         if host not in self.mgr.offline_hosts:
             try:
     def check_host(self, host: str) -> None:
         if host not in self.mgr.offline_hosts:
             try:
-                self.mgr.ssh.check_execute_command(host, ['true'])
+                self.mgr.ssh.check_execute_command(host, ['true'], log_command=self.mgr.log_refresh_metadata)
             except Exception:
                 logger.debug(f'OfflineHostDetector: detected {host} to be offline')
                 # kick serve loop in case corrective action must be taken for offline host
             except Exception:
                 logger.debug(f'OfflineHostDetector: detected {host} to be offline')
                 # kick serve loop in case corrective action must be taken for offline host
index 692b4282e860e6ab196e771f14c22fd391f82dad..09c8c4e43cdcd6e4241eea0a710f51e1bed11ef6 100644 (file)
@@ -141,13 +141,13 @@ class DaemonPlacement(NamedTuple):
 class HostAssignment(object):
 
     def __init__(self,
 class HostAssignment(object):
 
     def __init__(self,
-                 spec,  # type: ServiceSpec
+                 spec: ServiceSpec,
                  hosts: List[orchestrator.HostSpec],
                  unreachable_hosts: List[orchestrator.HostSpec],
                  draining_hosts: List[orchestrator.HostSpec],
                  daemons: List[orchestrator.DaemonDescription],
                  networks: Dict[str, Dict[str, Dict[str, List[str]]]] = {},
                  hosts: List[orchestrator.HostSpec],
                  unreachable_hosts: List[orchestrator.HostSpec],
                  draining_hosts: List[orchestrator.HostSpec],
                  daemons: List[orchestrator.DaemonDescription],
                  networks: Dict[str, Dict[str, Dict[str, List[str]]]] = {},
-                 filter_new_host=None,  # type: Optional[Callable[[str],bool]]
+                 filter_new_host: Optional[Callable[[str], bool]] = None,
                  allow_colo: bool = False,
                  primary_daemon_type: Optional[str] = None,
                  per_host_daemon_type: Optional[str] = None,
                  allow_colo: bool = False,
                  primary_daemon_type: Optional[str] = None,
                  per_host_daemon_type: Optional[str] = None,
index 6ca94393ed2360b8cc58fb1a5cc4d705700352fe..c93e4147dc14fc83a53a612741430081e9b667ea 100644 (file)
@@ -82,6 +82,8 @@ class CephadmServe:
                         self.mgr.remote('dashboard', 'set_rgw_credentials')
 
                 if not self.mgr.paused:
                         self.mgr.remote('dashboard', 'set_rgw_credentials')
 
                 if not self.mgr.paused:
+                    self._run_async_actions()
+
                     self.mgr.to_remove_osds.process_removal_queue()
 
                     self.mgr.migration.migrate()
                     self.mgr.to_remove_osds.process_removal_queue()
 
                     self.mgr.migration.migrate()
@@ -187,12 +189,6 @@ class CephadmServe:
         self.log.debug('_refresh_hosts_and_daemons')
         bad_hosts = []
         failures = []
         self.log.debug('_refresh_hosts_and_daemons')
         bad_hosts = []
         failures = []
-
-        if self.mgr.manage_etc_ceph_ceph_conf or self.mgr.keys.keys:
-            client_files = self._calc_client_files()
-        else:
-            client_files = {}
-
         agents_down: List[str] = []
 
         @forall_hosts
         agents_down: List[str] = []
 
         @forall_hosts
@@ -268,10 +264,10 @@ class CephadmServe:
                 self.log.debug(f"autotuning memory for {host}")
                 self._autotune_host_memory(host)
 
                 self.log.debug(f"autotuning memory for {host}")
                 self._autotune_host_memory(host)
 
-            self._write_client_files(client_files, host)
-
         refresh(self.mgr.cache.get_hosts())
 
         refresh(self.mgr.cache.get_hosts())
 
+        self._write_all_client_files()
+
         self.mgr.agent_helpers._update_agent_down_healthcheck(agents_down)
 
         self.mgr.config_checker.run_checks()
         self.mgr.agent_helpers._update_agent_down_healthcheck(agents_down)
 
         self.mgr.config_checker.run_checks()
@@ -297,7 +293,7 @@ class CephadmServe:
             addr = self.mgr.inventory.get_addr(host) if host in self.mgr.inventory else host
             out, err, code = self.mgr.wait_async(self._run_cephadm(
                 host, cephadmNoImage, 'check-host', [],
             addr = self.mgr.inventory.get_addr(host) if host in self.mgr.inventory else host
             out, err, code = self.mgr.wait_async(self._run_cephadm(
                 host, cephadmNoImage, 'check-host', [],
-                error_ok=True, no_fsid=True))
+                error_ok=True, no_fsid=True, log_output=self.mgr.log_refresh_metadata))
             self.mgr.cache.update_last_host_check(host)
             self.mgr.cache.save_host(host)
             if code:
             self.mgr.cache.update_last_host_check(host)
             self.mgr.cache.save_host(host)
             if code:
@@ -313,7 +309,8 @@ class CephadmServe:
 
     def _refresh_host_daemons(self, host: str) -> Optional[str]:
         try:
 
     def _refresh_host_daemons(self, host: str) -> Optional[str]:
         try:
-            ls = self.mgr.wait_async(self._run_cephadm_json(host, 'mon', 'ls', [], no_fsid=True))
+            ls = self.mgr.wait_async(self._run_cephadm_json(host, 'mon', 'ls', [],
+                                                            no_fsid=True, log_output=self.mgr.log_refresh_metadata))
         except OrchestratorError as e:
             return str(e)
         self.mgr._process_ls_output(host, ls)
         except OrchestratorError as e:
             return str(e)
         self.mgr._process_ls_output(host, ls)
@@ -322,7 +319,7 @@ class CephadmServe:
     def _refresh_facts(self, host: str) -> Optional[str]:
         try:
             val = self.mgr.wait_async(self._run_cephadm_json(
     def _refresh_facts(self, host: str) -> Optional[str]:
         try:
             val = self.mgr.wait_async(self._run_cephadm_json(
-                host, cephadmNoImage, 'gather-facts', [], no_fsid=True))
+                host, cephadmNoImage, 'gather-facts', [], no_fsid=True, log_output=self.mgr.log_refresh_metadata))
         except OrchestratorError as e:
             return str(e)
 
         except OrchestratorError as e:
             return str(e)
 
@@ -341,13 +338,13 @@ class CephadmServe:
         try:
             try:
                 devices = self.mgr.wait_async(self._run_cephadm_json(host, 'osd', 'ceph-volume',
         try:
             try:
                 devices = self.mgr.wait_async(self._run_cephadm_json(host, 'osd', 'ceph-volume',
-                                                                     inventory_args))
+                                                                     inventory_args, log_output=self.mgr.log_refresh_metadata))
             except OrchestratorError as e:
                 if 'unrecognized arguments: --filter-for-batch' in str(e):
                     rerun_args = inventory_args.copy()
                     rerun_args.remove('--filter-for-batch')
                     devices = self.mgr.wait_async(self._run_cephadm_json(host, 'osd', 'ceph-volume',
             except OrchestratorError as e:
                 if 'unrecognized arguments: --filter-for-batch' in str(e):
                     rerun_args = inventory_args.copy()
                     rerun_args.remove('--filter-for-batch')
                     devices = self.mgr.wait_async(self._run_cephadm_json(host, 'osd', 'ceph-volume',
-                                                                         rerun_args))
+                                                                         rerun_args, log_output=self.mgr.log_refresh_metadata))
                 else:
                     raise
 
                 else:
                     raise
 
@@ -365,7 +362,7 @@ class CephadmServe:
     def _refresh_host_networks(self, host: str) -> Optional[str]:
         try:
             networks = self.mgr.wait_async(self._run_cephadm_json(
     def _refresh_host_networks(self, host: str) -> Optional[str]:
         try:
             networks = self.mgr.wait_async(self._run_cephadm_json(
-                host, 'mon', 'list-networks', [], no_fsid=True))
+                host, 'mon', 'list-networks', [], no_fsid=True, log_output=self.mgr.log_refresh_metadata))
         except OrchestratorError as e:
             return str(e)
 
         except OrchestratorError as e:
             return str(e)
 
@@ -393,6 +390,10 @@ class CephadmServe:
         # Unset global 'pending' flag for host
         self.mgr.cache.loading_osdspec_preview.remove(search_host)
 
         # Unset global 'pending' flag for host
         self.mgr.cache.loading_osdspec_preview.remove(search_host)
 
+    def _run_async_actions(self) -> None:
+        while self.mgr.scheduled_async_actions:
+            (self.mgr.scheduled_async_actions.pop(0))()
+
     def _check_for_strays(self) -> None:
         self.log.debug('_check_for_strays')
         for k in ['CEPHADM_STRAY_HOST',
     def _check_for_strays(self) -> None:
         self.log.debug('_check_for_strays')
         for k in ['CEPHADM_STRAY_HOST',
@@ -865,6 +866,12 @@ class CephadmServe:
             assert dd.hostname is not None
             assert dd.daemon_type is not None
             assert dd.daemon_id is not None
             assert dd.hostname is not None
             assert dd.daemon_type is not None
             assert dd.daemon_id is not None
+
+            # any action we can try will fail for a daemon on an offline host,
+            # including removing the daemon
+            if dd.hostname in self.mgr.offline_hosts:
+                continue
+
             if not spec and dd.daemon_type not in ['mon', 'mgr', 'osd']:
                 # (mon and mgr specs should always exist; osds aren't matched
                 # to a service spec)
             if not spec and dd.daemon_type not in ['mon', 'mgr', 'osd']:
                 # (mon and mgr specs should always exist; osds aren't matched
                 # to a service spec)
@@ -919,6 +926,12 @@ class CephadmServe:
                 self.log.info(f'Redeploying {dd.name()}, (container cli args changed) . . .')
                 dd.extra_container_args = spec.extra_container_args
                 action = 'redeploy'
                 self.log.info(f'Redeploying {dd.name()}, (container cli args changed) . . .')
                 dd.extra_container_args = spec.extra_container_args
                 action = 'redeploy'
+            elif spec is not None and hasattr(spec, 'extra_entrypoint_args') and dd.extra_entrypoint_args != spec.extra_entrypoint_args:
+                self.log.info(f'Redeploying {dd.name()}, (entrypoint args changed) . . .')
+                self.log.debug(
+                    f'{dd.name()} daemon entrypoint args {dd.extra_entrypoint_args} -> {spec.extra_entrypoint_args}')
+                dd.extra_entrypoint_args = spec.extra_entrypoint_args
+                action = 'redeploy'
             elif self.mgr.last_monmap and \
                     self.mgr.last_monmap > last_config and \
                     dd.daemon_type in CEPH_TYPES:
             elif self.mgr.last_monmap and \
                     self.mgr.last_monmap > last_config and \
                     dd.daemon_type in CEPH_TYPES:
@@ -938,11 +951,13 @@ class CephadmServe:
                     if self.mgr.cache.rm_scheduled_daemon_action(dd.hostname, dd.name()):
                         self.mgr.cache.save_host(dd.hostname)
                 except OrchestratorError as e:
                     if self.mgr.cache.rm_scheduled_daemon_action(dd.hostname, dd.name()):
                         self.mgr.cache.save_host(dd.hostname)
                 except OrchestratorError as e:
+                    self.log.exception(e)
                     self.mgr.events.from_orch_error(e)
                     if dd.daemon_type in daemons_post:
                         del daemons_post[dd.daemon_type]
                     # continue...
                 except Exception as e:
                     self.mgr.events.from_orch_error(e)
                     if dd.daemon_type in daemons_post:
                         del daemons_post[dd.daemon_type]
                     # continue...
                 except Exception as e:
+                    self.log.exception(e)
                     self.mgr.events.for_daemon_from_exception(dd.name(), e)
                     if dd.daemon_type in daemons_post:
                         del daemons_post[dd.daemon_type]
                     self.mgr.events.for_daemon_from_exception(dd.name(), e)
                     if dd.daemon_type in daemons_post:
                         del daemons_post[dd.daemon_type]
@@ -1062,6 +1077,18 @@ class CephadmServe:
                     f'unable to calc client keyring {ks.entity} placement {ks.placement}: {e}')
         return client_files
 
                     f'unable to calc client keyring {ks.entity} placement {ks.placement}: {e}')
         return client_files
 
+    def _write_all_client_files(self) -> None:
+        if self.mgr.manage_etc_ceph_ceph_conf or self.mgr.keys.keys:
+            client_files = self._calc_client_files()
+        else:
+            client_files = {}
+
+        @forall_hosts
+        def _write_files(host: str) -> None:
+            self._write_client_files(client_files, host)
+
+        _write_files(self.mgr.cache.get_hosts())
+
     def _write_client_files(self,
                             client_files: Dict[str, Dict[str, Tuple[int, int, int, bytes, str]]],
                             host: str) -> None:
     def _write_client_files(self,
                             client_files: Dict[str, Dict[str, Tuple[int, int, int, bytes, str]]],
                             host: str) -> None:
@@ -1135,13 +1162,7 @@ class CephadmServe:
                 if self.mgr.allow_ptrace:
                     daemon_spec.extra_args.append('--allow-ptrace')
 
                 if self.mgr.allow_ptrace:
                     daemon_spec.extra_args.append('--allow-ptrace')
 
-                try:
-                    eca = daemon_spec.extra_container_args
-                    if eca:
-                        for a in eca:
-                            daemon_spec.extra_args.append(f'--extra-container-args={a}')
-                except AttributeError:
-                    eca = None
+                daemon_spec, extra_container_args, extra_entrypoint_args = self._setup_extra_deployment_args(daemon_spec)
 
                 if daemon_spec.service_name in self.mgr.spec_store:
                     configs = self.mgr.spec_store[daemon_spec.service_name].spec.custom_configs
 
                 if daemon_spec.service_name in self.mgr.spec_store:
                     configs = self.mgr.spec_store[daemon_spec.service_name].spec.custom_configs
@@ -1167,7 +1188,8 @@ class CephadmServe:
                             'deployed_by': self.mgr.get_active_mgr_digests(),
                             'rank': daemon_spec.rank,
                             'rank_generation': daemon_spec.rank_generation,
                             'deployed_by': self.mgr.get_active_mgr_digests(),
                             'rank': daemon_spec.rank,
                             'rank_generation': daemon_spec.rank_generation,
-                            'extra_container_args': eca
+                            'extra_container_args': extra_container_args,
+                            'extra_entrypoint_args': extra_entrypoint_args
                         }),
                         '--config-json', '-',
                     ] + daemon_spec.extra_args,
                         }),
                         '--config-json', '-',
                     ] + daemon_spec.extra_args,
@@ -1217,6 +1239,39 @@ class CephadmServe:
                     self.mgr.cephadm_services[servict_type].post_remove(dd, is_failed_deploy=True)
                 raise
 
                     self.mgr.cephadm_services[servict_type].post_remove(dd, is_failed_deploy=True)
                 raise
 
+    def _setup_extra_deployment_args(self, daemon_spec: CephadmDaemonDeploySpec) -> Tuple[CephadmDaemonDeploySpec, Optional[List[str]], Optional[List[str]]]:
+        # this function is for handling any potential user specified
+        # (in the service spec) extra runtime or entrypoint args for a daemon
+        # we are going to deploy. Effectively just adds a set of extra args to
+        # pass to the cephadm binary to indicate the daemon being deployed
+        # needs extra runtime/entrypoint args. Returns the modified daemon spec
+        # as well as what args were added (as those are included in unit.meta file)
+        try:
+            eca = daemon_spec.extra_container_args
+            if eca:
+                for a in eca:
+                    # args with spaces need to be split into multiple args
+                    # in order to work properly
+                    args = a.split(' ')
+                    for arg in args:
+                        if arg:
+                            daemon_spec.extra_args.append(f'--extra-container-args={arg}')
+        except AttributeError:
+            eca = None
+        try:
+            eea = daemon_spec.extra_entrypoint_args
+            if eea:
+                for a in eea:
+                    # args with spaces need to be split into multiple args
+                    # in order to work properly
+                    args = a.split(' ')
+                    for arg in args:
+                        if arg:
+                            daemon_spec.extra_args.append(f'--extra-entrypoint-args={arg}')
+        except AttributeError:
+            eea = None
+        return daemon_spec, eca, eea
+
     def _remove_daemon(self, name: str, host: str, no_post_remove: bool = False) -> str:
         """
         Remove a daemon
     def _remove_daemon(self, name: str, host: str, no_post_remove: bool = False) -> str:
         """
         Remove a daemon
@@ -1247,8 +1302,13 @@ class CephadmServe:
             self.mgr.cache.invalidate_host_daemons(host)
 
             if not no_post_remove:
             self.mgr.cache.invalidate_host_daemons(host)
 
             if not no_post_remove:
-                self.mgr.cephadm_services[daemon_type_to_service(
-                    daemon_type)].post_remove(daemon, is_failed_deploy=False)
+                if daemon_type not in ['iscsi']:
+                    self.mgr.cephadm_services[daemon_type_to_service(
+                        daemon_type)].post_remove(daemon, is_failed_deploy=False)
+                else:
+                    self.mgr.scheduled_async_actions.append(lambda: self.mgr.cephadm_services[daemon_type_to_service(
+                                                            daemon_type)].post_remove(daemon, is_failed_deploy=False))
+                    self.mgr._kick_serve_loop()
 
             return "Removed {} from host '{}'".format(name, host)
 
 
             return "Removed {} from host '{}'".format(name, host)
 
@@ -1258,11 +1318,14 @@ class CephadmServe:
                                 command: str,
                                 args: List[str],
                                 no_fsid: Optional[bool] = False,
                                 command: str,
                                 args: List[str],
                                 no_fsid: Optional[bool] = False,
+                                error_ok: Optional[bool] = False,
                                 image: Optional[str] = "",
                                 image: Optional[str] = "",
+                                log_output: Optional[bool] = True,
                                 ) -> Any:
         try:
             out, err, code = await self._run_cephadm(
                                 ) -> Any:
         try:
             out, err, code = await self._run_cephadm(
-                host, entity, command, args, no_fsid=no_fsid, image=image)
+                host, entity, command, args, no_fsid=no_fsid, error_ok=error_ok,
+                image=image, log_output=log_output)
             if code:
                 raise OrchestratorError(f'host {host} `cephadm {command}` returned {code}: {err}')
         except Exception as e:
             if code:
                 raise OrchestratorError(f'host {host} `cephadm {command}` returned {code}: {err}')
         except Exception as e:
@@ -1285,6 +1348,7 @@ class CephadmServe:
                            error_ok: Optional[bool] = False,
                            image: Optional[str] = "",
                            env_vars: Optional[List[str]] = None,
                            error_ok: Optional[bool] = False,
                            image: Optional[str] = "",
                            env_vars: Optional[List[str]] = None,
+                           log_output: Optional[bool] = True,
                            ) -> Tuple[List[str], List[str], int]:
         """
         Run cephadm on the remote host with the given command + args
                            ) -> Tuple[List[str], List[str], int]:
         """
         Run cephadm on the remote host with the given command + args
@@ -1320,6 +1384,9 @@ class CephadmServe:
         if not self.mgr.container_init:
             final_args += ['--no-container-init']
 
         if not self.mgr.container_init:
             final_args += ['--no-container-init']
 
+        if not self.mgr.cgroups_split:
+            final_args += ['--no-cgroups-split']
+
         # subcommand
         final_args.append(command)
 
         # subcommand
         final_args.append(command)
 
@@ -1346,7 +1413,8 @@ class CephadmServe:
                     host, cmd, stdin=stdin, addr=addr)
                 if code == 2:
                     ls_cmd = ['ls', self.mgr.cephadm_binary_path]
                     host, cmd, stdin=stdin, addr=addr)
                 if code == 2:
                     ls_cmd = ['ls', self.mgr.cephadm_binary_path]
-                    out_ls, err_ls, code_ls = await self.mgr.ssh._execute_command(host, ls_cmd, addr=addr)
+                    out_ls, err_ls, code_ls = await self.mgr.ssh._execute_command(host, ls_cmd, addr=addr,
+                                                                                  log_command=log_output)
                     if code_ls == 2:
                         await self._deploy_cephadm_binary(host, addr)
                         out, err, code = await self.mgr.ssh._execute_command(
                     if code_ls == 2:
                         await self._deploy_cephadm_binary(host, addr)
                         out, err, code = await self.mgr.ssh._execute_command(
@@ -1376,11 +1444,12 @@ class CephadmServe:
         else:
             assert False, 'unsupported mode'
 
         else:
             assert False, 'unsupported mode'
 
-        self.log.debug(f'code: {code}')
-        if out:
-            self.log.debug(f'out: {out}')
-        if err:
-            self.log.debug(f'err: {err}')
+        if log_output:
+            self.log.debug(f'code: {code}')
+            if out:
+                self.log.debug(f'out: {out}')
+            if err:
+                self.log.debug(f'err: {err}')
         if code and not error_ok:
             raise OrchestratorError(
                 f'cephadm exited with an error code: {code}, stderr: {err}')
         if code and not error_ok:
             raise OrchestratorError(
                 f'cephadm exited with an error code: {code}, stderr: {err}')
@@ -1397,12 +1466,22 @@ class CephadmServe:
         if self.mgr.cache.host_needs_registry_login(host) and self.mgr.registry_url:
             await self._registry_login(host, json.loads(str(self.mgr.get_store('registry_credentials'))))
 
         if self.mgr.cache.host_needs_registry_login(host) and self.mgr.registry_url:
             await self._registry_login(host, json.loads(str(self.mgr.get_store('registry_credentials'))))
 
-        pullargs: List[str] = []
-        if self.mgr.registry_insecure:
-            pullargs.append("--insecure")
+        j = None
+        if not self.mgr.use_repo_digest:
+            try:
+                j = await self._run_cephadm_json(host, '', 'inspect-image', [],
+                                                 image=image_name, no_fsid=True,
+                                                 error_ok=True)
+            except OrchestratorError:
+                pass
 
 
-        j = await self._run_cephadm_json(host, '', 'pull', pullargs, image=image_name, no_fsid=True)
+        if not j:
+            pullargs: List[str] = []
+            if self.mgr.registry_insecure:
+                pullargs.append("--insecure")
 
 
+            j = await self._run_cephadm_json(host, '', 'pull', pullargs,
+                                             image=image_name, no_fsid=True)
         r = ContainerInspectInfo(
             j['image_id'],
             j.get('ceph_version'),
         r = ContainerInspectInfo(
             j['image_id'],
             j.get('ceph_version'),
index 8028b27c661cac56b9fc2d5dc15f263f951d53a3..e7c15132d79cba16fa24618ee5ab5977ca4083c4 100644 (file)
@@ -10,9 +10,9 @@ from typing import TYPE_CHECKING, List, Callable, TypeVar, \
 
 from mgr_module import HandleCommandResult, MonCommandFailed
 
 
 from mgr_module import HandleCommandResult, MonCommandFailed
 
-from ceph.deployment.service_spec import ServiceSpec, RGWSpec
+from ceph.deployment.service_spec import ServiceSpec, RGWSpec, CephExporterSpec
 from ceph.deployment.utils import is_ipv6, unwrap_ipv6
 from ceph.deployment.utils import is_ipv6, unwrap_ipv6
-from mgr_util import build_url
+from mgr_util import build_url, merge_dicts
 from orchestrator import OrchestratorError, DaemonDescription, DaemonDescriptionStatus
 from orchestrator._interface import daemon_type_to_service
 from cephadm import utils
 from orchestrator import OrchestratorError, DaemonDescription, DaemonDescriptionStatus
 from orchestrator._interface import daemon_type_to_service
 from cephadm import utils
@@ -26,6 +26,27 @@ ServiceSpecs = TypeVar('ServiceSpecs', bound=ServiceSpec)
 AuthEntity = NewType('AuthEntity', str)
 
 
 AuthEntity = NewType('AuthEntity', str)
 
 
+def get_auth_entity(daemon_type: str, daemon_id: str, host: str = "") -> AuthEntity:
+    """
+    Map the daemon id to a cephx keyring entity name
+    """
+    # despite this mapping entity names to daemons, self.TYPE within
+    # the CephService class refers to service types, not daemon types
+    if daemon_type in ['rgw', 'rbd-mirror', 'cephfs-mirror', 'nfs', "iscsi", 'ingress', 'ceph-exporter']:
+        return AuthEntity(f'client.{daemon_type}.{daemon_id}')
+    elif daemon_type in ['crash', 'agent']:
+        if host == "":
+            raise OrchestratorError(
+                f'Host not provided to generate <{daemon_type}> auth entity name')
+        return AuthEntity(f'client.{daemon_type}.{host}')
+    elif daemon_type == 'mon':
+        return AuthEntity('mon.')
+    elif daemon_type in ['mgr', 'osd', 'mds']:
+        return AuthEntity(f'{daemon_type}.{daemon_id}')
+    else:
+        raise OrchestratorError(f"unknown daemon type {daemon_type}")
+
+
 class CephadmDaemonDeploySpec:
     # typing.NamedTuple + Generic is broken in py36
     def __init__(self, host: str, daemon_id: str,
 class CephadmDaemonDeploySpec:
     # typing.NamedTuple + Generic is broken in py36
     def __init__(self, host: str, daemon_id: str,
@@ -41,6 +62,7 @@ class CephadmDaemonDeploySpec:
                  rank: Optional[int] = None,
                  rank_generation: Optional[int] = None,
                  extra_container_args: Optional[List[str]] = None,
                  rank: Optional[int] = None,
                  rank_generation: Optional[int] = None,
                  extra_container_args: Optional[List[str]] = None,
+                 extra_entrypoint_args: Optional[List[str]] = None,
                  ):
         """
         A data struction to encapsulate `cephadm deploy ...
                  ):
         """
         A data struction to encapsulate `cephadm deploy ...
@@ -77,10 +99,14 @@ class CephadmDaemonDeploySpec:
         self.rank_generation: Optional[int] = rank_generation
 
         self.extra_container_args = extra_container_args
         self.rank_generation: Optional[int] = rank_generation
 
         self.extra_container_args = extra_container_args
+        self.extra_entrypoint_args = extra_entrypoint_args
 
     def name(self) -> str:
         return '%s.%s' % (self.daemon_type, self.daemon_id)
 
 
     def name(self) -> str:
         return '%s.%s' % (self.daemon_type, self.daemon_id)
 
+    def entity_name(self) -> str:
+        return get_auth_entity(self.daemon_type, self.daemon_id, host=self.host)
+
     def config_get_files(self) -> Dict[str, Any]:
         files = self.extra_files
         if self.ceph_conf:
     def config_get_files(self) -> Dict[str, Any]:
         files = self.extra_files
         if self.ceph_conf:
@@ -103,6 +129,7 @@ class CephadmDaemonDeploySpec:
             rank=dd.rank,
             rank_generation=dd.rank_generation,
             extra_container_args=dd.extra_container_args,
             rank=dd.rank,
             rank_generation=dd.rank_generation,
             extra_container_args=dd.extra_container_args,
+            extra_entrypoint_args=dd.extra_entrypoint_args,
         )
 
     def to_daemon_description(self, status: DaemonDescriptionStatus, status_desc: str) -> DaemonDescription:
         )
 
     def to_daemon_description(self, status: DaemonDescriptionStatus, status_desc: str) -> DaemonDescription:
@@ -118,6 +145,7 @@ class CephadmDaemonDeploySpec:
             rank=self.rank,
             rank_generation=self.rank_generation,
             extra_container_args=self.extra_container_args,
             rank=self.rank,
             rank_generation=self.rank_generation,
             extra_container_args=self.extra_container_args,
+            extra_entrypoint_args=self.extra_entrypoint_args,
         )
 
 
         )
 
 
@@ -191,6 +219,8 @@ class CephadmService(metaclass=ABCMeta):
             rank_generation=rank_generation,
             extra_container_args=spec.extra_container_args if hasattr(
                 spec, 'extra_container_args') else None,
             rank_generation=rank_generation,
             extra_container_args=spec.extra_container_args if hasattr(
                 spec, 'extra_container_args') else None,
+            extra_entrypoint_args=spec.extra_entrypoint_args if hasattr(
+                spec, 'extra_entrypoint_args') else None,
         )
 
     def prepare_create(self, daemon_spec: CephadmDaemonDeploySpec) -> CephadmDaemonDeploySpec:
         )
 
     def prepare_create(self, daemon_spec: CephadmDaemonDeploySpec) -> CephadmDaemonDeploySpec:
@@ -237,6 +267,29 @@ class CephadmService(metaclass=ABCMeta):
             })
             if err:
                 self.mgr.log.warning(f"Unable to update caps for {entity}")
             })
             if err:
                 self.mgr.log.warning(f"Unable to update caps for {entity}")
+
+            # get keyring anyway
+            ret, keyring, err = self.mgr.mon_command({
+                'prefix': 'auth get',
+                'entity': entity,
+            })
+            if err:
+                raise OrchestratorError(f"Unable to fetch keyring for {entity}: {err}")
+
+        # strip down keyring
+        #  - don't include caps (auth get includes them; get-or-create does not)
+        #  - use pending key if present
+        key = None
+        for line in keyring.splitlines():
+            if ' = ' not in line:
+                continue
+            line = line.strip()
+            (ls, rs) = line.split(' = ', 1)
+            if ls == 'key' and not key:
+                key = rs
+            if ls == 'pending key':
+                key = rs
+        keyring = f'[{entity}]\nkey = {key}\n'
         return keyring
 
     def _inventory_get_fqdn(self, hostname: str) -> str:
         return keyring
 
     def _inventory_get_fqdn(self, hostname: str) -> str:
@@ -450,24 +503,7 @@ class CephService(CephadmService):
         self.remove_keyring(daemon)
 
     def get_auth_entity(self, daemon_id: str, host: str = "") -> AuthEntity:
         self.remove_keyring(daemon)
 
     def get_auth_entity(self, daemon_id: str, host: str = "") -> AuthEntity:
-        """
-        Map the daemon id to a cephx keyring entity name
-        """
-        # despite this mapping entity names to daemons, self.TYPE within
-        # the CephService class refers to service types, not daemon types
-        if self.TYPE in ['rgw', 'rbd-mirror', 'cephfs-mirror', 'nfs', "iscsi", 'ingress']:
-            return AuthEntity(f'client.{self.TYPE}.{daemon_id}')
-        elif self.TYPE in ['crash', 'agent']:
-            if host == "":
-                raise OrchestratorError(
-                    f'Host not provided to generate <{self.TYPE}> auth entity name')
-            return AuthEntity(f'client.{self.TYPE}.{host}')
-        elif self.TYPE == 'mon':
-            return AuthEntity('mon.')
-        elif self.TYPE in ['mgr', 'osd', 'mds']:
-            return AuthEntity(f'{self.TYPE}.{daemon_id}')
-        else:
-            raise OrchestratorError("unknown daemon type")
+        return get_auth_entity(self.TYPE, daemon_id, host=host)
 
     def get_config_and_keyring(self,
                                daemon_type: str,
 
     def get_config_and_keyring(self,
                                daemon_type: str,
@@ -483,7 +519,6 @@ class CephService(CephadmService):
                 'prefix': 'auth get',
                 'entity': entity,
             })
                 'prefix': 'auth get',
                 'entity': entity,
             })
-
         config = self.mgr.get_minimal_ceph_conf()
 
         if extra_ceph_config:
         config = self.mgr.get_minimal_ceph_conf()
 
         if extra_ceph_config:
@@ -524,7 +559,7 @@ class MonService(CephService):
         # get mon. key
         ret, keyring, err = self.mgr.check_mon_command({
             'prefix': 'auth get',
         # get mon. key
         ret, keyring, err = self.mgr.check_mon_command({
             'prefix': 'auth get',
-            'entity': self.get_auth_entity(name),
+            'entity': daemon_spec.entity_name(),
         })
 
         extra_config = '[mon.%s]\n' % name
         })
 
         extra_config = '[mon.%s]\n' % name
@@ -1010,6 +1045,34 @@ class CrashService(CephService):
         return daemon_spec
 
 
         return daemon_spec
 
 
+class CephExporterService(CephService):
+    TYPE = 'ceph-exporter'
+    DEFAULT_SERVICE_PORT = 9926
+
+    def prepare_create(self, daemon_spec: CephadmDaemonDeploySpec) -> CephadmDaemonDeploySpec:
+        assert self.TYPE == daemon_spec.daemon_type
+        spec = cast(CephExporterSpec, self.mgr.spec_store[daemon_spec.service_name].spec)
+        keyring = self.get_keyring_with_caps(self.get_auth_entity(daemon_spec.daemon_id),
+                                             ['mon', 'profile ceph-exporter',
+                                              'mon', 'allow r',
+                                              'mgr', 'allow r',
+                                              'osd', 'allow r'])
+        exporter_config = {}
+        if spec.sock_dir:
+            exporter_config.update({'sock-dir': spec.sock_dir})
+        if spec.port:
+            exporter_config.update({'port': f'{spec.port}'})
+        if spec.prio_limit is not None:
+            exporter_config.update({'prio-limit': f'{spec.prio_limit}'})
+        if spec.stats_period:
+            exporter_config.update({'stats-period': f'{spec.stats_period}'})
+
+        daemon_spec.keyring = keyring
+        daemon_spec.final_config, daemon_spec.deps = self.generate_config(daemon_spec)
+        daemon_spec.final_config = merge_dicts(daemon_spec.final_config, exporter_config)
+        return daemon_spec
+
+
 class CephfsMirrorService(CephService):
     TYPE = 'cephfs-mirror'
 
 class CephfsMirrorService(CephService):
     TYPE = 'cephfs-mirror'
 
@@ -1030,7 +1093,7 @@ class CephfsMirrorService(CephService):
 
         ret, keyring, err = self.mgr.check_mon_command({
             'prefix': 'auth get-or-create',
 
         ret, keyring, err = self.mgr.check_mon_command({
             'prefix': 'auth get-or-create',
-            'entity': self.get_auth_entity(daemon_spec.daemon_id),
+            'entity': daemon_spec.entity_name(),
             'caps': ['mon', 'profile cephfs-mirror',
                      'mds', 'allow r',
                      'osd', 'allow rw tag cephfs metadata=*, allow r tag cephfs data=*',
             'caps': ['mon', 'profile cephfs-mirror',
                      'mds', 'allow r',
                      'osd', 'allow rw tag cephfs metadata=*, allow r tag cephfs data=*',
index 75276535ac717acf16316e4fec43b82cc0570df8..671660d3f06737ab43508ee001607f20f68333af 100644 (file)
@@ -6,8 +6,8 @@ from typing import List, Dict, Any, Tuple, cast, Optional
 
 from ceph.deployment.service_spec import IngressSpec
 from mgr_util import build_url
 
 from ceph.deployment.service_spec import IngressSpec
 from mgr_util import build_url
-from cephadm.utils import resolve_ip
-from orchestrator import OrchestratorError
+from cephadm import utils
+from orchestrator import OrchestratorError, DaemonDescription
 from cephadm.services.cephadmservice import CephadmDaemonDeploySpec, CephService
 
 logger = logging.getLogger(__name__)
 from cephadm.services.cephadmservice import CephadmDaemonDeploySpec, CephService
 
 logger = logging.getLogger(__name__)
@@ -89,7 +89,33 @@ class IngressService(CephService):
 
         if backend_spec.service_type == 'nfs':
             mode = 'tcp'
 
         if backend_spec.service_type == 'nfs':
             mode = 'tcp'
-            by_rank = {d.rank: d for d in daemons if d.rank is not None}
+            # we need to get the nfs daemon with the highest rank_generation for
+            # each rank we are currently deploying for the haproxy config
+            # for example if we had three (rank, rank_generation) pairs of
+            # (0, 0), (0, 1), (1, 0) we would want the nfs daemon corresponding
+            # to (0, 1) and (1, 0) because those are the two with the highest
+            # rank_generation for the existing ranks (0 and 1, with the highest
+            # rank_generation for rank 0 being 1 and highest rank_generation for
+            # rank 1 being 0)
+            ranked_daemons = [d for d in daemons if (d.rank is not None and d.rank_generation is not None)]
+            by_rank: Dict[int, DaemonDescription] = {}
+            for d in ranked_daemons:
+                # It doesn't seem like mypy can figure out that rank
+                # and rank_generation for both the daemon we're looping on
+                # and all those in by_rank cannot be None due to the filtering
+                # when creating the ranked_daemons list, which is why these
+                # seemingly unnecessary assertions are here.
+                assert d.rank is not None
+                if d.rank not in by_rank:
+                    by_rank[d.rank] = d
+                else:
+                    same_rank_nfs = by_rank[d.rank]
+                    assert d.rank_generation is not None
+                    assert same_rank_nfs.rank_generation is not None
+                    # if we have multiple of the same rank. take the one
+                    # with the highesr rank generation
+                    if d.rank_generation > same_rank_nfs.rank_generation:
+                        by_rank[d.rank] = d
             servers = []
 
             # try to establish how many ranks we *should* have
             servers = []
 
             # try to establish how many ranks we *should* have
@@ -103,7 +129,7 @@ class IngressService(CephService):
                     assert d.ports
                     servers.append({
                         'name': f"{spec.backend_service}.{rank}",
                     assert d.ports
                     servers.append({
                         'name': f"{spec.backend_service}.{rank}",
-                        'ip': d.ip or resolve_ip(self.mgr.inventory.get_addr(str(d.hostname))),
+                        'ip': d.ip or utils.resolve_ip(self.mgr.inventory.get_addr(str(d.hostname))),
                         'port': d.ports[0],
                     })
                 else:
                         'port': d.ports[0],
                     })
                 else:
@@ -118,7 +144,7 @@ class IngressService(CephService):
             servers = [
                 {
                     'name': d.name(),
             servers = [
                 {
                     'name': d.name(),
-                    'ip': d.ip or resolve_ip(self.mgr.inventory.get_addr(str(d.hostname))),
+                    'ip': d.ip or utils.resolve_ip(self.mgr.inventory.get_addr(str(d.hostname))),
                     'port': d.ports[0],
                 } for d in daemons if d.ports
             ]
                     'port': d.ports[0],
                 } for d in daemons if d.ports
             ]
@@ -127,6 +153,7 @@ class IngressService(CephService):
             'services/ingress/haproxy.cfg.j2',
             {
                 'spec': spec,
             'services/ingress/haproxy.cfg.j2',
             {
                 'spec': spec,
+                'backend_spec': backend_spec,
                 'mode': mode,
                 'servers': servers,
                 'user': spec.monitor_user or 'admin',
                 'mode': mode,
                 'servers': servers,
                 'user': spec.monitor_user or 'admin',
@@ -273,7 +300,7 @@ class IngressService(CephService):
         # other_ips in conf file and converter to ips
         if host in hosts:
             hosts.remove(host)
         # other_ips in conf file and converter to ips
         if host in hosts:
             hosts.remove(host)
-        other_ips = [resolve_ip(self.mgr.inventory.get_addr(h)) for h in hosts]
+        other_ips = [utils.resolve_ip(self.mgr.inventory.get_addr(h)) for h in hosts]
 
         keepalived_conf = self.mgr.template.render(
             'services/ingress/keepalived.conf.j2',
 
         keepalived_conf = self.mgr.template.render(
             'services/ingress/keepalived.conf.j2',
@@ -286,7 +313,7 @@ class IngressService(CephService):
                 'states': states,
                 'priorities': priorities,
                 'other_ips': other_ips,
                 'states': states,
                 'priorities': priorities,
                 'other_ips': other_ips,
-                'host_ip': resolve_ip(self.mgr.inventory.get_addr(host)),
+                'host_ip': utils.resolve_ip(self.mgr.inventory.get_addr(host)),
             }
         )
 
             }
         )
 
index d5896f075d497499b3b35eb2136920c2e78f13fc..c42eff6838d9a1120d04edc4c4b3d9794811a6d7 100644 (file)
@@ -23,6 +23,14 @@ class IscsiService(CephService):
         assert spec.pool
         self.mgr._check_pool_exists(spec.pool, spec.service_name())
 
         assert spec.pool
         self.mgr._check_pool_exists(spec.pool, spec.service_name())
 
+    def get_trusted_ips(self, spec: IscsiServiceSpec) -> str:
+        # add active mgr ip address to trusted list so dashboard can access
+        trusted_ip_list = spec.trusted_ip_list if spec.trusted_ip_list else ''
+        if trusted_ip_list:
+            trusted_ip_list += ','
+        trusted_ip_list += self.mgr.get_mgr_ip()
+        return trusted_ip_list
+
     def prepare_create(self, daemon_spec: CephadmDaemonDeploySpec) -> CephadmDaemonDeploySpec:
         assert self.TYPE == daemon_spec.daemon_type
 
     def prepare_create(self, daemon_spec: CephadmDaemonDeploySpec) -> CephadmDaemonDeploySpec:
         assert self.TYPE == daemon_spec.daemon_type
 
@@ -58,11 +66,7 @@ class IscsiService(CephService):
                 'val': key_data,
             })
 
                 'val': key_data,
             })
 
-        # add active mgr ip address to trusted list so dashboard can access
-        trusted_ip_list = spec.trusted_ip_list if spec.trusted_ip_list else ''
-        if trusted_ip_list:
-            trusted_ip_list += ','
-        trusted_ip_list += self.mgr.get_mgr_ip()
+        trusted_ip_list = self.get_trusted_ips(spec)
 
         context = {
             'client_name': '{}.{}'.format(utils.name_to_config_section('iscsi'), igw_id),
 
         context = {
             'client_name': '{}.{}'.format(utils.name_to_config_section('iscsi'), igw_id),
@@ -74,7 +78,7 @@ class IscsiService(CephService):
         daemon_spec.keyring = keyring
         daemon_spec.extra_files = {'iscsi-gateway.cfg': igw_conf}
         daemon_spec.final_config, daemon_spec.deps = self.generate_config(daemon_spec)
         daemon_spec.keyring = keyring
         daemon_spec.extra_files = {'iscsi-gateway.cfg': igw_conf}
         daemon_spec.final_config, daemon_spec.deps = self.generate_config(daemon_spec)
-        daemon_spec.deps = [self.mgr.get_mgr_ip()]
+        daemon_spec.deps = [trusted_ip_list]
         return daemon_spec
 
     def config_dashboard(self, daemon_descrs: List[DaemonDescription]) -> None:
         return daemon_spec
 
     def config_dashboard(self, daemon_descrs: List[DaemonDescription]) -> None:
index f99c79e795575531149e31cc5f2a97c52f612003..e3a1b32e86ce993057ddb822adea4118f8375611 100644 (file)
@@ -9,7 +9,8 @@ from urllib.parse import urlparse
 from mgr_module import HandleCommandResult
 
 from orchestrator import DaemonDescription
 from mgr_module import HandleCommandResult
 
 from orchestrator import DaemonDescription
-from ceph.deployment.service_spec import AlertManagerSpec, GrafanaSpec, ServiceSpec, SNMPGatewaySpec
+from ceph.deployment.service_spec import AlertManagerSpec, GrafanaSpec, ServiceSpec, \
+    SNMPGatewaySpec, PrometheusSpec
 from cephadm.services.cephadmservice import CephadmService, CephadmDaemonDeploySpec
 from cephadm.services.ingress import IngressSpec
 from mgr_util import verify_tls, ServerConfigException, create_self_signed_cert, build_url
 from cephadm.services.cephadmservice import CephadmService, CephadmDaemonDeploySpec
 from cephadm.services.ingress import IngressSpec
 from mgr_util import verify_tls, ServerConfigException, create_self_signed_cert, build_url
@@ -289,6 +290,20 @@ class PrometheusService(CephadmService):
             daemon_spec: CephadmDaemonDeploySpec,
     ) -> Tuple[Dict[str, Any], List[str]]:
         assert self.TYPE == daemon_spec.daemon_type
             daemon_spec: CephadmDaemonDeploySpec,
     ) -> Tuple[Dict[str, Any], List[str]]:
         assert self.TYPE == daemon_spec.daemon_type
+
+        prom_spec = cast(PrometheusSpec, self.mgr.spec_store[daemon_spec.service_name].spec)
+
+        try:
+            retention_time = prom_spec.retention_time if prom_spec.retention_time else '15d'
+        except AttributeError:
+            retention_time = '15d'
+
+        try:
+            retention_size = prom_spec.retention_size if prom_spec.retention_size else '0'
+        except AttributeError:
+            # default to disabled
+            retention_size = '0'
+
         deps = []  # type: List[str]
 
         # scrape mgrs
         deps = []  # type: List[str]
 
         # scrape mgrs
@@ -356,19 +371,34 @@ class PrometheusService(CephadmService):
                         "service": dd.service_name(),
                     })
 
                         "service": dd.service_name(),
                     })
 
+        # scrape ceph-exporters
+        ceph_exporter_targets = []
+        for dd in self.mgr.cache.get_daemons_by_service('ceph-exporter'):
+            assert dd.hostname is not None
+            deps.append(dd.name())
+            addr = dd.ip if dd.ip else self._inventory_get_fqdn(dd.hostname)
+            port = dd.ports[0] if dd.ports else 9926
+            ceph_exporter_targets.append({
+                'url': build_url(host=addr, port=port).lstrip('/'),
+                'hostname': dd.hostname
+            })
+
         # generate the prometheus configuration
         context = {
             'alertmgr_targets': alertmgr_targets,
             'mgr_scrape_list': mgr_scrape_list,
             'haproxy_targets': haproxy_targets,
         # generate the prometheus configuration
         context = {
             'alertmgr_targets': alertmgr_targets,
             'mgr_scrape_list': mgr_scrape_list,
             'haproxy_targets': haproxy_targets,
+            'ceph_exporter_targets': ceph_exporter_targets,
             'nodes': nodes,
         }
             'nodes': nodes,
         }
-        r = {
+        r: Dict[str, Any] = {
             'files': {
                 'prometheus.yml':
                     self.mgr.template.render(
                         'services/prometheus/prometheus.yml.j2', context)
             'files': {
                 'prometheus.yml':
                     self.mgr.template.render(
                         'services/prometheus/prometheus.yml.j2', context)
-            }
+            },
+            'retention_time': retention_time,
+            'retention_size': retention_size
         }
 
         # include alerts, if present in the container
         }
 
         # include alerts, if present in the container
index e874ba6d78fe860b6ed969f1c6d15a7c71d13193..12ad38ad079e4bb162a291309a4e700a25523177 100644 (file)
@@ -26,6 +26,14 @@ logger = logging.getLogger(__name__)
 asyncssh_logger = logging.getLogger('asyncssh')
 asyncssh_logger.propagate = False
 
 asyncssh_logger = logging.getLogger('asyncssh')
 asyncssh_logger.propagate = False
 
+
+class HostConnectionError(OrchestratorError):
+    def __init__(self, message: str, hostname: str, addr: str) -> None:
+        super().__init__(message)
+        self.hostname = hostname
+        self.addr = addr
+
+
 DEFAULT_SSH_CONFIG = """
 Host *
   User root
 DEFAULT_SSH_CONFIG = """
 Host *
   User root
@@ -106,19 +114,19 @@ class SSHManager:
             log_content = log_string.getvalue()
             msg = f"Can't communicate with remote host `{addr}`, possibly because python3 is not installed there. {str(e)}"
             logger.exception(msg)
             log_content = log_string.getvalue()
             msg = f"Can't communicate with remote host `{addr}`, possibly because python3 is not installed there. {str(e)}"
             logger.exception(msg)
-            raise OrchestratorError(msg)
+            raise HostConnectionError(msg, host, addr)
         except asyncssh.Error as e:
             self.mgr.offline_hosts.add(host)
             log_content = log_string.getvalue()
             msg = f'Failed to connect to {host} ({addr}). {str(e)}' + '\n' + f'Log: {log_content}'
             logger.debug(msg)
         except asyncssh.Error as e:
             self.mgr.offline_hosts.add(host)
             log_content = log_string.getvalue()
             msg = f'Failed to connect to {host} ({addr}). {str(e)}' + '\n' + f'Log: {log_content}'
             logger.debug(msg)
-            raise OrchestratorError(msg)
+            raise HostConnectionError(msg, host, addr)
         except Exception as e:
             self.mgr.offline_hosts.add(host)
             log_content = log_string.getvalue()
             logger.exception(str(e))
         except Exception as e:
             self.mgr.offline_hosts.add(host)
             log_content = log_string.getvalue()
             logger.exception(str(e))
-            raise OrchestratorError(
-                f'Failed to connect to {host} ({addr}): {repr(e)}' + '\n' f'Log: {log_content}')
+            raise HostConnectionError(
+                f'Failed to connect to {host} ({addr}): {repr(e)}' + '\n' f'Log: {log_content}', host, addr)
         finally:
             log_string.flush()
             asyncssh_logger.removeHandler(ch)
         finally:
             log_string.flush()
             asyncssh_logger.removeHandler(ch)
@@ -134,13 +142,15 @@ class SSHManager:
                                cmd: List[str],
                                stdin: Optional[str] = None,
                                addr: Optional[str] = None,
                                cmd: List[str],
                                stdin: Optional[str] = None,
                                addr: Optional[str] = None,
+                               log_command: Optional[bool] = True,
                                ) -> Tuple[str, str, int]:
         conn = await self._remote_connection(host, addr)
         sudo_prefix = "sudo " if self.mgr.ssh_user != 'root' else ""
         cmd = sudo_prefix + " ".join(quote(x) for x in cmd)
                                ) -> Tuple[str, str, int]:
         conn = await self._remote_connection(host, addr)
         sudo_prefix = "sudo " if self.mgr.ssh_user != 'root' else ""
         cmd = sudo_prefix + " ".join(quote(x) for x in cmd)
-        logger.debug(f'Running command: {cmd}')
+        if log_command:
+            logger.debug(f'Running command: {cmd}')
         try:
         try:
-            r = await conn.run('sudo true', check=True, timeout=5)
+            r = await conn.run(f'{sudo_prefix}true', check=True, timeout=5)
             r = await conn.run(cmd, input=stdin)
         # handle these Exceptions otherwise you might get a weird error like TypeError: __init__() missing 1 required positional argument: 'reason' (due to the asyncssh error interacting with raise_if_exception)
         except (asyncssh.ChannelOpenError, asyncssh.ProcessError, Exception) as e:
             r = await conn.run(cmd, input=stdin)
         # handle these Exceptions otherwise you might get a weird error like TypeError: __init__() missing 1 required positional argument: 'reason' (due to the asyncssh error interacting with raise_if_exception)
         except (asyncssh.ChannelOpenError, asyncssh.ProcessError, Exception) as e:
@@ -148,7 +158,12 @@ class SSHManager:
             logger.debug(f'Connection to {host} failed. {str(e)}')
             await self._reset_con(host)
             self.mgr.offline_hosts.add(host)
             logger.debug(f'Connection to {host} failed. {str(e)}')
             await self._reset_con(host)
             self.mgr.offline_hosts.add(host)
-            raise OrchestratorError(f'Unable to reach remote host {host}. {str(e)}')
+            if not addr:
+                try:
+                    addr = self.mgr.inventory.get_addr(host)
+                except Exception:
+                    addr = host
+            raise HostConnectionError(f'Unable to reach remote host {host}. {str(e)}', host, addr)
 
         def _rstrip(v: Union[bytes, str, None]) -> str:
             if not v:
 
         def _rstrip(v: Union[bytes, str, None]) -> str:
             if not v:
@@ -171,16 +186,18 @@ class SSHManager:
                         cmd: List[str],
                         stdin: Optional[str] = None,
                         addr: Optional[str] = None,
                         cmd: List[str],
                         stdin: Optional[str] = None,
                         addr: Optional[str] = None,
+                        log_command: Optional[bool] = True
                         ) -> Tuple[str, str, int]:
                         ) -> Tuple[str, str, int]:
-        return self.mgr.wait_async(self._execute_command(host, cmd, stdin, addr))
+        return self.mgr.wait_async(self._execute_command(host, cmd, stdin, addr, log_command))
 
     async def _check_execute_command(self,
                                      host: str,
                                      cmd: List[str],
                                      stdin: Optional[str] = None,
                                      addr: Optional[str] = None,
 
     async def _check_execute_command(self,
                                      host: str,
                                      cmd: List[str],
                                      stdin: Optional[str] = None,
                                      addr: Optional[str] = None,
+                                     log_command: Optional[bool] = True
                                      ) -> str:
                                      ) -> str:
-        out, err, code = await self._execute_command(host, cmd, stdin, addr)
+        out, err, code = await self._execute_command(host, cmd, stdin, addr, log_command)
         if code != 0:
             msg = f'Command {cmd} failed. {err}'
             logger.debug(msg)
         if code != 0:
             msg = f'Command {cmd} failed. {err}'
             logger.debug(msg)
@@ -192,8 +209,9 @@ class SSHManager:
                               cmd: List[str],
                               stdin: Optional[str] = None,
                               addr: Optional[str] = None,
                               cmd: List[str],
                               stdin: Optional[str] = None,
                               addr: Optional[str] = None,
+                              log_command: Optional[bool] = True,
                               ) -> str:
                               ) -> str:
-        return self.mgr.wait_async(self._check_execute_command(host, cmd, stdin, addr))
+        return self.mgr.wait_async(self._check_execute_command(host, cmd, stdin, addr, log_command))
 
     async def _write_remote_file(self,
                                  host: str,
 
     async def _write_remote_file(self,
                                  host: str,
index cb84f1d072226f3a55d37a62795d3dcd2d31884a..6d64c63634587a5e4f23cad2ac7b7979e5462838 100644 (file)
@@ -32,8 +32,8 @@ defaults
     timeout connect         5s
     timeout http-request    1s
     timeout http-keep-alive 5s
     timeout connect         5s
     timeout http-request    1s
     timeout http-keep-alive 5s
-    timeout client          1s
-    timeout server          1s
+    timeout client          30s
+    timeout server          30s
     timeout check           5s
 {% endif %}
 {% if mode == 'tcp' %}
     timeout check           5s
 {% endif %}
 {% if mode == 'tcp' %}
@@ -67,6 +67,10 @@ frontend frontend
 backend backend
 {% if mode == 'http' %}
     option forwardfor
 backend backend
 {% if mode == 'http' %}
     option forwardfor
+{% if backend_spec.ssl %}
+    default-server ssl
+    default-server verify none
+{% endif %}
     balance static-rr
     option httpchk HEAD / HTTP/1.0
     {% for server in servers %}
     balance static-rr
     option httpchk HEAD / HTTP/1.0
     {% for server in servers %}
index bb0a8fcae518f45f51c682fa25d8b3ca22d8e66b..27bbfffb66ec903d0d782fd2a1ffa1286fb00199 100644 (file)
@@ -39,3 +39,14 @@ scrape_configs:
           instance: '{{ haproxy.service }}'
 {% endfor %}
 {% endif %}
           instance: '{{ haproxy.service }}'
 {% endfor %}
 {% endif %}
+
+{% if ceph_exporter_targets %}
+  - job_name: 'ceph-exporter'
+    honor_labels: true
+    static_configs:
+{% for ceph_exporter in ceph_exporter_targets %}
+    - targets: ['{{ ceph_exporter.url }}']
+      labels:
+        instance: '{{ ceph_exporter.hostname }}'
+{% endfor %}
+{% endif %}
index 0567f7f7e68a02b5cc784dc2d12f1ac98cd96aae..cabd904a15e253e06481a43ec90802a919e3d846 100644 (file)
@@ -133,8 +133,7 @@ def with_cephadm_module(module_options=None, store=None):
         yield m
 
 
         yield m
 
 
-def wait(m, c):
-    # type: (CephadmOrchestrator, OrchResult) -> Any
+def wait(m: CephadmOrchestrator, c: OrchResult) -> Any:
     return raise_if_exception(c)
 
 
     return raise_if_exception(c)
 
 
index a4b1dc1b24368241435df62b257bdabe94c5e228..8bdcb42665351cc860934ba49f5a7ad7f85104a8 100644 (file)
@@ -16,6 +16,10 @@ class FakeDaemonDescription:
 
 class FakeCache:
     def get_daemons_by_service(self, service_type):
 
 class FakeCache:
     def get_daemons_by_service(self, service_type):
+        if service_type == 'ceph-exporter':
+            return [FakeDaemonDescription('1.2.3.4', [9926], 'node0'),
+                    FakeDaemonDescription('1.2.3.5', [9926], 'node1')]
+
         return [FakeDaemonDescription('1.2.3.4', [9100], 'node0'),
                 FakeDaemonDescription('1.2.3.5', [9200], 'node1')]
 
         return [FakeDaemonDescription('1.2.3.4', [9100], 'node0'),
                 FakeDaemonDescription('1.2.3.5', [9200], 'node1')]
 
@@ -150,6 +154,20 @@ class TestCephadmService:
         assert cfg[0]['targets'] == ['1.2.3.4:9049']
         assert cfg[0]['labels'] == {'instance': 'ingress'}
 
         assert cfg[0]['targets'] == ['1.2.3.4:9049']
         assert cfg[0]['labels'] == {'instance': 'ingress'}
 
+    def test_get_sd_config_ceph_exporter(self):
+        mgr = FakeMgr()
+        root = Root(mgr)
+        cfg = root.get_sd_config('ceph-exporter')
+
+        # check response structure
+        assert cfg
+        for entry in cfg:
+            assert 'labels' in entry
+            assert 'targets' in entry
+
+        # check content
+        assert cfg[0]['targets'] == ['1.2.3.4:9926']
+
     def test_get_sd_config_invalid_service(self):
         mgr = FakeMgr()
         root = Root(mgr)
     def test_get_sd_config_invalid_service(self):
         mgr = FakeMgr()
         root = Root(mgr)
index 354ee338a5cfb768ec6e8c58b295a60f10965da0..33185cad6346dba46b158c2dfda7618510cdd94a 100644 (file)
@@ -17,7 +17,7 @@ except ImportError:
 
 from ceph.deployment.service_spec import ServiceSpec, PlacementSpec, RGWSpec, \
     NFSServiceSpec, IscsiServiceSpec, HostPlacementSpec, CustomContainerSpec, MDSSpec, \
 
 from ceph.deployment.service_spec import ServiceSpec, PlacementSpec, RGWSpec, \
     NFSServiceSpec, IscsiServiceSpec, HostPlacementSpec, CustomContainerSpec, MDSSpec, \
-    CustomConfig
+    CustomConfig, PrometheusSpec
 from ceph.deployment.drive_selection.selector import DriveSelection
 from ceph.deployment.inventory import Devices, Device
 from ceph.utils import datetime_to_str, datetime_now
 from ceph.deployment.drive_selection.selector import DriveSelection
 from ceph.deployment.inventory import Devices, Device
 from ceph.utils import datetime_to_str, datetime_now
@@ -117,13 +117,13 @@ def with_osd_daemon(cephadm_module: CephadmOrchestrator, _run_cephadm, host: str
         [host]).stdout == f"Created osd(s) 1 on host '{host}'"
     assert _run_cephadm.mock_calls == [
         mock.call(host, 'osd', 'ceph-volume',
         [host]).stdout == f"Created osd(s) 1 on host '{host}'"
     assert _run_cephadm.mock_calls == [
         mock.call(host, 'osd', 'ceph-volume',
-                  ['--', 'lvm', 'list', '--format', 'json'], no_fsid=False, image=''),
+                  ['--', 'lvm', 'list', '--format', 'json'], no_fsid=False, error_ok=False, image='', log_output=True),
         mock.call(host, f'osd.{osd_id}', 'deploy',
                   ['--name', f'osd.{osd_id}', '--meta-json', mock.ANY,
                    '--config-json', '-', '--osd-fsid', 'uuid'],
                   stdin=mock.ANY, image=''),
         mock.call(host, 'osd', 'ceph-volume',
         mock.call(host, f'osd.{osd_id}', 'deploy',
                   ['--name', f'osd.{osd_id}', '--meta-json', mock.ANY,
                    '--config-json', '-', '--osd-fsid', 'uuid'],
                   stdin=mock.ANY, image=''),
         mock.call(host, 'osd', 'ceph-volume',
-                  ['--', 'raw', 'list', '--format', 'json'], no_fsid=False, image=''),
+                  ['--', 'raw', 'list', '--format', 'json'], no_fsid=False, error_ok=False, image='', log_output=True),
     ]
     dd = cephadm_module.cache.get_daemon(f'osd.{osd_id}', host=host)
     assert dd.name() == f'osd.{osd_id}'
     ]
     dd = cephadm_module.cache.get_daemon(f'osd.{osd_id}', host=host)
     assert dd.name() == f'osd.{osd_id}'
@@ -404,7 +404,8 @@ class TestCephadm(object):
         ]
     )
     @mock.patch("cephadm.serve.CephadmServe._run_cephadm", _run_cephadm('{}'))
         ]
     )
     @mock.patch("cephadm.serve.CephadmServe._run_cephadm", _run_cephadm('{}'))
-    def test_daemon_check(self, cephadm_module: CephadmOrchestrator, action):
+    @mock.patch("cephadm.module.HostCache.save_host")
+    def test_daemon_check(self, _save_host, cephadm_module: CephadmOrchestrator, action):
         with with_host(cephadm_module, 'test'):
             with with_service(cephadm_module, ServiceSpec(service_type='grafana'), CephadmOrchestrator.apply_grafana, 'test') as d_names:
                 [daemon_name] = d_names
         with with_host(cephadm_module, 'test'):
             with with_service(cephadm_module, ServiceSpec(service_type='grafana'), CephadmOrchestrator.apply_grafana, 'test') as d_names:
                 [daemon_name] = d_names
@@ -416,6 +417,7 @@ class TestCephadm(object):
 
                 CephadmServe(cephadm_module)._check_daemons()
 
 
                 CephadmServe(cephadm_module)._check_daemons()
 
+                assert _save_host.called_with('test')
                 assert cephadm_module.cache.get_scheduled_daemon_action('test', daemon_name) is None
 
     @mock.patch("cephadm.serve.CephadmServe._run_cephadm")
                 assert cephadm_module.cache.get_scheduled_daemon_action('test', daemon_name) is None
 
     @mock.patch("cephadm.serve.CephadmServe._run_cephadm")
@@ -451,7 +453,8 @@ class TestCephadm(object):
                 _run_cephadm.assert_called_with(
                     'test', 'mon.test', 'deploy', [
                         '--name', 'mon.test',
                 _run_cephadm.assert_called_with(
                     'test', 'mon.test', 'deploy', [
                         '--name', 'mon.test',
-                        '--meta-json', '{"service_name": "mon", "ports": [], "ip": null, "deployed_by": [], "rank": null, "rank_generation": null, "extra_container_args": null}',
+                        '--meta-json', ('{"service_name": "mon", "ports": [], "ip": null, "deployed_by": [], "rank": null, '
+                                        '"rank_generation": null, "extra_container_args": null, "extra_entrypoint_args": null}'),
                         '--config-json', '-',
                         '--reconfig',
                     ],
                         '--config-json', '-',
                         '--reconfig',
                     ],
@@ -467,12 +470,91 @@ class TestCephadm(object):
                 _run_cephadm.assert_called_with(
                     'test', 'crash.test', 'deploy', [
                         '--name', 'crash.test',
                 _run_cephadm.assert_called_with(
                     'test', 'crash.test', 'deploy', [
                         '--name', 'crash.test',
-                        '--meta-json', '{"service_name": "crash", "ports": [], "ip": null, "deployed_by": [], "rank": null, "rank_generation": null, "extra_container_args": ["--cpus=2", "--quiet"]}',
+                        '--meta-json', ('{"service_name": "crash", "ports": [], "ip": null, "deployed_by": [], "rank": null, '
+                                        '"rank_generation": null, "extra_container_args": ["--cpus=2", "--quiet"], "extra_entrypoint_args": null}'),
                         '--config-json', '-',
                         '--extra-container-args=--cpus=2',
                         '--extra-container-args=--quiet'
                     ],
                         '--config-json', '-',
                         '--extra-container-args=--cpus=2',
                         '--extra-container-args=--quiet'
                     ],
-                    stdin='{"config": "", "keyring": ""}',
+                    stdin='{"config": "", "keyring": "[client.crash.test]\\nkey = None\\n"}',
+                    image='',
+                )
+
+    @mock.patch("cephadm.serve.CephadmServe._run_cephadm")
+    def test_extra_entrypoint_args(self, _run_cephadm, cephadm_module: CephadmOrchestrator):
+        _run_cephadm.side_effect = async_side_effect(('{}', '', 0))
+        with with_host(cephadm_module, 'test'):
+            with with_service(cephadm_module, ServiceSpec(service_type='node-exporter',
+                              extra_entrypoint_args=['--collector.textfile.directory=/var/lib/node_exporter/textfile_collector', '--some-other-arg']),
+                              CephadmOrchestrator.apply_node_exporter):
+                _run_cephadm.assert_called_with(
+                    'test', 'node-exporter.test', 'deploy', [
+                        '--name', 'node-exporter.test',
+                        '--meta-json', ('{"service_name": "node-exporter", "ports": [9100], "ip": null, "deployed_by": [], "rank": null, '
+                                        '"rank_generation": null, "extra_container_args": null, "extra_entrypoint_args": '
+                                        '["--collector.textfile.directory=/var/lib/node_exporter/textfile_collector", '
+                                        '"--some-other-arg"]}'),
+                        '--config-json', '-',
+                        '--tcp-ports', '9100',
+                        '--extra-entrypoint-args=--collector.textfile.directory=/var/lib/node_exporter/textfile_collector',
+                        '--extra-entrypoint-args=--some-other-arg'
+                    ],
+                    stdin='{}',
+                    image='',
+                )
+
+    @mock.patch("cephadm.serve.CephadmServe._run_cephadm")
+    def test_extra_entrypoint_and_container_args(self, _run_cephadm, cephadm_module: CephadmOrchestrator):
+        _run_cephadm.side_effect = async_side_effect(('{}', '', 0))
+        with with_host(cephadm_module, 'test'):
+            with with_service(cephadm_module, ServiceSpec(service_type='node-exporter',
+                              extra_entrypoint_args=['--collector.textfile.directory=/var/lib/node_exporter/textfile_collector', '--some-other-arg'],
+                              extra_container_args=['--cpus=2', '--quiet']),
+                              CephadmOrchestrator.apply_node_exporter):
+                _run_cephadm.assert_called_with(
+                    'test', 'node-exporter.test', 'deploy', [
+                        '--name', 'node-exporter.test',
+                        '--meta-json', ('{"service_name": "node-exporter", "ports": [9100], "ip": null, "deployed_by": [], "rank": null, '
+                                        '"rank_generation": null, "extra_container_args": ["--cpus=2", "--quiet"], "extra_entrypoint_args": '
+                                        '["--collector.textfile.directory=/var/lib/node_exporter/textfile_collector", '
+                                        '"--some-other-arg"]}'),
+                        '--config-json', '-',
+                        '--tcp-ports', '9100',
+                        '--extra-container-args=--cpus=2',
+                        '--extra-container-args=--quiet',
+                        '--extra-entrypoint-args=--collector.textfile.directory=/var/lib/node_exporter/textfile_collector',
+                        '--extra-entrypoint-args=--some-other-arg'
+                    ],
+                    stdin='{}',
+                    image='',
+                )
+
+    @mock.patch("cephadm.serve.CephadmServe._run_cephadm")
+    def test_extra_entrypoint_and_container_args_with_spaces(self, _run_cephadm, cephadm_module: CephadmOrchestrator):
+        _run_cephadm.side_effect = async_side_effect(('{}', '', 0))
+        with with_host(cephadm_module, 'test'):
+            with with_service(cephadm_module, ServiceSpec(service_type='node-exporter',
+                              extra_entrypoint_args=['--entrypoint-arg-with-value value', '--some-other-arg   3'],
+                              extra_container_args=['--cpus    2', '--container-arg-with-value value']),
+                              CephadmOrchestrator.apply_node_exporter):
+                _run_cephadm.assert_called_with(
+                    'test', 'node-exporter.test', 'deploy', [
+                        '--name', 'node-exporter.test',
+                        '--meta-json', ('{"service_name": "node-exporter", "ports": [9100], "ip": null, "deployed_by": [], "rank": null, '
+                                        '"rank_generation": null, "extra_container_args": ["--cpus    2", "--container-arg-with-value value"], '
+                                        '"extra_entrypoint_args": ["--entrypoint-arg-with-value value", "--some-other-arg   3"]}'),
+                        '--config-json', '-',
+                        '--tcp-ports', '9100',
+                        '--extra-container-args=--cpus',
+                        '--extra-container-args=2',
+                        '--extra-container-args=--container-arg-with-value',
+                        '--extra-container-args=value',
+                        '--extra-entrypoint-args=--entrypoint-arg-with-value',
+                        '--extra-entrypoint-args=value',
+                        '--extra-entrypoint-args=--some-other-arg',
+                        '--extra-entrypoint-args=3'
+                    ],
+                    stdin='{}',
                     image='',
                 )
 
                     image='',
                 )
 
@@ -494,13 +576,14 @@ class TestCephadm(object):
         ]
         conf_outs = [json.dumps(c.to_json()) for c in configs]
         stdin_str = '{' + \
         ]
         conf_outs = [json.dumps(c.to_json()) for c in configs]
         stdin_str = '{' + \
-            f'"config": "", "keyring": "", "custom_config_files": [{conf_outs[0]}, {conf_outs[1]}]' + '}'
+            f'"config": "", "keyring": "[client.crash.test]\\nkey = None\\n", "custom_config_files": [{conf_outs[0]}, {conf_outs[1]}]' + '}'
         with with_host(cephadm_module, 'test'):
             with with_service(cephadm_module, ServiceSpec(service_type='crash', custom_configs=configs), CephadmOrchestrator.apply_crash):
                 _run_cephadm.assert_called_with(
                     'test', 'crash.test', 'deploy', [
                         '--name', 'crash.test',
         with with_host(cephadm_module, 'test'):
             with with_service(cephadm_module, ServiceSpec(service_type='crash', custom_configs=configs), CephadmOrchestrator.apply_crash):
                 _run_cephadm.assert_called_with(
                     'test', 'crash.test', 'deploy', [
                         '--name', 'crash.test',
-                        '--meta-json', '{"service_name": "crash", "ports": [], "ip": null, "deployed_by": [], "rank": null, "rank_generation": null, "extra_container_args": null}',
+                        '--meta-json', ('{"service_name": "crash", "ports": [], "ip": null, "deployed_by": [], "rank": null, '
+                                        '"rank_generation": null, "extra_container_args": null, "extra_entrypoint_args": null}'),
                         '--config-json', '-',
                     ],
                     stdin=stdin_str,
                         '--config-json', '-',
                     ],
                     stdin=stdin_str,
@@ -790,11 +873,12 @@ class TestCephadm(object):
                 'test', 'osd', 'ceph-volume',
                 ['--config-json', '-', '--', 'lvm', 'batch',
                     '--no-auto', '/dev/sdb', '--yes', '--no-systemd'],
                 'test', 'osd', 'ceph-volume',
                 ['--config-json', '-', '--', 'lvm', 'batch',
                     '--no-auto', '/dev/sdb', '--yes', '--no-systemd'],
-                env_vars=['CEPH_VOLUME_OSDSPEC_AFFINITY=foo'], error_ok=True, stdin='{"config": "", "keyring": ""}')
+                env_vars=['CEPH_VOLUME_OSDSPEC_AFFINITY=foo'], error_ok=True,
+                stdin='{"config": "", "keyring": ""}')
             _run_cephadm.assert_any_call(
             _run_cephadm.assert_any_call(
-                'test', 'osd', 'ceph-volume', ['--', 'lvm', 'list', '--format', 'json'], image='', no_fsid=False)
+                'test', 'osd', 'ceph-volume', ['--', 'lvm', 'list', '--format', 'json'], image='', no_fsid=False, error_ok=False, log_output=True)
             _run_cephadm.assert_any_call(
             _run_cephadm.assert_any_call(
-                'test', 'osd', 'ceph-volume', ['--', 'raw', 'list', '--format', 'json'], image='', no_fsid=False)
+                'test', 'osd', 'ceph-volume', ['--', 'raw', 'list', '--format', 'json'], image='', no_fsid=False, error_ok=False, log_output=True)
 
     @mock.patch("cephadm.serve.CephadmServe._run_cephadm")
     def test_apply_osd_save_non_collocated(self, _run_cephadm, cephadm_module: CephadmOrchestrator):
 
     @mock.patch("cephadm.serve.CephadmServe._run_cephadm")
     def test_apply_osd_save_non_collocated(self, _run_cephadm, cephadm_module: CephadmOrchestrator):
@@ -834,9 +918,9 @@ class TestCephadm(object):
                 env_vars=['CEPH_VOLUME_OSDSPEC_AFFINITY=noncollocated'],
                 error_ok=True, stdin='{"config": "", "keyring": ""}')
             _run_cephadm.assert_any_call(
                 env_vars=['CEPH_VOLUME_OSDSPEC_AFFINITY=noncollocated'],
                 error_ok=True, stdin='{"config": "", "keyring": ""}')
             _run_cephadm.assert_any_call(
-                'test', 'osd', 'ceph-volume', ['--', 'lvm', 'list', '--format', 'json'], image='', no_fsid=False)
+                'test', 'osd', 'ceph-volume', ['--', 'lvm', 'list', '--format', 'json'], image='', no_fsid=False, error_ok=False, log_output=True)
             _run_cephadm.assert_any_call(
             _run_cephadm.assert_any_call(
-                'test', 'osd', 'ceph-volume', ['--', 'raw', 'list', '--format', 'json'], image='', no_fsid=False)
+                'test', 'osd', 'ceph-volume', ['--', 'raw', 'list', '--format', 'json'], image='', no_fsid=False, error_ok=False, log_output=True)
 
     @mock.patch("cephadm.serve.CephadmServe._run_cephadm", _run_cephadm('{}'))
     @mock.patch("cephadm.module.SpecStore.save")
 
     @mock.patch("cephadm.serve.CephadmServe._run_cephadm", _run_cephadm('{}'))
     @mock.patch("cephadm.module.SpecStore.save")
@@ -1214,6 +1298,7 @@ class TestCephadm(object):
             def __init__(self, c: str = 'a'):
                 # using 1015 here makes the serialized string exactly 1024 bytes if c is one char
                 self.content = {c: c * 1015}
             def __init__(self, c: str = 'a'):
                 # using 1015 here makes the serialized string exactly 1024 bytes if c is one char
                 self.content = {c: c * 1015}
+                self.path = 'dev/vdc'
 
             def to_json(self):
                 return self.content
 
             def to_json(self):
                 return self.content
@@ -1508,6 +1593,64 @@ class TestCephadm(object):
             with with_service(cephadm_module, spec, meth, 'test'):
                 pass
 
             with with_service(cephadm_module, spec, meth, 'test'):
                 pass
 
+    @pytest.mark.parametrize(
+        "spec, raise_exception, msg",
+        [
+            # Valid retention_time values (valid units: 'y', 'w', 'd', 'h', 'm', 's')
+            (PrometheusSpec(retention_time='1y'), False, ''),
+            (PrometheusSpec(retention_time=' 10w '), False, ''),
+            (PrometheusSpec(retention_time=' 1348d'), False, ''),
+            (PrometheusSpec(retention_time='2000h '), False, ''),
+            (PrometheusSpec(retention_time='173847m'), False, ''),
+            (PrometheusSpec(retention_time='200s'), False, ''),
+            (PrometheusSpec(retention_time='  '), False, ''),  # default value will be used
+
+            # Invalid retention_time values
+            (PrometheusSpec(retention_time='100k'), True, '^Invalid retention time'),     # invalid unit
+            (PrometheusSpec(retention_time='10'), True, '^Invalid retention time'),       # no unit
+            (PrometheusSpec(retention_time='100.00y'), True, '^Invalid retention time'),  # invalid value and valid unit
+            (PrometheusSpec(retention_time='100.00k'), True, '^Invalid retention time'),  # invalid value and invalid unit
+            (PrometheusSpec(retention_time='---'), True, '^Invalid retention time'),      # invalid value
+
+            # Valid retention_size values (valid units: 'B', 'KB', 'MB', 'GB', 'TB', 'PB', 'EB')
+            (PrometheusSpec(retention_size='123456789B'), False, ''),
+            (PrometheusSpec(retention_size=' 200KB'), False, ''),
+            (PrometheusSpec(retention_size='99999MB '), False, ''),
+            (PrometheusSpec(retention_size=' 10GB '), False, ''),
+            (PrometheusSpec(retention_size='100TB'), False, ''),
+            (PrometheusSpec(retention_size='500PB'), False, ''),
+            (PrometheusSpec(retention_size='200EB'), False, ''),
+            (PrometheusSpec(retention_size='  '), False, ''),  # default value will be used
+
+            # Invalid retention_size values
+            (PrometheusSpec(retention_size='100b'), True, '^Invalid retention size'),      # invalid unit (case sensitive)
+            (PrometheusSpec(retention_size='333kb'), True, '^Invalid retention size'),     # invalid unit (case sensitive)
+            (PrometheusSpec(retention_size='2000'), True, '^Invalid retention size'),      # no unit
+            (PrometheusSpec(retention_size='200.00PB'), True, '^Invalid retention size'),  # invalid value and valid unit
+            (PrometheusSpec(retention_size='400.B'), True, '^Invalid retention size'),     # invalid value and invalid unit
+            (PrometheusSpec(retention_size='10.000s'), True, '^Invalid retention size'),   # invalid value and invalid unit
+            (PrometheusSpec(retention_size='...'), True, '^Invalid retention size'),       # invalid value
+
+            # valid retention_size and valid retention_time
+            (PrometheusSpec(retention_time='1y', retention_size='100GB'), False, ''),
+            # invalid retention_time and valid retention_size
+            (PrometheusSpec(retention_time='1j', retention_size='100GB'), True, '^Invalid retention time'),
+            # valid retention_time and invalid retention_size
+            (PrometheusSpec(retention_time='1y', retention_size='100gb'), True, '^Invalid retention size'),
+            # valid retention_time and invalid retention_size
+            (PrometheusSpec(retention_time='1y', retention_size='100gb'), True, '^Invalid retention size'),
+            # invalid retention_time and invalid retention_size
+            (PrometheusSpec(retention_time='1i', retention_size='100gb'), True, '^Invalid retention time'),
+        ])
+    @mock.patch("cephadm.serve.CephadmServe._run_cephadm", _run_cephadm('{}'))
+    def test_apply_prometheus(self, spec: PrometheusSpec, raise_exception: bool, msg: str, cephadm_module: CephadmOrchestrator):
+        with with_host(cephadm_module, 'test'):
+            if not raise_exception:
+                cephadm_module._apply(spec)
+            else:
+                with pytest.raises(OrchestratorError, match=msg):
+                    cephadm_module._apply(spec)
+
     @mock.patch("cephadm.serve.CephadmServe._run_cephadm", _run_cephadm('{}'))
     def test_mds_config_purge(self, cephadm_module: CephadmOrchestrator):
         spec = MDSSpec('mds', service_id='fsname', config={'test': 'foo'})
     @mock.patch("cephadm.serve.CephadmServe._run_cephadm", _run_cephadm('{}'))
     def test_mds_config_purge(self, cephadm_module: CephadmOrchestrator):
         spec = MDSSpec('mds', service_id='fsname', config={'test': 'foo'})
@@ -1683,7 +1826,7 @@ class TestCephadm(object):
             cephadm_module.config_notify()
             assert cephadm_module.manage_etc_ceph_ceph_conf is True
 
             cephadm_module.config_notify()
             assert cephadm_module.manage_etc_ceph_ceph_conf is True
 
-            CephadmServe(cephadm_module)._refresh_hosts_and_daemons()
+            CephadmServe(cephadm_module)._write_all_client_files()
             # Make sure both ceph conf locations (default and per fsid) are called
             _write_file.assert_has_calls([mock.call('test', '/etc/ceph/ceph.conf', b'',
                                           0o644, 0, 0, None),
             # Make sure both ceph conf locations (default and per fsid) are called
             _write_file.assert_has_calls([mock.call('test', '/etc/ceph/ceph.conf', b'',
                                           0o644, 0, 0, None),
@@ -1697,7 +1840,7 @@ class TestCephadm(object):
 
             # set extra config and expect that we deploy another ceph.conf
             cephadm_module._set_extra_ceph_conf('[mon]\nk=v')
 
             # set extra config and expect that we deploy another ceph.conf
             cephadm_module._set_extra_ceph_conf('[mon]\nk=v')
-            CephadmServe(cephadm_module)._refresh_hosts_and_daemons()
+            CephadmServe(cephadm_module)._write_all_client_files()
             _write_file.assert_has_calls([mock.call('test',
                                                     '/etc/ceph/ceph.conf',
                                                     b'\n\n[mon]\nk=v\n', 0o644, 0, 0, None),
             _write_file.assert_has_calls([mock.call('test',
                                                     '/etc/ceph/ceph.conf',
                                                     b'\n\n[mon]\nk=v\n', 0o644, 0, 0, None),
@@ -1719,7 +1862,7 @@ class TestCephadm(object):
             f2_before_digest = cephadm_module.cache.get_host_client_files(
                 'test')['/var/lib/ceph/fsid/config/ceph.conf'][0]
             cephadm_module._set_extra_ceph_conf('[mon]\nk2=v2')
             f2_before_digest = cephadm_module.cache.get_host_client_files(
                 'test')['/var/lib/ceph/fsid/config/ceph.conf'][0]
             cephadm_module._set_extra_ceph_conf('[mon]\nk2=v2')
-            CephadmServe(cephadm_module)._refresh_hosts_and_daemons()
+            CephadmServe(cephadm_module)._write_all_client_files()
             f1_after_digest = cephadm_module.cache.get_host_client_files('test')[
                 '/etc/ceph/ceph.conf'][0]
             f2_after_digest = cephadm_module.cache.get_host_client_files(
             f1_after_digest = cephadm_module.cache.get_host_client_files('test')[
                 '/etc/ceph/ceph.conf'][0]
             f2_after_digest = cephadm_module.cache.get_host_client_files(
@@ -1828,10 +1971,10 @@ Traceback (most recent call last):
             assert _run_cephadm.mock_calls == [
                 mock.call('test', 'osd', 'ceph-volume',
                           ['--', 'inventory', '--format=json-pretty', '--filter-for-batch'], image='',
             assert _run_cephadm.mock_calls == [
                 mock.call('test', 'osd', 'ceph-volume',
                           ['--', 'inventory', '--format=json-pretty', '--filter-for-batch'], image='',
-                          no_fsid=False),
+                          no_fsid=False, error_ok=False, log_output=False),
                 mock.call('test', 'osd', 'ceph-volume',
                           ['--', 'inventory', '--format=json-pretty'], image='',
                 mock.call('test', 'osd', 'ceph-volume',
                           ['--', 'inventory', '--format=json-pretty'], image='',
-                          no_fsid=False),
+                          no_fsid=False, error_ok=False, log_output=False),
             ]
 
     @mock.patch("cephadm.serve.CephadmServe._run_cephadm")
             ]
 
     @mock.patch("cephadm.serve.CephadmServe._run_cephadm")
@@ -1938,3 +2081,119 @@ Traceback (most recent call last):
         with with_host(cephadm_module, 'test1', refresh_hosts=False, rm_with_force=True):
             with with_host(cephadm_module, 'test2', refresh_hosts=False, rm_with_force=False):
                 cephadm_module.inventory.add_label('test2', '_admin')
         with with_host(cephadm_module, 'test1', refresh_hosts=False, rm_with_force=True):
             with with_host(cephadm_module, 'test2', refresh_hosts=False, rm_with_force=False):
                 cephadm_module.inventory.add_label('test2', '_admin')
+
+    @pytest.mark.parametrize("facts, settings, expected_value",
+                             [
+                                 # All options are available on all hosts
+                                 (
+                                     {
+                                         "host1":
+                                         {
+                                             "sysctl_options":
+                                             {
+                                                 'opt1': 'val1',
+                                                 'opt2': 'val2',
+                                             }
+                                         },
+                                         "host2":
+                                         {
+                                             "sysctl_options":
+                                             {
+                                                 'opt1': '',
+                                                 'opt2': '',
+                                             }
+                                         },
+                                     },
+                                     {'opt1', 'opt2'},  # settings
+                                     {'host1': [], 'host2': []}  # expected_value
+                                 ),
+                                 # opt1 is missing on host 1, opt2 is missing on host2
+                                 ({
+                                     "host1":
+                                     {
+                                         "sysctl_options":
+                                         {
+                                             'opt2': '',
+                                             'optX': '',
+                                         }
+                                     },
+                                     "host2":
+                                     {
+                                         "sysctl_options":
+                                         {
+                                             'opt1': '',
+                                             'opt3': '',
+                                             'opt4': '',
+                                         }
+                                     },
+                                 },
+                                     {'opt1', 'opt2'},  # settings
+                                     {'host1': ['opt1'], 'host2': ['opt2']}  # expected_value
+                                 ),
+                                 # All options are missing on all hosts
+                                 ({
+                                     "host1":
+                                     {
+                                         "sysctl_options":
+                                         {
+                                         }
+                                     },
+                                     "host2":
+                                     {
+                                         "sysctl_options":
+                                         {
+                                         }
+                                     },
+                                 },
+                                     {'opt1', 'opt2'},  # settings
+                                     {'host1': ['opt1', 'opt2'], 'host2': [
+                                         'opt1', 'opt2']}  # expected_value
+                                 ),
+                             ]
+                             )
+    @mock.patch("cephadm.serve.CephadmServe._run_cephadm", _run_cephadm('[]'))
+    def test_tuned_profiles_settings_validation(self, facts, settings, expected_value, cephadm_module):
+        with with_host(cephadm_module, 'test'):
+            spec = mock.Mock()
+            spec.settings = sorted(settings)
+            spec.placement.filter_matching_hostspecs = mock.Mock()
+            spec.placement.filter_matching_hostspecs.return_value = ['host1', 'host2']
+            cephadm_module.cache.facts = facts
+            assert cephadm_module._validate_tunedprofile_settings(spec) == expected_value
+
+    @mock.patch("cephadm.serve.CephadmServe._run_cephadm", _run_cephadm('[]'))
+    def test_tuned_profiles_validation(self, cephadm_module):
+        with with_host(cephadm_module, 'test'):
+
+            with pytest.raises(OrchestratorError, match="^Invalid placement specification.+"):
+                spec = mock.Mock()
+                spec.settings = {'a': 'b'}
+                spec.placement = PlacementSpec(hosts=[])
+                cephadm_module._validate_tuned_profile_spec(spec)
+
+            with pytest.raises(OrchestratorError, match="Invalid spec: settings section cannot be empty."):
+                spec = mock.Mock()
+                spec.settings = {}
+                spec.placement = PlacementSpec(hosts=['host1', 'host2'])
+                cephadm_module._validate_tuned_profile_spec(spec)
+
+            with pytest.raises(OrchestratorError, match="^Placement 'count' field is no supported .+"):
+                spec = mock.Mock()
+                spec.settings = {'a': 'b'}
+                spec.placement = PlacementSpec(count=1)
+                cephadm_module._validate_tuned_profile_spec(spec)
+
+            with pytest.raises(OrchestratorError, match="^Placement 'count_per_host' field is no supported .+"):
+                spec = mock.Mock()
+                spec.settings = {'a': 'b'}
+                spec.placement = PlacementSpec(count_per_host=1, label='foo')
+                cephadm_module._validate_tuned_profile_spec(spec)
+
+            with pytest.raises(OrchestratorError, match="^Found invalid host"):
+                spec = mock.Mock()
+                spec.settings = {'a': 'b'}
+                spec.placement = PlacementSpec(hosts=['host1', 'host2'])
+                cephadm_module.inventory = mock.Mock()
+                cephadm_module.inventory.all_specs = mock.Mock(
+                    return_value=[mock.Mock().hostname, mock.Mock().hostname])
+                cephadm_module._validate_tuned_profile_spec(spec)
index 1c73897cb852734e3080ac31dcd1540b99c98d73..93481553ab5fdb1a82a3034a12ed8e3e911086ca 100644 (file)
@@ -228,3 +228,32 @@ def test_migrate_admin_client_keyring(cephadm_module: CephadmOrchestrator):
     assert cephadm_module.migration_current == LAST_MIGRATION
 
     assert cephadm_module.keys.keys['client.admin'].placement.label == '_admin'
     assert cephadm_module.migration_current == LAST_MIGRATION
 
     assert cephadm_module.keys.keys['client.admin'].placement.label == '_admin'
+
+
+@mock.patch("cephadm.serve.CephadmServe._run_cephadm", _run_cephadm('[]'))
+def test_migrate_set_sane_value(cephadm_module: CephadmOrchestrator):
+    cephadm_module.migration_current = 0
+    cephadm_module.migration.set_sane_migration_current()
+    assert cephadm_module.migration_current == 0
+
+    cephadm_module.migration_current = LAST_MIGRATION
+    cephadm_module.migration.set_sane_migration_current()
+    assert cephadm_module.migration_current == LAST_MIGRATION
+
+    cephadm_module.migration_current = None
+    cephadm_module.migration.set_sane_migration_current()
+    assert cephadm_module.migration_current == LAST_MIGRATION
+
+    cephadm_module.migration_current = LAST_MIGRATION + 1
+    cephadm_module.migration.set_sane_migration_current()
+    assert cephadm_module.migration_current == 0
+
+    cephadm_module.migration_current = None
+    ongoing = cephadm_module.migration.is_migration_ongoing()
+    assert not ongoing
+    assert cephadm_module.migration_current == LAST_MIGRATION
+
+    cephadm_module.migration_current = LAST_MIGRATION + 1
+    ongoing = cephadm_module.migration.is_migration_ongoing()
+    assert ongoing
+    assert cephadm_module.migration_current == 0
index 98dcc850f20505fb5b88723bf798b25d8c1a8235..2f04fd98b5bb6367659d41db615b8873a84cb075 100644 (file)
@@ -16,9 +16,12 @@ from cephadm.services.monitoring import GrafanaService, AlertmanagerService, Pro
     NodeExporterService, LokiService, PromtailService
 from cephadm.module import CephadmOrchestrator
 from ceph.deployment.service_spec import IscsiServiceSpec, MonitoringSpec, AlertManagerSpec, \
     NodeExporterService, LokiService, PromtailService
 from cephadm.module import CephadmOrchestrator
 from ceph.deployment.service_spec import IscsiServiceSpec, MonitoringSpec, AlertManagerSpec, \
-    ServiceSpec, RGWSpec, GrafanaSpec, SNMPGatewaySpec, IngressSpec, PlacementSpec
+    ServiceSpec, RGWSpec, GrafanaSpec, SNMPGatewaySpec, IngressSpec, PlacementSpec, \
+    PrometheusSpec, CephExporterSpec, NFSServiceSpec
 from cephadm.tests.fixtures import with_host, with_service, _run_cephadm, async_side_effect
 
 from cephadm.tests.fixtures import with_host, with_service, _run_cephadm, async_side_effect
 
+from ceph.utils import datetime_now
+
 from orchestrator import OrchestratorError
 from orchestrator._interface import DaemonDescription
 
 from orchestrator import OrchestratorError
 from orchestrator._interface import DaemonDescription
 
@@ -44,6 +47,8 @@ class FakeMgr:
         if prefix == 'set-cmd':
             self.config = cmd_dict.get('value')
             return 0, 'value set', ''
         if prefix == 'set-cmd':
             self.config = cmd_dict.get('value')
             return 0, 'value set', ''
+        if prefix in ['auth get']:
+            return 0, '[foo]\nkeyring = asdf\n', ''
         return -1, '', 'error'
 
     def get_minimal_ceph_conf(self) -> str:
         return -1, '', 'error'
 
     def get_minimal_ceph_conf(self) -> str:
@@ -184,9 +189,12 @@ class TestISCSIService:
         expected_call2 = call({'prefix': 'auth caps',
                                'entity': 'client.iscsi.a',
                                'caps': expected_caps})
         expected_call2 = call({'prefix': 'auth caps',
                                'entity': 'client.iscsi.a',
                                'caps': expected_caps})
+        expected_call3 = call({'prefix': 'auth get',
+                               'entity': 'client.iscsi.a'})
 
         assert expected_call in self.mgr.mon_command.mock_calls
         assert expected_call2 in self.mgr.mon_command.mock_calls
 
         assert expected_call in self.mgr.mon_command.mock_calls
         assert expected_call2 in self.mgr.mon_command.mock_calls
+        assert expected_call3 in self.mgr.mon_command.mock_calls
 
     @patch('cephadm.utils.resolve_ip')
     def test_iscsi_dashboard_config(self, mock_resolve_ip):
 
     @patch('cephadm.utils.resolve_ip')
     def test_iscsi_dashboard_config(self, mock_resolve_ip):
@@ -236,6 +244,54 @@ class TestISCSIService:
 
         assert dashboard_expected_call in self.mgr.check_mon_command.mock_calls
 
 
         assert dashboard_expected_call in self.mgr.check_mon_command.mock_calls
 
+    @patch("cephadm.serve.CephadmServe._run_cephadm")
+    @patch("cephadm.module.CephadmOrchestrator.get_unique_name")
+    @patch("cephadm.services.iscsi.IscsiService.get_trusted_ips")
+    def test_iscsi_config(self, _get_trusted_ips, _get_name, _run_cephadm, cephadm_module: CephadmOrchestrator):
+
+        iscsi_daemon_id = 'testpool.test.qwert'
+        trusted_ips = '1.1.1.1,2.2.2.2'
+        api_port = 3456
+        api_user = 'test-user'
+        api_password = 'test-password'
+        pool = 'testpool'
+        _run_cephadm.side_effect = async_side_effect(('{}', '', 0))
+        _get_name.return_value = iscsi_daemon_id
+        _get_trusted_ips.return_value = trusted_ips
+
+        iscsi_gateway_conf = f"""# This file is generated by cephadm.
+[config]
+cluster_client_name = client.iscsi.{iscsi_daemon_id}
+pool = {pool}
+trusted_ip_list = {trusted_ips}
+minimum_gateways = 1
+api_port = {api_port}
+api_user = {api_user}
+api_password = {api_password}
+api_secure = False
+log_to_stderr = True
+log_to_stderr_prefix = debug
+log_to_file = False"""
+
+        with with_host(cephadm_module, 'test'):
+            with with_service(cephadm_module, IscsiServiceSpec(service_id=pool,
+                                                               api_port=api_port,
+                                                               api_user=api_user,
+                                                               api_password=api_password,
+                                                               pool=pool,
+                                                               trusted_ip_list=trusted_ips)):
+                _run_cephadm.assert_called_with(
+                    'test',
+                    f'iscsi.{iscsi_daemon_id}',
+                    'deploy',
+                    [
+                        '--name', f'iscsi.{iscsi_daemon_id}',
+                        '--meta-json', f'{"{"}"service_name": "iscsi.{pool}", "ports": [{api_port}], "ip": null, "deployed_by": [], "rank": null, "rank_generation": null, "extra_container_args": null, "extra_entrypoint_args": null{"}"}',
+                        '--config-json', '-', '--tcp-ports', '3456'
+                    ],
+                    stdin=json.dumps({"config": "", "keyring": "[client.iscsi.testpool.test.qwert]\nkey = None\n", "files": {"iscsi-gateway.cfg": iscsi_gateway_conf}}),
+                    image='')
+
 
 class TestMonitoring:
     def _get_config(self, url: str) -> str:
 
 class TestMonitoring:
     def _get_config(self, url: str) -> str:
@@ -282,7 +338,7 @@ class TestMonitoring:
                     'deploy',
                     [
                         '--name', 'alertmanager.test',
                     'deploy',
                     [
                         '--name', 'alertmanager.test',
-                        '--meta-json', '{"service_name": "alertmanager", "ports": [9093, 9094], "ip": null, "deployed_by": [], "rank": null, "rank_generation": null, "extra_container_args": null}',
+                        '--meta-json', '{"service_name": "alertmanager", "ports": [9093, 9094], "ip": null, "deployed_by": [], "rank": null, "rank_generation": null, "extra_container_args": null, "extra_entrypoint_args": null}',
                         '--config-json', '-', '--tcp-ports', '9093 9094'
                     ],
                     stdin=json.dumps({"files": {"alertmanager.yml": y}, "peers": []}),
                         '--config-json', '-', '--tcp-ports', '9093 9094'
                     ],
                     stdin=json.dumps({"files": {"alertmanager.yml": y}, "peers": []}),
@@ -306,7 +362,7 @@ class TestMonitoring:
                     [
                         '--name', 'alertmanager.test',
                         '--meta-json',
                     [
                         '--name', 'alertmanager.test',
                         '--meta-json',
-                        '{"service_name": "alertmanager", "ports": [9093, 9094], "ip": null, "deployed_by": [], "rank": null, "rank_generation": null, "extra_container_args": null}',
+                        '{"service_name": "alertmanager", "ports": [9093, 9094], "ip": null, "deployed_by": [], "rank": null, "rank_generation": null, "extra_container_args": null, "extra_entrypoint_args": null}',
                         '--config-json', '-', '--tcp-ports', '9093 9094'
                     ],
                     stdin=json.dumps({"files": {"alertmanager.yml": y}, "peers": []}),
                         '--config-json', '-', '--tcp-ports', '9093 9094'
                     ],
                     stdin=json.dumps({"files": {"alertmanager.yml": y}, "peers": []}),
@@ -332,7 +388,7 @@ class TestMonitoring:
                     [
                         '--name', 'alertmanager.test',
                         '--meta-json',
                     [
                         '--name', 'alertmanager.test',
                         '--meta-json',
-                        '{"service_name": "alertmanager", "ports": [9093, 9094], "ip": null, "deployed_by": [], "rank": null, "rank_generation": null, "extra_container_args": null}',
+                        '{"service_name": "alertmanager", "ports": [9093, 9094], "ip": null, "deployed_by": [], "rank": null, "rank_generation": null, "extra_container_args": null, "extra_entrypoint_args": null}',
                         '--config-json', '-', '--tcp-ports', '9093 9094'
                     ],
                     stdin=json.dumps({"files": {"alertmanager.yml": y}, "peers": []}),
                         '--config-json', '-', '--tcp-ports', '9093 9094'
                     ],
                     stdin=json.dumps({"files": {"alertmanager.yml": y}, "peers": []}),
@@ -354,7 +410,7 @@ class TestMonitoring:
                     'deploy',
                     [
                         '--name', 'alertmanager.test',
                     'deploy',
                     [
                         '--name', 'alertmanager.test',
-                        '--meta-json', '{"service_name": "alertmanager", "ports": [9093, 9094], "ip": null, "deployed_by": [], "rank": null, "rank_generation": null, "extra_container_args": null}',
+                        '--meta-json', '{"service_name": "alertmanager", "ports": [9093, 9094], "ip": null, "deployed_by": [], "rank": null, "rank_generation": null, "extra_container_args": null, "extra_entrypoint_args": null}',
                         '--config-json', '-', '--tcp-ports', '9093 9094'
                     ],
                     stdin=json.dumps({"files": {"alertmanager.yml": y}, "peers": []}),
                         '--config-json', '-', '--tcp-ports', '9093 9094'
                     ],
                     stdin=json.dumps({"files": {"alertmanager.yml": y}, "peers": []}),
@@ -379,7 +435,7 @@ class TestMonitoring:
                     [
                         '--name', 'alertmanager.test',
                         '--meta-json',
                     [
                         '--name', 'alertmanager.test',
                         '--meta-json',
-                        '{"service_name": "alertmanager", "ports": [9093, 9094], "ip": null, "deployed_by": [], "rank": null, "rank_generation": null, "extra_container_args": null}',
+                        '{"service_name": "alertmanager", "ports": [9093, 9094], "ip": null, "deployed_by": [], "rank": null, "rank_generation": null, "extra_container_args": null, "extra_entrypoint_args": null}',
                         '--config-json', '-', '--tcp-ports', '9093 9094'
                     ],
                     stdin=json.dumps({"files": {"alertmanager.yml": y}, "peers": []}),
                         '--config-json', '-', '--tcp-ports', '9093 9094'
                     ],
                     stdin=json.dumps({"files": {"alertmanager.yml": y}, "peers": []}),
@@ -391,7 +447,8 @@ class TestMonitoring:
 
         with with_host(cephadm_module, 'test'):
             with with_service(cephadm_module, MonitoringSpec('node-exporter')) as _, \
 
         with with_host(cephadm_module, 'test'):
             with with_service(cephadm_module, MonitoringSpec('node-exporter')) as _, \
-                    with_service(cephadm_module, MonitoringSpec('prometheus')) as _:
+                    with_service(cephadm_module, CephExporterSpec('ceph-exporter')) as _, \
+                    with_service(cephadm_module, PrometheusSpec('prometheus')) as _:
 
                 y = dedent("""
                 # This file is generated by cephadm.
 
                 y = dedent("""
                 # This file is generated by cephadm.
@@ -413,6 +470,13 @@ class TestMonitoring:
                       labels:
                         instance: 'test'
 
                       labels:
                         instance: 'test'
 
+
+                  - job_name: 'ceph-exporter'
+                    honor_labels: true
+                    static_configs:
+                    - targets: ['[1::4]:9926']
+                      labels:
+                        instance: 'test'
                 """).lstrip()
 
                 _run_cephadm.assert_called_with(
                 """).lstrip()
 
                 _run_cephadm.assert_called_with(
@@ -422,12 +486,15 @@ class TestMonitoring:
                     [
                         '--name', 'prometheus.test',
                         '--meta-json',
                     [
                         '--name', 'prometheus.test',
                         '--meta-json',
-                        '{"service_name": "prometheus", "ports": [9095], "ip": null, "deployed_by": [], "rank": null, "rank_generation": null, "extra_container_args": null}',
+                        ('{"service_name": "prometheus", "ports": [9095], "ip": null, "deployed_by": [], "rank": null, '
+                         '"rank_generation": null, "extra_container_args": null, "extra_entrypoint_args": null}'),
                         '--config-json', '-',
                         '--tcp-ports', '9095'
                     ],
                     stdin=json.dumps({"files": {"prometheus.yml": y,
                         '--config-json', '-',
                         '--tcp-ports', '9095'
                     ],
                     stdin=json.dumps({"files": {"prometheus.yml": y,
-                                                "/etc/prometheus/alerting/custom_alerts.yml": ""}}),
+                                                "/etc/prometheus/alerting/custom_alerts.yml": ""},
+                                      'retention_time': '15d',
+                                      'retention_size': '0'}),
                     image='')
 
     @patch("cephadm.serve.CephadmServe._run_cephadm")
                     image='')
 
     @patch("cephadm.serve.CephadmServe._run_cephadm")
@@ -474,7 +541,8 @@ class TestMonitoring:
                     [
                         '--name', 'loki.test',
                         '--meta-json',
                     [
                         '--name', 'loki.test',
                         '--meta-json',
-                        '{"service_name": "loki", "ports": [3100], "ip": null, "deployed_by": [], "rank": null, "rank_generation": null, "extra_container_args": null}',
+                        ('{"service_name": "loki", "ports": [3100], "ip": null, "deployed_by": [], "rank": null, '
+                         '"rank_generation": null, "extra_container_args": null, "extra_entrypoint_args": null}'),
                         '--config-json', '-',
                         '--tcp-ports', '3100'
                     ],
                         '--config-json', '-',
                         '--tcp-ports', '3100'
                     ],
@@ -515,7 +583,8 @@ class TestMonitoring:
                     [
                         '--name', 'promtail.test',
                         '--meta-json',
                     [
                         '--name', 'promtail.test',
                         '--meta-json',
-                        '{"service_name": "promtail", "ports": [9080], "ip": null, "deployed_by": [], "rank": null, "rank_generation": null, "extra_container_args": null}',
+                        ('{"service_name": "promtail", "ports": [9080], "ip": null, "deployed_by": [], "rank": null, '
+                         '"rank_generation": null, "extra_container_args": null, "extra_entrypoint_args": null}'),
                         '--config-json', '-',
                         '--tcp-ports', '9080'
                     ],
                         '--config-json', '-',
                         '--tcp-ports', '9080'
                     ],
@@ -532,7 +601,7 @@ class TestMonitoring:
             cephadm_module.set_store("test/grafana_crt", "c")
             cephadm_module.set_store("test/grafana_key", "k")
             with with_service(
             cephadm_module.set_store("test/grafana_crt", "c")
             cephadm_module.set_store("test/grafana_key", "k")
             with with_service(
-                cephadm_module, MonitoringSpec("prometheus")
+                cephadm_module, PrometheusSpec("prometheus")
             ) as _, with_service(cephadm_module, ServiceSpec("mgr")) as _, with_service(
                 cephadm_module, GrafanaSpec("grafana")
             ) as _:
             ) as _, with_service(cephadm_module, ServiceSpec("mgr")) as _, with_service(
                 cephadm_module, GrafanaSpec("grafana")
             ) as _:
@@ -601,7 +670,8 @@ class TestMonitoring:
                     [
                         '--name', 'grafana.test',
                         '--meta-json',
                     [
                         '--name', 'grafana.test',
                         '--meta-json',
-                        '{"service_name": "grafana", "ports": [3000], "ip": null, "deployed_by": [], "rank": null, "rank_generation": null, "extra_container_args": null}',
+                        ('{"service_name": "grafana", "ports": [3000], "ip": null, "deployed_by": [], "rank": null, '
+                         '"rank_generation": null, "extra_container_args": null, "extra_entrypoint_args": null}'),
                         '--config-json', '-', '--tcp-ports', '3000'],
                     stdin=json.dumps({"files": files}),
                     image='')
                         '--config-json', '-', '--tcp-ports', '3000'],
                     stdin=json.dumps({"files": files}),
                     image='')
@@ -681,7 +751,8 @@ spec:
                     _run_cephadm.assert_called_with(
                         'test', 'alertmanager.test', 'deploy', [
                             '--name', 'alertmanager.test',
                     _run_cephadm.assert_called_with(
                         'test', 'alertmanager.test', 'deploy', [
                             '--name', 'alertmanager.test',
-                            '--meta-json', '{"service_name": "alertmanager", "ports": [4200, 9094], "ip": null, "deployed_by": [], "rank": null, "rank_generation": null, "extra_container_args": null}',
+                            '--meta-json', ('{"service_name": "alertmanager", "ports": [4200, 9094], "ip": null, "deployed_by": [], "rank": null, '
+                                            '"rank_generation": null, "extra_container_args": null, "extra_entrypoint_args": null}'),
                             '--config-json', '-',
                             '--tcp-ports', '4200 9094',
                             '--reconfig'
                             '--config-json', '-',
                             '--tcp-ports', '4200 9094',
                             '--reconfig'
@@ -752,7 +823,8 @@ class TestSNMPGateway:
                     [
                         '--name', 'snmp-gateway.test',
                         '--meta-json',
                     [
                         '--name', 'snmp-gateway.test',
                         '--meta-json',
-                        '{"service_name": "snmp-gateway", "ports": [9464], "ip": null, "deployed_by": [], "rank": null, "rank_generation": null, "extra_container_args": null}',
+                        ('{"service_name": "snmp-gateway", "ports": [9464], "ip": null, "deployed_by": [], "rank": null, '
+                         '"rank_generation": null, "extra_container_args": null, "extra_entrypoint_args": null}'),
                         '--config-json', '-',
                         '--tcp-ports', '9464'
                     ],
                         '--config-json', '-',
                         '--tcp-ports', '9464'
                     ],
@@ -787,7 +859,8 @@ class TestSNMPGateway:
                     [
                         '--name', 'snmp-gateway.test',
                         '--meta-json',
                     [
                         '--name', 'snmp-gateway.test',
                         '--meta-json',
-                        '{"service_name": "snmp-gateway", "ports": [9465], "ip": null, "deployed_by": [], "rank": null, "rank_generation": null, "extra_container_args": null}',
+                        ('{"service_name": "snmp-gateway", "ports": [9465], "ip": null, "deployed_by": [], "rank": null, '
+                         '"rank_generation": null, "extra_container_args": null, "extra_entrypoint_args": null}'),
                         '--config-json', '-',
                         '--tcp-ports', '9465'
                     ],
                         '--config-json', '-',
                         '--tcp-ports', '9465'
                     ],
@@ -826,7 +899,8 @@ class TestSNMPGateway:
                     [
                         '--name', 'snmp-gateway.test',
                         '--meta-json',
                     [
                         '--name', 'snmp-gateway.test',
                         '--meta-json',
-                        '{"service_name": "snmp-gateway", "ports": [9464], "ip": null, "deployed_by": [], "rank": null, "rank_generation": null, "extra_container_args": null}',
+                        ('{"service_name": "snmp-gateway", "ports": [9464], "ip": null, "deployed_by": [], "rank": null, '
+                         '"rank_generation": null, "extra_container_args": null, "extra_entrypoint_args": null}'),
                         '--config-json', '-',
                         '--tcp-ports', '9464'
                     ],
                         '--config-json', '-',
                         '--tcp-ports', '9464'
                     ],
@@ -870,7 +944,8 @@ class TestSNMPGateway:
                     [
                         '--name', 'snmp-gateway.test',
                         '--meta-json',
                     [
                         '--name', 'snmp-gateway.test',
                         '--meta-json',
-                        '{"service_name": "snmp-gateway", "ports": [9464], "ip": null, "deployed_by": [], "rank": null, "rank_generation": null, "extra_container_args": null}',
+                        ('{"service_name": "snmp-gateway", "ports": [9464], "ip": null, "deployed_by": [], "rank": null, '
+                         '"rank_generation": null, "extra_container_args": null, "extra_entrypoint_args": null}'),
                         '--config-json', '-',
                         '--tcp-ports', '9464'
                     ],
                         '--config-json', '-',
                         '--tcp-ports', '9464'
                     ],
@@ -881,6 +956,122 @@ class TestSNMPGateway:
 
 class TestIngressService:
 
 
 class TestIngressService:
 
+    @patch("cephadm.inventory.Inventory.get_addr")
+    @patch("cephadm.utils.resolve_ip")
+    @patch("cephadm.inventory.HostCache.get_daemons_by_service")
+    @patch("cephadm.serve.CephadmServe._run_cephadm")
+    def test_ingress_config_nfs_multiple_nfs_same_rank(self, _run_cephadm, _get_daemons_by_service, _resolve_ip, _get_addr, cephadm_module: CephadmOrchestrator):
+        _run_cephadm.side_effect = async_side_effect(('{}', '', 0))
+
+        def fake_resolve_ip(hostname: str) -> str:
+            if hostname == 'host1':
+                return '192.168.122.111'
+            elif hostname == 'host2':
+                return '192.168.122.222'
+            else:
+                return 'xxx.xxx.xxx.xxx'
+        _resolve_ip.side_effect = fake_resolve_ip
+
+        def fake_get_addr(hostname: str) -> str:
+            return hostname
+        _get_addr.side_effect = fake_get_addr
+
+        nfs_service = NFSServiceSpec(service_id="foo", placement=PlacementSpec(count=1, hosts=['host1', 'host2']),
+                                     port=12049)
+
+        ispec = IngressSpec(service_type='ingress',
+                            service_id='nfs.foo',
+                            backend_service='nfs.foo',
+                            frontend_port=2049,
+                            monitor_port=9049,
+                            virtual_ip='192.168.122.100/24',
+                            monitor_user='admin',
+                            monitor_password='12345',
+                            keepalived_password='12345')
+
+        cephadm_module.spec_store._specs = {
+            'nfs.foo': nfs_service,
+            'ingress.nfs.foo': ispec
+        }
+        cephadm_module.spec_store.spec_created = {
+            'nfs.foo': datetime_now(),
+            'ingress.nfs.foo': datetime_now()
+        }
+
+        # in both test cases we'll do here, we want only the ip
+        # for the host1 nfs daemon as we'll end up giving that
+        # one higher rank_generation but the same rank as the one
+        # on host2
+        haproxy_expected_conf = {
+            'files':
+                {
+                    'haproxy.cfg':
+                        '# This file is generated by cephadm.\n'
+                        'global\n'
+                        '    log         127.0.0.1 local2\n'
+                        '    chroot      /var/lib/haproxy\n'
+                        '    pidfile     /var/lib/haproxy/haproxy.pid\n'
+                        '    maxconn     8000\n'
+                        '    daemon\n'
+                        '    stats socket /var/lib/haproxy/stats\n\n'
+                        'defaults\n'
+                        '    mode                    tcp\n'
+                        '    log                     global\n'
+                        '    timeout queue           1m\n'
+                        '    timeout connect         10s\n'
+                        '    timeout client          1m\n'
+                        '    timeout server          1m\n'
+                        '    timeout check           10s\n'
+                        '    maxconn                 8000\n\n'
+                        'frontend stats\n'
+                        '    mode http\n'
+                        '    bind 192.168.122.100:9049\n'
+                        '    bind localhost:9049\n'
+                        '    stats enable\n'
+                        '    stats uri /stats\n'
+                        '    stats refresh 10s\n'
+                        '    stats auth admin:12345\n'
+                        '    http-request use-service prometheus-exporter if { path /metrics }\n'
+                        '    monitor-uri /health\n\n'
+                        'frontend frontend\n'
+                        '    bind 192.168.122.100:2049\n'
+                        '    default_backend backend\n\n'
+                        'backend backend\n'
+                        '    mode        tcp\n'
+                        '    balance     source\n'
+                        '    hash-type   consistent\n'
+                        '    server nfs.foo.0 192.168.122.111:12049\n'
+                }
+        }
+
+        # verify we get the same cfg regardless of the order in which the nfs daemons are returned
+        # in this case both nfs are rank 0, so it should only take the one with rank_generation 1 a.k.a
+        # the one on host1
+        nfs_daemons = [
+            DaemonDescription(daemon_type='nfs', daemon_id='foo.0.1.host1.qwerty', hostname='host1', rank=0, rank_generation=1, ports=[12049]),
+            DaemonDescription(daemon_type='nfs', daemon_id='foo.0.0.host2.abcdef', hostname='host2', rank=0, rank_generation=0, ports=[12049])
+        ]
+        _get_daemons_by_service.return_value = nfs_daemons
+
+        haproxy_generated_conf = cephadm_module.cephadm_services['ingress'].haproxy_generate_config(
+            CephadmDaemonDeploySpec(host='host1', daemon_id='ingress', service_name=ispec.service_name()))
+
+        assert haproxy_generated_conf[0] == haproxy_expected_conf
+
+        # swapping order now, should still pick out the one with the higher rank_generation
+        # in this case both nfs are rank 0, so it should only take the one with rank_generation 1 a.k.a
+        # the one on host1
+        nfs_daemons = [
+            DaemonDescription(daemon_type='nfs', daemon_id='foo.0.0.host2.abcdef', hostname='host2', rank=0, rank_generation=0, ports=[12049]),
+            DaemonDescription(daemon_type='nfs', daemon_id='foo.0.1.host1.qwerty', hostname='host1', rank=0, rank_generation=1, ports=[12049])
+        ]
+        _get_daemons_by_service.return_value = nfs_daemons
+
+        haproxy_generated_conf = cephadm_module.cephadm_services['ingress'].haproxy_generate_config(
+            CephadmDaemonDeploySpec(host='host1', daemon_id='ingress', service_name=ispec.service_name()))
+
+        assert haproxy_generated_conf[0] == haproxy_expected_conf
+
     @patch("cephadm.serve.CephadmServe._run_cephadm")
     def test_ingress_config(self, _run_cephadm, cephadm_module: CephadmOrchestrator):
         _run_cephadm.side_effect = async_side_effect(('{}', '', 0))
     @patch("cephadm.serve.CephadmServe._run_cephadm")
     def test_ingress_config(self, _run_cephadm, cephadm_module: CephadmOrchestrator):
         _run_cephadm.side_effect = async_side_effect(('{}', '', 0))
@@ -976,8 +1167,8 @@ class TestIngressService:
                                 'timeout connect         5s\n    '
                                 'timeout http-request    1s\n    '
                                 'timeout http-keep-alive 5s\n    '
                                 'timeout connect         5s\n    '
                                 'timeout http-request    1s\n    '
                                 'timeout http-keep-alive 5s\n    '
-                                'timeout client          1s\n    '
-                                'timeout server          1s\n    '
+                                'timeout client          30s\n    '
+                                'timeout server          30s\n    '
                                 'timeout check           5s\n    '
                                 'maxconn                 8000\n'
                                 '\nfrontend stats\n    '
                                 'timeout check           5s\n    '
                                 'maxconn                 8000\n'
                                 '\nfrontend stats\n    '
@@ -1004,6 +1195,131 @@ class TestIngressService:
 
                 assert haproxy_generated_conf[0] == haproxy_expected_conf
 
 
                 assert haproxy_generated_conf[0] == haproxy_expected_conf
 
+    @patch("cephadm.serve.CephadmServe._run_cephadm")
+    def test_ingress_config_ssl_rgw(self, _run_cephadm, cephadm_module: CephadmOrchestrator):
+        _run_cephadm.side_effect = async_side_effect(('{}', '', 0))
+
+        with with_host(cephadm_module, 'test'):
+            cephadm_module.cache.update_host_networks('test', {
+                '1.2.3.0/24': {
+                    'if0': ['1.2.3.4/32']
+                }
+            })
+
+            # the ingress backend
+            s = RGWSpec(service_id="foo", placement=PlacementSpec(count=1),
+                        rgw_frontend_type='beast', rgw_frontend_port=443, ssl=True)
+
+            ispec = IngressSpec(service_type='ingress',
+                                service_id='test',
+                                backend_service='rgw.foo',
+                                frontend_port=8089,
+                                monitor_port=8999,
+                                monitor_user='admin',
+                                monitor_password='12345',
+                                keepalived_password='12345',
+                                virtual_interface_networks=['1.2.3.0/24'],
+                                virtual_ip="1.2.3.4/32")
+            with with_service(cephadm_module, s) as _, with_service(cephadm_module, ispec) as _:
+                # generate the keepalived conf based on the specified spec
+                keepalived_generated_conf = cephadm_module.cephadm_services['ingress'].keepalived_generate_config(
+                    CephadmDaemonDeploySpec(host='test', daemon_id='ingress', service_name=ispec.service_name()))
+
+                keepalived_expected_conf = {
+                    'files':
+                        {
+                            'keepalived.conf':
+                                '# This file is generated by cephadm.\n'
+                                'vrrp_script check_backend {\n    '
+                                'script "/usr/bin/curl http://localhost:8999/health"\n    '
+                                'weight -20\n    '
+                                'interval 2\n    '
+                                'rise 2\n    '
+                                'fall 2\n}\n\n'
+                                'vrrp_instance VI_0 {\n  '
+                                'state MASTER\n  '
+                                'priority 100\n  '
+                                'interface if0\n  '
+                                'virtual_router_id 50\n  '
+                                'advert_int 1\n  '
+                                'authentication {\n      '
+                                'auth_type PASS\n      '
+                                'auth_pass 12345\n  '
+                                '}\n  '
+                                'unicast_src_ip 1::4\n  '
+                                'unicast_peer {\n  '
+                                '}\n  '
+                                'virtual_ipaddress {\n    '
+                                '1.2.3.4/32 dev if0\n  '
+                                '}\n  '
+                                'track_script {\n      '
+                                'check_backend\n  }\n'
+                                '}\n'
+                        }
+                }
+
+                # check keepalived config
+                assert keepalived_generated_conf[0] == keepalived_expected_conf
+
+                # generate the haproxy conf based on the specified spec
+                haproxy_generated_conf = cephadm_module.cephadm_services['ingress'].haproxy_generate_config(
+                    CephadmDaemonDeploySpec(host='test', daemon_id='ingress', service_name=ispec.service_name()))
+
+                haproxy_expected_conf = {
+                    'files':
+                        {
+                            'haproxy.cfg':
+                                '# This file is generated by cephadm.'
+                                '\nglobal\n    log         '
+                                '127.0.0.1 local2\n    '
+                                'chroot      /var/lib/haproxy\n    '
+                                'pidfile     /var/lib/haproxy/haproxy.pid\n    '
+                                'maxconn     8000\n    '
+                                'daemon\n    '
+                                'stats socket /var/lib/haproxy/stats\n'
+                                '\ndefaults\n    '
+                                'mode                    http\n    '
+                                'log                     global\n    '
+                                'option                  httplog\n    '
+                                'option                  dontlognull\n    '
+                                'option http-server-close\n    '
+                                'option forwardfor       except 127.0.0.0/8\n    '
+                                'option                  redispatch\n    '
+                                'retries                 3\n    '
+                                'timeout queue           20s\n    '
+                                'timeout connect         5s\n    '
+                                'timeout http-request    1s\n    '
+                                'timeout http-keep-alive 5s\n    '
+                                'timeout client          30s\n    '
+                                'timeout server          30s\n    '
+                                'timeout check           5s\n    '
+                                'maxconn                 8000\n'
+                                '\nfrontend stats\n    '
+                                'mode http\n    '
+                                'bind 1.2.3.4:8999\n    '
+                                'bind localhost:8999\n    '
+                                'stats enable\n    '
+                                'stats uri /stats\n    '
+                                'stats refresh 10s\n    '
+                                'stats auth admin:12345\n    '
+                                'http-request use-service prometheus-exporter if { path /metrics }\n    '
+                                'monitor-uri /health\n'
+                                '\nfrontend frontend\n    '
+                                'bind 1.2.3.4:8089\n    '
+                                'default_backend backend\n\n'
+                                'backend backend\n    '
+                                'option forwardfor\n    '
+                                'default-server ssl\n    '
+                                'default-server verify none\n    '
+                                'balance static-rr\n    '
+                                'option httpchk HEAD / HTTP/1.0\n    '
+                                'server '
+                                + haproxy_generated_conf[1][0] + ' 1::4:443 check weight 100\n'
+                        }
+                }
+
+                assert haproxy_generated_conf[0] == haproxy_expected_conf
+
     @patch("cephadm.serve.CephadmServe._run_cephadm")
     def test_ingress_config_multi_vips(self, _run_cephadm, cephadm_module: CephadmOrchestrator):
         _run_cephadm.side_effect = async_side_effect(('{}', '', 0))
     @patch("cephadm.serve.CephadmServe._run_cephadm")
     def test_ingress_config_multi_vips(self, _run_cephadm, cephadm_module: CephadmOrchestrator):
         _run_cephadm.side_effect = async_side_effect(('{}', '', 0))
@@ -1100,8 +1416,8 @@ class TestIngressService:
                                 'timeout connect         5s\n    '
                                 'timeout http-request    1s\n    '
                                 'timeout http-keep-alive 5s\n    '
                                 'timeout connect         5s\n    '
                                 'timeout http-request    1s\n    '
                                 'timeout http-keep-alive 5s\n    '
-                                'timeout client          1s\n    '
-                                'timeout server          1s\n    '
+                                'timeout client          30s\n    '
+                                'timeout server          30s\n    '
                                 'timeout check           5s\n    '
                                 'maxconn                 8000\n'
                                 '\nfrontend stats\n    '
                                 'timeout check           5s\n    '
                                 'maxconn                 8000\n'
                                 '\nfrontend stats\n    '
index 3282295e5ca93d68348e253ed0f389b34c9cf15d..4197d8d7ef0ede87bbdf529aa62d25cc06e9b3e4 100644 (file)
@@ -38,7 +38,7 @@ class TestWithSSH:
                 asyncssh_connect.side_effect = ConnectionLost('reason')
                 code, out, err = cephadm_module.check_host('test')
                 assert out == ''
                 asyncssh_connect.side_effect = ConnectionLost('reason')
                 code, out, err = cephadm_module.check_host('test')
                 assert out == ''
-                assert "Host 'test' not found" in err
+                assert "Failed to connect to test at address (1::4)" in err
 
                 out = wait(cephadm_module, cephadm_module.get_hosts())[0].to_json()
                 assert out == HostSpec('test', '1::4', status='Offline').to_json()
 
                 out = wait(cephadm_module, cephadm_module.get_hosts())[0].to_json()
                 assert out == HostSpec('test', '1::4', status='Offline').to_json()
index 1521b01105231d6b92cbc4404f5e91f076c11832..38a3a390745e1c73d94f2d1619fdb14504d4a00f 100644 (file)
@@ -56,6 +56,7 @@ class FakeMgr:
         self.tuned_profiles.profiles = profiles
         self.ssh = SSHManager(self)
         self.offline_hosts = []
         self.tuned_profiles.profiles = profiles
         self.ssh = SSHManager(self)
         self.offline_hosts = []
+        self.log_refresh_metadata = False
 
     def set_store(self, what: str, value: str):
         raise SaveError(f'{what}: {value}')
 
     def set_store(self, what: str, value: str):
         raise SaveError(f'{what}: {value}')
@@ -138,7 +139,7 @@ class TestTunedProfiles:
         tp = TunedProfileUtils(mgr)
         tp._remove_stray_tuned_profiles('a', self.profiles_to_calls(tp, [self.tspec1, self.tspec2]))
         calls = [
         tp = TunedProfileUtils(mgr)
         tp._remove_stray_tuned_profiles('a', self.profiles_to_calls(tp, [self.tspec1, self.tspec2]))
         calls = [
-            mock.call('a', ['ls', SYSCTL_DIR]),
+            mock.call('a', ['ls', SYSCTL_DIR], log_command=False),
             mock.call('a', ['rm', '-f', f'{SYSCTL_DIR}/p3-cephadm-tuned-profile.conf']),
             mock.call('a', ['rm', '-f', f'{SYSCTL_DIR}/who-cephadm-tuned-profile.conf']),
             mock.call('a', ['sysctl', '--system'])
             mock.call('a', ['rm', '-f', f'{SYSCTL_DIR}/p3-cephadm-tuned-profile.conf']),
             mock.call('a', ['rm', '-f', f'{SYSCTL_DIR}/who-cephadm-tuned-profile.conf']),
             mock.call('a', ['sysctl', '--system'])
index 608b68f890fcb0d70dde0d88e0c2044a767c994a..107395b93a15bf55c67777bd9808d1856d8fbbe1 100644 (file)
@@ -5,7 +5,8 @@ import pytest
 
 from ceph.deployment.service_spec import PlacementSpec, ServiceSpec
 from cephadm import CephadmOrchestrator
 
 from ceph.deployment.service_spec import PlacementSpec, ServiceSpec
 from cephadm import CephadmOrchestrator
-from cephadm.upgrade import CephadmUpgrade
+from cephadm.upgrade import CephadmUpgrade, UpgradeState
+from cephadm.ssh import HostConnectionError
 from orchestrator import OrchestratorError, DaemonDescription
 from .fixtures import _run_cephadm, wait, with_host, with_service, \
     receive_agent_metadata, async_side_effect
 from orchestrator import OrchestratorError, DaemonDescription
 from .fixtures import _run_cephadm, wait, with_host, with_service, \
     receive_agent_metadata, async_side_effect
@@ -34,6 +35,51 @@ def test_upgrade_start(cephadm_module: CephadmOrchestrator):
                             ) == 'Stopped upgrade to image_id'
 
 
                             ) == 'Stopped upgrade to image_id'
 
 
+@mock.patch("cephadm.serve.CephadmServe._run_cephadm", _run_cephadm('{}'))
+def test_upgrade_start_offline_hosts(cephadm_module: CephadmOrchestrator):
+    with with_host(cephadm_module, 'test'):
+        with with_host(cephadm_module, 'test2'):
+            cephadm_module.offline_hosts = set(['test2'])
+            with pytest.raises(OrchestratorError, match=r"Upgrade aborted - Some host\(s\) are currently offline: {'test2'}"):
+                cephadm_module.upgrade_start('image_id', None)
+            cephadm_module.offline_hosts = set([])  # so remove_host doesn't fail when leaving the with_host block
+
+
+@mock.patch("cephadm.serve.CephadmServe._run_cephadm", _run_cephadm('{}'))
+def test_upgrade_daemons_offline_hosts(cephadm_module: CephadmOrchestrator):
+    with with_host(cephadm_module, 'test'):
+        with with_host(cephadm_module, 'test2'):
+            cephadm_module.upgrade.upgrade_state = UpgradeState('target_image', 0)
+            with mock.patch("cephadm.serve.CephadmServe._run_cephadm", side_effect=HostConnectionError('connection failure reason', 'test2', '192.168.122.1')):
+                _to_upgrade = [(DaemonDescription(daemon_type='crash', daemon_id='test2', hostname='test2'), True)]
+                with pytest.raises(HostConnectionError, match=r"connection failure reason"):
+                    cephadm_module.upgrade._upgrade_daemons(_to_upgrade, 'target_image', ['digest1'])
+
+
+@mock.patch("cephadm.serve.CephadmServe._run_cephadm", _run_cephadm('{}'))
+def test_do_upgrade_offline_hosts(cephadm_module: CephadmOrchestrator):
+    with with_host(cephadm_module, 'test'):
+        with with_host(cephadm_module, 'test2'):
+            cephadm_module.upgrade.upgrade_state = UpgradeState('target_image', 0)
+            cephadm_module.offline_hosts = set(['test2'])
+            with pytest.raises(HostConnectionError, match=r"Host\(s\) were marked offline: {'test2'}"):
+                cephadm_module.upgrade._do_upgrade()
+            cephadm_module.offline_hosts = set([])  # so remove_host doesn't fail when leaving the with_host block
+
+
+@mock.patch("cephadm.serve.CephadmServe._run_cephadm", _run_cephadm('{}'))
+@mock.patch("cephadm.module.CephadmOrchestrator.remove_health_warning")
+def test_upgrade_resume_clear_health_warnings(_rm_health_warning, cephadm_module: CephadmOrchestrator):
+    with with_host(cephadm_module, 'test'):
+        with with_host(cephadm_module, 'test2'):
+            cephadm_module.upgrade.upgrade_state = UpgradeState('target_image', 0, paused=True)
+            _rm_health_warning.return_value = None
+            assert wait(cephadm_module, cephadm_module.upgrade_resume()
+                        ) == 'Resumed upgrade to target_image'
+            calls_list = [mock.call(alert_id) for alert_id in cephadm_module.upgrade.UPGRADE_ERRORS]
+            _rm_health_warning.assert_has_calls(calls_list, any_order=True)
+
+
 @mock.patch("cephadm.serve.CephadmServe._run_cephadm", _run_cephadm('{}'))
 @pytest.mark.parametrize("use_repo_digest",
                          [
 @mock.patch("cephadm.serve.CephadmServe._run_cephadm", _run_cephadm('{}'))
 @pytest.mark.parametrize("use_repo_digest",
                          [
index 3f617956846ba62471702526db38c710a150c27d..19d97f42133f0b9d8e5c723c73fdef8b7a22bff5 100644 (file)
@@ -47,16 +47,39 @@ class TunedProfileUtils():
             self._write_tuned_profiles(host, profiles)
 
     def _remove_stray_tuned_profiles(self, host: str, profiles: List[Dict[str, str]]) -> None:
             self._write_tuned_profiles(host, profiles)
 
     def _remove_stray_tuned_profiles(self, host: str, profiles: List[Dict[str, str]]) -> None:
+        """
+        this function looks at the contents of /etc/sysctl.d/ for profiles we have written
+        that should now be removed. It assumes any file with "-cephadm-tuned-profile.conf" in
+        it is written by us any without that are not. Only files written by us are considered
+        candidates for removal. The "profiles" parameter is a list of dictionaries that map
+        profile names to the file contents to actually be written to the
+        /etc/sysctl.d/<profile-name>-cephadm-tuned-profile.conf. For example
+        [
+            {
+                'profile1': 'setting1: value1\nsetting2: value2'
+            },
+            {
+                'profile2': 'setting3: value3'
+            }
+        ]
+        what we want to end up doing is going through the keys of the dicts and appending
+        -cephadm-tuned-profile.conf to the profile names to build our list of profile files that
+        SHOULD be on the host. Then if we see any file names that don't match this, but
+        DO include "-cephadm-tuned-profile.conf" (implying they're from us), remove them.
+        """
         if host in self.mgr.offline_hosts:
             return
         cmd = ['ls', SYSCTL_DIR]
         if host in self.mgr.offline_hosts:
             return
         cmd = ['ls', SYSCTL_DIR]
-        found_files = self.mgr.ssh.check_execute_command(host, cmd).split('\n')
+        found_files = self.mgr.ssh.check_execute_command(host, cmd, log_command=self.mgr.log_refresh_metadata).split('\n')
         found_files = [s.strip() for s in found_files]
         found_files = [s.strip() for s in found_files]
+        profile_names: List[str] = sum([[*p] for p in profiles], [])  # extract all profiles names
+        profile_names = list(set(profile_names))  # remove duplicates
+        expected_files = [p + '-cephadm-tuned-profile.conf' for p in profile_names]
         updated = False
         for file in found_files:
             if '-cephadm-tuned-profile.conf' not in file:
                 continue
         updated = False
         for file in found_files:
             if '-cephadm-tuned-profile.conf' not in file:
                 continue
-            if not any(file.split('-')[0] in p.keys() for p in profiles):
+            if file not in expected_files:
                 logger.info(f'Removing stray tuned profile file {file}')
                 cmd = ['rm', '-f', f'{SYSCTL_DIR}/{file}']
                 self.mgr.ssh.check_execute_command(host, cmd)
                 logger.info(f'Removing stray tuned profile file {file}')
                 cmd = ['rm', '-f', f'{SYSCTL_DIR}/{file}']
                 self.mgr.ssh.check_execute_command(host, cmd)
index c2cc0aff9775a7429d21eeb4672800d9f8d11439..252d0820de98dfec283eb3cf55e3d4988644c436 100644 (file)
@@ -10,6 +10,7 @@ from cephadm.serve import CephadmServe
 from cephadm.services.cephadmservice import CephadmDaemonDeploySpec
 from cephadm.utils import ceph_release_to_major, name_to_config_section, CEPH_UPGRADE_ORDER, \
     MONITORING_STACK_TYPES, CEPH_TYPES, GATEWAY_TYPES
 from cephadm.services.cephadmservice import CephadmDaemonDeploySpec
 from cephadm.utils import ceph_release_to_major, name_to_config_section, CEPH_UPGRADE_ORDER, \
     MONITORING_STACK_TYPES, CEPH_TYPES, GATEWAY_TYPES
+from cephadm.ssh import HostConnectionError
 from orchestrator import OrchestratorError, DaemonDescription, DaemonDescriptionStatus, daemon_type_to_service
 
 if TYPE_CHECKING:
 from orchestrator import OrchestratorError, DaemonDescription, DaemonDescriptionStatus, daemon_type_to_service
 
 if TYPE_CHECKING:
@@ -118,7 +119,8 @@ class CephadmUpgrade:
         'UPGRADE_FAILED_PULL',
         'UPGRADE_REDEPLOY_DAEMON',
         'UPGRADE_BAD_TARGET_VERSION',
         'UPGRADE_FAILED_PULL',
         'UPGRADE_REDEPLOY_DAEMON',
         'UPGRADE_BAD_TARGET_VERSION',
-        'UPGRADE_EXCEPTION'
+        'UPGRADE_EXCEPTION',
+        'UPGRADE_OFFLINE_HOST'
     ]
 
     def __init__(self, mgr: "CephadmOrchestrator"):
     ]
 
     def __init__(self, mgr: "CephadmOrchestrator"):
@@ -460,6 +462,8 @@ class CephadmUpgrade:
         self.mgr.log.info('Upgrade: Resumed upgrade to %s' % self.target_image)
         self._save_upgrade_state()
         self.mgr.event.set()
         self.mgr.log.info('Upgrade: Resumed upgrade to %s' % self.target_image)
         self._save_upgrade_state()
         self.mgr.event.set()
+        for alert_id in self.UPGRADE_ERRORS:
+            self.mgr.remove_health_warning(alert_id)
         return 'Resumed upgrade to %s' % self.target_image
 
     def upgrade_stop(self) -> str:
         return 'Resumed upgrade to %s' % self.target_image
 
     def upgrade_stop(self) -> str:
@@ -484,6 +488,14 @@ class CephadmUpgrade:
         if self.upgrade_state and not self.upgrade_state.paused:
             try:
                 self._do_upgrade()
         if self.upgrade_state and not self.upgrade_state.paused:
             try:
                 self._do_upgrade()
+            except HostConnectionError as e:
+                self._fail_upgrade('UPGRADE_OFFLINE_HOST', {
+                    'severity': 'error',
+                    'summary': f'Upgrade: Failed to connect to host {e.hostname} at addr ({e.addr})',
+                    'count': 1,
+                    'detail': [f'SSH connection failed to {e.hostname} at addr ({e.addr}): {str(e)}'],
+                })
+                return False
             except Exception as e:
                 self._fail_upgrade('UPGRADE_EXCEPTION', {
                     'severity': 'error',
             except Exception as e:
                 self._fail_upgrade('UPGRADE_EXCEPTION', {
                     'severity': 'error',
@@ -976,6 +988,18 @@ class CephadmUpgrade:
             logger.debug('_do_upgrade no state, exiting')
             return
 
             logger.debug('_do_upgrade no state, exiting')
             return
 
+        if self.mgr.offline_hosts:
+            # offline host(s), on top of potential connection errors when trying to upgrade a daemon
+            # or pull an image, can cause issues where daemons are never ok to stop. Since evaluating
+            # whether or not that risk is present for any given offline hosts is a difficult problem,
+            # it's best to just fail upgrade cleanly so user can address the offline host(s)
+
+            # the HostConnectionError expects a hostname and addr, so let's just take
+            # one at random. It doesn't really matter which host we say we couldn't reach here.
+            hostname: str = list(self.mgr.offline_hosts)[0]
+            addr: str = self.mgr.inventory.get_addr(hostname)
+            raise HostConnectionError(f'Host(s) were marked offline: {self.mgr.offline_hosts}', hostname, addr)
+
         target_image = self.target_image
         target_id = self.upgrade_state.target_id
         target_digests = self.upgrade_state.target_digests
         target_image = self.target_image
         target_id = self.upgrade_state.target_id
         target_digests = self.upgrade_state.target_digests
@@ -1107,7 +1131,7 @@ class CephadmUpgrade:
                     # no point in trying to redeploy with new version if active mgr is not on the new version
                     need_upgrade_deployer = []
 
                     # no point in trying to redeploy with new version if active mgr is not on the new version
                     need_upgrade_deployer = []
 
-            if not need_upgrade_self:
+            if any(d in target_digests for d in self.mgr.get_active_mgr_digests()):
                 # only after the mgr itself is upgraded can we expect daemons to have
                 # deployed_by == target_digests
                 need_upgrade += need_upgrade_deployer
                 # only after the mgr itself is upgraded can we expect daemons to have
                 # deployed_by == target_digests
                 need_upgrade += need_upgrade_deployer
index 28811fc3aceda1eff16e3891ed6e59d0678f127d..ebceba7ceae9baee2847750fb2877903dc88432c 100644 (file)
@@ -21,7 +21,8 @@ class CephadmNoImage(Enum):
 
 # ceph daemon types that use the ceph container image.
 # NOTE: order important here as these are used for upgrade order
 
 # ceph daemon types that use the ceph container image.
 # NOTE: order important here as these are used for upgrade order
-CEPH_TYPES = ['mgr', 'mon', 'crash', 'osd', 'mds', 'rgw', 'rbd-mirror', 'cephfs-mirror']
+CEPH_TYPES = ['mgr', 'mon', 'crash', 'osd', 'mds', 'rgw',
+              'rbd-mirror', 'cephfs-mirror', 'ceph-exporter']
 GATEWAY_TYPES = ['iscsi', 'nfs']
 MONITORING_STACK_TYPES = ['node-exporter', 'prometheus',
                           'alertmanager', 'grafana', 'loki', 'promtail']
 GATEWAY_TYPES = ['iscsi', 'nfs']
 MONITORING_STACK_TYPES = ['node-exporter', 'prometheus',
                           'alertmanager', 'grafana', 'loki', 'promtail']
@@ -47,7 +48,7 @@ def name_to_config_section(name: str) -> ConfEntity:
     Map from daemon names to ceph entity names (as seen in config)
     """
     daemon_type = name.split('.', 1)[0]
     Map from daemon names to ceph entity names (as seen in config)
     """
     daemon_type = name.split('.', 1)[0]
-    if daemon_type in ['rgw', 'rbd-mirror', 'nfs', 'crash', 'iscsi']:
+    if daemon_type in ['rgw', 'rbd-mirror', 'nfs', 'crash', 'iscsi', 'ceph-exporter']:
         return ConfEntity('client.' + name)
     elif daemon_type in ['mon', 'osd', 'mds', 'mgr', 'client']:
         return ConfEntity(name)
         return ConfEntity('client.' + name)
     elif daemon_type in ['mon', 'osd', 'mds', 'mgr', 'client']:
         return ConfEntity(name)
index 5a3fa4349c37144104887ed0e676199fe5ae82d4..39ef8f98c94c551e2c777afc34fa9e71049257dd 100755 (executable)
@@ -5,6 +5,8 @@ set -x
 export PATH=/root/bin:$PATH
 mkdir /root/bin
 
 export PATH=/root/bin:$PATH
 mkdir /root/bin
 
+export CEPHADM_IMAGE='quay.ceph.io/ceph-ci/ceph:quincy'
+
 cp /mnt/{{ ceph_dev_folder }}/src/cephadm/cephadm /root/bin/cephadm
 chmod +x /root/bin/cephadm
 mkdir -p /etc/ceph
 cp /mnt/{{ ceph_dev_folder }}/src/cephadm/cephadm /root/bin/cephadm
 chmod +x /root/bin/cephadm
 mkdir -p /etc/ceph
@@ -25,7 +27,7 @@ fsid=$(cat /etc/ceph/ceph.conf | grep fsid | awk '{ print $3}')
 cephadm_shell="cephadm shell --fsid ${fsid} -c /etc/ceph/ceph.conf -k /etc/ceph/ceph.client.admin.keyring"
 
 {% for number in range(1, nodes) %}
 cephadm_shell="cephadm shell --fsid ${fsid} -c /etc/ceph/ceph.conf -k /etc/ceph/ceph.client.admin.keyring"
 
 {% for number in range(1, nodes) %}
-  ssh-copy-id -f -i /etc/ceph/ceph.pub  -o StrictHostKeyChecking=no root@{{ prefix }}-node-0{{ number }}
+  ssh-copy-id -f -i /etc/ceph/ceph.pub  -o StrictHostKeyChecking=no root@192.168.100.10{{ number }}
   {% if expanded_cluster is defined %}
     ${cephadm_shell} ceph orch host add {{ prefix }}-node-0{{ number }}
   {% endif %}
   {% if expanded_cluster is defined %}
     ${cephadm_shell} ceph orch host add {{ prefix }}-node-0{{ number }}
   {% endif %}
index 5d9f0723d58d44cd8707428b8a601097cee1ef33..a334fbad5f6eea66e580ae5f0e03672557bd80c0 100755 (executable)
@@ -8,7 +8,7 @@ parameters:
  prefix: ceph
  numcpus: 1
  memory: 2048
  prefix: ceph
  numcpus: 1
  memory: 2048
- image: fedora34
+ image: fedora36
  notify: false
  admin_password: password
  disks:
  notify: false
  admin_password: password
  disks:
index 063b544f49148290cb80d45b44c86e094d509fcd..4b6ad4dbe88b7c8b993bca30b82b65488c3e0ba7 100755 (executable)
@@ -46,5 +46,12 @@ while [[ $PROMETHEUS_RUNNING_COUNT -lt 1 ]]; do
     PROMETHEUS_RUNNING_COUNT=$(kcli ssh -u root ceph-node-00 'cephadm shell "ceph orch ls --service_name=prometheus --format=json"' | jq -r '.[] | .status.running')
 done
 
     PROMETHEUS_RUNNING_COUNT=$(kcli ssh -u root ceph-node-00 'cephadm shell "ceph orch ls --service_name=prometheus --format=json"' | jq -r '.[] | .status.running')
 done
 
+# grafana ip address is set to the fqdn by default.
+# kcli is not working with that, so setting the IP manually.
+kcli ssh -u root ceph-node-00 'cephadm shell "ceph dashboard set-alertmanager-api-host http://192.168.100.100:9093"'
+kcli ssh -u root ceph-node-00 'cephadm shell "ceph dashboard set-prometheus-api-host http://192.168.100.100:9095"'
+kcli ssh -u root ceph-node-00 'cephadm shell "ceph dashboard set-grafana-api-url https://192.168.100.100:3000"'
+kcli ssh -u root ceph-node-00 'cephadm shell "ceph orch apply node-exporter --placement 'count:2'"'
+
 cypress_run ["orchestrator/workflow/*.feature, orchestrator/workflow/*-spec.ts"]
 cypress_run "orchestrator/grafana/*.feature"
 cypress_run ["orchestrator/workflow/*.feature, orchestrator/workflow/*-spec.ts"]
 cypress_run "orchestrator/grafana/*.feature"
index 26fbd8a7c4b699f194280d2075e845ad203430c3..e86cec82bc9cef02d30c377fa9ea30b5391d6e35 100755 (executable)
@@ -8,6 +8,8 @@ cleanup() {
         echo "Starting cleanup..."
         kcli delete plan -y ceph || true
         kcli delete network ceph-dashboard -y
         echo "Starting cleanup..."
         kcli delete plan -y ceph || true
         kcli delete network ceph-dashboard -y
+        kcli delete pool ceph-dashboard -y
+        rm -rf ${HOME}/.kcli
         docker container prune -f
         echo "Cleanup completed."
     fi
         docker container prune -f
         echo "Cleanup completed."
     fi
@@ -41,7 +43,7 @@ on_error() {
 trap 'on_error $? $LINENO' ERR
 trap 'cleanup $? $LINENO' EXIT
 
 trap 'on_error $? $LINENO' ERR
 trap 'cleanup $? $LINENO' EXIT
 
-sed -i '/ceph-node-/d' $HOME/.ssh/known_hosts
+sed -i '/ceph-node-/d' $HOME/.ssh/known_hosts || true
 
 : ${CEPH_DEV_FOLDER:=${PWD}}
 EXTRA_PARAMS=''
 
 : ${CEPH_DEV_FOLDER:=${PWD}}
 EXTRA_PARAMS=''
@@ -71,8 +73,8 @@ fi
 npm run build ${FRONTEND_BUILD_OPTS} &
 
 cd ${CEPH_DEV_FOLDER}
 npm run build ${FRONTEND_BUILD_OPTS} &
 
 cd ${CEPH_DEV_FOLDER}
-: ${VM_IMAGE:='fedora34'}
-: ${VM_IMAGE_URL:='https://fedora.mirror.liteserver.nl/linux/releases/34/Cloud/x86_64/images/Fedora-Cloud-Base-34-1.2.x86_64.qcow2'}
+: ${VM_IMAGE:='fedora36'}
+: ${VM_IMAGE_URL:='https://download.fedoraproject.org/pub/fedora/linux/releases/36/Cloud/x86_64/images/Fedora-Cloud-Base-36-1.5.x86_64.qcow2'}
 kcli download image -p ceph-dashboard -u ${VM_IMAGE_URL} ${VM_IMAGE}
 kcli delete plan -y ceph || true
 kcli create plan -f src/pybind/mgr/dashboard/ci/cephadm/ceph_cluster.yml \
 kcli download image -p ceph-dashboard -u ${VM_IMAGE_URL} ${VM_IMAGE}
 kcli delete plan -y ceph || true
 kcli create plan -f src/pybind/mgr/dashboard/ci/cephadm/ceph_cluster.yml \
index 00e1aad0164f9341ab5bbbef094e2429312855d9..55f81c92dec0616eb9329a85381e7ea93e5b6e1f 100644 (file)
@@ -1,7 +1,7 @@
-CherryPy==13.1.0
-more-itertools==8.14.0
-PyJWT==2.0.1
-bcrypt==3.1.4
-python3-saml==1.4.1
-requests==2.26
-Routes==2.4.1
+CherryPy~=13.1
+more-itertools~=8.14
+PyJWT~=2.0
+bcrypt~=3.1
+python3-saml~=1.4
+requests~=2.26
+Routes~=2.4
diff --git a/ceph/src/pybind/mgr/dashboard/controllers/_paginate.py b/ceph/src/pybind/mgr/dashboard/controllers/_paginate.py
new file mode 100644 (file)
index 0000000..e69de29
index 5da79e35b48e1e75df2aae71992c24e59d920551..3eb7e37e4e32c0c08d4f27cfd3d614dd174b8960 100644 (file)
@@ -1,4 +1,5 @@
 # -*- coding: utf-8 -*-
 # -*- coding: utf-8 -*-
+import logging
 import os
 from collections import defaultdict
 
 import os
 from collections import defaultdict
 
@@ -19,6 +20,8 @@ GET_QUOTAS_SCHEMA = {
     'max_files': (int, '')
 }
 
     'max_files': (int, '')
 }
 
+logger = logging.getLogger("controllers.rgw")
+
 
 @APIRouter('/cephfs', Scope.CEPHFS)
 @APIDoc("Cephfs Management API", "Cephfs")
 
 @APIRouter('/cephfs', Scope.CEPHFS)
 @APIDoc("Cephfs Management API", "Cephfs")
@@ -467,6 +470,14 @@ class CephFS(RESTController):
         :rtype: str
         """
         cfs = self._cephfs_instance(fs_id)
         :rtype: str
         """
         cfs = self._cephfs_instance(fs_id)
+        list_snaps = cfs.ls_snapshots(path)
+        for snap in list_snaps:
+            if name == snap['name']:
+                raise DashboardException(code='Snapshot name already in use',
+                                         msg='Snapshot name {} is already in use.'
+                                         'Please use another name'.format(name),
+                                         component='cephfs')
+
         return cfs.mk_snapshot(path, name)
 
     @RESTController.Resource('DELETE', path='/snapshot')
         return cfs.mk_snapshot(path, name)
 
     @RESTController.Resource('DELETE', path='/snapshot')
index ab9f5687b532ba33424d12233d5e19bfde8cf12e..866863cff913cc9098628d6baceb2ec4c372fc02 100644 (file)
@@ -33,7 +33,7 @@ class Docs(BaseController):
                     list_of_ctrl.add(endpoint.ctrl)
 
         tag_map: Dict[str, str] = {}
                     list_of_ctrl.add(endpoint.ctrl)
 
         tag_map: Dict[str, str] = {}
-        for ctrl in list_of_ctrl:
+        for ctrl in sorted(list_of_ctrl, key=lambda ctrl: ctrl.__name__):
             tag_name = ctrl.__name__
             tag_descr = ""
             if hasattr(ctrl, 'doc_info'):
             tag_name = ctrl.__name__
             tag_descr = ""
             if hasattr(ctrl, 'doc_info'):
index 6703a546295042525086c8ddfff7764b3e19a4a8..9faaa519202c65e1353a81fd2c1e0fac7e31da8b 100644 (file)
@@ -3,6 +3,7 @@
 import copy
 import os
 import time
 import copy
 import os
 import time
+from collections import Counter
 from typing import Dict, List, Optional
 
 import cherrypy
 from typing import Dict, List, Optional
 
 import cherrypy
@@ -28,6 +29,10 @@ LIST_HOST_SCHEMA = {
         "type": (str, "type of service"),
         "id": (str, "Service Id"),
     }], "Services related to the host"),
         "type": (str, "type of service"),
         "id": (str, "Service Id"),
     }], "Services related to the host"),
+    "service_instances": ([{
+        "type": (str, "type of service"),
+        "count": (int, "Number of instances of the service"),
+    }], "Service instances related to the host"),
     "ceph_version": (str, "Ceph version"),
     "addr": (str, "Host address"),
     "labels": ([str], "Labels related to the host"),
     "ceph_version": (str, "Ceph version"),
     "addr": (str, "Host address"),
     "labels": ([str], "Labels related to the host"),
@@ -151,9 +156,23 @@ def merge_hosts_by_hostname(ceph_hosts, orch_hosts):
             }, orch_hosts_map[hostname]) for hostname in orch_hosts_map
     ]
     hosts.extend(orch_hosts_only)
             }, orch_hosts_map[hostname]) for hostname in orch_hosts_map
     ]
     hosts.extend(orch_hosts_only)
+    for host in hosts:
+        host['service_instances'] = populate_service_instances(
+            host['hostname'], host['services'])
     return hosts
 
 
     return hosts
 
 
+def populate_service_instances(hostname, services):
+    orch = OrchClient.instance()
+    if orch.available():
+        services = (daemon['daemon_type']
+                    for daemon in (d.to_dict()
+                                   for d in orch.services.list_daemons(hostname=hostname)))
+    else:
+        services = (daemon['type'] for daemon in services)
+    return [{'type': k, 'count': v} for k, v in Counter(services).items()]
+
+
 def get_hosts(sources=None):
     """
     Get hosts from various sources.
 def get_hosts(sources=None):
     """
     Get hosts from various sources.
@@ -183,6 +202,8 @@ def get_hosts(sources=None):
         orch = OrchClient.instance()
         if orch.available():
             return merge_hosts_by_hostname(ceph_hosts, orch.hosts.list())
         orch = OrchClient.instance()
         if orch.available():
             return merge_hosts_by_hostname(ceph_hosts, orch.hosts.list())
+    for host in ceph_hosts:
+        host['service_instances'] = populate_service_instances(host['hostname'], host['services'])
     return ceph_hosts
 
 
     return ceph_hosts
 
 
@@ -282,7 +303,7 @@ class Host(RESTController):
                      'facts': (bool, 'Host Facts')
                  },
                  responses={200: LIST_HOST_SCHEMA})
                      'facts': (bool, 'Host Facts')
                  },
                  responses={200: LIST_HOST_SCHEMA})
-    @RESTController.MethodMap(version=APIVersion(1, 1))
+    @RESTController.MethodMap(version=APIVersion(1, 2))
     def list(self, sources=None, facts=False):
         hosts = get_hosts(sources)
         orch = OrchClient.instance()
     def list(self, sources=None, facts=False):
         hosts = get_hosts(sources)
         orch = OrchClient.instance()
index 3c177511c1da9f9769c05d4147ef2f0f98eedb5f..5591a03c0ad758bb9975518084fd9456481f5bdf 100644 (file)
@@ -12,7 +12,8 @@ from mgr_module import NFS_GANESHA_SUPPORTED_FSALS
 from .. import mgr
 from ..security import Scope
 from ..services.cephfs import CephFS
 from .. import mgr
 from ..security import Scope
 from ..services.cephfs import CephFS
-from ..services.exception import DashboardException, serialize_dashboard_exception
+from ..services.exception import DashboardException, handle_cephfs_error, \
+    serialize_dashboard_exception
 from . import APIDoc, APIRouter, BaseController, Endpoint, EndpointDoc, \
     ReadPermission, RESTController, Task, UIRouter
 from ._version import APIVersion
 from . import APIDoc, APIRouter, BaseController, Endpoint, EndpointDoc, \
     ReadPermission, RESTController, Task, UIRouter
 from ._version import APIVersion
@@ -117,6 +118,7 @@ class NFSGaneshaExports(RESTController):
 
         return exports
 
 
         return exports
 
+    @handle_cephfs_error()
     @NfsTask('create', {'path': '{path}', 'fsal': '{fsal.name}',
                         'cluster_id': '{cluster_id}'}, 2.0)
     @EndpointDoc("Creates a new NFS-Ganesha export",
     @NfsTask('create', {'path': '{path}', 'fsal': '{fsal.name}',
                         'cluster_id': '{cluster_id}'}, 2.0)
     @EndpointDoc("Creates a new NFS-Ganesha export",
index 9c903ed672eec997627e79952fcbe169cb8f0634..1e557bd74d41ecd9b39af7f696124b76aa42ac89 100644 (file)
@@ -482,8 +482,18 @@ class Osd(RESTController):
 
     @RESTController.Resource('GET')
     def devices(self, svc_id):
 
     @RESTController.Resource('GET')
     def devices(self, svc_id):
-        # (str) -> dict
-        return CephService.send_command('mon', 'device ls-by-daemon', who='osd.{}'.format(svc_id))
+        # type: (str) -> Union[list, str]
+        devices: Union[list, str] = CephService.send_command(
+            'mon', 'device ls-by-daemon', who='osd.{}'.format(svc_id))
+        mgr_map = mgr.get('mgr_map')
+        available_modules = [m['name'] for m in mgr_map['available_modules']]
+
+        life_expectancy_enabled = any(
+            item.startswith('diskprediction_') for item in available_modules)
+        for device in devices:
+            device['life_expectancy_enabled'] = life_expectancy_enabled
+
+        return devices
 
 
 @UIRouter('/osd', Scope.OSD)
 
 
 @UIRouter('/osd', Scope.OSD)
index af90f0d60088866045729debcedda8afa2239a24..ae4abfc1668859529111e9b4cc526981b39ca077 100644 (file)
@@ -7,6 +7,7 @@ import requests
 
 from ..exceptions import DashboardException
 from ..security import Scope
 
 from ..exceptions import DashboardException
 from ..security import Scope
+from ..services import ceph_service
 from ..settings import Settings
 from . import APIDoc, APIRouter, BaseController, Endpoint, RESTController, Router
 
 from ..settings import Settings
 from . import APIDoc, APIRouter, BaseController, Endpoint, RESTController, Router
 
@@ -41,6 +42,9 @@ class PrometheusRESTController(RESTController):
     def _get_api_url(self, host):
         return host.rstrip('/') + '/api/v1'
 
     def _get_api_url(self, host):
         return host.rstrip('/') + '/api/v1'
 
+    def balancer_status(self):
+        return ceph_service.CephService.send_command('mon', 'balancer status')
+
     def _proxy(self, base_url, method, path, api_name, params=None, payload=None, verify=True):
         # type (str, str, str, str, dict, dict, bool)
         try:
     def _proxy(self, base_url, method, path, api_name, params=None, payload=None, verify=True):
         # type (str, str, str, str, dict, dict, bool)
         try:
@@ -57,8 +61,16 @@ class PrometheusRESTController(RESTController):
             raise DashboardException(
                 "Error parsing Prometheus Alertmanager response: {}".format(e.msg),
                 component='prometheus')
             raise DashboardException(
                 "Error parsing Prometheus Alertmanager response: {}".format(e.msg),
                 component='prometheus')
-        if content['status'] == 'success':
+        balancer_status = self.balancer_status()
+        if content['status'] == 'success':  # pylint: disable=R1702
             if 'data' in content:
             if 'data' in content:
+                if balancer_status['active'] and balancer_status['no_optimization_needed'] and path == '/alerts':  # noqa E501  #pylint: disable=line-too-long
+                    for alert in content['data']:
+                        for k, v in alert.items():
+                            if k == 'labels':
+                                for key, value in v.items():
+                                    if key == 'alertname' and value == 'CephPGImbalance':
+                                        content['data'].remove(alert)
                 return content['data']
             return content
         raise DashboardException(content, http_status_code=400, component='prometheus')
                 return content['data']
             return content
         raise DashboardException(content, http_status_code=400, component='prometheus')
index c20ee8ca282b375220b5b1ae2f56601eae434359..40c7fef992bbade3ddd8b87e2569d56526e18297 100644 (file)
@@ -113,7 +113,8 @@ class Rbd(RESTController):
     @RESTController.MethodMap(version=APIVersion(2, 0))  # type: ignore
     def list(self, pool_name=None, offset: int = 0, limit: int = DEFAULT_LIMIT,
              search: str = '', sort: str = ''):
     @RESTController.MethodMap(version=APIVersion(2, 0))  # type: ignore
     def list(self, pool_name=None, offset: int = 0, limit: int = DEFAULT_LIMIT,
              search: str = '', sort: str = ''):
-        return self._rbd_list(pool_name, offset=offset, limit=limit, search=search, sort=sort)
+        return self._rbd_list(pool_name, offset=int(offset), limit=int(limit),
+                              search=search, sort=sort)
 
     @handle_rbd_error()
     @handle_rados_error('pool')
 
     @handle_rbd_error()
     @handle_rados_error('pool')
@@ -184,6 +185,16 @@ class Rbd(RESTController):
             if size and size != image.size():
                 image.resize(size)
 
             if size and size != image.size():
                 image.resize(size)
 
+            mirror_image_info = image.mirror_image_get_info()
+            if enable_mirror and mirror_image_info['state'] == rbd.RBD_MIRROR_IMAGE_DISABLED:
+                RbdMirroringService.enable_image(
+                    image_name, pool_name, namespace,
+                    MIRROR_IMAGE_MODE[mirror_mode])
+            elif (enable_mirror is False
+                  and mirror_image_info['state'] == rbd.RBD_MIRROR_IMAGE_ENABLED):
+                RbdMirroringService.disable_image(
+                    image_name, pool_name, namespace)
+
             # check enable/disable features
             if features is not None:
                 curr_features = format_bitmask(image.features())
             # check enable/disable features
             if features is not None:
                 curr_features = format_bitmask(image.features())
@@ -207,16 +218,6 @@ class Rbd(RESTController):
             RbdConfiguration(pool_ioctx=ioctx, image_name=image_name).set_configuration(
                 configuration)
 
             RbdConfiguration(pool_ioctx=ioctx, image_name=image_name).set_configuration(
                 configuration)
 
-            mirror_image_info = image.mirror_image_get_info()
-            if enable_mirror and mirror_image_info['state'] == rbd.RBD_MIRROR_IMAGE_DISABLED:
-                RbdMirroringService.enable_image(
-                    image_name, pool_name, namespace,
-                    MIRROR_IMAGE_MODE[mirror_mode])
-            elif (enable_mirror is False
-                  and mirror_image_info['state'] == rbd.RBD_MIRROR_IMAGE_ENABLED):
-                RbdMirroringService.disable_image(
-                    image_name, pool_name, namespace)
-
             if primary and not mirror_image_info['primary']:
                 RbdMirroringService.promote_image(
                     image_name, pool_name, namespace)
             if primary and not mirror_image_info['primary']:
                 RbdMirroringService.promote_image(
                     image_name, pool_name, namespace)
index 17ef0b88b2a362e6fa9b94dd4cedb100fcfcbc31..65eb0b56e8ba5bd55dcd696582625beb02e263bc 100644 (file)
@@ -3,6 +3,7 @@
 import json
 import logging
 import re
 import json
 import logging
 import re
+from enum import IntEnum
 from functools import partial
 from typing import NamedTuple, Optional, no_type_check
 
 from functools import partial
 from typing import NamedTuple, Optional, no_type_check
 
@@ -25,7 +26,21 @@ from . import APIDoc, APIRouter, BaseController, CreatePermission, Endpoint, \
 logger = logging.getLogger('controllers.rbd_mirror')
 
 
 logger = logging.getLogger('controllers.rbd_mirror')
 
 
+class MirrorHealth(IntEnum):
+    # RBD defined mirroring health states in in src/tools/rbd/action/MirrorPool.cc where the order
+    # is relevant.
+    MIRROR_HEALTH_OK = 0
+    MIRROR_HEALTH_UNKNOWN = 1
+    MIRROR_HEALTH_WARNING = 2
+    MIRROR_HEALTH_ERROR = 3
+
+    # extra states for the dashboard
+    MIRROR_HEALTH_DISABLED = 4
+    MIRROR_HEALTH_INFO = 5
+
 # pylint: disable=not-callable
 # pylint: disable=not-callable
+
+
 def handle_rbd_mirror_error():
     def composed_decorator(func):
         func = handle_rados_error('rbd-mirroring')(func)
 def handle_rbd_mirror_error():
     def composed_decorator(func):
         func = handle_rados_error('rbd-mirroring')(func)
@@ -79,28 +94,24 @@ def get_daemons():
 
 def get_daemon_health(daemon):
     health = {
 
 def get_daemon_health(daemon):
     health = {
-        'health_color': 'info',
-        'health': 'Unknown'
+        'health': MirrorHealth.MIRROR_HEALTH_DISABLED
     }
     for _, pool_data in daemon['status'].items():
     }
     for _, pool_data in daemon['status'].items():
-        if (health['health'] != 'error'
+        if (health['health'] != MirrorHealth.MIRROR_HEALTH_ERROR
                 and [k for k, v in pool_data.get('callouts', {}).items()
                      if v['level'] == 'error']):
             health = {
                 and [k for k, v in pool_data.get('callouts', {}).items()
                      if v['level'] == 'error']):
             health = {
-                'health_color': 'error',
-                'health': 'Error'
+                'health': MirrorHealth.MIRROR_HEALTH_ERROR
             }
             }
-        elif (health['health'] != 'error'
+        elif (health['health'] != MirrorHealth.MIRROR_HEALTH_ERROR
                 and [k for k, v in pool_data.get('callouts', {}).items()
                      if v['level'] == 'warning']):
             health = {
                 and [k for k, v in pool_data.get('callouts', {}).items()
                      if v['level'] == 'warning']):
             health = {
-                'health_color': 'warning',
-                'health': 'Warning'
+                'health': MirrorHealth.MIRROR_HEALTH_WARNING
             }
             }
-        elif health['health_color'] == 'info':
+        elif health['health'] == MirrorHealth.MIRROR_HEALTH_DISABLED:
             health = {
             health = {
-                'health_color': 'success',
-                'health': 'OK'
+                'health': MirrorHealth.MIRROR_HEALTH_OK
             }
     return health
 
             }
     return health
 
@@ -113,45 +124,48 @@ def get_pools(daemons):  # pylint: disable=R0912, R0915
     return pool_stats
 
 
     return pool_stats
 
 
+def transform_mirror_health(stat):
+    health = 'OK'
+    health_color = 'success'
+    if stat['health'] == MirrorHealth.MIRROR_HEALTH_ERROR:
+        health = 'Error'
+        health_color = 'error'
+    elif stat['health'] == MirrorHealth.MIRROR_HEALTH_WARNING:
+        health = 'Warning'
+        health_color = 'warning'
+    elif stat['health'] == MirrorHealth.MIRROR_HEALTH_UNKNOWN:
+        health = 'Unknown'
+        health_color = 'warning'
+    elif stat['health'] == MirrorHealth.MIRROR_HEALTH_OK:
+        health = 'OK'
+        health_color = 'success'
+    elif stat['health'] == MirrorHealth.MIRROR_HEALTH_DISABLED:
+        health = 'Disabled'
+        health_color = 'info'
+    stat['health'] = health
+    stat['health_color'] = health_color
+
+
 def _update_pool_stats(daemons, pool_stats):
     _update_pool_stats_with_daemons(daemons, pool_stats)
 def _update_pool_stats(daemons, pool_stats):
     _update_pool_stats_with_daemons(daemons, pool_stats)
-    for _, stats in pool_stats.items():
-        if stats['mirror_mode'] == 'disabled':
-            continue
-        if stats.get('health', None) is None:
-            # daemon doesn't know about pool
-            stats['health_color'] = 'error'
-            stats['health'] = 'Error'
-        elif stats.get('leader_id', None) is None:
-            # no daemons are managing the pool as leader instance
-            stats['health_color'] = 'warning'
-            stats['health'] = 'Warning'
+    for pool_stat in pool_stats.values():
+        transform_mirror_health(pool_stat)
 
 
 def _update_pool_stats_with_daemons(daemons, pool_stats):
     for daemon in daemons:
         for _, pool_data in daemon['status'].items():
 
 
 def _update_pool_stats_with_daemons(daemons, pool_stats):
     for daemon in daemons:
         for _, pool_data in daemon['status'].items():
-            stats = pool_stats.get(pool_data['name'], None)  # type: ignore
-            if stats is None:
+            pool_stat = pool_stats.get(pool_data['name'], None)  # type: ignore
+            if pool_stat is None:
                 continue
 
             if pool_data.get('leader', False):
                 # leader instance stores image counts
                 continue
 
             if pool_data.get('leader', False):
                 # leader instance stores image counts
-                stats['leader_id'] = daemon['metadata']['instance_id']
-                stats['image_local_count'] = pool_data.get('image_local_count', 0)
-                stats['image_remote_count'] = pool_data.get('image_remote_count', 0)
-
-            if (stats.get('health_color', '') != 'error'
-                    and pool_data.get('image_error_count', 0) > 0):
-                stats['health_color'] = 'error'
-                stats['health'] = 'Error'
-            elif (stats.get('health_color', '') != 'error'
-                    and pool_data.get('image_warning_count', 0) > 0):
-                stats['health_color'] = 'warning'
-                stats['health'] = 'Warning'
-            elif stats.get('health', None) is None:
-                stats['health_color'] = 'success'
-                stats['health'] = 'OK'
+                pool_stat['leader_id'] = daemon['metadata']['instance_id']
+                pool_stat['image_local_count'] = pool_data.get('image_local_count', 0)
+                pool_stat['image_remote_count'] = pool_data.get('image_remote_count', 0)
+
+            pool_stat['health'] = max(pool_stat['health'], daemon['health'])
 
 
 def _get_pool_stats(pool_names):
 
 
 def _get_pool_stats(pool_names):
@@ -176,16 +190,27 @@ def _get_pool_stats(pool_names):
         stats = {}
         if mirror_mode == rbd.RBD_MIRROR_MODE_DISABLED:
             mirror_mode = "disabled"
         stats = {}
         if mirror_mode == rbd.RBD_MIRROR_MODE_DISABLED:
             mirror_mode = "disabled"
-            stats['health_color'] = "info"
-            stats['health'] = "Disabled"
+            stats['health'] = MirrorHealth.MIRROR_HEALTH_DISABLED
         elif mirror_mode == rbd.RBD_MIRROR_MODE_IMAGE:
             mirror_mode = "image"
         elif mirror_mode == rbd.RBD_MIRROR_MODE_POOL:
             mirror_mode = "pool"
         else:
             mirror_mode = "unknown"
         elif mirror_mode == rbd.RBD_MIRROR_MODE_IMAGE:
             mirror_mode = "image"
         elif mirror_mode == rbd.RBD_MIRROR_MODE_POOL:
             mirror_mode = "pool"
         else:
             mirror_mode = "unknown"
-            stats['health_color'] = "warning"
-            stats['health'] = "Warning"
+
+        if mirror_mode != "disabled":
+            # In case of a pool being enabled we will infer the health like the RBD cli tool does
+            # in src/tools/rbd/action/MirrorPool.cc::execute_status
+            mirror_image_health: MirrorHealth = MirrorHealth.MIRROR_HEALTH_OK
+            for status, _ in rbdctx.mirror_image_status_summary(ioctx):
+                if (mirror_image_health < MirrorHealth.MIRROR_HEALTH_WARNING
+                    and status != rbd.MIRROR_IMAGE_STATUS_STATE_REPLAYING
+                        and status != rbd.MIRROR_IMAGE_STATUS_STATE_STOPPED):
+                    mirror_image_health = MirrorHealth.MIRROR_HEALTH_WARNING
+                if (mirror_image_health < MirrorHealth.MIRROR_HEALTH_ERROR
+                        and status == rbd.MIRROR_IMAGE_STATUS_STATE_ERROR):
+                    mirror_image_health = MirrorHealth.MIRROR_HEALTH_ERROR
+            stats['health'] = mirror_image_health
 
         pool_stats[pool_name] = dict(stats, **{
             'mirror_mode': mirror_mode,
 
         pool_stats[pool_name] = dict(stats, **{
             'mirror_mode': mirror_mode,
@@ -197,10 +222,13 @@ def _get_pool_stats(pool_names):
 @ViewCache()
 def get_daemons_and_pools():  # pylint: disable=R0915
     daemons = get_daemons()
 @ViewCache()
 def get_daemons_and_pools():  # pylint: disable=R0915
     daemons = get_daemons()
-    return {
+    daemons_and_pools = {
         'daemons': daemons,
         'pools': get_pools(daemons)
     }
         'daemons': daemons,
         'pools': get_pools(daemons)
     }
+    for daemon in daemons:
+        transform_mirror_health(daemon)
+    return daemons_and_pools
 
 
 class ReplayingData(NamedTuple):
 
 
 class ReplayingData(NamedTuple):
index f42b91a0e940e6343fcc26b36ea71ea7d12d11a9..f120b4a5ee3e1744403584ab2ac73976d6c70081 100644 (file)
@@ -197,6 +197,28 @@ class RgwBucket(RgwRESTController):
             rgw_client.set_bucket_versioning(bucket_name, versioning_state, mfa_delete,
                                              mfa_token_serial, mfa_token_pin)
 
             rgw_client.set_bucket_versioning(bucket_name, versioning_state, mfa_delete,
                                              mfa_token_serial, mfa_token_pin)
 
+    def _set_encryption(self, bid, encryption_type, key_id, daemon_name, owner):
+
+        rgw_client = RgwClient.instance(owner, daemon_name)
+        rgw_client.set_bucket_encryption(bid, key_id, encryption_type)
+
+    # pylint: disable=W0613
+    def _set_encryption_config(self, encryption_type, kms_provider, auth_method, secret_engine,
+                               secret_path, namespace, address, token, daemon_name, owner,
+                               ssl_cert, client_cert, client_key):
+
+        CephService.set_encryption_config(encryption_type, kms_provider, auth_method,
+                                          secret_engine, secret_path, namespace, address,
+                                          token, daemon_name, ssl_cert, client_cert, client_key)
+
+    def _get_encryption(self, bucket_name, daemon_name, owner):
+        rgw_client = RgwClient.instance(owner, daemon_name)
+        return rgw_client.get_bucket_encryption(bucket_name)
+
+    def _delete_encryption(self, bucket_name, daemon_name, owner):
+        rgw_client = RgwClient.instance(owner, daemon_name)
+        return rgw_client.delete_bucket_encryption(bucket_name)
+
     def _get_locking(self, owner, daemon_name, bucket_name):
         rgw_client = RgwClient.instance(owner, daemon_name)
         return rgw_client.get_bucket_locking(bucket_name)
     def _get_locking(self, owner, daemon_name, bucket_name):
         rgw_client = RgwClient.instance(owner, daemon_name)
         return rgw_client.get_bucket_locking(bucket_name)
@@ -256,6 +278,8 @@ class RgwBucket(RgwRESTController):
 
         # Append the versioning configuration.
         versioning = self._get_versioning(result['owner'], daemon_name, bucket_name)
 
         # Append the versioning configuration.
         versioning = self._get_versioning(result['owner'], daemon_name, bucket_name)
+        encryption = self._get_encryption(bucket_name, daemon_name, result['owner'])
+        result['encryption'] = encryption['Status']
         result['versioning'] = versioning['Status']
         result['mfa_delete'] = versioning['MfaDelete']
 
         result['versioning'] = versioning['Status']
         result['mfa_delete'] = versioning['MfaDelete']
 
@@ -269,8 +293,10 @@ class RgwBucket(RgwRESTController):
     def create(self, bucket, uid, zonegroup=None, placement_target=None,
                lock_enabled='false', lock_mode=None,
                lock_retention_period_days=None,
     def create(self, bucket, uid, zonegroup=None, placement_target=None,
                lock_enabled='false', lock_mode=None,
                lock_retention_period_days=None,
-               lock_retention_period_years=None, daemon_name=None):
+               lock_retention_period_years=None, encryption_state='false',
+               encryption_type=None, key_id=None, daemon_name=None):
         lock_enabled = str_to_bool(lock_enabled)
         lock_enabled = str_to_bool(lock_enabled)
+        encryption_state = str_to_bool(encryption_state)
         try:
             rgw_client = RgwClient.instance(uid, daemon_name)
             result = rgw_client.create_bucket(bucket, zonegroup,
         try:
             rgw_client = RgwClient.instance(uid, daemon_name)
             result = rgw_client.create_bucket(bucket, zonegroup,
@@ -280,15 +306,21 @@ class RgwBucket(RgwRESTController):
                 self._set_locking(uid, daemon_name, bucket, lock_mode,
                                   lock_retention_period_days,
                                   lock_retention_period_years)
                 self._set_locking(uid, daemon_name, bucket, lock_mode,
                                   lock_retention_period_days,
                                   lock_retention_period_years)
+
+            if encryption_state:
+                self._set_encryption(bucket, encryption_type, key_id, daemon_name, uid)
+
             return result
         except RequestException as e:  # pragma: no cover - handling is too obvious
             raise DashboardException(e, http_status_code=500, component='rgw')
 
     @allow_empty_body
     def set(self, bucket, bucket_id, uid, versioning_state=None,
             return result
         except RequestException as e:  # pragma: no cover - handling is too obvious
             raise DashboardException(e, http_status_code=500, component='rgw')
 
     @allow_empty_body
     def set(self, bucket, bucket_id, uid, versioning_state=None,
+            encryption_state='false', encryption_type=None, key_id=None,
             mfa_delete=None, mfa_token_serial=None, mfa_token_pin=None,
             lock_mode=None, lock_retention_period_days=None,
             lock_retention_period_years=None, daemon_name=None):
             mfa_delete=None, mfa_token_serial=None, mfa_token_pin=None,
             lock_mode=None, lock_retention_period_days=None,
             lock_retention_period_years=None, daemon_name=None):
+        encryption_state = str_to_bool(encryption_state)
         # When linking a non-tenant-user owned bucket to a tenanted user, we
         # need to prefix bucket name with '/'. e.g. photos -> /photos
         if '$' in uid and '/' not in bucket:
         # When linking a non-tenant-user owned bucket to a tenanted user, we
         # need to prefix bucket name with '/'. e.g. photos -> /photos
         if '$' in uid and '/' not in bucket:
@@ -322,6 +354,11 @@ class RgwBucket(RgwRESTController):
                               lock_retention_period_days,
                               lock_retention_period_years)
 
                               lock_retention_period_days,
                               lock_retention_period_years)
 
+        encryption_status = self._get_encryption(bucket_name, daemon_name, uid)
+        if encryption_state and encryption_status['Status'] != 'Enabled':
+            self._set_encryption(bucket_name, encryption_type, key_id, daemon_name, uid)
+        if encryption_status['Status'] == 'Enabled' and (not encryption_state):
+            self._delete_encryption(bucket_name, daemon_name, uid)
         return self._append_bid(result)
 
     def delete(self, bucket, purge_objects='true', daemon_name=None):
         return self._append_bid(result)
 
     def delete(self, bucket, purge_objects='true', daemon_name=None):
@@ -330,6 +367,32 @@ class RgwBucket(RgwRESTController):
             'purge-objects': purge_objects
         }, json_response=False)
 
             'purge-objects': purge_objects
         }, json_response=False)
 
+    @RESTController.Collection(method='PUT', path='/setEncryptionConfig')
+    @allow_empty_body
+    def set_encryption_config(self, encryption_type=None, kms_provider=None, auth_method=None,
+                              secret_engine=None, secret_path='', namespace='', address=None,
+                              token=None, daemon_name=None, owner=None, ssl_cert=None,
+                              client_cert=None, client_key=None):
+        return self._set_encryption_config(encryption_type, kms_provider, auth_method,
+                                           secret_engine, secret_path, namespace,
+                                           address, token, daemon_name, owner, ssl_cert,
+                                           client_cert, client_key)
+
+    @RESTController.Collection(method='GET', path='/getEncryption')
+    @allow_empty_body
+    def get_encryption(self, bucket_name, daemon_name=None, owner=None):
+        return self._get_encryption(bucket_name, daemon_name, owner)
+
+    @RESTController.Collection(method='DELETE', path='/deleteEncryption')
+    @allow_empty_body
+    def delete_encryption(self, bucket_name, daemon_name=None, owner=None):
+        return self._delete_encryption(bucket_name, daemon_name, owner)
+
+    @RESTController.Collection(method='GET', path='/getEncryptionConfig')
+    @allow_empty_body
+    def get_encryption_config(self, daemon_name=None, owner=None):
+        return CephService.get_encryption_config(daemon_name)
+
 
 @APIRouter('/rgw/user', Scope.RGW)
 @APIDoc("RGW User Management API", "RgwUser")
 
 @APIRouter('/rgw/user', Scope.RGW)
 @APIDoc("RGW User Management API", "RgwUser")
@@ -506,15 +569,32 @@ class RgwUser(RgwRESTController):
     def create_subuser(self, uid, subuser, access, key_type='s3',
                        generate_secret='true', access_key=None,
                        secret_key=None, daemon_name=None):
     def create_subuser(self, uid, subuser, access, key_type='s3',
                        generate_secret='true', access_key=None,
                        secret_key=None, daemon_name=None):
-        return self.proxy(daemon_name, 'PUT', 'user', {
-            'uid': uid,
-            'subuser': subuser,
-            'key-type': key_type,
-            'access': access,
-            'generate-secret': generate_secret,
-            'access-key': access_key,
-            'secret-key': secret_key
-        })
+        # pylint: disable=R1705
+        subusr_array = []
+        user = json.loads(self.get(uid, daemon_name))  # type: ignore
+        subusers = user["subusers"]
+        for sub_usr in subusers:
+            subusr_array.append(sub_usr["id"])
+        if subuser in subusr_array:
+            return self.proxy(daemon_name, 'POST', 'user', {
+                'uid': uid,
+                'subuser': subuser,
+                'key-type': key_type,
+                'access': access,
+                'generate-secret': generate_secret,
+                'access-key': access_key,
+                'secret-key': secret_key
+            })
+        else:
+            return self.proxy(daemon_name, 'PUT', 'user', {
+                'uid': uid,
+                'subuser': subuser,
+                'key-type': key_type,
+                'access': access,
+                'generate-secret': generate_secret,
+                'access-key': access_key,
+                'secret-key': secret_key
+            })
 
     @RESTController.Resource(method='DELETE', path='/subuser/{subuser}', status=204)
     def delete_subuser(self, uid, subuser, purge_keys='true', daemon_name=None):
 
     @RESTController.Resource(method='DELETE', path='/subuser/{subuser}', status=204)
     def delete_subuser(self, uid, subuser, purge_keys='true', daemon_name=None):
index afe684302b160d4ce962595b8fb241c9635800b4..b75f417361498fdfffb26257726f11ef7520bd4b 100644 (file)
@@ -8,6 +8,7 @@ from ..services.exception import handle_custom_error, handle_orchestrator_error
 from ..services.orchestrator import OrchClient, OrchFeature
 from . import APIDoc, APIRouter, CreatePermission, DeletePermission, Endpoint, \
     ReadPermission, RESTController, Task, UpdatePermission
 from ..services.orchestrator import OrchClient, OrchFeature
 from . import APIDoc, APIRouter, CreatePermission, DeletePermission, Endpoint, \
     ReadPermission, RESTController, Task, UpdatePermission
+from ._version import APIVersion
 from .orchestrator import raise_if_no_orchestrator
 
 
 from .orchestrator import raise_if_no_orchestrator
 
 
@@ -29,9 +30,14 @@ class Service(RESTController):
         return ServiceSpec.KNOWN_SERVICE_TYPES
 
     @raise_if_no_orchestrator([OrchFeature.SERVICE_LIST])
         return ServiceSpec.KNOWN_SERVICE_TYPES
 
     @raise_if_no_orchestrator([OrchFeature.SERVICE_LIST])
-    def list(self, service_name: Optional[str] = None) -> List[dict]:
+    @RESTController.MethodMap(version=APIVersion(2, 0))  # type: ignore
+    def list(self, service_name: Optional[str] = None, offset: int = 0, limit: int = 5,
+             search: str = '', sort: str = '+service_name') -> List[dict]:
         orch = OrchClient.instance()
         orch = OrchClient.instance()
-        return [service.to_dict() for service in orch.services.list(service_name=service_name)]
+        services, count = orch.services.list(service_name=service_name, offset=int(offset),
+                                             limit=int(limit), search=search, sort=sort)
+        cherrypy.response.headers['X-Total-Count'] = count
+        return services
 
     @raise_if_no_orchestrator([OrchFeature.SERVICE_LIST])
     def get(self, service_name: str) -> List[dict]:
 
     @raise_if_no_orchestrator([OrchFeature.SERVICE_LIST])
     def get(self, service_name: str) -> List[dict]:
diff --git a/ceph/src/pybind/mgr/dashboard/frontend/.eslintrc.json b/ceph/src/pybind/mgr/dashboard/frontend/.eslintrc.json
new file mode 100644 (file)
index 0000000..7caf9d3
--- /dev/null
@@ -0,0 +1,87 @@
+{
+  "root": true,
+  "ignorePatterns": [
+    "projects/**/*"
+  ],
+  "overrides": [
+    {
+      "files": [
+        "*.ts"
+      ],
+      "parserOptions": {
+        "project": [
+          "tsconfig.json"
+        ],
+        "createDefaultProgram": true
+      },
+      "extends": [
+        "plugin:@angular-eslint/recommended",
+        "plugin:@angular-eslint/template/process-inline-templates"
+      ],
+      "rules": {
+        "no-multiple-empty-lines": [
+          "error",
+          {
+            "max": 2,
+            "maxEOF": 1
+          }
+        ],
+        "spaced-comment": [
+          "error",
+          "always",
+          {
+            "exceptions": ["-", "+", "*"] 
+          }
+        ],
+        "curly": [
+          "error",
+          "multi-line"
+        ],
+        "guard-for-in": "error",
+        "no-restricted-imports": ["error", {
+          "paths": ["rxjs/Rx", {
+            "name" : "@angular/core/testing",
+            "importNames": ["async"]
+          }],
+          "patterns": ["(\\.{1,2}/){2,}"]
+        }],
+        "no-console": [
+          "error",
+          {
+            "allow": [
+              "debug",
+              "info",
+              "time",
+              "timeEnd",
+              "trace"
+            ]
+          }
+        ],
+        "no-trailing-spaces": "error",
+        "no-caller": "error",
+        "no-bitwise": "error",
+        "no-duplicate-imports": "error",
+        "no-eval": "error",
+        "@angular-eslint/directive-selector": [
+          "error",
+          { "type": "attribute", "prefix": "cd", "style": "camelCase" }
+        ],
+        "@angular-eslint/component-selector": [
+          "error",
+          { "type": "element", "prefix": "cd", "style": "kebab-case" }
+        ]
+      }
+    },
+    {
+      "files": [
+        "*.html"
+      ],
+      "extends": [
+        "plugin:@angular-eslint/template/recommended"
+      ],
+      "rules": {
+        "@angular-eslint/template/eqeqeq": "off"
+      }
+    }
+  ]
+}
index cb76722bac1a8fefb107a3e021e77fd529b0b59b..4fd2130b93a39544196d8fc3d1fc2ab0ae1fa4de 100644 (file)
@@ -63,7 +63,7 @@ else(WITH_SYSTEM_NPM)
     OUTPUT "${mgr-dashboard-nodeenv-dir}/bin/npm"
     COMMAND ${CMAKE_SOURCE_DIR}/src/tools/setup-virtualenv.sh --python=${MGR_PYTHON_EXECUTABLE} ${mgr-dashboard-nodeenv-dir}
     COMMAND ${mgr-dashboard-nodeenv-dir}/bin/pip install nodeenv
     OUTPUT "${mgr-dashboard-nodeenv-dir}/bin/npm"
     COMMAND ${CMAKE_SOURCE_DIR}/src/tools/setup-virtualenv.sh --python=${MGR_PYTHON_EXECUTABLE} ${mgr-dashboard-nodeenv-dir}
     COMMAND ${mgr-dashboard-nodeenv-dir}/bin/pip install nodeenv
-    COMMAND ${mgr-dashboard-nodeenv-dir}/bin/nodeenv --verbose ${node_mirror_opt} -p --node=12.18.2
+    COMMAND ${mgr-dashboard-nodeenv-dir}/bin/nodeenv --verbose ${node_mirror_opt} -p --node=14.15.1
     COMMAND mkdir ${mgr-dashboard-nodeenv-dir}/.npm
     WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}
     COMMENT "dashboard nodeenv is being installed")
     COMMAND mkdir ${mgr-dashboard-nodeenv-dir}/.npm
     WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}
     COMMENT "dashboard nodeenv is being installed")
index b49c00b8cb791de6448de9ab9e5112e1198bd927..4bfab2baf215bad2b54307bafc51da895d113d19 100644 (file)
@@ -5,20 +5,59 @@
   "projects": {
     "ceph-dashboard": {
       "i18n": {
   "projects": {
     "ceph-dashboard": {
       "i18n": {
-        "sourceLocale": { "code": "en-US", "baseHref": "" },
+        "sourceLocale": {
+          "code": "en-US",
+          "baseHref": ""
+        },
         "locales": {
         "locales": {
-          "cs": { "translation": "src/locale/messages.cs.xlf", "baseHref": "" },
-          "de": { "translation": "src/locale/messages.de-DE.xlf", "baseHref": "" },
-          "es": { "translation": "src/locale/messages.es-ES.xlf", "baseHref": "" },
-          "fr": { "translation": "src/locale/messages.fr-FR.xlf", "baseHref": "" },
-          "id": { "translation": "src/locale/messages.id-ID.xlf", "baseHref": "" },
-          "it": { "translation": "src/locale/messages.it-IT.xlf", "baseHref": "" },
-          "ja": { "translation": "src/locale/messages.ja-JP.xlf", "baseHref": "" },
-          "ko": { "translation": "src/locale/messages.ko-KR.xlf", "baseHref": "" },
-          "pl": { "translation": "src/locale/messages.pl-PL.xlf", "baseHref": "" },
-          "pt": { "translation": "src/locale/messages.pt-BR.xlf", "baseHref": "" },
-          "zh-Hans": { "translation": "src/locale/messages.zh-CN.xlf", "baseHref": "" },
-          "zh-Hant": { "translation": "src/locale/messages.zh-TW.xlf", "baseHref": "" }
+          "cs": {
+            "translation": "src/locale/messages.cs.xlf",
+            "baseHref": ""
+          },
+          "de": {
+            "translation": "src/locale/messages.de-DE.xlf",
+            "baseHref": ""
+          },
+          "es": {
+            "translation": "src/locale/messages.es-ES.xlf",
+            "baseHref": ""
+          },
+          "fr": {
+            "translation": "src/locale/messages.fr-FR.xlf",
+            "baseHref": ""
+          },
+          "id": {
+            "translation": "src/locale/messages.id-ID.xlf",
+            "baseHref": ""
+          },
+          "it": {
+            "translation": "src/locale/messages.it-IT.xlf",
+            "baseHref": ""
+          },
+          "ja": {
+            "translation": "src/locale/messages.ja-JP.xlf",
+            "baseHref": ""
+          },
+          "ko": {
+            "translation": "src/locale/messages.ko-KR.xlf",
+            "baseHref": ""
+          },
+          "pl": {
+            "translation": "src/locale/messages.pl-PL.xlf",
+            "baseHref": ""
+          },
+          "pt": {
+            "translation": "src/locale/messages.pt-BR.xlf",
+            "baseHref": ""
+          },
+          "zh-Hans": {
+            "translation": "src/locale/messages.zh-CN.xlf",
+            "baseHref": ""
+          },
+          "zh-Hant": {
+            "translation": "src/locale/messages.zh-TW.xlf",
+            "baseHref": ""
+          }
         }
       },
       "root": "",
         }
       },
       "root": "",
@@ -60,7 +99,9 @@
               "node_modules/ngx-toastr/toastr.css",
               "src/styles.scss"
             ],
               "node_modules/ngx-toastr/toastr.css",
               "src/styles.scss"
             ],
-            "scripts": ["node_modules/chart.js/dist/Chart.bundle.js"],
+            "scripts": [
+              "node_modules/chart.js/dist/Chart.bundle.js"
+            ],
             "stylePreprocessorOptions": {
               "includePaths": [
                 "src"
             "stylePreprocessorOptions": {
               "includePaths": [
                 "src"
               ]
             },
             "cs": {
               ]
             },
             "cs": {
-              "localize": ["cs"]
+              "localize": [
+                "cs"
+              ]
             },
             "de": {
             },
             "de": {
-              "localize": ["de"]
+              "localize": [
+                "de"
+              ]
             },
             "en-US": {
             },
             "en-US": {
-              "localize": ["en-US"]
+              "localize": [
+                "en-US"
+              ]
             },
             "es": {
             },
             "es": {
-              "localize": ["es"]
+              "localize": [
+                "es"
+              ]
             },
             "fr": {
             },
             "fr": {
-              "localize": ["fr"]
+              "localize": [
+                "fr"
+              ]
             },
             "id": {
             },
             "id": {
-              "localize": ["id"]
+              "localize": [
+                "id"
+              ]
             },
             "it": {
             },
             "it": {
-              "localize": ["it"]
+              "localize": [
+                "it"
+              ]
             },
             "ja": {
             },
             "ja": {
-              "localize": ["ja"]
+              "localize": [
+                "ja"
+              ]
             },
             "ko": {
             },
             "ko": {
-              "localize": ["ko"]
+              "localize": [
+                "ko"
+              ]
             },
             "pl": {
             },
             "pl": {
-              "localize": ["pl"]
+              "localize": [
+                "pl"
+              ]
             },
             "pt": {
             },
             "pt": {
-              "localize": ["pt"]
+              "localize": [
+                "pt"
+              ]
             },
             "zh-Hans": {
             },
             "zh-Hans": {
-              "localize": ["zh-Hans"]
+              "localize": [
+                "zh-Hans"
+              ]
             },
             "zh-Hant": {
             },
             "zh-Hant": {
-              "localize": ["zh-Hant"]
+              "localize": [
+                "zh-Hant"
+              ]
             }
           },
           "defaultConfiguration": ""
             }
           },
           "defaultConfiguration": ""
           }
         },
         "lint": {
           }
         },
         "lint": {
-          "builder": "@angular-devkit/build-angular:tslint",
+          "builder": "@angular-eslint/builder:lint",
           "options": {
           "options": {
-            "tsConfig": [
-              "tsconfig.app.json",
-              "tsconfig.spec.json",
-              "cypress/tsconfig.json"
-            ],
-            "exclude": [
-              "**/node_modules/**"
+            "lintFilePatterns": [
+              "src/**/*.ts",
+              "src/**/*.html"
             ]
           }
         }
             ]
           }
         }
     }
   },
   "cli": {
     }
   },
   "cli": {
-    "analytics": false
+    "analytics": false,
+    "defaultCollection": "@angular-eslint/schematics"
   }
 }
   }
 }
index fae585389f6c723cc725c4e86e9ec340e6222622..1370fff21f6acc2a262a5e81d5b831d8ba48d929 100644 (file)
@@ -1,5 +1,5 @@
 {
 {
-  "baseUrl": "http://localhost:4200/",
+  "baseUrl": "https://localhost:4200/",
   "ignoreTestFiles": [
     "*.po.ts",
     "**/orchestrator/**"
   "ignoreTestFiles": [
     "*.po.ts",
     "**/orchestrator/**"
diff --git a/ceph/src/pybind/mgr/dashboard/frontend/cypress/integration/a11y/dashboard.e2e-spec.ts b/ceph/src/pybind/mgr/dashboard/frontend/cypress/integration/a11y/dashboard.e2e-spec.ts
new file mode 100644 (file)
index 0000000..4feea0d
--- /dev/null
@@ -0,0 +1,27 @@
+import { DashboardPageHelper } from '../ui/dashboard.po';
+
+describe('Dashboard Main Page', { retries: 0 }, () => {
+  const dashboard = new DashboardPageHelper();
+
+  beforeEach(() => {
+    cy.login();
+    Cypress.Cookies.preserveOnce('token');
+    dashboard.navigateTo();
+  });
+
+  describe('Dashboard accessibility', () => {
+    it('should have no accessibility violations', () => {
+      cy.injectAxe();
+      cy.checkAccessibility(
+        {
+          exclude: [['.cd-navbar-main']]
+        },
+        {
+          rules: {
+            'page-has-heading-one': { enabled: false }
+          }
+        }
+      );
+    });
+  });
+});
diff --git a/ceph/src/pybind/mgr/dashboard/frontend/cypress/integration/a11y/navigation.e2e-spec.ts b/ceph/src/pybind/mgr/dashboard/frontend/cypress/integration/a11y/navigation.e2e-spec.ts
new file mode 100644 (file)
index 0000000..2a0c5c5
--- /dev/null
@@ -0,0 +1,21 @@
+import { NavigationPageHelper } from '../ui/navigation.po';
+
+describe('Navigation accessibility', { retries: 0 }, () => {
+  const shared = new NavigationPageHelper();
+
+  beforeEach(() => {
+    cy.login();
+    Cypress.Cookies.preserveOnce('token');
+    shared.navigateTo();
+  });
+
+  it('top-nav should have no accessibility violations', () => {
+    cy.injectAxe();
+    cy.checkAccessibility('.cd-navbar-top');
+  });
+
+  it('sidebar should have no accessibility violations', () => {
+    cy.injectAxe();
+    cy.checkAccessibility('nav[id=sidebar]');
+  });
+});
index e24a3ebc037abbc8b1b2fd619fe89e57e86d3f54..8450763d301a50f320a183ddbf5036c6d7bc1d71 100644 (file)
@@ -13,7 +13,7 @@ export class MirroringPageHelper extends PageHelper {
    */
   @PageHelper.restrictTo(pages.index.url)
   editMirror(name: string, option: string) {
    */
   @PageHelper.restrictTo(pages.index.url)
   editMirror(name: string, option: string) {
-    // Select the pool in the table
+    // Clicks the pool in the table
     this.getFirstTableCell(name).click();
 
     // Clicks the Edit Mode button
     this.getFirstTableCell(name).click();
 
     // Clicks the Edit Mode button
@@ -28,8 +28,5 @@ export class MirroringPageHelper extends PageHelper {
     cy.contains('.modal-dialog', 'Edit pool mirror mode').should('not.exist');
     const val = option.toLowerCase(); // used since entries in table are lower case
     this.getFirstTableCell(val).should('be.visible');
     cy.contains('.modal-dialog', 'Edit pool mirror mode').should('not.exist');
     const val = option.toLowerCase(); // used since entries in table are lower case
     this.getFirstTableCell(val).should('be.visible');
-
-    // unselect the pool in the table
-    this.getFirstTableCell(name).click();
   }
 }
   }
 }
index b769c880a87d0930cedb1dd433c22293dff98e67..9511142ed43d9c9d829222995e7ad087271f10ad 100644 (file)
@@ -88,6 +88,7 @@ export class HostsPageHelper extends PageHelper {
     // Verify labels are added or removed from Labels column
     // First find row with hostname, then find labels in the row
     this.getTableCell(this.columnIndex.hostname, hostname)
     // Verify labels are added or removed from Labels column
     // First find row with hostname, then find labels in the row
     this.getTableCell(this.columnIndex.hostname, hostname)
+      .click()
       .parent()
       .find(`datatable-body-cell:nth-child(${this.columnIndex.labels}) .badge`)
       .should(($ele) => {
       .parent()
       .find(`datatable-body-cell:nth-child(${this.columnIndex.labels}) .badge`)
       .should(($ele) => {
@@ -105,8 +106,8 @@ export class HostsPageHelper extends PageHelper {
   @PageHelper.restrictTo(pages.index.url)
   maintenance(hostname: string, exit = false, force = false) {
     this.clearTableSearchInput();
   @PageHelper.restrictTo(pages.index.url)
   maintenance(hostname: string, exit = false, force = false) {
     this.clearTableSearchInput();
-    this.getTableCell(this.columnIndex.hostname, hostname).click();
     if (force) {
     if (force) {
+      this.getTableCell(this.columnIndex.hostname, hostname).click();
       this.clickActionButton('enter-maintenance');
 
       cy.get('cd-modal').within(() => {
       this.clickActionButton('enter-maintenance');
 
       cy.get('cd-modal').within(() => {
@@ -123,6 +124,7 @@ export class HostsPageHelper extends PageHelper {
     }
     if (exit) {
       this.getTableCell(this.columnIndex.hostname, hostname)
     }
     if (exit) {
       this.getTableCell(this.columnIndex.hostname, hostname)
+        .click()
         .parent()
         .find(`datatable-body-cell:nth-child(${this.columnIndex.status})`)
         .then(($ele) => {
         .parent()
         .find(`datatable-body-cell:nth-child(${this.columnIndex.status})`)
         .then(($ele) => {
@@ -140,6 +142,7 @@ export class HostsPageHelper extends PageHelper {
           expect(status).to.not.include('maintenance');
         });
     } else {
           expect(status).to.not.include('maintenance');
         });
     } else {
+      this.getTableCell(this.columnIndex.hostname, hostname).click();
       this.clickActionButton('enter-maintenance');
 
       this.getTableCell(this.columnIndex.hostname, hostname)
       this.clickActionButton('enter-maintenance');
 
       this.getTableCell(this.columnIndex.hostname, hostname)
@@ -158,10 +161,6 @@ export class HostsPageHelper extends PageHelper {
     this.clickActionButton('start-drain');
     this.checkLabelExists(hostname, ['_no_schedule'], true);
 
     this.clickActionButton('start-drain');
     this.checkLabelExists(hostname, ['_no_schedule'], true);
 
-    // unselect it to avoid colliding with any other selection
-    // in different steps
-    this.getTableCell(this.columnIndex.hostname, hostname).click();
-
     this.clickTab('cd-host-details', hostname, 'Daemons');
     cy.get('cd-host-details').within(() => {
       cy.wait(20000);
     this.clickTab('cd-host-details', hostname, 'Daemons');
     cy.get('cd-host-details').within(() => {
       cy.wait(20000);
index e68d03bd542b0a6708b2c474f1965a0bf227e261..2fc148a1788c38339d379d96c10945f6a1185745 100644 (file)
@@ -39,7 +39,7 @@ describe('OSDs page', () => {
       });
 
       it('should show the correct text for the tab labels', () => {
       });
 
       it('should show the correct text for the tab labels', () => {
-        cy.get('#tabset-osd-details > li > a').then(($tabs) => {
+        cy.get('#tabset-osd-details > a').then(($tabs) => {
           const tabHeadings = $tabs.map((_i, e) => e.textContent).get();
 
           expect(tabHeadings).to.eql([
           const tabHeadings = $tabs.map((_i, e) => e.textContent).get();
 
           expect(tabHeadings).to.eql([
index 481d6bc9b4d3a66d7a0df5b9c3a3fd25e5e45954..c464a3f6cf817d00390aafd96e4666632a97850f 100644 (file)
@@ -39,7 +39,7 @@ export class ServicesPageHelper extends PageHelper {
   addService(
     serviceType: string,
     exist?: boolean,
   addService(
     serviceType: string,
     exist?: boolean,
-    count = '1',
+    count = 1,
     snmpVersion?: string,
     snmpPrivProtocol?: boolean,
     unmanaged = false
     snmpVersion?: string,
     snmpPrivProtocol?: boolean,
     unmanaged = false
@@ -49,7 +49,7 @@ export class ServicesPageHelper extends PageHelper {
       switch (serviceType) {
         case 'rgw':
           cy.get('#service_id').type('foo');
       switch (serviceType) {
         case 'rgw':
           cy.get('#service_id').type('foo');
-          unmanaged ? cy.get('label[for=unmanaged]').click() : cy.get('#count').type(count);
+          unmanaged ? cy.get('label[for=unmanaged]').click() : cy.get('#count').type(String(count));
           break;
 
         case 'ingress':
           break;
 
         case 'ingress':
@@ -65,7 +65,7 @@ export class ServicesPageHelper extends PageHelper {
 
         case 'nfs':
           cy.get('#service_id').type('testnfs');
 
         case 'nfs':
           cy.get('#service_id').type('testnfs');
-          unmanaged ? cy.get('label[for=unmanaged]').click() : cy.get('#count').type(count);
+          unmanaged ? cy.get('label[for=unmanaged]').click() : cy.get('#count').type(String(count));
           break;
 
         case 'snmp-gateway':
           break;
 
         case 'snmp-gateway':
@@ -89,7 +89,7 @@ export class ServicesPageHelper extends PageHelper {
 
         default:
           cy.get('#service_id').type('test');
 
         default:
           cy.get('#service_id').type('test');
-          unmanaged ? cy.get('label[for=unmanaged]').click() : cy.get('#count').type(count);
+          unmanaged ? cy.get('label[for=unmanaged]').click() : cy.get('#count').type(String(count));
           break;
       }
       if (serviceType === 'snmp-gateway') {
           break;
       }
       if (serviceType === 'snmp-gateway') {
@@ -195,10 +195,6 @@ export class ServicesPageHelper extends PageHelper {
     cy.get('cd-service-daemon-list').within(() => {
       this.getTableRow(daemon).click();
       this.clickActionButton(action);
     cy.get('cd-service-daemon-list').within(() => {
       this.getTableRow(daemon).click();
       this.clickActionButton(action);
-
-      // unselect it to avoid colliding with any other selection
-      // in different steps
-      this.getTableRow(daemon).click();
     });
   }
 }
     });
   }
 }
index 575d4013b9376267427107c7fcad3417ee448310..d5b4645b8e7c6f1d826364519afafeea96bdc212 100644 (file)
@@ -158,7 +158,7 @@ And('I should see row {string} does not have {string}', (row: string, options: s
 
 And('I go to the {string} tab', (names: string) => {
   for (const name of names.split(', ')) {
 
 And('I go to the {string} tab', (names: string) => {
   for (const name of names.split(', ')) {
-    cy.contains('.nav.nav-tabs li', name).click();
+    cy.contains('.nav.nav-tabs a', name).click();
   }
 });
 
   }
 });
 
index 93c10833d4ee5f619cced846089910f5b6f149bf..be49fcba099359f62a9c58ba62d00e60e7b3dd93 100644 (file)
@@ -14,8 +14,9 @@ Feature: Cluster expansion host addition
         When I click on "Add" button
         And enter "hostname" "<hostname>"
         And select options "<labels>"
         When I click on "Add" button
         And enter "hostname" "<hostname>"
         And select options "<labels>"
-        And I click on submit button
-        Then I should see a row with "<hostname>"
+        And I click on "Add Host" button
+        Then I should not see the modal
+        And I should see a row with "<hostname>"
         And I should see row "<hostname>" have "<labels>"
 
         Examples:
         And I should see row "<hostname>" have "<labels>"
 
         Examples:
@@ -43,8 +44,9 @@ Feature: Cluster expansion host addition
         Given I am on the "Add Hosts" section
         When I click on "Add" button
         And enter "hostname" "ceph-node-[01-02]"
         Given I am on the "Add Hosts" section
         When I click on "Add" button
         And enter "hostname" "ceph-node-[01-02]"
-        And I click on submit button
-        Then I should see rows with following entries
+        And I click on "Add Host" button
+        Then I should not see the modal
+        And I should see rows with following entries
             | hostname |
             | ceph-node-01 |
             | ceph-node-02 |
             | hostname |
             | ceph-node-01 |
             | ceph-node-02 |
@@ -61,12 +63,12 @@ Feature: Cluster expansion host addition
         When I select a row "<hostname>"
         And I click on "Edit" button from the table actions
         And "add" option "<labels>"
         When I select a row "<hostname>"
         And I click on "Edit" button from the table actions
         And "add" option "<labels>"
-        And I click on submit button
+        And I click on "Edit Host" button
         Then I should see row "<hostname>" have "<labels>"
         When I select a row "<hostname>"
         And I click on "Edit" button from the table actions
         And "remove" option "<labels>"
         Then I should see row "<hostname>" have "<labels>"
         When I select a row "<hostname>"
         And I click on "Edit" button from the table actions
         And "remove" option "<labels>"
-        And I click on submit button
+        And I click on "Edit Host" button
         Then I should see row "<hostname>" does not have "<labels>"
 
         Examples:
         Then I should see row "<hostname>" does not have "<labels>"
 
         Examples:
index 7668cafcf928c23babd75fed2e97c577bacbad87..745a2ec5d18fb95f4ae9df7a077b930e45236f0c 100644 (file)
@@ -9,7 +9,7 @@ describe('Create cluster create services page', () => {
   const createCluster = new CreateClusterWizardHelper();
   const createClusterServicePage = new CreateClusterServicePageHelper();
 
   const createCluster = new CreateClusterWizardHelper();
   const createClusterServicePage = new CreateClusterServicePageHelper();
 
-  const createService = (serviceType: string, serviceName: string, count = '1') => {
+  const createService = (serviceType: string, serviceName: string, count = 1) => {
     cy.get('[aria-label=Create]').first().click();
     createClusterServicePage.addService(serviceType, false, count);
     createClusterServicePage.checkExist(serviceName, true);
     cy.get('[aria-label=Create]').first().click();
     createClusterServicePage.addService(serviceType, false, count);
     createClusterServicePage.checkExist(serviceName, true);
@@ -31,7 +31,7 @@ describe('Create cluster create services page', () => {
     const serviceName = 'mds.test';
 
     it('should create an mds service', () => {
     const serviceName = 'mds.test';
 
     it('should create an mds service', () => {
-      createService('mds', serviceName, '1');
+      createService('mds', serviceName);
     });
 
     it('should edit a service', () => {
     });
 
     it('should edit a service', () => {
index a82be985548569b3445b09fb20211c3942756cf0..24262435da2aaf1cd72949f527ea63be547c6769 100644 (file)
@@ -22,7 +22,7 @@ describe('Create cluster create osds page', () => {
 
   describe('when Orchestrator is available', () => {
     it('should create OSDs', () => {
 
   describe('when Orchestrator is available', () => {
     it('should create OSDs', () => {
-      const hostnames = ['ceph-node-00', 'ceph-node-01', 'ceph-node-02'];
+      const hostnames = ['ceph-node-00', 'ceph-node-01'];
       for (const hostname of hostnames) {
         osds.create('hdd', hostname, true);
 
       for (const hostname of hostnames) {
         osds.create('hdd', hostname, true);
 
index 589cbaa904c23ddc7f6e93ed2a3ea5b789775ca0..565c5da21e05a0164e07bfe453c8a9dacd5f21de 100644 (file)
@@ -1,5 +1,4 @@
 /* tslint:disable*/
 /* tslint:disable*/
-import { Input, ManagerModulesPageHelper } from '../../cluster/mgr-modules.po';
 import { CreateClusterWizardHelper } from '../../cluster/create-cluster.po';
 import { HostsPageHelper } from '../../cluster/hosts.po';
 import { ServicesPageHelper } from '../../cluster/services.po';
 import { CreateClusterWizardHelper } from '../../cluster/create-cluster.po';
 import { HostsPageHelper } from '../../cluster/hosts.po';
 import { ServicesPageHelper } from '../../cluster/services.po';
@@ -9,7 +8,6 @@ describe('when cluster creation is completed', () => {
   const createCluster = new CreateClusterWizardHelper();
   const services = new ServicesPageHelper();
   const hosts = new HostsPageHelper();
   const createCluster = new CreateClusterWizardHelper();
   const services = new ServicesPageHelper();
   const hosts = new HostsPageHelper();
-  const mgrmodules = new ManagerModulesPageHelper();
 
   const hostnames = ['ceph-node-00', 'ceph-node-01', 'ceph-node-02', 'ceph-node-03'];
 
 
   const hostnames = ['ceph-node-00', 'ceph-node-01', 'ceph-node-02', 'ceph-node-03'];
 
@@ -32,7 +30,13 @@ describe('when cluster creation is completed', () => {
       hosts.navigateTo();
     });
 
       hosts.navigateTo();
     });
 
-    it('should check if monitoring stacks are running on the root host', () => {
+    it('should add one more host', () => {
+      hosts.navigateTo('add');
+      hosts.add(hostnames[3]);
+      hosts.checkExist(hostnames[3], true);
+    });
+
+    it('should check if monitoring stacks are running on the root host', { retries: 2 }, () => {
       const monitoringStack = ['alertmanager', 'grafana', 'node-exporter', 'prometheus'];
       hosts.clickTab('cd-host-details', 'ceph-node-00', 'Daemons');
       for (const daemon of monitoringStack) {
       const monitoringStack = ['alertmanager', 'grafana', 'node-exporter', 'prometheus'];
       hosts.clickTab('cd-host-details', 'ceph-node-00', 'Daemons');
       for (const daemon of monitoringStack) {
@@ -42,31 +46,6 @@ describe('when cluster creation is completed', () => {
       }
     });
 
       }
     });
 
-    // avoid creating node-exporter on the newly added host
-    // to favour the host draining process
-    it('should reduce the count for node-exporter', () => {
-      services.editService('node-exporter', '3');
-    });
-
-    // grafana ip address is set to the fqdn by default.
-    // kcli is not working with that, so setting the IP manually.
-    it('should change ip address of grafana', { retries: 2 }, () => {
-      const dashboardArr: Input[] = [
-        {
-          id: 'GRAFANA_API_URL',
-          newValue: 'https://192.168.100.100:3000',
-          oldValue: ''
-        }
-      ];
-      mgrmodules.editMgrModule('dashboard', dashboardArr);
-    });
-
-    it('should add one more host', () => {
-      hosts.navigateTo('add');
-      hosts.add(hostnames[3]);
-      hosts.checkExist(hostnames[3], true);
-    });
-
     it('should have removed "_no_schedule" label', () => {
       for (const hostname of hostnames) {
         hosts.checkLabelExists(hostname, ['_no_schedule'], false);
     it('should have removed "_no_schedule" label', () => {
       for (const hostname of hostnames) {
         hosts.checkLabelExists(hostname, ['_no_schedule'], false);
index 374ecdb0cb6ee8d827d92ff037098cbdcef383cd..6e8c63279c2cd684b0b63acd82e1a6cc177bc78f 100644 (file)
@@ -18,7 +18,7 @@ describe('Host Page', () => {
   // rgw is needed for testing the force maintenance
   it('should create rgw services', () => {
     services.navigateTo('create');
   // rgw is needed for testing the force maintenance
   it('should create rgw services', () => {
     services.navigateTo('create');
-    services.addService('rgw', false, '4');
+    services.addService('rgw', false, 4);
     services.checkExist('rgw.foo', true);
   });
 
     services.checkExist('rgw.foo', true);
   });
 
index ed9ffb9890a1e83de84872d8f847e2841cd296e8..6b497a9a0a1c6b7f67a4597294572b0aec806a96 100644 (file)
@@ -31,14 +31,18 @@ describe('Services page', () => {
     services.checkServiceStatus(mdsDaemonName);
 
     services.daemonAction('mds', 'stop');
     services.checkServiceStatus(mdsDaemonName);
 
     services.daemonAction('mds', 'stop');
-    services.checkServiceStatus(mdsDaemonName, 'stopped');
+    cy.get('cd-service-details').within(() => {
+      services.checkServiceStatus(mdsDaemonName, 'stopped');
+    });
   });
 
   it('should restart a daemon', () => {
     services.checkExist(mdsDaemonName, true);
     services.clickServiceTab(mdsDaemonName, 'Details');
     services.daemonAction('mds', 'restart');
   });
 
   it('should restart a daemon', () => {
     services.checkExist(mdsDaemonName, true);
     services.clickServiceTab(mdsDaemonName, 'Details');
     services.daemonAction('mds', 'restart');
-    services.checkServiceStatus(mdsDaemonName, 'running');
+    cy.get('cd-service-details').within(() => {
+      services.checkServiceStatus(mdsDaemonName, 'running');
+    });
   });
 
   it('should redeploy a daemon', () => {
   });
 
   it('should redeploy a daemon', () => {
@@ -46,9 +50,13 @@ describe('Services page', () => {
     services.clickServiceTab(mdsDaemonName, 'Details');
 
     services.daemonAction('mds', 'stop');
     services.clickServiceTab(mdsDaemonName, 'Details');
 
     services.daemonAction('mds', 'stop');
-    services.checkServiceStatus(mdsDaemonName, 'stopped');
+    cy.get('cd-service-details').within(() => {
+      services.checkServiceStatus(mdsDaemonName, 'stopped');
+    });
     services.daemonAction('mds', 'redeploy');
     services.daemonAction('mds', 'redeploy');
-    services.checkServiceStatus(mdsDaemonName, 'running');
+    cy.get('cd-service-details').within(() => {
+      services.checkServiceStatus(mdsDaemonName, 'running');
+    });
   });
 
   it('should start a daemon', () => {
   });
 
   it('should start a daemon', () => {
@@ -56,9 +64,13 @@ describe('Services page', () => {
     services.clickServiceTab(mdsDaemonName, 'Details');
 
     services.daemonAction('mds', 'stop');
     services.clickServiceTab(mdsDaemonName, 'Details');
 
     services.daemonAction('mds', 'stop');
-    services.checkServiceStatus(mdsDaemonName, 'stopped');
+    cy.get('cd-service-details').within(() => {
+      services.checkServiceStatus(mdsDaemonName, 'stopped');
+    });
     services.daemonAction('mds', 'start');
     services.daemonAction('mds', 'start');
-    services.checkServiceStatus(mdsDaemonName, 'running');
+    cy.get('cd-service-details').within(() => {
+      services.checkServiceStatus(mdsDaemonName, 'running');
+    });
   });
 
   it('should delete an mds service', () => {
   });
 
   it('should delete an mds service', () => {
@@ -67,7 +79,7 @@ describe('Services page', () => {
 
   it('should create and delete snmp-gateway service with version V2c', () => {
     services.navigateTo('create');
 
   it('should create and delete snmp-gateway service with version V2c', () => {
     services.navigateTo('create');
-    services.addService('snmp-gateway', false, '1', 'V2c');
+    services.addService('snmp-gateway', false, 1, 'V2c');
     services.checkExist('snmp-gateway', true);
 
     services.clickServiceTab('snmp-gateway', 'Details');
     services.checkExist('snmp-gateway', true);
 
     services.clickServiceTab('snmp-gateway', 'Details');
@@ -80,7 +92,7 @@ describe('Services page', () => {
 
   it('should create and delete snmp-gateway service with version V3', () => {
     services.navigateTo('create');
 
   it('should create and delete snmp-gateway service with version V3', () => {
     services.navigateTo('create');
-    services.addService('snmp-gateway', false, '1', 'V3', true);
+    services.addService('snmp-gateway', false, 1, 'V3', true);
     services.checkExist('snmp-gateway', true);
 
     services.clickServiceTab('snmp-gateway', 'Details');
     services.checkExist('snmp-gateway', true);
 
     services.clickServiceTab('snmp-gateway', 'Details');
@@ -93,7 +105,7 @@ describe('Services page', () => {
 
   it('should create and delete snmp-gateway service with version V3 and w/o privacy protocol', () => {
     services.navigateTo('create');
 
   it('should create and delete snmp-gateway service with version V3 and w/o privacy protocol', () => {
     services.navigateTo('create');
-    services.addService('snmp-gateway', false, '1', 'V3', false);
+    services.addService('snmp-gateway', false, 1, 'V3', false);
     services.checkExist('snmp-gateway', true);
 
     services.clickServiceTab('snmp-gateway', 'Details');
     services.checkExist('snmp-gateway', true);
 
     services.clickServiceTab('snmp-gateway', 'Details');
index f4b5499f08b27eea6518537ff6426aa36b4eeeb2..a32d6b5bb99b15a8c9bb30b87251c6a2d15d5630 100644 (file)
@@ -36,7 +36,7 @@ describe('nfsExport page', () => {
       services.addService('nfs');
 
       services.checkExist('nfs.testnfs', true);
       services.addService('nfs');
 
       services.checkExist('nfs.testnfs', true);
-      services.getExpandCollapseElement().click();
+      services.clickServiceTab('nfs.testnfs', 'Details');
       services.checkServiceStatus('nfs');
     });
 
       services.checkServiceStatus('nfs');
     });
 
index 4531a70bb7fedfdbc8ea20efcfa313993c0c79b1..e4bbd3f34211938ca2e50ef5c0da2113e37d773e 100644 (file)
@@ -72,11 +72,11 @@ export abstract class PageHelper {
   }
 
   getTabs() {
   }
 
   getTabs() {
-    return cy.get('.nav.nav-tabs li');
+    return cy.get('.nav.nav-tabs a');
   }
 
   getTab(tabName: string) {
   }
 
   getTab(tabName: string) {
-    return cy.contains('.nav.nav-tabs li', tabName);
+    return cy.contains('.nav.nav-tabs a', tabName);
   }
 
   getTabText(index: number) {
   }
 
   getTabText(index: number) {
@@ -261,7 +261,7 @@ export abstract class PageHelper {
     this.waitDataTableToLoad();
 
     this.setPageSize('10');
     this.waitDataTableToLoad();
 
     this.setPageSize('10');
-    cy.get('cd-table .search input').first().clear().type(text);
+    cy.get('[aria-label=search]').first().clear({ force: true }).type(text);
   }
 
   clearTableSearchInput() {
   }
 
   clearTableSearchInput() {
index 98cee470eda993bdde355243cbf78e527aa757ae..7cca96aa8f466dc0340b462231173171d7cd8bf5 100644 (file)
@@ -63,7 +63,7 @@ export class PoolPageHelper extends PageHelper {
     if (!apps || apps.length === 0) {
       return;
     }
     if (!apps || apps.length === 0) {
       return;
     }
-    cy.get('.float-left.mr-2.select-menu-edit').click();
+    cy.get('.float-start.me-2.select-menu-edit').click();
     cy.get('.popover-body').should('be.visible');
     apps.forEach((app) => cy.get('.select-menu-item-content').contains(app).click());
   }
     cy.get('.popover-body').should('be.visible');
     apps.forEach((app) => cy.get('.select-menu-item-content').contains(app).click());
   }
index 29c9e9e10bbb24fdf8e6aabe4a82d5b4a70e38c0..2b337e6341628fc325e8dc63aa7af4b6811c3b45 100644 (file)
@@ -14,4 +14,10 @@ describe('Login page', () => {
 
     login.doLogout();
   });
 
     login.doLogout();
   });
+
+  it('should have no accessibility violations', () => {
+    login.navigateTo();
+    cy.injectAxe();
+    cy.checkA11y();
+  });
 });
 });
index d9294002ba4010eaebd41e33e0141657b1d35861..b1ba01b665d3b0429f78eb63aa57511cd9bd117b 100644 (file)
@@ -19,7 +19,7 @@ module.exports = (on, _config) => {
     log({ message, optional }) {
       optional ? console.log(message, optional) : console.log(message);
       return null;
     log({ message, optional }) {
       optional ? console.log(message, optional) : console.log(message);
       return null;
-    },
+    }
   });
 };
 
   });
 };
 
index 6ff17f9d6978e11f35787a657e2c02ad6222ca59..14b9f82acce9410d5ef5c9a1848355b1704fbfb1 100644 (file)
@@ -4,6 +4,7 @@ declare global {
       login(): void;
       logToConsole(message: string, optional?: any): void;
       text(): Chainable<string>;
       login(): void;
       logToConsole(message: string, optional?: any): void;
       text(): Chainable<string>;
+      checkAccessibility(subject: any, axeOptions?: any, skip?: boolean): void;
     }
   }
 }
     }
   }
 }
@@ -15,6 +16,7 @@ declare global {
 /* tslint:disable*/
 import { CdHelperClass } from '../../src/app/shared/classes/cd-helper.class';
 import { Permissions } from '../../src/app/shared/models/permissions';
 /* tslint:disable*/
 import { CdHelperClass } from '../../src/app/shared/classes/cd-helper.class';
 import { Permissions } from '../../src/app/shared/models/permissions';
+import { table } from 'table';
 /* tslint:enable*/
 let auth: any;
 
 /* tslint:enable*/
 let auth: any;
 
@@ -57,3 +59,32 @@ Cypress.Commands.add('text', { prevSubject: true }, (subject: any) => {
 Cypress.Commands.add('logToConsole', (message: string, optional?: any) => {
   cy.task('log', { message: `(${new Date().toISOString()}) ${message}`, optional });
 });
 Cypress.Commands.add('logToConsole', (message: string, optional?: any) => {
   cy.task('log', { message: `(${new Date().toISOString()}) ${message}`, optional });
 });
+
+// Print cypress-axe violations to the terminal
+function a11yErrorLogger(violations: any) {
+  const violationData = violations.flatMap(({ id, impact, description, nodes }: any) => {
+    return nodes.flatMap(({ html }: any) => {
+      return [
+        ['Test', Cypress.currentTest.title],
+        ['Error', id],
+        ['Impact', impact],
+        ['Description', description],
+        ['Element', html],
+        ['', '']
+      ];
+    });
+  });
+
+  cy.task('log', {
+    message: table(violationData, {
+      header: {
+        alignment: 'left',
+        content: Cypress.spec.relative
+      }
+    })
+  });
+}
+
+Cypress.Commands.add('checkAccessibility', (subject: any, axeOptions?: any, skip?: boolean) => {
+  cy.checkA11y(subject, axeOptions, a11yErrorLogger, skip);
+});
index f2307131aa6268a70b563d6922b1c152ab4e8527..16099815a7dddbaf306fc797195484e8d924d039 100644 (file)
@@ -1,4 +1,5 @@
 import '@applitools/eyes-cypress/commands';
 import '@applitools/eyes-cypress/commands';
+import 'cypress-axe';
 
 import './commands';
 
 
 import './commands';
 
@@ -7,5 +8,11 @@ afterEach(() => {
 });
 
 Cypress.on('uncaught:exception', (err: Error) => {
 });
 
 Cypress.on('uncaught:exception', (err: Error) => {
-  return !err.message.includes('ResizeObserver loop limit exceeded');
+  if (
+    err.message.includes('ResizeObserver loop limit exceeded') ||
+    err.message.includes('api/prometheus/rules')
+  ) {
+    return false;
+  }
+  return true;
 });
 });
index 90f899b57f639d643df7ae0d2eaf67b77ddf4c70..0d1f6b468206ef6ba4ce0215c4a75590c84b9429 100644 (file)
@@ -9,6 +9,7 @@
     "sourceMap": false,
     "types": [
       "cypress",
     "sourceMap": false,
     "types": [
       "cypress",
+      "cypress-axe",
       "@applitools/eyes-cypress"
     ],
     "target": "es6"
       "@applitools/eyes-cypress"
     ],
     "target": "es6"
diff --git a/ceph/src/pybind/mgr/dashboard/frontend/dist/en-US/281.7c1918629ff8b413cc76.js b/ceph/src/pybind/mgr/dashboard/frontend/dist/en-US/281.7c1918629ff8b413cc76.js
deleted file mode 100644 (file)
index ae5e1b6..0000000
+++ /dev/null
@@ -1 +0,0 @@
-"use strict";(self.webpackChunkceph_dashboard=self.webpackChunkceph_dashboard||[]).push([[281],{59281:(ri,Oe,r)=>{r.r(Oe),r.d(Oe,{RgwModule:()=>e_,RoutedRgwModule:()=>ai});var f=r(12057),a=r(24751),w=r(6283),M=r(38549),Ue=r(37496),A=r(79512),O_=r(44466),U_=r(66265),W_=r(23815),u=r.n(W_),Y=r(35758),Me=r(95152),We=r(33394),Ze=r(64762),$e=r(58497),me=r(25917),he=r(19773),Z_=r(96736),$_=r(5304),ge=r(20523),h_=r(93523),e=r(74788);let O=class{constructor(o,_){this.http=o,this.rgwDaemonService=_,this.url="api/rgw/user"}list(){return this.enumerate().pipe((0,he.zg)(o=>o.length>0?(0,Y.D)(o.map(_=>this.get(_))):(0,me.of)([])))}enumerate(){return this.rgwDaemonService.request(o=>this.http.get(this.url,{params:o}))}enumerateEmail(){return this.rgwDaemonService.request(o=>this.http.get(`${this.url}/get_emails`,{params:o}))}get(o){return this.rgwDaemonService.request(_=>this.http.get(`${this.url}/${o}`,{params:_}))}getQuota(o){return this.rgwDaemonService.request(_=>this.http.get(`${this.url}/${o}/quota`,{params:_}))}create(o){return this.rgwDaemonService.request(_=>(u().keys(o).forEach(n=>{_=_.append(n,o[n])}),this.http.post(this.url,null,{params:_})))}update(o,_){return this.rgwDaemonService.request(n=>(u().keys(_).forEach(i=>{n=n.append(i,_[i])}),this.http.put(`${this.url}/${o}`,null,{params:n})))}updateQuota(o,_){return this.rgwDaemonService.request(n=>(u().keys(_).forEach(i=>{n=n.append(i,_[i])}),this.http.put(`${this.url}/${o}/quota`,null,{params:n})))}delete(o){return this.rgwDaemonService.request(_=>this.http.delete(`${this.url}/${o}`,{params:_}))}createSubuser(o,_){return this.rgwDaemonService.request(n=>(u().keys(_).forEach(i=>{n=n.append(i,_[i])}),this.http.post(`${this.url}/${o}/subuser`,null,{params:n})))}deleteSubuser(o,_){return this.rgwDaemonService.request(n=>this.http.delete(`${this.url}/${o}/subuser/${_}`,{params:n}))}addCapability(o,_,n){return this.rgwDaemonService.request(i=>(i=(i=i.append("type",_)).append("perm",n),this.http.post(`${this.url}/${o}/capability`,null,{params:i})))}deleteCapability(o,_,n){return this.rgwDaemonService.request(i=>(i=(i=i.append("type",_)).append("perm",n),this.http.delete(`${this.url}/${o}/capability`,{params:i})))}addS3Key(o,_){return this.rgwDaemonService.request(n=>(n=n.append("key_type","s3"),u().keys(_).forEach(i=>{n=n.append(i,_[i])}),this.http.post(`${this.url}/${o}/key`,null,{params:n})))}deleteS3Key(o,_){return this.rgwDaemonService.request(n=>(n=(n=n.append("key_type","s3")).append("access_key",_),this.http.delete(`${this.url}/${o}/key`,{params:n})))}exists(o){return this.get(o).pipe((0,Z_.h)(!0),(0,$_.K)(_=>(u().isFunction(_.preventDefault)&&_.preventDefault(),(0,me.of)(!1))))}emailExists(o){return o=decodeURIComponent(o),this.enumerateEmail().pipe((0,he.zg)(_=>{const n=u().indexOf(_,o);return(0,me.of)(-1!==n)}))}};O.\u0275fac=function(o){return new(o||O)(e.LFG($e.eN),e.LFG(ge.b))},O.\u0275prov=e.Yz7({token:O,factory:O.\u0275fac,providedIn:"root"}),O=(0,Ze.gn)([h_.o,(0,Ze.w6)("design:paramtypes",[$e.eN,ge.b])],O);var D=r(65862),Ae=r(18001),Ie=r(93614),m=r(77205),ve=r(97161),k=(()=>{return(t=k||(k={})).ENABLED="Enabled",t.DISABLED="Disabled",k;var t})(),B=(()=>{return(t=B||(B={})).ENABLED="Enabled",t.SUSPENDED="Suspended",B;var t})(),J=r(62862),Fe=r(63622),V=r(41582),H=r(56310),q=r(87925),X=r(94276),j=r(82945),I_=r(18372),ee=r(30839),K=r(10545);function v_(t,o){1&t&&(e.TgZ(0,"div",9),e.TgZ(1,"label",35),e.SDv(2,36),e.qZA(),e.TgZ(3,"div",12),e._UZ(4,"input",37),e.qZA(),e.qZA())}function F_(t,o){1&t&&(e.TgZ(0,"span",38),e.SDv(1,39),e.qZA())}function L_(t,o){1&t&&(e.TgZ(0,"span",38),e.SDv(1,40),e.qZA())}function D_(t,o){1&t&&(e.TgZ(0,"span",38),e.SDv(1,41),e.qZA())}function y_(t,o){1&t&&(e.TgZ(0,"span",38),e.SDv(1,42),e.qZA())}function x_(t,o){1&t&&(e.TgZ(0,"span",38),e.SDv(1,43),e.qZA())}function q_(t,o){1&t&&(e.TgZ(0,"span",38),e.SDv(1,44),e.qZA())}function w_(t,o){1&t&&(e.TgZ(0,"span",38),e.SDv(1,45),e.qZA())}function k_(t,o){1&t&&(e.TgZ(0,"span",38),e.SDv(1,46),e.qZA())}function B_(t,o){1&t&&(e.TgZ(0,"option",47),e.SDv(1,48),e.qZA()),2&t&&e.Q6J("ngValue",null)}function H_(t,o){1&t&&(e.TgZ(0,"option",47),e.SDv(1,49),e.qZA()),2&t&&e.Q6J("ngValue",null)}function X_(t,o){if(1&t&&(e.TgZ(0,"option",50),e._uU(1),e.qZA()),2&t){const _=o.$implicit;e.Q6J("value",_),e.xp6(1),e.Oqu(_)}}function K_(t,o){1&t&&(e.TgZ(0,"span",38),e.SDv(1,51),e.qZA())}function z_(t,o){1&t&&(e.TgZ(0,"option",47),e.SDv(1,53),e.qZA()),2&t&&e.Q6J("ngValue",null)}function Q_(t,o){1&t&&(e.TgZ(0,"option",47),e.SDv(1,54),e.qZA()),2&t&&e.Q6J("ngValue",null)}function Y_(t,o){if(1&t&&(e.TgZ(0,"option",50),e._uU(1),e.qZA()),2&t){const _=o.$implicit;e.Q6J("value",_.name),e.xp6(1),e.Oqu(_.description)}}function J_(t,o){1&t&&(e.TgZ(0,"span",38),e.SDv(1,55),e.qZA())}function V_(t,o){if(1&t&&(e.TgZ(0,"select",52),e.YNc(1,z_,2,1,"option",18),e.YNc(2,Q_,2,1,"option",18),e.YNc(3,Y_,2,2,"option",19),e.qZA(),e.YNc(4,J_,2,0,"span",14)),2&t){e.oxw();const _=e.MAs(2),n=e.oxw();e.xp6(1),e.Q6J("ngIf",null===n.placementTargets),e.xp6(1),e.Q6J("ngIf",null!==n.placementTargets),e.xp6(1),e.Q6J("ngForOf",n.placementTargets),e.xp6(1),e.Q6J("ngIf",n.bucketForm.showError("placement-target",_,"required"))}}function j_(t,o){1&t&&(e.ynx(0),e._UZ(1,"input",56),e.BQk())}function et(t,o){if(1&t){const _=e.EpF();e.TgZ(0,"fieldset"),e.TgZ(1,"legend",25),e.SDv(2,57),e.qZA(),e.TgZ(3,"div",9),e.TgZ(4,"div",27),e.TgZ(5,"div",28),e.TgZ(6,"input",58),e.NdJ("change",function(){return e.CHM(_),e.oxw(2).setMfaDeleteValidators()}),e.qZA(),e.TgZ(7,"label",59),e.SDv(8,60),e.qZA(),e.TgZ(9,"cd-helper"),e.TgZ(10,"span"),e.SDv(11,61),e.qZA(),e.qZA(),e.qZA(),e.qZA(),e.qZA(),e.qZA()}}function _t(t,o){1&t&&(e.TgZ(0,"span",38),e.SDv(1,70),e.qZA())}function tt(t,o){if(1&t&&(e.TgZ(0,"div",9),e.TgZ(1,"label",67),e.SDv(2,68),e.qZA(),e.TgZ(3,"div",12),e._UZ(4,"input",69),e.YNc(5,_t,2,0,"span",14),e.qZA(),e.qZA()),2&t){e.oxw(2);const _=e.MAs(2),n=e.oxw();e.xp6(5),e.Q6J("ngIf",n.bucketForm.showError("mfa-token-serial",_,"required"))}}function nt(t,o){1&t&&(e.TgZ(0,"span",38),e.SDv(1,74),e.qZA())}function ot(t,o){if(1&t&&(e.TgZ(0,"div",9),e.TgZ(1,"label",71),e.SDv(2,72),e.qZA(),e.TgZ(3,"div",12),e._UZ(4,"input",73),e.YNc(5,nt,2,0,"span",14),e.qZA(),e.qZA()),2&t){e.oxw(2);const _=e.MAs(2),n=e.oxw();e.xp6(5),e.Q6J("ngIf",n.bucketForm.showError("mfa-token-pin",_,"required"))}}function it(t,o){if(1&t){const _=e.EpF();e.TgZ(0,"fieldset"),e.TgZ(1,"legend",25),e.SDv(2,62),e.qZA(),e.TgZ(3,"div",9),e.TgZ(4,"div",27),e.TgZ(5,"div",28),e.TgZ(6,"input",63),e.NdJ("change",function(){return e.CHM(_),e.oxw(2).setMfaDeleteValidators()}),e.qZA(),e.TgZ(7,"label",64),e.SDv(8,65),e.qZA(),e.TgZ(9,"cd-helper"),e.TgZ(10,"span"),e.SDv(11,66),e.qZA(),e.qZA(),e.qZA(),e.qZA(),e.qZA(),e.YNc(12,tt,6,1,"div",8),e.YNc(13,ot,6,1,"div",8),e.qZA()}if(2&t){const _=e.oxw(2);e.xp6(12),e.Q6J("ngIf",_.areMfaCredentialsRequired()),e.xp6(1),e.Q6J("ngIf",_.areMfaCredentialsRequired())}}function st(t,o){1&t&&(e.TgZ(0,"div",9),e.TgZ(1,"label",75),e.SDv(2,76),e.qZA(),e.TgZ(3,"div",12),e.TgZ(4,"select",77),e.TgZ(5,"option",78),e.SDv(6,79),e.qZA(),e.TgZ(7,"option",80),e.SDv(8,81),e.qZA(),e.qZA(),e.qZA(),e.qZA())}function at(t,o){1&t&&(e.TgZ(0,"span",38),e.SDv(1,86),e.qZA())}function rt(t,o){1&t&&(e.TgZ(0,"span",38),e.SDv(1,87),e.qZA())}function lt(t,o){if(1&t&&(e.TgZ(0,"div",9),e.TgZ(1,"label",82),e.ynx(2),e.SDv(3,83),e.BQk(),e.TgZ(4,"cd-helper"),e.SDv(5,84),e.qZA(),e.qZA(),e.TgZ(6,"div",12),e._UZ(7,"input",85),e.YNc(8,at,2,0,"span",14),e.YNc(9,rt,2,0,"span",14),e.qZA(),e.qZA()),2&t){e.oxw();const _=e.MAs(2),n=e.oxw();e.xp6(8),e.Q6J("ngIf",n.bucketForm.showError("lock_retention_period_days",_,"pattern")),e.xp6(1),e.Q6J("ngIf",n.bucketForm.showError("lock_retention_period_days",_,"lockDays"))}}const Le=function(t){return{required:t}};function ct(t,o){if(1&t){const _=e.EpF();e.TgZ(0,"div",1),e.TgZ(1,"form",2,3),e.TgZ(3,"div",4),e.TgZ(4,"div",5),e.SDv(5,6),e.ALo(6,"titlecase"),e.ALo(7,"upperFirst"),e.qZA(),e.TgZ(8,"div",7),e.YNc(9,v_,5,0,"div",8),e.TgZ(10,"div",9),e.TgZ(11,"label",10),e.SDv(12,11),e.qZA(),e.TgZ(13,"div",12),e._UZ(14,"input",13),e.YNc(15,F_,2,0,"span",14),e.YNc(16,L_,2,0,"span",14),e.YNc(17,D_,2,0,"span",14),e.YNc(18,y_,2,0,"span",14),e.YNc(19,x_,2,0,"span",14),e.YNc(20,q_,2,0,"span",14),e.YNc(21,w_,2,0,"span",14),e.YNc(22,k_,2,0,"span",14),e.qZA(),e.qZA(),e.TgZ(23,"div",9),e.TgZ(24,"label",15),e.SDv(25,16),e.qZA(),e.TgZ(26,"div",12),e.TgZ(27,"select",17),e.YNc(28,B_,2,1,"option",18),e.YNc(29,H_,2,1,"option",18),e.YNc(30,X_,2,2,"option",19),e.qZA(),e.YNc(31,K_,2,0,"span",14),e.qZA(),e.qZA(),e.TgZ(32,"div",9),e.TgZ(33,"label",20),e.SDv(34,21),e.qZA(),e.TgZ(35,"div",12),e.YNc(36,V_,5,4,"ng-template",null,22,e.W1O),e.YNc(38,j_,2,0,"ng-container",23),e.qZA(),e.qZA(),e.YNc(39,et,12,0,"fieldset",24),e.YNc(40,it,14,2,"fieldset",24),e.TgZ(41,"fieldset"),e.TgZ(42,"legend",25),e.SDv(43,26),e.qZA(),e.TgZ(44,"div",9),e.TgZ(45,"div",27),e.TgZ(46,"div",28),e._UZ(47,"input",29),e.TgZ(48,"label",30),e.SDv(49,31),e.qZA(),e.TgZ(50,"cd-helper"),e.TgZ(51,"span"),e.SDv(52,32),e.qZA(),e.qZA(),e.qZA(),e.qZA(),e.qZA(),e.YNc(53,st,9,0,"div",8),e.YNc(54,lt,10,2,"div",8),e.qZA(),e.qZA(),e.TgZ(55,"div",33),e.TgZ(56,"cd-form-button-panel",34),e.NdJ("submitActionEvent",function(){return e.CHM(_),e.oxw().submit()}),e.ALo(57,"titlecase"),e.ALo(58,"upperFirst"),e.qZA(),e.qZA(),e.qZA(),e.qZA(),e.qZA()}if(2&t){const _=e.MAs(2),n=e.MAs(37),i=e.oxw();e.xp6(1),e.Q6J("formGroup",i.bucketForm),e.xp6(6),e.pQV(e.lcZ(6,29,i.action))(e.lcZ(7,31,i.resource)),e.QtT(5),e.xp6(2),e.Q6J("ngIf",i.editing),e.xp6(2),e.Q6J("ngClass",e.VKq(37,Le,!i.editing)),e.xp6(3),e.Q6J("readonly",i.editing)("autofocus",!i.editing),e.xp6(1),e.Q6J("ngIf",i.bucketForm.showError("bid",_,"required")),e.xp6(1),e.Q6J("ngIf",i.bucketForm.showError("bid",_,"bucketNameInvalid")),e.xp6(1),e.Q6J("ngIf",i.bucketForm.showError("bid",_,"bucketNameNotAllowed")),e.xp6(1),e.Q6J("ngIf",i.bucketForm.showError("bid",_,"containsUpperCase")),e.xp6(1),e.Q6J("ngIf",i.bucketForm.showError("bid",_,"lowerCaseOrNumber")),e.xp6(1),e.Q6J("ngIf",i.bucketForm.showError("bid",_,"ipAddress")),e.xp6(1),e.Q6J("ngIf",i.bucketForm.showError("bid",_,"onlyLowerCaseAndNumbers")),e.xp6(1),e.Q6J("ngIf",i.bucketForm.showError("bid",_,"shouldBeInRange")),e.xp6(5),e.Q6J("autofocus",i.editing),e.xp6(1),e.Q6J("ngIf",null===i.owners),e.xp6(1),e.Q6J("ngIf",null!==i.owners),e.xp6(1),e.Q6J("ngForOf",i.owners),e.xp6(1),e.Q6J("ngIf",i.bucketForm.showError("owner",_,"required")),e.xp6(2),e.Q6J("ngClass",e.VKq(39,Le,!i.editing)),e.xp6(5),e.Q6J("ngIf",i.editing)("ngIfElse",n),e.xp6(1),e.Q6J("ngIf",i.editing),e.xp6(1),e.Q6J("ngIf",i.editing),e.xp6(13),e.Q6J("ngIf",i.bucketForm.getValue("lock_enabled")),e.xp6(1),e.Q6J("ngIf",i.bucketForm.getValue("lock_enabled")),e.xp6(2),e.Q6J("form",i.bucketForm)("submitText",e.lcZ(57,33,i.action)+" "+e.lcZ(58,35,i.resource))}}let De=(()=>{class t extends Ie.E{constructor(_,n,i,s,c,d,E,g){super(),this.route=_,this.router=n,this.formBuilder=i,this.rgwBucketService=s,this.rgwSiteService=c,this.rgwUserService=d,this.notificationService=E,this.actionLabels=g,this.editing=!1,this.owners=null,this.placementTargets=[],this.isVersioningAlreadyEnabled=!1,this.isMfaDeleteAlreadyEnabled=!1,this.icons=D.P,this.editing=this.router.url.startsWith(`/rgw/bucket/${A.MQ.EDIT}`),this.action=this.editing?this.actionLabels.EDIT:this.actionLabels.CREATE,this.resource="bucket",this.createForm()}get isVersioningEnabled(){return this.bucketForm.getValue("versioning")}get isMfaDeleteEnabled(){return this.bucketForm.getValue("mfa-delete")}createForm(){const _=this,n=m.h.custom("lockDays",()=>{if(!_.bucketForm||!u().get(_.bucketForm.getRawValue(),"lock_enabled"))return!1;const i=Number(_.bucketForm.getValue("lock_retention_period_days"));return!Number.isInteger(i)||0===i});this.bucketForm=this.formBuilder.group({id:[null],bid:[null,[a.kI.required],this.editing?[]:[m.h.bucketName(),m.h.bucketExistence(!1,this.rgwBucketService)]],owner:[null,[a.kI.required]],"placement-target":[null,this.editing?[]:[a.kI.required]],versioning:[null],"mfa-delete":[null],"mfa-token-serial":[""],"mfa-token-pin":[""],lock_enabled:[{value:!1,disabled:this.editing}],lock_mode:["COMPLIANCE"],lock_retention_period_days:[0,[m.h.number(!1),n]]})}ngOnInit(){const _={owners:this.rgwUserService.enumerate()};this.editing||(_.getPlacementTargets=this.rgwSiteService.get("placement-targets")),this.route.params.subscribe(n=>{if(n.hasOwnProperty("bid")){const i=decodeURIComponent(n.bid);_.getBid=this.rgwBucketService.get(i)}(0,Y.D)(_).subscribe(i=>{if(this.owners=i.owners.sort(),i.getPlacementTargets){const s=i.getPlacementTargets;this.zonegroup=s.zonegroup,u().forEach(s.placement_targets,c=>{c.description=`${c.name} (${"pool"}: ${c.data_pool})`,this.placementTargets.push(c)}),1===this.placementTargets.length&&this.bucketForm.get("placement-target").setValue(this.placementTargets[0].name)}if(i.getBid){const s=i.getBid,c=u().clone(this.bucketForm.getRawValue());let d=u().pick(s,u().keys(c));d.lock_retention_period_days=this.rgwBucketService.getLockDays(s),d["placement-target"]=s.placement_rule,d.versioning=s.versioning===B.ENABLED,d["mfa-delete"]=s.mfa_delete===k.ENABLED,d=u().merge(c,d),this.bucketForm.setValue(d),this.editing&&(this.isVersioningAlreadyEnabled=this.isVersioningEnabled,this.isMfaDeleteAlreadyEnabled=this.isMfaDeleteEnabled,this.setMfaDeleteValidators(),d.lock_enabled&&this.bucketForm.controls.versioning.disable())}this.loadingReady()})})}goToListView(){this.router.navigate(["/rgw/bucket"])}submit(){if(this.bucketForm.pristine)return void this.goToListView();const _=this.bucketForm.value;if(this.editing){const n=this.getVersioningStatus(),i=this.getMfaDeleteStatus();this.rgwBucketService.update(_.bid,_.id,_.owner,n,i,_["mfa-token-serial"],_["mfa-token-pin"],_.lock_mode,_.lock_retention_period_days).subscribe(()=>{this.notificationService.show(Ae.k.success,"Updated Object Gateway bucket '" + _.bid + "'."),this.goToListView()},()=>{this.bucketForm.setErrors({cdSubmitButton:!0})})}else this.rgwBucketService.create(_.bid,_.owner,this.zonegroup,_["placement-target"],_.lock_enabled,_.lock_mode,_.lock_retention_period_days).subscribe(()=>{this.notificationService.show(Ae.k.success,"Created Object Gateway bucket '" + _.bid + "'"),this.goToListView()},()=>{this.bucketForm.setErrors({cdSubmitButton:!0})})}areMfaCredentialsRequired(){return this.isMfaDeleteEnabled!==this.isMfaDeleteAlreadyEnabled||this.isMfaDeleteAlreadyEnabled&&this.isVersioningEnabled!==this.isVersioningAlreadyEnabled}setMfaDeleteValidators(){const _=this.bucketForm.get("mfa-token-serial"),n=this.bucketForm.get("mfa-token-pin");this.areMfaCredentialsRequired()?(_.setValidators(a.kI.required),n.setValidators(a.kI.required)):(_.setValidators(null),n.setValidators(null)),_.updateValueAndValidity(),n.updateValueAndValidity()}getVersioningStatus(){return this.isVersioningEnabled?B.ENABLED:B.SUSPENDED}getMfaDeleteStatus(){return this.isMfaDeleteEnabled?k.ENABLED:k.DISABLED}}return t.\u0275fac=function(_){return new(_||t)(e.Y36(w.gz),e.Y36(w.F0),e.Y36(J.O),e.Y36(Me.o),e.Y36(We.I),e.Y36(O),e.Y36(ve.g),e.Y36(A.p4))},t.\u0275cmp=e.Xpm({type:t,selectors:[["cd-rgw-bucket-form"]],features:[e.qOj],decls:1,vars:1,consts:function(){let o,_,n,i,s,c,d,E,g,C,b,P,G,N,p,U,W,Z,$,h,I,v,F,T,y,x,S,_e,te,ne,oe,ie,se,ae,re,le,ce,de,ue,Re;return o="" + "\ufffd0\ufffd" + " " + "\ufffd1\ufffd" + "",_="Name",n="Name...",i="Owner",s="Placement target",c="Locking",d="Enabled",E="Enables locking for the objects in the bucket. Locking can only be enabled while creating a bucket.",g="Id",C="This field is required.",b="Bucket names can only contain lowercase letters, numbers, periods and hyphens.",P="The chosen name is already in use.",G="Bucket names must not contain uppercase characters or underscores.",N="Each label must start and end with a lowercase letter or a number.",p="Bucket names cannot be formatted as IP address.",U="Bucket labels cannot be empty and can only contain lowercase letters, numbers and hyphens.",W="Bucket names must be 3 to 63 characters long.",Z="Loading...",$="-- Select a user --",h="This field is required.",I="Loading...",v="-- Select a placement target --",F="This field is required.",T="Versioning",y="Enabled",x="Enables versioning for the objects in the bucket.",S="Multi-Factor Authentication",_e="Delete enabled",te="Enables MFA (multi-factor authentication) Delete, which requires additional authentication for changing the bucket versioning state.",ne="Token Serial Number",oe="This field is required.",ie="Token PIN",se="This field is required.",ae="Mode",re="Compliance",le="Governance",ce="Days",de="The number of days that you want to specify for the default retention period that will be applied to new objects placed in this bucket.",ue="The entered value must be a positive integer.",Re="Retention Days must be a positive integer.",[["class","cd-col-form",4,"cdFormLoading"],[1,"cd-col-form"],["name","bucketForm","novalidate","",3,"formGroup"],["frm","ngForm"],[1,"card"],[1,"card-header"],o,[1,"card-body"],["class","form-group row",4,"ngIf"],[1,"form-group","row"],["for","bid",1,"cd-col-form-label",3,"ngClass"],_,[1,"cd-col-form-input"],["id","bid","name","bid","type","text","placeholder",n,"formControlName","bid",1,"form-control",3,"readonly","autofocus"],["class","invalid-feedback",4,"ngIf"],["for","owner",1,"cd-col-form-label","required"],i,["id","owner","name","owner","formControlName","owner",1,"form-control",3,"autofocus"],[3,"ngValue",4,"ngIf"],[3,"value",4,"ngFor","ngForOf"],["for","placement-target",1,"cd-col-form-label",3,"ngClass"],s,["placementTargetSelect",""],[4,"ngIf","ngIfElse"],[4,"ngIf"],[1,"cd-header"],c,[1,"cd-col-form-offset"],[1,"custom-control","custom-checkbox"],["id","lock_enabled","formControlName","lock_enabled","type","checkbox",1,"custom-control-input"],["for","lock_enabled",1,"custom-control-label"],d,E,[1,"card-footer"],["wrappingClass","text-right",3,"form","submitText","submitActionEvent"],["for","id",1,"cd-col-form-label"],g,["id","id","name","id","type","text","formControlName","id","readonly","",1,"form-control"],[1,"invalid-feedback"],C,b,P,G,N,p,U,W,[3,"ngValue"],Z,$,[3,"value"],h,["id","placement-target","name","placement-target","formControlName","placement-target",1,"form-control"],I,v,F,["id","placement-target","name","placement-target","formControlName","placement-target","type","text","readonly","",1,"form-control"],T,["type","checkbox","id","versioning","name","versioning","formControlName","versioning",1,"custom-control-input",3,"change"],["for","versioning",1,"custom-control-label"],y,x,S,["type","checkbox","id","mfa-delete","name","mfa-delete","formControlName","mfa-delete",1,"custom-control-input",3,"change"],["for","mfa-delete",1,"custom-control-label"],_e,te,["for","mfa-token-serial",1,"cd-col-form-label"],ne,["type","text","id","mfa-token-serial","name","mfa-token-serial","formControlName","mfa-token-serial",1,"form-control"],oe,["for","mfa-token-pin",1,"cd-col-form-label"],ie,["type","text","id","mfa-token-pin","name","mfa-token-pin","formControlName","mfa-token-pin",1,"form-control"],se,["for","lock_mode",1,"cd-col-form-label"],ae,["formControlName","lock_mode","name","lock_mode","id","lock_mode",1,"form-control"],["value","COMPLIANCE"],re,["value","GOVERNANCE"],le,["for","lock_retention_period_days",1,"cd-col-form-label"],ce,de,["type","number","id","lock_retention_period_days","formControlName","lock_retention_period_days","min","0",1,"form-control"],ue,Re]},template:function(_,n){1&_&&e.YNc(0,ct,59,41,"div",0),2&_&&e.Q6J("cdFormLoading",n.loading)},directives:[Fe.y,a._Y,a.JL,V.V,a.sg,f.O5,H.P,f.mk,q.o,a.Fj,X.b,a.JJ,a.u,j.U,a.EJ,f.sg,a.Wl,I_.S,ee.p,a.YN,a.Kr,a.wV,a.qQ],pipes:[f.rS,K.m],styles:[""]}),t})();var ye=r(18891),be=r(68136),xe=r(30982),z=r(35905),Pe=r(68774),qe=r(47557),we=r(66369),Q=r(51847),Ee=r(74937),Te=r(63285),ke=r(94928),dt=r(96102),Be=r(68962);function ut(t,o){1&t&&(e.TgZ(0,"td"),e.SDv(1,24),e.qZA())}function Rt(t,o){if(1&t&&(e.TgZ(0,"td"),e._uU(1),e.ALo(2,"dimless"),e.qZA()),2&t){const _=e.oxw(3);e.xp6(1),e.hij(" ",e.lcZ(2,1,_.selection.bucket_quota.max_size)," ")}}function gt(t,o){1&t&&(e.TgZ(0,"td"),e.SDv(1,25),e.qZA())}function Et(t,o){if(1&t&&(e.TgZ(0,"td"),e._uU(1),e.qZA()),2&t){const _=e.oxw(3);e.xp6(1),e.hij(" ",_.selection.bucket_quota.max_objects," ")}}function Tt(t,o){if(1&t&&(e.TgZ(0,"div"),e.TgZ(1,"legend"),e.SDv(2,20),e.qZA(),e.TgZ(3,"table",1),e.TgZ(4,"tbody"),e.TgZ(5,"tr"),e.TgZ(6,"td",2),e.SDv(7,21),e.qZA(),e.TgZ(8,"td",4),e._uU(9),e.ALo(10,"booleanText"),e.qZA(),e.qZA(),e.TgZ(11,"tr"),e.TgZ(12,"td",5),e.SDv(13,22),e.qZA(),e.YNc(14,ut,2,0,"td",0),e.YNc(15,Rt,3,3,"td",0),e.qZA(),e.TgZ(16,"tr"),e.TgZ(17,"td",5),e.SDv(18,23),e.qZA(),e.YNc(19,gt,2,0,"td",0),e.YNc(20,Et,2,1,"td",0),e.qZA(),e.qZA(),e.qZA(),e.qZA()),2&t){const _=e.oxw(2);e.xp6(9),e.Oqu(e.lcZ(10,5,_.selection.bucket_quota.enabled)),e.xp6(5),e.Q6J("ngIf",_.selection.bucket_quota.max_size<=-1),e.xp6(1),e.Q6J("ngIf",_.selection.bucket_quota.max_size>-1),e.xp6(4),e.Q6J("ngIf",_.selection.bucket_quota.max_objects<=-1),e.xp6(1),e.Q6J("ngIf",_.selection.bucket_quota.max_objects>-1)}}function St(t,o){if(1&t&&(e.ynx(0),e.TgZ(1,"tr"),e.TgZ(2,"td",5),e.SDv(3,26),e.qZA(),e.TgZ(4,"td"),e._uU(5),e.qZA(),e.qZA(),e.TgZ(6,"tr"),e.TgZ(7,"td",5),e.SDv(8,27),e.qZA(),e.TgZ(9,"td"),e._uU(10),e.qZA(),e.qZA(),e.BQk()),2&t){const _=e.oxw(2);e.xp6(5),e.Oqu(_.selection.lock_mode),e.xp6(5),e.Oqu(_.selection.lock_retention_period_days)}}function ft(t,o){if(1&t&&(e.ynx(0),e.TgZ(1,"table",1),e.TgZ(2,"tbody"),e.TgZ(3,"tr"),e.TgZ(4,"td",2),e.SDv(5,3),e.qZA(),e.TgZ(6,"td",4),e._uU(7),e.qZA(),e.qZA(),e.TgZ(8,"tr"),e.TgZ(9,"td",5),e.SDv(10,6),e.qZA(),e.TgZ(11,"td"),e._uU(12),e.qZA(),e.qZA(),e.TgZ(13,"tr"),e.TgZ(14,"td",5),e.SDv(15,7),e.qZA(),e.TgZ(16,"td"),e._uU(17),e.qZA(),e.qZA(),e.TgZ(18,"tr"),e.TgZ(19,"td",5),e.SDv(20,8),e.qZA(),e.TgZ(21,"td"),e._uU(22),e.qZA(),e.qZA(),e.TgZ(23,"tr"),e.TgZ(24,"td",5),e.SDv(25,9),e.qZA(),e.TgZ(26,"td"),e._uU(27),e.qZA(),e.qZA(),e.TgZ(28,"tr"),e.TgZ(29,"td",5),e.SDv(30,10),e.qZA(),e.TgZ(31,"td"),e._uU(32),e.qZA(),e.qZA(),e.TgZ(33,"tr"),e.TgZ(34,"td",5),e.SDv(35,11),e.qZA(),e.TgZ(36,"td"),e._uU(37),e.qZA(),e.qZA(),e.TgZ(38,"tr"),e.TgZ(39,"td",5),e.SDv(40,12),e.qZA(),e.TgZ(41,"td"),e._uU(42),e.qZA(),e.qZA(),e.TgZ(43,"tr"),e.TgZ(44,"td",5),e.SDv(45,13),e.qZA(),e.TgZ(46,"td"),e._uU(47),e.qZA(),e.qZA(),e.TgZ(48,"tr"),e.TgZ(49,"td",5),e.SDv(50,14),e.qZA(),e.TgZ(51,"td"),e._uU(52),e.ALo(53,"cdDate"),e.qZA(),e.qZA(),e.TgZ(54,"tr"),e.TgZ(55,"td",5),e.SDv(56,15),e.qZA(),e.TgZ(57,"td"),e._uU(58),e.qZA(),e.qZA(),e.TgZ(59,"tr"),e.TgZ(60,"td",5),e.SDv(61,16),e.qZA(),e.TgZ(62,"td"),e._uU(63),e.qZA(),e.qZA(),e.TgZ(64,"tr"),e.TgZ(65,"td",5),e.SDv(66,17),e.qZA(),e.TgZ(67,"td"),e._uU(68),e.qZA(),e.qZA(),e.qZA(),e.qZA(),e.YNc(69,Tt,21,7,"div",0),e.TgZ(70,"legend"),e.SDv(71,18),e.qZA(),e.TgZ(72,"table",1),e.TgZ(73,"tbody"),e.TgZ(74,"tr"),e.TgZ(75,"td",2),e.SDv(76,19),e.qZA(),e.TgZ(77,"td",4),e._uU(78),e.ALo(79,"booleanText"),e.qZA(),e.qZA(),e.YNc(80,St,11,2,"ng-container",0),e.qZA(),e.qZA(),e.BQk()),2&t){const _=e.oxw();e.xp6(7),e.Oqu(_.selection.bid),e.xp6(5),e.Oqu(_.selection.id),e.xp6(5),e.Oqu(_.selection.owner),e.xp6(5),e.Oqu(_.selection.index_type),e.xp6(5),e.Oqu(_.selection.placement_rule),e.xp6(5),e.Oqu(_.selection.marker),e.xp6(5),e.Oqu(_.selection.max_marker),e.xp6(5),e.Oqu(_.selection.ver),e.xp6(5),e.Oqu(_.selection.master_ver),e.xp6(5),e.Oqu(e.lcZ(53,16,_.selection.mtime)),e.xp6(6),e.Oqu(_.selection.zonegroup),e.xp6(5),e.Oqu(_.selection.versioning),e.xp6(5),e.Oqu(_.selection.mfa_delete),e.xp6(1),e.Q6J("ngIf",_.selection.bucket_quota),e.xp6(9),e.Oqu(e.lcZ(79,18,_.selection.lock_enabled)),e.xp6(2),e.Q6J("ngIf",_.selection.lock_enabled)}}let Ct=(()=>{class t{constructor(_){this.rgwBucketService=_}ngOnChanges(){this.selection&&this.rgwBucketService.get(this.selection.bid).subscribe(_=>{_.lock_retention_period_days=this.rgwBucketService.getLockDays(_),this.selection=_})}}return t.\u0275fac=function(_){return new(_||t)(e.Y36(Me.o))},t.\u0275cmp=e.Xpm({type:t,selectors:[["cd-rgw-bucket-details"]],inputs:{selection:"selection"},features:[e.TTD],decls:1,vars:1,consts:function(){let o,_,n,i,s,c,d,E,g,C,b,P,G,N,p,U,W,Z,$,h,I,v,F;return o="Name",_="ID",n="Owner",i="Index type",s="Placement rule",c="Marker",d="Maximum marker",E="Version",g="Master version",C="Modification time",b="Zonegroup",P="Versioning",G="MFA Delete",N="Locking",p="Enabled",U="Bucket quota",W="Enabled",Z="Maximum size",$="Maximum objects",h="Unlimited",I="Unlimited",v="Mode",F="Days",[[4,"ngIf"],[1,"table","table-striped","table-bordered"],[1,"bold","w-25"],o,[1,"w-75"],[1,"bold"],_,n,i,s,c,d,E,g,C,b,P,G,N,p,U,W,Z,$,h,I,v,F]},template:function(_,n){1&_&&e.YNc(0,ft,81,20,"ng-container",0),2&_&&e.Q6J("ngIf",n.selection)},directives:[f.O5],pipes:[dt.N,Be.T,we.n],styles:["table[_ngcontent-%COMP%]{table-layout:fixed}table[_ngcontent-%COMP%]   td[_ngcontent-%COMP%]{word-wrap:break-word}"]}),t})();var He=r(60251);const pt=["bucketSizeTpl"],Mt=["bucketObjectTpl"];function mt(t,o){if(1&t&&e._UZ(0,"cd-usage-bar",8),2&t){const _=e.oxw().row;e.Q6J("total",_.bucket_quota.max_size)("used",_.bucket_size)}}function At(t,o){1&t&&e.SDv(0,9)}function bt(t,o){if(1&t&&(e.YNc(0,mt,1,2,"cd-usage-bar",6),e.YNc(1,At,1,0,"ng-template",null,7,e.W1O)),2&t){const _=o.row,n=e.MAs(2);e.Q6J("ngIf",_.bucket_quota.max_size>0&&_.bucket_quota.enabled)("ngIfElse",n)}}function Pt(t,o){if(1&t&&e._UZ(0,"cd-usage-bar",12),2&t){const _=e.oxw().row;e.Q6J("total",_.bucket_quota.max_objects)("used",_.num_objects)("isBinary",!1)}}function Gt(t,o){1&t&&e.SDv(0,13)}function Nt(t,o){if(1&t&&(e.YNc(0,Pt,1,3,"cd-usage-bar",10),e.YNc(1,Gt,1,0,"ng-template",null,11,e.W1O)),2&t){const _=o.row,n=e.MAs(2);e.Q6J("ngIf",_.bucket_quota.max_objects>0&&_.bucket_quota.enabled)("ngIfElse",n)}}let Ut=(()=>{class t extends be.o{constructor(_,n,i,s,c,d,E,g){super(g),this.authStorageService=_,this.dimlessBinaryPipe=n,this.dimlessPipe=i,this.rgwBucketService=s,this.modalService=c,this.urlBuilder=d,this.actionLabels=E,this.ngZone=g,this.columns=[],this.buckets=[],this.selection=new Pe.r}ngOnInit(){this.permission=this.authStorageService.getPermissions().rgw,this.columns=[{name:"Name",prop:"bid",flexGrow:2},{name:"Owner",prop:"owner",flexGrow:2.5},{name:"Used Capacity",prop:"bucket_size",flexGrow:.6,pipe:this.dimlessBinaryPipe},{name:"Capacity Limit %",prop:"size_usage",cellTemplate:this.bucketSizeTpl,flexGrow:.8},{name:"Objects",prop:"num_objects",flexGrow:.6,pipe:this.dimlessPipe},{name:"Object Limit %",prop:"object_usage",cellTemplate:this.bucketObjectTpl,flexGrow:.8}];const _=()=>this.selection.first()&&`${encodeURIComponent(this.selection.first().bid)}`;this.tableActions=[{permission:"create",icon:D.P.add,routerLink:()=>this.urlBuilder.getCreate(),name:this.actionLabels.CREATE,canBePrimary:c=>!c.hasSelection},{permission:"update",icon:D.P.edit,routerLink:()=>this.urlBuilder.getEdit(_()),name:this.actionLabels.EDIT},{permission:"delete",icon:D.P.destroy,click:()=>this.deleteAction(),disable:()=>!this.selection.hasSelection,name:this.actionLabels.DELETE,canBePrimary:c=>c.hasMultiSelection}],this.setTableRefreshTimeout()}transformBucketData(){u().forEach(this.buckets,_=>{const n=_.bucket_quota.max_size,i=_.bucket_quota.max_objects;_.bucket_size=0,_.num_objects=0,u().isEmpty(_.usage)||(_.bucket_size=_.usage["rgw.main"].size_actual,_.num_objects=_.usage["rgw.main"].num_objects),_.size_usage=n>0?_.bucket_size/n:void 0,_.object_usage=i>0?_.num_objects/i:void 0})}getBucketList(_){this.setTableRefreshTimeout(),this.rgwBucketService.list(!0).subscribe(n=>{this.buckets=n,this.transformBucketData()},()=>{_.error()})}updateSelection(_){this.selection=_}deleteAction(){this.modalService.show(xe.M,{itemDescription:this.selection.hasSingleSelection?"bucket":"buckets",itemNames:this.selection.selected.map(_=>_.bid),submitActionObservable:()=>new ye.y(_=>{(0,Y.D)(this.selection.selected.map(n=>this.rgwBucketService.delete(n.bid))).subscribe({error:n=>{_.error(n),this.table.refreshBtn()},complete:()=>{_.complete(),this.table.refreshBtn()}})})})}}return t.\u0275fac=function(_){return new(_||t)(e.Y36(Ee.j),e.Y36(qe.$),e.Y36(we.n),e.Y36(Me.o),e.Y36(Te.Z),e.Y36(Q.F),e.Y36(A.p4),e.Y36(e.R0b))},t.\u0275cmp=e.Xpm({type:t,selectors:[["cd-rgw-bucket-list"]],viewQuery:function(_,n){if(1&_&&(e.Gf(z.a,7),e.Gf(pt,7),e.Gf(Mt,7)),2&_){let i;e.iGM(i=e.CRH())&&(n.table=i.first),e.iGM(i=e.CRH())&&(n.bucketSizeTpl=i.first),e.iGM(i=e.CRH())&&(n.bucketObjectTpl=i.first)}},features:[e._Bn([{provide:Q.F,useValue:new Q.F("rgw/bucket")}]),e.qOj],decls:8,vars:9,consts:function(){let o,_;return o="No Limit",_="No Limit",[["columnMode","flex","selectionType","multiClick","identifier","bid",3,"autoReload","data","columns","hasDetails","status","setExpandedRow","updateSelection","fetchData"],["table",""],[1,"table-actions",3,"permission","selection","tableActions"],["cdTableDetail","",3,"selection"],["bucketSizeTpl",""],["bucketObjectTpl",""],[3,"total","used",4,"ngIf","ngIfElse"],["noSizeQuota",""],[3,"total","used"],o,[3,"total","used","isBinary",4,"ngIf","ngIfElse"],["noObjectQuota",""],[3,"total","used","isBinary"],_]},template:function(_,n){1&_&&(e.TgZ(0,"cd-table",0,1),e.NdJ("setExpandedRow",function(s){return n.setExpandedRow(s)})("updateSelection",function(s){return n.updateSelection(s)})("fetchData",function(s){return n.getBucketList(s)}),e._UZ(2,"cd-table-actions",2),e._UZ(3,"cd-rgw-bucket-details",3),e.qZA(),e.YNc(4,bt,3,2,"ng-template",null,4,e.W1O),e.YNc(6,Nt,3,2,"ng-template",null,5,e.W1O)),2&_&&(e.Q6J("autoReload",!1)("data",n.buckets)("columns",n.columns)("hasDetails",!0)("status",n.tableStatus),e.xp6(2),e.Q6J("permission",n.permission)("selection",n.selection)("tableActions",n.tableActions),e.xp6(1),e.Q6J("selection",n.expandedRow))},directives:[z.a,ke.K,Ct,f.O5,He.O],styles:[""]}),t})();var Wt=r(58111),Xe=r(59376),Zt=r(61350),$t=r(98056),Ke=r(76317);function ht(t,o){if(1&t){const _=e.EpF();e.TgZ(0,"cd-table-key-value",11),e.NdJ("fetchData",function(){return e.CHM(_),e.oxw(2).getMetaData()}),e.qZA()}if(2&t){const _=e.oxw(2);e.Q6J("data",_.metadata)}}function It(t,o){if(1&t&&e._UZ(0,"cd-table-performance-counter",12),2&t){const _=e.oxw(2);e.Q6J("serviceId",_.serviceMapId)}}function vt(t,o){if(1&t&&e._UZ(0,"cd-grafana",15),2&t){const _=e.oxw(3);e.Q6J("grafanaPath","rgw-instance-detail?var-rgw_servers=rgw."+_.serviceId)("type","metrics")}}function Ft(t,o){1&t&&(e.TgZ(0,"li",13),e.TgZ(1,"a",4),e.SDv(2,14),e.qZA(),e.YNc(3,vt,1,2,"ng-template",6),e.qZA())}function Lt(t,o){if(1&t&&(e.ynx(0),e.TgZ(1,"ul",1,2),e.TgZ(3,"li",3),e.TgZ(4,"a",4),e.SDv(5,5),e.qZA(),e.YNc(6,ht,1,1,"ng-template",6),e.qZA(),e.TgZ(7,"li",7),e.TgZ(8,"a",4),e.SDv(9,8),e.qZA(),e.YNc(10,It,1,1,"ng-template",6),e.qZA(),e.YNc(11,Ft,4,0,"li",9),e.qZA(),e._UZ(12,"div",10),e.BQk()),2&t){const _=e.MAs(2),n=e.oxw();e.xp6(11),e.Q6J("ngIf",n.grafanaPermission.read),e.xp6(1),e.Q6J("ngbNavOutlet",_)}}let Dt=(()=>{class t{constructor(_,n){this.rgwDaemonService=_,this.authStorageService=n,this.serviceId="",this.serviceMapId="",this.grafanaPermission=this.authStorageService.getPermissions().grafana}ngOnChanges(){this.selection&&(this.serviceId=this.selection.id,this.serviceMapId=this.selection.service_map_id)}getMetaData(){u().isEmpty(this.serviceId)||this.rgwDaemonService.get(this.serviceId).subscribe(_=>{this.metadata=_.rgw_metadata})}}return t.\u0275fac=function(_){return new(_||t)(e.Y36(ge.b),e.Y36(Ee.j))},t.\u0275cmp=e.Xpm({type:t,selectors:[["cd-rgw-daemon-details"]],inputs:{selection:"selection"},features:[e.TTD],decls:1,vars:1,consts:function(){let o,_,n;return o="Details",_="Performance Counters",n="Performance Details",[[4,"ngIf"],["ngbNav","","cdStatefulTab","rgw-daemon-details",1,"nav-tabs"],["nav","ngbNav"],["ngbNavItem","details"],["ngbNavLink",""],o,["ngbNavContent",""],["ngbNavItem","performance-counters"],_,["ngbNavItem","performance-details",4,"ngIf"],[3,"ngbNavOutlet"],[3,"data","fetchData"],["serviceType","rgw",3,"serviceId"],["ngbNavItem","performance-details"],n,["uid","x5ARzZtmk","grafanaStyle","one",3,"grafanaPath","type"]]},template:function(_,n){1&_&&e.YNc(0,Lt,13,2,"ng-container",0),2&_&&e.Q6J("ngIf",n.selection)},directives:[f.O5,M.Pz,Xe.m,M.nv,M.Vx,M.uN,M.tO,Zt.b,$t.p,Ke.F],styles:[""]}),t})();function yt(t,o){if(1&t){const _=e.EpF();e.TgZ(0,"cd-table",8),e.NdJ("setExpandedRow",function(i){return e.CHM(_),e.oxw().setExpandedRow(i)})("fetchData",function(i){return e.CHM(_),e.oxw().getDaemonList(i)}),e._UZ(1,"cd-rgw-daemon-details",9),e.qZA()}if(2&t){const _=e.oxw();e.Q6J("data",_.daemons)("columns",_.columns)("hasDetails",!0),e.xp6(1),e.Q6J("selection",_.expandedRow)}}function xt(t,o){1&t&&e._UZ(0,"cd-grafana",11),2&t&&e.Q6J("grafanaPath","rgw-overview?")("type","metrics")}function qt(t,o){1&t&&(e.TgZ(0,"li",2),e.TgZ(1,"a",3),e.SDv(2,10),e.qZA(),e.YNc(3,xt,1,2,"ng-template",5),e.qZA())}function wt(t,o){1&t&&e._UZ(0,"cd-grafana",13),2&t&&e.Q6J("grafanaPath","radosgw-sync-overview?")("type","metrics")}function kt(t,o){1&t&&(e.TgZ(0,"li",2),e.TgZ(1,"a",3),e.SDv(2,12),e.qZA(),e.YNc(3,wt,1,2,"ng-template",5),e.qZA())}let Bt=(()=>{class t extends be.o{constructor(_,n,i,s){super(),this.rgwDaemonService=_,this.authStorageService=n,this.cephShortVersionPipe=i,this.rgwSiteService=s,this.columns=[],this.daemons=[],this.updateDaemons=c=>{this.daemons=c}}ngOnInit(){this.grafanaPermission=this.authStorageService.getPermissions().grafana,this.columns=[{name:"ID",prop:"id",flexGrow:2},{name:"Hostname",prop:"server_hostname",flexGrow:2},{name:"Zone",prop:"zone_name",flexGrow:2},{name:"Zone Group",prop:"zonegroup_name",flexGrow:2},{name:"Realm",prop:"realm_name",flexGrow:2},{name:"Version",prop:"version",flexGrow:1,pipe:this.cephShortVersionPipe}],this.rgwSiteService.get("realms").subscribe(_=>this.isMultiSite=_.length>0)}getDaemonList(_){this.rgwDaemonService.list().subscribe(this.updateDaemons,()=>{_.error()})}}return t.\u0275fac=function(_){return new(_||t)(e.Y36(ge.b),e.Y36(Ee.j),e.Y36(Wt.F),e.Y36(We.I))},t.\u0275cmp=e.Xpm({type:t,selectors:[["cd-rgw-daemon-list"]],features:[e.qOj],decls:9,vars:3,consts:function(){let o,_,n;return o="Daemons List",_="Overall Performance",n="Sync Performance",[["ngbNav","",1,"nav-tabs"],["nav","ngbNav"],["ngbNavItem",""],["ngbNavLink",""],o,["ngbNavContent",""],["ngbNavItem","",4,"ngIf"],[3,"ngbNavOutlet"],["columnMode","flex",3,"data","columns","hasDetails","setExpandedRow","fetchData"],["cdTableDetail","",3,"selection"],_,["uid","WAkugZpiz","grafanaStyle","two",3,"grafanaPath","type"],n,["uid","rgw-sync-overview","grafanaStyle","two",3,"grafanaPath","type"]]},template:function(_,n){if(1&_&&(e.TgZ(0,"ul",0,1),e.TgZ(2,"li",2),e.TgZ(3,"a",3),e.SDv(4,4),e.qZA(),e.YNc(5,yt,2,4,"ng-template",5),e.qZA(),e.YNc(6,qt,4,0,"li",6),e.YNc(7,kt,4,0,"li",6),e.qZA(),e._UZ(8,"div",7)),2&_){const i=e.MAs(1);e.xp6(6),e.Q6J("ngIf",n.grafanaPermission.read),e.xp6(1),e.Q6J("ngIf",n.grafanaPermission.read&&n.isMultiSite),e.xp6(1),e.Q6J("ngbNavOutlet",i)}},directives:[M.Pz,M.nv,M.Vx,M.uN,f.O5,M.tO,z.a,Dt,Ke.F],styles:[""]}),t})();var Ht=r(58071),Ge=r(28211),Se=(()=>{return(t=Se||(Se={})).USERS="users",t.BUCKETS="buckets",t.METADATA="metadata",t.USAGE="usage",t.ZONE="zone",Se;var t})();let ze=(()=>{class t{static getAll(){return Object.values(t.capabilities)}}return t.capabilities=Se,t})();var fe=r(60312);function Xt(t,o){1&t&&e._UZ(0,"input",22),2&t&&e.Q6J("readonly",!0)}function Kt(t,o){1&t&&(e.TgZ(0,"option",17),e.SDv(1,25),e.qZA()),2&t&&e.Q6J("ngValue",null)}function zt(t,o){if(1&t&&(e.TgZ(0,"option",26),e._uU(1),e.qZA()),2&t){const _=o.$implicit;e.Q6J("value",_),e.xp6(1),e.Oqu(_)}}function Qt(t,o){if(1&t&&(e.TgZ(0,"select",23),e.YNc(1,Kt,2,1,"option",24),e.YNc(2,zt,2,2,"option",19),e.qZA()),2&t){const _=e.oxw();e.xp6(1),e.Q6J("ngIf",null!==_.types),e.xp6(1),e.Q6J("ngForOf",_.types)}}function Yt(t,o){1&t&&(e.TgZ(0,"span",27),e.SDv(1,28),e.qZA())}function Jt(t,o){if(1&t&&(e.TgZ(0,"option",26),e._uU(1),e.qZA()),2&t){const _=o.$implicit;e.Q6J("value",_),e.xp6(1),e.hij(" ",_," ")}}function Vt(t,o){1&t&&(e.TgZ(0,"span",27),e.SDv(1,29),e.qZA())}const jt=function(t){return{required:t}},en=function(){return["read","write","*"]};let _n=(()=>{class t{constructor(_,n,i){this.formBuilder=_,this.activeModal=n,this.actionLabels=i,this.submitAction=new e.vpe,this.editing=!0,this.types=[],this.resource="capability",this.createForm()}createForm(){this.formGroup=this.formBuilder.group({type:[null,[a.kI.required]],perm:[null,[a.kI.required]]})}setEditing(_=!0){this.editing=_,this.action=this.editing?this.actionLabels.EDIT:this.actionLabels.ADD}setValues(_,n){this.formGroup.setValue({type:_,perm:n})}setCapabilities(_){const n=[];_.forEach(i=>{n.push(i.type)}),this.types=[],ze.getAll().forEach(i=>{-1===u().indexOf(n,i)&&this.types.push(i)})}onSubmit(){this.submitAction.emit(this.formGroup.value),this.activeModal.close()}}return t.\u0275fac=function(_){return new(_||t)(e.Y36(J.O),e.Y36(M.Kz),e.Y36(A.p4))},t.\u0275cmp=e.Xpm({type:t,selectors:[["cd-rgw-user-capability-modal"]],outputs:{submitAction:"submitAction"},decls:29,vars:24,consts:function(){let o,_,n,i,s,c,d;return o="" + "\ufffd0\ufffd" + " " + "\ufffd1\ufffd" + "",_="Type",n="Permission",i="-- Select a permission --",s="-- Select a type --",c="This field is required.",d="This field is required.",[[3,"modalRef"],[1,"modal-title"],o,[1,"modal-content"],["novalidate","",3,"formGroup"],["frm","ngForm"],[1,"modal-body"],[1,"form-group","row"],["for","type",1,"cd-col-form-label",3,"ngClass"],_,[1,"cd-col-form-input"],["id","type","class","form-control","type","text","formControlName","type",3,"readonly",4,"ngIf"],["id","type","class","form-control","formControlName","type","autofocus","",4,"ngIf"],["class","invalid-feedback",4,"ngIf"],["for","perm",1,"cd-col-form-label","required"],n,["id","perm","formControlName","perm",1,"form-control"],[3,"ngValue"],i,[3,"value",4,"ngFor","ngForOf"],[1,"modal-footer"],[3,"form","submitText","submitActionEvent"],["id","type","type","text","formControlName","type",1,"form-control",3,"readonly"],["id","type","formControlName","type","autofocus","",1,"form-control"],[3,"ngValue",4,"ngIf"],s,[3,"value"],[1,"invalid-feedback"],c,d]},template:function(_,n){if(1&_&&(e.TgZ(0,"cd-modal",0),e.ynx(1,1),e.SDv(2,2),e.ALo(3,"titlecase"),e.ALo(4,"upperFirst"),e.BQk(),e.ynx(5,3),e.TgZ(6,"form",4,5),e.TgZ(8,"div",6),e.TgZ(9,"div",7),e.TgZ(10,"label",8),e.SDv(11,9),e.qZA(),e.TgZ(12,"div",10),e.YNc(13,Xt,1,1,"input",11),e.YNc(14,Qt,3,2,"select",12),e.YNc(15,Yt,2,0,"span",13),e.qZA(),e.qZA(),e.TgZ(16,"div",7),e.TgZ(17,"label",14),e.SDv(18,15),e.qZA(),e.TgZ(19,"div",10),e.TgZ(20,"select",16),e.TgZ(21,"option",17),e.SDv(22,18),e.qZA(),e.YNc(23,Jt,2,2,"option",19),e.qZA(),e.YNc(24,Vt,2,0,"span",13),e.qZA(),e.qZA(),e.qZA(),e.TgZ(25,"div",20),e.TgZ(26,"cd-form-button-panel",21),e.NdJ("submitActionEvent",function(){return n.onSubmit()}),e.ALo(27,"titlecase"),e.ALo(28,"upperFirst"),e.qZA(),e.qZA(),e.qZA(),e.BQk(),e.qZA()),2&_){const i=e.MAs(7);e.Q6J("modalRef",n.activeModal),e.xp6(4),e.pQV(e.lcZ(3,13,n.action))(e.lcZ(4,15,n.resource)),e.QtT(2),e.xp6(2),e.Q6J("formGroup",n.formGroup),e.xp6(4),e.Q6J("ngClass",e.VKq(21,jt,!n.editing)),e.xp6(3),e.Q6J("ngIf",n.editing),e.xp6(1),e.Q6J("ngIf",!n.editing),e.xp6(1),e.Q6J("ngIf",n.formGroup.showError("type",i,"required")),e.xp6(6),e.Q6J("ngValue",null),e.xp6(2),e.Q6J("ngForOf",e.DdM(23,en)),e.xp6(1),e.Q6J("ngIf",n.formGroup.showError("perm",i,"required")),e.xp6(2),e.Q6J("form",n.formGroup)("submitText",e.lcZ(27,17,n.action)+" "+e.lcZ(28,19,n.resource))}},directives:[fe.z,a._Y,a.JL,V.V,a.sg,H.P,f.mk,f.O5,q.o,a.EJ,X.b,a.JJ,a.u,a.YN,a.Kr,f.sg,ee.p,a.Fj,j.U],pipes:[f.rS,K.m],styles:[""]}),t})();var Ce=r(4416),pe=r(58039);function tn(t,o){1&t&&e._UZ(0,"input",17),2&t&&e.Q6J("readonly",!0)}function nn(t,o){1&t&&(e.TgZ(0,"option",21),e.SDv(1,22),e.qZA()),2&t&&e.Q6J("ngValue",null)}function on(t,o){if(1&t&&(e.TgZ(0,"option",23),e._uU(1),e.qZA()),2&t){const _=o.$implicit;e.Q6J("value",_),e.xp6(1),e.Oqu(_)}}function sn(t,o){if(1&t&&(e.TgZ(0,"select",18),e.YNc(1,nn,2,1,"option",19),e.YNc(2,on,2,2,"option",20),e.qZA()),2&t){const _=e.oxw();e.xp6(1),e.Q6J("ngIf",null!==_.userCandidates),e.xp6(1),e.Q6J("ngForOf",_.userCandidates)}}function an(t,o){1&t&&(e.TgZ(0,"span",24),e.SDv(1,25),e.qZA())}function rn(t,o){1&t&&(e.TgZ(0,"div",7),e.TgZ(1,"div",26),e.TgZ(2,"div",27),e._UZ(3,"input",28),e.TgZ(4,"label",29),e.SDv(5,30),e.qZA(),e.qZA(),e.qZA(),e.qZA())}function ln(t,o){1&t&&(e.TgZ(0,"span",24),e.SDv(1,38),e.qZA())}const Ne=function(t){return{required:t}};function cn(t,o){if(1&t&&(e.TgZ(0,"div",7),e.TgZ(1,"label",31),e.SDv(2,32),e.qZA(),e.TgZ(3,"div",10),e.TgZ(4,"div",33),e._UZ(5,"input",34),e.TgZ(6,"span",35),e._UZ(7,"button",36),e._UZ(8,"cd-copy-2-clipboard-button",37),e.qZA(),e.qZA(),e.YNc(9,ln,2,0,"span",13),e.qZA(),e.qZA()),2&t){const _=e.oxw(),n=e.MAs(7);e.xp6(1),e.Q6J("ngClass",e.VKq(3,Ne,!_.viewing)),e.xp6(4),e.Q6J("readonly",_.viewing),e.xp6(4),e.Q6J("ngIf",_.formGroup.showError("access_key",n,"required"))}}function dn(t,o){1&t&&(e.TgZ(0,"span",24),e.SDv(1,44),e.qZA())}function un(t,o){if(1&t&&(e.TgZ(0,"div",7),e.TgZ(1,"label",39),e.SDv(2,40),e.qZA(),e.TgZ(3,"div",10),e.TgZ(4,"div",33),e._UZ(5,"input",41),e.TgZ(6,"span",35),e._UZ(7,"button",42),e._UZ(8,"cd-copy-2-clipboard-button",43),e.qZA(),e.qZA(),e.YNc(9,dn,2,0,"span",13),e.qZA(),e.qZA()),2&t){const _=e.oxw(),n=e.MAs(7);e.xp6(1),e.Q6J("ngClass",e.VKq(3,Ne,!_.viewing)),e.xp6(4),e.Q6J("readonly",_.viewing),e.xp6(4),e.Q6J("ngIf",_.formGroup.showError("secret_key",n,"required"))}}let Qe=(()=>{class t{constructor(_,n,i){this.formBuilder=_,this.activeModal=n,this.actionLabels=i,this.submitAction=new e.vpe,this.viewing=!0,this.userCandidates=[],this.resource="S3 Key",this.createForm()}createForm(){this.formGroup=this.formBuilder.group({user:[null,[a.kI.required]],generate_key:[!0],access_key:[null,[m.h.requiredIf({generate_key:!1})]],secret_key:[null,[m.h.requiredIf({generate_key:!1})]]})}setViewing(_=!0){this.viewing=_,this.action=this.viewing?this.actionLabels.SHOW:this.actionLabels.CREATE}setValues(_,n,i){this.formGroup.setValue({user:_,generate_key:u().isEmpty(n),access_key:n,secret_key:i})}setUserCandidates(_){this.userCandidates=_}onSubmit(){this.submitAction.emit(this.formGroup.value),this.activeModal.close()}}return t.\u0275fac=function(_){return new(_||t)(e.Y36(J.O),e.Y36(M.Kz),e.Y36(A.p4))},t.\u0275cmp=e.Xpm({type:t,selectors:[["cd-rgw-user-s3-key-modal"]],outputs:{submitAction:"submitAction"},decls:23,vars:24,consts:function(){let o,_,n,i,s,c,d,E,g;return o="" + "\ufffd0\ufffd" + " " + "\ufffd1\ufffd" + "",_="Username",n="-- Select a username --",i="This field is required.",s="Auto-generate key",c="Access key",d="This field is required.",E="Secret key",g="This field is required.",[[3,"modalRef"],[1,"modal-title"],o,[1,"modal-content"],["novalidate","",3,"formGroup"],["frm","ngForm"],[1,"modal-body"],[1,"form-group","row"],["for","user",1,"cd-col-form-label",3,"ngClass"],_,[1,"cd-col-form-input"],["id","user","class","form-control","type","text","formControlName","user",3,"readonly",4,"ngIf"],["id","user","class","form-control","formControlName","user","autofocus","",4,"ngIf"],["class","invalid-feedback",4,"ngIf"],["class","form-group row",4,"ngIf"],[1,"modal-footer"],[3,"form","submitText","showSubmit","submitActionEvent"],["id","user","type","text","formControlName","user",1,"form-control",3,"readonly"],["id","user","formControlName","user","autofocus","",1,"form-control"],[3,"ngValue",4,"ngIf"],[3,"value",4,"ngFor","ngForOf"],[3,"ngValue"],n,[3,"value"],[1,"invalid-feedback"],i,[1,"cd-col-form-offset"],[1,"custom-control","custom-checkbox"],["id","generate_key","type","checkbox","formControlName","generate_key",1,"custom-control-input"],["for","generate_key",1,"custom-control-label"],s,["for","access_key",1,"cd-col-form-label",3,"ngClass"],c,[1,"input-group"],["id","access_key","type","password","formControlName","access_key",1,"form-control",3,"readonly"],[1,"input-group-append"],["type","button","cdPasswordButton","access_key",1,"btn","btn-light"],["source","access_key"],d,["for","secret_key",1,"cd-col-form-label",3,"ngClass"],E,["id","secret_key","type","password","formControlName","secret_key",1,"form-control",3,"readonly"],["type","button","cdPasswordButton","secret_key",1,"btn","btn-light"],["source","secret_key"],g]},template:function(_,n){if(1&_&&(e.TgZ(0,"cd-modal",0),e.ynx(1,1),e.SDv(2,2),e.ALo(3,"titlecase"),e.ALo(4,"upperFirst"),e.BQk(),e.ynx(5,3),e.TgZ(6,"form",4,5),e.TgZ(8,"div",6),e.TgZ(9,"div",7),e.TgZ(10,"label",8),e.SDv(11,9),e.qZA(),e.TgZ(12,"div",10),e.YNc(13,tn,1,1,"input",11),e.YNc(14,sn,3,2,"select",12),e.YNc(15,an,2,0,"span",13),e.qZA(),e.qZA(),e.YNc(16,rn,6,0,"div",14),e.YNc(17,cn,10,5,"div",14),e.YNc(18,un,10,5,"div",14),e.qZA(),e.TgZ(19,"div",15),e.TgZ(20,"cd-form-button-panel",16),e.NdJ("submitActionEvent",function(){return n.onSubmit()}),e.ALo(21,"titlecase"),e.ALo(22,"upperFirst"),e.qZA(),e.qZA(),e.qZA(),e.BQk(),e.qZA()),2&_){const i=e.MAs(7);e.Q6J("modalRef",n.activeModal),e.xp6(4),e.pQV(e.lcZ(3,14,n.action))(e.lcZ(4,16,n.resource)),e.QtT(2),e.xp6(2),e.Q6J("formGroup",n.formGroup),e.xp6(4),e.Q6J("ngClass",e.VKq(22,Ne,!n.viewing)),e.xp6(3),e.Q6J("ngIf",n.viewing),e.xp6(1),e.Q6J("ngIf",!n.viewing),e.xp6(1),e.Q6J("ngIf",n.formGroup.showError("user",i,"required")),e.xp6(1),e.Q6J("ngIf",!n.viewing),e.xp6(1),e.Q6J("ngIf",!n.formGroup.getValue("generate_key")),e.xp6(1),e.Q6J("ngIf",!n.formGroup.getValue("generate_key")),e.xp6(2),e.Q6J("form",n.formGroup)("submitText",e.lcZ(21,18,n.action)+" "+e.lcZ(22,20,n.resource))("showSubmit",!n.viewing)}},directives:[fe.z,a._Y,a.JL,V.V,a.sg,H.P,f.mk,f.O5,ee.p,q.o,a.Fj,X.b,a.JJ,a.u,a.EJ,j.U,f.sg,a.YN,a.Kr,a.Wl,Ce.C,pe.s],pipes:[f.rS,K.m],styles:[""]}),t})();class Rn{}function gn(t,o){1&t&&(e.TgZ(0,"span",29),e.SDv(1,30),e.qZA())}function En(t,o){1&t&&(e.TgZ(0,"span",29),e.SDv(1,31),e.qZA())}function Tn(t,o){if(1&t&&(e.TgZ(0,"option",32),e._uU(1),e.qZA()),2&t){const _=o.$implicit;e.Q6J("value",_),e.xp6(1),e.hij(" ",_," ")}}function Sn(t,o){1&t&&(e.TgZ(0,"span",29),e.SDv(1,33),e.qZA())}function fn(t,o){1&t&&(e.TgZ(0,"span",29),e.SDv(1,48),e.qZA())}function Cn(t,o){if(1&t&&(e.TgZ(0,"div",7),e.TgZ(1,"label",41),e.SDv(2,42),e.qZA(),e.TgZ(3,"div",10),e.TgZ(4,"div",43),e._UZ(5,"input",44),e.TgZ(6,"span",45),e._UZ(7,"button",46),e._UZ(8,"cd-copy-2-clipboard-button",47),e.qZA(),e.qZA(),e.YNc(9,fn,2,0,"span",15),e.qZA(),e.qZA()),2&t){const _=e.oxw(2),n=e.MAs(7);e.xp6(9),e.Q6J("ngIf",_.formGroup.showError("secret_key",n,"required"))}}function pn(t,o){if(1&t&&(e.TgZ(0,"fieldset"),e.TgZ(1,"legend"),e.SDv(2,34),e.qZA(),e.TgZ(3,"div",7),e.TgZ(4,"div",35),e.TgZ(5,"div",36),e._UZ(6,"input",37),e.TgZ(7,"label",38),e.SDv(8,39),e.qZA(),e.qZA(),e.qZA(),e.qZA(),e.YNc(9,Cn,10,1,"div",40),e.qZA()),2&t){const _=e.oxw();e.xp6(9),e.Q6J("ngIf",!_.editing&&!_.formGroup.getValue("generate_secret"))}}const Mn=function(t){return{required:t}},mn=function(){return["read","write"]};let An=(()=>{class t{constructor(_,n,i){this.formBuilder=_,this.bsModalRef=n,this.actionLabels=i,this.submitAction=new e.vpe,this.editing=!0,this.subusers=[],this.resource="Subuser",this.createForm()}createForm(){this.formGroup=this.formBuilder.group({uid:[null],subuid:[null,[a.kI.required,this.subuserValidator()]],perm:[null,[a.kI.required]],generate_secret:[!0],secret_key:[null,[m.h.requiredIf({generate_secret:!1})]]})}subuserValidator(){const _=this;return n=>_.editing||(0,m.P)(n.value)?null:_.subusers.some(s=>u().isEqual(_.getSubuserName(s.id),n.value))?{subuserIdExists:!0}:null}getSubuserName(_){if(u().isEmpty(_))return _;const n=_.match(/([^:]+)(:(.+))?/);return u().isUndefined(n[3])?n[1]:n[3]}setEditing(_=!0){this.editing=_,this.action=this.editing?this.actionLabels.EDIT:this.actionLabels.CREATE}setValues(_,n="",i=""){this.formGroup.setValue({uid:_,subuid:this.getSubuserName(n),perm:i,generate_secret:!0,secret_key:null})}setSubusers(_){this.subusers=_}onSubmit(){const _=this.formGroup.value,n=new Rn;n.id=`${_.uid}:${_.subuid}`,n.permissions=_.perm,n.generate_secret=_.generate_secret,n.secret_key=_.secret_key,this.submitAction.emit(n),this.bsModalRef.close()}}return t.\u0275fac=function(_){return new(_||t)(e.Y36(J.O),e.Y36(M.Kz),e.Y36(A.p4))},t.\u0275cmp=e.Xpm({type:t,selectors:[["cd-rgw-user-subuser-modal"]],outputs:{submitAction:"submitAction"},decls:39,vars:26,consts:function(){let o,_,n,i,s,c,d,E,g,C,b,P,G,N;return o="" + "\ufffd0\ufffd" + " " + "\ufffd1\ufffd" + "",_="Username",n="Subuser",i="Permission",s="-- Select a permission --",c="read, write",d="full",E="This field is required.",g="The chosen subuser ID is already in use.",C="This field is required.",b="Swift key",P="Auto-generate secret",G="Secret key",N="This field is required.",[[3,"modalRef"],[1,"modal-title"],o,[1,"modal-content"],["novalidate","",3,"formGroup"],["frm","ngForm"],[1,"modal-body"],[1,"form-group","row"],["for","uid",1,"cd-col-form-label"],_,[1,"cd-col-form-input"],["id","uid","type","text","formControlName","uid",1,"form-control",3,"readonly"],["for","subuid",1,"cd-col-form-label",3,"ngClass"],n,["id","subuid","type","text","formControlName","subuid","autofocus","",1,"form-control",3,"readonly"],["class","invalid-feedback",4,"ngIf"],["for","perm",1,"cd-col-form-label","required"],i,["id","perm","formControlName","perm",1,"form-control"],[3,"ngValue"],s,[3,"value",4,"ngFor","ngForOf"],["value","read-write"],c,["value","full-control"],d,[4,"ngIf"],[1,"modal-footer"],[3,"form","submitText","submitActionEvent"],[1,"invalid-feedback"],E,g,[3,"value"],C,b,[1,"cd-col-form-offset"],[1,"custom-control","custom-checkbox"],["id","generate_secret","type","checkbox","formControlName","generate_secret",1,"custom-control-input"],["for","generate_secret",1,"custom-control-label"],P,["class","form-group row",4,"ngIf"],["for","secret_key",1,"cd-col-form-label","required"],G,[1,"input-group"],["id","secret_key","type","password","formControlName","secret_key",1,"form-control"],[1,"input-group-append"],["type","button","cdPasswordButton","secret_key",1,"btn","btn-light"],["source","secret_key"],N]},template:function(_,n){if(1&_&&(e.TgZ(0,"cd-modal",0),e.ynx(1,1),e.SDv(2,2),e.ALo(3,"titlecase"),e.ALo(4,"upperFirst"),e.BQk(),e.ynx(5,3),e.TgZ(6,"form",4,5),e.TgZ(8,"div",6),e.TgZ(9,"div",7),e.TgZ(10,"label",8),e.SDv(11,9),e.qZA(),e.TgZ(12,"div",10),e._UZ(13,"input",11),e.qZA(),e.qZA(),e.TgZ(14,"div",7),e.TgZ(15,"label",12),e.SDv(16,13),e.qZA(),e.TgZ(17,"div",10),e._UZ(18,"input",14),e.YNc(19,gn,2,0,"span",15),e.YNc(20,En,2,0,"span",15),e.qZA(),e.qZA(),e.TgZ(21,"div",7),e.TgZ(22,"label",16),e.SDv(23,17),e.qZA(),e.TgZ(24,"div",10),e.TgZ(25,"select",18),e.TgZ(26,"option",19),e.SDv(27,20),e.qZA(),e.YNc(28,Tn,2,2,"option",21),e.TgZ(29,"option",22),e.SDv(30,23),e.qZA(),e.TgZ(31,"option",24),e.SDv(32,25),e.qZA(),e.qZA(),e.YNc(33,Sn,2,0,"span",15),e.qZA(),e.qZA(),e.YNc(34,pn,10,1,"fieldset",26),e.qZA(),e.TgZ(35,"div",27),e.TgZ(36,"cd-form-button-panel",28),e.NdJ("submitActionEvent",function(){return n.onSubmit()}),e.ALo(37,"titlecase"),e.ALo(38,"upperFirst"),e.qZA(),e.qZA(),e.qZA(),e.BQk(),e.qZA()),2&_){const i=e.MAs(7);e.Q6J("modalRef",n.bsModalRef),e.xp6(4),e.pQV(e.lcZ(3,15,n.action))(e.lcZ(4,17,n.resource)),e.QtT(2),e.xp6(2),e.Q6J("formGroup",n.formGroup),e.xp6(7),e.Q6J("readonly",!0),e.xp6(2),e.Q6J("ngClass",e.VKq(23,Mn,!n.editing)),e.xp6(3),e.Q6J("readonly",n.editing),e.xp6(1),e.Q6J("ngIf",n.formGroup.showError("subuid",i,"required")),e.xp6(1),e.Q6J("ngIf",n.formGroup.showError("subuid",i,"subuserIdExists")),e.xp6(6),e.Q6J("ngValue",null),e.xp6(2),e.Q6J("ngForOf",e.DdM(25,mn)),e.xp6(5),e.Q6J("ngIf",n.formGroup.showError("perm",i,"required")),e.xp6(1),e.Q6J("ngIf",!n.editing),e.xp6(2),e.Q6J("form",n.formGroup)("submitText",e.lcZ(37,19,n.action)+" "+e.lcZ(38,21,n.resource))}},directives:[fe.z,a._Y,a.JL,V.V,a.sg,H.P,q.o,a.Fj,X.b,a.JJ,a.u,f.mk,j.U,f.O5,a.EJ,a.YN,a.Kr,f.sg,ee.p,a.Wl,Ce.C,pe.s],pipes:[f.rS,K.m],styles:[""]}),t})();var bn=r(13472);let Ye=(()=>{class t{constructor(_,n){this.activeModal=_,this.actionLabels=n,this.resource="Swift Key",this.action=this.actionLabels.SHOW}setValues(_,n){this.user=_,this.secret_key=n}}return t.\u0275fac=function(_){return new(_||t)(e.Y36(M.Kz),e.Y36(A.p4))},t.\u0275cmp=e.Xpm({type:t,selectors:[["cd-rgw-user-swift-key-modal"]],decls:24,vars:11,consts:function(){let o,_,n;return o="" + "\ufffd0\ufffd" + " " + "\ufffd1\ufffd" + "",_="Username",n="Secret key",[[3,"modalRef"],[1,"modal-title"],o,[1,"modal-content"],[1,"modal-body"],["novalidate",""],[1,"form-group","row"],["for","user",1,"cd-col-form-label"],_,[1,"cd-col-form-input"],["id","user","name","user","type","text",1,"form-control",3,"readonly","ngModel","ngModelChange"],["for","secret_key",1,"cd-col-form-label"],n,[1,"input-group"],["id","secret_key","name","secret_key","type","password",1,"form-control",3,"ngModel","readonly","ngModelChange"],[1,"input-group-append"],["type","button","cdPasswordButton","secret_key",1,"btn","btn-light"],["source","secret_key"],[1,"modal-footer"],[3,"backAction"]]},template:function(_,n){1&_&&(e.TgZ(0,"cd-modal",0),e.ynx(1,1),e.SDv(2,2),e.ALo(3,"titlecase"),e.ALo(4,"upperFirst"),e.BQk(),e.ynx(5,3),e.TgZ(6,"div",4),e.TgZ(7,"form",5),e.TgZ(8,"div",6),e.TgZ(9,"label",7),e.SDv(10,8),e.qZA(),e.TgZ(11,"div",9),e.TgZ(12,"input",10),e.NdJ("ngModelChange",function(s){return n.user=s}),e.qZA(),e.qZA(),e.qZA(),e.TgZ(13,"div",6),e.TgZ(14,"label",11),e.SDv(15,12),e.qZA(),e.TgZ(16,"div",9),e.TgZ(17,"div",13),e.TgZ(18,"input",14),e.NdJ("ngModelChange",function(s){return n.secret_key=s}),e.qZA(),e.TgZ(19,"span",15),e._UZ(20,"button",16),e._UZ(21,"cd-copy-2-clipboard-button",17),e.qZA(),e.qZA(),e.qZA(),e.qZA(),e.qZA(),e.qZA(),e.TgZ(22,"div",18),e.TgZ(23,"cd-back-button",19),e.NdJ("backAction",function(){return n.activeModal.close()}),e.qZA(),e.qZA(),e.BQk(),e.qZA()),2&_&&(e.Q6J("modalRef",n.activeModal),e.xp6(4),e.pQV(e.lcZ(3,7,n.action))(e.lcZ(4,9,n.resource)),e.QtT(2),e.xp6(8),e.Q6J("readonly",!0)("ngModel",n.user),e.xp6(6),e.Q6J("ngModel",n.secret_key)("readonly",!0))},directives:[fe.z,a._Y,a.JL,a.F,H.P,q.o,a.Fj,X.b,a.JJ,a.On,Ce.C,pe.s,bn.W],pipes:[f.rS,K.m],styles:[""]}),t})();var Pn=r(17932);function Gn(t,o){1&t&&(e.TgZ(0,"span",49),e.SDv(1,50),e.qZA())}function Nn(t,o){1&t&&(e.TgZ(0,"span",49),e.SDv(1,51),e.qZA())}function On(t,o){1&t&&(e.TgZ(0,"span",49),e.SDv(1,52),e.qZA())}function Un(t,o){1&t&&(e.TgZ(0,"span",49),e.SDv(1,56),e.qZA())}function Wn(t,o){1&t&&(e.TgZ(0,"span",49),e.SDv(1,57),e.qZA())}function Zn(t,o){if(1&t&&(e.TgZ(0,"div",8),e.TgZ(1,"label",53),e.SDv(2,54),e.qZA(),e.TgZ(3,"div",11),e._UZ(4,"input",55),e.YNc(5,Un,2,0,"span",13),e.YNc(6,Wn,2,0,"span",13),e.qZA(),e.qZA()),2&t){e.oxw();const _=e.MAs(2),n=e.oxw();e.xp6(4),e.Q6J("readonly",n.editing),e.xp6(1),e.Q6J("ngIf",n.userForm.showError("tenant",_,"pattern")),e.xp6(1),e.Q6J("ngIf",n.userForm.showError("tenant",_,"notUnique"))}}function $n(t,o){1&t&&(e.TgZ(0,"span",49),e.SDv(1,58),e.qZA())}function hn(t,o){1&t&&(e.TgZ(0,"span",49),e.SDv(1,59),e.qZA())}function In(t,o){1&t&&(e.TgZ(0,"span",49),e.SDv(1,60),e.qZA())}function vn(t,o){1&t&&(e.TgZ(0,"span",49),e.SDv(1,61),e.qZA())}function Fn(t,o){1&t&&(e.TgZ(0,"span",49),e.SDv(1,64),e.qZA())}function Ln(t,o){1&t&&(e.TgZ(0,"span",49),e.SDv(1,65),e.qZA())}function Dn(t,o){if(1&t&&(e.TgZ(0,"div",8),e._UZ(1,"label",62),e.TgZ(2,"div",11),e._UZ(3,"input",63),e.YNc(4,Fn,2,0,"span",13),e.YNc(5,Ln,2,0,"span",13),e.qZA(),e.qZA()),2&t){e.oxw();const _=e.MAs(2),n=e.oxw();e.xp6(4),e.Q6J("ngIf",n.userForm.showError("max_buckets",_,"required")),e.xp6(1),e.Q6J("ngIf",n.userForm.showError("max_buckets",_,"min"))}}function yn(t,o){1&t&&(e.TgZ(0,"span",49),e.SDv(1,77),e.qZA())}function xn(t,o){if(1&t&&(e.TgZ(0,"div",8),e.TgZ(1,"label",70),e.SDv(2,71),e.qZA(),e.TgZ(3,"div",11),e.TgZ(4,"div",72),e._UZ(5,"input",73),e.TgZ(6,"span",74),e._UZ(7,"button",75),e._UZ(8,"cd-copy-2-clipboard-button",76),e.qZA(),e.qZA(),e.YNc(9,yn,2,0,"span",13),e.qZA(),e.qZA()),2&t){e.oxw(2);const _=e.MAs(2),n=e.oxw();e.xp6(9),e.Q6J("ngIf",n.userForm.showError("access_key",_,"required"))}}function qn(t,o){1&t&&(e.TgZ(0,"span",49),e.SDv(1,83),e.qZA())}function wn(t,o){if(1&t&&(e.TgZ(0,"div",8),e.TgZ(1,"label",78),e.SDv(2,79),e.qZA(),e.TgZ(3,"div",11),e.TgZ(4,"div",72),e._UZ(5,"input",80),e.TgZ(6,"span",74),e._UZ(7,"button",81),e._UZ(8,"cd-copy-2-clipboard-button",82),e.qZA(),e.qZA(),e.YNc(9,qn,2,0,"span",13),e.qZA(),e.qZA()),2&t){e.oxw(2);const _=e.MAs(2),n=e.oxw();e.xp6(9),e.Q6J("ngIf",n.userForm.showError("secret_key",_,"required"))}}function kn(t,o){if(1&t&&(e.TgZ(0,"fieldset"),e.TgZ(1,"legend"),e.SDv(2,66),e.qZA(),e.TgZ(3,"div",8),e.TgZ(4,"div",14),e.TgZ(5,"div",15),e._UZ(6,"input",67),e.TgZ(7,"label",68),e.SDv(8,69),e.qZA(),e.qZA(),e.qZA(),e.qZA(),e.YNc(9,xn,10,1,"div",19),e.YNc(10,wn,10,1,"div",19),e.qZA()),2&t){const _=e.oxw(2);e.xp6(9),e.Q6J("ngIf",!_.editing&&!_.userForm.getValue("generate_key")),e.xp6(1),e.Q6J("ngIf",!_.editing&&!_.userForm.getValue("generate_key"))}}function Bn(t,o){1&t&&(e.TgZ(0,"span",93),e.TgZ(1,"span",94),e.SDv(2,95),e.qZA(),e.qZA())}const L=function(t){return[t]};function Hn(t,o){if(1&t){const _=e.EpF();e.TgZ(0,"span"),e.TgZ(1,"div",72),e.TgZ(2,"div",96),e.TgZ(3,"span",97),e._UZ(4,"i"),e.qZA(),e.qZA(),e._UZ(5,"input",98),e.TgZ(6,"div",99),e.TgZ(7,"span",97),e._UZ(8,"i"),e.qZA(),e.qZA(),e._UZ(9,"input",98),e.TgZ(10,"span",74),e.TgZ(11,"button",100),e.NdJ("click",function(){const s=e.CHM(_).index;return e.oxw(3).showSubuserModal(s)}),e._UZ(12,"i",90),e.qZA(),e.TgZ(13,"button",101),e.NdJ("click",function(){const s=e.CHM(_).index;return e.oxw(3).deleteSubuser(s)}),e._UZ(14,"i",90),e.qZA(),e.qZA(),e.qZA(),e._UZ(15,"span",94),e.qZA()}if(2&t){const _=o.$implicit,n=e.oxw(3);e.xp6(4),e.Tol(n.icons.user),e.xp6(1),e.s9C("value",_.id),e.xp6(3),e.Tol(n.icons.share),e.xp6(1),e.s9C("value","full-control"===_.permissions?"full":_.permissions),e.xp6(3),e.Q6J("ngClass",e.VKq(10,L,n.icons.edit)),e.xp6(2),e.Q6J("ngClass",e.VKq(12,L,n.icons.destroy))}}function Xn(t,o){if(1&t){const _=e.EpF();e.TgZ(0,"fieldset"),e.TgZ(1,"legend"),e.SDv(2,84),e.qZA(),e.TgZ(3,"div",85),e.TgZ(4,"div",14),e.YNc(5,Bn,3,0,"span",86),e.YNc(6,Hn,16,14,"span",87),e.TgZ(7,"div",85),e.TgZ(8,"div",88),e.TgZ(9,"button",89),e.NdJ("click",function(){return e.CHM(_),e.oxw(2).showSubuserModal()}),e._UZ(10,"i",90),e.ynx(11),e.SDv(12,91),e.ALo(13,"titlecase"),e.ALo(14,"upperFirst"),e.BQk(),e.qZA(),e.qZA(),e.qZA(),e._UZ(15,"span",92),e.qZA(),e.qZA(),e.qZA()}if(2&t){const _=e.oxw(2);e.xp6(5),e.Q6J("ngIf",0===_.subusers.length),e.xp6(1),e.Q6J("ngForOf",_.subusers),e.xp6(4),e.Q6J("ngClass",e.VKq(9,L,_.icons.add)),e.xp6(4),e.pQV(e.lcZ(13,5,_.actionLabels.CREATE))(e.lcZ(14,7,_.subuserLabel)),e.QtT(12)}}function Kn(t,o){1&t&&(e.TgZ(0,"span",93),e.TgZ(1,"span",94),e.SDv(2,107),e.qZA(),e.qZA())}function zn(t,o){if(1&t){const _=e.EpF();e.TgZ(0,"span"),e.TgZ(1,"div",72),e.TgZ(2,"div",96),e.TgZ(3,"div",97),e._UZ(4,"i"),e.qZA(),e.qZA(),e._UZ(5,"input",98),e.TgZ(6,"span",74),e.TgZ(7,"button",108),e.NdJ("click",function(){const s=e.CHM(_).index;return e.oxw(3).showS3KeyModal(s)}),e._UZ(8,"i",90),e.qZA(),e.TgZ(9,"button",109),e.NdJ("click",function(){const s=e.CHM(_).index;return e.oxw(3).deleteS3Key(s)}),e._UZ(10,"i",90),e.qZA(),e.qZA(),e.qZA(),e._UZ(11,"span",94),e.qZA()}if(2&t){const _=o.$implicit,n=e.oxw(3);e.xp6(4),e.Tol(n.icons.key),e.xp6(1),e.s9C("value",_.user),e.xp6(3),e.Q6J("ngClass",e.VKq(6,L,n.icons.show)),e.xp6(2),e.Q6J("ngClass",e.VKq(8,L,n.icons.destroy))}}function Qn(t,o){1&t&&(e.TgZ(0,"span",93),e.TgZ(1,"span",94),e.SDv(2,110),e.qZA(),e.qZA())}function Yn(t,o){if(1&t){const _=e.EpF();e.TgZ(0,"span"),e.TgZ(1,"div",72),e.TgZ(2,"div",96),e.TgZ(3,"span",97),e._UZ(4,"i"),e.qZA(),e.qZA(),e._UZ(5,"input",98),e.TgZ(6,"span",74),e.TgZ(7,"button",111),e.NdJ("click",function(){const s=e.CHM(_).index;return e.oxw(3).showSwiftKeyModal(s)}),e._UZ(8,"i",90),e.qZA(),e.qZA(),e.qZA(),e._UZ(9,"span",94),e.qZA()}if(2&t){const _=o.$implicit,n=e.oxw(3);e.xp6(4),e.Tol(n.icons.key),e.xp6(1),e.s9C("value",_.user),e.xp6(3),e.Q6J("ngClass",e.VKq(5,L,n.icons.show))}}function Jn(t,o){if(1&t){const _=e.EpF();e.TgZ(0,"fieldset"),e.TgZ(1,"legend"),e.SDv(2,102),e.qZA(),e.TgZ(3,"div",8),e.TgZ(4,"label",62),e.SDv(5,103),e.qZA(),e.TgZ(6,"div",11),e.YNc(7,Kn,3,0,"span",86),e.YNc(8,zn,12,10,"span",87),e.TgZ(9,"div",85),e.TgZ(10,"div",88),e.TgZ(11,"button",104),e.NdJ("click",function(){return e.CHM(_),e.oxw(2).showS3KeyModal()}),e._UZ(12,"i",90),e.ynx(13),e.SDv(14,105),e.ALo(15,"titlecase"),e.ALo(16,"upperFirst"),e.BQk(),e.qZA(),e.qZA(),e.qZA(),e._UZ(17,"span",92),e.qZA(),e._UZ(18,"hr"),e.qZA(),e.TgZ(19,"div",8),e.TgZ(20,"label",62),e.SDv(21,106),e.qZA(),e.TgZ(22,"div",11),e.YNc(23,Qn,3,0,"span",86),e.YNc(24,Yn,10,7,"span",87),e.qZA(),e.qZA(),e.qZA()}if(2&t){const _=e.oxw(2);e.xp6(7),e.Q6J("ngIf",0===_.s3Keys.length),e.xp6(1),e.Q6J("ngForOf",_.s3Keys),e.xp6(4),e.Q6J("ngClass",e.VKq(11,L,_.icons.add)),e.xp6(4),e.pQV(e.lcZ(15,7,_.actionLabels.CREATE))(e.lcZ(16,9,_.s3keyLabel)),e.QtT(14),e.xp6(7),e.Q6J("ngIf",0===_.swiftKeys.length),e.xp6(1),e.Q6J("ngForOf",_.swiftKeys)}}function Vn(t,o){1&t&&(e.TgZ(0,"span",93),e.TgZ(1,"span",94),e.SDv(2,115),e.qZA(),e.qZA())}function jn(t,o){if(1&t){const _=e.EpF();e.TgZ(0,"span"),e.TgZ(1,"div",72),e.TgZ(2,"span",96),e.TgZ(3,"div",97),e._UZ(4,"i"),e.qZA(),e.qZA(),e._UZ(5,"input",98),e.TgZ(6,"span",74),e.TgZ(7,"button",116),e.NdJ("click",function(){const s=e.CHM(_).index;return e.oxw(3).showCapabilityModal(s)}),e._UZ(8,"i",90),e.qZA(),e.TgZ(9,"button",117),e.NdJ("click",function(){const s=e.CHM(_).index;return e.oxw(3).deleteCapability(s)}),e._UZ(10,"i",90),e.qZA(),e.qZA(),e.qZA(),e._UZ(11,"span",94),e.qZA()}if(2&t){const _=o.$implicit,n=e.oxw(3);e.xp6(4),e.Tol(n.icons.share),e.xp6(1),e.hYB("value","",_.type,":",_.perm,""),e.xp6(3),e.Q6J("ngClass",e.VKq(7,L,n.icons.edit)),e.xp6(2),e.Q6J("ngClass",e.VKq(9,L,n.icons.destroy))}}function eo(t,o){if(1&t){const _=e.EpF();e.TgZ(0,"fieldset"),e.TgZ(1,"legend"),e.SDv(2,112),e.qZA(),e.TgZ(3,"div",8),e.TgZ(4,"div",14),e.YNc(5,Vn,3,0,"span",86),e.YNc(6,jn,12,11,"span",87),e.TgZ(7,"div",85),e.TgZ(8,"div",88),e.TgZ(9,"button",113),e.NdJ("click",function(){return e.CHM(_),e.oxw(2).showCapabilityModal()}),e.ALo(10,"pipeFunction"),e.ALo(11,"pipeFunction"),e._UZ(12,"i",90),e.ynx(13),e.SDv(14,114),e.ALo(15,"titlecase"),e.ALo(16,"upperFirst"),e.BQk(),e.qZA(),e.qZA(),e.qZA(),e._UZ(17,"span",92),e.qZA(),e.qZA(),e.qZA()}if(2&t){const _=e.oxw(2);e.xp6(5),e.Q6J("ngIf",0===_.capabilities.length),e.xp6(1),e.Q6J("ngForOf",_.capabilities),e.xp6(3),e.Q6J("disabled",e.xi3(10,7,_.capabilities,_.hasAllCapabilities))("disableTooltip",!e.xi3(11,10,_.capabilities,_.hasAllCapabilities)),e.xp6(3),e.Q6J("ngClass",e.VKq(17,L,_.icons.add)),e.xp6(4),e.pQV(e.lcZ(15,13,_.actionLabels.ADD))(e.lcZ(16,15,_.capabilityLabel)),e.QtT(14)}}function _o(t,o){1&t&&(e.TgZ(0,"div",8),e.TgZ(1,"div",14),e.TgZ(2,"div",15),e._UZ(3,"input",118),e.TgZ(4,"label",119),e.SDv(5,120),e.qZA(),e.qZA(),e.qZA(),e.qZA())}function to(t,o){1&t&&(e.TgZ(0,"span",49),e.SDv(1,124),e.qZA())}function no(t,o){1&t&&(e.TgZ(0,"span",49),e.SDv(1,125),e.qZA())}function oo(t,o){if(1&t&&(e.TgZ(0,"div",8),e.TgZ(1,"label",121),e.SDv(2,122),e.qZA(),e.TgZ(3,"div",11),e._UZ(4,"input",123),e.YNc(5,to,2,0,"span",13),e.YNc(6,no,2,0,"span",13),e.qZA(),e.qZA()),2&t){e.oxw();const _=e.MAs(2),n=e.oxw();e.xp6(5),e.Q6J("ngIf",n.userForm.showError("user_quota_max_size",_,"required")),e.xp6(1),e.Q6J("ngIf",n.userForm.showError("user_quota_max_size",_,"quotaMaxSize"))}}function io(t,o){1&t&&(e.TgZ(0,"div",8),e.TgZ(1,"div",14),e.TgZ(2,"div",15),e._UZ(3,"input",126),e.TgZ(4,"label",127),e.SDv(5,128),e.qZA(),e.qZA(),e.qZA(),e.qZA())}function so(t,o){1&t&&(e.TgZ(0,"span",49),e.SDv(1,132),e.qZA())}function ao(t,o){1&t&&(e.TgZ(0,"span",49),e.SDv(1,133),e.qZA())}function ro(t,o){if(1&t&&(e.TgZ(0,"div",8),e.TgZ(1,"label",129),e.SDv(2,130),e.qZA(),e.TgZ(3,"div",11),e._UZ(4,"input",131),e.YNc(5,so,2,0,"span",13),e.YNc(6,ao,2,0,"span",13),e.qZA(),e.qZA()),2&t){e.oxw();const _=e.MAs(2),n=e.oxw();e.xp6(5),e.Q6J("ngIf",n.userForm.showError("user_quota_max_objects",_,"required")),e.xp6(1),e.Q6J("ngIf",n.userForm.showError("user_quota_max_objects",_,"min"))}}function lo(t,o){1&t&&(e.TgZ(0,"div",8),e.TgZ(1,"div",14),e.TgZ(2,"div",15),e._UZ(3,"input",134),e.TgZ(4,"label",135),e.SDv(5,136),e.qZA(),e.qZA(),e.qZA(),e.qZA())}function co(t,o){1&t&&(e.TgZ(0,"span",49),e.SDv(1,140),e.qZA())}function uo(t,o){1&t&&(e.TgZ(0,"span",49),e.SDv(1,141),e.qZA())}function Ro(t,o){if(1&t&&(e.TgZ(0,"div",8),e.TgZ(1,"label",137),e.SDv(2,138),e.qZA(),e.TgZ(3,"div",11),e._UZ(4,"input",139),e.YNc(5,co,2,0,"span",13),e.YNc(6,uo,2,0,"span",13),e.qZA(),e.qZA()),2&t){e.oxw();const _=e.MAs(2),n=e.oxw();e.xp6(5),e.Q6J("ngIf",n.userForm.showError("bucket_quota_max_size",_,"required")),e.xp6(1),e.Q6J("ngIf",n.userForm.showError("bucket_quota_max_size",_,"quotaMaxSize"))}}function go(t,o){1&t&&(e.TgZ(0,"div",8),e.TgZ(1,"div",14),e.TgZ(2,"div",15),e._UZ(3,"input",142),e.TgZ(4,"label",143),e.SDv(5,144),e.qZA(),e.qZA(),e.qZA(),e.qZA())}function Eo(t,o){1&t&&(e.TgZ(0,"span",49),e.SDv(1,148),e.qZA())}function To(t,o){1&t&&(e.TgZ(0,"span",49),e.SDv(1,149),e.qZA())}function So(t,o){if(1&t&&(e.TgZ(0,"div",8),e.TgZ(1,"label",145),e.SDv(2,146),e.qZA(),e.TgZ(3,"div",11),e._UZ(4,"input",147),e.YNc(5,Eo,2,0,"span",13),e.YNc(6,To,2,0,"span",13),e.qZA(),e.qZA()),2&t){e.oxw();const _=e.MAs(2),n=e.oxw();e.xp6(5),e.Q6J("ngIf",n.userForm.showError("bucket_quota_max_objects",_,"required")),e.xp6(1),e.Q6J("ngIf",n.userForm.showError("bucket_quota_max_objects",_,"min"))}}const Je=function(t){return{required:t}};function fo(t,o){if(1&t){const _=e.EpF();e.TgZ(0,"div",1),e.TgZ(1,"form",2,3),e.TgZ(3,"div",4),e.TgZ(4,"div",5),e.SDv(5,6),e.ALo(6,"titlecase"),e.ALo(7,"upperFirst"),e.qZA(),e.TgZ(8,"div",7),e.TgZ(9,"div",8),e.TgZ(10,"label",9),e.SDv(11,10),e.qZA(),e.TgZ(12,"div",11),e._UZ(13,"input",12),e.YNc(14,Gn,2,0,"span",13),e.YNc(15,Nn,2,0,"span",13),e.YNc(16,On,2,0,"span",13),e.qZA(),e.qZA(),e.TgZ(17,"div",8),e.TgZ(18,"div",14),e.TgZ(19,"div",15),e.TgZ(20,"input",16),e.NdJ("click",function(){return e.CHM(_),e.oxw().updateFieldsWhenTenanted()}),e.qZA(),e.TgZ(21,"label",17),e.SDv(22,18),e.qZA(),e.qZA(),e.qZA(),e.qZA(),e.YNc(23,Zn,7,3,"div",19),e.TgZ(24,"div",8),e.TgZ(25,"label",20),e.SDv(26,21),e.qZA(),e.TgZ(27,"div",11),e._UZ(28,"input",22),e.YNc(29,$n,2,0,"span",13),e.YNc(30,hn,2,0,"span",13),e.qZA(),e.qZA(),e.TgZ(31,"div",8),e.TgZ(32,"label",23),e.SDv(33,24),e.qZA(),e.TgZ(34,"div",11),e._UZ(35,"input",25),e.YNc(36,In,2,0,"span",13),e.YNc(37,vn,2,0,"span",13),e.qZA(),e.qZA(),e.TgZ(38,"div",8),e.TgZ(39,"label",26),e.SDv(40,27),e.qZA(),e.TgZ(41,"div",11),e.TgZ(42,"select",28),e.NdJ("change",function(i){return e.CHM(_),e.oxw().onMaxBucketsModeChange(i.target.value)}),e.TgZ(43,"option",29),e.SDv(44,30),e.qZA(),e.TgZ(45,"option",31),e.SDv(46,32),e.qZA(),e.TgZ(47,"option",33),e.SDv(48,34),e.qZA(),e.qZA(),e.qZA(),e.qZA(),e.YNc(49,Dn,6,2,"div",19),e.TgZ(50,"div",8),e.TgZ(51,"div",14),e.TgZ(52,"div",15),e._UZ(53,"input",35),e.TgZ(54,"label",36),e.SDv(55,37),e.qZA(),e.qZA(),e.qZA(),e.qZA(),e.YNc(56,kn,11,2,"fieldset",38),e.YNc(57,Xn,16,11,"fieldset",38),e.YNc(58,Jn,25,13,"fieldset",38),e.YNc(59,eo,18,19,"fieldset",38),e.TgZ(60,"fieldset"),e.TgZ(61,"legend"),e.SDv(62,39),e.qZA(),e.TgZ(63,"div",8),e.TgZ(64,"div",14),e.TgZ(65,"div",15),e._UZ(66,"input",40),e.TgZ(67,"label",41),e.SDv(68,42),e.qZA(),e.qZA(),e.qZA(),e.qZA(),e.YNc(69,_o,6,0,"div",19),e.YNc(70,oo,7,2,"div",19),e.YNc(71,io,6,0,"div",19),e.YNc(72,ro,7,2,"div",19),e.qZA(),e.TgZ(73,"fieldset"),e.TgZ(74,"legend"),e.SDv(75,43),e.qZA(),e.TgZ(76,"div",8),e.TgZ(77,"div",14),e.TgZ(78,"div",15),e._UZ(79,"input",44),e.TgZ(80,"label",45),e.SDv(81,46),e.qZA(),e.qZA(),e.qZA(),e.qZA(),e.YNc(82,lo,6,0,"div",19),e.YNc(83,Ro,7,2,"div",19),e.YNc(84,go,6,0,"div",19),e.YNc(85,So,7,2,"div",19),e.qZA(),e.qZA(),e.TgZ(86,"div",47),e.TgZ(87,"cd-form-button-panel",48),e.NdJ("submitActionEvent",function(){return e.CHM(_),e.oxw().onSubmit()}),e.ALo(88,"titlecase"),e.ALo(89,"upperFirst"),e.qZA(),e.qZA(),e.qZA(),e.qZA(),e.qZA()}if(2&t){const _=e.MAs(2),n=e.oxw();e.xp6(1),e.Q6J("formGroup",n.userForm),e.xp6(6),e.pQV(e.lcZ(6,30,n.action))(e.lcZ(7,32,n.resource)),e.QtT(5),e.xp6(3),e.Q6J("ngClass",e.VKq(38,Je,!n.editing)),e.xp6(3),e.Q6J("readonly",n.editing),e.xp6(1),e.Q6J("ngIf",n.userForm.showError("user_id",_,"required")),e.xp6(1),e.Q6J("ngIf",n.userForm.showError("user_id",_,"pattern")),e.xp6(1),e.Q6J("ngIf",!n.userForm.getValue("show_tenant")&&n.userForm.showError("user_id",_,"notUnique")),e.xp6(4),e.Q6J("readonly",!0),e.xp6(3),e.Q6J("ngIf",n.userForm.getValue("show_tenant")),e.xp6(2),e.Q6J("ngClass",e.VKq(40,Je,!n.editing)),e.xp6(4),e.Q6J("ngIf",n.userForm.showError("display_name",_,"pattern")),e.xp6(1),e.Q6J("ngIf",n.userForm.showError("display_name",_,"required")),e.xp6(6),e.Q6J("ngIf",n.userForm.showError("email",_,"email")),e.xp6(1),e.Q6J("ngIf",n.userForm.showError("email",_,"notUnique")),e.xp6(12),e.Q6J("ngIf",1==n.userForm.get("max_buckets_mode").value),e.xp6(7),e.Q6J("ngIf",!n.editing),e.xp6(1),e.Q6J("ngIf",n.editing),e.xp6(1),e.Q6J("ngIf",n.editing),e.xp6(1),e.Q6J("ngIf",n.editing),e.xp6(10),e.Q6J("ngIf",n.userForm.controls.user_quota_enabled.value),e.xp6(1),e.Q6J("ngIf",n.userForm.controls.user_quota_enabled.value&&!n.userForm.getValue("user_quota_max_size_unlimited")),e.xp6(1),e.Q6J("ngIf",n.userForm.controls.user_quota_enabled.value),e.xp6(1),e.Q6J("ngIf",n.userForm.controls.user_quota_enabled.value&&!n.userForm.getValue("user_quota_max_objects_unlimited")),e.xp6(10),e.Q6J("ngIf",n.userForm.controls.bucket_quota_enabled.value),e.xp6(1),e.Q6J("ngIf",n.userForm.controls.bucket_quota_enabled.value&&!n.userForm.getValue("bucket_quota_max_size_unlimited")),e.xp6(1),e.Q6J("ngIf",n.userForm.controls.bucket_quota_enabled.value),e.xp6(1),e.Q6J("ngIf",n.userForm.controls.bucket_quota_enabled.value&&!n.userForm.getValue("bucket_quota_max_objects_unlimited")),e.xp6(2),e.Q6J("form",n.userForm)("submitText",e.lcZ(88,34,n.action)+" "+e.lcZ(89,36,n.resource))}}let Ve=(()=>{class t extends Ie.E{constructor(_,n,i,s,c,d,E){super(),this.formBuilder=_,this.route=n,this.router=i,this.rgwUserService=s,this.modalService=c,this.notificationService=d,this.actionLabels=E,this.editing=!1,this.submitObservables=[],this.icons=D.P,this.subusers=[],this.s3Keys=[],this.swiftKeys=[],this.capabilities=[],this.showTenant=!1,this.previousTenant=null,this.resource="user",this.subuserLabel="subuser",this.s3keyLabel="S3 Key",this.capabilityLabel="capability",this.editing=this.router.url.startsWith(`/rgw/user/${A.MQ.EDIT}`),this.action=this.editing?this.actionLabels.EDIT:this.actionLabels.CREATE,this.createForm()}createForm(){this.userForm=this.formBuilder.group({user_id:[null,[a.kI.required,a.kI.pattern(/^[a-zA-Z0-9!@#%^&*()_-]+$/)],this.editing?[]:[m.h.unique(this.rgwUserService.exists,this.rgwUserService,()=>this.userForm.getValue("tenant"))]],show_tenant:[this.editing],tenant:[null,[a.kI.pattern(/^[a-zA-Z0-9!@#%^&*()_-]+$/)],this.editing?[]:[m.h.unique(this.rgwUserService.exists,this.rgwUserService,()=>this.userForm.getValue("user_id"),!0)]],display_name:[null,[a.kI.required,a.kI.pattern(/^[a-zA-Z0-9!@#%^&*()_ -]+$/)]],email:[null,[m.h.email],[m.h.unique(this.rgwUserService.emailExists,this.rgwUserService)]],max_buckets_mode:[1],max_buckets:[1e3,[m.h.requiredIf({max_buckets_mode:"1"}),m.h.number(!1)]],suspended:[!1],generate_key:[!0],access_key:[null,[m.h.requiredIf({generate_key:!1})]],secret_key:[null,[m.h.requiredIf({generate_key:!1})]],user_quota_enabled:[!1],user_quota_max_size_unlimited:[!0],user_quota_max_size:[null,[m.h.composeIf({user_quota_enabled:!0,user_quota_max_size_unlimited:!1},[a.kI.required,this.quotaMaxSizeValidator])]],user_quota_max_objects_unlimited:[!0],user_quota_max_objects:[null,[m.h.requiredIf({user_quota_enabled:!0,user_quota_max_objects_unlimited:!1})]],bucket_quota_enabled:[!1],bucket_quota_max_size_unlimited:[!0],bucket_quota_max_size:[null,[m.h.composeIf({bucket_quota_enabled:!0,bucket_quota_max_size_unlimited:!1},[a.kI.required,this.quotaMaxSizeValidator])]],bucket_quota_max_objects_unlimited:[!0],bucket_quota_max_objects:[null,[m.h.requiredIf({bucket_quota_enabled:!0,bucket_quota_max_objects_unlimited:!1})]]})}ngOnInit(){this.route.params.subscribe(_=>{if(!_.hasOwnProperty("uid"))return void this.loadingReady();const n=decodeURIComponent(_.uid),i=[];i.push(this.rgwUserService.get(n)),i.push(this.rgwUserService.getQuota(n)),(0,Y.D)(i).subscribe(s=>{const c=u().clone(this.userForm.value);let d=u().pick(s[0],u().keys(this.userForm.value));switch(d.max_buckets){case-1:d.max_buckets_mode=-1,d.max_buckets="";break;case 0:d.max_buckets_mode=0,d.max_buckets="";break;default:d.max_buckets_mode=1}["user","bucket"].forEach(g=>{const C=s[1][g+"_quota"];d[g+"_quota_enabled"]=C.enabled,C.max_size<0?(d[g+"_quota_max_size_unlimited"]=!0,d[g+"_quota_max_size"]=null):(d[g+"_quota_max_size_unlimited"]=!1,d[g+"_quota_max_size"]=`${C.max_size} B`),C.max_objects<0?(d[g+"_quota_max_objects_unlimited"]=!0,d[g+"_quota_max_objects"]=null):(d[g+"_quota_max_objects_unlimited"]=!1,d[g+"_quota_max_objects"]=C.max_objects)}),d=u().merge(c,d),this.userForm.setValue(d),this.subusers=s[0].subusers,this.s3Keys=s[0].keys,this.swiftKeys=s[0].swift_keys;const E={"read, write":"*"};s[0].caps.forEach(g=>{g.perm in E&&(g.perm=E[g.perm])}),this.capabilities=s[0].caps,this.loadingReady()},()=>{this.loadingError()})})}goToListView(){this.router.navigate(["/rgw/user"])}onSubmit(){let _;if(this.userForm.pristine)return void this.goToListView();const n=this.getUID();if(this.editing){if(this._isGeneralDirty()){const i=this._getUpdateArgs();this.submitObservables.push(this.rgwUserService.update(n,i))}_="Updated Object Gateway user '" + n + "'"}else{const i=this._getCreateArgs();this.submitObservables.push(this.rgwUserService.create(i)),_="Created Object Gateway user '" + n + "'"}if(this._isUserQuotaDirty()){const i=this._getUserQuotaArgs();this.submitObservables.push(this.rgwUserService.updateQuota(n,i))}if(this._isBucketQuotaDirty()){const i=this._getBucketQuotaArgs();this.submitObservables.push(this.rgwUserService.updateQuota(n,i))}(0,Ht.z)(...this.submitObservables).subscribe({error:()=>{this.userForm.setErrors({cdSubmitButton:!0})},complete:()=>{this.notificationService.show(Ae.k.success,_),this.goToListView()}})}updateFieldsWhenTenanted(){this.showTenant=this.userForm.getValue("show_tenant"),this.showTenant?(this.userForm.get("user_id").markAsTouched(),this.previousTenant=this.userForm.get("tenant").value,this.userForm.get("tenant").patchValue(null)):(this.userForm.get("user_id").markAsUntouched(),this.userForm.get("tenant").patchValue(this.previousTenant))}getUID(){var _;let n=this.userForm.getValue("user_id");const i=null===(_=this.userForm)||void 0===_?void 0:_.getValue("tenant");return i&&i.length>0&&(n=`${this.userForm.getValue("tenant")}$${n}`),n}quotaMaxSizeValidator(_){return(0,m.P)(_.value)?null:null===RegExp("^(\\d+(\\.\\d+)?)\\s*(B|K(B|iB)?|M(B|iB)?|G(B|iB)?|T(B|iB)?)?$","i").exec(_.value)||(new Ge.H).toBytes(_.value)<1024?{quotaMaxSize:!0}:null}setSubuser(_,n){const i={"full-control":"full","read-write":"readwrite"},s=this.getUID();this.submitObservables.push(this.rgwUserService.createSubuser(s,{subuser:_.id,access:_.permissions in i?i[_.permissions]:_.permissions,key_type:"swift",secret_key:_.secret_key,generate_secret:_.generate_secret?"true":"false"})),u().isNumber(n)?this.subusers[n]=_:(this.subusers.push(_),this.swiftKeys.push({user:_.id,secret_key:_.generate_secret?"Apply your changes first...":_.secret_key})),this.userForm.markAsDirty()}deleteSubuser(_){const n=this.subusers[_];this.submitObservables.push(this.rgwUserService.deleteSubuser(this.getUID(),n.id)),this.s3Keys=this.s3Keys.filter(i=>i.user!==n.id),this.swiftKeys=this.swiftKeys.filter(i=>i.user!==n.id),this.subusers.splice(_,1),this.userForm.markAsDirty()}setCapability(_,n){const i=this.getUID();if(u().isNumber(n)){const s=this.capabilities[n];this.submitObservables.push(this.rgwUserService.deleteCapability(i,s.type,s.perm)),this.submitObservables.push(this.rgwUserService.addCapability(i,_.type,_.perm)),this.capabilities[n]=_}else this.submitObservables.push(this.rgwUserService.addCapability(i,_.type,_.perm)),this.capabilities=[...this.capabilities,_];this.userForm.markAsDirty()}deleteCapability(_){const n=this.capabilities[_];this.submitObservables.push(this.rgwUserService.deleteCapability(this.getUID(),n.type,n.perm)),this.capabilities.splice(_,1),this.capabilities=[...this.capabilities],this.userForm.markAsDirty()}hasAllCapabilities(_){return!u().difference(ze.getAll(),u().map(_,"type")).length}setS3Key(_,n){if(!u().isNumber(n)){const i=_.user.match(/([^:]+)(:(.+))?/),s=i[1],c={subuser:i[2]?i[3]:"",generate_key:_.generate_key?"true":"false"};"false"===c.generate_key&&(u().isNil(_.access_key)||(c.access_key=_.access_key),u().isNil(_.secret_key)||(c.secret_key=_.secret_key)),this.submitObservables.push(this.rgwUserService.addS3Key(s,c)),this.s3Keys.push({user:_.user,access_key:_.generate_key?"Apply your changes first...":_.access_key,secret_key:_.generate_key?"Apply your changes first...":_.secret_key})}this.userForm.markAsDirty()}deleteS3Key(_){const n=this.s3Keys[_];this.submitObservables.push(this.rgwUserService.deleteS3Key(this.getUID(),n.access_key)),this.s3Keys.splice(_,1),this.userForm.markAsDirty()}showSubuserModal(_){const n=this.getUID(),i=this.modalService.show(An);if(u().isNumber(_)){const s=this.subusers[_];i.componentInstance.setEditing(),i.componentInstance.setValues(n,s.id,s.permissions)}else i.componentInstance.setEditing(!1),i.componentInstance.setValues(n),i.componentInstance.setSubusers(this.subusers);i.componentInstance.submitAction.subscribe(s=>{this.setSubuser(s,_)})}showS3KeyModal(_){const n=this.modalService.show(Qe);if(u().isNumber(_)){const i=this.s3Keys[_];n.componentInstance.setViewing(),n.componentInstance.setValues(i.user,i.access_key,i.secret_key)}else{const i=this._getS3KeyUserCandidates();n.componentInstance.setViewing(!1),n.componentInstance.setUserCandidates(i),n.componentInstance.submitAction.subscribe(s=>{this.setS3Key(s)})}}showSwiftKeyModal(_){const n=this.modalService.show(Ye),i=this.swiftKeys[_];n.componentInstance.setValues(i.user,i.secret_key)}showCapabilityModal(_){const n=this.modalService.show(_n);if(u().isNumber(_)){const i=this.capabilities[_];n.componentInstance.setEditing(),n.componentInstance.setValues(i.type,i.perm)}else n.componentInstance.setEditing(!1),n.componentInstance.setCapabilities(this.capabilities);n.componentInstance.submitAction.subscribe(i=>{this.setCapability(i,_)})}_isGeneralDirty(){return["display_name","email","max_buckets_mode","max_buckets","suspended"].some(_=>this.userForm.get(_).dirty)}_isUserQuotaDirty(){return["user_quota_enabled","user_quota_max_size_unlimited","user_quota_max_size","user_quota_max_objects_unlimited","user_quota_max_objects"].some(_=>this.userForm.get(_).dirty)}_isBucketQuotaDirty(){return["bucket_quota_enabled","bucket_quota_max_size_unlimited","bucket_quota_max_size","bucket_quota_max_objects_unlimited","bucket_quota_max_objects"].some(_=>this.userForm.get(_).dirty)}_getCreateArgs(){const _={uid:this.getUID(),display_name:this.userForm.getValue("display_name"),suspended:this.userForm.getValue("suspended"),email:"",max_buckets:this.userForm.getValue("max_buckets"),generate_key:this.userForm.getValue("generate_key"),access_key:"",secret_key:""},n=this.userForm.getValue("email");u().isString(n)&&n.length>0&&u().merge(_,{email:n}),this.userForm.getValue("generate_key")||u().merge(_,{generate_key:!1,access_key:this.userForm.getValue("access_key"),secret_key:this.userForm.getValue("secret_key")});const s=parseInt(this.userForm.getValue("max_buckets_mode"),10);return u().includes([-1,0],s)&&u().merge(_,{max_buckets:s}),_}_getUpdateArgs(){const _={},n=["display_name","email","max_buckets","suspended"];for(const s of n)_[s]=this.userForm.getValue(s);const i=parseInt(this.userForm.getValue("max_buckets_mode"),10);return u().includes([-1,0],i)&&(_.max_buckets=i),_}_getUserQuotaArgs(){const _={quota_type:"user",enabled:this.userForm.getValue("user_quota_enabled"),max_size_kb:-1,max_objects:-1};if(!this.userForm.getValue("user_quota_max_size_unlimited")){const n=(new Ge.H).toBytes(this.userForm.getValue("user_quota_max_size"));_.max_size_kb=(n/1024).toFixed(0)}return this.userForm.getValue("user_quota_max_objects_unlimited")||(_.max_objects=this.userForm.getValue("user_quota_max_objects")),_}_getBucketQuotaArgs(){const _={quota_type:"bucket",enabled:this.userForm.getValue("bucket_quota_enabled"),max_size_kb:-1,max_objects:-1};if(!this.userForm.getValue("bucket_quota_max_size_unlimited")){const n=(new Ge.H).toBytes(this.userForm.getValue("bucket_quota_max_size"));_.max_size_kb=(n/1024).toFixed(0)}return this.userForm.getValue("bucket_quota_max_objects_unlimited")||(_.max_objects=this.userForm.getValue("bucket_quota_max_objects")),_}_getS3KeyUserCandidates(){let _=[];const n=this.getUID();return u().isString(n)&&!u().isEmpty(n)&&_.push(n),this.subusers.forEach(i=>{_.push(i.id)}),this.s3Keys.forEach(i=>{_.push(i.user)}),_=u().uniq(_),_}onMaxBucketsModeChange(_){"1"===_&&(this.userForm.get("max_buckets").valid||this.userForm.patchValue({max_buckets:1e3}))}}return t.\u0275fac=function(_){return new(_||t)(e.Y36(J.O),e.Y36(w.gz),e.Y36(w.F0),e.Y36(O),e.Y36(Te.Z),e.Y36(ve.g),e.Y36(A.p4))},t.\u0275cmp=e.Xpm({type:t,selectors:[["cd-rgw-user-form"]],features:[e.qOj],decls:1,vars:1,consts:function(){let o,_,n,i,s,c,d,E,g,C,b,P,G,N,p,U,W,Z,$,h,I,v,F,T,y,x,S,_e,te,ne,oe,ie,se,ae,re,le,ce,de,ue,Re,R,__,t_,n_,o_,i_,s_,a_,r_,l_,c_,d_,u_,R_,g_,E_,T_,S_,f_,C_,p_,M_,m_,A_,b_,P_,G_,N_;return o="" + "\ufffd0\ufffd" + " " + "\ufffd1\ufffd" + "",_="User ID",n="Show Tenant",i="Full name",s="Email address",c="Max. buckets",d="Disabled",E="Unlimited",g="Custom",C="Suspended",b="User quota",P="Enabled",G="Bucket quota",N="Enabled",p="This field is required.",U="The value is not valid.",W="The chosen user ID is already in use.",Z="Tenant",$="The value is not valid.",h="The chosen user ID exists in this tenant.",I="The value is not valid.",v="This field is required.",F="This is not a valid email address.",T="The chosen email address is already in use.",y="This field is required.",x="The entered value must be >= 1.",S="S3 key",_e="Auto-generate key",te="Access key",ne="This field is required.",oe="Secret key",ie="This field is required.",se="Subusers",ae="" + "\ufffd0\ufffd" + " " + "\ufffd1\ufffd" + "",re="There are no subusers.",le="Edit",ce="Delete",de="Keys",ue="S3",Re="" + "\ufffd0\ufffd" + " " + "\ufffd1\ufffd" + "",R="Swift",__="There are no keys.",t_="Show",n_="Delete",o_="There are no keys.",i_="Show",s_="Capabilities",a_="All capabilities are already added.",r_="" + "\ufffd0\ufffd" + " " + "\ufffd1\ufffd" + "",l_="There are no capabilities.",c_="Edit",d_="Delete",u_="Unlimited size",R_="Max. size",g_="This field is required.",E_="The value is not valid.",T_="Unlimited objects",S_="Max. objects",f_="This field is required.",C_="The entered value must be >= 0.",p_="Unlimited size",M_="Max. size",m_="This field is required.",A_="The value is not valid.",b_="Unlimited objects",P_="Max. objects",G_="This field is required.",N_="The entered value must be >= 0.",[["class","cd-col-form",4,"cdFormLoading"],[1,"cd-col-form"],["novalidate","",3,"formGroup"],["frm","ngForm"],[1,"card"],[1,"card-header"],o,[1,"card-body"],[1,"form-group","row"],["for","user_id",1,"cd-col-form-label",3,"ngClass"],_,[1,"cd-col-form-input"],["id","user_id","type","text","formControlName","user_id",1,"form-control",3,"readonly"],["class","invalid-feedback",4,"ngIf"],[1,"cd-col-form-offset"],[1,"custom-control","custom-checkbox"],["id","show_tenant","type","checkbox","formControlName","show_tenant",1,"custom-control-input",3,"readonly","click"],["for","show_tenant",1,"custom-control-label"],n,["class","form-group row",4,"ngIf"],["for","display_name",1,"cd-col-form-label",3,"ngClass"],i,["id","display_name","type","text","formControlName","display_name",1,"form-control"],["for","email",1,"cd-col-form-label"],s,["id","email","type","text","formControlName","email",1,"form-control"],["for","max_buckets_mode",1,"cd-col-form-label"],c,["formControlName","max_buckets_mode","name","max_buckets_mode","id","max_buckets_mode",1,"form-control",3,"change"],["value","-1"],d,["value","0"],E,["value","1"],g,["id","suspended","type","checkbox","formControlName","suspended",1,"custom-control-input"],["for","suspended",1,"custom-control-label"],C,[4,"ngIf"],b,["id","user_quota_enabled","type","checkbox","formControlName","user_quota_enabled",1,"custom-control-input"],["for","user_quota_enabled",1,"custom-control-label"],P,G,["id","bucket_quota_enabled","type","checkbox","formControlName","bucket_quota_enabled",1,"custom-control-input"],["for","bucket_quota_enabled",1,"custom-control-label"],N,[1,"card-footer"],["wrappingClass","text-right",3,"form","submitText","submitActionEvent"],[1,"invalid-feedback"],p,U,W,["for","tenant",1,"cd-col-form-label"],Z,["id","tenant","type","text","formControlName","tenant","autofocus","",1,"form-control",3,"readonly"],$,h,I,v,F,T,[1,"cd-col-form-label"],["id","max_buckets","type","number","formControlName","max_buckets","min","1",1,"form-control"],y,x,S,["id","generate_key","type","checkbox","formControlName","generate_key",1,"custom-control-input"],["for","generate_key",1,"custom-control-label"],_e,["for","access_key",1,"cd-col-form-label","required"],te,[1,"input-group"],["id","access_key","type","password","formControlName","access_key",1,"form-control"],[1,"input-group-append"],["type","button","cdPasswordButton","access_key",1,"btn","btn-light"],["source","access_key"],ne,["for","secret_key",1,"cd-col-form-label","required"],oe,["id","secret_key","type","password","formControlName","secret_key",1,"form-control"],["type","button","cdPasswordButton","secret_key",1,"btn","btn-light"],["source","secret_key"],ie,se,[1,"row"],["class","no-border",4,"ngIf"],[4,"ngFor","ngForOf"],[1,"col-12"],["type","button",1,"btn","btn-light","float-right","tc_addSubuserButton",3,"click"],[3,"ngClass"],ae,[1,"help-block"],[1,"no-border"],[1,"form-text","text-muted"],re,[1,"input-group-prepend"],[1,"input-group-text"],["type","text","readonly","",1,"cd-form-control",3,"value"],[1,"input-group-prepend","border-left-0","border-right-0"],["type","button","ngbTooltip",le,1,"btn","btn-light","tc_showSubuserButton",3,"click"],["type","button","ngbTooltip",ce,1,"btn","btn-light","tc_deleteSubuserButton",3,"click"],de,ue,["type","button",1,"btn","btn-light","float-right","tc_addS3KeyButton",3,"click"],Re,R,__,["type","button","ngbTooltip",t_,1,"btn","btn-light","tc_showS3KeyButton",3,"click"],["type","button","ngbTooltip",n_,1,"btn","btn-light","tc_deleteS3KeyButton",3,"click"],o_,["type","button","ngbTooltip",i_,1,"btn","btn-light","tc_showSwiftKeyButton",3,"click"],s_,["type","button","ngbTooltip",a_,"triggers","pointerenter:pointerleave",1,"btn","btn-light","float-right","tc_addCapButton",3,"disabled","disableTooltip","click"],r_,l_,["type","button","ngbTooltip",c_,1,"btn","btn-light","tc_editCapButton",3,"click"],["type","button","ngbTooltip",d_,1,"btn","btn-light","tc_deleteCapButton",3,"click"],["id","user_quota_max_size_unlimited","type","checkbox","formControlName","user_quota_max_size_unlimited",1,"custom-control-input"],["for","user_quota_max_size_unlimited",1,"custom-control-label"],u_,["for","user_quota_max_size",1,"cd-col-form-label","required"],R_,["id","user_quota_max_size","type","text","formControlName","user_quota_max_size","cdDimlessBinary","",1,"form-control"],g_,E_,["id","user_quota_max_objects_unlimited","type","checkbox","formControlName","user_quota_max_objects_unlimited",1,"custom-control-input"],["for","user_quota_max_objects_unlimited",1,"custom-control-label"],T_,["for","user_quota_max_objects",1,"cd-col-form-label","required"],S_,["id","user_quota_max_objects","type","number","formControlName","user_quota_max_objects","min","0",1,"form-control"],f_,C_,["id","bucket_quota_max_size_unlimited","type","checkbox","formControlName","bucket_quota_max_size_unlimited",1,"custom-control-input"],["for","bucket_quota_max_size_unlimited",1,"custom-control-label"],p_,["for","bucket_quota_max_size",1,"cd-col-form-label","required"],M_,["id","bucket_quota_max_size","type","text","formControlName","bucket_quota_max_size","cdDimlessBinary","",1,"form-control"],m_,A_,["id","bucket_quota_max_objects_unlimited","type","checkbox","formControlName","bucket_quota_max_objects_unlimited",1,"custom-control-input"],["for","bucket_quota_max_objects_unlimited",1,"custom-control-label"],b_,["for","bucket_quota_max_objects",1,"cd-col-form-label","required"],P_,["id","bucket_quota_max_objects","type","number","formControlName","bucket_quota_max_objects","min","0",1,"form-control"],G_,N_]},template:function(_,n){1&_&&e.YNc(0,fo,90,42,"div",0),2&_&&e.Q6J("cdFormLoading",n.loading)},directives:[Fe.y,a._Y,a.JL,V.V,a.sg,H.P,f.mk,q.o,a.Fj,X.b,a.JJ,a.u,f.O5,a.Wl,a.EJ,a.YN,a.Kr,ee.p,j.U,a.wV,a.qQ,Ce.C,pe.s,f.sg,M._L,Pn.Q],pipes:[f.rS,K.m,Ue.i],styles:[""]}),t})();var je=r(99466),Co=r(78877),po=r(86969);const Mo=["accessKeyTpl"],mo=["secretKeyTpl"];function Ao(t,o){if(1&t&&(e.TgZ(0,"tr"),e.TgZ(1,"td",15),e.SDv(2,20),e.qZA(),e.TgZ(3,"td"),e._uU(4),e.qZA(),e.qZA()),2&t){const _=e.oxw(4);e.xp6(4),e.Oqu(_.user.email)}}function bo(t,o){if(1&t&&(e.TgZ(0,"div"),e._uU(1),e.qZA()),2&t){const _=o.$implicit;e.xp6(1),e.AsE(" ",_.id," (",_.permissions,") ")}}function Po(t,o){if(1&t&&(e.TgZ(0,"tr"),e.TgZ(1,"td",15),e.SDv(2,21),e.qZA(),e.TgZ(3,"td"),e.YNc(4,bo,2,2,"div",22),e.qZA(),e.qZA()),2&t){const _=e.oxw(4);e.xp6(4),e.Q6J("ngForOf",_.user.subusers)}}function Go(t,o){if(1&t&&(e.TgZ(0,"div"),e._uU(1),e.qZA()),2&t){const _=o.$implicit;e.xp6(1),e.AsE(" ",_.type," (",_.perm,") ")}}function No(t,o){if(1&t&&(e.TgZ(0,"tr"),e.TgZ(1,"td",15),e.SDv(2,23),e.qZA(),e.TgZ(3,"td"),e.YNc(4,Go,2,2,"div",22),e.qZA(),e.qZA()),2&t){const _=e.oxw(4);e.xp6(4),e.Q6J("ngForOf",_.user.caps)}}function Oo(t,o){if(1&t&&(e.TgZ(0,"tr"),e.TgZ(1,"td",15),e.SDv(2,24),e.qZA(),e.TgZ(3,"td"),e._uU(4),e.ALo(5,"join"),e.qZA(),e.qZA()),2&t){const _=e.oxw(4);e.xp6(4),e.Oqu(e.lcZ(5,1,_.user.mfa_ids))}}function Uo(t,o){1&t&&(e.TgZ(0,"td"),e._uU(1,"-"),e.qZA())}function Wo(t,o){1&t&&(e.TgZ(0,"td"),e.SDv(1,29),e.qZA())}function Zo(t,o){if(1&t&&(e.TgZ(0,"td"),e._uU(1),e.ALo(2,"dimlessBinary"),e.qZA()),2&t){const _=e.oxw(5);e.xp6(1),e.hij(" ",e.lcZ(2,1,_.user.user_quota.max_size)," ")}}function $o(t,o){1&t&&(e.TgZ(0,"td"),e._uU(1,"-"),e.qZA())}function ho(t,o){1&t&&(e.TgZ(0,"td"),e.SDv(1,30),e.qZA())}function Io(t,o){if(1&t&&(e.TgZ(0,"td"),e._uU(1),e.qZA()),2&t){const _=e.oxw(5);e.xp6(1),e.hij(" ",_.user.user_quota.max_objects," ")}}function vo(t,o){if(1&t&&(e.TgZ(0,"div"),e.TgZ(1,"legend"),e.SDv(2,25),e.qZA(),e.TgZ(3,"table",9),e.TgZ(4,"tbody"),e.TgZ(5,"tr"),e.TgZ(6,"td",10),e.SDv(7,26),e.qZA(),e.TgZ(8,"td",12),e._uU(9),e.ALo(10,"booleanText"),e.qZA(),e.qZA(),e.TgZ(11,"tr"),e.TgZ(12,"td",15),e.SDv(13,27),e.qZA(),e.YNc(14,Uo,2,0,"td",0),e.YNc(15,Wo,2,0,"td",0),e.YNc(16,Zo,3,3,"td",0),e.qZA(),e.TgZ(17,"tr"),e.TgZ(18,"td",15),e.SDv(19,28),e.qZA(),e.YNc(20,$o,2,0,"td",0),e.YNc(21,ho,2,0,"td",0),e.YNc(22,Io,2,1,"td",0),e.qZA(),e.qZA(),e.qZA(),e.qZA()),2&t){const _=e.oxw(4);e.xp6(9),e.Oqu(e.lcZ(10,7,_.user.user_quota.enabled)),e.xp6(5),e.Q6J("ngIf",!_.user.user_quota.enabled),e.xp6(1),e.Q6J("ngIf",_.user.user_quota.enabled&&_.user.user_quota.max_size<=-1),e.xp6(1),e.Q6J("ngIf",_.user.user_quota.enabled&&_.user.user_quota.max_size>-1),e.xp6(4),e.Q6J("ngIf",!_.user.user_quota.enabled),e.xp6(1),e.Q6J("ngIf",_.user.user_quota.enabled&&_.user.user_quota.max_objects<=-1),e.xp6(1),e.Q6J("ngIf",_.user.user_quota.enabled&&_.user.user_quota.max_objects>-1)}}function Fo(t,o){1&t&&(e.TgZ(0,"td"),e._uU(1,"-"),e.qZA())}function Lo(t,o){1&t&&(e.TgZ(0,"td"),e.SDv(1,35),e.qZA())}function Do(t,o){if(1&t&&(e.TgZ(0,"td"),e._uU(1),e.ALo(2,"dimlessBinary"),e.qZA()),2&t){const _=e.oxw(5);e.xp6(1),e.hij(" ",e.lcZ(2,1,_.user.bucket_quota.max_size)," ")}}function yo(t,o){1&t&&(e.TgZ(0,"td"),e._uU(1,"-"),e.qZA())}function xo(t,o){1&t&&(e.TgZ(0,"td"),e.SDv(1,36),e.qZA())}function qo(t,o){if(1&t&&(e.TgZ(0,"td"),e._uU(1),e.qZA()),2&t){const _=e.oxw(5);e.xp6(1),e.hij(" ",_.user.bucket_quota.max_objects," ")}}function wo(t,o){if(1&t&&(e.TgZ(0,"div"),e.TgZ(1,"legend"),e.SDv(2,31),e.qZA(),e.TgZ(3,"table",9),e.TgZ(4,"tbody"),e.TgZ(5,"tr"),e.TgZ(6,"td",10),e.SDv(7,32),e.qZA(),e.TgZ(8,"td",12),e._uU(9),e.ALo(10,"booleanText"),e.qZA(),e.qZA(),e.TgZ(11,"tr"),e.TgZ(12,"td",15),e.SDv(13,33),e.qZA(),e.YNc(14,Fo,2,0,"td",0),e.YNc(15,Lo,2,0,"td",0),e.YNc(16,Do,3,3,"td",0),e.qZA(),e.TgZ(17,"tr"),e.TgZ(18,"td",15),e.SDv(19,34),e.qZA(),e.YNc(20,yo,2,0,"td",0),e.YNc(21,xo,2,0,"td",0),e.YNc(22,qo,2,1,"td",0),e.qZA(),e.qZA(),e.qZA(),e.qZA()),2&t){const _=e.oxw(4);e.xp6(9),e.Oqu(e.lcZ(10,7,_.user.bucket_quota.enabled)),e.xp6(5),e.Q6J("ngIf",!_.user.bucket_quota.enabled),e.xp6(1),e.Q6J("ngIf",_.user.bucket_quota.enabled&&_.user.bucket_quota.max_size<=-1),e.xp6(1),e.Q6J("ngIf",_.user.bucket_quota.enabled&&_.user.bucket_quota.max_size>-1),e.xp6(4),e.Q6J("ngIf",!_.user.bucket_quota.enabled),e.xp6(1),e.Q6J("ngIf",_.user.bucket_quota.enabled&&_.user.bucket_quota.max_objects<=-1),e.xp6(1),e.Q6J("ngIf",_.user.bucket_quota.enabled&&_.user.bucket_quota.max_objects>-1)}}function ko(t,o){if(1&t&&(e.TgZ(0,"div"),e.TgZ(1,"table",9),e.TgZ(2,"tbody"),e.TgZ(3,"tr"),e.TgZ(4,"td",10),e.SDv(5,11),e.qZA(),e.TgZ(6,"td",12),e._uU(7),e.qZA(),e.qZA(),e.TgZ(8,"tr"),e.TgZ(9,"td",10),e.SDv(10,13),e.qZA(),e.TgZ(11,"td",12),e._uU(12),e.qZA(),e.qZA(),e.TgZ(13,"tr"),e.TgZ(14,"td",10),e.SDv(15,14),e.qZA(),e.TgZ(16,"td",12),e._uU(17),e.qZA(),e.qZA(),e.TgZ(18,"tr"),e.TgZ(19,"td",15),e.SDv(20,16),e.qZA(),e.TgZ(21,"td"),e._uU(22),e.qZA(),e.qZA(),e.YNc(23,Ao,5,1,"tr",0),e.TgZ(24,"tr"),e.TgZ(25,"td",15),e.SDv(26,17),e.qZA(),e.TgZ(27,"td"),e._uU(28),e.ALo(29,"booleanText"),e.qZA(),e.qZA(),e.TgZ(30,"tr"),e.TgZ(31,"td",15),e.SDv(32,18),e.qZA(),e.TgZ(33,"td"),e._uU(34),e.ALo(35,"booleanText"),e.qZA(),e.qZA(),e.TgZ(36,"tr"),e.TgZ(37,"td",15),e.SDv(38,19),e.qZA(),e.TgZ(39,"td"),e._uU(40),e.ALo(41,"map"),e.qZA(),e.qZA(),e.YNc(42,Po,5,1,"tr",0),e.YNc(43,No,5,1,"tr",0),e.YNc(44,Oo,6,3,"tr",0),e.qZA(),e.qZA(),e.YNc(45,vo,23,9,"div",0),e.YNc(46,wo,23,9,"div",0),e.qZA()),2&t){const _=e.oxw(3);e.xp6(7),e.Oqu(_.user.tenant),e.xp6(5),e.Oqu(_.user.user_id),e.xp6(5),e.Oqu(_.user.uid),e.xp6(5),e.Oqu(_.user.display_name),e.xp6(1),e.Q6J("ngIf",null==_.user.email?null:_.user.email.length),e.xp6(5),e.Oqu(e.lcZ(29,13,_.user.suspended)),e.xp6(6),e.Oqu(e.lcZ(35,15,"true"===_.user.system)),e.xp6(6),e.Oqu(e.xi3(41,17,_.user.max_buckets,_.maxBucketsMap)),e.xp6(2),e.Q6J("ngIf",_.user.subusers&&_.user.subusers.length),e.xp6(1),e.Q6J("ngIf",_.user.caps&&_.user.caps.length),e.xp6(1),e.Q6J("ngIf",null==_.user.mfa_ids?null:_.user.mfa_ids.length),e.xp6(1),e.Q6J("ngIf",_.user.user_quota),e.xp6(1),e.Q6J("ngIf",_.user.bucket_quota)}}function Bo(t,o){if(1&t&&e.YNc(0,ko,47,20,"div",0),2&t){const _=e.oxw(2);e.Q6J("ngIf",_.user)}}const Ho=function(t){return[t]};function Xo(t,o){if(1&t){const _=e.EpF();e.TgZ(0,"cd-table",39),e.NdJ("updateSelection",function(i){return e.CHM(_),e.oxw(3).updateKeysSelection(i)}),e.TgZ(1,"div",40),e.TgZ(2,"div",41),e.TgZ(3,"button",42),e.NdJ("click",function(){return e.CHM(_),e.oxw(3).showKeyModal()}),e._UZ(4,"i",43),e.ynx(5),e.SDv(6,44),e.BQk(),e.qZA(),e.qZA(),e.qZA(),e.qZA()}if(2&t){const _=e.oxw(3);e.Q6J("data",_.keys)("columns",_.keysColumns),e.xp6(3),e.Q6J("disabled",!_.keysSelection.hasSingleSelection),e.xp6(1),e.Q6J("ngClass",e.VKq(4,Ho,_.icons.show))}}function Ko(t,o){1&t&&(e.TgZ(0,"li",37),e.TgZ(1,"a",4),e.SDv(2,38),e.qZA(),e.YNc(3,Xo,7,6,"ng-template",6),e.qZA())}function zo(t,o){if(1&t&&(e.ynx(0),e.TgZ(1,"ul",1,2),e.TgZ(3,"li",3),e.TgZ(4,"a",4),e.SDv(5,5),e.qZA(),e.YNc(6,Bo,1,1,"ng-template",6),e.qZA(),e.YNc(7,Ko,4,0,"li",7),e.qZA(),e._UZ(8,"div",8),e.BQk()),2&t){const _=e.MAs(2),n=e.oxw();e.xp6(7),e.Q6J("ngIf",n.keys.length),e.xp6(1),e.Q6J("ngbNavOutlet",_)}}let Qo=(()=>{class t{constructor(_,n){this.rgwUserService=_,this.modalService=n,this.keys=[],this.keysColumns=[],this.keysSelection=new Pe.r,this.icons=D.P}ngOnInit(){this.keysColumns=[{name:"Username",prop:"username",flexGrow:1},{name:"Type",prop:"type",flexGrow:1}],this.maxBucketsMap={"-1":"Disabled",0:"Unlimited"}}ngOnChanges(){this.selection&&(this.user=this.selection,this.user.subusers=u().sortBy(this.user.subusers,"id"),this.user.caps=u().sortBy(this.user.caps,"type"),this.rgwUserService.getQuota(this.user.uid).subscribe(_=>{u().extend(this.user,_)}),this.keys=[],this.user.keys&&this.user.keys.forEach(_=>{this.keys.push({id:this.keys.length+1,type:"S3",username:_.user,ref:_})}),this.user.swift_keys&&this.user.swift_keys.forEach(_=>{this.keys.push({id:this.keys.length+1,type:"Swift",username:_.user,ref:_})}),this.keys=u().sortBy(this.keys,"user"))}updateKeysSelection(_){this.keysSelection=_}showKeyModal(){const _=this.keysSelection.first(),n=this.modalService.show("S3"===_.type?Qe:Ye);switch(_.type){case"S3":n.componentInstance.setViewing(),n.componentInstance.setValues(_.ref.user,_.ref.access_key,_.ref.secret_key);break;case"Swift":n.componentInstance.setValues(_.ref.user,_.ref.secret_key)}}}return t.\u0275fac=function(_){return new(_||t)(e.Y36(O),e.Y36(Te.Z))},t.\u0275cmp=e.Xpm({type:t,selectors:[["cd-rgw-user-details"]],viewQuery:function(_,n){if(1&_&&(e.Gf(Mo,5),e.Gf(mo,5)),2&_){let i;e.iGM(i=e.CRH())&&(n.accessKeyTpl=i.first),e.iGM(i=e.CRH())&&(n.secretKeyTpl=i.first)}},inputs:{selection:"selection"},features:[e.TTD],decls:1,vars:1,consts:function(){let o,_,n,i,s,c,d,E,g,C,b,P,G,N,p,U,W,Z,$,h,I,v,F,T,y,x;return o="Details",_="Tenant",n="User ID",i="Username",s="Full name",c="Suspended",d="System",E="Maximum buckets",g="Email address",C="Subusers",b="Capabilities",P="MFAs(Id)",G="User quota",N="Enabled",p="Maximum size",U="Maximum objects",W="Unlimited",Z="Unlimited",$="Bucket quota",h="Enabled",I="Maximum size",v="Maximum objects",F="Unlimited",T="Unlimited",y="Keys",x="Show",[[4,"ngIf"],["ngbNav","","cdStatefulTab","rgw-user-details",1,"nav-tabs"],["nav","ngbNav"],["ngbNavItem","details"],["ngbNavLink",""],o,["ngbNavContent",""],["ngbNavItem","keys",4,"ngIf"],[3,"ngbNavOutlet"],[1,"table","table-striped","table-bordered"],[1,"bold","w-25"],_,[1,"w-75"],n,i,[1,"bold"],s,c,d,E,g,C,[4,"ngFor","ngForOf"],b,P,G,N,p,U,W,Z,$,h,I,v,F,T,["ngbNavItem","keys"],y,["columnMode","flex","selectionType","multi","forceIdentifier","true",3,"data","columns","updateSelection"],[1,"table-actions"],["dropdown","",1,"btn-group"],["type","button",1,"btn","btn-accent",3,"disabled","click"],[3,"ngClass"],x]},template:function(_,n){1&_&&e.YNc(0,zo,9,2,"ng-container",0),2&_&&e.Q6J("ngIf",n.selection)},directives:[f.O5,M.Pz,Xe.m,M.nv,M.Vx,M.uN,M.tO,f.sg,z.a,q.o,f.mk],pipes:[Be.T,Co.b,po.A,qe.$],styles:[""]}),t})();const Yo=["userSizeTpl"],Jo=["userObjectTpl"];function Vo(t,o){if(1&t&&e._UZ(0,"cd-usage-bar",8),2&t){const _=e.oxw().row;e.Q6J("total",_.user_quota.max_size)("used",_.stats.size_actual)}}function jo(t,o){1&t&&e.SDv(0,9)}function ei(t,o){if(1&t&&(e.YNc(0,Vo,1,2,"cd-usage-bar",6),e.YNc(1,jo,1,0,"ng-template",null,7,e.W1O)),2&t){const _=o.row,n=e.MAs(2);e.Q6J("ngIf",_.user_quota.max_size>0&&_.user_quota.enabled)("ngIfElse",n)}}function _i(t,o){if(1&t&&e._UZ(0,"cd-usage-bar",12),2&t){const _=e.oxw().row;e.Q6J("total",_.user_quota.max_objects)("used",_.stats.num_objects)("isBinary",!1)}}function ti(t,o){1&t&&e.SDv(0,13)}function ni(t,o){if(1&t&&(e.YNc(0,_i,1,3,"cd-usage-bar",10),e.YNc(1,ti,1,0,"ng-template",null,11,e.W1O)),2&t){const _=o.row,n=e.MAs(2);e.Q6J("ngIf",_.user_quota.max_objects>0&&_.user_quota.enabled)("ngIfElse",n)}}let ii=(()=>{class t extends be.o{constructor(_,n,i,s,c,d){super(d),this.authStorageService=_,this.rgwUserService=n,this.modalService=i,this.urlBuilder=s,this.actionLabels=c,this.ngZone=d,this.columns=[],this.users=[],this.selection=new Pe.r}ngOnInit(){this.permission=this.authStorageService.getPermissions().rgw,this.columns=[{name:"Username",prop:"uid",flexGrow:1},{name:"Tenant",prop:"tenant",flexGrow:1},{name:"Full name",prop:"display_name",flexGrow:1},{name:"Email address",prop:"email",flexGrow:1},{name:"Suspended",prop:"suspended",flexGrow:1,cellClass:"text-center",cellTransformation:je.e.checkIcon},{name:"Max. buckets",prop:"max_buckets",flexGrow:1,cellTransformation:je.e.map,customTemplateConfig:{"-1":"Disabled",0:"Unlimited"}},{name:"Capacity Limit %",prop:"size_usage",cellTemplate:this.userSizeTpl,flexGrow:.8},{name:"Object Limit %",prop:"object_usage",cellTemplate:this.userObjectTpl,flexGrow:.8}];const _=()=>this.selection.first()&&`${encodeURIComponent(this.selection.first().uid)}`;this.tableActions=[{permission:"create",icon:D.P.add,routerLink:()=>this.urlBuilder.getCreate(),name:this.actionLabels.CREATE,canBePrimary:c=>!c.hasSelection},{permission:"update",icon:D.P.edit,routerLink:()=>this.urlBuilder.getEdit(_()),name:this.actionLabels.EDIT},{permission:"delete",icon:D.P.destroy,click:()=>this.deleteAction(),disable:()=>!this.selection.hasSelection,name:this.actionLabels.DELETE,canBePrimary:c=>c.hasMultiSelection}],this.setTableRefreshTimeout()}getUserList(_){this.setTableRefreshTimeout(),this.rgwUserService.list().subscribe(n=>{this.users=n},()=>{_.error()})}updateSelection(_){this.selection=_}deleteAction(){this.modalService.show(xe.M,{itemDescription:this.selection.hasSingleSelection?"user":"users",itemNames:this.selection.selected.map(_=>_.uid),submitActionObservable:()=>new ye.y(_=>{(0,Y.D)(this.selection.selected.map(n=>this.rgwUserService.delete(n.uid))).subscribe({error:n=>{_.error(n),this.table.refreshBtn()},complete:()=>{_.complete(),this.table.refreshBtn()}})})})}}return t.\u0275fac=function(_){return new(_||t)(e.Y36(Ee.j),e.Y36(O),e.Y36(Te.Z),e.Y36(Q.F),e.Y36(A.p4),e.Y36(e.R0b))},t.\u0275cmp=e.Xpm({type:t,selectors:[["cd-rgw-user-list"]],viewQuery:function(_,n){if(1&_&&(e.Gf(z.a,7),e.Gf(Yo,7),e.Gf(Jo,7)),2&_){let i;e.iGM(i=e.CRH())&&(n.table=i.first),e.iGM(i=e.CRH())&&(n.userSizeTpl=i.first),e.iGM(i=e.CRH())&&(n.userObjectTpl=i.first)}},features:[e._Bn([{provide:Q.F,useValue:new Q.F("rgw/user")}]),e.qOj],decls:8,vars:9,consts:function(){let o,_;return o="No Limit",_="No Limit",[["columnMode","flex","selectionType","multiClick","identifier","uid",3,"autoReload","data","columns","hasDetails","status","setExpandedRow","updateSelection","fetchData"],["table",""],[1,"table-actions",3,"permission","selection","tableActions"],["cdTableDetail","",3,"selection"],["userSizeTpl",""],["userObjectTpl",""],[3,"total","used",4,"ngIf","ngIfElse"],["noSizeQuota",""],[3,"total","used"],o,[3,"total","used","isBinary",4,"ngIf","ngIfElse"],["noObjectQuota",""],[3,"total","used","isBinary"],_]},template:function(_,n){1&_&&(e.TgZ(0,"cd-table",0,1),e.NdJ("setExpandedRow",function(s){return n.setExpandedRow(s)})("updateSelection",function(s){return n.updateSelection(s)})("fetchData",function(s){return n.getUserList(s)}),e._UZ(2,"cd-table-actions",2),e._UZ(3,"cd-rgw-user-details",3),e.qZA(),e.YNc(4,ei,3,2,"ng-template",null,4,e.W1O),e.YNc(6,ni,3,2,"ng-template",null,5,e.W1O)),2&_&&(e.Q6J("autoReload",!1)("data",n.users)("columns",n.columns)("hasDetails",!0)("status",n.tableStatus),e.xp6(2),e.Q6J("permission",n.permission)("selection",n.selection)("tableActions",n.tableActions),e.xp6(1),e.Q6J("selection",n.expandedRow))},directives:[z.a,ke.K,Qo,f.O5,He.O],styles:[""]}),t})(),e_=(()=>{class t{}return t.\u0275fac=function(_){return new(_||t)},t.\u0275mod=e.oAB({type:t}),t.\u0275inj=e.cJS({imports:[[f.ez,O_.m,a.u5,a.UX,U_.B,M.Oz,w.Bz,M.HK,Ue.b]]}),t})();const si=[{path:""},{path:"daemon",component:Bt,data:{breadcrumbs:"Daemons"}},{path:"user",data:{breadcrumbs:"Users"},children:[{path:"",component:ii},{path:A.MQ.CREATE,component:Ve,data:{breadcrumbs:A.Qn.CREATE}},{path:`${A.MQ.EDIT}/:uid`,component:Ve,data:{breadcrumbs:A.Qn.EDIT}}]},{path:"bucket",data:{breadcrumbs:"Buckets"},children:[{path:"",component:Ut},{path:A.MQ.CREATE,component:De,data:{breadcrumbs:A.Qn.CREATE}},{path:`${A.MQ.EDIT}/:bid`,component:De,data:{breadcrumbs:A.Qn.EDIT}}]}];let ai=(()=>{class t{}return t.\u0275fac=function(_){return new(_||t)},t.\u0275mod=e.oAB({type:t}),t.\u0275inj=e.cJS({imports:[[e_,w.Bz.forChild(si)]]}),t})()}}]);
\ No newline at end of file
index 0f40b833c75b9393d73957d3e2c1e6a48d835d90..f5c0d00249b9f807f57959e2922320974a8beb25 100644 (file)
@@ -348,6 +348,30 @@ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
 THE SOFTWARE.
 
 
 THE SOFTWARE.
 
 
+@popperjs/core
+MIT
+The MIT License (MIT)
+
+Copyright (c) 2019 Federico Zivolo
+
+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.
+
+
 @swimlane/ngx-datatable
 MIT
 (The MIT License)
 @swimlane/ngx-datatable
 MIT
 (The MIT License)
@@ -665,7 +689,7 @@ SOFTWARE.
 
 core-js
 MIT
 
 core-js
 MIT
-Copyright (c) 2014-2022 Denis Pushkarev
+Copyright (c) 2014-2023 Denis Pushkarev
 
 Permission is hereby granted, free of charge, to any person obtaining a copy
 of this software and associated documentation files (the "Software"), to deal
 
 Permission is hereby granted, free of charge, to any person obtaining a copy
 of this software and associated documentation files (the "Software"), to deal
@@ -688,7 +712,7 @@ THE SOFTWARE.
 
 core-js-pure
 MIT
 
 core-js-pure
 MIT
-Copyright (c) 2014-2022 Denis Pushkarev
+Copyright (c) 2014-2023 Denis Pushkarev
 
 Permission is hereby granted, free of charge, to any person obtaining a copy
 of this software and associated documentation files (the "Software"), to deal
 
 Permission is hereby granted, free of charge, to any person obtaining a copy
 of this software and associated documentation files (the "Software"), to deal
@@ -2896,6 +2920,27 @@ SOFTWARE.
 
 simplebar
 MIT
 
 simplebar
 MIT
+The MIT License (MIT)
+
+Copyright (c) 2015 Jonathan Nicol
+
+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.
 
 simplebar-angular
 The MIT License (MIT)
 
 simplebar-angular
 The MIT License (MIT)
@@ -3487,7 +3532,7 @@ zone.js
 MIT
 The MIT License
 
 MIT
 The MIT License
 
-Copyright (c) 2010-2020 Google LLC. http://angular.io/license
+Copyright (c) 2010-2022 Google LLC. https://angular.io/license
 
 Permission is hereby granted, free of charge, to any person obtaining a copy
 of this software and associated documentation files (the "Software"), to deal
 
 Permission is hereby granted, free of charge, to any person obtaining a copy
 of this software and associated documentation files (the "Software"), to deal
diff --git a/ceph/src/pybind/mgr/dashboard/frontend/dist/en-US/43.819b1fed46aadf1b.js b/ceph/src/pybind/mgr/dashboard/frontend/dist/en-US/43.819b1fed46aadf1b.js
new file mode 100644 (file)
index 0000000..9e1584c
--- /dev/null
@@ -0,0 +1 @@
+"use strict";(self.webpackChunkceph_dashboard=self.webpackChunkceph_dashboard||[]).push([[43],{21043:(dt,he,p)=>{p.r(he),p.d(he,{BlockModule:()=>Bt,RoutedBlockModule:()=>ur});var c=p(11048),a=p(1659),g=p(55860),ne=p(62946),v=p(71334),be=p(37496),D=p(79512),U=p(4222),re=p(54462),Ae=p(44466),Ne=p(23815),S=p.n(Ne),le=p(35758),F=p(64762),ie=p(19725),Y=p(93523),e=p(89724);let Q=class{constructor(s){this.http=s}listTargets(){return this.http.get("api/iscsi/target")}getTarget(s){return this.http.get(`api/iscsi/target/${s}`)}updateTarget(s,t){return this.http.put(`api/iscsi/target/${s}`,t,{observe:"response"})}status(){return this.http.get("ui-api/iscsi/status")}settings(){return this.http.get("ui-api/iscsi/settings")}version(){return this.http.get("ui-api/iscsi/version")}portals(){return this.http.get("ui-api/iscsi/portals")}createTarget(s){return this.http.post("api/iscsi/target",s,{observe:"response"})}deleteTarget(s){return this.http.delete(`api/iscsi/target/${s}`,{observe:"response"})}getDiscovery(){return this.http.get("api/iscsi/discoveryauth")}updateDiscovery(s){return this.http.put("api/iscsi/discoveryauth",s)}overview(){return this.http.get("ui-api/iscsi/overview")}};Q.\u0275fac=function(s){return new(s||Q)(e.LFG(ie.eN))},Q.\u0275prov=e.Yz7({token:Q,factory:Q.\u0275fac,providedIn:"root"}),Q=(0,F.gn)([Y.o,(0,F.w6)("design:paramtypes",[ie.eN])],Q);var Fe=p(88002),De=p(76189),L=p(19358),Pe=p(34089);let H=class extends De.S{constructor(s,t){super(),this.http=s,this.rbdConfigurationService=t}isRBDPool(s){return-1!==S().indexOf(s.application_metadata,"rbd")&&!s.pool_name.includes("/")}create(s){return this.http.post("api/block/image",s,{observe:"response"})}delete(s){return this.http.delete(`api/block/image/${s.toStringEncoded()}`,{observe:"response"})}update(s,t){return this.http.put(`api/block/image/${s.toStringEncoded()}`,t,{observe:"response"})}get(s){return this.http.get(`api/block/image/${s.toStringEncoded()}`)}list(s){return this.http.get("api/block/image",{params:s,headers:{Accept:this.getVersionHeaderValue(2,0)},observe:"response"}).pipe((0,Fe.U)(t=>t.body.map(o=>(o.value.map(i=>(i.configuration&&i.configuration.map(_=>Object.assign(_,this.rbdConfigurationService.getOptionByName(_.name))),i)),o.headers=t.headers,o))))}copy(s,t){return this.http.post(`api/block/image/${s.toStringEncoded()}/copy`,t,{observe:"response"})}flatten(s){return this.http.post(`api/block/image/${s.toStringEncoded()}/flatten`,null,{observe:"response"})}defaultFeatures(){return this.http.get("api/block/image/default_features")}cloneFormatVersion(){return this.http.get("api/block/image/clone_format_version")}createSnapshot(s,t){const o={snapshot_name:t};return this.http.post(`api/block/image/${s.toStringEncoded()}/snap`,o,{observe:"response"})}renameSnapshot(s,t,o){const i={new_snap_name:o};return this.http.put(`api/block/image/${s.toStringEncoded()}/snap/${t}`,i,{observe:"response"})}protectSnapshot(s,t,o){const i={is_protected:o};return this.http.put(`api/block/image/${s.toStringEncoded()}/snap/${t}`,i,{observe:"response"})}rollbackSnapshot(s,t){return this.http.post(`api/block/image/${s.toStringEncoded()}/snap/${t}/rollback`,null,{observe:"response"})}cloneSnapshot(s,t,o){return this.http.post(`api/block/image/${s.toStringEncoded()}/snap/${t}/clone`,o,{observe:"response"})}deleteSnapshot(s,t){return this.http.delete(`api/block/image/${s.toStringEncoded()}/snap/${t}`,{observe:"response"})}listTrash(){return this.http.get("api/block/image/trash/")}createNamespace(s,t){return this.http.post(`api/block/pool/${s}/namespace`,{namespace:t},{observe:"response"})}listNamespaces(s){return this.http.get(`api/block/pool/${s}/namespace/`)}deleteNamespace(s,t){return this.http.delete(`api/block/pool/${s}/namespace/${t}`,{observe:"response"})}moveTrash(s,t){return this.http.post(`api/block/image/${s.toStringEncoded()}/move_trash`,{delay:t},{observe:"response"})}purgeTrash(s){return this.http.post(`api/block/image/trash/purge/?pool_name=${s}`,null,{observe:"response"})}restoreTrash(s,t){return this.http.post(`api/block/image/trash/${s.toStringEncoded()}/restore`,{new_image_name:t},{observe:"response"})}removeTrash(s,t=!1){return this.http.delete(`api/block/image/trash/${s.toStringEncoded()}/?force=${t}`,{observe:"response"})}};H.\u0275fac=function(s){return new(s||H)(e.LFG(ie.eN),e.LFG(Pe.n))},H.\u0275prov=e.Yz7({token:H,factory:H.\u0275fac,providedIn:"root"}),(0,F.gn)([(0,F.fM)(1,Y.G),(0,F.w6)("design:type",Function),(0,F.w6)("design:paramtypes",[L.N,String]),(0,F.w6)("design:returntype",void 0)],H.prototype,"createSnapshot",null),(0,F.gn)([(0,F.fM)(2,Y.G),(0,F.w6)("design:type",Function),(0,F.w6)("design:paramtypes",[L.N,String,String]),(0,F.w6)("design:returntype",void 0)],H.prototype,"renameSnapshot",null),(0,F.gn)([(0,F.fM)(2,Y.G),(0,F.w6)("design:type",Function),(0,F.w6)("design:paramtypes",[L.N,String,Boolean]),(0,F.w6)("design:returntype",void 0)],H.prototype,"protectSnapshot",null),(0,F.gn)([(0,F.fM)(1,Y.G),(0,F.w6)("design:type",Function),(0,F.w6)("design:paramtypes",[L.N,String]),(0,F.w6)("design:returntype",void 0)],H.prototype,"restoreTrash",null),H=(0,F.gn)([Y.o,(0,F.w6)("design:paramtypes",[ie.eN,Pe.n])],H);var N=p(7022),y=p(14745),T=p(65862),k=p(93614),Z=p(95463),z=p(90070),h=p(48168),R=p(76111),m=p(32337),C=p(60312),A=p(41582),O=p(56310),$=p(87925),X=p(94276);function oo(n,s){if(1&n&&(e.TgZ(0,"option",6),e._uU(1),e.qZA()),2&n){const t=s.$implicit;e.Q6J("ngValue",t),e.xp6(1),e.Oqu(t)}}function no(n,s){if(1&n&&(e.TgZ(0,"select",5),e._UZ(1,"option",6),e.YNc(2,oo,2,2,"option",7),e.qZA()),2&n){const t=e.oxw();e.s9C("id",t.setting),e.s9C("name",t.setting),e.Q6J("formControlName",t.setting),e.xp6(1),e.Q6J("ngValue",null),e.xp6(1),e.Q6J("ngForOf",t.limits.values)}}function io(n,s){if(1&n&&e._UZ(0,"input",10),2&n){const t=e.oxw(2);e.Q6J("formControlName",t.setting)}}function so(n,s){if(1&n&&e._UZ(0,"input",11),2&n){const t=e.oxw(2);e.Q6J("formControlName",t.setting)}}function _o(n,s){if(1&n&&(e.ynx(0),e._UZ(1,"br"),e.TgZ(2,"div",12),e._UZ(3,"input",13),e.TgZ(4,"label",14),e._uU(5,"Yes"),e.qZA()(),e.TgZ(6,"div",12),e._UZ(7,"input",13),e.TgZ(8,"label",14),e._uU(9,"No"),e.qZA()(),e.BQk()),2&n){const t=e.oxw(2);e.xp6(3),e.Q6J("id",t.setting+"True")("value",!0)("formControlName",t.setting),e.xp6(1),e.Q6J("for",t.setting+"True"),e.xp6(3),e.Q6J("id",t.setting+"False")("value",!1)("formControlName",t.setting),e.xp6(1),e.Q6J("for",t.setting+"False")}}function ao(n,s){if(1&n&&(e.TgZ(0,"span"),e.YNc(1,io,1,1,"input",8),e.YNc(2,so,1,1,"input",9),e.YNc(3,_o,10,8,"ng-container",3),e.qZA()),2&n){const t=e.oxw();e.xp6(1),e.Q6J("ngIf","int"===t.limits.type),e.xp6(1),e.Q6J("ngIf","str"===t.limits.type),e.xp6(1),e.Q6J("ngIf","bool"===t.limits.type)}}function ro(n,s){if(1&n&&(e.TgZ(0,"span",15),e.ynx(1),e.SDv(2,16),e.BQk(),e.qZA()),2&n){const t=e.oxw();e.xp6(2),e.pQV(t.limits.min),e.QtT(2)}}function lo(n,s){if(1&n&&(e.TgZ(0,"span",15),e.ynx(1),e.SDv(2,17),e.BQk(),e.qZA()),2&n){const t=e.oxw();e.xp6(2),e.pQV(t.limits.max),e.QtT(2)}}let pt=(()=>{class n{ngOnInit(){const t=[];"min"in this.limits&&t.push(a.kI.min(this.limits.min)),"max"in this.limits&&t.push(a.kI.max(this.limits.max)),this.settingsForm.get(this.setting).setValidators(t)}}return n.\u0275fac=function(t){return new(t||n)},n.\u0275cmp=e.Xpm({type:n,selectors:[["cd-iscsi-setting"]],inputs:{settingsForm:"settingsForm",formDir:"formDir",setting:"setting",limits:"limits"},decls:7,vars:7,consts:function(){let s,t;return s="Must be greater than or equal to " + "\ufffd0\ufffd" + ".",t="Must be less than or equal to " + "\ufffd0\ufffd" + ".",[[1,"form-group",3,"formGroup"],[1,"col-form-label",3,"for"],["class","form-control",3,"id","name","formControlName",4,"ngIf"],[4,"ngIf"],["class","invalid-feedback",4,"ngIf"],[1,"form-control",3,"id","name","formControlName"],[3,"ngValue"],[3,"ngValue",4,"ngFor","ngForOf"],["type","number","class","form-control",3,"formControlName",4,"ngIf"],["type","text","class","form-control",3,"formControlName",4,"ngIf"],["type","number",1,"form-control",3,"formControlName"],["type","text",1,"form-control",3,"formControlName"],[1,"custom-control","custom-radio","custom-control-inline"],["type","radio",1,"custom-control-input",3,"id","value","formControlName"],[1,"custom-control-label",3,"for"],[1,"invalid-feedback"],s,t]},template:function(t,o){1&t&&(e.TgZ(0,"div",0)(1,"label",1),e._uU(2),e.qZA(),e.YNc(3,no,3,5,"select",2),e.YNc(4,ao,4,3,"span",3),e.YNc(5,ro,3,1,"span",4),e.YNc(6,lo,3,1,"span",4),e.qZA()),2&t&&(e.Q6J("formGroup",o.settingsForm),e.xp6(1),e.s9C("for",o.setting),e.xp6(1),e.Oqu(o.setting),e.xp6(1),e.Q6J("ngIf","enum"===o.limits.type),e.xp6(1),e.Q6J("ngIf","enum"!==o.limits.type),e.xp6(1),e.Q6J("ngIf",o.settingsForm.showError(o.setting,o.formDir,"min")),e.xp6(1),e.Q6J("ngIf",o.settingsForm.showError(o.setting,o.formDir,"max")))},directives:[O.P,a.JL,a.sg,A.V,c.O5,$.o,a.EJ,X.b,a.JJ,a.u,a.YN,a.Kr,c.sg,a.wV,a.Fj,a._],styles:[""]}),n})();var j=p(30839),Je=p(88820);function co(n,s){1&n&&(e.TgZ(0,"span",29),e.SDv(1,30),e.qZA())}function po(n,s){if(1&n&&(e.TgZ(0,"span")(1,"legend",10),e.SDv(2,21),e.qZA(),e.TgZ(3,"div",12)(4,"div",13)(5,"label",22),e.SDv(6,23),e.qZA(),e._UZ(7,"input",24),e.YNc(8,co,2,0,"span",25),e.qZA()(),e.TgZ(9,"div",12)(10,"div",13)(11,"label",26),e.SDv(12,27),e.qZA(),e._UZ(13,"input",28),e.qZA()()()),2&n){const t=e.oxw(),o=e.MAs(9);e.xp6(8),e.Q6J("ngIf",t.settingsForm.showError("lun",o,"required"))}}function uo(n,s){if(1&n&&(e.TgZ(0,"option",31),e._uU(1),e.ALo(2,"iscsiBackstore"),e.qZA()),2&n){const t=s.$implicit;e.Q6J("value",t),e.xp6(1),e.Oqu(e.lcZ(2,2,t))}}function mo(n,s){if(1&n&&(e.TgZ(0,"div",12)(1,"div",13),e._UZ(2,"cd-iscsi-setting",33),e.qZA()()),2&n){const t=s.$implicit,o=e.oxw(2).$implicit,i=e.oxw(),_=e.MAs(9);e.xp6(2),e.Q6J("settingsForm",i.settingsForm)("formDir",_)("setting",t.key)("limits",i.getDiskControlLimits(o,t.key))}}function go(n,s){if(1&n&&(e.ynx(0),e.YNc(1,mo,3,4,"div",32),e.ALo(2,"keyvalue"),e.BQk()),2&n){const t=e.oxw().$implicit,o=e.oxw();e.xp6(1),e.Q6J("ngForOf",e.lcZ(2,1,o.disk_default_controls[t]))}}function To(n,s){if(1&n&&(e.ynx(0),e.YNc(1,go,3,3,"ng-container",9),e.BQk()),2&n){const t=s.$implicit,o=e.oxw();e.xp6(1),e.Q6J("ngIf",o.settingsForm.value.backstore===t)}}let fo=(()=>{class n{constructor(t,o,i){this.activeModal=t,this.iscsiService=o,this.actionLabels=i}ngOnInit(){const t={backstore:new a.NI(this.imagesSettings[this.image].backstore),lun:new a.NI(this.imagesSettings[this.image].lun),wwn:new a.NI(this.imagesSettings[this.image].wwn)};S().forEach(this.backstores,o=>{const i=this.imagesSettings[this.image][o]||{};S().forIn(this.disk_default_controls[o],(_,r)=>{t[r]=new a.NI(i[r])})}),this.settingsForm=new Z.d(t)}getDiskControlLimits(t,o){return this.disk_controls_limits?this.disk_controls_limits[t][o]:{type:"int"}}save(){const t=this.settingsForm.controls.backstore.value,o=this.settingsForm.controls.lun.value,i=this.settingsForm.controls.wwn.value,_={};S().forIn(this.settingsForm.controls,(r,l)=>{""!==r.value&&null!==r.value&&l in this.disk_default_controls[this.settingsForm.value.backstore]&&(_[l]=r.value,S().forEach(this.backstores,d=>{d!==t&&l in(this.imagesSettings[this.image][d]||{})&&(this.imagesSettings[this.image][d][l]=r.value)}))}),this.imagesSettings[this.image].backstore=t,this.imagesSettings[this.image].lun=o,this.imagesSettings[this.image].wwn=i,this.imagesSettings[this.image][t]=_,this.imagesSettings=Object.assign({},this.imagesSettings),this.control.updateValueAndValidity({emitEvent:!1}),this.activeModal.close()}}return n.\u0275fac=function(t){return new(t||n)(e.Y36(v.Kz),e.Y36(Q),e.Y36(D.p4))},n.\u0275cmp=e.Xpm({type:n,selectors:[["cd-iscsi-target-image-settings-modal"]],decls:25,vars:8,consts:function(){let s,t,o,i,_,r,l,d;return s="Configure",t="Changing these parameters from their default values is usually not necessary.",o="Settings",i="Backstore",_="Identifier",r="lun",l="wwn",d="This field is required.",[[3,"modalRef"],[1,"modal-title"],s,[1,"modal-content"],["name","settingsForm","novalidate","",1,"form",3,"formGroup"],["formDir","ngForm"],[1,"modal-body"],[1,"alert-warning"],t,[4,"ngIf"],[1,"cd-header"],o,[1,"form-group","row"],[1,"col-sm-12"],[1,"col-form-label"],i,["id","backstore","name","backstore","formControlName","backstore",1,"form-select"],[3,"value",4,"ngFor","ngForOf"],[4,"ngFor","ngForOf"],[1,"modal-footer"],[3,"form","submitText","submitActionEvent"],_,["for","lun",1,"col-form-label","required"],r,["type","number","id","lun","name","lun","formControlName","lun",1,"form-control"],["class","invalid-feedback",4,"ngIf"],["for","wwn",1,"col-form-label"],l,["type","text","id","wwn","name","wwn","formControlName","wwn",1,"form-control"],[1,"invalid-feedback"],d,[3,"value"],["class","form-group row",4,"ngFor","ngForOf"],[3,"settingsForm","formDir","setting","limits"]]},template:function(t,o){1&t&&(e.TgZ(0,"cd-modal",0),e.ynx(1,1)(2),e.SDv(3,2),e.BQk(),e._uU(4,"\xa0 "),e.TgZ(5,"small"),e._uU(6),e.qZA(),e.BQk(),e.ynx(7,3),e.TgZ(8,"form",4,5)(10,"div",6)(11,"p",7),e.SDv(12,8),e.qZA(),e.YNc(13,po,14,1,"span",9),e.TgZ(14,"legend",10),e.SDv(15,11),e.qZA(),e.TgZ(16,"div",12)(17,"div",13)(18,"label",14),e.SDv(19,15),e.qZA(),e.TgZ(20,"select",16),e.YNc(21,uo,3,4,"option",17),e.qZA()()(),e.YNc(22,To,2,1,"ng-container",18),e.qZA(),e.TgZ(23,"div",19)(24,"cd-form-button-panel",20),e.NdJ("submitActionEvent",function(){return o.save()}),e.qZA()()(),e.BQk(),e.qZA()),2&t&&(e.Q6J("modalRef",o.activeModal),e.xp6(6),e.Oqu(o.image),e.xp6(2),e.Q6J("formGroup",o.settingsForm),e.xp6(5),e.Q6J("ngIf",o.api_version>=1),e.xp6(8),e.Q6J("ngForOf",o.backstores),e.xp6(1),e.Q6J("ngForOf",o.backstores),e.xp6(2),e.Q6J("form",o.settingsForm)("submitText",o.actionLabels.UPDATE))},directives:[C.z,a._Y,a.JL,a.sg,A.V,c.O5,O.P,$.o,a.wV,a.Fj,X.b,a.JJ,a.u,a.EJ,c.sg,a.YN,a.Kr,pt,j.p],pipes:[Je.V,c.Nd],styles:[""]}),n})();function Co(n,s){if(1&n&&(e.TgZ(0,"div",12)(1,"div",13),e._UZ(2,"cd-iscsi-setting",14),e.qZA()()),2&n){const t=s.$implicit,o=e.oxw(),i=e.MAs(5);e.xp6(2),e.Q6J("settingsForm",o.settingsForm)("formDir",i)("setting",t.key)("limits",o.getTargetControlLimits(t.key))}}let So=(()=>{class n{constructor(t,o,i){this.activeModal=t,this.iscsiService=o,this.actionLabels=i}ngOnInit(){const t={};S().forIn(this.target_default_controls,(o,i)=>{t[i]=new a.NI(this.target_controls.value[i])}),this.settingsForm=new Z.d(t)}save(){const t={};S().forIn(this.settingsForm.controls,(o,i)=>{""===o.value||null===o.value||(t[i]=o.value)}),this.target_controls.setValue(t),this.activeModal.close()}getTargetControlLimits(t){return this.target_controls_limits?this.target_controls_limits[t]:["Yes","No"].includes(this.target_default_controls[t])?{type:"bool"}:{type:"int"}}}return n.\u0275fac=function(t){return new(t||n)(e.Y36(v.Kz),e.Y36(Q),e.Y36(D.p4))},n.\u0275cmp=e.Xpm({type:n,selectors:[["cd-iscsi-target-iqn-settings-modal"]],decls:13,vars:7,consts:function(){let s,t;return s="Advanced Settings",t="Changing these parameters from their default values is usually not necessary.",[[3,"modalRef"],[1,"modal-title"],s,[1,"modal-content"],["name","settingsForm","novalidate","",3,"formGroup"],["formDir","ngForm"],[1,"modal-body"],[1,"alert-warning"],t,["class","form-group row",4,"ngFor","ngForOf"],[1,"modal-footer"],[3,"form","submitText","submitActionEvent"],[1,"form-group","row"],[1,"col-sm-12"],[3,"settingsForm","formDir","setting","limits"]]},template:function(t,o){1&t&&(e.TgZ(0,"cd-modal",0),e.ynx(1,1),e.SDv(2,2),e.BQk(),e.ynx(3,3),e.TgZ(4,"form",4,5)(6,"div",6)(7,"p",7),e.SDv(8,8),e.qZA(),e.YNc(9,Co,3,4,"div",9),e.ALo(10,"keyvalue"),e.qZA(),e.TgZ(11,"div",10)(12,"cd-form-button-panel",11),e.NdJ("submitActionEvent",function(){return o.save()}),e.qZA()()(),e.BQk(),e.qZA()),2&t&&(e.Q6J("modalRef",o.activeModal),e.xp6(4),e.Q6J("formGroup",o.settingsForm),e.xp6(5),e.Q6J("ngForOf",e.lcZ(10,5,o.settingsForm.controls)),e.xp6(3),e.Q6J("form",o.settingsForm)("submitText",o.actionLabels.UPDATE))},directives:[C.z,a._Y,a.JL,a.sg,A.V,c.sg,O.P,pt,j.p],pipes:[c.Nd],styles:[""]}),n})();var de=p(63285),ut=p(63622);let Eo=(()=>{class n{constructor(t){this.ngControl=t}onInput(t){this.setValue(t)}setValue(t){t=S().isString(t)?t.trim():t,this.ngControl.control.setValue(t)}}return n.\u0275fac=function(t){return new(t||n)(e.Y36(a.a5))},n.\u0275dir=e.lG2({type:n,selectors:[["","cdTrim",""]],hostBindings:function(t,o){1&t&&e.NdJ("input",function(_){return o.onInput(_.target.value)})}}),n})();var Ro=p(39092),mt=p(4416),Ye=p(58039),tt=p(10545);function Mo(n,s){1&n&&(e.TgZ(0,"span",40),e.SDv(1,41),e.qZA())}function Oo(n,s){1&n&&(e.TgZ(0,"span",40),e.SDv(1,42),e.qZA())}function ho(n,s){1&n&&(e.TgZ(0,"span",40),e.ynx(1),e.SDv(2,43),e.BQk(),e._UZ(3,"br"),e.ynx(4),e.SDv(5,44),e.BQk(),e._UZ(6,"br"),e.TgZ(7,"a",45),e.SDv(8,46),e.qZA()())}function Ao(n,s){1&n&&(e.TgZ(0,"span",47),e.SDv(1,48),e.qZA())}const V=function(n){return[n]};function Po(n,s){if(1&n){const t=e.EpF();e.ynx(0),e.TgZ(1,"div",49),e._UZ(2,"input",50),e.TgZ(3,"button",51),e.NdJ("click",function(){const i=e.CHM(t),_=i.index,r=i.$implicit;return e.oxw(2).removePortal(_,r)}),e._UZ(4,"i",15),e.qZA()(),e.BQk()}if(2&n){const t=s.$implicit,o=e.oxw(2);e.xp6(2),e.Q6J("value",t),e.xp6(2),e.Q6J("ngClass",e.VKq(2,V,o.icons.destroy))}}function Io(n,s){if(1&n&&(e.TgZ(0,"span",40),e.SDv(1,52),e.qZA()),2&n){const t=e.oxw(2);e.xp6(1),e.pQV(t.minimum_gateways),e.QtT(1)}}function bo(n,s){if(1&n&&(e.TgZ(0,"div",55),e._uU(1),e.qZA()),2&n){const t=e.oxw().$implicit,o=e.oxw(2);e.xp6(1),e.hij("lun: ",o.imagesSettings[t].lun,"")}}function No(n,s){if(1&n&&(e.ynx(0),e.SDv(1,56),e.ALo(2,"iscsiBackstore"),e.BQk()),2&n){const t=e.oxw().$implicit,o=e.oxw(2);e.xp6(2),e.pQV(e.lcZ(2,1,o.imagesSettings[t].backstore)),e.QtT(1)}}function Fo(n,s){1&n&&(e.ynx(0),e.SDv(1,57),e.BQk())}function Do(n,s){if(1&n){const t=e.EpF();e.ynx(0),e.TgZ(1,"div",49),e._UZ(2,"input",50),e.YNc(3,bo,2,1,"div",53),e.TgZ(4,"button",51),e.NdJ("click",function(){const _=e.CHM(t).$implicit;return e.oxw(2).imageSettingsModal(_)}),e._UZ(5,"i",15),e.qZA(),e.TgZ(6,"button",51),e.NdJ("click",function(){const i=e.CHM(t),_=i.index,r=i.$implicit;return e.oxw(2).removeImage(_,r)}),e._UZ(7,"i",15),e.qZA()(),e.TgZ(8,"span",47),e.YNc(9,No,3,3,"ng-container",54),e.YNc(10,Fo,2,0,"ng-container",54),e.qZA(),e.BQk()}if(2&n){const t=s.$implicit,o=e.oxw(2);e.xp6(2),e.Q6J("value",t),e.xp6(1),e.Q6J("ngIf",o.api_version>=1),e.xp6(2),e.Q6J("ngClass",e.VKq(6,V,o.icons.deepCheck)),e.xp6(2),e.Q6J("ngClass",e.VKq(8,V,o.icons.destroy)),e.xp6(2),e.Q6J("ngIf",o.backstores.length>1),e.xp6(1),e.Q6J("ngIf",o.hasAdvancedSettings(o.imagesSettings[t][o.imagesSettings[t].backstore]))}}function vo(n,s){1&n&&(e.TgZ(0,"span",40),e.SDv(1,58),e.qZA())}function Lo(n,s){1&n&&(e.TgZ(0,"span",40),e.SDv(1,59),e.qZA())}function $o(n,s){1&n&&(e.TgZ(0,"span",40),e.SDv(1,77),e.qZA())}function Bo(n,s){1&n&&(e.TgZ(0,"span",40),e.SDv(1,78),e.qZA())}function Go(n,s){1&n&&(e.TgZ(0,"span",40),e.SDv(1,79),e.qZA())}function yo(n,s){1&n&&(e.TgZ(0,"span",40),e.SDv(1,80),e.qZA())}function xo(n,s){1&n&&(e.TgZ(0,"span",40),e.SDv(1,81),e.qZA())}function Zo(n,s){1&n&&(e.TgZ(0,"span",40),e.SDv(1,82),e.qZA())}function wo(n,s){1&n&&(e.TgZ(0,"span",40),e.SDv(1,83),e.qZA())}function Ho(n,s){1&n&&(e.TgZ(0,"span",40),e.SDv(1,84),e.qZA())}function ko(n,s){if(1&n&&(e.TgZ(0,"div",60)(1,"div",8)(2,"label",61),e.ynx(3),e.SDv(4,62),e.BQk(),e.qZA(),e.TgZ(5,"div",11),e._UZ(6,"input",63),e.YNc(7,$o,2,0,"span",16),e.YNc(8,Bo,2,0,"span",16),e.qZA()(),e.TgZ(9,"div",8)(10,"label",64),e.ynx(11),e.SDv(12,65),e.BQk(),e.qZA(),e.TgZ(13,"div",11)(14,"div",12),e._UZ(15,"input",66)(16,"button",67)(17,"cd-copy-2-clipboard-button",68),e.qZA(),e.YNc(18,Go,2,0,"span",16),e.YNc(19,yo,2,0,"span",16),e.qZA()(),e.TgZ(20,"div",8)(21,"label",69),e.ynx(22),e.SDv(23,70),e.BQk(),e.qZA(),e.TgZ(24,"div",11),e._UZ(25,"input",71),e.YNc(26,xo,2,0,"span",16),e.YNc(27,Zo,2,0,"span",16),e.qZA()(),e.TgZ(28,"div",8)(29,"label",72),e.ynx(30),e.SDv(31,73),e.BQk(),e.qZA(),e.TgZ(32,"div",11)(33,"div",12),e._UZ(34,"input",74)(35,"button",75)(36,"cd-copy-2-clipboard-button",76),e.qZA(),e.YNc(37,wo,2,0,"span",16),e.YNc(38,Ho,2,0,"span",16),e.qZA()()()),2&n){e.oxw();const t=e.MAs(2),o=e.oxw();e.xp6(7),e.Q6J("ngIf",o.targetForm.showError("user",t,"required")),e.xp6(1),e.Q6J("ngIf",o.targetForm.showError("user",t,"pattern")),e.xp6(10),e.Q6J("ngIf",o.targetForm.showError("password",t,"required")),e.xp6(1),e.Q6J("ngIf",o.targetForm.showError("password",t,"pattern")),e.xp6(7),e.Q6J("ngIf",o.targetForm.showError("mutual_user",t,"required")),e.xp6(1),e.Q6J("ngIf",o.targetForm.showError("mutual_user",t,"pattern")),e.xp6(10),e.Q6J("ngIf",o.targetForm.showError("mutual_password",t,"required")),e.xp6(1),e.Q6J("ngIf",o.targetForm.showError("mutual_password",t,"pattern"))}}function qo(n,s){1&n&&(e.TgZ(0,"span",40),e.SDv(1,114),e.qZA())}function Ko(n,s){1&n&&(e.TgZ(0,"span",40),e.SDv(1,115),e.qZA())}function Xo(n,s){1&n&&(e.TgZ(0,"span",40),e.SDv(1,116),e.qZA())}function Qo(n,s){1&n&&(e.TgZ(0,"span",40),e.SDv(1,117),e.qZA())}function zo(n,s){1&n&&(e.TgZ(0,"span",40),e.SDv(1,118),e.qZA())}function Jo(n,s){1&n&&(e.TgZ(0,"span",40),e.SDv(1,119),e.qZA())}function Yo(n,s){1&n&&(e.TgZ(0,"span",40),e.SDv(1,120),e.qZA())}function Vo(n,s){1&n&&(e.TgZ(0,"span",40),e.SDv(1,121),e.qZA())}function Uo(n,s){1&n&&(e.TgZ(0,"span",40),e.SDv(1,122),e.qZA())}function jo(n,s){1&n&&(e.TgZ(0,"span",40),e.SDv(1,123),e.qZA())}function Wo(n,s){1&n&&(e.TgZ(0,"span",40),e.SDv(1,124),e.qZA())}function en(n,s){if(1&n){const t=e.EpF();e.ynx(0),e.TgZ(1,"div",49),e._UZ(2,"input",50),e.TgZ(3,"button",51),e.NdJ("click",function(){const i=e.CHM(t),_=i.index,r=i.$implicit,l=e.oxw(),d=l.$implicit,u=l.index;return e.oxw(3).removeInitiatorImage(d,_,u,r)}),e._UZ(4,"i",15),e.qZA()(),e.BQk()}if(2&n){const t=s.$implicit,o=e.oxw(4);e.xp6(2),e.Q6J("value",t),e.xp6(2),e.Q6J("ngClass",e.VKq(2,V,o.icons.destroy))}}function tn(n,s){1&n&&(e.TgZ(0,"span"),e.SDv(1,125),e.qZA())}function on(n,s){if(1&n&&(e.TgZ(0,"div",21)(1,"div",22)(2,"cd-select",126),e._UZ(3,"i",24),e.ynx(4),e.SDv(5,127),e.BQk(),e.qZA()()()),2&n){const t=e.oxw(),o=t.$implicit,i=t.index,_=e.oxw(3);e.xp6(2),e.Q6J("data",o.getValue("luns"))("options",_.imagesInitiatorSelections[i])("messages",_.messages.initiatorImage),e.xp6(1),e.Q6J("ngClass",e.VKq(4,V,_.icons.add))}}function nn(n,s){if(1&n){const t=e.EpF();e.TgZ(0,"div",91)(1,"div",5),e.ynx(2),e.SDv(3,92),e.BQk(),e._uU(4),e.TgZ(5,"button",93),e.NdJ("click",function(){const _=e.CHM(t).index;return e.oxw(3).removeInitiator(_)}),e.qZA()(),e.TgZ(6,"div",7)(7,"div",8)(8,"label",94),e.SDv(9,95),e.qZA(),e.TgZ(10,"div",11)(11,"input",96),e.NdJ("blur",function(){return e.CHM(t),e.oxw(3).updatedInitiatorSelector()}),e.qZA(),e.YNc(12,qo,2,0,"span",16),e.YNc(13,Ko,2,0,"span",16),e.YNc(14,Xo,2,0,"span",16),e.qZA()(),e.ynx(15,60),e.TgZ(16,"div",8)(17,"label",97),e.SDv(18,98),e.qZA(),e.TgZ(19,"div",11),e._UZ(20,"input",99),e.YNc(21,Qo,2,0,"span",16),e.YNc(22,zo,2,0,"span",16),e.qZA()(),e.TgZ(23,"div",8)(24,"label",100),e.SDv(25,101),e.qZA(),e.TgZ(26,"div",11)(27,"div",12),e._UZ(28,"input",102)(29,"button",103)(30,"cd-copy-2-clipboard-button",104),e.qZA(),e.YNc(31,Jo,2,0,"span",16),e.YNc(32,Yo,2,0,"span",16),e.qZA()(),e.TgZ(33,"div",8)(34,"label",105),e.ynx(35),e.SDv(36,106),e.BQk(),e.qZA(),e.TgZ(37,"div",11),e._UZ(38,"input",107),e.YNc(39,Vo,2,0,"span",16),e.YNc(40,Uo,2,0,"span",16),e.qZA()(),e.TgZ(41,"div",8)(42,"label",108),e.SDv(43,109),e.qZA(),e.TgZ(44,"div",11)(45,"div",12),e._UZ(46,"input",110)(47,"button",103)(48,"cd-copy-2-clipboard-button",104),e.qZA(),e.YNc(49,jo,2,0,"span",16),e.YNc(50,Wo,2,0,"span",16),e.qZA()(),e.BQk(),e.TgZ(51,"div",8)(52,"label",111),e.SDv(53,112),e.qZA(),e.TgZ(54,"div",11),e.YNc(55,en,5,4,"ng-container",20),e.YNc(56,tn,2,0,"span",54),e.YNc(57,on,6,6,"div",113),e.qZA()()()()}if(2&n){const t=s.$implicit,o=s.index;e.oxw(2);const i=e.MAs(2);e.Q6J("formGroup",t),e.xp6(4),e.hij(": ",t.getValue("client_iqn")," "),e.xp6(8),e.Q6J("ngIf",t.showError("client_iqn",i,"notUnique")),e.xp6(1),e.Q6J("ngIf",t.showError("client_iqn",i,"required")),e.xp6(1),e.Q6J("ngIf",t.showError("client_iqn",i,"pattern")),e.xp6(6),e.Q6J("id","user"+o),e.xp6(1),e.Q6J("ngIf",t.showError("user",i,"required")),e.xp6(1),e.Q6J("ngIf",t.showError("user",i,"pattern")),e.xp6(6),e.Q6J("id","password"+o),e.xp6(1),e.Q6J("cdPasswordButton","password"+o),e.xp6(1),e.Q6J("source","password"+o),e.xp6(1),e.Q6J("ngIf",t.showError("password",i,"required")),e.xp6(1),e.Q6J("ngIf",t.showError("password",i,"pattern")),e.xp6(6),e.Q6J("id","mutual_user"+o),e.xp6(1),e.Q6J("ngIf",t.showError("mutual_user",i,"required")),e.xp6(1),e.Q6J("ngIf",t.showError("mutual_user",i,"pattern")),e.xp6(6),e.Q6J("id","mutual_password"+o),e.xp6(1),e.Q6J("cdPasswordButton","mutual_password"+o),e.xp6(1),e.Q6J("source","mutual_password"+o),e.xp6(1),e.Q6J("ngIf",t.showError("mutual_password",i,"required")),e.xp6(1),e.Q6J("ngIf",t.showError("mutual_password",i,"pattern")),e.xp6(5),e.Q6J("ngForOf",t.getValue("luns")),e.xp6(1),e.Q6J("ngIf",t.getValue("cdIsInGroup")),e.xp6(1),e.Q6J("ngIf",!t.getValue("cdIsInGroup"))}}function sn(n,s){1&n&&(e.TgZ(0,"span",47),e.SDv(1,128),e.qZA())}function _n(n,s){if(1&n){const t=e.EpF();e.TgZ(0,"div",8)(1,"label",85),e.SDv(2,86),e.qZA(),e.TgZ(3,"div",87),e.YNc(4,nn,58,24,"div",88),e.TgZ(5,"div",21)(6,"div",22),e.YNc(7,sn,2,0,"span",17),e.TgZ(8,"button",89),e.NdJ("click",function(){return e.CHM(t),e.oxw(2).addInitiator(),!1}),e._UZ(9,"i",24),e.ynx(10),e.SDv(11,90),e.BQk(),e.qZA()()(),e._UZ(12,"hr"),e.qZA()()}if(2&n){const t=e.oxw(2);e.xp6(4),e.Q6J("ngForOf",t.initiators.controls),e.xp6(3),e.Q6J("ngIf",0===t.initiators.controls.length),e.xp6(2),e.Q6J("ngClass",e.VKq(3,V,t.icons.add))}}function an(n,s){if(1&n){const t=e.EpF();e.ynx(0),e.TgZ(1,"div",49),e._UZ(2,"input",50),e.TgZ(3,"button",51),e.NdJ("click",function(){const _=e.CHM(t).index,r=e.oxw(),l=r.$implicit,d=r.index;return e.oxw(3).removeGroupInitiator(l,_,d)}),e._UZ(4,"i",15),e.qZA()(),e.BQk()}if(2&n){const t=s.$implicit,o=e.oxw(4);e.xp6(2),e.Q6J("value",t),e.xp6(2),e.Q6J("ngClass",e.VKq(2,V,o.icons.destroy))}}function rn(n,s){if(1&n){const t=e.EpF();e.ynx(0),e.TgZ(1,"div",49),e._UZ(2,"input",50),e.TgZ(3,"button",51),e.NdJ("click",function(){const _=e.CHM(t).index,r=e.oxw(),l=r.$implicit,d=r.index;return e.oxw(3).removeGroupDisk(l,_,d)}),e._UZ(4,"i",15),e.qZA()(),e.BQk()}if(2&n){const t=s.$implicit,o=e.oxw(4);e.xp6(2),e.Q6J("value",t),e.xp6(2),e.Q6J("ngClass",e.VKq(2,V,o.icons.destroy))}}function ln(n,s){if(1&n){const t=e.EpF();e.TgZ(0,"div",91)(1,"div",5),e.ynx(2),e.SDv(3,132),e.BQk(),e._uU(4),e.TgZ(5,"button",93),e.NdJ("click",function(){const _=e.CHM(t).index;return e.oxw(3).removeGroup(_)}),e.qZA()(),e.TgZ(6,"div",7)(7,"div",8)(8,"label",133),e.SDv(9,134),e.qZA(),e.TgZ(10,"div",11),e._UZ(11,"input",135),e.qZA()(),e.TgZ(12,"div",8)(13,"label",136),e.ynx(14),e.SDv(15,137),e.BQk(),e.qZA(),e.TgZ(16,"div",11),e.YNc(17,an,5,4,"ng-container",20),e.TgZ(18,"div",21)(19,"div",22)(20,"cd-select",23),e.NdJ("selection",function(i){const r=e.CHM(t).index;return e.oxw(3).onGroupMemberSelection(i,r)}),e._UZ(21,"i",24),e.ynx(22),e.SDv(23,138),e.BQk(),e.qZA()()(),e._UZ(24,"hr"),e.qZA()(),e.TgZ(25,"div",8)(26,"label",27),e.ynx(27),e.SDv(28,139),e.BQk(),e.qZA(),e.TgZ(29,"div",11),e.YNc(30,rn,5,4,"ng-container",20),e.TgZ(31,"div",21)(32,"div",22)(33,"cd-select",126),e._UZ(34,"i",24),e.ynx(35),e.SDv(36,140),e.BQk(),e.qZA()()(),e._UZ(37,"hr"),e.qZA()()()()}if(2&n){const t=s.$implicit,o=s.index,i=e.oxw(3);e.Q6J("formGroup",t),e.xp6(4),e.hij(": ",t.getValue("group_id")," "),e.xp6(13),e.Q6J("ngForOf",t.getValue("members")),e.xp6(3),e.Q6J("data",t.getValue("members"))("options",i.groupMembersSelections[o])("messages",i.messages.groupInitiator),e.xp6(1),e.Q6J("ngClass",e.VKq(12,V,i.icons.add)),e.xp6(9),e.Q6J("ngForOf",t.getValue("disks")),e.xp6(3),e.Q6J("data",t.getValue("disks"))("options",i.groupDiskSelections[o])("messages",i.messages.initiatorImage),e.xp6(1),e.Q6J("ngClass",e.VKq(14,V,i.icons.add))}}function cn(n,s){1&n&&(e.TgZ(0,"span",47),e.SDv(1,141),e.qZA())}function dn(n,s){if(1&n){const t=e.EpF();e.TgZ(0,"div",8)(1,"label",85),e.SDv(2,129),e.qZA(),e.TgZ(3,"div",130),e.YNc(4,ln,38,16,"div",88),e.TgZ(5,"div",21)(6,"div",22),e.YNc(7,cn,2,0,"span",17),e.TgZ(8,"button",89),e.NdJ("click",function(){return e.CHM(t),e.oxw(2).addGroup(),!1}),e._UZ(9,"i",24),e.ynx(10),e.SDv(11,131),e.BQk(),e.qZA()()()()()}if(2&n){const t=e.oxw(2);e.xp6(4),e.Q6J("ngForOf",t.groups.controls),e.xp6(3),e.Q6J("ngIf",0===t.groups.controls.length),e.xp6(2),e.Q6J("ngClass",e.VKq(3,V,t.icons.add))}}function pn(n,s){if(1&n){const t=e.EpF();e.TgZ(0,"div",1)(1,"form",2,3)(3,"div",4)(4,"div",5),e.SDv(5,6),e.ALo(6,"titlecase"),e.ALo(7,"upperFirst"),e.qZA(),e.TgZ(8,"div",7)(9,"div",8)(10,"label",9),e.SDv(11,10),e.qZA(),e.TgZ(12,"div",11)(13,"div",12),e._UZ(14,"input",13),e.TgZ(15,"button",14),e.NdJ("click",function(){return e.CHM(t),e.oxw().targetSettingsModal()}),e._UZ(16,"i",15),e.qZA()(),e.YNc(17,Mo,2,0,"span",16),e.YNc(18,Oo,2,0,"span",16),e.YNc(19,ho,9,0,"span",16),e.YNc(20,Ao,2,0,"span",17),e._UZ(21,"hr"),e.qZA()(),e.TgZ(22,"div",8)(23,"label",18),e.SDv(24,19),e.qZA(),e.TgZ(25,"div",11),e.YNc(26,Po,5,4,"ng-container",20),e.TgZ(27,"div",21)(28,"div",22)(29,"cd-select",23),e.NdJ("selection",function(i){return e.CHM(t),e.oxw().onPortalSelection(i)}),e._UZ(30,"i",24),e.ynx(31),e.SDv(32,25),e.BQk(),e.qZA()()(),e._UZ(33,"input",26),e.YNc(34,Io,2,1,"span",16),e._UZ(35,"hr"),e.qZA()(),e.TgZ(36,"div",8)(37,"label",27),e.SDv(38,28),e.qZA(),e.TgZ(39,"div",11),e.YNc(40,Do,11,10,"ng-container",20),e._UZ(41,"input",29),e.YNc(42,vo,2,0,"span",16),e.YNc(43,Lo,2,0,"span",16),e.TgZ(44,"div",21)(45,"div",22)(46,"cd-select",23),e.NdJ("selection",function(i){return e.CHM(t),e.oxw().onImageSelection(i)}),e._UZ(47,"i",24),e.ynx(48),e.SDv(49,30),e.BQk(),e.qZA()()(),e._UZ(50,"hr"),e.qZA()(),e.TgZ(51,"div",8)(52,"div",31)(53,"div",32),e._UZ(54,"input",33),e.TgZ(55,"label",34),e.SDv(56,35),e.qZA()(),e._UZ(57,"hr"),e.qZA()(),e.YNc(58,ko,39,8,"div",36),e.YNc(59,_n,13,5,"div",37),e.YNc(60,dn,12,5,"div",37),e.qZA(),e.TgZ(61,"div",38)(62,"cd-form-button-panel",39),e.NdJ("submitActionEvent",function(){return e.CHM(t),e.oxw().submit()}),e.ALo(63,"titlecase"),e.ALo(64,"upperFirst"),e.qZA()()()()()}if(2&n){const t=e.MAs(2),o=e.oxw();e.xp6(1),e.Q6J("formGroup",o.targetForm),e.xp6(6),e.pQV(e.lcZ(6,26,o.action))(e.lcZ(7,28,o.resource)),e.QtT(5),e.xp6(9),e.Q6J("ngClass",e.VKq(34,V,o.icons.deepCheck)),e.xp6(1),e.Q6J("ngIf",o.targetForm.showError("target_iqn",t,"required")),e.xp6(1),e.Q6J("ngIf",o.targetForm.showError("target_iqn",t,"pattern")),e.xp6(1),e.Q6J("ngIf",o.targetForm.showError("target_iqn",t,"iqn")),e.xp6(1),e.Q6J("ngIf",o.hasAdvancedSettings(o.targetForm.getValue("target_controls"))),e.xp6(6),e.Q6J("ngForOf",o.portals.value),e.xp6(3),e.Q6J("data",o.portals.value)("options",o.portalsSelections)("messages",o.messages.portals),e.xp6(1),e.Q6J("ngClass",e.VKq(36,V,o.icons.add)),e.xp6(4),e.Q6J("ngIf",o.targetForm.showError("portals",t,"minGateways")),e.xp6(6),e.Q6J("ngForOf",o.targetForm.getValue("disks")),e.xp6(2),e.Q6J("ngIf",o.targetForm.showError("disks",t,"dupLunId")),e.xp6(1),e.Q6J("ngIf",o.targetForm.showError("disks",t,"dupWwn")),e.xp6(3),e.Q6J("data",o.disks.value)("options",o.imagesSelections)("messages",o.messages.images),e.xp6(1),e.Q6J("ngClass",e.VKq(38,V,o.icons.add)),e.xp6(11),e.Q6J("ngIf",o.cephIscsiConfigVersion>10&&!o.targetForm.getValue("acl_enabled")),e.xp6(1),e.Q6J("ngIf",o.targetForm.getValue("acl_enabled")),e.xp6(1),e.Q6J("ngIf",o.targetForm.getValue("acl_enabled")),e.xp6(2),e.Q6J("form",o.targetForm)("submitText",e.lcZ(63,30,o.action)+" "+e.lcZ(64,32,o.resource))}}let gt=(()=>{class n extends k.E{constructor(t,o,i,_,r,l,d){super(),this.iscsiService=t,this.modalService=o,this.rbdService=i,this.router=_,this.route=r,this.taskWrapper=l,this.actionLabels=d,this.api_version=0,this.minimum_gateways=1,this.icons=T.P,this.isEdit=!1,this.portalsSelections=[],this.imagesInitiatorSelections=[],this.groupDiskSelections=[],this.groupMembersSelections=[],this.imagesSettings={},this.messages={portals:new N.a({noOptions:"There are no portals available."}),images:new N.a({noOptions:"There are no images available."}),initiatorImage:new N.a({noOptions:"There are no images available. Please make sure you add an image to the target."}),groupInitiator:new N.a({noOptions:"There are no initiators available. Please make sure you add an initiator to the target."})},this.IQN_REGEX=/^iqn\.(19|20)\d\d-(0[1-9]|1[0-2])\.\D{2,3}(\.[A-Za-z0-9-]+)+(:[A-Za-z0-9-\.]+)*$/,this.USER_REGEX=/^[\w\.:@_-]{8,64}$/,this.PASSWORD_REGEX=/^[\w@\-_\/]{12,16}$/,this.resource="target"}ngOnInit(){const t=new h.E(()=>{});t.pageInfo.limit=-1;const o=[this.iscsiService.listTargets(),this.rbdService.list(t.toParams()),this.iscsiService.portals(),this.iscsiService.settings(),this.iscsiService.version()];this.router.url.startsWith("/block/iscsi/targets/edit")&&(this.isEdit=!0,this.route.params.subscribe(i=>{this.target_iqn=decodeURIComponent(i.target_iqn),o.push(this.iscsiService.getTarget(this.target_iqn))})),this.action=this.isEdit?this.actionLabels.EDIT:this.actionLabels.CREATE,(0,le.D)(o).subscribe(i=>{const _=S()(i[0]).filter(l=>l.target_iqn!==this.target_iqn).flatMap(l=>l.disks).map(l=>`${l.pool}/${l.image}`).value();"api_version"in i[3]&&(this.api_version=i[3].api_version),this.minimum_gateways=i[3].config.minimum_gateways,this.target_default_controls=i[3].target_default_controls,this.target_controls_limits=i[3].target_controls_limits,this.disk_default_controls=i[3].disk_default_controls,this.disk_controls_limits=i[3].disk_controls_limits,this.backstores=i[3].backstores,this.default_backstore=i[3].default_backstore,this.unsupported_rbd_features=i[3].unsupported_rbd_features,this.required_rbd_features=i[3].required_rbd_features,this.imagesAll=S()(i[1]).flatMap(l=>l.value).filter(l=>!l.namespace&&!(-1!==_.indexOf(`${l.pool_name}/${l.name}`)||0===this.getValidBackstores(l).length)).value(),this.imagesSelections=this.imagesAll.map(l=>new y.$(!1,`${l.pool_name}/${l.name}`,""));const r=[];i[2].forEach(l=>{l.ip_addresses.forEach(d=>{r.push(new y.$(!1,l.name+":"+d,""))})}),this.portalsSelections=[...r],this.cephIscsiConfigVersion=i[4].ceph_iscsi_config_version,this.createForm(),i[5]&&this.resolveModel(i[5]),this.loadingReady()})}createForm(){if(this.targetForm=new Z.d({target_iqn:new a.NI("iqn.2001-07.com.ceph:"+Date.now(),{validators:[a.kI.required,a.kI.pattern(this.IQN_REGEX)]}),target_controls:new a.NI({}),portals:new a.NI([],{validators:[z.h.custom("minGateways",t=>S().uniq(t.map(i=>i.split(":")[0])).length<Math.max(1,this.minimum_gateways))]}),disks:new a.NI([],{validators:[z.h.custom("dupLunId",t=>{const o=this.getLunIds(t);return o.length!==S().uniq(o).length}),z.h.custom("dupWwn",t=>{const o=this.getWwns(t);return o.length!==S().uniq(o).length})]}),initiators:new a.Oe([]),groups:new a.Oe([]),acl_enabled:new a.NI(!1)}),this.cephIscsiConfigVersion>10){const t=new Z.d({user:new a.NI(""),password:new a.NI(""),mutual_user:new a.NI(""),mutual_password:new a.NI("")});this.setAuthValidator(t),this.targetForm.addControl("auth",t)}}resolveModel(t){this.targetForm.patchValue({target_iqn:t.target_iqn,target_controls:t.target_controls,acl_enabled:t.acl_enabled}),this.cephIscsiConfigVersion>10&&this.targetForm.patchValue({auth:t.auth});const o=[];S().forEach(t.portals,_=>{o.push(`${_.host}:${_.ip}`)}),this.targetForm.patchValue({portals:o});const i=[];S().forEach(t.disks,_=>{const r=`${_.pool}/${_.image}`;i.push(r),this.imagesSettings[r]={backstore:_.backstore},this.imagesSettings[r][_.backstore]=_.controls,"lun"in _&&(this.imagesSettings[r].lun=_.lun),"wwn"in _&&(this.imagesSettings[r].wwn=_.wwn),this.onImageSelection({option:{name:r,selected:!0}})}),this.targetForm.patchValue({disks:i}),S().forEach(t.clients,_=>{const r=this.addInitiator();_.luns=S().map(_.luns,l=>`${l.pool}/${l.image}`),r.patchValue(_)}),t.groups.forEach((_,r)=>{const l=this.addGroup();_.disks=S().map(_.disks,d=>`${d.pool}/${d.image}`),l.patchValue(_),S().forEach(_.members,d=>{this.onGroupMemberSelection({option:new y.$(!0,d,"")},r)})})}hasAdvancedSettings(t){return Object.values(t).length>0}get portals(){return this.targetForm.get("portals")}onPortalSelection(){this.portals.setValue(this.portals.value)}removePortal(t,o){return this.portalsSelections.forEach(i=>{i.name===o&&(i.selected=!1)}),this.portals.value.splice(t,1),this.portals.setValue(this.portals.value),!1}get disks(){return this.targetForm.get("disks")}removeImage(t,o){return this.imagesSelections.forEach(i=>{i.name===o&&(i.selected=!1)}),this.disks.value.splice(t,1),this.removeImageRefs(o),this.targetForm.get("disks").updateValueAndValidity({emitEvent:!1}),!1}removeImageRefs(t){this.initiators.controls.forEach(o=>{const i=o.value.luns.filter(_=>_!==t);o.get("luns").setValue(i)}),this.groups.controls.forEach(o=>{const i=o.value.disks.filter(_=>_!==t);o.get("disks").setValue(i)}),S().forEach(this.imagesInitiatorSelections,(o,i)=>{this.imagesInitiatorSelections[i]=o.filter(_=>_.name!==t)}),S().forEach(this.groupDiskSelections,(o,i)=>{this.groupDiskSelections[i]=o.filter(_=>_.name!==t)})}getDefaultBackstore(t){let o=this.default_backstore;const i=this.getImageById(t);return this.validFeatures(i,this.default_backstore)||this.backstores.forEach(_=>{_!==this.default_backstore&&this.validFeatures(i,_)&&(o=_)}),o}isLunIdInUse(t,o){const i=this.disks.value.filter(_=>_!==o);return this.getLunIds(i).includes(t)}getLunIds(t){return S().map(t,o=>this.imagesSettings[o].lun)}nextLunId(t){const o=this.disks.value.filter(r=>r!==t),i=this.getLunIds(o);let _=0;for(;i.includes(_);)_++;return _}getWwns(t){return S().map(t,i=>this.imagesSettings[i].wwn).filter(i=>S().isString(i)&&""!==i)}onImageSelection(t){const o=t.option;if(o.selected){if(this.imagesSettings[o.name])this.isLunIdInUse(this.imagesSettings[o.name].lun,o.name)&&(this.imagesSettings[o.name].lun=this.nextLunId(o.name));else{const i=this.getDefaultBackstore(o.name);this.imagesSettings[o.name]={backstore:i,lun:this.nextLunId(o.name)},this.imagesSettings[o.name][i]={}}S().forEach(this.imagesInitiatorSelections,(i,_)=>{i.push(new y.$(!1,o.name,"")),this.imagesInitiatorSelections[_]=[...i]}),S().forEach(this.groupDiskSelections,(i,_)=>{i.push(new y.$(!1,o.name,"")),this.groupDiskSelections[_]=[...i]})}else this.removeImageRefs(o.name);this.targetForm.get("disks").updateValueAndValidity({emitEvent:!1})}get initiators(){return this.targetForm.get("initiators")}addInitiator(){const t=new Z.d({client_iqn:new a.NI("",{validators:[a.kI.required,z.h.custom("notUnique",i=>{const _=this.initiators.controls.reduce(function(r,l){return r.concat(l.value.client_iqn)},[]);return _.indexOf(i)!==_.lastIndexOf(i)}),a.kI.pattern(this.IQN_REGEX)]}),auth:new Z.d({user:new a.NI(""),password:new a.NI(""),mutual_user:new a.NI(""),mutual_password:new a.NI("")}),luns:new a.NI([]),cdIsInGroup:new a.NI(!1)});this.setAuthValidator(t),this.initiators.push(t),S().forEach(this.groupMembersSelections,(i,_)=>{i.push(new y.$(!1,"","")),this.groupMembersSelections[_]=[...i]});const o=S().map(this.targetForm.getValue("disks"),i=>new y.$(!1,i,""));return this.imagesInitiatorSelections.push(o),t}setAuthValidator(t){z.h.validateIf(t.get("user"),()=>t.getValue("password")||t.getValue("mutual_user")||t.getValue("mutual_password"),[a.kI.required],[a.kI.pattern(this.USER_REGEX)],[t.get("password"),t.get("mutual_user"),t.get("mutual_password")]),z.h.validateIf(t.get("password"),()=>t.getValue("user")||t.getValue("mutual_user")||t.getValue("mutual_password"),[a.kI.required],[a.kI.pattern(this.PASSWORD_REGEX)],[t.get("user"),t.get("mutual_user"),t.get("mutual_password")]),z.h.validateIf(t.get("mutual_user"),()=>t.getValue("mutual_password"),[a.kI.required],[a.kI.pattern(this.USER_REGEX)],[t.get("user"),t.get("password"),t.get("mutual_password")]),z.h.validateIf(t.get("mutual_password"),()=>t.getValue("mutual_user"),[a.kI.required],[a.kI.pattern(this.PASSWORD_REGEX)],[t.get("user"),t.get("password"),t.get("mutual_user")])}removeInitiator(t){const o=this.initiators.value[t];this.initiators.removeAt(t),S().forEach(this.groupMembersSelections,(i,_)=>{i.splice(t,1),this.groupMembersSelections[_]=[...i]}),this.groups.controls.forEach(i=>{const _=i.value.members.filter(r=>r!==o.client_iqn);i.get("members").setValue(_)}),this.imagesInitiatorSelections.splice(t,1)}updatedInitiatorSelector(){this.initiators.controls.forEach(t=>{t.get("client_iqn").updateValueAndValidity({emitEvent:!1})}),S().forEach(this.groupMembersSelections,(t,o)=>{S().forEach(t,(i,_)=>{const r=i.name;i.name=this.initiators.controls[_].value.client_iqn,this.groups.controls.forEach(l=>{const d=l.value.members,u=d.indexOf(r);-1!==u&&(d[u]=i.name),l.get("members").setValue(d)})}),this.groupMembersSelections[o]=[...this.groupMembersSelections[o]]})}removeInitiatorImage(t,o,i,_){const r=t.getValue("luns");return r.splice(o,1),t.patchValue({luns:r}),this.imagesInitiatorSelections[i].forEach(l=>{l.name===_&&(l.selected=!1)}),!1}get groups(){return this.targetForm.get("groups")}addGroup(){const t=new Z.d({group_id:new a.NI("",{validators:[a.kI.required]}),members:new a.NI([]),disks:new a.NI([])});this.groups.push(t);const o=S().map(this.targetForm.getValue("disks"),_=>new y.$(!1,_,""));this.groupDiskSelections.push(o);const i=S().map(this.initiators.value,_=>new y.$(!1,_.client_iqn,"",!_.cdIsInGroup));return this.groupMembersSelections.push(i),t}removeGroup(t){this.groups.removeAt(t),this.groupMembersSelections[t].filter(i=>i.selected).forEach(i=>{i.selected=!1,this.onGroupMemberSelection({option:i},t)}),this.groupMembersSelections.splice(t,1),this.groupDiskSelections.splice(t,1)}onGroupMemberSelection(t,o){const i=t.option;let _=[];i.selected||(_=this.groupDiskSelections[o].filter(l=>l.selected).map(l=>l.name)),this.initiators.controls.forEach((r,l)=>{r.value.client_iqn===i.name&&(r.patchValue({luns:_}),r.get("cdIsInGroup").setValue(i.selected),S().forEach(this.groupMembersSelections,d=>{d[l].enabled=!i.selected}),this.imagesInitiatorSelections[l].forEach(d=>{d.selected=_.includes(d.name)}))})}removeGroupInitiator(t,o,i){const _=t.getValue("members")[o];t.getValue("members").splice(o,1),this.onGroupMemberSelection({option:new y.$(!1,_,"")},i)}removeGroupDisk(t,o,i){const _=t.getValue("disks")[o];t.getValue("disks").splice(o,1),this.groupDiskSelections[i].forEach(r=>{r.name===_&&(r.selected=!1)}),this.groupDiskSelections[i]=[...this.groupDiskSelections[i]]}submit(){const t=S().cloneDeep(this.targetForm.value),o={target_iqn:this.targetForm.getValue("target_iqn"),target_controls:this.targetForm.getValue("target_controls"),acl_enabled:this.targetForm.getValue("acl_enabled"),portals:[],disks:[],clients:[],groups:[]};if(this.cephIscsiConfigVersion>10){const _=this.targetForm.get("auth");_.getValue("user")||_.get("user").setValue(""),_.getValue("password")||_.get("password").setValue(""),_.getValue("mutual_user")||_.get("mutual_user").setValue(""),_.getValue("mutual_password")||_.get("mutual_password").setValue("");const r=this.targetForm.getValue("acl_enabled");o.auth={user:r?"":_.getValue("user"),password:r?"":_.getValue("password"),mutual_user:r?"":_.getValue("mutual_user"),mutual_password:r?"":_.getValue("mutual_password")}}let i;t.disks.forEach(_=>{const r=_.split("/"),l=this.imagesSettings[_].backstore;o.disks.push({pool:r[0],image:r[1],backstore:l,controls:this.imagesSettings[_][l],lun:this.imagesSettings[_].lun,wwn:this.imagesSettings[_].wwn})}),t.portals.forEach(_=>{const r=_.indexOf(":");o.portals.push({host:_.substring(0,r),ip:_.substring(r+1)})}),o.acl_enabled&&(t.initiators.forEach(_=>{_.auth.user||(_.auth.user=""),_.auth.password||(_.auth.password=""),_.auth.mutual_user||(_.auth.mutual_user=""),_.auth.mutual_password||(_.auth.mutual_password=""),delete _.cdIsInGroup;const r=[];_.luns.forEach(l=>{const d=l.split("/");r.push({pool:d[0],image:d[1]})}),_.luns=r}),o.clients=t.initiators),o.acl_enabled&&(t.groups.forEach(_=>{const r=[];_.disks.forEach(l=>{const d=l.split("/");r.push({pool:d[0],image:d[1]})}),_.disks=r}),o.groups=t.groups),this.isEdit?(o.new_target_iqn=o.target_iqn,o.target_iqn=this.target_iqn,i=this.taskWrapper.wrapTaskAroundCall({task:new R.R("iscsi/target/edit",{target_iqn:o.target_iqn}),call:this.iscsiService.updateTarget(this.target_iqn,o)})):i=this.taskWrapper.wrapTaskAroundCall({task:new R.R("iscsi/target/create",{target_iqn:o.target_iqn}),call:this.iscsiService.createTarget(o)}),i.subscribe({error:()=>{this.targetForm.setErrors({cdSubmitButton:!0})},complete:()=>this.router.navigate(["/block/iscsi/targets"])})}targetSettingsModal(){const t={target_controls:this.targetForm.get("target_controls"),target_default_controls:this.target_default_controls,target_controls_limits:this.target_controls_limits};this.modalRef=this.modalService.show(So,t)}imageSettingsModal(t){const o={imagesSettings:this.imagesSettings,image:t,api_version:this.api_version,disk_default_controls:this.disk_default_controls,disk_controls_limits:this.disk_controls_limits,backstores:this.getValidBackstores(this.getImageById(t)),control:this.targetForm.get("disks")};this.modalRef=this.modalService.show(fo,o)}validFeatures(t,o){const i=t.features,_=this.required_rbd_features[o];return(i&_)===_&&0==(i&this.unsupported_rbd_features[o])}getImageById(t){return this.imagesAll.find(o=>t===`${o.pool_name}/${o.name}`)}getValidBackstores(t){return this.backstores.filter(o=>this.validFeatures(t,o))}}return n.\u0275fac=function(t){return new(t||n)(e.Y36(Q),e.Y36(de.Z),e.Y36(H),e.Y36(g.F0),e.Y36(g.gz),e.Y36(m.P),e.Y36(D.p4))},n.\u0275cmp=e.Xpm({type:n,selectors:[["cd-iscsi-target-form"]],features:[e.qOj],decls:1,vars:1,consts:function(){let s,t,o,i,_,r,l,d,u,f,I,P,B,x,q,J,ee,te,w,_e,ae,M,ue,me,ge,Te,fe,Ce,Se,G,ye,xe,Ze,we,He,ke,qe,Ke,Xe,Qe,ze,b,Gt,yt,xt,Zt,wt,Ht,kt,qt,Kt,Xt,Qt,zt,Jt,Yt,Vt,Ut,jt,Wt,eo,to;return s="" + "\ufffd0\ufffd" + " " + "\ufffd1\ufffd" + "",t="Target IQN",o="Portals",i="Add portal",_="Images",r="Add image",l="ACL authentication",d="This field is required.",u="IQN has wrong pattern.",f="An IQN has the following notation 'iqn.$year-$month.$reversedAddress:$definedName'",I="For example: iqn.2016-06.org.dashboard:storage:disk.sn-a8675309",P="More information",B="This target has modified advanced settings.",x="At least " + "\ufffd0\ufffd" + " gateways are required.",q="Backstore: " + "\ufffd0\ufffd" + ".\xA0",J="This image has modified settings.",ee="Duplicated LUN numbers.",te="Duplicated WWN.",w="User",_e="Password",ae="Mutual User",M="Mutual Password",ue="This field is required.",me="User names must have a length of 8 to 64 characters and can contain alphanumeric characters, '.', '@', '-', '_' or ':'.",ge="This field is required.",Te="Passwords must have a length of 12 to 16 characters and can contain alphanumeric characters, '@', '-', '_' or '/'.",fe="This field is required.",Ce="User names must have a length of 8 to 64 characters and can contain alphanumeric characters, '.', '@', '-', '_' or ':'.",Se="This field is required.",G="Passwords must have a length of 12 to 16 characters and can contain alphanumeric characters, '@', '-', '_' or '/'.",ye="Initiators",xe="Add initiator",Ze="Initiator",we="Client IQN",He="User",ke="Password",qe="Mutual User",Ke="Mutual Password",Xe="Images",Qe="Initiator IQN needs to be unique.",ze="This field is required.",b="IQN has wrong pattern.",Gt="This field is required.",yt="User names must have a length of 8 to 64 characters and can contain alphanumeric characters, '.', '@', '-', '_' or ':'.",xt="This field is required.",Zt="Passwords must have a length of 12 to 16 characters and can contain alphanumeric characters, '@', '-', '_' or '/'.",wt="This field is required.",Ht="User names must have a length of 8 to 64 characters and can contain alphanumeric characters, '.', '@', '-', '_' or ':'.",kt="This field is required.",qt="Passwords must have a length of 12 to 16 characters and can contain alphanumeric characters, '@', '-', '_' or '/'.",Kt="Initiator belongs to a group. Images will be configure in the group.",Xt="Add image",Qt="No items added.",zt="Groups",Jt="Add group",Yt="Group",Vt="Name",Ut="Initiators",jt="Add initiator",Wt="Images",eo="Add image",to="No items added.",[["class","cd-col-form",4,"cdFormLoading"],[1,"cd-col-form"],["name","targetForm","novalidate","",3,"formGroup"],["formDir","ngForm"],[1,"card"],[1,"card-header"],s,[1,"card-body"],[1,"form-group","row"],["for","target_iqn",1,"cd-col-form-label","required"],t,[1,"cd-col-form-input"],[1,"input-group"],["type","text","id","target_iqn","name","target_iqn","formControlName","target_iqn","cdTrim","",1,"form-control"],["id","ecp-info-button","type","button",1,"btn","btn-light",3,"click"],["aria-hidden","true",3,"ngClass"],["class","invalid-feedback",4,"ngIf"],["class","form-text text-muted",4,"ngIf"],["for","portals",1,"cd-col-form-label","required"],o,[4,"ngFor","ngForOf"],[1,"row"],[1,"col-md-12"],["elemClass","btn btn-light float-end",3,"data","options","messages","selection"],[3,"ngClass"],i,["type","hidden","id","portals","name","portals","formControlName","portals",1,"form-control"],["for","disks",1,"cd-col-form-label"],_,["type","hidden","id","disks","name","disks","formControlName","disks",1,"form-control"],r,[1,"cd-col-form-offset"],[1,"custom-control","custom-checkbox"],["type","checkbox","formControlName","acl_enabled","name","acl_enabled","id","acl_enabled",1,"custom-control-input"],["for","acl_enabled",1,"custom-control-label"],l,["formGroupName","auth",4,"ngIf"],["class","form-group row",4,"ngIf"],[1,"card-footer"],["wrappingClass","text-right",3,"form","submitText","submitActionEvent"],[1,"invalid-feedback"],d,u,f,I,["target","_blank","href","https://en.wikipedia.org/wiki/ISCSI#Addressing"],P,[1,"form-text","text-muted"],B,[1,"input-group","cd-mb"],["type","text","disabled","",1,"cd-form-control",3,"value"],["type","button",1,"btn","btn-light",3,"click"],x,["class","input-group-text",4,"ngIf"],[4,"ngIf"],[1,"input-group-text"],q,J,ee,te,["formGroupName","auth"],["for","target_user",1,"cd-col-form-label"],w,["type","text","autocomplete","off","id","target_user","name","target_user","formControlName","user",1,"form-control"],["for","target_password",1,"cd-col-form-label"],_e,["type","password","autocomplete","new-password","id","target_password","name","target_password","formControlName","password",1,"form-control"],["type","button","cdPasswordButton","target_password",1,"btn","btn-light"],["source","target_password"],["for","target_mutual_user",1,"cd-col-form-label"],ae,["type","text","autocomplete","off","id","target_mutual_user","name","target_mutual_user","formControlName","mutual_user",1,"form-control"],["for","target_mutual_password",1,"cd-col-form-label"],M,["type","password","autocomplete","new-password","id","target_mutual_password","name","target_mutual_password","formControlName","mutual_password",1,"form-control"],["type","button","cdPasswordButton","target_mutual_password",1,"btn","btn-light"],["source","target_mutual_password"],ue,me,ge,Te,fe,Ce,Se,G,["for","initiators",1,"cd-col-form-label"],ye,["formArrayName","initiators",1,"cd-col-form-input"],["class","card mb-2",3,"formGroup",4,"ngFor","ngForOf"],[1,"btn","btn-light","float-end",3,"click"],xe,[1,"card","mb-2",3,"formGroup"],Ze,["type","button",1,"btn-close","float-end",3,"click"],["for","client_iqn",1,"cd-col-form-label","required"],we,["type","text","formControlName","client_iqn","cdTrim","",1,"form-control",3,"blur"],["for","user",1,"cd-col-form-label"],He,["formControlName","user","autocomplete","off","type","text",1,"form-control",3,"id"],["for","password",1,"cd-col-form-label"],ke,["formControlName","password","autocomplete","new-password","type","password",1,"form-control",3,"id"],["type","button",1,"btn","btn-light",3,"cdPasswordButton"],[3,"source"],["for","mutual_user",1,"cd-col-form-label"],qe,["formControlName","mutual_user","autocomplete","off","type","text",1,"form-control",3,"id"],["for","mutual_password",1,"cd-col-form-label"],Ke,["formControlName","mutual_password","autocomplete","new-password","type","password",1,"form-control",3,"id"],["for","luns",1,"cd-col-form-label"],Xe,["class","row",4,"ngIf"],Qe,ze,b,Gt,yt,xt,Zt,wt,Ht,kt,qt,Kt,["elemClass","btn btn-light float-end",3,"data","options","messages"],Xt,Qt,zt,["formArrayName","groups",1,"cd-col-form-input"],Jt,Yt,["for","group_id",1,"cd-col-form-label","required"],Vt,["type","text","formControlName","group_id",1,"form-control"],["for","members",1,"cd-col-form-label"],Ut,jt,Wt,eo,to]},template:function(t,o){1&t&&e.YNc(0,pn,65,40,"div",0),2&t&&e.Q6J("cdFormLoading",o.loading)},directives:[ut.y,a._Y,a.JL,a.sg,A.V,O.P,$.o,a.Fj,X.b,a.JJ,a.u,Eo,c.mk,c.O5,c.sg,Ro.H,a.Wl,a.x0,mt.C,Ye.s,a.CE,j.p],pipes:[c.rS,tt.m,Je.V],styles:[".cd-mb[_ngcontent-%COMP%]{margin-bottom:10px}"]}),n})();var Tt=p(68136),pe=p(30982),W=p(83697),ve=p(99466),Ee=p(68774),ft=p(55657),ce=p(38047),ot=p(18001),Le=p(97161),oe=p(47640);function un(n,s){1&n&&(e.TgZ(0,"span",29),e.SDv(1,30),e.qZA())}function mn(n,s){1&n&&(e.TgZ(0,"span",29),e.SDv(1,31),e.qZA())}function gn(n,s){1&n&&(e.TgZ(0,"span",29),e.SDv(1,32),e.qZA())}function Tn(n,s){1&n&&(e.TgZ(0,"span",29),e.SDv(1,33),e.qZA())}function fn(n,s){1&n&&(e.TgZ(0,"span",29),e.SDv(1,34),e.qZA())}function Cn(n,s){1&n&&(e.TgZ(0,"span",29),e.SDv(1,35),e.qZA())}function Sn(n,s){1&n&&(e.TgZ(0,"span",29),e.SDv(1,36),e.qZA())}function En(n,s){1&n&&(e.TgZ(0,"span",29),e.SDv(1,37),e.qZA())}let Rn=(()=>{class n{constructor(t,o,i,_,r){this.authStorageService=t,this.activeModal=o,this.actionLabels=i,this.iscsiService=_,this.notificationService=r,this.USER_REGEX=/^[\w\.:@_-]{8,64}$/,this.PASSWORD_REGEX=/^[\w@\-_\/]{12,16}$/,this.permission=this.authStorageService.getPermissions().iscsi}ngOnInit(){this.hasPermission=this.permission.update,this.createForm(),this.iscsiService.getDiscovery().subscribe(t=>{this.discoveryForm.patchValue(t)})}createForm(){this.discoveryForm=new Z.d({user:new a.NI({value:"",disabled:!this.hasPermission}),password:new a.NI({value:"",disabled:!this.hasPermission}),mutual_user:new a.NI({value:"",disabled:!this.hasPermission}),mutual_password:new a.NI({value:"",disabled:!this.hasPermission})}),z.h.validateIf(this.discoveryForm.get("user"),()=>this.discoveryForm.getValue("password")||this.discoveryForm.getValue("mutual_user")||this.discoveryForm.getValue("mutual_password"),[a.kI.required],[a.kI.pattern(this.USER_REGEX)],[this.discoveryForm.get("password"),this.discoveryForm.get("mutual_user"),this.discoveryForm.get("mutual_password")]),z.h.validateIf(this.discoveryForm.get("password"),()=>this.discoveryForm.getValue("user")||this.discoveryForm.getValue("mutual_user")||this.discoveryForm.getValue("mutual_password"),[a.kI.required],[a.kI.pattern(this.PASSWORD_REGEX)],[this.discoveryForm.get("user"),this.discoveryForm.get("mutual_user"),this.discoveryForm.get("mutual_password")]),z.h.validateIf(this.discoveryForm.get("mutual_user"),()=>this.discoveryForm.getValue("mutual_password"),[a.kI.required],[a.kI.pattern(this.USER_REGEX)],[this.discoveryForm.get("user"),this.discoveryForm.get("password"),this.discoveryForm.get("mutual_password")]),z.h.validateIf(this.discoveryForm.get("mutual_password"),()=>this.discoveryForm.getValue("mutual_user"),[a.kI.required],[a.kI.pattern(this.PASSWORD_REGEX)],[this.discoveryForm.get("user"),this.discoveryForm.get("password"),this.discoveryForm.get("mutual_user")])}submitAction(){this.iscsiService.updateDiscovery(this.discoveryForm.value).subscribe(()=>{this.notificationService.show(ot.k.success,"Updated discovery authentication"),this.activeModal.close()},()=>{this.discoveryForm.setErrors({cdSubmitButton:!0})})}}return n.\u0275fac=function(t){return new(t||n)(e.Y36(oe.j),e.Y36(v.Kz),e.Y36(D.p4),e.Y36(Q),e.Y36(Le.g))},n.\u0275cmp=e.Xpm({type:n,selectors:[["cd-iscsi-target-discovery-modal"]],decls:44,vars:13,consts:function(){let s,t,o,i,_,r,l,d,u,f,I,P,B;return s="Discovery Authentication",t="User",o="Password",i="Mutual User",_="Mutual Password",r="This field is required.",l="User names must have a length of 8 to 64 characters and can contain alphanumeric characters, '.', '@', '-', '_' or ':'.",d="This field is required.",u="Passwords must have a length of 12 to 16 characters and can contain alphanumeric characters, '@', '-', '_' or '/'.",f="This field is required.",I="User names must have a length of 8 to 64 characters and can contain alphanumeric characters, '.', '@', '-', '_' or ':'.",P="This field is required.",B="Passwords must have a length of 12 to 16 characters and can contain alphanumeric characters, '@', '-', '_' or '/'.",[[3,"modalRef"],[1,"modal-title"],s,[1,"modal-content"],["name","discoveryForm","novalidate","",3,"formGroup"],["formDir","ngForm"],[1,"modal-body"],[1,"form-group","row"],["for","user",1,"cd-col-form-label"],t,[1,"cd-col-form-input"],["id","user","formControlName","user","type","text","autocomplete","off",1,"form-control"],["class","invalid-feedback",4,"ngIf"],["for","password",1,"cd-col-form-label"],o,[1,"input-group"],["id","password","formControlName","password","type","password","autocomplete","new-password",1,"form-control"],["type","button","cdPasswordButton","password",1,"btn","btn-light"],["source","password"],["for","mutual_user",1,"cd-col-form-label"],i,["id","mutual_user","formControlName","mutual_user","type","text","autocomplete","off",1,"form-control"],["for","mutual_password",1,"cd-col-form-label"],_,["id","mutual_password","formControlName","mutual_password","type","password","autocomplete","new-password",1,"form-control"],["type","button","cdPasswordButton","mutual_password",1,"btn","btn-light"],["source","mutual_password"],[1,"modal-footer"],[3,"form","showSubmit","submitText","submitActionEvent"],[1,"invalid-feedback"],r,l,d,u,f,I,P,B]},template:function(t,o){if(1&t&&(e.TgZ(0,"cd-modal",0),e.ynx(1,1),e.SDv(2,2),e.BQk(),e.ynx(3,3),e.TgZ(4,"form",4,5)(6,"div",6)(7,"div",7)(8,"label",8),e.SDv(9,9),e.qZA(),e.TgZ(10,"div",10),e._UZ(11,"input",11),e.YNc(12,un,2,0,"span",12),e.YNc(13,mn,2,0,"span",12),e.qZA()(),e.TgZ(14,"div",7)(15,"label",13),e.SDv(16,14),e.qZA(),e.TgZ(17,"div",10)(18,"div",15),e._UZ(19,"input",16)(20,"button",17)(21,"cd-copy-2-clipboard-button",18),e.qZA(),e.YNc(22,gn,2,0,"span",12),e.YNc(23,Tn,2,0,"span",12),e.qZA()(),e.TgZ(24,"div",7)(25,"label",19),e.ynx(26),e.SDv(27,20),e.BQk(),e.qZA(),e.TgZ(28,"div",10),e._UZ(29,"input",21),e.YNc(30,fn,2,0,"span",12),e.YNc(31,Cn,2,0,"span",12),e.qZA()(),e.TgZ(32,"div",7)(33,"label",22),e.SDv(34,23),e.qZA(),e.TgZ(35,"div",10)(36,"div",15),e._UZ(37,"input",24)(38,"button",25)(39,"cd-copy-2-clipboard-button",26),e.qZA(),e.YNc(40,Sn,2,0,"span",12),e.YNc(41,En,2,0,"span",12),e.qZA()()(),e.TgZ(42,"div",27)(43,"cd-form-button-panel",28),e.NdJ("submitActionEvent",function(){return o.submitAction()}),e.qZA()()(),e.BQk(),e.qZA()),2&t){const i=e.MAs(5);e.Q6J("modalRef",o.activeModal),e.xp6(4),e.Q6J("formGroup",o.discoveryForm),e.xp6(8),e.Q6J("ngIf",o.discoveryForm.showError("user",i,"required")),e.xp6(1),e.Q6J("ngIf",o.discoveryForm.showError("user",i,"pattern")),e.xp6(9),e.Q6J("ngIf",o.discoveryForm.showError("password",i,"required")),e.xp6(1),e.Q6J("ngIf",o.discoveryForm.showError("password",i,"pattern")),e.xp6(7),e.Q6J("ngIf",o.discoveryForm.showError("mutual_user",i,"required")),e.xp6(1),e.Q6J("ngIf",o.discoveryForm.showError("mutual_user",i,"pattern")),e.xp6(9),e.Q6J("ngIf",o.discoveryForm.showError("mutual_password",i,"required")),e.xp6(1),e.Q6J("ngIf",o.discoveryForm.showError("mutual_password",i,"pattern")),e.xp6(2),e.Q6J("form",o.discoveryForm)("showSubmit",o.hasPermission)("submitText",o.actionLabels.SUBMIT)}},directives:[C.z,a._Y,a.JL,a.sg,A.V,O.P,$.o,a.Fj,X.b,a.JJ,a.u,c.O5,mt.C,Ye.s,j.p],styles:[""]}),n})();var Mn=p(86969);let Ct=(()=>{class n{}return n.\u0275fac=function(t){return new(t||n)},n.\u0275cmp=e.Xpm({type:n,selectors:[["cd-iscsi-tabs"]],decls:7,vars:0,consts:function(){let s,t;return s="Overview",t="Targets",[[1,"nav","nav-tabs"],[1,"nav-item"],["routerLink","/block/iscsi/overview","routerLinkActive","active","ariaCurrentWhenActive","page",1,"nav-link"],s,["routerLink","/block/iscsi/targets","routerLinkActive","active","ariaCurrentWhenActive","page",1,"nav-link"],t]},template:function(t,o){1&t&&(e.TgZ(0,"ul",0)(1,"li",1)(2,"a",2),e.SDv(3,3),e.qZA()(),e.TgZ(4,"li",1)(5,"a",4),e.SDv(6,5),e.qZA()()())},directives:[g.yS,g.Od],styles:[""]}),n})();var St=p(34501),On=p(30490),Re=p(94928),hn=p(68962);const An=["highlightTpl"],Pn=["detailTable"],In=["tree"],bn=function(){return["logged_in"]},Nn=function(){return["logged_out"]},Fn=function(n,s){return{"badge-success":n,"badge-danger":s}};function Dn(n,s){if(1&n&&(e._UZ(0,"i"),e.TgZ(1,"span"),e._uU(2),e.qZA(),e._uU(3," \xa0 "),e.TgZ(4,"span",8),e._uU(5),e.qZA()),2&n){const t=s.$implicit;e.Tol(t.data.cdIcon),e.xp6(2),e.Oqu(t.data.name),e.xp6(2),e.Q6J("ngClass",e.WLB(7,Fn,e.DdM(5,bn).includes(t.data.status),e.DdM(6,Nn).includes(t.data.status))),e.xp6(1),e.hij(" ",t.data.status," ")}}function vn(n,s){if(1&n&&(e.TgZ(0,"div",9)(1,"legend"),e._uU(2),e.qZA(),e._UZ(3,"cd-table",10,11),e.qZA()),2&n){const t=e.oxw();e.xp6(2),e.Oqu(t.title),e.xp6(1),e.Q6J("data",t.data)("columns",t.columns)("limit",0)}}function Ln(n,s){if(1&n&&(e.TgZ(0,"span"),e._uU(1),e.qZA()),2&n){const t=e.oxw().value;e.xp6(1),e.Oqu(t)}}function $n(n,s){if(1&n&&(e.TgZ(0,"strong"),e._uU(1),e.qZA()),2&n){const t=e.oxw().value;e.xp6(1),e.Oqu(t)}}function Bn(n,s){if(1&n&&(e.YNc(0,Ln,2,1,"span",12),e.YNc(1,$n,2,1,"strong",12)),2&n){const t=s.row;e.Q6J("ngIf",void 0===t.default||t.default===t.current),e.xp6(1),e.Q6J("ngIf",void 0!==t.default&&t.default!==t.current)}}let Gn=(()=>{class n{constructor(t,o){this.iscsiBackstorePipe=t,this.booleanTextPipe=o,this.icons=T.P,this.metadata={},this.nodes=[],this.treeOptions={useVirtualScroll:!0,actionMapping:{mouse:{click:this.onNodeSelected.bind(this)}}}}set content(t){this.detailTable=t,t&&t.updateColumns()}ngOnInit(){this.columns=[{prop:"displayName",name:"Name",flexGrow:1,cellTemplate:this.highlightTpl},{prop:"current",name:"Current",flexGrow:1,cellTemplate:this.highlightTpl},{prop:"default",name:"Default",flexGrow:1,cellTemplate:this.highlightTpl}]}ngOnChanges(){this.selection&&(this.selectedItem=this.selection,this.generateTree()),this.data=void 0}generateTree(){const t=S().cloneDeep(this.selectedItem.target_controls);this.cephIscsiConfigVersion>10&&S().extend(t,S().cloneDeep(this.selectedItem.auth)),this.metadata={root:t};const o={target:{expanded:S().join(this.selectedItem.cdExecuting?[T.P.large,T.P.spinner,T.P.spin]:[T.P.large,T.P.bullseye]," ")},initiators:{expanded:S().join([T.P.large,T.P.user]," "),leaf:S().join([T.P.user]," ")},groups:{expanded:S().join([T.P.large,T.P.users]," "),leaf:S().join([T.P.users]," ")},disks:{expanded:S().join([T.P.large,T.P.disk]," "),leaf:S().join([T.P.disk]," ")},portals:{expanded:S().join([T.P.large,T.P.server]," "),leaf:S().join([T.P.server]," ")}},i=[];S().forEach(this.selectedItem.disks,d=>{const u="disk_"+d.pool+"_"+d.image;this.metadata[u]={controls:d.controls,backstore:d.backstore},["wwn","lun"].forEach(f=>{f in d&&(this.metadata[u][f]=d[f])}),i.push({name:`${d.pool}/${d.image}`,cdId:u,cdIcon:o.disks.leaf})});const _=[];S().forEach(this.selectedItem.portals,d=>{_.push({name:`${d.host}:${d.ip}`,cdIcon:o.portals.leaf})});const r=[];S().forEach(this.selectedItem.clients,d=>{const u=S().cloneDeep(d.auth);d.info&&(S().extend(u,d.info),delete u.state,S().forEach(Object.keys(d.info.state),P=>{u[P.toLowerCase()]=d.info.state[P]})),this.metadata["client_"+d.client_iqn]=u;const f=[];d.luns.forEach(P=>{f.push({name:`${P.pool}/${P.image}`,cdId:"disk_"+P.pool+"_"+P.image,cdIcon:o.disks.leaf})});let I="";d.info&&(I=Object.keys(d.info.state).includes("LOGGED_IN")?"logged_in":"logged_out"),r.push({name:d.client_iqn,status:I,cdId:"client_"+d.client_iqn,children:f,cdIcon:o.initiators.leaf})});const l=[];S().forEach(this.selectedItem.groups,d=>{const u=[];d.disks.forEach(I=>{u.push({name:`${I.pool}/${I.image}`,cdId:"disk_"+I.pool+"_"+I.image,cdIcon:o.disks.leaf})});const f=[];d.members.forEach(I=>{f.push({name:I,cdId:"client_"+I})}),l.push({name:d.group_id,cdIcon:o.groups.leaf,children:[{name:"Disks",children:u,cdIcon:o.disks.expanded},{name:"Initiators",children:f,cdIcon:o.initiators.expanded}]})}),this.nodes=[{name:this.selectedItem.target_iqn,cdId:"root",isExpanded:!0,cdIcon:o.target.expanded,children:[{name:"Disks",isExpanded:!0,children:i,cdIcon:o.disks.expanded},{name:"Portals",isExpanded:!0,children:_,cdIcon:o.portals.expanded},{name:"Initiators",isExpanded:!0,children:r,cdIcon:o.initiators.expanded},{name:"Groups",isExpanded:!0,children:l,cdIcon:o.groups.expanded}]}]}format(t){return"boolean"==typeof t?this.booleanTextPipe.transform(t):t}onNodeSelected(t,o){var i,_,r,l;if(ne.iM.ACTIVATE(t,o,!0),o.data.cdId){this.title=o.data.name;const d=this.metadata[o.data.cdId]||{};"root"===o.data.cdId?(null===(i=this.detailTable)||void 0===i||i.toggleColumn({prop:"default",isHidden:!0}),this.data=S().map(this.settings.target_default_controls,(u,f)=>({displayName:f,default:u=this.format(u),current:S().isUndefined(d[f])?u:this.format(d[f])})),this.cephIscsiConfigVersion>10&&["user","password","mutual_user","mutual_password"].forEach(u=>{this.data.push({displayName:u,default:null,current:d[u]})})):o.data.cdId.toString().startsWith("disk_")?(null===(_=this.detailTable)||void 0===_||_.toggleColumn({prop:"default",isHidden:!0}),this.data=S().map(this.settings.disk_default_controls[d.backstore],(u,f)=>({displayName:f,default:u=this.format(u),current:S().isUndefined(d.controls[f])?u:this.format(d.controls[f])})),this.data.push({displayName:"backstore",default:this.iscsiBackstorePipe.transform(this.settings.default_backstore),current:this.iscsiBackstorePipe.transform(d.backstore)}),["wwn","lun"].forEach(u=>{u in d&&this.data.push({displayName:u,default:void 0,current:d[u]})})):(null===(r=this.detailTable)||void 0===r||r.toggleColumn({prop:"default",isHidden:!1}),this.data=S().map(d,(u,f)=>({displayName:f,default:void 0,current:this.format(u)})))}else this.data=void 0;null===(l=this.detailTable)||void 0===l||l.updateColumns()}onUpdateData(){this.tree.treeModel.expandAll()}}return n.\u0275fac=function(t){return new(t||n)(e.Y36(Je.V),e.Y36(hn.T))},n.\u0275cmp=e.Xpm({type:n,selectors:[["cd-iscsi-target-details"]],viewQuery:function(t,o){if(1&t&&(e.Gf(An,7),e.Gf(Pn,5),e.Gf(In,5)),2&t){let i;e.iGM(i=e.CRH())&&(o.highlightTpl=i.first),e.iGM(i=e.CRH())&&(o.content=i.first),e.iGM(i=e.CRH())&&(o.tree=i.first)}},inputs:{selection:"selection",settings:"settings",cephIscsiConfigVersion:"cephIscsiConfigVersion"},features:[e.TTD],decls:11,vars:3,consts:function(){let s;return s="iSCSI Topology",[[1,"row"],[1,"col-6"],s,[3,"nodes","options","updateData"],["tree",""],["treeNodeTemplate",""],["class","col-6 metadata",4,"ngIf"],["highlightTpl",""],[1,"badge",3,"ngClass"],[1,"col-6","metadata"],["columnMode","flex",3,"data","columns","limit"],["detailTable",""],[4,"ngIf"]]},template:function(t,o){1&t&&(e.TgZ(0,"div",0)(1,"div",1)(2,"legend"),e.SDv(3,2),e.qZA(),e.TgZ(4,"tree-root",3,4),e.NdJ("updateData",function(){return o.onUpdateData()}),e.YNc(6,Dn,6,10,"ng-template",null,5,e.W1O),e.qZA()(),e.YNc(8,vn,5,4,"div",6),e.qZA(),e.YNc(9,Bn,2,2,"ng-template",null,7,e.W1O)),2&t&&(e.xp6(4),e.Q6J("nodes",o.nodes)("options",o.treeOptions),e.xp6(4),e.Q6J("ngIf",o.data))},directives:[ne.qr,c.mk,c.O5,W.a],styles:[""]}),n})();function yn(n,s){if(1&n&&(e.ynx(0),e._UZ(1,"br"),e.TgZ(2,"span"),e.SDv(3,6),e.qZA(),e.TgZ(4,"pre"),e._uU(5),e.qZA(),e.BQk()),2&n){const t=e.oxw(2);e.xp6(5),e.Oqu(t.status)}}function xn(n,s){if(1&n&&(e.TgZ(0,"cd-alert-panel",2),e.ynx(1),e.tHW(2,3),e._UZ(3,"cd-doc",4),e.N_p(),e.BQk(),e.YNc(4,yn,6,1,"ng-container",5),e.qZA()),2&n){const t=e.oxw();e.xp6(4),e.Q6J("ngIf",t.status)}}function Zn(n,s){if(1&n&&e._UZ(0,"cd-iscsi-target-details",15),2&n){const t=e.oxw(2);e.Q6J("cephIscsiConfigVersion",t.cephIscsiConfigVersion)("selection",t.expandedRow)("settings",t.settings)}}const wn=function(n){return[n]};function Hn(n,s){if(1&n){const t=e.EpF();e.TgZ(0,"cd-table",7,8),e.NdJ("fetchData",function(){return e.CHM(t),e.oxw().getTargets()})("setExpandedRow",function(i){return e.CHM(t),e.oxw().setExpandedRow(i)})("updateSelection",function(i){return e.CHM(t),e.oxw().updateSelection(i)}),e.TgZ(2,"div",9),e._UZ(3,"cd-table-actions",10),e.TgZ(4,"button",11),e.NdJ("click",function(){return e.CHM(t),e.oxw().configureDiscoveryAuth()}),e._UZ(5,"i",12),e.ynx(6),e.SDv(7,13),e.BQk(),e.qZA()(),e.YNc(8,Zn,1,3,"cd-iscsi-target-details",14),e.qZA()}if(2&n){const t=e.oxw();e.Q6J("data",t.targets)("columns",t.columns)("hasDetails",!0)("autoReload",!1)("status",t.tableStatus),e.xp6(3),e.Q6J("permission",t.permission)("selection",t.selection)("tableActions",t.tableActions),e.xp6(2),e.Q6J("ngClass",e.VKq(10,wn,t.icons.key)),e.xp6(3),e.Q6J("ngIf",t.expandedRow)}}let kn=(()=>{class n extends Tt.o{constructor(t,o,i,_,r,l,d,u,f){super(f),this.authStorageService=t,this.iscsiService=o,this.joinPipe=i,this.taskListService=_,this.notAvailablePipe=r,this.modalService=l,this.taskWrapper=d,this.actionLabels=u,this.ngZone=f,this.available=void 0,this.selection=new Ee.r,this.targets=[],this.icons=T.P,this.builders={"iscsi/target/create":I=>({target_iqn:I.target_iqn})},this.permission=this.authStorageService.getPermissions().iscsi,this.tableActions=[{permission:"create",icon:T.P.add,routerLink:()=>"/block/iscsi/targets/create",name:this.actionLabels.CREATE},{permission:"update",icon:T.P.edit,routerLink:()=>`/block/iscsi/targets/edit/${this.selection.first().target_iqn}`,name:this.actionLabels.EDIT,disable:()=>this.getEditDisableDesc()},{permission:"delete",icon:T.P.destroy,click:()=>this.deleteIscsiTargetModal(),name:this.actionLabels.DELETE,disable:()=>this.getDeleteDisableDesc()}]}ngOnInit(){this.columns=[{name:"Target",prop:"target_iqn",flexGrow:2,cellTransformation:ve.e.executing},{name:"Portals",prop:"cdPortals",pipe:this.joinPipe,flexGrow:2},{name:"Images",prop:"cdImages",pipe:this.joinPipe,flexGrow:2},{name:"# Sessions",prop:"info.num_sessions",pipe:this.notAvailablePipe,flexGrow:1}],this.iscsiService.status().subscribe(t=>{this.available=t.available,t.available||(this.status=t.message)})}getTargets(){this.available&&(this.setTableRefreshTimeout(),this.iscsiService.version().subscribe(t=>{this.cephIscsiConfigVersion=t.ceph_iscsi_config_version}),this.taskListService.init(()=>this.iscsiService.listTargets(),t=>this.prepareResponse(t),t=>this.targets=t,()=>this.onFetchError(),this.taskFilter,this.itemFilter,this.builders),this.iscsiService.settings().subscribe(t=>{this.settings=t}))}ngOnDestroy(){this.summaryDataSubscription&&this.summaryDataSubscription.unsubscribe()}getEditDisableDesc(){const t=this.selection.first();return t&&(null==t?void 0:t.cdExecuting)?t.cdExecuting:t&&S().isUndefined(null==t?void 0:t.info)?"Unavailable gateway(s)":!t}getDeleteDisableDesc(){var t;const o=this.selection.first();return(null==o?void 0:o.cdExecuting)?o.cdExecuting:o&&S().isUndefined(null==o?void 0:o.info)?"Unavailable gateway(s)":o&&(null===(t=null==o?void 0:o.info)||void 0===t?void 0:t.num_sessions)?"Target has active sessions":!o}prepareResponse(t){return t.forEach(o=>{o.cdPortals=o.portals.map(i=>`${i.host}:${i.ip}`),o.cdImages=o.disks.map(i=>`${i.pool}/${i.image}`)}),t}onFetchError(){this.table.reset()}itemFilter(t,o){return t.target_iqn===o.metadata.target_iqn}taskFilter(t){return["iscsi/target/create","iscsi/target/edit","iscsi/target/delete"].includes(t.name)}updateSelection(t){this.selection=t}deleteIscsiTargetModal(){const t=this.selection.first().target_iqn;this.modalRef=this.modalService.show(pe.M,{itemDescription:"iSCSI target",itemNames:[t],submitActionObservable:()=>this.taskWrapper.wrapTaskAroundCall({task:new R.R("iscsi/target/delete",{target_iqn:t}),call:this.iscsiService.deleteTarget(t)})})}configureDiscoveryAuth(){this.modalService.show(Rn)}}return n.\u0275fac=function(t){return new(t||n)(e.Y36(oe.j),e.Y36(Q),e.Y36(Mn.A),e.Y36(ce.j),e.Y36(ft.g),e.Y36(de.Z),e.Y36(m.P),e.Y36(D.p4),e.Y36(e.R0b))},n.\u0275cmp=e.Xpm({type:n,selectors:[["cd-iscsi-target-list"]],viewQuery:function(t,o){if(1&t&&e.Gf(W.a,5),2&t){let i;e.iGM(i=e.CRH())&&(o.table=i.first)}},features:[e._Bn([ce.j]),e.qOj],decls:3,vars:2,consts:function(){let s,t,o,i;return s="iSCSI Targets not available",t="Please consult the " + "\ufffd#3\ufffd" + "" + "\ufffd/#3\ufffd" + " on how to configure and enable the iSCSI Targets management functionality.",o="Available information:",i="Discovery authentication",[["type","info","title",s,4,"ngIf"],["columnMode","flex","identifier","target_iqn","forceIdentifier","true","selectionType","single",3,"data","columns","hasDetails","autoReload","status","fetchData","setExpandedRow","updateSelection",4,"ngIf"],["type","info","title",s],t,["section","iscsi"],[4,"ngIf"],o,["columnMode","flex","identifier","target_iqn","forceIdentifier","true","selectionType","single",3,"data","columns","hasDetails","autoReload","status","fetchData","setExpandedRow","updateSelection"],["table",""],[1,"table-actions","btn-toolbar"],[1,"btn-group",3,"permission","selection","tableActions"],["type","button",1,"btn","btn-light",3,"click"],["aria-hidden","true",3,"ngClass"],i,["cdTableDetail","",3,"cephIscsiConfigVersion","selection","settings",4,"ngIf"],["cdTableDetail","",3,"cephIscsiConfigVersion","selection","settings"]]},template:function(t,o){1&t&&(e._UZ(0,"cd-iscsi-tabs"),e.YNc(1,xn,5,1,"cd-alert-panel",0),e.YNc(2,Hn,9,12,"cd-table",1)),2&t&&(e.xp6(1),e.Q6J("ngIf",!1===o.available),e.xp6(1),e.Q6J("ngIf",!0===o.available))},directives:[Ct,c.O5,St.G,On.K,W.a,Re.K,$.o,c.mk,Gn],styles:[""]}),n})();var nt=p(66369),qn=p(76446),Kn=p(90068);const Xn=["iscsiSparklineTpl"],Qn=["iscsiPerSecondTpl"],zn=["iscsiRelativeDateTpl"];function Jn(n,s){if(1&n&&(e.TgZ(0,"span"),e._UZ(1,"cd-sparkline",9),e.qZA()),2&n){const t=e.oxw(),o=t.value,i=t.row;e.xp6(1),e.Q6J("data",o)("isBinary",i.cdIsBinary)}}function Yn(n,s){1&n&&(e.TgZ(0,"span",10),e._uU(1," n/a "),e.qZA())}function Vn(n,s){if(1&n&&(e.YNc(0,Jn,2,2,"span",7),e.YNc(1,Yn,2,0,"span",8)),2&n){const t=s.row;e.Q6J("ngIf","user:rbd"===t.backstore),e.xp6(1),e.Q6J("ngIf","user:rbd"!==t.backstore)}}function Un(n,s){if(1&n&&(e.TgZ(0,"span"),e._uU(1),e.qZA()),2&n){const t=e.oxw().value;e.xp6(1),e.hij(" ",t," /s ")}}function jn(n,s){1&n&&(e.TgZ(0,"span",10),e._uU(1," n/a "),e.qZA())}function Wn(n,s){if(1&n&&(e.YNc(0,Un,2,1,"span",7),e.YNc(1,jn,2,0,"span",8)),2&n){const t=s.row;e.Q6J("ngIf","user:rbd"===t.backstore),e.xp6(1),e.Q6J("ngIf","user:rbd"!==t.backstore)}}function ei(n,s){if(1&n&&(e.TgZ(0,"span"),e._uU(1),e.ALo(2,"notAvailable"),e.ALo(3,"relativeDate"),e.qZA()),2&n){const t=e.oxw().value;e.xp6(1),e.hij(" ",e.lcZ(2,1,e.lcZ(3,3,t))," ")}}function ti(n,s){1&n&&(e.TgZ(0,"span",10),e._uU(1," n/a "),e.qZA())}function oi(n,s){if(1&n&&(e.YNc(0,ei,4,5,"span",7),e.YNc(1,ti,2,0,"span",8)),2&n){const t=s.row;e.Q6J("ngIf","user:rbd"===t.backstore),e.xp6(1),e.Q6J("ngIf","user:rbd"!==t.backstore)}}let ni=(()=>{class n{constructor(t,o,i){this.iscsiService=t,this.dimlessPipe=o,this.iscsiBackstorePipe=i,this.gateways=[],this.images=[]}ngOnInit(){this.gatewaysColumns=[{name:"Name",prop:"name"},{name:"State",prop:"state",flexGrow:1,cellTransformation:ve.e.badge,customTemplateConfig:{map:{up:{class:"badge-success"},down:{class:"badge-danger"}}}},{name:"# Targets",prop:"num_targets"},{name:"# Sessions",prop:"num_sessions"}],this.imagesColumns=[{name:"Pool",prop:"pool"},{name:"Image",prop:"image"},{name:"Backstore",prop:"backstore",pipe:this.iscsiBackstorePipe},{name:"Read Bytes",prop:"stats_history.rd_bytes",cellTemplate:this.iscsiSparklineTpl},{name:"Write Bytes",prop:"stats_history.wr_bytes",cellTemplate:this.iscsiSparklineTpl},{name:"Read Ops",prop:"stats.rd",pipe:this.dimlessPipe,cellTemplate:this.iscsiPerSecondTpl},{name:"Write Ops",prop:"stats.wr",pipe:this.dimlessPipe,cellTemplate:this.iscsiPerSecondTpl},{name:"A/O Since",prop:"optimized_since",cellTemplate:this.iscsiRelativeDateTpl}]}refresh(){this.iscsiService.overview().subscribe(t=>{this.gateways=t.gateways,this.images=t.images,this.images.map(o=>(o.stats_history&&(o.stats_history.rd_bytes=o.stats_history.rd_bytes.map(i=>i[1]),o.stats_history.wr_bytes=o.stats_history.wr_bytes.map(i=>i[1])),o.cdIsBinary=!0,o))})}}return n.\u0275fac=function(t){return new(t||n)(e.Y36(Q),e.Y36(nt.n),e.Y36(Je.V))},n.\u0275cmp=e.Xpm({type:n,selectors:[["cd-iscsi"]],viewQuery:function(t,o){if(1&t&&(e.Gf(Xn,7),e.Gf(Qn,7),e.Gf(zn,7)),2&t){let i;e.iGM(i=e.CRH())&&(o.iscsiSparklineTpl=i.first),e.iGM(i=e.CRH())&&(o.iscsiPerSecondTpl=i.first),e.iGM(i=e.CRH())&&(o.iscsiRelativeDateTpl=i.first)}},decls:15,vars:4,consts:function(){let s,t;return s="Gateways",t="Images",[s,[3,"data","columns","fetchData"],t,[3,"data","columns"],["iscsiSparklineTpl",""],["iscsiPerSecondTpl",""],["iscsiRelativeDateTpl",""],[4,"ngIf"],["class","text-muted",4,"ngIf"],[3,"data","isBinary"],[1,"text-muted"]]},template:function(t,o){1&t&&(e._UZ(0,"cd-iscsi-tabs"),e.TgZ(1,"legend"),e.SDv(2,0),e.qZA(),e.TgZ(3,"div")(4,"cd-table",1),e.NdJ("fetchData",function(){return o.refresh()}),e.qZA()(),e.TgZ(5,"legend"),e.SDv(6,2),e.qZA(),e.TgZ(7,"div"),e._UZ(8,"cd-table",3),e.qZA(),e.YNc(9,Vn,2,2,"ng-template",null,4,e.W1O),e.YNc(11,Wn,2,2,"ng-template",null,5,e.W1O),e.YNc(13,oi,2,2,"ng-template",null,6,e.W1O)),2&t&&(e.xp6(4),e.Q6J("data",o.gateways)("columns",o.gatewaysColumns),e.xp6(4),e.Q6J("data",o.images)("columns",o.imagesColumns))},directives:[Ct,W.a,c.O5,qn.l],pipes:[ft.g,Kn.h],styles:[""]}),n})(),ii=(()=>{class n{}return n.\u0275fac=function(t){return new(t||n)},n.\u0275mod=e.oAB({type:n}),n.\u0275inj=e.cJS({imports:[[c.ez,Ae.m,v.Oz,g.Bz,a.u5,a.UX,v.ZQ,v.HK]]}),n})();var si=p(13464),_i=p(26215),ai=p(45435),Et=p(36848);let K=class{constructor(s,t){this.http=s,this.timerService=t,this.REFRESH_INTERVAL=3e4,this.summaryDataSource=new _i.X(null),this.summaryData$=this.summaryDataSource.asObservable()}startPolling(){return this.timerService.get(()=>this.retrieveSummaryObservable(),this.REFRESH_INTERVAL).subscribe(this.retrieveSummaryObserver())}refresh(){return this.retrieveSummaryObservable().subscribe(this.retrieveSummaryObserver())}retrieveSummaryObservable(){return this.http.get("api/block/mirroring/summary")}retrieveSummaryObserver(){return s=>{this.summaryDataSource.next(s)}}subscribeSummary(s,t){return this.summaryData$.pipe((0,ai.h)(o=>!!o)).subscribe(s,t)}getPool(s){return this.http.get(`api/block/mirroring/pool/${s}`)}updatePool(s,t){return this.http.put(`api/block/mirroring/pool/${s}`,t,{observe:"response"})}getSiteName(){return this.http.get("api/block/mirroring/site_name")}setSiteName(s){return this.http.put("api/block/mirroring/site_name",{site_name:s},{observe:"response"})}createBootstrapToken(s){return this.http.post(`api/block/mirroring/pool/${s}/bootstrap/token`,{})}importBootstrapToken(s,t,o){return this.http.post(`api/block/mirroring/pool/${s}/bootstrap/peer`,{direction:t,token:o},{observe:"response"})}getPeer(s,t){return this.http.get(`api/block/mirroring/pool/${s}/peer/${t}`)}getPeerForPool(s){return this.http.get(`api/block/mirroring/pool/${s}/peer`)}addPeer(s,t){return this.http.post(`api/block/mirroring/pool/${s}/peer`,t,{observe:"response"})}updatePeer(s,t,o){return this.http.put(`api/block/mirroring/pool/${s}/peer/${t}`,o,{observe:"response"})}deletePeer(s,t){return this.http.delete(`api/block/mirroring/pool/${s}/peer/${t}`,{observe:"response"})}};K.\u0275fac=function(s){return new(s||K)(e.LFG(ie.eN),e.LFG(Et.f))},K.\u0275prov=e.Yz7({token:K,factory:K.\u0275fac,providedIn:"root"}),(0,F.gn)([(0,F.fM)(0,Y.G),(0,F.w6)("design:type",Function),(0,F.w6)("design:paramtypes",[String]),(0,F.w6)("design:returntype",void 0)],K.prototype,"setSiteName",null),(0,F.gn)([(0,F.fM)(1,Y.G),(0,F.fM)(2,Y.G),(0,F.w6)("design:type",Function),(0,F.w6)("design:paramtypes",[String,String,String]),(0,F.w6)("design:returntype",void 0)],K.prototype,"importBootstrapToken",null),K=(0,F.gn)([Y.o,(0,F.w6)("design:paramtypes",[ie.eN,Et.f])],K);var it=p(6481),ri=p(68307),Rt=p(12627),Me=p(82945),li=p(39749),ci=p(13472);function di(n,s){1&n&&(e.TgZ(0,"span",25),e.SDv(1,26),e.qZA())}function pi(n,s){if(1&n&&(e.TgZ(0,"div",27),e._UZ(1,"input",28),e.TgZ(2,"label",29),e._uU(3),e.qZA()()),2&n){const t=s.$implicit;e.xp6(1),e.s9C("id",t.name),e.s9C("name",t.name),e.s9C("formControlName",t.name),e.xp6(1),e.s9C("for",t.name),e.xp6(1),e.Oqu(t.name)}}function ui(n,s){1&n&&(e.TgZ(0,"span",25),e.SDv(1,30),e.qZA())}let mi=(()=>{class n{constructor(t,o,i){this.activeModal=t,this.rbdMirroringService=o,this.taskWrapper=i,this.pools=[],this.createForm()}createForm(){this.createBootstrapForm=new Z.d({siteName:new a.NI("",{validators:[a.kI.required]}),pools:new a.cw({},{validators:[this.validatePools()]}),token:new a.NI("",{})})}ngOnInit(){this.createBootstrapForm.get("siteName").setValue(this.siteName),this.rbdMirroringService.getSiteName().subscribe(t=>{this.createBootstrapForm.get("siteName").setValue(t.site_name)}),this.subs=this.rbdMirroringService.subscribeSummary(t=>{this.pools=t.content_data.pools.reduce((_,r)=>(_.push({name:r.name,mirror_mode:r.mirror_mode}),_),[]);const i=this.createBootstrapForm.get("pools");S().each(this.pools,_=>{const r=_.name,l="disabled"===_.mirror_mode,d=i.controls[r];d?l&&d.disabled?d.enable():!l&&d.enabled&&(d.disable(),d.setValue(!0)):i.addControl(r,new a.NI({value:!l,disabled:!l}))})})}ngOnDestroy(){this.subs&&this.subs.unsubscribe()}validatePools(){return t=>{let o=0;return S().each(t.controls,i=>{!0===i.value&&++o}),o>0?null:{requirePool:!0}}}generate(){this.createBootstrapForm.get("token").setValue("");let t="";const o=[],i=this.createBootstrapForm.get("pools");S().each(i.controls,(u,f)=>{!0===u.value&&(t=f,u.disabled||o.push(f))});const _={mirror_mode:"image"},r=(0,it.z)(this.rbdMirroringService.setSiteName(this.createBootstrapForm.getValue("siteName")),(0,le.D)(o.map(u=>this.rbdMirroringService.updatePool(u,_))),this.rbdMirroringService.createBootstrapToken(t).pipe((0,ri.b)(u=>this.createBootstrapForm.get("token").setValue(u.token)))).pipe((0,Rt.Z)()),l=()=>{this.rbdMirroringService.refresh(),this.createBootstrapForm.setErrors({cdSubmitButton:!0})};this.taskWrapper.wrapTaskAroundCall({task:new R.R("rbd/mirroring/bootstrap/create",{}),call:r}).subscribe({error:l,complete:l})}}return n.\u0275fac=function(t){return new(t||n)(e.Y36(v.Kz),e.Y36(K),e.Y36(m.P))},n.\u0275cmp=e.Xpm({type:n,selectors:[["cd-bootstrap-create-modal"]],decls:32,vars:6,consts:function(){let s,t,o,i,_,r,l,d,u,f,I;return s="Create Bootstrap Token",t="To create a bootstrap token which can be imported by a peer site cluster, provide the local site's name, select which pools will have mirroring enabled, and click\xA0 " + "\ufffd#10\ufffd" + "Generate" + "\ufffd/#10\ufffd" + ".",o="Site Name",i="Name...",_="Pools",r="Generate",l="Token",d="Generated token...",u="Close",f="This field is required.",I="At least one pool is required.",[[3,"modalRef"],[1,"modal-title"],s,[1,"modal-content"],["name","createBootstrapForm","novalidate","",1,"form",3,"formGroup"],["formDir","ngForm"],[1,"modal-body"],t,[1,"form-group"],["for","siteName",1,"col-form-label","required"],o,["type","text","placeholder",i,"id","siteName","name","siteName","formControlName","siteName","autofocus","",1,"form-control"],["class","invalid-feedback",4,"ngIf"],["formGroupName","pools",1,"form-group"],["for","pools",1,"col-form-label","required"],_,["class","custom-control custom-checkbox",4,"ngFor","ngForOf"],[1,"mb-4","float-end",3,"form","submitAction"],r,["for","token",1,"col-form-label"],l,["placeholder",d,"id","token","formControlName","token","readonly","",1,"form-control","resize-vertical"],["source","token",1,"float-end"],[1,"modal-footer"],["name",u,3,"backAction"],[1,"invalid-feedback"],f,[1,"custom-control","custom-checkbox"],["type","checkbox",1,"custom-control-input",3,"id","name","formControlName"],[1,"custom-control-label",3,"for"],I]},template:function(t,o){if(1&t&&(e.TgZ(0,"cd-modal",0),e.ynx(1,1),e.SDv(2,2),e.BQk(),e.ynx(3,3),e.TgZ(4,"form",4,5)(6,"div",6)(7,"p"),e.ynx(8),e.tHW(9,7),e._UZ(10,"kbd"),e.N_p(),e.BQk(),e.qZA(),e.TgZ(11,"div",8)(12,"label",9),e.SDv(13,10),e.qZA(),e._UZ(14,"input",11),e.YNc(15,di,2,0,"span",12),e.qZA(),e.TgZ(16,"div",13)(17,"label",14),e.SDv(18,15),e.qZA(),e.YNc(19,pi,4,5,"div",16),e.YNc(20,ui,2,0,"span",12),e.qZA(),e.TgZ(21,"cd-submit-button",17),e.NdJ("submitAction",function(){return o.generate()}),e.SDv(22,18),e.qZA(),e.TgZ(23,"div",8)(24,"label",19)(25,"span"),e.SDv(26,20),e.qZA()(),e.TgZ(27,"textarea",21),e._uU(28,"          "),e.qZA()(),e._UZ(29,"cd-copy-2-clipboard-button",22),e.qZA(),e.TgZ(30,"div",23)(31,"cd-back-button",24),e.NdJ("backAction",function(){return o.activeModal.close()}),e.qZA()()(),e.BQk(),e.qZA()),2&t){const i=e.MAs(5);e.Q6J("modalRef",o.activeModal),e.xp6(4),e.Q6J("formGroup",o.createBootstrapForm),e.xp6(11),e.Q6J("ngIf",o.createBootstrapForm.showError("siteName",i,"required")),e.xp6(4),e.Q6J("ngForOf",o.pools),e.xp6(1),e.Q6J("ngIf",o.createBootstrapForm.showError("pools",i,"requirePool")),e.xp6(1),e.Q6J("form",o.createBootstrapForm)}},directives:[C.z,a._Y,a.JL,A.V,a.sg,O.P,$.o,a.Fj,X.b,a.JJ,a.u,Me.U,c.O5,a.x0,c.sg,a.Wl,li.w,Ye.s,ci.W],styles:[".form-group.ng-invalid[_ngcontent-%COMP%]   .invalid-feedback[_ngcontent-%COMP%]{display:block}"]}),n})();function gi(n,s){1&n&&(e.TgZ(0,"span",26),e.SDv(1,27),e.qZA())}function Ti(n,s){if(1&n&&(e.TgZ(0,"option",28),e._uU(1),e.qZA()),2&n){const t=s.$implicit;e.Q6J("value",t.key),e.xp6(1),e.Oqu(t.desc)}}function fi(n,s){if(1&n&&(e.TgZ(0,"div",29),e._UZ(1,"input",30),e.TgZ(2,"label",31),e._uU(3),e.qZA()()),2&n){const t=s.$implicit;e.xp6(1),e.s9C("id",t.name),e.s9C("name",t.name),e.s9C("formControlName",t.name),e.xp6(1),e.s9C("for",t.name),e.xp6(1),e.Oqu(t.name)}}function Ci(n,s){1&n&&(e.TgZ(0,"span",26),e.SDv(1,32),e.qZA())}function Si(n,s){1&n&&(e.TgZ(0,"span",26),e.SDv(1,33),e.qZA())}function Ei(n,s){1&n&&(e.TgZ(0,"span",26),e.SDv(1,34),e.qZA())}let Ri=(()=>{class n{constructor(t,o,i,_){this.activeModal=t,this.actionLabels=o,this.rbdMirroringService=i,this.taskWrapper=_,this.pools=[],this.directions=[{key:"rx-tx",desc:"Bidirectional"},{key:"rx",desc:"Unidirectional (receive-only)"}],this.createForm()}createForm(){this.importBootstrapForm=new Z.d({siteName:new a.NI("",{validators:[a.kI.required]}),direction:new a.NI("rx-tx",{}),pools:new a.cw({},{validators:[this.validatePools()]}),token:new a.NI("",{validators:[a.kI.required,this.validateToken()]})})}ngOnInit(){this.rbdMirroringService.getSiteName().subscribe(t=>{this.importBootstrapForm.get("siteName").setValue(t.site_name)}),this.subs=this.rbdMirroringService.subscribeSummary(t=>{this.pools=t.content_data.pools.reduce((_,r)=>(_.push({name:r.name,mirror_mode:r.mirror_mode}),_),[]);const i=this.importBootstrapForm.get("pools");S().each(this.pools,_=>{const r=_.name,l="disabled"===_.mirror_mode,d=i.controls[r];d?l&&d.disabled?d.enable():!l&&d.enabled&&(d.disable(),d.setValue(!0)):i.addControl(r,new a.NI({value:!l,disabled:!l}))})})}ngOnDestroy(){this.subs&&this.subs.unsubscribe()}validatePools(){return t=>{let o=0;return S().each(t.controls,i=>{!0===i.value&&++o}),o>0?null:{requirePool:!0}}}validateToken(){return t=>{try{if(JSON.parse(atob(t.value)))return null}catch(o){}return{invalidToken:!0}}}import(){const t=[],o=[],i=this.importBootstrapForm.get("pools");S().each(i.controls,(u,f)=>{!0===u.value&&(t.push(f),u.disabled||o.push(f))});const _={mirror_mode:"image"};let r=(0,it.z)(this.rbdMirroringService.setSiteName(this.importBootstrapForm.getValue("siteName")),(0,le.D)(o.map(u=>this.rbdMirroringService.updatePool(u,_))));r=t.reduce((u,f)=>(0,it.z)(u,this.rbdMirroringService.importBootstrapToken(f,this.importBootstrapForm.getValue("direction"),this.importBootstrapForm.getValue("token"))),r).pipe((0,Rt.Z)());const l=()=>{this.rbdMirroringService.refresh(),this.importBootstrapForm.setErrors({cdSubmitButton:!0})};this.taskWrapper.wrapTaskAroundCall({task:new R.R("rbd/mirroring/bootstrap/import",{}),call:r}).subscribe({error:l,complete:()=>{l(),this.activeModal.close()}})}}return n.\u0275fac=function(t){return new(t||n)(e.Y36(v.Kz),e.Y36(D.p4),e.Y36(K),e.Y36(m.P))},n.\u0275cmp=e.Xpm({type:n,selectors:[["cd-bootstrap-import-modal"]],decls:36,vars:10,consts:function(){let s,t,o,i,_,r,l,d,u,f,I,P;return s="Import Bootstrap Token",t="To import a bootstrap token which was created by a peer site cluster, provide the local site's name, select which pools will have mirroring enabled, provide the generated token, and click\xA0" + "\ufffd#10\ufffd" + "Import" + "\ufffd/#10\ufffd" + ".",o="Site Name",i="Name...",_="Direction",r="Pools",l="Token",d="Generated token...",u="This field is required.",f="At least one pool is required.",I="This field is required.",P="The token is invalid.",[[3,"modalRef"],[1,"modal-title"],s,[1,"modal-content"],["name","importBootstrapForm","novalidate","",1,"form",3,"formGroup"],["formDir","ngForm"],[1,"modal-body"],t,[1,"form-group"],["for","siteName",1,"col-form-label","required"],o,["type","text","placeholder",i,"id","siteName","name","siteName","formControlName","siteName","autofocus","",1,"form-control"],["class","invalid-feedback",4,"ngIf"],["for","direction",1,"col-form-label"],_,["id","direction","name","direction","formControlName","direction",1,"form-control"],[3,"value",4,"ngFor","ngForOf"],["formGroupName","pools",1,"form-group"],["for","pools",1,"col-form-label","required"],r,["class","custom-control custom-checkbox",4,"ngFor","ngForOf"],["for","token",1,"col-form-label","required"],l,["placeholder",d,"id","token","formControlName","token",1,"form-control","resize-vertical"],[1,"modal-footer"],[3,"form","submitText","submitActionEvent"],[1,"invalid-feedback"],u,[3,"value"],[1,"custom-control","custom-checkbox"],["type","checkbox",1,"custom-control-input",3,"id","name","formControlName"],[1,"custom-control-label",3,"for"],f,I,P]},template:function(t,o){if(1&t&&(e.TgZ(0,"cd-modal",0),e.ynx(1,1),e.SDv(2,2),e.BQk(),e.ynx(3,3),e.TgZ(4,"form",4,5)(6,"div",6)(7,"p"),e.ynx(8),e.tHW(9,7),e._UZ(10,"kbd"),e.N_p(),e.BQk(),e.qZA(),e.TgZ(11,"div",8)(12,"label",9),e.SDv(13,10),e.qZA(),e._UZ(14,"input",11),e.YNc(15,gi,2,0,"span",12),e.qZA(),e.TgZ(16,"div",8)(17,"label",13)(18,"span"),e.SDv(19,14),e.qZA()(),e.TgZ(20,"select",15),e.YNc(21,Ti,2,2,"option",16),e.qZA()(),e.TgZ(22,"div",17)(23,"label",18),e.SDv(24,19),e.qZA(),e.YNc(25,fi,4,5,"div",20),e.YNc(26,Ci,2,0,"span",12),e.qZA(),e.TgZ(27,"div",8)(28,"label",21),e.SDv(29,22),e.qZA(),e.TgZ(30,"textarea",23),e._uU(31,"          "),e.qZA(),e.YNc(32,Si,2,0,"span",12),e.YNc(33,Ei,2,0,"span",12),e.qZA()(),e.TgZ(34,"div",24)(35,"cd-form-button-panel",25),e.NdJ("submitActionEvent",function(){return o.import()}),e.qZA()()(),e.BQk(),e.qZA()),2&t){const i=e.MAs(5);e.Q6J("modalRef",o.activeModal),e.xp6(4),e.Q6J("formGroup",o.importBootstrapForm),e.xp6(11),e.Q6J("ngIf",o.importBootstrapForm.showError("siteName",i,"required")),e.xp6(6),e.Q6J("ngForOf",o.directions),e.xp6(4),e.Q6J("ngForOf",o.pools),e.xp6(1),e.Q6J("ngIf",o.importBootstrapForm.showError("pools",i,"requirePool")),e.xp6(6),e.Q6J("ngIf",o.importBootstrapForm.showError("token",i,"required")),e.xp6(1),e.Q6J("ngIf",o.importBootstrapForm.showError("token",i,"invalidToken")),e.xp6(2),e.Q6J("form",o.importBootstrapForm)("submitText",o.actionLabels.SUBMIT)}},directives:[C.z,a._Y,a.JL,A.V,a.sg,O.P,$.o,a.Fj,X.b,a.JJ,a.u,Me.U,c.O5,a.EJ,c.sg,a.YN,a.Kr,a.x0,a.Wl,j.p],styles:[""]}),n})();var se=p(69158),Mi=p(58111);let st=(()=>{class n{transform(t){return"warning"===t?"badge badge-warning":"error"===t?"badge badge-danger":"success"===t?"badge badge-success":"badge badge-info"}}return n.\u0275fac=function(t){return new(t||n)},n.\u0275pipe=e.Yjl({name:"mirrorHealthColor",type:n,pure:!0}),n})();const Oi=["healthTmpl"];function hi(n,s){if(1&n&&(e.TgZ(0,"span",2),e.ALo(1,"mirrorHealthColor"),e._uU(2),e.qZA()),2&n){const o=s.value;e.Q6J("ngClass",e.lcZ(1,2,s.row.health_color)),e.xp6(2),e.Oqu(o)}}let Ai=(()=>{class n{constructor(t,o){this.rbdMirroringService=t,this.cephShortVersionPipe=o,this.tableStatus=new se.E}ngOnInit(){this.columns=[{prop:"instance_id",name:"Instance",flexGrow:2},{prop:"id",name:"ID",flexGrow:2},{prop:"server_hostname",name:"Hostname",flexGrow:2},{prop:"version",name:"Version",pipe:this.cephShortVersionPipe,flexGrow:2},{prop:"health",name:"Health",cellTemplate:this.healthTmpl,flexGrow:1}],this.subs=this.rbdMirroringService.subscribeSummary(t=>{this.data=t.content_data.daemons,this.tableStatus=new se.E(t.status)})}ngOnDestroy(){this.subs.unsubscribe()}refresh(){this.rbdMirroringService.refresh()}}return n.\u0275fac=function(t){return new(t||n)(e.Y36(K),e.Y36(Mi.F))},n.\u0275cmp=e.Xpm({type:n,selectors:[["cd-mirroring-daemons"]],viewQuery:function(t,o){if(1&t&&e.Gf(Oi,7),2&t){let i;e.iGM(i=e.CRH())&&(o.healthTmpl=i.first)}},decls:3,vars:4,consts:[["columnMode","flex",3,"data","columns","autoReload","status","fetchData"],["healthTmpl",""],[3,"ngClass"]],template:function(t,o){1&t&&(e.TgZ(0,"cd-table",0),e.NdJ("fetchData",function(){return o.refresh()}),e.qZA(),e.YNc(1,hi,3,4,"ng-template",null,1,e.W1O)),2&t&&e.Q6J("data",o.data)("columns",o.columns)("autoReload",-1)("status",o.tableStatus)},directives:[W.a,c.mk],pipes:[st],styles:[""]}),n})();var Mt=p(70882);class Pi{}function Ii(n,s){1&n&&(e.TgZ(0,"span",24),e.SDv(1,25),e.qZA())}function bi(n,s){1&n&&(e.TgZ(0,"span",24),e.SDv(1,26),e.qZA())}function Ni(n,s){1&n&&(e.TgZ(0,"span",24),e.SDv(1,27),e.qZA())}function Fi(n,s){1&n&&(e.TgZ(0,"span",24),e.SDv(1,28),e.qZA())}function Di(n,s){1&n&&(e.TgZ(0,"span",24),e.SDv(1,29),e.qZA())}function vi(n,s){1&n&&(e.TgZ(0,"span",24),e.SDv(1,30),e.qZA())}let Li=(()=>{class n{constructor(t,o,i,_){this.activeModal=t,this.actionLabels=o,this.rbdMirroringService=i,this.taskWrapper=_,this.bsConfig={containerClass:"theme-default"},this.createForm()}createForm(){this.editPeerForm=new Z.d({clusterName:new a.NI("",{validators:[a.kI.required,this.validateClusterName]}),clientID:new a.NI("",{validators:[a.kI.required,this.validateClientID]}),monAddr:new a.NI("",{validators:[this.validateMonAddr]}),key:new a.NI("",{validators:[this.validateKey]})})}ngOnInit(){this.pattern=`${this.poolName}/${this.peerUUID}`,"edit"===this.mode&&this.rbdMirroringService.getPeer(this.poolName,this.peerUUID).subscribe(t=>{this.setResponse(t)})}validateClusterName(t){if(!t.value.match(/^[\w\-_]*$/))return{invalidClusterName:{value:t.value}}}validateClientID(t){if(!t.value.match(/^(?!client\.)[\w\-_.]*$/))return{invalidClientID:{value:t.value}}}validateMonAddr(t){if(!t.value.match(/^[,; ]*([\w.\-_\[\]]+(:[\d]+)?[,; ]*)*$/))return{invalidMonAddr:{value:t.value}}}validateKey(t){try{if(""===t.value||atob(t.value))return null}catch(o){}return{invalidKey:{value:t.value}}}setResponse(t){this.response=t,this.editPeerForm.get("clusterName").setValue(t.cluster_name),this.editPeerForm.get("clientID").setValue(t.client_id),this.editPeerForm.get("monAddr").setValue(t.mon_host),this.editPeerForm.get("key").setValue(t.key)}update(){const t=new Pi;let o;t.cluster_name=this.editPeerForm.getValue("clusterName"),t.client_id=this.editPeerForm.getValue("clientID"),t.mon_host=this.editPeerForm.getValue("monAddr"),t.key=this.editPeerForm.getValue("key"),o=this.taskWrapper.wrapTaskAroundCall("edit"===this.mode?{task:new R.R("rbd/mirroring/peer/edit",{pool_name:this.poolName}),call:this.rbdMirroringService.updatePeer(this.poolName,this.peerUUID,t)}:{task:new R.R("rbd/mirroring/peer/add",{pool_name:this.poolName}),call:this.rbdMirroringService.addPeer(this.poolName,t)}),o.subscribe({error:()=>this.editPeerForm.setErrors({cdSubmitButton:!0}),complete:()=>{this.rbdMirroringService.refresh(),this.activeModal.close()}})}}return n.\u0275fac=function(t){return new(t||n)(e.Y36(v.Kz),e.Y36(D.p4),e.Y36(K),e.Y36(m.P))},n.\u0275cmp=e.Xpm({type:n,selectors:[["cd-pool-edit-peer-modal"]],decls:38,vars:13,consts:function(){let s,t,o,i,_,r,l,d,u,f,I,P,B,x,q,J,ee,te;return s="{VAR_SELECT, select, edit {Edit} other {Add}}",s=e.Zx4(s,{VAR_SELECT:"\ufffd0\ufffd"}),t="" + s + " pool mirror peer",o="{VAR_SELECT, select, edit {Edit} other {Add}}",o=e.Zx4(o,{VAR_SELECT:"\ufffd0\ufffd"}),i="" + o + " the pool mirror peer attributes for pool " + "[\ufffd#10\ufffd|\ufffd#11\ufffd]" + "" + "\ufffd1\ufffd" + "" + "[\ufffd/#10\ufffd|\ufffd/#11\ufffd]" + " and click " + "[\ufffd#10\ufffd|\ufffd#11\ufffd]" + "Submit" + "[\ufffd/#10\ufffd|\ufffd/#11\ufffd]" + ".",i=e.Zx4(i),_="Cluster Name",r="Name...",l="CephX ID",d="CephX ID...",u="Monitor Addresses",f="Comma-delimited addresses...",I="CephX Key",P="Base64-encoded key...",B="This field is required.",x="The cluster name is not valid.",q="This field is required.",J="The CephX ID is not valid.",ee="The monitory address is not valid.",te="CephX key must be base64 encoded.",[[3,"modalRef"],[1,"modal-title"],t,[1,"modal-content"],["name","editPeerForm","novalidate","",1,"form",3,"formGroup"],["formDir","ngForm"],[1,"modal-body"],i,[1,"form-group"],["for","clusterName",1,"col-form-label","required"],_,["type","text","placeholder",r,"id","clusterName","name","clusterName","formControlName","clusterName","autofocus","",1,"form-control"],["class","invalid-feedback",4,"ngIf"],["for","clientID",1,"col-form-label","required"],l,["type","text","placeholder",d,"id","clientID","name","clientID","formControlName","clientID",1,"form-control"],["for","monAddr",1,"col-form-label"],u,["type","text","placeholder",f,"id","monAddr","name","monAddr","formControlName","monAddr",1,"form-control"],["for","key",1,"col-form-label"],I,["type","text","placeholder",P,"id","key","name","key","formControlName","key",1,"form-control"],[1,"modal-footer"],[3,"form","submitText","submitActionEvent"],[1,"invalid-feedback"],B,x,q,J,ee,te]},template:function(t,o){if(1&t&&(e.TgZ(0,"cd-modal",0)(1,"span",1),e.SDv(2,2),e.qZA(),e.ynx(3,3),e.TgZ(4,"form",4,5)(6,"div",6)(7,"p")(8,"span"),e.tHW(9,7),e._UZ(10,"kbd")(11,"kbd"),e.N_p(),e.qZA()(),e.TgZ(12,"div",8)(13,"label",9),e.SDv(14,10),e.qZA(),e._UZ(15,"input",11),e.YNc(16,Ii,2,0,"span",12),e.YNc(17,bi,2,0,"span",12),e.qZA(),e.TgZ(18,"div",8)(19,"label",13),e.SDv(20,14),e.qZA(),e._UZ(21,"input",15),e.YNc(22,Ni,2,0,"span",12),e.YNc(23,Fi,2,0,"span",12),e.qZA(),e.TgZ(24,"div",8)(25,"label",16)(26,"span"),e.SDv(27,17),e.qZA()(),e._UZ(28,"input",18),e.YNc(29,Di,2,0,"span",12),e.qZA(),e.TgZ(30,"div",8)(31,"label",19)(32,"span"),e.SDv(33,20),e.qZA()(),e._UZ(34,"input",21),e.YNc(35,vi,2,0,"span",12),e.qZA()(),e.TgZ(36,"div",22)(37,"cd-form-button-panel",23),e.NdJ("submitActionEvent",function(){return o.update()}),e.qZA()()(),e.BQk(),e.qZA()),2&t){const i=e.MAs(5);e.Q6J("modalRef",o.activeModal),e.xp6(2),e.pQV(o.mode),e.QtT(2),e.xp6(2),e.Q6J("formGroup",o.editPeerForm),e.xp6(7),e.pQV(o.mode)(o.poolName),e.QtT(9),e.xp6(5),e.Q6J("ngIf",o.editPeerForm.showError("clusterName",i,"required")),e.xp6(1),e.Q6J("ngIf",o.editPeerForm.showError("clusterName",i,"invalidClusterName")),e.xp6(5),e.Q6J("ngIf",o.editPeerForm.showError("clientID",i,"required")),e.xp6(1),e.Q6J("ngIf",o.editPeerForm.showError("clientID",i,"invalidClientID")),e.xp6(6),e.Q6J("ngIf",o.editPeerForm.showError("monAddr",i,"invalidMonAddr")),e.xp6(6),e.Q6J("ngIf",o.editPeerForm.showError("key",i,"invalidKey")),e.xp6(2),e.Q6J("form",o.editPeerForm)("submitText",o.actionLabels.SUBMIT)}},directives:[C.z,a._Y,a.JL,A.V,a.sg,O.P,$.o,a.Fj,X.b,a.JJ,a.u,Me.U,c.O5,j.p],styles:[""]}),n})();const $i=["healthTmpl"],Bi=["localTmpl"],Gi=["remoteTmpl"];function yi(n,s){if(1&n&&(e.TgZ(0,"span",6),e.ALo(1,"mirrorHealthColor"),e._uU(2),e.qZA()),2&n){const o=s.value;e.Q6J("ngClass",e.lcZ(1,2,s.row.health_color)),e.xp6(2),e.Oqu(o)}}function xi(n,s){1&n&&(e.TgZ(0,"span",7),e.SDv(1,8),e.qZA())}function Zi(n,s){1&n&&(e.TgZ(0,"span",9),e.SDv(1,10),e.qZA())}let Hi=(()=>{class n{constructor(t,o,i,_,r){this.authStorageService=t,this.rbdMirroringService=o,this.modalService=i,this.taskWrapper=_,this.router=r,this.selection=new Ee.r,this.tableStatus=new se.E,this.data=[],this.permission=this.authStorageService.getPermissions().rbdMirroring;const l={permission:"update",icon:T.P.edit,click:()=>this.editModeModal(),name:"Edit Mode",canBePrimary:()=>!0},d={permission:"create",icon:T.P.add,name:"Add Peer",click:()=>this.editPeersModal("add"),disable:()=>!this.selection.first()||"disabled"===this.selection.first().mirror_mode,visible:()=>!this.getPeerUUID(),canBePrimary:()=>!1},u={permission:"update",icon:T.P.exchange,name:"Edit Peer",click:()=>this.editPeersModal("edit"),visible:()=>!!this.getPeerUUID()},f={permission:"delete",icon:T.P.destroy,name:"Delete Peer",click:()=>this.deletePeersModal(),visible:()=>!!this.getPeerUUID()};this.tableActions=[l,d,u,f]}ngOnInit(){this.columns=[{prop:"name",name:"Name",flexGrow:2},{prop:"mirror_mode",name:"Mode",flexGrow:2},{prop:"leader_id",name:"Leader",flexGrow:2},{prop:"image_local_count",name:"# Local",headerTemplate:this.localTmpl,flexGrow:2},{prop:"image_remote_count",name:"# Remote",headerTemplate:this.remoteTmpl,flexGrow:2},{prop:"health",name:"Health",cellTemplate:this.healthTmpl,flexGrow:1}],this.subs=this.rbdMirroringService.subscribeSummary(t=>{this.data=t.content_data.pools,this.tableStatus=new se.E(t.status)})}ngOnDestroy(){this.subs.unsubscribe()}refresh(){this.rbdMirroringService.refresh()}editModeModal(){this.router.navigate(["/block/mirroring",{outlets:{modal:[D.MQ.EDIT,this.selection.first().name]}}])}editPeersModal(t){const o={poolName:this.selection.first().name,mode:t};"edit"===t&&(o.peerUUID=this.getPeerUUID()),this.modalRef=this.modalService.show(Li,o)}deletePeersModal(){const t=this.selection.first().name,o=this.getPeerUUID();this.modalRef=this.modalService.show(pe.M,{itemDescription:"mirror peer",itemNames:[`${t} (${o})`],submitActionObservable:()=>new Mt.y(i=>{this.taskWrapper.wrapTaskAroundCall({task:new R.R("rbd/mirroring/peer/delete",{pool_name:t}),call:this.rbdMirroringService.deletePeer(t,o)}).subscribe({error:_=>i.error(_),complete:()=>{this.rbdMirroringService.refresh(),i.complete()}})})})}getPeerUUID(){const t=this.selection.first(),o=this.data.find(i=>t&&t.name===i.name);if(o&&o.peer_uuids)return o.peer_uuids[0]}updateSelection(t){this.selection=t}}return n.\u0275fac=function(t){return new(t||n)(e.Y36(oe.j),e.Y36(K),e.Y36(de.Z),e.Y36(m.P),e.Y36(g.F0))},n.\u0275cmp=e.Xpm({type:n,selectors:[["cd-mirroring-pools"]],viewQuery:function(t,o){if(1&t&&(e.Gf($i,7),e.Gf(Bi,7),e.Gf(Gi,7)),2&t){let i;e.iGM(i=e.CRH())&&(o.healthTmpl=i.first),e.iGM(i=e.CRH())&&(o.localTmpl=i.first),e.iGM(i=e.CRH())&&(o.remoteTmpl=i.first)}},decls:9,vars:7,consts:function(){let s,t,o,i;return s="Local image count",t="# Local",o="Remote image count",i="# Remote",[["columnMode","flex","identifier","name","forceIdentifier","true","selectionType","single",3,"data","columns","autoReload","status","fetchData","updateSelection"],[1,"table-actions",3,"permission","selection","tableActions"],["healthTmpl",""],["localTmpl",""],["remoteTmpl",""],["name","modal"],[3,"ngClass"],["ngbTooltip",s],t,["ngbTooltip",o],i]},template:function(t,o){1&t&&(e.TgZ(0,"cd-table",0),e.NdJ("fetchData",function(){return o.refresh()})("updateSelection",function(_){return o.updateSelection(_)}),e._UZ(1,"cd-table-actions",1),e.qZA(),e.YNc(2,yi,3,4,"ng-template",null,2,e.W1O),e.YNc(4,xi,2,0,"ng-template",null,3,e.W1O),e.YNc(6,Zi,2,0,"ng-template",null,4,e.W1O),e._UZ(8,"router-outlet",5)),2&t&&(e.Q6J("data",o.data)("columns",o.columns)("autoReload",-1)("status",o.tableStatus),e.xp6(1),e.Q6J("permission",o.permission)("selection",o.selection)("tableActions",o.tableActions))},directives:[W.a,Re.K,c.mk,v._L,g.lC],pipes:[st],styles:[""]}),n})();var Ot=p(59376);const ki=["stateTmpl"],qi=["syncTmpl"],Ki=["progressTmpl"];function Xi(n,s){if(1&n){const t=e.EpF();e.TgZ(0,"cd-table",13),e.NdJ("fetchData",function(){return e.CHM(t),e.oxw().refresh()}),e.qZA()}if(2&n){const t=e.oxw();e.Q6J("data",t.image_error.data)("columns",t.image_error.columns)("autoReload",-1)("status",t.tableStatus)}}function Qi(n,s){if(1&n){const t=e.EpF();e.TgZ(0,"cd-table",13),e.NdJ("fetchData",function(){return e.CHM(t),e.oxw().refresh()}),e.qZA()}if(2&n){const t=e.oxw();e.Q6J("data",t.image_syncing.data)("columns",t.image_syncing.columns)("autoReload",-1)("status",t.tableStatus)}}function zi(n,s){if(1&n){const t=e.EpF();e.TgZ(0,"cd-table",13),e.NdJ("fetchData",function(){return e.CHM(t),e.oxw().refresh()}),e.qZA()}if(2&n){const t=e.oxw();e.Q6J("data",t.image_ready.data)("columns",t.image_ready.columns)("autoReload",-1)("status",t.tableStatus)}}function Ji(n,s){if(1&n&&(e.TgZ(0,"span",14),e.ALo(1,"mirrorHealthColor"),e._uU(2),e.qZA()),2&n){const o=s.value;e.Q6J("ngClass",e.lcZ(1,2,s.row.state_color)),e.xp6(2),e.Oqu(o)}}function Yi(n,s){1&n&&e._UZ(0,"div")}function Vi(n,s){if(1&n&&e._UZ(0,"ngb-progressbar",17),2&n){const t=e.oxw().value;e.Q6J("value",t)("showValue",!0)}}function Ui(n,s){if(1&n&&(e.YNc(0,Yi,1,0,"div",15),e.YNc(1,Vi,1,2,"ngb-progressbar",16)),2&n){const t=s.row;e.Q6J("ngIf","Replaying"===t.state),e.xp6(1),e.Q6J("ngIf","Syncing"===t.state)}}let ji=(()=>{class n{constructor(t){this.rbdMirroringService=t,this.image_error={data:[],columns:{}},this.image_syncing={data:[],columns:{}},this.image_ready={data:[],columns:{}},this.tableStatus=new se.E}ngOnInit(){this.image_error.columns=[{prop:"pool_name",name:"Pool",flexGrow:2},{prop:"name",name:"Image",flexGrow:2},{prop:"state",name:"State",cellTemplate:this.stateTmpl,flexGrow:1},{prop:"description",name:"Issue",flexGrow:4}],this.image_syncing.columns=[{prop:"pool_name",name:"Pool",flexGrow:2},{prop:"name",name:"Image",flexGrow:2},{prop:"state",name:"State",cellTemplate:this.stateTmpl,flexGrow:1},{prop:"progress",name:"Progress",cellTemplate:this.progressTmpl,flexGrow:2},{prop:"bytes_per_second",name:"Bytes per second",flexGrow:2},{prop:"entries_behind_primary",name:"Entries behind primary",flexGrow:2}],this.image_ready.columns=[{prop:"pool_name",name:"Pool",flexGrow:2},{prop:"name",name:"Image",flexGrow:2},{prop:"state",name:"State",cellTemplate:this.stateTmpl,flexGrow:1},{prop:"description",name:"Description",flexGrow:4}],this.subs=this.rbdMirroringService.subscribeSummary(t=>{this.image_error.data=t.content_data.image_error,this.image_syncing.data=t.content_data.image_syncing,this.image_ready.data=t.content_data.image_ready,this.tableStatus=new se.E(t.status)})}ngOnDestroy(){this.subs.unsubscribe()}refresh(){this.rbdMirroringService.refresh()}}return n.\u0275fac=function(t){return new(t||n)(e.Y36(K))},n.\u0275cmp=e.Xpm({type:n,selectors:[["cd-mirroring-images"]],viewQuery:function(t,o){if(1&t&&(e.Gf(ki,7),e.Gf(qi,7),e.Gf(Ki,7)),2&t){let i;e.iGM(i=e.CRH())&&(o.stateTmpl=i.first),e.iGM(i=e.CRH())&&(o.syncTmpl=i.first),e.iGM(i=e.CRH())&&(o.progressTmpl=i.first)}},decls:19,vars:4,consts:function(){let s,t,o;return s="Issues (" + "\ufffd0\ufffd" + ")",t="Syncing (" + "\ufffd0\ufffd" + ")",o="Ready (" + "\ufffd0\ufffd" + ")",[["ngbNav","","cdStatefulTab","image-list",1,"nav-tabs"],["nav","ngbNav"],["ngbNavItem","issues"],["ngbNavLink",""],s,["ngbNavContent",""],["ngbNavItem","syncing"],t,["ngbNavItem","ready"],o,[3,"ngbNavOutlet"],["stateTmpl",""],["progressTmpl",""],["columnMode","flex",3,"data","columns","autoReload","status","fetchData"],[3,"ngClass"],[4,"ngIf"],["type","info",3,"value","showValue",4,"ngIf"],["type","info",3,"value","showValue"]]},template:function(t,o){if(1&t&&(e.TgZ(0,"nav",0,1),e.ynx(2,2),e.TgZ(3,"a",3),e.SDv(4,4),e.qZA(),e.YNc(5,Xi,1,4,"ng-template",5),e.BQk(),e.ynx(6,6),e.TgZ(7,"a",3),e.SDv(8,7),e.qZA(),e.YNc(9,Qi,1,4,"ng-template",5),e.BQk(),e.ynx(10,8),e.TgZ(11,"a",3),e.SDv(12,9),e.qZA(),e.YNc(13,zi,1,4,"ng-template",5),e.BQk(),e.qZA(),e._UZ(14,"div",10),e.YNc(15,Ji,3,4,"ng-template",null,11,e.W1O),e.YNc(17,Ui,2,2,"ng-template",null,12,e.W1O)),2&t){const i=e.MAs(1);e.xp6(4),e.pQV(o.image_error.data.length),e.QtT(4),e.xp6(4),e.pQV(o.image_syncing.data.length),e.QtT(8),e.xp6(4),e.pQV(o.image_ready.data.length),e.QtT(12),e.xp6(2),e.Q6J("ngbNavOutlet",i)}},directives:[v.Pz,Ot.m,v.nv,v.Vx,v.uN,W.a,v.tO,c.mk,c.O5,v.Ly],pipes:[st],styles:[""]}),n})();function Wi(n,s){if(1&n&&e._UZ(0,"i",19),2&n){const t=e.oxw();e.Q6J("ngClass",t.icons.edit)}}function es(n,s){if(1&n&&e._UZ(0,"i",19),2&n){const t=e.oxw();e.Q6J("ngClass",t.icons.check)}}let ts=(()=>{class n{constructor(t,o,i,_){this.authStorageService=t,this.rbdMirroringService=o,this.modalService=i,this.taskWrapper=_,this.selection=new Ee.r,this.peersExist=!0,this.subs=new si.w,this.editing=!1,this.icons=T.P,this.permission=this.authStorageService.getPermissions().rbdMirroring;const r={permission:"update",icon:T.P.upload,click:()=>this.createBootstrapModal(),name:"Create Bootstrap Token",canBePrimary:()=>!0,disable:()=>!1},l={permission:"update",icon:T.P.download,click:()=>this.importBootstrapModal(),name:"Import Bootstrap Token",disable:()=>!1};this.tableActions=[r,l]}ngOnInit(){this.createForm(),this.subs.add(this.rbdMirroringService.startPolling()),this.subs.add(this.rbdMirroringService.subscribeSummary(t=>{this.status=t.content_data.status,this.peersExist=!!t.content_data.pools.find(o=>o.peer_uuids.length>0)})),this.rbdMirroringService.getSiteName().subscribe(t=>{this.siteName=t.site_name,this.rbdmirroringForm.get("siteName").setValue(this.siteName)})}createForm(){this.rbdmirroringForm=new Z.d({siteName:new a.NI({value:"",disabled:!0})})}ngOnDestroy(){this.subs.unsubscribe()}updateSiteName(){this.editing&&this.taskWrapper.wrapTaskAroundCall({task:new R.R("rbd/mirroring/site_name/edit",{}),call:this.rbdMirroringService.setSiteName(this.rbdmirroringForm.getValue("siteName"))}).subscribe({complete:()=>{this.rbdMirroringService.refresh()}}),this.editing=!this.editing}createBootstrapModal(){this.modalRef=this.modalService.show(mi,{siteName:this.siteName})}importBootstrapModal(){this.modalRef=this.modalService.show(Ri,{siteName:this.siteName})}}return n.\u0275fac=function(t){return new(t||n)(e.Y36(oe.j),e.Y36(K),e.Y36(de.Z),e.Y36(m.P))},n.\u0275cmp=e.Xpm({type:n,selectors:[["cd-mirroring"]],decls:31,vars:10,consts:function(){let s,t,o,i;return s="Site Name",t="Daemons",o="Pools",i="Images",[["name","rbdmirroringForm","novalidate","",3,"formGroup"],["formDir","ngForm"],[1,"row","mb-3"],[1,"col-md-auto"],["for","siteName",1,"col-form-label"],s,[1,"col-sm-4","d-flex"],["type","text","id","siteName","name","siteName","formControlName","siteName",1,"form-control"],["id","editSiteName",1,"btn","btn-light",3,"click"],[3,"ngClass",4,"ngIf"],[3,"source","byId"],[1,"col"],[1,"table-actions","float-end",3,"permission","selection","tableActions"],[1,"row"],[1,"col-sm-6"],t,o,[1,"col-md-12"],i,[3,"ngClass"]]},template:function(t,o){1&t&&(e.TgZ(0,"form",0,1)(2,"div",2)(3,"div",3)(4,"label",4),e.SDv(5,5),e.qZA()(),e.TgZ(6,"div",6),e._UZ(7,"input",7),e.TgZ(8,"button",8),e.NdJ("click",function(){return o.updateSiteName()}),e.YNc(9,Wi,1,1,"i",9),e.YNc(10,es,1,1,"i",9),e.qZA(),e._UZ(11,"cd-copy-2-clipboard-button",10),e.qZA(),e.TgZ(12,"div",11),e._UZ(13,"cd-table-actions",12),e.qZA()()(),e.TgZ(14,"div",13)(15,"div",14)(16,"legend"),e.SDv(17,15),e.qZA(),e.TgZ(18,"div"),e._UZ(19,"cd-mirroring-daemons"),e.qZA()(),e.TgZ(20,"div",14)(21,"legend"),e.SDv(22,16),e.qZA(),e.TgZ(23,"div"),e._UZ(24,"cd-mirroring-pools"),e.qZA()()(),e.TgZ(25,"div",13)(26,"div",17)(27,"legend"),e.SDv(28,18),e.qZA(),e.TgZ(29,"div"),e._UZ(30,"cd-mirroring-images"),e.qZA()()()),2&t&&(e.Q6J("formGroup",o.rbdmirroringForm),e.xp6(7),e.uIk("disabled",!o.editing||null),e.xp6(1),e.uIk("title",o.editing?"Save":"Edit"),e.xp6(1),e.Q6J("ngIf",!o.editing),e.xp6(1),e.Q6J("ngIf",o.editing),e.xp6(1),e.Q6J("source",o.siteName)("byId",!1),e.xp6(2),e.Q6J("permission",o.permission)("selection",o.selection)("tableActions",o.tableActions))},directives:[a._Y,a.JL,A.V,a.sg,$.o,a.Fj,X.b,a.JJ,a.u,c.O5,c.mk,Ye.s,Re.K,Ai,Hi,ji],styles:[""]}),n})();class os{}function ns(n,s){if(1&n&&(e.TgZ(0,"option",16),e._uU(1),e.qZA()),2&n){const t=s.$implicit;e.Q6J("value",t.id),e.xp6(1),e.Oqu(t.name)}}function is(n,s){1&n&&(e.TgZ(0,"span",17),e.SDv(1,18),e.qZA())}let ss=(()=>{class n{constructor(t,o,i,_,r,l){this.activeModal=t,this.actionLabels=o,this.rbdMirroringService=i,this.taskWrapper=_,this.route=r,this.location=l,this.bsConfig={containerClass:"theme-default"},this.peerExists=!1,this.mirrorModes=[{id:"disabled",name:"Disabled"},{id:"pool",name:"Pool"},{id:"image",name:"Image"}],this.createForm()}createForm(){this.editModeForm=new Z.d({mirrorMode:new a.NI("",{validators:[a.kI.required,this.validateMode.bind(this)]})})}ngOnInit(){this.route.params.subscribe(t=>{this.poolName=t.pool_name}),this.pattern=`${this.poolName}`,this.rbdMirroringService.getPool(this.poolName).subscribe(t=>{this.setResponse(t)}),this.subs=this.rbdMirroringService.subscribeSummary(t=>{this.peerExists=!1;const i=t.content_data.pools.find(_=>this.poolName===_.name);this.peerExists=i&&i.peer_uuids.length})}ngOnDestroy(){this.subs.unsubscribe()}validateMode(t){return"disabled"===t.value&&this.peerExists?{cannotDisable:{value:t.value}}:null}setResponse(t){this.editModeForm.get("mirrorMode").setValue(t.mirror_mode)}update(){const t=new os;t.mirror_mode=this.editModeForm.getValue("mirrorMode"),this.taskWrapper.wrapTaskAroundCall({task:new R.R("rbd/mirroring/pool/edit",{pool_name:this.poolName}),call:this.rbdMirroringService.updatePool(this.poolName,t)}).subscribe({error:()=>this.editModeForm.setErrors({cdSubmitButton:!0}),complete:()=>{this.rbdMirroringService.refresh(),this.location.back()}})}}return n.\u0275fac=function(t){return new(t||n)(e.Y36(v.Kz),e.Y36(D.p4),e.Y36(K),e.Y36(m.P),e.Y36(g.gz),e.Y36(c.Ye))},n.\u0275cmp=e.Xpm({type:n,selectors:[["cd-pool-edit-mode-modal"]],decls:21,vars:7,consts:function(){let s,t,o,i;return s="Edit pool mirror mode",t="To edit the mirror mode for pool\xA0 " + "[\ufffd#10\ufffd|\ufffd#11\ufffd]" + "" + "\ufffd0\ufffd" + "" + "[\ufffd/#10\ufffd|\ufffd/#11\ufffd]" + ", select a new mode from the list and click\xA0 " + "[\ufffd#10\ufffd|\ufffd#11\ufffd]" + "Update" + "[\ufffd/#10\ufffd|\ufffd/#11\ufffd]" + ".",t=e.Zx4(t),o="Mode",i="Peer clusters must be removed prior to disabling mirror.",[["pageURL","mirroring",3,"modalRef"],[1,"modal-title"],s,[1,"modal-content"],["name","editModeForm","novalidate","",1,"form",3,"formGroup"],["formDir","ngForm"],[1,"modal-body"],t,[1,"form-group"],["for","mirrorMode",1,"col-form-label"],o,["id","mirrorMode","name","mirrorMode","formControlName","mirrorMode",1,"form-select"],[3,"value",4,"ngFor","ngForOf"],["class","invalid-feedback",4,"ngIf"],[1,"modal-footer"],[3,"form","submitText","submitActionEvent"],[3,"value"],[1,"invalid-feedback"],i]},template:function(t,o){if(1&t&&(e.TgZ(0,"cd-modal",0),e.ynx(1,1),e.SDv(2,2),e.BQk(),e.ynx(3,3),e.TgZ(4,"form",4,5)(6,"div",6)(7,"p"),e.ynx(8),e.tHW(9,7),e._UZ(10,"kbd")(11,"kbd"),e.N_p(),e.BQk(),e.qZA(),e.TgZ(12,"div",8)(13,"label",9)(14,"span"),e.SDv(15,10),e.qZA()(),e.TgZ(16,"select",11),e.YNc(17,ns,2,2,"option",12),e.qZA(),e.YNc(18,is,2,0,"span",13),e.qZA()(),e.TgZ(19,"div",14)(20,"cd-form-button-panel",15),e.NdJ("submitActionEvent",function(){return o.update()}),e.qZA()()(),e.BQk(),e.qZA()),2&t){const i=e.MAs(5);e.Q6J("modalRef",o.activeModal),e.xp6(4),e.Q6J("formGroup",o.editModeForm),e.xp6(7),e.pQV(o.poolName),e.QtT(9),e.xp6(6),e.Q6J("ngForOf",o.mirrorModes),e.xp6(1),e.Q6J("ngIf",o.editModeForm.showError("mirrorMode",i,"cannotDisable")),e.xp6(2),e.Q6J("form",o.editModeForm)("submitText",o.actionLabels.UPDATE)}},directives:[C.z,a._Y,a.JL,A.V,a.sg,O.P,$.o,a.EJ,a.JJ,a.u,c.sg,a.YN,a.Kr,c.O5,j.p],styles:[""]}),n})();var ht=p(7357),_s=p(28049),as=p(43190),Ve=p(80842),_t=p(30633),$e=p(47557),rs=p(28211);class ls{}var Ie=(()=>{return(n=Ie||(Ie={}))[n.V1=1]="V1",n[n.V2=2]="V2",Ie;var n})();class cs{constructor(){this.features=[]}}class ds{constructor(){this.features=[]}}class us extends class ps{}{constructor(){super(...arguments),this.features=[]}}class at{constructor(){this.features=[],this.remove_scheduling=!1}}var Ue=(()=>{return(n=Ue||(Ue={})).editing="editing",n.cloning="cloning",n.copying="copying",Ue;var n})(),ms=p(18372),gs=p(17932),Ts=p(60950);function fs(n,s){if(1&n&&(e.TgZ(0,"div",9)(1,"label",58),e.SDv(2,59),e.ALo(3,"titlecase"),e.qZA(),e.TgZ(4,"div",12),e._UZ(5,"input",60)(6,"hr"),e.qZA()()),2&n){const t=e.oxw(2);e.xp6(3),e.pQV(e.lcZ(3,1,t.action)),e.QtT(2)}}function Cs(n,s){1&n&&(e.TgZ(0,"span",61),e.ynx(1),e.SDv(2,62),e.BQk(),e.qZA())}function Ss(n,s){1&n&&(e.TgZ(0,"span",61),e.ynx(1),e.SDv(2,63),e.BQk(),e.qZA())}function Es(n,s){1&n&&e._UZ(0,"input",64)}function Rs(n,s){1&n&&(e.TgZ(0,"option",50),e.SDv(1,67),e.qZA()),2&n&&e.Q6J("ngValue",null)}function Ms(n,s){1&n&&(e.TgZ(0,"option",50),e.SDv(1,68),e.qZA()),2&n&&e.Q6J("ngValue",null)}function Os(n,s){1&n&&(e.TgZ(0,"option",50),e.SDv(1,69),e.qZA()),2&n&&e.Q6J("ngValue",null)}function hs(n,s){if(1&n&&(e.TgZ(0,"option",70),e._uU(1),e.qZA()),2&n){const t=s.$implicit;e.Q6J("value",t.pool_name),e.xp6(1),e.Oqu(t.pool_name)}}function As(n,s){if(1&n){const t=e.EpF();e.TgZ(0,"select",65),e.NdJ("change",function(){return e.CHM(t),e.oxw(2).setPoolMirrorMode()}),e.YNc(1,Rs,2,1,"option",66),e.YNc(2,Ms,2,1,"option",66),e.YNc(3,Os,2,1,"option",66),e.YNc(4,hs,2,2,"option",46),e.qZA()}if(2&n){const t=e.oxw(2);e.xp6(1),e.Q6J("ngIf",null===t.pools),e.xp6(1),e.Q6J("ngIf",null!==t.pools&&0===t.pools.length),e.xp6(1),e.Q6J("ngIf",null!==t.pools&&t.pools.length>0),e.xp6(1),e.Q6J("ngForOf",t.pools)}}function Ps(n,s){1&n&&(e.TgZ(0,"span",61),e.SDv(1,71),e.qZA())}const Is=function(n,s){return[n,s]};function bs(n,s){if(1&n&&(e.TgZ(0,"div",9)(1,"div",20),e._UZ(2,"i",72),e.qZA()()),2&n){const t=e.oxw(2);e.xp6(2),e.Q6J("ngClass",e.WLB(1,Is,t.icons.spinner,t.icons.spin))}}function Ns(n,s){1&n&&e._UZ(0,"input",76)}function Fs(n,s){1&n&&(e.TgZ(0,"option",50),e.SDv(1,78),e.qZA()),2&n&&e.Q6J("ngValue",null)}function Ds(n,s){1&n&&(e.TgZ(0,"option",50),e.SDv(1,79),e.qZA()),2&n&&e.Q6J("ngValue",null)}function vs(n,s){1&n&&(e.TgZ(0,"option",50),e.SDv(1,80),e.qZA()),2&n&&e.Q6J("ngValue",null)}function Ls(n,s){if(1&n&&(e.TgZ(0,"option",70),e._uU(1),e.qZA()),2&n){const t=s.$implicit;e.Q6J("value",t),e.xp6(1),e.Oqu(t)}}function $s(n,s){if(1&n&&(e.TgZ(0,"select",77),e.YNc(1,Fs,2,1,"option",66),e.YNc(2,Ds,2,1,"option",66),e.YNc(3,vs,2,1,"option",66),e.YNc(4,Ls,2,2,"option",46),e.qZA()),2&n){const t=e.oxw(3);e.xp6(1),e.Q6J("ngIf",null===t.pools),e.xp6(1),e.Q6J("ngIf",null!==t.pools&&0===t.pools.length),e.xp6(1),e.Q6J("ngIf",null!==t.pools&&t.pools.length>0),e.xp6(1),e.Q6J("ngForOf",t.namespaces)}}function Bs(n,s){if(1&n&&(e.TgZ(0,"div",9)(1,"label",73),e._uU(2," Namespace "),e.qZA(),e.TgZ(3,"div",12),e.YNc(4,Ns,1,0,"input",74),e.YNc(5,$s,5,4,"select",75),e.qZA()()),2&n){const t=e.oxw(2);e.xp6(4),e.Q6J("ngIf","editing"===t.mode||!t.poolPermission.read),e.xp6(1),e.Q6J("ngIf","editing"!==t.mode&&t.poolPermission.read)}}function Gs(n,s){1&n&&(e.TgZ(0,"cd-helper")(1,"span"),e.SDv(2,81),e.qZA()())}function ys(n,s){1&n&&e._UZ(0,"input",87)}function xs(n,s){1&n&&(e.TgZ(0,"option",50),e.SDv(1,89),e.qZA()),2&n&&e.Q6J("ngValue",null)}function Zs(n,s){1&n&&(e.TgZ(0,"option",50),e.SDv(1,90),e.qZA()),2&n&&e.Q6J("ngValue",null)}function ws(n,s){1&n&&(e.TgZ(0,"option",50),e._uU(1,"-- Select a data pool -- "),e.qZA()),2&n&&e.Q6J("ngValue",null)}function Hs(n,s){if(1&n&&(e.TgZ(0,"option",70),e._uU(1),e.qZA()),2&n){const t=s.$implicit;e.Q6J("value",t.pool_name),e.xp6(1),e.Oqu(t.pool_name)}}function ks(n,s){if(1&n){const t=e.EpF();e.TgZ(0,"select",88),e.NdJ("change",function(i){return e.CHM(t),e.oxw(3).onDataPoolChange(i.target.value)}),e.YNc(1,xs,2,1,"option",66),e.YNc(2,Zs,2,1,"option",66),e.YNc(3,ws,2,1,"option",66),e.YNc(4,Hs,2,2,"option",46),e.qZA()}if(2&n){const t=e.oxw(3);e.xp6(1),e.Q6J("ngIf",null===t.dataPools),e.xp6(1),e.Q6J("ngIf",null!==t.dataPools&&0===t.dataPools.length),e.xp6(1),e.Q6J("ngIf",null!==t.dataPools&&t.dataPools.length>0),e.xp6(1),e.Q6J("ngForOf",t.dataPools)}}function qs(n,s){1&n&&(e.TgZ(0,"span",61),e.SDv(1,91),e.qZA())}const je=function(n){return{required:n}};function Ks(n,s){if(1&n&&(e.TgZ(0,"div",9)(1,"label",82)(2,"span",72),e.SDv(3,83),e.qZA(),e._UZ(4,"cd-helper",84),e.qZA(),e.TgZ(5,"div",12),e.YNc(6,ys,1,0,"input",85),e.YNc(7,ks,5,4,"select",86),e.YNc(8,qs,2,0,"span",14),e.qZA()()),2&n){e.oxw();const t=e.MAs(2),o=e.oxw();e.xp6(2),e.Q6J("ngClass",e.VKq(4,je,"editing"!==o.mode)),e.xp6(4),e.Q6J("ngIf","editing"===o.mode||!o.poolPermission.read),e.xp6(1),e.Q6J("ngIf","editing"!==o.mode&&o.poolPermission.read),e.xp6(1),e.Q6J("ngIf",o.rbdForm.showError("dataPool",t,"required"))}}function Xs(n,s){1&n&&(e.TgZ(0,"span",61),e.SDv(1,92),e.qZA())}function Qs(n,s){1&n&&(e.TgZ(0,"span",61),e.SDv(1,93),e.qZA())}function zs(n,s){if(1&n&&e._UZ(0,"cd-helper",97),2&n){const t=e.oxw().$implicit;e.s9C("html",t.helperHtml)}}function Js(n,s){if(1&n&&(e.TgZ(0,"div",21),e._UZ(1,"input",94),e.TgZ(2,"label",95),e._uU(3),e.qZA(),e.YNc(4,zs,1,1,"cd-helper",96),e.qZA()),2&n){const t=s.$implicit;e.xp6(1),e.s9C("id",t.key),e.s9C("name",t.key),e.s9C("formControlName",t.key),e.xp6(1),e.s9C("for",t.key),e.xp6(1),e.Oqu(t.desc),e.xp6(1),e.Q6J("ngIf",t.helperHtml)}}const At=function(n){return["edit",n]},Pt=function(n){return{modal:n}},It=function(n){return{outlets:n}},bt=function(n){return["/block/mirroring",n]};function Ys(n,s){if(1&n&&(e.TgZ(0,"cd-helper")(1,"span"),e.tHW(2,98),e._UZ(3,"b")(4,"a",99),e.N_p(),e.qZA()()),2&n){const t=e.oxw(2);e.xp6(4),e.Q6J("routerLink",e.VKq(7,bt,e.VKq(5,It,e.VKq(3,Pt,e.VKq(1,At,t.currentPoolName)))))}}function Vs(n,s){if(1&n&&(e.TgZ(0,"cd-helper")(1,"span"),e.tHW(2,104),e._UZ(3,"b")(4,"a",99),e.N_p(),e.qZA()()),2&n){const t=e.oxw(4);e.xp6(4),e.Q6J("routerLink",e.VKq(7,bt,e.VKq(5,It,e.VKq(3,Pt,e.VKq(1,At,t.currentPoolName)))))}}function Us(n,s){if(1&n){const t=e.EpF();e.TgZ(0,"div",101)(1,"input",102),e.NdJ("change",function(){return e.CHM(t),e.oxw(3).setExclusiveLock()}),e.qZA(),e.TgZ(2,"label",103),e._uU(3),e.ALo(4,"titlecase"),e.qZA(),e.YNc(5,Vs,5,9,"cd-helper",25),e.qZA()}if(2&n){const t=s.$implicit,o=e.oxw(3);e.xp6(1),e.Q6J("id",t)("value",t),e.uIk("disabled","pool"===o.poolMirrorMode&&"snapshot"===t||null),e.xp6(1),e.Q6J("for",t),e.xp6(1),e.Oqu(e.lcZ(4,6,t)),e.xp6(2),e.Q6J("ngIf","pool"===o.poolMirrorMode&&"snapshot"===t)}}function js(n,s){if(1&n&&(e.TgZ(0,"div"),e.YNc(1,Us,6,8,"div",100),e.qZA()),2&n){const t=e.oxw(2);e.xp6(1),e.Q6J("ngForOf",t.mirroringOptions)}}function Ws(n,s){if(1&n&&(e.TgZ(0,"div",9)(1,"label",105),e.tHW(2,106),e._UZ(3,"cd-helper",107),e.N_p(),e.qZA(),e.TgZ(4,"div",12),e._UZ(5,"input",108),e.qZA()()),2&n){const t=e.oxw(2);e.xp6(5),e.uIk("disabled",!1===t.peerConfigured||null)}}function e_(n,s){if(1&n){const t=e.EpF();e.TgZ(0,"a",109),e.NdJ("click",function(){return e.CHM(t),e.oxw(2).advancedEnabled=!0,!1}),e.SDv(1,110),e.qZA()}}function t_(n,s){if(1&n&&(e.TgZ(0,"option",70),e._uU(1),e.qZA()),2&n){const t=s.$implicit;e.Q6J("value",t),e.xp6(1),e.Oqu(t)}}function o_(n,s){if(1&n&&(e.TgZ(0,"option",70),e._uU(1),e.qZA()),2&n){const t=s.$implicit;e.Q6J("value",t),e.xp6(1),e.Oqu(t)}}function n_(n,s){1&n&&(e.TgZ(0,"span",61),e.SDv(1,111),e.qZA())}function i_(n,s){1&n&&(e.TgZ(0,"span",61),e.SDv(1,112),e.qZA())}function s_(n,s){1&n&&(e.TgZ(0,"span",61),e.SDv(1,113),e.qZA())}function __(n,s){1&n&&(e.TgZ(0,"span",61),e.SDv(1,114),e.qZA())}function a_(n,s){if(1&n){const t=e.EpF();e.TgZ(0,"div",1)(1,"form",2,3)(3,"div",4)(4,"div",5),e.SDv(5,6),e.ALo(6,"titlecase"),e.ALo(7,"upperFirst"),e.qZA(),e.TgZ(8,"div",7),e.YNc(9,fs,7,3,"div",8),e.TgZ(10,"div",9)(11,"label",10),e.SDv(12,11),e.qZA(),e.TgZ(13,"div",12),e._UZ(14,"input",13),e.YNc(15,Cs,3,0,"span",14),e.YNc(16,Ss,3,0,"span",14),e.qZA()(),e.TgZ(17,"div",15),e.NdJ("change",function(i){return e.CHM(t),e.oxw().onPoolChange(i.target.value)}),e.TgZ(18,"label",16),e.SDv(19,17),e.qZA(),e.TgZ(20,"div",12),e.YNc(21,Es,1,0,"input",18),e.YNc(22,As,5,4,"select",19),e.YNc(23,Ps,2,0,"span",14),e.qZA()(),e.YNc(24,bs,3,4,"div",8),e.YNc(25,Bs,6,2,"div",8),e.TgZ(26,"div",9)(27,"div",20)(28,"div",21)(29,"input",22),e.NdJ("change",function(){return e.CHM(t),e.oxw().onUseDataPoolChange()}),e.qZA(),e.TgZ(30,"label",23),e.SDv(31,24),e.qZA(),e.YNc(32,Gs,3,0,"cd-helper",25),e.qZA()()(),e.YNc(33,Ks,9,6,"div",8),e.TgZ(34,"div",9)(35,"label",26),e.SDv(36,27),e.qZA(),e.TgZ(37,"div",12),e._UZ(38,"input",28),e.YNc(39,Xs,2,0,"span",14),e.YNc(40,Qs,2,0,"span",14),e.qZA()(),e.TgZ(41,"div",29)(42,"label",30),e.SDv(43,31),e.qZA(),e.TgZ(44,"div",12),e.YNc(45,Js,5,6,"div",32),e.qZA()(),e.TgZ(46,"div",9)(47,"div",20)(48,"div",21)(49,"input",33),e.NdJ("change",function(){return e.CHM(t),e.oxw().setMirrorMode()}),e.qZA(),e.TgZ(50,"label",34),e._uU(51,"Mirroring"),e.qZA(),e.YNc(52,Ys,5,9,"cd-helper",25),e.qZA(),e.YNc(53,js,2,1,"div",25),e.qZA()(),e.YNc(54,Ws,6,1,"div",8),e.TgZ(55,"div",35)(56,"div",36),e.YNc(57,e_,2,0,"a",37),e.qZA()(),e.TgZ(58,"div",38)(59,"legend",39),e.SDv(60,40),e.qZA(),e.TgZ(61,"div",41)(62,"h4",39),e.SDv(63,42),e.qZA(),e.TgZ(64,"div",9)(65,"label",43),e.tHW(66,44),e._UZ(67,"cd-helper"),e.N_p(),e.qZA(),e.TgZ(68,"div",12)(69,"select",45),e.YNc(70,t_,2,2,"option",46),e.qZA()()(),e.TgZ(71,"div",9)(72,"label",47),e.tHW(73,48),e._UZ(74,"cd-helper"),e.N_p(),e.qZA(),e.TgZ(75,"div",12)(76,"select",49)(77,"option",50),e.SDv(78,51),e.qZA(),e.YNc(79,o_,2,2,"option",46),e.qZA(),e.YNc(80,n_,2,0,"span",14),e.YNc(81,i_,2,0,"span",14),e.qZA()(),e.TgZ(82,"div",9)(83,"label",52),e.tHW(84,53),e._UZ(85,"cd-helper"),e.N_p(),e.qZA(),e.TgZ(86,"div",12),e._UZ(87,"input",54),e.YNc(88,s_,2,0,"span",14),e.YNc(89,__,2,0,"span",14),e.qZA()()(),e.TgZ(90,"cd-rbd-configuration-form",55),e.NdJ("changes",function(i){return e.CHM(t),e.oxw().getDirtyConfigurationValues=i}),e.qZA()()(),e.TgZ(91,"div",56)(92,"cd-form-button-panel",57),e.NdJ("submitActionEvent",function(){return e.CHM(t),e.oxw().submit()}),e.ALo(93,"titlecase"),e.ALo(94,"upperFirst"),e.qZA()()()()()}if(2&n){const t=e.MAs(2),o=e.oxw();e.xp6(1),e.Q6J("formGroup",o.rbdForm),e.xp6(6),e.pQV(e.lcZ(6,35,o.action))(e.lcZ(7,37,o.resource)),e.QtT(5),e.xp6(2),e.Q6J("ngIf",o.rbdForm.getValue("parent")),e.xp6(6),e.Q6J("ngIf",o.rbdForm.showError("name",t,"required")),e.xp6(1),e.Q6J("ngIf",o.rbdForm.showError("name",t,"pattern")),e.xp6(2),e.Q6J("ngClass",e.VKq(43,je,"editing"!==o.mode)),e.xp6(3),e.Q6J("ngIf","editing"===o.mode||!o.poolPermission.read),e.xp6(1),e.Q6J("ngIf","editing"!==o.mode&&o.poolPermission.read),e.xp6(1),e.Q6J("ngIf",o.rbdForm.showError("pool",t,"required")),e.xp6(1),e.Q6J("ngIf","editing"!==o.mode&&o.rbdForm.getValue("pool")&&null===o.namespaces),e.xp6(1),e.Q6J("ngIf","editing"===o.mode&&o.rbdForm.getValue("namespace")||"editing"!==o.mode&&(o.namespaces&&o.namespaces.length>0||!o.poolPermission.read)),e.xp6(7),e.Q6J("ngIf",o.allDataPools.length<=1),e.xp6(1),e.Q6J("ngIf",o.rbdForm.getValue("useDataPool")),e.xp6(6),e.Q6J("ngIf",o.rbdForm.showError("size",t,"required")),e.xp6(1),e.Q6J("ngIf",o.rbdForm.showError("size",t,"invalidSizeObject")),e.xp6(5),e.Q6J("ngForOf",o.featuresList),e.xp6(7),e.Q6J("ngIf",!1===o.mirroring&&o.currentPoolName),e.xp6(1),e.Q6J("ngIf",o.mirroring),e.xp6(1),e.Q6J("ngIf","snapshot"===o.rbdForm.getValue("mirroringMode")&&o.mirroring),e.xp6(3),e.Q6J("ngIf",!o.advancedEnabled),e.xp6(1),e.Q6J("hidden",!o.advancedEnabled),e.xp6(12),e.Q6J("ngForOf",o.objectSizes),e.xp6(2),e.Q6J("ngClass",e.VKq(45,je,o.rbdForm.getValue("stripingCount"))),e.xp6(5),e.Q6J("ngValue",null),e.xp6(2),e.Q6J("ngForOf",o.objectSizes),e.xp6(1),e.Q6J("ngIf",o.rbdForm.showError("stripingUnit",t,"required")),e.xp6(1),e.Q6J("ngIf",o.rbdForm.showError("stripingUnit",t,"invalidStripingUnit")),e.xp6(2),e.Q6J("ngClass",e.VKq(47,je,o.rbdForm.getValue("stripingUnit"))),e.xp6(5),e.Q6J("ngIf",o.rbdForm.showError("stripingCount",t,"required")),e.xp6(1),e.Q6J("ngIf",o.rbdForm.showError("stripingCount",t,"min")),e.xp6(1),e.Q6J("form",o.rbdForm)("initializeData",o.initializeConfigData),e.xp6(2),e.Q6J("form",t)("submitText",e.lcZ(93,39,o.action)+" "+e.lcZ(94,41,o.resource))}}let Be=(()=>{class n extends k.E{constructor(t,o,i,_,r,l,d,u,f,I){super(),this.authStorageService=t,this.route=o,this.poolService=i,this.rbdService=_,this.formatter=r,this.taskWrapper=l,this.dimlessBinaryPipe=d,this.actionLabels=u,this.router=f,this.rbdMirroringService=I,this.namespaces=[],this.namespacesByPoolCache={},this.pools=null,this.allPools=null,this.dataPools=null,this.allDataPools=[],this.featuresList=[],this.initializeConfigData=new ht.t(1),this.peerConfigured=!1,this.advancedEnabled=!1,this.rbdFormMode=Ue,this.defaultObjectSize="4 MiB",this.mirroringOptions=["journal","snapshot"],this.mirroring=!1,this.currentPoolName="",this.objectSizes=["4 KiB","8 KiB","16 KiB","32 KiB","64 KiB","128 KiB","256 KiB","512 KiB","1 MiB","2 MiB","4 MiB","8 MiB","16 MiB","32 MiB"],this.defaultStripingUnit="4 MiB",this.defaultStripingCount=1,this.rbdImage=new ht.t(1),this.icons=T.P,this.routerUrl=this.router.url,this.poolPermission=this.authStorageService.getPermissions().pool,this.resource="RBD",this.features={"deep-flatten":{desc:"Deep flatten",requires:null,allowEnable:!1,allowDisable:!0},layering:{desc:"Layering",requires:null,allowEnable:!1,allowDisable:!1},"exclusive-lock":{desc:"Exclusive lock",requires:null,allowEnable:!0,allowDisable:!0},"object-map":{desc:"Object map (requires exclusive-lock)",requires:"exclusive-lock",allowEnable:!0,allowDisable:!0,initDisabled:!0},"fast-diff":{desc:"Fast diff (interlocked with object-map)",requires:"object-map",allowEnable:!0,allowDisable:!0,interlockedWith:"object-map",initDisabled:!0}},this.featuresList=this.objToArray(this.features),this.createForm()}objToArray(t){return S().map(t,(o,i)=>Object.assign(o,{key:i}))}createForm(){this.rbdForm=new Z.d({parent:new a.NI(""),name:new a.NI("",{validators:[a.kI.required,a.kI.pattern(/^[^@/]+?$/)]}),pool:new a.NI(null,{validators:[a.kI.required]}),namespace:new a.NI(null),useDataPool:new a.NI(!1),dataPool:new a.NI(null),size:new a.NI(null,{updateOn:"blur"}),obj_size:new a.NI(this.defaultObjectSize),features:new Z.d(this.featuresList.reduce((t,o)=>(t[o.key]=new a.NI({value:!1,disabled:!!o.initDisabled}),t),{})),mirroring:new a.NI(""),schedule:new a.NI("",{validators:[a.kI.pattern(/^([0-9]+)d|([0-9]+)h|([0-9]+)m$/)]}),mirroringMode:new a.NI(""),stripingUnit:new a.NI(this.defaultStripingUnit),stripingCount:new a.NI(this.defaultStripingCount,{updateOn:"blur"})},this.validateRbdForm(this.formatter))}disableForEdit(){this.rbdForm.get("parent").disable(),this.rbdForm.get("pool").disable(),this.rbdForm.get("namespace").disable(),this.rbdForm.get("useDataPool").disable(),this.rbdForm.get("dataPool").disable(),this.rbdForm.get("obj_size").disable(),this.rbdForm.get("stripingUnit").disable(),this.rbdForm.get("stripingCount").disable(),this.rbdImage.subscribe(t=>{t.image_format===Ie.V1&&(this.rbdForm.get("deep-flatten").disable(),this.rbdForm.get("layering").disable(),this.rbdForm.get("exclusive-lock").disable())})}disableForClone(){this.rbdForm.get("parent").disable(),this.rbdForm.get("size").disable()}disableForCopy(){this.rbdForm.get("parent").disable(),this.rbdForm.get("size").disable()}ngOnInit(){this.prepareFormForAction(),this.gatherNeededData().subscribe(this.handleExternalData.bind(this))}setExclusiveLock(){this.mirroring&&"journal"===this.rbdForm.get("mirroringMode").value?(this.rbdForm.get("exclusive-lock").setValue(!0),this.rbdForm.get("exclusive-lock").disable()):(this.rbdForm.get("exclusive-lock").enable(),"pool"===this.poolMirrorMode&&this.rbdForm.get("mirroringMode").setValue(this.mirroringOptions[0]))}setMirrorMode(){this.mirroring=!this.mirroring,this.setExclusiveLock(),this.checkPeersConfigured()}checkPeersConfigured(t){const o=t||this.rbdForm.get("pool").value;this.rbdMirroringService.getPeerForPool(o).subscribe(i=>{i.length>0&&(this.peerConfigured=!0)})}setPoolMirrorMode(){var t;this.currentPoolName=this.mode===this.rbdFormMode.editing?null===(t=this.response)||void 0===t?void 0:t.pool_name:this.rbdForm.getValue("pool"),this.currentPoolName&&(this.rbdMirroringService.refresh(),this.rbdMirroringService.subscribeSummary(o=>{const i=o.content_data.pools.find(_=>_.name===this.currentPoolName);this.poolMirrorMode=i.mirror_mode,"disabled"===i.mirror_mode&&(this.mirroring=!1,this.rbdForm.get("mirroring").setValue(this.mirroring),this.rbdForm.get("mirroring").disable())})),this.setExclusiveLock()}prepareFormForAction(){const t=this.routerUrl;t.startsWith("/block/rbd/edit")?(this.mode=this.rbdFormMode.editing,this.action=this.actionLabels.EDIT,this.disableForEdit()):t.startsWith("/block/rbd/clone")?(this.mode=this.rbdFormMode.cloning,this.disableForClone(),this.action=this.actionLabels.CLONE):t.startsWith("/block/rbd/copy")?(this.mode=this.rbdFormMode.copying,this.action=this.actionLabels.COPY,this.disableForCopy()):this.action=this.actionLabels.CREATE,S().each(this.features,o=>{this.rbdForm.get("features").get(o.key).valueChanges.subscribe(i=>this.featureFormUpdate(o.key,i))})}gatherNeededData(){const t={};return this.mode?this.route.params.subscribe(o=>{const i=L.N.fromString(decodeURIComponent(o.image_spec));o.snap&&(this.snapName=decodeURIComponent(o.snap)),t.rbd=this.rbdService.get(i),this.checkPeersConfigured(i.poolName)}):t.defaultFeatures=this.rbdService.defaultFeatures(),this.mode!==this.rbdFormMode.editing&&this.poolPermission.read&&(t.pools=this.poolService.list(["pool_name","type","flags_names","application_metadata"])),(0,le.D)(t)}handleExternalData(t){if(this.handlePoolData(t.pools),this.setPoolMirrorMode(),t.defaultFeatures&&this.setFeatures(t.defaultFeatures),t.rbd){const o=t.rbd;this.setResponse(o,this.snapName),this.rbdImage.next(o)}this.loadingReady()}handlePoolData(t){if(!t)return;const o=[],i=[];for(const _ of t)this.rbdService.isRBDPool(_)&&("replicated"===_.type?(o.push(_),i.push(_)):"erasure"===_.type&&-1!==_.flags_names.indexOf("ec_overwrites")&&i.push(_));if(this.pools=o,this.allPools=o,this.dataPools=i,this.allDataPools=i,1===this.pools.length){const _=this.pools[0].pool_name;this.rbdForm.get("pool").setValue(_),this.onPoolChange(_)}this.allDataPools.length<=1&&this.rbdForm.get("useDataPool").disable()}onPoolChange(t){const o=this.rbdForm.get("dataPool");o.value===t&&o.setValue(null),this.dataPools=this.allDataPools?this.allDataPools.filter(i=>i.pool_name!==t):[],this.namespaces=null,t in this.namespacesByPoolCache?this.namespaces=this.namespacesByPoolCache[t]:this.rbdService.listNamespaces(t).subscribe(i=>{i=i.map(_=>_.namespace),this.namespacesByPoolCache[t]=i,this.namespaces=i}),this.rbdForm.get("namespace").setValue(null)}onUseDataPoolChange(){this.rbdForm.getValue("useDataPool")||(this.rbdForm.get("dataPool").setValue(null),this.onDataPoolChange(null))}onDataPoolChange(t){const o=this.allPools.filter(i=>i.pool_name!==t);this.rbdForm.getValue("pool")===t&&this.rbdForm.get("pool").setValue(null),this.pools=o}validateRbdForm(t){return o=>{const i=o.get("useDataPool"),_=o.get("dataPool");let r=null;i.value&&null==_.value&&(r={required:!0}),_.setErrors(r);const l=o.get("size"),d=o.get("obj_size"),u=t.toBytes(null!=d.value?d.value:this.defaultObjectSize),f=o.get("stripingCount"),I=null!=f.value?f.value:this.defaultStripingCount;let P=null;null===l.value?P={required:!0}:I*u>t.toBytes(l.value)&&(P={invalidSizeObject:!0}),l.setErrors(P);const B=o.get("stripingUnit");let x=null;null===B.value&&null!==f.value?x={required:!0}:null!==B.value&&t.toBytes(B.value)>u&&(x={invalidStripingUnit:!0}),B.setErrors(x);let q=null;return null===f.value&&null!==B.value?q={required:!0}:I<1&&(q={min:!0}),f.setErrors(q),null}}deepBoxCheck(t,o){this.getDependentChildFeatures(t).forEach(_=>{const r=this.rbdForm.get(_.key);o?r.enable({emitEvent:!1}):(r.disable({emitEvent:!1}),r.setValue(!1,{emitEvent:!1}),this.deepBoxCheck(_.key,o));const l=this.rbdForm.get("features");this.mode===this.rbdFormMode.editing&&l.get(_.key).enabled&&(-1!==this.response.features_name.indexOf(_.key)&&!_.allowDisable||-1===this.response.features_name.indexOf(_.key)&&!_.allowEnable)&&l.get(_.key).disable()})}getDependentChildFeatures(t){return S().filter(this.features,o=>o.requires===t)||[]}interlockCheck(t,o){const i=this.featuresList.find(_=>_.key===t);if(this.response){const _=null!=i.interlockedWith,r=this.featuresList.find(d=>d.interlockedWith===i.key),l=!!this.response.features_name.find(d=>d===i.key);if(_){if(l!==!!this.response.features_name.find(u=>u===i.interlockedWith))return}else if(r&&!!this.response.features_name.find(u=>u===r.key)!==l)return}o?S().filter(this.features,_=>_.interlockedWith===t).forEach(_=>this.rbdForm.get(_.key).setValue(!0,{emitEvent:!1})):i.interlockedWith&&this.rbdForm.get("features").get(i.interlockedWith).setValue(!1)}featureFormUpdate(t,o){if(o){const i=this.features[t].requires;if(i&&!this.rbdForm.getValue(i))return void this.rbdForm.get(`features.${t}`).setValue(!1)}this.deepBoxCheck(t,o),this.interlockCheck(t,o)}setFeatures(t){const o=this.rbdForm.get("features");S().forIn(this.features,i=>{-1!==t.indexOf(i.key)&&o.get(i.key).setValue(!0),this.featureFormUpdate(i.key,o.get(i.key).value)})}setResponse(t,o){this.response=t;const i=new L.N(t.pool_name,t.namespace,t.name).toString();if(this.mode===this.rbdFormMode.cloning)this.rbdForm.get("parent").setValue(`${i}@${o}`);else if(this.mode===this.rbdFormMode.copying)o?this.rbdForm.get("parent").setValue(`${i}@${o}`):this.rbdForm.get("parent").setValue(`${i}`);else if(t.parent){const _=t.parent;this.rbdForm.get("parent").setValue(`${_.pool_name}/${_.image_name}@${_.snap_name}`)}this.mode===this.rbdFormMode.editing&&(this.rbdForm.get("name").setValue(t.name),"snapshot"===(null==t?void 0:t.mirror_mode)||t.features_name.includes("journaling")?(this.mirroring=!0,this.rbdForm.get("mirroring").setValue(this.mirroring),this.rbdForm.get("mirroringMode").setValue(null==t?void 0:t.mirror_mode),this.rbdForm.get("schedule").setValue(null==t?void 0:t.schedule_interval)):(this.mirroring=!1,this.rbdForm.get("mirroring").setValue(this.mirroring)),this.setPoolMirrorMode()),this.rbdForm.get("pool").setValue(t.pool_name),this.onPoolChange(t.pool_name),this.rbdForm.get("namespace").setValue(t.namespace),t.data_pool&&(this.rbdForm.get("useDataPool").setValue(!0),this.rbdForm.get("dataPool").setValue(t.data_pool)),this.rbdForm.get("size").setValue(this.dimlessBinaryPipe.transform(t.size)),this.rbdForm.get("obj_size").setValue(this.dimlessBinaryPipe.transform(t.obj_size)),this.setFeatures(t.features_name),this.rbdForm.get("stripingUnit").setValue(this.dimlessBinaryPipe.transform(t.stripe_unit)),this.rbdForm.get("stripingCount").setValue(t.stripe_count),this.initializeConfigData.next({initialData:this.response.configuration,sourceType:_t.h.image})}createRequest(){const t=new us;return t.pool_name=this.rbdForm.getValue("pool"),t.namespace=this.rbdForm.getValue("namespace"),t.name=this.rbdForm.getValue("name"),t.schedule_interval=this.rbdForm.getValue("schedule"),t.size=this.formatter.toBytes(this.rbdForm.getValue("size")),"image"===this.poolMirrorMode&&(t.mirror_mode=this.rbdForm.getValue("mirroringMode")),this.addObjectSizeAndStripingToRequest(t),t.configuration=this.getDirtyConfigurationValues(),t}addObjectSizeAndStripingToRequest(t){t.obj_size=this.formatter.toBytes(this.rbdForm.getValue("obj_size")),S().forIn(this.features,o=>{this.rbdForm.getValue(o.key)&&t.features.push(o.key)}),this.mirroring&&"journal"===this.rbdForm.getValue("mirroringMode")&&t.features.push("journaling"),t.stripe_unit=this.formatter.toBytes(this.rbdForm.getValue("stripingUnit")),t.stripe_count=this.rbdForm.getValue("stripingCount"),t.data_pool=this.rbdForm.getValue("dataPool")}createAction(){const t=this.createRequest();return this.taskWrapper.wrapTaskAroundCall({task:new R.R("rbd/create",{pool_name:t.pool_name,namespace:t.namespace,image_name:t.name,schedule_interval:t.schedule_interval,start_time:t.start_time}),call:this.rbdService.create(t)})}editRequest(){const t=new at;if(t.name=this.rbdForm.getValue("name"),t.schedule_interval=this.rbdForm.getValue("schedule"),t.name=this.rbdForm.getValue("name"),t.size=this.formatter.toBytes(this.rbdForm.getValue("size")),S().forIn(this.features,o=>{this.rbdForm.getValue(o.key)&&t.features.push(o.key)}),t.enable_mirror=this.rbdForm.getValue("mirroring"),t.enable_mirror)"journal"===this.rbdForm.getValue("mirroringMode")&&t.features.push("journaling"),"image"===this.poolMirrorMode&&(t.mirror_mode=this.rbdForm.getValue("mirroringMode"));else{const o=t.features.indexOf("journaling",0);o>-1&&t.features.splice(o,1)}return t.configuration=this.getDirtyConfigurationValues(),t}cloneRequest(){const t=new cs;return t.child_pool_name=this.rbdForm.getValue("pool"),t.child_namespace=this.rbdForm.getValue("namespace"),t.child_image_name=this.rbdForm.getValue("name"),this.addObjectSizeAndStripingToRequest(t),t.configuration=this.getDirtyConfigurationValues(!0,_t.h.image),t}editAction(){const t=new L.N(this.response.pool_name,this.response.namespace,this.response.name);return this.taskWrapper.wrapTaskAroundCall({task:new R.R("rbd/edit",{image_spec:t.toString()}),call:this.rbdService.update(t,this.editRequest())})}cloneAction(){const t=this.cloneRequest(),o=new L.N(this.response.pool_name,this.response.namespace,this.response.name);return this.taskWrapper.wrapTaskAroundCall({task:new R.R("rbd/clone",{parent_image_spec:o.toString(),parent_snap_name:this.snapName,child_pool_name:t.child_pool_name,child_namespace:t.child_namespace,child_image_name:t.child_image_name}),call:this.rbdService.cloneSnapshot(o,this.snapName,t)})}copyRequest(){const t=new ds;return this.snapName&&(t.snapshot_name=this.snapName),t.dest_pool_name=this.rbdForm.getValue("pool"),t.dest_namespace=this.rbdForm.getValue("namespace"),t.dest_image_name=this.rbdForm.getValue("name"),this.addObjectSizeAndStripingToRequest(t),t.configuration=this.getDirtyConfigurationValues(!0,_t.h.image),t}copyAction(){const t=this.copyRequest(),o=new L.N(this.response.pool_name,this.response.namespace,this.response.name);return this.taskWrapper.wrapTaskAroundCall({task:new R.R("rbd/copy",{src_image_spec:o.toString(),dest_pool_name:t.dest_pool_name,dest_namespace:t.dest_namespace,dest_image_name:t.dest_image_name}),call:this.rbdService.copy(o,t)})}submit(){this.mode||this.rbdImage.next("create"),this.rbdImage.pipe((0,_s.P)(),(0,as.w)(()=>this.mode===this.rbdFormMode.editing?this.editAction():this.mode===this.rbdFormMode.cloning?this.cloneAction():this.mode===this.rbdFormMode.copying?this.copyAction():this.createAction())).subscribe(()=>{},()=>this.rbdForm.setErrors({cdSubmitButton:!0}),()=>this.router.navigate(["/block/rbd"]))}}return n.\u0275fac=function(t){return new(t||n)(e.Y36(oe.j),e.Y36(g.gz),e.Y36(Ve.q),e.Y36(H),e.Y36(rs.H),e.Y36(m.P),e.Y36($e.$),e.Y36(D.p4),e.Y36(g.F0),e.Y36(K))},n.\u0275cmp=e.Xpm({type:n,selectors:[["cd-rbd-form"]],features:[e.qOj],decls:1,vars:1,consts:function(){let s,t,o,i,_,r,l,d,u,f,I,P,B,x,q,J,ee,te,w,_e,ae,M,ue,me,ge,Te,fe,Ce,Se,G,ye,xe,Ze,we,He,ke,qe,Ke,Xe,Qe,ze;return s="" + "\ufffd0\ufffd" + " " + "\ufffd1\ufffd" + "",t="Name",o="Pool",i="Use a dedicated data pool",_="Size",r="e.g., 10GiB",l="Features",d="Advanced",u="Striping",f="Object size" + "\ufffd#67\ufffd" + "Objects in the Ceph Storage Cluster have a maximum configurable size (e.g., 2MB, 4MB, etc.). The object size should be large enough to accommodate many stripe units, and should be a multiple of the stripe unit." + "\ufffd/#67\ufffd" + "",I="Stripe unit" + "\ufffd#74\ufffd" + "Stripes have a configurable unit size (e.g., 64kb). The Ceph Client divides the data it will write to objects into equally sized stripe units, except for the last stripe unit. A stripe width, should be a fraction of the Object Size so that an object may contain many stripe units." + "\ufffd/#74\ufffd" + "",P="-- Select stripe unit --",B="Stripe count" + "\ufffd#85\ufffd" + "The Ceph Client writes a sequence of stripe units over a series of objects determined by the stripe count. The series of objects is called an object set. After the Ceph Client writes to the last object in the object set, it returns to the first object in the object set." + "\ufffd/#85\ufffd" + "",x="" + "\ufffd0\ufffd" + " from",q="This field is required.",J="'/' and '@' are not allowed.",ee="Loading...",te="-- No rbd pools available --",w="-- Select a pool --",_e="This field is required.",ae="Loading...",M="-- No namespaces available --",ue="-- Select a namespace --",me="You need more than one pool with the rbd application label use to use a dedicated data pool.",ge="Data pool",Te="Dedicated pool that stores the object-data of the RBD.",fe="Loading...",Ce="-- No data pools available --",Se="This field is required.",G="This field is required.",ye="You have to increase the size.",xe="You need to enable a " + "\ufffd#3\ufffd" + "mirror mode" + "\ufffd/#3\ufffd" + " in the selected pool. Please " + "\ufffd#4\ufffd" + "click here to select a mode and enable it in this pool." + "\ufffd/#4\ufffd" + "",Ze="You need to enable " + "\ufffd#3\ufffd" + "image mirror mode" + "\ufffd/#3\ufffd" + " in the selected pool. Please " + "\ufffd#4\ufffd" + "click here to select a mode and enable it in this pool." + "\ufffd/#4\ufffd" + "",we="Create Mirror-Snapshots automatically on a periodic basis. The interval can be specified in days, hours, or minutes using d, h, m suffix respectively. To create mirror snapshots, you must import or create and have available peers to mirror",He="Schedule Interval " + "\ufffd#3\ufffd" + "" + "\ufffd/#3\ufffd" + "",ke="e.g., 12h or 1d or 10m",qe="Advanced...",Ke="This field is required because stripe count is defined!",Xe="Stripe unit is greater than object size.",Qe="This field is required because stripe unit is defined!",ze="Stripe count must be greater than 0.",[["class","cd-col-form",4,"cdFormLoading"],[1,"cd-col-form"],["name","rbdForm","novalidate","",3,"formGroup"],["formDir","ngForm"],[1,"card"],[1,"card-header"],s,[1,"card-body"],["class","form-group row",4,"ngIf"],[1,"form-group","row"],["for","name",1,"cd-col-form-label","required"],t,[1,"cd-col-form-input"],["type","text","placeholder","Name...","id","name","name","name","formControlName","name","autofocus","",1,"form-control"],["class","invalid-feedback",4,"ngIf"],[1,"form-group","row",3,"change"],["for","pool",1,"cd-col-form-label",3,"ngClass"],o,["class","form-control","type","text","placeholder","Pool name...","id","pool","name","pool","formControlName","pool",4,"ngIf"],["id","pool","name","pool","class","form-select","formControlName","pool",3,"change",4,"ngIf"],[1,"cd-col-form-offset"],[1,"custom-control","custom-checkbox"],["type","checkbox","id","useDataPool","name","useDataPool","formControlName","useDataPool",1,"custom-control-input",3,"change"],["for","useDataPool",1,"custom-control-label"],i,[4,"ngIf"],["for","size",1,"cd-col-form-label","required"],_,["id","size","name","size","type","text","formControlName","size","placeholder",r,"defaultUnit","GiB","cdDimlessBinary","",1,"form-control"],["formGroupName","features",1,"form-group","row"],["for","features",1,"cd-col-form-label"],l,["class","custom-control custom-checkbox",4,"ngFor","ngForOf"],["type","checkbox","id","mirroring","name","mirroring","formControlName","mirroring",1,"custom-control-input",3,"change"],["for","mirroring",1,"custom-control-label"],[1,"row"],[1,"col-sm-12"],["class","float-end margin-right-md","href","",3,"click",4,"ngIf"],[3,"hidden"],[1,"cd-header"],d,[1,"col-md-12"],u,["for","size",1,"cd-col-form-label"],f,["id","obj_size","name","obj_size","formControlName","obj_size",1,"form-select"],[3,"value",4,"ngFor","ngForOf"],["for","stripingUnit",1,"cd-col-form-label",3,"ngClass"],I,["id","stripingUnit","name","stripingUnit","formControlName","stripingUnit",1,"form-select"],[3,"ngValue"],P,["for","stripingCount",1,"cd-col-form-label",3,"ngClass"],B,["id","stripingCount","name","stripingCount","formControlName","stripingCount","type","number",1,"form-control"],[3,"form","initializeData","changes"],[1,"card-footer"],["wrappingClass","text-right",3,"form","submitText","submitActionEvent"],["for","name",1,"cd-col-form-label"],x,["type","text","id","parent","name","parent","formControlName","parent",1,"form-control"],[1,"invalid-feedback"],q,J,["type","text","placeholder","Pool name...","id","pool","name","pool","formControlName","pool",1,"form-control"],["id","pool","name","pool","formControlName","pool",1,"form-select",3,"change"],[3,"ngValue",4,"ngIf"],ee,te,w,[3,"value"],_e,[3,"ngClass"],["for","pool",1,"cd-col-form-label"],["class","form-control","type","text","placeholder","Namespace...","id","namespace","name","namespace","formControlName","namespace",4,"ngIf"],["id","namespace","name","namespace","class","form-select","formControlName","namespace",4,"ngIf"],["type","text","placeholder","Namespace...","id","namespace","name","namespace","formControlName","namespace",1,"form-control"],["id","namespace","name","namespace","formControlName","namespace",1,"form-select"],ae,M,ue,me,["for","dataPool",1,"cd-col-form-label"],ge,["html",Te],["class","form-control","type","text","placeholder","Data pool name...","id","dataPool","name","dataPool","formControlName","dataPool",4,"ngIf"],["id","dataPool","name","dataPool","class","form-select","formControlName","dataPool",3,"change",4,"ngIf"],["type","text","placeholder","Data pool name...","id","dataPool","name","dataPool","formControlName","dataPool",1,"form-control"],["id","dataPool","name","dataPool","formControlName","dataPool",1,"form-select",3,"change"],fe,Ce,Se,G,ye,["type","checkbox",1,"custom-control-input",3,"id","name","formControlName"],[1,"custom-control-label",3,"for"],[3,"html",4,"ngIf"],[3,"html"],xe,[3,"routerLink"],["class","custom-control custom-radio ms-2",4,"ngFor","ngForOf"],[1,"custom-control","custom-radio","ms-2"],["type","radio","name","mirroringMode","formControlName","mirroringMode",1,"form-check-input",3,"id","value","change"],[1,"form-check-label",3,"for"],Ze,[1,"cd-col-form-label"],He,["html",we],["id","schedule","name","schedule","type","text","formControlName","schedule","placeholder",ke,1,"form-control"],["href","",1,"float-end","margin-right-md",3,"click"],qe,Ke,Xe,Qe,ze]},template:function(t,o){1&t&&e.YNc(0,a_,95,49,"div",0),2&t&&e.Q6J("cdFormLoading",o.loading)},directives:[ut.y,a._Y,a.JL,a.sg,A.V,c.O5,O.P,$.o,a.Fj,X.b,a.JJ,a.u,Me.U,c.mk,a.EJ,a.YN,a.Kr,c.sg,a.Wl,ms.S,gs.Q,a.x0,g.yS,a._,a.wV,Ts.d,j.p],pipes:[c.rS,tt.m],styles:[""]}),n})();var Nt=p(71225),Ft=p(36169);let r_=(()=>{class n{constructor(){}static getCount(t){var o;return Number(null===(o=t.headers)||void 0===o?void 0:o.get("X-Total-Count"))}}return n.\u0275fac=function(t){return new(t||n)},n.\u0275prov=e.Yz7({token:n,factory:n.\u0275fac,providedIn:"root"}),n})();var rt=p(51847),l_=p(16738),Oe=p.n(l_),lt=p(62862),c_=p(52266);function d_(n,s){1&n&&(e.TgZ(0,"div",18)(1,"span"),e.SDv(2,19),e.qZA()())}function p_(n,s){1&n&&(e.TgZ(0,"span",20),e.SDv(1,21),e.qZA())}function u_(n,s){1&n&&(e.TgZ(0,"span",20),e.SDv(1,22),e.qZA())}function m_(n,s){if(1&n&&e._UZ(0,"cd-date-time-picker",23),2&n){const t=e.oxw();e.Q6J("control",t.moveForm.get("expiresAt"))}}let g_=(()=>{class n{constructor(t,o,i,_,r){this.rbdService=t,this.activeModal=o,this.actionLabels=i,this.fb=_,this.taskWrapper=r,this.createForm()}createForm(){this.moveForm=this.fb.group({expiresAt:["",[z.h.custom("format",t=>!(""===t||Oe()(t,"YYYY-MM-DD HH:mm:ss").isValid())),z.h.custom("expired",t=>Oe()().isAfter(t))]]})}ngOnInit(){this.imageSpec=new L.N(this.poolName,this.namespace,this.imageName),this.imageSpecStr=this.imageSpec.toString(),this.pattern=`${this.poolName}/${this.imageName}`}moveImage(){let t=0;const o=this.moveForm.getValue("expiresAt");o&&(t=Oe()(o,"YYYY-MM-DD HH:mm:ss").diff(Oe()(),"seconds",!0)),t<0&&(t=0),this.taskWrapper.wrapTaskAroundCall({task:new R.R("rbd/trash/move",{image_spec:this.imageSpecStr}),call:this.rbdService.moveTrash(this.imageSpec,t)}).subscribe({complete:()=>{this.activeModal.close()}})}}return n.\u0275fac=function(t){return new(t||n)(e.Y36(H),e.Y36(v.Kz),e.Y36(D.p4),e.Y36(lt.O),e.Y36(m.P))},n.\u0275cmp=e.Xpm({type:n,selectors:[["cd-rbd-trash-move-modal"]],decls:23,vars:9,consts:function(){let s,t,o,i,_,r,l;return s="Move an image to trash",t="To move " + "[\ufffd#10\ufffd|\ufffd#11\ufffd]" + "" + "\ufffd0\ufffd" + "" + "[\ufffd/#10\ufffd|\ufffd/#11\ufffd]" + " to trash, click " + "[\ufffd#10\ufffd|\ufffd#11\ufffd]" + "Move" + "[\ufffd/#10\ufffd|\ufffd/#11\ufffd]" + ". Optionally, you can pick an expiration date.",t=e.Zx4(t),o="Protection expires at",i="NOT PROTECTED",_="This image contains snapshot(s), which will prevent it from being removed after moved to trash.",r="Wrong date format. Please use \"YYYY-MM-DD HH:mm:ss\".",l="Protection has already expired. Please pick a future date or leave it empty.",[[3,"modalRef"],[1,"modal-title"],s,[1,"modal-content"],["name","moveForm","novalidate","",1,"form",3,"formGroup"],["formDir","ngForm"],[1,"modal-body"],["class","alert alert-warning","role","alert",4,"ngIf"],t,[1,"form-group"],["for","expiresAt",1,"col-form-label"],o,["type","text","placeholder",i,"formControlName","expiresAt","triggers","manual",1,"form-control",3,"ngbPopover","click","keypress"],["p","ngbPopover"],["class","invalid-feedback",4,"ngIf"],[1,"modal-footer"],[3,"form","submitText","submitActionEvent"],["popContent",""],["role","alert",1,"alert","alert-warning"],_,[1,"invalid-feedback"],r,l,[3,"control"]]},template:function(t,o){if(1&t){const i=e.EpF();e.TgZ(0,"cd-modal",0),e.ynx(1,1),e.SDv(2,2),e.BQk(),e.ynx(3,3),e.TgZ(4,"form",4,5)(6,"div",6),e.YNc(7,d_,3,0,"div",7),e.TgZ(8,"p"),e.tHW(9,8),e._UZ(10,"kbd")(11,"kbd"),e.N_p(),e.qZA(),e.TgZ(12,"div",9)(13,"label",10),e.SDv(14,11),e.qZA(),e.TgZ(15,"input",12,13),e.NdJ("click",function(){return e.CHM(i),e.MAs(16).open()})("keypress",function(){return e.CHM(i),e.MAs(16).close()}),e.qZA(),e.YNc(17,p_,2,0,"span",14),e.YNc(18,u_,2,0,"span",14),e.qZA()(),e.TgZ(19,"div",15)(20,"cd-form-button-panel",16),e.NdJ("submitActionEvent",function(){return o.moveImage()}),e.qZA()()(),e.BQk(),e.qZA(),e.YNc(21,m_,1,1,"ng-template",null,17,e.W1O)}if(2&t){const i=e.MAs(5),_=e.MAs(22);e.Q6J("modalRef",o.activeModal),e.xp6(4),e.Q6J("formGroup",o.moveForm),e.xp6(3),e.Q6J("ngIf",o.hasSnapshots),e.xp6(4),e.pQV(o.imageSpecStr),e.QtT(9),e.xp6(4),e.Q6J("ngbPopover",_),e.xp6(2),e.Q6J("ngIf",o.moveForm.showError("expiresAt",i,"format")),e.xp6(1),e.Q6J("ngIf",o.moveForm.showError("expiresAt",i,"expired")),e.xp6(2),e.Q6J("form",o.moveForm)("submitText",o.actionLabels.MOVE)}},directives:[C.z,a._Y,a.JL,a.sg,A.V,c.O5,O.P,$.o,a.Fj,X.b,a.JJ,a.u,v.o8,j.p,c_.J],styles:[""]}),n})();const We=function(){return{exact:!0}};function T_(n,s){1&n&&(e.TgZ(0,"li",1)(1,"a",9),e.SDv(2,10),e.qZA()()),2&n&&(e.xp6(1),e.Q6J("routerLinkActiveOptions",e.DdM(1,We)))}let et=(()=>{class n{constructor(t){this.authStorageService=t,this.grafanaPermission=this.authStorageService.getPermissions().grafana}}return n.\u0275fac=function(t){return new(t||n)(e.Y36(oe.j))},n.\u0275cmp=e.Xpm({type:n,selectors:[["cd-rbd-tabs"]],decls:11,vars:7,consts:function(){let s,t,o,i;return s="Images",t="Namespaces",o="Trash",i="Overall Performance",[[1,"nav","nav-tabs"],[1,"nav-item"],["routerLink","/block/rbd","routerLinkActive","active","ariaCurrentWhenActive","page",1,"nav-link",3,"routerLinkActiveOptions"],s,["routerLink","/block/rbd/namespaces","routerLinkActive","active","ariaCurrentWhenActive","page",1,"nav-link",3,"routerLinkActiveOptions"],t,["routerLink","/block/rbd/trash","routerLinkActive","active","ariaCurrentWhenActive","page",1,"nav-link",3,"routerLinkActiveOptions"],o,["class","nav-item",4,"ngIf"],["routerLink","/block/rbd/performance","routerLinkActive","active","ariaCurrentWhenActive","page",1,"nav-link",3,"routerLinkActiveOptions"],i]},template:function(t,o){1&t&&(e.TgZ(0,"ul",0)(1,"li",1)(2,"a",2),e.SDv(3,3),e.qZA()(),e.TgZ(4,"li",1)(5,"a",4),e.SDv(6,5),e.qZA()(),e.TgZ(7,"li",1)(8,"a",6),e.SDv(9,7),e.qZA()(),e.YNc(10,T_,3,2,"li",8),e.qZA()),2&t&&(e.xp6(2),e.Q6J("routerLinkActiveOptions",e.DdM(4,We)),e.xp6(3),e.Q6J("routerLinkActiveOptions",e.DdM(5,We)),e.xp6(3),e.Q6J("routerLinkActiveOptions",e.DdM(6,We)),e.xp6(2),e.Q6J("ngIf",o.grafanaPermission.read))},directives:[g.yS,g.Od,c.O5],styles:[""]}),n})();var f_=p(25917),Dt=p(51295),ct=p(60737),C_=p(74255),vt=p(71099),Lt=p(79765);function S_(n,s){1&n&&(e.TgZ(0,"span",16),e.SDv(1,17),e.qZA())}function E_(n,s){if(1&n&&(e.TgZ(0,"span"),e.tHW(1,18),e._UZ(2,"b"),e.N_p(),e.qZA()),2&n){const t=e.oxw();e.xp6(2),e.pQV(t.imageName),e.QtT(1)}}let R_=(()=>{class n{constructor(t,o,i,_,r){this.activeModal=t,this.rbdService=o,this.taskManagerService=i,this.notificationService=_,this.actionLabels=r,this.editing=!1,this.onSubmit=new Lt.xQ,this.action=this.actionLabels.CREATE,this.resource="RBD Snapshot",this.createForm()}createForm(){this.snapshotForm=new Z.d({snapshotName:new a.NI("",{validators:[a.kI.required]})})}setSnapName(t){this.snapName=t,"snapshot"!==this.mirroring?this.snapshotForm.get("snapshotName").setValue(t):this.snapshotForm.get("snapshotName").clearValidators()}setEditing(t=!0){this.editing=t,this.action=this.editing?this.actionLabels.RENAME:this.actionLabels.CREATE}editAction(){const t=this.snapshotForm.getValue("snapshotName"),o=new L.N(this.poolName,this.namespace,this.imageName),i=new R.R;i.name="rbd/snap/edit",i.metadata={image_spec:o.toString(),snapshot_name:t},this.rbdService.renameSnapshot(o,this.snapName,t).toPromise().then(()=>{this.taskManagerService.subscribe(i.name,i.metadata,_=>{this.notificationService.notifyTask(_)}),this.activeModal.close(),this.onSubmit.next(this.snapName)}).catch(()=>{this.snapshotForm.setErrors({cdSubmitButton:!0})})}createAction(){const t=this.snapshotForm.getValue("snapshotName"),o=new L.N(this.poolName,this.namespace,this.imageName),i=new R.R;i.name="rbd/snap/create",i.metadata={image_spec:o.toString(),snapshot_name:t},this.rbdService.createSnapshot(o,t).toPromise().then(()=>{this.taskManagerService.subscribe(i.name,i.metadata,_=>{this.notificationService.notifyTask(_)}),this.activeModal.close(),this.onSubmit.next(t)}).catch(()=>{this.snapshotForm.setErrors({cdSubmitButton:!0})})}submit(){this.editing?this.editAction():this.createAction()}}return n.\u0275fac=function(t){return new(t||n)(e.Y36(v.Kz),e.Y36(H),e.Y36(vt.k),e.Y36(Le.g),e.Y36(D.p4))},n.\u0275cmp=e.Xpm({type:n,selectors:[["cd-rbd-snapshot-form-modal"]],decls:22,vars:17,consts:function(){let s,t,o,i;return s="" + "\ufffd0\ufffd" + " " + "\ufffd1\ufffd" + "",t="Name",o="This field is required.",i="Snapshot mode is enabled on image " + "\ufffd#2\ufffd" + "" + "\ufffd0\ufffd" + "" + "\ufffd/#2\ufffd" + ": snapshot names are auto generated",[[3,"modalRef"],[1,"modal-title"],s,[1,"modal-content"],["name","snapshotForm","novalidate","",3,"formGroup"],["formDir","ngForm"],[1,"modal-body"],[1,"form-group","row"],["for","snapshotName",1,"cd-col-form-label","required"],t,[1,"cd-col-form-input"],["type","text","placeholder","Snapshot name...","id","snapshotName","name","snapshotName","formControlName","snapshotName","autofocus","",1,"form-control"],["class","invalid-feedback",4,"ngIf"],[4,"ngIf"],[1,"modal-footer"],[3,"form","submitText","submitActionEvent"],[1,"invalid-feedback"],o,i]},template:function(t,o){if(1&t&&(e.TgZ(0,"cd-modal",0),e.ynx(1,1),e.SDv(2,2),e.ALo(3,"titlecase"),e.ALo(4,"upperFirst"),e.BQk(),e.ynx(5,3),e.TgZ(6,"form",4,5)(8,"div",6)(9,"div",7)(10,"label",8),e.SDv(11,9),e.qZA(),e.TgZ(12,"div",10),e._UZ(13,"input",11),e.YNc(14,S_,2,0,"span",12),e._UZ(15,"br")(16,"br"),e.YNc(17,E_,3,1,"span",13),e.qZA()()(),e.TgZ(18,"div",14)(19,"cd-form-button-panel",15),e.NdJ("submitActionEvent",function(){return o.submit()}),e.ALo(20,"titlecase"),e.ALo(21,"upperFirst"),e.qZA()()(),e.BQk(),e.qZA()),2&t){const i=e.MAs(7);e.Q6J("modalRef",o.activeModal),e.xp6(4),e.pQV(e.lcZ(3,9,o.action))(e.lcZ(4,11,o.resource)),e.QtT(2),e.xp6(2),e.Q6J("formGroup",o.snapshotForm),e.xp6(7),e.uIk("disabled","snapshot"===o.mirroring||null),e.xp6(1),e.Q6J("ngIf",o.snapshotForm.showError("snapshotName",i,"required")),e.xp6(3),e.Q6J("ngIf","snapshot"===o.mirroring),e.xp6(2),e.Q6J("form",o.snapshotForm)("submitText",e.lcZ(20,13,o.action)+" "+e.lcZ(21,15,o.resource))}},directives:[C.z,a._Y,a.JL,a.sg,A.V,O.P,$.o,a.Fj,X.b,a.JJ,a.u,Me.U,c.O5,j.p],pipes:[c.rS,tt.m],styles:[""]}),n})();class M_{constructor(s,t,o){this.featuresName=t,this.cloneFormatVersion=1,o.cloneFormatVersion().subscribe(i=>{this.cloneFormatVersion=i}),this.create={permission:"create",icon:T.P.add,name:s.CREATE},this.rename={permission:"update",icon:T.P.edit,name:s.RENAME,disable:i=>this.disableForMirrorSnapshot(i)},this.protect={permission:"update",icon:T.P.lock,visible:i=>i.hasSingleSelection&&!i.first().is_protected,name:s.PROTECT,disable:i=>this.disableForMirrorSnapshot(i)},this.unprotect={permission:"update",icon:T.P.unlock,visible:i=>i.hasSingleSelection&&i.first().is_protected,name:s.UNPROTECT,disable:i=>this.disableForMirrorSnapshot(i)},this.clone={permission:"create",canBePrimary:i=>i.hasSingleSelection,disable:i=>this.getCloneDisableDesc(i,this.featuresName)||this.disableForMirrorSnapshot(i),icon:T.P.clone,name:s.CLONE},this.copy={permission:"create",canBePrimary:i=>i.hasSingleSelection,disable:i=>!i.hasSingleSelection||i.first().cdExecuting||this.disableForMirrorSnapshot(i),icon:T.P.copy,name:s.COPY},this.rollback={permission:"update",icon:T.P.undo,name:s.ROLLBACK,disable:i=>this.disableForMirrorSnapshot(i)},this.deleteSnap={permission:"delete",icon:T.P.destroy,disable:i=>{const _=i.first();return!i.hasSingleSelection||_.cdExecuting||_.is_protected||this.disableForMirrorSnapshot(i)},name:s.DELETE},this.ordering=[this.create,this.rename,this.protect,this.unprotect,this.clone,this.copy,this.rollback,this.deleteSnap]}getCloneDisableDesc(s,t){return!(s.hasSingleSelection&&!s.first().cdExecuting)||((null==t?void 0:t.includes("layering"))?1===this.cloneFormatVersion&&!s.first().is_protected&&"Snapshot must be protected in order to clone.":"Parent image must support Layering")}disableForMirrorSnapshot(s){return s.hasSingleSelection&&"snapshot"===s.first().mirror_mode&&s.first().name.includes(".mirror.")}}class O_{}var Ge=p(96102);const h_=["nameTpl"],A_=["rollbackTpl"];function P_(n,s){if(1&n&&(e.ynx(0),e.SDv(1,3),e.BQk(),e.TgZ(2,"strong"),e._uU(3),e.qZA(),e._uU(4,".\n")),2&n){const t=s.$implicit;e.xp6(3),e.hij(" ",t.snapName,"")}}let I_=(()=>{class n{constructor(t,o,i,_,r,l,d,u,f,I,P,B){this.authStorageService=t,this.modalService=o,this.dimlessBinaryPipe=i,this.cdDatePipe=_,this.rbdService=r,this.rbdMirrorService=l,this.taskManagerService=d,this.notificationService=u,this.summaryService=f,this.taskListService=I,this.actionLabels=P,this.cdr=B,this.snapshots=[],this.selection=new Ee.r,this.peerConfigured=!1,this.builders={"rbd/snap/create":x=>{const q=new O_;return q.name=x.snapshot_name,q}},this.permission=this.authStorageService.getPermissions().rbdImage}ngOnInit(){this.columns=[{name:"Name",prop:"name",cellTransformation:ve.e.executing,flexGrow:2},{name:"Size",prop:"size",flexGrow:1,cellClass:"text-right",pipe:this.dimlessBinaryPipe},{name:"Provisioned",prop:"disk_usage",flexGrow:1,cellClass:"text-right",pipe:this.dimlessBinaryPipe},{name:"State",prop:"is_protected",flexGrow:1,cellTransformation:ve.e.badge,customTemplateConfig:{map:{true:{value:"PROTECTED",class:"badge-success"},false:{value:"UNPROTECTED",class:"badge-info"}}}},{name:"Created",prop:"timestamp",flexGrow:1,pipe:this.cdDatePipe}],this.rbdMirrorService.getPeerForPool(this.poolName).subscribe(_=>{_.length>0&&(this.peerConfigured=!0)}),this.imageSpec=new L.N(this.poolName,this.namespace,this.rbdName),this.rbdTableActions=new M_(this.actionLabels,this.featuresName,this.rbdService),this.rbdTableActions.create.disable=()=>!this.primary||!this.peerConfigured&&"snapshot"===this.mirroring,this.rbdTableActions.create.click=()=>this.openCreateSnapshotModal(),this.rbdTableActions.rename.click=()=>this.openEditSnapshotModal(),this.rbdTableActions.protect.click=()=>this.toggleProtection(),this.rbdTableActions.unprotect.click=()=>this.toggleProtection();const t=()=>this.selection.first()&&`${this.imageSpec.toStringEncoded()}/${encodeURIComponent(this.selection.first().name)}`;this.rbdTableActions.clone.routerLink=()=>`/block/rbd/clone/${t()}`,this.rbdTableActions.copy.routerLink=()=>`/block/rbd/copy/${t()}`,this.rbdTableActions.rollback.click=()=>this.rollbackModal(),this.rbdTableActions.deleteSnap.click=()=>this.deleteSnapshotModal(),this.tableActions=this.rbdTableActions.ordering,this.taskListService.init(()=>(0,f_.of)(this.snapshots),null,_=>{Dt.T.updateChanged(this,{data:_})&&(this.cdr.detectChanges(),this.data=[...this.data])},()=>{Dt.T.updateChanged(this,{data:this.snapshots})&&(this.cdr.detectChanges(),this.data=[...this.data])},_=>["rbd/snap/create","rbd/snap/delete","rbd/snap/edit","rbd/snap/rollback"].includes(_.name)&&this.imageSpec.toString()===_.metadata.image_spec,(_,r)=>_.name===r.metadata.snapshot_name,this.builders)}ngOnChanges(){this.columns&&(this.imageSpec=new L.N(this.poolName,this.namespace,this.rbdName),this.rbdTableActions&&(this.rbdTableActions.featuresName=this.featuresName),this.taskListService.fetch())}openSnapshotModal(t,o=null){this.modalRef=this.modalService.show(R_,{mirroring:this.mirroring}),this.modalRef.componentInstance.poolName=this.poolName,this.modalRef.componentInstance.imageName=this.rbdName,this.modalRef.componentInstance.namespace=this.namespace,o?this.modalRef.componentInstance.setEditing():o=`${this.rbdName}_${Oe()().toISOString(!0)}`,this.modalRef.componentInstance.setSnapName(o),this.modalRef.componentInstance.onSubmit.subscribe(_=>{const r=new ct.o;r.name=t,r.metadata={image_spec:this.imageSpec.toString(),snapshot_name:_},this.summaryService.addRunningTask(r)})}openCreateSnapshotModal(){this.openSnapshotModal("rbd/snap/create")}openEditSnapshotModal(){this.openSnapshotModal("rbd/snap/edit",this.selection.first().name)}toggleProtection(){const t=this.selection.first().name,o=this.selection.first().is_protected,i=new R.R;i.name="rbd/snap/edit";const _=new L.N(this.poolName,this.namespace,this.rbdName);i.metadata={image_spec:_.toString(),snapshot_name:t},this.rbdService.protectSnapshot(_,t,!o).toPromise().then(()=>{const r=new ct.o;r.name=i.name,r.metadata=i.metadata,this.summaryService.addRunningTask(r),this.taskManagerService.subscribe(i.name,i.metadata,l=>{this.notificationService.notifyTask(l)})})}_asyncTask(t,o,i){const _=new R.R;_.name=o,_.metadata={image_spec:new L.N(this.poolName,this.namespace,this.rbdName).toString(),snapshot_name:i};const r=new L.N(this.poolName,this.namespace,this.rbdName);this.rbdService[t](r,i).toPromise().then(()=>{const l=new ct.o;l.name=_.name,l.metadata=_.metadata,this.summaryService.addRunningTask(l),this.modalRef.close(),this.taskManagerService.subscribe(l.name,l.metadata,d=>{this.notificationService.notifyTask(d)})}).catch(()=>{this.modalRef.componentInstance.stopLoadingSpinner()})}rollbackModal(){const t=this.selection.selected[0].name,o=new L.N(this.poolName,this.namespace,this.rbdName).toString(),i={titleText:"RBD snapshot rollback",buttonText:"Rollback",bodyTpl:this.rollbackTpl,bodyData:{snapName:`${o}@${t}`},onSubmit:()=>{this._asyncTask("rollbackSnapshot","rbd/snap/rollback",t)}};this.modalRef=this.modalService.show(Ft.Y,i)}deleteSnapshotModal(){const t=this.selection.selected[0].name;this.modalRef=this.modalService.show(pe.M,{itemDescription:"RBD snapshot",itemNames:[t],submitAction:()=>this._asyncTask("deleteSnapshot","rbd/snap/delete",t)})}updateSelection(t){this.selection=t}}return n.\u0275fac=function(t){return new(t||n)(e.Y36(oe.j),e.Y36(de.Z),e.Y36($e.$),e.Y36(Ge.N),e.Y36(H),e.Y36(K),e.Y36(vt.k),e.Y36(Le.g),e.Y36(C_.J),e.Y36(ce.j),e.Y36(D.p4),e.Y36(e.sBO))},n.\u0275cmp=e.Xpm({type:n,selectors:[["cd-rbd-snapshot-list"]],viewQuery:function(t,o){if(1&t&&(e.Gf(h_,5),e.Gf(A_,7)),2&t){let i;e.iGM(i=e.CRH())&&(o.nameTpl=i.first),e.iGM(i=e.CRH())&&(o.rollbackTpl=i.first)}},inputs:{snapshots:"snapshots",featuresName:"featuresName",poolName:"poolName",namespace:"namespace",mirroring:"mirroring",primary:"primary",rbdName:"rbdName"},features:[e._Bn([ce.j]),e.TTD],decls:4,vars:5,consts:function(){let s;return s="You are about to rollback",[["columnMode","flex","selectionType","single",3,"data","columns","updateSelection"],[1,"table-actions",3,"permission","selection","tableActions"],["rollbackTpl",""],s]},template:function(t,o){1&t&&(e.TgZ(0,"cd-table",0),e.NdJ("updateSelection",function(_){return o.updateSelection(_)}),e._UZ(1,"cd-table-actions",1),e.qZA(),e.YNc(2,P_,5,1,"ng-template",null,2,e.W1O)),2&t&&(e.Q6J("data",o.data)("columns",o.columns),e.xp6(1),e.Q6J("permission",o.permission)("selection",o.selection)("tableActions",o.tableActions))},directives:[W.a,Re.K],styles:[""],changeDetection:0}),n})();var b_=p(42176),$t=p(76317),N_=p(41039);const F_=["poolConfigurationSourceTpl"];function D_(n,s){1&n&&(e.ynx(0),e.tHW(1,3),e._UZ(2,"strong"),e.N_p(),e.BQk())}function v_(n,s){if(1&n&&(e.TgZ(0,"span")(1,"span",38),e._uU(2),e.qZA()()),2&n){const t=s.$implicit;e.xp6(2),e.Oqu(t)}}function L_(n,s){if(1&n&&(e.TgZ(0,"span")(1,"span",39),e.SDv(2,40),e.qZA()()),2&n){e.oxw(3);const t=e.MAs(1);e.xp6(1),e.Q6J("ngbTooltip",t)}}function $_(n,s){if(1&n&&(e.TgZ(0,"span"),e._uU(1),e.ALo(2,"dimlessBinary"),e.qZA()),2&n){const t=e.oxw(3);e.xp6(1),e.hij(" ",e.lcZ(2,1,t.selection.disk_usage)," ")}}function B_(n,s){if(1&n&&(e.TgZ(0,"span")(1,"span",39),e.SDv(2,41),e.qZA()()),2&n){e.oxw(3);const t=e.MAs(1);e.xp6(1),e.Q6J("ngbTooltip",t)}}function G_(n,s){if(1&n&&(e.TgZ(0,"span"),e._uU(1),e.ALo(2,"dimlessBinary"),e.qZA()),2&n){const t=e.oxw(3);e.xp6(1),e.hij(" ",e.lcZ(2,1,t.selection.total_disk_usage)," ")}}function y_(n,s){if(1&n&&(e.TgZ(0,"span"),e._uU(1),e.qZA()),2&n){const t=e.oxw(4);e.xp6(1),e.hij("/",t.selection.parent.pool_namespace,"")}}function x_(n,s){if(1&n&&(e.TgZ(0,"span"),e._uU(1),e.YNc(2,y_,2,1,"span",1),e._uU(3),e.qZA()),2&n){const t=e.oxw(3);e.xp6(1),e.Oqu(t.selection.parent.pool_name),e.xp6(1),e.Q6J("ngIf",t.selection.parent.pool_namespace),e.xp6(1),e.AsE("/",t.selection.parent.image_name,"@",t.selection.parent.snap_name,"")}}function Z_(n,s){1&n&&(e.TgZ(0,"span"),e._uU(1,"-"),e.qZA())}function w_(n,s){if(1&n&&(e.TgZ(0,"table",17)(1,"tbody")(2,"tr")(3,"td",18),e.SDv(4,19),e.qZA(),e.TgZ(5,"td",20),e._uU(6),e.qZA()(),e.TgZ(7,"tr")(8,"td",21),e.SDv(9,22),e.qZA(),e.TgZ(10,"td"),e._uU(11),e.qZA()(),e.TgZ(12,"tr")(13,"td",21),e.SDv(14,23),e.qZA(),e.TgZ(15,"td"),e._uU(16),e.ALo(17,"empty"),e.qZA()(),e.TgZ(18,"tr")(19,"td",21),e.SDv(20,24),e.qZA(),e.TgZ(21,"td"),e._uU(22),e.ALo(23,"cdDate"),e.qZA()(),e.TgZ(24,"tr")(25,"td",21),e.SDv(26,25),e.qZA(),e.TgZ(27,"td"),e._uU(28),e.ALo(29,"dimlessBinary"),e.qZA()(),e.TgZ(30,"tr")(31,"td",21),e.SDv(32,26),e.qZA(),e.TgZ(33,"td"),e._uU(34),e.ALo(35,"dimless"),e.qZA()(),e.TgZ(36,"tr")(37,"td",21),e.SDv(38,27),e.qZA(),e.TgZ(39,"td"),e._uU(40),e.ALo(41,"dimlessBinary"),e.qZA()(),e.TgZ(42,"tr")(43,"td",21),e.SDv(44,28),e.qZA(),e.TgZ(45,"td"),e.YNc(46,v_,3,1,"span",29),e.qZA()(),e.TgZ(47,"tr")(48,"td",21),e.SDv(49,30),e.qZA(),e.TgZ(50,"td"),e.YNc(51,L_,3,1,"span",1),e.YNc(52,$_,3,3,"span",1),e.qZA()(),e.TgZ(53,"tr")(54,"td",21),e.SDv(55,31),e.qZA(),e.TgZ(56,"td"),e.YNc(57,B_,3,1,"span",1),e.YNc(58,G_,3,3,"span",1),e.qZA()(),e.TgZ(59,"tr")(60,"td",21),e.SDv(61,32),e.qZA(),e.TgZ(62,"td"),e._uU(63),e.ALo(64,"dimlessBinary"),e.qZA()(),e.TgZ(65,"tr")(66,"td",21),e.SDv(67,33),e.qZA(),e.TgZ(68,"td"),e._uU(69),e.qZA()(),e.TgZ(70,"tr")(71,"td",21),e.SDv(72,34),e.qZA(),e.TgZ(73,"td"),e.YNc(74,x_,4,4,"span",1),e.YNc(75,Z_,2,0,"span",1),e.qZA()(),e.TgZ(76,"tr")(77,"td",21),e.SDv(78,35),e.qZA(),e.TgZ(79,"td"),e._uU(80),e.qZA()(),e.TgZ(81,"tr")(82,"td",21),e.SDv(83,36),e.qZA(),e.TgZ(84,"td"),e._uU(85),e.qZA()(),e.TgZ(86,"tr")(87,"td",21),e.SDv(88,37),e.qZA(),e.TgZ(89,"td"),e._uU(90),e.qZA()()()()),2&n){const t=e.oxw(2);e.xp6(6),e.Oqu(t.selection.name),e.xp6(5),e.Oqu(t.selection.pool_name),e.xp6(5),e.Oqu(e.lcZ(17,19,t.selection.data_pool)),e.xp6(6),e.Oqu(e.lcZ(23,21,t.selection.timestamp)),e.xp6(6),e.Oqu(e.lcZ(29,23,t.selection.size)),e.xp6(6),e.Oqu(e.lcZ(35,25,t.selection.num_objs)),e.xp6(6),e.Oqu(e.lcZ(41,27,t.selection.obj_size)),e.xp6(6),e.Q6J("ngForOf",t.selection.features_name),e.xp6(5),e.Q6J("ngIf",-1===(null==t.selection.features_name?null:t.selection.features_name.indexOf("fast-diff"))),e.xp6(1),e.Q6J("ngIf",-1!==(null==t.selection.features_name?null:t.selection.features_name.indexOf("fast-diff"))),e.xp6(5),e.Q6J("ngIf",-1===(null==t.selection.features_name?null:t.selection.features_name.indexOf("fast-diff"))),e.xp6(1),e.Q6J("ngIf",-1!==(null==t.selection.features_name?null:t.selection.features_name.indexOf("fast-diff"))),e.xp6(5),e.Oqu(e.lcZ(64,29,t.selection.stripe_unit)),e.xp6(6),e.Oqu(t.selection.stripe_count),e.xp6(5),e.Q6J("ngIf",t.selection.parent),e.xp6(1),e.Q6J("ngIf",!t.selection.parent),e.xp6(5),e.Oqu(t.selection.block_name_prefix),e.xp6(5),e.Oqu(t.selection.order),e.xp6(5),e.Oqu(t.selection.image_format)}}function H_(n,s){if(1&n&&e._UZ(0,"cd-rbd-snapshot-list",42),2&n){const t=e.oxw(2);e.Q6J("snapshots",t.selection.snapshots)("featuresName",t.selection.features_name)("poolName",t.selection.pool_name)("primary",t.selection.primary)("namespace",t.selection.namespace)("mirroring",t.selection.mirror_mode)("rbdName",t.selection.name)}}function k_(n,s){if(1&n&&e._UZ(0,"cd-rbd-configuration-table",43),2&n){const t=e.oxw(2);e.Q6J("data",t.selection.configuration)}}function q_(n,s){if(1&n&&e._UZ(0,"cd-grafana",44),2&n){const t=e.oxw(2);e.Q6J("grafanaPath",t.rbdDashboardUrl)("type","metrics")}}function K_(n,s){if(1&n&&(e.ynx(0),e.TgZ(1,"nav",4,5),e.ynx(3,6),e.TgZ(4,"a",7),e.SDv(5,8),e.qZA(),e.YNc(6,w_,91,31,"ng-template",9),e.BQk(),e.ynx(7,10),e.TgZ(8,"a",7),e.SDv(9,11),e.qZA(),e.YNc(10,H_,1,7,"ng-template",9),e.BQk(),e.ynx(11,12),e.TgZ(12,"a",7),e.SDv(13,13),e.qZA(),e.YNc(14,k_,1,1,"ng-template",9),e.BQk(),e.ynx(15,14),e.TgZ(16,"a",7),e.SDv(17,15),e.qZA(),e.YNc(18,q_,1,2,"ng-template",9),e.BQk(),e.qZA(),e._UZ(19,"div",16),e.BQk()),2&n){const t=e.MAs(2);e.xp6(19),e.Q6J("ngbNavOutlet",t)}}function X_(n,s){1&n&&(e.ynx(0),e.TgZ(1,"cd-alert-panel",45),e.SDv(2,46),e.qZA(),e.BQk())}function Q_(n,s){1&n&&(e.ynx(0),e.TgZ(1,"strong",49),e.SDv(2,50),e.qZA(),e.BQk())}function z_(n,s){1&n&&(e.TgZ(0,"span",51),e.SDv(1,52),e.qZA())}function J_(n,s){if(1&n&&(e.YNc(0,Q_,3,0,"ng-container",47),e.YNc(1,z_,2,0,"ng-template",null,48,e.W1O)),2&n){const t=s.value,o=e.MAs(2);e.Q6J("ngIf",+t)("ngIfElse",o)}}let Y_=(()=>{class n{ngOnChanges(){this.selection&&(this.rbdDashboardUrl=`rbd-details?var-Pool=${this.selection.pool_name}&var-Image=${this.selection.name}`)}}return n.\u0275fac=function(t){return new(t||n)},n.\u0275cmp=e.Xpm({type:n,selectors:[["cd-rbd-details"]],viewQuery:function(t,o){if(1&t&&(e.Gf(F_,7),e.Gf(v.Pz,7)),2&t){let i;e.iGM(i=e.CRH())&&(o.poolConfigurationSourceTpl=i.first),e.iGM(i=e.CRH())&&(o.nav=i.first)}},inputs:{selection:"selection",images:"images"},features:[e.TTD],decls:6,vars:2,consts:function(){let s,t,o,i,_,r,l,d,u,f,I,P,B,x,q,J,ee,te,w,_e,ae,M,ue,me,ge,Te,fe,Ce,Se;return s="Only available for RBD images with " + "\ufffd#2\ufffd" + "fast-diff" + "\ufffd/#2\ufffd" + " enabled",t="Details",o="Snapshots",i="Configuration",_="Performance",r="Name",l="Pool",d="Data Pool",u="Created",f="Size",I="Objects",P="Object size",B="Features",x="Provisioned",q="Total provisioned",J="Striping unit",ee="Striping count",te="Parent",w="Block name prefix",_e="Order",ae="Format Version",M="N/A",ue="N/A",me="RBD details",ge="Information can not be displayed for RBD in status 'Removing'.",Te="This setting overrides the global value",fe="Image",Ce="This is the global value. No value for this option has been set for this image.",Se="Global",[["usageNotAvailableTooltipTpl",""],[4,"ngIf"],["poolConfigurationSourceTpl",""],s,["ngbNav","","cdStatefulTab","rbd-details",1,"nav-tabs"],["nav","ngbNav"],["ngbNavItem","details"],["ngbNavLink",""],t,["ngbNavContent",""],["ngbNavItem","snapshots"],o,["ngbNavItem","configuration"],i,["ngbNavItem","performance"],_,[3,"ngbNavOutlet"],[1,"table","table-striped","table-bordered"],[1,"bold","w-25"],r,[1,"w-75"],[1,"bold"],l,d,u,f,I,P,B,[4,"ngFor","ngForOf"],x,q,J,ee,te,w,_e,ae,[1,"badge","badge-dark","me-2"],["placement","top",1,"form-text","text-muted",3,"ngbTooltip"],M,ue,[3,"snapshots","featuresName","poolName","primary","namespace","mirroring","rbdName"],[3,"data"],["title",me,"uid","YhCYGcuZz","grafanaStyle","one",3,"grafanaPath","type"],["type","warning"],ge,[4,"ngIf","ngIfElse"],["global",""],["ngbTooltip",Te],fe,["ngbTooltip",Ce],Se]},template:function(t,o){1&t&&(e.YNc(0,D_,3,0,"ng-template",null,0,e.W1O),e.YNc(2,K_,20,1,"ng-container",1),e.YNc(3,X_,3,0,"ng-container",1),e.YNc(4,J_,3,2,"ng-template",null,2,e.W1O)),2&t&&(e.xp6(2),e.Q6J("ngIf",o.selection&&"REMOVING"!==o.selection.source),e.xp6(1),e.Q6J("ngIf",o.selection&&"REMOVING"===o.selection.source))},directives:[c.O5,v.Pz,Ot.m,v.nv,v.Vx,v.uN,c.sg,v._L,I_,b_.P,$t.F,v.tO,St.G],pipes:[N_.W,Ge.N,$e.$,nt.n],styles:[""]}),n})();const V_=["usageTpl"],U_=["parentTpl"],j_=["nameTpl"],W_=["scheduleTpl"],ea=["mirroringTpl"],ta=["flattenTpl"],oa=["deleteTpl"],na=["removingStatTpl"],ia=["provisionedNotAvailableTooltipTpl"],sa=["totalProvisionedNotAvailableTooltipTpl"];function _a(n,s){1&n&&e._UZ(0,"div",13),2&n&&e.Q6J("innerHtml","Only available for RBD images with <strong>fast-diff</strong> enabled",e.oJD)}function aa(n,s){if(1&n&&(e.TgZ(0,"span",16),e.SDv(1,17),e.qZA()),2&n){const t=e.oxw(2);e.Q6J("ngbTooltip",t.usageNotAvailableTooltipTpl)}}function ra(n,s){if(1&n&&(e.SDv(0,18),e.ALo(1,"dimlessBinary")),2&n){const t=e.oxw().row;e.xp6(1),e.pQV(e.lcZ(1,1,t.disk_usage)),e.QtT(0)}}function la(n,s){if(1&n&&(e.YNc(0,aa,2,1,"span",14),e.YNc(1,ra,2,3,"ng-template",null,15,e.W1O)),2&n){const t=s.row,o=e.MAs(2);e.Q6J("ngIf",null===t.disk_usage&&!t.features_name.includes("fast-diff"))("ngIfElse",o)}}function ca(n,s){if(1&n&&(e.TgZ(0,"span",16),e.SDv(1,20),e.qZA()),2&n){const t=e.oxw(2);e.Q6J("ngbTooltip",t.usageNotAvailableTooltipTpl)}}function da(n,s){if(1&n&&(e.SDv(0,21),e.ALo(1,"dimlessBinary")),2&n){const t=e.oxw().row;e.xp6(1),e.pQV(e.lcZ(1,1,t.total_disk_usage)),e.QtT(0)}}function pa(n,s){if(1&n&&(e.YNc(0,ca,2,1,"span",14),e.YNc(1,da,2,3,"ng-template",null,19,e.W1O)),2&n){const t=s.row,o=e.MAs(2);e.Q6J("ngIf",null===t.total_disk_usage&&!t.features_name.includes("fast-diff"))("ngIfElse",o)}}function ua(n,s){if(1&n&&(e.TgZ(0,"span"),e._uU(1),e.qZA()),2&n){const t=e.oxw(2).value;e.xp6(1),e.hij("/",t.pool_namespace,"")}}function ma(n,s){if(1&n&&(e.TgZ(0,"span"),e._uU(1),e.YNc(2,ua,2,1,"span",22),e._uU(3),e.qZA()),2&n){const t=e.oxw().value;e.xp6(1),e.Oqu(t.pool_name),e.xp6(1),e.Q6J("ngIf",t.pool_namespace),e.xp6(1),e.AsE("/",t.image_name,"@",t.snap_name,"")}}function ga(n,s){1&n&&(e.TgZ(0,"span"),e._uU(1,"-"),e.qZA())}function Ta(n,s){if(1&n&&(e.YNc(0,ma,4,4,"span",22),e.YNc(1,ga,2,0,"span",22)),2&n){const t=s.value;e.Q6J("ngIf",t),e.xp6(1),e.Q6J("ngIf",!t)}}function fa(n,s){if(1&n&&(e.TgZ(0,"span",26),e._uU(1),e.qZA()),2&n){const t=e.oxw().value;e.xp6(1),e.Oqu(t[0])}}function Ca(n,s){if(1&n&&(e.TgZ(0,"span",26),e._uU(1),e.qZA()),2&n){const t=e.oxw().value;e.xp6(1),e.Oqu(t[1])}}function Sa(n,s){1&n&&(e.TgZ(0,"span",26),e.SDv(1,27),e.qZA())}function Ea(n,s){1&n&&(e.TgZ(0,"span",26),e.SDv(1,28),e.qZA())}function Ra(n,s){if(1&n&&(e.TgZ(0,"span",26),e._uU(1),e.qZA()),2&n){const t=e.oxw().value;e.xp6(1),e.Oqu(t)}}function Ma(n,s){if(1&n&&(e.YNc(0,fa,2,1,"span",23),e._uU(1,"\xa0 "),e.YNc(2,Ca,2,1,"span",24),e._uU(3,"\xa0 "),e.YNc(4,Sa,2,0,"span",24),e.YNc(5,Ea,2,0,"span",24),e.YNc(6,Ra,2,1,"ng-template",null,25,e.W1O)),2&n){const t=s.value,o=s.row,i=e.MAs(7);e.Q6J("ngIf",3===t.length)("ngIfElse",i),e.xp6(2),e.Q6J("ngIf",3===t.length),e.xp6(2),e.Q6J("ngIf",!0===o.primary),e.xp6(1),e.Q6J("ngIf",!1===o.primary)}}function Oa(n,s){if(1&n&&(e.TgZ(0,"span",26),e._uU(1),e.ALo(2,"cdDate"),e.qZA()),2&n){const t=e.oxw().value;e.xp6(1),e.Oqu(e.lcZ(2,1,t[2]))}}function ha(n,s){1&n&&e.YNc(0,Oa,3,3,"span",24),2&n&&e.Q6J("ngIf",3===s.value.length)}function Aa(n,s){if(1&n&&(e._uU(0," You are about to flatten "),e.TgZ(1,"strong"),e._uU(2),e.qZA(),e._uU(3,". "),e._UZ(4,"br")(5,"br"),e._uU(6," All blocks will be copied from parent "),e.TgZ(7,"strong"),e._uU(8),e.qZA(),e._uU(9," to child "),e.TgZ(10,"strong"),e._uU(11),e.qZA(),e._uU(12,".\n")),2&n){const t=s.$implicit;e.xp6(2),e.Oqu(t.child),e.xp6(6),e.Oqu(t.parent),e.xp6(3),e.Oqu(t.child)}}function Pa(n,s){if(1&n&&(e.TgZ(0,"li"),e._uU(1),e.qZA()),2&n){const t=s.$implicit;e.xp6(1),e.Oqu(t)}}function Ia(n,s){if(1&n&&(e.ynx(0),e.TgZ(1,"span"),e.SDv(2,32),e.qZA(),e.TgZ(3,"ul"),e.YNc(4,Pa,2,1,"li",33),e.qZA(),e.BQk()),2&n){const t=e.oxw(2).snapshots;e.xp6(4),e.Q6J("ngForOf",t)}}function ba(n,s){if(1&n&&(e.TgZ(0,"div",30)(1,"span"),e.SDv(2,31),e.qZA(),e._UZ(3,"br"),e.YNc(4,Ia,5,1,"ng-container",22),e.qZA()),2&n){const t=e.oxw().snapshots;e.xp6(4),e.Q6J("ngIf",t.length>0)}}function Na(n,s){1&n&&e.YNc(0,ba,5,1,"div",29),2&n&&e.Q6J("ngIf",s.hasSnapshots)}const Fa=function(n,s){return[n,s]};function Da(n,s){if(1&n&&e._UZ(0,"i",35),2&n){const t=e.oxw(2);e.Q6J("ngClass",e.WLB(1,Fa,t.icons.spinner,t.icons.spin))}}function va(n,s){if(1&n&&(e.TgZ(0,"span",35),e._uU(1),e.qZA()),2&n){const t=e.oxw(),o=t.column,i=t.row;e.Q6J("ngClass",null!=o&&null!=o.customTemplateConfig&&o.customTemplateConfig.executingClass?o.customTemplateConfig.executingClass:"text-muted italic"),e.xp6(1),e.hij(" (",i.cdExecuting,") ")}}function La(n,s){if(1&n&&e._UZ(0,"i",37),2&n){const t=e.oxw(2);e.Gre("",t.icons.warning," warn")}}function $a(n,s){if(1&n&&(e.YNc(0,Da,1,4,"i",34),e.TgZ(1,"span",35),e._uU(2),e.qZA(),e.YNc(3,va,2,2,"span",34),e.YNc(4,La,1,3,"i",36)),2&n){const t=s.column,o=s.value,i=s.row;e.Q6J("ngIf",i.cdExecuting),e.xp6(1),e.Q6J("ngClass",null==t||null==t.customTemplateConfig?null:t.customTemplateConfig.valueClass),e.xp6(1),e.hij(" ",o," "),e.xp6(1),e.Q6J("ngIf",i.cdExecuting),e.xp6(1),e.Q6J("ngIf",i.source&&"REMOVING"===i.source)}}let Ga=(()=>{class n extends Tt.o{constructor(t,o,i,_,r,l,d,u,f){super(),this.authStorageService=t,this.rbdService=o,this.dimlessBinaryPipe=i,this.dimlessPipe=_,this.modalService=r,this.taskWrapper=l,this.taskListService=d,this.urlBuilder=u,this.actionLabels=f,this.tableStatus=new Nt.c("light"),this.selection=new Ee.r,this.icons=T.P,this.count=0,this.tableContext=null,this.builders={"rbd/create":M=>this.createRbdFromTask(M.pool_name,M.namespace,M.image_name),"rbd/delete":M=>this.createRbdFromTaskImageSpec(M.image_spec),"rbd/clone":M=>this.createRbdFromTask(M.child_pool_name,M.child_namespace,M.child_image_name),"rbd/copy":M=>this.createRbdFromTask(M.dest_pool_name,M.dest_namespace,M.dest_image_name)},this.permission=this.authStorageService.getPermissions().rbdImage;const I=()=>this.selection.first()&&new L.N(this.selection.first().pool_name,this.selection.first().namespace,this.selection.first().name).toStringEncoded();this.tableActions=[{permission:"create",icon:T.P.add,routerLink:()=>this.urlBuilder.getCreate(),canBePrimary:M=>!M.hasSingleSelection,name:this.actionLabels.CREATE},{permission:"update",icon:T.P.edit,routerLink:()=>this.urlBuilder.getEdit(I()),name:this.actionLabels.EDIT,disable:M=>this.getRemovingStatusDesc(M)||this.getInvalidNameDisable(M)},{permission:"create",canBePrimary:M=>M.hasSingleSelection,disable:M=>this.getRemovingStatusDesc(M)||this.getInvalidNameDisable(M)||!!M.first().cdExecuting,icon:T.P.copy,routerLink:()=>`/block/rbd/copy/${I()}`,name:this.actionLabels.COPY},{permission:"update",disable:M=>this.getRemovingStatusDesc(M)||this.getInvalidNameDisable(M)||M.first().cdExecuting||!M.first().parent,icon:T.P.flatten,click:()=>this.flattenRbdModal(),name:this.actionLabels.FLATTEN},{permission:"update",icon:T.P.refresh,click:()=>this.resyncRbdModal(),name:this.actionLabels.RESYNC,disable:M=>this.getResyncDisableDesc(M)},{permission:"delete",icon:T.P.destroy,click:()=>this.deleteRbdModal(),name:this.actionLabels.DELETE,disable:M=>this.getDeleteDisableDesc(M)},{permission:"delete",icon:T.P.trash,click:()=>this.trashRbdModal(),name:this.actionLabels.TRASH,disable:M=>this.getRemovingStatusDesc(M)||this.getInvalidNameDisable(M)||M.first().image_format===Ie.V1},{permission:"update",icon:T.P.edit,click:()=>this.removeSchedulingModal(),name:this.actionLabels.REMOVE_SCHEDULING,disable:M=>this.getRemovingStatusDesc(M)||this.getInvalidNameDisable(M)||void 0===M.first().schedule_info},{permission:"update",icon:T.P.edit,click:()=>this.actionPrimary(!0),name:this.actionLabels.PROMOTE,visible:()=>null!=this.selection.first()&&!this.selection.first().primary},{permission:"update",icon:T.P.edit,click:()=>this.actionPrimary(!1),name:this.actionLabels.DEMOTE,visible:()=>null!=this.selection.first()&&this.selection.first().primary}]}createRbdFromTaskImageSpec(t){const o=L.N.fromString(t);return this.createRbdFromTask(o.poolName,o.namespace,o.imageName)}createRbdFromTask(t,o,i){const _=new ls;return _.id="-1",_.unique_id="-1",_.name=i,_.namespace=o,_.pool_name=t,_.image_format=Ie.V2,_}ngOnInit(){this.columns=[{name:"Name",prop:"name",flexGrow:2,cellTemplate:this.removingStatTpl},{name:"Pool",prop:"pool_name",flexGrow:2},{name:"Namespace",prop:"namespace",flexGrow:2},{name:"Size",prop:"size",flexGrow:1,cellClass:"text-right",sortable:!1,pipe:this.dimlessBinaryPipe},{name:"Objects",prop:"num_objs",flexGrow:1,cellClass:"text-right",sortable:!1,pipe:this.dimlessPipe},{name:"Object size",prop:"obj_size",flexGrow:1,cellClass:"text-right",sortable:!1,pipe:this.dimlessBinaryPipe},{name:"Provisioned",prop:"disk_usage",cellClass:"text-center",flexGrow:1,pipe:this.dimlessBinaryPipe,sortable:!1,cellTemplate:this.provisionedNotAvailableTooltipTpl},{name:"Total provisioned",prop:"total_disk_usage",cellClass:"text-center",flexGrow:1,pipe:this.dimlessBinaryPipe,sortable:!1,cellTemplate:this.totalProvisionedNotAvailableTooltipTpl},{name:"Parent",prop:"parent",flexGrow:2,sortable:!1,cellTemplate:this.parentTpl},{name:"Mirroring",prop:"mirror_mode",flexGrow:3,sortable:!1,cellTemplate:this.mirroringTpl},{name:"Next Scheduled Snapshot",prop:"mirror_mode",flexGrow:3,sortable:!1,cellTemplate:this.scheduleTpl}],this.taskListService.init(i=>this.getRbdImages(i),i=>this.prepareResponse(i),i=>this.images=i,()=>this.onFetchError(),i=>["rbd/clone","rbd/copy","rbd/create","rbd/delete","rbd/edit","rbd/flatten","rbd/trash/move"].includes(i.name),(i,_)=>{let r;switch(_.name){case"rbd/copy":r=new L.N(_.metadata.dest_pool_name,_.metadata.dest_namespace,_.metadata.dest_image_name).toString();break;case"rbd/clone":r=new L.N(_.metadata.child_pool_name,_.metadata.child_namespace,_.metadata.child_image_name).toString();break;case"rbd/create":r=new L.N(_.metadata.pool_name,_.metadata.namespace,_.metadata.image_name).toString();break;default:r=_.metadata.image_spec}return r===new L.N(i.pool_name,i.namespace,i.name).toString()},this.builders)}onFetchError(){this.table.reset(),this.tableStatus=new Nt.c("danger")}getRbdImages(t){var o;return null!==t&&(this.tableContext=t),null==this.tableContext&&(this.tableContext=new h.E(()=>{})),this.rbdService.list(null===(o=this.tableContext)||void 0===o?void 0:o.toParams())}prepareResponse(t){let o=[];return t.forEach(i=>{o=o.concat(i.value)}),o.forEach(i=>{if(void 0!==i.schedule_info){let _=[];const r="scheduled";let l=+new Date(i.schedule_info.schedule_time);const d=(new Date).getTimezoneOffset();l+=6e4*Math.abs(d),_.push(i.mirror_mode,r,l),i.mirror_mode=_,_=[]}}),this.count=o.length>0?r_.getCount(t[0]):0,o}updateSelection(t){this.selection=t}deleteRbdModal(){const t=this.selection.first().pool_name,o=this.selection.first().namespace,i=this.selection.first().name,_=new L.N(t,o,i);this.modalRef=this.modalService.show(pe.M,{itemDescription:"RBD",itemNames:[_],bodyTemplate:this.deleteTpl,bodyContext:{hasSnapshots:this.hasSnapshots(),snapshots:this.listProtectedSnapshots()},submitActionObservable:()=>this.taskWrapper.wrapTaskAroundCall({task:new R.R("rbd/delete",{image_spec:_.toString()}),call:this.rbdService.delete(_)})})}resyncRbdModal(){const t=this.selection.first().pool_name,o=this.selection.first().namespace,i=this.selection.first().name,_=new L.N(t,o,i);this.modalRef=this.modalService.show(pe.M,{itemDescription:"RBD",itemNames:[_],actionDescription:"resync",submitActionObservable:()=>this.taskWrapper.wrapTaskAroundCall({task:new R.R("rbd/edit",{image_spec:_.toString()}),call:this.rbdService.update(_,{resync:!0})})})}trashRbdModal(){const t={poolName:this.selection.first().pool_name,namespace:this.selection.first().namespace,imageName:this.selection.first().name,hasSnapshots:this.hasSnapshots()};this.modalRef=this.modalService.show(g_,t)}flattenRbd(t){this.taskWrapper.wrapTaskAroundCall({task:new R.R("rbd/flatten",{image_spec:t.toString()}),call:this.rbdService.flatten(t)}).subscribe({complete:()=>{this.modalRef.close()}})}flattenRbdModal(){const t=this.selection.first().pool_name,o=this.selection.first().namespace,i=this.selection.first().name,_=this.selection.first().parent,r=new L.N(_.pool_name,_.pool_namespace,_.image_name),l=new L.N(t,o,i),d={titleText:"RBD flatten",buttonText:"Flatten",bodyTpl:this.flattenTpl,bodyData:{parent:`${r}@${_.snap_name}`,child:l.toString()},onSubmit:()=>{this.flattenRbd(l)}};this.modalRef=this.modalService.show(Ft.Y,d)}editRequest(){const t=new at;return t.remove_scheduling=!t.remove_scheduling,t}removeSchedulingModal(){const t=this.selection.first().name,o=new L.N(this.selection.first().pool_name,this.selection.first().namespace,this.selection.first().name);this.modalRef=this.modalService.show(pe.M,{actionDescription:"remove scheduling on",itemDescription:"image",itemNames:[`${t}`],submitActionObservable:()=>new Mt.y(i=>{this.taskWrapper.wrapTaskAroundCall({task:new R.R("rbd/edit",{image_spec:o.toString()}),call:this.rbdService.update(o,this.editRequest())}).subscribe({error:_=>i.error(_),complete:()=>{this.modalRef.close()}})})})}actionPrimary(t){const o=new at;o.primary=t,o.features=null;const i=new L.N(this.selection.first().pool_name,this.selection.first().namespace,this.selection.first().name);this.taskWrapper.wrapTaskAroundCall({task:new R.R("rbd/edit",{image_spec:i.toString()}),call:this.rbdService.update(i,o)}).subscribe()}hasSnapshots(){return(this.selection.first().snapshots||[]).length>0}hasClonedSnapshots(t){return(t.snapshots||[]).some(i=>i.children&&i.children.length>0)}listProtectedSnapshots(){return this.selection.first().snapshots.reduce((i,_)=>(_.is_protected&&i.push(_.name),i),[])}getDeleteDisableDesc(t){const o=t.first();return o&&this.hasClonedSnapshots(o)?"This RBD has cloned snapshots. Please delete related RBDs before deleting this RBD.":this.getInvalidNameDisable(t)||this.hasClonedSnapshots(t.first())}getResyncDisableDesc(t){const o=t.first();return o&&this.imageIsPrimary(o)?"Primary RBD images cannot be resynced":this.getInvalidNameDisable(t)}imageIsPrimary(t){return t.primary}getInvalidNameDisable(t){var o;const i=t.first();return(null===(o=null==i?void 0:i.name)||void 0===o?void 0:o.match(/[@/]/))?"This RBD image has an invalid name and can't be managed by ceph.":!t.first()||!t.hasSingleSelection}getRemovingStatusDesc(t){const o=t.first();return"REMOVING"===(null==o?void 0:o.source)&&"Action not possible for an RBD in status 'Removing'"}}return n.\u0275fac=function(t){return new(t||n)(e.Y36(oe.j),e.Y36(H),e.Y36($e.$),e.Y36(nt.n),e.Y36(de.Z),e.Y36(m.P),e.Y36(ce.j),e.Y36(rt.F),e.Y36(D.p4))},n.\u0275cmp=e.Xpm({type:n,selectors:[["cd-rbd-list"]],viewQuery:function(t,o){if(1&t&&(e.Gf(W.a,7),e.Gf(V_,5),e.Gf(U_,7),e.Gf(j_,5),e.Gf(W_,7),e.Gf(ea,7),e.Gf(ta,7),e.Gf(oa,7),e.Gf(na,7),e.Gf(ia,7),e.Gf(sa,7)),2&t){let i;e.iGM(i=e.CRH())&&(o.table=i.first),e.iGM(i=e.CRH())&&(o.usageTpl=i.first),e.iGM(i=e.CRH())&&(o.parentTpl=i.first),e.iGM(i=e.CRH())&&(o.nameTpl=i.first),e.iGM(i=e.CRH())&&(o.scheduleTpl=i.first),e.iGM(i=e.CRH())&&(o.mirroringTpl=i.first),e.iGM(i=e.CRH())&&(o.flattenTpl=i.first),e.iGM(i=e.CRH())&&(o.deleteTpl=i.first),e.iGM(i=e.CRH())&&(o.removingStatTpl=i.first),e.iGM(i=e.CRH())&&(o.provisionedNotAvailableTooltipTpl=i.first),e.iGM(i=e.CRH())&&(o.totalProvisionedNotAvailableTooltipTpl=i.first)}},features:[e._Bn([ce.j,{provide:rt.F,useValue:new rt.F("block/rbd")}]),e.qOj],decls:23,vars:13,consts:function(){let s,t,o,i,_,r,l,d,u;return s="N/A",t="" + "\ufffd0\ufffd" + "",o="N/A",i="" + "\ufffd0\ufffd" + "",_="primary",r="secondary",l="Deleting this image will also delete all its snapshots.",d="The following snapshots are currently protected and will be removed:",u="RBD in status 'Removing'",[["columnMode","flex","identifier","unique_id","forceIdentifier","true","selectionType","single",3,"data","columns","searchableObjects","serverSide","count","hasDetails","status","maxLimit","autoReload","fetchData","setExpandedRow","updateSelection"],["table",""],[1,"table-actions",3,"permission","selection","tableActions"],["cdTableDetail","",3,"selection"],["scheduleStatus",""],["provisionedNotAvailableTooltipTpl",""],["totalProvisionedNotAvailableTooltipTpl",""],["parentTpl",""],["mirroringTpl",""],["scheduleTpl",""],["flattenTpl",""],["deleteTpl",""],["removingStatTpl",""],[3,"innerHtml"],["placement","top",3,"ngbTooltip",4,"ngIf","ngIfElse"],["provisioned",""],["placement","top",3,"ngbTooltip"],s,t,["totalProvisioned",""],o,i,[4,"ngIf"],["class","badge badge-info",4,"ngIf","ngIfElse"],["class","badge badge-info",4,"ngIf"],["probb",""],[1,"badge","badge-info"],_,r,["class","alert alert-warning","role","alert",4,"ngIf"],["role","alert",1,"alert","alert-warning"],l,d,[4,"ngFor","ngForOf"],[3,"ngClass",4,"ngIf"],[3,"ngClass"],["title",u,3,"class",4,"ngIf"],["title",u]]},template:function(t,o){1&t&&(e._UZ(0,"cd-rbd-tabs"),e.TgZ(1,"cd-table",0,1),e.NdJ("fetchData",function(_){return o.taskListService.fetch(_)})("setExpandedRow",function(_){return o.setExpandedRow(_)})("updateSelection",function(_){return o.updateSelection(_)}),e._UZ(3,"cd-table-actions",2)(4,"cd-rbd-details",3),e.qZA(),e.YNc(5,_a,1,1,"ng-template",null,4,e.W1O),e.YNc(7,la,3,2,"ng-template",null,5,e.W1O),e.YNc(9,pa,3,2,"ng-template",null,6,e.W1O),e.YNc(11,Ta,2,2,"ng-template",null,7,e.W1O),e.YNc(13,Ma,8,5,"ng-template",null,8,e.W1O),e.YNc(15,ha,1,1,"ng-template",null,9,e.W1O),e.YNc(17,Aa,13,3,"ng-template",null,10,e.W1O),e.YNc(19,Na,1,1,"ng-template",null,11,e.W1O),e.YNc(21,$a,5,5,"ng-template",null,12,e.W1O)),2&t&&(e.xp6(1),e.Q6J("data",o.images)("columns",o.columns)("searchableObjects",!0)("serverSide",!0)("count",o.count)("hasDetails",!0)("status",o.tableStatus)("maxLimit",25)("autoReload",-1),e.xp6(2),e.Q6J("permission",o.permission)("selection",o.selection)("tableActions",o.tableActions),e.xp6(1),e.Q6J("selection",o.expandedRow))},directives:[et,W.a,Re.K,Y_,c.O5,v._L,c.sg,c.mk],pipes:[$e.$,Ge.N],styles:[".warn[_ngcontent-%COMP%]{color:#d48200}"]}),n})();function ya(n,s){1&n&&e._UZ(0,"input",19)}function xa(n,s){1&n&&(e.TgZ(0,"option",23),e.SDv(1,24),e.qZA()),2&n&&e.Q6J("ngValue",null)}function Za(n,s){1&n&&(e.TgZ(0,"option",23),e.SDv(1,25),e.qZA()),2&n&&e.Q6J("ngValue",null)}function wa(n,s){1&n&&(e.TgZ(0,"option",23),e.SDv(1,26),e.qZA()),2&n&&e.Q6J("ngValue",null)}function Ha(n,s){if(1&n&&(e.TgZ(0,"option",27),e._uU(1),e.qZA()),2&n){const t=s.$implicit;e.Q6J("value",t.pool_name),e.xp6(1),e.Oqu(t.pool_name)}}function ka(n,s){if(1&n&&(e.TgZ(0,"select",20),e.YNc(1,xa,2,1,"option",21),e.YNc(2,Za,2,1,"option",21),e.YNc(3,wa,2,1,"option",21),e.YNc(4,Ha,2,2,"option",22),e.qZA()),2&n){const t=e.oxw();e.xp6(1),e.Q6J("ngIf",null===t.pools),e.xp6(1),e.Q6J("ngIf",null!==t.pools&&0===t.pools.length),e.xp6(1),e.Q6J("ngIf",null!==t.pools&&t.pools.length>0),e.xp6(1),e.Q6J("ngForOf",t.pools)}}function qa(n,s){1&n&&(e.TgZ(0,"span",28),e.SDv(1,29),e.qZA())}function Ka(n,s){1&n&&(e.TgZ(0,"span",28),e.SDv(1,30),e.qZA())}function Xa(n,s){1&n&&(e.TgZ(0,"span",28),e.SDv(1,31),e.qZA())}let Qa=(()=>{class n{constructor(t,o,i,_,r,l){this.activeModal=t,this.actionLabels=o,this.authStorageService=i,this.notificationService=_,this.poolService=r,this.rbdService=l,this.pools=null,this.editing=!1,this.poolPermission=this.authStorageService.getPermissions().pool,this.createForm()}createForm(){this.namespaceForm=new Z.d({pool:new a.NI(""),namespace:new a.NI("")},this.validator(),this.asyncValidator())}validator(){return t=>{const o=t.get("pool"),i=t.get("namespace");let _=null;o.value||(_={required:!0}),o.setErrors(_);let r=null;return i.value||(r={required:!0}),i.setErrors(r),null}}asyncValidator(){return t=>new Promise(o=>{const i=t.get("pool"),_=t.get("namespace");this.rbdService.listNamespaces(i.value).subscribe(r=>{if(r.some(l=>l.namespace===_.value)){const l={namespaceExists:!0};_.setErrors(l),o(l)}else o(null)})})}ngOnInit(){this.onSubmit=new Lt.xQ,this.poolPermission.read&&this.poolService.list(["pool_name","type","application_metadata"]).then(t=>{const o=[];for(const i of t)this.rbdService.isRBDPool(i)&&"replicated"===i.type&&o.push(i);if(this.pools=o,1===this.pools.length){const i=this.pools[0].pool_name;this.namespaceForm.get("pool").setValue(i)}})}submit(){const t=this.namespaceForm.getValue("pool"),o=this.namespaceForm.getValue("namespace"),i=new R.R;i.name="rbd/namespace/create",i.metadata={pool:t,namespace:o},this.rbdService.createNamespace(t,o).toPromise().then(()=>{this.notificationService.show(ot.k.success,"Created namespace '" + t + "/" + o + "'"),this.activeModal.close(),this.onSubmit.next()}).catch(()=>{this.namespaceForm.setErrors({cdSubmitButton:!0})})}}return n.\u0275fac=function(t){return new(t||n)(e.Y36(v.Kz),e.Y36(D.p4),e.Y36(oe.j),e.Y36(Le.g),e.Y36(Ve.q),e.Y36(H))},n.\u0275cmp=e.Xpm({type:n,selectors:[["cd-rbd-namespace-form-modal"]],decls:23,vars:9,consts:function(){let s,t,o,i,_,r,l,d,u;return s="Create Namespace",t="Pool",o="Name",i="Loading...",_="-- No rbd pools available --",r="-- Select a pool --",l="This field is required.",d="This field is required.",u="Namespace already exists.",[[3,"modalRef"],[1,"modal-title"],s,[1,"modal-content"],["name","namespaceForm","novalidate","",3,"formGroup"],["formDir","ngForm"],[1,"modal-body"],[1,"form-group","row"],["for","pool",1,"cd-col-form-label","required"],t,[1,"cd-col-form-input"],["class","form-control","type","text","placeholder","Pool name...","id","pool","name","pool","formControlName","pool",4,"ngIf"],["id","pool","name","pool","class","form-select","formControlName","pool",4,"ngIf"],["class","invalid-feedback",4,"ngIf"],["for","namespace",1,"cd-col-form-label","required"],o,["type","text","placeholder","Namespace name...","id","namespace","name","namespace","formControlName","namespace","autofocus","",1,"form-control"],[1,"modal-footer"],[3,"form","submitText","submitActionEvent"],["type","text","placeholder","Pool name...","id","pool","name","pool","formControlName","pool",1,"form-control"],["id","pool","name","pool","formControlName","pool",1,"form-select"],[3,"ngValue",4,"ngIf"],[3,"value",4,"ngFor","ngForOf"],[3,"ngValue"],i,_,r,[3,"value"],[1,"invalid-feedback"],l,d,u]},template:function(t,o){if(1&t&&(e.TgZ(0,"cd-modal",0),e.ynx(1,1),e.SDv(2,2),e.BQk(),e.ynx(3,3),e.TgZ(4,"form",4,5)(6,"div",6)(7,"div",7)(8,"label",8),e.SDv(9,9),e.qZA(),e.TgZ(10,"div",10),e.YNc(11,ya,1,0,"input",11),e.YNc(12,ka,5,4,"select",12),e.YNc(13,qa,2,0,"span",13),e.qZA()(),e.TgZ(14,"div",7)(15,"label",14),e.SDv(16,15),e.qZA(),e.TgZ(17,"div",10),e._UZ(18,"input",16),e.YNc(19,Ka,2,0,"span",13),e.YNc(20,Xa,2,0,"span",13),e.qZA()()(),e.TgZ(21,"div",17)(22,"cd-form-button-panel",18),e.NdJ("submitActionEvent",function(){return o.submit()}),e.qZA()()(),e.BQk(),e.qZA()),2&t){const i=e.MAs(5);e.Q6J("modalRef",o.activeModal),e.xp6(4),e.Q6J("formGroup",o.namespaceForm),e.xp6(7),e.Q6J("ngIf",!o.poolPermission.read),e.xp6(1),e.Q6J("ngIf",o.poolPermission.read),e.xp6(1),e.Q6J("ngIf",o.namespaceForm.showError("pool",i,"required")),e.xp6(6),e.Q6J("ngIf",o.namespaceForm.showError("namespace",i,"required")),e.xp6(1),e.Q6J("ngIf",o.namespaceForm.showError("namespace",i,"namespaceExists")),e.xp6(2),e.Q6J("form",o.namespaceForm)("submitText",o.actionLabels.CREATE)}},directives:[C.z,a._Y,a.JL,a.sg,A.V,O.P,c.O5,$.o,a.Fj,X.b,a.JJ,a.u,a.EJ,a.YN,a.Kr,c.sg,Me.U,j.p],styles:[""]}),n})(),za=(()=>{class n{constructor(t,o,i,_,r,l){this.authStorageService=t,this.rbdService=o,this.poolService=i,this.modalService=_,this.notificationService=r,this.actionLabels=l,this.selection=new Ee.r,this.permission=this.authStorageService.getPermissions().rbdImage,this.tableActions=[{permission:"create",icon:T.P.add,click:()=>this.createModal(),name:this.actionLabels.CREATE},{permission:"delete",icon:T.P.destroy,click:()=>this.deleteModal(),name:this.actionLabels.DELETE,disable:()=>this.getDeleteDisableDesc()}]}ngOnInit(){this.columns=[{name:"Namespace",prop:"namespace",flexGrow:1},{name:"Pool",prop:"pool",flexGrow:1},{name:"Total images",prop:"num_images",flexGrow:1}],this.refresh()}refresh(){this.poolService.list(["pool_name","type","application_metadata"]).then(t=>{t=t.filter(i=>this.rbdService.isRBDPool(i)&&"replicated"===i.type);const o=[];t.forEach(i=>{o.push(this.rbdService.listNamespaces(i.pool_name))}),o.length>0?(0,le.D)(o).subscribe(i=>{const _=[];for(let r=0;r<i.length;r++){const d=t[r].pool_name;i[r].forEach(u=>{_.push({id:`${d}/${u.namespace}`,pool:d,namespace:u.namespace,num_images:u.num_images})})}this.namespaces=_}):this.namespaces=[]})}updateSelection(t){this.selection=t}createModal(){this.modalRef=this.modalService.show(Qa),this.modalRef.componentInstance.onSubmit.subscribe(()=>{this.refresh()})}deleteModal(){const t=this.selection.first().pool,o=this.selection.first().namespace;this.modalRef=this.modalService.show(pe.M,{itemDescription:"Namespace",itemNames:[`${t}/${o}`],submitAction:()=>this.rbdService.deleteNamespace(t,o).subscribe(()=>{this.notificationService.show(ot.k.success,"Deleted namespace '" + t + "/" + o + "'"),this.modalRef.close(),this.refresh()},()=>{this.modalRef.componentInstance.stopLoadingSpinner()})})}getDeleteDisableDesc(){var t;const o=this.selection.first();return(null==o?void 0:o.num_images)>0?"Namespace contains images":!(null===(t=this.selection)||void 0===t?void 0:t.first())}}return n.\u0275fac=function(t){return new(t||n)(e.Y36(oe.j),e.Y36(H),e.Y36(Ve.q),e.Y36(de.Z),e.Y36(Le.g),e.Y36(D.p4))},n.\u0275cmp=e.Xpm({type:n,selectors:[["cd-rbd-namespace-list"]],features:[e._Bn([ce.j])],decls:4,vars:5,consts:[["columnMode","flex","identifier","id","forceIdentifier","true","selectionType","single",3,"data","columns","fetchData","updateSelection"],[1,"table-actions","btn-toolbar"],[1,"btn-group",3,"permission","selection","tableActions"]],template:function(t,o){1&t&&(e._UZ(0,"cd-rbd-tabs"),e.TgZ(1,"cd-table",0),e.NdJ("fetchData",function(){return o.refresh()})("updateSelection",function(_){return o.updateSelection(_)}),e.TgZ(2,"div",1),e._UZ(3,"cd-table-actions",2),e.qZA()()),2&t&&(e.xp6(1),e.Q6J("data",o.namespaces)("columns",o.columns),e.xp6(2),e.Q6J("permission",o.permission)("selection",o.selection)("tableActions",o.tableActions))},directives:[et,W.a,Re.K],styles:[""]}),n})(),Ja=(()=>{class n{}return n.\u0275fac=function(t){return new(t||n)},n.\u0275cmp=e.Xpm({type:n,selectors:[["cd-rbd-performance"]],decls:2,vars:2,consts:function(){let s;return s="RBD overview",[["title",s,"uid","41FrpeUiz","grafanaStyle","two",3,"grafanaPath","type"]]},template:function(t,o){1&t&&e._UZ(0,"cd-rbd-tabs")(1,"cd-grafana",0),2&t&&(e.xp6(1),e.Q6J("grafanaPath","rbd-overview?")("type","metrics"))},directives:[et,$t.F],styles:[""]}),n})();var Ya=p(91801);function Va(n,s){1&n&&e._UZ(0,"input",15)}function Ua(n,s){if(1&n&&(e.TgZ(0,"option",20),e._uU(1),e.qZA()),2&n){const t=s.$implicit;e.Q6J("value",t),e.xp6(1),e.Oqu(t)}}function ja(n,s){if(1&n&&(e.TgZ(0,"select",16)(1,"option",17),e.SDv(2,18),e.qZA(),e.YNc(3,Ua,2,2,"option",19),e.qZA()),2&n){const t=e.oxw();e.xp6(3),e.Q6J("ngForOf",t.pools)}}let Wa=(()=>{class n{constructor(t,o,i,_,r,l,d){this.authStorageService=t,this.rbdService=o,this.activeModal=i,this.actionLabels=_,this.fb=r,this.poolService=l,this.taskWrapper=d,this.poolPermission=this.authStorageService.getPermissions().pool}createForm(){this.purgeForm=this.fb.group({poolName:""})}ngOnInit(){this.poolPermission.read&&this.poolService.list(["pool_name","application_metadata"]).then(t=>{this.pools=t.filter(o=>o.application_metadata.includes("rbd")).map(o=>o.pool_name)}),this.createForm()}purge(){const t=this.purgeForm.getValue("poolName")||"";this.taskWrapper.wrapTaskAroundCall({task:new R.R("rbd/trash/purge",{pool_name:t}),call:this.rbdService.purgeTrash(t)}).subscribe({error:()=>{this.purgeForm.setErrors({cdSubmitButton:!0})},complete:()=>{this.activeModal.close()}})}}return n.\u0275fac=function(t){return new(t||n)(e.Y36(oe.j),e.Y36(H),e.Y36(v.Kz),e.Y36(D.p4),e.Y36(lt.O),e.Y36(Ve.q),e.Y36(m.P))},n.\u0275cmp=e.Xpm({type:n,selectors:[["cd-rbd-trash-purge-modal"]],decls:18,vars:6,consts:function(){let s,t,o,i,_;return s="Purge Trash",t="To purge, select\xA0 " + "[\ufffd#9\ufffd|\ufffd#10\ufffd]" + "All" + "[\ufffd/#9\ufffd|\ufffd/#10\ufffd]" + "\xA0 or one pool and click\xA0 " + "[\ufffd#9\ufffd|\ufffd#10\ufffd]" + "Purge" + "[\ufffd/#9\ufffd|\ufffd/#10\ufffd]" + ".\xA0",t=e.Zx4(t),o="Pool:",i="Pool name...",_="All",[[3,"modalRef"],[1,"modal-title"],s,[1,"modal-content"],["name","purgeForm","novalidate","",1,"form",3,"formGroup"],["formDir","ngForm"],[1,"modal-body"],t,[1,"form-group"],[1,"col-form-label","mx-auto"],o,["class","form-control","type","text","placeholder",i,"formControlName","poolName",4,"ngIf"],["id","poolName","name","poolName","class","form-control","formControlName","poolName",4,"ngIf"],[1,"modal-footer"],[3,"form","submitText","submitActionEvent"],["type","text","placeholder",i,"formControlName","poolName",1,"form-control"],["id","poolName","name","poolName","formControlName","poolName",1,"form-control"],["value",""],_,[3,"value",4,"ngFor","ngForOf"],[3,"value"]]},template:function(t,o){1&t&&(e.TgZ(0,"cd-modal",0),e.ynx(1,1),e.SDv(2,2),e.BQk(),e.ynx(3,3),e.TgZ(4,"form",4,5)(6,"div",6)(7,"p"),e.tHW(8,7),e._UZ(9,"kbd")(10,"kbd"),e.N_p(),e.qZA(),e.TgZ(11,"div",8)(12,"label",9),e.SDv(13,10),e.qZA(),e.YNc(14,Va,1,0,"input",11),e.YNc(15,ja,4,1,"select",12),e.qZA()(),e.TgZ(16,"div",13)(17,"cd-form-button-panel",14),e.NdJ("submitActionEvent",function(){return o.purge()}),e.qZA()()(),e.BQk(),e.qZA()),2&t&&(e.Q6J("modalRef",o.activeModal),e.xp6(4),e.Q6J("formGroup",o.purgeForm),e.xp6(10),e.Q6J("ngIf",!o.poolPermission.read),e.xp6(1),e.Q6J("ngIf",o.poolPermission.read),e.xp6(2),e.Q6J("form",o.purgeForm)("submitText",o.actionLabels.PURGE))},directives:[C.z,a._Y,a.JL,a.sg,A.V,O.P,c.O5,$.o,a.Fj,X.b,a.JJ,a.u,a.EJ,a.YN,a.Kr,c.sg,j.p],styles:[""]}),n})();function er(n,s){1&n&&(e.TgZ(0,"span",15),e.SDv(1,16),e.qZA())}let tr=(()=>{class n{constructor(t,o,i,_,r){this.rbdService=t,this.activeModal=o,this.actionLabels=i,this.fb=_,this.taskWrapper=r}ngOnInit(){this.imageSpec=new L.N(this.poolName,this.namespace,this.imageName).toString(),this.restoreForm=this.fb.group({name:this.imageName})}restore(){const t=this.restoreForm.getValue("name"),o=new L.N(this.poolName,this.namespace,this.imageId);this.taskWrapper.wrapTaskAroundCall({task:new R.R("rbd/trash/restore",{image_id_spec:o.toString(),new_image_name:t}),call:this.rbdService.restoreTrash(o,t)}).subscribe({error:()=>{this.restoreForm.setErrors({cdSubmitButton:!0})},complete:()=>{this.activeModal.close()}})}}return n.\u0275fac=function(t){return new(t||n)(e.Y36(H),e.Y36(v.Kz),e.Y36(D.p4),e.Y36(lt.O),e.Y36(m.P))},n.\u0275cmp=e.Xpm({type:n,selectors:[["cd-rbd-trash-restore-modal"]],decls:18,vars:7,consts:function(){let s,t,o,i;return s="Restore Image",t="To restore\xA0 " + "[\ufffd#9\ufffd|\ufffd#10\ufffd]" + "" + "\ufffd0\ufffd" + "@" + "\ufffd1\ufffd" + "" + "[\ufffd/#9\ufffd|\ufffd/#10\ufffd]" + ",\xA0 type the image's new name and click\xA0 " + "[\ufffd#9\ufffd|\ufffd#10\ufffd]" + "Restore" + "[\ufffd/#9\ufffd|\ufffd/#10\ufffd]" + ".",t=e.Zx4(t),o="New Name",i="This field is required.",[[3,"modalRef"],[1,"modal-title"],s,[1,"modal-content"],["name","restoreForm","novalidate","",1,"form",3,"formGroup"],["formDir","ngForm"],[1,"modal-body"],t,[1,"form-group"],["for","name",1,"col-form-label"],o,["type","text","name","name","id","name","autocomplete","off","formControlName","name","autofocus","",1,"form-control"],["class","invalid-feedback",4,"ngIf"],[1,"modal-footer"],[3,"form","submitText","submitActionEvent"],[1,"invalid-feedback"],i]},template:function(t,o){if(1&t&&(e.TgZ(0,"cd-modal",0),e.ynx(1,1),e.SDv(2,2),e.BQk(),e.ynx(3,3),e.TgZ(4,"form",4,5)(6,"div",6)(7,"p"),e.tHW(8,7),e._UZ(9,"kbd")(10,"kbd"),e.N_p(),e.qZA(),e.TgZ(11,"div",8)(12,"label",9),e.SDv(13,10),e.qZA(),e._UZ(14,"input",11),e.YNc(15,er,2,0,"span",12),e.qZA()(),e.TgZ(16,"div",13)(17,"cd-form-button-panel",14),e.NdJ("submitActionEvent",function(){return o.restore()}),e.qZA()()(),e.BQk(),e.qZA()),2&t){const i=e.MAs(5);e.Q6J("modalRef",o.activeModal),e.xp6(4),e.Q6J("formGroup",o.restoreForm),e.xp6(6),e.pQV(o.imageSpec)(o.imageId),e.QtT(8),e.xp6(5),e.Q6J("ngIf",o.restoreForm.showError("name",i,"required")),e.xp6(2),e.Q6J("form",o.restoreForm)("submitText",o.actionLabels.RESTORE)}},directives:[C.z,a._Y,a.JL,a.sg,A.V,O.P,$.o,a.Fj,X.b,a.JJ,a.u,Me.U,c.O5,j.p],styles:[""]}),n})();const or=["expiresTpl"],nr=["deleteTpl"],ir=function(n){return[n]};function sr(n,s){if(1&n){const t=e.EpF();e.TgZ(0,"button",6),e.NdJ("click",function(){return e.CHM(t),e.oxw().purgeModal()}),e._UZ(1,"i",7),e.ynx(2),e.SDv(3,8),e.BQk(),e.qZA()}if(2&n){const t=e.oxw();e.Q6J("disabled",t.disablePurgeBtn),e.xp6(1),e.Q6J("ngClass",e.VKq(2,ir,t.icons.destroy))}}function _r(n,s){1&n&&(e.ynx(0),e.SDv(1,10),e.BQk())}function ar(n,s){1&n&&(e.ynx(0),e.SDv(1,11),e.BQk())}function rr(n,s){if(1&n&&(e.YNc(0,_r,2,0,"ng-container",9),e.YNc(1,ar,2,0,"ng-container",9),e._uU(2),e.ALo(3,"cdDate")),2&n){const t=s.row,o=s.value;e.Q6J("ngIf",t.cdIsExpired),e.xp6(1),e.Q6J("ngIf",!t.cdIsExpired),e.xp6(1),e.hij(" ",e.lcZ(3,3,o),"\n")}}function lr(n,s){if(1&n&&(e.TgZ(0,"p",13)(1,"strong"),e.ynx(2),e.SDv(3,14),e.ALo(4,"cdDate"),e.BQk(),e.qZA()()),2&n){const t=e.oxw().expiresAt;e.xp6(4),e.pQV(e.lcZ(4,1,t)),e.QtT(3)}}function cr(n,s){1&n&&e.YNc(0,lr,5,3,"p",12),2&n&&e.Q6J("ngIf",!s.isExpired)}let dr=(()=>{class n{constructor(t,o,i,_,r,l,d){this.authStorageService=t,this.rbdService=o,this.modalService=i,this.cdDatePipe=_,this.taskListService=r,this.taskWrapper=l,this.actionLabels=d,this.icons=T.P,this.executingTasks=[],this.selection=new Ee.r,this.tableStatus=new se.E,this.disablePurgeBtn=!0,this.permission=this.authStorageService.getPermissions().rbdImage,this.tableActions=[{permission:"update",icon:T.P.undo,click:()=>this.restoreModal(),name:this.actionLabels.RESTORE},{permission:"delete",icon:T.P.destroy,click:()=>this.deleteModal(),name:this.actionLabels.DELETE}]}ngOnInit(){this.columns=[{name:"ID",prop:"id",flexGrow:1,cellTransformation:ve.e.executing},{name:"Name",prop:"name",flexGrow:1},{name:"Pool",prop:"pool_name",flexGrow:1},{name:"Namespace",prop:"namespace",flexGrow:1},{name:"Status",prop:"deferment_end_time",flexGrow:1,cellTemplate:this.expiresTpl},{name:"Deleted At",prop:"deletion_time",flexGrow:1,pipe:this.cdDatePipe}],this.taskListService.init(()=>this.rbdService.listTrash(),i=>this.prepareResponse(i),i=>this.images=i,()=>this.onFetchError(),i=>["rbd/trash/remove","rbd/trash/restore"].includes(i.name),(i,_)=>new L.N(i.pool_name,i.namespace,i.id).toString()===_.metadata.image_id_spec,void 0)}prepareResponse(t){let o=[];const i={};let _;if(t.forEach(r=>{S().isUndefined(i[r.status])&&(i[r.status]=[]),i[r.status].push(r.pool_name),o=o.concat(r.value),this.disablePurgeBtn=!o.length}),i[3]?_=3:i[1]?_=1:i[2]&&(_=2),_){const r=(i[_].length>1?"pools ":"pool ")+i[_].join();this.tableStatus=new se.E(_,r)}else this.tableStatus=new se.E;return o.forEach(r=>{r.cdIsExpired=Oe()().isAfter(r.deferment_end_time)}),o}onFetchError(){this.table.reset(),this.tableStatus=new se.E(Ya.T.ValueException)}updateSelection(t){this.selection=t}restoreModal(){const t={poolName:this.selection.first().pool_name,namespace:this.selection.first().namespace,imageName:this.selection.first().name,imageId:this.selection.first().id};this.modalRef=this.modalService.show(tr,t)}deleteModal(){const t=this.selection.first().pool_name,o=this.selection.first().namespace,i=this.selection.first().id,_=this.selection.first().deferment_end_time,r=Oe()().isAfter(_),l=new L.N(t,o,i);this.modalRef=this.modalService.show(pe.M,{itemDescription:"RBD",itemNames:[l],bodyTemplate:this.deleteTpl,bodyContext:{expiresAt:_,isExpired:r},submitActionObservable:()=>this.taskWrapper.wrapTaskAroundCall({task:new R.R("rbd/trash/remove",{image_id_spec:l.toString()}),call:this.rbdService.removeTrash(l,!0)})})}purgeModal(){this.modalService.show(Wa)}}return n.\u0275fac=function(t){return new(t||n)(e.Y36(oe.j),e.Y36(H),e.Y36(de.Z),e.Y36(Ge.N),e.Y36(ce.j),e.Y36(m.P),e.Y36(D.p4))},n.\u0275cmp=e.Xpm({type:n,selectors:[["cd-rbd-trash-list"]],viewQuery:function(t,o){if(1&t&&(e.Gf(W.a,7),e.Gf(or,7),e.Gf(nr,7)),2&t){let i;e.iGM(i=e.CRH())&&(o.table=i.first),e.iGM(i=e.CRH())&&(o.expiresTpl=i.first),e.iGM(i=e.CRH())&&(o.deleteTpl=i.first)}},features:[e._Bn([ce.j])],decls:9,vars:8,consts:function(){let s,t,o,i;return s="Purge Trash",t="Expired at",o="Protected until",i="This image is protected until " + "\ufffd0\ufffd" + ".",[["columnMode","flex","identifier","id","forceIdentifier","true","selectionType","single",3,"data","columns","status","autoReload","fetchData","updateSelection"],[1,"table-actions","btn-toolbar"],[1,"btn-group",3,"permission","selection","tableActions"],["class","btn btn-light","type","button",3,"disabled","click",4,"ngIf"],["expiresTpl",""],["deleteTpl",""],["type","button",1,"btn","btn-light",3,"disabled","click"],["aria-hidden","true",3,"ngClass"],s,[4,"ngIf"],t,o,["class","text-danger",4,"ngIf"],[1,"text-danger"],i]},template:function(t,o){1&t&&(e._UZ(0,"cd-rbd-tabs"),e.TgZ(1,"cd-table",0),e.NdJ("fetchData",function(){return o.taskListService.fetch()})("updateSelection",function(_){return o.updateSelection(_)}),e.TgZ(2,"div",1),e._UZ(3,"cd-table-actions",2),e.YNc(4,sr,4,4,"button",3),e.qZA()(),e.YNc(5,rr,4,5,"ng-template",null,4,e.W1O),e.YNc(7,cr,1,1,"ng-template",null,5,e.W1O)),2&t&&(e.xp6(1),e.Q6J("data",o.images)("columns",o.columns)("status",o.tableStatus)("autoReload",-1),e.xp6(2),e.Q6J("permission",o.permission)("selection",o.selection)("tableActions",o.tableActions),e.xp6(1),e.Q6J("ngIf",o.permission.delete))},directives:[et,W.a,Re.K,c.O5,$.o,c.mk],pipes:[Ge.N],styles:[""]}),n})(),Bt=(()=>{class n{}return n.\u0275fac=function(t){return new(t||n)},n.\u0275mod=e.oAB({type:n}),n.\u0275inj=e.cJS({imports:[[c.ez,ii,a.u5,a.UX,v.Oz,v.dT,v.HK,be.b,Ae.m,g.Bz,ne.xc]]}),n})();const pr=[{path:"",redirectTo:"rbd",pathMatch:"full"},{path:"rbd",canActivate:[U.T,re.P],data:{moduleStatusGuardConfig:{uiApiPath:"block/rbd",redirectTo:"error",header:"No RBD pools available",button_name:"Create RBD pool",button_route:"/pool/create"},breadcrumbs:"Images"},children:[{path:"",component:Ga},{path:"namespaces",component:za,data:{breadcrumbs:"Namespaces"}},{path:"trash",component:dr,data:{breadcrumbs:"Trash"}},{path:"performance",component:Ja,data:{breadcrumbs:"Overall Performance"}},{path:D.MQ.CREATE,component:Be,data:{breadcrumbs:D.Qn.CREATE}},{path:`${D.MQ.EDIT}/:image_spec`,component:Be,data:{breadcrumbs:D.Qn.EDIT}},{path:`${D.MQ.CLONE}/:image_spec/:snap`,component:Be,data:{breadcrumbs:D.Qn.CLONE}},{path:`${D.MQ.COPY}/:image_spec`,component:Be,data:{breadcrumbs:D.Qn.COPY}},{path:`${D.MQ.COPY}/:image_spec/:snap`,component:Be,data:{breadcrumbs:D.Qn.COPY}}]},{path:"mirroring",component:ts,canActivate:[U.T,re.P],data:{moduleStatusGuardConfig:{uiApiPath:"block/mirroring",redirectTo:"error",header:"RBD mirroring is not configured",button_name:"Configure RBD Mirroring",button_title:"This will create rbd-mirror service and a replicated RBD pool",component:"RBD Mirroring",uiConfig:!0},breadcrumbs:"Mirroring"},children:[{path:`${D.MQ.EDIT}/:pool_name`,component:ss,outlet:"modal"}]},{path:"iscsi",canActivate:[U.T],data:{breadcrumbs:"iSCSI"},children:[{path:"",redirectTo:"overview",pathMatch:"full"},{path:"overview",component:ni,data:{breadcrumbs:"Overview"}},{path:"targets",data:{breadcrumbs:"Targets"},children:[{path:"",component:kn},{path:D.MQ.CREATE,component:gt,data:{breadcrumbs:D.Qn.CREATE}},{path:`${D.MQ.EDIT}/:target_iqn`,component:gt,data:{breadcrumbs:D.Qn.EDIT}}]}]}];let ur=(()=>{class n{}return n.\u0275fac=function(t){return new(t||n)},n.\u0275mod=e.oAB({type:n}),n.\u0275inj=e.cJS({imports:[[Bt,g.Bz.forChild(pr)]]}),n})()},60950:(dt,he,p)=>{p.d(he,{d:()=>z});var c=p(89724),a=p(1659),g=p(23815),ne=p.n(g),v=p(7357),be=p(65862),D=p(95463),U=p(30633),re=p(28211),Ae=p(34089),Ne=p(41582),S=p(11048),le=p(56310),F=p(18372),ie=p(87925),Y=p(94276);let e=(()=>{class h{constructor(m,C){this.control=m,this.formatter=C}setValue(m){const C=this.formatter.toMilliseconds(m);this.control.control.setValue(`${C} ms`)}ngOnInit(){this.setValue(this.control.value),this.ngDataReady&&this.ngDataReady.subscribe(()=>this.setValue(this.control.value))}onUpdate(m){this.setValue(m)}}return h.\u0275fac=function(m){return new(m||h)(c.Y36(a.a5),c.Y36(re.H))},h.\u0275dir=c.lG2({type:h,selectors:[["","cdMilliseconds",""]],hostBindings:function(m,C){1&m&&c.NdJ("blur",function(O){return C.onUpdate(O.target.value)})},inputs:{ngDataReady:"ngDataReady"}}),h})();var Q=p(20044);let Fe=(()=>{class h{constructor(m,C,A,O){this.elementRef=m,this.control=C,this.dimlessBinaryPerSecondPipe=A,this.formatter=O,this.ngModelChange=new c.vpe,this.el=this.elementRef.nativeElement}ngOnInit(){this.setValue(this.el.value),this.ngDataReady&&this.ngDataReady.subscribe(()=>this.setValue(this.el.value))}setValue(m){/^[\d.]+$/.test(m)&&(m+=this.defaultUnit||"m");const C=this.formatter.toBytes(m,0),A=this.round(C);this.el.value=this.dimlessBinaryPerSecondPipe.transform(A),null!==C?(this.ngModelChange.emit(this.el.value),this.control.control.setValue(this.el.value)):(this.ngModelChange.emit(null),this.control.control.setValue(null))}round(m){if(null!==m&&0!==m){if(!ne().isUndefined(this.minBytes)&&m<this.minBytes)return this.minBytes;if(!ne().isUndefined(this.maxBytes)&&m>this.maxBytes)return this.maxBytes;if(!ne().isUndefined(this.roundPower)){const C=Math.round(Math.log(m)/Math.log(this.roundPower));return Math.pow(this.roundPower,C)}}return m}onBlur(m){this.setValue(m)}}return h.\u0275fac=function(m){return new(m||h)(c.Y36(c.SBq),c.Y36(a.a5),c.Y36(Q.O),c.Y36(re.H))},h.\u0275dir=c.lG2({type:h,selectors:[["","cdDimlessBinaryPerSecond",""]],hostBindings:function(m,C){1&m&&c.NdJ("blur",function(O){return C.onBlur(O.target.value)})},inputs:{ngDataReady:"ngDataReady",minBytes:"minBytes",maxBytes:"maxBytes",roundPower:"roundPower",defaultUnit:"defaultUnit"},outputs:{ngModelChange:"ngModelChange"}}),h})(),De=(()=>{class h{constructor(m,C){this.formatter=m,this.ngControl=C}setValue(m){const C=this.formatter.toIops(m);this.ngControl.control.setValue(`${C} IOPS`)}ngOnInit(){this.setValue(this.ngControl.value),this.ngDataReady&&this.ngDataReady.subscribe(()=>this.setValue(this.ngControl.value))}onUpdate(m){this.setValue(m)}}return h.\u0275fac=function(m){return new(m||h)(c.Y36(re.H),c.Y36(a.a5))},h.\u0275dir=c.lG2({type:h,selectors:[["","cdIops",""]],hostBindings:function(m,C){1&m&&c.NdJ("blur",function(O){return C.onUpdate(O.target.value)})},inputs:{ngDataReady:"ngDataReady"}}),h})();function L(h,R){if(1&h&&(c.ynx(0),c._UZ(1,"input",17),c.BQk()),2&h){const m=c.oxw().$implicit,C=c.oxw(2);c.xp6(1),c.Q6J("id",m.name)("name",m.name)("formControlName",m.name)("ngDataReady",C.ngDataReady)}}function Pe(h,R){if(1&h&&(c.ynx(0),c._UZ(1,"input",18),c.BQk()),2&h){const m=c.oxw().$implicit,C=c.oxw(2);c.xp6(1),c.Q6J("id",m.name)("name",m.name)("formControlName",m.name)("ngDataReady",C.ngDataReady)}}function H(h,R){if(1&h&&(c.ynx(0),c._UZ(1,"input",19),c.BQk()),2&h){const m=c.oxw().$implicit,C=c.oxw(2);c.xp6(1),c.Q6J("id",m.name)("name",m.name)("formControlName",m.name)("ngDataReady",C.ngDataReady)}}function N(h,R){1&h&&(c.TgZ(0,"span",20),c.SDv(1,21),c.qZA())}const y=function(h){return{active:h}},T=function(h){return[h]};function k(h,R){if(1&h){const m=c.EpF();c.TgZ(0,"div",10)(1,"label",11),c._uU(2),c.TgZ(3,"cd-helper"),c._uU(4),c.qZA()(),c.TgZ(5,"div")(6,"div",12),c.ynx(7,13),c.YNc(8,L,2,4,"ng-container",14),c.YNc(9,Pe,2,4,"ng-container",14),c.YNc(10,H,2,4,"ng-container",14),c.BQk(),c.TgZ(11,"button",15),c.NdJ("click",function(){const O=c.CHM(m).$implicit;return c.oxw(2).reset(O.name)}),c._UZ(12,"i",7),c.qZA()(),c.YNc(13,N,2,0,"span",16),c.qZA()()}if(2&h){const m=R.$implicit,C=c.oxw().$implicit,A=c.oxw(),O=c.MAs(1);c.xp6(1),c.Q6J("for",m.name),c.xp6(1),c.Oqu(m.displayName),c.xp6(2),c.Oqu(m.description),c.xp6(1),c.Gre("cd-col-form-input ",C.heading,""),c.xp6(2),c.Q6J("ngSwitch",m.type),c.xp6(1),c.Q6J("ngSwitchCase",A.configurationType.milliseconds),c.xp6(1),c.Q6J("ngSwitchCase",A.configurationType.bps),c.xp6(1),c.Q6J("ngSwitchCase",A.configurationType.iops),c.xp6(1),c.Q6J("ngClass",c.VKq(13,y,A.isDisabled(m.name))),c.xp6(1),c.Q6J("ngClass",c.VKq(15,T,A.icons.erase)),c.xp6(1),c.Q6J("ngIf",A.form.showError("configuration."+m.name,O,"min"))}}function Z(h,R){if(1&h){const m=c.EpF();c.TgZ(0,"div",4)(1,"h4",5)(2,"span",6),c.NdJ("click",function(){const O=c.CHM(m).$implicit;return c.oxw().toggleSectionVisibility(O.class)}),c._uU(3),c._UZ(4,"i",7),c.qZA()(),c.TgZ(5,"div",8),c.YNc(6,k,14,17,"div",9),c.qZA()()}if(2&h){const m=R.$implicit,C=c.oxw();c.xp6(3),c.hij(" ",m.heading," "),c.xp6(1),c.Q6J("ngClass",C.sectionVisibility[m.class]?C.icons.minusCircle:C.icons.addCircle),c.xp6(1),c.Tol(m.class),c.Q6J("hidden",!C.sectionVisibility[m.class]),c.xp6(1),c.Q6J("ngForOf",m.options)}}let z=(()=>{class h{constructor(m,C){this.formatterService=m,this.rbdConfigurationService=C,this.initializeData=new v.t(1),this.changes=new c.vpe,this.icons=be.P,this.ngDataReady=new c.vpe,this.configurationType=U.r,this.sectionVisibility={}}ngOnInit(){const m=this.createConfigurationFormGroup();this.form.addControl("configuration",m),m.valueChanges.subscribe(()=>{this.changes.emit(this.getDirtyValues.bind(this))}),this.initializeData&&this.initializeData.subscribe(C=>{this.initialData=C.initialData;const A=C.sourceType;this.rbdConfigurationService.getWritableOptionFields().forEach(O=>{const $=C.initialData.filter(X=>X.name===O.name).pop();$&&$.source===A&&this.form.get(`configuration.${O.name}`).setValue($.value)}),this.ngDataReady.emit()}),this.rbdConfigurationService.getWritableSections().forEach(C=>this.sectionVisibility[C.class]=!1)}getDirtyValues(m=!1,C){if(m&&!C)throw new Error("ProgrammingError: If local values shall be included, a proper localFieldType argument has to be provided, too");const A={};return this.rbdConfigurationService.getWritableOptionFields().forEach(O=>{const $=this.form.get("configuration").get(O.name);this.initialData&&this.initialData[O.name]===$.value||($.dirty||m&&$.source===C)&&(A[O.name]=null===$.value?$.value:O.type===U.r.bps?this.formatterService.toBytes($.value):O.type===U.r.milliseconds?this.formatterService.toMilliseconds($.value):O.type===U.r.iops?this.formatterService.toIops($.value):$.value)}),A}createConfigurationFormGroup(){const m=new D.d({});return this.rbdConfigurationService.getWritableOptionFields().forEach(C=>{let A;if(C.type!==U.r.milliseconds&&C.type!==U.r.iops&&C.type!==U.r.bps)throw new Error(`Type ${C.type} is unknown, you may need to add it to RbdConfiguration class`);{let O=0;ne().forEach(this.initialData,$=>{$.name===C.name&&(O=$.value)}),A=new a.NI(O,a.kI.min(0))}m.addControl(C.name,A)}),m}reset(m){const C=this.form.get("configuration").get(m);C.disabled?(C.setValue(C.previousValue||0),C.enable(),C.previousValue||C.markAsPristine()):(C.previousValue=C.value,C.setValue(null),C.markAsDirty(),C.disable())}isDisabled(m){return this.form.get("configuration").get(m).disabled}toggleSectionVisibility(m){this.sectionVisibility[m]=!this.sectionVisibility[m]}}return h.\u0275fac=function(m){return new(m||h)(c.Y36(re.H),c.Y36(Ae.n))},h.\u0275cmp=c.Xpm({type:h,selectors:[["cd-rbd-configuration-form"]],inputs:{form:"form",initializeData:"initializeData"},outputs:{changes:"changes"},decls:5,vars:2,consts:function(){let R,m,C;return R="RBD Configuration",m="Remove the local configuration value. The parent configuration value will be inherited and used instead.",C="The minimum value is 0",[[3,"formGroup"],["cfgFormGroup",""],R,["class","col-12",4,"ngFor","ngForOf"],[1,"col-12"],[1,"cd-header"],[1,"collapsible",3,"click"],["aria-hidden","true",3,"ngClass"],[3,"hidden"],["class","form-group row",4,"ngFor","ngForOf"],[1,"form-group","row"],[1,"cd-col-form-label",3,"for"],[1,"input-group"],[3,"ngSwitch"],[4,"ngSwitchCase"],["type","button","data-toggle","button","title",m,1,"btn","btn-light",3,"ngClass","click"],["class","invalid-feedback",4,"ngIf"],["type","text","cdMilliseconds","",1,"form-control",3,"id","name","formControlName","ngDataReady"],["type","text","defaultUnit","b","cdDimlessBinaryPerSecond","",1,"form-control",3,"id","name","formControlName","ngDataReady"],["type","text","cdIops","",1,"form-control",3,"id","name","formControlName","ngDataReady"],[1,"invalid-feedback"],C]},template:function(m,C){1&m&&(c.TgZ(0,"fieldset",0,1)(2,"legend"),c.SDv(3,2),c.qZA(),c.YNc(4,Z,7,7,"div",3),c.qZA()),2&m&&(c.Q6J("formGroup",C.form.get("configuration")),c.xp6(4),c.Q6J("ngForOf",C.rbdConfigurationService.sections))},directives:[a.JL,a.sg,Ne.V,S.sg,S.mk,le.P,F.S,S.RF,S.n9,ie.o,a.Fj,Y.b,e,a.JJ,a.u,Fe,De,S.O5],styles:[".collapsible[_ngcontent-%COMP%]{cursor:pointer;user-select:none}"]}),h})()},42176:(dt,he,p)=>{p.d(he,{P:()=>H});var c=p(83697),a=p(30633),g=p(89724);let ne=(()=>{class N{transform(T){return{0:"global",1:"pool",2:"image"}[T]}}return N.\u0275fac=function(T){return new(T||N)},N.\u0275pipe=g.Yjl({name:"rbdConfigurationSource",type:N,pure:!0}),N})();var v=p(28211),be=p(34089),D=p(11048),U=p(20044),re=p(48537),Ae=p(21766);const Ne=["configurationSourceTpl"],S=["configurationValueTpl"],le=["poolConfTable"];function F(N,y){1&N&&(g.TgZ(0,"span"),g.SDv(1,6),g.qZA())}function ie(N,y){1&N&&(g.TgZ(0,"strong"),g.SDv(1,7),g.qZA())}function Y(N,y){1&N&&(g.TgZ(0,"strong"),g.SDv(1,8),g.qZA())}function e(N,y){1&N&&(g.TgZ(0,"div",4),g.YNc(1,F,2,0,"span",5),g.YNc(2,ie,2,0,"strong",5),g.YNc(3,Y,2,0,"strong",5),g.qZA()),2&N&&(g.Q6J("ngSwitch",y.value),g.xp6(1),g.Q6J("ngSwitchCase","global"),g.xp6(1),g.Q6J("ngSwitchCase","image"),g.xp6(1),g.Q6J("ngSwitchCase","pool"))}function Q(N,y){if(1&N&&(g.TgZ(0,"span"),g._uU(1),g.ALo(2,"dimlessBinaryPerSecond"),g.qZA()),2&N){const T=g.oxw().value;g.xp6(1),g.Oqu(g.lcZ(2,1,T))}}function Fe(N,y){if(1&N&&(g.TgZ(0,"span"),g._uU(1),g.ALo(2,"milliseconds"),g.qZA()),2&N){const T=g.oxw().value;g.xp6(1),g.Oqu(g.lcZ(2,1,T))}}function De(N,y){if(1&N&&(g.TgZ(0,"span"),g._uU(1),g.ALo(2,"iops"),g.qZA()),2&N){const T=g.oxw().value;g.xp6(1),g.Oqu(g.lcZ(2,1,T))}}function L(N,y){if(1&N&&(g.TgZ(0,"span"),g._uU(1),g.qZA()),2&N){const T=g.oxw().value;g.xp6(1),g.Oqu(T)}}function Pe(N,y){if(1&N&&(g.TgZ(0,"div",4),g.YNc(1,Q,3,3,"span",5),g.YNc(2,Fe,3,3,"span",5),g.YNc(3,De,3,3,"span",5),g.YNc(4,L,2,1,"span",9),g.qZA()),2&N){const T=y.row,k=g.oxw();g.Q6J("ngSwitch",T.type),g.xp6(1),g.Q6J("ngSwitchCase",k.typeField.bps),g.xp6(1),g.Q6J("ngSwitchCase",k.typeField.milliseconds),g.xp6(1),g.Q6J("ngSwitchCase",k.typeField.iops)}}let H=(()=>{class N{constructor(T,k){this.formatterService=T,this.rbdConfigurationService=k,this.sourceField=a.h,this.typeField=a.r}ngOnInit(){this.poolConfigurationColumns=[{prop:"displayName",name:"Name"},{prop:"description",name:"Description"},{prop:"name",name:"Key"},{prop:"source",name:"Source",cellTemplate:this.configurationSourceTpl,pipe:new ne},{prop:"value",name:"Value",cellTemplate:this.configurationValueTpl}]}ngOnChanges(){!this.data||(this.data=this.data.filter(T=>this.rbdConfigurationService.getOptionFields().map(k=>k.name).includes(T.name)))}}return N.\u0275fac=function(T){return new(T||N)(g.Y36(v.H),g.Y36(be.n))},N.\u0275cmp=g.Xpm({type:N,selectors:[["cd-rbd-configuration-table"]],viewQuery:function(T,k){if(1&T&&(g.Gf(Ne,7),g.Gf(S,7),g.Gf(le,7)),2&T){let Z;g.iGM(Z=g.CRH())&&(k.configurationSourceTpl=Z.first),g.iGM(Z=g.CRH())&&(k.configurationValueTpl=Z.first),g.iGM(Z=g.CRH())&&(k.poolConfTable=Z.first)}},inputs:{data:"data"},features:[g.TTD],decls:6,vars:2,consts:function(){let y,T,k;return y="Global",T="Image",k="Pool",[["identifier","name",3,"data","columns"],["poolConfTable",""],["configurationSourceTpl",""],["configurationValueTpl",""],[3,"ngSwitch"],[4,"ngSwitchCase"],y,T,k,[4,"ngSwitchDefault"]]},template:function(T,k){1&T&&(g._UZ(0,"cd-table",0,1),g.YNc(2,e,4,4,"ng-template",null,2,g.W1O),g.YNc(4,Pe,5,4,"ng-template",null,3,g.W1O)),2&T&&g.Q6J("data",k.data)("columns",k.poolConfigurationColumns)},directives:[c.a,D.RF,D.n9,D.ED],pipes:[U.O,re.J,Ae.A],styles:[""]}),N})()}}]);
\ No newline at end of file
diff --git a/ceph/src/pybind/mgr/dashboard/frontend/dist/en-US/437.7720eaff4a1def1b.js b/ceph/src/pybind/mgr/dashboard/frontend/dist/en-US/437.7720eaff4a1def1b.js
new file mode 100644 (file)
index 0000000..0b670d1
--- /dev/null
@@ -0,0 +1 @@
+"use strict";(self.webpackChunkceph_dashboard=self.webpackChunkceph_dashboard||[]).push([[437],{34437:(ki,Ze,l)=>{l.r(Ze),l.d(Ze,{RgwModule:()=>u_,RoutedRgwModule:()=>wi});var M=l(11048),a=l(1659),H=l(55860),A=l(71334),we=l(37496),G=l(79512),$_=l(44466),U_=l(66265),I_=l(23815),R=l.n(I_),te=l(35758),Ne=l(95152),ke=l(33394),qe=l(64762),Be=l(19725),Fe=l(25917),He=l(19773),v_=l(96736),F_=l(5304),be=l(20523),h_=l(93523),e=l(89724);let D=class{constructor(o,_){this.http=o,this.rgwDaemonService=_,this.url="api/rgw/user"}list(){return this.enumerate().pipe((0,He.zg)(o=>o.length>0?(0,te.D)(o.map(_=>this.get(_))):(0,Fe.of)([])))}enumerate(){return this.rgwDaemonService.request(o=>this.http.get(this.url,{params:o}))}enumerateEmail(){return this.rgwDaemonService.request(o=>this.http.get(`${this.url}/get_emails`,{params:o}))}get(o){return this.rgwDaemonService.request(_=>this.http.get(`${this.url}/${o}`,{params:_}))}getQuota(o){return this.rgwDaemonService.request(_=>this.http.get(`${this.url}/${o}/quota`,{params:_}))}create(o){return this.rgwDaemonService.request(_=>(R().keys(o).forEach(n=>{_=_.append(n,o[n])}),this.http.post(this.url,null,{params:_})))}update(o,_){return this.rgwDaemonService.request(n=>(R().keys(_).forEach(i=>{n=n.append(i,_[i])}),this.http.put(`${this.url}/${o}`,null,{params:n})))}updateQuota(o,_){return this.rgwDaemonService.request(n=>(R().keys(_).forEach(i=>{n=n.append(i,_[i])}),this.http.put(`${this.url}/${o}/quota`,null,{params:n})))}delete(o){return this.rgwDaemonService.request(_=>this.http.delete(`${this.url}/${o}`,{params:_}))}createSubuser(o,_){return this.rgwDaemonService.request(n=>(R().keys(_).forEach(i=>{n=n.append(i,_[i])}),this.http.post(`${this.url}/${o}/subuser`,null,{params:n})))}deleteSubuser(o,_){return this.rgwDaemonService.request(n=>this.http.delete(`${this.url}/${o}/subuser/${_}`,{params:n}))}addCapability(o,_,n){return this.rgwDaemonService.request(i=>(i=(i=i.append("type",_)).append("perm",n),this.http.post(`${this.url}/${o}/capability`,null,{params:i})))}deleteCapability(o,_,n){return this.rgwDaemonService.request(i=>(i=(i=i.append("type",_)).append("perm",n),this.http.delete(`${this.url}/${o}/capability`,{params:i})))}addS3Key(o,_){return this.rgwDaemonService.request(n=>(n=n.append("key_type","s3"),R().keys(_).forEach(i=>{n=n.append(i,_[i])}),this.http.post(`${this.url}/${o}/key`,null,{params:n})))}deleteS3Key(o,_){return this.rgwDaemonService.request(n=>(n=(n=n.append("key_type","s3")).append("access_key",_),this.http.delete(`${this.url}/${o}/key`,{params:n})))}exists(o){return this.get(o).pipe((0,v_.h)(!0),(0,F_.K)(_=>(R().isFunction(_.preventDefault)&&_.preventDefault(),(0,Fe.of)(!1))))}emailExists(o){return o=decodeURIComponent(o),this.enumerateEmail().pipe((0,He.zg)(_=>{const n=R().indexOf(_,o);return(0,Fe.of)(-1!==n)}))}};D.\u0275fac=function(o){return new(o||D)(e.LFG(Be.eN),e.LFG(be.b))},D.\u0275prov=e.Yz7({token:D,factory:D.\u0275fac,providedIn:"root"}),D=(0,qe.gn)([h_.o,(0,qe.w6)("design:paramtypes",[Be.eN,be.b])],D);var w=l(65862),ne=l(18001),Xe=l(93614),p=l(90070),he=l(97161);class We{constructor(){this.kmsProviders=["vault"],this.authMethods=["token","agent"],this.secretEngines=["kv","transit"],this.sse_s3="AES256",this.sse_kms="aws:kms"}}var z=(()=>{return(t=z||(z={})).ENABLED="Enabled",t.DISABLED="Disabled",z;var t})(),Q=(()=>{return(t=Q||(Q={})).ENABLED="Enabled",t.SUSPENDED="Suspended",Q;var t})(),Y=l(62862),oe=l(60312),J=l(41582),X=l(56310),k=l(87925),K=l(94276),Ke=l(18372),V=l(30839);function L_(t,o){1&t&&(e.TgZ(0,"option",29),e.SDv(1,30),e.qZA()),2&t&&e.Q6J("ngValue",null)}function y_(t,o){if(1&t&&(e.TgZ(0,"option",31),e._uU(1),e.qZA()),2&t){const _=o.$implicit;e.Q6J("value",_),e.xp6(1),e.Oqu(_)}}function D_(t,o){1&t&&(e.TgZ(0,"span",32),e.SDv(1,33),e.qZA())}function x_(t,o){if(1&t&&(e.TgZ(0,"div")(1,"div",7)(2,"label",22),e.SDv(3,23),e.qZA(),e.TgZ(4,"div",24)(5,"select",25),e.YNc(6,L_,2,1,"option",26),e.YNc(7,y_,2,2,"option",27),e.qZA(),e.YNc(8,D_,2,0,"span",28),e.qZA()()()),2&t){const _=e.oxw(),n=e.MAs(5);e.xp6(6),e.Q6J("ngIf",null!==_.kmsProviders),e.xp6(1),e.Q6J("ngForOf",_.kmsProviders),e.xp6(1),e.Q6J("ngIf",_.configForm.showError("kms_provider",n,"required"))}}function Z_(t,o){1&t&&(e.TgZ(0,"option",29),e.SDv(1,37),e.qZA()),2&t&&e.Q6J("ngValue",null)}function w_(t,o){if(1&t&&(e.TgZ(0,"option",31),e._uU(1),e.qZA()),2&t){const _=o.$implicit;e.Q6J("value",_),e.xp6(1),e.Oqu(_)}}function k_(t,o){1&t&&(e.TgZ(0,"span",32),e.SDv(1,38),e.qZA())}function q_(t,o){if(1&t&&(e.TgZ(0,"div")(1,"div",7)(2,"label",34),e.SDv(3,35),e.qZA(),e.TgZ(4,"div",24)(5,"select",36),e.YNc(6,Z_,2,1,"option",26),e.YNc(7,w_,2,2,"option",27),e.qZA(),e.YNc(8,k_,2,0,"span",28),e.qZA()()()),2&t){const _=e.oxw(),n=e.MAs(5);e.xp6(6),e.Q6J("ngIf",null!==_.authMethods),e.xp6(1),e.Q6J("ngForOf",_.authMethods),e.xp6(1),e.Q6J("ngIf",_.configForm.showError("auth_method",n,"required"))}}function B_(t,o){1&t&&(e.TgZ(0,"option",29),e.SDv(1,42),e.qZA()),2&t&&e.Q6J("ngValue",null)}function H_(t,o){if(1&t&&(e.TgZ(0,"option",31),e._uU(1),e.qZA()),2&t){const _=o.$implicit;e.Q6J("value",_),e.xp6(1),e.Oqu(_)}}function X_(t,o){1&t&&(e.TgZ(0,"span",32),e.SDv(1,43),e.qZA())}function K_(t,o){if(1&t&&(e.TgZ(0,"div")(1,"div",7)(2,"label",39),e.SDv(3,40),e.qZA(),e.TgZ(4,"div",24)(5,"select",41),e.YNc(6,B_,2,1,"option",26),e.YNc(7,H_,2,2,"option",27),e.qZA(),e.YNc(8,X_,2,0,"span",28),e.qZA()()()),2&t){const _=e.oxw(),n=e.MAs(5);e.xp6(6),e.Q6J("ngIf",null!==_.secretEngines),e.xp6(1),e.Q6J("ngForOf",_.secretEngines),e.xp6(1),e.Q6J("ngIf",_.configForm.showError("secret_engine",n,"required"))}}function z_(t,o){1&t&&(e.TgZ(0,"span",32),e.SDv(1,47),e.qZA())}function Q_(t,o){if(1&t&&(e.TgZ(0,"div")(1,"div",7)(2,"label",44),e.SDv(3,45),e.qZA(),e.TgZ(4,"div",24),e._UZ(5,"input",46),e.YNc(6,z_,2,0,"span",28),e.qZA()()()),2&t){const _=e.oxw(),n=e.MAs(5);e.xp6(6),e.Q6J("ngIf",_.configForm.showError("secret_path",n,"required"))}}function Y_(t,o){1&t&&(e.TgZ(0,"div")(1,"div",7)(2,"label",48),e.SDv(3,49),e.qZA(),e.TgZ(4,"div",24),e._UZ(5,"input",50),e.qZA()()())}function J_(t,o){1&t&&(e.TgZ(0,"span",32),e.SDv(1,54),e.qZA())}function V_(t,o){if(1&t&&(e.TgZ(0,"div")(1,"div",7)(2,"label",51),e.SDv(3,52),e.qZA(),e.TgZ(4,"div",24),e._UZ(5,"input",53),e.YNc(6,J_,2,0,"span",28),e.qZA()()()),2&t){const _=e.oxw(),n=e.MAs(5);e.xp6(6),e.Q6J("ngIf",_.configForm.showError("address",n,"required"))}}function j_(t,o){1&t&&(e.TgZ(0,"span",32),e.SDv(1,58),e.qZA())}function et(t,o){if(1&t){const _=e.EpF();e.TgZ(0,"div",7)(1,"label",55)(2,"span"),e.SDv(3,56),e.qZA()(),e.TgZ(4,"div",24)(5,"input",57),e.NdJ("change",function(i){return e.CHM(_),e.oxw().fileUpload(i.target.files,"token")}),e.qZA(),e.YNc(6,j_,2,0,"span",28),e.qZA()()}if(2&t){const _=e.oxw(),n=e.MAs(5);e.xp6(6),e.Q6J("ngIf",_.configForm.showError("token",n,"required"))}}function _t(t,o){1&t&&(e.TgZ(0,"span",32),e.SDv(1,63),e.qZA())}function tt(t,o){if(1&t){const _=e.EpF();e.TgZ(0,"div")(1,"div",7)(2,"label",59)(3,"span"),e.SDv(4,60),e.qZA(),e.TgZ(5,"cd-helper"),e.SDv(6,61),e.qZA()(),e.TgZ(7,"div",24)(8,"input",62),e.NdJ("change",function(i){return e.CHM(_),e.oxw().fileUpload(i.target.files,"ssl_cert")}),e.qZA(),e.YNc(9,_t,2,0,"span",28),e.qZA()()()}if(2&t){const _=e.oxw(),n=e.MAs(5);e.xp6(9),e.Q6J("ngIf",_.configForm.showError("ssl_cert",n,"required"))}}function nt(t,o){1&t&&(e.TgZ(0,"span",32),e.SDv(1,68),e.qZA())}function ot(t,o){if(1&t){const _=e.EpF();e.TgZ(0,"div")(1,"div",7)(2,"label",64)(3,"span"),e.SDv(4,65),e.qZA(),e.TgZ(5,"cd-helper"),e.SDv(6,66),e.qZA()(),e.TgZ(7,"div",24)(8,"input",67),e.NdJ("change",function(i){return e.CHM(_),e.oxw().fileUpload(i.target.files,"client_cert")}),e.qZA(),e.YNc(9,nt,2,0,"span",28),e.qZA()()()}if(2&t){const _=e.oxw(),n=e.MAs(5);e.xp6(9),e.Q6J("ngIf",_.configForm.showError("client_cert",n,"required"))}}function it(t,o){1&t&&(e.TgZ(0,"span",32),e.SDv(1,73),e.qZA())}function st(t,o){if(1&t){const _=e.EpF();e.TgZ(0,"div")(1,"div",7)(2,"label",69)(3,"span"),e.SDv(4,70),e.qZA(),e.TgZ(5,"cd-helper"),e.SDv(6,71),e.qZA()(),e.TgZ(7,"div",24)(8,"input",72),e.NdJ("change",function(i){return e.CHM(_),e.oxw().fileUpload(i.target.files,"client_key")}),e.qZA(),e.YNc(9,it,2,0,"span",28),e.qZA()()()}if(2&t){const _=e.oxw(),n=e.MAs(5);e.xp6(9),e.Q6J("ngIf",_.configForm.showError("client_key",n,"required"))}}let at=(()=>{class t{constructor(_,n,i,s,r,d,g){this.formBuilder=_,this.activeModal=n,this.router=i,this.actionLabels=s,this.rgwBucketService=r,this.rgwEncryptionModal=d,this.notificationService=g,this.vaultAddress=/^((https?:\/\/)|(www.))(?:([a-zA-Z]+)|(\d+\.\d+.\d+.\d+)):\d{4}$/,this.submitAction=new e.vpe,this.createForm()}ngOnInit(){this.kmsProviders=this.rgwEncryptionModal.kmsProviders,this.authMethods=this.rgwEncryptionModal.authMethods,this.secretEngines=this.rgwEncryptionModal.secretEngines}createForm(){this.configForm=this.formBuilder.group({address:[null,[a.kI.required,p.h.custom("vaultPattern",_=>!R().isEmpty(_)&&!this.vaultAddress.test(_))]],kms_provider:["vault",a.kI.required],encryptionType:["aws:kms",a.kI.required],auth_method:[null,a.kI.required],secret_engine:[null,a.kI.required],secret_path:["/"],namespace:[null],token:[null,[p.h.requiredIf({auth_method:"token"})]],ssl_cert:[null,p.h.sslCert()],client_cert:[null,p.h.pemCert()],client_key:[null,p.h.sslPrivKey()],kmsEnabled:[{value:!1}],s3Enabled:[{value:!1}]})}fileUpload(_,n){const i=_[0];(new FileReader).addEventListener("load",()=>{const r=this.configForm.get(n);r.setValue(i),r.markAsDirty(),r.markAsTouched(),r.updateValueAndValidity()})}onSubmit(){const _=this.configForm.value;this.rgwBucketService.setEncryptionConfig(_.encryptionType,_.kms_provider,_.auth_method,_.secret_engine,_.secret_path,_.namespace,_.address,_.token,_.owner,_.ssl_cert,_.client_cert,_.client_key).subscribe({next:()=>{this.notificationService.show(ne.k.success,"Updated RGW Encryption Configuration values")},error:n=>{this.notificationService.show(ne.k.error,n),this.configForm.setErrors({cdSubmitButton:!0})},complete:()=>{this.activeModal.close(),this.router.routeReuseStrategy.shouldReuseRoute=()=>!1,this.router.onSameUrlNavigation="reload",this.router.navigate([this.router.url])}})}}return t.\u0275fac=function(_){return new(_||t)(e.Y36(Y.O),e.Y36(A.Kz),e.Y36(H.F0),e.Y36(G.p4),e.Y36(Ne.o),e.Y36(We),e.Y36(he.g))},t.\u0275cmp=e.Xpm({type:t,selectors:[["cd-rgw-config-modal"]],outputs:{submitAction:"submitAction"},features:[e._Bn([We])],decls:30,vars:14,consts:function(){let o,_,n,i,s,r,d,g,E,S,P,O,N,b,m,W,$,U,I,v,F,h,L,y,f,x,T,q,B;return o="Update RGW Encryption Configurations",_="Encryption Type",n="SSE-S3 Encryption",i="SSE-KMS Encryption",s="Key management service provider",r="-- Select a provider --",d="This field is required.",g="Authentication Method",E="-- Select a method --",S="This field is required.",P="Secret Engine",O="-- Select a method --",N="This field is required.",b="Secret Path ",m="This field is required.",W="Namespace ",$="Vault Address ",U="This field is required.",I="Token",v="This field is required.",F="CA Certificate",h="The SSL certificate in PEM format.",L="This field is required.",y="Client Certificate",f="The Client certificate in PEM format.",x="This field is required.",T="Client Private Key",q="The Client Private Key in PEM format.",B="This field is required.",[[3,"modalRef"],[1,"modal-title"],o,[1,"modal-content"],["name","configForm",3,"formGroup"],["frm","ngForm"],[1,"modal-body"],[1,"form-group","row"],["for","encryptionType",1,"cd-col-form-label","required"],_,[1,"col-md-auto","custom-checkbox","form-check-inline","ms-3"],["formControlName","encryptionType","id","s3Enabled","type","radio","name","encryptionType","value","AES256",1,"form-check-input"],["for","s3Enabled",1,"custom-check-label"],n,[1,"col-md-auto","custom-checkbox","form-check-inline"],["formControlName","encryptionType","id","kmsEnabled","name","encryptionType","value","aws:kms","type","radio",1,"form-check-input"],["for","kmsEnabled",1,"custom-check-label"],i,[4,"ngIf"],["class","form-group row",4,"ngIf"],[1,"modal-footer"],[3,"submitText","form","submitActionEvent"],["for","kms_provider",1,"cd-col-form-label","required"],s,[1,"cd-col-form-input"],["id","kms_provider","name","kms_provider","formControlName","kms_provider",1,"form-select"],[3,"ngValue",4,"ngIf"],[3,"value",4,"ngFor","ngForOf"],["class","invalid-feedback",4,"ngIf"],[3,"ngValue"],r,[3,"value"],[1,"invalid-feedback"],d,["for","auth_method",1,"cd-col-form-label","required"],g,["id","auth_method","name","auth_method","formControlName","auth_method",1,"form-select"],E,S,["for","secret_engine",1,"cd-col-form-label","required"],P,["id","secret_engine","name","secret_engine","formControlName","secret_engine",1,"form-select"],O,N,["for","secret_path",1,"cd-col-form-label"],b,["id","secret_path","name","secret_path","type","text","formControlName","secret_path",1,"form-control"],m,["for","namespace",1,"cd-col-form-label"],W,["id","namespace","name","namespace","type","text","formControlName","namespace",1,"form-control"],["for","address",1,"cd-col-form-label","required"],$,["id","address","name","address","formControlName","address",1,"form-control"],U,["for","token",1,"cd-col-form-label","required"],I,["type","file","formControlName","token",3,"change"],v,["for","ssl_cert",1,"cd-col-form-label"],F,h,["type","file","formControlName","ssl_cert",3,"change"],L,["for","client_cert",1,"cd-col-form-label"],y,f,["type","file","formControlName","client_cert",3,"change"],x,["for","client_key",1,"cd-col-form-label"],T,q,["type","file",3,"change"],B]},template:function(_,n){1&_&&(e.TgZ(0,"cd-modal",0),e.ynx(1,1),e.SDv(2,2),e.BQk(),e.ynx(3,3),e.TgZ(4,"form",4,5)(6,"div",6)(7,"div",7)(8,"label",8),e.SDv(9,9),e.qZA(),e.TgZ(10,"div",10),e._UZ(11,"input",11),e.TgZ(12,"label",12),e.SDv(13,13),e.qZA()(),e.TgZ(14,"div",14),e._UZ(15,"input",15),e.TgZ(16,"label",16),e.SDv(17,17),e.qZA()()(),e.YNc(18,x_,9,3,"div",18),e.YNc(19,q_,9,3,"div",18),e.YNc(20,K_,9,3,"div",18),e.YNc(21,Q_,7,1,"div",18),e.YNc(22,Y_,6,0,"div",18),e.YNc(23,V_,7,1,"div",18),e.YNc(24,et,7,1,"div",19),e.YNc(25,tt,10,1,"div",18),e.YNc(26,ot,10,1,"div",18),e.YNc(27,st,10,1,"div",18),e.qZA(),e.TgZ(28,"div",20)(29,"cd-form-button-panel",21),e.NdJ("submitActionEvent",function(){return n.onSubmit()}),e.qZA()()(),e.BQk(),e.qZA()),2&_&&(e.Q6J("modalRef",n.activeModal),e.xp6(4),e.Q6J("formGroup",n.configForm),e.xp6(14),e.Q6J("ngIf","aws:kms"===n.configForm.getValue("encryptionType")||"AES256"===n.configForm.getValue("encryptionType")),e.xp6(1),e.Q6J("ngIf","aws:kms"===n.configForm.getValue("encryptionType")||"AES256"===n.configForm.getValue("encryptionType")),e.xp6(1),e.Q6J("ngIf","aws:kms"===n.configForm.getValue("encryptionType")||"AES256"===n.configForm.getValue("encryptionType")),e.xp6(1),e.Q6J("ngIf","aws:kms"===n.configForm.getValue("encryptionType")||"AES256"===n.configForm.getValue("encryptionType")),e.xp6(1),e.Q6J("ngIf","aws:kms"===n.configForm.getValue("encryptionType")||"AES256"===n.configForm.getValue("encryptionType")),e.xp6(1),e.Q6J("ngIf","aws:kms"===n.configForm.getValue("encryptionType")||"AES256"===n.configForm.getValue("encryptionType")),e.xp6(1),e.Q6J("ngIf","token"===n.configForm.getValue("auth_method")),e.xp6(1),e.Q6J("ngIf","aws:kms"===n.configForm.getValue("encryptionType")||"AES256"===n.configForm.getValue("encryptionType")),e.xp6(1),e.Q6J("ngIf","aws:kms"===n.configForm.getValue("encryptionType")||"AES256"===n.configForm.getValue("encryptionType")),e.xp6(1),e.Q6J("ngIf","aws:kms"===n.configForm.getValue("encryptionType")||"AES256"===n.configForm.getValue("encryptionType")),e.xp6(2),e.Q6J("submitText",n.actionLabels.SUBMIT)("form",n.configForm))},directives:[oe.z,a._Y,a.JL,J.V,a.sg,X.P,k.o,a.Fj,a._,K.b,a.JJ,a.u,M.O5,a.EJ,a.YN,a.Kr,M.sg,Ke.S,V.p],styles:[""]}),t})();var ie=l(63285),ze=l(63622),se=l(82945),j=l(10545);function rt(t,o){1&t&&(e.TgZ(0,"div",9)(1,"label",41),e.SDv(2,42),e.qZA(),e.TgZ(3,"div",12),e._UZ(4,"input",43),e.qZA()())}function lt(t,o){1&t&&(e.TgZ(0,"span",44),e.SDv(1,45),e.qZA())}function ct(t,o){1&t&&(e.TgZ(0,"span",44),e.SDv(1,46),e.qZA())}function dt(t,o){1&t&&(e.TgZ(0,"span",44),e.SDv(1,47),e.qZA())}function ut(t,o){1&t&&(e.TgZ(0,"span",44),e.SDv(1,48),e.qZA())}function Rt(t,o){1&t&&(e.TgZ(0,"span",44),e.SDv(1,49),e.qZA())}function Et(t,o){1&t&&(e.TgZ(0,"span",44),e.SDv(1,50),e.qZA())}function gt(t,o){1&t&&(e.TgZ(0,"span",44),e.SDv(1,51),e.qZA())}function ft(t,o){1&t&&(e.TgZ(0,"span",44),e.SDv(1,52),e.qZA())}function St(t,o){1&t&&(e.TgZ(0,"option",53),e.SDv(1,54),e.qZA()),2&t&&e.Q6J("ngValue",null)}function Tt(t,o){1&t&&(e.TgZ(0,"option",53),e.SDv(1,55),e.qZA()),2&t&&e.Q6J("ngValue",null)}function Ct(t,o){if(1&t&&(e.TgZ(0,"option",56),e._uU(1),e.qZA()),2&t){const _=o.$implicit;e.Q6J("value",_),e.xp6(1),e.Oqu(_)}}function Mt(t,o){1&t&&(e.TgZ(0,"span",44),e.SDv(1,57),e.qZA())}function pt(t,o){1&t&&(e.TgZ(0,"option",53),e.SDv(1,59),e.qZA()),2&t&&e.Q6J("ngValue",null)}function mt(t,o){1&t&&(e.TgZ(0,"option",53),e.SDv(1,60),e.qZA()),2&t&&e.Q6J("ngValue",null)}function At(t,o){if(1&t&&(e.TgZ(0,"option",56),e._uU(1),e.qZA()),2&t){const _=o.$implicit;e.Q6J("value",_.name),e.xp6(1),e.Oqu(_.description)}}function Gt(t,o){1&t&&(e.TgZ(0,"span",44),e.SDv(1,61),e.qZA())}function Pt(t,o){if(1&t&&(e.TgZ(0,"select",58),e.YNc(1,pt,2,1,"option",18),e.YNc(2,mt,2,1,"option",18),e.YNc(3,At,2,2,"option",19),e.qZA(),e.YNc(4,Gt,2,0,"span",14)),2&t){e.oxw();const _=e.MAs(2),n=e.oxw();e.xp6(1),e.Q6J("ngIf",null===n.placementTargets),e.xp6(1),e.Q6J("ngIf",null!==n.placementTargets),e.xp6(1),e.Q6J("ngForOf",n.placementTargets),e.xp6(1),e.Q6J("ngIf",n.bucketForm.showError("placement-target",_,"required"))}}function Ot(t,o){1&t&&(e.ynx(0),e._UZ(1,"input",62),e.BQk())}function Nt(t,o){if(1&t){const _=e.EpF();e.TgZ(0,"fieldset")(1,"legend",25),e.SDv(2,63),e.qZA(),e.TgZ(3,"div",9)(4,"div",27)(5,"div",28)(6,"input",64),e.NdJ("change",function(){return e.CHM(_),e.oxw(2).setMfaDeleteValidators()}),e.qZA(),e.TgZ(7,"label",65),e.SDv(8,66),e.qZA(),e.TgZ(9,"cd-helper")(10,"span"),e.SDv(11,67),e.qZA()()()()()()}}function bt(t,o){1&t&&(e.TgZ(0,"span",44),e.SDv(1,76),e.qZA())}function Wt(t,o){if(1&t&&(e.TgZ(0,"div",9)(1,"label",73),e.SDv(2,74),e.qZA(),e.TgZ(3,"div",12),e._UZ(4,"input",75),e.YNc(5,bt,2,0,"span",14),e.qZA()()),2&t){e.oxw(2);const _=e.MAs(2),n=e.oxw();e.xp6(5),e.Q6J("ngIf",n.bucketForm.showError("mfa-token-serial",_,"required"))}}function $t(t,o){1&t&&(e.TgZ(0,"span",44),e.SDv(1,80),e.qZA())}function Ut(t,o){if(1&t&&(e.TgZ(0,"div",9)(1,"label",77),e.SDv(2,78),e.qZA(),e.TgZ(3,"div",12),e._UZ(4,"input",79),e.YNc(5,$t,2,0,"span",14),e.qZA()()),2&t){e.oxw(2);const _=e.MAs(2),n=e.oxw();e.xp6(5),e.Q6J("ngIf",n.bucketForm.showError("mfa-token-pin",_,"required"))}}function It(t,o){if(1&t){const _=e.EpF();e.TgZ(0,"fieldset")(1,"legend",25),e.SDv(2,68),e.qZA(),e.TgZ(3,"div",9)(4,"div",27)(5,"div",28)(6,"input",69),e.NdJ("change",function(){return e.CHM(_),e.oxw(2).setMfaDeleteValidators()}),e.qZA(),e.TgZ(7,"label",70),e.SDv(8,71),e.qZA(),e.TgZ(9,"cd-helper")(10,"span"),e.SDv(11,72),e.qZA()()()()(),e.YNc(12,Wt,6,1,"div",8),e.YNc(13,Ut,6,1,"div",8),e.qZA()}if(2&t){const _=e.oxw(2);e.xp6(12),e.Q6J("ngIf",_.areMfaCredentialsRequired()),e.xp6(1),e.Q6J("ngIf",_.areMfaCredentialsRequired())}}function vt(t,o){1&t&&(e.TgZ(0,"div",9)(1,"label",81),e.SDv(2,82),e.qZA(),e.TgZ(3,"div",12)(4,"select",83)(5,"option",84),e.SDv(6,85),e.qZA(),e.TgZ(7,"option",86),e.SDv(8,87),e.qZA()()()())}function Ft(t,o){1&t&&(e.TgZ(0,"span",44),e.SDv(1,92),e.qZA())}function ht(t,o){1&t&&(e.TgZ(0,"span",44),e.SDv(1,93),e.qZA())}function Lt(t,o){if(1&t&&(e.TgZ(0,"div",9)(1,"label",88),e.ynx(2),e.SDv(3,89),e.BQk(),e.TgZ(4,"cd-helper"),e.SDv(5,90),e.qZA()(),e.TgZ(6,"div",12),e._UZ(7,"input",91),e.YNc(8,Ft,2,0,"span",14),e.YNc(9,ht,2,0,"span",14),e.qZA()()),2&t){e.oxw();const _=e.MAs(2),n=e.oxw();e.xp6(8),e.Q6J("ngIf",n.bucketForm.showError("lock_retention_period_days",_,"pattern")),e.xp6(1),e.Q6J("ngIf",n.bucketForm.showError("lock_retention_period_days",_,"lockDays"))}}function yt(t,o){1&t&&(e.TgZ(0,"option",53),e.SDv(1,104),e.qZA()),2&t&&e.Q6J("ngValue",null)}function Dt(t,o){if(1&t&&(e.TgZ(0,"option",56),e._uU(1),e.qZA()),2&t){const _=o.$implicit;e.Q6J("value",_),e.xp6(1),e.Oqu(_)}}function xt(t,o){1&t&&(e.TgZ(0,"span",44),e.SDv(1,105),e.qZA())}function Zt(t,o){if(1&t&&(e.TgZ(0,"div")(1,"div",9)(2,"label",101),e.SDv(3,102),e.qZA(),e.TgZ(4,"div",12)(5,"select",103),e.YNc(6,yt,2,1,"option",18),e.YNc(7,Dt,2,2,"option",19),e.qZA(),e.YNc(8,xt,2,0,"span",14),e.qZA()()()),2&t){e.oxw(2);const _=e.MAs(2),n=e.oxw();e.xp6(5),e.Q6J("autofocus",n.editing),e.xp6(1),e.Q6J("ngIf",null!==n.kmsProviders),e.xp6(1),e.Q6J("ngForOf",n.kmsProviders),e.xp6(1),e.Q6J("ngIf",n.bucketForm.showError("kms_provider",_,"required"))}}function wt(t,o){1&t&&(e.TgZ(0,"span",44),e.SDv(1,109),e.qZA())}function kt(t,o){if(1&t&&(e.TgZ(0,"div")(1,"div",9)(2,"label",106),e.SDv(3,107),e.qZA(),e.TgZ(4,"div",12),e._UZ(5,"input",108),e.YNc(6,wt,2,0,"span",14),e.qZA()()()),2&t){e.oxw(2);const _=e.MAs(2),n=e.oxw();e.xp6(6),e.Q6J("ngIf",n.bucketForm.showError("keyId",_,"required"))}}function qt(t,o){if(1&t&&(e.TgZ(0,"div")(1,"div",9)(2,"div",27)(3,"div",94),e._UZ(4,"input",95),e.TgZ(5,"label",96),e.SDv(6,97),e.qZA()()()(),e.TgZ(7,"div",9)(8,"div",27)(9,"div",94),e._UZ(10,"input",98),e.TgZ(11,"label",99),e.SDv(12,100),e.qZA()()()(),e.YNc(13,Zt,9,4,"div",24),e.YNc(14,kt,7,1,"div",24),e.qZA()),2&t){const _=e.oxw(2);e.xp6(4),e.uIk("disabled",!_.s3VaultConfig||null),e.xp6(6),e.uIk("disabled",!_.kmsVaultConfig||null),e.xp6(3),e.Q6J("ngIf","aws:kms"===_.bucketForm.getValue("encryption_type")),e.xp6(1),e.Q6J("ngIf","aws:kms"===_.bucketForm.getValue("encryption_type"))}}const Qe=function(t){return{required:t}};function Bt(t,o){if(1&t){const _=e.EpF();e.TgZ(0,"div",1)(1,"form",2,3)(3,"div",4)(4,"div",5),e.SDv(5,6),e.ALo(6,"titlecase"),e.ALo(7,"upperFirst"),e.qZA(),e.TgZ(8,"div",7),e.YNc(9,rt,5,0,"div",8),e.TgZ(10,"div",9)(11,"label",10),e.SDv(12,11),e.qZA(),e.TgZ(13,"div",12),e._UZ(14,"input",13),e.YNc(15,lt,2,0,"span",14),e.YNc(16,ct,2,0,"span",14),e.YNc(17,dt,2,0,"span",14),e.YNc(18,ut,2,0,"span",14),e.YNc(19,Rt,2,0,"span",14),e.YNc(20,Et,2,0,"span",14),e.YNc(21,gt,2,0,"span",14),e.YNc(22,ft,2,0,"span",14),e.qZA()(),e.TgZ(23,"div",9)(24,"label",15),e.SDv(25,16),e.qZA(),e.TgZ(26,"div",12)(27,"select",17),e.YNc(28,St,2,1,"option",18),e.YNc(29,Tt,2,1,"option",18),e.YNc(30,Ct,2,2,"option",19),e.qZA(),e.YNc(31,Mt,2,0,"span",14),e.qZA()(),e.TgZ(32,"div",9)(33,"label",20),e.SDv(34,21),e.qZA(),e.TgZ(35,"div",12),e.YNc(36,Pt,5,4,"ng-template",null,22,e.W1O),e.YNc(38,Ot,2,0,"ng-container",23),e.qZA()(),e.YNc(39,Nt,12,0,"fieldset",24),e.YNc(40,It,14,2,"fieldset",24),e.TgZ(41,"fieldset")(42,"legend",25),e.SDv(43,26),e.qZA(),e.TgZ(44,"div",9)(45,"div",27)(46,"div",28),e._UZ(47,"input",29),e.TgZ(48,"label",30),e.SDv(49,31),e.qZA(),e.TgZ(50,"cd-helper")(51,"span"),e.SDv(52,32),e.qZA()()()()(),e.YNc(53,vt,9,0,"div",8),e.YNc(54,Lt,10,2,"div",8),e.qZA(),e.TgZ(55,"fieldset")(56,"legend",25),e.SDv(57,33),e.qZA(),e.TgZ(58,"div",9)(59,"div",27)(60,"div",28),e._UZ(61,"input",34),e.TgZ(62,"label",35),e.SDv(63,36),e.qZA(),e.TgZ(64,"cd-helper")(65,"span"),e.tHW(66,37),e.TgZ(67,"a",38),e.NdJ("click",function(){return e.CHM(_),e.oxw().openConfigModal()}),e.qZA(),e.N_p(),e.qZA()()()()(),e.YNc(68,qt,15,4,"div",24),e.qZA()(),e.TgZ(69,"div",39)(70,"cd-form-button-panel",40),e.NdJ("submitActionEvent",function(){return e.CHM(_),e.oxw().submit()}),e.ALo(71,"titlecase"),e.ALo(72,"upperFirst"),e.qZA()()()()()}if(2&t){const _=e.MAs(2),n=e.MAs(37),i=e.oxw();e.xp6(1),e.Q6J("formGroup",i.bucketForm),e.xp6(6),e.pQV(e.lcZ(6,31,i.action))(e.lcZ(7,33,i.resource)),e.QtT(5),e.xp6(2),e.Q6J("ngIf",i.editing),e.xp6(2),e.Q6J("ngClass",e.VKq(39,Qe,!i.editing)),e.xp6(3),e.Q6J("readonly",i.editing)("autofocus",!i.editing),e.xp6(1),e.Q6J("ngIf",i.bucketForm.showError("bid",_,"required")),e.xp6(1),e.Q6J("ngIf",i.bucketForm.showError("bid",_,"bucketNameInvalid")),e.xp6(1),e.Q6J("ngIf",i.bucketForm.showError("bid",_,"bucketNameNotAllowed")),e.xp6(1),e.Q6J("ngIf",i.bucketForm.showError("bid",_,"containsUpperCase")),e.xp6(1),e.Q6J("ngIf",i.bucketForm.showError("bid",_,"lowerCaseOrNumber")),e.xp6(1),e.Q6J("ngIf",i.bucketForm.showError("bid",_,"ipAddress")),e.xp6(1),e.Q6J("ngIf",i.bucketForm.showError("bid",_,"onlyLowerCaseAndNumbers")),e.xp6(1),e.Q6J("ngIf",i.bucketForm.showError("bid",_,"shouldBeInRange")),e.xp6(5),e.Q6J("autofocus",i.editing),e.xp6(1),e.Q6J("ngIf",null===i.owners),e.xp6(1),e.Q6J("ngIf",null!==i.owners),e.xp6(1),e.Q6J("ngForOf",i.owners),e.xp6(1),e.Q6J("ngIf",i.bucketForm.showError("owner",_,"required")),e.xp6(2),e.Q6J("ngClass",e.VKq(41,Qe,!i.editing)),e.xp6(5),e.Q6J("ngIf",i.editing)("ngIfElse",n),e.xp6(1),e.Q6J("ngIf",i.editing),e.xp6(1),e.Q6J("ngIf",i.editing),e.xp6(13),e.Q6J("ngIf",i.bucketForm.getValue("lock_enabled")),e.xp6(1),e.Q6J("ngIf",i.bucketForm.getValue("lock_enabled")),e.xp6(7),e.uIk("disabled",!i.kmsVaultConfig&&!i.s3VaultConfig||null),e.xp6(7),e.Q6J("ngIf",i.bucketForm.getValue("encryption_enabled")),e.xp6(2),e.Q6J("form",i.bucketForm)("submitText",e.lcZ(71,35,i.action)+" "+e.lcZ(72,37,i.resource))}}let Ye=(()=>{class t extends Xe.E{constructor(_,n,i,s,r,d,g,E,S,P,O){super(),this.route=_,this.router=n,this.formBuilder=i,this.rgwBucketService=s,this.rgwSiteService=r,this.modalService=d,this.rgwUserService=g,this.notificationService=E,this.rgwEncryptionModal=S,this.actionLabels=P,this.changeDetectorRef=O,this.editing=!1,this.owners=null,this.kmsProviders=null,this.placementTargets=[],this.isVersioningAlreadyEnabled=!1,this.isMfaDeleteAlreadyEnabled=!1,this.icons=w.P,this.kmsVaultConfig=!1,this.s3VaultConfig=!1,this.editing=this.router.url.startsWith(`/rgw/bucket/${G.MQ.EDIT}`),this.action=this.editing?this.actionLabels.EDIT:this.actionLabels.CREATE,this.resource="bucket",this.createForm()}get isVersioningEnabled(){return this.bucketForm.getValue("versioning")}get isMfaDeleteEnabled(){return this.bucketForm.getValue("mfa-delete")}ngAfterViewChecked(){this.changeDetectorRef.detectChanges()}createForm(){const _=this,n=p.h.custom("lockDays",()=>{if(!_.bucketForm||!R().get(_.bucketForm.getRawValue(),"lock_enabled"))return!1;const i=Number(_.bucketForm.getValue("lock_retention_period_days"));return!Number.isInteger(i)||0===i});this.bucketForm=this.formBuilder.group({id:[null],bid:[null,[a.kI.required],this.editing?[]:[p.h.bucketName(),p.h.bucketExistence(!1,this.rgwBucketService)]],owner:[null,[a.kI.required]],kms_provider:["vault"],"placement-target":[null,this.editing?[]:[a.kI.required]],versioning:[null],"mfa-delete":[null],"mfa-token-serial":[""],"mfa-token-pin":[""],lock_enabled:[{value:!1,disabled:this.editing}],encryption_enabled:[null],encryption_type:[null,[p.h.requiredIf({encryption_enabled:!0})]],keyId:[null,[p.h.requiredIf({encryption_type:"aws:kms",encryption_enabled:!0})]],lock_mode:["COMPLIANCE"],lock_retention_period_days:[0,[p.h.number(!1),n]]})}ngOnInit(){const _={owners:this.rgwUserService.enumerate()};this.kmsProviders=this.rgwEncryptionModal.kmsProviders,this.rgwBucketService.getEncryptionConfig().subscribe(n=>{this.kmsVaultConfig=n[0],this.s3VaultConfig=n[1],this.kmsVaultConfig&&this.s3VaultConfig?this.bucketForm.get("encryption_type").setValue(""):this.kmsVaultConfig?this.bucketForm.get("encryption_type").setValue("aws:kms"):this.s3VaultConfig?this.bucketForm.get("encryption_type").setValue("AES256"):this.bucketForm.get("encryption_type").setValue("")}),this.editing||(_.getPlacementTargets=this.rgwSiteService.get("placement-targets")),this.route.params.subscribe(n=>{if(n.hasOwnProperty("bid")){const i=decodeURIComponent(n.bid);_.getBid=this.rgwBucketService.get(i)}(0,te.D)(_).subscribe(i=>{if(this.owners=i.owners.sort(),i.getPlacementTargets){const s=i.getPlacementTargets;this.zonegroup=s.zonegroup,R().forEach(s.placement_targets,r=>{r.description=`${r.name} (${"pool"}: ${r.data_pool})`,this.placementTargets.push(r)}),1===this.placementTargets.length&&this.bucketForm.get("placement-target").setValue(this.placementTargets[0].name)}if(i.getBid){const s=i.getBid,r=R().clone(this.bucketForm.getRawValue());let d=R().pick(s,R().keys(r));d.lock_retention_period_days=this.rgwBucketService.getLockDays(s),d["placement-target"]=s.placement_rule,d.versioning=s.versioning===Q.ENABLED,d["mfa-delete"]=s.mfa_delete===z.ENABLED,d.encryption_enabled="Enabled"===s.encryption,d=R().merge(r,d),this.bucketForm.setValue(d),this.editing&&(this.isVersioningAlreadyEnabled=this.isVersioningEnabled,this.isMfaDeleteAlreadyEnabled=this.isMfaDeleteEnabled,this.setMfaDeleteValidators(),d.lock_enabled&&this.bucketForm.controls.versioning.disable())}this.loadingReady()})})}goToListView(){this.router.navigate(["/rgw/bucket"])}submit(){if(null==this.bucketForm.getValue("encryption_enabled")&&(this.bucketForm.get("encryption_enabled").setValue(!1),this.bucketForm.get("encryption_type").setValue(null)),this.bucketForm.pristine)return void this.goToListView();const _=this.bucketForm.value;if(this.editing){const n=this.getVersioningStatus(),i=this.getMfaDeleteStatus();this.rgwBucketService.update(_.bid,_.id,_.owner,n,_.encryption_enabled,_.encryption_type,_.keyId,i,_["mfa-token-serial"],_["mfa-token-pin"],_.lock_mode,_.lock_retention_period_days).subscribe(()=>{this.notificationService.show(ne.k.success,"Updated Object Gateway bucket '" + _.bid + "'."),this.goToListView()},()=>{this.bucketForm.setErrors({cdSubmitButton:!0})})}else this.rgwBucketService.create(_.bid,_.owner,this.zonegroup,_["placement-target"],_.lock_enabled,_.lock_mode,_.lock_retention_period_days,_.encryption_enabled,_.encryption_type,_.keyId).subscribe(()=>{this.notificationService.show(ne.k.success,"Created Object Gateway bucket '" + _.bid + "'"),this.goToListView()},()=>{this.bucketForm.setErrors({cdSubmitButton:!0})})}areMfaCredentialsRequired(){return this.isMfaDeleteEnabled!==this.isMfaDeleteAlreadyEnabled||this.isMfaDeleteAlreadyEnabled&&this.isVersioningEnabled!==this.isVersioningAlreadyEnabled}setMfaDeleteValidators(){const _=this.bucketForm.get("mfa-token-serial"),n=this.bucketForm.get("mfa-token-pin");this.areMfaCredentialsRequired()?(_.setValidators(a.kI.required),n.setValidators(a.kI.required)):(_.setValidators(null),n.setValidators(null)),_.updateValueAndValidity(),n.updateValueAndValidity()}getVersioningStatus(){return this.isVersioningEnabled?Q.ENABLED:Q.SUSPENDED}getMfaDeleteStatus(){return this.isMfaDeleteEnabled?z.ENABLED:z.DISABLED}fileUpload(_,n){const i=_[0];(new FileReader).addEventListener("load",()=>{const r=this.bucketForm.get(n);r.setValue(i),r.markAsDirty(),r.markAsTouched(),r.updateValueAndValidity()})}openConfigModal(){this.modalService.show(at,null,{size:"lg"}).componentInstance.configForm.get("encryptionType").setValue(this.bucketForm.getValue("encryption_type"))}}return t.\u0275fac=function(_){return new(_||t)(e.Y36(H.gz),e.Y36(H.F0),e.Y36(Y.O),e.Y36(Ne.o),e.Y36(ke.I),e.Y36(ie.Z),e.Y36(D),e.Y36(he.g),e.Y36(We),e.Y36(G.p4),e.Y36(e.sBO))},t.\u0275cmp=e.Xpm({type:t,selectors:[["cd-rgw-bucket-form"]],features:[e._Bn([We]),e.qOj],decls:1,vars:1,consts:function(){let o,_,n,i,s,r,d,g,E,S,P,O,N,b,m,W,$,U,I,v,F,h,L,y,f,x,T,q,B,C,ae,re,le,ce,de,ue,Re,Ee,ge,fe,Se,Te,Ce,Me,pe,me,Ae,Ge,Pe,Oe;return o="" + "\ufffd0\ufffd" + " " + "\ufffd1\ufffd" + "",_="Name",n="Name...",i="Owner",s="Placement target",r="Locking",d="Enabled",g="Enables locking for the objects in the bucket. Locking can only be enabled while creating a bucket.",E="Security",S="Encryption",P="Enables encryption for the objects in the bucket. To enable encryption on a bucket you need to set the configuration values for SSE-S3 or SSE-KMS. To set the configuration values " + "\ufffd#67\ufffd" + "Click here" + "\ufffd/#67\ufffd" + "",O="Id",N="This field is required.",b="Bucket names can only contain lowercase letters, numbers, periods and hyphens.",m="The chosen name is already in use.",W="Bucket names must not contain uppercase characters or underscores.",$="Each label must start and end with a lowercase letter or a number.",U="Bucket names cannot be formatted as IP address.",I="Bucket labels cannot be empty and can only contain lowercase letters, numbers and hyphens.",v="Bucket names must be 3 to 63 characters long.",F="Loading...",h="-- Select a user --",L="This field is required.",y="Loading...",f="-- Select a placement target --",x="This field is required.",T="Versioning",q="Enabled",B="Enables versioning for the objects in the bucket.",C="Multi-Factor Authentication",ae="Delete enabled",re="Enables MFA (multi-factor authentication) Delete, which requires additional authentication for changing the bucket versioning state.",le="Token Serial Number",ce="This field is required.",de="Token PIN",ue="This field is required.",Re="Mode",Ee="Compliance",ge="Governance",fe="Days",Se="The number of days that you want to specify for the default retention period that will be applied to new objects placed in this bucket.",Te="The entered value must be a positive integer.",Ce="Retention Days must be a positive integer.",Me="SSE-S3 Encryption",pe="Connect to an external key management service",me="KMS Provider",Ae="-- Select a provider --",Ge="This field is required.",Pe="Key Id ",Oe="This field is required.",[["class","cd-col-form",4,"cdFormLoading"],[1,"cd-col-form"],["name","bucketForm","novalidate","",3,"formGroup"],["frm","ngForm"],[1,"card"],[1,"card-header"],o,[1,"card-body"],["class","form-group row",4,"ngIf"],[1,"form-group","row"],["for","bid",1,"cd-col-form-label",3,"ngClass"],_,[1,"cd-col-form-input"],["id","bid","name","bid","type","text","placeholder",n,"formControlName","bid",1,"form-control",3,"readonly","autofocus"],["class","invalid-feedback",4,"ngIf"],["for","owner",1,"cd-col-form-label","required"],i,["id","owner","name","owner","formControlName","owner",1,"form-select",3,"autofocus"],[3,"ngValue",4,"ngIf"],[3,"value",4,"ngFor","ngForOf"],["for","placement-target",1,"cd-col-form-label",3,"ngClass"],s,["placementTargetSelect",""],[4,"ngIf","ngIfElse"],[4,"ngIf"],[1,"cd-header"],r,[1,"cd-col-form-offset"],[1,"custom-control","custom-checkbox"],["id","lock_enabled","formControlName","lock_enabled","type","checkbox",1,"custom-control-input"],["for","lock_enabled",1,"custom-control-label"],d,g,E,["id","encryption_enabled","name","encryption_enabled","formControlName","encryption_enabled","type","checkbox",1,"form-check-input"],["for","encryption_enabled",1,"form-check-label"],S,P,["href","#/rgw/bucket/create",3,"click"],[1,"card-footer"],["wrappingClass","text-right",3,"form","submitText","submitActionEvent"],["for","id",1,"cd-col-form-label"],O,["id","id","name","id","type","text","formControlName","id","readonly","",1,"form-control"],[1,"invalid-feedback"],N,b,m,W,$,U,I,v,[3,"ngValue"],F,h,[3,"value"],L,["id","placement-target","name","placement-target","formControlName","placement-target",1,"form-select"],y,f,x,["id","placement-target","name","placement-target","formControlName","placement-target","type","text","readonly","",1,"form-control"],T,["type","checkbox","id","versioning","name","versioning","formControlName","versioning",1,"custom-control-input",3,"change"],["for","versioning",1,"custom-control-label"],q,B,C,["type","checkbox","id","mfa-delete","name","mfa-delete","formControlName","mfa-delete",1,"custom-control-input",3,"change"],["for","mfa-delete",1,"custom-control-label"],ae,re,["for","mfa-token-serial",1,"cd-col-form-label"],le,["type","text","id","mfa-token-serial","name","mfa-token-serial","formControlName","mfa-token-serial",1,"form-control"],ce,["for","mfa-token-pin",1,"cd-col-form-label"],de,["type","text","id","mfa-token-pin","name","mfa-token-pin","formControlName","mfa-token-pin",1,"form-control"],ue,["for","lock_mode",1,"cd-col-form-label"],Re,["formControlName","lock_mode","name","lock_mode","id","lock_mode",1,"form-select"],["value","COMPLIANCE"],Ee,["value","GOVERNANCE"],ge,["for","lock_retention_period_days",1,"cd-col-form-label"],fe,Se,["type","number","id","lock_retention_period_days","formControlName","lock_retention_period_days","min","0",1,"form-control"],Te,Ce,[1,"custom-control","custom-radio","custom-control-inline","ps-5"],["formControlName","encryption_type","id","sse_S3_enabled","type","radio","name","encryption_type","value","AES256",1,"form-check-input"],["for","sse_S3_enabled",1,"form-control-label"],Me,["formControlName","encryption_type","id","kms_enabled","name","encryption_type","value","aws:kms","type","radio",1,"form-check-input"],["for","kms_enabled",1,"form-control-label"],pe,["for","kms_provider",1,"cd-col-form-label","required"],me,["id","kms_provider","name","kms_provider","formControlName","kms_provider",1,"form-select",3,"autofocus"],Ae,Ge,["for","keyId",1,"cd-col-form-label","required"],Pe,["id","keyId","name","keyId","type","text","formControlName","keyId",1,"form-control"],Oe]},template:function(_,n){1&_&&e.YNc(0,Bt,73,43,"div",0),2&_&&e.Q6J("cdFormLoading",n.loading)},directives:[ze.y,a._Y,a.JL,J.V,a.sg,M.O5,X.P,k.o,a.Fj,K.b,a.JJ,a.u,M.mk,se.U,a.EJ,a.YN,a.Kr,M.sg,a.Wl,Ke.S,a.wV,a.qQ,a._,V.p],pipes:[M.rS,j.m],styles:[""]}),t})();var Je=l(70882),Le=l(68136),Ve=l(30982),ee=l(83697),ye=l(68774),je=l(47557),e_=l(66369),_e=l(51847),$e=l(47640),__=l(94928),Ht=l(96102),t_=l(68962);function Xt(t,o){1&t&&(e.TgZ(0,"td"),e.SDv(1,25),e.qZA())}function Kt(t,o){if(1&t&&(e.TgZ(0,"td"),e._uU(1),e.ALo(2,"dimless"),e.qZA()),2&t){const _=e.oxw(3);e.xp6(1),e.hij(" ",e.lcZ(2,1,_.selection.bucket_quota.max_size)," ")}}function zt(t,o){1&t&&(e.TgZ(0,"td"),e.SDv(1,26),e.qZA())}function Qt(t,o){if(1&t&&(e.TgZ(0,"td"),e._uU(1),e.qZA()),2&t){const _=e.oxw(3);e.xp6(1),e.hij(" ",_.selection.bucket_quota.max_objects," ")}}function Yt(t,o){if(1&t&&(e.TgZ(0,"div")(1,"legend"),e.SDv(2,21),e.qZA(),e.TgZ(3,"table",1)(4,"tbody")(5,"tr")(6,"td",2),e.SDv(7,22),e.qZA(),e.TgZ(8,"td",4),e._uU(9),e.ALo(10,"booleanText"),e.qZA()(),e.TgZ(11,"tr")(12,"td",5),e.SDv(13,23),e.qZA(),e.YNc(14,Xt,2,0,"td",0),e.YNc(15,Kt,3,3,"td",0),e.qZA(),e.TgZ(16,"tr")(17,"td",5),e.SDv(18,24),e.qZA(),e.YNc(19,zt,2,0,"td",0),e.YNc(20,Qt,2,1,"td",0),e.qZA()()()()),2&t){const _=e.oxw(2);e.xp6(9),e.Oqu(e.lcZ(10,5,_.selection.bucket_quota.enabled)),e.xp6(5),e.Q6J("ngIf",_.selection.bucket_quota.max_size<=-1),e.xp6(1),e.Q6J("ngIf",_.selection.bucket_quota.max_size>-1),e.xp6(4),e.Q6J("ngIf",_.selection.bucket_quota.max_objects<=-1),e.xp6(1),e.Q6J("ngIf",_.selection.bucket_quota.max_objects>-1)}}function Jt(t,o){if(1&t&&(e.ynx(0),e.TgZ(1,"tr")(2,"td",5),e.SDv(3,27),e.qZA(),e.TgZ(4,"td"),e._uU(5),e.qZA()(),e.TgZ(6,"tr")(7,"td",5),e.SDv(8,28),e.qZA(),e.TgZ(9,"td"),e._uU(10),e.qZA()(),e.BQk()),2&t){const _=e.oxw(2);e.xp6(5),e.Oqu(_.selection.lock_mode),e.xp6(5),e.Oqu(_.selection.lock_retention_period_days)}}function Vt(t,o){if(1&t&&(e.ynx(0),e.TgZ(1,"table",1)(2,"tbody")(3,"tr")(4,"td",2),e.SDv(5,3),e.qZA(),e.TgZ(6,"td",4),e._uU(7),e.qZA()(),e.TgZ(8,"tr")(9,"td",5),e.SDv(10,6),e.qZA(),e.TgZ(11,"td"),e._uU(12),e.qZA()(),e.TgZ(13,"tr")(14,"td",5),e.SDv(15,7),e.qZA(),e.TgZ(16,"td"),e._uU(17),e.qZA()(),e.TgZ(18,"tr")(19,"td",5),e.SDv(20,8),e.qZA(),e.TgZ(21,"td"),e._uU(22),e.qZA()(),e.TgZ(23,"tr")(24,"td",5),e.SDv(25,9),e.qZA(),e.TgZ(26,"td"),e._uU(27),e.qZA()(),e.TgZ(28,"tr")(29,"td",5),e.SDv(30,10),e.qZA(),e.TgZ(31,"td"),e._uU(32),e.qZA()(),e.TgZ(33,"tr")(34,"td",5),e.SDv(35,11),e.qZA(),e.TgZ(36,"td"),e._uU(37),e.qZA()(),e.TgZ(38,"tr")(39,"td",5),e.SDv(40,12),e.qZA(),e.TgZ(41,"td"),e._uU(42),e.qZA()(),e.TgZ(43,"tr")(44,"td",5),e.SDv(45,13),e.qZA(),e.TgZ(46,"td"),e._uU(47),e.qZA()(),e.TgZ(48,"tr")(49,"td",5),e.SDv(50,14),e.qZA(),e.TgZ(51,"td"),e._uU(52),e.ALo(53,"cdDate"),e.qZA()(),e.TgZ(54,"tr")(55,"td",5),e.SDv(56,15),e.qZA(),e.TgZ(57,"td"),e._uU(58),e.qZA()(),e.TgZ(59,"tr")(60,"td",5),e.SDv(61,16),e.qZA(),e.TgZ(62,"td"),e._uU(63),e.qZA()(),e.TgZ(64,"tr")(65,"td",5),e.SDv(66,17),e.qZA(),e.TgZ(67,"td"),e._uU(68),e.qZA()(),e.TgZ(69,"tr")(70,"td",5),e.SDv(71,18),e.qZA(),e.TgZ(72,"td"),e._uU(73),e.qZA()()()(),e.YNc(74,Yt,21,7,"div",0),e.TgZ(75,"legend"),e.SDv(76,19),e.qZA(),e.TgZ(77,"table",1)(78,"tbody")(79,"tr")(80,"td",2),e.SDv(81,20),e.qZA(),e.TgZ(82,"td",4),e._uU(83),e.ALo(84,"booleanText"),e.qZA()(),e.YNc(85,Jt,11,2,"ng-container",0),e.qZA()(),e.BQk()),2&t){const _=e.oxw();e.xp6(7),e.Oqu(_.selection.bid),e.xp6(5),e.Oqu(_.selection.id),e.xp6(5),e.Oqu(_.selection.owner),e.xp6(5),e.Oqu(_.selection.index_type),e.xp6(5),e.Oqu(_.selection.placement_rule),e.xp6(5),e.Oqu(_.selection.marker),e.xp6(5),e.Oqu(_.selection.max_marker),e.xp6(5),e.Oqu(_.selection.ver),e.xp6(5),e.Oqu(_.selection.master_ver),e.xp6(5),e.Oqu(e.lcZ(53,17,_.selection.mtime)),e.xp6(6),e.Oqu(_.selection.zonegroup),e.xp6(5),e.Oqu(_.selection.versioning),e.xp6(5),e.Oqu(_.selection.encryption),e.xp6(5),e.Oqu(_.selection.mfa_delete),e.xp6(1),e.Q6J("ngIf",_.selection.bucket_quota),e.xp6(9),e.Oqu(e.lcZ(84,19,_.selection.lock_enabled)),e.xp6(2),e.Q6J("ngIf",_.selection.lock_enabled)}}let jt=(()=>{class t{constructor(_){this.rgwBucketService=_}ngOnChanges(){this.selection&&this.rgwBucketService.get(this.selection.bid).subscribe(_=>{_.lock_retention_period_days=this.rgwBucketService.getLockDays(_),this.selection=_})}}return t.\u0275fac=function(_){return new(_||t)(e.Y36(Ne.o))},t.\u0275cmp=e.Xpm({type:t,selectors:[["cd-rgw-bucket-details"]],inputs:{selection:"selection"},features:[e.TTD],decls:1,vars:1,consts:function(){let o,_,n,i,s,r,d,g,E,S,P,O,N,b,m,W,$,U,I,v,F,h,L,y;return o="Name",_="ID",n="Owner",i="Index type",s="Placement rule",r="Marker",d="Maximum marker",g="Version",E="Master version",S="Modification time",P="Zonegroup",O="Versioning",N="Encryption",b="MFA Delete",m="Locking",W="Enabled",$="Bucket quota",U="Enabled",I="Maximum size",v="Maximum objects",F="Unlimited",h="Unlimited",L="Mode",y="Days",[[4,"ngIf"],[1,"table","table-striped","table-bordered"],[1,"bold","w-25"],o,[1,"w-75"],[1,"bold"],_,n,i,s,r,d,g,E,S,P,O,N,b,m,W,$,U,I,v,F,h,L,y]},template:function(_,n){1&_&&e.YNc(0,Vt,86,21,"ng-container",0),2&_&&e.Q6J("ngIf",n.selection)},directives:[M.O5],pipes:[Ht.N,t_.T,e_.n],styles:["table[_ngcontent-%COMP%]{table-layout:fixed}table[_ngcontent-%COMP%]   td[_ngcontent-%COMP%]{word-wrap:break-word}"]}),t})();var n_=l(60251);const en=["bucketSizeTpl"],_n=["bucketObjectTpl"];function tn(t,o){if(1&t&&e._UZ(0,"cd-usage-bar",8),2&t){const _=e.oxw().row;e.Q6J("total",_.bucket_quota.max_size)("used",_.bucket_size)}}function nn(t,o){1&t&&e.SDv(0,9)}function on(t,o){if(1&t&&(e.YNc(0,tn,1,2,"cd-usage-bar",6),e.YNc(1,nn,1,0,"ng-template",null,7,e.W1O)),2&t){const _=o.row,n=e.MAs(2);e.Q6J("ngIf",_.bucket_quota.max_size>0&&_.bucket_quota.enabled)("ngIfElse",n)}}function sn(t,o){if(1&t&&e._UZ(0,"cd-usage-bar",12),2&t){const _=e.oxw().row;e.Q6J("total",_.bucket_quota.max_objects)("used",_.num_objects)("isBinary",!1)}}function an(t,o){1&t&&e.SDv(0,13)}function rn(t,o){if(1&t&&(e.YNc(0,sn,1,3,"cd-usage-bar",10),e.YNc(1,an,1,0,"ng-template",null,11,e.W1O)),2&t){const _=o.row,n=e.MAs(2);e.Q6J("ngIf",_.bucket_quota.max_objects>0&&_.bucket_quota.enabled)("ngIfElse",n)}}let cn=(()=>{class t extends Le.o{constructor(_,n,i,s,r,d,g,E){super(E),this.authStorageService=_,this.dimlessBinaryPipe=n,this.dimlessPipe=i,this.rgwBucketService=s,this.modalService=r,this.urlBuilder=d,this.actionLabels=g,this.ngZone=E,this.columns=[],this.buckets=[],this.selection=new ye.r}ngOnInit(){this.permission=this.authStorageService.getPermissions().rgw,this.columns=[{name:"Name",prop:"bid",flexGrow:2},{name:"Owner",prop:"owner",flexGrow:2.5},{name:"Used Capacity",prop:"bucket_size",flexGrow:.6,pipe:this.dimlessBinaryPipe},{name:"Capacity Limit %",prop:"size_usage",cellTemplate:this.bucketSizeTpl,flexGrow:.8},{name:"Objects",prop:"num_objects",flexGrow:.6,pipe:this.dimlessPipe},{name:"Object Limit %",prop:"object_usage",cellTemplate:this.bucketObjectTpl,flexGrow:.8}];const _=()=>this.selection.first()&&`${encodeURIComponent(this.selection.first().bid)}`;this.tableActions=[{permission:"create",icon:w.P.add,routerLink:()=>this.urlBuilder.getCreate(),name:this.actionLabels.CREATE,canBePrimary:r=>!r.hasSelection},{permission:"update",icon:w.P.edit,routerLink:()=>this.urlBuilder.getEdit(_()),name:this.actionLabels.EDIT},{permission:"delete",icon:w.P.destroy,click:()=>this.deleteAction(),disable:()=>!this.selection.hasSelection,name:this.actionLabels.DELETE,canBePrimary:r=>r.hasMultiSelection}],this.setTableRefreshTimeout()}transformBucketData(){R().forEach(this.buckets,_=>{const n=_.bucket_quota.max_size,i=_.bucket_quota.max_objects;_.bucket_size=0,_.num_objects=0,R().isEmpty(_.usage)||(_.bucket_size=_.usage["rgw.main"].size_actual,_.num_objects=_.usage["rgw.main"].num_objects),_.size_usage=n>0?_.bucket_size/n:void 0,_.object_usage=i>0?_.num_objects/i:void 0})}getBucketList(_){this.setTableRefreshTimeout(),this.rgwBucketService.list(!0).subscribe(n=>{this.buckets=n,this.transformBucketData()},()=>{_.error()})}updateSelection(_){this.selection=_}deleteAction(){this.modalService.show(Ve.M,{itemDescription:this.selection.hasSingleSelection?"bucket":"buckets",itemNames:this.selection.selected.map(_=>_.bid),submitActionObservable:()=>new Je.y(_=>{(0,te.D)(this.selection.selected.map(n=>this.rgwBucketService.delete(n.bid))).subscribe({error:n=>{_.error(n),this.table.refreshBtn()},complete:()=>{_.complete(),this.table.refreshBtn()}})})})}}return t.\u0275fac=function(_){return new(_||t)(e.Y36($e.j),e.Y36(je.$),e.Y36(e_.n),e.Y36(Ne.o),e.Y36(ie.Z),e.Y36(_e.F),e.Y36(G.p4),e.Y36(e.R0b))},t.\u0275cmp=e.Xpm({type:t,selectors:[["cd-rgw-bucket-list"]],viewQuery:function(_,n){if(1&_&&(e.Gf(ee.a,7),e.Gf(en,7),e.Gf(_n,7)),2&_){let i;e.iGM(i=e.CRH())&&(n.table=i.first),e.iGM(i=e.CRH())&&(n.bucketSizeTpl=i.first),e.iGM(i=e.CRH())&&(n.bucketObjectTpl=i.first)}},features:[e._Bn([{provide:_e.F,useValue:new _e.F("rgw/bucket")}]),e.qOj],decls:8,vars:9,consts:function(){let o,_;return o="No Limit",_="No Limit",[["columnMode","flex","selectionType","multiClick","identifier","bid",3,"autoReload","data","columns","hasDetails","status","setExpandedRow","updateSelection","fetchData"],["table",""],[1,"table-actions",3,"permission","selection","tableActions"],["cdTableDetail","",3,"selection"],["bucketSizeTpl",""],["bucketObjectTpl",""],[3,"total","used",4,"ngIf","ngIfElse"],["noSizeQuota",""],[3,"total","used"],o,[3,"total","used","isBinary",4,"ngIf","ngIfElse"],["noObjectQuota",""],[3,"total","used","isBinary"],_]},template:function(_,n){1&_&&(e.TgZ(0,"cd-table",0,1),e.NdJ("setExpandedRow",function(s){return n.setExpandedRow(s)})("updateSelection",function(s){return n.updateSelection(s)})("fetchData",function(s){return n.getBucketList(s)}),e._UZ(2,"cd-table-actions",2)(3,"cd-rgw-bucket-details",3),e.qZA(),e.YNc(4,on,3,2,"ng-template",null,4,e.W1O),e.YNc(6,rn,3,2,"ng-template",null,5,e.W1O)),2&_&&(e.Q6J("autoReload",!1)("data",n.buckets)("columns",n.columns)("hasDetails",!0)("status",n.tableStatus),e.xp6(2),e.Q6J("permission",n.permission)("selection",n.selection)("tableActions",n.tableActions),e.xp6(1),e.Q6J("selection",n.expandedRow))},directives:[ee.a,__.K,jt,M.O5,n_.O],styles:[""]}),t})();var dn=l(58111),o_=l(59376),un=l(61350),Rn=l(60351),i_=l(76317);function En(t,o){if(1&t){const _=e.EpF();e.TgZ(0,"cd-table-key-value",11),e.NdJ("fetchData",function(){return e.CHM(_),e.oxw(2).getMetaData()}),e.qZA()}if(2&t){const _=e.oxw(2);e.Q6J("data",_.metadata)}}function gn(t,o){if(1&t&&e._UZ(0,"cd-table-performance-counter",12),2&t){const _=e.oxw(2);e.Q6J("serviceId",_.serviceMapId)}}function fn(t,o){if(1&t&&e._UZ(0,"cd-grafana",15),2&t){const _=e.oxw(3);e.Q6J("grafanaPath","rgw-instance-detail?var-rgw_servers=rgw."+_.serviceId)("type","metrics")}}function Sn(t,o){1&t&&(e.ynx(0,13),e.TgZ(1,"a",4),e.SDv(2,14),e.qZA(),e.YNc(3,fn,1,2,"ng-template",6),e.BQk())}function Tn(t,o){if(1&t&&(e.ynx(0),e.TgZ(1,"nav",1,2),e.ynx(3,3),e.TgZ(4,"a",4),e.SDv(5,5),e.qZA(),e.YNc(6,En,1,1,"ng-template",6),e.BQk(),e.ynx(7,7),e.TgZ(8,"a",4),e.SDv(9,8),e.qZA(),e.YNc(10,gn,1,1,"ng-template",6),e.BQk(),e.YNc(11,Sn,4,0,"ng-container",9),e.qZA(),e._UZ(12,"div",10),e.BQk()),2&t){const _=e.MAs(2),n=e.oxw();e.xp6(11),e.Q6J("ngIf",n.grafanaPermission.read),e.xp6(1),e.Q6J("ngbNavOutlet",_)}}let Cn=(()=>{class t{constructor(_,n){this.rgwDaemonService=_,this.authStorageService=n,this.serviceId="",this.serviceMapId="",this.grafanaPermission=this.authStorageService.getPermissions().grafana}ngOnChanges(){this.selection&&(this.serviceId=this.selection.id,this.serviceMapId=this.selection.service_map_id)}getMetaData(){R().isEmpty(this.serviceId)||this.rgwDaemonService.get(this.serviceId).subscribe(_=>{this.metadata=_.rgw_metadata})}}return t.\u0275fac=function(_){return new(_||t)(e.Y36(be.b),e.Y36($e.j))},t.\u0275cmp=e.Xpm({type:t,selectors:[["cd-rgw-daemon-details"]],inputs:{selection:"selection"},features:[e.TTD],decls:1,vars:1,consts:function(){let o,_,n,i;return o="Details",_="Performance Counters",n="Performance Details",i="RGW instance details",[[4,"ngIf"],["ngbNav","","cdStatefulTab","rgw-daemon-details",1,"nav-tabs"],["nav","ngbNav"],["ngbNavItem","details"],["ngbNavLink",""],o,["ngbNavContent",""],["ngbNavItem","performance-counters"],_,["ngbNavItem","performance-details",4,"ngIf"],[3,"ngbNavOutlet"],[3,"data","fetchData"],["serviceType","rgw",3,"serviceId"],["ngbNavItem","performance-details"],n,["title",i,"uid","x5ARzZtmk","grafanaStyle","one",3,"grafanaPath","type"]]},template:function(_,n){1&_&&e.YNc(0,Tn,13,2,"ng-container",0),2&_&&e.Q6J("ngIf",n.selection)},directives:[M.O5,A.Pz,o_.m,A.nv,A.Vx,A.uN,un.b,Rn.p,i_.F,A.tO],styles:[""]}),t})();function Mn(t,o){if(1&t){const _=e.EpF();e.TgZ(0,"cd-table",8),e.NdJ("setExpandedRow",function(i){return e.CHM(_),e.oxw().setExpandedRow(i)})("fetchData",function(i){return e.CHM(_),e.oxw().getDaemonList(i)}),e._UZ(1,"cd-rgw-daemon-details",9),e.qZA()}if(2&t){const _=e.oxw();e.Q6J("data",_.daemons)("columns",_.columns)("hasDetails",!0),e.xp6(1),e.Q6J("selection",_.expandedRow)}}function pn(t,o){1&t&&e._UZ(0,"cd-grafana",11),2&t&&e.Q6J("grafanaPath","rgw-overview?")("type","metrics")}function mn(t,o){1&t&&(e.ynx(0,2),e.TgZ(1,"a",3),e.SDv(2,10),e.qZA(),e.YNc(3,pn,1,2,"ng-template",5),e.BQk())}function An(t,o){1&t&&e._UZ(0,"cd-grafana",13),2&t&&e.Q6J("grafanaPath","radosgw-sync-overview?")("type","metrics")}function Gn(t,o){1&t&&(e.ynx(0,2),e.TgZ(1,"a",3),e.SDv(2,12),e.qZA(),e.YNc(3,An,1,2,"ng-template",5),e.BQk())}let Pn=(()=>{class t extends Le.o{constructor(_,n,i,s){super(),this.rgwDaemonService=_,this.authStorageService=n,this.cephShortVersionPipe=i,this.rgwSiteService=s,this.columns=[],this.daemons=[],this.updateDaemons=r=>{this.daemons=r}}ngOnInit(){this.grafanaPermission=this.authStorageService.getPermissions().grafana,this.columns=[{name:"ID",prop:"id",flexGrow:2},{name:"Hostname",prop:"server_hostname",flexGrow:2},{name:"Zone",prop:"zone_name",flexGrow:2},{name:"Zone Group",prop:"zonegroup_name",flexGrow:2},{name:"Realm",prop:"realm_name",flexGrow:2},{name:"Version",prop:"version",flexGrow:1,pipe:this.cephShortVersionPipe}],this.rgwSiteService.get("realms").subscribe(_=>this.isMultiSite=_.length>0)}getDaemonList(_){this.rgwDaemonService.list().subscribe(this.updateDaemons,()=>{_.error()})}}return t.\u0275fac=function(_){return new(_||t)(e.Y36(be.b),e.Y36($e.j),e.Y36(dn.F),e.Y36(ke.I))},t.\u0275cmp=e.Xpm({type:t,selectors:[["cd-rgw-daemon-list"]],features:[e.qOj],decls:9,vars:3,consts:function(){let o,_,n,i,s;return o="Daemons List",_="Overall Performance",n="RGW overview",i="Sync Performance",s="Radosgw sync overview",[["ngbNav","",1,"nav-tabs"],["nav","ngbNav"],["ngbNavItem",""],["ngbNavLink",""],o,["ngbNavContent",""],["ngbNavItem","",4,"ngIf"],[3,"ngbNavOutlet"],["columnMode","flex",3,"data","columns","hasDetails","setExpandedRow","fetchData"],["cdTableDetail","",3,"selection"],_,["title",n,"uid","WAkugZpiz","grafanaStyle","two",3,"grafanaPath","type"],i,["title",s,"uid","rgw-sync-overview","grafanaStyle","two",3,"grafanaPath","type"]]},template:function(_,n){if(1&_&&(e.TgZ(0,"nav",0,1),e.ynx(2,2),e.TgZ(3,"a",3),e.SDv(4,4),e.qZA(),e.YNc(5,Mn,2,4,"ng-template",5),e.BQk(),e.YNc(6,mn,4,0,"ng-container",6),e.YNc(7,Gn,4,0,"ng-container",6),e.qZA(),e._UZ(8,"div",7)),2&_){const i=e.MAs(1);e.xp6(6),e.Q6J("ngIf",n.grafanaPermission.read),e.xp6(1),e.Q6J("ngIf",n.grafanaPermission.read&&n.isMultiSite),e.xp6(1),e.Q6J("ngbNavOutlet",i)}},directives:[A.Pz,A.nv,A.Vx,A.uN,ee.a,Cn,M.O5,i_.F,A.tO],styles:[""]}),t})();var On=l(6481),De=l(28211),Ue=(()=>{return(t=Ue||(Ue={})).USERS="users",t.BUCKETS="buckets",t.METADATA="metadata",t.USAGE="usage",t.ZONE="zone",Ue;var t})();let s_=(()=>{class t{static getAll(){return Object.values(t.capabilities)}}return t.capabilities=Ue,t})();function Nn(t,o){1&t&&e._UZ(0,"input",22),2&t&&e.Q6J("readonly",!0)}function bn(t,o){1&t&&(e.TgZ(0,"option",17),e.SDv(1,25),e.qZA()),2&t&&e.Q6J("ngValue",null)}function Wn(t,o){if(1&t&&(e.TgZ(0,"option",26),e._uU(1),e.qZA()),2&t){const _=o.$implicit;e.Q6J("value",_),e.xp6(1),e.Oqu(_)}}function $n(t,o){if(1&t&&(e.TgZ(0,"select",23),e.YNc(1,bn,2,1,"option",24),e.YNc(2,Wn,2,2,"option",19),e.qZA()),2&t){const _=e.oxw();e.xp6(1),e.Q6J("ngIf",null!==_.types),e.xp6(1),e.Q6J("ngForOf",_.types)}}function Un(t,o){1&t&&(e.TgZ(0,"span",27),e.SDv(1,28),e.qZA())}function In(t,o){if(1&t&&(e.TgZ(0,"option",26),e._uU(1),e.qZA()),2&t){const _=o.$implicit;e.Q6J("value",_),e.xp6(1),e.hij(" ",_," ")}}function vn(t,o){1&t&&(e.TgZ(0,"span",27),e.SDv(1,29),e.qZA())}const Fn=function(t){return{required:t}},hn=function(){return["read","write","*"]};let Ln=(()=>{class t{constructor(_,n,i){this.formBuilder=_,this.activeModal=n,this.actionLabels=i,this.submitAction=new e.vpe,this.editing=!0,this.types=[],this.resource="capability",this.createForm()}createForm(){this.formGroup=this.formBuilder.group({type:[null,[a.kI.required]],perm:[null,[a.kI.required]]})}setEditing(_=!0){this.editing=_,this.action=this.editing?this.actionLabels.EDIT:this.actionLabels.ADD}setValues(_,n){this.formGroup.setValue({type:_,perm:n})}setCapabilities(_){const n=[];_.forEach(i=>{n.push(i.type)}),this.types=[],s_.getAll().forEach(i=>{-1===R().indexOf(n,i)&&this.types.push(i)})}onSubmit(){this.submitAction.emit(this.formGroup.value),this.activeModal.close()}}return t.\u0275fac=function(_){return new(_||t)(e.Y36(Y.O),e.Y36(A.Kz),e.Y36(G.p4))},t.\u0275cmp=e.Xpm({type:t,selectors:[["cd-rgw-user-capability-modal"]],outputs:{submitAction:"submitAction"},decls:29,vars:24,consts:function(){let o,_,n,i,s,r,d;return o="" + "\ufffd0\ufffd" + " " + "\ufffd1\ufffd" + "",_="Type",n="Permission",i="-- Select a permission --",s="-- Select a type --",r="This field is required.",d="This field is required.",[[3,"modalRef"],[1,"modal-title"],o,[1,"modal-content"],["novalidate","",3,"formGroup"],["frm","ngForm"],[1,"modal-body"],[1,"form-group","row"],["for","type",1,"cd-col-form-label",3,"ngClass"],_,[1,"cd-col-form-input"],["id","type","class","form-control","type","text","formControlName","type",3,"readonly",4,"ngIf"],["id","type","class","form-select","formControlName","type","autofocus","",4,"ngIf"],["class","invalid-feedback",4,"ngIf"],["for","perm",1,"cd-col-form-label","required"],n,["id","perm","formControlName","perm",1,"form-select"],[3,"ngValue"],i,[3,"value",4,"ngFor","ngForOf"],[1,"modal-footer"],[3,"form","submitText","submitActionEvent"],["id","type","type","text","formControlName","type",1,"form-control",3,"readonly"],["id","type","formControlName","type","autofocus","",1,"form-select"],[3,"ngValue",4,"ngIf"],s,[3,"value"],[1,"invalid-feedback"],r,d]},template:function(_,n){if(1&_&&(e.TgZ(0,"cd-modal",0),e.ynx(1,1),e.SDv(2,2),e.ALo(3,"titlecase"),e.ALo(4,"upperFirst"),e.BQk(),e.ynx(5,3),e.TgZ(6,"form",4,5)(8,"div",6)(9,"div",7)(10,"label",8),e.SDv(11,9),e.qZA(),e.TgZ(12,"div",10),e.YNc(13,Nn,1,1,"input",11),e.YNc(14,$n,3,2,"select",12),e.YNc(15,Un,2,0,"span",13),e.qZA()(),e.TgZ(16,"div",7)(17,"label",14),e.SDv(18,15),e.qZA(),e.TgZ(19,"div",10)(20,"select",16)(21,"option",17),e.SDv(22,18),e.qZA(),e.YNc(23,In,2,2,"option",19),e.qZA(),e.YNc(24,vn,2,0,"span",13),e.qZA()()(),e.TgZ(25,"div",20)(26,"cd-form-button-panel",21),e.NdJ("submitActionEvent",function(){return n.onSubmit()}),e.ALo(27,"titlecase"),e.ALo(28,"upperFirst"),e.qZA()()(),e.BQk(),e.qZA()),2&_){const i=e.MAs(7);e.Q6J("modalRef",n.activeModal),e.xp6(4),e.pQV(e.lcZ(3,13,n.action))(e.lcZ(4,15,n.resource)),e.QtT(2),e.xp6(2),e.Q6J("formGroup",n.formGroup),e.xp6(4),e.Q6J("ngClass",e.VKq(21,Fn,!n.editing)),e.xp6(3),e.Q6J("ngIf",n.editing),e.xp6(1),e.Q6J("ngIf",!n.editing),e.xp6(1),e.Q6J("ngIf",n.formGroup.showError("type",i,"required")),e.xp6(6),e.Q6J("ngValue",null),e.xp6(2),e.Q6J("ngForOf",e.DdM(23,hn)),e.xp6(1),e.Q6J("ngIf",n.formGroup.showError("perm",i,"required")),e.xp6(2),e.Q6J("form",n.formGroup)("submitText",e.lcZ(27,17,n.action)+" "+e.lcZ(28,19,n.resource))}},directives:[oe.z,a._Y,a.JL,J.V,a.sg,X.P,M.mk,M.O5,k.o,a.Fj,K.b,a.JJ,a.u,a.EJ,se.U,a.YN,a.Kr,M.sg,V.p],pipes:[M.rS,j.m],styles:[""]}),t})();var Ie=l(4416),ve=l(58039);function yn(t,o){1&t&&e._UZ(0,"input",17),2&t&&e.Q6J("readonly",!0)}function Dn(t,o){1&t&&(e.TgZ(0,"option",21),e.SDv(1,22),e.qZA()),2&t&&e.Q6J("ngValue",null)}function xn(t,o){if(1&t&&(e.TgZ(0,"option",23),e._uU(1),e.qZA()),2&t){const _=o.$implicit;e.Q6J("value",_),e.xp6(1),e.Oqu(_)}}function Zn(t,o){if(1&t&&(e.TgZ(0,"select",18),e.YNc(1,Dn,2,1,"option",19),e.YNc(2,xn,2,2,"option",20),e.qZA()),2&t){const _=e.oxw();e.xp6(1),e.Q6J("ngIf",null!==_.userCandidates),e.xp6(1),e.Q6J("ngForOf",_.userCandidates)}}function wn(t,o){1&t&&(e.TgZ(0,"span",24),e.SDv(1,25),e.qZA())}function kn(t,o){1&t&&(e.TgZ(0,"div",7)(1,"div",26)(2,"div",27),e._UZ(3,"input",28),e.TgZ(4,"label",29),e.SDv(5,30),e.qZA()()()())}function qn(t,o){1&t&&(e.TgZ(0,"span",24),e.SDv(1,37),e.qZA())}const xe=function(t){return{required:t}};function Bn(t,o){if(1&t&&(e.TgZ(0,"div",7)(1,"label",31),e.SDv(2,32),e.qZA(),e.TgZ(3,"div",10)(4,"div",33),e._UZ(5,"input",34)(6,"button",35)(7,"cd-copy-2-clipboard-button",36),e.qZA(),e.YNc(8,qn,2,0,"span",13),e.qZA()()),2&t){const _=e.oxw(),n=e.MAs(7);e.xp6(1),e.Q6J("ngClass",e.VKq(3,xe,!_.viewing)),e.xp6(4),e.Q6J("readonly",_.viewing),e.xp6(3),e.Q6J("ngIf",_.formGroup.showError("access_key",n,"required"))}}function Hn(t,o){1&t&&(e.TgZ(0,"span",24),e.SDv(1,43),e.qZA())}function Xn(t,o){if(1&t&&(e.TgZ(0,"div",7)(1,"label",38),e.SDv(2,39),e.qZA(),e.TgZ(3,"div",10)(4,"div",33),e._UZ(5,"input",40)(6,"button",41)(7,"cd-copy-2-clipboard-button",42),e.qZA(),e.YNc(8,Hn,2,0,"span",13),e.qZA()()),2&t){const _=e.oxw(),n=e.MAs(7);e.xp6(1),e.Q6J("ngClass",e.VKq(3,xe,!_.viewing)),e.xp6(4),e.Q6J("readonly",_.viewing),e.xp6(3),e.Q6J("ngIf",_.formGroup.showError("secret_key",n,"required"))}}let a_=(()=>{class t{constructor(_,n,i){this.formBuilder=_,this.activeModal=n,this.actionLabels=i,this.submitAction=new e.vpe,this.viewing=!0,this.userCandidates=[],this.resource="S3 Key",this.createForm()}createForm(){this.formGroup=this.formBuilder.group({user:[null,[a.kI.required]],generate_key:[!0],access_key:[null,[p.h.requiredIf({generate_key:!1})]],secret_key:[null,[p.h.requiredIf({generate_key:!1})]]})}setViewing(_=!0){this.viewing=_,this.action=this.viewing?this.actionLabels.SHOW:this.actionLabels.CREATE}setValues(_,n,i){this.formGroup.setValue({user:_,generate_key:R().isEmpty(n),access_key:n,secret_key:i})}setUserCandidates(_){this.userCandidates=_}onSubmit(){this.submitAction.emit(this.formGroup.value),this.activeModal.close()}}return t.\u0275fac=function(_){return new(_||t)(e.Y36(Y.O),e.Y36(A.Kz),e.Y36(G.p4))},t.\u0275cmp=e.Xpm({type:t,selectors:[["cd-rgw-user-s3-key-modal"]],outputs:{submitAction:"submitAction"},decls:23,vars:24,consts:function(){let o,_,n,i,s,r,d,g,E;return o="" + "\ufffd0\ufffd" + " " + "\ufffd1\ufffd" + "",_="Username",n="-- Select a username --",i="This field is required.",s="Auto-generate key",r="Access key",d="This field is required.",g="Secret key",E="This field is required.",[[3,"modalRef"],[1,"modal-title"],o,[1,"modal-content"],["novalidate","",3,"formGroup"],["frm","ngForm"],[1,"modal-body"],[1,"form-group","row"],["for","user",1,"cd-col-form-label",3,"ngClass"],_,[1,"cd-col-form-input"],["id","user","class","form-control","type","text","formControlName","user",3,"readonly",4,"ngIf"],["id","user","class","form-control","formControlName","user","autofocus","",4,"ngIf"],["class","invalid-feedback",4,"ngIf"],["class","form-group row",4,"ngIf"],[1,"modal-footer"],[3,"form","submitText","showSubmit","submitActionEvent"],["id","user","type","text","formControlName","user",1,"form-control",3,"readonly"],["id","user","formControlName","user","autofocus","",1,"form-control"],[3,"ngValue",4,"ngIf"],[3,"value",4,"ngFor","ngForOf"],[3,"ngValue"],n,[3,"value"],[1,"invalid-feedback"],i,[1,"cd-col-form-offset"],[1,"custom-control","custom-checkbox"],["id","generate_key","type","checkbox","formControlName","generate_key",1,"custom-control-input"],["for","generate_key",1,"custom-control-label"],s,["for","access_key",1,"cd-col-form-label",3,"ngClass"],r,[1,"input-group"],["id","access_key","type","password","formControlName","access_key",1,"form-control",3,"readonly"],["type","button","cdPasswordButton","access_key",1,"btn","btn-light"],["source","access_key"],d,["for","secret_key",1,"cd-col-form-label",3,"ngClass"],g,["id","secret_key","type","password","formControlName","secret_key",1,"form-control",3,"readonly"],["type","button","cdPasswordButton","secret_key",1,"btn","btn-light"],["source","secret_key"],E]},template:function(_,n){if(1&_&&(e.TgZ(0,"cd-modal",0),e.ynx(1,1),e.SDv(2,2),e.ALo(3,"titlecase"),e.ALo(4,"upperFirst"),e.BQk(),e.ynx(5,3),e.TgZ(6,"form",4,5)(8,"div",6)(9,"div",7)(10,"label",8),e.SDv(11,9),e.qZA(),e.TgZ(12,"div",10),e.YNc(13,yn,1,1,"input",11),e.YNc(14,Zn,3,2,"select",12),e.YNc(15,wn,2,0,"span",13),e.qZA()(),e.YNc(16,kn,6,0,"div",14),e.YNc(17,Bn,9,5,"div",14),e.YNc(18,Xn,9,5,"div",14),e.qZA(),e.TgZ(19,"div",15)(20,"cd-form-button-panel",16),e.NdJ("submitActionEvent",function(){return n.onSubmit()}),e.ALo(21,"titlecase"),e.ALo(22,"upperFirst"),e.qZA()()(),e.BQk(),e.qZA()),2&_){const i=e.MAs(7);e.Q6J("modalRef",n.activeModal),e.xp6(4),e.pQV(e.lcZ(3,14,n.action))(e.lcZ(4,16,n.resource)),e.QtT(2),e.xp6(2),e.Q6J("formGroup",n.formGroup),e.xp6(4),e.Q6J("ngClass",e.VKq(22,xe,!n.viewing)),e.xp6(3),e.Q6J("ngIf",n.viewing),e.xp6(1),e.Q6J("ngIf",!n.viewing),e.xp6(1),e.Q6J("ngIf",n.formGroup.showError("user",i,"required")),e.xp6(1),e.Q6J("ngIf",!n.viewing),e.xp6(1),e.Q6J("ngIf",!n.formGroup.getValue("generate_key")),e.xp6(1),e.Q6J("ngIf",!n.formGroup.getValue("generate_key")),e.xp6(2),e.Q6J("form",n.formGroup)("submitText",e.lcZ(21,18,n.action)+" "+e.lcZ(22,20,n.resource))("showSubmit",!n.viewing)}},directives:[oe.z,a._Y,a.JL,J.V,a.sg,X.P,M.mk,M.O5,k.o,a.Fj,K.b,a.JJ,a.u,a.EJ,se.U,a.YN,a.Kr,M.sg,a.Wl,Ie.C,ve.s,V.p],pipes:[M.rS,j.m],styles:[""]}),t})();class Kn{}function zn(t,o){1&t&&(e.TgZ(0,"span",29),e.SDv(1,30),e.qZA())}function Qn(t,o){1&t&&(e.TgZ(0,"span",29),e.SDv(1,31),e.qZA())}function Yn(t,o){if(1&t&&(e.TgZ(0,"option",32),e._uU(1),e.qZA()),2&t){const _=o.$implicit;e.Q6J("value",_),e.xp6(1),e.hij(" ",_," ")}}function Jn(t,o){1&t&&(e.TgZ(0,"span",29),e.SDv(1,33),e.qZA())}function Vn(t,o){1&t&&(e.TgZ(0,"span",29),e.SDv(1,47),e.qZA())}function jn(t,o){if(1&t&&(e.TgZ(0,"div",7)(1,"label",41),e.SDv(2,42),e.qZA(),e.TgZ(3,"div",10)(4,"div",43),e._UZ(5,"input",44)(6,"button",45)(7,"cd-copy-2-clipboard-button",46),e.qZA(),e.YNc(8,Vn,2,0,"span",15),e.qZA()()),2&t){const _=e.oxw(2),n=e.MAs(7);e.xp6(8),e.Q6J("ngIf",_.formGroup.showError("secret_key",n,"required"))}}function eo(t,o){if(1&t&&(e.TgZ(0,"fieldset")(1,"legend"),e.SDv(2,34),e.qZA(),e.TgZ(3,"div",7)(4,"div",35)(5,"div",36),e._UZ(6,"input",37),e.TgZ(7,"label",38),e.SDv(8,39),e.qZA()()()(),e.YNc(9,jn,9,1,"div",40),e.qZA()),2&t){const _=e.oxw();e.xp6(9),e.Q6J("ngIf",!_.editing&&!_.formGroup.getValue("generate_secret"))}}const _o=function(t){return{required:t}},to=function(){return["read","write"]};let no=(()=>{class t{constructor(_,n,i){this.formBuilder=_,this.bsModalRef=n,this.actionLabels=i,this.submitAction=new e.vpe,this.editing=!0,this.subusers=[],this.resource="Subuser",this.createForm()}createForm(){this.formGroup=this.formBuilder.group({uid:[null],subuid:[null,[a.kI.required,this.subuserValidator()]],perm:[null,[a.kI.required]],generate_secret:[!0],secret_key:[null,[p.h.requiredIf({generate_secret:!1})]]})}subuserValidator(){const _=this;return n=>_.editing||(0,p.P)(n.value)?null:_.subusers.some(s=>R().isEqual(_.getSubuserName(s.id),n.value))?{subuserIdExists:!0}:null}getSubuserName(_){if(R().isEmpty(_))return _;const n=_.match(/([^:]+)(:(.+))?/);return R().isUndefined(n[3])?n[1]:n[3]}setEditing(_=!0){this.editing=_,this.action=this.editing?this.actionLabels.EDIT:this.actionLabels.CREATE}setValues(_,n="",i=""){this.formGroup.setValue({uid:_,subuid:this.getSubuserName(n),perm:i,generate_secret:!0,secret_key:null})}setSubusers(_){this.subusers=_}onSubmit(){const _=this.formGroup.value,n=new Kn;n.id=`${_.uid}:${_.subuid}`,n.permissions=_.perm,n.generate_secret=_.generate_secret,n.secret_key=_.secret_key,this.submitAction.emit(n),this.bsModalRef.close()}}return t.\u0275fac=function(_){return new(_||t)(e.Y36(Y.O),e.Y36(A.Kz),e.Y36(G.p4))},t.\u0275cmp=e.Xpm({type:t,selectors:[["cd-rgw-user-subuser-modal"]],outputs:{submitAction:"submitAction"},decls:39,vars:26,consts:function(){let o,_,n,i,s,r,d,g,E,S,P,O,N,b;return o="" + "\ufffd0\ufffd" + " " + "\ufffd1\ufffd" + "",_="Username",n="Subuser",i="Permission",s="-- Select a permission --",r="read, write",d="full",g="This field is required.",E="The chosen subuser ID is already in use.",S="This field is required.",P="Swift key",O="Auto-generate secret",N="Secret key",b="This field is required.",[[3,"modalRef"],[1,"modal-title"],o,[1,"modal-content"],["novalidate","",3,"formGroup"],["frm","ngForm"],[1,"modal-body"],[1,"form-group","row"],["for","uid",1,"cd-col-form-label"],_,[1,"cd-col-form-input"],["id","uid","type","text","formControlName","uid",1,"form-control",3,"readonly"],["for","subuid",1,"cd-col-form-label",3,"ngClass"],n,["id","subuid","type","text","formControlName","subuid","autofocus","",1,"form-control",3,"readonly"],["class","invalid-feedback",4,"ngIf"],["for","perm",1,"cd-col-form-label","required"],i,["id","perm","formControlName","perm",1,"form-select"],[3,"ngValue"],s,[3,"value",4,"ngFor","ngForOf"],["value","read-write"],r,["value","full-control"],d,[4,"ngIf"],[1,"modal-footer"],[3,"form","submitText","submitActionEvent"],[1,"invalid-feedback"],g,E,[3,"value"],S,P,[1,"cd-col-form-offset"],[1,"custom-control","custom-checkbox"],["id","generate_secret","type","checkbox","formControlName","generate_secret",1,"custom-control-input"],["for","generate_secret",1,"custom-control-label"],O,["class","form-group row",4,"ngIf"],["for","secret_key",1,"cd-col-form-label","required"],N,[1,"input-group"],["id","secret_key","type","password","formControlName","secret_key",1,"form-control"],["type","button","cdPasswordButton","secret_key",1,"btn","btn-light"],["source","secret_key"],b]},template:function(_,n){if(1&_&&(e.TgZ(0,"cd-modal",0),e.ynx(1,1),e.SDv(2,2),e.ALo(3,"titlecase"),e.ALo(4,"upperFirst"),e.BQk(),e.ynx(5,3),e.TgZ(6,"form",4,5)(8,"div",6)(9,"div",7)(10,"label",8),e.SDv(11,9),e.qZA(),e.TgZ(12,"div",10),e._UZ(13,"input",11),e.qZA()(),e.TgZ(14,"div",7)(15,"label",12),e.SDv(16,13),e.qZA(),e.TgZ(17,"div",10),e._UZ(18,"input",14),e.YNc(19,zn,2,0,"span",15),e.YNc(20,Qn,2,0,"span",15),e.qZA()(),e.TgZ(21,"div",7)(22,"label",16),e.SDv(23,17),e.qZA(),e.TgZ(24,"div",10)(25,"select",18)(26,"option",19),e.SDv(27,20),e.qZA(),e.YNc(28,Yn,2,2,"option",21),e.TgZ(29,"option",22),e.SDv(30,23),e.qZA(),e.TgZ(31,"option",24),e.SDv(32,25),e.qZA()(),e.YNc(33,Jn,2,0,"span",15),e.qZA()(),e.YNc(34,eo,10,1,"fieldset",26),e.qZA(),e.TgZ(35,"div",27)(36,"cd-form-button-panel",28),e.NdJ("submitActionEvent",function(){return n.onSubmit()}),e.ALo(37,"titlecase"),e.ALo(38,"upperFirst"),e.qZA()()(),e.BQk(),e.qZA()),2&_){const i=e.MAs(7);e.Q6J("modalRef",n.bsModalRef),e.xp6(4),e.pQV(e.lcZ(3,15,n.action))(e.lcZ(4,17,n.resource)),e.QtT(2),e.xp6(2),e.Q6J("formGroup",n.formGroup),e.xp6(7),e.Q6J("readonly",!0),e.xp6(2),e.Q6J("ngClass",e.VKq(23,_o,!n.editing)),e.xp6(3),e.Q6J("readonly",n.editing),e.xp6(1),e.Q6J("ngIf",n.formGroup.showError("subuid",i,"required")),e.xp6(1),e.Q6J("ngIf",n.formGroup.showError("subuid",i,"subuserIdExists")),e.xp6(6),e.Q6J("ngValue",null),e.xp6(2),e.Q6J("ngForOf",e.DdM(25,to)),e.xp6(5),e.Q6J("ngIf",n.formGroup.showError("perm",i,"required")),e.xp6(1),e.Q6J("ngIf",!n.editing),e.xp6(2),e.Q6J("form",n.formGroup)("submitText",e.lcZ(37,19,n.action)+" "+e.lcZ(38,21,n.resource))}},directives:[oe.z,a._Y,a.JL,J.V,a.sg,X.P,k.o,a.Fj,K.b,a.JJ,a.u,M.mk,se.U,M.O5,a.EJ,a.YN,a.Kr,M.sg,a.Wl,Ie.C,ve.s,V.p],pipes:[M.rS,j.m],styles:[""]}),t})();var oo=l(13472);let r_=(()=>{class t{constructor(_,n){this.activeModal=_,this.actionLabels=n,this.resource="Swift Key",this.action=this.actionLabels.SHOW}setValues(_,n){this.user=_,this.secret_key=n}}return t.\u0275fac=function(_){return new(_||t)(e.Y36(A.Kz),e.Y36(G.p4))},t.\u0275cmp=e.Xpm({type:t,selectors:[["cd-rgw-user-swift-key-modal"]],decls:23,vars:11,consts:function(){let o,_,n;return o="" + "\ufffd0\ufffd" + " " + "\ufffd1\ufffd" + "",_="Username",n="Secret key",[[3,"modalRef"],[1,"modal-title"],o,[1,"modal-content"],[1,"modal-body"],["novalidate",""],[1,"form-group","row"],["for","user",1,"cd-col-form-label"],_,[1,"cd-col-form-input"],["id","user","name","user","type","text",1,"form-control",3,"readonly","ngModel","ngModelChange"],["for","secret_key",1,"cd-col-form-label"],n,[1,"input-group"],["id","secret_key","name","secret_key","type","password",1,"form-control",3,"ngModel","readonly","ngModelChange"],["type","button","cdPasswordButton","secret_key",1,"btn","btn-light"],["source","secret_key"],[1,"modal-footer"],[3,"backAction"]]},template:function(_,n){1&_&&(e.TgZ(0,"cd-modal",0),e.ynx(1,1),e.SDv(2,2),e.ALo(3,"titlecase"),e.ALo(4,"upperFirst"),e.BQk(),e.ynx(5,3),e.TgZ(6,"div",4)(7,"form",5)(8,"div",6)(9,"label",7),e.SDv(10,8),e.qZA(),e.TgZ(11,"div",9)(12,"input",10),e.NdJ("ngModelChange",function(s){return n.user=s}),e.qZA()()(),e.TgZ(13,"div",6)(14,"label",11),e.SDv(15,12),e.qZA(),e.TgZ(16,"div",9)(17,"div",13)(18,"input",14),e.NdJ("ngModelChange",function(s){return n.secret_key=s}),e.qZA(),e._UZ(19,"button",15)(20,"cd-copy-2-clipboard-button",16),e.qZA()()()()(),e.TgZ(21,"div",17)(22,"cd-back-button",18),e.NdJ("backAction",function(){return n.activeModal.close()}),e.qZA()(),e.BQk(),e.qZA()),2&_&&(e.Q6J("modalRef",n.activeModal),e.xp6(4),e.pQV(e.lcZ(3,7,n.action))(e.lcZ(4,9,n.resource)),e.QtT(2),e.xp6(8),e.Q6J("readonly",!0)("ngModel",n.user),e.xp6(6),e.Q6J("ngModel",n.secret_key)("readonly",!0))},directives:[oe.z,a._Y,a.JL,a.F,X.P,k.o,a.Fj,K.b,a.JJ,a.On,Ie.C,ve.s,oo.W],pipes:[M.rS,j.m],styles:[""]}),t})();var io=l(17932);function so(t,o){1&t&&(e.TgZ(0,"span",49),e.SDv(1,50),e.qZA())}function ao(t,o){1&t&&(e.TgZ(0,"span",49),e.SDv(1,51),e.qZA())}function ro(t,o){1&t&&(e.TgZ(0,"span",49),e.SDv(1,52),e.qZA())}function lo(t,o){1&t&&(e.TgZ(0,"span",49),e.SDv(1,56),e.qZA())}function co(t,o){1&t&&(e.TgZ(0,"span",49),e.SDv(1,57),e.qZA())}function uo(t,o){if(1&t&&(e.TgZ(0,"div",8)(1,"label",53),e.SDv(2,54),e.qZA(),e.TgZ(3,"div",11),e._UZ(4,"input",55),e.YNc(5,lo,2,0,"span",13),e.YNc(6,co,2,0,"span",13),e.qZA()()),2&t){e.oxw();const _=e.MAs(2),n=e.oxw();e.xp6(4),e.Q6J("readonly",n.editing),e.xp6(1),e.Q6J("ngIf",n.userForm.showError("tenant",_,"pattern")),e.xp6(1),e.Q6J("ngIf",n.userForm.showError("tenant",_,"notUnique"))}}function Ro(t,o){1&t&&(e.TgZ(0,"span",49),e.SDv(1,58),e.qZA())}function Eo(t,o){1&t&&(e.TgZ(0,"span",49),e.SDv(1,59),e.qZA())}function go(t,o){1&t&&(e.TgZ(0,"span",49),e.SDv(1,60),e.qZA())}function fo(t,o){1&t&&(e.TgZ(0,"span",49),e.SDv(1,61),e.qZA())}function So(t,o){1&t&&(e.TgZ(0,"span",49),e.SDv(1,64),e.qZA())}function To(t,o){1&t&&(e.TgZ(0,"span",49),e.SDv(1,65),e.qZA())}function Co(t,o){if(1&t&&(e.TgZ(0,"div",8),e._UZ(1,"label",62),e.TgZ(2,"div",11),e._UZ(3,"input",63),e.YNc(4,So,2,0,"span",13),e.YNc(5,To,2,0,"span",13),e.qZA()()),2&t){e.oxw();const _=e.MAs(2),n=e.oxw();e.xp6(4),e.Q6J("ngIf",n.userForm.showError("max_buckets",_,"required")),e.xp6(1),e.Q6J("ngIf",n.userForm.showError("max_buckets",_,"min"))}}function Mo(t,o){1&t&&(e.TgZ(0,"span",49),e.SDv(1,76),e.qZA())}function po(t,o){if(1&t&&(e.TgZ(0,"div",8)(1,"label",70),e.SDv(2,71),e.qZA(),e.TgZ(3,"div",11)(4,"div",72),e._UZ(5,"input",73)(6,"button",74)(7,"cd-copy-2-clipboard-button",75),e.qZA(),e.YNc(8,Mo,2,0,"span",13),e.qZA()()),2&t){e.oxw(2);const _=e.MAs(2),n=e.oxw();e.xp6(8),e.Q6J("ngIf",n.userForm.showError("access_key",_,"required"))}}function mo(t,o){1&t&&(e.TgZ(0,"span",49),e.SDv(1,82),e.qZA())}function Ao(t,o){if(1&t&&(e.TgZ(0,"div",8)(1,"label",77),e.SDv(2,78),e.qZA(),e.TgZ(3,"div",11)(4,"div",72),e._UZ(5,"input",79)(6,"button",80)(7,"cd-copy-2-clipboard-button",81),e.qZA(),e.YNc(8,mo,2,0,"span",13),e.qZA()()),2&t){e.oxw(2);const _=e.MAs(2),n=e.oxw();e.xp6(8),e.Q6J("ngIf",n.userForm.showError("secret_key",_,"required"))}}function Go(t,o){if(1&t&&(e.TgZ(0,"fieldset")(1,"legend"),e.SDv(2,66),e.qZA(),e.TgZ(3,"div",8)(4,"div",14)(5,"div",15),e._UZ(6,"input",67),e.TgZ(7,"label",68),e.SDv(8,69),e.qZA()()()(),e.YNc(9,po,9,1,"div",19),e.YNc(10,Ao,9,1,"div",19),e.qZA()),2&t){const _=e.oxw(2);e.xp6(9),e.Q6J("ngIf",!_.editing&&!_.userForm.getValue("generate_key")),e.xp6(1),e.Q6J("ngIf",!_.editing&&!_.userForm.getValue("generate_key"))}}function Po(t,o){1&t&&(e.TgZ(0,"span",93)(1,"span",94),e.SDv(2,95),e.qZA()())}const Z=function(t){return[t]};function Oo(t,o){if(1&t){const _=e.EpF();e.TgZ(0,"span")(1,"div",72)(2,"span",96),e._UZ(3,"i"),e.qZA(),e._UZ(4,"input",97),e.TgZ(5,"span",96),e._UZ(6,"i"),e.qZA(),e._UZ(7,"input",97),e.TgZ(8,"button",98),e.NdJ("click",function(){const s=e.CHM(_).index;return e.oxw(3).showSubuserModal(s)}),e._UZ(9,"i",90),e.qZA(),e.TgZ(10,"button",99),e.NdJ("click",function(){const s=e.CHM(_).index;return e.oxw(3).deleteSubuser(s)}),e._UZ(11,"i",90),e.qZA()(),e._UZ(12,"span",94),e.qZA()}if(2&t){const _=o.$implicit,n=e.oxw(3);e.xp6(3),e.Tol(n.icons.user),e.xp6(1),e.s9C("value",_.id),e.xp6(2),e.Tol(n.icons.share),e.xp6(1),e.s9C("value","full-control"===_.permissions?"full":_.permissions),e.xp6(2),e.Q6J("ngClass",e.VKq(10,Z,n.icons.edit)),e.xp6(2),e.Q6J("ngClass",e.VKq(12,Z,n.icons.destroy))}}function No(t,o){if(1&t){const _=e.EpF();e.TgZ(0,"fieldset")(1,"legend"),e.SDv(2,83),e.qZA(),e.TgZ(3,"div",84)(4,"div",14),e.YNc(5,Po,3,0,"span",85),e.YNc(6,Oo,13,14,"span",86),e.TgZ(7,"div",87)(8,"div",88)(9,"button",89),e.NdJ("click",function(){return e.CHM(_),e.oxw(2).showSubuserModal()}),e._UZ(10,"i",90),e.ynx(11),e.SDv(12,91),e.ALo(13,"titlecase"),e.ALo(14,"upperFirst"),e.BQk(),e.qZA()()(),e._UZ(15,"span",92),e.qZA()()()}if(2&t){const _=e.oxw(2);e.xp6(5),e.Q6J("ngIf",0===_.subusers.length),e.xp6(1),e.Q6J("ngForOf",_.subusers),e.xp6(4),e.Q6J("ngClass",e.VKq(9,Z,_.icons.add)),e.xp6(4),e.pQV(e.lcZ(13,5,_.actionLabels.CREATE))(e.lcZ(14,7,_.subuserLabel)),e.QtT(12)}}function bo(t,o){1&t&&(e.TgZ(0,"span",93)(1,"span",94),e.SDv(2,105),e.qZA()())}function Wo(t,o){if(1&t){const _=e.EpF();e.TgZ(0,"span")(1,"div",72)(2,"div",96),e._UZ(3,"i"),e.qZA(),e._UZ(4,"input",97),e.TgZ(5,"button",106),e.NdJ("click",function(){const s=e.CHM(_).index;return e.oxw(3).showS3KeyModal(s)}),e._UZ(6,"i",90),e.qZA(),e.TgZ(7,"button",107),e.NdJ("click",function(){const s=e.CHM(_).index;return e.oxw(3).deleteS3Key(s)}),e._UZ(8,"i",90),e.qZA()(),e._UZ(9,"span",94),e.qZA()}if(2&t){const _=o.$implicit,n=e.oxw(3);e.xp6(3),e.Tol(n.icons.key),e.xp6(1),e.s9C("value",_.user),e.xp6(2),e.Q6J("ngClass",e.VKq(6,Z,n.icons.show)),e.xp6(2),e.Q6J("ngClass",e.VKq(8,Z,n.icons.destroy))}}function $o(t,o){1&t&&(e.TgZ(0,"span",93)(1,"span",94),e.SDv(2,108),e.qZA()())}function Uo(t,o){if(1&t){const _=e.EpF();e.TgZ(0,"span")(1,"div",72)(2,"span",96),e._UZ(3,"i"),e.qZA(),e._UZ(4,"input",97),e.TgZ(5,"button",109),e.NdJ("click",function(){const s=e.CHM(_).index;return e.oxw(3).showSwiftKeyModal(s)}),e._UZ(6,"i",90),e.qZA()(),e._UZ(7,"span",94),e.qZA()}if(2&t){const _=o.$implicit,n=e.oxw(3);e.xp6(3),e.Tol(n.icons.key),e.xp6(1),e.s9C("value",_.user),e.xp6(2),e.Q6J("ngClass",e.VKq(5,Z,n.icons.show))}}function Io(t,o){if(1&t){const _=e.EpF();e.TgZ(0,"fieldset")(1,"legend"),e.SDv(2,100),e.qZA(),e.TgZ(3,"div",8)(4,"label",62),e.SDv(5,101),e.qZA(),e.TgZ(6,"div",11),e.YNc(7,bo,3,0,"span",85),e.YNc(8,Wo,10,10,"span",86),e.TgZ(9,"div",87)(10,"div",88)(11,"button",102),e.NdJ("click",function(){return e.CHM(_),e.oxw(2).showS3KeyModal()}),e._UZ(12,"i",90),e.ynx(13),e.SDv(14,103),e.ALo(15,"titlecase"),e.ALo(16,"upperFirst"),e.BQk(),e.qZA()()(),e._UZ(17,"span",92),e.qZA(),e._UZ(18,"hr"),e.qZA(),e.TgZ(19,"div",8)(20,"label",62),e.SDv(21,104),e.qZA(),e.TgZ(22,"div",11),e.YNc(23,$o,3,0,"span",85),e.YNc(24,Uo,8,7,"span",86),e.qZA()()()}if(2&t){const _=e.oxw(2);e.xp6(7),e.Q6J("ngIf",0===_.s3Keys.length),e.xp6(1),e.Q6J("ngForOf",_.s3Keys),e.xp6(4),e.Q6J("ngClass",e.VKq(11,Z,_.icons.add)),e.xp6(4),e.pQV(e.lcZ(15,7,_.actionLabels.CREATE))(e.lcZ(16,9,_.s3keyLabel)),e.QtT(14),e.xp6(7),e.Q6J("ngIf",0===_.swiftKeys.length),e.xp6(1),e.Q6J("ngForOf",_.swiftKeys)}}function vo(t,o){1&t&&(e.TgZ(0,"span",93)(1,"span",94),e.SDv(2,113),e.qZA()())}function Fo(t,o){if(1&t){const _=e.EpF();e.TgZ(0,"span")(1,"div",72)(2,"div",96),e._UZ(3,"i"),e.qZA(),e._UZ(4,"input",97),e.TgZ(5,"button",114),e.NdJ("click",function(){const s=e.CHM(_).index;return e.oxw(3).showCapabilityModal(s)}),e._UZ(6,"i",90),e.qZA(),e.TgZ(7,"button",115),e.NdJ("click",function(){const s=e.CHM(_).index;return e.oxw(3).deleteCapability(s)}),e._UZ(8,"i",90),e.qZA()(),e._UZ(9,"span",94),e.qZA()}if(2&t){const _=o.$implicit,n=e.oxw(3);e.xp6(3),e.Tol(n.icons.share),e.xp6(1),e.hYB("value","",_.type,":",_.perm,""),e.xp6(2),e.Q6J("ngClass",e.VKq(7,Z,n.icons.edit)),e.xp6(2),e.Q6J("ngClass",e.VKq(9,Z,n.icons.destroy))}}function ho(t,o){if(1&t){const _=e.EpF();e.TgZ(0,"fieldset")(1,"legend"),e.SDv(2,110),e.qZA(),e.TgZ(3,"div",8)(4,"div",14),e.YNc(5,vo,3,0,"span",85),e.YNc(6,Fo,10,11,"span",86),e.TgZ(7,"div",87)(8,"div",88)(9,"button",111),e.NdJ("click",function(){return e.CHM(_),e.oxw(2).showCapabilityModal()}),e.ALo(10,"pipeFunction"),e.ALo(11,"pipeFunction"),e._UZ(12,"i",90),e.ynx(13),e.SDv(14,112),e.ALo(15,"titlecase"),e.ALo(16,"upperFirst"),e.BQk(),e.qZA()()(),e._UZ(17,"span",92),e.qZA()()()}if(2&t){const _=e.oxw(2);e.xp6(5),e.Q6J("ngIf",0===_.capabilities.length),e.xp6(1),e.Q6J("ngForOf",_.capabilities),e.xp6(3),e.Q6J("disabled",e.xi3(10,7,_.capabilities,_.hasAllCapabilities))("disableTooltip",!e.xi3(11,10,_.capabilities,_.hasAllCapabilities)),e.xp6(3),e.Q6J("ngClass",e.VKq(17,Z,_.icons.add)),e.xp6(4),e.pQV(e.lcZ(15,13,_.actionLabels.ADD))(e.lcZ(16,15,_.capabilityLabel)),e.QtT(14)}}function Lo(t,o){1&t&&(e.TgZ(0,"div",8)(1,"div",14)(2,"div",15),e._UZ(3,"input",116),e.TgZ(4,"label",117),e.SDv(5,118),e.qZA()()()())}function yo(t,o){1&t&&(e.TgZ(0,"span",49),e.SDv(1,122),e.qZA())}function Do(t,o){1&t&&(e.TgZ(0,"span",49),e.SDv(1,123),e.qZA())}function xo(t,o){if(1&t&&(e.TgZ(0,"div",8)(1,"label",119),e.SDv(2,120),e.qZA(),e.TgZ(3,"div",11),e._UZ(4,"input",121),e.YNc(5,yo,2,0,"span",13),e.YNc(6,Do,2,0,"span",13),e.qZA()()),2&t){e.oxw();const _=e.MAs(2),n=e.oxw();e.xp6(5),e.Q6J("ngIf",n.userForm.showError("user_quota_max_size",_,"required")),e.xp6(1),e.Q6J("ngIf",n.userForm.showError("user_quota_max_size",_,"quotaMaxSize"))}}function Zo(t,o){1&t&&(e.TgZ(0,"div",8)(1,"div",14)(2,"div",15),e._UZ(3,"input",124),e.TgZ(4,"label",125),e.SDv(5,126),e.qZA()()()())}function wo(t,o){1&t&&(e.TgZ(0,"span",49),e.SDv(1,130),e.qZA())}function ko(t,o){1&t&&(e.TgZ(0,"span",49),e.SDv(1,131),e.qZA())}function qo(t,o){if(1&t&&(e.TgZ(0,"div",8)(1,"label",127),e.SDv(2,128),e.qZA(),e.TgZ(3,"div",11),e._UZ(4,"input",129),e.YNc(5,wo,2,0,"span",13),e.YNc(6,ko,2,0,"span",13),e.qZA()()),2&t){e.oxw();const _=e.MAs(2),n=e.oxw();e.xp6(5),e.Q6J("ngIf",n.userForm.showError("user_quota_max_objects",_,"required")),e.xp6(1),e.Q6J("ngIf",n.userForm.showError("user_quota_max_objects",_,"min"))}}function Bo(t,o){1&t&&(e.TgZ(0,"div",8)(1,"div",14)(2,"div",15),e._UZ(3,"input",132),e.TgZ(4,"label",133),e.SDv(5,134),e.qZA()()()())}function Ho(t,o){1&t&&(e.TgZ(0,"span",49),e.SDv(1,138),e.qZA())}function Xo(t,o){1&t&&(e.TgZ(0,"span",49),e.SDv(1,139),e.qZA())}function Ko(t,o){if(1&t&&(e.TgZ(0,"div",8)(1,"label",135),e.SDv(2,136),e.qZA(),e.TgZ(3,"div",11),e._UZ(4,"input",137),e.YNc(5,Ho,2,0,"span",13),e.YNc(6,Xo,2,0,"span",13),e.qZA()()),2&t){e.oxw();const _=e.MAs(2),n=e.oxw();e.xp6(5),e.Q6J("ngIf",n.userForm.showError("bucket_quota_max_size",_,"required")),e.xp6(1),e.Q6J("ngIf",n.userForm.showError("bucket_quota_max_size",_,"quotaMaxSize"))}}function zo(t,o){1&t&&(e.TgZ(0,"div",8)(1,"div",14)(2,"div",15),e._UZ(3,"input",140),e.TgZ(4,"label",141),e.SDv(5,142),e.qZA()()()())}function Qo(t,o){1&t&&(e.TgZ(0,"span",49),e.SDv(1,146),e.qZA())}function Yo(t,o){1&t&&(e.TgZ(0,"span",49),e.SDv(1,147),e.qZA())}function Jo(t,o){if(1&t&&(e.TgZ(0,"div",8)(1,"label",143),e.SDv(2,144),e.qZA(),e.TgZ(3,"div",11),e._UZ(4,"input",145),e.YNc(5,Qo,2,0,"span",13),e.YNc(6,Yo,2,0,"span",13),e.qZA()()),2&t){e.oxw();const _=e.MAs(2),n=e.oxw();e.xp6(5),e.Q6J("ngIf",n.userForm.showError("bucket_quota_max_objects",_,"required")),e.xp6(1),e.Q6J("ngIf",n.userForm.showError("bucket_quota_max_objects",_,"min"))}}const l_=function(t){return{required:t}};function Vo(t,o){if(1&t){const _=e.EpF();e.TgZ(0,"div",1)(1,"form",2,3)(3,"div",4)(4,"div",5),e.SDv(5,6),e.ALo(6,"titlecase"),e.ALo(7,"upperFirst"),e.qZA(),e.TgZ(8,"div",7)(9,"div",8)(10,"label",9),e.SDv(11,10),e.qZA(),e.TgZ(12,"div",11),e._UZ(13,"input",12),e.YNc(14,so,2,0,"span",13),e.YNc(15,ao,2,0,"span",13),e.YNc(16,ro,2,0,"span",13),e.qZA()(),e.TgZ(17,"div",8)(18,"div",14)(19,"div",15)(20,"input",16),e.NdJ("click",function(){return e.CHM(_),e.oxw().updateFieldsWhenTenanted()}),e.qZA(),e.TgZ(21,"label",17),e.SDv(22,18),e.qZA()()()(),e.YNc(23,uo,7,3,"div",19),e.TgZ(24,"div",8)(25,"label",20),e.SDv(26,21),e.qZA(),e.TgZ(27,"div",11),e._UZ(28,"input",22),e.YNc(29,Ro,2,0,"span",13),e.YNc(30,Eo,2,0,"span",13),e.qZA()(),e.TgZ(31,"div",8)(32,"label",23),e.SDv(33,24),e.qZA(),e.TgZ(34,"div",11),e._UZ(35,"input",25),e.YNc(36,go,2,0,"span",13),e.YNc(37,fo,2,0,"span",13),e.qZA()(),e.TgZ(38,"div",8)(39,"label",26),e.SDv(40,27),e.qZA(),e.TgZ(41,"div",11)(42,"select",28),e.NdJ("change",function(i){return e.CHM(_),e.oxw().onMaxBucketsModeChange(i.target.value)}),e.TgZ(43,"option",29),e.SDv(44,30),e.qZA(),e.TgZ(45,"option",31),e.SDv(46,32),e.qZA(),e.TgZ(47,"option",33),e.SDv(48,34),e.qZA()()()(),e.YNc(49,Co,6,2,"div",19),e.TgZ(50,"div",8)(51,"div",14)(52,"div",15),e._UZ(53,"input",35),e.TgZ(54,"label",36),e.SDv(55,37),e.qZA()()()(),e.YNc(56,Go,11,2,"fieldset",38),e.YNc(57,No,16,11,"fieldset",38),e.YNc(58,Io,25,13,"fieldset",38),e.YNc(59,ho,18,19,"fieldset",38),e.TgZ(60,"fieldset")(61,"legend"),e.SDv(62,39),e.qZA(),e.TgZ(63,"div",8)(64,"div",14)(65,"div",15),e._UZ(66,"input",40),e.TgZ(67,"label",41),e.SDv(68,42),e.qZA()()()(),e.YNc(69,Lo,6,0,"div",19),e.YNc(70,xo,7,2,"div",19),e.YNc(71,Zo,6,0,"div",19),e.YNc(72,qo,7,2,"div",19),e.qZA(),e.TgZ(73,"fieldset")(74,"legend"),e.SDv(75,43),e.qZA(),e.TgZ(76,"div",8)(77,"div",14)(78,"div",15),e._UZ(79,"input",44),e.TgZ(80,"label",45),e.SDv(81,46),e.qZA()()()(),e.YNc(82,Bo,6,0,"div",19),e.YNc(83,Ko,7,2,"div",19),e.YNc(84,zo,6,0,"div",19),e.YNc(85,Jo,7,2,"div",19),e.qZA()(),e.TgZ(86,"div",47)(87,"cd-form-button-panel",48),e.NdJ("submitActionEvent",function(){return e.CHM(_),e.oxw().onSubmit()}),e.ALo(88,"titlecase"),e.ALo(89,"upperFirst"),e.qZA()()()()()}if(2&t){const _=e.MAs(2),n=e.oxw();e.xp6(1),e.Q6J("formGroup",n.userForm),e.xp6(6),e.pQV(e.lcZ(6,30,n.action))(e.lcZ(7,32,n.resource)),e.QtT(5),e.xp6(3),e.Q6J("ngClass",e.VKq(38,l_,!n.editing)),e.xp6(3),e.Q6J("readonly",n.editing),e.xp6(1),e.Q6J("ngIf",n.userForm.showError("user_id",_,"required")),e.xp6(1),e.Q6J("ngIf",n.userForm.showError("user_id",_,"pattern")),e.xp6(1),e.Q6J("ngIf",!n.userForm.getValue("show_tenant")&&n.userForm.showError("user_id",_,"notUnique")),e.xp6(4),e.Q6J("readonly",!0),e.xp6(3),e.Q6J("ngIf",n.userForm.getValue("show_tenant")),e.xp6(2),e.Q6J("ngClass",e.VKq(40,l_,!n.editing)),e.xp6(4),e.Q6J("ngIf",n.userForm.showError("display_name",_,"pattern")),e.xp6(1),e.Q6J("ngIf",n.userForm.showError("display_name",_,"required")),e.xp6(6),e.Q6J("ngIf",n.userForm.showError("email",_,"email")),e.xp6(1),e.Q6J("ngIf",n.userForm.showError("email",_,"notUnique")),e.xp6(12),e.Q6J("ngIf",1==n.userForm.get("max_buckets_mode").value),e.xp6(7),e.Q6J("ngIf",!n.editing),e.xp6(1),e.Q6J("ngIf",n.editing),e.xp6(1),e.Q6J("ngIf",n.editing),e.xp6(1),e.Q6J("ngIf",n.editing),e.xp6(10),e.Q6J("ngIf",n.userForm.controls.user_quota_enabled.value),e.xp6(1),e.Q6J("ngIf",n.userForm.controls.user_quota_enabled.value&&!n.userForm.getValue("user_quota_max_size_unlimited")),e.xp6(1),e.Q6J("ngIf",n.userForm.controls.user_quota_enabled.value),e.xp6(1),e.Q6J("ngIf",n.userForm.controls.user_quota_enabled.value&&!n.userForm.getValue("user_quota_max_objects_unlimited")),e.xp6(10),e.Q6J("ngIf",n.userForm.controls.bucket_quota_enabled.value),e.xp6(1),e.Q6J("ngIf",n.userForm.controls.bucket_quota_enabled.value&&!n.userForm.getValue("bucket_quota_max_size_unlimited")),e.xp6(1),e.Q6J("ngIf",n.userForm.controls.bucket_quota_enabled.value),e.xp6(1),e.Q6J("ngIf",n.userForm.controls.bucket_quota_enabled.value&&!n.userForm.getValue("bucket_quota_max_objects_unlimited")),e.xp6(2),e.Q6J("form",n.userForm)("submitText",e.lcZ(88,34,n.action)+" "+e.lcZ(89,36,n.resource))}}let c_=(()=>{class t extends Xe.E{constructor(_,n,i,s,r,d,g){super(),this.formBuilder=_,this.route=n,this.router=i,this.rgwUserService=s,this.modalService=r,this.notificationService=d,this.actionLabels=g,this.editing=!1,this.submitObservables=[],this.icons=w.P,this.subusers=[],this.s3Keys=[],this.swiftKeys=[],this.capabilities=[],this.showTenant=!1,this.previousTenant=null,this.resource="user",this.subuserLabel="subuser",this.s3keyLabel="S3 Key",this.capabilityLabel="capability",this.editing=this.router.url.startsWith(`/rgw/user/${G.MQ.EDIT}`),this.action=this.editing?this.actionLabels.EDIT:this.actionLabels.CREATE,this.createForm()}createForm(){this.userForm=this.formBuilder.group({user_id:[null,[a.kI.required,a.kI.pattern(/^[a-zA-Z0-9!@#%^&*()_-]+$/)],this.editing?[]:[p.h.unique(this.rgwUserService.exists,this.rgwUserService,()=>this.userForm.getValue("tenant"))]],show_tenant:[this.editing],tenant:[null,[a.kI.pattern(/^[a-zA-Z0-9!@#%^&*()_-]+$/)],this.editing?[]:[p.h.unique(this.rgwUserService.exists,this.rgwUserService,()=>this.userForm.getValue("user_id"),!0)]],display_name:[null,[a.kI.required,a.kI.pattern(/^[a-zA-Z0-9!@#%^&*()_ -]+$/)]],email:[null,[p.h.email],[p.h.unique(this.rgwUserService.emailExists,this.rgwUserService)]],max_buckets_mode:[1],max_buckets:[1e3,[p.h.requiredIf({max_buckets_mode:"1"}),p.h.number(!1)]],suspended:[!1],generate_key:[!0],access_key:[null,[p.h.requiredIf({generate_key:!1})]],secret_key:[null,[p.h.requiredIf({generate_key:!1})]],user_quota_enabled:[!1],user_quota_max_size_unlimited:[!0],user_quota_max_size:[null,[p.h.composeIf({user_quota_enabled:!0,user_quota_max_size_unlimited:!1},[a.kI.required,this.quotaMaxSizeValidator])]],user_quota_max_objects_unlimited:[!0],user_quota_max_objects:[null,[p.h.requiredIf({user_quota_enabled:!0,user_quota_max_objects_unlimited:!1})]],bucket_quota_enabled:[!1],bucket_quota_max_size_unlimited:[!0],bucket_quota_max_size:[null,[p.h.composeIf({bucket_quota_enabled:!0,bucket_quota_max_size_unlimited:!1},[a.kI.required,this.quotaMaxSizeValidator])]],bucket_quota_max_objects_unlimited:[!0],bucket_quota_max_objects:[null,[p.h.requiredIf({bucket_quota_enabled:!0,bucket_quota_max_objects_unlimited:!1})]]})}ngOnInit(){this.route.params.subscribe(_=>{if(!_.hasOwnProperty("uid"))return void this.loadingReady();const n=decodeURIComponent(_.uid),i=[];i.push(this.rgwUserService.get(n)),i.push(this.rgwUserService.getQuota(n)),(0,te.D)(i).subscribe(s=>{const r=R().clone(this.userForm.value);let d=R().pick(s[0],R().keys(this.userForm.value));switch(d.max_buckets){case-1:d.max_buckets_mode=-1,d.max_buckets="";break;case 0:d.max_buckets_mode=0,d.max_buckets="";break;default:d.max_buckets_mode=1}["user","bucket"].forEach(E=>{const S=s[1][E+"_quota"];d[E+"_quota_enabled"]=S.enabled,S.max_size<0?(d[E+"_quota_max_size_unlimited"]=!0,d[E+"_quota_max_size"]=null):(d[E+"_quota_max_size_unlimited"]=!1,d[E+"_quota_max_size"]=`${S.max_size} B`),S.max_objects<0?(d[E+"_quota_max_objects_unlimited"]=!0,d[E+"_quota_max_objects"]=null):(d[E+"_quota_max_objects_unlimited"]=!1,d[E+"_quota_max_objects"]=S.max_objects)}),d=R().merge(r,d),this.userForm.setValue(d),this.subusers=s[0].subusers,this.s3Keys=s[0].keys,this.swiftKeys=s[0].swift_keys;const g={"read, write":"*"};s[0].caps.forEach(E=>{E.perm in g&&(E.perm=g[E.perm])}),this.capabilities=s[0].caps,this.loadingReady()},()=>{this.loadingError()})})}goToListView(){this.router.navigate(["/rgw/user"])}onSubmit(){let _;if(this.userForm.pristine)return void this.goToListView();const n=this.getUID();if(this.editing){if(this._isGeneralDirty()){const i=this._getUpdateArgs();this.submitObservables.push(this.rgwUserService.update(n,i))}_="Updated Object Gateway user '" + n + "'"}else{const i=this._getCreateArgs();this.submitObservables.push(this.rgwUserService.create(i)),_="Created Object Gateway user '" + n + "'"}if(this._isUserQuotaDirty()){const i=this._getUserQuotaArgs();this.submitObservables.push(this.rgwUserService.updateQuota(n,i))}if(this._isBucketQuotaDirty()){const i=this._getBucketQuotaArgs();this.submitObservables.push(this.rgwUserService.updateQuota(n,i))}(0,On.z)(...this.submitObservables).subscribe({error:()=>{this.userForm.setErrors({cdSubmitButton:!0})},complete:()=>{this.notificationService.show(ne.k.success,_),this.goToListView()}})}updateFieldsWhenTenanted(){this.showTenant=this.userForm.getValue("show_tenant"),this.showTenant?(this.userForm.get("user_id").markAsTouched(),this.previousTenant=this.userForm.get("tenant").value,this.userForm.get("tenant").patchValue(null)):(this.userForm.get("user_id").markAsUntouched(),this.userForm.get("tenant").patchValue(this.previousTenant))}getUID(){var _;let n=this.userForm.getValue("user_id");const i=null===(_=this.userForm)||void 0===_?void 0:_.getValue("tenant");return i&&i.length>0&&(n=`${this.userForm.getValue("tenant")}$${n}`),n}quotaMaxSizeValidator(_){return(0,p.P)(_.value)?null:null===RegExp("^(\\d+(\\.\\d+)?)\\s*(B|K(B|iB)?|M(B|iB)?|G(B|iB)?|T(B|iB)?)?$","i").exec(_.value)||(new De.H).toBytes(_.value)<1024?{quotaMaxSize:!0}:null}setSubuser(_,n){const i={"full-control":"full","read-write":"readwrite"},s=this.getUID();this.submitObservables.push(this.rgwUserService.createSubuser(s,{subuser:_.id,access:_.permissions in i?i[_.permissions]:_.permissions,key_type:"swift",secret_key:_.secret_key,generate_secret:_.generate_secret?"true":"false"})),R().isNumber(n)?this.subusers[n]=_:(this.subusers.push(_),this.swiftKeys.push({user:_.id,secret_key:_.generate_secret?"Apply your changes first...":_.secret_key})),this.userForm.markAsDirty()}deleteSubuser(_){const n=this.subusers[_];this.submitObservables.push(this.rgwUserService.deleteSubuser(this.getUID(),n.id)),this.s3Keys=this.s3Keys.filter(i=>i.user!==n.id),this.swiftKeys=this.swiftKeys.filter(i=>i.user!==n.id),this.subusers.splice(_,1),this.userForm.markAsDirty()}setCapability(_,n){const i=this.getUID();if(R().isNumber(n)){const s=this.capabilities[n];this.submitObservables.push(this.rgwUserService.deleteCapability(i,s.type,s.perm)),this.submitObservables.push(this.rgwUserService.addCapability(i,_.type,_.perm)),this.capabilities[n]=_}else this.submitObservables.push(this.rgwUserService.addCapability(i,_.type,_.perm)),this.capabilities=[...this.capabilities,_];this.userForm.markAsDirty()}deleteCapability(_){const n=this.capabilities[_];this.submitObservables.push(this.rgwUserService.deleteCapability(this.getUID(),n.type,n.perm)),this.capabilities.splice(_,1),this.capabilities=[...this.capabilities],this.userForm.markAsDirty()}hasAllCapabilities(_){return!R().difference(s_.getAll(),R().map(_,"type")).length}setS3Key(_,n){if(!R().isNumber(n)){const i=_.user.match(/([^:]+)(:(.+))?/),s=i[1],r={subuser:i[2]?i[3]:"",generate_key:_.generate_key?"true":"false"};"false"===r.generate_key&&(R().isNil(_.access_key)||(r.access_key=_.access_key),R().isNil(_.secret_key)||(r.secret_key=_.secret_key)),this.submitObservables.push(this.rgwUserService.addS3Key(s,r)),this.s3Keys.push({user:_.user,access_key:_.generate_key?"Apply your changes first...":_.access_key,secret_key:_.generate_key?"Apply your changes first...":_.secret_key})}this.userForm.markAsDirty()}deleteS3Key(_){const n=this.s3Keys[_];this.submitObservables.push(this.rgwUserService.deleteS3Key(this.getUID(),n.access_key)),this.s3Keys.splice(_,1),this.userForm.markAsDirty()}showSubuserModal(_){const n=this.getUID(),i=this.modalService.show(no);if(R().isNumber(_)){const s=this.subusers[_];i.componentInstance.setEditing(),i.componentInstance.setValues(n,s.id,s.permissions)}else i.componentInstance.setEditing(!1),i.componentInstance.setValues(n),i.componentInstance.setSubusers(this.subusers);i.componentInstance.submitAction.subscribe(s=>{this.setSubuser(s,_)})}showS3KeyModal(_){const n=this.modalService.show(a_);if(R().isNumber(_)){const i=this.s3Keys[_];n.componentInstance.setViewing(),n.componentInstance.setValues(i.user,i.access_key,i.secret_key)}else{const i=this._getS3KeyUserCandidates();n.componentInstance.setViewing(!1),n.componentInstance.setUserCandidates(i),n.componentInstance.submitAction.subscribe(s=>{this.setS3Key(s)})}}showSwiftKeyModal(_){const n=this.modalService.show(r_),i=this.swiftKeys[_];n.componentInstance.setValues(i.user,i.secret_key)}showCapabilityModal(_){const n=this.modalService.show(Ln);if(R().isNumber(_)){const i=this.capabilities[_];n.componentInstance.setEditing(),n.componentInstance.setValues(i.type,i.perm)}else n.componentInstance.setEditing(!1),n.componentInstance.setCapabilities(this.capabilities);n.componentInstance.submitAction.subscribe(i=>{this.setCapability(i,_)})}_isGeneralDirty(){return["display_name","email","max_buckets_mode","max_buckets","suspended"].some(_=>this.userForm.get(_).dirty)}_isUserQuotaDirty(){return["user_quota_enabled","user_quota_max_size_unlimited","user_quota_max_size","user_quota_max_objects_unlimited","user_quota_max_objects"].some(_=>this.userForm.get(_).dirty)}_isBucketQuotaDirty(){return["bucket_quota_enabled","bucket_quota_max_size_unlimited","bucket_quota_max_size","bucket_quota_max_objects_unlimited","bucket_quota_max_objects"].some(_=>this.userForm.get(_).dirty)}_getCreateArgs(){const _={uid:this.getUID(),display_name:this.userForm.getValue("display_name"),suspended:this.userForm.getValue("suspended"),email:"",max_buckets:this.userForm.getValue("max_buckets"),generate_key:this.userForm.getValue("generate_key"),access_key:"",secret_key:""},n=this.userForm.getValue("email");R().isString(n)&&n.length>0&&R().merge(_,{email:n}),this.userForm.getValue("generate_key")||R().merge(_,{generate_key:!1,access_key:this.userForm.getValue("access_key"),secret_key:this.userForm.getValue("secret_key")});const s=parseInt(this.userForm.getValue("max_buckets_mode"),10);return R().includes([-1,0],s)&&R().merge(_,{max_buckets:s}),_}_getUpdateArgs(){const _={},n=["display_name","email","max_buckets","suspended"];for(const s of n)_[s]=this.userForm.getValue(s);const i=parseInt(this.userForm.getValue("max_buckets_mode"),10);return R().includes([-1,0],i)&&(_.max_buckets=i),_}_getUserQuotaArgs(){const _={quota_type:"user",enabled:this.userForm.getValue("user_quota_enabled"),max_size_kb:-1,max_objects:-1};if(!this.userForm.getValue("user_quota_max_size_unlimited")){const n=(new De.H).toBytes(this.userForm.getValue("user_quota_max_size"));_.max_size_kb=(n/1024).toFixed(0)}return this.userForm.getValue("user_quota_max_objects_unlimited")||(_.max_objects=this.userForm.getValue("user_quota_max_objects")),_}_getBucketQuotaArgs(){const _={quota_type:"bucket",enabled:this.userForm.getValue("bucket_quota_enabled"),max_size_kb:-1,max_objects:-1};if(!this.userForm.getValue("bucket_quota_max_size_unlimited")){const n=(new De.H).toBytes(this.userForm.getValue("bucket_quota_max_size"));_.max_size_kb=(n/1024).toFixed(0)}return this.userForm.getValue("bucket_quota_max_objects_unlimited")||(_.max_objects=this.userForm.getValue("bucket_quota_max_objects")),_}_getS3KeyUserCandidates(){let _=[];const n=this.getUID();return R().isString(n)&&!R().isEmpty(n)&&_.push(n),this.subusers.forEach(i=>{_.push(i.id)}),this.s3Keys.forEach(i=>{_.push(i.user)}),_=R().uniq(_),_}onMaxBucketsModeChange(_){"1"===_&&(this.userForm.get("max_buckets").valid||this.userForm.patchValue({max_buckets:1e3}))}}return t.\u0275fac=function(_){return new(_||t)(e.Y36(Y.O),e.Y36(H.gz),e.Y36(H.F0),e.Y36(D),e.Y36(ie.Z),e.Y36(he.g),e.Y36(G.p4))},t.\u0275cmp=e.Xpm({type:t,selectors:[["cd-rgw-user-form"]],features:[e.qOj],decls:1,vars:1,consts:function(){let o,_,n,i,s,r,d,g,E,S,P,O,N,b,m,W,$,U,I,v,F,h,L,y,f,x,T,q,B,C,ae,re,le,ce,de,ue,Re,Ee,ge,fe,Se,Te,Ce,Me,pe,me,Ae,Ge,Pe,Oe,u,R_,E_,g_,f_,S_,T_,C_,M_,p_,m_,A_,G_,P_,O_,N_,b_,W_;return o="" + "\ufffd0\ufffd" + " " + "\ufffd1\ufffd" + "",_="User ID",n="Show Tenant",i="Full name",s="Email address",r="Max. buckets",d="Disabled",g="Unlimited",E="Custom",S="Suspended",P="User quota",O="Enabled",N="Bucket quota",b="Enabled",m="This field is required.",W="The value is not valid.",$="The chosen user ID is already in use.",U="Tenant",I="The value is not valid.",v="The chosen user ID exists in this tenant.",F="The value is not valid.",h="This field is required.",L="This is not a valid email address.",y="The chosen email address is already in use.",f="This field is required.",x="The entered value must be >= 1.",T="S3 key",q="Auto-generate key",B="Access key",C="This field is required.",ae="Secret key",re="This field is required.",le="Subusers",ce="" + "\ufffd0\ufffd" + " " + "\ufffd1\ufffd" + "",de="There are no subusers.",ue="Edit",Re="Delete",Ee="Keys",ge="S3",fe="" + "\ufffd0\ufffd" + " " + "\ufffd1\ufffd" + "",Se="Swift",Te="There are no keys.",Ce="Show",Me="Delete",pe="There are no keys.",me="Show",Ae="Capabilities",Ge="All capabilities are already added.",Pe="" + "\ufffd0\ufffd" + " " + "\ufffd1\ufffd" + "",Oe="There are no capabilities.",u="Edit",R_="Delete",E_="Unlimited size",g_="Max. size",f_="This field is required.",S_="The value is not valid.",T_="Unlimited objects",C_="Max. objects",M_="This field is required.",p_="The entered value must be >= 0.",m_="Unlimited size",A_="Max. size",G_="This field is required.",P_="The value is not valid.",O_="Unlimited objects",N_="Max. objects",b_="This field is required.",W_="The entered value must be >= 0.",[["class","cd-col-form",4,"cdFormLoading"],[1,"cd-col-form"],["novalidate","",3,"formGroup"],["frm","ngForm"],[1,"card"],[1,"card-header"],o,[1,"card-body"],[1,"form-group","row"],["for","user_id",1,"cd-col-form-label",3,"ngClass"],_,[1,"cd-col-form-input"],["id","user_id","type","text","formControlName","user_id",1,"form-control",3,"readonly"],["class","invalid-feedback",4,"ngIf"],[1,"cd-col-form-offset"],[1,"custom-control","custom-checkbox"],["id","show_tenant","type","checkbox","formControlName","show_tenant",1,"custom-control-input",3,"readonly","click"],["for","show_tenant",1,"custom-control-label"],n,["class","form-group row",4,"ngIf"],["for","display_name",1,"cd-col-form-label",3,"ngClass"],i,["id","display_name","type","text","formControlName","display_name",1,"form-control"],["for","email",1,"cd-col-form-label"],s,["id","email","type","text","formControlName","email",1,"form-control"],["for","max_buckets_mode",1,"cd-col-form-label"],r,["formControlName","max_buckets_mode","name","max_buckets_mode","id","max_buckets_mode",1,"form-select",3,"change"],["value","-1"],d,["value","0"],g,["value","1"],E,["id","suspended","type","checkbox","formControlName","suspended",1,"custom-control-input"],["for","suspended",1,"custom-control-label"],S,[4,"ngIf"],P,["id","user_quota_enabled","type","checkbox","formControlName","user_quota_enabled",1,"custom-control-input"],["for","user_quota_enabled",1,"custom-control-label"],O,N,["id","bucket_quota_enabled","type","checkbox","formControlName","bucket_quota_enabled",1,"custom-control-input"],["for","bucket_quota_enabled",1,"custom-control-label"],b,[1,"card-footer"],["wrappingClass","text-right",3,"form","submitText","submitActionEvent"],[1,"invalid-feedback"],m,W,$,["for","tenant",1,"cd-col-form-label"],U,["id","tenant","type","text","formControlName","tenant","autofocus","",1,"form-control",3,"readonly"],I,v,F,h,L,y,[1,"cd-col-form-label"],["id","max_buckets","type","number","formControlName","max_buckets","min","1",1,"form-control"],f,x,T,["id","generate_key","type","checkbox","formControlName","generate_key",1,"custom-control-input"],["for","generate_key",1,"custom-control-label"],q,["for","access_key",1,"cd-col-form-label","required"],B,[1,"input-group"],["id","access_key","type","password","formControlName","access_key",1,"form-control"],["type","button","cdPasswordButton","access_key",1,"btn","btn-light"],["source","access_key"],C,["for","secret_key",1,"cd-col-form-label","required"],ae,["id","secret_key","type","password","formControlName","secret_key",1,"form-control"],["type","button","cdPasswordButton","secret_key",1,"btn","btn-light"],["source","secret_key"],re,le,[1,"row"],["class","no-border",4,"ngIf"],[4,"ngFor","ngForOf"],[1,"row","my-2"],[1,"col-12"],["type","button",1,"btn","btn-light","float-end","tc_addSubuserButton",3,"click"],[3,"ngClass"],ce,[1,"help-block"],[1,"no-border"],[1,"form-text","text-muted"],de,[1,"input-group-text"],["type","text","readonly","",1,"cd-form-control",3,"value"],["type","button","ngbTooltip",ue,1,"btn","btn-light","tc_showSubuserButton",3,"click"],["type","button","ngbTooltip",Re,1,"btn","btn-light","tc_deleteSubuserButton",3,"click"],Ee,ge,["type","button",1,"btn","btn-light","float-end","tc_addS3KeyButton",3,"click"],fe,Se,Te,["type","button","ngbTooltip",Ce,1,"btn","btn-light","tc_showS3KeyButton",3,"click"],["type","button","ngbTooltip",Me,1,"btn","btn-light","tc_deleteS3KeyButton",3,"click"],pe,["type","button","ngbTooltip",me,1,"btn","btn-light","tc_showSwiftKeyButton",3,"click"],Ae,["type","button","ngbTooltip",Ge,"triggers","pointerenter:pointerleave",1,"btn","btn-light","float-end","tc_addCapButton",3,"disabled","disableTooltip","click"],Pe,Oe,["type","button","ngbTooltip",u,1,"btn","btn-light","tc_editCapButton",3,"click"],["type","button","ngbTooltip",R_,1,"btn","btn-light","tc_deleteCapButton",3,"click"],["id","user_quota_max_size_unlimited","type","checkbox","formControlName","user_quota_max_size_unlimited",1,"custom-control-input"],["for","user_quota_max_size_unlimited",1,"custom-control-label"],E_,["for","user_quota_max_size",1,"cd-col-form-label","required"],g_,["id","user_quota_max_size","type","text","formControlName","user_quota_max_size","cdDimlessBinary","",1,"form-control"],f_,S_,["id","user_quota_max_objects_unlimited","type","checkbox","formControlName","user_quota_max_objects_unlimited",1,"custom-control-input"],["for","user_quota_max_objects_unlimited",1,"custom-control-label"],T_,["for","user_quota_max_objects",1,"cd-col-form-label","required"],C_,["id","user_quota_max_objects","type","number","formControlName","user_quota_max_objects","min","0",1,"form-control"],M_,p_,["id","bucket_quota_max_size_unlimited","type","checkbox","formControlName","bucket_quota_max_size_unlimited",1,"custom-control-input"],["for","bucket_quota_max_size_unlimited",1,"custom-control-label"],m_,["for","bucket_quota_max_size",1,"cd-col-form-label","required"],A_,["id","bucket_quota_max_size","type","text","formControlName","bucket_quota_max_size","cdDimlessBinary","",1,"form-control"],G_,P_,["id","bucket_quota_max_objects_unlimited","type","checkbox","formControlName","bucket_quota_max_objects_unlimited",1,"custom-control-input"],["for","bucket_quota_max_objects_unlimited",1,"custom-control-label"],O_,["for","bucket_quota_max_objects",1,"cd-col-form-label","required"],N_,["id","bucket_quota_max_objects","type","number","formControlName","bucket_quota_max_objects","min","0",1,"form-control"],b_,W_]},template:function(_,n){1&_&&e.YNc(0,Vo,90,42,"div",0),2&_&&e.Q6J("cdFormLoading",n.loading)},directives:[ze.y,a._Y,a.JL,J.V,a.sg,X.P,M.mk,k.o,a.Fj,K.b,a.JJ,a.u,M.O5,a.Wl,se.U,a.EJ,a.YN,a.Kr,a.wV,a.qQ,Ie.C,ve.s,M.sg,A._L,io.Q,V.p],pipes:[M.rS,j.m,we.i],styles:[""]}),t})();var d_=l(99466),jo=l(78877),ei=l(86969);const _i=["accessKeyTpl"],ti=["secretKeyTpl"];function ni(t,o){if(1&t&&(e.TgZ(0,"tr")(1,"td",15),e.SDv(2,20),e.qZA(),e.TgZ(3,"td"),e._uU(4),e.qZA()()),2&t){const _=e.oxw(4);e.xp6(4),e.Oqu(_.user.email)}}function oi(t,o){if(1&t&&(e.TgZ(0,"div"),e._uU(1),e.qZA()),2&t){const _=o.$implicit;e.xp6(1),e.AsE(" ",_.id," (",_.permissions,") ")}}function ii(t,o){if(1&t&&(e.TgZ(0,"tr")(1,"td",15),e.SDv(2,21),e.qZA(),e.TgZ(3,"td"),e.YNc(4,oi,2,2,"div",22),e.qZA()()),2&t){const _=e.oxw(4);e.xp6(4),e.Q6J("ngForOf",_.user.subusers)}}function si(t,o){if(1&t&&(e.TgZ(0,"div"),e._uU(1),e.qZA()),2&t){const _=o.$implicit;e.xp6(1),e.AsE(" ",_.type," (",_.perm,") ")}}function ai(t,o){if(1&t&&(e.TgZ(0,"tr")(1,"td",15),e.SDv(2,23),e.qZA(),e.TgZ(3,"td"),e.YNc(4,si,2,2,"div",22),e.qZA()()),2&t){const _=e.oxw(4);e.xp6(4),e.Q6J("ngForOf",_.user.caps)}}function ri(t,o){if(1&t&&(e.TgZ(0,"tr")(1,"td",15),e.SDv(2,24),e.qZA(),e.TgZ(3,"td"),e._uU(4),e.ALo(5,"join"),e.qZA()()),2&t){const _=e.oxw(4);e.xp6(4),e.Oqu(e.lcZ(5,1,_.user.mfa_ids))}}function li(t,o){1&t&&(e.TgZ(0,"td"),e._uU(1,"-"),e.qZA())}function ci(t,o){1&t&&(e.TgZ(0,"td"),e.SDv(1,29),e.qZA())}function di(t,o){if(1&t&&(e.TgZ(0,"td"),e._uU(1),e.ALo(2,"dimlessBinary"),e.qZA()),2&t){const _=e.oxw(5);e.xp6(1),e.hij(" ",e.lcZ(2,1,_.user.user_quota.max_size)," ")}}function ui(t,o){1&t&&(e.TgZ(0,"td"),e._uU(1,"-"),e.qZA())}function Ri(t,o){1&t&&(e.TgZ(0,"td"),e.SDv(1,30),e.qZA())}function Ei(t,o){if(1&t&&(e.TgZ(0,"td"),e._uU(1),e.qZA()),2&t){const _=e.oxw(5);e.xp6(1),e.hij(" ",_.user.user_quota.max_objects," ")}}function gi(t,o){if(1&t&&(e.TgZ(0,"div")(1,"legend"),e.SDv(2,25),e.qZA(),e.TgZ(3,"table",9)(4,"tbody")(5,"tr")(6,"td",10),e.SDv(7,26),e.qZA(),e.TgZ(8,"td",12),e._uU(9),e.ALo(10,"booleanText"),e.qZA()(),e.TgZ(11,"tr")(12,"td",15),e.SDv(13,27),e.qZA(),e.YNc(14,li,2,0,"td",0),e.YNc(15,ci,2,0,"td",0),e.YNc(16,di,3,3,"td",0),e.qZA(),e.TgZ(17,"tr")(18,"td",15),e.SDv(19,28),e.qZA(),e.YNc(20,ui,2,0,"td",0),e.YNc(21,Ri,2,0,"td",0),e.YNc(22,Ei,2,1,"td",0),e.qZA()()()()),2&t){const _=e.oxw(4);e.xp6(9),e.Oqu(e.lcZ(10,7,_.user.user_quota.enabled)),e.xp6(5),e.Q6J("ngIf",!_.user.user_quota.enabled),e.xp6(1),e.Q6J("ngIf",_.user.user_quota.enabled&&_.user.user_quota.max_size<=-1),e.xp6(1),e.Q6J("ngIf",_.user.user_quota.enabled&&_.user.user_quota.max_size>-1),e.xp6(4),e.Q6J("ngIf",!_.user.user_quota.enabled),e.xp6(1),e.Q6J("ngIf",_.user.user_quota.enabled&&_.user.user_quota.max_objects<=-1),e.xp6(1),e.Q6J("ngIf",_.user.user_quota.enabled&&_.user.user_quota.max_objects>-1)}}function fi(t,o){1&t&&(e.TgZ(0,"td"),e._uU(1,"-"),e.qZA())}function Si(t,o){1&t&&(e.TgZ(0,"td"),e.SDv(1,35),e.qZA())}function Ti(t,o){if(1&t&&(e.TgZ(0,"td"),e._uU(1),e.ALo(2,"dimlessBinary"),e.qZA()),2&t){const _=e.oxw(5);e.xp6(1),e.hij(" ",e.lcZ(2,1,_.user.bucket_quota.max_size)," ")}}function Ci(t,o){1&t&&(e.TgZ(0,"td"),e._uU(1,"-"),e.qZA())}function Mi(t,o){1&t&&(e.TgZ(0,"td"),e.SDv(1,36),e.qZA())}function pi(t,o){if(1&t&&(e.TgZ(0,"td"),e._uU(1),e.qZA()),2&t){const _=e.oxw(5);e.xp6(1),e.hij(" ",_.user.bucket_quota.max_objects," ")}}function mi(t,o){if(1&t&&(e.TgZ(0,"div")(1,"legend"),e.SDv(2,31),e.qZA(),e.TgZ(3,"table",9)(4,"tbody")(5,"tr")(6,"td",10),e.SDv(7,32),e.qZA(),e.TgZ(8,"td",12),e._uU(9),e.ALo(10,"booleanText"),e.qZA()(),e.TgZ(11,"tr")(12,"td",15),e.SDv(13,33),e.qZA(),e.YNc(14,fi,2,0,"td",0),e.YNc(15,Si,2,0,"td",0),e.YNc(16,Ti,3,3,"td",0),e.qZA(),e.TgZ(17,"tr")(18,"td",15),e.SDv(19,34),e.qZA(),e.YNc(20,Ci,2,0,"td",0),e.YNc(21,Mi,2,0,"td",0),e.YNc(22,pi,2,1,"td",0),e.qZA()()()()),2&t){const _=e.oxw(4);e.xp6(9),e.Oqu(e.lcZ(10,7,_.user.bucket_quota.enabled)),e.xp6(5),e.Q6J("ngIf",!_.user.bucket_quota.enabled),e.xp6(1),e.Q6J("ngIf",_.user.bucket_quota.enabled&&_.user.bucket_quota.max_size<=-1),e.xp6(1),e.Q6J("ngIf",_.user.bucket_quota.enabled&&_.user.bucket_quota.max_size>-1),e.xp6(4),e.Q6J("ngIf",!_.user.bucket_quota.enabled),e.xp6(1),e.Q6J("ngIf",_.user.bucket_quota.enabled&&_.user.bucket_quota.max_objects<=-1),e.xp6(1),e.Q6J("ngIf",_.user.bucket_quota.enabled&&_.user.bucket_quota.max_objects>-1)}}function Ai(t,o){if(1&t&&(e.TgZ(0,"div")(1,"table",9)(2,"tbody")(3,"tr")(4,"td",10),e.SDv(5,11),e.qZA(),e.TgZ(6,"td",12),e._uU(7),e.qZA()(),e.TgZ(8,"tr")(9,"td",10),e.SDv(10,13),e.qZA(),e.TgZ(11,"td",12),e._uU(12),e.qZA()(),e.TgZ(13,"tr")(14,"td",10),e.SDv(15,14),e.qZA(),e.TgZ(16,"td",12),e._uU(17),e.qZA()(),e.TgZ(18,"tr")(19,"td",15),e.SDv(20,16),e.qZA(),e.TgZ(21,"td"),e._uU(22),e.qZA()(),e.YNc(23,ni,5,1,"tr",0),e.TgZ(24,"tr")(25,"td",15),e.SDv(26,17),e.qZA(),e.TgZ(27,"td"),e._uU(28),e.ALo(29,"booleanText"),e.qZA()(),e.TgZ(30,"tr")(31,"td",15),e.SDv(32,18),e.qZA(),e.TgZ(33,"td"),e._uU(34),e.ALo(35,"booleanText"),e.qZA()(),e.TgZ(36,"tr")(37,"td",15),e.SDv(38,19),e.qZA(),e.TgZ(39,"td"),e._uU(40),e.ALo(41,"map"),e.qZA()(),e.YNc(42,ii,5,1,"tr",0),e.YNc(43,ai,5,1,"tr",0),e.YNc(44,ri,6,3,"tr",0),e.qZA()(),e.YNc(45,gi,23,9,"div",0),e.YNc(46,mi,23,9,"div",0),e.qZA()),2&t){const _=e.oxw(3);e.xp6(7),e.Oqu(_.user.tenant),e.xp6(5),e.Oqu(_.user.user_id),e.xp6(5),e.Oqu(_.user.uid),e.xp6(5),e.Oqu(_.user.display_name),e.xp6(1),e.Q6J("ngIf",null==_.user.email?null:_.user.email.length),e.xp6(5),e.Oqu(e.lcZ(29,13,_.user.suspended)),e.xp6(6),e.Oqu(e.lcZ(35,15,"true"===_.user.system)),e.xp6(6),e.Oqu(e.xi3(41,17,_.user.max_buckets,_.maxBucketsMap)),e.xp6(2),e.Q6J("ngIf",_.user.subusers&&_.user.subusers.length),e.xp6(1),e.Q6J("ngIf",_.user.caps&&_.user.caps.length),e.xp6(1),e.Q6J("ngIf",null==_.user.mfa_ids?null:_.user.mfa_ids.length),e.xp6(1),e.Q6J("ngIf",_.user.user_quota),e.xp6(1),e.Q6J("ngIf",_.user.bucket_quota)}}function Gi(t,o){if(1&t&&e.YNc(0,Ai,47,20,"div",0),2&t){const _=e.oxw(2);e.Q6J("ngIf",_.user)}}const Pi=function(t){return[t]};function Oi(t,o){if(1&t){const _=e.EpF();e.TgZ(0,"cd-table",39),e.NdJ("updateSelection",function(i){return e.CHM(_),e.oxw(3).updateKeysSelection(i)}),e.TgZ(1,"div",40)(2,"div",41)(3,"button",42),e.NdJ("click",function(){return e.CHM(_),e.oxw(3).showKeyModal()}),e._UZ(4,"i",43),e.ynx(5),e.SDv(6,44),e.BQk(),e.qZA()()()()}if(2&t){const _=e.oxw(3);e.Q6J("data",_.keys)("columns",_.keysColumns),e.xp6(3),e.Q6J("disabled",!_.keysSelection.hasSingleSelection),e.xp6(1),e.Q6J("ngClass",e.VKq(4,Pi,_.icons.show))}}function Ni(t,o){1&t&&(e.ynx(0,37),e.TgZ(1,"a",4),e.SDv(2,38),e.qZA(),e.YNc(3,Oi,7,6,"ng-template",6),e.BQk())}function bi(t,o){if(1&t&&(e.ynx(0),e.TgZ(1,"nav",1,2),e.ynx(3,3),e.TgZ(4,"a",4),e.SDv(5,5),e.qZA(),e.YNc(6,Gi,1,1,"ng-template",6),e.BQk(),e.YNc(7,Ni,4,0,"ng-container",7),e.qZA(),e._UZ(8,"div",8),e.BQk()),2&t){const _=e.MAs(2),n=e.oxw();e.xp6(7),e.Q6J("ngIf",n.keys.length),e.xp6(1),e.Q6J("ngbNavOutlet",_)}}let Wi=(()=>{class t{constructor(_,n){this.rgwUserService=_,this.modalService=n,this.keys=[],this.keysColumns=[],this.keysSelection=new ye.r,this.icons=w.P}ngOnInit(){this.keysColumns=[{name:"Username",prop:"username",flexGrow:1},{name:"Type",prop:"type",flexGrow:1}],this.maxBucketsMap={"-1":"Disabled",0:"Unlimited"}}ngOnChanges(){this.selection&&(this.user=this.selection,this.user.subusers=R().sortBy(this.user.subusers,"id"),this.user.caps=R().sortBy(this.user.caps,"type"),this.rgwUserService.getQuota(this.user.uid).subscribe(_=>{R().extend(this.user,_)}),this.keys=[],this.user.keys&&this.user.keys.forEach(_=>{this.keys.push({id:this.keys.length+1,type:"S3",username:_.user,ref:_})}),this.user.swift_keys&&this.user.swift_keys.forEach(_=>{this.keys.push({id:this.keys.length+1,type:"Swift",username:_.user,ref:_})}),this.keys=R().sortBy(this.keys,"user"))}updateKeysSelection(_){this.keysSelection=_}showKeyModal(){const _=this.keysSelection.first(),n=this.modalService.show("S3"===_.type?a_:r_);switch(_.type){case"S3":n.componentInstance.setViewing(),n.componentInstance.setValues(_.ref.user,_.ref.access_key,_.ref.secret_key);break;case"Swift":n.componentInstance.setValues(_.ref.user,_.ref.secret_key)}}}return t.\u0275fac=function(_){return new(_||t)(e.Y36(D),e.Y36(ie.Z))},t.\u0275cmp=e.Xpm({type:t,selectors:[["cd-rgw-user-details"]],viewQuery:function(_,n){if(1&_&&(e.Gf(_i,5),e.Gf(ti,5)),2&_){let i;e.iGM(i=e.CRH())&&(n.accessKeyTpl=i.first),e.iGM(i=e.CRH())&&(n.secretKeyTpl=i.first)}},inputs:{selection:"selection"},features:[e.TTD],decls:1,vars:1,consts:function(){let o,_,n,i,s,r,d,g,E,S,P,O,N,b,m,W,$,U,I,v,F,h,L,y,f,x;return o="Details",_="Tenant",n="User ID",i="Username",s="Full name",r="Suspended",d="System",g="Maximum buckets",E="Email address",S="Subusers",P="Capabilities",O="MFAs(Id)",N="User quota",b="Enabled",m="Maximum size",W="Maximum objects",$="Unlimited",U="Unlimited",I="Bucket quota",v="Enabled",F="Maximum size",h="Maximum objects",L="Unlimited",y="Unlimited",f="Keys",x="Show",[[4,"ngIf"],["ngbNav","","cdStatefulTab","rgw-user-details",1,"nav-tabs"],["nav","ngbNav"],["ngbNavItem","details"],["ngbNavLink",""],o,["ngbNavContent",""],["ngbNavItem","keys",4,"ngIf"],[3,"ngbNavOutlet"],[1,"table","table-striped","table-bordered"],[1,"bold","w-25"],_,[1,"w-75"],n,i,[1,"bold"],s,r,d,g,E,S,[4,"ngFor","ngForOf"],P,O,N,b,m,W,$,U,I,v,F,h,L,y,["ngbNavItem","keys"],f,["columnMode","flex","selectionType","multi","forceIdentifier","true",3,"data","columns","updateSelection"],[1,"table-actions"],["dropdown","",1,"btn-group"],["type","button",1,"btn","btn-accent",3,"disabled","click"],[3,"ngClass"],x]},template:function(_,n){1&_&&e.YNc(0,bi,9,2,"ng-container",0),2&_&&e.Q6J("ngIf",n.selection)},directives:[M.O5,A.Pz,o_.m,A.nv,A.Vx,A.uN,M.sg,ee.a,k.o,M.mk,A.tO],pipes:[t_.T,jo.b,ei.A,je.$],styles:[""]}),t})();const $i=["userSizeTpl"],Ui=["userObjectTpl"];function Ii(t,o){if(1&t&&e._UZ(0,"cd-usage-bar",8),2&t){const _=e.oxw().row;e.Q6J("total",_.user_quota.max_size)("used",_.stats.size_actual)}}function vi(t,o){1&t&&e.SDv(0,9)}function Fi(t,o){if(1&t&&(e.YNc(0,Ii,1,2,"cd-usage-bar",6),e.YNc(1,vi,1,0,"ng-template",null,7,e.W1O)),2&t){const _=o.row,n=e.MAs(2);e.Q6J("ngIf",_.user_quota.max_size>0&&_.user_quota.enabled)("ngIfElse",n)}}function hi(t,o){if(1&t&&e._UZ(0,"cd-usage-bar",12),2&t){const _=e.oxw().row;e.Q6J("total",_.user_quota.max_objects)("used",_.stats.num_objects)("isBinary",!1)}}function Li(t,o){1&t&&e.SDv(0,13)}function yi(t,o){if(1&t&&(e.YNc(0,hi,1,3,"cd-usage-bar",10),e.YNc(1,Li,1,0,"ng-template",null,11,e.W1O)),2&t){const _=o.row,n=e.MAs(2);e.Q6J("ngIf",_.user_quota.max_objects>0&&_.user_quota.enabled)("ngIfElse",n)}}let xi=(()=>{class t extends Le.o{constructor(_,n,i,s,r,d){super(d),this.authStorageService=_,this.rgwUserService=n,this.modalService=i,this.urlBuilder=s,this.actionLabels=r,this.ngZone=d,this.columns=[],this.users=[],this.selection=new ye.r}ngOnInit(){this.permission=this.authStorageService.getPermissions().rgw,this.columns=[{name:"Username",prop:"uid",flexGrow:1},{name:"Tenant",prop:"tenant",flexGrow:1},{name:"Full name",prop:"display_name",flexGrow:1},{name:"Email address",prop:"email",flexGrow:1},{name:"Suspended",prop:"suspended",flexGrow:1,cellClass:"text-center",cellTransformation:d_.e.checkIcon},{name:"Max. buckets",prop:"max_buckets",flexGrow:1,cellTransformation:d_.e.map,customTemplateConfig:{"-1":"Disabled",0:"Unlimited"}},{name:"Capacity Limit %",prop:"size_usage",cellTemplate:this.userSizeTpl,flexGrow:.8},{name:"Object Limit %",prop:"object_usage",cellTemplate:this.userObjectTpl,flexGrow:.8}];const _=()=>this.selection.first()&&`${encodeURIComponent(this.selection.first().uid)}`;this.tableActions=[{permission:"create",icon:w.P.add,routerLink:()=>this.urlBuilder.getCreate(),name:this.actionLabels.CREATE,canBePrimary:r=>!r.hasSelection},{permission:"update",icon:w.P.edit,routerLink:()=>this.urlBuilder.getEdit(_()),name:this.actionLabels.EDIT},{permission:"delete",icon:w.P.destroy,click:()=>this.deleteAction(),disable:()=>!this.selection.hasSelection,name:this.actionLabels.DELETE,canBePrimary:r=>r.hasMultiSelection}],this.setTableRefreshTimeout()}getUserList(_){this.setTableRefreshTimeout(),this.rgwUserService.list().subscribe(n=>{this.users=n},()=>{_.error()})}updateSelection(_){this.selection=_}deleteAction(){this.modalService.show(Ve.M,{itemDescription:this.selection.hasSingleSelection?"user":"users",itemNames:this.selection.selected.map(_=>_.uid),submitActionObservable:()=>new Je.y(_=>{(0,te.D)(this.selection.selected.map(n=>this.rgwUserService.delete(n.uid))).subscribe({error:n=>{_.error(n),this.table.refreshBtn()},complete:()=>{_.complete(),this.table.refreshBtn()}})})})}}return t.\u0275fac=function(_){return new(_||t)(e.Y36($e.j),e.Y36(D),e.Y36(ie.Z),e.Y36(_e.F),e.Y36(G.p4),e.Y36(e.R0b))},t.\u0275cmp=e.Xpm({type:t,selectors:[["cd-rgw-user-list"]],viewQuery:function(_,n){if(1&_&&(e.Gf(ee.a,7),e.Gf($i,7),e.Gf(Ui,7)),2&_){let i;e.iGM(i=e.CRH())&&(n.table=i.first),e.iGM(i=e.CRH())&&(n.userSizeTpl=i.first),e.iGM(i=e.CRH())&&(n.userObjectTpl=i.first)}},features:[e._Bn([{provide:_e.F,useValue:new _e.F("rgw/user")}]),e.qOj],decls:8,vars:9,consts:function(){let o,_;return o="No Limit",_="No Limit",[["columnMode","flex","selectionType","multiClick","identifier","uid",3,"autoReload","data","columns","hasDetails","status","setExpandedRow","updateSelection","fetchData"],["table",""],[1,"table-actions",3,"permission","selection","tableActions"],["cdTableDetail","",3,"selection"],["userSizeTpl",""],["userObjectTpl",""],[3,"total","used",4,"ngIf","ngIfElse"],["noSizeQuota",""],[3,"total","used"],o,[3,"total","used","isBinary",4,"ngIf","ngIfElse"],["noObjectQuota",""],[3,"total","used","isBinary"],_]},template:function(_,n){1&_&&(e.TgZ(0,"cd-table",0,1),e.NdJ("setExpandedRow",function(s){return n.setExpandedRow(s)})("updateSelection",function(s){return n.updateSelection(s)})("fetchData",function(s){return n.getUserList(s)}),e._UZ(2,"cd-table-actions",2)(3,"cd-rgw-user-details",3),e.qZA(),e.YNc(4,Fi,3,2,"ng-template",null,4,e.W1O),e.YNc(6,yi,3,2,"ng-template",null,5,e.W1O)),2&_&&(e.Q6J("autoReload",!1)("data",n.users)("columns",n.columns)("hasDetails",!0)("status",n.tableStatus),e.xp6(2),e.Q6J("permission",n.permission)("selection",n.selection)("tableActions",n.tableActions),e.xp6(1),e.Q6J("selection",n.expandedRow))},directives:[ee.a,__.K,Wi,M.O5,n_.O],styles:[""]}),t})(),u_=(()=>{class t{}return t.\u0275fac=function(_){return new(_||t)},t.\u0275mod=e.oAB({type:t}),t.\u0275inj=e.cJS({imports:[[M.ez,$_.m,a.u5,a.UX,U_.B,A.Oz,H.Bz,A.HK,we.b]]}),t})();const Zi=[{path:""},{path:"daemon",component:Pn,data:{breadcrumbs:"Daemons"}},{path:"user",data:{breadcrumbs:"Users"},children:[{path:"",component:xi},{path:G.MQ.CREATE,component:c_,data:{breadcrumbs:G.Qn.CREATE}},{path:`${G.MQ.EDIT}/:uid`,component:c_,data:{breadcrumbs:G.Qn.EDIT}}]},{path:"bucket",data:{breadcrumbs:"Buckets"},children:[{path:"",component:cn},{path:G.MQ.CREATE,component:Ye,data:{breadcrumbs:G.Qn.CREATE}},{path:`${G.MQ.EDIT}/:bid`,component:Ye,data:{breadcrumbs:G.Qn.EDIT}}]}];let wi=(()=>{class t{}return t.\u0275fac=function(_){return new(_||t)},t.\u0275mod=e.oAB({type:t}),t.\u0275inj=e.cJS({imports:[[u_,H.Bz.forChild(Zi)]]}),t})()}}]);
\ No newline at end of file
diff --git a/ceph/src/pybind/mgr/dashboard/frontend/dist/en-US/483.43ef92bcd845cb24eae3.js b/ceph/src/pybind/mgr/dashboard/frontend/dist/en-US/483.43ef92bcd845cb24eae3.js
deleted file mode 100644 (file)
index 1f9b929..0000000
+++ /dev/null
@@ -1 +0,0 @@
-"use strict";(self.webpackChunkceph_dashboard=self.webpackChunkceph_dashboard||[]).push([[483],{70483:(ct,Oe,p)=>{p.r(Oe),p.d(Oe,{BlockModule:()=>$t,RoutedBlockModule:()=>sr});var l=p(12057),a=p(24751),m=p(6283),ne=p(19723),N=p(38549),Ie=p(37496),v=p(79512),U=p(4222),re=p(54462),Ae=p(44466),be=p(23815),S=p.n(be),le=p(35758),D=p(64762),ie=p(58497),V=p(93523),e=p(74788);let X=class{constructor(s){this.http=s}listTargets(){return this.http.get("api/iscsi/target")}getTarget(s){return this.http.get(`api/iscsi/target/${s}`)}updateTarget(s,t){return this.http.put(`api/iscsi/target/${s}`,t,{observe:"response"})}status(){return this.http.get("ui-api/iscsi/status")}settings(){return this.http.get("ui-api/iscsi/settings")}version(){return this.http.get("ui-api/iscsi/version")}portals(){return this.http.get("ui-api/iscsi/portals")}createTarget(s){return this.http.post("api/iscsi/target",s,{observe:"response"})}deleteTarget(s){return this.http.delete(`api/iscsi/target/${s}`,{observe:"response"})}getDiscovery(){return this.http.get("api/iscsi/discoveryauth")}updateDiscovery(s){return this.http.put("api/iscsi/discoveryauth",s)}overview(){return this.http.get("ui-api/iscsi/overview")}};X.\u0275fac=function(s){return new(s||X)(e.LFG(ie.eN))},X.\u0275prov=e.Yz7({token:X,factory:X.\u0275fac,providedIn:"root"}),X=(0,D.gn)([V.o,(0,D.w6)("design:paramtypes",[ie.eN])],X);var Ne=p(88002),Fe=p(76189),L=p(19358),he=p(34089);let q=class extends Fe.S{constructor(s,t){super(),this.http=s,this.rbdConfigurationService=t}isRBDPool(s){return-1!==S().indexOf(s.application_metadata,"rbd")&&!s.pool_name.includes("/")}create(s){return this.http.post("api/block/image",s,{observe:"response"})}delete(s){return this.http.delete(`api/block/image/${s.toStringEncoded()}`,{observe:"response"})}update(s,t){return this.http.put(`api/block/image/${s.toStringEncoded()}`,t,{observe:"response"})}get(s){return this.http.get(`api/block/image/${s.toStringEncoded()}`)}list(s){return this.http.get("api/block/image",{params:s,headers:{Accept:this.getVersionHeaderValue(2,0)},observe:"response"}).pipe((0,Ne.U)(t=>t.body.map(o=>(o.value.map(i=>(i.configuration&&i.configuration.map(_=>Object.assign(_,this.rbdConfigurationService.getOptionByName(_.name))),i)),o.headers=t.headers,o))))}copy(s,t){return this.http.post(`api/block/image/${s.toStringEncoded()}/copy`,t,{observe:"response"})}flatten(s){return this.http.post(`api/block/image/${s.toStringEncoded()}/flatten`,null,{observe:"response"})}defaultFeatures(){return this.http.get("api/block/image/default_features")}cloneFormatVersion(){return this.http.get("api/block/image/clone_format_version")}createSnapshot(s,t){const o={snapshot_name:t};return this.http.post(`api/block/image/${s.toStringEncoded()}/snap`,o,{observe:"response"})}renameSnapshot(s,t,o){const i={new_snap_name:o};return this.http.put(`api/block/image/${s.toStringEncoded()}/snap/${t}`,i,{observe:"response"})}protectSnapshot(s,t,o){const i={is_protected:o};return this.http.put(`api/block/image/${s.toStringEncoded()}/snap/${t}`,i,{observe:"response"})}rollbackSnapshot(s,t){return this.http.post(`api/block/image/${s.toStringEncoded()}/snap/${t}/rollback`,null,{observe:"response"})}cloneSnapshot(s,t,o){return this.http.post(`api/block/image/${s.toStringEncoded()}/snap/${t}/clone`,o,{observe:"response"})}deleteSnapshot(s,t){return this.http.delete(`api/block/image/${s.toStringEncoded()}/snap/${t}`,{observe:"response"})}listTrash(){return this.http.get("api/block/image/trash/")}createNamespace(s,t){return this.http.post(`api/block/pool/${s}/namespace`,{namespace:t},{observe:"response"})}listNamespaces(s){return this.http.get(`api/block/pool/${s}/namespace/`)}deleteNamespace(s,t){return this.http.delete(`api/block/pool/${s}/namespace/${t}`,{observe:"response"})}moveTrash(s,t){return this.http.post(`api/block/image/${s.toStringEncoded()}/move_trash`,{delay:t},{observe:"response"})}purgeTrash(s){return this.http.post(`api/block/image/trash/purge/?pool_name=${s}`,null,{observe:"response"})}restoreTrash(s,t){return this.http.post(`api/block/image/trash/${s.toStringEncoded()}/restore`,{new_image_name:t},{observe:"response"})}removeTrash(s,t=!1){return this.http.delete(`api/block/image/trash/${s.toStringEncoded()}/?force=${t}`,{observe:"response"})}};q.\u0275fac=function(s){return new(s||q)(e.LFG(ie.eN),e.LFG(he.n))},q.\u0275prov=e.Yz7({token:q,factory:q.\u0275fac,providedIn:"root"}),(0,D.gn)([(0,D.fM)(1,V.G),(0,D.w6)("design:type",Function),(0,D.w6)("design:paramtypes",[L.N,String]),(0,D.w6)("design:returntype",void 0)],q.prototype,"createSnapshot",null),(0,D.gn)([(0,D.fM)(2,V.G),(0,D.w6)("design:type",Function),(0,D.w6)("design:paramtypes",[L.N,String,String]),(0,D.w6)("design:returntype",void 0)],q.prototype,"renameSnapshot",null),(0,D.gn)([(0,D.fM)(2,V.G),(0,D.w6)("design:type",Function),(0,D.w6)("design:paramtypes",[L.N,String,Boolean]),(0,D.w6)("design:returntype",void 0)],q.prototype,"protectSnapshot",null),(0,D.gn)([(0,D.fM)(1,V.G),(0,D.w6)("design:type",Function),(0,D.w6)("design:paramtypes",[L.N,String]),(0,D.w6)("design:returntype",void 0)],q.prototype,"restoreTrash",null),q=(0,D.gn)([V.o,(0,D.w6)("design:paramtypes",[ie.eN,he.n])],q);var F=p(7022),y=p(14745),T=p(65862),H=p(93614),x=p(95463),z=p(77205),A=p(86919),R=p(76111),u=p(32337),C=p(60312),h=p(41582),O=p(56310),$=p(87925),k=p(94276),j=p(30839);function to(n,s){if(1&n&&(e.TgZ(0,"option",6),e._uU(1),e.qZA()),2&n){const t=s.$implicit;e.Q6J("ngValue",t),e.xp6(1),e.Oqu(t)}}function oo(n,s){if(1&n&&(e.TgZ(0,"select",5),e._UZ(1,"option",6),e.YNc(2,to,2,2,"option",7),e.qZA()),2&n){const t=e.oxw();e.s9C("id",t.setting),e.s9C("name",t.setting),e.Q6J("formControlName",t.setting),e.xp6(1),e.Q6J("ngValue",null),e.xp6(1),e.Q6J("ngForOf",t.limits.values)}}function no(n,s){if(1&n&&e._UZ(0,"input",10),2&n){const t=e.oxw(2);e.Q6J("formControlName",t.setting)}}function io(n,s){if(1&n&&e._UZ(0,"input",11),2&n){const t=e.oxw(2);e.Q6J("formControlName",t.setting)}}function so(n,s){if(1&n&&(e.ynx(0),e._UZ(1,"br"),e.TgZ(2,"div",12),e._UZ(3,"input",13),e.TgZ(4,"label",14),e._uU(5,"Yes"),e.qZA(),e.qZA(),e.TgZ(6,"div",12),e._UZ(7,"input",13),e.TgZ(8,"label",14),e._uU(9,"No"),e.qZA(),e.qZA(),e.BQk()),2&n){const t=e.oxw(2);e.xp6(3),e.Q6J("id",t.setting+"True")("value",!0)("formControlName",t.setting),e.xp6(1),e.Q6J("for",t.setting+"True"),e.xp6(3),e.Q6J("id",t.setting+"False")("value",!1)("formControlName",t.setting),e.xp6(1),e.Q6J("for",t.setting+"False")}}function _o(n,s){if(1&n&&(e.TgZ(0,"span"),e.YNc(1,no,1,1,"input",8),e.YNc(2,io,1,1,"input",9),e.YNc(3,so,10,8,"ng-container",3),e.qZA()),2&n){const t=e.oxw();e.xp6(1),e.Q6J("ngIf","int"===t.limits.type),e.xp6(1),e.Q6J("ngIf","str"===t.limits.type),e.xp6(1),e.Q6J("ngIf","bool"===t.limits.type)}}function ao(n,s){if(1&n&&(e.TgZ(0,"span",15),e.ynx(1),e.SDv(2,16),e.BQk(),e.qZA()),2&n){const t=e.oxw();e.xp6(2),e.pQV(t.limits.min),e.QtT(2)}}function ro(n,s){if(1&n&&(e.TgZ(0,"span",15),e.ynx(1),e.SDv(2,17),e.BQk(),e.qZA()),2&n){const t=e.oxw();e.xp6(2),e.pQV(t.limits.max),e.QtT(2)}}let dt=(()=>{class n{ngOnInit(){const t=[];"min"in this.limits&&t.push(a.kI.min(this.limits.min)),"max"in this.limits&&t.push(a.kI.max(this.limits.max)),this.settingsForm.get(this.setting).setValidators(t)}}return n.\u0275fac=function(t){return new(t||n)},n.\u0275cmp=e.Xpm({type:n,selectors:[["cd-iscsi-setting"]],inputs:{settingsForm:"settingsForm",formDir:"formDir",setting:"setting",limits:"limits"},decls:7,vars:7,consts:function(){let s,t;return s="Must be greater than or equal to " + "\ufffd0\ufffd" + ".",t="Must be less than or equal to " + "\ufffd0\ufffd" + ".",[[1,"form-group",3,"formGroup"],[1,"col-form-label",3,"for"],["class","form-control",3,"id","name","formControlName",4,"ngIf"],[4,"ngIf"],["class","invalid-feedback",4,"ngIf"],[1,"form-control",3,"id","name","formControlName"],[3,"ngValue"],[3,"ngValue",4,"ngFor","ngForOf"],["type","number","class","form-control",3,"formControlName",4,"ngIf"],["type","text","class","form-control",3,"formControlName",4,"ngIf"],["type","number",1,"form-control",3,"formControlName"],["type","text",1,"form-control",3,"formControlName"],[1,"custom-control","custom-radio","custom-control-inline"],["type","radio",1,"custom-control-input",3,"id","value","formControlName"],[1,"custom-control-label",3,"for"],[1,"invalid-feedback"],s,t]},template:function(t,o){1&t&&(e.TgZ(0,"div",0),e.TgZ(1,"label",1),e._uU(2),e.qZA(),e.YNc(3,oo,3,5,"select",2),e.YNc(4,_o,4,3,"span",3),e.YNc(5,ao,3,1,"span",4),e.YNc(6,ro,3,1,"span",4),e.qZA()),2&t&&(e.Q6J("formGroup",o.settingsForm),e.xp6(1),e.s9C("for",o.setting),e.xp6(1),e.Oqu(o.setting),e.xp6(1),e.Q6J("ngIf","enum"===o.limits.type),e.xp6(1),e.Q6J("ngIf","enum"!==o.limits.type),e.xp6(1),e.Q6J("ngIf",o.settingsForm.showError(o.setting,o.formDir,"min")),e.xp6(1),e.Q6J("ngIf",o.settingsForm.showError(o.setting,o.formDir,"max")))},directives:[O.P,a.JL,a.sg,h.V,l.O5,$.o,a.EJ,k.b,a.JJ,a.u,a.YN,a.Kr,l.sg,a.wV,a.Fj,a._],styles:[""]}),n})();var Je=p(88820);function lo(n,s){1&n&&(e.TgZ(0,"span",29),e.SDv(1,30),e.qZA())}function co(n,s){if(1&n&&(e.TgZ(0,"span"),e.TgZ(1,"legend",10),e.SDv(2,21),e.qZA(),e.TgZ(3,"div",12),e.TgZ(4,"div",13),e.TgZ(5,"label",22),e.SDv(6,23),e.qZA(),e._UZ(7,"input",24),e.YNc(8,lo,2,0,"span",25),e.qZA(),e.qZA(),e.TgZ(9,"div",12),e.TgZ(10,"div",13),e.TgZ(11,"label",26),e.SDv(12,27),e.qZA(),e._UZ(13,"input",28),e.qZA(),e.qZA(),e.qZA()),2&n){const t=e.oxw(),o=e.MAs(9);e.xp6(8),e.Q6J("ngIf",t.settingsForm.showError("lun",o,"required"))}}function po(n,s){if(1&n&&(e.TgZ(0,"option",31),e._uU(1),e.ALo(2,"iscsiBackstore"),e.qZA()),2&n){const t=s.$implicit;e.Q6J("value",t),e.xp6(1),e.Oqu(e.lcZ(2,2,t))}}function go(n,s){if(1&n&&(e.TgZ(0,"div",12),e.TgZ(1,"div",13),e._UZ(2,"cd-iscsi-setting",33),e.qZA(),e.qZA()),2&n){const t=s.$implicit,o=e.oxw(2).$implicit,i=e.oxw(),_=e.MAs(9);e.xp6(2),e.Q6J("settingsForm",i.settingsForm)("formDir",_)("setting",t.key)("limits",i.getDiskControlLimits(o,t.key))}}function uo(n,s){if(1&n&&(e.ynx(0),e.YNc(1,go,3,4,"div",32),e.ALo(2,"keyvalue"),e.BQk()),2&n){const t=e.oxw().$implicit,o=e.oxw();e.xp6(1),e.Q6J("ngForOf",e.lcZ(2,1,o.disk_default_controls[t]))}}function mo(n,s){if(1&n&&(e.ynx(0),e.YNc(1,uo,3,3,"ng-container",9),e.BQk()),2&n){const t=s.$implicit,o=e.oxw();e.xp6(1),e.Q6J("ngIf",o.settingsForm.value.backstore===t)}}let To=(()=>{class n{constructor(t,o,i){this.activeModal=t,this.iscsiService=o,this.actionLabels=i}ngOnInit(){const t={backstore:new a.NI(this.imagesSettings[this.image].backstore),lun:new a.NI(this.imagesSettings[this.image].lun),wwn:new a.NI(this.imagesSettings[this.image].wwn)};S().forEach(this.backstores,o=>{const i=this.imagesSettings[this.image][o]||{};S().forIn(this.disk_default_controls[o],(_,r)=>{t[r]=new a.NI(i[r])})}),this.settingsForm=new x.d(t)}getDiskControlLimits(t,o){return this.disk_controls_limits?this.disk_controls_limits[t][o]:{type:"int"}}save(){const t=this.settingsForm.controls.backstore.value,o=this.settingsForm.controls.lun.value,i=this.settingsForm.controls.wwn.value,_={};S().forIn(this.settingsForm.controls,(r,c)=>{""!==r.value&&null!==r.value&&c in this.disk_default_controls[this.settingsForm.value.backstore]&&(_[c]=r.value,S().forEach(this.backstores,d=>{d!==t&&c in(this.imagesSettings[this.image][d]||{})&&(this.imagesSettings[this.image][d][c]=r.value)}))}),this.imagesSettings[this.image].backstore=t,this.imagesSettings[this.image].lun=o,this.imagesSettings[this.image].wwn=i,this.imagesSettings[this.image][t]=_,this.imagesSettings=Object.assign({},this.imagesSettings),this.control.updateValueAndValidity({emitEvent:!1}),this.activeModal.close()}}return n.\u0275fac=function(t){return new(t||n)(e.Y36(N.Kz),e.Y36(X),e.Y36(v.p4))},n.\u0275cmp=e.Xpm({type:n,selectors:[["cd-iscsi-target-image-settings-modal"]],decls:25,vars:8,consts:function(){let s,t,o,i,_,r,c,d;return s="Configure",t="Changing these parameters from their default values is usually not necessary.",o="Settings",i="Backstore",_="Identifier",r="lun",c="wwn",d="This field is required.",[[3,"modalRef"],[1,"modal-title"],s,[1,"modal-content"],["name","settingsForm","novalidate","",1,"form",3,"formGroup"],["formDir","ngForm"],[1,"modal-body"],[1,"alert-warning"],t,[4,"ngIf"],[1,"cd-header"],o,[1,"form-group","row"],[1,"col-sm-12"],[1,"col-form-label"],i,["id","backstore","name","backstore","formControlName","backstore",1,"form-control"],[3,"value",4,"ngFor","ngForOf"],[4,"ngFor","ngForOf"],[1,"modal-footer"],[3,"form","submitText","submitActionEvent"],_,["for","lun",1,"col-form-label","required"],r,["type","number","id","lun","name","lun","formControlName","lun",1,"form-control"],["class","invalid-feedback",4,"ngIf"],["for","wwn",1,"col-form-label"],c,["type","text","id","wwn","name","wwn","formControlName","wwn",1,"form-control"],[1,"invalid-feedback"],d,[3,"value"],["class","form-group row",4,"ngFor","ngForOf"],[3,"settingsForm","formDir","setting","limits"]]},template:function(t,o){1&t&&(e.TgZ(0,"cd-modal",0),e.ynx(1,1),e.ynx(2),e.SDv(3,2),e.BQk(),e._uU(4,"\xa0 "),e.TgZ(5,"small"),e._uU(6),e.qZA(),e.BQk(),e.ynx(7,3),e.TgZ(8,"form",4,5),e.TgZ(10,"div",6),e.TgZ(11,"p",7),e.SDv(12,8),e.qZA(),e.YNc(13,co,14,1,"span",9),e.TgZ(14,"legend",10),e.SDv(15,11),e.qZA(),e.TgZ(16,"div",12),e.TgZ(17,"div",13),e.TgZ(18,"label",14),e.SDv(19,15),e.qZA(),e.TgZ(20,"select",16),e.YNc(21,po,3,4,"option",17),e.qZA(),e.qZA(),e.qZA(),e.YNc(22,mo,2,1,"ng-container",18),e.qZA(),e.TgZ(23,"div",19),e.TgZ(24,"cd-form-button-panel",20),e.NdJ("submitActionEvent",function(){return o.save()}),e.qZA(),e.qZA(),e.qZA(),e.BQk(),e.qZA()),2&t&&(e.Q6J("modalRef",o.activeModal),e.xp6(6),e.Oqu(o.image),e.xp6(2),e.Q6J("formGroup",o.settingsForm),e.xp6(5),e.Q6J("ngIf",o.api_version>=1),e.xp6(8),e.Q6J("ngForOf",o.backstores),e.xp6(1),e.Q6J("ngForOf",o.backstores),e.xp6(2),e.Q6J("form",o.settingsForm)("submitText",o.actionLabels.UPDATE))},directives:[C.z,a._Y,a.JL,a.sg,h.V,l.O5,O.P,$.o,a.EJ,k.b,a.JJ,a.u,l.sg,j.p,a.wV,a.Fj,a.YN,a.Kr,dt],pipes:[Je.V,l.Nd],styles:[""]}),n})();function fo(n,s){if(1&n&&(e.TgZ(0,"div",12),e.TgZ(1,"div",13),e._UZ(2,"cd-iscsi-setting",14),e.qZA(),e.qZA()),2&n){const t=s.$implicit,o=e.oxw(),i=e.MAs(5);e.xp6(2),e.Q6J("settingsForm",o.settingsForm)("formDir",i)("setting",t.key)("limits",o.getTargetControlLimits(t.key))}}let Co=(()=>{class n{constructor(t,o,i){this.activeModal=t,this.iscsiService=o,this.actionLabels=i}ngOnInit(){const t={};S().forIn(this.target_default_controls,(o,i)=>{t[i]=new a.NI(this.target_controls.value[i])}),this.settingsForm=new x.d(t)}save(){const t={};S().forIn(this.settingsForm.controls,(o,i)=>{""===o.value||null===o.value||(t[i]=o.value)}),this.target_controls.setValue(t),this.activeModal.close()}getTargetControlLimits(t){return this.target_controls_limits?this.target_controls_limits[t]:["Yes","No"].includes(this.target_default_controls[t])?{type:"bool"}:{type:"int"}}}return n.\u0275fac=function(t){return new(t||n)(e.Y36(N.Kz),e.Y36(X),e.Y36(v.p4))},n.\u0275cmp=e.Xpm({type:n,selectors:[["cd-iscsi-target-iqn-settings-modal"]],decls:13,vars:7,consts:function(){let s,t;return s="Advanced Settings",t="Changing these parameters from their default values is usually not necessary.",[[3,"modalRef"],[1,"modal-title"],s,[1,"modal-content"],["name","settingsForm","novalidate","",3,"formGroup"],["formDir","ngForm"],[1,"modal-body"],[1,"alert-warning"],t,["class","form-group row",4,"ngFor","ngForOf"],[1,"modal-footer"],[3,"form","submitText","submitActionEvent"],[1,"form-group","row"],[1,"col-sm-12"],[3,"settingsForm","formDir","setting","limits"]]},template:function(t,o){1&t&&(e.TgZ(0,"cd-modal",0),e.ynx(1,1),e.SDv(2,2),e.BQk(),e.ynx(3,3),e.TgZ(4,"form",4,5),e.TgZ(6,"div",6),e.TgZ(7,"p",7),e.SDv(8,8),e.qZA(),e.YNc(9,fo,3,4,"div",9),e.ALo(10,"keyvalue"),e.qZA(),e.TgZ(11,"div",10),e.TgZ(12,"cd-form-button-panel",11),e.NdJ("submitActionEvent",function(){return o.save()}),e.qZA(),e.qZA(),e.qZA(),e.BQk(),e.qZA()),2&t&&(e.Q6J("modalRef",o.activeModal),e.xp6(4),e.Q6J("formGroup",o.settingsForm),e.xp6(5),e.Q6J("ngForOf",e.lcZ(10,5,o.settingsForm.controls)),e.xp6(3),e.Q6J("form",o.settingsForm)("submitText",o.actionLabels.UPDATE))},directives:[C.z,a._Y,a.JL,a.sg,h.V,l.sg,j.p,O.P,dt],pipes:[l.Nd],styles:[""]}),n})();var de=p(63285),pt=p(63622);let So=(()=>{class n{constructor(t){this.ngControl=t}onInput(t){this.setValue(t)}setValue(t){t=S().isString(t)?t.trim():t,this.ngControl.control.setValue(t)}}return n.\u0275fac=function(t){return new(t||n)(e.Y36(a.a5))},n.\u0275dir=e.lG2({type:n,selectors:[["","cdTrim",""]],hostBindings:function(t,o){1&t&&e.NdJ("input",function(_){return o.onInput(_.target.value)})}}),n})();var Eo=p(39092),gt=p(4416),Ye=p(58039),et=p(10545);function Ro(n,s){1&n&&(e.TgZ(0,"span",41),e.SDv(1,42),e.qZA())}function Mo(n,s){1&n&&(e.TgZ(0,"span",41),e.SDv(1,43),e.qZA())}function Oo(n,s){1&n&&(e.TgZ(0,"span",41),e.ynx(1),e.SDv(2,44),e.BQk(),e._UZ(3,"br"),e.ynx(4),e.SDv(5,45),e.BQk(),e._UZ(6,"br"),e.TgZ(7,"a",46),e.SDv(8,47),e.qZA(),e.qZA())}function Ao(n,s){1&n&&(e.TgZ(0,"span",48),e.SDv(1,49),e.qZA())}const J=function(n){return[n]};function ho(n,s){if(1&n){const t=e.EpF();e.ynx(0),e.TgZ(1,"div",50),e._UZ(2,"input",51),e.TgZ(3,"span",14),e.TgZ(4,"button",52),e.NdJ("click",function(){const i=e.CHM(t),_=i.index,r=i.$implicit;return e.oxw(2).removePortal(_,r)}),e._UZ(5,"i",16),e.qZA(),e.qZA(),e.qZA(),e.BQk()}if(2&n){const t=s.$implicit,o=e.oxw(2);e.xp6(2),e.Q6J("value",t),e.xp6(3),e.Q6J("ngClass",e.VKq(2,J,o.icons.destroy))}}function Po(n,s){if(1&n&&(e.TgZ(0,"span",41),e.SDv(1,53),e.qZA()),2&n){const t=e.oxw(2);e.xp6(1),e.pQV(t.minimum_gateways),e.QtT(1)}}function Io(n,s){if(1&n&&(e.TgZ(0,"div",56),e._uU(1),e.qZA()),2&n){const t=e.oxw().$implicit,o=e.oxw(2);e.xp6(1),e.hij("lun: ",o.imagesSettings[t].lun,"")}}function bo(n,s){if(1&n&&(e.ynx(0),e.SDv(1,57),e.ALo(2,"iscsiBackstore"),e.BQk()),2&n){const t=e.oxw().$implicit,o=e.oxw(2);e.xp6(2),e.pQV(e.lcZ(2,1,o.imagesSettings[t].backstore)),e.QtT(1)}}function No(n,s){1&n&&(e.ynx(0),e.SDv(1,58),e.BQk())}function Fo(n,s){if(1&n){const t=e.EpF();e.ynx(0),e.TgZ(1,"div",50),e._UZ(2,"input",51),e.TgZ(3,"span",14),e.YNc(4,Io,2,1,"div",54),e.TgZ(5,"button",52),e.NdJ("click",function(){const _=e.CHM(t).$implicit;return e.oxw(2).imageSettingsModal(_)}),e._UZ(6,"i",16),e.qZA(),e.TgZ(7,"button",52),e.NdJ("click",function(){const i=e.CHM(t),_=i.index,r=i.$implicit;return e.oxw(2).removeImage(_,r)}),e._UZ(8,"i",16),e.qZA(),e.qZA(),e.qZA(),e.TgZ(9,"span",48),e.YNc(10,bo,3,3,"ng-container",55),e.YNc(11,No,2,0,"ng-container",55),e.qZA(),e.BQk()}if(2&n){const t=s.$implicit,o=e.oxw(2);e.xp6(2),e.Q6J("value",t),e.xp6(2),e.Q6J("ngIf",o.api_version>=1),e.xp6(2),e.Q6J("ngClass",e.VKq(6,J,o.icons.deepCheck)),e.xp6(2),e.Q6J("ngClass",e.VKq(8,J,o.icons.destroy)),e.xp6(2),e.Q6J("ngIf",o.backstores.length>1),e.xp6(1),e.Q6J("ngIf",o.hasAdvancedSettings(o.imagesSettings[t][o.imagesSettings[t].backstore]))}}function Do(n,s){1&n&&(e.TgZ(0,"span",41),e.SDv(1,59),e.qZA())}function vo(n,s){1&n&&(e.TgZ(0,"span",41),e.SDv(1,60),e.qZA())}function Lo(n,s){1&n&&(e.TgZ(0,"span",41),e.SDv(1,78),e.qZA())}function $o(n,s){1&n&&(e.TgZ(0,"span",41),e.SDv(1,79),e.qZA())}function Zo(n,s){1&n&&(e.TgZ(0,"span",41),e.SDv(1,80),e.qZA())}function Bo(n,s){1&n&&(e.TgZ(0,"span",41),e.SDv(1,81),e.qZA())}function Go(n,s){1&n&&(e.TgZ(0,"span",41),e.SDv(1,82),e.qZA())}function yo(n,s){1&n&&(e.TgZ(0,"span",41),e.SDv(1,83),e.qZA())}function xo(n,s){1&n&&(e.TgZ(0,"span",41),e.SDv(1,84),e.qZA())}function wo(n,s){1&n&&(e.TgZ(0,"span",41),e.SDv(1,85),e.qZA())}function qo(n,s){if(1&n&&(e.TgZ(0,"div",61),e.TgZ(1,"div",8),e.TgZ(2,"label",62),e.ynx(3),e.SDv(4,63),e.BQk(),e.qZA(),e.TgZ(5,"div",11),e._UZ(6,"input",64),e.YNc(7,Lo,2,0,"span",17),e.YNc(8,$o,2,0,"span",17),e.qZA(),e.qZA(),e.TgZ(9,"div",8),e.TgZ(10,"label",65),e.ynx(11),e.SDv(12,66),e.BQk(),e.qZA(),e.TgZ(13,"div",11),e.TgZ(14,"div",12),e._UZ(15,"input",67),e.TgZ(16,"span",14),e._UZ(17,"button",68),e._UZ(18,"cd-copy-2-clipboard-button",69),e.qZA(),e.qZA(),e.YNc(19,Zo,2,0,"span",17),e.YNc(20,Bo,2,0,"span",17),e.qZA(),e.qZA(),e.TgZ(21,"div",8),e.TgZ(22,"label",70),e.ynx(23),e.SDv(24,71),e.BQk(),e.qZA(),e.TgZ(25,"div",11),e._UZ(26,"input",72),e.YNc(27,Go,2,0,"span",17),e.YNc(28,yo,2,0,"span",17),e.qZA(),e.qZA(),e.TgZ(29,"div",8),e.TgZ(30,"label",73),e.ynx(31),e.SDv(32,74),e.BQk(),e.qZA(),e.TgZ(33,"div",11),e.TgZ(34,"div",12),e._UZ(35,"input",75),e.TgZ(36,"span",14),e._UZ(37,"button",76),e._UZ(38,"cd-copy-2-clipboard-button",77),e.qZA(),e.qZA(),e.YNc(39,xo,2,0,"span",17),e.YNc(40,wo,2,0,"span",17),e.qZA(),e.qZA(),e.qZA()),2&n){e.oxw();const t=e.MAs(2),o=e.oxw();e.xp6(7),e.Q6J("ngIf",o.targetForm.showError("user",t,"required")),e.xp6(1),e.Q6J("ngIf",o.targetForm.showError("user",t,"pattern")),e.xp6(11),e.Q6J("ngIf",o.targetForm.showError("password",t,"required")),e.xp6(1),e.Q6J("ngIf",o.targetForm.showError("password",t,"pattern")),e.xp6(7),e.Q6J("ngIf",o.targetForm.showError("mutual_user",t,"required")),e.xp6(1),e.Q6J("ngIf",o.targetForm.showError("mutual_user",t,"pattern")),e.xp6(11),e.Q6J("ngIf",o.targetForm.showError("mutual_password",t,"required")),e.xp6(1),e.Q6J("ngIf",o.targetForm.showError("mutual_password",t,"pattern"))}}function Ho(n,s){1&n&&(e.TgZ(0,"span",41),e.SDv(1,115),e.qZA())}function ko(n,s){1&n&&(e.TgZ(0,"span",41),e.SDv(1,116),e.qZA())}function Ko(n,s){1&n&&(e.TgZ(0,"span",41),e.SDv(1,117),e.qZA())}function Xo(n,s){1&n&&(e.TgZ(0,"span",41),e.SDv(1,118),e.qZA())}function Qo(n,s){1&n&&(e.TgZ(0,"span",41),e.SDv(1,119),e.qZA())}function zo(n,s){1&n&&(e.TgZ(0,"span",41),e.SDv(1,120),e.qZA())}function Jo(n,s){1&n&&(e.TgZ(0,"span",41),e.SDv(1,121),e.qZA())}function Yo(n,s){1&n&&(e.TgZ(0,"span",41),e.SDv(1,122),e.qZA())}function Vo(n,s){1&n&&(e.TgZ(0,"span",41),e.SDv(1,123),e.qZA())}function Uo(n,s){1&n&&(e.TgZ(0,"span",41),e.SDv(1,124),e.qZA())}function jo(n,s){1&n&&(e.TgZ(0,"span",41),e.SDv(1,125),e.qZA())}function Wo(n,s){if(1&n){const t=e.EpF();e.ynx(0),e.TgZ(1,"div",50),e._UZ(2,"input",51),e.TgZ(3,"span",14),e.TgZ(4,"button",52),e.NdJ("click",function(){const i=e.CHM(t),_=i.index,r=i.$implicit,c=e.oxw(),d=c.$implicit,g=c.index;return e.oxw(3).removeInitiatorImage(d,_,g,r)}),e._UZ(5,"i",16),e.qZA(),e.qZA(),e.qZA(),e.BQk()}if(2&n){const t=s.$implicit,o=e.oxw(4);e.xp6(2),e.Q6J("value",t),e.xp6(3),e.Q6J("ngClass",e.VKq(2,J,o.icons.destroy))}}function en(n,s){1&n&&(e.TgZ(0,"span"),e.SDv(1,126),e.qZA())}function tn(n,s){if(1&n&&(e.TgZ(0,"div",22),e.TgZ(1,"div",23),e.TgZ(2,"cd-select",127),e._UZ(3,"i",25),e.ynx(4),e.SDv(5,128),e.BQk(),e.qZA(),e.qZA(),e.qZA()),2&n){const t=e.oxw(),o=t.$implicit,i=t.index,_=e.oxw(3);e.xp6(2),e.Q6J("data",o.getValue("luns"))("options",_.imagesInitiatorSelections[i])("messages",_.messages.initiatorImage),e.xp6(1),e.Q6J("ngClass",e.VKq(4,J,_.icons.add))}}function on(n,s){if(1&n){const t=e.EpF();e.TgZ(0,"div",92),e.TgZ(1,"div",5),e.ynx(2),e.SDv(3,93),e.BQk(),e._uU(4),e.TgZ(5,"button",94),e.NdJ("click",function(){const _=e.CHM(t).index;return e.oxw(3).removeInitiator(_)}),e._UZ(6,"i",25),e.qZA(),e.qZA(),e.TgZ(7,"div",7),e.TgZ(8,"div",8),e.TgZ(9,"label",95),e.SDv(10,96),e.qZA(),e.TgZ(11,"div",11),e.TgZ(12,"input",97),e.NdJ("blur",function(){return e.CHM(t),e.oxw(3).updatedInitiatorSelector()}),e.qZA(),e.YNc(13,Ho,2,0,"span",17),e.YNc(14,ko,2,0,"span",17),e.YNc(15,Ko,2,0,"span",17),e.qZA(),e.qZA(),e.ynx(16,61),e.TgZ(17,"div",8),e.TgZ(18,"label",98),e.SDv(19,99),e.qZA(),e.TgZ(20,"div",11),e._UZ(21,"input",100),e.YNc(22,Xo,2,0,"span",17),e.YNc(23,Qo,2,0,"span",17),e.qZA(),e.qZA(),e.TgZ(24,"div",8),e.TgZ(25,"label",101),e.SDv(26,102),e.qZA(),e.TgZ(27,"div",11),e.TgZ(28,"div",12),e._UZ(29,"input",103),e.TgZ(30,"span",14),e._UZ(31,"button",104),e._UZ(32,"cd-copy-2-clipboard-button",105),e.qZA(),e.qZA(),e.YNc(33,zo,2,0,"span",17),e.YNc(34,Jo,2,0,"span",17),e.qZA(),e.qZA(),e.TgZ(35,"div",8),e.TgZ(36,"label",106),e.ynx(37),e.SDv(38,107),e.BQk(),e.qZA(),e.TgZ(39,"div",11),e._UZ(40,"input",108),e.YNc(41,Yo,2,0,"span",17),e.YNc(42,Vo,2,0,"span",17),e.qZA(),e.qZA(),e.TgZ(43,"div",8),e.TgZ(44,"label",109),e.SDv(45,110),e.qZA(),e.TgZ(46,"div",11),e.TgZ(47,"div",12),e._UZ(48,"input",111),e.TgZ(49,"span",14),e._UZ(50,"button",104),e._UZ(51,"cd-copy-2-clipboard-button",105),e.qZA(),e.qZA(),e.YNc(52,Uo,2,0,"span",17),e.YNc(53,jo,2,0,"span",17),e.qZA(),e.qZA(),e.BQk(),e.TgZ(54,"div",8),e.TgZ(55,"label",112),e.SDv(56,113),e.qZA(),e.TgZ(57,"div",11),e.YNc(58,Wo,6,4,"ng-container",21),e.YNc(59,en,2,0,"span",55),e.YNc(60,tn,6,6,"div",114),e.qZA(),e.qZA(),e.qZA(),e.qZA()}if(2&n){const t=s.$implicit,o=s.index;e.oxw(2);const i=e.MAs(2),_=e.oxw();e.Q6J("formGroup",t),e.xp6(4),e.hij(": ",t.getValue("client_iqn")," "),e.xp6(2),e.Q6J("ngClass",e.VKq(25,J,_.icons.destroy)),e.xp6(7),e.Q6J("ngIf",t.showError("client_iqn",i,"notUnique")),e.xp6(1),e.Q6J("ngIf",t.showError("client_iqn",i,"required")),e.xp6(1),e.Q6J("ngIf",t.showError("client_iqn",i,"pattern")),e.xp6(6),e.Q6J("id","user"+o),e.xp6(1),e.Q6J("ngIf",t.showError("user",i,"required")),e.xp6(1),e.Q6J("ngIf",t.showError("user",i,"pattern")),e.xp6(6),e.Q6J("id","password"+o),e.xp6(2),e.Q6J("cdPasswordButton","password"+o),e.xp6(1),e.Q6J("source","password"+o),e.xp6(1),e.Q6J("ngIf",t.showError("password",i,"required")),e.xp6(1),e.Q6J("ngIf",t.showError("password",i,"pattern")),e.xp6(6),e.Q6J("id","mutual_user"+o),e.xp6(1),e.Q6J("ngIf",t.showError("mutual_user",i,"required")),e.xp6(1),e.Q6J("ngIf",t.showError("mutual_user",i,"pattern")),e.xp6(6),e.Q6J("id","mutual_password"+o),e.xp6(2),e.Q6J("cdPasswordButton","mutual_password"+o),e.xp6(1),e.Q6J("source","mutual_password"+o),e.xp6(1),e.Q6J("ngIf",t.showError("mutual_password",i,"required")),e.xp6(1),e.Q6J("ngIf",t.showError("mutual_password",i,"pattern")),e.xp6(5),e.Q6J("ngForOf",t.getValue("luns")),e.xp6(1),e.Q6J("ngIf",t.getValue("cdIsInGroup")),e.xp6(1),e.Q6J("ngIf",!t.getValue("cdIsInGroup"))}}function nn(n,s){1&n&&(e.TgZ(0,"span",48),e.SDv(1,129),e.qZA())}function sn(n,s){if(1&n){const t=e.EpF();e.TgZ(0,"div",8),e.TgZ(1,"label",86),e.SDv(2,87),e.qZA(),e.TgZ(3,"div",88),e.YNc(4,on,61,27,"div",89),e.TgZ(5,"div",22),e.TgZ(6,"div",23),e.YNc(7,nn,2,0,"span",18),e.TgZ(8,"button",90),e.NdJ("click",function(){return e.CHM(t),e.oxw(2).addInitiator(),!1}),e._UZ(9,"i",25),e.ynx(10),e.SDv(11,91),e.BQk(),e.qZA(),e.qZA(),e.qZA(),e._UZ(12,"hr"),e.qZA(),e.qZA()}if(2&n){const t=e.oxw(2);e.xp6(4),e.Q6J("ngForOf",t.initiators.controls),e.xp6(3),e.Q6J("ngIf",0===t.initiators.controls.length),e.xp6(2),e.Q6J("ngClass",e.VKq(3,J,t.icons.add))}}function _n(n,s){if(1&n){const t=e.EpF();e.ynx(0),e.TgZ(1,"div",50),e._UZ(2,"input",51),e.TgZ(3,"span",14),e.TgZ(4,"button",52),e.NdJ("click",function(){const _=e.CHM(t).index,r=e.oxw(),c=r.$implicit,d=r.index;return e.oxw(3).removeGroupInitiator(c,_,d)}),e._UZ(5,"i",16),e.qZA(),e.qZA(),e.qZA(),e.BQk()}if(2&n){const t=s.$implicit,o=e.oxw(4);e.xp6(2),e.Q6J("value",t),e.xp6(3),e.Q6J("ngClass",e.VKq(2,J,o.icons.destroy))}}function an(n,s){if(1&n){const t=e.EpF();e.ynx(0),e.TgZ(1,"div",50),e._UZ(2,"input",51),e.TgZ(3,"span",14),e.TgZ(4,"button",52),e.NdJ("click",function(){const _=e.CHM(t).index,r=e.oxw(),c=r.$implicit,d=r.index;return e.oxw(3).removeGroupDisk(c,_,d)}),e._UZ(5,"i",16),e.qZA(),e.qZA(),e.qZA(),e.BQk()}if(2&n){const t=s.$implicit,o=e.oxw(4);e.xp6(2),e.Q6J("value",t),e.xp6(3),e.Q6J("ngClass",e.VKq(2,J,o.icons.destroy))}}function rn(n,s){if(1&n){const t=e.EpF();e.TgZ(0,"div",92),e.TgZ(1,"div",5),e.ynx(2),e.SDv(3,133),e.BQk(),e._uU(4),e.TgZ(5,"button",94),e.NdJ("click",function(){const _=e.CHM(t).index;return e.oxw(3).removeGroup(_)}),e._UZ(6,"i",25),e.qZA(),e.qZA(),e.TgZ(7,"div",7),e.TgZ(8,"div",8),e.TgZ(9,"label",134),e.SDv(10,135),e.qZA(),e.TgZ(11,"div",11),e._UZ(12,"input",136),e.qZA(),e.qZA(),e.TgZ(13,"div",8),e.TgZ(14,"label",137),e.ynx(15),e.SDv(16,138),e.BQk(),e.qZA(),e.TgZ(17,"div",11),e.YNc(18,_n,6,4,"ng-container",21),e.TgZ(19,"div",22),e.TgZ(20,"div",23),e.TgZ(21,"cd-select",24),e.NdJ("selection",function(i){const r=e.CHM(t).index;return e.oxw(3).onGroupMemberSelection(i,r)}),e._UZ(22,"i",25),e.ynx(23),e.SDv(24,139),e.BQk(),e.qZA(),e.qZA(),e.qZA(),e._UZ(25,"hr"),e.qZA(),e.qZA(),e.TgZ(26,"div",8),e.TgZ(27,"label",28),e.ynx(28),e.SDv(29,140),e.BQk(),e.qZA(),e.TgZ(30,"div",11),e.YNc(31,an,6,4,"ng-container",21),e.TgZ(32,"div",22),e.TgZ(33,"div",23),e.TgZ(34,"cd-select",127),e._UZ(35,"i",25),e.ynx(36),e.SDv(37,141),e.BQk(),e.qZA(),e.qZA(),e.qZA(),e._UZ(38,"hr"),e.qZA(),e.qZA(),e.qZA(),e.qZA()}if(2&n){const t=s.$implicit,o=s.index,i=e.oxw(3);e.Q6J("formGroup",t),e.xp6(4),e.hij(": ",t.getValue("group_id")," "),e.xp6(2),e.Q6J("ngClass",e.VKq(13,J,i.icons.destroy)),e.xp6(12),e.Q6J("ngForOf",t.getValue("members")),e.xp6(3),e.Q6J("data",t.getValue("members"))("options",i.groupMembersSelections[o])("messages",i.messages.groupInitiator),e.xp6(1),e.Q6J("ngClass",e.VKq(15,J,i.icons.add)),e.xp6(9),e.Q6J("ngForOf",t.getValue("disks")),e.xp6(3),e.Q6J("data",t.getValue("disks"))("options",i.groupDiskSelections[o])("messages",i.messages.initiatorImage),e.xp6(1),e.Q6J("ngClass",e.VKq(17,J,i.icons.add))}}function ln(n,s){1&n&&(e.TgZ(0,"span",48),e.SDv(1,142),e.qZA())}function cn(n,s){if(1&n){const t=e.EpF();e.TgZ(0,"div",8),e.TgZ(1,"label",86),e.SDv(2,130),e.qZA(),e.TgZ(3,"div",131),e.YNc(4,rn,39,19,"div",89),e.TgZ(5,"div",22),e.TgZ(6,"div",23),e.YNc(7,ln,2,0,"span",18),e.TgZ(8,"button",90),e.NdJ("click",function(){return e.CHM(t),e.oxw(2).addGroup(),!1}),e._UZ(9,"i",25),e.ynx(10),e.SDv(11,132),e.BQk(),e.qZA(),e.qZA(),e.qZA(),e.qZA(),e.qZA()}if(2&n){const t=e.oxw(2);e.xp6(4),e.Q6J("ngForOf",t.groups.controls),e.xp6(3),e.Q6J("ngIf",0===t.groups.controls.length),e.xp6(2),e.Q6J("ngClass",e.VKq(3,J,t.icons.add))}}function dn(n,s){if(1&n){const t=e.EpF();e.TgZ(0,"div",1),e.TgZ(1,"form",2,3),e.TgZ(3,"div",4),e.TgZ(4,"div",5),e.SDv(5,6),e.ALo(6,"titlecase"),e.ALo(7,"upperFirst"),e.qZA(),e.TgZ(8,"div",7),e.TgZ(9,"div",8),e.TgZ(10,"label",9),e.SDv(11,10),e.qZA(),e.TgZ(12,"div",11),e.TgZ(13,"div",12),e._UZ(14,"input",13),e.TgZ(15,"span",14),e.TgZ(16,"button",15),e.NdJ("click",function(){return e.CHM(t),e.oxw().targetSettingsModal()}),e._UZ(17,"i",16),e.qZA(),e.qZA(),e.qZA(),e.YNc(18,Ro,2,0,"span",17),e.YNc(19,Mo,2,0,"span",17),e.YNc(20,Oo,9,0,"span",17),e.YNc(21,Ao,2,0,"span",18),e._UZ(22,"hr"),e.qZA(),e.qZA(),e.TgZ(23,"div",8),e.TgZ(24,"label",19),e.SDv(25,20),e.qZA(),e.TgZ(26,"div",11),e.YNc(27,ho,6,4,"ng-container",21),e.TgZ(28,"div",22),e.TgZ(29,"div",23),e.TgZ(30,"cd-select",24),e.NdJ("selection",function(i){return e.CHM(t),e.oxw().onPortalSelection(i)}),e._UZ(31,"i",25),e.ynx(32),e.SDv(33,26),e.BQk(),e.qZA(),e.qZA(),e.qZA(),e._UZ(34,"input",27),e.YNc(35,Po,2,1,"span",17),e._UZ(36,"hr"),e.qZA(),e.qZA(),e.TgZ(37,"div",8),e.TgZ(38,"label",28),e.SDv(39,29),e.qZA(),e.TgZ(40,"div",11),e.YNc(41,Fo,12,10,"ng-container",21),e._UZ(42,"input",30),e.YNc(43,Do,2,0,"span",17),e.YNc(44,vo,2,0,"span",17),e.TgZ(45,"div",22),e.TgZ(46,"div",23),e.TgZ(47,"cd-select",24),e.NdJ("selection",function(i){return e.CHM(t),e.oxw().onImageSelection(i)}),e._UZ(48,"i",25),e.ynx(49),e.SDv(50,31),e.BQk(),e.qZA(),e.qZA(),e.qZA(),e._UZ(51,"hr"),e.qZA(),e.qZA(),e.TgZ(52,"div",8),e.TgZ(53,"div",32),e.TgZ(54,"div",33),e._UZ(55,"input",34),e.TgZ(56,"label",35),e.SDv(57,36),e.qZA(),e.qZA(),e._UZ(58,"hr"),e.qZA(),e.qZA(),e.YNc(59,qo,41,8,"div",37),e.YNc(60,sn,13,5,"div",38),e.YNc(61,cn,12,5,"div",38),e.qZA(),e.TgZ(62,"div",39),e.TgZ(63,"cd-form-button-panel",40),e.NdJ("submitActionEvent",function(){return e.CHM(t),e.oxw().submit()}),e.ALo(64,"titlecase"),e.ALo(65,"upperFirst"),e.qZA(),e.qZA(),e.qZA(),e.qZA(),e.qZA()}if(2&n){const t=e.MAs(2),o=e.oxw();e.xp6(1),e.Q6J("formGroup",o.targetForm),e.xp6(6),e.pQV(e.lcZ(6,26,o.action))(e.lcZ(7,28,o.resource)),e.QtT(5),e.xp6(10),e.Q6J("ngClass",e.VKq(34,J,o.icons.deepCheck)),e.xp6(1),e.Q6J("ngIf",o.targetForm.showError("target_iqn",t,"required")),e.xp6(1),e.Q6J("ngIf",o.targetForm.showError("target_iqn",t,"pattern")),e.xp6(1),e.Q6J("ngIf",o.targetForm.showError("target_iqn",t,"iqn")),e.xp6(1),e.Q6J("ngIf",o.hasAdvancedSettings(o.targetForm.getValue("target_controls"))),e.xp6(6),e.Q6J("ngForOf",o.portals.value),e.xp6(3),e.Q6J("data",o.portals.value)("options",o.portalsSelections)("messages",o.messages.portals),e.xp6(1),e.Q6J("ngClass",e.VKq(36,J,o.icons.add)),e.xp6(4),e.Q6J("ngIf",o.targetForm.showError("portals",t,"minGateways")),e.xp6(6),e.Q6J("ngForOf",o.targetForm.getValue("disks")),e.xp6(2),e.Q6J("ngIf",o.targetForm.showError("disks",t,"dupLunId")),e.xp6(1),e.Q6J("ngIf",o.targetForm.showError("disks",t,"dupWwn")),e.xp6(3),e.Q6J("data",o.disks.value)("options",o.imagesSelections)("messages",o.messages.images),e.xp6(1),e.Q6J("ngClass",e.VKq(38,J,o.icons.add)),e.xp6(11),e.Q6J("ngIf",o.cephIscsiConfigVersion>10&&!o.targetForm.getValue("acl_enabled")),e.xp6(1),e.Q6J("ngIf",o.targetForm.getValue("acl_enabled")),e.xp6(1),e.Q6J("ngIf",o.targetForm.getValue("acl_enabled")),e.xp6(2),e.Q6J("form",o.targetForm)("submitText",e.lcZ(64,30,o.action)+" "+e.lcZ(65,32,o.resource))}}let ut=(()=>{class n extends H.E{constructor(t,o,i,_,r,c,d){super(),this.iscsiService=t,this.modalService=o,this.rbdService=i,this.router=_,this.route=r,this.taskWrapper=c,this.actionLabels=d,this.api_version=0,this.minimum_gateways=1,this.icons=T.P,this.isEdit=!1,this.portalsSelections=[],this.imagesInitiatorSelections=[],this.groupDiskSelections=[],this.groupMembersSelections=[],this.imagesSettings={},this.messages={portals:new F.a({noOptions:"There are no portals available."}),images:new F.a({noOptions:"There are no images available."}),initiatorImage:new F.a({noOptions:"There are no images available. Please make sure you add an image to the target."}),groupInitiator:new F.a({noOptions:"There are no initiators available. Please make sure you add an initiator to the target."})},this.IQN_REGEX=/^iqn\.(19|20)\d\d-(0[1-9]|1[0-2])\.\D{2,3}(\.[A-Za-z0-9-]+)+(:[A-Za-z0-9-\.]+)*$/,this.USER_REGEX=/^[\w\.:@_-]{8,64}$/,this.PASSWORD_REGEX=/^[\w@\-_\/]{12,16}$/,this.resource="target"}ngOnInit(){const t=new A.E(()=>{});t.pageInfo.limit=-1;const o=[this.iscsiService.listTargets(),this.rbdService.list(t.toParams()),this.iscsiService.portals(),this.iscsiService.settings(),this.iscsiService.version()];this.router.url.startsWith("/block/iscsi/targets/edit")&&(this.isEdit=!0,this.route.params.subscribe(i=>{this.target_iqn=decodeURIComponent(i.target_iqn),o.push(this.iscsiService.getTarget(this.target_iqn))})),this.action=this.isEdit?this.actionLabels.EDIT:this.actionLabels.CREATE,(0,le.D)(o).subscribe(i=>{const _=S()(i[0]).filter(c=>c.target_iqn!==this.target_iqn).flatMap(c=>c.disks).map(c=>`${c.pool}/${c.image}`).value();"api_version"in i[3]&&(this.api_version=i[3].api_version),this.minimum_gateways=i[3].config.minimum_gateways,this.target_default_controls=i[3].target_default_controls,this.target_controls_limits=i[3].target_controls_limits,this.disk_default_controls=i[3].disk_default_controls,this.disk_controls_limits=i[3].disk_controls_limits,this.backstores=i[3].backstores,this.default_backstore=i[3].default_backstore,this.unsupported_rbd_features=i[3].unsupported_rbd_features,this.required_rbd_features=i[3].required_rbd_features,this.imagesAll=S()(i[1]).flatMap(c=>c.value).filter(c=>!c.namespace&&!(-1!==_.indexOf(`${c.pool_name}/${c.name}`)||0===this.getValidBackstores(c).length)).value(),this.imagesSelections=this.imagesAll.map(c=>new y.$(!1,`${c.pool_name}/${c.name}`,""));const r=[];i[2].forEach(c=>{c.ip_addresses.forEach(d=>{r.push(new y.$(!1,c.name+":"+d,""))})}),this.portalsSelections=[...r],this.cephIscsiConfigVersion=i[4].ceph_iscsi_config_version,this.createForm(),i[5]&&this.resolveModel(i[5]),this.loadingReady()})}createForm(){if(this.targetForm=new x.d({target_iqn:new a.NI("iqn.2001-07.com.ceph:"+Date.now(),{validators:[a.kI.required,a.kI.pattern(this.IQN_REGEX)]}),target_controls:new a.NI({}),portals:new a.NI([],{validators:[z.h.custom("minGateways",t=>S().uniq(t.map(i=>i.split(":")[0])).length<Math.max(1,this.minimum_gateways))]}),disks:new a.NI([],{validators:[z.h.custom("dupLunId",t=>{const o=this.getLunIds(t);return o.length!==S().uniq(o).length}),z.h.custom("dupWwn",t=>{const o=this.getWwns(t);return o.length!==S().uniq(o).length})]}),initiators:new a.Oe([]),groups:new a.Oe([]),acl_enabled:new a.NI(!1)}),this.cephIscsiConfigVersion>10){const t=new x.d({user:new a.NI(""),password:new a.NI(""),mutual_user:new a.NI(""),mutual_password:new a.NI("")});this.setAuthValidator(t),this.targetForm.addControl("auth",t)}}resolveModel(t){this.targetForm.patchValue({target_iqn:t.target_iqn,target_controls:t.target_controls,acl_enabled:t.acl_enabled}),this.cephIscsiConfigVersion>10&&this.targetForm.patchValue({auth:t.auth});const o=[];S().forEach(t.portals,_=>{o.push(`${_.host}:${_.ip}`)}),this.targetForm.patchValue({portals:o});const i=[];S().forEach(t.disks,_=>{const r=`${_.pool}/${_.image}`;i.push(r),this.imagesSettings[r]={backstore:_.backstore},this.imagesSettings[r][_.backstore]=_.controls,"lun"in _&&(this.imagesSettings[r].lun=_.lun),"wwn"in _&&(this.imagesSettings[r].wwn=_.wwn),this.onImageSelection({option:{name:r,selected:!0}})}),this.targetForm.patchValue({disks:i}),S().forEach(t.clients,_=>{const r=this.addInitiator();_.luns=S().map(_.luns,c=>`${c.pool}/${c.image}`),r.patchValue(_)}),t.groups.forEach((_,r)=>{const c=this.addGroup();_.disks=S().map(_.disks,d=>`${d.pool}/${d.image}`),c.patchValue(_),S().forEach(_.members,d=>{this.onGroupMemberSelection({option:new y.$(!0,d,"")},r)})})}hasAdvancedSettings(t){return Object.values(t).length>0}get portals(){return this.targetForm.get("portals")}onPortalSelection(){this.portals.setValue(this.portals.value)}removePortal(t,o){return this.portalsSelections.forEach(i=>{i.name===o&&(i.selected=!1)}),this.portals.value.splice(t,1),this.portals.setValue(this.portals.value),!1}get disks(){return this.targetForm.get("disks")}removeImage(t,o){return this.imagesSelections.forEach(i=>{i.name===o&&(i.selected=!1)}),this.disks.value.splice(t,1),this.removeImageRefs(o),this.targetForm.get("disks").updateValueAndValidity({emitEvent:!1}),!1}removeImageRefs(t){this.initiators.controls.forEach(o=>{const i=o.value.luns.filter(_=>_!==t);o.get("luns").setValue(i)}),this.groups.controls.forEach(o=>{const i=o.value.disks.filter(_=>_!==t);o.get("disks").setValue(i)}),S().forEach(this.imagesInitiatorSelections,(o,i)=>{this.imagesInitiatorSelections[i]=o.filter(_=>_.name!==t)}),S().forEach(this.groupDiskSelections,(o,i)=>{this.groupDiskSelections[i]=o.filter(_=>_.name!==t)})}getDefaultBackstore(t){let o=this.default_backstore;const i=this.getImageById(t);return this.validFeatures(i,this.default_backstore)||this.backstores.forEach(_=>{_!==this.default_backstore&&this.validFeatures(i,_)&&(o=_)}),o}isLunIdInUse(t,o){const i=this.disks.value.filter(_=>_!==o);return this.getLunIds(i).includes(t)}getLunIds(t){return S().map(t,o=>this.imagesSettings[o].lun)}nextLunId(t){const o=this.disks.value.filter(r=>r!==t),i=this.getLunIds(o);let _=0;for(;i.includes(_);)_++;return _}getWwns(t){return S().map(t,i=>this.imagesSettings[i].wwn).filter(i=>S().isString(i)&&""!==i)}onImageSelection(t){const o=t.option;if(o.selected){if(this.imagesSettings[o.name])this.isLunIdInUse(this.imagesSettings[o.name].lun,o.name)&&(this.imagesSettings[o.name].lun=this.nextLunId(o.name));else{const i=this.getDefaultBackstore(o.name);this.imagesSettings[o.name]={backstore:i,lun:this.nextLunId(o.name)},this.imagesSettings[o.name][i]={}}S().forEach(this.imagesInitiatorSelections,(i,_)=>{i.push(new y.$(!1,o.name,"")),this.imagesInitiatorSelections[_]=[...i]}),S().forEach(this.groupDiskSelections,(i,_)=>{i.push(new y.$(!1,o.name,"")),this.groupDiskSelections[_]=[...i]})}else this.removeImageRefs(o.name);this.targetForm.get("disks").updateValueAndValidity({emitEvent:!1})}get initiators(){return this.targetForm.get("initiators")}addInitiator(){const t=new x.d({client_iqn:new a.NI("",{validators:[a.kI.required,z.h.custom("notUnique",i=>{const _=this.initiators.controls.reduce(function(r,c){return r.concat(c.value.client_iqn)},[]);return _.indexOf(i)!==_.lastIndexOf(i)}),a.kI.pattern(this.IQN_REGEX)]}),auth:new x.d({user:new a.NI(""),password:new a.NI(""),mutual_user:new a.NI(""),mutual_password:new a.NI("")}),luns:new a.NI([]),cdIsInGroup:new a.NI(!1)});this.setAuthValidator(t),this.initiators.push(t),S().forEach(this.groupMembersSelections,(i,_)=>{i.push(new y.$(!1,"","")),this.groupMembersSelections[_]=[...i]});const o=S().map(this.targetForm.getValue("disks"),i=>new y.$(!1,i,""));return this.imagesInitiatorSelections.push(o),t}setAuthValidator(t){z.h.validateIf(t.get("user"),()=>t.getValue("password")||t.getValue("mutual_user")||t.getValue("mutual_password"),[a.kI.required],[a.kI.pattern(this.USER_REGEX)],[t.get("password"),t.get("mutual_user"),t.get("mutual_password")]),z.h.validateIf(t.get("password"),()=>t.getValue("user")||t.getValue("mutual_user")||t.getValue("mutual_password"),[a.kI.required],[a.kI.pattern(this.PASSWORD_REGEX)],[t.get("user"),t.get("mutual_user"),t.get("mutual_password")]),z.h.validateIf(t.get("mutual_user"),()=>t.getValue("mutual_password"),[a.kI.required],[a.kI.pattern(this.USER_REGEX)],[t.get("user"),t.get("password"),t.get("mutual_password")]),z.h.validateIf(t.get("mutual_password"),()=>t.getValue("mutual_user"),[a.kI.required],[a.kI.pattern(this.PASSWORD_REGEX)],[t.get("user"),t.get("password"),t.get("mutual_user")])}removeInitiator(t){const o=this.initiators.value[t];this.initiators.removeAt(t),S().forEach(this.groupMembersSelections,(i,_)=>{i.splice(t,1),this.groupMembersSelections[_]=[...i]}),this.groups.controls.forEach(i=>{const _=i.value.members.filter(r=>r!==o.client_iqn);i.get("members").setValue(_)}),this.imagesInitiatorSelections.splice(t,1)}updatedInitiatorSelector(){this.initiators.controls.forEach(t=>{t.get("client_iqn").updateValueAndValidity({emitEvent:!1})}),S().forEach(this.groupMembersSelections,(t,o)=>{S().forEach(t,(i,_)=>{const r=i.name;i.name=this.initiators.controls[_].value.client_iqn,this.groups.controls.forEach(c=>{const d=c.value.members,g=d.indexOf(r);-1!==g&&(d[g]=i.name),c.get("members").setValue(d)})}),this.groupMembersSelections[o]=[...this.groupMembersSelections[o]]})}removeInitiatorImage(t,o,i,_){const r=t.getValue("luns");return r.splice(o,1),t.patchValue({luns:r}),this.imagesInitiatorSelections[i].forEach(c=>{c.name===_&&(c.selected=!1)}),!1}get groups(){return this.targetForm.get("groups")}addGroup(){const t=new x.d({group_id:new a.NI("",{validators:[a.kI.required]}),members:new a.NI([]),disks:new a.NI([])});this.groups.push(t);const o=S().map(this.targetForm.getValue("disks"),_=>new y.$(!1,_,""));this.groupDiskSelections.push(o);const i=S().map(this.initiators.value,_=>new y.$(!1,_.client_iqn,"",!_.cdIsInGroup));return this.groupMembersSelections.push(i),t}removeGroup(t){this.groups.removeAt(t),this.groupMembersSelections[t].filter(i=>i.selected).forEach(i=>{i.selected=!1,this.onGroupMemberSelection({option:i},t)}),this.groupMembersSelections.splice(t,1),this.groupDiskSelections.splice(t,1)}onGroupMemberSelection(t,o){const i=t.option;let _=[];i.selected||(_=this.groupDiskSelections[o].filter(c=>c.selected).map(c=>c.name)),this.initiators.controls.forEach((r,c)=>{r.value.client_iqn===i.name&&(r.patchValue({luns:_}),r.get("cdIsInGroup").setValue(i.selected),S().forEach(this.groupMembersSelections,d=>{d[c].enabled=!i.selected}),this.imagesInitiatorSelections[c].forEach(d=>{d.selected=_.includes(d.name)}))})}removeGroupInitiator(t,o,i){const _=t.getValue("members")[o];t.getValue("members").splice(o,1),this.onGroupMemberSelection({option:new y.$(!1,_,"")},i)}removeGroupDisk(t,o,i){const _=t.getValue("disks")[o];t.getValue("disks").splice(o,1),this.groupDiskSelections[i].forEach(r=>{r.name===_&&(r.selected=!1)}),this.groupDiskSelections[i]=[...this.groupDiskSelections[i]]}submit(){const t=S().cloneDeep(this.targetForm.value),o={target_iqn:this.targetForm.getValue("target_iqn"),target_controls:this.targetForm.getValue("target_controls"),acl_enabled:this.targetForm.getValue("acl_enabled"),portals:[],disks:[],clients:[],groups:[]};if(this.cephIscsiConfigVersion>10){const _=this.targetForm.get("auth");_.getValue("user")||_.get("user").setValue(""),_.getValue("password")||_.get("password").setValue(""),_.getValue("mutual_user")||_.get("mutual_user").setValue(""),_.getValue("mutual_password")||_.get("mutual_password").setValue("");const r=this.targetForm.getValue("acl_enabled");o.auth={user:r?"":_.getValue("user"),password:r?"":_.getValue("password"),mutual_user:r?"":_.getValue("mutual_user"),mutual_password:r?"":_.getValue("mutual_password")}}let i;t.disks.forEach(_=>{const r=_.split("/"),c=this.imagesSettings[_].backstore;o.disks.push({pool:r[0],image:r[1],backstore:c,controls:this.imagesSettings[_][c],lun:this.imagesSettings[_].lun,wwn:this.imagesSettings[_].wwn})}),t.portals.forEach(_=>{const r=_.indexOf(":");o.portals.push({host:_.substring(0,r),ip:_.substring(r+1)})}),o.acl_enabled&&(t.initiators.forEach(_=>{_.auth.user||(_.auth.user=""),_.auth.password||(_.auth.password=""),_.auth.mutual_user||(_.auth.mutual_user=""),_.auth.mutual_password||(_.auth.mutual_password=""),delete _.cdIsInGroup;const r=[];_.luns.forEach(c=>{const d=c.split("/");r.push({pool:d[0],image:d[1]})}),_.luns=r}),o.clients=t.initiators),o.acl_enabled&&(t.groups.forEach(_=>{const r=[];_.disks.forEach(c=>{const d=c.split("/");r.push({pool:d[0],image:d[1]})}),_.disks=r}),o.groups=t.groups),this.isEdit?(o.new_target_iqn=o.target_iqn,o.target_iqn=this.target_iqn,i=this.taskWrapper.wrapTaskAroundCall({task:new R.R("iscsi/target/edit",{target_iqn:o.target_iqn}),call:this.iscsiService.updateTarget(this.target_iqn,o)})):i=this.taskWrapper.wrapTaskAroundCall({task:new R.R("iscsi/target/create",{target_iqn:o.target_iqn}),call:this.iscsiService.createTarget(o)}),i.subscribe({error:()=>{this.targetForm.setErrors({cdSubmitButton:!0})},complete:()=>this.router.navigate(["/block/iscsi/targets"])})}targetSettingsModal(){const t={target_controls:this.targetForm.get("target_controls"),target_default_controls:this.target_default_controls,target_controls_limits:this.target_controls_limits};this.modalRef=this.modalService.show(Co,t)}imageSettingsModal(t){const o={imagesSettings:this.imagesSettings,image:t,api_version:this.api_version,disk_default_controls:this.disk_default_controls,disk_controls_limits:this.disk_controls_limits,backstores:this.getValidBackstores(this.getImageById(t)),control:this.targetForm.get("disks")};this.modalRef=this.modalService.show(To,o)}validFeatures(t,o){const i=t.features,_=this.required_rbd_features[o];return(i&_)===_&&0==(i&this.unsupported_rbd_features[o])}getImageById(t){return this.imagesAll.find(o=>t===`${o.pool_name}/${o.name}`)}getValidBackstores(t){return this.backstores.filter(o=>this.validFeatures(t,o))}}return n.\u0275fac=function(t){return new(t||n)(e.Y36(X),e.Y36(de.Z),e.Y36(q),e.Y36(m.F0),e.Y36(m.gz),e.Y36(u.P),e.Y36(v.p4))},n.\u0275cmp=e.Xpm({type:n,selectors:[["cd-iscsi-target-form"]],features:[e.qOj],decls:1,vars:1,consts:function(){let s,t,o,i,_,r,c,d,g,f,I,P,Z,B,Q,Y,ee,te,w,_e,ae,M,ge,ue,me,Te,fe,Ce,G,Be,Ge,ye,xe,we,qe,He,ke,Ke,Xe,Qe,ze,b,Zt,Bt,Gt,yt,xt,wt,qt,Ht,kt,Kt,Xt,Qt,zt,Jt,Yt,Vt,Ut,jt,Wt,eo;return s="" + "\ufffd0\ufffd" + " " + "\ufffd1\ufffd" + "",t="Target IQN",o="Portals",i="Add portal",_="Images",r="Add image",c="ACL authentication",d="This field is required.",g="IQN has wrong pattern.",f="An IQN has the following notation 'iqn.$year-$month.$reversedAddress:$definedName'",I="For example: iqn.2016-06.org.dashboard:storage:disk.sn-a8675309",P="More information",Z="This target has modified advanced settings.",B="At least " + "\ufffd0\ufffd" + " gateways are required.",Q="Backstore: " + "\ufffd0\ufffd" + ".\xA0",Y="This image has modified settings.",ee="Duplicated LUN numbers.",te="Duplicated WWN.",w="User",_e="Password",ae="Mutual User",M="Mutual Password",ge="This field is required.",ue="User names must have a length of 8 to 64 characters and can contain alphanumeric characters, '.', '@', '-', '_' or ':'.",me="This field is required.",Te="Passwords must have a length of 12 to 16 characters and can contain alphanumeric characters, '@', '-', '_' or '/'.",fe="This field is required.",Ce="User names must have a length of 8 to 64 characters and can contain alphanumeric characters, '.', '@', '-', '_' or ':'.",G="This field is required.",Be="Passwords must have a length of 12 to 16 characters and can contain alphanumeric characters, '@', '-', '_' or '/'.",Ge="Initiators",ye="Add initiator",xe="Initiator",we="Client IQN",qe="User",He="Password",ke="Mutual User",Ke="Mutual Password",Xe="Images",Qe="Initiator IQN needs to be unique.",ze="This field is required.",b="IQN has wrong pattern.",Zt="This field is required.",Bt="User names must have a length of 8 to 64 characters and can contain alphanumeric characters, '.', '@', '-', '_' or ':'.",Gt="This field is required.",yt="Passwords must have a length of 12 to 16 characters and can contain alphanumeric characters, '@', '-', '_' or '/'.",xt="This field is required.",wt="User names must have a length of 8 to 64 characters and can contain alphanumeric characters, '.', '@', '-', '_' or ':'.",qt="This field is required.",Ht="Passwords must have a length of 12 to 16 characters and can contain alphanumeric characters, '@', '-', '_' or '/'.",kt="Initiator belongs to a group. Images will be configure in the group.",Kt="Add image",Xt="No items added.",Qt="Groups",zt="Add group",Jt="Group",Yt="Name",Vt="Initiators",Ut="Add initiator",jt="Images",Wt="Add image",eo="No items added.",[["class","cd-col-form",4,"cdFormLoading"],[1,"cd-col-form"],["name","targetForm","novalidate","",3,"formGroup"],["formDir","ngForm"],[1,"card"],[1,"card-header"],s,[1,"card-body"],[1,"form-group","row"],["for","target_iqn",1,"cd-col-form-label","required"],t,[1,"cd-col-form-input"],[1,"input-group"],["type","text","id","target_iqn","name","target_iqn","formControlName","target_iqn","cdTrim","",1,"form-control"],[1,"input-group-append"],["id","ecp-info-button","type","button",1,"btn","btn-light",3,"click"],["aria-hidden","true",3,"ngClass"],["class","invalid-feedback",4,"ngIf"],["class","form-text text-muted",4,"ngIf"],["for","portals",1,"cd-col-form-label","required"],o,[4,"ngFor","ngForOf"],[1,"row"],[1,"col-md-12"],["elemClass","btn btn-light float-right",3,"data","options","messages","selection"],[3,"ngClass"],i,["type","hidden","id","portals","name","portals","formControlName","portals",1,"form-control"],["for","disks",1,"cd-col-form-label"],_,["type","hidden","id","disks","name","disks","formControlName","disks",1,"form-control"],r,[1,"cd-col-form-offset"],[1,"custom-control","custom-checkbox"],["type","checkbox","formControlName","acl_enabled","name","acl_enabled","id","acl_enabled",1,"custom-control-input"],["for","acl_enabled",1,"custom-control-label"],c,["formGroupName","auth",4,"ngIf"],["class","form-group row",4,"ngIf"],[1,"card-footer"],["wrappingClass","text-right",3,"form","submitText","submitActionEvent"],[1,"invalid-feedback"],d,g,f,I,["target","_blank","href","https://en.wikipedia.org/wiki/ISCSI#Addressing"],P,[1,"form-text","text-muted"],Z,[1,"input-group","cd-mb"],["type","text","disabled","",1,"cd-form-control",3,"value"],["type","button",1,"btn","btn-light",3,"click"],B,["class","input-group-text",4,"ngIf"],[4,"ngIf"],[1,"input-group-text"],Q,Y,ee,te,["formGroupName","auth"],["for","target_user",1,"cd-col-form-label"],w,["type","text","autocomplete","off","id","target_user","name","target_user","formControlName","user",1,"form-control"],["for","target_password",1,"cd-col-form-label"],_e,["type","password","autocomplete","new-password","id","target_password","name","target_password","formControlName","password",1,"form-control"],["type","button","cdPasswordButton","target_password",1,"btn","btn-light"],["source","target_password"],["for","target_mutual_user",1,"cd-col-form-label"],ae,["type","text","autocomplete","off","id","target_mutual_user","name","target_mutual_user","formControlName","mutual_user",1,"form-control"],["for","target_mutual_password",1,"cd-col-form-label"],M,["type","password","autocomplete","new-password","id","target_mutual_password","name","target_mutual_password","formControlName","mutual_password",1,"form-control"],["type","button","cdPasswordButton","target_mutual_password",1,"btn","btn-light"],["source","target_mutual_password"],ge,ue,me,Te,fe,Ce,G,Be,["for","initiators",1,"cd-col-form-label"],Ge,["formArrayName","initiators",1,"cd-col-form-input"],["class","card mb-2",3,"formGroup",4,"ngFor","ngForOf"],[1,"btn","btn-light","float-right",3,"click"],ye,[1,"card","mb-2",3,"formGroup"],xe,["type","button",1,"close",3,"click"],["for","client_iqn",1,"cd-col-form-label","required"],we,["type","text","formControlName","client_iqn","cdTrim","",1,"form-control",3,"blur"],["for","user",1,"cd-col-form-label"],qe,["formControlName","user","autocomplete","off","type","text",1,"form-control",3,"id"],["for","password",1,"cd-col-form-label"],He,["formControlName","password","autocomplete","new-password","type","password",1,"form-control",3,"id"],["type","button",1,"btn","btn-light",3,"cdPasswordButton"],[3,"source"],["for","mutual_user",1,"cd-col-form-label"],ke,["formControlName","mutual_user","autocomplete","off","type","text",1,"form-control",3,"id"],["for","mutual_password",1,"cd-col-form-label"],Ke,["formControlName","mutual_password","autocomplete","new-password","type","password",1,"form-control",3,"id"],["for","luns",1,"cd-col-form-label"],Xe,["class","row",4,"ngIf"],Qe,ze,b,Zt,Bt,Gt,yt,xt,wt,qt,Ht,kt,["elemClass","btn btn-light float-right",3,"data","options","messages"],Kt,Xt,Qt,["formArrayName","groups",1,"cd-col-form-input"],zt,Jt,["for","group_id",1,"cd-col-form-label","required"],Yt,["type","text","formControlName","group_id",1,"form-control"],["for","members",1,"cd-col-form-label"],Vt,Ut,jt,Wt,eo]},template:function(t,o){1&t&&e.YNc(0,dn,66,40,"div",0),2&t&&e.Q6J("cdFormLoading",o.loading)},directives:[pt.y,a._Y,a.JL,a.sg,h.V,O.P,$.o,a.Fj,k.b,a.JJ,a.u,So,l.mk,l.O5,l.sg,Eo.H,a.Wl,j.p,a.x0,gt.C,Ye.s,a.CE],pipes:[l.rS,et.m,Je.V],styles:[".cd-mb[_ngcontent-%COMP%]{margin-bottom:10px}"]}),n})();var mt=p(68136),pe=p(30982),W=p(35905),De=p(99466),Se=p(68774),Tt=p(55657),ce=p(38047),tt=p(18001),ve=p(97161),oe=p(74937);function pn(n,s){1&n&&(e.TgZ(0,"span",30),e.SDv(1,31),e.qZA())}function gn(n,s){1&n&&(e.TgZ(0,"span",30),e.SDv(1,32),e.qZA())}function un(n,s){1&n&&(e.TgZ(0,"span",30),e.SDv(1,33),e.qZA())}function mn(n,s){1&n&&(e.TgZ(0,"span",30),e.SDv(1,34),e.qZA())}function Tn(n,s){1&n&&(e.TgZ(0,"span",30),e.SDv(1,35),e.qZA())}function fn(n,s){1&n&&(e.TgZ(0,"span",30),e.SDv(1,36),e.qZA())}function Cn(n,s){1&n&&(e.TgZ(0,"span",30),e.SDv(1,37),e.qZA())}function Sn(n,s){1&n&&(e.TgZ(0,"span",30),e.SDv(1,38),e.qZA())}let En=(()=>{class n{constructor(t,o,i,_,r){this.authStorageService=t,this.activeModal=o,this.actionLabels=i,this.iscsiService=_,this.notificationService=r,this.USER_REGEX=/^[\w\.:@_-]{8,64}$/,this.PASSWORD_REGEX=/^[\w@\-_\/]{12,16}$/,this.permission=this.authStorageService.getPermissions().iscsi}ngOnInit(){this.hasPermission=this.permission.update,this.createForm(),this.iscsiService.getDiscovery().subscribe(t=>{this.discoveryForm.patchValue(t)})}createForm(){this.discoveryForm=new x.d({user:new a.NI({value:"",disabled:!this.hasPermission}),password:new a.NI({value:"",disabled:!this.hasPermission}),mutual_user:new a.NI({value:"",disabled:!this.hasPermission}),mutual_password:new a.NI({value:"",disabled:!this.hasPermission})}),z.h.validateIf(this.discoveryForm.get("user"),()=>this.discoveryForm.getValue("password")||this.discoveryForm.getValue("mutual_user")||this.discoveryForm.getValue("mutual_password"),[a.kI.required],[a.kI.pattern(this.USER_REGEX)],[this.discoveryForm.get("password"),this.discoveryForm.get("mutual_user"),this.discoveryForm.get("mutual_password")]),z.h.validateIf(this.discoveryForm.get("password"),()=>this.discoveryForm.getValue("user")||this.discoveryForm.getValue("mutual_user")||this.discoveryForm.getValue("mutual_password"),[a.kI.required],[a.kI.pattern(this.PASSWORD_REGEX)],[this.discoveryForm.get("user"),this.discoveryForm.get("mutual_user"),this.discoveryForm.get("mutual_password")]),z.h.validateIf(this.discoveryForm.get("mutual_user"),()=>this.discoveryForm.getValue("mutual_password"),[a.kI.required],[a.kI.pattern(this.USER_REGEX)],[this.discoveryForm.get("user"),this.discoveryForm.get("password"),this.discoveryForm.get("mutual_password")]),z.h.validateIf(this.discoveryForm.get("mutual_password"),()=>this.discoveryForm.getValue("mutual_user"),[a.kI.required],[a.kI.pattern(this.PASSWORD_REGEX)],[this.discoveryForm.get("user"),this.discoveryForm.get("password"),this.discoveryForm.get("mutual_user")])}submitAction(){this.iscsiService.updateDiscovery(this.discoveryForm.value).subscribe(()=>{this.notificationService.show(tt.k.success,"Updated discovery authentication"),this.activeModal.close()},()=>{this.discoveryForm.setErrors({cdSubmitButton:!0})})}}return n.\u0275fac=function(t){return new(t||n)(e.Y36(oe.j),e.Y36(N.Kz),e.Y36(v.p4),e.Y36(X),e.Y36(ve.g))},n.\u0275cmp=e.Xpm({type:n,selectors:[["cd-iscsi-target-discovery-modal"]],decls:46,vars:13,consts:function(){let s,t,o,i,_,r,c,d,g,f,I,P,Z;return s="Discovery Authentication",t="User",o="Password",i="Mutual User",_="Mutual Password",r="This field is required.",c="User names must have a length of 8 to 64 characters and can contain alphanumeric characters, '.', '@', '-', '_' or ':'.",d="This field is required.",g="Passwords must have a length of 12 to 16 characters and can contain alphanumeric characters, '@', '-', '_' or '/'.",f="This field is required.",I="User names must have a length of 8 to 64 characters and can contain alphanumeric characters, '.', '@', '-', '_' or ':'.",P="This field is required.",Z="Passwords must have a length of 12 to 16 characters and can contain alphanumeric characters, '@', '-', '_' or '/'.",[[3,"modalRef"],[1,"modal-title"],s,[1,"modal-content"],["name","discoveryForm","novalidate","",3,"formGroup"],["formDir","ngForm"],[1,"modal-body"],[1,"form-group","row"],["for","user",1,"cd-col-form-label"],t,[1,"cd-col-form-input"],["id","user","formControlName","user","type","text","autocomplete","off",1,"form-control"],["class","invalid-feedback",4,"ngIf"],["for","password",1,"cd-col-form-label"],o,[1,"input-group"],["id","password","formControlName","password","type","password","autocomplete","new-password",1,"form-control"],[1,"input-group-append"],["type","button","cdPasswordButton","password",1,"btn","btn-light"],["source","password"],["for","mutual_user",1,"cd-col-form-label"],i,["id","mutual_user","formControlName","mutual_user","type","text","autocomplete","off",1,"form-control"],["for","mutual_password",1,"cd-col-form-label"],_,["id","mutual_password","formControlName","mutual_password","type","password","autocomplete","new-password",1,"form-control"],["type","button","cdPasswordButton","mutual_password",1,"btn","btn-light"],["source","mutual_password"],[1,"modal-footer"],[3,"form","showSubmit","submitText","submitActionEvent"],[1,"invalid-feedback"],r,c,d,g,f,I,P,Z]},template:function(t,o){if(1&t&&(e.TgZ(0,"cd-modal",0),e.ynx(1,1),e.SDv(2,2),e.BQk(),e.ynx(3,3),e.TgZ(4,"form",4,5),e.TgZ(6,"div",6),e.TgZ(7,"div",7),e.TgZ(8,"label",8),e.SDv(9,9),e.qZA(),e.TgZ(10,"div",10),e._UZ(11,"input",11),e.YNc(12,pn,2,0,"span",12),e.YNc(13,gn,2,0,"span",12),e.qZA(),e.qZA(),e.TgZ(14,"div",7),e.TgZ(15,"label",13),e.SDv(16,14),e.qZA(),e.TgZ(17,"div",10),e.TgZ(18,"div",15),e._UZ(19,"input",16),e.TgZ(20,"span",17),e._UZ(21,"button",18),e._UZ(22,"cd-copy-2-clipboard-button",19),e.qZA(),e.qZA(),e.YNc(23,un,2,0,"span",12),e.YNc(24,mn,2,0,"span",12),e.qZA(),e.qZA(),e.TgZ(25,"div",7),e.TgZ(26,"label",20),e.ynx(27),e.SDv(28,21),e.BQk(),e.qZA(),e.TgZ(29,"div",10),e._UZ(30,"input",22),e.YNc(31,Tn,2,0,"span",12),e.YNc(32,fn,2,0,"span",12),e.qZA(),e.qZA(),e.TgZ(33,"div",7),e.TgZ(34,"label",23),e.SDv(35,24),e.qZA(),e.TgZ(36,"div",10),e.TgZ(37,"div",15),e._UZ(38,"input",25),e.TgZ(39,"span",17),e._UZ(40,"button",26),e._UZ(41,"cd-copy-2-clipboard-button",27),e.qZA(),e.qZA(),e.YNc(42,Cn,2,0,"span",12),e.YNc(43,Sn,2,0,"span",12),e.qZA(),e.qZA(),e.qZA(),e.TgZ(44,"div",28),e.TgZ(45,"cd-form-button-panel",29),e.NdJ("submitActionEvent",function(){return o.submitAction()}),e.qZA(),e.qZA(),e.qZA(),e.BQk(),e.qZA()),2&t){const i=e.MAs(5);e.Q6J("modalRef",o.activeModal),e.xp6(4),e.Q6J("formGroup",o.discoveryForm),e.xp6(8),e.Q6J("ngIf",o.discoveryForm.showError("user",i,"required")),e.xp6(1),e.Q6J("ngIf",o.discoveryForm.showError("user",i,"pattern")),e.xp6(10),e.Q6J("ngIf",o.discoveryForm.showError("password",i,"required")),e.xp6(1),e.Q6J("ngIf",o.discoveryForm.showError("password",i,"pattern")),e.xp6(7),e.Q6J("ngIf",o.discoveryForm.showError("mutual_user",i,"required")),e.xp6(1),e.Q6J("ngIf",o.discoveryForm.showError("mutual_user",i,"pattern")),e.xp6(10),e.Q6J("ngIf",o.discoveryForm.showError("mutual_password",i,"required")),e.xp6(1),e.Q6J("ngIf",o.discoveryForm.showError("mutual_password",i,"pattern")),e.xp6(2),e.Q6J("form",o.discoveryForm)("showSubmit",o.hasPermission)("submitText",o.actionLabels.SUBMIT)}},directives:[C.z,a._Y,a.JL,a.sg,h.V,O.P,$.o,a.Fj,k.b,a.JJ,a.u,l.O5,gt.C,Ye.s,j.p],styles:[""]}),n})();var Rn=p(86969);let ft=(()=>{class n{constructor(t){this.router=t}}return n.\u0275fac=function(t){return new(t||n)(e.Y36(m.F0))},n.\u0275cmp=e.Xpm({type:n,selectors:[["cd-iscsi-tabs"]],decls:8,vars:1,consts:function(){let s,t;return s="Overview",t="Targets",[["ngbNav","",1,"nav-tabs",3,"activeId","navChange"],["nav","ngbNav"],["ngbNavItem","/block/iscsi/overview"],["ngbNavLink",""],s,["ngbNavItem","/block/iscsi/targets"],t]},template:function(t,o){1&t&&(e.TgZ(0,"ul",0,1),e.NdJ("navChange",function(_){return o.router.navigate([_.nextId])}),e.TgZ(2,"li",2),e.TgZ(3,"a",3),e.SDv(4,4),e.qZA(),e.qZA(),e.TgZ(5,"li",5),e.TgZ(6,"a",3),e.SDv(7,6),e.qZA(),e.qZA(),e.qZA()),2&t&&e.Q6J("activeId",o.router.url)},directives:[N.Pz,N.nv,N.Vx],styles:[""]}),n})();var Ct=p(34501),Mn=p(30490),Ee=p(94928),On=p(68962);const An=["highlightTpl"],hn=["detailTable"],Pn=["tree"],In=function(){return["logged_in"]},bn=function(){return["logged_out"]},Nn=function(n,s){return{"badge-success":n,"badge-danger":s}};function Fn(n,s){if(1&n&&(e._UZ(0,"i"),e.TgZ(1,"span"),e._uU(2),e.qZA(),e._uU(3," \xa0 "),e.TgZ(4,"span",8),e._uU(5),e.qZA()),2&n){const t=s.$implicit;e.Tol(t.data.cdIcon),e.xp6(2),e.Oqu(t.data.name),e.xp6(2),e.Q6J("ngClass",e.WLB(7,Nn,e.DdM(5,In).includes(t.data.status),e.DdM(6,bn).includes(t.data.status))),e.xp6(1),e.hij(" ",t.data.status," ")}}function Dn(n,s){if(1&n&&(e.TgZ(0,"div",9),e.TgZ(1,"legend"),e._uU(2),e.qZA(),e._UZ(3,"cd-table",10,11),e.qZA()),2&n){const t=e.oxw();e.xp6(2),e.Oqu(t.title),e.xp6(1),e.Q6J("data",t.data)("columns",t.columns)("limit",0)}}function vn(n,s){if(1&n&&(e.TgZ(0,"span"),e._uU(1),e.qZA()),2&n){const t=e.oxw().value;e.xp6(1),e.Oqu(t)}}function Ln(n,s){if(1&n&&(e.TgZ(0,"strong"),e._uU(1),e.qZA()),2&n){const t=e.oxw().value;e.xp6(1),e.Oqu(t)}}function $n(n,s){if(1&n&&(e.YNc(0,vn,2,1,"span",12),e.YNc(1,Ln,2,1,"strong",12)),2&n){const t=s.row;e.Q6J("ngIf",void 0===t.default||t.default===t.current),e.xp6(1),e.Q6J("ngIf",void 0!==t.default&&t.default!==t.current)}}let Zn=(()=>{class n{constructor(t,o){this.iscsiBackstorePipe=t,this.booleanTextPipe=o,this.icons=T.P,this.metadata={},this.nodes=[],this.treeOptions={useVirtualScroll:!0,actionMapping:{mouse:{click:this.onNodeSelected.bind(this)}}}}set content(t){this.detailTable=t,t&&t.updateColumns()}ngOnInit(){this.columns=[{prop:"displayName",name:"Name",flexGrow:1,cellTemplate:this.highlightTpl},{prop:"current",name:"Current",flexGrow:1,cellTemplate:this.highlightTpl},{prop:"default",name:"Default",flexGrow:1,cellTemplate:this.highlightTpl}]}ngOnChanges(){this.selection&&(this.selectedItem=this.selection,this.generateTree()),this.data=void 0}generateTree(){const t=S().cloneDeep(this.selectedItem.target_controls);this.cephIscsiConfigVersion>10&&S().extend(t,S().cloneDeep(this.selectedItem.auth)),this.metadata={root:t};const o={target:{expanded:S().join(this.selectedItem.cdExecuting?[T.P.large,T.P.spinner,T.P.spin]:[T.P.large,T.P.bullseye]," ")},initiators:{expanded:S().join([T.P.large,T.P.user]," "),leaf:S().join([T.P.user]," ")},groups:{expanded:S().join([T.P.large,T.P.users]," "),leaf:S().join([T.P.users]," ")},disks:{expanded:S().join([T.P.large,T.P.disk]," "),leaf:S().join([T.P.disk]," ")},portals:{expanded:S().join([T.P.large,T.P.server]," "),leaf:S().join([T.P.server]," ")}},i=[];S().forEach(this.selectedItem.disks,d=>{const g="disk_"+d.pool+"_"+d.image;this.metadata[g]={controls:d.controls,backstore:d.backstore},["wwn","lun"].forEach(f=>{f in d&&(this.metadata[g][f]=d[f])}),i.push({name:`${d.pool}/${d.image}`,cdId:g,cdIcon:o.disks.leaf})});const _=[];S().forEach(this.selectedItem.portals,d=>{_.push({name:`${d.host}:${d.ip}`,cdIcon:o.portals.leaf})});const r=[];S().forEach(this.selectedItem.clients,d=>{const g=S().cloneDeep(d.auth);d.info&&(S().extend(g,d.info),delete g.state,S().forEach(Object.keys(d.info.state),P=>{g[P.toLowerCase()]=d.info.state[P]})),this.metadata["client_"+d.client_iqn]=g;const f=[];d.luns.forEach(P=>{f.push({name:`${P.pool}/${P.image}`,cdId:"disk_"+P.pool+"_"+P.image,cdIcon:o.disks.leaf})});let I="";d.info&&(I=Object.keys(d.info.state).includes("LOGGED_IN")?"logged_in":"logged_out"),r.push({name:d.client_iqn,status:I,cdId:"client_"+d.client_iqn,children:f,cdIcon:o.initiators.leaf})});const c=[];S().forEach(this.selectedItem.groups,d=>{const g=[];d.disks.forEach(I=>{g.push({name:`${I.pool}/${I.image}`,cdId:"disk_"+I.pool+"_"+I.image,cdIcon:o.disks.leaf})});const f=[];d.members.forEach(I=>{f.push({name:I,cdId:"client_"+I})}),c.push({name:d.group_id,cdIcon:o.groups.leaf,children:[{name:"Disks",children:g,cdIcon:o.disks.expanded},{name:"Initiators",children:f,cdIcon:o.initiators.expanded}]})}),this.nodes=[{name:this.selectedItem.target_iqn,cdId:"root",isExpanded:!0,cdIcon:o.target.expanded,children:[{name:"Disks",isExpanded:!0,children:i,cdIcon:o.disks.expanded},{name:"Portals",isExpanded:!0,children:_,cdIcon:o.portals.expanded},{name:"Initiators",isExpanded:!0,children:r,cdIcon:o.initiators.expanded},{name:"Groups",isExpanded:!0,children:c,cdIcon:o.groups.expanded}]}]}format(t){return"boolean"==typeof t?this.booleanTextPipe.transform(t):t}onNodeSelected(t,o){var i,_,r,c;if(ne.iM.ACTIVATE(t,o,!0),o.data.cdId){this.title=o.data.name;const d=this.metadata[o.data.cdId]||{};"root"===o.data.cdId?(null===(i=this.detailTable)||void 0===i||i.toggleColumn({prop:"default",isHidden:!0}),this.data=S().map(this.settings.target_default_controls,(g,f)=>({displayName:f,default:g=this.format(g),current:S().isUndefined(d[f])?g:this.format(d[f])})),this.cephIscsiConfigVersion>10&&["user","password","mutual_user","mutual_password"].forEach(g=>{this.data.push({displayName:g,default:null,current:d[g]})})):o.data.cdId.toString().startsWith("disk_")?(null===(_=this.detailTable)||void 0===_||_.toggleColumn({prop:"default",isHidden:!0}),this.data=S().map(this.settings.disk_default_controls[d.backstore],(g,f)=>({displayName:f,default:g=this.format(g),current:S().isUndefined(d.controls[f])?g:this.format(d.controls[f])})),this.data.push({displayName:"backstore",default:this.iscsiBackstorePipe.transform(this.settings.default_backstore),current:this.iscsiBackstorePipe.transform(d.backstore)}),["wwn","lun"].forEach(g=>{g in d&&this.data.push({displayName:g,default:void 0,current:d[g]})})):(null===(r=this.detailTable)||void 0===r||r.toggleColumn({prop:"default",isHidden:!1}),this.data=S().map(d,(g,f)=>({displayName:f,default:void 0,current:this.format(g)})))}else this.data=void 0;null===(c=this.detailTable)||void 0===c||c.updateColumns()}onUpdateData(){this.tree.treeModel.expandAll()}}return n.\u0275fac=function(t){return new(t||n)(e.Y36(Je.V),e.Y36(On.T))},n.\u0275cmp=e.Xpm({type:n,selectors:[["cd-iscsi-target-details"]],viewQuery:function(t,o){if(1&t&&(e.Gf(An,7),e.Gf(hn,5),e.Gf(Pn,5)),2&t){let i;e.iGM(i=e.CRH())&&(o.highlightTpl=i.first),e.iGM(i=e.CRH())&&(o.content=i.first),e.iGM(i=e.CRH())&&(o.tree=i.first)}},inputs:{selection:"selection",settings:"settings",cephIscsiConfigVersion:"cephIscsiConfigVersion"},features:[e.TTD],decls:11,vars:3,consts:function(){let s;return s="iSCSI Topology",[[1,"row"],[1,"col-6"],s,[3,"nodes","options","updateData"],["tree",""],["treeNodeTemplate",""],["class","col-6 metadata",4,"ngIf"],["highlightTpl",""],[1,"badge",3,"ngClass"],[1,"col-6","metadata"],["columnMode","flex",3,"data","columns","limit"],["detailTable",""],[4,"ngIf"]]},template:function(t,o){1&t&&(e.TgZ(0,"div",0),e.TgZ(1,"div",1),e.TgZ(2,"legend"),e.SDv(3,2),e.qZA(),e.TgZ(4,"tree-root",3,4),e.NdJ("updateData",function(){return o.onUpdateData()}),e.YNc(6,Fn,6,10,"ng-template",null,5,e.W1O),e.qZA(),e.qZA(),e.YNc(8,Dn,5,4,"div",6),e.qZA(),e.YNc(9,$n,2,2,"ng-template",null,7,e.W1O)),2&t&&(e.xp6(4),e.Q6J("nodes",o.nodes)("options",o.treeOptions),e.xp6(4),e.Q6J("ngIf",o.data))},directives:[ne.qr,l.O5,l.mk,W.a],styles:[""]}),n})();function Bn(n,s){if(1&n&&(e.ynx(0),e._UZ(1,"br"),e.TgZ(2,"span"),e.SDv(3,6),e.qZA(),e.TgZ(4,"pre"),e._uU(5),e.qZA(),e.BQk()),2&n){const t=e.oxw(2);e.xp6(5),e.Oqu(t.status)}}function Gn(n,s){if(1&n&&(e.TgZ(0,"cd-alert-panel",2),e.ynx(1),e.tHW(2,3),e._UZ(3,"cd-doc",4),e.N_p(),e.BQk(),e.YNc(4,Bn,6,1,"ng-container",5),e.qZA()),2&n){const t=e.oxw();e.xp6(4),e.Q6J("ngIf",t.status)}}function yn(n,s){if(1&n&&e._UZ(0,"cd-iscsi-target-details",15),2&n){const t=e.oxw(2);e.Q6J("cephIscsiConfigVersion",t.cephIscsiConfigVersion)("selection",t.expandedRow)("settings",t.settings)}}const xn=function(n){return[n]};function wn(n,s){if(1&n){const t=e.EpF();e.TgZ(0,"cd-table",7,8),e.NdJ("fetchData",function(){return e.CHM(t),e.oxw().getTargets()})("setExpandedRow",function(i){return e.CHM(t),e.oxw().setExpandedRow(i)})("updateSelection",function(i){return e.CHM(t),e.oxw().updateSelection(i)}),e.TgZ(2,"div",9),e._UZ(3,"cd-table-actions",10),e.TgZ(4,"button",11),e.NdJ("click",function(){return e.CHM(t),e.oxw().configureDiscoveryAuth()}),e._UZ(5,"i",12),e.ynx(6),e.SDv(7,13),e.BQk(),e.qZA(),e.qZA(),e.YNc(8,yn,1,3,"cd-iscsi-target-details",14),e.qZA()}if(2&n){const t=e.oxw();e.Q6J("data",t.targets)("columns",t.columns)("hasDetails",!0)("autoReload",!1)("status",t.tableStatus),e.xp6(3),e.Q6J("permission",t.permission)("selection",t.selection)("tableActions",t.tableActions),e.xp6(2),e.Q6J("ngClass",e.VKq(10,xn,t.icons.key)),e.xp6(3),e.Q6J("ngIf",t.expandedRow)}}let qn=(()=>{class n extends mt.o{constructor(t,o,i,_,r,c,d,g,f){super(f),this.authStorageService=t,this.iscsiService=o,this.joinPipe=i,this.taskListService=_,this.notAvailablePipe=r,this.modalService=c,this.taskWrapper=d,this.actionLabels=g,this.ngZone=f,this.available=void 0,this.selection=new Se.r,this.targets=[],this.icons=T.P,this.builders={"iscsi/target/create":I=>({target_iqn:I.target_iqn})},this.permission=this.authStorageService.getPermissions().iscsi,this.tableActions=[{permission:"create",icon:T.P.add,routerLink:()=>"/block/iscsi/targets/create",name:this.actionLabels.CREATE},{permission:"update",icon:T.P.edit,routerLink:()=>`/block/iscsi/targets/edit/${this.selection.first().target_iqn}`,name:this.actionLabels.EDIT,disable:()=>this.getEditDisableDesc()},{permission:"delete",icon:T.P.destroy,click:()=>this.deleteIscsiTargetModal(),name:this.actionLabels.DELETE,disable:()=>this.getDeleteDisableDesc()}]}ngOnInit(){this.columns=[{name:"Target",prop:"target_iqn",flexGrow:2,cellTransformation:De.e.executing},{name:"Portals",prop:"cdPortals",pipe:this.joinPipe,flexGrow:2},{name:"Images",prop:"cdImages",pipe:this.joinPipe,flexGrow:2},{name:"# Sessions",prop:"info.num_sessions",pipe:this.notAvailablePipe,flexGrow:1}],this.iscsiService.status().subscribe(t=>{this.available=t.available,t.available||(this.status=t.message)})}getTargets(){this.available&&(this.setTableRefreshTimeout(),this.iscsiService.version().subscribe(t=>{this.cephIscsiConfigVersion=t.ceph_iscsi_config_version}),this.taskListService.init(()=>this.iscsiService.listTargets(),t=>this.prepareResponse(t),t=>this.targets=t,()=>this.onFetchError(),this.taskFilter,this.itemFilter,this.builders),this.iscsiService.settings().subscribe(t=>{this.settings=t}))}ngOnDestroy(){this.summaryDataSubscription&&this.summaryDataSubscription.unsubscribe()}getEditDisableDesc(){const t=this.selection.first();return t&&(null==t?void 0:t.cdExecuting)?t.cdExecuting:t&&S().isUndefined(null==t?void 0:t.info)?"Unavailable gateway(s)":!t}getDeleteDisableDesc(){var t;const o=this.selection.first();return(null==o?void 0:o.cdExecuting)?o.cdExecuting:o&&S().isUndefined(null==o?void 0:o.info)?"Unavailable gateway(s)":o&&(null===(t=null==o?void 0:o.info)||void 0===t?void 0:t.num_sessions)?"Target has active sessions":!o}prepareResponse(t){return t.forEach(o=>{o.cdPortals=o.portals.map(i=>`${i.host}:${i.ip}`),o.cdImages=o.disks.map(i=>`${i.pool}/${i.image}`)}),t}onFetchError(){this.table.reset()}itemFilter(t,o){return t.target_iqn===o.metadata.target_iqn}taskFilter(t){return["iscsi/target/create","iscsi/target/edit","iscsi/target/delete"].includes(t.name)}updateSelection(t){this.selection=t}deleteIscsiTargetModal(){const t=this.selection.first().target_iqn;this.modalRef=this.modalService.show(pe.M,{itemDescription:"iSCSI target",itemNames:[t],submitActionObservable:()=>this.taskWrapper.wrapTaskAroundCall({task:new R.R("iscsi/target/delete",{target_iqn:t}),call:this.iscsiService.deleteTarget(t)})})}configureDiscoveryAuth(){this.modalService.show(En)}}return n.\u0275fac=function(t){return new(t||n)(e.Y36(oe.j),e.Y36(X),e.Y36(Rn.A),e.Y36(ce.j),e.Y36(Tt.g),e.Y36(de.Z),e.Y36(u.P),e.Y36(v.p4),e.Y36(e.R0b))},n.\u0275cmp=e.Xpm({type:n,selectors:[["cd-iscsi-target-list"]],viewQuery:function(t,o){if(1&t&&e.Gf(W.a,5),2&t){let i;e.iGM(i=e.CRH())&&(o.table=i.first)}},features:[e._Bn([ce.j]),e.qOj],decls:3,vars:2,consts:function(){let s,t,o,i;return s="iSCSI Targets not available",t="Please consult the " + "\ufffd#3\ufffd" + "" + "\ufffd/#3\ufffd" + " on how to configure and enable the iSCSI Targets management functionality.",o="Available information:",i="Discovery authentication",[["type","info","title",s,4,"ngIf"],["columnMode","flex","identifier","target_iqn","forceIdentifier","true","selectionType","single",3,"data","columns","hasDetails","autoReload","status","fetchData","setExpandedRow","updateSelection",4,"ngIf"],["type","info","title",s],t,["section","iscsi"],[4,"ngIf"],o,["columnMode","flex","identifier","target_iqn","forceIdentifier","true","selectionType","single",3,"data","columns","hasDetails","autoReload","status","fetchData","setExpandedRow","updateSelection"],["table",""],[1,"table-actions","btn-toolbar"],[1,"btn-group",3,"permission","selection","tableActions"],["type","button",1,"btn","btn-light",3,"click"],["aria-hidden","true",3,"ngClass"],i,["cdTableDetail","",3,"cephIscsiConfigVersion","selection","settings",4,"ngIf"],["cdTableDetail","",3,"cephIscsiConfigVersion","selection","settings"]]},template:function(t,o){1&t&&(e._UZ(0,"cd-iscsi-tabs"),e.YNc(1,Gn,5,1,"cd-alert-panel",0),e.YNc(2,wn,9,12,"cd-table",1)),2&t&&(e.xp6(1),e.Q6J("ngIf",!1===o.available),e.xp6(1),e.Q6J("ngIf",!0===o.available))},directives:[ft,l.O5,Ct.G,Mn.K,W.a,Ee.K,$.o,l.mk,Zn],styles:[""]}),n})();var ot=p(66369),Hn=p(76446),kn=p(90068);const Kn=["iscsiSparklineTpl"],Xn=["iscsiPerSecondTpl"],Qn=["iscsiRelativeDateTpl"];function zn(n,s){if(1&n&&(e.TgZ(0,"span"),e._UZ(1,"cd-sparkline",9),e.qZA()),2&n){const t=e.oxw(),o=t.value,i=t.row;e.xp6(1),e.Q6J("data",o)("isBinary",i.cdIsBinary)}}function Jn(n,s){1&n&&(e.TgZ(0,"span",10),e._uU(1," n/a "),e.qZA())}function Yn(n,s){if(1&n&&(e.YNc(0,zn,2,2,"span",7),e.YNc(1,Jn,2,0,"span",8)),2&n){const t=s.row;e.Q6J("ngIf","user:rbd"===t.backstore),e.xp6(1),e.Q6J("ngIf","user:rbd"!==t.backstore)}}function Vn(n,s){if(1&n&&(e.TgZ(0,"span"),e._uU(1),e.qZA()),2&n){const t=e.oxw().value;e.xp6(1),e.hij(" ",t," /s ")}}function Un(n,s){1&n&&(e.TgZ(0,"span",10),e._uU(1," n/a "),e.qZA())}function jn(n,s){if(1&n&&(e.YNc(0,Vn,2,1,"span",7),e.YNc(1,Un,2,0,"span",8)),2&n){const t=s.row;e.Q6J("ngIf","user:rbd"===t.backstore),e.xp6(1),e.Q6J("ngIf","user:rbd"!==t.backstore)}}function Wn(n,s){if(1&n&&(e.TgZ(0,"span"),e._uU(1),e.ALo(2,"notAvailable"),e.ALo(3,"relativeDate"),e.qZA()),2&n){const t=e.oxw().value;e.xp6(1),e.hij(" ",e.lcZ(2,1,e.lcZ(3,3,t))," ")}}function ei(n,s){1&n&&(e.TgZ(0,"span",10),e._uU(1," n/a "),e.qZA())}function ti(n,s){if(1&n&&(e.YNc(0,Wn,4,5,"span",7),e.YNc(1,ei,2,0,"span",8)),2&n){const t=s.row;e.Q6J("ngIf","user:rbd"===t.backstore),e.xp6(1),e.Q6J("ngIf","user:rbd"!==t.backstore)}}let oi=(()=>{class n{constructor(t,o,i){this.iscsiService=t,this.dimlessPipe=o,this.iscsiBackstorePipe=i,this.gateways=[],this.images=[]}ngOnInit(){this.gatewaysColumns=[{name:"Name",prop:"name"},{name:"State",prop:"state",flexGrow:1,cellTransformation:De.e.badge,customTemplateConfig:{map:{up:{class:"badge-success"},down:{class:"badge-danger"}}}},{name:"# Targets",prop:"num_targets"},{name:"# Sessions",prop:"num_sessions"}],this.imagesColumns=[{name:"Pool",prop:"pool"},{name:"Image",prop:"image"},{name:"Backstore",prop:"backstore",pipe:this.iscsiBackstorePipe},{name:"Read Bytes",prop:"stats_history.rd_bytes",cellTemplate:this.iscsiSparklineTpl},{name:"Write Bytes",prop:"stats_history.wr_bytes",cellTemplate:this.iscsiSparklineTpl},{name:"Read Ops",prop:"stats.rd",pipe:this.dimlessPipe,cellTemplate:this.iscsiPerSecondTpl},{name:"Write Ops",prop:"stats.wr",pipe:this.dimlessPipe,cellTemplate:this.iscsiPerSecondTpl},{name:"A/O Since",prop:"optimized_since",cellTemplate:this.iscsiRelativeDateTpl}]}refresh(){this.iscsiService.overview().subscribe(t=>{this.gateways=t.gateways,this.images=t.images,this.images.map(o=>(o.stats_history&&(o.stats_history.rd_bytes=o.stats_history.rd_bytes.map(i=>i[1]),o.stats_history.wr_bytes=o.stats_history.wr_bytes.map(i=>i[1])),o.cdIsBinary=!0,o))})}}return n.\u0275fac=function(t){return new(t||n)(e.Y36(X),e.Y36(ot.n),e.Y36(Je.V))},n.\u0275cmp=e.Xpm({type:n,selectors:[["cd-iscsi"]],viewQuery:function(t,o){if(1&t&&(e.Gf(Kn,7),e.Gf(Xn,7),e.Gf(Qn,7)),2&t){let i;e.iGM(i=e.CRH())&&(o.iscsiSparklineTpl=i.first),e.iGM(i=e.CRH())&&(o.iscsiPerSecondTpl=i.first),e.iGM(i=e.CRH())&&(o.iscsiRelativeDateTpl=i.first)}},decls:13,vars:4,consts:function(){let s,t;return s="Gateways",t="Images",[s,[3,"data","columns","fetchData"],t,[3,"data","columns"],["iscsiSparklineTpl",""],["iscsiPerSecondTpl",""],["iscsiRelativeDateTpl",""],[4,"ngIf"],["class","text-muted",4,"ngIf"],[3,"data","isBinary"],[1,"text-muted"]]},template:function(t,o){1&t&&(e._UZ(0,"cd-iscsi-tabs"),e.TgZ(1,"legend"),e.SDv(2,0),e.qZA(),e.TgZ(3,"cd-table",1),e.NdJ("fetchData",function(){return o.refresh()}),e.qZA(),e.TgZ(4,"legend"),e.SDv(5,2),e.qZA(),e._UZ(6,"cd-table",3),e.YNc(7,Yn,2,2,"ng-template",null,4,e.W1O),e.YNc(9,jn,2,2,"ng-template",null,5,e.W1O),e.YNc(11,ti,2,2,"ng-template",null,6,e.W1O)),2&t&&(e.xp6(3),e.Q6J("data",o.gateways)("columns",o.gatewaysColumns),e.xp6(3),e.Q6J("data",o.images)("columns",o.imagesColumns))},directives:[ft,W.a,l.O5,Hn.l],pipes:[Tt.g,kn.h],styles:[""]}),n})(),ni=(()=>{class n{}return n.\u0275fac=function(t){return new(t||n)},n.\u0275mod=e.oAB({type:n}),n.\u0275inj=e.cJS({imports:[[l.ez,Ae.m,N.Oz,m.Bz,a.u5,a.UX,N.ZQ]]}),n})();var ii=p(75319),si=p(26215),_i=p(45435),St=p(46947);let K=class{constructor(s,t){this.http=s,this.timerService=t,this.REFRESH_INTERVAL=3e4,this.summaryDataSource=new si.X(null),this.summaryData$=this.summaryDataSource.asObservable()}startPolling(){return this.timerService.get(()=>this.retrieveSummaryObservable(),this.REFRESH_INTERVAL).subscribe(this.retrieveSummaryObserver())}refresh(){return this.retrieveSummaryObservable().subscribe(this.retrieveSummaryObserver())}retrieveSummaryObservable(){return this.http.get("api/block/mirroring/summary")}retrieveSummaryObserver(){return s=>{this.summaryDataSource.next(s)}}subscribeSummary(s,t){return this.summaryData$.pipe((0,_i.h)(o=>!!o)).subscribe(s,t)}getPool(s){return this.http.get(`api/block/mirroring/pool/${s}`)}updatePool(s,t){return this.http.put(`api/block/mirroring/pool/${s}`,t,{observe:"response"})}getSiteName(){return this.http.get("api/block/mirroring/site_name")}setSiteName(s){return this.http.put("api/block/mirroring/site_name",{site_name:s},{observe:"response"})}createBootstrapToken(s){return this.http.post(`api/block/mirroring/pool/${s}/bootstrap/token`,{})}importBootstrapToken(s,t,o){return this.http.post(`api/block/mirroring/pool/${s}/bootstrap/peer`,{direction:t,token:o},{observe:"response"})}getPeer(s,t){return this.http.get(`api/block/mirroring/pool/${s}/peer/${t}`)}addPeer(s,t){return this.http.post(`api/block/mirroring/pool/${s}/peer`,t,{observe:"response"})}updatePeer(s,t,o){return this.http.put(`api/block/mirroring/pool/${s}/peer/${t}`,o,{observe:"response"})}deletePeer(s,t){return this.http.delete(`api/block/mirroring/pool/${s}/peer/${t}`,{observe:"response"})}};K.\u0275fac=function(s){return new(s||K)(e.LFG(ie.eN),e.LFG(St.f))},K.\u0275prov=e.Yz7({token:K,factory:K.\u0275fac,providedIn:"root"}),(0,D.gn)([(0,D.fM)(0,V.G),(0,D.w6)("design:type",Function),(0,D.w6)("design:paramtypes",[String]),(0,D.w6)("design:returntype",void 0)],K.prototype,"setSiteName",null),(0,D.gn)([(0,D.fM)(1,V.G),(0,D.fM)(2,V.G),(0,D.w6)("design:type",Function),(0,D.w6)("design:paramtypes",[String,String,String]),(0,D.w6)("design:returntype",void 0)],K.prototype,"importBootstrapToken",null),K=(0,D.gn)([V.o,(0,D.w6)("design:paramtypes",[ie.eN,St.f])],K);var nt=p(58071),ai=p(68307),Et=p(12627),Re=p(82945),ri=p(39749),li=p(13472);function ci(n,s){1&n&&(e.TgZ(0,"span",25),e.SDv(1,26),e.qZA())}function di(n,s){if(1&n&&(e.TgZ(0,"div",27),e._UZ(1,"input",28),e.TgZ(2,"label",29),e._uU(3),e.qZA(),e.qZA()),2&n){const t=s.$implicit;e.xp6(1),e.s9C("id",t.name),e.s9C("name",t.name),e.s9C("formControlName",t.name),e.xp6(1),e.s9C("for",t.name),e.xp6(1),e.Oqu(t.name)}}function pi(n,s){1&n&&(e.TgZ(0,"span",25),e.SDv(1,30),e.qZA())}let gi=(()=>{class n{constructor(t,o,i){this.activeModal=t,this.rbdMirroringService=o,this.taskWrapper=i,this.pools=[],this.createForm()}createForm(){this.createBootstrapForm=new x.d({siteName:new a.NI("",{validators:[a.kI.required]}),pools:new a.cw({},{validators:[this.validatePools()]}),token:new a.NI("",{})})}ngOnInit(){this.createBootstrapForm.get("siteName").setValue(this.siteName),this.rbdMirroringService.getSiteName().subscribe(t=>{this.createBootstrapForm.get("siteName").setValue(t.site_name)}),this.subs=this.rbdMirroringService.subscribeSummary(t=>{this.pools=t.content_data.pools.reduce((_,r)=>(_.push({name:r.name,mirror_mode:r.mirror_mode}),_),[]);const i=this.createBootstrapForm.get("pools");S().each(this.pools,_=>{const r=_.name,c="disabled"===_.mirror_mode,d=i.controls[r];d?c&&d.disabled?d.enable():!c&&d.enabled&&(d.disable(),d.setValue(!0)):i.addControl(r,new a.NI({value:!c,disabled:!c}))})})}ngOnDestroy(){this.subs&&this.subs.unsubscribe()}validatePools(){return t=>{let o=0;return S().each(t.controls,i=>{!0===i.value&&++o}),o>0?null:{requirePool:!0}}}generate(){this.createBootstrapForm.get("token").setValue("");let t="";const o=[],i=this.createBootstrapForm.get("pools");S().each(i.controls,(g,f)=>{!0===g.value&&(t=f,g.disabled||o.push(f))});const _={mirror_mode:"image"},r=(0,nt.z)(this.rbdMirroringService.setSiteName(this.createBootstrapForm.getValue("siteName")),(0,le.D)(o.map(g=>this.rbdMirroringService.updatePool(g,_))),this.rbdMirroringService.createBootstrapToken(t).pipe((0,ai.b)(g=>this.createBootstrapForm.get("token").setValue(g.token)))).pipe((0,Et.Z)()),c=()=>{this.rbdMirroringService.refresh(),this.createBootstrapForm.setErrors({cdSubmitButton:!0})};this.taskWrapper.wrapTaskAroundCall({task:new R.R("rbd/mirroring/bootstrap/create",{}),call:r}).subscribe({error:c,complete:c})}}return n.\u0275fac=function(t){return new(t||n)(e.Y36(N.Kz),e.Y36(K),e.Y36(u.P))},n.\u0275cmp=e.Xpm({type:n,selectors:[["cd-bootstrap-create-modal"]],decls:32,vars:6,consts:function(){let s,t,o,i,_,r,c,d,g,f,I;return s="Create Bootstrap Token",t="To create a bootstrap token which can be imported by a peer site cluster, provide the local site's name, select which pools will have mirroring enabled, and click\xA0 " + "\ufffd#10\ufffd" + "Generate" + "\ufffd/#10\ufffd" + ".",o="Site Name",i="Name...",_="Pools",r="Generate",c="Token",d="Generated token...",g="Close",f="This field is required.",I="At least one pool is required.",[[3,"modalRef"],[1,"modal-title"],s,[1,"modal-content"],["name","createBootstrapForm","novalidate","",1,"form",3,"formGroup"],["formDir","ngForm"],[1,"modal-body"],t,[1,"form-group"],["for","siteName",1,"col-form-label","required"],o,["type","text","placeholder",i,"id","siteName","name","siteName","formControlName","siteName","autofocus","",1,"form-control"],["class","invalid-feedback",4,"ngIf"],["formGroupName","pools",1,"form-group"],["for","pools",1,"col-form-label","required"],_,["class","custom-control custom-checkbox",4,"ngFor","ngForOf"],[1,"mb-4","float-right",3,"form","submitAction"],r,["for","token",1,"col-form-label"],c,["placeholder",d,"id","token","formControlName","token","readonly","",1,"form-control","resize-vertical"],["source","token",1,"float-right"],[1,"modal-footer"],["name",g,3,"backAction"],[1,"invalid-feedback"],f,[1,"custom-control","custom-checkbox"],["type","checkbox",1,"custom-control-input",3,"id","name","formControlName"],[1,"custom-control-label",3,"for"],I]},template:function(t,o){if(1&t&&(e.TgZ(0,"cd-modal",0),e.ynx(1,1),e.SDv(2,2),e.BQk(),e.ynx(3,3),e.TgZ(4,"form",4,5),e.TgZ(6,"div",6),e.TgZ(7,"p"),e.ynx(8),e.tHW(9,7),e._UZ(10,"kbd"),e.N_p(),e.BQk(),e.qZA(),e.TgZ(11,"div",8),e.TgZ(12,"label",9),e.SDv(13,10),e.qZA(),e._UZ(14,"input",11),e.YNc(15,ci,2,0,"span",12),e.qZA(),e.TgZ(16,"div",13),e.TgZ(17,"label",14),e.SDv(18,15),e.qZA(),e.YNc(19,di,4,5,"div",16),e.YNc(20,pi,2,0,"span",12),e.qZA(),e.TgZ(21,"cd-submit-button",17),e.NdJ("submitAction",function(){return o.generate()}),e.SDv(22,18),e.qZA(),e.TgZ(23,"div",8),e.TgZ(24,"label",19),e.TgZ(25,"span"),e.SDv(26,20),e.qZA(),e.qZA(),e.TgZ(27,"textarea",21),e._uU(28,"          "),e.qZA(),e.qZA(),e._UZ(29,"cd-copy-2-clipboard-button",22),e.qZA(),e.TgZ(30,"div",23),e.TgZ(31,"cd-back-button",24),e.NdJ("backAction",function(){return o.activeModal.close()}),e.qZA(),e.qZA(),e.qZA(),e.BQk(),e.qZA()),2&t){const i=e.MAs(5);e.Q6J("modalRef",o.activeModal),e.xp6(4),e.Q6J("formGroup",o.createBootstrapForm),e.xp6(11),e.Q6J("ngIf",o.createBootstrapForm.showError("siteName",i,"required")),e.xp6(4),e.Q6J("ngForOf",o.pools),e.xp6(1),e.Q6J("ngIf",o.createBootstrapForm.showError("pools",i,"requirePool")),e.xp6(1),e.Q6J("form",o.createBootstrapForm)}},directives:[C.z,a._Y,a.JL,h.V,a.sg,O.P,$.o,a.Fj,k.b,a.JJ,a.u,Re.U,l.O5,a.x0,l.sg,ri.w,Ye.s,li.W,a.Wl],styles:[".form-group.ng-invalid[_ngcontent-%COMP%]   .invalid-feedback[_ngcontent-%COMP%]{display:block}"]}),n})();function ui(n,s){1&n&&(e.TgZ(0,"span",26),e.SDv(1,27),e.qZA())}function mi(n,s){if(1&n&&(e.TgZ(0,"option",28),e._uU(1),e.qZA()),2&n){const t=s.$implicit;e.Q6J("value",t.key),e.xp6(1),e.Oqu(t.desc)}}function Ti(n,s){if(1&n&&(e.TgZ(0,"div",29),e._UZ(1,"input",30),e.TgZ(2,"label",31),e._uU(3),e.qZA(),e.qZA()),2&n){const t=s.$implicit;e.xp6(1),e.s9C("id",t.name),e.s9C("name",t.name),e.s9C("formControlName",t.name),e.xp6(1),e.s9C("for",t.name),e.xp6(1),e.Oqu(t.name)}}function fi(n,s){1&n&&(e.TgZ(0,"span",26),e.SDv(1,32),e.qZA())}function Ci(n,s){1&n&&(e.TgZ(0,"span",26),e.SDv(1,33),e.qZA())}function Si(n,s){1&n&&(e.TgZ(0,"span",26),e.SDv(1,34),e.qZA())}let Ei=(()=>{class n{constructor(t,o,i,_){this.activeModal=t,this.actionLabels=o,this.rbdMirroringService=i,this.taskWrapper=_,this.pools=[],this.directions=[{key:"rx-tx",desc:"Bidirectional"},{key:"rx",desc:"Unidirectional (receive-only)"}],this.createForm()}createForm(){this.importBootstrapForm=new x.d({siteName:new a.NI("",{validators:[a.kI.required]}),direction:new a.NI("rx-tx",{}),pools:new a.cw({},{validators:[this.validatePools()]}),token:new a.NI("",{validators:[a.kI.required,this.validateToken()]})})}ngOnInit(){this.rbdMirroringService.getSiteName().subscribe(t=>{this.importBootstrapForm.get("siteName").setValue(t.site_name)}),this.subs=this.rbdMirroringService.subscribeSummary(t=>{this.pools=t.content_data.pools.reduce((_,r)=>(_.push({name:r.name,mirror_mode:r.mirror_mode}),_),[]);const i=this.importBootstrapForm.get("pools");S().each(this.pools,_=>{const r=_.name,c="disabled"===_.mirror_mode,d=i.controls[r];d?c&&d.disabled?d.enable():!c&&d.enabled&&(d.disable(),d.setValue(!0)):i.addControl(r,new a.NI({value:!c,disabled:!c}))})})}ngOnDestroy(){this.subs&&this.subs.unsubscribe()}validatePools(){return t=>{let o=0;return S().each(t.controls,i=>{!0===i.value&&++o}),o>0?null:{requirePool:!0}}}validateToken(){return t=>{try{if(JSON.parse(atob(t.value)))return null}catch(o){}return{invalidToken:!0}}}import(){const t=[],o=[],i=this.importBootstrapForm.get("pools");S().each(i.controls,(g,f)=>{!0===g.value&&(t.push(f),g.disabled||o.push(f))});const _={mirror_mode:"image"};let r=(0,nt.z)(this.rbdMirroringService.setSiteName(this.importBootstrapForm.getValue("siteName")),(0,le.D)(o.map(g=>this.rbdMirroringService.updatePool(g,_))));r=t.reduce((g,f)=>(0,nt.z)(g,this.rbdMirroringService.importBootstrapToken(f,this.importBootstrapForm.getValue("direction"),this.importBootstrapForm.getValue("token"))),r).pipe((0,Et.Z)());const c=()=>{this.rbdMirroringService.refresh(),this.importBootstrapForm.setErrors({cdSubmitButton:!0})};this.taskWrapper.wrapTaskAroundCall({task:new R.R("rbd/mirroring/bootstrap/import",{}),call:r}).subscribe({error:c,complete:()=>{c(),this.activeModal.close()}})}}return n.\u0275fac=function(t){return new(t||n)(e.Y36(N.Kz),e.Y36(v.p4),e.Y36(K),e.Y36(u.P))},n.\u0275cmp=e.Xpm({type:n,selectors:[["cd-bootstrap-import-modal"]],decls:36,vars:10,consts:function(){let s,t,o,i,_,r,c,d,g,f,I,P;return s="Import Bootstrap Token",t="To import a bootstrap token which was created by a peer site cluster, provide the local site's name, select which pools will have mirroring enabled, provide the generated token, and click\xA0" + "\ufffd#10\ufffd" + "Import" + "\ufffd/#10\ufffd" + ".",o="Site Name",i="Name...",_="Direction",r="Pools",c="Token",d="Generated token...",g="This field is required.",f="At least one pool is required.",I="This field is required.",P="The token is invalid.",[[3,"modalRef"],[1,"modal-title"],s,[1,"modal-content"],["name","importBootstrapForm","novalidate","",1,"form",3,"formGroup"],["formDir","ngForm"],[1,"modal-body"],t,[1,"form-group"],["for","siteName",1,"col-form-label","required"],o,["type","text","placeholder",i,"id","siteName","name","siteName","formControlName","siteName","autofocus","",1,"form-control"],["class","invalid-feedback",4,"ngIf"],["for","direction",1,"col-form-label"],_,["id","direction","name","direction","formControlName","direction",1,"form-control"],[3,"value",4,"ngFor","ngForOf"],["formGroupName","pools",1,"form-group"],["for","pools",1,"col-form-label","required"],r,["class","custom-control custom-checkbox",4,"ngFor","ngForOf"],["for","token",1,"col-form-label","required"],c,["placeholder",d,"id","token","formControlName","token",1,"form-control","resize-vertical"],[1,"modal-footer"],[3,"form","submitText","submitActionEvent"],[1,"invalid-feedback"],g,[3,"value"],[1,"custom-control","custom-checkbox"],["type","checkbox",1,"custom-control-input",3,"id","name","formControlName"],[1,"custom-control-label",3,"for"],f,I,P]},template:function(t,o){if(1&t&&(e.TgZ(0,"cd-modal",0),e.ynx(1,1),e.SDv(2,2),e.BQk(),e.ynx(3,3),e.TgZ(4,"form",4,5),e.TgZ(6,"div",6),e.TgZ(7,"p"),e.ynx(8),e.tHW(9,7),e._UZ(10,"kbd"),e.N_p(),e.BQk(),e.qZA(),e.TgZ(11,"div",8),e.TgZ(12,"label",9),e.SDv(13,10),e.qZA(),e._UZ(14,"input",11),e.YNc(15,ui,2,0,"span",12),e.qZA(),e.TgZ(16,"div",8),e.TgZ(17,"label",13),e.TgZ(18,"span"),e.SDv(19,14),e.qZA(),e.qZA(),e.TgZ(20,"select",15),e.YNc(21,mi,2,2,"option",16),e.qZA(),e.qZA(),e.TgZ(22,"div",17),e.TgZ(23,"label",18),e.SDv(24,19),e.qZA(),e.YNc(25,Ti,4,5,"div",20),e.YNc(26,fi,2,0,"span",12),e.qZA(),e.TgZ(27,"div",8),e.TgZ(28,"label",21),e.SDv(29,22),e.qZA(),e.TgZ(30,"textarea",23),e._uU(31,"          "),e.qZA(),e.YNc(32,Ci,2,0,"span",12),e.YNc(33,Si,2,0,"span",12),e.qZA(),e.qZA(),e.TgZ(34,"div",24),e.TgZ(35,"cd-form-button-panel",25),e.NdJ("submitActionEvent",function(){return o.import()}),e.qZA(),e.qZA(),e.qZA(),e.BQk(),e.qZA()),2&t){const i=e.MAs(5);e.Q6J("modalRef",o.activeModal),e.xp6(4),e.Q6J("formGroup",o.importBootstrapForm),e.xp6(11),e.Q6J("ngIf",o.importBootstrapForm.showError("siteName",i,"required")),e.xp6(6),e.Q6J("ngForOf",o.directions),e.xp6(4),e.Q6J("ngForOf",o.pools),e.xp6(1),e.Q6J("ngIf",o.importBootstrapForm.showError("pools",i,"requirePool")),e.xp6(6),e.Q6J("ngIf",o.importBootstrapForm.showError("token",i,"required")),e.xp6(1),e.Q6J("ngIf",o.importBootstrapForm.showError("token",i,"invalidToken")),e.xp6(2),e.Q6J("form",o.importBootstrapForm)("submitText",o.actionLabels.SUBMIT)}},directives:[C.z,a._Y,a.JL,h.V,a.sg,O.P,$.o,a.Fj,k.b,a.JJ,a.u,Re.U,l.O5,a.EJ,l.sg,a.x0,j.p,a.YN,a.Kr,a.Wl],styles:[""]}),n})();var se=p(69158),Ri=p(58111);let it=(()=>{class n{transform(t){return"warning"===t?"badge badge-warning":"error"===t?"badge badge-danger":"success"===t?"badge badge-success":"badge badge-info"}}return n.\u0275fac=function(t){return new(t||n)},n.\u0275pipe=e.Yjl({name:"mirrorHealthColor",type:n,pure:!0}),n})();const Mi=["healthTmpl"];function Oi(n,s){if(1&n&&(e.TgZ(0,"span",2),e.ALo(1,"mirrorHealthColor"),e._uU(2),e.qZA()),2&n){const o=s.value;e.Q6J("ngClass",e.lcZ(1,2,s.row.health_color)),e.xp6(2),e.Oqu(o)}}let Ai=(()=>{class n{constructor(t,o){this.rbdMirroringService=t,this.cephShortVersionPipe=o,this.tableStatus=new se.E}ngOnInit(){this.columns=[{prop:"instance_id",name:"Instance",flexGrow:2},{prop:"id",name:"ID",flexGrow:2},{prop:"server_hostname",name:"Hostname",flexGrow:2},{prop:"version",name:"Version",pipe:this.cephShortVersionPipe,flexGrow:2},{prop:"health",name:"Health",cellTemplate:this.healthTmpl,flexGrow:1}],this.subs=this.rbdMirroringService.subscribeSummary(t=>{this.data=t.content_data.daemons,this.tableStatus=new se.E(t.status)})}ngOnDestroy(){this.subs.unsubscribe()}refresh(){this.rbdMirroringService.refresh()}}return n.\u0275fac=function(t){return new(t||n)(e.Y36(K),e.Y36(Ri.F))},n.\u0275cmp=e.Xpm({type:n,selectors:[["cd-mirroring-daemons"]],viewQuery:function(t,o){if(1&t&&e.Gf(Mi,7),2&t){let i;e.iGM(i=e.CRH())&&(o.healthTmpl=i.first)}},decls:3,vars:4,consts:[["columnMode","flex",3,"data","columns","autoReload","status","fetchData"],["healthTmpl",""],[3,"ngClass"]],template:function(t,o){1&t&&(e.TgZ(0,"cd-table",0),e.NdJ("fetchData",function(){return o.refresh()}),e.qZA(),e.YNc(1,Oi,3,4,"ng-template",null,1,e.W1O)),2&t&&e.Q6J("data",o.data)("columns",o.columns)("autoReload",-1)("status",o.tableStatus)},directives:[W.a,l.mk],pipes:[it],styles:[""]}),n})();var Rt=p(18891);class hi{}function Pi(n,s){1&n&&(e.TgZ(0,"span",24),e.SDv(1,25),e.qZA())}function Ii(n,s){1&n&&(e.TgZ(0,"span",24),e.SDv(1,26),e.qZA())}function bi(n,s){1&n&&(e.TgZ(0,"span",24),e.SDv(1,27),e.qZA())}function Ni(n,s){1&n&&(e.TgZ(0,"span",24),e.SDv(1,28),e.qZA())}function Fi(n,s){1&n&&(e.TgZ(0,"span",24),e.SDv(1,29),e.qZA())}function Di(n,s){1&n&&(e.TgZ(0,"span",24),e.SDv(1,30),e.qZA())}let vi=(()=>{class n{constructor(t,o,i,_){this.activeModal=t,this.actionLabels=o,this.rbdMirroringService=i,this.taskWrapper=_,this.bsConfig={containerClass:"theme-default"},this.createForm()}createForm(){this.editPeerForm=new x.d({clusterName:new a.NI("",{validators:[a.kI.required,this.validateClusterName]}),clientID:new a.NI("",{validators:[a.kI.required,this.validateClientID]}),monAddr:new a.NI("",{validators:[this.validateMonAddr]}),key:new a.NI("",{validators:[this.validateKey]})})}ngOnInit(){this.pattern=`${this.poolName}/${this.peerUUID}`,"edit"===this.mode&&this.rbdMirroringService.getPeer(this.poolName,this.peerUUID).subscribe(t=>{this.setResponse(t)})}validateClusterName(t){if(!t.value.match(/^[\w\-_]*$/))return{invalidClusterName:{value:t.value}}}validateClientID(t){if(!t.value.match(/^(?!client\.)[\w\-_.]*$/))return{invalidClientID:{value:t.value}}}validateMonAddr(t){if(!t.value.match(/^[,; ]*([\w.\-_\[\]]+(:[\d]+)?[,; ]*)*$/))return{invalidMonAddr:{value:t.value}}}validateKey(t){try{if(""===t.value||atob(t.value))return null}catch(o){}return{invalidKey:{value:t.value}}}setResponse(t){this.response=t,this.editPeerForm.get("clusterName").setValue(t.cluster_name),this.editPeerForm.get("clientID").setValue(t.client_id),this.editPeerForm.get("monAddr").setValue(t.mon_host),this.editPeerForm.get("key").setValue(t.key)}update(){const t=new hi;let o;t.cluster_name=this.editPeerForm.getValue("clusterName"),t.client_id=this.editPeerForm.getValue("clientID"),t.mon_host=this.editPeerForm.getValue("monAddr"),t.key=this.editPeerForm.getValue("key"),o=this.taskWrapper.wrapTaskAroundCall("edit"===this.mode?{task:new R.R("rbd/mirroring/peer/edit",{pool_name:this.poolName}),call:this.rbdMirroringService.updatePeer(this.poolName,this.peerUUID,t)}:{task:new R.R("rbd/mirroring/peer/add",{pool_name:this.poolName}),call:this.rbdMirroringService.addPeer(this.poolName,t)}),o.subscribe({error:()=>this.editPeerForm.setErrors({cdSubmitButton:!0}),complete:()=>{this.rbdMirroringService.refresh(),this.activeModal.close()}})}}return n.\u0275fac=function(t){return new(t||n)(e.Y36(N.Kz),e.Y36(v.p4),e.Y36(K),e.Y36(u.P))},n.\u0275cmp=e.Xpm({type:n,selectors:[["cd-pool-edit-peer-modal"]],decls:38,vars:13,consts:function(){let s,t,o,i,_,r,c,d,g,f,I,P,Z,B,Q,Y,ee,te;return s="{VAR_SELECT, select, edit {Edit} other {Add}}",s=e.Zx4(s,{VAR_SELECT:"\ufffd0\ufffd"}),t="" + s + " pool mirror peer",o="{VAR_SELECT, select, edit {Edit} other {Add}}",o=e.Zx4(o,{VAR_SELECT:"\ufffd0\ufffd"}),i="" + o + " the pool mirror peer attributes for pool " + "[\ufffd#10\ufffd|\ufffd#11\ufffd]" + "" + "\ufffd1\ufffd" + "" + "[\ufffd/#10\ufffd|\ufffd/#11\ufffd]" + " and click " + "[\ufffd#10\ufffd|\ufffd#11\ufffd]" + "Submit" + "[\ufffd/#10\ufffd|\ufffd/#11\ufffd]" + ".",i=e.Zx4(i),_="Cluster Name",r="Name...",c="CephX ID",d="CephX ID...",g="Monitor Addresses",f="Comma-delimited addresses...",I="CephX Key",P="Base64-encoded key...",Z="This field is required.",B="The cluster name is not valid.",Q="This field is required.",Y="The CephX ID is not valid.",ee="The monitory address is not valid.",te="CephX key must be base64 encoded.",[[3,"modalRef"],[1,"modal-title"],t,[1,"modal-content"],["name","editPeerForm","novalidate","",1,"form",3,"formGroup"],["formDir","ngForm"],[1,"modal-body"],i,[1,"form-group"],["for","clusterName",1,"col-form-label","required"],_,["type","text","placeholder",r,"id","clusterName","name","clusterName","formControlName","clusterName","autofocus","",1,"form-control"],["class","invalid-feedback",4,"ngIf"],["for","clientID",1,"col-form-label","required"],c,["type","text","placeholder",d,"id","clientID","name","clientID","formControlName","clientID",1,"form-control"],["for","monAddr",1,"col-form-label"],g,["type","text","placeholder",f,"id","monAddr","name","monAddr","formControlName","monAddr",1,"form-control"],["for","key",1,"col-form-label"],I,["type","text","placeholder",P,"id","key","name","key","formControlName","key",1,"form-control"],[1,"modal-footer"],[3,"form","submitText","submitActionEvent"],[1,"invalid-feedback"],Z,B,Q,Y,ee,te]},template:function(t,o){if(1&t&&(e.TgZ(0,"cd-modal",0),e.TgZ(1,"span",1),e.SDv(2,2),e.qZA(),e.ynx(3,3),e.TgZ(4,"form",4,5),e.TgZ(6,"div",6),e.TgZ(7,"p"),e.TgZ(8,"span"),e.tHW(9,7),e._UZ(10,"kbd"),e._UZ(11,"kbd"),e.N_p(),e.qZA(),e.qZA(),e.TgZ(12,"div",8),e.TgZ(13,"label",9),e.SDv(14,10),e.qZA(),e._UZ(15,"input",11),e.YNc(16,Pi,2,0,"span",12),e.YNc(17,Ii,2,0,"span",12),e.qZA(),e.TgZ(18,"div",8),e.TgZ(19,"label",13),e.SDv(20,14),e.qZA(),e._UZ(21,"input",15),e.YNc(22,bi,2,0,"span",12),e.YNc(23,Ni,2,0,"span",12),e.qZA(),e.TgZ(24,"div",8),e.TgZ(25,"label",16),e.TgZ(26,"span"),e.SDv(27,17),e.qZA(),e.qZA(),e._UZ(28,"input",18),e.YNc(29,Fi,2,0,"span",12),e.qZA(),e.TgZ(30,"div",8),e.TgZ(31,"label",19),e.TgZ(32,"span"),e.SDv(33,20),e.qZA(),e.qZA(),e._UZ(34,"input",21),e.YNc(35,Di,2,0,"span",12),e.qZA(),e.qZA(),e.TgZ(36,"div",22),e.TgZ(37,"cd-form-button-panel",23),e.NdJ("submitActionEvent",function(){return o.update()}),e.qZA(),e.qZA(),e.qZA(),e.BQk(),e.qZA()),2&t){const i=e.MAs(5);e.Q6J("modalRef",o.activeModal),e.xp6(2),e.pQV(o.mode),e.QtT(2),e.xp6(2),e.Q6J("formGroup",o.editPeerForm),e.xp6(7),e.pQV(o.mode)(o.poolName),e.QtT(9),e.xp6(5),e.Q6J("ngIf",o.editPeerForm.showError("clusterName",i,"required")),e.xp6(1),e.Q6J("ngIf",o.editPeerForm.showError("clusterName",i,"invalidClusterName")),e.xp6(5),e.Q6J("ngIf",o.editPeerForm.showError("clientID",i,"required")),e.xp6(1),e.Q6J("ngIf",o.editPeerForm.showError("clientID",i,"invalidClientID")),e.xp6(6),e.Q6J("ngIf",o.editPeerForm.showError("monAddr",i,"invalidMonAddr")),e.xp6(6),e.Q6J("ngIf",o.editPeerForm.showError("key",i,"invalidKey")),e.xp6(2),e.Q6J("form",o.editPeerForm)("submitText",o.actionLabels.SUBMIT)}},directives:[C.z,a._Y,a.JL,h.V,a.sg,O.P,$.o,a.Fj,k.b,a.JJ,a.u,Re.U,l.O5,j.p],styles:[""]}),n})();const Li=["healthTmpl"];function $i(n,s){if(1&n&&(e.TgZ(0,"span",4),e.ALo(1,"mirrorHealthColor"),e._uU(2),e.qZA()),2&n){const o=s.value;e.Q6J("ngClass",e.lcZ(1,2,s.row.health_color)),e.xp6(2),e.Oqu(o)}}let Bi=(()=>{class n{constructor(t,o,i,_,r){this.authStorageService=t,this.rbdMirroringService=o,this.modalService=i,this.taskWrapper=_,this.router=r,this.selection=new Se.r,this.tableStatus=new se.E,this.data=[],this.permission=this.authStorageService.getPermissions().rbdMirroring;const c={permission:"update",icon:T.P.edit,click:()=>this.editModeModal(),name:"Edit Mode",canBePrimary:()=>!0},d={permission:"create",icon:T.P.add,name:"Add Peer",click:()=>this.editPeersModal("add"),disable:()=>!this.selection.first()||"disabled"===this.selection.first().mirror_mode,visible:()=>!this.getPeerUUID(),canBePrimary:()=>!1},g={permission:"update",icon:T.P.exchange,name:"Edit Peer",click:()=>this.editPeersModal("edit"),visible:()=>!!this.getPeerUUID()},f={permission:"delete",icon:T.P.destroy,name:"Delete Peer",click:()=>this.deletePeersModal(),visible:()=>!!this.getPeerUUID()};this.tableActions=[c,d,g,f]}ngOnInit(){this.columns=[{prop:"name",name:"Name",flexGrow:2},{prop:"mirror_mode",name:"Mode",flexGrow:2},{prop:"leader_id",name:"Leader",flexGrow:2},{prop:"image_local_count",name:"# Local",flexGrow:2},{prop:"image_remote_count",name:"# Remote",flexGrow:2},{prop:"health",name:"Health",cellTemplate:this.healthTmpl,flexGrow:1}],this.subs=this.rbdMirroringService.subscribeSummary(t=>{this.data=t.content_data.pools,this.tableStatus=new se.E(t.status)})}ngOnDestroy(){this.subs.unsubscribe()}refresh(){this.rbdMirroringService.refresh()}editModeModal(){this.router.navigate(["/block/mirroring",{outlets:{modal:[v.MQ.EDIT,this.selection.first().name]}}])}editPeersModal(t){const o={poolName:this.selection.first().name,mode:t};"edit"===t&&(o.peerUUID=this.getPeerUUID()),this.modalRef=this.modalService.show(vi,o)}deletePeersModal(){const t=this.selection.first().name,o=this.getPeerUUID();this.modalRef=this.modalService.show(pe.M,{itemDescription:"mirror peer",itemNames:[`${t} (${o})`],submitActionObservable:()=>new Rt.y(i=>{this.taskWrapper.wrapTaskAroundCall({task:new R.R("rbd/mirroring/peer/delete",{pool_name:t}),call:this.rbdMirroringService.deletePeer(t,o)}).subscribe({error:_=>i.error(_),complete:()=>{this.rbdMirroringService.refresh(),i.complete()}})})})}getPeerUUID(){const t=this.selection.first(),o=this.data.find(i=>t&&t.name===i.name);if(o&&o.peer_uuids)return o.peer_uuids[0]}updateSelection(t){this.selection=t}}return n.\u0275fac=function(t){return new(t||n)(e.Y36(oe.j),e.Y36(K),e.Y36(de.Z),e.Y36(u.P),e.Y36(m.F0))},n.\u0275cmp=e.Xpm({type:n,selectors:[["cd-mirroring-pools"]],viewQuery:function(t,o){if(1&t&&e.Gf(Li,7),2&t){let i;e.iGM(i=e.CRH())&&(o.healthTmpl=i.first)}},decls:5,vars:7,consts:[["columnMode","flex","identifier","name","forceIdentifier","true","selectionType","single",3,"data","columns","autoReload","status","fetchData","updateSelection"],[1,"table-actions",3,"permission","selection","tableActions"],["healthTmpl",""],["name","modal"],[3,"ngClass"]],template:function(t,o){1&t&&(e.TgZ(0,"cd-table",0),e.NdJ("fetchData",function(){return o.refresh()})("updateSelection",function(_){return o.updateSelection(_)}),e._UZ(1,"cd-table-actions",1),e.qZA(),e.YNc(2,$i,3,4,"ng-template",null,2,e.W1O),e._UZ(4,"router-outlet",3)),2&t&&(e.Q6J("data",o.data)("columns",o.columns)("autoReload",-1)("status",o.tableStatus),e.xp6(1),e.Q6J("permission",o.permission)("selection",o.selection)("tableActions",o.tableActions))},directives:[W.a,Ee.K,m.lC,l.mk],pipes:[it],styles:[""]}),n})();var Mt=p(59376);const Gi=["stateTmpl"],yi=["syncTmpl"],xi=["progressTmpl"];function wi(n,s){if(1&n){const t=e.EpF();e.TgZ(0,"cd-table",13),e.NdJ("fetchData",function(){return e.CHM(t),e.oxw().refresh()}),e.qZA()}if(2&n){const t=e.oxw();e.Q6J("data",t.image_error.data)("columns",t.image_error.columns)("autoReload",-1)("status",t.tableStatus)}}function qi(n,s){if(1&n){const t=e.EpF();e.TgZ(0,"cd-table",13),e.NdJ("fetchData",function(){return e.CHM(t),e.oxw().refresh()}),e.qZA()}if(2&n){const t=e.oxw();e.Q6J("data",t.image_syncing.data)("columns",t.image_syncing.columns)("autoReload",-1)("status",t.tableStatus)}}function Hi(n,s){if(1&n){const t=e.EpF();e.TgZ(0,"cd-table",13),e.NdJ("fetchData",function(){return e.CHM(t),e.oxw().refresh()}),e.qZA()}if(2&n){const t=e.oxw();e.Q6J("data",t.image_ready.data)("columns",t.image_ready.columns)("autoReload",-1)("status",t.tableStatus)}}function ki(n,s){if(1&n&&(e.TgZ(0,"span",14),e.ALo(1,"mirrorHealthColor"),e._uU(2),e.qZA()),2&n){const o=s.value;e.Q6J("ngClass",e.lcZ(1,2,s.row.state_color)),e.xp6(2),e.Oqu(o)}}function Ki(n,s){1&n&&e._UZ(0,"div")}function Xi(n,s){if(1&n&&e._UZ(0,"ngb-progressbar",17),2&n){const t=e.oxw().value;e.Q6J("value",t)("showValue",!0)}}function Qi(n,s){if(1&n&&(e.YNc(0,Ki,1,0,"div",15),e.YNc(1,Xi,1,2,"ngb-progressbar",16)),2&n){const t=s.row;e.Q6J("ngIf","Replaying"===t.state),e.xp6(1),e.Q6J("ngIf","Syncing"===t.state)}}let zi=(()=>{class n{constructor(t){this.rbdMirroringService=t,this.image_error={data:[],columns:{}},this.image_syncing={data:[],columns:{}},this.image_ready={data:[],columns:{}},this.tableStatus=new se.E}ngOnInit(){this.image_error.columns=[{prop:"pool_name",name:"Pool",flexGrow:2},{prop:"name",name:"Image",flexGrow:2},{prop:"state",name:"State",cellTemplate:this.stateTmpl,flexGrow:1},{prop:"description",name:"Issue",flexGrow:4}],this.image_syncing.columns=[{prop:"pool_name",name:"Pool",flexGrow:2},{prop:"name",name:"Image",flexGrow:2},{prop:"state",name:"State",cellTemplate:this.stateTmpl,flexGrow:1},{prop:"progress",name:"Progress",cellTemplate:this.progressTmpl,flexGrow:2},{prop:"bytes_per_second",name:"Bytes per second",flexGrow:2},{prop:"entries_behind_primary",name:"Entries behind primary",flexGrow:2}],this.image_ready.columns=[{prop:"pool_name",name:"Pool",flexGrow:2},{prop:"name",name:"Image",flexGrow:2},{prop:"state",name:"State",cellTemplate:this.stateTmpl,flexGrow:1},{prop:"description",name:"Description",flexGrow:4}],this.subs=this.rbdMirroringService.subscribeSummary(t=>{this.image_error.data=t.content_data.image_error,this.image_syncing.data=t.content_data.image_syncing,this.image_ready.data=t.content_data.image_ready,this.tableStatus=new se.E(t.status)})}ngOnDestroy(){this.subs.unsubscribe()}refresh(){this.rbdMirroringService.refresh()}}return n.\u0275fac=function(t){return new(t||n)(e.Y36(K))},n.\u0275cmp=e.Xpm({type:n,selectors:[["cd-mirroring-images"]],viewQuery:function(t,o){if(1&t&&(e.Gf(Gi,7),e.Gf(yi,7),e.Gf(xi,7)),2&t){let i;e.iGM(i=e.CRH())&&(o.stateTmpl=i.first),e.iGM(i=e.CRH())&&(o.syncTmpl=i.first),e.iGM(i=e.CRH())&&(o.progressTmpl=i.first)}},decls:19,vars:4,consts:function(){let s,t,o;return s="Issues (" + "\ufffd0\ufffd" + ")",t="Syncing (" + "\ufffd0\ufffd" + ")",o="Ready (" + "\ufffd0\ufffd" + ")",[["ngbNav","","cdStatefulTab","image-list",1,"nav-tabs"],["nav","ngbNav"],["ngbNavItem","issues"],["ngbNavLink",""],s,["ngbNavContent",""],["ngbNavItem","syncing"],t,["ngbNavItem","ready"],o,[3,"ngbNavOutlet"],["stateTmpl",""],["progressTmpl",""],["columnMode","flex",3,"data","columns","autoReload","status","fetchData"],[3,"ngClass"],[4,"ngIf"],["type","info",3,"value","showValue",4,"ngIf"],["type","info",3,"value","showValue"]]},template:function(t,o){if(1&t&&(e.TgZ(0,"ul",0,1),e.TgZ(2,"li",2),e.TgZ(3,"a",3),e.SDv(4,4),e.qZA(),e.YNc(5,wi,1,4,"ng-template",5),e.qZA(),e.TgZ(6,"li",6),e.TgZ(7,"a",3),e.SDv(8,7),e.qZA(),e.YNc(9,qi,1,4,"ng-template",5),e.qZA(),e.TgZ(10,"li",8),e.TgZ(11,"a",3),e.SDv(12,9),e.qZA(),e.YNc(13,Hi,1,4,"ng-template",5),e.qZA(),e.qZA(),e._UZ(14,"div",10),e.YNc(15,ki,3,4,"ng-template",null,11,e.W1O),e.YNc(17,Qi,2,2,"ng-template",null,12,e.W1O)),2&t){const i=e.MAs(1);e.xp6(4),e.pQV(o.image_error.data.length),e.QtT(4),e.xp6(4),e.pQV(o.image_syncing.data.length),e.QtT(8),e.xp6(4),e.pQV(o.image_ready.data.length),e.QtT(12),e.xp6(2),e.Q6J("ngbNavOutlet",i)}},directives:[N.Pz,Mt.m,N.nv,N.Vx,N.uN,N.tO,W.a,l.mk,l.O5,N.Ly],pipes:[it],styles:[""]}),n})();function Ji(n,s){if(1&n&&e._UZ(0,"i",18),2&n){const t=e.oxw();e.Q6J("ngClass",t.icons.edit)}}function Yi(n,s){if(1&n&&e._UZ(0,"i",18),2&n){const t=e.oxw();e.Q6J("ngClass",t.icons.check)}}let Vi=(()=>{class n{constructor(t,o,i,_){this.authStorageService=t,this.rbdMirroringService=o,this.modalService=i,this.taskWrapper=_,this.selection=new Se.r,this.peersExist=!0,this.subs=new ii.w,this.editing=!1,this.icons=T.P,this.permission=this.authStorageService.getPermissions().rbdMirroring;const r={permission:"update",icon:T.P.upload,click:()=>this.createBootstrapModal(),name:"Create Bootstrap Token",canBePrimary:()=>!0,disable:()=>!1},c={permission:"update",icon:T.P.download,click:()=>this.importBootstrapModal(),name:"Import Bootstrap Token",disable:()=>this.peersExist};this.tableActions=[r,c]}ngOnInit(){this.createForm(),this.subs.add(this.rbdMirroringService.startPolling()),this.subs.add(this.rbdMirroringService.subscribeSummary(t=>{this.status=t.content_data.status,this.peersExist=!!t.content_data.pools.find(o=>o.peer_uuids.length>0)})),this.rbdMirroringService.getSiteName().subscribe(t=>{this.siteName=t.site_name,this.rbdmirroringForm.get("siteName").setValue(this.siteName)})}createForm(){this.rbdmirroringForm=new x.d({siteName:new a.NI({value:"",disabled:!0})})}ngOnDestroy(){this.subs.unsubscribe()}updateSiteName(){this.editing&&this.taskWrapper.wrapTaskAroundCall({task:new R.R("rbd/mirroring/site_name/edit",{}),call:this.rbdMirroringService.setSiteName(this.rbdmirroringForm.getValue("siteName"))}).subscribe({complete:()=>{this.rbdMirroringService.refresh()}}),this.editing=!this.editing}createBootstrapModal(){this.modalRef=this.modalService.show(gi,{siteName:this.siteName})}importBootstrapModal(){this.modalRef=this.modalService.show(Ei,{siteName:this.siteName})}}return n.\u0275fac=function(t){return new(t||n)(e.Y36(oe.j),e.Y36(K),e.Y36(de.Z),e.Y36(u.P))},n.\u0275cmp=e.Xpm({type:n,selectors:[["cd-mirroring"]],decls:29,vars:9,consts:function(){let s,t,o,i;return s="Site Name",t="Daemons",o="Pools",i="Images",[[1,"row"],[1,"col-md-12"],["name","rbdmirroringForm","novalidate","",3,"formGroup"],["formDir","ngForm"],[1,"d-flex","flex-row"],["for","siteName",1,"col-form-label"],s,[1,"col-md-4","input-group","mb-3","mr-auto"],["type","text","id","siteName","name","siteName","formControlName","siteName",1,"form-control"],[1,"input-group-append"],["id","editSiteName",1,"btn","btn-light",3,"click"],[3,"ngClass",4,"ngIf"],[3,"source","byId"],[1,"table-actions",3,"permission","selection","tableActions"],[1,"col-sm-6"],t,o,i,[3,"ngClass"]]},template:function(t,o){1&t&&(e.TgZ(0,"div",0),e.TgZ(1,"div",1),e.TgZ(2,"form",2,3),e.TgZ(4,"div",4),e.TgZ(5,"label",5),e.SDv(6,6),e.qZA(),e.TgZ(7,"div",7),e._UZ(8,"input",8),e.TgZ(9,"div",9),e.TgZ(10,"button",10),e.NdJ("click",function(){return o.updateSiteName()}),e.YNc(11,Ji,1,1,"i",11),e.YNc(12,Yi,1,1,"i",11),e.qZA(),e._UZ(13,"cd-copy-2-clipboard-button",12),e.qZA(),e.qZA(),e._UZ(14,"cd-table-actions",13),e.qZA(),e.qZA(),e.qZA(),e.qZA(),e.TgZ(15,"div",0),e.TgZ(16,"div",14),e.TgZ(17,"legend"),e.SDv(18,15),e.qZA(),e._UZ(19,"cd-mirroring-daemons"),e.qZA(),e.TgZ(20,"div",14),e.TgZ(21,"legend"),e.SDv(22,16),e.qZA(),e._UZ(23,"cd-mirroring-pools"),e.qZA(),e.qZA(),e.TgZ(24,"div",0),e.TgZ(25,"div",1),e.TgZ(26,"legend"),e.SDv(27,17),e.qZA(),e._UZ(28,"cd-mirroring-images"),e.qZA(),e.qZA()),2&t&&(e.xp6(2),e.Q6J("formGroup",o.rbdmirroringForm),e.xp6(6),e.uIk("disabled",!o.editing||null),e.xp6(3),e.Q6J("ngIf",!o.editing),e.xp6(1),e.Q6J("ngIf",o.editing),e.xp6(1),e.Q6J("source",o.siteName)("byId",!1),e.xp6(1),e.Q6J("permission",o.permission)("selection",o.selection)("tableActions",o.tableActions))},directives:[a._Y,a.JL,h.V,a.sg,$.o,a.Fj,k.b,a.JJ,a.u,l.O5,Ye.s,Ee.K,Ai,Bi,zi,l.mk],styles:[""]}),n})();class Ui{}function ji(n,s){if(1&n&&(e.TgZ(0,"option",16),e._uU(1),e.qZA()),2&n){const t=s.$implicit;e.Q6J("value",t.id),e.xp6(1),e.Oqu(t.name)}}function Wi(n,s){1&n&&(e.TgZ(0,"span",17),e.SDv(1,18),e.qZA())}let es=(()=>{class n{constructor(t,o,i,_,r,c){this.activeModal=t,this.actionLabels=o,this.rbdMirroringService=i,this.taskWrapper=_,this.route=r,this.location=c,this.bsConfig={containerClass:"theme-default"},this.peerExists=!1,this.mirrorModes=[{id:"disabled",name:"Disabled"},{id:"pool",name:"Pool"},{id:"image",name:"Image"}],this.createForm()}createForm(){this.editModeForm=new x.d({mirrorMode:new a.NI("",{validators:[a.kI.required,this.validateMode.bind(this)]})})}ngOnInit(){this.route.params.subscribe(t=>{this.poolName=t.pool_name}),this.pattern=`${this.poolName}`,this.rbdMirroringService.getPool(this.poolName).subscribe(t=>{this.setResponse(t)}),this.subs=this.rbdMirroringService.subscribeSummary(t=>{this.peerExists=!1;const i=t.content_data.pools.find(_=>this.poolName===_.name);this.peerExists=i&&i.peer_uuids.length})}ngOnDestroy(){this.subs.unsubscribe()}validateMode(t){return"disabled"===t.value&&this.peerExists?{cannotDisable:{value:t.value}}:null}setResponse(t){this.editModeForm.get("mirrorMode").setValue(t.mirror_mode)}update(){const t=new Ui;t.mirror_mode=this.editModeForm.getValue("mirrorMode"),this.taskWrapper.wrapTaskAroundCall({task:new R.R("rbd/mirroring/pool/edit",{pool_name:this.poolName}),call:this.rbdMirroringService.updatePool(this.poolName,t)}).subscribe({error:()=>this.editModeForm.setErrors({cdSubmitButton:!0}),complete:()=>{this.rbdMirroringService.refresh(),this.location.back()}})}}return n.\u0275fac=function(t){return new(t||n)(e.Y36(N.Kz),e.Y36(v.p4),e.Y36(K),e.Y36(u.P),e.Y36(m.gz),e.Y36(l.Ye))},n.\u0275cmp=e.Xpm({type:n,selectors:[["cd-pool-edit-mode-modal"]],decls:21,vars:7,consts:function(){let s,t,o,i;return s="Edit pool mirror mode",t="To edit the mirror mode for pool\xA0 " + "[\ufffd#10\ufffd|\ufffd#11\ufffd]" + "" + "\ufffd0\ufffd" + "" + "[\ufffd/#10\ufffd|\ufffd/#11\ufffd]" + ", select a new mode from the list and click\xA0 " + "[\ufffd#10\ufffd|\ufffd#11\ufffd]" + "Update" + "[\ufffd/#10\ufffd|\ufffd/#11\ufffd]" + ".",t=e.Zx4(t),o="Mode",i="Peer clusters must be removed prior to disabling mirror.",[["pageURL","mirroring",3,"modalRef"],[1,"modal-title"],s,[1,"modal-content"],["name","editModeForm","novalidate","",1,"form",3,"formGroup"],["formDir","ngForm"],[1,"modal-body"],t,[1,"form-group"],["for","mirrorMode",1,"col-form-label"],o,["id","mirrorMode","name","mirrorMode","formControlName","mirrorMode",1,"form-control"],[3,"value",4,"ngFor","ngForOf"],["class","invalid-feedback",4,"ngIf"],[1,"modal-footer"],[3,"form","submitText","submitActionEvent"],[3,"value"],[1,"invalid-feedback"],i]},template:function(t,o){if(1&t&&(e.TgZ(0,"cd-modal",0),e.ynx(1,1),e.SDv(2,2),e.BQk(),e.ynx(3,3),e.TgZ(4,"form",4,5),e.TgZ(6,"div",6),e.TgZ(7,"p"),e.ynx(8),e.tHW(9,7),e._UZ(10,"kbd"),e._UZ(11,"kbd"),e.N_p(),e.BQk(),e.qZA(),e.TgZ(12,"div",8),e.TgZ(13,"label",9),e.TgZ(14,"span"),e.SDv(15,10),e.qZA(),e.qZA(),e.TgZ(16,"select",11),e.YNc(17,ji,2,2,"option",12),e.qZA(),e.YNc(18,Wi,2,0,"span",13),e.qZA(),e.qZA(),e.TgZ(19,"div",14),e.TgZ(20,"cd-form-button-panel",15),e.NdJ("submitActionEvent",function(){return o.update()}),e.qZA(),e.qZA(),e.qZA(),e.BQk(),e.qZA()),2&t){const i=e.MAs(5);e.Q6J("modalRef",o.activeModal),e.xp6(4),e.Q6J("formGroup",o.editModeForm),e.xp6(7),e.pQV(o.poolName),e.QtT(9),e.xp6(6),e.Q6J("ngForOf",o.mirrorModes),e.xp6(1),e.Q6J("ngIf",o.editModeForm.showError("mirrorMode",i,"cannotDisable")),e.xp6(2),e.Q6J("form",o.editModeForm)("submitText",o.actionLabels.UPDATE)}},directives:[C.z,a._Y,a.JL,h.V,a.sg,O.P,$.o,a.EJ,k.b,a.JJ,a.u,l.sg,l.O5,j.p,a.YN,a.Kr],styles:[""]}),n})();var Ot=p(80226),ts=p(28049),os=p(43190),Ve=p(80842),st=p(30633),Le=p(47557),ns=p(28211);class is{}var Pe=(()=>{return(n=Pe||(Pe={}))[n.V1=1]="V1",n[n.V2=2]="V2",Pe;var n})();class ss{constructor(){this.features=[]}}class _s{constructor(){this.features=[]}}class rs extends class{}{constructor(){super(...arguments),this.features=[]}}class _t{constructor(){this.features=[],this.remove_scheduling=!1}}var Ue=(()=>{return(n=Ue||(Ue={})).editing="editing",n.cloning="cloning",n.copying="copying",Ue;var n})(),ls=p(17932),cs=p(18372),ds=p(54555);function ps(n,s){if(1&n&&(e.TgZ(0,"div",9),e.TgZ(1,"label",58),e.SDv(2,59),e.ALo(3,"titlecase"),e.qZA(),e.TgZ(4,"div",12),e._UZ(5,"input",60),e._UZ(6,"hr"),e.qZA(),e.qZA()),2&n){const t=e.oxw(2);e.xp6(3),e.pQV(e.lcZ(3,1,t.action)),e.QtT(2)}}function gs(n,s){1&n&&(e.TgZ(0,"span",61),e.ynx(1),e.SDv(2,62),e.BQk(),e.qZA())}function us(n,s){1&n&&(e.TgZ(0,"span",61),e.ynx(1),e.SDv(2,63),e.BQk(),e.qZA())}function ms(n,s){1&n&&e._UZ(0,"input",64)}function Ts(n,s){1&n&&(e.TgZ(0,"option",50),e.SDv(1,67),e.qZA()),2&n&&e.Q6J("ngValue",null)}function fs(n,s){1&n&&(e.TgZ(0,"option",50),e.SDv(1,68),e.qZA()),2&n&&e.Q6J("ngValue",null)}function Cs(n,s){1&n&&(e.TgZ(0,"option",50),e.SDv(1,69),e.qZA()),2&n&&e.Q6J("ngValue",null)}function Ss(n,s){if(1&n&&(e.TgZ(0,"option",70),e._uU(1),e.qZA()),2&n){const t=s.$implicit;e.Q6J("value",t.pool_name),e.xp6(1),e.Oqu(t.pool_name)}}function Es(n,s){if(1&n){const t=e.EpF();e.TgZ(0,"select",65),e.NdJ("change",function(){return e.CHM(t),e.oxw(2).setPoolMirrorMode()}),e.YNc(1,Ts,2,1,"option",66),e.YNc(2,fs,2,1,"option",66),e.YNc(3,Cs,2,1,"option",66),e.YNc(4,Ss,2,2,"option",46),e.qZA()}if(2&n){const t=e.oxw(2);e.xp6(1),e.Q6J("ngIf",null===t.pools),e.xp6(1),e.Q6J("ngIf",null!==t.pools&&0===t.pools.length),e.xp6(1),e.Q6J("ngIf",null!==t.pools&&t.pools.length>0),e.xp6(1),e.Q6J("ngForOf",t.pools)}}function Rs(n,s){1&n&&(e.TgZ(0,"span",61),e.SDv(1,71),e.qZA())}const Ms=function(n,s){return[n,s]};function Os(n,s){if(1&n&&(e.TgZ(0,"div",9),e.TgZ(1,"div",20),e._UZ(2,"i",72),e.qZA(),e.qZA()),2&n){const t=e.oxw(2);e.xp6(2),e.Q6J("ngClass",e.WLB(1,Ms,t.icons.spinner,t.icons.spin))}}function As(n,s){1&n&&e._UZ(0,"input",76)}function hs(n,s){1&n&&(e.TgZ(0,"option",50),e.SDv(1,78),e.qZA()),2&n&&e.Q6J("ngValue",null)}function Ps(n,s){1&n&&(e.TgZ(0,"option",50),e.SDv(1,79),e.qZA()),2&n&&e.Q6J("ngValue",null)}function Is(n,s){1&n&&(e.TgZ(0,"option",50),e.SDv(1,80),e.qZA()),2&n&&e.Q6J("ngValue",null)}function bs(n,s){if(1&n&&(e.TgZ(0,"option",70),e._uU(1),e.qZA()),2&n){const t=s.$implicit;e.Q6J("value",t),e.xp6(1),e.Oqu(t)}}function Ns(n,s){if(1&n&&(e.TgZ(0,"select",77),e.YNc(1,hs,2,1,"option",66),e.YNc(2,Ps,2,1,"option",66),e.YNc(3,Is,2,1,"option",66),e.YNc(4,bs,2,2,"option",46),e.qZA()),2&n){const t=e.oxw(3);e.xp6(1),e.Q6J("ngIf",null===t.pools),e.xp6(1),e.Q6J("ngIf",null!==t.pools&&0===t.pools.length),e.xp6(1),e.Q6J("ngIf",null!==t.pools&&t.pools.length>0),e.xp6(1),e.Q6J("ngForOf",t.namespaces)}}function Fs(n,s){if(1&n&&(e.TgZ(0,"div",9),e.TgZ(1,"label",73),e._uU(2," Namespace "),e.qZA(),e.TgZ(3,"div",12),e.YNc(4,As,1,0,"input",74),e.YNc(5,Ns,5,4,"select",75),e.qZA(),e.qZA()),2&n){const t=e.oxw(2);e.xp6(4),e.Q6J("ngIf","editing"===t.mode||!t.poolPermission.read),e.xp6(1),e.Q6J("ngIf","editing"!==t.mode&&t.poolPermission.read)}}function Ds(n,s){1&n&&(e.TgZ(0,"cd-helper"),e.TgZ(1,"span"),e.SDv(2,81),e.qZA(),e.qZA())}function vs(n,s){1&n&&e._UZ(0,"input",87)}function Ls(n,s){1&n&&(e.TgZ(0,"option",50),e.SDv(1,89),e.qZA()),2&n&&e.Q6J("ngValue",null)}function $s(n,s){1&n&&(e.TgZ(0,"option",50),e.SDv(1,90),e.qZA()),2&n&&e.Q6J("ngValue",null)}function Zs(n,s){1&n&&(e.TgZ(0,"option",50),e._uU(1,"-- Select a data pool -- "),e.qZA()),2&n&&e.Q6J("ngValue",null)}function Bs(n,s){if(1&n&&(e.TgZ(0,"option",70),e._uU(1),e.qZA()),2&n){const t=s.$implicit;e.Q6J("value",t.pool_name),e.xp6(1),e.Oqu(t.pool_name)}}function Gs(n,s){if(1&n){const t=e.EpF();e.TgZ(0,"select",88),e.NdJ("change",function(i){return e.CHM(t),e.oxw(3).onDataPoolChange(i.target.value)}),e.YNc(1,Ls,2,1,"option",66),e.YNc(2,$s,2,1,"option",66),e.YNc(3,Zs,2,1,"option",66),e.YNc(4,Bs,2,2,"option",46),e.qZA()}if(2&n){const t=e.oxw(3);e.xp6(1),e.Q6J("ngIf",null===t.dataPools),e.xp6(1),e.Q6J("ngIf",null!==t.dataPools&&0===t.dataPools.length),e.xp6(1),e.Q6J("ngIf",null!==t.dataPools&&t.dataPools.length>0),e.xp6(1),e.Q6J("ngForOf",t.dataPools)}}function ys(n,s){1&n&&(e.TgZ(0,"span",61),e.SDv(1,91),e.qZA())}const je=function(n){return{required:n}};function xs(n,s){if(1&n&&(e.TgZ(0,"div",9),e.TgZ(1,"label",82),e.TgZ(2,"span",72),e.SDv(3,83),e.qZA(),e._UZ(4,"cd-helper",84),e.qZA(),e.TgZ(5,"div",12),e.YNc(6,vs,1,0,"input",85),e.YNc(7,Gs,5,4,"select",86),e.YNc(8,ys,2,0,"span",14),e.qZA(),e.qZA()),2&n){e.oxw();const t=e.MAs(2),o=e.oxw();e.xp6(2),e.Q6J("ngClass",e.VKq(4,je,"editing"!==o.mode)),e.xp6(4),e.Q6J("ngIf","editing"===o.mode||!o.poolPermission.read),e.xp6(1),e.Q6J("ngIf","editing"!==o.mode&&o.poolPermission.read),e.xp6(1),e.Q6J("ngIf",o.rbdForm.showError("dataPool",t,"required"))}}function ws(n,s){1&n&&(e.TgZ(0,"span",61),e.SDv(1,92),e.qZA())}function qs(n,s){1&n&&(e.TgZ(0,"span",61),e.SDv(1,93),e.qZA())}function Hs(n,s){if(1&n&&e._UZ(0,"cd-helper",97),2&n){const t=e.oxw().$implicit;e.s9C("html",t.helperHtml)}}function ks(n,s){if(1&n&&(e.TgZ(0,"div",21),e._UZ(1,"input",94),e.TgZ(2,"label",95),e._uU(3),e.qZA(),e.YNc(4,Hs,1,1,"cd-helper",96),e.qZA()),2&n){const t=s.$implicit;e.xp6(1),e.s9C("id",t.key),e.s9C("name",t.key),e.s9C("formControlName",t.key),e.xp6(1),e.s9C("for",t.key),e.xp6(1),e.Oqu(t.desc),e.xp6(1),e.Q6J("ngIf",t.helperHtml)}}const At=function(n){return["edit",n]},ht=function(n){return{modal:n}},Pt=function(n){return{outlets:n}},It=function(n){return["/block/mirroring",n]};function Ks(n,s){if(1&n&&(e.TgZ(0,"cd-helper"),e.TgZ(1,"span"),e.tHW(2,98),e._UZ(3,"b"),e._UZ(4,"a",99),e.N_p(),e.qZA(),e.qZA()),2&n){const t=e.oxw(2);e.xp6(4),e.Q6J("routerLink",e.VKq(7,It,e.VKq(5,Pt,e.VKq(3,ht,e.VKq(1,At,t.currentPoolName)))))}}function Xs(n,s){if(1&n&&(e.TgZ(0,"cd-helper"),e.TgZ(1,"span"),e.tHW(2,103),e._UZ(3,"b"),e._UZ(4,"a",99),e.N_p(),e.qZA(),e.qZA()),2&n){const t=e.oxw(4);e.xp6(4),e.Q6J("routerLink",e.VKq(7,It,e.VKq(5,Pt,e.VKq(3,ht,e.VKq(1,At,t.currentPoolName)))))}}function Qs(n,s){if(1&n){const t=e.EpF();e.TgZ(0,"div",101),e.TgZ(1,"input",102),e.NdJ("change",function(){return e.CHM(t),e.oxw(3).setExclusiveLock()}),e.qZA(),e.TgZ(2,"label",95),e._uU(3),e.ALo(4,"titlecase"),e.qZA(),e.YNc(5,Xs,5,9,"cd-helper",25),e.qZA()}if(2&n){const t=s.$implicit,o=e.oxw(3);e.xp6(1),e.Q6J("id",t)("value",t),e.uIk("disabled","pool"===o.poolMirrorMode&&"snapshot"===t||null),e.xp6(1),e.Q6J("for",t),e.xp6(1),e.Oqu(e.lcZ(4,6,t)),e.xp6(2),e.Q6J("ngIf","pool"===o.poolMirrorMode&&"snapshot"===t)}}function zs(n,s){if(1&n&&(e.TgZ(0,"div"),e.YNc(1,Qs,6,8,"div",100),e.qZA()),2&n){const t=e.oxw(2);e.xp6(1),e.Q6J("ngForOf",t.mirroringOptions)}}function Js(n,s){if(1&n&&(e.TgZ(0,"div",9),e.TgZ(1,"label",104),e.tHW(2,105),e._UZ(3,"cd-helper",106),e.N_p(),e.qZA(),e.TgZ(4,"div",12),e._UZ(5,"input",107),e.qZA(),e.qZA()),2&n){const t=e.oxw(2);e.xp6(5),e.uIk("disabled",t.mode===t.rbdFormMode.editing||null)}}function Ys(n,s){if(1&n){const t=e.EpF();e.TgZ(0,"a",108),e.NdJ("click",function(){return e.CHM(t),e.oxw(2).advancedEnabled=!0,!1}),e.SDv(1,109),e.qZA()}}function Vs(n,s){if(1&n&&(e.TgZ(0,"option",70),e._uU(1),e.qZA()),2&n){const t=s.$implicit;e.Q6J("value",t),e.xp6(1),e.Oqu(t)}}function Us(n,s){if(1&n&&(e.TgZ(0,"option",70),e._uU(1),e.qZA()),2&n){const t=s.$implicit;e.Q6J("value",t),e.xp6(1),e.Oqu(t)}}function js(n,s){1&n&&(e.TgZ(0,"span",61),e.SDv(1,110),e.qZA())}function Ws(n,s){1&n&&(e.TgZ(0,"span",61),e.SDv(1,111),e.qZA())}function e_(n,s){1&n&&(e.TgZ(0,"span",61),e.SDv(1,112),e.qZA())}function t_(n,s){1&n&&(e.TgZ(0,"span",61),e.SDv(1,113),e.qZA())}function o_(n,s){if(1&n){const t=e.EpF();e.TgZ(0,"div",1),e.TgZ(1,"form",2,3),e.TgZ(3,"div",4),e.TgZ(4,"div",5),e.SDv(5,6),e.ALo(6,"titlecase"),e.ALo(7,"upperFirst"),e.qZA(),e.TgZ(8,"div",7),e.YNc(9,ps,7,3,"div",8),e.TgZ(10,"div",9),e.TgZ(11,"label",10),e.SDv(12,11),e.qZA(),e.TgZ(13,"div",12),e._UZ(14,"input",13),e.YNc(15,gs,3,0,"span",14),e.YNc(16,us,3,0,"span",14),e.qZA(),e.qZA(),e.TgZ(17,"div",15),e.NdJ("change",function(i){return e.CHM(t),e.oxw().onPoolChange(i.target.value)}),e.TgZ(18,"label",16),e.SDv(19,17),e.qZA(),e.TgZ(20,"div",12),e.YNc(21,ms,1,0,"input",18),e.YNc(22,Es,5,4,"select",19),e.YNc(23,Rs,2,0,"span",14),e.qZA(),e.qZA(),e.YNc(24,Os,3,4,"div",8),e.YNc(25,Fs,6,2,"div",8),e.TgZ(26,"div",9),e.TgZ(27,"div",20),e.TgZ(28,"div",21),e.TgZ(29,"input",22),e.NdJ("change",function(){return e.CHM(t),e.oxw().onUseDataPoolChange()}),e.qZA(),e.TgZ(30,"label",23),e.SDv(31,24),e.qZA(),e.YNc(32,Ds,3,0,"cd-helper",25),e.qZA(),e.qZA(),e.qZA(),e.YNc(33,xs,9,6,"div",8),e.TgZ(34,"div",9),e.TgZ(35,"label",26),e.SDv(36,27),e.qZA(),e.TgZ(37,"div",12),e._UZ(38,"input",28),e.YNc(39,ws,2,0,"span",14),e.YNc(40,qs,2,0,"span",14),e.qZA(),e.qZA(),e.TgZ(41,"div",29),e.TgZ(42,"label",30),e.SDv(43,31),e.qZA(),e.TgZ(44,"div",12),e.YNc(45,ks,5,6,"div",32),e.qZA(),e.qZA(),e.TgZ(46,"div",9),e.TgZ(47,"div",20),e.TgZ(48,"div",21),e.TgZ(49,"input",33),e.NdJ("change",function(){return e.CHM(t),e.oxw().setMirrorMode()}),e.qZA(),e.TgZ(50,"label",34),e._uU(51,"Mirroring"),e.qZA(),e.YNc(52,Ks,5,9,"cd-helper",25),e.qZA(),e.YNc(53,zs,2,1,"div",25),e.qZA(),e.qZA(),e.YNc(54,Js,6,1,"div",8),e.TgZ(55,"div",35),e.TgZ(56,"div",36),e.YNc(57,Ys,2,0,"a",37),e.qZA(),e.qZA(),e.TgZ(58,"div",38),e.TgZ(59,"legend",39),e.SDv(60,40),e.qZA(),e.TgZ(61,"div",41),e.TgZ(62,"h4",39),e.SDv(63,42),e.qZA(),e.TgZ(64,"div",9),e.TgZ(65,"label",43),e.tHW(66,44),e._UZ(67,"cd-helper"),e.N_p(),e.qZA(),e.TgZ(68,"div",12),e.TgZ(69,"select",45),e.YNc(70,Vs,2,2,"option",46),e.qZA(),e.qZA(),e.qZA(),e.TgZ(71,"div",9),e.TgZ(72,"label",47),e.tHW(73,48),e._UZ(74,"cd-helper"),e.N_p(),e.qZA(),e.TgZ(75,"div",12),e.TgZ(76,"select",49),e.TgZ(77,"option",50),e.SDv(78,51),e.qZA(),e.YNc(79,Us,2,2,"option",46),e.qZA(),e.YNc(80,js,2,0,"span",14),e.YNc(81,Ws,2,0,"span",14),e.qZA(),e.qZA(),e.TgZ(82,"div",9),e.TgZ(83,"label",52),e.tHW(84,53),e._UZ(85,"cd-helper"),e.N_p(),e.qZA(),e.TgZ(86,"div",12),e._UZ(87,"input",54),e.YNc(88,e_,2,0,"span",14),e.YNc(89,t_,2,0,"span",14),e.qZA(),e.qZA(),e.qZA(),e.TgZ(90,"cd-rbd-configuration-form",55),e.NdJ("changes",function(i){return e.CHM(t),e.oxw().getDirtyConfigurationValues=i}),e.qZA(),e.qZA(),e.qZA(),e.TgZ(91,"div",56),e.TgZ(92,"cd-form-button-panel",57),e.NdJ("submitActionEvent",function(){return e.CHM(t),e.oxw().submit()}),e.ALo(93,"titlecase"),e.ALo(94,"upperFirst"),e.qZA(),e.qZA(),e.qZA(),e.qZA(),e.qZA()}if(2&n){const t=e.MAs(2),o=e.oxw();e.xp6(1),e.Q6J("formGroup",o.rbdForm),e.xp6(6),e.pQV(e.lcZ(6,35,o.action))(e.lcZ(7,37,o.resource)),e.QtT(5),e.xp6(2),e.Q6J("ngIf",o.rbdForm.getValue("parent")),e.xp6(6),e.Q6J("ngIf",o.rbdForm.showError("name",t,"required")),e.xp6(1),e.Q6J("ngIf",o.rbdForm.showError("name",t,"pattern")),e.xp6(2),e.Q6J("ngClass",e.VKq(43,je,"editing"!==o.mode)),e.xp6(3),e.Q6J("ngIf","editing"===o.mode||!o.poolPermission.read),e.xp6(1),e.Q6J("ngIf","editing"!==o.mode&&o.poolPermission.read),e.xp6(1),e.Q6J("ngIf",o.rbdForm.showError("pool",t,"required")),e.xp6(1),e.Q6J("ngIf","editing"!==o.mode&&o.rbdForm.getValue("pool")&&null===o.namespaces),e.xp6(1),e.Q6J("ngIf","editing"===o.mode&&o.rbdForm.getValue("namespace")||"editing"!==o.mode&&(o.namespaces&&o.namespaces.length>0||!o.poolPermission.read)),e.xp6(7),e.Q6J("ngIf",o.allDataPools.length<=1),e.xp6(1),e.Q6J("ngIf",o.rbdForm.getValue("useDataPool")),e.xp6(6),e.Q6J("ngIf",o.rbdForm.showError("size",t,"required")),e.xp6(1),e.Q6J("ngIf",o.rbdForm.showError("size",t,"invalidSizeObject")),e.xp6(5),e.Q6J("ngForOf",o.featuresList),e.xp6(7),e.Q6J("ngIf",!1===o.mirroring&&o.currentPoolName),e.xp6(1),e.Q6J("ngIf",o.mirroring),e.xp6(1),e.Q6J("ngIf","snapshot"===o.rbdForm.getValue("mirroringMode")&&o.mirroring),e.xp6(3),e.Q6J("ngIf",!o.advancedEnabled),e.xp6(1),e.Q6J("hidden",!o.advancedEnabled),e.xp6(12),e.Q6J("ngForOf",o.objectSizes),e.xp6(2),e.Q6J("ngClass",e.VKq(45,je,o.rbdForm.getValue("stripingCount"))),e.xp6(5),e.Q6J("ngValue",null),e.xp6(2),e.Q6J("ngForOf",o.objectSizes),e.xp6(1),e.Q6J("ngIf",o.rbdForm.showError("stripingUnit",t,"required")),e.xp6(1),e.Q6J("ngIf",o.rbdForm.showError("stripingUnit",t,"invalidStripingUnit")),e.xp6(2),e.Q6J("ngClass",e.VKq(47,je,o.rbdForm.getValue("stripingUnit"))),e.xp6(5),e.Q6J("ngIf",o.rbdForm.showError("stripingCount",t,"required")),e.xp6(1),e.Q6J("ngIf",o.rbdForm.showError("stripingCount",t,"min")),e.xp6(1),e.Q6J("form",o.rbdForm)("initializeData",o.initializeConfigData),e.xp6(2),e.Q6J("form",t)("submitText",e.lcZ(93,39,o.action)+" "+e.lcZ(94,41,o.resource))}}let $e=(()=>{class n extends H.E{constructor(t,o,i,_,r,c,d,g,f,I){super(),this.authStorageService=t,this.route=o,this.poolService=i,this.rbdService=_,this.formatter=r,this.taskWrapper=c,this.dimlessBinaryPipe=d,this.actionLabels=g,this.router=f,this.rbdMirroringService=I,this.namespaces=[],this.namespacesByPoolCache={},this.pools=null,this.allPools=null,this.dataPools=null,this.allDataPools=[],this.featuresList=[],this.initializeConfigData=new Ot.t(1),this.advancedEnabled=!1,this.rbdFormMode=Ue,this.defaultObjectSize="4 MiB",this.mirroringOptions=["journal","snapshot"],this.mirroring=!1,this.currentPoolName="",this.objectSizes=["4 KiB","8 KiB","16 KiB","32 KiB","64 KiB","128 KiB","256 KiB","512 KiB","1 MiB","2 MiB","4 MiB","8 MiB","16 MiB","32 MiB"],this.defaultStripingUnit="4 MiB",this.defaultStripingCount=1,this.rbdImage=new Ot.t(1),this.icons=T.P,this.routerUrl=this.router.url,this.poolPermission=this.authStorageService.getPermissions().pool,this.resource="RBD",this.features={"deep-flatten":{desc:"Deep flatten",requires:null,allowEnable:!1,allowDisable:!0},layering:{desc:"Layering",requires:null,allowEnable:!1,allowDisable:!1},"exclusive-lock":{desc:"Exclusive lock",requires:null,allowEnable:!0,allowDisable:!0},"object-map":{desc:"Object map (requires exclusive-lock)",requires:"exclusive-lock",allowEnable:!0,allowDisable:!0,initDisabled:!0},"fast-diff":{desc:"Fast diff (interlocked with object-map)",requires:"object-map",allowEnable:!0,allowDisable:!0,interlockedWith:"object-map",initDisabled:!0}},this.featuresList=this.objToArray(this.features),this.createForm()}objToArray(t){return S().map(t,(o,i)=>Object.assign(o,{key:i}))}createForm(){this.rbdForm=new x.d({parent:new a.NI(""),name:new a.NI("",{validators:[a.kI.required,a.kI.pattern(/^[^@/]+?$/)]}),pool:new a.NI(null,{validators:[a.kI.required]}),namespace:new a.NI(null),useDataPool:new a.NI(!1),dataPool:new a.NI(null),size:new a.NI(null,{updateOn:"blur"}),obj_size:new a.NI(this.defaultObjectSize),features:new x.d(this.featuresList.reduce((t,o)=>(t[o.key]=new a.NI({value:!1,disabled:!!o.initDisabled}),t),{})),mirroring:new a.NI(!1),schedule:new a.NI("",{validators:[a.kI.pattern(/^([0-9]+)d|([0-9]+)h|([0-9]+)m$/)]}),mirroringMode:new a.NI(this.mirroringOptions[0]),stripingUnit:new a.NI(this.defaultStripingUnit),stripingCount:new a.NI(this.defaultStripingCount,{updateOn:"blur"})},this.validateRbdForm(this.formatter))}disableForEdit(){this.rbdForm.get("parent").disable(),this.rbdForm.get("pool").disable(),this.rbdForm.get("namespace").disable(),this.rbdForm.get("useDataPool").disable(),this.rbdForm.get("dataPool").disable(),this.rbdForm.get("obj_size").disable(),this.rbdForm.get("stripingUnit").disable(),this.rbdForm.get("stripingCount").disable(),this.rbdImage.subscribe(t=>{t.image_format===Pe.V1&&(this.rbdForm.get("deep-flatten").disable(),this.rbdForm.get("layering").disable(),this.rbdForm.get("exclusive-lock").disable())})}disableForClone(){this.rbdForm.get("parent").disable(),this.rbdForm.get("size").disable()}disableForCopy(){this.rbdForm.get("parent").disable(),this.rbdForm.get("size").disable()}ngOnInit(){this.prepareFormForAction(),this.gatherNeededData().subscribe(this.handleExternalData.bind(this))}setExclusiveLock(){this.mirroring&&"journal"===this.rbdForm.get("mirroringMode").value?(this.rbdForm.get("exclusive-lock").setValue(!0),this.rbdForm.get("exclusive-lock").disable()):(this.rbdForm.get("exclusive-lock").enable(),"pool"===this.poolMirrorMode&&this.rbdForm.get("mirroringMode").setValue(this.mirroringOptions[0]))}setMirrorMode(){this.mirroring=!this.mirroring,this.setExclusiveLock()}setPoolMirrorMode(){var t;this.currentPoolName=this.mode===this.rbdFormMode.editing?null===(t=this.response)||void 0===t?void 0:t.pool_name:this.rbdForm.getValue("pool"),this.currentPoolName&&(this.rbdMirroringService.refresh(),this.rbdMirroringService.subscribeSummary(o=>{const i=o.content_data.pools.find(_=>_.name===this.currentPoolName);this.poolMirrorMode=i.mirror_mode,"disabled"===i.mirror_mode?(this.mirroring=!1,this.rbdForm.get("mirroring").setValue(this.mirroring),this.rbdForm.get("mirroring").disable()):this.mode!==this.rbdFormMode.editing&&(this.rbdForm.get("mirroring").enable(),this.mirroring=!0,this.rbdForm.get("mirroring").setValue(this.mirroring))})),this.setExclusiveLock()}prepareFormForAction(){const t=this.routerUrl;t.startsWith("/block/rbd/edit")?(this.mode=this.rbdFormMode.editing,this.action=this.actionLabels.EDIT,this.disableForEdit()):t.startsWith("/block/rbd/clone")?(this.mode=this.rbdFormMode.cloning,this.disableForClone(),this.action=this.actionLabels.CLONE):t.startsWith("/block/rbd/copy")?(this.mode=this.rbdFormMode.copying,this.action=this.actionLabels.COPY,this.disableForCopy()):this.action=this.actionLabels.CREATE,S().each(this.features,o=>{this.rbdForm.get("features").get(o.key).valueChanges.subscribe(i=>this.featureFormUpdate(o.key,i))})}gatherNeededData(){const t={};return this.mode?this.route.params.subscribe(o=>{const i=L.N.fromString(decodeURIComponent(o.image_spec));o.snap&&(this.snapName=decodeURIComponent(o.snap)),t.rbd=this.rbdService.get(i)}):t.defaultFeatures=this.rbdService.defaultFeatures(),this.mode!==this.rbdFormMode.editing&&this.poolPermission.read&&(t.pools=this.poolService.list(["pool_name","type","flags_names","application_metadata"])),(0,le.D)(t)}handleExternalData(t){if(this.handlePoolData(t.pools),this.setPoolMirrorMode(),t.defaultFeatures&&this.setFeatures(t.defaultFeatures),t.rbd){const o=t.rbd;this.setResponse(o,this.snapName),this.rbdImage.next(o)}this.loadingReady()}handlePoolData(t){if(!t)return;const o=[],i=[];for(const _ of t)this.rbdService.isRBDPool(_)&&("replicated"===_.type?(o.push(_),i.push(_)):"erasure"===_.type&&-1!==_.flags_names.indexOf("ec_overwrites")&&i.push(_));if(this.pools=o,this.allPools=o,this.dataPools=i,this.allDataPools=i,1===this.pools.length){const _=this.pools[0].pool_name;this.rbdForm.get("pool").setValue(_),this.onPoolChange(_)}this.allDataPools.length<=1&&this.rbdForm.get("useDataPool").disable()}onPoolChange(t){const o=this.rbdForm.get("dataPool");o.value===t&&o.setValue(null),this.dataPools=this.allDataPools?this.allDataPools.filter(i=>i.pool_name!==t):[],this.namespaces=null,t in this.namespacesByPoolCache?this.namespaces=this.namespacesByPoolCache[t]:this.rbdService.listNamespaces(t).subscribe(i=>{i=i.map(_=>_.namespace),this.namespacesByPoolCache[t]=i,this.namespaces=i}),this.rbdForm.get("namespace").setValue(null)}onUseDataPoolChange(){this.rbdForm.getValue("useDataPool")||(this.rbdForm.get("dataPool").setValue(null),this.onDataPoolChange(null))}onDataPoolChange(t){const o=this.allPools.filter(i=>i.pool_name!==t);this.rbdForm.getValue("pool")===t&&this.rbdForm.get("pool").setValue(null),this.pools=o}validateRbdForm(t){return o=>{const i=o.get("useDataPool"),_=o.get("dataPool");let r=null;i.value&&null==_.value&&(r={required:!0}),_.setErrors(r);const c=o.get("size"),d=o.get("obj_size"),g=t.toBytes(null!=d.value?d.value:this.defaultObjectSize),f=o.get("stripingCount"),I=null!=f.value?f.value:this.defaultStripingCount;let P=null;null===c.value?P={required:!0}:I*g>t.toBytes(c.value)&&(P={invalidSizeObject:!0}),c.setErrors(P);const Z=o.get("stripingUnit");let B=null;null===Z.value&&null!==f.value?B={required:!0}:null!==Z.value&&t.toBytes(Z.value)>g&&(B={invalidStripingUnit:!0}),Z.setErrors(B);let Q=null;return null===f.value&&null!==Z.value?Q={required:!0}:I<1&&(Q={min:!0}),f.setErrors(Q),null}}deepBoxCheck(t,o){this.getDependentChildFeatures(t).forEach(_=>{const r=this.rbdForm.get(_.key);o?r.enable({emitEvent:!1}):(r.disable({emitEvent:!1}),r.setValue(!1,{emitEvent:!1}),this.deepBoxCheck(_.key,o));const c=this.rbdForm.get("features");this.mode===this.rbdFormMode.editing&&c.get(_.key).enabled&&(-1!==this.response.features_name.indexOf(_.key)&&!_.allowDisable||-1===this.response.features_name.indexOf(_.key)&&!_.allowEnable)&&c.get(_.key).disable()})}getDependentChildFeatures(t){return S().filter(this.features,o=>o.requires===t)||[]}interlockCheck(t,o){const i=this.featuresList.find(_=>_.key===t);if(this.response){const _=null!=i.interlockedWith,r=this.featuresList.find(d=>d.interlockedWith===i.key),c=!!this.response.features_name.find(d=>d===i.key);if(_){if(c!==!!this.response.features_name.find(g=>g===i.interlockedWith))return}else if(r&&!!this.response.features_name.find(g=>g===r.key)!==c)return}o?S().filter(this.features,_=>_.interlockedWith===t).forEach(_=>this.rbdForm.get(_.key).setValue(!0,{emitEvent:!1})):i.interlockedWith&&this.rbdForm.get("features").get(i.interlockedWith).setValue(!1)}featureFormUpdate(t,o){if(o){const i=this.features[t].requires;if(i&&!this.rbdForm.getValue(i))return void this.rbdForm.get(`features.${t}`).setValue(!1)}this.deepBoxCheck(t,o),this.interlockCheck(t,o)}setFeatures(t){const o=this.rbdForm.get("features");S().forIn(this.features,i=>{-1!==t.indexOf(i.key)&&o.get(i.key).setValue(!0),this.featureFormUpdate(i.key,o.get(i.key).value)})}setResponse(t,o){this.response=t;const i=new L.N(t.pool_name,t.namespace,t.name).toString();if(this.mode===this.rbdFormMode.cloning)this.rbdForm.get("parent").setValue(`${i}@${o}`);else if(this.mode===this.rbdFormMode.copying)o?this.rbdForm.get("parent").setValue(`${i}@${o}`):this.rbdForm.get("parent").setValue(`${i}`);else if(t.parent){const _=t.parent;this.rbdForm.get("parent").setValue(`${_.pool_name}/${_.image_name}@${_.snap_name}`)}this.mode===this.rbdFormMode.editing&&(this.rbdForm.get("name").setValue(t.name),"snapshot"===(null==t?void 0:t.mirror_mode)||t.features_name.includes("journaling")?(this.mirroring=!0,this.rbdForm.get("mirroring").setValue(this.mirroring),this.rbdForm.get("mirroringMode").setValue(null==t?void 0:t.mirror_mode),this.rbdForm.get("schedule").setValue(null==t?void 0:t.schedule_interval)):(this.mirroring=!1,this.rbdForm.get("mirroring").setValue(this.mirroring)),this.setPoolMirrorMode()),this.rbdForm.get("pool").setValue(t.pool_name),this.onPoolChange(t.pool_name),this.rbdForm.get("namespace").setValue(t.namespace),t.data_pool&&(this.rbdForm.get("useDataPool").setValue(!0),this.rbdForm.get("dataPool").setValue(t.data_pool)),this.rbdForm.get("size").setValue(this.dimlessBinaryPipe.transform(t.size)),this.rbdForm.get("obj_size").setValue(this.dimlessBinaryPipe.transform(t.obj_size)),this.setFeatures(t.features_name),this.rbdForm.get("stripingUnit").setValue(this.dimlessBinaryPipe.transform(t.stripe_unit)),this.rbdForm.get("stripingCount").setValue(t.stripe_count),this.initializeConfigData.next({initialData:this.response.configuration,sourceType:st.h.image})}createRequest(){const t=new rs;return t.pool_name=this.rbdForm.getValue("pool"),t.namespace=this.rbdForm.getValue("namespace"),t.name=this.rbdForm.getValue("name"),t.schedule_interval=this.rbdForm.getValue("schedule"),t.size=this.formatter.toBytes(this.rbdForm.getValue("size")),"image"===this.poolMirrorMode&&(t.mirror_mode=this.rbdForm.getValue("mirroringMode")),this.addObjectSizeAndStripingToRequest(t),t.configuration=this.getDirtyConfigurationValues(),t}addObjectSizeAndStripingToRequest(t){t.obj_size=this.formatter.toBytes(this.rbdForm.getValue("obj_size")),S().forIn(this.features,o=>{this.rbdForm.getValue(o.key)&&t.features.push(o.key)}),this.mirroring&&"journal"===this.rbdForm.getValue("mirroringMode")&&t.features.push("journaling"),t.stripe_unit=this.formatter.toBytes(this.rbdForm.getValue("stripingUnit")),t.stripe_count=this.rbdForm.getValue("stripingCount"),t.data_pool=this.rbdForm.getValue("dataPool")}createAction(){const t=this.createRequest();return this.taskWrapper.wrapTaskAroundCall({task:new R.R("rbd/create",{pool_name:t.pool_name,namespace:t.namespace,image_name:t.name,schedule_interval:t.schedule_interval,start_time:t.start_time}),call:this.rbdService.create(t)})}editRequest(){const t=new _t;if(t.name=this.rbdForm.getValue("name"),t.schedule_interval=this.rbdForm.getValue("schedule"),t.name=this.rbdForm.getValue("name"),t.size=this.formatter.toBytes(this.rbdForm.getValue("size")),S().forIn(this.features,o=>{this.rbdForm.getValue(o.key)&&t.features.push(o.key)}),t.enable_mirror=this.rbdForm.getValue("mirroring"),"image"===this.poolMirrorMode)t.enable_mirror&&(t.mirror_mode=this.rbdForm.getValue("mirroringMode"));else if(t.enable_mirror)t.features.push("journaling");else{const o=t.features.indexOf("journaling",0);o>-1&&t.features.splice(o,1)}return t.configuration=this.getDirtyConfigurationValues(),t}cloneRequest(){const t=new ss;return t.child_pool_name=this.rbdForm.getValue("pool"),t.child_namespace=this.rbdForm.getValue("namespace"),t.child_image_name=this.rbdForm.getValue("name"),this.addObjectSizeAndStripingToRequest(t),t.configuration=this.getDirtyConfigurationValues(!0,st.h.image),t}editAction(){const t=new L.N(this.response.pool_name,this.response.namespace,this.response.name);return this.taskWrapper.wrapTaskAroundCall({task:new R.R("rbd/edit",{image_spec:t.toString()}),call:this.rbdService.update(t,this.editRequest())})}cloneAction(){const t=this.cloneRequest(),o=new L.N(this.response.pool_name,this.response.namespace,this.response.name);return this.taskWrapper.wrapTaskAroundCall({task:new R.R("rbd/clone",{parent_image_spec:o.toString(),parent_snap_name:this.snapName,child_pool_name:t.child_pool_name,child_namespace:t.child_namespace,child_image_name:t.child_image_name}),call:this.rbdService.cloneSnapshot(o,this.snapName,t)})}copyRequest(){const t=new _s;return this.snapName&&(t.snapshot_name=this.snapName),t.dest_pool_name=this.rbdForm.getValue("pool"),t.dest_namespace=this.rbdForm.getValue("namespace"),t.dest_image_name=this.rbdForm.getValue("name"),this.addObjectSizeAndStripingToRequest(t),t.configuration=this.getDirtyConfigurationValues(!0,st.h.image),t}copyAction(){const t=this.copyRequest(),o=new L.N(this.response.pool_name,this.response.namespace,this.response.name);return this.taskWrapper.wrapTaskAroundCall({task:new R.R("rbd/copy",{src_image_spec:o.toString(),dest_pool_name:t.dest_pool_name,dest_namespace:t.dest_namespace,dest_image_name:t.dest_image_name}),call:this.rbdService.copy(o,t)})}submit(){this.mode||this.rbdImage.next("create"),this.rbdImage.pipe((0,ts.P)(),(0,os.w)(()=>this.mode===this.rbdFormMode.editing?this.editAction():this.mode===this.rbdFormMode.cloning?this.cloneAction():this.mode===this.rbdFormMode.copying?this.copyAction():this.createAction())).subscribe(()=>{},()=>this.rbdForm.setErrors({cdSubmitButton:!0}),()=>this.router.navigate(["/block/rbd"]))}}return n.\u0275fac=function(t){return new(t||n)(e.Y36(oe.j),e.Y36(m.gz),e.Y36(Ve.q),e.Y36(q),e.Y36(ns.H),e.Y36(u.P),e.Y36(Le.$),e.Y36(v.p4),e.Y36(m.F0),e.Y36(K))},n.\u0275cmp=e.Xpm({type:n,selectors:[["cd-rbd-form"]],features:[e.qOj],decls:1,vars:1,consts:function(){let s,t,o,i,_,r,c,d,g,f,I,P,Z,B,Q,Y,ee,te,w,_e,ae,M,ge,ue,me,Te,fe,Ce,G,Be,Ge,ye,xe,we,qe,He,ke,Ke,Xe,Qe,ze;return s="" + "\ufffd0\ufffd" + " " + "\ufffd1\ufffd" + "",t="Name",o="Pool",i="Use a dedicated data pool",_="Size",r="e.g., 10GiB",c="Features",d="Advanced",g="Striping",f="Object size" + "\ufffd#67\ufffd" + "Objects in the Ceph Storage Cluster have a maximum configurable size (e.g., 2MB, 4MB, etc.). The object size should be large enough to accommodate many stripe units, and should be a multiple of the stripe unit." + "\ufffd/#67\ufffd" + "",I="Stripe unit" + "\ufffd#74\ufffd" + "Stripes have a configurable unit size (e.g., 64kb). The Ceph Client divides the data it will write to objects into equally sized stripe units, except for the last stripe unit. A stripe width, should be a fraction of the Object Size so that an object may contain many stripe units." + "\ufffd/#74\ufffd" + "",P="-- Select stripe unit --",Z="Stripe count" + "\ufffd#85\ufffd" + "The Ceph Client writes a sequence of stripe units over a series of objects determined by the stripe count. The series of objects is called an object set. After the Ceph Client writes to the last object in the object set, it returns to the first object in the object set." + "\ufffd/#85\ufffd" + "",B="" + "\ufffd0\ufffd" + " from",Q="This field is required.",Y="'/' and '@' are not allowed.",ee="Loading...",te="-- No rbd pools available --",w="-- Select a pool --",_e="This field is required.",ae="Loading...",M="-- No namespaces available --",ge="-- Select a namespace --",ue="You need more than one pool with the rbd application label use to use a dedicated data pool.",me="Data pool",Te="Dedicated pool that stores the object-data of the RBD.",fe="Loading...",Ce="-- No data pools available --",G="This field is required.",Be="This field is required.",Ge="You have to increase the size.",ye="You need to enable a " + "\ufffd#3\ufffd" + "mirror mode" + "\ufffd/#3\ufffd" + " in the selected pool. Please " + "\ufffd#4\ufffd" + "click here to select a mode and enable it in this pool." + "\ufffd/#4\ufffd" + "",xe="You need to enable " + "\ufffd#3\ufffd" + "image mirror mode" + "\ufffd/#3\ufffd" + " in the selected pool. Please " + "\ufffd#4\ufffd" + "click here to select a mode and enable it in this pool." + "\ufffd/#4\ufffd" + "",we="Create Mirror-Snapshots automatically on a periodic basis. The interval can be specified in days, hours, or minutes using d, h, m suffix respectively.",qe="Schedule Interval " + "\ufffd#3\ufffd" + "" + "\ufffd/#3\ufffd" + "",He="e.g., 12h or 1d or 10m",ke="Advanced...",Ke="This field is required because stripe count is defined!",Xe="Stripe unit is greater than object size.",Qe="This field is required because stripe unit is defined!",ze="Stripe count must be greater than 0.",[["class","cd-col-form",4,"cdFormLoading"],[1,"cd-col-form"],["name","rbdForm","novalidate","",3,"formGroup"],["formDir","ngForm"],[1,"card"],[1,"card-header"],s,[1,"card-body"],["class","form-group row",4,"ngIf"],[1,"form-group","row"],["for","name",1,"cd-col-form-label","required"],t,[1,"cd-col-form-input"],["type","text","placeholder","Name...","id","name","name","name","formControlName","name","autofocus","",1,"form-control"],["class","invalid-feedback",4,"ngIf"],[1,"form-group","row",3,"change"],["for","pool",1,"cd-col-form-label",3,"ngClass"],o,["class","form-control","type","text","placeholder","Pool name...","id","pool","name","pool","formControlName","pool",4,"ngIf"],["id","pool","name","pool","class","form-control","formControlName","pool",3,"change",4,"ngIf"],[1,"cd-col-form-offset"],[1,"custom-control","custom-checkbox"],["type","checkbox","id","useDataPool","name","useDataPool","formControlName","useDataPool",1,"custom-control-input",3,"change"],["for","useDataPool",1,"custom-control-label"],i,[4,"ngIf"],["for","size",1,"cd-col-form-label","required"],_,["id","size","name","size","type","text","formControlName","size","placeholder",r,"defaultUnit","GiB","cdDimlessBinary","",1,"form-control"],["formGroupName","features",1,"form-group","row"],["for","features",1,"cd-col-form-label"],c,["class","custom-control custom-checkbox",4,"ngFor","ngForOf"],["type","checkbox","id","mirroring","name","mirroring","formControlName","mirroring",1,"custom-control-input",3,"change"],["for","mirroring",1,"custom-control-label"],[1,"row"],[1,"col-sm-12"],["class","float-right margin-right-md","href","",3,"click",4,"ngIf"],[3,"hidden"],[1,"cd-header"],d,[1,"col-md-12"],g,["for","size",1,"cd-col-form-label"],f,["id","obj_size","name","obj_size","formControlName","obj_size",1,"form-control"],[3,"value",4,"ngFor","ngForOf"],["for","stripingUnit",1,"cd-col-form-label",3,"ngClass"],I,["id","stripingUnit","name","stripingUnit","formControlName","stripingUnit",1,"form-control"],[3,"ngValue"],P,["for","stripingCount",1,"cd-col-form-label",3,"ngClass"],Z,["id","stripingCount","name","stripingCount","formControlName","stripingCount","type","number",1,"form-control"],[3,"form","initializeData","changes"],[1,"card-footer"],["wrappingClass","text-right",3,"form","submitText","submitActionEvent"],["for","name",1,"cd-col-form-label"],B,["type","text","id","parent","name","parent","formControlName","parent",1,"form-control"],[1,"invalid-feedback"],Q,Y,["type","text","placeholder","Pool name...","id","pool","name","pool","formControlName","pool",1,"form-control"],["id","pool","name","pool","formControlName","pool",1,"form-control",3,"change"],[3,"ngValue",4,"ngIf"],ee,te,w,[3,"value"],_e,[3,"ngClass"],["for","pool",1,"cd-col-form-label"],["class","form-control","type","text","placeholder","Namespace...","id","namespace","name","namespace","formControlName","namespace",4,"ngIf"],["id","namespace","name","namespace","class","form-control","formControlName","namespace",4,"ngIf"],["type","text","placeholder","Namespace...","id","namespace","name","namespace","formControlName","namespace",1,"form-control"],["id","namespace","name","namespace","formControlName","namespace",1,"form-control"],ae,M,ge,ue,["for","dataPool",1,"cd-col-form-label"],me,["html",Te],["class","form-control","type","text","placeholder","Data pool name...","id","dataPool","name","dataPool","formControlName","dataPool",4,"ngIf"],["id","dataPool","name","dataPool","class","form-control","formControlName","dataPool",3,"change",4,"ngIf"],["type","text","placeholder","Data pool name...","id","dataPool","name","dataPool","formControlName","dataPool",1,"form-control"],["id","dataPool","name","dataPool","formControlName","dataPool",1,"form-control",3,"change"],fe,Ce,G,Be,Ge,["type","checkbox",1,"custom-control-input",3,"id","name","formControlName"],[1,"custom-control-label",3,"for"],[3,"html",4,"ngIf"],[3,"html"],ye,[3,"routerLink"],["class","custom-control custom-radio ml-2",4,"ngFor","ngForOf"],[1,"custom-control","custom-radio","ml-2"],["type","radio","name","mirroringMode","formControlName","mirroringMode",1,"custom-control-input",3,"id","value","change"],xe,[1,"cd-col-form-label"],qe,["html",we],["id","schedule","name","schedule","type","text","formControlName","schedule","placeholder",He,1,"form-control"],["href","",1,"float-right","margin-right-md",3,"click"],ke,Ke,Xe,Qe,ze]},template:function(t,o){1&t&&e.YNc(0,o_,95,49,"div",0),2&t&&e.Q6J("cdFormLoading",o.loading)},directives:[pt.y,a._Y,a.JL,a.sg,h.V,l.O5,O.P,$.o,a.Fj,k.b,a.JJ,a.u,Re.U,l.mk,a.Wl,ls.Q,a.x0,l.sg,cs.S,a.EJ,a.YN,a.Kr,a.wV,ds.d,j.p,m.yS,a._],pipes:[l.rS,et.m],styles:[""]}),n})();var bt=p(71225),Nt=p(36169);let n_=(()=>{class n{constructor(){}static getCount(t){var o;return Number(null===(o=t.headers)||void 0===o?void 0:o.get("X-Total-Count"))}}return n.\u0275fac=function(t){return new(t||n)},n.\u0275prov=e.Yz7({token:n,factory:n.\u0275fac,providedIn:"root"}),n})();var at=p(51847),i_=p(16738),Me=p.n(i_),rt=p(62862),s_=p(52266);function __(n,s){1&n&&(e.TgZ(0,"div",18),e.TgZ(1,"span"),e.SDv(2,19),e.qZA(),e.qZA())}function a_(n,s){1&n&&(e.TgZ(0,"span",20),e.SDv(1,21),e.qZA())}function r_(n,s){1&n&&(e.TgZ(0,"span",20),e.SDv(1,22),e.qZA())}function l_(n,s){if(1&n&&e._UZ(0,"cd-date-time-picker",23),2&n){const t=e.oxw();e.Q6J("control",t.moveForm.get("expiresAt"))}}let c_=(()=>{class n{constructor(t,o,i,_,r){this.rbdService=t,this.activeModal=o,this.actionLabels=i,this.fb=_,this.taskWrapper=r,this.createForm()}createForm(){this.moveForm=this.fb.group({expiresAt:["",[z.h.custom("format",t=>!(""===t||Me()(t,"YYYY-MM-DD HH:mm:ss").isValid())),z.h.custom("expired",t=>Me()().isAfter(t))]]})}ngOnInit(){this.imageSpec=new L.N(this.poolName,this.namespace,this.imageName),this.imageSpecStr=this.imageSpec.toString(),this.pattern=`${this.poolName}/${this.imageName}`}moveImage(){let t=0;const o=this.moveForm.getValue("expiresAt");o&&(t=Me()(o,"YYYY-MM-DD HH:mm:ss").diff(Me()(),"seconds",!0)),t<0&&(t=0),this.taskWrapper.wrapTaskAroundCall({task:new R.R("rbd/trash/move",{image_spec:this.imageSpecStr}),call:this.rbdService.moveTrash(this.imageSpec,t)}).subscribe({complete:()=>{this.activeModal.close()}})}}return n.\u0275fac=function(t){return new(t||n)(e.Y36(q),e.Y36(N.Kz),e.Y36(v.p4),e.Y36(rt.O),e.Y36(u.P))},n.\u0275cmp=e.Xpm({type:n,selectors:[["cd-rbd-trash-move-modal"]],decls:23,vars:9,consts:function(){let s,t,o,i,_,r,c;return s="Move an image to trash",t="To move " + "[\ufffd#10\ufffd|\ufffd#11\ufffd]" + "" + "\ufffd0\ufffd" + "" + "[\ufffd/#10\ufffd|\ufffd/#11\ufffd]" + " to trash, click " + "[\ufffd#10\ufffd|\ufffd#11\ufffd]" + "Move" + "[\ufffd/#10\ufffd|\ufffd/#11\ufffd]" + ". Optionally, you can pick an expiration date.",t=e.Zx4(t),o="Protection expires at",i="NOT PROTECTED",_="This image contains snapshot(s), which will prevent it from being removed after moved to trash.",r="Wrong date format. Please use \"YYYY-MM-DD HH:mm:ss\".",c="Protection has already expired. Please pick a future date or leave it empty.",[[3,"modalRef"],[1,"modal-title"],s,[1,"modal-content"],["name","moveForm","novalidate","",1,"form",3,"formGroup"],["formDir","ngForm"],[1,"modal-body"],["class","alert alert-warning","role","alert",4,"ngIf"],t,[1,"form-group"],["for","expiresAt",1,"col-form-label"],o,["type","text","placeholder",i,"formControlName","expiresAt","triggers","manual",1,"form-control",3,"ngbPopover","click","keypress"],["p","ngbPopover"],["class","invalid-feedback",4,"ngIf"],[1,"modal-footer"],[3,"form","submitText","submitActionEvent"],["popContent",""],["role","alert",1,"alert","alert-warning"],_,[1,"invalid-feedback"],r,c,[3,"control"]]},template:function(t,o){if(1&t){const i=e.EpF();e.TgZ(0,"cd-modal",0),e.ynx(1,1),e.SDv(2,2),e.BQk(),e.ynx(3,3),e.TgZ(4,"form",4,5),e.TgZ(6,"div",6),e.YNc(7,__,3,0,"div",7),e.TgZ(8,"p"),e.tHW(9,8),e._UZ(10,"kbd"),e._UZ(11,"kbd"),e.N_p(),e.qZA(),e.TgZ(12,"div",9),e.TgZ(13,"label",10),e.SDv(14,11),e.qZA(),e.TgZ(15,"input",12,13),e.NdJ("click",function(){return e.CHM(i),e.MAs(16).open()})("keypress",function(){return e.CHM(i),e.MAs(16).close()}),e.qZA(),e.YNc(17,a_,2,0,"span",14),e.YNc(18,r_,2,0,"span",14),e.qZA(),e.qZA(),e.TgZ(19,"div",15),e.TgZ(20,"cd-form-button-panel",16),e.NdJ("submitActionEvent",function(){return o.moveImage()}),e.qZA(),e.qZA(),e.qZA(),e.BQk(),e.qZA(),e.YNc(21,l_,1,1,"ng-template",null,17,e.W1O)}if(2&t){const i=e.MAs(5),_=e.MAs(22);e.Q6J("modalRef",o.activeModal),e.xp6(4),e.Q6J("formGroup",o.moveForm),e.xp6(3),e.Q6J("ngIf",o.hasSnapshots),e.xp6(4),e.pQV(o.imageSpecStr),e.QtT(9),e.xp6(4),e.Q6J("ngbPopover",_),e.xp6(2),e.Q6J("ngIf",o.moveForm.showError("expiresAt",i,"format")),e.xp6(1),e.Q6J("ngIf",o.moveForm.showError("expiresAt",i,"expired")),e.xp6(2),e.Q6J("form",o.moveForm)("submitText",o.actionLabels.MOVE)}},directives:[C.z,a._Y,a.JL,a.sg,h.V,l.O5,O.P,$.o,a.Fj,k.b,a.JJ,a.u,N.o8,j.p,s_.J],styles:[""]}),n})();function d_(n,s){1&n&&(e.TgZ(0,"li",10),e.TgZ(1,"a",3),e.SDv(2,11),e.qZA(),e.qZA())}let We=(()=>{class n{constructor(t,o){this.authStorageService=t,this.router=o,this.grafanaPermission=this.authStorageService.getPermissions().grafana}}return n.\u0275fac=function(t){return new(t||n)(e.Y36(oe.j),e.Y36(m.F0))},n.\u0275cmp=e.Xpm({type:n,selectors:[["cd-rbd-tabs"]],decls:12,vars:2,consts:function(){let s,t,o,i;return s="Images",t="Namespaces",o="Trash",i="Overall Performance",[["ngbNav","",1,"nav-tabs",3,"activeId","navChange"],["nav","ngbNav"],["ngbNavItem","/block/rbd"],["ngbNavLink",""],s,["ngbNavItem","/block/rbd/namespaces"],t,["ngbNavItem","/block/rbd/trash"],o,["ngbNavItem","/block/rbd/performance",4,"ngIf"],["ngbNavItem","/block/rbd/performance"],i]},template:function(t,o){1&t&&(e.TgZ(0,"ul",0,1),e.NdJ("navChange",function(_){return o.router.navigate([_.nextId])}),e.TgZ(2,"li",2),e.TgZ(3,"a",3),e.SDv(4,4),e.qZA(),e.qZA(),e.TgZ(5,"li",5),e.TgZ(6,"a",3),e.SDv(7,6),e.qZA(),e.qZA(),e.TgZ(8,"li",7),e.TgZ(9,"a",3),e.SDv(10,8),e.qZA(),e.qZA(),e.YNc(11,d_,3,0,"li",9),e.qZA()),2&t&&(e.Q6J("activeId",o.router.url),e.xp6(11),e.Q6J("ngIf",o.grafanaPermission.read))},directives:[N.Pz,N.nv,N.Vx,l.O5],styles:[""]}),n})();var p_=p(25917),Ft=p(51295),lt=p(60737),g_=p(74255),Dt=p(71099),vt=p(79765);function u_(n,s){1&n&&(e.TgZ(0,"span",16),e.SDv(1,17),e.qZA())}function m_(n,s){if(1&n&&(e.TgZ(0,"span"),e.tHW(1,18),e._UZ(2,"b"),e.N_p(),e.qZA()),2&n){const t=e.oxw();e.xp6(2),e.pQV(t.imageName),e.QtT(1)}}let T_=(()=>{class n{constructor(t,o,i,_,r){this.activeModal=t,this.rbdService=o,this.taskManagerService=i,this.notificationService=_,this.actionLabels=r,this.editing=!1,this.onSubmit=new vt.xQ,this.action=this.actionLabels.CREATE,this.resource="RBD Snapshot",this.createForm()}createForm(){this.snapshotForm=new x.d({snapshotName:new a.NI("",{validators:[a.kI.required]})})}setSnapName(t){this.snapName=t,"snapshot"!==this.mirroring?this.snapshotForm.get("snapshotName").setValue(t):this.snapshotForm.get("snapshotName").clearValidators()}setEditing(t=!0){this.editing=t,this.action=this.editing?this.actionLabels.RENAME:this.actionLabels.CREATE}editAction(){const t=this.snapshotForm.getValue("snapshotName"),o=new L.N(this.poolName,this.namespace,this.imageName),i=new R.R;i.name="rbd/snap/edit",i.metadata={image_spec:o.toString(),snapshot_name:t},this.rbdService.renameSnapshot(o,this.snapName,t).toPromise().then(()=>{this.taskManagerService.subscribe(i.name,i.metadata,_=>{this.notificationService.notifyTask(_)}),this.activeModal.close(),this.onSubmit.next(this.snapName)}).catch(()=>{this.snapshotForm.setErrors({cdSubmitButton:!0})})}createAction(){const t=this.snapshotForm.getValue("snapshotName"),o=new L.N(this.poolName,this.namespace,this.imageName),i=new R.R;i.name="rbd/snap/create",i.metadata={image_spec:o.toString(),snapshot_name:t},this.rbdService.createSnapshot(o,t).toPromise().then(()=>{this.taskManagerService.subscribe(i.name,i.metadata,_=>{this.notificationService.notifyTask(_)}),this.activeModal.close(),this.onSubmit.next(t)}).catch(()=>{this.snapshotForm.setErrors({cdSubmitButton:!0})})}submit(){this.editing?this.editAction():this.createAction()}}return n.\u0275fac=function(t){return new(t||n)(e.Y36(N.Kz),e.Y36(q),e.Y36(Dt.k),e.Y36(ve.g),e.Y36(v.p4))},n.\u0275cmp=e.Xpm({type:n,selectors:[["cd-rbd-snapshot-form-modal"]],decls:22,vars:17,consts:function(){let s,t,o,i;return s="" + "\ufffd0\ufffd" + " " + "\ufffd1\ufffd" + "",t="Name",o="This field is required.",i="Snapshot mode is enabled on image " + "\ufffd#2\ufffd" + "" + "\ufffd0\ufffd" + "" + "\ufffd/#2\ufffd" + ": snapshot names are auto generated",[[3,"modalRef"],[1,"modal-title"],s,[1,"modal-content"],["name","snapshotForm","novalidate","",3,"formGroup"],["formDir","ngForm"],[1,"modal-body"],[1,"form-group","row"],["for","snapshotName",1,"cd-col-form-label","required"],t,[1,"cd-col-form-input"],["type","text","placeholder","Snapshot name...","id","snapshotName","name","snapshotName","formControlName","snapshotName","autofocus","",1,"form-control"],["class","invalid-feedback",4,"ngIf"],[4,"ngIf"],[1,"modal-footer"],[3,"form","submitText","submitActionEvent"],[1,"invalid-feedback"],o,i]},template:function(t,o){if(1&t&&(e.TgZ(0,"cd-modal",0),e.ynx(1,1),e.SDv(2,2),e.ALo(3,"titlecase"),e.ALo(4,"upperFirst"),e.BQk(),e.ynx(5,3),e.TgZ(6,"form",4,5),e.TgZ(8,"div",6),e.TgZ(9,"div",7),e.TgZ(10,"label",8),e.SDv(11,9),e.qZA(),e.TgZ(12,"div",10),e._UZ(13,"input",11),e.YNc(14,u_,2,0,"span",12),e._UZ(15,"br"),e._UZ(16,"br"),e.YNc(17,m_,3,1,"span",13),e.qZA(),e.qZA(),e.qZA(),e.TgZ(18,"div",14),e.TgZ(19,"cd-form-button-panel",15),e.NdJ("submitActionEvent",function(){return o.submit()}),e.ALo(20,"titlecase"),e.ALo(21,"upperFirst"),e.qZA(),e.qZA(),e.qZA(),e.BQk(),e.qZA()),2&t){const i=e.MAs(7);e.Q6J("modalRef",o.activeModal),e.xp6(4),e.pQV(e.lcZ(3,9,o.action))(e.lcZ(4,11,o.resource)),e.QtT(2),e.xp6(2),e.Q6J("formGroup",o.snapshotForm),e.xp6(7),e.uIk("disabled","snapshot"===o.mirroring||null),e.xp6(1),e.Q6J("ngIf",o.snapshotForm.showError("snapshotName",i,"required")),e.xp6(3),e.Q6J("ngIf","snapshot"===o.mirroring),e.xp6(2),e.Q6J("form",o.snapshotForm)("submitText",e.lcZ(20,13,o.action)+" "+e.lcZ(21,15,o.resource))}},directives:[C.z,a._Y,a.JL,a.sg,h.V,O.P,$.o,a.Fj,k.b,a.JJ,a.u,Re.U,l.O5,j.p],pipes:[l.rS,et.m],styles:[""]}),n})();class f_{constructor(s,t,o){this.featuresName=t,this.cloneFormatVersion=1,o.cloneFormatVersion().subscribe(i=>{this.cloneFormatVersion=i}),this.create={permission:"create",icon:T.P.add,name:s.CREATE},this.rename={permission:"update",icon:T.P.edit,name:s.RENAME,disable:i=>this.disableForMirrorSnapshot(i)},this.protect={permission:"update",icon:T.P.lock,visible:i=>i.hasSingleSelection&&!i.first().is_protected,name:s.PROTECT,disable:i=>this.disableForMirrorSnapshot(i)},this.unprotect={permission:"update",icon:T.P.unlock,visible:i=>i.hasSingleSelection&&i.first().is_protected,name:s.UNPROTECT,disable:i=>this.disableForMirrorSnapshot(i)},this.clone={permission:"create",canBePrimary:i=>i.hasSingleSelection,disable:i=>this.getCloneDisableDesc(i,this.featuresName)||this.disableForMirrorSnapshot(i),icon:T.P.clone,name:s.CLONE},this.copy={permission:"create",canBePrimary:i=>i.hasSingleSelection,disable:i=>!i.hasSingleSelection||i.first().cdExecuting||this.disableForMirrorSnapshot(i),icon:T.P.copy,name:s.COPY},this.rollback={permission:"update",icon:T.P.undo,name:s.ROLLBACK,disable:i=>this.disableForMirrorSnapshot(i)},this.deleteSnap={permission:"delete",icon:T.P.destroy,disable:i=>{const _=i.first();return!i.hasSingleSelection||_.cdExecuting||_.is_protected||this.disableForMirrorSnapshot(i)},name:s.DELETE},this.ordering=[this.create,this.rename,this.protect,this.unprotect,this.clone,this.copy,this.rollback,this.deleteSnap]}getCloneDisableDesc(s,t){return!(s.hasSingleSelection&&!s.first().cdExecuting)||((null==t?void 0:t.includes("layering"))?1===this.cloneFormatVersion&&!s.first().is_protected&&"Snapshot must be protected in order to clone.":"Parent image must support Layering")}disableForMirrorSnapshot(s){return s.hasSingleSelection&&"snapshot"===s.first().mirror_mode&&s.first().name.includes(".mirror.")}}class C_{}var Ze=p(96102);const S_=["nameTpl"],E_=["rollbackTpl"];function R_(n,s){if(1&n&&(e.ynx(0),e.SDv(1,3),e.BQk(),e.TgZ(2,"strong"),e._uU(3),e.qZA(),e._uU(4,".\n")),2&n){const t=s.$implicit;e.xp6(3),e.hij(" ",t.snapName,"")}}let M_=(()=>{class n{constructor(t,o,i,_,r,c,d,g,f,I,P){this.authStorageService=t,this.modalService=o,this.dimlessBinaryPipe=i,this.cdDatePipe=_,this.rbdService=r,this.taskManagerService=c,this.notificationService=d,this.summaryService=g,this.taskListService=f,this.actionLabels=I,this.cdr=P,this.snapshots=[],this.selection=new Se.r,this.builders={"rbd/snap/create":Z=>{const B=new C_;return B.name=Z.snapshot_name,B}},this.permission=this.authStorageService.getPermissions().rbdImage}ngOnInit(){this.columns=[{name:"Name",prop:"name",cellTransformation:De.e.executing,flexGrow:2},{name:"Size",prop:"size",flexGrow:1,cellClass:"text-right",pipe:this.dimlessBinaryPipe},{name:"Provisioned",prop:"disk_usage",flexGrow:1,cellClass:"text-right",pipe:this.dimlessBinaryPipe},{name:"State",prop:"is_protected",flexGrow:1,cellTransformation:De.e.badge,customTemplateConfig:{map:{true:{value:"PROTECTED",class:"badge-success"},false:{value:"UNPROTECTED",class:"badge-info"}}}},{name:"Created",prop:"timestamp",flexGrow:1,pipe:this.cdDatePipe}],this.imageSpec=new L.N(this.poolName,this.namespace,this.rbdName),this.rbdTableActions=new f_(this.actionLabels,this.featuresName,this.rbdService),this.rbdTableActions.create.click=()=>this.openCreateSnapshotModal(),this.rbdTableActions.rename.click=()=>this.openEditSnapshotModal(),this.rbdTableActions.protect.click=()=>this.toggleProtection(),this.rbdTableActions.unprotect.click=()=>this.toggleProtection();const t=()=>this.selection.first()&&`${this.imageSpec.toStringEncoded()}/${encodeURIComponent(this.selection.first().name)}`;this.rbdTableActions.clone.routerLink=()=>`/block/rbd/clone/${t()}`,this.rbdTableActions.copy.routerLink=()=>`/block/rbd/copy/${t()}`,this.rbdTableActions.rollback.click=()=>this.rollbackModal(),this.rbdTableActions.deleteSnap.click=()=>this.deleteSnapshotModal(),this.tableActions=this.rbdTableActions.ordering,this.taskListService.init(()=>(0,p_.of)(this.snapshots),null,_=>{Ft.T.updateChanged(this,{data:_})&&(this.cdr.detectChanges(),this.data=[...this.data])},()=>{Ft.T.updateChanged(this,{data:this.snapshots})&&(this.cdr.detectChanges(),this.data=[...this.data])},_=>["rbd/snap/create","rbd/snap/delete","rbd/snap/edit","rbd/snap/rollback"].includes(_.name)&&this.imageSpec.toString()===_.metadata.image_spec,(_,r)=>_.name===r.metadata.snapshot_name,this.builders)}ngOnChanges(){this.columns&&(this.imageSpec=new L.N(this.poolName,this.namespace,this.rbdName),this.rbdTableActions&&(this.rbdTableActions.featuresName=this.featuresName),this.taskListService.fetch())}openSnapshotModal(t,o=null){this.modalRef=this.modalService.show(T_,{mirroring:this.mirroring}),this.modalRef.componentInstance.poolName=this.poolName,this.modalRef.componentInstance.imageName=this.rbdName,this.modalRef.componentInstance.namespace=this.namespace,o?this.modalRef.componentInstance.setEditing():o=`${this.rbdName}_${Me()().toISOString(!0)}`,this.modalRef.componentInstance.setSnapName(o),this.modalRef.componentInstance.onSubmit.subscribe(_=>{const r=new lt.o;r.name=t,r.metadata={image_spec:this.imageSpec.toString(),snapshot_name:_},this.summaryService.addRunningTask(r)})}openCreateSnapshotModal(){this.openSnapshotModal("rbd/snap/create")}openEditSnapshotModal(){this.openSnapshotModal("rbd/snap/edit",this.selection.first().name)}toggleProtection(){const t=this.selection.first().name,o=this.selection.first().is_protected,i=new R.R;i.name="rbd/snap/edit";const _=new L.N(this.poolName,this.namespace,this.rbdName);i.metadata={image_spec:_.toString(),snapshot_name:t},this.rbdService.protectSnapshot(_,t,!o).toPromise().then(()=>{const r=new lt.o;r.name=i.name,r.metadata=i.metadata,this.summaryService.addRunningTask(r),this.taskManagerService.subscribe(i.name,i.metadata,c=>{this.notificationService.notifyTask(c)})})}_asyncTask(t,o,i){const _=new R.R;_.name=o,_.metadata={image_spec:new L.N(this.poolName,this.namespace,this.rbdName).toString(),snapshot_name:i};const r=new L.N(this.poolName,this.namespace,this.rbdName);this.rbdService[t](r,i).toPromise().then(()=>{const c=new lt.o;c.name=_.name,c.metadata=_.metadata,this.summaryService.addRunningTask(c),this.modalRef.close(),this.taskManagerService.subscribe(c.name,c.metadata,d=>{this.notificationService.notifyTask(d)})}).catch(()=>{this.modalRef.componentInstance.stopLoadingSpinner()})}rollbackModal(){const t=this.selection.selected[0].name,o=new L.N(this.poolName,this.namespace,this.rbdName).toString(),i={titleText:"RBD snapshot rollback",buttonText:"Rollback",bodyTpl:this.rollbackTpl,bodyData:{snapName:`${o}@${t}`},onSubmit:()=>{this._asyncTask("rollbackSnapshot","rbd/snap/rollback",t)}};this.modalRef=this.modalService.show(Nt.Y,i)}deleteSnapshotModal(){const t=this.selection.selected[0].name;this.modalRef=this.modalService.show(pe.M,{itemDescription:"RBD snapshot",itemNames:[t],submitAction:()=>this._asyncTask("deleteSnapshot","rbd/snap/delete",t)})}updateSelection(t){this.selection=t}}return n.\u0275fac=function(t){return new(t||n)(e.Y36(oe.j),e.Y36(de.Z),e.Y36(Le.$),e.Y36(Ze.N),e.Y36(q),e.Y36(Dt.k),e.Y36(ve.g),e.Y36(g_.J),e.Y36(ce.j),e.Y36(v.p4),e.Y36(e.sBO))},n.\u0275cmp=e.Xpm({type:n,selectors:[["cd-rbd-snapshot-list"]],viewQuery:function(t,o){if(1&t&&(e.Gf(S_,5),e.Gf(E_,7)),2&t){let i;e.iGM(i=e.CRH())&&(o.nameTpl=i.first),e.iGM(i=e.CRH())&&(o.rollbackTpl=i.first)}},inputs:{snapshots:"snapshots",featuresName:"featuresName",poolName:"poolName",namespace:"namespace",mirroring:"mirroring",rbdName:"rbdName"},features:[e._Bn([ce.j]),e.TTD],decls:4,vars:5,consts:function(){let s;return s="You are about to rollback",[["columnMode","flex","selectionType","single",3,"data","columns","updateSelection"],[1,"table-actions",3,"permission","selection","tableActions"],["rollbackTpl",""],s]},template:function(t,o){1&t&&(e.TgZ(0,"cd-table",0),e.NdJ("updateSelection",function(_){return o.updateSelection(_)}),e._UZ(1,"cd-table-actions",1),e.qZA(),e.YNc(2,R_,5,1,"ng-template",null,2,e.W1O)),2&t&&(e.Q6J("data",o.data)("columns",o.columns),e.xp6(1),e.Q6J("permission",o.permission)("selection",o.selection)("tableActions",o.tableActions))},directives:[W.a,Ee.K],styles:[""],changeDetection:0}),n})();var O_=p(71752),Lt=p(76317),A_=p(41039);const h_=["poolConfigurationSourceTpl"];function P_(n,s){1&n&&(e.ynx(0),e.tHW(1,3),e._UZ(2,"strong"),e.N_p(),e.BQk())}function I_(n,s){if(1&n&&(e.TgZ(0,"span"),e.TgZ(1,"span",38),e._uU(2),e.qZA(),e.qZA()),2&n){const t=s.$implicit;e.xp6(2),e.Oqu(t)}}function b_(n,s){if(1&n&&(e.TgZ(0,"span"),e.TgZ(1,"span",39),e.SDv(2,40),e.qZA(),e.qZA()),2&n){e.oxw(3);const t=e.MAs(1);e.xp6(1),e.Q6J("ngbTooltip",t)}}function N_(n,s){if(1&n&&(e.TgZ(0,"span"),e._uU(1),e.ALo(2,"dimlessBinary"),e.qZA()),2&n){const t=e.oxw(3);e.xp6(1),e.hij(" ",e.lcZ(2,1,t.selection.disk_usage)," ")}}function F_(n,s){if(1&n&&(e.TgZ(0,"span"),e.TgZ(1,"span",39),e.SDv(2,41),e.qZA(),e.qZA()),2&n){e.oxw(3);const t=e.MAs(1);e.xp6(1),e.Q6J("ngbTooltip",t)}}function D_(n,s){if(1&n&&(e.TgZ(0,"span"),e._uU(1),e.ALo(2,"dimlessBinary"),e.qZA()),2&n){const t=e.oxw(3);e.xp6(1),e.hij(" ",e.lcZ(2,1,t.selection.total_disk_usage)," ")}}function v_(n,s){if(1&n&&(e.TgZ(0,"span"),e._uU(1),e.qZA()),2&n){const t=e.oxw(4);e.xp6(1),e.hij("/",t.selection.parent.pool_namespace,"")}}function L_(n,s){if(1&n&&(e.TgZ(0,"span"),e._uU(1),e.YNc(2,v_,2,1,"span",1),e._uU(3),e.qZA()),2&n){const t=e.oxw(3);e.xp6(1),e.Oqu(t.selection.parent.pool_name),e.xp6(1),e.Q6J("ngIf",t.selection.parent.pool_namespace),e.xp6(1),e.AsE("/",t.selection.parent.image_name,"@",t.selection.parent.snap_name,"")}}function $_(n,s){1&n&&(e.TgZ(0,"span"),e._uU(1,"-"),e.qZA())}function Z_(n,s){if(1&n&&(e.TgZ(0,"table",17),e.TgZ(1,"tbody"),e.TgZ(2,"tr"),e.TgZ(3,"td",18),e.SDv(4,19),e.qZA(),e.TgZ(5,"td",20),e._uU(6),e.qZA(),e.qZA(),e.TgZ(7,"tr"),e.TgZ(8,"td",21),e.SDv(9,22),e.qZA(),e.TgZ(10,"td"),e._uU(11),e.qZA(),e.qZA(),e.TgZ(12,"tr"),e.TgZ(13,"td",21),e.SDv(14,23),e.qZA(),e.TgZ(15,"td"),e._uU(16),e.ALo(17,"empty"),e.qZA(),e.qZA(),e.TgZ(18,"tr"),e.TgZ(19,"td",21),e.SDv(20,24),e.qZA(),e.TgZ(21,"td"),e._uU(22),e.ALo(23,"cdDate"),e.qZA(),e.qZA(),e.TgZ(24,"tr"),e.TgZ(25,"td",21),e.SDv(26,25),e.qZA(),e.TgZ(27,"td"),e._uU(28),e.ALo(29,"dimlessBinary"),e.qZA(),e.qZA(),e.TgZ(30,"tr"),e.TgZ(31,"td",21),e.SDv(32,26),e.qZA(),e.TgZ(33,"td"),e._uU(34),e.ALo(35,"dimless"),e.qZA(),e.qZA(),e.TgZ(36,"tr"),e.TgZ(37,"td",21),e.SDv(38,27),e.qZA(),e.TgZ(39,"td"),e._uU(40),e.ALo(41,"dimlessBinary"),e.qZA(),e.qZA(),e.TgZ(42,"tr"),e.TgZ(43,"td",21),e.SDv(44,28),e.qZA(),e.TgZ(45,"td"),e.YNc(46,I_,3,1,"span",29),e.qZA(),e.qZA(),e.TgZ(47,"tr"),e.TgZ(48,"td",21),e.SDv(49,30),e.qZA(),e.TgZ(50,"td"),e.YNc(51,b_,3,1,"span",1),e.YNc(52,N_,3,3,"span",1),e.qZA(),e.qZA(),e.TgZ(53,"tr"),e.TgZ(54,"td",21),e.SDv(55,31),e.qZA(),e.TgZ(56,"td"),e.YNc(57,F_,3,1,"span",1),e.YNc(58,D_,3,3,"span",1),e.qZA(),e.qZA(),e.TgZ(59,"tr"),e.TgZ(60,"td",21),e.SDv(61,32),e.qZA(),e.TgZ(62,"td"),e._uU(63),e.ALo(64,"dimlessBinary"),e.qZA(),e.qZA(),e.TgZ(65,"tr"),e.TgZ(66,"td",21),e.SDv(67,33),e.qZA(),e.TgZ(68,"td"),e._uU(69),e.qZA(),e.qZA(),e.TgZ(70,"tr"),e.TgZ(71,"td",21),e.SDv(72,34),e.qZA(),e.TgZ(73,"td"),e.YNc(74,L_,4,4,"span",1),e.YNc(75,$_,2,0,"span",1),e.qZA(),e.qZA(),e.TgZ(76,"tr"),e.TgZ(77,"td",21),e.SDv(78,35),e.qZA(),e.TgZ(79,"td"),e._uU(80),e.qZA(),e.qZA(),e.TgZ(81,"tr"),e.TgZ(82,"td",21),e.SDv(83,36),e.qZA(),e.TgZ(84,"td"),e._uU(85),e.qZA(),e.qZA(),e.TgZ(86,"tr"),e.TgZ(87,"td",21),e.SDv(88,37),e.qZA(),e.TgZ(89,"td"),e._uU(90),e.qZA(),e.qZA(),e.qZA(),e.qZA()),2&n){const t=e.oxw(2);e.xp6(6),e.Oqu(t.selection.name),e.xp6(5),e.Oqu(t.selection.pool_name),e.xp6(5),e.Oqu(e.lcZ(17,19,t.selection.data_pool)),e.xp6(6),e.Oqu(e.lcZ(23,21,t.selection.timestamp)),e.xp6(6),e.Oqu(e.lcZ(29,23,t.selection.size)),e.xp6(6),e.Oqu(e.lcZ(35,25,t.selection.num_objs)),e.xp6(6),e.Oqu(e.lcZ(41,27,t.selection.obj_size)),e.xp6(6),e.Q6J("ngForOf",t.selection.features_name),e.xp6(5),e.Q6J("ngIf",-1===(null==t.selection.features_name?null:t.selection.features_name.indexOf("fast-diff"))),e.xp6(1),e.Q6J("ngIf",-1!==(null==t.selection.features_name?null:t.selection.features_name.indexOf("fast-diff"))),e.xp6(5),e.Q6J("ngIf",-1===(null==t.selection.features_name?null:t.selection.features_name.indexOf("fast-diff"))),e.xp6(1),e.Q6J("ngIf",-1!==(null==t.selection.features_name?null:t.selection.features_name.indexOf("fast-diff"))),e.xp6(5),e.Oqu(e.lcZ(64,29,t.selection.stripe_unit)),e.xp6(6),e.Oqu(t.selection.stripe_count),e.xp6(5),e.Q6J("ngIf",t.selection.parent),e.xp6(1),e.Q6J("ngIf",!t.selection.parent),e.xp6(5),e.Oqu(t.selection.block_name_prefix),e.xp6(5),e.Oqu(t.selection.order),e.xp6(5),e.Oqu(t.selection.image_format)}}function B_(n,s){if(1&n&&e._UZ(0,"cd-rbd-snapshot-list",42),2&n){const t=e.oxw(2);e.Q6J("snapshots",t.selection.snapshots)("featuresName",t.selection.features_name)("poolName",t.selection.pool_name)("namespace",t.selection.namespace)("mirroring",t.selection.mirror_mode)("rbdName",t.selection.name)}}function G_(n,s){if(1&n&&e._UZ(0,"cd-rbd-configuration-table",43),2&n){const t=e.oxw(2);e.Q6J("data",t.selection.configuration)}}function y_(n,s){if(1&n&&e._UZ(0,"cd-grafana",44),2&n){const t=e.oxw(2);e.Q6J("grafanaPath",t.rbdDashboardUrl)("type","metrics")}}function x_(n,s){if(1&n&&(e.ynx(0),e.TgZ(1,"ul",4,5),e.TgZ(3,"li",6),e.TgZ(4,"a",7),e.SDv(5,8),e.qZA(),e.YNc(6,Z_,91,31,"ng-template",9),e.qZA(),e.TgZ(7,"li",10),e.TgZ(8,"a",7),e.SDv(9,11),e.qZA(),e.YNc(10,B_,1,6,"ng-template",9),e.qZA(),e.TgZ(11,"li",12),e.TgZ(12,"a",7),e.SDv(13,13),e.qZA(),e.YNc(14,G_,1,1,"ng-template",9),e.qZA(),e.TgZ(15,"li",14),e.TgZ(16,"a",7),e.SDv(17,15),e.qZA(),e.YNc(18,y_,1,2,"ng-template",9),e.qZA(),e.qZA(),e._UZ(19,"div",16),e.BQk()),2&n){const t=e.MAs(2);e.xp6(19),e.Q6J("ngbNavOutlet",t)}}function w_(n,s){1&n&&(e.ynx(0),e.TgZ(1,"cd-alert-panel",45),e.SDv(2,46),e.qZA(),e.BQk())}function q_(n,s){1&n&&(e.ynx(0),e.TgZ(1,"strong",49),e.SDv(2,50),e.qZA(),e.BQk())}function H_(n,s){1&n&&(e.TgZ(0,"span",51),e.SDv(1,52),e.qZA())}function k_(n,s){if(1&n&&(e.YNc(0,q_,3,0,"ng-container",47),e.YNc(1,H_,2,0,"ng-template",null,48,e.W1O)),2&n){const t=s.value,o=e.MAs(2);e.Q6J("ngIf",+t)("ngIfElse",o)}}let K_=(()=>{class n{ngOnChanges(){this.selection&&(this.rbdDashboardUrl=`rbd-details?var-Pool=${this.selection.pool_name}&var-Image=${this.selection.name}`)}}return n.\u0275fac=function(t){return new(t||n)},n.\u0275cmp=e.Xpm({type:n,selectors:[["cd-rbd-details"]],viewQuery:function(t,o){if(1&t&&(e.Gf(h_,7),e.Gf(N.Pz,7)),2&t){let i;e.iGM(i=e.CRH())&&(o.poolConfigurationSourceTpl=i.first),e.iGM(i=e.CRH())&&(o.nav=i.first)}},inputs:{selection:"selection",images:"images"},features:[e.TTD],decls:6,vars:2,consts:function(){let s,t,o,i,_,r,c,d,g,f,I,P,Z,B,Q,Y,ee,te,w,_e,ae,M,ge,ue,me,Te,fe,Ce;return s="Only available for RBD images with " + "\ufffd#2\ufffd" + "fast-diff" + "\ufffd/#2\ufffd" + " enabled",t="Details",o="Snapshots",i="Configuration",_="Performance",r="Name",c="Pool",d="Data Pool",g="Created",f="Size",I="Objects",P="Object size",Z="Features",B="Provisioned",Q="Total provisioned",Y="Striping unit",ee="Striping count",te="Parent",w="Block name prefix",_e="Order",ae="Format Version",M="N/A",ge="N/A",ue="Information can not be displayed for RBD in status 'Removing'.",me="This setting overrides the global value",Te="Image",fe="This is the global value. No value for this option has been set for this image.",Ce="Global",[["usageNotAvailableTooltipTpl",""],[4,"ngIf"],["poolConfigurationSourceTpl",""],s,["ngbNav","","cdStatefulTab","rbd-details",1,"nav-tabs"],["nav","ngbNav"],["ngbNavItem","details"],["ngbNavLink",""],t,["ngbNavContent",""],["ngbNavItem","snapshots"],o,["ngbNavItem","configuration"],i,["ngbNavItem","performance"],_,[3,"ngbNavOutlet"],[1,"table","table-striped","table-bordered"],[1,"bold","w-25"],r,[1,"w-75"],[1,"bold"],c,d,g,f,I,P,Z,[4,"ngFor","ngForOf"],B,Q,Y,ee,te,w,_e,ae,[1,"badge","badge-dark","mr-2"],["placement","top",1,"form-text","text-muted",3,"ngbTooltip"],M,ge,[3,"snapshots","featuresName","poolName","namespace","mirroring","rbdName"],[3,"data"],["uid","YhCYGcuZz","grafanaStyle","one",3,"grafanaPath","type"],["type","warning"],ue,[4,"ngIf","ngIfElse"],["global",""],["ngbTooltip",me],Te,["ngbTooltip",fe],Ce]},template:function(t,o){1&t&&(e.YNc(0,P_,3,0,"ng-template",null,0,e.W1O),e.YNc(2,x_,20,1,"ng-container",1),e.YNc(3,w_,3,0,"ng-container",1),e.YNc(4,k_,3,2,"ng-template",null,2,e.W1O)),2&t&&(e.xp6(2),e.Q6J("ngIf",o.selection&&"REMOVING"!==o.selection.source),e.xp6(1),e.Q6J("ngIf",o.selection&&"REMOVING"===o.selection.source))},directives:[l.O5,N.Pz,Mt.m,N.nv,N.Vx,N.uN,N.tO,l.sg,N._L,M_,O_.P,Lt.F,Ct.G],pipes:[A_.W,Ze.N,Le.$,ot.n],styles:[""]}),n})();const X_=["usageTpl"],Q_=["parentTpl"],z_=["nameTpl"],J_=["mirroringTpl"],Y_=["flattenTpl"],V_=["deleteTpl"],U_=["removingStatTpl"],j_=["provisionedNotAvailableTooltipTpl"],W_=["totalProvisionedNotAvailableTooltipTpl"];function ea(n,s){1&n&&e._UZ(0,"div",12),2&n&&e.Q6J("innerHtml","Only available for RBD images with <strong>fast-diff</strong> enabled",e.oJD)}function ta(n,s){if(1&n&&(e.TgZ(0,"span",15),e.SDv(1,16),e.qZA()),2&n){const t=e.oxw(2);e.Q6J("ngbTooltip",t.usageNotAvailableTooltipTpl)}}function oa(n,s){if(1&n&&(e.SDv(0,17),e.ALo(1,"dimlessBinary")),2&n){const t=e.oxw().row;e.xp6(1),e.pQV(e.lcZ(1,1,t.disk_usage)),e.QtT(0)}}function na(n,s){if(1&n&&(e.YNc(0,ta,2,1,"span",13),e.YNc(1,oa,2,3,"ng-template",null,14,e.W1O)),2&n){const t=s.row,o=e.MAs(2);e.Q6J("ngIf",null===t.disk_usage&&!t.features_name.includes("fast-diff"))("ngIfElse",o)}}function ia(n,s){if(1&n&&(e.TgZ(0,"span",15),e.SDv(1,19),e.qZA()),2&n){const t=e.oxw(2);e.Q6J("ngbTooltip",t.usageNotAvailableTooltipTpl)}}function sa(n,s){if(1&n&&(e.SDv(0,20),e.ALo(1,"dimlessBinary")),2&n){const t=e.oxw().row;e.xp6(1),e.pQV(e.lcZ(1,1,t.total_disk_usage)),e.QtT(0)}}function _a(n,s){if(1&n&&(e.YNc(0,ia,2,1,"span",13),e.YNc(1,sa,2,3,"ng-template",null,18,e.W1O)),2&n){const t=s.row,o=e.MAs(2);e.Q6J("ngIf",null===t.total_disk_usage&&!t.features_name.includes("fast-diff"))("ngIfElse",o)}}function aa(n,s){if(1&n&&(e.TgZ(0,"span"),e._uU(1),e.qZA()),2&n){const t=e.oxw(2).value;e.xp6(1),e.hij("/",t.pool_namespace,"")}}function ra(n,s){if(1&n&&(e.TgZ(0,"span"),e._uU(1),e.YNc(2,aa,2,1,"span",21),e._uU(3),e.qZA()),2&n){const t=e.oxw().value;e.xp6(1),e.Oqu(t.pool_name),e.xp6(1),e.Q6J("ngIf",t.pool_namespace),e.xp6(1),e.AsE("/",t.image_name,"@",t.snap_name,"")}}function la(n,s){1&n&&(e.TgZ(0,"span"),e._uU(1,"-"),e.qZA())}function ca(n,s){if(1&n&&(e.YNc(0,ra,4,4,"span",21),e.YNc(1,la,2,0,"span",21)),2&n){const t=s.value;e.Q6J("ngIf",t),e.xp6(1),e.Q6J("ngIf",!t)}}function da(n,s){if(1&n&&(e.TgZ(0,"span",26),e._uU(1),e.qZA()),2&n){const t=e.oxw().value;e.xp6(1),e.Oqu(t[0])}}function pa(n,s){if(1&n&&(e.TgZ(0,"span",27),e.ALo(1,"cdDate"),e._uU(2),e.qZA()),2&n){const t=e.oxw().value;e.Q6J("ngbTooltip","Next scheduled snapshot on "+e.lcZ(1,2,t[2])),e.xp6(2),e.Oqu(t[1])}}function ga(n,s){1&n&&(e.TgZ(0,"span",26),e.SDv(1,28),e.qZA())}function ua(n,s){1&n&&(e.TgZ(0,"span",26),e.SDv(1,29),e.qZA())}function ma(n,s){if(1&n&&(e.TgZ(0,"span",26),e._uU(1),e.qZA()),2&n){const t=e.oxw().value;e.xp6(1),e.Oqu(t)}}function Ta(n,s){if(1&n&&(e.YNc(0,da,2,1,"span",22),e._uU(1,"\xa0 "),e.YNc(2,pa,3,4,"span",23),e.YNc(3,ga,2,0,"span",24),e.YNc(4,ua,2,0,"span",24),e.YNc(5,ma,2,1,"ng-template",null,25,e.W1O)),2&n){const t=s.value,o=s.row,i=e.MAs(6);e.Q6J("ngIf",3===t.length)("ngIfElse",i),e.xp6(2),e.Q6J("ngIf",3===t.length),e.xp6(1),e.Q6J("ngIf",!0===o.primary),e.xp6(1),e.Q6J("ngIf",!1===o.primary)}}function fa(n,s){if(1&n&&(e._uU(0," You are about to flatten "),e.TgZ(1,"strong"),e._uU(2),e.qZA(),e._uU(3,". "),e._UZ(4,"br"),e._UZ(5,"br"),e._uU(6," All blocks will be copied from parent "),e.TgZ(7,"strong"),e._uU(8),e.qZA(),e._uU(9," to child "),e.TgZ(10,"strong"),e._uU(11),e.qZA(),e._uU(12,".\n")),2&n){const t=s.$implicit;e.xp6(2),e.Oqu(t.child),e.xp6(6),e.Oqu(t.parent),e.xp6(3),e.Oqu(t.child)}}function Ca(n,s){if(1&n&&(e.TgZ(0,"li"),e._uU(1),e.qZA()),2&n){const t=s.$implicit;e.xp6(1),e.Oqu(t)}}function Sa(n,s){if(1&n&&(e.ynx(0),e.TgZ(1,"span"),e.SDv(2,33),e.qZA(),e.TgZ(3,"ul"),e.YNc(4,Ca,2,1,"li",34),e.qZA(),e.BQk()),2&n){const t=e.oxw(2).snapshots;e.xp6(4),e.Q6J("ngForOf",t)}}function Ea(n,s){if(1&n&&(e.TgZ(0,"div",31),e.TgZ(1,"span"),e.SDv(2,32),e.qZA(),e._UZ(3,"br"),e.YNc(4,Sa,5,1,"ng-container",21),e.qZA()),2&n){const t=e.oxw().snapshots;e.xp6(4),e.Q6J("ngIf",t.length>0)}}function Ra(n,s){1&n&&e.YNc(0,Ea,5,1,"div",30),2&n&&e.Q6J("ngIf",s.hasSnapshots)}const Ma=function(n,s){return[n,s]};function Oa(n,s){if(1&n&&e._UZ(0,"i",36),2&n){const t=e.oxw(2);e.Q6J("ngClass",e.WLB(1,Ma,t.icons.spinner,t.icons.spin))}}function Aa(n,s){if(1&n&&(e.TgZ(0,"span",36),e._uU(1),e.qZA()),2&n){const t=e.oxw(),o=t.column,i=t.row;e.Q6J("ngClass",null!=o&&null!=o.customTemplateConfig&&o.customTemplateConfig.executingClass?o.customTemplateConfig.executingClass:"text-muted italic"),e.xp6(1),e.hij(" (",i.cdExecuting,") ")}}function ha(n,s){if(1&n&&e._UZ(0,"i",38),2&n){const t=e.oxw(2);e.Gre("",t.icons.warning," warn")}}function Pa(n,s){if(1&n&&(e.YNc(0,Oa,1,4,"i",35),e.TgZ(1,"span",36),e._uU(2),e.qZA(),e.YNc(3,Aa,2,2,"span",35),e.YNc(4,ha,1,3,"i",37)),2&n){const t=s.column,o=s.value,i=s.row;e.Q6J("ngIf",i.cdExecuting),e.xp6(1),e.Q6J("ngClass",null==t||null==t.customTemplateConfig?null:t.customTemplateConfig.valueClass),e.xp6(1),e.hij(" ",o," "),e.xp6(1),e.Q6J("ngIf",i.cdExecuting),e.xp6(1),e.Q6J("ngIf",i.source&&"REMOVING"===i.source)}}let ba=(()=>{class n extends mt.o{constructor(t,o,i,_,r,c,d,g,f){super(),this.authStorageService=t,this.rbdService=o,this.dimlessBinaryPipe=i,this.dimlessPipe=_,this.modalService=r,this.taskWrapper=c,this.taskListService=d,this.urlBuilder=g,this.actionLabels=f,this.tableStatus=new bt.c("light"),this.selection=new Se.r,this.icons=T.P,this.count=0,this.tableContext=null,this.builders={"rbd/create":M=>this.createRbdFromTask(M.pool_name,M.namespace,M.image_name),"rbd/delete":M=>this.createRbdFromTaskImageSpec(M.image_spec),"rbd/clone":M=>this.createRbdFromTask(M.child_pool_name,M.child_namespace,M.child_image_name),"rbd/copy":M=>this.createRbdFromTask(M.dest_pool_name,M.dest_namespace,M.dest_image_name)},this.permission=this.authStorageService.getPermissions().rbdImage;const I=()=>this.selection.first()&&new L.N(this.selection.first().pool_name,this.selection.first().namespace,this.selection.first().name).toStringEncoded();this.tableActions=[{permission:"create",icon:T.P.add,routerLink:()=>this.urlBuilder.getCreate(),canBePrimary:M=>!M.hasSingleSelection,name:this.actionLabels.CREATE},{permission:"update",icon:T.P.edit,routerLink:()=>this.urlBuilder.getEdit(I()),name:this.actionLabels.EDIT,disable:M=>this.getRemovingStatusDesc(M)||this.getInvalidNameDisable(M)},{permission:"create",canBePrimary:M=>M.hasSingleSelection,disable:M=>this.getRemovingStatusDesc(M)||this.getInvalidNameDisable(M)||!!M.first().cdExecuting,icon:T.P.copy,routerLink:()=>`/block/rbd/copy/${I()}`,name:this.actionLabels.COPY},{permission:"update",disable:M=>this.getRemovingStatusDesc(M)||this.getInvalidNameDisable(M)||M.first().cdExecuting||!M.first().parent,icon:T.P.flatten,click:()=>this.flattenRbdModal(),name:this.actionLabels.FLATTEN},{permission:"update",icon:T.P.refresh,click:()=>this.resyncRbdModal(),name:this.actionLabels.RESYNC,disable:M=>this.getResyncDisableDesc(M)},{permission:"delete",icon:T.P.destroy,click:()=>this.deleteRbdModal(),name:this.actionLabels.DELETE,disable:M=>this.getDeleteDisableDesc(M)},{permission:"delete",icon:T.P.trash,click:()=>this.trashRbdModal(),name:this.actionLabels.TRASH,disable:M=>this.getRemovingStatusDesc(M)||this.getInvalidNameDisable(M)||M.first().image_format===Pe.V1},{permission:"update",icon:T.P.edit,click:()=>this.removeSchedulingModal(),name:this.actionLabels.REMOVE_SCHEDULING,disable:M=>this.getRemovingStatusDesc(M)||this.getInvalidNameDisable(M)||void 0===M.first().schedule_info},{permission:"update",icon:T.P.edit,click:()=>this.actionPrimary(!0),name:this.actionLabels.PROMOTE,visible:()=>null!=this.selection.first()&&!this.selection.first().primary},{permission:"update",icon:T.P.edit,click:()=>this.actionPrimary(!1),name:this.actionLabels.DEMOTE,visible:()=>null!=this.selection.first()&&this.selection.first().primary}]}createRbdFromTaskImageSpec(t){const o=L.N.fromString(t);return this.createRbdFromTask(o.poolName,o.namespace,o.imageName)}createRbdFromTask(t,o,i){const _=new is;return _.id="-1",_.unique_id="-1",_.name=i,_.namespace=o,_.pool_name=t,_.image_format=Pe.V2,_}ngOnInit(){this.columns=[{name:"Name",prop:"name",flexGrow:2,cellTemplate:this.removingStatTpl},{name:"Pool",prop:"pool_name",flexGrow:2},{name:"Namespace",prop:"namespace",flexGrow:2},{name:"Size",prop:"size",flexGrow:1,cellClass:"text-right",sortable:!1,pipe:this.dimlessBinaryPipe},{name:"Objects",prop:"num_objs",flexGrow:1,cellClass:"text-right",sortable:!1,pipe:this.dimlessPipe},{name:"Object size",prop:"obj_size",flexGrow:1,cellClass:"text-right",sortable:!1,pipe:this.dimlessBinaryPipe},{name:"Provisioned",prop:"disk_usage",cellClass:"text-center",flexGrow:1,pipe:this.dimlessBinaryPipe,sortable:!1,cellTemplate:this.provisionedNotAvailableTooltipTpl},{name:"Total provisioned",prop:"total_disk_usage",cellClass:"text-center",flexGrow:1,pipe:this.dimlessBinaryPipe,sortable:!1,cellTemplate:this.totalProvisionedNotAvailableTooltipTpl},{name:"Parent",prop:"parent",flexGrow:2,sortable:!1,cellTemplate:this.parentTpl},{name:"Mirroring",prop:"mirror_mode",flexGrow:3,sortable:!1,cellTemplate:this.mirroringTpl}],this.taskListService.init(i=>this.getRbdImages(i),i=>this.prepareResponse(i),i=>this.images=i,()=>this.onFetchError(),i=>["rbd/clone","rbd/copy","rbd/create","rbd/delete","rbd/edit","rbd/flatten","rbd/trash/move"].includes(i.name),(i,_)=>{let r;switch(_.name){case"rbd/copy":r=new L.N(_.metadata.dest_pool_name,_.metadata.dest_namespace,_.metadata.dest_image_name).toString();break;case"rbd/clone":r=new L.N(_.metadata.child_pool_name,_.metadata.child_namespace,_.metadata.child_image_name).toString();break;case"rbd/create":r=new L.N(_.metadata.pool_name,_.metadata.namespace,_.metadata.image_name).toString();break;default:r=_.metadata.image_spec}return r===new L.N(i.pool_name,i.namespace,i.name).toString()},this.builders)}onFetchError(){this.table.reset(),this.tableStatus=new bt.c("danger")}getRbdImages(t){var o;return null!==t&&(this.tableContext=t),null==this.tableContext&&(this.tableContext=new A.E(()=>{})),this.rbdService.list(null===(o=this.tableContext)||void 0===o?void 0:o.toParams())}prepareResponse(t){let o=[];return t.forEach(i=>{o=o.concat(i.value)}),o.forEach(i=>{if(void 0!==i.schedule_info){let _=[];const r="scheduled";let c=+new Date(i.schedule_info.schedule_time);const d=(new Date).getTimezoneOffset();c+=6e4*Math.abs(d),_.push(i.mirror_mode,r,c),i.mirror_mode=_,_=[]}}),this.count=o.length>0?n_.getCount(t[0]):0,o}updateSelection(t){this.selection=t}deleteRbdModal(){const t=this.selection.first().pool_name,o=this.selection.first().namespace,i=this.selection.first().name,_=new L.N(t,o,i);this.modalRef=this.modalService.show(pe.M,{itemDescription:"RBD",itemNames:[_],bodyTemplate:this.deleteTpl,bodyContext:{hasSnapshots:this.hasSnapshots(),snapshots:this.listProtectedSnapshots()},submitActionObservable:()=>this.taskWrapper.wrapTaskAroundCall({task:new R.R("rbd/delete",{image_spec:_.toString()}),call:this.rbdService.delete(_)})})}resyncRbdModal(){const t=this.selection.first().pool_name,o=this.selection.first().namespace,i=this.selection.first().name,_=new L.N(t,o,i);this.modalRef=this.modalService.show(pe.M,{itemDescription:"RBD",itemNames:[_],actionDescription:"resync",submitActionObservable:()=>this.taskWrapper.wrapTaskAroundCall({task:new R.R("rbd/edit",{image_spec:_.toString()}),call:this.rbdService.update(_,{resync:!0})})})}trashRbdModal(){const t={poolName:this.selection.first().pool_name,namespace:this.selection.first().namespace,imageName:this.selection.first().name,hasSnapshots:this.hasSnapshots()};this.modalRef=this.modalService.show(c_,t)}flattenRbd(t){this.taskWrapper.wrapTaskAroundCall({task:new R.R("rbd/flatten",{image_spec:t.toString()}),call:this.rbdService.flatten(t)}).subscribe({complete:()=>{this.modalRef.close()}})}flattenRbdModal(){const t=this.selection.first().pool_name,o=this.selection.first().namespace,i=this.selection.first().name,_=this.selection.first().parent,r=new L.N(_.pool_name,_.pool_namespace,_.image_name),c=new L.N(t,o,i),d={titleText:"RBD flatten",buttonText:"Flatten",bodyTpl:this.flattenTpl,bodyData:{parent:`${r}@${_.snap_name}`,child:c.toString()},onSubmit:()=>{this.flattenRbd(c)}};this.modalRef=this.modalService.show(Nt.Y,d)}editRequest(){const t=new _t;return t.remove_scheduling=!t.remove_scheduling,t}removeSchedulingModal(){const t=this.selection.first().name,o=new L.N(this.selection.first().pool_name,this.selection.first().namespace,this.selection.first().name);this.modalRef=this.modalService.show(pe.M,{actionDescription:"remove scheduling on",itemDescription:"image",itemNames:[`${t}`],submitActionObservable:()=>new Rt.y(i=>{this.taskWrapper.wrapTaskAroundCall({task:new R.R("rbd/edit",{image_spec:o.toString()}),call:this.rbdService.update(o,this.editRequest())}).subscribe({error:_=>i.error(_),complete:()=>{this.modalRef.close()}})})})}actionPrimary(t){const o=new _t;o.primary=t;const i=new L.N(this.selection.first().pool_name,this.selection.first().namespace,this.selection.first().name);this.taskWrapper.wrapTaskAroundCall({task:new R.R("rbd/edit",{image_spec:i.toString()}),call:this.rbdService.update(i,o)}).subscribe()}hasSnapshots(){return(this.selection.first().snapshots||[]).length>0}hasClonedSnapshots(t){return(t.snapshots||[]).some(i=>i.children&&i.children.length>0)}listProtectedSnapshots(){return this.selection.first().snapshots.reduce((i,_)=>(_.is_protected&&i.push(_.name),i),[])}getDeleteDisableDesc(t){const o=t.first();return o&&this.hasClonedSnapshots(o)?"This RBD has cloned snapshots. Please delete related RBDs before deleting this RBD.":this.getInvalidNameDisable(t)||this.hasClonedSnapshots(t.first())}getResyncDisableDesc(t){const o=t.first();return o&&this.imageIsPrimary(o)?"Primary RBD images cannot be resynced":this.getInvalidNameDisable(t)}imageIsPrimary(t){return t.primary}getInvalidNameDisable(t){var o;const i=t.first();return(null===(o=null==i?void 0:i.name)||void 0===o?void 0:o.match(/[@/]/))?"This RBD image has an invalid name and can't be managed by ceph.":!t.first()||!t.hasSingleSelection}getRemovingStatusDesc(t){const o=t.first();return"REMOVING"===(null==o?void 0:o.source)&&"Action not possible for an RBD in status 'Removing'"}}return n.\u0275fac=function(t){return new(t||n)(e.Y36(oe.j),e.Y36(q),e.Y36(Le.$),e.Y36(ot.n),e.Y36(de.Z),e.Y36(u.P),e.Y36(ce.j),e.Y36(at.F),e.Y36(v.p4))},n.\u0275cmp=e.Xpm({type:n,selectors:[["cd-rbd-list"]],viewQuery:function(t,o){if(1&t&&(e.Gf(W.a,7),e.Gf(X_,5),e.Gf(Q_,7),e.Gf(z_,5),e.Gf(J_,7),e.Gf(Y_,7),e.Gf(V_,7),e.Gf(U_,7),e.Gf(j_,7),e.Gf(W_,7)),2&t){let i;e.iGM(i=e.CRH())&&(o.table=i.first),e.iGM(i=e.CRH())&&(o.usageTpl=i.first),e.iGM(i=e.CRH())&&(o.parentTpl=i.first),e.iGM(i=e.CRH())&&(o.nameTpl=i.first),e.iGM(i=e.CRH())&&(o.mirroringTpl=i.first),e.iGM(i=e.CRH())&&(o.flattenTpl=i.first),e.iGM(i=e.CRH())&&(o.deleteTpl=i.first),e.iGM(i=e.CRH())&&(o.removingStatTpl=i.first),e.iGM(i=e.CRH())&&(o.provisionedNotAvailableTooltipTpl=i.first),e.iGM(i=e.CRH())&&(o.totalProvisionedNotAvailableTooltipTpl=i.first)}},features:[e._Bn([ce.j,{provide:at.F,useValue:new at.F("block/rbd")}]),e.qOj],decls:21,vars:13,consts:function(){let s,t,o,i,_,r,c,d,g;return s="N/A",t="" + "\ufffd0\ufffd" + "",o="N/A",i="" + "\ufffd0\ufffd" + "",_="primary",r="secondary",c="Deleting this image will also delete all its snapshots.",d="The following snapshots are currently protected and will be removed:",g="RBD in status 'Removing'",[["columnMode","flex","identifier","unique_id","forceIdentifier","true","selectionType","single",3,"data","columns","searchableObjects","serverSide","count","hasDetails","status","maxLimit","autoReload","fetchData","setExpandedRow","updateSelection"],["table",""],[1,"table-actions",3,"permission","selection","tableActions"],["cdTableDetail","",3,"selection"],["scheduleStatus",""],["provisionedNotAvailableTooltipTpl",""],["totalProvisionedNotAvailableTooltipTpl",""],["parentTpl",""],["mirroringTpl",""],["flattenTpl",""],["deleteTpl",""],["removingStatTpl",""],[3,"innerHtml"],["placement","top",3,"ngbTooltip",4,"ngIf","ngIfElse"],["provisioned",""],["placement","top",3,"ngbTooltip"],s,t,["totalProvisioned",""],o,i,[4,"ngIf"],["class","badge badge-info",4,"ngIf","ngIfElse"],["class","badge badge-info",3,"ngbTooltip",4,"ngIf"],["class","badge badge-info",4,"ngIf"],["probb",""],[1,"badge","badge-info"],[1,"badge","badge-info",3,"ngbTooltip"],_,r,["class","alert alert-warning","role","alert",4,"ngIf"],["role","alert",1,"alert","alert-warning"],c,d,[4,"ngFor","ngForOf"],[3,"ngClass",4,"ngIf"],[3,"ngClass"],["title",g,3,"class",4,"ngIf"],["title",g]]},template:function(t,o){1&t&&(e._UZ(0,"cd-rbd-tabs"),e.TgZ(1,"cd-table",0,1),e.NdJ("fetchData",function(_){return o.taskListService.fetch(_)})("setExpandedRow",function(_){return o.setExpandedRow(_)})("updateSelection",function(_){return o.updateSelection(_)}),e._UZ(3,"cd-table-actions",2),e._UZ(4,"cd-rbd-details",3),e.qZA(),e.YNc(5,ea,1,1,"ng-template",null,4,e.W1O),e.YNc(7,na,3,2,"ng-template",null,5,e.W1O),e.YNc(9,_a,3,2,"ng-template",null,6,e.W1O),e.YNc(11,ca,2,2,"ng-template",null,7,e.W1O),e.YNc(13,Ta,7,5,"ng-template",null,8,e.W1O),e.YNc(15,fa,13,3,"ng-template",null,9,e.W1O),e.YNc(17,Ra,1,1,"ng-template",null,10,e.W1O),e.YNc(19,Pa,5,5,"ng-template",null,11,e.W1O)),2&t&&(e.xp6(1),e.Q6J("data",o.images)("columns",o.columns)("searchableObjects",!0)("serverSide",!0)("count",o.count)("hasDetails",!0)("status",o.tableStatus)("maxLimit",25)("autoReload",-1),e.xp6(2),e.Q6J("permission",o.permission)("selection",o.selection)("tableActions",o.tableActions),e.xp6(1),e.Q6J("selection",o.expandedRow))},directives:[We,W.a,Ee.K,K_,l.O5,N._L,l.sg,l.mk],pipes:[Le.$,Ze.N],styles:[".warn[_ngcontent-%COMP%]{color:#ffc200}"]}),n})();function Na(n,s){1&n&&e._UZ(0,"input",19)}function Fa(n,s){1&n&&(e.TgZ(0,"option",23),e.SDv(1,24),e.qZA()),2&n&&e.Q6J("ngValue",null)}function Da(n,s){1&n&&(e.TgZ(0,"option",23),e.SDv(1,25),e.qZA()),2&n&&e.Q6J("ngValue",null)}function va(n,s){1&n&&(e.TgZ(0,"option",23),e.SDv(1,26),e.qZA()),2&n&&e.Q6J("ngValue",null)}function La(n,s){if(1&n&&(e.TgZ(0,"option",27),e._uU(1),e.qZA()),2&n){const t=s.$implicit;e.Q6J("value",t.pool_name),e.xp6(1),e.Oqu(t.pool_name)}}function $a(n,s){if(1&n&&(e.TgZ(0,"select",20),e.YNc(1,Fa,2,1,"option",21),e.YNc(2,Da,2,1,"option",21),e.YNc(3,va,2,1,"option",21),e.YNc(4,La,2,2,"option",22),e.qZA()),2&n){const t=e.oxw();e.xp6(1),e.Q6J("ngIf",null===t.pools),e.xp6(1),e.Q6J("ngIf",null!==t.pools&&0===t.pools.length),e.xp6(1),e.Q6J("ngIf",null!==t.pools&&t.pools.length>0),e.xp6(1),e.Q6J("ngForOf",t.pools)}}function Za(n,s){1&n&&(e.TgZ(0,"span",28),e.SDv(1,29),e.qZA())}function Ba(n,s){1&n&&(e.TgZ(0,"span",28),e.SDv(1,30),e.qZA())}function Ga(n,s){1&n&&(e.TgZ(0,"span",28),e.SDv(1,31),e.qZA())}let ya=(()=>{class n{constructor(t,o,i,_,r,c){this.activeModal=t,this.actionLabels=o,this.authStorageService=i,this.notificationService=_,this.poolService=r,this.rbdService=c,this.pools=null,this.editing=!1,this.poolPermission=this.authStorageService.getPermissions().pool,this.createForm()}createForm(){this.namespaceForm=new x.d({pool:new a.NI(""),namespace:new a.NI("")},this.validator(),this.asyncValidator())}validator(){return t=>{const o=t.get("pool"),i=t.get("namespace");let _=null;o.value||(_={required:!0}),o.setErrors(_);let r=null;return i.value||(r={required:!0}),i.setErrors(r),null}}asyncValidator(){return t=>new Promise(o=>{const i=t.get("pool"),_=t.get("namespace");this.rbdService.listNamespaces(i.value).subscribe(r=>{if(r.some(c=>c.namespace===_.value)){const c={namespaceExists:!0};_.setErrors(c),o(c)}else o(null)})})}ngOnInit(){this.onSubmit=new vt.xQ,this.poolPermission.read&&this.poolService.list(["pool_name","type","application_metadata"]).then(t=>{const o=[];for(const i of t)this.rbdService.isRBDPool(i)&&"replicated"===i.type&&o.push(i);if(this.pools=o,1===this.pools.length){const i=this.pools[0].pool_name;this.namespaceForm.get("pool").setValue(i)}})}submit(){const t=this.namespaceForm.getValue("pool"),o=this.namespaceForm.getValue("namespace"),i=new R.R;i.name="rbd/namespace/create",i.metadata={pool:t,namespace:o},this.rbdService.createNamespace(t,o).toPromise().then(()=>{this.notificationService.show(tt.k.success,"Created namespace '" + t + "/" + o + "'"),this.activeModal.close(),this.onSubmit.next()}).catch(()=>{this.namespaceForm.setErrors({cdSubmitButton:!0})})}}return n.\u0275fac=function(t){return new(t||n)(e.Y36(N.Kz),e.Y36(v.p4),e.Y36(oe.j),e.Y36(ve.g),e.Y36(Ve.q),e.Y36(q))},n.\u0275cmp=e.Xpm({type:n,selectors:[["cd-rbd-namespace-form-modal"]],decls:23,vars:9,consts:function(){let s,t,o,i,_,r,c,d,g;return s="Create Namespace",t="Pool",o="Name",i="Loading...",_="-- No rbd pools available --",r="-- Select a pool --",c="This field is required.",d="This field is required.",g="Namespace already exists.",[[3,"modalRef"],[1,"modal-title"],s,[1,"modal-content"],["name","namespaceForm","novalidate","",3,"formGroup"],["formDir","ngForm"],[1,"modal-body"],[1,"form-group","row"],["for","pool",1,"cd-col-form-label","required"],t,[1,"cd-col-form-input"],["class","form-control","type","text","placeholder","Pool name...","id","pool","name","pool","formControlName","pool",4,"ngIf"],["id","pool","name","pool","class","form-control","formControlName","pool",4,"ngIf"],["class","invalid-feedback",4,"ngIf"],["for","namespace",1,"cd-col-form-label","required"],o,["type","text","placeholder","Namespace name...","id","namespace","name","namespace","formControlName","namespace","autofocus","",1,"form-control"],[1,"modal-footer"],[3,"form","submitText","submitActionEvent"],["type","text","placeholder","Pool name...","id","pool","name","pool","formControlName","pool",1,"form-control"],["id","pool","name","pool","formControlName","pool",1,"form-control"],[3,"ngValue",4,"ngIf"],[3,"value",4,"ngFor","ngForOf"],[3,"ngValue"],i,_,r,[3,"value"],[1,"invalid-feedback"],c,d,g]},template:function(t,o){if(1&t&&(e.TgZ(0,"cd-modal",0),e.ynx(1,1),e.SDv(2,2),e.BQk(),e.ynx(3,3),e.TgZ(4,"form",4,5),e.TgZ(6,"div",6),e.TgZ(7,"div",7),e.TgZ(8,"label",8),e.SDv(9,9),e.qZA(),e.TgZ(10,"div",10),e.YNc(11,Na,1,0,"input",11),e.YNc(12,$a,5,4,"select",12),e.YNc(13,Za,2,0,"span",13),e.qZA(),e.qZA(),e.TgZ(14,"div",7),e.TgZ(15,"label",14),e.SDv(16,15),e.qZA(),e.TgZ(17,"div",10),e._UZ(18,"input",16),e.YNc(19,Ba,2,0,"span",13),e.YNc(20,Ga,2,0,"span",13),e.qZA(),e.qZA(),e.qZA(),e.TgZ(21,"div",17),e.TgZ(22,"cd-form-button-panel",18),e.NdJ("submitActionEvent",function(){return o.submit()}),e.qZA(),e.qZA(),e.qZA(),e.BQk(),e.qZA()),2&t){const i=e.MAs(5);e.Q6J("modalRef",o.activeModal),e.xp6(4),e.Q6J("formGroup",o.namespaceForm),e.xp6(7),e.Q6J("ngIf",!o.poolPermission.read),e.xp6(1),e.Q6J("ngIf",o.poolPermission.read),e.xp6(1),e.Q6J("ngIf",o.namespaceForm.showError("pool",i,"required")),e.xp6(6),e.Q6J("ngIf",o.namespaceForm.showError("namespace",i,"required")),e.xp6(1),e.Q6J("ngIf",o.namespaceForm.showError("namespace",i,"namespaceExists")),e.xp6(2),e.Q6J("form",o.namespaceForm)("submitText",o.actionLabels.CREATE)}},directives:[C.z,a._Y,a.JL,a.sg,h.V,O.P,l.O5,$.o,a.Fj,k.b,a.JJ,a.u,Re.U,j.p,a.EJ,l.sg,a.YN,a.Kr],styles:[""]}),n})(),xa=(()=>{class n{constructor(t,o,i,_,r,c){this.authStorageService=t,this.rbdService=o,this.poolService=i,this.modalService=_,this.notificationService=r,this.actionLabels=c,this.selection=new Se.r,this.permission=this.authStorageService.getPermissions().rbdImage,this.tableActions=[{permission:"create",icon:T.P.add,click:()=>this.createModal(),name:this.actionLabels.CREATE},{permission:"delete",icon:T.P.destroy,click:()=>this.deleteModal(),name:this.actionLabels.DELETE,disable:()=>this.getDeleteDisableDesc()}]}ngOnInit(){this.columns=[{name:"Namespace",prop:"namespace",flexGrow:1},{name:"Pool",prop:"pool",flexGrow:1},{name:"Total images",prop:"num_images",flexGrow:1}],this.refresh()}refresh(){this.poolService.list(["pool_name","type","application_metadata"]).then(t=>{t=t.filter(i=>this.rbdService.isRBDPool(i)&&"replicated"===i.type);const o=[];t.forEach(i=>{o.push(this.rbdService.listNamespaces(i.pool_name))}),o.length>0?(0,le.D)(o).subscribe(i=>{const _=[];for(let r=0;r<i.length;r++){const d=t[r].pool_name;i[r].forEach(g=>{_.push({id:`${d}/${g.namespace}`,pool:d,namespace:g.namespace,num_images:g.num_images})})}this.namespaces=_}):this.namespaces=[]})}updateSelection(t){this.selection=t}createModal(){this.modalRef=this.modalService.show(ya),this.modalRef.componentInstance.onSubmit.subscribe(()=>{this.refresh()})}deleteModal(){const t=this.selection.first().pool,o=this.selection.first().namespace;this.modalRef=this.modalService.show(pe.M,{itemDescription:"Namespace",itemNames:[`${t}/${o}`],submitAction:()=>this.rbdService.deleteNamespace(t,o).subscribe(()=>{this.notificationService.show(tt.k.success,"Deleted namespace '" + t + "/" + o + "'"),this.modalRef.close(),this.refresh()},()=>{this.modalRef.componentInstance.stopLoadingSpinner()})})}getDeleteDisableDesc(){var t;const o=this.selection.first();return(null==o?void 0:o.num_images)>0?"Namespace contains images":!(null===(t=this.selection)||void 0===t?void 0:t.first())}}return n.\u0275fac=function(t){return new(t||n)(e.Y36(oe.j),e.Y36(q),e.Y36(Ve.q),e.Y36(de.Z),e.Y36(ve.g),e.Y36(v.p4))},n.\u0275cmp=e.Xpm({type:n,selectors:[["cd-rbd-namespace-list"]],features:[e._Bn([ce.j])],decls:4,vars:5,consts:[["columnMode","flex","identifier","id","forceIdentifier","true","selectionType","single",3,"data","columns","fetchData","updateSelection"],[1,"table-actions","btn-toolbar"],[1,"btn-group",3,"permission","selection","tableActions"]],template:function(t,o){1&t&&(e._UZ(0,"cd-rbd-tabs"),e.TgZ(1,"cd-table",0),e.NdJ("fetchData",function(){return o.refresh()})("updateSelection",function(_){return o.updateSelection(_)}),e.TgZ(2,"div",1),e._UZ(3,"cd-table-actions",2),e.qZA(),e.qZA()),2&t&&(e.xp6(1),e.Q6J("data",o.namespaces)("columns",o.columns),e.xp6(2),e.Q6J("permission",o.permission)("selection",o.selection)("tableActions",o.tableActions))},directives:[We,W.a,Ee.K],styles:[""]}),n})(),wa=(()=>{class n{}return n.\u0275fac=function(t){return new(t||n)},n.\u0275cmp=e.Xpm({type:n,selectors:[["cd-rbd-performance"]],decls:2,vars:2,consts:[["uid","41FrpeUiz","grafanaStyle","two",3,"grafanaPath","type"]],template:function(t,o){1&t&&(e._UZ(0,"cd-rbd-tabs"),e._UZ(1,"cd-grafana",0)),2&t&&(e.xp6(1),e.Q6J("grafanaPath","rbd-overview?")("type","metrics"))},directives:[We,Lt.F],styles:[""]}),n})();var qa=p(91801);function Ha(n,s){1&n&&e._UZ(0,"input",15)}function ka(n,s){if(1&n&&(e.TgZ(0,"option",20),e._uU(1),e.qZA()),2&n){const t=s.$implicit;e.Q6J("value",t),e.xp6(1),e.Oqu(t)}}function Ka(n,s){if(1&n&&(e.TgZ(0,"select",16),e.TgZ(1,"option",17),e.SDv(2,18),e.qZA(),e.YNc(3,ka,2,2,"option",19),e.qZA()),2&n){const t=e.oxw();e.xp6(3),e.Q6J("ngForOf",t.pools)}}let Xa=(()=>{class n{constructor(t,o,i,_,r,c,d){this.authStorageService=t,this.rbdService=o,this.activeModal=i,this.actionLabels=_,this.fb=r,this.poolService=c,this.taskWrapper=d,this.poolPermission=this.authStorageService.getPermissions().pool}createForm(){this.purgeForm=this.fb.group({poolName:""})}ngOnInit(){this.poolPermission.read&&this.poolService.list(["pool_name","application_metadata"]).then(t=>{this.pools=t.filter(o=>o.application_metadata.includes("rbd")).map(o=>o.pool_name)}),this.createForm()}purge(){const t=this.purgeForm.getValue("poolName")||"";this.taskWrapper.wrapTaskAroundCall({task:new R.R("rbd/trash/purge",{pool_name:t}),call:this.rbdService.purgeTrash(t)}).subscribe({error:()=>{this.purgeForm.setErrors({cdSubmitButton:!0})},complete:()=>{this.activeModal.close()}})}}return n.\u0275fac=function(t){return new(t||n)(e.Y36(oe.j),e.Y36(q),e.Y36(N.Kz),e.Y36(v.p4),e.Y36(rt.O),e.Y36(Ve.q),e.Y36(u.P))},n.\u0275cmp=e.Xpm({type:n,selectors:[["cd-rbd-trash-purge-modal"]],decls:18,vars:6,consts:function(){let s,t,o,i,_;return s="Purge Trash",t="To purge, select\xA0 " + "[\ufffd#9\ufffd|\ufffd#10\ufffd]" + "All" + "[\ufffd/#9\ufffd|\ufffd/#10\ufffd]" + "\xA0 or one pool and click\xA0 " + "[\ufffd#9\ufffd|\ufffd#10\ufffd]" + "Purge" + "[\ufffd/#9\ufffd|\ufffd/#10\ufffd]" + ".\xA0",t=e.Zx4(t),o="Pool:",i="Pool name...",_="All",[[3,"modalRef"],[1,"modal-title"],s,[1,"modal-content"],["name","purgeForm","novalidate","",1,"form",3,"formGroup"],["formDir","ngForm"],[1,"modal-body"],t,[1,"form-group"],[1,"col-form-label","mx-auto"],o,["class","form-control","type","text","placeholder",i,"formControlName","poolName",4,"ngIf"],["id","poolName","name","poolName","class","form-control","formControlName","poolName",4,"ngIf"],[1,"modal-footer"],[3,"form","submitText","submitActionEvent"],["type","text","placeholder",i,"formControlName","poolName",1,"form-control"],["id","poolName","name","poolName","formControlName","poolName",1,"form-control"],["value",""],_,[3,"value",4,"ngFor","ngForOf"],[3,"value"]]},template:function(t,o){1&t&&(e.TgZ(0,"cd-modal",0),e.ynx(1,1),e.SDv(2,2),e.BQk(),e.ynx(3,3),e.TgZ(4,"form",4,5),e.TgZ(6,"div",6),e.TgZ(7,"p"),e.tHW(8,7),e._UZ(9,"kbd"),e._UZ(10,"kbd"),e.N_p(),e.qZA(),e.TgZ(11,"div",8),e.TgZ(12,"label",9),e.SDv(13,10),e.qZA(),e.YNc(14,Ha,1,0,"input",11),e.YNc(15,Ka,4,1,"select",12),e.qZA(),e.qZA(),e.TgZ(16,"div",13),e.TgZ(17,"cd-form-button-panel",14),e.NdJ("submitActionEvent",function(){return o.purge()}),e.qZA(),e.qZA(),e.qZA(),e.BQk(),e.qZA()),2&t&&(e.Q6J("modalRef",o.activeModal),e.xp6(4),e.Q6J("formGroup",o.purgeForm),e.xp6(10),e.Q6J("ngIf",!o.poolPermission.read),e.xp6(1),e.Q6J("ngIf",o.poolPermission.read),e.xp6(2),e.Q6J("form",o.purgeForm)("submitText",o.actionLabels.PURGE))},directives:[C.z,a._Y,a.JL,a.sg,h.V,O.P,l.O5,j.p,$.o,a.Fj,k.b,a.JJ,a.u,a.EJ,a.YN,a.Kr,l.sg],styles:[""]}),n})();function Qa(n,s){1&n&&(e.TgZ(0,"span",15),e.SDv(1,16),e.qZA())}let za=(()=>{class n{constructor(t,o,i,_,r){this.rbdService=t,this.activeModal=o,this.actionLabels=i,this.fb=_,this.taskWrapper=r}ngOnInit(){this.imageSpec=new L.N(this.poolName,this.namespace,this.imageName).toString(),this.restoreForm=this.fb.group({name:this.imageName})}restore(){const t=this.restoreForm.getValue("name"),o=new L.N(this.poolName,this.namespace,this.imageId);this.taskWrapper.wrapTaskAroundCall({task:new R.R("rbd/trash/restore",{image_id_spec:o.toString(),new_image_name:t}),call:this.rbdService.restoreTrash(o,t)}).subscribe({error:()=>{this.restoreForm.setErrors({cdSubmitButton:!0})},complete:()=>{this.activeModal.close()}})}}return n.\u0275fac=function(t){return new(t||n)(e.Y36(q),e.Y36(N.Kz),e.Y36(v.p4),e.Y36(rt.O),e.Y36(u.P))},n.\u0275cmp=e.Xpm({type:n,selectors:[["cd-rbd-trash-restore-modal"]],decls:18,vars:7,consts:function(){let s,t,o,i;return s="Restore Image",t="To restore\xA0 " + "[\ufffd#9\ufffd|\ufffd#10\ufffd]" + "" + "\ufffd0\ufffd" + "@" + "\ufffd1\ufffd" + "" + "[\ufffd/#9\ufffd|\ufffd/#10\ufffd]" + ",\xA0 type the image's new name and click\xA0 " + "[\ufffd#9\ufffd|\ufffd#10\ufffd]" + "Restore" + "[\ufffd/#9\ufffd|\ufffd/#10\ufffd]" + ".",t=e.Zx4(t),o="New Name",i="This field is required.",[[3,"modalRef"],[1,"modal-title"],s,[1,"modal-content"],["name","restoreForm","novalidate","",1,"form",3,"formGroup"],["formDir","ngForm"],[1,"modal-body"],t,[1,"form-group"],["for","name",1,"col-form-label"],o,["type","text","name","name","id","name","autocomplete","off","formControlName","name","autofocus","",1,"form-control"],["class","invalid-feedback",4,"ngIf"],[1,"modal-footer"],[3,"form","submitText","submitActionEvent"],[1,"invalid-feedback"],i]},template:function(t,o){if(1&t&&(e.TgZ(0,"cd-modal",0),e.ynx(1,1),e.SDv(2,2),e.BQk(),e.ynx(3,3),e.TgZ(4,"form",4,5),e.TgZ(6,"div",6),e.TgZ(7,"p"),e.tHW(8,7),e._UZ(9,"kbd"),e._UZ(10,"kbd"),e.N_p(),e.qZA(),e.TgZ(11,"div",8),e.TgZ(12,"label",9),e.SDv(13,10),e.qZA(),e._UZ(14,"input",11),e.YNc(15,Qa,2,0,"span",12),e.qZA(),e.qZA(),e.TgZ(16,"div",13),e.TgZ(17,"cd-form-button-panel",14),e.NdJ("submitActionEvent",function(){return o.restore()}),e.qZA(),e.qZA(),e.qZA(),e.BQk(),e.qZA()),2&t){const i=e.MAs(5);e.Q6J("modalRef",o.activeModal),e.xp6(4),e.Q6J("formGroup",o.restoreForm),e.xp6(6),e.pQV(o.imageSpec)(o.imageId),e.QtT(8),e.xp6(5),e.Q6J("ngIf",o.restoreForm.showError("name",i,"required")),e.xp6(2),e.Q6J("form",o.restoreForm)("submitText",o.actionLabels.RESTORE)}},directives:[C.z,a._Y,a.JL,a.sg,h.V,O.P,$.o,a.Fj,k.b,a.JJ,a.u,Re.U,l.O5,j.p],styles:[""]}),n})();const Ja=["expiresTpl"],Ya=["deleteTpl"],Va=function(n){return[n]};function Ua(n,s){if(1&n){const t=e.EpF();e.TgZ(0,"button",6),e.NdJ("click",function(){return e.CHM(t),e.oxw().purgeModal()}),e._UZ(1,"i",7),e.ynx(2),e.SDv(3,8),e.BQk(),e.qZA()}if(2&n){const t=e.oxw();e.Q6J("disabled",t.disablePurgeBtn),e.xp6(1),e.Q6J("ngClass",e.VKq(2,Va,t.icons.destroy))}}function ja(n,s){1&n&&(e.ynx(0),e.SDv(1,10),e.BQk())}function Wa(n,s){1&n&&(e.ynx(0),e.SDv(1,11),e.BQk())}function er(n,s){if(1&n&&(e.YNc(0,ja,2,0,"ng-container",9),e.YNc(1,Wa,2,0,"ng-container",9),e._uU(2),e.ALo(3,"cdDate")),2&n){const t=s.row,o=s.value;e.Q6J("ngIf",t.cdIsExpired),e.xp6(1),e.Q6J("ngIf",!t.cdIsExpired),e.xp6(1),e.hij(" ",e.lcZ(3,3,o),"\n")}}function tr(n,s){if(1&n&&(e.TgZ(0,"p",13),e.TgZ(1,"strong"),e.ynx(2),e.SDv(3,14),e.ALo(4,"cdDate"),e.BQk(),e.qZA(),e.qZA()),2&n){const t=e.oxw().expiresAt;e.xp6(4),e.pQV(e.lcZ(4,1,t)),e.QtT(3)}}function or(n,s){1&n&&e.YNc(0,tr,5,3,"p",12),2&n&&e.Q6J("ngIf",!s.isExpired)}let nr=(()=>{class n{constructor(t,o,i,_,r,c,d){this.authStorageService=t,this.rbdService=o,this.modalService=i,this.cdDatePipe=_,this.taskListService=r,this.taskWrapper=c,this.actionLabels=d,this.icons=T.P,this.executingTasks=[],this.selection=new Se.r,this.tableStatus=new se.E,this.disablePurgeBtn=!0,this.permission=this.authStorageService.getPermissions().rbdImage,this.tableActions=[{permission:"update",icon:T.P.undo,click:()=>this.restoreModal(),name:this.actionLabels.RESTORE},{permission:"delete",icon:T.P.destroy,click:()=>this.deleteModal(),name:this.actionLabels.DELETE}]}ngOnInit(){this.columns=[{name:"ID",prop:"id",flexGrow:1,cellTransformation:De.e.executing},{name:"Name",prop:"name",flexGrow:1},{name:"Pool",prop:"pool_name",flexGrow:1},{name:"Namespace",prop:"namespace",flexGrow:1},{name:"Status",prop:"deferment_end_time",flexGrow:1,cellTemplate:this.expiresTpl},{name:"Deleted At",prop:"deletion_time",flexGrow:1,pipe:this.cdDatePipe}],this.taskListService.init(()=>this.rbdService.listTrash(),i=>this.prepareResponse(i),i=>this.images=i,()=>this.onFetchError(),i=>["rbd/trash/remove","rbd/trash/restore"].includes(i.name),(i,_)=>new L.N(i.pool_name,i.namespace,i.id).toString()===_.metadata.image_id_spec,void 0)}prepareResponse(t){let o=[];const i={};let _;if(t.forEach(r=>{S().isUndefined(i[r.status])&&(i[r.status]=[]),i[r.status].push(r.pool_name),o=o.concat(r.value),this.disablePurgeBtn=!o.length}),i[3]?_=3:i[1]?_=1:i[2]&&(_=2),_){const r=(i[_].length>1?"pools ":"pool ")+i[_].join();this.tableStatus=new se.E(_,r)}else this.tableStatus=new se.E;return o.forEach(r=>{r.cdIsExpired=Me()().isAfter(r.deferment_end_time)}),o}onFetchError(){this.table.reset(),this.tableStatus=new se.E(qa.T.ValueException)}updateSelection(t){this.selection=t}restoreModal(){const t={poolName:this.selection.first().pool_name,namespace:this.selection.first().namespace,imageName:this.selection.first().name,imageId:this.selection.first().id};this.modalRef=this.modalService.show(za,t)}deleteModal(){const t=this.selection.first().pool_name,o=this.selection.first().namespace,i=this.selection.first().id,_=this.selection.first().deferment_end_time,r=Me()().isAfter(_),c=new L.N(t,o,i);this.modalRef=this.modalService.show(pe.M,{itemDescription:"RBD",itemNames:[c],bodyTemplate:this.deleteTpl,bodyContext:{expiresAt:_,isExpired:r},submitActionObservable:()=>this.taskWrapper.wrapTaskAroundCall({task:new R.R("rbd/trash/remove",{image_id_spec:c.toString()}),call:this.rbdService.removeTrash(c,!0)})})}purgeModal(){this.modalService.show(Xa)}}return n.\u0275fac=function(t){return new(t||n)(e.Y36(oe.j),e.Y36(q),e.Y36(de.Z),e.Y36(Ze.N),e.Y36(ce.j),e.Y36(u.P),e.Y36(v.p4))},n.\u0275cmp=e.Xpm({type:n,selectors:[["cd-rbd-trash-list"]],viewQuery:function(t,o){if(1&t&&(e.Gf(W.a,7),e.Gf(Ja,7),e.Gf(Ya,7)),2&t){let i;e.iGM(i=e.CRH())&&(o.table=i.first),e.iGM(i=e.CRH())&&(o.expiresTpl=i.first),e.iGM(i=e.CRH())&&(o.deleteTpl=i.first)}},features:[e._Bn([ce.j])],decls:9,vars:8,consts:function(){let s,t,o,i;return s="Purge Trash",t="Expired at",o="Protected until",i="This image is protected until " + "\ufffd0\ufffd" + ".",[["columnMode","flex","identifier","id","forceIdentifier","true","selectionType","single",3,"data","columns","status","autoReload","fetchData","updateSelection"],[1,"table-actions","btn-toolbar"],[1,"btn-group",3,"permission","selection","tableActions"],["class","btn btn-light","type","button",3,"disabled","click",4,"ngIf"],["expiresTpl",""],["deleteTpl",""],["type","button",1,"btn","btn-light",3,"disabled","click"],["aria-hidden","true",3,"ngClass"],s,[4,"ngIf"],t,o,["class","text-danger",4,"ngIf"],[1,"text-danger"],i]},template:function(t,o){1&t&&(e._UZ(0,"cd-rbd-tabs"),e.TgZ(1,"cd-table",0),e.NdJ("fetchData",function(){return o.taskListService.fetch()})("updateSelection",function(_){return o.updateSelection(_)}),e.TgZ(2,"div",1),e._UZ(3,"cd-table-actions",2),e.YNc(4,Ua,4,4,"button",3),e.qZA(),e.qZA(),e.YNc(5,er,4,5,"ng-template",null,4,e.W1O),e.YNc(7,or,1,1,"ng-template",null,5,e.W1O)),2&t&&(e.xp6(1),e.Q6J("data",o.images)("columns",o.columns)("status",o.tableStatus)("autoReload",-1),e.xp6(2),e.Q6J("permission",o.permission)("selection",o.selection)("tableActions",o.tableActions),e.xp6(1),e.Q6J("ngIf",o.permission.delete))},directives:[We,W.a,Ee.K,l.O5,$.o,l.mk],pipes:[Ze.N],styles:[""]}),n})(),$t=(()=>{class n{}return n.\u0275fac=function(t){return new(t||n)},n.\u0275mod=e.oAB({type:n}),n.\u0275inj=e.cJS({imports:[[l.ez,ni,a.u5,a.UX,N.Oz,N.dT,N.HK,Ie.b,Ae.m,m.Bz,ne.xc]]}),n})();const ir=[{path:"",redirectTo:"rbd",pathMatch:"full"},{path:"rbd",canActivate:[U.T,re.P],data:{moduleStatusGuardConfig:{uiApiPath:"block/rbd",redirectTo:"error",header:"No RBD pools available",button_name:"Create RBD pool",button_route:"/pool/create"},breadcrumbs:"Images"},children:[{path:"",component:ba},{path:"namespaces",component:xa,data:{breadcrumbs:"Namespaces"}},{path:"trash",component:nr,data:{breadcrumbs:"Trash"}},{path:"performance",component:wa,data:{breadcrumbs:"Overall Performance"}},{path:v.MQ.CREATE,component:$e,data:{breadcrumbs:v.Qn.CREATE}},{path:`${v.MQ.EDIT}/:image_spec`,component:$e,data:{breadcrumbs:v.Qn.EDIT}},{path:`${v.MQ.CLONE}/:image_spec/:snap`,component:$e,data:{breadcrumbs:v.Qn.CLONE}},{path:`${v.MQ.COPY}/:image_spec`,component:$e,data:{breadcrumbs:v.Qn.COPY}},{path:`${v.MQ.COPY}/:image_spec/:snap`,component:$e,data:{breadcrumbs:v.Qn.COPY}}]},{path:"mirroring",component:Vi,canActivate:[U.T,re.P],data:{moduleStatusGuardConfig:{uiApiPath:"block/mirroring",redirectTo:"error",header:"RBD mirroring is not configured",button_name:"Configure RBD Mirroring",button_title:"This will create rbd-mirror service and a replicated RBD pool",component:"RBD Mirroring",uiConfig:!0},breadcrumbs:"Mirroring"},children:[{path:`${v.MQ.EDIT}/:pool_name`,component:es,outlet:"modal"}]},{path:"iscsi",canActivate:[U.T],data:{breadcrumbs:"iSCSI"},children:[{path:"",redirectTo:"overview",pathMatch:"full"},{path:"overview",component:oi,data:{breadcrumbs:"Overview"}},{path:"targets",data:{breadcrumbs:"Targets"},children:[{path:"",component:qn},{path:v.MQ.CREATE,component:ut,data:{breadcrumbs:v.Qn.CREATE}},{path:`${v.MQ.EDIT}/:target_iqn`,component:ut,data:{breadcrumbs:v.Qn.EDIT}}]}]}];let sr=(()=>{class n{}return n.\u0275fac=function(t){return new(t||n)},n.\u0275mod=e.oAB({type:n}),n.\u0275inj=e.cJS({imports:[[$t,m.Bz.forChild(ir)]]}),n})()},54555:(ct,Oe,p)=>{p.d(Oe,{d:()=>z});var l=p(74788),a=p(24751),m=p(23815),ne=p.n(m),N=p(80226),Ie=p(65862),v=p(95463),U=p(30633),re=p(28211),Ae=p(34089),be=p(41582),S=p(12057),le=p(56310),D=p(18372),ie=p(87925),V=p(94276);let e=(()=>{class A{constructor(u,C){this.control=u,this.formatter=C}setValue(u){const C=this.formatter.toMilliseconds(u);this.control.control.setValue(`${C} ms`)}ngOnInit(){this.setValue(this.control.value),this.ngDataReady&&this.ngDataReady.subscribe(()=>this.setValue(this.control.value))}onUpdate(u){this.setValue(u)}}return A.\u0275fac=function(u){return new(u||A)(l.Y36(a.a5),l.Y36(re.H))},A.\u0275dir=l.lG2({type:A,selectors:[["","cdMilliseconds",""]],hostBindings:function(u,C){1&u&&l.NdJ("blur",function(O){return C.onUpdate(O.target.value)})},inputs:{ngDataReady:"ngDataReady"}}),A})();var X=p(20044);let Ne=(()=>{class A{constructor(u,C,h,O){this.elementRef=u,this.control=C,this.dimlessBinaryPerSecondPipe=h,this.formatter=O,this.ngModelChange=new l.vpe,this.el=this.elementRef.nativeElement}ngOnInit(){this.setValue(this.el.value),this.ngDataReady&&this.ngDataReady.subscribe(()=>this.setValue(this.el.value))}setValue(u){/^[\d.]+$/.test(u)&&(u+=this.defaultUnit||"m");const C=this.formatter.toBytes(u,0),h=this.round(C);this.el.value=this.dimlessBinaryPerSecondPipe.transform(h),null!==C?(this.ngModelChange.emit(this.el.value),this.control.control.setValue(this.el.value)):(this.ngModelChange.emit(null),this.control.control.setValue(null))}round(u){if(null!==u&&0!==u){if(!ne().isUndefined(this.minBytes)&&u<this.minBytes)return this.minBytes;if(!ne().isUndefined(this.maxBytes)&&u>this.maxBytes)return this.maxBytes;if(!ne().isUndefined(this.roundPower)){const C=Math.round(Math.log(u)/Math.log(this.roundPower));return Math.pow(this.roundPower,C)}}return u}onBlur(u){this.setValue(u)}}return A.\u0275fac=function(u){return new(u||A)(l.Y36(l.SBq),l.Y36(a.a5),l.Y36(X.O),l.Y36(re.H))},A.\u0275dir=l.lG2({type:A,selectors:[["","cdDimlessBinaryPerSecond",""]],hostBindings:function(u,C){1&u&&l.NdJ("blur",function(O){return C.onBlur(O.target.value)})},inputs:{ngDataReady:"ngDataReady",minBytes:"minBytes",maxBytes:"maxBytes",roundPower:"roundPower",defaultUnit:"defaultUnit"},outputs:{ngModelChange:"ngModelChange"}}),A})(),Fe=(()=>{class A{constructor(u,C){this.formatter=u,this.ngControl=C}setValue(u){const C=this.formatter.toIops(u);this.ngControl.control.setValue(`${C} IOPS`)}ngOnInit(){this.setValue(this.ngControl.value),this.ngDataReady&&this.ngDataReady.subscribe(()=>this.setValue(this.ngControl.value))}onUpdate(u){this.setValue(u)}}return A.\u0275fac=function(u){return new(u||A)(l.Y36(re.H),l.Y36(a.a5))},A.\u0275dir=l.lG2({type:A,selectors:[["","cdIops",""]],hostBindings:function(u,C){1&u&&l.NdJ("blur",function(O){return C.onUpdate(O.target.value)})},inputs:{ngDataReady:"ngDataReady"}}),A})();function L(A,R){if(1&A&&(l.ynx(0),l._UZ(1,"input",18),l.BQk()),2&A){const u=l.oxw().$implicit,C=l.oxw(2);l.xp6(1),l.Q6J("id",u.name)("name",u.name)("formControlName",u.name)("ngDataReady",C.ngDataReady)}}function he(A,R){if(1&A&&(l.ynx(0),l._UZ(1,"input",19),l.BQk()),2&A){const u=l.oxw().$implicit,C=l.oxw(2);l.xp6(1),l.Q6J("id",u.name)("name",u.name)("formControlName",u.name)("ngDataReady",C.ngDataReady)}}function q(A,R){if(1&A&&(l.ynx(0),l._UZ(1,"input",20),l.BQk()),2&A){const u=l.oxw().$implicit,C=l.oxw(2);l.xp6(1),l.Q6J("id",u.name)("name",u.name)("formControlName",u.name)("ngDataReady",C.ngDataReady)}}function F(A,R){1&A&&(l.TgZ(0,"span",21),l.SDv(1,22),l.qZA())}const y=function(A){return{active:A}},T=function(A){return[A]};function H(A,R){if(1&A){const u=l.EpF();l.TgZ(0,"div",10),l.TgZ(1,"label",11),l._uU(2),l.TgZ(3,"cd-helper"),l._uU(4),l.qZA(),l.qZA(),l.TgZ(5,"div"),l.TgZ(6,"div",12),l.ynx(7,13),l.YNc(8,L,2,4,"ng-container",14),l.YNc(9,he,2,4,"ng-container",14),l.YNc(10,q,2,4,"ng-container",14),l.BQk(),l.TgZ(11,"span",15),l.TgZ(12,"button",16),l.NdJ("click",function(){const O=l.CHM(u).$implicit;return l.oxw(2).reset(O.name)}),l._UZ(13,"i",7),l.qZA(),l.qZA(),l.qZA(),l.YNc(14,F,2,0,"span",17),l.qZA(),l.qZA()}if(2&A){const u=R.$implicit,C=l.oxw().$implicit,h=l.oxw(),O=l.MAs(1);l.xp6(1),l.Q6J("for",u.name),l.xp6(1),l.Oqu(u.displayName),l.xp6(2),l.Oqu(u.description),l.xp6(1),l.Gre("cd-col-form-input ",C.heading,""),l.xp6(2),l.Q6J("ngSwitch",u.type),l.xp6(1),l.Q6J("ngSwitchCase",h.configurationType.milliseconds),l.xp6(1),l.Q6J("ngSwitchCase",h.configurationType.bps),l.xp6(1),l.Q6J("ngSwitchCase",h.configurationType.iops),l.xp6(2),l.Q6J("ngClass",l.VKq(13,y,h.isDisabled(u.name))),l.xp6(1),l.Q6J("ngClass",l.VKq(15,T,h.icons.erase)),l.xp6(1),l.Q6J("ngIf",h.form.showError("configuration."+u.name,O,"min"))}}function x(A,R){if(1&A){const u=l.EpF();l.TgZ(0,"div",4),l.TgZ(1,"h4",5),l.TgZ(2,"span",6),l.NdJ("click",function(){const O=l.CHM(u).$implicit;return l.oxw().toggleSectionVisibility(O.class)}),l._uU(3),l._UZ(4,"i",7),l.qZA(),l.qZA(),l.TgZ(5,"div",8),l.YNc(6,H,15,17,"div",9),l.qZA(),l.qZA()}if(2&A){const u=R.$implicit,C=l.oxw();l.xp6(3),l.hij(" ",u.heading," "),l.xp6(1),l.Q6J("ngClass",C.sectionVisibility[u.class]?C.icons.minusCircle:C.icons.addCircle),l.xp6(1),l.Tol(u.class),l.Q6J("hidden",!C.sectionVisibility[u.class]),l.xp6(1),l.Q6J("ngForOf",u.options)}}let z=(()=>{class A{constructor(u,C){this.formatterService=u,this.rbdConfigurationService=C,this.initializeData=new N.t(1),this.changes=new l.vpe,this.icons=Ie.P,this.ngDataReady=new l.vpe,this.configurationType=U.r,this.sectionVisibility={}}ngOnInit(){const u=this.createConfigurationFormGroup();this.form.addControl("configuration",u),u.valueChanges.subscribe(()=>{this.changes.emit(this.getDirtyValues.bind(this))}),this.initializeData&&this.initializeData.subscribe(C=>{this.initialData=C.initialData;const h=C.sourceType;this.rbdConfigurationService.getWritableOptionFields().forEach(O=>{const $=C.initialData.filter(k=>k.name===O.name).pop();$&&$.source===h&&this.form.get(`configuration.${O.name}`).setValue($.value)}),this.ngDataReady.emit()}),this.rbdConfigurationService.getWritableSections().forEach(C=>this.sectionVisibility[C.class]=!1)}getDirtyValues(u=!1,C){if(u&&!C)throw new Error("ProgrammingError: If local values shall be included, a proper localFieldType argument has to be provided, too");const h={};return this.rbdConfigurationService.getWritableOptionFields().forEach(O=>{const $=this.form.get("configuration").get(O.name);this.initialData&&this.initialData[O.name]===$.value||($.dirty||u&&$.source===C)&&(h[O.name]=null===$.value?$.value:O.type===U.r.bps?this.formatterService.toBytes($.value):O.type===U.r.milliseconds?this.formatterService.toMilliseconds($.value):O.type===U.r.iops?this.formatterService.toIops($.value):$.value)}),h}createConfigurationFormGroup(){const u=new v.d({});return this.rbdConfigurationService.getWritableOptionFields().forEach(C=>{let h;if(C.type!==U.r.milliseconds&&C.type!==U.r.iops&&C.type!==U.r.bps)throw new Error(`Type ${C.type} is unknown, you may need to add it to RbdConfiguration class`);{let O=0;ne().forEach(this.initialData,$=>{$.name===C.name&&(O=$.value)}),h=new a.NI(O,a.kI.min(0))}u.addControl(C.name,h)}),u}reset(u){const C=this.form.get("configuration").get(u);C.disabled?(C.setValue(C.previousValue||0),C.enable(),C.previousValue||C.markAsPristine()):(C.previousValue=C.value,C.setValue(null),C.markAsDirty(),C.disable())}isDisabled(u){return this.form.get("configuration").get(u).disabled}toggleSectionVisibility(u){this.sectionVisibility[u]=!this.sectionVisibility[u]}}return A.\u0275fac=function(u){return new(u||A)(l.Y36(re.H),l.Y36(Ae.n))},A.\u0275cmp=l.Xpm({type:A,selectors:[["cd-rbd-configuration-form"]],inputs:{form:"form",initializeData:"initializeData"},outputs:{changes:"changes"},decls:5,vars:2,consts:function(){let R,u,C;return R="RBD Configuration",u="Remove the local configuration value. The parent configuration value will be inherited and used instead.",C="The minimum value is 0",[[3,"formGroup"],["cfgFormGroup",""],R,["class","col-12",4,"ngFor","ngForOf"],[1,"col-12"],[1,"cd-header"],[1,"collapsible",3,"click"],["aria-hidden","true",3,"ngClass"],[3,"hidden"],["class","form-group row",4,"ngFor","ngForOf"],[1,"form-group","row"],[1,"cd-col-form-label",3,"for"],[1,"input-group"],[3,"ngSwitch"],[4,"ngSwitchCase"],[1,"input-group-append"],["type","button","data-toggle","button","title",u,1,"btn","btn-light",3,"ngClass","click"],["class","invalid-feedback",4,"ngIf"],["type","text","cdMilliseconds","",1,"form-control",3,"id","name","formControlName","ngDataReady"],["type","text","defaultUnit","b","cdDimlessBinaryPerSecond","",1,"form-control",3,"id","name","formControlName","ngDataReady"],["type","text","cdIops","",1,"form-control",3,"id","name","formControlName","ngDataReady"],[1,"invalid-feedback"],C]},template:function(u,C){1&u&&(l.TgZ(0,"fieldset",0,1),l.TgZ(2,"legend"),l.SDv(3,2),l.qZA(),l.YNc(4,x,7,7,"div",3),l.qZA()),2&u&&(l.Q6J("formGroup",C.form.get("configuration")),l.xp6(4),l.Q6J("ngForOf",C.rbdConfigurationService.sections))},directives:[a.JL,a.sg,be.V,S.sg,S.mk,le.P,D.S,S.RF,S.n9,ie.o,S.O5,a.Fj,V.b,e,a.JJ,a.u,Ne,Fe],styles:[".collapsible[_ngcontent-%COMP%]{cursor:pointer;user-select:none}"]}),A})()},71752:(ct,Oe,p)=>{p.d(Oe,{P:()=>q});var l=p(35905),a=p(30633),m=p(74788);let ne=(()=>{class F{transform(T){return{0:"global",1:"pool",2:"image"}[T]}}return F.\u0275fac=function(T){return new(T||F)},F.\u0275pipe=m.Yjl({name:"rbdConfigurationSource",type:F,pure:!0}),F})();var N=p(28211),Ie=p(34089),v=p(12057),U=p(20044),re=p(48537),Ae=p(21766);const be=["configurationSourceTpl"],S=["configurationValueTpl"],le=["poolConfTable"];function D(F,y){1&F&&(m.TgZ(0,"span"),m.SDv(1,6),m.qZA())}function ie(F,y){1&F&&(m.TgZ(0,"strong"),m.SDv(1,7),m.qZA())}function V(F,y){1&F&&(m.TgZ(0,"strong"),m.SDv(1,8),m.qZA())}function e(F,y){1&F&&(m.TgZ(0,"div",4),m.YNc(1,D,2,0,"span",5),m.YNc(2,ie,2,0,"strong",5),m.YNc(3,V,2,0,"strong",5),m.qZA()),2&F&&(m.Q6J("ngSwitch",y.value),m.xp6(1),m.Q6J("ngSwitchCase","global"),m.xp6(1),m.Q6J("ngSwitchCase","image"),m.xp6(1),m.Q6J("ngSwitchCase","pool"))}function X(F,y){if(1&F&&(m.TgZ(0,"span"),m._uU(1),m.ALo(2,"dimlessBinaryPerSecond"),m.qZA()),2&F){const T=m.oxw().value;m.xp6(1),m.Oqu(m.lcZ(2,1,T))}}function Ne(F,y){if(1&F&&(m.TgZ(0,"span"),m._uU(1),m.ALo(2,"milliseconds"),m.qZA()),2&F){const T=m.oxw().value;m.xp6(1),m.Oqu(m.lcZ(2,1,T))}}function Fe(F,y){if(1&F&&(m.TgZ(0,"span"),m._uU(1),m.ALo(2,"iops"),m.qZA()),2&F){const T=m.oxw().value;m.xp6(1),m.Oqu(m.lcZ(2,1,T))}}function L(F,y){if(1&F&&(m.TgZ(0,"span"),m._uU(1),m.qZA()),2&F){const T=m.oxw().value;m.xp6(1),m.Oqu(T)}}function he(F,y){if(1&F&&(m.TgZ(0,"div",4),m.YNc(1,X,3,3,"span",5),m.YNc(2,Ne,3,3,"span",5),m.YNc(3,Fe,3,3,"span",5),m.YNc(4,L,2,1,"span",9),m.qZA()),2&F){const T=y.row,H=m.oxw();m.Q6J("ngSwitch",T.type),m.xp6(1),m.Q6J("ngSwitchCase",H.typeField.bps),m.xp6(1),m.Q6J("ngSwitchCase",H.typeField.milliseconds),m.xp6(1),m.Q6J("ngSwitchCase",H.typeField.iops)}}let q=(()=>{class F{constructor(T,H){this.formatterService=T,this.rbdConfigurationService=H,this.sourceField=a.h,this.typeField=a.r}ngOnInit(){this.poolConfigurationColumns=[{prop:"displayName",name:"Name"},{prop:"description",name:"Description"},{prop:"name",name:"Key"},{prop:"source",name:"Source",cellTemplate:this.configurationSourceTpl,pipe:new ne},{prop:"value",name:"Value",cellTemplate:this.configurationValueTpl}]}ngOnChanges(){!this.data||(this.data=this.data.filter(T=>this.rbdConfigurationService.getOptionFields().map(H=>H.name).includes(T.name)))}}return F.\u0275fac=function(T){return new(T||F)(m.Y36(N.H),m.Y36(Ie.n))},F.\u0275cmp=m.Xpm({type:F,selectors:[["cd-rbd-configuration-table"]],viewQuery:function(T,H){if(1&T&&(m.Gf(be,7),m.Gf(S,7),m.Gf(le,7)),2&T){let x;m.iGM(x=m.CRH())&&(H.configurationSourceTpl=x.first),m.iGM(x=m.CRH())&&(H.configurationValueTpl=x.first),m.iGM(x=m.CRH())&&(H.poolConfTable=x.first)}},inputs:{data:"data"},features:[m.TTD],decls:6,vars:2,consts:function(){let y,T,H;return y="Global",T="Image",H="Pool",[["identifier","name",3,"data","columns"],["poolConfTable",""],["configurationSourceTpl",""],["configurationValueTpl",""],[3,"ngSwitch"],[4,"ngSwitchCase"],y,T,H,[4,"ngSwitchDefault"]]},template:function(T,H){1&T&&(m._UZ(0,"cd-table",0,1),m.YNc(2,e,4,4,"ng-template",null,2,m.W1O),m.YNc(4,he,5,4,"ng-template",null,3,m.W1O)),2&T&&m.Q6J("data",H.data)("columns",H.poolConfigurationColumns)},directives:[l.a,v.RF,v.n9,v.ED],pipes:[U.O,re.J,Ae.A],styles:[""]}),F})()}}]);
\ No newline at end of file
diff --git a/ceph/src/pybind/mgr/dashboard/frontend/dist/en-US/585.7d0bcf3a0ac0c40fef3b.js b/ceph/src/pybind/mgr/dashboard/frontend/dist/en-US/585.7d0bcf3a0ac0c40fef3b.js
deleted file mode 100644 (file)
index c43f640..0000000
+++ /dev/null
@@ -1 +0,0 @@
-"use strict";(self.webpackChunkceph_dashboard=self.webpackChunkceph_dashboard||[]).push([[585],{24585:(Fi,Fe,r)=>{r.r(Fe),r.d(Fe,{PoolModule:()=>ze,RoutedPoolModule:()=>Ai});var C=r(12057),a=r(24751),Oe=r(6283),g=r(38549),M=r(79512),d_=r(44466),u_=r(70483),f_=r(370),P_=r(23815),u=r.n(P_),E_=r(80226),g_=r(26504),ue=r(80842);class S{constructor(){this.nodes=[],this.idTree={},this.allDevices=[],this.buckets=[],this.failureDomains={},this.failureDomainKeys=[],this.devices=[],this.deviceCount=0}static searchFailureDomains(i,_){return this.getFailureDomains(this.search(i,_))}static search(i,_){const[o,n]=_.split("~"),s=i.find(c=>["name","id","type"].some(d=>c[d]===o));return s?(i=this.getSubNodes(s,this.createIdTreeFromNodes(i)),n&&(i=this.filterNodesByDeviceType(i,n)),i):[]}static createIdTreeFromNodes(i){const _={};return i.forEach(o=>{_[o.id]=o}),_}static getSubNodes(i,_){let o=[i];return i.children&&i.children.forEach(n=>{o=o.concat(this.getSubNodes(_[n],_))}),o}static filterNodesByDeviceType(i,_){let n,o=i.filter(c=>c.device_class&&c.device_class!==_).map(c=>c.id),s=o;do{n=!1,i=i.filter(d=>!o.includes(d.id));const c=[];i.forEach(d=>{d.children&&d.children.every(P=>o.includes(P))&&(c.push(d.id),n=!0)}),n&&(o=c,s=s.concat(c))}while(n);return(i=u().cloneDeep(i)).map(c=>(c.children&&(c.children=c.children.filter(d=>!s.includes(d))),c))}static getFailureDomains(i){const _={};return i.forEach(o=>{const n=o.type;_[n]||(_[n]=[]),_[n].push(o)}),_}initCrushNodeSelection(i,_,o,n){this.nodes=i,this.idTree=S.createIdTreeFromNodes(i),i.forEach(s=>{this.idTree[s.id]=s}),this.buckets=u().sortBy(i.filter(s=>s.children),"name"),this.controls={root:_,failure:o,device:n},this.preSelectRoot(),this.controls.root.valueChanges.subscribe(()=>this.onRootChange()),this.controls.failure.valueChanges.subscribe(()=>this.onFailureDomainChange()),this.controls.device.valueChanges.subscribe(()=>this.onDeviceChange())}preSelectRoot(){const i=this.nodes.find(_=>"root"===_.type);this.silentSet(this.controls.root,i),this.onRootChange()}silentSet(i,_){i.setValue(_,{emitEvent:!1})}onRootChange(){const i=S.getSubNodes(this.controls.root.value,this.idTree),_=S.getFailureDomains(i);Object.keys(_).forEach(o=>{_[o].length<=1&&delete _[o]}),this.failureDomains=_,this.failureDomainKeys=Object.keys(_).sort(),this.updateFailureDomain()}updateFailureDomain(){let i=this.getIncludedCustomValue(this.controls.failure,Object.keys(this.failureDomains));""===i&&(i=this.setMostCommonDomain(this.controls.failure)),this.updateDevices(i)}getIncludedCustomValue(i,_){return i.dirty&&_.includes(i.value)?i.value:""}setMostCommonDomain(i){let _={n:0,type:""};return Object.keys(this.failureDomains).forEach(o=>{const n=this.failureDomains[o].length;_.n<n&&(_={n,type:o})}),this.silentSet(i,_.type),_.type}onFailureDomainChange(){this.updateDevices()}updateDevices(i=this.controls.failure.value){const _=u().flatten(this.failureDomains[i].map(n=>S.getSubNodes(n,this.idTree)));this.allDevices=_.filter(n=>n.device_class).map(n=>n.device_class),this.devices=u().uniq(this.allDevices).sort();const o=1===this.devices.length?this.devices[0]:this.getIncludedCustomValue(this.controls.device,this.devices);this.silentSet(this.controls.device,o),this.onDeviceChange(o)}onDeviceChange(i=this.controls.device.value){this.deviceCount=""===i?this.allDevices.length:this.allDevices.filter(_=>_===i).length}}var Ne=r(30982),p_=r(14745),b=r(65862),R_=r(93614),be=r(95463),E=r(77205),m_=r(30633),v=r(76111),C_=r(47557),M_=r(28211),de=r(32337),e=r(74788),ve=r(62862),Ie=r(83608),$e=r(60312),fe=r(41582),Pe=r(56310),Ee=r(87925),ge=r(94276),pe=r(82945),Re=r(18372),me=r(30839),Ce=r(10545);function h_(t,i){1&t&&(e.TgZ(0,"span",30),e.SDv(1,31),e.qZA())}function T_(t,i){1&t&&(e.TgZ(0,"span",30),e.SDv(1,32),e.qZA())}function S_(t,i){1&t&&(e.TgZ(0,"span",30),e.SDv(1,33),e.qZA())}function L_(t,i){1&t&&(e.TgZ(0,"option",26),e.SDv(1,34),e.qZA())}function A_(t,i){if(1&t&&(e.TgZ(0,"option",35),e._uU(1),e.qZA()),2&t){const _=i.$implicit;e.Q6J("ngValue",_),e.xp6(1),e.hij(" ",_.name," ")}}function F_(t,i){1&t&&(e.TgZ(0,"span",30),e.SDv(1,36),e.qZA())}function N_(t,i){1&t&&(e.TgZ(0,"option",26),e.SDv(1,37),e.qZA())}function b_(t,i){if(1&t&&(e.TgZ(0,"option",35),e._uU(1),e.qZA()),2&t){const _=i.$implicit,o=e.oxw();e.Q6J("ngValue",_),e.xp6(1),e.AsE(" ",_," ( ",o.failureDomains[_].length," ) ")}}function v_(t,i){1&t&&(e.TgZ(0,"span",30),e.SDv(1,38),e.qZA())}function I_(t,i){if(1&t&&(e.TgZ(0,"option",35),e._uU(1),e.qZA()),2&t){const _=i.$implicit;e.Q6J("ngValue",_),e.xp6(1),e.hij(" ",_," ")}}let $_=(()=>{class t extends S{constructor(_,o,n,s,c){super(),this.formBuilder=_,this.activeModal=o,this.taskWrapper=n,this.crushRuleService=s,this.actionLabels=c,this.submitAction=new e.vpe,this.tooltips=this.crushRuleService.formTooltips,this.action=this.actionLabels.CREATE,this.resource="Crush Rule",this.createForm()}createForm(){this.form=this.formBuilder.group({name:["",[a.kI.required,a.kI.pattern("[A-Za-z0-9_-]+"),E.h.custom("uniqueName",_=>this.names&&-1!==this.names.indexOf(_))]],root:null,failure_domain:"",device_class:""})}ngOnInit(){this.crushRuleService.getInfo().subscribe(({names:_,nodes:o})=>{this.initCrushNodeSelection(o,this.form.get("root"),this.form.get("failure_domain"),this.form.get("device_class")),this.names=_})}onSubmit(){if(this.form.invalid)return void this.form.setErrors({cdSubmitButton:!0});const _=u().cloneDeep(this.form.value);_.root=_.root.name,""===_.device_class&&delete _.device_class,this.taskWrapper.wrapTaskAroundCall({task:new v.R("crushRule/create",_),call:this.crushRuleService.create(_)}).subscribe({error:()=>{this.form.setErrors({cdSubmitButton:!0})},complete:()=>{this.activeModal.close(),this.submitAction.emit(_)}})}}return t.\u0275fac=function(_){return new(_||t)(e.Y36(ve.O),e.Y36(g.Kz),e.Y36(de.P),e.Y36(Ie.H),e.Y36(M.p4))},t.\u0275cmp=e.Xpm({type:t,selectors:[["cd-crush-rule-form-modal"]],outputs:{submitAction:"submitAction"},features:[e.qOj],decls:55,vars:27,consts:function(){let i,_,o,n,s,c,d,P,p,R,h,T,m;return i="" + "\ufffd0\ufffd" + " " + "\ufffd1\ufffd" + "",_="Name",o="Root",n="Failure domain type",s="Device class",c="Let Ceph decide",d="This field is required!",P="The name can only consist of alphanumeric characters, dashes and underscores.",p="The chosen erasure code profile name is already in use.",R="Loading...",h="This field is required!",T="Loading...",m="This field is required!",[[3,"modalRef"],[1,"modal-title"],i,[1,"modal-content"],["novalidate","",3,"formGroup"],["frm","ngForm"],[1,"modal-body"],[1,"form-group","row"],["for","name",1,"cd-col-form-label"],_,[1,"required"],[1,"cd-col-form-input"],["type","text","id","name","name","name","placeholder","Name...","formControlName","name","autofocus","",1,"form-control"],["class","invalid-feedback",4,"ngIf"],["for","root",1,"cd-col-form-label"],o,[3,"html"],["id","root","name","root","formControlName","root",1,"form-control"],["ngValue","",4,"ngIf"],[3,"ngValue",4,"ngFor","ngForOf"],["for","failure_domain",1,"cd-col-form-label"],n,["id","failure_domain","name","failure_domain","formControlName","failure_domain",1,"form-control"],["for","device_class",1,"cd-col-form-label"],s,["id","device_class","name","device_class","formControlName","device_class",1,"form-control"],["ngValue",""],c,[1,"modal-footer"],[3,"form","submitText","submitActionEvent"],[1,"invalid-feedback"],d,P,p,R,[3,"ngValue"],h,T,m]},template:function(_,o){if(1&_&&(e.TgZ(0,"cd-modal",0),e.ynx(1,1),e.SDv(2,2),e.ALo(3,"titlecase"),e.ALo(4,"upperFirst"),e.BQk(),e.ynx(5,3),e.TgZ(6,"form",4,5),e.TgZ(8,"div",6),e.TgZ(9,"div",7),e.TgZ(10,"label",8),e.ynx(11),e.SDv(12,9),e.BQk(),e._UZ(13,"span",10),e.qZA(),e.TgZ(14,"div",11),e._UZ(15,"input",12),e.YNc(16,h_,2,0,"span",13),e.YNc(17,T_,2,0,"span",13),e.YNc(18,S_,2,0,"span",13),e.qZA(),e.qZA(),e.TgZ(19,"div",7),e.TgZ(20,"label",14),e.ynx(21),e.SDv(22,15),e.BQk(),e._UZ(23,"cd-helper",16),e._UZ(24,"span",10),e.qZA(),e.TgZ(25,"div",11),e.TgZ(26,"select",17),e.YNc(27,L_,2,0,"option",18),e.YNc(28,A_,2,2,"option",19),e.qZA(),e.YNc(29,F_,2,0,"span",13),e.qZA(),e.qZA(),e.TgZ(30,"div",7),e.TgZ(31,"label",20),e.ynx(32),e.SDv(33,21),e.BQk(),e._UZ(34,"cd-helper",16),e._UZ(35,"span",10),e.qZA(),e.TgZ(36,"div",11),e.TgZ(37,"select",22),e.YNc(38,N_,2,0,"option",18),e.YNc(39,b_,2,3,"option",19),e.qZA(),e.YNc(40,v_,2,0,"span",13),e.qZA(),e.qZA(),e.TgZ(41,"div",7),e.TgZ(42,"label",23),e.ynx(43),e.SDv(44,24),e.BQk(),e._UZ(45,"cd-helper",16),e.qZA(),e.TgZ(46,"div",11),e.TgZ(47,"select",25),e.TgZ(48,"option",26),e.SDv(49,27),e.qZA(),e.YNc(50,I_,2,2,"option",19),e.qZA(),e.qZA(),e.qZA(),e.qZA(),e.TgZ(51,"div",28),e.TgZ(52,"cd-form-button-panel",29),e.NdJ("submitActionEvent",function(){return o.onSubmit()}),e.ALo(53,"titlecase"),e.ALo(54,"upperFirst"),e.qZA(),e.qZA(),e.qZA(),e.BQk(),e.qZA()),2&_){const n=e.MAs(7);e.Q6J("modalRef",o.activeModal),e.xp6(4),e.pQV(e.lcZ(3,19,o.action))(e.lcZ(4,21,o.resource)),e.QtT(2),e.xp6(2),e.Q6J("formGroup",o.form),e.xp6(10),e.Q6J("ngIf",o.form.showError("name",n,"required")),e.xp6(1),e.Q6J("ngIf",o.form.showError("name",n,"pattern")),e.xp6(1),e.Q6J("ngIf",o.form.showError("name",n,"uniqueName")),e.xp6(5),e.Q6J("html",o.tooltips.root),e.xp6(4),e.Q6J("ngIf",!o.buckets),e.xp6(1),e.Q6J("ngForOf",o.buckets),e.xp6(1),e.Q6J("ngIf",o.form.showError("root",n,"required")),e.xp6(5),e.Q6J("html",o.tooltips.failure_domain),e.xp6(4),e.Q6J("ngIf",!o.failureDomains),e.xp6(1),e.Q6J("ngForOf",o.failureDomainKeys),e.xp6(1),e.Q6J("ngIf",o.form.showError("failure_domain",n,"required")),e.xp6(5),e.Q6J("html",o.tooltips.device_class),e.xp6(5),e.Q6J("ngForOf",o.devices),e.xp6(2),e.Q6J("form",o.form)("submitText",e.lcZ(53,23,o.action)+" "+e.lcZ(54,25,o.resource))}},directives:[$e.z,a._Y,a.JL,fe.V,a.sg,Pe.P,Ee.o,a.Fj,ge.b,a.JJ,a.u,pe.U,C.O5,Re.S,a.EJ,C.sg,a.YN,a.Kr,me.p],pipes:[C.rS,Ce.m],styles:[""]}),t})();class D_{}var Z_=r(58497);let Me=(()=>{class t{constructor(_){this.http=_,this.apiPath="api/erasure_code_profile",this.formTooltips={k:"Each object is split in data-chunks parts, each stored on a different OSD.",m:"Compute coding chunks for each object and store them on different OSDs.\n      The number of coding chunks is also the number of OSDs that can be down without losing data.",plugins:{jerasure:{description:"The jerasure plugin is the most generic and flexible plugin,\n          it is also the default for Ceph erasure coded pools.",technique:"The more flexible technique is reed_sol_van : it is enough to set k\n          and m. The cauchy_good technique can be faster but you need to chose the packetsize\n          carefully. All of reed_sol_r6_op, liberation, blaum_roth, liber8tion are RAID6 equivalents\n          in the sense that they can only be configured with m=2.",packetSize:"The encoding will be done on packets of bytes size at a time.\n          Choosing the right packet size is difficult.\n          The jerasure documentation contains extensive information on this topic."},lrc:{description:"With the jerasure plugin, when an erasure coded object is stored on\n          multiple OSDs, recovering from the loss of one OSD requires reading from all the others.\n          For instance if jerasure is configured with k=8 and m=4, losing one OSD requires reading\n          from the eleven others to repair.\n\n          The lrc erasure code plugin creates local parity chunks to be able to recover using\n          less OSDs. For instance if lrc is configured with k=8, m=4 and l=4, it will create\n          an additional parity chunk for every four OSDs. When a single OSD is lost, it can be\n          recovered with only four OSDs instead of eleven.",l:"Group the coding and data chunks into sets of size locality. For instance,\n          for k=4 and m=2, when locality=3 two groups of three are created. Each set can\n          be recovered without reading chunks from another set.",crushLocality:"The type of the crush bucket in which each set of chunks defined\n          by l will be stored. For instance, if it is set to rack, each group of l chunks will be\n          placed in a different rack. It is used to create a CRUSH rule step such as step choose\n          rack. If it is not set, no such grouping is done."},isa:{description:"The isa plugin encapsulates the ISA library. It only runs on Intel processors.",technique:"The ISA plugin comes in two Reed Solomon forms.\n          If reed_sol_van is set, it is Vandermonde, if cauchy is set, it is Cauchy."},shec:{description:"The shec plugin encapsulates the multiple SHEC library.\n          It allows ceph to recover data more efficiently than Reed Solomon codes.",c:"The number of parity chunks each of which includes each data chunk in its\n          calculation range. The number is used as a durability estimator. For instance, if c=2,\n          2 OSDs can be down without losing data."},clay:{description:"CLAY (short for coupled-layer) codes are erasure codes designed to\n          bring about significant savings in terms of network bandwidth and disk IO when a failed\n          node/OSD/rack is being repaired.",d:"Number of OSDs requested to send data during recovery of a single chunk.\n          d needs to be chosen such that k+1 <= d <= k+m-1. The larger the d, the better\n          the savings.",scalar_mds:"scalar_mds specifies the plugin that is used as a building block\n          in the layered construction. It can be one of jerasure, isa, shec.",technique:"technique specifies the technique that will be picked\n          within the 'scalar_mds' plugin specified. Supported techniques\n          are 'reed_sol_van', 'reed_sol_r6_op', 'cauchy_orig',\n          'cauchy_good', 'liber8tion' for jerasure, 'reed_sol_van',\n          'cauchy' for isa and 'single', 'multiple' for shec."}},crushRoot:"The name of the crush bucket used for the first step of the CRUSH rule.\n      For instance step take default.",crushFailureDomain:"Ensure that no two chunks are in a bucket with the same failure\n      domain. For instance, if the failure domain is host no two chunks will be stored on the same\n      host. It is used to create a CRUSH rule step such as step chooseleaf host.",crushDeviceClass:"Restrict placement to devices of a specific class\n      (e.g., ssd or hdd), using the crush device class names in the CRUSH map.",directory:"Set the directory name from which the erasure code plugin is loaded."}}list(){return this.http.get(this.apiPath)}create(_){return this.http.post(this.apiPath,_,{observe:"response"})}delete(_){return this.http.delete(`${this.apiPath}/${_}`,{observe:"response"})}getInfo(){return this.http.get(`ui-${this.apiPath}/info`)}}return t.\u0275fac=function(_){return new(_||t)(e.LFG(Z_.eN))},t.\u0275prov=e.Yz7({token:t,factory:t.\u0275fac,providedIn:"root"}),t})();function x_(t,i){1&t&&(e.TgZ(0,"span",46),e.SDv(1,47),e.qZA())}function y_(t,i){1&t&&(e.TgZ(0,"span",46),e.SDv(1,48),e.qZA())}function U_(t,i){1&t&&(e.TgZ(0,"span",46),e.SDv(1,49),e.qZA())}function q_(t,i){1&t&&(e.TgZ(0,"option",37),e.SDv(1,50),e.qZA())}function H_(t,i){if(1&t&&(e.TgZ(0,"option",51),e._uU(1),e.qZA()),2&t){const _=i.$implicit;e.Q6J("ngValue",_),e.xp6(1),e.hij(" ",_," ")}}function G_(t,i){1&t&&(e.TgZ(0,"span",46),e.SDv(1,52),e.qZA())}function z_(t,i){1&t&&(e.TgZ(0,"span",46),e.SDv(1,53),e.qZA())}function X_(t,i){1&t&&(e.TgZ(0,"span",46),e.SDv(1,54),e.qZA())}function w_(t,i){if(1&t&&(e.TgZ(0,"span",46),e.SDv(1,55),e.qZA()),2&t){const _=e.oxw();e.xp6(1),e.pQV(_.deviceCount),e.QtT(1)}}function Q_(t,i){1&t&&(e.TgZ(0,"span",46),e.SDv(1,56),e.qZA())}function J_(t,i){1&t&&(e.TgZ(0,"span",46),e.SDv(1,57),e.qZA())}function k_(t,i){if(1&t&&(e.TgZ(0,"span",39),e.SDv(1,58),e.qZA()),2&t){const _=e.oxw();e.xp6(1),e.pQV(_.lrcMultiK),e.QtT(1)}}function V_(t,i){1&t&&(e.TgZ(0,"span",46),e.SDv(1,59),e.qZA())}function Y_(t,i){1&t&&(e.TgZ(0,"span",46),e.SDv(1,60),e.qZA())}function B_(t,i){if(1&t&&(e.TgZ(0,"span",46),e.SDv(1,61),e.qZA()),2&t){const _=e.oxw();e.xp6(1),e.pQV(_.deviceCount),e.QtT(1)}}function j_(t,i){1&t&&(e.TgZ(0,"span",46),e.SDv(1,65),e.qZA())}function K_(t,i){1&t&&(e.TgZ(0,"span",46),e.SDv(1,66),e.qZA())}function W_(t,i){if(1&t&&(e.TgZ(0,"div",7),e.TgZ(1,"label",62),e.TgZ(2,"span",14),e.SDv(3,63),e.qZA(),e._UZ(4,"cd-helper",16),e.qZA(),e.TgZ(5,"div",10),e._UZ(6,"input",64),e.YNc(7,j_,2,0,"span",12),e.YNc(8,K_,2,0,"span",12),e.qZA(),e.qZA()),2&t){const _=e.oxw(),o=e.MAs(7);e.xp6(4),e.Q6J("html",_.tooltips.plugins.shec.c),e.xp6(3),e.Q6J("ngIf",_.form.showError("c",o,"min")),e.xp6(1),e.Q6J("ngIf",_.form.showError("c",o,"cGreaterM"))}}function eo(t,i){1&t&&(e.TgZ(0,"span",39),e.SDv(1,75),e.qZA())}function _o(t,i){if(1&t&&(e.TgZ(0,"span",39),e.SDv(1,76),e.qZA()),2&t){const _=e.oxw(3);e.xp6(1),e.pQV(_.getDMin())(_.getDMax()),e.QtT(1)}}function oo(t,i){if(1&t&&(e.TgZ(0,"span",39),e.SDv(1,77),e.qZA()),2&t){const _=e.oxw(3);e.xp6(1),e.pQV(_.getDMax()),e.QtT(1)}}function to(t,i){if(1&t&&(e.ynx(0),e.YNc(1,_o,2,2,"span",23),e.YNc(2,oo,2,1,"span",23),e.BQk()),2&t){const _=e.oxw(2);e.xp6(1),e.Q6J("ngIf",_.getDMin()<_.getDMax()),e.xp6(1),e.Q6J("ngIf",_.getDMin()===_.getDMax())}}function io(t,i){if(1&t&&(e.TgZ(0,"span",46),e.SDv(1,78),e.qZA()),2&t){const _=e.oxw(2);e.xp6(1),e.pQV(_.getDMin()),e.QtT(1)}}function no(t,i){if(1&t&&(e.TgZ(0,"span",46),e.SDv(1,79),e.qZA()),2&t){const _=e.oxw(2);e.xp6(1),e.pQV(_.getDMax()),e.QtT(1)}}function so(t,i){if(1&t){const _=e.EpF();e.TgZ(0,"div",7),e.TgZ(1,"label",67),e.TgZ(2,"span",14),e.SDv(3,68),e.qZA(),e._UZ(4,"cd-helper",16),e.qZA(),e.TgZ(5,"div",10),e.TgZ(6,"div",69),e._UZ(7,"input",70),e.TgZ(8,"span",71),e.TgZ(9,"button",72),e.NdJ("click",function(){return e.CHM(_),e.oxw().toggleDCalc()}),e._UZ(10,"i",73),e.qZA(),e.qZA(),e.qZA(),e.YNc(11,eo,2,0,"span",23),e.YNc(12,to,3,2,"ng-container",74),e.YNc(13,io,2,1,"span",12),e.YNc(14,no,2,1,"span",12),e.qZA(),e.qZA()}if(2&t){const _=e.oxw(),o=e.MAs(7);e.xp6(4),e.Q6J("html",_.tooltips.plugins.clay.d),e.xp6(6),e.Q6J("ngClass",_.dCalc?_.icons.unlock:_.icons.lock),e.xp6(1),e.Q6J("ngIf",_.dCalc),e.xp6(1),e.Q6J("ngIf",!_.dCalc),e.xp6(1),e.Q6J("ngIf",_.form.showError("d",o,"dMin")),e.xp6(1),e.Q6J("ngIf",_.form.showError("d",o,"dMax"))}}function ao(t,i){1&t&&(e.TgZ(0,"span",46),e.SDv(1,84),e.qZA())}function lo(t,i){1&t&&(e.TgZ(0,"span",46),e.SDv(1,85),e.qZA())}function ro(t,i){1&t&&(e.TgZ(0,"span",46),e.SDv(1,86),e.qZA())}function co(t,i){if(1&t&&(e.TgZ(0,"div",7),e.TgZ(1,"label",80),e.TgZ(2,"span",14),e.SDv(3,81),e.qZA(),e._UZ(4,"cd-helper",16),e.qZA(),e.TgZ(5,"div",10),e._UZ(6,"input",82),e.YNc(7,ao,2,0,"span",12),e.YNc(8,lo,2,0,"span",12),e.YNc(9,ro,2,0,"span",12),e.TgZ(10,"span",39),e.SDv(11,83),e.qZA(),e.qZA(),e.qZA()),2&t){const _=e.oxw(),o=e.MAs(7);e.xp6(4),e.Q6J("html",_.tooltips.plugins.lrc.l),e.xp6(3),e.Q6J("ngIf",_.form.showError("l",o,"required")),e.xp6(1),e.Q6J("ngIf",_.form.showError("l",o,"min")),e.xp6(1),e.Q6J("ngIf",_.form.showError("l",o,"unequal")),e.xp6(2),e.pQV(_.lrcGroups),e.QtT(11)}}function Oo(t,i){1&t&&(e.TgZ(0,"option",37),e.SDv(1,87),e.qZA())}function uo(t,i){if(1&t&&(e.TgZ(0,"option",51),e._uU(1),e.qZA()),2&t){const _=i.$implicit,o=e.oxw();e.Q6J("ngValue",_),e.xp6(1),e.AsE(" ",_," ( ",o.failureDomains[_].length," ) ")}}function fo(t,i){1&t&&(e.TgZ(0,"option",37),e.SDv(1,91),e.qZA())}function Po(t,i){1&t&&(e.TgZ(0,"option",37),e.SDv(1,92),e.qZA())}function Eo(t,i){if(1&t&&(e.TgZ(0,"option",51),e._uU(1),e.qZA()),2&t){const _=i.$implicit,o=e.oxw(2);e.Q6J("ngValue",_),e.xp6(1),e.AsE(" ",_," ( ",o.failureDomains[_].length," ) ")}}function go(t,i){if(1&t&&(e.TgZ(0,"div",7),e.TgZ(1,"label",88),e.ynx(2),e.SDv(3,89),e.BQk(),e._UZ(4,"cd-helper",16),e.qZA(),e.TgZ(5,"div",10),e.TgZ(6,"select",90),e.YNc(7,fo,2,0,"option",18),e.YNc(8,Po,2,0,"option",18),e.YNc(9,Eo,2,3,"option",19),e.qZA(),e.qZA(),e.qZA()),2&t){const _=e.oxw();e.xp6(4),e.Q6J("html",_.tooltips.plugins.lrc.crushLocality),e.xp6(3),e.Q6J("ngIf",!_.failureDomains),e.xp6(1),e.Q6J("ngIf",_.failureDomainKeys.length>0),e.xp6(1),e.Q6J("ngForOf",_.failureDomainKeys)}}function po(t,i){if(1&t&&(e.TgZ(0,"option",51),e._uU(1),e.qZA()),2&t){const _=i.$implicit;e.Q6J("ngValue",_),e.xp6(1),e.hij(" ",_," ")}}const De=function(t,i,_){return[t,i,_]};function Ro(t,i){if(1&t&&(e.TgZ(0,"div",7),e.TgZ(1,"label",93),e.ynx(2),e.SDv(3,94),e.BQk(),e._UZ(4,"cd-helper",16),e.qZA(),e.TgZ(5,"div",10),e.TgZ(6,"select",95),e.YNc(7,po,2,2,"option",19),e.qZA(),e.qZA(),e.qZA()),2&t){const _=e.oxw();e.xp6(4),e.Q6J("html",_.tooltips.plugins.clay.scalar_mds),e.xp6(3),e.Q6J("ngForOf",e.kEZ(2,De,_.PLUGIN.JERASURE,_.PLUGIN.ISA,_.PLUGIN.SHEC))}}function mo(t,i){if(1&t&&(e.TgZ(0,"option",51),e._uU(1),e.qZA()),2&t){const _=i.$implicit;e.Q6J("ngValue",_),e.xp6(1),e.hij(" ",_," ")}}function Co(t,i){if(1&t&&(e.TgZ(0,"div",7),e.TgZ(1,"label",96),e.ynx(2),e.SDv(3,97),e.BQk(),e._UZ(4,"cd-helper",16),e.qZA(),e.TgZ(5,"div",10),e.TgZ(6,"select",98),e.YNc(7,mo,2,2,"option",19),e.qZA(),e.qZA(),e.qZA()),2&t){const _=e.oxw();e.xp6(4),e.Q6J("html",_.tooltips.plugins[_.plugin].technique),e.xp6(3),e.Q6J("ngForOf",_.techniques)}}function Mo(t,i){1&t&&(e.TgZ(0,"span",46),e.SDv(1,102),e.qZA())}function ho(t,i){if(1&t&&(e.TgZ(0,"div",7),e.TgZ(1,"label",99),e.ynx(2),e.SDv(3,100),e.BQk(),e._UZ(4,"cd-helper",16),e.qZA(),e.TgZ(5,"div",10),e._UZ(6,"input",101),e.YNc(7,Mo,2,0,"span",12),e.qZA(),e.qZA()),2&t){const _=e.oxw(),o=e.MAs(7);e.xp6(4),e.Q6J("html",_.tooltips.plugins.jerasure.packetSize),e.xp6(3),e.Q6J("ngIf",_.form.showError("packetSize",o,"min"))}}function To(t,i){1&t&&(e.TgZ(0,"option",37),e.SDv(1,103),e.qZA())}function So(t,i){if(1&t&&(e.TgZ(0,"option",51),e._uU(1),e.qZA()),2&t){const _=i.$implicit;e.Q6J("ngValue",_),e.xp6(1),e.hij(" ",_.name," ")}}function Lo(t,i){if(1&t&&(e.TgZ(0,"option",51),e._uU(1),e.qZA()),2&t){const _=i.$implicit;e.Q6J("ngValue",_),e.xp6(1),e.hij(" ",_," ")}}let Ao=(()=>{class t extends S{constructor(_,o,n,s,c){super(),this.formBuilder=_,this.activeModal=o,this.taskWrapper=n,this.ecpService=s,this.actionLabels=c,this.submitAction=new e.vpe,this.tooltips=this.ecpService.formTooltips,this.PLUGIN={LRC:"lrc",SHEC:"shec",CLAY:"clay",JERASURE:"jerasure",ISA:"isa"},this.plugin=this.PLUGIN.JERASURE,this.icons=b.P,this.action=this.actionLabels.CREATE,this.resource="EC Profile",this.createForm(),this.setJerasureDefaults()}createForm(){this.form=this.formBuilder.group({name:[null,[a.kI.required,a.kI.pattern("[A-Za-z0-9_-]+"),E.h.custom("uniqueName",_=>this.names&&-1!==this.names.indexOf(_))]],plugin:[this.PLUGIN.JERASURE,[a.kI.required]],k:[4,[a.kI.required,E.h.custom("max",()=>this.baseValueValidation(!0)),E.h.custom("unequal",_=>this.lrcDataValidation(_)),E.h.custom("kLowerM",_=>this.shecDataValidation(_))]],m:[2,[a.kI.required,E.h.custom("max",()=>this.baseValueValidation())]],crushFailureDomain:"",crushRoot:null,crushDeviceClass:"",directory:"",technique:"reed_sol_van",packetSize:[2048],l:[3,[a.kI.required,E.h.custom("unequal",_=>this.lrcLocalityValidation(_))]],crushLocality:"",c:[2,[a.kI.required,E.h.custom("cGreaterM",_=>this.shecDurabilityValidation(_))]],d:[5,[a.kI.required,E.h.custom("dMin",_=>this.dMinValidation(_)),E.h.custom("dMax",_=>this.dMaxValidation(_))]],scalar_mds:[this.PLUGIN.JERASURE,[a.kI.required]]}),this.toggleDCalc(),this.form.get("k").valueChanges.subscribe(()=>this.updateValidityOnChange(["m","l","d"])),this.form.get("m").valueChanges.subscribe(()=>this.updateValidityOnChange(["k","l","c","d"])),this.form.get("l").valueChanges.subscribe(()=>this.updateValidityOnChange(["k","m"])),this.form.get("plugin").valueChanges.subscribe(_=>this.onPluginChange(_)),this.form.get("scalar_mds").valueChanges.subscribe(()=>this.setClayDefaultsForScalar())}baseValueValidation(_=!1){return this.validValidation(()=>this.getKMSum()>this.deviceCount&&this.form.getValue("k")>this.form.getValue("m")===_)}validValidation(_,o){return!((!this.form||o)&&this.plugin!==o)&&_()}getKMSum(){return this.form.getValue("k")+this.form.getValue("m")}lrcDataValidation(_){return this.validValidation(()=>{const o=this.form.getValue("m"),n=this.form.getValue("l"),s=_+o;return this.lrcMultiK=_/(s/n),_%(s/n)!=0},"lrc")}shecDataValidation(_){return this.validValidation(()=>this.form.getValue("m")>_,"shec")}lrcLocalityValidation(_){return this.validValidation(()=>{const o=this.getKMSum();return this.lrcGroups=_>0?o/_:0,_>0&&o%_!=0},"lrc")}shecDurabilityValidation(_){return this.validValidation(()=>{const o=this.form.getValue("m");return _>o},"shec")}dMinValidation(_){return this.validValidation(()=>this.getDMin()>_,"clay")}getDMin(){return this.form.getValue("k")+1}dMaxValidation(_){return this.validValidation(()=>_>this.getDMax(),"clay")}getDMax(){const _=this.form.getValue("m");return this.form.getValue("k")+_-1}toggleDCalc(){this.dCalc=!this.dCalc,this.form.get("d")[this.dCalc?"disable":"enable"](),this.calculateD()}calculateD(){this.plugin!==this.PLUGIN.CLAY||!this.dCalc||this.form.silentSet("d",this.getDMax())}updateValidityOnChange(_){_.forEach(o=>{"d"===o&&this.calculateD(),this.form.get(o).updateValueAndValidity({emitEvent:!1})})}onPluginChange(_){this.plugin=_,_===this.PLUGIN.JERASURE?this.setJerasureDefaults():_===this.PLUGIN.LRC?this.setLrcDefaults():_===this.PLUGIN.ISA?this.setIsaDefaults():_===this.PLUGIN.SHEC?this.setShecDefaults():_===this.PLUGIN.CLAY&&this.setClayDefaults(),this.updateValidityOnChange(["m"])}setJerasureDefaults(){this.techniques=["reed_sol_van","reed_sol_r6_op","cauchy_orig","cauchy_good","liberation","blaum_roth","liber8tion"],this.setDefaults({k:4,m:2,technique:"reed_sol_van"})}setLrcDefaults(){this.setDefaults({k:4,m:2,l:3})}setIsaDefaults(){this.techniques=["reed_sol_van","cauchy"],this.setDefaults({k:7,m:3,technique:"reed_sol_van"})}setShecDefaults(){this.setDefaults({k:4,m:3,c:2})}setClayDefaults(){this.setDefaults({k:4,m:2,scalar_mds:this.PLUGIN.JERASURE}),this.setClayDefaultsForScalar()}setClayDefaultsForScalar(){const _=this.form.getValue("scalar_mds");let o="reed_sol_van";_===this.PLUGIN.JERASURE?this.techniques=["reed_sol_van","reed_sol_r6_op","cauchy_orig","cauchy_good","liber8tion"]:_===this.PLUGIN.ISA?this.techniques=["reed_sol_van","cauchy"]:(o="single",this.techniques=["single","multiple"]),this.setDefaults({technique:o})}setDefaults(_){Object.keys(_).forEach(o=>{const n=this.form.get(o),s=n.value;n.pristine||"technique"===o&&!this.techniques.includes(s)||"k"===o&&[4,7].includes(s)||"m"===o&&[2,3].includes(s)?n.setValue(_[o]):n.updateValueAndValidity()})}ngOnInit(){this.ecpService.getInfo().subscribe(({plugins:_,names:o,directory:n,nodes:s})=>{this.initCrushNodeSelection(s,this.form.get("crushRoot"),this.form.get("crushFailureDomain"),this.form.get("crushDeviceClass")),this.plugins=_,this.names=o,this.form.silentSet("directory",n),this.preValidateNumericInputFields()})}preValidateNumericInputFields(){const _=["k","m","l","c","d"].map(o=>this.form.get(o));_.forEach(o=>{o.markAsTouched(),o.markAsDirty()}),_[1].updateValueAndValidity()}onSubmit(){if(this.form.invalid)return void this.form.setErrors({cdSubmitButton:!0});const _=this.createJson();this.taskWrapper.wrapTaskAroundCall({task:new v.R("ecp/create",{name:_.name}),call:this.ecpService.create(_)}).subscribe({error:()=>{this.form.setErrors({cdSubmitButton:!0})},complete:()=>{this.activeModal.close(),this.submitAction.emit(_)}})}createJson(){const _={technique:[this.PLUGIN.ISA,this.PLUGIN.JERASURE,this.PLUGIN.CLAY],packetSize:[this.PLUGIN.JERASURE],l:[this.PLUGIN.LRC],crushLocality:[this.PLUGIN.LRC],c:[this.PLUGIN.SHEC],d:[this.PLUGIN.CLAY],scalar_mds:[this.PLUGIN.CLAY]},o=new D_,n=this.form.getValue("plugin");return Object.keys(this.form.controls).filter(s=>{const c=_[s],d=this.form.getValue(s);return(c&&c.includes(n)||!c)&&d&&""!==d}).forEach(s=>{this.extendJson(s,o)}),o}extendJson(_,o){const s=this.form.getValue(_);o[{crushFailureDomain:"crush-failure-domain",crushRoot:"crush-root",crushDeviceClass:"crush-device-class",packetSize:"packetsize",crushLocality:"crush-locality"}[_]||_]="crushRoot"===_?s.name:s}}return t.\u0275fac=function(_){return new(_||t)(e.Y36(ve.O),e.Y36(g.Kz),e.Y36(de.P),e.Y36(Me),e.Y36(M.p4))},t.\u0275cmp=e.Xpm({type:t,selectors:[["cd-erasure-code-profile-form-modal"]],outputs:{submitAction:"submitAction"},features:[e.qOj],decls:98,vars:53,consts:function(){let i,_,o,n,s,c,d,P,p,R,h,T,m,f,A,I,$,D,Z,x,y,U,q,H,G,z,X,w,Q,J,k,V,Y,B,j,K,N,W,ee,_e,oe,te,ie,ne,se,ae,le,re,ce;return i="" + "\ufffd0\ufffd" + " " + "\ufffd1\ufffd" + "",_="Name",o="Plugin",n="Data chunks (k)",s="Coding chunks (m)",c="Crush failure domain",d="Crush root",P="Crush device class",p="Let Ceph decide",R="Available OSDs: " + "\ufffd0\ufffd" + "",h="Directory",T="This field is required!",m="The name can only consist of alphanumeric characters, dashes and underscores.",f="The chosen erasure code profile name is already in use.",A="Loading...",I="This field is required!",$="This field is required!",D="Must be equal to or greater than 2.",Z="Chunks (k+m) have exceeded the available OSDs of " + "\ufffd0\ufffd" + ".",x="For an equal distribution k has to be a multiple of (k+m)/l.",y="K has to be equal to or greater than m in order to recover data correctly through c.",U="Distribution factor: " + "\ufffd0\ufffd" + "",q="This field is required!",H="Must be equal to or greater than 1.",G="Chunks (k+m) have exceeded the available OSDs of " + "\ufffd0\ufffd" + ".",z="Durability estimator (c)",X="Must be equal to or greater than 1.",w="C has to be equal to or lower than m as m defines the amount of chunks that can be used.",Q="Helper chunks (d)",J="Set d manually or use the plugin's default calculation that maximizes d.",k="D is automatically updated on k and m changes",V="D can be set from " + "\ufffd0\ufffd" + " to " + "\ufffd1\ufffd" + "",Y="D can only be set to " + "\ufffd0\ufffd" + "",B="D has to be greater than k (" + "\ufffd0\ufffd" + ").",j="D has to be lower than k + m (" + "\ufffd0\ufffd" + ").",K="Locality (l)",N="Locality groups: " + "\ufffd0\ufffd" + "",W="This field is required!",ee="Must be equal to or greater than 1.",_e="Can't split up chunks (k+m) correctly with the current locality.",oe="Loading...",te="Crush Locality",ie="Loading...",ne="None",se="Scalar mds",ae="Technique",le="Packetsize",re="Must be equal to or greater than 1.",ce="Loading...",[[3,"modalRef"],[1,"modal-title"],i,[1,"modal-content"],["novalidate","",3,"formGroup"],["frm","ngForm"],[1,"modal-body"],[1,"form-group","row"],["for","name",1,"cd-col-form-label"],_,[1,"cd-col-form-input"],["type","text","id","name","name","name","placeholder","Name...","formControlName","name","autofocus","",1,"form-control"],["class","invalid-feedback",4,"ngIf"],["for","plugin",1,"cd-col-form-label"],[1,"required"],o,[3,"html"],["id","plugin","name","plugin","formControlName","plugin",1,"form-control"],["ngValue","",4,"ngIf"],[3,"ngValue",4,"ngFor","ngForOf"],["for","k",1,"cd-col-form-label"],n,["type","number","id","k","name","k","ng-model","$ctrl.erasureCodeProfile.k","placeholder","Data chunks...","formControlName","k","min","2",1,"form-control"],["class","form-text text-muted",4,"ngIf"],["for","m",1,"cd-col-form-label"],s,["type","number","id","m","name","m","placeholder","Coding chunks...","formControlName","m","min","1",1,"form-control"],["class","form-group row",4,"ngIf"],["for","crushFailureDomain",1,"cd-col-form-label"],c,["id","crushFailureDomain","name","crushFailureDomain","formControlName","crushFailureDomain",1,"form-control"],["for","crushRoot",1,"cd-col-form-label"],d,["id","crushRoot","name","crushRoot","formControlName","crushRoot",1,"form-control"],["for","crushDeviceClass",1,"cd-col-form-label"],P,["id","crushDeviceClass","name","crushDeviceClass","formControlName","crushDeviceClass",1,"form-control"],["ngValue",""],p,[1,"form-text","text-muted"],R,["for","directory",1,"cd-col-form-label"],h,["type","text","id","directory","name","directory","placeholder","Path...","formControlName","directory",1,"form-control"],[1,"modal-footer"],[3,"form","submitText","submitActionEvent"],[1,"invalid-feedback"],T,m,f,A,[3,"ngValue"],I,$,D,Z,x,y,U,q,H,G,["for","c",1,"cd-col-form-label"],z,["type","number","id","c","name","c","placeholder","Coding chunks...","formControlName","c","min","1",1,"form-control"],X,w,["for","d",1,"cd-col-form-label"],Q,[1,"input-group"],["type","number","id","d","name","d","placeholder","Helper chunks...","formControlName","d",1,"form-control"],[1,"input-group-append"],["id","d-calc-btn","ngbTooltip",J,"type","button",1,"btn","btn-light",3,"click"],["aria-hidden","true",3,"ngClass"],[4,"ngIf"],k,V,Y,B,j,["for","l",1,"cd-col-form-label"],K,["type","number","id","l","name","l","placeholder","Coding chunks...","formControlName","l","min","1",1,"form-control"],N,W,ee,_e,oe,["for","crushLocality",1,"cd-col-form-label"],te,["id","crushLocality","name","crushLocality","formControlName","crushLocality",1,"form-control"],ie,ne,["for","scalar_mds",1,"cd-col-form-label"],se,["id","scalar_mds","name","scalar_mds","formControlName","scalar_mds",1,"form-control"],["for","technique",1,"cd-col-form-label"],ae,["id","technique","name","technique","formControlName","technique",1,"form-control"],["for","packetSize",1,"cd-col-form-label"],le,["type","number","id","packetSize","name","packetSize","placeholder","Packetsize...","formControlName","packetSize","min","1",1,"form-control"],re,ce]},template:function(_,o){if(1&_&&(e.TgZ(0,"cd-modal",0),e.ynx(1,1),e.SDv(2,2),e.ALo(3,"titlecase"),e.ALo(4,"upperFirst"),e.BQk(),e.ynx(5,3),e.TgZ(6,"form",4,5),e.TgZ(8,"div",6),e.TgZ(9,"div",7),e.TgZ(10,"label",8),e.SDv(11,9),e.qZA(),e.TgZ(12,"div",10),e._UZ(13,"input",11),e.YNc(14,x_,2,0,"span",12),e.YNc(15,y_,2,0,"span",12),e.YNc(16,U_,2,0,"span",12),e.qZA(),e.qZA(),e.TgZ(17,"div",7),e.TgZ(18,"label",13),e.TgZ(19,"span",14),e.SDv(20,15),e.qZA(),e._UZ(21,"cd-helper",16),e.qZA(),e.TgZ(22,"div",10),e.TgZ(23,"select",17),e.YNc(24,q_,2,0,"option",18),e.YNc(25,H_,2,2,"option",19),e.qZA(),e.YNc(26,G_,2,0,"span",12),e.qZA(),e.qZA(),e.TgZ(27,"div",7),e.TgZ(28,"label",20),e.TgZ(29,"span",14),e.SDv(30,21),e.qZA(),e._UZ(31,"cd-helper",16),e.qZA(),e.TgZ(32,"div",10),e._UZ(33,"input",22),e.YNc(34,z_,2,0,"span",12),e.YNc(35,X_,2,0,"span",12),e.YNc(36,w_,2,1,"span",12),e.YNc(37,Q_,2,0,"span",12),e.YNc(38,J_,2,0,"span",12),e.YNc(39,k_,2,1,"span",23),e.qZA(),e.qZA(),e.TgZ(40,"div",7),e.TgZ(41,"label",24),e.TgZ(42,"span",14),e.SDv(43,25),e.qZA(),e._UZ(44,"cd-helper",16),e.qZA(),e.TgZ(45,"div",10),e._UZ(46,"input",26),e.YNc(47,V_,2,0,"span",12),e.YNc(48,Y_,2,0,"span",12),e.YNc(49,B_,2,1,"span",12),e.qZA(),e.qZA(),e.YNc(50,W_,9,3,"div",27),e.YNc(51,so,15,6,"div",27),e.YNc(52,co,12,5,"div",27),e.TgZ(53,"div",7),e.TgZ(54,"label",28),e.ynx(55),e.SDv(56,29),e.BQk(),e._UZ(57,"cd-helper",16),e.qZA(),e.TgZ(58,"div",10),e.TgZ(59,"select",30),e.YNc(60,Oo,2,0,"option",18),e.YNc(61,uo,2,3,"option",19),e.qZA(),e.qZA(),e.qZA(),e.YNc(62,go,10,4,"div",27),e.YNc(63,Ro,8,6,"div",27),e.YNc(64,Co,8,2,"div",27),e.YNc(65,ho,8,2,"div",27),e.TgZ(66,"div",7),e.TgZ(67,"label",31),e.ynx(68),e.SDv(69,32),e.BQk(),e._UZ(70,"cd-helper",16),e.qZA(),e.TgZ(71,"div",10),e.TgZ(72,"select",33),e.YNc(73,To,2,0,"option",18),e.YNc(74,So,2,2,"option",19),e.qZA(),e.qZA(),e.qZA(),e.TgZ(75,"div",7),e.TgZ(76,"label",34),e.ynx(77),e.SDv(78,35),e.BQk(),e._UZ(79,"cd-helper",16),e.qZA(),e.TgZ(80,"div",10),e.TgZ(81,"select",36),e.TgZ(82,"option",37),e.SDv(83,38),e.qZA(),e.YNc(84,Lo,2,2,"option",19),e.qZA(),e.TgZ(85,"span",39),e.SDv(86,40),e.qZA(),e.qZA(),e.qZA(),e.TgZ(87,"div",7),e.TgZ(88,"label",41),e.ynx(89),e.SDv(90,42),e.BQk(),e._UZ(91,"cd-helper",16),e.qZA(),e.TgZ(92,"div",10),e._UZ(93,"input",43),e.qZA(),e.qZA(),e.qZA(),e.TgZ(94,"div",44),e.TgZ(95,"cd-form-button-panel",45),e.NdJ("submitActionEvent",function(){return o.onSubmit()}),e.ALo(96,"titlecase"),e.ALo(97,"upperFirst"),e.qZA(),e.qZA(),e.qZA(),e.BQk(),e.qZA()),2&_){const n=e.MAs(7);e.Q6J("modalRef",o.activeModal),e.xp6(4),e.pQV(e.lcZ(3,41,o.action))(e.lcZ(4,43,o.resource)),e.QtT(2),e.xp6(2),e.Q6J("formGroup",o.form),e.xp6(8),e.Q6J("ngIf",o.form.showError("name",n,"required")),e.xp6(1),e.Q6J("ngIf",o.form.showError("name",n,"pattern")),e.xp6(1),e.Q6J("ngIf",o.form.showError("name",n,"uniqueName")),e.xp6(5),e.Q6J("html",o.tooltips.plugins[o.plugin].description),e.xp6(3),e.Q6J("ngIf",!o.plugins),e.xp6(1),e.Q6J("ngForOf",o.plugins),e.xp6(1),e.Q6J("ngIf",o.form.showError("name",n,"required")),e.xp6(5),e.Q6J("html",o.tooltips.k),e.xp6(3),e.Q6J("ngIf",o.form.showError("k",n,"required")),e.xp6(1),e.Q6J("ngIf",o.form.showError("k",n,"min")),e.xp6(1),e.Q6J("ngIf",o.form.showError("k",n,"max")),e.xp6(1),e.Q6J("ngIf",o.form.showError("k",n,"unequal")),e.xp6(1),e.Q6J("ngIf",o.form.showError("k",n,"kLowerM")),e.xp6(1),e.Q6J("ngIf","lrc"===o.plugin),e.xp6(5),e.Q6J("html",o.tooltips.m),e.xp6(3),e.Q6J("ngIf",o.form.showError("m",n,"required")),e.xp6(1),e.Q6J("ngIf",o.form.showError("m",n,"min")),e.xp6(1),e.Q6J("ngIf",o.form.showError("m",n,"max")),e.xp6(1),e.Q6J("ngIf","shec"===o.plugin),e.xp6(1),e.Q6J("ngIf","clay"===o.plugin),e.xp6(1),e.Q6J("ngIf",o.plugin===o.PLUGIN.LRC),e.xp6(5),e.Q6J("html",o.tooltips.crushFailureDomain),e.xp6(3),e.Q6J("ngIf",!o.failureDomains),e.xp6(1),e.Q6J("ngForOf",o.failureDomainKeys),e.xp6(1),e.Q6J("ngIf",o.plugin===o.PLUGIN.LRC),e.xp6(1),e.Q6J("ngIf",o.PLUGIN.CLAY===o.plugin),e.xp6(1),e.Q6J("ngIf",e.kEZ(49,De,o.PLUGIN.JERASURE,o.PLUGIN.ISA,o.PLUGIN.CLAY).includes(o.plugin)),e.xp6(1),e.Q6J("ngIf",o.plugin===o.PLUGIN.JERASURE),e.xp6(5),e.Q6J("html",o.tooltips.crushRoot),e.xp6(3),e.Q6J("ngIf",!o.buckets),e.xp6(1),e.Q6J("ngForOf",o.buckets),e.xp6(5),e.Q6J("html",o.tooltips.crushDeviceClass),e.xp6(5),e.Q6J("ngForOf",o.devices),e.xp6(2),e.pQV(o.deviceCount),e.QtT(86),e.xp6(5),e.Q6J("html",o.tooltips.directory),e.xp6(4),e.Q6J("form",o.form)("submitText",e.lcZ(96,45,o.action)+" "+e.lcZ(97,47,o.resource))}},directives:[$e.z,a._Y,a.JL,fe.V,a.sg,Pe.P,Ee.o,a.Fj,ge.b,a.JJ,a.u,pe.U,C.O5,Re.S,a.EJ,C.sg,a.wV,a.qQ,a.YN,a.Kr,me.p,g._L,C.mk],pipes:[C.rS,Ce.m],styles:[""]}),t})();var Fo=r(7022);class No{constructor(){this.erasureInfo=!1,this.crushInfo=!1,this.pgs=1,this.poolTypes=["erasure","replicated"],this.applications={selected:[],default:["cephfs","rbd","rgw"],available:[],validators:[a.kI.pattern("[A-Za-z0-9_]+"),a.kI.maxLength(128)],messages:new Fo.a({empty:"No applications added",selectionLimit:{text:"Applications limit reached",tooltip:"A pool can only have up to four applications definitions."},customValidations:{pattern:"Allowed characters '_a-zA-Z0-9'",maxlength:"Maximum length is 128 characters"},filter:"Filter or add applications'",add:"Add application"})}}}var Ze=r(63285),he=r(74937),bo=r(63622),vo=r(60192),Io=r(17932),$o=r(54555),Do=r(30490),xe=r(61350);const Zo=["crushInfoTabs"],xo=["crushDeletionBtn"],yo=["ecpInfoTabs"],Uo=["ecpDeletionBtn"];function qo(t,i){1&t&&(e.TgZ(0,"span",41),e.SDv(1,42),e.qZA())}function Ho(t,i){1&t&&(e.TgZ(0,"span",41),e.SDv(1,43),e.qZA())}function Go(t,i){1&t&&(e.TgZ(0,"span",41),e.SDv(1,44),e.qZA())}function zo(t,i){1&t&&(e.TgZ(0,"span",41),e.SDv(1,45),e.qZA())}function Xo(t,i){if(1&t&&(e.TgZ(0,"option",46),e._uU(1),e.qZA()),2&t){const _=i.$implicit;e.Q6J("value",_),e.xp6(1),e.hij(" ",_," ")}}function wo(t,i){1&t&&(e.TgZ(0,"span",41),e.SDv(1,47),e.qZA())}function Qo(t,i){if(1&t&&(e.TgZ(0,"option",46),e._uU(1),e.qZA()),2&t){const _=i.$implicit;e.Q6J("value",_),e.xp6(1),e.hij(" ",_," ")}}function Jo(t,i){1&t&&(e.TgZ(0,"span",41),e.SDv(1,58),e.qZA())}function ko(t,i){1&t&&(e.TgZ(0,"span",41),e.SDv(1,59),e.qZA())}function Vo(t,i){1&t&&(e.TgZ(0,"span",41),e.SDv(1,60),e.qZA())}function Yo(t,i){1&t&&(e.TgZ(0,"span",55),e.SDv(1,61),e.qZA())}function Bo(t,i){if(1&t){const _=e.EpF();e.TgZ(0,"div",8),e.TgZ(1,"label",52),e.SDv(2,53),e.qZA(),e.TgZ(3,"div",11),e.TgZ(4,"input",54),e.NdJ("focus",function(){return e.CHM(_),e.oxw(3).externalPgChange=!1})("blur",function(){return e.CHM(_),e.oxw(3).alignPgs()}),e.qZA(),e.YNc(5,Jo,2,0,"span",13),e.YNc(6,ko,2,0,"span",13),e.YNc(7,Vo,2,0,"span",13),e.TgZ(8,"span",55),e._UZ(9,"cd-doc",56),e.qZA(),e.YNc(10,Yo,2,0,"span",57),e.qZA(),e.qZA()}if(2&t){e.oxw(2);const _=e.MAs(2),o=e.oxw();e.xp6(5),e.Q6J("ngIf",o.form.showError("pgNum",_,"required")),e.xp6(1),e.Q6J("ngIf",o.form.showError("pgNum",_,"min")),e.xp6(1),e.Q6J("ngIf",o.form.showError("pgNum",_,"34")),e.xp6(3),e.Q6J("ngIf",o.externalPgChange)}}function jo(t,i){if(1&t&&(e.TgZ(0,"span",41),e.TgZ(1,"ul",66),e.TgZ(2,"li"),e.SDv(3,67),e.qZA(),e.TgZ(4,"li"),e.SDv(5,68),e.qZA(),e.qZA(),e.qZA()),2&t){const _=e.oxw(4);e.xp6(3),e.pQV(_.getMinSize()),e.QtT(3),e.xp6(2),e.pQV(_.getMaxSize()),e.QtT(5)}}function Ko(t,i){if(1&t&&(e.TgZ(0,"span",41),e.SDv(1,69),e.qZA()),2&t){const _=e.oxw(4);e.xp6(1),e.pQV(_.getMinSize())(_.getMaxSize()),e.QtT(1)}}function Wo(t,i){1&t&&(e.TgZ(0,"span",70),e.SDv(1,71),e.qZA())}function et(t,i){if(1&t&&(e.TgZ(0,"div",8),e.TgZ(1,"label",62),e.SDv(2,63),e.qZA(),e.TgZ(3,"div",11),e._UZ(4,"input",64),e.YNc(5,jo,6,2,"span",13),e.YNc(6,Ko,2,2,"span",13),e.YNc(7,Wo,2,0,"span",65),e.qZA(),e.qZA()),2&t){e.oxw(2);const _=e.MAs(2),o=e.oxw();e.xp6(4),e.Q6J("max",o.getMaxSize())("min",o.getMinSize()),e.xp6(1),e.Q6J("ngIf",o.form.showError("size",_)),e.xp6(1),e.Q6J("ngIf",o.form.showError("size",_)),e.xp6(1),e.Q6J("ngIf",1===o.form.getValue("size"))}}function _t(t,i){1&t&&(e.TgZ(0,"div",8),e.TgZ(1,"label",72),e.SDv(2,73),e.qZA(),e.TgZ(3,"div",11),e.TgZ(4,"div",74),e._UZ(5,"input",75),e.TgZ(6,"label",76),e.SDv(7,77),e.qZA(),e.qZA(),e.qZA(),e.qZA())}function ot(t,i){if(1&t&&(e.TgZ(0,"div"),e.TgZ(1,"div",8),e.TgZ(2,"label",48),e.SDv(3,49),e.qZA(),e.TgZ(4,"div",11),e.TgZ(5,"select",50),e.YNc(6,Qo,2,2,"option",19),e.qZA(),e.qZA(),e.qZA(),e.YNc(7,Bo,11,4,"div",51),e.YNc(8,et,8,5,"div",51),e.YNc(9,_t,8,0,"div",51),e.qZA()),2&t){const _=e.oxw(2);e.xp6(6),e.Q6J("ngForOf",_.pgAutoscaleModes),e.xp6(1),e.Q6J("ngIf","on"!==_.form.getValue("pgAutoscaleMode")),e.xp6(1),e.Q6J("ngIf",_.isReplicated),e.xp6(1),e.Q6J("ngIf",_.info.is_all_bluestore&&_.isErasure)}}function tt(t,i){if(1&t&&e._UZ(0,"i",78),2&t){const _=e.oxw(2);e.Gre("",_.icons.warning," icon-warning-color")}}function it(t,i){1&t&&(e.TgZ(0,"option",17),e.SDv(1,93),e.qZA())}function nt(t,i){1&t&&(e.TgZ(0,"option",94),e.SDv(1,95),e.qZA()),2&t&&e.Q6J("ngValue",null)}function st(t,i){1&t&&(e.TgZ(0,"option",94),e.SDv(1,96),e.qZA()),2&t&&e.Q6J("ngValue",null)}function at(t,i){if(1&t&&(e.TgZ(0,"option",94),e._uU(1),e.qZA()),2&t){const _=i.$implicit;e.Q6J("ngValue",_),e.xp6(1),e.hij(" ",_.name," ")}}const F=function(t){return[t]};function lt(t,i){if(1&t){const _=e.EpF();e.TgZ(0,"button",97),e.NdJ("click",function(){return e.CHM(_),e.oxw(4).addErasureCodeProfile()}),e._UZ(1,"i",89),e.qZA()}if(2&t){const _=e.oxw(4);e.xp6(1),e.Q6J("ngClass",e.VKq(1,F,_.icons.add))}}function rt(t,i){if(1&t){const _=e.EpF();e.TgZ(0,"button",98,99),e.NdJ("click",function(){return e.CHM(_),e.oxw(4).deleteErasureCodeProfile()}),e._UZ(2,"i",89),e.qZA()}if(2&t){const _=e.oxw(4);e.xp6(2),e.Q6J("ngClass",e.VKq(1,F,_.icons.trash))}}const ct=function(){return["name"]};function Ot(t,i){if(1&t&&e._UZ(0,"cd-table-key-value",110),2&t){const _=e.oxw(5);e.Q6J("renderObjects",!0)("hideKeys",e.DdM(4,ct))("data",_.form.getValue("erasureProfile"))("autoReload",!1)}}function dt(t,i){1&t&&(e.TgZ(0,"span"),e.SDv(1,113),e.qZA())}function ut(t,i){if(1&t&&(e.TgZ(0,"li"),e._uU(1),e.qZA()),2&t){const _=i.$implicit;e.xp6(1),e.hij(" ",_," ")}}function ft(t,i){if(1&t&&(e.TgZ(0,"ul"),e.YNc(1,ut,2,1,"li",114),e.qZA()),2&t){const _=e.oxw(6);e.xp6(1),e.Q6J("ngForOf",_.ecpUsage)}}function Pt(t,i){if(1&t&&(e.YNc(0,dt,2,0,"ng-template",null,111,e.W1O),e.YNc(2,ft,2,1,"ul",112)),2&t){const _=e.MAs(1),o=e.oxw(5);e.xp6(2),e.Q6J("ngIf",o.ecpUsage)("ngIfElse",_)}}function Et(t,i){if(1&t&&(e.TgZ(0,"span",100),e.TgZ(1,"ul",101,102),e.TgZ(3,"li",103),e.TgZ(4,"a",104),e.SDv(5,105),e.qZA(),e.YNc(6,Ot,1,5,"ng-template",106),e.qZA(),e.TgZ(7,"li",107),e.TgZ(8,"a",104),e.SDv(9,108),e.qZA(),e.YNc(10,Pt,3,2,"ng-template",106),e.qZA(),e.qZA(),e._UZ(11,"div",109),e.qZA()),2&t){const _=e.MAs(2);e.xp6(11),e.Q6J("ngbNavOutlet",_)}}const ye=function(t){return{active:t}};function gt(t,i){if(1&t){const _=e.EpF();e.TgZ(0,"div",8),e.TgZ(1,"label",80),e.SDv(2,81),e.qZA(),e.TgZ(3,"div",11),e.TgZ(4,"div",82),e.TgZ(5,"select",83),e.YNc(6,it,2,0,"option",84),e.YNc(7,nt,2,1,"option",85),e.YNc(8,st,2,1,"option",85),e.YNc(9,at,2,2,"option",86),e.qZA(),e.TgZ(10,"span",87),e.TgZ(11,"button",88),e.NdJ("click",function(){e.CHM(_);const n=e.oxw(3);return n.data.erasureInfo=!n.data.erasureInfo}),e._UZ(12,"i",89),e.qZA(),e.YNc(13,lt,2,3,"button",90),e.YNc(14,rt,3,3,"button",91),e.qZA(),e.qZA(),e.YNc(15,Et,12,1,"span",92),e.qZA(),e.qZA()}if(2&t){const _=e.oxw(3);e.xp6(6),e.Q6J("ngIf",!_.ecProfiles),e.xp6(1),e.Q6J("ngIf",_.ecProfiles&&0===_.ecProfiles.length),e.xp6(1),e.Q6J("ngIf",_.ecProfiles&&_.ecProfiles.length>0),e.xp6(1),e.Q6J("ngForOf",_.ecProfiles),e.xp6(2),e.Q6J("ngClass",e.VKq(9,ye,_.data.erasureInfo)),e.xp6(1),e.Q6J("ngClass",e.VKq(11,F,_.icons.questionCircle)),e.xp6(1),e.Q6J("ngIf",!_.editing),e.xp6(1),e.Q6J("ngIf",!_.editing),e.xp6(1),e.Q6J("ngIf",_.data.erasureInfo&&_.form.getValue("erasureProfile"))}}function pt(t,i){1&t&&(e.TgZ(0,"div",8),e.TgZ(1,"label",115),e.SDv(2,116),e.qZA(),e.TgZ(3,"div",11),e.TgZ(4,"span",55),e.SDv(5,117),e.qZA(),e.qZA(),e.qZA())}function Rt(t,i){1&t&&(e.TgZ(0,"span",55),e.TgZ(1,"span"),e.SDv(2,120),e.qZA(),e._uU(3,"\xa0 "),e.qZA())}function mt(t,i){if(1&t&&(e.TgZ(0,"option",94),e._uU(1),e.qZA()),2&t){const _=i.$implicit;e.Q6J("ngValue",_),e.xp6(1),e.hij(" ",_.rule_name," ")}}function Ct(t,i){if(1&t){const _=e.EpF();e.TgZ(0,"button",97),e.NdJ("click",function(){return e.CHM(_),e.oxw(5).addCrushRule()}),e._UZ(1,"i",89),e.qZA()}if(2&t){const _=e.oxw(5);e.xp6(1),e.Q6J("ngClass",e.VKq(1,F,_.icons.add))}}function Mt(t,i){if(1&t){const _=e.EpF();e.TgZ(0,"button",126,127),e.NdJ("click",function(){return e.CHM(_),e.oxw(5).deleteCrushRule()}),e._UZ(2,"i",89),e.qZA()}if(2&t){const _=e.oxw(5);e.xp6(2),e.Q6J("ngClass",e.VKq(1,F,_.icons.trash))}}const ht=function(){return["steps","type","rule_name"]};function Tt(t,i){if(1&t&&e._UZ(0,"cd-table-key-value",110),2&t){const _=e.oxw(6);e.Q6J("renderObjects",!1)("hideKeys",e.DdM(4,ht))("data",_.form.getValue("crushRule"))("autoReload",!1)}}function St(t,i){if(1&t&&(e.TgZ(0,"li"),e._uU(1),e.qZA()),2&t){const _=i.$implicit,o=e.oxw(7);e.xp6(1),e.hij(" ",o.describeCrushStep(_)," ")}}function Lt(t,i){if(1&t&&(e.TgZ(0,"ol"),e.YNc(1,St,2,1,"li",114),e.qZA()),2&t){const _=e.oxw(6);e.xp6(1),e.Q6J("ngForOf",_.form.get("crushRule").value.steps)}}function At(t,i){1&t&&(e.TgZ(0,"span"),e.SDv(1,136),e.qZA())}function Ft(t,i){if(1&t&&(e.TgZ(0,"li"),e._uU(1),e.qZA()),2&t){const _=i.$implicit;e.xp6(1),e.hij(" ",_," ")}}function Nt(t,i){if(1&t&&(e.TgZ(0,"ul"),e.YNc(1,Ft,2,1,"li",114),e.qZA()),2&t){const _=e.oxw(7);e.xp6(1),e.Q6J("ngForOf",_.crushUsage)}}function bt(t,i){if(1&t&&(e.YNc(0,At,2,0,"ng-template",null,135,e.W1O),e.YNc(2,Nt,2,1,"ul",112)),2&t){const _=e.MAs(1),o=e.oxw(6);e.xp6(2),e.Q6J("ngIf",o.crushUsage)("ngIfElse",_)}}function vt(t,i){if(1&t&&(e.TgZ(0,"div",128),e.TgZ(1,"ul",101,129),e.TgZ(3,"li",130),e.TgZ(4,"a",104),e.SDv(5,131),e.qZA(),e.YNc(6,Tt,1,5,"ng-template",106),e.qZA(),e.TgZ(7,"li",132),e.TgZ(8,"a",104),e.SDv(9,133),e.qZA(),e.YNc(10,Lt,2,1,"ng-template",106),e.qZA(),e.TgZ(11,"li",107),e.TgZ(12,"a",104),e.SDv(13,134),e.qZA(),e.YNc(14,bt,3,2,"ng-template",106),e.qZA(),e.qZA(),e._UZ(15,"div",109),e.qZA()),2&t){const _=e.MAs(2);e.xp6(15),e.Q6J("ngbNavOutlet",_)}}function It(t,i){1&t&&(e.TgZ(0,"span",41),e.SDv(1,137),e.qZA())}function $t(t,i){1&t&&(e.TgZ(0,"span",41),e.SDv(1,138),e.qZA())}function Dt(t,i){if(1&t){const _=e.EpF();e.TgZ(0,"div"),e.TgZ(1,"div",82),e.TgZ(2,"select",121),e.TgZ(3,"option",94),e.SDv(4,122),e.qZA(),e.YNc(5,mt,2,2,"option",86),e.qZA(),e.TgZ(6,"span",87),e.TgZ(7,"button",123),e.NdJ("click",function(){e.CHM(_);const n=e.oxw(4);return n.data.crushInfo=!n.data.crushInfo}),e._UZ(8,"i",89),e.qZA(),e.YNc(9,Ct,2,3,"button",90),e.YNc(10,Mt,3,3,"button",124),e.qZA(),e.qZA(),e.YNc(11,vt,16,1,"div",125),e.YNc(12,It,2,0,"span",13),e.YNc(13,$t,2,0,"span",13),e.qZA()}if(2&t){e.oxw(3);const _=e.MAs(2),o=e.oxw();e.xp6(3),e.Q6J("ngValue",null),e.xp6(2),e.Q6J("ngForOf",o.current.rules),e.xp6(2),e.Q6J("ngClass",e.VKq(9,ye,o.data.crushInfo)),e.xp6(1),e.Q6J("ngClass",e.VKq(11,F,o.icons.questionCircle)),e.xp6(1),e.Q6J("ngIf",o.isReplicated&&!o.editing),e.xp6(1),e.Q6J("ngIf",o.isReplicated&&!o.editing),e.xp6(1),e.Q6J("ngIf",o.data.crushInfo&&o.form.getValue("crushRule")),e.xp6(1),e.Q6J("ngIf",o.form.showError("crushRule",_,"required")),e.xp6(1),e.Q6J("ngIf",o.form.showError("crushRule",_,"tooFewOsds"))}}function Zt(t,i){if(1&t&&(e.TgZ(0,"div",8),e.TgZ(1,"label",115),e.SDv(2,118),e.qZA(),e.TgZ(3,"div",11),e.YNc(4,Rt,4,0,"ng-template",null,119,e.W1O),e.YNc(6,Dt,14,13,"div",112),e.qZA(),e.qZA()),2&t){const _=e.MAs(5),o=e.oxw(3);e.xp6(6),e.Q6J("ngIf",o.current.rules.length>0)("ngIfElse",_)}}function xt(t,i){if(1&t&&(e.TgZ(0,"div"),e.TgZ(1,"legend"),e.SDv(2,79),e.qZA(),e.YNc(3,gt,16,13,"div",51),e.YNc(4,pt,6,0,"div",51),e.YNc(5,Zt,7,2,"div",51),e.qZA()),2&t){const _=e.oxw(2);e.xp6(3),e.Q6J("ngIf",_.isErasure),e.xp6(1),e.Q6J("ngIf",_.isErasure&&!_.editing),e.xp6(1),e.Q6J("ngIf",_.isReplicated||_.editing)}}function yt(t,i){if(1&t&&(e.TgZ(0,"option",46),e._uU(1),e.qZA()),2&t){const _=i.$implicit;e.Q6J("value",_),e.xp6(1),e.hij(" ",_," ")}}function Ut(t,i){1&t&&(e.TgZ(0,"option",17),e.SDv(1,156),e.qZA())}function qt(t,i){1&t&&(e.TgZ(0,"option",17),e.SDv(1,157),e.qZA())}function Ht(t,i){if(1&t&&(e.TgZ(0,"option",46),e._uU(1),e.qZA()),2&t){const _=i.$implicit;e.Q6J("value",_),e.xp6(1),e.hij(" ",_," ")}}function Gt(t,i){1&t&&(e.TgZ(0,"span",41),e.SDv(1,158),e.qZA())}function zt(t,i){1&t&&(e.TgZ(0,"span",41),e.SDv(1,159),e.qZA())}function Xt(t,i){1&t&&(e.TgZ(0,"span",41),e.SDv(1,160),e.qZA())}function wt(t,i){1&t&&(e.TgZ(0,"span",41),e.SDv(1,161),e.qZA())}function Qt(t,i){1&t&&(e.TgZ(0,"span",41),e.SDv(1,162),e.qZA())}function Jt(t,i){if(1&t&&(e.TgZ(0,"div"),e.TgZ(1,"div",8),e.TgZ(2,"label",144),e.SDv(3,145),e.qZA(),e.TgZ(4,"div",11),e.TgZ(5,"select",146),e.YNc(6,Ut,2,0,"option",84),e.YNc(7,qt,2,0,"option",84),e.YNc(8,Ht,2,2,"option",19),e.qZA(),e.qZA(),e.qZA(),e.TgZ(9,"div",8),e.TgZ(10,"label",147),e.SDv(11,148),e.qZA(),e.TgZ(12,"div",11),e._UZ(13,"input",149),e.YNc(14,Gt,2,0,"span",13),e.YNc(15,zt,2,0,"span",13),e.qZA(),e.qZA(),e.TgZ(16,"div",8),e.TgZ(17,"label",150),e.SDv(18,151),e.qZA(),e.TgZ(19,"div",11),e._UZ(20,"input",152),e.YNc(21,Xt,2,0,"span",13),e.YNc(22,wt,2,0,"span",13),e.qZA(),e.qZA(),e.TgZ(23,"div",8),e.TgZ(24,"label",153),e.SDv(25,154),e.qZA(),e.TgZ(26,"div",11),e._UZ(27,"input",155),e.YNc(28,Qt,2,0,"span",13),e.qZA(),e.qZA(),e.qZA()),2&t){e.oxw(2);const _=e.MAs(2),o=e.oxw();e.xp6(6),e.Q6J("ngIf",!o.info.compression_algorithms),e.xp6(1),e.Q6J("ngIf",o.info.compression_algorithms&&0===o.info.compression_algorithms.length),e.xp6(1),e.Q6J("ngForOf",o.info.compression_algorithms),e.xp6(6),e.Q6J("ngIf",o.form.showError("minBlobSize",_,"min")),e.xp6(1),e.Q6J("ngIf",o.form.showError("minBlobSize",_,"maximum")),e.xp6(6),e.Q6J("ngIf",o.form.showError("maxBlobSize",_,"min")),e.xp6(1),e.Q6J("ngIf",o.form.showError("maxBlobSize",_,"minimum")),e.xp6(6),e.Q6J("ngIf",o.form.showError("ratio",_,"min")||o.form.showError("ratio",_,"max"))}}function kt(t,i){if(1&t&&(e.TgZ(0,"div",139),e.TgZ(1,"legend"),e.SDv(2,140),e.qZA(),e.TgZ(3,"div",8),e.TgZ(4,"label",141),e.SDv(5,142),e.qZA(),e.TgZ(6,"div",11),e.TgZ(7,"select",143),e.YNc(8,yt,2,2,"option",19),e.qZA(),e.qZA(),e.qZA(),e.YNc(9,Jt,29,8,"div",20),e.qZA()),2&t){const _=e.oxw(2);e.xp6(8),e.Q6J("ngForOf",_.info.compression_modes),e.xp6(1),e.Q6J("ngIf",_.hasCompressionEnabled())}}function Vt(t,i){1&t&&(e.TgZ(0,"span",41),e.SDv(1,163),e.qZA())}function Yt(t,i){if(1&t){const _=e.EpF();e.TgZ(0,"div",1),e.TgZ(1,"form",2,3),e.TgZ(3,"div",4),e.TgZ(4,"div",5),e.SDv(5,6),e.ALo(6,"titlecase"),e.ALo(7,"upperFirst"),e.qZA(),e.TgZ(8,"div",7),e.TgZ(9,"div",8),e.TgZ(10,"label",9),e.SDv(11,10),e.qZA(),e.TgZ(12,"div",11),e._UZ(13,"input",12),e.YNc(14,qo,2,0,"span",13),e.YNc(15,Ho,2,0,"span",13),e.YNc(16,Go,2,0,"span",13),e.YNc(17,zo,2,0,"span",13),e.qZA(),e.qZA(),e.TgZ(18,"div",8),e.TgZ(19,"label",14),e.SDv(20,15),e.qZA(),e.TgZ(21,"div",11),e.TgZ(22,"select",16),e.TgZ(23,"option",17),e.SDv(24,18),e.qZA(),e.YNc(25,Xo,2,2,"option",19),e.qZA(),e.YNc(26,wo,2,0,"span",13),e.qZA(),e.qZA(),e.YNc(27,ot,10,4,"div",20),e.TgZ(28,"div",8),e.TgZ(29,"label",21),e.SDv(30,22),e.qZA(),e.TgZ(31,"div",11),e.TgZ(32,"cd-select-badges",23),e.NdJ("selection",function(){return e.CHM(_),e.oxw().appSelection()}),e.qZA(),e.YNc(33,tt,1,3,"i",24),e.qZA(),e.qZA(),e.YNc(34,xt,6,3,"div",20),e.YNc(35,kt,10,2,"div",25),e.TgZ(36,"div"),e.TgZ(37,"legend"),e.SDv(38,26),e.qZA(),e.TgZ(39,"div",8),e.TgZ(40,"label",27),e.ynx(41),e.SDv(42,28),e.BQk(),e.TgZ(43,"cd-helper"),e.TgZ(44,"span"),e.SDv(45,29),e.qZA(),e._UZ(46,"br"),e.TgZ(47,"span"),e.SDv(48,30),e.qZA(),e.qZA(),e.qZA(),e.TgZ(49,"div",11),e._UZ(50,"input",31),e.qZA(),e.qZA(),e.TgZ(51,"div",8),e.TgZ(52,"label",32),e.ynx(53),e.SDv(54,33),e.BQk(),e.TgZ(55,"cd-helper"),e.TgZ(56,"span"),e.SDv(57,34),e.qZA(),e._UZ(58,"br"),e.TgZ(59,"span"),e.SDv(60,35),e.qZA(),e.qZA(),e.qZA(),e.TgZ(61,"div",11),e._UZ(62,"input",36),e.YNc(63,Vt,2,0,"span",13),e.qZA(),e.qZA(),e.qZA(),e.TgZ(64,"div",37),e.TgZ(65,"cd-rbd-configuration-form",38),e.NdJ("changes",function(n){return e.CHM(_),e.oxw().currentConfigurationValues=n()}),e.qZA(),e.qZA(),e.qZA(),e.TgZ(66,"div",39),e.TgZ(67,"cd-form-button-panel",40),e.NdJ("submitActionEvent",function(){return e.CHM(_),e.oxw().submit()}),e.ALo(68,"titlecase"),e.ALo(69,"upperFirst"),e.qZA(),e.qZA(),e.qZA(),e.qZA(),e.qZA()}if(2&t){const _=e.MAs(2),o=e.oxw();e.xp6(1),e.Q6J("formGroup",o.form),e.xp6(6),e.pQV(e.lcZ(6,25,o.action))(e.lcZ(7,27,o.resource)),e.QtT(5),e.xp6(7),e.Q6J("ngIf",o.form.showError("name",_,"required")),e.xp6(1),e.Q6J("ngIf",o.form.showError("name",_,"uniqueName")),e.xp6(1),e.Q6J("ngIf",o.form.showError("name",_,"rbdPool")),e.xp6(1),e.Q6J("ngIf",o.form.showError("name",_,"pattern")),e.xp6(8),e.Q6J("ngForOf",o.data.poolTypes),e.xp6(1),e.Q6J("ngIf",o.form.showError("poolType",_,"required")),e.xp6(1),e.Q6J("ngIf",o.isReplicated||o.isErasure),e.xp6(5),e.Q6J("customBadges",!0)("customBadgeValidators",o.data.applications.validators)("messages",o.data.applications.messages)("data",o.data.applications.selected)("options",o.data.applications.available)("selectionLimit",4),e.xp6(1),e.Q6J("ngIf",o.data.applications.selected<=0),e.xp6(1),e.Q6J("ngIf",o.isErasure||o.isReplicated),e.xp6(1),e.Q6J("ngIf",o.info.is_all_bluestore),e.xp6(28),e.Q6J("ngIf",o.form.showError("max_objects",_,"min")),e.xp6(1),e.Q6J("hidden",o.isErasure||-1===o.data.applications.selected.indexOf("rbd")),e.xp6(1),e.Q6J("form",o.form)("initializeData",o.initializeConfigData),e.xp6(2),e.Q6J("form",o.form)("submitText",e.lcZ(68,29,o.action)+" "+e.lcZ(69,31,o.resource))}}let Ue=(()=>{class t extends R_.E{constructor(_,o,n,s,c,d,P,p,R,h,T){super(),this.dimlessBinaryPipe=_,this.route=o,this.router=n,this.modalService=s,this.poolService=c,this.authStorageService=d,this.formatter=P,this.taskWrapper=p,this.ecpService=R,this.crushRuleService=h,this.actionLabels=T,this.editing=!1,this.isReplicated=!1,this.isErasure=!1,this.data=new No,this.externalPgChange=!1,this.current={rules:[]},this.initializeConfigData=new E_.t(1),this.currentConfigurationValues={},this.icons=b.P,this.crushUsage=void 0,this.ecpUsage=void 0,this.crushRuleMaxSize=10,this.editing=this.router.url.startsWith(`/pool/${M.MQ.EDIT}`),this.action=this.editing?this.actionLabels.EDIT:this.actionLabels.CREATE,this.resource="pool",this.authenticate(),this.createForm()}authenticate(){if(this.permission=this.authStorageService.getPermissions().pool,!this.permission.read||!this.permission.update&&this.editing||!this.permission.create&&!this.editing)throw new g_._2}createForm(){const _=new be.d({mode:new a.NI("none"),algorithm:new a.NI(""),minBlobSize:new a.NI("",{updateOn:"blur"}),maxBlobSize:new a.NI("",{updateOn:"blur"}),ratio:new a.NI("",{updateOn:"blur"})});this.form=new be.d({name:new a.NI("",{validators:[a.kI.pattern(/^[.A-Za-z0-9_/-]+$/),a.kI.required,E.h.custom("rbdPool",()=>this.form&&this.form.getValue("name").includes("/")&&this.data&&-1!==this.data.applications.selected.indexOf("rbd"))]}),poolType:new a.NI("",{validators:[a.kI.required]}),crushRule:new a.NI(null,{validators:[E.h.custom("tooFewOsds",o=>this.info&&o&&this.info.osd_count<1),E.h.custom("required",o=>this.isReplicated&&this.info.crush_rules_replicated.length>0&&!o)]}),size:new a.NI("",{updateOn:"blur"}),erasureProfile:new a.NI(null),pgNum:new a.NI("",{validators:[a.kI.required]}),pgAutoscaleMode:new a.NI(null),ecOverwrites:new a.NI(!1),compression:_,max_bytes:new a.NI(""),max_objects:new a.NI(0)},[E.h.custom("form",()=>null)])}ngOnInit(){this.poolService.getInfo().subscribe(_=>{this.initInfo(_),this.editing?this.initEditMode():(this.setAvailableApps(),this.loadingReady()),this.listenToChanges(),this.setComplexValidators()})}initInfo(_){this.pgAutoscaleModes=_.pg_autoscale_modes,this.form.silentSet("pgAutoscaleMode",_.pg_autoscale_default_mode),this.form.silentSet("algorithm",_.bluestore_compression_algorithm),this.info=_,this.initEcp(_.erasure_code_profiles)}initEcp(_){this.setListControlStatus("erasureProfile",_),this.ecProfiles=_}setListControlStatus(_,o){const n=this.form.get(_),s=n.value;1!==o.length||s&&u().isEqual(s,o[0])?0===o.length&&s&&n.setValue(null):n.setValue(o[0]),o.length<=1?n.enabled&&n.disable():n.disabled&&n.enable()}initEditMode(){this.disableForEdit(),this.routeParamsSubscribe=this.route.params.subscribe(_=>this.poolService.get(_.name).subscribe(o=>{this.data.pool=o,this.initEditFormData(o),this.loadingReady()}))}disableForEdit(){["poolType","crushRule","size","erasureProfile","ecOverwrites"].forEach(_=>this.form.get(_).disable())}initEditFormData(_){this.initializeConfigData.next({initialData:_.configuration,sourceType:m_.h.pool}),this.poolTypeChange(_.type);const o=this.info.crush_rules_replicated.concat(this.info.crush_rules_erasure),n={name:_.pool_name,poolType:_.type,crushRule:o.find(s=>s.rule_name===_.crush_rule),size:_.size,erasureProfile:this.ecProfiles.find(s=>s.name===_.erasure_code_profile),pgAutoscaleMode:_.pg_autoscale_mode,pgNum:_.pg_num,ecOverwrites:_.flags_names.includes("ec_overwrites"),mode:_.options.compression_mode,algorithm:_.options.compression_algorithm,minBlobSize:this.dimlessBinaryPipe.transform(_.options.compression_min_blob_size),maxBlobSize:this.dimlessBinaryPipe.transform(_.options.compression_max_blob_size),ratio:_.options.compression_required_ratio,max_bytes:this.dimlessBinaryPipe.transform(_.quota_max_bytes),max_objects:_.quota_max_objects};Object.keys(n).forEach(s=>{const c=n[s];!u().isUndefined(c)&&""!==c&&this.form.silentSet(s,c)}),this.data.pgs=this.form.getValue("pgNum"),this.setAvailableApps(this.data.applications.default.concat(_.application_metadata)),this.data.applications.selected=_.application_metadata}setAvailableApps(_=this.data.applications.default){this.data.applications.available=u().uniq(_.sort()).map(o=>new p_.$(!1,o,""))}listenToChanges(){this.listenToChangesDuringAddEdit(),this.editing||this.listenToChangesDuringAdd()}listenToChangesDuringAddEdit(){this.form.get("pgNum").valueChanges.subscribe(_=>{const o=_-this.data.pgs;1===Math.abs(o)&&2!==_?this.doPgPowerJump(o):this.data.pgs=_})}doPgPowerJump(_){const o=this.calculatePgPower()+_;this.setPgs(-1===_?Math.round(o):Math.floor(o))}calculatePgPower(_=this.form.getValue("pgNum")){return Math.log(_)/Math.log(2)}setPgs(_){const o=Math.pow(2,_<0?0:_);this.data.pgs=o,this.form.silentSet("pgNum",o)}listenToChangesDuringAdd(){this.form.get("poolType").valueChanges.subscribe(_=>{this.poolTypeChange(_)}),this.form.get("crushRule").valueChanges.subscribe(_=>{this.crushDeletionBtn&&this.crushDeletionBtn.isOpen()&&this.crushDeletionBtn.close(),_&&(this.setCorrectMaxSize(_),this.crushRuleIsUsedBy(_.rule_name),this.replicatedRuleChange(),this.pgCalc())}),this.form.get("size").valueChanges.subscribe(()=>{this.pgCalc()}),this.form.get("erasureProfile").valueChanges.subscribe(_=>{this.ecpDeletionBtn&&this.ecpDeletionBtn.isOpen()&&this.ecpDeletionBtn.close(),_&&(this.ecpIsUsedBy(_.name),this.pgCalc())}),this.form.get("mode").valueChanges.subscribe(()=>{["minBlobSize","maxBlobSize","ratio"].forEach(_=>{this.form.get(_).updateValueAndValidity({emitEvent:!1})})}),this.form.get("minBlobSize").valueChanges.subscribe(()=>{this.form.get("maxBlobSize").updateValueAndValidity({emitEvent:!1})}),this.form.get("maxBlobSize").valueChanges.subscribe(()=>{this.form.get("minBlobSize").updateValueAndValidity({emitEvent:!1})})}poolTypeChange(_){if("replicated"===_?this.setTypeBooleans(!0,!1):this.setTypeBooleans(!1,"erasure"===_),!_||!this.info)return void(this.current.rules=[]);const o=this.info["crush_rules_"+_]||[];this.current.rules=o,!this.editing&&(this.isReplicated&&this.setListControlStatus("crushRule",o),this.replicatedRuleChange(),this.pgCalc())}setTypeBooleans(_,o){this.isReplicated=_,this.isErasure=o}replicatedRuleChange(){if(!this.isReplicated)return;const _=this.form.get("size");let o=this.form.getValue("size")||3;const n=this.getMinSize(),s=this.getMaxSize();o<n?o=n:o>s&&(o=s),o!==_.value&&this.form.silentSet("size",o)}getMinSize(){return!this.info||this.info.osd_count<1?0:1}getMaxSize(){const _=this.form.getValue("crushRule");return this.info?_?_.usable_size:Math.min(this.info.osd_count,3):0}pgCalc(){const _=this.form.getValue("poolType");if(!this.info||this.form.get("pgNum").dirty||!_)return;const o=100*this.info.osd_count,n=this.isReplicated?this.replicatedPgCalc(o):this.erasurePgCalc(o);if(!n)return;const s=this.data.pgs;this.alignPgs(n),this.externalPgChange||(this.externalPgChange=s!==this.data.pgs)}setCorrectMaxSize(_=this.form.getValue("crushRule")){if(!_)return;const n=S.searchFailureDomains(this.info.nodes,_.steps[0].item_name)[_.steps[1].type];_.usable_size=Math.min(n?n.length:this.crushRuleMaxSize,this.crushRuleMaxSize)}replicatedPgCalc(_){const o=this.form.get("size"),n=o.value;return o.valid&&n>0?_/n:0}erasurePgCalc(_){const o=this.form.get("erasureProfile"),n=o.value;return(o.valid||o.disabled)&&n?_/(n.k+n.m):0}alignPgs(_=this.form.getValue("pgNum")){this.setPgs(Math.round(this.calculatePgPower(_<1?1:_)))}setComplexValidators(){this.editing?this.form.get("name").setValidators([this.form.get("name").validator,E.h.custom("uniqueName",_=>this.data.pool&&this.info&&-1!==this.info.pool_names.indexOf(_)&&this.info.pool_names.indexOf(_)!==this.info.pool_names.indexOf(this.data.pool.pool_name))]):(E.h.validateIf(this.form.get("size"),()=>this.isReplicated,[E.h.custom("min",_=>this.form.getValue("size")&&_<this.getMinSize()),E.h.custom("max",_=>this.form.getValue("size")&&this.getMaxSize()<_)]),this.form.get("name").setValidators([this.form.get("name").validator,E.h.custom("uniqueName",_=>this.info&&-1!==this.info.pool_names.indexOf(_))])),this.setCompressionValidators()}setCompressionValidators(){E.h.validateIf(this.form.get("minBlobSize"),()=>this.hasCompressionEnabled(),[a.kI.min(0),E.h.custom("maximum",_=>this.oddBlobSize(_,this.form.getValue("maxBlobSize")))]),E.h.validateIf(this.form.get("maxBlobSize"),()=>this.hasCompressionEnabled(),[a.kI.min(0),E.h.custom("minimum",_=>this.oddBlobSize(this.form.getValue("minBlobSize"),_))]),E.h.validateIf(this.form.get("ratio"),()=>this.hasCompressionEnabled(),[a.kI.min(0),a.kI.max(1)])}oddBlobSize(_,o){const n=this.formatter.toBytes(_),s=this.formatter.toBytes(o);return Boolean(n&&s&&n>=s)}hasCompressionEnabled(){return this.form.getValue("mode")&&"none"!==this.form.get("mode").value.toLowerCase()}describeCrushStep(_){return[_.op.replace("_"," "),_.item_name||"",_.type?_.num+" type "+_.type:""].join(" ")}addErasureCodeProfile(){this.addModal(Ao,_=>this.reloadECPs(_))}addModal(_,o){this.hideOpenTooltips(),this.modalService.show(_).componentInstance.submitAction.subscribe(s=>{o(s.name)})}hideOpenTooltips(){const _=o=>o&&o.isOpen()&&o.close();_(this.ecpDeletionBtn),_(this.crushDeletionBtn)}reloadECPs(_){this.reloadList({newItemName:_,getInfo:()=>this.ecpService.list(),initInfo:o=>this.initEcp(o),findNewItem:()=>this.ecProfiles.find(o=>o.name===_),controlName:"erasureProfile"})}reloadList({newItemName:_,getInfo:o,initInfo:n,findNewItem:s,controlName:c}){this.modalSubscription&&this.modalSubscription.unsubscribe(),o().subscribe(d=>{if(n(d),!_)return;const P=s();P&&this.form.get(c).setValue(P)})}deleteErasureCodeProfile(){this.deletionModal({value:this.form.getValue("erasureProfile"),usage:this.ecpUsage,deletionBtn:this.ecpDeletionBtn,dataName:"erasureInfo",getTabs:()=>this.ecpInfoTabs,tabPosition:"used-by-pools",nameAttribute:"name",itemDescription:"erasure code profile",reloadFn:()=>this.reloadECPs(),deleteFn:_=>this.ecpService.delete(_),taskName:"ecp/delete"})}deletionModal({value:_,usage:o,deletionBtn:n,dataName:s,getTabs:c,tabPosition:d,nameAttribute:P,itemDescription:p,reloadFn:R,deleteFn:h,taskName:T}){if(!_)return;if(o)return n.animation=!1,n.toggle(),this.data[s]=!0,void setTimeout(()=>{const f=c();f&&f.select(d)},50);const m=_[P];this.modalService.show(Ne.M,{itemDescription:p,itemNames:[m],submitActionObservable:()=>{const f=h(m);return f.subscribe(()=>R()),this.taskWrapper.wrapTaskAroundCall({task:new v.R(T,{name:m}),call:f})}})}addCrushRule(){this.addModal($_,_=>this.reloadCrushRules(_))}reloadCrushRules(_){this.reloadList({newItemName:_,getInfo:()=>this.poolService.getInfo(),initInfo:o=>{this.initInfo(o),this.poolTypeChange("replicated")},findNewItem:()=>this.info.crush_rules_replicated.find(o=>o.rule_name===_),controlName:"crushRule"})}deleteCrushRule(){this.deletionModal({value:this.form.getValue("crushRule"),usage:this.crushUsage,deletionBtn:this.crushDeletionBtn,dataName:"crushInfo",getTabs:()=>this.crushInfoTabs,tabPosition:"used-by-pools",nameAttribute:"rule_name",itemDescription:"crush rule",reloadFn:()=>this.reloadCrushRules(),deleteFn:_=>this.crushRuleService.delete(_),taskName:"crushRule/delete"})}crushRuleIsUsedBy(_){this.crushUsage=_?this.info.used_rules[_]:void 0}ecpIsUsedBy(_){this.ecpUsage=_?this.info.used_profiles[_]:void 0}submit(){if(this.form.invalid)return void this.form.setErrors({cdSubmitButton:!0});const _={pool:this.form.getValue("name")};this.assignFormFields(_,[{externalFieldName:"pool_type",formControlName:"poolType"},{externalFieldName:"pg_autoscale_mode",formControlName:"pgAutoscaleMode",editable:!0},{externalFieldName:"pg_num",formControlName:"pgNum",replaceFn:n=>"on"===this.form.getValue("pgAutoscaleMode")?1:n,editable:!0},this.isReplicated?{externalFieldName:"size",formControlName:"size"}:{externalFieldName:"erasure_code_profile",formControlName:"erasureProfile",attr:"name"},{externalFieldName:"rule_name",formControlName:"crushRule",replaceFn:n=>this.isReplicated?n&&n.rule_name:void 0},{externalFieldName:"quota_max_bytes",formControlName:"max_bytes",replaceFn:this.formatter.toBytes,editable:!0,resetValue:this.editing?0:void 0},{externalFieldName:"quota_max_objects",formControlName:"max_objects",editable:!0,resetValue:this.editing?0:void 0}]),this.info.is_all_bluestore&&(this.assignFormField(_,{externalFieldName:"flags",formControlName:"ecOverwrites",replaceFn:()=>this.isErasure?["ec_overwrites"]:void 0}),"none"!==this.form.getValue("mode")?this.assignFormFields(_,[{externalFieldName:"compression_mode",formControlName:"mode",editable:!0,replaceFn:n=>this.hasCompressionEnabled()&&n},{externalFieldName:"compression_algorithm",formControlName:"algorithm",editable:!0},{externalFieldName:"compression_min_blob_size",formControlName:"minBlobSize",replaceFn:this.formatter.toBytes,editable:!0,resetValue:0},{externalFieldName:"compression_max_blob_size",formControlName:"maxBlobSize",replaceFn:this.formatter.toBytes,editable:!0,resetValue:0},{externalFieldName:"compression_required_ratio",formControlName:"ratio",editable:!0,resetValue:0}]):this.editing&&this.assignFormFields(_,[{externalFieldName:"compression_mode",formControlName:"mode",editable:!0,replaceFn:()=>"unset"},{externalFieldName:"srcpool",formControlName:"name",editable:!0,replaceFn:()=>this.data.pool.pool_name}]));const o=this.data.applications.selected;(o.length>0||this.editing)&&(_.application_metadata=o),this.isReplicated&&!u().isEmpty(this.currentConfigurationValues)&&(_.configuration=this.currentConfigurationValues),this.triggerApiTask(_)}assignFormFields(_,o){o.forEach(n=>this.assignFormField(_,n))}assignFormField(_,{externalFieldName:o,formControlName:n,attr:s,replaceFn:c,editable:d,resetValue:P}){if(this.editing&&(!d||this.form.get(n).pristine))return;const p=this.form.getValue(n);let R=c?c(p):s?u().get(p,s):p;if(!p||!R){if(!d||u().isUndefined(P))return;R=P}_[o]=R}triggerApiTask(_){this.taskWrapper.wrapTaskAroundCall({task:new v.R("pool/"+(this.editing?M.MQ.EDIT:M.MQ.CREATE),{pool_name:_.hasOwnProperty("srcpool")?_.srcpool:_.pool}),call:this.poolService[this.editing?M.MQ.UPDATE:M.MQ.CREATE](_)}).subscribe({error:o=>{u().isObject(o.error)&&"34"===o.error.code&&this.form.get("pgNum").setErrors({34:!0}),this.form.setErrors({cdSubmitButton:!0})},complete:()=>this.router.navigate(["/pool"])})}appSelection(){this.form.get("name").updateValueAndValidity({emitEvent:!1,onlySelf:!0})}}return t.\u0275fac=function(_){return new(_||t)(e.Y36(C_.$),e.Y36(Oe.gz),e.Y36(Oe.F0),e.Y36(Ze.Z),e.Y36(ue.q),e.Y36(he.j),e.Y36(M_.H),e.Y36(de.P),e.Y36(Me),e.Y36(Ie.H),e.Y36(M.p4))},t.\u0275cmp=e.Xpm({type:t,selectors:[["cd-pool-form"]],viewQuery:function(_,o){if(1&_&&(e.Gf(Zo,5),e.Gf(xo,5),e.Gf(yo,5),e.Gf(Uo,5)),2&_){let n;e.iGM(n=e.CRH())&&(o.crushInfoTabs=n.first),e.iGM(n=e.CRH())&&(o.crushDeletionBtn=n.first),e.iGM(n=e.CRH())&&(o.ecpInfoTabs=n.first),e.iGM(n=e.CRH())&&(o.ecpDeletionBtn=n.first)}},features:[e.qOj],decls:1,vars:1,consts:function(){let i,_,o,n,s,c,d,P,p,R,h,T,m,f,A,I,$,D,Z,x,y,U,q,H,G,z,X,w,Q,J,k,V,Y,B,j,K,N,W,ee,_e,oe,te,ie,ne,se,ae,le,re,ce,O,Xe,we,Qe,Je,ke,Ve,Ye,Be,je,Ke,We,e_,__,o_,t_,i_,n_,s_,a_,l_,r_,c_,O_;return i="" + "\ufffd0\ufffd" + " " + "\ufffd1\ufffd" + "",_="Name",o="Name...",n="Pool type",s="-- Select a pool type --",c="Applications",d="Pools should be associated with an application tag",P="Quotas",p="Max bytes",R="Leave it blank or specify 0 to disable this quota.",h="A valid quota should be greater than 0.",T="e.g., 10GiB",m="Max objects",f="Leave it blank or specify 0 to disable this quota.",A="A valid quota should be greater than 0.",I="This field is required!",$="The chosen Ceph pool name is already in use.",D="It's not possible to create an RBD pool with '/' in the name. Please change the name or remove 'rbd' from the applications list.",Z="Pool name can only contain letters, numbers, '.', '-', '_' or '/'.",x="This field is required!",y="PG Autoscale",U="Placement groups",q="Calculation help",H="This field is required!",G="At least one placement group is needed!",z="Your cluster can't handle this many PGs. Please recalculate the PG amount needed.",X="The current PGs settings were calculated for you, you should make sure the values suit your needs before submit.",w="Replicated size",Q="Minimum: " + "\ufffd0\ufffd" + "",J="Maximum: " + "\ufffd0\ufffd" + "",k="The size specified is out of range. A value from " + "\ufffd0\ufffd" + " to " + "\ufffd1\ufffd" + " is usable.",V="A size of 1 will not create a replication of the object. The 'Replicated size' includes the object itself.",Y="Flags",B="EC Overwrites",j="CRUSH",K="Erasure code profile",N="This profile can't be deleted as it is in use.",W="Loading...",ee="-- No erasure code profile available --",_e="-- Select an erasure code profile --",oe="Profile",te="Used by pools",ie="Profile is not in use.",ne="Crush ruleset",se="A new crush ruleset will be implicitly created.",ae="Crush ruleset",le="There are no rules.",re="-- Select a crush rule --",ce="Placement and\n                            replication strategies or distribution policies that allow to\n                            specify how CRUSH places data replicas.",O="This rule can't be deleted as it is in use.",Xe="Crush rule",we="Crush steps",Qe="Used by pools",Je="Rule is not in use.",ke="This field is required!",Ve="The rule can't be used in the current cluster as it has too few OSDs to meet the minimum required OSD by this rule.",Ye="Compression",Be="Mode",je="Algorithm",Ke="Minimum blob size",We="e.g., 128KiB",e_="Maximum blob size",__="e.g., 512KiB",o_="Ratio",t_="Compression ratio",i_="Loading...",n_="-- No erasure compression algorithm available --",s_="Value should be greater than 0",a_="Value should be less than the maximum blob size",l_="Value should be greater than 0",r_="Value should be greater than the minimum blob size",c_="Value should be between 0.0 and 1.0",O_="The value should be greater or equal to 0",[["class","cd-col-form",4,"cdFormLoading"],[1,"cd-col-form"],["name","form","novalidate","",3,"formGroup"],["formDir","ngForm"],[1,"card"],[1,"card-header"],i,[1,"card-body"],[1,"form-group","row"],["for","name",1,"cd-col-form-label","required"],_,[1,"cd-col-form-input"],["id","name","name","name","type","text","placeholder",o,"formControlName","name","autofocus","",1,"form-control"],["class","invalid-feedback",4,"ngIf"],["for","poolType",1,"cd-col-form-label","required"],n,["id","poolType","formControlName","poolType","name","poolType",1,"form-control"],["ngValue",""],s,[3,"value",4,"ngFor","ngForOf"],[4,"ngIf"],["for","applications",1,"cd-col-form-label"],c,["id","applications",3,"customBadges","customBadgeValidators","messages","data","options","selectionLimit","selection"],["title",d,3,"class",4,"ngIf"],["formGroupName","compression",4,"ngIf"],P,["for","max_bytes",1,"cd-col-form-label"],p,R,h,["id","max_bytes","name","max_bytes","type","text","formControlName","max_bytes","placeholder",T,"defaultUnit","GiB","cdDimlessBinary","",1,"form-control"],["for","max_objects",1,"cd-col-form-label"],m,f,A,["id","max_objects","min","0","name","max_objects","type","number","formControlName","max_objects",1,"form-control"],[3,"hidden"],[3,"form","initializeData","changes"],[1,"card-footer"],["wrappingClass","text-right",3,"form","submitText","submitActionEvent"],[1,"invalid-feedback"],I,$,D,Z,[3,"value"],x,["for","pgAutoscaleMode",1,"cd-col-form-label"],y,["id","pgAutoscaleMode","name","pgAutoscaleMode","formControlName","pgAutoscaleMode",1,"form-control"],["class","form-group row",4,"ngIf"],["for","pgNum",1,"cd-col-form-label","required"],U,["id","pgNum","name","pgNum","formControlName","pgNum","min","1","type","number","required","",1,"form-control",3,"focus","blur"],[1,"form-text","text-muted"],["section","pgs","docText",q],["class","form-text text-muted",4,"ngIf"],H,G,z,X,["for","size",1,"cd-col-form-label","required"],w,["id","size","name","size","type","number","formControlName","size",1,"form-control",3,"max","min"],["class","text-warning-dark",4,"ngIf"],[1,"list-inline"],Q,J,k,[1,"text-warning-dark"],V,[1,"cd-col-form-label"],Y,[1,"custom-control","custom-checkbox"],["type","checkbox","id","ec-overwrites","formControlName","ecOverwrites",1,"custom-control-input"],["for","ec-overwrites",1,"custom-control-label"],B,["title",d],j,["for","erasureProfile",1,"cd-col-form-label"],K,[1,"input-group"],["id","erasureProfile","name","erasureProfile","formControlName","erasureProfile",1,"form-control"],["ngValue","",4,"ngIf"],[3,"ngValue",4,"ngIf"],[3,"ngValue",4,"ngFor","ngForOf"],[1,"input-group-append"],["id","ecp-info-button","type","button",1,"btn","btn-light",3,"ngClass","click"],["aria-hidden","true",3,"ngClass"],["class","btn btn-light","type","button",3,"click",4,"ngIf"],["class","btn btn-light","type","button","ngbTooltip",N,"triggers","manual",3,"click",4,"ngIf"],["class","form-text text-muted","id","ecp-info-block",4,"ngIf"],W,[3,"ngValue"],ee,_e,["type","button",1,"btn","btn-light",3,"click"],["type","button","ngbTooltip",N,"triggers","manual",1,"btn","btn-light",3,"click"],["ecpDeletionBtn","ngbTooltip"],["id","ecp-info-block",1,"form-text","text-muted"],["ngbNav","",1,"nav-tabs"],["ecpInfoTabs","ngbNav"],["ngbNavItem","ecp-info"],["ngbNavLink",""],oe,["ngbNavContent",""],["ngbNavItem","used-by-pools"],te,[3,"ngbNavOutlet"],[3,"renderObjects","hideKeys","data","autoReload"],["ecpIsNotUsed",""],[4,"ngIf","ngIfElse"],ie,[4,"ngFor","ngForOf"],["for","crushRule",1,"cd-col-form-label"],ne,se,ae,["noRules",""],le,["id","crushRule","formControlName","crushRule","name","crushSet",1,"form-control"],re,["id","crush-info-button","type","button","ngbTooltip",ce,1,"btn","btn-light",3,"ngClass","click"],["class","btn btn-light","type","button","ngbTooltip",O,"triggers","manual",3,"click",4,"ngIf"],["class","form-text text-muted","id","crush-info-block",4,"ngIf"],["type","button","ngbTooltip",O,"triggers","manual",1,"btn","btn-light",3,"click"],["crushDeletionBtn","ngbTooltip"],["id","crush-info-block",1,"form-text","text-muted"],["crushInfoTabs","ngbNav"],["ngbNavItem","crush-rule-info"],Xe,["ngbNavItem","crush-rule-steps"],we,Qe,["ruleIsNotUsed",""],Je,ke,Ve,["formGroupName","compression"],Ye,["for","mode",1,"cd-col-form-label"],Be,["id","mode","name","mode","formControlName","mode",1,"form-control"],["for","algorithm",1,"cd-col-form-label"],je,["id","algorithm","name","algorithm","formControlName","algorithm",1,"form-control"],["for","minBlobSize",1,"cd-col-form-label"],Ke,["id","minBlobSize","name","minBlobSize","formControlName","minBlobSize","type","text","min","0","placeholder",We,"defaultUnit","KiB","cdDimlessBinary","",1,"form-control"],["for","maxBlobSize",1,"cd-col-form-label"],e_,["id","maxBlobSize","type","text","min","0","formControlName","maxBlobSize","placeholder",__,"defaultUnit","KiB","cdDimlessBinary","",1,"form-control"],["for","ratio",1,"cd-col-form-label"],o_,["id","ratio","name","ratio","formControlName","ratio","type","number","min","0","max","1","step","0.1","placeholder",t_,1,"form-control"],i_,n_,s_,a_,l_,r_,c_,O_]},template:function(_,o){1&_&&e.YNc(0,Yt,70,33,"div",0),2&_&&e.Q6J("cdFormLoading",o.loading)},directives:[bo.y,a._Y,a.JL,fe.V,a.sg,Pe.P,Ee.o,a.Fj,ge.b,a.JJ,a.u,pe.U,C.O5,a.EJ,a.YN,a.Kr,C.sg,vo.m,Re.S,Io.Q,a.qQ,a.wV,$o.d,me.p,a.Q7,Do.K,a.Fd,a.Wl,C.mk,g._L,g.Pz,g.nv,g.Vx,g.uN,g.tO,xe.b,a.x0],pipes:[C.rS,Ce.m],styles:[".icon-warning-color[_ngcontent-%COMP%]{margin-left:3px}"]}),t})();var Bt=r(19773),jt=r(49671),Kt=r(68136),Te=r(69158),Se=r(35905),L=r(99466),Wt=r(91801),ei=r(68774),_i=r(66369),qe=r(38047),Le=r(51847);class oi{constructor(i){this.pool_name=i}}var ti=r(64724);let ii=(()=>{class t{constructor(_,o,n){this.templateRef=_,this.viewContainer=o,this.authStorageService=n,this.cdScopeMatchAll=!0}set cdScope(_){this.permissions=this.authStorageService.getPermissions(),this.isAuthorized(_)?this.viewContainer.createEmbeddedView(this.templateRef):this.viewContainer.clear()}isAuthorized(_){const o=this.cdScopeMatchAll?u().every:u().some;return u().isString(_)?u().get(this.permissions,[_,"read"],!1):u().isArray(_)?o(_,n=>this.permissions[n].read):!!u().isObject(_)&&o(_,(n,s)=>o(n,c=>this.permissions[s][c]))}}return t.\u0275fac=function(_){return new(_||t)(e.Y36(e.Rgc),e.Y36(e.s_b),e.Y36(he.j))},t.\u0275dir=e.lG2({type:t,selectors:[["","cdScope",""]],inputs:{cdScope:"cdScope",cdScopeMatchAll:"cdScopeMatchAll"}}),t})();var ni=r(94928),He=r(51295),si=r(59376),Ge=r(76317),ai=r(71752);function li(t,i){if(1&t&&e._UZ(0,"cd-table-key-value",12),2&t){const _=e.oxw(2);e.Q6J("renderObjects",!0)("data",_.poolDetails)("autoReload",!1)}}function ri(t,i){if(1&t&&e._UZ(0,"cd-grafana",15),2&t){const _=e.oxw(3);e.MGl("grafanaPath","ceph-pool-detail?var-pool_name=",_.selection.pool_name,""),e.Q6J("type","metrics")}}function ci(t,i){1&t&&(e.TgZ(0,"li",13),e.TgZ(1,"a",5),e.SDv(2,14),e.qZA(),e.YNc(3,ri,1,2,"ng-template",7),e.qZA())}function Oi(t,i){if(1&t&&e._UZ(0,"cd-rbd-configuration-table",18),2&t){const _=e.oxw(3);e.Q6J("data",_.selectedPoolConfiguration)}}function di(t,i){1&t&&(e.TgZ(0,"li",16),e.TgZ(1,"a",5),e.SDv(2,17),e.qZA(),e.YNc(3,Oi,1,1,"ng-template",7),e.qZA())}function ui(t,i){if(1&t&&e._UZ(0,"cd-table",21),2&t){const _=e.oxw(3);e.Q6J("data",_.cacheTiers)("columns",_.cacheTierColumns)("autoSave",!1)}}function fi(t,i){1&t&&(e.TgZ(0,"li",19),e.TgZ(1,"a",5),e.SDv(2,20),e.qZA(),e.YNc(3,ui,1,3,"ng-template",7),e.qZA())}function Pi(t,i){if(1&t&&(e.ynx(0,1),e.TgZ(1,"ul",2,3),e.TgZ(3,"li",4),e.TgZ(4,"a",5),e.SDv(5,6),e.qZA(),e.YNc(6,li,1,3,"ng-template",7),e.qZA(),e.YNc(7,ci,4,0,"li",8),e.YNc(8,di,4,0,"li",9),e.YNc(9,fi,4,0,"li",10),e.qZA(),e._UZ(10,"div",11),e.BQk()),2&t){const _=e.MAs(2),o=e.oxw();e.xp6(7),e.Q6J("ngIf",o.permissions.grafana.read),e.xp6(1),e.Q6J("ngIf","replicated"===o.selection.type),e.xp6(1),e.Q6J("ngIf",(null==o.selection.tiers?null:o.selection.tiers.length)>0),e.xp6(1),e.Q6J("ngbNavOutlet",_)}}let Ei=(()=>{class t{constructor(_){this.poolService=_,this.cacheTierColumns=[],this.omittedPoolAttributes=["cdExecuting","cdIsBinary","stats"],this.cacheTierColumns=[{prop:"pool_name",name:"Name",flexGrow:3},{prop:"cache_mode",name:"Cache Mode",flexGrow:2},{prop:"cache_min_evict_age",name:"Min Evict Age",flexGrow:2},{prop:"cache_min_flush_age",name:"Min Flush Age",flexGrow:2},{prop:"target_max_bytes",name:"Target Max Bytes",flexGrow:2},{prop:"target_max_objects",name:"Target Max Objects",flexGrow:2}]}ngOnChanges(){this.selection&&(this.poolService.getConfiguration(this.selection.pool_name).subscribe(_=>{He.T.updateChanged(this,{selectedPoolConfiguration:_})}),He.T.updateChanged(this,{poolDetails:u().omit(this.selection,this.omittedPoolAttributes)}))}}return t.\u0275fac=function(_){return new(_||t)(e.Y36(ue.q))},t.\u0275cmp=e.Xpm({type:t,selectors:[["cd-pool-details"]],inputs:{cacheTiers:"cacheTiers",permissions:"permissions",selection:"selection"},features:[e.TTD],decls:1,vars:1,consts:function(){let i,_,o,n;return i="Details",_="Performance Details",o="Configuration",n="Cache Tiers Details",[["cdTableDetail","",4,"ngIf"],["cdTableDetail",""],["ngbNav","","cdStatefulTab","pool-details",1,"nav-tabs"],["nav","ngbNav"],["ngbNavItem","details"],["ngbNavLink",""],i,["ngbNavContent",""],["ngbNavItem","performance-details",4,"ngIf"],["ngbNavItem","configuration",4,"ngIf"],["ngbNavItem","cache-tiers-details",4,"ngIf"],[3,"ngbNavOutlet"],[3,"renderObjects","data","autoReload"],["ngbNavItem","performance-details"],_,["uid","-xyV8KCiz","grafanaStyle","three",3,"grafanaPath","type"],["ngbNavItem","configuration"],o,[3,"data"],["ngbNavItem","cache-tiers-details"],n,["columnMode","flex",3,"data","columns","autoSave"]]},template:function(_,o){1&_&&e.YNc(0,Pi,11,4,"ng-container",0),2&_&&e.Q6J("ngIf",o.selection)},directives:[C.O5,g.Pz,si.m,g.nv,g.Vx,g.uN,g.tO,xe.b,Ge.F,ai.P,Se.a],styles:[""],changeDetection:0}),t})();var gi=r(60251);const pi=["poolUsageTpl"],Ri=["poolConfigurationSourceTpl"];function mi(t,i){if(1&t){const _=e.EpF();e.TgZ(0,"cd-table",9,10),e.NdJ("fetchData",function(){return e.CHM(_),e.oxw().taskListService.fetch()})("setExpandedRow",function(n){return e.CHM(_),e.oxw().setExpandedRow(n)})("updateSelection",function(n){return e.CHM(_),e.oxw().updateSelection(n)}),e._UZ(2,"cd-table-actions",11),e._UZ(3,"cd-pool-details",12),e.qZA()}if(2&t){const _=e.oxw();e.Q6J("data",_.pools)("columns",_.columns)("hasDetails",!0)("status",_.tableStatus)("autoReload",-1),e.xp6(2),e.Q6J("permission",_.permissions.pool)("selection",_.selection)("tableActions",_.tableActions),e.xp6(1),e.Q6J("selection",_.expandedRow)("permissions",_.permissions)("cacheTiers",_.cacheTiers)}}function Ci(t,i){1&t&&e._UZ(0,"cd-grafana",14),2&t&&e.Q6J("grafanaPath","ceph-pools-overview?")("type","metrics")}function Mi(t,i){1&t&&(e.TgZ(0,"li",2),e.TgZ(1,"a",3),e.SDv(2,13),e.qZA(),e.YNc(3,Ci,1,2,"ng-template",5),e.qZA())}function hi(t,i){if(1&t&&e._UZ(0,"cd-usage-bar",16),2&t){const _=e.oxw().row;e.Q6J("total",_.stats.bytes_used.latest+_.stats.avail_raw.latest)("used",_.stats.bytes_used.latest)}}function Ti(t,i){if(1&t&&e.YNc(0,hi,1,2,"cd-usage-bar",15),2&t){const _=i.row;e.Q6J("ngIf",null==_.stats||null==_.stats.avail_raw?null:_.stats.avail_raw.latest)}}let Si=(()=>{class t extends Kt.o{constructor(_,o,n,s,c,d,P,p,R,h,T){super(),this.poolService=_,this.taskWrapper=o,this.ecpService=n,this.authStorageService=s,this.taskListService=c,this.modalService=d,this.pgCategoryService=P,this.dimlessPipe=p,this.urlBuilder=R,this.configurationService=h,this.actionLabels=T,this.selection=new ei.r,this.executingTasks=[],this.tableStatus=new Te.E,this.cacheTiers=[],this.monAllowPoolDelete=!1,this.permissions=this.authStorageService.getPermissions(),this.tableActions=[{permission:"create",icon:b.P.add,routerLink:()=>this.urlBuilder.getCreate(),name:this.actionLabels.CREATE},{permission:"update",icon:b.P.edit,routerLink:()=>this.urlBuilder.getEdit(encodeURIComponent(this.selection.first().pool_name)),name:this.actionLabels.EDIT},{permission:"delete",icon:b.P.destroy,click:()=>this.deletePoolModal(),name:this.actionLabels.DELETE,disable:this.getDisableDesc.bind(this)}],this.permissions.configOpt.read&&this.configurationService.get("mon_allow_pool_delete").subscribe(m=>{if(u().has(m,"value")){const f=u().find(m.value,A=>"mon"===A.section)||{value:!1};this.monAllowPoolDelete="true"===f.value}})}ngOnInit(){const _=(o,n,s)=>u().get(n,o)>u().get(s,o)?1:-1;this.columns=[{prop:"pool_name",name:"Name",flexGrow:4,cellTransformation:L.e.executing},{prop:"data_protection",name:"Data Protection",cellTransformation:L.e.badge,customTemplateConfig:{class:"badge-background-gray"},flexGrow:1.3},{prop:"application_metadata",name:"Applications",cellTransformation:L.e.badge,customTemplateConfig:{class:"badge-background-primary"},flexGrow:1.5},{prop:"pg_status",name:"PG Status",flexGrow:1.2,cellClass:({row:o,column:n,value:s})=>this.getPgStatusCellClass(o,n,s)},{prop:"crush_rule",name:"Crush Ruleset",isHidden:!0,flexGrow:2},{name:"Usage",prop:"usage",cellTemplate:this.poolUsageTpl,flexGrow:1.2},{prop:"stats.rd_bytes.rates",name:"Read bytes",comparator:(o,n,s,c)=>_("stats.rd_bytes.latest",s,c),cellTransformation:L.e.sparkline,flexGrow:1.5},{prop:"stats.wr_bytes.rates",name:"Write bytes",comparator:(o,n,s,c)=>_("stats.wr_bytes.latest",s,c),cellTransformation:L.e.sparkline,flexGrow:1.5},{prop:"stats.rd.rate",name:"Read ops",flexGrow:1,pipe:this.dimlessPipe,cellTransformation:L.e.perSecond},{prop:"stats.wr.rate",name:"Write ops",flexGrow:1,pipe:this.dimlessPipe,cellTransformation:L.e.perSecond}],this.taskListService.init(()=>this.ecpService.list().pipe((0,Bt.zg)(o=>(this.ecProfileList=o,this.poolService.getList()))),void 0,o=>{this.pools=this.transformPoolsData(o),this.tableStatus=new Te.E},()=>{this.table.reset(),this.tableStatus=new Te.E(Wt.T.ValueException)},o=>o.name.startsWith("pool/"),(o,n)=>n.metadata.pool_name===o.pool_name,{default:o=>new oi(o.pool_name)})}updateSelection(_){this.selection=_}deletePoolModal(){const _=this.selection.first().pool_name;this.modalService.show(Ne.M,{itemDescription:"Pool",itemNames:[_],submitActionObservable:()=>this.taskWrapper.wrapTaskAroundCall({task:new v.R(`pool/${M.MQ.DELETE}`,{pool_name:_}),call:this.poolService.delete(_)})})}getPgStatusCellClass(_,o,n){return{"text-right":!0,[`pg-${this.pgCategoryService.getTypeByStates(n)}`]:!0}}getErasureCodeProfile(_){let o="";return u().forEach(this.ecProfileList,n=>{n.name===_&&(o=`EC: ${n.k}+${n.m}`)}),o}transformPoolsData(_){const o=["bytes_used","max_avail","avail_raw","percent_used","rd_bytes","wr_bytes","rd","wr"],n={latest:0,rate:0,rates:[]};return u().forEach(_,s=>{s.pg_status=this.transformPgStatus(s.pg_status);const c={};u().forEach(o,d=>{c[d]=s.stats&&s.stats[d]?s.stats[d]:n}),s.stats=c,s.usage=c.percent_used.latest,!s.cdExecuting&&s.pg_num+s.pg_placement_num!==s.pg_num_target+s.pg_placement_num_target&&(s.cdExecuting="Updating"),["rd_bytes","wr_bytes"].forEach(d=>{s.stats[d].rates=s.stats[d].rates.map(P=>P[1])}),s.cdIsBinary=!0,"erasure"===s.type&&(s.data_protection=this.getErasureCodeProfile(s.erasure_code_profile)),"replicated"===s.type&&(s.data_protection=`replica: \xd7${s.size}`)}),_}transformPgStatus(_){const o=[];return u().forEach(_,(n,s)=>{o.push(`${n} ${s}`)}),o.join(", ")}getSelectionTiers(){if(void 0!==this.expandedRow){const _=this.expandedRow.tiers;this.cacheTiers=this.pools.filter(o=>_.includes(o.pool))}}getDisableDesc(){var _;return!(null===(_=this.selection)||void 0===_?void 0:_.hasSelection)||!this.monAllowPoolDelete&&"Pool deletion is disabled by the mon_allow_pool_delete configuration setting."}setExpandedRow(_){super.setExpandedRow(_),this.getSelectionTiers()}}return t.\u0275fac=function(_){return new(_||t)(e.Y36(ue.q),e.Y36(de.P),e.Y36(Me),e.Y36(he.j),e.Y36(qe.j),e.Y36(Ze.Z),e.Y36(jt.j),e.Y36(_i.n),e.Y36(Le.F),e.Y36(ti.e),e.Y36(M.p4))},t.\u0275cmp=e.Xpm({type:t,selectors:[["cd-pool-list"]],viewQuery:function(_,o){if(1&_&&(e.Gf(Se.a,5),e.Gf(pi,7),e.Gf(Ri,5)),2&_){let n;e.iGM(n=e.CRH())&&(o.table=n.first),e.iGM(n=e.CRH())&&(o.poolUsageTpl=n.first),e.iGM(n=e.CRH())&&(o.poolConfigurationSourceTpl=n.first)}},features:[e._Bn([qe.j,{provide:Le.F,useValue:new Le.F("pool")}]),e.qOj],decls:10,vars:2,consts:function(){let i,_;return i="Pools List",_="Overall Performance",[["ngbNav","",1,"nav-tabs"],["nav","ngbNav"],["ngbNavItem",""],["ngbNavLink",""],i,["ngbNavContent",""],["ngbNavItem","",4,"cdScope"],[3,"ngbNavOutlet"],["poolUsageTpl",""],["id","pool-list","selectionType","single",3,"data","columns","hasDetails","status","autoReload","fetchData","setExpandedRow","updateSelection"],["table",""],["id","pool-list-actions",1,"table-actions",3,"permission","selection","tableActions"],["cdTableDetail","","id","pool-list-details",3,"selection","permissions","cacheTiers"],_,["uid","z99hzWtmk","grafanaStyle","two",3,"grafanaPath","type"],["decimals","2",3,"total","used",4,"ngIf"],["decimals","2",3,"total","used"]]},template:function(_,o){if(1&_&&(e.TgZ(0,"ul",0,1),e.TgZ(2,"li",2),e.TgZ(3,"a",3),e.SDv(4,4),e.qZA(),e.YNc(5,mi,4,11,"ng-template",5),e.qZA(),e.YNc(6,Mi,4,0,"li",6),e.qZA(),e._UZ(7,"div",7),e.YNc(8,Ti,1,1,"ng-template",null,8,e.W1O)),2&_){const n=e.MAs(1);e.xp6(6),e.Q6J("cdScope","grafana"),e.xp6(1),e.Q6J("ngbNavOutlet",n)}},directives:[g.Pz,g.nv,g.Vx,g.uN,ii,g.tO,Se.a,ni.K,Ei,Ge.F,C.O5,gi.O],styles:["cd-pool-list .pg-clean{color:#0b0}  cd-pool-list .pg-working{color:#2b99a8}  cd-pool-list .pg-warning{color:#ffc200}  cd-pool-list .pg-unknown{color:#ef5c55}"]}),t})(),ze=(()=>{class t{}return t.\u0275fac=function(_){return new(_||t)},t.\u0275mod=e.oAB({type:t}),t.\u0275inj=e.cJS({imports:[[f_.t,C.ez,g.Oz,d_.m,Oe.Bz,a.UX,g.HK,u_.BlockModule]]}),t})();const Li=[{path:"",component:Si},{path:M.MQ.CREATE,component:Ue,data:{breadcrumbs:M.Qn.CREATE}},{path:`${M.MQ.EDIT}/:name`,component:Ue,data:{breadcrumbs:M.Qn.EDIT}}];let Ai=(()=>{class t{}return t.\u0275fac=function(_){return new(_||t)},t.\u0275mod=e.oAB({type:t}),t.\u0275inj=e.cJS({imports:[[ze,Oe.Bz.forChild(Li)]]}),t})()}}]);
\ No newline at end of file
diff --git a/ceph/src/pybind/mgr/dashboard/frontend/dist/en-US/95.1ae8f43a396d3fea.js b/ceph/src/pybind/mgr/dashboard/frontend/dist/en-US/95.1ae8f43a396d3fea.js
new file mode 100644 (file)
index 0000000..a22b03b
--- /dev/null
@@ -0,0 +1 @@
+"use strict";(self.webpackChunkceph_dashboard=self.webpackChunkceph_dashboard||[]).push([[95],{38095:(Fi,Fe,r)=>{r.r(Fe),r.d(Fe,{PoolModule:()=>qe,RoutedPoolModule:()=>Ai});var C=r(11048),a=r(1659),Oe=r(55860),g=r(71334),M=r(79512),d_=r(44466),u_=r(21043),P_=r(370),f_=r(23815),u=r.n(f_),E_=r(7357),g_=r(26504),ue=r(80842);class T{constructor(){this.nodes=[],this.idTree={},this.allDevices=[],this.buckets=[],this.failureDomains={},this.failureDomainKeys=[],this.devices=[],this.deviceCount=0}static searchFailureDomains(i,_){return this.getFailureDomains(this.search(i,_))}static search(i,_){const[o,n]=_.split("~"),s=i.find(c=>["name","id","type"].some(d=>c[d]===o));return s?(i=this.getSubNodes(s,this.createIdTreeFromNodes(i)),n&&(i=this.filterNodesByDeviceType(i,n)),i):[]}static createIdTreeFromNodes(i){const _={};return i.forEach(o=>{_[o.id]=o}),_}static getSubNodes(i,_){let o=[i];return i.children&&i.children.forEach(n=>{o=o.concat(this.getSubNodes(_[n],_))}),o}static filterNodesByDeviceType(i,_){let n,o=i.filter(c=>c.device_class&&c.device_class!==_).map(c=>c.id),s=o;do{n=!1,i=i.filter(d=>!o.includes(d.id));const c=[];i.forEach(d=>{d.children&&d.children.every(f=>o.includes(f))&&(c.push(d.id),n=!0)}),n&&(o=c,s=s.concat(c))}while(n);return(i=u().cloneDeep(i)).map(c=>(c.children&&(c.children=c.children.filter(d=>!s.includes(d))),c))}static getFailureDomains(i){const _={};return i.forEach(o=>{const n=o.type;_[n]||(_[n]=[]),_[n].push(o)}),_}initCrushNodeSelection(i,_,o,n){this.nodes=i,this.idTree=T.createIdTreeFromNodes(i),i.forEach(s=>{this.idTree[s.id]=s}),this.buckets=u().sortBy(i.filter(s=>s.children),"name"),this.controls={root:_,failure:o,device:n},this.preSelectRoot(),this.controls.root.valueChanges.subscribe(()=>this.onRootChange()),this.controls.failure.valueChanges.subscribe(()=>this.onFailureDomainChange()),this.controls.device.valueChanges.subscribe(()=>this.onDeviceChange())}preSelectRoot(){const i=this.nodes.find(_=>"root"===_.type);this.silentSet(this.controls.root,i),this.onRootChange()}silentSet(i,_){i.setValue(_,{emitEvent:!1})}onRootChange(){const i=T.getSubNodes(this.controls.root.value,this.idTree),_=T.getFailureDomains(i);Object.keys(_).forEach(o=>{_[o].length<=1&&delete _[o]}),this.failureDomains=_,this.failureDomainKeys=Object.keys(_).sort(),this.updateFailureDomain()}updateFailureDomain(){let i=this.getIncludedCustomValue(this.controls.failure,Object.keys(this.failureDomains));""===i&&(i=this.setMostCommonDomain(this.controls.failure)),this.updateDevices(i)}getIncludedCustomValue(i,_){return i.dirty&&_.includes(i.value)?i.value:""}setMostCommonDomain(i){let _={n:0,type:""};return Object.keys(this.failureDomains).forEach(o=>{const n=this.failureDomains[o].length;_.n<n&&(_={n,type:o})}),this.silentSet(i,_.type),_.type}onFailureDomainChange(){this.updateDevices()}updateDevices(i=this.controls.failure.value){const _=u().flatten(this.failureDomains[i].map(n=>T.getSubNodes(n,this.idTree)));this.allDevices=_.filter(n=>n.device_class).map(n=>n.device_class),this.devices=u().uniq(this.allDevices).sort();const o=1===this.devices.length?this.devices[0]:this.getIncludedCustomValue(this.controls.device,this.devices);this.silentSet(this.controls.device,o),this.onDeviceChange(o)}onDeviceChange(i=this.controls.device.value){this.deviceCount=""===i?this.allDevices.length:this.allDevices.filter(_=>_===i).length}}var Ne=r(30982),p_=r(14745),b=r(65862),R_=r(93614),be=r(95463),E=r(90070),m_=r(30633),v=r(76111),C_=r(47557),M_=r(28211),de=r(32337),e=r(89724),ve=r(62862),Ie=r(83608),$e=r(60312),Pe=r(41582),fe=r(56310),Ee=r(87925),ge=r(94276),pe=r(82945),Re=r(18372),me=r(30839),Ce=r(10545);function h_(t,i){1&t&&(e.TgZ(0,"span",30),e.SDv(1,31),e.qZA())}function S_(t,i){1&t&&(e.TgZ(0,"span",30),e.SDv(1,32),e.qZA())}function T_(t,i){1&t&&(e.TgZ(0,"span",30),e.SDv(1,33),e.qZA())}function L_(t,i){1&t&&(e.TgZ(0,"option",26),e.SDv(1,34),e.qZA())}function A_(t,i){if(1&t&&(e.TgZ(0,"option",35),e._uU(1),e.qZA()),2&t){const _=i.$implicit;e.Q6J("ngValue",_),e.xp6(1),e.hij(" ",_.name," ")}}function F_(t,i){1&t&&(e.TgZ(0,"span",30),e.SDv(1,36),e.qZA())}function N_(t,i){1&t&&(e.TgZ(0,"option",26),e.SDv(1,37),e.qZA())}function b_(t,i){if(1&t&&(e.TgZ(0,"option",35),e._uU(1),e.qZA()),2&t){const _=i.$implicit,o=e.oxw();e.Q6J("ngValue",_),e.xp6(1),e.AsE(" ",_," ( ",o.failureDomains[_].length," ) ")}}function v_(t,i){1&t&&(e.TgZ(0,"span",30),e.SDv(1,38),e.qZA())}function I_(t,i){if(1&t&&(e.TgZ(0,"option",35),e._uU(1),e.qZA()),2&t){const _=i.$implicit;e.Q6J("ngValue",_),e.xp6(1),e.hij(" ",_," ")}}let $_=(()=>{class t extends T{constructor(_,o,n,s,c){super(),this.formBuilder=_,this.activeModal=o,this.taskWrapper=n,this.crushRuleService=s,this.actionLabels=c,this.submitAction=new e.vpe,this.tooltips=this.crushRuleService.formTooltips,this.action=this.actionLabels.CREATE,this.resource="Crush Rule",this.createForm()}createForm(){this.form=this.formBuilder.group({name:["",[a.kI.required,a.kI.pattern("[A-Za-z0-9_-]+"),E.h.custom("uniqueName",_=>this.names&&-1!==this.names.indexOf(_))]],root:null,failure_domain:"",device_class:""})}ngOnInit(){this.crushRuleService.getInfo().subscribe(({names:_,nodes:o})=>{this.initCrushNodeSelection(o,this.form.get("root"),this.form.get("failure_domain"),this.form.get("device_class")),this.names=_})}onSubmit(){if(this.form.invalid)return void this.form.setErrors({cdSubmitButton:!0});const _=u().cloneDeep(this.form.value);_.root=_.root.name,""===_.device_class&&delete _.device_class,this.taskWrapper.wrapTaskAroundCall({task:new v.R("crushRule/create",_),call:this.crushRuleService.create(_)}).subscribe({error:()=>{this.form.setErrors({cdSubmitButton:!0})},complete:()=>{this.activeModal.close(),this.submitAction.emit(_)}})}}return t.\u0275fac=function(_){return new(_||t)(e.Y36(ve.O),e.Y36(g.Kz),e.Y36(de.P),e.Y36(Ie.H),e.Y36(M.p4))},t.\u0275cmp=e.Xpm({type:t,selectors:[["cd-crush-rule-form-modal"]],outputs:{submitAction:"submitAction"},features:[e.qOj],decls:55,vars:27,consts:function(){let i,_,o,n,s,c,d,f,p,R,h,S,m;return i="" + "\ufffd0\ufffd" + " " + "\ufffd1\ufffd" + "",_="Name",o="Root",n="Failure domain type",s="Device class",c="Let Ceph decide",d="This field is required!",f="The name can only consist of alphanumeric characters, dashes and underscores.",p="The chosen erasure code profile name is already in use.",R="Loading...",h="This field is required!",S="Loading...",m="This field is required!",[[3,"modalRef"],[1,"modal-title"],i,[1,"modal-content"],["novalidate","",3,"formGroup"],["frm","ngForm"],[1,"modal-body"],[1,"form-group","row"],["for","name",1,"cd-col-form-label"],_,[1,"required"],[1,"cd-col-form-input"],["type","text","id","name","name","name","placeholder","Name...","formControlName","name","autofocus","",1,"form-control"],["class","invalid-feedback",4,"ngIf"],["for","root",1,"cd-col-form-label"],o,[3,"html"],["id","root","name","root","formControlName","root",1,"form-select"],["ngValue","",4,"ngIf"],[3,"ngValue",4,"ngFor","ngForOf"],["for","failure_domain",1,"cd-col-form-label"],n,["id","failure_domain","name","failure_domain","formControlName","failure_domain",1,"form-select"],["for","device_class",1,"cd-col-form-label"],s,["id","device_class","name","device_class","formControlName","device_class",1,"form-select"],["ngValue",""],c,[1,"modal-footer"],[3,"form","submitText","submitActionEvent"],[1,"invalid-feedback"],d,f,p,R,[3,"ngValue"],h,S,m]},template:function(_,o){if(1&_&&(e.TgZ(0,"cd-modal",0),e.ynx(1,1),e.SDv(2,2),e.ALo(3,"titlecase"),e.ALo(4,"upperFirst"),e.BQk(),e.ynx(5,3),e.TgZ(6,"form",4,5)(8,"div",6)(9,"div",7)(10,"label",8),e.ynx(11),e.SDv(12,9),e.BQk(),e._UZ(13,"span",10),e.qZA(),e.TgZ(14,"div",11),e._UZ(15,"input",12),e.YNc(16,h_,2,0,"span",13),e.YNc(17,S_,2,0,"span",13),e.YNc(18,T_,2,0,"span",13),e.qZA()(),e.TgZ(19,"div",7)(20,"label",14),e.ynx(21),e.SDv(22,15),e.BQk(),e._UZ(23,"cd-helper",16)(24,"span",10),e.qZA(),e.TgZ(25,"div",11)(26,"select",17),e.YNc(27,L_,2,0,"option",18),e.YNc(28,A_,2,2,"option",19),e.qZA(),e.YNc(29,F_,2,0,"span",13),e.qZA()(),e.TgZ(30,"div",7)(31,"label",20),e.ynx(32),e.SDv(33,21),e.BQk(),e._UZ(34,"cd-helper",16)(35,"span",10),e.qZA(),e.TgZ(36,"div",11)(37,"select",22),e.YNc(38,N_,2,0,"option",18),e.YNc(39,b_,2,3,"option",19),e.qZA(),e.YNc(40,v_,2,0,"span",13),e.qZA()(),e.TgZ(41,"div",7)(42,"label",23),e.ynx(43),e.SDv(44,24),e.BQk(),e._UZ(45,"cd-helper",16),e.qZA(),e.TgZ(46,"div",11)(47,"select",25)(48,"option",26),e.SDv(49,27),e.qZA(),e.YNc(50,I_,2,2,"option",19),e.qZA()()()(),e.TgZ(51,"div",28)(52,"cd-form-button-panel",29),e.NdJ("submitActionEvent",function(){return o.onSubmit()}),e.ALo(53,"titlecase"),e.ALo(54,"upperFirst"),e.qZA()()(),e.BQk(),e.qZA()),2&_){const n=e.MAs(7);e.Q6J("modalRef",o.activeModal),e.xp6(4),e.pQV(e.lcZ(3,19,o.action))(e.lcZ(4,21,o.resource)),e.QtT(2),e.xp6(2),e.Q6J("formGroup",o.form),e.xp6(10),e.Q6J("ngIf",o.form.showError("name",n,"required")),e.xp6(1),e.Q6J("ngIf",o.form.showError("name",n,"pattern")),e.xp6(1),e.Q6J("ngIf",o.form.showError("name",n,"uniqueName")),e.xp6(5),e.Q6J("html",o.tooltips.root),e.xp6(4),e.Q6J("ngIf",!o.buckets),e.xp6(1),e.Q6J("ngForOf",o.buckets),e.xp6(1),e.Q6J("ngIf",o.form.showError("root",n,"required")),e.xp6(5),e.Q6J("html",o.tooltips.failure_domain),e.xp6(4),e.Q6J("ngIf",!o.failureDomains),e.xp6(1),e.Q6J("ngForOf",o.failureDomainKeys),e.xp6(1),e.Q6J("ngIf",o.form.showError("failure_domain",n,"required")),e.xp6(5),e.Q6J("html",o.tooltips.device_class),e.xp6(5),e.Q6J("ngForOf",o.devices),e.xp6(2),e.Q6J("form",o.form)("submitText",e.lcZ(53,23,o.action)+" "+e.lcZ(54,25,o.resource))}},directives:[$e.z,a._Y,a.JL,Pe.V,a.sg,fe.P,Ee.o,a.Fj,ge.b,a.JJ,a.u,pe.U,C.O5,Re.S,a.EJ,a.YN,a.Kr,C.sg,me.p],pipes:[C.rS,Ce.m],styles:[""]}),t})();class D_{}var x_=r(19725);let Me=(()=>{class t{constructor(_){this.http=_,this.apiPath="api/erasure_code_profile",this.formTooltips={k:"Each object is split in data-chunks parts, each stored on a different OSD.",m:"Compute coding chunks for each object and store them on different OSDs.\n      The number of coding chunks is also the number of OSDs that can be down without losing data.",plugins:{jerasure:{description:"The jerasure plugin is the most generic and flexible plugin,\n          it is also the default for Ceph erasure coded pools.",technique:"The more flexible technique is reed_sol_van : it is enough to set k\n          and m. The cauchy_good technique can be faster but you need to chose the packetsize\n          carefully. All of reed_sol_r6_op, liberation, blaum_roth, liber8tion are RAID6 equivalents\n          in the sense that they can only be configured with m=2.",packetSize:"The encoding will be done on packets of bytes size at a time.\n          Choosing the right packet size is difficult.\n          The jerasure documentation contains extensive information on this topic."},lrc:{description:"With the jerasure plugin, when an erasure coded object is stored on\n          multiple OSDs, recovering from the loss of one OSD requires reading from all the others.\n          For instance if jerasure is configured with k=8 and m=4, losing one OSD requires reading\n          from the eleven others to repair.\n\n          The lrc erasure code plugin creates local parity chunks to be able to recover using\n          less OSDs. For instance if lrc is configured with k=8, m=4 and l=4, it will create\n          an additional parity chunk for every four OSDs. When a single OSD is lost, it can be\n          recovered with only four OSDs instead of eleven.",l:"Group the coding and data chunks into sets of size locality. For instance,\n          for k=4 and m=2, when locality=3 two groups of three are created. Each set can\n          be recovered without reading chunks from another set.",crushLocality:"The type of the crush bucket in which each set of chunks defined\n          by l will be stored. For instance, if it is set to rack, each group of l chunks will be\n          placed in a different rack. It is used to create a CRUSH rule step such as step choose\n          rack. If it is not set, no such grouping is done."},isa:{description:"The isa plugin encapsulates the ISA library. It only runs on Intel processors.",technique:"The ISA plugin comes in two Reed Solomon forms.\n          If reed_sol_van is set, it is Vandermonde, if cauchy is set, it is Cauchy."},shec:{description:"The shec plugin encapsulates the multiple SHEC library.\n          It allows ceph to recover data more efficiently than Reed Solomon codes.",c:"The number of parity chunks each of which includes each data chunk in its\n          calculation range. The number is used as a durability estimator. For instance, if c=2,\n          2 OSDs can be down without losing data."},clay:{description:"CLAY (short for coupled-layer) codes are erasure codes designed to\n          bring about significant savings in terms of network bandwidth and disk IO when a failed\n          node/OSD/rack is being repaired.",d:"Number of OSDs requested to send data during recovery of a single chunk.\n          d needs to be chosen such that k+1 <= d <= k+m-1. The larger the d, the better\n          the savings.",scalar_mds:"scalar_mds specifies the plugin that is used as a building block\n          in the layered construction. It can be one of jerasure, isa, shec.",technique:"technique specifies the technique that will be picked\n          within the 'scalar_mds' plugin specified. Supported techniques\n          are 'reed_sol_van', 'reed_sol_r6_op', 'cauchy_orig',\n          'cauchy_good', 'liber8tion' for jerasure, 'reed_sol_van',\n          'cauchy' for isa and 'single', 'multiple' for shec."}},crushRoot:"The name of the crush bucket used for the first step of the CRUSH rule.\n      For instance step take default.",crushFailureDomain:"Ensure that no two chunks are in a bucket with the same failure\n      domain. For instance, if the failure domain is host no two chunks will be stored on the same\n      host. It is used to create a CRUSH rule step such as step chooseleaf host.",crushDeviceClass:"Restrict placement to devices of a specific class\n      (e.g., ssd or hdd), using the crush device class names in the CRUSH map.",directory:"Set the directory name from which the erasure code plugin is loaded."}}list(){return this.http.get(this.apiPath)}create(_){return this.http.post(this.apiPath,_,{observe:"response"})}delete(_){return this.http.delete(`${this.apiPath}/${_}`,{observe:"response"})}getInfo(){return this.http.get(`ui-${this.apiPath}/info`)}}return t.\u0275fac=function(_){return new(_||t)(e.LFG(x_.eN))},t.\u0275prov=e.Yz7({token:t,factory:t.\u0275fac,providedIn:"root"}),t})();function y_(t,i){1&t&&(e.TgZ(0,"span",46),e.SDv(1,47),e.qZA())}function Z_(t,i){1&t&&(e.TgZ(0,"span",46),e.SDv(1,48),e.qZA())}function U_(t,i){1&t&&(e.TgZ(0,"span",46),e.SDv(1,49),e.qZA())}function H_(t,i){1&t&&(e.TgZ(0,"option",37),e.SDv(1,50),e.qZA())}function G_(t,i){if(1&t&&(e.TgZ(0,"option",51),e._uU(1),e.qZA()),2&t){const _=i.$implicit;e.Q6J("ngValue",_),e.xp6(1),e.hij(" ",_," ")}}function z_(t,i){1&t&&(e.TgZ(0,"span",46),e.SDv(1,52),e.qZA())}function q_(t,i){1&t&&(e.TgZ(0,"span",46),e.SDv(1,53),e.qZA())}function X_(t,i){1&t&&(e.TgZ(0,"span",46),e.SDv(1,54),e.qZA())}function w_(t,i){if(1&t&&(e.TgZ(0,"span",46),e.SDv(1,55),e.qZA()),2&t){const _=e.oxw();e.xp6(1),e.pQV(_.deviceCount),e.QtT(1)}}function Q_(t,i){1&t&&(e.TgZ(0,"span",46),e.SDv(1,56),e.qZA())}function J_(t,i){1&t&&(e.TgZ(0,"span",46),e.SDv(1,57),e.qZA())}function k_(t,i){if(1&t&&(e.TgZ(0,"span",39),e.SDv(1,58),e.qZA()),2&t){const _=e.oxw();e.xp6(1),e.pQV(_.lrcMultiK),e.QtT(1)}}function V_(t,i){1&t&&(e.TgZ(0,"span",46),e.SDv(1,59),e.qZA())}function Y_(t,i){1&t&&(e.TgZ(0,"span",46),e.SDv(1,60),e.qZA())}function B_(t,i){if(1&t&&(e.TgZ(0,"span",46),e.SDv(1,61),e.qZA()),2&t){const _=e.oxw();e.xp6(1),e.pQV(_.deviceCount),e.QtT(1)}}function j_(t,i){1&t&&(e.TgZ(0,"span",46),e.SDv(1,65),e.qZA())}function K_(t,i){1&t&&(e.TgZ(0,"span",46),e.SDv(1,66),e.qZA())}function W_(t,i){if(1&t&&(e.TgZ(0,"div",7)(1,"label",62)(2,"span",14),e.SDv(3,63),e.qZA(),e._UZ(4,"cd-helper",16),e.qZA(),e.TgZ(5,"div",10),e._UZ(6,"input",64),e.YNc(7,j_,2,0,"span",12),e.YNc(8,K_,2,0,"span",12),e.qZA()()),2&t){const _=e.oxw(),o=e.MAs(7);e.xp6(4),e.Q6J("html",_.tooltips.plugins.shec.c),e.xp6(3),e.Q6J("ngIf",_.form.showError("c",o,"min")),e.xp6(1),e.Q6J("ngIf",_.form.showError("c",o,"cGreaterM"))}}function eo(t,i){1&t&&(e.TgZ(0,"span",39),e.SDv(1,74),e.qZA())}function _o(t,i){if(1&t&&(e.TgZ(0,"span",39),e.SDv(1,75),e.qZA()),2&t){const _=e.oxw(3);e.xp6(1),e.pQV(_.getDMin())(_.getDMax()),e.QtT(1)}}function oo(t,i){if(1&t&&(e.TgZ(0,"span",39),e.SDv(1,76),e.qZA()),2&t){const _=e.oxw(3);e.xp6(1),e.pQV(_.getDMax()),e.QtT(1)}}function to(t,i){if(1&t&&(e.ynx(0),e.YNc(1,_o,2,2,"span",23),e.YNc(2,oo,2,1,"span",23),e.BQk()),2&t){const _=e.oxw(2);e.xp6(1),e.Q6J("ngIf",_.getDMin()<_.getDMax()),e.xp6(1),e.Q6J("ngIf",_.getDMin()===_.getDMax())}}function io(t,i){if(1&t&&(e.TgZ(0,"span",46),e.SDv(1,77),e.qZA()),2&t){const _=e.oxw(2);e.xp6(1),e.pQV(_.getDMin()),e.QtT(1)}}function no(t,i){if(1&t&&(e.TgZ(0,"span",46),e.SDv(1,78),e.qZA()),2&t){const _=e.oxw(2);e.xp6(1),e.pQV(_.getDMax()),e.QtT(1)}}function so(t,i){if(1&t){const _=e.EpF();e.TgZ(0,"div",7)(1,"label",67)(2,"span",14),e.SDv(3,68),e.qZA(),e._UZ(4,"cd-helper",16),e.qZA(),e.TgZ(5,"div",10)(6,"div",69),e._UZ(7,"input",70),e.TgZ(8,"button",71),e.NdJ("click",function(){return e.CHM(_),e.oxw().toggleDCalc()}),e._UZ(9,"i",72),e.qZA()(),e.YNc(10,eo,2,0,"span",23),e.YNc(11,to,3,2,"ng-container",73),e.YNc(12,io,2,1,"span",12),e.YNc(13,no,2,1,"span",12),e.qZA()()}if(2&t){const _=e.oxw(),o=e.MAs(7);e.xp6(4),e.Q6J("html",_.tooltips.plugins.clay.d),e.xp6(5),e.Q6J("ngClass",_.dCalc?_.icons.unlock:_.icons.lock),e.xp6(1),e.Q6J("ngIf",_.dCalc),e.xp6(1),e.Q6J("ngIf",!_.dCalc),e.xp6(1),e.Q6J("ngIf",_.form.showError("d",o,"dMin")),e.xp6(1),e.Q6J("ngIf",_.form.showError("d",o,"dMax"))}}function ao(t,i){1&t&&(e.TgZ(0,"span",46),e.SDv(1,83),e.qZA())}function lo(t,i){1&t&&(e.TgZ(0,"span",46),e.SDv(1,84),e.qZA())}function ro(t,i){1&t&&(e.TgZ(0,"span",46),e.SDv(1,85),e.qZA())}function co(t,i){if(1&t&&(e.TgZ(0,"div",7)(1,"label",79)(2,"span",14),e.SDv(3,80),e.qZA(),e._UZ(4,"cd-helper",16),e.qZA(),e.TgZ(5,"div",10),e._UZ(6,"input",81),e.YNc(7,ao,2,0,"span",12),e.YNc(8,lo,2,0,"span",12),e.YNc(9,ro,2,0,"span",12),e.TgZ(10,"span",39),e.SDv(11,82),e.qZA()()()),2&t){const _=e.oxw(),o=e.MAs(7);e.xp6(4),e.Q6J("html",_.tooltips.plugins.lrc.l),e.xp6(3),e.Q6J("ngIf",_.form.showError("l",o,"required")),e.xp6(1),e.Q6J("ngIf",_.form.showError("l",o,"min")),e.xp6(1),e.Q6J("ngIf",_.form.showError("l",o,"unequal")),e.xp6(2),e.pQV(_.lrcGroups),e.QtT(11)}}function Oo(t,i){1&t&&(e.TgZ(0,"option",37),e.SDv(1,86),e.qZA())}function uo(t,i){if(1&t&&(e.TgZ(0,"option",51),e._uU(1),e.qZA()),2&t){const _=i.$implicit,o=e.oxw();e.Q6J("ngValue",_),e.xp6(1),e.AsE(" ",_," ( ",o.failureDomains[_].length," ) ")}}function Po(t,i){1&t&&(e.TgZ(0,"option",37),e.SDv(1,90),e.qZA())}function fo(t,i){1&t&&(e.TgZ(0,"option",37),e.SDv(1,91),e.qZA())}function Eo(t,i){if(1&t&&(e.TgZ(0,"option",51),e._uU(1),e.qZA()),2&t){const _=i.$implicit,o=e.oxw(2);e.Q6J("ngValue",_),e.xp6(1),e.AsE(" ",_," ( ",o.failureDomains[_].length," ) ")}}function go(t,i){if(1&t&&(e.TgZ(0,"div",7)(1,"label",87),e.ynx(2),e.SDv(3,88),e.BQk(),e._UZ(4,"cd-helper",16),e.qZA(),e.TgZ(5,"div",10)(6,"select",89),e.YNc(7,Po,2,0,"option",18),e.YNc(8,fo,2,0,"option",18),e.YNc(9,Eo,2,3,"option",19),e.qZA()()()),2&t){const _=e.oxw();e.xp6(4),e.Q6J("html",_.tooltips.plugins.lrc.crushLocality),e.xp6(3),e.Q6J("ngIf",!_.failureDomains),e.xp6(1),e.Q6J("ngIf",_.failureDomainKeys.length>0),e.xp6(1),e.Q6J("ngForOf",_.failureDomainKeys)}}function po(t,i){if(1&t&&(e.TgZ(0,"option",51),e._uU(1),e.qZA()),2&t){const _=i.$implicit;e.Q6J("ngValue",_),e.xp6(1),e.hij(" ",_," ")}}const De=function(t,i,_){return[t,i,_]};function Ro(t,i){if(1&t&&(e.TgZ(0,"div",7)(1,"label",92),e.ynx(2),e.SDv(3,93),e.BQk(),e._UZ(4,"cd-helper",16),e.qZA(),e.TgZ(5,"div",10)(6,"select",94),e.YNc(7,po,2,2,"option",19),e.qZA()()()),2&t){const _=e.oxw();e.xp6(4),e.Q6J("html",_.tooltips.plugins.clay.scalar_mds),e.xp6(3),e.Q6J("ngForOf",e.kEZ(2,De,_.PLUGIN.JERASURE,_.PLUGIN.ISA,_.PLUGIN.SHEC))}}function mo(t,i){if(1&t&&(e.TgZ(0,"option",51),e._uU(1),e.qZA()),2&t){const _=i.$implicit;e.Q6J("ngValue",_),e.xp6(1),e.hij(" ",_," ")}}function Co(t,i){if(1&t&&(e.TgZ(0,"div",7)(1,"label",95),e.ynx(2),e.SDv(3,96),e.BQk(),e._UZ(4,"cd-helper",16),e.qZA(),e.TgZ(5,"div",10)(6,"select",97),e.YNc(7,mo,2,2,"option",19),e.qZA()()()),2&t){const _=e.oxw();e.xp6(4),e.Q6J("html",_.tooltips.plugins[_.plugin].technique),e.xp6(3),e.Q6J("ngForOf",_.techniques)}}function Mo(t,i){1&t&&(e.TgZ(0,"span",46),e.SDv(1,101),e.qZA())}function ho(t,i){if(1&t&&(e.TgZ(0,"div",7)(1,"label",98),e.ynx(2),e.SDv(3,99),e.BQk(),e._UZ(4,"cd-helper",16),e.qZA(),e.TgZ(5,"div",10),e._UZ(6,"input",100),e.YNc(7,Mo,2,0,"span",12),e.qZA()()),2&t){const _=e.oxw(),o=e.MAs(7);e.xp6(4),e.Q6J("html",_.tooltips.plugins.jerasure.packetSize),e.xp6(3),e.Q6J("ngIf",_.form.showError("packetSize",o,"min"))}}function So(t,i){1&t&&(e.TgZ(0,"option",37),e.SDv(1,102),e.qZA())}function To(t,i){if(1&t&&(e.TgZ(0,"option",51),e._uU(1),e.qZA()),2&t){const _=i.$implicit;e.Q6J("ngValue",_),e.xp6(1),e.hij(" ",_.name," ")}}function Lo(t,i){if(1&t&&(e.TgZ(0,"option",51),e._uU(1),e.qZA()),2&t){const _=i.$implicit;e.Q6J("ngValue",_),e.xp6(1),e.hij(" ",_," ")}}let Ao=(()=>{class t extends T{constructor(_,o,n,s,c){super(),this.formBuilder=_,this.activeModal=o,this.taskWrapper=n,this.ecpService=s,this.actionLabels=c,this.submitAction=new e.vpe,this.tooltips=this.ecpService.formTooltips,this.PLUGIN={LRC:"lrc",SHEC:"shec",CLAY:"clay",JERASURE:"jerasure",ISA:"isa"},this.plugin=this.PLUGIN.JERASURE,this.icons=b.P,this.action=this.actionLabels.CREATE,this.resource="EC Profile",this.createForm(),this.setJerasureDefaults()}createForm(){this.form=this.formBuilder.group({name:[null,[a.kI.required,a.kI.pattern("[A-Za-z0-9_-]+"),E.h.custom("uniqueName",_=>this.names&&-1!==this.names.indexOf(_))]],plugin:[this.PLUGIN.JERASURE,[a.kI.required]],k:[4,[a.kI.required,E.h.custom("max",()=>this.baseValueValidation(!0)),E.h.custom("unequal",_=>this.lrcDataValidation(_)),E.h.custom("kLowerM",_=>this.shecDataValidation(_))]],m:[2,[a.kI.required,E.h.custom("max",()=>this.baseValueValidation())]],crushFailureDomain:"",crushRoot:null,crushDeviceClass:"",directory:"",technique:"reed_sol_van",packetSize:[2048],l:[3,[a.kI.required,E.h.custom("unequal",_=>this.lrcLocalityValidation(_))]],crushLocality:"",c:[2,[a.kI.required,E.h.custom("cGreaterM",_=>this.shecDurabilityValidation(_))]],d:[5,[a.kI.required,E.h.custom("dMin",_=>this.dMinValidation(_)),E.h.custom("dMax",_=>this.dMaxValidation(_))]],scalar_mds:[this.PLUGIN.JERASURE,[a.kI.required]]}),this.toggleDCalc(),this.form.get("k").valueChanges.subscribe(()=>this.updateValidityOnChange(["m","l","d"])),this.form.get("m").valueChanges.subscribe(()=>this.updateValidityOnChange(["k","l","c","d"])),this.form.get("l").valueChanges.subscribe(()=>this.updateValidityOnChange(["k","m"])),this.form.get("plugin").valueChanges.subscribe(_=>this.onPluginChange(_)),this.form.get("scalar_mds").valueChanges.subscribe(()=>this.setClayDefaultsForScalar())}baseValueValidation(_=!1){return this.validValidation(()=>this.getKMSum()>this.deviceCount&&this.form.getValue("k")>this.form.getValue("m")===_)}validValidation(_,o){return!((!this.form||o)&&this.plugin!==o)&&_()}getKMSum(){return this.form.getValue("k")+this.form.getValue("m")}lrcDataValidation(_){return this.validValidation(()=>{const o=this.form.getValue("m"),n=this.form.getValue("l"),s=_+o;return this.lrcMultiK=_/(s/n),_%(s/n)!=0},"lrc")}shecDataValidation(_){return this.validValidation(()=>this.form.getValue("m")>_,"shec")}lrcLocalityValidation(_){return this.validValidation(()=>{const o=this.getKMSum();return this.lrcGroups=_>0?o/_:0,_>0&&o%_!=0},"lrc")}shecDurabilityValidation(_){return this.validValidation(()=>{const o=this.form.getValue("m");return _>o},"shec")}dMinValidation(_){return this.validValidation(()=>this.getDMin()>_,"clay")}getDMin(){return this.form.getValue("k")+1}dMaxValidation(_){return this.validValidation(()=>_>this.getDMax(),"clay")}getDMax(){const _=this.form.getValue("m");return this.form.getValue("k")+_-1}toggleDCalc(){this.dCalc=!this.dCalc,this.form.get("d")[this.dCalc?"disable":"enable"](),this.calculateD()}calculateD(){this.plugin!==this.PLUGIN.CLAY||!this.dCalc||this.form.silentSet("d",this.getDMax())}updateValidityOnChange(_){_.forEach(o=>{"d"===o&&this.calculateD(),this.form.get(o).updateValueAndValidity({emitEvent:!1})})}onPluginChange(_){this.plugin=_,_===this.PLUGIN.JERASURE?this.setJerasureDefaults():_===this.PLUGIN.LRC?this.setLrcDefaults():_===this.PLUGIN.ISA?this.setIsaDefaults():_===this.PLUGIN.SHEC?this.setShecDefaults():_===this.PLUGIN.CLAY&&this.setClayDefaults(),this.updateValidityOnChange(["m"])}setJerasureDefaults(){this.techniques=["reed_sol_van","reed_sol_r6_op","cauchy_orig","cauchy_good","liberation","blaum_roth","liber8tion"],this.setDefaults({k:4,m:2,technique:"reed_sol_van"})}setLrcDefaults(){this.setDefaults({k:4,m:2,l:3})}setIsaDefaults(){this.techniques=["reed_sol_van","cauchy"],this.setDefaults({k:7,m:3,technique:"reed_sol_van"})}setShecDefaults(){this.setDefaults({k:4,m:3,c:2})}setClayDefaults(){this.setDefaults({k:4,m:2,scalar_mds:this.PLUGIN.JERASURE}),this.setClayDefaultsForScalar()}setClayDefaultsForScalar(){const _=this.form.getValue("scalar_mds");let o="reed_sol_van";_===this.PLUGIN.JERASURE?this.techniques=["reed_sol_van","reed_sol_r6_op","cauchy_orig","cauchy_good","liber8tion"]:_===this.PLUGIN.ISA?this.techniques=["reed_sol_van","cauchy"]:(o="single",this.techniques=["single","multiple"]),this.setDefaults({technique:o})}setDefaults(_){Object.keys(_).forEach(o=>{const n=this.form.get(o),s=n.value;n.pristine||"technique"===o&&!this.techniques.includes(s)||"k"===o&&[4,7].includes(s)||"m"===o&&[2,3].includes(s)?n.setValue(_[o]):n.updateValueAndValidity()})}ngOnInit(){this.ecpService.getInfo().subscribe(({plugins:_,names:o,directory:n,nodes:s})=>{this.initCrushNodeSelection(s,this.form.get("crushRoot"),this.form.get("crushFailureDomain"),this.form.get("crushDeviceClass")),this.plugins=_,this.names=o,this.form.silentSet("directory",n),this.preValidateNumericInputFields()})}preValidateNumericInputFields(){const _=["k","m","l","c","d"].map(o=>this.form.get(o));_.forEach(o=>{o.markAsTouched(),o.markAsDirty()}),_[1].updateValueAndValidity()}onSubmit(){if(this.form.invalid)return void this.form.setErrors({cdSubmitButton:!0});const _=this.createJson();this.taskWrapper.wrapTaskAroundCall({task:new v.R("ecp/create",{name:_.name}),call:this.ecpService.create(_)}).subscribe({error:()=>{this.form.setErrors({cdSubmitButton:!0})},complete:()=>{this.activeModal.close(),this.submitAction.emit(_)}})}createJson(){const _={technique:[this.PLUGIN.ISA,this.PLUGIN.JERASURE,this.PLUGIN.CLAY],packetSize:[this.PLUGIN.JERASURE],l:[this.PLUGIN.LRC],crushLocality:[this.PLUGIN.LRC],c:[this.PLUGIN.SHEC],d:[this.PLUGIN.CLAY],scalar_mds:[this.PLUGIN.CLAY]},o=new D_,n=this.form.getValue("plugin");return Object.keys(this.form.controls).filter(s=>{const c=_[s],d=this.form.getValue(s);return(c&&c.includes(n)||!c)&&d&&""!==d}).forEach(s=>{this.extendJson(s,o)}),o}extendJson(_,o){const s=this.form.getValue(_);o[{crushFailureDomain:"crush-failure-domain",crushRoot:"crush-root",crushDeviceClass:"crush-device-class",packetSize:"packetsize",crushLocality:"crush-locality"}[_]||_]="crushRoot"===_?s.name:s}}return t.\u0275fac=function(_){return new(_||t)(e.Y36(ve.O),e.Y36(g.Kz),e.Y36(de.P),e.Y36(Me),e.Y36(M.p4))},t.\u0275cmp=e.Xpm({type:t,selectors:[["cd-erasure-code-profile-form-modal"]],outputs:{submitAction:"submitAction"},features:[e.qOj],decls:98,vars:53,consts:function(){let i,_,o,n,s,c,d,f,p,R,h,S,m,P,A,I,$,D,x,y,Z,U,H,G,z,q,X,w,Q,J,k,V,Y,B,j,K,N,W,ee,_e,oe,te,ie,ne,se,ae,le,re,ce;return i="" + "\ufffd0\ufffd" + " " + "\ufffd1\ufffd" + "",_="Name",o="Plugin",n="Data chunks (k)",s="Coding chunks (m)",c="Crush failure domain",d="Crush root",f="Crush device class",p="Let Ceph decide",R="Available OSDs: " + "\ufffd0\ufffd" + "",h="Directory",S="This field is required!",m="The name can only consist of alphanumeric characters, dashes and underscores.",P="The chosen erasure code profile name is already in use.",A="Loading...",I="This field is required!",$="This field is required!",D="Must be equal to or greater than 2.",x="Chunks (k+m) have exceeded the available OSDs of " + "\ufffd0\ufffd" + ".",y="For an equal distribution k has to be a multiple of (k+m)/l.",Z="K has to be equal to or greater than m in order to recover data correctly through c.",U="Distribution factor: " + "\ufffd0\ufffd" + "",H="This field is required!",G="Must be equal to or greater than 1.",z="Chunks (k+m) have exceeded the available OSDs of " + "\ufffd0\ufffd" + ".",q="Durability estimator (c)",X="Must be equal to or greater than 1.",w="C has to be equal to or lower than m as m defines the amount of chunks that can be used.",Q="Helper chunks (d)",J="Set d manually or use the plugin's default calculation that maximizes d.",k="D is automatically updated on k and m changes",V="D can be set from " + "\ufffd0\ufffd" + " to " + "\ufffd1\ufffd" + "",Y="D can only be set to " + "\ufffd0\ufffd" + "",B="D has to be greater than k (" + "\ufffd0\ufffd" + ").",j="D has to be lower than k + m (" + "\ufffd0\ufffd" + ").",K="Locality (l)",N="Locality groups: " + "\ufffd0\ufffd" + "",W="This field is required!",ee="Must be equal to or greater than 1.",_e="Can't split up chunks (k+m) correctly with the current locality.",oe="Loading...",te="Crush Locality",ie="Loading...",ne="None",se="Scalar mds",ae="Technique",le="Packetsize",re="Must be equal to or greater than 1.",ce="Loading...",[[3,"modalRef"],[1,"modal-title"],i,[1,"modal-content"],["novalidate","",3,"formGroup"],["frm","ngForm"],[1,"modal-body"],[1,"form-group","row"],["for","name",1,"cd-col-form-label"],_,[1,"cd-col-form-input"],["type","text","id","name","name","name","placeholder","Name...","formControlName","name","autofocus","",1,"form-control"],["class","invalid-feedback",4,"ngIf"],["for","plugin",1,"cd-col-form-label"],[1,"required"],o,[3,"html"],["id","plugin","name","plugin","formControlName","plugin",1,"form-select"],["ngValue","",4,"ngIf"],[3,"ngValue",4,"ngFor","ngForOf"],["for","k",1,"cd-col-form-label"],n,["type","number","id","k","name","k","ng-model","$ctrl.erasureCodeProfile.k","placeholder","Data chunks...","formControlName","k","min","2",1,"form-control"],["class","form-text text-muted",4,"ngIf"],["for","m",1,"cd-col-form-label"],s,["type","number","id","m","name","m","placeholder","Coding chunks...","formControlName","m","min","1",1,"form-control"],["class","form-group row",4,"ngIf"],["for","crushFailureDomain",1,"cd-col-form-label"],c,["id","crushFailureDomain","name","crushFailureDomain","formControlName","crushFailureDomain",1,"form-select"],["for","crushRoot",1,"cd-col-form-label"],d,["id","crushRoot","name","crushRoot","formControlName","crushRoot",1,"form-select"],["for","crushDeviceClass",1,"cd-col-form-label"],f,["id","crushDeviceClass","name","crushDeviceClass","formControlName","crushDeviceClass",1,"form-select"],["ngValue",""],p,[1,"form-text","text-muted"],R,["for","directory",1,"cd-col-form-label"],h,["type","text","id","directory","name","directory","placeholder","Path...","formControlName","directory",1,"form-control"],[1,"modal-footer"],[3,"form","submitText","submitActionEvent"],[1,"invalid-feedback"],S,m,P,A,[3,"ngValue"],I,$,D,x,y,Z,U,H,G,z,["for","c",1,"cd-col-form-label"],q,["type","number","id","c","name","c","placeholder","Coding chunks...","formControlName","c","min","1",1,"form-control"],X,w,["for","d",1,"cd-col-form-label"],Q,[1,"input-group"],["type","number","id","d","name","d","placeholder","Helper chunks...","formControlName","d",1,"form-control"],["id","d-calc-btn","ngbTooltip",J,"type","button",1,"btn","btn-light",3,"click"],["aria-hidden","true",3,"ngClass"],[4,"ngIf"],k,V,Y,B,j,["for","l",1,"cd-col-form-label"],K,["type","number","id","l","name","l","placeholder","Coding chunks...","formControlName","l","min","1",1,"form-control"],N,W,ee,_e,oe,["for","crushLocality",1,"cd-col-form-label"],te,["id","crushLocality","name","crushLocality","formControlName","crushLocality",1,"form-select"],ie,ne,["for","scalar_mds",1,"cd-col-form-label"],se,["id","scalar_mds","name","scalar_mds","formControlName","scalar_mds",1,"form-select"],["for","technique",1,"cd-col-form-label"],ae,["id","technique","name","technique","formControlName","technique",1,"form-select"],["for","packetSize",1,"cd-col-form-label"],le,["type","number","id","packetSize","name","packetSize","placeholder","Packetsize...","formControlName","packetSize","min","1",1,"form-control"],re,ce]},template:function(_,o){if(1&_&&(e.TgZ(0,"cd-modal",0),e.ynx(1,1),e.SDv(2,2),e.ALo(3,"titlecase"),e.ALo(4,"upperFirst"),e.BQk(),e.ynx(5,3),e.TgZ(6,"form",4,5)(8,"div",6)(9,"div",7)(10,"label",8),e.SDv(11,9),e.qZA(),e.TgZ(12,"div",10),e._UZ(13,"input",11),e.YNc(14,y_,2,0,"span",12),e.YNc(15,Z_,2,0,"span",12),e.YNc(16,U_,2,0,"span",12),e.qZA()(),e.TgZ(17,"div",7)(18,"label",13)(19,"span",14),e.SDv(20,15),e.qZA(),e._UZ(21,"cd-helper",16),e.qZA(),e.TgZ(22,"div",10)(23,"select",17),e.YNc(24,H_,2,0,"option",18),e.YNc(25,G_,2,2,"option",19),e.qZA(),e.YNc(26,z_,2,0,"span",12),e.qZA()(),e.TgZ(27,"div",7)(28,"label",20)(29,"span",14),e.SDv(30,21),e.qZA(),e._UZ(31,"cd-helper",16),e.qZA(),e.TgZ(32,"div",10),e._UZ(33,"input",22),e.YNc(34,q_,2,0,"span",12),e.YNc(35,X_,2,0,"span",12),e.YNc(36,w_,2,1,"span",12),e.YNc(37,Q_,2,0,"span",12),e.YNc(38,J_,2,0,"span",12),e.YNc(39,k_,2,1,"span",23),e.qZA()(),e.TgZ(40,"div",7)(41,"label",24)(42,"span",14),e.SDv(43,25),e.qZA(),e._UZ(44,"cd-helper",16),e.qZA(),e.TgZ(45,"div",10),e._UZ(46,"input",26),e.YNc(47,V_,2,0,"span",12),e.YNc(48,Y_,2,0,"span",12),e.YNc(49,B_,2,1,"span",12),e.qZA()(),e.YNc(50,W_,9,3,"div",27),e.YNc(51,so,14,6,"div",27),e.YNc(52,co,12,5,"div",27),e.TgZ(53,"div",7)(54,"label",28),e.ynx(55),e.SDv(56,29),e.BQk(),e._UZ(57,"cd-helper",16),e.qZA(),e.TgZ(58,"div",10)(59,"select",30),e.YNc(60,Oo,2,0,"option",18),e.YNc(61,uo,2,3,"option",19),e.qZA()()(),e.YNc(62,go,10,4,"div",27),e.YNc(63,Ro,8,6,"div",27),e.YNc(64,Co,8,2,"div",27),e.YNc(65,ho,8,2,"div",27),e.TgZ(66,"div",7)(67,"label",31),e.ynx(68),e.SDv(69,32),e.BQk(),e._UZ(70,"cd-helper",16),e.qZA(),e.TgZ(71,"div",10)(72,"select",33),e.YNc(73,So,2,0,"option",18),e.YNc(74,To,2,2,"option",19),e.qZA()()(),e.TgZ(75,"div",7)(76,"label",34),e.ynx(77),e.SDv(78,35),e.BQk(),e._UZ(79,"cd-helper",16),e.qZA(),e.TgZ(80,"div",10)(81,"select",36)(82,"option",37),e.SDv(83,38),e.qZA(),e.YNc(84,Lo,2,2,"option",19),e.qZA(),e.TgZ(85,"span",39),e.SDv(86,40),e.qZA()()(),e.TgZ(87,"div",7)(88,"label",41),e.ynx(89),e.SDv(90,42),e.BQk(),e._UZ(91,"cd-helper",16),e.qZA(),e.TgZ(92,"div",10),e._UZ(93,"input",43),e.qZA()()(),e.TgZ(94,"div",44)(95,"cd-form-button-panel",45),e.NdJ("submitActionEvent",function(){return o.onSubmit()}),e.ALo(96,"titlecase"),e.ALo(97,"upperFirst"),e.qZA()()(),e.BQk(),e.qZA()),2&_){const n=e.MAs(7);e.Q6J("modalRef",o.activeModal),e.xp6(4),e.pQV(e.lcZ(3,41,o.action))(e.lcZ(4,43,o.resource)),e.QtT(2),e.xp6(2),e.Q6J("formGroup",o.form),e.xp6(8),e.Q6J("ngIf",o.form.showError("name",n,"required")),e.xp6(1),e.Q6J("ngIf",o.form.showError("name",n,"pattern")),e.xp6(1),e.Q6J("ngIf",o.form.showError("name",n,"uniqueName")),e.xp6(5),e.Q6J("html",o.tooltips.plugins[o.plugin].description),e.xp6(3),e.Q6J("ngIf",!o.plugins),e.xp6(1),e.Q6J("ngForOf",o.plugins),e.xp6(1),e.Q6J("ngIf",o.form.showError("name",n,"required")),e.xp6(5),e.Q6J("html",o.tooltips.k),e.xp6(3),e.Q6J("ngIf",o.form.showError("k",n,"required")),e.xp6(1),e.Q6J("ngIf",o.form.showError("k",n,"min")),e.xp6(1),e.Q6J("ngIf",o.form.showError("k",n,"max")),e.xp6(1),e.Q6J("ngIf",o.form.showError("k",n,"unequal")),e.xp6(1),e.Q6J("ngIf",o.form.showError("k",n,"kLowerM")),e.xp6(1),e.Q6J("ngIf","lrc"===o.plugin),e.xp6(5),e.Q6J("html",o.tooltips.m),e.xp6(3),e.Q6J("ngIf",o.form.showError("m",n,"required")),e.xp6(1),e.Q6J("ngIf",o.form.showError("m",n,"min")),e.xp6(1),e.Q6J("ngIf",o.form.showError("m",n,"max")),e.xp6(1),e.Q6J("ngIf","shec"===o.plugin),e.xp6(1),e.Q6J("ngIf","clay"===o.plugin),e.xp6(1),e.Q6J("ngIf",o.plugin===o.PLUGIN.LRC),e.xp6(5),e.Q6J("html",o.tooltips.crushFailureDomain),e.xp6(3),e.Q6J("ngIf",!o.failureDomains),e.xp6(1),e.Q6J("ngForOf",o.failureDomainKeys),e.xp6(1),e.Q6J("ngIf",o.plugin===o.PLUGIN.LRC),e.xp6(1),e.Q6J("ngIf",o.PLUGIN.CLAY===o.plugin),e.xp6(1),e.Q6J("ngIf",e.kEZ(49,De,o.PLUGIN.JERASURE,o.PLUGIN.ISA,o.PLUGIN.CLAY).includes(o.plugin)),e.xp6(1),e.Q6J("ngIf",o.plugin===o.PLUGIN.JERASURE),e.xp6(5),e.Q6J("html",o.tooltips.crushRoot),e.xp6(3),e.Q6J("ngIf",!o.buckets),e.xp6(1),e.Q6J("ngForOf",o.buckets),e.xp6(5),e.Q6J("html",o.tooltips.crushDeviceClass),e.xp6(5),e.Q6J("ngForOf",o.devices),e.xp6(2),e.pQV(o.deviceCount),e.QtT(86),e.xp6(5),e.Q6J("html",o.tooltips.directory),e.xp6(4),e.Q6J("form",o.form)("submitText",e.lcZ(96,45,o.action)+" "+e.lcZ(97,47,o.resource))}},directives:[$e.z,a._Y,a.JL,Pe.V,a.sg,fe.P,Ee.o,a.Fj,ge.b,a.JJ,a.u,pe.U,C.O5,Re.S,a.EJ,a.YN,a.Kr,C.sg,a.wV,a.qQ,g._L,C.mk,me.p],pipes:[C.rS,Ce.m],styles:[""]}),t})();var Fo=r(7022);class No{constructor(){this.erasureInfo=!1,this.crushInfo=!1,this.pgs=1,this.poolTypes=["erasure","replicated"],this.applications={selected:[],default:["cephfs","rbd","rgw"],available:[],validators:[a.kI.pattern("[A-Za-z0-9_]+"),a.kI.maxLength(128)],messages:new Fo.a({empty:"No applications added",selectionLimit:{text:"Applications limit reached",tooltip:"A pool can only have up to four applications definitions."},customValidations:{pattern:"Allowed characters '_a-zA-Z0-9'",maxlength:"Maximum length is 128 characters"},filter:"Filter or add applications'",add:"Add application"})}}}var xe=r(63285),he=r(47640),bo=r(63622),vo=r(30490),Io=r(60192),ye=r(61350),$o=r(17932),Do=r(60950);const xo=["crushInfoTabs"],yo=["crushDeletionBtn"],Zo=["ecpInfoTabs"],Uo=["ecpDeletionBtn"];function Ho(t,i){1&t&&(e.TgZ(0,"span",41),e.SDv(1,42),e.qZA())}function Go(t,i){1&t&&(e.TgZ(0,"span",41),e.SDv(1,43),e.qZA())}function zo(t,i){1&t&&(e.TgZ(0,"span",41),e.SDv(1,44),e.qZA())}function qo(t,i){1&t&&(e.TgZ(0,"span",41),e.SDv(1,45),e.qZA())}function Xo(t,i){if(1&t&&(e.TgZ(0,"option",46),e._uU(1),e.qZA()),2&t){const _=i.$implicit;e.Q6J("value",_),e.xp6(1),e.hij(" ",_," ")}}function wo(t,i){1&t&&(e.TgZ(0,"span",41),e.SDv(1,47),e.qZA())}function Qo(t,i){if(1&t&&(e.TgZ(0,"option",46),e._uU(1),e.qZA()),2&t){const _=i.$implicit;e.Q6J("value",_),e.xp6(1),e.hij(" ",_," ")}}function Jo(t,i){1&t&&(e.TgZ(0,"span",41),e.SDv(1,58),e.qZA())}function ko(t,i){1&t&&(e.TgZ(0,"span",41),e.SDv(1,59),e.qZA())}function Vo(t,i){1&t&&(e.TgZ(0,"span",41),e.SDv(1,60),e.qZA())}function Yo(t,i){1&t&&(e.TgZ(0,"span",55),e.SDv(1,61),e.qZA())}function Bo(t,i){if(1&t){const _=e.EpF();e.TgZ(0,"div",8)(1,"label",52),e.SDv(2,53),e.qZA(),e.TgZ(3,"div",11)(4,"input",54),e.NdJ("focus",function(){return e.CHM(_),e.oxw(3).externalPgChange=!1})("blur",function(){return e.CHM(_),e.oxw(3).alignPgs()}),e.qZA(),e.YNc(5,Jo,2,0,"span",13),e.YNc(6,ko,2,0,"span",13),e.YNc(7,Vo,2,0,"span",13),e.TgZ(8,"span",55),e._UZ(9,"cd-doc",56),e.qZA(),e.YNc(10,Yo,2,0,"span",57),e.qZA()()}if(2&t){e.oxw(2);const _=e.MAs(2),o=e.oxw();e.xp6(5),e.Q6J("ngIf",o.form.showError("pgNum",_,"required")),e.xp6(1),e.Q6J("ngIf",o.form.showError("pgNum",_,"min")),e.xp6(1),e.Q6J("ngIf",o.form.showError("pgNum",_,"34")),e.xp6(3),e.Q6J("ngIf",o.externalPgChange)}}function jo(t,i){if(1&t&&(e.TgZ(0,"span",41)(1,"ul",66)(2,"li"),e.SDv(3,67),e.qZA(),e.TgZ(4,"li"),e.SDv(5,68),e.qZA()()()),2&t){const _=e.oxw(4);e.xp6(3),e.pQV(_.getMinSize()),e.QtT(3),e.xp6(2),e.pQV(_.getMaxSize()),e.QtT(5)}}function Ko(t,i){if(1&t&&(e.TgZ(0,"span",41),e.SDv(1,69),e.qZA()),2&t){const _=e.oxw(4);e.xp6(1),e.pQV(_.getMinSize())(_.getMaxSize()),e.QtT(1)}}function Wo(t,i){1&t&&(e.TgZ(0,"span",70),e.SDv(1,71),e.qZA())}function et(t,i){if(1&t&&(e.TgZ(0,"div",8)(1,"label",62),e.SDv(2,63),e.qZA(),e.TgZ(3,"div",11),e._UZ(4,"input",64),e.YNc(5,jo,6,2,"span",13),e.YNc(6,Ko,2,2,"span",13),e.YNc(7,Wo,2,0,"span",65),e.qZA()()),2&t){e.oxw(2);const _=e.MAs(2),o=e.oxw();e.xp6(4),e.Q6J("max",o.getMaxSize())("min",o.getMinSize()),e.xp6(1),e.Q6J("ngIf",o.form.showError("size",_)),e.xp6(1),e.Q6J("ngIf",o.form.showError("size",_)),e.xp6(1),e.Q6J("ngIf",1===o.form.getValue("size"))}}function _t(t,i){1&t&&(e.TgZ(0,"div",8)(1,"label",72),e.SDv(2,73),e.qZA(),e.TgZ(3,"div",11)(4,"div",74),e._UZ(5,"input",75),e.TgZ(6,"label",76),e.SDv(7,77),e.qZA()()()())}function ot(t,i){if(1&t&&(e.TgZ(0,"div")(1,"div",8)(2,"label",48),e.SDv(3,49),e.qZA(),e.TgZ(4,"div",11)(5,"select",50),e.YNc(6,Qo,2,2,"option",19),e.qZA()()(),e.YNc(7,Bo,11,4,"div",51),e.YNc(8,et,8,5,"div",51),e.YNc(9,_t,8,0,"div",51),e.qZA()),2&t){const _=e.oxw(2);e.xp6(6),e.Q6J("ngForOf",_.pgAutoscaleModes),e.xp6(1),e.Q6J("ngIf","on"!==_.form.getValue("pgAutoscaleMode")),e.xp6(1),e.Q6J("ngIf",_.isReplicated),e.xp6(1),e.Q6J("ngIf",_.info.is_all_bluestore&&_.isErasure)}}function tt(t,i){if(1&t&&e._UZ(0,"i",78),2&t){const _=e.oxw(2);e.Gre("",_.icons.warning," icon-warning-color")}}function it(t,i){1&t&&(e.TgZ(0,"option",17),e.SDv(1,92),e.qZA())}function nt(t,i){1&t&&(e.TgZ(0,"option",93),e.SDv(1,94),e.qZA()),2&t&&e.Q6J("ngValue",null)}function st(t,i){1&t&&(e.TgZ(0,"option",93),e.SDv(1,95),e.qZA()),2&t&&e.Q6J("ngValue",null)}function at(t,i){if(1&t&&(e.TgZ(0,"option",93),e._uU(1),e.qZA()),2&t){const _=i.$implicit;e.Q6J("ngValue",_),e.xp6(1),e.hij(" ",_.name," ")}}const F=function(t){return[t]};function lt(t,i){if(1&t){const _=e.EpF();e.TgZ(0,"button",96),e.NdJ("click",function(){return e.CHM(_),e.oxw(4).addErasureCodeProfile()}),e._UZ(1,"i",88),e.qZA()}if(2&t){const _=e.oxw(4);e.xp6(1),e.Q6J("ngClass",e.VKq(1,F,_.icons.add))}}function rt(t,i){if(1&t){const _=e.EpF();e.TgZ(0,"button",97,98),e.NdJ("click",function(){return e.CHM(_),e.oxw(4).deleteErasureCodeProfile()}),e._UZ(2,"i",88),e.qZA()}if(2&t){const _=e.oxw(4);e.xp6(2),e.Q6J("ngClass",e.VKq(1,F,_.icons.trash))}}const ct=function(){return["name"]};function Ot(t,i){if(1&t&&e._UZ(0,"cd-table-key-value",109),2&t){const _=e.oxw(5);e.Q6J("renderObjects",!0)("hideKeys",e.DdM(4,ct))("data",_.form.getValue("erasureProfile"))("autoReload",!1)}}function dt(t,i){1&t&&(e.TgZ(0,"span"),e.SDv(1,112),e.qZA())}function ut(t,i){if(1&t&&(e.TgZ(0,"li"),e._uU(1),e.qZA()),2&t){const _=i.$implicit;e.xp6(1),e.hij(" ",_," ")}}function Pt(t,i){if(1&t&&(e.TgZ(0,"ul"),e.YNc(1,ut,2,1,"li",113),e.qZA()),2&t){const _=e.oxw(6);e.xp6(1),e.Q6J("ngForOf",_.ecpUsage)}}function ft(t,i){if(1&t&&(e.YNc(0,dt,2,0,"ng-template",null,110,e.W1O),e.YNc(2,Pt,2,1,"ul",111)),2&t){const _=e.MAs(1),o=e.oxw(5);e.xp6(2),e.Q6J("ngIf",o.ecpUsage)("ngIfElse",_)}}function Et(t,i){if(1&t&&(e.TgZ(0,"span",99)(1,"nav",100,101),e.ynx(3,102),e.TgZ(4,"a",103),e.SDv(5,104),e.qZA(),e.YNc(6,Ot,1,5,"ng-template",105),e.BQk(),e.ynx(7,106),e.TgZ(8,"a",103),e.SDv(9,107),e.qZA(),e.YNc(10,ft,3,2,"ng-template",105),e.BQk(),e.qZA(),e._UZ(11,"div",108),e.qZA()),2&t){const _=e.MAs(2);e.xp6(11),e.Q6J("ngbNavOutlet",_)}}const Ze=function(t){return{active:t}};function gt(t,i){if(1&t){const _=e.EpF();e.TgZ(0,"div",8)(1,"label",80),e.SDv(2,81),e.qZA(),e.TgZ(3,"div",11)(4,"div",82)(5,"select",83),e.YNc(6,it,2,0,"option",84),e.YNc(7,nt,2,1,"option",85),e.YNc(8,st,2,1,"option",85),e.YNc(9,at,2,2,"option",86),e.qZA(),e.TgZ(10,"button",87),e.NdJ("click",function(){e.CHM(_);const n=e.oxw(3);return n.data.erasureInfo=!n.data.erasureInfo}),e._UZ(11,"i",88),e.qZA(),e.YNc(12,lt,2,3,"button",89),e.YNc(13,rt,3,3,"button",90),e.qZA(),e.YNc(14,Et,12,1,"span",91),e.qZA()()}if(2&t){const _=e.oxw(3);e.xp6(6),e.Q6J("ngIf",!_.ecProfiles),e.xp6(1),e.Q6J("ngIf",_.ecProfiles&&0===_.ecProfiles.length),e.xp6(1),e.Q6J("ngIf",_.ecProfiles&&_.ecProfiles.length>0),e.xp6(1),e.Q6J("ngForOf",_.ecProfiles),e.xp6(1),e.Q6J("ngClass",e.VKq(9,Ze,_.data.erasureInfo)),e.xp6(1),e.Q6J("ngClass",e.VKq(11,F,_.icons.questionCircle)),e.xp6(1),e.Q6J("ngIf",!_.editing),e.xp6(1),e.Q6J("ngIf",!_.editing),e.xp6(1),e.Q6J("ngIf",_.data.erasureInfo&&_.form.getValue("erasureProfile"))}}function pt(t,i){1&t&&(e.TgZ(0,"div",8)(1,"label",114),e.SDv(2,115),e.qZA(),e.TgZ(3,"div",11)(4,"span",55),e.SDv(5,116),e.qZA()()())}function Rt(t,i){1&t&&(e.TgZ(0,"span",55)(1,"span"),e.SDv(2,119),e.qZA(),e._uU(3,"\xa0 "),e.qZA())}function mt(t,i){if(1&t&&(e.TgZ(0,"option",93),e._uU(1),e.qZA()),2&t){const _=i.$implicit;e.Q6J("ngValue",_),e.xp6(1),e.hij(" ",_.rule_name," ")}}function Ct(t,i){if(1&t){const _=e.EpF();e.TgZ(0,"button",96),e.NdJ("click",function(){return e.CHM(_),e.oxw(5).addCrushRule()}),e._UZ(1,"i",88),e.qZA()}if(2&t){const _=e.oxw(5);e.xp6(1),e.Q6J("ngClass",e.VKq(1,F,_.icons.add))}}function Mt(t,i){if(1&t){const _=e.EpF();e.TgZ(0,"button",126,127),e.NdJ("click",function(){return e.CHM(_),e.oxw(5).deleteCrushRule()}),e._UZ(2,"i",88),e.qZA()}if(2&t){const _=e.oxw(5);e.xp6(2),e.Q6J("ngClass",e.VKq(1,F,_.icons.trash))}}const ht=function(){return["steps","type","rule_name"]};function St(t,i){if(1&t&&e._UZ(0,"cd-table-key-value",109),2&t){const _=e.oxw(6);e.Q6J("renderObjects",!1)("hideKeys",e.DdM(4,ht))("data",_.form.getValue("crushRule"))("autoReload",!1)}}function Tt(t,i){if(1&t&&(e.TgZ(0,"li"),e._uU(1),e.qZA()),2&t){const _=i.$implicit,o=e.oxw(7);e.xp6(1),e.hij(" ",o.describeCrushStep(_)," ")}}function Lt(t,i){if(1&t&&(e.TgZ(0,"ol"),e.YNc(1,Tt,2,1,"li",113),e.qZA()),2&t){const _=e.oxw(6);e.xp6(1),e.Q6J("ngForOf",_.form.get("crushRule").value.steps)}}function At(t,i){1&t&&(e.TgZ(0,"span"),e.SDv(1,136),e.qZA())}function Ft(t,i){if(1&t&&(e.TgZ(0,"li"),e._uU(1),e.qZA()),2&t){const _=i.$implicit;e.xp6(1),e.hij(" ",_," ")}}function Nt(t,i){if(1&t&&(e.TgZ(0,"ul"),e.YNc(1,Ft,2,1,"li",113),e.qZA()),2&t){const _=e.oxw(7);e.xp6(1),e.Q6J("ngForOf",_.crushUsage)}}function bt(t,i){if(1&t&&(e.YNc(0,At,2,0,"ng-template",null,135,e.W1O),e.YNc(2,Nt,2,1,"ul",111)),2&t){const _=e.MAs(1),o=e.oxw(6);e.xp6(2),e.Q6J("ngIf",o.crushUsage)("ngIfElse",_)}}function vt(t,i){if(1&t&&(e.TgZ(0,"div",128)(1,"nav",100,129),e.ynx(3,130),e.TgZ(4,"a",103),e.SDv(5,131),e.qZA(),e.YNc(6,St,1,5,"ng-template",105),e.BQk(),e.ynx(7,132),e.TgZ(8,"a",103),e.SDv(9,133),e.qZA(),e.YNc(10,Lt,2,1,"ng-template",105),e.BQk(),e.ynx(11,106),e.TgZ(12,"a",103),e.SDv(13,134),e.qZA(),e.YNc(14,bt,3,2,"ng-template",105),e.BQk(),e.qZA(),e._UZ(15,"div",108),e.qZA()),2&t){const _=e.MAs(2);e.xp6(15),e.Q6J("ngbNavOutlet",_)}}function It(t,i){1&t&&(e.TgZ(0,"span",41),e.SDv(1,137),e.qZA())}function $t(t,i){1&t&&(e.TgZ(0,"span",41),e.SDv(1,138),e.qZA())}function Dt(t,i){if(1&t){const _=e.EpF();e.TgZ(0,"div")(1,"div",120)(2,"select",121)(3,"option",93),e.SDv(4,122),e.qZA(),e.YNc(5,mt,2,2,"option",86),e.qZA(),e.TgZ(6,"button",123),e.NdJ("click",function(){e.CHM(_);const n=e.oxw(4);return n.data.crushInfo=!n.data.crushInfo}),e._UZ(7,"i",88),e.qZA(),e.YNc(8,Ct,2,3,"button",89),e.YNc(9,Mt,3,3,"button",124),e.qZA(),e.YNc(10,vt,16,1,"div",125),e.YNc(11,It,2,0,"span",13),e.YNc(12,$t,2,0,"span",13),e.qZA()}if(2&t){e.oxw(3);const _=e.MAs(2),o=e.oxw();e.xp6(3),e.Q6J("ngValue",null),e.xp6(2),e.Q6J("ngForOf",o.current.rules),e.xp6(1),e.Q6J("ngClass",e.VKq(9,Ze,o.data.crushInfo)),e.xp6(1),e.Q6J("ngClass",e.VKq(11,F,o.icons.questionCircle)),e.xp6(1),e.Q6J("ngIf",o.isReplicated&&!o.editing),e.xp6(1),e.Q6J("ngIf",o.isReplicated&&!o.editing),e.xp6(1),e.Q6J("ngIf",o.data.crushInfo&&o.form.getValue("crushRule")),e.xp6(1),e.Q6J("ngIf",o.form.showError("crushRule",_,"required")),e.xp6(1),e.Q6J("ngIf",o.form.showError("crushRule",_,"tooFewOsds"))}}function xt(t,i){if(1&t&&(e.TgZ(0,"div",8)(1,"label",114),e.SDv(2,117),e.qZA(),e.TgZ(3,"div",11),e.YNc(4,Rt,4,0,"ng-template",null,118,e.W1O),e.YNc(6,Dt,13,13,"div",111),e.qZA()()),2&t){const _=e.MAs(5),o=e.oxw(3);e.xp6(6),e.Q6J("ngIf",o.current.rules.length>0)("ngIfElse",_)}}function yt(t,i){if(1&t&&(e.TgZ(0,"div")(1,"legend"),e.SDv(2,79),e.qZA(),e.YNc(3,gt,15,13,"div",51),e.YNc(4,pt,6,0,"div",51),e.YNc(5,xt,7,2,"div",51),e.qZA()),2&t){const _=e.oxw(2);e.xp6(3),e.Q6J("ngIf",_.isErasure),e.xp6(1),e.Q6J("ngIf",_.isErasure&&!_.editing),e.xp6(1),e.Q6J("ngIf",_.isReplicated||_.editing)}}function Zt(t,i){if(1&t&&(e.TgZ(0,"option",46),e._uU(1),e.qZA()),2&t){const _=i.$implicit;e.Q6J("value",_),e.xp6(1),e.hij(" ",_," ")}}function Ut(t,i){1&t&&(e.TgZ(0,"option",17),e.SDv(1,156),e.qZA())}function Ht(t,i){1&t&&(e.TgZ(0,"option",17),e.SDv(1,157),e.qZA())}function Gt(t,i){if(1&t&&(e.TgZ(0,"option",46),e._uU(1),e.qZA()),2&t){const _=i.$implicit;e.Q6J("value",_),e.xp6(1),e.hij(" ",_," ")}}function zt(t,i){1&t&&(e.TgZ(0,"span",41),e.SDv(1,158),e.qZA())}function qt(t,i){1&t&&(e.TgZ(0,"span",41),e.SDv(1,159),e.qZA())}function Xt(t,i){1&t&&(e.TgZ(0,"span",41),e.SDv(1,160),e.qZA())}function wt(t,i){1&t&&(e.TgZ(0,"span",41),e.SDv(1,161),e.qZA())}function Qt(t,i){1&t&&(e.TgZ(0,"span",41),e.SDv(1,162),e.qZA())}function Jt(t,i){if(1&t&&(e.TgZ(0,"div")(1,"div",8)(2,"label",144),e.SDv(3,145),e.qZA(),e.TgZ(4,"div",11)(5,"select",146),e.YNc(6,Ut,2,0,"option",84),e.YNc(7,Ht,2,0,"option",84),e.YNc(8,Gt,2,2,"option",19),e.qZA()()(),e.TgZ(9,"div",8)(10,"label",147),e.SDv(11,148),e.qZA(),e.TgZ(12,"div",11),e._UZ(13,"input",149),e.YNc(14,zt,2,0,"span",13),e.YNc(15,qt,2,0,"span",13),e.qZA()(),e.TgZ(16,"div",8)(17,"label",150),e.SDv(18,151),e.qZA(),e.TgZ(19,"div",11),e._UZ(20,"input",152),e.YNc(21,Xt,2,0,"span",13),e.YNc(22,wt,2,0,"span",13),e.qZA()(),e.TgZ(23,"div",8)(24,"label",153),e.SDv(25,154),e.qZA(),e.TgZ(26,"div",11),e._UZ(27,"input",155),e.YNc(28,Qt,2,0,"span",13),e.qZA()()()),2&t){e.oxw(2);const _=e.MAs(2),o=e.oxw();e.xp6(6),e.Q6J("ngIf",!o.info.compression_algorithms),e.xp6(1),e.Q6J("ngIf",o.info.compression_algorithms&&0===o.info.compression_algorithms.length),e.xp6(1),e.Q6J("ngForOf",o.info.compression_algorithms),e.xp6(6),e.Q6J("ngIf",o.form.showError("minBlobSize",_,"min")),e.xp6(1),e.Q6J("ngIf",o.form.showError("minBlobSize",_,"maximum")),e.xp6(6),e.Q6J("ngIf",o.form.showError("maxBlobSize",_,"min")),e.xp6(1),e.Q6J("ngIf",o.form.showError("maxBlobSize",_,"minimum")),e.xp6(6),e.Q6J("ngIf",o.form.showError("ratio",_,"min")||o.form.showError("ratio",_,"max"))}}function kt(t,i){if(1&t&&(e.TgZ(0,"div",139)(1,"legend"),e.SDv(2,140),e.qZA(),e.TgZ(3,"div",8)(4,"label",141),e.SDv(5,142),e.qZA(),e.TgZ(6,"div",11)(7,"select",143),e.YNc(8,Zt,2,2,"option",19),e.qZA()()(),e.YNc(9,Jt,29,8,"div",20),e.qZA()),2&t){const _=e.oxw(2);e.xp6(8),e.Q6J("ngForOf",_.info.compression_modes),e.xp6(1),e.Q6J("ngIf",_.hasCompressionEnabled())}}function Vt(t,i){1&t&&(e.TgZ(0,"span",41),e.SDv(1,163),e.qZA())}function Yt(t,i){if(1&t){const _=e.EpF();e.TgZ(0,"div",1)(1,"form",2,3)(3,"div",4)(4,"div",5),e.SDv(5,6),e.ALo(6,"titlecase"),e.ALo(7,"upperFirst"),e.qZA(),e.TgZ(8,"div",7)(9,"div",8)(10,"label",9),e.SDv(11,10),e.qZA(),e.TgZ(12,"div",11),e._UZ(13,"input",12),e.YNc(14,Ho,2,0,"span",13),e.YNc(15,Go,2,0,"span",13),e.YNc(16,zo,2,0,"span",13),e.YNc(17,qo,2,0,"span",13),e.qZA()(),e.TgZ(18,"div",8)(19,"label",14),e.SDv(20,15),e.qZA(),e.TgZ(21,"div",11)(22,"select",16)(23,"option",17),e.SDv(24,18),e.qZA(),e.YNc(25,Xo,2,2,"option",19),e.qZA(),e.YNc(26,wo,2,0,"span",13),e.qZA()(),e.YNc(27,ot,10,4,"div",20),e.TgZ(28,"div",8)(29,"label",21),e.SDv(30,22),e.qZA(),e.TgZ(31,"div",11)(32,"cd-select-badges",23),e.NdJ("selection",function(){return e.CHM(_),e.oxw().appSelection()}),e.qZA(),e.YNc(33,tt,1,3,"i",24),e.qZA()(),e.YNc(34,yt,6,3,"div",20),e.YNc(35,kt,10,2,"div",25),e.TgZ(36,"div")(37,"legend"),e.SDv(38,26),e.qZA(),e.TgZ(39,"div",8)(40,"label",27),e.ynx(41),e.SDv(42,28),e.BQk(),e.TgZ(43,"cd-helper")(44,"span"),e.SDv(45,29),e.qZA(),e._UZ(46,"br"),e.TgZ(47,"span"),e.SDv(48,30),e.qZA()()(),e.TgZ(49,"div",11),e._UZ(50,"input",31),e.qZA()(),e.TgZ(51,"div",8)(52,"label",32),e.ynx(53),e.SDv(54,33),e.BQk(),e.TgZ(55,"cd-helper")(56,"span"),e.SDv(57,34),e.qZA(),e._UZ(58,"br"),e.TgZ(59,"span"),e.SDv(60,35),e.qZA()()(),e.TgZ(61,"div",11),e._UZ(62,"input",36),e.YNc(63,Vt,2,0,"span",13),e.qZA()()(),e.TgZ(64,"div",37)(65,"cd-rbd-configuration-form",38),e.NdJ("changes",function(n){return e.CHM(_),e.oxw().currentConfigurationValues=n()}),e.qZA()()(),e.TgZ(66,"div",39)(67,"cd-form-button-panel",40),e.NdJ("submitActionEvent",function(){return e.CHM(_),e.oxw().submit()}),e.ALo(68,"titlecase"),e.ALo(69,"upperFirst"),e.qZA()()()()()}if(2&t){const _=e.MAs(2),o=e.oxw();e.xp6(1),e.Q6J("formGroup",o.form),e.xp6(6),e.pQV(e.lcZ(6,25,o.action))(e.lcZ(7,27,o.resource)),e.QtT(5),e.xp6(7),e.Q6J("ngIf",o.form.showError("name",_,"required")),e.xp6(1),e.Q6J("ngIf",o.form.showError("name",_,"uniqueName")),e.xp6(1),e.Q6J("ngIf",o.form.showError("name",_,"rbdPool")),e.xp6(1),e.Q6J("ngIf",o.form.showError("name",_,"pattern")),e.xp6(8),e.Q6J("ngForOf",o.data.poolTypes),e.xp6(1),e.Q6J("ngIf",o.form.showError("poolType",_,"required")),e.xp6(1),e.Q6J("ngIf",o.isReplicated||o.isErasure),e.xp6(5),e.Q6J("customBadges",!0)("customBadgeValidators",o.data.applications.validators)("messages",o.data.applications.messages)("data",o.data.applications.selected)("options",o.data.applications.available)("selectionLimit",4),e.xp6(1),e.Q6J("ngIf",o.data.applications.selected<=0),e.xp6(1),e.Q6J("ngIf",o.isErasure||o.isReplicated),e.xp6(1),e.Q6J("ngIf",o.info.is_all_bluestore),e.xp6(28),e.Q6J("ngIf",o.form.showError("max_objects",_,"min")),e.xp6(1),e.Q6J("hidden",o.isErasure||-1===o.data.applications.selected.indexOf("rbd")),e.xp6(1),e.Q6J("form",o.form)("initializeData",o.initializeConfigData),e.xp6(2),e.Q6J("form",o.form)("submitText",e.lcZ(68,29,o.action)+" "+e.lcZ(69,31,o.resource))}}let Ue=(()=>{class t extends R_.E{constructor(_,o,n,s,c,d,f,p,R,h,S){super(),this.dimlessBinaryPipe=_,this.route=o,this.router=n,this.modalService=s,this.poolService=c,this.authStorageService=d,this.formatter=f,this.taskWrapper=p,this.ecpService=R,this.crushRuleService=h,this.actionLabels=S,this.editing=!1,this.isReplicated=!1,this.isErasure=!1,this.data=new No,this.externalPgChange=!1,this.current={rules:[]},this.initializeConfigData=new E_.t(1),this.currentConfigurationValues={},this.icons=b.P,this.crushUsage=void 0,this.ecpUsage=void 0,this.crushRuleMaxSize=10,this.editing=this.router.url.startsWith(`/pool/${M.MQ.EDIT}`),this.action=this.editing?this.actionLabels.EDIT:this.actionLabels.CREATE,this.resource="pool",this.authenticate(),this.createForm()}authenticate(){if(this.permission=this.authStorageService.getPermissions().pool,!this.permission.read||!this.permission.update&&this.editing||!this.permission.create&&!this.editing)throw new g_._2}createForm(){const _=new be.d({mode:new a.NI("none"),algorithm:new a.NI(""),minBlobSize:new a.NI("",{updateOn:"blur"}),maxBlobSize:new a.NI("",{updateOn:"blur"}),ratio:new a.NI("",{updateOn:"blur"})});this.form=new be.d({name:new a.NI("",{validators:[a.kI.pattern(/^[.A-Za-z0-9_/-]+$/),a.kI.required,E.h.custom("rbdPool",()=>this.form&&this.form.getValue("name").includes("/")&&this.data&&-1!==this.data.applications.selected.indexOf("rbd"))]}),poolType:new a.NI("",{validators:[a.kI.required]}),crushRule:new a.NI(null,{validators:[E.h.custom("tooFewOsds",o=>this.info&&o&&this.info.osd_count<1),E.h.custom("required",o=>this.isReplicated&&this.info.crush_rules_replicated.length>0&&!o)]}),size:new a.NI("",{updateOn:"blur"}),erasureProfile:new a.NI(null),pgNum:new a.NI("",{validators:[a.kI.required]}),pgAutoscaleMode:new a.NI(null),ecOverwrites:new a.NI(!1),compression:_,max_bytes:new a.NI(""),max_objects:new a.NI(0)},[E.h.custom("form",()=>null)])}ngOnInit(){this.poolService.getInfo().subscribe(_=>{this.initInfo(_),this.editing?this.initEditMode():(this.setAvailableApps(),this.loadingReady()),this.listenToChanges(),this.setComplexValidators()})}initInfo(_){this.pgAutoscaleModes=_.pg_autoscale_modes,this.form.silentSet("pgAutoscaleMode",_.pg_autoscale_default_mode),this.form.silentSet("algorithm",_.bluestore_compression_algorithm),this.info=_,this.initEcp(_.erasure_code_profiles)}initEcp(_){this.setListControlStatus("erasureProfile",_),this.ecProfiles=_}setListControlStatus(_,o){const n=this.form.get(_),s=n.value;1!==o.length||s&&u().isEqual(s,o[0])?0===o.length&&s&&n.setValue(null):n.setValue(o[0]),o.length<=1?n.enabled&&n.disable():n.disabled&&n.enable()}initEditMode(){this.disableForEdit(),this.routeParamsSubscribe=this.route.params.subscribe(_=>this.poolService.get(_.name).subscribe(o=>{this.data.pool=o,this.initEditFormData(o),this.loadingReady()}))}disableForEdit(){["poolType","crushRule","size","erasureProfile","ecOverwrites"].forEach(_=>this.form.get(_).disable())}initEditFormData(_){this.initializeConfigData.next({initialData:_.configuration,sourceType:m_.h.pool}),this.poolTypeChange(_.type);const o=this.info.crush_rules_replicated.concat(this.info.crush_rules_erasure),n={name:_.pool_name,poolType:_.type,crushRule:o.find(s=>s.rule_name===_.crush_rule),size:_.size,erasureProfile:this.ecProfiles.find(s=>s.name===_.erasure_code_profile),pgAutoscaleMode:_.pg_autoscale_mode,pgNum:_.pg_num,ecOverwrites:_.flags_names.includes("ec_overwrites"),mode:_.options.compression_mode,algorithm:_.options.compression_algorithm,minBlobSize:this.dimlessBinaryPipe.transform(_.options.compression_min_blob_size),maxBlobSize:this.dimlessBinaryPipe.transform(_.options.compression_max_blob_size),ratio:_.options.compression_required_ratio,max_bytes:this.dimlessBinaryPipe.transform(_.quota_max_bytes),max_objects:_.quota_max_objects};Object.keys(n).forEach(s=>{const c=n[s];!u().isUndefined(c)&&""!==c&&this.form.silentSet(s,c)}),this.data.pgs=this.form.getValue("pgNum"),this.setAvailableApps(this.data.applications.default.concat(_.application_metadata)),this.data.applications.selected=_.application_metadata}setAvailableApps(_=this.data.applications.default){this.data.applications.available=u().uniq(_.sort()).map(o=>new p_.$(!1,o,""))}listenToChanges(){this.listenToChangesDuringAddEdit(),this.editing||this.listenToChangesDuringAdd()}listenToChangesDuringAddEdit(){this.form.get("pgNum").valueChanges.subscribe(_=>{const o=_-this.data.pgs;1===Math.abs(o)&&2!==_?this.doPgPowerJump(o):this.data.pgs=_})}doPgPowerJump(_){const o=this.calculatePgPower()+_;this.setPgs(-1===_?Math.round(o):Math.floor(o))}calculatePgPower(_=this.form.getValue("pgNum")){return Math.log(_)/Math.log(2)}setPgs(_){const o=Math.pow(2,_<0?0:_);this.data.pgs=o,this.form.silentSet("pgNum",o)}listenToChangesDuringAdd(){this.form.get("poolType").valueChanges.subscribe(_=>{this.poolTypeChange(_)}),this.form.get("crushRule").valueChanges.subscribe(_=>{this.crushDeletionBtn&&this.crushDeletionBtn.isOpen()&&this.crushDeletionBtn.close(),_&&(this.setCorrectMaxSize(_),this.crushRuleIsUsedBy(_.rule_name),this.replicatedRuleChange(),this.pgCalc())}),this.form.get("size").valueChanges.subscribe(()=>{this.pgCalc()}),this.form.get("erasureProfile").valueChanges.subscribe(_=>{this.ecpDeletionBtn&&this.ecpDeletionBtn.isOpen()&&this.ecpDeletionBtn.close(),_&&(this.ecpIsUsedBy(_.name),this.pgCalc())}),this.form.get("mode").valueChanges.subscribe(()=>{["minBlobSize","maxBlobSize","ratio"].forEach(_=>{this.form.get(_).updateValueAndValidity({emitEvent:!1})})}),this.form.get("minBlobSize").valueChanges.subscribe(()=>{this.form.get("maxBlobSize").updateValueAndValidity({emitEvent:!1})}),this.form.get("maxBlobSize").valueChanges.subscribe(()=>{this.form.get("minBlobSize").updateValueAndValidity({emitEvent:!1})})}poolTypeChange(_){if("replicated"===_?this.setTypeBooleans(!0,!1):this.setTypeBooleans(!1,"erasure"===_),!_||!this.info)return void(this.current.rules=[]);const o=this.info["crush_rules_"+_]||[];this.current.rules=o,!this.editing&&(this.isReplicated&&this.setListControlStatus("crushRule",o),this.replicatedRuleChange(),this.pgCalc())}setTypeBooleans(_,o){this.isReplicated=_,this.isErasure=o}replicatedRuleChange(){if(!this.isReplicated)return;const _=this.form.get("size");let o=this.form.getValue("size")||3;const n=this.getMinSize(),s=this.getMaxSize();o<n?o=n:o>s&&(o=s),o!==_.value&&this.form.silentSet("size",o)}getMinSize(){return!this.info||this.info.osd_count<1?0:1}getMaxSize(){const _=this.form.getValue("crushRule");return this.info?_?_.usable_size:Math.min(this.info.osd_count,3):0}pgCalc(){const _=this.form.getValue("poolType");if(!this.info||this.form.get("pgNum").dirty||!_)return;const o=100*this.info.osd_count,n=this.isReplicated?this.replicatedPgCalc(o):this.erasurePgCalc(o);if(!n)return;const s=this.data.pgs;this.alignPgs(n),this.externalPgChange||(this.externalPgChange=s!==this.data.pgs)}setCorrectMaxSize(_=this.form.getValue("crushRule")){if(!_)return;const n=T.searchFailureDomains(this.info.nodes,_.steps[0].item_name)[_.steps[1].type];_.usable_size=Math.min(n?n.length:this.crushRuleMaxSize,this.crushRuleMaxSize)}replicatedPgCalc(_){const o=this.form.get("size"),n=o.value;return o.valid&&n>0?_/n:0}erasurePgCalc(_){const o=this.form.get("erasureProfile"),n=o.value;return(o.valid||o.disabled)&&n?_/(n.k+n.m):0}alignPgs(_=this.form.getValue("pgNum")){this.setPgs(Math.round(this.calculatePgPower(_<1?1:_)))}setComplexValidators(){this.editing?this.form.get("name").setValidators([this.form.get("name").validator,E.h.custom("uniqueName",_=>this.data.pool&&this.info&&-1!==this.info.pool_names.indexOf(_)&&this.info.pool_names.indexOf(_)!==this.info.pool_names.indexOf(this.data.pool.pool_name))]):(E.h.validateIf(this.form.get("size"),()=>this.isReplicated,[E.h.custom("min",_=>this.form.getValue("size")&&_<this.getMinSize()),E.h.custom("max",_=>this.form.getValue("size")&&this.getMaxSize()<_)]),this.form.get("name").setValidators([this.form.get("name").validator,E.h.custom("uniqueName",_=>this.info&&-1!==this.info.pool_names.indexOf(_))])),this.setCompressionValidators()}setCompressionValidators(){E.h.validateIf(this.form.get("minBlobSize"),()=>this.hasCompressionEnabled(),[a.kI.min(0),E.h.custom("maximum",_=>this.oddBlobSize(_,this.form.getValue("maxBlobSize")))]),E.h.validateIf(this.form.get("maxBlobSize"),()=>this.hasCompressionEnabled(),[a.kI.min(0),E.h.custom("minimum",_=>this.oddBlobSize(this.form.getValue("minBlobSize"),_))]),E.h.validateIf(this.form.get("ratio"),()=>this.hasCompressionEnabled(),[a.kI.min(0),a.kI.max(1)])}oddBlobSize(_,o){const n=this.formatter.toBytes(_),s=this.formatter.toBytes(o);return Boolean(n&&s&&n>=s)}hasCompressionEnabled(){return this.form.getValue("mode")&&"none"!==this.form.get("mode").value.toLowerCase()}describeCrushStep(_){return[_.op.replace("_"," "),_.item_name||"",_.type?_.num+" type "+_.type:""].join(" ")}addErasureCodeProfile(){this.addModal(Ao,_=>this.reloadECPs(_))}addModal(_,o){this.hideOpenTooltips(),this.modalService.show(_).componentInstance.submitAction.subscribe(s=>{o(s.name)})}hideOpenTooltips(){const _=o=>o&&o.isOpen()&&o.close();_(this.ecpDeletionBtn),_(this.crushDeletionBtn)}reloadECPs(_){this.reloadList({newItemName:_,getInfo:()=>this.ecpService.list(),initInfo:o=>this.initEcp(o),findNewItem:()=>this.ecProfiles.find(o=>o.name===_),controlName:"erasureProfile"})}reloadList({newItemName:_,getInfo:o,initInfo:n,findNewItem:s,controlName:c}){this.modalSubscription&&this.modalSubscription.unsubscribe(),o().subscribe(d=>{if(n(d),!_)return;const f=s();f&&this.form.get(c).setValue(f)})}deleteErasureCodeProfile(){this.deletionModal({value:this.form.getValue("erasureProfile"),usage:this.ecpUsage,deletionBtn:this.ecpDeletionBtn,dataName:"erasureInfo",getTabs:()=>this.ecpInfoTabs,tabPosition:"used-by-pools",nameAttribute:"name",itemDescription:"erasure code profile",reloadFn:()=>this.reloadECPs(),deleteFn:_=>this.ecpService.delete(_),taskName:"ecp/delete"})}deletionModal({value:_,usage:o,deletionBtn:n,dataName:s,getTabs:c,tabPosition:d,nameAttribute:f,itemDescription:p,reloadFn:R,deleteFn:h,taskName:S}){if(!_)return;if(o)return n.animation=!1,n.toggle(),this.data[s]=!0,void setTimeout(()=>{const P=c();P&&P.select(d)},50);const m=_[f];this.modalService.show(Ne.M,{itemDescription:p,itemNames:[m],submitActionObservable:()=>{const P=h(m);return P.subscribe(()=>R()),this.taskWrapper.wrapTaskAroundCall({task:new v.R(S,{name:m}),call:P})}})}addCrushRule(){this.addModal($_,_=>this.reloadCrushRules(_))}reloadCrushRules(_){this.reloadList({newItemName:_,getInfo:()=>this.poolService.getInfo(),initInfo:o=>{this.initInfo(o),this.poolTypeChange("replicated")},findNewItem:()=>this.info.crush_rules_replicated.find(o=>o.rule_name===_),controlName:"crushRule"})}deleteCrushRule(){this.deletionModal({value:this.form.getValue("crushRule"),usage:this.crushUsage,deletionBtn:this.crushDeletionBtn,dataName:"crushInfo",getTabs:()=>this.crushInfoTabs,tabPosition:"used-by-pools",nameAttribute:"rule_name",itemDescription:"crush rule",reloadFn:()=>this.reloadCrushRules(),deleteFn:_=>this.crushRuleService.delete(_),taskName:"crushRule/delete"})}crushRuleIsUsedBy(_){this.crushUsage=_?this.info.used_rules[_]:void 0}ecpIsUsedBy(_){this.ecpUsage=_?this.info.used_profiles[_]:void 0}submit(){if(this.form.invalid)return void this.form.setErrors({cdSubmitButton:!0});const _={pool:this.form.getValue("name")};this.assignFormFields(_,[{externalFieldName:"pool_type",formControlName:"poolType"},{externalFieldName:"pg_autoscale_mode",formControlName:"pgAutoscaleMode",editable:!0},{externalFieldName:"pg_num",formControlName:"pgNum",replaceFn:n=>"on"===this.form.getValue("pgAutoscaleMode")?1:n,editable:!0},this.isReplicated?{externalFieldName:"size",formControlName:"size"}:{externalFieldName:"erasure_code_profile",formControlName:"erasureProfile",attr:"name"},{externalFieldName:"rule_name",formControlName:"crushRule",replaceFn:n=>this.isReplicated?n&&n.rule_name:void 0},{externalFieldName:"quota_max_bytes",formControlName:"max_bytes",replaceFn:this.formatter.toBytes,editable:!0,resetValue:this.editing?0:void 0},{externalFieldName:"quota_max_objects",formControlName:"max_objects",editable:!0,resetValue:this.editing?0:void 0}]),this.info.is_all_bluestore&&(this.assignFormField(_,{externalFieldName:"flags",formControlName:"ecOverwrites",replaceFn:()=>this.isErasure?["ec_overwrites"]:void 0}),"none"!==this.form.getValue("mode")?this.assignFormFields(_,[{externalFieldName:"compression_mode",formControlName:"mode",editable:!0,replaceFn:n=>this.hasCompressionEnabled()&&n},{externalFieldName:"compression_algorithm",formControlName:"algorithm",editable:!0},{externalFieldName:"compression_min_blob_size",formControlName:"minBlobSize",replaceFn:this.formatter.toBytes,editable:!0,resetValue:0},{externalFieldName:"compression_max_blob_size",formControlName:"maxBlobSize",replaceFn:this.formatter.toBytes,editable:!0,resetValue:0},{externalFieldName:"compression_required_ratio",formControlName:"ratio",editable:!0,resetValue:0}]):this.editing&&this.assignFormFields(_,[{externalFieldName:"compression_mode",formControlName:"mode",editable:!0,replaceFn:()=>"unset"},{externalFieldName:"srcpool",formControlName:"name",editable:!0,replaceFn:()=>this.data.pool.pool_name}]));const o=this.data.applications.selected;(o.length>0||this.editing)&&(_.application_metadata=o),this.isReplicated&&!u().isEmpty(this.currentConfigurationValues)&&(_.configuration=this.currentConfigurationValues),this.triggerApiTask(_)}assignFormFields(_,o){o.forEach(n=>this.assignFormField(_,n))}assignFormField(_,{externalFieldName:o,formControlName:n,attr:s,replaceFn:c,editable:d,resetValue:f}){if(this.editing&&(!d||this.form.get(n).pristine))return;const p=this.form.getValue(n);let R=c?c(p):s?u().get(p,s):p;if(!p||!R){if(!d||u().isUndefined(f))return;R=f}_[o]=R}triggerApiTask(_){this.taskWrapper.wrapTaskAroundCall({task:new v.R("pool/"+(this.editing?M.MQ.EDIT:M.MQ.CREATE),{pool_name:_.hasOwnProperty("srcpool")?_.srcpool:_.pool}),call:this.poolService[this.editing?M.MQ.UPDATE:M.MQ.CREATE](_)}).subscribe({error:o=>{u().isObject(o.error)&&"34"===o.error.code&&this.form.get("pgNum").setErrors({34:!0}),this.form.setErrors({cdSubmitButton:!0})},complete:()=>this.router.navigate(["/pool"])})}appSelection(){this.form.get("name").updateValueAndValidity({emitEvent:!1,onlySelf:!0})}}return t.\u0275fac=function(_){return new(_||t)(e.Y36(C_.$),e.Y36(Oe.gz),e.Y36(Oe.F0),e.Y36(xe.Z),e.Y36(ue.q),e.Y36(he.j),e.Y36(M_.H),e.Y36(de.P),e.Y36(Me),e.Y36(Ie.H),e.Y36(M.p4))},t.\u0275cmp=e.Xpm({type:t,selectors:[["cd-pool-form"]],viewQuery:function(_,o){if(1&_&&(e.Gf(xo,5),e.Gf(yo,5),e.Gf(Zo,5),e.Gf(Uo,5)),2&_){let n;e.iGM(n=e.CRH())&&(o.crushInfoTabs=n.first),e.iGM(n=e.CRH())&&(o.crushDeletionBtn=n.first),e.iGM(n=e.CRH())&&(o.ecpInfoTabs=n.first),e.iGM(n=e.CRH())&&(o.ecpDeletionBtn=n.first)}},features:[e.qOj],decls:1,vars:1,consts:function(){let i,_,o,n,s,c,d,f,p,R,h,S,m,P,A,I,$,D,x,y,Z,U,H,G,z,q,X,w,Q,J,k,V,Y,B,j,K,N,W,ee,_e,oe,te,ie,ne,se,ae,le,re,ce,O,Xe,we,Qe,Je,ke,Ve,Ye,Be,je,Ke,We,e_,__,o_,t_,i_,n_,s_,a_,l_,r_,c_,O_;return i="" + "\ufffd0\ufffd" + " " + "\ufffd1\ufffd" + "",_="Name",o="Name...",n="Pool type",s="-- Select a pool type --",c="Applications",d="Pools should be associated with an application tag",f="Quotas",p="Max bytes",R="Leave it blank or specify 0 to disable this quota.",h="A valid quota should be greater than 0.",S="e.g., 10GiB",m="Max objects",P="Leave it blank or specify 0 to disable this quota.",A="A valid quota should be greater than 0.",I="This field is required!",$="The chosen Ceph pool name is already in use.",D="It's not possible to create an RBD pool with '/' in the name. Please change the name or remove 'rbd' from the applications list.",x="Pool name can only contain letters, numbers, '.', '-', '_' or '/'.",y="This field is required!",Z="PG Autoscale",U="Placement groups",H="Calculation help",G="This field is required!",z="At least one placement group is needed!",q="Your cluster can't handle this many PGs. Please recalculate the PG amount needed.",X="The current PGs settings were calculated for you, you should make sure the values suit your needs before submit.",w="Replicated size",Q="Minimum: " + "\ufffd0\ufffd" + "",J="Maximum: " + "\ufffd0\ufffd" + "",k="The size specified is out of range. A value from " + "\ufffd0\ufffd" + " to " + "\ufffd1\ufffd" + " is usable.",V="A size of 1 will not create a replication of the object. The 'Replicated size' includes the object itself.",Y="Flags",B="EC Overwrites",j="CRUSH",K="Erasure code profile",N="This profile can't be deleted as it is in use.",W="Loading...",ee="-- No erasure code profile available --",_e="-- Select an erasure code profile --",oe="Profile",te="Used by pools",ie="Profile is not in use.",ne="Crush ruleset",se="A new crush ruleset will be implicitly created.",ae="Crush ruleset",le="There are no rules.",re="-- Select a crush rule --",ce="Placement and\n                          replication strategies or distribution policies that allow to\n                          specify how CRUSH places data replicas.",O="This rule can't be deleted as it is in use.",Xe="Crush rule",we="Crush steps",Qe="Used by pools",Je="Rule is not in use.",ke="This field is required!",Ve="The rule can't be used in the current cluster as it has too few OSDs to meet the minimum required OSD by this rule.",Ye="Compression",Be="Mode",je="Algorithm",Ke="Minimum blob size",We="e.g., 128KiB",e_="Maximum blob size",__="e.g., 512KiB",o_="Ratio",t_="Compression ratio",i_="Loading...",n_="-- No erasure compression algorithm available --",s_="Value should be greater than 0",a_="Value should be less than the maximum blob size",l_="Value should be greater than 0",r_="Value should be greater than the minimum blob size",c_="Value should be between 0.0 and 1.0",O_="The value should be greater or equal to 0",[["class","cd-col-form",4,"cdFormLoading"],[1,"cd-col-form"],["name","form","novalidate","",3,"formGroup"],["formDir","ngForm"],[1,"card"],[1,"card-header"],i,[1,"card-body"],[1,"form-group","row"],["for","name",1,"cd-col-form-label","required"],_,[1,"cd-col-form-input"],["id","name","name","name","type","text","placeholder",o,"formControlName","name","autofocus","",1,"form-control"],["class","invalid-feedback",4,"ngIf"],["for","poolType",1,"cd-col-form-label","required"],n,["id","poolType","formControlName","poolType","name","poolType",1,"form-select"],["ngValue",""],s,[3,"value",4,"ngFor","ngForOf"],[4,"ngIf"],["for","applications",1,"cd-col-form-label"],c,["id","applications",3,"customBadges","customBadgeValidators","messages","data","options","selectionLimit","selection"],["title",d,3,"class",4,"ngIf"],["formGroupName","compression",4,"ngIf"],f,["for","max_bytes",1,"cd-col-form-label"],p,R,h,["id","max_bytes","name","max_bytes","type","text","formControlName","max_bytes","placeholder",S,"defaultUnit","GiB","cdDimlessBinary","",1,"form-control"],["for","max_objects",1,"cd-col-form-label"],m,P,A,["id","max_objects","min","0","name","max_objects","type","number","formControlName","max_objects",1,"form-control"],[3,"hidden"],[3,"form","initializeData","changes"],[1,"card-footer"],["wrappingClass","text-right",3,"form","submitText","submitActionEvent"],[1,"invalid-feedback"],I,$,D,x,[3,"value"],y,["for","pgAutoscaleMode",1,"cd-col-form-label"],Z,["id","pgAutoscaleMode","name","pgAutoscaleMode","formControlName","pgAutoscaleMode",1,"form-select"],["class","form-group row",4,"ngIf"],["for","pgNum",1,"cd-col-form-label","required"],U,["id","pgNum","name","pgNum","formControlName","pgNum","min","1","type","number","required","",1,"form-control",3,"focus","blur"],[1,"form-text","text-muted"],["section","pgs","docText",H],["class","form-text text-muted",4,"ngIf"],G,z,q,X,["for","size",1,"cd-col-form-label","required"],w,["id","size","name","size","type","number","formControlName","size",1,"form-control",3,"max","min"],["class","text-warning-dark",4,"ngIf"],[1,"list-inline"],Q,J,k,[1,"text-warning-dark"],V,[1,"cd-col-form-label"],Y,[1,"custom-control","custom-checkbox"],["type","checkbox","id","ec-overwrites","formControlName","ecOverwrites",1,"custom-control-input"],["for","ec-overwrites",1,"custom-control-label"],B,["title",d],j,["for","erasureProfile",1,"cd-col-form-label"],K,[1,"input-group","mb-1"],["id","erasureProfile","name","erasureProfile","formControlName","erasureProfile",1,"form-select"],["ngValue","",4,"ngIf"],[3,"ngValue",4,"ngIf"],[3,"ngValue",4,"ngFor","ngForOf"],["id","ecp-info-button","type","button",1,"btn","btn-light",3,"ngClass","click"],["aria-hidden","true",3,"ngClass"],["class","btn btn-light","type","button",3,"click",4,"ngIf"],["class","btn btn-light","type","button","ngbTooltip",N,"triggers","manual",3,"click",4,"ngIf"],["class","form-text text-muted","id","ecp-info-block",4,"ngIf"],W,[3,"ngValue"],ee,_e,["type","button",1,"btn","btn-light",3,"click"],["type","button","ngbTooltip",N,"triggers","manual",1,"btn","btn-light",3,"click"],["ecpDeletionBtn","ngbTooltip"],["id","ecp-info-block",1,"form-text","text-muted"],["ngbNav","",1,"nav-tabs"],["ecpInfoTabs","ngbNav"],["ngbNavItem","ecp-info"],["ngbNavLink",""],oe,["ngbNavContent",""],["ngbNavItem","used-by-pools"],te,[3,"ngbNavOutlet"],[3,"renderObjects","hideKeys","data","autoReload"],["ecpIsNotUsed",""],[4,"ngIf","ngIfElse"],ie,[4,"ngFor","ngForOf"],["for","crushRule",1,"cd-col-form-label"],ne,se,ae,["noRules",""],le,[1,"input-group"],["id","crushRule","formControlName","crushRule","name","crushSet",1,"form-select"],re,["id","crush-info-button","type","button","ngbTooltip",ce,1,"btn","btn-light",3,"ngClass","click"],["class","btn btn-light","type","button","ngbTooltip",O,"triggers","manual",3,"click",4,"ngIf"],["class","form-text text-muted","id","crush-info-block",4,"ngIf"],["type","button","ngbTooltip",O,"triggers","manual",1,"btn","btn-light",3,"click"],["crushDeletionBtn","ngbTooltip"],["id","crush-info-block",1,"form-text","text-muted"],["crushInfoTabs","ngbNav"],["ngbNavItem","crush-rule-info"],Xe,["ngbNavItem","crush-rule-steps"],we,Qe,["ruleIsNotUsed",""],Je,ke,Ve,["formGroupName","compression"],Ye,["for","mode",1,"cd-col-form-label"],Be,["id","mode","name","mode","formControlName","mode",1,"form-select"],["for","algorithm",1,"cd-col-form-label"],je,["id","algorithm","name","algorithm","formControlName","algorithm",1,"form-select"],["for","minBlobSize",1,"cd-col-form-label"],Ke,["id","minBlobSize","name","minBlobSize","formControlName","minBlobSize","type","text","min","0","placeholder",We,"defaultUnit","KiB","cdDimlessBinary","",1,"form-control"],["for","maxBlobSize",1,"cd-col-form-label"],e_,["id","maxBlobSize","type","text","min","0","formControlName","maxBlobSize","placeholder",__,"defaultUnit","KiB","cdDimlessBinary","",1,"form-control"],["for","ratio",1,"cd-col-form-label"],o_,["id","ratio","name","ratio","formControlName","ratio","type","number","min","0","max","1","step","0.1","placeholder",t_,1,"form-control"],i_,n_,s_,a_,l_,r_,c_,O_]},template:function(_,o){1&_&&e.YNc(0,Yt,70,33,"div",0),2&_&&e.Q6J("cdFormLoading",o.loading)},directives:[bo.y,a._Y,a.JL,Pe.V,a.sg,fe.P,Ee.o,a.Fj,ge.b,a.JJ,a.u,pe.U,C.O5,a.EJ,a.YN,a.Kr,C.sg,a.wV,a.qQ,a.Q7,vo.K,a.Fd,a.Wl,Io.m,C.mk,g._L,g.Pz,g.nv,g.Vx,g.uN,ye.b,g.tO,a.x0,$o.Q,Re.S,Do.d,me.p],pipes:[C.rS,Ce.m],styles:[".icon-warning-color[_ngcontent-%COMP%]{margin-left:3px}"]}),t})();var Bt=r(19773),jt=r(20687),Kt=r(68136),Se=r(69158),Te=r(83697),L=r(99466),Wt=r(91801),ei=r(68774),_i=r(66369),He=r(38047),Le=r(51847);class oi{constructor(i){this.pool_name=i}}var ti=r(64724),ii=r(94928),Ge=r(51295),ni=r(59376),ze=r(76317),si=r(42176);function ai(t,i){if(1&t&&e._UZ(0,"cd-table-key-value",12),2&t){const _=e.oxw(2);e.Q6J("renderObjects",!0)("data",_.poolDetails)("autoReload",!1)}}function li(t,i){if(1&t&&e._UZ(0,"cd-grafana",15),2&t){const _=e.oxw(3);e.MGl("grafanaPath","ceph-pool-detail?var-pool_name=",_.selection.pool_name,""),e.Q6J("type","metrics")}}function ri(t,i){1&t&&(e.ynx(0,13),e.TgZ(1,"a",5),e.SDv(2,14),e.qZA(),e.YNc(3,li,1,2,"ng-template",7),e.BQk())}function ci(t,i){if(1&t&&e._UZ(0,"cd-rbd-configuration-table",18),2&t){const _=e.oxw(3);e.Q6J("data",_.selectedPoolConfiguration)}}function Oi(t,i){1&t&&(e.ynx(0,16),e.TgZ(1,"a",5),e.SDv(2,17),e.qZA(),e.YNc(3,ci,1,1,"ng-template",7),e.BQk())}function di(t,i){if(1&t&&e._UZ(0,"cd-table",21),2&t){const _=e.oxw(3);e.Q6J("data",_.cacheTiers)("columns",_.cacheTierColumns)("autoSave",!1)}}function ui(t,i){1&t&&(e.ynx(0,19),e.TgZ(1,"a",5),e.SDv(2,20),e.qZA(),e.YNc(3,di,1,3,"ng-template",7),e.BQk())}function Pi(t,i){if(1&t&&(e.ynx(0,1),e.TgZ(1,"nav",2,3),e.ynx(3,4),e.TgZ(4,"a",5),e.SDv(5,6),e.qZA(),e.YNc(6,ai,1,3,"ng-template",7),e.BQk(),e.YNc(7,ri,4,0,"ng-container",8),e.YNc(8,Oi,4,0,"ng-container",9),e.YNc(9,ui,4,0,"ng-container",10),e.qZA(),e._UZ(10,"div",11),e.BQk()),2&t){const _=e.MAs(2),o=e.oxw();e.xp6(7),e.Q6J("ngIf",o.permissions.grafana.read),e.xp6(1),e.Q6J("ngIf","replicated"===o.selection.type),e.xp6(1),e.Q6J("ngIf",(null==o.selection.tiers?null:o.selection.tiers.length)>0),e.xp6(1),e.Q6J("ngbNavOutlet",_)}}let fi=(()=>{class t{constructor(_){this.poolService=_,this.cacheTierColumns=[],this.omittedPoolAttributes=["cdExecuting","cdIsBinary","stats"],this.cacheTierColumns=[{prop:"pool_name",name:"Name",flexGrow:3},{prop:"cache_mode",name:"Cache Mode",flexGrow:2},{prop:"cache_min_evict_age",name:"Min Evict Age",flexGrow:2},{prop:"cache_min_flush_age",name:"Min Flush Age",flexGrow:2},{prop:"target_max_bytes",name:"Target Max Bytes",flexGrow:2},{prop:"target_max_objects",name:"Target Max Objects",flexGrow:2}]}ngOnChanges(){this.selection&&(this.poolService.getConfiguration(this.selection.pool_name).subscribe(_=>{Ge.T.updateChanged(this,{selectedPoolConfiguration:_})}),Ge.T.updateChanged(this,{poolDetails:u().omit(this.selection,this.omittedPoolAttributes)}))}}return t.\u0275fac=function(_){return new(_||t)(e.Y36(ue.q))},t.\u0275cmp=e.Xpm({type:t,selectors:[["cd-pool-details"]],inputs:{cacheTiers:"cacheTiers",permissions:"permissions",selection:"selection"},features:[e.TTD],decls:1,vars:1,consts:function(){let i,_,o,n,s;return i="Details",_="Performance Details",o="Pool details",n="Configuration",s="Cache Tiers Details",[["cdTableDetail","",4,"ngIf"],["cdTableDetail",""],["ngbNav","","cdStatefulTab","pool-details",1,"nav-tabs"],["nav","ngbNav"],["ngbNavItem","details"],["ngbNavLink",""],i,["ngbNavContent",""],["ngbNavItem","performance-details",4,"ngIf"],["ngbNavItem","configuration",4,"ngIf"],["ngbNavItem","cache-tiers-details",4,"ngIf"],[3,"ngbNavOutlet"],[3,"renderObjects","data","autoReload"],["ngbNavItem","performance-details"],_,["title",o,"uid","-xyV8KCiz","grafanaStyle","three",3,"grafanaPath","type"],["ngbNavItem","configuration"],n,[3,"data"],["ngbNavItem","cache-tiers-details"],s,["columnMode","flex",3,"data","columns","autoSave"]]},template:function(_,o){1&_&&e.YNc(0,Pi,11,4,"ng-container",0),2&_&&e.Q6J("ngIf",o.selection)},directives:[C.O5,g.Pz,ni.m,g.nv,g.Vx,g.uN,ye.b,ze.F,si.P,Te.a,g.tO],styles:[""],changeDetection:0}),t})(),Ei=(()=>{class t{constructor(_,o,n){this.templateRef=_,this.viewContainer=o,this.authStorageService=n,this.cdScopeMatchAll=!0}set cdScope(_){this.permissions=this.authStorageService.getPermissions(),this.isAuthorized(_)?this.viewContainer.createEmbeddedView(this.templateRef):this.viewContainer.clear()}isAuthorized(_){const o=this.cdScopeMatchAll?u().every:u().some;return u().isString(_)?u().get(this.permissions,[_,"read"],!1):u().isArray(_)?o(_,n=>this.permissions[n].read):!!u().isObject(_)&&o(_,(n,s)=>o(n,c=>this.permissions[s][c]))}}return t.\u0275fac=function(_){return new(_||t)(e.Y36(e.Rgc),e.Y36(e.s_b),e.Y36(he.j))},t.\u0275dir=e.lG2({type:t,selectors:[["","cdScope",""]],inputs:{cdScope:"cdScope",cdScopeMatchAll:"cdScopeMatchAll"}}),t})();var gi=r(60251);const pi=["poolUsageTpl"],Ri=["poolConfigurationSourceTpl"];function mi(t,i){if(1&t){const _=e.EpF();e.TgZ(0,"cd-table",9,10),e.NdJ("fetchData",function(){return e.CHM(_),e.oxw().taskListService.fetch()})("setExpandedRow",function(n){return e.CHM(_),e.oxw().setExpandedRow(n)})("updateSelection",function(n){return e.CHM(_),e.oxw().updateSelection(n)}),e._UZ(2,"cd-table-actions",11)(3,"cd-pool-details",12),e.qZA()}if(2&t){const _=e.oxw();e.Q6J("data",_.pools)("columns",_.columns)("hasDetails",!0)("status",_.tableStatus)("autoReload",-1),e.xp6(2),e.Q6J("permission",_.permissions.pool)("selection",_.selection)("tableActions",_.tableActions),e.xp6(1),e.Q6J("selection",_.expandedRow)("permissions",_.permissions)("cacheTiers",_.cacheTiers)}}function Ci(t,i){1&t&&e._UZ(0,"cd-grafana",14),2&t&&e.Q6J("grafanaPath","ceph-pools-overview?")("type","metrics")}function Mi(t,i){1&t&&(e.ynx(0,2),e.TgZ(1,"a",3),e.SDv(2,13),e.qZA(),e.YNc(3,Ci,1,2,"ng-template",5),e.BQk())}function hi(t,i){if(1&t&&e._UZ(0,"cd-usage-bar",16),2&t){const _=e.oxw().row;e.Q6J("total",_.stats.bytes_used.latest+_.stats.avail_raw.latest)("used",_.stats.bytes_used.latest)("title",_.pool_name)}}function Si(t,i){if(1&t&&e.YNc(0,hi,1,3,"cd-usage-bar",15),2&t){const _=i.row;e.Q6J("ngIf",null==_.stats||null==_.stats.avail_raw?null:_.stats.avail_raw.latest)}}let Ti=(()=>{class t extends Kt.o{constructor(_,o,n,s,c,d,f,p,R,h,S){super(),this.poolService=_,this.taskWrapper=o,this.ecpService=n,this.authStorageService=s,this.taskListService=c,this.modalService=d,this.pgCategoryService=f,this.dimlessPipe=p,this.urlBuilder=R,this.configurationService=h,this.actionLabels=S,this.selection=new ei.r,this.executingTasks=[],this.tableStatus=new Se.E,this.cacheTiers=[],this.monAllowPoolDelete=!1,this.permissions=this.authStorageService.getPermissions(),this.tableActions=[{permission:"create",icon:b.P.add,routerLink:()=>this.urlBuilder.getCreate(),name:this.actionLabels.CREATE},{permission:"update",icon:b.P.edit,routerLink:()=>this.urlBuilder.getEdit(encodeURIComponent(this.selection.first().pool_name)),name:this.actionLabels.EDIT},{permission:"delete",icon:b.P.destroy,click:()=>this.deletePoolModal(),name:this.actionLabels.DELETE,disable:this.getDisableDesc.bind(this)}],this.permissions.configOpt.read&&this.configurationService.get("mon_allow_pool_delete").subscribe(m=>{if(u().has(m,"value")){const P=u().find(m.value,A=>"mon"===A.section)||{value:!1};this.monAllowPoolDelete="true"===P.value}})}ngOnInit(){const _=(o,n,s)=>u().get(n,o)>u().get(s,o)?1:-1;this.columns=[{prop:"pool_name",name:"Name",flexGrow:4,cellTransformation:L.e.executing},{prop:"data_protection",name:"Data Protection",cellTransformation:L.e.badge,customTemplateConfig:{class:"badge-background-gray"},flexGrow:1.3},{prop:"application_metadata",name:"Applications",cellTransformation:L.e.badge,customTemplateConfig:{class:"badge-background-primary"},flexGrow:1.5},{prop:"pg_status",name:"PG Status",flexGrow:1.2,cellClass:({row:o,column:n,value:s})=>this.getPgStatusCellClass(o,n,s)},{prop:"crush_rule",name:"Crush Ruleset",isHidden:!0,flexGrow:2},{name:"Usage",prop:"usage",cellTemplate:this.poolUsageTpl,flexGrow:1.2},{prop:"stats.rd_bytes.rates",name:"Read bytes",comparator:(o,n,s,c)=>_("stats.rd_bytes.latest",s,c),cellTransformation:L.e.sparkline,flexGrow:1.5},{prop:"stats.wr_bytes.rates",name:"Write bytes",comparator:(o,n,s,c)=>_("stats.wr_bytes.latest",s,c),cellTransformation:L.e.sparkline,flexGrow:1.5},{prop:"stats.rd.rate",name:"Read ops",flexGrow:1,pipe:this.dimlessPipe,cellTransformation:L.e.perSecond},{prop:"stats.wr.rate",name:"Write ops",flexGrow:1,pipe:this.dimlessPipe,cellTransformation:L.e.perSecond}],this.taskListService.init(()=>this.ecpService.list().pipe((0,Bt.zg)(o=>(this.ecProfileList=o,this.poolService.getList()))),void 0,o=>{this.pools=this.transformPoolsData(o),this.tableStatus=new Se.E},()=>{this.table.reset(),this.tableStatus=new Se.E(Wt.T.ValueException)},o=>o.name.startsWith("pool/"),(o,n)=>n.metadata.pool_name===o.pool_name,{default:o=>new oi(o.pool_name)})}updateSelection(_){this.selection=_}deletePoolModal(){const _=this.selection.first().pool_name;this.modalService.show(Ne.M,{itemDescription:"Pool",itemNames:[_],submitActionObservable:()=>this.taskWrapper.wrapTaskAroundCall({task:new v.R(`pool/${M.MQ.DELETE}`,{pool_name:_}),call:this.poolService.delete(_)})})}getPgStatusCellClass(_,o,n){return{"text-right":!0,[`pg-${this.pgCategoryService.getTypeByStates(n)}`]:!0}}getErasureCodeProfile(_){let o="";return u().forEach(this.ecProfileList,n=>{n.name===_&&(o=`EC: ${n.k}+${n.m}`)}),o}transformPoolsData(_){const o=["bytes_used","max_avail","avail_raw","percent_used","rd_bytes","wr_bytes","rd","wr"],n={latest:0,rate:0,rates:[]};return u().forEach(_,s=>{s.pg_status=this.transformPgStatus(s.pg_status);const c={};u().forEach(o,d=>{c[d]=s.stats&&s.stats[d]?s.stats[d]:n}),s.stats=c,s.usage=c.percent_used.latest,!s.cdExecuting&&s.pg_num+s.pg_placement_num!==s.pg_num_target+s.pg_placement_num_target&&(s.cdExecuting="Updating"),["rd_bytes","wr_bytes"].forEach(d=>{s.stats[d].rates=s.stats[d].rates.map(f=>f[1])}),s.cdIsBinary=!0,"erasure"===s.type&&(s.data_protection=this.getErasureCodeProfile(s.erasure_code_profile)),"replicated"===s.type&&(s.data_protection=`replica: \xd7${s.size}`)}),_}transformPgStatus(_){const o=[];return u().forEach(_,(n,s)=>{o.push(`${n} ${s}`)}),o.join(", ")}getSelectionTiers(){if(void 0!==this.expandedRow){const _=this.expandedRow.tiers;this.cacheTiers=this.pools.filter(o=>_.includes(o.pool))}}getDisableDesc(){var _;return!(null===(_=this.selection)||void 0===_?void 0:_.hasSelection)||!this.monAllowPoolDelete&&"Pool deletion is disabled by the mon_allow_pool_delete configuration setting."}setExpandedRow(_){super.setExpandedRow(_),this.getSelectionTiers()}}return t.\u0275fac=function(_){return new(_||t)(e.Y36(ue.q),e.Y36(de.P),e.Y36(Me),e.Y36(he.j),e.Y36(He.j),e.Y36(xe.Z),e.Y36(jt.j),e.Y36(_i.n),e.Y36(Le.F),e.Y36(ti.e),e.Y36(M.p4))},t.\u0275cmp=e.Xpm({type:t,selectors:[["cd-pool-list"]],viewQuery:function(_,o){if(1&_&&(e.Gf(Te.a,5),e.Gf(pi,7),e.Gf(Ri,5)),2&_){let n;e.iGM(n=e.CRH())&&(o.table=n.first),e.iGM(n=e.CRH())&&(o.poolUsageTpl=n.first),e.iGM(n=e.CRH())&&(o.poolConfigurationSourceTpl=n.first)}},features:[e._Bn([He.j,{provide:Le.F,useValue:new Le.F("pool")}]),e.qOj],decls:10,vars:2,consts:function(){let i,_,o;return i="Pools List",_="Overall Performance",o="Ceph pools overview",[["ngbNav","",1,"nav-tabs"],["nav","ngbNav"],["ngbNavItem",""],["ngbNavLink",""],i,["ngbNavContent",""],["ngbNavItem","",4,"cdScope"],[3,"ngbNavOutlet"],["poolUsageTpl",""],["id","pool-list","selectionType","single",3,"data","columns","hasDetails","status","autoReload","fetchData","setExpandedRow","updateSelection"],["table",""],["id","pool-list-actions",1,"table-actions",3,"permission","selection","tableActions"],["cdTableDetail","","id","pool-list-details",3,"selection","permissions","cacheTiers"],_,["title",o,"uid","z99hzWtmk","grafanaStyle","two",3,"grafanaPath","type"],["decimals","2",3,"total","used","title",4,"ngIf"],["decimals","2",3,"total","used","title"]]},template:function(_,o){if(1&_&&(e.TgZ(0,"nav",0,1),e.ynx(2,2),e.TgZ(3,"a",3),e.SDv(4,4),e.qZA(),e.YNc(5,mi,4,11,"ng-template",5),e.BQk(),e.YNc(6,Mi,4,0,"ng-container",6),e.qZA(),e._UZ(7,"div",7),e.YNc(8,Si,1,1,"ng-template",null,8,e.W1O)),2&_){const n=e.MAs(1);e.xp6(6),e.Q6J("cdScope","grafana"),e.xp6(1),e.Q6J("ngbNavOutlet",n)}},directives:[g.Pz,g.nv,g.Vx,g.uN,Te.a,ii.K,fi,Ei,ze.F,g.tO,C.O5,gi.O],styles:["cd-pool-list .pg-clean{color:#008a00}  cd-pool-list .pg-working{color:#25828e}  cd-pool-list .pg-warning{color:#d48200}  cd-pool-list .pg-unknown{color:#dc3545}"]}),t})(),qe=(()=>{class t{}return t.\u0275fac=function(_){return new(_||t)},t.\u0275mod=e.oAB({type:t}),t.\u0275inj=e.cJS({imports:[[P_.t,C.ez,g.Oz,d_.m,Oe.Bz,a.UX,g.HK,u_.BlockModule]]}),t})();const Li=[{path:"",component:Ti},{path:M.MQ.CREATE,component:Ue,data:{breadcrumbs:M.Qn.CREATE}},{path:`${M.MQ.EDIT}/:name`,component:Ue,data:{breadcrumbs:M.Qn.EDIT}}];let Ai=(()=>{class t{}return t.\u0275fac=function(_){return new(_||t)},t.\u0275mod=e.oAB({type:t}),t.\u0275inj=e.cJS({imports:[[qe,Oe.Bz.forChild(Li)]]}),t})()}}]);
\ No newline at end of file
diff --git a/ceph/src/pybind/mgr/dashboard/frontend/dist/en-US/Ceph_Logo.487a0001b327fa7f5232.svg b/ceph/src/pybind/mgr/dashboard/frontend/dist/en-US/Ceph_Logo.487a0001b327fa7f5232.svg
deleted file mode 100644 (file)
index 9426c30..0000000
+++ /dev/null
@@ -1,71 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<svg
-   xmlns:dc="http://purl.org/dc/elements/1.1/"
-   xmlns:cc="http://creativecommons.org/ns#"
-   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
-   xmlns:svg="http://www.w3.org/2000/svg"
-   xmlns="http://www.w3.org/2000/svg"
-   xmlns:xlink="http://www.w3.org/1999/xlink"
-   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
-   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
-   sodipodi:docname="Ceph_Logo.svg"
-   inkscape:version="1.0 (4035a4fb49, 2020-05-01)"
-   id="svg27"
-   version="1.1"
-   viewBox="0 0 22.93428 22.4424"
-   height="22.4424mm"
-   width="22.93428mm">
-  <defs
-     id="defs21">
-    <color-profile
-       xlink:href="file:///usr/share/color/icc/krita/sRGB-elle-V2-g10.icc"
-       name="sRGB-elle-V2-g10.icc"
-       id="color-profile35" />
-  </defs>
-  <sodipodi:namedview
-     inkscape:window-maximized="1"
-     inkscape:window-y="1080"
-     inkscape:window-x="3840"
-     inkscape:window-height="1051"
-     inkscape:window-width="1920"
-     fit-margin-bottom="0"
-     fit-margin-right="0"
-     fit-margin-left="0"
-     fit-margin-top="0"
-     showgrid="false"
-     inkscape:document-rotation="0"
-     inkscape:current-layer="layer1"
-     inkscape:document-units="mm"
-     inkscape:cy="39.499381"
-     inkscape:cx="29.58201"
-     inkscape:zoom="5.6"
-     inkscape:pageshadow="2"
-     inkscape:pageopacity="0"
-     borderopacity="1.0"
-     bordercolor="#666666"
-     pagecolor="#ffffff"
-     id="base" />
-  <metadata
-     id="metadata24">
-    <rdf:RDF>
-      <cc:Work
-         rdf:about="">
-        <dc:format>image/svg+xml</dc:format>
-        <dc:type
-           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
-        <dc:title></dc:title>
-      </cc:Work>
-    </rdf:RDF>
-  </metadata>
-  <g
-     transform="translate(-111.75311,-212.54075)"
-     id="layer1"
-     inkscape:groupmode="layer"
-     inkscape:label="Ebene 1">
-    <path
-       style="fill:#f0424d;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.264583"
-       d="m 123.18096,212.54075 c -1.54244,0 -3.03889,0.30198 -4.44866,0.89818 -1.36085,0.57588 -2.58333,1.3995 -3.63198,2.44903 -1.04982,1.04891 -1.87352,2.27125 -2.44969,3.63166 -0.59614,1.41006 -0.89752,2.90769 -0.89752,4.44931 0,0.88089 0.0998,1.75881 0.29917,2.60975 0.19372,0.82789 0.48107,1.63557 0.85432,2.40026 0.68819,1.40905 1.80379,2.81384 3.06538,3.86536 0.82281,-0.4498 1.28965,-0.94572 1.38884,-1.47622 0.0956,-0.50956 -0.12815,-1.05842 -0.7044,-1.72565 -1.36741,-1.56892 -2.12041,-3.58324 -2.12041,-5.6735 0,-4.76667 3.87763,-8.6456 8.64495,-8.6456 0.008,0 0.0393,6.6e-4 0.0393,6.6e-4 0,0 0.0305,-6.6e-4 0.0383,-6.6e-4 4.76715,0 8.64527,3.87893 8.64527,8.6456 0,2.09026 -0.75283,4.1046 -2.11975,5.67284 -0.57201,0.66284 -0.80153,1.23499 -0.70211,1.74922 0.10311,0.53107 0.56896,1.02002 1.38458,1.45397 1.26331,-1.05177 2.3782,-2.4564 3.06637,-3.86602 0.37372,-0.76469 0.66107,-1.57237 0.85464,-2.40026 0.1988,-0.85094 0.29983,-1.72886 0.29983,-2.60975 0,-1.54162 -0.30231,-3.03925 -0.89851,-4.44931 -0.57588,-1.36041 -1.40013,-2.58275 -2.44904,-3.63166 -1.04913,-1.04953 -2.27155,-1.87315 -3.63198,-2.44903 -1.40995,-0.5962 -2.90688,-0.89818 -4.44931,-0.89818 h -0.0393 z m -0.004,4.62214 c -0.32192,0 -0.64417,0.0219 -0.95873,0.0671 -0.92883,0.1324 -1.8401,0.46397 -2.63525,0.96004 -0.75897,0.47323 -1.43426,1.1087 -1.95215,1.83792 -0.53535,0.75374 -0.91954,1.62985 -1.10963,2.53316 -0.20655,0.97977 -0.19361,2.01224 0.0376,2.98552 0.21276,0.89514 0.61602,1.75703 1.16626,2.49191 0.14746,0.19797 0.31251,0.37855 0.48673,0.56987 0.058,0.063 0.11717,0.12782 0.17675,0.19411 0.002,0.002 0.003,0.003 0.005,0.005 0.007,0.007 0.0162,0.0158 0.0252,0.0265 0.60646,0.70473 0.91421,1.46388 0.91421,2.25525 0,1.19597 -0.66414,2.29315 -1.70895,2.85525 0.60776,0.33731 1.24734,0.61904 1.90404,0.83925 0.21816,0.0731 0.44001,0.13985 0.6625,0.19934 0.13296,-0.0835 0.58624,-0.42093 1.02943,-1.03369 0.42381,-0.58551 0.92331,-1.55674 0.89687,-2.85753 -0.0155,-0.78287 -0.17316,-1.54536 -0.46709,-2.26507 -0.29199,-0.71355 -0.71021,-1.36743 -1.24449,-1.94268 l -0.002,-0.004 c -0.04,-0.0456 -0.0786,-0.0911 -0.11816,-0.13613 -0.20138,-0.23358 -0.40932,-0.47459 -0.57609,-0.75677 -0.20417,-0.34691 -0.35302,-0.71154 -0.44123,-1.08442 -0.13724,-0.57588 -0.1445,-1.18703 -0.0229,-1.76689 0.1135,-0.53315 0.3392,-1.04985 0.65563,-1.49522 0.30638,-0.43154 0.70637,-0.80806 1.15578,-1.08835 0.46898,-0.29265 1.00724,-0.48855 1.55511,-0.56627 0.18502,-0.0266 0.37651,-0.0403 0.56824,-0.0403 h 0.0409 0.0412 c 0.19212,0 0.38328,0.0137 0.56889,0.0403 0.54819,0.0777 1.08631,0.27362 1.55479,0.56627 0.44949,0.28029 0.84882,0.65681 1.15545,1.08835 0.31651,0.44537 0.54311,0.96207 0.65563,1.49522 0.12194,0.57986 0.11399,1.19101 -0.0222,1.76689 -0.0886,0.37288 -0.23731,0.73751 -0.44189,1.08442 -0.16594,0.28218 -0.37412,0.52319 -0.57544,0.75677 -0.0397,0.045 -0.0786,0.0905 -0.11783,0.13617 l -0.003,0.004 c -0.53338,0.57525 -0.9522,1.22913 -1.24416,1.94267 -0.29412,0.71971 -0.45106,1.4822 -0.46742,2.26507 -0.0261,1.30079 0.47323,2.27202 0.89753,2.85754 0.44229,0.61275 0.89596,0.95014 1.02877,1.03369 0.22233,-0.0595 0.44541,-0.12627 0.66349,-0.19934 0.6567,-0.22022 1.29635,-0.50194 1.90436,-0.83926 -1.04596,-0.5621 -1.70993,-1.65928 -1.70993,-2.85524 0,-0.78066 0.29884,-1.5183 0.91356,-2.25395 0.008,-0.0117 0.0182,-0.0208 0.0252,-0.0278 0.002,-0.002 0.004,-0.003 0.006,-0.005 0.0597,-0.0663 0.1185,-0.1311 0.17577,-0.19411 0.17488,-0.19132 0.33935,-0.3719 0.48706,-0.56987 0.55097,-0.73488 0.95359,-1.59677 1.16691,-2.49191 0.2306,-0.97328 0.24377,-2.00575 0.038,-2.98552 -0.19086,-0.90335 -0.57496,-1.77946 -1.10998,-2.5332 -0.51797,-0.72922 -1.19318,-1.36469 -1.95215,-1.83792 -0.79523,-0.49606 -1.70641,-0.82764 -2.63561,-0.96004 -0.31415,-0.0452 -0.63706,-0.0671 -0.95906,-0.0671 h -0.0409 -0.0452 z m 0.0429,4.65814 c -1.24383,0 -2.25624,1.01222 -2.25624,2.25657 0,1.24414 1.01241,2.25624 2.25624,2.25624 1.24382,0 2.25591,-1.0121 2.25591,-2.25624 0,-1.24435 -1.01209,-2.25657 -2.25591,-2.25657 z"
-       id="path3043-5"
-       inkscape:connector-curvature="0" />
-  </g>
-</svg>
diff --git a/ceph/src/pybind/mgr/dashboard/frontend/dist/en-US/Ceph_Logo.beb815b55d2e7363.svg b/ceph/src/pybind/mgr/dashboard/frontend/dist/en-US/Ceph_Logo.beb815b55d2e7363.svg
new file mode 100644 (file)
index 0000000..9426c30
--- /dev/null
@@ -0,0 +1,71 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:xlink="http://www.w3.org/1999/xlink"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   sodipodi:docname="Ceph_Logo.svg"
+   inkscape:version="1.0 (4035a4fb49, 2020-05-01)"
+   id="svg27"
+   version="1.1"
+   viewBox="0 0 22.93428 22.4424"
+   height="22.4424mm"
+   width="22.93428mm">
+  <defs
+     id="defs21">
+    <color-profile
+       xlink:href="file:///usr/share/color/icc/krita/sRGB-elle-V2-g10.icc"
+       name="sRGB-elle-V2-g10.icc"
+       id="color-profile35" />
+  </defs>
+  <sodipodi:namedview
+     inkscape:window-maximized="1"
+     inkscape:window-y="1080"
+     inkscape:window-x="3840"
+     inkscape:window-height="1051"
+     inkscape:window-width="1920"
+     fit-margin-bottom="0"
+     fit-margin-right="0"
+     fit-margin-left="0"
+     fit-margin-top="0"
+     showgrid="false"
+     inkscape:document-rotation="0"
+     inkscape:current-layer="layer1"
+     inkscape:document-units="mm"
+     inkscape:cy="39.499381"
+     inkscape:cx="29.58201"
+     inkscape:zoom="5.6"
+     inkscape:pageshadow="2"
+     inkscape:pageopacity="0"
+     borderopacity="1.0"
+     bordercolor="#666666"
+     pagecolor="#ffffff"
+     id="base" />
+  <metadata
+     id="metadata24">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+        <dc:title></dc:title>
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <g
+     transform="translate(-111.75311,-212.54075)"
+     id="layer1"
+     inkscape:groupmode="layer"
+     inkscape:label="Ebene 1">
+    <path
+       style="fill:#f0424d;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.264583"
+       d="m 123.18096,212.54075 c -1.54244,0 -3.03889,0.30198 -4.44866,0.89818 -1.36085,0.57588 -2.58333,1.3995 -3.63198,2.44903 -1.04982,1.04891 -1.87352,2.27125 -2.44969,3.63166 -0.59614,1.41006 -0.89752,2.90769 -0.89752,4.44931 0,0.88089 0.0998,1.75881 0.29917,2.60975 0.19372,0.82789 0.48107,1.63557 0.85432,2.40026 0.68819,1.40905 1.80379,2.81384 3.06538,3.86536 0.82281,-0.4498 1.28965,-0.94572 1.38884,-1.47622 0.0956,-0.50956 -0.12815,-1.05842 -0.7044,-1.72565 -1.36741,-1.56892 -2.12041,-3.58324 -2.12041,-5.6735 0,-4.76667 3.87763,-8.6456 8.64495,-8.6456 0.008,0 0.0393,6.6e-4 0.0393,6.6e-4 0,0 0.0305,-6.6e-4 0.0383,-6.6e-4 4.76715,0 8.64527,3.87893 8.64527,8.6456 0,2.09026 -0.75283,4.1046 -2.11975,5.67284 -0.57201,0.66284 -0.80153,1.23499 -0.70211,1.74922 0.10311,0.53107 0.56896,1.02002 1.38458,1.45397 1.26331,-1.05177 2.3782,-2.4564 3.06637,-3.86602 0.37372,-0.76469 0.66107,-1.57237 0.85464,-2.40026 0.1988,-0.85094 0.29983,-1.72886 0.29983,-2.60975 0,-1.54162 -0.30231,-3.03925 -0.89851,-4.44931 -0.57588,-1.36041 -1.40013,-2.58275 -2.44904,-3.63166 -1.04913,-1.04953 -2.27155,-1.87315 -3.63198,-2.44903 -1.40995,-0.5962 -2.90688,-0.89818 -4.44931,-0.89818 h -0.0393 z m -0.004,4.62214 c -0.32192,0 -0.64417,0.0219 -0.95873,0.0671 -0.92883,0.1324 -1.8401,0.46397 -2.63525,0.96004 -0.75897,0.47323 -1.43426,1.1087 -1.95215,1.83792 -0.53535,0.75374 -0.91954,1.62985 -1.10963,2.53316 -0.20655,0.97977 -0.19361,2.01224 0.0376,2.98552 0.21276,0.89514 0.61602,1.75703 1.16626,2.49191 0.14746,0.19797 0.31251,0.37855 0.48673,0.56987 0.058,0.063 0.11717,0.12782 0.17675,0.19411 0.002,0.002 0.003,0.003 0.005,0.005 0.007,0.007 0.0162,0.0158 0.0252,0.0265 0.60646,0.70473 0.91421,1.46388 0.91421,2.25525 0,1.19597 -0.66414,2.29315 -1.70895,2.85525 0.60776,0.33731 1.24734,0.61904 1.90404,0.83925 0.21816,0.0731 0.44001,0.13985 0.6625,0.19934 0.13296,-0.0835 0.58624,-0.42093 1.02943,-1.03369 0.42381,-0.58551 0.92331,-1.55674 0.89687,-2.85753 -0.0155,-0.78287 -0.17316,-1.54536 -0.46709,-2.26507 -0.29199,-0.71355 -0.71021,-1.36743 -1.24449,-1.94268 l -0.002,-0.004 c -0.04,-0.0456 -0.0786,-0.0911 -0.11816,-0.13613 -0.20138,-0.23358 -0.40932,-0.47459 -0.57609,-0.75677 -0.20417,-0.34691 -0.35302,-0.71154 -0.44123,-1.08442 -0.13724,-0.57588 -0.1445,-1.18703 -0.0229,-1.76689 0.1135,-0.53315 0.3392,-1.04985 0.65563,-1.49522 0.30638,-0.43154 0.70637,-0.80806 1.15578,-1.08835 0.46898,-0.29265 1.00724,-0.48855 1.55511,-0.56627 0.18502,-0.0266 0.37651,-0.0403 0.56824,-0.0403 h 0.0409 0.0412 c 0.19212,0 0.38328,0.0137 0.56889,0.0403 0.54819,0.0777 1.08631,0.27362 1.55479,0.56627 0.44949,0.28029 0.84882,0.65681 1.15545,1.08835 0.31651,0.44537 0.54311,0.96207 0.65563,1.49522 0.12194,0.57986 0.11399,1.19101 -0.0222,1.76689 -0.0886,0.37288 -0.23731,0.73751 -0.44189,1.08442 -0.16594,0.28218 -0.37412,0.52319 -0.57544,0.75677 -0.0397,0.045 -0.0786,0.0905 -0.11783,0.13617 l -0.003,0.004 c -0.53338,0.57525 -0.9522,1.22913 -1.24416,1.94267 -0.29412,0.71971 -0.45106,1.4822 -0.46742,2.26507 -0.0261,1.30079 0.47323,2.27202 0.89753,2.85754 0.44229,0.61275 0.89596,0.95014 1.02877,1.03369 0.22233,-0.0595 0.44541,-0.12627 0.66349,-0.19934 0.6567,-0.22022 1.29635,-0.50194 1.90436,-0.83926 -1.04596,-0.5621 -1.70993,-1.65928 -1.70993,-2.85524 0,-0.78066 0.29884,-1.5183 0.91356,-2.25395 0.008,-0.0117 0.0182,-0.0208 0.0252,-0.0278 0.002,-0.002 0.004,-0.003 0.006,-0.005 0.0597,-0.0663 0.1185,-0.1311 0.17577,-0.19411 0.17488,-0.19132 0.33935,-0.3719 0.48706,-0.56987 0.55097,-0.73488 0.95359,-1.59677 1.16691,-2.49191 0.2306,-0.97328 0.24377,-2.00575 0.038,-2.98552 -0.19086,-0.90335 -0.57496,-1.77946 -1.10998,-2.5332 -0.51797,-0.72922 -1.19318,-1.36469 -1.95215,-1.83792 -0.79523,-0.49606 -1.70641,-0.82764 -2.63561,-0.96004 -0.31415,-0.0452 -0.63706,-0.0671 -0.95906,-0.0671 h -0.0409 -0.0452 z m 0.0429,4.65814 c -1.24383,0 -2.25624,1.01222 -2.25624,2.25657 0,1.24414 1.01241,2.25624 2.25624,2.25624 1.24382,0 2.25591,-1.0121 2.25591,-2.25624 0,-1.24435 -1.01209,-2.25657 -2.25591,-2.25657 z"
+       id="path3043-5"
+       inkscape:connector-curvature="0" />
+  </g>
+</svg>
diff --git a/ceph/src/pybind/mgr/dashboard/frontend/dist/en-US/ceph_background.3fbdf95cd52530d7.gif b/ceph/src/pybind/mgr/dashboard/frontend/dist/en-US/ceph_background.3fbdf95cd52530d7.gif
new file mode 100644 (file)
index 0000000..0f7426e
Binary files /dev/null and b/ceph/src/pybind/mgr/dashboard/frontend/dist/en-US/ceph_background.3fbdf95cd52530d7.gif differ
diff --git a/ceph/src/pybind/mgr/dashboard/frontend/dist/en-US/ceph_background.e82dd79127290ddbe8cb.gif b/ceph/src/pybind/mgr/dashboard/frontend/dist/en-US/ceph_background.e82dd79127290ddbe8cb.gif
deleted file mode 100644 (file)
index 0f7426e..0000000
Binary files a/ceph/src/pybind/mgr/dashboard/frontend/dist/en-US/ceph_background.e82dd79127290ddbe8cb.gif and /dev/null differ
diff --git a/ceph/src/pybind/mgr/dashboard/frontend/dist/en-US/forkawesome-webfont.23671bdbd055fa7b.woff b/ceph/src/pybind/mgr/dashboard/frontend/dist/en-US/forkawesome-webfont.23671bdbd055fa7b.woff
new file mode 100644 (file)
index 0000000..477da44
Binary files /dev/null and b/ceph/src/pybind/mgr/dashboard/frontend/dist/en-US/forkawesome-webfont.23671bdbd055fa7b.woff differ
diff --git a/ceph/src/pybind/mgr/dashboard/frontend/dist/en-US/forkawesome-webfont.2dfb5f36fc148e26e398.woff b/ceph/src/pybind/mgr/dashboard/frontend/dist/en-US/forkawesome-webfont.2dfb5f36fc148e26e398.woff
deleted file mode 100644 (file)
index 477da44..0000000
Binary files a/ceph/src/pybind/mgr/dashboard/frontend/dist/en-US/forkawesome-webfont.2dfb5f36fc148e26e398.woff and /dev/null differ
diff --git a/ceph/src/pybind/mgr/dashboard/frontend/dist/en-US/forkawesome-webfont.3217b1b06e001045.svg b/ceph/src/pybind/mgr/dashboard/frontend/dist/en-US/forkawesome-webfont.3217b1b06e001045.svg
new file mode 100644 (file)
index 0000000..e997204
--- /dev/null
@@ -0,0 +1,2849 @@
+<?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" >
+<!--
+2019-2-18: Created with FontForge (http://fontforge.org)
+-->
+<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1">
+<metadata>
+Created by FontForge 20180321 at Mon Feb 18 18:29:30 2019
+ By Julien Deswaef
+The Fork Awesome font is licensed under the SIL OFL 1.1 (http://scripts.sil.org/OFL). Fork Awesome is a fork based of off Font Awesome 4.7.0 by Dave Gandy. More info on licenses at https://forkawesome.github.io
+</metadata>
+<defs>
+<font id="forkawesome" horiz-adv-x="1536" >
+  <font-face 
+    font-family="forkawesome"
+    font-weight="400"
+    font-stretch="normal"
+    units-per-em="1792"
+    panose-1="2 0 5 3 0 0 0 0 0 0"
+    ascent="1536"
+    descent="-256"
+    bbox="-0.653061 -264 2304.01 1538"
+    underline-thickness="89.6"
+    underline-position="-179.2"
+    unicode-range="U+0020-F32B"
+  />
+    <missing-glyph />
+    <glyph glyph-name="space" unicode=" " horiz-adv-x="200" 
+ />
+    <glyph glyph-name="code" unicode="&#xf121;" horiz-adv-x="1830" 
+d="M572 137l-50 -50c-13 -13 -33 -13 -46 0l-466 466c-13 13 -13 33 0 46l466 466c13 13 33 13 46 0l50 -50c13 -13 13 -33 0 -46l-393 -393l393 -393c13 -13 13 -33 0 -46zM1163 1204l-373 -1291c-5 -17 -23 -27 -39 -22l-62 17c-17 5 -27 23 -22 40l373 1291
+c5 17 23 27 39 22l62 -17c17 -5 27 -23 22 -40zM1820 553l-466 -466c-13 -13 -33 -13 -46 0l-50 50c-13 13 -13 33 0 46l393 393l-393 393c-13 13 -13 33 0 46l50 50c13 13 33 13 46 0l466 -466c13 -13 13 -33 0 -46z" />
+    <glyph glyph-name="chevron-circle-right" unicode="&#xf138;" 
+d="M717 141l454 454c25 25 25 65 0 90l-454 454c-25 25 -65 25 -90 0l-102 -102c-25 -25 -25 -65 0 -90l307 -307l-307 -307c-25 -25 -25 -65 0 -90l102 -102c25 -25 65 -25 90 0zM1536 640c0 -424 -344 -768 -768 -768s-768 344 -768 768s344 768 768 768
+s768 -344 768 -768z" />
+    <glyph glyph-name="crosshairs" unicode="&#xf05b;" 
+d="M1197 512h-109c-35 0 -64 29 -64 64v128c0 35 29 64 64 64h109c-43 144 -157 258 -301 301v-109c0 -35 -29 -64 -64 -64h-128c-35 0 -64 29 -64 64v109c-144 -43 -258 -157 -301 -301h109c35 0 64 -29 64 -64v-128c0 -35 -29 -64 -64 -64h-109c43 -144 157 -258 301 -301
+v109c0 35 29 64 64 64h128c35 0 64 -29 64 -64v-109c144 43 258 157 301 301zM1536 704v-128c0 -35 -29 -64 -64 -64h-143c-49 -215 -218 -384 -433 -433v-143c0 -35 -29 -64 -64 -64h-128c-35 0 -64 29 -64 64v143c-215 49 -384 218 -433 433h-143c-35 0 -64 29 -64 64v128
+c0 35 29 64 64 64h143c49 215 218 384 433 433v143c0 35 29 64 64 64h128c35 0 64 -29 64 -64v-143c215 -49 384 -218 433 -433h143c35 0 64 -29 64 -64z" />
+    <glyph glyph-name="gg" unicode="&#xf260;" horiz-adv-x="1920" 
+d="M672 736l384 -384l-384 -384l-672 672l672 672l168 -168l-96 -96l-72 72l-480 -480l480 -480l193 193l-289 287zM1248 1312l672 -672l-672 -672l-168 168l96 96l72 -72l480 480l-480 480l-193 -193l289 -287l-96 -96l-384 384z" />
+    <glyph glyph-name="wpforms" unicode="&#xf298;" 
+d="M515 625v-128h-252v128h252zM515 880v-127h-252v127h252zM1273 369v-128h-341v128h341zM1273 625v-128h-672v128h672zM1273 880v-127h-672v127h672zM1408 20v1240c0 11 -9 20 -20 20h-32l-378 -256l-210 171l-210 -171l-378 256h-32c-11 0 -20 -9 -20 -20v-1240
+c0 -11 9 -20 20 -20h1240c11 0 20 9 20 20zM553 1130l185 150h-406zM983 1130l221 150h-406zM1536 1260v-1240c0 -82 -66 -148 -148 -148h-1240c-82 0 -148 66 -148 148v1240c0 82 66 148 148 148h1240c82 0 148 -66 148 -148z" />
+    <glyph glyph-name="angle-double-left" unicode="&#xf100;" horiz-adv-x="966" 
+d="M582 160c0 -8 -4 -17 -10 -23l-50 -50c-6 -6 -15 -10 -23 -10s-17 4 -23 10l-466 466c-6 6 -10 15 -10 23s4 17 10 23l466 466c6 6 15 10 23 10s17 -4 23 -10l50 -50c6 -6 10 -15 10 -23s-4 -17 -10 -23l-393 -393l393 -393c6 -6 10 -15 10 -23zM966 160
+c0 -8 -4 -17 -10 -23l-50 -50c-6 -6 -15 -10 -23 -10s-17 4 -23 10l-466 466c-6 6 -10 15 -10 23s4 17 10 23l466 466c6 6 15 10 23 10s17 -4 23 -10l50 -50c6 -6 10 -15 10 -23s-4 -17 -10 -23l-393 -393l393 -393c6 -6 10 -15 10 -23z" />
+    <glyph glyph-name="list" unicode="&#xf03a;" horiz-adv-x="1792" 
+d="M256 224v-192c0 -17 -15 -32 -32 -32h-192c-17 0 -32 15 -32 32v192c0 17 15 32 32 32h192c17 0 32 -15 32 -32zM256 608v-192c0 -17 -15 -32 -32 -32h-192c-17 0 -32 15 -32 32v192c0 17 15 32 32 32h192c17 0 32 -15 32 -32zM256 992v-192c0 -17 -15 -32 -32 -32h-192
+c-17 0 -32 15 -32 32v192c0 17 15 32 32 32h192c17 0 32 -15 32 -32zM1792 224v-192c0 -17 -15 -32 -32 -32h-1344c-17 0 -32 15 -32 32v192c0 17 15 32 32 32h1344c17 0 32 -15 32 -32zM256 1376v-192c0 -17 -15 -32 -32 -32h-192c-17 0 -32 15 -32 32v192
+c0 17 15 32 32 32h192c17 0 32 -15 32 -32zM1792 608v-192c0 -17 -15 -32 -32 -32h-1344c-17 0 -32 15 -32 32v192c0 17 15 32 32 32h1344c17 0 32 -15 32 -32zM1792 992v-192c0 -17 -15 -32 -32 -32h-1344c-17 0 -32 15 -32 32v192c0 17 15 32 32 32h1344
+c17 0 32 -15 32 -32zM1792 1376v-192c0 -17 -15 -32 -32 -32h-1344c-17 0 -32 15 -32 32v192c0 17 15 32 32 32h1344c17 0 32 -15 32 -32z" />
+    <glyph glyph-name="archlinux" unicode="&#xf323;" horiz-adv-x="1794" 
+d="M897 1538c164 -386 203 -504 682 -1397c-61 36 -138 70 -247 98c158 -81 236 -156 310 -214c47 -87 97 -179 152 -281c-281 162 -499 263 -702 303c7 31 11 64 12 98c5 182 -83 337 -195 347s-207 -131 -212 -313v-9c0 -43 4 -84 13 -122c-205 -39 -426 -140 -710 -304
+c362 650 540 989 654 1226c60 -50 139 -99 256 -147c-109 76 -175 143 -230 201c89 190 137 318 217 514z" />
+    <glyph glyph-name="th" unicode="&#xf00a;" horiz-adv-x="1792" 
+d="M512 288v-192c0 -53 -43 -96 -96 -96h-320c-53 0 -96 43 -96 96v192c0 53 43 96 96 96h320c53 0 96 -43 96 -96zM512 800v-192c0 -53 -43 -96 -96 -96h-320c-53 0 -96 43 -96 96v192c0 53 43 96 96 96h320c53 0 96 -43 96 -96zM1152 288v-192c0 -53 -43 -96 -96 -96h-320
+c-53 0 -96 43 -96 96v192c0 53 43 96 96 96h320c53 0 96 -43 96 -96zM512 1312v-192c0 -53 -43 -96 -96 -96h-320c-53 0 -96 43 -96 96v192c0 53 43 96 96 96h320c53 0 96 -43 96 -96zM1152 800v-192c0 -53 -43 -96 -96 -96h-320c-53 0 -96 43 -96 96v192c0 53 43 96 96 96
+h320c53 0 96 -43 96 -96zM1792 288v-192c0 -53 -43 -96 -96 -96h-320c-53 0 -96 43 -96 96v192c0 53 43 96 96 96h320c53 0 96 -43 96 -96zM1152 1312v-192c0 -53 -43 -96 -96 -96h-320c-53 0 -96 43 -96 96v192c0 53 43 96 96 96h320c53 0 96 -43 96 -96zM1792 800v-192
+c0 -53 -43 -96 -96 -96h-320c-53 0 -96 43 -96 96v192c0 53 43 96 96 96h320c53 0 96 -43 96 -96zM1792 1312v-192c0 -53 -43 -96 -96 -96h-320c-53 0 -96 43 -96 96v192c0 53 43 96 96 96h320c53 0 96 -43 96 -96z" />
+    <glyph glyph-name="angle-left" unicode="&#xf104;" horiz-adv-x="582" 
+d="M582 992c0 -8 -4 -17 -10 -23l-393 -393l393 -393c6 -6 10 -15 10 -23s-4 -17 -10 -23l-50 -50c-6 -6 -15 -10 -23 -10s-17 4 -23 10l-466 466c-6 6 -10 15 -10 23s4 17 10 23l466 466c6 6 15 10 23 10s17 -4 23 -10l50 -50c6 -6 10 -14 10 -23z" />
+    <glyph glyph-name="recycle" unicode="&#xf1b8;" horiz-adv-x="1760" 
+d="M820 367l-15 -368l-2 -22l-420 29c-52 4 -95 53 -114 97c-40 93 12 203 42 292c0 0 77 -12 509 -28zM433 953l180 -379l-147 92c-225 -257 -246 -448 -246 -448l-190 357c-39 58 -4 121 -4 121s35 63 114 188l-140 86zM1664 436l-188 -359c-26 -65 -98 -71 -98 -71
+s-71 -7 -219 -12l8 -164l-230 367l211 362l7 -173c339 -41 509 50 509 50zM879 1360c0 0 -47 -62 -265 -435l-317 187l-19 12l225 356c28 44 91 60 140 55c100 -9 172 -106 236 -175zM1534 1053l212 -363c27 -45 11 -108 -15 -150c-54 -84 -174 -104 -264 -129
+c0 0 -34 71 -265 436l313 195zM1391 1279l142 83l-220 -373l-419 20l151 86c-120 319 -279 429 -279 429l405 -1c70 6 108 -54 108 -54s39 -61 112 -190z" />
+    <glyph glyph-name="file-code-o" unicode="&#xf1c9;" 
+d="M1468 1156c37 -37 68 -111 68 -164v-1152c0 -53 -43 -96 -96 -96h-1344c-53 0 -96 43 -96 96v1600c0 53 43 96 96 96h896c53 0 127 -31 164 -68zM1024 1400v-376h376c-6 17 -15 34 -22 41l-313 313c-7 7 -24 16 -41 22zM1408 -128v1024h-416c-53 0 -96 43 -96 96v416
+h-768v-1536h1280zM480 768c11 14 31 17 45 6l51 -38c14 -11 17 -31 6 -45l-182 -243l182 -243c11 -14 8 -34 -6 -45l-51 -38c-14 -11 -34 -8 -45 6l-226 301c-8 11 -8 27 0 38zM1282 467c8 -11 8 -27 0 -38l-226 -301c-11 -14 -31 -17 -45 -6l-51 38c-14 11 -17 31 -6 45
+l182 243l-182 243c-11 14 -8 34 6 45l51 38c14 11 34 8 45 -6zM662 6c-18 3 -29 20 -26 37l138 831c3 18 20 29 37 26l63 -10c18 -3 29 -20 26 -37l-138 -831c-3 -18 -20 -29 -37 -26z" />
+    <glyph glyph-name="thumb-tack" unicode="&#xf08d;" horiz-adv-x="1152" 
+d="M480 672v448c0 18 -14 32 -32 32s-32 -14 -32 -32v-448c0 -18 14 -32 32 -32s32 14 32 32zM1152 320c0 -35 -29 -64 -64 -64h-429l-51 -483c-2 -16 -15 -29 -31 -29h-1c-16 0 -29 11 -32 27l-76 485h-404c-35 0 -64 29 -64 64c0 164 124 320 256 320v512
+c-70 0 -128 58 -128 128s58 128 128 128h640c70 0 128 -58 128 -128s-58 -128 -128 -128v-512c132 0 256 -156 256 -320z" />
+    <glyph glyph-name="fax" unicode="&#xf1ac;" horiz-adv-x="1792" 
+d="M288 1152c88 0 160 -72 160 -160v-1088c0 -88 -72 -160 -160 -160h-128c-88 0 -160 72 -160 160v1088c0 88 72 160 160 160h128zM1664 989c76 -44 128 -127 128 -221v-768c0 -141 -115 -256 -256 -256h-864c-88 0 -160 72 -160 160v1536c0 53 43 96 96 96h672
+c53 0 127 -31 164 -68l152 -152c37 -37 68 -111 68 -164v-163zM928 0v128c0 18 -14 32 -32 32h-128c-18 0 -32 -14 -32 -32v-128c0 -18 14 -32 32 -32h128c18 0 32 14 32 32zM928 256v128c0 18 -14 32 -32 32h-128c-18 0 -32 -14 -32 -32v-128c0 -18 14 -32 32 -32h128
+c18 0 32 14 32 32zM928 512v128c0 18 -14 32 -32 32h-128c-18 0 -32 -14 -32 -32v-128c0 -18 14 -32 32 -32h128c18 0 32 14 32 32zM1184 0v128c0 18 -14 32 -32 32h-128c-18 0 -32 -14 -32 -32v-128c0 -18 14 -32 32 -32h128c18 0 32 14 32 32zM1184 256v128
+c0 18 -14 32 -32 32h-128c-18 0 -32 -14 -32 -32v-128c0 -18 14 -32 32 -32h128c18 0 32 14 32 32zM1184 512v128c0 18 -14 32 -32 32h-128c-18 0 -32 -14 -32 -32v-128c0 -18 14 -32 32 -32h128c18 0 32 14 32 32zM1440 0v128c0 18 -14 32 -32 32h-128
+c-18 0 -32 -14 -32 -32v-128c0 -18 14 -32 32 -32h128c18 0 32 14 32 32zM1440 256v128c0 18 -14 32 -32 32h-128c-18 0 -32 -14 -32 -32v-128c0 -18 14 -32 32 -32h128c18 0 32 14 32 32zM1440 512v128c0 18 -14 32 -32 32h-128c-18 0 -32 -14 -32 -32v-128
+c0 -18 14 -32 32 -32h128c18 0 32 14 32 32zM1536 896v256h-160c-53 0 -96 43 -96 96v160h-640v-512h896z" />
+    <glyph glyph-name="xing-square" unicode="&#xf169;" 
+d="M685 771c0 0 0 1 -126 222c-10 16 -24 34 -52 34h-184c-12 0 -21 -4 -26 -11c-5 -8 -4 -19 1 -29l125 -216v-1l-196 -346c-6 -10 -5 -20 0 -28s13 -13 24 -13h185c27 0 41 19 50 36c192 339 199 352 199 352zM1309 1268c-5 8 -13 12 -24 12h-187c-27 0 -39 -17 -49 -35
+c-398 -706 -411 -729 -411 -729s0 -1 262 -481c9 -16 23 -35 52 -35h184c11 0 20 4 25 12s5 18 -1 28l-260 476v1l409 723c5 10 5 20 0 28zM1536 1120v-960c0 -159 -129 -288 -288 -288h-960c-159 0 -288 129 -288 288v960c0 159 129 288 288 288h960
+c159 0 288 -129 288 -288z" />
+    <glyph glyph-name="google-plus-official" unicode="&#xf2b3;" 
+d="M917 631c0 22 -2 43 -6 64h-362v-132h217c-16 -106 -116 -165 -217 -165c-133 0 -239 110 -239 242s106 242 239 242c56 0 112 -19 153 -59l104 101c-71 66 -160 100 -257 100c-213 0 -384 -172 -384 -384s171 -384 384 -384c221 0 368 156 368 375zM1262 585h109v110
+h-109v110h-110v-110h-110v-110h110v-110h110v110zM1536 640c0 -424 -344 -768 -768 -768s-768 344 -768 768s344 768 768 768s768 -344 768 -768z" />
+    <glyph glyph-name="quora" unicode="&#xf2c4;" horiz-adv-x="1734" 
+d="M1226 749c0 417 -130 631 -435 631c-300 0 -430 -214 -430 -631c0 -415 130 -627 430 -627c48 0 91 5 131 17c-62 122 -135 245 -277 245c-27 0 -54 -4 -79 -16l-49 97c59 51 154 91 276 91c191 0 288 -92 366 -209c45 100 67 235 67 402zM1616 117h117
+c7 -72 -29 -373 -356 -373c-198 0 -302 115 -381 249c-65 -18 -135 -27 -205 -27c-400 0 -791 319 -791 783c0 468 392 787 791 787c407 0 794 -317 794 -787c0 -262 -122 -475 -299 -612c57 -86 116 -143 198 -143c90 0 126 69 132 123z" />
+    <glyph glyph-name="archive-org" unicode="&#xf2fc;" horiz-adv-x="1506" 
+d="M1459 1344l-27 -53h-1385l-24 53l717 189zM1430 1237v-140h-1380v140h1380zM1257 442c-3 65 -4 124 -3 178c0 25 1 61 3 108s3 77 3 91c1 22 3 57 5 104s4 82 5 107c0 1 1 3 1 7v10c47 10 93 10 138 0c21 -325 21 -630 0 -916c-41 -11 -82 -12 -123 -1c-6 1 -10 2 -11 2
+s-3 2 -3 3s-1 4 -1 9c-3 34 -6 90 -10 165zM80 369v0c-1 9 -1 22 -1 38c0 5 -1 11 -1 21s-1 17 -1 22c0 26 0 45 -1 57v219c2 38 3 68 3 88c2 32 3 56 3 71c1 7 1 15 1 26c0 3 1 9 1 17s1 14 1 18c0 7 0 10 1 12c0 12 0 22 1 28c0 11 1 20 2 27c0 11 0 19 1 24c0 4 2 6 7 7
+c29 10 61 13 96 8c11 -2 22 -5 32 -9c2 0 3 -2 3 -6c2 -42 4 -74 6 -97c1 -20 2 -50 3 -90s2 -69 2 -88s1 -47 1 -85s1 -66 2 -84c-3 -131 -4 -199 -4 -206c-1 -47 -3 -112 -7 -194c-2 -27 -3 -47 -3 -60c0 -3 -2 -5 -6 -6c-28 -9 -59 -11 -94 -8c-4 1 -10 3 -18 5
+s-12 4 -14 5c-4 0 -6 1 -6 4c0 12 0 21 -1 26c0 4 -1 8 -1 14s-1 10 -1 13c0 9 0 15 -1 20c0 6 -1 13 -1 24v25c-1 6 -2 14 -2 25s0 19 -1 25c0 17 -1 30 -2 40v24zM464 255v0v25s-1 19 -1 25c-1 10 -1 23 -1 40c-1 5 -2 13 -2 24c0 16 0 29 -1 38v43c-1 13 -2 32 -2 57v29
+s-1 21 -1 27v102c0 27 0 47 1 61c0 18 1 48 3 88c0 17 1 40 3 71c0 11 0 20 1 26c0 15 1 27 2 35v12c0 4 1 9 1 15v13s1 7 2 13s1 10 1 14l2 24c0 4 1 6 5 7c30 10 62 13 96 8c11 -2 22 -5 32 -9c4 0 6 -2 6 -6l4 -97l4 -178c2 -78 3 -135 3 -169c0 -24 -1 -59 -1 -104
+s-1 -79 -2 -102c-1 -47 -3 -112 -7 -194c0 -13 -1 -33 -3 -60c0 -3 -2 -5 -7 -6c-26 -10 -57 -12 -92 -8c-4 0 -7 1 -11 2s-8 3 -13 4s-8 3 -10 4c-2 0 -3 1 -3 4c-1 7 -1 15 -1 26c-1 7 -2 16 -2 27c-2 4 -3 10 -3 20zM1046 961v0c1 -26 3 -63 4 -114s2 -89 2 -114
+c2 -67 3 -113 3 -140c0 -22 -1 -53 -1 -95s-1 -73 -2 -94c-1 -45 -3 -111 -7 -199c-1 -8 -2 -20 -2 -36s0 -28 -1 -36c0 -3 -2 -5 -7 -6c-27 -9 -58 -11 -93 -8c-5 1 -12 2 -20 5s-12 5 -13 5c-3 0 -5 1 -5 5c0 12 0 31 -2 56s-4 45 -5 58c0 15 -1 40 -2 73s-2 59 -3 77
+c0 13 -1 33 -2 60s-1 47 -1 60v68c-1 46 -1 69 0 70c1 55 3 136 7 242c2 48 4 94 8 139c0 4 2 6 6 7c29 10 61 13 95 8c12 -2 23 -5 33 -9c3 0 4 -2 4 -6zM60 -18v98h1390v-98h-1390zM0 -128v73h1506v-73h-1506z" />
+    <glyph glyph-name="volume-up" unicode="&#xf028;" horiz-adv-x="1664" 
+d="M768 1184v-1088c0 -35 -29 -64 -64 -64c-17 0 -33 7 -45 19l-333 333h-262c-35 0 -64 29 -64 64v384c0 35 29 64 64 64h262l333 333c12 12 28 19 45 19c35 0 64 -29 64 -64zM1152 640c0 -100 -61 -197 -155 -235c-8 -4 -17 -5 -25 -5c-35 0 -64 28 -64 64
+c0 76 116 55 116 176s-116 100 -116 176c0 36 29 64 64 64c8 0 17 -1 25 -5c94 -37 155 -135 155 -235zM1408 640c0 -203 -122 -392 -310 -471c-8 -3 -17 -5 -25 -5c-36 0 -65 29 -65 64c0 28 16 47 39 59c27 14 52 26 76 44c99 72 157 187 157 309s-58 237 -157 309
+c-24 18 -49 30 -76 44c-23 12 -39 31 -39 59c0 35 29 64 64 64c9 0 18 -2 26 -5c188 -79 310 -268 310 -471zM1664 640c0 -307 -183 -585 -465 -706c-8 -3 -17 -5 -26 -5c-35 0 -64 29 -64 64c0 29 15 45 39 59c14 8 30 13 45 21c28 15 56 32 82 51c164 121 261 312 261 516
+s-97 395 -261 516c-26 19 -54 36 -82 51c-15 8 -31 13 -45 21c-24 14 -39 30 -39 59c0 35 29 64 64 64c9 0 18 -2 26 -5c282 -121 465 -399 465 -706z" />
+    <glyph glyph-name="spoon" unicode="&#xf1b1;" horiz-adv-x="640" 
+d="M640 1008c0 -200 -87 -331 -209 -379l45 -821c2 -35 -25 -64 -60 -64h-192c-35 0 -62 29 -60 64l45 821c-122 48 -209 179 -209 379c0 256 143 528 320 528s320 -272 320 -528z" />
+    <glyph glyph-name="facebook" unicode="&#xf09a;" horiz-adv-x="864" 
+d="M864 1524v-264h-157c-123 0 -146 -59 -146 -144v-189h293l-39 -296h-254v-759h-306v759h-255v296h255v218c0 253 155 391 381 391c108 0 201 -8 228 -12z" />
+    <glyph glyph-name="universal-access" unicode="&#xf29a;" horiz-adv-x="1792" 
+d="M1374 879c-8 34 -42 55 -77 47c-143 -34 -273 -62 -401 -62s-258 28 -401 62c-35 8 -69 -13 -77 -47c-8 -35 13 -69 47 -77c106 -25 205 -47 303 -58c-4 -338 -41 -432 -83 -540l-9 -21c-13 -33 4 -70 37 -83c7 -3 15 -4 23 -4c26 0 50 15 60 41l8 20
+c28 72 54 139 71 259h42c17 -120 43 -187 71 -259l8 -20c10 -26 34 -41 60 -41c8 0 16 1 23 4c33 13 50 50 37 83l-9 21c-42 108 -79 202 -83 540c98 11 197 33 303 58c34 8 55 42 47 77zM1024 1024c0 71 -57 128 -128 128s-128 -57 -128 -128s57 -128 128 -128
+s128 57 128 128zM1600 640c0 -389 -315 -704 -704 -704s-704 315 -704 704s315 704 704 704s704 -315 704 -704zM896 1408c-423 0 -768 -345 -768 -768s345 -768 768 -768s768 345 768 768s-345 768 -768 768zM1792 640c0 -495 -401 -896 -896 -896s-896 401 -896 896
+s401 896 896 896s896 -401 896 -896z" />
+    <glyph glyph-name="cloud-download" unicode="&#xf0ed;" horiz-adv-x="1920" 
+d="M1280 608c0 18 -14 32 -32 32h-224v352c0 17 -15 32 -32 32h-192c-17 0 -32 -15 -32 -32v-352h-224c-18 0 -32 -15 -32 -32c0 -8 3 -17 9 -23l352 -352c6 -6 14 -9 23 -9c8 0 17 3 23 9l351 351c6 7 10 15 10 24zM1920 384c0 -212 -172 -384 -384 -384h-1088
+c-247 0 -448 201 -448 448c0 174 101 332 258 405c-1 15 -2 29 -2 43c0 283 229 512 512 512c208 0 395 -126 474 -318c46 40 105 62 166 62c141 0 256 -115 256 -256c0 -49 -14 -97 -41 -138c174 -41 297 -196 297 -374z" />
+    <glyph glyph-name="trophy" unicode="&#xf091;" horiz-adv-x="1664" 
+d="M458 653c-42 92 -74 214 -74 371h-256v-96c0 -98 133 -234 330 -275zM1536 928v96h-256c0 -157 -32 -279 -74 -371c197 41 330 177 330 275zM1664 1056v-128c0 -190 -230 -400 -542 -415c-40 -51 -77 -81 -95 -95c-53 -48 -67 -98 -67 -162s32 -128 128 -128
+s192 -64 192 -160v-64c0 -18 -14 -32 -32 -32h-832c-18 0 -32 14 -32 32v64c0 96 96 160 192 160s128 64 128 128s-14 114 -67 162c-18 14 -55 44 -95 95c-312 15 -542 225 -542 415v128c0 53 43 96 96 96h288v96c0 88 72 160 160 160h576c88 0 160 -72 160 -160v-96h288
+c53 0 96 -43 96 -96z" />
+    <glyph glyph-name="caret-up" unicode="&#xf0d8;" horiz-adv-x="1024" 
+d="M1024 320c0 -35 -29 -64 -64 -64h-896c-35 0 -64 29 -64 64c0 17 7 33 19 45l448 448c12 12 28 19 45 19s33 -7 45 -19l448 -448c12 -12 19 -28 19 -45z" />
+    <glyph glyph-name="magic" unicode="&#xf0d0;" horiz-adv-x="1637" 
+d="M1163 955l293 293l-107 107l-293 -293zM1610 1248c0 -17 -6 -33 -18 -45l-1286 -1286c-12 -12 -28 -18 -45 -18s-33 6 -45 18l-198 198c-12 12 -18 28 -18 45s6 33 18 45l1286 1286c12 12 28 18 45 18s33 -6 45 -18l198 -198c12 -12 18 -28 18 -45zM259 1438l98 -30
+l-98 -30l-30 -98l-30 98l-98 30l98 30l30 98zM609 1276l196 -60l-196 -60l-60 -196l-60 196l-196 60l196 60l60 196zM1539 798l98 -30l-98 -30l-30 -98l-30 98l-98 30l98 30l30 98zM899 1438l98 -30l-98 -30l-30 -98l-30 98l-98 30l98 30l30 98z" />
+    <glyph glyph-name="hourglass-o" unicode="&#xf250;" 
+d="M1408 1408c0 -370 -177 -638 -373 -768c196 -130 373 -398 373 -768h96c18 0 32 -14 32 -32v-64c0 -18 -14 -32 -32 -32h-1472c-18 0 -32 14 -32 32v64c0 18 14 32 32 32h96c0 370 177 638 373 768c-196 130 -373 398 -373 768h-96c-18 0 -32 14 -32 32v64
+c0 18 14 32 32 32h1472c18 0 32 -14 32 -32v-64c0 -18 -14 -32 -32 -32h-96zM874 700c202 76 406 343 406 708h-1024c0 -365 204 -632 406 -708c25 -9 42 -33 42 -60s-17 -51 -42 -60c-202 -76 -406 -343 -406 -708h1024c0 365 -204 632 -406 708c-25 9 -42 33 -42 60
+s17 51 42 60z" />
+    <glyph glyph-name="balance-scale" unicode="&#xf24e;" horiz-adv-x="2176" 
+d="M1728 1088l-384 -704h768zM448 1088l-384 -704h768zM1269 1280c-19 -54 -63 -98 -117 -117v-1291h608c18 0 32 -14 32 -32v-64c0 -18 -14 -32 -32 -32h-1344c-18 0 -32 14 -32 32v64c0 18 14 32 32 32h608v1291c-54 19 -98 63 -117 117h-491c-18 0 -32 14 -32 32v64
+c0 18 14 32 32 32h491c27 75 97 128 181 128s154 -53 181 -128h491c18 0 32 -14 32 -32v-64c0 -18 -14 -32 -32 -32h-491zM1088 1264c44 0 80 36 80 80s-36 80 -80 80s-80 -36 -80 -80s36 -80 80 -80zM2176 384c0 -206 -285 -288 -448 -288s-448 82 -448 288
+c0 39 349 657 392 735c11 20 33 33 56 33s45 -13 56 -33c43 -78 392 -696 392 -735zM896 384c0 -206 -285 -288 -448 -288s-448 82 -448 288c0 39 349 657 392 735c11 20 33 33 56 33s45 -13 56 -33c43 -78 392 -696 392 -735z" />
+    <glyph glyph-name="upload" unicode="&#xf093;" horiz-adv-x="1664" 
+d="M1280 64c0 35 -29 64 -64 64s-64 -29 -64 -64s29 -64 64 -64s64 29 64 64zM1536 64c0 35 -29 64 -64 64s-64 -29 -64 -64s29 -64 64 -64s64 29 64 64zM1664 288v-320c0 -53 -43 -96 -96 -96h-1472c-53 0 -96 43 -96 96v320c0 53 43 96 96 96h427c27 -74 98 -128 181 -128
+h256c83 0 154 54 181 128h427c53 0 96 -43 96 -96zM1339 936c-10 -24 -33 -40 -59 -40h-256v-448c0 -35 -29 -64 -64 -64h-256c-35 0 -64 29 -64 64v448h-256c-26 0 -49 16 -59 40c-10 23 -5 51 14 69l448 448c12 13 29 19 45 19s33 -6 45 -19l448 -448
+c19 -18 24 -46 14 -69z" />
+    <glyph glyph-name="magnet" unicode="&#xf076;" 
+d="M1536 704v-128c0 -408 -323 -704 -768 -704s-768 296 -768 704v128c0 35 29 64 64 64h384c35 0 64 -29 64 -64v-128c0 -183 213 -192 256 -192s256 9 256 192v128c0 35 29 64 64 64h384c35 0 64 -29 64 -64zM512 1344v-384c0 -35 -29 -64 -64 -64h-384
+c-35 0 -64 29 -64 64v384c0 35 29 64 64 64h384c35 0 64 -29 64 -64zM1536 1344v-384c0 -35 -29 -64 -64 -64h-384c-35 0 -64 29 -64 64v384c0 35 29 64 64 64h384c35 0 64 -29 64 -64z" />
+    <glyph glyph-name="adjust" unicode="&#xf042;" 
+d="M768 96v1088c-300 0 -544 -244 -544 -544s244 -544 544 -544zM1536 640c0 -424 -344 -768 -768 -768s-768 344 -768 768s344 768 768 768s768 -344 768 -768z" />
+    <glyph glyph-name="subway" unicode="&#xf239;" 
+d="M1088 1536c247 0 448 -143 448 -320v-896c0 -173 -191 -313 -431 -319l213 -202c21 -20 7 -55 -22 -55h-1056c-29 0 -43 35 -22 55l213 202c-240 6 -431 146 -431 319v896c0 177 201 320 448 320h640zM288 224c88 0 160 72 160 160s-72 160 -160 160s-160 -72 -160 -160
+s72 -160 160 -160zM704 768v512h-544v-512h544zM1248 224c88 0 160 72 160 160s-72 160 -160 160s-160 -72 -160 -160s72 -160 160 -160zM1408 768v512h-576v-512h576z" />
+    <glyph glyph-name="unslpash" unicode="&#xf325;" 
+d="M1052 728h484v-856h-1536v856h484v-428h568v428zM484 1408h568v-428h-568v428z" />
+    <glyph glyph-name="chevron-down" unicode="&#xf078;" horiz-adv-x="1612" 
+d="M1593 728l-742 -741c-25 -25 -65 -25 -90 0l-742 741c-25 25 -25 66 0 91l166 165c25 25 65 25 90 0l531 -531l531 531c25 25 65 25 90 0l166 -165c25 -25 25 -66 0 -91z" />
+    <glyph glyph-name="location-arrow" unicode="&#xf124;" horiz-adv-x="1408" 
+d="M1401 1187l-640 -1280c-11 -22 -33 -35 -57 -35c-5 0 -10 1 -15 2c-29 7 -49 32 -49 62v576h-576c-30 0 -55 20 -62 49s7 59 33 72l1280 640c9 5 19 7 29 7c17 0 33 -6 45 -19c20 -19 25 -49 12 -74z" />
+    <glyph glyph-name="check-circle" unicode="&#xf058;" 
+d="M1284 802c0 17 -6 34 -18 46l-91 90c-12 12 -28 19 -45 19s-33 -7 -45 -19l-408 -407l-226 226c-12 12 -28 19 -45 19s-33 -7 -45 -19l-91 -90c-12 -12 -18 -29 -18 -46s6 -33 18 -45l362 -362c12 -12 29 -19 45 -19c17 0 34 7 46 19l543 543c12 12 18 28 18 45z
+M1536 640c0 -424 -344 -768 -768 -768s-768 344 -768 768s344 768 768 768s768 -344 768 -768z" />
+    <glyph glyph-name="arrow-down" unicode="&#xf063;" horiz-adv-x="1558" 
+d="M1558 704c0 -34 -14 -67 -37 -90l-651 -652c-24 -23 -57 -37 -91 -37s-67 14 -90 37l-651 652c-24 23 -38 56 -38 90s14 67 38 91l74 75c24 23 57 37 91 37s67 -14 90 -37l294 -294v704c0 70 58 128 128 128h128c70 0 128 -58 128 -128v-704l294 294c23 23 56 37 90 37
+s67 -14 91 -37l75 -75c23 -24 37 -57 37 -91z" />
+    <glyph glyph-name="bicycle" unicode="&#xf206;" horiz-adv-x="2304" 
+d="M762 384h-314c-53 0 -83 60 -51 102l188 251c-42 20 -88 31 -137 31c-176 0 -320 -144 -320 -320s144 -320 320 -320c155 0 284 110 314 256zM576 512h186c-12 56 -38 107 -75 148zM1056 512l288 384h-480l-99 -132c67 -66 112 -154 126 -252h165zM2176 448
+c0 176 -144 320 -320 320c-43 0 -83 -9 -121 -24l174 -260c20 -30 12 -70 -17 -89c-11 -8 -24 -11 -36 -11c-21 0 -41 10 -53 29l-174 260c-57 -58 -93 -137 -93 -225c0 -176 144 -320 320 -320s320 144 320 320zM2304 448c0 -247 -201 -448 -448 -448s-448 201 -448 448
+c0 132 58 251 149 333l-65 98l-353 -469c-12 -17 -31 -26 -51 -26h-197c-31 -217 -217 -384 -443 -384c-247 0 -448 201 -448 448s201 448 448 448c78 0 151 -20 215 -55l137 183h-224c-35 0 -64 29 -64 64s29 64 64 64h384v-128h435l-85 128h-222c-35 0 -64 29 -64 64
+s29 64 64 64h256c21 0 41 -11 53 -28l267 -400c58 28 123 44 192 44c247 0 448 -201 448 -448z" />
+    <glyph glyph-name="instagram" unicode="&#xf16d;" 
+d="M1024 640c0 141 -115 256 -256 256s-256 -115 -256 -256s115 -256 256 -256s256 115 256 256zM1162 640c0 -218 -176 -394 -394 -394s-394 176 -394 394s176 394 394 394s394 -176 394 -394zM1270 1050c0 -51 -41 -92 -92 -92s-92 41 -92 92s41 92 92 92s92 -41 92 -92z
+M768 1270c-112 0 -352 9 -453 -31c-35 -14 -61 -31 -88 -58s-44 -53 -58 -88c-40 -101 -31 -341 -31 -453s-9 -352 31 -453c14 -35 31 -61 58 -88s53 -44 88 -58c101 -40 341 -31 453 -31s352 -9 453 31c35 14 61 31 88 58s44 53 58 88c40 101 31 341 31 453s9 352 -31 453
+c-14 35 -31 61 -58 88s-53 44 -88 58c-101 40 -341 31 -453 31zM1536 640c0 -106 1 -211 -5 -317c-6 -123 -34 -232 -124 -322s-199 -118 -322 -124c-106 -6 -211 -5 -317 -5s-211 -1 -317 5c-123 6 -232 34 -322 124s-118 199 -124 322c-6 106 -5 211 -5 317s-1 211 5 317
+c6 123 34 232 124 322s199 118 322 124c106 6 211 5 317 5s211 1 317 -5c123 -6 232 -34 322 -124s118 -199 124 -322c6 -106 5 -211 5 -317z" />
+    <glyph glyph-name="caret-square-o-up" unicode="&#xf151;" 
+d="M1145 419c-11 -22 -33 -35 -57 -35h-640c-24 0 -46 13 -57 35c-11 21 -9 47 5 66l320 448c12 17 31 27 52 27s40 -10 52 -27l320 -448c14 -19 16 -45 5 -66zM1280 160v960c0 17 -15 32 -32 32h-960c-17 0 -32 -15 -32 -32v-960c0 -17 15 -32 32 -32h960c17 0 32 15 32 32
+zM1536 1120v-960c0 -159 -129 -288 -288 -288h-960c-159 0 -288 129 -288 288v960c0 159 129 288 288 288h960c159 0 288 -129 288 -288z" />
+    <glyph glyph-name="crop" unicode="&#xf125;" horiz-adv-x="1664" 
+d="M557 256h595v595zM512 301l595 595h-595v-595zM1664 224v-192c0 -18 -14 -32 -32 -32h-224v-224c0 -18 -14 -32 -32 -32h-192c-18 0 -32 14 -32 32v224h-864c-18 0 -32 14 -32 32v864h-224c-18 0 -32 14 -32 32v192c0 18 14 32 32 32h224v224c0 18 14 32 32 32h192
+c18 0 32 -14 32 -32v-224h851l246 247c13 12 33 12 46 0c12 -13 12 -33 0 -46l-247 -246v-851h224c18 0 32 -14 32 -32z" />
+    <glyph glyph-name="external-link" unicode="&#xf08e;" horiz-adv-x="1792" 
+d="M1408 608v-320c0 -159 -129 -288 -288 -288h-832c-159 0 -288 129 -288 288v832c0 159 129 288 288 288h704c18 0 32 -14 32 -32v-64c0 -18 -14 -32 -32 -32h-704c-88 0 -160 -72 -160 -160v-832c0 -88 72 -160 160 -160h832c88 0 160 72 160 160v320c0 18 14 32 32 32
+h64c18 0 32 -14 32 -32zM1792 1472v-512c0 -35 -29 -64 -64 -64c-17 0 -33 7 -45 19l-176 176l-652 -652c-6 -6 -15 -10 -23 -10s-17 4 -23 10l-114 114c-6 6 -10 15 -10 23s4 17 10 23l652 652l-176 176c-12 12 -19 28 -19 45c0 35 29 64 64 64h512c35 0 64 -29 64 -64z
+" />
+    <glyph glyph-name="arrow-circle-down" unicode="&#xf0ab;" 
+d="M1284 639c0 17 -6 33 -18 45l-91 91c-12 12 -28 18 -45 18s-33 -6 -45 -18l-189 -189v502c0 35 -29 64 -64 64h-128c-35 0 -64 -29 -64 -64v-502l-189 189c-12 12 -28 19 -45 19s-33 -7 -45 -19l-91 -91c-12 -12 -18 -28 -18 -45s6 -33 18 -45l362 -362l91 -91
+c12 -12 28 -18 45 -18s33 6 45 18l91 91l362 362c12 12 18 28 18 45zM1536 640c0 -424 -344 -768 -768 -768s-768 344 -768 768s344 768 768 768s768 -344 768 -768z" />
+    <glyph glyph-name="font-awesome" unicode="&#xf2b4;" horiz-adv-x="1499" 
+d="M1499 1024v-839c0 -31 -20 -54 -49 -62c-107 -32 -227 -52 -338 -52c-150 0 -277 59 -443 59c-123 0 -250 -20 -370 -48v-338h-160v1368c-84 33 -139 115 -139 205c0 121 98 219 219 219s219 -98 219 -219c0 -90 -55 -172 -139 -205v-68c112 26 228 44 343 44
+c66 0 132 -5 198 -15c86 -13 173 -43 261 -43c55 0 111 7 165 18c41 8 135 40 169 40c35 0 64 -29 64 -64z" />
+    <glyph glyph-name="paper-plane" unicode="&#xf1d8;" horiz-adv-x="1792" 
+d="M1764 1525c21 -15 31 -39 27 -64l-256 -1536c-3 -19 -15 -35 -32 -45c-9 -5 -20 -8 -31 -8c-8 0 -16 2 -24 5l-453 185l-242 -295c-12 -15 -30 -23 -49 -23c-7 0 -15 1 -22 4c-25 9 -42 33 -42 60v349l864 1059l-1069 -925l-395 162c-23 9 -38 30 -40 55
+c-1 24 11 47 32 59l1664 960c10 6 21 9 32 9c13 0 26 -4 36 -11z" />
+    <glyph glyph-name="meanpath" unicode="&#xf20c;" 
+d="M1311 694v-114c0 -32 -19 -52 -51 -52h-202c-32 0 -52 20 -52 52v114c0 32 20 52 52 52h202c32 0 51 -20 51 -52zM821 464v250c0 71 -47 118 -118 118h-133c-45 0 -78 -19 -96 -52c-18 33 -51 52 -96 52h-130c-70 0 -118 -47 -118 -118v-250c0 -15 7 -22 21 -22h55
+c15 0 22 7 22 22v230c0 32 19 52 52 52h94c32 0 52 -20 52 -52v-230c0 -15 6 -22 21 -22h54c15 0 22 7 22 22v230c0 32 20 52 52 52h97c32 0 51 -20 51 -52v-230c0 -15 7 -22 22 -22h55c14 0 21 7 21 22zM1410 560v154c0 71 -48 118 -119 118h-264c-71 0 -119 -47 -119 -118
+v-410c0 -15 8 -21 22 -21h55c15 0 21 6 21 21v180c19 -26 49 -42 94 -42h191c71 0 119 48 119 118zM1536 1176v-1072c0 -128 -104 -232 -232 -232h-1072c-128 0 -232 104 -232 232v1072c0 128 104 232 232 232h1072c128 0 232 -104 232 -232z" />
+    <glyph glyph-name="long-arrow-left" unicode="&#xf177;" horiz-adv-x="1728" 
+d="M1728 736v-192c0 -18 -14 -32 -32 -32h-1248v-224c0 -13 -7 -24 -19 -29s-25 -3 -35 5l-384 350c-6 6 -10 14 -10 23s4 18 10 24l384 354c10 9 23 11 35 6c11 -5 19 -16 19 -29v-224h1248c18 0 32 -14 32 -32z" />
+    <glyph glyph-name="download" unicode="&#xf019;" horiz-adv-x="1664" 
+d="M1280 192c0 35 -29 64 -64 64s-64 -29 -64 -64s29 -64 64 -64s64 29 64 64zM1536 192c0 35 -29 64 -64 64s-64 -29 -64 -64s29 -64 64 -64s64 29 64 64zM1664 416v-320c0 -53 -43 -96 -96 -96h-1472c-53 0 -96 43 -96 96v320c0 53 43 96 96 96h465l135 -136
+c37 -36 85 -56 136 -56s99 20 136 56l136 136h464c53 0 96 -43 96 -96zM1339 985c10 -24 5 -52 -14 -70l-448 -448c-12 -13 -29 -19 -45 -19s-33 6 -45 19l-448 448c-19 18 -24 46 -14 70c10 23 33 39 59 39h256v448c0 35 29 64 64 64h256c35 0 64 -29 64 -64v-448h256
+c26 0 49 -16 59 -39z" />
+    <glyph glyph-name="bold" unicode="&#xf032;" horiz-adv-x="1408" 
+d="M555 15c44 -19 92 -32 140 -32c228 0 376 91 376 335c0 62 -8 127 -41 180c-93 150 -227 158 -388 158c-30 0 -73 0 -101 -10c0 -106 -1 -212 -1 -317c0 -69 -9 -256 15 -314zM541 761c36 -6 73 -7 109 -7c206 0 353 58 353 289c0 195 -173 262 -340 262
+c-44 0 -87 -6 -130 -13c0 -101 8 -202 8 -303c0 -53 -1 -106 -1 -159c0 -23 0 -46 1 -69zM0 -128l2 94c64 16 129 17 191 43c35 59 30 163 30 230c0 22 2 978 -22 1025c-15 29 -162 36 -195 40l-4 83c238 4 476 21 713 21c45 0 91 -1 136 -1c226 0 475 -108 475 -368
+c0 -179 -136 -246 -277 -310c190 -43 359 -172 359 -382c0 -344 -313 -458 -606 -458c-88 0 -176 6 -264 6c-179 0 -360 -16 -538 -23z" />
+    <glyph glyph-name="caret-down" unicode="&#xf0d7;" horiz-adv-x="1024" 
+d="M1024 832c0 -17 -7 -33 -19 -45l-448 -448c-12 -12 -28 -19 -45 -19s-33 7 -45 19l-448 448c-12 12 -19 28 -19 45c0 35 29 64 64 64h896c35 0 64 -29 64 -64z" />
+    <glyph glyph-name="chevron-left" unicode="&#xf053;" horiz-adv-x="1036" 
+d="M1017 1235l-531 -531l531 -531c25 -25 25 -65 0 -90l-166 -166c-25 -25 -65 -25 -90 0l-742 742c-25 25 -25 65 0 90l742 742c25 25 65 25 90 0l166 -166c25 -25 25 -65 0 -90z" />
+    <glyph glyph-name="venus" unicode="&#xf221;" horiz-adv-x="1152" 
+d="M1152 960c0 -296 -224 -540 -512 -572v-260h224c18 0 32 -14 32 -32v-64c0 -18 -14 -32 -32 -32h-224v-224c0 -18 -14 -32 -32 -32h-64c-18 0 -32 14 -32 32v224h-224c-18 0 -32 14 -32 32v64c0 18 14 32 32 32h224v260c-303 33 -535 302 -510 619
+c22 272 238 495 508 525c348 39 642 -232 642 -572zM128 960c0 -247 201 -448 448 -448s448 201 448 448s-201 448 -448 448s-448 -201 -448 -448z" />
+    <glyph glyph-name="font" unicode="&#xf031;" horiz-adv-x="1664" 
+d="M725 977l-170 -450c99 -1 198 -4 297 -4c19 0 38 1 57 2c-52 152 -113 307 -184 452zM0 -128l2 79c94 29 196 9 238 117l237 616l280 724h128c4 -7 8 -14 11 -21l205 -480c75 -177 144 -356 220 -532c45 -104 80 -211 130 -313c7 -16 21 -46 35 -57
+c33 -26 125 -32 172 -50c3 -19 6 -38 6 -57c0 -9 -1 -17 -1 -26c-127 0 -254 16 -381 16c-131 0 -262 -11 -393 -15c0 26 1 52 4 78l131 28c27 6 80 13 80 50c0 36 -129 333 -145 374l-450 2c-26 -58 -127 -320 -127 -358c0 -77 147 -80 204 -88c1 -19 1 -38 1 -58
+c0 -9 -1 -18 -2 -27c-116 0 -233 20 -349 20c-14 0 -34 -6 -48 -8c-63 -11 -125 -14 -188 -14z" />
+    <glyph glyph-name="pinterest" unicode="&#xf0d2;" 
+d="M1536 640c0 -424 -344 -768 -768 -768c-76 0 -148 11 -218 32c29 46 62 105 78 164c0 0 9 34 54 211c26 -51 104 -96 187 -96c247 0 415 225 415 527c0 227 -193 440 -487 440c-364 0 -548 -262 -548 -480c0 -132 50 -250 157 -294c17 -7 33 0 38 20c4 13 12 47 16 61
+c5 20 3 26 -11 43c-31 37 -51 84 -51 151c0 194 145 368 378 368c206 0 320 -126 320 -295c0 -221 -98 -408 -244 -408c-80 0 -140 66 -121 148c23 97 68 202 68 272c0 63 -34 116 -104 116c-82 0 -148 -85 -148 -199c0 0 0 -73 25 -122c-84 -356 -99 -418 -99 -418
+c-14 -58 -15 -123 -13 -177c-271 119 -460 389 -460 704c0 424 344 768 768 768s768 -344 768 -768z" />
+    <glyph glyph-name="sun" unicode="&#xf329;" horiz-adv-x="1707" 
+d="M1706 363c-3 -10 -11 -17 -20 -20l-292 -96v-306c0 -10 -5 -20 -13 -26c-9 -6 -19 -8 -29 -4l-292 94l-180 -248c-6 -8 -16 -13 -26 -13s-20 5 -26 13l-180 248l-292 -94c-10 -4 -20 -2 -29 4c-8 6 -13 16 -13 26v306l-292 96c-9 3 -17 10 -20 20s-2 21 4 29l180 248
+l-180 248c-6 9 -7 19 -4 29s11 17 20 20l292 96v306c0 10 5 20 13 26c9 6 19 8 29 4l292 -94l180 248c12 16 40 16 52 0l180 -248l292 94c10 4 20 2 29 -4c8 -6 13 -16 13 -26v-306l292 -96c9 -3 17 -10 20 -20s2 -20 -4 -29l-180 -248l180 -248c6 -8 7 -19 4 -29z" />
+    <glyph glyph-name="cart-plus" unicode="&#xf217;" horiz-adv-x="1664" 
+d="M1216 832c0 35 -29 64 -64 64h-128v128c0 35 -29 64 -64 64s-64 -29 -64 -64v-128h-128c-35 0 -64 -29 -64 -64s29 -64 64 -64h128v-128c0 -35 29 -64 64 -64s64 29 64 64v128h128c35 0 64 29 64 64zM640 0c0 -71 -57 -128 -128 -128s-128 57 -128 128s57 128 128 128
+s128 -57 128 -128zM1536 0c0 -71 -57 -128 -128 -128s-128 57 -128 128s57 128 128 128s128 -57 128 -128zM1664 1088v-512c0 -32 -24 -60 -57 -64l-1044 -122c4 -22 13 -47 13 -70s-14 -44 -24 -64h920c35 0 64 -29 64 -64s-29 -64 -64 -64h-1024c-35 0 -64 29 -64 64
+c0 31 47 108 61 137l-177 823h-204c-35 0 -64 29 -64 64s29 64 64 64h256c68 0 69 -80 79 -128h1201c35 0 64 -29 64 -64z" />
+    <glyph glyph-name="folder-open-o" unicode="&#xf115;" horiz-adv-x="1909" 
+d="M1781 605c0 28 -31 35 -53 35h-1088c-53 0 -123 -33 -157 -74l-294 -363c-9 -12 -18 -25 -18 -40c0 -28 31 -35 53 -35h1088c53 0 123 33 157 75l294 363c9 11 18 24 18 39zM640 768h768v160c0 53 -43 96 -96 96h-576c-53 0 -96 43 -96 96v64c0 53 -43 96 -96 96h-320
+c-53 0 -96 -43 -96 -96v-853l256 315c58 71 165 122 256 122zM1909 605c0 -44 -19 -86 -46 -120l-295 -363c-57 -70 -166 -122 -256 -122h-1088c-123 0 -224 101 -224 224v960c0 123 101 224 224 224h320c123 0 224 -101 224 -224v-32h544c123 0 224 -101 224 -224v-160h192
+c68 0 136 -31 166 -95c10 -21 15 -44 15 -68z" />
+    <glyph glyph-name="tachometer" unicode="&#xf0e4;" horiz-adv-x="1792" 
+d="M384 384c0 71 -57 128 -128 128s-128 -57 -128 -128s57 -128 128 -128s128 57 128 128zM576 832c0 71 -57 128 -128 128s-128 -57 -128 -128s57 -128 128 -128s128 57 128 128zM1004 351l101 382c8 34 -12 69 -46 78s-69 -12 -78 -46l-101 -382
+c-79 -6 -148 -61 -170 -142c-27 -103 35 -208 137 -235c103 -27 208 35 235 137c21 81 -13 163 -78 208zM1664 384c0 71 -57 128 -128 128s-128 -57 -128 -128s57 -128 128 -128s128 57 128 128zM1024 1024c0 71 -57 128 -128 128s-128 -57 -128 -128s57 -128 128 -128
+s128 57 128 128zM1472 832c0 71 -57 128 -128 128s-128 -57 -128 -128s57 -128 128 -128s128 57 128 128zM1792 384c0 -172 -49 -338 -141 -483c-12 -18 -32 -29 -54 -29h-1402c-22 0 -42 11 -54 29c-92 144 -141 311 -141 483c0 494 402 896 896 896s896 -402 896 -896z
+" />
+    <glyph glyph-name="creative-commons" unicode="&#xf25e;" horiz-adv-x="1792" 
+d="M605 303c-200 0 -344 142 -344 337c0 192 147 337 344 337c159 0 240 -92 243 -96c9 -11 10 -27 2 -39l-53 -78c-5 -8 -14 -13 -24 -14s-19 3 -26 10c0 0 -55 56 -138 56c-99 0 -170 -73 -170 -175c0 -103 73 -177 174 -177c92 0 155 67 156 67c7 8 17 12 27 11
+c10 -2 20 -8 24 -17l45 -82c7 -11 5 -26 -3 -36c-4 -4 -93 -104 -257 -104zM1235 303c-200 0 -344 142 -344 337c0 192 148 337 344 337c159 0 240 -92 243 -96c9 -11 10 -27 2 -39l-53 -78c-5 -8 -14 -13 -24 -14s-19 3 -26 10c0 0 -54 56 -138 56
+c-99 0 -170 -73 -170 -175c0 -103 73 -177 174 -177c92 0 155 67 156 67c7 8 17 12 27 11c11 -2 20 -8 25 -17l45 -82c6 -11 4 -26 -4 -36c-4 -4 -92 -104 -257 -104zM896 1376c-406 0 -736 -330 -736 -736s330 -736 736 -736s736 330 736 736s-330 736 -736 736zM896 1536
+c495 0 896 -401 896 -896s-401 -896 -896 -896s-896 401 -896 896s401 896 896 896z" />
+    <glyph glyph-name="clipboard" unicode="&#xf0ea;" horiz-adv-x="1792" 
+d="M768 -128h896v640h-416c-53 0 -96 43 -96 96v416h-384v-1152zM1024 1312v64c0 17 -15 32 -32 32h-704c-17 0 -32 -15 -32 -32v-64c0 -17 15 -32 32 -32h704c17 0 32 15 32 32zM1280 640h299l-299 299v-299zM1792 512v-672c0 -53 -43 -96 -96 -96h-960
+c-53 0 -96 43 -96 96v160h-544c-53 0 -96 43 -96 96v1344c0 53 43 96 96 96h1088c53 0 96 -43 96 -96v-328c13 -8 25 -17 36 -28l408 -408c38 -38 68 -111 68 -164z" />
+    <glyph glyph-name="eercast" unicode="&#xf2da;" horiz-adv-x="1719" 
+d="M1304 752c35 54 -6 191 -128 272c-121 81 -276 75 -312 21c-35 -53 40 -19 177 -70c226 -84 228 -277 263 -223zM1667 178c-283 -696 -1558 -520 -1531 383c3 115 35 192 68 302c-211 -864 966 -1367 1449 -685c18 25 23 23 14 0zM1428 627c0 -283 -228 -513 -509 -513
+s-509 230 -509 513s228 513 509 513s509 -230 509 -513zM1715 915c-356 808 -1826 510 -1663 -589c-338 1101 1055 1606 1570 822c42 -64 90 -176 93 -233zM1653 573c17 338 -217 569 -533 656c-5 0 -27 9 14 13c772 -26 800 -1260 -41 -1274c274 76 543 266 560 605z" />
+    <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="reply" unicode="&#xf112;" horiz-adv-x="1792" 
+d="M1792 416c0 -140 -70 -323 -127 -451c-11 -23 -22 -55 -37 -76c-7 -10 -14 -17 -28 -17c-20 0 -32 16 -32 35c0 16 4 34 5 50c3 41 5 82 5 123c0 477 -283 560 -714 560h-224v-256c0 -35 -29 -64 -64 -64c-17 0 -33 7 -45 19l-512 512c-12 12 -19 28 -19 45s7 33 19 45
+l512 512c12 12 28 19 45 19c35 0 64 -29 64 -64v-256h224c328 0 736 -58 875 -403c42 -106 53 -221 53 -333z" />
+    <glyph glyph-name="hourglass-half" unicode="&#xf252;" 
+d="M1408 1408c0 -370 -177 -638 -373 -768c196 -130 373 -398 373 -768h96c18 0 32 -14 32 -32v-64c0 -18 -14 -32 -32 -32h-1472c-18 0 -32 14 -32 32v64c0 18 14 32 32 32h96c0 370 177 638 373 768c-196 130 -373 398 -373 768h-96c-18 0 -32 14 -32 32v64
+c0 18 14 32 32 32h1472c18 0 32 -14 32 -32v-64c0 -18 -14 -32 -32 -32h-96zM1280 1408h-1024c0 -146 33 -275 85 -384h854c52 109 85 238 85 384zM1223 192c-74 193 -207 330 -340 384h-230c-133 -54 -266 -191 -340 -384h910z" />
+    <glyph glyph-name="microchip" unicode="&#xf2db;" 
+d="M192 256v-128h-112c-9 0 -16 7 -16 16v16h-48c-9 0 -16 7 -16 16v32c0 9 7 16 16 16h48v16c0 9 7 16 16 16h112zM192 512v-128h-112c-9 0 -16 7 -16 16v16h-48c-9 0 -16 7 -16 16v32c0 9 7 16 16 16h48v16c0 9 7 16 16 16h112zM192 768v-128h-112c-9 0 -16 7 -16 16v16
+h-48c-9 0 -16 7 -16 16v32c0 9 7 16 16 16h48v16c0 9 7 16 16 16h112zM192 1024v-128h-112c-9 0 -16 7 -16 16v16h-48c-9 0 -16 7 -16 16v32c0 9 7 16 16 16h48v16c0 9 7 16 16 16h112zM192 1280v-128h-112c-9 0 -16 7 -16 16v16h-48c-9 0 -16 7 -16 16v32c0 9 7 16 16 16
+h48v16c0 9 7 16 16 16h112zM1280 1440v-1472c0 -53 -43 -96 -96 -96h-832c-53 0 -96 43 -96 96v1472c0 53 43 96 96 96h832c53 0 96 -43 96 -96zM1536 208v-32c0 -9 -7 -16 -16 -16h-48v-16c0 -9 -7 -16 -16 -16h-112v128h112c9 0 16 -7 16 -16v-16h48c9 0 16 -7 16 -16z
+M1536 464v-32c0 -9 -7 -16 -16 -16h-48v-16c0 -9 -7 -16 -16 -16h-112v128h112c9 0 16 -7 16 -16v-16h48c9 0 16 -7 16 -16zM1536 720v-32c0 -9 -7 -16 -16 -16h-48v-16c0 -9 -7 -16 -16 -16h-112v128h112c9 0 16 -7 16 -16v-16h48c9 0 16 -7 16 -16zM1536 976v-32
+c0 -9 -7 -16 -16 -16h-48v-16c0 -9 -7 -16 -16 -16h-112v128h112c9 0 16 -7 16 -16v-16h48c9 0 16 -7 16 -16zM1536 1232v-32c0 -9 -7 -16 -16 -16h-48v-16c0 -9 -7 -16 -16 -16h-112v128h112c9 0 16 -7 16 -16v-16h48c9 0 16 -7 16 -16z" />
+    <glyph glyph-name="graduation-cap" unicode="&#xf19d;" horiz-adv-x="2304" 
+d="M1774 700l18 -316c8 -141 -287 -256 -640 -256s-648 115 -640 256l18 316l574 -181c16 -5 32 -7 48 -7s32 2 48 7zM2304 1024c0 -14 -9 -26 -22 -31l-1120 -352c-4 -1 -7 -1 -10 -1s-6 0 -10 1l-652 206c-57 -45 -97 -155 -105 -290c38 -22 63 -62 63 -109
+c0 -45 -23 -84 -58 -107l58 -433c1 -9 -2 -18 -8 -25s-15 -11 -24 -11h-192c-9 0 -18 4 -24 11s-9 16 -8 25l58 433c-35 23 -58 62 -58 107c0 48 27 89 65 111c6 117 36 243 98 330l-333 104c-13 5 -22 17 -22 31s9 26 22 31l1120 352c4 1 7 1 10 1s6 0 10 -1l1120 -352
+c13 -5 22 -17 22 -31z" />
+    <glyph glyph-name="info-circle" unicode="&#xf05a;" 
+d="M1024 160v160c0 18 -14 32 -32 32h-96v512c0 18 -14 32 -32 32h-320c-18 0 -32 -14 -32 -32v-160c0 -18 14 -32 32 -32h96v-320h-96c-18 0 -32 -14 -32 -32v-160c0 -18 14 -32 32 -32h448c18 0 32 14 32 32zM896 1056v160c0 18 -14 32 -32 32h-192c-18 0 -32 -14 -32 -32
+v-160c0 -18 14 -32 32 -32h192c18 0 32 14 32 32zM1536 640c0 -424 -344 -768 -768 -768s-768 344 -768 768s344 768 768 768s768 -344 768 -768z" />
+    <glyph glyph-name="barcode" unicode="&#xf02a;" horiz-adv-x="2176" 
+d="M0 1404h128v-1532h-128v1532zM2048 1408h128v-1536h-128v1536zM256 1408h128v-1280h-128v1280zM512 1408h256v-1280h-256v1280zM1280 1408h256v-1280h-256v1280zM1792 1408h128v-1280h-128v1280zM1024 1408h128v-1280h-128v1280zM256 0h128v-128h-128v128zM512 0h128
+v-128h-128v128zM768 0h128v-128h-128v128zM1024 0h128v-128h-128v128zM1280 0h128v-128h-128v128zM1536 0h128v-128h-128v128zM1792 0h128v-128h-128v128z" />
+    <glyph glyph-name="exchange" unicode="&#xf0ec;" horiz-adv-x="1792" 
+d="M1792 352v-192c0 -17 -15 -32 -32 -32h-1376v-192c0 -17 -14 -32 -32 -32c-9 0 -17 4 -24 10l-319 320c-6 6 -9 14 -9 22c0 9 3 17 9 23l320 320c6 6 15 9 23 9c17 0 32 -14 32 -32v-192h1376c17 0 32 -14 32 -32zM1792 896c0 -8 -3 -17 -9 -23l-320 -320
+c-6 -6 -15 -9 -23 -9c-17 0 -32 15 -32 32v192h-1376c-17 0 -32 15 -32 32v192c0 17 15 32 32 32h1376v192c0 18 14 32 32 32c9 0 17 -4 24 -10l319 -319c6 -6 9 -15 9 -23z" />
+    <glyph glyph-name="hand-o-up" unicode="&#xf0a6;" 
+d="M1280 -64c0 35 -29 64 -64 64s-64 -29 -64 -64s29 -64 64 -64s64 29 64 64zM1408 700c0 113 -46 189 -167 189c-19 0 -38 -2 -56 -5c-23 42 -80 65 -126 65c-24 0 -48 -6 -69 -18c-32 34 -72 53 -119 53c-32 0 -79 -14 -103 -35v331c0 69 -59 128 -128 128
+c-68 0 -128 -61 -128 -128v-576c-63 0 -128 96 -256 96c-96 0 -128 -75 -128 -160c0 -28 116 -79 139 -90c22 -12 44 -24 65 -37c53 -33 99 -71 145 -112c73 -64 163 -135 163 -241v-32h640v32c0 175 128 346 128 540zM1536 705c0 -112 -31 -218 -69 -322
+c-22 -61 -59 -160 -59 -223v-288c0 -71 -57 -128 -128 -128h-640c-71 0 -128 57 -128 128v288c0 48 -86 116 -119 145c-41 36 -82 70 -129 100c-93 58 -264 101 -264 235c0 159 87 288 256 288c44 0 87 -7 128 -22v374c0 138 117 256 255 256c140 0 257 -116 257 -256v-169
+c42 -3 82 -16 119 -37c14 2 29 3 43 3c64 0 128 -21 178 -60c189 2 300 -127 300 -312z" />
+    <glyph glyph-name="pause" unicode="&#xf04c;" 
+d="M1536 1344v-1408c0 -35 -29 -64 -64 -64h-512c-35 0 -64 29 -64 64v1408c0 35 29 64 64 64h512c35 0 64 -29 64 -64zM640 1344v-1408c0 -35 -29 -64 -64 -64h-512c-35 0 -64 29 -64 64v1408c0 35 29 64 64 64h512c35 0 64 -29 64 -64z" />
+    <glyph glyph-name="github-square" unicode="&#xf092;" 
+d="M519 336c2 3 1 9 -3 13c-5 4 -11 5 -14 2c-2 -3 -1 -9 3 -13c5 -4 11 -5 14 -2zM491 377c-3 4 -8 6 -12 4c-3 -2 -3 -8 0 -12c4 -5 9 -7 12 -5s3 8 0 13zM450 417c1 2 -1 6 -5 8c-3 1 -7 1 -8 -2c-2 -3 0 -6 4 -8c4 -1 8 -1 9 2zM471 394c2 2 2 7 -2 10c-3 4 -8 5 -10 3
+c-3 -3 -2 -7 1 -11c3 -3 8 -5 11 -2zM557 319c1 4 -3 9 -9 11s-11 0 -13 -4c-1 -4 3 -9 9 -11s11 0 13 4zM599 316c0 4 -5 8 -12 8c-6 0 -10 -4 -10 -8s5 -8 11 -8s11 4 11 8zM638 323c-1 4 -7 6 -13 5s-10 -5 -9 -9s6 -7 12 -6s10 6 10 10zM1280 640
+c0 283 -229 512 -512 512s-512 -229 -512 -512c0 -226 147 -418 350 -486c26 -5 35 11 35 25c0 12 0 52 -1 95c0 0 -142 -31 -172 61c0 0 -23 59 -57 74c0 0 -46 32 4 32c0 0 50 -4 78 -53c45 -79 120 -56 149 -43c5 33 18 56 33 69c-114 13 -234 57 -234 253
+c0 56 20 101 53 137c-5 13 -23 65 5 136c43 13 141 -53 141 -53c41 12 84 17 128 17s87 -5 128 -17c0 0 98 66 141 53c28 -71 10 -123 5 -136c33 -36 53 -81 53 -137c0 -197 -120 -240 -234 -253c18 -16 35 -47 35 -95c0 -68 -1 -123 -1 -140c0 -14 9 -30 35 -25
+c203 68 350 260 350 486zM1536 1120v-960c0 -159 -129 -288 -288 -288h-960c-159 0 -288 129 -288 288v960c0 159 129 288 288 288h960c159 0 288 -129 288 -288z" />
+    <glyph glyph-name="search" unicode="&#xf002;" horiz-adv-x="1664" 
+d="M1152 704c0 247 -201 448 -448 448s-448 -201 -448 -448s201 -448 448 -448s448 201 448 448zM1664 -128c0 -70 -58 -128 -128 -128c-34 0 -67 14 -90 38l-343 342c-117 -81 -257 -124 -399 -124c-389 0 -704 315 -704 704s315 704 704 704s704 -315 704 -704
+c0 -142 -43 -282 -124 -399l343 -343c23 -23 37 -56 37 -90z" />
+    <glyph glyph-name="mixcloud" unicode="&#xf289;" horiz-adv-x="2304" 
+d="M1645 438c0 80 -51 148 -121 175c-5 -31 -13 -62 -23 -92c-10 -32 -40 -52 -72 -52c-8 0 -16 1 -24 3c-41 14 -62 57 -49 97c15 46 23 94 23 143c0 250 -204 454 -455 454c-180 0 -342 -107 -414 -267c70 -18 135 -54 188 -106c30 -30 30 -79 0 -109s-79 -30 -109 0
+c-48 48 -112 75 -180 75c-141 0 -256 -114 -256 -255s115 -255 256 -255h1046c105 0 190 85 190 189zM1798 438c0 -189 -154 -342 -343 -342h-1046c-226 0 -409 183 -409 408c0 205 152 374 349 403c83 244 314 412 575 412c315 0 575 -241 605 -548
+c153 -33 269 -170 269 -333zM2048 438c0 -114 -33 -224 -97 -319c-15 -22 -39 -33 -64 -33c-15 0 -30 4 -43 13c-35 23 -44 71 -20 106c47 69 71 149 71 233c0 83 -24 164 -71 233c-24 35 -15 82 20 106s83 14 107 -21c64 -94 97 -204 97 -318zM2304 438
+c0 -159 -46 -312 -134 -443c-15 -22 -39 -34 -64 -34c-14 0 -29 4 -42 13c-35 24 -45 71 -21 106c70 106 108 230 108 358s-38 252 -108 357c-24 35 -14 83 21 106c35 24 82 15 106 -21c88 -130 134 -283 134 -442z" />
+    <glyph glyph-name="snowflake-o" unicode="&#xf2dc;" horiz-adv-x="1570" 
+d="M1519 419l-167 -33l186 -107c30 -17 41 -57 23 -87s-57 -41 -87 -23l-186 106l55 -160c28 -80 -94 -121 -121 -42l-102 300l-271 156v-313l208 -238c56 -63 -41 -148 -96 -84l-112 128v-214c0 -35 -29 -64 -64 -64s-64 29 -64 64v214l-112 -128c-55 -64 -152 21 -96 84
+l208 238v313l-271 -156l-102 -300c-27 -79 -149 -38 -121 42l55 160l-186 -106c-30 -18 -69 -7 -87 23s-7 70 23 87l186 107l-167 33c-83 17 -58 142 25 126l310 -62l271 157l-271 157l-310 -62c-4 -1 -9 -1 -13 -1c-76 0 -87 112 -12 127l167 33l-186 107
+c-30 17 -41 57 -23 87c18 31 57 41 87 23l186 -106l-55 160c-28 80 94 121 121 42l102 -300l271 -156v313l-208 238c-56 63 41 148 96 84l112 -128v214c0 35 29 64 64 64s64 -29 64 -64v-214l112 128c55 64 152 -21 96 -84l-208 -238v-313l271 156l102 300
+c27 79 149 38 121 -42l-55 -160l186 106c30 18 69 7 87 -23s7 -70 -23 -87l-186 -107l167 -33c75 -15 64 -127 -12 -127c-4 0 -9 0 -13 1l-310 62l-271 -157l271 -157l310 62c83 16 108 -109 25 -126z" />
+    <glyph glyph-name="flask" unicode="&#xf0c3;" horiz-adv-x="1458" 
+d="M1424 88c75 -119 22 -216 -119 -216h-1152c-141 0 -194 97 -119 216l503 793v399h-64c-35 0 -64 29 -64 64s29 64 64 64h512c35 0 64 -29 64 -64s-29 -64 -64 -64h-64v-399zM645 813l-272 -429h712l-272 429l-20 31v436h-128v-436z" />
+    <glyph glyph-name="pinterest-square" unicode="&#xf0d3;" 
+d="M1248 1408c159 0 288 -129 288 -288v-960c0 -159 -129 -288 -288 -288h-725c33 47 87 128 108 210c0 0 9 34 53 209c27 -51 104 -95 186 -95c244 0 410 223 410 521c0 225 -191 435 -481 435c-361 0 -543 -259 -543 -475c0 -130 50 -246 156 -290c17 -7 33 0 38 19
+c3 13 11 47 15 61c5 19 3 26 -11 42c-30 37 -50 83 -50 150c0 192 144 363 374 363c204 0 316 -124 316 -291c0 -219 -97 -404 -241 -404c-79 0 -139 66 -120 147c23 96 67 200 67 269c0 62 -33 114 -102 114c-81 0 -146 -84 -146 -196c0 0 0 -72 24 -121
+c-83 -352 -98 -414 -98 -414c-22 -92 -13 -199 -7 -254h-183c-159 0 -288 129 -288 288v960c0 159 129 288 288 288h960z" />
+    <glyph glyph-name="fast-backward" unicode="&#xf049;" horiz-adv-x="1792" 
+d="M1747 1395c25 25 45 16 45 -19v-1472c0 -35 -20 -44 -45 -19l-710 710c-6 6 -10 12 -13 19v-710c0 -35 -20 -44 -45 -19l-710 710c-6 6 -10 12 -13 19v-678c0 -35 -29 -64 -64 -64h-128c-35 0 -64 29 -64 64v1408c0 35 29 64 64 64h128c35 0 64 -29 64 -64v-678
+c3 7 7 13 13 19l710 710c25 25 45 16 45 -19v-710c3 7 7 13 13 19z" />
+    <glyph glyph-name="volume-control-phone" unicode="&#xf2a0;" horiz-adv-x="1408" 
+d="M617 -153c0 -34 -90 -84 -119 -95c-15 -6 -30 -8 -45 -8c-33 0 -66 9 -98 18c-164 49 -203 149 -268 290c-70 151 -87 295 -87 460s17 309 87 460c65 141 104 241 268 290c32 9 65 18 98 18c15 0 30 -2 45 -8c29 -11 119 -61 119 -95c0 -24 -53 -194 -64 -234
+c-6 -25 -8 -66 -27 -84c-13 -12 -34 -14 -51 -14c-47 0 -94 11 -141 11c-14 0 -35 -1 -47 -11c-16 -13 -24 -58 -30 -78c-24 -83 -37 -168 -37 -255s13 -172 37 -255c6 -20 14 -65 30 -78c12 -10 33 -11 47 -11c47 0 94 11 141 11c17 0 38 -2 51 -14c19 -18 21 -59 27 -84
+c11 -40 64 -210 64 -234zM776 760c-17 0 -33 7 -45 19c-25 25 -26 66 0 91c24 24 37 56 37 90s-13 66 -37 91c-26 25 -25 65 0 90s65 25 90 0c48 -48 75 -113 75 -181s-27 -133 -75 -181c-13 -12 -29 -19 -45 -19zM957 579c-17 0 -33 6 -45 19c-25 25 -25 65 0 90
+c72 73 112 169 112 272s-40 199 -112 272c-25 25 -25 65 0 90s65 25 90 0c97 -97 150 -225 150 -362s-53 -265 -150 -362c-12 -13 -29 -19 -45 -19zM1138 398c-17 0 -33 6 -45 19c-25 25 -25 65 0 90c120 121 187 282 187 453s-67 332 -187 453c-25 25 -25 65 0 90
+s65 25 90 0c145 -145 225 -338 225 -543s-80 -398 -225 -543c-12 -13 -29 -19 -45 -19z" />
+    <glyph glyph-name="biometric" unicode="&#xf32b;" horiz-adv-x="2304" 
+d="M1419 640c0 -147 -120 -267 -267 -267s-267 120 -267 267s120 267 267 267s267 -120 267 -267zM0 1222h2304v-521h-769c-29 185 -190 327 -383 327s-354 -142 -383 -327h-769v521zM0 579h769c29 -185 190 -327 383 -327s354 142 383 327h769v-521h-2304v521z" />
+    <glyph glyph-name="tasks" unicode="&#xf0ae;" horiz-adv-x="1792" 
+d="M1024 128h640v128h-640v-128zM640 640h1024v128h-1024v-128zM1280 1152h384v128h-384v-128zM1792 320v-256c0 -35 -29 -64 -64 -64h-1664c-35 0 -64 29 -64 64v256c0 35 29 64 64 64h1664c35 0 64 -29 64 -64zM1792 832v-256c0 -35 -29 -64 -64 -64h-1664
+c-35 0 -64 29 -64 64v256c0 35 29 64 64 64h1664c35 0 64 -29 64 -64zM1792 1344v-256c0 -35 -29 -64 -64 -64h-1664c-35 0 -64 29 -64 64v256c0 35 29 64 64 64h1664c35 0 64 -29 64 -64z" />
+    <glyph glyph-name="firefox" unicode="&#xf269;" horiz-adv-x="1792" 
+d="M903 -256c-386 0 -693 226 -834 549c-158 359 -32 934 249 1188l-11 -281c14 18 121 23 138 0c58 111 245 194 395 197c-57 -48 -189 -223 -178 -312c73 -23 185 -24 244 -28c18 -10 15 -71 -21 -121c0 0 -47 -65 -174 -88l15 -189l-139 67c-45 -114 63 -215 175 -196
+c124 21 168 102 255 97c86 -5 120 -53 109 -98c0 0 -14 -54 -107 -45c-79 -125 -184 -180 -354 -165c258 -214 606 -20 694 155c88 174 11 433 -77 506c104 -45 176 -91 214 -192c20 224 -83 478 -267 627c346 -101 557 -369 563 -797s-379 -874 -889 -874z" />
+    <glyph glyph-name="apple" unicode="&#xf179;" horiz-adv-x="1393" 
+d="M1393 321c-25 -79 -65 -163 -123 -250c-86 -131 -172 -196 -257 -196c-34 0 -80 11 -140 32c-59 22 -110 32 -151 32c-40 0 -88 -11 -142 -33c-55 -23 -99 -34 -132 -34c-103 0 -202 87 -301 259c-97 172 -147 339 -147 503c0 153 38 277 113 374c75 96 169 144 284 144
+c49 0 107 -10 177 -30c69 -20 115 -30 138 -30c29 0 77 11 143 34c66 22 124 34 173 34c80 0 151 -22 213 -65c35 -24 70 -58 104 -100c-52 -44 -90 -83 -114 -118c-43 -62 -65 -131 -65 -207c0 -82 23 -157 69 -223s99 -108 158 -126zM1017 1494c0 -41 -10 -87 -29 -136
+c-20 -50 -51 -96 -93 -138c-36 -36 -72 -60 -108 -72c-23 -7 -57 -13 -104 -17c2 99 28 185 78 257s134 121 250 148c2 -9 4 -16 5 -22c0 -7 1 -13 1 -20z" />
+    <glyph glyph-name="gamepad" unicode="&#xf11b;" horiz-adv-x="1920" 
+d="M832 448v128c0 18 -14 32 -32 32h-192v192c0 18 -14 32 -32 32h-128c-18 0 -32 -14 -32 -32v-192h-192c-18 0 -32 -14 -32 -32v-128c0 -18 14 -32 32 -32h192v-192c0 -18 14 -32 32 -32h128c18 0 32 14 32 32v192h192c18 0 32 14 32 32zM1408 384c0 71 -57 128 -128 128
+s-128 -57 -128 -128s57 -128 128 -128s128 57 128 128zM1664 640c0 71 -57 128 -128 128s-128 -57 -128 -128s57 -128 128 -128s128 57 128 128zM1920 512c0 -283 -229 -512 -512 -512c-130 0 -248 49 -338 128h-220c-90 -79 -208 -128 -338 -128c-283 0 -512 229 -512 512
+s229 512 512 512h896c283 0 512 -229 512 -512z" />
+    <glyph glyph-name="cc-stripe" unicode="&#xf1f5;" horiz-adv-x="2304" 
+d="M1597 633c0 -46 -7 -81 -21 -106c-12 -22 -31 -35 -52 -35c-15 0 -29 3 -41 9v224c26 27 49 30 57 30c38 0 57 -42 57 -122zM2035 669h-110c4 67 22 98 56 98s52 -32 54 -98zM476 534c0 84 -51 119 -134 149c-44 16 -68 29 -68 49c0 17 14 26 38 26c46 0 92 -17 124 -33
+l18 112c-25 12 -77 32 -149 32c-51 0 -93 -13 -123 -38c-32 -26 -48 -64 -48 -109c0 -82 50 -118 132 -147c52 -19 70 -32 70 -53c0 -20 -17 -31 -48 -31c-38 0 -101 19 -142 43l-18 -113c35 -20 100 -41 168 -41c54 0 98 13 129 37c34 27 51 66 51 117zM771 749l19 111h-96
+v135l-129 -21l-18 -114l-46 -8l-17 -103h62v-219c0 -57 15 -96 44 -120c25 -20 61 -30 111 -30c39 0 62 7 79 11v118c-9 -2 -30 -7 -44 -7c-29 0 -42 16 -42 50v197h77zM1087 724v139c-10 2 -19 3 -28 3c-42 0 -76 -22 -89 -62l-10 56h-131v-471h150v306c19 23 46 31 82 31
+c8 0 16 0 26 -2zM1124 389h150v471h-150v-471zM1746 638c0 80 -15 141 -45 179c-27 35 -64 52 -111 52c-43 0 -81 -18 -117 -56l-8 47h-132v-645l150 25v151c23 -7 47 -11 68 -11c37 0 92 10 134 56c41 44 61 112 61 202zM1278 986c0 44 -35 79 -79 79s-79 -35 -79 -79
+s35 -80 79 -80s79 36 79 80zM2176 629c0 75 -16 134 -48 176c-33 42 -82 64 -144 64c-128 0 -207 -94 -207 -246c0 -84 21 -148 63 -188c37 -37 91 -55 161 -55c64 0 123 15 160 40l-16 103c-37 -20 -80 -31 -128 -31c-29 0 -49 6 -63 19c-16 13 -25 35 -28 66h248
+c1 7 2 41 2 52zM2304 1280v-1280c0 -70 -58 -128 -128 -128h-2048c-70 0 -128 58 -128 128v1280c0 70 58 128 128 128h2048c70 0 128 -58 128 -128z" />
+    <glyph glyph-name="quote-left" unicode="&#xf10d;" horiz-adv-x="1664" 
+d="M768 576v-384c0 -106 -86 -192 -192 -192h-384c-106 0 -192 86 -192 192v704c0 282 230 512 512 512h64c35 0 64 -29 64 -64v-128c0 -35 -29 -64 -64 -64h-64c-141 0 -256 -115 -256 -256v-32c0 -53 43 -96 96 -96h224c106 0 192 -86 192 -192zM1664 576v-384
+c0 -106 -86 -192 -192 -192h-384c-106 0 -192 86 -192 192v704c0 282 230 512 512 512h64c35 0 64 -29 64 -64v-128c0 -35 -29 -64 -64 -64h-64c-141 0 -256 -115 -256 -256v-32c0 -53 43 -96 96 -96h224c106 0 192 -86 192 -192z" />
+    <glyph glyph-name="user-times" unicode="&#xf235;" horiz-adv-x="2039" 
+d="M704 640c-212 0 -384 172 -384 384s172 384 384 384s384 -172 384 -384s-172 -384 -384 -384zM1781 320l249 -249c6 -6 9 -14 9 -23c0 -8 -3 -16 -9 -22l-136 -136c-6 -6 -14 -9 -22 -9c-9 0 -17 3 -23 9l-249 249l-249 -249c-6 -6 -14 -9 -23 -9c-8 0 -16 3 -22 9
+l-136 136c-6 6 -9 14 -9 22c0 9 3 17 9 23l249 249l-249 249c-6 6 -9 14 -9 23c0 8 3 16 9 22l136 136c6 6 14 9 22 9c9 0 17 -3 23 -9l249 -249l249 249c6 6 14 9 23 9c8 0 16 -3 22 -9l136 -136c6 -6 9 -14 9 -22c0 -9 -3 -17 -9 -23zM1283 320l-181 -181
+c-24 -24 -37 -57 -37 -91c0 -33 13 -66 37 -90l83 -83c-14 -2 -29 -3 -44 -3h-874c-160 0 -267 96 -267 259c0 226 53 573 346 573c16 0 27 -7 39 -17c96 -76 194 -122 319 -122s223 46 319 122c12 10 23 17 39 17c19 0 38 -2 57 -6c-33 -32 -54 -58 -54 -106
+c0 -34 13 -67 37 -91z" />
+    <glyph glyph-name="plus-square-o" unicode="&#xf196;" horiz-adv-x="1408" 
+d="M1152 736v-64c0 -18 -14 -32 -32 -32h-352v-352c0 -18 -14 -32 -32 -32h-64c-18 0 -32 14 -32 32v352h-352c-18 0 -32 14 -32 32v64c0 18 14 32 32 32h352v352c0 18 14 32 32 32h64c18 0 32 -14 32 -32v-352h352c18 0 32 -14 32 -32zM1280 288v832c0 88 -72 160 -160 160
+h-832c-88 0 -160 -72 -160 -160v-832c0 -88 72 -160 160 -160h832c88 0 160 72 160 160zM1408 1120v-832c0 -159 -129 -288 -288 -288h-832c-159 0 -288 129 -288 288v832c0 159 129 288 288 288h832c159 0 288 -129 288 -288z" />
+    <glyph glyph-name="eye-slash" unicode="&#xf070;" horiz-adv-x="1792" 
+d="M555 201l78 141c-116 84 -185 219 -185 362c0 79 21 157 61 225c-156 -80 -286 -206 -381 -353c104 -161 251 -296 427 -375zM944 960c0 26 -22 48 -48 48c-167 0 -304 -137 -304 -304c0 -26 22 -48 48 -48s48 22 48 48c0 115 94 208 208 208c26 0 48 22 48 48z
+M1307 1151c0 -2 0 -7 -1 -9c-211 -377 -420 -756 -631 -1133l-49 -89c-6 -10 -17 -16 -28 -16c-18 0 -113 58 -134 70c-10 6 -16 16 -16 28c0 16 34 70 44 87c-194 88 -357 238 -472 418c-13 20 -20 44 -20 69c0 24 7 49 20 69c198 304 507 507 876 507c60 0 121 -6 180 -17
+l54 97c6 10 16 16 28 16c18 0 112 -58 133 -70c10 -6 16 -16 16 -27zM1344 704c0 -186 -115 -352 -288 -418l280 502c5 -28 8 -56 8 -84zM1792 576c0 -26 -7 -47 -20 -69c-31 -51 -70 -100 -109 -145c-196 -225 -466 -362 -767 -362l74 132c291 25 538 202 694 444
+c-74 115 -169 216 -282 294l63 112c124 -83 249 -208 327 -337c13 -22 20 -43 20 -69z" />
+    <glyph glyph-name="trello" unicode="&#xf181;" 
+d="M704 192v1024c0 18 -14 32 -32 32h-480c-18 0 -32 -14 -32 -32v-1024c0 -18 14 -32 32 -32h480c18 0 32 14 32 32zM1376 576v640c0 18 -14 32 -32 32h-480c-18 0 -32 -14 -32 -32v-640c0 -18 14 -32 32 -32h480c18 0 32 14 32 32zM1536 1344v-1408c0 -35 -29 -64 -64 -64
+h-1408c-35 0 -64 29 -64 64v1408c0 35 29 64 64 64h1408c35 0 64 -29 64 -64z" />
+    <glyph glyph-name="dribbble" unicode="&#xf17d;" 
+d="M1024 36c-10 58 -48 258 -140 498c-1 0 -3 -1 -4 -1c0 0 -389 -136 -515 -410c-6 5 -15 11 -15 11c114 -93 259 -150 418 -150c91 0 177 19 256 52zM839 643c-16 37 -34 74 -53 111c-338 -101 -662 -93 -673 -93c-1 -7 -1 -14 -1 -21c0 -168 64 -322 168 -438
+c179 319 533 433 533 433c9 3 18 5 26 8zM732 855c-114 202 -235 366 -244 378c-183 -86 -319 -255 -362 -458c17 0 291 -3 606 80zM1416 536c-14 4 -197 62 -409 29c86 -237 121 -430 128 -469c147 99 251 257 281 440zM611 1277c-1 0 -1 0 -2 -1c0 0 1 1 2 1zM1201 1132
+c-115 102 -267 164 -433 164c-53 0 -105 -7 -155 -19c10 -13 134 -176 246 -382c247 92 340 234 342 237zM1424 647c-2 155 -57 298 -149 410c-2 -2 -107 -154 -366 -260c15 -31 30 -63 44 -95c5 -11 9 -23 14 -34c226 29 449 -20 457 -21zM1536 640
+c0 -424 -344 -768 -768 -768s-768 344 -768 768s344 768 768 768s768 -344 768 -768z" />
+    <glyph glyph-name="user-secret" unicode="&#xf21b;" horiz-adv-x="1408" 
+d="M576 0l96 448l-96 128l-128 64zM832 0l128 640l-128 -64l-96 -128zM992 1010c-1 2 -2 4 -4 6c-9 7 -81 8 -96 8c-57 0 -111 -8 -167 -19c-7 -2 -14 -2 -21 -2s-14 0 -21 2c-56 11 -110 19 -167 19c-15 0 -87 -1 -96 -8c-2 -2 -3 -4 -4 -6c1 -9 2 -18 4 -27
+c6 -8 11 -5 15 -17c26 -71 38 -126 128 -126c129 0 93 119 135 119h12c42 0 6 -119 135 -119c90 0 102 55 128 126c4 12 9 9 15 17c2 9 3 18 4 27zM1408 131c0 -163 -107 -259 -267 -259h-874c-160 0 -267 96 -267 259c0 181 32 455 218 545l-90 220h214
+c-14 41 -22 84 -22 128c0 11 1 22 2 32c-39 8 -194 40 -194 96c0 59 170 91 210 99c21 75 71 189 122 248c20 23 45 37 76 37c60 0 108 -62 168 -62s108 62 168 62c31 0 56 -14 76 -37c51 -59 101 -173 122 -248c40 -8 210 -40 210 -99c0 -56 -155 -88 -194 -96
+c5 -54 -2 -108 -20 -160h214l-82 -225c179 -93 210 -362 210 -540z" />
+    <glyph glyph-name="cloud" unicode="&#xf0c2;" horiz-adv-x="1920" 
+d="M1920 384c0 -212 -172 -384 -384 -384h-1088c-247 0 -448 201 -448 448c0 179 106 334 258 405c-1 14 -2 29 -2 43c0 283 229 512 512 512c214 0 397 -131 474 -318c44 39 102 62 166 62c141 0 256 -115 256 -256c0 -51 -15 -98 -41 -138c170 -40 297 -192 297 -374z" />
+    <glyph glyph-name="usd" unicode="&#xf155;" horiz-adv-x="932" 
+d="M932 351c0 -204 -146 -365 -358 -400v-175c0 -18 -14 -32 -32 -32h-135c-17 0 -32 14 -32 32v175c-234 33 -362 173 -367 179c-10 12 -11 29 -2 41l103 135c5 7 14 11 23 12s18 -2 24 -9c2 -1 142 -135 319 -135c98 0 204 52 204 165c0 96 -118 143 -253 197
+c-180 71 -404 161 -404 412c0 184 144 336 353 376v180c0 18 15 32 32 32h135c18 0 32 -14 32 -32v-176c203 -23 311 -133 315 -137c10 -11 12 -26 5 -38l-81 -146c-5 -9 -13 -15 -23 -16c-10 -2 -19 1 -27 7c-1 1 -122 108 -272 108c-127 0 -215 -63 -215 -154
+c0 -106 122 -153 264 -208c184 -71 392 -152 392 -393z" />
+    <glyph glyph-name="eye" unicode="&#xf06e;" horiz-adv-x="1792" 
+d="M1664 576c-95 147 -225 273 -381 353c40 -68 61 -146 61 -225c0 -247 -201 -448 -448 -448s-448 201 -448 448c0 79 21 157 61 225c-156 -80 -286 -206 -381 -353c171 -264 447 -448 768 -448s597 184 768 448zM944 960c0 26 -22 48 -48 48c-167 0 -304 -137 -304 -304
+c0 -26 22 -48 48 -48s48 22 48 48c0 114 94 208 208 208c26 0 48 22 48 48zM1792 576c0 -25 -8 -48 -20 -69c-184 -303 -521 -507 -876 -507s-692 205 -876 507c-12 21 -20 44 -20 69s8 48 20 69c184 302 521 507 876 507s692 -205 876 -507c12 -21 20 -44 20 -69z" />
+    <glyph glyph-name="usb" unicode="&#xf287;" horiz-adv-x="2304" 
+d="M2288 731c10 -5 16 -16 16 -27s-6 -22 -16 -27l-320 -192c-5 -3 -10 -5 -16 -5c-5 0 -11 1 -16 4c-10 6 -16 16 -16 28v128h-858c32 -50 59 -109 83 -165c48 -108 97 -219 167 -219h96v96c0 18 14 32 32 32h320c18 0 32 -14 32 -32v-320c0 -18 -14 -32 -32 -32h-320
+c-18 0 -32 14 -32 32v96h-96c-153 0 -222 157 -284 295c-47 107 -96 217 -164 217h-360c-29 -110 -129 -192 -248 -192c-141 0 -256 115 -256 256s115 256 256 256c119 0 219 -82 248 -192h104c68 0 117 110 164 217c62 138 131 295 284 295h107c27 75 97 128 181 128
+c106 0 192 -86 192 -192s-86 -192 -192 -192c-84 0 -154 53 -181 128h-107c-70 0 -119 -111 -167 -219c-24 -56 -51 -115 -83 -165h1114v128c0 12 6 22 16 28s23 5 32 -1z" />
+    <glyph glyph-name="certificate" unicode="&#xf0a3;" 
+d="M1376 640l138 -135c19 -18 26 -45 20 -70c-7 -25 -27 -45 -52 -51l-188 -48l53 -186c7 -25 0 -52 -19 -70c-18 -19 -45 -26 -70 -19l-186 53l-48 -188c-6 -25 -26 -45 -51 -52c-6 -1 -13 -2 -19 -2c-19 0 -38 8 -51 22l-135 138l-135 -138c-18 -19 -45 -26 -70 -20
+c-26 7 -45 27 -51 52l-48 188l-186 -53c-25 -7 -52 0 -70 19c-19 18 -26 45 -19 70l53 186l-188 48c-25 6 -45 26 -52 51c-6 25 1 52 20 70l138 135l-138 135c-19 18 -26 45 -20 70c7 25 27 45 52 51l188 48l-53 186c-7 25 0 52 19 70c18 19 45 26 70 19l186 -53l48 188
+c6 25 26 45 51 51c25 7 52 0 70 -19l135 -139l135 139c18 19 44 26 70 19c25 -6 45 -26 51 -51l48 -188l186 53c25 7 52 0 70 -19c19 -18 26 -45 19 -70l-53 -186l188 -48c25 -6 45 -26 52 -51c6 -25 -1 -52 -20 -70z" />
+    <glyph glyph-name="500px" unicode="&#xf26e;" horiz-adv-x="1394" 
+d="M1387 -11l-6 -6c-75 -75 -162 -134 -259 -175c-101 -42 -207 -64 -317 -64s-217 22 -317 64c-97 41 -185 100 -259 175c-75 74 -134 161 -175 258c-25 61 -45 124 -54 189c-4 28 35 34 48 36c31 5 52 3 56 -20c1 -1 1 -2 1 -4c4 -20 14 -80 46 -159
+c33 -82 84 -158 152 -226c65 -65 141 -116 226 -152c87 -37 180 -56 276 -56c95 0 188 19 276 56c84 36 160 87 225 152l6 6c7 7 15 9 25 6c9 -2 20 -10 33 -22c32 -33 25 -49 17 -58zM915 604l-66 -66l63 -63c7 -7 20 -22 -7 -49c-11 -11 -22 -17 -32 -17
+c-7 0 -13 3 -19 10l-62 61l-66 -66c-2 -2 -7 -5 -15 -5c-9 0 -20 5 -31 16l-2 2c-7 6 -18 17 -18 29c0 6 3 11 8 17l66 65l-66 66c-11 11 -6 25 14 45c12 12 22 18 31 18c5 0 9 -2 13 -5l65 -66l65 65c11 11 29 6 48 -13c12 -12 25 -29 11 -44zM1386 547
+c0 -79 -16 -156 -46 -228c-30 -70 -72 -132 -126 -186s-117 -96 -187 -126c-72 -31 -149 -46 -228 -46s-156 15 -228 46c-70 30 -133 72 -187 126s-96 116 -125 186c-6 13 -15 38 -15 40h-1c-9 28 31 40 43 44c29 9 51 13 60 -12c24 -64 61 -126 97 -167h1v341
+c2 84 37 169 102 232c67 66 157 103 253 103c196 0 355 -158 355 -352c0 -196 -160 -355 -355 -355c-39 0 -68 3 -112 16c-5 2 -28 12 -13 61c4 13 16 51 44 43c2 0 51 -12 77 -12c139 0 248 108 248 246c0 65 -26 126 -72 171c-46 46 -108 71 -175 71
+c-69 0 -132 -28 -178 -80c-40 -45 -64 -105 -64 -160v-413c72 -44 155 -67 242 -67c128 0 252 51 341 140c90 90 140 211 140 338c0 128 -50 248 -141 339c-90 90 -210 140 -339 140s-250 -50 -340 -140c-1 -1 -58 -60 -77 -87l-2 -2c-12 -17 -23 -33 -73 -22
+c-25 6 -52 21 -52 43v680c0 18 14 38 38 38h877c30 0 30 -42 30 -55c0 -14 0 -55 -30 -55h-811v-483h1c56 59 153 121 210 145c71 30 151 46 231 46c79 0 156 -15 228 -46c70 -30 133 -72 187 -126s96 -116 126 -186c30 -73 46 -149 46 -229zM1355 1128
+c19 -17 6 -35 -13 -57c-12 -12 -25 -26 -39 -26c-6 0 -11 2 -16 7c-72 62 -137 104 -207 133c-87 38 -180 56 -276 56c-85 0 -178 -17 -262 -49c-26 -10 -40 24 -45 37c-6 16 -9 29 -8 38c2 10 7 17 16 20c82 36 194 57 299 57c109 0 216 -22 316 -64
+c92 -39 167 -87 235 -152z" />
+    <glyph glyph-name="liberapay-square" unicode="&#xf2e8;" horiz-adv-x="1533" 
+d="M148 1404h1236c82 0 149 -66 149 -148v-1236c0 -82 -67 -148 -149 -148h-1236c-82 0 -148 66 -148 148v1236c0 82 66 148 148 148zM736 1150v0l-161 -25l-133 -553c-8 -33 -12 -64 -12 -93s6 -54 18 -76s32 -40 60 -53s68 -19 117 -19l31 128c-18 1 -32 4 -42 9
+s-18 12 -22 20s-5 17 -5 27s1 23 4 35zM985 902v0c-42 0 -80 -3 -116 -10s-67 -14 -95 -22l-174 -722h155l47 189c24 -4 47 -6 71 -6c49 0 94 8 135 25s76 41 106 72s52 67 69 109s25 88 25 139c0 31 -4 61 -13 88s-22 51 -40 72c-18 20 -41 36 -69 48s-62 18 -101 18z
+M965 772v0c33 0 56 -11 69 -32s20 -46 20 -76c0 -31 -4 -59 -13 -84s-21 -47 -37 -65s-34 -32 -56 -42s-47 -15 -74 -15c-17 0 -32 1 -44 4l73 303c19 4 40 7 62 7z" />
+    <glyph glyph-name="foursquare" unicode="&#xf180;" horiz-adv-x="1192" 
+d="M956 1102l37 194c7 32 -17 57 -44 57h-712c-32 0 -54 -29 -54 -54v-1101c0 -3 3 -4 6 -1c262 315 291 352 291 352c30 35 42 41 86 41h239c33 0 52 28 55 44s31 162 37 191s-21 59 -48 59h-294c-39 0 -67 28 -67 67v42c0 39 28 66 67 66h346c24 0 51 22 55 43zM1183 1324
+c-37 -180 -148 -749 -158 -790c-12 -47 -30 -129 -144 -129h-271c-11 0 -12 1 -22 -10c0 0 -7 -8 -426 -494c-33 -38 -87 -31 -107 -23s-55 32 -55 98v1410c0 58 36 150 158 150h888c130 0 165 -74 137 -212zM1183 1324l-158 -790c10 41 121 610 158 790z" />
+    <glyph glyph-name="music" unicode="&#xf001;" 
+d="M1536 1312v-1120c0 -141 -211 -192 -320 -192s-320 51 -320 192s211 192 320 192c66 0 132 -12 192 -39v537l-768 -237v-709c0 -141 -211 -192 -320 -192s-320 51 -320 192s211 192 320 192c66 0 132 -12 192 -39v967c0 42 28 79 68 92l832 256c9 3 18 4 28 4
+c53 0 96 -43 96 -96z" />
+    <glyph glyph-name="wpexplorer" 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 640c0 432 -352 784 -784 784s-784 -352 -784 -784
+s352 -784 784 -784s784 352 784 784zM1792 640c0 -494 -402 -896 -896 -896s-896 402 -896 896s402 896 896 896s896 -402 896 -896z" />
+    <glyph glyph-name="gg-circle" 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 640c0 -495 -401 -896 -896 -896
+s-896 401 -896 896s401 896 896 896s896 -401 896 -896z" />
+    <glyph glyph-name="sort" unicode="&#xf0dc;" horiz-adv-x="1024" 
+d="M1024 448c0 -17 -7 -33 -19 -45l-448 -448c-12 -12 -28 -19 -45 -19s-33 7 -45 19l-448 448c-12 12 -19 28 -19 45c0 35 29 64 64 64h896c35 0 64 -29 64 -64zM1024 832c0 -35 -29 -64 -64 -64h-896c-35 0 -64 29 -64 64c0 17 7 33 19 45l448 448c12 12 28 19 45 19
+s33 -7 45 -19l448 -448c12 -12 19 -28 19 -45z" />
+    <glyph glyph-name="pencil" unicode="&#xf040;" horiz-adv-x="1515" 
+d="M363 0l91 91l-235 235l-91 -91v-107h128v-128h107zM886 928c0 13 -9 22 -22 22c-6 0 -12 -2 -17 -7l-542 -542c-5 -5 -7 -11 -7 -17c0 -13 9 -22 22 -22c6 0 12 2 17 7l542 542c5 5 7 11 7 17zM832 1120l416 -416l-832 -832h-416v416zM1515 1024c0 -34 -14 -67 -37 -90
+l-166 -166l-416 416l166 165c23 24 56 38 90 38s67 -14 91 -38l235 -234c23 -24 37 -57 37 -91z" />
+    <glyph glyph-name="bookmark-o" unicode="&#xf097;" horiz-adv-x="1280" 
+d="M1152 1280h-1024v-1242l423 406l89 85l89 -85l423 -406v1242zM1164 1408c15 0 30 -3 44 -9c44 -17 72 -58 72 -103v-1289c0 -45 -28 -86 -72 -103c-14 -6 -29 -8 -44 -8c-31 0 -60 11 -83 32l-441 424l-441 -424c-23 -21 -52 -33 -83 -33c-15 0 -30 3 -44 9
+c-44 17 -72 58 -72 103v1289c0 45 28 86 72 103c14 6 29 9 44 9h1048z" />
+    <glyph glyph-name="diamond" 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 -512c19 -24 17 -59 -4 -82l-960 -1024c-12 -13 -29 -20 -47 -20
+s-35 7 -47 20l-960 1024c-21 23 -23 58 -4 82l384 512c12 17 31 26 51 26h1152c20 0 39 -9 51 -26z" />
+    <glyph glyph-name="share" unicode="&#xf064;" horiz-adv-x="1792" 
+d="M1792 896c0 -17 -7 -33 -19 -45l-512 -512c-12 -12 -28 -19 -45 -19c-35 0 -64 29 -64 64v256h-224c-431 0 -714 -83 -714 -560c0 -41 2 -82 5 -123c1 -16 5 -34 5 -50c0 -19 -12 -35 -32 -35c-14 0 -21 7 -28 17c-15 21 -26 53 -37 76c-57 128 -127 311 -127 451
+c0 112 11 227 53 333c139 345 547 403 875 403h224v256c0 35 29 64 64 64c17 0 33 -7 45 -19l512 -512c12 -12 19 -28 19 -45z" />
+    <glyph glyph-name="envelope" unicode="&#xf0e0;" horiz-adv-x="1792" 
+d="M1792 826v-794c0 -88 -72 -160 -160 -160h-1472c-88 0 -160 72 -160 160v794c30 -33 64 -62 101 -87c166 -113 334 -226 497 -345c84 -62 188 -138 297 -138h2c109 0 213 76 297 138c163 118 331 232 498 345c36 25 70 54 100 87zM1792 1120c0 -112 -83 -213 -171 -274
+c-156 -108 -313 -216 -468 -325c-65 -45 -175 -137 -256 -137h-2c-81 0 -191 92 -256 137c-155 109 -312 217 -467 325c-71 48 -172 161 -172 252c0 98 53 182 160 182h1472c87 0 160 -72 160 -160z" />
+    <glyph glyph-name="yahoo" unicode="&#xf19e;" horiz-adv-x="1318" 
+d="M750 579l13 -707c-34 6 -69 11 -105 11c-35 0 -70 -5 -105 -11l13 707c-186 321 -361 648 -566 957c35 -9 71 -15 108 -15s75 7 111 15c140 -248 292 -489 439 -733c148 242 305 483 439 733c35 -9 71 -14 107 -14c38 0 77 5 114 14c-80 -110 -146 -230 -215 -347
+c-119 -203 -236 -406 -353 -610z" />
+    <glyph glyph-name="window-restore" unicode="&#xf2d2;" horiz-adv-x="2048" 
+d="M256 0h768v512h-768v-512zM1280 512h512v768h-768v-256h96c88 0 160 -72 160 -160v-352zM2048 1376v-960c0 -88 -72 -160 -160 -160h-608v-352c0 -88 -72 -160 -160 -160h-960c-88 0 -160 72 -160 160v960c0 88 72 160 160 160h608v352c0 88 72 160 160 160h960
+c88 0 160 -72 160 -160z" />
+    <glyph glyph-name="glass" unicode="&#xf000;" horiz-adv-x="1606" 
+d="M1606 1350c0 -29 -23 -58 -43 -78l-632 -632v-768h320c35 0 64 -29 64 -64s-29 -64 -64 -64h-896c-35 0 -64 29 -64 64s29 64 64 64h320v768l-632 632c-20 20 -43 49 -43 78c0 49 62 58 99 58h1408c37 0 99 -9 99 -58z" />
+    <glyph glyph-name="flag" unicode="&#xf024;" horiz-adv-x="1728" 
+d="M256 1280c0 -46 -25 -87 -64 -110v-1266c0 -17 -15 -32 -32 -32h-64c-17 0 -32 15 -32 32v1266c-39 23 -64 64 -64 110c0 71 57 128 128 128s128 -57 128 -128zM1728 1216v-763c0 -37 -23 -51 -52 -66c-113 -61 -238 -116 -369 -116c-184 0 -272 140 -490 140
+c-159 0 -326 -72 -464 -146c-11 -6 -21 -9 -33 -9c-35 0 -64 29 -64 64v742c0 24 12 41 31 55c24 16 53 30 79 43c126 64 279 120 421 120c157 0 280 -52 419 -117c28 -14 57 -19 88 -19c157 0 326 136 370 136c35 0 64 -29 64 -64z" />
+    <glyph glyph-name="train" unicode="&#xf238;" 
+d="M1088 1536c247 0 448 -143 448 -320v-896c0 -173 -191 -313 -431 -319l213 -202c21 -20 7 -55 -22 -55h-1056c-29 0 -43 35 -22 55l213 202c-240 6 -431 146 -431 319v896c0 177 201 320 448 320h640zM768 192c106 0 192 86 192 192s-86 192 -192 192s-192 -86 -192 -192
+s86 -192 192 -192zM1344 768v512h-1152v-512h1152z" />
+    <glyph glyph-name="bullhorn" unicode="&#xf0a1;" horiz-adv-x="1792" 
+d="M1664 896c71 0 128 -57 128 -128s-57 -128 -128 -128v-384c0 -70 -58 -128 -128 -128c-178 148 -465 351 -812 380c-119 -40 -160 -179 -82 -259c-70 -115 20 -196 126 -279c-62 -122 -320 -124 -412 -39c-58 178 -144 356 -74 581h-122c-88 0 -160 72 -160 160v192
+c0 88 72 160 160 160h480c384 0 704 224 896 384c70 0 128 -58 128 -128v-384zM1536 292v954c-261 -200 -514 -315 -768 -343v-270c254 -28 507 -141 768 -341z" />
+    <glyph glyph-name="pause-circle-o" unicode="&#xf28c;" 
+d="M768 1408c424 0 768 -344 768 -768s-344 -768 -768 -768s-768 344 -768 768s344 768 768 768zM768 96c300 0 544 244 544 544s-244 544 -544 544s-544 -244 -544 -544s244 -544 544 -544zM864 320c-18 0 -32 14 -32 32v576c0 18 14 32 32 32h192c18 0 32 -14 32 -32v-576
+c0 -18 -14 -32 -32 -32h-192zM480 320c-18 0 -32 14 -32 32v576c0 18 14 32 32 32h192c18 0 32 -14 32 -32v-576c0 -18 -14 -32 -32 -32h-192z" />
+    <glyph glyph-name="snapchat-ghost" unicode="&#xf2ac;" horiz-adv-x="1634" 
+d="M833 1408c180 2 329 -99 404 -261c23 -49 27 -125 27 -179c0 -64 -5 -127 -9 -191c8 -4 19 -7 28 -7c36 0 66 27 102 27c34 0 83 -24 83 -64c0 -96 -201 -78 -201 -162c0 -15 6 -29 12 -43c48 -105 139 -206 247 -251c26 -11 52 -17 80 -23c18 -4 28 -17 28 -35
+c0 -68 -173 -96 -219 -103c-20 -31 -5 -104 -58 -104c-41 0 -82 13 -126 13c-21 0 -42 -1 -62 -5c-119 -20 -159 -148 -354 -148c-188 0 -233 128 -349 148c-21 4 -42 5 -63 5c-45 0 -88 -15 -124 -15c-56 0 -39 74 -60 106c-46 7 -219 35 -219 103c0 18 10 31 28 35
+c28 6 54 12 80 23c107 44 200 146 247 251c6 14 12 28 12 43c0 84 -202 68 -202 161c0 39 46 64 81 64c31 0 62 -26 101 -26c11 0 22 2 32 7c-4 63 -9 126 -9 190c0 54 4 131 27 180c88 190 237 259 436 261z" />
+    <glyph glyph-name="folder" unicode="&#xf07b;" horiz-adv-x="1664" 
+d="M1664 928v-704c0 -123 -101 -224 -224 -224h-1216c-123 0 -224 101 -224 224v960c0 123 101 224 224 224h320c123 0 224 -101 224 -224v-32h672c123 0 224 -101 224 -224z" />
+    <glyph glyph-name="outdent" unicode="&#xf03b;" horiz-adv-x="1792" 
+d="M384 992v-576c0 -17 -15 -32 -32 -32c-8 0 -17 3 -23 9l-288 288c-6 6 -9 15 -9 23s3 17 9 23l288 288c6 6 15 9 23 9c17 0 32 -15 32 -32zM1792 224v-192c0 -17 -15 -32 -32 -32h-1728c-17 0 -32 15 -32 32v192c0 17 15 32 32 32h1728c17 0 32 -15 32 -32zM1792 608
+v-192c0 -17 -15 -32 -32 -32h-1088c-17 0 -32 15 -32 32v192c0 17 15 32 32 32h1088c17 0 32 -15 32 -32zM1792 992v-192c0 -17 -15 -32 -32 -32h-1088c-17 0 -32 15 -32 32v192c0 17 15 32 32 32h1088c17 0 32 -15 32 -32zM1792 1376v-192c0 -17 -15 -32 -32 -32h-1728
+c-17 0 -32 15 -32 32v192c0 17 15 32 32 32h1728c17 0 32 -15 32 -32z" />
+    <glyph glyph-name="stumbleupon" unicode="&#xf1a4;" horiz-adv-x="1920" 
+d="M1062 824v118c0 56 -46 102 -102 102s-102 -46 -102 -102v-612c0 -234 -194 -423 -429 -423c-237 0 -429 192 -429 429v266h328v-262c0 -57 46 -102 102 -102s102 45 102 102v620c0 229 196 413 428 413c233 0 428 -185 428 -416v-136l-195 -58zM1592 602h328v-266
+c0 -237 -192 -429 -429 -429c-236 0 -429 190 -429 425v268l131 -61l195 58v-270c0 -56 46 -101 102 -101s102 45 102 101v275z" />
+    <glyph glyph-name="address-card" unicode="&#xf2bb;" horiz-adv-x="2048" 
+d="M1024 405c0 155 -38 327 -196 327c-49 -28 -115 -76 -188 -76s-139 48 -188 76c-158 0 -196 -172 -196 -327c0 -87 57 -149 128 -149h512c71 0 128 62 128 149zM867 925c0 125 -102 227 -227 227s-227 -102 -227 -227c0 -126 102 -227 227 -227s227 101 227 227z
+M1792 416v64c0 18 -14 32 -32 32h-576c-18 0 -32 -14 -32 -32v-64c0 -18 14 -32 32 -32h576c18 0 32 14 32 32zM1792 676v56c0 20 -16 36 -36 36h-568c-20 0 -36 -16 -36 -36v-56c0 -20 16 -36 36 -36h568c20 0 36 16 36 36zM1792 928v64c0 18 -14 32 -32 32h-576
+c-18 0 -32 -14 -32 -32v-64c0 -18 14 -32 32 -32h576c18 0 32 14 32 32zM2048 1248v-1216c0 -88 -72 -160 -160 -160h-352v96c0 18 -14 32 -32 32h-64c-18 0 -32 -14 -32 -32v-96h-768v96c0 18 -14 32 -32 32h-64c-18 0 -32 -14 -32 -32v-96h-352c-88 0 -160 72 -160 160
+v1216c0 88 72 160 160 160h1728c88 0 160 -72 160 -160z" />
+    <glyph glyph-name="i-cursor" unicode="&#xf246;" horiz-adv-x="896" 
+d="M832 1408c-212 0 -320 -75 -320 -224v-416h128v-128h-128v-544c0 -149 108 -224 320 -224h64v-128h-64c-180 0 -312 52 -384 146c-72 -94 -204 -146 -384 -146h-64v128h64c212 0 320 75 320 224v544h-128v128h128v416c0 149 -108 224 -320 224h-64v128h64
+c180 0 312 -52 384 -146c72 94 204 146 384 146h64v-128h-64z" />
+    <glyph glyph-name="car" unicode="&#xf1b9;" horiz-adv-x="2048" 
+d="M480 448c0 88 -72 160 -160 160s-160 -72 -160 -160s72 -160 160 -160s160 72 160 160zM516 768h1016l-89 357c-3 11 -23 27 -35 27h-768c-12 0 -32 -16 -35 -27zM1888 448c0 88 -72 160 -160 160s-160 -72 -160 -160s72 -160 160 -160s160 72 160 160zM2048 544v-384
+c0 -18 -14 -32 -32 -32h-96v-128c0 -106 -86 -192 -192 -192s-192 86 -192 192v128h-1024v-128c0 -106 -86 -192 -192 -192s-192 86 -192 192v128h-96c-18 0 -32 14 -32 32v384c0 124 100 224 224 224h28l105 419c31 126 153 221 283 221h768c130 0 252 -95 283 -221
+l105 -419h28c124 0 224 -100 224 -224z" />
+    <glyph glyph-name="file-excel-o" unicode="&#xf1c3;" 
+d="M1468 1156c37 -37 68 -111 68 -164v-1152c0 -53 -43 -96 -96 -96h-1344c-53 0 -96 43 -96 96v1600c0 53 43 96 96 96h896c53 0 127 -31 164 -68zM1024 1400v-376h376c-6 17 -15 34 -22 41l-313 313c-7 7 -24 16 -41 22zM1408 -128v1024h-416c-53 0 -96 43 -96 96v416
+h-768v-1536h1280zM429 106h68l194 283l-189 272h-68v107h290v-107h-76l106 -159c8 -9 13 -16 17 -23c2 -3 4 -6 5 -10h2c0 -1 9 14 21 33l103 159h-74v107h279v-107h-67l-195 -282l192 -273h68v-106h-291v106h76l-107 161c-7 10 -13 16 -17 24c-2 3 -4 6 -5 10h-2
+c-3 0 -9 -15 -21 -34l-103 -161h75v-106h-281v106z" />
+    <glyph glyph-name="arrow-circle-o-left" unicode="&#xf190;" 
+d="M1152 736v-192c0 -17 -15 -32 -32 -32h-352v-192c0 -18 -14 -32 -32 -32c-9 0 -17 4 -24 10l-319 319c-6 6 -9 15 -9 23s3 17 9 23l320 320c6 6 15 9 23 9c17 0 32 -15 32 -32v-192h352c17 0 32 -15 32 -32zM1312 640c0 300 -244 544 -544 544s-544 -244 -544 -544
+s244 -544 544 -544s544 244 544 544zM1536 640c0 -424 -344 -768 -768 -768s-768 344 -768 768s344 768 768 768s768 -344 768 -768z" />
+    <glyph glyph-name="paragraph" unicode="&#xf1dd;" horiz-adv-x="1254" 
+d="M1254 1347v-73c0 -34 -27 -93 -61 -93c-17 0 -37 3 -54 -1c-16 -4 -28 -15 -32 -31c-5 -19 -3 -43 -3 -64v-1152c0 -34 -27 -61 -61 -61h-108c-34 0 -61 27 -61 61v1218h-143v-1218c0 -34 -27 -61 -61 -61h-108c-34 0 -61 27 -61 61v496c-97 8 -180 28 -245 59
+c-84 39 -148 99 -192 179c-42 77 -64 164 -64 259c0 111 30 207 88 286c59 79 129 132 209 159c75 25 233 37 417 37h479c34 0 61 -27 61 -61z" />
+    <glyph glyph-name="y-combinator" unicode="&#xf23b;" 
+d="M809 532l266 499h-112l-157 -312s-24 -48 -44 -92c-19 46 -42 92 -42 92l-155 312h-120l263 -493v-324h101v318zM1536 1408v-1536h-1536v1536h1536z" />
+    <glyph glyph-name="male" unicode="&#xf183;" horiz-adv-x="1024" 
+d="M1024 832v-416c0 -53 -43 -96 -96 -96s-96 43 -96 96v352h-64v-912c0 -62 -50 -112 -112 -112s-112 50 -112 112v464h-64v-464c0 -62 -50 -112 -112 -112s-112 50 -112 112v912h-64v-352c0 -53 -43 -96 -96 -96s-96 43 -96 96v416c0 106 86 192 192 192h640
+c106 0 192 -86 192 -192zM736 1280c0 -124 -100 -224 -224 -224s-224 100 -224 224s100 224 224 224s224 -100 224 -224z" />
+    <glyph glyph-name="history" unicode="&#xf1da;" 
+d="M1536 640c0 -423 -345 -768 -768 -768c-229 0 -445 101 -591 277c-10 13 -9 32 2 43l137 138c7 6 16 9 25 9c9 -1 18 -5 23 -12c98 -127 245 -199 404 -199c282 0 512 230 512 512s-230 512 -512 512c-131 0 -255 -50 -348 -137l137 -138c19 -18 24 -46 14 -69
+c-10 -24 -33 -40 -59 -40h-448c-35 0 -64 29 -64 64v448c0 26 16 49 40 59c23 10 51 5 69 -14l130 -129c141 133 332 212 529 212c423 0 768 -345 768 -768zM896 928v-448c0 -18 -14 -32 -32 -32h-320c-18 0 -32 14 -32 32v64c0 18 14 32 32 32h224v352c0 18 14 32 32 32h64
+c18 0 32 -14 32 -32z" />
+    <glyph glyph-name="h-square" unicode="&#xf0fd;" 
+d="M1280 192v896c0 35 -29 64 -64 64h-128c-35 0 -64 -29 -64 -64v-320h-512v320c0 35 -29 64 -64 64h-128c-35 0 -64 -29 -64 -64v-896c0 -35 29 -64 64 -64h128c35 0 64 29 64 64v320h512v-320c0 -35 29 -64 64 -64h128c35 0 64 29 64 64zM1536 1120v-960
+c0 -159 -129 -288 -288 -288h-960c-159 0 -288 129 -288 288v960c0 159 129 288 288 288h960c159 0 288 -129 288 -288z" />
+    <glyph glyph-name="heart" unicode="&#xf004;" horiz-adv-x="1792" 
+d="M896 -128c-16 0 -32 6 -44 18l-624 602c-8 7 -228 208 -228 448c0 293 179 468 478 468c175 0 339 -138 418 -216c79 78 243 216 418 216c299 0 478 -175 478 -468c0 -240 -220 -441 -229 -450l-623 -600c-12 -12 -28 -18 -44 -18z" />
+    <glyph glyph-name="sort-amount-desc" unicode="&#xf161;" horiz-adv-x="1760" 
+d="M1184 -32v-192c0 -18 -14 -32 -32 -32h-256c-18 0 -32 14 -32 32v192c0 18 14 32 32 32h256c18 0 32 -14 32 -32zM704 96c0 -9 -4 -17 -10 -24l-319 -319c-7 -6 -15 -9 -23 -9s-16 3 -23 9l-320 320c-9 10 -12 23 -7 35s17 20 30 20h192v1376c0 18 14 32 32 32h192
+c18 0 32 -14 32 -32v-1376h192c18 0 32 -14 32 -32zM1376 480v-192c0 -18 -14 -32 -32 -32h-448c-18 0 -32 14 -32 32v192c0 18 14 32 32 32h448c18 0 32 -14 32 -32zM1568 992v-192c0 -18 -14 -32 -32 -32h-640c-18 0 -32 14 -32 32v192c0 18 14 32 32 32h640
+c18 0 32 -14 32 -32zM1760 1504v-192c0 -18 -14 -32 -32 -32h-832c-18 0 -32 14 -32 32v192c0 18 14 32 32 32h832c18 0 32 -14 32 -32z" />
+    <glyph glyph-name="search-plus" unicode="&#xf00e;" horiz-adv-x="1664" 
+d="M1024 736v-64c0 -17 -15 -32 -32 -32h-224v-224c0 -17 -15 -32 -32 -32h-64c-17 0 -32 15 -32 32v224h-224c-17 0 -32 15 -32 32v64c0 17 15 32 32 32h224v224c0 17 15 32 32 32h64c17 0 32 -15 32 -32v-224h224c17 0 32 -15 32 -32zM1152 704c0 247 -201 448 -448 448
+s-448 -201 -448 -448s201 -448 448 -448s448 201 448 448zM1664 -128c0 -71 -57 -128 -128 -128c-34 0 -67 14 -90 38l-343 342c-117 -81 -257 -124 -399 -124c-389 0 -704 315 -704 704s315 704 704 704s704 -315 704 -704c0 -142 -43 -282 -124 -399l343 -343
+c23 -23 37 -56 37 -90z" />
+    <glyph glyph-name="life-ring" unicode="&#xf1cd;" horiz-adv-x="1792" 
+d="M896 1536c495 0 896 -401 896 -896s-401 -896 -896 -896s-896 401 -896 896s401 896 896 896zM896 1408c-130 0 -253 -33 -361 -90l194 -194c53 18 109 28 167 28c59 0 114 -10 167 -28l194 194c-108 57 -231 90 -361 90zM218 279l194 194c-18 53 -28 109 -28 167
+c0 59 10 114 28 167l-194 194c-57 -108 -90 -231 -90 -361s33 -253 90 -361zM896 -128c130 0 253 33 361 90l-194 194c-53 -18 -108 -28 -167 -28c-58 0 -114 10 -167 28l-194 -194c108 -57 231 -90 361 -90zM896 256c212 0 384 172 384 384s-172 384 -384 384
+s-384 -172 -384 -384s172 -384 384 -384zM1380 473l194 -194c57 108 90 231 90 361s-33 253 -90 361l-194 -194c18 -53 28 -109 28 -167s-10 -114 -28 -167z" />
+    <glyph glyph-name="lock" unicode="&#xf023;" horiz-adv-x="1152" 
+d="M320 768h512v192c0 141 -115 256 -256 256s-256 -115 -256 -256v-192zM1152 672v-576c0 -53 -43 -96 -96 -96h-960c-53 0 -96 43 -96 96v576c0 53 43 96 96 96h32v192c0 246 202 448 448 448s448 -202 448 -448v-192h32c53 0 96 -43 96 -96z" />
+    <glyph glyph-name="git-square" unicode="&#xf1d2;" 
+d="M582 228c0 -54 -49 -66 -93 -66c-43 0 -107 7 -107 63c0 55 54 64 98 64c42 0 102 -7 102 -61zM546 694c0 -50 -20 -85 -74 -85c-55 0 -77 32 -77 84s20 90 77 90c51 0 74 -42 74 -89zM712 769v125c-43 -16 -89 -29 -135 -29c-33 19 -71 29 -110 29
+c-114 0 -204 -84 -204 -200c0 -62 41 -148 103 -169v-3c-32 -14 -38 -53 -38 -85c0 -33 12 -60 41 -77v-3c-68 -22 -113 -65 -113 -139c0 -127 121 -163 227 -163c128 0 224 47 224 188c0 100 -91 130 -174 145c-28 5 -76 25 -76 60c0 33 18 47 49 52c102 20 167 99 167 204
+c0 18 -4 35 -10 52c16 4 33 8 49 13zM771 350h137c-2 27 -2 55 -2 82v387c0 23 0 46 2 69h-137c3 -23 3 -48 3 -71v-392c0 -25 0 -50 -3 -75zM1280 366v121c-20 -14 -44 -21 -68 -21c-45 0 -53 45 -53 82v225h52c18 0 35 -2 53 -2v117h-105c0 34 -2 68 3 102h-140
+c3 -18 4 -36 4 -55v-47h-60v-117c12 1 24 3 37 3c7 0 15 -1 23 -1v-2h-2v-217c0 -108 16 -212 148 -212c37 0 75 6 108 24zM924 1072c0 47 -35 91 -84 91s-85 -43 -85 -91c0 -47 37 -89 85 -89s84 43 84 89zM1536 1120v-960c0 -159 -129 -288 -288 -288h-960
+c-159 0 -288 129 -288 288v960c0 159 129 288 288 288h960c159 0 288 -129 288 -288z" />
+    <glyph glyph-name="mouse-pointer" unicode="&#xf245;" horiz-adv-x="1152" 
+d="M1133 493c19 -18 24 -46 14 -69c-10 -24 -33 -40 -59 -40h-382l201 -476c14 -33 -2 -70 -34 -84l-177 -75c-33 -14 -70 2 -84 34l-191 452l-312 -312c-12 -12 -28 -19 -45 -19c-8 0 -17 2 -24 5c-24 10 -40 33 -40 59v1504c0 26 16 49 40 59c7 3 16 5 24 5
+c17 0 33 -6 45 -19z" />
+    <glyph glyph-name="sign-in" unicode="&#xf090;" 
+d="M1184 640c0 -17 -7 -33 -19 -45l-544 -544c-12 -12 -28 -19 -45 -19c-35 0 -64 29 -64 64v288h-448c-35 0 -64 29 -64 64v384c0 35 29 64 64 64h448v288c0 35 29 64 64 64c17 0 33 -7 45 -19l544 -544c12 -12 19 -28 19 -45zM1536 992v-704c0 -159 -129 -288 -288 -288
+h-320c-17 0 -32 15 -32 32c0 28 -13 96 32 96h320c88 0 160 72 160 160v704c0 88 -72 160 -160 160h-288c-25 0 -64 -5 -64 32c0 28 -13 96 32 96h320c159 0 288 -129 288 -288z" />
+    <glyph glyph-name="odnoklassniki-square" unicode="&#xf264;" 
+d="M927 956c0 -88 -71 -159 -159 -159s-159 71 -159 159s71 159 159 159s159 -71 159 -159zM1141 593c-18 36 -69 67 -136 14c0 0 -91 -72 -237 -72s-237 72 -237 72c-67 53 -118 22 -136 -14c-32 -64 4 -95 85 -148c69 -44 165 -61 226 -67l-51 -52
+c-72 -72 -142 -142 -191 -190c-29 -29 -29 -76 0 -105l9 -9c29 -29 76 -29 105 0l191 191c72 -73 142 -143 191 -191c29 -29 76 -29 105 0l9 9c29 29 29 76 0 105l-191 190l-52 52c62 6 156 23 225 67c81 53 117 84 85 148zM1092 956c0 179 -145 324 -324 324
+s-324 -145 -324 -324s145 -324 324 -324s324 145 324 324zM1536 1120v-960c0 -159 -129 -288 -288 -288h-960c-159 0 -288 129 -288 288v960c0 159 129 288 288 288h960c159 0 288 -129 288 -288z" />
+    <glyph glyph-name="tag" unicode="&#xf02b;" horiz-adv-x="1515" 
+d="M448 1088c0 71 -57 128 -128 128s-128 -57 -128 -128s57 -128 128 -128s128 57 128 128zM1515 512c0 -34 -14 -67 -37 -90l-491 -492c-24 -23 -57 -37 -91 -37s-67 14 -90 37l-715 716c-51 50 -91 147 -91 218v416c0 70 58 128 128 128h416c71 0 168 -40 219 -91
+l715 -714c23 -24 37 -57 37 -91z" />
+    <glyph glyph-name="align-justify" unicode="&#xf039;" horiz-adv-x="1792" 
+d="M1792 192v-128c0 -35 -29 -64 -64 -64h-1664c-35 0 -64 29 -64 64v128c0 35 29 64 64 64h1664c35 0 64 -29 64 -64zM1792 576v-128c0 -35 -29 -64 -64 -64h-1664c-35 0 -64 29 -64 64v128c0 35 29 64 64 64h1664c35 0 64 -29 64 -64zM1792 960v-128
+c0 -35 -29 -64 -64 -64h-1664c-35 0 -64 29 -64 64v128c0 35 29 64 64 64h1664c35 0 64 -29 64 -64zM1792 1344v-128c0 -35 -29 -64 -64 -64h-1664c-35 0 -64 29 -64 64v128c0 35 29 64 64 64h1664c35 0 64 -29 64 -64z" />
+    <glyph glyph-name="hospital-o" unicode="&#xf0f8;" horiz-adv-x="1408" 
+d="M384 224v-64c0 -17 -15 -32 -32 -32h-64c-17 0 -32 15 -32 32v64c0 17 15 32 32 32h64c17 0 32 -15 32 -32zM384 480v-64c0 -17 -15 -32 -32 -32h-64c-17 0 -32 15 -32 32v64c0 17 15 32 32 32h64c17 0 32 -15 32 -32zM640 480v-64c0 -17 -15 -32 -32 -32h-64
+c-17 0 -32 15 -32 32v64c0 17 15 32 32 32h64c17 0 32 -15 32 -32zM384 736v-64c0 -17 -15 -32 -32 -32h-64c-17 0 -32 15 -32 32v64c0 17 15 32 32 32h64c17 0 32 -15 32 -32zM1152 224v-64c0 -17 -15 -32 -32 -32h-64c-17 0 -32 15 -32 32v64c0 17 15 32 32 32h64
+c17 0 32 -15 32 -32zM896 480v-64c0 -17 -15 -32 -32 -32h-64c-17 0 -32 15 -32 32v64c0 17 15 32 32 32h64c17 0 32 -15 32 -32zM640 736v-64c0 -17 -15 -32 -32 -32h-64c-17 0 -32 15 -32 32v64c0 17 15 32 32 32h64c17 0 32 -15 32 -32zM1152 480v-64
+c0 -17 -15 -32 -32 -32h-64c-17 0 -32 15 -32 32v64c0 17 15 32 32 32h64c17 0 32 -15 32 -32zM896 736v-64c0 -17 -15 -32 -32 -32h-64c-17 0 -32 15 -32 32v64c0 17 15 32 32 32h64c17 0 32 -15 32 -32zM1152 736v-64c0 -17 -15 -32 -32 -32h-64c-17 0 -32 15 -32 32v64
+c0 17 15 32 32 32h64c17 0 32 -15 32 -32zM896 -128h384v1152h-256v-32c0 -53 -43 -96 -96 -96h-448c-53 0 -96 43 -96 96v32h-256v-1152h384v224c0 17 15 32 32 32h320c17 0 32 -15 32 -32v-224zM896 1056v320c0 17 -15 32 -32 32h-64c-17 0 -32 -15 -32 -32v-96h-128v96
+c0 17 -15 32 -32 32h-64c-17 0 -32 -15 -32 -32v-320c0 -17 15 -32 32 -32h64c17 0 32 15 32 32v96h128v-96c0 -17 15 -32 32 -32h64c17 0 32 15 32 32zM1408 1088v-1280c0 -35 -29 -64 -64 -64h-1280c-35 0 -64 29 -64 64v1280c0 35 29 64 64 64h320v288c0 53 43 96 96 96
+h448c53 0 96 -43 96 -96v-288h320c35 0 64 -29 64 -64z" />
+    <glyph glyph-name="chevron-circle-down" unicode="&#xf13a;" 
+d="M813 237l454 454c25 25 25 65 0 90l-102 102c-25 25 -65 25 -90 0l-307 -307l-307 307c-25 25 -65 25 -90 0l-102 -102c-25 -25 -25 -65 0 -90l454 -454c25 -25 65 -25 90 0zM1536 640c0 -424 -344 -768 -768 -768s-768 344 -768 768s344 768 768 768s768 -344 768 -768z
+" />
+    <glyph glyph-name="filter" unicode="&#xf0b0;" horiz-adv-x="1408" 
+d="M1403 1241c10 -24 5 -52 -14 -70l-493 -493v-742c0 -26 -16 -49 -39 -59c-8 -3 -17 -5 -25 -5c-17 0 -33 6 -45 19l-256 256c-12 12 -19 28 -19 45v486l-493 493c-19 18 -24 46 -14 70c10 23 33 39 59 39h1280c26 0 49 -16 59 -39z" />
+    <glyph glyph-name="google-plus" unicode="&#xf0d5;" horiz-adv-x="2304" 
+d="M1437 623c0 -419 -281 -716 -704 -716c-405 0 -733 328 -733 733s328 733 733 733c198 0 363 -72 491 -192l-199 -191c-54 52 -149 113 -292 113c-250 0 -454 -207 -454 -463s204 -463 454 -463c290 0 399 209 416 316h-416v252h692c7 -37 12 -74 12 -122zM2304 745v-210
+h-209v-209h-210v209h-209v210h209v209h210v-209h209z" />
+    <glyph glyph-name="sticky-note-o" unicode="&#xf24a;" 
+d="M1400 256h-248v-248c17 6 34 15 41 22l185 185c7 7 16 24 22 41zM1120 384h288v896h-1280v-1280h896v288c0 53 43 96 96 96zM1536 1312v-1024c0 -53 -31 -127 -68 -164l-184 -184c-37 -37 -111 -68 -164 -68h-1024c-53 0 -96 43 -96 96v1344c0 53 43 96 96 96h1344
+c53 0 96 -43 96 -96z" />
+    <glyph glyph-name="fonticons" 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 925c41 0 57 -15 56 -79l174 21c0 153 -105 181 -222 181c-174 0 -265 -70 -265 -240v-72h-96v-128h76
+c10 0 20 0 20 -8v-382c0 -19 -5 -25 -23 -27l-73 -7v-88h448v86l-149 14c-18 2 -11 5 -11 25v387h191l38 128h-231c-10 0 2 7 2 15v80c0 60 2 94 65 94zM1248 96v86l-54 9c-19 3 -10 5 -10 25v520h-275l-23 -101l83 -22c13 -4 23 -13 23 -27v-370c0 -19 -8 -23 -26 -25
+l-70 -9v-86h352z" />
+    <glyph glyph-name="comments-o" unicode="&#xf0e6;" horiz-adv-x="1792" 
+d="M704 1152c-312 0 -576 -176 -576 -384c0 -110 74 -216 202 -290l97 -56l-35 -84c21 12 42 25 62 39l44 31l53 -10c50 -9 101 -14 153 -14c312 0 576 176 576 384s-264 384 -576 384zM704 1280c389 0 704 -229 704 -512s-315 -512 -704 -512c-61 0 -120 6 -176 16
+c-83 -59 -177 -102 -278 -128c-27 -7 -56 -12 -86 -16h-3c-15 0 -29 12 -32 29c-4 19 9 31 20 44c39 44 83 83 117 166c-162 94 -266 239 -266 401c0 283 315 512 704 512zM1526 111c34 -83 78 -122 117 -166c11 -13 24 -25 20 -44c-4 -18 -19 -31 -35 -29
+c-30 4 -59 9 -86 16c-101 26 -195 69 -278 128c-56 -10 -115 -16 -176 -16c-181 0 -347 50 -472 132c29 -2 59 -4 88 -4c215 0 418 62 573 174c167 122 259 287 259 466c0 52 -8 103 -23 152c169 -93 279 -241 279 -408c0 -163 -104 -307 -266 -401z" />
+    <glyph glyph-name="lastfm" unicode="&#xf202;" horiz-adv-x="1792" 
+d="M1292 832c0 -6 8 -34 10 -41c27 -82 90 -99 165 -120c167 -47 325 -136 325 -332c0 -199 -166 -339 -360 -339c-322 0 -422 394 -515 634c-77 198 -158 314 -381 314c-198 0 -372 -190 -372 -385c0 -207 155 -399 370 -399c95 0 194 20 258 95c31 35 61 73 83 116
+l84 -152c-11 -25 -27 -49 -44 -70l1 -1c-101 -117 -239 -152 -388 -152c-302 0 -528 267 -528 561c0 285 248 550 536 550c478 0 502 -414 664 -747c44 -92 119 -200 233 -200c104 0 196 67 196 177c0 238 -437 76 -499 467c-2 11 -3 22 -3 33c0 148 139 275 286 270
+c88 -3 141 -6 211 -68h-1c27 -25 47 -59 68 -88l-129 -99c-15 28 -29 51 -54 70v1c-24 22 -67 21 -97 21c-65 0 -119 -49 -119 -116z" />
+    <glyph glyph-name="peertube" unicode="&#xf2e4;" horiz-adv-x="1350" 
+d="M0 1536l675 -450l-675 -450v900zM675 1086l675 -450l-675 -450v900zM0 636l675 -450l-675 -450v900z" />
+    <glyph glyph-name="pagelines" unicode="&#xf18c;" horiz-adv-x="1402" 
+d="M1402 433c-201 -499 -683 -197 -683 -197c-148 -299 -392 -491 -674 -492c-25 0 -45 20 -45 45s20 44 45 44c235 1 440 156 574 402c-150 -58 -433 -102 -590 300c398 164 581 -41 651 -166c36 89 62 186 79 291c0 0 -510 -80 -546 358c435 175 557 -280 557 -280
+c6 61 12 192 12 195c0 0 -388 269 -139 603c455 -157 224 -593 224 -593c2 -6 2 -87 0 -122c0 0 165 325 498 210c-15 -489 -518 -388 -518 -388c-16 -100 -41 -195 -73 -283c0 0 303 335 628 73z" />
+    <glyph glyph-name="credit-card-alt" unicode="&#xf283;" horiz-adv-x="2304" 
+d="M0 32v608h2304v-608c0 -88 -72 -160 -160 -160h-1984c-88 0 -160 72 -160 160zM640 256v-128h384v128h-384zM256 256v-128h256v128h-256zM2144 1408c88 0 160 -72 160 -160v-224h-2304v224c0 88 72 160 160 160h1984z" />
+    <glyph glyph-name="file-word-o" unicode="&#xf1c2;" 
+d="M1468 1156c37 -37 68 -111 68 -164v-1152c0 -53 -43 -96 -96 -96h-1344c-53 0 -96 43 -96 96v1600c0 53 43 96 96 96h896c53 0 127 -31 164 -68zM1024 1400v-376h376c-6 17 -15 34 -22 41l-313 313c-7 7 -24 16 -41 22zM1408 -128v1024h-416c-53 0 -96 43 -96 96v416
+h-768v-1536h1280zM233 768h300v-107h-90l99 -438c4 -16 6 -33 7 -46l2 -21h4l4 21c3 13 4 30 8 46l144 545h114l144 -545c4 -16 6 -33 9 -46c1 -7 3 -15 3 -21h4l2 21c1 13 3 30 7 46l99 438h-90v107h300v-107h-70l-164 -661h-159l-128 485c-5 16 -6 32 -9 46l-3 24h-4
+c0 -8 -1 -16 -2 -24c-2 -16 -5 -31 -10 -46l-128 -485h-159l-164 661h-70v107z" />
+    <glyph glyph-name="map" unicode="&#xf279;" horiz-adv-x="1792" 
+d="M512 1536c17 0 32 -15 32 -32v-1472c0 -12 -7 -23 -17 -28l-480 -256c-5 -3 -10 -4 -15 -4c-17 0 -32 15 -32 32v1472c0 12 7 23 17 28l480 256c5 3 10 4 15 4zM1760 1536c17 0 32 -15 32 -32v-1472c0 -12 -7 -23 -17 -28l-480 -256c-5 -3 -10 -4 -15 -4
+c-17 0 -32 15 -32 32v1472c0 12 7 23 17 28l480 256c5 3 10 4 15 4zM640 1536c5 0 10 -1 14 -3l512 -256c11 -6 18 -17 18 -29v-1472c0 -17 -15 -32 -32 -32c-5 0 -10 1 -14 3l-512 256c-11 6 -18 17 -18 29v1472c0 17 15 32 32 32z" />
+    <glyph glyph-name="object-ungroup" 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="briefcase" unicode="&#xf0b1;" horiz-adv-x="1792" 
+d="M640 1280h512v128h-512v-128zM1792 640v-480c0 -88 -72 -160 -160 -160h-1472c-88 0 -160 72 -160 160v480h672v-160c0 -35 29 -64 64 -64h320c35 0 64 29 64 64v160h672zM1024 640v-128h-256v128h256zM1792 1120v-384h-1792v384c0 88 72 160 160 160h352v160
+c0 53 43 96 96 96h576c53 0 96 -43 96 -96v-160h352c88 0 160 -72 160 -160z" />
+    <glyph glyph-name="weixin" unicode="&#xf1d7;" horiz-adv-x="2048" 
+d="M580 1075c0 55 -36 91 -91 91c-54 0 -109 -36 -109 -91c0 -54 55 -90 109 -90c55 0 91 36 91 90zM1323 568c0 36 -36 72 -91 72c-36 0 -72 -36 -72 -72c0 -37 36 -73 72 -73c55 0 91 36 91 73zM1087 1075c0 55 -36 91 -90 91c-55 0 -109 -36 -109 -91
+c0 -54 54 -90 109 -90c54 0 90 36 90 90zM1722 568c0 36 -37 72 -91 72c-36 0 -72 -36 -72 -72c0 -37 36 -73 72 -73c54 0 91 36 91 73zM1456 965c-23 3 -46 4 -70 4c-344 0 -616 -257 -616 -573c0 -53 8 -104 23 -152c-23 -2 -45 -3 -68 -3c-91 0 -163 18 -254 36
+l-253 -127l72 218c-181 127 -290 291 -290 490c0 345 326 616 725 616c356 0 669 -217 731 -509zM2048 404c0 -163 -108 -308 -254 -417l55 -181l-199 109c-73 -18 -146 -37 -218 -37c-345 0 -616 236 -616 526s271 526 616 526c326 0 616 -236 616 -526z" />
+    <glyph glyph-name="stop" unicode="&#xf04d;" 
+d="M1536 1344v-1408c0 -35 -29 -64 -64 -64h-1408c-35 0 -64 29 -64 64v1408c0 35 29 64 64 64h1408c35 0 64 -29 64 -64z" />
+    <glyph glyph-name="clone" unicode="&#xf24d;" horiz-adv-x="1792" 
+d="M1664 -96v1088c0 17 -15 32 -32 32h-1088c-17 0 -32 -15 -32 -32v-1088c0 -17 15 -32 32 -32h1088c17 0 32 15 32 32zM1792 992v-1088c0 -88 -72 -160 -160 -160h-1088c-88 0 -160 72 -160 160v1088c0 88 72 160 160 160h1088c88 0 160 -72 160 -160zM1408 1376v-160
+h-128v160c0 17 -15 32 -32 32h-1088c-17 0 -32 -15 -32 -32v-1088c0 -17 15 -32 32 -32h160v-128h-160c-88 0 -160 72 -160 160v1088c0 88 72 160 160 160h1088c88 0 160 -72 160 -160z" />
+    <glyph glyph-name="thermometer-full" unicode="&#xf2c7;" horiz-adv-x="1024" 
+d="M640 192c0 -106 -86 -192 -192 -192s-192 86 -192 192c0 80 50 153 128 181v907h128v-907c78 -28 128 -101 128 -181zM768 192c0 105 -50 197 -128 256v768c0 106 -86 192 -192 192s-192 -86 -192 -192v-768c-78 -59 -128 -151 -128 -256c0 -177 143 -320 320 -320
+s320 143 320 320zM896 192c0 -247 -201 -448 -448 -448s-448 201 -448 448c0 122 49 232 128 313v711c0 177 143 320 320 320s320 -143 320 -320v-711c79 -81 128 -191 128 -313zM1024 768v-128h-192v128h192zM1024 1024v-128h-192v128h192zM1024 1280v-128h-192v128h192z
+" />
+    <glyph glyph-name="plane" unicode="&#xf072;" horiz-adv-x="1402" 
+d="M1376 1376c64 -64 0 -224 -96 -320l-161 -161l160 -696c3 -12 -2 -25 -12 -33l-128 -96c-5 -4 -12 -6 -19 -6c-2 0 -4 0 -7 1c-9 2 -17 7 -21 16l-279 508l-259 -259l53 -194c3 -11 0 -22 -8 -31l-96 -96c-6 -6 -15 -9 -23 -9h-2c-10 1 -18 5 -24 13l-189 252l-252 189
+c-8 5 -12 14 -13 23s3 18 9 25l96 97c6 6 15 9 23 9c3 0 6 0 8 -1l194 -53l259 259l-508 279c-9 5 -15 14 -17 24c-1 9 2 20 9 27l128 128c8 7 20 11 30 8l665 -159l160 160c96 96 256 160 320 96z" />
+    <glyph glyph-name="check-square" unicode="&#xf14a;" 
+d="M685 237l614 614c25 25 25 65 0 90l-102 102c-25 25 -65 25 -90 0l-467 -467l-211 211c-25 25 -65 25 -90 0l-102 -102c-25 -25 -25 -65 0 -90l358 -358c25 -25 65 -25 90 0zM1536 1120v-960c0 -159 -129 -288 -288 -288h-960c-159 0 -288 129 -288 288v960
+c0 159 129 288 288 288h960c159 0 288 -129 288 -288z" />
+    <glyph glyph-name="window-maximize" unicode="&#xf2d0;" horiz-adv-x="1792" 
+d="M256 128h1280v768h-1280v-768zM1792 1248v-1216c0 -88 -72 -160 -160 -160h-1472c-88 0 -160 72 -160 160v1216c0 88 72 160 160 160h1472c88 0 160 -72 160 -160z" />
+    <glyph glyph-name="github" unicode="&#xf09b;" 
+d="M768 1408c424 0 768 -344 768 -768c0 -339 -220 -627 -525 -729c-39 -7 -53 17 -53 37c0 25 1 108 1 211c0 72 -24 118 -52 142c171 19 351 84 351 379c0 84 -30 152 -79 206c8 20 34 98 -8 204c-64 20 -211 -79 -211 -79c-61 17 -127 26 -192 26s-131 -9 -192 -26
+c0 0 -147 99 -211 79c-42 -106 -16 -184 -8 -204c-49 -54 -79 -122 -79 -206c0 -294 179 -360 350 -379c-22 -20 -42 -54 -49 -103c-44 -20 -156 -54 -223 64c-42 73 -118 79 -118 79c-75 1 -5 -47 -5 -47c50 -23 85 -112 85 -112c45 -137 259 -91 259 -91
+c0 -64 1 -124 1 -143c0 -20 -14 -44 -53 -37c-305 102 -525 390 -525 729c0 424 344 768 768 768zM291 305c-2 -4 -8 -5 -13 -2c-6 3 -9 8 -7 12c2 3 7 4 13 2c6 -3 9 -8 7 -12zM322 271c-4 -4 -11 -2 -16 3c-5 6 -6 13 -2 16c4 4 11 2 16 -3c5 -6 6 -13 2 -16zM352 226
+c-4 -3 -12 0 -17 7s-5 15 0 18c5 4 13 1 17 -6c5 -7 5 -15 0 -19zM394 184c-4 -5 -13 -4 -20 3c-7 6 -9 15 -4 19c4 5 13 4 20 -3c6 -6 8 -15 4 -19zM451 159c-2 -6 -11 -9 -19 -6c-9 2 -15 9 -13 15s11 9 19 7c9 -3 15 -10 13 -16zM514 154c0 -6 -7 -11 -16 -11
+c-10 -1 -17 4 -17 11c0 6 7 11 16 11c9 1 17 -4 17 -11zM572 164c1 -6 -5 -12 -14 -14s-17 2 -18 8c-1 7 5 13 14 15c9 1 17 -3 18 -9z" />
+    <glyph glyph-name="mastodon" unicode="&#xf2e1;" 
+d="M1503 425c-23 -116 -202 -243 -408 -268c-108 -13 -214 -25 -327 -20c-185 8 -330 44 -330 44c0 -18 1 -35 3 -51c24 -182 181 -193 329 -198c150 -5 284 37 284 37l6 -136s-105 -56 -292 -66c-103 -6 -230 3 -379 42c-323 85 -379 430 -388 779c-3 104 -1 201 -1 283
+c0 357 235 462 235 462c118 54 320 77 531 79h5c211 -2 413 -25 531 -79c0 0 234 -105 234 -462c0 0 3 -263 -33 -446zM1260 843c0 88 -22 160 -68 211c-47 52 -107 79 -183 79c-88 0 -154 -34 -198 -101l-43 -72l-43 72c-44 67 -110 101 -198 101c-76 0 -136 -27 -183 -79
+c-45 -52 -68 -123 -68 -211v-432h171v420c0 88 38 133 112 133c82 0 124 -54 124 -159v-229h170v229c0 105 42 159 124 159c74 0 112 -45 112 -133v-420h171v432v0z" />
+    <glyph glyph-name="envelope-open" unicode="&#xf2b6;" horiz-adv-x="1792" 
+d="M1792 882v-978c0 -88 -72 -160 -160 -160h-1472c-88 0 -160 72 -160 160v978c0 9 4 18 11 24c105 92 106 103 628 484c63 46 174 146 257 146s195 -101 257 -146c522 -381 523 -392 628 -484c7 -6 11 -15 11 -24zM1228 297c156 113 265 192 345 252c14 10 17 30 6 44
+l-38 52c-11 14 -31 17 -45 6c-79 -58 -187 -138 -343 -250c-62 -45 -174 -145 -257 -145s-195 100 -257 145c-156 113 -264 192 -343 250c-14 11 -34 8 -45 -6l-38 -52c-11 -14 -8 -34 6 -44c80 -60 189 -139 345 -252c78 -56 201 -169 332 -169c132 0 258 115 332 169z" />
+    <glyph glyph-name="step-backward" unicode="&#xf048;" horiz-adv-x="1024" 
+d="M979 1395c25 25 45 16 45 -19v-1472c0 -35 -20 -44 -45 -19l-710 710c-6 6 -10 12 -13 19v-678c0 -35 -29 -64 -64 -64h-128c-35 0 -64 29 -64 64v1408c0 35 29 64 64 64h128c35 0 64 -29 64 -64v-678c3 7 7 13 13 19z" />
+    <glyph glyph-name="wheelchair" unicode="&#xf193;" horiz-adv-x="1629" 
+d="M1023 349l102 -204c-77 -238 -299 -401 -549 -401c-317 0 -576 259 -576 576c0 242 152 458 379 541l17 -131c-163 -72 -268 -232 -268 -410c0 -247 201 -448 448 -448c257 0 465 220 447 477zM1571 249l58 -114l-256 -128c-9 -5 -19 -7 -29 -7c-24 0 -47 14 -57 35
+l-239 477h-472c-32 0 -60 25 -64 57l-96 779c-1 10 3 32 6 42c19 69 83 114 154 114c88 0 160 -72 160 -160c0 -91 -80 -169 -172 -159l37 -289h423v-128h-407l16 -128h455c24 0 47 -14 57 -35l228 -455z" />
+    <glyph glyph-name="bootstrap" unicode="&#xf315;" 
+d="M256 1408h1024c141 0 256 -115 256 -256v-1024c0 -141 -115 -256 -256 -256h-1024c-141 0 -256 115 -256 256v1024c0 141 115 256 256 256zM494 1020v-795h310c169 0 270 83 270 223c0 106 -69 182 -177 196v4c77 14 137 91 137 174c0 119 -93 198 -229 198h-311z
+M593 933h190c97 0 150 -44 150 -123c0 -86 -64 -133 -181 -133h-159v256zM593 592v0h187c127 0 192 -47 192 -139s-63 -141 -183 -141h-196v280z" />
+    <glyph glyph-name="cutlery" unicode="&#xf0f5;" horiz-adv-x="1408" 
+d="M640 1472v-640c0 -81 -52 -154 -128 -181v-779c0 -70 -58 -128 -128 -128h-128c-70 0 -128 58 -128 128v779c-76 27 -128 100 -128 181v640c0 35 29 64 64 64s64 -29 64 -64v-416c0 -35 29 -64 64 -64s64 29 64 64v416c0 35 29 64 64 64s64 -29 64 -64v-416
+c0 -35 29 -64 64 -64s64 29 64 64v416c0 35 29 64 64 64s64 -29 64 -64zM1408 1472v-1600c0 -70 -58 -128 -128 -128h-128c-70 0 -128 58 -128 128v512h-224c-17 0 -32 15 -32 32v800c0 176 144 320 320 320h256c35 0 64 -29 64 -64z" />
+    <glyph glyph-name="microphone-slash" unicode="&#xf131;" horiz-adv-x="1382" 
+d="M258 591l-101 -101c-27 66 -42 138 -42 214v128c0 35 29 64 64 64s64 -29 64 -64v-128c0 -39 6 -77 15 -113zM1372 1193l-361 -361v-128c0 -176 -144 -320 -320 -320c-38 0 -75 7 -109 19l-96 -96c61 -32 131 -51 205 -51c247 0 448 201 448 448v128c0 35 29 64 64 64
+s64 -29 64 -64v-128c0 -296 -224 -540 -512 -572v-132h256c35 0 64 -29 64 -64s-29 -64 -64 -64h-640c-35 0 -64 29 -64 64s29 64 64 64h256v132c-85 9 -165 38 -235 81l-254 -254c-13 -13 -33 -13 -46 0l-82 82c-13 13 -13 33 0 46l1234 1234c13 13 33 13 46 0l82 -82
+c13 -13 13 -33 0 -46zM992 1325l-621 -621v512c0 176 144 320 320 320c138 0 256 -89 301 -211z" />
+    <glyph glyph-name="user-plus" unicode="&#xf234;" horiz-adv-x="2048" 
+d="M704 640c-212 0 -384 172 -384 384s172 384 384 384s384 -172 384 -384s-172 -384 -384 -384zM1664 512h352c17 0 32 -15 32 -32v-192c0 -17 -15 -32 -32 -32h-352v-352c0 -17 -15 -32 -32 -32h-192c-17 0 -32 15 -32 32v352h-352c-17 0 -32 15 -32 32v192
+c0 17 15 32 32 32h352v352c0 17 15 32 32 32h192c17 0 32 -15 32 -32v-352zM928 288c0 -70 58 -128 128 -128h256v-238c-49 -36 -111 -50 -171 -50h-874c-160 0 -267 96 -267 259c0 226 53 573 346 573c16 0 27 -7 39 -17c98 -75 193 -122 319 -122s221 47 319 122
+c12 10 23 17 39 17c85 0 160 -32 217 -96h-223c-70 0 -128 -58 -128 -128v-192z" />
+    <glyph glyph-name="truck" unicode="&#xf0d1;" horiz-adv-x="1728" 
+d="M576 128c0 70 -58 128 -128 128s-128 -58 -128 -128s58 -128 128 -128s128 58 128 128zM192 640h384v256h-158c-4 0 -19 -6 -22 -9l-195 -195c-3 -3 -9 -18 -9 -22v-30zM1472 128c0 70 -58 128 -128 128s-128 -58 -128 -128s58 -128 128 -128s128 58 128 128zM1728 1216
+v-1024c0 -74 -78 -64 -128 -64c0 -141 -115 -256 -256 -256s-256 115 -256 256h-384c0 -141 -115 -256 -256 -256s-256 115 -256 256h-64c-50 0 -128 -10 -128 64c0 35 29 64 64 64v320c0 71 -10 150 45 205l198 198c25 25 73 45 109 45h160v192c0 35 29 64 64 64h1024
+c35 0 64 -29 64 -64z" />
+    <glyph glyph-name="wrench" unicode="&#xf0ad;" horiz-adv-x="1641" 
+d="M363 64c0 35 -29 64 -64 64s-64 -29 -64 -64s29 -64 64 -64s64 29 64 64zM1007 484l-682 -682c-23 -23 -56 -37 -90 -37s-67 14 -91 37l-106 108c-24 23 -38 56 -38 90s14 67 38 91l681 681c52 -131 157 -236 288 -288zM1641 919c0 -33 -12 -74 -23 -106
+c-63 -178 -234 -301 -423 -301c-247 0 -448 201 -448 448s201 448 448 448c73 0 168 -22 229 -63c10 -7 16 -16 16 -28c0 -11 -7 -22 -16 -28l-293 -169v-224l193 -107c33 19 265 165 285 165s32 -15 32 -35z" />
+    <glyph glyph-name="ambulance" unicode="&#xf0f9;" horiz-adv-x="1856" 
+d="M576 128c0 71 -57 128 -128 128s-128 -57 -128 -128s57 -128 128 -128s128 57 128 128zM192 640h384v256h-158c-6 -1 -17 -5 -22 -9l-195 -195c-3 -5 -8 -16 -9 -22v-30zM1472 128c0 71 -57 128 -128 128s-128 -57 -128 -128s57 -128 128 -128s128 57 128 128zM1600 800
+v192c0 18 -14 32 -32 32h-224v224c0 18 -14 32 -32 32h-192c-18 0 -32 -14 -32 -32v-224h-224c-18 0 -32 -14 -32 -32v-192c0 -18 14 -32 32 -32h224v-224c0 -18 14 -32 32 -32h192c18 0 32 14 32 32v224h224c18 0 32 14 32 32zM1856 1344v-1152c0 -35 -29 -64 -64 -64h-192
+c0 -141 -114 -256 -256 -256c-141 0 -256 115 -256 256h-384c0 -141 -114 -256 -256 -256s-256 115 -256 256h-128c-35 0 -64 29 -64 64s29 64 64 64v416c0 35 20 84 45 109l198 198c25 25 74 45 109 45h160v320c0 35 29 64 64 64h1152c35 0 64 -29 64 -64z" />
+    <glyph glyph-name="cc-visa" unicode="&#xf1f0;" horiz-adv-x="2304" 
+d="M1975 546h-138s14 37 66 179c-1 -1 14 37 22 61l12 -55c31 -153 38 -185 38 -185zM531 611l-58 295c-8 41 -39 54 -75 54h-268l-2 -13c184 -47 335 -147 403 -336zM710 960l-162 -438l-17 89c-35 93 -120 179 -216 218l135 -510h175l261 641h-176zM849 318h166l104 642
+h-166zM1617 944c-33 13 -85 27 -149 27c-164 0 -279 -87 -280 -212c-1 -92 82 -143 145 -174c65 -31 86 -52 86 -80c0 -43 -52 -62 -99 -62c-67 0 -103 8 -156 33l-22 11l-23 -144c39 -18 110 -34 185 -34c174 -1 287 86 289 219c0 73 -45 128 -140 174
+c-58 29 -93 50 -93 80c0 27 30 55 95 55c54 1 94 -10 124 -24l15 -8zM2042 960h-128c-40 0 -70 -12 -87 -54l-246 -588h174c28 79 35 96 35 96h212s5 -22 20 -96h154zM2304 1280v-1280c0 -70 -58 -128 -128 -128h-2048c-70 0 -128 58 -128 128v1280c0 70 58 128 128 128
+h2048c70 0 128 -58 128 -128z" />
+    <glyph glyph-name="superscript" unicode="&#xf12b;" horiz-adv-x="1529" 
+d="M892 167v-167h-248l-159 252l-24 42c-6 7 -9 14 -11 21h-3c-2 -7 -6 -14 -9 -21c-6 -12 -15 -28 -25 -44l-155 -250h-258v167h128l197 291l-185 272h-137v168h276l139 -228c9 -14 16 -29 23 -42c6 -7 9 -14 11 -21h3c2 7 6 14 11 21l25 42l140 228h257v-168h-125
+l-184 -267l204 -296h109zM1529 846v-206h-514l-3 27c-2 14 -4 33 -4 46c0 273 350 296 350 441c0 52 -47 87 -100 87c-38 0 -72 -18 -97 -39c-13 -11 -25 -25 -36 -38l-105 92c18 25 38 46 63 66c42 33 103 65 188 65c145 0 246 -85 246 -218c0 -240 -332 -260 -346 -403
+h232v80h126z" />
+    <glyph glyph-name="pixelfed" unicode="&#xf314;" 
+d="M768 -128c-424 0 -768 344 -768 768s344 768 768 768s768 -344 768 -768s-344 -768 -768 -768zM707 472h141c133 0 240 105 240 234s-107 234 -240 234h-203c-77 0 -139 -60 -139 -135v-525z" />
+    <glyph glyph-name="tty" unicode="&#xf1e4;" horiz-adv-x="1792" 
+d="M448 224v-192c0 -18 -14 -32 -32 -32h-192c-18 0 -32 14 -32 32v192c0 18 14 32 32 32h192c18 0 32 -14 32 -32zM256 608v-192c0 -18 -14 -32 -32 -32h-192c-18 0 -32 14 -32 32v192c0 18 14 32 32 32h192c18 0 32 -14 32 -32zM832 224v-192c0 -18 -14 -32 -32 -32h-192
+c-18 0 -32 14 -32 32v192c0 18 14 32 32 32h192c18 0 32 -14 32 -32zM640 608v-192c0 -18 -14 -32 -32 -32h-192c-18 0 -32 14 -32 32v192c0 18 14 32 32 32h192c18 0 32 -14 32 -32zM66 768c-37 0 -66 29 -66 65v129h514v-129c0 -36 -29 -65 -65 -65h-383zM1216 224v-192
+c0 -18 -14 -32 -32 -32h-192c-18 0 -32 14 -32 32v192c0 18 14 32 32 32h192c18 0 32 -14 32 -32zM1024 608v-192c0 -18 -14 -32 -32 -32h-192c-18 0 -32 14 -32 32v192c0 18 14 32 32 32h192c18 0 32 -14 32 -32zM1600 224v-192c0 -18 -14 -32 -32 -32h-192
+c-18 0 -32 14 -32 32v192c0 18 14 32 32 32h192c18 0 32 -14 32 -32zM1408 608v-192c0 -18 -14 -32 -32 -32h-192c-18 0 -32 14 -32 32v192c0 18 14 32 32 32h192c18 0 32 -14 32 -32zM1792 1016v-13h-514v10c0 37 -32 104 -382 102c-350 -1 -382 -65 -382 -102v-10h-514v13
+c0 67 120 392 896 392c775 0 896 -325 896 -392zM1792 608v-192c0 -18 -14 -32 -32 -32h-192c-18 0 -32 14 -32 32v192c0 18 14 32 32 32h192c18 0 32 -14 32 -32zM1792 962v-129c0 -36 -29 -65 -65 -65h-384c-36 0 -65 29 -65 65v129h514z" />
+    <glyph glyph-name="linode" unicode="&#xf2b8;" horiz-adv-x="1494" 
+d="M309 1l202 -214l-34 236l-216 213zM535 -225l274 218l-11 245l-300 -215zM224 413l227 -213l-48 327l-245 204zM474 189l317 214l-14 324l-352 -200zM822 178l95 -80l-2 239l-103 79c0 -8 4 -22 -4 -28l-78 -52l85 -70c10 -8 7 -76 7 -88zM117 930l256 -200l-68 465
+l-279 173zM1152 267l15 234l-230 -164l2 -240zM396 722l373 194l-19 441l-423 -163zM1249 357l20 233l-226 142l-2 -105l144 -95c3 -2 5 -6 4 -9l-7 -119zM1440 496l30 222l-179 -128l-20 -228zM1252 329l-71 49l-8 -117c0 -3 -1 -6 -4 -8l-234 -187c-4 -3 -10 -3 -14 0
+l-98 83l7 -161c0 -3 -1 -6 -4 -8l-293 -234c-2 -1 -4 -2 -6 -2c-3 1 -6 1 -8 3l-228 242c-5 5 -54 252 -59 277c-1 4 2 9 5 11l61 37c-12 11 -93 82 -95 92l-72 351c-1 4 1 9 6 12l94 45c-16 12 -132 96 -135 108l-96 466c-1 6 2 11 7 13l433 135c2 0 5 0 8 -1l317 -153
+c3 -2 6 -6 6 -9l20 -463c0 -4 -2 -8 -6 -10l-118 -61l126 -85c3 -1 5 -5 5 -8l5 -123l121 74c3 2 8 2 11 0l84 -56l3 110c0 3 2 7 5 9l206 126c4 2 8 2 11 0l245 -135c2 -2 4 -4 5 -7c2 -7 -31 -232 -34 -255c0 -3 -2 -6 -4 -7l-191 -153c-4 -3 -9 -3 -13 0z" />
+    <glyph glyph-name="shield" unicode="&#xf132;" horiz-adv-x="1280" 
+d="M1088 576v640h-448v-1137c51 27 133 74 213 137c107 84 235 215 235 360zM1280 1344v-768c0 -421 -589 -687 -614 -698c-8 -4 -17 -6 -26 -6s-18 2 -26 6c-25 11 -614 277 -614 698v768c0 35 29 64 64 64h1152c35 0 64 -29 64 -64z" />
+    <glyph glyph-name="user-md" unicode="&#xf0f0;" horiz-adv-x="1408" 
+d="M384 192c0 -35 -29 -64 -64 -64s-64 29 -64 64s29 64 64 64s64 -29 64 -64zM1408 131c0 -163 -107 -259 -267 -259h-874c-160 0 -267 96 -267 259c0 199 40 513 278 565c-16 -38 -22 -79 -22 -120v-203c-77 -27 -128 -100 -128 -181c0 -106 86 -192 192 -192
+s192 86 192 192c0 81 -52 154 -128 181v203c0 33 3 66 25 93c84 -66 188 -104 295 -104s211 38 295 104c22 -27 25 -60 25 -93v-64c-141 0 -256 -115 -256 -256v-89c-20 -18 -32 -44 -32 -71c0 -53 43 -96 96 -96s96 43 96 96c0 27 -12 53 -32 71v89c0 70 58 128 128 128
+s128 -58 128 -128v-89c-20 -18 -32 -44 -32 -71c0 -53 43 -96 96 -96s96 43 96 96c0 27 -12 53 -32 71v89c0 91 -49 176 -128 221c0 73 7 151 -22 219c238 -52 278 -366 278 -565zM1088 1024c0 -212 -172 -384 -384 -384s-384 172 -384 384s172 384 384 384
+s384 -172 384 -384z" />
+    <glyph glyph-name="xmpp" unicode="&#xf2f9;" horiz-adv-x="1542" 
+d="M1536 1314c47 -398 -206 -904 -657 -1199c122 -101 261 -177 414 -216v-27c-165 14 -320 59 -461 128l-30 15l-1 1l-6 3c-11 6 -30 16 -41 22c-94 -51 -193 -90 -297 -116c-68 -19 -139 -33 -211 -42v28c145 37 279 107 396 201c-426 296 -682 805 -637 1192l93 -33v0
+l273 -81c-1 -16 -1 -32 -1 -49c0 -296 147 -656 394 -917c254 262 406 628 406 929c0 17 0 33 -1 49l274 81z" />
+    <glyph glyph-name="moon-o" unicode="&#xf186;" horiz-adv-x="1471" 
+d="M1262 233c-36 -6 -73 -9 -110 -9c-371 0 -672 301 -672 672c0 127 37 251 104 357c-266 -79 -456 -323 -456 -613c0 -353 287 -640 640 -640c193 0 374 88 494 233zM1465 318c-125 -271 -399 -446 -697 -446c-423 0 -768 345 -768 768c0 415 325 752 739 767
+c28 1 51 -15 61 -39c11 -25 4 -54 -15 -72c-114 -104 -177 -246 -177 -400c0 -300 244 -544 544 -544c79 0 155 17 228 51c25 11 53 6 72 -13s24 -48 13 -72z" />
+    <glyph glyph-name="pie-chart" unicode="&#xf200;" horiz-adv-x="1728" 
+d="M768 646l546 -546c-139 -141 -333 -228 -546 -228c-424 0 -768 344 -768 768s344 768 768 768v-762zM955 640h773c0 -213 -87 -407 -228 -546zM1664 768h-768v768c424 0 768 -344 768 -768z" />
+    <glyph glyph-name="align-left" unicode="&#xf036;" horiz-adv-x="1792" 
+d="M1792 192v-128c0 -35 -29 -64 -64 -64h-1664c-35 0 -64 29 -64 64v128c0 35 29 64 64 64h1664c35 0 64 -29 64 -64zM1408 576v-128c0 -35 -29 -64 -64 -64h-1280c-35 0 -64 29 -64 64v128c0 35 29 64 64 64h1280c35 0 64 -29 64 -64zM1664 960v-128
+c0 -35 -29 -64 -64 -64h-1536c-35 0 -64 29 -64 64v128c0 35 29 64 64 64h1536c35 0 64 -29 64 -64zM1280 1344v-128c0 -35 -29 -64 -64 -64h-1152c-35 0 -64 29 -64 64v128c0 35 29 64 64 64h1152c35 0 64 -29 64 -64z" />
+    <glyph glyph-name="motorcycle" unicode="&#xf21c;" horiz-adv-x="2304" 
+d="M2301 500c32 -281 -197 -517 -476 -499c-214 14 -392 185 -414 399c-16 152 44 289 146 381l-71 107c-126 -105 -206 -262 -206 -438c0 -36 -28 -66 -64 -66h-325c-31 -217 -217 -384 -443 -384c-247 0 -448 201 -448 448s201 448 448 448c53 0 104 -10 152 -27l24 45
+c-77 69 -178 110 -304 110h-64c-35 0 -64 29 -64 64s29 64 64 64h128c224 0 338 -92 384 -128h627l-85 128h-222c-39 0 -70 35 -63 75c5 31 35 53 66 53h253c21 0 41 -11 53 -28l70 -105l114 114c12 12 29 19 46 19h101c35 0 64 -29 64 -64v-128c0 -35 -29 -64 -64 -64h-179
+l115 -172c81 39 175 55 275 36c191 -35 340 -195 362 -388zM448 128c155 0 284 110 314 256h-314c-22 0 -43 12 -55 31c-11 19 -12 43 -1 63l147 277c-29 8 -59 13 -91 13c-176 0 -320 -144 -320 -320s144 -320 320 -320zM1856 128c176 0 320 144 320 320s-144 320 -320 320
+c-43 0 -83 -9 -121 -24l174 -260c20 -30 12 -70 -17 -89c-11 -8 -24 -11 -36 -11c-21 0 -41 10 -53 29l-174 260c-57 -58 -93 -137 -93 -225c0 -176 144 -320 320 -320z" />
+    <glyph glyph-name="nextcloud-square" unicode="&#xf307;" 
+d="M257 1408h1022c142 0 257 -115 257 -257v-1022c0 -142 -115 -257 -257 -257h-1022c-142 0 -257 115 -257 257v1022c0 142 115 257 257 257zM772 969v0c-145 0 -268 -98 -307 -230c-34 69 -105 118 -187 118c-114 0 -208 -94 -208 -208s94 -207 208 -207
+c82 0 153 48 187 117c39 -132 162 -230 307 -230s267 98 306 230c34 -69 105 -117 187 -117c114 0 208 93 208 207s-94 208 -208 208c-82 0 -153 -49 -187 -118c-39 132 -161 230 -306 230zM772 846v0c106 0 196 -88 196 -197s-87 -196 -196 -196s-197 87 -197 196
+s88 197 197 197zM278 733c47 0 84 -37 84 -84s-37 -84 -84 -84s-84 37 -84 84s37 84 84 84zM1265 733c47 0 84 -37 84 -84s-37 -84 -84 -84s-84 37 -84 84s37 84 84 84z" />
+    <glyph glyph-name="ticket" unicode="&#xf145;" horiz-adv-x="1685" 
+d="M970 1084l316 -316l-572 -572l-316 316zM760 105l618 618c25 25 25 65 0 90l-362 362c-24 24 -66 24 -90 0l-618 -618c-25 -25 -25 -65 0 -90l362 -362c12 -12 27 -18 44 -18s34 6 46 18zM1648 742l-906 -908c-50 -49 -133 -49 -182 0l-126 126c75 75 75 197 0 272
+s-197 75 -272 0l-124 126c-50 49 -50 131 0 181l906 906c49 50 132 50 182 0l124 -125c-75 -75 -75 -197 0 -272s197 -75 272 0l126 -125c49 -50 49 -132 0 -181z" />
+    <glyph glyph-name="battery-half" unicode="&#xf242;" horiz-adv-x="2304" 
+d="M256 256v768h896v-768h-896zM2176 960c71 0 128 -57 128 -128v-384c0 -71 -57 -128 -128 -128v-160c0 -88 -72 -160 -160 -160h-1856c-88 0 -160 72 -160 160v960c0 88 72 160 160 160h1856c88 0 160 -72 160 -160v-160zM2176 448v384h-128v288c0 18 -14 32 -32 32h-1856
+c-18 0 -32 -14 -32 -32v-960c0 -18 14 -32 32 -32h1856c18 0 32 14 32 32v288h128z" />
+    <glyph glyph-name="spotify" unicode="&#xf1bc;" 
+d="M1127 326c0 28 -11 39 -30 51c-129 77 -279 115 -447 115c-98 0 -192 -13 -287 -34c-23 -5 -42 -20 -42 -52c0 -25 19 -49 49 -49c9 0 25 5 37 8c78 16 160 27 243 27c147 0 286 -36 397 -103c12 -7 20 -11 33 -11c25 0 47 20 47 48zM1223 541c0 27 -10 46 -35 61
+c-153 91 -347 141 -548 141c-129 0 -217 -18 -303 -42c-32 -9 -48 -31 -48 -64s27 -60 60 -60c14 0 22 4 37 8c70 19 154 33 251 33c190 0 363 -50 488 -124c11 -6 22 -13 38 -13c34 0 60 27 60 60zM1331 789c0 37 -16 56 -40 70c-173 101 -410 148 -636 148
+c-133 0 -255 -15 -364 -47c-28 -8 -54 -32 -54 -74c0 -41 31 -73 72 -73c15 0 29 5 40 8c97 27 202 37 307 37c208 0 424 -46 563 -129c14 -8 24 -12 40 -12c38 0 72 30 72 72zM1536 640c0 -424 -344 -768 -768 -768s-768 344 -768 768s344 768 768 768s768 -344 768 -768z
+" />
+    <glyph glyph-name="dot-circle-o" unicode="&#xf192;" 
+d="M1024 640c0 -141 -115 -256 -256 -256s-256 115 -256 256s115 256 256 256s256 -115 256 -256zM768 1184c-300 0 -544 -244 -544 -544s244 -544 544 -544s544 244 544 544s-244 544 -544 544zM1536 640c0 -424 -344 -768 -768 -768s-768 344 -768 768s344 768 768 768
+s768 -344 768 -768z" />
+    <glyph glyph-name="facebook-square" unicode="&#xf082;" 
+d="M1248 1408c159 0 288 -129 288 -288v-960c0 -159 -129 -288 -288 -288h-188v595h199l30 232h-229v148c0 67 18 112 115 112l122 1v207c-21 3 -94 9 -178 9c-177 0 -299 -108 -299 -306v-171h-200v-232h200v-595h-532c-159 0 -288 129 -288 288v960c0 159 129 288 288 288
+h960z" />
+    <glyph glyph-name="facebook-messenger" unicode="&#xf2fe;" horiz-adv-x="1520" 
+d="M760 1408c420 0 760 -318 760 -711c0 -476 -490 -817 -978 -681l-260 -144v272c-556 420 -235 1264 478 1264zM841 455l415 440l-379 -209l-197 204l-415 -441l379 210z" />
+    <glyph glyph-name="angle-up" unicode="&#xf106;" horiz-adv-x="998" 
+d="M998 352c0 -8 -4 -17 -10 -23l-50 -50c-6 -6 -14 -10 -23 -10c-8 0 -17 4 -23 10l-393 393l-393 -393c-6 -6 -15 -10 -23 -10s-17 4 -23 10l-50 50c-6 6 -10 15 -10 23s4 17 10 23l466 466c6 6 15 10 23 10s17 -4 23 -10l466 -466c6 -6 10 -15 10 -23z" />
+    <glyph glyph-name="glide" unicode="&#xf2a5;" 
+d="M866 1021c0 -32 -7 -63 -13 -94c-21 -100 -41 -200 -62 -300c-3 -14 -3 -14 -18 -15c-10 -1 -21 -2 -31 -2c-86 0 -110 93 -110 163c0 104 41 243 138 298c16 8 33 14 51 14c41 0 45 -30 45 -64zM1352 597c0 18 -74 135 -91 142c-8 3 -25 8 -34 8
+c-82 0 -156 -37 -226 -77l-2 2c16 107 52 202 52 313c0 159 -85 233 -242 233c-23 0 -46 -3 -68 -6c-197 -35 -317 -260 -317 -445c0 -196 113 -304 308 -304c4 0 25 2 25 -3c0 -2 0 -3 -1 -5c-4 -38 -16 -80 -26 -117c-15 -55 -67 -150 -134 -150c-29 0 -42 20 -42 47
+c0 87 100 139 102 144c0 4 -5 8 -7 10c-31 28 -82 51 -124 51c-76 0 -117 -122 -117 -184c0 -116 73 -196 190 -196c173 0 299 182 338 332c11 44 19 89 30 133c2 9 5 13 14 18c71 36 146 60 227 60c44 0 83 -8 127 -18c1 -1 3 -1 4 -1c6 0 14 7 14 13zM1536 1120v-960
+c0 -159 -129 -288 -288 -288h-960c-159 0 -288 129 -288 288v960c0 159 129 288 288 288h960c159 0 288 -129 288 -288z" />
+    <glyph glyph-name="gitea" unicode="&#xf31f;" horiz-adv-x="2066" 
+d="M366 1280v0c62 0 120 -8 160 -8v0v0c329 -18 502 -29 699 -29l1 -363l53 -27v390c171 2 371 11 709 29v0h1c15 0 28 -7 38 -17s18 -25 24 -43c12 -36 16 -85 15 -143c-3 -117 -30 -272 -75 -427s-107 -311 -182 -431s-163 -204 -259 -211h-615c-75 8 -156 85 -224 169
+c-34 42 -64 87 -87 126c-21 36 -35 66 -41 88c-82 2 -219 15 -341 80c-125 67 -233 191 -242 414c-6 143 45 245 118 310s167 93 248 93zM388 1107v0c-90 -1 -147 -29 -180 -71c-36 -44 -46 -104 -38 -164c14 -113 61 -183 126 -229c62 -44 143 -65 231 -78
+c-70 193 -106 325 -128 542h-11zM1118 893c-34 0 -66 -19 -82 -51l-172 -353c-22 -45 -3 -99 42 -121l354 -172c45 -22 99 -3 121 42l171 354c22 45 3 99 -42 121l-249 121l-45 -93c5 -5 10 -14 12 -20c2 -5 3 -13 3 -19v-4c30 -14 54 -25 74 -36c30 -17 52 -34 59 -62
+s-1 -57 -17 -95c-12 -29 -29 -65 -51 -111c4 -5 9 -13 11 -19c2 -5 4 -13 4 -19c0 -22 -17 -46 -38 -54c-5 -2 -14 -4 -20 -4c-22 0 -46 17 -54 38c-2 5 -3 14 -3 20c0 22 17 46 38 54c5 2 14 3 19 3h2c22 46 41 82 52 109c15 36 18 55 15 66s-13 20 -39 35
+c-18 10 -41 22 -71 36c-4 -4 -13 -9 -19 -11c-5 -2 -14 -3 -19 -3h-6l-77 -158c5 -5 12 -14 14 -21c2 -5 3 -13 3 -19c0 -22 -17 -46 -38 -54c-5 -2 -13 -4 -19 -4c-22 0 -46 17 -54 38c-2 5 -3 14 -3 20c0 22 16 46 37 54c5 2 15 3 20 3l79 162c-3 4 -8 11 -10 16
+s-3 14 -3 20c0 22 17 46 38 54c5 2 14 3 19 3h1l46 94l-64 31c-13 6 -26 9 -39 9z" />
+    <glyph glyph-name="f-droid" unicode="&#xf32a;" horiz-adv-x="1676" 
+d="M47 1526v0c12 0 29 -8 36 -18l127 -164c10 3 27 6 37 6v0h1182v0c10 0 27 -3 37 -6l127 164c7 9 22 17 34 18h2h3c24 -1 44 -22 44 -46c0 -9 -4 -22 -10 -29l-133 -172c4 -11 7 -29 7 -40v0v-258c0 -61 -50 -111 -111 -111h-1182c-61 0 -111 50 -111 111v258v0
+c0 11 3 29 7 40l-133 172c-6 7 -10 20 -10 29c0 26 20 46 46 46h1zM482 1212v0c-69 0 -125 -56 -125 -125v0c0 -69 56 -125 125 -125v0c69 0 125 56 125 125v0c0 69 -56 125 -125 125v0zM1203 1212c-69 0 -125 -56 -125 -125v0c0 -69 56 -125 125 -125s125 56 125 125v0
+c0 69 -56 125 -125 125zM247 833h1182c61 0 111 -50 111 -111v-739c0 -61 -50 -111 -111 -111h-1182c-61 0 -111 50 -111 111v739c0 61 50 111 111 111zM838 740v0c-214 0 -388 -174 -388 -388s174 -388 388 -388s388 174 388 388s-174 388 -388 388zM838 670v0
+c176 0 318 -142 318 -318s-142 -317 -318 -317s-318 141 -318 317s142 318 318 318zM838 583v0c-106 0 -197 -72 -223 -171h119c20 36 59 61 104 61c67 0 120 -54 120 -121s-53 -120 -120 -120c-48 0 -89 28 -108 69h-117c24 -102 116 -180 225 -180c127 0 231 104 231 231
+s-104 231 -231 231z" />
+    <glyph glyph-name="shopping-basket" unicode="&#xf291;" horiz-adv-x="2048" 
+d="M1920 768c71 0 128 -57 128 -128s-57 -128 -128 -128h-15l-115 -662c-11 -61 -64 -106 -126 -106h-1280c-62 0 -115 45 -126 106l-115 662h-15c-71 0 -128 57 -128 128s57 128 128 128h1792zM485 -32c35 3 62 34 59 69l-32 416c-3 35 -34 62 -69 59s-62 -34 -59 -69
+l32 -416c3 -33 31 -59 64 -59h5zM896 32v416c0 35 -29 64 -64 64s-64 -29 -64 -64v-416c0 -35 29 -64 64 -64s64 29 64 64zM1280 32v416c0 35 -29 64 -64 64s-64 -29 -64 -64v-416c0 -35 29 -64 64 -64s64 29 64 64zM1632 27l32 416c3 35 -24 66 -59 69s-66 -24 -69 -59
+l-32 -416c-3 -35 24 -66 59 -69h5c33 0 61 26 64 59zM476 1244l-93 -412h-132l101 441c26 117 129 199 249 199h167c0 35 29 64 64 64h384c35 0 64 -29 64 -64h167c120 0 223 -82 249 -199l101 -441h-132l-93 412c-14 59 -65 100 -125 100h-167c0 -35 -29 -64 -64 -64h-384
+c-35 0 -64 29 -64 64h-167c-60 0 -111 -41 -125 -100z" />
+    <glyph glyph-name="user-o" unicode="&#xf2c0;" 
+d="M1201 752c141 -41 335 -180 335 -635c0 -206 -153 -373 -341 -373h-854c-188 0 -341 167 -341 373c0 455 194 594 335 635c-50 79 -79 172 -79 272c0 282 230 512 512 512s512 -230 512 -512c0 -100 -29 -193 -79 -272zM768 1408c-212 0 -384 -172 -384 -384
+s172 -384 384 -384s384 172 384 384s-172 384 -384 384zM1195 -128c117 0 213 109 213 245c0 315 -106 512 -304 522c-90 -79 -207 -127 -336 -127s-246 48 -336 127c-198 -10 -304 -207 -304 -522c0 -136 96 -245 213 -245h854z" />
+    <glyph glyph-name="paperclip" unicode="&#xf0c6;" horiz-adv-x="1400" 
+d="M1400 151c0 -156 -119 -275 -275 -275c-88 0 -173 38 -235 100l-777 776c-71 72 -113 170 -113 271c0 212 167 381 379 381c102 0 200 -41 273 -113l605 -606c6 -6 10 -14 10 -22c0 -21 -56 -77 -77 -77c-9 0 -17 4 -23 10l-606 607c-48 47 -113 77 -181 77
+c-142 0 -252 -115 -252 -256c0 -68 28 -133 76 -181l776 -777c38 -38 91 -63 145 -63c85 0 148 63 148 148c0 55 -25 107 -63 145l-581 581c-16 15 -38 24 -60 24c-38 0 -67 -28 -67 -67c0 -22 10 -43 25 -59l410 -410c6 -6 10 -14 10 -22c0 -21 -57 -78 -78 -78
+c-8 0 -16 4 -22 10l-410 410c-40 39 -63 94 -63 149c0 110 86 196 196 196c56 0 110 -23 149 -63l581 -581c63 -62 100 -147 100 -235z" />
+    <glyph glyph-name="deviantart" unicode="&#xf1bd;" horiz-adv-x="1024" 
+d="M1024 1233l-303 -582l24 -31h279v-415h-507l-44 -30l-142 -273c-1 0 -28 -28 -30 -30h-301v303l303 583l-24 30h-279v415h507l44 30l142 273c1 0 28 28 30 30h301v-303z" />
+    <glyph glyph-name="file-audio-o" unicode="&#xf1c7;" 
+d="M1468 1156c37 -37 68 -111 68 -164v-1152c0 -53 -43 -96 -96 -96h-1344c-53 0 -96 43 -96 96v1600c0 53 43 96 96 96h896c53 0 127 -31 164 -68zM1024 1400v-376h376c-6 17 -15 34 -22 41l-313 313c-7 7 -24 16 -41 22zM1408 -128v1024h-416c-53 0 -96 43 -96 96v416
+h-768v-1536h1280zM620 686c12 -5 20 -17 20 -30v-544c0 -13 -8 -25 -20 -30c-4 -1 -8 -2 -12 -2c-8 0 -16 3 -23 9l-166 167h-131c-18 0 -32 14 -32 32v192c0 18 14 32 32 32h131l166 167c10 9 23 12 35 7zM1037 -3c-14 0 -28 5 -40 15c-28 22 -32 62 -9 90
+c65 80 100 178 100 282s-35 202 -100 282c-23 28 -19 68 9 91c27 22 68 18 90 -10c83 -102 129 -231 129 -363s-46 -261 -129 -363c-13 -16 -31 -24 -50 -24zM826 145c-15 0 -31 6 -44 17c-25 24 -27 65 -2 91c33 36 52 82 52 131s-19 95 -52 131c-25 26 -23 67 2 91
+c26 24 67 23 91 -3c56 -60 87 -137 87 -219s-31 -159 -87 -219c-13 -13 -30 -20 -47 -20z" />
+    <glyph glyph-name="eur" unicode="&#xf153;" horiz-adv-x="1012" 
+d="M976 229l35 -159c4 -16 -5 -32 -20 -37c-4 -1 -97 -33 -217 -33c-312 0 -563 188 -647 482h-95c-18 0 -32 15 -32 32v113c0 17 14 32 32 32h66c-1 32 -1 70 1 105h-67c-18 0 -32 14 -32 32v114c0 18 14 32 32 32h98c89 280 345 466 644 466c104 0 190 -22 194 -23
+c8 -2 15 -8 20 -15c4 -7 5 -16 3 -24l-43 -159c-4 -17 -21 -27 -38 -22c-1 0 -69 17 -140 17c-168 0 -309 -91 -376 -240h468c10 0 19 -4 25 -12c6 -7 9 -17 7 -26l-24 -114c-3 -15 -16 -26 -32 -26h-488c-3 -32 -2 -66 0 -105h459c10 0 19 -5 25 -12c6 -8 8 -18 6 -27
+l-24 -112c-3 -15 -16 -26 -31 -26h-387c64 -156 208 -254 378 -254c87 0 158 24 159 24c8 3 18 2 26 -2c8 -5 13 -13 15 -21z" />
+    <glyph glyph-name="coffee" unicode="&#xf0f4;" horiz-adv-x="1856" 
+d="M1664 896c0 106 -86 192 -192 192h-64v-384h64c106 0 192 86 192 192zM0 128h1792c0 -141 -115 -256 -256 -256h-1280c-141 0 -256 115 -256 256zM1856 896c0 -212 -172 -384 -384 -384h-64v-32c0 -123 -101 -224 -224 -224h-704c-123 0 -224 101 -224 224v736
+c0 35 29 64 64 64h1152c212 0 384 -172 384 -384z" />
+    <glyph glyph-name="university" unicode="&#xf19c;" horiz-adv-x="1920" 
+d="M960 1536l960 -384v-128h-128c0 -35 -31 -64 -69 -64h-1526c-38 0 -69 29 -69 64h-128v128zM256 896h256v-768h128v768h256v-768h128v768h256v-768h128v768h256v-768h59c38 0 69 -29 69 -64v-64h-1664v64c0 35 31 64 69 64h59v768zM1851 -64c38 0 69 -29 69 -64v-128
+h-1920v128c0 35 31 64 69 64h1782z" />
+    <glyph glyph-name="times-circle-o" unicode="&#xf05c;" 
+d="M1097 457l-146 -146c-13 -13 -33 -13 -46 0l-137 137l-137 -137c-13 -13 -33 -13 -46 0l-146 146c-13 13 -13 33 0 46l137 137l-137 137c-13 13 -13 33 0 46l146 146c13 13 33 13 46 0l137 -137l137 137c13 13 33 13 46 0l146 -146c13 -13 13 -33 0 -46l-137 -137
+l137 -137c13 -13 13 -33 0 -46zM1312 640c0 300 -244 544 -544 544s-544 -244 -544 -544s244 -544 544 -544s544 244 544 544zM1536 640c0 -424 -344 -768 -768 -768s-768 344 -768 768s344 768 768 768s768 -344 768 -768z" />
+    <glyph glyph-name="python" unicode="&#xf322;" 
+d="M759 1416v0c63 0 129 -4 193 -15c101 -17 185 -92 185 -192v-353c0 -103 -82 -188 -185 -188h-370c-126 0 -232 -108 -232 -230v-170h-127c-108 0 -171 78 -197 188c-36 147 -34 236 0 377c29 123 124 188 232 188h509v47h-370v141c0 107 28 164 185 192
+c53 9 114 15 177 15zM558 1303c-38 0 -69 -32 -69 -71s31 -70 69 -70s70 31 70 70s-32 71 -70 71zM1183 1021h139c108 0 159 -81 186 -188c37 -149 39 -261 0 -377c-37 -113 -78 -188 -186 -188h-555v-47h370v-141c0 -107 -92 -161 -185 -188c-140 -41 -253 -34 -370 0
+c-98 29 -185 88 -185 188v353c0 102 84 188 185 188h370c123 0 231 107 231 235v165zM975 127v0c-38 0 -69 -31 -69 -70s31 -71 69 -71s70 32 70 71s-32 70 -70 70zM1389 366c0 -17 -70 -30 -156 -30s-156 13 -156 30s70 30 156 30s156 -13 156 -30z" />
+    <glyph glyph-name="internet-explorer" unicode="&#xf26b;" horiz-adv-x="1792" 
+d="M1792 599c0 -35 -2 -70 -7 -104h-1151c0 -199 175 -343 367 -343c130 0 255 64 322 177h423c-114 -321 -419 -536 -759 -536c-123 0 -246 29 -356 83c-112 -57 -269 -116 -394 -116c-168 0 -237 103 -237 263c0 93 20 186 45 275c16 58 80 176 109 229
+c123 223 285 437 475 606c-153 -66 -319 -232 -427 -354c84 366 410 625 785 625c15 0 30 0 45 -1c124 57 297 117 433 117c162 0 301 -62 301 -245c0 -96 -37 -200 -75 -286c66 -119 101 -254 101 -390zM1722 1239c0 112 -80 181 -190 181c-84 0 -179 -34 -254 -70
+c162 -63 301 -179 393 -327c25 66 51 146 51 216zM128 2c0 -116 69 -179 183 -179c89 0 188 40 266 83c-163 96 -289 249 -351 428c-46 -96 -98 -224 -98 -332zM632 715h728c-7 193 -177 332 -364 332c-188 0 -357 -139 -364 -332z" />
+    <glyph glyph-name="file-video-o" unicode="&#xf1c8;" 
+d="M1468 1156c37 -37 68 -111 68 -164v-1152c0 -53 -43 -96 -96 -96h-1344c-53 0 -96 43 -96 96v1600c0 53 43 96 96 96h896c53 0 127 -31 164 -68zM1024 1400v-376h376c-6 17 -15 34 -22 41l-313 313c-7 7 -24 16 -41 22zM1408 -128v1024h-416c-53 0 -96 43 -96 96v416
+h-768v-1536h1280zM768 768c70 0 128 -58 128 -128v-384c0 -70 -58 -128 -128 -128h-384c-70 0 -128 58 -128 128v384c0 70 58 128 128 128h384zM1260 766c12 -5 20 -17 20 -30v-576c0 -13 -8 -25 -20 -30c-4 -1 -8 -2 -12 -2c-8 0 -17 3 -23 9l-265 266v90l265 266
+c6 6 15 9 23 9c4 0 8 -1 12 -2z" />
+    <glyph glyph-name="angle-double-right" unicode="&#xf101;" horiz-adv-x="966" 
+d="M582 576c0 -8 -4 -17 -10 -23l-466 -466c-6 -6 -15 -10 -23 -10s-17 4 -23 10l-50 50c-6 6 -10 15 -10 23s4 17 10 23l393 393l-393 393c-6 6 -10 15 -10 23s4 17 10 23l50 50c6 6 15 10 23 10s17 -4 23 -10l466 -466c6 -6 10 -15 10 -23zM966 576c0 -8 -4 -17 -10 -23
+l-466 -466c-6 -6 -15 -10 -23 -10s-17 4 -23 10l-50 50c-6 6 -10 15 -10 23s4 17 10 23l393 393l-393 393c-6 6 -10 15 -10 23s4 17 10 23l50 50c6 6 15 10 23 10s17 -4 23 -10l466 -466c6 -6 10 -15 10 -23z" />
+    <glyph glyph-name="safari" unicode="&#xf267;" horiz-adv-x="1792" 
+d="M949 643c0 -33 -23 -64 -58 -64c-33 0 -64 24 -64 58c0 33 24 64 59 64c32 0 63 -23 63 -58zM964 585l350 581c-47 -44 -485 -447 -497 -468l-349 -580c46 43 485 448 496 467zM1611 640c0 -131 -36 -260 -104 -371c-10 5 -52 35 -60 35c-7 0 -13 -6 -13 -13
+c0 -13 47 -37 59 -44c-99 -150 -252 -258 -426 -301l-16 67c-1 9 -7 10 -15 10c-7 0 -11 -10 -10 -15l16 -68c-48 -10 -97 -15 -146 -15c-131 0 -260 37 -372 105c6 10 44 65 44 73c0 7 -6 13 -13 13c-14 0 -44 -60 -53 -72c-151 100 -260 255 -302 432l69 15
+c8 2 10 8 10 15s-10 11 -16 10l-68 -15c-9 46 -14 92 -14 139c0 134 38 266 109 379c10 -6 58 -39 66 -39c7 0 13 5 13 12c0 14 -53 41 -65 49c102 149 257 256 433 296l15 -67c2 -8 8 -10 15 -10s11 10 10 16l-15 66c44 8 89 13 134 13c134 0 265 -38 379 -109
+c-7 -10 -39 -57 -39 -65c0 -7 5 -13 12 -13c14 0 41 52 48 64c148 -100 254 -253 295 -427l-56 -12c-9 -2 -10 -8 -10 -16c0 -7 10 -11 15 -10l57 13c9 -46 14 -93 14 -140zM1696 640c0 442 -358 800 -800 800s-800 -358 -800 -800s358 -800 800 -800s800 358 800 800z
+M1792 640c0 -495 -401 -896 -896 -896s-896 401 -896 896s401 896 896 896s896 -401 896 -896z" />
+    <glyph glyph-name="commenting-o" unicode="&#xf27b;" horiz-adv-x="1792" 
+d="M640 640c0 -71 -57 -128 -128 -128s-128 57 -128 128s57 128 128 128s128 -57 128 -128zM1024 640c0 -71 -57 -128 -128 -128s-128 57 -128 128s57 128 128 128s128 -57 128 -128zM1408 640c0 -71 -57 -128 -128 -128s-128 57 -128 128s57 128 128 128s128 -57 128 -128z
+M896 1152c-416 0 -768 -234 -768 -512c0 -149 100 -291 273 -389l87 -50l-27 -96c-19 -71 -44 -126 -70 -172c101 42 193 99 275 171l43 38l57 -6c43 -5 87 -8 130 -8c416 0 768 234 768 512s-352 512 -768 512zM1792 640c0 -354 -401 -640 -896 -640c-49 0 -98 3 -145 8
+c-131 -116 -287 -198 -460 -242c-36 -10 -75 -17 -114 -22h-5c-20 0 -38 16 -43 38v1c-5 25 12 40 27 58c63 71 135 131 182 298c-206 117 -338 298 -338 501c0 353 401 640 896 640s896 -287 896 -640z" />
+    <glyph glyph-name="snowdrift" unicode="&#xf2f1;" horiz-adv-x="1448" 
+d="M1007 384c104 116 30 287 -165 383c7 -6 44 24 83 67s65 84 58 90c-195 96 -438 80 -542 -36s-30 -287 165 -383c-7 6 -44 -24 -83 -67s-65 -84 -58 -90c195 -96 438 -80 542 36zM103 1188v0c228 253 760 288 1188 78c15 -14 -42 -101 -127 -196s-167 -161 -182 -147
+c428 -210 591 -585 363 -839c-228 -253 -760 -288 -1188 -78c-15 14 42 101 127 196s167 161 182 147c-428 210 -591 585 -363 839z" />
+    <glyph glyph-name="black-tie" unicode="&#xf27e;" 
+d="M0 1408h1536v-1536h-1536v1536zM1085 293l-221 631l221 297h-634l221 -297l-221 -631l317 -304z" />
+    <glyph glyph-name="youtube-play" unicode="&#xf16a;" horiz-adv-x="1792" 
+d="M711 408l484 250l-484 253v-503zM896 1270c377 0 627 -18 627 -18c35 -4 112 -4 180 -76c0 0 55 -54 71 -178c19 -145 18 -290 18 -290v-136s1 -145 -18 -290c-16 -123 -71 -178 -71 -178c-68 -71 -145 -71 -180 -75c0 0 -250 -19 -627 -19c-466 4 -609 18 -609 18
+c-40 7 -130 5 -198 76c0 0 -55 55 -71 178c-19 145 -18 290 -18 290v136s-1 145 18 290c16 124 71 178 71 178c68 72 145 72 180 76c0 0 250 18 627 18z" />
+    <glyph glyph-name="modx" unicode="&#xf285;" horiz-adv-x="1728" 
+d="M1395 827l-614 386l92 151h855zM373 562l-184 116v858l1183 -743zM1392 697l147 -95v-858l-532 335zM1355 718l-500 -802h-855l356 571z" />
+    <glyph glyph-name="caret-square-o-right" unicode="&#xf152;" 
+d="M1088 640c0 -21 -10 -40 -27 -52l-448 -320c-19 -14 -45 -16 -66 -5c-22 11 -35 33 -35 57v640c0 24 13 46 35 57c21 11 47 9 66 -5l448 -320c17 -12 27 -31 27 -52zM1280 160v960c0 18 -14 32 -32 32h-960c-18 0 -32 -14 -32 -32v-960c0 -18 14 -32 32 -32h960
+c18 0 32 14 32 32zM1536 1120v-960c0 -159 -129 -288 -288 -288h-960c-159 0 -288 129 -288 288v960c0 159 129 288 288 288h960c159 0 288 -129 288 -288z" />
+    <glyph glyph-name="gitlab" unicode="&#xf296;" horiz-adv-x="1793" 
+d="M104 830l792 -1015l-868 630c-24 18 -34 49 -25 77zM566 830h660l-330 -1015zM368 1442l198 -612h-462l198 612c11 31 55 31 66 0zM1688 830l101 -308c9 -28 -1 -59 -25 -77l-868 -630zM1688 830h-462l198 612c11 31 55 31 66 0z" />
+    <glyph glyph-name="arrows" unicode="&#xf047;" horiz-adv-x="1792" 
+d="M1792 640c0 -17 -7 -33 -19 -45l-256 -256c-12 -12 -28 -19 -45 -19c-35 0 -64 29 -64 64v128h-384v-384h128c35 0 64 -29 64 -64c0 -17 -7 -33 -19 -45l-256 -256c-12 -12 -28 -19 -45 -19s-33 7 -45 19l-256 256c-12 12 -19 28 -19 45c0 35 29 64 64 64h128v384h-384
+v-128c0 -35 -29 -64 -64 -64c-17 0 -33 7 -45 19l-256 256c-12 12 -19 28 -19 45s7 33 19 45l256 256c12 12 28 19 45 19c35 0 64 -29 64 -64v-128h384v384h-128c-35 0 -64 29 -64 64c0 17 7 33 19 45l256 256c12 12 28 19 45 19s33 -7 45 -19l256 -256
+c12 -12 19 -28 19 -45c0 -35 -29 -64 -64 -64h-128v-384h384v128c0 35 29 64 64 64c17 0 33 -7 45 -19l256 -256c12 -12 19 -28 19 -45z" />
+    <glyph glyph-name="refresh" unicode="&#xf021;" 
+d="M1511 480c0 -2 0 -5 -1 -7c-85 -354 -377 -601 -746 -601c-195 0 -384 77 -526 212l-129 -129c-12 -12 -28 -19 -45 -19c-35 0 -64 29 -64 64v448c0 35 29 64 64 64h448c35 0 64 -29 64 -64c0 -17 -7 -33 -19 -45l-137 -137c94 -88 219 -138 348 -138
+c178 0 343 92 436 244c24 39 36 77 53 117c5 14 15 23 30 23h192c18 0 32 -15 32 -32zM1536 1280v-448c0 -35 -29 -64 -64 -64h-448c-35 0 -64 29 -64 64c0 17 7 33 19 45l138 138c-95 88 -220 137 -349 137c-178 0 -343 -92 -436 -244c-24 -39 -36 -77 -53 -117
+c-5 -14 -15 -23 -30 -23h-199c-18 0 -32 15 -32 32v7c86 355 381 601 750 601c196 0 387 -78 529 -212l130 129c12 12 28 19 45 19c35 0 64 -29 64 -64z" />
+    <glyph glyph-name="file-o" unicode="&#xf016;" 
+d="M1468 1156c37 -37 68 -111 68 -164v-1152c0 -53 -43 -96 -96 -96h-1344c-53 0 -96 43 -96 96v1600c0 53 43 96 96 96h896c53 0 127 -31 164 -68zM1024 1400v-376h376c-6 17 -15 34 -22 41l-313 313c-7 7 -24 16 -41 22zM1408 -128v1024h-416c-53 0 -96 43 -96 96v416
+h-768v-1536h1280z" />
+    <glyph glyph-name="battery-three-quarters" unicode="&#xf241;" horiz-adv-x="2304" 
+d="M256 256v768h1280v-768h-1280zM2176 960c71 0 128 -57 128 -128v-384c0 -71 -57 -128 -128 -128v-160c0 -88 -72 -160 -160 -160h-1856c-88 0 -160 72 -160 160v960c0 88 72 160 160 160h1856c88 0 160 -72 160 -160v-160zM2176 448v384h-128v288c0 18 -14 32 -32 32
+h-1856c-18 0 -32 -14 -32 -32v-960c0 -18 14 -32 32 -32h1856c18 0 32 14 32 32v288h128z" />
+    <glyph glyph-name="reddit-alien" unicode="&#xf281;" horiz-adv-x="1792" 
+d="M1792 690c0 -78 -44 -145 -109 -178c8 -31 12 -63 12 -96c0 -316 -357 -572 -797 -572c-439 0 -796 256 -796 572c0 32 4 64 11 94c-67 33 -113 101 -113 180c0 110 89 199 199 199c57 0 108 -24 145 -63c135 94 315 155 515 162l116 521c4 18 23 30 41 26l369 -81
+c24 48 75 82 133 82c83 0 150 -67 150 -149c0 -83 -67 -150 -150 -150c-82 0 -149 67 -149 149l-334 74l-104 -472c201 -6 383 -66 519 -160c36 38 87 61 143 61c110 0 199 -89 199 -199zM418 491c0 -83 67 -150 149 -150c83 0 150 67 150 150c0 82 -67 149 -150 149
+c-82 0 -149 -67 -149 -149zM1228 136c15 15 15 37 0 52c-14 14 -37 14 -51 0c-60 -61 -189 -82 -281 -82s-221 21 -281 82c-14 14 -37 14 -51 0c-15 -14 -15 -37 0 -52c95 -95 278 -102 332 -102s237 7 332 102zM1225 341c82 0 149 67 149 150c0 82 -67 149 -149 149
+c-83 0 -150 -67 -150 -149c0 -83 67 -150 150 -150z" />
+    <glyph glyph-name="square" unicode="&#xf0c8;" 
+d="M1536 1120v-960c0 -159 -129 -288 -288 -288h-960c-159 0 -288 129 -288 288v960c0 159 129 288 288 288h960c159 0 288 -129 288 -288z" />
+    <glyph glyph-name="ellipsis-v" unicode="&#xf142;" horiz-adv-x="384" 
+d="M384 288v-192c0 -53 -43 -96 -96 -96h-192c-53 0 -96 43 -96 96v192c0 53 43 96 96 96h192c53 0 96 -43 96 -96zM384 800v-192c0 -53 -43 -96 -96 -96h-192c-53 0 -96 43 -96 96v192c0 53 43 96 96 96h192c53 0 96 -43 96 -96zM384 1312v-192c0 -53 -43 -96 -96 -96h-192
+c-53 0 -96 43 -96 96v192c0 53 43 96 96 96h192c53 0 96 -43 96 -96z" />
+    <glyph glyph-name="glide-g" unicode="&#xf2a6;" horiz-adv-x="1461" 
+d="M707 1231c0 53 -5 99 -69 99c-27 0 -54 -9 -78 -23c-151 -83 -213 -298 -213 -460c0 -108 37 -252 169 -252c30 0 68 -8 76 27c32 154 64 309 96 463c10 48 19 97 19 146zM1461 575c0 -10 -13 -20 -23 -20l-6 1c-68 10 -128 28 -197 28c-125 0 -240 -37 -351 -93
+c-14 -7 -17 -13 -21 -27c-18 -68 -30 -138 -47 -206c-60 -233 -255 -514 -522 -514c-182 0 -294 124 -294 303c0 97 63 286 180 286c41 0 202 -53 203 -95c-2 -8 -157 -88 -157 -223c0 -41 20 -73 65 -73c159 0 232 290 248 412v9c0 8 -32 4 -38 4c-301 0 -477 168 -477 471
+c0 286 186 635 491 688c35 6 70 9 106 9c242 0 374 -113 374 -360c0 -167 -57 -321 -81 -484l3 -3c108 61 222 119 350 119c13 0 41 -8 53 -13c26 -10 141 -191 141 -219z" />
+    <glyph glyph-name="globe" unicode="&#xf0ac;" 
+d="M768 1404c424 0 768 -344 768 -768s-344 -768 -768 -768s-768 344 -768 768s344 768 768 768zM737 1186v0c-18 0 -40 -7 -58 -7c-27 0 -61 12 -81 0s-18 -37 -27 -55s-28 -34 -28 -54s19 -36 28 -54s2 -47 27 -54s54 36 81 54s69 32 81 54s0 36 0 54s16 39 0 55
+c-5 5 -14 7 -23 7zM491 1178h-6s-44 -8 -76 -13c-136 -92 -261 -300 -278 -464c23 -12 46 -22 60 -36c27 -27 83 -27 88 -56s-24 -62 -33 -80s-31 -31 -27 -54s36 -36 54 -54s37 -22 54 -54s20 -98 27 -135c9 -47 23 -85 44 -118c27 -19 72 -44 102 -58c10 28 10 93 16 122
+c7 37 13 109 27 135s19 19 28 28s18 15 28 28s17 34 26 52s30 31 26 53s-36 37 -54 55s-29 39 -55 54s-73 18 -101 25s-127 12 -129 13c-2 0 -1 -6 -7 2s-2 39 -2 57s11 34 24 66c13 18 5 10 25 24c10 9 43 -44 57 -44s-3 91 6 100c36 36 128 98 128 136s-37 36 -55 54
+s-46 -30 -111 -30s76 103 85 112s23 17 27 27s0 18 0 27s12 22 8 25c-2 1 -4 1 -6 1zM1212 1096c-62 -8 -139 -10 -182 -26c-45 -17 -54 -36 -81 -54s-67 -28 -81 -54s0 -54 0 -81s-26 -68 0 -82s55 37 82 55s63 64 81 54s6 -7 0 -27s-51 -41 -52 -81s102 -73 68 -126
+s-188 46 -232 17s-19 -54 -28 -81s-37 -52 -27 -81s52 -34 81 -54s81 -56 82 -58s20 -99 27 -135c14 -73 -27 -199 76 -231c31 14 78 41 106 60c13 34 24 72 35 94c22 44 71 123 80 161s0 37 0 55s7 30 0 54s-36 54 -54 81s-34 64 -54 81s-46 18 -54 27s-4 8 -4 13
+s-4 7 5 14s34 8 54 0s36 -36 54 -54s25 -51 54 -54s54 36 81 54c25 17 52 56 76 55c-12 131 -98 312 -193 404z" />
+    <glyph glyph-name="hashnode" unicode="&#xf317;" 
+d="M246 1408h1044c136 0 246 -110 246 -246v-1044c0 -136 -110 -246 -246 -246h-1044c-136 0 -246 110 -246 246v1044c0 136 110 246 246 246zM1153 23v0c87 1 158 71 162 158s-62 162 -149 171l-315 556c-46 83 -135 78 -167 -39c-28 -111 -20 -216 -28 -342
+c0 -1 -1 -2 -2 -2s-2 1 -2 1l-281 560c20 16 37 50 37 75c0 52 -41 93 -93 93s-94 -41 -94 -93s42 -93 94 -93c4 0 7 1 11 1c118 -304 250 -659 297 -741c32 -78 141 -53 144 31l12 444c0 3 3 3 4 1l226 -537c-11 -20 -21 -55 -21 -78v-1c0 -91 74 -165 165 -165z" />
+    <glyph glyph-name="comment-o" unicode="&#xf0e5;" horiz-adv-x="1792" 
+d="M896 1152c-416 0 -768 -234 -768 -512c0 -149 100 -291 273 -389l87 -50l-27 -96c-19 -71 -44 -126 -70 -172c101 42 193 99 275 171l43 38l57 -6c43 -5 87 -8 130 -8c416 0 768 234 768 512s-352 512 -768 512zM1792 640c0 -354 -401 -640 -896 -640c-49 0 -98 3 -145 8
+c-131 -116 -287 -198 -460 -242c-36 -10 -75 -17 -114 -22h-5c-20 0 -38 16 -43 38v1c-5 25 12 40 27 58c63 71 135 131 182 298c-206 117 -338 298 -338 501c0 354 401 640 896 640s896 -286 896 -640z" />
+    <glyph glyph-name="bluetooth" unicode="&#xf293;" horiz-adv-x="1322" 
+d="M734 483l148 -148l-149 -149zM733 1094l149 -149l-148 -148zM603 -130l464 464l-306 306l306 306l-464 464v-611l-255 255l-93 -93l320 -321l-320 -321l93 -93l255 255v-611zM1322 640c0 -710 -270 -896 -661 -896s-661 186 -661 896s270 896 661 896s661 -186 661 -896z
+" />
+    <glyph glyph-name="hand-pointer-o" unicode="&#xf25a;" horiz-adv-x="1664" 
+d="M640 1408c-71 0 -128 -57 -128 -128v-896l-151 202c-25 33 -65 54 -107 54c-70 0 -126 -59 -126 -128c0 -28 9 -55 26 -77l384 -512c24 -32 62 -51 102 -51h718c29 0 55 20 62 48l92 368c16 64 24 129 24 194v217c0 53 -41 101 -96 101c-53 0 -96 -43 -96 -96h-32v61
+c0 63 -48 115 -112 115c-62 0 -112 -50 -112 -112v-64h-32v90c0 72 -55 134 -128 134c-71 0 -128 -57 -128 -128v-96h-32v570c0 72 -55 134 -128 134zM640 1536c143 0 256 -120 256 -262v-220c11 1 21 2 32 2c65 0 126 -25 173 -69c31 14 65 21 99 21c72 0 139 -32 184 -87
+c19 5 37 7 56 7c126 0 224 -105 224 -229v-217c0 -75 -9 -151 -28 -225l-92 -368c-21 -85 -98 -145 -186 -145h-718c-80 0 -157 39 -205 102l-384 512c-33 44 -51 99 -51 154c0 140 114 256 254 256c46 0 91 -12 130 -35v547c0 141 115 256 256 256zM768 128h-32v384h32
+v-384zM1024 128h-32v384h32v-384zM1280 128h-32v384h32v-384z" />
+    <glyph glyph-name="unlock" unicode="&#xf09c;" horiz-adv-x="1664" 
+d="M1664 960v-256c0 -35 -29 -64 -64 -64h-64c-35 0 -64 29 -64 64v256c0 141 -115 256 -256 256s-256 -115 -256 -256v-192h96c53 0 96 -43 96 -96v-576c0 -53 -43 -96 -96 -96h-960c-53 0 -96 43 -96 96v576c0 53 43 96 96 96h672v192c0 247 201 448 448 448
+s448 -201 448 -448z" />
+    <glyph glyph-name="quote-right" unicode="&#xf10e;" horiz-adv-x="1664" 
+d="M768 1216v-704c0 -282 -230 -512 -512 -512h-64c-35 0 -64 29 -64 64v128c0 35 29 64 64 64h64c141 0 256 115 256 256v32c0 53 -43 96 -96 96h-224c-106 0 -192 86 -192 192v384c0 106 86 192 192 192h384c106 0 192 -86 192 -192zM1664 1216v-704
+c0 -282 -230 -512 -512 -512h-64c-35 0 -64 29 -64 64v128c0 35 29 64 64 64h64c141 0 256 115 256 256v32c0 53 -43 96 -96 96h-224c-106 0 -192 86 -192 192v384c0 106 86 192 192 192h384c106 0 192 -86 192 -192z" />
+    <glyph glyph-name="arrow-left" unicode="&#xf060;" horiz-adv-x="1472" 
+d="M1472 640v-128c0 -68 -45 -128 -117 -128h-704l293 -294c24 -23 38 -56 38 -90s-14 -67 -38 -90l-75 -76c-23 -23 -56 -37 -90 -37s-67 14 -91 37l-651 652c-23 23 -37 56 -37 90s14 67 37 91l651 650c24 24 57 38 91 38s66 -14 90 -38l75 -74c24 -24 38 -57 38 -91
+s-14 -67 -38 -91l-293 -293h704c72 0 117 -60 117 -128z" />
+    <glyph glyph-name="scissors" unicode="&#xf0c4;" horiz-adv-x="1792" 
+d="M960 640c35 0 64 -29 64 -64s-29 -64 -64 -64s-64 29 -64 64s29 64 64 64zM1260 576l507 -398c18 -13 27 -35 25 -56c-3 -22 -16 -41 -35 -51l-128 -64c-9 -5 -19 -7 -29 -7c-11 0 -22 3 -31 8l-690 387l-110 -66c-4 -2 -8 -4 -12 -5c9 -31 13 -64 10 -97
+c-9 -103 -78 -201 -188 -271c-85 -54 -183 -84 -277 -84c-90 0 -166 27 -222 78c-57 53 -86 129 -79 207c9 102 78 201 187 271c85 54 184 84 278 84c56 0 107 -11 151 -31c6 9 13 16 22 22l122 73l-122 73c-9 6 -16 13 -22 22c-44 -20 -95 -31 -151 -31
+c-94 0 -193 30 -278 84c-109 70 -178 169 -187 271c-7 78 22 154 79 206c56 52 132 79 222 79c94 0 192 -30 277 -84c110 -69 179 -168 188 -271c3 -33 -1 -66 -10 -97c4 -1 8 -3 12 -5l110 -66l690 387c9 5 20 8 31 8c10 0 20 -2 29 -7l128 -64c19 -10 32 -29 35 -51
+c2 -21 -7 -43 -25 -56zM579 836c61 56 23 157 -85 225c-61 39 -132 59 -192 59c-46 0 -87 -12 -113 -36c-61 -56 -23 -157 85 -225c61 -39 131 -59 192 -59c46 0 87 12 113 36zM494 91c108 68 146 169 85 225c-26 24 -67 36 -113 36c-61 0 -131 -20 -192 -59
+c-108 -68 -146 -169 -85 -225c26 -24 67 -36 113 -36c60 0 131 20 192 59zM672 704l96 -58v11c0 23 13 44 33 56l14 8l-79 47l-26 -26c-8 -8 -14 -16 -22 -23c-3 -3 -5 -4 -7 -6zM896 480l96 -32l736 576l-128 64l-768 -431v-113l-160 -96l9 -8c2 -3 4 -4 7 -6
+c8 -8 14 -16 22 -24l26 -26zM1600 64l128 64l-520 408l-177 -138c-3 -4 -8 -5 -13 -7z" />
+    <glyph glyph-name="ellipsis-h" unicode="&#xf141;" horiz-adv-x="1408" 
+d="M384 800v-192c0 -53 -43 -96 -96 -96h-192c-53 0 -96 43 -96 96v192c0 53 43 96 96 96h192c53 0 96 -43 96 -96zM896 800v-192c0 -53 -43 -96 -96 -96h-192c-53 0 -96 43 -96 96v192c0 53 43 96 96 96h192c53 0 96 -43 96 -96zM1408 800v-192c0 -53 -43 -96 -96 -96h-192
+c-53 0 -96 43 -96 96v192c0 53 43 96 96 96h192c53 0 96 -43 96 -96z" />
+    <glyph glyph-name="scribd" unicode="&#xf28a;" horiz-adv-x="1464" 
+d="M1464 -13c0 -119 -96 -216 -216 -216s-217 97 -217 216c0 120 97 217 217 217s216 -97 216 -217zM1231 268c-152 -20 -270 -150 -270 -308c0 -49 12 -97 33 -138c-90 -48 -212 -78 -379 -78c-532 0 -615 376 -615 426c0 51 30 218 218 218s214 -161 214 -194
+c0 0 0 -34 -23 -81c64 -60 215 -60 215 -60c151 0 265 74 265 184c0 111 -128 165 -420 302c-292 138 -402 239 -402 490c0 252 168 507 587 507s577 -235 577 -396s-137 -201 -188 -201c-50 0 -235 -17 -235 261c-33 37 -177 37 -177 37c-145 0 -209 -110 -209 -177
+c0 -68 27 -152 329 -252c463 -154 480 -355 480 -540z" />
+    <glyph glyph-name="exclamation" unicode="&#xf12a;" horiz-adv-x="444" 
+d="M414 288v-224c0 -35 -29 -64 -64 -64h-256c-35 0 -64 29 -64 64v224c0 35 29 64 64 64h256c35 0 64 -29 64 -64zM444 1344l-28 -768c-1 -35 -31 -64 -66 -64h-256c-35 0 -65 29 -66 64l-28 768c-1 35 27 64 62 64h320c35 0 63 -29 62 -64z" />
+    <glyph glyph-name="try" unicode="&#xf195;" horiz-adv-x="1152" 
+d="M1152 704c0 -388 -316 -704 -704 -704h-160c-18 0 -32 14 -32 32v611l-215 -66c-3 -1 -6 -1 -9 -1c-7 0 -13 2 -19 6c-8 6 -13 16 -13 26v128c0 14 9 26 23 31l233 71v93l-215 -66c-3 -1 -6 -1 -9 -1c-7 0 -13 2 -19 6c-8 6 -13 16 -13 26v128c0 14 9 26 23 31l233 71
+v250c0 18 14 32 32 32h160c18 0 32 -14 32 -32v-181l375 116c9 3 20 1 28 -5s13 -16 13 -26v-128c0 -14 -9 -26 -23 -31l-393 -121v-93l375 116c9 3 20 1 28 -5s13 -16 13 -26v-128c0 -14 -9 -26 -23 -31l-393 -121v-487c250 17 448 225 448 479c0 18 14 32 32 32h160
+c18 0 32 -14 32 -32z" />
+    <glyph glyph-name="assistive-listening-systems" unicode="&#xf2a2;" horiz-adv-x="1792" 
+d="M128 -192c0 -35 -29 -64 -64 -64s-64 29 -64 64s29 64 64 64s64 -29 64 -64zM320 0c0 -35 -29 -64 -64 -64s-64 29 -64 64s29 64 64 64s64 -29 64 -64zM365 365l256 -256l-90 -90l-256 256zM704 384c0 -35 -29 -64 -64 -64s-64 29 -64 64s29 64 64 64s64 -29 64 -64z
+M1411 704c0 -166 -78 -255 -146 -334c-63 -72 -113 -129 -113 -242c0 -212 -172 -384 -384 -384c-35 0 -64 29 -64 64s29 64 64 64c141 0 256 115 256 256c0 161 77 249 144 326c62 71 115 132 115 250c0 247 -201 448 -448 448s-448 -201 -448 -448c0 -35 -29 -64 -64 -64
+s-64 29 -64 64c0 318 258 576 576 576s576 -258 576 -576zM896 576c0 -35 -29 -64 -64 -64s-64 29 -64 64s29 64 64 64s64 -29 64 -64zM1184 704c0 -35 -29 -64 -64 -64s-64 29 -64 64c0 124 -100 224 -224 224c-123 0 -224 -100 -224 -224c0 -35 -29 -64 -64 -64
+s-64 29 -64 64c0 194 158 352 352 352s352 -158 352 -352zM1578 993c13 -33 -4 -70 -37 -83c-7 -3 -15 -4 -23 -4c-25 0 -50 15 -59 41c-45 117 -123 219 -224 295c-28 21 -34 61 -13 89c22 28 62 34 90 13c120 -90 212 -212 266 -351zM1788 1074c12 -33 -4 -70 -37 -83
+c-8 -3 -15 -4 -23 -4c-26 0 -50 15 -60 41c-60 156 -163 292 -297 393c-29 21 -34 61 -13 89c21 29 61 34 89 13c154 -115 272 -271 341 -449z" />
+    <glyph glyph-name="flag-o" unicode="&#xf11d;" horiz-adv-x="1728" 
+d="M1600 491v616c-80 -43 -192 -91 -306 -91c-53 0 -102 10 -145 32c-107 53 -223 104 -362 104c-129 0 -287 -63 -403 -127v-599c132 61 300 113 433 113c154 0 254 -51 361 -104l28 -14c28 -14 62 -22 101 -22c111 0 231 59 293 92zM256 1280c0 -47 -26 -88 -64 -110
+v-1266c0 -18 -14 -32 -32 -32h-64c-18 0 -32 14 -32 32v1266c-38 22 -64 63 -64 110c0 71 57 128 128 128s128 -57 128 -128zM1728 1216v-763c0 -24 -14 -46 -35 -57c-4 -2 -10 -5 -17 -9c-64 -34 -215 -116 -369 -116c-59 0 -112 12 -158 35l-28 14
+c-101 51 -181 91 -304 91c-144 0 -347 -75 -464 -146c-10 -6 -22 -9 -33 -9s-22 3 -32 8c-20 12 -32 33 -32 56v742c0 22 12 43 31 55c64 38 290 163 500 163c167 0 303 -61 418 -117c26 -13 56 -19 89 -19c118 0 248 75 310 112c13 7 24 13 31 17c20 10 43 9 62 -2
+c19 -12 31 -33 31 -55z" />
+    <glyph glyph-name="wikipedia-w" unicode="&#xf266;" horiz-adv-x="2304" 
+d="M1494 -103l-295 695c-117 -229 -246 -468 -357 -695c-1 -1 -54 0 -54 1c-169 395 -346 787 -515 1183c-41 96 -178 252 -272 251c0 11 -1 36 -1 51h583v-50c-69 -4 -190 -48 -156 -123c79 -179 373 -865 452 -1039c54 107 208 393 271 514c-50 102 -211 482 -262 576
+c-35 64 -130 70 -201 71v50l513 -1v-47c-70 -2 -137 -28 -106 -94c68 -144 110 -245 173 -377c20 39 125 250 173 363c32 74 -14 103 -139 106c1 13 0 37 1 49c160 1 400 1 443 2v-49c-81 -3 -165 -46 -209 -114l-213 -442c23 -58 228 -514 249 -564l441 1017
+c-31 83 -131 101 -170 102v50l460 -4l1 -2l-1 -44c-101 -3 -162 -57 -201 -145c-90 -208 -372 -864 -559 -1291h-49z" />
+    <glyph glyph-name="battery-quarter" unicode="&#xf243;" horiz-adv-x="2304" 
+d="M256 256v768h512v-768h-512zM2176 960c71 0 128 -57 128 -128v-384c0 -71 -57 -128 -128 -128v-160c0 -88 -72 -160 -160 -160h-1856c-88 0 -160 72 -160 160v960c0 88 72 160 160 160h1856c88 0 160 -72 160 -160v-160zM2176 448v384h-128v288c0 18 -14 32 -32 32h-1856
+c-18 0 -32 -14 -32 -32v-960c0 -18 14 -32 32 -32h1856c18 0 32 14 32 32v288h128z" />
+    <glyph glyph-name="print" unicode="&#xf02f;" horiz-adv-x="1664" 
+d="M384 0h896v256h-896v-256zM384 640h896v384h-160c-53 0 -96 43 -96 96v160h-640v-640zM1536 576c0 35 -29 64 -64 64s-64 -29 -64 -64s29 -64 64 -64s64 29 64 64zM1664 576v-416c0 -17 -15 -32 -32 -32h-224v-160c0 -53 -43 -96 -96 -96h-960c-53 0 -96 43 -96 96v160
+h-224c-17 0 -32 15 -32 32v416c0 105 87 192 192 192h64v544c0 53 43 96 96 96h672c53 0 126 -30 164 -68l152 -152c38 -38 68 -111 68 -164v-256h64c105 0 192 -87 192 -192z" />
+    <glyph glyph-name="tipeee" unicode="&#xf301;" horiz-adv-x="2304" 
+d="M116 1259h2072c64 0 116 -52 116 -116v-1006c0 -64 -52 -116 -116 -116h-2072c-64 0 -116 52 -116 116v1006c0 64 52 116 116 116zM756 1006v0c-59 0 -90 -47 -90 -85c0 -40 37 -84 90 -84c59 0 92 38 92 84c0 38 -34 85 -92 85zM1672 966v-159l45 -211h110l45 211v159
+h-200zM534 925l-154 -49v-77h-45v-109h45v-148c3 -107 7 -176 132 -176c19 0 77 6 102 16v107c-16 -7 -42 -14 -53 -14c-33 0 -27 39 -27 67v148h80v109h-80v126zM1212 806v0c-50 0 -85 -24 -101 -36l-14 29h-192v-111h35v-368h-35v-109h250v109h-45v85c6 -5 40 -33 109 -33
+c108 0 190 82 190 215c0 119 -67 219 -197 219zM643 799v-109h35v-199h-35v-110h234v110h-40v308h-194zM1169 688v0c37 0 61 -53 61 -103c0 -64 -25 -104 -60 -104c-32 0 -60 43 -60 100c-3 66 26 107 59 107zM1764 555c-60 0 -95 -47 -95 -89c0 -43 41 -86 95 -86
+c61 0 99 39 99 86c0 48 -40 89 -99 89z" />
+    <glyph glyph-name="check-circle-o" unicode="&#xf05d;" 
+d="M1171 723l-422 -422c-25 -25 -65 -25 -90 0l-294 294c-25 25 -25 65 0 90l102 102c25 25 65 25 90 0l147 -147l275 275c25 25 65 25 90 0l102 -102c25 -25 25 -65 0 -90zM1312 640c0 300 -244 544 -544 544s-544 -244 -544 -544s244 -544 544 -544s544 244 544 544z
+M1536 640c0 -424 -344 -768 -768 -768s-768 344 -768 768s344 768 768 768s768 -344 768 -768z" />
+    <glyph glyph-name="level-up" unicode="&#xf148;" horiz-adv-x="1024" 
+d="M1018 933c-11 -23 -33 -37 -58 -37h-192v-864c0 -18 -14 -32 -32 -32h-704c-12 0 -24 7 -29 18c-5 12 -4 25 4 35l160 192c6 7 16 11 25 11h320v640h-192c-25 0 -47 14 -58 37c-10 22 -7 49 9 68l320 384c24 29 74 29 98 0l320 -384c16 -19 20 -46 9 -68z" />
+    <glyph glyph-name="houzz" unicode="&#xf27c;" horiz-adv-x="1024" 
+d="M512 345l512 295v-591l-512 -296v592zM0 640l512 -295l-512 -296v591zM512 1527v-591l-512 -296v591zM512 936l512 295v-591z" />
+    <glyph glyph-name="lemon-o" unicode="&#xf094;" horiz-adv-x="1535" 
+d="M1407 710c0 47 -9 170 -25 210c-19 48 -30 75 -30 129c0 46 10 91 10 136c0 19 -1 39 -10 55c-4 1 -9 1 -13 1c-39 0 -78 -9 -117 -9c-119 0 -232 48 -351 48c-93 0 -183 -35 -269 -69c-68 -27 -143 -59 -202 -103c-202 -153 -272 -433 -272 -674c0 -81 25 -160 25 -241
+c0 -46 -22 -88 -22 -132c0 -28 16 -51 46 -51c49 0 96 22 146 22c114 0 225 -31 339 -31c89 0 201 7 284 36c263 93 461 397 461 673zM1535 712c0 -333 -231 -684 -547 -796c-99 -35 -222 -44 -326 -44c-114 0 -226 29 -339 29c-48 0 -96 -29 -146 -29
+c-99 0 -174 89 -174 184c0 47 22 89 22 135c0 81 -25 160 -25 242c0 284 87 598 323 777c68 52 153 89 232 120c102 41 205 78 316 78c119 0 232 -48 349 -48c38 0 76 10 115 10c114 0 155 -81 155 -185c0 -45 -10 -91 -10 -136c0 -36 9 -50 21 -82c23 -58 34 -191 34 -255z
+" />
+    <glyph glyph-name="umbrella" unicode="&#xf0e9;" horiz-adv-x="1664" 
+d="M896 708v-580c0 -139 -117 -256 -256 -256s-256 117 -256 256c0 35 29 64 64 64s64 -29 64 -64c0 -67 61 -128 128 -128s128 61 128 128v580c21 7 42 11 64 11s43 -4 64 -11zM1664 681c0 -17 -15 -32 -32 -32c-9 0 -16 4 -23 10c-58 54 -112 92 -195 92
+c-95 0 -177 -59 -231 -134c-12 -17 -21 -35 -32 -52c-7 -11 -15 -17 -28 -17c-14 0 -22 6 -29 17c-11 17 -20 35 -32 52c-54 75 -135 134 -230 134s-176 -59 -230 -134c-12 -17 -21 -35 -32 -52c-7 -11 -15 -17 -29 -17c-13 0 -21 6 -28 17c-11 17 -20 35 -32 52
+c-54 75 -136 134 -231 134c-83 0 -137 -38 -195 -92c-7 -6 -14 -10 -23 -10c-17 0 -32 15 -32 32c0 3 0 5 1 7c92 378 457 592 831 592c372 0 741 -214 831 -592c1 -2 1 -4 1 -7zM896 1408v-98c-21 1 -43 2 -64 2s-43 -1 -64 -2v98c0 35 29 64 64 64s64 -29 64 -64z" />
+    <glyph glyph-name="bell-o" unicode="&#xf0a2;" horiz-adv-x="1664" 
+d="M848 -160c0 9 -7 16 -16 16c-79 0 -144 65 -144 144c0 9 -7 16 -16 16s-16 -7 -16 -16c0 -97 79 -176 176 -176c9 0 16 7 16 16zM1664 128c0 -70 -58 -128 -128 -128h-448c0 -141 -115 -256 -256 -256s-256 115 -256 256h-448c-70 0 -128 58 -128 128
+c148 125 320 349 320 832c0 192 159 402 424 441c-5 12 -8 25 -8 39c0 53 43 96 96 96s96 -43 96 -96c0 -14 -3 -27 -8 -39c265 -39 424 -249 424 -441c0 -483 172 -707 320 -832z" />
+    <glyph glyph-name="shaarli" unicode="&#xf2f5;" horiz-adv-x="1651" 
+d="M878 1408c161 0 254 -160 278 -479h66c287 -44 429 -135 426 -273c24 -163 -80 -238 -312 -226c178 -156 241 -302 191 -437c-39 -108 -133 -143 -282 -107c-164 82 -281 176 -349 282h-43c-64 -188 -188 -282 -372 -282h-64c-153 47 -209 140 -166 278l80 221h-23
+c-225 32 -326 131 -305 298c6 153 160 231 462 233c84 9 119 36 105 80c0 275 103 412 308 412zM830 1182c-56 4 -83 -72 -82 -227l-5 -128c-5 -64 -25 -96 -61 -96l-360 -20c-56 -2 -85 -25 -85 -69c0 -43 31 -65 92 -68c211 11 310 -4 296 -43l-64 -137
+c-108 -163 -135 -258 -80 -287c73 -44 176 70 310 342c32 29 59 29 80 0c94 -100 171 -182 232 -246c62 -64 113 -83 151 -57c46 49 33 101 -37 157c-68 58 -146 137 -234 237c-9 33 -8 50 6 50c298 -20 441 -1 429 57c9 64 -121 96 -388 96c-41 -8 -74 2 -100 29v224
+c0 125 -30 186 -89 184c-3 1 -8 2 -11 2v0z" />
+    <glyph glyph-name="cc-diners-club" unicode="&#xf24c;" horiz-adv-x="2304" 
+d="M858 295v693c-139 -54 -238 -189 -238 -347s99 -293 238 -346zM1362 641c0 158 -99 293 -238 347v-694c139 54 238 189 238 347zM1577 641c0 -323 -262 -586 -586 -586c-323 0 -586 263 -586 586c0 324 263 586 586 586c324 0 586 -262 586 -586zM1960 634
+c0 382 -319 646 -669 646h-301c-354 0 -646 -264 -646 -646c0 -349 292 -634 646 -634h301c350 0 669 285 669 634zM2304 1280v-1280c0 -70 -58 -128 -128 -128h-2048c-70 0 -128 58 -128 128v1280c0 70 58 128 128 128h2048c70 0 128 -58 128 -128z" />
+    <glyph glyph-name="undo" unicode="&#xf0e2;" 
+d="M1536 640c0 -423 -345 -768 -768 -768c-229 0 -445 101 -591 277c-10 13 -9 32 2 43l137 138c7 6 16 9 25 9c9 -1 18 -5 23 -12c98 -127 245 -199 404 -199c282 0 512 230 512 512s-230 512 -512 512c-131 0 -255 -50 -348 -137l137 -138c19 -18 24 -46 14 -69
+c-10 -24 -33 -40 -59 -40h-448c-35 0 -64 29 -64 64v448c0 26 16 49 40 59c23 10 51 5 69 -14l130 -129c141 133 332 212 529 212c423 0 768 -345 768 -768z" />
+    <glyph glyph-name="rebel" unicode="&#xf1d0;" horiz-adv-x="1756" 
+d="M0 662c10 286 156 550 421 724c1 0 7 2 4 -3c-21 -20 -402 -469 -51 -818c180 -179 325 -9 325 -9c139 181 -2 455 -2 455c-36 90 -165 145 -165 145l104 115c88 -38 156 -140 156 -140c3 107 -79 222 -79 222l161 183l160 -181c-74 -104 -79 -226 -79 -226
+c50 83 157 142 157 142l103 -115c-99 -32 -164 -144 -164 -144c-57 -103 -98 -323 2 -460c117 -161 317 10 317 10c371 332 -38 813 -38 813c-22 20 3 10 3 10c181 -132 414 -305 420 -740c7 -526 -361 -901 -876 -901c-503 0 -894 420 -879 918z" />
+    <glyph glyph-name="codiepie" unicode="&#xf284;" horiz-adv-x="1723" 
+d="M1584 246l-218 111c-98 -160 -272 -258 -460 -258c-298 0 -539 241 -539 538c0 298 241 539 539 539c175 0 339 -85 440 -229l215 125c-147 226 -396 361 -665 361c-438 0 -793 -355 -793 -793s355 -793 793 -793c284 0 547 152 688 399zM1030 643l693 -352
+c-152 -332 -457 -547 -827 -547c-495 0 -896 401 -896 896s401 896 896 896c352 0 642 -194 806 -500zM1543 640h-39v-160h-96v352h136c111 0 121 -192 -1 -192z" />
+    <glyph glyph-name="soundcloud" unicode="&#xf1be;" horiz-adv-x="2304" 
+d="M784 164c-1 -13 -11 -23 -24 -23c-12 0 -22 10 -23 23l-14 241l14 523c0 13 11 24 23 24c13 0 23 -11 24 -24l16 -523zM1080 193l-1 -24c0 -8 -3 -15 -9 -20c-5 -5 -12 -9 -20 -9c-9 0 -17 4 -23 11c-4 5 -6 11 -6 17v1c-11 235 -11 236 -11 236l10 579l1 6
+c0 10 5 19 13 24c5 3 10 5 16 5s11 -2 16 -5c8 -5 13 -14 13 -24l12 -586zM35 533l20 -128l-20 -126c-1 -5 -4 -9 -9 -9s-8 4 -9 9l-17 126l17 128c1 5 4 9 9 9s8 -4 9 -9zM121 612l26 -207l-26 -203c-1 -5 -5 -9 -10 -9s-9 4 -9 10l-23 202l23 207c0 5 4 9 9 9s9 -4 10 -9z
+M401 159zM213 650l25 -245l-25 -237c0 -6 -5 -11 -11 -11s-11 5 -12 11l-21 237l21 245c1 7 6 12 12 12s11 -5 11 -12zM307 657l23 -252l-23 -244c-1 -8 -7 -13 -14 -13s-13 5 -13 13l-21 244l21 252c0 8 6 13 13 13s13 -5 14 -13zM401 639l21 -234l-21 -246
+c-1 -9 -8 -16 -16 -16s-15 7 -15 16l-20 246l20 234c0 8 7 15 15 15s15 -7 16 -15zM784 164zM495 785l21 -380l-21 -246c0 -10 -8 -18 -17 -18c-10 0 -17 8 -18 18l-18 246l18 380c1 10 8 18 18 18c9 0 17 -8 17 -18zM589 871l19 -468l-19 -244c0 -11 -9 -19 -19 -19
+c-11 0 -19 8 -20 19l-16 244l16 468c1 11 9 19 20 19c10 0 19 -8 19 -19zM687 911l18 -506l-18 -242c-1 -12 -10 -21 -22 -21c-11 0 -20 9 -21 21l-16 242l16 506c0 12 10 22 21 22c12 0 21 -10 22 -22zM1079 169zM881 915l15 -510l-15 -239c0 -14 -11 -25 -25 -25
+s-24 11 -25 25l-14 239l14 510c0 14 11 25 25 25s25 -11 25 -25zM980 896l14 -492l-14 -236c0 -15 -12 -27 -27 -27s-27 12 -28 27l-12 236l12 492c1 16 13 28 28 28s26 -12 27 -28zM1192 404l-14 -231c0 -17 -14 -31 -31 -31s-31 14 -32 31l-6 114l-6 117l12 636v3
+c1 9 5 18 12 24c5 4 12 7 20 7c5 0 11 -2 15 -5c9 -5 15 -15 16 -26zM2304 423c0 -156 -127 -282 -283 -282h-786c-17 2 -31 15 -31 33v899c0 17 6 25 28 33c55 22 117 34 181 34c261 0 475 -200 498 -455c34 14 71 22 110 22c156 0 283 -127 283 -284z" />
+    <glyph glyph-name="microphone" unicode="&#xf130;" horiz-adv-x="1152" 
+d="M1152 832v-128c0 -296 -224 -540 -512 -572v-132h256c35 0 64 -29 64 -64s-29 -64 -64 -64h-640c-35 0 -64 29 -64 64s29 64 64 64h256v132c-288 32 -512 276 -512 572v128c0 35 29 64 64 64s64 -29 64 -64v-128c0 -247 201 -448 448 -448s448 201 448 448v128
+c0 35 29 64 64 64s64 -29 64 -64zM896 1216v-512c0 -176 -144 -320 -320 -320s-320 144 -320 320v512c0 176 144 320 320 320s320 -144 320 -320z" />
+    <glyph glyph-name="laravel" unicode="&#xf30b;" horiz-adv-x="1870" 
+d="M1863 682v0c13 -14 10 -25 -13 -31c-20 -6 -203 -54 -255 -68c76 -101 219 -294 231 -312c17 -25 2 -32 -23 -42s-571 -207 -608 -218c-48 -14 -69 -21 -100 22c-23 33 -149 259 -211 371c-117 -30 -330 -86 -392 -101c-60 -14 -86 22 -96 44s-365 786 -387 839
+c-23 53 2 62 24 64s335 28 376 30s44 -8 62 -34l450 -753l566 136c-31 44 -173 246 -187 265c-15 22 0 32 25 36s242 41 261 44s33 9 63 -27s201 -251 214 -265zM834 472c7 1 10 5 3 18s-422 729 -422 729c-4 7 -3 9 -13 9s-305 -27 -310 -27s-5 -8 0 -18s380 -783 382 -789
+s2 -8 19 -4s334 81 341 82zM1728 304c-5 8 -178 244 -187 258s-13 10 -27 6l-552 -143s169 -293 182 -312s21 -17 31 -13s531 179 547 185s11 11 6 19zM1763 696c13 3 22 7 16 14s-149 189 -159 203s-18 12 -27 10c-8 -2 -196 -36 -208 -38s-8 -8 -3 -15l166 -227
+s202 50 215 53z" />
+    <glyph glyph-name="indent" unicode="&#xf03c;" horiz-adv-x="1792" 
+d="M352 704c0 -8 -3 -17 -9 -23l-288 -288c-6 -6 -15 -9 -23 -9c-17 0 -32 15 -32 32v576c0 17 15 32 32 32c8 0 17 -3 23 -9l288 -288c6 -6 9 -15 9 -23zM1792 224v-192c0 -17 -15 -32 -32 -32h-1728c-17 0 -32 15 -32 32v192c0 17 15 32 32 32h1728c17 0 32 -15 32 -32z
+M1792 608v-192c0 -17 -15 -32 -32 -32h-1088c-17 0 -32 15 -32 32v192c0 17 15 32 32 32h1088c17 0 32 -15 32 -32zM1792 992v-192c0 -17 -15 -32 -32 -32h-1088c-17 0 -32 15 -32 32v192c0 17 15 32 32 32h1088c17 0 32 -15 32 -32zM1792 1376v-192c0 -17 -15 -32 -32 -32
+h-1728c-17 0 -32 15 -32 32v192c0 17 15 32 32 32h1728c17 0 32 -15 32 -32z" />
+    <glyph glyph-name="address-card-o" unicode="&#xf2bc;" horiz-adv-x="2048" 
+d="M1024 405c0 -87 -57 -149 -128 -149h-512c-71 0 -128 62 -128 149c0 155 38 327 196 327c49 -28 115 -76 188 -76s139 48 188 76c158 0 196 -172 196 -327zM867 925c0 -126 -102 -227 -227 -227s-227 101 -227 227c0 125 102 227 227 227s227 -102 227 -227zM1792 480
+v-64c0 -18 -14 -32 -32 -32h-576c-18 0 -32 14 -32 32v64c0 18 14 32 32 32h576c18 0 32 -14 32 -32zM1792 732v-56c0 -20 -16 -36 -36 -36h-568c-20 0 -36 16 -36 36v56c0 20 16 36 36 36h568c20 0 36 -16 36 -36zM1792 992v-64c0 -18 -14 -32 -32 -32h-576
+c-18 0 -32 14 -32 32v64c0 18 14 32 32 32h576c18 0 32 -14 32 -32zM1920 32v1216c0 17 -15 32 -32 32h-1728c-17 0 -32 -15 -32 -32v-1216c0 -17 15 -32 32 -32h352v96c0 18 14 32 32 32h64c18 0 32 -14 32 -32v-96h768v96c0 18 14 32 32 32h64c18 0 32 -14 32 -32v-96h352
+c17 0 32 15 32 32zM2048 1248v-1216c0 -88 -72 -160 -160 -160h-1728c-88 0 -160 72 -160 160v1216c0 88 72 160 160 160h1728c88 0 160 -72 160 -160z" />
+    <glyph glyph-name="language" unicode="&#xf1ab;" 
+d="M654 458c-2 -7 -51 16 -64 21c-13 6 -72 39 -87 49s-72 57 -79 60c-36 -55 -82 -120 -134 -181c-18 -21 -72 -89 -105 -110c-5 -3 -34 -6 -38 -4c16 12 62 69 82 92c25 29 144 195 164 233c21 38 84 164 87 176c-10 1 -89 -26 -110 -33c-20 -6 -75 -19 -79 -22
+c-4 -4 -1 -16 -3 -20s-20 -13 -31 -15c-10 -3 -33 -4 -47 0c-13 3 -25 16 -28 21c0 0 -4 6 -5 23c12 4 32 5 54 11s76 22 105 32s85 31 102 35c18 3 63 33 87 41s41 18 42 13s0 -27 -1 -33c-1 -5 -49 -99 -56 -114c-4 -8 -32 -61 -77 -131c16 -7 50 -21 64 -28
+c17 -8 136 -58 142 -60s17 -48 15 -56zM449 944c3 -17 -2 -24 -4 -28c-10 -19 -35 -32 -50 -38s-40 -12 -60 -12c-9 1 -27 4 -49 26c-12 13 -21 48 -17 44s33 -8 46 -5s44 12 58 16c15 5 45 13 55 14c10 0 18 -4 21 -17zM1147 815l63 -227l-139 42zM39 15l694 232v1032
+l-694 -233v-1031zM1280 332l102 -31l-181 657l-100 31l-216 -536l102 -31l45 110l211 -65zM777 1294l573 -184v380zM1088 -29l158 -13l-54 -160l-40 66c-81 -52 -181 -92 -276 -108c-29 -6 -62 -12 -91 -12h-84c-106 0 -299 63 -383 124c-6 5 -8 9 -8 16c0 11 8 19 18 19
+c9 0 56 -29 69 -35c90 -45 216 -86 317 -86c125 0 210 16 324 65c33 15 62 34 93 51zM1536 1050v-1079c-773 246 -774 246 -774 246c-16 -7 -733 -249 -743 -249c-8 0 -15 5 -18 13c0 1 -1 2 -1 3v1078c1 3 2 8 4 10c6 7 14 9 20 11c3 1 64 21 149 50v384l558 -198
+c7 2 629 217 638 217c11 0 20 -8 20 -21v-418z" />
+    <glyph glyph-name="circle-thin" unicode="&#xf1db;" 
+d="M768 1280c-353 0 -640 -287 -640 -640s287 -640 640 -640s640 287 640 640s-287 640 -640 640zM1536 640c0 -424 -344 -768 -768 -768s-768 344 -768 768s344 768 768 768s768 -344 768 -768z" />
+    <glyph glyph-name="drupal" unicode="&#xf1a9;" 
+d="M1167 -50c-2 7 -8 17 -24 5c-34 -25 -110 -56 -218 -56s-159 23 -193 49c-5 4 -3 4 -13 4c-11 0 -17 -5 -26 -12c-8 -7 -12 -24 0 -36c74 -68 198 -62 289 -54c92 9 170 63 178 71c12 12 9 22 7 29zM1128 65c-7 17 -19 47 -39 61c-20 13 -49 15 -76 15s-42 2 -71 -10
+s-59 -39 -78 -56s-22 -30 -12 -44c10 -13 21 -5 49 19c29 23 48 44 107 44s69 -22 81 -44s13 -25 25 -19c14 7 21 17 14 34zM1483 346c0 52 -23 140 -108 140c-80 0 -242 -166 -327 -167c-99 -2 -236 196 -434 194c-156 -1 -279 -125 -281 -257c-1 -74 23 -129 74 -164
+c34 -23 65 -37 166 -37c168 0 381 208 479 205c78 -3 199 -194 260 -198c48 -4 73 18 114 77c40 60 57 154 57 207zM1536 506c0 -448 -354 -744 -761 -744c-408 0 -775 321 -775 758c0 436 340 638 403 671c75 40 129 61 214 129c42 33 77 81 88 198
+c61 -73 134 -158 186 -193c85 -56 170 -78 259 -134c54 -33 386 -236 386 -685z" />
+    <glyph glyph-name="headphones" unicode="&#xf025;" horiz-adv-x="1664" 
+d="M1664 650c0 -109 -20 -215 -60 -314l-20 -49l-185 -33c-29 -109 -128 -190 -247 -190v-32c0 -18 -14 -32 -32 -32h-64c-18 0 -32 14 -32 32v576c0 18 14 32 32 32h64c18 0 32 -14 32 -32v-32c96 0 179 -53 223 -131l68 12c19 62 29 126 29 193c0 302 -299 566 -640 566
+s-640 -264 -640 -566c0 -67 10 -131 29 -193l68 -12c44 78 127 131 223 131v32c0 18 14 32 32 32h64c18 0 32 -14 32 -32v-576c0 -18 -14 -32 -32 -32h-64c-18 0 -32 14 -32 32v32c-119 0 -218 81 -247 190l-185 33l-20 49c-40 99 -60 205 -60 314c0 411 381 758 832 758
+s832 -347 832 -758z" />
+    <glyph glyph-name="cc-mastercard" unicode="&#xf1f1;" horiz-adv-x="2304" 
+d="M1119 1195c-83 55 -181 85 -281 85c-281 0 -509 -228 -509 -508c0 -281 228 -509 509 -509c100 0 198 30 281 85c-268 218 -266 629 0 847zM1152 1171c-258 -203 -259 -597 0 -799c259 202 258 596 0 799zM1185 1195c265 -218 269 -630 0 -847c83 -55 182 -85 281 -85
+c281 0 509 228 509 509c0 280 -228 508 -509 508c-100 0 -198 -30 -281 -85zM1926 473h7v3h-17v-3h7v-17h3v17zM1955 456h4v20h-5l-6 -13l-6 13h-5v-20h3v15l6 -13h4l5 13v-15zM1947 16v-2h-5v3h5v-1zM1947 7h3l-4 5c2 0 2 1 3 1c1 1 1 2 1 3s0 2 -1 3c-1 0 -2 1 -4 1h-6
+v-13h3v5h1zM685 75c0 24 15 43 41 43c24 0 40 -19 40 -43c0 -25 -16 -43 -40 -43c-26 0 -41 19 -41 43zM1158 119c19 0 32 -11 35 -32h-70c3 19 15 32 35 32zM1514 75c0 24 15 43 40 43s41 -19 41 -43c0 -25 -16 -43 -41 -43s-40 19 -40 43zM1786 75c0 24 16 43 41 43
+c24 0 41 -19 41 -43c0 -25 -17 -43 -41 -43c-25 0 -41 19 -41 43zM1944 3c-1 0 -2 0 -4 1c-1 0 -2 1 -3 2s-2 2 -2 3c-1 2 -1 3 -1 4c0 2 0 3 1 4c0 2 1 3 2 4s2 1 3 2c2 1 3 1 4 1c2 0 3 0 4 -1c2 -1 3 -1 4 -2s1 -2 2 -4c0 -1 1 -2 1 -4c0 -1 -1 -2 -1 -4
+c-1 -1 -1 -2 -2 -3s-2 -2 -4 -2c-1 -1 -2 -1 -4 -1zM599 7h30v85c0 32 -21 53 -54 54c-17 0 -35 -5 -47 -24c-9 15 -24 24 -45 24c-14 0 -28 -5 -39 -20v16h-30v-135h30v75c0 24 13 36 33 36s30 -13 30 -36v-75h29v75c0 24 14 36 33 36c20 0 30 -13 30 -36v-75zM765 7h29
+v135h-29v-16c-10 12 -24 20 -43 20c-38 0 -67 -30 -67 -71s29 -71 67 -71c19 0 33 7 43 20v-17zM943 48c0 24 -18 36 -47 40l-14 2c-13 2 -23 5 -23 14s9 15 25 15c18 0 34 -6 43 -11l12 24c-14 9 -33 14 -55 14c-34 0 -56 -17 -56 -44c0 -22 16 -35 47 -39l13 -2
+c17 -3 24 -7 24 -14c0 -11 -11 -17 -31 -17s-35 7 -45 14l-13 -23c16 -11 36 -17 58 -17c39 0 62 18 62 44zM1073 14l-8 25c-9 -5 -18 -7 -26 -7c-15 0 -19 9 -19 22v61h48v27h-48v41h-30v-41h-28v-27h28v-61c0 -31 12 -50 47 -50c12 0 27 4 36 10zM1159 146
+c-39 0 -67 -29 -67 -71c0 -43 29 -71 69 -71c20 0 39 5 55 19l-14 22c-11 -9 -26 -15 -39 -15c-19 0 -36 9 -41 33h101v12c0 42 -26 71 -64 71zM1318 146c-17 0 -28 -8 -35 -20v16h-30v-135h30v76c0 22 9 35 29 35c6 0 12 -1 18 -4l9 28c-7 3 -15 4 -21 4zM1348 75
+c0 -41 28 -71 72 -71c20 0 34 4 48 16l-14 24c-11 -8 -22 -13 -35 -12c-24 0 -41 17 -41 43s17 43 41 43c13 0 24 -4 35 -12l14 24c-14 11 -28 16 -48 16c-44 0 -72 -30 -72 -71zM1593 7h30v135h-30v-16c-9 12 -23 20 -42 20c-38 0 -68 -30 -68 -71s30 -71 68 -71
+c19 0 33 7 42 20v-17zM1726 146c-17 0 -28 -8 -35 -20v16h-29v-135h29v76c0 22 10 35 29 35c6 0 12 -1 18 -4l9 28c-6 3 -15 4 -21 4zM1866 7h29v190h-29v-71c-9 12 -23 20 -43 20c-37 0 -67 -30 -67 -71s30 -71 67 -71c20 0 34 7 43 20v-17zM1944 27c-1 0 -3 -1 -5 -1
+c-2 -1 -3 -2 -4 -3c-2 -1 -3 -3 -3 -4c-1 -2 -1 -4 -1 -6c0 -1 0 -3 1 -5c0 -1 1 -3 3 -4c1 -1 2 -2 4 -3s4 -1 5 -1c2 0 4 0 6 1c1 1 3 2 4 3s2 3 3 4c1 2 1 4 1 5c0 2 0 4 -1 6c-1 1 -2 3 -3 4s-3 2 -4 3c-2 0 -4 1 -6 1zM2304 1280v-1280c0 -70 -58 -128 -128 -128h-2048
+c-70 0 -128 58 -128 128v1280c0 70 58 128 128 128h2048c70 0 128 -58 128 -128z" />
+    <glyph glyph-name="times" unicode="&#xf00d;" horiz-adv-x="1188" 
+d="M1188 214c0 -25 -10 -50 -28 -68l-136 -136c-18 -18 -43 -28 -68 -28s-50 10 -68 28l-294 294l-294 -294c-18 -18 -43 -28 -68 -28s-50 10 -68 28l-136 136c-18 18 -28 43 -28 68s10 50 28 68l294 294l-294 294c-18 18 -28 43 -28 68s10 50 28 68l136 136
+c18 18 43 28 68 28s50 -10 68 -28l294 -294l294 294c18 18 43 28 68 28s50 -10 68 -28l136 -136c18 -18 28 -43 28 -68s-10 -50 -28 -68l-294 -294l294 -294c18 -18 28 -43 28 -68z" />
+    <glyph glyph-name="buysellads" unicode="&#xf20d;" 
+d="M915 450h-294l147 551zM1001 128h311l-324 1024h-440l-324 -1024h311l383 314zM1536 1120v-960c0 -158 -130 -288 -288 -288h-960c-158 0 -288 130 -288 288v960c0 158 130 288 288 288h960c158 0 288 -130 288 -288z" />
+    <glyph glyph-name="diaspora" unicode="&#xf2e5;" horiz-adv-x="1581" 
+d="M1005 -16c-42 59 -111 155 -153 214c-41 57 -75 102 -77 102s-66 -87 -152 -205c-82 -113 -150 -205 -151 -205c-2 0 -296 207 -297 209c0 1 65 99 147 217s149 217 149 219c0 4 -27 14 -234 83c-129 43 -235 78 -237 79s10 41 52 174c30 95 56 174 57 175
+s112 -35 248 -80s249 -81 250 -81s2 2 3 5s2 118 3 257s2 254 3 255c1 2 40 2 180 2c98 0 179 0 180 -1c2 -1 4 -78 8 -249c7 -281 9 -285 13 -285c2 0 109 36 239 80s236 79 237 78c3 -3 109 -350 108 -351s-109 -37 -241 -82c-181 -61 -240 -82 -240 -85
+c0 -2 62 -95 141 -211c78 -114 141 -208 141 -209c-1 -2 -293 -217 -295 -217c-1 0 -38 50 -82 112z" />
+    <glyph glyph-name="att" unicode="&#xf31e;" 
+d="M768 1407v0c144 0 278 -39 393 -108c31 -19 46 -30 46 -48c0 -73 -206 -150 -472 -150c-268 0 -419 70 -419 135c0 22 19 39 54 60c116 71 253 111 398 111zM273 1226v0c1 0 0 -1 -1 -2c-22 -27 -31 -53 -31 -79c0 -72 57 -185 362 -185c416 0 677 151 677 236
+c0 7 -2 13 -5 18c-1 1 0 2 1 1c25 -23 48 -46 73 -74c38 -43 53 -66 53 -104c0 -107 -166 -228 -539 -228c-350 0 -725 108 -725 257c0 10 10 28 25 47c32 41 68 78 108 112c1 0 2 1 2 1zM1456 979v0s1 0 1 -1c18 -36 40 -89 51 -133c10 -40 10 -69 2 -97
+c-43 -152 -307 -235 -646 -235c-556 0 -794 160 -841 260c-6 12 -7 20 -4 37c7 39 32 114 55 159c1 1 1 1 1 0c-4 -15 -6 -30 -6 -45c0 -153 253 -274 557 -274c281 0 837 129 830 328v1zM1534 683v0s1 -1 1 -2c1 -13 1 -25 1 -41c0 -67 -9 -146 -28 -190
+c-26 -61 -154 -248 -714 -248c-411 0 -649 139 -744 238c-21 22 -36 49 -39 67c-7 36 -11 91 -11 133c0 2 2 2 2 0c34 -125 219 -308 612 -308c413 0 891 200 919 350c0 1 1 1 1 1zM1482 360v0c1 0 1 -1 1 -2c-13 -33 -30 -67 -47 -96c-29 -50 -61 -86 -95 -114
+c-124 -102 -332 -154 -521 -154c-359 0 -649 111 -745 315c-1 2 0 2 1 1c103 -149 366 -227 610 -227c345 0 679 106 795 276c0 1 1 1 1 1zM1274 64v0c1 0 1 -1 0 -2c-135 -118 -312 -190 -506 -190c-177 0 -341 60 -471 161c-1 1 -1 3 1 2c84 -47 234 -100 470 -100
+c272 0 444 89 505 129h1z" />
+    <glyph glyph-name="sort-asc" unicode="&#xf0de;" horiz-adv-x="1024" 
+d="M1024 832c0 -35 -29 -64 -64 -64h-896c-35 0 -64 29 -64 64c0 17 7 33 19 45l448 448c12 12 28 19 45 19s33 -7 45 -19l448 -448c12 -12 19 -28 19 -45z" />
+    <glyph glyph-name="folder-open" unicode="&#xf07c;" horiz-adv-x="1879" 
+d="M1879 584c0 -24 -15 -48 -31 -66l-336 -396c-58 -68 -176 -122 -264 -122h-1088c-36 0 -87 11 -87 56c0 24 15 48 31 66l336 396c58 68 176 122 264 122h1088c36 0 87 -11 87 -56zM1536 928v-160h-832c-125 0 -280 -71 -361 -167l-337 -396l-5 -6c0 8 -1 17 -1 25v960
+c0 123 101 224 224 224h320c123 0 224 -101 224 -224v-32h544c123 0 224 -101 224 -224z" />
+    <glyph glyph-name="heartbeat" unicode="&#xf21e;" horiz-adv-x="1792" 
+d="M1280 512h305c-12 -13 -20 -20 -22 -22l-623 -600c-12 -12 -28 -18 -44 -18s-32 6 -44 18l-624 602c-2 1 -10 8 -21 20h369c29 0 55 20 62 48l70 281l190 -667c8 -27 33 -46 62 -46c28 0 53 19 61 46l146 485l56 -112c11 -21 33 -35 57 -35zM1792 940
+c0 -115 -50 -220 -103 -300h-369l-111 221c-11 23 -37 37 -62 35c-27 -3 -49 -20 -56 -46l-129 -430l-196 686c-8 27 -33 46 -63 46c-29 0 -54 -20 -61 -48l-116 -464h-423c-53 80 -103 185 -103 300c0 293 179 468 478 468c175 0 339 -138 418 -216c79 78 243 216 418 216
+c299 0 478 -175 478 -468z" />
+    <glyph glyph-name="blind" unicode="&#xf29d;" horiz-adv-x="1330" 
+d="M327 1225c-86 0 -156 70 -156 156c0 85 70 155 156 155s155 -70 155 -155c0 -86 -69 -156 -155 -156zM878 583c0 -108 -115 -84 -141 -40l-367 438c-16 26 -28 14 -28 14s-7 -8 4 -21l122 -139l1 -354c-86 -250 -161 -457 -161 -457c-47 -134 -86 -250 -120 -266
+c-41 -21 -71 -16 -103 -1c-42 19 -54 70 -51 100c0 0 2 16 197 618l5 416l-85 -164l35 -222c13 -84 -58 -95 -58 -95c-68 -11 -82 68 -82 70l-46 299c210 379 211 381 211 381c16 24 52 34 113 34c54 0 88 -16 107 -40l424 -521c6 -4 10 -10 14 -17l3 -3l-1 -1
+c5 -9 7 -19 7 -29zM475 433c96 -255 182 -448 182 -448c29 -74 79 -180 6 -222c-72 -42 -130 7 -146 41h-1c-3 8 -6 16 -8 25l-124 351zM1299 -159c21 -33 39 -57 28 -64c-19 -12 -25 23 -46 57c0 0 -113 171 -423 661c6 -2 17 7 17 7s11 9 11 17
+c308 -503 413 -678 413 -678z" />
+    <glyph glyph-name="arrows-v" unicode="&#xf07d;" horiz-adv-x="640" 
+d="M640 1216c0 -35 -29 -64 -64 -64h-128v-1024h128c35 0 64 -29 64 -64c0 -17 -7 -33 -19 -45l-256 -256c-12 -12 -28 -19 -45 -19s-33 7 -45 19l-256 256c-12 12 -19 28 -19 45c0 35 29 64 64 64h128v1024h-128c-35 0 -64 29 -64 64c0 17 7 33 19 45l256 256
+c12 12 28 19 45 19s33 -7 45 -19l256 -256c12 -12 19 -28 19 -45z" />
+    <glyph glyph-name="phone-square" unicode="&#xf098;" 
+d="M1280 343c0 5 0 11 -2 16c-6 18 -152 92 -180 108c-19 11 -42 33 -65 33c-44 0 -109 -131 -148 -131c-20 0 -45 18 -63 28c-132 74 -223 165 -297 297c-10 18 -28 43 -28 63c0 39 131 104 131 148c0 23 -22 46 -33 65c-16 28 -90 174 -108 180c-5 2 -11 2 -16 2
+c-26 0 -77 -12 -101 -22c-66 -30 -114 -156 -114 -225c0 -67 27 -128 50 -190c80 -219 318 -457 537 -537c62 -23 123 -50 190 -50c69 0 195 48 225 114c10 24 22 75 22 101zM1536 1120v-960c0 -159 -129 -288 -288 -288h-960c-159 0 -288 129 -288 288v960
+c0 159 129 288 288 288h960c159 0 288 -129 288 -288z" />
+    <glyph glyph-name="text-height" unicode="&#xf034;" horiz-adv-x="1789" 
+d="M1744 128c44 0 58 -28 31 -63l-126 -162c-27 -35 -71 -35 -98 0l-126 162c-27 35 -13 63 31 63h80v1024h-80c-44 0 -58 28 -31 63l126 162c27 35 71 35 98 0l126 -162c27 -35 13 -63 -31 -63h-80v-1024h80zM81 1407l54 -27c7 -3 190 -5 211 -5c88 0 176 4 264 4
+c72 0 143 -1 215 -1h293c40 0 63 -9 90 29l42 1c9 0 19 -1 28 -1c2 -112 2 -224 2 -336c0 -35 1 -74 -5 -109c-22 -8 -45 -15 -68 -18c-23 40 -39 84 -54 128c-7 20 -31 155 -33 157c-21 26 -44 21 -75 21c-91 0 -186 4 -276 -7c-5 -44 -9 -91 -8 -136c1 -281 4 -562 4 -843
+c0 -77 -12 -158 10 -232c76 -39 166 -45 244 -80c2 -16 5 -33 5 -50c0 -9 -1 -19 -3 -29l-34 -1c-142 -4 -282 18 -425 18c-101 0 -202 -18 -303 -18c-1 17 -3 35 -3 52v9c38 61 175 62 238 99c22 49 19 320 19 383c0 202 -6 404 -6 606v117c0 18 4 90 -8 104
+c-14 15 -145 12 -162 12c-37 0 -144 -17 -173 -38c-48 -33 -48 -233 -108 -237c-18 11 -43 27 -56 44v383z" />
+    <glyph glyph-name="linkedin-square" unicode="&#xf08c;" 
+d="M237 122h231v694h-231v-694zM483 1030c-1 68 -50 120 -129 120s-131 -52 -131 -120c0 -66 50 -120 128 -120h1c81 0 131 54 131 120zM1068 122h231v398c0 213 -114 312 -266 312c-124 0 -179 -69 -209 -117h2v101h-231s3 -65 0 -694h231v388c0 20 1 41 7 56
+c17 41 55 84 119 84c83 0 116 -63 116 -157v-371zM1536 1120v-960c0 -159 -129 -288 -288 -288h-960c-159 0 -288 129 -288 288v960c0 159 129 288 288 288h960c159 0 288 -129 288 -288z" />
+    <glyph glyph-name="delicious" unicode="&#xf1a5;" 
+d="M1472 160v480h-704v704h-480c-124 0 -224 -100 -224 -224v-480h704v-704h480c124 0 224 100 224 224zM1536 1120v-960c0 -159 -129 -288 -288 -288h-960c-159 0 -288 129 -288 288v960c0 159 129 288 288 288h960c159 0 288 -129 288 -288z" />
+    <glyph glyph-name="qrcode" unicode="&#xf029;" 
+d="M0 1408h768v-704h-128v576h-512v-512h640v-128h-768v768zM0 -128v640h640v-640h-576v128h448v384h-384v-512h-128zM896 768v640h640v-640h-576v128h448v384h-384v-512h-128zM256 1152h256v-256h-256v256zM1152 1152h128v-128h-128v128zM256 256h128v-128h-128v128z
+M768 512h128v-128h-128v128zM1152 384h128v-128h-128v128zM1152 128h128v-128h-128v128zM1024 640h384v-256h-128v128h-256v128zM1536 256v-384h-256v128h128v256h128zM1024 384v-256h-256v128h128v128h128zM768 0h384v-128h-384v128z" />
+    <glyph glyph-name="arrows-h" unicode="&#xf07e;" horiz-adv-x="1792" 
+d="M1792 640c0 -17 -7 -33 -19 -45l-256 -256c-12 -12 -28 -19 -45 -19c-35 0 -64 29 -64 64v128h-1024v-128c0 -35 -29 -64 -64 -64c-17 0 -33 7 -45 19l-256 256c-12 12 -19 28 -19 45s7 33 19 45l256 256c12 12 28 19 45 19c35 0 64 -29 64 -64v-128h1024v128
+c0 35 29 64 64 64c17 0 33 -7 45 -19l256 -256c12 -12 19 -28 19 -45z" />
+    <glyph glyph-name="mercury" unicode="&#xf223;" horiz-adv-x="1152" 
+d="M830 1220c190 -94 322 -290 322 -516c0 -296 -224 -540 -512 -572v-132h96c18 0 32 -14 32 -32v-64c0 -18 -14 -32 -32 -32h-96v-96c0 -18 -14 -32 -32 -32h-64c-18 0 -32 14 -32 32v96h-96c-18 0 -32 14 -32 32v64c0 18 14 32 32 32h96v132c-288 32 -512 276 -512 572
+c0 226 132 422 322 516c-105 61 -187 157 -228 273c-8 21 8 43 30 43h69c13 0 24 -8 29 -20c58 -139 195 -236 354 -236s296 97 354 236c5 12 16 20 37 20h61c22 0 38 -22 30 -43c-41 -116 -123 -212 -228 -273zM576 256c247 0 448 201 448 448s-201 448 -448 448
+s-448 -201 -448 -448s201 -448 448 -448z" />
+    <glyph glyph-name="text-width" unicode="&#xf035;" 
+d="M81 1407l54 -27c7 -3 190 -5 211 -5c88 0 176 4 264 4c265 0 533 6 798 -3c22 -1 43 13 56 31l42 1c9 0 19 -1 28 -1c2 -112 2 -224 2 -336c0 -36 1 -74 -5 -109c-22 -8 -45 -15 -68 -18c-23 40 -39 84 -54 128c-7 20 -32 155 -33 157c-7 9 -16 15 -27 19
+c-8 3 -56 2 -66 2c-123 0 -265 7 -386 -7c-5 -44 -9 -91 -8 -136l1 -152v52c1 -163 3 -325 3 -487c0 -77 -12 -158 10 -232c76 -39 166 -45 244 -80c2 -16 5 -33 5 -50c0 -9 -1 -19 -3 -29l-34 -1c-142 -4 -282 18 -425 18c-101 0 -202 -18 -303 -18c-1 17 -3 35 -3 52v9
+c38 61 175 62 238 99c25 56 18 529 18 617c0 14 -5 29 -5 44c0 41 7 276 -8 293c-14 15 -145 12 -162 12c-42 0 -277 -22 -301 -38c-47 -31 -48 -232 -108 -237c-18 11 -43 27 -56 44v383zM1310 125c35 0 168 -119 195 -140c15 -12 26 -29 26 -49s-11 -37 -26 -49
+c-27 -21 -160 -140 -195 -140c-46 0 -30 107 -30 125h-1024c0 -18 16 -125 -30 -125c-35 0 -168 119 -195 140c-15 12 -26 29 -26 49s11 37 26 49c27 21 160 140 195 140c46 0 30 -107 30 -125h1024c0 18 -16 125 30 125z" />
+    <glyph glyph-name="envelope-o" unicode="&#xf003;" horiz-adv-x="1792" 
+d="M1664 32v768c-21 -24 -44 -46 -69 -66c-143 -110 -287 -222 -426 -338c-75 -63 -168 -140 -272 -140h-2c-104 0 -197 77 -272 140c-139 116 -283 228 -426 338c-25 20 -48 42 -69 66v-768c0 -17 15 -32 32 -32h1472c17 0 32 15 32 32zM1664 1083c0 25 6 69 -32 69h-1472
+c-17 0 -32 -15 -32 -32c0 -114 57 -213 147 -284c134 -105 268 -211 401 -317c53 -43 149 -135 219 -135h2c70 0 166 92 219 135c133 106 267 212 401 317c65 51 147 162 147 247zM1792 1120v-1088c0 -88 -72 -160 -160 -160h-1472c-88 0 -160 72 -160 160v1088
+c0 88 72 160 160 160h1472c88 0 160 -72 160 -160z" />
+    <glyph glyph-name="rss-square" unicode="&#xf143;" 
+d="M512 256c0 71 -57 128 -128 128s-128 -57 -128 -128s57 -128 128 -128s128 57 128 128zM863 162c-17 310 -263 556 -573 573c-9 1 -18 -3 -24 -9s-10 -14 -10 -23v-128c0 -17 13 -31 30 -32c205 -15 370 -180 385 -385c1 -17 15 -30 32 -30h128c9 0 17 4 23 10
+s10 15 9 24zM1247 161c-17 520 -438 941 -958 958c-10 1 -17 -2 -23 -9c-6 -6 -10 -14 -10 -23v-128c0 -17 14 -31 31 -32c415 -15 753 -353 768 -768c1 -17 15 -31 32 -31h128c9 0 17 4 23 10c7 6 10 14 9 23zM1536 1120v-960c0 -159 -129 -288 -288 -288h-960
+c-159 0 -288 129 -288 288v960c0 159 129 288 288 288h960c159 0 288 -129 288 -288z" />
+    <glyph glyph-name="bookmark" unicode="&#xf02e;" horiz-adv-x="1280" 
+d="M1164 1408c15 0 30 -3 44 -9c44 -17 72 -58 72 -103v-1289c0 -45 -28 -86 -72 -103c-14 -6 -29 -8 -44 -8c-31 0 -60 11 -83 32l-441 424l-441 -424c-23 -21 -52 -33 -83 -33c-15 0 -30 3 -44 9c-44 17 -72 58 -72 103v1289c0 45 28 86 72 103c14 6 29 9 44 9h1048z" />
+    <glyph glyph-name="behance" unicode="&#xf1b4;" horiz-adv-x="2048" 
+d="M1848 1197v-124h-511v124h511zM1596 771c-120 0 -200 -75 -208 -195h408c-11 121 -74 195 -200 195zM1612 186c76 0 174 41 198 119h221c-68 -209 -209 -307 -427 -307c-288 0 -467 195 -467 479c0 274 189 483 467 483c286 0 444 -225 444 -495c0 -16 -1 -32 -2 -47
+h-658c0 -146 77 -232 224 -232zM277 236h296c113 0 205 40 205 167c0 129 -77 180 -199 180h-302v-347zM277 773h281c99 0 169 43 169 150c0 116 -90 144 -190 144h-260v-294zM0 1282h594c216 0 403 -61 403 -312c0 -127 -59 -209 -172 -263c155 -44 230 -161 230 -319
+c0 -256 -215 -366 -444 -366h-611v1260z" />
+    <glyph glyph-name="wpbeginner" unicode="&#xf297;" horiz-adv-x="1792" 
+d="M384 704h160v224h-160v-224zM1221 372v92c-86 -30 -157 -37 -243 -38c-193 -1 -364 79 -480 169l1 -96c109 -99 276 -177 484 -176c87 0 169 18 238 49zM640 704h640v224h-640v-224zM1792 736c0 -127 -36 -247 -99 -352c56 -64 89 -143 89 -229
+c0 -209 -198 -379 -443 -379c-166 0 -310 78 -386 193c-19 -1 -38 -1 -57 -1s-38 0 -57 1c-76 -115 -220 -193 -386 -193c-245 0 -443 170 -443 379c0 86 33 165 89 229c-63 105 -99 225 -99 352c0 424 401 768 896 768s896 -344 896 -768z" />
+    <glyph glyph-name="star-half-o" 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 -500c7 -44 -9 -70 -40 -70c-11 0 -25 4 -40 12l-449 236l-449 -236c-15 -8 -29 -12 -40 -12c-31 0 -47 26 -40 70l86 500l-364 354c-43 43 -29 85 31 94
+l502 73l225 455c13 27 31 41 49 41s35 -14 49 -41l225 -455l502 -73c60 -9 74 -51 30 -94z" />
+    <glyph glyph-name="keyboard-o" unicode="&#xf11c;" horiz-adv-x="1920" 
+d="M384 368v-96c0 -9 -7 -16 -16 -16h-96c-9 0 -16 7 -16 16v96c0 9 7 16 16 16h96c9 0 16 -7 16 -16zM512 624v-96c0 -9 -7 -16 -16 -16h-224c-9 0 -16 7 -16 16v96c0 9 7 16 16 16h224c9 0 16 -7 16 -16zM384 880v-96c0 -9 -7 -16 -16 -16h-96c-9 0 -16 7 -16 16v96
+c0 9 7 16 16 16h96c9 0 16 -7 16 -16zM1408 368v-96c0 -9 -7 -16 -16 -16h-864c-9 0 -16 7 -16 16v96c0 9 7 16 16 16h864c9 0 16 -7 16 -16zM768 624v-96c0 -9 -7 -16 -16 -16h-96c-9 0 -16 7 -16 16v96c0 9 7 16 16 16h96c9 0 16 -7 16 -16zM640 880v-96
+c0 -9 -7 -16 -16 -16h-96c-9 0 -16 7 -16 16v96c0 9 7 16 16 16h96c9 0 16 -7 16 -16zM1024 624v-96c0 -9 -7 -16 -16 -16h-96c-9 0 -16 7 -16 16v96c0 9 7 16 16 16h96c9 0 16 -7 16 -16zM896 880v-96c0 -9 -7 -16 -16 -16h-96c-9 0 -16 7 -16 16v96c0 9 7 16 16 16h96
+c9 0 16 -7 16 -16zM1280 624v-96c0 -9 -7 -16 -16 -16h-96c-9 0 -16 7 -16 16v96c0 9 7 16 16 16h96c9 0 16 -7 16 -16zM1664 368v-96c0 -9 -7 -16 -16 -16h-96c-9 0 -16 7 -16 16v96c0 9 7 16 16 16h96c9 0 16 -7 16 -16zM1152 880v-96c0 -9 -7 -16 -16 -16h-96
+c-9 0 -16 7 -16 16v96c0 9 7 16 16 16h96c9 0 16 -7 16 -16zM1408 880v-96c0 -9 -7 -16 -16 -16h-96c-9 0 -16 7 -16 16v96c0 9 7 16 16 16h96c9 0 16 -7 16 -16zM1664 880v-352c0 -9 -7 -16 -16 -16h-224c-9 0 -16 7 -16 16v96c0 9 7 16 16 16h112v240c0 9 7 16 16 16h96
+c9 0 16 -7 16 -16zM1792 128v896h-1664v-896h1664zM1920 1024v-896c0 -71 -57 -128 -128 -128h-1664c-71 0 -128 57 -128 128v896c0 71 57 128 128 128h1664c71 0 128 -57 128 -128z" />
+    <glyph glyph-name="minus-circle" unicode="&#xf056;" 
+d="M1216 576v128c0 35 -29 64 -64 64h-768c-35 0 -64 -29 -64 -64v-128c0 -35 29 -64 64 -64h768c35 0 64 29 64 64zM1536 640c0 -424 -344 -768 -768 -768s-768 344 -768 768s344 768 768 768s768 -344 768 -768z" />
+    <glyph glyph-name="hand-o-down" unicode="&#xf0a7;" 
+d="M1408 576c0 199 -128 369 -128 544v32h-640v-32c0 -106 -90 -177 -163 -241c-46 -41 -92 -79 -145 -112c-22 -14 -45 -26 -68 -38s-136 -62 -136 -89c0 -85 32 -160 128 -160c128 0 193 96 256 96v-576c0 -67 60 -128 128 -128c69 0 128 59 128 128v331
+c26 -20 70 -35 103 -35c47 0 87 19 119 53c21 -12 45 -18 69 -18c46 0 103 23 126 65c18 -3 37 -4 56 -4c118 0 167 73 167 184zM1280 1344c0 35 -29 64 -64 64s-64 -29 -64 -64s29 -64 64 -64s64 29 64 64zM1536 580c0 -184 -104 -318 -295 -317l-5 1
+c-50 -40 -114 -61 -178 -61c-14 0 -29 1 -43 3c-34 -19 -80 -33 -119 -37v-169c0 -140 -117 -256 -257 -256c-138 0 -255 118 -255 256v374c-39 -16 -86 -22 -128 -22c-168 0 -256 129 -256 288c0 134 171 177 264 235c47 30 88 64 129 100c33 29 119 97 119 145v288
+c0 71 57 128 128 128h640c71 0 128 -57 128 -128v-288c0 -63 37 -162 59 -223c37 -102 69 -207 69 -317z" />
+    <glyph glyph-name="sort-numeric-asc" unicode="&#xf162;" horiz-adv-x="1454" 
+d="M1314 223c0 82 -67 169 -147 169c-70 0 -114 -57 -114 -131c0 -72 46 -133 141 -133c65 0 120 39 120 95zM704 96c0 -9 -4 -17 -10 -24l-319 -319c-7 -6 -15 -9 -23 -9s-16 3 -23 9l-320 320c-9 10 -12 23 -7 35s17 20 30 20h192v1376c0 18 14 32 32 32h192
+c18 0 32 -14 32 -32v-1376h192c18 0 32 -14 32 -32zM1454 165c0 -202 -110 -421 -348 -421c-45 0 -82 7 -108 16c-16 5 -30 10 -42 15l39 113c9 -4 20 -8 31 -11c20 -7 46 -13 75 -13c120 0 182 100 201 204h-2c-28 -30 -87 -51 -146 -51c-145 0 -240 114 -240 244
+c0 138 106 251 253 251c159 0 287 -130 287 -347zM1424 882v-114h-469v114h167v432c0 13 1 26 1 36v16h-2l-7 -12c-5 -8 -13 -18 -26 -31l-62 -58l-82 86l192 185h123v-654h165z" />
+    <glyph glyph-name="share-alt" unicode="&#xf1e0;" 
+d="M1216 512c177 0 320 -143 320 -320s-143 -320 -320 -320s-320 143 -320 320c0 11 1 23 2 34l-360 180c-57 -53 -134 -86 -218 -86c-177 0 -320 143 -320 320s143 320 320 320c84 0 161 -33 218 -86l360 180c-1 11 -2 23 -2 34c0 177 143 320 320 320s320 -143 320 -320
+s-143 -320 -320 -320c-84 0 -161 33 -218 86l-360 -180c1 -11 2 -23 2 -34s-1 -23 -2 -34l360 -180c57 53 134 86 218 86z" />
+    <glyph glyph-name="shirtsinbulk" 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 265c-172 0 -313 140 -313 313c0 172 141 313 313 313c173 0 313 -141 313 -313c0 -173 -140 -313 -313 -313zM595 646c0 -152 266 -41 266 -130c0 -45 -82 -49 -112 -49c-42 0 -102 9 -123 51h-3l-31 -63
+c51 -32 100 -42 162 -42c67 0 175 20 175 107c0 165 -269 56 -269 130c0 45 71 51 102 51c37 0 100 -11 122 -45h3l30 58c-52 21 -94 41 -152 41c-69 0 -170 -22 -170 -109z" />
+    <glyph glyph-name="viacoin" 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="dogmazic" unicode="&#xf303;" 
+d="M768 1404c423 0 768 -343 768 -766s-345 -766 -768 -766s-768 343 -768 766s345 766 768 766zM768 1302c-368 0 -666 -297 -666 -664s298 -664 666 -664s666 297 666 664s-298 664 -666 664zM768 1223c668 3 845 -918 212 -1148c-52 -19 -148 -29 -165 -17
+c-9 6 6 111 30 214c20 88 28 84 -78 37c-49 -22 -92 -40 -96 -41c-5 -1 -23 23 -60 78c-32 48 -54 78 -55 74s-21 -73 -44 -154c-50 -177 -38 -165 -111 -110c-452 340 -218 1052 351 1067h16zM803 1137c-251 0 -505 -261 -415 -458c14 -31 19 -30 9 1
+c-66 214 206 464 458 420c281 -49 436 -423 255 -613c-49 -51 -21 -53 31 -2c184 181 17 586 -267 645c-23 5 -47 7 -71 7zM435 998c-2 0 -6 0 -10 -1c-132 -18 -189 -193 -96 -296c27 -30 30 -29 22 5c-18 75 7 167 69 258c19 28 24 34 15 34zM805 958
+c-12 0 -35 -27 -35 -44c0 -20 -7 -22 -25 -6c-42 37 -123 53 -167 34c-14 -6 -14 -5 6 -8c61 -8 101 -75 69 -117c-27 -36 -40 -72 -44 -123c-4 -61 -30 -81 -51 -39c-27 54 10 135 62 135c11 0 0 8 -15 11c-89 17 -142 -140 -56 -167c14 -4 6 -11 -14 -11
+c-24 0 -48 11 -69 31c-23 22 -10 -6 24 -53c12 -16 57 -84 101 -150c94 -139 89 -132 95 -129c3 1 61 28 131 60s144 64 166 72c40 15 83 37 79 41c-1 1 -6 0 -11 -3c-24 -13 -80 -2 -98 18c-9 10 -9 9 15 9c97 0 121 145 28 173c-16 5 -18 7 -20 26c-1 11 -4 26 -5 33
+c-5 33 78 59 121 37c19 -10 15 0 -9 21c-37 33 -64 43 -119 43c-70 0 -77 6 -56 49c9 19 10 23 4 24c-10 2 -23 -11 -30 -29c-5 -15 -13 -20 -19 -11c-2 3 1 12 6 20c11 17 12 30 3 30c-8 0 -17 -11 -27 -30c-4 -8 -10 -15 -12 -15c-6 0 -4 18 3 31c4 6 6 16 6 20
+c0 16 -22 -2 -32 -25c-5 -12 -13 -22 -16 -22c-9 0 -7 12 6 37c6 13 10 24 9 25s-2 2 -4 2zM1242 756c-5 0 -5 -16 -5 -59c0 -100 -23 -174 -72 -226c-26 -27 -19 -29 32 -6c106 48 136 192 58 280c-6 7 -10 11 -13 11zM982 689c3 0 6 -3 10 -8c39 -45 25 -117 -28 -144
+c-24 -12 -28 -11 -37 8c-8 16 -8 16 3 28c16 17 34 55 40 86c4 21 8 30 12 30zM680 537c10 0 20 -8 21 -22c2 -25 -16 -39 -36 -27v0c-11 6 -11 32 1 43c4 4 9 6 14 6zM778 509c10 0 19 -11 19 -28c0 -22 -23 -33 -38 -18c-10 10 -9 27 2 38c6 6 12 8 17 8z" />
+    <glyph glyph-name="digg" unicode="&#xf1a6;" horiz-adv-x="2048" 
+d="M328 1254h204v-983h-532v697h328v286zM328 435v369h-123v-369h123zM614 968h205v-697h-205v697zM614 1254h205v-204h-205v204zM901 968h533v-942h-533v163h328v82h-328v697zM1229 435v369h-123v-369h123zM1516 968h532v-942h-532v163h327v82h-327v697zM1843 435v369h-123
+v-369h123z" />
+    <glyph glyph-name="rss" unicode="&#xf09e;" horiz-adv-x="1408" 
+d="M384 192c0 -106 -86 -192 -192 -192s-192 86 -192 192s86 192 192 192s192 -86 192 -192zM896 69c1 -18 -5 -35 -17 -48c-12 -14 -29 -21 -47 -21h-135c-33 0 -60 25 -63 58c-29 305 -271 547 -576 576c-33 3 -58 30 -58 63v135c0 18 7 35 21 47c11 11 27 17 43 17h5
+c213 -17 414 -110 565 -262c152 -151 245 -352 262 -565zM1408 67c1 -17 -5 -34 -18 -47c-12 -13 -28 -20 -46 -20h-143c-34 0 -62 26 -64 60c-33 581 -496 1044 -1077 1078c-34 2 -60 30 -60 63v143c0 18 7 34 20 46c12 12 28 18 44 18h3c350 -18 679 -165 927 -414
+c249 -248 396 -577 414 -927z" />
+    <glyph glyph-name="television" unicode="&#xf26c;" horiz-adv-x="1920" 
+d="M1792 288v960c0 17 -15 32 -32 32h-1600c-17 0 -32 -15 -32 -32v-960c0 -17 15 -32 32 -32h1600c17 0 32 15 32 32zM1920 1248v-960c0 -88 -72 -160 -160 -160h-736v-128h352c18 0 32 -14 32 -32v-64c0 -18 -14 -32 -32 -32h-832c-18 0 -32 14 -32 32v64
+c0 18 14 32 32 32h352v128h-736c-88 0 -160 72 -160 160v960c0 88 72 160 160 160h1600c88 0 160 -72 160 -160z" />
+    <glyph glyph-name="ffmpeg" unicode="&#xf30f;" 
+d="M1158 323v179l-530 -527l-628 53l1010 1100l-167 -10l-730 -810v688l69 83l-169 -10v185l591 50l-325 -379v-161l483 553l774 66l-1134 -1194l149 -8l824 849v-806l-92 -87l234 -14v-223l-731 62z" />
+    <glyph glyph-name="folder-o" unicode="&#xf114;" horiz-adv-x="1664" 
+d="M1536 224v704c0 53 -43 96 -96 96h-704c-53 0 -96 43 -96 96v64c0 53 -43 96 -96 96h-320c-53 0 -96 -43 -96 -96v-960c0 -53 43 -96 96 -96h1216c53 0 96 43 96 96zM1664 928v-704c0 -123 -101 -224 -224 -224h-1216c-123 0 -224 101 -224 224v960
+c0 123 101 224 224 224h320c123 0 224 -101 224 -224v-32h672c123 0 224 -101 224 -224z" />
+    <glyph glyph-name="bed" unicode="&#xf236;" horiz-adv-x="2048" 
+d="M256 512h1728c35 0 64 -29 64 -64v-448h-256v256h-1536v-256h-256v1216c0 35 29 64 64 64h128c35 0 64 -29 64 -64v-704zM832 832c0 -141 -115 -256 -256 -256s-256 115 -256 256s115 256 256 256s256 -115 256 -256zM2048 576h-1152v384c0 35 29 64 64 64h704
+c212 0 384 -172 384 -384v-64z" />
+    <glyph glyph-name="caret-square-o-down" unicode="&#xf150;" 
+d="M1145 861c11 -21 9 -47 -5 -66l-320 -448c-12 -17 -31 -27 -52 -27s-40 10 -52 27l-320 448c-14 19 -16 45 -5 66c11 22 33 35 57 35h640c24 0 46 -13 57 -35zM1280 160v960c0 17 -15 32 -32 32h-960c-17 0 -32 -15 -32 -32v-960c0 -17 15 -32 32 -32h960
+c17 0 32 15 32 32zM1536 1120v-960c0 -159 -129 -288 -288 -288h-960c-159 0 -288 129 -288 288v960c0 159 129 288 288 288h960c159 0 288 -129 288 -288z" />
+    <glyph glyph-name="shower" unicode="&#xf2cc;" horiz-adv-x="1920" 
+d="M1433 1287c13 -13 13 -33 0 -46l-626 -626c-13 -13 -33 -13 -46 0l-82 82c-13 13 -13 33 0 46l44 44c-97 122 -109 289 -35 422c-46 44 -108 71 -176 71c-141 0 -256 -115 -256 -256v-1280h-256v1280c0 282 230 512 512 512c144 0 274 -60 367 -156
+c126 51 272 32 382 -55l44 44c13 13 33 13 46 0zM1344 1024c35 0 64 -29 64 -64s-29 -64 -64 -64s-64 29 -64 64s29 64 64 64zM1600 896c-35 0 -64 29 -64 64s29 64 64 64s64 -29 64 -64s-29 -64 -64 -64zM1856 1024c35 0 64 -29 64 -64s-29 -64 -64 -64s-64 29 -64 64
+s29 64 64 64zM1216 896c35 0 64 -29 64 -64s-29 -64 -64 -64s-64 29 -64 64s29 64 64 64zM1408 832c0 35 29 64 64 64s64 -29 64 -64s-29 -64 -64 -64s-64 29 -64 64zM1728 896c35 0 64 -29 64 -64s-29 -64 -64 -64s-64 29 -64 64s29 64 64 64zM1088 768c35 0 64 -29 64 -64
+s-29 -64 -64 -64s-64 29 -64 64s29 64 64 64zM1344 640c-35 0 -64 29 -64 64s29 64 64 64s64 -29 64 -64s-29 -64 -64 -64zM1600 768c35 0 64 -29 64 -64s-29 -64 -64 -64s-64 29 -64 64s29 64 64 64zM1216 512c-35 0 -64 29 -64 64s29 64 64 64s64 -29 64 -64
+s-29 -64 -64 -64zM1472 640c35 0 64 -29 64 -64s-29 -64 -64 -64s-64 29 -64 64s29 64 64 64zM1088 512c35 0 64 -29 64 -64s-29 -64 -64 -64s-64 29 -64 64s29 64 64 64zM1344 512c35 0 64 -29 64 -64s-29 -64 -64 -64s-64 29 -64 64s29 64 64 64zM1216 384
+c35 0 64 -29 64 -64s-29 -64 -64 -64s-64 29 -64 64s29 64 64 64zM1088 256c35 0 64 -29 64 -64s-29 -64 -64 -64s-64 29 -64 64s29 64 64 64z" />
+    <glyph glyph-name="paper-plane-o" unicode="&#xf1d9;" horiz-adv-x="1792" 
+d="M1764 1525c21 -15 31 -39 27 -64l-256 -1536c-3 -19 -15 -35 -32 -45c-9 -5 -20 -8 -31 -8c-8 0 -16 2 -24 5l-527 215l-298 -327c-12 -14 -29 -21 -47 -21c-8 0 -16 1 -23 4c-25 10 -41 34 -41 60v452l-472 193c-23 9 -38 30 -40 55c-2 24 11 47 32 59l1664 960
+c21 13 48 12 68 -2zM1422 26l221 1323l-1434 -827l336 -137l863 639l-478 -797z" />
+    <glyph glyph-name="circle-o-notch" unicode="&#xf1ce;" horiz-adv-x="1728" 
+d="M1728 640c0 -477 -387 -864 -864 -864s-864 387 -864 864c0 434 320 793 736 855v-228c-292 -59 -512 -318 -512 -627c0 -353 287 -640 640 -640s640 287 640 640c0 309 -220 568 -512 627v228c416 -62 736 -421 736 -855z" />
+    <glyph glyph-name="gnupg" unicode="&#xf30d;" horiz-adv-x="1156" 
+d="M0 667h81v244c0 274 223 497 497 497s497 -223 497 -497v-242c-1 -1 -3 -1 -4 -2v0l-1 -1v0v0v0h-1v-1v0v0v0h-1v0v0v-1v0h-1v0v0v0l-1 -1v0v0h-1v0l-1 -1v0v0v0v0l-1 -1v0v0v0h-1v0v0v0l-1 -1v0v0v0v0v0h-1v0v-1v0v0v0v0h-1v0v0v0l-2 -1v0v0l-1 -1v0h-1v0v-1v0v0v0h-1v0
+v0v0v0h-1v-1h-1l-1 -1h-1v-1l-2 -1h-1l-1 -1v0l-3 -1l-1 -1l-1 -1h-1l-1 -1l-1 -1h-1l-4 -2v0l-1 -1h-1v-1h-2l-3 -2l-1 -1c-1 -1 -3 -1 -4 -2h-1v0l-2 -2h-1h-1l-1 -1v0l-2 -1v0l-2 -1h-1l-1 -1c-1 -1 -3 -1 -4 -2l-1 -1c-2 -1 -3 -1 -5 -2v0l-4 -2l-2 -1
+c-2 -1 -3 -2 -5 -3v0c-99 -47 -257 -97 -557 -119c-215 -15 -346 -110 -431 -224v390v0zM310 667h536v244c0 148 -120 268 -268 268s-268 -120 -268 -268v-244zM1004 628c-1 -1 -4 -1 -5 -2zM803 1288c-64 38 -138 60 -218 60c-218 0 -398 -164 -422 -376
+c64 200 251 345 472 345c59 0 116 -10 168 -29v0zM1156 573v-701h-989c109 61 190 54 325 50c183 -6 385 71 485 173s-9 24 -122 -5s-330 -31 -476 7c459 -6 637 142 739 275s-44 24 -138 -22s-258 -79 -439 -55c273 1 482 137 615 278v0z" />
+    <glyph glyph-name="medkit" unicode="&#xf0fa;" horiz-adv-x="1792" 
+d="M1280 416v192c0 18 -14 32 -32 32h-224v224c0 18 -14 32 -32 32h-192c-18 0 -32 -14 -32 -32v-224h-224c-18 0 -32 -14 -32 -32v-192c0 -18 14 -32 32 -32h224v-224c0 -18 14 -32 32 -32h192c18 0 32 14 32 32v224h224c18 0 32 14 32 32zM640 1152h512v128h-512v-128z
+M256 1152v-1280h-32c-123 0 -224 101 -224 224v832c0 123 101 224 224 224h32zM1440 1152v-1280h-1088v1280h160v160c0 53 43 96 96 96h576c53 0 96 -43 96 -96v-160h160zM1792 928v-832c0 -123 -101 -224 -224 -224h-32v1280h32c123 0 224 -101 224 -224z" />
+    <glyph glyph-name="toggle-off" unicode="&#xf204;" horiz-adv-x="2048" 
+d="M1152 640c0 282 -230 512 -512 512s-512 -230 -512 -512s230 -512 512 -512s512 230 512 512zM1920 640c0 282 -230 512 -512 512h-386c156 -117 258 -303 258 -512s-102 -395 -258 -512h386c282 0 512 230 512 512zM2048 640c0 -353 -287 -640 -640 -640h-768
+c-353 0 -640 287 -640 640s287 640 640 640h768c353 0 640 -287 640 -640z" />
+    <glyph glyph-name="calendar-minus-o" unicode="&#xf272;" horiz-adv-x="1664" 
+d="M1152 416v-64c0 -18 -14 -32 -32 -32h-576c-18 0 -32 14 -32 32v64c0 18 14 32 32 32h576c18 0 32 -14 32 -32zM128 -128h1408v1024h-1408v-1024zM512 1088v288c0 18 -14 32 -32 32h-64c-18 0 -32 -14 -32 -32v-288c0 -18 14 -32 32 -32h64c18 0 32 14 32 32zM1280 1088
+v288c0 18 -14 32 -32 32h-64c-18 0 -32 -14 -32 -32v-288c0 -18 14 -32 32 -32h64c18 0 32 14 32 32zM1664 1152v-1280c0 -70 -58 -128 -128 -128h-1408c-70 0 -128 58 -128 128v1280c0 70 58 128 128 128h128v96c0 88 72 160 160 160h64c88 0 160 -72 160 -160v-96h384v96
+c0 88 72 160 160 160h64c88 0 160 -72 160 -160v-96h128c70 0 128 -58 128 -128z" />
+    <glyph glyph-name="id-badge" unicode="&#xf2c1;" horiz-adv-x="1280" 
+d="M1024 278c0 -86 -57 -150 -128 -150h-512c-71 0 -128 64 -128 150c0 156 39 329 196 329c49 -46 115 -75 188 -75s139 29 188 75c157 0 196 -173 196 -329zM870 797c0 -126 -103 -227 -230 -227s-230 101 -230 227c0 125 103 227 230 227s230 -102 230 -227zM1152 -96
+v1376h-1024v-1376c0 -17 15 -32 32 -32h960c17 0 32 15 32 32zM1280 1376v-1472c0 -88 -72 -160 -160 -160h-960c-88 0 -160 72 -160 160v1472c0 88 72 160 160 160h352v-96c0 -18 14 -32 32 -32h192c18 0 32 14 32 32v96h352c88 0 160 -72 160 -160z" />
+    <glyph glyph-name="tencent-weibo" unicode="&#xf1d5;" horiz-adv-x="1166" 
+d="M785 964c0 -106 -87 -193 -193 -193c-41 0 -79 13 -111 35c-36 -39 -76 -88 -115 -146c-163 -245 -232 -534 -202 -859c2 -29 -19 -54 -47 -57h-5c-26 0 -49 20 -52 47c-39 438 100 748 223 931c45 67 90 121 132 165c-11 24 -16 50 -16 77c0 107 86 193 193 193
+c106 0 193 -86 193 -193zM1166 953c0 -321 -261 -582 -583 -582c-44 0 -88 5 -131 14c-28 7 -45 35 -39 63c7 27 34 45 62 39c35 -9 72 -13 108 -13c264 0 479 215 479 479s-215 479 -479 479s-479 -215 -479 -479c0 -77 18 -150 52 -218c13 -26 3 -57 -22 -70
+c-26 -13 -57 -3 -70 23c-42 81 -64 173 -64 265c0 322 262 583 583 583c322 0 583 -261 583 -583z" />
+    <glyph glyph-name="file-archive-o" unicode="&#xf1c6;" 
+d="M640 1152h-128v128h128v-128zM768 1024h-128v128h128v-128zM640 896h-128v128h128v-128zM768 768h-128v128h128v-128zM1468 1156c37 -37 68 -111 68 -164v-1152c0 -53 -43 -96 -96 -96h-1344c-53 0 -96 43 -96 96v1600c0 53 43 96 96 96h896c53 0 127 -31 164 -68z
+M1024 1400v-376h376c-6 17 -15 34 -22 41l-313 313c-7 7 -24 16 -41 22zM1408 -128v1024h-416c-53 0 -96 43 -96 96v416h-128v-128h-128v128h-512v-1536h1280zM781 593c85 -287 107 -349 107 -349c5 -17 8 -34 8 -52c0 -111 -108 -192 -256 -192s-256 81 -256 192
+c0 18 3 35 8 52c0 0 21 62 120 396v128h128v-128h79c29 0 54 -19 62 -47zM640 128c71 0 128 29 128 64s-57 64 -128 64s-128 -29 -128 -64s57 -64 128 -64z" />
+    <glyph glyph-name="yoast" unicode="&#xf2b1;" horiz-adv-x="1664" 
+d="M339 1318h691l-26 -72h-665c-147 0 -267 -121 -267 -268v-771c0 -126 90 -237 214 -263c32 -7 65 -5 98 -5v-72h-45c-187 0 -339 153 -339 340v771c0 187 152 340 339 340zM1190 1536h247l-482 -1294c-90 -240 -199 -490 -495 -498v195c111 18 182 79 220 182
+c13 34 20 69 20 105s-7 72 -20 106l-285 733h228l187 -585zM1664 978v-1111h-795c16 24 33 47 45 73h678v1038c0 114 -72 216 -179 254l25 67c136 -46 226 -178 226 -321z" />
+    <glyph glyph-name="share-alt-square" unicode="&#xf1e1;" 
+d="M1280 341c0 118 -96 214 -213 214c-56 0 -107 -22 -145 -58l-241 120c1 8 2 15 2 23s-1 15 -2 23l241 120c38 -36 89 -58 145 -58c117 0 213 96 213 214c0 117 -96 213 -213 213c-118 0 -214 -96 -214 -213c0 -8 1 -15 2 -23l-241 -120c-38 35 -89 57 -145 57
+c-117 0 -213 -95 -213 -213s96 -213 213 -213c56 0 107 22 145 57l241 -120c-1 -8 -2 -15 -2 -23c0 -117 96 -213 214 -213c117 0 213 96 213 213zM1536 1120v-960c0 -159 -129 -288 -288 -288h-960c-159 0 -288 129 -288 288v960c0 159 129 288 288 288h960
+c159 0 288 -129 288 -288z" />
+    <glyph glyph-name="imdb" unicode="&#xf2d8;" 
+d="M922 739v-182c0 -36 7 -69 -38 -68v309c44 0 38 -23 38 -59zM1238 643v-121c0 -20 6 -53 -23 -53c-6 0 -11 3 -14 9c-8 19 -4 163 -4 165c0 14 -4 47 18 47c27 0 23 -27 23 -47zM180 407h122v472h-122v-472zM614 407h106v472h-159l-28 -221c-10 74 -20 148 -32 221h-158
+v-472h107v312l45 -312h76l43 319v-319zM1039 712c0 30 1 62 -5 90c-16 83 -116 77 -181 77h-91v-472c318 0 277 -22 277 305zM1356 515v133c0 64 -3 111 -82 111c-33 0 -55 -10 -77 -34v154h-117v-472h110l7 30c21 -25 44 -36 77 -36c73 0 82 56 82 114zM1536 1248v-1216
+c0 -88 -72 -160 -160 -160h-1216c-88 0 -160 72 -160 160v1216c0 88 72 160 160 160h1216c88 0 160 -72 160 -160z" />
+    <glyph glyph-name="snapchat-square" unicode="&#xf2ad;" 
+d="M1280 388c0 14 -8 24 -22 27c-91 19 -160 83 -198 167c-4 8 -7 16 -7 25c0 45 124 36 124 100c0 27 -33 44 -57 44c-22 0 -40 -16 -63 -16c-4 0 -8 1 -12 2c3 38 5 77 5 115c0 34 -2 82 -17 114c-48 104 -140 165 -255 165c-125 0 -220 -47 -275 -165
+c-15 -32 -18 -80 -18 -115c0 -38 3 -76 6 -114c-5 -1 -10 -2 -15 -2c-22 0 -41 16 -62 16c-25 0 -55 -17 -55 -45c0 -62 124 -54 124 -99c0 -9 -3 -17 -7 -25c-39 -84 -106 -147 -198 -167c-14 -3 -22 -13 -22 -27c0 -47 106 -64 138 -69c9 -24 5 -66 40 -66
+c26 0 51 10 77 10c106 0 134 -95 256 -95c127 0 151 95 258 95c26 0 52 -9 78 -9c34 0 31 42 39 65c32 5 138 22 138 69zM1536 1120v-960c0 -159 -129 -288 -288 -288h-960c-159 0 -288 129 -288 288v960c0 159 129 288 288 288h960c159 0 288 -129 288 -288z" />
+    <glyph glyph-name="spell-check" unicode="&#xf327;" horiz-adv-x="2049" 
+d="M2049 700c0 -25 -10 -50 -28 -68l-724 -724l-136 -136c-18 -18 -43 -28 -68 -28s-50 10 -68 28l-136 136l-362 362c-18 18 -28 43 -28 68s10 50 28 68l136 136c18 18 43 28 68 28s50 -10 68 -28l294 -295l656 657c18 18 43 28 68 28s50 -10 68 -28l136 -136
+c18 -18 28 -43 28 -68zM0 880v73h48l158 454h111l158 -454h49v-73h-199v73h52l-32 98h-167l-32 -98h52v-73h-198zM200 1127h122l-49 149c-2 8 -5 16 -6 23c-1 8 -3 15 -3 18l-1 5h-2c-1 -13 -5 -29 -10 -46zM569 880v73h63v381h-63v73h242c40 0 72 -5 95 -14
+c24 -9 44 -25 58 -47c15 -21 22 -46 22 -75c0 -25 -6 -47 -17 -67s-28 -35 -48 -46v-1c28 -8 50 -24 64 -47s22 -49 22 -78c0 -35 -10 -65 -30 -91s-45 -43 -75 -52c-21 -6 -47 -9 -79 -9h-254zM730 1192h92c20 0 37 6 48 18c11 13 17 30 17 51c0 29 -10 49 -30 60
+c-11 5 -27 8 -46 8h-81v-137zM730 958h98c15 0 27 2 37 6c13 5 25 15 32 28c7 14 11 29 11 46c0 23 -7 41 -21 55c-13 14 -32 22 -56 22h-101v-157zM1131 950c-52 53 -78 118 -78 196s26 142 78 193s116 77 193 77c18 0 39 -2 60 -5c22 -3 44 -9 67 -16s41 -18 56 -33
+s23 -32 23 -51v-72h-88v41c0 12 -7 23 -20 31s-29 14 -45 17s-32 5 -48 5c-51 0 -94 -17 -127 -51c-33 -33 -49 -77 -49 -132c0 -59 17 -106 51 -142s78 -54 130 -54c14 0 29 2 45 4s31 8 46 16s23 19 23 32v41h89v-72c0 -18 -7 -35 -22 -49c-14 -14 -33 -26 -56 -33
+c-22 -7 -45 -13 -67 -16c-22 -4 -44 -6 -64 -6c-79 0 -145 27 -197 79v0z" />
+    <glyph glyph-name="building-o" unicode="&#xf0f7;" horiz-adv-x="1408" 
+d="M384 224v-64c0 -17 -15 -32 -32 -32h-64c-17 0 -32 15 -32 32v64c0 17 15 32 32 32h64c17 0 32 -15 32 -32zM384 480v-64c0 -17 -15 -32 -32 -32h-64c-17 0 -32 15 -32 32v64c0 17 15 32 32 32h64c17 0 32 -15 32 -32zM640 480v-64c0 -17 -15 -32 -32 -32h-64
+c-17 0 -32 15 -32 32v64c0 17 15 32 32 32h64c17 0 32 -15 32 -32zM384 736v-64c0 -17 -15 -32 -32 -32h-64c-17 0 -32 15 -32 32v64c0 17 15 32 32 32h64c17 0 32 -15 32 -32zM1152 224v-64c0 -17 -15 -32 -32 -32h-64c-17 0 -32 15 -32 32v64c0 17 15 32 32 32h64
+c17 0 32 -15 32 -32zM896 480v-64c0 -17 -15 -32 -32 -32h-64c-17 0 -32 15 -32 32v64c0 17 15 32 32 32h64c17 0 32 -15 32 -32zM640 736v-64c0 -17 -15 -32 -32 -32h-64c-17 0 -32 15 -32 32v64c0 17 15 32 32 32h64c17 0 32 -15 32 -32zM384 992v-64
+c0 -17 -15 -32 -32 -32h-64c-17 0 -32 15 -32 32v64c0 17 15 32 32 32h64c17 0 32 -15 32 -32zM1152 480v-64c0 -17 -15 -32 -32 -32h-64c-17 0 -32 15 -32 32v64c0 17 15 32 32 32h64c17 0 32 -15 32 -32zM896 736v-64c0 -17 -15 -32 -32 -32h-64c-17 0 -32 15 -32 32v64
+c0 17 15 32 32 32h64c17 0 32 -15 32 -32zM640 992v-64c0 -17 -15 -32 -32 -32h-64c-17 0 -32 15 -32 32v64c0 17 15 32 32 32h64c17 0 32 -15 32 -32zM384 1248v-64c0 -17 -15 -32 -32 -32h-64c-17 0 -32 15 -32 32v64c0 17 15 32 32 32h64c17 0 32 -15 32 -32zM1152 736
+v-64c0 -17 -15 -32 -32 -32h-64c-17 0 -32 15 -32 32v64c0 17 15 32 32 32h64c17 0 32 -15 32 -32zM896 992v-64c0 -17 -15 -32 -32 -32h-64c-17 0 -32 15 -32 32v64c0 17 15 32 32 32h64c17 0 32 -15 32 -32zM640 1248v-64c0 -17 -15 -32 -32 -32h-64c-17 0 -32 15 -32 32
+v64c0 17 15 32 32 32h64c17 0 32 -15 32 -32zM1152 992v-64c0 -17 -15 -32 -32 -32h-64c-17 0 -32 15 -32 32v64c0 17 15 32 32 32h64c17 0 32 -15 32 -32zM896 1248v-64c0 -17 -15 -32 -32 -32h-64c-17 0 -32 15 -32 32v64c0 17 15 32 32 32h64c17 0 32 -15 32 -32z
+M1152 1248v-64c0 -17 -15 -32 -32 -32h-64c-17 0 -32 15 -32 32v64c0 17 15 32 32 32h64c17 0 32 -15 32 -32zM896 -128h384v1536h-1152v-1536h384v224c0 17 15 32 32 32h320c17 0 32 -15 32 -32v-224zM1408 1472v-1664c0 -35 -29 -64 -64 -64h-1280c-35 0 -64 29 -64 64
+v1664c0 35 29 64 64 64h1280c35 0 64 -29 64 -64z" />
+    <glyph glyph-name="sort-alpha-desc" unicode="&#xf15e;" horiz-adv-x="1629" 
+d="M1159 104h177l-72 218l-12 47c-1 8 -2 14 -2 20h-4l-3 -20c-3 -12 -4 -27 -11 -47zM704 96c0 -9 -4 -17 -10 -24l-319 -319c-7 -6 -15 -9 -23 -9s-16 3 -23 9l-320 320c-9 10 -12 23 -7 35s17 20 30 20h192v1376c0 18 14 32 32 32h192c18 0 32 -14 32 -32v-1376h192
+c18 0 32 -14 32 -32zM1629 -150v-106h-288v106h75l-47 144h-243l-47 -144h75v-106h-287v106h70l230 662h162l230 -662h70zM1540 1001v-233h-584v90l369 529c8 12 16 22 21 27l11 9v3c-4 0 -8 -1 -14 -1c-8 -2 -18 -3 -30 -3h-232v-115h-120v229h567v-89l-369 -530
+c-6 -9 -14 -18 -21 -26l-11 -10v-3l14 3c9 1 18 1 30 1h248v119h121z" />
+    <glyph glyph-name="map-signs" unicode="&#xf277;" horiz-adv-x="1718" 
+d="M1708 1239c13 -13 13 -33 0 -46l-141 -141c-18 -18 -43 -28 -68 -28h-1344c-35 0 -64 29 -64 64v256c0 35 29 64 64 64h576v64c0 35 29 64 64 64h128c35 0 64 -29 64 -64v-64h512c25 0 50 -10 68 -28zM731 320h256v-512c0 -35 -29 -64 -64 -64h-128c-35 0 -64 29 -64 64
+v512zM1563 768c35 0 64 -29 64 -64v-256c0 -35 -29 -64 -64 -64h-1344c-25 0 -50 10 -68 28l-141 141c-13 13 -13 33 0 46l141 141c18 18 43 28 68 28h512v192h256v-192h576z" />
+    <glyph glyph-name="long-arrow-right" unicode="&#xf178;" horiz-adv-x="1728" 
+d="M1728 643c0 -9 -4 -18 -10 -24l-384 -354c-10 -9 -23 -11 -35 -6c-11 5 -19 16 -19 29v224h-1248c-18 0 -32 14 -32 32v192c0 18 14 32 32 32h1248v224c0 13 7 24 19 29s25 3 35 -5l384 -350c6 -6 10 -14 10 -23z" />
+    <glyph glyph-name="first-order" unicode="&#xf2b0;" 
+d="M1322 640c0 -26 -1 -51 -5 -76l-236 14l224 -78c-13 -51 -33 -98 -58 -141l-214 103l177 -158c-30 -41 -66 -77 -107 -108l-157 178l103 -215c-43 -26 -90 -45 -140 -59l-79 228l14 -240c-25 -4 -50 -6 -76 -6c-25 0 -51 2 -76 6l14 238l-78 -226c-50 13 -97 33 -140 59
+l103 215l-157 -178c-41 30 -77 67 -108 108l178 158l-214 -104c-25 44 -45 91 -58 141l224 79l-237 -14c-3 25 -5 50 -5 76s2 52 5 77l238 -14l-225 79c13 50 33 97 58 140l214 -104l-177 159c31 41 67 77 107 108l158 -178l-103 215c43 25 90 45 140 58l77 -224l-13 236
+c24 4 50 6 75 6c26 0 51 -2 76 -6l-14 -237l78 225c50 -13 97 -33 140 -59l-103 -214l158 178c40 -31 76 -67 107 -108l-177 -159l213 104c26 -43 45 -91 58 -141l-224 -78l237 14c4 -25 5 -51 5 -77zM1352 640c0 325 -262 588 -584 588c-323 0 -584 -263 -584 -588
+c0 -324 261 -587 584 -587c322 0 584 263 584 587zM1425 1023v-766l-657 -383l-657 383v766l657 383zM768 -183l708 412v823l-708 411l-708 -411v-823zM1536 1088v-896l-768 -448l-768 448v896l768 448z" />
+    <glyph glyph-name="calendar-check-o" unicode="&#xf274;" horiz-adv-x="1664" 
+d="M1303 572l-512 -512c-13 -12 -33 -12 -46 0l-288 288c-12 13 -12 33 0 45l46 46c12 12 32 12 45 0l220 -220l444 444c13 12 33 12 45 0l46 -46c12 -12 12 -32 0 -45zM128 -128h1408v1024h-1408v-1024zM512 1088v288c0 18 -14 32 -32 32h-64c-18 0 -32 -14 -32 -32v-288
+c0 -18 14 -32 32 -32h64c18 0 32 14 32 32zM1280 1088v288c0 18 -14 32 -32 32h-64c-18 0 -32 -14 -32 -32v-288c0 -18 14 -32 32 -32h64c18 0 32 14 32 32zM1664 1152v-1280c0 -70 -58 -128 -128 -128h-1408c-70 0 -128 58 -128 128v1280c0 70 58 128 128 128h128v96
+c0 88 72 160 160 160h64c88 0 160 -72 160 -160v-96h384v96c0 88 72 160 160 160h64c88 0 160 -72 160 -160v-96h128c70 0 128 -58 128 -128z" />
+    <glyph glyph-name="id-card" unicode="&#xf2c2;" horiz-adv-x="2048" 
+d="M896 324c0 132 -32 284 -164 284c-40 -40 -95 -64 -156 -64s-116 24 -156 64c-132 0 -164 -152 -164 -284c0 -73 48 -132 107 -132h426c59 0 107 59 107 132zM768 768c0 106 -86 192 -192 192s-192 -86 -192 -192s86 -192 192 -192s192 86 192 192zM1792 288v64
+c0 18 -14 32 -32 32h-704c-18 0 -32 -14 -32 -32v-64c0 -18 14 -32 32 -32h704c18 0 32 14 32 32zM1408 544v64c0 18 -14 32 -32 32h-320c-18 0 -32 -14 -32 -32v-64c0 -18 14 -32 32 -32h320c18 0 32 14 32 32zM1792 544v64c0 18 -14 32 -32 32h-192c-18 0 -32 -14 -32 -32
+v-64c0 -18 14 -32 32 -32h192c18 0 32 14 32 32zM1792 800v64c0 18 -14 32 -32 32h-704c-18 0 -32 -14 -32 -32v-64c0 -18 14 -32 32 -32h704c18 0 32 14 32 32zM128 1152h1792v96c0 18 -14 32 -32 32h-1728c-18 0 -32 -14 -32 -32v-96zM2048 1248v-1216
+c0 -88 -72 -160 -160 -160h-1728c-88 0 -160 72 -160 160v1216c0 88 72 160 160 160h1728c88 0 160 -72 160 -160z" />
+    <glyph glyph-name="globe-w" unicode="&#xf305;" 
+d="M768 1404c424 0 768 -344 768 -768s-344 -768 -768 -768s-768 344 -768 768s344 768 768 768zM924 1238v0c-3 0 -6 -1 -7 -1c-2 0 -153 -25 -208 -34s-156 -30 -201 -34s-46 0 -69 0c-7 0 -14 1 -21 2c-65 -43 -152 -132 -193 -198c0 -4 2 -7 6 -11c12 -12 46 0 69 0
+s59 8 69 0s1 -7 2 -9s-16 -108 -7 -144s10 -88 33 -129s110 -63 145 -98s106 -34 112 -71s-30 -79 -42 -102s-40 -40 -35 -69s46 -47 69 -70s47 -29 69 -69s25 -125 35 -173c2 -9 5 -22 7 -31c3 0 8 -1 11 -1c57 0 146 15 200 33c6 41 13 83 24 103c18 33 24 24 36 36
+s23 18 35 35s23 46 34 68s38 38 33 67s-47 47 -70 70s-35 50 -69 69s-94 24 -130 33s-163 15 -165 16s0 -8 -8 2s-3 50 -3 73s13 44 30 85c17 23 7 12 33 31c13 12 55 -57 73 -57s-4 117 7 128c46 46 163 125 163 174s-46 46 -69 69s-60 -39 -143 -39s97 131 109 143
+s30 22 35 35s0 23 0 34s14 28 9 32c-2 2 -5 2 -8 2zM1041 1214v0c-6 -14 -7 -31 -14 -45c-12 -23 -35 -43 -35 -69s23 -46 35 -69s1 -60 34 -69s69 46 104 69c21 14 50 26 72 40c-46 50 -134 114 -196 143z" />
+    <glyph glyph-name="github-alt" unicode="&#xf113;" horiz-adv-x="1664" 
+d="M640 320c0 -73 -38 -192 -128 -192s-128 119 -128 192s38 192 128 192s128 -119 128 -192zM1280 320c0 -73 -38 -192 -128 -192s-128 119 -128 192s38 192 128 192s128 -119 128 -192zM1440 320c0 153 -93 288 -256 288c-66 0 -129 -12 -195 -21
+c-52 -8 -104 -11 -157 -11s-105 3 -157 11c-65 9 -129 21 -195 21c-163 0 -256 -135 -256 -288c0 -306 280 -353 524 -353h168c244 0 524 47 524 353zM1664 496c0 -111 -11 -229 -61 -331c-132 -267 -495 -293 -755 -293c-264 0 -649 23 -786 293c-51 101 -62 220 -62 331
+c0 146 40 284 136 396c-18 55 -27 113 -27 170c0 75 17 150 51 218c158 0 259 -69 379 -163c101 24 205 35 309 35c94 0 189 -10 280 -32c119 93 220 160 376 160c34 -68 51 -143 51 -218c0 -57 -9 -114 -27 -168c96 -113 136 -252 136 -398z" />
+    <glyph glyph-name="sign-language" unicode="&#xf2a7;" horiz-adv-x="1664" 
+d="M831 863c21 0 41 -6 59 -18l222 -148c41 -27 78 -60 110 -97l146 -170c25 -29 36 -68 29 -106l-72 -413c-8 -42 -42 -74 -85 -79l-527 -56l-352 -32h-9c-52 0 -96 42 -96 96c0 50 42 90 92 96l260 32h-448c-55 0 -99 46 -96 101c3 52 49 91 101 91l442 1l-521 64
+c-54 6 -93 55 -85 110c8 48 52 80 100 80h10l481 -60l-351 94c-50 13 -88 59 -80 110c8 48 49 81 95 81c7 0 13 -1 20 -2l448 -96l217 -37c2 0 4 -1 6 -1c30 0 45 41 18 59l-186 125c-46 31 -57 93 -24 137c18 25 47 38 76 38zM761 661l186 -125l-218 37l-5 2l-36 38
+l-238 262c-2 2 -3 5 -5 7c-31 41 -24 101 19 134c40 31 97 21 132 -16l142 -147c-3 -3 -6 -5 -9 -8c-21 -29 -29 -64 -23 -99c6 -34 26 -65 55 -85zM1648 1115l15 -266c3 -49 -1 -99 -11 -147l-48 -219c-8 -38 -32 -69 -67 -87l-106 -54c1 40 -12 78 -39 109l-146 170
+c-34 39 -73 74 -117 103l-222 148c-22 15 -48 23 -76 23c-34 0 -65 -14 -88 -37l-235 312c-33 44 -23 106 23 137c43 30 102 16 134 -26l266 -352l-262 455c-28 47 -12 108 37 134c46 24 104 5 130 -40l241 -420l-136 337c-19 48 -6 106 40 130c49 26 109 5 132 -45
+l193 -415l101 -196c16 -31 63 -18 61 16l-12 224c-3 55 40 101 95 102c52 0 94 -44 97 -96z" />
+    <glyph glyph-name="play" unicode="&#xf04b;" horiz-adv-x="1407" 
+d="M1384 609l-1328 -738c-31 -17 -56 -2 -56 33v1472c0 35 25 50 56 33l1328 -738c31 -17 31 -45 0 -62z" />
+    <glyph glyph-name="heart-o" unicode="&#xf08a;" horiz-adv-x="1792" 
+d="M1664 940c0 281 -190 340 -350 340c-149 0 -317 -161 -369 -223c-24 -29 -74 -29 -98 0c-52 62 -220 223 -369 223c-160 0 -350 -59 -350 -340c0 -183 185 -353 187 -355l581 -560l580 559c3 3 188 173 188 356zM1792 940c0 -240 -220 -441 -229 -450l-623 -600
+c-12 -12 -28 -18 -44 -18s-32 6 -44 18l-624 602c-8 7 -228 208 -228 448c0 293 179 468 478 468c175 0 339 -138 418 -216c79 78 243 216 418 216c299 0 478 -175 478 -468z" />
+    <glyph glyph-name="weibo" unicode="&#xf18a;" horiz-adv-x="1792" 
+d="M675 252c28 46 13 99 -34 119c-45 19 -105 -1 -133 -45c-29 -45 -15 -98 30 -119c46 -21 108 -1 137 45zM769 373c10 18 4 38 -14 45c-18 6 -40 -2 -50 -19c-10 -18 -5 -37 13 -45c18 -7 41 1 51 19zM943 266c-60 -136 -234 -210 -382 -162c-143 46 -203 187 -141 314
+c62 124 221 194 362 158c147 -38 221 -176 161 -310zM1255 426c-19 195 -275 329 -572 300c-297 -30 -521 -211 -502 -406s275 -329 572 -300c297 30 521 211 502 406zM1563 422c0 -225 -324 -508 -811 -508c-372 0 -752 180 -752 477c0 155 98 334 267 503
+c226 226 489 328 588 229c44 -43 48 -119 20 -209c-14 -46 43 -20 43 -21c182 77 341 81 399 -2c31 -44 28 -106 0 -178c-13 -33 4 -38 29 -46c103 -32 217 -109 217 -245zM1489 1046c57 -63 73 -150 48 -226c-10 -31 -43 -48 -74 -38s-48 43 -38 74c12 38 4 80 -24 111
+s-69 43 -107 35c-32 -7 -64 13 -70 45c-7 32 13 63 45 70c78 17 163 -7 220 -71zM1670 1209c118 -130 149 -308 99 -464c-12 -36 -50 -56 -86 -44s-56 50 -45 86c36 111 14 238 -70 330c-84 93 -207 128 -321 104c-37 -8 -74 16 -82 53s16 73 53 81c161 34 334 -15 452 -146
+z" />
+    <glyph glyph-name="angle-down" unicode="&#xf107;" horiz-adv-x="998" 
+d="M998 800c0 -8 -4 -17 -10 -23l-466 -466c-6 -6 -15 -10 -23 -10s-17 4 -23 10l-466 466c-6 6 -10 15 -10 23s4 17 10 23l50 50c6 6 14 10 23 10c8 0 17 -4 23 -10l393 -393l393 393c6 6 15 10 23 10s17 -4 23 -10l50 -50c6 -6 10 -15 10 -23z" />
+    <glyph glyph-name="cc-jcb" unicode="&#xf24b;" horiz-adv-x="2304" 
+d="M1951 538c0 -36 -24 -62 -54 -68c-4 -1 -13 -2 -18 -2h-153v140h153c5 0 14 -1 18 -2c30 -6 54 -33 54 -68zM1933 751c0 -35 -24 -58 -53 -63c-3 -1 -10 -1 -15 -1h-139v129h139c5 0 12 -1 15 -1c29 -5 53 -29 53 -64zM728 587v308h-228v-308c0 -75 -51 -131 -143 -131
+c-78 0 -155 23 -229 59v-112c120 -33 272 -33 272 -33c254 0 328 97 328 217zM1442 403v113c-52 -27 -118 -53 -200 -59c-144 -11 -230 59 -230 183s86 194 230 183c82 -6 147 -31 200 -58v112c-107 27 -208 31 -208 31c-352 16 -452 -123 -452 -268s100 -284 452 -268
+c0 0 101 4 208 31zM2176 518c0 74 -66 122 -152 128v3c78 11 121 62 121 121c0 76 -63 120 -148 124c-6 0 -17 1 -26 1h-455v-510h491c97 0 169 52 169 133zM2304 1280v-1280c0 -70 -58 -128 -128 -128h-2048c-70 0 -128 58 -128 128v1280c0 70 58 128 128 128h2048
+c70 0 128 -58 128 -128z" />
+    <glyph glyph-name="compress" unicode="&#xf066;" horiz-adv-x="1510" 
+d="M755 576v-448c0 -35 -29 -64 -64 -64c-17 0 -33 7 -45 19l-144 144l-332 -332c-6 -6 -15 -10 -23 -10s-17 4 -23 10l-114 114c-6 6 -10 15 -10 23s4 17 10 23l332 332l-144 144c-12 12 -19 28 -19 45c0 35 29 64 64 64h448c35 0 64 -29 64 -64zM1510 1248
+c0 -8 -4 -17 -10 -23l-332 -332l144 -144c12 -12 19 -28 19 -45c0 -35 -29 -64 -64 -64h-448c-35 0 -64 29 -64 64v448c0 35 29 64 64 64c17 0 33 -7 45 -19l144 -144l332 332c6 6 15 10 23 10s17 -4 23 -10l114 -114c6 -6 10 -15 10 -23z" />
+    <glyph glyph-name="pencil-square-o" unicode="&#xf044;" horiz-adv-x="1784" 
+d="M888 352l116 116l-152 152l-116 -116v-56h96v-96h56zM1328 1072c-9 9 -24 8 -33 -1l-350 -350c-9 -9 -10 -24 -1 -33s24 -8 33 1l350 350c9 9 10 24 1 33zM1408 478v-190c0 -159 -129 -288 -288 -288h-832c-159 0 -288 129 -288 288v832c0 159 129 288 288 288h832
+c40 0 80 -8 117 -25c9 -4 16 -13 18 -23c2 -11 -1 -21 -9 -29l-49 -49c-9 -9 -21 -12 -32 -8c-15 4 -30 6 -45 6h-832c-88 0 -160 -72 -160 -160v-832c0 -88 72 -160 160 -160h832c88 0 160 72 160 160v126c0 8 3 16 9 22l64 64c10 10 23 12 35 7s20 -16 20 -29zM1312 1216
+l288 -288l-672 -672h-288v288zM1756 1084l-92 -92l-288 288l92 92c37 37 99 37 136 0l152 -152c37 -37 37 -99 0 -136z" />
+    <glyph glyph-name="google-plus-square" unicode="&#xf0d4;" 
+d="M917 631c0 25 -3 45 -6 64h-362v-132h217c-8 -56 -65 -165 -217 -165c-132 0 -239 108 -239 242s107 242 239 242c74 0 124 -31 153 -59l104 101c-67 62 -154 100 -257 100c-213 0 -384 -172 -384 -384s171 -384 384 -384c221 0 368 156 368 375zM1262 585h109v110h-109
+v110h-110v-110h-110v-110h110v-110h110v110zM1536 1120v-960c0 -159 -129 -288 -288 -288h-960c-159 0 -288 129 -288 288v960c0 159 129 288 288 288h960c159 0 288 -129 288 -288z" />
+    <glyph glyph-name="keybase" unicode="&#xf2f4;" horiz-adv-x="1547" 
+d="M146 -80c-13 28 -30 67 -39 87l-13 38l-44 -49l-44 -48l-4 92c-7 131 4 267 26 363c50 214 208 408 411 511l45 21l-10 33c-7 17 -14 55 -16 79l-4 46l-46 4c-70 7 -107 26 -131 76c-13 26 -13 31 -9 101c4 92 12 111 40 142c35 39 59 45 146 41c63 -4 77 -6 105 -19
+c17 -9 33 -18 35 -18s22 24 46 57l41 59l26 -15c15 -9 33 -20 42 -24l15 -9l-13 -33c-7 -17 -16 -48 -18 -63l-4 -31l37 -4c133 -13 234 -94 271 -216c11 -39 11 -116 0 -153c-11 -35 -11 -37 -2 -37c15 0 118 -51 159 -77c81 -52 175 -143 227 -222
+c98 -146 140 -306 123 -481c-9 -105 -29 -187 -64 -268l-13 -31h-109l26 52c28 57 50 136 61 206c7 48 10 179 3 203l-5 15l-28 -31c-70 -76 -172 -98 -310 -61c-118 31 -167 37 -278 37c-85 0 -113 -2 -159 -13c-127 -28 -217 -69 -341 -159c-46 -33 -83 -59 -85 -59
+s4 22 13 50s24 74 33 105l17 55l-19 -20c-11 -11 -42 -42 -68 -70l-46 -50l11 -42c13 -55 44 -122 77 -172c13 -22 24 -40 24 -42s-26 -2 -57 -2h-57zM338 449c105 111 190 200 192 200c2 -2 -8 -35 -19 -72c-72 -227 -87 -271 -85 -273c0 0 26 9 54 20
+c186 81 402 92 631 31c103 -26 142 -26 192 0c28 15 40 23 53 45c24 37 26 90 11 138c-37 105 -182 240 -317 299c-70 31 -74 30 -89 15l-14 -13l57 -69c31 -37 64 -79 68 -90c13 -26 15 -68 2 -94c-17 -37 -70 -64 -111 -55c-17 4 -25 3 -42 -10c-48 -35 -100 -26 -144 26
+c-35 39 -44 59 -46 98c0 20 -7 43 -11 52c-7 13 -8 28 -8 48l2 31l-29 7c-39 11 -85 32 -111 52c-13 9 -24 17 -28 17s-33 -13 -64 -28c-212 -109 -349 -312 -371 -541c-2 -22 -4 -51 -6 -62l-3 -19l24 24c11 11 107 112 212 223zM904 610c20 15 37 28 41 28
+c2 0 9 -6 16 -15c11 -17 30 -17 39 -2c7 11 7 13 -122 170c-76 94 -92 110 -103 110c-26 -2 -19 -23 22 -73l39 -48l-22 -17c-24 -22 -26 -26 -11 -39c11 -11 13 -9 35 6l24 15l16 -13c9 -7 13 -17 13 -19c0 -4 -17 -20 -37 -37c-20 -15 -35 -34 -35 -38c0 -7 10 -24 30 -48
+c7 -13 18 -8 55 20zM679 920c13 39 56 70 100 70c24 0 59 -20 83 -46l22 -26l20 24c55 61 61 147 17 221c-33 55 -94 87 -179 96c-46 4 -57 8 -81 32l-17 18l-9 -13c-17 -26 -54 -111 -65 -144c-15 -50 -9 -129 11 -168c20 -37 72 -88 87 -81c2 -2 7 6 11 17zM484 1217
+c4 11 16 39 27 61s19 44 19 51c0 20 -21 28 -80 32c-52 4 -57 3 -68 -8c-9 -9 -13 -20 -13 -35c0 -13 -3 -37 -5 -57c-4 -46 2 -54 48 -61c68 -4 65 -5 72 17zM417 1270c0 37 4 41 35 41h28v-61h-61v20h-2zM554 -4c-13 13 -17 22 -17 44c0 41 24 66 63 66
+c37 0 64 -27 64 -64c0 -39 -25 -61 -66 -63c-22 0 -31 4 -44 17zM976 -10c-50 39 -24 116 39 116c39 0 61 -25 63 -66c0 -24 -2 -31 -17 -44s-22 -17 -44 -17c-20 0 -32 4 -41 11z" />
+    <glyph glyph-name="angle-right" unicode="&#xf105;" horiz-adv-x="582" 
+d="M582 576c0 -8 -4 -17 -10 -23l-466 -466c-6 -6 -15 -10 -23 -10s-17 4 -23 10l-50 50c-6 6 -10 14 -10 23c0 8 4 17 10 23l393 393l-393 393c-6 6 -10 15 -10 23s4 17 10 23l50 50c6 6 15 10 23 10s17 -4 23 -10l466 -466c6 -6 10 -15 10 -23z" />
+    <glyph glyph-name="forumbee" unicode="&#xf211;" 
+d="M934 1386c-423 -161 -756 -499 -914 -923c-13 58 -20 117 -20 176c0 423 342 766 765 766c57 0 114 -7 169 -19zM1203 1267c62 -43 117 -95 164 -155c-518 -151 -923 -558 -1071 -1077c-59 46 -112 100 -155 162c149 514 549 918 1062 1070zM470 -67
+c154 475 526 849 999 1006c27 -62 45 -128 54 -195c-390 -160 -700 -472 -859 -863c-67 9 -132 26 -194 52zM1536 -125c-124 32 -247 70 -367 115c-88 -55 -187 -92 -290 -107c146 273 371 499 643 646c-14 -100 -49 -198 -101 -284c45 -121 83 -245 115 -370z" />
+    <glyph glyph-name="eject" unicode="&#xf052;" horiz-adv-x="1538" 
+d="M14 557l710 710c25 25 65 25 90 0l710 -710c25 -25 16 -45 -19 -45h-1472c-35 0 -44 20 -19 45zM1473 0h-1408c-35 0 -64 29 -64 64v256c0 35 29 64 64 64h1408c35 0 64 -29 64 -64v-256c0 -35 -29 -64 -64 -64z" />
+    <glyph glyph-name="mobile" unicode="&#xf10b;" horiz-adv-x="768" 
+d="M464 128c0 44 -36 80 -80 80s-80 -36 -80 -80s36 -80 80 -80s80 36 80 80zM672 288v704c0 17 -15 32 -32 32h-512c-17 0 -32 -15 -32 -32v-704c0 -17 15 -32 32 -32h512c17 0 32 15 32 32zM480 1136c0 9 -7 16 -16 16h-160c-9 0 -16 -7 -16 -16s7 -16 16 -16h160
+c9 0 16 7 16 16zM768 1152v-1024c0 -70 -58 -128 -128 -128h-512c-70 0 -128 58 -128 128v1024c0 70 58 128 128 128h512c70 0 128 -58 128 -128z" />
+    <glyph glyph-name="hourglass-end" unicode="&#xf253;" 
+d="M1408 1408c0 -370 -177 -638 -373 -768c196 -130 373 -398 373 -768h96c18 0 32 -14 32 -32v-64c0 -18 -14 -32 -32 -32h-1472c-18 0 -32 14 -32 32v64c0 18 14 32 32 32h96c0 370 177 638 373 768c-196 130 -373 398 -373 768h-96c-18 0 -32 14 -32 32v64
+c0 18 14 32 32 32h1472c18 0 32 -14 32 -32v-64c0 -18 -14 -32 -32 -32h-96zM874 700c202 76 406 343 406 708h-1024c0 -365 204 -632 406 -708c25 -9 42 -33 42 -60s-17 -51 -42 -60c-86 -32 -173 -100 -244 -196h700c-71 96 -158 164 -244 196c-25 9 -42 33 -42 60
+s17 51 42 60z" />
+    <glyph glyph-name="trash-o" unicode="&#xf014;" horiz-adv-x="1408" 
+d="M512 800v-576c0 -18 -14 -32 -32 -32h-64c-18 0 -32 14 -32 32v576c0 18 14 32 32 32h64c18 0 32 -14 32 -32zM768 800v-576c0 -18 -14 -32 -32 -32h-64c-18 0 -32 14 -32 32v576c0 18 14 32 32 32h64c18 0 32 -14 32 -32zM1024 800v-576c0 -18 -14 -32 -32 -32h-64
+c-18 0 -32 14 -32 32v576c0 18 14 32 32 32h64c18 0 32 -14 32 -32zM1152 76v948h-896v-948c0 -48 27 -76 32 -76h832c5 0 32 28 32 76zM480 1152h448l-48 117c-3 4 -12 10 -17 11h-317c-6 -1 -14 -7 -17 -11zM1408 1120v-64c0 -18 -14 -32 -32 -32h-96v-948
+c0 -110 -72 -204 -160 -204h-832c-88 0 -160 90 -160 200v952h-96c-18 0 -32 14 -32 32v64c0 18 14 32 32 32h309l70 167c20 49 80 89 133 89h320c53 0 113 -40 133 -89l70 -167h309c18 0 32 -14 32 -32z" />
+    <glyph glyph-name="star-o" unicode="&#xf006;" horiz-adv-x="1664" 
+d="M1137 532l306 297l-422 62l-189 382l-189 -382l-422 -62l306 -297l-73 -421l378 199l377 -199zM1664 889c0 -18 -13 -35 -26 -48l-363 -354l86 -500c1 -7 1 -13 1 -20c0 -27 -12 -50 -41 -50c-14 0 -28 5 -40 12l-449 236l-449 -236c-13 -7 -26 -12 -40 -12
+c-29 0 -42 24 -42 50c0 7 1 13 2 20l86 500l-364 354c-12 13 -25 30 -25 48c0 30 31 42 56 46l502 73l225 455c9 19 26 41 49 41s40 -22 49 -41l225 -455l502 -73c24 -4 56 -16 56 -46z" />
+    <glyph glyph-name="floppy-o" unicode="&#xf0c7;" 
+d="M384 0h768v384h-768v-384zM1280 0h128v896c0 19 -17 60 -30 73l-281 281c-14 14 -53 30 -73 30v-416c0 -53 -43 -96 -96 -96h-576c-53 0 -96 43 -96 96v416h-128v-1280h128v416c0 53 43 96 96 96h832c53 0 96 -43 96 -96v-416zM896 928v320c0 17 -15 32 -32 32h-192
+c-17 0 -32 -15 -32 -32v-320c0 -17 15 -32 32 -32h192c17 0 32 15 32 32zM1536 896v-928c0 -53 -43 -96 -96 -96h-1344c-53 0 -96 43 -96 96v1344c0 53 43 96 96 96h928c53 0 126 -30 164 -68l280 -280c38 -38 68 -111 68 -164z" />
+    <glyph glyph-name="file-powerpoint-o" unicode="&#xf1c4;" 
+d="M1468 1156c37 -37 68 -111 68 -164v-1152c0 -53 -43 -96 -96 -96h-1344c-53 0 -96 43 -96 96v1600c0 53 43 96 96 96h896c53 0 127 -31 164 -68zM1024 1400v-376h376c-6 17 -15 34 -22 41l-313 313c-7 7 -24 16 -41 22zM1408 -128v1024h-416c-53 0 -96 43 -96 96v416
+h-768v-1536h1280zM416 106h92v555h-92v107h368c46 0 92 -4 130 -19c83 -35 137 -119 137 -228s-56 -202 -146 -233c-36 -13 -75 -15 -118 -15h-137v-167h93v-106h-327v106zM769 386c31 0 57 5 78 15c42 21 62 64 62 120c0 53 -20 94 -56 115c-21 12 -48 18 -83 18h-120v-268
+h119z" />
+    <glyph glyph-name="cc-discover" unicode="&#xf1f2;" horiz-adv-x="2304" 
+d="M313 759c0 -32 -13 -63 -36 -84c-20 -18 -47 -26 -89 -26h-17v220h17c42 0 68 -7 89 -27c23 -20 36 -51 36 -83zM2089 824c0 -34 -22 -52 -64 -52h-19v101h20c41 0 63 -17 63 -49zM380 759c0 98 -73 167 -179 167h-95v-333h95c50 0 87 11 119 38c38 32 60 79 60 128z
+M410 593h65v333h-65v-333zM730 694c0 53 -22 77 -96 104c-39 14 -50 24 -50 42c0 21 20 37 48 37c20 0 36 -8 53 -27l34 44c-28 25 -62 37 -98 37c-59 0 -104 -41 -104 -95c0 -46 21 -70 82 -92c25 -9 38 -14 45 -19c13 -8 19 -20 19 -34c0 -27 -21 -47 -50 -47
+c-31 0 -56 15 -71 44l-42 -40c30 -44 66 -64 115 -64c68 0 115 45 115 110zM1008 604v77c-26 -26 -49 -37 -78 -37c-66 0 -112 48 -112 115c0 64 48 115 109 115c31 0 54 -11 81 -38v77c-28 14 -52 20 -80 20c-98 0 -177 -77 -177 -174c0 -98 77 -174 176 -174
+c28 0 52 5 81 19zM2240 0v527c-160 -100 -723 -420 -1633 -591h1569c35 0 64 29 64 64zM1389 757c0 100 -81 181 -181 181s-181 -81 -181 -181s81 -181 181 -181s181 81 181 181zM1541 584l144 342h-71l-90 -224l-89 224h-71l142 -342h35zM1714 593h184v56h-119v90h115v56
+h-115v74h119v57h-184v-333zM2105 593h80l-105 140c49 10 76 43 76 94c0 63 -43 99 -118 99h-97v-333h65v133h9zM2304 1274v-1268c0 -74 -59 -134 -132 -134h-2040c-73 0 -132 60 -132 134v1268c0 74 59 134 132 134h2040c73 0 132 -60 132 -134z" />
+    <glyph glyph-name="bomb" unicode="&#xf1e2;" horiz-adv-x="1792" 
+d="M571 947c-13 33 -50 48 -83 35c-144 -58 -260 -174 -318 -318c-13 -33 2 -70 35 -83c8 -3 16 -5 24 -5c26 0 49 15 60 40c45 112 135 202 247 247c33 14 49 51 35 84zM1513 1303l46 -46l-244 -243l68 -68c25 -25 25 -66 0 -91l-64 -64c56 -101 89 -218 89 -343
+c0 -389 -315 -704 -704 -704s-704 315 -704 704s315 704 704 704c125 0 242 -33 343 -89l64 64c25 25 66 25 91 0l68 -68zM1521 1359c-6 -6 -14 -10 -22 -10c-9 0 -17 4 -23 10l-91 90c-12 13 -12 33 0 46c13 12 33 12 46 0l90 -91c13 -12 13 -33 0 -45zM1751 1129
+c-7 -6 -15 -9 -23 -9s-16 3 -23 9l-90 91c-13 12 -13 33 0 45c12 13 33 13 45 0l91 -90c12 -13 12 -33 0 -46zM1792 1312c0 -18 -14 -32 -32 -32h-96c-18 0 -32 14 -32 32s14 32 32 32h96c18 0 32 -14 32 -32zM1600 1504v-96c0 -18 -14 -32 -32 -32s-32 14 -32 32v96
+c0 18 14 32 32 32s32 -14 32 -32zM1751 1449l-91 -90c-6 -6 -14 -10 -22 -10c-9 0 -17 4 -23 10c-13 12 -13 33 0 45l90 91c13 12 33 12 46 0c12 -13 12 -33 0 -46z" />
+    <glyph glyph-name="random" unicode="&#xf074;" horiz-adv-x="1792" 
+d="M666 1055c-56 -86 -97 -179 -137 -273c-58 121 -122 242 -273 242h-224c-18 0 -32 14 -32 32v192c0 18 14 32 32 32h224c178 0 309 -83 410 -225zM1792 256c0 -8 -3 -17 -9 -23l-320 -320c-6 -6 -15 -9 -23 -9c-17 0 -32 15 -32 32v192c-297 0 -480 -35 -665 225
+c55 86 96 179 136 273c58 -121 122 -242 273 -242h256v192c0 18 14 32 32 32c9 0 17 -4 24 -10l319 -319c6 -6 9 -15 9 -23zM1792 1152c0 -8 -3 -17 -9 -23l-320 -320c-6 -6 -15 -9 -23 -9c-17 0 -32 14 -32 32v192h-256c-133 0 -196 -91 -252 -199
+c-29 -56 -54 -114 -78 -171c-111 -258 -241 -526 -566 -526h-224c-18 0 -32 14 -32 32v192c0 18 14 32 32 32h224c133 0 196 91 252 199c29 56 54 114 78 171c111 258 241 526 566 526h256v192c0 18 14 32 32 32c9 0 17 -4 24 -10l319 -319c6 -6 9 -15 9 -23z" />
+    <glyph glyph-name="fire-extinguisher" unicode="&#xf134;" horiz-adv-x="1408" 
+d="M512 1344c0 35 -29 64 -64 64s-64 -29 -64 -64s29 -64 64 -64s64 29 64 64zM1408 1376v-320c0 -10 -4 -19 -12 -25c-6 -5 -13 -7 -20 -7c-2 0 -4 0 -7 1l-448 96c-14 3 -25 16 -25 31h-256v-102c146 -30 256 -159 256 -314v-800c0 -35 -29 -64 -64 -64h-512
+c-35 0 -64 29 -64 64v800c0 143 94 265 224 305v111h-32c-212 0 -326 -219 -327 -221c-11 -22 -34 -35 -57 -35c-10 0 -20 2 -29 7c-31 16 -44 54 -28 86c5 10 105 204 306 269c-15 25 -25 54 -25 86c0 88 72 160 160 160s160 -72 160 -160c0 -23 -5 -44 -14 -64h302
+c0 15 11 28 25 31l448 96c3 1 5 1 7 1c7 0 14 -2 20 -7c8 -6 12 -15 12 -25z" />
+    <glyph glyph-name="gnu-social" unicode="&#xf2e7;" horiz-adv-x="1513" 
+d="M218 1404v0h1077c121 0 218 -97 218 -218v-873c0 -121 -97 -218 -218 -218h-118c-80 -349 -645 -351 -645 -351s334 104 335 351h-649c-121 0 -218 97 -218 218v873c0 121 97 218 218 218zM532 1229c-35 -5 -114 -89 -114 -150c0 -49 -3 -127 70 -167
+c-69 -67 -82 -163 -81 -247c2 -154 67 -382 357 -397s352 214 352 360h-305l50 -134l89 5s17 -107 -174 -100c-122 5 -200 68 -200 249s22 211 193 218s203 -139 203 -139l142 -3s-11 107 -93 188c73 40 72 118 69 167c-2 47 -102 169 -125 148s39 -41 34 -143
+c-2 -45 11 -79 -75 -79c-57 0 -33 51 -105 51c-43 0 -59 -28 -65 -50c-6 22 -21 50 -64 50c-72 0 -49 -51 -106 -51c-86 0 -72 34 -74 79c-5 102 56 122 33 143c-1 1 -3 2 -5 2h-6z" />
+    <glyph glyph-name="pencil-square" unicode="&#xf14b;" 
+d="M404 428l152 -152l-52 -52h-56v96h-96v56zM818 818c8 -7 6 -21 -3 -30l-291 -291c-9 -9 -23 -11 -30 -3c-8 7 -6 21 3 30l291 291c9 9 23 11 30 3zM544 128l544 544l-288 288l-544 -544v-288h288zM1152 736l92 92c37 37 37 99 0 136l-152 152c-37 37 -99 37 -136 0
+l-92 -92zM1536 1120v-960c0 -159 -129 -288 -288 -288h-960c-159 0 -288 129 -288 288v960c0 159 129 288 288 288h960c159 0 288 -129 288 -288z" />
+    <glyph glyph-name="reddit-square" unicode="&#xf1a2;" 
+d="M939 407c7 -7 7 -19 0 -26c-49 -49 -143 -53 -171 -53s-122 4 -171 53c-7 7 -7 19 0 26c7 8 19 8 26 0c31 -31 98 -42 145 -42s114 11 145 42c7 8 19 8 26 0zM676 563c0 -42 -35 -77 -77 -77s-77 35 -77 77c0 43 35 77 77 77s77 -34 77 -77zM1014 563
+c0 -42 -35 -77 -77 -77s-77 35 -77 77c0 43 35 77 77 77s77 -34 77 -77zM1229 666c0 56 -46 102 -103 102c-28 0 -54 -12 -73 -31c-70 48 -164 79 -267 82l54 243l171 -39c1 -42 35 -76 77 -76s77 35 77 77s-35 77 -77 77c-30 0 -56 -17 -69 -43l-189 42
+c-10 3 -19 -4 -21 -13l-60 -268c-103 -4 -196 -35 -265 -83c-19 20 -45 32 -74 32c-57 0 -103 -46 -103 -102c0 -41 24 -76 58 -93c-3 -15 -5 -32 -5 -48c0 -163 183 -295 409 -295s410 132 410 295c0 17 -2 33 -6 49c33 17 56 52 56 92zM1536 1120v-960
+c0 -159 -129 -288 -288 -288h-960c-159 0 -288 129 -288 288v960c0 159 129 288 288 288h960c159 0 288 -129 288 -288z" />
+    <glyph glyph-name="arrow-circle-o-down" unicode="&#xf01a;" 
+d="M1120 608c0 -9 -4 -17 -10 -24l-319 -319c-7 -6 -15 -9 -23 -9s-16 3 -23 9l-320 320c-9 10 -12 23 -7 35s17 20 30 20h192v352c0 18 14 32 32 32h192c18 0 32 -14 32 -32v-352h192c18 0 32 -14 32 -32zM768 1184c-300 0 -544 -244 -544 -544s244 -544 544 -544
+s544 244 544 544s-244 544 -544 544zM1536 640c0 -424 -344 -768 -768 -768s-768 344 -768 768s344 768 768 768s768 -344 768 -768z" />
+    <glyph glyph-name="caret-left" unicode="&#xf0d9;" horiz-adv-x="576" 
+d="M576 1088v-896c0 -35 -29 -64 -64 -64c-17 0 -33 7 -45 19l-448 448c-12 12 -19 28 -19 45s7 33 19 45l448 448c12 12 28 19 45 19c35 0 64 -29 64 -64z" />
+    <glyph glyph-name="camera-retro" unicode="&#xf083;" horiz-adv-x="1792" 
+d="M928 704c0 18 -14 32 -32 32c-88 0 -160 -72 -160 -160c0 -18 14 -32 32 -32s32 14 32 32c0 53 43 96 96 96c18 0 32 14 32 32zM1152 574c0 -141 -115 -256 -256 -256s-256 115 -256 256s115 256 256 256s256 -115 256 -256zM128 0h1536v128h-1536v-128zM1280 574
+c0 212 -172 384 -384 384s-384 -172 -384 -384s172 -384 384 -384s384 172 384 384zM256 1216h384v128h-384v-128zM128 1024h1536v256h-828l-64 -128h-644v-128zM1792 1280v-1280c0 -71 -57 -128 -128 -128h-1536c-71 0 -128 57 -128 128v1280c0 71 57 128 128 128h1536
+c71 0 128 -57 128 -128z" />
+    <glyph glyph-name="thumbs-o-up" unicode="&#xf087;" 
+d="M256 192c0 35 -29 64 -64 64s-64 -29 -64 -64s29 -64 64 -64s64 29 64 64zM1408 768c0 68 -61 128 -128 128h-352c0 117 96 202 96 320c0 117 -23 192 -160 192c-64 -65 -31 -218 -128 -320c-28 -29 -52 -60 -77 -91c-45 -58 -164 -229 -243 -229h-32v-640h32
+c56 0 148 -36 202 -55c110 -38 224 -73 342 -73h121c113 0 192 45 192 167c0 19 -2 38 -5 56c42 23 65 80 65 126c0 24 -6 48 -18 69c34 32 53 72 53 119c0 32 -14 79 -35 103c47 1 75 91 75 128zM1536 769c0 -58 -17 -115 -49 -163c6 -22 9 -46 9 -69
+c0 -50 -13 -100 -38 -144c2 -14 3 -29 3 -43c0 -64 -21 -128 -60 -178c2 -189 -127 -300 -312 -300h-129c-142 0 -274 42 -406 88c-29 10 -110 40 -138 40h-288c-71 0 -128 57 -128 128v640c0 71 57 128 128 128h274c39 26 107 116 137 155c34 44 69 87 107 128
+c60 64 28 222 128 320c24 23 56 37 90 37c104 0 204 -37 253 -134c31 -61 35 -119 35 -186c0 -70 -18 -130 -48 -192h176c138 0 256 -117 256 -255z" />
+    <glyph glyph-name="product-hunt" unicode="&#xf288;" horiz-adv-x="1792" 
+d="M1150 774c0 -74 -60 -134 -135 -134h-253v269h253c75 0 135 -60 135 -135zM1329 774c0 174 -140 314 -314 314h-433v-896h180v269h253c174 0 314 140 314 313zM1792 640c0 -495 -401 -896 -896 -896s-896 401 -896 896s401 896 896 896s896 -401 896 -896z" />
+    <glyph glyph-name="etsy" unicode="&#xf2d7;" 
+d="M518 1353v-655c232 -2 354 10 354 10c94 3 108 27 130 119l33 142h103l-14 -322l7 -319h-103l-29 127c-21 95 -62 118 -129 119c0 0 -86 8 -352 8v-556c0 -104 57 -153 177 -153h357c120 0 228 12 302 183l93 216h89c-7 -43 -55 -440 -62 -528c-329 12 -470 12 -470 12
+h-628l-376 -12v102l127 25c89 17 116 43 117 116c6 242 8 643 8 643s3 402 -8 645c-3 83 -28 103 -117 120l-127 24v102l376 -12h702s139 0 374 27c-14 -153 -31 -506 -31 -506h-93l-32 124c-39 155 -91 238 -187 238h-548c-41 0 -43 -14 -43 -39z" />
+    <glyph glyph-name="copyright" unicode="&#xf1f9;" 
+d="M1150 462v-109c0 -141 -225 -193 -366 -193c-274 0 -480 209 -480 485c0 271 204 475 475 475c99 0 358 -35 358 -194v-109c0 -9 -7 -16 -16 -16h-118c-9 0 -16 7 -16 16v70c0 63 -121 92 -203 92c-187 0 -317 -135 -317 -329c0 -201 136 -348 325 -348
+c72 0 208 27 208 90v70c0 9 7 16 15 16h119c8 0 16 -7 16 -16zM768 1280c-353 0 -640 -287 -640 -640s287 -640 640 -640s640 287 640 640s-287 640 -640 640zM1536 640c0 -424 -344 -768 -768 -768s-768 344 -768 768s344 768 768 768s768 -344 768 -768z" />
+    <glyph glyph-name="pleroma" unicode="&#xf324;" horiz-adv-x="961" 
+d="M120 1408h262v-1536h-382v1416c0 66 54 120 120 120zM575 1408h386v-648c0 -66 -53 -120 -119 -120v0h-267v768zM575 254h386v-262c0 -66 -53 -120 -119 -120v0h-267v382z" />
+    <glyph glyph-name="terminal" unicode="&#xf120;" horiz-adv-x="1651" 
+d="M572 553l-466 -466c-13 -13 -33 -13 -46 0l-50 50c-13 13 -13 33 0 46l393 393l-393 393c-13 13 -13 33 0 46l50 50c13 13 33 13 46 0l466 -466c13 -13 13 -33 0 -46zM1651 96v-64c0 -18 -14 -32 -32 -32h-960c-18 0 -32 14 -32 32v64c0 18 14 32 32 32h960
+c18 0 32 -14 32 -32z" />
+    <glyph glyph-name="twitter-square" unicode="&#xf081;" 
+d="M1280 926c-38 -17 -78 -28 -121 -34c44 26 77 68 93 117c-41 -24 -86 -42 -134 -51c-38 41 -93 66 -153 66c-116 0 -210 -94 -210 -210c0 -16 1 -33 5 -48c-175 9 -330 92 -434 220c-18 -31 -29 -68 -29 -106c0 -73 34 -137 91 -175c-35 1 -68 11 -100 26v-2
+c0 -102 77 -187 173 -206c-18 -5 -32 -8 -51 -8c-13 0 -26 2 -39 4c27 -83 104 -144 196 -146c-72 -56 -162 -90 -261 -90c-17 0 -34 1 -50 3c93 -59 203 -94 322 -94c386 0 598 320 598 598c0 9 0 18 -1 27c41 29 77 66 105 109zM1536 1120v-960
+c0 -159 -129 -288 -288 -288h-960c-159 0 -288 129 -288 288v960c0 159 129 288 288 288h960c159 0 288 -129 288 -288z" />
+    <glyph glyph-name="shopping-bag" unicode="&#xf290;" horiz-adv-x="1793" 
+d="M1757 128l35 -313c2 -18 -4 -36 -16 -50c-12 -13 -30 -21 -48 -21h-1664c-18 0 -36 8 -48 21c-12 14 -18 32 -16 50l35 313h1722zM1664 967l86 -775h-1708l86 775c4 32 31 57 64 57h256v-128c0 -71 57 -128 128 -128s128 57 128 128v128h384v-128c0 -71 57 -128 128 -128
+s128 57 128 128v128h256c33 0 60 -25 64 -57zM1280 1152v-256c0 -35 -29 -64 -64 -64s-64 29 -64 64v256c0 141 -115 256 -256 256s-256 -115 -256 -256v-256c0 -35 -29 -64 -64 -64s-64 29 -64 64v256c0 212 172 384 384 384s384 -172 384 -384z" />
+    <glyph glyph-name="stop-circle" unicode="&#xf28d;" 
+d="M1088 352v576c0 18 -14 32 -32 32h-576c-18 0 -32 -14 -32 -32v-576c0 -18 14 -32 32 -32h576c18 0 32 14 32 32zM1536 640c0 -424 -344 -768 -768 -768s-768 344 -768 768s344 768 768 768s768 -344 768 -768z" />
+    <glyph glyph-name="telegram" unicode="&#xf2c6;" horiz-adv-x="1792" 
+d="M1189 229l147 693c13 61 -22 85 -62 70l-864 -333c-59 -23 -58 -56 -10 -71l221 -69l513 323c24 16 46 7 28 -9l-415 -375l-16 -228c23 0 33 10 45 22l108 104l224 -165c41 -23 70 -11 81 38zM1792 640c0 -495 -401 -896 -896 -896s-896 401 -896 896s401 896 896 896
+s896 -401 896 -896z" />
+    <glyph glyph-name="circle" unicode="&#xf111;" 
+d="M1536 640c0 -424 -344 -768 -768 -768s-768 344 -768 768s344 768 768 768s768 -344 768 -768z" />
+    <glyph glyph-name="columns" unicode="&#xf0db;" horiz-adv-x="1664" 
+d="M160 0h608v1152h-640v-1120c0 -17 15 -32 32 -32zM1536 32v1120h-640v-1152h608c17 0 32 15 32 32zM1664 1248v-1216c0 -88 -72 -160 -160 -160h-1344c-88 0 -160 72 -160 160v1216c0 88 72 160 160 160h1344c88 0 160 -72 160 -160z" />
+    <glyph glyph-name="zotero" unicode="&#xf309;" horiz-adv-x="1330" 
+d="M662 -127l-662 310v924l662 301l668 -301v-924zM314 152h723v221l-63 78h-275l338 379v218l-63 78h-601l-59 -82v-214h377l-352 -379l-25 -97v-202z" />
+    <glyph glyph-name="sign-out" unicode="&#xf08b;" horiz-adv-x="1568" 
+d="M640 96c0 -28 13 -96 -32 -96h-320c-159 0 -288 129 -288 288v704c0 159 129 288 288 288h320c17 0 32 -15 32 -32c0 -28 13 -96 -32 -96h-320c-88 0 -160 -72 -160 -160v-704c0 -88 72 -160 160 -160h288c25 0 64 5 64 -32zM1568 640c0 -17 -7 -33 -19 -45l-544 -544
+c-12 -12 -28 -19 -45 -19c-35 0 -64 29 -64 64v288h-448c-35 0 -64 29 -64 64v384c0 35 29 64 64 64h448v288c0 35 29 64 64 64c17 0 33 -7 45 -19l544 -544c12 -12 19 -28 19 -45z" />
+    <glyph glyph-name="cube" unicode="&#xf1b2;" horiz-adv-x="1664" 
+d="M896 -93l640 349v636l-640 -233v-752zM832 772l698 254l-698 254l-698 -254zM1664 1024v-768c0 -47 -26 -90 -67 -112l-704 -384c-19 -11 -40 -16 -61 -16s-42 5 -61 16l-704 384c-41 22 -67 65 -67 112v768c0 54 34 102 84 120l704 256c14 5 29 8 44 8s30 -3 44 -8
+l704 -256c50 -18 84 -66 84 -120z" />
+    <glyph glyph-name="mars-stroke-v" unicode="&#xf22a;" horiz-adv-x="1152" 
+d="M640 892c288 -32 512 -276 512 -572c0 -340 -294 -611 -642 -572c-270 30 -486 253 -508 525c-25 317 207 586 510 619v132h-160c-18 0 -32 14 -32 32v64c0 18 14 32 32 32h160v165l-92 -92c-13 -12 -33 -12 -45 0l-46 46c-12 12 -12 32 0 45l202 201c25 25 65 25 90 0
+l202 -201c12 -13 12 -33 0 -45l-46 -46c-12 -12 -32 -12 -45 0l-92 92v-165h160c18 0 32 -14 32 -32v-64c0 -18 -14 -32 -32 -32h-160v-132zM576 -128c247 0 448 201 448 448s-201 448 -448 448s-448 -201 -448 -448s201 -448 448 -448z" />
+    <glyph glyph-name="file-text" unicode="&#xf15c;" 
+d="M1468 1060c10 -10 19 -22 28 -36h-472v472c14 -9 26 -18 36 -28zM992 896h544v-1056c0 -53 -43 -96 -96 -96h-1344c-53 0 -96 43 -96 96v1600c0 53 43 96 96 96h800v-544c0 -53 43 -96 96 -96zM1152 160v64c0 18 -14 32 -32 32h-704c-18 0 -32 -14 -32 -32v-64
+c0 -18 14 -32 32 -32h704c18 0 32 14 32 32zM1152 416v64c0 18 -14 32 -32 32h-704c-18 0 -32 -14 -32 -32v-64c0 -18 14 -32 32 -32h704c18 0 32 14 32 32zM1152 672v64c0 18 -14 32 -32 32h-704c-18 0 -32 -14 -32 -32v-64c0 -18 14 -32 32 -32h704c18 0 32 14 32 32z" />
+    <glyph glyph-name="amazon" unicode="&#xf270;" horiz-adv-x="1736" 
+d="M1523 60c30 15 53 -8 22 -48s-280 -268 -698 -268s-738 286 -836 404c-27 31 4 45 22 33c293 -178 751 -471 1490 -121zM1730 175c15 -20 0 -108 -26 -172c-26 -63 -64 -107 -85 -124c-22 -18 -38 -11 -26 15s77 186 51 220c-26 33 -148 17 -192 13c-43 -4 -52 -8 -56 1
+c-9 23 87 62 150 70c63 7 164 3 184 -23zM1336 618c0 -110 129 -211 129 -211l-227 -224c-89 84 -156 154 -156 154c-10 10 -18 22 -25 33c-181 -283 -734 -265 -734 173c0 408 483 463 678 470v127c0 27 10 150 -142 150c0 0 -152 0 -217 -198l-294 27
+c0 197 187 417 539 417c351 0 449 -228 449 -329v-589zM664 597c0 -203 337 -251 337 69v162c-135 -4 -337 -42 -337 -231z" />
+    <glyph glyph-name="smile-o" unicode="&#xf118;" 
+d="M1134 461c-50 -161 -197 -269 -366 -269s-316 108 -366 269c-11 34 8 69 42 80c33 11 69 -8 80 -42c33 -107 132 -179 244 -179s211 72 244 179c11 34 47 53 81 42c33 -11 52 -46 41 -80zM640 896c0 -71 -57 -128 -128 -128s-128 57 -128 128s57 128 128 128
+s128 -57 128 -128zM1152 896c0 -71 -57 -128 -128 -128s-128 57 -128 128s57 128 128 128s128 -57 128 -128zM1408 640c0 353 -287 640 -640 640s-640 -287 -640 -640s287 -640 640 -640s640 287 640 640zM1536 640c0 -424 -344 -768 -768 -768s-768 344 -768 768
+s344 768 768 768s768 -344 768 -768z" />
+    <glyph glyph-name="compass" unicode="&#xf14e;" 
+d="M640 448l256 128l-256 128v-256zM1024 1039v-542l-512 -256v542zM1312 640c0 300 -244 544 -544 544s-544 -244 -544 -544s244 -544 544 -544s544 244 544 544zM1536 640c0 -424 -344 -768 -768 -768s-768 344 -768 768s344 768 768 768s768 -344 768 -768z" />
+    <glyph glyph-name="address-book" unicode="&#xf2b9;" horiz-adv-x="1664" 
+d="M1201 298c0 177 -43 374 -221 374c-55 -32 -130 -87 -212 -87s-157 55 -212 87c-178 0 -221 -197 -221 -374c0 -99 65 -170 145 -170h576c80 0 145 71 145 170zM1028 892c0 144 -117 260 -260 260s-260 -116 -260 -260c0 -143 117 -259 260 -259s260 116 260 259z
+M1664 352v-192c0 -18 -14 -32 -32 -32h-96v-224c0 -88 -72 -160 -160 -160h-1216c-88 0 -160 72 -160 160v1472c0 88 72 160 160 160h1216c88 0 160 -72 160 -160v-224h96c18 0 32 -14 32 -32v-192c0 -18 -14 -32 -32 -32h-96v-128h96c18 0 32 -14 32 -32v-192
+c0 -18 -14 -32 -32 -32h-96v-128h96c18 0 32 -14 32 -32z" />
+    <glyph glyph-name="list-ol" unicode="&#xf0cb;" horiz-adv-x="1777" 
+d="M366 -84c0 -110 -86 -172 -190 -172c-63 0 -127 21 -172 66l57 88c27 -25 68 -45 106 -45c35 0 72 17 72 57c0 56 -64 59 -105 56l-26 56c36 46 69 97 112 136v1c-32 0 -65 -2 -97 -2v-53h-106v152h333v-88l-95 -115c67 -16 111 -68 111 -137zM368 543v-159h-362
+c-3 18 -6 36 -6 54c0 185 226 213 226 297c0 34 -21 52 -54 52c-35 0 -64 -30 -81 -58l-85 59c33 69 101 108 177 108c93 0 173 -55 173 -154c0 -148 -217 -181 -220 -259h127v60h105zM1777 224v-192c0 -17 -15 -32 -32 -32h-1216c-18 0 -32 15 -32 32v192c0 18 14 32 32 32
+h1216c17 0 32 -14 32 -32zM369 1123v-99h-335v99h107c0 81 1 162 1 243v12h-2c-11 -22 -31 -37 -50 -54l-71 76l136 127h106v-404h108zM1777 736v-192c0 -17 -15 -32 -32 -32h-1216c-18 0 -32 15 -32 32v192c0 18 14 32 32 32h1216c17 0 32 -14 32 -32zM1777 1248v-192
+c0 -17 -15 -32 -32 -32h-1216c-18 0 -32 15 -32 32v192c0 17 14 32 32 32h1216c17 0 32 -15 32 -32z" />
+    <glyph glyph-name="stumbleupon-circle" unicode="&#xf1a3;" 
+d="M866 697l90 27v62c0 106 -90 191 -196 191s-196 -84 -196 -190v-283c0 -26 -21 -47 -47 -47s-46 21 -46 47v120h-151v-122c0 -109 88 -196 197 -196c107 0 196 86 196 193v280c0 26 21 47 47 47c25 0 46 -21 46 -47v-54zM1199 502v122h-150v-126c0 -26 -21 -47 -47 -47
+c-25 0 -46 21 -46 47v123l-90 -26l-60 28v-123c0 -107 89 -194 197 -194s196 87 196 196zM1536 640c0 -424 -344 -768 -768 -768s-768 344 -768 768s344 768 768 768s768 -344 768 -768z" />
+    <glyph glyph-name="slack" unicode="&#xf198;" 
+d="M837 508l-205 69l66 197l205 -68zM979 1344c528 -158 651 -387 493 -915s-387 -651 -915 -493s-651 387 -493 915s387 651 915 493zM1256 671v0c13 41 -9 87 -51 101l-99 34l34 103c13 42 -8 88 -50 101c-47 13 -88 -14 -101 -51l-34 -103l-206 69l35 103
+c13 42 -9 88 -51 101c-47 13 -87 -13 -100 -50l-35 -104c-100 33 -111 39 -126 37c-32 -1 -63 -22 -74 -54c-13 -42 8 -88 50 -101l100 -33l-66 -198c-100 33 -112 39 -127 37c-32 -1 -63 -23 -74 -55c-13 -42 9 -87 51 -100l99 -34l-34 -103c-13 -42 8 -88 50 -101
+s88 9 101 51l34 103l206 -69l-35 -103c-13 -42 9 -88 51 -101s87 8 100 50l35 104l99 -34c42 -13 88 9 101 51s-8 88 -50 101l-100 33l66 198l100 -34c42 -13 88 9 101 51z" />
+    <glyph glyph-name="qq" unicode="&#xf1d6;" horiz-adv-x="1756" 
+d="M252 730c-7 17 -8 34 -8 52c0 28 18 73 35 94c-1 26 10 79 30 96c0 185 143 418 310 498c103 49 211 66 324 66c88 0 184 -21 266 -55c235 -99 288 -283 338 -518l1 -5c29 -44 55 -96 55 -150c0 -27 -18 -54 -18 -78c0 -2 6 -10 7 -12c86 -127 164 -265 164 -423
+c0 -35 -19 -157 -75 -157c-39 0 -82 95 -96 121c-1 1 -2 1 -3 1l-5 -4c-32 -83 -67 -161 -132 -223c57 -55 149 -50 166 -145c-5 -11 -3 -23 -11 -34c-57 -86 -210 -97 -302 -97c-122 0 -221 32 -336 66c-24 7 -60 3 -86 6c-61 -67 -210 -85 -296 -85c-76 0 -370 5 -370 135
+c0 56 12 72 51 108c31 6 54 23 90 25c5 0 9 1 14 2c1 1 2 1 2 4l-2 3c-69 16 -166 190 -181 262l-5 3c-7 0 -10 -15 -12 -20c-22 -51 -74 -106 -132 -112h-1c-8 0 -5 8 -11 10c-14 33 -23 63 -23 100c0 200 96 348 252 466z" />
+    <glyph glyph-name="audio-description" unicode="&#xf29e;" horiz-adv-x="2304" 
+d="M504 542h171l-1 265zM1530 641c0 111 -64 193 -197 193h-54v-388h52c125 0 199 91 199 195zM956 1018l1 -756c0 -19 -15 -34 -33 -34h-216c-18 0 -33 15 -33 34v62h-291l-55 -81c-6 -9 -17 -15 -28 -15h-267c-28 0 -44 31 -27 53l556 757c6 9 16 14 27 14h332
+c19 0 34 -15 34 -34zM1783 641c0 -263 -192 -413 -450 -413h-270c-19 0 -34 15 -34 34v756c0 19 15 34 34 34h268c260 0 452 -148 452 -411zM1939 640c0 0 4 -260 -148 -413h-51c136 162 139 414 139 414s2 198 -135 410h43c148 -169 152 -411 152 -411zM2123 640
+c0 0 4 -260 -149 -413h-51c136 162 139 414 139 414s2 198 -134 410h43c148 -169 152 -411 152 -411zM2304 640c0 0 4 -260 -148 -413h-51c135 162 138 414 138 414s2 198 -134 410h43c148 -169 152 -411 152 -411z" />
+    <glyph glyph-name="stop-circle-o" unicode="&#xf28e;" 
+d="M768 1408c424 0 768 -344 768 -768s-344 -768 -768 -768s-768 344 -768 768s344 768 768 768zM768 96c300 0 544 244 544 544s-244 544 -544 544s-544 -244 -544 -544s244 -544 544 -544zM480 320c-18 0 -32 14 -32 32v576c0 18 14 32 32 32h576c18 0 32 -14 32 -32v-576
+c0 -18 -14 -32 -32 -32h-576z" />
+    <glyph glyph-name="grav" unicode="&#xf2d6;" horiz-adv-x="1794" 
+d="M1291 1060c-32 36 -84 -25 -56 -58c27 -33 116 -9 56 58zM895 814c-11 -11 -28 -11 -38 0c-11 10 -11 27 0 37c10 11 27 11 38 0c10 -10 10 -27 0 -37zM1060 740l-35 -35c-16 -17 -43 -17 -60 0l-38 38c-16 17 -16 43 0 60l35 35c16 16 43 16 60 0l38 -39
+c16 -16 16 -43 0 -59zM951 870c-10 -10 -27 -10 -38 0c-10 11 -10 28 0 38c11 11 28 11 38 0c11 -10 11 -27 0 -38zM1354 968c-45 -85 -163 -120 -235 -69c-72 52 -122 156 -43 246c78 90 147 62 216 -3c43 -41 106 -90 62 -174zM1555 486c9 58 -74 60 -92 93
+c-49 87 -100 133 -197 110c42 29 85 22 85 22c1 23 0 47 -34 90c14 45 1 81 1 81c56 31 97 88 105 156c13 112 -68 214 -180 227c-80 9 -158 -28 -196 -93c-84 -145 5 -256 81 -294c-52 5 -124 43 -145 124c-24 93 10 180 32 222c0 0 -16 21 -29 32c0 0 -50 0 -89 -19
+c43 55 91 52 91 52c0 23 -2 54 -13 78c-20 41 -90 47 -117 -15c1 3 2 5 4 7c-18 -43 -4 -202 61 -315c-9 -5 -33 -22 -47 -36c-78 -35 -203 -218 -203 -218c-102 -39 -280 -184 -256 -288c1 -11 5 -20 11 -27c-10 -8 -20 -18 -30 -30c-43 -50 -19 -127 64 -88
+c57 26 108 73 132 110c0 0 -21 18 -60 16c100 24 125 34 168 33c29 -14 29 124 29 124c0 53 -8 112 -40 150c45 -44 105 -118 101 -219c-3 -66 -55 -83 -55 -83c-33 -60 -156 -238 -110 -383c0 0 -35 54 -37 80c-63 -70 -169 -189 -90 -233c96 -53 394 320 457 514
+c125 75 200 171 231 235c80 -159 346 -343 367 -215zM1794 640c0 -495 -402 -896 -897 -896s-897 401 -897 896s402 896 897 896s897 -401 897 -896z" />
+    <glyph glyph-name="mars-stroke-h" unicode="&#xf22b;" horiz-adv-x="1919" 
+d="M1901 621c25 -25 25 -65 0 -90l-294 -294c-12 -13 -33 -13 -45 0l-45 45c-13 12 -13 33 0 45l185 185h-294v-224c0 -18 -14 -32 -32 -32h-64c-18 0 -32 14 -32 32v224h-132c-32 -288 -276 -512 -572 -512c-340 0 -611 294 -572 642c30 270 253 486 525 508
+c317 25 586 -207 619 -510h132v224c0 18 14 32 32 32h64c18 0 32 -14 32 -32v-224h294l-185 185c-13 12 -13 33 0 45l45 45c12 13 33 13 45 0zM576 128c247 0 448 201 448 448s-201 448 -448 448s-448 -201 -448 -448s201 -448 448 -448z" />
+    <glyph glyph-name="gbp" unicode="&#xf154;" horiz-adv-x="1020" 
+d="M1020 399v-367c0 -18 -14 -32 -32 -32h-956c-18 0 -32 14 -32 32v150c0 17 14 32 32 32h97v383h-95c-18 0 -32 14 -32 32v131c0 18 14 32 32 32h95v223c0 228 184 393 438 393c200 0 329 -120 335 -125c12 -11 13 -30 3 -43l-103 -127c-6 -7 -13 -11 -22 -12
+c-8 -1 -17 2 -23 7c-1 1 -87 69 -188 69c-113 0 -189 -68 -189 -170v-215h305c18 0 32 -14 32 -32v-131c0 -18 -14 -32 -32 -32h-305v-379h414v181c0 18 14 32 32 32h162c18 0 32 -14 32 -32z" />
+    <glyph glyph-name="shaarli-o" unicode="&#xf2f6;" horiz-adv-x="1630" 
+d="M859 1408v0c107 0 210 -67 264 -160c40 -69 61 -156 75 -252c115 -20 212 -47 288 -96c78 -50 134 -137 140 -229l3 -20c7 -91 -25 -191 -100 -245c-18 -13 -36 -22 -55 -30c11 -19 25 -36 34 -56c37 -84 43 -181 12 -267v-1h-1c-26 -70 -82 -133 -154 -160
+s-147 -24 -224 -5c-9 3 -17 5 -25 10c-94 47 -174 101 -239 162c-25 -34 -53 -66 -86 -91c-75 -57 -168 -84 -266 -84c-31 0 -62 -4 -90 5c-82 25 -155 68 -199 141s-44 164 -20 243l1 3l1 3l21 58c-57 19 -109 45 -151 86c-67 66 -95 165 -86 259h-1c0 1 1 2 1 3v7h1
+c8 100 75 193 165 238c87 43 192 57 317 60c6 109 27 206 84 283c66 89 177 135 290 135zM859 1288c-173 0 -260 -116 -260 -348c12 -37 -17 -59 -88 -67c-255 -1 -386 -66 -391 -196c-18 -141 68 -226 258 -253h19l-67 -186c-36 -117 11 -195 141 -235h53
+c155 0 260 80 314 239h37c58 -90 155 -170 294 -239c126 -31 206 -1 239 90c42 114 -12 238 -162 370c196 -10 285 53 264 190c3 117 -118 194 -360 231h-56c-21 269 -99 404 -235 404zM819 1097v0c3 0 6 0 9 -1c50 1 76 -51 76 -156v-188c22 -23 49 -31 84 -25
+c226 0 335 -27 327 -81c10 -49 -110 -65 -361 -48c-12 0 -14 -15 -6 -43c74 -85 140 -151 198 -200c59 -47 69 -92 31 -133c-32 -22 -74 -5 -127 49c-51 54 -117 122 -197 207c-18 24 -40 24 -67 0c-113 -230 -200 -325 -262 -288c-46 24 -23 105 68 242l54 116
+c12 33 -72 45 -250 36c-51 3 -77 22 -77 58c0 37 24 57 71 58l304 17c31 0 48 27 52 81l4 107c-1 131 22 195 69 192z" />
+    <glyph glyph-name="ban" unicode="&#xf05e;" 
+d="M1312 643c0 109 -32 210 -87 295l-754 -753c86 -56 188 -89 297 -89c300 0 544 245 544 547zM313 344l755 754c-86 58 -189 91 -300 91c-300 0 -544 -245 -544 -546c0 -111 33 -213 89 -299zM1536 643c0 -426 -344 -771 -768 -771s-768 345 -768 771
+c0 425 344 770 768 770s768 -345 768 -770z" />
+    <glyph glyph-name="fighter-jet" unicode="&#xf0fb;" horiz-adv-x="1920" 
+d="M1920 576c0 0 0 -32 -288 -96l-352 -32l-224 -64h-64l-293 -352h69c35 0 64 -7 64 -16s-29 -16 -64 -16h-320v32h64v416h-160l-192 -224h-96l-32 32v192h32v32h128v8l-192 24v128l192 24v8h-128v32h-32v192l32 32h96l192 -224h160v416h-64v32h320c35 0 64 -7 64 -16
+s-29 -16 -64 -16h-69l293 -352h64l224 -64l352 -32c288 -64 288 -96 288 -96z" />
+    <glyph glyph-name="space-shuttle" unicode="&#xf197;" horiz-adv-x="2176" 
+d="M620 416c-69 -40 -163 -64 -268 -64h-128v64h-64c-18 0 -32 36 -32 80c0 18 3 35 7 49c-77 2 -135 15 -135 31s58 29 135 31c-4 14 -7 31 -7 49c0 44 14 80 32 80h64v64h128c105 0 199 -24 268 -64h1113c74 -13 141 -24 187 -32c192 -32 256 -96 256 -128
+s-64 -96 -256 -128c-46 -8 -113 -19 -187 -32h-1113zM1739 668c32 -22 53 -55 53 -92s-21 -70 -53 -92l81 -30c41 29 68 73 68 122s-27 93 -68 122zM625 400h1015s-217 -38 -456 -80c-128 0 -224 -96 -224 -96l-288 -288s-97 -64 -160 -64h-96l-93 464h29
+c102 0 199 23 273 64zM352 816h-29l93 464h96c65 0 128 -32 160 -64l288 -288s96 -96 224 -96c239 -42 456 -80 456 -80h-1015c-74 41 -171 64 -273 64z" />
+    <glyph glyph-name="matrix-org" unicode="&#xf313;" 
+d="M40 1373v-1466h106v-35h-146v1536h146v-35h-106zM491 908v-74h2c20 28 44 51 72 66c28 16 60 23 96 23c35 0 66 -7 95 -20s50 -37 65 -71c16 24 38 46 66 64s61 27 99 27c29 0 56 -4 81 -11s45 -18 63 -34s31 -35 41 -60s15 -56 15 -91v-367h-150v311c0 18 -1 36 -2 52
+s-6 30 -12 42s-16 22 -28 29s-29 10 -50 10s-38 -4 -51 -12s-24 -19 -31 -32s-13 -27 -15 -44s-4 -34 -4 -51v-305h-150v307c0 16 0 33 -1 49s-4 30 -9 44c-5 13 -15 24 -27 32s-31 12 -55 12c-7 0 -16 -2 -28 -5s-23 -9 -34 -18s-20 -21 -28 -38s-11 -38 -11 -65v-318h-151
+v548h142zM1496 -93v1466h-106v35h146v-1536h-146v35h106z" />
+    <glyph glyph-name="steam" unicode="&#xf1b6;" horiz-adv-x="1792" 
+d="M1582 954c0 -135 -110 -244 -244 -244c-135 0 -244 109 -244 244s109 244 244 244c134 0 244 -109 244 -244zM812 212c0 139 -111 250 -250 250c-18 0 -36 -2 -54 -6l104 -42c102 -41 152 -156 111 -258s-157 -152 -259 -110c-41 16 -82 33 -123 49
+c42 -79 125 -133 221 -133c139 0 250 111 250 250zM1642 953c0 168 -137 305 -305 305c-169 0 -306 -137 -306 -305c0 -169 137 -305 306 -305c168 0 305 136 305 305zM1792 953c0 -252 -204 -455 -455 -455l-437 -319c-16 -172 -162 -307 -338 -307
+c-162 0 -299 115 -332 268l-230 92v429l389 -157c51 31 110 48 173 48c12 0 24 -1 35 -2l284 407c2 249 206 451 456 451c251 0 455 -204 455 -455z" />
+    <glyph glyph-name="bars" unicode="&#xf0c9;" 
+d="M1536 192v-128c0 -35 -29 -64 -64 -64h-1408c-35 0 -64 29 -64 64v128c0 35 29 64 64 64h1408c35 0 64 -29 64 -64zM1536 704v-128c0 -35 -29 -64 -64 -64h-1408c-35 0 -64 29 -64 64v128c0 35 29 64 64 64h1408c35 0 64 -29 64 -64zM1536 1216v-128
+c0 -35 -29 -64 -64 -64h-1408c-35 0 -64 29 -64 64v128c0 35 29 64 64 64h1408c35 0 64 -29 64 -64z" />
+    <glyph glyph-name="lightbulb-o" unicode="&#xf0eb;" horiz-adv-x="1024" 
+d="M736 960c0 -17 -15 -32 -32 -32s-32 15 -32 32c0 69 -107 96 -160 96c-17 0 -32 15 -32 32s15 32 32 32c93 0 224 -49 224 -160zM896 960c0 200 -203 320 -384 320s-384 -120 -384 -320c0 -64 26 -131 68 -180c19 -22 41 -43 61 -66c71 -85 131 -185 141 -298h228
+c10 113 70 213 141 298c20 23 42 44 61 66c42 49 68 116 68 180zM1024 960c0 -103 -34 -192 -103 -268s-160 -183 -168 -290c29 -17 47 -49 47 -82c0 -24 -9 -47 -25 -64c16 -17 25 -40 25 -64c0 -33 -17 -63 -45 -81c8 -14 13 -31 13 -47c0 -65 -51 -96 -109 -96
+c-26 -58 -84 -96 -147 -96s-121 38 -147 96c-58 0 -109 31 -109 96c0 16 5 33 13 47c-28 18 -45 48 -45 81c0 24 9 47 25 64c-16 17 -25 40 -25 64c0 33 18 65 47 82c-8 107 -99 214 -168 290s-103 165 -103 268c0 272 259 448 512 448s512 -176 512 -448z" />
+    <glyph glyph-name="map-pin" unicode="&#xf276;" horiz-adv-x="1024" 
+d="M512 448c44 0 87 5 128 15v-655c0 -35 -29 -64 -64 -64h-128c-35 0 -64 29 -64 64v655c41 -10 84 -15 128 -15zM512 1536c283 0 512 -229 512 -512s-229 -512 -512 -512s-512 229 -512 512s229 512 512 512zM512 1312c18 0 32 14 32 32s-14 32 -32 32
+c-194 0 -352 -158 -352 -352c0 -18 14 -32 32 -32s32 14 32 32c0 159 129 288 288 288z" />
+    <glyph glyph-name="circle-o" unicode="&#xf10c;" 
+d="M768 1184c-300 0 -544 -244 -544 -544s244 -544 544 -544s544 244 544 544s-244 544 -544 544zM1536 640c0 -424 -344 -768 -768 -768s-768 344 -768 768s344 768 768 768s768 -344 768 -768z" />
+    <glyph glyph-name="contao" unicode="&#xf26d;" horiz-adv-x="1748" 
+d="M116 1408h197c-47 -43 -89 -93 -126 -149c-155 -239 -92 -501 -32 -783c49 -229 90 -447 233 -604h-272c-64 0 -116 52 -116 116v1304c0 64 52 116 116 116zM1324 1408h308c64 0 116 -52 116 -116v-1304c0 -64 -52 -116 -116 -116h-178c132 131 207 321 196 565
+l-469 -101c-6 -111 -44 -218 -196 -250c-85 -18 -155 2 -199 40c-54 46 -97 106 -169 448c-73 343 -58 415 -28 479c25 52 81 100 165 118c153 32 231 -51 282 -150l468 100c-46 118 -107 214 -180 287z" />
+    <glyph glyph-name="vine" unicode="&#xf1ca;" horiz-adv-x="1458" 
+d="M1458 709v-198c-70 -16 -140 -23 -198 -23c-140 -294 -391 -546 -475 -593c-53 -30 -103 -32 -162 3c-103 62 -493 382 -623 1388h283c71 -604 245 -914 436 -1146c106 106 208 247 287 406c-189 96 -304 307 -304 553c0 249 143 437 388 437c238 0 368 -148 368 -403
+c0 -95 -20 -203 -58 -286c0 0 -176 -35 -241 78c13 43 31 117 31 184c0 119 -43 177 -108 177c-69 0 -117 -65 -117 -190c0 -255 162 -401 372 -401c37 0 79 4 121 14z" />
+    <glyph glyph-name="align-center" unicode="&#xf037;" horiz-adv-x="1792" 
+d="M1792 192v-128c0 -35 -29 -64 -64 -64h-1664c-35 0 -64 29 -64 64v128c0 35 29 64 64 64h1664c35 0 64 -29 64 -64zM1408 576v-128c0 -35 -29 -64 -64 -64h-896c-35 0 -64 29 -64 64v128c0 35 29 64 64 64h896c35 0 64 -29 64 -64zM1664 960v-128c0 -35 -29 -64 -64 -64
+h-1408c-35 0 -64 29 -64 64v128c0 35 29 64 64 64h1408c35 0 64 -29 64 -64zM1280 1344v-128c0 -35 -29 -64 -64 -64h-640c-35 0 -64 29 -64 64v128c0 35 29 64 64 64h640c35 0 64 -29 64 -64z" />
+    <glyph glyph-name="btc" unicode="&#xf15a;" horiz-adv-x="1202" 
+d="M1111 896c13 -133 -43 -213 -131 -258c146 -35 238 -122 220 -317c-23 -243 -203 -308 -461 -322v-255h-154v251c-39 0 -80 0 -122 1v-252h-154v255c-36 0 -72 1 -109 1h-200l31 183c113 -2 111 0 111 0c43 0 55 31 58 51v402h16c-6 1 -12 1 -16 1v287
+c-6 32 -26 68 -89 68c0 0 2 2 -111 0v164l212 -1c31 0 64 0 97 1v252h154v-247c41 1 82 2 122 2v245h154v-252c198 -17 355 -78 372 -260zM896 351c0 198 -326 169 -430 169v-338c104 0 430 -22 430 169zM825 827c0 181 -272 154 -359 154v-307c87 0 359 -20 359 153z" />
+    <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 1088v288c0 17 -15 32 -32 32h-64c-17 0 -32 -15 -32 -32v-288c0 -17 15 -32 32 -32h64c17 0 32 15 32 32zM1248 224h288v320h-288v-320zM864 608h320v288h-320v-288zM1248 608h288v288h-288v-288zM1280 1088v288c0 17 -15 32 -32 32h-64c-17 0 -32 -15 -32 -32v-288
+c0 -17 15 -32 32 -32h64c17 0 32 15 32 32zM1664 1152v-1280c0 -70 -58 -128 -128 -128h-1408c-70 0 -128 58 -128 128v1280c0 70 58 128 128 128h128v96c0 88 72 160 160 160h64c88 0 160 -72 160 -160v-96h384v96c0 88 72 160 160 160h64c88 0 160 -72 160 -160v-96h128
+c70 0 128 -58 128 -128z" />
+    <glyph glyph-name="retweet" unicode="&#xf079;" horiz-adv-x="1920" 
+d="M1280 32c0 -17 -15 -32 -32 -32h-960c-37 0 -32 39 -32 64v576h-192c-35 0 -64 29 -64 64c0 15 5 30 15 41l320 384c12 14 30 22 49 22s37 -8 49 -22l320 -384c10 -11 15 -26 15 -41c0 -35 -29 -64 -64 -64h-192v-384h576c9 0 19 -4 25 -11l160 -192c4 -6 7 -14 7 -21z
+M1920 448c0 -15 -5 -30 -15 -41l-320 -384c-12 -14 -30 -23 -49 -23s-37 9 -49 23l-320 384c-10 11 -15 26 -15 41c0 35 29 64 64 64h192v384h-576c-9 0 -19 4 -25 12l-160 192c-4 5 -7 13 -7 20c0 17 15 32 32 32h960c37 0 32 -39 32 -64v-576h192c35 0 64 -29 64 -64z" />
+    <glyph glyph-name="hourglass" unicode="&#xf254;" 
+d="M1504 -64c18 0 32 -14 32 -32v-128c0 -18 -14 -32 -32 -32h-1472c-18 0 -32 14 -32 32v128c0 18 14 32 32 32h1472zM130 0c19 337 294 518 478 640c-184 122 -459 303 -478 640h1276c-19 -337 -294 -518 -478 -640c184 -122 459 -303 478 -640h-1276zM1504 1536
+c18 0 32 -14 32 -32v-128c0 -18 -14 -32 -32 -32h-1472c-18 0 -32 14 -32 32v128c0 18 14 32 32 32h1472z" />
+    <glyph glyph-name="paint-brush" unicode="&#xf1fc;" horiz-adv-x="1790" 
+d="M1615 1536c91 0 175 -68 175 -163c0 -53 -21 -104 -45 -151c-78 -148 -340 -637 -465 -752c-61 -57 -133 -91 -218 -91c-169 0 -307 144 -307 312c0 80 33 158 92 212l638 579c35 32 81 54 130 54zM706 502c52 -101 147 -177 257 -206l1 -71c6 -285 -192 -481 -478 -481
+c-339 0 -486 270 -486 577c37 -25 166 -128 208 -128c25 0 46 14 55 37c85 222 218 262 443 272z" />
+    <glyph glyph-name="viadeo-square" unicode="&#xf2aa;" 
+d="M1050 495c0 50 -9 100 -28 147c-26 -16 -55 -28 -85 -34c16 -36 22 -75 22 -114c0 -154 -114 -280 -270 -280c-157 0 -271 126 -271 280c0 151 115 284 271 284c34 0 67 -6 98 -19c3 30 13 60 27 87c-40 14 -82 21 -125 21c-207 0 -361 -167 -361 -372s155 -367 361 -367
+s361 163 361 367zM872 850c25 -72 38 -148 38 -225c0 -173 -71 -317 -219 -411h-10c-14 0 -28 1 -42 3c199 76 235 377 235 562c0 23 0 47 -2 71zM872 850c-5 97 -60 247 -142 302c56 -95 106 -197 142 -302zM1207 955c0 61 -15 123 -51 174c-24 -51 -69 -94 -124 -109
+c-79 -22 -149 -59 -149 -153c0 -27 9 -54 24 -77c95 22 196 92 236 182c-6 -80 -155 -177 -213 -209c29 -29 67 -52 110 -52c73 0 125 65 150 127c12 30 17 86 17 117zM1536 1120v-960c0 -159 -129 -288 -288 -288h-960c-159 0 -288 129 -288 288v960c0 159 129 288 288 288
+h960c159 0 288 -129 288 -288z" />
+    <glyph glyph-name="tags" unicode="&#xf02c;" horiz-adv-x="1899" 
+d="M448 1088c0 71 -57 128 -128 128s-128 -57 -128 -128s57 -128 128 -128s128 57 128 128zM1515 512c0 -34 -14 -67 -37 -90l-491 -492c-24 -23 -57 -37 -91 -37s-67 14 -90 37l-715 716c-51 50 -91 147 -91 218v416c0 70 58 128 128 128h416c71 0 168 -40 219 -91
+l715 -714c23 -24 37 -57 37 -91zM1899 512c0 -34 -14 -67 -37 -90l-491 -492c-24 -23 -57 -37 -91 -37c-52 0 -78 24 -112 59l470 470c23 23 37 56 37 90s-14 67 -37 91l-715 714c-51 51 -148 91 -219 91h224c71 0 168 -40 219 -91l715 -714c23 -24 37 -57 37 -91z" />
+    <glyph glyph-name="minus-square-o" unicode="&#xf147;" horiz-adv-x="1408" 
+d="M1152 736v-64c0 -18 -14 -32 -32 -32h-832c-18 0 -32 14 -32 32v64c0 18 14 32 32 32h832c18 0 32 -14 32 -32zM1280 288v832c0 88 -72 160 -160 160h-832c-88 0 -160 -72 -160 -160v-832c0 -88 72 -160 160 -160h832c88 0 160 72 160 160zM1408 1120v-832
+c0 -159 -129 -288 -288 -288h-832c-159 0 -288 129 -288 288v832c0 159 129 288 288 288h832c159 0 288 -129 288 -288z" />
+    <glyph glyph-name="user-circle" unicode="&#xf2bd;" horiz-adv-x="1792" 
+d="M1523 197c-26 187 -102 353 -272 376c-88 -96 -215 -157 -355 -157s-267 61 -355 157c-170 -23 -246 -189 -272 -376c139 -196 368 -325 627 -325s488 129 627 325zM1280 896c0 212 -172 384 -384 384s-384 -172 -384 -384s172 -384 384 -384s384 172 384 384zM1792 640
+c0 -493 -400 -896 -896 -896c-495 0 -896 402 -896 896c0 495 401 896 896 896s896 -401 896 -896z" />
+    <glyph glyph-name="thumbs-o-down" unicode="&#xf088;" 
+d="M256 1088c0 35 -29 64 -64 64s-64 -29 -64 -64s29 -64 64 -64s64 29 64 64zM1408 512c0 37 -28 127 -75 128c21 24 35 71 35 103c0 47 -19 87 -53 119c12 21 18 45 18 69c0 46 -23 103 -65 126c3 18 5 37 5 56c0 117 -74 167 -185 167h-128c-118 0 -232 -35 -342 -73
+c-54 -19 -146 -55 -202 -55h-32v-640h32c79 0 198 -171 243 -229c25 -31 49 -62 77 -91c97 -102 64 -255 128 -320c137 0 160 75 160 192c0 118 -96 203 -96 320h352c67 0 128 60 128 128zM1536 511c0 -138 -118 -255 -256 -255h-176c30 -62 48 -122 48 -192
+c0 -66 -4 -126 -35 -186c-49 -97 -149 -134 -253 -134c-34 0 -66 14 -90 37c-100 98 -69 256 -128 321c-38 40 -73 83 -107 127c-30 39 -98 129 -137 155h-274c-71 0 -128 57 -128 128v640c0 71 57 128 128 128h288c28 0 109 30 138 40c144 50 269 88 423 88h112
+c182 0 313 -108 312 -295v-5c39 -50 60 -114 60 -178c0 -14 -1 -29 -3 -43c25 -44 38 -94 38 -144c0 -23 -3 -47 -9 -69c32 -48 49 -105 49 -163z" />
+    <glyph glyph-name="subscript" unicode="&#xf12c;" horiz-adv-x="1531" 
+d="M892 167v-167h-248l-159 252l-24 42c-6 7 -9 14 -11 21h-3c-2 -7 -6 -14 -9 -21c-6 -12 -15 -28 -25 -44l-155 -250h-258v167h128l197 291l-185 272h-137v168h276l139 -228c9 -14 16 -29 23 -42c6 -7 9 -14 11 -21h3c2 7 6 14 11 21l25 42l140 228h257v-168h-125
+l-184 -267l204 -296h109zM1531 -50v-206h-514l-4 27c-1 15 -3 33 -3 46c0 273 350 296 350 441c0 52 -47 87 -100 87c-39 0 -72 -18 -97 -39c-13 -11 -25 -25 -36 -38l-105 92c18 25 38 46 63 66c42 34 103 65 188 65c145 0 246 -85 246 -218c0 -239 -332 -259 -346 -403
+h232v80h126z" />
+    <glyph glyph-name="flickr" unicode="&#xf16e;" 
+d="M1248 1408c159 0 288 -129 288 -288v-960c0 -159 -129 -288 -288 -288h-960c-159 0 -288 129 -288 288v960c0 159 129 288 288 288h960zM698 640c0 117 -95 212 -212 212s-212 -95 -212 -212s95 -212 212 -212s212 95 212 212zM1262 640c0 117 -95 212 -212 212
+s-212 -95 -212 -212s95 -212 212 -212s212 95 212 212z" />
+    <glyph glyph-name="cc-amex" unicode="&#xf1f3;" horiz-adv-x="2304" 
+d="M119 854h89l-45 108zM740 328l74 79l-70 79h-163v-49h142v-55h-142v-54h159zM898 406l99 -110v217zM1186 453c0 24 -18 33 -40 33h-84v-69h83c23 0 41 11 41 36zM1475 457c0 25 -22 29 -42 29h-82v-61h81c22 0 43 5 43 32zM1197 923c0 25 -22 29 -42 29h-82v-60h81
+c22 0 43 5 43 31zM1656 854h89l-44 108zM699 1009v-271h-66v212l-94 -212h-57l-94 212v-212h-132l-25 60h-135l-25 -60h-70l116 271h96l110 -257v257h106l85 -184l77 184h108zM1255 453c0 -109 -119 -91 -193 -91v-91h-126l-80 90l-83 -90h-256v271h260l80 -89l82 89h207
+c61 0 109 -21 109 -89zM964 794v-56h-217v271h217v-57h-152v-49h148v-55h-148v-54h152zM2304 235v-229c0 -73 -59 -134 -132 -134h-2040c-73 0 -132 61 -132 134v678h111l25 61h55l25 -61h218v46l19 -46h113l20 47v-47h541v99l10 1c9 0 10 -7 10 -14v-86h279v23
+c65 -34 154 -23 222 -23l25 61h56l25 -61h227v58l34 -58h182v378h-180v-44l-25 44h-185v-44l-23 44h-249c-37 0 -76 -4 -109 -22v22h-172v-22c-20 18 -47 22 -73 22h-628l-43 -97l-43 97h-198v-44l-22 44h-169l-78 -179v391c0 73 59 134 132 134h2040c73 0 132 -61 132 -134
+v-678h-120c-28 0 -58 -5 -81 -22v22h-177c-25 0 -59 -4 -78 -22v22h-316v-22c-24 17 -59 22 -87 22h-209v-22c-21 20 -64 22 -91 22h-234l-54 -58l-50 58h-349v-378h343l55 59l52 -59h211v89h21c30 0 61 1 90 13v-102h174v99h8c10 0 12 -1 12 -12v-87h529c29 0 65 6 88 24
+v-24h168c32 0 66 3 95 17zM1546 469c0 -30 -16 -60 -46 -72c36 -13 43 -37 43 -72v-54h-65v45c0 46 -15 54 -58 54h-69v-99h-65v271h154c51 0 106 -9 106 -73zM1269 936c0 -31 -17 -61 -46 -73c37 -13 43 -36 43 -72v-53h-65c-1 58 14 98 -58 98h-70v-98h-64v271l153 -1
+c52 0 107 -8 107 -72zM1798 327v-56h-216v271h216v-56h-151v-49h148v-55h-148v-54zM1372 1009v-271h-66v271h66zM2065 357c0 -64 -44 -86 -102 -86h-126v58h126c16 0 34 4 34 25c0 58 -167 -22 -167 107c0 55 42 81 92 81h130v-57h-119c-17 0 -36 -3 -36 -25
+c0 -59 168 27 168 -103zM2304 407v-101c-19 -28 -56 -35 -88 -35h-125v58h125c16 0 33 5 33 25c0 57 -167 -22 -167 107c0 55 43 81 93 81h129v-57h-118c-18 0 -36 -3 -36 -25c0 -48 113 1 154 -53zM2139 1008v-270h-92l-122 203v-203h-132l-26 60h-134l-25 -60h-75
+c-89 0 -129 46 -129 133c0 91 41 138 133 138h63v-59c-68 1 -130 16 -130 -77c0 -46 11 -78 63 -78h29l92 213h97l109 -256v256h99l114 -188v188h66z" />
+    <glyph glyph-name="reddit" unicode="&#xf1a1;" horiz-adv-x="1792" 
+d="M1095 369c9 -9 9 -23 0 -31c-57 -57 -167 -62 -199 -62s-142 5 -199 62c-9 8 -9 22 0 31c8 8 22 8 30 0c36 -37 114 -49 169 -49s132 12 169 49c8 8 22 8 30 0zM788 550c0 -49 -40 -89 -89 -89c-50 0 -90 40 -90 89c0 50 40 90 90 90c49 0 89 -40 89 -90zM1183 550
+c0 -49 -40 -89 -90 -89c-49 0 -89 40 -89 89c0 50 40 90 89 90c50 0 90 -40 90 -90zM1434 670c0 66 -54 119 -120 119c-34 0 -64 -14 -86 -36c-81 56 -190 92 -311 96l63 283l200 -45c0 -49 40 -89 89 -89c50 0 90 41 90 90s-40 90 -90 90c-35 0 -65 -21 -80 -50l-221 49
+c-11 3 -22 -5 -25 -16l-69 -312c-120 -5 -228 -41 -309 -97c-22 23 -53 37 -87 37c-66 0 -120 -53 -120 -119c0 -48 28 -88 68 -108c-4 -18 -6 -37 -6 -56c0 -190 214 -344 477 -344c264 0 478 154 478 344c0 19 -2 39 -7 57c39 20 66 60 66 107zM1792 640
+c0 -495 -401 -896 -896 -896s-896 401 -896 896s401 896 896 896s896 -401 896 -896z" />
+    <glyph glyph-name="times-circle" unicode="&#xf057;" 
+d="M1149 414c0 17 -7 33 -19 45l-181 181l181 181c12 12 19 28 19 45s-7 34 -19 46l-90 90c-12 12 -29 19 -46 19s-33 -7 -45 -19l-181 -181l-181 181c-12 12 -28 19 -45 19s-34 -7 -46 -19l-90 -90c-12 -12 -19 -29 -19 -46s7 -33 19 -45l181 -181l-181 -181
+c-12 -12 -19 -28 -19 -45s7 -34 19 -46l90 -90c12 -12 29 -19 46 -19s33 7 45 19l181 181l181 -181c12 -12 28 -19 45 -19s34 7 46 19l90 90c12 12 19 29 19 46zM1536 640c0 -424 -344 -768 -768 -768s-768 344 -768 768s344 768 768 768s768 -344 768 -768z" />
+    <glyph glyph-name="tripadvisor" unicode="&#xf262;" horiz-adv-x="2304" 
+d="M651 539c0 -52 -42 -94 -93 -94c-52 0 -94 42 -94 94c0 51 42 93 94 93c51 0 93 -42 93 -93zM1805 540c0 -52 -42 -94 -94 -94s-94 42 -94 94s42 93 94 93s94 -41 94 -93zM765 539c0 106 -87 193 -193 193c-107 0 -193 -87 -193 -193c0 -107 86 -193 193 -193
+c106 0 193 86 193 193zM1918 540c0 106 -86 193 -193 193c-106 0 -193 -87 -193 -193c0 -107 87 -193 193 -193c107 0 193 86 193 193zM850 539c0 -154 -124 -279 -278 -279s-279 125 -279 279c0 153 125 278 279 278s278 -125 278 -278zM2004 540
+c0 -154 -125 -278 -279 -278c-153 0 -278 124 -278 278s125 278 278 278c154 0 279 -124 279 -278zM1040 537c0 255 -207 462 -462 462c-254 0 -461 -207 -461 -462s207 -462 461 -462c255 0 462 207 462 462zM1708 1110c-165 72 -351 111 -556 111s-409 -39 -573 -110
+c317 -1 573 -257 573 -574c0 311 247 564 556 573zM2187 537c0 255 -206 462 -461 462s-462 -207 -462 -462s207 -462 462 -462s461 207 461 462zM1921 1103h383c-60 -70 -104 -164 -115 -229c69 -95 110 -211 110 -337c0 -317 -257 -573 -573 -573c-180 0 -340 82 -445 211
+c0 0 -47 -56 -129 -179c-14 29 -85 130 -128 180c-105 -130 -266 -212 -446 -212c-316 0 -573 256 -573 573c0 126 41 242 110 337c-11 65 -55 159 -115 229h365c196 131 481 213 787 213s573 -82 769 -213z" />
+    <glyph glyph-name="sort-amount-asc" unicode="&#xf160;" horiz-adv-x="1760" 
+d="M704 96c0 -9 -4 -17 -10 -24l-319 -319c-7 -6 -15 -9 -23 -9s-16 3 -23 9l-320 320c-9 10 -12 23 -7 35s17 20 30 20h192v1376c0 18 14 32 32 32h192c18 0 32 -14 32 -32v-1376h192c18 0 32 -14 32 -32zM1760 -32v-192c0 -18 -14 -32 -32 -32h-832c-18 0 -32 14 -32 32
+v192c0 18 14 32 32 32h832c18 0 32 -14 32 -32zM1568 480v-192c0 -18 -14 -32 -32 -32h-640c-18 0 -32 14 -32 32v192c0 18 14 32 32 32h640c18 0 32 -14 32 -32zM1376 992v-192c0 -18 -14 -32 -32 -32h-448c-18 0 -32 14 -32 32v192c0 18 14 32 32 32h448
+c18 0 32 -14 32 -32zM1184 1504v-192c0 -18 -14 -32 -32 -32h-256c-18 0 -32 14 -32 32v192c0 18 14 32 32 32h256c18 0 32 -14 32 -32z" />
+    <glyph glyph-name="renren" unicode="&#xf18b;" 
+d="M1133 -34c-109 -60 -234 -94 -368 -94c-133 0 -258 34 -367 94c177 112 320 281 367 479c48 -198 191 -367 368 -479zM638 1394v-485c0 -342 -189 -636 -457 -766c-113 134 -181 306 -181 495c0 380 276 695 638 756zM1536 638c0 -189 -68 -361 -181 -495
+c-268 130 -457 424 -457 766v485c362 -61 638 -376 638 -756z" />
+    <glyph glyph-name="key-modern" unicode="&#xf2f7;" horiz-adv-x="1792" 
+d="M546 1536v0c139 1 278 -52 383 -158c142 -141 187 -343 137 -525l726 -726v-319c0 -35 -29 -64 -64 -64h-300l-45 45l135 226l-46 45l-225 -135l-45 46l134 225l-45 45l-225 -134l-46 45l135 225l-45 46l-243 -139l-186 186c-182 -50 -382 -5 -524 136
+c-211 212 -209 556 4 770c107 106 246 159 385 160zM405 1290v0c-41 0 -82 -16 -113 -47c-63 -63 -63 -163 0 -226s164 -63 227 0s63 163 0 226c-31 31 -73 47 -114 47z" />
+    <glyph glyph-name="arrow-circle-o-right" unicode="&#xf18e;" 
+d="M1152 640c0 -8 -3 -17 -9 -23l-320 -320c-6 -6 -15 -9 -23 -9c-17 0 -32 15 -32 32v192h-352c-17 0 -32 15 -32 32v192c0 17 15 32 32 32h352v192c0 18 14 32 32 32c9 0 17 -4 24 -10l319 -319c6 -6 9 -15 9 -23zM1312 640c0 300 -244 544 -544 544s-544 -244 -544 -544
+s244 -544 544 -544s544 244 544 544zM1536 640c0 -424 -344 -768 -768 -768s-768 344 -768 768s344 768 768 768s768 -344 768 -768z" />
+    <glyph glyph-name="pinterest-p" unicode="&#xf231;" horiz-adv-x="1280" 
+d="M0 939c0 369 338 597 680 597c314 0 600 -216 600 -547c0 -311 -159 -656 -513 -656c-84 0 -190 42 -231 120c-76 -301 -70 -346 -238 -576l-14 -5l-9 10c-6 63 -15 125 -15 188c0 204 94 499 140 697c-25 51 -32 113 -32 169c0 101 70 229 184 229
+c84 0 129 -64 129 -143c0 -130 -88 -252 -88 -378c0 -86 71 -146 154 -146c230 0 301 332 301 509c0 237 -168 366 -395 366c-264 0 -468 -190 -468 -458c0 -129 79 -195 79 -226c0 -26 -19 -118 -52 -118c-5 0 -12 2 -17 3c-143 43 -195 234 -195 365z" />
+    <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="key" unicode="&#xf084;" horiz-adv-x="1683" 
+d="M832 1024c0 106 -86 192 -192 192s-192 -86 -192 -192c0 -29 7 -57 19 -83c-26 12 -54 19 -83 19c-106 0 -192 -86 -192 -192s86 -192 192 -192s192 86 192 192c0 29 -7 57 -19 83c26 -12 54 -19 83 -19c106 0 192 86 192 192zM1683 320c0 -23 -92 -115 -115 -115
+c-26 0 -107 94 -128 115l-96 -96l220 -220c18 -18 28 -43 28 -68c0 -56 -64 -120 -120 -120c-25 0 -50 10 -68 28l-671 671c-105 -78 -233 -131 -365 -131c-218 0 -368 151 -368 368c0 328 328 656 656 656c217 0 368 -150 368 -368c0 -132 -53 -260 -131 -365l355 -355
+l96 96c-21 21 -115 102 -115 128c0 23 92 115 115 115c8 0 17 -4 23 -10c37 -37 316 -300 316 -329z" />
+    <glyph glyph-name="syncthing" unicode="&#xf311;" 
+d="M768 1408c424 0 768 -344 768 -768s-344 -768 -768 -768s-768 344 -768 768s344 768 768 768zM774 1254c-337 0 -611 -274 -611 -611c0 -10 0 -28 1 -38c-17 -10 -32 -23 -42 -41c-33 -56 -14 -128 41 -161c18 -10 37 -15 56 -16c97 -210 309 -355 555 -355
+c108 0 210 28 298 78c16 -11 35 -19 56 -21c65 -5 122 42 129 107v10c0 14 -5 36 -11 49c87 105 139 241 139 388c0 57 -8 112 -23 164c14 13 25 30 32 49c21 61 -12 128 -73 149c-12 4 -26 6 -38 6v0c-6 0 -15 0 -21 -1c-112 148 -289 244 -488 244zM774 1175v0
+c171 0 323 -79 420 -204c-10 -11 -17 -24 -22 -39c-9 -27 -8 -55 1 -80l-224 -186c-18 11 -39 16 -60 16c-22 0 -44 -5 -63 -18c-26 -16 -43 -42 -50 -70l-447 -41c-10 21 -25 39 -46 52c-13 8 -27 12 -41 14c0 8 -1 16 -1 24c0 295 238 532 533 532zM1224 792
+c6 -3 15 -7 21 -9c15 -5 29 -8 44 -7c11 -43 17 -87 17 -133c0 -125 -42 -240 -114 -331c-13 7 -28 11 -43 13c-15 1 -28 0 -42 -4l-122 175c23 32 29 73 15 110zM783 516c2 -4 5 -11 8 -15c29 -44 81 -63 129 -50l122 -175c-12 -16 -19 -37 -21 -59v-9c0 -10 2 -26 5 -35
+c-75 -40 -161 -63 -252 -63c-211 0 -394 123 -480 301c10 8 24 22 30 33c5 8 11 22 13 31z" />
+    <glyph glyph-name="picture-o" unicode="&#xf03e;" horiz-adv-x="1920" 
+d="M640 960c0 -106 -86 -192 -192 -192s-192 86 -192 192s86 192 192 192s192 -86 192 -192zM1664 576v-448h-1408v192l320 320l160 -160l512 512zM1760 1280h-1600c-17 0 -32 -15 -32 -32v-1216c0 -17 15 -32 32 -32h1600c17 0 32 15 32 32v1216c0 17 -15 32 -32 32z
+M1920 1248v-1216c0 -88 -72 -160 -160 -160h-1600c-88 0 -160 72 -160 160v1216c0 88 72 160 160 160h1600c88 0 160 -72 160 -160z" />
+    <glyph glyph-name="list-alt" unicode="&#xf022;" horiz-adv-x="1792" 
+d="M384 352v-64c0 -17 -15 -32 -32 -32h-64c-17 0 -32 15 -32 32v64c0 17 15 32 32 32h64c17 0 32 -15 32 -32zM384 608v-64c0 -17 -15 -32 -32 -32h-64c-17 0 -32 15 -32 32v64c0 17 15 32 32 32h64c17 0 32 -15 32 -32zM384 864v-64c0 -17 -15 -32 -32 -32h-64
+c-17 0 -32 15 -32 32v64c0 17 15 32 32 32h64c17 0 32 -15 32 -32zM1536 352v-64c0 -17 -15 -32 -32 -32h-960c-17 0 -32 15 -32 32v64c0 17 15 32 32 32h960c17 0 32 -15 32 -32zM1536 608v-64c0 -17 -15 -32 -32 -32h-960c-17 0 -32 15 -32 32v64c0 17 15 32 32 32h960
+c17 0 32 -15 32 -32zM1536 864v-64c0 -17 -15 -32 -32 -32h-960c-17 0 -32 15 -32 32v64c0 17 15 32 32 32h960c17 0 32 -15 32 -32zM1664 160v832c0 17 -15 32 -32 32h-1472c-17 0 -32 -15 -32 -32v-832c0 -17 15 -32 32 -32h1472c17 0 32 15 32 32zM1792 1248v-1088
+c0 -88 -72 -160 -160 -160h-1472c-88 0 -160 72 -160 160v1088c0 88 72 160 160 160h1472c88 0 160 -72 160 -160z" />
+    <glyph glyph-name="fort-awesome" unicode="&#xf286;" horiz-adv-x="1664" 
+d="M640 528v224c0 9 -7 16 -16 16h-96c-9 0 -16 -7 -16 -16v-224c0 -9 7 -16 16 -16h96c9 0 16 7 16 16zM1152 528v224c0 9 -7 16 -16 16h-96c-9 0 -16 -7 -16 -16v-224c0 -9 7 -16 16 -16h96c9 0 16 7 16 16zM1664 496v-752h-640v320c0 106 -86 192 -192 192
+s-192 -86 -192 -192v-320h-640v752c0 9 7 16 16 16h96c9 0 16 -7 16 -16v-112h128v624c0 9 7 16 16 16h96c9 0 16 -7 16 -16v-112h128v112c0 9 7 16 16 16h96c9 0 16 -7 16 -16v-112h128v112c0 21 28 16 41 16v391c-19 9 -32 29 -32 50c0 30 25 55 55 55s55 -25 55 -55
+c0 -21 -13 -41 -32 -50v-17c27 6 55 10 83 10c41 0 80 -15 114 -15c31 0 66 15 84 15c9 0 16 -7 16 -16v-210c0 -24 -81 -28 -97 -28c-37 0 -72 15 -110 15c-30 0 -61 -5 -90 -12v-133c13 0 41 5 41 -16v-112h128v112c0 9 7 16 16 16h96c9 0 16 -7 16 -16v-112h128v112
+c0 9 7 16 16 16h96c9 0 16 -7 16 -16v-624h128v112c0 9 7 16 16 16h96c9 0 16 -7 16 -16z" />
+    <glyph glyph-name="c" unicode="&#xf31c;" horiz-adv-x="1404" 
+d="M996 819c0 0 -23 211 -232 217s-317 -157 -317 -392s119 -423 323 -423s226 235 226 235l391 -24s22 -211 -141 -373s-364 -188 -504 -187s-334 -2 -522 190s-220 379 -220 563s36 427 259 611c152 125 306 172 460 172c643 0 685 -593 685 -593l-408 4v0z" />
+    <glyph glyph-name="commenting" unicode="&#xf27a;" horiz-adv-x="1792" 
+d="M640 640c0 71 -57 128 -128 128s-128 -57 -128 -128s57 -128 128 -128s128 57 128 128zM1024 640c0 71 -57 128 -128 128s-128 -57 -128 -128s57 -128 128 -128s128 57 128 128zM1408 640c0 71 -57 128 -128 128s-128 -57 -128 -128s57 -128 128 -128s128 57 128 128z
+M1792 640c0 -354 -401 -640 -896 -640c-73 0 -144 6 -211 18c-114 -114 -263 -192 -435 -229c-27 -5 -56 -10 -86 -13c-16 -2 -31 9 -35 24c-4 16 8 26 20 37c63 59 138 106 164 317c-191 117 -313 291 -313 486c0 354 401 640 896 640s896 -286 896 -640z" />
+    <glyph glyph-name="tablet" unicode="&#xf10a;" horiz-adv-x="1152" 
+d="M640 128c0 35 -29 64 -64 64s-64 -29 -64 -64s29 -64 64 -64s64 29 64 64zM1024 288v960c0 17 -15 32 -32 32h-832c-17 0 -32 -15 -32 -32v-960c0 -17 15 -32 32 -32h832c17 0 32 15 32 32zM1152 1248v-1088c0 -88 -72 -160 -160 -160h-832c-88 0 -160 72 -160 160v1088
+c0 88 72 160 160 160h832c88 0 160 -72 160 -160z" />
+    <glyph glyph-name="credit-card" unicode="&#xf09d;" horiz-adv-x="1920" 
+d="M1760 1408c88 0 160 -72 160 -160v-1216c0 -88 -72 -160 -160 -160h-1600c-88 0 -160 72 -160 160v1216c0 88 72 160 160 160h1600zM160 1280c-17 0 -32 -15 -32 -32v-224h1664v224c0 17 -15 32 -32 32h-1600zM1760 0c17 0 32 15 32 32v608h-1664v-608
+c0 -17 15 -32 32 -32h1600zM256 128v128h256v-128h-256zM640 128v128h384v-128h-384z" />
+    <glyph glyph-name="minus" unicode="&#xf068;" horiz-adv-x="1408" 
+d="M1408 800v-192c0 -53 -43 -96 -96 -96h-1216c-53 0 -96 43 -96 96v192c0 53 43 96 96 96h1216c53 0 96 -43 96 -96z" />
+    <glyph glyph-name="unlock-alt" unicode="&#xf13e;" horiz-adv-x="1152" 
+d="M1056 768c53 0 96 -43 96 -96v-576c0 -53 -43 -96 -96 -96h-960c-53 0 -96 43 -96 96v576c0 53 43 96 96 96h32v320c0 247 201 448 448 448s448 -201 448 -448c0 -35 -29 -64 -64 -64h-64c-35 0 -64 29 -64 64c0 141 -115 256 -256 256s-256 -115 -256 -256v-320h736z
+" />
+    <glyph glyph-name="ils" unicode="&#xf20b;" horiz-adv-x="1376" 
+d="M992 912v-496c0 -18 -14 -32 -32 -32h-160c-18 0 -32 14 -32 32v496c0 150 -122 272 -272 272h-272v-1152c0 -18 -14 -32 -32 -32h-160c-18 0 -32 14 -32 32v1344c0 18 14 32 32 32h464c274 0 496 -222 496 -496zM1376 1376v-880c0 -274 -222 -496 -496 -496h-464
+c-18 0 -32 14 -32 32v960c0 18 14 32 32 32h160c18 0 32 -14 32 -32v-768h272c150 0 272 122 272 272v880c0 18 14 32 32 32h160c18 0 32 -14 32 -32z" />
+    <glyph glyph-name="cog" unicode="&#xf013;" 
+d="M1024 640c0 141 -115 256 -256 256s-256 -115 -256 -256s115 -256 256 -256s256 115 256 256zM1536 749v-222c0 -15 -12 -33 -28 -36l-185 -28c-11 -32 -23 -62 -39 -91c34 -49 70 -93 107 -138c6 -7 10 -16 10 -25s-3 -16 -9 -23c-24 -32 -159 -179 -193 -179
+c-9 0 -18 4 -26 9l-138 108c-29 -15 -60 -28 -91 -38c-7 -61 -13 -126 -29 -186c-4 -16 -18 -28 -36 -28h-222c-18 0 -34 13 -36 30l-28 184c-31 10 -61 22 -90 37l-141 -107c-7 -6 -16 -9 -25 -9s-18 4 -25 11c-53 48 -123 110 -165 168c-5 7 -7 15 -7 23c0 9 3 16 8 23
+c34 46 71 90 105 137c-17 32 -31 65 -41 99l-183 27c-17 3 -29 19 -29 36v222c0 15 12 33 27 36l186 28c10 32 23 62 39 92c-34 48 -70 93 -107 138c-6 7 -10 15 -10 24s4 16 9 23c24 33 159 179 193 179c9 0 18 -4 26 -10l138 -107c29 15 60 28 91 38c7 61 13 126 29 186
+c4 16 18 28 36 28h222c18 0 34 -13 36 -30l28 -184c31 -10 61 -22 90 -37l142 107c6 6 15 9 24 9s18 -4 25 -10c53 -49 123 -111 165 -170c5 -6 7 -14 7 -22c0 -9 -3 -16 -8 -23c-34 -46 -71 -90 -105 -137c17 -32 31 -65 41 -98l183 -28c17 -3 29 -19 29 -36z" />
+    <glyph glyph-name="arrow-right" unicode="&#xf061;" horiz-adv-x="1472" 
+d="M1472 576c0 -34 -13 -67 -37 -91l-651 -651c-24 -23 -57 -37 -91 -37s-66 14 -90 37l-75 75c-24 24 -38 57 -38 91s14 67 38 91l293 293h-704c-72 0 -117 60 -117 128v128c0 68 45 128 117 128h704l-293 294c-24 23 -38 56 -38 90s14 67 38 90l75 75c24 24 56 38 90 38
+s67 -14 91 -38l651 -651c24 -23 37 -56 37 -90z" />
+    <glyph glyph-name="cc-paypal" unicode="&#xf1f4;" horiz-adv-x="2304" 
+d="M745 630c0 -49 -39 -86 -88 -86c-37 0 -64 21 -64 60c0 49 38 88 87 88c37 0 65 -23 65 -62zM1530 779c0 -60 -36 -72 -88 -72l-32 -1l17 107c1 7 6 11 13 11h18c34 0 72 -2 72 -45zM1881 630c0 -49 -39 -86 -87 -86c-37 0 -65 21 -65 60c0 49 38 88 87 88
+c37 0 65 -23 65 -62zM513 801c0 84 -65 112 -139 112h-160c-10 0 -20 -8 -21 -19l-65 -408c-1 -8 5 -16 13 -16h76c11 0 21 8 22 19l18 110c4 29 53 19 72 19c114 0 184 68 184 183zM822 489l41 261c1 8 -5 16 -13 16h-76c-15 0 -16 -22 -17 -33c-23 34 -57 40 -95 40
+c-98 0 -173 -86 -173 -181c0 -78 49 -129 127 -129c36 0 81 16 106 44c-2 -6 -4 -15 -4 -21c0 -9 4 -16 13 -16h69c11 0 20 8 22 19zM1269 752c0 7 -6 14 -13 14h-77c-7 0 -14 -4 -18 -10l-106 -156l-44 150c-3 9 -12 16 -22 16h-75c-7 0 -13 -7 -13 -14
+c0 -5 78 -231 85 -252c-11 -15 -82 -108 -82 -120c0 -7 6 -13 13 -13h77c7 0 14 4 18 10l255 368c2 2 2 4 2 7zM1649 801c0 84 -65 112 -139 112h-159c-11 0 -21 -8 -22 -19l-65 -408c-1 -8 5 -16 13 -16h82c8 0 14 6 16 13l18 116c4 29 53 19 72 19c114 0 184 68 184 183z
+M1958 489l41 261c1 8 -5 16 -13 16h-76c-15 0 -16 -22 -17 -33c-22 34 -56 40 -95 40c-98 0 -173 -86 -173 -181c0 -78 49 -129 127 -129c37 0 82 16 106 44c-1 -6 -4 -15 -4 -21c0 -9 4 -16 13 -16h69c11 0 20 8 22 19zM2176 898v1c0 8 -6 14 -13 14h-74
+c-6 0 -12 -5 -13 -11l-65 -416l-1 -2c0 -7 6 -14 14 -14h66c10 0 20 8 21 19zM392 764c-8 -51 -42 -57 -86 -57l-33 -1l17 107c1 7 7 11 13 11h19c45 0 79 -6 70 -60zM2304 1280v-1280c0 -70 -58 -128 -128 -128h-2048c-70 0 -128 58 -128 128v1280c0 70 58 128 128 128
+h2048c70 0 128 -58 128 -128z" />
+    <glyph glyph-name="birthday-cake" unicode="&#xf1fd;" horiz-adv-x="1792" 
+d="M1792 128v-384h-1792v384c98 0 150 44 191 79c34 30 57 49 108 49s73 -19 108 -49c41 -35 92 -79 191 -79c98 0 149 44 191 79c34 30 56 49 107 49s74 -19 108 -49c41 -35 93 -79 191 -79s150 44 191 79c34 30 57 49 108 49c50 0 73 -19 107 -49c41 -35 93 -79 191 -79z
+M1792 448v-192c-51 0 -73 19 -108 49c-41 35 -92 79 -190 79c-99 0 -150 -44 -191 -79c-35 -30 -57 -49 -108 -49s-74 19 -108 49c-41 35 -92 79 -191 79c-98 0 -149 -44 -191 -79c-34 -30 -56 -49 -107 -49s-74 19 -108 49c-41 35 -93 79 -191 79c-99 0 -150 -44 -191 -79
+c-34 -30 -57 -49 -108 -49v192c0 106 86 192 192 192h64v448h256v-448h256v448h256v-448h256v448h256v-448h64c106 0 192 -86 192 -192zM512 1312c0 -106 -57 -160 -128 -160s-128 57 -128 128c0 124 128 92 128 256c48 0 128 -118 128 -224zM1024 1312
+c0 -106 -57 -160 -128 -160s-128 57 -128 128c0 124 128 92 128 256c48 0 128 -118 128 -224zM1536 1312c0 -106 -57 -160 -128 -160s-128 57 -128 128c0 124 128 92 128 256c48 0 128 -118 128 -224z" />
+    <glyph glyph-name="comment" unicode="&#xf075;" horiz-adv-x="1792" 
+d="M1792 640c0 -354 -401 -640 -896 -640c-49 0 -98 3 -145 8c-131 -116 -287 -198 -460 -242c-36 -10 -75 -17 -114 -22c-22 -2 -43 14 -48 38v1c-5 25 12 40 27 58c63 71 135 131 182 298c-206 117 -338 298 -338 501c0 353 401 640 896 640s896 -286 896 -640z" />
+    <glyph glyph-name="bell" unicode="&#xf0f3;" horiz-adv-x="1664" 
+d="M848 -160c0 9 -7 16 -16 16c-79 0 -144 65 -144 144c0 9 -7 16 -16 16s-16 -7 -16 -16c0 -97 79 -176 176 -176c9 0 16 7 16 16zM182 128h1300c-179 202 -266 476 -266 832c0 129 -122 320 -384 320s-384 -191 -384 -320c0 -356 -87 -630 -266 -832zM1664 128
+c0 -70 -58 -128 -128 -128h-448c0 -141 -115 -256 -256 -256s-256 115 -256 256h-448c-70 0 -128 58 -128 128c148 125 320 349 320 832c0 192 159 402 424 441c-5 12 -8 25 -8 39c0 53 43 96 96 96s96 -43 96 -96c0 -14 -3 -27 -8 -39c265 -39 424 -249 424 -441
+c0 -483 172 -707 320 -832z" />
+    <glyph glyph-name="cc" unicode="&#xf20a;" horiz-adv-x="2048" 
+d="M785 528h207c-19 -211 -140 -339 -313 -339c-216 0 -347 166 -347 432c0 264 144 429 326 429c200 0 312 -124 329 -334h-203c-7 85 -49 134 -117 134c-75 0 -120 -80 -120 -238c0 -115 20 -223 129 -223c69 0 101 60 109 139zM1497 528h206
+c-19 -211 -139 -339 -312 -339c-216 0 -347 166 -347 432c0 264 144 429 326 429c200 0 312 -124 329 -334h-204c-6 85 -49 134 -116 134c-75 0 -120 -80 -120 -238c0 -115 19 -223 128 -223c69 0 102 60 110 139zM1856 647c0 268 -14 384 -76 468c-13 17 -34 28 -51 40
+c-63 46 -356 63 -697 63s-648 -17 -710 -63c-18 -13 -40 -23 -53 -40c-62 -83 -75 -200 -75 -468c0 -269 14 -385 75 -468c14 -19 35 -27 53 -41c62 -46 369 -65 710 -65s634 18 697 65c17 13 39 21 51 41c63 82 76 199 76 468zM2048 1408v-1536h-2048v1536h2048z" />
+    <glyph glyph-name="get-pocket" unicode="&#xf265;" horiz-adv-x="1720" 
+d="M1565 1408c87 0 155 -70 155 -156v-519c0 -479 -383 -861 -859 -861c-478 0 -861 382 -861 861v519c0 85 71 156 156 156h1409zM861 344c30 0 60 12 82 33l404 388c23 22 37 53 37 85c0 65 -53 118 -118 118c-31 0 -60 -12 -82 -33l-323 -310l-323 310
+c-22 21 -51 33 -81 33c-65 0 -118 -53 -118 -118c0 -32 13 -63 36 -85l405 -388c21 -21 51 -33 81 -33z" />
+    <glyph glyph-name="bell-slash-o" unicode="&#xf1f7;" horiz-adv-x="2019" 
+d="M1026 -160c0 9 -7 16 -16 16c-79 0 -144 65 -144 144c0 9 -7 16 -16 16s-16 -7 -16 -16c0 -97 79 -176 176 -176c9 0 16 7 16 16zM489 315l877 760c-50 105 -166 205 -356 205c-262 0 -384 -191 -384 -320c0 -256 -45 -470 -137 -645zM1842 128c0 -70 -58 -128 -128 -128
+h-448c0 -141 -115 -256 -256 -256s-255 114 -256 255l149 129h757c-111 125 -186 277 -227 459l111 97c51 -298 182 -458 298 -556zM1928 1520l84 -96c11 -14 10 -34 -3 -46l-1872 -1622c-13 -11 -34 -10 -45 4l-84 96c-11 14 -10 34 3 45l186 161c-12 20 -19 42 -19 66
+c148 125 320 349 320 832c0 192 159 402 424 441c-5 12 -8 25 -8 39c0 53 43 96 96 96s96 -43 96 -96c0 -14 -3 -27 -8 -39c172 -25 299 -122 367 -240l418 363c13 11 34 10 45 -4z" />
+    <glyph glyph-name="header" unicode="&#xf1dc;" horiz-adv-x="1668" 
+d="M1620 -128c-88 0 -177 7 -266 7c-88 0 -176 -7 -264 -7c-34 0 -50 37 -50 66c0 89 100 51 152 85c33 21 33 105 33 140l-1 391c0 11 0 21 -1 31c-16 5 -34 4 -50 4h-675c-17 0 -35 1 -51 -4c-1 -10 -1 -20 -1 -31l-1 -371c0 -38 0 -142 37 -164c52 -32 170 13 170 -77
+c0 -30 -14 -70 -49 -70c-93 0 -186 7 -278 7c-85 0 -170 -7 -255 -7c-33 0 -48 38 -48 66c0 87 92 51 141 85c32 22 33 108 33 143l-1 57v813c0 48 7 202 -38 229c-50 31 -157 -17 -157 73c0 29 13 70 48 70c92 0 185 -7 277 -7c84 0 169 7 253 7c36 0 50 -40 50 -70
+c0 -86 -99 -44 -148 -75c-35 -21 -35 -124 -35 -160l1 -320c0 -11 0 -21 1 -32c13 -3 26 -3 39 -3h699c12 0 25 0 38 3c1 11 1 21 1 32l1 320c0 37 0 139 -35 160c-50 30 -150 -10 -150 75c0 30 14 70 50 70c88 0 176 -7 264 -7c86 0 172 7 258 7c36 0 50 -40 50 -70
+c0 -87 -103 -43 -153 -74c-34 -22 -35 -125 -35 -161l1 -943c0 -33 2 -120 34 -140c51 -32 159 9 159 -78c0 -29 -13 -70 -48 -70z" />
+    <glyph glyph-name="bluetooth-b" unicode="&#xf294;" horiz-adv-x="944" 
+d="M556 113l173 172l-173 172v-344zM556 823l173 172l-173 172v-344zM588 640l356 -356l-539 -540v711l-297 -296l-108 108l372 373l-372 373l108 108l297 -296v711l539 -540z" />
+    <glyph glyph-name="linux" unicode="&#xf17c;" horiz-adv-x="1523" 
+d="M657 1125c-20 -2 -13 -20 -24 -20c-10 -1 -8 22 24 20zM744 1111c-10 -3 -11 16 -29 11c29 13 39 -7 29 -11zM393 684c-9 3 -7 -15 -16 -29c-7 -13 -25 -23 -11 -25c5 -1 19 11 25 25c5 17 10 26 2 29zM1248 325c0 18 -39 35 -55 42c27 90 15 126 -3 211
+c-14 64 -73 151 -119 178c12 -10 34 -39 57 -83c40 -75 80 -186 54 -278c-10 -36 -34 -41 -50 -42c-70 -8 -29 84 -58 209c-33 140 -67 150 -75 161c-41 182 -86 164 -99 232c-11 61 53 111 -34 128c-27 5 -65 32 -80 34s-23 101 33 104c55 4 65 -62 55 -88
+c-16 -26 1 -36 28 -27c22 7 8 65 13 73c-14 84 -49 96 -85 103c-138 -11 -76 -163 -90 -149c-20 21 -78 2 -78 15c1 78 -25 123 -61 124c-40 1 -56 -55 -58 -87c-3 -30 17 -93 32 -88c10 3 27 23 9 22c-9 0 -23 22 -25 48c-1 26 9 52 43 51c39 -1 39 -79 35 -82
+c-13 -9 -29 -26 -31 -29c-13 -21 -38 -27 -48 -36c-17 -18 -21 -38 -8 -45c46 -26 31 -56 95 -58c42 -2 73 6 102 15c22 7 93 22 108 48c7 11 15 11 20 8c10 -5 12 -24 -13 -30c-35 -10 -70 -29 -102 -41c-31 -13 -41 -18 -70 -23c-66 -12 -115 24 -71 -19
+c15 -14 29 -23 67 -22c84 3 177 104 186 59c2 -10 -26 -22 -48 -33c-78 -38 -133 -114 -183 -88c-45 24 -90 135 -89 85c1 -77 -101 -145 -54 -233c-31 -8 -100 -155 -110 -231c-6 -44 4 -98 -7 -128c-15 -44 -83 42 -61 147c4 18 0 22 -5 13c-27 -49 -12 -118 10 -166
+c9 -21 32 -30 49 -48c35 -40 173 -142 197 -167c31 -29 22 -97 -42 -104c33 -62 65 -68 64 -169c38 20 23 64 7 92c-11 20 -25 29 -22 34c2 3 22 20 33 7c34 -38 98 -45 166 -36c69 8 143 32 177 87c16 26 27 35 34 30c8 -4 11 -22 10 -52c-1 -32 -14 -65 -23 -92
+c-9 -31 -12 -52 18 -53c8 56 24 111 28 167c5 64 -41 182 9 241c13 16 29 18 51 18c3 80 126 74 167 41zM620 1152c4 25 -8 43 -14 45c-12 3 -10 -15 -4 -13c4 0 9 -6 7 -15c-2 -12 -1 -20 8 -20c1 0 3 0 3 3zM1039 955c-4 19 -18 12 -34 22c-19 12 -23 32 -30 25
+c-21 -23 26 -71 46 -75c12 -2 21 14 18 28zM861 1168c1 24 -20 36 -25 35c-13 -1 -9 -7 -3 -9c8 -2 16 -16 18 -31c0 -2 10 2 10 5zM915 1401c1 5 -12 11 -21 18c-8 8 -16 15 -24 15c-20 -2 -10 -23 -13 -33c-4 -11 -19 -20 -9 -28c9 -7 15 11 34 18c5 2 28 -1 33 10z
+M1480 60c123 -76 -46 -139 -119 -176c-57 -29 -133 -93 -161 -120c-21 -20 -108 -30 -157 -5c-57 29 -27 75 -115 78c-44 1 -87 1 -130 1c-38 -1 -76 -3 -115 -4c-132 -3 -145 -88 -230 -85c-58 2 -131 48 -257 74c-88 18 -173 23 -191 62s22 83 25 121c3 51 -38 120 -8 146
+c26 23 81 6 117 26c38 22 54 39 54 86c14 -48 -1 -87 -32 -106c-19 -12 -54 -18 -83 -15c-23 2 -37 -1 -43 -10c-9 -11 -6 -31 5 -57s24 -43 22 -75c-1 -32 -37 -70 -31 -97c2 -10 12 -19 37 -26c40 -11 113 -22 184 -39c79 -20 161 -56 212 -49c152 21 65 184 41 223
+c-129 202 -214 334 -282 282c-17 -14 -18 34 -17 53c3 66 36 90 56 141c38 97 67 208 125 265c43 56 111 147 124 195c-11 104 -14 214 -16 310c-2 103 14 193 130 256c28 15 65 21 104 21c69 1 146 -19 195 -55c78 -58 127 -181 121 -269c-4 -69 8 -140 30 -214
+c26 -87 67 -148 133 -218c79 -84 141 -249 159 -354c16 -98 -6 -159 -27 -162c-32 -5 -52 -106 -152 -102c-64 3 -70 41 -88 74c-29 51 -58 35 -69 -19c-6 -27 -2 -67 7 -97c18 -63 12 -122 1 -195c-21 -138 97 -164 176 -98c78 65 95 75 193 109c149 51 99 96 19 123
+c-72 24 -75 145 -49 168c6 -130 74 -149 102 -167z" />
+    <glyph glyph-name="table" unicode="&#xf0ce;" horiz-adv-x="1664" 
+d="M512 160v192c0 18 -14 32 -32 32h-320c-18 0 -32 -14 -32 -32v-192c0 -18 14 -32 32 -32h320c18 0 32 14 32 32zM512 544v192c0 18 -14 32 -32 32h-320c-18 0 -32 -14 -32 -32v-192c0 -18 14 -32 32 -32h320c18 0 32 14 32 32zM1024 160v192c0 18 -14 32 -32 32h-320
+c-18 0 -32 -14 -32 -32v-192c0 -18 14 -32 32 -32h320c18 0 32 14 32 32zM512 928v192c0 18 -14 32 -32 32h-320c-18 0 -32 -14 -32 -32v-192c0 -18 14 -32 32 -32h320c18 0 32 14 32 32zM1024 544v192c0 18 -14 32 -32 32h-320c-18 0 -32 -14 -32 -32v-192
+c0 -18 14 -32 32 -32h320c18 0 32 14 32 32zM1536 160v192c0 18 -14 32 -32 32h-320c-18 0 -32 -14 -32 -32v-192c0 -18 14 -32 32 -32h320c18 0 32 14 32 32zM1024 928v192c0 18 -14 32 -32 32h-320c-18 0 -32 -14 -32 -32v-192c0 -18 14 -32 32 -32h320c18 0 32 14 32 32z
+M1536 544v192c0 18 -14 32 -32 32h-320c-18 0 -32 -14 -32 -32v-192c0 -18 14 -32 32 -32h320c18 0 32 14 32 32zM1536 928v192c0 18 -14 32 -32 32h-320c-18 0 -32 -14 -32 -32v-192c0 -18 14 -32 32 -32h320c18 0 32 14 32 32zM1664 1248v-1088c0 -88 -72 -160 -160 -160
+h-1344c-88 0 -160 72 -160 160v1088c0 88 72 160 160 160h1344c88 0 160 -72 160 -160z" />
+    <glyph glyph-name="handshake-o" unicode="&#xf2b5;" horiz-adv-x="2304" 
+d="M192 384c84 0 84 128 0 128s-84 -128 0 -128zM1665 442c-79 103 -156 208 -246 302l-125 -140c-110 -125 -307 -122 -414 6c-76 92 -76 224 2 315l177 206c-62 32 -137 21 -204 21c-59 0 -116 -24 -158 -66l-158 -158h-155v-544c44 0 84 6 119 -28l297 -292
+c61 -59 140 -111 227 -111c45 0 93 15 125 47c75 -26 162 16 185 93c48 -4 92 11 127 44c23 21 53 63 50 96c9 -9 31 -10 43 -10c119 0 181 125 108 219zM1824 384h96v512h-93l-157 180c-42 48 -105 76 -169 76h-167c-56 0 -110 -25 -146 -67l-209 -243
+c-37 -44 -37 -106 -1 -150c57 -68 162 -69 221 -3l193 218c46 51 130 3 109 -62c38 -44 79 -87 116 -131c50 -62 98 -127 147 -190c31 -40 54 -88 60 -140zM2112 384c84 0 84 128 0 128s-84 -128 0 -128zM2304 960v-640c0 -35 -29 -64 -64 -64h-434
+c-36 -87 -115 -145 -207 -158c-43 -63 -109 -111 -183 -127c-55 -70 -144 -112 -233 -106c-165 -93 -351 -12 -474 109l-287 282h-358c-35 0 -64 29 -64 64v672c0 35 29 64 64 64h421c116 116 196 224 370 224h117c65 0 128 -20 181 -56c53 36 116 56 181 56h167
+c190 0 269 -124 384 -256h355c35 0 64 -29 64 -64z" />
+    <glyph glyph-name="spinner" unicode="&#xf110;" horiz-adv-x="1664" 
+d="M462 142c0 -70 -57 -128 -128 -128c-70 0 -128 58 -128 128c0 71 58 128 128 128c71 0 128 -57 128 -128zM960 -64c0 -71 -57 -128 -128 -128s-128 57 -128 128s57 128 128 128s128 -57 128 -128zM256 640c0 -71 -57 -128 -128 -128s-128 57 -128 128s57 128 128 128
+s128 -57 128 -128zM1458 142c0 -70 -58 -128 -128 -128c-71 0 -128 58 -128 128c0 71 57 128 128 128c70 0 128 -57 128 -128zM494 1138c0 -88 -72 -160 -160 -160s-160 72 -160 160s72 160 160 160s160 -72 160 -160zM1664 640c0 -71 -57 -128 -128 -128s-128 57 -128 128
+s57 128 128 128s128 -57 128 -128zM1024 1344c0 -106 -86 -192 -192 -192s-192 86 -192 192s86 192 192 192s192 -86 192 -192zM1554 1138c0 -124 -101 -224 -224 -224c-124 0 -224 100 -224 224c0 123 100 224 224 224c123 0 224 -101 224 -224z" />
+    <glyph glyph-name="snapchat" unicode="&#xf2ab;" 
+d="M1279 388c0 14 -8 24 -22 27c-91 20 -160 83 -198 167c-3 8 -7 16 -7 25c0 45 125 36 125 100c0 27 -33 44 -57 44c-23 0 -41 -16 -63 -16c-4 0 -8 1 -12 2c2 38 5 76 5 114c0 35 -2 83 -17 114c-48 104 -141 165 -255 165c-125 0 -220 -46 -275 -165
+c-15 -31 -17 -79 -17 -114c0 -38 3 -76 5 -114c-4 -2 -9 -2 -14 -2c-23 0 -41 15 -62 15c-25 0 -56 -16 -56 -44c0 -62 125 -54 125 -99c0 -9 -4 -17 -7 -25c-39 -84 -106 -147 -198 -167c-14 -3 -22 -13 -22 -27c0 -46 106 -63 137 -68c9 -24 5 -66 41 -66c25 0 50 9 77 9
+c105 0 133 -95 255 -95c127 0 151 95 257 95c27 0 52 -8 78 -8c35 0 31 42 40 65c31 5 137 22 137 68zM1536 640c0 -424 -344 -768 -768 -768s-768 344 -768 768s344 768 768 768s768 -344 768 -768z" />
+    <glyph glyph-name="tint" unicode="&#xf043;" horiz-adv-x="1024" 
+d="M512 384c0 25 -8 49 -20 69c-13 20 -66 88 -87 155c-3 11 -13 16 -21 16s-18 -5 -21 -16c-21 -67 -74 -135 -87 -155c-12 -20 -20 -44 -20 -69c0 -71 57 -128 128 -128s128 57 128 128zM1024 512c0 -283 -229 -512 -512 -512s-512 229 -512 512c0 101 31 195 81 275
+c51 80 265 351 346 621c13 43 53 64 85 64s73 -21 85 -64c81 -270 295 -541 346 -621s81 -174 81 -275z" />
+    <glyph glyph-name="connectdevelop" unicode="&#xf20e;" horiz-adv-x="2048" 
+d="M2048 641c0 -28 -20 -51 -46 -56l-205 -356c2 -6 3 -12 3 -18c0 -27 -19 -50 -45 -55l-193 -337c2 -5 3 -10 3 -16c0 -31 -25 -57 -57 -57c-16 0 -31 7 -41 18h-400c-10 -12 -26 -20 -43 -20s-33 8 -43 20h-399c-10 -12 -25 -20 -43 -20c-31 0 -57 25 -57 57
+c0 7 2 14 4 20l-193 335c-26 5 -45 28 -45 55c0 7 1 12 3 18l-206 356c-26 6 -45 29 -45 56c0 28 20 51 47 56l199 344c0 2 -1 4 -1 6c0 23 14 42 34 51l209 363c-2 5 -4 12 -4 18c0 32 26 57 57 57c18 0 33 -8 44 -21h396c10 13 25 21 43 21s33 -8 43 -21h398
+c11 13 26 21 44 21c31 0 57 -25 57 -57c0 -6 -2 -12 -4 -18l207 -358c30 -1 55 -26 55 -56c0 -10 -3 -19 -7 -27l187 -324c25 -5 44 -28 44 -55zM1063 -158h389l-342 354h-143l-342 -354h360c10 9 24 16 39 16s29 -7 39 -16zM112 654c1 -4 1 -8 1 -13s0 -10 -2 -15l208 -360
+c5 -1 10 -4 15 -6l188 199v347l-187 194c-9 -6 -19 -9 -29 -10zM986 1438h-388l190 -200l554 200h-280c-10 -10 -23 -16 -38 -16s-28 6 -38 16zM1689 226c1 4 3 8 5 11l-64 68l-17 -79h76zM1583 226l22 105l-252 266l-296 -307l63 -64h463zM1495 -142l16 28l65 310h-427
+l333 -343c4 2 8 4 13 5zM578 -158h5l342 354h-373v-335l4 -6c9 -3 16 -7 22 -13zM552 226h402l64 66l-309 321l-157 -166v-221zM359 226h163v189l-168 -177c2 -4 4 -8 5 -12zM358 1051c0 -1 1 -3 1 -4c0 -11 -3 -21 -8 -29l171 -177v269zM552 1121v-311l153 -157l297 314
+l-223 236zM556 1425l-4 -8v-264l205 74l-191 201c-3 -1 -6 -2 -10 -3zM1447 1438h-16l-621 -224l213 -225zM1023 946l-297 -315l311 -319l296 307zM688 634l-136 141v-284zM1038 270l-42 -44h85zM1374 618l238 -251l132 624l-3 5l-1 1zM1718 1018c-5 8 -8 18 -8 29v2
+l-216 376c-5 1 -9 3 -13 5l-437 -463l310 -327zM522 1142v223l-163 -282zM522 196h-163l163 -283v283zM1607 196l-48 -227l130 227h-82zM1729 266l207 361c-1 5 -2 9 -2 14c0 6 2 11 3 16l-171 296l-129 -612l77 -82c5 3 10 5 15 7z" />
+    <glyph glyph-name="chrome" unicode="&#xf268;" horiz-adv-x="1792" 
+d="M893 1536c153 1 309 -38 451 -120c157 -91 276 -222 352 -372l-742 39c-210 12 -410 -106 -479 -304l-276 424c172 214 430 332 694 333zM146 1131l337 -663c95 -187 296 -301 504 -262l-230 -451c-429 66 -757 437 -757 885c0 181 54 350 146 491zM1732 962
+c157 -404 0 -874 -388 -1098c-157 -91 -330 -128 -498 -119l405 623c115 177 113 408 -24 568zM896 942c167 0 302 -135 302 -302s-135 -302 -302 -302s-302 135 -302 302s135 302 302 302z" />
+    <glyph glyph-name="trademark" unicode="&#xf25c;" horiz-adv-x="1972" 
+d="M857 992v-117c0 -17 -15 -31 -32 -31h-298v-812c0 -18 -14 -32 -31 -32h-135c-18 0 -32 14 -32 32v812h-297c-18 0 -32 14 -32 31v117c0 18 14 32 32 32h793c17 0 32 -14 32 -32zM1895 995l77 -961c1 -9 -2 -17 -8 -24c-6 -6 -14 -10 -23 -10h-134c-16 0 -30 13 -31 29
+l-46 588l-189 -425c-5 -12 -16 -19 -29 -19h-120c-12 0 -23 7 -29 19l-188 427l-45 -590c-1 -16 -15 -29 -31 -29h-135c-9 0 -17 4 -23 10c-6 7 -9 15 -9 24l78 961c1 16 15 29 31 29h142c13 0 24 -8 29 -19l220 -520c7 -16 14 -34 20 -51c7 17 13 35 20 51l221 520
+c5 11 16 19 29 19h141c17 0 31 -13 32 -29z" />
+    <glyph glyph-name="align-right" unicode="&#xf038;" horiz-adv-x="1792" 
+d="M1792 192v-128c0 -35 -29 -64 -64 -64h-1664c-35 0 -64 29 -64 64v128c0 35 29 64 64 64h1664c35 0 64 -29 64 -64zM1792 576v-128c0 -35 -29 -64 -64 -64h-1280c-35 0 -64 29 -64 64v128c0 35 29 64 64 64h1280c35 0 64 -29 64 -64zM1792 960v-128
+c0 -35 -29 -64 -64 -64h-1536c-35 0 -64 29 -64 64v128c0 35 29 64 64 64h1536c35 0 64 -29 64 -64zM1792 1344v-128c0 -35 -29 -64 -64 -64h-1152c-35 0 -64 29 -64 64v128c0 35 29 64 64 64h1152c35 0 64 -29 64 -64z" />
+    <glyph glyph-name="bandcamp" unicode="&#xf2d5;" horiz-adv-x="1792" 
+d="M1070 358l306 564h-654l-306 -564h654zM1792 640c0 -495 -401 -896 -896 -896s-896 401 -896 896s401 896 896 896s896 -401 896 -896z" />
+    <glyph glyph-name="long-arrow-down" unicode="&#xf175;" horiz-adv-x="767" 
+d="M765 237c5 -12 3 -25 -5 -35l-350 -384c-6 -6 -14 -10 -23 -10s-18 4 -24 10l-355 384c-8 10 -10 23 -5 35c5 11 16 19 29 19h224v1248c0 18 14 32 32 32h192c18 0 32 -14 32 -32v-1248h224c13 0 24 -7 29 -19z" />
+    <glyph glyph-name="beer" unicode="&#xf0fc;" horiz-adv-x="1600" 
+d="M576 640v384h-256v-256c0 -71 57 -128 128 -128h128zM1600 192v-192h-1152v192l128 192h-128c-212 0 -384 172 -384 384v320l-64 64l32 128h480l32 128h960l32 -192l-64 -32v-800z" />
+    <glyph glyph-name="th-list" unicode="&#xf00b;" horiz-adv-x="1792" 
+d="M512 288v-192c0 -53 -43 -96 -96 -96h-320c-53 0 -96 43 -96 96v192c0 53 43 96 96 96h320c53 0 96 -43 96 -96zM512 800v-192c0 -53 -43 -96 -96 -96h-320c-53 0 -96 43 -96 96v192c0 53 43 96 96 96h320c53 0 96 -43 96 -96zM1792 288v-192c0 -53 -43 -96 -96 -96h-960
+c-53 0 -96 43 -96 96v192c0 53 43 96 96 96h960c53 0 96 -43 96 -96zM512 1312v-192c0 -53 -43 -96 -96 -96h-320c-53 0 -96 43 -96 96v192c0 53 43 96 96 96h320c53 0 96 -43 96 -96zM1792 800v-192c0 -53 -43 -96 -96 -96h-960c-53 0 -96 43 -96 96v192c0 53 43 96 96 96
+h960c53 0 96 -43 96 -96zM1792 1312v-192c0 -53 -43 -96 -96 -96h-960c-53 0 -96 43 -96 96v192c0 53 43 96 96 96h960c53 0 96 -43 96 -96z" />
+    <glyph glyph-name="eraser" unicode="&#xf12d;" horiz-adv-x="1920" 
+d="M896 128l336 384h-768l-336 -384h768zM1909 1205c20 -46 12 -99 -21 -137l-896 -1024c-24 -28 -59 -44 -96 -44h-768c-50 0 -96 29 -117 75c-20 46 -12 99 21 137l896 1024c24 28 59 44 96 44h768c50 0 96 -29 117 -75z" />
+    <glyph glyph-name="codepen" 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
+c0 -25 -13 -50 -34 -64l-819 -546c-13 -8 -28 -13 -43 -13s-30 5 -43 13l-819 546c-21 14 -34 39 -34 64v546c0 25 13 50 34 64l819 546c13 8 28 13 43 13s30 -5 43 -13l819 -546c21 -14 34 -39 34 -64z" />
+    <glyph glyph-name="slideshare" unicode="&#xf1e7;" horiz-adv-x="1758" 
+d="M856 796c0 -111 -97 -202 -216 -202s-216 91 -216 202c0 112 97 202 216 202s216 -90 216 -202zM1358 796c0 -111 -96 -202 -216 -202c-119 0 -216 91 -216 202c0 112 97 202 216 202c120 0 216 -90 216 -202zM1583 616v667c0 115 -37 160 -143 160h-1112
+c-111 0 -142 -38 -142 -160v-673c237 -124 440 -102 551 -98c47 1 77 -8 95 -27c3 -3 6 -6 10 -9c21 -20 41 -36 61 -51c4 55 35 90 118 87c113 -5 321 -27 562 104zM1746 621c-64 -79 -186 -176 -372 -252c197 -671 -481 -778 -470 -434c0 -6 -1 185 -1 327
+c-15 3 -30 7 -48 11c0 -143 -1 -344 -1 -338c11 -344 -667 -237 -470 434c-186 76 -308 173 -372 252c-32 48 3 99 56 62c7 -5 15 -10 22 -15v694c0 96 72 174 161 174h1257c89 0 161 -78 161 -174v-694l21 15c53 37 88 -14 56 -62z" />
+    <glyph glyph-name="square-o" unicode="&#xf096;" horiz-adv-x="1408" 
+d="M1120 1280h-832c-88 0 -160 -72 -160 -160v-832c0 -88 72 -160 160 -160h832c88 0 160 72 160 160v832c0 88 -72 160 -160 160zM1408 1120v-832c0 -159 -129 -288 -288 -288h-832c-159 0 -288 129 -288 288v832c0 159 129 288 288 288h832c159 0 288 -129 288 -288z" />
+    <glyph glyph-name="hourglass-start" unicode="&#xf251;" 
+d="M1408 1408c0 -370 -177 -638 -373 -768c196 -130 373 -398 373 -768h96c18 0 32 -14 32 -32v-64c0 -18 -14 -32 -32 -32h-1472c-18 0 -32 14 -32 32v64c0 18 14 32 32 32h96c0 370 177 638 373 768c-196 130 -373 398 -373 768h-96c-18 0 -32 14 -32 32v64
+c0 18 14 32 32 32h1472c18 0 32 -14 32 -32v-64c0 -18 -14 -32 -32 -32h-96zM1280 1408h-1024c0 -44 3 -87 9 -128h1006c6 41 9 84 9 128zM1280 -128c0 359 -198 624 -397 704h-230c-199 -80 -397 -345 -397 -704h1024z" />
+    <glyph glyph-name="superpowers" unicode="&#xf2dd;" horiz-adv-x="1792" 
+d="M1473 607c18 320 -227 585 -544 604c-315 19 -594 -221 -612 -538c-18 -320 227 -585 545 -604c315 -19 594 220 611 538zM1792 1536l-349 -348c159 -155 245 -371 231 -593c-22 -372 -308 -669 -675 -719l-999 -132l347 347c-159 155 -244 371 -231 593
+c23 373 308 670 676 720c333 44 667 88 1000 132z" />
+    <glyph glyph-name="fire" unicode="&#xf06d;" horiz-adv-x="1408" 
+d="M1408 -160v-64c0 -17 -15 -32 -32 -32h-1344c-17 0 -32 15 -32 32v64c0 17 15 32 32 32h1344c17 0 32 -15 32 -32zM1152 896c0 -383 -448 -417 -448 -672c0 -70 35 -163 67 -224l-4 1l1 -1c-276 127 -512 302 -512 640c0 383 448 417 448 672c0 70 -35 163 -66 224l3 -1
+l-1 1c276 -127 512 -302 512 -640z" />
+    <glyph glyph-name="sellsy" unicode="&#xf213;" horiz-adv-x="2048" 
+d="M1500 165v733c0 28 -23 51 -50 51h-93c-27 0 -50 -23 -50 -51v-733c0 -27 23 -50 50 -50h93c27 0 50 23 50 50zM1216 165v531c0 27 -23 50 -50 50h-101c-27 0 -50 -23 -50 -50v-531c0 -27 23 -50 50 -50h101c27 0 50 23 50 50zM924 165v429c0 27 -23 50 -50 50h-101
+c-27 0 -50 -23 -50 -50v-429c0 -27 23 -50 50 -50h101c27 0 50 23 50 50zM632 165v362c0 27 -23 50 -50 50h-101c-27 0 -50 -23 -50 -50v-362c0 -27 23 -50 50 -50h101c27 0 50 23 50 50zM2048 311c0 -222 -181 -402 -402 -402h-1244c-221 0 -402 180 -402 402
+c0 155 91 297 231 363c-7 24 -10 49 -10 73c0 151 123 274 274 274c66 0 130 -24 180 -67c60 244 280 417 532 417c302 0 548 -246 548 -548c0 -41 -4 -82 -14 -122c180 -44 307 -206 307 -390z" />
+    <glyph glyph-name="fast-forward" unicode="&#xf050;" horiz-adv-x="1792" 
+d="M45 -115c-25 -25 -45 -16 -45 19v1472c0 35 20 44 45 19l710 -710c6 -6 10 -12 13 -19v710c0 35 20 44 45 19l710 -710c6 -6 10 -12 13 -19v678c0 35 29 64 64 64h128c35 0 64 -29 64 -64v-1408c0 -35 -29 -64 -64 -64h-128c-35 0 -64 29 -64 64v678
+c-3 -7 -7 -13 -13 -19l-710 -710c-25 -25 -45 -16 -45 19v710c-3 -7 -7 -13 -13 -19z" />
+    <glyph glyph-name="bell-slash" unicode="&#xf1f6;" horiz-adv-x="2019" 
+d="M1544 684c51 -298 182 -458 298 -556c0 -70 -58 -128 -128 -128h-448c0 -141 -115 -256 -256 -256s-255 114 -256 255zM1010 -176c9 0 16 7 16 16s-7 16 -16 16c-79 0 -144 65 -144 144c0 9 -7 16 -16 16s-16 -7 -16 -16c0 -97 79 -176 176 -176zM2012 1424
+c11 -14 10 -34 -3 -46l-1872 -1622c-13 -11 -34 -10 -45 4l-84 96c-11 14 -10 34 3 45l186 161c-12 20 -19 42 -19 66c148 125 320 349 320 832c0 192 159 402 424 441c-5 12 -8 25 -8 39c0 53 43 96 96 96s96 -43 96 -96c0 -14 -3 -27 -8 -39c172 -25 299 -122 367 -240
+l418 363c13 11 34 10 45 -4z" />
+    <glyph glyph-name="cubes" unicode="&#xf1b3;" horiz-adv-x="2176" 
+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-416
+c0 -48 -27 -93 -71 -114l-448 -224c-18 -10 -37 -14 -57 -14s-39 4 -57 14l-448 224c-3 1 -5 2 -7 4c-2 -2 -4 -3 -7 -4l-448 -224c-18 -10 -37 -14 -57 -14s-39 4 -57 14l-448 224c-44 21 -71 66 -71 114v416c0 51 31 97 78 118l434 186v400c0 51 31 97 78 118l448 192
+c16 7 33 10 50 10s34 -3 50 -10l448 -192c47 -21 78 -67 78 -118v-400l434 -186c48 -21 78 -67 78 -118z" />
+    <glyph glyph-name="inr" unicode="&#xf156;" horiz-adv-x="898" 
+d="M898 1066v-102c0 -18 -14 -32 -32 -32h-168c-31 -192 -178 -317 -405 -344c149 -159 308 -351 459 -536c8 -9 10 -23 4 -34c-5 -11 -16 -18 -29 -18h-195c-10 0 -19 4 -25 12c-161 193 -309 370 -498 571c-6 6 -9 14 -9 22v127c0 17 14 32 32 32h112
+c176 0 286 59 315 168h-427c-18 0 -32 14 -32 32v102c0 18 14 32 32 32h413c-38 75 -128 113 -268 113h-145c-18 0 -32 15 -32 32v133c0 18 14 32 32 32h832c18 0 32 -14 32 -32v-102c0 -18 -14 -32 -32 -32h-233c32 -41 53 -89 64 -144h171c18 0 32 -14 32 -32z" />
+    <glyph glyph-name="hashtag" unicode="&#xf292;" horiz-adv-x="1728" 
+d="M959 512l64 256h-254l-64 -256h254zM1727 1016l-56 -224c-4 -14 -16 -24 -31 -24h-327l-64 -256h311c10 0 19 -5 25 -12c6 -8 9 -18 6 -28l-56 -224c-3 -14 -16 -24 -31 -24h-327l-81 -328c-4 -14 -17 -24 -31 -24h-224c-10 0 -20 5 -26 12c-6 8 -8 18 -6 28l78 312h-254
+l-81 -328c-4 -14 -17 -24 -31 -24h-225c-9 0 -19 5 -25 12c-6 8 -8 18 -6 28l78 312h-311c-10 0 -19 5 -25 12c-6 8 -8 18 -6 28l56 224c4 14 16 24 31 24h327l64 256h-311c-10 0 -19 5 -25 12c-6 8 -9 18 -6 28l56 224c3 14 16 24 31 24h327l81 328c4 14 17 24 32 24h224
+c9 0 19 -5 25 -12c6 -8 8 -18 6 -28l-78 -312h254l81 328c4 14 17 24 32 24h224c9 0 19 -5 25 -12c6 -8 8 -18 6 -28l-78 -312h311c10 0 19 -5 25 -12c6 -8 8 -18 6 -28z" />
+    <glyph glyph-name="file-text-o" unicode="&#xf0f6;" 
+d="M1468 1156c37 -37 68 -111 68 -164v-1152c0 -53 -43 -96 -96 -96h-1344c-53 0 -96 43 -96 96v1600c0 53 43 96 96 96h896c53 0 127 -31 164 -68zM1024 1400v-376h376c-6 17 -15 34 -22 41l-313 313c-7 7 -24 16 -41 22zM1408 -128v1024h-416c-53 0 -96 43 -96 96v416
+h-768v-1536h1280zM384 736c0 18 14 32 32 32h704c18 0 32 -14 32 -32v-64c0 -18 -14 -32 -32 -32h-704c-18 0 -32 14 -32 32v64zM1120 512c18 0 32 -14 32 -32v-64c0 -18 -14 -32 -32 -32h-704c-18 0 -32 14 -32 32v64c0 18 14 32 32 32h704zM1120 256c18 0 32 -14 32 -32
+v-64c0 -18 -14 -32 -32 -32h-704c-18 0 -32 14 -32 32v64c0 18 14 32 32 32h704z" />
+    <glyph glyph-name="nextcloud" unicode="&#xf306;" horiz-adv-x="1792" 
+d="M896 1049c225 0 409 -184 409 -409s-184 -409 -409 -409s-409 184 -409 409s184 409 409 409zM896 891c-139 0 -251 -112 -251 -251s112 -251 251 -251s251 112 251 251s-112 251 -251 251zM265 905c146 0 265 -119 265 -265s-119 -265 -265 -265s-265 119 -265 265
+s119 265 265 265zM265 748c-60 0 -107 -48 -107 -108s47 -108 107 -108s108 48 108 108s-48 108 -108 108zM1527 905c146 0 265 -119 265 -265s-119 -265 -265 -265s-265 119 -265 265s119 265 265 265zM1527 748c-60 0 -108 -48 -108 -108s48 -108 108 -108s107 48 107 108
+s-47 108 -107 108z" />
+    <glyph glyph-name="hand-o-left" unicode="&#xf0a5;" horiz-adv-x="1792" 
+d="M1376 128h32v640h-32c-106 0 -177 90 -241 163c-41 46 -79 92 -112 145c-14 22 -26 45 -38 68s-62 136 -89 136c-85 0 -160 -32 -160 -128c0 -128 96 -193 96 -256h-576c-67 0 -128 -60 -128 -128c0 -69 59 -128 128 -128h331c-21 -24 -35 -71 -35 -103
+c0 -47 19 -87 53 -119c-12 -21 -18 -45 -18 -69c0 -46 23 -103 65 -126c-3 -18 -4 -37 -4 -56c0 -118 73 -167 184 -167c199 0 369 128 544 128zM1664 192c0 35 -29 64 -64 64s-64 -29 -64 -64s29 -64 64 -64s64 29 64 64zM1792 768v-640c0 -71 -57 -128 -128 -128h-288
+c-63 0 -162 -37 -223 -59c-102 -37 -207 -69 -317 -69c-184 0 -318 104 -317 295l1 5c-40 50 -61 114 -61 178c0 14 1 29 3 43c-21 37 -34 77 -37 119h-169c-140 0 -256 117 -256 257c0 138 118 255 256 255h374c-15 41 -22 84 -22 128c0 169 129 256 288 256
+c134 0 177 -171 235 -264c30 -47 64 -88 100 -129c29 -33 97 -119 145 -119h288c71 0 128 -57 128 -128z" />
+    <glyph glyph-name="vimeo" unicode="&#xf27d;" horiz-adv-x="1628" 
+d="M1627 1018c-7 -158 -118 -375 -332 -651c-222 -287 -408 -431 -562 -431c-95 0 -175 88 -240 263c-44 160 -88 321 -132 482c-48 175 -101 262 -157 262c-12 0 -54 -25 -127 -76l-77 98c80 71 159 143 238 212c106 94 187 141 241 146c127 12 204 -74 234 -259
+c31 -200 54 -325 66 -373c37 -166 76 -249 120 -249c34 0 85 53 154 161c68 108 104 190 109 246c9 93 -27 139 -109 139c-39 0 -79 -9 -121 -26c80 262 233 389 459 382c167 -5 246 -114 236 -326z" />
+    <glyph glyph-name="mastodon-alt" unicode="&#xf2e2;" 
+d="M766 1408h5c211 -2 413 -25 531 -79c0 0 234 -105 234 -462c0 0 3 -263 -33 -446c-23 -116 -202 -243 -408 -268c-108 -13 -214 -25 -327 -20c-185 8 -330 45 -330 45c0 -18 1 -36 3 -52c24 -182 181 -193 329 -198c150 -5 284 37 284 37l6 -135s-105 -57 -292 -67
+c-103 -6 -230 3 -379 42c-323 85 -380 430 -388 779c-3 104 -1 201 -1 283c0 357 235 462 235 462c118 54 320 77 531 79v0zM350 839c-64 0 -115 -52 -115 -116s51 -115 115 -115s116 51 116 115s-52 116 -116 116v0zM768 839c-64 0 -116 -52 -116 -116s52 -115 116 -115
+s116 51 116 115s-52 116 -116 116v0zM1186 839c-64 0 -116 -52 -116 -116s52 -115 116 -115s115 51 115 115s-51 116 -115 116v0z" />
+    <glyph glyph-name="strikethrough" unicode="&#xf0cc;" horiz-adv-x="1792" 
+d="M1760 640c18 0 32 -14 32 -32v-64c0 -18 -14 -32 -32 -32h-1728c-18 0 -32 14 -32 32v64c0 18 14 32 32 32h1728zM483 704c-19 24 -36 51 -51 80c-32 65 -48 128 -48 188c0 122 45 224 134 309s220 127 393 127c38 0 93 -7 167 -19c44 -8 103 -24 177 -48
+c7 -26 14 -66 21 -118c9 -79 14 -140 14 -183c0 -14 -2 -29 -5 -45l-12 -3l-84 6l-14 2c-34 101 -69 169 -103 205c-59 61 -130 91 -210 91c-76 0 -137 -20 -182 -59s-67 -88 -67 -146c0 -49 22 -95 66 -140s137 -88 279 -129c48 -14 105 -36 173 -66c36 -17 68 -34 95 -52
+h-743zM990 448h411c5 -28 7 -59 7 -92c0 -72 -13 -143 -41 -212c-15 -37 -38 -71 -71 -104c-24 -23 -60 -50 -109 -81c-50 -30 -100 -53 -153 -66c-53 -14 -120 -21 -203 -21c-55 0 -121 2 -195 23l-140 40c-39 11 -62 20 -72 28c-4 4 -8 11 -8 22v13c0 8 2 60 -2 156
+c-2 50 2 85 2 105v44l102 2c37 -85 54 -136 65 -154c24 -39 51 -70 80 -94s64 -43 105 -57c40 -15 85 -22 132 -22c42 0 89 9 139 27c51 17 92 46 122 86c31 40 47 83 47 129c0 56 -27 108 -81 157c-22 19 -68 43 -137 71z" />
+    <glyph glyph-name="ravelry" unicode="&#xf2d9;" horiz-adv-x="2080" 
+d="M1095 -197c-4 1 -7 2 -11 4c0 0 -329 193 -440 505c-37 6 -115 24 -175 37c87 -283 329 -499 626 -546zM454 409l168 -28c-57 171 -64 366 -64 366c-67 -65 -103 -154 -121 -224c3 -39 8 -77 17 -114zM564 1018c-31 -46 -56 -96 -77 -148c33 35 60 58 74 68
+c-2 30 3 80 3 80zM2001 584c0 436 -352 790 -784 790c-200 0 -382 -76 -521 -201c-21 -41 -35 -93 -45 -160c213 181 593 136 593 136c95 -4 84 -88 83 -114c-346 29 -516 -70 -684 -213c0 0 33 -320 109 -450c438 -20 771 218 771 218c42 30 79 33 87 -19
+c6 -42 9 -99 -39 -121c-146 -68 -307 -111 -467 -134c-104 -15 -162 -19 -317 -16c148 -344 518 -438 518 -438c116 -19 204 -4 263 15c256 130 433 398 433 707zM2075 621c-7 -68 -18 -147 -40 -212c-90 -267 -215 -441 -500 -600c-26 -18 -54 -35 -82 -44
+c-51 -18 -106 -22 -163 -16c-24 -2 -48 -3 -73 -3c-381 0 -703 260 -800 615c-3 0 -6 1 -9 1c-23 -180 110 -423 110 -423s8 -12 54 -82c-255 135 -262 533 -262 533c-61 23 -273 95 -310 154c0 0 166 -91 309 -109c-1 1 2 32 2 32c9 122 51 217 94 290
+c28 137 90 261 176 365c15 62 39 136 81 214c18 34 35 56 81 77c304 142 604 178 912 18c295 -154 455 -476 420 -810z" />
+    <glyph glyph-name="code-fork" unicode="&#xf126;" horiz-adv-x="1024" 
+d="M288 64c0 53 -43 96 -96 96s-96 -43 -96 -96s43 -96 96 -96s96 43 96 96zM288 1216c0 53 -43 96 -96 96s-96 -43 -96 -96s43 -96 96 -96s96 43 96 96zM928 1088c0 53 -43 96 -96 96s-96 -43 -96 -96s43 -96 96 -96s96 43 96 96zM1024 1088c0 -71 -39 -133 -96 -166
+c-3 -361 -259 -441 -429 -495c-159 -50 -211 -74 -211 -171v-26c57 -33 96 -95 96 -166c0 -106 -86 -192 -192 -192s-192 86 -192 192c0 71 39 133 96 166v820c-57 33 -96 95 -96 166c0 106 86 192 192 192s192 -86 192 -192c0 -71 -39 -133 -96 -166v-497
+c51 25 105 42 154 57c186 59 292 103 294 312c-57 33 -96 95 -96 166c0 106 86 192 192 192s192 -86 192 -192z" />
+    <glyph glyph-name="hand-o-right" unicode="&#xf0a4;" horiz-adv-x="1792" 
+d="M256 192c0 35 -29 64 -64 64s-64 -29 -64 -64s29 -64 64 -64s64 29 64 64zM1664 768c0 68 -61 128 -128 128h-576c0 63 96 128 96 256c0 96 -75 128 -160 128c-28 0 -79 -116 -90 -139c-12 -22 -24 -44 -37 -65c-33 -53 -71 -99 -112 -145c-64 -73 -135 -163 -241 -163
+h-32v-640h32c175 0 346 -128 540 -128c112 0 189 47 189 167c0 19 -2 38 -5 56c42 23 65 80 65 126c0 24 -6 48 -18 69c34 32 53 72 53 119c0 32 -14 79 -35 103h331c69 0 128 59 128 128zM1792 769c0 -140 -116 -257 -256 -257h-169c-3 -42 -16 -82 -37 -119
+c2 -14 3 -29 3 -43c0 -64 -21 -128 -60 -178c2 -189 -127 -300 -312 -300c-112 0 -218 31 -322 69c-61 22 -160 59 -223 59h-288c-71 0 -128 57 -128 128v640c0 71 57 128 128 128h288c48 0 116 86 145 119c36 41 70 82 100 129c58 93 101 264 235 264
+c159 0 288 -87 288 -256c0 -44 -7 -87 -22 -128h374c138 0 256 -117 256 -255z" />
+    <glyph glyph-name="object-group" 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="wikidata" unicode="&#xf31a;" horiz-adv-x="2048" 
+d="M0 1264h76v-1264h-76v1264zM152 1264h227v-1264h-227v1264zM455 1264h228v-1264h-228v1264zM759 1264h75v-1264h-75v1264zM910 1264h76v-1264h-76v1264zM1820 1264h76v-1264h-76v1264zM1972 1264h76v-1264h-76v1264zM1062 1264h227v-1264h-227v1264zM1365 1264h76v-1264
+h-76v1264zM1517 1264h228v-1264h-228v1264z" />
+    <glyph glyph-name="anchor" unicode="&#xf13d;" horiz-adv-x="1792" 
+d="M960 1280c0 35 -29 64 -64 64s-64 -29 -64 -64s29 -64 64 -64s64 29 64 64zM1792 352v-352c0 -13 -8 -25 -20 -30c-4 -1 -8 -2 -12 -2c-8 0 -16 3 -23 9l-93 93c-157 -189 -439 -310 -748 -310s-591 121 -748 310l-93 -93c-6 -6 -15 -9 -23 -9c-4 0 -8 1 -12 2
+c-12 5 -20 17 -20 30v352c0 18 14 32 32 32h352c13 0 25 -8 30 -20s2 -25 -7 -35l-100 -100c90 -121 263 -209 461 -236v647h-192c-35 0 -64 29 -64 64v128c0 35 29 64 64 64h192v163c-76 44 -128 126 -128 221c0 141 115 256 256 256s256 -115 256 -256
+c0 -95 -52 -177 -128 -221v-163h192c35 0 64 -29 64 -64v-128c0 -35 -29 -64 -64 -64h-192v-647c198 27 371 115 461 236l-100 100c-9 10 -12 23 -7 35s17 20 30 20h352c18 0 32 -14 32 -32z" />
+    <glyph glyph-name="meh-o" unicode="&#xf11a;" 
+d="M1152 448c0 -35 -29 -64 -64 -64h-640c-35 0 -64 29 -64 64s29 64 64 64h640c35 0 64 -29 64 -64zM640 896c0 -71 -57 -128 -128 -128s-128 57 -128 128s57 128 128 128s128 -57 128 -128zM1152 896c0 -71 -57 -128 -128 -128s-128 57 -128 128s57 128 128 128
+s128 -57 128 -128zM1408 640c0 353 -287 640 -640 640s-640 -287 -640 -640s287 -640 640 -640s640 287 640 640zM1536 640c0 -424 -344 -768 -768 -768s-768 344 -768 768s344 768 768 768s768 -344 768 -768z" />
+    <glyph glyph-name="file-image-o" unicode="&#xf1c5;" 
+d="M1468 1156c37 -37 68 -111 68 -164v-1152c0 -53 -43 -96 -96 -96h-1344c-53 0 -96 43 -96 96v1600c0 53 43 96 96 96h896c53 0 127 -31 164 -68zM1024 1400v-376h376c-6 17 -15 34 -22 41l-313 313c-7 7 -24 16 -41 22zM1408 -128v1024h-416c-53 0 -96 43 -96 96v416
+h-768v-1536h1280zM1280 320v-320h-1024v192l192 192l128 -128l384 384zM448 512c-106 0 -192 86 -192 192s86 192 192 192s192 -86 192 -192s-86 -192 -192 -192z" />
+    <glyph glyph-name="liberapay" unicode="&#xf2e9;" horiz-adv-x="1191" 
+d="M468 1404v0l-222 -918c-4 -19 -6 -37 -7 -53s3 -30 9 -42s18 -23 33 -30s36 -12 64 -14l-48 -196c-75 0 -134 9 -177 29s-74 47 -93 81s-28 73 -27 117s6 91 18 141l203 847zM849 1025v0c60 0 111 -9 154 -27s78 -44 106 -75s49 -68 62 -110s20 -86 20 -134h-1
+c0 -78 -12 -149 -38 -213s-61 -120 -106 -167s-99 -83 -162 -109s-133 -39 -207 -39c-36 0 -72 3 -108 9l-72 -288h-236l265 1103c42 13 91 24 146 34s113 16 177 16zM819 825v0c-34 0 -66 -3 -96 -9l-111 -464c18 -4 40 -7 67 -7c41 0 79 8 113 23s63 37 87 65
+s43 61 56 100s20 81 20 128c0 46 -11 84 -31 116s-55 48 -105 48z" />
+    <glyph glyph-name="nodejs" unicode="&#xf308;" 
+d="M768 -225c-24 0 -46 6 -67 17l-211 126c-32 17 -17 24 -7 27c43 14 51 18 96 43c5 3 11 1 16 -2l162 -97c6 -3 14 -3 19 0l634 367c6 3 10 10 10 18v733c0 8 -4 14 -10 17l-634 366c-6 3 -14 3 -19 0l-635 -366c-6 -3 -9 -11 -9 -17v-733c0 -6 3 -15 9 -18l174 -100
+c94 -48 152 8 152 64v723c0 10 8 19 19 19h82c10 0 19 -8 19 -19v-723c0 -126 -69 -199 -188 -199c-37 0 -65 0 -146 40l-167 95c-41 24 -67 68 -67 116v733c0 48 26 92 67 116l634 368c40 22 94 22 134 0l634 -368c41 -24 67 -68 67 -116v-733c0 -48 -26 -92 -67 -116
+l-634 -367c-21 -10 -45 -14 -67 -14zM964 279c-278 0 -336 127 -336 235c0 10 8 19 19 19h83c10 0 17 -6 17 -16c13 -84 49 -125 218 -125c134 0 191 29 191 101c0 41 -16 72 -224 93c-173 17 -282 56 -282 194c0 129 109 205 290 205c204 0 303 -70 316 -223
+c0 -5 -2 -9 -5 -14c-3 -3 -7 -7 -12 -7h-83c-8 0 -16 7 -18 15c-19 87 -68 116 -198 116c-146 0 -164 -51 -164 -89c0 -46 21 -61 218 -86c196 -25 288 -62 288 -199c-2 -140 -116 -219 -318 -219z" />
+    <glyph glyph-name="calculator" unicode="&#xf1ec;" horiz-adv-x="1664" 
+d="M384 0c0 71 -57 128 -128 128s-128 -57 -128 -128s57 -128 128 -128s128 57 128 128zM768 0c0 71 -57 128 -128 128s-128 -57 -128 -128s57 -128 128 -128s128 57 128 128zM384 384c0 71 -57 128 -128 128s-128 -57 -128 -128s57 -128 128 -128s128 57 128 128zM1152 0
+c0 71 -57 128 -128 128s-128 -57 -128 -128s57 -128 128 -128s128 57 128 128zM768 384c0 71 -57 128 -128 128s-128 -57 -128 -128s57 -128 128 -128s128 57 128 128zM384 768c0 71 -57 128 -128 128s-128 -57 -128 -128s57 -128 128 -128s128 57 128 128zM1152 384
+c0 71 -57 128 -128 128s-128 -57 -128 -128s57 -128 128 -128s128 57 128 128zM768 768c0 71 -57 128 -128 128s-128 -57 -128 -128s57 -128 128 -128s128 57 128 128zM1536 0v384c0 70 -58 128 -128 128s-128 -58 -128 -128v-384c0 -70 58 -128 128 -128s128 58 128 128z
+M1152 768c0 71 -57 128 -128 128s-128 -57 -128 -128s57 -128 128 -128s128 57 128 128zM1536 1088v256c0 35 -29 64 -64 64h-1280c-35 0 -64 -29 -64 -64v-256c0 -35 29 -64 64 -64h1280c35 0 64 29 64 64zM1536 768c0 71 -57 128 -128 128s-128 -57 -128 -128
+s57 -128 128 -128s128 57 128 128zM1664 1408v-1536c0 -70 -58 -128 -128 -128h-1408c-70 0 -128 58 -128 128v1536c0 70 58 128 128 128h1408c70 0 128 -58 128 -128z" />
+    <glyph glyph-name="vk" unicode="&#xf189;" horiz-adv-x="1921" 
+d="M1918 1016c15 -41 -32 -137 -150 -294c-194 -258 -215 -234 -55 -383c154 -143 186 -212 191 -221c0 0 64 -112 -71 -113l-256 -4c-55 -11 -128 39 -128 39c-96 66 -186 237 -256 215c0 0 -72 -23 -70 -177c1 -33 -15 -51 -15 -51s-18 -19 -53 -22h-115
+c-253 -16 -476 217 -476 217s-244 252 -458 755c-14 33 1 49 1 49s15 19 57 19l274 2c26 -4 44 -18 44 -18s16 -11 24 -32c45 -112 103 -214 103 -214c100 -206 168 -241 207 -220c0 0 51 31 40 280c-4 90 -29 131 -29 131c-23 31 -66 40 -85 43c-15 2 10 38 43 54
+c49 24 136 25 239 24c81 -1 104 -6 135 -13c95 -23 63 -111 63 -323c0 -68 -13 -163 36 -194c21 -14 73 -2 201 216c0 0 60 104 107 225c8 22 25 31 25 31s16 9 38 6l288 2c87 11 101 -29 101 -29z" />
+    <glyph glyph-name="odnoklassniki" unicode="&#xf263;" horiz-adv-x="1078" 
+d="M539 629c-250 0 -454 203 -454 453c0 251 204 454 454 454s454 -203 454 -454c0 -250 -204 -453 -454 -453zM539 1306c-123 0 -223 -100 -223 -224c0 -123 100 -223 223 -223s223 100 223 223c0 124 -100 224 -223 224zM1062 574c44 -90 -6 -133 -120 -207
+c-96 -61 -228 -85 -315 -94l73 -72l267 -267c40 -41 40 -107 0 -147l-12 -13c-41 -40 -107 -40 -148 0c-67 68 -165 166 -267 268l-267 -268c-41 -40 -107 -40 -147 0l-12 13c-41 40 -41 106 0 147c68 68 165 166 267 267l72 72c-86 9 -220 32 -317 94
+c-114 74 -164 117 -120 207c26 51 97 94 191 20c0 0 127 -101 332 -101s332 101 332 101c94 74 165 31 191 -20z" />
+    <glyph glyph-name="linkedin" unicode="&#xf0e1;" 
+d="M349 911v-991h-330v991h330zM370 1217c1 -95 -71 -171 -186 -171h-2c-111 0 -182 76 -182 171c0 97 74 171 186 171c113 0 183 -74 184 -171zM1536 488v-568h-329v530c0 133 -48 224 -167 224c-91 0 -145 -61 -169 -120c-8 -22 -11 -51 -11 -81v-553h-329
+c4 898 0 991 0 991h329v-144h-2c43 68 121 167 299 167c217 0 379 -142 379 -446z" />
+    <glyph glyph-name="jpy" unicode="&#xf157;" horiz-adv-x="1026" 
+d="M603 0h-172c-18 0 -32 14 -32 32v330h-288c-18 0 -32 14 -32 32v103c0 18 14 32 32 32h288v85h-288c-18 0 -32 14 -32 32v104c0 17 14 32 32 32h214l-321 578c-5 10 -5 22 0 32c6 10 17 16 28 16h194c12 0 23 -7 29 -18l215 -425c24 -47 40 -87 56 -125
+c17 43 39 85 58 129l191 420c5 12 17 19 29 19h191c11 0 21 -6 27 -16c6 -9 6 -21 1 -31l-313 -579h215c18 0 32 -15 32 -32v-104c0 -18 -14 -32 -32 -32h-290v-85h290c18 0 32 -14 32 -32v-103c0 -18 -14 -32 -32 -32h-290v-330c0 -18 -15 -32 -32 -32z" />
+    <glyph glyph-name="skype" unicode="&#xf17e;" 
+d="M1173 473c0 174 -169 234 -311 266l-104 24c-76 18 -133 31 -133 89c0 53 56 77 144 77c157 0 160 -115 257 -115c65 0 104 51 104 109c0 115 -191 190 -380 190c-173 0 -374 -75 -374 -278c0 -168 112 -228 258 -263l146 -36c89 -22 144 -32 144 -96
+c0 -51 -57 -90 -145 -90c-185 0 -195 154 -302 154c-70 0 -101 -50 -101 -105c0 -123 188 -223 413 -223c188 0 384 94 384 297zM1536 256c0 -212 -172 -384 -384 -384c-88 0 -169 30 -234 80c-48 -10 -99 -16 -150 -16c-389 0 -704 315 -704 704c0 51 6 102 16 150
+c-50 65 -80 146 -80 234c0 212 172 384 384 384c88 0 169 -30 234 -80c48 10 99 16 150 16c389 0 704 -315 704 -704c0 -51 -6 -102 -16 -150c50 -65 80 -146 80 -234z" />
+    <glyph glyph-name="envelope-square" unicode="&#xf199;" 
+d="M1248 1408c159 0 288 -129 288 -288v-960c0 -159 -129 -288 -288 -288h-960c-159 0 -288 129 -288 288v960c0 159 129 288 288 288h960zM1280 352v436c-19 -21 -40 -40 -64 -55c-94 -62 -191 -120 -284 -184c-47 -33 -105 -69 -164 -69s-117 36 -164 69
+c-93 64 -191 121 -284 185c-23 15 -41 37 -64 54v-436c0 -53 43 -96 96 -96h832c53 0 96 43 96 96zM1280 925c0 54 -40 99 -96 99h-832c-53 0 -96 -43 -96 -96c0 -54 56 -113 98 -141c88 -59 179 -114 267 -172c38 -25 101 -71 147 -71s109 46 147 71c89 58 178 115 267 174
+c39 26 98 86 98 136z" />
+    <glyph glyph-name="question-circle-o" unicode="&#xf29c;" 
+d="M880 336v-160c0 -18 -14 -32 -32 -32h-160c-18 0 -32 14 -32 32v160c0 18 14 32 32 32h160c18 0 32 -14 32 -32zM1136 832c0 -142 -99 -198 -172 -239c-52 -30 -84 -49 -84 -81v-32c0 -18 -14 -32 -32 -32h-160c-18 0 -32 14 -32 32v68c0 123 88 162 159 194
+c60 28 97 47 97 92c0 58 -73 101 -139 101c-35 0 -72 -11 -95 -27c-22 -15 -43 -37 -80 -83c-6 -8 -15 -12 -25 -12c-7 0 -14 2 -19 6l-108 82c-13 10 -16 29 -7 43c82 129 197 192 349 192c164 0 348 -130 348 -304zM768 1280c-353 0 -640 -287 -640 -640
+s287 -640 640 -640s640 287 640 640s-287 640 -640 640zM1536 640c0 -424 -344 -768 -768 -768s-768 344 -768 768s344 768 768 768s768 -344 768 -768z" />
+    <glyph glyph-name="ship" unicode="&#xf21a;" horiz-adv-x="2010" 
+d="M1792 -19c25 25 65 25 90 0l128 -128l-90 -90l-83 83l-83 -83c-12 -13 -29 -19 -45 -19s-33 6 -45 19l-83 83l-83 -83c-25 -25 -65 -25 -90 0l-83 83l-83 -83c-25 -25 -65 -25 -90 0l-83 83l-83 -83c-25 -25 -65 -25 -90 0l-83 83l-83 -83c-25 -25 -65 -25 -90 0l-83 83
+l-83 -83c-25 -25 -65 -25 -90 0l-83 83l-83 -83c-25 -25 -65 -25 -90 0l-128 128l90 90l83 -83l83 83c25 25 65 25 90 0l83 -83l83 83c25 25 65 25 90 0l83 -83l83 83c25 25 65 25 90 0l83 -83l83 83c25 25 65 25 90 0l83 -83l83 83c25 25 65 25 90 0l83 -83l83 83
+c25 25 65 25 90 0l83 -83zM218 19c-25 -25 -65 -25 -90 0l-128 128l90 90l83 -82l83 82c25 25 65 25 90 0l83 -82l64 64v293l-210 314c-23 35 -7 83 33 97l177 58v299h128v128h256v128h256v-128h256v-128h128v-299l177 -58c40 -14 56 -62 33 -97l-210 -314v-293l19 18
+c25 25 65 25 90 0l83 -82l83 82c25 25 65 25 90 0l128 -128l-90 -90l-83 83l-83 -83c-12 -13 -29 -19 -45 -19s-33 6 -45 19l-83 83l-83 -83c-25 -25 -65 -25 -90 0l-83 83l-83 -83c-25 -25 -65 -25 -90 0l-83 83l-83 -83c-25 -25 -65 -25 -90 0l-83 83l-83 -83
+c-25 -25 -65 -25 -90 0l-83 83l-83 -83c-25 -25 -65 -25 -90 0l-83 83zM621 1152v-128l384 128l384 -128v128h-128v128h-512v-128h-128z" />
+    <glyph glyph-name="gimp" unicode="&#xf31b;" horiz-adv-x="1792" 
+d="M1760 1453c243 -1827 -975 -1550 -1432 -1186c28 4 55 13 78 30c50 38 74 102 73 173s-25 150 -73 220c-6 9 -13 17 -20 25l26 588s159 -366 481 -358c674 18 794 417 867 508zM612 937c-97 0 -177 -85 -177 -193s80 -194 177 -194c16 0 31 4 46 8
+c-67 3 -122 62 -122 133v0c0 73 57 133 127 133v0c56 0 112 -47 124 -104c1 8 2 16 2 24c0 108 -80 193 -177 193zM1031 928v0c-119 0 -216 -102 -216 -228s97 -227 216 -227c45 0 87 14 122 39c-17 -8 -47 -15 -66 -15c-90 0 -162 77 -162 171v0c0 94 72 170 162 170
+c75 0 147 -63 160 -141v3c0 126 -97 228 -216 228zM158 822v0c79 -2 166 -58 227 -146c46 -67 70 -141 70 -206s-21 -121 -64 -153s-100 -37 -158 -16s-118 67 -164 134s-69 141 -69 206s21 121 64 153c26 20 58 29 94 28zM1042 804c-42 0 -76 -36 -76 -80v0
+c0 -44 34 -80 76 -80s76 36 76 80v0c0 44 -34 80 -76 80zM615 787c-28 0 -50 -23 -50 -52v0v0c0 -29 22 -53 50 -53s50 24 50 53v0v0c0 29 -22 52 -50 52zM130 770c-47 0 -85 -47 -85 -106v0c0 -59 38 -107 85 -107s84 48 84 107v0c0 59 -37 106 -84 106zM1202 468
+c0 0 44 -38 69 -72c-96 -78 -261 -141 -583 -73c163 -60 300 -88 406 -81c-64 -22 -146 -39 -250 -44c233 -23 407 22 468 117c16 -18 32 -49 47 -89c10 69 36 101 -4 155s-153 87 -153 87z" />
+    <glyph glyph-name="dashcube" unicode="&#xf210;" horiz-adv-x="1408" 
+d="M0 856c0 173 138 322 314 322h742l352 358v-1470c0 -174 -138 -322 -314 -322h-780c-176 0 -314 148 -314 322v790zM1232 102l-176 180v425c0 61 -49 112 -110 112h-484c-61 0 -110 -51 -110 -112v-492c0 -61 49 -113 110 -113h770z" />
+    <glyph glyph-name="optin-monster" unicode="&#xf23c;" horiz-adv-x="2132" 
+d="M396 -139c-10 -21 -39 -50 -64 -60c-35 -12 -78 11 -80 35c-2 31 75 87 108 93c32 6 47 -42 36 -68zM1737 -139c-11 26 4 74 35 68c33 -6 111 -62 108 -93c-1 -24 -45 -47 -79 -35c-26 10 -55 39 -64 60zM1785 -30c-21 43 15 121 70 114c58 -6 183 -94 183 -160
+c0 -43 -58 -72 -119 -55c-45 12 -116 65 -134 101zM346 -30c-18 -36 -88 -89 -133 -101c-61 -17 -119 12 -119 55c0 66 125 154 183 160c55 7 91 -71 69 -114zM1076 1094c106 0 192 -80 192 -179s-86 -179 -192 -179s-191 80 -191 179c0 15 2 28 5 42c16 -25 46 -43 80 -43
+c51 0 92 38 92 85c0 37 -26 69 -61 80c23 10 49 15 76 15h-1zM1380 1312c-132 145 -301 177 -466 87c93 208 452 180 466 -87zM2130 73c5 -7 -1 -25 -11 -42c4 -13 7 -26 7 -40c3 -117 -164 -237 -272 -241c-64 -3 -128 31 -158 87c-420 -15 -840 -18 -1259 0
+c-31 -56 -95 -89 -159 -87c-107 4 -274 124 -272 241c1 14 3 27 7 40c-10 17 -16 35 -11 42c4 6 17 6 31 1c12 19 26 35 41 51c-4 17 -4 32 2 38c7 6 23 4 39 -4c17 12 37 24 59 34c0 18 5 32 13 37c12 6 33 2 51 -16c21 3 42 3 61 -2c13 -3 26 -10 38 -19v73
+c-6 0 -11 0 -18 2c-65 12 -136 57 -152 132c-6 25 -6 52 0 81c12 50 55 79 93 95c3 22 30 52 55 59c28 7 46 -17 52 -38h13c18 -2 47 -6 60 -23c2 -2 4 -5 5 -7c20 2 41 5 61 7c-9 7 -19 13 -30 17c-19 33 -51 41 -91 43c0 3 0 6 1 10c-73 2 -163 21 -203 66
+c-46 51 -54 138 -45 204c8 65 35 140 90 179c31 21 80 3 84 -36c2 -17 5 -75 21 -84c18 -9 47 -13 76 -12c30 29 62 54 98 74c-55 5 -107 -6 -162 -14l47 46c46 44 107 82 163 111c87 44 185 77 282 86c-69 29 -148 44 -221 61c283 60 646 82 904 -139
+c67 -57 120 -134 158 -222c41 -5 93 -6 121 9h1c16 9 19 66 21 84c4 38 53 57 84 35c55 -39 82 -114 91 -178c8 -66 1 -153 -46 -204c-40 -45 -127 -65 -199 -67v-10c-41 -1 -75 -9 -95 -43c-11 -4 -21 -10 -31 -17c21 -2 42 -5 62 -7c1 3 3 6 5 8c14 16 43 21 60 23h13
+c6 20 25 44 52 38s52 -37 55 -59c40 -16 82 -45 93 -95c7 -30 6 -56 1 -81c-17 -75 -88 -121 -153 -132c-5 -1 -12 -2 -17 -2c0 -25 0 -49 -1 -73c12 9 24 16 38 19c19 5 40 5 61 2c18 18 40 22 51 16c8 -5 14 -19 14 -37c21 -10 42 -22 59 -34c16 8 31 10 38 4
+c6 -6 7 -21 2 -38c15 -16 30 -33 41 -51c14 5 26 5 31 -1zM1855 1025c0 -23 -5 -43 -9 -54c64 -25 97 -82 112 -132c4 39 -10 146 -51 189c-27 27 -52 19 -52 -3zM1777 925c48 -58 63 -154 47 -233c40 8 76 23 97 45c7 8 14 18 18 28c-4 79 -38 158 -110 181
+c-12 -12 -34 -18 -52 -21zM1740 921c-14 0 -30 0 -44 1c28 -76 46 -158 53 -239c13 0 28 1 43 3c22 90 -1 191 -52 235zM176 839c15 50 48 107 112 132c-4 11 -9 31 -9 54c0 22 -26 30 -52 3c-42 -43 -55 -150 -51 -189zM212 737c21 -23 57 -37 97 -45c-16 79 -1 175 47 233
+c-18 3 -40 9 -52 21c-72 -23 -105 -102 -110 -181c5 -10 11 -20 18 -28zM389 683c9 82 34 162 73 235c-19 -4 -37 -11 -55 -18l-45 -19v1c-27 -52 -37 -127 -20 -196c17 -2 32 -3 47 -3zM1352 644c13 -66 18 -132 28 -198c4 -23 11 -28 33 -17c59 30 84 145 85 211
+c-48 3 -97 3 -146 4zM1070 1285c-155 0 -282 -126 -282 -281c0 -156 127 -282 282 -282s282 126 282 282c0 155 -127 281 -282 281zM1298 646c-70 1 -141 1 -211 0v1c-1 -19 1 -141 16 -152c41 -20 146 -17 189 -4c20 6 9 137 6 155zM1030 447c17 9 9 168 5 199v1
+c-72 -1 -143 -1 -214 -3c-7 -34 -17 -181 7 -191c48 -21 154 -19 202 -6zM636 636c-20 -73 1 -167 82 -203c20 -9 32 -9 36 16c7 32 9 136 18 193c-45 -1 -91 -3 -136 -6zM509 510c2 -18 -14 -29 -34 -36c162 -174 343 -317 577 -394c250 71 428 222 604 396
+c-18 7 -32 19 -30 34c1 4 2 6 3 9v1v-1c-33 3 -66 7 -98 10c-35 -122 -133 -196 -173 -117c-10 19 -13 43 -17 62c-14 -31 -49 -30 -91 -33c-49 -4 -117 -5 -163 11c-11 -48 -41 -48 -99 -53c-52 -5 -180 -15 -203 40c-4 -106 -130 -37 -167 26c-12 21 -20 42 -26 65
+c-29 -3 -58 -6 -87 -10c2 -3 3 -7 4 -10zM425 -118c2 9 3 19 3 30c-21 86 -69 184 -124 200c-83 25 -255 -87 -245 -202c47 -72 148 -132 219 -135c66 -3 133 41 147 107zM428 53c12 -33 24 -77 27 -119c124 72 256 132 392 174c-143 76 -252 177 -360 285
+c-8 -5 -19 -9 -29 -13c-1 -3 -1 -6 -2 -9c17 -10 29 -22 22 -37c-8 -15 -32 -28 -56 -34c-8 -10 -19 -18 -29 -24h-1c-1 -50 -1 -100 1 -150c14 -25 26 -51 35 -73zM497 -113c382 -15 764 -13 1145 0c-136 79 -274 153 -428 196c-51 -23 -103 -42 -156 -57
+c-8 -3 -8 -3 -16 0c-44 14 -86 30 -129 49c-149 -43 -286 -108 -416 -188h-1v-1c1 0 1 0 1 1zM1681 -67c3 42 16 87 28 120c8 22 19 47 33 71l-1 -1c2 51 3 102 3 153c-11 6 -21 15 -30 25c-24 5 -48 19 -56 33c-7 15 5 28 22 38c-1 2 -2 6 -2 9c-11 3 -20 7 -28 12
+c-117 -109 -242 -210 -383 -284c144 -43 281 -104 414 -176zM2073 -90c11 115 -161 227 -245 202c-54 -16 -103 -114 -124 -200c0 -11 1 -21 3 -30c14 -66 81 -110 147 -107c71 3 172 63 219 135z" />
+    <glyph glyph-name="paw" unicode="&#xf1b0;" horiz-adv-x="1664" 
+d="M780 1064c0 -112 -58 -245 -187 -245c-162 0 -260 204 -260 344c0 112 58 245 187 245c163 0 260 -204 260 -344zM438 581c0 -97 -51 -198 -161 -198c-160 0 -277 196 -277 341c0 97 52 199 161 199c160 0 277 -197 277 -342zM832 608c245 0 576 -353 576 -589
+c0 -127 -104 -147 -206 -147c-134 0 -242 90 -370 90c-134 0 -248 -89 -393 -89c-97 0 -183 33 -183 146c0 237 331 589 576 589zM1071 819c-129 0 -187 133 -187 245c0 140 97 344 260 344c129 0 187 -133 187 -245c0 -140 -98 -344 -260 -344zM1503 923
+c109 0 161 -102 161 -199c0 -145 -117 -341 -277 -341c-110 0 -161 101 -161 198c0 145 117 342 277 342z" />
+    <glyph glyph-name="venus-double" unicode="&#xf226;" horiz-adv-x="1792" 
+d="M1790 1007c25 -317 -207 -586 -510 -619v-260h224c18 0 32 -14 32 -32v-64c0 -18 -14 -32 -32 -32h-224v-224c0 -18 -14 -32 -32 -32h-64c-18 0 -32 14 -32 32v224h-512v-224c0 -18 -14 -32 -32 -32h-64c-18 0 -32 14 -32 32v224h-224c-18 0 -32 14 -32 32v64
+c0 18 14 32 32 32h224v260c-303 33 -535 302 -510 619c22 275 243 500 517 526c140 14 271 -23 377 -94c106 71 237 108 377 94c274 -26 495 -251 517 -526zM896 647c79 81 128 191 128 313s-49 232 -128 313c-79 -81 -128 -191 -128 -313s49 -232 128 -313zM576 512
+c79 0 153 21 218 57c-96 103 -154 240 -154 391s59 288 154 391c-65 36 -139 57 -218 57c-247 0 -448 -201 -448 -448s201 -448 448 -448zM1152 128v260c-94 10 -181 44 -256 94c-75 -50 -162 -84 -256 -94v-260h512zM1216 512c247 0 448 201 448 448s-201 448 -448 448
+c-79 0 -153 -21 -218 -57c95 -103 154 -240 154 -391s-58 -288 -154 -391c65 -36 139 -57 218 -57z" />
+    <glyph glyph-name="calendar-times-o" unicode="&#xf273;" horiz-adv-x="1664" 
+d="M1111 151l-46 -46c-12 -12 -32 -12 -45 0l-188 189l-188 -189c-13 -12 -33 -12 -45 0l-46 46c-12 12 -12 32 0 45l189 188l-189 188c-12 13 -12 33 0 45l46 46c12 12 32 12 45 0l188 -188l188 188c13 12 33 12 45 0l46 -46c12 -12 12 -32 0 -45l-188 -188l188 -188
+c12 -13 12 -33 0 -45zM128 -128h1408v1024h-1408v-1024zM512 1088v288c0 18 -14 32 -32 32h-64c-18 0 -32 -14 -32 -32v-288c0 -18 14 -32 32 -32h64c18 0 32 14 32 32zM1280 1088v288c0 18 -14 32 -32 32h-64c-18 0 -32 -14 -32 -32v-288c0 -18 14 -32 32 -32h64
+c18 0 32 14 32 32zM1664 1152v-1280c0 -70 -58 -128 -128 -128h-1408c-70 0 -128 58 -128 128v1280c0 70 58 128 128 128h128v96c0 88 72 160 160 160h64c88 0 160 -72 160 -160v-96h384v96c0 88 72 160 160 160h64c88 0 160 -72 160 -160v-96h128c70 0 128 -58 128 -128z
+" />
+    <glyph glyph-name="address-book-o" unicode="&#xf2ba;" horiz-adv-x="1664" 
+d="M1028 892c0 -143 -117 -259 -260 -259s-260 116 -260 259c0 144 117 260 260 260s260 -116 260 -260zM980 672c191 0 221 -227 221 -374c0 -84 -53 -170 -145 -170h-576c-92 0 -145 86 -145 170c0 141 30 374 216 374h5c66 -39 133 -87 212 -87s146 48 212 87zM1664 928
+c0 -17 -15 -32 -32 -32h-96v-128h96c17 0 32 -15 32 -32v-192c0 -17 -15 -32 -32 -32h-96v-128h96c17 0 32 -15 32 -32v-192c0 -17 -15 -32 -32 -32h-96v-224c0 -88 -72 -160 -160 -160h-1216c-88 0 -160 72 -160 160v1472c0 88 72 160 160 160h1216c88 0 160 -72 160 -160
+v-224h96c17 0 32 -15 32 -32v-192zM1408 -96v1472c0 17 -15 32 -32 32h-1216c-17 0 -32 -15 -32 -32v-1472c0 -17 15 -32 32 -32h1216c17 0 32 15 32 32z" />
+    <glyph glyph-name="check" unicode="&#xf00c;" horiz-adv-x="1550" 
+d="M1550 970c0 -25 -10 -50 -28 -68l-724 -724l-136 -136c-18 -18 -43 -28 -68 -28s-50 10 -68 28l-136 136l-362 362c-18 18 -28 43 -28 68s10 50 28 68l136 136c18 18 43 28 68 28s50 -10 68 -28l294 -295l656 657c18 18 43 28 68 28s50 -10 68 -28l136 -136
+c18 -18 28 -43 28 -68z" />
+    <glyph glyph-name="meetup" unicode="&#xf2e0;" horiz-adv-x="1847" 
+d="M1297 302c-11 72 -143 16 -151 95c-11 112 153 354 140 448c-12 84 -68 102 -117 103c-47 1 -59 -7 -75 -16c-10 -6 -23 -17 -41 1c-22 21 -39 41 -68 45c-43 7 -62 -7 -93 -34c-12 -10 -42 -45 -70 -32c-12 6 -54 27 -84 40c-57 25 -140 -16 -170 -70
+c-45 -80 -133 -396 -146 -438c-30 -93 38 -170 129 -165c39 2 64 16 89 61c14 26 146 377 156 394c7 12 31 28 51 18c20 -11 24 -33 21 -53c-4 -34 -98 -248 -101 -272c-12 -80 94 -93 135 -14c13 25 160 324 173 344c15 22 26 29 41 28c11 0 29 -3 25 -38
+c-5 -33 -123 -253 -136 -307c-16 -72 23 -145 87 -177c40 -20 219 -55 205 39zM346 86c4 -20 -8 -39 -28 -43c-19 -4 -38 8 -42 28c-4 19 8 39 27 43s39 -8 43 -28zM916 -177c16 -23 10 -54 -12 -70c-23 -16 -54 -10 -70 13c-15 23 -9 54 13 70c23 16 54 10 69 -13zM140 635
+c-24 -36 -72 -45 -107 -20c-35 24 -44 73 -20 108c24 36 72 45 107 21c35 -25 44 -73 20 -109zM1430 -42c25 -37 16 -88 -21 -114c-37 -25 -87 -16 -112 21s-16 88 20 114c37 26 87 16 113 -21zM1542 562c92 -151 53 -350 -92 -452c-61 -43 -130 -62 -199 -60
+c-42 -165 -243 -226 -368 -114c-4 -3 -9 -6 -13 -10c-137 -95 -323 -61 -418 78c-34 50 -51 107 -53 164c-229 38 -315 329 -144 489c-99 164 2 376 187 402c88 232 377 342 573 190c236 78 477 -103 458 -354c144 -44 185 -234 69 -333zM418 1222c18 -27 12 -64 -15 -83
+c-26 -18 -63 -12 -81 15s-12 64 15 83c26 18 63 12 81 -15zM577 1503c5 -22 -9 -44 -31 -49s-44 9 -49 32c-4 22 10 44 32 49s44 -9 48 -32zM1763 555c6 -27 -11 -53 -37 -58c-26 -6 -52 11 -57 37c-6 27 11 53 37 59c26 5 52 -12 57 -38zM1099 1448c21 -36 10 -84 -27 -106
+c-36 -22 -83 -10 -104 26c-22 37 -10 85 26 107s83 10 105 -27zM1845 792c5 -20 -8 -39 -27 -44c-20 -4 -39 9 -43 28c-4 20 8 40 28 44c19 4 38 -8 42 -28zM1654 1033c20 -30 13 -71 -16 -92c-30 -20 -71 -13 -91 17s-13 71 17 92c29 21 70 13 90 -17z" />
+    <glyph glyph-name="sliders" unicode="&#xf1de;" 
+d="M352 128v-128h-352v128h352zM704 256c35 0 64 -29 64 -64v-256c0 -35 -29 -64 -64 -64h-256c-35 0 -64 29 -64 64v256c0 35 29 64 64 64h256zM864 640v-128h-864v128h864zM224 1152v-128h-224v128h224zM1536 128v-128h-736v128h736zM576 1280c35 0 64 -29 64 -64v-256
+c0 -35 -29 -64 -64 -64h-256c-35 0 -64 29 -64 64v256c0 35 29 64 64 64h256zM1216 768c35 0 64 -29 64 -64v-256c0 -35 -29 -64 -64 -64h-256c-35 0 -64 29 -64 64v256c0 35 29 64 64 64h256zM1536 640v-128h-224v128h224zM1536 1152v-128h-864v128h864z" />
+    <glyph glyph-name="file-pdf-o" unicode="&#xf1c1;" 
+d="M1468 1156c37 -37 68 -111 68 -164v-1152c0 -53 -43 -96 -96 -96h-1344c-53 0 -96 43 -96 96v1600c0 53 43 96 96 96h896c53 0 127 -31 164 -68zM1024 1400v-376h376c-6 17 -15 34 -22 41l-313 313c-7 7 -24 16 -41 22zM1408 -128v1024h-416c-53 0 -96 43 -96 96v416
+h-768v-1536h1280zM894 465c25 -20 53 -38 84 -56c42 5 81 7 117 7c67 0 152 -8 177 -49c7 -10 13 -28 2 -52c-1 -1 -2 -3 -3 -4v-1c-3 -18 -18 -38 -71 -38c-64 0 -161 29 -245 73c-139 -15 -285 -46 -392 -83c-103 -176 -182 -262 -242 -262c-10 0 -19 2 -28 7l-24 12
+c-3 1 -4 3 -6 5c-5 5 -9 16 -6 36c10 46 64 123 188 188c8 5 18 2 23 -6c1 -1 2 -3 2 -4c31 51 67 116 107 197c45 90 80 178 104 262c-32 109 -42 221 -24 287c7 25 22 40 42 40h22c15 0 27 -5 35 -15c12 -14 15 -36 9 -68c-1 -3 -2 -6 -4 -8c1 -3 1 -5 1 -8v-30
+c-1 -63 -2 -123 -14 -192c35 -105 87 -190 146 -238zM318 54c30 14 73 57 137 158c-75 -58 -122 -124 -137 -158zM716 974c-10 -28 -10 -76 -2 -132c3 16 5 31 7 44c2 17 5 31 7 43c1 3 2 5 4 8c-1 1 -1 3 -2 5c-1 18 -7 29 -13 36c0 -2 -1 -3 -1 -4zM592 313
+c88 35 186 63 284 81c-10 8 -20 15 -29 23c-49 43 -93 103 -127 176c-19 -61 -47 -126 -83 -197c-15 -28 -30 -56 -45 -83zM1238 329c-5 5 -31 24 -140 24c49 -18 94 -28 124 -28c9 0 14 0 18 1c0 1 -1 2 -2 3z" />
+    <glyph glyph-name="android" unicode="&#xf17b;" horiz-adv-x="1408" 
+d="M493 1053c22 0 39 18 39 39s-17 39 -39 39c-21 0 -38 -18 -38 -39s17 -39 38 -39zM915 1053c21 0 38 18 38 39s-17 39 -38 39c-22 0 -39 -18 -39 -39s17 -39 39 -39zM103 869c56 0 102 -46 102 -102v-430c0 -57 -45 -103 -102 -103s-103 46 -103 103v430
+c0 56 46 102 103 102zM1163 850v-666c0 -61 -49 -110 -109 -110h-75v-227c0 -57 -46 -103 -103 -103s-103 46 -103 103v227h-138v-227c0 -57 -46 -103 -103 -103c-56 0 -102 46 -102 103l-1 227h-74c-61 0 -110 49 -110 110v666h918zM931 1255c140 -72 235 -210 235 -369
+h-925c0 159 95 297 236 369l-71 131c-4 7 -2 16 5 20c7 3 16 1 20 -6l72 -132c61 27 129 42 201 42s140 -15 201 -42l72 132c4 7 13 9 20 6c7 -4 9 -13 5 -20zM1408 767v-430c0 -57 -46 -103 -103 -103c-56 0 -102 46 -102 103v430c0 57 46 102 102 102
+c57 0 103 -45 103 -102z" />
+    <glyph glyph-name="hubzilla" unicode="&#xf2eb;" horiz-adv-x="1587" 
+d="M1349 1363c86 -43 165 -125 207 -213c16 -40 34 -78 30 -170c-3 -83 -8 -115 -34 -170c-68 -146 -203 -243 -356 -253l-83 -6l-29 -115c-24 -96 -27 -129 -27 -129c28 -29 91 -47 117 -115c36 -69 32 -168 -14 -225c-75 -93 -187 -121 -286 -70c-90 47 -136 164 -108 266
+c7 26 -2 34 -109 104l-116 77l-43 -35c-203 -162 -499 -19 -498 242c0 168 133 299 304 298c86 0 138 -20 202 -78l47 -42l104 53l105 51l-11 37c-16 55 -12 176 7 238c21 74 87 166 150 212c128 94 302 111 441 43v0zM580 413l233 -160s71 60 167 68l60 254
+s-185 59 -237 189l-217 -102s52 -128 -6 -248v-1z" />
+    <glyph glyph-name="stack-exchange" unicode="&#xf18d;" horiz-adv-x="1238" 
+d="M1238 283v-66c0 -113 -88 -204 -196 -204h-57l-260 -269v269h-529c-108 0 -196 91 -196 204v66h1238zM1238 609v-255h-1238v255h1238zM1238 937v-255h-1238v255h1238zM1238 1077v-67h-1238v67c0 112 88 203 196 203h846c108 0 196 -91 196 -203z" />
+    <glyph glyph-name="twitch" unicode="&#xf1e8;" horiz-adv-x="1592" 
+d="M796 1102v-434h-145v434h145zM1194 1102v-434h-145v434h145zM1194 342l253 254v795h-1194v-1049h326v-217l217 217h398zM1592 1536v-1013l-434 -434h-326l-217 -217h-217v217h-398v1158l109 289h1483z" />
+    <glyph glyph-name="caret-right" unicode="&#xf0da;" horiz-adv-x="576" 
+d="M576 640c0 -17 -7 -33 -19 -45l-448 -448c-12 -12 -28 -19 -45 -19c-35 0 -64 29 -64 64v896c0 35 29 64 64 64c17 0 33 -7 45 -19l448 -448c12 -12 19 -28 19 -45z" />
+    <glyph glyph-name="tree" unicode="&#xf1bb;" horiz-adv-x="1472" 
+d="M1472 64c0 -35 -29 -64 -64 -64h-462c3 -64 11 -131 11 -196c0 -33 -27 -60 -61 -60h-320c-34 0 -61 27 -61 60c0 65 8 132 11 196h-462c-35 0 -64 29 -64 64c0 17 7 33 19 45l402 403h-229c-35 0 -64 29 -64 64c0 17 7 33 19 45l402 403h-197c-35 0 -64 29 -64 64
+c0 17 7 33 19 45l384 384c12 12 28 19 45 19s33 -7 45 -19l384 -384c12 -12 19 -28 19 -45c0 -35 -29 -64 -64 -64h-197l402 -403c12 -12 19 -28 19 -45c0 -35 -29 -64 -64 -64h-229l402 -403c12 -12 19 -28 19 -45z" />
+    <glyph glyph-name="friendica" unicode="&#xf2e6;" horiz-adv-x="1520" 
+d="M0 1128c0 152 123 276 274 276h973c151 0 273 -124 273 -276v-980c0 -152 -122 -276 -273 -276h-973c-151 0 -274 124 -274 276v980zM1247 1343h-244v-368h-486v-310l485 3l1 -367h-486v-368h730c118 0 212 95 212 215v980c0 120 -94 215 -212 215z" />
+    <glyph glyph-name="gratipay" unicode="&#xf184;" 
+d="M773 234l350 473c27 37 59 156 -43 223c-86 56 -168 13 -211 -37c-16 -18 -44 -40 -96 -40s-79 22 -95 40c-43 50 -125 93 -212 37c-101 -67 -69 -186 -42 -223zM1536 640c0 -424 -344 -768 -768 -768s-768 344 -768 768s344 768 768 768s768 -344 768 -768z" />
+    <glyph glyph-name="map-marker" unicode="&#xf041;" horiz-adv-x="1024" 
+d="M768 896c0 141 -115 256 -256 256s-256 -115 -256 -256s115 -256 256 -256s256 115 256 256zM1024 896c0 -61 -7 -124 -33 -179l-364 -774c-21 -44 -67 -71 -115 -71s-94 27 -114 71l-365 774c-26 55 -33 118 -33 179c0 283 229 512 512 512s512 -229 512 -512z" />
+    <glyph glyph-name="globe-e" unicode="&#xf304;" 
+d="M768 1404c204 0 399 -81 543 -225s225 -339 225 -543s-81 -399 -225 -543s-339 -225 -543 -225s-399 81 -543 225s-225 339 -225 543s81 399 225 543s339 225 543 225zM863 1165h-1h-6c-78 -1 -136 -19 -204 -29s-157 -10 -205 -29s-58 -39 -87 -58s-72 -30 -87 -58
+s0 -58 0 -87s-28 -73 0 -88s58 39 87 58s68 70 88 59s6 -8 0 -29s-54 -44 -56 -87s110 -78 73 -135c-37 -56 -202 50 -250 18s-19 -58 -29 -87s-40 -57 -29 -88s55 -37 87 -58s87 -59 88 -62s21 -106 29 -145c6 -34 3 -78 4 -120c44 -36 123 -82 176 -102
+c21 41 37 107 53 139c24 48 77 133 87 174s0 39 0 58s8 32 0 58s-40 58 -59 87s-37 69 -58 88s-49 19 -58 29s-4 9 -4 14s-5 8 5 15s36 9 58 0s39 -39 58 -58s27 -55 58 -58s58 39 87 58c29 20 74 35 107 -22c8 -16 43 -35 68 -35s22 42 30 58s24 37 48 41s28 -14 44 -30
+s30 -69 53 -69s22 43 30 59c15 34 6 65 57 116c19 19 50 29 57 57s-21 62 -29 86s-28 63 -28 88c0 21 27 25 63 44c-24 30 -67 73 -97 97c-22 1 -41 2 -55 4c-69 8 -176 29 -253 29zM1251 411c-32 1 -70 -43 -105 -60c-39 -19 -100 -32 -116 -59s0 -39 0 -58s-14 -44 0 -58
+s38 0 58 0s37 9 59 0c12 -5 23 -17 33 -29c40 34 96 98 125 142c-5 11 -10 21 -14 32c-10 29 5 74 -29 88c-4 2 -7 2 -11 2z" />
+    <glyph glyph-name="american-sign-language-interpreting" unicode="&#xf2a3;" horiz-adv-x="2303" 
+d="M1032 576c-35 1 -68 21 -84 55c-22 45 -66 73 -116 73c-71 0 -128 -57 -128 -128c0 -34 12 -67 36 -89l10 -8c22 -20 51 -31 82 -31c50 0 94 28 116 73c16 34 49 54 84 55zM1600 704c0 34 -12 67 -36 89l-10 8c-22 20 -51 31 -82 31c-50 0 -94 -28 -116 -73
+c-16 -34 -49 -54 -84 -55c35 -1 68 -21 84 -55c22 -45 66 -73 116 -73c71 0 128 57 128 128zM1174 925c-23 -47 -81 -67 -128 -44c-42 21 -87 31 -134 31c-35 0 -68 -6 -99 -17c6 0 13 1 19 1c123 0 236 -72 289 -183c23 -48 2 -105 -46 -128c-12 -6 -25 -9 -39 -9
+c14 0 27 -3 39 -9c48 -23 69 -80 46 -128c-53 -111 -166 -183 -289 -183h-6c-15 2 -29 3 -44 4l-290 27l-239 -120c-10 -5 -19 -7 -29 -7c-23 0 -46 13 -57 35l-160 320c-15 31 -4 68 25 85l209 119l148 267c23 206 125 395 287 528c41 34 102 28 135 -13
+c34 -41 28 -101 -13 -135c-45 -38 -85 -81 -117 -128c78 53 168 89 267 101c53 7 101 -30 107 -83c7 -53 -30 -101 -83 -107c-58 -7 -112 -27 -159 -55c32 7 65 10 99 10c76 0 150 -17 218 -50c48 -24 68 -81 44 -129zM2137 1085l160 -320c15 -31 4 -68 -25 -85l-209 -119
+l-148 -267c-23 -206 -125 -395 -287 -528c-18 -15 -40 -22 -61 -22c-28 0 -55 12 -74 35c-34 41 -28 101 13 135c45 38 85 81 117 128c-78 -53 -168 -89 -267 -101c-4 -1 -8 -1 -12 -1c-48 0 -89 36 -95 84c-7 53 30 101 83 107c58 7 112 27 159 55c-32 -7 -65 -10 -99 -10
+c-76 0 -150 17 -218 50c-48 24 -68 81 -44 129c23 47 81 67 128 44c42 -21 87 -31 134 -31c35 0 68 6 99 17c-6 0 -13 -1 -19 -1c-123 0 -236 72 -289 183c-23 48 -2 105 46 128c12 6 25 9 39 9c-14 0 -27 3 -39 9c-48 23 -69 80 -46 128c53 111 166 183 289 183h7
+c14 -2 28 -3 42 -4l291 -27l239 120c10 5 19 7 29 7c23 0 46 -13 57 -35z" />
+    <glyph glyph-name="binoculars" unicode="&#xf1e5;" horiz-adv-x="1792" 
+d="M704 1216v-768c0 -35 -29 -64 -64 -64v-576c0 -35 -29 -64 -64 -64h-512c-35 0 -64 29 -64 64v512l249 873c4 14 17 23 31 23h424zM1024 1216v-704h-256v704h256zM1792 320v-512c0 -35 -29 -64 -64 -64h-512c-35 0 -64 29 -64 64v576c-35 0 -64 29 -64 64v768h424
+c14 0 27 -9 31 -23zM736 1504v-224h-352v224c0 18 14 32 32 32h288c18 0 32 -14 32 -32zM1408 1504v-224h-352v224c0 18 14 32 32 32h288c18 0 32 -14 32 -32z" />
+    <glyph glyph-name="sticky-note" unicode="&#xf249;" 
+d="M1024 288v-416h-928c-53 0 -96 43 -96 96v1344c0 53 43 96 96 96h1344c53 0 96 -43 96 -96v-928h-416c-53 0 -96 -43 -96 -96zM1152 256h381c-9 -48 -35 -102 -65 -132l-184 -184c-30 -30 -84 -56 -132 -65v381z" />
+    <glyph glyph-name="user" unicode="&#xf007;" horiz-adv-x="1280" 
+d="M1280 137c0 -146 -96 -265 -213 -265h-854c-117 0 -213 119 -213 265c0 263 65 567 327 567c81 -79 191 -128 313 -128s232 49 313 128c262 0 327 -304 327 -567zM1024 1024c0 -212 -172 -384 -384 -384s-384 172 -384 384s172 384 384 384s384 -172 384 -384z" />
+    <glyph glyph-name="php" unicode="&#xf30e;" horiz-adv-x="2299" 
+d="M1149 1245c635 0 1150 -271 1150 -605s-515 -605 -1150 -605s-1149 271 -1149 605s514 605 1149 605zM1049 1081l-130 -627h125l74 359l100 -1c32 0 52 -6 62 -18s12 -33 6 -62l-58 -278h126l61 291c13 65 4 109 -27 132c-30 23 -77 36 -138 37h-111l35 167h-125z
+M478 914v0l-129 -625h126l34 165h108c37 0 73 5 107 13s66 27 96 57c25 24 44 50 58 80s24 60 28 91c11 67 1 121 -31 160s-84 58 -155 59h-242zM1549 914l-130 -625h126l34 165h109c37 0 72 5 106 13s67 27 97 57c25 24 43 50 57 80s24 60 28 91c11 67 1 121 -31 160
+s-84 58 -155 59h-241zM623 815v0c48 1 88 -4 120 -13s43 -45 32 -106c-13 -73 -38 -115 -77 -127s-87 -18 -145 -17h-12c-3 0 -8 1 -11 1l54 261h18c7 0 14 0 21 1zM1693 815v0c48 1 88 -4 120 -13s44 -45 33 -106c-13 -73 -39 -115 -78 -127s-87 -18 -145 -17h-12
+c-3 0 -8 1 -11 1l54 261h18c7 0 14 0 21 1z" />
+    <glyph glyph-name="ioxhost" unicode="&#xf208;" horiz-adv-x="2048" 
+d="M1463 704c0 -47 -38 -86 -86 -86h-702c-48 0 -86 39 -86 86s38 86 86 86h702c48 0 86 -39 86 -86zM1677 704c0 59 -8 115 -23 170h-982c-48 0 -86 38 -86 85c0 48 38 86 86 86h908c-115 187 -321 311 -555 311c-360 0 -653 -292 -653 -652c0 -59 8 -115 23 -170h982
+c48 0 86 -38 86 -85c0 -48 -38 -86 -86 -86h-908c115 -187 321 -311 556 -311c359 0 652 292 652 652zM2048 959c0 -47 -38 -85 -86 -85h-131c11 -55 17 -112 17 -170c0 -454 -369 -824 -823 -824c-333 0 -620 198 -750 483h-189c-48 0 -86 38 -86 86c0 47 38 85 86 85h132
+c-11 55 -17 112 -17 170c0 454 369 824 824 824c332 0 619 -198 749 -483h188c48 0 86 -38 86 -86z" />
+    <glyph glyph-name="expand" unicode="&#xf065;" 
+d="M755 480c0 -8 -4 -17 -10 -23l-332 -332l144 -144c12 -12 19 -28 19 -45c0 -35 -29 -64 -64 -64h-448c-35 0 -64 29 -64 64v448c0 35 29 64 64 64c17 0 33 -7 45 -19l144 -144l332 332c6 6 15 10 23 10s17 -4 23 -10l114 -114c6 -6 10 -15 10 -23zM1536 1344v-448
+c0 -35 -29 -64 -64 -64c-17 0 -33 7 -45 19l-144 144l-332 -332c-6 -6 -15 -10 -23 -10s-17 4 -23 10l-114 114c-6 6 -10 15 -10 23s4 17 10 23l332 332l-144 144c-12 12 -19 28 -19 45c0 35 29 64 64 64h448c35 0 64 -29 64 -64z" />
+    <glyph glyph-name="discord-alt" unicode="&#xf2ef;" 
+d="M559 1212v0l13 -16c-237 -68 -346 -172 -346 -172s29 16 78 38c141 62 252 79 298 83c8 1 15 3 23 3c80 11 170 13 265 2c125 -14 259 -51 396 -126c0 0 -103 99 -327 167l18 21s181 4 370 -138c0 0 189 -343 189 -766c0 0 -111 -191 -402 -200c0 0 -48 56 -87 106
+c172 49 238 157 238 157c-54 -35 -105 -61 -151 -78c-66 -28 -129 -45 -191 -56c-126 -24 -242 -17 -341 1c-75 14 -139 36 -193 57c-30 12 -63 26 -96 44c-4 3 -8 4 -12 7c-3 1 -4 3 -5 4c-24 13 -37 22 -37 22s63 -105 230 -155c-39 -50 -88 -109 -88 -109
+c-291 9 -401 200 -401 200c0 423 189 766 189 766c189 142 370 138 370 138zM522 722v0c-75 0 -134 -66 -134 -146s60 -146 134 -146c75 0 134 66 134 146c1 80 -59 146 -134 146zM1002 722v0c-75 0 -134 -66 -134 -146s60 -146 134 -146c75 0 134 66 134 146
+s-59 146 -134 146z" />
+    <glyph glyph-name="bitbucket-square" unicode="&#xf172;" 
+d="M848 666c0 57 -70 96 -118 67c-57 -27 -57 -119 1 -143c52 -31 125 16 117 76zM928 682c11 -88 -58 -174 -146 -182s-171 64 -175 153c-3 66 38 130 98 157c94 42 210 -26 223 -128zM1100 1073c-44 -45 -111 -51 -170 -58c-107 -14 -216 -13 -324 0
+c-59 8 -124 15 -170 58c28 40 78 48 123 55c135 24 273 23 408 1c48 -7 102 -15 133 -56zM1142 327c0 24 25 65 -9 75c-215 -142 -515 -142 -731 0l-12 -6l-5 -12c12 -70 23 -141 41 -210c41 -71 129 -95 204 -108c142 -26 299 -18 428 53c75 42 63 137 84 208zM1272 1020
+c4 24 9 53 -8 75c-38 48 -98 71 -155 88c-158 46 -325 52 -487 36c-77 -7 -154 -20 -226 -46c-54 -21 -127 -49 -136 -113c18 -150 47 -297 72 -446c8 -42 8 -92 46 -122c81 -62 184 -89 284 -100c148 -16 305 -5 440 63c38 20 82 46 90 92c28 157 55 314 80 473zM1536 1120
+v-960c0 -159 -129 -288 -288 -288h-960c-159 0 -288 129 -288 288v960c0 159 129 288 288 288h960c159 0 288 -129 288 -288z" />
+    <glyph glyph-name="hand-paper-o" unicode="&#xf256;" horiz-adv-x="1632" 
+d="M880 1408c-62 0 -112 -50 -112 -112v-656h-32v528c0 62 -50 112 -112 112s-112 -50 -112 -112v-784l-154 205c-24 32 -62 51 -102 51c-71 0 -128 -58 -128 -128c0 -28 9 -55 26 -77l384 -512c24 -32 62 -51 102 -51h688c46 0 86 33 95 78l76 405c3 19 5 39 5 59v498
+c0 62 -50 112 -112 112s-112 -50 -112 -112v-272h-32v528c0 62 -50 112 -112 112s-112 -50 -112 -112v-528h-32v656c0 62 -50 112 -112 112zM880 1536c90 0 173 -51 214 -132c14 3 28 4 42 4c132 0 240 -108 240 -240v-17c139 8 256 -99 256 -239v-498c0 -28 -3 -56 -8 -83
+l-76 -404c-19 -106 -112 -183 -220 -183h-688c-80 0 -157 39 -205 102l-384 512c-33 44 -51 99 -51 154c0 141 114 256 256 256c42 0 93 -10 128 -34v434c0 132 108 240 240 240c14 0 28 -1 42 -4c41 81 124 132 214 132z" />
+    <glyph glyph-name="database" unicode="&#xf1c0;" 
+d="M768 768c301 0 603 54 768 170v-170c0 -141 -344 -256 -768 -256s-768 115 -768 256v170c165 -116 467 -170 768 -170zM768 0c301 0 603 54 768 170v-170c0 -141 -344 -256 -768 -256s-768 115 -768 256v170c165 -116 467 -170 768 -170zM768 384c301 0 603 54 768 170
+v-170c0 -141 -344 -256 -768 -256s-768 115 -768 256v170c165 -116 467 -170 768 -170zM768 1536c424 0 768 -115 768 -256v-128c0 -141 -344 -256 -768 -256s-768 115 -768 256v128c0 141 344 256 768 256z" />
+    <glyph glyph-name="jirafeau" unicode="&#xf318;" 
+d="M1459 1408c43 0 77 -34 77 -77v-1382c0 -43 -34 -77 -77 -77h-923c18 109 27 134 50 210c31 103 92 108 92 108c49 11 74 31 224 -36s270 -72 270 -72v0c15 -19 71 -80 137 -85c90 -7 128 19 128 19s31 91 -38 176s-336 376 -343 403c0 0 -40 47 -69 58s-119 63 -135 130
+s-42 168 -33 215s22 152 -32 130s-31 -74 -40 -137s-52 -190 -112 -190c0 0 -87 150 -145 132s-108 -181 -63 -275c0 0 -210 -295 -393 -772c-20 14 -34 37 -34 63v1382c0 43 34 77 77 77h1382z" />
+    <glyph glyph-name="user-circle-o" unicode="&#xf2be;" horiz-adv-x="1792" 
+d="M896 1536c495 0 896 -401 896 -896c0 -492 -399 -896 -896 -896c-496 0 -896 403 -896 896c0 495 401 896 896 896zM1515 185c93 128 149 285 149 455c0 423 -345 768 -768 768s-768 -345 -768 -768c0 -170 56 -327 149 -455c36 179 123 327 306 327
+c81 -79 191 -128 313 -128s232 49 313 128c183 0 270 -148 306 -327zM1280 832c0 -212 -172 -384 -384 -384s-384 172 -384 384s172 384 384 384s384 -172 384 -384z" />
+    <glyph glyph-name="hacker-news" unicode="&#xf1d4;" 
+d="M809 532l266 499h-112l-157 -312s-24 -48 -44 -92c-19 46 -42 92 -42 92l-155 312h-120l263 -493v-324h101v318zM1536 1120v-960c0 -159 -129 -288 -288 -288h-960c-159 0 -288 129 -288 288v960c0 159 129 288 288 288h960c159 0 288 -129 288 -288z" />
+    <glyph glyph-name="edge" unicode="&#xf282;" horiz-adv-x="1654" 
+d="M0 741h1c52 414 335 796 841 795c307 0 560 -144 708 -409c76 -137 104 -283 104 -442v-188h-1125c5 -464 682 -448 974 -244v-377c-171 -103 -557 -192 -858 -77c-255 98 -433 363 -436 621c-4 333 165 554 436 680c-57 -72 -101 -150 -124 -285h635
+c37 379 -359 379 -359 379c-374 -13 -644 -231 -797 -453z" />
+    <glyph glyph-name="calendar-plus-o" unicode="&#xf271;" horiz-adv-x="1664" 
+d="M1536 1280c70 0 128 -58 128 -128v-1280c0 -70 -58 -128 -128 -128h-1408c-70 0 -128 58 -128 128v1280c0 70 58 128 128 128h128v96c0 88 72 160 160 160h64c88 0 160 -72 160 -160v-96h384v96c0 88 72 160 160 160h64c88 0 160 -72 160 -160v-96h128zM1152 1376v-288
+c0 -18 14 -32 32 -32h64c18 0 32 14 32 32v288c0 18 -14 32 -32 32h-64c-18 0 -32 -14 -32 -32zM384 1376v-288c0 -18 14 -32 32 -32h64c18 0 32 14 32 32v288c0 18 -14 32 -32 32h-64c-18 0 -32 -14 -32 -32zM1536 -128v1024h-1408v-1024h1408zM896 448h224
+c18 0 32 -14 32 -32v-64c0 -18 -14 -32 -32 -32h-224v-224c0 -18 -14 -32 -32 -32h-64c-18 0 -32 14 -32 32v224h-224c-18 0 -32 14 -32 32v64c0 18 14 32 32 32h224v224c0 18 14 32 32 32h64c18 0 32 -14 32 -32v-224z" />
+    <glyph glyph-name="hand-lizard-o" unicode="&#xf258;" horiz-adv-x="2048" 
+d="M1151 1536c81 0 159 -39 207 -105l572 -781c77 -104 118 -229 118 -359v-355c0 -106 -86 -192 -192 -192h-384c-106 0 -192 86 -192 192v177l-286 143h-546c-106 0 -192 86 -192 192v32c0 159 129 288 288 288h420l42 128h-686c-133 0 -244 102 -255 234
+c-42 51 -65 116 -65 182v32c0 106 86 192 192 192h959zM1920 -64v355c0 101 -33 202 -93 284l-573 781c-24 32 -62 52 -103 52h-959c-35 0 -64 -29 -64 -64c0 -53 1 -90 36 -133c13 41 50 69 92 69h832v-32h-832c-35 0 -64 -29 -64 -64c0 -19 -1 -39 3 -58
+c11 -59 65 -102 125 -102h731c53 0 96 -43 96 -96c0 -10 -2 -21 -5 -30l-64 -192c-13 -39 -50 -66 -91 -66h-443c-88 0 -160 -72 -160 -160v-32c0 -35 29 -64 64 -64h561c10 0 20 -2 29 -7l317 -158c32 -17 53 -50 53 -86v-197c0 -35 29 -64 64 -64h384c35 0 64 29 64 64z
+" />
+    <glyph glyph-name="digitalocean" unicode="&#xf31d;" horiz-adv-x="1535" 
+d="M245 169h-191v190h191v-190zM473 -59h-228v228h228v-228zM769 465v-296h-296v296h296zM768 -128v298c315 0 559 312 438 644c-44 123 -142 221 -265 265c-332 120 -644 -123 -644 -438h-297c0 502 485 894 1012 729c230 -72 414 -255 485 -485
+c165 -527 -226 -1013 -729 -1013z" />
+    <glyph glyph-name="xing" unicode="&#xf168;" horiz-adv-x="1408" 
+d="M597 869c0 0 -10 -17 -257 -456c-13 -22 -30 -46 -65 -46h-239c-14 0 -25 7 -31 17s-7 23 0 36l253 448c1 0 1 0 0 1l-161 279c-7 13 -8 27 -1 37c6 10 18 15 32 15h239c36 0 54 -24 66 -45c163 -285 164 -286 164 -286zM1403 1511c7 -10 7 -24 0 -37l-528 -934
+c-1 0 -1 -1 0 -1l336 -615c7 -13 7 -27 1 -37c-7 -10 -18 -15 -32 -15h-239c-36 0 -55 24 -66 45c-339 621 -339 622 -339 622s17 30 531 942c13 23 28 45 64 45h241c14 0 25 -5 31 -15z" />
+    <glyph glyph-name="youtube-square" unicode="&#xf166;" 
+d="M919 233v157c0 33 -10 50 -29 50c-11 0 -22 -5 -33 -16v-224c11 -11 22 -16 33 -16c19 0 29 16 29 49zM1103 355h66v34c0 34 -11 51 -33 51s-33 -17 -33 -51v-34zM532 621v-70h-80v-423h-74v423h-78v70h232zM733 495v-367h-67v40c-26 -30 -51 -45 -76 -45
+c-21 0 -36 9 -42 28c-4 11 -6 28 -6 54v290h66v-270c0 -15 0 -24 1 -26c1 -10 6 -15 15 -15c14 0 27 10 42 31v280h67zM985 384v-146c0 -33 -2 -58 -7 -73c-8 -28 -26 -42 -53 -42c-23 0 -46 14 -68 41v-36h-67v493h67v-161c21 26 44 40 68 40c27 0 45 -14 53 -42
+c5 -15 7 -39 7 -74zM1236 255v-9c0 -22 -1 -36 -2 -43c-2 -15 -7 -28 -15 -40c-18 -27 -46 -40 -80 -40c-35 0 -62 13 -81 38c-14 18 -21 47 -21 86v129c0 39 6 67 20 86c19 25 46 38 80 38c33 0 60 -13 78 -38c14 -19 21 -47 21 -86v-76h-133v-65c0 -34 11 -51 34 -51
+c16 0 26 9 30 26c0 4 1 19 1 45h68zM785 1079v-156c0 -34 -11 -51 -32 -51c-22 0 -32 17 -32 51v156c0 34 10 52 32 52c21 0 32 -18 32 -52zM1318 366c0 86 0 177 -19 260c-14 59 -62 102 -119 108c-136 15 -274 15 -412 15c-137 0 -275 0 -411 -15
+c-58 -6 -106 -49 -119 -108c-19 -83 -20 -174 -20 -260c0 -85 0 -176 20 -260c13 -58 61 -101 118 -108c137 -15 275 -15 412 -15s275 0 412 15c57 7 105 50 118 108c20 84 20 175 20 260zM563 1017l90 296h-75l-51 -195l-53 195h-78c15 -46 32 -92 47 -138
+c24 -70 39 -122 46 -158v-201h74v201zM852 936v130c0 39 -7 68 -21 87c-19 25 -45 38 -78 38c-34 0 -60 -13 -78 -38c-14 -19 -21 -48 -21 -87v-130c0 -39 7 -68 21 -87c18 -25 44 -38 78 -38c33 0 59 13 78 38c14 18 21 48 21 87zM1033 816h67v370h-67v-283
+c-15 -21 -29 -31 -42 -31c-9 0 -15 5 -16 16c-1 2 -1 10 -1 26v272h-67v-293c0 -26 2 -43 6 -55c7 -18 22 -27 43 -27c25 0 50 15 77 45v-40zM1536 1120v-960c0 -159 -129 -288 -288 -288h-960c-159 0 -288 129 -288 288v960c0 159 129 288 288 288h960
+c159 0 288 -129 288 -288z" />
+    <glyph glyph-name="taxi" unicode="&#xf1ba;" horiz-adv-x="2048" 
+d="M1824 640c124 0 224 -100 224 -224v-384c0 -18 -14 -32 -32 -32h-96v-64c0 -106 -86 -192 -192 -192s-192 86 -192 192v64h-1024v-64c0 -106 -86 -192 -192 -192s-192 86 -192 192v64h-96c-18 0 -32 14 -32 32v384c0 124 100 224 224 224h28l105 419
+c31 126 153 221 283 221h128v224c0 18 14 32 32 32h448c18 0 32 -14 32 -32v-224h128c130 0 252 -95 283 -221l105 -419h28zM320 160c88 0 160 72 160 160s-72 160 -160 160s-160 -72 -160 -160s72 -160 160 -160zM516 640h1016l-89 357c-3 11 -23 27 -35 27h-768
+c-12 0 -32 -16 -35 -27zM1728 160c88 0 160 72 160 160s-72 160 -160 160s-160 -72 -160 -160s72 -160 160 -160z" />
+    <glyph glyph-name="sort-desc" unicode="&#xf0dd;" horiz-adv-x="1024" 
+d="M1024 448c0 -17 -7 -33 -19 -45l-448 -448c-12 -12 -28 -19 -45 -19s-33 7 -45 19l-448 448c-12 12 -19 28 -19 45c0 35 29 64 64 64h896c35 0 64 -29 64 -64z" />
+    <glyph glyph-name="rocket" unicode="&#xf135;" horiz-adv-x="1632" 
+d="M1408 1088c0 53 -43 96 -96 96s-96 -43 -96 -96s43 -96 96 -96s96 43 96 96zM1632 1376c0 -332 -92 -553 -329 -791c-58 -57 -124 -116 -195 -176l-20 -379c-1 -10 -7 -20 -16 -26l-384 -224c-5 -3 -10 -4 -16 -4c-8 0 -16 3 -23 9l-64 64c-8 9 -11 21 -8 32l85 276
+l-281 281l-276 -85c-3 -1 -6 -1 -9 -1c-8 0 -17 3 -23 9l-64 64c-10 11 -12 27 -5 39l224 384c6 9 16 15 26 16l379 20c60 71 119 137 176 195c250 249 441 329 789 329c18 0 34 -14 34 -32z" />
+    <glyph glyph-name="discord" unicode="&#xf2ee;" 
+d="M180 1516v0h1176c99 0 180 -81 180 -181v-1575l-189 167l-106 98l-112 105l46 -163h-995c-99 0 -180 81 -180 181v1187c0 100 81 181 180 181zM634 1107c0 0 -121 3 -247 -92c0 0 -126 -229 -126 -512c0 0 73 -128 267 -134c0 0 33 40 59 73c-111 33 -153 104 -153 104
+s8 -6 24 -15c1 -1 2 -2 4 -3c3 -2 5 -2 8 -4c22 -12 44 -22 64 -30c36 -14 79 -28 129 -38c66 -12 143 -17 227 -1c41 7 83 20 127 38c31 11 65 28 101 52c0 0 -44 -73 -159 -105c26 -33 58 -71 58 -71c194 6 269 134 269 134c0 283 -127 512 -127 512
+c-126 95 -246 92 -246 92l-12 -14c149 -46 218 -112 218 -112c-91 50 -181 75 -264 85c-63 7 -123 5 -177 -2c-5 0 -10 -1 -15 -2c-31 -3 -106 -14 -200 -55c-32 -15 -51 -26 -51 -26s72 69 230 115zM609 779c50 0 91 -43 90 -97c0 -54 -40 -98 -90 -98c-49 0 -89 44 -89 98
+s39 97 89 97zM930 779c50 0 89 -43 89 -97s-39 -98 -89 -98c-49 0 -90 44 -90 98s40 97 90 97z" />
+    <glyph glyph-name="money" unicode="&#xf0d6;" horiz-adv-x="1920" 
+d="M768 384h384v96h-128v448h-114l-148 -137l77 -80c24 21 39 32 55 57h2v-288h-128v-96zM1280 640c0 -182 -110 -416 -320 -416s-320 234 -320 416s110 416 320 416s320 -234 320 -416zM1792 384v512c-141 0 -256 115 -256 256h-1152c0 -141 -115 -256 -256 -256v-512
+c141 0 256 -115 256 -256h1152c0 141 115 256 256 256zM1920 1216v-1152c0 -35 -29 -64 -64 -64h-1792c-35 0 -64 29 -64 64v1152c0 35 29 64 64 64h1792c35 0 64 -29 64 -64z" />
+    <glyph glyph-name="laptop" unicode="&#xf109;" horiz-adv-x="1920" 
+d="M416 256c-88 0 -160 72 -160 160v704c0 88 72 160 160 160h1088c88 0 160 -72 160 -160v-704c0 -88 -72 -160 -160 -160h-1088zM384 1120v-704c0 -17 15 -32 32 -32h1088c17 0 32 15 32 32v704c0 17 -15 32 -32 32h-1088c-17 0 -32 -15 -32 -32zM1760 192h160v-96
+c0 -53 -72 -96 -160 -96h-1600c-88 0 -160 43 -160 96v96h1760zM1040 96c9 0 16 7 16 16s-7 16 -16 16h-160c-9 0 -16 -7 -16 -16s7 -16 16 -16h160z" />
+    <glyph glyph-name="arrows-alt" unicode="&#xf0b2;" 
+d="M1283 995l-355 -355l355 -355l144 144c18 19 46 24 70 14c23 -10 39 -33 39 -59v-448c0 -35 -29 -64 -64 -64h-448c-26 0 -49 16 -59 40c-10 23 -5 51 14 69l144 144l-355 355l-355 -355l144 -144c19 -18 24 -46 14 -69c-10 -24 -33 -40 -59 -40h-448
+c-35 0 -64 29 -64 64v448c0 26 16 49 40 59c23 10 51 5 69 -14l144 -144l355 355l-355 355l-144 -144c-12 -12 -28 -19 -45 -19c-8 0 -17 2 -24 5c-24 10 -40 33 -40 59v448c0 35 29 64 64 64h448c26 0 49 -16 59 -40c10 -23 5 -51 -14 -69l-144 -144l355 -355l355 355
+l-144 144c-19 18 -24 46 -14 69c10 24 33 40 59 40h448c35 0 64 -29 64 -64v-448c0 -26 -16 -49 -39 -59c-8 -3 -17 -5 -25 -5c-17 0 -33 7 -45 19z" />
+    <glyph glyph-name="thermometer-empty" unicode="&#xf2cb;" horiz-adv-x="1024" 
+d="M640 192c0 -106 -86 -192 -192 -192s-192 86 -192 192c0 105 85 192 192 192s192 -88 192 -192zM768 192c0 105 -50 197 -128 256v768c0 106 -86 192 -192 192s-192 -86 -192 -192v-768c-78 -59 -128 -151 -128 -256c0 -177 143 -320 320 -320s320 143 320 320zM896 192
+c0 -247 -201 -448 -448 -448s-448 201 -448 448c0 122 49 232 128 313v711c0 177 143 320 320 320s320 -143 320 -320v-711c79 -81 128 -191 128 -313zM1024 768v-128h-192v128h192zM1024 1024v-128h-192v128h192zM1024 1280v-128h-192v128h192z" />
+    <glyph glyph-name="underline" unicode="&#xf0cd;" 
+d="M48 1313c-18 1 -33 1 -45 4l-3 88c13 1 26 1 40 1c35 0 73 -1 112 -4c94 -5 150 -7 166 -7c57 0 113 1 168 3c54 2 103 4 146 5c42 0 71 1 86 2l-1 -14l2 -64v-9c-40 -6 -81 -9 -124 -9c-40 0 -66 -8 -79 -25c-9 -10 -13 -54 -13 -132c0 -24 1 -43 1 -58l1 -229l14 -280
+c4 -81 20 -148 51 -202c23 -39 55 -70 96 -92c60 -32 119 -47 177 -47c68 0 132 9 191 28c35 11 68 27 99 51c31 23 53 44 65 64c26 40 43 79 53 114c14 49 21 125 21 229c0 179 -13 184 -28 410l-4 59c-3 43 -10 73 -24 88c-22 23 -48 35 -77 34l-100 -2l-14 3l2 86h84
+l205 -10c68 -3 133 3 196 10l18 -2c4 -25 6 -42 6 -51s-2 -19 -4 -31c-27 -7 -55 -12 -84 -13c-47 -7 -74 -12 -79 -17c-9 -9 -15 -22 -15 -41c0 -13 2 -33 3 -58c0 0 8 -18 22 -396c5 -151 -5 -253 -15 -304s-24 -92 -41 -122c-26 -44 -64 -85 -112 -123
+c-49 -37 -109 -67 -182 -89s-158 -33 -255 -33c-110 0 -205 15 -284 46s-139 72 -179 122s-68 115 -83 195c-11 55 -16 134 -16 237v333c0 126 -6 197 -17 213c-16 23 -65 37 -147 39zM1536 -96c0 -18 -14 -32 -32 -32h-1472c-18 0 -32 14 -32 32v64c0 18 14 32 32 32h1472
+c18 0 32 -14 32 -32v-64z" />
+    <glyph glyph-name="sun-o" unicode="&#xf185;" horiz-adv-x="1707" 
+d="M1430 640c0 318 -258 576 -576 576s-576 -258 -576 -576s258 -576 576 -576s576 258 576 576zM1706 363c-3 -10 -11 -17 -20 -20l-292 -96v-306c0 -10 -5 -20 -13 -26c-9 -6 -19 -8 -29 -4l-292 94l-180 -248c-6 -8 -16 -13 -26 -13s-20 5 -26 13l-180 248l-292 -94
+c-10 -4 -20 -2 -29 4c-8 6 -13 16 -13 26v306l-292 96c-9 3 -17 10 -20 20s-2 21 4 29l180 248l-180 248c-6 9 -7 19 -4 29s11 17 20 20l292 96v306c0 10 5 20 13 26c9 6 19 8 29 4l292 -94l180 248c12 16 40 16 52 0l180 -248l292 94c10 4 20 2 29 -4c8 -6 13 -16 13 -26
+v-306l292 -96c9 -3 17 -10 20 -20s2 -20 -4 -29l-180 -248l180 -248c6 -8 7 -19 4 -29z" />
+    <glyph glyph-name="activitypub" unicode="&#xf2f2;" horiz-adv-x="2032" 
+d="M924 1280v-1280l-185 107v853l-739 -427v214zM1109 1280l923 -533v-214l-923 -533v213l739 427l-739 427v213zM1109 853l369 -213l-369 -213v426zM554 640v-427l-369 214z" />
+    <glyph glyph-name="play-circle" unicode="&#xf144;" 
+d="M768 1408c424 0 768 -344 768 -768s-344 -768 -768 -768s-768 344 -768 768s344 768 768 768zM1152 585c20 11 32 32 32 55s-12 44 -32 55l-544 320c-19 12 -44 12 -64 1c-20 -12 -32 -33 -32 -56v-640c0 -23 12 -44 32 -56c10 -5 21 -8 32 -8s22 3 32 9z" />
+    <glyph glyph-name="share-square-o" unicode="&#xf045;" horiz-adv-x="1664" 
+d="M1408 547v-259c0 -159 -129 -288 -288 -288h-832c-159 0 -288 129 -288 288v832c0 159 129 288 288 288h255c17 0 32 -14 32 -32c0 -16 -11 -29 -26 -32c-50 -17 -95 -37 -133 -60c-5 -2 -10 -4 -16 -4h-112c-88 0 -160 -72 -160 -160v-832c0 -88 72 -160 160 -160h832
+c88 0 160 72 160 160v214c0 12 7 23 18 29c20 9 38 22 54 37c9 9 23 13 35 8s21 -16 21 -29zM1645 1043l-384 -384c-12 -13 -28 -19 -45 -19c-8 0 -17 2 -25 5c-23 10 -39 33 -39 59v192h-160c-220 0 -360 -42 -438 -131c-81 -93 -105 -243 -74 -473c2 -14 -7 -28 -20 -34
+c-4 -1 -8 -2 -12 -2c-10 0 -20 5 -26 13c-7 10 -166 235 -166 435c0 268 84 576 736 576h160v192c0 26 16 49 39 59c8 3 17 5 25 5c17 0 33 -7 45 -19l384 -384c25 -25 25 -65 0 -90z" />
+    <glyph glyph-name="street-view" unicode="&#xf21d;" horiz-adv-x="1408" 
+d="M1408 0c0 -176 -365 -256 -704 -256s-704 80 -704 256c0 136 203 200 373 229c35 6 68 -17 74 -52s-17 -68 -52 -74c-206 -36 -264 -92 -267 -104c10 -34 202 -127 576 -127s566 93 576 129c-3 10 -61 66 -267 102c-35 6 -58 39 -52 74s39 58 74 52
+c170 -29 373 -93 373 -229zM1024 896v-384c0 -35 -29 -64 -64 -64h-64v-384c0 -35 -29 -64 -64 -64h-256c-35 0 -64 29 -64 64v384h-64c-35 0 -64 29 -64 64v384c0 71 57 128 128 128h384c71 0 128 -57 128 -128zM928 1280c0 -124 -100 -224 -224 -224s-224 100 -224 224
+s100 224 224 224s224 -100 224 -224z" />
+    <glyph glyph-name="arrow-circle-up" unicode="&#xf0aa;" 
+d="M1284 641c0 17 -6 33 -18 45l-362 362l-91 91c-12 12 -28 18 -45 18s-33 -6 -45 -18l-91 -91l-362 -362c-12 -12 -18 -28 -18 -45s6 -33 18 -45l91 -91c12 -12 28 -18 45 -18s33 6 45 18l189 189v-502c0 -35 29 -64 64 -64h128c35 0 64 29 64 64v502l189 -189
+c12 -12 28 -19 45 -19s33 7 45 19l91 91c12 12 18 28 18 45zM1536 640c0 -424 -344 -768 -768 -768s-768 344 -768 768s344 768 768 768s768 -344 768 -768z" />
+    <glyph glyph-name="podcast" unicode="&#xf2ce;" 
+d="M994 344c0 -66 -7 -132 -17 -197c-15 -104 -30 -211 -55 -313c-18 -73 -86 -90 -152 -90s-134 17 -152 90c-25 102 -40 209 -55 313c-10 65 -17 131 -17 197c0 135 109 168 224 168s224 -33 224 -168zM1536 768c0 -324 -200 -601 -484 -714c-11 -4 -23 6 -21 18
+c3 21 6 43 10 66c2 16 4 32 6 47c1 6 4 10 9 12c208 106 352 322 352 571c0 365 -306 659 -675 639c-338 -18 -607 -306 -605 -644c2 -249 147 -464 356 -568c5 -2 8 -7 9 -12c2 -14 4 -29 6 -45c4 -24 7 -46 11 -68c2 -12 -11 -22 -22 -17c-297 116 -504 412 -487 753
+c19 387 331 704 718 728c446 28 817 -326 817 -766zM994 800c0 -124 -100 -224 -224 -224s-224 100 -224 224s100 224 224 224s224 -100 224 -224zM1282 768c0 -165 -79 -313 -200 -406c-10 -8 -24 -1 -26 12c-3 28 -11 61 -29 92c-4 6 -3 14 3 20c76 70 124 170 124 282
+c0 226 -197 407 -428 382c-177 -20 -321 -166 -338 -344c-13 -126 37 -242 122 -320c6 -6 7 -14 3 -20c-18 -31 -26 -64 -29 -93c-2 -12 -16 -19 -26 -11c-124 96 -203 247 -200 417c6 266 222 488 487 500c294 14 537 -220 537 -511z" />
+    <glyph glyph-name="hackster" unicode="&#xf326;" 
+d="M768 -128c-424 0 -768 344 -768 768s344 768 768 768s768 -344 768 -768s-344 -768 -768 -768zM517 887c-10 -3 -17 -13 -17 -23s8 -18 18 -18h113c17 0 31 14 31 31v9c0 3 0 5 -1 8c-4 16 -22 26 -38 22zM661 739v59v5c-2 9 -12 13 -21 11l-325 -88c-5 -1 -9 -7 -9 -12
+s4 -9 9 -9h151c17 0 31 -14 31 -31v-86c0 -9 8 -17 17 -17h324c17 0 31 -13 31 -30v-59v-5c2 -9 12 -13 21 -11l325 88c5 1 9 7 9 12s-4 9 -9 9h-152c-17 0 -30 14 -30 31v85c0 9 -8 17 -17 17h-324c-17 0 -31 14 -31 31v0zM891 989c-13 -4 -23 -16 -23 -30v-176
+c0 -17 14 -31 31 -31h101c17 0 30 14 30 31v203v0c0 2 0 6 -1 8c-4 16 -21 26 -37 22zM1013 386c10 3 17 13 17 23s-8 19 -18 19h-113c-17 0 -31 -14 -31 -31v-9c0 -3 0 -5 1 -8c4 -16 22 -26 38 -22zM639 285c13 4 23 16 23 30v176c0 17 -14 30 -31 30h-101
+c-17 0 -30 -13 -30 -30v-204c0 -3 0 -5 1 -8c4 -16 21 -25 37 -21z" />
+    <glyph glyph-name="plus-square" unicode="&#xf0fe;" 
+d="M1280 576v128c0 35 -29 64 -64 64h-320v320c0 35 -29 64 -64 64h-128c-35 0 -64 -29 -64 -64v-320h-320c-35 0 -64 -29 -64 -64v-128c0 -35 29 -64 64 -64h320v-320c0 -35 29 -64 64 -64h128c35 0 64 29 64 64v320h320c35 0 64 29 64 64zM1536 1120v-960
+c0 -159 -129 -288 -288 -288h-960c-159 0 -288 129 -288 288v960c0 159 129 288 288 288h960c159 0 288 -129 288 -288z" />
+    <glyph glyph-name="desktop" unicode="&#xf108;" horiz-adv-x="1920" 
+d="M1792 544v832c0 17 -15 32 -32 32h-1600c-17 0 -32 -15 -32 -32v-832c0 -17 15 -32 32 -32h1600c17 0 32 15 32 32zM1920 1376v-1088c0 -88 -72 -160 -160 -160h-544c0 -85 64 -157 64 -192s-29 -64 -64 -64h-512c-35 0 -64 29 -64 64c0 37 64 105 64 192h-544
+c-88 0 -160 72 -160 160v1088c0 88 72 160 160 160h1600c88 0 160 -72 160 -160z" />
+    <glyph glyph-name="expeditedssl" unicode="&#xf23e;" horiz-adv-x="1792" 
+d="M896 1472c-459 0 -832 -373 -832 -832s373 -832 832 -832s832 373 832 832s-373 832 -832 832zM896 1536c495 0 896 -401 896 -896s-401 -896 -896 -896s-896 401 -896 896s401 896 896 896zM496 704c9 0 16 -7 16 -16v-480c0 -9 -7 -16 -16 -16h-32c-9 0 -16 7 -16 16
+v480c0 9 7 16 16 16h32zM896 640c71 0 128 -57 128 -128c0 -47 -26 -88 -64 -110v-114c0 -18 -14 -32 -32 -32h-64c-18 0 -32 14 -32 32v114c-38 22 -64 63 -64 110c0 71 57 128 128 128zM896 1408c424 0 768 -344 768 -768s-344 -768 -768 -768s-768 344 -768 768
+s344 768 768 768zM544 928v-96c0 -18 14 -32 32 -32h64c18 0 32 14 32 32v96c0 124 100 224 224 224s224 -100 224 -224v-96c0 -18 14 -32 32 -32h64c18 0 32 14 32 32v96c0 194 -158 352 -352 352s-352 -158 -352 -352zM1408 192v512c0 35 -29 64 -64 64h-896
+c-35 0 -64 -29 -64 -64v-512c0 -35 29 -64 64 -64h896c35 0 64 29 64 64z" />
+    <glyph glyph-name="toggle-on" unicode="&#xf205;" horiz-adv-x="2048" 
+d="M0 640c0 353 287 640 640 640h768c353 0 640 -287 640 -640s-287 -640 -640 -640h-768c-353 0 -640 287 -640 640zM1408 128c282 0 512 230 512 512s-230 512 -512 512s-512 -230 -512 -512s230 -512 512 -512z" />
+    <glyph glyph-name="minus-square" unicode="&#xf146;" 
+d="M1280 576v128c0 35 -29 64 -64 64h-896c-35 0 -64 -29 -64 -64v-128c0 -35 29 -64 64 -64h896c35 0 64 29 64 64zM1536 1120v-960c0 -159 -129 -288 -288 -288h-960c-159 0 -288 129 -288 288v960c0 159 129 288 288 288h960c159 0 288 -129 288 -288z" />
+    <glyph glyph-name="adn" unicode="&#xf170;" 
+d="M768 914l201 -306h-402zM1133 384h94l-459 691l-459 -691h94l104 160h522zM1536 640c0 -424 -344 -768 -768 -768s-768 344 -768 768s344 768 768 768s768 -344 768 -768z" />
+    <glyph glyph-name="whatsapp" unicode="&#xf232;" 
+d="M985 562c17 0 180 -85 187 -97c2 -5 2 -11 2 -15c0 -25 -8 -53 -17 -76c-23 -56 -116 -92 -173 -92c-48 0 -147 42 -190 62c-143 65 -232 176 -318 303c-38 56 -72 125 -71 194v8c2 66 26 113 74 158c15 14 31 22 52 22c12 0 24 -3 37 -3c27 0 32 -8 42 -34
+c7 -17 58 -153 58 -163c0 -38 -69 -81 -69 -104c0 -5 2 -10 5 -15c22 -47 64 -101 102 -137c46 -44 95 -73 151 -101c7 -4 14 -7 22 -7c30 0 80 97 106 97zM782 32c346 0 628 282 628 628s-282 628 -628 628s-628 -282 -628 -628c0 -132 42 -261 120 -368l-79 -233l242 77
+c102 -67 223 -104 345 -104zM782 1414c416 0 754 -338 754 -754s-338 -754 -754 -754c-127 0 -253 32 -365 94l-417 -134l136 405c-71 117 -108 252 -108 389c0 416 338 754 754 754z" />
+    <glyph glyph-name="puzzle-piece" unicode="&#xf12e;" horiz-adv-x="1664" 
+d="M1664 438c0 -103 -59 -189 -168 -189c-122 0 -154 111 -264 111c-80 0 -110 -50 -110 -124c0 -78 32 -153 31 -230v-5c-11 0 -22 0 -33 -1c-103 -10 -207 -30 -311 -30c-71 0 -145 28 -145 110c0 110 111 142 111 264c0 109 -86 168 -189 168c-105 0 -202 -58 -202 -173
+c0 -127 97 -182 97 -251c0 -35 -22 -66 -46 -89c-31 -29 -75 -35 -117 -35c-82 0 -164 11 -245 24c-18 3 -37 5 -55 8l-13 2c-2 1 -5 1 -5 2v1024c4 -3 63 -10 73 -12c81 -13 163 -24 245 -24c42 0 86 6 117 35c24 23 46 54 46 89c0 69 -97 124 -97 251
+c0 115 97 173 203 173c102 0 188 -59 188 -168c0 -122 -111 -154 -111 -264c0 -82 74 -110 145 -110c115 0 229 26 343 32v-2c-3 -4 -10 -63 -12 -73c-13 -81 -24 -163 -24 -245c0 -42 6 -86 35 -117c23 -24 54 -46 89 -46c69 0 124 97 251 97c115 0 173 -97 173 -202z" />
+    <glyph glyph-name="css3" unicode="&#xf13c;" horiz-adv-x="1768" 
+d="M263 1408h1505l-266 -1333l-804 -267l-698 267l71 356h297l-29 -147l422 -161l486 161l68 339h-1208l58 297h1209l38 191h-1208z" />
+    <glyph glyph-name="skyatlas" unicode="&#xf216;" horiz-adv-x="2048" 
+d="M1430 953c0 0 -1 1 0 0zM1690 749c194 0 358 -145 358 -343c0 -211 -168 -366 -376 -366c-531 0 -629 799 -1151 799c-202 0 -349 -129 -349 -336c0 -214 160 -343 367 -343c136 0 291 57 401 136c18 13 54 52 73 52s35 -16 35 -35c0 -25 -42 -61 -60 -77
+c-131 -114 -321 -196 -495 -196c-267 0 -493 189 -493 464s216 477 489 477c593 0 712 -787 1158 -787c134 0 235 87 235 224c0 127 -98 223 -224 223c-56 0 -112 -37 -150 -37c-27 0 -51 23 -51 50c0 37 17 76 17 116c0 213 -163 367 -374 367c-170 0 -256 -118 -284 -118
+c-20 0 -36 16 -36 36c0 18 13 33 25 46c81 92 207 140 329 140c254 0 445 -187 445 -441c0 -22 -1 -44 -4 -66c38 10 77 15 115 15z" />
+    <glyph glyph-name="level-down" unicode="&#xf149;" horiz-adv-x="1024" 
+d="M32 1280h704c18 0 32 -15 32 -33v-863h192c25 0 47 -15 58 -37c11 -23 7 -50 -9 -69l-320 -384c-24 -29 -74 -29 -98 0l-320 384c-16 19 -19 46 -9 69c11 22 33 37 58 37h192v640h-320c-9 0 -18 4 -25 11l-160 192c-8 9 -9 23 -4 34s17 19 29 19z" />
+    <glyph glyph-name="stack-overflow" unicode="&#xf16c;" horiz-adv-x="1514" 
+d="M1278 -96v480h160v-640h-1438v640h160v-480h1118zM336 428l33 157l783 -165l-33 -156zM439 802l67 146l725 -339l-67 -145zM640 1158l102 123l614 -513l-102 -123zM1037 1536l477 -641l-128 -96l-477 641zM319 65v159h800v-159h-800z" />
+    <glyph glyph-name="check-square-o" unicode="&#xf046;" horiz-adv-x="1663" 
+d="M1408 606v-318c0 -159 -129 -288 -288 -288h-832c-159 0 -288 129 -288 288v832c0 159 129 288 288 288h832c40 0 80 -8 117 -25c9 -4 16 -13 18 -23c2 -11 -1 -21 -9 -29l-49 -49c-6 -6 -15 -10 -23 -10c-3 0 -6 1 -9 2c-15 4 -30 6 -45 6h-832
+c-88 0 -160 -72 -160 -160v-832c0 -88 72 -160 160 -160h832c88 0 160 72 160 160v254c0 8 3 16 9 22l64 64c7 7 15 10 23 10c4 0 8 -1 12 -3c12 -5 20 -16 20 -29zM1639 1095l-814 -814c-32 -32 -82 -32 -114 0l-430 430c-32 32 -32 82 0 114l110 110c32 32 82 32 114 0
+l263 -263l647 647c32 32 82 32 114 0l110 -110c32 -32 32 -82 0 -114z" />
+    <glyph glyph-name="emby" unicode="&#xf319;" horiz-adv-x="1534" 
+d="M474 224l-62 -62l-412 415l356 356l-60 61l414 414l355 -355l58 57l411 -414l-352 -352l58 -58l-414 -414zM1091 633l-496 291v-578z" />
+    <glyph glyph-name="hand-spock-o" unicode="&#xf259;" horiz-adv-x="1920" 
+d="M459 -256c-103 0 -192 70 -217 170l-101 401c-8 35 -13 72 -13 108c0 23 0 45 -5 67l-116 477c-5 19 -7 38 -7 57c0 124 94 226 217 239c22 113 119 193 235 193c111 0 207 -76 233 -184l83 -348l103 428c26 108 122 184 233 184c119 0 217 -86 236 -202
+c123 -14 212 -118 212 -241c0 -19 -3 -39 -7 -59l-123 -512c80 60 138 118 243 118c139 0 255 -113 255 -253c0 -84 -41 -162 -107 -212l-507 -380c-44 -33 -98 -51 -153 -51h-694zM1104 1408c-51 0 -96 -36 -108 -86l-164 -682h-127l-145 602c-12 50 -57 86 -108 86
+c-64 0 -112 -51 -112 -113c0 -10 1 -19 3 -28l132 -547h-26l-99 408c-12 49 -57 88 -109 88c-62 0 -113 -50 -113 -112c0 -9 1 -18 3 -26l116 -478c14 -58 4 -116 19 -174l100 -401c11 -43 49 -73 93 -73h694c27 0 54 9 76 26l507 379c34 26 56 67 56 110
+c0 70 -58 125 -127 125c-28 0 -55 -9 -77 -26l-307 -230v227c0 8 129 538 139 581c2 9 4 19 4 29c0 62 -47 115 -111 115c-52 0 -97 -36 -109 -86l-116 -482h-26l150 624c2 9 3 19 3 28c0 63 -46 116 -111 116z" />
+    <glyph glyph-name="scuttlebutt" unicode="&#xf2ea;" horiz-adv-x="1709" 
+d="M760 -126c-31 4 -114 28 -131 38c-5 3 -12 10 -16 16l-8 10l-7 -5c-14 -9 -14 -9 -151 60c-70 36 -134 68 -141 71c-21 10 -30 25 -45 74c-5 17 -6 19 -12 21c-18 7 -84 50 -121 78c-27 21 -66 60 -70 70c-10 25 -31 91 -37 112c-18 60 -21 88 -21 178c0 60 0 68 4 76
+c5 11 24 29 46 43c29 19 128 68 192 96l8 4l-4 8c-3 5 -16 24 -29 42l-24 33h-10c-21 1 -28 3 -48 16s-21 13 -39 41c-56 87 -91 163 -95 205c-4 46 23 129 52 160c9 9 17 16 28 22c16 8 17 8 40 8c19 0 25 -1 35 -5c27 -11 44 -29 49 -50c2 -11 2 -17 -1 -43
+c-9 -68 -1 -127 21 -163c4 -6 16 -19 28 -29c19 -17 38 -37 38 -43c0 -7 4 -1 11 15c9 23 70 138 78 148l5 8l-2 25c-8 86 -8 113 0 139c5 18 16 33 31 39c26 12 96 16 121 8c15 -5 28 -14 35 -26c5 -7 6 -12 7 -27l1 -18l52 8c71 11 95 16 116 24c26 10 38 13 57 13
+c29 0 45 -6 104 -37c137 -72 176 -97 219 -139c24 -23 28 -31 49 -73c17 -34 19 -37 38 -57l20 -21l23 6c28 8 37 8 49 2c10 -5 22 -21 22 -29c0 -2 4 -9 9 -16c7 -10 24 -34 39 -58c0 0 6 1 12 3c13 5 27 6 38 1c4 -2 17 -10 28 -19c11 -8 20 -15 21 -15s12 -7 25 -15
+c13 -9 27 -17 32 -18s14 -6 20 -9c13 -8 27 -10 64 -13c15 -1 31 -4 35 -5c18 -5 46 -31 55 -51c8 -18 5 -43 -9 -65c-4 -6 -18 -21 -30 -33s-23 -23 -24 -26s1 -24 4 -47c8 -67 4 -101 -13 -127c-8 -12 -29 -26 -59 -40c-13 -6 -24 -13 -27 -15s-8 -14 -12 -26
+c-9 -26 -17 -44 -26 -54c-8 -10 -10 -18 -13 -57c-4 -53 -10 -71 -37 -99c-20 -21 -37 -29 -70 -39c-11 -3 -49 -16 -85 -28c-35 -12 -66 -22 -68 -22s-6 -5 -9 -11c-14 -25 -33 -48 -63 -75c-48 -43 -116 -83 -163 -97c-9 -3 -16 -7 -24 -14c-43 -38 -88 -56 -154 -62
+c-28 -2 -42 -3 -63 0zM820 -67c13 1 31 5 41 7c18 4 49 17 49 20c0 1 -9 6 -20 12s-37 22 -56 36c-70 48 -117 94 -124 121c-9 35 -9 157 1 321c2 29 3 52 2 53c-3 3 -131 99 -131 99c-2 -2 -20 -148 -25 -210c-5 -54 -7 -145 -4 -170c3 -21 10 -46 32 -105
+c24 -66 44 -109 63 -139l9 -14l26 -8c44 -15 83 -25 104 -25c5 0 20 1 33 2zM559 26c-15 35 -29 69 -47 122c-14 40 -15 45 -17 70c-6 75 4 212 26 365c4 29 7 55 7 57c0 3 -11 12 -33 28c-30 22 -50 32 -58 32c-5 0 -83 -100 -120 -153c-34 -49 -63 -103 -68 -122
+c-2 -10 42 -188 64 -258c16 -52 -1 -38 137 -108l120 -60s-5 12 -11 27zM988 8c27 8 80 38 113 63c21 16 45 38 44 39c-1 0 -24 -2 -51 -6c-28 -4 -58 -7 -68 -7c-45 0 -82 18 -99 48c-8 14 -22 51 -31 82c-7 24 -8 30 -9 64c-1 30 -3 43 -7 59c-6 22 -18 48 -26 55
+c-9 8 -48 36 -57 40c-5 2 -13 7 -18 10l-9 6l-1 -10c-4 -31 -7 -124 -7 -206c0 -107 -2 -99 22 -123c49 -49 155 -116 185 -117c4 0 13 1 19 3zM1086 191c27 4 59 9 71 11c31 6 92 24 138 41c22 8 49 17 61 20c39 11 51 21 55 44c1 8 2 8 -3 7c-48 -15 -87 -22 -143 -24
+c-94 -4 -148 8 -226 46c-23 12 -57 33 -74 47c-5 4 -9 7 -9 7s3 -13 6 -27c5 -20 7 -33 8 -62c2 -39 6 -57 22 -97c6 -14 7 -16 13 -18c12 -4 31 -2 81 5zM232 241c-1 2 -10 37 -20 78s-19 77 -20 79c-4 8 -3 30 3 48c18 54 75 143 164 253c11 13 19 25 19 26
+c0 3 -40 24 -53 27c-7 2 -20 6 -27 9c-13 5 -14 5 -22 1c-4 -2 -28 -13 -53 -24c-76 -34 -138 -68 -159 -84l-7 -5l1 -71c1 -78 3 -88 17 -138c6 -20 26 -79 36 -106c3 -8 33 -36 58 -55c20 -15 62 -42 64 -42c0 0 0 2 -1 4v0zM1306 380c32 4 65 11 87 20c16 7 40 20 47 27
+c5 5 12 18 11 20l-24 -2c-44 -4 -92 -5 -118 -2c-32 3 -55 10 -86 26c-59 29 -105 72 -127 117c-11 23 -13 31 -13 52c0 63 43 117 183 229c22 17 40 32 41 33c0 1 -7 14 -17 29l-18 28l-11 2c-11 2 -13 2 -44 -8c-41 -14 -52 -16 -104 -22c-23 -2 -48 -7 -55 -9
+c-17 -5 -40 -21 -57 -39c-19 -20 -75 -92 -90 -116c-19 -29 -19 -33 -11 -52c4 -9 13 -27 20 -41s16 -33 20 -43c6 -16 9 -25 23 -88c7 -34 14 -49 32 -69c31 -33 75 -60 131 -80c49 -17 105 -20 180 -12zM889 488c0 0 -1 6 -3 12s-6 26 -10 44c-8 41 -14 58 -29 86
+c-16 31 -34 71 -37 83c-3 14 1 37 9 58c10 24 35 62 74 111c54 68 87 98 126 115c19 8 40 13 80 17c18 2 35 4 38 5c5 1 5 1 -2 9c-11 13 -23 33 -36 62c-10 22 -16 31 -26 42c-29 31 -63 54 -150 100c-35 18 -68 36 -73 39c-14 9 -36 17 -46 17c-5 0 -19 -4 -31 -9
+c-25 -10 -61 -17 -144 -30c-29 -5 -53 -9 -54 -9c-3 -3 -2 -38 1 -62c7 -50 24 -108 42 -142c9 -18 10 -29 4 -39c-5 -8 -27 -28 -34 -31c-9 -4 -12 -25 -11 -72c0 -33 0 -38 6 -57c9 -29 14 -67 13 -106l-1 -32l86 -65c112 -84 134 -100 153 -111c9 -5 24 -15 34 -22
+c16 -12 21 -15 21 -13zM1392 530c61 4 104 12 148 30l26 11v13c1 12 -2 47 -4 49c0 1 -6 -1 -10 -3c-22 -12 -53 -16 -74 -9c-34 12 -72 52 -86 90c-5 13 -5 18 -4 34s1 21 7 34c8 18 25 39 39 51c6 5 11 9 11 10s-3 3 -7 4c-4 2 -14 8 -22 14l-14 11l-19 -16
+c-10 -9 -37 -32 -61 -51c-70 -55 -85 -67 -114 -98c-24 -24 -29 -32 -36 -46c-7 -13 -6 -18 -4 -28c10 -26 42 -57 80 -77c44 -24 66 -28 144 -23zM1533 717c27 16 74 54 62 49c-2 -1 -9 -2 -16 -3c-15 -1 -28 5 -38 17c-6 8 -8 8 -15 6c-18 -5 -43 -23 -51 -36
+c-4 -7 -5 -9 -2 -15c1 -4 8 -12 14 -19c11 -11 12 -12 20 -11c5 1 17 6 26 12zM525 805c-4 36 -5 39 -38 113c-9 21 -11 22 -17 22c-8 0 -16 4 -23 11c-3 3 -13 28 -23 55c-13 36 -18 48 -19 46c-4 -5 -29 -57 -35 -72c-10 -27 -13 -43 -19 -90c-4 -25 -7 -48 -7 -50
+c0 -3 5 -4 15 -7c8 -2 18 -7 23 -10s14 -7 20 -11s16 -10 21 -13s24 -10 41 -16c23 -8 35 -14 47 -22l16 -11v11c0 6 0 26 -2 44zM210 969c12 6 27 21 27 26c0 1 -11 11 -24 23c-40 34 -56 64 -67 125c-5 27 -5 80 0 114c4 24 4 25 0 27c-14 9 -30 11 -43 4
+c-9 -4 -10 -7 -21 -30c-22 -47 -28 -86 -19 -114c10 -32 40 -90 75 -146c26 -41 40 -47 72 -29zM519 1007c20 5 27 8 36 14c2 2 2 6 -4 22c-12 30 -23 69 -29 103c-7 36 -7 79 -3 124c3 27 2 70 -1 73c-5 5 -72 -1 -79 -7c-4 -4 -6 -29 -3 -62c-2 -41 16 -99 14 -134
+c-2 -25 0 -32 22 -93c14 -39 16 -45 20 -45c2 0 15 2 27 5z" />
+    <glyph glyph-name="social-home" unicode="&#xf2ec;" horiz-adv-x="1486" 
+d="M491 894h482v-621h-482v621v0zM1050 538h341v-666h-341v666zM91 273v0v620h318v-620h-318zM975 -128h-882v326h882v-326v0zM1053 894h340v-279h-340v279zM1452 1109v0c20 -5 34 -22 34 -44c0 -26 -93 -93 -93 -93h-1300s-87 62 -92 83s5 42 25 51l624 292
+c16 9 99 9 112 0z" />
+    <glyph glyph-name="leanpub" unicode="&#xf212;" horiz-adv-x="2048" 
+d="M1893 1144l155 -1272c-93 0 -173 19 -257 57c-125 57 -255 91 -393 91c-142 0 -273 -47 -374 -148c-101 101 -232 148 -374 148c-138 0 -268 -34 -393 -91c-81 -36 -163 -57 -252 -57h-5l155 1272c143 81 317 127 482 127c135 0 274 -28 387 -106c113 78 252 106 387 106
+c165 0 339 -46 482 -127zM1398 157c190 0 320 -51 492 -122l-124 1021c-112 51 -245 78 -368 78c-140 0 -271 -44 -374 -141c-103 97 -234 141 -374 141c-123 0 -256 -27 -368 -78l-124 -1021c172 71 302 122 492 122c137 0 258 -35 374 -108c116 73 237 108 374 108z
+M1438 191l-40 1c-132 3 -261 -32 -374 -102c-113 70 -242 102 -374 102c-166 0 -299 -39 -450 -101l114 941c104 43 224 66 336 66c150 0 269 -48 374 -155c101 103 215 152 359 155z" />
+    <glyph glyph-name="arrow-circle-left" unicode="&#xf0a8;" 
+d="M1280 576v128c0 35 -29 64 -64 64h-502l189 189c12 12 19 28 19 45s-7 33 -19 45l-91 91c-12 12 -28 18 -45 18s-33 -6 -45 -18l-362 -362l-91 -91c-12 -12 -18 -28 -18 -45s6 -33 18 -45l91 -91l362 -362c12 -12 28 -18 45 -18s33 6 45 18l91 91c12 12 18 28 18 45
+s-6 33 -18 45l-189 189h502c35 0 64 29 64 64zM1536 640c0 -424 -344 -768 -768 -768s-768 344 -768 768s344 768 768 768s768 -344 768 -768z" />
+    <glyph glyph-name="exclamation-triangle" unicode="&#xf071;" horiz-adv-x="1792" 
+d="M1024 161v190c0 18 -14 33 -32 33h-192c-18 0 -32 -15 -32 -33v-190c0 -18 14 -33 32 -33h192c18 0 32 15 32 33zM1022 535l18 459c0 6 -3 14 -10 19c-6 5 -15 11 -24 11h-220c-9 0 -18 -6 -24 -11c-7 -5 -10 -15 -10 -21l17 -457c0 -13 15 -23 34 -23h185
+c18 0 33 10 34 23zM1008 1469l768 -1408c22 -39 21 -87 -2 -126s-65 -63 -110 -63h-1536c-45 0 -87 24 -110 63s-24 87 -2 126l768 1408c22 41 65 67 112 67s90 -26 112 -67z" />
+    <glyph glyph-name="gift" unicode="&#xf06b;" 
+d="M928 180v716h-320v-716c0 -35 29 -52 64 -52h192c35 0 64 17 64 52zM472 1024h195l-126 161c-11 13 -35 31 -69 31c-53 0 -96 -43 -96 -96s43 -96 96 -96zM1160 1120c0 53 -43 96 -96 96c-34 0 -58 -18 -69 -31l-125 -161h194c53 0 96 43 96 96zM1536 864v-320
+c0 -18 -14 -32 -32 -32h-96v-416c0 -53 -43 -96 -96 -96h-1088c-53 0 -96 43 -96 96v416h-96c-18 0 -32 14 -32 32v320c0 18 14 32 32 32h440c-124 0 -224 100 -224 224s100 224 224 224c67 0 129 -28 168 -77l128 -165l128 165c39 49 101 77 168 77
+c124 0 224 -100 224 -224s-100 -224 -224 -224h440c18 0 32 -14 32 -32z" />
+    <glyph glyph-name="cogs" unicode="&#xf085;" horiz-adv-x="1920" 
+d="M896 640c0 141 -115 256 -256 256s-256 -115 -256 -256s115 -256 256 -256s256 115 256 256zM1664 128c0 70 -58 128 -128 128s-128 -58 -128 -128c0 -71 58 -128 128 -128c71 0 128 58 128 128zM1664 1152c0 70 -58 128 -128 128s-128 -58 -128 -128
+c0 -71 58 -128 128 -128c71 0 128 58 128 128zM1280 731v-185c0 -13 -10 -28 -23 -30l-155 -24c-8 -26 -19 -51 -32 -76c28 -40 58 -77 90 -115c4 -6 7 -12 7 -20c0 -7 -2 -14 -7 -19c-20 -27 -132 -149 -161 -149c-8 0 -15 3 -21 7l-115 90c-25 -13 -50 -23 -77 -31
+c-5 -51 -10 -106 -23 -155c-4 -14 -16 -24 -30 -24h-186c-14 0 -28 11 -30 25l-23 153c-26 8 -51 19 -75 31l-118 -89c-5 -5 -13 -7 -20 -7c-8 0 -15 3 -21 8c-26 24 -144 131 -144 160c0 7 3 13 7 19c29 38 59 75 88 114c-14 27 -26 54 -35 82l-152 24c-14 2 -24 15 -24 29
+v185c0 13 10 28 23 30l155 24c8 26 19 51 32 76c-28 40 -58 77 -90 115c-4 6 -7 13 -7 20s2 14 7 20c20 27 132 148 161 148c8 0 15 -3 21 -7l115 -90c25 13 50 23 77 32c5 50 10 105 23 154c4 14 16 24 30 24h186c14 0 28 -11 30 -25l23 -153c26 -8 51 -19 75 -31l118 89
+c6 5 13 7 20 7c8 0 15 -3 21 -8c26 -24 144 -132 144 -160c0 -7 -3 -13 -7 -19c-29 -39 -59 -75 -87 -114c13 -27 25 -54 34 -82l152 -23c14 -3 24 -16 24 -30zM1920 198v-140c0 -15 -129 -29 -149 -31c-8 -19 -18 -36 -30 -52c9 -20 51 -120 51 -138c0 -3 -1 -5 -4 -7
+c-12 -7 -119 -71 -124 -71c-13 0 -88 100 -98 115c-10 -1 -20 -2 -30 -2s-20 1 -30 2c-10 -15 -85 -115 -98 -115c-5 0 -112 64 -124 71c-3 2 -4 5 -4 7c0 17 42 118 51 138c-12 16 -22 33 -30 52c-20 2 -149 16 -149 31v140c0 15 129 29 149 31c8 18 18 36 30 52
+c-9 20 -51 121 -51 138c0 2 1 5 4 7c12 6 119 70 124 70c13 0 88 -99 98 -114c10 1 20 2 30 2s20 -1 30 -2c28 39 58 78 92 112l6 2c5 0 112 -63 124 -70c3 -2 4 -5 4 -7c0 -18 -42 -118 -51 -138c12 -16 22 -34 30 -52c20 -2 149 -16 149 -31zM1920 1222v-140
+c0 -15 -129 -29 -149 -31c-8 -19 -18 -36 -30 -52c9 -20 51 -120 51 -138c0 -3 -1 -5 -4 -7c-12 -7 -119 -71 -124 -71c-13 0 -88 100 -98 115c-10 -1 -20 -2 -30 -2s-20 1 -30 2c-10 -15 -85 -115 -98 -115c-5 0 -112 64 -124 71c-3 2 -4 5 -4 7c0 17 42 118 51 138
+c-12 16 -22 33 -30 52c-20 2 -149 16 -149 31v140c0 15 129 29 149 31c8 18 18 36 30 52c-9 20 -51 121 -51 138c0 2 1 5 4 7c12 6 119 70 124 70c13 0 88 -99 98 -114c10 1 20 2 30 2s20 -1 30 -2c28 39 58 78 92 112l6 2c5 0 112 -63 124 -70c3 -2 4 -5 4 -7
+c0 -18 -42 -118 -51 -138c12 -16 22 -34 30 -52c20 -2 149 -16 149 -31z" />
+    <glyph glyph-name="hackaday" unicode="&#xf30a;" horiz-adv-x="1686" 
+d="M215 1408c118 0 214 -95 215 -213v-2c0 -11 -1 -21 -3 -31l168 -149c-60 -45 -109 -106 -142 -178l-173 154c-21 -7 -42 -11 -65 -11c-119 0 -215 96 -215 215c0 14 1 28 4 42l138 -122l150 167l-134 120c18 5 37 8 57 8zM1247 436l162 -143c17 5 45 9 62 9v0
+c118 0 214 -95 215 -213v-2c0 -13 -2 -26 -4 -39l-139 123l-150 -166l140 -124c-20 -6 -41 -9 -62 -9c-119 0 -215 96 -215 215c0 12 1 24 3 35l-140 124c56 50 100 115 128 190zM1471 1408c20 0 39 -3 57 -8l-134 -120l150 -167l138 122c3 -14 4 -28 4 -42
+c0 -119 -96 -215 -215 -215c-23 0 -44 4 -65 11l-174 -154c-33 72 -81 133 -141 178l167 149c-2 10 -2 20 -2 31v2c1 118 97 213 215 213zM439 436v0c28 -75 71 -140 127 -190l-139 -124c2 -11 3 -23 3 -35c0 -119 -96 -215 -215 -215c-21 0 -42 3 -62 9l140 124l-150 166
+l-139 -123c-2 13 -4 26 -4 39v2c1 118 97 213 215 213v0c17 0 45 -4 62 -9zM843 1062c222 0 401 -199 401 -445c0 -153 -69 -288 -175 -368c8 -12 12 -26 12 -41c0 -42 -33 -76 -75 -76s-76 34 -76 76c0 4 0 8 1 12h-13c1 -3 0 -9 0 -12v0c0 -42 -33 -76 -75 -76
+s-76 34 -76 76c0 4 0 8 1 12h-10v-9c0 -43 -35 -79 -77 -79s-77 36 -77 79c0 15 4 28 11 40c-105 80 -173 214 -173 366c0 246 179 445 401 445zM670 730c-8 0 -15 -1 -22 -3c-28 -4 -52 -23 -69 -45c-15 -18 -26 -40 -26 -64c-2 -20 1 -39 5 -58c5 -23 21 -41 39 -54
+c8 -7 20 -16 31 -8c7 9 1 23 7 33c2 10 9 18 18 23c18 9 37 18 57 25c16 5 29 15 43 24c18 14 30 40 21 62c-10 18 -22 34 -39 46c-19 12 -42 19 -65 19zM1015 730c-23 0 -45 -7 -64 -19c-17 -12 -29 -28 -39 -46c-9 -22 3 -48 21 -62c14 -9 27 -19 43 -24
+c20 -7 38 -16 56 -25c9 -5 17 -13 19 -23c6 -10 0 -24 7 -33c11 -8 23 1 31 8c18 13 34 31 39 54c4 19 7 38 5 58c0 24 -11 46 -26 64c-17 22 -41 41 -69 45c-7 2 -15 3 -23 3zM844 502c-20 1 -44 -88 -40 -126c12 -51 16 36 40 36c23 -1 19 -88 37 -35
+c5 35 -16 124 -37 125z" />
+    <glyph glyph-name="frown-o" unicode="&#xf119;" 
+d="M1134 307c11 -34 -8 -69 -41 -80c-34 -11 -70 8 -81 42c-33 107 -132 179 -244 179s-211 -72 -244 -179c-11 -34 -47 -53 -80 -42c-34 11 -53 46 -42 80c50 161 197 269 366 269s316 -108 366 -269zM640 896c0 -71 -57 -128 -128 -128s-128 57 -128 128s57 128 128 128
+s128 -57 128 -128zM1152 896c0 -71 -57 -128 -128 -128s-128 57 -128 128s57 128 128 128s128 -57 128 -128zM1408 640c0 353 -287 640 -640 640s-640 -287 -640 -640s287 -640 640 -640s640 287 640 640zM1536 640c0 -424 -344 -768 -768 -768s-768 344 -768 768
+s344 768 768 768s768 -344 768 -768z" />
+    <glyph glyph-name="opera" unicode="&#xf26a;" horiz-adv-x="1792" 
+d="M1493 1308c-105 70 -228 110 -359 110c-213 0 -401 -109 -533 -273c-96 -120 -163 -290 -168 -484v-42c5 -194 72 -364 168 -484c132 -164 320 -273 533 -273c131 0 254 40 359 110c-158 -142 -368 -228 -597 -228c-14 0 -29 0 -43 1c-475 22 -853 414 -853 895
+c0 495 401 896 896 896h3c228 -1 436 -87 594 -228zM1792 640c0 -261 -112 -495 -290 -659c-68 -41 -143 -63 -222 -63c-92 0 -179 30 -255 84c203 74 353 331 353 638c0 306 -149 563 -352 638c76 53 162 83 254 83c81 0 157 -23 226 -65c176 -164 286 -397 286 -656z" />
+    <glyph glyph-name="viadeo" unicode="&#xf2a9;" horiz-adv-x="1278" 
+d="M1050 430c0 -143 -50 -269 -147 -374c-101 -110 -229 -161 -378 -161c-148 0 -277 50 -378 161c-97 105 -147 231 -147 374c0 297 224 540 525 540c62 0 124 -10 182 -31c-20 -39 -34 -82 -39 -126c-45 19 -94 28 -143 28c-227 0 -394 -194 -394 -414
+c0 -224 166 -407 394 -407s393 183 393 407c0 57 -10 113 -32 166c44 9 86 26 123 49c28 -67 41 -140 41 -212zM846 619c0 111 -19 221 -55 326c3 -34 3 -69 3 -103c0 -268 -53 -707 -342 -817c20 -3 41 -5 62 -5l14 1c216 136 318 346 318 598zM791 947v-2
+c-52 153 -124 301 -206 440c126 -85 195 -291 206 -438zM1035 744c-62 0 -117 33 -160 75c102 56 231 143 290 247c7 14 19 40 21 56c-58 -130 -206 -232 -344 -264c-22 34 -35 72 -35 113c0 48 24 112 60 147c41 39 102 59 157 74c80 22 145 84 180 159
+c52 -74 74 -164 74 -253c0 -45 -7 -127 -24 -170c-37 -90 -112 -184 -219 -184z" />
+    <glyph glyph-name="battery-empty" unicode="&#xf244;" horiz-adv-x="2304" 
+d="M2176 960c71 0 128 -57 128 -128v-384c0 -71 -57 -128 -128 -128v-160c0 -88 -72 -160 -160 -160h-1856c-88 0 -160 72 -160 160v960c0 88 72 160 160 160h1856c88 0 160 -72 160 -160v-160zM2176 448v384h-128v288c0 18 -14 32 -32 32h-1856c-18 0 -32 -14 -32 -32v-960
+c0 -18 14 -32 32 -32h1856c18 0 32 14 32 32v288h128z" />
+    <glyph glyph-name="freedombox" unicode="&#xf2fd;" horiz-adv-x="1816" 
+d="M152 1274v0h10c90 -2 180 -36 272 -79c4 -2 11 -5 15 -7c7 -3 13 -7 20 -10c116 -58 199 -126 267 -210l3 -3c2 -2 4 -7 6 -9l-255 -148l9 -492l37 465l50 -29l10 -491l37 464l49 -29l10 -490l37 463l50 -29l9 -488l37 461l50 -29l10 -487l37 466l422 245l-267 155
+c2 3 5 5 7 8s5 6 7 9c70 83 157 151 278 208c101 48 200 86 296 86h9c45 -1 84 -15 110 -44c80 -92 -8 -177 -39 -293c-41 -155 6 -321 -118 -429c-43 -37 -93 -47 -143 -52c65 -77 103 -183 82 -292c-4 -21 -10 -42 -18 -61c-6 -17 -13 -32 -22 -47l-9 -15
+c-2 -2 -3 -5 -5 -7c-63 -94 -168 -154 -281 -161c-6 0 -11 -1 -17 -1h-9c-15 0 -39 3 -53 5c-19 3 -49 12 -67 19c-3 1 -7 2 -9 3c-69 29 -124 80 -159 143c-2 3 -4 5 -5 8c-2 3 -5 3 -7 0c-1 -3 -3 -5 -5 -8s-2 -5 -4 -8c-48 -81 -131 -140 -231 -157c-12 -2 -23 -3 -35 -4
+c-6 0 -12 -1 -18 -1c-169 -3 -327 118 -361 292c-21 109 18 215 83 292c-50 5 -101 15 -144 52c-124 108 -78 274 -119 429c-31 116 -118 201 -38 293c26 29 65 43 110 44h9z" />
+    <glyph glyph-name="file-epub" unicode="&#xf321;" 
+d="M723 132l458 458l70 -71c24 -24 24 -64 0 -88l-483 -483c-24 -24 -65 -24 -89 0l-483 483c-24 24 -24 64 0 88l483 484c24 24 65 24 89 0l298 -299l-343 -343l-114 114l229 229l-115 114l-343 -343zM1468 1156c37 -37 68 -111 68 -164v-1152c0 -53 -43 -96 -96 -96h-1344
+c-53 0 -96 43 -96 96v1600c0 53 43 96 96 96h896c53 0 127 -31 164 -68zM1024 1400v-376h376c-6 17 -15 34 -22 41l-313 313c-7 7 -24 16 -41 22zM1408 -128v1024h-416c-53 0 -96 43 -96 96v416h-768v-1536h1280z" />
+    <glyph glyph-name="chevron-circle-left" unicode="&#xf137;" 
+d="M909 141l102 102c25 25 25 65 0 90l-307 307l307 307c25 25 25 65 0 90l-102 102c-25 25 -65 25 -90 0l-454 -454c-25 -25 -25 -65 0 -90l454 -454c25 -25 65 -25 90 0zM1536 640c0 -424 -344 -768 -768 -768s-768 344 -768 768s344 768 768 768s768 -344 768 -768z" />
+    <glyph glyph-name="signal" unicode="&#xf012;" horiz-adv-x="1792" 
+d="M256 96v-192c0 -18 -14 -32 -32 -32h-192c-18 0 -32 14 -32 32v192c0 18 14 32 32 32h192c18 0 32 -14 32 -32zM640 224v-320c0 -18 -14 -32 -32 -32h-192c-18 0 -32 14 -32 32v320c0 18 14 32 32 32h192c18 0 32 -14 32 -32zM1024 480v-576c0 -18 -14 -32 -32 -32h-192
+c-18 0 -32 14 -32 32v576c0 18 14 32 32 32h192c18 0 32 -14 32 -32zM1408 864v-960c0 -18 -14 -32 -32 -32h-192c-18 0 -32 14 -32 32v960c0 18 14 32 32 32h192c18 0 32 -14 32 -32zM1792 1376v-1472c0 -18 -14 -32 -32 -32h-192c-18 0 -32 14 -32 32v1472
+c0 18 14 32 32 32h192c18 0 32 -14 32 -32z" />
+    <glyph glyph-name="sitemap" unicode="&#xf0e8;" horiz-adv-x="1792" 
+d="M1792 288v-320c0 -53 -43 -96 -96 -96h-320c-53 0 -96 43 -96 96v320c0 53 43 96 96 96h96v192h-512v-192h96c53 0 96 -43 96 -96v-320c0 -53 -43 -96 -96 -96h-320c-53 0 -96 43 -96 96v320c0 53 43 96 96 96h96v192h-512v-192h96c53 0 96 -43 96 -96v-320
+c0 -53 -43 -96 -96 -96h-320c-53 0 -96 43 -96 96v320c0 53 43 96 96 96h96v192c0 70 58 128 128 128h512v192h-96c-53 0 -96 43 -96 96v320c0 53 43 96 96 96h320c53 0 96 -43 96 -96v-320c0 -53 -43 -96 -96 -96h-96v-192h512c70 0 128 -58 128 -128v-192h96
+c53 0 96 -43 96 -96z" />
+    <glyph glyph-name="wheelchair-alt" unicode="&#xf29b;" horiz-adv-x="1399" 
+d="M1370 723c21 -22 32 -52 29 -82l-44 -551c-5 -56 -51 -98 -106 -98c-3 0 -6 0 -9 1c-59 4 -102 56 -98 114l35 429l-143 -8c35 -72 55 -154 55 -240c0 -144 -56 -275 -148 -372l-137 137c56 62 91 145 91 235c0 194 -157 351 -350 351c-91 0 -173 -35 -236 -92l-137 138
+c77 73 175 123 284 141l264 300l-149 87l-181 -161c-44 -40 -111 -36 -150 8s-35 111 8 150l239 213c34 31 84 36 124 12c487 -283 488 -283 488 -283c26 -15 41 -41 48 -68c10 -39 3 -83 -26 -117l-205 -232l371 20c31 2 61 -9 83 -32zM1172 1180c-98 0 -178 79 -178 178
+c0 98 80 178 178 178c99 0 179 -80 179 -178c0 -99 -80 -178 -179 -178zM545 -62c72 0 140 23 196 61l139 -139c-92 -73 -209 -116 -335 -116c-301 0 -545 244 -545 544c0 127 43 243 116 336l139 -139c-38 -56 -60 -124 -60 -197c0 -193 157 -350 350 -350z" />
+    <glyph glyph-name="external-link-square" unicode="&#xf14c;" 
+d="M1280 608v480c0 35 -29 64 -64 64h-480c-26 0 -49 -16 -59 -39c-10 -24 -5 -52 14 -70l144 -144l-534 -534c-25 -25 -25 -65 0 -90l102 -102c25 -25 65 -25 90 0l534 534l144 -144c12 -13 28 -19 45 -19c8 0 17 2 25 5c23 10 39 33 39 59zM1536 1120v-960
+c0 -159 -129 -288 -288 -288h-960c-159 0 -288 129 -288 288v960c0 159 129 288 288 288h960c159 0 288 -129 288 -288z" />
+    <glyph glyph-name="google" unicode="&#xf1a0;" horiz-adv-x="1505" 
+d="M768 750h725c7 -39 12 -77 12 -128c0 -438 -294 -750 -737 -750c-425 0 -768 343 -768 768s343 768 768 768c207 0 381 -76 515 -201l-209 -201c-57 55 -157 119 -306 119c-262 0 -476 -217 -476 -485s214 -485 476 -485c304 0 418 218 436 331h-436v264z" />
+    <glyph glyph-name="volume-off" unicode="&#xf026;" horiz-adv-x="768" 
+d="M768 1184v-1088c0 -35 -29 -64 -64 -64c-17 0 -33 7 -45 19l-333 333h-262c-35 0 -64 29 -64 64v384c0 35 29 64 64 64h262l333 333c12 12 28 19 45 19c35 0 64 -29 64 -64z" />
+    <glyph glyph-name="twitter" unicode="&#xf099;" horiz-adv-x="1576" 
+d="M1576 1128c-44 -64 -99 -121 -162 -167c1 -14 1 -28 1 -42c0 -427 -325 -919 -919 -919c-183 0 -353 53 -496 145c26 -3 51 -4 78 -4c151 0 290 51 401 138c-142 3 -261 96 -302 224c20 -3 40 -5 61 -5c29 0 58 4 85 11c-148 30 -259 160 -259 317v4
+c43 -24 93 -39 146 -41c-87 58 -144 157 -144 269c0 60 16 115 44 163c159 -196 398 -324 666 -338c-5 24 -8 49 -8 74c0 178 144 323 323 323c93 0 177 -39 236 -102c73 14 143 41 205 78c-24 -75 -75 -138 -142 -178c65 7 128 25 186 50z" />
+    <glyph glyph-name="battery-full" unicode="&#xf240;" horiz-adv-x="2304" 
+d="M1920 1024v-768h-1664v768h1664zM2048 448h128v384h-128v288c0 18 -14 32 -32 32h-1856c-18 0 -32 -14 -32 -32v-960c0 -18 14 -32 32 -32h1856c18 0 32 14 32 32v288zM2304 832v-384c0 -71 -57 -128 -128 -128v-160c0 -88 -72 -160 -160 -160h-1856
+c-88 0 -160 72 -160 160v960c0 88 72 160 160 160h1856c88 0 160 -72 160 -160v-160c71 0 128 -57 128 -128z" />
+    <glyph glyph-name="deaf" unicode="&#xf2a4;" horiz-adv-x="1792" 
+d="M1056 704c0 124 -101 224 -224 224s-224 -100 -224 -224c0 -35 -29 -64 -64 -64s-64 29 -64 64c0 194 158 352 352 352s352 -158 352 -352c0 -35 -29 -64 -64 -64s-64 29 -64 64zM835 1280c318 0 576 -258 576 -576c0 -166 -78 -255 -146 -334
+c-63 -72 -113 -129 -113 -242c0 -212 -172 -384 -384 -384c-35 0 -64 29 -64 64s29 64 64 64c141 0 256 115 256 256c0 161 77 249 144 326c62 71 115 132 115 250c0 247 -201 448 -448 448s-448 -201 -448 -448c0 -35 -29 -64 -64 -64s-64 29 -64 64c0 318 258 576 576 576
+zM591 561l226 -226l-579 -579c-16 -16 -42 -16 -58 0l-168 168c-16 16 -16 42 0 58zM1612 1524l168 -168c16 -16 16 -42 0 -59l-233 -233l-26 -25l-71 -71c-43 100 -109 188 -195 258l91 91l207 207c17 16 43 16 59 0z" />
+    <glyph glyph-name="window-close-o" unicode="&#xf2d4;" horiz-adv-x="1792" 
+d="M1257 425l-146 -146c-13 -13 -33 -13 -46 0l-169 169l-169 -169c-13 -13 -33 -13 -46 0l-146 146c-13 13 -13 33 0 46l169 169l-169 169c-13 13 -13 33 0 46l146 146c13 13 33 13 46 0l169 -169l169 169c13 13 33 13 46 0l146 -146c13 -13 13 -33 0 -46l-169 -169
+l169 -169c13 -13 13 -33 0 -46zM256 128h1280v1024h-1280v-1024zM1792 1248v-1216c0 -88 -72 -160 -160 -160h-1472c-88 0 -160 72 -160 160v1216c0 88 72 160 160 160h1472c88 0 160 -72 160 -160z" />
+    <glyph glyph-name="phone" unicode="&#xf095;" horiz-adv-x="1408" 
+d="M1408 296c0 -36 -16 -106 -31 -139c-21 -49 -77 -81 -122 -106c-59 -32 -119 -51 -186 -51c-93 0 -177 38 -262 69c-61 22 -120 49 -175 83c-170 105 -375 310 -480 480c-34 55 -61 114 -83 175c-31 85 -69 169 -69 262c0 67 19 127 51 186c25 45 57 101 106 122
+c33 15 103 31 139 31c7 0 14 0 21 -3c21 -7 43 -56 53 -76c32 -57 63 -115 96 -171c16 -26 46 -58 46 -89c0 -61 -181 -150 -181 -204c0 -27 25 -62 39 -86c101 -182 227 -308 409 -409c24 -14 59 -39 86 -39c54 0 143 181 204 181c31 0 63 -30 89 -46
+c56 -33 114 -64 171 -96c20 -10 69 -32 76 -53c3 -7 3 -14 3 -21z" />
+    <glyph glyph-name="mars-double" unicode="&#xf227;" horiz-adv-x="1920" 
+d="M1536 1120c0 18 14 32 32 32h288c35 0 64 -29 64 -64v-288c0 -18 -14 -32 -32 -32h-64c-18 0 -32 14 -32 32v134l-254 -255c98 -123 147 -286 117 -461c-42 -243 -240 -434 -484 -468c-286 -40 -539 131 -626 380c-316 16 -565 288 -544 613c18 274 235 502 508 533
+c161 19 311 -31 426 -122l255 254h-134c-18 0 -32 14 -32 32v64c0 18 14 32 32 32h288c35 0 64 -29 64 -64v-288c0 -18 -14 -32 -32 -32h-64c-18 0 -32 14 -32 32v134l-254 -255c40 -50 71 -107 93 -169c124 -6 237 -52 328 -124l255 254h-134c-18 0 -32 14 -32 32v64z
+M1024 704c0 20 -2 39 -4 58c-215 -33 -380 -218 -380 -442c0 -20 2 -39 4 -58c215 33 380 218 380 442zM128 704c0 -226 169 -413 387 -443c-2 19 -3 39 -3 59c0 282 204 517 473 566c-70 157 -227 266 -409 266c-247 0 -448 -201 -448 -448zM1088 -128
+c247 0 448 201 448 448c0 226 -169 413 -387 443c2 -19 3 -39 3 -59c0 -282 -204 -517 -473 -566c70 -157 227 -266 409 -266z" />
+    <glyph glyph-name="maxcdn" unicode="&#xf136;" horiz-adv-x="1755" 
+d="M1745 763l-164 -763h-334l178 832c8 35 3 67 -15 88c-17 21 -47 33 -83 33h-169l-204 -953h-334l204 953h-286l-204 -953h-334l204 953l-153 327h1276c135 0 258 -56 337 -154c80 -98 109 -231 81 -363z" />
+    <glyph glyph-name="hand-peace-o" unicode="&#xf25b;" 
+d="M1288 889c37 0 74 -7 107 -23c96 -43 141 -122 141 -226v-177c0 -63 -8 -126 -23 -186l-85 -339c-28 -114 -130 -194 -248 -194h-668c-141 0 -256 115 -256 256v401l-239 628c-11 29 -17 60 -17 91c0 141 115 256 256 256c106 0 202 -66 239 -165l17 -44v113
+c0 141 115 256 256 256s256 -115 256 -256v-261c16 3 32 5 48 5c92 0 176 -53 216 -135zM1072 896c-44 0 -84 -26 -102 -66l-74 -163l-71 -155h55c67 0 126 -47 140 -112l154 338c7 14 10 30 10 46c0 62 -50 112 -112 112zM1293 761c-76 0 -100 -61 -127 -121l-132 -290
+c-7 -14 -10 -30 -10 -46c0 -62 50 -112 112 -112c44 0 84 26 102 66l160 352c5 10 9 26 9 38c0 67 -48 113 -114 113zM128 1120c0 -16 3 -31 8 -46l248 -650v-69l102 111c27 29 66 46 106 46h198l106 233v535c0 71 -57 128 -128 128s-128 -57 -128 -128v-640h-64l-200 526
+c-19 49 -67 82 -120 82c-71 0 -128 -58 -128 -128zM1180 -128c59 0 110 40 124 97l85 339c13 50 19 103 19 155v91l-141 -310c-23 -51 -75 -84 -131 -84c-70 0 -131 51 -142 121c-27 -35 -69 -57 -114 -57h-208v32h208c61 0 116 50 116 112c0 61 -46 112 -108 112h-296
+c-31 0 -61 -13 -82 -36l-126 -136v-308c0 -71 57 -128 128 -128h668z" />
+    <glyph glyph-name="envira" unicode="&#xf299;" horiz-adv-x="1792" 
+d="M896 720c-127 240 -244 474 -577 632c-199 94 -21 -37 -21 -37c181 -125 264 -294 361 -479c126 -241 316 -559 577 -671c260 -112 137 -50 24 34c-113 85 -273 348 -364 521zM549 177c-361 286 -341 628 -549 1359c1911 0 1467 -1269 1469 -1465l323 -327h-104l-281 285
+c-156 -17 -498 -138 -858 148z" />
+    <glyph glyph-name="lastfm-square" unicode="&#xf203;" 
+d="M1432 484c0 141 -114 205 -234 239c-55 15 -100 28 -120 88c-1 5 -6 24 -6 28c0 48 38 83 85 83c22 0 53 1 71 -15h-1c19 -14 28 -30 39 -51l93 71c-15 21 -30 46 -49 64c-47 42 -91 49 -153 49c-105 0 -204 -86 -204 -195c0 -8 1 -15 2 -23c22 -136 91 -178 213 -213
+c60 -17 145 -44 146 -118v-5c1 -80 -66 -128 -141 -128c-82 0 -135 78 -167 144c-116 239 -134 538 -478 538c-207 0 -393 -191 -386 -396v-1c7 -214 154 -403 380 -403c107 0 207 25 279 110c12 16 23 33 31 51l-60 109c-56 -106 -125 -152 -245 -152
+c-158 0 -267 140 -267 291c0 139 128 273 268 273c160 0 218 -83 274 -226c67 -172 139 -456 371 -456c139 0 259 101 259 244zM1536 1120v-960c0 -159 -129 -288 -288 -288h-960c-159 0 -288 129 -288 288v960c0 159 129 288 288 288h960c159 0 288 -129 288 -288z" />
+    <glyph glyph-name="home" unicode="&#xf015;" horiz-adv-x="1612" 
+d="M1382 544v-480c0 -35 -29 -64 -64 -64h-384v384h-256v-384h-384c-35 0 -64 29 -64 64v480c0 2 1 4 1 6l575 474l575 -474c1 -2 1 -4 1 -6zM1605 613l-62 -74c-5 -6 -13 -10 -21 -11h-3c-8 0 -15 2 -21 7l-692 577l-692 -577c-7 -5 -15 -8 -24 -7c-8 1 -16 5 -21 11
+l-62 74c-11 13 -9 34 4 45l719 599c42 35 110 35 152 0l244 -204v195c0 18 14 32 32 32h192c18 0 32 -14 32 -32v-408l219 -182c13 -11 15 -32 4 -45z" />
+    <glyph glyph-name="empire" unicode="&#xf1d1;" horiz-adv-x="1792" 
+d="M874 -102v-66c-282 8 -529 160 -668 385l58 34c21 -35 46 -68 73 -99l65 57c94 -107 222 -183 368 -212l-17 -86c39 -7 80 -12 121 -13zM276 428l-83 -28c14 -39 30 -76 49 -112l-57 -33c-62 114 -98 246 -98 385s36 271 98 385l57 -33c-19 -35 -36 -73 -49 -112l82 -28
+c-23 -66 -35 -138 -35 -212s13 -146 36 -212zM1528 251l58 -34c-139 -225 -386 -377 -668 -385v66c41 1 82 6 121 13l-17 86c146 29 274 105 368 212l65 -57c27 31 52 64 73 99zM1377 805l-233 -80c9 -27 14 -55 14 -85s-5 -58 -14 -85l232 -80c-21 -63 -55 -120 -98 -169
+l-185 162c-37 -43 -88 -73 -147 -85l48 -241c-31 -6 -64 -10 -98 -10s-67 4 -98 10l48 241c-59 12 -110 42 -147 85l-185 -162c-43 49 -77 106 -98 169l232 80c-9 27 -14 55 -14 85s5 58 14 85l-233 80c22 63 56 120 99 169l185 -162c37 43 88 74 147 86l-48 240
+c31 7 64 10 98 10s67 -3 98 -10l-48 -240c59 -12 110 -43 147 -86l185 162c43 -49 77 -106 99 -169zM874 1448v-66c-41 -1 -82 -5 -121 -13l17 -86c-146 -28 -274 -104 -368 -211l-65 56c-27 -30 -51 -63 -73 -98l-57 33c139 226 385 377 667 385zM1705 640
+c0 -139 -36 -271 -98 -385l-57 33c19 36 35 73 49 112l-83 28c23 66 36 138 36 212s-12 146 -35 212l82 28c-13 39 -30 77 -49 112l57 33c62 -114 98 -246 98 -385zM1585 1063l-57 -33c-22 35 -46 68 -73 98l-65 -56c-94 107 -222 183 -368 211l17 86c-39 8 -80 12 -121 13
+v66c282 -8 528 -159 667 -385zM1748 640c0 470 -382 852 -852 852s-852 -382 -852 -852s382 -852 852 -852s852 382 852 852zM1792 640c0 -495 -401 -896 -896 -896s-896 401 -896 896s401 896 896 896s896 -401 896 -896z" />
+    <glyph glyph-name="server" unicode="&#xf233;" horiz-adv-x="1792" 
+d="M128 128h1024v128h-1024v-128zM128 640h1024v128h-1024v-128zM1696 192c0 53 -43 96 -96 96s-96 -43 -96 -96s43 -96 96 -96s96 43 96 96zM128 1152h1024v128h-1024v-128zM1696 704c0 53 -43 96 -96 96s-96 -43 -96 -96s43 -96 96 -96s96 43 96 96zM1696 1216
+c0 53 -43 96 -96 96s-96 -43 -96 -96s43 -96 96 -96s96 43 96 96zM1792 384v-384h-1792v384h1792zM1792 896v-384h-1792v384h1792zM1792 1408v-384h-1792v384h1792z" />
+    <glyph glyph-name="inkscape" unicode="&#xf312;" 
+d="M755 1398v0c47 0 95 -17 131 -52l588 -601c234 -234 -259 -288 -401 -371c-50 -51 153 -85 132 -147c-42 -126 -157 -45 -280 -171c-50 -51 95 -46 45 -97c-93 -68 -285 -115 -300 -32c-21 117 -135 68 -185 119s101 104 51 155s-299 97 -349 148s191 88 141 139
+c-138 68 -461 41 -269 278l567 580c34 35 82 52 129 52zM760 1343v0c-34 0 -68 -13 -93 -38c-49 -50 -140 -138 -219 -223c-45 -45 -40 -109 10 -109h123l80 139l49 -199l149 95l93 -49l22 131l111 -89c12 12 12 54 -9 76l-224 228c-24 25 -58 38 -92 38zM491 456
+c-74 0 219 -119 279 -103c27 14 40 34 21 38c-56 9 -285 56 -300 65zM1390 297c43 -1 86 -22 100 -63c0 -54 -212 -36 -212 -7c13 47 63 71 112 70zM409 172c26 0 50 -8 64 -26c-23 -61 -101 -115 -151 -72c-57 50 21 99 87 98zM1251 168c71 -14 85 -65 71 -79
+c-64 -38 -136 21 -71 79z" />
+    <glyph glyph-name="search-minus" unicode="&#xf010;" horiz-adv-x="1664" 
+d="M1024 736v-64c0 -17 -15 -32 -32 -32h-576c-17 0 -32 15 -32 32v64c0 17 15 32 32 32h576c17 0 32 -15 32 -32zM1152 704c0 247 -201 448 -448 448s-448 -201 -448 -448s201 -448 448 -448s448 201 448 448zM1664 -128c0 -71 -57 -128 -128 -128c-34 0 -67 14 -90 38
+l-343 342c-117 -81 -257 -124 -399 -124c-389 0 -704 315 -704 704s315 704 704 704s704 -315 704 -704c0 -142 -43 -282 -124 -399l343 -343c23 -23 37 -56 37 -90z" />
+    <glyph glyph-name="leaf" unicode="&#xf06c;" horiz-adv-x="1792" 
+d="M1280 832c0 35 -29 64 -64 64c-354 0 -582 -148 -813 -403c-12 -13 -19 -27 -19 -45c0 -35 29 -64 64 -64c18 0 32 7 45 19c49 44 93 92 141 137c181 163 336 228 582 228c35 0 64 29 64 64zM1792 1030c0 -64 -7 -129 -20 -193c-64 -311 -264 -513 -542 -651
+c-135 -68 -286 -108 -438 -108c-96 0 -195 16 -286 47c-48 16 -144 79 -184 79c-50 0 -110 -204 -197 -204c-63 0 -82 31 -109 77c-9 17 -16 23 -16 44c0 104 198 185 198 243c0 9 -26 62 -30 82c-6 34 -9 69 -9 104c0 318 253 545 537 639c205 68 641 -11 780 121
+c55 51 82 98 166 98c113 0 150 -293 150 -378z" />
+    <glyph glyph-name="envelope-open-o" unicode="&#xf2b7;" horiz-adv-x="1792" 
+d="M1474 623l39 -51c11 -14 8 -33 -5 -44c-100 -78 -330 -255 -340 -263c-71 -58 -167 -138 -271 -137h-2c-104 0 -200 79 -271 137c-11 9 -233 180 -331 256c-14 11 -17 30 -6 44l37 52c11 15 32 18 46 6c68 -53 164 -127 306 -236c50 -38 149 -131 219 -131h2
+c70 0 169 93 219 131c147 113 245 188 313 242c14 11 34 8 45 -6zM1664 -96v928c-100 93 -85 85 -548 443c-50 39 -149 133 -219 133h-2c-70 0 -169 -94 -219 -133c-463 -358 -448 -350 -548 -443v-928c0 -17 15 -32 32 -32h1472c17 0 32 15 32 32zM1792 832v-928
+c0 -88 -72 -160 -160 -160h-1472c-88 0 -160 72 -160 160v928c0 36 15 70 41 94c205 190 441 355 583 472c70 58 167 138 271 138h2c104 0 201 -80 271 -138c132 -109 383 -286 583 -472c26 -24 41 -58 41 -94z" />
+    <glyph glyph-name="exclamation-circle" unicode="&#xf06a;" 
+d="M768 1408c424 0 768 -344 768 -768s-344 -768 -768 -768s-768 344 -768 768s344 768 768 768zM896 161v190c0 18 -14 33 -31 33h-192c-18 0 -33 -15 -33 -33v-190c0 -18 15 -33 33 -33h192c17 0 31 15 31 33zM894 505l18 621c0 7 -3 14 -10 18c-6 5 -15 8 -24 8h-220
+c-9 0 -18 -3 -24 -8c-7 -4 -10 -11 -10 -18l17 -621c0 -14 15 -25 34 -25h185c18 0 33 11 34 25z" />
+    <glyph glyph-name="comments" unicode="&#xf086;" horiz-adv-x="1792" 
+d="M1408 768c0 -283 -315 -512 -704 -512c-61 0 -120 6 -176 16c-83 -59 -177 -102 -278 -128c-27 -7 -56 -12 -86 -16h-3c-15 0 -29 12 -32 29c-4 19 9 31 20 44c39 44 83 83 117 166c-162 94 -266 239 -266 401c0 283 315 512 704 512s704 -229 704 -512zM1792 512
+c0 -163 -104 -307 -266 -401c34 -83 78 -122 117 -166c11 -13 24 -25 20 -44c-4 -18 -19 -31 -35 -29c-30 4 -59 9 -86 16c-101 26 -195 69 -278 128c-56 -10 -115 -16 -176 -16c-181 0 -347 50 -472 132c29 -2 59 -4 88 -4c215 0 418 62 573 174c167 122 259 287 259 466
+c0 52 -8 103 -23 152c169 -93 279 -241 279 -408z" />
+    <glyph glyph-name="moon" unicode="&#xf328;" horiz-adv-x="1471" 
+d="M1465 318c-125 -271 -399 -446 -697 -446c-423 0 -768 345 -768 768c0 415 325 752 739 767c28 1 51 -15 61 -39c11 -25 4 -54 -15 -72c-114 -104 -177 -246 -177 -400c0 -300 244 -544 544 -544c79 0 155 17 228 51c25 11 53 6 72 -13s24 -48 13 -72z" />
+    <glyph glyph-name="facebook-official" unicode="&#xf230;" 
+d="M1451 1408c47 0 85 -38 85 -85v-1366c0 -47 -38 -85 -85 -85h-391v595h199l30 232h-229v148c0 67 18 112 115 112l122 1v207c-21 3 -94 9 -178 9c-177 0 -299 -108 -299 -306v-171h-200v-232h200v-595h-735c-47 0 -85 38 -85 85v1366c0 47 38 85 85 85h1366z" />
+    <glyph glyph-name="clock-o" unicode="&#xf017;" 
+d="M896 992v-448c0 -18 -14 -32 -32 -32h-320c-18 0 -32 14 -32 32v64c0 18 14 32 32 32h224v352c0 18 14 32 32 32h64c18 0 32 -14 32 -32zM1312 640c0 300 -244 544 -544 544s-544 -244 -544 -544s244 -544 544 -544s544 244 544 544zM1536 640
+c0 -424 -344 -768 -768 -768s-768 344 -768 768s344 768 768 768s768 -344 768 -768z" />
+    <glyph glyph-name="caret-square-o-left" unicode="&#xf191;" 
+d="M1024 960v-640c0 -35 -29 -64 -64 -64c-13 0 -26 4 -37 12l-448 320c-17 12 -27 31 -27 52c0 20 10 40 27 52l448 320c11 8 24 12 37 12c35 0 64 -29 64 -64zM1280 160v960c0 17 -15 32 -32 32h-960c-17 0 -32 -15 -32 -32v-960c0 -17 15 -32 32 -32h960
+c17 0 32 15 32 32zM1536 1120v-960c0 -159 -129 -288 -288 -288h-960c-159 0 -288 129 -288 288v960c0 159 129 288 288 288h960c159 0 288 -129 288 -288z" />
+    <glyph glyph-name="hand-scissors-o" unicode="&#xf257;" horiz-adv-x="1792" 
+d="M1073 -128h-177c-104 0 -183 45 -226 141c-15 32 -23 67 -23 102v5c-82 40 -135 124 -135 216c0 11 0 38 5 48h-261c-141 0 -256 115 -256 256s115 256 256 256h113l-44 17c-99 37 -165 133 -165 239c0 141 115 256 256 256c31 0 62 -6 91 -17l628 -239h401
+c141 0 256 -115 256 -256v-668c0 -118 -80 -220 -194 -248l-339 -85c-60 -15 -123 -23 -186 -23zM1024 583l-155 -71l-163 -74c-40 -18 -66 -58 -66 -102c0 -62 50 -112 112 -112c16 0 32 3 46 10l338 154c-65 14 -112 73 -112 140v55zM1344 272c0 62 -50 112 -112 112
+c-16 0 -32 -3 -46 -10l-290 -132c-60 -27 -121 -51 -121 -127c0 -66 46 -114 113 -114c12 0 28 4 38 9l352 160c40 18 66 58 66 102zM1112 1024l-650 248c-15 5 -30 8 -46 8c-70 0 -128 -57 -128 -128c0 -53 33 -101 82 -120l526 -200v-64h-640c-71 0 -128 -57 -128 -128
+s57 -128 128 -128h535l233 106v198c0 40 17 79 46 106l111 102h-69zM1073 0c52 0 105 6 155 19l339 85c57 14 97 65 97 124v668c0 71 -57 128 -128 128h-308l-136 -126c-23 -21 -36 -51 -36 -82v-296c0 -62 51 -108 112 -108c62 0 112 55 112 116v208h32v-208
+c0 -45 -22 -87 -57 -114c70 -11 121 -72 121 -142c0 -56 -33 -108 -84 -131l-310 -141h91z" />
+    <glyph glyph-name="tumblr-square" unicode="&#xf174;" 
+d="M1136 75l-62 183c-24 -12 -69 -22 -103 -22c-102 -3 -123 71 -123 126v398h257v194h-256v326h-188c-3 0 -8 -3 -9 -10c-11 -99 -58 -275 -252 -345v-165h130v-418c0 -143 105 -347 384 -342c94 2 199 41 222 75zM1536 1120v-960c0 -159 -129 -288 -288 -288h-960
+c-159 0 -288 129 -288 288v960c0 159 129 288 288 288h960c159 0 288 -129 288 -288z" />
+    <glyph glyph-name="rub" unicode="&#xf158;" horiz-adv-x="1280" 
+d="M1043 971c0 134 -95 224 -236 224h-320v-448h320c141 0 236 90 236 224zM1280 971c0 -257 -186 -437 -453 -437h-340v-118h505c18 0 32 -14 32 -32v-128c0 -18 -14 -32 -32 -32h-505v-192c0 -18 -14 -32 -32 -32h-167c-18 0 -32 14 -32 32v192h-224c-18 0 -32 14 -32 32
+v128c0 18 14 32 32 32h224v118h-224c-18 0 -32 14 -32 32v149c0 18 14 32 32 32h224v629c0 18 14 32 32 32h539c267 0 453 -180 453 -437z" />
+    <glyph glyph-name="chevron-circle-up" unicode="&#xf139;" 
+d="M1165 397l102 102c25 25 25 65 0 90l-454 454c-25 25 -65 25 -90 0l-454 -454c-25 -25 -25 -65 0 -90l102 -102c25 -25 65 -25 90 0l307 307l307 -307c25 -25 65 -25 90 0zM1536 640c0 -424 -344 -768 -768 -768s-768 344 -768 768s344 768 768 768s768 -344 768 -768z
+" />
+    <glyph glyph-name="opencart" unicode="&#xf23d;" horiz-adv-x="2304" 
+d="M1524 -25c0 -91 -73 -164 -164 -164s-165 73 -165 164s74 165 165 165s164 -74 164 -165zM775 -25c0 -91 -74 -164 -165 -164s-164 73 -164 164s73 165 164 165s165 -74 165 -165zM0 1469c295 -311 572 -357 1660 -357s610 -242 -62 -842c213 370 945 698 -255 680
+c-1151 -17 -1219 333 -1343 519z" />
+    <glyph glyph-name="artstation" unicode="&#xf2ed;" horiz-adv-x="1533" 
+d="M601 1277v0h267c51 0 112 -37 136 -83l504 -878c16 -24 25 -53 25 -84c0 -35 -7 -53 -31 -94l-123 -213zM474 1058l348 -604h-695zM0 233v0h949l178 -309h-859c-53 0 -114 38 -138 85h-1z" />
+    <glyph glyph-name="thumbs-up" unicode="&#xf164;" horiz-adv-x="1600" 
+d="M256 192c0 35 -29 64 -64 64c-36 0 -64 -29 -64 -64c0 -36 28 -64 64 -64c35 0 64 28 64 64zM416 704v-640c0 -35 -29 -64 -64 -64h-288c-35 0 -64 29 -64 64v640c0 35 29 64 64 64h288c35 0 64 -29 64 -64zM1600 704c0 -53 -21 -110 -55 -149c11 -32 15 -62 15 -76
+c2 -50 -13 -97 -43 -137c11 -37 11 -77 0 -117c-10 -37 -29 -70 -54 -94c6 -75 -11 -136 -49 -181c-43 -51 -109 -77 -197 -78h-129c-143 0 -278 47 -386 84c-63 22 -123 43 -158 44c-34 1 -64 29 -64 64v641c0 33 28 61 61 64c37 3 133 122 177 180c36 46 70 89 101 120
+c39 39 50 99 62 157c11 59 23 121 66 163c12 12 28 19 45 19c224 0 224 -179 224 -256c0 -82 -29 -140 -56 -192c-11 -22 -21 -32 -29 -64h277c104 0 192 -88 192 -192z" />
+    <glyph glyph-name="vimeo-square" unicode="&#xf194;" 
+d="M1292 898c7 145 -47 218 -161 222c-154 5 -258 -82 -312 -261c28 12 55 19 82 19c56 0 81 -32 74 -96c-3 -38 -28 -94 -74 -167c-47 -74 -82 -110 -105 -110c-30 0 -56 56 -82 169c-8 34 -23 118 -45 255c-20 126 -73 185 -160 177c-36 -4 -92 -36 -164 -100
+c-54 -47 -107 -96 -162 -144l52 -67c50 34 79 52 87 52c38 0 74 -60 107 -179c30 -110 60 -219 90 -329c45 -119 99 -179 164 -179c104 0 232 98 383 294c146 188 222 336 226 444zM1536 1120v-960c0 -159 -129 -288 -288 -288h-960c-159 0 -288 129 -288 288v960
+c0 159 129 288 288 288h960c159 0 288 -129 288 -288z" />
+    <glyph glyph-name="arrow-circle-right" unicode="&#xf0a9;" 
+d="M1285 640c0 17 -6 33 -18 45l-91 91l-362 362c-12 12 -28 18 -45 18s-33 -6 -45 -18l-91 -91c-12 -12 -18 -28 -18 -45s6 -33 18 -45l189 -189h-502c-35 0 -64 -29 -64 -64v-128c0 -35 29 -64 64 -64h502l-189 -189c-12 -12 -19 -28 -19 -45s7 -33 19 -45l91 -91
+c12 -12 28 -18 45 -18s33 6 45 18l362 362l91 91c12 12 18 28 18 45zM1536 640c0 -424 -344 -768 -768 -768s-768 344 -768 768s344 768 768 768s768 -344 768 -768z" />
+    <glyph glyph-name="bolt" unicode="&#xf0e7;" horiz-adv-x="896" 
+d="M885 970c11 -12 14 -29 7 -44l-540 -1157c-8 -15 -24 -25 -42 -25c-4 0 -9 1 -14 2c-22 7 -35 28 -30 49l197 808l-406 -101c-4 -1 -8 -1 -12 -1c-11 0 -23 4 -31 11c-12 10 -16 25 -13 39l201 825c5 19 23 32 44 32h328c25 0 45 -19 45 -42c0 -6 -2 -12 -5 -18
+l-171 -463l396 98c4 1 8 2 12 2c13 0 25 -6 34 -15z" />
+    <glyph glyph-name="thermometer-quarter" unicode="&#xf2ca;" horiz-adv-x="1024" 
+d="M640 192c0 -106 -86 -192 -192 -192s-192 86 -192 192c0 80 50 153 128 181v139h128v-139c78 -28 128 -101 128 -181zM768 192c0 105 -50 197 -128 256v768c0 106 -86 192 -192 192s-192 -86 -192 -192v-768c-78 -59 -128 -151 -128 -256c0 -177 143 -320 320 -320
+s320 143 320 320zM896 192c0 -247 -201 -448 -448 -448s-448 201 -448 448c0 122 49 232 128 313v711c0 177 143 320 320 320s320 -143 320 -320v-711c79 -81 128 -191 128 -313zM1024 768v-128h-192v128h192zM1024 1024v-128h-192v128h192zM1024 1280v-128h-192v128h192z
+" />
+    <glyph glyph-name="hdd-o" unicode="&#xf0a0;" 
+d="M1040 320c0 -44 -36 -80 -80 -80s-80 36 -80 80s36 80 80 80s80 -36 80 -80zM1296 320c0 -44 -36 -80 -80 -80s-80 36 -80 80s36 80 80 80s80 -36 80 -80zM1408 160v320c0 17 -15 32 -32 32h-1216c-17 0 -32 -15 -32 -32v-320c0 -17 15 -32 32 -32h1216c17 0 32 15 32 32
+zM178 640h1180l-157 482c-5 17 -24 30 -42 30h-782c-18 0 -37 -13 -42 -30zM1536 480v-320c0 -88 -72 -160 -160 -160h-1216c-88 0 -160 72 -160 160v320c0 27 8 50 16 75l197 606c23 70 90 119 164 119h782c74 0 141 -49 164 -119l197 -606c8 -25 16 -48 16 -75z" />
+    <glyph glyph-name="id-card-o" unicode="&#xf2c3;" horiz-adv-x="2048" 
+d="M896 324c0 -73 -48 -132 -107 -132h-426c-59 0 -107 59 -107 132c0 132 32 284 164 284c40 -40 95 -64 156 -64s116 24 156 64c132 0 164 -152 164 -284zM768 768c0 -106 -86 -192 -192 -192s-192 86 -192 192s86 192 192 192s192 -86 192 -192zM1792 352v-64
+c0 -18 -14 -32 -32 -32h-704c-18 0 -32 14 -32 32v64c0 18 14 32 32 32h704c18 0 32 -14 32 -32zM1408 608v-64c0 -18 -14 -32 -32 -32h-320c-18 0 -32 14 -32 32v64c0 18 14 32 32 32h320c18 0 32 -14 32 -32zM1792 608v-64c0 -18 -14 -32 -32 -32h-192
+c-18 0 -32 14 -32 32v64c0 18 14 32 32 32h192c18 0 32 -14 32 -32zM1792 864v-64c0 -18 -14 -32 -32 -32h-704c-18 0 -32 14 -32 32v64c0 18 14 32 32 32h704c18 0 32 -14 32 -32zM1920 32v1120h-1792v-1120c0 -17 15 -32 32 -32h1728c17 0 32 15 32 32zM2048 1248v-1216
+c0 -88 -72 -160 -160 -160h-1728c-88 0 -160 72 -160 160v1216c0 88 72 160 160 160h1728c88 0 160 -72 160 -160z" />
+    <glyph glyph-name="plug" unicode="&#xf1e6;" horiz-adv-x="1792" 
+d="M1755 1083c49 -50 49 -131 0 -181l-401 -400l150 -150l-160 -160c-219 -219 -553 -250 -801 -86l-362 -362h-181v181l362 362c-164 248 -133 582 86 801l160 160l150 -150l400 401c50 49 131 49 181 0c50 -50 50 -132 0 -181l-400 -401l234 -234l401 400
+c50 50 131 50 181 0z" />
+    <glyph glyph-name="react" unicode="&#xf302;" horiz-adv-x="1755" 
+d="M1434 910v0c187 -64 321 -165 321 -269c0 -109 -143 -215 -341 -280c-11 -3 -21 -7 -32 -10c3 -13 7 -33 10 -46c39 -197 10 -360 -83 -413c-89 -52 -235 -1 -382 125c-16 14 -31 28 -46 43c-12 -12 -24 -22 -36 -33c-152 -133 -307 -187 -400 -134
+c-90 52 -118 203 -82 393c4 21 9 40 14 61c-16 4 -32 10 -47 15c-190 65 -330 172 -330 279c0 104 131 205 314 268c20 7 42 14 64 20c-5 19 -9 38 -13 57c-38 193 -11 348 79 400c94 55 250 -3 406 -142c8 -7 21 -20 29 -27c14 13 28 27 43 40c149 130 296 184 386 132
+c94 -54 121 -219 79 -423c-3 -13 -6 -25 -9 -38c15 -5 41 -13 56 -18zM970 1201v0c-14 -12 -27 -23 -40 -36c53 -57 101 -118 146 -182c77 -7 155 -20 231 -37c3 11 5 23 7 35c36 177 15 311 -43 344c-54 31 -173 -13 -301 -124zM524 553c-22 -52 -41 -104 -56 -153
+c52 -11 106 -19 159 -25c-19 29 -37 59 -54 89c-17 29 -33 59 -49 89zM524 726c15 30 32 61 49 90s35 59 53 87c-55 -7 -108 -16 -157 -27c15 -48 33 -99 55 -150zM563 640v0c23 -47 48 -93 74 -139c22 -38 59 -98 84 -134c50 -3 103 -5 157 -5s107 2 158 6
+c29 44 57 87 83 133c22 38 55 101 74 140c-23 47 -49 94 -75 139c-22 37 -59 96 -83 132c-51 4 -104 6 -157 6s-107 -2 -158 -6c-29 -44 -57 -87 -83 -133s-51 -92 -74 -139zM1182 464c-17 -29 -34 -59 -53 -88c54 6 108 16 161 28c-17 52 -35 102 -57 152
+c-16 -31 -34 -62 -51 -92zM1232 726c21 49 39 98 55 149c-49 11 -102 21 -157 28c15 -24 38 -63 52 -87c17 -29 34 -60 50 -90zM878 1112v0c-34 -37 -68 -79 -102 -123c28 1 74 3 102 3s74 -2 102 -3c-32 43 -66 84 -102 123zM481 1322c-54 -31 -76 -156 -44 -322
+c4 -18 8 -36 12 -53c76 17 154 29 231 36c45 64 94 125 147 182c-9 8 -17 16 -26 24c-135 119 -262 167 -320 133zM397 419c24 75 52 149 85 221c-33 71 -61 144 -84 218c-20 -6 -40 -12 -60 -19c-156 -55 -264 -135 -264 -198c7 -41 29 -78 64 -102
+c60 -48 143 -84 216 -107c14 -5 29 -9 43 -13zM796 83c11 10 22 19 33 30c-53 58 -103 119 -148 183c-79 6 -156 18 -233 34c-5 -19 -8 -38 -12 -57c-31 -163 -9 -284 46 -316c39 -15 83 -13 121 5c71 28 136 69 193 121zM880 166c36 40 70 81 102 125
+c-34 -2 -69 -3 -104 -3c-34 0 -68 1 -101 2c34 -45 68 -86 103 -124zM1328 63c11 76 9 153 -8 227c-2 12 -6 31 -9 42c-64 -14 -169 -31 -234 -36c-44 -64 -93 -126 -145 -184c15 -14 30 -27 44 -39c125 -108 241 -149 296 -117c33 26 53 65 56 107zM1391 432
+c171 57 291 143 291 210c0 62 -112 144 -272 199c-16 5 -34 11 -52 16c-23 -74 -51 -146 -84 -216c34 -71 64 -143 88 -218c10 3 19 6 29 9zM878 797c87 0 157 -70 157 -157s-70 -157 -157 -157s-157 70 -157 157s70 157 157 157z" />
+    <glyph glyph-name="themeisle" unicode="&#xf2b2;" horiz-adv-x="1792" 
+d="M852 1227c0 -36 -23 -76 -62 -76c-40 0 -62 40 -62 76c0 35 22 76 62 76c39 0 62 -41 62 -76zM688 -149v114c0 39 -31 73 -71 73s-70 -34 -70 -73v-114c0 -39 30 -74 70 -74s71 34 71 74zM860 -149v114c0 39 -30 73 -70 73s-71 -34 -71 -73v-114c0 -39 31 -74 71 -74
+s70 35 70 74zM1034 -149v114c0 39 -31 73 -71 73s-71 -34 -71 -73v-114c0 -39 31 -74 71 -74s71 34 71 74zM1208 -149v114c0 39 -31 73 -71 73s-71 -34 -71 -73v-114c0 -39 31 -74 71 -74s71 35 71 74zM1476 535c-108 -207 -316 -359 -555 -359c-338 0 -562 296 -562 618
+c0 59 7 117 21 174c-70 -118 -104 -254 -104 -390c0 -211 87 -426 250 -563c18 34 52 57 91 57c35 0 68 -20 86 -50c19 30 51 50 87 50c35 0 68 -20 86 -50c19 30 52 50 87 50s68 -20 87 -50c18 30 51 50 86 50c38 0 73 -23 90 -56c152 127 240 322 250 519zM1326 564
+c0 50 -22 75 -72 75c-16 0 -32 -3 -47 -6c-50 -10 -99 -19 -149 -19c-158 0 -226 92 -226 243c0 69 13 137 30 204c-53 -81 -83 -178 -83 -275c0 -189 120 -371 324 -371c75 0 149 27 210 70c7 26 13 52 13 79zM884 1223c0 63 -44 129 -113 129s-113 -66 -113 -129
+c0 -64 44 -130 113 -130s113 66 113 130zM1513 884c0 188 -121 370 -324 370c-106 0 -205 -53 -276 -129c-25 -83 -48 -180 -48 -268c0 -133 53 -210 193 -210c48 0 95 9 142 19c18 3 35 6 53 6c69 0 104 -40 104 -108c0 -15 -1 -31 -4 -46c101 91 160 230 160 366z
+M1792 667c0 -126 -40 -358 -127 -454c-80 -87 -306 -214 -423 -247l-4 -1v-114c0 -57 -44 -107 -102 -107c-35 0 -68 20 -86 50c-19 -30 -52 -50 -87 -50s-68 20 -87 50c-18 -30 -51 -50 -86 -50c-36 0 -68 20 -87 50c-18 -30 -51 -50 -86 -50c-66 0 -103 55 -103 115
+c-57 -43 -125 -68 -198 -68c-77 0 -152 29 -211 80c36 1 72 8 106 20c-73 20 -138 66 -182 127c23 -5 47 -7 71 -7c58 0 115 16 164 46c-77 77 -198 206 -240 306c-20 47 -24 110 -24 160c0 174 71 560 302 560c37 0 66 -17 81 -52c13 19 27 37 42 54c7 9 20 19 25 29
+c28 44 41 74 76 119c113 144 286 243 472 243c21 0 42 -1 62 -4c38 41 91 64 146 64c51 0 104 -21 140 -57c3 -3 5 -8 5 -12c0 -13 -36 -47 -45 -57c15 -5 55 -24 55 -42c0 -10 -10 -18 -16 -25c110 -97 173 -235 197 -378c15 18 36 30 60 30c37 0 73 -25 100 -49
+c73 -65 90 -186 90 -279z" />
+    <glyph glyph-name="braille" unicode="&#xf2a1;" horiz-adv-x="2176" 
+d="M192 352c-88 0 -160 -72 -160 -160s72 -160 160 -160s160 72 160 160s-72 160 -160 160zM704 352c-88 0 -160 -72 -160 -160s72 -160 160 -160s160 72 160 160s-72 160 -160 160zM704 864c-88 0 -160 -72 -160 -160s72 -160 160 -160s160 72 160 160s-72 160 -160 160z
+M1472 352c-88 0 -160 -72 -160 -160s72 -160 160 -160s160 72 160 160s-72 160 -160 160zM1984 352c-88 0 -160 -72 -160 -160s72 -160 160 -160s160 72 160 160s-72 160 -160 160zM1472 864c-88 0 -160 -72 -160 -160s72 -160 160 -160s160 72 160 160s-72 160 -160 160z
+M1984 864c-88 0 -160 -72 -160 -160s72 -160 160 -160s160 72 160 160s-72 160 -160 160zM1984 1376c-88 0 -160 -72 -160 -160s72 -160 160 -160s160 72 160 160s-72 160 -160 160zM384 192c0 -106 -86 -192 -192 -192s-192 86 -192 192s86 192 192 192s192 -86 192 -192z
+M896 192c0 -106 -86 -192 -192 -192s-192 86 -192 192s86 192 192 192s192 -86 192 -192zM384 704c0 -106 -86 -192 -192 -192s-192 86 -192 192s86 192 192 192s192 -86 192 -192zM896 704c0 -106 -86 -192 -192 -192s-192 86 -192 192s86 192 192 192s192 -86 192 -192z
+M384 1216c0 -106 -86 -192 -192 -192s-192 86 -192 192s86 192 192 192s192 -86 192 -192zM1664 192c0 -106 -86 -192 -192 -192s-192 86 -192 192s86 192 192 192s192 -86 192 -192zM896 1216c0 -106 -86 -192 -192 -192s-192 86 -192 192s86 192 192 192s192 -86 192 -192
+zM2176 192c0 -106 -86 -192 -192 -192s-192 86 -192 192s86 192 192 192s192 -86 192 -192zM1664 704c0 -106 -86 -192 -192 -192s-192 86 -192 192s86 192 192 192s192 -86 192 -192zM2176 704c0 -106 -86 -192 -192 -192s-192 86 -192 192s86 192 192 192
+s192 -86 192 -192zM1664 1216c0 -106 -86 -192 -192 -192s-192 86 -192 192s86 192 192 192s192 -86 192 -192zM2176 1216c0 -106 -86 -192 -192 -192s-192 86 -192 192s86 192 192 192s192 -86 192 -192z" />
+    <glyph glyph-name="industry" unicode="&#xf275;" horiz-adv-x="1792" 
+d="M448 1536c35 0 64 -29 64 -64v-891l536 429c11 9 26 14 40 14c35 0 64 -29 64 -64v-379l536 429c11 9 26 14 40 14c35 0 64 -29 64 -64v-1152c0 -35 -29 -64 -64 -64h-1664c-35 0 -64 29 -64 64v1664c0 35 29 64 64 64h384z" />
+    <glyph glyph-name="map-o" unicode="&#xf278;" horiz-adv-x="2048" 
+d="M2020 1525c17 -12 28 -32 28 -53v-1408c0 -26 -16 -50 -40 -59l-640 -256c-16 -7 -32 -7 -48 0l-616 246l-616 -246c-8 -4 -16 -5 -24 -5c-13 0 -25 4 -36 11c-17 12 -28 32 -28 53v1408c0 26 16 50 40 59l640 256c16 7 32 7 48 0l616 -246l616 246c20 8 42 6 60 -6z
+M736 1390v-1270l576 -230v1270zM128 1173v-1270l544 217v1270zM1920 107v1270l-544 -217v-1270z" />
+    <glyph glyph-name="krw" unicode="&#xf159;" horiz-adv-x="1792" 
+d="M514 341l81 299h-159l75 -300c1 -2 1 -4 2 -6c0 2 1 5 1 7zM630 768l35 128h-292l32 -128h225zM822 768h139l-35 128h-70zM1271 340l78 300h-162l81 -299c1 -3 1 -5 2 -7c0 2 1 4 1 6zM1382 768l33 128h-297l34 -128h230zM1792 736v-64c0 -18 -14 -32 -32 -32h-213
+l-164 -616c-4 -14 -17 -24 -31 -24h-159c-14 0 -27 10 -31 24l-166 616h-209l-167 -616c-4 -14 -16 -24 -31 -24h-159c-14 0 -27 10 -30 24l-160 616h-208c-18 0 -32 14 -32 32v64c0 18 14 32 32 32h175l-33 128h-142c-18 0 -32 14 -32 32v64c0 18 14 32 32 32h109l-89 344
+c-3 10 -1 20 5 28c6 7 16 12 26 12h137c15 0 28 -10 31 -24l90 -360h359l97 360c4 14 17 24 31 24h126c15 0 27 -10 31 -24l98 -360h365l93 360c3 14 16 24 31 24h137c10 0 20 -5 26 -12c6 -8 8 -19 5 -28l-91 -344h111c18 0 32 -14 32 -32v-64c0 -18 -14 -32 -32 -32h-145
+l-34 -128h179c18 0 32 -14 32 -32z" />
+    <glyph glyph-name="joomla" unicode="&#xf1aa;" 
+d="M1070 463l-160 -160l-151 -152l-30 -30c-88 -87 -211 -117 -323 -89c-21 -92 -103 -160 -201 -160c-113 0 -205 92 -205 206c0 97 67 179 158 200c-29 113 1 237 89 325l12 12l151 -152l-11 -11c-50 -49 -49 -129 0 -179c49 -49 129 -49 178 0l30 30l151 152l161 160z
+M729 1145l12 -12l-152 -152l-12 12c-49 49 -129 49 -178 0s-49 -130 0 -179l29 -29l152 -152l160 -160l-151 -152l-161 160l-151 152l-30 30c-92 91 -120 222 -85 339c-92 20 -160 102 -160 200c0 114 92 206 205 206c103 0 187 -75 203 -172c111 26 232 -5 319 -91z
+M1536 78c0 -114 -92 -206 -205 -206c-100 0 -183 71 -202 165c-116 -36 -249 -8 -341 84l-11 12l151 152l12 -12c49 -49 129 -49 178 0s49 129 0 178l-30 30l-152 152l-160 160l152 152l160 -160l152 -152l29 -30c87 -87 118 -210 90 -322c100 -14 177 -99 177 -203z
+M1534 1202c0 -104 -78 -190 -178 -204c33 -115 4 -244 -87 -335l-12 -12l-151 152l12 12c49 49 49 129 0 178s-129 49 -178 0l-30 -30l-152 -152l-160 -160l-152 152l161 160l152 152l29 30c91 91 221 120 337 86c14 100 100 177 204 177c113 0 205 -92 205 -206z" />
+    <glyph glyph-name="ethereum" unicode="&#xf2f3;" horiz-adv-x="1064" 
+d="M1064 623l-532 -325l-532 325l532 913zM532 194l532 325l-532 -775l-532 775z" />
+    <glyph glyph-name="plus" unicode="&#xf067;" horiz-adv-x="1408" 
+d="M1408 800v-192c0 -53 -43 -96 -96 -96h-416v-416c0 -53 -43 -96 -96 -96h-192c-53 0 -96 43 -96 96v416h-416c-53 0 -96 43 -96 96v192c0 53 43 96 96 96h416v416c0 53 43 96 96 96h192c53 0 96 -43 96 -96v-416h416c53 0 96 -43 96 -96z" />
+    <glyph glyph-name="list-ul" unicode="&#xf0ca;" horiz-adv-x="1792" 
+d="M384 128c0 -106 -86 -192 -192 -192s-192 86 -192 192s86 192 192 192s192 -86 192 -192zM384 640c0 -106 -86 -192 -192 -192s-192 86 -192 192s86 192 192 192s192 -86 192 -192zM1792 224v-192c0 -17 -15 -32 -32 -32h-1216c-17 0 -32 15 -32 32v192c0 17 15 32 32 32
+h1216c17 0 32 -15 32 -32zM384 1152c0 -106 -86 -192 -192 -192s-192 86 -192 192s86 192 192 192s192 -86 192 -192zM1792 736v-192c0 -17 -15 -32 -32 -32h-1216c-17 0 -32 15 -32 32v192c0 17 15 32 32 32h1216c17 0 32 -15 32 -32zM1792 1248v-192
+c0 -17 -15 -32 -32 -32h-1216c-17 0 -32 15 -32 32v192c0 17 15 32 32 32h1216c17 0 32 -15 32 -32z" />
+    <glyph glyph-name="play-circle-o" unicode="&#xf01d;" 
+d="M1184 640c0 -23 -12 -44 -32 -55l-544 -320c-10 -6 -21 -9 -32 -9s-22 3 -32 8c-20 12 -32 33 -32 56v640c0 23 12 44 32 56c20 11 45 11 64 -1l544 -320c20 -11 32 -32 32 -55zM1312 640c0 300 -244 544 -544 544s-544 -244 -544 -544s244 -544 544 -544
+s544 244 544 544zM1536 640c0 -424 -344 -768 -768 -768s-768 344 -768 768s344 768 768 768s768 -344 768 -768z" />
+    <glyph glyph-name="joplin" unicode="&#xf310;" 
+d="M288 1408h960c159 0 288 -129 288 -288v-960c0 -159 -129 -288 -288 -288h-960c-159 0 -288 129 -288 288v960c0 159 129 288 288 288zM737 1171v-148l43 -1c59 -2 70 -6 81 -30c4 -10 5 -13 5 -296c0 -323 0 -323 -16 -362c-16 -38 -48 -69 -87 -83
+c-13 -5 -21 -5 -43 -6c-33 -1 -53 2 -80 15c-30 14 -50 37 -62 69c-9 24 -10 34 -12 88c-2 51 -1 56 -7 70c-9 23 -25 45 -40 56c-24 18 -49 24 -87 22c-40 -2 -68 -13 -95 -41c-23 -23 -35 -44 -44 -75c-4 -15 -5 -23 -5 -54c0 -38 1 -46 11 -79c26 -82 92 -156 178 -199
+c46 -23 85 -35 155 -44v0c20 -3 119 -3 142 0c87 10 150 32 208 71c73 49 127 125 142 199c8 40 9 47 10 343l1 291l6 13c6 15 15 24 29 28c5 2 28 3 52 4l43 1v74l-1 73l-263 1h-264z" />
+    <glyph glyph-name="mars-stroke" unicode="&#xf229;" 
+d="M1472 1408c35 0 64 -29 64 -64v-416c0 -18 -14 -32 -32 -32h-64c-18 0 -32 14 -32 32v262l-213 -214l140 -140c12 -13 12 -33 0 -45l-46 -46c-12 -12 -32 -12 -45 0l-140 141l-78 -79c79 -98 126 -223 126 -359c0 -318 -258 -576 -576 -576s-576 258 -576 576
+s258 576 576 576c136 0 261 -47 359 -126l78 78l-172 172c-12 13 -12 33 0 45l46 46c12 12 32 12 45 0l172 -172l213 213h-261c-18 0 -32 14 -32 32v64c0 18 14 32 32 32h416zM576 0c247 0 448 201 448 448s-201 448 -448 448s-448 -201 -448 -448s201 -448 448 -448z" />
+    <glyph glyph-name="road" unicode="&#xf018;" horiz-adv-x="1820" 
+d="M1061 540v4l-24 320c-1 18 -17 32 -34 32h-186c-17 0 -33 -14 -34 -32l-24 -320v-4c-1 -16 14 -28 29 -28h244c15 0 30 12 29 28zM1820 73c0 -29 -8 -73 -46 -73h-704c17 0 31 14 30 32l-20 256c-1 18 -17 32 -34 32h-272c-17 0 -33 -14 -34 -32l-20 -256
+c-1 -18 13 -32 30 -32h-704c-38 0 -46 44 -46 73c0 40 11 80 26 116l417 1044c10 25 37 47 64 47h339c-17 0 -33 -14 -34 -32l-15 -192c-1 -18 12 -32 30 -32h166c18 0 31 14 30 32l-15 192c-1 18 -17 32 -34 32h339c27 0 54 -22 64 -47l417 -1044c15 -36 26 -76 26 -116z
+" />
+    <glyph glyph-name="volume-down" unicode="&#xf027;" horiz-adv-x="1152" 
+d="M768 1184v-1088c0 -35 -29 -64 -64 -64c-17 0 -33 7 -45 19l-333 333h-262c-35 0 -64 29 -64 64v384c0 35 29 64 64 64h262l333 333c12 12 28 19 45 19c35 0 64 -29 64 -64zM1152 640c0 -100 -61 -197 -155 -235c-8 -4 -17 -5 -25 -5c-35 0 -64 28 -64 64
+c0 76 116 55 116 176s-116 100 -116 176c0 36 29 64 64 64c8 0 17 -1 25 -5c94 -37 155 -135 155 -235z" />
+    <glyph glyph-name="question-circle" unicode="&#xf059;" 
+d="M896 160v192c0 18 -14 32 -32 32h-192c-18 0 -32 -14 -32 -32v-192c0 -18 14 -32 32 -32h192c18 0 32 14 32 32zM1152 832c0 183 -192 320 -364 320c-163 0 -285 -70 -371 -213c-9 -14 -5 -32 8 -42l132 -100c5 -4 12 -6 19 -6c9 0 19 4 25 12c47 60 67 78 86 92
+c17 12 50 24 86 24c64 0 123 -41 123 -85c0 -52 -27 -78 -88 -106c-71 -32 -168 -115 -168 -212v-36c0 -18 14 -32 32 -32h192c18 0 32 14 32 32c0 23 29 72 76 99c76 43 180 101 180 253zM1536 640c0 -424 -344 -768 -768 -768s-768 344 -768 768s344 768 768 768
+s768 -344 768 -768z" />
+    <glyph glyph-name="paypal" unicode="&#xf1ed;" horiz-adv-x="1519" 
+d="M1510 890c13 -60 10 -129 -4 -204c-65 -330 -284 -444 -565 -444h-44c-34 0 -62 -25 -68 -59l-4 -19l-55 -346l-2 -15c-7 -34 -35 -59 -69 -59h-251c-28 0 -46 23 -42 51c18 112 35 224 53 336s36 223 54 335c3 24 19 37 43 37c40 0 80 1 131 0c72 -1 155 3 236 21
+c108 24 206 68 287 144c73 68 122 152 155 246c15 44 27 88 35 133c2 12 5 10 12 5c55 -41 86 -96 98 -162zM1338 1172c0 -82 -19 -160 -46 -236c-52 -151 -150 -259 -302 -315c-81 -29 -166 -41 -252 -42c-60 -1 -120 0 -180 0c-65 0 -106 -32 -118 -96
+c-14 -76 -69 -430 -85 -530c-1 -7 -4 -10 -12 -10h-295c-30 0 -52 26 -48 55l232 1471c6 38 40 67 79 67h598c43 0 142 -19 209 -45c142 -55 220 -167 220 -319z" />
+    <glyph glyph-name="child" unicode="&#xf1ae;" horiz-adv-x="1152" 
+d="M1124 988l-292 -292v-824c0 -62 -50 -112 -112 -112s-112 50 -112 112v384h-64v-384c0 -62 -50 -112 -112 -112s-112 50 -112 112v824l-292 292c-37 38 -37 98 0 136c38 37 98 37 136 0l228 -228h368l228 228c38 37 98 37 136 0c37 -38 37 -98 0 -136zM800 1152
+c0 -124 -100 -224 -224 -224s-224 100 -224 224s100 224 224 224s224 -100 224 -224z" />
+    <glyph glyph-name="fork-awesome" unicode="&#xf2e3;" horiz-adv-x="1533" 
+d="M766 1404v0c423 0 767 -343 767 -766v-1v-2c0 -8 -1 -17 -1 -25v-2c-14 -388 -318 -703 -701 -735v1c-18 -2 -47 -2 -65 -2s-47 1 -65 3v-2c-383 32 -685 347 -700 735v2c0 8 -1 17 -1 25v2v1c0 423 343 766 766 766zM594 1085h-66c-35 -251 -54 -525 -29 -712
+s145 -157 181 -351c5 -29 10 -59 14 -89c20 -2 52 -4 72 -4s52 2 72 4c4 30 9 60 14 89c36 194 156 164 181 351s6 456 -28 712h-65c3 -190 12 -430 -8 -640c-8 -89 -103 -87 -108 0c-13 208 -15 428 -26 639h-64c-11 -211 -18 -431 -26 -643c-3 -82 -100 -81 -108 0
+c-19 208 -10 453 -6 644z" />
+    <glyph glyph-name="angle-double-up" unicode="&#xf102;" horiz-adv-x="998" 
+d="M998 224c0 -8 -4 -17 -10 -23l-50 -50c-6 -6 -14 -10 -23 -10c-8 0 -17 4 -23 10l-393 393l-393 -393c-6 -6 -15 -10 -23 -10s-17 4 -23 10l-50 50c-6 6 -10 15 -10 23s4 17 10 23l466 466c6 6 15 10 23 10s17 -4 23 -10l466 -466c6 -6 10 -15 10 -23zM998 608
+c0 -8 -4 -17 -10 -23l-50 -50c-6 -6 -14 -10 -23 -10c-8 0 -17 4 -23 10l-393 393l-393 -393c-6 -6 -15 -10 -23 -10s-17 4 -23 10l-50 50c-6 6 -10 15 -10 23s4 17 10 23l466 466c6 6 15 10 23 10s17 -4 23 -10l466 -466c6 -6 10 -15 10 -23z" />
+    <glyph glyph-name="bath" unicode="&#xf2cd;" horiz-adv-x="1792" 
+d="M1664 448v-192c0 -114 -50 -215 -128 -286v-194c0 -18 -14 -32 -32 -32h-64c-18 0 -32 14 -32 32v118c-40 -14 -83 -22 -128 -22h-768c-45 0 -88 8 -128 22v-110c0 -22 -14 -40 -32 -40h-64c-18 0 -32 18 -32 40v186c-78 71 -128 172 -128 286v192h1536zM704 864
+c0 -18 -14 -32 -32 -32s-32 14 -32 32s14 32 32 32s32 -14 32 -32zM768 928c0 -18 -14 -32 -32 -32s-32 14 -32 32s14 32 32 32s32 -14 32 -32zM704 992c0 -18 -14 -32 -32 -32s-32 14 -32 32s14 32 32 32s32 -14 32 -32zM832 992c0 -18 -14 -32 -32 -32s-32 14 -32 32
+s14 32 32 32s32 -14 32 -32zM768 1056c0 -18 -14 -32 -32 -32s-32 14 -32 32s14 32 32 32s32 -14 32 -32zM704 1120c0 -18 -14 -32 -32 -32s-32 14 -32 32s14 32 32 32s32 -14 32 -32zM1792 608v-64c0 -18 -14 -32 -32 -32h-1728c-18 0 -32 14 -32 32v64c0 18 14 32 32 32
+h96v640c0 141 115 256 256 256c72 0 137 -30 184 -78c62 25 136 16 191 -27l22 22c6 6 16 6 22 0l42 -42c6 -6 6 -16 0 -22l-314 -314c-6 -6 -16 -6 -22 0l-42 42c-6 6 -6 16 0 22l22 22c-48 61 -54 145 -17 212c-23 22 -54 35 -88 35c-71 0 -128 -57 -128 -128v-640h1504
+c18 0 32 -14 32 -32zM896 1056c0 -18 -14 -32 -32 -32s-32 14 -32 32s14 32 32 32s32 -14 32 -32zM832 1120c0 -18 -14 -32 -32 -32s-32 14 -32 32s14 32 32 32s32 -14 32 -32zM768 1184c0 -18 -14 -32 -32 -32s-32 14 -32 32s14 32 32 32s32 -14 32 -32zM960 1120
+c0 -18 -14 -32 -32 -32s-32 14 -32 32s14 32 32 32s32 -14 32 -32zM896 1184c0 -18 -14 -32 -32 -32s-32 14 -32 32s14 32 32 32s32 -14 32 -32zM832 1248c0 -18 -14 -32 -32 -32s-32 14 -32 32s14 32 32 32s32 -14 32 -32zM1024 1184c0 -18 -14 -32 -32 -32s-32 14 -32 32
+s14 32 32 32s32 -14 32 -32zM960 1248c0 -18 -14 -32 -32 -32s-32 14 -32 32s14 32 32 32s32 -14 32 -32zM1088 1248c0 -18 -14 -32 -32 -32s-32 14 -32 32s14 32 32 32s32 -14 32 -32z" />
+    <glyph glyph-name="reply-all" unicode="&#xf122;" horiz-adv-x="1792" 
+d="M640 454v-70c0 -26 -16 -49 -39 -59c-8 -3 -17 -5 -25 -5c-17 0 -33 6 -45 19l-512 512c-25 25 -25 65 0 90l512 512c18 19 46 24 70 14c23 -10 39 -33 39 -59v-69l-397 -398c-25 -25 -25 -65 0 -90zM1792 416c0 -208 -157 -514 -164 -527c-5 -11 -16 -17 -28 -17
+c-3 0 -6 0 -9 1c-15 5 -24 19 -23 34c29 273 -5 453 -106 565c-85 95 -223 146 -438 163v-251c0 -26 -16 -49 -39 -59c-8 -3 -17 -5 -25 -5c-17 0 -33 6 -45 19l-512 512c-25 25 -25 65 0 90l512 512c18 19 46 24 70 14c23 -10 39 -33 39 -59v-262c276 -19 473 -92 599 -221
+c151 -155 169 -365 169 -509z" />
+    <glyph glyph-name="patreon" unicode="&#xf2f0;" 
+d="M985 1341c-305 0 -553 -248 -553 -553c0 -304 248 -551 553 -551c304 0 551 247 551 551c0 305 -247 553 -551 553zM270 -132h-270v1473h270v-1473z" />
+    <glyph glyph-name="inbox" unicode="&#xf01c;" 
+d="M1023 576h316c-2 5 -3 11 -5 16l-212 496h-708l-212 -496c-2 -5 -3 -11 -5 -16h316l95 -192h320zM1536 546v-482c0 -35 -29 -64 -64 -64h-1408c-35 0 -64 29 -64 64v482c0 36 11 89 25 123l238 552c14 33 54 59 89 59h832c35 0 75 -26 89 -59l238 -552
+c14 -34 25 -87 25 -123z" />
+    <glyph glyph-name="female" unicode="&#xf182;" horiz-adv-x="1280" 
+d="M1280 480c0 -53 -43 -96 -96 -96c-32 0 -62 16 -80 43l-227 341h-45v-132l247 -411c6 -10 9 -21 9 -33c0 -35 -29 -64 -64 -64h-192v-272c0 -62 -50 -112 -112 -112h-160c-61 0 -112 50 -112 112v272h-192c-35 0 -64 29 -64 64c0 12 3 23 9 33l247 411v132h-45l-227 -341
+c-18 -27 -48 -43 -80 -43c-53 0 -96 43 -96 96c0 19 6 38 16 53l256 384c40 59 102 107 176 107h384c74 0 136 -48 176 -107l256 -384c10 -15 16 -34 16 -53zM864 1280c0 -124 -100 -224 -224 -224s-224 100 -224 224s100 224 224 224s224 -100 224 -224z" />
+    <glyph glyph-name="gavel" unicode="&#xf0e3;" horiz-adv-x="1731" 
+d="M1731 0c0 -34 -14 -67 -37 -90l-107 -108c-24 -23 -57 -37 -91 -37s-67 14 -90 37l-363 364c-24 23 -38 56 -38 90c0 38 16 69 43 96l-256 256l-126 -126c-9 -9 -21 -14 -34 -14s-25 5 -34 14c30 -30 58 -52 58 -98c0 -26 -10 -49 -28 -68c-34 -36 -70 -84 -124 -84
+c-25 0 -50 10 -68 28l-408 408c-18 18 -28 43 -28 68c0 54 48 90 84 124c19 18 42 28 68 28c46 0 68 -28 98 -58c-9 9 -14 21 -14 34s5 25 14 34l348 348c9 9 21 14 34 14s25 -5 34 -14c-30 30 -58 52 -58 98c0 26 10 49 28 68c34 36 70 84 124 84c25 0 50 -10 68 -28
+l408 -408c18 -18 28 -43 28 -68c0 -54 -48 -90 -84 -124c-19 -18 -42 -28 -68 -28c-46 0 -68 28 -98 58c9 -9 14 -21 14 -34s-5 -25 -14 -34l-126 -126l256 -256c27 27 58 43 96 43c34 0 67 -14 91 -37l363 -363c23 -24 37 -57 37 -91z" />
+    <glyph glyph-name="jsfiddle" unicode="&#xf1cc;" horiz-adv-x="2048" 
+d="M1800 764c145 -60 248 -202 248 -367c0 -219 -181 -397 -403 -397c-8 0 -15 1 -22 1h-1217c-224 13 -406 184 -406 406c0 149 81 279 202 350c-8 26 -12 53 -12 82c0 153 125 277 281 277c64 0 124 -22 172 -58c98 202 306 342 549 342c337 0 609 -269 609 -600
+c0 -12 -1 -24 -1 -36zM468 498c0 -169 133 -264 292 -264c98 0 169 31 240 99c-29 36 -61 71 -91 107c-41 -40 -86 -65 -144 -65c-71 0 -132 47 -132 121c0 73 61 121 130 121c220 0 267 -384 587 -384c156 0 288 98 288 262c0 166 -133 263 -291 263
+c-98 0 -171 -28 -241 -97c32 -35 62 -72 93 -108c40 39 85 64 142 64c66 0 132 -47 132 -117c0 -77 -56 -126 -131 -126c-213 0 -270 384 -582 384c-155 0 -292 -95 -292 -260z" />
+    <glyph glyph-name="git" unicode="&#xf1d3;" horiz-adv-x="1656" 
+d="M527 22c0 88 -97 100 -165 100c-71 0 -158 -15 -158 -104c0 -90 103 -101 172 -101c73 0 151 18 151 105zM468 777c0 75 -36 143 -119 143c-92 0 -124 -61 -124 -145c0 -83 36 -135 124 -135c87 0 119 56 119 137zM737 1101v-202c-26 -9 -52 -16 -79 -22
+c10 -27 16 -55 16 -84c0 -169 -104 -298 -270 -329c-50 -10 -79 -31 -79 -85c0 -153 404 -49 404 -331c0 -229 -155 -304 -363 -304c-171 0 -366 57 -366 263c0 120 73 189 182 225v4c-46 28 -67 72 -67 126c0 51 11 114 63 137v4c-101 34 -167 173 -167 274
+c0 187 145 324 330 324c62 0 124 -16 178 -47c75 0 149 20 218 47zM1055 220h-222c4 45 4 89 4 134v609c0 43 1 86 -4 128h222c-5 -41 -4 -83 -4 -124v-613c0 -45 0 -89 4 -134zM1656 442v-196c-53 -29 -114 -39 -174 -39c-214 0 -239 169 -239 343v351h2v4
+c-13 0 -25 2 -37 2c-20 0 -40 -3 -59 -6v190h96v76c0 30 -1 60 -6 89h227c-8 -55 -6 -110 -6 -165h171v-190c-29 0 -58 4 -86 4h-85v-365c0 -59 13 -131 87 -131c39 0 77 11 109 33zM1080 1389c0 -75 -58 -145 -135 -145c-79 0 -138 69 -138 145c0 77 58 147 138 147
+c79 0 135 -72 135 -147z" />
+    <glyph glyph-name="signalapp" unicode="&#xf30c;" horiz-adv-x="1652" 
+d="M710 1400c32 4 84 8 116 8v0c27 0 53 -2 80 -4l-3 -42c-21 2 -56 3 -77 3c-31 0 -81 -3 -111 -7zM977 1351l8 43c54 -10 138 -36 188 -58l-17 -39c-48 21 -128 45 -179 54zM446 1321c49 24 133 54 186 66l10 -42c-51 -11 -130 -39 -177 -62zM1223 1264l21 37
+c48 -27 120 -78 160 -115l-29 -32c-38 35 -106 85 -152 110zM222 1161c39 39 108 93 155 122l22 -36c-44 -27 -110 -79 -147 -116l-30 30v0zM1427 1101l32 28c37 -41 87 -114 112 -163l-38 -20c-24 46 -71 116 -106 155v0zM65 934c23 50 69 125 104 168l33 -27
+c-33 -40 -77 -112 -98 -159zM1564 878l39 15c20 -52 41 -138 46 -193l-43 -4c-5 52 -23 133 -42 182zM0 664c3 55 19 143 36 196l41 -14c-16 -49 -32 -132 -34 -184zM1582 436c14 50 26 133 27 185h43c-1 -55 -14 -144 -29 -197zM-0 585l43 2c2 -70 10 -131 23 -187l-42 -11
+c-14 59 -22 123 -24 196zM1464 203c32 41 73 114 93 162l40 -16c-21 -51 -66 -128 -99 -172zM47 313l40 15c22 -60 52 -113 92 -160l-33 -28c-43 51 -75 108 -99 173v0zM1273 26c44 28 107 82 143 120l31 -29c-37 -40 -105 -97 -151 -127zM202 82l28 32
+c12 -11 34 -28 47 -38c4 -3 6 -7 7 -11l40 -125l-41 -13l-37 118c-13 10 -32 26 -44 37v0zM1033 -80c50 13 129 44 175 68l20 -39c-48 -25 -131 -56 -184 -70zM644 -86c2 1 7 2 9 2s3 -1 5 -1c17 -5 31 -8 42 -11l-9 -42c-10 2 -27 7 -37 10l-128 -57l-18 40l136 59v0z
+M826 -106c45 0 90 4 134 11l7 -42c-39 -6 -102 -12 -141 -12c-22 0 -40 0 -55 1l2 43c15 -1 31 -1 53 -1v0zM357 -256v0v0c-9 0 -17 7 -20 15l-30 93l41 13l23 -70l67 29l17 -39l-89 -39c-2 -1 -7 -2 -9 -2zM442 -65c-11 0 -21 8 -22 19l-16 213c-70 53 -124 122 -161 204
+c-37 81 -56 171 -56 268c0 332 292 602 651 602s651 -270 651 -602s-292 -602 -651 -602c-60 0 -119 8 -176 23l-209 -123c-3 -2 -7 -2 -11 -2v0z" />
+    <glyph glyph-name="share-square" unicode="&#xf14d;" 
+d="M1005 435l352 352c25 25 25 65 0 90l-352 352c-18 19 -46 24 -69 14c-24 -10 -40 -33 -40 -59v-160c-574 0 -640 -329 -640 -576c0 -201 161 -396 167 -404c7 -8 16 -12 25 -12c4 0 9 1 13 3c13 5 21 19 19 33c-30 241 -11 391 62 473c61 69 167 99 354 99v-160
+c0 -26 16 -49 40 -59c7 -3 16 -5 24 -5c17 0 33 7 45 19zM1536 1120v-960c0 -159 -129 -288 -288 -288h-960c-159 0 -288 129 -288 288v960c0 159 129 288 288 288h960c159 0 288 -129 288 -288z" />
+    <glyph glyph-name="thermometer-half" unicode="&#xf2c9;" horiz-adv-x="1024" 
+d="M640 192c0 -106 -86 -192 -192 -192s-192 86 -192 192c0 80 50 153 128 181v395h128v-395c78 -28 128 -101 128 -181zM768 192c0 105 -50 197 -128 256v768c0 106 -86 192 -192 192s-192 -86 -192 -192v-768c-78 -59 -128 -151 -128 -256c0 -177 143 -320 320 -320
+s320 143 320 320zM896 192c0 -247 -201 -448 -448 -448s-448 201 -448 448c0 122 49 232 128 313v711c0 177 143 320 320 320s320 -143 320 -320v-711c79 -81 128 -191 128 -313zM1024 768v-128h-192v128h192zM1024 1024v-128h-192v128h192zM1024 1280v-128h-192v128h192z
+" />
+    <glyph glyph-name="question" unicode="&#xf128;" horiz-adv-x="924" 
+d="M608 280v-240c0 -22 -18 -40 -40 -40h-240c-22 0 -40 18 -40 40v240c0 22 18 40 40 40h240c22 0 40 -18 40 -40zM924 880c0 -190 -129 -263 -224 -316c-59 -34 -96 -103 -96 -132c0 -22 -17 -48 -40 -48h-240c-22 0 -36 34 -36 56v45c0 121 120 225 208 265
+c77 35 109 68 109 132c0 56 -73 106 -154 106c-45 0 -86 -14 -108 -29c-24 -17 -48 -41 -107 -115c-8 -10 -20 -16 -31 -16c-9 0 -17 3 -25 8l-164 125c-17 13 -21 35 -10 53c108 179 260 266 464 266c214 0 454 -171 454 -400z" />
+    <glyph glyph-name="low-vision" unicode="&#xf2a8;" horiz-adv-x="1792" 
+d="M335 180c-2 0 -4 1 -6 2c-117 78 -234 206 -308 325c-14 20 -21 44 -21 69c0 52 36 94 65 133c116 158 271 288 452 365c-15 27 -110 193 -110 211c0 12 7 23 17 29c20 11 110 64 128 64c11 0 22 -6 28 -16l124 -229c63 13 128 19 192 19c362 0 684 -205 876 -507
+c13 -20 20 -44 20 -69s-7 -49 -20 -69c-119 -187 -293 -342 -497 -429c15 -27 110 -193 110 -211c0 -12 -6 -23 -17 -29c-20 -11 -110 -64 -127 -64c-12 0 -23 6 -29 16l-124 229l-64 119l-444 820l7 7c-34 -14 -67 -29 -99 -47c12 -23 489 -899 489 -906c0 -5 -4 -8 -9 -9
+c-22 -5 -50 -3 -72 -3c-11 0 -56 -2 -60 7l-456 841c-29 -21 -56 -44 -82 -68c22 -39 404 -742 404 -748c0 -8 -5 -10 -11 -10c-17 0 -150 41 -155 50l-106 197l-224 413c-28 -34 -54 -69 -78 -106c13 -19 30 -39 41 -59c14 -26 176 -321 176 -327c0 -5 -5 -10 -10 -10z
+M1165 282l49 -91c187 76 341 216 450 385c-111 171 -269 313 -459 389c89 -85 139 -202 139 -325c0 -141 -66 -274 -179 -358zM848 896c0 -26 22 -48 48 -48c55 0 108 -22 147 -61s61 -92 61 -147c0 -26 22 -48 48 -48s48 22 48 48c0 168 -136 304 -304 304
+c-26 0 -48 -22 -48 -48zM1214 961l-9 4l7 -7z" />
+    <glyph glyph-name="camera" unicode="&#xf030;" horiz-adv-x="1920" 
+d="M960 864c159 0 288 -129 288 -288s-129 -288 -288 -288s-288 129 -288 288s129 288 288 288zM1664 1280c141 0 256 -115 256 -256v-896c0 -141 -115 -256 -256 -256h-1408c-141 0 -256 115 -256 256v896c0 141 115 256 256 256h224l51 136c25 66 103 120 173 120h512
+c70 0 148 -54 173 -120l51 -136h224zM960 128c247 0 448 201 448 448s-201 448 -448 448s-448 -201 -448 -448s201 -448 448 -448z" />
+    <glyph glyph-name="wordpress" unicode="&#xf19a;" horiz-adv-x="1792" 
+d="M127 640c0 111 24 217 67 313l367 -1005c-257 125 -434 388 -434 692zM1415 679c0 -66 -27 -142 -59 -249l-76 -256l-278 826s46 3 88 8c41 5 36 66 -5 63c-125 -9 -205 -10 -205 -10s-75 1 -202 10c-42 3 -47 -60 -5 -63c39 -4 80 -8 80 -8l120 -328l-168 -504l-280 832
+s46 3 88 8c41 5 36 66 -5 63c-124 -9 -205 -10 -205 -10c-14 0 -31 1 -49 1c137 209 373 347 642 347c200 0 382 -77 519 -202h-10c-75 0 -129 -65 -129 -136c0 -63 37 -116 76 -180c30 -51 63 -117 63 -212zM909 573l237 -647c1 -4 3 -8 5 -11c-80 -28 -165 -44 -255 -44
+c-75 0 -148 11 -217 32zM1570 1009c60 -110 95 -235 95 -369c0 -284 -154 -531 -383 -664l235 678c39 112 59 198 59 276c0 28 -2 54 -6 79zM896 1536c494 0 896 -402 896 -896s-402 -896 -896 -896s-896 402 -896 896s402 896 896 896zM896 -215c471 0 855 384 855 855
+s-384 855 -855 855s-855 -384 -855 -855s384 -855 855 -855z" />
+    <glyph glyph-name="italic" unicode="&#xf033;" horiz-adv-x="1024" 
+d="M0 -126l17 85c64 20 133 28 193 59c23 29 34 66 41 101c13 68 231 1049 228 1129v25c-55 30 -122 22 -182 32l19 103c129 -6 260 -16 390 -16c106 0 212 10 318 16c-4 -30 -11 -60 -19 -89c-69 -24 -142 -35 -210 -62c-22 -54 -27 -113 -37 -170
+c-48 -259 -112 -518 -165 -775c-10 -48 -59 -247 -55 -289l1 -18c61 -14 123 -21 185 -31c-2 -33 -8 -66 -16 -99c-22 0 -43 -3 -65 -3c-57 0 -116 19 -173 20c-69 1 -138 2 -206 2c-89 0 -176 -15 -264 -20z" />
+    <glyph glyph-name="forward" unicode="&#xf04e;" horiz-adv-x="1542" 
+d="M45 -115c-25 -25 -45 -16 -45 19v1472c0 35 20 44 45 19l710 -710c6 -6 10 -12 13 -19v710c0 35 20 44 45 19l710 -710c25 -25 25 -65 0 -90l-710 -710c-25 -25 -45 -16 -45 19v710c-3 -7 -7 -13 -13 -19z" />
+    <glyph glyph-name="steam-square" unicode="&#xf1b7;" 
+d="M1242 889c0 106 -87 193 -194 193c-106 0 -193 -87 -193 -193c0 -107 87 -193 193 -193c107 0 194 86 194 193zM632 301c0 -110 -88 -198 -198 -198c-76 0 -142 43 -175 106c33 -13 65 -26 98 -40c80 -32 172 7 205 88c32 80 -7 172 -88 204l-82 33c13 3 28 5 42 5
+c110 0 198 -88 198 -198zM1536 1120v-960c0 -159 -129 -288 -288 -288h-960c-159 0 -288 129 -288 288v153l172 -69c26 -121 134 -212 262 -212c140 0 255 107 268 243l345 252c200 0 361 162 361 360c0 200 -161 361 -361 361c-197 0 -358 -160 -360 -357l-225 -322
+c-9 1 -18 1 -28 1c-50 0 -97 -13 -137 -37l-297 119v468c0 159 129 288 288 288h960c159 0 288 -129 288 -288zM1289 887c0 -133 -108 -241 -242 -241c-133 0 -241 108 -241 241c0 134 108 242 241 242c134 0 242 -108 242 -242z" />
+    <glyph glyph-name="medium-square" unicode="&#xf2f8;" 
+d="M0 1404h1536v-1536h-1536v1536zM257 1057v-17l97 -116c7 -7 13 -20 13 -30v-4v-456v-9c0 -12 -6 -28 -14 -36l-109 -132v-17h308v17l-109 132c-9 9 -15 26 -15 38v7v395l270 -589h31l232 589v-469c0 -13 0 -16 -8 -24l-84 -80v-18h405v18l-80 79c-5 4 -10 12 -10 19
+c0 1 1 3 1 4v580c0 1 -1 3 -1 4c0 7 5 15 10 19l82 79v17h-285l-203 -507l-232 507h-299z" />
+    <glyph glyph-name="sort-numeric-desc" unicode="&#xf163;" horiz-adv-x="1454" 
+d="M1314 1247c0 82 -67 169 -147 169c-70 0 -114 -57 -114 -131c0 -72 46 -133 141 -133c65 0 120 39 120 95zM704 96c0 -9 -4 -17 -10 -24l-319 -319c-7 -6 -15 -9 -23 -9s-16 3 -23 9l-320 320c-9 10 -12 23 -7 35s17 20 30 20h192v1376c0 18 14 32 32 32h192
+c18 0 32 -14 32 -32v-1376h192c18 0 32 -14 32 -32zM1424 -142v-114h-469v114h167v432c0 13 1 26 1 36v16h-2l-7 -12c-5 -8 -13 -18 -26 -31l-62 -58l-82 86l192 185h123v-654h165zM1454 1189c0 -202 -110 -421 -348 -421c-45 0 -82 7 -108 16c-16 5 -30 10 -42 15l39 113
+c9 -4 20 -8 31 -11c20 -7 46 -13 75 -13c120 0 182 100 201 204h-2c-28 -30 -87 -51 -146 -51c-145 0 -240 114 -240 244c0 138 106 251 253 251c159 0 287 -130 287 -347z" />
+    <glyph glyph-name="video-camera" unicode="&#xf03d;" horiz-adv-x="1792" 
+d="M1792 1184v-1088c0 -26 -16 -49 -39 -59c-8 -3 -17 -5 -25 -5c-17 0 -33 6 -45 19l-403 403v-166c0 -159 -129 -288 -288 -288h-704c-159 0 -288 129 -288 288v704c0 159 129 288 288 288h704c159 0 288 -129 288 -288v-165l403 402c12 13 28 19 45 19c8 0 17 -2 25 -5
+c23 -10 39 -33 39 -59z" />
+    <glyph glyph-name="thumbs-down" unicode="&#xf165;" horiz-adv-x="1600" 
+d="M256 960c0 36 -29 64 -64 64c-36 0 -64 -28 -64 -64c0 -35 28 -64 64 -64c35 0 64 29 64 64zM416 448c0 -35 -29 -64 -64 -64h-288c-35 0 -64 29 -64 64v640c0 35 29 64 64 64h288c35 0 64 -29 64 -64v-640zM1545 597c34 -38 55 -96 55 -149c-1 -104 -88 -192 -192 -192
+h-277c8 -32 18 -42 29 -64c26 -52 56 -110 56 -192c0 -77 0 -256 -224 -256c-17 0 -33 7 -45 19c-43 42 -55 104 -66 163c-12 58 -23 118 -62 157c-31 31 -65 74 -101 120c-44 58 -140 177 -177 180c-33 3 -61 31 -61 64v641c0 35 30 63 64 64c35 1 95 22 158 44
+c108 37 243 84 386 84h129c88 -1 154 -27 197 -78c38 -45 55 -106 49 -181c25 -24 44 -57 54 -94c11 -40 11 -80 0 -117c30 -40 45 -87 43 -137c0 -14 -4 -44 -15 -76z" />
+    <glyph glyph-name="medium" unicode="&#xf23a;" 
+d="M182 999v6c0 15 -8 34 -19 44l-144 173v26h446l344 -755l302 755h425v-26l-123 -117c-8 -6 -14 -19 -14 -29c0 -2 1 -4 1 -6v-864c0 -2 -1 -4 -1 -6c0 -10 6 -23 14 -29l120 -117v-26h-602v26l124 120c12 12 12 16 12 35v698l-345 -876h-47l-401 876v-587
+c0 -3 -1 -8 -1 -11c0 -18 10 -44 23 -57l162 -195v-26h-458v26l161 195c12 13 22 38 22 55c0 4 0 9 -1 13v679z" />
+    <glyph glyph-name="chevron-right" unicode="&#xf054;" horiz-adv-x="1036" 
+d="M1017 659l-742 -742c-25 -25 -65 -25 -90 0l-166 166c-25 25 -25 65 0 90l531 531l-531 531c-25 25 -25 65 0 90l166 166c25 25 65 25 90 0l742 -742c25 -25 25 -65 0 -90z" />
+    <glyph glyph-name="bus" unicode="&#xf207;" 
+d="M384 320c0 71 -57 128 -128 128s-128 -57 -128 -128s57 -128 128 -128s128 57 128 128zM1408 320c0 71 -57 128 -128 128s-128 -57 -128 -128s57 -128 128 -128s128 57 128 128zM1362 716l-72 384c-6 30 -32 52 -63 52h-918c-31 0 -57 -22 -63 -52l-72 -384
+c-7 -40 23 -76 63 -76h1062c40 0 70 36 63 76zM1136 1328c0 27 -21 48 -48 48h-640c-26 0 -48 -21 -48 -48s22 -48 48 -48h640c27 0 48 21 48 48zM1536 603v-603h-128v-128c0 -71 -57 -128 -128 -128s-128 57 -128 128v128h-768v-128c0 -71 -57 -128 -128 -128
+s-128 57 -128 128v128h-128v603c0 82 7 143 25 223l103 454c19 160 299 256 640 256s621 -96 640 -256l105 -454c18 -80 23 -141 23 -223z" />
+    <glyph glyph-name="registered" unicode="&#xf25d;" horiz-adv-x="1792" 
+d="M1042 833c0 58 -20 99 -60 121c-20 11 -48 18 -117 18h-123v-281h162c88 0 138 52 138 142zM1094 548l205 -373c5 -10 5 -22 -1 -31c-5 -10 -16 -16 -27 -16h-152c-12 0 -23 6 -28 17l-194 365h-155v-350c0 -18 -14 -32 -32 -32h-134c-18 0 -32 14 -32 32v960
+c0 18 14 32 32 32h294c105 0 151 -9 190 -24c113 -42 183 -153 183 -289c0 -123 -61 -227 -158 -275c3 -5 6 -10 9 -16zM896 1376c-406 0 -736 -330 -736 -736s330 -736 736 -736s736 330 736 736s-330 736 -736 736zM1792 640c0 -495 -401 -896 -896 -896
+s-896 401 -896 896s401 896 896 896s896 -401 896 -896z" />
+    <glyph glyph-name="mars" unicode="&#xf222;" 
+d="M1472 1408c35 0 64 -29 64 -64v-416c0 -18 -14 -32 -32 -32h-64c-18 0 -32 14 -32 32v262l-382 -383c79 -98 126 -223 126 -359c0 -318 -258 -576 -576 -576s-576 258 -576 576s258 576 576 576c136 0 261 -47 359 -126l382 382h-261c-18 0 -32 14 -32 32v64
+c0 18 14 32 32 32h416zM576 0c247 0 448 201 448 448s-201 448 -448 448s-448 -201 -448 -448s201 -448 448 -448z" />
+    <glyph glyph-name="hand-rock-o" unicode="&#xf255;" 
+d="M768 1152c-71 0 -128 -57 -128 -128v-128h-32v93c0 63 -48 115 -112 115c-62 0 -112 -50 -112 -112v-429l-32 30v172c0 63 -48 115 -112 115c-62 0 -112 -50 -112 -112v-224c0 -31 13 -60 35 -82l310 -296c29 -29 39 -62 39 -102c0 -35 29 -64 64 -64h640
+c35 0 64 29 64 64v25c0 26 3 52 10 77l108 436c7 25 10 51 10 77v246c0 63 -48 115 -112 115c-62 0 -112 -50 -112 -112v-32h-32v125c0 53 -36 102 -89 113c-7 1 -15 2 -23 2c-62 0 -112 -50 -112 -112v-128h-32v122c0 67 -48 126 -115 133c-5 1 -9 1 -13 1zM768 1280
+c54 0 106 -17 149 -50c37 22 80 34 123 34c79 0 152 -38 197 -103c19 5 39 7 59 7c134 0 240 -110 240 -243v-246c0 -36 -5 -73 -13 -108l-109 -436c-6 -24 -6 -47 -6 -71c0 -106 -86 -192 -192 -192h-640c-114 0 -192 91 -192 201l-308 296c-47 45 -76 109 -76 175v224
+c0 132 108 240 240 240c6 0 11 0 16 -1c8 127 114 225 240 225c34 0 67 -7 98 -21c47 45 109 69 174 69z" />
+    <glyph glyph-name="window-close" unicode="&#xf2d3;" horiz-adv-x="1792" 
+d="M1175 215l146 146c13 13 13 33 0 46l-233 233l233 233c13 13 13 33 0 46l-146 146c-13 13 -33 13 -46 0l-233 -233l-233 233c-13 13 -33 13 -46 0l-146 -146c-13 -13 -13 -33 0 -46l233 -233l-233 -233c-13 -13 -13 -33 0 -46l146 -146c13 -13 33 -13 46 0l233 233
+l233 -233c13 -13 33 -13 46 0zM1792 1248v-1216c0 -88 -72 -160 -160 -160h-1472c-88 0 -160 72 -160 160v1216c0 88 72 160 160 160h1472c88 0 160 -72 160 -160z" />
+    <glyph glyph-name="link" unicode="&#xf0c1;" horiz-adv-x="1632" 
+d="M1440 320c0 26 -10 50 -28 68l-208 208c-18 18 -43 28 -68 28c-29 0 -52 -11 -72 -32c33 -33 72 -61 72 -112c0 -53 -43 -96 -96 -96c-51 0 -79 39 -112 72c-21 -20 -33 -43 -33 -73c0 -25 10 -50 28 -68l206 -207c18 -18 43 -27 68 -27s50 9 68 26l147 146
+c18 18 28 42 28 67zM737 1025c0 25 -10 50 -28 68l-206 207c-18 18 -43 28 -68 28s-50 -10 -68 -27l-147 -146c-18 -18 -28 -42 -28 -67c0 -26 10 -50 28 -68l208 -208c18 -18 43 -27 68 -27c29 0 52 10 72 31c-33 33 -72 61 -72 112c0 53 43 96 96 96c51 0 79 -39 112 -72
+c21 20 33 43 33 73zM1632 320c0 -76 -31 -150 -85 -203l-147 -146c-54 -54 -127 -83 -203 -83c-77 0 -150 30 -204 85l-206 207c-54 54 -83 127 -83 203c0 79 32 154 88 209l-88 88c-55 -56 -129 -88 -208 -88c-76 0 -150 30 -204 84l-208 208c-55 55 -84 127 -84 204
+c0 76 31 150 85 203l147 146c54 54 127 83 203 83c77 0 150 -30 204 -85l206 -207c54 -54 83 -127 83 -203c0 -79 -32 -154 -88 -209l88 -88c55 56 129 88 208 88c76 0 150 -30 204 -84l208 -208c55 -55 84 -127 84 -204z" />
+    <glyph glyph-name="window-minimize" unicode="&#xf2d1;" horiz-adv-x="1792" 
+d="M1792 224v-192c0 -88 -72 -160 -160 -160h-1472c-88 0 -160 72 -160 160v192c0 88 72 160 160 160h1472c88 0 160 -72 160 -160z" />
+    <glyph glyph-name="eyedropper" unicode="&#xf1fb;" horiz-adv-x="1792" 
+d="M1698 1442c125 -125 126 -328 0 -452l-225 -223l104 -104c13 -13 13 -33 0 -46l-210 -210c-13 -13 -33 -13 -46 0l-105 105l-603 -603c-24 -24 -56 -37 -90 -37h-203l-256 -128l-64 64l128 256v203c0 34 13 66 37 90l603 603l-105 105c-13 13 -13 33 0 46l210 210
+c13 13 33 13 46 0l104 -104l223 225c124 126 327 125 452 0zM512 64l576 576l-192 192l-576 -576v-192h192z" />
+    <glyph glyph-name="bug" unicode="&#xf188;" horiz-adv-x="1600" 
+d="M1600 576c0 -35 -29 -64 -64 -64h-224c0 -125 -27 -219 -67 -290l208 -209c25 -25 25 -65 0 -90c-12 -13 -29 -19 -45 -19s-33 6 -45 19l-198 197s-131 -120 -301 -120v896h-128v-896c-181 0 -313 132 -313 132l-183 -207c-13 -14 -30 -21 -48 -21c-15 0 -30 5 -43 16
+c-26 24 -28 64 -5 91l202 227c-35 69 -58 158 -58 274h-224c-35 0 -64 29 -64 64s29 64 64 64h224v294l-173 173c-25 25 -25 65 0 90s65 25 90 0l173 -173h844l173 173c25 25 65 25 90 0s25 -65 0 -90l-173 -173v-294h224c35 0 64 -29 64 -64zM1120 1152h-640
+c0 177 143 320 320 320s320 -143 320 -320z" />
+    <glyph glyph-name="angellist" unicode="&#xf209;" horiz-adv-x="1258" 
+d="M942 1158l-114 -328l117 -21c30 82 165 451 165 518c0 25 -8 56 -38 56c-56 0 -116 -182 -130 -225zM643 471c11 -29 23 -58 33 -88c22 25 45 48 71 67c-35 7 -70 10 -104 21zM351 1367c0 -102 121 -420 159 -521c14 8 32 10 49 10c24 0 51 -3 75 -5l-121 351
+c-13 38 -71 220 -123 220c-27 0 -39 -32 -39 -55zM272 608c0 -73 196 -342 269 -342c20 0 37 22 37 40c0 23 -23 80 -32 102c-26 67 -121 274 -203 274c-27 0 -71 -47 -71 -74zM114 273c0 -36 12 -71 25 -104c79 -195 257 -309 465 -309c152 0 280 58 382 170
+c108 120 152 268 152 427c0 56 1 145 -43 185c-84 74 -369 102 -482 102c-14 0 -38 -1 -49 -11c-12 -5 -12 -24 -12 -35c0 -153 323 -139 420 -139c19 0 28 -5 40 -19c13 -16 17 -35 19 -55c-26 -26 -62 -41 -96 -54c-33 -12 -65 -25 -93 -46c-77 -56 -153 -152 -153 -251
+c0 -62 37 -115 37 -176c0 -1 -7 -23 -7 -26c-114 8 -142 121 -146 216c-12 -3 -28 -2 -41 -2c2 -7 2 -14 2 -21c0 -73 -65 -126 -135 -126c-108 0 -251 127 -251 237c0 30 13 47 33 67c20 -25 41 -50 60 -76c29 -39 79 -104 133 -104c14 0 41 12 41 29
+c0 45 -164 256 -204 256c-63 0 -97 -83 -97 -135zM0 264c0 130 50 216 179 251c-11 29 -28 73 -28 104c0 82 101 184 183 184c24 0 48 -7 70 -15c-42 119 -163 454 -163 567c0 101 51 181 160 181c140 0 299 -504 333 -604c44 110 182 571 338 571c98 0 153 -78 153 -171
+c0 -106 -118 -436 -159 -550c168 -41 192 -177 192 -328c0 -400 -255 -710 -668 -710c-76 0 -151 15 -223 42c-190 72 -367 267 -367 478z" />
+    <glyph glyph-name="chain-broken" unicode="&#xf127;" horiz-adv-x="1664" 
+d="M439 265l-256 -256c-7 -6 -15 -9 -23 -9s-16 3 -23 9c-12 13 -12 33 0 46l256 256c13 12 33 12 46 0c12 -13 12 -33 0 -46zM608 224v-320c0 -18 -14 -32 -32 -32s-32 14 -32 32v320c0 18 14 32 32 32s32 -14 32 -32zM384 448c0 -18 -14 -32 -32 -32h-320
+c-18 0 -32 14 -32 32s14 32 32 32h320c18 0 32 -14 32 -32zM1648 320c0 -77 -30 -149 -85 -203l-147 -146c-54 -54 -126 -83 -203 -83s-150 30 -204 85l-334 335c-17 17 -30 36 -42 56l239 18l273 -274c36 -36 100 -37 136 -1l147 146c18 18 28 42 28 67c0 26 -10 50 -28 68
+l-274 275l18 239c20 -12 39 -25 56 -42l336 -336c54 -55 84 -127 84 -204zM1031 1044l-239 -18l-273 274c-18 18 -42 28 -68 28s-50 -10 -68 -27l-147 -146c-18 -18 -28 -42 -28 -67c0 -26 10 -50 28 -68l274 -274l-18 -240c-20 12 -39 25 -56 42l-336 336
+c-54 55 -84 127 -84 204s30 149 85 203l147 146c54 54 126 83 203 83s150 -30 204 -85l334 -335c17 -17 30 -36 42 -56zM1664 960c0 -18 -14 -32 -32 -32h-320c-18 0 -32 14 -32 32s14 32 32 32h320c18 0 32 -14 32 -32zM1120 1504v-320c0 -18 -14 -32 -32 -32
+s-32 14 -32 32v320c0 18 14 32 32 32s32 -14 32 -32zM1527 1353l-256 -256c-7 -6 -15 -9 -23 -9s-16 3 -23 9c-12 13 -12 33 0 46l256 256c13 12 33 12 46 0c12 -13 12 -33 0 -46z" />
+    <glyph glyph-name="info" unicode="&#xf129;" horiz-adv-x="640" 
+d="M640 192v-128c0 -35 -29 -64 -64 -64h-512c-35 0 -64 29 -64 64v128c0 35 29 64 64 64h64v384h-64c-35 0 -64 29 -64 64v128c0 35 29 64 64 64h384c35 0 64 -29 64 -64v-576h64c35 0 64 -29 64 -64zM512 1344v-192c0 -35 -29 -64 -64 -64h-256c-35 0 -64 29 -64 64v192
+c0 35 29 64 64 64h256c35 0 64 -29 64 -64z" />
+    <glyph glyph-name="tumblr" unicode="&#xf173;" horiz-adv-x="956" 
+d="M876 207l80 -237c-30 -45 -166 -96 -288 -98c-363 -6 -500 258 -500 444v544h-168v215c252 91 313 319 327 449c1 8 8 12 12 12h244v-424h333v-252h-334v-518c0 -70 26 -167 160 -164c44 1 103 14 134 29z" />
+    <glyph glyph-name="line-chart" unicode="&#xf201;" horiz-adv-x="2048" 
+d="M2048 0v-128h-2048v1536h128v-1408h1920zM1920 1248v-435c0 -28 -34 -43 -55 -22l-121 121l-633 -633c-13 -13 -33 -13 -46 0l-233 233l-416 -416l-192 192l585 585c13 13 33 13 46 0l233 -233l464 464l-121 121c-21 21 -6 55 22 55h435c18 0 32 -14 32 -32z" />
+    <glyph glyph-name="long-arrow-up" unicode="&#xf176;" horiz-adv-x="767" 
+d="M765 1043c-5 -11 -16 -19 -29 -19h-224v-1248c0 -18 -14 -32 -32 -32h-192c-18 0 -32 14 -32 32v1248h-224c-13 0 -24 7 -29 19s-3 25 5 35l350 384c6 6 14 10 23 10s18 -4 24 -10l355 -384c8 -10 10 -23 5 -35z" />
+    <glyph glyph-name="simplybuilt" unicode="&#xf215;" horiz-adv-x="2048" 
+d="M863 504c0 150 -121 271 -271 271c-149 0 -270 -121 -270 -271c0 -149 121 -270 270 -270c150 0 271 121 271 270zM1726 505c0 149 -121 270 -270 270c-150 0 -271 -121 -271 -270c0 -150 121 -271 271 -271c149 0 270 121 270 271zM2048 1314v-1348
+c0 -59 -48 -107 -108 -107h-1832c-60 0 -108 48 -108 107v1348c0 59 48 107 108 107h431c59 0 108 -48 108 -107v-161h754v161c0 59 49 107 108 107h431c60 0 108 -48 108 -107z" />
+    <glyph glyph-name="trash" unicode="&#xf1f8;" horiz-adv-x="1408" 
+d="M512 160v704c0 18 -14 32 -32 32h-64c-18 0 -32 -14 -32 -32v-704c0 -18 14 -32 32 -32h64c18 0 32 14 32 32zM768 160v704c0 18 -14 32 -32 32h-64c-18 0 -32 -14 -32 -32v-704c0 -18 14 -32 32 -32h64c18 0 32 14 32 32zM1024 160v704c0 18 -14 32 -32 32h-64
+c-18 0 -32 -14 -32 -32v-704c0 -18 14 -32 32 -32h64c18 0 32 14 32 32zM480 1152h448l-48 117c-3 4 -12 10 -17 11h-317c-6 -1 -14 -7 -17 -11zM1408 1120v-64c0 -18 -14 -32 -32 -32h-96v-948c0 -110 -72 -204 -160 -204h-832c-88 0 -160 90 -160 200v952h-96
+c-18 0 -32 14 -32 32v64c0 18 14 32 32 32h309l70 167c20 49 80 89 133 89h320c53 0 113 -40 133 -89l70 -167h309c18 0 32 -14 32 -32z" />
+    <glyph glyph-name="free-code-camp" unicode="&#xf2c5;" horiz-adv-x="2304" 
+d="M453 -101c0 -28 -25 -54 -53 -54c-4 0 -9 2 -13 3c-56 13 -128 97 -162 140c-156 197 -225 427 -225 676c0 232 70 431 213 614c33 43 131 156 189 156c25 0 51 -20 51 -46c0 -30 -44 -71 -63 -90c-55 -57 -106 -115 -147 -184c-85 -142 -119 -284 -119 -449
+c0 -177 33 -337 123 -491c38 -65 83 -119 136 -173c21 -23 70 -68 70 -102zM1796 33c0 -37 -25 -68 -64 -68h-1081c-35 0 -64 29 -64 64c0 37 25 68 64 68h1081c35 0 64 -29 64 -64zM1581 644c0 -84 -19 -162 -67 -233c-33 -49 -100 -112 -153 -139c-8 -5 -18 -10 -27 -10
+c-8 0 -23 9 -23 18c0 29 122 98 122 232c0 44 -11 93 -35 130c-7 10 -32 42 -46 42c-3 0 -3 -2 -3 -5c0 -24 15 -47 15 -72c0 -32 -39 -48 -66 -48c-47 0 -66 33 -66 76c0 29 3 59 3 88c0 21 -1 27 -10 46c-14 27 -60 82 -93 82c-9 0 -12 0 -12 -9c0 -14 32 -29 32 -80
+c0 -133 -183 -157 -183 -290c0 -60 8 -110 42 -160c21 -31 44 -49 79 -63c9 -3 18 -4 18 -15s-9 -16 -18 -16c-5 0 -28 9 -33 11c-154 56 -271 190 -271 358c0 199 239 373 239 564c0 37 -6 63 -25 94c-11 18 -38 53 -56 64c-8 4 -19 11 -19 21c0 17 29 20 41 20
+c36 0 77 -13 110 -29c139 -66 168 -167 192 -307c6 -33 18 -138 66 -138c31 0 51 21 51 51c0 45 -40 94 -40 119c0 7 4 10 10 10c25 0 77 -53 93 -70c97 -103 133 -203 133 -342zM2304 615c0 -176 -47 -352 -138 -503c-42 -70 -180 -266 -271 -266c-21 0 -46 26 -46 47
+c0 34 117 143 146 180c124 156 183 332 183 531c0 164 -20 297 -93 446c-45 92 -92 154 -163 228c-23 24 -73 69 -73 105c0 25 26 52 51 52c66 0 161 -122 196 -169c134 -180 191 -365 206 -587c1 -21 2 -43 2 -64z" />
+    <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="calendar-o" unicode="&#xf133;" horiz-adv-x="1664" 
+d="M128 -128h1408v1024h-1408v-1024zM512 1088v288c0 18 -14 32 -32 32h-64c-18 0 -32 -14 -32 -32v-288c0 -18 14 -32 32 -32h64c18 0 32 14 32 32zM1280 1088v288c0 18 -14 32 -32 32h-64c-18 0 -32 -14 -32 -32v-288c0 -18 14 -32 32 -32h64c18 0 32 14 32 32zM1664 1152
+v-1280c0 -70 -58 -128 -128 -128h-1408c-70 0 -128 58 -128 128v1280c0 70 58 128 128 128h128v96c0 88 72 160 160 160h64c88 0 160 -72 160 -160v-96h384v96c0 88 72 160 160 160h64c88 0 160 -72 160 -160v-96h128c70 0 128 -58 128 -128z" />
+    <glyph glyph-name="suitcase" unicode="&#xf0f2;" horiz-adv-x="1792" 
+d="M640 1152h512v128h-512v-128zM288 1152v-1280h-64c-123 0 -224 101 -224 224v832c0 123 101 224 224 224h64zM1408 1152v-1280h-1024v1280h128v160c0 53 43 96 96 96h576c53 0 96 -43 96 -96v-160h128zM1792 928v-832c0 -123 -101 -224 -224 -224h-64v1280h64
+c123 0 224 -101 224 -224z" />
+    <glyph glyph-name="arrow-circle-o-up" unicode="&#xf01b;" 
+d="M1118 660c-5 -12 -17 -20 -30 -20h-192v-352c0 -18 -14 -32 -32 -32h-192c-18 0 -32 14 -32 32v352h-192c-18 0 -32 14 -32 32c0 9 4 17 10 24l319 319c7 6 15 9 23 9s16 -3 23 -9l320 -320c9 -10 12 -23 7 -35zM768 1184c-300 0 -544 -244 -544 -544s244 -544 544 -544
+s544 244 544 544s-244 544 -544 544zM1536 640c0 -424 -344 -768 -768 -768s-768 344 -768 768s344 768 768 768s768 -344 768 -768z" />
+    <glyph glyph-name="arrow-up" unicode="&#xf062;" horiz-adv-x="1558" 
+d="M1558 565c0 -34 -14 -66 -37 -90l-75 -75c-24 -24 -57 -38 -91 -38s-67 14 -90 38l-294 293v-704c0 -72 -60 -117 -128 -117h-128c-68 0 -128 45 -128 117v704l-294 -293c-23 -24 -56 -38 -90 -38s-67 14 -90 38l-75 75c-24 24 -38 56 -38 90s14 67 38 91l651 651
+c23 24 56 37 90 37s67 -13 91 -37l651 -651c23 -24 37 -57 37 -91z" />
+    <glyph glyph-name="venus-mars" unicode="&#xf228;" horiz-adv-x="2048" 
+d="M1664 1504c0 18 14 32 32 32h288c35 0 64 -29 64 -64v-288c0 -18 -14 -32 -32 -32h-64c-18 0 -32 14 -32 32v134l-254 -255c98 -123 147 -286 117 -461c-42 -240 -237 -431 -478 -467c-152 -23 -295 14 -409 90c-75 -50 -162 -83 -256 -93v-132h96c18 0 32 -14 32 -32
+v-64c0 -18 -14 -32 -32 -32h-96v-96c0 -18 -14 -32 -32 -32h-64c-18 0 -32 14 -32 32v96h-96c-18 0 -32 14 -32 32v64c0 18 14 32 32 32h96v132c-314 35 -553 323 -506 654c34 249 232 449 480 487c153 23 296 -14 410 -90c92 61 202 97 320 97c136 0 261 -48 359 -126
+l255 254h-134c-18 0 -32 14 -32 32v64zM896 391c79 81 128 191 128 313s-49 232 -128 313c-79 -81 -128 -191 -128 -313s49 -232 128 -313zM128 704c0 -247 201 -448 448 -448c79 0 154 21 218 57c-95 103 -154 240 -154 391s59 288 154 391c-64 36 -139 57 -218 57
+c-247 0 -448 -201 -448 -448zM1216 256c247 0 448 201 448 448s-201 448 -448 448c-79 0 -154 -21 -218 -57c95 -103 154 -240 154 -391s-59 -288 -154 -391c64 -36 139 -57 218 -57z" />
+    <glyph glyph-name="pause-circle" unicode="&#xf28b;" 
+d="M704 352v576c0 18 -14 32 -32 32h-256c-18 0 -32 -14 -32 -32v-576c0 -18 14 -32 32 -32h256c18 0 32 14 32 32zM1152 352v576c0 18 -14 32 -32 32h-256c-18 0 -32 -14 -32 -32v-576c0 -18 14 -32 32 -32h256c18 0 32 14 32 32zM1536 640c0 -424 -344 -768 -768 -768
+s-768 344 -768 768s344 768 768 768s768 -344 768 -768z" />
+    <glyph glyph-name="shopping-cart" unicode="&#xf07a;" horiz-adv-x="1664" 
+d="M640 0c0 -70 -58 -128 -128 -128s-128 58 -128 128s58 128 128 128s128 -58 128 -128zM1536 0c0 -70 -58 -128 -128 -128s-128 58 -128 128s58 128 128 128s128 -58 128 -128zM1664 1088v-512c0 -32 -25 -60 -57 -64l-1044 -122c5 -23 13 -46 13 -70
+c0 -23 -14 -44 -24 -64h920c35 0 64 -29 64 -64s-29 -64 -64 -64h-1024c-35 0 -64 29 -64 64c0 31 45 106 61 137l-177 823h-204c-35 0 -64 29 -64 64s29 64 64 64h256c67 0 69 -80 79 -128h1201c35 0 64 -29 64 -64z" />
+    <glyph glyph-name="files-o" unicode="&#xf0c5;" horiz-adv-x="1792" 
+d="M1696 1152c53 0 96 -43 96 -96v-1216c0 -53 -43 -96 -96 -96h-960c-53 0 -96 43 -96 96v288h-544c-53 0 -96 43 -96 96v672c0 53 31 127 68 164l408 408c37 37 111 68 164 68h416c53 0 96 -43 96 -96v-328c39 23 89 40 128 40h416zM1152 939l-299 -299h299v299zM512 1323
+l-299 -299h299v299zM708 676l316 316v416h-384v-416c0 -53 -43 -96 -96 -96h-416v-640h512v256c0 53 31 127 68 164zM1664 -128v1152h-384v-416c0 -53 -43 -96 -96 -96h-416v-640h896z" />
+    <glyph glyph-name="mastodon-square" unicode="&#xf300;" 
+d="M288 1408h960c159 0 288 -129 288 -288v-960c0 -159 -129 -288 -288 -288h-960c-159 0 -288 129 -288 288v960c0 159 129 288 288 288zM766 1189v0c-140 -1 -275 -17 -354 -53c0 0 -156 -70 -156 -308c0 -55 -1 -119 1 -188c6 -233 43 -463 258 -520
+c99 -26 184 -32 253 -28c124 7 195 45 195 45l-5 90s-88 -28 -188 -25c-99 3 -204 11 -220 133c-1 11 -2 22 -2 34c0 0 97 -24 220 -30c75 -3 146 4 218 13c138 16 257 102 272 179c24 122 22 297 22 297c0 238 -156 308 -156 308c-79 36 -214 52 -354 53h-4zM608 1003v0
+c58 0 103 -23 132 -68l28 -47l28 47c29 45 74 68 132 68c51 0 92 -18 123 -53c31 -34 45 -81 45 -140v-288h-114v280c0 59 -25 88 -75 88c-55 0 -82 -35 -82 -105v-153h-114v153c0 70 -27 105 -82 105c-50 0 -75 -29 -75 -88v-280h-114v288c0 59 15 105 45 140
+c31 35 72 53 123 53z" />
+    <glyph glyph-name="th-large" unicode="&#xf009;" horiz-adv-x="1664" 
+d="M768 512v-384c0 -70 -58 -128 -128 -128h-512c-70 0 -128 58 -128 128v384c0 70 58 128 128 128h512c70 0 128 -58 128 -128zM768 1280v-384c0 -70 -58 -128 -128 -128h-512c-70 0 -128 58 -128 128v384c0 70 58 128 128 128h512c70 0 128 -58 128 -128zM1664 512v-384
+c0 -70 -58 -128 -128 -128h-512c-70 0 -128 58 -128 128v384c0 70 58 128 128 128h512c70 0 128 -58 128 -128zM1664 1280v-384c0 -70 -58 -128 -128 -128h-512c-70 0 -128 58 -128 128v384c0 70 58 128 128 128h512c70 0 128 -58 128 -128z" />
+    <glyph glyph-name="at" unicode="&#xf1fa;" 
+d="M972 761c0 144 -75 230 -201 230c-166 0 -344 -165 -344 -432c0 -149 74 -234 204 -234c201 0 341 230 341 436zM1536 640c0 -311 -222 -428 -412 -434c-13 0 -18 -1 -32 -1c-62 0 -111 18 -142 53c-19 22 -30 50 -33 83c-62 -78 -170 -154 -305 -154
+c-215 0 -338 133 -338 365c0 319 221 578 491 578c117 0 211 -50 261 -135l2 19l11 56c1 8 8 18 15 18h118c5 0 10 -7 13 -11c3 -3 4 -11 3 -16l-120 -614c-4 -19 -5 -34 -5 -48c0 -54 16 -65 57 -65c68 2 288 30 288 306c0 389 -251 640 -640 640
+c-353 0 -640 -287 -640 -640s287 -640 640 -640c147 0 291 51 405 144c14 12 34 10 45 -4l41 -49c5 -7 8 -15 7 -24c-1 -8 -5 -16 -12 -22c-136 -111 -309 -173 -486 -173c-423 0 -768 345 -768 768s345 768 768 768c459 0 768 -309 768 -768z" />
+    <glyph glyph-name="file" unicode="&#xf15b;" 
+d="M1024 1024v472c14 -9 26 -18 36 -28l408 -408c10 -10 19 -22 28 -36h-472zM896 992c0 -53 43 -96 96 -96h544v-1056c0 -53 -43 -96 -96 -96h-1344c-53 0 -96 43 -96 96v1600c0 53 43 96 96 96h800v-544z" />
+    <glyph glyph-name="star-half" unicode="&#xf089;" horiz-adv-x="832" 
+d="M832 1504v-1339l-449 -236c-13 -7 -26 -12 -40 -12c-29 0 -42 24 -42 50c0 7 1 13 2 20l86 500l-364 354c-12 13 -25 30 -25 48c0 30 31 42 56 46l502 73l225 455c9 19 26 41 49 41z" />
+    <glyph glyph-name="futbol-o" unicode="&#xf1e3;" horiz-adv-x="1792" 
+d="M609 720l287 208l287 -208l-109 -336h-355zM896 1536c495 0 896 -401 896 -896s-401 -896 -896 -896s-896 401 -896 896s401 896 896 896zM1515 186c94 128 149 284 149 454v3l-102 -89l-240 224l63 323l134 -12c-95 131 -231 232 -389 282l53 -124l-287 -159l-287 159
+l53 124c-158 -50 -294 -151 -389 -282l135 12l62 -323l-240 -224l-102 89v-3c0 -170 55 -326 149 -454l30 132l326 -40l139 -298l-116 -69c75 -25 156 -39 240 -39s165 14 240 39l-116 69l139 298l326 40z" />
+    <glyph glyph-name="flag-checkered" unicode="&#xf11e;" horiz-adv-x="1728" 
+d="M768 536v192c-122 -11 -269 -60 -384 -117v-185c116 54 260 100 384 110zM768 954v197c-126 -6 -274 -65 -384 -126v-189c118 61 260 113 384 118zM1600 491v184c-91 -45 -250 -112 -384 -71v224c-13 4 -26 9 -39 15c-115 58 -209 112 -360 112c-16 0 -32 -1 -49 -3v-222
+h19c151 0 275 -54 390 -111c13 -6 26 -11 39 -15v-188c27 -11 57 -17 91 -17c111 0 231 59 293 92zM1600 918v189c-80 -43 -192 -91 -306 -91c-27 0 -53 2 -78 8v-196c134 -38 293 39 384 90zM256 1280c0 -47 -26 -88 -64 -110v-1266c0 -18 -14 -32 -32 -32h-64
+c-18 0 -32 14 -32 32v1266c-38 22 -64 63 -64 110c0 71 57 128 128 128s128 -57 128 -128zM1728 1216v-763c0 -24 -14 -46 -35 -57c-4 -2 -10 -5 -17 -9c-64 -34 -215 -116 -369 -116c-59 0 -112 12 -158 35l-28 14c-101 51 -181 91 -304 91c-144 0 -347 -75 -464 -146
+c-10 -6 -22 -9 -33 -9s-22 3 -32 8c-20 12 -32 33 -32 56v742c0 22 12 43 31 55c64 38 290 163 500 163c167 0 303 -61 418 -117c26 -13 56 -19 89 -19c118 0 248 75 310 112c13 7 24 13 31 17c20 10 43 9 62 -2c19 -12 31 -33 31 -55z" />
+    <glyph glyph-name="genderless" unicode="&#xf22d;" horiz-adv-x="1152" 
+d="M1024 576c0 247 -201 448 -448 448s-448 -201 -448 -448s201 -448 448 -448s448 201 448 448zM1152 576c0 -318 -258 -576 -576 -576s-576 258 -576 576s258 576 576 576s576 -258 576 -576z" />
+    <glyph glyph-name="archive" unicode="&#xf187;" horiz-adv-x="1664" 
+d="M1024 704c0 35 -29 64 -64 64h-256c-35 0 -64 -29 -64 -64s29 -64 64 -64h256c35 0 64 29 64 64zM1600 896v-960c0 -35 -29 -64 -64 -64h-1408c-35 0 -64 29 -64 64v960c0 35 29 64 64 64h1408c35 0 64 -29 64 -64zM1664 1344v-256c0 -35 -29 -64 -64 -64h-1536
+c-35 0 -64 29 -64 64v256c0 35 29 64 64 64h1536c35 0 64 -29 64 -64z" />
+    <glyph glyph-name="film" unicode="&#xf008;" horiz-adv-x="1920" 
+d="M384 -64v128c0 35 -29 64 -64 64h-128c-35 0 -64 -29 -64 -64v-128c0 -35 29 -64 64 -64h128c35 0 64 29 64 64zM384 320v128c0 35 -29 64 -64 64h-128c-35 0 -64 -29 -64 -64v-128c0 -35 29 -64 64 -64h128c35 0 64 29 64 64zM384 704v128c0 35 -29 64 -64 64h-128
+c-35 0 -64 -29 -64 -64v-128c0 -35 29 -64 64 -64h128c35 0 64 29 64 64zM1408 -64v512c0 35 -29 64 -64 64h-768c-35 0 -64 -29 -64 -64v-512c0 -35 29 -64 64 -64h768c35 0 64 29 64 64zM384 1088v128c0 35 -29 64 -64 64h-128c-35 0 -64 -29 -64 -64v-128
+c0 -35 29 -64 64 -64h128c35 0 64 29 64 64zM1792 -64v128c0 35 -29 64 -64 64h-128c-35 0 -64 -29 -64 -64v-128c0 -35 29 -64 64 -64h128c35 0 64 29 64 64zM1408 704v512c0 35 -29 64 -64 64h-768c-35 0 -64 -29 -64 -64v-512c0 -35 29 -64 64 -64h768c35 0 64 29 64 64z
+M1792 320v128c0 35 -29 64 -64 64h-128c-35 0 -64 -29 -64 -64v-128c0 -35 29 -64 64 -64h128c35 0 64 29 64 64zM1792 704v128c0 35 -29 64 -64 64h-128c-35 0 -64 -29 -64 -64v-128c0 -35 29 -64 64 -64h128c35 0 64 29 64 64zM1792 1088v128c0 35 -29 64 -64 64h-128
+c-35 0 -64 -29 -64 -64v-128c0 -35 29 -64 64 -64h128c35 0 64 29 64 64zM1920 1248v-1344c0 -88 -72 -160 -160 -160h-1600c-88 0 -160 72 -160 160v1344c0 88 72 160 160 160h1600c88 0 160 -72 160 -160z" />
+    <glyph glyph-name="power-off" unicode="&#xf011;" 
+d="M1536 640c0 -423 -345 -768 -768 -768s-768 345 -768 768c0 243 112 467 307 613c57 43 137 32 179 -25c43 -56 31 -137 -25 -179c-130 -98 -205 -247 -205 -409c0 -282 230 -512 512 -512s512 230 512 512c0 162 -75 311 -205 409c-56 42 -68 123 -25 179
+c42 57 123 68 179 25c195 -146 307 -370 307 -613zM896 1408v-640c0 -70 -58 -128 -128 -128s-128 58 -128 128v640c0 70 58 128 128 128s128 -58 128 -128z" />
+    <glyph glyph-name="percent" unicode="&#xf295;" 
+d="M1280 256c0 70 -58 128 -128 128s-128 -58 -128 -128s58 -128 128 -128s128 58 128 128zM512 1024c0 70 -58 128 -128 128s-128 -58 -128 -128s58 -128 128 -128s128 58 128 128zM1536 256c0 -212 -172 -384 -384 -384s-384 172 -384 384s172 384 384 384
+s384 -172 384 -384zM1440 1344c0 -14 -5 -27 -13 -38l-1056 -1408c-12 -16 -31 -26 -51 -26h-160c-35 0 -64 29 -64 64c0 14 5 27 13 38l1056 1408c12 16 31 26 51 26h160c35 0 64 -29 64 -64zM768 1024c0 -212 -172 -384 -384 -384s-384 172 -384 384s172 384 384 384
+s384 -172 384 -384z" />
+    <glyph glyph-name="google-wallet" unicode="&#xf1ee;" horiz-adv-x="1756" 
+d="M405 864c20 0 40 -10 52 -26c175 -239 297 -495 362 -774h-446c-80 278 -198 532 -367 749c-16 21 0 51 26 51h373zM964 507c-33 -135 -75 -266 -125 -393c-53 209 -138 405 -256 594c26 145 41 294 44 449c141 -227 253 -443 337 -650zM1063 1216
+c299 -412 521 -920 569 -1472h-451c-33 534 -279 1040 -553 1472h435zM1756 640c0 -278 -38 -570 -101 -812c-44 370 -166 738 -359 1083c-17 202 -53 398 -106 584c-5 21 10 41 31 41h359c28 0 54 -19 61 -46c76 -270 115 -556 115 -850z" />
+    <glyph glyph-name="book" unicode="&#xf02d;" horiz-adv-x="1664" 
+d="M1639 1058c25 -36 32 -83 18 -129l-275 -906c-25 -85 -113 -151 -199 -151h-923c-102 0 -211 81 -248 185c-16 45 -16 89 -2 127c2 20 6 40 7 64c1 16 -8 29 -6 41c4 24 25 41 41 68c30 50 64 131 75 183c5 19 -5 41 0 58c5 19 24 33 34 51c27 46 62 135 67 182
+c2 21 -8 44 -2 60c7 23 29 33 44 53c24 33 64 128 70 181c2 17 -8 34 -5 52c4 19 28 39 44 62c42 62 50 199 177 163l-1 -3c17 4 34 9 51 9h761c47 0 89 -21 114 -56c26 -36 32 -83 18 -130l-274 -906c-47 -154 -73 -188 -200 -188h-869c-13 0 -29 -3 -38 -15
+c-8 -12 -9 -21 -1 -43c20 -58 89 -70 144 -70h923c37 0 80 21 91 57l300 987c6 19 6 39 5 57c23 -9 44 -23 59 -43zM575 1056c-6 -18 4 -32 22 -32h608c17 0 36 14 42 32l21 64c6 18 -4 32 -22 32h-608c-17 0 -36 -14 -42 -32zM492 800c-6 -18 4 -32 22 -32h608
+c17 0 36 14 42 32l21 64c6 18 -4 32 -22 32h-608c-17 0 -36 -14 -42 -32z" />
+    <glyph glyph-name="thermometer-three-quarters" unicode="&#xf2c8;" horiz-adv-x="1024" 
+d="M640 192c0 -106 -86 -192 -192 -192s-192 86 -192 192c0 80 50 153 128 181v651h128v-651c78 -28 128 -101 128 -181zM768 192c0 105 -50 197 -128 256v768c0 106 -86 192 -192 192s-192 -86 -192 -192v-768c-78 -59 -128 -151 -128 -256c0 -177 143 -320 320 -320
+s320 143 320 320zM896 192c0 -247 -201 -448 -448 -448s-448 201 -448 448c0 122 49 232 128 313v711c0 177 143 320 320 320s320 -143 320 -320v-711c79 -81 128 -191 128 -313zM1024 768v-128h-192v128h192zM1024 1024v-128h-192v128h192zM1024 1280v-128h-192v128h192z
+" />
+    <glyph glyph-name="transgender" unicode="&#xf224;" horiz-adv-x="1408" 
+d="M1024 1504c0 18 14 32 32 32h288c35 0 64 -29 64 -64v-288c0 -18 -14 -32 -32 -32h-64c-18 0 -32 14 -32 32v134l-254 -255c78 -98 126 -223 126 -359c0 -296 -224 -540 -512 -572v-132h96c18 0 32 -14 32 -32v-64c0 -18 -14 -32 -32 -32h-96v-96c0 -18 -14 -32 -32 -32
+h-64c-18 0 -32 14 -32 32v96h-96c-18 0 -32 14 -32 32v64c0 18 14 32 32 32h96v132c-302 33 -535 302 -510 618c21 272 237 495 507 526c162 19 312 -31 426 -122l255 254h-134c-18 0 -32 14 -32 32v64zM576 256c247 0 448 201 448 448s-201 448 -448 448
+s-448 -201 -448 -448s201 -448 448 -448z" />
+    <glyph glyph-name="cloud-upload" unicode="&#xf0ee;" horiz-adv-x="1920" 
+d="M1280 672c0 8 -3 17 -9 23l-352 352c-6 6 -14 9 -23 9c-8 0 -17 -3 -23 -9l-351 -351c-6 -7 -10 -15 -10 -24c0 -18 14 -32 32 -32h224v-352c0 -17 15 -32 32 -32h192c17 0 32 15 32 32v352h224c18 0 32 15 32 32zM1920 384c0 -212 -172 -384 -384 -384h-1088
+c-247 0 -448 201 -448 448c0 174 101 332 258 405c-1 15 -2 29 -2 43c0 283 229 512 512 512c208 0 395 -126 474 -318c46 40 105 62 166 62c141 0 256 -115 256 -256c0 -49 -14 -97 -41 -138c174 -41 297 -196 297 -374z" />
+    <glyph glyph-name="bullseye" unicode="&#xf140;" 
+d="M1024 640c0 -141 -115 -256 -256 -256s-256 115 -256 256s115 256 256 256s256 -115 256 -256zM1152 640c0 212 -172 384 -384 384s-384 -172 -384 -384s172 -384 384 -384s384 172 384 384zM1280 640c0 -283 -229 -512 -512 -512s-512 229 -512 512s229 512 512 512
+s512 -229 512 -512zM1408 640c0 353 -287 640 -640 640s-640 -287 -640 -640s287 -640 640 -640s640 287 640 640zM1536 640c0 -424 -344 -768 -768 -768s-768 344 -768 768s344 768 768 768s768 -344 768 -768z" />
+    <glyph glyph-name="openid" unicode="&#xf19b;" horiz-adv-x="1792" 
+d="M1086 1536v-1536l-272 -128c-460 41 -814 286 -814 583c0 286 330 524 767 577v-172c-286 -50 -496 -212 -496 -405c0 -204 234 -373 543 -412v1360zM1755 954l37 -390l-525 114l147 83c-78 46 -174 80 -280 99v172c185 -22 351 -78 481 -157z" />
+    <glyph glyph-name="repeat" unicode="&#xf01e;" 
+d="M1536 1280v-448c0 -35 -29 -64 -64 -64h-448c-26 0 -49 16 -59 40c-10 23 -5 51 14 69l138 138c-94 87 -218 137 -349 137c-282 0 -512 -230 -512 -512s230 -512 512 -512c159 0 306 72 404 199c5 7 14 11 23 12c9 0 18 -3 25 -9l137 -138c12 -11 12 -30 2 -43
+c-146 -176 -362 -277 -591 -277c-423 0 -768 345 -768 768s345 768 768 768c197 0 388 -79 529 -212l130 129c18 19 46 24 70 14c23 -10 39 -33 39 -59z" />
+    <glyph glyph-name="star" unicode="&#xf005;" horiz-adv-x="1664" 
+d="M1664 889c0 -18 -13 -35 -26 -48l-363 -354l86 -500c1 -7 1 -13 1 -20c0 -26 -12 -50 -41 -50c-14 0 -28 5 -40 12l-449 236l-449 -236c-13 -7 -26 -12 -40 -12c-29 0 -42 24 -42 50c0 7 1 13 2 20l86 500l-364 354c-12 13 -25 30 -25 48c0 30 31 42 56 46l502 73
+l225 455c9 19 26 41 49 41s40 -22 49 -41l225 -455l502 -73c24 -4 56 -16 56 -46z" />
+    <glyph glyph-name="users" unicode="&#xf0c0;" horiz-adv-x="1920" 
+d="M593 640c-104 -3 -198 -48 -265 -128h-134c-100 0 -194 48 -194 159c0 81 -3 353 124 353c21 0 125 -85 260 -85c46 0 90 8 133 23c-3 -22 -5 -44 -5 -66c0 -91 29 -181 81 -256zM1664 3c0 -162 -107 -259 -267 -259h-874c-160 0 -267 97 -267 259c0 226 53 573 346 573
+c34 0 158 -139 358 -139s324 139 358 139c293 0 346 -347 346 -573zM640 1280c0 -141 -115 -256 -256 -256s-256 115 -256 256s115 256 256 256s256 -115 256 -256zM1344 896c0 -212 -172 -384 -384 -384s-384 172 -384 384s172 384 384 384s384 -172 384 -384zM1920 671
+c0 -111 -94 -159 -194 -159h-134c-67 80 -161 125 -265 128c52 75 81 165 81 256c0 22 -2 44 -5 66c43 -15 87 -23 133 -23c135 0 239 85 260 85c127 0 124 -272 124 -353zM1792 1280c0 -141 -115 -256 -256 -256s-256 115 -256 256s115 256 256 256s256 -115 256 -256z" />
+    <glyph glyph-name="transgender-alt" unicode="&#xf225;" horiz-adv-x="1664" 
+d="M1280 1504c0 18 14 32 32 32h288c35 0 64 -29 64 -64v-288c0 -18 -14 -32 -32 -32h-64c-18 0 -32 14 -32 32v134l-254 -255c78 -98 126 -223 126 -359c0 -296 -224 -540 -512 -572v-132h96c18 0 32 -14 32 -32v-64c0 -18 -14 -32 -32 -32h-96v-96c0 -18 -14 -32 -32 -32
+h-64c-18 0 -32 14 -32 32v96h-96c-18 0 -32 14 -32 32v64c0 18 14 32 32 32h96v132c-288 32 -512 276 -512 572c0 136 48 261 126 359l-52 53l-101 -111c-12 -13 -32 -14 -45 -3l-48 44c-13 11 -14 32 -2 45l105 115l-111 112v-134c0 -18 -14 -32 -32 -32h-64
+c-18 0 -32 14 -32 32v288c0 35 29 64 64 64h288c18 0 32 -14 32 -32v-64c0 -18 -14 -32 -32 -32h-133l106 -107l86 94c12 13 32 14 45 3l48 -44c13 -11 14 -32 2 -45l-90 -99l57 -56c98 78 223 126 359 126s261 -48 359 -126l255 254h-134c-18 0 -32 14 -32 32v64zM832 256
+c247 0 448 201 448 448s-201 448 -448 448s-448 -201 -448 -448s201 -448 448 -448z" />
+    <glyph glyph-name="chevron-up" unicode="&#xf077;" horiz-adv-x="1612" 
+d="M1593 205l-166 -165c-25 -25 -65 -25 -90 0l-531 531l-531 -531c-25 -25 -65 -25 -90 0l-166 165c-25 25 -25 66 0 91l742 741c25 25 65 25 90 0l742 -741c25 -25 25 -66 0 -91z" />
+    <glyph glyph-name="asterisk" unicode="&#xf069;" horiz-adv-x="1428" 
+d="M1364 486c61 -35 82 -114 47 -175l-64 -110c-35 -61 -114 -82 -175 -47l-266 153v-307c0 -70 -58 -128 -128 -128h-128c-70 0 -128 58 -128 128v307l-266 -153c-61 -35 -140 -14 -175 47l-64 110c-35 61 -14 140 47 175l266 154l-266 154c-61 35 -82 114 -47 175l64 110
+c35 61 114 82 175 47l266 -153v307c0 70 58 128 128 128h128c70 0 128 -58 128 -128v-307l266 153c61 35 140 14 175 -47l64 -110c35 -61 14 -140 -47 -175l-266 -154z" />
+    <glyph glyph-name="plus-circle" unicode="&#xf055;" 
+d="M1216 576v128c0 35 -29 64 -64 64h-256v256c0 35 -29 64 -64 64h-128c-35 0 -64 -29 -64 -64v-256h-256c-35 0 -64 -29 -64 -64v-128c0 -35 29 -64 64 -64h256v-256c0 -35 29 -64 64 -64h128c35 0 64 29 64 64v256h256c35 0 64 29 64 64zM1536 640
+c0 -424 -344 -768 -768 -768s-768 344 -768 768s344 768 768 768s768 -344 768 -768z" />
+    <glyph glyph-name="cart-arrow-down" unicode="&#xf218;" horiz-adv-x="1664" 
+d="M1280 832c0 35 -29 64 -64 64c-17 0 -33 -7 -45 -19l-147 -146v293c0 35 -29 64 -64 64s-64 -29 -64 -64v-293l-147 146c-12 12 -28 19 -45 19c-35 0 -64 -29 -64 -64c0 -17 7 -33 19 -45l256 -256c12 -12 28 -19 45 -19s33 7 45 19l256 256c12 12 19 28 19 45zM640 0
+c0 -71 -57 -128 -128 -128s-128 57 -128 128s57 128 128 128s128 -57 128 -128zM1536 0c0 -71 -57 -128 -128 -128s-128 57 -128 128s57 128 128 128s128 -57 128 -128zM1664 1088v-512c0 -32 -24 -60 -57 -64l-1044 -122c4 -22 13 -47 13 -70s-14 -44 -24 -64h920
+c35 0 64 -29 64 -64s-29 -64 -64 -64h-1024c-35 0 -64 29 -64 64c0 31 47 108 61 137l-177 823h-204c-35 0 -64 29 -64 64s29 64 64 64h256c68 0 69 -80 79 -128h1201c35 0 64 -29 64 -64z" />
+    <glyph glyph-name="dropbox" unicode="&#xf16b;" horiz-adv-x="1664" 
+d="M338 829l494 -305l-342 -285l-490 319zM1324 274v-108l-490 -293v-1l-1 1l-1 -1v1l-489 293v108l147 -96l342 284v2l1 -1l1 1v-2l343 -284zM490 1418l342 -285l-494 -304l-338 270zM1326 829l338 -271l-489 -319l-343 285zM1175 1418l489 -319l-338 -270l-494 304z" />
+    <glyph glyph-name="debian" unicode="&#xf2ff;" horiz-adv-x="1440" 
+d="M1 954c3 22 -11 29 15 62c-4 -17 -6 -33 -15 -62zM61 1152c0 -18 30 18 8 -31c-40 -28 -3 -12 -8 31zM754 1527c20 7 49 4 70 9c-28 -2 -55 -3 -82 -7l12 -2zM1399 728c-8 -61 -27 -121 -56 -176c26 52 43 108 51 165zM582 550l10 -27c-12 21 -26 42 -33 66
+c7 -14 13 -28 23 -39zM536 548c25 -47 38 -61 56 -96c-25 21 -40 49 -60 76zM1274 762c2 -48 -15 -72 -29 -113l-25 -13c-21 -41 2 -26 -13 -58c-33 -29 -100 -91 -121 -97c-16 0 11 19 14 26c-44 -30 -36 -46 -103 -64l-2 4c-166 -78 -395 76 -392 287
+c-2 -13 -5 -10 -9 -15c-9 108 50 218 149 262c97 48 210 28 279 -37c-38 50 -113 103 -203 98c-88 -1 -171 -57 -198 -118c-45 -28 -49 -109 -69 -124c-26 -194 49 -277 178 -376c20 -14 5 -16 8 -26c-43 20 -82 50 -114 87c17 -25 35 -49 59 -68c-40 14 -93 98 -109 101
+c69 -124 282 -218 393 -172c-51 -2 -117 -1 -175 20c-24 12 -57 39 -51 44c152 -57 308 -43 439 62c33 26 70 70 81 71c-16 -24 2 -12 -10 -33c33 54 -14 22 35 93l18 -25c-7 45 55 99 49 169c14 22 16 -23 1 -73c21 55 5 65 10 110c6 -15 14 -32 18 -48
+c-14 53 14 89 21 120c-7 3 -22 -23 -25 40c0 27 8 14 11 21c-5 3 -19 24 -28 64c6 9 17 -25 25 -26c-5 32 -15 57 -15 81c-25 51 -9 -7 -29 22c-26 82 22 19 25 56c40 -58 63 -147 73 -184c-8 45 -21 89 -37 131c12 -5 -19 93 16 28c-38 138 -161 266 -274 327
+c14 -13 31 -29 25 -31c-56 34 -46 37 -54 51c-46 19 -49 -1 -79 0c-86 46 -103 40 -183 69l4 -17c-57 19 -67 -7 -129 0c-4 3 20 11 39 14c-55 -7 -53 11 -107 -2c13 9 28 15 42 23c-45 -3 -107 -26 -88 -5c-74 -33 -205 -78 -278 -147l-2 15c-34 -40 -147 -121 -156 -173
+l-9 -2c-17 -30 -29 -64 -43 -94c-23 -39 -33 -15 -30 -21c-45 -91 -68 -168 -87 -231c14 -21 1 -123 6 -206c-23 -408 286 -804 624 -896c50 -18 123 -17 186 -19c-74 21 -84 11 -156 36c-52 24 -63 53 -100 85l15 -26c-72 26 -42 31 -101 50l16 20c-23 2 -62 40 -73 61
+l-25 -1c-31 38 -47 65 -46 86l-8 -15c-9 16 -114 142 -60 113c-10 9 -23 15 -37 41l11 13c-26 33 -48 76 -46 90c14 -19 23 -22 32 -25c-65 162 -68 9 -118 165l10 1c-8 12 -13 25 -19 38l5 45c-47 54 -14 232 -7 329c5 39 40 81 66 147l-16 3c31 53 174 214 241 206
+c32 41 -6 1 -12 11c71 74 93 52 141 65c52 31 -45 -13 -20 11c89 23 63 52 180 64c12 -7 -28 -11 -38 -20c75 36 235 28 340 -20c122 -57 259 -225 264 -383l6 -2c-3 -63 10 -135 -12 -202l15 32zM779 1504l-11 -2l11 1v1zM748 1513c53 -2 48 -5 31 -9c3 4 -15 6 -31 9z
+M1079 782c-5 -22 -10 13 -16 16c5 20 20 37 16 -16zM1020 629c18 24 30 51 35 79c-4 -20 -15 -37 -25 -55c-56 -35 -5 21 0 42c-60 -75 -8 -45 -10 -66zM860 589c-30 0 6 -15 45 -21c8 7 21 18 29 25c-24 -6 -49 -6 -74 -4z" />
+    <glyph glyph-name="newspaper-o" 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-960c0 -35 29 -64 64 -64
+s64 29 64 64zM1920 192v1088h-1536v-1088c0 -22 -4 -44 -11 -64h1483c35 0 64 29 64 64zM2048 1408v-1216c0 -106 -86 -192 -192 -192h-1664c-106 0 -192 86 -192 192v1088h256v128h1792z" />
+    <glyph glyph-name="building" unicode="&#xf1ad;" horiz-adv-x="1408" 
+d="M1344 1536c35 0 64 -29 64 -64v-1664c0 -35 -29 -64 -64 -64h-1280c-35 0 -64 29 -64 64v1664c0 35 29 64 64 64h1280zM512 1248v-64c0 -18 14 -32 32 -32h64c18 0 32 14 32 32v64c0 18 -14 32 -32 32h-64c-18 0 -32 -14 -32 -32zM512 992v-64c0 -18 14 -32 32 -32h64
+c18 0 32 14 32 32v64c0 18 -14 32 -32 32h-64c-18 0 -32 -14 -32 -32zM512 736v-64c0 -18 14 -32 32 -32h64c18 0 32 14 32 32v64c0 18 -14 32 -32 32h-64c-18 0 -32 -14 -32 -32zM512 480v-64c0 -18 14 -32 32 -32h64c18 0 32 14 32 32v64c0 18 -14 32 -32 32h-64
+c-18 0 -32 -14 -32 -32zM384 160v64c0 18 -14 32 -32 32h-64c-18 0 -32 -14 -32 -32v-64c0 -18 14 -32 32 -32h64c18 0 32 14 32 32zM384 416v64c0 18 -14 32 -32 32h-64c-18 0 -32 -14 -32 -32v-64c0 -18 14 -32 32 -32h64c18 0 32 14 32 32zM384 672v64
+c0 18 -14 32 -32 32h-64c-18 0 -32 -14 -32 -32v-64c0 -18 14 -32 32 -32h64c18 0 32 14 32 32zM384 928v64c0 18 -14 32 -32 32h-64c-18 0 -32 -14 -32 -32v-64c0 -18 14 -32 32 -32h64c18 0 32 14 32 32zM384 1184v64c0 18 -14 32 -32 32h-64c-18 0 -32 -14 -32 -32v-64
+c0 -18 14 -32 32 -32h64c18 0 32 14 32 32zM896 -96v192c0 18 -14 32 -32 32h-320c-18 0 -32 -14 -32 -32v-192c0 -18 14 -32 32 -32h320c18 0 32 14 32 32zM896 416v64c0 18 -14 32 -32 32h-64c-18 0 -32 -14 -32 -32v-64c0 -18 14 -32 32 -32h64c18 0 32 14 32 32z
+M896 672v64c0 18 -14 32 -32 32h-64c-18 0 -32 -14 -32 -32v-64c0 -18 14 -32 32 -32h64c18 0 32 14 32 32zM896 928v64c0 18 -14 32 -32 32h-64c-18 0 -32 -14 -32 -32v-64c0 -18 14 -32 32 -32h64c18 0 32 14 32 32zM896 1184v64c0 18 -14 32 -32 32h-64
+c-18 0 -32 -14 -32 -32v-64c0 -18 14 -32 32 -32h64c18 0 32 14 32 32zM1152 160v64c0 18 -14 32 -32 32h-64c-18 0 -32 -14 -32 -32v-64c0 -18 14 -32 32 -32h64c18 0 32 14 32 32zM1152 416v64c0 18 -14 32 -32 32h-64c-18 0 -32 -14 -32 -32v-64c0 -18 14 -32 32 -32h64
+c18 0 32 14 32 32zM1152 672v64c0 18 -14 32 -32 32h-64c-18 0 -32 -14 -32 -32v-64c0 -18 14 -32 32 -32h64c18 0 32 14 32 32zM1152 928v64c0 18 -14 32 -32 32h-64c-18 0 -32 -14 -32 -32v-64c0 -18 14 -32 32 -32h64c18 0 32 14 32 32zM1152 1184v64c0 18 -14 32 -32 32
+h-64c-18 0 -32 -14 -32 -32v-64c0 -18 14 -32 32 -32h64c18 0 32 14 32 32z" />
+    <glyph glyph-name="bitbucket" unicode="&#xf171;" horiz-adv-x="1408" 
+d="M815 677c11 -84 -91 -150 -162 -107c-80 35 -80 162 -2 198c67 41 164 -13 164 -91zM926 698c-18 142 -179 236 -310 177c-83 -37 -139 -125 -135 -218c5 -122 121 -222 243 -211s217 130 202 252zM1165 1240c-44 58 -119 68 -185 79c-187 30 -379 31 -566 -2
+c-62 -10 -132 -21 -171 -77c64 -60 155 -69 237 -79c148 -19 300 -20 448 -1c83 10 175 18 237 80zM1222 205c-28 -98 -12 -230 -116 -287c-179 -99 -396 -110 -593 -75c-104 19 -226 52 -283 150c-25 96 -41 194 -57 292l6 16l18 9c298 -197 715 -197 1014 0
+c47 -14 12 -71 11 -105zM1403 1166c-34 -219 -73 -437 -111 -655c-11 -64 -73 -100 -125 -127c-187 -94 -405 -110 -610 -88c-139 15 -281 52 -394 139c-53 41 -53 111 -63 170c-35 205 -75 410 -100 617c12 90 113 129 188 157c100 37 207 54 313 64c226 22 457 14 676 -50
+c78 -23 162 -55 215 -122c24 -31 16 -70 11 -105z" />
+    <glyph glyph-name="yelp" unicode="&#xf1e9;" horiz-adv-x="1366" 
+d="M688 217v-127c-1 -282 -1 -292 -6 -305c-8 -21 -26 -35 -51 -40c-72 -12 -297 71 -344 127c-10 11 -15 24 -17 36c-1 9 1 18 4 26c5 14 14 25 215 263c0 0 1 0 60 70c20 25 56 33 89 21c33 -13 51 -41 50 -71zM539 468c-2 -35 -22 -61 -52 -70l-120 -39
+c-269 -86 -278 -88 -292 -88c-22 1 -42 14 -54 36c-8 16 -14 43 -17 75c-11 98 2 245 31 291c14 22 34 33 56 32c15 0 27 -6 317 -124c0 0 -1 -1 84 -34c30 -12 49 -43 47 -79zM1365 171c-10 -72 -159 -261 -227 -288c-23 -9 -46 -7 -63 7c-12 9 -24 27 -184 287l-47 77
+c-18 28 -15 64 8 92c22 27 54 36 83 26c0 0 1 -1 119 -40c269 -88 278 -91 289 -100c18 -14 26 -35 22 -61zM693 803c5 -104 -39 -117 -54 -122c-14 -4 -58 -17 -114 71c-368 581 -378 598 -378 598c-5 21 1 44 19 62c55 57 354 141 432 121c25 -6 43 -22 49 -45
+c4 -25 40 -564 46 -685zM1355 695c2 -25 -7 -46 -26 -59c-12 -8 -24 -12 -329 -86c-49 -11 -76 -18 -91 -23l1 2c-30 -8 -64 6 -83 36s-18 63 0 87c0 0 1 1 75 102c164 224 172 235 184 243c19 13 42 13 65 2c65 -31 196 -226 204 -301v-3z" />
+    <glyph glyph-name="neuter" unicode="&#xf22c;" horiz-adv-x="1152" 
+d="M1152 960c0 -296 -224 -540 -512 -572v-612c0 -18 -14 -32 -32 -32h-64c-18 0 -32 14 -32 32v612c-288 32 -512 276 -512 572c0 318 258 576 576 576s576 -258 576 -576zM576 512c247 0 448 201 448 448s-201 448 -448 448s-448 -201 -448 -448s201 -448 448 -448z" />
+    <glyph glyph-name="behance-square" unicode="&#xf1b5;" 
+d="M1248 1408c159 0 288 -129 288 -288v-960c0 -159 -129 -288 -288 -288h-960c-159 0 -288 129 -288 288v960c0 159 129 288 288 288h960zM499 1041h-371v-787h382c143 0 277 68 277 228c0 99 -47 172 -143 200c70 34 107 85 107 164c0 157 -117 195 -252 195zM477 723
+h-176v184h163c62 0 119 -17 119 -90c0 -67 -44 -94 -106 -94zM486 388h-185v217h189c76 0 124 -33 124 -113s-57 -104 -128 -104zM1136 356c-92 0 -140 54 -140 145h411c1 10 1 20 1 30c0 168 -99 309 -278 309c-173 0 -292 -131 -292 -302c0 -178 112 -299 292 -299
+c137 0 225 61 267 191h-138c-15 -48 -76 -74 -123 -74zM1126 722c78 0 117 -47 124 -122h-254c5 75 55 122 130 122zM964 988v-77h319v77h-319z" />
+    <glyph glyph-name="wifi" unicode="&#xf1eb;" horiz-adv-x="1964" 
+d="M982 13c-26 0 -166 140 -166 167c0 49 128 76 166 76s166 -27 166 -76c0 -27 -140 -167 -166 -167zM1252 284c-14 0 -123 100 -270 100c-148 0 -255 -100 -270 -100c-24 0 -169 144 -169 168c0 9 4 17 10 23c107 106 281 165 429 165s322 -59 429 -165
+c6 -6 10 -14 10 -23c0 -24 -145 -168 -169 -168zM1525 556c-8 0 -17 4 -23 8c-165 128 -304 204 -520 204c-302 0 -532 -212 -543 -212c-23 0 -167 144 -167 168c0 8 4 16 10 22c179 179 449 278 700 278s521 -99 700 -278c6 -6 10 -14 10 -22c0 -24 -144 -168 -167 -168z
+M1796 827c-8 0 -16 4 -22 9c-231 203 -480 316 -792 316s-561 -113 -792 -316c-6 -5 -14 -9 -22 -9c-23 0 -168 144 -168 168c0 9 4 17 10 23c253 251 618 390 972 390s719 -139 972 -390c6 -6 10 -14 10 -23c0 -24 -145 -168 -168 -168z" />
+    <glyph glyph-name="youtube" unicode="&#xf167;" horiz-adv-x="1482" 
+d="M944 292v-211c0 -45 -13 -67 -39 -67c-15 0 -30 7 -45 22v301c15 15 30 22 45 22c26 0 39 -23 39 -67zM1282 291v-46h-90v46c0 45 15 68 45 68s45 -23 45 -68zM316 509h107v94h-312v-94h105v-569h100v569zM604 -60h89v494h-89v-378c-20 -28 -39 -42 -57 -42
+c-12 0 -19 7 -21 21c-1 3 -1 14 -1 35v364h-89v-391c0 -35 3 -58 8 -73c8 -25 29 -37 58 -37c32 0 66 20 102 61v-54zM1033 88v197c0 46 -2 79 -9 99c-11 37 -36 56 -71 56c-33 0 -64 -18 -93 -54v217h-89v-663h89v48c30 -37 61 -55 93 -55c35 0 60 19 71 55
+c7 21 9 54 9 100zM1371 98v13h-91c0 -36 -1 -56 -2 -61c-5 -24 -18 -36 -40 -36c-31 0 -46 23 -46 69v87h179v103c0 53 -9 91 -27 116c-26 34 -61 51 -106 51c-46 0 -81 -17 -107 -51c-19 -25 -28 -63 -28 -116v-173c0 -53 10 -92 29 -116c26 -34 61 -51 108 -51
+s84 18 108 53c11 16 19 34 21 54c2 9 2 29 2 58zM763 1011v210c0 46 -13 69 -43 69c-29 0 -43 -23 -43 -69v-210c0 -46 14 -70 43 -70c30 0 43 24 43 70zM1482 260c0 -115 -1 -238 -26 -350c-19 -79 -83 -137 -160 -145c-184 -21 -370 -21 -555 -21s-371 0 -555 21
+c-77 8 -142 66 -160 145c-26 112 -26 235 -26 350c0 116 1 238 26 350c19 79 83 137 161 146c183 20 369 20 554 20s371 0 555 -20c77 -9 142 -67 160 -146c26 -112 26 -234 26 -350zM484 1536h102l-121 -399v-271h-100v271c-9 49 -29 119 -61 212c-22 62 -44 125 -65 187
+h106l71 -263zM854 1203v-175c0 -53 -9 -93 -28 -118c-25 -34 -60 -51 -106 -51c-45 0 -80 17 -105 51c-19 26 -28 65 -28 118v175c0 53 9 92 28 117c25 34 60 51 105 51c46 0 81 -17 106 -51c19 -25 28 -64 28 -117zM1189 1365v-499h-91v55c-36 -42 -70 -62 -103 -62
+c-29 0 -50 12 -59 37c-5 15 -8 39 -8 75v394h91v-367c0 -21 0 -33 1 -35c2 -14 9 -22 21 -22c18 0 37 14 57 43v381h91z" />
+    <glyph glyph-name="angle-double-down" unicode="&#xf103;" horiz-adv-x="998" 
+d="M998 672c0 -8 -4 -17 -10 -23l-466 -466c-6 -6 -15 -10 -23 -10s-17 4 -23 10l-466 466c-6 6 -10 15 -10 23s4 17 10 23l50 50c6 6 14 10 23 10c8 0 17 -4 23 -10l393 -393l393 393c6 6 15 10 23 10s17 -4 23 -10l50 -50c6 -6 10 -15 10 -23zM998 1056
+c0 -8 -4 -17 -10 -23l-466 -466c-6 -6 -15 -10 -23 -10s-17 4 -23 10l-466 466c-6 6 -10 15 -10 23s4 17 10 23l50 50c6 6 14 10 23 10c8 0 17 -4 23 -10l393 -393l393 393c6 6 15 10 23 10s17 -4 23 -10l50 -50c6 -6 10 -15 10 -23z" />
+    <glyph glyph-name="sort-alpha-asc" unicode="&#xf15d;" horiz-adv-x="1629" 
+d="M1159 1128h177l-72 218l-12 47c-1 8 -2 14 -2 20h-4l-3 -20c-3 -12 -4 -27 -11 -47zM704 96c0 -9 -4 -17 -10 -24l-319 -319c-7 -6 -15 -9 -23 -9s-16 3 -23 9l-320 320c-9 10 -12 23 -7 35s17 20 30 20h192v1376c0 18 14 32 32 32h192c18 0 32 -14 32 -32v-1376h192
+c18 0 32 -14 32 -32zM1540 -23v-233h-584v90l369 529c8 12 16 22 21 27l11 9v3c-4 0 -8 -1 -14 -1c-8 -2 -18 -3 -30 -3h-232v-115h-120v229h567v-89l-369 -530c-6 -9 -14 -18 -21 -26l-11 -11v-2l14 2c9 2 18 2 30 2h248v119h121zM1629 874v-106h-288v106h75l-47 144h-243
+l-47 -144h75v-106h-287v106h70l230 662h162l230 -662h70z" />
+    <glyph glyph-name="area-chart" unicode="&#xf1fe;" horiz-adv-x="2048" 
+d="M2048 0v-128h-2048v1536h128v-1408h1920zM1664 1024l256 -896h-1664v576l448 576l576 -576z" />
+    <glyph glyph-name="dev-to" unicode="&#xf316;" 
+d="M39 1403v0c13 5 121 6 735 5c717 -1 721 -1 734 -9c7 -5 15 -14 20 -21c8 -13 8 -16 8 -739s0 -726 -8 -739c-5 -7 -13 -15 -20 -20c-13 -8 -16 -8 -739 -8s-726 0 -739 8c-7 5 -16 13 -21 20c-8 13 -8 16 -9 731c0 490 0 723 3 733c5 19 18 33 36 39zM404 935
+c-18 4 -53 6 -119 6h-93v-603h84c46 0 96 1 111 3c72 9 131 63 144 132c5 26 5 306 0 332c-6 31 -20 59 -43 83c-25 26 -50 40 -84 47zM897 886v55h-118c-92 0 -121 -2 -133 -6c-20 -7 -42 -30 -47 -50c-3 -11 -4 -89 -3 -254c1 -265 -1 -250 27 -274c20 -17 39 -19 163 -19
+h111v109l-95 1l-96 1l-1 69v69h116v109h-116v136h192v54zM1081 933c-3 8 -4 8 -62 8h-59l3 -10c26 -106 136 -514 143 -528c11 -23 33 -49 49 -57c18 -9 47 -7 67 4c16 9 45 45 50 62c8 25 138 522 138 525s-16 4 -60 3l-58 -1l-52 -198c-28 -109 -52 -199 -53 -202
+s-24 83 -52 190s-52 199 -54 204zM301 639v193l41 -1c37 -2 42 -2 56 -11c28 -18 27 -18 27 -178c0 -164 0 -166 -29 -183c-15 -9 -22 -10 -56 -11l-39 -2v193z" />
+    <glyph glyph-name="stethoscope" unicode="&#xf0f1;" horiz-adv-x="1408" 
+d="M1280 832c0 35 -29 64 -64 64s-64 -29 -64 -64s29 -64 64 -64s64 29 64 64zM1408 832c0 -84 -53 -154 -128 -181v-395c0 -212 -201 -384 -448 -384s-448 172 -448 384v132c-217 27 -384 187 -384 380v512c0 35 29 64 64 64c6 0 11 -1 16 -2c22 39 64 66 112 66
+c71 0 128 -57 128 -128s-57 -128 -128 -128c-23 0 -45 7 -64 18v-402c0 -141 144 -256 320 -256s320 115 320 256v402c-19 -11 -41 -18 -64 -18c-71 0 -128 57 -128 128s57 128 128 128c48 0 90 -27 112 -66c5 1 10 2 16 2c35 0 64 -29 64 -64v-512
+c0 -193 -167 -353 -384 -380v-132c0 -141 144 -256 320 -256s320 115 320 256v395c-75 27 -128 97 -128 181c0 106 86 192 192 192s192 -86 192 -192z" />
+    <glyph glyph-name="step-forward" unicode="&#xf051;" horiz-adv-x="1024" 
+d="M45 -115c-25 -25 -45 -16 -45 19v1472c0 35 20 44 45 19l710 -710c6 -6 10 -12 13 -19v678c0 35 29 64 64 64h128c35 0 64 -29 64 -64v-1408c0 -35 -29 -64 -64 -64h-128c-35 0 -64 29 -64 64v678c-3 -7 -7 -13 -13 -19z" />
+    <glyph glyph-name="backward" unicode="&#xf04a;" horiz-adv-x="1542" 
+d="M1497 1395c25 25 45 16 45 -19v-1472c0 -35 -20 -44 -45 -19l-710 710c-6 6 -10 12 -13 19v-710c0 -35 -20 -44 -45 -19l-710 710c-25 25 -25 65 0 90l710 710c25 25 45 16 45 -19v-710c3 7 7 13 13 19z" />
+  </font>
+</defs></svg>
diff --git a/ceph/src/pybind/mgr/dashboard/frontend/dist/en-US/forkawesome-webfont.3b3951dce6cf5d60.ttf b/ceph/src/pybind/mgr/dashboard/frontend/dist/en-US/forkawesome-webfont.3b3951dce6cf5d60.ttf
new file mode 100644 (file)
index 0000000..6cf62ef
Binary files /dev/null and b/ceph/src/pybind/mgr/dashboard/frontend/dist/en-US/forkawesome-webfont.3b3951dce6cf5d60.ttf differ
diff --git a/ceph/src/pybind/mgr/dashboard/frontend/dist/en-US/forkawesome-webfont.7c20758e3e7c7dff7c8d.woff2 b/ceph/src/pybind/mgr/dashboard/frontend/dist/en-US/forkawesome-webfont.7c20758e3e7c7dff7c8d.woff2
deleted file mode 100644 (file)
index f3520b5..0000000
Binary files a/ceph/src/pybind/mgr/dashboard/frontend/dist/en-US/forkawesome-webfont.7c20758e3e7c7dff7c8d.woff2 and /dev/null differ
diff --git a/ceph/src/pybind/mgr/dashboard/frontend/dist/en-US/forkawesome-webfont.86541105409e56d17291.svg b/ceph/src/pybind/mgr/dashboard/frontend/dist/en-US/forkawesome-webfont.86541105409e56d17291.svg
deleted file mode 100644 (file)
index e997204..0000000
+++ /dev/null
@@ -1,2849 +0,0 @@
-<?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" >
-<!--
-2019-2-18: Created with FontForge (http://fontforge.org)
--->
-<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1">
-<metadata>
-Created by FontForge 20180321 at Mon Feb 18 18:29:30 2019
- By Julien Deswaef
-The Fork Awesome font is licensed under the SIL OFL 1.1 (http://scripts.sil.org/OFL). Fork Awesome is a fork based of off Font Awesome 4.7.0 by Dave Gandy. More info on licenses at https://forkawesome.github.io
-</metadata>
-<defs>
-<font id="forkawesome" horiz-adv-x="1536" >
-  <font-face 
-    font-family="forkawesome"
-    font-weight="400"
-    font-stretch="normal"
-    units-per-em="1792"
-    panose-1="2 0 5 3 0 0 0 0 0 0"
-    ascent="1536"
-    descent="-256"
-    bbox="-0.653061 -264 2304.01 1538"
-    underline-thickness="89.6"
-    underline-position="-179.2"
-    unicode-range="U+0020-F32B"
-  />
-    <missing-glyph />
-    <glyph glyph-name="space" unicode=" " horiz-adv-x="200" 
- />
-    <glyph glyph-name="code" unicode="&#xf121;" horiz-adv-x="1830" 
-d="M572 137l-50 -50c-13 -13 -33 -13 -46 0l-466 466c-13 13 -13 33 0 46l466 466c13 13 33 13 46 0l50 -50c13 -13 13 -33 0 -46l-393 -393l393 -393c13 -13 13 -33 0 -46zM1163 1204l-373 -1291c-5 -17 -23 -27 -39 -22l-62 17c-17 5 -27 23 -22 40l373 1291
-c5 17 23 27 39 22l62 -17c17 -5 27 -23 22 -40zM1820 553l-466 -466c-13 -13 -33 -13 -46 0l-50 50c-13 13 -13 33 0 46l393 393l-393 393c-13 13 -13 33 0 46l50 50c13 13 33 13 46 0l466 -466c13 -13 13 -33 0 -46z" />
-    <glyph glyph-name="chevron-circle-right" unicode="&#xf138;" 
-d="M717 141l454 454c25 25 25 65 0 90l-454 454c-25 25 -65 25 -90 0l-102 -102c-25 -25 -25 -65 0 -90l307 -307l-307 -307c-25 -25 -25 -65 0 -90l102 -102c25 -25 65 -25 90 0zM1536 640c0 -424 -344 -768 -768 -768s-768 344 -768 768s344 768 768 768
-s768 -344 768 -768z" />
-    <glyph glyph-name="crosshairs" unicode="&#xf05b;" 
-d="M1197 512h-109c-35 0 -64 29 -64 64v128c0 35 29 64 64 64h109c-43 144 -157 258 -301 301v-109c0 -35 -29 -64 -64 -64h-128c-35 0 -64 29 -64 64v109c-144 -43 -258 -157 -301 -301h109c35 0 64 -29 64 -64v-128c0 -35 -29 -64 -64 -64h-109c43 -144 157 -258 301 -301
-v109c0 35 29 64 64 64h128c35 0 64 -29 64 -64v-109c144 43 258 157 301 301zM1536 704v-128c0 -35 -29 -64 -64 -64h-143c-49 -215 -218 -384 -433 -433v-143c0 -35 -29 -64 -64 -64h-128c-35 0 -64 29 -64 64v143c-215 49 -384 218 -433 433h-143c-35 0 -64 29 -64 64v128
-c0 35 29 64 64 64h143c49 215 218 384 433 433v143c0 35 29 64 64 64h128c35 0 64 -29 64 -64v-143c215 -49 384 -218 433 -433h143c35 0 64 -29 64 -64z" />
-    <glyph glyph-name="gg" unicode="&#xf260;" horiz-adv-x="1920" 
-d="M672 736l384 -384l-384 -384l-672 672l672 672l168 -168l-96 -96l-72 72l-480 -480l480 -480l193 193l-289 287zM1248 1312l672 -672l-672 -672l-168 168l96 96l72 -72l480 480l-480 480l-193 -193l289 -287l-96 -96l-384 384z" />
-    <glyph glyph-name="wpforms" unicode="&#xf298;" 
-d="M515 625v-128h-252v128h252zM515 880v-127h-252v127h252zM1273 369v-128h-341v128h341zM1273 625v-128h-672v128h672zM1273 880v-127h-672v127h672zM1408 20v1240c0 11 -9 20 -20 20h-32l-378 -256l-210 171l-210 -171l-378 256h-32c-11 0 -20 -9 -20 -20v-1240
-c0 -11 9 -20 20 -20h1240c11 0 20 9 20 20zM553 1130l185 150h-406zM983 1130l221 150h-406zM1536 1260v-1240c0 -82 -66 -148 -148 -148h-1240c-82 0 -148 66 -148 148v1240c0 82 66 148 148 148h1240c82 0 148 -66 148 -148z" />
-    <glyph glyph-name="angle-double-left" unicode="&#xf100;" horiz-adv-x="966" 
-d="M582 160c0 -8 -4 -17 -10 -23l-50 -50c-6 -6 -15 -10 -23 -10s-17 4 -23 10l-466 466c-6 6 -10 15 -10 23s4 17 10 23l466 466c6 6 15 10 23 10s17 -4 23 -10l50 -50c6 -6 10 -15 10 -23s-4 -17 -10 -23l-393 -393l393 -393c6 -6 10 -15 10 -23zM966 160
-c0 -8 -4 -17 -10 -23l-50 -50c-6 -6 -15 -10 -23 -10s-17 4 -23 10l-466 466c-6 6 -10 15 -10 23s4 17 10 23l466 466c6 6 15 10 23 10s17 -4 23 -10l50 -50c6 -6 10 -15 10 -23s-4 -17 -10 -23l-393 -393l393 -393c6 -6 10 -15 10 -23z" />
-    <glyph glyph-name="list" unicode="&#xf03a;" horiz-adv-x="1792" 
-d="M256 224v-192c0 -17 -15 -32 -32 -32h-192c-17 0 -32 15 -32 32v192c0 17 15 32 32 32h192c17 0 32 -15 32 -32zM256 608v-192c0 -17 -15 -32 -32 -32h-192c-17 0 -32 15 -32 32v192c0 17 15 32 32 32h192c17 0 32 -15 32 -32zM256 992v-192c0 -17 -15 -32 -32 -32h-192
-c-17 0 -32 15 -32 32v192c0 17 15 32 32 32h192c17 0 32 -15 32 -32zM1792 224v-192c0 -17 -15 -32 -32 -32h-1344c-17 0 -32 15 -32 32v192c0 17 15 32 32 32h1344c17 0 32 -15 32 -32zM256 1376v-192c0 -17 -15 -32 -32 -32h-192c-17 0 -32 15 -32 32v192
-c0 17 15 32 32 32h192c17 0 32 -15 32 -32zM1792 608v-192c0 -17 -15 -32 -32 -32h-1344c-17 0 -32 15 -32 32v192c0 17 15 32 32 32h1344c17 0 32 -15 32 -32zM1792 992v-192c0 -17 -15 -32 -32 -32h-1344c-17 0 -32 15 -32 32v192c0 17 15 32 32 32h1344
-c17 0 32 -15 32 -32zM1792 1376v-192c0 -17 -15 -32 -32 -32h-1344c-17 0 -32 15 -32 32v192c0 17 15 32 32 32h1344c17 0 32 -15 32 -32z" />
-    <glyph glyph-name="archlinux" unicode="&#xf323;" horiz-adv-x="1794" 
-d="M897 1538c164 -386 203 -504 682 -1397c-61 36 -138 70 -247 98c158 -81 236 -156 310 -214c47 -87 97 -179 152 -281c-281 162 -499 263 -702 303c7 31 11 64 12 98c5 182 -83 337 -195 347s-207 -131 -212 -313v-9c0 -43 4 -84 13 -122c-205 -39 -426 -140 -710 -304
-c362 650 540 989 654 1226c60 -50 139 -99 256 -147c-109 76 -175 143 -230 201c89 190 137 318 217 514z" />
-    <glyph glyph-name="th" unicode="&#xf00a;" horiz-adv-x="1792" 
-d="M512 288v-192c0 -53 -43 -96 -96 -96h-320c-53 0 -96 43 -96 96v192c0 53 43 96 96 96h320c53 0 96 -43 96 -96zM512 800v-192c0 -53 -43 -96 -96 -96h-320c-53 0 -96 43 -96 96v192c0 53 43 96 96 96h320c53 0 96 -43 96 -96zM1152 288v-192c0 -53 -43 -96 -96 -96h-320
-c-53 0 -96 43 -96 96v192c0 53 43 96 96 96h320c53 0 96 -43 96 -96zM512 1312v-192c0 -53 -43 -96 -96 -96h-320c-53 0 -96 43 -96 96v192c0 53 43 96 96 96h320c53 0 96 -43 96 -96zM1152 800v-192c0 -53 -43 -96 -96 -96h-320c-53 0 -96 43 -96 96v192c0 53 43 96 96 96
-h320c53 0 96 -43 96 -96zM1792 288v-192c0 -53 -43 -96 -96 -96h-320c-53 0 -96 43 -96 96v192c0 53 43 96 96 96h320c53 0 96 -43 96 -96zM1152 1312v-192c0 -53 -43 -96 -96 -96h-320c-53 0 -96 43 -96 96v192c0 53 43 96 96 96h320c53 0 96 -43 96 -96zM1792 800v-192
-c0 -53 -43 -96 -96 -96h-320c-53 0 -96 43 -96 96v192c0 53 43 96 96 96h320c53 0 96 -43 96 -96zM1792 1312v-192c0 -53 -43 -96 -96 -96h-320c-53 0 -96 43 -96 96v192c0 53 43 96 96 96h320c53 0 96 -43 96 -96z" />
-    <glyph glyph-name="angle-left" unicode="&#xf104;" horiz-adv-x="582" 
-d="M582 992c0 -8 -4 -17 -10 -23l-393 -393l393 -393c6 -6 10 -15 10 -23s-4 -17 -10 -23l-50 -50c-6 -6 -15 -10 -23 -10s-17 4 -23 10l-466 466c-6 6 -10 15 -10 23s4 17 10 23l466 466c6 6 15 10 23 10s17 -4 23 -10l50 -50c6 -6 10 -14 10 -23z" />
-    <glyph glyph-name="recycle" unicode="&#xf1b8;" horiz-adv-x="1760" 
-d="M820 367l-15 -368l-2 -22l-420 29c-52 4 -95 53 -114 97c-40 93 12 203 42 292c0 0 77 -12 509 -28zM433 953l180 -379l-147 92c-225 -257 -246 -448 -246 -448l-190 357c-39 58 -4 121 -4 121s35 63 114 188l-140 86zM1664 436l-188 -359c-26 -65 -98 -71 -98 -71
-s-71 -7 -219 -12l8 -164l-230 367l211 362l7 -173c339 -41 509 50 509 50zM879 1360c0 0 -47 -62 -265 -435l-317 187l-19 12l225 356c28 44 91 60 140 55c100 -9 172 -106 236 -175zM1534 1053l212 -363c27 -45 11 -108 -15 -150c-54 -84 -174 -104 -264 -129
-c0 0 -34 71 -265 436l313 195zM1391 1279l142 83l-220 -373l-419 20l151 86c-120 319 -279 429 -279 429l405 -1c70 6 108 -54 108 -54s39 -61 112 -190z" />
-    <glyph glyph-name="file-code-o" unicode="&#xf1c9;" 
-d="M1468 1156c37 -37 68 -111 68 -164v-1152c0 -53 -43 -96 -96 -96h-1344c-53 0 -96 43 -96 96v1600c0 53 43 96 96 96h896c53 0 127 -31 164 -68zM1024 1400v-376h376c-6 17 -15 34 -22 41l-313 313c-7 7 -24 16 -41 22zM1408 -128v1024h-416c-53 0 -96 43 -96 96v416
-h-768v-1536h1280zM480 768c11 14 31 17 45 6l51 -38c14 -11 17 -31 6 -45l-182 -243l182 -243c11 -14 8 -34 -6 -45l-51 -38c-14 -11 -34 -8 -45 6l-226 301c-8 11 -8 27 0 38zM1282 467c8 -11 8 -27 0 -38l-226 -301c-11 -14 -31 -17 -45 -6l-51 38c-14 11 -17 31 -6 45
-l182 243l-182 243c-11 14 -8 34 6 45l51 38c14 11 34 8 45 -6zM662 6c-18 3 -29 20 -26 37l138 831c3 18 20 29 37 26l63 -10c18 -3 29 -20 26 -37l-138 -831c-3 -18 -20 -29 -37 -26z" />
-    <glyph glyph-name="thumb-tack" unicode="&#xf08d;" horiz-adv-x="1152" 
-d="M480 672v448c0 18 -14 32 -32 32s-32 -14 -32 -32v-448c0 -18 14 -32 32 -32s32 14 32 32zM1152 320c0 -35 -29 -64 -64 -64h-429l-51 -483c-2 -16 -15 -29 -31 -29h-1c-16 0 -29 11 -32 27l-76 485h-404c-35 0 -64 29 -64 64c0 164 124 320 256 320v512
-c-70 0 -128 58 -128 128s58 128 128 128h640c70 0 128 -58 128 -128s-58 -128 -128 -128v-512c132 0 256 -156 256 -320z" />
-    <glyph glyph-name="fax" unicode="&#xf1ac;" horiz-adv-x="1792" 
-d="M288 1152c88 0 160 -72 160 -160v-1088c0 -88 -72 -160 -160 -160h-128c-88 0 -160 72 -160 160v1088c0 88 72 160 160 160h128zM1664 989c76 -44 128 -127 128 -221v-768c0 -141 -115 -256 -256 -256h-864c-88 0 -160 72 -160 160v1536c0 53 43 96 96 96h672
-c53 0 127 -31 164 -68l152 -152c37 -37 68 -111 68 -164v-163zM928 0v128c0 18 -14 32 -32 32h-128c-18 0 -32 -14 -32 -32v-128c0 -18 14 -32 32 -32h128c18 0 32 14 32 32zM928 256v128c0 18 -14 32 -32 32h-128c-18 0 -32 -14 -32 -32v-128c0 -18 14 -32 32 -32h128
-c18 0 32 14 32 32zM928 512v128c0 18 -14 32 -32 32h-128c-18 0 -32 -14 -32 -32v-128c0 -18 14 -32 32 -32h128c18 0 32 14 32 32zM1184 0v128c0 18 -14 32 -32 32h-128c-18 0 -32 -14 -32 -32v-128c0 -18 14 -32 32 -32h128c18 0 32 14 32 32zM1184 256v128
-c0 18 -14 32 -32 32h-128c-18 0 -32 -14 -32 -32v-128c0 -18 14 -32 32 -32h128c18 0 32 14 32 32zM1184 512v128c0 18 -14 32 -32 32h-128c-18 0 -32 -14 -32 -32v-128c0 -18 14 -32 32 -32h128c18 0 32 14 32 32zM1440 0v128c0 18 -14 32 -32 32h-128
-c-18 0 -32 -14 -32 -32v-128c0 -18 14 -32 32 -32h128c18 0 32 14 32 32zM1440 256v128c0 18 -14 32 -32 32h-128c-18 0 -32 -14 -32 -32v-128c0 -18 14 -32 32 -32h128c18 0 32 14 32 32zM1440 512v128c0 18 -14 32 -32 32h-128c-18 0 -32 -14 -32 -32v-128
-c0 -18 14 -32 32 -32h128c18 0 32 14 32 32zM1536 896v256h-160c-53 0 -96 43 -96 96v160h-640v-512h896z" />
-    <glyph glyph-name="xing-square" unicode="&#xf169;" 
-d="M685 771c0 0 0 1 -126 222c-10 16 -24 34 -52 34h-184c-12 0 -21 -4 -26 -11c-5 -8 -4 -19 1 -29l125 -216v-1l-196 -346c-6 -10 -5 -20 0 -28s13 -13 24 -13h185c27 0 41 19 50 36c192 339 199 352 199 352zM1309 1268c-5 8 -13 12 -24 12h-187c-27 0 -39 -17 -49 -35
-c-398 -706 -411 -729 -411 -729s0 -1 262 -481c9 -16 23 -35 52 -35h184c11 0 20 4 25 12s5 18 -1 28l-260 476v1l409 723c5 10 5 20 0 28zM1536 1120v-960c0 -159 -129 -288 -288 -288h-960c-159 0 -288 129 -288 288v960c0 159 129 288 288 288h960
-c159 0 288 -129 288 -288z" />
-    <glyph glyph-name="google-plus-official" unicode="&#xf2b3;" 
-d="M917 631c0 22 -2 43 -6 64h-362v-132h217c-16 -106 -116 -165 -217 -165c-133 0 -239 110 -239 242s106 242 239 242c56 0 112 -19 153 -59l104 101c-71 66 -160 100 -257 100c-213 0 -384 -172 -384 -384s171 -384 384 -384c221 0 368 156 368 375zM1262 585h109v110
-h-109v110h-110v-110h-110v-110h110v-110h110v110zM1536 640c0 -424 -344 -768 -768 -768s-768 344 -768 768s344 768 768 768s768 -344 768 -768z" />
-    <glyph glyph-name="quora" unicode="&#xf2c4;" horiz-adv-x="1734" 
-d="M1226 749c0 417 -130 631 -435 631c-300 0 -430 -214 -430 -631c0 -415 130 -627 430 -627c48 0 91 5 131 17c-62 122 -135 245 -277 245c-27 0 -54 -4 -79 -16l-49 97c59 51 154 91 276 91c191 0 288 -92 366 -209c45 100 67 235 67 402zM1616 117h117
-c7 -72 -29 -373 -356 -373c-198 0 -302 115 -381 249c-65 -18 -135 -27 -205 -27c-400 0 -791 319 -791 783c0 468 392 787 791 787c407 0 794 -317 794 -787c0 -262 -122 -475 -299 -612c57 -86 116 -143 198 -143c90 0 126 69 132 123z" />
-    <glyph glyph-name="archive-org" unicode="&#xf2fc;" horiz-adv-x="1506" 
-d="M1459 1344l-27 -53h-1385l-24 53l717 189zM1430 1237v-140h-1380v140h1380zM1257 442c-3 65 -4 124 -3 178c0 25 1 61 3 108s3 77 3 91c1 22 3 57 5 104s4 82 5 107c0 1 1 3 1 7v10c47 10 93 10 138 0c21 -325 21 -630 0 -916c-41 -11 -82 -12 -123 -1c-6 1 -10 2 -11 2
-s-3 2 -3 3s-1 4 -1 9c-3 34 -6 90 -10 165zM80 369v0c-1 9 -1 22 -1 38c0 5 -1 11 -1 21s-1 17 -1 22c0 26 0 45 -1 57v219c2 38 3 68 3 88c2 32 3 56 3 71c1 7 1 15 1 26c0 3 1 9 1 17s1 14 1 18c0 7 0 10 1 12c0 12 0 22 1 28c0 11 1 20 2 27c0 11 0 19 1 24c0 4 2 6 7 7
-c29 10 61 13 96 8c11 -2 22 -5 32 -9c2 0 3 -2 3 -6c2 -42 4 -74 6 -97c1 -20 2 -50 3 -90s2 -69 2 -88s1 -47 1 -85s1 -66 2 -84c-3 -131 -4 -199 -4 -206c-1 -47 -3 -112 -7 -194c-2 -27 -3 -47 -3 -60c0 -3 -2 -5 -6 -6c-28 -9 -59 -11 -94 -8c-4 1 -10 3 -18 5
-s-12 4 -14 5c-4 0 -6 1 -6 4c0 12 0 21 -1 26c0 4 -1 8 -1 14s-1 10 -1 13c0 9 0 15 -1 20c0 6 -1 13 -1 24v25c-1 6 -2 14 -2 25s0 19 -1 25c0 17 -1 30 -2 40v24zM464 255v0v25s-1 19 -1 25c-1 10 -1 23 -1 40c-1 5 -2 13 -2 24c0 16 0 29 -1 38v43c-1 13 -2 32 -2 57v29
-s-1 21 -1 27v102c0 27 0 47 1 61c0 18 1 48 3 88c0 17 1 40 3 71c0 11 0 20 1 26c0 15 1 27 2 35v12c0 4 1 9 1 15v13s1 7 2 13s1 10 1 14l2 24c0 4 1 6 5 7c30 10 62 13 96 8c11 -2 22 -5 32 -9c4 0 6 -2 6 -6l4 -97l4 -178c2 -78 3 -135 3 -169c0 -24 -1 -59 -1 -104
-s-1 -79 -2 -102c-1 -47 -3 -112 -7 -194c0 -13 -1 -33 -3 -60c0 -3 -2 -5 -7 -6c-26 -10 -57 -12 -92 -8c-4 0 -7 1 -11 2s-8 3 -13 4s-8 3 -10 4c-2 0 -3 1 -3 4c-1 7 -1 15 -1 26c-1 7 -2 16 -2 27c-2 4 -3 10 -3 20zM1046 961v0c1 -26 3 -63 4 -114s2 -89 2 -114
-c2 -67 3 -113 3 -140c0 -22 -1 -53 -1 -95s-1 -73 -2 -94c-1 -45 -3 -111 -7 -199c-1 -8 -2 -20 -2 -36s0 -28 -1 -36c0 -3 -2 -5 -7 -6c-27 -9 -58 -11 -93 -8c-5 1 -12 2 -20 5s-12 5 -13 5c-3 0 -5 1 -5 5c0 12 0 31 -2 56s-4 45 -5 58c0 15 -1 40 -2 73s-2 59 -3 77
-c0 13 -1 33 -2 60s-1 47 -1 60v68c-1 46 -1 69 0 70c1 55 3 136 7 242c2 48 4 94 8 139c0 4 2 6 6 7c29 10 61 13 95 8c12 -2 23 -5 33 -9c3 0 4 -2 4 -6zM60 -18v98h1390v-98h-1390zM0 -128v73h1506v-73h-1506z" />
-    <glyph glyph-name="volume-up" unicode="&#xf028;" horiz-adv-x="1664" 
-d="M768 1184v-1088c0 -35 -29 -64 -64 -64c-17 0 -33 7 -45 19l-333 333h-262c-35 0 -64 29 -64 64v384c0 35 29 64 64 64h262l333 333c12 12 28 19 45 19c35 0 64 -29 64 -64zM1152 640c0 -100 -61 -197 -155 -235c-8 -4 -17 -5 -25 -5c-35 0 -64 28 -64 64
-c0 76 116 55 116 176s-116 100 -116 176c0 36 29 64 64 64c8 0 17 -1 25 -5c94 -37 155 -135 155 -235zM1408 640c0 -203 -122 -392 -310 -471c-8 -3 -17 -5 -25 -5c-36 0 -65 29 -65 64c0 28 16 47 39 59c27 14 52 26 76 44c99 72 157 187 157 309s-58 237 -157 309
-c-24 18 -49 30 -76 44c-23 12 -39 31 -39 59c0 35 29 64 64 64c9 0 18 -2 26 -5c188 -79 310 -268 310 -471zM1664 640c0 -307 -183 -585 -465 -706c-8 -3 -17 -5 -26 -5c-35 0 -64 29 -64 64c0 29 15 45 39 59c14 8 30 13 45 21c28 15 56 32 82 51c164 121 261 312 261 516
-s-97 395 -261 516c-26 19 -54 36 -82 51c-15 8 -31 13 -45 21c-24 14 -39 30 -39 59c0 35 29 64 64 64c9 0 18 -2 26 -5c282 -121 465 -399 465 -706z" />
-    <glyph glyph-name="spoon" unicode="&#xf1b1;" horiz-adv-x="640" 
-d="M640 1008c0 -200 -87 -331 -209 -379l45 -821c2 -35 -25 -64 -60 -64h-192c-35 0 -62 29 -60 64l45 821c-122 48 -209 179 -209 379c0 256 143 528 320 528s320 -272 320 -528z" />
-    <glyph glyph-name="facebook" unicode="&#xf09a;" horiz-adv-x="864" 
-d="M864 1524v-264h-157c-123 0 -146 -59 -146 -144v-189h293l-39 -296h-254v-759h-306v759h-255v296h255v218c0 253 155 391 381 391c108 0 201 -8 228 -12z" />
-    <glyph glyph-name="universal-access" unicode="&#xf29a;" horiz-adv-x="1792" 
-d="M1374 879c-8 34 -42 55 -77 47c-143 -34 -273 -62 -401 -62s-258 28 -401 62c-35 8 -69 -13 -77 -47c-8 -35 13 -69 47 -77c106 -25 205 -47 303 -58c-4 -338 -41 -432 -83 -540l-9 -21c-13 -33 4 -70 37 -83c7 -3 15 -4 23 -4c26 0 50 15 60 41l8 20
-c28 72 54 139 71 259h42c17 -120 43 -187 71 -259l8 -20c10 -26 34 -41 60 -41c8 0 16 1 23 4c33 13 50 50 37 83l-9 21c-42 108 -79 202 -83 540c98 11 197 33 303 58c34 8 55 42 47 77zM1024 1024c0 71 -57 128 -128 128s-128 -57 -128 -128s57 -128 128 -128
-s128 57 128 128zM1600 640c0 -389 -315 -704 -704 -704s-704 315 -704 704s315 704 704 704s704 -315 704 -704zM896 1408c-423 0 -768 -345 -768 -768s345 -768 768 -768s768 345 768 768s-345 768 -768 768zM1792 640c0 -495 -401 -896 -896 -896s-896 401 -896 896
-s401 896 896 896s896 -401 896 -896z" />
-    <glyph glyph-name="cloud-download" unicode="&#xf0ed;" horiz-adv-x="1920" 
-d="M1280 608c0 18 -14 32 -32 32h-224v352c0 17 -15 32 -32 32h-192c-17 0 -32 -15 -32 -32v-352h-224c-18 0 -32 -15 -32 -32c0 -8 3 -17 9 -23l352 -352c6 -6 14 -9 23 -9c8 0 17 3 23 9l351 351c6 7 10 15 10 24zM1920 384c0 -212 -172 -384 -384 -384h-1088
-c-247 0 -448 201 -448 448c0 174 101 332 258 405c-1 15 -2 29 -2 43c0 283 229 512 512 512c208 0 395 -126 474 -318c46 40 105 62 166 62c141 0 256 -115 256 -256c0 -49 -14 -97 -41 -138c174 -41 297 -196 297 -374z" />
-    <glyph glyph-name="trophy" unicode="&#xf091;" horiz-adv-x="1664" 
-d="M458 653c-42 92 -74 214 -74 371h-256v-96c0 -98 133 -234 330 -275zM1536 928v96h-256c0 -157 -32 -279 -74 -371c197 41 330 177 330 275zM1664 1056v-128c0 -190 -230 -400 -542 -415c-40 -51 -77 -81 -95 -95c-53 -48 -67 -98 -67 -162s32 -128 128 -128
-s192 -64 192 -160v-64c0 -18 -14 -32 -32 -32h-832c-18 0 -32 14 -32 32v64c0 96 96 160 192 160s128 64 128 128s-14 114 -67 162c-18 14 -55 44 -95 95c-312 15 -542 225 -542 415v128c0 53 43 96 96 96h288v96c0 88 72 160 160 160h576c88 0 160 -72 160 -160v-96h288
-c53 0 96 -43 96 -96z" />
-    <glyph glyph-name="caret-up" unicode="&#xf0d8;" horiz-adv-x="1024" 
-d="M1024 320c0 -35 -29 -64 -64 -64h-896c-35 0 -64 29 -64 64c0 17 7 33 19 45l448 448c12 12 28 19 45 19s33 -7 45 -19l448 -448c12 -12 19 -28 19 -45z" />
-    <glyph glyph-name="magic" unicode="&#xf0d0;" horiz-adv-x="1637" 
-d="M1163 955l293 293l-107 107l-293 -293zM1610 1248c0 -17 -6 -33 -18 -45l-1286 -1286c-12 -12 -28 -18 -45 -18s-33 6 -45 18l-198 198c-12 12 -18 28 -18 45s6 33 18 45l1286 1286c12 12 28 18 45 18s33 -6 45 -18l198 -198c12 -12 18 -28 18 -45zM259 1438l98 -30
-l-98 -30l-30 -98l-30 98l-98 30l98 30l30 98zM609 1276l196 -60l-196 -60l-60 -196l-60 196l-196 60l196 60l60 196zM1539 798l98 -30l-98 -30l-30 -98l-30 98l-98 30l98 30l30 98zM899 1438l98 -30l-98 -30l-30 -98l-30 98l-98 30l98 30l30 98z" />
-    <glyph glyph-name="hourglass-o" unicode="&#xf250;" 
-d="M1408 1408c0 -370 -177 -638 -373 -768c196 -130 373 -398 373 -768h96c18 0 32 -14 32 -32v-64c0 -18 -14 -32 -32 -32h-1472c-18 0 -32 14 -32 32v64c0 18 14 32 32 32h96c0 370 177 638 373 768c-196 130 -373 398 -373 768h-96c-18 0 -32 14 -32 32v64
-c0 18 14 32 32 32h1472c18 0 32 -14 32 -32v-64c0 -18 -14 -32 -32 -32h-96zM874 700c202 76 406 343 406 708h-1024c0 -365 204 -632 406 -708c25 -9 42 -33 42 -60s-17 -51 -42 -60c-202 -76 -406 -343 -406 -708h1024c0 365 -204 632 -406 708c-25 9 -42 33 -42 60
-s17 51 42 60z" />
-    <glyph glyph-name="balance-scale" unicode="&#xf24e;" horiz-adv-x="2176" 
-d="M1728 1088l-384 -704h768zM448 1088l-384 -704h768zM1269 1280c-19 -54 -63 -98 -117 -117v-1291h608c18 0 32 -14 32 -32v-64c0 -18 -14 -32 -32 -32h-1344c-18 0 -32 14 -32 32v64c0 18 14 32 32 32h608v1291c-54 19 -98 63 -117 117h-491c-18 0 -32 14 -32 32v64
-c0 18 14 32 32 32h491c27 75 97 128 181 128s154 -53 181 -128h491c18 0 32 -14 32 -32v-64c0 -18 -14 -32 -32 -32h-491zM1088 1264c44 0 80 36 80 80s-36 80 -80 80s-80 -36 -80 -80s36 -80 80 -80zM2176 384c0 -206 -285 -288 -448 -288s-448 82 -448 288
-c0 39 349 657 392 735c11 20 33 33 56 33s45 -13 56 -33c43 -78 392 -696 392 -735zM896 384c0 -206 -285 -288 -448 -288s-448 82 -448 288c0 39 349 657 392 735c11 20 33 33 56 33s45 -13 56 -33c43 -78 392 -696 392 -735z" />
-    <glyph glyph-name="upload" unicode="&#xf093;" horiz-adv-x="1664" 
-d="M1280 64c0 35 -29 64 -64 64s-64 -29 -64 -64s29 -64 64 -64s64 29 64 64zM1536 64c0 35 -29 64 -64 64s-64 -29 -64 -64s29 -64 64 -64s64 29 64 64zM1664 288v-320c0 -53 -43 -96 -96 -96h-1472c-53 0 -96 43 -96 96v320c0 53 43 96 96 96h427c27 -74 98 -128 181 -128
-h256c83 0 154 54 181 128h427c53 0 96 -43 96 -96zM1339 936c-10 -24 -33 -40 -59 -40h-256v-448c0 -35 -29 -64 -64 -64h-256c-35 0 -64 29 -64 64v448h-256c-26 0 -49 16 -59 40c-10 23 -5 51 14 69l448 448c12 13 29 19 45 19s33 -6 45 -19l448 -448
-c19 -18 24 -46 14 -69z" />
-    <glyph glyph-name="magnet" unicode="&#xf076;" 
-d="M1536 704v-128c0 -408 -323 -704 -768 -704s-768 296 -768 704v128c0 35 29 64 64 64h384c35 0 64 -29 64 -64v-128c0 -183 213 -192 256 -192s256 9 256 192v128c0 35 29 64 64 64h384c35 0 64 -29 64 -64zM512 1344v-384c0 -35 -29 -64 -64 -64h-384
-c-35 0 -64 29 -64 64v384c0 35 29 64 64 64h384c35 0 64 -29 64 -64zM1536 1344v-384c0 -35 -29 -64 -64 -64h-384c-35 0 -64 29 -64 64v384c0 35 29 64 64 64h384c35 0 64 -29 64 -64z" />
-    <glyph glyph-name="adjust" unicode="&#xf042;" 
-d="M768 96v1088c-300 0 -544 -244 -544 -544s244 -544 544 -544zM1536 640c0 -424 -344 -768 -768 -768s-768 344 -768 768s344 768 768 768s768 -344 768 -768z" />
-    <glyph glyph-name="subway" unicode="&#xf239;" 
-d="M1088 1536c247 0 448 -143 448 -320v-896c0 -173 -191 -313 -431 -319l213 -202c21 -20 7 -55 -22 -55h-1056c-29 0 -43 35 -22 55l213 202c-240 6 -431 146 -431 319v896c0 177 201 320 448 320h640zM288 224c88 0 160 72 160 160s-72 160 -160 160s-160 -72 -160 -160
-s72 -160 160 -160zM704 768v512h-544v-512h544zM1248 224c88 0 160 72 160 160s-72 160 -160 160s-160 -72 -160 -160s72 -160 160 -160zM1408 768v512h-576v-512h576z" />
-    <glyph glyph-name="unslpash" unicode="&#xf325;" 
-d="M1052 728h484v-856h-1536v856h484v-428h568v428zM484 1408h568v-428h-568v428z" />
-    <glyph glyph-name="chevron-down" unicode="&#xf078;" horiz-adv-x="1612" 
-d="M1593 728l-742 -741c-25 -25 -65 -25 -90 0l-742 741c-25 25 -25 66 0 91l166 165c25 25 65 25 90 0l531 -531l531 531c25 25 65 25 90 0l166 -165c25 -25 25 -66 0 -91z" />
-    <glyph glyph-name="location-arrow" unicode="&#xf124;" horiz-adv-x="1408" 
-d="M1401 1187l-640 -1280c-11 -22 -33 -35 -57 -35c-5 0 -10 1 -15 2c-29 7 -49 32 -49 62v576h-576c-30 0 -55 20 -62 49s7 59 33 72l1280 640c9 5 19 7 29 7c17 0 33 -6 45 -19c20 -19 25 -49 12 -74z" />
-    <glyph glyph-name="check-circle" unicode="&#xf058;" 
-d="M1284 802c0 17 -6 34 -18 46l-91 90c-12 12 -28 19 -45 19s-33 -7 -45 -19l-408 -407l-226 226c-12 12 -28 19 -45 19s-33 -7 -45 -19l-91 -90c-12 -12 -18 -29 -18 -46s6 -33 18 -45l362 -362c12 -12 29 -19 45 -19c17 0 34 7 46 19l543 543c12 12 18 28 18 45z
-M1536 640c0 -424 -344 -768 -768 -768s-768 344 -768 768s344 768 768 768s768 -344 768 -768z" />
-    <glyph glyph-name="arrow-down" unicode="&#xf063;" horiz-adv-x="1558" 
-d="M1558 704c0 -34 -14 -67 -37 -90l-651 -652c-24 -23 -57 -37 -91 -37s-67 14 -90 37l-651 652c-24 23 -38 56 -38 90s14 67 38 91l74 75c24 23 57 37 91 37s67 -14 90 -37l294 -294v704c0 70 58 128 128 128h128c70 0 128 -58 128 -128v-704l294 294c23 23 56 37 90 37
-s67 -14 91 -37l75 -75c23 -24 37 -57 37 -91z" />
-    <glyph glyph-name="bicycle" unicode="&#xf206;" horiz-adv-x="2304" 
-d="M762 384h-314c-53 0 -83 60 -51 102l188 251c-42 20 -88 31 -137 31c-176 0 -320 -144 -320 -320s144 -320 320 -320c155 0 284 110 314 256zM576 512h186c-12 56 -38 107 -75 148zM1056 512l288 384h-480l-99 -132c67 -66 112 -154 126 -252h165zM2176 448
-c0 176 -144 320 -320 320c-43 0 -83 -9 -121 -24l174 -260c20 -30 12 -70 -17 -89c-11 -8 -24 -11 -36 -11c-21 0 -41 10 -53 29l-174 260c-57 -58 -93 -137 -93 -225c0 -176 144 -320 320 -320s320 144 320 320zM2304 448c0 -247 -201 -448 -448 -448s-448 201 -448 448
-c0 132 58 251 149 333l-65 98l-353 -469c-12 -17 -31 -26 -51 -26h-197c-31 -217 -217 -384 -443 -384c-247 0 -448 201 -448 448s201 448 448 448c78 0 151 -20 215 -55l137 183h-224c-35 0 -64 29 -64 64s29 64 64 64h384v-128h435l-85 128h-222c-35 0 -64 29 -64 64
-s29 64 64 64h256c21 0 41 -11 53 -28l267 -400c58 28 123 44 192 44c247 0 448 -201 448 -448z" />
-    <glyph glyph-name="instagram" unicode="&#xf16d;" 
-d="M1024 640c0 141 -115 256 -256 256s-256 -115 -256 -256s115 -256 256 -256s256 115 256 256zM1162 640c0 -218 -176 -394 -394 -394s-394 176 -394 394s176 394 394 394s394 -176 394 -394zM1270 1050c0 -51 -41 -92 -92 -92s-92 41 -92 92s41 92 92 92s92 -41 92 -92z
-M768 1270c-112 0 -352 9 -453 -31c-35 -14 -61 -31 -88 -58s-44 -53 -58 -88c-40 -101 -31 -341 -31 -453s-9 -352 31 -453c14 -35 31 -61 58 -88s53 -44 88 -58c101 -40 341 -31 453 -31s352 -9 453 31c35 14 61 31 88 58s44 53 58 88c40 101 31 341 31 453s9 352 -31 453
-c-14 35 -31 61 -58 88s-53 44 -88 58c-101 40 -341 31 -453 31zM1536 640c0 -106 1 -211 -5 -317c-6 -123 -34 -232 -124 -322s-199 -118 -322 -124c-106 -6 -211 -5 -317 -5s-211 -1 -317 5c-123 6 -232 34 -322 124s-118 199 -124 322c-6 106 -5 211 -5 317s-1 211 5 317
-c6 123 34 232 124 322s199 118 322 124c106 6 211 5 317 5s211 1 317 -5c123 -6 232 -34 322 -124s118 -199 124 -322c6 -106 5 -211 5 -317z" />
-    <glyph glyph-name="caret-square-o-up" unicode="&#xf151;" 
-d="M1145 419c-11 -22 -33 -35 -57 -35h-640c-24 0 -46 13 -57 35c-11 21 -9 47 5 66l320 448c12 17 31 27 52 27s40 -10 52 -27l320 -448c14 -19 16 -45 5 -66zM1280 160v960c0 17 -15 32 -32 32h-960c-17 0 -32 -15 -32 -32v-960c0 -17 15 -32 32 -32h960c17 0 32 15 32 32
-zM1536 1120v-960c0 -159 -129 -288 -288 -288h-960c-159 0 -288 129 -288 288v960c0 159 129 288 288 288h960c159 0 288 -129 288 -288z" />
-    <glyph glyph-name="crop" unicode="&#xf125;" horiz-adv-x="1664" 
-d="M557 256h595v595zM512 301l595 595h-595v-595zM1664 224v-192c0 -18 -14 -32 -32 -32h-224v-224c0 -18 -14 -32 -32 -32h-192c-18 0 -32 14 -32 32v224h-864c-18 0 -32 14 -32 32v864h-224c-18 0 -32 14 -32 32v192c0 18 14 32 32 32h224v224c0 18 14 32 32 32h192
-c18 0 32 -14 32 -32v-224h851l246 247c13 12 33 12 46 0c12 -13 12 -33 0 -46l-247 -246v-851h224c18 0 32 -14 32 -32z" />
-    <glyph glyph-name="external-link" unicode="&#xf08e;" horiz-adv-x="1792" 
-d="M1408 608v-320c0 -159 -129 -288 -288 -288h-832c-159 0 -288 129 -288 288v832c0 159 129 288 288 288h704c18 0 32 -14 32 -32v-64c0 -18 -14 -32 -32 -32h-704c-88 0 -160 -72 -160 -160v-832c0 -88 72 -160 160 -160h832c88 0 160 72 160 160v320c0 18 14 32 32 32
-h64c18 0 32 -14 32 -32zM1792 1472v-512c0 -35 -29 -64 -64 -64c-17 0 -33 7 -45 19l-176 176l-652 -652c-6 -6 -15 -10 -23 -10s-17 4 -23 10l-114 114c-6 6 -10 15 -10 23s4 17 10 23l652 652l-176 176c-12 12 -19 28 -19 45c0 35 29 64 64 64h512c35 0 64 -29 64 -64z
-" />
-    <glyph glyph-name="arrow-circle-down" unicode="&#xf0ab;" 
-d="M1284 639c0 17 -6 33 -18 45l-91 91c-12 12 -28 18 -45 18s-33 -6 -45 -18l-189 -189v502c0 35 -29 64 -64 64h-128c-35 0 -64 -29 -64 -64v-502l-189 189c-12 12 -28 19 -45 19s-33 -7 -45 -19l-91 -91c-12 -12 -18 -28 -18 -45s6 -33 18 -45l362 -362l91 -91
-c12 -12 28 -18 45 -18s33 6 45 18l91 91l362 362c12 12 18 28 18 45zM1536 640c0 -424 -344 -768 -768 -768s-768 344 -768 768s344 768 768 768s768 -344 768 -768z" />
-    <glyph glyph-name="font-awesome" unicode="&#xf2b4;" horiz-adv-x="1499" 
-d="M1499 1024v-839c0 -31 -20 -54 -49 -62c-107 -32 -227 -52 -338 -52c-150 0 -277 59 -443 59c-123 0 -250 -20 -370 -48v-338h-160v1368c-84 33 -139 115 -139 205c0 121 98 219 219 219s219 -98 219 -219c0 -90 -55 -172 -139 -205v-68c112 26 228 44 343 44
-c66 0 132 -5 198 -15c86 -13 173 -43 261 -43c55 0 111 7 165 18c41 8 135 40 169 40c35 0 64 -29 64 -64z" />
-    <glyph glyph-name="paper-plane" unicode="&#xf1d8;" horiz-adv-x="1792" 
-d="M1764 1525c21 -15 31 -39 27 -64l-256 -1536c-3 -19 -15 -35 -32 -45c-9 -5 -20 -8 -31 -8c-8 0 -16 2 -24 5l-453 185l-242 -295c-12 -15 -30 -23 -49 -23c-7 0 -15 1 -22 4c-25 9 -42 33 -42 60v349l864 1059l-1069 -925l-395 162c-23 9 -38 30 -40 55
-c-1 24 11 47 32 59l1664 960c10 6 21 9 32 9c13 0 26 -4 36 -11z" />
-    <glyph glyph-name="meanpath" unicode="&#xf20c;" 
-d="M1311 694v-114c0 -32 -19 -52 -51 -52h-202c-32 0 -52 20 -52 52v114c0 32 20 52 52 52h202c32 0 51 -20 51 -52zM821 464v250c0 71 -47 118 -118 118h-133c-45 0 -78 -19 -96 -52c-18 33 -51 52 -96 52h-130c-70 0 -118 -47 -118 -118v-250c0 -15 7 -22 21 -22h55
-c15 0 22 7 22 22v230c0 32 19 52 52 52h94c32 0 52 -20 52 -52v-230c0 -15 6 -22 21 -22h54c15 0 22 7 22 22v230c0 32 20 52 52 52h97c32 0 51 -20 51 -52v-230c0 -15 7 -22 22 -22h55c14 0 21 7 21 22zM1410 560v154c0 71 -48 118 -119 118h-264c-71 0 -119 -47 -119 -118
-v-410c0 -15 8 -21 22 -21h55c15 0 21 6 21 21v180c19 -26 49 -42 94 -42h191c71 0 119 48 119 118zM1536 1176v-1072c0 -128 -104 -232 -232 -232h-1072c-128 0 -232 104 -232 232v1072c0 128 104 232 232 232h1072c128 0 232 -104 232 -232z" />
-    <glyph glyph-name="long-arrow-left" unicode="&#xf177;" horiz-adv-x="1728" 
-d="M1728 736v-192c0 -18 -14 -32 -32 -32h-1248v-224c0 -13 -7 -24 -19 -29s-25 -3 -35 5l-384 350c-6 6 -10 14 -10 23s4 18 10 24l384 354c10 9 23 11 35 6c11 -5 19 -16 19 -29v-224h1248c18 0 32 -14 32 -32z" />
-    <glyph glyph-name="download" unicode="&#xf019;" horiz-adv-x="1664" 
-d="M1280 192c0 35 -29 64 -64 64s-64 -29 -64 -64s29 -64 64 -64s64 29 64 64zM1536 192c0 35 -29 64 -64 64s-64 -29 -64 -64s29 -64 64 -64s64 29 64 64zM1664 416v-320c0 -53 -43 -96 -96 -96h-1472c-53 0 -96 43 -96 96v320c0 53 43 96 96 96h465l135 -136
-c37 -36 85 -56 136 -56s99 20 136 56l136 136h464c53 0 96 -43 96 -96zM1339 985c10 -24 5 -52 -14 -70l-448 -448c-12 -13 -29 -19 -45 -19s-33 6 -45 19l-448 448c-19 18 -24 46 -14 70c10 23 33 39 59 39h256v448c0 35 29 64 64 64h256c35 0 64 -29 64 -64v-448h256
-c26 0 49 -16 59 -39z" />
-    <glyph glyph-name="bold" unicode="&#xf032;" horiz-adv-x="1408" 
-d="M555 15c44 -19 92 -32 140 -32c228 0 376 91 376 335c0 62 -8 127 -41 180c-93 150 -227 158 -388 158c-30 0 -73 0 -101 -10c0 -106 -1 -212 -1 -317c0 -69 -9 -256 15 -314zM541 761c36 -6 73 -7 109 -7c206 0 353 58 353 289c0 195 -173 262 -340 262
-c-44 0 -87 -6 -130 -13c0 -101 8 -202 8 -303c0 -53 -1 -106 -1 -159c0 -23 0 -46 1 -69zM0 -128l2 94c64 16 129 17 191 43c35 59 30 163 30 230c0 22 2 978 -22 1025c-15 29 -162 36 -195 40l-4 83c238 4 476 21 713 21c45 0 91 -1 136 -1c226 0 475 -108 475 -368
-c0 -179 -136 -246 -277 -310c190 -43 359 -172 359 -382c0 -344 -313 -458 -606 -458c-88 0 -176 6 -264 6c-179 0 -360 -16 -538 -23z" />
-    <glyph glyph-name="caret-down" unicode="&#xf0d7;" horiz-adv-x="1024" 
-d="M1024 832c0 -17 -7 -33 -19 -45l-448 -448c-12 -12 -28 -19 -45 -19s-33 7 -45 19l-448 448c-12 12 -19 28 -19 45c0 35 29 64 64 64h896c35 0 64 -29 64 -64z" />
-    <glyph glyph-name="chevron-left" unicode="&#xf053;" horiz-adv-x="1036" 
-d="M1017 1235l-531 -531l531 -531c25 -25 25 -65 0 -90l-166 -166c-25 -25 -65 -25 -90 0l-742 742c-25 25 -25 65 0 90l742 742c25 25 65 25 90 0l166 -166c25 -25 25 -65 0 -90z" />
-    <glyph glyph-name="venus" unicode="&#xf221;" horiz-adv-x="1152" 
-d="M1152 960c0 -296 -224 -540 -512 -572v-260h224c18 0 32 -14 32 -32v-64c0 -18 -14 -32 -32 -32h-224v-224c0 -18 -14 -32 -32 -32h-64c-18 0 -32 14 -32 32v224h-224c-18 0 -32 14 -32 32v64c0 18 14 32 32 32h224v260c-303 33 -535 302 -510 619
-c22 272 238 495 508 525c348 39 642 -232 642 -572zM128 960c0 -247 201 -448 448 -448s448 201 448 448s-201 448 -448 448s-448 -201 -448 -448z" />
-    <glyph glyph-name="font" unicode="&#xf031;" horiz-adv-x="1664" 
-d="M725 977l-170 -450c99 -1 198 -4 297 -4c19 0 38 1 57 2c-52 152 -113 307 -184 452zM0 -128l2 79c94 29 196 9 238 117l237 616l280 724h128c4 -7 8 -14 11 -21l205 -480c75 -177 144 -356 220 -532c45 -104 80 -211 130 -313c7 -16 21 -46 35 -57
-c33 -26 125 -32 172 -50c3 -19 6 -38 6 -57c0 -9 -1 -17 -1 -26c-127 0 -254 16 -381 16c-131 0 -262 -11 -393 -15c0 26 1 52 4 78l131 28c27 6 80 13 80 50c0 36 -129 333 -145 374l-450 2c-26 -58 -127 -320 -127 -358c0 -77 147 -80 204 -88c1 -19 1 -38 1 -58
-c0 -9 -1 -18 -2 -27c-116 0 -233 20 -349 20c-14 0 -34 -6 -48 -8c-63 -11 -125 -14 -188 -14z" />
-    <glyph glyph-name="pinterest" unicode="&#xf0d2;" 
-d="M1536 640c0 -424 -344 -768 -768 -768c-76 0 -148 11 -218 32c29 46 62 105 78 164c0 0 9 34 54 211c26 -51 104 -96 187 -96c247 0 415 225 415 527c0 227 -193 440 -487 440c-364 0 -548 -262 -548 -480c0 -132 50 -250 157 -294c17 -7 33 0 38 20c4 13 12 47 16 61
-c5 20 3 26 -11 43c-31 37 -51 84 -51 151c0 194 145 368 378 368c206 0 320 -126 320 -295c0 -221 -98 -408 -244 -408c-80 0 -140 66 -121 148c23 97 68 202 68 272c0 63 -34 116 -104 116c-82 0 -148 -85 -148 -199c0 0 0 -73 25 -122c-84 -356 -99 -418 -99 -418
-c-14 -58 -15 -123 -13 -177c-271 119 -460 389 -460 704c0 424 344 768 768 768s768 -344 768 -768z" />
-    <glyph glyph-name="sun" unicode="&#xf329;" horiz-adv-x="1707" 
-d="M1706 363c-3 -10 -11 -17 -20 -20l-292 -96v-306c0 -10 -5 -20 -13 -26c-9 -6 -19 -8 -29 -4l-292 94l-180 -248c-6 -8 -16 -13 -26 -13s-20 5 -26 13l-180 248l-292 -94c-10 -4 -20 -2 -29 4c-8 6 -13 16 -13 26v306l-292 96c-9 3 -17 10 -20 20s-2 21 4 29l180 248
-l-180 248c-6 9 -7 19 -4 29s11 17 20 20l292 96v306c0 10 5 20 13 26c9 6 19 8 29 4l292 -94l180 248c12 16 40 16 52 0l180 -248l292 94c10 4 20 2 29 -4c8 -6 13 -16 13 -26v-306l292 -96c9 -3 17 -10 20 -20s2 -20 -4 -29l-180 -248l180 -248c6 -8 7 -19 4 -29z" />
-    <glyph glyph-name="cart-plus" unicode="&#xf217;" horiz-adv-x="1664" 
-d="M1216 832c0 35 -29 64 -64 64h-128v128c0 35 -29 64 -64 64s-64 -29 -64 -64v-128h-128c-35 0 -64 -29 -64 -64s29 -64 64 -64h128v-128c0 -35 29 -64 64 -64s64 29 64 64v128h128c35 0 64 29 64 64zM640 0c0 -71 -57 -128 -128 -128s-128 57 -128 128s57 128 128 128
-s128 -57 128 -128zM1536 0c0 -71 -57 -128 -128 -128s-128 57 -128 128s57 128 128 128s128 -57 128 -128zM1664 1088v-512c0 -32 -24 -60 -57 -64l-1044 -122c4 -22 13 -47 13 -70s-14 -44 -24 -64h920c35 0 64 -29 64 -64s-29 -64 -64 -64h-1024c-35 0 -64 29 -64 64
-c0 31 47 108 61 137l-177 823h-204c-35 0 -64 29 -64 64s29 64 64 64h256c68 0 69 -80 79 -128h1201c35 0 64 -29 64 -64z" />
-    <glyph glyph-name="folder-open-o" unicode="&#xf115;" horiz-adv-x="1909" 
-d="M1781 605c0 28 -31 35 -53 35h-1088c-53 0 -123 -33 -157 -74l-294 -363c-9 -12 -18 -25 -18 -40c0 -28 31 -35 53 -35h1088c53 0 123 33 157 75l294 363c9 11 18 24 18 39zM640 768h768v160c0 53 -43 96 -96 96h-576c-53 0 -96 43 -96 96v64c0 53 -43 96 -96 96h-320
-c-53 0 -96 -43 -96 -96v-853l256 315c58 71 165 122 256 122zM1909 605c0 -44 -19 -86 -46 -120l-295 -363c-57 -70 -166 -122 -256 -122h-1088c-123 0 -224 101 -224 224v960c0 123 101 224 224 224h320c123 0 224 -101 224 -224v-32h544c123 0 224 -101 224 -224v-160h192
-c68 0 136 -31 166 -95c10 -21 15 -44 15 -68z" />
-    <glyph glyph-name="tachometer" unicode="&#xf0e4;" horiz-adv-x="1792" 
-d="M384 384c0 71 -57 128 -128 128s-128 -57 -128 -128s57 -128 128 -128s128 57 128 128zM576 832c0 71 -57 128 -128 128s-128 -57 -128 -128s57 -128 128 -128s128 57 128 128zM1004 351l101 382c8 34 -12 69 -46 78s-69 -12 -78 -46l-101 -382
-c-79 -6 -148 -61 -170 -142c-27 -103 35 -208 137 -235c103 -27 208 35 235 137c21 81 -13 163 -78 208zM1664 384c0 71 -57 128 -128 128s-128 -57 -128 -128s57 -128 128 -128s128 57 128 128zM1024 1024c0 71 -57 128 -128 128s-128 -57 -128 -128s57 -128 128 -128
-s128 57 128 128zM1472 832c0 71 -57 128 -128 128s-128 -57 -128 -128s57 -128 128 -128s128 57 128 128zM1792 384c0 -172 -49 -338 -141 -483c-12 -18 -32 -29 -54 -29h-1402c-22 0 -42 11 -54 29c-92 144 -141 311 -141 483c0 494 402 896 896 896s896 -402 896 -896z
-" />
-    <glyph glyph-name="creative-commons" unicode="&#xf25e;" horiz-adv-x="1792" 
-d="M605 303c-200 0 -344 142 -344 337c0 192 147 337 344 337c159 0 240 -92 243 -96c9 -11 10 -27 2 -39l-53 -78c-5 -8 -14 -13 -24 -14s-19 3 -26 10c0 0 -55 56 -138 56c-99 0 -170 -73 -170 -175c0 -103 73 -177 174 -177c92 0 155 67 156 67c7 8 17 12 27 11
-c10 -2 20 -8 24 -17l45 -82c7 -11 5 -26 -3 -36c-4 -4 -93 -104 -257 -104zM1235 303c-200 0 -344 142 -344 337c0 192 148 337 344 337c159 0 240 -92 243 -96c9 -11 10 -27 2 -39l-53 -78c-5 -8 -14 -13 -24 -14s-19 3 -26 10c0 0 -54 56 -138 56
-c-99 0 -170 -73 -170 -175c0 -103 73 -177 174 -177c92 0 155 67 156 67c7 8 17 12 27 11c11 -2 20 -8 25 -17l45 -82c6 -11 4 -26 -4 -36c-4 -4 -92 -104 -257 -104zM896 1376c-406 0 -736 -330 -736 -736s330 -736 736 -736s736 330 736 736s-330 736 -736 736zM896 1536
-c495 0 896 -401 896 -896s-401 -896 -896 -896s-896 401 -896 896s401 896 896 896z" />
-    <glyph glyph-name="clipboard" unicode="&#xf0ea;" horiz-adv-x="1792" 
-d="M768 -128h896v640h-416c-53 0 -96 43 -96 96v416h-384v-1152zM1024 1312v64c0 17 -15 32 -32 32h-704c-17 0 -32 -15 -32 -32v-64c0 -17 15 -32 32 -32h704c17 0 32 15 32 32zM1280 640h299l-299 299v-299zM1792 512v-672c0 -53 -43 -96 -96 -96h-960
-c-53 0 -96 43 -96 96v160h-544c-53 0 -96 43 -96 96v1344c0 53 43 96 96 96h1088c53 0 96 -43 96 -96v-328c13 -8 25 -17 36 -28l408 -408c38 -38 68 -111 68 -164z" />
-    <glyph glyph-name="eercast" unicode="&#xf2da;" horiz-adv-x="1719" 
-d="M1304 752c35 54 -6 191 -128 272c-121 81 -276 75 -312 21c-35 -53 40 -19 177 -70c226 -84 228 -277 263 -223zM1667 178c-283 -696 -1558 -520 -1531 383c3 115 35 192 68 302c-211 -864 966 -1367 1449 -685c18 25 23 23 14 0zM1428 627c0 -283 -228 -513 -509 -513
-s-509 230 -509 513s228 513 509 513s509 -230 509 -513zM1715 915c-356 808 -1826 510 -1663 -589c-338 1101 1055 1606 1570 822c42 -64 90 -176 93 -233zM1653 573c17 338 -217 569 -533 656c-5 0 -27 9 14 13c772 -26 800 -1260 -41 -1274c274 76 543 266 560 605z" />
-    <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="reply" unicode="&#xf112;" horiz-adv-x="1792" 
-d="M1792 416c0 -140 -70 -323 -127 -451c-11 -23 -22 -55 -37 -76c-7 -10 -14 -17 -28 -17c-20 0 -32 16 -32 35c0 16 4 34 5 50c3 41 5 82 5 123c0 477 -283 560 -714 560h-224v-256c0 -35 -29 -64 -64 -64c-17 0 -33 7 -45 19l-512 512c-12 12 -19 28 -19 45s7 33 19 45
-l512 512c12 12 28 19 45 19c35 0 64 -29 64 -64v-256h224c328 0 736 -58 875 -403c42 -106 53 -221 53 -333z" />
-    <glyph glyph-name="hourglass-half" unicode="&#xf252;" 
-d="M1408 1408c0 -370 -177 -638 -373 -768c196 -130 373 -398 373 -768h96c18 0 32 -14 32 -32v-64c0 -18 -14 -32 -32 -32h-1472c-18 0 -32 14 -32 32v64c0 18 14 32 32 32h96c0 370 177 638 373 768c-196 130 -373 398 -373 768h-96c-18 0 -32 14 -32 32v64
-c0 18 14 32 32 32h1472c18 0 32 -14 32 -32v-64c0 -18 -14 -32 -32 -32h-96zM1280 1408h-1024c0 -146 33 -275 85 -384h854c52 109 85 238 85 384zM1223 192c-74 193 -207 330 -340 384h-230c-133 -54 -266 -191 -340 -384h910z" />
-    <glyph glyph-name="microchip" unicode="&#xf2db;" 
-d="M192 256v-128h-112c-9 0 -16 7 -16 16v16h-48c-9 0 -16 7 -16 16v32c0 9 7 16 16 16h48v16c0 9 7 16 16 16h112zM192 512v-128h-112c-9 0 -16 7 -16 16v16h-48c-9 0 -16 7 -16 16v32c0 9 7 16 16 16h48v16c0 9 7 16 16 16h112zM192 768v-128h-112c-9 0 -16 7 -16 16v16
-h-48c-9 0 -16 7 -16 16v32c0 9 7 16 16 16h48v16c0 9 7 16 16 16h112zM192 1024v-128h-112c-9 0 -16 7 -16 16v16h-48c-9 0 -16 7 -16 16v32c0 9 7 16 16 16h48v16c0 9 7 16 16 16h112zM192 1280v-128h-112c-9 0 -16 7 -16 16v16h-48c-9 0 -16 7 -16 16v32c0 9 7 16 16 16
-h48v16c0 9 7 16 16 16h112zM1280 1440v-1472c0 -53 -43 -96 -96 -96h-832c-53 0 -96 43 -96 96v1472c0 53 43 96 96 96h832c53 0 96 -43 96 -96zM1536 208v-32c0 -9 -7 -16 -16 -16h-48v-16c0 -9 -7 -16 -16 -16h-112v128h112c9 0 16 -7 16 -16v-16h48c9 0 16 -7 16 -16z
-M1536 464v-32c0 -9 -7 -16 -16 -16h-48v-16c0 -9 -7 -16 -16 -16h-112v128h112c9 0 16 -7 16 -16v-16h48c9 0 16 -7 16 -16zM1536 720v-32c0 -9 -7 -16 -16 -16h-48v-16c0 -9 -7 -16 -16 -16h-112v128h112c9 0 16 -7 16 -16v-16h48c9 0 16 -7 16 -16zM1536 976v-32
-c0 -9 -7 -16 -16 -16h-48v-16c0 -9 -7 -16 -16 -16h-112v128h112c9 0 16 -7 16 -16v-16h48c9 0 16 -7 16 -16zM1536 1232v-32c0 -9 -7 -16 -16 -16h-48v-16c0 -9 -7 -16 -16 -16h-112v128h112c9 0 16 -7 16 -16v-16h48c9 0 16 -7 16 -16z" />
-    <glyph glyph-name="graduation-cap" unicode="&#xf19d;" horiz-adv-x="2304" 
-d="M1774 700l18 -316c8 -141 -287 -256 -640 -256s-648 115 -640 256l18 316l574 -181c16 -5 32 -7 48 -7s32 2 48 7zM2304 1024c0 -14 -9 -26 -22 -31l-1120 -352c-4 -1 -7 -1 -10 -1s-6 0 -10 1l-652 206c-57 -45 -97 -155 -105 -290c38 -22 63 -62 63 -109
-c0 -45 -23 -84 -58 -107l58 -433c1 -9 -2 -18 -8 -25s-15 -11 -24 -11h-192c-9 0 -18 4 -24 11s-9 16 -8 25l58 433c-35 23 -58 62 -58 107c0 48 27 89 65 111c6 117 36 243 98 330l-333 104c-13 5 -22 17 -22 31s9 26 22 31l1120 352c4 1 7 1 10 1s6 0 10 -1l1120 -352
-c13 -5 22 -17 22 -31z" />
-    <glyph glyph-name="info-circle" unicode="&#xf05a;" 
-d="M1024 160v160c0 18 -14 32 -32 32h-96v512c0 18 -14 32 -32 32h-320c-18 0 -32 -14 -32 -32v-160c0 -18 14 -32 32 -32h96v-320h-96c-18 0 -32 -14 -32 -32v-160c0 -18 14 -32 32 -32h448c18 0 32 14 32 32zM896 1056v160c0 18 -14 32 -32 32h-192c-18 0 -32 -14 -32 -32
-v-160c0 -18 14 -32 32 -32h192c18 0 32 14 32 32zM1536 640c0 -424 -344 -768 -768 -768s-768 344 -768 768s344 768 768 768s768 -344 768 -768z" />
-    <glyph glyph-name="barcode" unicode="&#xf02a;" horiz-adv-x="2176" 
-d="M0 1404h128v-1532h-128v1532zM2048 1408h128v-1536h-128v1536zM256 1408h128v-1280h-128v1280zM512 1408h256v-1280h-256v1280zM1280 1408h256v-1280h-256v1280zM1792 1408h128v-1280h-128v1280zM1024 1408h128v-1280h-128v1280zM256 0h128v-128h-128v128zM512 0h128
-v-128h-128v128zM768 0h128v-128h-128v128zM1024 0h128v-128h-128v128zM1280 0h128v-128h-128v128zM1536 0h128v-128h-128v128zM1792 0h128v-128h-128v128z" />
-    <glyph glyph-name="exchange" unicode="&#xf0ec;" horiz-adv-x="1792" 
-d="M1792 352v-192c0 -17 -15 -32 -32 -32h-1376v-192c0 -17 -14 -32 -32 -32c-9 0 -17 4 -24 10l-319 320c-6 6 -9 14 -9 22c0 9 3 17 9 23l320 320c6 6 15 9 23 9c17 0 32 -14 32 -32v-192h1376c17 0 32 -14 32 -32zM1792 896c0 -8 -3 -17 -9 -23l-320 -320
-c-6 -6 -15 -9 -23 -9c-17 0 -32 15 -32 32v192h-1376c-17 0 -32 15 -32 32v192c0 17 15 32 32 32h1376v192c0 18 14 32 32 32c9 0 17 -4 24 -10l319 -319c6 -6 9 -15 9 -23z" />
-    <glyph glyph-name="hand-o-up" unicode="&#xf0a6;" 
-d="M1280 -64c0 35 -29 64 -64 64s-64 -29 -64 -64s29 -64 64 -64s64 29 64 64zM1408 700c0 113 -46 189 -167 189c-19 0 -38 -2 -56 -5c-23 42 -80 65 -126 65c-24 0 -48 -6 -69 -18c-32 34 -72 53 -119 53c-32 0 -79 -14 -103 -35v331c0 69 -59 128 -128 128
-c-68 0 -128 -61 -128 -128v-576c-63 0 -128 96 -256 96c-96 0 -128 -75 -128 -160c0 -28 116 -79 139 -90c22 -12 44 -24 65 -37c53 -33 99 -71 145 -112c73 -64 163 -135 163 -241v-32h640v32c0 175 128 346 128 540zM1536 705c0 -112 -31 -218 -69 -322
-c-22 -61 -59 -160 -59 -223v-288c0 -71 -57 -128 -128 -128h-640c-71 0 -128 57 -128 128v288c0 48 -86 116 -119 145c-41 36 -82 70 -129 100c-93 58 -264 101 -264 235c0 159 87 288 256 288c44 0 87 -7 128 -22v374c0 138 117 256 255 256c140 0 257 -116 257 -256v-169
-c42 -3 82 -16 119 -37c14 2 29 3 43 3c64 0 128 -21 178 -60c189 2 300 -127 300 -312z" />
-    <glyph glyph-name="pause" unicode="&#xf04c;" 
-d="M1536 1344v-1408c0 -35 -29 -64 -64 -64h-512c-35 0 -64 29 -64 64v1408c0 35 29 64 64 64h512c35 0 64 -29 64 -64zM640 1344v-1408c0 -35 -29 -64 -64 -64h-512c-35 0 -64 29 -64 64v1408c0 35 29 64 64 64h512c35 0 64 -29 64 -64z" />
-    <glyph glyph-name="github-square" unicode="&#xf092;" 
-d="M519 336c2 3 1 9 -3 13c-5 4 -11 5 -14 2c-2 -3 -1 -9 3 -13c5 -4 11 -5 14 -2zM491 377c-3 4 -8 6 -12 4c-3 -2 -3 -8 0 -12c4 -5 9 -7 12 -5s3 8 0 13zM450 417c1 2 -1 6 -5 8c-3 1 -7 1 -8 -2c-2 -3 0 -6 4 -8c4 -1 8 -1 9 2zM471 394c2 2 2 7 -2 10c-3 4 -8 5 -10 3
-c-3 -3 -2 -7 1 -11c3 -3 8 -5 11 -2zM557 319c1 4 -3 9 -9 11s-11 0 -13 -4c-1 -4 3 -9 9 -11s11 0 13 4zM599 316c0 4 -5 8 -12 8c-6 0 -10 -4 -10 -8s5 -8 11 -8s11 4 11 8zM638 323c-1 4 -7 6 -13 5s-10 -5 -9 -9s6 -7 12 -6s10 6 10 10zM1280 640
-c0 283 -229 512 -512 512s-512 -229 -512 -512c0 -226 147 -418 350 -486c26 -5 35 11 35 25c0 12 0 52 -1 95c0 0 -142 -31 -172 61c0 0 -23 59 -57 74c0 0 -46 32 4 32c0 0 50 -4 78 -53c45 -79 120 -56 149 -43c5 33 18 56 33 69c-114 13 -234 57 -234 253
-c0 56 20 101 53 137c-5 13 -23 65 5 136c43 13 141 -53 141 -53c41 12 84 17 128 17s87 -5 128 -17c0 0 98 66 141 53c28 -71 10 -123 5 -136c33 -36 53 -81 53 -137c0 -197 -120 -240 -234 -253c18 -16 35 -47 35 -95c0 -68 -1 -123 -1 -140c0 -14 9 -30 35 -25
-c203 68 350 260 350 486zM1536 1120v-960c0 -159 -129 -288 -288 -288h-960c-159 0 -288 129 -288 288v960c0 159 129 288 288 288h960c159 0 288 -129 288 -288z" />
-    <glyph glyph-name="search" unicode="&#xf002;" horiz-adv-x="1664" 
-d="M1152 704c0 247 -201 448 -448 448s-448 -201 -448 -448s201 -448 448 -448s448 201 448 448zM1664 -128c0 -70 -58 -128 -128 -128c-34 0 -67 14 -90 38l-343 342c-117 -81 -257 -124 -399 -124c-389 0 -704 315 -704 704s315 704 704 704s704 -315 704 -704
-c0 -142 -43 -282 -124 -399l343 -343c23 -23 37 -56 37 -90z" />
-    <glyph glyph-name="mixcloud" unicode="&#xf289;" horiz-adv-x="2304" 
-d="M1645 438c0 80 -51 148 -121 175c-5 -31 -13 -62 -23 -92c-10 -32 -40 -52 -72 -52c-8 0 -16 1 -24 3c-41 14 -62 57 -49 97c15 46 23 94 23 143c0 250 -204 454 -455 454c-180 0 -342 -107 -414 -267c70 -18 135 -54 188 -106c30 -30 30 -79 0 -109s-79 -30 -109 0
-c-48 48 -112 75 -180 75c-141 0 -256 -114 -256 -255s115 -255 256 -255h1046c105 0 190 85 190 189zM1798 438c0 -189 -154 -342 -343 -342h-1046c-226 0 -409 183 -409 408c0 205 152 374 349 403c83 244 314 412 575 412c315 0 575 -241 605 -548
-c153 -33 269 -170 269 -333zM2048 438c0 -114 -33 -224 -97 -319c-15 -22 -39 -33 -64 -33c-15 0 -30 4 -43 13c-35 23 -44 71 -20 106c47 69 71 149 71 233c0 83 -24 164 -71 233c-24 35 -15 82 20 106s83 14 107 -21c64 -94 97 -204 97 -318zM2304 438
-c0 -159 -46 -312 -134 -443c-15 -22 -39 -34 -64 -34c-14 0 -29 4 -42 13c-35 24 -45 71 -21 106c70 106 108 230 108 358s-38 252 -108 357c-24 35 -14 83 21 106c35 24 82 15 106 -21c88 -130 134 -283 134 -442z" />
-    <glyph glyph-name="snowflake-o" unicode="&#xf2dc;" horiz-adv-x="1570" 
-d="M1519 419l-167 -33l186 -107c30 -17 41 -57 23 -87s-57 -41 -87 -23l-186 106l55 -160c28 -80 -94 -121 -121 -42l-102 300l-271 156v-313l208 -238c56 -63 -41 -148 -96 -84l-112 128v-214c0 -35 -29 -64 -64 -64s-64 29 -64 64v214l-112 -128c-55 -64 -152 21 -96 84
-l208 238v313l-271 -156l-102 -300c-27 -79 -149 -38 -121 42l55 160l-186 -106c-30 -18 -69 -7 -87 23s-7 70 23 87l186 107l-167 33c-83 17 -58 142 25 126l310 -62l271 157l-271 157l-310 -62c-4 -1 -9 -1 -13 -1c-76 0 -87 112 -12 127l167 33l-186 107
-c-30 17 -41 57 -23 87c18 31 57 41 87 23l186 -106l-55 160c-28 80 94 121 121 42l102 -300l271 -156v313l-208 238c-56 63 41 148 96 84l112 -128v214c0 35 29 64 64 64s64 -29 64 -64v-214l112 128c55 64 152 -21 96 -84l-208 -238v-313l271 156l102 300
-c27 79 149 38 121 -42l-55 -160l186 106c30 18 69 7 87 -23s7 -70 -23 -87l-186 -107l167 -33c75 -15 64 -127 -12 -127c-4 0 -9 0 -13 1l-310 62l-271 -157l271 -157l310 62c83 16 108 -109 25 -126z" />
-    <glyph glyph-name="flask" unicode="&#xf0c3;" horiz-adv-x="1458" 
-d="M1424 88c75 -119 22 -216 -119 -216h-1152c-141 0 -194 97 -119 216l503 793v399h-64c-35 0 -64 29 -64 64s29 64 64 64h512c35 0 64 -29 64 -64s-29 -64 -64 -64h-64v-399zM645 813l-272 -429h712l-272 429l-20 31v436h-128v-436z" />
-    <glyph glyph-name="pinterest-square" unicode="&#xf0d3;" 
-d="M1248 1408c159 0 288 -129 288 -288v-960c0 -159 -129 -288 -288 -288h-725c33 47 87 128 108 210c0 0 9 34 53 209c27 -51 104 -95 186 -95c244 0 410 223 410 521c0 225 -191 435 -481 435c-361 0 -543 -259 -543 -475c0 -130 50 -246 156 -290c17 -7 33 0 38 19
-c3 13 11 47 15 61c5 19 3 26 -11 42c-30 37 -50 83 -50 150c0 192 144 363 374 363c204 0 316 -124 316 -291c0 -219 -97 -404 -241 -404c-79 0 -139 66 -120 147c23 96 67 200 67 269c0 62 -33 114 -102 114c-81 0 -146 -84 -146 -196c0 0 0 -72 24 -121
-c-83 -352 -98 -414 -98 -414c-22 -92 -13 -199 -7 -254h-183c-159 0 -288 129 -288 288v960c0 159 129 288 288 288h960z" />
-    <glyph glyph-name="fast-backward" unicode="&#xf049;" horiz-adv-x="1792" 
-d="M1747 1395c25 25 45 16 45 -19v-1472c0 -35 -20 -44 -45 -19l-710 710c-6 6 -10 12 -13 19v-710c0 -35 -20 -44 -45 -19l-710 710c-6 6 -10 12 -13 19v-678c0 -35 -29 -64 -64 -64h-128c-35 0 -64 29 -64 64v1408c0 35 29 64 64 64h128c35 0 64 -29 64 -64v-678
-c3 7 7 13 13 19l710 710c25 25 45 16 45 -19v-710c3 7 7 13 13 19z" />
-    <glyph glyph-name="volume-control-phone" unicode="&#xf2a0;" horiz-adv-x="1408" 
-d="M617 -153c0 -34 -90 -84 -119 -95c-15 -6 -30 -8 -45 -8c-33 0 -66 9 -98 18c-164 49 -203 149 -268 290c-70 151 -87 295 -87 460s17 309 87 460c65 141 104 241 268 290c32 9 65 18 98 18c15 0 30 -2 45 -8c29 -11 119 -61 119 -95c0 -24 -53 -194 -64 -234
-c-6 -25 -8 -66 -27 -84c-13 -12 -34 -14 -51 -14c-47 0 -94 11 -141 11c-14 0 -35 -1 -47 -11c-16 -13 -24 -58 -30 -78c-24 -83 -37 -168 -37 -255s13 -172 37 -255c6 -20 14 -65 30 -78c12 -10 33 -11 47 -11c47 0 94 11 141 11c17 0 38 -2 51 -14c19 -18 21 -59 27 -84
-c11 -40 64 -210 64 -234zM776 760c-17 0 -33 7 -45 19c-25 25 -26 66 0 91c24 24 37 56 37 90s-13 66 -37 91c-26 25 -25 65 0 90s65 25 90 0c48 -48 75 -113 75 -181s-27 -133 -75 -181c-13 -12 -29 -19 -45 -19zM957 579c-17 0 -33 6 -45 19c-25 25 -25 65 0 90
-c72 73 112 169 112 272s-40 199 -112 272c-25 25 -25 65 0 90s65 25 90 0c97 -97 150 -225 150 -362s-53 -265 -150 -362c-12 -13 -29 -19 -45 -19zM1138 398c-17 0 -33 6 -45 19c-25 25 -25 65 0 90c120 121 187 282 187 453s-67 332 -187 453c-25 25 -25 65 0 90
-s65 25 90 0c145 -145 225 -338 225 -543s-80 -398 -225 -543c-12 -13 -29 -19 -45 -19z" />
-    <glyph glyph-name="biometric" unicode="&#xf32b;" horiz-adv-x="2304" 
-d="M1419 640c0 -147 -120 -267 -267 -267s-267 120 -267 267s120 267 267 267s267 -120 267 -267zM0 1222h2304v-521h-769c-29 185 -190 327 -383 327s-354 -142 -383 -327h-769v521zM0 579h769c29 -185 190 -327 383 -327s354 142 383 327h769v-521h-2304v521z" />
-    <glyph glyph-name="tasks" unicode="&#xf0ae;" horiz-adv-x="1792" 
-d="M1024 128h640v128h-640v-128zM640 640h1024v128h-1024v-128zM1280 1152h384v128h-384v-128zM1792 320v-256c0 -35 -29 -64 -64 -64h-1664c-35 0 -64 29 -64 64v256c0 35 29 64 64 64h1664c35 0 64 -29 64 -64zM1792 832v-256c0 -35 -29 -64 -64 -64h-1664
-c-35 0 -64 29 -64 64v256c0 35 29 64 64 64h1664c35 0 64 -29 64 -64zM1792 1344v-256c0 -35 -29 -64 -64 -64h-1664c-35 0 -64 29 -64 64v256c0 35 29 64 64 64h1664c35 0 64 -29 64 -64z" />
-    <glyph glyph-name="firefox" unicode="&#xf269;" horiz-adv-x="1792" 
-d="M903 -256c-386 0 -693 226 -834 549c-158 359 -32 934 249 1188l-11 -281c14 18 121 23 138 0c58 111 245 194 395 197c-57 -48 -189 -223 -178 -312c73 -23 185 -24 244 -28c18 -10 15 -71 -21 -121c0 0 -47 -65 -174 -88l15 -189l-139 67c-45 -114 63 -215 175 -196
-c124 21 168 102 255 97c86 -5 120 -53 109 -98c0 0 -14 -54 -107 -45c-79 -125 -184 -180 -354 -165c258 -214 606 -20 694 155c88 174 11 433 -77 506c104 -45 176 -91 214 -192c20 224 -83 478 -267 627c346 -101 557 -369 563 -797s-379 -874 -889 -874z" />
-    <glyph glyph-name="apple" unicode="&#xf179;" horiz-adv-x="1393" 
-d="M1393 321c-25 -79 -65 -163 -123 -250c-86 -131 -172 -196 -257 -196c-34 0 -80 11 -140 32c-59 22 -110 32 -151 32c-40 0 -88 -11 -142 -33c-55 -23 -99 -34 -132 -34c-103 0 -202 87 -301 259c-97 172 -147 339 -147 503c0 153 38 277 113 374c75 96 169 144 284 144
-c49 0 107 -10 177 -30c69 -20 115 -30 138 -30c29 0 77 11 143 34c66 22 124 34 173 34c80 0 151 -22 213 -65c35 -24 70 -58 104 -100c-52 -44 -90 -83 -114 -118c-43 -62 -65 -131 -65 -207c0 -82 23 -157 69 -223s99 -108 158 -126zM1017 1494c0 -41 -10 -87 -29 -136
-c-20 -50 -51 -96 -93 -138c-36 -36 -72 -60 -108 -72c-23 -7 -57 -13 -104 -17c2 99 28 185 78 257s134 121 250 148c2 -9 4 -16 5 -22c0 -7 1 -13 1 -20z" />
-    <glyph glyph-name="gamepad" unicode="&#xf11b;" horiz-adv-x="1920" 
-d="M832 448v128c0 18 -14 32 -32 32h-192v192c0 18 -14 32 -32 32h-128c-18 0 -32 -14 -32 -32v-192h-192c-18 0 -32 -14 -32 -32v-128c0 -18 14 -32 32 -32h192v-192c0 -18 14 -32 32 -32h128c18 0 32 14 32 32v192h192c18 0 32 14 32 32zM1408 384c0 71 -57 128 -128 128
-s-128 -57 -128 -128s57 -128 128 -128s128 57 128 128zM1664 640c0 71 -57 128 -128 128s-128 -57 -128 -128s57 -128 128 -128s128 57 128 128zM1920 512c0 -283 -229 -512 -512 -512c-130 0 -248 49 -338 128h-220c-90 -79 -208 -128 -338 -128c-283 0 -512 229 -512 512
-s229 512 512 512h896c283 0 512 -229 512 -512z" />
-    <glyph glyph-name="cc-stripe" unicode="&#xf1f5;" horiz-adv-x="2304" 
-d="M1597 633c0 -46 -7 -81 -21 -106c-12 -22 -31 -35 -52 -35c-15 0 -29 3 -41 9v224c26 27 49 30 57 30c38 0 57 -42 57 -122zM2035 669h-110c4 67 22 98 56 98s52 -32 54 -98zM476 534c0 84 -51 119 -134 149c-44 16 -68 29 -68 49c0 17 14 26 38 26c46 0 92 -17 124 -33
-l18 112c-25 12 -77 32 -149 32c-51 0 -93 -13 -123 -38c-32 -26 -48 -64 -48 -109c0 -82 50 -118 132 -147c52 -19 70 -32 70 -53c0 -20 -17 -31 -48 -31c-38 0 -101 19 -142 43l-18 -113c35 -20 100 -41 168 -41c54 0 98 13 129 37c34 27 51 66 51 117zM771 749l19 111h-96
-v135l-129 -21l-18 -114l-46 -8l-17 -103h62v-219c0 -57 15 -96 44 -120c25 -20 61 -30 111 -30c39 0 62 7 79 11v118c-9 -2 -30 -7 -44 -7c-29 0 -42 16 -42 50v197h77zM1087 724v139c-10 2 -19 3 -28 3c-42 0 -76 -22 -89 -62l-10 56h-131v-471h150v306c19 23 46 31 82 31
-c8 0 16 0 26 -2zM1124 389h150v471h-150v-471zM1746 638c0 80 -15 141 -45 179c-27 35 -64 52 -111 52c-43 0 -81 -18 -117 -56l-8 47h-132v-645l150 25v151c23 -7 47 -11 68 -11c37 0 92 10 134 56c41 44 61 112 61 202zM1278 986c0 44 -35 79 -79 79s-79 -35 -79 -79
-s35 -80 79 -80s79 36 79 80zM2176 629c0 75 -16 134 -48 176c-33 42 -82 64 -144 64c-128 0 -207 -94 -207 -246c0 -84 21 -148 63 -188c37 -37 91 -55 161 -55c64 0 123 15 160 40l-16 103c-37 -20 -80 -31 -128 -31c-29 0 -49 6 -63 19c-16 13 -25 35 -28 66h248
-c1 7 2 41 2 52zM2304 1280v-1280c0 -70 -58 -128 -128 -128h-2048c-70 0 -128 58 -128 128v1280c0 70 58 128 128 128h2048c70 0 128 -58 128 -128z" />
-    <glyph glyph-name="quote-left" unicode="&#xf10d;" horiz-adv-x="1664" 
-d="M768 576v-384c0 -106 -86 -192 -192 -192h-384c-106 0 -192 86 -192 192v704c0 282 230 512 512 512h64c35 0 64 -29 64 -64v-128c0 -35 -29 -64 -64 -64h-64c-141 0 -256 -115 -256 -256v-32c0 -53 43 -96 96 -96h224c106 0 192 -86 192 -192zM1664 576v-384
-c0 -106 -86 -192 -192 -192h-384c-106 0 -192 86 -192 192v704c0 282 230 512 512 512h64c35 0 64 -29 64 -64v-128c0 -35 -29 -64 -64 -64h-64c-141 0 -256 -115 -256 -256v-32c0 -53 43 -96 96 -96h224c106 0 192 -86 192 -192z" />
-    <glyph glyph-name="user-times" unicode="&#xf235;" horiz-adv-x="2039" 
-d="M704 640c-212 0 -384 172 -384 384s172 384 384 384s384 -172 384 -384s-172 -384 -384 -384zM1781 320l249 -249c6 -6 9 -14 9 -23c0 -8 -3 -16 -9 -22l-136 -136c-6 -6 -14 -9 -22 -9c-9 0 -17 3 -23 9l-249 249l-249 -249c-6 -6 -14 -9 -23 -9c-8 0 -16 3 -22 9
-l-136 136c-6 6 -9 14 -9 22c0 9 3 17 9 23l249 249l-249 249c-6 6 -9 14 -9 23c0 8 3 16 9 22l136 136c6 6 14 9 22 9c9 0 17 -3 23 -9l249 -249l249 249c6 6 14 9 23 9c8 0 16 -3 22 -9l136 -136c6 -6 9 -14 9 -22c0 -9 -3 -17 -9 -23zM1283 320l-181 -181
-c-24 -24 -37 -57 -37 -91c0 -33 13 -66 37 -90l83 -83c-14 -2 -29 -3 -44 -3h-874c-160 0 -267 96 -267 259c0 226 53 573 346 573c16 0 27 -7 39 -17c96 -76 194 -122 319 -122s223 46 319 122c12 10 23 17 39 17c19 0 38 -2 57 -6c-33 -32 -54 -58 -54 -106
-c0 -34 13 -67 37 -91z" />
-    <glyph glyph-name="plus-square-o" unicode="&#xf196;" horiz-adv-x="1408" 
-d="M1152 736v-64c0 -18 -14 -32 -32 -32h-352v-352c0 -18 -14 -32 -32 -32h-64c-18 0 -32 14 -32 32v352h-352c-18 0 -32 14 -32 32v64c0 18 14 32 32 32h352v352c0 18 14 32 32 32h64c18 0 32 -14 32 -32v-352h352c18 0 32 -14 32 -32zM1280 288v832c0 88 -72 160 -160 160
-h-832c-88 0 -160 -72 -160 -160v-832c0 -88 72 -160 160 -160h832c88 0 160 72 160 160zM1408 1120v-832c0 -159 -129 -288 -288 -288h-832c-159 0 -288 129 -288 288v832c0 159 129 288 288 288h832c159 0 288 -129 288 -288z" />
-    <glyph glyph-name="eye-slash" unicode="&#xf070;" horiz-adv-x="1792" 
-d="M555 201l78 141c-116 84 -185 219 -185 362c0 79 21 157 61 225c-156 -80 -286 -206 -381 -353c104 -161 251 -296 427 -375zM944 960c0 26 -22 48 -48 48c-167 0 -304 -137 -304 -304c0 -26 22 -48 48 -48s48 22 48 48c0 115 94 208 208 208c26 0 48 22 48 48z
-M1307 1151c0 -2 0 -7 -1 -9c-211 -377 -420 -756 -631 -1133l-49 -89c-6 -10 -17 -16 -28 -16c-18 0 -113 58 -134 70c-10 6 -16 16 -16 28c0 16 34 70 44 87c-194 88 -357 238 -472 418c-13 20 -20 44 -20 69c0 24 7 49 20 69c198 304 507 507 876 507c60 0 121 -6 180 -17
-l54 97c6 10 16 16 28 16c18 0 112 -58 133 -70c10 -6 16 -16 16 -27zM1344 704c0 -186 -115 -352 -288 -418l280 502c5 -28 8 -56 8 -84zM1792 576c0 -26 -7 -47 -20 -69c-31 -51 -70 -100 -109 -145c-196 -225 -466 -362 -767 -362l74 132c291 25 538 202 694 444
-c-74 115 -169 216 -282 294l63 112c124 -83 249 -208 327 -337c13 -22 20 -43 20 -69z" />
-    <glyph glyph-name="trello" unicode="&#xf181;" 
-d="M704 192v1024c0 18 -14 32 -32 32h-480c-18 0 -32 -14 -32 -32v-1024c0 -18 14 -32 32 -32h480c18 0 32 14 32 32zM1376 576v640c0 18 -14 32 -32 32h-480c-18 0 -32 -14 -32 -32v-640c0 -18 14 -32 32 -32h480c18 0 32 14 32 32zM1536 1344v-1408c0 -35 -29 -64 -64 -64
-h-1408c-35 0 -64 29 -64 64v1408c0 35 29 64 64 64h1408c35 0 64 -29 64 -64z" />
-    <glyph glyph-name="dribbble" unicode="&#xf17d;" 
-d="M1024 36c-10 58 -48 258 -140 498c-1 0 -3 -1 -4 -1c0 0 -389 -136 -515 -410c-6 5 -15 11 -15 11c114 -93 259 -150 418 -150c91 0 177 19 256 52zM839 643c-16 37 -34 74 -53 111c-338 -101 -662 -93 -673 -93c-1 -7 -1 -14 -1 -21c0 -168 64 -322 168 -438
-c179 319 533 433 533 433c9 3 18 5 26 8zM732 855c-114 202 -235 366 -244 378c-183 -86 -319 -255 -362 -458c17 0 291 -3 606 80zM1416 536c-14 4 -197 62 -409 29c86 -237 121 -430 128 -469c147 99 251 257 281 440zM611 1277c-1 0 -1 0 -2 -1c0 0 1 1 2 1zM1201 1132
-c-115 102 -267 164 -433 164c-53 0 -105 -7 -155 -19c10 -13 134 -176 246 -382c247 92 340 234 342 237zM1424 647c-2 155 -57 298 -149 410c-2 -2 -107 -154 -366 -260c15 -31 30 -63 44 -95c5 -11 9 -23 14 -34c226 29 449 -20 457 -21zM1536 640
-c0 -424 -344 -768 -768 -768s-768 344 -768 768s344 768 768 768s768 -344 768 -768z" />
-    <glyph glyph-name="user-secret" unicode="&#xf21b;" horiz-adv-x="1408" 
-d="M576 0l96 448l-96 128l-128 64zM832 0l128 640l-128 -64l-96 -128zM992 1010c-1 2 -2 4 -4 6c-9 7 -81 8 -96 8c-57 0 -111 -8 -167 -19c-7 -2 -14 -2 -21 -2s-14 0 -21 2c-56 11 -110 19 -167 19c-15 0 -87 -1 -96 -8c-2 -2 -3 -4 -4 -6c1 -9 2 -18 4 -27
-c6 -8 11 -5 15 -17c26 -71 38 -126 128 -126c129 0 93 119 135 119h12c42 0 6 -119 135 -119c90 0 102 55 128 126c4 12 9 9 15 17c2 9 3 18 4 27zM1408 131c0 -163 -107 -259 -267 -259h-874c-160 0 -267 96 -267 259c0 181 32 455 218 545l-90 220h214
-c-14 41 -22 84 -22 128c0 11 1 22 2 32c-39 8 -194 40 -194 96c0 59 170 91 210 99c21 75 71 189 122 248c20 23 45 37 76 37c60 0 108 -62 168 -62s108 62 168 62c31 0 56 -14 76 -37c51 -59 101 -173 122 -248c40 -8 210 -40 210 -99c0 -56 -155 -88 -194 -96
-c5 -54 -2 -108 -20 -160h214l-82 -225c179 -93 210 -362 210 -540z" />
-    <glyph glyph-name="cloud" unicode="&#xf0c2;" horiz-adv-x="1920" 
-d="M1920 384c0 -212 -172 -384 -384 -384h-1088c-247 0 -448 201 -448 448c0 179 106 334 258 405c-1 14 -2 29 -2 43c0 283 229 512 512 512c214 0 397 -131 474 -318c44 39 102 62 166 62c141 0 256 -115 256 -256c0 -51 -15 -98 -41 -138c170 -40 297 -192 297 -374z" />
-    <glyph glyph-name="usd" unicode="&#xf155;" horiz-adv-x="932" 
-d="M932 351c0 -204 -146 -365 -358 -400v-175c0 -18 -14 -32 -32 -32h-135c-17 0 -32 14 -32 32v175c-234 33 -362 173 -367 179c-10 12 -11 29 -2 41l103 135c5 7 14 11 23 12s18 -2 24 -9c2 -1 142 -135 319 -135c98 0 204 52 204 165c0 96 -118 143 -253 197
-c-180 71 -404 161 -404 412c0 184 144 336 353 376v180c0 18 15 32 32 32h135c18 0 32 -14 32 -32v-176c203 -23 311 -133 315 -137c10 -11 12 -26 5 -38l-81 -146c-5 -9 -13 -15 -23 -16c-10 -2 -19 1 -27 7c-1 1 -122 108 -272 108c-127 0 -215 -63 -215 -154
-c0 -106 122 -153 264 -208c184 -71 392 -152 392 -393z" />
-    <glyph glyph-name="eye" unicode="&#xf06e;" horiz-adv-x="1792" 
-d="M1664 576c-95 147 -225 273 -381 353c40 -68 61 -146 61 -225c0 -247 -201 -448 -448 -448s-448 201 -448 448c0 79 21 157 61 225c-156 -80 -286 -206 -381 -353c171 -264 447 -448 768 -448s597 184 768 448zM944 960c0 26 -22 48 -48 48c-167 0 -304 -137 -304 -304
-c0 -26 22 -48 48 -48s48 22 48 48c0 114 94 208 208 208c26 0 48 22 48 48zM1792 576c0 -25 -8 -48 -20 -69c-184 -303 -521 -507 -876 -507s-692 205 -876 507c-12 21 -20 44 -20 69s8 48 20 69c184 302 521 507 876 507s692 -205 876 -507c12 -21 20 -44 20 -69z" />
-    <glyph glyph-name="usb" unicode="&#xf287;" horiz-adv-x="2304" 
-d="M2288 731c10 -5 16 -16 16 -27s-6 -22 -16 -27l-320 -192c-5 -3 -10 -5 -16 -5c-5 0 -11 1 -16 4c-10 6 -16 16 -16 28v128h-858c32 -50 59 -109 83 -165c48 -108 97 -219 167 -219h96v96c0 18 14 32 32 32h320c18 0 32 -14 32 -32v-320c0 -18 -14 -32 -32 -32h-320
-c-18 0 -32 14 -32 32v96h-96c-153 0 -222 157 -284 295c-47 107 -96 217 -164 217h-360c-29 -110 -129 -192 -248 -192c-141 0 -256 115 -256 256s115 256 256 256c119 0 219 -82 248 -192h104c68 0 117 110 164 217c62 138 131 295 284 295h107c27 75 97 128 181 128
-c106 0 192 -86 192 -192s-86 -192 -192 -192c-84 0 -154 53 -181 128h-107c-70 0 -119 -111 -167 -219c-24 -56 -51 -115 -83 -165h1114v128c0 12 6 22 16 28s23 5 32 -1z" />
-    <glyph glyph-name="certificate" unicode="&#xf0a3;" 
-d="M1376 640l138 -135c19 -18 26 -45 20 -70c-7 -25 -27 -45 -52 -51l-188 -48l53 -186c7 -25 0 -52 -19 -70c-18 -19 -45 -26 -70 -19l-186 53l-48 -188c-6 -25 -26 -45 -51 -52c-6 -1 -13 -2 -19 -2c-19 0 -38 8 -51 22l-135 138l-135 -138c-18 -19 -45 -26 -70 -20
-c-26 7 -45 27 -51 52l-48 188l-186 -53c-25 -7 -52 0 -70 19c-19 18 -26 45 -19 70l53 186l-188 48c-25 6 -45 26 -52 51c-6 25 1 52 20 70l138 135l-138 135c-19 18 -26 45 -20 70c7 25 27 45 52 51l188 48l-53 186c-7 25 0 52 19 70c18 19 45 26 70 19l186 -53l48 188
-c6 25 26 45 51 51c25 7 52 0 70 -19l135 -139l135 139c18 19 44 26 70 19c25 -6 45 -26 51 -51l48 -188l186 53c25 7 52 0 70 -19c19 -18 26 -45 19 -70l-53 -186l188 -48c25 -6 45 -26 52 -51c6 -25 -1 -52 -20 -70z" />
-    <glyph glyph-name="500px" unicode="&#xf26e;" horiz-adv-x="1394" 
-d="M1387 -11l-6 -6c-75 -75 -162 -134 -259 -175c-101 -42 -207 -64 -317 -64s-217 22 -317 64c-97 41 -185 100 -259 175c-75 74 -134 161 -175 258c-25 61 -45 124 -54 189c-4 28 35 34 48 36c31 5 52 3 56 -20c1 -1 1 -2 1 -4c4 -20 14 -80 46 -159
-c33 -82 84 -158 152 -226c65 -65 141 -116 226 -152c87 -37 180 -56 276 -56c95 0 188 19 276 56c84 36 160 87 225 152l6 6c7 7 15 9 25 6c9 -2 20 -10 33 -22c32 -33 25 -49 17 -58zM915 604l-66 -66l63 -63c7 -7 20 -22 -7 -49c-11 -11 -22 -17 -32 -17
-c-7 0 -13 3 -19 10l-62 61l-66 -66c-2 -2 -7 -5 -15 -5c-9 0 -20 5 -31 16l-2 2c-7 6 -18 17 -18 29c0 6 3 11 8 17l66 65l-66 66c-11 11 -6 25 14 45c12 12 22 18 31 18c5 0 9 -2 13 -5l65 -66l65 65c11 11 29 6 48 -13c12 -12 25 -29 11 -44zM1386 547
-c0 -79 -16 -156 -46 -228c-30 -70 -72 -132 -126 -186s-117 -96 -187 -126c-72 -31 -149 -46 -228 -46s-156 15 -228 46c-70 30 -133 72 -187 126s-96 116 -125 186c-6 13 -15 38 -15 40h-1c-9 28 31 40 43 44c29 9 51 13 60 -12c24 -64 61 -126 97 -167h1v341
-c2 84 37 169 102 232c67 66 157 103 253 103c196 0 355 -158 355 -352c0 -196 -160 -355 -355 -355c-39 0 -68 3 -112 16c-5 2 -28 12 -13 61c4 13 16 51 44 43c2 0 51 -12 77 -12c139 0 248 108 248 246c0 65 -26 126 -72 171c-46 46 -108 71 -175 71
-c-69 0 -132 -28 -178 -80c-40 -45 -64 -105 -64 -160v-413c72 -44 155 -67 242 -67c128 0 252 51 341 140c90 90 140 211 140 338c0 128 -50 248 -141 339c-90 90 -210 140 -339 140s-250 -50 -340 -140c-1 -1 -58 -60 -77 -87l-2 -2c-12 -17 -23 -33 -73 -22
-c-25 6 -52 21 -52 43v680c0 18 14 38 38 38h877c30 0 30 -42 30 -55c0 -14 0 -55 -30 -55h-811v-483h1c56 59 153 121 210 145c71 30 151 46 231 46c79 0 156 -15 228 -46c70 -30 133 -72 187 -126s96 -116 126 -186c30 -73 46 -149 46 -229zM1355 1128
-c19 -17 6 -35 -13 -57c-12 -12 -25 -26 -39 -26c-6 0 -11 2 -16 7c-72 62 -137 104 -207 133c-87 38 -180 56 -276 56c-85 0 -178 -17 -262 -49c-26 -10 -40 24 -45 37c-6 16 -9 29 -8 38c2 10 7 17 16 20c82 36 194 57 299 57c109 0 216 -22 316 -64
-c92 -39 167 -87 235 -152z" />
-    <glyph glyph-name="liberapay-square" unicode="&#xf2e8;" horiz-adv-x="1533" 
-d="M148 1404h1236c82 0 149 -66 149 -148v-1236c0 -82 -67 -148 -149 -148h-1236c-82 0 -148 66 -148 148v1236c0 82 66 148 148 148zM736 1150v0l-161 -25l-133 -553c-8 -33 -12 -64 -12 -93s6 -54 18 -76s32 -40 60 -53s68 -19 117 -19l31 128c-18 1 -32 4 -42 9
-s-18 12 -22 20s-5 17 -5 27s1 23 4 35zM985 902v0c-42 0 -80 -3 -116 -10s-67 -14 -95 -22l-174 -722h155l47 189c24 -4 47 -6 71 -6c49 0 94 8 135 25s76 41 106 72s52 67 69 109s25 88 25 139c0 31 -4 61 -13 88s-22 51 -40 72c-18 20 -41 36 -69 48s-62 18 -101 18z
-M965 772v0c33 0 56 -11 69 -32s20 -46 20 -76c0 -31 -4 -59 -13 -84s-21 -47 -37 -65s-34 -32 -56 -42s-47 -15 -74 -15c-17 0 -32 1 -44 4l73 303c19 4 40 7 62 7z" />
-    <glyph glyph-name="foursquare" unicode="&#xf180;" horiz-adv-x="1192" 
-d="M956 1102l37 194c7 32 -17 57 -44 57h-712c-32 0 -54 -29 -54 -54v-1101c0 -3 3 -4 6 -1c262 315 291 352 291 352c30 35 42 41 86 41h239c33 0 52 28 55 44s31 162 37 191s-21 59 -48 59h-294c-39 0 -67 28 -67 67v42c0 39 28 66 67 66h346c24 0 51 22 55 43zM1183 1324
-c-37 -180 -148 -749 -158 -790c-12 -47 -30 -129 -144 -129h-271c-11 0 -12 1 -22 -10c0 0 -7 -8 -426 -494c-33 -38 -87 -31 -107 -23s-55 32 -55 98v1410c0 58 36 150 158 150h888c130 0 165 -74 137 -212zM1183 1324l-158 -790c10 41 121 610 158 790z" />
-    <glyph glyph-name="music" unicode="&#xf001;" 
-d="M1536 1312v-1120c0 -141 -211 -192 -320 -192s-320 51 -320 192s211 192 320 192c66 0 132 -12 192 -39v537l-768 -237v-709c0 -141 -211 -192 -320 -192s-320 51 -320 192s211 192 320 192c66 0 132 -12 192 -39v967c0 42 28 79 68 92l832 256c9 3 18 4 28 4
-c53 0 96 -43 96 -96z" />
-    <glyph glyph-name="wpexplorer" 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 640c0 432 -352 784 -784 784s-784 -352 -784 -784
-s352 -784 784 -784s784 352 784 784zM1792 640c0 -494 -402 -896 -896 -896s-896 402 -896 896s402 896 896 896s896 -402 896 -896z" />
-    <glyph glyph-name="gg-circle" 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 640c0 -495 -401 -896 -896 -896
-s-896 401 -896 896s401 896 896 896s896 -401 896 -896z" />
-    <glyph glyph-name="sort" unicode="&#xf0dc;" horiz-adv-x="1024" 
-d="M1024 448c0 -17 -7 -33 -19 -45l-448 -448c-12 -12 -28 -19 -45 -19s-33 7 -45 19l-448 448c-12 12 -19 28 -19 45c0 35 29 64 64 64h896c35 0 64 -29 64 -64zM1024 832c0 -35 -29 -64 -64 -64h-896c-35 0 -64 29 -64 64c0 17 7 33 19 45l448 448c12 12 28 19 45 19
-s33 -7 45 -19l448 -448c12 -12 19 -28 19 -45z" />
-    <glyph glyph-name="pencil" unicode="&#xf040;" horiz-adv-x="1515" 
-d="M363 0l91 91l-235 235l-91 -91v-107h128v-128h107zM886 928c0 13 -9 22 -22 22c-6 0 -12 -2 -17 -7l-542 -542c-5 -5 -7 -11 -7 -17c0 -13 9 -22 22 -22c6 0 12 2 17 7l542 542c5 5 7 11 7 17zM832 1120l416 -416l-832 -832h-416v416zM1515 1024c0 -34 -14 -67 -37 -90
-l-166 -166l-416 416l166 165c23 24 56 38 90 38s67 -14 91 -38l235 -234c23 -24 37 -57 37 -91z" />
-    <glyph glyph-name="bookmark-o" unicode="&#xf097;" horiz-adv-x="1280" 
-d="M1152 1280h-1024v-1242l423 406l89 85l89 -85l423 -406v1242zM1164 1408c15 0 30 -3 44 -9c44 -17 72 -58 72 -103v-1289c0 -45 -28 -86 -72 -103c-14 -6 -29 -8 -44 -8c-31 0 -60 11 -83 32l-441 424l-441 -424c-23 -21 -52 -33 -83 -33c-15 0 -30 3 -44 9
-c-44 17 -72 58 -72 103v1289c0 45 28 86 72 103c14 6 29 9 44 9h1048z" />
-    <glyph glyph-name="diamond" 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 -512c19 -24 17 -59 -4 -82l-960 -1024c-12 -13 -29 -20 -47 -20
-s-35 7 -47 20l-960 1024c-21 23 -23 58 -4 82l384 512c12 17 31 26 51 26h1152c20 0 39 -9 51 -26z" />
-    <glyph glyph-name="share" unicode="&#xf064;" horiz-adv-x="1792" 
-d="M1792 896c0 -17 -7 -33 -19 -45l-512 -512c-12 -12 -28 -19 -45 -19c-35 0 -64 29 -64 64v256h-224c-431 0 -714 -83 -714 -560c0 -41 2 -82 5 -123c1 -16 5 -34 5 -50c0 -19 -12 -35 -32 -35c-14 0 -21 7 -28 17c-15 21 -26 53 -37 76c-57 128 -127 311 -127 451
-c0 112 11 227 53 333c139 345 547 403 875 403h224v256c0 35 29 64 64 64c17 0 33 -7 45 -19l512 -512c12 -12 19 -28 19 -45z" />
-    <glyph glyph-name="envelope" unicode="&#xf0e0;" horiz-adv-x="1792" 
-d="M1792 826v-794c0 -88 -72 -160 -160 -160h-1472c-88 0 -160 72 -160 160v794c30 -33 64 -62 101 -87c166 -113 334 -226 497 -345c84 -62 188 -138 297 -138h2c109 0 213 76 297 138c163 118 331 232 498 345c36 25 70 54 100 87zM1792 1120c0 -112 -83 -213 -171 -274
-c-156 -108 -313 -216 -468 -325c-65 -45 -175 -137 -256 -137h-2c-81 0 -191 92 -256 137c-155 109 -312 217 -467 325c-71 48 -172 161 -172 252c0 98 53 182 160 182h1472c87 0 160 -72 160 -160z" />
-    <glyph glyph-name="yahoo" unicode="&#xf19e;" horiz-adv-x="1318" 
-d="M750 579l13 -707c-34 6 -69 11 -105 11c-35 0 -70 -5 -105 -11l13 707c-186 321 -361 648 -566 957c35 -9 71 -15 108 -15s75 7 111 15c140 -248 292 -489 439 -733c148 242 305 483 439 733c35 -9 71 -14 107 -14c38 0 77 5 114 14c-80 -110 -146 -230 -215 -347
-c-119 -203 -236 -406 -353 -610z" />
-    <glyph glyph-name="window-restore" unicode="&#xf2d2;" horiz-adv-x="2048" 
-d="M256 0h768v512h-768v-512zM1280 512h512v768h-768v-256h96c88 0 160 -72 160 -160v-352zM2048 1376v-960c0 -88 -72 -160 -160 -160h-608v-352c0 -88 -72 -160 -160 -160h-960c-88 0 -160 72 -160 160v960c0 88 72 160 160 160h608v352c0 88 72 160 160 160h960
-c88 0 160 -72 160 -160z" />
-    <glyph glyph-name="glass" unicode="&#xf000;" horiz-adv-x="1606" 
-d="M1606 1350c0 -29 -23 -58 -43 -78l-632 -632v-768h320c35 0 64 -29 64 -64s-29 -64 -64 -64h-896c-35 0 -64 29 -64 64s29 64 64 64h320v768l-632 632c-20 20 -43 49 -43 78c0 49 62 58 99 58h1408c37 0 99 -9 99 -58z" />
-    <glyph glyph-name="flag" unicode="&#xf024;" horiz-adv-x="1728" 
-d="M256 1280c0 -46 -25 -87 -64 -110v-1266c0 -17 -15 -32 -32 -32h-64c-17 0 -32 15 -32 32v1266c-39 23 -64 64 -64 110c0 71 57 128 128 128s128 -57 128 -128zM1728 1216v-763c0 -37 -23 -51 -52 -66c-113 -61 -238 -116 -369 -116c-184 0 -272 140 -490 140
-c-159 0 -326 -72 -464 -146c-11 -6 -21 -9 -33 -9c-35 0 -64 29 -64 64v742c0 24 12 41 31 55c24 16 53 30 79 43c126 64 279 120 421 120c157 0 280 -52 419 -117c28 -14 57 -19 88 -19c157 0 326 136 370 136c35 0 64 -29 64 -64z" />
-    <glyph glyph-name="train" unicode="&#xf238;" 
-d="M1088 1536c247 0 448 -143 448 -320v-896c0 -173 -191 -313 -431 -319l213 -202c21 -20 7 -55 -22 -55h-1056c-29 0 -43 35 -22 55l213 202c-240 6 -431 146 -431 319v896c0 177 201 320 448 320h640zM768 192c106 0 192 86 192 192s-86 192 -192 192s-192 -86 -192 -192
-s86 -192 192 -192zM1344 768v512h-1152v-512h1152z" />
-    <glyph glyph-name="bullhorn" unicode="&#xf0a1;" horiz-adv-x="1792" 
-d="M1664 896c71 0 128 -57 128 -128s-57 -128 -128 -128v-384c0 -70 -58 -128 -128 -128c-178 148 -465 351 -812 380c-119 -40 -160 -179 -82 -259c-70 -115 20 -196 126 -279c-62 -122 -320 -124 -412 -39c-58 178 -144 356 -74 581h-122c-88 0 -160 72 -160 160v192
-c0 88 72 160 160 160h480c384 0 704 224 896 384c70 0 128 -58 128 -128v-384zM1536 292v954c-261 -200 -514 -315 -768 -343v-270c254 -28 507 -141 768 -341z" />
-    <glyph glyph-name="pause-circle-o" unicode="&#xf28c;" 
-d="M768 1408c424 0 768 -344 768 -768s-344 -768 -768 -768s-768 344 -768 768s344 768 768 768zM768 96c300 0 544 244 544 544s-244 544 -544 544s-544 -244 -544 -544s244 -544 544 -544zM864 320c-18 0 -32 14 -32 32v576c0 18 14 32 32 32h192c18 0 32 -14 32 -32v-576
-c0 -18 -14 -32 -32 -32h-192zM480 320c-18 0 -32 14 -32 32v576c0 18 14 32 32 32h192c18 0 32 -14 32 -32v-576c0 -18 -14 -32 -32 -32h-192z" />
-    <glyph glyph-name="snapchat-ghost" unicode="&#xf2ac;" horiz-adv-x="1634" 
-d="M833 1408c180 2 329 -99 404 -261c23 -49 27 -125 27 -179c0 -64 -5 -127 -9 -191c8 -4 19 -7 28 -7c36 0 66 27 102 27c34 0 83 -24 83 -64c0 -96 -201 -78 -201 -162c0 -15 6 -29 12 -43c48 -105 139 -206 247 -251c26 -11 52 -17 80 -23c18 -4 28 -17 28 -35
-c0 -68 -173 -96 -219 -103c-20 -31 -5 -104 -58 -104c-41 0 -82 13 -126 13c-21 0 -42 -1 -62 -5c-119 -20 -159 -148 -354 -148c-188 0 -233 128 -349 148c-21 4 -42 5 -63 5c-45 0 -88 -15 -124 -15c-56 0 -39 74 -60 106c-46 7 -219 35 -219 103c0 18 10 31 28 35
-c28 6 54 12 80 23c107 44 200 146 247 251c6 14 12 28 12 43c0 84 -202 68 -202 161c0 39 46 64 81 64c31 0 62 -26 101 -26c11 0 22 2 32 7c-4 63 -9 126 -9 190c0 54 4 131 27 180c88 190 237 259 436 261z" />
-    <glyph glyph-name="folder" unicode="&#xf07b;" horiz-adv-x="1664" 
-d="M1664 928v-704c0 -123 -101 -224 -224 -224h-1216c-123 0 -224 101 -224 224v960c0 123 101 224 224 224h320c123 0 224 -101 224 -224v-32h672c123 0 224 -101 224 -224z" />
-    <glyph glyph-name="outdent" unicode="&#xf03b;" horiz-adv-x="1792" 
-d="M384 992v-576c0 -17 -15 -32 -32 -32c-8 0 -17 3 -23 9l-288 288c-6 6 -9 15 -9 23s3 17 9 23l288 288c6 6 15 9 23 9c17 0 32 -15 32 -32zM1792 224v-192c0 -17 -15 -32 -32 -32h-1728c-17 0 -32 15 -32 32v192c0 17 15 32 32 32h1728c17 0 32 -15 32 -32zM1792 608
-v-192c0 -17 -15 -32 -32 -32h-1088c-17 0 -32 15 -32 32v192c0 17 15 32 32 32h1088c17 0 32 -15 32 -32zM1792 992v-192c0 -17 -15 -32 -32 -32h-1088c-17 0 -32 15 -32 32v192c0 17 15 32 32 32h1088c17 0 32 -15 32 -32zM1792 1376v-192c0 -17 -15 -32 -32 -32h-1728
-c-17 0 -32 15 -32 32v192c0 17 15 32 32 32h1728c17 0 32 -15 32 -32z" />
-    <glyph glyph-name="stumbleupon" unicode="&#xf1a4;" horiz-adv-x="1920" 
-d="M1062 824v118c0 56 -46 102 -102 102s-102 -46 -102 -102v-612c0 -234 -194 -423 -429 -423c-237 0 -429 192 -429 429v266h328v-262c0 -57 46 -102 102 -102s102 45 102 102v620c0 229 196 413 428 413c233 0 428 -185 428 -416v-136l-195 -58zM1592 602h328v-266
-c0 -237 -192 -429 -429 -429c-236 0 -429 190 -429 425v268l131 -61l195 58v-270c0 -56 46 -101 102 -101s102 45 102 101v275z" />
-    <glyph glyph-name="address-card" unicode="&#xf2bb;" horiz-adv-x="2048" 
-d="M1024 405c0 155 -38 327 -196 327c-49 -28 -115 -76 -188 -76s-139 48 -188 76c-158 0 -196 -172 -196 -327c0 -87 57 -149 128 -149h512c71 0 128 62 128 149zM867 925c0 125 -102 227 -227 227s-227 -102 -227 -227c0 -126 102 -227 227 -227s227 101 227 227z
-M1792 416v64c0 18 -14 32 -32 32h-576c-18 0 -32 -14 -32 -32v-64c0 -18 14 -32 32 -32h576c18 0 32 14 32 32zM1792 676v56c0 20 -16 36 -36 36h-568c-20 0 -36 -16 -36 -36v-56c0 -20 16 -36 36 -36h568c20 0 36 16 36 36zM1792 928v64c0 18 -14 32 -32 32h-576
-c-18 0 -32 -14 -32 -32v-64c0 -18 14 -32 32 -32h576c18 0 32 14 32 32zM2048 1248v-1216c0 -88 -72 -160 -160 -160h-352v96c0 18 -14 32 -32 32h-64c-18 0 -32 -14 -32 -32v-96h-768v96c0 18 -14 32 -32 32h-64c-18 0 -32 -14 -32 -32v-96h-352c-88 0 -160 72 -160 160
-v1216c0 88 72 160 160 160h1728c88 0 160 -72 160 -160z" />
-    <glyph glyph-name="i-cursor" unicode="&#xf246;" horiz-adv-x="896" 
-d="M832 1408c-212 0 -320 -75 -320 -224v-416h128v-128h-128v-544c0 -149 108 -224 320 -224h64v-128h-64c-180 0 -312 52 -384 146c-72 -94 -204 -146 -384 -146h-64v128h64c212 0 320 75 320 224v544h-128v128h128v416c0 149 -108 224 -320 224h-64v128h64
-c180 0 312 -52 384 -146c72 94 204 146 384 146h64v-128h-64z" />
-    <glyph glyph-name="car" unicode="&#xf1b9;" horiz-adv-x="2048" 
-d="M480 448c0 88 -72 160 -160 160s-160 -72 -160 -160s72 -160 160 -160s160 72 160 160zM516 768h1016l-89 357c-3 11 -23 27 -35 27h-768c-12 0 -32 -16 -35 -27zM1888 448c0 88 -72 160 -160 160s-160 -72 -160 -160s72 -160 160 -160s160 72 160 160zM2048 544v-384
-c0 -18 -14 -32 -32 -32h-96v-128c0 -106 -86 -192 -192 -192s-192 86 -192 192v128h-1024v-128c0 -106 -86 -192 -192 -192s-192 86 -192 192v128h-96c-18 0 -32 14 -32 32v384c0 124 100 224 224 224h28l105 419c31 126 153 221 283 221h768c130 0 252 -95 283 -221
-l105 -419h28c124 0 224 -100 224 -224z" />
-    <glyph glyph-name="file-excel-o" unicode="&#xf1c3;" 
-d="M1468 1156c37 -37 68 -111 68 -164v-1152c0 -53 -43 -96 -96 -96h-1344c-53 0 -96 43 -96 96v1600c0 53 43 96 96 96h896c53 0 127 -31 164 -68zM1024 1400v-376h376c-6 17 -15 34 -22 41l-313 313c-7 7 -24 16 -41 22zM1408 -128v1024h-416c-53 0 -96 43 -96 96v416
-h-768v-1536h1280zM429 106h68l194 283l-189 272h-68v107h290v-107h-76l106 -159c8 -9 13 -16 17 -23c2 -3 4 -6 5 -10h2c0 -1 9 14 21 33l103 159h-74v107h279v-107h-67l-195 -282l192 -273h68v-106h-291v106h76l-107 161c-7 10 -13 16 -17 24c-2 3 -4 6 -5 10h-2
-c-3 0 -9 -15 -21 -34l-103 -161h75v-106h-281v106z" />
-    <glyph glyph-name="arrow-circle-o-left" unicode="&#xf190;" 
-d="M1152 736v-192c0 -17 -15 -32 -32 -32h-352v-192c0 -18 -14 -32 -32 -32c-9 0 -17 4 -24 10l-319 319c-6 6 -9 15 -9 23s3 17 9 23l320 320c6 6 15 9 23 9c17 0 32 -15 32 -32v-192h352c17 0 32 -15 32 -32zM1312 640c0 300 -244 544 -544 544s-544 -244 -544 -544
-s244 -544 544 -544s544 244 544 544zM1536 640c0 -424 -344 -768 -768 -768s-768 344 -768 768s344 768 768 768s768 -344 768 -768z" />
-    <glyph glyph-name="paragraph" unicode="&#xf1dd;" horiz-adv-x="1254" 
-d="M1254 1347v-73c0 -34 -27 -93 -61 -93c-17 0 -37 3 -54 -1c-16 -4 -28 -15 -32 -31c-5 -19 -3 -43 -3 -64v-1152c0 -34 -27 -61 -61 -61h-108c-34 0 -61 27 -61 61v1218h-143v-1218c0 -34 -27 -61 -61 -61h-108c-34 0 -61 27 -61 61v496c-97 8 -180 28 -245 59
-c-84 39 -148 99 -192 179c-42 77 -64 164 -64 259c0 111 30 207 88 286c59 79 129 132 209 159c75 25 233 37 417 37h479c34 0 61 -27 61 -61z" />
-    <glyph glyph-name="y-combinator" unicode="&#xf23b;" 
-d="M809 532l266 499h-112l-157 -312s-24 -48 -44 -92c-19 46 -42 92 -42 92l-155 312h-120l263 -493v-324h101v318zM1536 1408v-1536h-1536v1536h1536z" />
-    <glyph glyph-name="male" unicode="&#xf183;" horiz-adv-x="1024" 
-d="M1024 832v-416c0 -53 -43 -96 -96 -96s-96 43 -96 96v352h-64v-912c0 -62 -50 -112 -112 -112s-112 50 -112 112v464h-64v-464c0 -62 -50 -112 -112 -112s-112 50 -112 112v912h-64v-352c0 -53 -43 -96 -96 -96s-96 43 -96 96v416c0 106 86 192 192 192h640
-c106 0 192 -86 192 -192zM736 1280c0 -124 -100 -224 -224 -224s-224 100 -224 224s100 224 224 224s224 -100 224 -224z" />
-    <glyph glyph-name="history" unicode="&#xf1da;" 
-d="M1536 640c0 -423 -345 -768 -768 -768c-229 0 -445 101 -591 277c-10 13 -9 32 2 43l137 138c7 6 16 9 25 9c9 -1 18 -5 23 -12c98 -127 245 -199 404 -199c282 0 512 230 512 512s-230 512 -512 512c-131 0 -255 -50 -348 -137l137 -138c19 -18 24 -46 14 -69
-c-10 -24 -33 -40 -59 -40h-448c-35 0 -64 29 -64 64v448c0 26 16 49 40 59c23 10 51 5 69 -14l130 -129c141 133 332 212 529 212c423 0 768 -345 768 -768zM896 928v-448c0 -18 -14 -32 -32 -32h-320c-18 0 -32 14 -32 32v64c0 18 14 32 32 32h224v352c0 18 14 32 32 32h64
-c18 0 32 -14 32 -32z" />
-    <glyph glyph-name="h-square" unicode="&#xf0fd;" 
-d="M1280 192v896c0 35 -29 64 -64 64h-128c-35 0 -64 -29 -64 -64v-320h-512v320c0 35 -29 64 -64 64h-128c-35 0 -64 -29 -64 -64v-896c0 -35 29 -64 64 -64h128c35 0 64 29 64 64v320h512v-320c0 -35 29 -64 64 -64h128c35 0 64 29 64 64zM1536 1120v-960
-c0 -159 -129 -288 -288 -288h-960c-159 0 -288 129 -288 288v960c0 159 129 288 288 288h960c159 0 288 -129 288 -288z" />
-    <glyph glyph-name="heart" unicode="&#xf004;" horiz-adv-x="1792" 
-d="M896 -128c-16 0 -32 6 -44 18l-624 602c-8 7 -228 208 -228 448c0 293 179 468 478 468c175 0 339 -138 418 -216c79 78 243 216 418 216c299 0 478 -175 478 -468c0 -240 -220 -441 -229 -450l-623 -600c-12 -12 -28 -18 -44 -18z" />
-    <glyph glyph-name="sort-amount-desc" unicode="&#xf161;" horiz-adv-x="1760" 
-d="M1184 -32v-192c0 -18 -14 -32 -32 -32h-256c-18 0 -32 14 -32 32v192c0 18 14 32 32 32h256c18 0 32 -14 32 -32zM704 96c0 -9 -4 -17 -10 -24l-319 -319c-7 -6 -15 -9 -23 -9s-16 3 -23 9l-320 320c-9 10 -12 23 -7 35s17 20 30 20h192v1376c0 18 14 32 32 32h192
-c18 0 32 -14 32 -32v-1376h192c18 0 32 -14 32 -32zM1376 480v-192c0 -18 -14 -32 -32 -32h-448c-18 0 -32 14 -32 32v192c0 18 14 32 32 32h448c18 0 32 -14 32 -32zM1568 992v-192c0 -18 -14 -32 -32 -32h-640c-18 0 -32 14 -32 32v192c0 18 14 32 32 32h640
-c18 0 32 -14 32 -32zM1760 1504v-192c0 -18 -14 -32 -32 -32h-832c-18 0 -32 14 -32 32v192c0 18 14 32 32 32h832c18 0 32 -14 32 -32z" />
-    <glyph glyph-name="search-plus" unicode="&#xf00e;" horiz-adv-x="1664" 
-d="M1024 736v-64c0 -17 -15 -32 -32 -32h-224v-224c0 -17 -15 -32 -32 -32h-64c-17 0 -32 15 -32 32v224h-224c-17 0 -32 15 -32 32v64c0 17 15 32 32 32h224v224c0 17 15 32 32 32h64c17 0 32 -15 32 -32v-224h224c17 0 32 -15 32 -32zM1152 704c0 247 -201 448 -448 448
-s-448 -201 -448 -448s201 -448 448 -448s448 201 448 448zM1664 -128c0 -71 -57 -128 -128 -128c-34 0 -67 14 -90 38l-343 342c-117 -81 -257 -124 -399 -124c-389 0 -704 315 -704 704s315 704 704 704s704 -315 704 -704c0 -142 -43 -282 -124 -399l343 -343
-c23 -23 37 -56 37 -90z" />
-    <glyph glyph-name="life-ring" unicode="&#xf1cd;" horiz-adv-x="1792" 
-d="M896 1536c495 0 896 -401 896 -896s-401 -896 -896 -896s-896 401 -896 896s401 896 896 896zM896 1408c-130 0 -253 -33 -361 -90l194 -194c53 18 109 28 167 28c59 0 114 -10 167 -28l194 194c-108 57 -231 90 -361 90zM218 279l194 194c-18 53 -28 109 -28 167
-c0 59 10 114 28 167l-194 194c-57 -108 -90 -231 -90 -361s33 -253 90 -361zM896 -128c130 0 253 33 361 90l-194 194c-53 -18 -108 -28 -167 -28c-58 0 -114 10 -167 28l-194 -194c108 -57 231 -90 361 -90zM896 256c212 0 384 172 384 384s-172 384 -384 384
-s-384 -172 -384 -384s172 -384 384 -384zM1380 473l194 -194c57 108 90 231 90 361s-33 253 -90 361l-194 -194c18 -53 28 -109 28 -167s-10 -114 -28 -167z" />
-    <glyph glyph-name="lock" unicode="&#xf023;" horiz-adv-x="1152" 
-d="M320 768h512v192c0 141 -115 256 -256 256s-256 -115 -256 -256v-192zM1152 672v-576c0 -53 -43 -96 -96 -96h-960c-53 0 -96 43 -96 96v576c0 53 43 96 96 96h32v192c0 246 202 448 448 448s448 -202 448 -448v-192h32c53 0 96 -43 96 -96z" />
-    <glyph glyph-name="git-square" unicode="&#xf1d2;" 
-d="M582 228c0 -54 -49 -66 -93 -66c-43 0 -107 7 -107 63c0 55 54 64 98 64c42 0 102 -7 102 -61zM546 694c0 -50 -20 -85 -74 -85c-55 0 -77 32 -77 84s20 90 77 90c51 0 74 -42 74 -89zM712 769v125c-43 -16 -89 -29 -135 -29c-33 19 -71 29 -110 29
-c-114 0 -204 -84 -204 -200c0 -62 41 -148 103 -169v-3c-32 -14 -38 -53 -38 -85c0 -33 12 -60 41 -77v-3c-68 -22 -113 -65 -113 -139c0 -127 121 -163 227 -163c128 0 224 47 224 188c0 100 -91 130 -174 145c-28 5 -76 25 -76 60c0 33 18 47 49 52c102 20 167 99 167 204
-c0 18 -4 35 -10 52c16 4 33 8 49 13zM771 350h137c-2 27 -2 55 -2 82v387c0 23 0 46 2 69h-137c3 -23 3 -48 3 -71v-392c0 -25 0 -50 -3 -75zM1280 366v121c-20 -14 -44 -21 -68 -21c-45 0 -53 45 -53 82v225h52c18 0 35 -2 53 -2v117h-105c0 34 -2 68 3 102h-140
-c3 -18 4 -36 4 -55v-47h-60v-117c12 1 24 3 37 3c7 0 15 -1 23 -1v-2h-2v-217c0 -108 16 -212 148 -212c37 0 75 6 108 24zM924 1072c0 47 -35 91 -84 91s-85 -43 -85 -91c0 -47 37 -89 85 -89s84 43 84 89zM1536 1120v-960c0 -159 -129 -288 -288 -288h-960
-c-159 0 -288 129 -288 288v960c0 159 129 288 288 288h960c159 0 288 -129 288 -288z" />
-    <glyph glyph-name="mouse-pointer" unicode="&#xf245;" horiz-adv-x="1152" 
-d="M1133 493c19 -18 24 -46 14 -69c-10 -24 -33 -40 -59 -40h-382l201 -476c14 -33 -2 -70 -34 -84l-177 -75c-33 -14 -70 2 -84 34l-191 452l-312 -312c-12 -12 -28 -19 -45 -19c-8 0 -17 2 -24 5c-24 10 -40 33 -40 59v1504c0 26 16 49 40 59c7 3 16 5 24 5
-c17 0 33 -6 45 -19z" />
-    <glyph glyph-name="sign-in" unicode="&#xf090;" 
-d="M1184 640c0 -17 -7 -33 -19 -45l-544 -544c-12 -12 -28 -19 -45 -19c-35 0 -64 29 -64 64v288h-448c-35 0 -64 29 -64 64v384c0 35 29 64 64 64h448v288c0 35 29 64 64 64c17 0 33 -7 45 -19l544 -544c12 -12 19 -28 19 -45zM1536 992v-704c0 -159 -129 -288 -288 -288
-h-320c-17 0 -32 15 -32 32c0 28 -13 96 32 96h320c88 0 160 72 160 160v704c0 88 -72 160 -160 160h-288c-25 0 -64 -5 -64 32c0 28 -13 96 32 96h320c159 0 288 -129 288 -288z" />
-    <glyph glyph-name="odnoklassniki-square" unicode="&#xf264;" 
-d="M927 956c0 -88 -71 -159 -159 -159s-159 71 -159 159s71 159 159 159s159 -71 159 -159zM1141 593c-18 36 -69 67 -136 14c0 0 -91 -72 -237 -72s-237 72 -237 72c-67 53 -118 22 -136 -14c-32 -64 4 -95 85 -148c69 -44 165 -61 226 -67l-51 -52
-c-72 -72 -142 -142 -191 -190c-29 -29 -29 -76 0 -105l9 -9c29 -29 76 -29 105 0l191 191c72 -73 142 -143 191 -191c29 -29 76 -29 105 0l9 9c29 29 29 76 0 105l-191 190l-52 52c62 6 156 23 225 67c81 53 117 84 85 148zM1092 956c0 179 -145 324 -324 324
-s-324 -145 -324 -324s145 -324 324 -324s324 145 324 324zM1536 1120v-960c0 -159 -129 -288 -288 -288h-960c-159 0 -288 129 -288 288v960c0 159 129 288 288 288h960c159 0 288 -129 288 -288z" />
-    <glyph glyph-name="tag" unicode="&#xf02b;" horiz-adv-x="1515" 
-d="M448 1088c0 71 -57 128 -128 128s-128 -57 -128 -128s57 -128 128 -128s128 57 128 128zM1515 512c0 -34 -14 -67 -37 -90l-491 -492c-24 -23 -57 -37 -91 -37s-67 14 -90 37l-715 716c-51 50 -91 147 -91 218v416c0 70 58 128 128 128h416c71 0 168 -40 219 -91
-l715 -714c23 -24 37 -57 37 -91z" />
-    <glyph glyph-name="align-justify" unicode="&#xf039;" horiz-adv-x="1792" 
-d="M1792 192v-128c0 -35 -29 -64 -64 -64h-1664c-35 0 -64 29 -64 64v128c0 35 29 64 64 64h1664c35 0 64 -29 64 -64zM1792 576v-128c0 -35 -29 -64 -64 -64h-1664c-35 0 -64 29 -64 64v128c0 35 29 64 64 64h1664c35 0 64 -29 64 -64zM1792 960v-128
-c0 -35 -29 -64 -64 -64h-1664c-35 0 -64 29 -64 64v128c0 35 29 64 64 64h1664c35 0 64 -29 64 -64zM1792 1344v-128c0 -35 -29 -64 -64 -64h-1664c-35 0 -64 29 -64 64v128c0 35 29 64 64 64h1664c35 0 64 -29 64 -64z" />
-    <glyph glyph-name="hospital-o" unicode="&#xf0f8;" horiz-adv-x="1408" 
-d="M384 224v-64c0 -17 -15 -32 -32 -32h-64c-17 0 -32 15 -32 32v64c0 17 15 32 32 32h64c17 0 32 -15 32 -32zM384 480v-64c0 -17 -15 -32 -32 -32h-64c-17 0 -32 15 -32 32v64c0 17 15 32 32 32h64c17 0 32 -15 32 -32zM640 480v-64c0 -17 -15 -32 -32 -32h-64
-c-17 0 -32 15 -32 32v64c0 17 15 32 32 32h64c17 0 32 -15 32 -32zM384 736v-64c0 -17 -15 -32 -32 -32h-64c-17 0 -32 15 -32 32v64c0 17 15 32 32 32h64c17 0 32 -15 32 -32zM1152 224v-64c0 -17 -15 -32 -32 -32h-64c-17 0 -32 15 -32 32v64c0 17 15 32 32 32h64
-c17 0 32 -15 32 -32zM896 480v-64c0 -17 -15 -32 -32 -32h-64c-17 0 -32 15 -32 32v64c0 17 15 32 32 32h64c17 0 32 -15 32 -32zM640 736v-64c0 -17 -15 -32 -32 -32h-64c-17 0 -32 15 -32 32v64c0 17 15 32 32 32h64c17 0 32 -15 32 -32zM1152 480v-64
-c0 -17 -15 -32 -32 -32h-64c-17 0 -32 15 -32 32v64c0 17 15 32 32 32h64c17 0 32 -15 32 -32zM896 736v-64c0 -17 -15 -32 -32 -32h-64c-17 0 -32 15 -32 32v64c0 17 15 32 32 32h64c17 0 32 -15 32 -32zM1152 736v-64c0 -17 -15 -32 -32 -32h-64c-17 0 -32 15 -32 32v64
-c0 17 15 32 32 32h64c17 0 32 -15 32 -32zM896 -128h384v1152h-256v-32c0 -53 -43 -96 -96 -96h-448c-53 0 -96 43 -96 96v32h-256v-1152h384v224c0 17 15 32 32 32h320c17 0 32 -15 32 -32v-224zM896 1056v320c0 17 -15 32 -32 32h-64c-17 0 -32 -15 -32 -32v-96h-128v96
-c0 17 -15 32 -32 32h-64c-17 0 -32 -15 -32 -32v-320c0 -17 15 -32 32 -32h64c17 0 32 15 32 32v96h128v-96c0 -17 15 -32 32 -32h64c17 0 32 15 32 32zM1408 1088v-1280c0 -35 -29 -64 -64 -64h-1280c-35 0 -64 29 -64 64v1280c0 35 29 64 64 64h320v288c0 53 43 96 96 96
-h448c53 0 96 -43 96 -96v-288h320c35 0 64 -29 64 -64z" />
-    <glyph glyph-name="chevron-circle-down" unicode="&#xf13a;" 
-d="M813 237l454 454c25 25 25 65 0 90l-102 102c-25 25 -65 25 -90 0l-307 -307l-307 307c-25 25 -65 25 -90 0l-102 -102c-25 -25 -25 -65 0 -90l454 -454c25 -25 65 -25 90 0zM1536 640c0 -424 -344 -768 -768 -768s-768 344 -768 768s344 768 768 768s768 -344 768 -768z
-" />
-    <glyph glyph-name="filter" unicode="&#xf0b0;" horiz-adv-x="1408" 
-d="M1403 1241c10 -24 5 -52 -14 -70l-493 -493v-742c0 -26 -16 -49 -39 -59c-8 -3 -17 -5 -25 -5c-17 0 -33 6 -45 19l-256 256c-12 12 -19 28 -19 45v486l-493 493c-19 18 -24 46 -14 70c10 23 33 39 59 39h1280c26 0 49 -16 59 -39z" />
-    <glyph glyph-name="google-plus" unicode="&#xf0d5;" horiz-adv-x="2304" 
-d="M1437 623c0 -419 -281 -716 -704 -716c-405 0 -733 328 -733 733s328 733 733 733c198 0 363 -72 491 -192l-199 -191c-54 52 -149 113 -292 113c-250 0 -454 -207 -454 -463s204 -463 454 -463c290 0 399 209 416 316h-416v252h692c7 -37 12 -74 12 -122zM2304 745v-210
-h-209v-209h-210v209h-209v210h209v209h210v-209h209z" />
-    <glyph glyph-name="sticky-note-o" unicode="&#xf24a;" 
-d="M1400 256h-248v-248c17 6 34 15 41 22l185 185c7 7 16 24 22 41zM1120 384h288v896h-1280v-1280h896v288c0 53 43 96 96 96zM1536 1312v-1024c0 -53 -31 -127 -68 -164l-184 -184c-37 -37 -111 -68 -164 -68h-1024c-53 0 -96 43 -96 96v1344c0 53 43 96 96 96h1344
-c53 0 96 -43 96 -96z" />
-    <glyph glyph-name="fonticons" 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 925c41 0 57 -15 56 -79l174 21c0 153 -105 181 -222 181c-174 0 -265 -70 -265 -240v-72h-96v-128h76
-c10 0 20 0 20 -8v-382c0 -19 -5 -25 -23 -27l-73 -7v-88h448v86l-149 14c-18 2 -11 5 -11 25v387h191l38 128h-231c-10 0 2 7 2 15v80c0 60 2 94 65 94zM1248 96v86l-54 9c-19 3 -10 5 -10 25v520h-275l-23 -101l83 -22c13 -4 23 -13 23 -27v-370c0 -19 -8 -23 -26 -25
-l-70 -9v-86h352z" />
-    <glyph glyph-name="comments-o" unicode="&#xf0e6;" horiz-adv-x="1792" 
-d="M704 1152c-312 0 -576 -176 -576 -384c0 -110 74 -216 202 -290l97 -56l-35 -84c21 12 42 25 62 39l44 31l53 -10c50 -9 101 -14 153 -14c312 0 576 176 576 384s-264 384 -576 384zM704 1280c389 0 704 -229 704 -512s-315 -512 -704 -512c-61 0 -120 6 -176 16
-c-83 -59 -177 -102 -278 -128c-27 -7 -56 -12 -86 -16h-3c-15 0 -29 12 -32 29c-4 19 9 31 20 44c39 44 83 83 117 166c-162 94 -266 239 -266 401c0 283 315 512 704 512zM1526 111c34 -83 78 -122 117 -166c11 -13 24 -25 20 -44c-4 -18 -19 -31 -35 -29
-c-30 4 -59 9 -86 16c-101 26 -195 69 -278 128c-56 -10 -115 -16 -176 -16c-181 0 -347 50 -472 132c29 -2 59 -4 88 -4c215 0 418 62 573 174c167 122 259 287 259 466c0 52 -8 103 -23 152c169 -93 279 -241 279 -408c0 -163 -104 -307 -266 -401z" />
-    <glyph glyph-name="lastfm" unicode="&#xf202;" horiz-adv-x="1792" 
-d="M1292 832c0 -6 8 -34 10 -41c27 -82 90 -99 165 -120c167 -47 325 -136 325 -332c0 -199 -166 -339 -360 -339c-322 0 -422 394 -515 634c-77 198 -158 314 -381 314c-198 0 -372 -190 -372 -385c0 -207 155 -399 370 -399c95 0 194 20 258 95c31 35 61 73 83 116
-l84 -152c-11 -25 -27 -49 -44 -70l1 -1c-101 -117 -239 -152 -388 -152c-302 0 -528 267 -528 561c0 285 248 550 536 550c478 0 502 -414 664 -747c44 -92 119 -200 233 -200c104 0 196 67 196 177c0 238 -437 76 -499 467c-2 11 -3 22 -3 33c0 148 139 275 286 270
-c88 -3 141 -6 211 -68h-1c27 -25 47 -59 68 -88l-129 -99c-15 28 -29 51 -54 70v1c-24 22 -67 21 -97 21c-65 0 -119 -49 -119 -116z" />
-    <glyph glyph-name="peertube" unicode="&#xf2e4;" horiz-adv-x="1350" 
-d="M0 1536l675 -450l-675 -450v900zM675 1086l675 -450l-675 -450v900zM0 636l675 -450l-675 -450v900z" />
-    <glyph glyph-name="pagelines" unicode="&#xf18c;" horiz-adv-x="1402" 
-d="M1402 433c-201 -499 -683 -197 -683 -197c-148 -299 -392 -491 -674 -492c-25 0 -45 20 -45 45s20 44 45 44c235 1 440 156 574 402c-150 -58 -433 -102 -590 300c398 164 581 -41 651 -166c36 89 62 186 79 291c0 0 -510 -80 -546 358c435 175 557 -280 557 -280
-c6 61 12 192 12 195c0 0 -388 269 -139 603c455 -157 224 -593 224 -593c2 -6 2 -87 0 -122c0 0 165 325 498 210c-15 -489 -518 -388 -518 -388c-16 -100 -41 -195 -73 -283c0 0 303 335 628 73z" />
-    <glyph glyph-name="credit-card-alt" unicode="&#xf283;" horiz-adv-x="2304" 
-d="M0 32v608h2304v-608c0 -88 -72 -160 -160 -160h-1984c-88 0 -160 72 -160 160zM640 256v-128h384v128h-384zM256 256v-128h256v128h-256zM2144 1408c88 0 160 -72 160 -160v-224h-2304v224c0 88 72 160 160 160h1984z" />
-    <glyph glyph-name="file-word-o" unicode="&#xf1c2;" 
-d="M1468 1156c37 -37 68 -111 68 -164v-1152c0 -53 -43 -96 -96 -96h-1344c-53 0 -96 43 -96 96v1600c0 53 43 96 96 96h896c53 0 127 -31 164 -68zM1024 1400v-376h376c-6 17 -15 34 -22 41l-313 313c-7 7 -24 16 -41 22zM1408 -128v1024h-416c-53 0 -96 43 -96 96v416
-h-768v-1536h1280zM233 768h300v-107h-90l99 -438c4 -16 6 -33 7 -46l2 -21h4l4 21c3 13 4 30 8 46l144 545h114l144 -545c4 -16 6 -33 9 -46c1 -7 3 -15 3 -21h4l2 21c1 13 3 30 7 46l99 438h-90v107h300v-107h-70l-164 -661h-159l-128 485c-5 16 -6 32 -9 46l-3 24h-4
-c0 -8 -1 -16 -2 -24c-2 -16 -5 -31 -10 -46l-128 -485h-159l-164 661h-70v107z" />
-    <glyph glyph-name="map" unicode="&#xf279;" horiz-adv-x="1792" 
-d="M512 1536c17 0 32 -15 32 -32v-1472c0 -12 -7 -23 -17 -28l-480 -256c-5 -3 -10 -4 -15 -4c-17 0 -32 15 -32 32v1472c0 12 7 23 17 28l480 256c5 3 10 4 15 4zM1760 1536c17 0 32 -15 32 -32v-1472c0 -12 -7 -23 -17 -28l-480 -256c-5 -3 -10 -4 -15 -4
-c-17 0 -32 15 -32 32v1472c0 12 7 23 17 28l480 256c5 3 10 4 15 4zM640 1536c5 0 10 -1 14 -3l512 -256c11 -6 18 -17 18 -29v-1472c0 -17 -15 -32 -32 -32c-5 0 -10 1 -14 3l-512 256c-11 6 -18 17 -18 29v1472c0 17 15 32 32 32z" />
-    <glyph glyph-name="object-ungroup" 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="briefcase" unicode="&#xf0b1;" horiz-adv-x="1792" 
-d="M640 1280h512v128h-512v-128zM1792 640v-480c0 -88 -72 -160 -160 -160h-1472c-88 0 -160 72 -160 160v480h672v-160c0 -35 29 -64 64 -64h320c35 0 64 29 64 64v160h672zM1024 640v-128h-256v128h256zM1792 1120v-384h-1792v384c0 88 72 160 160 160h352v160
-c0 53 43 96 96 96h576c53 0 96 -43 96 -96v-160h352c88 0 160 -72 160 -160z" />
-    <glyph glyph-name="weixin" unicode="&#xf1d7;" horiz-adv-x="2048" 
-d="M580 1075c0 55 -36 91 -91 91c-54 0 -109 -36 -109 -91c0 -54 55 -90 109 -90c55 0 91 36 91 90zM1323 568c0 36 -36 72 -91 72c-36 0 -72 -36 -72 -72c0 -37 36 -73 72 -73c55 0 91 36 91 73zM1087 1075c0 55 -36 91 -90 91c-55 0 -109 -36 -109 -91
-c0 -54 54 -90 109 -90c54 0 90 36 90 90zM1722 568c0 36 -37 72 -91 72c-36 0 -72 -36 -72 -72c0 -37 36 -73 72 -73c54 0 91 36 91 73zM1456 965c-23 3 -46 4 -70 4c-344 0 -616 -257 -616 -573c0 -53 8 -104 23 -152c-23 -2 -45 -3 -68 -3c-91 0 -163 18 -254 36
-l-253 -127l72 218c-181 127 -290 291 -290 490c0 345 326 616 725 616c356 0 669 -217 731 -509zM2048 404c0 -163 -108 -308 -254 -417l55 -181l-199 109c-73 -18 -146 -37 -218 -37c-345 0 -616 236 -616 526s271 526 616 526c326 0 616 -236 616 -526z" />
-    <glyph glyph-name="stop" unicode="&#xf04d;" 
-d="M1536 1344v-1408c0 -35 -29 -64 -64 -64h-1408c-35 0 -64 29 -64 64v1408c0 35 29 64 64 64h1408c35 0 64 -29 64 -64z" />
-    <glyph glyph-name="clone" unicode="&#xf24d;" horiz-adv-x="1792" 
-d="M1664 -96v1088c0 17 -15 32 -32 32h-1088c-17 0 -32 -15 -32 -32v-1088c0 -17 15 -32 32 -32h1088c17 0 32 15 32 32zM1792 992v-1088c0 -88 -72 -160 -160 -160h-1088c-88 0 -160 72 -160 160v1088c0 88 72 160 160 160h1088c88 0 160 -72 160 -160zM1408 1376v-160
-h-128v160c0 17 -15 32 -32 32h-1088c-17 0 -32 -15 -32 -32v-1088c0 -17 15 -32 32 -32h160v-128h-160c-88 0 -160 72 -160 160v1088c0 88 72 160 160 160h1088c88 0 160 -72 160 -160z" />
-    <glyph glyph-name="thermometer-full" unicode="&#xf2c7;" horiz-adv-x="1024" 
-d="M640 192c0 -106 -86 -192 -192 -192s-192 86 -192 192c0 80 50 153 128 181v907h128v-907c78 -28 128 -101 128 -181zM768 192c0 105 -50 197 -128 256v768c0 106 -86 192 -192 192s-192 -86 -192 -192v-768c-78 -59 -128 -151 -128 -256c0 -177 143 -320 320 -320
-s320 143 320 320zM896 192c0 -247 -201 -448 -448 -448s-448 201 -448 448c0 122 49 232 128 313v711c0 177 143 320 320 320s320 -143 320 -320v-711c79 -81 128 -191 128 -313zM1024 768v-128h-192v128h192zM1024 1024v-128h-192v128h192zM1024 1280v-128h-192v128h192z
-" />
-    <glyph glyph-name="plane" unicode="&#xf072;" horiz-adv-x="1402" 
-d="M1376 1376c64 -64 0 -224 -96 -320l-161 -161l160 -696c3 -12 -2 -25 -12 -33l-128 -96c-5 -4 -12 -6 -19 -6c-2 0 -4 0 -7 1c-9 2 -17 7 -21 16l-279 508l-259 -259l53 -194c3 -11 0 -22 -8 -31l-96 -96c-6 -6 -15 -9 -23 -9h-2c-10 1 -18 5 -24 13l-189 252l-252 189
-c-8 5 -12 14 -13 23s3 18 9 25l96 97c6 6 15 9 23 9c3 0 6 0 8 -1l194 -53l259 259l-508 279c-9 5 -15 14 -17 24c-1 9 2 20 9 27l128 128c8 7 20 11 30 8l665 -159l160 160c96 96 256 160 320 96z" />
-    <glyph glyph-name="check-square" unicode="&#xf14a;" 
-d="M685 237l614 614c25 25 25 65 0 90l-102 102c-25 25 -65 25 -90 0l-467 -467l-211 211c-25 25 -65 25 -90 0l-102 -102c-25 -25 -25 -65 0 -90l358 -358c25 -25 65 -25 90 0zM1536 1120v-960c0 -159 -129 -288 -288 -288h-960c-159 0 -288 129 -288 288v960
-c0 159 129 288 288 288h960c159 0 288 -129 288 -288z" />
-    <glyph glyph-name="window-maximize" unicode="&#xf2d0;" horiz-adv-x="1792" 
-d="M256 128h1280v768h-1280v-768zM1792 1248v-1216c0 -88 -72 -160 -160 -160h-1472c-88 0 -160 72 -160 160v1216c0 88 72 160 160 160h1472c88 0 160 -72 160 -160z" />
-    <glyph glyph-name="github" unicode="&#xf09b;" 
-d="M768 1408c424 0 768 -344 768 -768c0 -339 -220 -627 -525 -729c-39 -7 -53 17 -53 37c0 25 1 108 1 211c0 72 -24 118 -52 142c171 19 351 84 351 379c0 84 -30 152 -79 206c8 20 34 98 -8 204c-64 20 -211 -79 -211 -79c-61 17 -127 26 -192 26s-131 -9 -192 -26
-c0 0 -147 99 -211 79c-42 -106 -16 -184 -8 -204c-49 -54 -79 -122 -79 -206c0 -294 179 -360 350 -379c-22 -20 -42 -54 -49 -103c-44 -20 -156 -54 -223 64c-42 73 -118 79 -118 79c-75 1 -5 -47 -5 -47c50 -23 85 -112 85 -112c45 -137 259 -91 259 -91
-c0 -64 1 -124 1 -143c0 -20 -14 -44 -53 -37c-305 102 -525 390 -525 729c0 424 344 768 768 768zM291 305c-2 -4 -8 -5 -13 -2c-6 3 -9 8 -7 12c2 3 7 4 13 2c6 -3 9 -8 7 -12zM322 271c-4 -4 -11 -2 -16 3c-5 6 -6 13 -2 16c4 4 11 2 16 -3c5 -6 6 -13 2 -16zM352 226
-c-4 -3 -12 0 -17 7s-5 15 0 18c5 4 13 1 17 -6c5 -7 5 -15 0 -19zM394 184c-4 -5 -13 -4 -20 3c-7 6 -9 15 -4 19c4 5 13 4 20 -3c6 -6 8 -15 4 -19zM451 159c-2 -6 -11 -9 -19 -6c-9 2 -15 9 -13 15s11 9 19 7c9 -3 15 -10 13 -16zM514 154c0 -6 -7 -11 -16 -11
-c-10 -1 -17 4 -17 11c0 6 7 11 16 11c9 1 17 -4 17 -11zM572 164c1 -6 -5 -12 -14 -14s-17 2 -18 8c-1 7 5 13 14 15c9 1 17 -3 18 -9z" />
-    <glyph glyph-name="mastodon" unicode="&#xf2e1;" 
-d="M1503 425c-23 -116 -202 -243 -408 -268c-108 -13 -214 -25 -327 -20c-185 8 -330 44 -330 44c0 -18 1 -35 3 -51c24 -182 181 -193 329 -198c150 -5 284 37 284 37l6 -136s-105 -56 -292 -66c-103 -6 -230 3 -379 42c-323 85 -379 430 -388 779c-3 104 -1 201 -1 283
-c0 357 235 462 235 462c118 54 320 77 531 79h5c211 -2 413 -25 531 -79c0 0 234 -105 234 -462c0 0 3 -263 -33 -446zM1260 843c0 88 -22 160 -68 211c-47 52 -107 79 -183 79c-88 0 -154 -34 -198 -101l-43 -72l-43 72c-44 67 -110 101 -198 101c-76 0 -136 -27 -183 -79
-c-45 -52 -68 -123 -68 -211v-432h171v420c0 88 38 133 112 133c82 0 124 -54 124 -159v-229h170v229c0 105 42 159 124 159c74 0 112 -45 112 -133v-420h171v432v0z" />
-    <glyph glyph-name="envelope-open" unicode="&#xf2b6;" horiz-adv-x="1792" 
-d="M1792 882v-978c0 -88 -72 -160 -160 -160h-1472c-88 0 -160 72 -160 160v978c0 9 4 18 11 24c105 92 106 103 628 484c63 46 174 146 257 146s195 -101 257 -146c522 -381 523 -392 628 -484c7 -6 11 -15 11 -24zM1228 297c156 113 265 192 345 252c14 10 17 30 6 44
-l-38 52c-11 14 -31 17 -45 6c-79 -58 -187 -138 -343 -250c-62 -45 -174 -145 -257 -145s-195 100 -257 145c-156 113 -264 192 -343 250c-14 11 -34 8 -45 -6l-38 -52c-11 -14 -8 -34 6 -44c80 -60 189 -139 345 -252c78 -56 201 -169 332 -169c132 0 258 115 332 169z" />
-    <glyph glyph-name="step-backward" unicode="&#xf048;" horiz-adv-x="1024" 
-d="M979 1395c25 25 45 16 45 -19v-1472c0 -35 -20 -44 -45 -19l-710 710c-6 6 -10 12 -13 19v-678c0 -35 -29 -64 -64 -64h-128c-35 0 -64 29 -64 64v1408c0 35 29 64 64 64h128c35 0 64 -29 64 -64v-678c3 7 7 13 13 19z" />
-    <glyph glyph-name="wheelchair" unicode="&#xf193;" horiz-adv-x="1629" 
-d="M1023 349l102 -204c-77 -238 -299 -401 -549 -401c-317 0 -576 259 -576 576c0 242 152 458 379 541l17 -131c-163 -72 -268 -232 -268 -410c0 -247 201 -448 448 -448c257 0 465 220 447 477zM1571 249l58 -114l-256 -128c-9 -5 -19 -7 -29 -7c-24 0 -47 14 -57 35
-l-239 477h-472c-32 0 -60 25 -64 57l-96 779c-1 10 3 32 6 42c19 69 83 114 154 114c88 0 160 -72 160 -160c0 -91 -80 -169 -172 -159l37 -289h423v-128h-407l16 -128h455c24 0 47 -14 57 -35l228 -455z" />
-    <glyph glyph-name="bootstrap" unicode="&#xf315;" 
-d="M256 1408h1024c141 0 256 -115 256 -256v-1024c0 -141 -115 -256 -256 -256h-1024c-141 0 -256 115 -256 256v1024c0 141 115 256 256 256zM494 1020v-795h310c169 0 270 83 270 223c0 106 -69 182 -177 196v4c77 14 137 91 137 174c0 119 -93 198 -229 198h-311z
-M593 933h190c97 0 150 -44 150 -123c0 -86 -64 -133 -181 -133h-159v256zM593 592v0h187c127 0 192 -47 192 -139s-63 -141 -183 -141h-196v280z" />
-    <glyph glyph-name="cutlery" unicode="&#xf0f5;" horiz-adv-x="1408" 
-d="M640 1472v-640c0 -81 -52 -154 -128 -181v-779c0 -70 -58 -128 -128 -128h-128c-70 0 -128 58 -128 128v779c-76 27 -128 100 -128 181v640c0 35 29 64 64 64s64 -29 64 -64v-416c0 -35 29 -64 64 -64s64 29 64 64v416c0 35 29 64 64 64s64 -29 64 -64v-416
-c0 -35 29 -64 64 -64s64 29 64 64v416c0 35 29 64 64 64s64 -29 64 -64zM1408 1472v-1600c0 -70 -58 -128 -128 -128h-128c-70 0 -128 58 -128 128v512h-224c-17 0 -32 15 -32 32v800c0 176 144 320 320 320h256c35 0 64 -29 64 -64z" />
-    <glyph glyph-name="microphone-slash" unicode="&#xf131;" horiz-adv-x="1382" 
-d="M258 591l-101 -101c-27 66 -42 138 -42 214v128c0 35 29 64 64 64s64 -29 64 -64v-128c0 -39 6 -77 15 -113zM1372 1193l-361 -361v-128c0 -176 -144 -320 -320 -320c-38 0 -75 7 -109 19l-96 -96c61 -32 131 -51 205 -51c247 0 448 201 448 448v128c0 35 29 64 64 64
-s64 -29 64 -64v-128c0 -296 -224 -540 -512 -572v-132h256c35 0 64 -29 64 -64s-29 -64 -64 -64h-640c-35 0 -64 29 -64 64s29 64 64 64h256v132c-85 9 -165 38 -235 81l-254 -254c-13 -13 -33 -13 -46 0l-82 82c-13 13 -13 33 0 46l1234 1234c13 13 33 13 46 0l82 -82
-c13 -13 13 -33 0 -46zM992 1325l-621 -621v512c0 176 144 320 320 320c138 0 256 -89 301 -211z" />
-    <glyph glyph-name="user-plus" unicode="&#xf234;" horiz-adv-x="2048" 
-d="M704 640c-212 0 -384 172 -384 384s172 384 384 384s384 -172 384 -384s-172 -384 -384 -384zM1664 512h352c17 0 32 -15 32 -32v-192c0 -17 -15 -32 -32 -32h-352v-352c0 -17 -15 -32 -32 -32h-192c-17 0 -32 15 -32 32v352h-352c-17 0 -32 15 -32 32v192
-c0 17 15 32 32 32h352v352c0 17 15 32 32 32h192c17 0 32 -15 32 -32v-352zM928 288c0 -70 58 -128 128 -128h256v-238c-49 -36 -111 -50 -171 -50h-874c-160 0 -267 96 -267 259c0 226 53 573 346 573c16 0 27 -7 39 -17c98 -75 193 -122 319 -122s221 47 319 122
-c12 10 23 17 39 17c85 0 160 -32 217 -96h-223c-70 0 -128 -58 -128 -128v-192z" />
-    <glyph glyph-name="truck" unicode="&#xf0d1;" horiz-adv-x="1728" 
-d="M576 128c0 70 -58 128 -128 128s-128 -58 -128 -128s58 -128 128 -128s128 58 128 128zM192 640h384v256h-158c-4 0 -19 -6 -22 -9l-195 -195c-3 -3 -9 -18 -9 -22v-30zM1472 128c0 70 -58 128 -128 128s-128 -58 -128 -128s58 -128 128 -128s128 58 128 128zM1728 1216
-v-1024c0 -74 -78 -64 -128 -64c0 -141 -115 -256 -256 -256s-256 115 -256 256h-384c0 -141 -115 -256 -256 -256s-256 115 -256 256h-64c-50 0 -128 -10 -128 64c0 35 29 64 64 64v320c0 71 -10 150 45 205l198 198c25 25 73 45 109 45h160v192c0 35 29 64 64 64h1024
-c35 0 64 -29 64 -64z" />
-    <glyph glyph-name="wrench" unicode="&#xf0ad;" horiz-adv-x="1641" 
-d="M363 64c0 35 -29 64 -64 64s-64 -29 -64 -64s29 -64 64 -64s64 29 64 64zM1007 484l-682 -682c-23 -23 -56 -37 -90 -37s-67 14 -91 37l-106 108c-24 23 -38 56 -38 90s14 67 38 91l681 681c52 -131 157 -236 288 -288zM1641 919c0 -33 -12 -74 -23 -106
-c-63 -178 -234 -301 -423 -301c-247 0 -448 201 -448 448s201 448 448 448c73 0 168 -22 229 -63c10 -7 16 -16 16 -28c0 -11 -7 -22 -16 -28l-293 -169v-224l193 -107c33 19 265 165 285 165s32 -15 32 -35z" />
-    <glyph glyph-name="ambulance" unicode="&#xf0f9;" horiz-adv-x="1856" 
-d="M576 128c0 71 -57 128 -128 128s-128 -57 -128 -128s57 -128 128 -128s128 57 128 128zM192 640h384v256h-158c-6 -1 -17 -5 -22 -9l-195 -195c-3 -5 -8 -16 -9 -22v-30zM1472 128c0 71 -57 128 -128 128s-128 -57 -128 -128s57 -128 128 -128s128 57 128 128zM1600 800
-v192c0 18 -14 32 -32 32h-224v224c0 18 -14 32 -32 32h-192c-18 0 -32 -14 -32 -32v-224h-224c-18 0 -32 -14 -32 -32v-192c0 -18 14 -32 32 -32h224v-224c0 -18 14 -32 32 -32h192c18 0 32 14 32 32v224h224c18 0 32 14 32 32zM1856 1344v-1152c0 -35 -29 -64 -64 -64h-192
-c0 -141 -114 -256 -256 -256c-141 0 -256 115 -256 256h-384c0 -141 -114 -256 -256 -256s-256 115 -256 256h-128c-35 0 -64 29 -64 64s29 64 64 64v416c0 35 20 84 45 109l198 198c25 25 74 45 109 45h160v320c0 35 29 64 64 64h1152c35 0 64 -29 64 -64z" />
-    <glyph glyph-name="cc-visa" unicode="&#xf1f0;" horiz-adv-x="2304" 
-d="M1975 546h-138s14 37 66 179c-1 -1 14 37 22 61l12 -55c31 -153 38 -185 38 -185zM531 611l-58 295c-8 41 -39 54 -75 54h-268l-2 -13c184 -47 335 -147 403 -336zM710 960l-162 -438l-17 89c-35 93 -120 179 -216 218l135 -510h175l261 641h-176zM849 318h166l104 642
-h-166zM1617 944c-33 13 -85 27 -149 27c-164 0 -279 -87 -280 -212c-1 -92 82 -143 145 -174c65 -31 86 -52 86 -80c0 -43 -52 -62 -99 -62c-67 0 -103 8 -156 33l-22 11l-23 -144c39 -18 110 -34 185 -34c174 -1 287 86 289 219c0 73 -45 128 -140 174
-c-58 29 -93 50 -93 80c0 27 30 55 95 55c54 1 94 -10 124 -24l15 -8zM2042 960h-128c-40 0 -70 -12 -87 -54l-246 -588h174c28 79 35 96 35 96h212s5 -22 20 -96h154zM2304 1280v-1280c0 -70 -58 -128 -128 -128h-2048c-70 0 -128 58 -128 128v1280c0 70 58 128 128 128
-h2048c70 0 128 -58 128 -128z" />
-    <glyph glyph-name="superscript" unicode="&#xf12b;" horiz-adv-x="1529" 
-d="M892 167v-167h-248l-159 252l-24 42c-6 7 -9 14 -11 21h-3c-2 -7 -6 -14 -9 -21c-6 -12 -15 -28 -25 -44l-155 -250h-258v167h128l197 291l-185 272h-137v168h276l139 -228c9 -14 16 -29 23 -42c6 -7 9 -14 11 -21h3c2 7 6 14 11 21l25 42l140 228h257v-168h-125
-l-184 -267l204 -296h109zM1529 846v-206h-514l-3 27c-2 14 -4 33 -4 46c0 273 350 296 350 441c0 52 -47 87 -100 87c-38 0 -72 -18 -97 -39c-13 -11 -25 -25 -36 -38l-105 92c18 25 38 46 63 66c42 33 103 65 188 65c145 0 246 -85 246 -218c0 -240 -332 -260 -346 -403
-h232v80h126z" />
-    <glyph glyph-name="pixelfed" unicode="&#xf314;" 
-d="M768 -128c-424 0 -768 344 -768 768s344 768 768 768s768 -344 768 -768s-344 -768 -768 -768zM707 472h141c133 0 240 105 240 234s-107 234 -240 234h-203c-77 0 -139 -60 -139 -135v-525z" />
-    <glyph glyph-name="tty" unicode="&#xf1e4;" horiz-adv-x="1792" 
-d="M448 224v-192c0 -18 -14 -32 -32 -32h-192c-18 0 -32 14 -32 32v192c0 18 14 32 32 32h192c18 0 32 -14 32 -32zM256 608v-192c0 -18 -14 -32 -32 -32h-192c-18 0 -32 14 -32 32v192c0 18 14 32 32 32h192c18 0 32 -14 32 -32zM832 224v-192c0 -18 -14 -32 -32 -32h-192
-c-18 0 -32 14 -32 32v192c0 18 14 32 32 32h192c18 0 32 -14 32 -32zM640 608v-192c0 -18 -14 -32 -32 -32h-192c-18 0 -32 14 -32 32v192c0 18 14 32 32 32h192c18 0 32 -14 32 -32zM66 768c-37 0 -66 29 -66 65v129h514v-129c0 -36 -29 -65 -65 -65h-383zM1216 224v-192
-c0 -18 -14 -32 -32 -32h-192c-18 0 -32 14 -32 32v192c0 18 14 32 32 32h192c18 0 32 -14 32 -32zM1024 608v-192c0 -18 -14 -32 -32 -32h-192c-18 0 -32 14 -32 32v192c0 18 14 32 32 32h192c18 0 32 -14 32 -32zM1600 224v-192c0 -18 -14 -32 -32 -32h-192
-c-18 0 -32 14 -32 32v192c0 18 14 32 32 32h192c18 0 32 -14 32 -32zM1408 608v-192c0 -18 -14 -32 -32 -32h-192c-18 0 -32 14 -32 32v192c0 18 14 32 32 32h192c18 0 32 -14 32 -32zM1792 1016v-13h-514v10c0 37 -32 104 -382 102c-350 -1 -382 -65 -382 -102v-10h-514v13
-c0 67 120 392 896 392c775 0 896 -325 896 -392zM1792 608v-192c0 -18 -14 -32 -32 -32h-192c-18 0 -32 14 -32 32v192c0 18 14 32 32 32h192c18 0 32 -14 32 -32zM1792 962v-129c0 -36 -29 -65 -65 -65h-384c-36 0 -65 29 -65 65v129h514z" />
-    <glyph glyph-name="linode" unicode="&#xf2b8;" horiz-adv-x="1494" 
-d="M309 1l202 -214l-34 236l-216 213zM535 -225l274 218l-11 245l-300 -215zM224 413l227 -213l-48 327l-245 204zM474 189l317 214l-14 324l-352 -200zM822 178l95 -80l-2 239l-103 79c0 -8 4 -22 -4 -28l-78 -52l85 -70c10 -8 7 -76 7 -88zM117 930l256 -200l-68 465
-l-279 173zM1152 267l15 234l-230 -164l2 -240zM396 722l373 194l-19 441l-423 -163zM1249 357l20 233l-226 142l-2 -105l144 -95c3 -2 5 -6 4 -9l-7 -119zM1440 496l30 222l-179 -128l-20 -228zM1252 329l-71 49l-8 -117c0 -3 -1 -6 -4 -8l-234 -187c-4 -3 -10 -3 -14 0
-l-98 83l7 -161c0 -3 -1 -6 -4 -8l-293 -234c-2 -1 -4 -2 -6 -2c-3 1 -6 1 -8 3l-228 242c-5 5 -54 252 -59 277c-1 4 2 9 5 11l61 37c-12 11 -93 82 -95 92l-72 351c-1 4 1 9 6 12l94 45c-16 12 -132 96 -135 108l-96 466c-1 6 2 11 7 13l433 135c2 0 5 0 8 -1l317 -153
-c3 -2 6 -6 6 -9l20 -463c0 -4 -2 -8 -6 -10l-118 -61l126 -85c3 -1 5 -5 5 -8l5 -123l121 74c3 2 8 2 11 0l84 -56l3 110c0 3 2 7 5 9l206 126c4 2 8 2 11 0l245 -135c2 -2 4 -4 5 -7c2 -7 -31 -232 -34 -255c0 -3 -2 -6 -4 -7l-191 -153c-4 -3 -9 -3 -13 0z" />
-    <glyph glyph-name="shield" unicode="&#xf132;" horiz-adv-x="1280" 
-d="M1088 576v640h-448v-1137c51 27 133 74 213 137c107 84 235 215 235 360zM1280 1344v-768c0 -421 -589 -687 -614 -698c-8 -4 -17 -6 -26 -6s-18 2 -26 6c-25 11 -614 277 -614 698v768c0 35 29 64 64 64h1152c35 0 64 -29 64 -64z" />
-    <glyph glyph-name="user-md" unicode="&#xf0f0;" horiz-adv-x="1408" 
-d="M384 192c0 -35 -29 -64 -64 -64s-64 29 -64 64s29 64 64 64s64 -29 64 -64zM1408 131c0 -163 -107 -259 -267 -259h-874c-160 0 -267 96 -267 259c0 199 40 513 278 565c-16 -38 -22 -79 -22 -120v-203c-77 -27 -128 -100 -128 -181c0 -106 86 -192 192 -192
-s192 86 192 192c0 81 -52 154 -128 181v203c0 33 3 66 25 93c84 -66 188 -104 295 -104s211 38 295 104c22 -27 25 -60 25 -93v-64c-141 0 -256 -115 -256 -256v-89c-20 -18 -32 -44 -32 -71c0 -53 43 -96 96 -96s96 43 96 96c0 27 -12 53 -32 71v89c0 70 58 128 128 128
-s128 -58 128 -128v-89c-20 -18 -32 -44 -32 -71c0 -53 43 -96 96 -96s96 43 96 96c0 27 -12 53 -32 71v89c0 91 -49 176 -128 221c0 73 7 151 -22 219c238 -52 278 -366 278 -565zM1088 1024c0 -212 -172 -384 -384 -384s-384 172 -384 384s172 384 384 384
-s384 -172 384 -384z" />
-    <glyph glyph-name="xmpp" unicode="&#xf2f9;" horiz-adv-x="1542" 
-d="M1536 1314c47 -398 -206 -904 -657 -1199c122 -101 261 -177 414 -216v-27c-165 14 -320 59 -461 128l-30 15l-1 1l-6 3c-11 6 -30 16 -41 22c-94 -51 -193 -90 -297 -116c-68 -19 -139 -33 -211 -42v28c145 37 279 107 396 201c-426 296 -682 805 -637 1192l93 -33v0
-l273 -81c-1 -16 -1 -32 -1 -49c0 -296 147 -656 394 -917c254 262 406 628 406 929c0 17 0 33 -1 49l274 81z" />
-    <glyph glyph-name="moon-o" unicode="&#xf186;" horiz-adv-x="1471" 
-d="M1262 233c-36 -6 -73 -9 -110 -9c-371 0 -672 301 -672 672c0 127 37 251 104 357c-266 -79 -456 -323 -456 -613c0 -353 287 -640 640 -640c193 0 374 88 494 233zM1465 318c-125 -271 -399 -446 -697 -446c-423 0 -768 345 -768 768c0 415 325 752 739 767
-c28 1 51 -15 61 -39c11 -25 4 -54 -15 -72c-114 -104 -177 -246 -177 -400c0 -300 244 -544 544 -544c79 0 155 17 228 51c25 11 53 6 72 -13s24 -48 13 -72z" />
-    <glyph glyph-name="pie-chart" unicode="&#xf200;" horiz-adv-x="1728" 
-d="M768 646l546 -546c-139 -141 -333 -228 -546 -228c-424 0 -768 344 -768 768s344 768 768 768v-762zM955 640h773c0 -213 -87 -407 -228 -546zM1664 768h-768v768c424 0 768 -344 768 -768z" />
-    <glyph glyph-name="align-left" unicode="&#xf036;" horiz-adv-x="1792" 
-d="M1792 192v-128c0 -35 -29 -64 -64 -64h-1664c-35 0 -64 29 -64 64v128c0 35 29 64 64 64h1664c35 0 64 -29 64 -64zM1408 576v-128c0 -35 -29 -64 -64 -64h-1280c-35 0 -64 29 -64 64v128c0 35 29 64 64 64h1280c35 0 64 -29 64 -64zM1664 960v-128
-c0 -35 -29 -64 -64 -64h-1536c-35 0 -64 29 -64 64v128c0 35 29 64 64 64h1536c35 0 64 -29 64 -64zM1280 1344v-128c0 -35 -29 -64 -64 -64h-1152c-35 0 -64 29 -64 64v128c0 35 29 64 64 64h1152c35 0 64 -29 64 -64z" />
-    <glyph glyph-name="motorcycle" unicode="&#xf21c;" horiz-adv-x="2304" 
-d="M2301 500c32 -281 -197 -517 -476 -499c-214 14 -392 185 -414 399c-16 152 44 289 146 381l-71 107c-126 -105 -206 -262 -206 -438c0 -36 -28 -66 -64 -66h-325c-31 -217 -217 -384 -443 -384c-247 0 -448 201 -448 448s201 448 448 448c53 0 104 -10 152 -27l24 45
-c-77 69 -178 110 -304 110h-64c-35 0 -64 29 -64 64s29 64 64 64h128c224 0 338 -92 384 -128h627l-85 128h-222c-39 0 -70 35 -63 75c5 31 35 53 66 53h253c21 0 41 -11 53 -28l70 -105l114 114c12 12 29 19 46 19h101c35 0 64 -29 64 -64v-128c0 -35 -29 -64 -64 -64h-179
-l115 -172c81 39 175 55 275 36c191 -35 340 -195 362 -388zM448 128c155 0 284 110 314 256h-314c-22 0 -43 12 -55 31c-11 19 -12 43 -1 63l147 277c-29 8 -59 13 -91 13c-176 0 -320 -144 -320 -320s144 -320 320 -320zM1856 128c176 0 320 144 320 320s-144 320 -320 320
-c-43 0 -83 -9 -121 -24l174 -260c20 -30 12 -70 -17 -89c-11 -8 -24 -11 -36 -11c-21 0 -41 10 -53 29l-174 260c-57 -58 -93 -137 -93 -225c0 -176 144 -320 320 -320z" />
-    <glyph glyph-name="nextcloud-square" unicode="&#xf307;" 
-d="M257 1408h1022c142 0 257 -115 257 -257v-1022c0 -142 -115 -257 -257 -257h-1022c-142 0 -257 115 -257 257v1022c0 142 115 257 257 257zM772 969v0c-145 0 -268 -98 -307 -230c-34 69 -105 118 -187 118c-114 0 -208 -94 -208 -208s94 -207 208 -207
-c82 0 153 48 187 117c39 -132 162 -230 307 -230s267 98 306 230c34 -69 105 -117 187 -117c114 0 208 93 208 207s-94 208 -208 208c-82 0 -153 -49 -187 -118c-39 132 -161 230 -306 230zM772 846v0c106 0 196 -88 196 -197s-87 -196 -196 -196s-197 87 -197 196
-s88 197 197 197zM278 733c47 0 84 -37 84 -84s-37 -84 -84 -84s-84 37 -84 84s37 84 84 84zM1265 733c47 0 84 -37 84 -84s-37 -84 -84 -84s-84 37 -84 84s37 84 84 84z" />
-    <glyph glyph-name="ticket" unicode="&#xf145;" horiz-adv-x="1685" 
-d="M970 1084l316 -316l-572 -572l-316 316zM760 105l618 618c25 25 25 65 0 90l-362 362c-24 24 -66 24 -90 0l-618 -618c-25 -25 -25 -65 0 -90l362 -362c12 -12 27 -18 44 -18s34 6 46 18zM1648 742l-906 -908c-50 -49 -133 -49 -182 0l-126 126c75 75 75 197 0 272
-s-197 75 -272 0l-124 126c-50 49 -50 131 0 181l906 906c49 50 132 50 182 0l124 -125c-75 -75 -75 -197 0 -272s197 -75 272 0l126 -125c49 -50 49 -132 0 -181z" />
-    <glyph glyph-name="battery-half" unicode="&#xf242;" horiz-adv-x="2304" 
-d="M256 256v768h896v-768h-896zM2176 960c71 0 128 -57 128 -128v-384c0 -71 -57 -128 -128 -128v-160c0 -88 -72 -160 -160 -160h-1856c-88 0 -160 72 -160 160v960c0 88 72 160 160 160h1856c88 0 160 -72 160 -160v-160zM2176 448v384h-128v288c0 18 -14 32 -32 32h-1856
-c-18 0 -32 -14 -32 -32v-960c0 -18 14 -32 32 -32h1856c18 0 32 14 32 32v288h128z" />
-    <glyph glyph-name="spotify" unicode="&#xf1bc;" 
-d="M1127 326c0 28 -11 39 -30 51c-129 77 -279 115 -447 115c-98 0 -192 -13 -287 -34c-23 -5 -42 -20 -42 -52c0 -25 19 -49 49 -49c9 0 25 5 37 8c78 16 160 27 243 27c147 0 286 -36 397 -103c12 -7 20 -11 33 -11c25 0 47 20 47 48zM1223 541c0 27 -10 46 -35 61
-c-153 91 -347 141 -548 141c-129 0 -217 -18 -303 -42c-32 -9 -48 -31 -48 -64s27 -60 60 -60c14 0 22 4 37 8c70 19 154 33 251 33c190 0 363 -50 488 -124c11 -6 22 -13 38 -13c34 0 60 27 60 60zM1331 789c0 37 -16 56 -40 70c-173 101 -410 148 -636 148
-c-133 0 -255 -15 -364 -47c-28 -8 -54 -32 -54 -74c0 -41 31 -73 72 -73c15 0 29 5 40 8c97 27 202 37 307 37c208 0 424 -46 563 -129c14 -8 24 -12 40 -12c38 0 72 30 72 72zM1536 640c0 -424 -344 -768 -768 -768s-768 344 -768 768s344 768 768 768s768 -344 768 -768z
-" />
-    <glyph glyph-name="dot-circle-o" unicode="&#xf192;" 
-d="M1024 640c0 -141 -115 -256 -256 -256s-256 115 -256 256s115 256 256 256s256 -115 256 -256zM768 1184c-300 0 -544 -244 -544 -544s244 -544 544 -544s544 244 544 544s-244 544 -544 544zM1536 640c0 -424 -344 -768 -768 -768s-768 344 -768 768s344 768 768 768
-s768 -344 768 -768z" />
-    <glyph glyph-name="facebook-square" unicode="&#xf082;" 
-d="M1248 1408c159 0 288 -129 288 -288v-960c0 -159 -129 -288 -288 -288h-188v595h199l30 232h-229v148c0 67 18 112 115 112l122 1v207c-21 3 -94 9 -178 9c-177 0 -299 -108 -299 -306v-171h-200v-232h200v-595h-532c-159 0 -288 129 -288 288v960c0 159 129 288 288 288
-h960z" />
-    <glyph glyph-name="facebook-messenger" unicode="&#xf2fe;" horiz-adv-x="1520" 
-d="M760 1408c420 0 760 -318 760 -711c0 -476 -490 -817 -978 -681l-260 -144v272c-556 420 -235 1264 478 1264zM841 455l415 440l-379 -209l-197 204l-415 -441l379 210z" />
-    <glyph glyph-name="angle-up" unicode="&#xf106;" horiz-adv-x="998" 
-d="M998 352c0 -8 -4 -17 -10 -23l-50 -50c-6 -6 -14 -10 -23 -10c-8 0 -17 4 -23 10l-393 393l-393 -393c-6 -6 -15 -10 -23 -10s-17 4 -23 10l-50 50c-6 6 -10 15 -10 23s4 17 10 23l466 466c6 6 15 10 23 10s17 -4 23 -10l466 -466c6 -6 10 -15 10 -23z" />
-    <glyph glyph-name="glide" unicode="&#xf2a5;" 
-d="M866 1021c0 -32 -7 -63 -13 -94c-21 -100 -41 -200 -62 -300c-3 -14 -3 -14 -18 -15c-10 -1 -21 -2 -31 -2c-86 0 -110 93 -110 163c0 104 41 243 138 298c16 8 33 14 51 14c41 0 45 -30 45 -64zM1352 597c0 18 -74 135 -91 142c-8 3 -25 8 -34 8
-c-82 0 -156 -37 -226 -77l-2 2c16 107 52 202 52 313c0 159 -85 233 -242 233c-23 0 -46 -3 -68 -6c-197 -35 -317 -260 -317 -445c0 -196 113 -304 308 -304c4 0 25 2 25 -3c0 -2 0 -3 -1 -5c-4 -38 -16 -80 -26 -117c-15 -55 -67 -150 -134 -150c-29 0 -42 20 -42 47
-c0 87 100 139 102 144c0 4 -5 8 -7 10c-31 28 -82 51 -124 51c-76 0 -117 -122 -117 -184c0 -116 73 -196 190 -196c173 0 299 182 338 332c11 44 19 89 30 133c2 9 5 13 14 18c71 36 146 60 227 60c44 0 83 -8 127 -18c1 -1 3 -1 4 -1c6 0 14 7 14 13zM1536 1120v-960
-c0 -159 -129 -288 -288 -288h-960c-159 0 -288 129 -288 288v960c0 159 129 288 288 288h960c159 0 288 -129 288 -288z" />
-    <glyph glyph-name="gitea" unicode="&#xf31f;" horiz-adv-x="2066" 
-d="M366 1280v0c62 0 120 -8 160 -8v0v0c329 -18 502 -29 699 -29l1 -363l53 -27v390c171 2 371 11 709 29v0h1c15 0 28 -7 38 -17s18 -25 24 -43c12 -36 16 -85 15 -143c-3 -117 -30 -272 -75 -427s-107 -311 -182 -431s-163 -204 -259 -211h-615c-75 8 -156 85 -224 169
-c-34 42 -64 87 -87 126c-21 36 -35 66 -41 88c-82 2 -219 15 -341 80c-125 67 -233 191 -242 414c-6 143 45 245 118 310s167 93 248 93zM388 1107v0c-90 -1 -147 -29 -180 -71c-36 -44 -46 -104 -38 -164c14 -113 61 -183 126 -229c62 -44 143 -65 231 -78
-c-70 193 -106 325 -128 542h-11zM1118 893c-34 0 -66 -19 -82 -51l-172 -353c-22 -45 -3 -99 42 -121l354 -172c45 -22 99 -3 121 42l171 354c22 45 3 99 -42 121l-249 121l-45 -93c5 -5 10 -14 12 -20c2 -5 3 -13 3 -19v-4c30 -14 54 -25 74 -36c30 -17 52 -34 59 -62
-s-1 -57 -17 -95c-12 -29 -29 -65 -51 -111c4 -5 9 -13 11 -19c2 -5 4 -13 4 -19c0 -22 -17 -46 -38 -54c-5 -2 -14 -4 -20 -4c-22 0 -46 17 -54 38c-2 5 -3 14 -3 20c0 22 17 46 38 54c5 2 14 3 19 3h2c22 46 41 82 52 109c15 36 18 55 15 66s-13 20 -39 35
-c-18 10 -41 22 -71 36c-4 -4 -13 -9 -19 -11c-5 -2 -14 -3 -19 -3h-6l-77 -158c5 -5 12 -14 14 -21c2 -5 3 -13 3 -19c0 -22 -17 -46 -38 -54c-5 -2 -13 -4 -19 -4c-22 0 -46 17 -54 38c-2 5 -3 14 -3 20c0 22 16 46 37 54c5 2 15 3 20 3l79 162c-3 4 -8 11 -10 16
-s-3 14 -3 20c0 22 17 46 38 54c5 2 14 3 19 3h1l46 94l-64 31c-13 6 -26 9 -39 9z" />
-    <glyph glyph-name="f-droid" unicode="&#xf32a;" horiz-adv-x="1676" 
-d="M47 1526v0c12 0 29 -8 36 -18l127 -164c10 3 27 6 37 6v0h1182v0c10 0 27 -3 37 -6l127 164c7 9 22 17 34 18h2h3c24 -1 44 -22 44 -46c0 -9 -4 -22 -10 -29l-133 -172c4 -11 7 -29 7 -40v0v-258c0 -61 -50 -111 -111 -111h-1182c-61 0 -111 50 -111 111v258v0
-c0 11 3 29 7 40l-133 172c-6 7 -10 20 -10 29c0 26 20 46 46 46h1zM482 1212v0c-69 0 -125 -56 -125 -125v0c0 -69 56 -125 125 -125v0c69 0 125 56 125 125v0c0 69 -56 125 -125 125v0zM1203 1212c-69 0 -125 -56 -125 -125v0c0 -69 56 -125 125 -125s125 56 125 125v0
-c0 69 -56 125 -125 125zM247 833h1182c61 0 111 -50 111 -111v-739c0 -61 -50 -111 -111 -111h-1182c-61 0 -111 50 -111 111v739c0 61 50 111 111 111zM838 740v0c-214 0 -388 -174 -388 -388s174 -388 388 -388s388 174 388 388s-174 388 -388 388zM838 670v0
-c176 0 318 -142 318 -318s-142 -317 -318 -317s-318 141 -318 317s142 318 318 318zM838 583v0c-106 0 -197 -72 -223 -171h119c20 36 59 61 104 61c67 0 120 -54 120 -121s-53 -120 -120 -120c-48 0 -89 28 -108 69h-117c24 -102 116 -180 225 -180c127 0 231 104 231 231
-s-104 231 -231 231z" />
-    <glyph glyph-name="shopping-basket" unicode="&#xf291;" horiz-adv-x="2048" 
-d="M1920 768c71 0 128 -57 128 -128s-57 -128 -128 -128h-15l-115 -662c-11 -61 -64 -106 -126 -106h-1280c-62 0 -115 45 -126 106l-115 662h-15c-71 0 -128 57 -128 128s57 128 128 128h1792zM485 -32c35 3 62 34 59 69l-32 416c-3 35 -34 62 -69 59s-62 -34 -59 -69
-l32 -416c3 -33 31 -59 64 -59h5zM896 32v416c0 35 -29 64 -64 64s-64 -29 -64 -64v-416c0 -35 29 -64 64 -64s64 29 64 64zM1280 32v416c0 35 -29 64 -64 64s-64 -29 -64 -64v-416c0 -35 29 -64 64 -64s64 29 64 64zM1632 27l32 416c3 35 -24 66 -59 69s-66 -24 -69 -59
-l-32 -416c-3 -35 24 -66 59 -69h5c33 0 61 26 64 59zM476 1244l-93 -412h-132l101 441c26 117 129 199 249 199h167c0 35 29 64 64 64h384c35 0 64 -29 64 -64h167c120 0 223 -82 249 -199l101 -441h-132l-93 412c-14 59 -65 100 -125 100h-167c0 -35 -29 -64 -64 -64h-384
-c-35 0 -64 29 -64 64h-167c-60 0 -111 -41 -125 -100z" />
-    <glyph glyph-name="user-o" unicode="&#xf2c0;" 
-d="M1201 752c141 -41 335 -180 335 -635c0 -206 -153 -373 -341 -373h-854c-188 0 -341 167 -341 373c0 455 194 594 335 635c-50 79 -79 172 -79 272c0 282 230 512 512 512s512 -230 512 -512c0 -100 -29 -193 -79 -272zM768 1408c-212 0 -384 -172 -384 -384
-s172 -384 384 -384s384 172 384 384s-172 384 -384 384zM1195 -128c117 0 213 109 213 245c0 315 -106 512 -304 522c-90 -79 -207 -127 -336 -127s-246 48 -336 127c-198 -10 -304 -207 -304 -522c0 -136 96 -245 213 -245h854z" />
-    <glyph glyph-name="paperclip" unicode="&#xf0c6;" horiz-adv-x="1400" 
-d="M1400 151c0 -156 -119 -275 -275 -275c-88 0 -173 38 -235 100l-777 776c-71 72 -113 170 -113 271c0 212 167 381 379 381c102 0 200 -41 273 -113l605 -606c6 -6 10 -14 10 -22c0 -21 -56 -77 -77 -77c-9 0 -17 4 -23 10l-606 607c-48 47 -113 77 -181 77
-c-142 0 -252 -115 -252 -256c0 -68 28 -133 76 -181l776 -777c38 -38 91 -63 145 -63c85 0 148 63 148 148c0 55 -25 107 -63 145l-581 581c-16 15 -38 24 -60 24c-38 0 -67 -28 -67 -67c0 -22 10 -43 25 -59l410 -410c6 -6 10 -14 10 -22c0 -21 -57 -78 -78 -78
-c-8 0 -16 4 -22 10l-410 410c-40 39 -63 94 -63 149c0 110 86 196 196 196c56 0 110 -23 149 -63l581 -581c63 -62 100 -147 100 -235z" />
-    <glyph glyph-name="deviantart" unicode="&#xf1bd;" horiz-adv-x="1024" 
-d="M1024 1233l-303 -582l24 -31h279v-415h-507l-44 -30l-142 -273c-1 0 -28 -28 -30 -30h-301v303l303 583l-24 30h-279v415h507l44 30l142 273c1 0 28 28 30 30h301v-303z" />
-    <glyph glyph-name="file-audio-o" unicode="&#xf1c7;" 
-d="M1468 1156c37 -37 68 -111 68 -164v-1152c0 -53 -43 -96 -96 -96h-1344c-53 0 -96 43 -96 96v1600c0 53 43 96 96 96h896c53 0 127 -31 164 -68zM1024 1400v-376h376c-6 17 -15 34 -22 41l-313 313c-7 7 -24 16 -41 22zM1408 -128v1024h-416c-53 0 -96 43 -96 96v416
-h-768v-1536h1280zM620 686c12 -5 20 -17 20 -30v-544c0 -13 -8 -25 -20 -30c-4 -1 -8 -2 -12 -2c-8 0 -16 3 -23 9l-166 167h-131c-18 0 -32 14 -32 32v192c0 18 14 32 32 32h131l166 167c10 9 23 12 35 7zM1037 -3c-14 0 -28 5 -40 15c-28 22 -32 62 -9 90
-c65 80 100 178 100 282s-35 202 -100 282c-23 28 -19 68 9 91c27 22 68 18 90 -10c83 -102 129 -231 129 -363s-46 -261 -129 -363c-13 -16 -31 -24 -50 -24zM826 145c-15 0 -31 6 -44 17c-25 24 -27 65 -2 91c33 36 52 82 52 131s-19 95 -52 131c-25 26 -23 67 2 91
-c26 24 67 23 91 -3c56 -60 87 -137 87 -219s-31 -159 -87 -219c-13 -13 -30 -20 -47 -20z" />
-    <glyph glyph-name="eur" unicode="&#xf153;" horiz-adv-x="1012" 
-d="M976 229l35 -159c4 -16 -5 -32 -20 -37c-4 -1 -97 -33 -217 -33c-312 0 -563 188 -647 482h-95c-18 0 -32 15 -32 32v113c0 17 14 32 32 32h66c-1 32 -1 70 1 105h-67c-18 0 -32 14 -32 32v114c0 18 14 32 32 32h98c89 280 345 466 644 466c104 0 190 -22 194 -23
-c8 -2 15 -8 20 -15c4 -7 5 -16 3 -24l-43 -159c-4 -17 -21 -27 -38 -22c-1 0 -69 17 -140 17c-168 0 -309 -91 -376 -240h468c10 0 19 -4 25 -12c6 -7 9 -17 7 -26l-24 -114c-3 -15 -16 -26 -32 -26h-488c-3 -32 -2 -66 0 -105h459c10 0 19 -5 25 -12c6 -8 8 -18 6 -27
-l-24 -112c-3 -15 -16 -26 -31 -26h-387c64 -156 208 -254 378 -254c87 0 158 24 159 24c8 3 18 2 26 -2c8 -5 13 -13 15 -21z" />
-    <glyph glyph-name="coffee" unicode="&#xf0f4;" horiz-adv-x="1856" 
-d="M1664 896c0 106 -86 192 -192 192h-64v-384h64c106 0 192 86 192 192zM0 128h1792c0 -141 -115 -256 -256 -256h-1280c-141 0 -256 115 -256 256zM1856 896c0 -212 -172 -384 -384 -384h-64v-32c0 -123 -101 -224 -224 -224h-704c-123 0 -224 101 -224 224v736
-c0 35 29 64 64 64h1152c212 0 384 -172 384 -384z" />
-    <glyph glyph-name="university" unicode="&#xf19c;" horiz-adv-x="1920" 
-d="M960 1536l960 -384v-128h-128c0 -35 -31 -64 -69 -64h-1526c-38 0 -69 29 -69 64h-128v128zM256 896h256v-768h128v768h256v-768h128v768h256v-768h128v768h256v-768h59c38 0 69 -29 69 -64v-64h-1664v64c0 35 31 64 69 64h59v768zM1851 -64c38 0 69 -29 69 -64v-128
-h-1920v128c0 35 31 64 69 64h1782z" />
-    <glyph glyph-name="times-circle-o" unicode="&#xf05c;" 
-d="M1097 457l-146 -146c-13 -13 -33 -13 -46 0l-137 137l-137 -137c-13 -13 -33 -13 -46 0l-146 146c-13 13 -13 33 0 46l137 137l-137 137c-13 13 -13 33 0 46l146 146c13 13 33 13 46 0l137 -137l137 137c13 13 33 13 46 0l146 -146c13 -13 13 -33 0 -46l-137 -137
-l137 -137c13 -13 13 -33 0 -46zM1312 640c0 300 -244 544 -544 544s-544 -244 -544 -544s244 -544 544 -544s544 244 544 544zM1536 640c0 -424 -344 -768 -768 -768s-768 344 -768 768s344 768 768 768s768 -344 768 -768z" />
-    <glyph glyph-name="python" unicode="&#xf322;" 
-d="M759 1416v0c63 0 129 -4 193 -15c101 -17 185 -92 185 -192v-353c0 -103 -82 -188 -185 -188h-370c-126 0 -232 -108 -232 -230v-170h-127c-108 0 -171 78 -197 188c-36 147 -34 236 0 377c29 123 124 188 232 188h509v47h-370v141c0 107 28 164 185 192
-c53 9 114 15 177 15zM558 1303c-38 0 -69 -32 -69 -71s31 -70 69 -70s70 31 70 70s-32 71 -70 71zM1183 1021h139c108 0 159 -81 186 -188c37 -149 39 -261 0 -377c-37 -113 -78 -188 -186 -188h-555v-47h370v-141c0 -107 -92 -161 -185 -188c-140 -41 -253 -34 -370 0
-c-98 29 -185 88 -185 188v353c0 102 84 188 185 188h370c123 0 231 107 231 235v165zM975 127v0c-38 0 -69 -31 -69 -70s31 -71 69 -71s70 32 70 71s-32 70 -70 70zM1389 366c0 -17 -70 -30 -156 -30s-156 13 -156 30s70 30 156 30s156 -13 156 -30z" />
-    <glyph glyph-name="internet-explorer" unicode="&#xf26b;" horiz-adv-x="1792" 
-d="M1792 599c0 -35 -2 -70 -7 -104h-1151c0 -199 175 -343 367 -343c130 0 255 64 322 177h423c-114 -321 -419 -536 -759 -536c-123 0 -246 29 -356 83c-112 -57 -269 -116 -394 -116c-168 0 -237 103 -237 263c0 93 20 186 45 275c16 58 80 176 109 229
-c123 223 285 437 475 606c-153 -66 -319 -232 -427 -354c84 366 410 625 785 625c15 0 30 0 45 -1c124 57 297 117 433 117c162 0 301 -62 301 -245c0 -96 -37 -200 -75 -286c66 -119 101 -254 101 -390zM1722 1239c0 112 -80 181 -190 181c-84 0 -179 -34 -254 -70
-c162 -63 301 -179 393 -327c25 66 51 146 51 216zM128 2c0 -116 69 -179 183 -179c89 0 188 40 266 83c-163 96 -289 249 -351 428c-46 -96 -98 -224 -98 -332zM632 715h728c-7 193 -177 332 -364 332c-188 0 -357 -139 -364 -332z" />
-    <glyph glyph-name="file-video-o" unicode="&#xf1c8;" 
-d="M1468 1156c37 -37 68 -111 68 -164v-1152c0 -53 -43 -96 -96 -96h-1344c-53 0 -96 43 -96 96v1600c0 53 43 96 96 96h896c53 0 127 -31 164 -68zM1024 1400v-376h376c-6 17 -15 34 -22 41l-313 313c-7 7 -24 16 -41 22zM1408 -128v1024h-416c-53 0 -96 43 -96 96v416
-h-768v-1536h1280zM768 768c70 0 128 -58 128 -128v-384c0 -70 -58 -128 -128 -128h-384c-70 0 -128 58 -128 128v384c0 70 58 128 128 128h384zM1260 766c12 -5 20 -17 20 -30v-576c0 -13 -8 -25 -20 -30c-4 -1 -8 -2 -12 -2c-8 0 -17 3 -23 9l-265 266v90l265 266
-c6 6 15 9 23 9c4 0 8 -1 12 -2z" />
-    <glyph glyph-name="angle-double-right" unicode="&#xf101;" horiz-adv-x="966" 
-d="M582 576c0 -8 -4 -17 -10 -23l-466 -466c-6 -6 -15 -10 -23 -10s-17 4 -23 10l-50 50c-6 6 -10 15 -10 23s4 17 10 23l393 393l-393 393c-6 6 -10 15 -10 23s4 17 10 23l50 50c6 6 15 10 23 10s17 -4 23 -10l466 -466c6 -6 10 -15 10 -23zM966 576c0 -8 -4 -17 -10 -23
-l-466 -466c-6 -6 -15 -10 -23 -10s-17 4 -23 10l-50 50c-6 6 -10 15 -10 23s4 17 10 23l393 393l-393 393c-6 6 -10 15 -10 23s4 17 10 23l50 50c6 6 15 10 23 10s17 -4 23 -10l466 -466c6 -6 10 -15 10 -23z" />
-    <glyph glyph-name="safari" unicode="&#xf267;" horiz-adv-x="1792" 
-d="M949 643c0 -33 -23 -64 -58 -64c-33 0 -64 24 -64 58c0 33 24 64 59 64c32 0 63 -23 63 -58zM964 585l350 581c-47 -44 -485 -447 -497 -468l-349 -580c46 43 485 448 496 467zM1611 640c0 -131 -36 -260 -104 -371c-10 5 -52 35 -60 35c-7 0 -13 -6 -13 -13
-c0 -13 47 -37 59 -44c-99 -150 -252 -258 -426 -301l-16 67c-1 9 -7 10 -15 10c-7 0 -11 -10 -10 -15l16 -68c-48 -10 -97 -15 -146 -15c-131 0 -260 37 -372 105c6 10 44 65 44 73c0 7 -6 13 -13 13c-14 0 -44 -60 -53 -72c-151 100 -260 255 -302 432l69 15
-c8 2 10 8 10 15s-10 11 -16 10l-68 -15c-9 46 -14 92 -14 139c0 134 38 266 109 379c10 -6 58 -39 66 -39c7 0 13 5 13 12c0 14 -53 41 -65 49c102 149 257 256 433 296l15 -67c2 -8 8 -10 15 -10s11 10 10 16l-15 66c44 8 89 13 134 13c134 0 265 -38 379 -109
-c-7 -10 -39 -57 -39 -65c0 -7 5 -13 12 -13c14 0 41 52 48 64c148 -100 254 -253 295 -427l-56 -12c-9 -2 -10 -8 -10 -16c0 -7 10 -11 15 -10l57 13c9 -46 14 -93 14 -140zM1696 640c0 442 -358 800 -800 800s-800 -358 -800 -800s358 -800 800 -800s800 358 800 800z
-M1792 640c0 -495 -401 -896 -896 -896s-896 401 -896 896s401 896 896 896s896 -401 896 -896z" />
-    <glyph glyph-name="commenting-o" unicode="&#xf27b;" horiz-adv-x="1792" 
-d="M640 640c0 -71 -57 -128 -128 -128s-128 57 -128 128s57 128 128 128s128 -57 128 -128zM1024 640c0 -71 -57 -128 -128 -128s-128 57 -128 128s57 128 128 128s128 -57 128 -128zM1408 640c0 -71 -57 -128 -128 -128s-128 57 -128 128s57 128 128 128s128 -57 128 -128z
-M896 1152c-416 0 -768 -234 -768 -512c0 -149 100 -291 273 -389l87 -50l-27 -96c-19 -71 -44 -126 -70 -172c101 42 193 99 275 171l43 38l57 -6c43 -5 87 -8 130 -8c416 0 768 234 768 512s-352 512 -768 512zM1792 640c0 -354 -401 -640 -896 -640c-49 0 -98 3 -145 8
-c-131 -116 -287 -198 -460 -242c-36 -10 -75 -17 -114 -22h-5c-20 0 -38 16 -43 38v1c-5 25 12 40 27 58c63 71 135 131 182 298c-206 117 -338 298 -338 501c0 353 401 640 896 640s896 -287 896 -640z" />
-    <glyph glyph-name="snowdrift" unicode="&#xf2f1;" horiz-adv-x="1448" 
-d="M1007 384c104 116 30 287 -165 383c7 -6 44 24 83 67s65 84 58 90c-195 96 -438 80 -542 -36s-30 -287 165 -383c-7 6 -44 -24 -83 -67s-65 -84 -58 -90c195 -96 438 -80 542 36zM103 1188v0c228 253 760 288 1188 78c15 -14 -42 -101 -127 -196s-167 -161 -182 -147
-c428 -210 591 -585 363 -839c-228 -253 -760 -288 -1188 -78c-15 14 42 101 127 196s167 161 182 147c-428 210 -591 585 -363 839z" />
-    <glyph glyph-name="black-tie" unicode="&#xf27e;" 
-d="M0 1408h1536v-1536h-1536v1536zM1085 293l-221 631l221 297h-634l221 -297l-221 -631l317 -304z" />
-    <glyph glyph-name="youtube-play" unicode="&#xf16a;" horiz-adv-x="1792" 
-d="M711 408l484 250l-484 253v-503zM896 1270c377 0 627 -18 627 -18c35 -4 112 -4 180 -76c0 0 55 -54 71 -178c19 -145 18 -290 18 -290v-136s1 -145 -18 -290c-16 -123 -71 -178 -71 -178c-68 -71 -145 -71 -180 -75c0 0 -250 -19 -627 -19c-466 4 -609 18 -609 18
-c-40 7 -130 5 -198 76c0 0 -55 55 -71 178c-19 145 -18 290 -18 290v136s-1 145 18 290c16 124 71 178 71 178c68 72 145 72 180 76c0 0 250 18 627 18z" />
-    <glyph glyph-name="modx" unicode="&#xf285;" horiz-adv-x="1728" 
-d="M1395 827l-614 386l92 151h855zM373 562l-184 116v858l1183 -743zM1392 697l147 -95v-858l-532 335zM1355 718l-500 -802h-855l356 571z" />
-    <glyph glyph-name="caret-square-o-right" unicode="&#xf152;" 
-d="M1088 640c0 -21 -10 -40 -27 -52l-448 -320c-19 -14 -45 -16 -66 -5c-22 11 -35 33 -35 57v640c0 24 13 46 35 57c21 11 47 9 66 -5l448 -320c17 -12 27 -31 27 -52zM1280 160v960c0 18 -14 32 -32 32h-960c-18 0 -32 -14 -32 -32v-960c0 -18 14 -32 32 -32h960
-c18 0 32 14 32 32zM1536 1120v-960c0 -159 -129 -288 -288 -288h-960c-159 0 -288 129 -288 288v960c0 159 129 288 288 288h960c159 0 288 -129 288 -288z" />
-    <glyph glyph-name="gitlab" unicode="&#xf296;" horiz-adv-x="1793" 
-d="M104 830l792 -1015l-868 630c-24 18 -34 49 -25 77zM566 830h660l-330 -1015zM368 1442l198 -612h-462l198 612c11 31 55 31 66 0zM1688 830l101 -308c9 -28 -1 -59 -25 -77l-868 -630zM1688 830h-462l198 612c11 31 55 31 66 0z" />
-    <glyph glyph-name="arrows" unicode="&#xf047;" horiz-adv-x="1792" 
-d="M1792 640c0 -17 -7 -33 -19 -45l-256 -256c-12 -12 -28 -19 -45 -19c-35 0 -64 29 -64 64v128h-384v-384h128c35 0 64 -29 64 -64c0 -17 -7 -33 -19 -45l-256 -256c-12 -12 -28 -19 -45 -19s-33 7 -45 19l-256 256c-12 12 -19 28 -19 45c0 35 29 64 64 64h128v384h-384
-v-128c0 -35 -29 -64 -64 -64c-17 0 -33 7 -45 19l-256 256c-12 12 -19 28 -19 45s7 33 19 45l256 256c12 12 28 19 45 19c35 0 64 -29 64 -64v-128h384v384h-128c-35 0 -64 29 -64 64c0 17 7 33 19 45l256 256c12 12 28 19 45 19s33 -7 45 -19l256 -256
-c12 -12 19 -28 19 -45c0 -35 -29 -64 -64 -64h-128v-384h384v128c0 35 29 64 64 64c17 0 33 -7 45 -19l256 -256c12 -12 19 -28 19 -45z" />
-    <glyph glyph-name="refresh" unicode="&#xf021;" 
-d="M1511 480c0 -2 0 -5 -1 -7c-85 -354 -377 -601 -746 -601c-195 0 -384 77 -526 212l-129 -129c-12 -12 -28 -19 -45 -19c-35 0 -64 29 -64 64v448c0 35 29 64 64 64h448c35 0 64 -29 64 -64c0 -17 -7 -33 -19 -45l-137 -137c94 -88 219 -138 348 -138
-c178 0 343 92 436 244c24 39 36 77 53 117c5 14 15 23 30 23h192c18 0 32 -15 32 -32zM1536 1280v-448c0 -35 -29 -64 -64 -64h-448c-35 0 -64 29 -64 64c0 17 7 33 19 45l138 138c-95 88 -220 137 -349 137c-178 0 -343 -92 -436 -244c-24 -39 -36 -77 -53 -117
-c-5 -14 -15 -23 -30 -23h-199c-18 0 -32 15 -32 32v7c86 355 381 601 750 601c196 0 387 -78 529 -212l130 129c12 12 28 19 45 19c35 0 64 -29 64 -64z" />
-    <glyph glyph-name="file-o" unicode="&#xf016;" 
-d="M1468 1156c37 -37 68 -111 68 -164v-1152c0 -53 -43 -96 -96 -96h-1344c-53 0 -96 43 -96 96v1600c0 53 43 96 96 96h896c53 0 127 -31 164 -68zM1024 1400v-376h376c-6 17 -15 34 -22 41l-313 313c-7 7 -24 16 -41 22zM1408 -128v1024h-416c-53 0 -96 43 -96 96v416
-h-768v-1536h1280z" />
-    <glyph glyph-name="battery-three-quarters" unicode="&#xf241;" horiz-adv-x="2304" 
-d="M256 256v768h1280v-768h-1280zM2176 960c71 0 128 -57 128 -128v-384c0 -71 -57 -128 -128 -128v-160c0 -88 -72 -160 -160 -160h-1856c-88 0 -160 72 -160 160v960c0 88 72 160 160 160h1856c88 0 160 -72 160 -160v-160zM2176 448v384h-128v288c0 18 -14 32 -32 32
-h-1856c-18 0 -32 -14 -32 -32v-960c0 -18 14 -32 32 -32h1856c18 0 32 14 32 32v288h128z" />
-    <glyph glyph-name="reddit-alien" unicode="&#xf281;" horiz-adv-x="1792" 
-d="M1792 690c0 -78 -44 -145 -109 -178c8 -31 12 -63 12 -96c0 -316 -357 -572 -797 -572c-439 0 -796 256 -796 572c0 32 4 64 11 94c-67 33 -113 101 -113 180c0 110 89 199 199 199c57 0 108 -24 145 -63c135 94 315 155 515 162l116 521c4 18 23 30 41 26l369 -81
-c24 48 75 82 133 82c83 0 150 -67 150 -149c0 -83 -67 -150 -150 -150c-82 0 -149 67 -149 149l-334 74l-104 -472c201 -6 383 -66 519 -160c36 38 87 61 143 61c110 0 199 -89 199 -199zM418 491c0 -83 67 -150 149 -150c83 0 150 67 150 150c0 82 -67 149 -150 149
-c-82 0 -149 -67 -149 -149zM1228 136c15 15 15 37 0 52c-14 14 -37 14 -51 0c-60 -61 -189 -82 -281 -82s-221 21 -281 82c-14 14 -37 14 -51 0c-15 -14 -15 -37 0 -52c95 -95 278 -102 332 -102s237 7 332 102zM1225 341c82 0 149 67 149 150c0 82 -67 149 -149 149
-c-83 0 -150 -67 -150 -149c0 -83 67 -150 150 -150z" />
-    <glyph glyph-name="square" unicode="&#xf0c8;" 
-d="M1536 1120v-960c0 -159 -129 -288 -288 -288h-960c-159 0 -288 129 -288 288v960c0 159 129 288 288 288h960c159 0 288 -129 288 -288z" />
-    <glyph glyph-name="ellipsis-v" unicode="&#xf142;" horiz-adv-x="384" 
-d="M384 288v-192c0 -53 -43 -96 -96 -96h-192c-53 0 -96 43 -96 96v192c0 53 43 96 96 96h192c53 0 96 -43 96 -96zM384 800v-192c0 -53 -43 -96 -96 -96h-192c-53 0 -96 43 -96 96v192c0 53 43 96 96 96h192c53 0 96 -43 96 -96zM384 1312v-192c0 -53 -43 -96 -96 -96h-192
-c-53 0 -96 43 -96 96v192c0 53 43 96 96 96h192c53 0 96 -43 96 -96z" />
-    <glyph glyph-name="glide-g" unicode="&#xf2a6;" horiz-adv-x="1461" 
-d="M707 1231c0 53 -5 99 -69 99c-27 0 -54 -9 -78 -23c-151 -83 -213 -298 -213 -460c0 -108 37 -252 169 -252c30 0 68 -8 76 27c32 154 64 309 96 463c10 48 19 97 19 146zM1461 575c0 -10 -13 -20 -23 -20l-6 1c-68 10 -128 28 -197 28c-125 0 -240 -37 -351 -93
-c-14 -7 -17 -13 -21 -27c-18 -68 -30 -138 -47 -206c-60 -233 -255 -514 -522 -514c-182 0 -294 124 -294 303c0 97 63 286 180 286c41 0 202 -53 203 -95c-2 -8 -157 -88 -157 -223c0 -41 20 -73 65 -73c159 0 232 290 248 412v9c0 8 -32 4 -38 4c-301 0 -477 168 -477 471
-c0 286 186 635 491 688c35 6 70 9 106 9c242 0 374 -113 374 -360c0 -167 -57 -321 -81 -484l3 -3c108 61 222 119 350 119c13 0 41 -8 53 -13c26 -10 141 -191 141 -219z" />
-    <glyph glyph-name="globe" unicode="&#xf0ac;" 
-d="M768 1404c424 0 768 -344 768 -768s-344 -768 -768 -768s-768 344 -768 768s344 768 768 768zM737 1186v0c-18 0 -40 -7 -58 -7c-27 0 -61 12 -81 0s-18 -37 -27 -55s-28 -34 -28 -54s19 -36 28 -54s2 -47 27 -54s54 36 81 54s69 32 81 54s0 36 0 54s16 39 0 55
-c-5 5 -14 7 -23 7zM491 1178h-6s-44 -8 -76 -13c-136 -92 -261 -300 -278 -464c23 -12 46 -22 60 -36c27 -27 83 -27 88 -56s-24 -62 -33 -80s-31 -31 -27 -54s36 -36 54 -54s37 -22 54 -54s20 -98 27 -135c9 -47 23 -85 44 -118c27 -19 72 -44 102 -58c10 28 10 93 16 122
-c7 37 13 109 27 135s19 19 28 28s18 15 28 28s17 34 26 52s30 31 26 53s-36 37 -54 55s-29 39 -55 54s-73 18 -101 25s-127 12 -129 13c-2 0 -1 -6 -7 2s-2 39 -2 57s11 34 24 66c13 18 5 10 25 24c10 9 43 -44 57 -44s-3 91 6 100c36 36 128 98 128 136s-37 36 -55 54
-s-46 -30 -111 -30s76 103 85 112s23 17 27 27s0 18 0 27s12 22 8 25c-2 1 -4 1 -6 1zM1212 1096c-62 -8 -139 -10 -182 -26c-45 -17 -54 -36 -81 -54s-67 -28 -81 -54s0 -54 0 -81s-26 -68 0 -82s55 37 82 55s63 64 81 54s6 -7 0 -27s-51 -41 -52 -81s102 -73 68 -126
-s-188 46 -232 17s-19 -54 -28 -81s-37 -52 -27 -81s52 -34 81 -54s81 -56 82 -58s20 -99 27 -135c14 -73 -27 -199 76 -231c31 14 78 41 106 60c13 34 24 72 35 94c22 44 71 123 80 161s0 37 0 55s7 30 0 54s-36 54 -54 81s-34 64 -54 81s-46 18 -54 27s-4 8 -4 13
-s-4 7 5 14s34 8 54 0s36 -36 54 -54s25 -51 54 -54s54 36 81 54c25 17 52 56 76 55c-12 131 -98 312 -193 404z" />
-    <glyph glyph-name="hashnode" unicode="&#xf317;" 
-d="M246 1408h1044c136 0 246 -110 246 -246v-1044c0 -136 -110 -246 -246 -246h-1044c-136 0 -246 110 -246 246v1044c0 136 110 246 246 246zM1153 23v0c87 1 158 71 162 158s-62 162 -149 171l-315 556c-46 83 -135 78 -167 -39c-28 -111 -20 -216 -28 -342
-c0 -1 -1 -2 -2 -2s-2 1 -2 1l-281 560c20 16 37 50 37 75c0 52 -41 93 -93 93s-94 -41 -94 -93s42 -93 94 -93c4 0 7 1 11 1c118 -304 250 -659 297 -741c32 -78 141 -53 144 31l12 444c0 3 3 3 4 1l226 -537c-11 -20 -21 -55 -21 -78v-1c0 -91 74 -165 165 -165z" />
-    <glyph glyph-name="comment-o" unicode="&#xf0e5;" horiz-adv-x="1792" 
-d="M896 1152c-416 0 -768 -234 -768 -512c0 -149 100 -291 273 -389l87 -50l-27 -96c-19 -71 -44 -126 -70 -172c101 42 193 99 275 171l43 38l57 -6c43 -5 87 -8 130 -8c416 0 768 234 768 512s-352 512 -768 512zM1792 640c0 -354 -401 -640 -896 -640c-49 0 -98 3 -145 8
-c-131 -116 -287 -198 -460 -242c-36 -10 -75 -17 -114 -22h-5c-20 0 -38 16 -43 38v1c-5 25 12 40 27 58c63 71 135 131 182 298c-206 117 -338 298 -338 501c0 354 401 640 896 640s896 -286 896 -640z" />
-    <glyph glyph-name="bluetooth" unicode="&#xf293;" horiz-adv-x="1322" 
-d="M734 483l148 -148l-149 -149zM733 1094l149 -149l-148 -148zM603 -130l464 464l-306 306l306 306l-464 464v-611l-255 255l-93 -93l320 -321l-320 -321l93 -93l255 255v-611zM1322 640c0 -710 -270 -896 -661 -896s-661 186 -661 896s270 896 661 896s661 -186 661 -896z
-" />
-    <glyph glyph-name="hand-pointer-o" unicode="&#xf25a;" horiz-adv-x="1664" 
-d="M640 1408c-71 0 -128 -57 -128 -128v-896l-151 202c-25 33 -65 54 -107 54c-70 0 -126 -59 -126 -128c0 -28 9 -55 26 -77l384 -512c24 -32 62 -51 102 -51h718c29 0 55 20 62 48l92 368c16 64 24 129 24 194v217c0 53 -41 101 -96 101c-53 0 -96 -43 -96 -96h-32v61
-c0 63 -48 115 -112 115c-62 0 -112 -50 -112 -112v-64h-32v90c0 72 -55 134 -128 134c-71 0 -128 -57 -128 -128v-96h-32v570c0 72 -55 134 -128 134zM640 1536c143 0 256 -120 256 -262v-220c11 1 21 2 32 2c65 0 126 -25 173 -69c31 14 65 21 99 21c72 0 139 -32 184 -87
-c19 5 37 7 56 7c126 0 224 -105 224 -229v-217c0 -75 -9 -151 -28 -225l-92 -368c-21 -85 -98 -145 -186 -145h-718c-80 0 -157 39 -205 102l-384 512c-33 44 -51 99 -51 154c0 140 114 256 254 256c46 0 91 -12 130 -35v547c0 141 115 256 256 256zM768 128h-32v384h32
-v-384zM1024 128h-32v384h32v-384zM1280 128h-32v384h32v-384z" />
-    <glyph glyph-name="unlock" unicode="&#xf09c;" horiz-adv-x="1664" 
-d="M1664 960v-256c0 -35 -29 -64 -64 -64h-64c-35 0 -64 29 -64 64v256c0 141 -115 256 -256 256s-256 -115 -256 -256v-192h96c53 0 96 -43 96 -96v-576c0 -53 -43 -96 -96 -96h-960c-53 0 -96 43 -96 96v576c0 53 43 96 96 96h672v192c0 247 201 448 448 448
-s448 -201 448 -448z" />
-    <glyph glyph-name="quote-right" unicode="&#xf10e;" horiz-adv-x="1664" 
-d="M768 1216v-704c0 -282 -230 -512 -512 -512h-64c-35 0 -64 29 -64 64v128c0 35 29 64 64 64h64c141 0 256 115 256 256v32c0 53 -43 96 -96 96h-224c-106 0 -192 86 -192 192v384c0 106 86 192 192 192h384c106 0 192 -86 192 -192zM1664 1216v-704
-c0 -282 -230 -512 -512 -512h-64c-35 0 -64 29 -64 64v128c0 35 29 64 64 64h64c141 0 256 115 256 256v32c0 53 -43 96 -96 96h-224c-106 0 -192 86 -192 192v384c0 106 86 192 192 192h384c106 0 192 -86 192 -192z" />
-    <glyph glyph-name="arrow-left" unicode="&#xf060;" horiz-adv-x="1472" 
-d="M1472 640v-128c0 -68 -45 -128 -117 -128h-704l293 -294c24 -23 38 -56 38 -90s-14 -67 -38 -90l-75 -76c-23 -23 -56 -37 -90 -37s-67 14 -91 37l-651 652c-23 23 -37 56 -37 90s14 67 37 91l651 650c24 24 57 38 91 38s66 -14 90 -38l75 -74c24 -24 38 -57 38 -91
-s-14 -67 -38 -91l-293 -293h704c72 0 117 -60 117 -128z" />
-    <glyph glyph-name="scissors" unicode="&#xf0c4;" horiz-adv-x="1792" 
-d="M960 640c35 0 64 -29 64 -64s-29 -64 -64 -64s-64 29 -64 64s29 64 64 64zM1260 576l507 -398c18 -13 27 -35 25 -56c-3 -22 -16 -41 -35 -51l-128 -64c-9 -5 -19 -7 -29 -7c-11 0 -22 3 -31 8l-690 387l-110 -66c-4 -2 -8 -4 -12 -5c9 -31 13 -64 10 -97
-c-9 -103 -78 -201 -188 -271c-85 -54 -183 -84 -277 -84c-90 0 -166 27 -222 78c-57 53 -86 129 -79 207c9 102 78 201 187 271c85 54 184 84 278 84c56 0 107 -11 151 -31c6 9 13 16 22 22l122 73l-122 73c-9 6 -16 13 -22 22c-44 -20 -95 -31 -151 -31
-c-94 0 -193 30 -278 84c-109 70 -178 169 -187 271c-7 78 22 154 79 206c56 52 132 79 222 79c94 0 192 -30 277 -84c110 -69 179 -168 188 -271c3 -33 -1 -66 -10 -97c4 -1 8 -3 12 -5l110 -66l690 387c9 5 20 8 31 8c10 0 20 -2 29 -7l128 -64c19 -10 32 -29 35 -51
-c2 -21 -7 -43 -25 -56zM579 836c61 56 23 157 -85 225c-61 39 -132 59 -192 59c-46 0 -87 -12 -113 -36c-61 -56 -23 -157 85 -225c61 -39 131 -59 192 -59c46 0 87 12 113 36zM494 91c108 68 146 169 85 225c-26 24 -67 36 -113 36c-61 0 -131 -20 -192 -59
-c-108 -68 -146 -169 -85 -225c26 -24 67 -36 113 -36c60 0 131 20 192 59zM672 704l96 -58v11c0 23 13 44 33 56l14 8l-79 47l-26 -26c-8 -8 -14 -16 -22 -23c-3 -3 -5 -4 -7 -6zM896 480l96 -32l736 576l-128 64l-768 -431v-113l-160 -96l9 -8c2 -3 4 -4 7 -6
-c8 -8 14 -16 22 -24l26 -26zM1600 64l128 64l-520 408l-177 -138c-3 -4 -8 -5 -13 -7z" />
-    <glyph glyph-name="ellipsis-h" unicode="&#xf141;" horiz-adv-x="1408" 
-d="M384 800v-192c0 -53 -43 -96 -96 -96h-192c-53 0 -96 43 -96 96v192c0 53 43 96 96 96h192c53 0 96 -43 96 -96zM896 800v-192c0 -53 -43 -96 -96 -96h-192c-53 0 -96 43 -96 96v192c0 53 43 96 96 96h192c53 0 96 -43 96 -96zM1408 800v-192c0 -53 -43 -96 -96 -96h-192
-c-53 0 -96 43 -96 96v192c0 53 43 96 96 96h192c53 0 96 -43 96 -96z" />
-    <glyph glyph-name="scribd" unicode="&#xf28a;" horiz-adv-x="1464" 
-d="M1464 -13c0 -119 -96 -216 -216 -216s-217 97 -217 216c0 120 97 217 217 217s216 -97 216 -217zM1231 268c-152 -20 -270 -150 -270 -308c0 -49 12 -97 33 -138c-90 -48 -212 -78 -379 -78c-532 0 -615 376 -615 426c0 51 30 218 218 218s214 -161 214 -194
-c0 0 0 -34 -23 -81c64 -60 215 -60 215 -60c151 0 265 74 265 184c0 111 -128 165 -420 302c-292 138 -402 239 -402 490c0 252 168 507 587 507s577 -235 577 -396s-137 -201 -188 -201c-50 0 -235 -17 -235 261c-33 37 -177 37 -177 37c-145 0 -209 -110 -209 -177
-c0 -68 27 -152 329 -252c463 -154 480 -355 480 -540z" />
-    <glyph glyph-name="exclamation" unicode="&#xf12a;" horiz-adv-x="444" 
-d="M414 288v-224c0 -35 -29 -64 -64 -64h-256c-35 0 -64 29 -64 64v224c0 35 29 64 64 64h256c35 0 64 -29 64 -64zM444 1344l-28 -768c-1 -35 -31 -64 -66 -64h-256c-35 0 -65 29 -66 64l-28 768c-1 35 27 64 62 64h320c35 0 63 -29 62 -64z" />
-    <glyph glyph-name="try" unicode="&#xf195;" horiz-adv-x="1152" 
-d="M1152 704c0 -388 -316 -704 -704 -704h-160c-18 0 -32 14 -32 32v611l-215 -66c-3 -1 -6 -1 -9 -1c-7 0 -13 2 -19 6c-8 6 -13 16 -13 26v128c0 14 9 26 23 31l233 71v93l-215 -66c-3 -1 -6 -1 -9 -1c-7 0 -13 2 -19 6c-8 6 -13 16 -13 26v128c0 14 9 26 23 31l233 71
-v250c0 18 14 32 32 32h160c18 0 32 -14 32 -32v-181l375 116c9 3 20 1 28 -5s13 -16 13 -26v-128c0 -14 -9 -26 -23 -31l-393 -121v-93l375 116c9 3 20 1 28 -5s13 -16 13 -26v-128c0 -14 -9 -26 -23 -31l-393 -121v-487c250 17 448 225 448 479c0 18 14 32 32 32h160
-c18 0 32 -14 32 -32z" />
-    <glyph glyph-name="assistive-listening-systems" unicode="&#xf2a2;" horiz-adv-x="1792" 
-d="M128 -192c0 -35 -29 -64 -64 -64s-64 29 -64 64s29 64 64 64s64 -29 64 -64zM320 0c0 -35 -29 -64 -64 -64s-64 29 -64 64s29 64 64 64s64 -29 64 -64zM365 365l256 -256l-90 -90l-256 256zM704 384c0 -35 -29 -64 -64 -64s-64 29 -64 64s29 64 64 64s64 -29 64 -64z
-M1411 704c0 -166 -78 -255 -146 -334c-63 -72 -113 -129 -113 -242c0 -212 -172 -384 -384 -384c-35 0 -64 29 -64 64s29 64 64 64c141 0 256 115 256 256c0 161 77 249 144 326c62 71 115 132 115 250c0 247 -201 448 -448 448s-448 -201 -448 -448c0 -35 -29 -64 -64 -64
-s-64 29 -64 64c0 318 258 576 576 576s576 -258 576 -576zM896 576c0 -35 -29 -64 -64 -64s-64 29 -64 64s29 64 64 64s64 -29 64 -64zM1184 704c0 -35 -29 -64 -64 -64s-64 29 -64 64c0 124 -100 224 -224 224c-123 0 -224 -100 -224 -224c0 -35 -29 -64 -64 -64
-s-64 29 -64 64c0 194 158 352 352 352s352 -158 352 -352zM1578 993c13 -33 -4 -70 -37 -83c-7 -3 -15 -4 -23 -4c-25 0 -50 15 -59 41c-45 117 -123 219 -224 295c-28 21 -34 61 -13 89c22 28 62 34 90 13c120 -90 212 -212 266 -351zM1788 1074c12 -33 -4 -70 -37 -83
-c-8 -3 -15 -4 -23 -4c-26 0 -50 15 -60 41c-60 156 -163 292 -297 393c-29 21 -34 61 -13 89c21 29 61 34 89 13c154 -115 272 -271 341 -449z" />
-    <glyph glyph-name="flag-o" unicode="&#xf11d;" horiz-adv-x="1728" 
-d="M1600 491v616c-80 -43 -192 -91 -306 -91c-53 0 -102 10 -145 32c-107 53 -223 104 -362 104c-129 0 -287 -63 -403 -127v-599c132 61 300 113 433 113c154 0 254 -51 361 -104l28 -14c28 -14 62 -22 101 -22c111 0 231 59 293 92zM256 1280c0 -47 -26 -88 -64 -110
-v-1266c0 -18 -14 -32 -32 -32h-64c-18 0 -32 14 -32 32v1266c-38 22 -64 63 -64 110c0 71 57 128 128 128s128 -57 128 -128zM1728 1216v-763c0 -24 -14 -46 -35 -57c-4 -2 -10 -5 -17 -9c-64 -34 -215 -116 -369 -116c-59 0 -112 12 -158 35l-28 14
-c-101 51 -181 91 -304 91c-144 0 -347 -75 -464 -146c-10 -6 -22 -9 -33 -9s-22 3 -32 8c-20 12 -32 33 -32 56v742c0 22 12 43 31 55c64 38 290 163 500 163c167 0 303 -61 418 -117c26 -13 56 -19 89 -19c118 0 248 75 310 112c13 7 24 13 31 17c20 10 43 9 62 -2
-c19 -12 31 -33 31 -55z" />
-    <glyph glyph-name="wikipedia-w" unicode="&#xf266;" horiz-adv-x="2304" 
-d="M1494 -103l-295 695c-117 -229 -246 -468 -357 -695c-1 -1 -54 0 -54 1c-169 395 -346 787 -515 1183c-41 96 -178 252 -272 251c0 11 -1 36 -1 51h583v-50c-69 -4 -190 -48 -156 -123c79 -179 373 -865 452 -1039c54 107 208 393 271 514c-50 102 -211 482 -262 576
-c-35 64 -130 70 -201 71v50l513 -1v-47c-70 -2 -137 -28 -106 -94c68 -144 110 -245 173 -377c20 39 125 250 173 363c32 74 -14 103 -139 106c1 13 0 37 1 49c160 1 400 1 443 2v-49c-81 -3 -165 -46 -209 -114l-213 -442c23 -58 228 -514 249 -564l441 1017
-c-31 83 -131 101 -170 102v50l460 -4l1 -2l-1 -44c-101 -3 -162 -57 -201 -145c-90 -208 -372 -864 -559 -1291h-49z" />
-    <glyph glyph-name="battery-quarter" unicode="&#xf243;" horiz-adv-x="2304" 
-d="M256 256v768h512v-768h-512zM2176 960c71 0 128 -57 128 -128v-384c0 -71 -57 -128 -128 -128v-160c0 -88 -72 -160 -160 -160h-1856c-88 0 -160 72 -160 160v960c0 88 72 160 160 160h1856c88 0 160 -72 160 -160v-160zM2176 448v384h-128v288c0 18 -14 32 -32 32h-1856
-c-18 0 -32 -14 -32 -32v-960c0 -18 14 -32 32 -32h1856c18 0 32 14 32 32v288h128z" />
-    <glyph glyph-name="print" unicode="&#xf02f;" horiz-adv-x="1664" 
-d="M384 0h896v256h-896v-256zM384 640h896v384h-160c-53 0 -96 43 -96 96v160h-640v-640zM1536 576c0 35 -29 64 -64 64s-64 -29 -64 -64s29 -64 64 -64s64 29 64 64zM1664 576v-416c0 -17 -15 -32 -32 -32h-224v-160c0 -53 -43 -96 -96 -96h-960c-53 0 -96 43 -96 96v160
-h-224c-17 0 -32 15 -32 32v416c0 105 87 192 192 192h64v544c0 53 43 96 96 96h672c53 0 126 -30 164 -68l152 -152c38 -38 68 -111 68 -164v-256h64c105 0 192 -87 192 -192z" />
-    <glyph glyph-name="tipeee" unicode="&#xf301;" horiz-adv-x="2304" 
-d="M116 1259h2072c64 0 116 -52 116 -116v-1006c0 -64 -52 -116 -116 -116h-2072c-64 0 -116 52 -116 116v1006c0 64 52 116 116 116zM756 1006v0c-59 0 -90 -47 -90 -85c0 -40 37 -84 90 -84c59 0 92 38 92 84c0 38 -34 85 -92 85zM1672 966v-159l45 -211h110l45 211v159
-h-200zM534 925l-154 -49v-77h-45v-109h45v-148c3 -107 7 -176 132 -176c19 0 77 6 102 16v107c-16 -7 -42 -14 -53 -14c-33 0 -27 39 -27 67v148h80v109h-80v126zM1212 806v0c-50 0 -85 -24 -101 -36l-14 29h-192v-111h35v-368h-35v-109h250v109h-45v85c6 -5 40 -33 109 -33
-c108 0 190 82 190 215c0 119 -67 219 -197 219zM643 799v-109h35v-199h-35v-110h234v110h-40v308h-194zM1169 688v0c37 0 61 -53 61 -103c0 -64 -25 -104 -60 -104c-32 0 -60 43 -60 100c-3 66 26 107 59 107zM1764 555c-60 0 -95 -47 -95 -89c0 -43 41 -86 95 -86
-c61 0 99 39 99 86c0 48 -40 89 -99 89z" />
-    <glyph glyph-name="check-circle-o" unicode="&#xf05d;" 
-d="M1171 723l-422 -422c-25 -25 -65 -25 -90 0l-294 294c-25 25 -25 65 0 90l102 102c25 25 65 25 90 0l147 -147l275 275c25 25 65 25 90 0l102 -102c25 -25 25 -65 0 -90zM1312 640c0 300 -244 544 -544 544s-544 -244 -544 -544s244 -544 544 -544s544 244 544 544z
-M1536 640c0 -424 -344 -768 -768 -768s-768 344 -768 768s344 768 768 768s768 -344 768 -768z" />
-    <glyph glyph-name="level-up" unicode="&#xf148;" horiz-adv-x="1024" 
-d="M1018 933c-11 -23 -33 -37 -58 -37h-192v-864c0 -18 -14 -32 -32 -32h-704c-12 0 -24 7 -29 18c-5 12 -4 25 4 35l160 192c6 7 16 11 25 11h320v640h-192c-25 0 -47 14 -58 37c-10 22 -7 49 9 68l320 384c24 29 74 29 98 0l320 -384c16 -19 20 -46 9 -68z" />
-    <glyph glyph-name="houzz" unicode="&#xf27c;" horiz-adv-x="1024" 
-d="M512 345l512 295v-591l-512 -296v592zM0 640l512 -295l-512 -296v591zM512 1527v-591l-512 -296v591zM512 936l512 295v-591z" />
-    <glyph glyph-name="lemon-o" unicode="&#xf094;" horiz-adv-x="1535" 
-d="M1407 710c0 47 -9 170 -25 210c-19 48 -30 75 -30 129c0 46 10 91 10 136c0 19 -1 39 -10 55c-4 1 -9 1 -13 1c-39 0 -78 -9 -117 -9c-119 0 -232 48 -351 48c-93 0 -183 -35 -269 -69c-68 -27 -143 -59 -202 -103c-202 -153 -272 -433 -272 -674c0 -81 25 -160 25 -241
-c0 -46 -22 -88 -22 -132c0 -28 16 -51 46 -51c49 0 96 22 146 22c114 0 225 -31 339 -31c89 0 201 7 284 36c263 93 461 397 461 673zM1535 712c0 -333 -231 -684 -547 -796c-99 -35 -222 -44 -326 -44c-114 0 -226 29 -339 29c-48 0 -96 -29 -146 -29
-c-99 0 -174 89 -174 184c0 47 22 89 22 135c0 81 -25 160 -25 242c0 284 87 598 323 777c68 52 153 89 232 120c102 41 205 78 316 78c119 0 232 -48 349 -48c38 0 76 10 115 10c114 0 155 -81 155 -185c0 -45 -10 -91 -10 -136c0 -36 9 -50 21 -82c23 -58 34 -191 34 -255z
-" />
-    <glyph glyph-name="umbrella" unicode="&#xf0e9;" horiz-adv-x="1664" 
-d="M896 708v-580c0 -139 -117 -256 -256 -256s-256 117 -256 256c0 35 29 64 64 64s64 -29 64 -64c0 -67 61 -128 128 -128s128 61 128 128v580c21 7 42 11 64 11s43 -4 64 -11zM1664 681c0 -17 -15 -32 -32 -32c-9 0 -16 4 -23 10c-58 54 -112 92 -195 92
-c-95 0 -177 -59 -231 -134c-12 -17 -21 -35 -32 -52c-7 -11 -15 -17 -28 -17c-14 0 -22 6 -29 17c-11 17 -20 35 -32 52c-54 75 -135 134 -230 134s-176 -59 -230 -134c-12 -17 -21 -35 -32 -52c-7 -11 -15 -17 -29 -17c-13 0 -21 6 -28 17c-11 17 -20 35 -32 52
-c-54 75 -136 134 -231 134c-83 0 -137 -38 -195 -92c-7 -6 -14 -10 -23 -10c-17 0 -32 15 -32 32c0 3 0 5 1 7c92 378 457 592 831 592c372 0 741 -214 831 -592c1 -2 1 -4 1 -7zM896 1408v-98c-21 1 -43 2 -64 2s-43 -1 -64 -2v98c0 35 29 64 64 64s64 -29 64 -64z" />
-    <glyph glyph-name="bell-o" unicode="&#xf0a2;" horiz-adv-x="1664" 
-d="M848 -160c0 9 -7 16 -16 16c-79 0 -144 65 -144 144c0 9 -7 16 -16 16s-16 -7 -16 -16c0 -97 79 -176 176 -176c9 0 16 7 16 16zM1664 128c0 -70 -58 -128 -128 -128h-448c0 -141 -115 -256 -256 -256s-256 115 -256 256h-448c-70 0 -128 58 -128 128
-c148 125 320 349 320 832c0 192 159 402 424 441c-5 12 -8 25 -8 39c0 53 43 96 96 96s96 -43 96 -96c0 -14 -3 -27 -8 -39c265 -39 424 -249 424 -441c0 -483 172 -707 320 -832z" />
-    <glyph glyph-name="shaarli" unicode="&#xf2f5;" horiz-adv-x="1651" 
-d="M878 1408c161 0 254 -160 278 -479h66c287 -44 429 -135 426 -273c24 -163 -80 -238 -312 -226c178 -156 241 -302 191 -437c-39 -108 -133 -143 -282 -107c-164 82 -281 176 -349 282h-43c-64 -188 -188 -282 -372 -282h-64c-153 47 -209 140 -166 278l80 221h-23
-c-225 32 -326 131 -305 298c6 153 160 231 462 233c84 9 119 36 105 80c0 275 103 412 308 412zM830 1182c-56 4 -83 -72 -82 -227l-5 -128c-5 -64 -25 -96 -61 -96l-360 -20c-56 -2 -85 -25 -85 -69c0 -43 31 -65 92 -68c211 11 310 -4 296 -43l-64 -137
-c-108 -163 -135 -258 -80 -287c73 -44 176 70 310 342c32 29 59 29 80 0c94 -100 171 -182 232 -246c62 -64 113 -83 151 -57c46 49 33 101 -37 157c-68 58 -146 137 -234 237c-9 33 -8 50 6 50c298 -20 441 -1 429 57c9 64 -121 96 -388 96c-41 -8 -74 2 -100 29v224
-c0 125 -30 186 -89 184c-3 1 -8 2 -11 2v0z" />
-    <glyph glyph-name="cc-diners-club" unicode="&#xf24c;" horiz-adv-x="2304" 
-d="M858 295v693c-139 -54 -238 -189 -238 -347s99 -293 238 -346zM1362 641c0 158 -99 293 -238 347v-694c139 54 238 189 238 347zM1577 641c0 -323 -262 -586 -586 -586c-323 0 -586 263 -586 586c0 324 263 586 586 586c324 0 586 -262 586 -586zM1960 634
-c0 382 -319 646 -669 646h-301c-354 0 -646 -264 -646 -646c0 -349 292 -634 646 -634h301c350 0 669 285 669 634zM2304 1280v-1280c0 -70 -58 -128 -128 -128h-2048c-70 0 -128 58 -128 128v1280c0 70 58 128 128 128h2048c70 0 128 -58 128 -128z" />
-    <glyph glyph-name="undo" unicode="&#xf0e2;" 
-d="M1536 640c0 -423 -345 -768 -768 -768c-229 0 -445 101 -591 277c-10 13 -9 32 2 43l137 138c7 6 16 9 25 9c9 -1 18 -5 23 -12c98 -127 245 -199 404 -199c282 0 512 230 512 512s-230 512 -512 512c-131 0 -255 -50 -348 -137l137 -138c19 -18 24 -46 14 -69
-c-10 -24 -33 -40 -59 -40h-448c-35 0 -64 29 -64 64v448c0 26 16 49 40 59c23 10 51 5 69 -14l130 -129c141 133 332 212 529 212c423 0 768 -345 768 -768z" />
-    <glyph glyph-name="rebel" unicode="&#xf1d0;" horiz-adv-x="1756" 
-d="M0 662c10 286 156 550 421 724c1 0 7 2 4 -3c-21 -20 -402 -469 -51 -818c180 -179 325 -9 325 -9c139 181 -2 455 -2 455c-36 90 -165 145 -165 145l104 115c88 -38 156 -140 156 -140c3 107 -79 222 -79 222l161 183l160 -181c-74 -104 -79 -226 -79 -226
-c50 83 157 142 157 142l103 -115c-99 -32 -164 -144 -164 -144c-57 -103 -98 -323 2 -460c117 -161 317 10 317 10c371 332 -38 813 -38 813c-22 20 3 10 3 10c181 -132 414 -305 420 -740c7 -526 -361 -901 -876 -901c-503 0 -894 420 -879 918z" />
-    <glyph glyph-name="codiepie" unicode="&#xf284;" horiz-adv-x="1723" 
-d="M1584 246l-218 111c-98 -160 -272 -258 -460 -258c-298 0 -539 241 -539 538c0 298 241 539 539 539c175 0 339 -85 440 -229l215 125c-147 226 -396 361 -665 361c-438 0 -793 -355 -793 -793s355 -793 793 -793c284 0 547 152 688 399zM1030 643l693 -352
-c-152 -332 -457 -547 -827 -547c-495 0 -896 401 -896 896s401 896 896 896c352 0 642 -194 806 -500zM1543 640h-39v-160h-96v352h136c111 0 121 -192 -1 -192z" />
-    <glyph glyph-name="soundcloud" unicode="&#xf1be;" horiz-adv-x="2304" 
-d="M784 164c-1 -13 -11 -23 -24 -23c-12 0 -22 10 -23 23l-14 241l14 523c0 13 11 24 23 24c13 0 23 -11 24 -24l16 -523zM1080 193l-1 -24c0 -8 -3 -15 -9 -20c-5 -5 -12 -9 -20 -9c-9 0 -17 4 -23 11c-4 5 -6 11 -6 17v1c-11 235 -11 236 -11 236l10 579l1 6
-c0 10 5 19 13 24c5 3 10 5 16 5s11 -2 16 -5c8 -5 13 -14 13 -24l12 -586zM35 533l20 -128l-20 -126c-1 -5 -4 -9 -9 -9s-8 4 -9 9l-17 126l17 128c1 5 4 9 9 9s8 -4 9 -9zM121 612l26 -207l-26 -203c-1 -5 -5 -9 -10 -9s-9 4 -9 10l-23 202l23 207c0 5 4 9 9 9s9 -4 10 -9z
-M401 159zM213 650l25 -245l-25 -237c0 -6 -5 -11 -11 -11s-11 5 -12 11l-21 237l21 245c1 7 6 12 12 12s11 -5 11 -12zM307 657l23 -252l-23 -244c-1 -8 -7 -13 -14 -13s-13 5 -13 13l-21 244l21 252c0 8 6 13 13 13s13 -5 14 -13zM401 639l21 -234l-21 -246
-c-1 -9 -8 -16 -16 -16s-15 7 -15 16l-20 246l20 234c0 8 7 15 15 15s15 -7 16 -15zM784 164zM495 785l21 -380l-21 -246c0 -10 -8 -18 -17 -18c-10 0 -17 8 -18 18l-18 246l18 380c1 10 8 18 18 18c9 0 17 -8 17 -18zM589 871l19 -468l-19 -244c0 -11 -9 -19 -19 -19
-c-11 0 -19 8 -20 19l-16 244l16 468c1 11 9 19 20 19c10 0 19 -8 19 -19zM687 911l18 -506l-18 -242c-1 -12 -10 -21 -22 -21c-11 0 -20 9 -21 21l-16 242l16 506c0 12 10 22 21 22c12 0 21 -10 22 -22zM1079 169zM881 915l15 -510l-15 -239c0 -14 -11 -25 -25 -25
-s-24 11 -25 25l-14 239l14 510c0 14 11 25 25 25s25 -11 25 -25zM980 896l14 -492l-14 -236c0 -15 -12 -27 -27 -27s-27 12 -28 27l-12 236l12 492c1 16 13 28 28 28s26 -12 27 -28zM1192 404l-14 -231c0 -17 -14 -31 -31 -31s-31 14 -32 31l-6 114l-6 117l12 636v3
-c1 9 5 18 12 24c5 4 12 7 20 7c5 0 11 -2 15 -5c9 -5 15 -15 16 -26zM2304 423c0 -156 -127 -282 -283 -282h-786c-17 2 -31 15 -31 33v899c0 17 6 25 28 33c55 22 117 34 181 34c261 0 475 -200 498 -455c34 14 71 22 110 22c156 0 283 -127 283 -284z" />
-    <glyph glyph-name="microphone" unicode="&#xf130;" horiz-adv-x="1152" 
-d="M1152 832v-128c0 -296 -224 -540 -512 -572v-132h256c35 0 64 -29 64 -64s-29 -64 -64 -64h-640c-35 0 -64 29 -64 64s29 64 64 64h256v132c-288 32 -512 276 -512 572v128c0 35 29 64 64 64s64 -29 64 -64v-128c0 -247 201 -448 448 -448s448 201 448 448v128
-c0 35 29 64 64 64s64 -29 64 -64zM896 1216v-512c0 -176 -144 -320 -320 -320s-320 144 -320 320v512c0 176 144 320 320 320s320 -144 320 -320z" />
-    <glyph glyph-name="laravel" unicode="&#xf30b;" horiz-adv-x="1870" 
-d="M1863 682v0c13 -14 10 -25 -13 -31c-20 -6 -203 -54 -255 -68c76 -101 219 -294 231 -312c17 -25 2 -32 -23 -42s-571 -207 -608 -218c-48 -14 -69 -21 -100 22c-23 33 -149 259 -211 371c-117 -30 -330 -86 -392 -101c-60 -14 -86 22 -96 44s-365 786 -387 839
-c-23 53 2 62 24 64s335 28 376 30s44 -8 62 -34l450 -753l566 136c-31 44 -173 246 -187 265c-15 22 0 32 25 36s242 41 261 44s33 9 63 -27s201 -251 214 -265zM834 472c7 1 10 5 3 18s-422 729 -422 729c-4 7 -3 9 -13 9s-305 -27 -310 -27s-5 -8 0 -18s380 -783 382 -789
-s2 -8 19 -4s334 81 341 82zM1728 304c-5 8 -178 244 -187 258s-13 10 -27 6l-552 -143s169 -293 182 -312s21 -17 31 -13s531 179 547 185s11 11 6 19zM1763 696c13 3 22 7 16 14s-149 189 -159 203s-18 12 -27 10c-8 -2 -196 -36 -208 -38s-8 -8 -3 -15l166 -227
-s202 50 215 53z" />
-    <glyph glyph-name="indent" unicode="&#xf03c;" horiz-adv-x="1792" 
-d="M352 704c0 -8 -3 -17 -9 -23l-288 -288c-6 -6 -15 -9 -23 -9c-17 0 -32 15 -32 32v576c0 17 15 32 32 32c8 0 17 -3 23 -9l288 -288c6 -6 9 -15 9 -23zM1792 224v-192c0 -17 -15 -32 -32 -32h-1728c-17 0 -32 15 -32 32v192c0 17 15 32 32 32h1728c17 0 32 -15 32 -32z
-M1792 608v-192c0 -17 -15 -32 -32 -32h-1088c-17 0 -32 15 -32 32v192c0 17 15 32 32 32h1088c17 0 32 -15 32 -32zM1792 992v-192c0 -17 -15 -32 -32 -32h-1088c-17 0 -32 15 -32 32v192c0 17 15 32 32 32h1088c17 0 32 -15 32 -32zM1792 1376v-192c0 -17 -15 -32 -32 -32
-h-1728c-17 0 -32 15 -32 32v192c0 17 15 32 32 32h1728c17 0 32 -15 32 -32z" />
-    <glyph glyph-name="address-card-o" unicode="&#xf2bc;" horiz-adv-x="2048" 
-d="M1024 405c0 -87 -57 -149 -128 -149h-512c-71 0 -128 62 -128 149c0 155 38 327 196 327c49 -28 115 -76 188 -76s139 48 188 76c158 0 196 -172 196 -327zM867 925c0 -126 -102 -227 -227 -227s-227 101 -227 227c0 125 102 227 227 227s227 -102 227 -227zM1792 480
-v-64c0 -18 -14 -32 -32 -32h-576c-18 0 -32 14 -32 32v64c0 18 14 32 32 32h576c18 0 32 -14 32 -32zM1792 732v-56c0 -20 -16 -36 -36 -36h-568c-20 0 -36 16 -36 36v56c0 20 16 36 36 36h568c20 0 36 -16 36 -36zM1792 992v-64c0 -18 -14 -32 -32 -32h-576
-c-18 0 -32 14 -32 32v64c0 18 14 32 32 32h576c18 0 32 -14 32 -32zM1920 32v1216c0 17 -15 32 -32 32h-1728c-17 0 -32 -15 -32 -32v-1216c0 -17 15 -32 32 -32h352v96c0 18 14 32 32 32h64c18 0 32 -14 32 -32v-96h768v96c0 18 14 32 32 32h64c18 0 32 -14 32 -32v-96h352
-c17 0 32 15 32 32zM2048 1248v-1216c0 -88 -72 -160 -160 -160h-1728c-88 0 -160 72 -160 160v1216c0 88 72 160 160 160h1728c88 0 160 -72 160 -160z" />
-    <glyph glyph-name="language" unicode="&#xf1ab;" 
-d="M654 458c-2 -7 -51 16 -64 21c-13 6 -72 39 -87 49s-72 57 -79 60c-36 -55 -82 -120 -134 -181c-18 -21 -72 -89 -105 -110c-5 -3 -34 -6 -38 -4c16 12 62 69 82 92c25 29 144 195 164 233c21 38 84 164 87 176c-10 1 -89 -26 -110 -33c-20 -6 -75 -19 -79 -22
-c-4 -4 -1 -16 -3 -20s-20 -13 -31 -15c-10 -3 -33 -4 -47 0c-13 3 -25 16 -28 21c0 0 -4 6 -5 23c12 4 32 5 54 11s76 22 105 32s85 31 102 35c18 3 63 33 87 41s41 18 42 13s0 -27 -1 -33c-1 -5 -49 -99 -56 -114c-4 -8 -32 -61 -77 -131c16 -7 50 -21 64 -28
-c17 -8 136 -58 142 -60s17 -48 15 -56zM449 944c3 -17 -2 -24 -4 -28c-10 -19 -35 -32 -50 -38s-40 -12 -60 -12c-9 1 -27 4 -49 26c-12 13 -21 48 -17 44s33 -8 46 -5s44 12 58 16c15 5 45 13 55 14c10 0 18 -4 21 -17zM1147 815l63 -227l-139 42zM39 15l694 232v1032
-l-694 -233v-1031zM1280 332l102 -31l-181 657l-100 31l-216 -536l102 -31l45 110l211 -65zM777 1294l573 -184v380zM1088 -29l158 -13l-54 -160l-40 66c-81 -52 -181 -92 -276 -108c-29 -6 -62 -12 -91 -12h-84c-106 0 -299 63 -383 124c-6 5 -8 9 -8 16c0 11 8 19 18 19
-c9 0 56 -29 69 -35c90 -45 216 -86 317 -86c125 0 210 16 324 65c33 15 62 34 93 51zM1536 1050v-1079c-773 246 -774 246 -774 246c-16 -7 -733 -249 -743 -249c-8 0 -15 5 -18 13c0 1 -1 2 -1 3v1078c1 3 2 8 4 10c6 7 14 9 20 11c3 1 64 21 149 50v384l558 -198
-c7 2 629 217 638 217c11 0 20 -8 20 -21v-418z" />
-    <glyph glyph-name="circle-thin" unicode="&#xf1db;" 
-d="M768 1280c-353 0 -640 -287 -640 -640s287 -640 640 -640s640 287 640 640s-287 640 -640 640zM1536 640c0 -424 -344 -768 -768 -768s-768 344 -768 768s344 768 768 768s768 -344 768 -768z" />
-    <glyph glyph-name="drupal" unicode="&#xf1a9;" 
-d="M1167 -50c-2 7 -8 17 -24 5c-34 -25 -110 -56 -218 -56s-159 23 -193 49c-5 4 -3 4 -13 4c-11 0 -17 -5 -26 -12c-8 -7 -12 -24 0 -36c74 -68 198 -62 289 -54c92 9 170 63 178 71c12 12 9 22 7 29zM1128 65c-7 17 -19 47 -39 61c-20 13 -49 15 -76 15s-42 2 -71 -10
-s-59 -39 -78 -56s-22 -30 -12 -44c10 -13 21 -5 49 19c29 23 48 44 107 44s69 -22 81 -44s13 -25 25 -19c14 7 21 17 14 34zM1483 346c0 52 -23 140 -108 140c-80 0 -242 -166 -327 -167c-99 -2 -236 196 -434 194c-156 -1 -279 -125 -281 -257c-1 -74 23 -129 74 -164
-c34 -23 65 -37 166 -37c168 0 381 208 479 205c78 -3 199 -194 260 -198c48 -4 73 18 114 77c40 60 57 154 57 207zM1536 506c0 -448 -354 -744 -761 -744c-408 0 -775 321 -775 758c0 436 340 638 403 671c75 40 129 61 214 129c42 33 77 81 88 198
-c61 -73 134 -158 186 -193c85 -56 170 -78 259 -134c54 -33 386 -236 386 -685z" />
-    <glyph glyph-name="headphones" unicode="&#xf025;" horiz-adv-x="1664" 
-d="M1664 650c0 -109 -20 -215 -60 -314l-20 -49l-185 -33c-29 -109 -128 -190 -247 -190v-32c0 -18 -14 -32 -32 -32h-64c-18 0 -32 14 -32 32v576c0 18 14 32 32 32h64c18 0 32 -14 32 -32v-32c96 0 179 -53 223 -131l68 12c19 62 29 126 29 193c0 302 -299 566 -640 566
-s-640 -264 -640 -566c0 -67 10 -131 29 -193l68 -12c44 78 127 131 223 131v32c0 18 14 32 32 32h64c18 0 32 -14 32 -32v-576c0 -18 -14 -32 -32 -32h-64c-18 0 -32 14 -32 32v32c-119 0 -218 81 -247 190l-185 33l-20 49c-40 99 -60 205 -60 314c0 411 381 758 832 758
-s832 -347 832 -758z" />
-    <glyph glyph-name="cc-mastercard" unicode="&#xf1f1;" horiz-adv-x="2304" 
-d="M1119 1195c-83 55 -181 85 -281 85c-281 0 -509 -228 -509 -508c0 -281 228 -509 509 -509c100 0 198 30 281 85c-268 218 -266 629 0 847zM1152 1171c-258 -203 -259 -597 0 -799c259 202 258 596 0 799zM1185 1195c265 -218 269 -630 0 -847c83 -55 182 -85 281 -85
-c281 0 509 228 509 509c0 280 -228 508 -509 508c-100 0 -198 -30 -281 -85zM1926 473h7v3h-17v-3h7v-17h3v17zM1955 456h4v20h-5l-6 -13l-6 13h-5v-20h3v15l6 -13h4l5 13v-15zM1947 16v-2h-5v3h5v-1zM1947 7h3l-4 5c2 0 2 1 3 1c1 1 1 2 1 3s0 2 -1 3c-1 0 -2 1 -4 1h-6
-v-13h3v5h1zM685 75c0 24 15 43 41 43c24 0 40 -19 40 -43c0 -25 -16 -43 -40 -43c-26 0 -41 19 -41 43zM1158 119c19 0 32 -11 35 -32h-70c3 19 15 32 35 32zM1514 75c0 24 15 43 40 43s41 -19 41 -43c0 -25 -16 -43 -41 -43s-40 19 -40 43zM1786 75c0 24 16 43 41 43
-c24 0 41 -19 41 -43c0 -25 -17 -43 -41 -43c-25 0 -41 19 -41 43zM1944 3c-1 0 -2 0 -4 1c-1 0 -2 1 -3 2s-2 2 -2 3c-1 2 -1 3 -1 4c0 2 0 3 1 4c0 2 1 3 2 4s2 1 3 2c2 1 3 1 4 1c2 0 3 0 4 -1c2 -1 3 -1 4 -2s1 -2 2 -4c0 -1 1 -2 1 -4c0 -1 -1 -2 -1 -4
-c-1 -1 -1 -2 -2 -3s-2 -2 -4 -2c-1 -1 -2 -1 -4 -1zM599 7h30v85c0 32 -21 53 -54 54c-17 0 -35 -5 -47 -24c-9 15 -24 24 -45 24c-14 0 -28 -5 -39 -20v16h-30v-135h30v75c0 24 13 36 33 36s30 -13 30 -36v-75h29v75c0 24 14 36 33 36c20 0 30 -13 30 -36v-75zM765 7h29
-v135h-29v-16c-10 12 -24 20 -43 20c-38 0 -67 -30 -67 -71s29 -71 67 -71c19 0 33 7 43 20v-17zM943 48c0 24 -18 36 -47 40l-14 2c-13 2 -23 5 -23 14s9 15 25 15c18 0 34 -6 43 -11l12 24c-14 9 -33 14 -55 14c-34 0 -56 -17 -56 -44c0 -22 16 -35 47 -39l13 -2
-c17 -3 24 -7 24 -14c0 -11 -11 -17 -31 -17s-35 7 -45 14l-13 -23c16 -11 36 -17 58 -17c39 0 62 18 62 44zM1073 14l-8 25c-9 -5 -18 -7 -26 -7c-15 0 -19 9 -19 22v61h48v27h-48v41h-30v-41h-28v-27h28v-61c0 -31 12 -50 47 -50c12 0 27 4 36 10zM1159 146
-c-39 0 -67 -29 -67 -71c0 -43 29 -71 69 -71c20 0 39 5 55 19l-14 22c-11 -9 -26 -15 -39 -15c-19 0 -36 9 -41 33h101v12c0 42 -26 71 -64 71zM1318 146c-17 0 -28 -8 -35 -20v16h-30v-135h30v76c0 22 9 35 29 35c6 0 12 -1 18 -4l9 28c-7 3 -15 4 -21 4zM1348 75
-c0 -41 28 -71 72 -71c20 0 34 4 48 16l-14 24c-11 -8 -22 -13 -35 -12c-24 0 -41 17 -41 43s17 43 41 43c13 0 24 -4 35 -12l14 24c-14 11 -28 16 -48 16c-44 0 -72 -30 -72 -71zM1593 7h30v135h-30v-16c-9 12 -23 20 -42 20c-38 0 -68 -30 -68 -71s30 -71 68 -71
-c19 0 33 7 42 20v-17zM1726 146c-17 0 -28 -8 -35 -20v16h-29v-135h29v76c0 22 10 35 29 35c6 0 12 -1 18 -4l9 28c-6 3 -15 4 -21 4zM1866 7h29v190h-29v-71c-9 12 -23 20 -43 20c-37 0 -67 -30 -67 -71s30 -71 67 -71c20 0 34 7 43 20v-17zM1944 27c-1 0 -3 -1 -5 -1
-c-2 -1 -3 -2 -4 -3c-2 -1 -3 -3 -3 -4c-1 -2 -1 -4 -1 -6c0 -1 0 -3 1 -5c0 -1 1 -3 3 -4c1 -1 2 -2 4 -3s4 -1 5 -1c2 0 4 0 6 1c1 1 3 2 4 3s2 3 3 4c1 2 1 4 1 5c0 2 0 4 -1 6c-1 1 -2 3 -3 4s-3 2 -4 3c-2 0 -4 1 -6 1zM2304 1280v-1280c0 -70 -58 -128 -128 -128h-2048
-c-70 0 -128 58 -128 128v1280c0 70 58 128 128 128h2048c70 0 128 -58 128 -128z" />
-    <glyph glyph-name="times" unicode="&#xf00d;" horiz-adv-x="1188" 
-d="M1188 214c0 -25 -10 -50 -28 -68l-136 -136c-18 -18 -43 -28 -68 -28s-50 10 -68 28l-294 294l-294 -294c-18 -18 -43 -28 -68 -28s-50 10 -68 28l-136 136c-18 18 -28 43 -28 68s10 50 28 68l294 294l-294 294c-18 18 -28 43 -28 68s10 50 28 68l136 136
-c18 18 43 28 68 28s50 -10 68 -28l294 -294l294 294c18 18 43 28 68 28s50 -10 68 -28l136 -136c18 -18 28 -43 28 -68s-10 -50 -28 -68l-294 -294l294 -294c18 -18 28 -43 28 -68z" />
-    <glyph glyph-name="buysellads" unicode="&#xf20d;" 
-d="M915 450h-294l147 551zM1001 128h311l-324 1024h-440l-324 -1024h311l383 314zM1536 1120v-960c0 -158 -130 -288 -288 -288h-960c-158 0 -288 130 -288 288v960c0 158 130 288 288 288h960c158 0 288 -130 288 -288z" />
-    <glyph glyph-name="diaspora" unicode="&#xf2e5;" horiz-adv-x="1581" 
-d="M1005 -16c-42 59 -111 155 -153 214c-41 57 -75 102 -77 102s-66 -87 -152 -205c-82 -113 -150 -205 -151 -205c-2 0 -296 207 -297 209c0 1 65 99 147 217s149 217 149 219c0 4 -27 14 -234 83c-129 43 -235 78 -237 79s10 41 52 174c30 95 56 174 57 175
-s112 -35 248 -80s249 -81 250 -81s2 2 3 5s2 118 3 257s2 254 3 255c1 2 40 2 180 2c98 0 179 0 180 -1c2 -1 4 -78 8 -249c7 -281 9 -285 13 -285c2 0 109 36 239 80s236 79 237 78c3 -3 109 -350 108 -351s-109 -37 -241 -82c-181 -61 -240 -82 -240 -85
-c0 -2 62 -95 141 -211c78 -114 141 -208 141 -209c-1 -2 -293 -217 -295 -217c-1 0 -38 50 -82 112z" />
-    <glyph glyph-name="att" unicode="&#xf31e;" 
-d="M768 1407v0c144 0 278 -39 393 -108c31 -19 46 -30 46 -48c0 -73 -206 -150 -472 -150c-268 0 -419 70 -419 135c0 22 19 39 54 60c116 71 253 111 398 111zM273 1226v0c1 0 0 -1 -1 -2c-22 -27 -31 -53 -31 -79c0 -72 57 -185 362 -185c416 0 677 151 677 236
-c0 7 -2 13 -5 18c-1 1 0 2 1 1c25 -23 48 -46 73 -74c38 -43 53 -66 53 -104c0 -107 -166 -228 -539 -228c-350 0 -725 108 -725 257c0 10 10 28 25 47c32 41 68 78 108 112c1 0 2 1 2 1zM1456 979v0s1 0 1 -1c18 -36 40 -89 51 -133c10 -40 10 -69 2 -97
-c-43 -152 -307 -235 -646 -235c-556 0 -794 160 -841 260c-6 12 -7 20 -4 37c7 39 32 114 55 159c1 1 1 1 1 0c-4 -15 -6 -30 -6 -45c0 -153 253 -274 557 -274c281 0 837 129 830 328v1zM1534 683v0s1 -1 1 -2c1 -13 1 -25 1 -41c0 -67 -9 -146 -28 -190
-c-26 -61 -154 -248 -714 -248c-411 0 -649 139 -744 238c-21 22 -36 49 -39 67c-7 36 -11 91 -11 133c0 2 2 2 2 0c34 -125 219 -308 612 -308c413 0 891 200 919 350c0 1 1 1 1 1zM1482 360v0c1 0 1 -1 1 -2c-13 -33 -30 -67 -47 -96c-29 -50 -61 -86 -95 -114
-c-124 -102 -332 -154 -521 -154c-359 0 -649 111 -745 315c-1 2 0 2 1 1c103 -149 366 -227 610 -227c345 0 679 106 795 276c0 1 1 1 1 1zM1274 64v0c1 0 1 -1 0 -2c-135 -118 -312 -190 -506 -190c-177 0 -341 60 -471 161c-1 1 -1 3 1 2c84 -47 234 -100 470 -100
-c272 0 444 89 505 129h1z" />
-    <glyph glyph-name="sort-asc" unicode="&#xf0de;" horiz-adv-x="1024" 
-d="M1024 832c0 -35 -29 -64 -64 -64h-896c-35 0 -64 29 -64 64c0 17 7 33 19 45l448 448c12 12 28 19 45 19s33 -7 45 -19l448 -448c12 -12 19 -28 19 -45z" />
-    <glyph glyph-name="folder-open" unicode="&#xf07c;" horiz-adv-x="1879" 
-d="M1879 584c0 -24 -15 -48 -31 -66l-336 -396c-58 -68 -176 -122 -264 -122h-1088c-36 0 -87 11 -87 56c0 24 15 48 31 66l336 396c58 68 176 122 264 122h1088c36 0 87 -11 87 -56zM1536 928v-160h-832c-125 0 -280 -71 -361 -167l-337 -396l-5 -6c0 8 -1 17 -1 25v960
-c0 123 101 224 224 224h320c123 0 224 -101 224 -224v-32h544c123 0 224 -101 224 -224z" />
-    <glyph glyph-name="heartbeat" unicode="&#xf21e;" horiz-adv-x="1792" 
-d="M1280 512h305c-12 -13 -20 -20 -22 -22l-623 -600c-12 -12 -28 -18 -44 -18s-32 6 -44 18l-624 602c-2 1 -10 8 -21 20h369c29 0 55 20 62 48l70 281l190 -667c8 -27 33 -46 62 -46c28 0 53 19 61 46l146 485l56 -112c11 -21 33 -35 57 -35zM1792 940
-c0 -115 -50 -220 -103 -300h-369l-111 221c-11 23 -37 37 -62 35c-27 -3 -49 -20 -56 -46l-129 -430l-196 686c-8 27 -33 46 -63 46c-29 0 -54 -20 -61 -48l-116 -464h-423c-53 80 -103 185 -103 300c0 293 179 468 478 468c175 0 339 -138 418 -216c79 78 243 216 418 216
-c299 0 478 -175 478 -468z" />
-    <glyph glyph-name="blind" unicode="&#xf29d;" horiz-adv-x="1330" 
-d="M327 1225c-86 0 -156 70 -156 156c0 85 70 155 156 155s155 -70 155 -155c0 -86 -69 -156 -155 -156zM878 583c0 -108 -115 -84 -141 -40l-367 438c-16 26 -28 14 -28 14s-7 -8 4 -21l122 -139l1 -354c-86 -250 -161 -457 -161 -457c-47 -134 -86 -250 -120 -266
-c-41 -21 -71 -16 -103 -1c-42 19 -54 70 -51 100c0 0 2 16 197 618l5 416l-85 -164l35 -222c13 -84 -58 -95 -58 -95c-68 -11 -82 68 -82 70l-46 299c210 379 211 381 211 381c16 24 52 34 113 34c54 0 88 -16 107 -40l424 -521c6 -4 10 -10 14 -17l3 -3l-1 -1
-c5 -9 7 -19 7 -29zM475 433c96 -255 182 -448 182 -448c29 -74 79 -180 6 -222c-72 -42 -130 7 -146 41h-1c-3 8 -6 16 -8 25l-124 351zM1299 -159c21 -33 39 -57 28 -64c-19 -12 -25 23 -46 57c0 0 -113 171 -423 661c6 -2 17 7 17 7s11 9 11 17
-c308 -503 413 -678 413 -678z" />
-    <glyph glyph-name="arrows-v" unicode="&#xf07d;" horiz-adv-x="640" 
-d="M640 1216c0 -35 -29 -64 -64 -64h-128v-1024h128c35 0 64 -29 64 -64c0 -17 -7 -33 -19 -45l-256 -256c-12 -12 -28 -19 -45 -19s-33 7 -45 19l-256 256c-12 12 -19 28 -19 45c0 35 29 64 64 64h128v1024h-128c-35 0 -64 29 -64 64c0 17 7 33 19 45l256 256
-c12 12 28 19 45 19s33 -7 45 -19l256 -256c12 -12 19 -28 19 -45z" />
-    <glyph glyph-name="phone-square" unicode="&#xf098;" 
-d="M1280 343c0 5 0 11 -2 16c-6 18 -152 92 -180 108c-19 11 -42 33 -65 33c-44 0 -109 -131 -148 -131c-20 0 -45 18 -63 28c-132 74 -223 165 -297 297c-10 18 -28 43 -28 63c0 39 131 104 131 148c0 23 -22 46 -33 65c-16 28 -90 174 -108 180c-5 2 -11 2 -16 2
-c-26 0 -77 -12 -101 -22c-66 -30 -114 -156 -114 -225c0 -67 27 -128 50 -190c80 -219 318 -457 537 -537c62 -23 123 -50 190 -50c69 0 195 48 225 114c10 24 22 75 22 101zM1536 1120v-960c0 -159 -129 -288 -288 -288h-960c-159 0 -288 129 -288 288v960
-c0 159 129 288 288 288h960c159 0 288 -129 288 -288z" />
-    <glyph glyph-name="text-height" unicode="&#xf034;" horiz-adv-x="1789" 
-d="M1744 128c44 0 58 -28 31 -63l-126 -162c-27 -35 -71 -35 -98 0l-126 162c-27 35 -13 63 31 63h80v1024h-80c-44 0 -58 28 -31 63l126 162c27 35 71 35 98 0l126 -162c27 -35 13 -63 -31 -63h-80v-1024h80zM81 1407l54 -27c7 -3 190 -5 211 -5c88 0 176 4 264 4
-c72 0 143 -1 215 -1h293c40 0 63 -9 90 29l42 1c9 0 19 -1 28 -1c2 -112 2 -224 2 -336c0 -35 1 -74 -5 -109c-22 -8 -45 -15 -68 -18c-23 40 -39 84 -54 128c-7 20 -31 155 -33 157c-21 26 -44 21 -75 21c-91 0 -186 4 -276 -7c-5 -44 -9 -91 -8 -136c1 -281 4 -562 4 -843
-c0 -77 -12 -158 10 -232c76 -39 166 -45 244 -80c2 -16 5 -33 5 -50c0 -9 -1 -19 -3 -29l-34 -1c-142 -4 -282 18 -425 18c-101 0 -202 -18 -303 -18c-1 17 -3 35 -3 52v9c38 61 175 62 238 99c22 49 19 320 19 383c0 202 -6 404 -6 606v117c0 18 4 90 -8 104
-c-14 15 -145 12 -162 12c-37 0 -144 -17 -173 -38c-48 -33 -48 -233 -108 -237c-18 11 -43 27 -56 44v383z" />
-    <glyph glyph-name="linkedin-square" unicode="&#xf08c;" 
-d="M237 122h231v694h-231v-694zM483 1030c-1 68 -50 120 -129 120s-131 -52 -131 -120c0 -66 50 -120 128 -120h1c81 0 131 54 131 120zM1068 122h231v398c0 213 -114 312 -266 312c-124 0 -179 -69 -209 -117h2v101h-231s3 -65 0 -694h231v388c0 20 1 41 7 56
-c17 41 55 84 119 84c83 0 116 -63 116 -157v-371zM1536 1120v-960c0 -159 -129 -288 -288 -288h-960c-159 0 -288 129 -288 288v960c0 159 129 288 288 288h960c159 0 288 -129 288 -288z" />
-    <glyph glyph-name="delicious" unicode="&#xf1a5;" 
-d="M1472 160v480h-704v704h-480c-124 0 -224 -100 -224 -224v-480h704v-704h480c124 0 224 100 224 224zM1536 1120v-960c0 -159 -129 -288 -288 -288h-960c-159 0 -288 129 -288 288v960c0 159 129 288 288 288h960c159 0 288 -129 288 -288z" />
-    <glyph glyph-name="qrcode" unicode="&#xf029;" 
-d="M0 1408h768v-704h-128v576h-512v-512h640v-128h-768v768zM0 -128v640h640v-640h-576v128h448v384h-384v-512h-128zM896 768v640h640v-640h-576v128h448v384h-384v-512h-128zM256 1152h256v-256h-256v256zM1152 1152h128v-128h-128v128zM256 256h128v-128h-128v128z
-M768 512h128v-128h-128v128zM1152 384h128v-128h-128v128zM1152 128h128v-128h-128v128zM1024 640h384v-256h-128v128h-256v128zM1536 256v-384h-256v128h128v256h128zM1024 384v-256h-256v128h128v128h128zM768 0h384v-128h-384v128z" />
-    <glyph glyph-name="arrows-h" unicode="&#xf07e;" horiz-adv-x="1792" 
-d="M1792 640c0 -17 -7 -33 -19 -45l-256 -256c-12 -12 -28 -19 -45 -19c-35 0 -64 29 -64 64v128h-1024v-128c0 -35 -29 -64 -64 -64c-17 0 -33 7 -45 19l-256 256c-12 12 -19 28 -19 45s7 33 19 45l256 256c12 12 28 19 45 19c35 0 64 -29 64 -64v-128h1024v128
-c0 35 29 64 64 64c17 0 33 -7 45 -19l256 -256c12 -12 19 -28 19 -45z" />
-    <glyph glyph-name="mercury" unicode="&#xf223;" horiz-adv-x="1152" 
-d="M830 1220c190 -94 322 -290 322 -516c0 -296 -224 -540 -512 -572v-132h96c18 0 32 -14 32 -32v-64c0 -18 -14 -32 -32 -32h-96v-96c0 -18 -14 -32 -32 -32h-64c-18 0 -32 14 -32 32v96h-96c-18 0 -32 14 -32 32v64c0 18 14 32 32 32h96v132c-288 32 -512 276 -512 572
-c0 226 132 422 322 516c-105 61 -187 157 -228 273c-8 21 8 43 30 43h69c13 0 24 -8 29 -20c58 -139 195 -236 354 -236s296 97 354 236c5 12 16 20 37 20h61c22 0 38 -22 30 -43c-41 -116 -123 -212 -228 -273zM576 256c247 0 448 201 448 448s-201 448 -448 448
-s-448 -201 -448 -448s201 -448 448 -448z" />
-    <glyph glyph-name="text-width" unicode="&#xf035;" 
-d="M81 1407l54 -27c7 -3 190 -5 211 -5c88 0 176 4 264 4c265 0 533 6 798 -3c22 -1 43 13 56 31l42 1c9 0 19 -1 28 -1c2 -112 2 -224 2 -336c0 -36 1 -74 -5 -109c-22 -8 -45 -15 -68 -18c-23 40 -39 84 -54 128c-7 20 -32 155 -33 157c-7 9 -16 15 -27 19
-c-8 3 -56 2 -66 2c-123 0 -265 7 -386 -7c-5 -44 -9 -91 -8 -136l1 -152v52c1 -163 3 -325 3 -487c0 -77 -12 -158 10 -232c76 -39 166 -45 244 -80c2 -16 5 -33 5 -50c0 -9 -1 -19 -3 -29l-34 -1c-142 -4 -282 18 -425 18c-101 0 -202 -18 -303 -18c-1 17 -3 35 -3 52v9
-c38 61 175 62 238 99c25 56 18 529 18 617c0 14 -5 29 -5 44c0 41 7 276 -8 293c-14 15 -145 12 -162 12c-42 0 -277 -22 -301 -38c-47 -31 -48 -232 -108 -237c-18 11 -43 27 -56 44v383zM1310 125c35 0 168 -119 195 -140c15 -12 26 -29 26 -49s-11 -37 -26 -49
-c-27 -21 -160 -140 -195 -140c-46 0 -30 107 -30 125h-1024c0 -18 16 -125 -30 -125c-35 0 -168 119 -195 140c-15 12 -26 29 -26 49s11 37 26 49c27 21 160 140 195 140c46 0 30 -107 30 -125h1024c0 18 -16 125 30 125z" />
-    <glyph glyph-name="envelope-o" unicode="&#xf003;" horiz-adv-x="1792" 
-d="M1664 32v768c-21 -24 -44 -46 -69 -66c-143 -110 -287 -222 -426 -338c-75 -63 -168 -140 -272 -140h-2c-104 0 -197 77 -272 140c-139 116 -283 228 -426 338c-25 20 -48 42 -69 66v-768c0 -17 15 -32 32 -32h1472c17 0 32 15 32 32zM1664 1083c0 25 6 69 -32 69h-1472
-c-17 0 -32 -15 -32 -32c0 -114 57 -213 147 -284c134 -105 268 -211 401 -317c53 -43 149 -135 219 -135h2c70 0 166 92 219 135c133 106 267 212 401 317c65 51 147 162 147 247zM1792 1120v-1088c0 -88 -72 -160 -160 -160h-1472c-88 0 -160 72 -160 160v1088
-c0 88 72 160 160 160h1472c88 0 160 -72 160 -160z" />
-    <glyph glyph-name="rss-square" unicode="&#xf143;" 
-d="M512 256c0 71 -57 128 -128 128s-128 -57 -128 -128s57 -128 128 -128s128 57 128 128zM863 162c-17 310 -263 556 -573 573c-9 1 -18 -3 -24 -9s-10 -14 -10 -23v-128c0 -17 13 -31 30 -32c205 -15 370 -180 385 -385c1 -17 15 -30 32 -30h128c9 0 17 4 23 10
-s10 15 9 24zM1247 161c-17 520 -438 941 -958 958c-10 1 -17 -2 -23 -9c-6 -6 -10 -14 -10 -23v-128c0 -17 14 -31 31 -32c415 -15 753 -353 768 -768c1 -17 15 -31 32 -31h128c9 0 17 4 23 10c7 6 10 14 9 23zM1536 1120v-960c0 -159 -129 -288 -288 -288h-960
-c-159 0 -288 129 -288 288v960c0 159 129 288 288 288h960c159 0 288 -129 288 -288z" />
-    <glyph glyph-name="bookmark" unicode="&#xf02e;" horiz-adv-x="1280" 
-d="M1164 1408c15 0 30 -3 44 -9c44 -17 72 -58 72 -103v-1289c0 -45 -28 -86 -72 -103c-14 -6 -29 -8 -44 -8c-31 0 -60 11 -83 32l-441 424l-441 -424c-23 -21 -52 -33 -83 -33c-15 0 -30 3 -44 9c-44 17 -72 58 -72 103v1289c0 45 28 86 72 103c14 6 29 9 44 9h1048z" />
-    <glyph glyph-name="behance" unicode="&#xf1b4;" horiz-adv-x="2048" 
-d="M1848 1197v-124h-511v124h511zM1596 771c-120 0 -200 -75 -208 -195h408c-11 121 -74 195 -200 195zM1612 186c76 0 174 41 198 119h221c-68 -209 -209 -307 -427 -307c-288 0 -467 195 -467 479c0 274 189 483 467 483c286 0 444 -225 444 -495c0 -16 -1 -32 -2 -47
-h-658c0 -146 77 -232 224 -232zM277 236h296c113 0 205 40 205 167c0 129 -77 180 -199 180h-302v-347zM277 773h281c99 0 169 43 169 150c0 116 -90 144 -190 144h-260v-294zM0 1282h594c216 0 403 -61 403 -312c0 -127 -59 -209 -172 -263c155 -44 230 -161 230 -319
-c0 -256 -215 -366 -444 -366h-611v1260z" />
-    <glyph glyph-name="wpbeginner" unicode="&#xf297;" horiz-adv-x="1792" 
-d="M384 704h160v224h-160v-224zM1221 372v92c-86 -30 -157 -37 -243 -38c-193 -1 -364 79 -480 169l1 -96c109 -99 276 -177 484 -176c87 0 169 18 238 49zM640 704h640v224h-640v-224zM1792 736c0 -127 -36 -247 -99 -352c56 -64 89 -143 89 -229
-c0 -209 -198 -379 -443 -379c-166 0 -310 78 -386 193c-19 -1 -38 -1 -57 -1s-38 0 -57 1c-76 -115 -220 -193 -386 -193c-245 0 -443 170 -443 379c0 86 33 165 89 229c-63 105 -99 225 -99 352c0 424 401 768 896 768s896 -344 896 -768z" />
-    <glyph glyph-name="star-half-o" 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 -500c7 -44 -9 -70 -40 -70c-11 0 -25 4 -40 12l-449 236l-449 -236c-15 -8 -29 -12 -40 -12c-31 0 -47 26 -40 70l86 500l-364 354c-43 43 -29 85 31 94
-l502 73l225 455c13 27 31 41 49 41s35 -14 49 -41l225 -455l502 -73c60 -9 74 -51 30 -94z" />
-    <glyph glyph-name="keyboard-o" unicode="&#xf11c;" horiz-adv-x="1920" 
-d="M384 368v-96c0 -9 -7 -16 -16 -16h-96c-9 0 -16 7 -16 16v96c0 9 7 16 16 16h96c9 0 16 -7 16 -16zM512 624v-96c0 -9 -7 -16 -16 -16h-224c-9 0 -16 7 -16 16v96c0 9 7 16 16 16h224c9 0 16 -7 16 -16zM384 880v-96c0 -9 -7 -16 -16 -16h-96c-9 0 -16 7 -16 16v96
-c0 9 7 16 16 16h96c9 0 16 -7 16 -16zM1408 368v-96c0 -9 -7 -16 -16 -16h-864c-9 0 -16 7 -16 16v96c0 9 7 16 16 16h864c9 0 16 -7 16 -16zM768 624v-96c0 -9 -7 -16 -16 -16h-96c-9 0 -16 7 -16 16v96c0 9 7 16 16 16h96c9 0 16 -7 16 -16zM640 880v-96
-c0 -9 -7 -16 -16 -16h-96c-9 0 -16 7 -16 16v96c0 9 7 16 16 16h96c9 0 16 -7 16 -16zM1024 624v-96c0 -9 -7 -16 -16 -16h-96c-9 0 -16 7 -16 16v96c0 9 7 16 16 16h96c9 0 16 -7 16 -16zM896 880v-96c0 -9 -7 -16 -16 -16h-96c-9 0 -16 7 -16 16v96c0 9 7 16 16 16h96
-c9 0 16 -7 16 -16zM1280 624v-96c0 -9 -7 -16 -16 -16h-96c-9 0 -16 7 -16 16v96c0 9 7 16 16 16h96c9 0 16 -7 16 -16zM1664 368v-96c0 -9 -7 -16 -16 -16h-96c-9 0 -16 7 -16 16v96c0 9 7 16 16 16h96c9 0 16 -7 16 -16zM1152 880v-96c0 -9 -7 -16 -16 -16h-96
-c-9 0 -16 7 -16 16v96c0 9 7 16 16 16h96c9 0 16 -7 16 -16zM1408 880v-96c0 -9 -7 -16 -16 -16h-96c-9 0 -16 7 -16 16v96c0 9 7 16 16 16h96c9 0 16 -7 16 -16zM1664 880v-352c0 -9 -7 -16 -16 -16h-224c-9 0 -16 7 -16 16v96c0 9 7 16 16 16h112v240c0 9 7 16 16 16h96
-c9 0 16 -7 16 -16zM1792 128v896h-1664v-896h1664zM1920 1024v-896c0 -71 -57 -128 -128 -128h-1664c-71 0 -128 57 -128 128v896c0 71 57 128 128 128h1664c71 0 128 -57 128 -128z" />
-    <glyph glyph-name="minus-circle" unicode="&#xf056;" 
-d="M1216 576v128c0 35 -29 64 -64 64h-768c-35 0 -64 -29 -64 -64v-128c0 -35 29 -64 64 -64h768c35 0 64 29 64 64zM1536 640c0 -424 -344 -768 -768 -768s-768 344 -768 768s344 768 768 768s768 -344 768 -768z" />
-    <glyph glyph-name="hand-o-down" unicode="&#xf0a7;" 
-d="M1408 576c0 199 -128 369 -128 544v32h-640v-32c0 -106 -90 -177 -163 -241c-46 -41 -92 -79 -145 -112c-22 -14 -45 -26 -68 -38s-136 -62 -136 -89c0 -85 32 -160 128 -160c128 0 193 96 256 96v-576c0 -67 60 -128 128 -128c69 0 128 59 128 128v331
-c26 -20 70 -35 103 -35c47 0 87 19 119 53c21 -12 45 -18 69 -18c46 0 103 23 126 65c18 -3 37 -4 56 -4c118 0 167 73 167 184zM1280 1344c0 35 -29 64 -64 64s-64 -29 -64 -64s29 -64 64 -64s64 29 64 64zM1536 580c0 -184 -104 -318 -295 -317l-5 1
-c-50 -40 -114 -61 -178 -61c-14 0 -29 1 -43 3c-34 -19 -80 -33 -119 -37v-169c0 -140 -117 -256 -257 -256c-138 0 -255 118 -255 256v374c-39 -16 -86 -22 -128 -22c-168 0 -256 129 -256 288c0 134 171 177 264 235c47 30 88 64 129 100c33 29 119 97 119 145v288
-c0 71 57 128 128 128h640c71 0 128 -57 128 -128v-288c0 -63 37 -162 59 -223c37 -102 69 -207 69 -317z" />
-    <glyph glyph-name="sort-numeric-asc" unicode="&#xf162;" horiz-adv-x="1454" 
-d="M1314 223c0 82 -67 169 -147 169c-70 0 -114 -57 -114 -131c0 -72 46 -133 141 -133c65 0 120 39 120 95zM704 96c0 -9 -4 -17 -10 -24l-319 -319c-7 -6 -15 -9 -23 -9s-16 3 -23 9l-320 320c-9 10 -12 23 -7 35s17 20 30 20h192v1376c0 18 14 32 32 32h192
-c18 0 32 -14 32 -32v-1376h192c18 0 32 -14 32 -32zM1454 165c0 -202 -110 -421 -348 -421c-45 0 -82 7 -108 16c-16 5 -30 10 -42 15l39 113c9 -4 20 -8 31 -11c20 -7 46 -13 75 -13c120 0 182 100 201 204h-2c-28 -30 -87 -51 -146 -51c-145 0 -240 114 -240 244
-c0 138 106 251 253 251c159 0 287 -130 287 -347zM1424 882v-114h-469v114h167v432c0 13 1 26 1 36v16h-2l-7 -12c-5 -8 -13 -18 -26 -31l-62 -58l-82 86l192 185h123v-654h165z" />
-    <glyph glyph-name="share-alt" unicode="&#xf1e0;" 
-d="M1216 512c177 0 320 -143 320 -320s-143 -320 -320 -320s-320 143 -320 320c0 11 1 23 2 34l-360 180c-57 -53 -134 -86 -218 -86c-177 0 -320 143 -320 320s143 320 320 320c84 0 161 -33 218 -86l360 180c-1 11 -2 23 -2 34c0 177 143 320 320 320s320 -143 320 -320
-s-143 -320 -320 -320c-84 0 -161 33 -218 86l-360 -180c1 -11 2 -23 2 -34s-1 -23 -2 -34l360 -180c57 53 134 86 218 86z" />
-    <glyph glyph-name="shirtsinbulk" 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 265c-172 0 -313 140 -313 313c0 172 141 313 313 313c173 0 313 -141 313 -313c0 -173 -140 -313 -313 -313zM595 646c0 -152 266 -41 266 -130c0 -45 -82 -49 -112 -49c-42 0 -102 9 -123 51h-3l-31 -63
-c51 -32 100 -42 162 -42c67 0 175 20 175 107c0 165 -269 56 -269 130c0 45 71 51 102 51c37 0 100 -11 122 -45h3l30 58c-52 21 -94 41 -152 41c-69 0 -170 -22 -170 -109z" />
-    <glyph glyph-name="viacoin" 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="dogmazic" unicode="&#xf303;" 
-d="M768 1404c423 0 768 -343 768 -766s-345 -766 -768 -766s-768 343 -768 766s345 766 768 766zM768 1302c-368 0 -666 -297 -666 -664s298 -664 666 -664s666 297 666 664s-298 664 -666 664zM768 1223c668 3 845 -918 212 -1148c-52 -19 -148 -29 -165 -17
-c-9 6 6 111 30 214c20 88 28 84 -78 37c-49 -22 -92 -40 -96 -41c-5 -1 -23 23 -60 78c-32 48 -54 78 -55 74s-21 -73 -44 -154c-50 -177 -38 -165 -111 -110c-452 340 -218 1052 351 1067h16zM803 1137c-251 0 -505 -261 -415 -458c14 -31 19 -30 9 1
-c-66 214 206 464 458 420c281 -49 436 -423 255 -613c-49 -51 -21 -53 31 -2c184 181 17 586 -267 645c-23 5 -47 7 -71 7zM435 998c-2 0 -6 0 -10 -1c-132 -18 -189 -193 -96 -296c27 -30 30 -29 22 5c-18 75 7 167 69 258c19 28 24 34 15 34zM805 958
-c-12 0 -35 -27 -35 -44c0 -20 -7 -22 -25 -6c-42 37 -123 53 -167 34c-14 -6 -14 -5 6 -8c61 -8 101 -75 69 -117c-27 -36 -40 -72 -44 -123c-4 -61 -30 -81 -51 -39c-27 54 10 135 62 135c11 0 0 8 -15 11c-89 17 -142 -140 -56 -167c14 -4 6 -11 -14 -11
-c-24 0 -48 11 -69 31c-23 22 -10 -6 24 -53c12 -16 57 -84 101 -150c94 -139 89 -132 95 -129c3 1 61 28 131 60s144 64 166 72c40 15 83 37 79 41c-1 1 -6 0 -11 -3c-24 -13 -80 -2 -98 18c-9 10 -9 9 15 9c97 0 121 145 28 173c-16 5 -18 7 -20 26c-1 11 -4 26 -5 33
-c-5 33 78 59 121 37c19 -10 15 0 -9 21c-37 33 -64 43 -119 43c-70 0 -77 6 -56 49c9 19 10 23 4 24c-10 2 -23 -11 -30 -29c-5 -15 -13 -20 -19 -11c-2 3 1 12 6 20c11 17 12 30 3 30c-8 0 -17 -11 -27 -30c-4 -8 -10 -15 -12 -15c-6 0 -4 18 3 31c4 6 6 16 6 20
-c0 16 -22 -2 -32 -25c-5 -12 -13 -22 -16 -22c-9 0 -7 12 6 37c6 13 10 24 9 25s-2 2 -4 2zM1242 756c-5 0 -5 -16 -5 -59c0 -100 -23 -174 -72 -226c-26 -27 -19 -29 32 -6c106 48 136 192 58 280c-6 7 -10 11 -13 11zM982 689c3 0 6 -3 10 -8c39 -45 25 -117 -28 -144
-c-24 -12 -28 -11 -37 8c-8 16 -8 16 3 28c16 17 34 55 40 86c4 21 8 30 12 30zM680 537c10 0 20 -8 21 -22c2 -25 -16 -39 -36 -27v0c-11 6 -11 32 1 43c4 4 9 6 14 6zM778 509c10 0 19 -11 19 -28c0 -22 -23 -33 -38 -18c-10 10 -9 27 2 38c6 6 12 8 17 8z" />
-    <glyph glyph-name="digg" unicode="&#xf1a6;" horiz-adv-x="2048" 
-d="M328 1254h204v-983h-532v697h328v286zM328 435v369h-123v-369h123zM614 968h205v-697h-205v697zM614 1254h205v-204h-205v204zM901 968h533v-942h-533v163h328v82h-328v697zM1229 435v369h-123v-369h123zM1516 968h532v-942h-532v163h327v82h-327v697zM1843 435v369h-123
-v-369h123z" />
-    <glyph glyph-name="rss" unicode="&#xf09e;" horiz-adv-x="1408" 
-d="M384 192c0 -106 -86 -192 -192 -192s-192 86 -192 192s86 192 192 192s192 -86 192 -192zM896 69c1 -18 -5 -35 -17 -48c-12 -14 -29 -21 -47 -21h-135c-33 0 -60 25 -63 58c-29 305 -271 547 -576 576c-33 3 -58 30 -58 63v135c0 18 7 35 21 47c11 11 27 17 43 17h5
-c213 -17 414 -110 565 -262c152 -151 245 -352 262 -565zM1408 67c1 -17 -5 -34 -18 -47c-12 -13 -28 -20 -46 -20h-143c-34 0 -62 26 -64 60c-33 581 -496 1044 -1077 1078c-34 2 -60 30 -60 63v143c0 18 7 34 20 46c12 12 28 18 44 18h3c350 -18 679 -165 927 -414
-c249 -248 396 -577 414 -927z" />
-    <glyph glyph-name="television" unicode="&#xf26c;" horiz-adv-x="1920" 
-d="M1792 288v960c0 17 -15 32 -32 32h-1600c-17 0 -32 -15 -32 -32v-960c0 -17 15 -32 32 -32h1600c17 0 32 15 32 32zM1920 1248v-960c0 -88 -72 -160 -160 -160h-736v-128h352c18 0 32 -14 32 -32v-64c0 -18 -14 -32 -32 -32h-832c-18 0 -32 14 -32 32v64
-c0 18 14 32 32 32h352v128h-736c-88 0 -160 72 -160 160v960c0 88 72 160 160 160h1600c88 0 160 -72 160 -160z" />
-    <glyph glyph-name="ffmpeg" unicode="&#xf30f;" 
-d="M1158 323v179l-530 -527l-628 53l1010 1100l-167 -10l-730 -810v688l69 83l-169 -10v185l591 50l-325 -379v-161l483 553l774 66l-1134 -1194l149 -8l824 849v-806l-92 -87l234 -14v-223l-731 62z" />
-    <glyph glyph-name="folder-o" unicode="&#xf114;" horiz-adv-x="1664" 
-d="M1536 224v704c0 53 -43 96 -96 96h-704c-53 0 -96 43 -96 96v64c0 53 -43 96 -96 96h-320c-53 0 -96 -43 -96 -96v-960c0 -53 43 -96 96 -96h1216c53 0 96 43 96 96zM1664 928v-704c0 -123 -101 -224 -224 -224h-1216c-123 0 -224 101 -224 224v960
-c0 123 101 224 224 224h320c123 0 224 -101 224 -224v-32h672c123 0 224 -101 224 -224z" />
-    <glyph glyph-name="bed" unicode="&#xf236;" horiz-adv-x="2048" 
-d="M256 512h1728c35 0 64 -29 64 -64v-448h-256v256h-1536v-256h-256v1216c0 35 29 64 64 64h128c35 0 64 -29 64 -64v-704zM832 832c0 -141 -115 -256 -256 -256s-256 115 -256 256s115 256 256 256s256 -115 256 -256zM2048 576h-1152v384c0 35 29 64 64 64h704
-c212 0 384 -172 384 -384v-64z" />
-    <glyph glyph-name="caret-square-o-down" unicode="&#xf150;" 
-d="M1145 861c11 -21 9 -47 -5 -66l-320 -448c-12 -17 -31 -27 -52 -27s-40 10 -52 27l-320 448c-14 19 -16 45 -5 66c11 22 33 35 57 35h640c24 0 46 -13 57 -35zM1280 160v960c0 17 -15 32 -32 32h-960c-17 0 -32 -15 -32 -32v-960c0 -17 15 -32 32 -32h960
-c17 0 32 15 32 32zM1536 1120v-960c0 -159 -129 -288 -288 -288h-960c-159 0 -288 129 -288 288v960c0 159 129 288 288 288h960c159 0 288 -129 288 -288z" />
-    <glyph glyph-name="shower" unicode="&#xf2cc;" horiz-adv-x="1920" 
-d="M1433 1287c13 -13 13 -33 0 -46l-626 -626c-13 -13 -33 -13 -46 0l-82 82c-13 13 -13 33 0 46l44 44c-97 122 -109 289 -35 422c-46 44 -108 71 -176 71c-141 0 -256 -115 -256 -256v-1280h-256v1280c0 282 230 512 512 512c144 0 274 -60 367 -156
-c126 51 272 32 382 -55l44 44c13 13 33 13 46 0zM1344 1024c35 0 64 -29 64 -64s-29 -64 -64 -64s-64 29 -64 64s29 64 64 64zM1600 896c-35 0 -64 29 -64 64s29 64 64 64s64 -29 64 -64s-29 -64 -64 -64zM1856 1024c35 0 64 -29 64 -64s-29 -64 -64 -64s-64 29 -64 64
-s29 64 64 64zM1216 896c35 0 64 -29 64 -64s-29 -64 -64 -64s-64 29 -64 64s29 64 64 64zM1408 832c0 35 29 64 64 64s64 -29 64 -64s-29 -64 -64 -64s-64 29 -64 64zM1728 896c35 0 64 -29 64 -64s-29 -64 -64 -64s-64 29 -64 64s29 64 64 64zM1088 768c35 0 64 -29 64 -64
-s-29 -64 -64 -64s-64 29 -64 64s29 64 64 64zM1344 640c-35 0 -64 29 -64 64s29 64 64 64s64 -29 64 -64s-29 -64 -64 -64zM1600 768c35 0 64 -29 64 -64s-29 -64 -64 -64s-64 29 -64 64s29 64 64 64zM1216 512c-35 0 -64 29 -64 64s29 64 64 64s64 -29 64 -64
-s-29 -64 -64 -64zM1472 640c35 0 64 -29 64 -64s-29 -64 -64 -64s-64 29 -64 64s29 64 64 64zM1088 512c35 0 64 -29 64 -64s-29 -64 -64 -64s-64 29 -64 64s29 64 64 64zM1344 512c35 0 64 -29 64 -64s-29 -64 -64 -64s-64 29 -64 64s29 64 64 64zM1216 384
-c35 0 64 -29 64 -64s-29 -64 -64 -64s-64 29 -64 64s29 64 64 64zM1088 256c35 0 64 -29 64 -64s-29 -64 -64 -64s-64 29 -64 64s29 64 64 64z" />
-    <glyph glyph-name="paper-plane-o" unicode="&#xf1d9;" horiz-adv-x="1792" 
-d="M1764 1525c21 -15 31 -39 27 -64l-256 -1536c-3 -19 -15 -35 -32 -45c-9 -5 -20 -8 -31 -8c-8 0 -16 2 -24 5l-527 215l-298 -327c-12 -14 -29 -21 -47 -21c-8 0 -16 1 -23 4c-25 10 -41 34 -41 60v452l-472 193c-23 9 -38 30 -40 55c-2 24 11 47 32 59l1664 960
-c21 13 48 12 68 -2zM1422 26l221 1323l-1434 -827l336 -137l863 639l-478 -797z" />
-    <glyph glyph-name="circle-o-notch" unicode="&#xf1ce;" horiz-adv-x="1728" 
-d="M1728 640c0 -477 -387 -864 -864 -864s-864 387 -864 864c0 434 320 793 736 855v-228c-292 -59 -512 -318 -512 -627c0 -353 287 -640 640 -640s640 287 640 640c0 309 -220 568 -512 627v228c416 -62 736 -421 736 -855z" />
-    <glyph glyph-name="gnupg" unicode="&#xf30d;" horiz-adv-x="1156" 
-d="M0 667h81v244c0 274 223 497 497 497s497 -223 497 -497v-242c-1 -1 -3 -1 -4 -2v0l-1 -1v0v0v0h-1v-1v0v0v0h-1v0v0v-1v0h-1v0v0v0l-1 -1v0v0h-1v0l-1 -1v0v0v0v0l-1 -1v0v0v0h-1v0v0v0l-1 -1v0v0v0v0v0h-1v0v-1v0v0v0v0h-1v0v0v0l-2 -1v0v0l-1 -1v0h-1v0v-1v0v0v0h-1v0
-v0v0v0h-1v-1h-1l-1 -1h-1v-1l-2 -1h-1l-1 -1v0l-3 -1l-1 -1l-1 -1h-1l-1 -1l-1 -1h-1l-4 -2v0l-1 -1h-1v-1h-2l-3 -2l-1 -1c-1 -1 -3 -1 -4 -2h-1v0l-2 -2h-1h-1l-1 -1v0l-2 -1v0l-2 -1h-1l-1 -1c-1 -1 -3 -1 -4 -2l-1 -1c-2 -1 -3 -1 -5 -2v0l-4 -2l-2 -1
-c-2 -1 -3 -2 -5 -3v0c-99 -47 -257 -97 -557 -119c-215 -15 -346 -110 -431 -224v390v0zM310 667h536v244c0 148 -120 268 -268 268s-268 -120 -268 -268v-244zM1004 628c-1 -1 -4 -1 -5 -2zM803 1288c-64 38 -138 60 -218 60c-218 0 -398 -164 -422 -376
-c64 200 251 345 472 345c59 0 116 -10 168 -29v0zM1156 573v-701h-989c109 61 190 54 325 50c183 -6 385 71 485 173s-9 24 -122 -5s-330 -31 -476 7c459 -6 637 142 739 275s-44 24 -138 -22s-258 -79 -439 -55c273 1 482 137 615 278v0z" />
-    <glyph glyph-name="medkit" unicode="&#xf0fa;" horiz-adv-x="1792" 
-d="M1280 416v192c0 18 -14 32 -32 32h-224v224c0 18 -14 32 -32 32h-192c-18 0 -32 -14 -32 -32v-224h-224c-18 0 -32 -14 -32 -32v-192c0 -18 14 -32 32 -32h224v-224c0 -18 14 -32 32 -32h192c18 0 32 14 32 32v224h224c18 0 32 14 32 32zM640 1152h512v128h-512v-128z
-M256 1152v-1280h-32c-123 0 -224 101 -224 224v832c0 123 101 224 224 224h32zM1440 1152v-1280h-1088v1280h160v160c0 53 43 96 96 96h576c53 0 96 -43 96 -96v-160h160zM1792 928v-832c0 -123 -101 -224 -224 -224h-32v1280h32c123 0 224 -101 224 -224z" />
-    <glyph glyph-name="toggle-off" unicode="&#xf204;" horiz-adv-x="2048" 
-d="M1152 640c0 282 -230 512 -512 512s-512 -230 -512 -512s230 -512 512 -512s512 230 512 512zM1920 640c0 282 -230 512 -512 512h-386c156 -117 258 -303 258 -512s-102 -395 -258 -512h386c282 0 512 230 512 512zM2048 640c0 -353 -287 -640 -640 -640h-768
-c-353 0 -640 287 -640 640s287 640 640 640h768c353 0 640 -287 640 -640z" />
-    <glyph glyph-name="calendar-minus-o" unicode="&#xf272;" horiz-adv-x="1664" 
-d="M1152 416v-64c0 -18 -14 -32 -32 -32h-576c-18 0 -32 14 -32 32v64c0 18 14 32 32 32h576c18 0 32 -14 32 -32zM128 -128h1408v1024h-1408v-1024zM512 1088v288c0 18 -14 32 -32 32h-64c-18 0 -32 -14 -32 -32v-288c0 -18 14 -32 32 -32h64c18 0 32 14 32 32zM1280 1088
-v288c0 18 -14 32 -32 32h-64c-18 0 -32 -14 -32 -32v-288c0 -18 14 -32 32 -32h64c18 0 32 14 32 32zM1664 1152v-1280c0 -70 -58 -128 -128 -128h-1408c-70 0 -128 58 -128 128v1280c0 70 58 128 128 128h128v96c0 88 72 160 160 160h64c88 0 160 -72 160 -160v-96h384v96
-c0 88 72 160 160 160h64c88 0 160 -72 160 -160v-96h128c70 0 128 -58 128 -128z" />
-    <glyph glyph-name="id-badge" unicode="&#xf2c1;" horiz-adv-x="1280" 
-d="M1024 278c0 -86 -57 -150 -128 -150h-512c-71 0 -128 64 -128 150c0 156 39 329 196 329c49 -46 115 -75 188 -75s139 29 188 75c157 0 196 -173 196 -329zM870 797c0 -126 -103 -227 -230 -227s-230 101 -230 227c0 125 103 227 230 227s230 -102 230 -227zM1152 -96
-v1376h-1024v-1376c0 -17 15 -32 32 -32h960c17 0 32 15 32 32zM1280 1376v-1472c0 -88 -72 -160 -160 -160h-960c-88 0 -160 72 -160 160v1472c0 88 72 160 160 160h352v-96c0 -18 14 -32 32 -32h192c18 0 32 14 32 32v96h352c88 0 160 -72 160 -160z" />
-    <glyph glyph-name="tencent-weibo" unicode="&#xf1d5;" horiz-adv-x="1166" 
-d="M785 964c0 -106 -87 -193 -193 -193c-41 0 -79 13 -111 35c-36 -39 -76 -88 -115 -146c-163 -245 -232 -534 -202 -859c2 -29 -19 -54 -47 -57h-5c-26 0 -49 20 -52 47c-39 438 100 748 223 931c45 67 90 121 132 165c-11 24 -16 50 -16 77c0 107 86 193 193 193
-c106 0 193 -86 193 -193zM1166 953c0 -321 -261 -582 -583 -582c-44 0 -88 5 -131 14c-28 7 -45 35 -39 63c7 27 34 45 62 39c35 -9 72 -13 108 -13c264 0 479 215 479 479s-215 479 -479 479s-479 -215 -479 -479c0 -77 18 -150 52 -218c13 -26 3 -57 -22 -70
-c-26 -13 -57 -3 -70 23c-42 81 -64 173 -64 265c0 322 262 583 583 583c322 0 583 -261 583 -583z" />
-    <glyph glyph-name="file-archive-o" unicode="&#xf1c6;" 
-d="M640 1152h-128v128h128v-128zM768 1024h-128v128h128v-128zM640 896h-128v128h128v-128zM768 768h-128v128h128v-128zM1468 1156c37 -37 68 -111 68 -164v-1152c0 -53 -43 -96 -96 -96h-1344c-53 0 -96 43 -96 96v1600c0 53 43 96 96 96h896c53 0 127 -31 164 -68z
-M1024 1400v-376h376c-6 17 -15 34 -22 41l-313 313c-7 7 -24 16 -41 22zM1408 -128v1024h-416c-53 0 -96 43 -96 96v416h-128v-128h-128v128h-512v-1536h1280zM781 593c85 -287 107 -349 107 -349c5 -17 8 -34 8 -52c0 -111 -108 -192 -256 -192s-256 81 -256 192
-c0 18 3 35 8 52c0 0 21 62 120 396v128h128v-128h79c29 0 54 -19 62 -47zM640 128c71 0 128 29 128 64s-57 64 -128 64s-128 -29 -128 -64s57 -64 128 -64z" />
-    <glyph glyph-name="yoast" unicode="&#xf2b1;" horiz-adv-x="1664" 
-d="M339 1318h691l-26 -72h-665c-147 0 -267 -121 -267 -268v-771c0 -126 90 -237 214 -263c32 -7 65 -5 98 -5v-72h-45c-187 0 -339 153 -339 340v771c0 187 152 340 339 340zM1190 1536h247l-482 -1294c-90 -240 -199 -490 -495 -498v195c111 18 182 79 220 182
-c13 34 20 69 20 105s-7 72 -20 106l-285 733h228l187 -585zM1664 978v-1111h-795c16 24 33 47 45 73h678v1038c0 114 -72 216 -179 254l25 67c136 -46 226 -178 226 -321z" />
-    <glyph glyph-name="share-alt-square" unicode="&#xf1e1;" 
-d="M1280 341c0 118 -96 214 -213 214c-56 0 -107 -22 -145 -58l-241 120c1 8 2 15 2 23s-1 15 -2 23l241 120c38 -36 89 -58 145 -58c117 0 213 96 213 214c0 117 -96 213 -213 213c-118 0 -214 -96 -214 -213c0 -8 1 -15 2 -23l-241 -120c-38 35 -89 57 -145 57
-c-117 0 -213 -95 -213 -213s96 -213 213 -213c56 0 107 22 145 57l241 -120c-1 -8 -2 -15 -2 -23c0 -117 96 -213 214 -213c117 0 213 96 213 213zM1536 1120v-960c0 -159 -129 -288 -288 -288h-960c-159 0 -288 129 -288 288v960c0 159 129 288 288 288h960
-c159 0 288 -129 288 -288z" />
-    <glyph glyph-name="imdb" unicode="&#xf2d8;" 
-d="M922 739v-182c0 -36 7 -69 -38 -68v309c44 0 38 -23 38 -59zM1238 643v-121c0 -20 6 -53 -23 -53c-6 0 -11 3 -14 9c-8 19 -4 163 -4 165c0 14 -4 47 18 47c27 0 23 -27 23 -47zM180 407h122v472h-122v-472zM614 407h106v472h-159l-28 -221c-10 74 -20 148 -32 221h-158
-v-472h107v312l45 -312h76l43 319v-319zM1039 712c0 30 1 62 -5 90c-16 83 -116 77 -181 77h-91v-472c318 0 277 -22 277 305zM1356 515v133c0 64 -3 111 -82 111c-33 0 -55 -10 -77 -34v154h-117v-472h110l7 30c21 -25 44 -36 77 -36c73 0 82 56 82 114zM1536 1248v-1216
-c0 -88 -72 -160 -160 -160h-1216c-88 0 -160 72 -160 160v1216c0 88 72 160 160 160h1216c88 0 160 -72 160 -160z" />
-    <glyph glyph-name="snapchat-square" unicode="&#xf2ad;" 
-d="M1280 388c0 14 -8 24 -22 27c-91 19 -160 83 -198 167c-4 8 -7 16 -7 25c0 45 124 36 124 100c0 27 -33 44 -57 44c-22 0 -40 -16 -63 -16c-4 0 -8 1 -12 2c3 38 5 77 5 115c0 34 -2 82 -17 114c-48 104 -140 165 -255 165c-125 0 -220 -47 -275 -165
-c-15 -32 -18 -80 -18 -115c0 -38 3 -76 6 -114c-5 -1 -10 -2 -15 -2c-22 0 -41 16 -62 16c-25 0 -55 -17 -55 -45c0 -62 124 -54 124 -99c0 -9 -3 -17 -7 -25c-39 -84 -106 -147 -198 -167c-14 -3 -22 -13 -22 -27c0 -47 106 -64 138 -69c9 -24 5 -66 40 -66
-c26 0 51 10 77 10c106 0 134 -95 256 -95c127 0 151 95 258 95c26 0 52 -9 78 -9c34 0 31 42 39 65c32 5 138 22 138 69zM1536 1120v-960c0 -159 -129 -288 -288 -288h-960c-159 0 -288 129 -288 288v960c0 159 129 288 288 288h960c159 0 288 -129 288 -288z" />
-    <glyph glyph-name="spell-check" unicode="&#xf327;" horiz-adv-x="2049" 
-d="M2049 700c0 -25 -10 -50 -28 -68l-724 -724l-136 -136c-18 -18 -43 -28 -68 -28s-50 10 -68 28l-136 136l-362 362c-18 18 -28 43 -28 68s10 50 28 68l136 136c18 18 43 28 68 28s50 -10 68 -28l294 -295l656 657c18 18 43 28 68 28s50 -10 68 -28l136 -136
-c18 -18 28 -43 28 -68zM0 880v73h48l158 454h111l158 -454h49v-73h-199v73h52l-32 98h-167l-32 -98h52v-73h-198zM200 1127h122l-49 149c-2 8 -5 16 -6 23c-1 8 -3 15 -3 18l-1 5h-2c-1 -13 -5 -29 -10 -46zM569 880v73h63v381h-63v73h242c40 0 72 -5 95 -14
-c24 -9 44 -25 58 -47c15 -21 22 -46 22 -75c0 -25 -6 -47 -17 -67s-28 -35 -48 -46v-1c28 -8 50 -24 64 -47s22 -49 22 -78c0 -35 -10 -65 -30 -91s-45 -43 -75 -52c-21 -6 -47 -9 -79 -9h-254zM730 1192h92c20 0 37 6 48 18c11 13 17 30 17 51c0 29 -10 49 -30 60
-c-11 5 -27 8 -46 8h-81v-137zM730 958h98c15 0 27 2 37 6c13 5 25 15 32 28c7 14 11 29 11 46c0 23 -7 41 -21 55c-13 14 -32 22 -56 22h-101v-157zM1131 950c-52 53 -78 118 -78 196s26 142 78 193s116 77 193 77c18 0 39 -2 60 -5c22 -3 44 -9 67 -16s41 -18 56 -33
-s23 -32 23 -51v-72h-88v41c0 12 -7 23 -20 31s-29 14 -45 17s-32 5 -48 5c-51 0 -94 -17 -127 -51c-33 -33 -49 -77 -49 -132c0 -59 17 -106 51 -142s78 -54 130 -54c14 0 29 2 45 4s31 8 46 16s23 19 23 32v41h89v-72c0 -18 -7 -35 -22 -49c-14 -14 -33 -26 -56 -33
-c-22 -7 -45 -13 -67 -16c-22 -4 -44 -6 -64 -6c-79 0 -145 27 -197 79v0z" />
-    <glyph glyph-name="building-o" unicode="&#xf0f7;" horiz-adv-x="1408" 
-d="M384 224v-64c0 -17 -15 -32 -32 -32h-64c-17 0 -32 15 -32 32v64c0 17 15 32 32 32h64c17 0 32 -15 32 -32zM384 480v-64c0 -17 -15 -32 -32 -32h-64c-17 0 -32 15 -32 32v64c0 17 15 32 32 32h64c17 0 32 -15 32 -32zM640 480v-64c0 -17 -15 -32 -32 -32h-64
-c-17 0 -32 15 -32 32v64c0 17 15 32 32 32h64c17 0 32 -15 32 -32zM384 736v-64c0 -17 -15 -32 -32 -32h-64c-17 0 -32 15 -32 32v64c0 17 15 32 32 32h64c17 0 32 -15 32 -32zM1152 224v-64c0 -17 -15 -32 -32 -32h-64c-17 0 -32 15 -32 32v64c0 17 15 32 32 32h64
-c17 0 32 -15 32 -32zM896 480v-64c0 -17 -15 -32 -32 -32h-64c-17 0 -32 15 -32 32v64c0 17 15 32 32 32h64c17 0 32 -15 32 -32zM640 736v-64c0 -17 -15 -32 -32 -32h-64c-17 0 -32 15 -32 32v64c0 17 15 32 32 32h64c17 0 32 -15 32 -32zM384 992v-64
-c0 -17 -15 -32 -32 -32h-64c-17 0 -32 15 -32 32v64c0 17 15 32 32 32h64c17 0 32 -15 32 -32zM1152 480v-64c0 -17 -15 -32 -32 -32h-64c-17 0 -32 15 -32 32v64c0 17 15 32 32 32h64c17 0 32 -15 32 -32zM896 736v-64c0 -17 -15 -32 -32 -32h-64c-17 0 -32 15 -32 32v64
-c0 17 15 32 32 32h64c17 0 32 -15 32 -32zM640 992v-64c0 -17 -15 -32 -32 -32h-64c-17 0 -32 15 -32 32v64c0 17 15 32 32 32h64c17 0 32 -15 32 -32zM384 1248v-64c0 -17 -15 -32 -32 -32h-64c-17 0 -32 15 -32 32v64c0 17 15 32 32 32h64c17 0 32 -15 32 -32zM1152 736
-v-64c0 -17 -15 -32 -32 -32h-64c-17 0 -32 15 -32 32v64c0 17 15 32 32 32h64c17 0 32 -15 32 -32zM896 992v-64c0 -17 -15 -32 -32 -32h-64c-17 0 -32 15 -32 32v64c0 17 15 32 32 32h64c17 0 32 -15 32 -32zM640 1248v-64c0 -17 -15 -32 -32 -32h-64c-17 0 -32 15 -32 32
-v64c0 17 15 32 32 32h64c17 0 32 -15 32 -32zM1152 992v-64c0 -17 -15 -32 -32 -32h-64c-17 0 -32 15 -32 32v64c0 17 15 32 32 32h64c17 0 32 -15 32 -32zM896 1248v-64c0 -17 -15 -32 -32 -32h-64c-17 0 -32 15 -32 32v64c0 17 15 32 32 32h64c17 0 32 -15 32 -32z
-M1152 1248v-64c0 -17 -15 -32 -32 -32h-64c-17 0 -32 15 -32 32v64c0 17 15 32 32 32h64c17 0 32 -15 32 -32zM896 -128h384v1536h-1152v-1536h384v224c0 17 15 32 32 32h320c17 0 32 -15 32 -32v-224zM1408 1472v-1664c0 -35 -29 -64 -64 -64h-1280c-35 0 -64 29 -64 64
-v1664c0 35 29 64 64 64h1280c35 0 64 -29 64 -64z" />
-    <glyph glyph-name="sort-alpha-desc" unicode="&#xf15e;" horiz-adv-x="1629" 
-d="M1159 104h177l-72 218l-12 47c-1 8 -2 14 -2 20h-4l-3 -20c-3 -12 -4 -27 -11 -47zM704 96c0 -9 -4 -17 -10 -24l-319 -319c-7 -6 -15 -9 -23 -9s-16 3 -23 9l-320 320c-9 10 -12 23 -7 35s17 20 30 20h192v1376c0 18 14 32 32 32h192c18 0 32 -14 32 -32v-1376h192
-c18 0 32 -14 32 -32zM1629 -150v-106h-288v106h75l-47 144h-243l-47 -144h75v-106h-287v106h70l230 662h162l230 -662h70zM1540 1001v-233h-584v90l369 529c8 12 16 22 21 27l11 9v3c-4 0 -8 -1 -14 -1c-8 -2 -18 -3 -30 -3h-232v-115h-120v229h567v-89l-369 -530
-c-6 -9 -14 -18 -21 -26l-11 -10v-3l14 3c9 1 18 1 30 1h248v119h121z" />
-    <glyph glyph-name="map-signs" unicode="&#xf277;" horiz-adv-x="1718" 
-d="M1708 1239c13 -13 13 -33 0 -46l-141 -141c-18 -18 -43 -28 -68 -28h-1344c-35 0 -64 29 -64 64v256c0 35 29 64 64 64h576v64c0 35 29 64 64 64h128c35 0 64 -29 64 -64v-64h512c25 0 50 -10 68 -28zM731 320h256v-512c0 -35 -29 -64 -64 -64h-128c-35 0 -64 29 -64 64
-v512zM1563 768c35 0 64 -29 64 -64v-256c0 -35 -29 -64 -64 -64h-1344c-25 0 -50 10 -68 28l-141 141c-13 13 -13 33 0 46l141 141c18 18 43 28 68 28h512v192h256v-192h576z" />
-    <glyph glyph-name="long-arrow-right" unicode="&#xf178;" horiz-adv-x="1728" 
-d="M1728 643c0 -9 -4 -18 -10 -24l-384 -354c-10 -9 -23 -11 -35 -6c-11 5 -19 16 -19 29v224h-1248c-18 0 -32 14 -32 32v192c0 18 14 32 32 32h1248v224c0 13 7 24 19 29s25 3 35 -5l384 -350c6 -6 10 -14 10 -23z" />
-    <glyph glyph-name="first-order" unicode="&#xf2b0;" 
-d="M1322 640c0 -26 -1 -51 -5 -76l-236 14l224 -78c-13 -51 -33 -98 -58 -141l-214 103l177 -158c-30 -41 -66 -77 -107 -108l-157 178l103 -215c-43 -26 -90 -45 -140 -59l-79 228l14 -240c-25 -4 -50 -6 -76 -6c-25 0 -51 2 -76 6l14 238l-78 -226c-50 13 -97 33 -140 59
-l103 215l-157 -178c-41 30 -77 67 -108 108l178 158l-214 -104c-25 44 -45 91 -58 141l224 79l-237 -14c-3 25 -5 50 -5 76s2 52 5 77l238 -14l-225 79c13 50 33 97 58 140l214 -104l-177 159c31 41 67 77 107 108l158 -178l-103 215c43 25 90 45 140 58l77 -224l-13 236
-c24 4 50 6 75 6c26 0 51 -2 76 -6l-14 -237l78 225c50 -13 97 -33 140 -59l-103 -214l158 178c40 -31 76 -67 107 -108l-177 -159l213 104c26 -43 45 -91 58 -141l-224 -78l237 14c4 -25 5 -51 5 -77zM1352 640c0 325 -262 588 -584 588c-323 0 -584 -263 -584 -588
-c0 -324 261 -587 584 -587c322 0 584 263 584 587zM1425 1023v-766l-657 -383l-657 383v766l657 383zM768 -183l708 412v823l-708 411l-708 -411v-823zM1536 1088v-896l-768 -448l-768 448v896l768 448z" />
-    <glyph glyph-name="calendar-check-o" unicode="&#xf274;" horiz-adv-x="1664" 
-d="M1303 572l-512 -512c-13 -12 -33 -12 -46 0l-288 288c-12 13 -12 33 0 45l46 46c12 12 32 12 45 0l220 -220l444 444c13 12 33 12 45 0l46 -46c12 -12 12 -32 0 -45zM128 -128h1408v1024h-1408v-1024zM512 1088v288c0 18 -14 32 -32 32h-64c-18 0 -32 -14 -32 -32v-288
-c0 -18 14 -32 32 -32h64c18 0 32 14 32 32zM1280 1088v288c0 18 -14 32 -32 32h-64c-18 0 -32 -14 -32 -32v-288c0 -18 14 -32 32 -32h64c18 0 32 14 32 32zM1664 1152v-1280c0 -70 -58 -128 -128 -128h-1408c-70 0 -128 58 -128 128v1280c0 70 58 128 128 128h128v96
-c0 88 72 160 160 160h64c88 0 160 -72 160 -160v-96h384v96c0 88 72 160 160 160h64c88 0 160 -72 160 -160v-96h128c70 0 128 -58 128 -128z" />
-    <glyph glyph-name="id-card" unicode="&#xf2c2;" horiz-adv-x="2048" 
-d="M896 324c0 132 -32 284 -164 284c-40 -40 -95 -64 -156 -64s-116 24 -156 64c-132 0 -164 -152 -164 -284c0 -73 48 -132 107 -132h426c59 0 107 59 107 132zM768 768c0 106 -86 192 -192 192s-192 -86 -192 -192s86 -192 192 -192s192 86 192 192zM1792 288v64
-c0 18 -14 32 -32 32h-704c-18 0 -32 -14 -32 -32v-64c0 -18 14 -32 32 -32h704c18 0 32 14 32 32zM1408 544v64c0 18 -14 32 -32 32h-320c-18 0 -32 -14 -32 -32v-64c0 -18 14 -32 32 -32h320c18 0 32 14 32 32zM1792 544v64c0 18 -14 32 -32 32h-192c-18 0 -32 -14 -32 -32
-v-64c0 -18 14 -32 32 -32h192c18 0 32 14 32 32zM1792 800v64c0 18 -14 32 -32 32h-704c-18 0 -32 -14 -32 -32v-64c0 -18 14 -32 32 -32h704c18 0 32 14 32 32zM128 1152h1792v96c0 18 -14 32 -32 32h-1728c-18 0 -32 -14 -32 -32v-96zM2048 1248v-1216
-c0 -88 -72 -160 -160 -160h-1728c-88 0 -160 72 -160 160v1216c0 88 72 160 160 160h1728c88 0 160 -72 160 -160z" />
-    <glyph glyph-name="globe-w" unicode="&#xf305;" 
-d="M768 1404c424 0 768 -344 768 -768s-344 -768 -768 -768s-768 344 -768 768s344 768 768 768zM924 1238v0c-3 0 -6 -1 -7 -1c-2 0 -153 -25 -208 -34s-156 -30 -201 -34s-46 0 -69 0c-7 0 -14 1 -21 2c-65 -43 -152 -132 -193 -198c0 -4 2 -7 6 -11c12 -12 46 0 69 0
-s59 8 69 0s1 -7 2 -9s-16 -108 -7 -144s10 -88 33 -129s110 -63 145 -98s106 -34 112 -71s-30 -79 -42 -102s-40 -40 -35 -69s46 -47 69 -70s47 -29 69 -69s25 -125 35 -173c2 -9 5 -22 7 -31c3 0 8 -1 11 -1c57 0 146 15 200 33c6 41 13 83 24 103c18 33 24 24 36 36
-s23 18 35 35s23 46 34 68s38 38 33 67s-47 47 -70 70s-35 50 -69 69s-94 24 -130 33s-163 15 -165 16s0 -8 -8 2s-3 50 -3 73s13 44 30 85c17 23 7 12 33 31c13 12 55 -57 73 -57s-4 117 7 128c46 46 163 125 163 174s-46 46 -69 69s-60 -39 -143 -39s97 131 109 143
-s30 22 35 35s0 23 0 34s14 28 9 32c-2 2 -5 2 -8 2zM1041 1214v0c-6 -14 -7 -31 -14 -45c-12 -23 -35 -43 -35 -69s23 -46 35 -69s1 -60 34 -69s69 46 104 69c21 14 50 26 72 40c-46 50 -134 114 -196 143z" />
-    <glyph glyph-name="github-alt" unicode="&#xf113;" horiz-adv-x="1664" 
-d="M640 320c0 -73 -38 -192 -128 -192s-128 119 -128 192s38 192 128 192s128 -119 128 -192zM1280 320c0 -73 -38 -192 -128 -192s-128 119 -128 192s38 192 128 192s128 -119 128 -192zM1440 320c0 153 -93 288 -256 288c-66 0 -129 -12 -195 -21
-c-52 -8 -104 -11 -157 -11s-105 3 -157 11c-65 9 -129 21 -195 21c-163 0 -256 -135 -256 -288c0 -306 280 -353 524 -353h168c244 0 524 47 524 353zM1664 496c0 -111 -11 -229 -61 -331c-132 -267 -495 -293 -755 -293c-264 0 -649 23 -786 293c-51 101 -62 220 -62 331
-c0 146 40 284 136 396c-18 55 -27 113 -27 170c0 75 17 150 51 218c158 0 259 -69 379 -163c101 24 205 35 309 35c94 0 189 -10 280 -32c119 93 220 160 376 160c34 -68 51 -143 51 -218c0 -57 -9 -114 -27 -168c96 -113 136 -252 136 -398z" />
-    <glyph glyph-name="sign-language" unicode="&#xf2a7;" horiz-adv-x="1664" 
-d="M831 863c21 0 41 -6 59 -18l222 -148c41 -27 78 -60 110 -97l146 -170c25 -29 36 -68 29 -106l-72 -413c-8 -42 -42 -74 -85 -79l-527 -56l-352 -32h-9c-52 0 -96 42 -96 96c0 50 42 90 92 96l260 32h-448c-55 0 -99 46 -96 101c3 52 49 91 101 91l442 1l-521 64
-c-54 6 -93 55 -85 110c8 48 52 80 100 80h10l481 -60l-351 94c-50 13 -88 59 -80 110c8 48 49 81 95 81c7 0 13 -1 20 -2l448 -96l217 -37c2 0 4 -1 6 -1c30 0 45 41 18 59l-186 125c-46 31 -57 93 -24 137c18 25 47 38 76 38zM761 661l186 -125l-218 37l-5 2l-36 38
-l-238 262c-2 2 -3 5 -5 7c-31 41 -24 101 19 134c40 31 97 21 132 -16l142 -147c-3 -3 -6 -5 -9 -8c-21 -29 -29 -64 -23 -99c6 -34 26 -65 55 -85zM1648 1115l15 -266c3 -49 -1 -99 -11 -147l-48 -219c-8 -38 -32 -69 -67 -87l-106 -54c1 40 -12 78 -39 109l-146 170
-c-34 39 -73 74 -117 103l-222 148c-22 15 -48 23 -76 23c-34 0 -65 -14 -88 -37l-235 312c-33 44 -23 106 23 137c43 30 102 16 134 -26l266 -352l-262 455c-28 47 -12 108 37 134c46 24 104 5 130 -40l241 -420l-136 337c-19 48 -6 106 40 130c49 26 109 5 132 -45
-l193 -415l101 -196c16 -31 63 -18 61 16l-12 224c-3 55 40 101 95 102c52 0 94 -44 97 -96z" />
-    <glyph glyph-name="play" unicode="&#xf04b;" horiz-adv-x="1407" 
-d="M1384 609l-1328 -738c-31 -17 -56 -2 -56 33v1472c0 35 25 50 56 33l1328 -738c31 -17 31 -45 0 -62z" />
-    <glyph glyph-name="heart-o" unicode="&#xf08a;" horiz-adv-x="1792" 
-d="M1664 940c0 281 -190 340 -350 340c-149 0 -317 -161 -369 -223c-24 -29 -74 -29 -98 0c-52 62 -220 223 -369 223c-160 0 -350 -59 -350 -340c0 -183 185 -353 187 -355l581 -560l580 559c3 3 188 173 188 356zM1792 940c0 -240 -220 -441 -229 -450l-623 -600
-c-12 -12 -28 -18 -44 -18s-32 6 -44 18l-624 602c-8 7 -228 208 -228 448c0 293 179 468 478 468c175 0 339 -138 418 -216c79 78 243 216 418 216c299 0 478 -175 478 -468z" />
-    <glyph glyph-name="weibo" unicode="&#xf18a;" horiz-adv-x="1792" 
-d="M675 252c28 46 13 99 -34 119c-45 19 -105 -1 -133 -45c-29 -45 -15 -98 30 -119c46 -21 108 -1 137 45zM769 373c10 18 4 38 -14 45c-18 6 -40 -2 -50 -19c-10 -18 -5 -37 13 -45c18 -7 41 1 51 19zM943 266c-60 -136 -234 -210 -382 -162c-143 46 -203 187 -141 314
-c62 124 221 194 362 158c147 -38 221 -176 161 -310zM1255 426c-19 195 -275 329 -572 300c-297 -30 -521 -211 -502 -406s275 -329 572 -300c297 30 521 211 502 406zM1563 422c0 -225 -324 -508 -811 -508c-372 0 -752 180 -752 477c0 155 98 334 267 503
-c226 226 489 328 588 229c44 -43 48 -119 20 -209c-14 -46 43 -20 43 -21c182 77 341 81 399 -2c31 -44 28 -106 0 -178c-13 -33 4 -38 29 -46c103 -32 217 -109 217 -245zM1489 1046c57 -63 73 -150 48 -226c-10 -31 -43 -48 -74 -38s-48 43 -38 74c12 38 4 80 -24 111
-s-69 43 -107 35c-32 -7 -64 13 -70 45c-7 32 13 63 45 70c78 17 163 -7 220 -71zM1670 1209c118 -130 149 -308 99 -464c-12 -36 -50 -56 -86 -44s-56 50 -45 86c36 111 14 238 -70 330c-84 93 -207 128 -321 104c-37 -8 -74 16 -82 53s16 73 53 81c161 34 334 -15 452 -146
-z" />
-    <glyph glyph-name="angle-down" unicode="&#xf107;" horiz-adv-x="998" 
-d="M998 800c0 -8 -4 -17 -10 -23l-466 -466c-6 -6 -15 -10 -23 -10s-17 4 -23 10l-466 466c-6 6 -10 15 -10 23s4 17 10 23l50 50c6 6 14 10 23 10c8 0 17 -4 23 -10l393 -393l393 393c6 6 15 10 23 10s17 -4 23 -10l50 -50c6 -6 10 -15 10 -23z" />
-    <glyph glyph-name="cc-jcb" unicode="&#xf24b;" horiz-adv-x="2304" 
-d="M1951 538c0 -36 -24 -62 -54 -68c-4 -1 -13 -2 -18 -2h-153v140h153c5 0 14 -1 18 -2c30 -6 54 -33 54 -68zM1933 751c0 -35 -24 -58 -53 -63c-3 -1 -10 -1 -15 -1h-139v129h139c5 0 12 -1 15 -1c29 -5 53 -29 53 -64zM728 587v308h-228v-308c0 -75 -51 -131 -143 -131
-c-78 0 -155 23 -229 59v-112c120 -33 272 -33 272 -33c254 0 328 97 328 217zM1442 403v113c-52 -27 -118 -53 -200 -59c-144 -11 -230 59 -230 183s86 194 230 183c82 -6 147 -31 200 -58v112c-107 27 -208 31 -208 31c-352 16 -452 -123 -452 -268s100 -284 452 -268
-c0 0 101 4 208 31zM2176 518c0 74 -66 122 -152 128v3c78 11 121 62 121 121c0 76 -63 120 -148 124c-6 0 -17 1 -26 1h-455v-510h491c97 0 169 52 169 133zM2304 1280v-1280c0 -70 -58 -128 -128 -128h-2048c-70 0 -128 58 -128 128v1280c0 70 58 128 128 128h2048
-c70 0 128 -58 128 -128z" />
-    <glyph glyph-name="compress" unicode="&#xf066;" horiz-adv-x="1510" 
-d="M755 576v-448c0 -35 -29 -64 -64 -64c-17 0 -33 7 -45 19l-144 144l-332 -332c-6 -6 -15 -10 -23 -10s-17 4 -23 10l-114 114c-6 6 -10 15 -10 23s4 17 10 23l332 332l-144 144c-12 12 -19 28 -19 45c0 35 29 64 64 64h448c35 0 64 -29 64 -64zM1510 1248
-c0 -8 -4 -17 -10 -23l-332 -332l144 -144c12 -12 19 -28 19 -45c0 -35 -29 -64 -64 -64h-448c-35 0 -64 29 -64 64v448c0 35 29 64 64 64c17 0 33 -7 45 -19l144 -144l332 332c6 6 15 10 23 10s17 -4 23 -10l114 -114c6 -6 10 -15 10 -23z" />
-    <glyph glyph-name="pencil-square-o" unicode="&#xf044;" horiz-adv-x="1784" 
-d="M888 352l116 116l-152 152l-116 -116v-56h96v-96h56zM1328 1072c-9 9 -24 8 -33 -1l-350 -350c-9 -9 -10 -24 -1 -33s24 -8 33 1l350 350c9 9 10 24 1 33zM1408 478v-190c0 -159 -129 -288 -288 -288h-832c-159 0 -288 129 -288 288v832c0 159 129 288 288 288h832
-c40 0 80 -8 117 -25c9 -4 16 -13 18 -23c2 -11 -1 -21 -9 -29l-49 -49c-9 -9 -21 -12 -32 -8c-15 4 -30 6 -45 6h-832c-88 0 -160 -72 -160 -160v-832c0 -88 72 -160 160 -160h832c88 0 160 72 160 160v126c0 8 3 16 9 22l64 64c10 10 23 12 35 7s20 -16 20 -29zM1312 1216
-l288 -288l-672 -672h-288v288zM1756 1084l-92 -92l-288 288l92 92c37 37 99 37 136 0l152 -152c37 -37 37 -99 0 -136z" />
-    <glyph glyph-name="google-plus-square" unicode="&#xf0d4;" 
-d="M917 631c0 25 -3 45 -6 64h-362v-132h217c-8 -56 -65 -165 -217 -165c-132 0 -239 108 -239 242s107 242 239 242c74 0 124 -31 153 -59l104 101c-67 62 -154 100 -257 100c-213 0 -384 -172 -384 -384s171 -384 384 -384c221 0 368 156 368 375zM1262 585h109v110h-109
-v110h-110v-110h-110v-110h110v-110h110v110zM1536 1120v-960c0 -159 -129 -288 -288 -288h-960c-159 0 -288 129 -288 288v960c0 159 129 288 288 288h960c159 0 288 -129 288 -288z" />
-    <glyph glyph-name="keybase" unicode="&#xf2f4;" horiz-adv-x="1547" 
-d="M146 -80c-13 28 -30 67 -39 87l-13 38l-44 -49l-44 -48l-4 92c-7 131 4 267 26 363c50 214 208 408 411 511l45 21l-10 33c-7 17 -14 55 -16 79l-4 46l-46 4c-70 7 -107 26 -131 76c-13 26 -13 31 -9 101c4 92 12 111 40 142c35 39 59 45 146 41c63 -4 77 -6 105 -19
-c17 -9 33 -18 35 -18s22 24 46 57l41 59l26 -15c15 -9 33 -20 42 -24l15 -9l-13 -33c-7 -17 -16 -48 -18 -63l-4 -31l37 -4c133 -13 234 -94 271 -216c11 -39 11 -116 0 -153c-11 -35 -11 -37 -2 -37c15 0 118 -51 159 -77c81 -52 175 -143 227 -222
-c98 -146 140 -306 123 -481c-9 -105 -29 -187 -64 -268l-13 -31h-109l26 52c28 57 50 136 61 206c7 48 10 179 3 203l-5 15l-28 -31c-70 -76 -172 -98 -310 -61c-118 31 -167 37 -278 37c-85 0 -113 -2 -159 -13c-127 -28 -217 -69 -341 -159c-46 -33 -83 -59 -85 -59
-s4 22 13 50s24 74 33 105l17 55l-19 -20c-11 -11 -42 -42 -68 -70l-46 -50l11 -42c13 -55 44 -122 77 -172c13 -22 24 -40 24 -42s-26 -2 -57 -2h-57zM338 449c105 111 190 200 192 200c2 -2 -8 -35 -19 -72c-72 -227 -87 -271 -85 -273c0 0 26 9 54 20
-c186 81 402 92 631 31c103 -26 142 -26 192 0c28 15 40 23 53 45c24 37 26 90 11 138c-37 105 -182 240 -317 299c-70 31 -74 30 -89 15l-14 -13l57 -69c31 -37 64 -79 68 -90c13 -26 15 -68 2 -94c-17 -37 -70 -64 -111 -55c-17 4 -25 3 -42 -10c-48 -35 -100 -26 -144 26
-c-35 39 -44 59 -46 98c0 20 -7 43 -11 52c-7 13 -8 28 -8 48l2 31l-29 7c-39 11 -85 32 -111 52c-13 9 -24 17 -28 17s-33 -13 -64 -28c-212 -109 -349 -312 -371 -541c-2 -22 -4 -51 -6 -62l-3 -19l24 24c11 11 107 112 212 223zM904 610c20 15 37 28 41 28
-c2 0 9 -6 16 -15c11 -17 30 -17 39 -2c7 11 7 13 -122 170c-76 94 -92 110 -103 110c-26 -2 -19 -23 22 -73l39 -48l-22 -17c-24 -22 -26 -26 -11 -39c11 -11 13 -9 35 6l24 15l16 -13c9 -7 13 -17 13 -19c0 -4 -17 -20 -37 -37c-20 -15 -35 -34 -35 -38c0 -7 10 -24 30 -48
-c7 -13 18 -8 55 20zM679 920c13 39 56 70 100 70c24 0 59 -20 83 -46l22 -26l20 24c55 61 61 147 17 221c-33 55 -94 87 -179 96c-46 4 -57 8 -81 32l-17 18l-9 -13c-17 -26 -54 -111 -65 -144c-15 -50 -9 -129 11 -168c20 -37 72 -88 87 -81c2 -2 7 6 11 17zM484 1217
-c4 11 16 39 27 61s19 44 19 51c0 20 -21 28 -80 32c-52 4 -57 3 -68 -8c-9 -9 -13 -20 -13 -35c0 -13 -3 -37 -5 -57c-4 -46 2 -54 48 -61c68 -4 65 -5 72 17zM417 1270c0 37 4 41 35 41h28v-61h-61v20h-2zM554 -4c-13 13 -17 22 -17 44c0 41 24 66 63 66
-c37 0 64 -27 64 -64c0 -39 -25 -61 -66 -63c-22 0 -31 4 -44 17zM976 -10c-50 39 -24 116 39 116c39 0 61 -25 63 -66c0 -24 -2 -31 -17 -44s-22 -17 -44 -17c-20 0 -32 4 -41 11z" />
-    <glyph glyph-name="angle-right" unicode="&#xf105;" horiz-adv-x="582" 
-d="M582 576c0 -8 -4 -17 -10 -23l-466 -466c-6 -6 -15 -10 -23 -10s-17 4 -23 10l-50 50c-6 6 -10 14 -10 23c0 8 4 17 10 23l393 393l-393 393c-6 6 -10 15 -10 23s4 17 10 23l50 50c6 6 15 10 23 10s17 -4 23 -10l466 -466c6 -6 10 -15 10 -23z" />
-    <glyph glyph-name="forumbee" unicode="&#xf211;" 
-d="M934 1386c-423 -161 -756 -499 -914 -923c-13 58 -20 117 -20 176c0 423 342 766 765 766c57 0 114 -7 169 -19zM1203 1267c62 -43 117 -95 164 -155c-518 -151 -923 -558 -1071 -1077c-59 46 -112 100 -155 162c149 514 549 918 1062 1070zM470 -67
-c154 475 526 849 999 1006c27 -62 45 -128 54 -195c-390 -160 -700 -472 -859 -863c-67 9 -132 26 -194 52zM1536 -125c-124 32 -247 70 -367 115c-88 -55 -187 -92 -290 -107c146 273 371 499 643 646c-14 -100 -49 -198 -101 -284c45 -121 83 -245 115 -370z" />
-    <glyph glyph-name="eject" unicode="&#xf052;" horiz-adv-x="1538" 
-d="M14 557l710 710c25 25 65 25 90 0l710 -710c25 -25 16 -45 -19 -45h-1472c-35 0 -44 20 -19 45zM1473 0h-1408c-35 0 -64 29 -64 64v256c0 35 29 64 64 64h1408c35 0 64 -29 64 -64v-256c0 -35 -29 -64 -64 -64z" />
-    <glyph glyph-name="mobile" unicode="&#xf10b;" horiz-adv-x="768" 
-d="M464 128c0 44 -36 80 -80 80s-80 -36 -80 -80s36 -80 80 -80s80 36 80 80zM672 288v704c0 17 -15 32 -32 32h-512c-17 0 -32 -15 -32 -32v-704c0 -17 15 -32 32 -32h512c17 0 32 15 32 32zM480 1136c0 9 -7 16 -16 16h-160c-9 0 -16 -7 -16 -16s7 -16 16 -16h160
-c9 0 16 7 16 16zM768 1152v-1024c0 -70 -58 -128 -128 -128h-512c-70 0 -128 58 -128 128v1024c0 70 58 128 128 128h512c70 0 128 -58 128 -128z" />
-    <glyph glyph-name="hourglass-end" unicode="&#xf253;" 
-d="M1408 1408c0 -370 -177 -638 -373 -768c196 -130 373 -398 373 -768h96c18 0 32 -14 32 -32v-64c0 -18 -14 -32 -32 -32h-1472c-18 0 -32 14 -32 32v64c0 18 14 32 32 32h96c0 370 177 638 373 768c-196 130 -373 398 -373 768h-96c-18 0 -32 14 -32 32v64
-c0 18 14 32 32 32h1472c18 0 32 -14 32 -32v-64c0 -18 -14 -32 -32 -32h-96zM874 700c202 76 406 343 406 708h-1024c0 -365 204 -632 406 -708c25 -9 42 -33 42 -60s-17 -51 -42 -60c-86 -32 -173 -100 -244 -196h700c-71 96 -158 164 -244 196c-25 9 -42 33 -42 60
-s17 51 42 60z" />
-    <glyph glyph-name="trash-o" unicode="&#xf014;" horiz-adv-x="1408" 
-d="M512 800v-576c0 -18 -14 -32 -32 -32h-64c-18 0 -32 14 -32 32v576c0 18 14 32 32 32h64c18 0 32 -14 32 -32zM768 800v-576c0 -18 -14 -32 -32 -32h-64c-18 0 -32 14 -32 32v576c0 18 14 32 32 32h64c18 0 32 -14 32 -32zM1024 800v-576c0 -18 -14 -32 -32 -32h-64
-c-18 0 -32 14 -32 32v576c0 18 14 32 32 32h64c18 0 32 -14 32 -32zM1152 76v948h-896v-948c0 -48 27 -76 32 -76h832c5 0 32 28 32 76zM480 1152h448l-48 117c-3 4 -12 10 -17 11h-317c-6 -1 -14 -7 -17 -11zM1408 1120v-64c0 -18 -14 -32 -32 -32h-96v-948
-c0 -110 -72 -204 -160 -204h-832c-88 0 -160 90 -160 200v952h-96c-18 0 -32 14 -32 32v64c0 18 14 32 32 32h309l70 167c20 49 80 89 133 89h320c53 0 113 -40 133 -89l70 -167h309c18 0 32 -14 32 -32z" />
-    <glyph glyph-name="star-o" unicode="&#xf006;" horiz-adv-x="1664" 
-d="M1137 532l306 297l-422 62l-189 382l-189 -382l-422 -62l306 -297l-73 -421l378 199l377 -199zM1664 889c0 -18 -13 -35 -26 -48l-363 -354l86 -500c1 -7 1 -13 1 -20c0 -27 -12 -50 -41 -50c-14 0 -28 5 -40 12l-449 236l-449 -236c-13 -7 -26 -12 -40 -12
-c-29 0 -42 24 -42 50c0 7 1 13 2 20l86 500l-364 354c-12 13 -25 30 -25 48c0 30 31 42 56 46l502 73l225 455c9 19 26 41 49 41s40 -22 49 -41l225 -455l502 -73c24 -4 56 -16 56 -46z" />
-    <glyph glyph-name="floppy-o" unicode="&#xf0c7;" 
-d="M384 0h768v384h-768v-384zM1280 0h128v896c0 19 -17 60 -30 73l-281 281c-14 14 -53 30 -73 30v-416c0 -53 -43 -96 -96 -96h-576c-53 0 -96 43 -96 96v416h-128v-1280h128v416c0 53 43 96 96 96h832c53 0 96 -43 96 -96v-416zM896 928v320c0 17 -15 32 -32 32h-192
-c-17 0 -32 -15 -32 -32v-320c0 -17 15 -32 32 -32h192c17 0 32 15 32 32zM1536 896v-928c0 -53 -43 -96 -96 -96h-1344c-53 0 -96 43 -96 96v1344c0 53 43 96 96 96h928c53 0 126 -30 164 -68l280 -280c38 -38 68 -111 68 -164z" />
-    <glyph glyph-name="file-powerpoint-o" unicode="&#xf1c4;" 
-d="M1468 1156c37 -37 68 -111 68 -164v-1152c0 -53 -43 -96 -96 -96h-1344c-53 0 -96 43 -96 96v1600c0 53 43 96 96 96h896c53 0 127 -31 164 -68zM1024 1400v-376h376c-6 17 -15 34 -22 41l-313 313c-7 7 -24 16 -41 22zM1408 -128v1024h-416c-53 0 -96 43 -96 96v416
-h-768v-1536h1280zM416 106h92v555h-92v107h368c46 0 92 -4 130 -19c83 -35 137 -119 137 -228s-56 -202 -146 -233c-36 -13 -75 -15 -118 -15h-137v-167h93v-106h-327v106zM769 386c31 0 57 5 78 15c42 21 62 64 62 120c0 53 -20 94 -56 115c-21 12 -48 18 -83 18h-120v-268
-h119z" />
-    <glyph glyph-name="cc-discover" unicode="&#xf1f2;" horiz-adv-x="2304" 
-d="M313 759c0 -32 -13 -63 -36 -84c-20 -18 -47 -26 -89 -26h-17v220h17c42 0 68 -7 89 -27c23 -20 36 -51 36 -83zM2089 824c0 -34 -22 -52 -64 -52h-19v101h20c41 0 63 -17 63 -49zM380 759c0 98 -73 167 -179 167h-95v-333h95c50 0 87 11 119 38c38 32 60 79 60 128z
-M410 593h65v333h-65v-333zM730 694c0 53 -22 77 -96 104c-39 14 -50 24 -50 42c0 21 20 37 48 37c20 0 36 -8 53 -27l34 44c-28 25 -62 37 -98 37c-59 0 -104 -41 -104 -95c0 -46 21 -70 82 -92c25 -9 38 -14 45 -19c13 -8 19 -20 19 -34c0 -27 -21 -47 -50 -47
-c-31 0 -56 15 -71 44l-42 -40c30 -44 66 -64 115 -64c68 0 115 45 115 110zM1008 604v77c-26 -26 -49 -37 -78 -37c-66 0 -112 48 -112 115c0 64 48 115 109 115c31 0 54 -11 81 -38v77c-28 14 -52 20 -80 20c-98 0 -177 -77 -177 -174c0 -98 77 -174 176 -174
-c28 0 52 5 81 19zM2240 0v527c-160 -100 -723 -420 -1633 -591h1569c35 0 64 29 64 64zM1389 757c0 100 -81 181 -181 181s-181 -81 -181 -181s81 -181 181 -181s181 81 181 181zM1541 584l144 342h-71l-90 -224l-89 224h-71l142 -342h35zM1714 593h184v56h-119v90h115v56
-h-115v74h119v57h-184v-333zM2105 593h80l-105 140c49 10 76 43 76 94c0 63 -43 99 -118 99h-97v-333h65v133h9zM2304 1274v-1268c0 -74 -59 -134 -132 -134h-2040c-73 0 -132 60 -132 134v1268c0 74 59 134 132 134h2040c73 0 132 -60 132 -134z" />
-    <glyph glyph-name="bomb" unicode="&#xf1e2;" horiz-adv-x="1792" 
-d="M571 947c-13 33 -50 48 -83 35c-144 -58 -260 -174 -318 -318c-13 -33 2 -70 35 -83c8 -3 16 -5 24 -5c26 0 49 15 60 40c45 112 135 202 247 247c33 14 49 51 35 84zM1513 1303l46 -46l-244 -243l68 -68c25 -25 25 -66 0 -91l-64 -64c56 -101 89 -218 89 -343
-c0 -389 -315 -704 -704 -704s-704 315 -704 704s315 704 704 704c125 0 242 -33 343 -89l64 64c25 25 66 25 91 0l68 -68zM1521 1359c-6 -6 -14 -10 -22 -10c-9 0 -17 4 -23 10l-91 90c-12 13 -12 33 0 46c13 12 33 12 46 0l90 -91c13 -12 13 -33 0 -45zM1751 1129
-c-7 -6 -15 -9 -23 -9s-16 3 -23 9l-90 91c-13 12 -13 33 0 45c12 13 33 13 45 0l91 -90c12 -13 12 -33 0 -46zM1792 1312c0 -18 -14 -32 -32 -32h-96c-18 0 -32 14 -32 32s14 32 32 32h96c18 0 32 -14 32 -32zM1600 1504v-96c0 -18 -14 -32 -32 -32s-32 14 -32 32v96
-c0 18 14 32 32 32s32 -14 32 -32zM1751 1449l-91 -90c-6 -6 -14 -10 -22 -10c-9 0 -17 4 -23 10c-13 12 -13 33 0 45l90 91c13 12 33 12 46 0c12 -13 12 -33 0 -46z" />
-    <glyph glyph-name="random" unicode="&#xf074;" horiz-adv-x="1792" 
-d="M666 1055c-56 -86 -97 -179 -137 -273c-58 121 -122 242 -273 242h-224c-18 0 -32 14 -32 32v192c0 18 14 32 32 32h224c178 0 309 -83 410 -225zM1792 256c0 -8 -3 -17 -9 -23l-320 -320c-6 -6 -15 -9 -23 -9c-17 0 -32 15 -32 32v192c-297 0 -480 -35 -665 225
-c55 86 96 179 136 273c58 -121 122 -242 273 -242h256v192c0 18 14 32 32 32c9 0 17 -4 24 -10l319 -319c6 -6 9 -15 9 -23zM1792 1152c0 -8 -3 -17 -9 -23l-320 -320c-6 -6 -15 -9 -23 -9c-17 0 -32 14 -32 32v192h-256c-133 0 -196 -91 -252 -199
-c-29 -56 -54 -114 -78 -171c-111 -258 -241 -526 -566 -526h-224c-18 0 -32 14 -32 32v192c0 18 14 32 32 32h224c133 0 196 91 252 199c29 56 54 114 78 171c111 258 241 526 566 526h256v192c0 18 14 32 32 32c9 0 17 -4 24 -10l319 -319c6 -6 9 -15 9 -23z" />
-    <glyph glyph-name="fire-extinguisher" unicode="&#xf134;" horiz-adv-x="1408" 
-d="M512 1344c0 35 -29 64 -64 64s-64 -29 -64 -64s29 -64 64 -64s64 29 64 64zM1408 1376v-320c0 -10 -4 -19 -12 -25c-6 -5 -13 -7 -20 -7c-2 0 -4 0 -7 1l-448 96c-14 3 -25 16 -25 31h-256v-102c146 -30 256 -159 256 -314v-800c0 -35 -29 -64 -64 -64h-512
-c-35 0 -64 29 -64 64v800c0 143 94 265 224 305v111h-32c-212 0 -326 -219 -327 -221c-11 -22 -34 -35 -57 -35c-10 0 -20 2 -29 7c-31 16 -44 54 -28 86c5 10 105 204 306 269c-15 25 -25 54 -25 86c0 88 72 160 160 160s160 -72 160 -160c0 -23 -5 -44 -14 -64h302
-c0 15 11 28 25 31l448 96c3 1 5 1 7 1c7 0 14 -2 20 -7c8 -6 12 -15 12 -25z" />
-    <glyph glyph-name="gnu-social" unicode="&#xf2e7;" horiz-adv-x="1513" 
-d="M218 1404v0h1077c121 0 218 -97 218 -218v-873c0 -121 -97 -218 -218 -218h-118c-80 -349 -645 -351 -645 -351s334 104 335 351h-649c-121 0 -218 97 -218 218v873c0 121 97 218 218 218zM532 1229c-35 -5 -114 -89 -114 -150c0 -49 -3 -127 70 -167
-c-69 -67 -82 -163 -81 -247c2 -154 67 -382 357 -397s352 214 352 360h-305l50 -134l89 5s17 -107 -174 -100c-122 5 -200 68 -200 249s22 211 193 218s203 -139 203 -139l142 -3s-11 107 -93 188c73 40 72 118 69 167c-2 47 -102 169 -125 148s39 -41 34 -143
-c-2 -45 11 -79 -75 -79c-57 0 -33 51 -105 51c-43 0 -59 -28 -65 -50c-6 22 -21 50 -64 50c-72 0 -49 -51 -106 -51c-86 0 -72 34 -74 79c-5 102 56 122 33 143c-1 1 -3 2 -5 2h-6z" />
-    <glyph glyph-name="pencil-square" unicode="&#xf14b;" 
-d="M404 428l152 -152l-52 -52h-56v96h-96v56zM818 818c8 -7 6 -21 -3 -30l-291 -291c-9 -9 -23 -11 -30 -3c-8 7 -6 21 3 30l291 291c9 9 23 11 30 3zM544 128l544 544l-288 288l-544 -544v-288h288zM1152 736l92 92c37 37 37 99 0 136l-152 152c-37 37 -99 37 -136 0
-l-92 -92zM1536 1120v-960c0 -159 -129 -288 -288 -288h-960c-159 0 -288 129 -288 288v960c0 159 129 288 288 288h960c159 0 288 -129 288 -288z" />
-    <glyph glyph-name="reddit-square" unicode="&#xf1a2;" 
-d="M939 407c7 -7 7 -19 0 -26c-49 -49 -143 -53 -171 -53s-122 4 -171 53c-7 7 -7 19 0 26c7 8 19 8 26 0c31 -31 98 -42 145 -42s114 11 145 42c7 8 19 8 26 0zM676 563c0 -42 -35 -77 -77 -77s-77 35 -77 77c0 43 35 77 77 77s77 -34 77 -77zM1014 563
-c0 -42 -35 -77 -77 -77s-77 35 -77 77c0 43 35 77 77 77s77 -34 77 -77zM1229 666c0 56 -46 102 -103 102c-28 0 -54 -12 -73 -31c-70 48 -164 79 -267 82l54 243l171 -39c1 -42 35 -76 77 -76s77 35 77 77s-35 77 -77 77c-30 0 -56 -17 -69 -43l-189 42
-c-10 3 -19 -4 -21 -13l-60 -268c-103 -4 -196 -35 -265 -83c-19 20 -45 32 -74 32c-57 0 -103 -46 -103 -102c0 -41 24 -76 58 -93c-3 -15 -5 -32 -5 -48c0 -163 183 -295 409 -295s410 132 410 295c0 17 -2 33 -6 49c33 17 56 52 56 92zM1536 1120v-960
-c0 -159 -129 -288 -288 -288h-960c-159 0 -288 129 -288 288v960c0 159 129 288 288 288h960c159 0 288 -129 288 -288z" />
-    <glyph glyph-name="arrow-circle-o-down" unicode="&#xf01a;" 
-d="M1120 608c0 -9 -4 -17 -10 -24l-319 -319c-7 -6 -15 -9 -23 -9s-16 3 -23 9l-320 320c-9 10 -12 23 -7 35s17 20 30 20h192v352c0 18 14 32 32 32h192c18 0 32 -14 32 -32v-352h192c18 0 32 -14 32 -32zM768 1184c-300 0 -544 -244 -544 -544s244 -544 544 -544
-s544 244 544 544s-244 544 -544 544zM1536 640c0 -424 -344 -768 -768 -768s-768 344 -768 768s344 768 768 768s768 -344 768 -768z" />
-    <glyph glyph-name="caret-left" unicode="&#xf0d9;" horiz-adv-x="576" 
-d="M576 1088v-896c0 -35 -29 -64 -64 -64c-17 0 -33 7 -45 19l-448 448c-12 12 -19 28 -19 45s7 33 19 45l448 448c12 12 28 19 45 19c35 0 64 -29 64 -64z" />
-    <glyph glyph-name="camera-retro" unicode="&#xf083;" horiz-adv-x="1792" 
-d="M928 704c0 18 -14 32 -32 32c-88 0 -160 -72 -160 -160c0 -18 14 -32 32 -32s32 14 32 32c0 53 43 96 96 96c18 0 32 14 32 32zM1152 574c0 -141 -115 -256 -256 -256s-256 115 -256 256s115 256 256 256s256 -115 256 -256zM128 0h1536v128h-1536v-128zM1280 574
-c0 212 -172 384 -384 384s-384 -172 -384 -384s172 -384 384 -384s384 172 384 384zM256 1216h384v128h-384v-128zM128 1024h1536v256h-828l-64 -128h-644v-128zM1792 1280v-1280c0 -71 -57 -128 -128 -128h-1536c-71 0 -128 57 -128 128v1280c0 71 57 128 128 128h1536
-c71 0 128 -57 128 -128z" />
-    <glyph glyph-name="thumbs-o-up" unicode="&#xf087;" 
-d="M256 192c0 35 -29 64 -64 64s-64 -29 -64 -64s29 -64 64 -64s64 29 64 64zM1408 768c0 68 -61 128 -128 128h-352c0 117 96 202 96 320c0 117 -23 192 -160 192c-64 -65 -31 -218 -128 -320c-28 -29 -52 -60 -77 -91c-45 -58 -164 -229 -243 -229h-32v-640h32
-c56 0 148 -36 202 -55c110 -38 224 -73 342 -73h121c113 0 192 45 192 167c0 19 -2 38 -5 56c42 23 65 80 65 126c0 24 -6 48 -18 69c34 32 53 72 53 119c0 32 -14 79 -35 103c47 1 75 91 75 128zM1536 769c0 -58 -17 -115 -49 -163c6 -22 9 -46 9 -69
-c0 -50 -13 -100 -38 -144c2 -14 3 -29 3 -43c0 -64 -21 -128 -60 -178c2 -189 -127 -300 -312 -300h-129c-142 0 -274 42 -406 88c-29 10 -110 40 -138 40h-288c-71 0 -128 57 -128 128v640c0 71 57 128 128 128h274c39 26 107 116 137 155c34 44 69 87 107 128
-c60 64 28 222 128 320c24 23 56 37 90 37c104 0 204 -37 253 -134c31 -61 35 -119 35 -186c0 -70 -18 -130 -48 -192h176c138 0 256 -117 256 -255z" />
-    <glyph glyph-name="product-hunt" unicode="&#xf288;" horiz-adv-x="1792" 
-d="M1150 774c0 -74 -60 -134 -135 -134h-253v269h253c75 0 135 -60 135 -135zM1329 774c0 174 -140 314 -314 314h-433v-896h180v269h253c174 0 314 140 314 313zM1792 640c0 -495 -401 -896 -896 -896s-896 401 -896 896s401 896 896 896s896 -401 896 -896z" />
-    <glyph glyph-name="etsy" unicode="&#xf2d7;" 
-d="M518 1353v-655c232 -2 354 10 354 10c94 3 108 27 130 119l33 142h103l-14 -322l7 -319h-103l-29 127c-21 95 -62 118 -129 119c0 0 -86 8 -352 8v-556c0 -104 57 -153 177 -153h357c120 0 228 12 302 183l93 216h89c-7 -43 -55 -440 -62 -528c-329 12 -470 12 -470 12
-h-628l-376 -12v102l127 25c89 17 116 43 117 116c6 242 8 643 8 643s3 402 -8 645c-3 83 -28 103 -117 120l-127 24v102l376 -12h702s139 0 374 27c-14 -153 -31 -506 -31 -506h-93l-32 124c-39 155 -91 238 -187 238h-548c-41 0 -43 -14 -43 -39z" />
-    <glyph glyph-name="copyright" unicode="&#xf1f9;" 
-d="M1150 462v-109c0 -141 -225 -193 -366 -193c-274 0 -480 209 -480 485c0 271 204 475 475 475c99 0 358 -35 358 -194v-109c0 -9 -7 -16 -16 -16h-118c-9 0 -16 7 -16 16v70c0 63 -121 92 -203 92c-187 0 -317 -135 -317 -329c0 -201 136 -348 325 -348
-c72 0 208 27 208 90v70c0 9 7 16 15 16h119c8 0 16 -7 16 -16zM768 1280c-353 0 -640 -287 -640 -640s287 -640 640 -640s640 287 640 640s-287 640 -640 640zM1536 640c0 -424 -344 -768 -768 -768s-768 344 -768 768s344 768 768 768s768 -344 768 -768z" />
-    <glyph glyph-name="pleroma" unicode="&#xf324;" horiz-adv-x="961" 
-d="M120 1408h262v-1536h-382v1416c0 66 54 120 120 120zM575 1408h386v-648c0 -66 -53 -120 -119 -120v0h-267v768zM575 254h386v-262c0 -66 -53 -120 -119 -120v0h-267v382z" />
-    <glyph glyph-name="terminal" unicode="&#xf120;" horiz-adv-x="1651" 
-d="M572 553l-466 -466c-13 -13 -33 -13 -46 0l-50 50c-13 13 -13 33 0 46l393 393l-393 393c-13 13 -13 33 0 46l50 50c13 13 33 13 46 0l466 -466c13 -13 13 -33 0 -46zM1651 96v-64c0 -18 -14 -32 -32 -32h-960c-18 0 -32 14 -32 32v64c0 18 14 32 32 32h960
-c18 0 32 -14 32 -32z" />
-    <glyph glyph-name="twitter-square" unicode="&#xf081;" 
-d="M1280 926c-38 -17 -78 -28 -121 -34c44 26 77 68 93 117c-41 -24 -86 -42 -134 -51c-38 41 -93 66 -153 66c-116 0 -210 -94 -210 -210c0 -16 1 -33 5 -48c-175 9 -330 92 -434 220c-18 -31 -29 -68 -29 -106c0 -73 34 -137 91 -175c-35 1 -68 11 -100 26v-2
-c0 -102 77 -187 173 -206c-18 -5 -32 -8 -51 -8c-13 0 -26 2 -39 4c27 -83 104 -144 196 -146c-72 -56 -162 -90 -261 -90c-17 0 -34 1 -50 3c93 -59 203 -94 322 -94c386 0 598 320 598 598c0 9 0 18 -1 27c41 29 77 66 105 109zM1536 1120v-960
-c0 -159 -129 -288 -288 -288h-960c-159 0 -288 129 -288 288v960c0 159 129 288 288 288h960c159 0 288 -129 288 -288z" />
-    <glyph glyph-name="shopping-bag" unicode="&#xf290;" horiz-adv-x="1793" 
-d="M1757 128l35 -313c2 -18 -4 -36 -16 -50c-12 -13 -30 -21 -48 -21h-1664c-18 0 -36 8 -48 21c-12 14 -18 32 -16 50l35 313h1722zM1664 967l86 -775h-1708l86 775c4 32 31 57 64 57h256v-128c0 -71 57 -128 128 -128s128 57 128 128v128h384v-128c0 -71 57 -128 128 -128
-s128 57 128 128v128h256c33 0 60 -25 64 -57zM1280 1152v-256c0 -35 -29 -64 -64 -64s-64 29 -64 64v256c0 141 -115 256 -256 256s-256 -115 -256 -256v-256c0 -35 -29 -64 -64 -64s-64 29 -64 64v256c0 212 172 384 384 384s384 -172 384 -384z" />
-    <glyph glyph-name="stop-circle" unicode="&#xf28d;" 
-d="M1088 352v576c0 18 -14 32 -32 32h-576c-18 0 -32 -14 -32 -32v-576c0 -18 14 -32 32 -32h576c18 0 32 14 32 32zM1536 640c0 -424 -344 -768 -768 -768s-768 344 -768 768s344 768 768 768s768 -344 768 -768z" />
-    <glyph glyph-name="telegram" unicode="&#xf2c6;" horiz-adv-x="1792" 
-d="M1189 229l147 693c13 61 -22 85 -62 70l-864 -333c-59 -23 -58 -56 -10 -71l221 -69l513 323c24 16 46 7 28 -9l-415 -375l-16 -228c23 0 33 10 45 22l108 104l224 -165c41 -23 70 -11 81 38zM1792 640c0 -495 -401 -896 -896 -896s-896 401 -896 896s401 896 896 896
-s896 -401 896 -896z" />
-    <glyph glyph-name="circle" unicode="&#xf111;" 
-d="M1536 640c0 -424 -344 -768 -768 -768s-768 344 -768 768s344 768 768 768s768 -344 768 -768z" />
-    <glyph glyph-name="columns" unicode="&#xf0db;" horiz-adv-x="1664" 
-d="M160 0h608v1152h-640v-1120c0 -17 15 -32 32 -32zM1536 32v1120h-640v-1152h608c17 0 32 15 32 32zM1664 1248v-1216c0 -88 -72 -160 -160 -160h-1344c-88 0 -160 72 -160 160v1216c0 88 72 160 160 160h1344c88 0 160 -72 160 -160z" />
-    <glyph glyph-name="zotero" unicode="&#xf309;" horiz-adv-x="1330" 
-d="M662 -127l-662 310v924l662 301l668 -301v-924zM314 152h723v221l-63 78h-275l338 379v218l-63 78h-601l-59 -82v-214h377l-352 -379l-25 -97v-202z" />
-    <glyph glyph-name="sign-out" unicode="&#xf08b;" horiz-adv-x="1568" 
-d="M640 96c0 -28 13 -96 -32 -96h-320c-159 0 -288 129 -288 288v704c0 159 129 288 288 288h320c17 0 32 -15 32 -32c0 -28 13 -96 -32 -96h-320c-88 0 -160 -72 -160 -160v-704c0 -88 72 -160 160 -160h288c25 0 64 5 64 -32zM1568 640c0 -17 -7 -33 -19 -45l-544 -544
-c-12 -12 -28 -19 -45 -19c-35 0 -64 29 -64 64v288h-448c-35 0 -64 29 -64 64v384c0 35 29 64 64 64h448v288c0 35 29 64 64 64c17 0 33 -7 45 -19l544 -544c12 -12 19 -28 19 -45z" />
-    <glyph glyph-name="cube" unicode="&#xf1b2;" horiz-adv-x="1664" 
-d="M896 -93l640 349v636l-640 -233v-752zM832 772l698 254l-698 254l-698 -254zM1664 1024v-768c0 -47 -26 -90 -67 -112l-704 -384c-19 -11 -40 -16 -61 -16s-42 5 -61 16l-704 384c-41 22 -67 65 -67 112v768c0 54 34 102 84 120l704 256c14 5 29 8 44 8s30 -3 44 -8
-l704 -256c50 -18 84 -66 84 -120z" />
-    <glyph glyph-name="mars-stroke-v" unicode="&#xf22a;" horiz-adv-x="1152" 
-d="M640 892c288 -32 512 -276 512 -572c0 -340 -294 -611 -642 -572c-270 30 -486 253 -508 525c-25 317 207 586 510 619v132h-160c-18 0 -32 14 -32 32v64c0 18 14 32 32 32h160v165l-92 -92c-13 -12 -33 -12 -45 0l-46 46c-12 12 -12 32 0 45l202 201c25 25 65 25 90 0
-l202 -201c12 -13 12 -33 0 -45l-46 -46c-12 -12 -32 -12 -45 0l-92 92v-165h160c18 0 32 -14 32 -32v-64c0 -18 -14 -32 -32 -32h-160v-132zM576 -128c247 0 448 201 448 448s-201 448 -448 448s-448 -201 -448 -448s201 -448 448 -448z" />
-    <glyph glyph-name="file-text" unicode="&#xf15c;" 
-d="M1468 1060c10 -10 19 -22 28 -36h-472v472c14 -9 26 -18 36 -28zM992 896h544v-1056c0 -53 -43 -96 -96 -96h-1344c-53 0 -96 43 -96 96v1600c0 53 43 96 96 96h800v-544c0 -53 43 -96 96 -96zM1152 160v64c0 18 -14 32 -32 32h-704c-18 0 -32 -14 -32 -32v-64
-c0 -18 14 -32 32 -32h704c18 0 32 14 32 32zM1152 416v64c0 18 -14 32 -32 32h-704c-18 0 -32 -14 -32 -32v-64c0 -18 14 -32 32 -32h704c18 0 32 14 32 32zM1152 672v64c0 18 -14 32 -32 32h-704c-18 0 -32 -14 -32 -32v-64c0 -18 14 -32 32 -32h704c18 0 32 14 32 32z" />
-    <glyph glyph-name="amazon" unicode="&#xf270;" horiz-adv-x="1736" 
-d="M1523 60c30 15 53 -8 22 -48s-280 -268 -698 -268s-738 286 -836 404c-27 31 4 45 22 33c293 -178 751 -471 1490 -121zM1730 175c15 -20 0 -108 -26 -172c-26 -63 -64 -107 -85 -124c-22 -18 -38 -11 -26 15s77 186 51 220c-26 33 -148 17 -192 13c-43 -4 -52 -8 -56 1
-c-9 23 87 62 150 70c63 7 164 3 184 -23zM1336 618c0 -110 129 -211 129 -211l-227 -224c-89 84 -156 154 -156 154c-10 10 -18 22 -25 33c-181 -283 -734 -265 -734 173c0 408 483 463 678 470v127c0 27 10 150 -142 150c0 0 -152 0 -217 -198l-294 27
-c0 197 187 417 539 417c351 0 449 -228 449 -329v-589zM664 597c0 -203 337 -251 337 69v162c-135 -4 -337 -42 -337 -231z" />
-    <glyph glyph-name="smile-o" unicode="&#xf118;" 
-d="M1134 461c-50 -161 -197 -269 -366 -269s-316 108 -366 269c-11 34 8 69 42 80c33 11 69 -8 80 -42c33 -107 132 -179 244 -179s211 72 244 179c11 34 47 53 81 42c33 -11 52 -46 41 -80zM640 896c0 -71 -57 -128 -128 -128s-128 57 -128 128s57 128 128 128
-s128 -57 128 -128zM1152 896c0 -71 -57 -128 -128 -128s-128 57 -128 128s57 128 128 128s128 -57 128 -128zM1408 640c0 353 -287 640 -640 640s-640 -287 -640 -640s287 -640 640 -640s640 287 640 640zM1536 640c0 -424 -344 -768 -768 -768s-768 344 -768 768
-s344 768 768 768s768 -344 768 -768z" />
-    <glyph glyph-name="compass" unicode="&#xf14e;" 
-d="M640 448l256 128l-256 128v-256zM1024 1039v-542l-512 -256v542zM1312 640c0 300 -244 544 -544 544s-544 -244 -544 -544s244 -544 544 -544s544 244 544 544zM1536 640c0 -424 -344 -768 -768 -768s-768 344 -768 768s344 768 768 768s768 -344 768 -768z" />
-    <glyph glyph-name="address-book" unicode="&#xf2b9;" horiz-adv-x="1664" 
-d="M1201 298c0 177 -43 374 -221 374c-55 -32 -130 -87 -212 -87s-157 55 -212 87c-178 0 -221 -197 -221 -374c0 -99 65 -170 145 -170h576c80 0 145 71 145 170zM1028 892c0 144 -117 260 -260 260s-260 -116 -260 -260c0 -143 117 -259 260 -259s260 116 260 259z
-M1664 352v-192c0 -18 -14 -32 -32 -32h-96v-224c0 -88 -72 -160 -160 -160h-1216c-88 0 -160 72 -160 160v1472c0 88 72 160 160 160h1216c88 0 160 -72 160 -160v-224h96c18 0 32 -14 32 -32v-192c0 -18 -14 -32 -32 -32h-96v-128h96c18 0 32 -14 32 -32v-192
-c0 -18 -14 -32 -32 -32h-96v-128h96c18 0 32 -14 32 -32z" />
-    <glyph glyph-name="list-ol" unicode="&#xf0cb;" horiz-adv-x="1777" 
-d="M366 -84c0 -110 -86 -172 -190 -172c-63 0 -127 21 -172 66l57 88c27 -25 68 -45 106 -45c35 0 72 17 72 57c0 56 -64 59 -105 56l-26 56c36 46 69 97 112 136v1c-32 0 -65 -2 -97 -2v-53h-106v152h333v-88l-95 -115c67 -16 111 -68 111 -137zM368 543v-159h-362
-c-3 18 -6 36 -6 54c0 185 226 213 226 297c0 34 -21 52 -54 52c-35 0 -64 -30 -81 -58l-85 59c33 69 101 108 177 108c93 0 173 -55 173 -154c0 -148 -217 -181 -220 -259h127v60h105zM1777 224v-192c0 -17 -15 -32 -32 -32h-1216c-18 0 -32 15 -32 32v192c0 18 14 32 32 32
-h1216c17 0 32 -14 32 -32zM369 1123v-99h-335v99h107c0 81 1 162 1 243v12h-2c-11 -22 -31 -37 -50 -54l-71 76l136 127h106v-404h108zM1777 736v-192c0 -17 -15 -32 -32 -32h-1216c-18 0 -32 15 -32 32v192c0 18 14 32 32 32h1216c17 0 32 -14 32 -32zM1777 1248v-192
-c0 -17 -15 -32 -32 -32h-1216c-18 0 -32 15 -32 32v192c0 17 14 32 32 32h1216c17 0 32 -15 32 -32z" />
-    <glyph glyph-name="stumbleupon-circle" unicode="&#xf1a3;" 
-d="M866 697l90 27v62c0 106 -90 191 -196 191s-196 -84 -196 -190v-283c0 -26 -21 -47 -47 -47s-46 21 -46 47v120h-151v-122c0 -109 88 -196 197 -196c107 0 196 86 196 193v280c0 26 21 47 47 47c25 0 46 -21 46 -47v-54zM1199 502v122h-150v-126c0 -26 -21 -47 -47 -47
-c-25 0 -46 21 -46 47v123l-90 -26l-60 28v-123c0 -107 89 -194 197 -194s196 87 196 196zM1536 640c0 -424 -344 -768 -768 -768s-768 344 -768 768s344 768 768 768s768 -344 768 -768z" />
-    <glyph glyph-name="slack" unicode="&#xf198;" 
-d="M837 508l-205 69l66 197l205 -68zM979 1344c528 -158 651 -387 493 -915s-387 -651 -915 -493s-651 387 -493 915s387 651 915 493zM1256 671v0c13 41 -9 87 -51 101l-99 34l34 103c13 42 -8 88 -50 101c-47 13 -88 -14 -101 -51l-34 -103l-206 69l35 103
-c13 42 -9 88 -51 101c-47 13 -87 -13 -100 -50l-35 -104c-100 33 -111 39 -126 37c-32 -1 -63 -22 -74 -54c-13 -42 8 -88 50 -101l100 -33l-66 -198c-100 33 -112 39 -127 37c-32 -1 -63 -23 -74 -55c-13 -42 9 -87 51 -100l99 -34l-34 -103c-13 -42 8 -88 50 -101
-s88 9 101 51l34 103l206 -69l-35 -103c-13 -42 9 -88 51 -101s87 8 100 50l35 104l99 -34c42 -13 88 9 101 51s-8 88 -50 101l-100 33l66 198l100 -34c42 -13 88 9 101 51z" />
-    <glyph glyph-name="qq" unicode="&#xf1d6;" horiz-adv-x="1756" 
-d="M252 730c-7 17 -8 34 -8 52c0 28 18 73 35 94c-1 26 10 79 30 96c0 185 143 418 310 498c103 49 211 66 324 66c88 0 184 -21 266 -55c235 -99 288 -283 338 -518l1 -5c29 -44 55 -96 55 -150c0 -27 -18 -54 -18 -78c0 -2 6 -10 7 -12c86 -127 164 -265 164 -423
-c0 -35 -19 -157 -75 -157c-39 0 -82 95 -96 121c-1 1 -2 1 -3 1l-5 -4c-32 -83 -67 -161 -132 -223c57 -55 149 -50 166 -145c-5 -11 -3 -23 -11 -34c-57 -86 -210 -97 -302 -97c-122 0 -221 32 -336 66c-24 7 -60 3 -86 6c-61 -67 -210 -85 -296 -85c-76 0 -370 5 -370 135
-c0 56 12 72 51 108c31 6 54 23 90 25c5 0 9 1 14 2c1 1 2 1 2 4l-2 3c-69 16 -166 190 -181 262l-5 3c-7 0 -10 -15 -12 -20c-22 -51 -74 -106 -132 -112h-1c-8 0 -5 8 -11 10c-14 33 -23 63 -23 100c0 200 96 348 252 466z" />
-    <glyph glyph-name="audio-description" unicode="&#xf29e;" horiz-adv-x="2304" 
-d="M504 542h171l-1 265zM1530 641c0 111 -64 193 -197 193h-54v-388h52c125 0 199 91 199 195zM956 1018l1 -756c0 -19 -15 -34 -33 -34h-216c-18 0 -33 15 -33 34v62h-291l-55 -81c-6 -9 -17 -15 -28 -15h-267c-28 0 -44 31 -27 53l556 757c6 9 16 14 27 14h332
-c19 0 34 -15 34 -34zM1783 641c0 -263 -192 -413 -450 -413h-270c-19 0 -34 15 -34 34v756c0 19 15 34 34 34h268c260 0 452 -148 452 -411zM1939 640c0 0 4 -260 -148 -413h-51c136 162 139 414 139 414s2 198 -135 410h43c148 -169 152 -411 152 -411zM2123 640
-c0 0 4 -260 -149 -413h-51c136 162 139 414 139 414s2 198 -134 410h43c148 -169 152 -411 152 -411zM2304 640c0 0 4 -260 -148 -413h-51c135 162 138 414 138 414s2 198 -134 410h43c148 -169 152 -411 152 -411z" />
-    <glyph glyph-name="stop-circle-o" unicode="&#xf28e;" 
-d="M768 1408c424 0 768 -344 768 -768s-344 -768 -768 -768s-768 344 -768 768s344 768 768 768zM768 96c300 0 544 244 544 544s-244 544 -544 544s-544 -244 -544 -544s244 -544 544 -544zM480 320c-18 0 -32 14 -32 32v576c0 18 14 32 32 32h576c18 0 32 -14 32 -32v-576
-c0 -18 -14 -32 -32 -32h-576z" />
-    <glyph glyph-name="grav" unicode="&#xf2d6;" horiz-adv-x="1794" 
-d="M1291 1060c-32 36 -84 -25 -56 -58c27 -33 116 -9 56 58zM895 814c-11 -11 -28 -11 -38 0c-11 10 -11 27 0 37c10 11 27 11 38 0c10 -10 10 -27 0 -37zM1060 740l-35 -35c-16 -17 -43 -17 -60 0l-38 38c-16 17 -16 43 0 60l35 35c16 16 43 16 60 0l38 -39
-c16 -16 16 -43 0 -59zM951 870c-10 -10 -27 -10 -38 0c-10 11 -10 28 0 38c11 11 28 11 38 0c11 -10 11 -27 0 -38zM1354 968c-45 -85 -163 -120 -235 -69c-72 52 -122 156 -43 246c78 90 147 62 216 -3c43 -41 106 -90 62 -174zM1555 486c9 58 -74 60 -92 93
-c-49 87 -100 133 -197 110c42 29 85 22 85 22c1 23 0 47 -34 90c14 45 1 81 1 81c56 31 97 88 105 156c13 112 -68 214 -180 227c-80 9 -158 -28 -196 -93c-84 -145 5 -256 81 -294c-52 5 -124 43 -145 124c-24 93 10 180 32 222c0 0 -16 21 -29 32c0 0 -50 0 -89 -19
-c43 55 91 52 91 52c0 23 -2 54 -13 78c-20 41 -90 47 -117 -15c1 3 2 5 4 7c-18 -43 -4 -202 61 -315c-9 -5 -33 -22 -47 -36c-78 -35 -203 -218 -203 -218c-102 -39 -280 -184 -256 -288c1 -11 5 -20 11 -27c-10 -8 -20 -18 -30 -30c-43 -50 -19 -127 64 -88
-c57 26 108 73 132 110c0 0 -21 18 -60 16c100 24 125 34 168 33c29 -14 29 124 29 124c0 53 -8 112 -40 150c45 -44 105 -118 101 -219c-3 -66 -55 -83 -55 -83c-33 -60 -156 -238 -110 -383c0 0 -35 54 -37 80c-63 -70 -169 -189 -90 -233c96 -53 394 320 457 514
-c125 75 200 171 231 235c80 -159 346 -343 367 -215zM1794 640c0 -495 -402 -896 -897 -896s-897 401 -897 896s402 896 897 896s897 -401 897 -896z" />
-    <glyph glyph-name="mars-stroke-h" unicode="&#xf22b;" horiz-adv-x="1919" 
-d="M1901 621c25 -25 25 -65 0 -90l-294 -294c-12 -13 -33 -13 -45 0l-45 45c-13 12 -13 33 0 45l185 185h-294v-224c0 -18 -14 -32 -32 -32h-64c-18 0 -32 14 -32 32v224h-132c-32 -288 -276 -512 -572 -512c-340 0 -611 294 -572 642c30 270 253 486 525 508
-c317 25 586 -207 619 -510h132v224c0 18 14 32 32 32h64c18 0 32 -14 32 -32v-224h294l-185 185c-13 12 -13 33 0 45l45 45c12 13 33 13 45 0zM576 128c247 0 448 201 448 448s-201 448 -448 448s-448 -201 -448 -448s201 -448 448 -448z" />
-    <glyph glyph-name="gbp" unicode="&#xf154;" horiz-adv-x="1020" 
-d="M1020 399v-367c0 -18 -14 -32 -32 -32h-956c-18 0 -32 14 -32 32v150c0 17 14 32 32 32h97v383h-95c-18 0 -32 14 -32 32v131c0 18 14 32 32 32h95v223c0 228 184 393 438 393c200 0 329 -120 335 -125c12 -11 13 -30 3 -43l-103 -127c-6 -7 -13 -11 -22 -12
-c-8 -1 -17 2 -23 7c-1 1 -87 69 -188 69c-113 0 -189 -68 -189 -170v-215h305c18 0 32 -14 32 -32v-131c0 -18 -14 -32 -32 -32h-305v-379h414v181c0 18 14 32 32 32h162c18 0 32 -14 32 -32z" />
-    <glyph glyph-name="shaarli-o" unicode="&#xf2f6;" horiz-adv-x="1630" 
-d="M859 1408v0c107 0 210 -67 264 -160c40 -69 61 -156 75 -252c115 -20 212 -47 288 -96c78 -50 134 -137 140 -229l3 -20c7 -91 -25 -191 -100 -245c-18 -13 -36 -22 -55 -30c11 -19 25 -36 34 -56c37 -84 43 -181 12 -267v-1h-1c-26 -70 -82 -133 -154 -160
-s-147 -24 -224 -5c-9 3 -17 5 -25 10c-94 47 -174 101 -239 162c-25 -34 -53 -66 -86 -91c-75 -57 -168 -84 -266 -84c-31 0 -62 -4 -90 5c-82 25 -155 68 -199 141s-44 164 -20 243l1 3l1 3l21 58c-57 19 -109 45 -151 86c-67 66 -95 165 -86 259h-1c0 1 1 2 1 3v7h1
-c8 100 75 193 165 238c87 43 192 57 317 60c6 109 27 206 84 283c66 89 177 135 290 135zM859 1288c-173 0 -260 -116 -260 -348c12 -37 -17 -59 -88 -67c-255 -1 -386 -66 -391 -196c-18 -141 68 -226 258 -253h19l-67 -186c-36 -117 11 -195 141 -235h53
-c155 0 260 80 314 239h37c58 -90 155 -170 294 -239c126 -31 206 -1 239 90c42 114 -12 238 -162 370c196 -10 285 53 264 190c3 117 -118 194 -360 231h-56c-21 269 -99 404 -235 404zM819 1097v0c3 0 6 0 9 -1c50 1 76 -51 76 -156v-188c22 -23 49 -31 84 -25
-c226 0 335 -27 327 -81c10 -49 -110 -65 -361 -48c-12 0 -14 -15 -6 -43c74 -85 140 -151 198 -200c59 -47 69 -92 31 -133c-32 -22 -74 -5 -127 49c-51 54 -117 122 -197 207c-18 24 -40 24 -67 0c-113 -230 -200 -325 -262 -288c-46 24 -23 105 68 242l54 116
-c12 33 -72 45 -250 36c-51 3 -77 22 -77 58c0 37 24 57 71 58l304 17c31 0 48 27 52 81l4 107c-1 131 22 195 69 192z" />
-    <glyph glyph-name="ban" unicode="&#xf05e;" 
-d="M1312 643c0 109 -32 210 -87 295l-754 -753c86 -56 188 -89 297 -89c300 0 544 245 544 547zM313 344l755 754c-86 58 -189 91 -300 91c-300 0 -544 -245 -544 -546c0 -111 33 -213 89 -299zM1536 643c0 -426 -344 -771 -768 -771s-768 345 -768 771
-c0 425 344 770 768 770s768 -345 768 -770z" />
-    <glyph glyph-name="fighter-jet" unicode="&#xf0fb;" horiz-adv-x="1920" 
-d="M1920 576c0 0 0 -32 -288 -96l-352 -32l-224 -64h-64l-293 -352h69c35 0 64 -7 64 -16s-29 -16 -64 -16h-320v32h64v416h-160l-192 -224h-96l-32 32v192h32v32h128v8l-192 24v128l192 24v8h-128v32h-32v192l32 32h96l192 -224h160v416h-64v32h320c35 0 64 -7 64 -16
-s-29 -16 -64 -16h-69l293 -352h64l224 -64l352 -32c288 -64 288 -96 288 -96z" />
-    <glyph glyph-name="space-shuttle" unicode="&#xf197;" horiz-adv-x="2176" 
-d="M620 416c-69 -40 -163 -64 -268 -64h-128v64h-64c-18 0 -32 36 -32 80c0 18 3 35 7 49c-77 2 -135 15 -135 31s58 29 135 31c-4 14 -7 31 -7 49c0 44 14 80 32 80h64v64h128c105 0 199 -24 268 -64h1113c74 -13 141 -24 187 -32c192 -32 256 -96 256 -128
-s-64 -96 -256 -128c-46 -8 -113 -19 -187 -32h-1113zM1739 668c32 -22 53 -55 53 -92s-21 -70 -53 -92l81 -30c41 29 68 73 68 122s-27 93 -68 122zM625 400h1015s-217 -38 -456 -80c-128 0 -224 -96 -224 -96l-288 -288s-97 -64 -160 -64h-96l-93 464h29
-c102 0 199 23 273 64zM352 816h-29l93 464h96c65 0 128 -32 160 -64l288 -288s96 -96 224 -96c239 -42 456 -80 456 -80h-1015c-74 41 -171 64 -273 64z" />
-    <glyph glyph-name="matrix-org" unicode="&#xf313;" 
-d="M40 1373v-1466h106v-35h-146v1536h146v-35h-106zM491 908v-74h2c20 28 44 51 72 66c28 16 60 23 96 23c35 0 66 -7 95 -20s50 -37 65 -71c16 24 38 46 66 64s61 27 99 27c29 0 56 -4 81 -11s45 -18 63 -34s31 -35 41 -60s15 -56 15 -91v-367h-150v311c0 18 -1 36 -2 52
-s-6 30 -12 42s-16 22 -28 29s-29 10 -50 10s-38 -4 -51 -12s-24 -19 -31 -32s-13 -27 -15 -44s-4 -34 -4 -51v-305h-150v307c0 16 0 33 -1 49s-4 30 -9 44c-5 13 -15 24 -27 32s-31 12 -55 12c-7 0 -16 -2 -28 -5s-23 -9 -34 -18s-20 -21 -28 -38s-11 -38 -11 -65v-318h-151
-v548h142zM1496 -93v1466h-106v35h146v-1536h-146v35h106z" />
-    <glyph glyph-name="steam" unicode="&#xf1b6;" horiz-adv-x="1792" 
-d="M1582 954c0 -135 -110 -244 -244 -244c-135 0 -244 109 -244 244s109 244 244 244c134 0 244 -109 244 -244zM812 212c0 139 -111 250 -250 250c-18 0 -36 -2 -54 -6l104 -42c102 -41 152 -156 111 -258s-157 -152 -259 -110c-41 16 -82 33 -123 49
-c42 -79 125 -133 221 -133c139 0 250 111 250 250zM1642 953c0 168 -137 305 -305 305c-169 0 -306 -137 -306 -305c0 -169 137 -305 306 -305c168 0 305 136 305 305zM1792 953c0 -252 -204 -455 -455 -455l-437 -319c-16 -172 -162 -307 -338 -307
-c-162 0 -299 115 -332 268l-230 92v429l389 -157c51 31 110 48 173 48c12 0 24 -1 35 -2l284 407c2 249 206 451 456 451c251 0 455 -204 455 -455z" />
-    <glyph glyph-name="bars" unicode="&#xf0c9;" 
-d="M1536 192v-128c0 -35 -29 -64 -64 -64h-1408c-35 0 -64 29 -64 64v128c0 35 29 64 64 64h1408c35 0 64 -29 64 -64zM1536 704v-128c0 -35 -29 -64 -64 -64h-1408c-35 0 -64 29 -64 64v128c0 35 29 64 64 64h1408c35 0 64 -29 64 -64zM1536 1216v-128
-c0 -35 -29 -64 -64 -64h-1408c-35 0 -64 29 -64 64v128c0 35 29 64 64 64h1408c35 0 64 -29 64 -64z" />
-    <glyph glyph-name="lightbulb-o" unicode="&#xf0eb;" horiz-adv-x="1024" 
-d="M736 960c0 -17 -15 -32 -32 -32s-32 15 -32 32c0 69 -107 96 -160 96c-17 0 -32 15 -32 32s15 32 32 32c93 0 224 -49 224 -160zM896 960c0 200 -203 320 -384 320s-384 -120 -384 -320c0 -64 26 -131 68 -180c19 -22 41 -43 61 -66c71 -85 131 -185 141 -298h228
-c10 113 70 213 141 298c20 23 42 44 61 66c42 49 68 116 68 180zM1024 960c0 -103 -34 -192 -103 -268s-160 -183 -168 -290c29 -17 47 -49 47 -82c0 -24 -9 -47 -25 -64c16 -17 25 -40 25 -64c0 -33 -17 -63 -45 -81c8 -14 13 -31 13 -47c0 -65 -51 -96 -109 -96
-c-26 -58 -84 -96 -147 -96s-121 38 -147 96c-58 0 -109 31 -109 96c0 16 5 33 13 47c-28 18 -45 48 -45 81c0 24 9 47 25 64c-16 17 -25 40 -25 64c0 33 18 65 47 82c-8 107 -99 214 -168 290s-103 165 -103 268c0 272 259 448 512 448s512 -176 512 -448z" />
-    <glyph glyph-name="map-pin" unicode="&#xf276;" horiz-adv-x="1024" 
-d="M512 448c44 0 87 5 128 15v-655c0 -35 -29 -64 -64 -64h-128c-35 0 -64 29 -64 64v655c41 -10 84 -15 128 -15zM512 1536c283 0 512 -229 512 -512s-229 -512 -512 -512s-512 229 -512 512s229 512 512 512zM512 1312c18 0 32 14 32 32s-14 32 -32 32
-c-194 0 -352 -158 -352 -352c0 -18 14 -32 32 -32s32 14 32 32c0 159 129 288 288 288z" />
-    <glyph glyph-name="circle-o" unicode="&#xf10c;" 
-d="M768 1184c-300 0 -544 -244 -544 -544s244 -544 544 -544s544 244 544 544s-244 544 -544 544zM1536 640c0 -424 -344 -768 -768 -768s-768 344 -768 768s344 768 768 768s768 -344 768 -768z" />
-    <glyph glyph-name="contao" unicode="&#xf26d;" horiz-adv-x="1748" 
-d="M116 1408h197c-47 -43 -89 -93 -126 -149c-155 -239 -92 -501 -32 -783c49 -229 90 -447 233 -604h-272c-64 0 -116 52 -116 116v1304c0 64 52 116 116 116zM1324 1408h308c64 0 116 -52 116 -116v-1304c0 -64 -52 -116 -116 -116h-178c132 131 207 321 196 565
-l-469 -101c-6 -111 -44 -218 -196 -250c-85 -18 -155 2 -199 40c-54 46 -97 106 -169 448c-73 343 -58 415 -28 479c25 52 81 100 165 118c153 32 231 -51 282 -150l468 100c-46 118 -107 214 -180 287z" />
-    <glyph glyph-name="vine" unicode="&#xf1ca;" horiz-adv-x="1458" 
-d="M1458 709v-198c-70 -16 -140 -23 -198 -23c-140 -294 -391 -546 -475 -593c-53 -30 -103 -32 -162 3c-103 62 -493 382 -623 1388h283c71 -604 245 -914 436 -1146c106 106 208 247 287 406c-189 96 -304 307 -304 553c0 249 143 437 388 437c238 0 368 -148 368 -403
-c0 -95 -20 -203 -58 -286c0 0 -176 -35 -241 78c13 43 31 117 31 184c0 119 -43 177 -108 177c-69 0 -117 -65 -117 -190c0 -255 162 -401 372 -401c37 0 79 4 121 14z" />
-    <glyph glyph-name="align-center" unicode="&#xf037;" horiz-adv-x="1792" 
-d="M1792 192v-128c0 -35 -29 -64 -64 -64h-1664c-35 0 -64 29 -64 64v128c0 35 29 64 64 64h1664c35 0 64 -29 64 -64zM1408 576v-128c0 -35 -29 -64 -64 -64h-896c-35 0 -64 29 -64 64v128c0 35 29 64 64 64h896c35 0 64 -29 64 -64zM1664 960v-128c0 -35 -29 -64 -64 -64
-h-1408c-35 0 -64 29 -64 64v128c0 35 29 64 64 64h1408c35 0 64 -29 64 -64zM1280 1344v-128c0 -35 -29 -64 -64 -64h-640c-35 0 -64 29 -64 64v128c0 35 29 64 64 64h640c35 0 64 -29 64 -64z" />
-    <glyph glyph-name="btc" unicode="&#xf15a;" horiz-adv-x="1202" 
-d="M1111 896c13 -133 -43 -213 -131 -258c146 -35 238 -122 220 -317c-23 -243 -203 -308 -461 -322v-255h-154v251c-39 0 -80 0 -122 1v-252h-154v255c-36 0 -72 1 -109 1h-200l31 183c113 -2 111 0 111 0c43 0 55 31 58 51v402h16c-6 1 -12 1 -16 1v287
-c-6 32 -26 68 -89 68c0 0 2 2 -111 0v164l212 -1c31 0 64 0 97 1v252h154v-247c41 1 82 2 122 2v245h154v-252c198 -17 355 -78 372 -260zM896 351c0 198 -326 169 -430 169v-338c104 0 430 -22 430 169zM825 827c0 181 -272 154 -359 154v-307c87 0 359 -20 359 153z" />
-    <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 1088v288c0 17 -15 32 -32 32h-64c-17 0 -32 -15 -32 -32v-288c0 -17 15 -32 32 -32h64c17 0 32 15 32 32zM1248 224h288v320h-288v-320zM864 608h320v288h-320v-288zM1248 608h288v288h-288v-288zM1280 1088v288c0 17 -15 32 -32 32h-64c-17 0 -32 -15 -32 -32v-288
-c0 -17 15 -32 32 -32h64c17 0 32 15 32 32zM1664 1152v-1280c0 -70 -58 -128 -128 -128h-1408c-70 0 -128 58 -128 128v1280c0 70 58 128 128 128h128v96c0 88 72 160 160 160h64c88 0 160 -72 160 -160v-96h384v96c0 88 72 160 160 160h64c88 0 160 -72 160 -160v-96h128
-c70 0 128 -58 128 -128z" />
-    <glyph glyph-name="retweet" unicode="&#xf079;" horiz-adv-x="1920" 
-d="M1280 32c0 -17 -15 -32 -32 -32h-960c-37 0 -32 39 -32 64v576h-192c-35 0 -64 29 -64 64c0 15 5 30 15 41l320 384c12 14 30 22 49 22s37 -8 49 -22l320 -384c10 -11 15 -26 15 -41c0 -35 -29 -64 -64 -64h-192v-384h576c9 0 19 -4 25 -11l160 -192c4 -6 7 -14 7 -21z
-M1920 448c0 -15 -5 -30 -15 -41l-320 -384c-12 -14 -30 -23 -49 -23s-37 9 -49 23l-320 384c-10 11 -15 26 -15 41c0 35 29 64 64 64h192v384h-576c-9 0 -19 4 -25 12l-160 192c-4 5 -7 13 -7 20c0 17 15 32 32 32h960c37 0 32 -39 32 -64v-576h192c35 0 64 -29 64 -64z" />
-    <glyph glyph-name="hourglass" unicode="&#xf254;" 
-d="M1504 -64c18 0 32 -14 32 -32v-128c0 -18 -14 -32 -32 -32h-1472c-18 0 -32 14 -32 32v128c0 18 14 32 32 32h1472zM130 0c19 337 294 518 478 640c-184 122 -459 303 -478 640h1276c-19 -337 -294 -518 -478 -640c184 -122 459 -303 478 -640h-1276zM1504 1536
-c18 0 32 -14 32 -32v-128c0 -18 -14 -32 -32 -32h-1472c-18 0 -32 14 -32 32v128c0 18 14 32 32 32h1472z" />
-    <glyph glyph-name="paint-brush" unicode="&#xf1fc;" horiz-adv-x="1790" 
-d="M1615 1536c91 0 175 -68 175 -163c0 -53 -21 -104 -45 -151c-78 -148 -340 -637 -465 -752c-61 -57 -133 -91 -218 -91c-169 0 -307 144 -307 312c0 80 33 158 92 212l638 579c35 32 81 54 130 54zM706 502c52 -101 147 -177 257 -206l1 -71c6 -285 -192 -481 -478 -481
-c-339 0 -486 270 -486 577c37 -25 166 -128 208 -128c25 0 46 14 55 37c85 222 218 262 443 272z" />
-    <glyph glyph-name="viadeo-square" unicode="&#xf2aa;" 
-d="M1050 495c0 50 -9 100 -28 147c-26 -16 -55 -28 -85 -34c16 -36 22 -75 22 -114c0 -154 -114 -280 -270 -280c-157 0 -271 126 -271 280c0 151 115 284 271 284c34 0 67 -6 98 -19c3 30 13 60 27 87c-40 14 -82 21 -125 21c-207 0 -361 -167 -361 -372s155 -367 361 -367
-s361 163 361 367zM872 850c25 -72 38 -148 38 -225c0 -173 -71 -317 -219 -411h-10c-14 0 -28 1 -42 3c199 76 235 377 235 562c0 23 0 47 -2 71zM872 850c-5 97 -60 247 -142 302c56 -95 106 -197 142 -302zM1207 955c0 61 -15 123 -51 174c-24 -51 -69 -94 -124 -109
-c-79 -22 -149 -59 -149 -153c0 -27 9 -54 24 -77c95 22 196 92 236 182c-6 -80 -155 -177 -213 -209c29 -29 67 -52 110 -52c73 0 125 65 150 127c12 30 17 86 17 117zM1536 1120v-960c0 -159 -129 -288 -288 -288h-960c-159 0 -288 129 -288 288v960c0 159 129 288 288 288
-h960c159 0 288 -129 288 -288z" />
-    <glyph glyph-name="tags" unicode="&#xf02c;" horiz-adv-x="1899" 
-d="M448 1088c0 71 -57 128 -128 128s-128 -57 -128 -128s57 -128 128 -128s128 57 128 128zM1515 512c0 -34 -14 -67 -37 -90l-491 -492c-24 -23 -57 -37 -91 -37s-67 14 -90 37l-715 716c-51 50 -91 147 -91 218v416c0 70 58 128 128 128h416c71 0 168 -40 219 -91
-l715 -714c23 -24 37 -57 37 -91zM1899 512c0 -34 -14 -67 -37 -90l-491 -492c-24 -23 -57 -37 -91 -37c-52 0 -78 24 -112 59l470 470c23 23 37 56 37 90s-14 67 -37 91l-715 714c-51 51 -148 91 -219 91h224c71 0 168 -40 219 -91l715 -714c23 -24 37 -57 37 -91z" />
-    <glyph glyph-name="minus-square-o" unicode="&#xf147;" horiz-adv-x="1408" 
-d="M1152 736v-64c0 -18 -14 -32 -32 -32h-832c-18 0 -32 14 -32 32v64c0 18 14 32 32 32h832c18 0 32 -14 32 -32zM1280 288v832c0 88 -72 160 -160 160h-832c-88 0 -160 -72 -160 -160v-832c0 -88 72 -160 160 -160h832c88 0 160 72 160 160zM1408 1120v-832
-c0 -159 -129 -288 -288 -288h-832c-159 0 -288 129 -288 288v832c0 159 129 288 288 288h832c159 0 288 -129 288 -288z" />
-    <glyph glyph-name="user-circle" unicode="&#xf2bd;" horiz-adv-x="1792" 
-d="M1523 197c-26 187 -102 353 -272 376c-88 -96 -215 -157 -355 -157s-267 61 -355 157c-170 -23 -246 -189 -272 -376c139 -196 368 -325 627 -325s488 129 627 325zM1280 896c0 212 -172 384 -384 384s-384 -172 -384 -384s172 -384 384 -384s384 172 384 384zM1792 640
-c0 -493 -400 -896 -896 -896c-495 0 -896 402 -896 896c0 495 401 896 896 896s896 -401 896 -896z" />
-    <glyph glyph-name="thumbs-o-down" unicode="&#xf088;" 
-d="M256 1088c0 35 -29 64 -64 64s-64 -29 -64 -64s29 -64 64 -64s64 29 64 64zM1408 512c0 37 -28 127 -75 128c21 24 35 71 35 103c0 47 -19 87 -53 119c12 21 18 45 18 69c0 46 -23 103 -65 126c3 18 5 37 5 56c0 117 -74 167 -185 167h-128c-118 0 -232 -35 -342 -73
-c-54 -19 -146 -55 -202 -55h-32v-640h32c79 0 198 -171 243 -229c25 -31 49 -62 77 -91c97 -102 64 -255 128 -320c137 0 160 75 160 192c0 118 -96 203 -96 320h352c67 0 128 60 128 128zM1536 511c0 -138 -118 -255 -256 -255h-176c30 -62 48 -122 48 -192
-c0 -66 -4 -126 -35 -186c-49 -97 -149 -134 -253 -134c-34 0 -66 14 -90 37c-100 98 -69 256 -128 321c-38 40 -73 83 -107 127c-30 39 -98 129 -137 155h-274c-71 0 -128 57 -128 128v640c0 71 57 128 128 128h288c28 0 109 30 138 40c144 50 269 88 423 88h112
-c182 0 313 -108 312 -295v-5c39 -50 60 -114 60 -178c0 -14 -1 -29 -3 -43c25 -44 38 -94 38 -144c0 -23 -3 -47 -9 -69c32 -48 49 -105 49 -163z" />
-    <glyph glyph-name="subscript" unicode="&#xf12c;" horiz-adv-x="1531" 
-d="M892 167v-167h-248l-159 252l-24 42c-6 7 -9 14 -11 21h-3c-2 -7 -6 -14 -9 -21c-6 -12 -15 -28 -25 -44l-155 -250h-258v167h128l197 291l-185 272h-137v168h276l139 -228c9 -14 16 -29 23 -42c6 -7 9 -14 11 -21h3c2 7 6 14 11 21l25 42l140 228h257v-168h-125
-l-184 -267l204 -296h109zM1531 -50v-206h-514l-4 27c-1 15 -3 33 -3 46c0 273 350 296 350 441c0 52 -47 87 -100 87c-39 0 -72 -18 -97 -39c-13 -11 -25 -25 -36 -38l-105 92c18 25 38 46 63 66c42 34 103 65 188 65c145 0 246 -85 246 -218c0 -239 -332 -259 -346 -403
-h232v80h126z" />
-    <glyph glyph-name="flickr" unicode="&#xf16e;" 
-d="M1248 1408c159 0 288 -129 288 -288v-960c0 -159 -129 -288 -288 -288h-960c-159 0 -288 129 -288 288v960c0 159 129 288 288 288h960zM698 640c0 117 -95 212 -212 212s-212 -95 -212 -212s95 -212 212 -212s212 95 212 212zM1262 640c0 117 -95 212 -212 212
-s-212 -95 -212 -212s95 -212 212 -212s212 95 212 212z" />
-    <glyph glyph-name="cc-amex" unicode="&#xf1f3;" horiz-adv-x="2304" 
-d="M119 854h89l-45 108zM740 328l74 79l-70 79h-163v-49h142v-55h-142v-54h159zM898 406l99 -110v217zM1186 453c0 24 -18 33 -40 33h-84v-69h83c23 0 41 11 41 36zM1475 457c0 25 -22 29 -42 29h-82v-61h81c22 0 43 5 43 32zM1197 923c0 25 -22 29 -42 29h-82v-60h81
-c22 0 43 5 43 31zM1656 854h89l-44 108zM699 1009v-271h-66v212l-94 -212h-57l-94 212v-212h-132l-25 60h-135l-25 -60h-70l116 271h96l110 -257v257h106l85 -184l77 184h108zM1255 453c0 -109 -119 -91 -193 -91v-91h-126l-80 90l-83 -90h-256v271h260l80 -89l82 89h207
-c61 0 109 -21 109 -89zM964 794v-56h-217v271h217v-57h-152v-49h148v-55h-148v-54h152zM2304 235v-229c0 -73 -59 -134 -132 -134h-2040c-73 0 -132 61 -132 134v678h111l25 61h55l25 -61h218v46l19 -46h113l20 47v-47h541v99l10 1c9 0 10 -7 10 -14v-86h279v23
-c65 -34 154 -23 222 -23l25 61h56l25 -61h227v58l34 -58h182v378h-180v-44l-25 44h-185v-44l-23 44h-249c-37 0 -76 -4 -109 -22v22h-172v-22c-20 18 -47 22 -73 22h-628l-43 -97l-43 97h-198v-44l-22 44h-169l-78 -179v391c0 73 59 134 132 134h2040c73 0 132 -61 132 -134
-v-678h-120c-28 0 -58 -5 -81 -22v22h-177c-25 0 -59 -4 -78 -22v22h-316v-22c-24 17 -59 22 -87 22h-209v-22c-21 20 -64 22 -91 22h-234l-54 -58l-50 58h-349v-378h343l55 59l52 -59h211v89h21c30 0 61 1 90 13v-102h174v99h8c10 0 12 -1 12 -12v-87h529c29 0 65 6 88 24
-v-24h168c32 0 66 3 95 17zM1546 469c0 -30 -16 -60 -46 -72c36 -13 43 -37 43 -72v-54h-65v45c0 46 -15 54 -58 54h-69v-99h-65v271h154c51 0 106 -9 106 -73zM1269 936c0 -31 -17 -61 -46 -73c37 -13 43 -36 43 -72v-53h-65c-1 58 14 98 -58 98h-70v-98h-64v271l153 -1
-c52 0 107 -8 107 -72zM1798 327v-56h-216v271h216v-56h-151v-49h148v-55h-148v-54zM1372 1009v-271h-66v271h66zM2065 357c0 -64 -44 -86 -102 -86h-126v58h126c16 0 34 4 34 25c0 58 -167 -22 -167 107c0 55 42 81 92 81h130v-57h-119c-17 0 -36 -3 -36 -25
-c0 -59 168 27 168 -103zM2304 407v-101c-19 -28 -56 -35 -88 -35h-125v58h125c16 0 33 5 33 25c0 57 -167 -22 -167 107c0 55 43 81 93 81h129v-57h-118c-18 0 -36 -3 -36 -25c0 -48 113 1 154 -53zM2139 1008v-270h-92l-122 203v-203h-132l-26 60h-134l-25 -60h-75
-c-89 0 -129 46 -129 133c0 91 41 138 133 138h63v-59c-68 1 -130 16 -130 -77c0 -46 11 -78 63 -78h29l92 213h97l109 -256v256h99l114 -188v188h66z" />
-    <glyph glyph-name="reddit" unicode="&#xf1a1;" horiz-adv-x="1792" 
-d="M1095 369c9 -9 9 -23 0 -31c-57 -57 -167 -62 -199 -62s-142 5 -199 62c-9 8 -9 22 0 31c8 8 22 8 30 0c36 -37 114 -49 169 -49s132 12 169 49c8 8 22 8 30 0zM788 550c0 -49 -40 -89 -89 -89c-50 0 -90 40 -90 89c0 50 40 90 90 90c49 0 89 -40 89 -90zM1183 550
-c0 -49 -40 -89 -90 -89c-49 0 -89 40 -89 89c0 50 40 90 89 90c50 0 90 -40 90 -90zM1434 670c0 66 -54 119 -120 119c-34 0 -64 -14 -86 -36c-81 56 -190 92 -311 96l63 283l200 -45c0 -49 40 -89 89 -89c50 0 90 41 90 90s-40 90 -90 90c-35 0 -65 -21 -80 -50l-221 49
-c-11 3 -22 -5 -25 -16l-69 -312c-120 -5 -228 -41 -309 -97c-22 23 -53 37 -87 37c-66 0 -120 -53 -120 -119c0 -48 28 -88 68 -108c-4 -18 -6 -37 -6 -56c0 -190 214 -344 477 -344c264 0 478 154 478 344c0 19 -2 39 -7 57c39 20 66 60 66 107zM1792 640
-c0 -495 -401 -896 -896 -896s-896 401 -896 896s401 896 896 896s896 -401 896 -896z" />
-    <glyph glyph-name="times-circle" unicode="&#xf057;" 
-d="M1149 414c0 17 -7 33 -19 45l-181 181l181 181c12 12 19 28 19 45s-7 34 -19 46l-90 90c-12 12 -29 19 -46 19s-33 -7 -45 -19l-181 -181l-181 181c-12 12 -28 19 -45 19s-34 -7 -46 -19l-90 -90c-12 -12 -19 -29 -19 -46s7 -33 19 -45l181 -181l-181 -181
-c-12 -12 -19 -28 -19 -45s7 -34 19 -46l90 -90c12 -12 29 -19 46 -19s33 7 45 19l181 181l181 -181c12 -12 28 -19 45 -19s34 7 46 19l90 90c12 12 19 29 19 46zM1536 640c0 -424 -344 -768 -768 -768s-768 344 -768 768s344 768 768 768s768 -344 768 -768z" />
-    <glyph glyph-name="tripadvisor" unicode="&#xf262;" horiz-adv-x="2304" 
-d="M651 539c0 -52 -42 -94 -93 -94c-52 0 -94 42 -94 94c0 51 42 93 94 93c51 0 93 -42 93 -93zM1805 540c0 -52 -42 -94 -94 -94s-94 42 -94 94s42 93 94 93s94 -41 94 -93zM765 539c0 106 -87 193 -193 193c-107 0 -193 -87 -193 -193c0 -107 86 -193 193 -193
-c106 0 193 86 193 193zM1918 540c0 106 -86 193 -193 193c-106 0 -193 -87 -193 -193c0 -107 87 -193 193 -193c107 0 193 86 193 193zM850 539c0 -154 -124 -279 -278 -279s-279 125 -279 279c0 153 125 278 279 278s278 -125 278 -278zM2004 540
-c0 -154 -125 -278 -279 -278c-153 0 -278 124 -278 278s125 278 278 278c154 0 279 -124 279 -278zM1040 537c0 255 -207 462 -462 462c-254 0 -461 -207 -461 -462s207 -462 461 -462c255 0 462 207 462 462zM1708 1110c-165 72 -351 111 -556 111s-409 -39 -573 -110
-c317 -1 573 -257 573 -574c0 311 247 564 556 573zM2187 537c0 255 -206 462 -461 462s-462 -207 -462 -462s207 -462 462 -462s461 207 461 462zM1921 1103h383c-60 -70 -104 -164 -115 -229c69 -95 110 -211 110 -337c0 -317 -257 -573 -573 -573c-180 0 -340 82 -445 211
-c0 0 -47 -56 -129 -179c-14 29 -85 130 -128 180c-105 -130 -266 -212 -446 -212c-316 0 -573 256 -573 573c0 126 41 242 110 337c-11 65 -55 159 -115 229h365c196 131 481 213 787 213s573 -82 769 -213z" />
-    <glyph glyph-name="sort-amount-asc" unicode="&#xf160;" horiz-adv-x="1760" 
-d="M704 96c0 -9 -4 -17 -10 -24l-319 -319c-7 -6 -15 -9 -23 -9s-16 3 -23 9l-320 320c-9 10 -12 23 -7 35s17 20 30 20h192v1376c0 18 14 32 32 32h192c18 0 32 -14 32 -32v-1376h192c18 0 32 -14 32 -32zM1760 -32v-192c0 -18 -14 -32 -32 -32h-832c-18 0 -32 14 -32 32
-v192c0 18 14 32 32 32h832c18 0 32 -14 32 -32zM1568 480v-192c0 -18 -14 -32 -32 -32h-640c-18 0 -32 14 -32 32v192c0 18 14 32 32 32h640c18 0 32 -14 32 -32zM1376 992v-192c0 -18 -14 -32 -32 -32h-448c-18 0 -32 14 -32 32v192c0 18 14 32 32 32h448
-c18 0 32 -14 32 -32zM1184 1504v-192c0 -18 -14 -32 -32 -32h-256c-18 0 -32 14 -32 32v192c0 18 14 32 32 32h256c18 0 32 -14 32 -32z" />
-    <glyph glyph-name="renren" unicode="&#xf18b;" 
-d="M1133 -34c-109 -60 -234 -94 -368 -94c-133 0 -258 34 -367 94c177 112 320 281 367 479c48 -198 191 -367 368 -479zM638 1394v-485c0 -342 -189 -636 -457 -766c-113 134 -181 306 -181 495c0 380 276 695 638 756zM1536 638c0 -189 -68 -361 -181 -495
-c-268 130 -457 424 -457 766v485c362 -61 638 -376 638 -756z" />
-    <glyph glyph-name="key-modern" unicode="&#xf2f7;" horiz-adv-x="1792" 
-d="M546 1536v0c139 1 278 -52 383 -158c142 -141 187 -343 137 -525l726 -726v-319c0 -35 -29 -64 -64 -64h-300l-45 45l135 226l-46 45l-225 -135l-45 46l134 225l-45 45l-225 -134l-46 45l135 225l-45 46l-243 -139l-186 186c-182 -50 -382 -5 -524 136
-c-211 212 -209 556 4 770c107 106 246 159 385 160zM405 1290v0c-41 0 -82 -16 -113 -47c-63 -63 -63 -163 0 -226s164 -63 227 0s63 163 0 226c-31 31 -73 47 -114 47z" />
-    <glyph glyph-name="arrow-circle-o-right" unicode="&#xf18e;" 
-d="M1152 640c0 -8 -3 -17 -9 -23l-320 -320c-6 -6 -15 -9 -23 -9c-17 0 -32 15 -32 32v192h-352c-17 0 -32 15 -32 32v192c0 17 15 32 32 32h352v192c0 18 14 32 32 32c9 0 17 -4 24 -10l319 -319c6 -6 9 -15 9 -23zM1312 640c0 300 -244 544 -544 544s-544 -244 -544 -544
-s244 -544 544 -544s544 244 544 544zM1536 640c0 -424 -344 -768 -768 -768s-768 344 -768 768s344 768 768 768s768 -344 768 -768z" />
-    <glyph glyph-name="pinterest-p" unicode="&#xf231;" horiz-adv-x="1280" 
-d="M0 939c0 369 338 597 680 597c314 0 600 -216 600 -547c0 -311 -159 -656 -513 -656c-84 0 -190 42 -231 120c-76 -301 -70 -346 -238 -576l-14 -5l-9 10c-6 63 -15 125 -15 188c0 204 94 499 140 697c-25 51 -32 113 -32 169c0 101 70 229 184 229
-c84 0 129 -64 129 -143c0 -130 -88 -252 -88 -378c0 -86 71 -146 154 -146c230 0 301 332 301 509c0 237 -168 366 -395 366c-264 0 -468 -190 -468 -458c0 -129 79 -195 79 -226c0 -26 -19 -118 -52 -118c-5 0 -12 2 -17 3c-143 43 -195 234 -195 365z" />
-    <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="key" unicode="&#xf084;" horiz-adv-x="1683" 
-d="M832 1024c0 106 -86 192 -192 192s-192 -86 -192 -192c0 -29 7 -57 19 -83c-26 12 -54 19 -83 19c-106 0 -192 -86 -192 -192s86 -192 192 -192s192 86 192 192c0 29 -7 57 -19 83c26 -12 54 -19 83 -19c106 0 192 86 192 192zM1683 320c0 -23 -92 -115 -115 -115
-c-26 0 -107 94 -128 115l-96 -96l220 -220c18 -18 28 -43 28 -68c0 -56 -64 -120 -120 -120c-25 0 -50 10 -68 28l-671 671c-105 -78 -233 -131 -365 -131c-218 0 -368 151 -368 368c0 328 328 656 656 656c217 0 368 -150 368 -368c0 -132 -53 -260 -131 -365l355 -355
-l96 96c-21 21 -115 102 -115 128c0 23 92 115 115 115c8 0 17 -4 23 -10c37 -37 316 -300 316 -329z" />
-    <glyph glyph-name="syncthing" unicode="&#xf311;" 
-d="M768 1408c424 0 768 -344 768 -768s-344 -768 -768 -768s-768 344 -768 768s344 768 768 768zM774 1254c-337 0 -611 -274 -611 -611c0 -10 0 -28 1 -38c-17 -10 -32 -23 -42 -41c-33 -56 -14 -128 41 -161c18 -10 37 -15 56 -16c97 -210 309 -355 555 -355
-c108 0 210 28 298 78c16 -11 35 -19 56 -21c65 -5 122 42 129 107v10c0 14 -5 36 -11 49c87 105 139 241 139 388c0 57 -8 112 -23 164c14 13 25 30 32 49c21 61 -12 128 -73 149c-12 4 -26 6 -38 6v0c-6 0 -15 0 -21 -1c-112 148 -289 244 -488 244zM774 1175v0
-c171 0 323 -79 420 -204c-10 -11 -17 -24 -22 -39c-9 -27 -8 -55 1 -80l-224 -186c-18 11 -39 16 -60 16c-22 0 -44 -5 -63 -18c-26 -16 -43 -42 -50 -70l-447 -41c-10 21 -25 39 -46 52c-13 8 -27 12 -41 14c0 8 -1 16 -1 24c0 295 238 532 533 532zM1224 792
-c6 -3 15 -7 21 -9c15 -5 29 -8 44 -7c11 -43 17 -87 17 -133c0 -125 -42 -240 -114 -331c-13 7 -28 11 -43 13c-15 1 -28 0 -42 -4l-122 175c23 32 29 73 15 110zM783 516c2 -4 5 -11 8 -15c29 -44 81 -63 129 -50l122 -175c-12 -16 -19 -37 -21 -59v-9c0 -10 2 -26 5 -35
-c-75 -40 -161 -63 -252 -63c-211 0 -394 123 -480 301c10 8 24 22 30 33c5 8 11 22 13 31z" />
-    <glyph glyph-name="picture-o" unicode="&#xf03e;" horiz-adv-x="1920" 
-d="M640 960c0 -106 -86 -192 -192 -192s-192 86 -192 192s86 192 192 192s192 -86 192 -192zM1664 576v-448h-1408v192l320 320l160 -160l512 512zM1760 1280h-1600c-17 0 -32 -15 -32 -32v-1216c0 -17 15 -32 32 -32h1600c17 0 32 15 32 32v1216c0 17 -15 32 -32 32z
-M1920 1248v-1216c0 -88 -72 -160 -160 -160h-1600c-88 0 -160 72 -160 160v1216c0 88 72 160 160 160h1600c88 0 160 -72 160 -160z" />
-    <glyph glyph-name="list-alt" unicode="&#xf022;" horiz-adv-x="1792" 
-d="M384 352v-64c0 -17 -15 -32 -32 -32h-64c-17 0 -32 15 -32 32v64c0 17 15 32 32 32h64c17 0 32 -15 32 -32zM384 608v-64c0 -17 -15 -32 -32 -32h-64c-17 0 -32 15 -32 32v64c0 17 15 32 32 32h64c17 0 32 -15 32 -32zM384 864v-64c0 -17 -15 -32 -32 -32h-64
-c-17 0 -32 15 -32 32v64c0 17 15 32 32 32h64c17 0 32 -15 32 -32zM1536 352v-64c0 -17 -15 -32 -32 -32h-960c-17 0 -32 15 -32 32v64c0 17 15 32 32 32h960c17 0 32 -15 32 -32zM1536 608v-64c0 -17 -15 -32 -32 -32h-960c-17 0 -32 15 -32 32v64c0 17 15 32 32 32h960
-c17 0 32 -15 32 -32zM1536 864v-64c0 -17 -15 -32 -32 -32h-960c-17 0 -32 15 -32 32v64c0 17 15 32 32 32h960c17 0 32 -15 32 -32zM1664 160v832c0 17 -15 32 -32 32h-1472c-17 0 -32 -15 -32 -32v-832c0 -17 15 -32 32 -32h1472c17 0 32 15 32 32zM1792 1248v-1088
-c0 -88 -72 -160 -160 -160h-1472c-88 0 -160 72 -160 160v1088c0 88 72 160 160 160h1472c88 0 160 -72 160 -160z" />
-    <glyph glyph-name="fort-awesome" unicode="&#xf286;" horiz-adv-x="1664" 
-d="M640 528v224c0 9 -7 16 -16 16h-96c-9 0 -16 -7 -16 -16v-224c0 -9 7 -16 16 -16h96c9 0 16 7 16 16zM1152 528v224c0 9 -7 16 -16 16h-96c-9 0 -16 -7 -16 -16v-224c0 -9 7 -16 16 -16h96c9 0 16 7 16 16zM1664 496v-752h-640v320c0 106 -86 192 -192 192
-s-192 -86 -192 -192v-320h-640v752c0 9 7 16 16 16h96c9 0 16 -7 16 -16v-112h128v624c0 9 7 16 16 16h96c9 0 16 -7 16 -16v-112h128v112c0 9 7 16 16 16h96c9 0 16 -7 16 -16v-112h128v112c0 21 28 16 41 16v391c-19 9 -32 29 -32 50c0 30 25 55 55 55s55 -25 55 -55
-c0 -21 -13 -41 -32 -50v-17c27 6 55 10 83 10c41 0 80 -15 114 -15c31 0 66 15 84 15c9 0 16 -7 16 -16v-210c0 -24 -81 -28 -97 -28c-37 0 -72 15 -110 15c-30 0 -61 -5 -90 -12v-133c13 0 41 5 41 -16v-112h128v112c0 9 7 16 16 16h96c9 0 16 -7 16 -16v-112h128v112
-c0 9 7 16 16 16h96c9 0 16 -7 16 -16v-624h128v112c0 9 7 16 16 16h96c9 0 16 -7 16 -16z" />
-    <glyph glyph-name="c" unicode="&#xf31c;" horiz-adv-x="1404" 
-d="M996 819c0 0 -23 211 -232 217s-317 -157 -317 -392s119 -423 323 -423s226 235 226 235l391 -24s22 -211 -141 -373s-364 -188 -504 -187s-334 -2 -522 190s-220 379 -220 563s36 427 259 611c152 125 306 172 460 172c643 0 685 -593 685 -593l-408 4v0z" />
-    <glyph glyph-name="commenting" unicode="&#xf27a;" horiz-adv-x="1792" 
-d="M640 640c0 71 -57 128 -128 128s-128 -57 -128 -128s57 -128 128 -128s128 57 128 128zM1024 640c0 71 -57 128 -128 128s-128 -57 -128 -128s57 -128 128 -128s128 57 128 128zM1408 640c0 71 -57 128 -128 128s-128 -57 -128 -128s57 -128 128 -128s128 57 128 128z
-M1792 640c0 -354 -401 -640 -896 -640c-73 0 -144 6 -211 18c-114 -114 -263 -192 -435 -229c-27 -5 -56 -10 -86 -13c-16 -2 -31 9 -35 24c-4 16 8 26 20 37c63 59 138 106 164 317c-191 117 -313 291 -313 486c0 354 401 640 896 640s896 -286 896 -640z" />
-    <glyph glyph-name="tablet" unicode="&#xf10a;" horiz-adv-x="1152" 
-d="M640 128c0 35 -29 64 -64 64s-64 -29 -64 -64s29 -64 64 -64s64 29 64 64zM1024 288v960c0 17 -15 32 -32 32h-832c-17 0 -32 -15 -32 -32v-960c0 -17 15 -32 32 -32h832c17 0 32 15 32 32zM1152 1248v-1088c0 -88 -72 -160 -160 -160h-832c-88 0 -160 72 -160 160v1088
-c0 88 72 160 160 160h832c88 0 160 -72 160 -160z" />
-    <glyph glyph-name="credit-card" unicode="&#xf09d;" horiz-adv-x="1920" 
-d="M1760 1408c88 0 160 -72 160 -160v-1216c0 -88 -72 -160 -160 -160h-1600c-88 0 -160 72 -160 160v1216c0 88 72 160 160 160h1600zM160 1280c-17 0 -32 -15 -32 -32v-224h1664v224c0 17 -15 32 -32 32h-1600zM1760 0c17 0 32 15 32 32v608h-1664v-608
-c0 -17 15 -32 32 -32h1600zM256 128v128h256v-128h-256zM640 128v128h384v-128h-384z" />
-    <glyph glyph-name="minus" unicode="&#xf068;" horiz-adv-x="1408" 
-d="M1408 800v-192c0 -53 -43 -96 -96 -96h-1216c-53 0 -96 43 -96 96v192c0 53 43 96 96 96h1216c53 0 96 -43 96 -96z" />
-    <glyph glyph-name="unlock-alt" unicode="&#xf13e;" horiz-adv-x="1152" 
-d="M1056 768c53 0 96 -43 96 -96v-576c0 -53 -43 -96 -96 -96h-960c-53 0 -96 43 -96 96v576c0 53 43 96 96 96h32v320c0 247 201 448 448 448s448 -201 448 -448c0 -35 -29 -64 -64 -64h-64c-35 0 -64 29 -64 64c0 141 -115 256 -256 256s-256 -115 -256 -256v-320h736z
-" />
-    <glyph glyph-name="ils" unicode="&#xf20b;" horiz-adv-x="1376" 
-d="M992 912v-496c0 -18 -14 -32 -32 -32h-160c-18 0 -32 14 -32 32v496c0 150 -122 272 -272 272h-272v-1152c0 -18 -14 -32 -32 -32h-160c-18 0 -32 14 -32 32v1344c0 18 14 32 32 32h464c274 0 496 -222 496 -496zM1376 1376v-880c0 -274 -222 -496 -496 -496h-464
-c-18 0 -32 14 -32 32v960c0 18 14 32 32 32h160c18 0 32 -14 32 -32v-768h272c150 0 272 122 272 272v880c0 18 14 32 32 32h160c18 0 32 -14 32 -32z" />
-    <glyph glyph-name="cog" unicode="&#xf013;" 
-d="M1024 640c0 141 -115 256 -256 256s-256 -115 -256 -256s115 -256 256 -256s256 115 256 256zM1536 749v-222c0 -15 -12 -33 -28 -36l-185 -28c-11 -32 -23 -62 -39 -91c34 -49 70 -93 107 -138c6 -7 10 -16 10 -25s-3 -16 -9 -23c-24 -32 -159 -179 -193 -179
-c-9 0 -18 4 -26 9l-138 108c-29 -15 -60 -28 -91 -38c-7 -61 -13 -126 -29 -186c-4 -16 -18 -28 -36 -28h-222c-18 0 -34 13 -36 30l-28 184c-31 10 -61 22 -90 37l-141 -107c-7 -6 -16 -9 -25 -9s-18 4 -25 11c-53 48 -123 110 -165 168c-5 7 -7 15 -7 23c0 9 3 16 8 23
-c34 46 71 90 105 137c-17 32 -31 65 -41 99l-183 27c-17 3 -29 19 -29 36v222c0 15 12 33 27 36l186 28c10 32 23 62 39 92c-34 48 -70 93 -107 138c-6 7 -10 15 -10 24s4 16 9 23c24 33 159 179 193 179c9 0 18 -4 26 -10l138 -107c29 15 60 28 91 38c7 61 13 126 29 186
-c4 16 18 28 36 28h222c18 0 34 -13 36 -30l28 -184c31 -10 61 -22 90 -37l142 107c6 6 15 9 24 9s18 -4 25 -10c53 -49 123 -111 165 -170c5 -6 7 -14 7 -22c0 -9 -3 -16 -8 -23c-34 -46 -71 -90 -105 -137c17 -32 31 -65 41 -98l183 -28c17 -3 29 -19 29 -36z" />
-    <glyph glyph-name="arrow-right" unicode="&#xf061;" horiz-adv-x="1472" 
-d="M1472 576c0 -34 -13 -67 -37 -91l-651 -651c-24 -23 -57 -37 -91 -37s-66 14 -90 37l-75 75c-24 24 -38 57 -38 91s14 67 38 91l293 293h-704c-72 0 -117 60 -117 128v128c0 68 45 128 117 128h704l-293 294c-24 23 -38 56 -38 90s14 67 38 90l75 75c24 24 56 38 90 38
-s67 -14 91 -38l651 -651c24 -23 37 -56 37 -90z" />
-    <glyph glyph-name="cc-paypal" unicode="&#xf1f4;" horiz-adv-x="2304" 
-d="M745 630c0 -49 -39 -86 -88 -86c-37 0 -64 21 -64 60c0 49 38 88 87 88c37 0 65 -23 65 -62zM1530 779c0 -60 -36 -72 -88 -72l-32 -1l17 107c1 7 6 11 13 11h18c34 0 72 -2 72 -45zM1881 630c0 -49 -39 -86 -87 -86c-37 0 -65 21 -65 60c0 49 38 88 87 88
-c37 0 65 -23 65 -62zM513 801c0 84 -65 112 -139 112h-160c-10 0 -20 -8 -21 -19l-65 -408c-1 -8 5 -16 13 -16h76c11 0 21 8 22 19l18 110c4 29 53 19 72 19c114 0 184 68 184 183zM822 489l41 261c1 8 -5 16 -13 16h-76c-15 0 -16 -22 -17 -33c-23 34 -57 40 -95 40
-c-98 0 -173 -86 -173 -181c0 -78 49 -129 127 -129c36 0 81 16 106 44c-2 -6 -4 -15 -4 -21c0 -9 4 -16 13 -16h69c11 0 20 8 22 19zM1269 752c0 7 -6 14 -13 14h-77c-7 0 -14 -4 -18 -10l-106 -156l-44 150c-3 9 -12 16 -22 16h-75c-7 0 -13 -7 -13 -14
-c0 -5 78 -231 85 -252c-11 -15 -82 -108 -82 -120c0 -7 6 -13 13 -13h77c7 0 14 4 18 10l255 368c2 2 2 4 2 7zM1649 801c0 84 -65 112 -139 112h-159c-11 0 -21 -8 -22 -19l-65 -408c-1 -8 5 -16 13 -16h82c8 0 14 6 16 13l18 116c4 29 53 19 72 19c114 0 184 68 184 183z
-M1958 489l41 261c1 8 -5 16 -13 16h-76c-15 0 -16 -22 -17 -33c-22 34 -56 40 -95 40c-98 0 -173 -86 -173 -181c0 -78 49 -129 127 -129c37 0 82 16 106 44c-1 -6 -4 -15 -4 -21c0 -9 4 -16 13 -16h69c11 0 20 8 22 19zM2176 898v1c0 8 -6 14 -13 14h-74
-c-6 0 -12 -5 -13 -11l-65 -416l-1 -2c0 -7 6 -14 14 -14h66c10 0 20 8 21 19zM392 764c-8 -51 -42 -57 -86 -57l-33 -1l17 107c1 7 7 11 13 11h19c45 0 79 -6 70 -60zM2304 1280v-1280c0 -70 -58 -128 -128 -128h-2048c-70 0 -128 58 -128 128v1280c0 70 58 128 128 128
-h2048c70 0 128 -58 128 -128z" />
-    <glyph glyph-name="birthday-cake" unicode="&#xf1fd;" horiz-adv-x="1792" 
-d="M1792 128v-384h-1792v384c98 0 150 44 191 79c34 30 57 49 108 49s73 -19 108 -49c41 -35 92 -79 191 -79c98 0 149 44 191 79c34 30 56 49 107 49s74 -19 108 -49c41 -35 93 -79 191 -79s150 44 191 79c34 30 57 49 108 49c50 0 73 -19 107 -49c41 -35 93 -79 191 -79z
-M1792 448v-192c-51 0 -73 19 -108 49c-41 35 -92 79 -190 79c-99 0 -150 -44 -191 -79c-35 -30 -57 -49 -108 -49s-74 19 -108 49c-41 35 -92 79 -191 79c-98 0 -149 -44 -191 -79c-34 -30 -56 -49 -107 -49s-74 19 -108 49c-41 35 -93 79 -191 79c-99 0 -150 -44 -191 -79
-c-34 -30 -57 -49 -108 -49v192c0 106 86 192 192 192h64v448h256v-448h256v448h256v-448h256v448h256v-448h64c106 0 192 -86 192 -192zM512 1312c0 -106 -57 -160 -128 -160s-128 57 -128 128c0 124 128 92 128 256c48 0 128 -118 128 -224zM1024 1312
-c0 -106 -57 -160 -128 -160s-128 57 -128 128c0 124 128 92 128 256c48 0 128 -118 128 -224zM1536 1312c0 -106 -57 -160 -128 -160s-128 57 -128 128c0 124 128 92 128 256c48 0 128 -118 128 -224z" />
-    <glyph glyph-name="comment" unicode="&#xf075;" horiz-adv-x="1792" 
-d="M1792 640c0 -354 -401 -640 -896 -640c-49 0 -98 3 -145 8c-131 -116 -287 -198 -460 -242c-36 -10 -75 -17 -114 -22c-22 -2 -43 14 -48 38v1c-5 25 12 40 27 58c63 71 135 131 182 298c-206 117 -338 298 -338 501c0 353 401 640 896 640s896 -286 896 -640z" />
-    <glyph glyph-name="bell" unicode="&#xf0f3;" horiz-adv-x="1664" 
-d="M848 -160c0 9 -7 16 -16 16c-79 0 -144 65 -144 144c0 9 -7 16 -16 16s-16 -7 -16 -16c0 -97 79 -176 176 -176c9 0 16 7 16 16zM182 128h1300c-179 202 -266 476 -266 832c0 129 -122 320 -384 320s-384 -191 -384 -320c0 -356 -87 -630 -266 -832zM1664 128
-c0 -70 -58 -128 -128 -128h-448c0 -141 -115 -256 -256 -256s-256 115 -256 256h-448c-70 0 -128 58 -128 128c148 125 320 349 320 832c0 192 159 402 424 441c-5 12 -8 25 -8 39c0 53 43 96 96 96s96 -43 96 -96c0 -14 -3 -27 -8 -39c265 -39 424 -249 424 -441
-c0 -483 172 -707 320 -832z" />
-    <glyph glyph-name="cc" unicode="&#xf20a;" horiz-adv-x="2048" 
-d="M785 528h207c-19 -211 -140 -339 -313 -339c-216 0 -347 166 -347 432c0 264 144 429 326 429c200 0 312 -124 329 -334h-203c-7 85 -49 134 -117 134c-75 0 -120 -80 -120 -238c0 -115 20 -223 129 -223c69 0 101 60 109 139zM1497 528h206
-c-19 -211 -139 -339 -312 -339c-216 0 -347 166 -347 432c0 264 144 429 326 429c200 0 312 -124 329 -334h-204c-6 85 -49 134 -116 134c-75 0 -120 -80 -120 -238c0 -115 19 -223 128 -223c69 0 102 60 110 139zM1856 647c0 268 -14 384 -76 468c-13 17 -34 28 -51 40
-c-63 46 -356 63 -697 63s-648 -17 -710 -63c-18 -13 -40 -23 -53 -40c-62 -83 -75 -200 -75 -468c0 -269 14 -385 75 -468c14 -19 35 -27 53 -41c62 -46 369 -65 710 -65s634 18 697 65c17 13 39 21 51 41c63 82 76 199 76 468zM2048 1408v-1536h-2048v1536h2048z" />
-    <glyph glyph-name="get-pocket" unicode="&#xf265;" horiz-adv-x="1720" 
-d="M1565 1408c87 0 155 -70 155 -156v-519c0 -479 -383 -861 -859 -861c-478 0 -861 382 -861 861v519c0 85 71 156 156 156h1409zM861 344c30 0 60 12 82 33l404 388c23 22 37 53 37 85c0 65 -53 118 -118 118c-31 0 -60 -12 -82 -33l-323 -310l-323 310
-c-22 21 -51 33 -81 33c-65 0 -118 -53 -118 -118c0 -32 13 -63 36 -85l405 -388c21 -21 51 -33 81 -33z" />
-    <glyph glyph-name="bell-slash-o" unicode="&#xf1f7;" horiz-adv-x="2019" 
-d="M1026 -160c0 9 -7 16 -16 16c-79 0 -144 65 -144 144c0 9 -7 16 -16 16s-16 -7 -16 -16c0 -97 79 -176 176 -176c9 0 16 7 16 16zM489 315l877 760c-50 105 -166 205 -356 205c-262 0 -384 -191 -384 -320c0 -256 -45 -470 -137 -645zM1842 128c0 -70 -58 -128 -128 -128
-h-448c0 -141 -115 -256 -256 -256s-255 114 -256 255l149 129h757c-111 125 -186 277 -227 459l111 97c51 -298 182 -458 298 -556zM1928 1520l84 -96c11 -14 10 -34 -3 -46l-1872 -1622c-13 -11 -34 -10 -45 4l-84 96c-11 14 -10 34 3 45l186 161c-12 20 -19 42 -19 66
-c148 125 320 349 320 832c0 192 159 402 424 441c-5 12 -8 25 -8 39c0 53 43 96 96 96s96 -43 96 -96c0 -14 -3 -27 -8 -39c172 -25 299 -122 367 -240l418 363c13 11 34 10 45 -4z" />
-    <glyph glyph-name="header" unicode="&#xf1dc;" horiz-adv-x="1668" 
-d="M1620 -128c-88 0 -177 7 -266 7c-88 0 -176 -7 -264 -7c-34 0 -50 37 -50 66c0 89 100 51 152 85c33 21 33 105 33 140l-1 391c0 11 0 21 -1 31c-16 5 -34 4 -50 4h-675c-17 0 -35 1 -51 -4c-1 -10 -1 -20 -1 -31l-1 -371c0 -38 0 -142 37 -164c52 -32 170 13 170 -77
-c0 -30 -14 -70 -49 -70c-93 0 -186 7 -278 7c-85 0 -170 -7 -255 -7c-33 0 -48 38 -48 66c0 87 92 51 141 85c32 22 33 108 33 143l-1 57v813c0 48 7 202 -38 229c-50 31 -157 -17 -157 73c0 29 13 70 48 70c92 0 185 -7 277 -7c84 0 169 7 253 7c36 0 50 -40 50 -70
-c0 -86 -99 -44 -148 -75c-35 -21 -35 -124 -35 -160l1 -320c0 -11 0 -21 1 -32c13 -3 26 -3 39 -3h699c12 0 25 0 38 3c1 11 1 21 1 32l1 320c0 37 0 139 -35 160c-50 30 -150 -10 -150 75c0 30 14 70 50 70c88 0 176 -7 264 -7c86 0 172 7 258 7c36 0 50 -40 50 -70
-c0 -87 -103 -43 -153 -74c-34 -22 -35 -125 -35 -161l1 -943c0 -33 2 -120 34 -140c51 -32 159 9 159 -78c0 -29 -13 -70 -48 -70z" />
-    <glyph glyph-name="bluetooth-b" unicode="&#xf294;" horiz-adv-x="944" 
-d="M556 113l173 172l-173 172v-344zM556 823l173 172l-173 172v-344zM588 640l356 -356l-539 -540v711l-297 -296l-108 108l372 373l-372 373l108 108l297 -296v711l539 -540z" />
-    <glyph glyph-name="linux" unicode="&#xf17c;" horiz-adv-x="1523" 
-d="M657 1125c-20 -2 -13 -20 -24 -20c-10 -1 -8 22 24 20zM744 1111c-10 -3 -11 16 -29 11c29 13 39 -7 29 -11zM393 684c-9 3 -7 -15 -16 -29c-7 -13 -25 -23 -11 -25c5 -1 19 11 25 25c5 17 10 26 2 29zM1248 325c0 18 -39 35 -55 42c27 90 15 126 -3 211
-c-14 64 -73 151 -119 178c12 -10 34 -39 57 -83c40 -75 80 -186 54 -278c-10 -36 -34 -41 -50 -42c-70 -8 -29 84 -58 209c-33 140 -67 150 -75 161c-41 182 -86 164 -99 232c-11 61 53 111 -34 128c-27 5 -65 32 -80 34s-23 101 33 104c55 4 65 -62 55 -88
-c-16 -26 1 -36 28 -27c22 7 8 65 13 73c-14 84 -49 96 -85 103c-138 -11 -76 -163 -90 -149c-20 21 -78 2 -78 15c1 78 -25 123 -61 124c-40 1 -56 -55 -58 -87c-3 -30 17 -93 32 -88c10 3 27 23 9 22c-9 0 -23 22 -25 48c-1 26 9 52 43 51c39 -1 39 -79 35 -82
-c-13 -9 -29 -26 -31 -29c-13 -21 -38 -27 -48 -36c-17 -18 -21 -38 -8 -45c46 -26 31 -56 95 -58c42 -2 73 6 102 15c22 7 93 22 108 48c7 11 15 11 20 8c10 -5 12 -24 -13 -30c-35 -10 -70 -29 -102 -41c-31 -13 -41 -18 -70 -23c-66 -12 -115 24 -71 -19
-c15 -14 29 -23 67 -22c84 3 177 104 186 59c2 -10 -26 -22 -48 -33c-78 -38 -133 -114 -183 -88c-45 24 -90 135 -89 85c1 -77 -101 -145 -54 -233c-31 -8 -100 -155 -110 -231c-6 -44 4 -98 -7 -128c-15 -44 -83 42 -61 147c4 18 0 22 -5 13c-27 -49 -12 -118 10 -166
-c9 -21 32 -30 49 -48c35 -40 173 -142 197 -167c31 -29 22 -97 -42 -104c33 -62 65 -68 64 -169c38 20 23 64 7 92c-11 20 -25 29 -22 34c2 3 22 20 33 7c34 -38 98 -45 166 -36c69 8 143 32 177 87c16 26 27 35 34 30c8 -4 11 -22 10 -52c-1 -32 -14 -65 -23 -92
-c-9 -31 -12 -52 18 -53c8 56 24 111 28 167c5 64 -41 182 9 241c13 16 29 18 51 18c3 80 126 74 167 41zM620 1152c4 25 -8 43 -14 45c-12 3 -10 -15 -4 -13c4 0 9 -6 7 -15c-2 -12 -1 -20 8 -20c1 0 3 0 3 3zM1039 955c-4 19 -18 12 -34 22c-19 12 -23 32 -30 25
-c-21 -23 26 -71 46 -75c12 -2 21 14 18 28zM861 1168c1 24 -20 36 -25 35c-13 -1 -9 -7 -3 -9c8 -2 16 -16 18 -31c0 -2 10 2 10 5zM915 1401c1 5 -12 11 -21 18c-8 8 -16 15 -24 15c-20 -2 -10 -23 -13 -33c-4 -11 -19 -20 -9 -28c9 -7 15 11 34 18c5 2 28 -1 33 10z
-M1480 60c123 -76 -46 -139 -119 -176c-57 -29 -133 -93 -161 -120c-21 -20 -108 -30 -157 -5c-57 29 -27 75 -115 78c-44 1 -87 1 -130 1c-38 -1 -76 -3 -115 -4c-132 -3 -145 -88 -230 -85c-58 2 -131 48 -257 74c-88 18 -173 23 -191 62s22 83 25 121c3 51 -38 120 -8 146
-c26 23 81 6 117 26c38 22 54 39 54 86c14 -48 -1 -87 -32 -106c-19 -12 -54 -18 -83 -15c-23 2 -37 -1 -43 -10c-9 -11 -6 -31 5 -57s24 -43 22 -75c-1 -32 -37 -70 -31 -97c2 -10 12 -19 37 -26c40 -11 113 -22 184 -39c79 -20 161 -56 212 -49c152 21 65 184 41 223
-c-129 202 -214 334 -282 282c-17 -14 -18 34 -17 53c3 66 36 90 56 141c38 97 67 208 125 265c43 56 111 147 124 195c-11 104 -14 214 -16 310c-2 103 14 193 130 256c28 15 65 21 104 21c69 1 146 -19 195 -55c78 -58 127 -181 121 -269c-4 -69 8 -140 30 -214
-c26 -87 67 -148 133 -218c79 -84 141 -249 159 -354c16 -98 -6 -159 -27 -162c-32 -5 -52 -106 -152 -102c-64 3 -70 41 -88 74c-29 51 -58 35 -69 -19c-6 -27 -2 -67 7 -97c18 -63 12 -122 1 -195c-21 -138 97 -164 176 -98c78 65 95 75 193 109c149 51 99 96 19 123
-c-72 24 -75 145 -49 168c6 -130 74 -149 102 -167z" />
-    <glyph glyph-name="table" unicode="&#xf0ce;" horiz-adv-x="1664" 
-d="M512 160v192c0 18 -14 32 -32 32h-320c-18 0 -32 -14 -32 -32v-192c0 -18 14 -32 32 -32h320c18 0 32 14 32 32zM512 544v192c0 18 -14 32 -32 32h-320c-18 0 -32 -14 -32 -32v-192c0 -18 14 -32 32 -32h320c18 0 32 14 32 32zM1024 160v192c0 18 -14 32 -32 32h-320
-c-18 0 -32 -14 -32 -32v-192c0 -18 14 -32 32 -32h320c18 0 32 14 32 32zM512 928v192c0 18 -14 32 -32 32h-320c-18 0 -32 -14 -32 -32v-192c0 -18 14 -32 32 -32h320c18 0 32 14 32 32zM1024 544v192c0 18 -14 32 -32 32h-320c-18 0 -32 -14 -32 -32v-192
-c0 -18 14 -32 32 -32h320c18 0 32 14 32 32zM1536 160v192c0 18 -14 32 -32 32h-320c-18 0 -32 -14 -32 -32v-192c0 -18 14 -32 32 -32h320c18 0 32 14 32 32zM1024 928v192c0 18 -14 32 -32 32h-320c-18 0 -32 -14 -32 -32v-192c0 -18 14 -32 32 -32h320c18 0 32 14 32 32z
-M1536 544v192c0 18 -14 32 -32 32h-320c-18 0 -32 -14 -32 -32v-192c0 -18 14 -32 32 -32h320c18 0 32 14 32 32zM1536 928v192c0 18 -14 32 -32 32h-320c-18 0 -32 -14 -32 -32v-192c0 -18 14 -32 32 -32h320c18 0 32 14 32 32zM1664 1248v-1088c0 -88 -72 -160 -160 -160
-h-1344c-88 0 -160 72 -160 160v1088c0 88 72 160 160 160h1344c88 0 160 -72 160 -160z" />
-    <glyph glyph-name="handshake-o" unicode="&#xf2b5;" horiz-adv-x="2304" 
-d="M192 384c84 0 84 128 0 128s-84 -128 0 -128zM1665 442c-79 103 -156 208 -246 302l-125 -140c-110 -125 -307 -122 -414 6c-76 92 -76 224 2 315l177 206c-62 32 -137 21 -204 21c-59 0 -116 -24 -158 -66l-158 -158h-155v-544c44 0 84 6 119 -28l297 -292
-c61 -59 140 -111 227 -111c45 0 93 15 125 47c75 -26 162 16 185 93c48 -4 92 11 127 44c23 21 53 63 50 96c9 -9 31 -10 43 -10c119 0 181 125 108 219zM1824 384h96v512h-93l-157 180c-42 48 -105 76 -169 76h-167c-56 0 -110 -25 -146 -67l-209 -243
-c-37 -44 -37 -106 -1 -150c57 -68 162 -69 221 -3l193 218c46 51 130 3 109 -62c38 -44 79 -87 116 -131c50 -62 98 -127 147 -190c31 -40 54 -88 60 -140zM2112 384c84 0 84 128 0 128s-84 -128 0 -128zM2304 960v-640c0 -35 -29 -64 -64 -64h-434
-c-36 -87 -115 -145 -207 -158c-43 -63 -109 -111 -183 -127c-55 -70 -144 -112 -233 -106c-165 -93 -351 -12 -474 109l-287 282h-358c-35 0 -64 29 -64 64v672c0 35 29 64 64 64h421c116 116 196 224 370 224h117c65 0 128 -20 181 -56c53 36 116 56 181 56h167
-c190 0 269 -124 384 -256h355c35 0 64 -29 64 -64z" />
-    <glyph glyph-name="spinner" unicode="&#xf110;" horiz-adv-x="1664" 
-d="M462 142c0 -70 -57 -128 -128 -128c-70 0 -128 58 -128 128c0 71 58 128 128 128c71 0 128 -57 128 -128zM960 -64c0 -71 -57 -128 -128 -128s-128 57 -128 128s57 128 128 128s128 -57 128 -128zM256 640c0 -71 -57 -128 -128 -128s-128 57 -128 128s57 128 128 128
-s128 -57 128 -128zM1458 142c0 -70 -58 -128 -128 -128c-71 0 -128 58 -128 128c0 71 57 128 128 128c70 0 128 -57 128 -128zM494 1138c0 -88 -72 -160 -160 -160s-160 72 -160 160s72 160 160 160s160 -72 160 -160zM1664 640c0 -71 -57 -128 -128 -128s-128 57 -128 128
-s57 128 128 128s128 -57 128 -128zM1024 1344c0 -106 -86 -192 -192 -192s-192 86 -192 192s86 192 192 192s192 -86 192 -192zM1554 1138c0 -124 -101 -224 -224 -224c-124 0 -224 100 -224 224c0 123 100 224 224 224c123 0 224 -101 224 -224z" />
-    <glyph glyph-name="snapchat" unicode="&#xf2ab;" 
-d="M1279 388c0 14 -8 24 -22 27c-91 20 -160 83 -198 167c-3 8 -7 16 -7 25c0 45 125 36 125 100c0 27 -33 44 -57 44c-23 0 -41 -16 -63 -16c-4 0 -8 1 -12 2c2 38 5 76 5 114c0 35 -2 83 -17 114c-48 104 -141 165 -255 165c-125 0 -220 -46 -275 -165
-c-15 -31 -17 -79 -17 -114c0 -38 3 -76 5 -114c-4 -2 -9 -2 -14 -2c-23 0 -41 15 -62 15c-25 0 -56 -16 -56 -44c0 -62 125 -54 125 -99c0 -9 -4 -17 -7 -25c-39 -84 -106 -147 -198 -167c-14 -3 -22 -13 -22 -27c0 -46 106 -63 137 -68c9 -24 5 -66 41 -66c25 0 50 9 77 9
-c105 0 133 -95 255 -95c127 0 151 95 257 95c27 0 52 -8 78 -8c35 0 31 42 40 65c31 5 137 22 137 68zM1536 640c0 -424 -344 -768 -768 -768s-768 344 -768 768s344 768 768 768s768 -344 768 -768z" />
-    <glyph glyph-name="tint" unicode="&#xf043;" horiz-adv-x="1024" 
-d="M512 384c0 25 -8 49 -20 69c-13 20 -66 88 -87 155c-3 11 -13 16 -21 16s-18 -5 -21 -16c-21 -67 -74 -135 -87 -155c-12 -20 -20 -44 -20 -69c0 -71 57 -128 128 -128s128 57 128 128zM1024 512c0 -283 -229 -512 -512 -512s-512 229 -512 512c0 101 31 195 81 275
-c51 80 265 351 346 621c13 43 53 64 85 64s73 -21 85 -64c81 -270 295 -541 346 -621s81 -174 81 -275z" />
-    <glyph glyph-name="connectdevelop" unicode="&#xf20e;" horiz-adv-x="2048" 
-d="M2048 641c0 -28 -20 -51 -46 -56l-205 -356c2 -6 3 -12 3 -18c0 -27 -19 -50 -45 -55l-193 -337c2 -5 3 -10 3 -16c0 -31 -25 -57 -57 -57c-16 0 -31 7 -41 18h-400c-10 -12 -26 -20 -43 -20s-33 8 -43 20h-399c-10 -12 -25 -20 -43 -20c-31 0 -57 25 -57 57
-c0 7 2 14 4 20l-193 335c-26 5 -45 28 -45 55c0 7 1 12 3 18l-206 356c-26 6 -45 29 -45 56c0 28 20 51 47 56l199 344c0 2 -1 4 -1 6c0 23 14 42 34 51l209 363c-2 5 -4 12 -4 18c0 32 26 57 57 57c18 0 33 -8 44 -21h396c10 13 25 21 43 21s33 -8 43 -21h398
-c11 13 26 21 44 21c31 0 57 -25 57 -57c0 -6 -2 -12 -4 -18l207 -358c30 -1 55 -26 55 -56c0 -10 -3 -19 -7 -27l187 -324c25 -5 44 -28 44 -55zM1063 -158h389l-342 354h-143l-342 -354h360c10 9 24 16 39 16s29 -7 39 -16zM112 654c1 -4 1 -8 1 -13s0 -10 -2 -15l208 -360
-c5 -1 10 -4 15 -6l188 199v347l-187 194c-9 -6 -19 -9 -29 -10zM986 1438h-388l190 -200l554 200h-280c-10 -10 -23 -16 -38 -16s-28 6 -38 16zM1689 226c1 4 3 8 5 11l-64 68l-17 -79h76zM1583 226l22 105l-252 266l-296 -307l63 -64h463zM1495 -142l16 28l65 310h-427
-l333 -343c4 2 8 4 13 5zM578 -158h5l342 354h-373v-335l4 -6c9 -3 16 -7 22 -13zM552 226h402l64 66l-309 321l-157 -166v-221zM359 226h163v189l-168 -177c2 -4 4 -8 5 -12zM358 1051c0 -1 1 -3 1 -4c0 -11 -3 -21 -8 -29l171 -177v269zM552 1121v-311l153 -157l297 314
-l-223 236zM556 1425l-4 -8v-264l205 74l-191 201c-3 -1 -6 -2 -10 -3zM1447 1438h-16l-621 -224l213 -225zM1023 946l-297 -315l311 -319l296 307zM688 634l-136 141v-284zM1038 270l-42 -44h85zM1374 618l238 -251l132 624l-3 5l-1 1zM1718 1018c-5 8 -8 18 -8 29v2
-l-216 376c-5 1 -9 3 -13 5l-437 -463l310 -327zM522 1142v223l-163 -282zM522 196h-163l163 -283v283zM1607 196l-48 -227l130 227h-82zM1729 266l207 361c-1 5 -2 9 -2 14c0 6 2 11 3 16l-171 296l-129 -612l77 -82c5 3 10 5 15 7z" />
-    <glyph glyph-name="chrome" unicode="&#xf268;" horiz-adv-x="1792" 
-d="M893 1536c153 1 309 -38 451 -120c157 -91 276 -222 352 -372l-742 39c-210 12 -410 -106 -479 -304l-276 424c172 214 430 332 694 333zM146 1131l337 -663c95 -187 296 -301 504 -262l-230 -451c-429 66 -757 437 -757 885c0 181 54 350 146 491zM1732 962
-c157 -404 0 -874 -388 -1098c-157 -91 -330 -128 -498 -119l405 623c115 177 113 408 -24 568zM896 942c167 0 302 -135 302 -302s-135 -302 -302 -302s-302 135 -302 302s135 302 302 302z" />
-    <glyph glyph-name="trademark" unicode="&#xf25c;" horiz-adv-x="1972" 
-d="M857 992v-117c0 -17 -15 -31 -32 -31h-298v-812c0 -18 -14 -32 -31 -32h-135c-18 0 -32 14 -32 32v812h-297c-18 0 -32 14 -32 31v117c0 18 14 32 32 32h793c17 0 32 -14 32 -32zM1895 995l77 -961c1 -9 -2 -17 -8 -24c-6 -6 -14 -10 -23 -10h-134c-16 0 -30 13 -31 29
-l-46 588l-189 -425c-5 -12 -16 -19 -29 -19h-120c-12 0 -23 7 -29 19l-188 427l-45 -590c-1 -16 -15 -29 -31 -29h-135c-9 0 -17 4 -23 10c-6 7 -9 15 -9 24l78 961c1 16 15 29 31 29h142c13 0 24 -8 29 -19l220 -520c7 -16 14 -34 20 -51c7 17 13 35 20 51l221 520
-c5 11 16 19 29 19h141c17 0 31 -13 32 -29z" />
-    <glyph glyph-name="align-right" unicode="&#xf038;" horiz-adv-x="1792" 
-d="M1792 192v-128c0 -35 -29 -64 -64 -64h-1664c-35 0 -64 29 -64 64v128c0 35 29 64 64 64h1664c35 0 64 -29 64 -64zM1792 576v-128c0 -35 -29 -64 -64 -64h-1280c-35 0 -64 29 -64 64v128c0 35 29 64 64 64h1280c35 0 64 -29 64 -64zM1792 960v-128
-c0 -35 -29 -64 -64 -64h-1536c-35 0 -64 29 -64 64v128c0 35 29 64 64 64h1536c35 0 64 -29 64 -64zM1792 1344v-128c0 -35 -29 -64 -64 -64h-1152c-35 0 -64 29 -64 64v128c0 35 29 64 64 64h1152c35 0 64 -29 64 -64z" />
-    <glyph glyph-name="bandcamp" unicode="&#xf2d5;" horiz-adv-x="1792" 
-d="M1070 358l306 564h-654l-306 -564h654zM1792 640c0 -495 -401 -896 -896 -896s-896 401 -896 896s401 896 896 896s896 -401 896 -896z" />
-    <glyph glyph-name="long-arrow-down" unicode="&#xf175;" horiz-adv-x="767" 
-d="M765 237c5 -12 3 -25 -5 -35l-350 -384c-6 -6 -14 -10 -23 -10s-18 4 -24 10l-355 384c-8 10 -10 23 -5 35c5 11 16 19 29 19h224v1248c0 18 14 32 32 32h192c18 0 32 -14 32 -32v-1248h224c13 0 24 -7 29 -19z" />
-    <glyph glyph-name="beer" unicode="&#xf0fc;" horiz-adv-x="1600" 
-d="M576 640v384h-256v-256c0 -71 57 -128 128 -128h128zM1600 192v-192h-1152v192l128 192h-128c-212 0 -384 172 -384 384v320l-64 64l32 128h480l32 128h960l32 -192l-64 -32v-800z" />
-    <glyph glyph-name="th-list" unicode="&#xf00b;" horiz-adv-x="1792" 
-d="M512 288v-192c0 -53 -43 -96 -96 -96h-320c-53 0 -96 43 -96 96v192c0 53 43 96 96 96h320c53 0 96 -43 96 -96zM512 800v-192c0 -53 -43 -96 -96 -96h-320c-53 0 -96 43 -96 96v192c0 53 43 96 96 96h320c53 0 96 -43 96 -96zM1792 288v-192c0 -53 -43 -96 -96 -96h-960
-c-53 0 -96 43 -96 96v192c0 53 43 96 96 96h960c53 0 96 -43 96 -96zM512 1312v-192c0 -53 -43 -96 -96 -96h-320c-53 0 -96 43 -96 96v192c0 53 43 96 96 96h320c53 0 96 -43 96 -96zM1792 800v-192c0 -53 -43 -96 -96 -96h-960c-53 0 -96 43 -96 96v192c0 53 43 96 96 96
-h960c53 0 96 -43 96 -96zM1792 1312v-192c0 -53 -43 -96 -96 -96h-960c-53 0 -96 43 -96 96v192c0 53 43 96 96 96h960c53 0 96 -43 96 -96z" />
-    <glyph glyph-name="eraser" unicode="&#xf12d;" horiz-adv-x="1920" 
-d="M896 128l336 384h-768l-336 -384h768zM1909 1205c20 -46 12 -99 -21 -137l-896 -1024c-24 -28 -59 -44 -96 -44h-768c-50 0 -96 29 -117 75c-20 46 -12 99 21 137l896 1024c24 28 59 44 96 44h768c50 0 96 -29 117 -75z" />
-    <glyph glyph-name="codepen" 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
-c0 -25 -13 -50 -34 -64l-819 -546c-13 -8 -28 -13 -43 -13s-30 5 -43 13l-819 546c-21 14 -34 39 -34 64v546c0 25 13 50 34 64l819 546c13 8 28 13 43 13s30 -5 43 -13l819 -546c21 -14 34 -39 34 -64z" />
-    <glyph glyph-name="slideshare" unicode="&#xf1e7;" horiz-adv-x="1758" 
-d="M856 796c0 -111 -97 -202 -216 -202s-216 91 -216 202c0 112 97 202 216 202s216 -90 216 -202zM1358 796c0 -111 -96 -202 -216 -202c-119 0 -216 91 -216 202c0 112 97 202 216 202c120 0 216 -90 216 -202zM1583 616v667c0 115 -37 160 -143 160h-1112
-c-111 0 -142 -38 -142 -160v-673c237 -124 440 -102 551 -98c47 1 77 -8 95 -27c3 -3 6 -6 10 -9c21 -20 41 -36 61 -51c4 55 35 90 118 87c113 -5 321 -27 562 104zM1746 621c-64 -79 -186 -176 -372 -252c197 -671 -481 -778 -470 -434c0 -6 -1 185 -1 327
-c-15 3 -30 7 -48 11c0 -143 -1 -344 -1 -338c11 -344 -667 -237 -470 434c-186 76 -308 173 -372 252c-32 48 3 99 56 62c7 -5 15 -10 22 -15v694c0 96 72 174 161 174h1257c89 0 161 -78 161 -174v-694l21 15c53 37 88 -14 56 -62z" />
-    <glyph glyph-name="square-o" unicode="&#xf096;" horiz-adv-x="1408" 
-d="M1120 1280h-832c-88 0 -160 -72 -160 -160v-832c0 -88 72 -160 160 -160h832c88 0 160 72 160 160v832c0 88 -72 160 -160 160zM1408 1120v-832c0 -159 -129 -288 -288 -288h-832c-159 0 -288 129 -288 288v832c0 159 129 288 288 288h832c159 0 288 -129 288 -288z" />
-    <glyph glyph-name="hourglass-start" unicode="&#xf251;" 
-d="M1408 1408c0 -370 -177 -638 -373 -768c196 -130 373 -398 373 -768h96c18 0 32 -14 32 -32v-64c0 -18 -14 -32 -32 -32h-1472c-18 0 -32 14 -32 32v64c0 18 14 32 32 32h96c0 370 177 638 373 768c-196 130 -373 398 -373 768h-96c-18 0 -32 14 -32 32v64
-c0 18 14 32 32 32h1472c18 0 32 -14 32 -32v-64c0 -18 -14 -32 -32 -32h-96zM1280 1408h-1024c0 -44 3 -87 9 -128h1006c6 41 9 84 9 128zM1280 -128c0 359 -198 624 -397 704h-230c-199 -80 -397 -345 -397 -704h1024z" />
-    <glyph glyph-name="superpowers" unicode="&#xf2dd;" horiz-adv-x="1792" 
-d="M1473 607c18 320 -227 585 -544 604c-315 19 -594 -221 -612 -538c-18 -320 227 -585 545 -604c315 -19 594 220 611 538zM1792 1536l-349 -348c159 -155 245 -371 231 -593c-22 -372 -308 -669 -675 -719l-999 -132l347 347c-159 155 -244 371 -231 593
-c23 373 308 670 676 720c333 44 667 88 1000 132z" />
-    <glyph glyph-name="fire" unicode="&#xf06d;" horiz-adv-x="1408" 
-d="M1408 -160v-64c0 -17 -15 -32 -32 -32h-1344c-17 0 -32 15 -32 32v64c0 17 15 32 32 32h1344c17 0 32 -15 32 -32zM1152 896c0 -383 -448 -417 -448 -672c0 -70 35 -163 67 -224l-4 1l1 -1c-276 127 -512 302 -512 640c0 383 448 417 448 672c0 70 -35 163 -66 224l3 -1
-l-1 1c276 -127 512 -302 512 -640z" />
-    <glyph glyph-name="sellsy" unicode="&#xf213;" horiz-adv-x="2048" 
-d="M1500 165v733c0 28 -23 51 -50 51h-93c-27 0 -50 -23 -50 -51v-733c0 -27 23 -50 50 -50h93c27 0 50 23 50 50zM1216 165v531c0 27 -23 50 -50 50h-101c-27 0 -50 -23 -50 -50v-531c0 -27 23 -50 50 -50h101c27 0 50 23 50 50zM924 165v429c0 27 -23 50 -50 50h-101
-c-27 0 -50 -23 -50 -50v-429c0 -27 23 -50 50 -50h101c27 0 50 23 50 50zM632 165v362c0 27 -23 50 -50 50h-101c-27 0 -50 -23 -50 -50v-362c0 -27 23 -50 50 -50h101c27 0 50 23 50 50zM2048 311c0 -222 -181 -402 -402 -402h-1244c-221 0 -402 180 -402 402
-c0 155 91 297 231 363c-7 24 -10 49 -10 73c0 151 123 274 274 274c66 0 130 -24 180 -67c60 244 280 417 532 417c302 0 548 -246 548 -548c0 -41 -4 -82 -14 -122c180 -44 307 -206 307 -390z" />
-    <glyph glyph-name="fast-forward" unicode="&#xf050;" horiz-adv-x="1792" 
-d="M45 -115c-25 -25 -45 -16 -45 19v1472c0 35 20 44 45 19l710 -710c6 -6 10 -12 13 -19v710c0 35 20 44 45 19l710 -710c6 -6 10 -12 13 -19v678c0 35 29 64 64 64h128c35 0 64 -29 64 -64v-1408c0 -35 -29 -64 -64 -64h-128c-35 0 -64 29 -64 64v678
-c-3 -7 -7 -13 -13 -19l-710 -710c-25 -25 -45 -16 -45 19v710c-3 -7 -7 -13 -13 -19z" />
-    <glyph glyph-name="bell-slash" unicode="&#xf1f6;" horiz-adv-x="2019" 
-d="M1544 684c51 -298 182 -458 298 -556c0 -70 -58 -128 -128 -128h-448c0 -141 -115 -256 -256 -256s-255 114 -256 255zM1010 -176c9 0 16 7 16 16s-7 16 -16 16c-79 0 -144 65 -144 144c0 9 -7 16 -16 16s-16 -7 -16 -16c0 -97 79 -176 176 -176zM2012 1424
-c11 -14 10 -34 -3 -46l-1872 -1622c-13 -11 -34 -10 -45 4l-84 96c-11 14 -10 34 3 45l186 161c-12 20 -19 42 -19 66c148 125 320 349 320 832c0 192 159 402 424 441c-5 12 -8 25 -8 39c0 53 43 96 96 96s96 -43 96 -96c0 -14 -3 -27 -8 -39c172 -25 299 -122 367 -240
-l418 363c13 11 34 10 45 -4z" />
-    <glyph glyph-name="cubes" unicode="&#xf1b3;" horiz-adv-x="2176" 
-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-416
-c0 -48 -27 -93 -71 -114l-448 -224c-18 -10 -37 -14 -57 -14s-39 4 -57 14l-448 224c-3 1 -5 2 -7 4c-2 -2 -4 -3 -7 -4l-448 -224c-18 -10 -37 -14 -57 -14s-39 4 -57 14l-448 224c-44 21 -71 66 -71 114v416c0 51 31 97 78 118l434 186v400c0 51 31 97 78 118l448 192
-c16 7 33 10 50 10s34 -3 50 -10l448 -192c47 -21 78 -67 78 -118v-400l434 -186c48 -21 78 -67 78 -118z" />
-    <glyph glyph-name="inr" unicode="&#xf156;" horiz-adv-x="898" 
-d="M898 1066v-102c0 -18 -14 -32 -32 -32h-168c-31 -192 -178 -317 -405 -344c149 -159 308 -351 459 -536c8 -9 10 -23 4 -34c-5 -11 -16 -18 -29 -18h-195c-10 0 -19 4 -25 12c-161 193 -309 370 -498 571c-6 6 -9 14 -9 22v127c0 17 14 32 32 32h112
-c176 0 286 59 315 168h-427c-18 0 -32 14 -32 32v102c0 18 14 32 32 32h413c-38 75 -128 113 -268 113h-145c-18 0 -32 15 -32 32v133c0 18 14 32 32 32h832c18 0 32 -14 32 -32v-102c0 -18 -14 -32 -32 -32h-233c32 -41 53 -89 64 -144h171c18 0 32 -14 32 -32z" />
-    <glyph glyph-name="hashtag" unicode="&#xf292;" horiz-adv-x="1728" 
-d="M959 512l64 256h-254l-64 -256h254zM1727 1016l-56 -224c-4 -14 -16 -24 -31 -24h-327l-64 -256h311c10 0 19 -5 25 -12c6 -8 9 -18 6 -28l-56 -224c-3 -14 -16 -24 -31 -24h-327l-81 -328c-4 -14 -17 -24 -31 -24h-224c-10 0 -20 5 -26 12c-6 8 -8 18 -6 28l78 312h-254
-l-81 -328c-4 -14 -17 -24 -31 -24h-225c-9 0 -19 5 -25 12c-6 8 -8 18 -6 28l78 312h-311c-10 0 -19 5 -25 12c-6 8 -8 18 -6 28l56 224c4 14 16 24 31 24h327l64 256h-311c-10 0 -19 5 -25 12c-6 8 -9 18 -6 28l56 224c3 14 16 24 31 24h327l81 328c4 14 17 24 32 24h224
-c9 0 19 -5 25 -12c6 -8 8 -18 6 -28l-78 -312h254l81 328c4 14 17 24 32 24h224c9 0 19 -5 25 -12c6 -8 8 -18 6 -28l-78 -312h311c10 0 19 -5 25 -12c6 -8 8 -18 6 -28z" />
-    <glyph glyph-name="file-text-o" unicode="&#xf0f6;" 
-d="M1468 1156c37 -37 68 -111 68 -164v-1152c0 -53 -43 -96 -96 -96h-1344c-53 0 -96 43 -96 96v1600c0 53 43 96 96 96h896c53 0 127 -31 164 -68zM1024 1400v-376h376c-6 17 -15 34 -22 41l-313 313c-7 7 -24 16 -41 22zM1408 -128v1024h-416c-53 0 -96 43 -96 96v416
-h-768v-1536h1280zM384 736c0 18 14 32 32 32h704c18 0 32 -14 32 -32v-64c0 -18 -14 -32 -32 -32h-704c-18 0 -32 14 -32 32v64zM1120 512c18 0 32 -14 32 -32v-64c0 -18 -14 -32 -32 -32h-704c-18 0 -32 14 -32 32v64c0 18 14 32 32 32h704zM1120 256c18 0 32 -14 32 -32
-v-64c0 -18 -14 -32 -32 -32h-704c-18 0 -32 14 -32 32v64c0 18 14 32 32 32h704z" />
-    <glyph glyph-name="nextcloud" unicode="&#xf306;" horiz-adv-x="1792" 
-d="M896 1049c225 0 409 -184 409 -409s-184 -409 -409 -409s-409 184 -409 409s184 409 409 409zM896 891c-139 0 -251 -112 -251 -251s112 -251 251 -251s251 112 251 251s-112 251 -251 251zM265 905c146 0 265 -119 265 -265s-119 -265 -265 -265s-265 119 -265 265
-s119 265 265 265zM265 748c-60 0 -107 -48 -107 -108s47 -108 107 -108s108 48 108 108s-48 108 -108 108zM1527 905c146 0 265 -119 265 -265s-119 -265 -265 -265s-265 119 -265 265s119 265 265 265zM1527 748c-60 0 -108 -48 -108 -108s48 -108 108 -108s107 48 107 108
-s-47 108 -107 108z" />
-    <glyph glyph-name="hand-o-left" unicode="&#xf0a5;" horiz-adv-x="1792" 
-d="M1376 128h32v640h-32c-106 0 -177 90 -241 163c-41 46 -79 92 -112 145c-14 22 -26 45 -38 68s-62 136 -89 136c-85 0 -160 -32 -160 -128c0 -128 96 -193 96 -256h-576c-67 0 -128 -60 -128 -128c0 -69 59 -128 128 -128h331c-21 -24 -35 -71 -35 -103
-c0 -47 19 -87 53 -119c-12 -21 -18 -45 -18 -69c0 -46 23 -103 65 -126c-3 -18 -4 -37 -4 -56c0 -118 73 -167 184 -167c199 0 369 128 544 128zM1664 192c0 35 -29 64 -64 64s-64 -29 -64 -64s29 -64 64 -64s64 29 64 64zM1792 768v-640c0 -71 -57 -128 -128 -128h-288
-c-63 0 -162 -37 -223 -59c-102 -37 -207 -69 -317 -69c-184 0 -318 104 -317 295l1 5c-40 50 -61 114 -61 178c0 14 1 29 3 43c-21 37 -34 77 -37 119h-169c-140 0 -256 117 -256 257c0 138 118 255 256 255h374c-15 41 -22 84 -22 128c0 169 129 256 288 256
-c134 0 177 -171 235 -264c30 -47 64 -88 100 -129c29 -33 97 -119 145 -119h288c71 0 128 -57 128 -128z" />
-    <glyph glyph-name="vimeo" unicode="&#xf27d;" horiz-adv-x="1628" 
-d="M1627 1018c-7 -158 -118 -375 -332 -651c-222 -287 -408 -431 -562 -431c-95 0 -175 88 -240 263c-44 160 -88 321 -132 482c-48 175 -101 262 -157 262c-12 0 -54 -25 -127 -76l-77 98c80 71 159 143 238 212c106 94 187 141 241 146c127 12 204 -74 234 -259
-c31 -200 54 -325 66 -373c37 -166 76 -249 120 -249c34 0 85 53 154 161c68 108 104 190 109 246c9 93 -27 139 -109 139c-39 0 -79 -9 -121 -26c80 262 233 389 459 382c167 -5 246 -114 236 -326z" />
-    <glyph glyph-name="mastodon-alt" unicode="&#xf2e2;" 
-d="M766 1408h5c211 -2 413 -25 531 -79c0 0 234 -105 234 -462c0 0 3 -263 -33 -446c-23 -116 -202 -243 -408 -268c-108 -13 -214 -25 -327 -20c-185 8 -330 45 -330 45c0 -18 1 -36 3 -52c24 -182 181 -193 329 -198c150 -5 284 37 284 37l6 -135s-105 -57 -292 -67
-c-103 -6 -230 3 -379 42c-323 85 -380 430 -388 779c-3 104 -1 201 -1 283c0 357 235 462 235 462c118 54 320 77 531 79v0zM350 839c-64 0 -115 -52 -115 -116s51 -115 115 -115s116 51 116 115s-52 116 -116 116v0zM768 839c-64 0 -116 -52 -116 -116s52 -115 116 -115
-s116 51 116 115s-52 116 -116 116v0zM1186 839c-64 0 -116 -52 -116 -116s52 -115 116 -115s115 51 115 115s-51 116 -115 116v0z" />
-    <glyph glyph-name="strikethrough" unicode="&#xf0cc;" horiz-adv-x="1792" 
-d="M1760 640c18 0 32 -14 32 -32v-64c0 -18 -14 -32 -32 -32h-1728c-18 0 -32 14 -32 32v64c0 18 14 32 32 32h1728zM483 704c-19 24 -36 51 -51 80c-32 65 -48 128 -48 188c0 122 45 224 134 309s220 127 393 127c38 0 93 -7 167 -19c44 -8 103 -24 177 -48
-c7 -26 14 -66 21 -118c9 -79 14 -140 14 -183c0 -14 -2 -29 -5 -45l-12 -3l-84 6l-14 2c-34 101 -69 169 -103 205c-59 61 -130 91 -210 91c-76 0 -137 -20 -182 -59s-67 -88 -67 -146c0 -49 22 -95 66 -140s137 -88 279 -129c48 -14 105 -36 173 -66c36 -17 68 -34 95 -52
-h-743zM990 448h411c5 -28 7 -59 7 -92c0 -72 -13 -143 -41 -212c-15 -37 -38 -71 -71 -104c-24 -23 -60 -50 -109 -81c-50 -30 -100 -53 -153 -66c-53 -14 -120 -21 -203 -21c-55 0 -121 2 -195 23l-140 40c-39 11 -62 20 -72 28c-4 4 -8 11 -8 22v13c0 8 2 60 -2 156
-c-2 50 2 85 2 105v44l102 2c37 -85 54 -136 65 -154c24 -39 51 -70 80 -94s64 -43 105 -57c40 -15 85 -22 132 -22c42 0 89 9 139 27c51 17 92 46 122 86c31 40 47 83 47 129c0 56 -27 108 -81 157c-22 19 -68 43 -137 71z" />
-    <glyph glyph-name="ravelry" unicode="&#xf2d9;" horiz-adv-x="2080" 
-d="M1095 -197c-4 1 -7 2 -11 4c0 0 -329 193 -440 505c-37 6 -115 24 -175 37c87 -283 329 -499 626 -546zM454 409l168 -28c-57 171 -64 366 -64 366c-67 -65 -103 -154 -121 -224c3 -39 8 -77 17 -114zM564 1018c-31 -46 -56 -96 -77 -148c33 35 60 58 74 68
-c-2 30 3 80 3 80zM2001 584c0 436 -352 790 -784 790c-200 0 -382 -76 -521 -201c-21 -41 -35 -93 -45 -160c213 181 593 136 593 136c95 -4 84 -88 83 -114c-346 29 -516 -70 -684 -213c0 0 33 -320 109 -450c438 -20 771 218 771 218c42 30 79 33 87 -19
-c6 -42 9 -99 -39 -121c-146 -68 -307 -111 -467 -134c-104 -15 -162 -19 -317 -16c148 -344 518 -438 518 -438c116 -19 204 -4 263 15c256 130 433 398 433 707zM2075 621c-7 -68 -18 -147 -40 -212c-90 -267 -215 -441 -500 -600c-26 -18 -54 -35 -82 -44
-c-51 -18 -106 -22 -163 -16c-24 -2 -48 -3 -73 -3c-381 0 -703 260 -800 615c-3 0 -6 1 -9 1c-23 -180 110 -423 110 -423s8 -12 54 -82c-255 135 -262 533 -262 533c-61 23 -273 95 -310 154c0 0 166 -91 309 -109c-1 1 2 32 2 32c9 122 51 217 94 290
-c28 137 90 261 176 365c15 62 39 136 81 214c18 34 35 56 81 77c304 142 604 178 912 18c295 -154 455 -476 420 -810z" />
-    <glyph glyph-name="code-fork" unicode="&#xf126;" horiz-adv-x="1024" 
-d="M288 64c0 53 -43 96 -96 96s-96 -43 -96 -96s43 -96 96 -96s96 43 96 96zM288 1216c0 53 -43 96 -96 96s-96 -43 -96 -96s43 -96 96 -96s96 43 96 96zM928 1088c0 53 -43 96 -96 96s-96 -43 -96 -96s43 -96 96 -96s96 43 96 96zM1024 1088c0 -71 -39 -133 -96 -166
-c-3 -361 -259 -441 -429 -495c-159 -50 -211 -74 -211 -171v-26c57 -33 96 -95 96 -166c0 -106 -86 -192 -192 -192s-192 86 -192 192c0 71 39 133 96 166v820c-57 33 -96 95 -96 166c0 106 86 192 192 192s192 -86 192 -192c0 -71 -39 -133 -96 -166v-497
-c51 25 105 42 154 57c186 59 292 103 294 312c-57 33 -96 95 -96 166c0 106 86 192 192 192s192 -86 192 -192z" />
-    <glyph glyph-name="hand-o-right" unicode="&#xf0a4;" horiz-adv-x="1792" 
-d="M256 192c0 35 -29 64 -64 64s-64 -29 -64 -64s29 -64 64 -64s64 29 64 64zM1664 768c0 68 -61 128 -128 128h-576c0 63 96 128 96 256c0 96 -75 128 -160 128c-28 0 -79 -116 -90 -139c-12 -22 -24 -44 -37 -65c-33 -53 -71 -99 -112 -145c-64 -73 -135 -163 -241 -163
-h-32v-640h32c175 0 346 -128 540 -128c112 0 189 47 189 167c0 19 -2 38 -5 56c42 23 65 80 65 126c0 24 -6 48 -18 69c34 32 53 72 53 119c0 32 -14 79 -35 103h331c69 0 128 59 128 128zM1792 769c0 -140 -116 -257 -256 -257h-169c-3 -42 -16 -82 -37 -119
-c2 -14 3 -29 3 -43c0 -64 -21 -128 -60 -178c2 -189 -127 -300 -312 -300c-112 0 -218 31 -322 69c-61 22 -160 59 -223 59h-288c-71 0 -128 57 -128 128v640c0 71 57 128 128 128h288c48 0 116 86 145 119c36 41 70 82 100 129c58 93 101 264 235 264
-c159 0 288 -87 288 -256c0 -44 -7 -87 -22 -128h374c138 0 256 -117 256 -255z" />
-    <glyph glyph-name="object-group" 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="wikidata" unicode="&#xf31a;" horiz-adv-x="2048" 
-d="M0 1264h76v-1264h-76v1264zM152 1264h227v-1264h-227v1264zM455 1264h228v-1264h-228v1264zM759 1264h75v-1264h-75v1264zM910 1264h76v-1264h-76v1264zM1820 1264h76v-1264h-76v1264zM1972 1264h76v-1264h-76v1264zM1062 1264h227v-1264h-227v1264zM1365 1264h76v-1264
-h-76v1264zM1517 1264h228v-1264h-228v1264z" />
-    <glyph glyph-name="anchor" unicode="&#xf13d;" horiz-adv-x="1792" 
-d="M960 1280c0 35 -29 64 -64 64s-64 -29 -64 -64s29 -64 64 -64s64 29 64 64zM1792 352v-352c0 -13 -8 -25 -20 -30c-4 -1 -8 -2 -12 -2c-8 0 -16 3 -23 9l-93 93c-157 -189 -439 -310 -748 -310s-591 121 -748 310l-93 -93c-6 -6 -15 -9 -23 -9c-4 0 -8 1 -12 2
-c-12 5 -20 17 -20 30v352c0 18 14 32 32 32h352c13 0 25 -8 30 -20s2 -25 -7 -35l-100 -100c90 -121 263 -209 461 -236v647h-192c-35 0 -64 29 -64 64v128c0 35 29 64 64 64h192v163c-76 44 -128 126 -128 221c0 141 115 256 256 256s256 -115 256 -256
-c0 -95 -52 -177 -128 -221v-163h192c35 0 64 -29 64 -64v-128c0 -35 -29 -64 -64 -64h-192v-647c198 27 371 115 461 236l-100 100c-9 10 -12 23 -7 35s17 20 30 20h352c18 0 32 -14 32 -32z" />
-    <glyph glyph-name="meh-o" unicode="&#xf11a;" 
-d="M1152 448c0 -35 -29 -64 -64 -64h-640c-35 0 -64 29 -64 64s29 64 64 64h640c35 0 64 -29 64 -64zM640 896c0 -71 -57 -128 -128 -128s-128 57 -128 128s57 128 128 128s128 -57 128 -128zM1152 896c0 -71 -57 -128 -128 -128s-128 57 -128 128s57 128 128 128
-s128 -57 128 -128zM1408 640c0 353 -287 640 -640 640s-640 -287 -640 -640s287 -640 640 -640s640 287 640 640zM1536 640c0 -424 -344 -768 -768 -768s-768 344 -768 768s344 768 768 768s768 -344 768 -768z" />
-    <glyph glyph-name="file-image-o" unicode="&#xf1c5;" 
-d="M1468 1156c37 -37 68 -111 68 -164v-1152c0 -53 -43 -96 -96 -96h-1344c-53 0 -96 43 -96 96v1600c0 53 43 96 96 96h896c53 0 127 -31 164 -68zM1024 1400v-376h376c-6 17 -15 34 -22 41l-313 313c-7 7 -24 16 -41 22zM1408 -128v1024h-416c-53 0 -96 43 -96 96v416
-h-768v-1536h1280zM1280 320v-320h-1024v192l192 192l128 -128l384 384zM448 512c-106 0 -192 86 -192 192s86 192 192 192s192 -86 192 -192s-86 -192 -192 -192z" />
-    <glyph glyph-name="liberapay" unicode="&#xf2e9;" horiz-adv-x="1191" 
-d="M468 1404v0l-222 -918c-4 -19 -6 -37 -7 -53s3 -30 9 -42s18 -23 33 -30s36 -12 64 -14l-48 -196c-75 0 -134 9 -177 29s-74 47 -93 81s-28 73 -27 117s6 91 18 141l203 847zM849 1025v0c60 0 111 -9 154 -27s78 -44 106 -75s49 -68 62 -110s20 -86 20 -134h-1
-c0 -78 -12 -149 -38 -213s-61 -120 -106 -167s-99 -83 -162 -109s-133 -39 -207 -39c-36 0 -72 3 -108 9l-72 -288h-236l265 1103c42 13 91 24 146 34s113 16 177 16zM819 825v0c-34 0 -66 -3 -96 -9l-111 -464c18 -4 40 -7 67 -7c41 0 79 8 113 23s63 37 87 65
-s43 61 56 100s20 81 20 128c0 46 -11 84 -31 116s-55 48 -105 48z" />
-    <glyph glyph-name="nodejs" unicode="&#xf308;" 
-d="M768 -225c-24 0 -46 6 -67 17l-211 126c-32 17 -17 24 -7 27c43 14 51 18 96 43c5 3 11 1 16 -2l162 -97c6 -3 14 -3 19 0l634 367c6 3 10 10 10 18v733c0 8 -4 14 -10 17l-634 366c-6 3 -14 3 -19 0l-635 -366c-6 -3 -9 -11 -9 -17v-733c0 -6 3 -15 9 -18l174 -100
-c94 -48 152 8 152 64v723c0 10 8 19 19 19h82c10 0 19 -8 19 -19v-723c0 -126 -69 -199 -188 -199c-37 0 -65 0 -146 40l-167 95c-41 24 -67 68 -67 116v733c0 48 26 92 67 116l634 368c40 22 94 22 134 0l634 -368c41 -24 67 -68 67 -116v-733c0 -48 -26 -92 -67 -116
-l-634 -367c-21 -10 -45 -14 -67 -14zM964 279c-278 0 -336 127 -336 235c0 10 8 19 19 19h83c10 0 17 -6 17 -16c13 -84 49 -125 218 -125c134 0 191 29 191 101c0 41 -16 72 -224 93c-173 17 -282 56 -282 194c0 129 109 205 290 205c204 0 303 -70 316 -223
-c0 -5 -2 -9 -5 -14c-3 -3 -7 -7 -12 -7h-83c-8 0 -16 7 -18 15c-19 87 -68 116 -198 116c-146 0 -164 -51 -164 -89c0 -46 21 -61 218 -86c196 -25 288 -62 288 -199c-2 -140 -116 -219 -318 -219z" />
-    <glyph glyph-name="calculator" unicode="&#xf1ec;" horiz-adv-x="1664" 
-d="M384 0c0 71 -57 128 -128 128s-128 -57 -128 -128s57 -128 128 -128s128 57 128 128zM768 0c0 71 -57 128 -128 128s-128 -57 -128 -128s57 -128 128 -128s128 57 128 128zM384 384c0 71 -57 128 -128 128s-128 -57 -128 -128s57 -128 128 -128s128 57 128 128zM1152 0
-c0 71 -57 128 -128 128s-128 -57 -128 -128s57 -128 128 -128s128 57 128 128zM768 384c0 71 -57 128 -128 128s-128 -57 -128 -128s57 -128 128 -128s128 57 128 128zM384 768c0 71 -57 128 -128 128s-128 -57 -128 -128s57 -128 128 -128s128 57 128 128zM1152 384
-c0 71 -57 128 -128 128s-128 -57 -128 -128s57 -128 128 -128s128 57 128 128zM768 768c0 71 -57 128 -128 128s-128 -57 -128 -128s57 -128 128 -128s128 57 128 128zM1536 0v384c0 70 -58 128 -128 128s-128 -58 -128 -128v-384c0 -70 58 -128 128 -128s128 58 128 128z
-M1152 768c0 71 -57 128 -128 128s-128 -57 -128 -128s57 -128 128 -128s128 57 128 128zM1536 1088v256c0 35 -29 64 -64 64h-1280c-35 0 -64 -29 -64 -64v-256c0 -35 29 -64 64 -64h1280c35 0 64 29 64 64zM1536 768c0 71 -57 128 -128 128s-128 -57 -128 -128
-s57 -128 128 -128s128 57 128 128zM1664 1408v-1536c0 -70 -58 -128 -128 -128h-1408c-70 0 -128 58 -128 128v1536c0 70 58 128 128 128h1408c70 0 128 -58 128 -128z" />
-    <glyph glyph-name="vk" unicode="&#xf189;" horiz-adv-x="1921" 
-d="M1918 1016c15 -41 -32 -137 -150 -294c-194 -258 -215 -234 -55 -383c154 -143 186 -212 191 -221c0 0 64 -112 -71 -113l-256 -4c-55 -11 -128 39 -128 39c-96 66 -186 237 -256 215c0 0 -72 -23 -70 -177c1 -33 -15 -51 -15 -51s-18 -19 -53 -22h-115
-c-253 -16 -476 217 -476 217s-244 252 -458 755c-14 33 1 49 1 49s15 19 57 19l274 2c26 -4 44 -18 44 -18s16 -11 24 -32c45 -112 103 -214 103 -214c100 -206 168 -241 207 -220c0 0 51 31 40 280c-4 90 -29 131 -29 131c-23 31 -66 40 -85 43c-15 2 10 38 43 54
-c49 24 136 25 239 24c81 -1 104 -6 135 -13c95 -23 63 -111 63 -323c0 -68 -13 -163 36 -194c21 -14 73 -2 201 216c0 0 60 104 107 225c8 22 25 31 25 31s16 9 38 6l288 2c87 11 101 -29 101 -29z" />
-    <glyph glyph-name="odnoklassniki" unicode="&#xf263;" horiz-adv-x="1078" 
-d="M539 629c-250 0 -454 203 -454 453c0 251 204 454 454 454s454 -203 454 -454c0 -250 -204 -453 -454 -453zM539 1306c-123 0 -223 -100 -223 -224c0 -123 100 -223 223 -223s223 100 223 223c0 124 -100 224 -223 224zM1062 574c44 -90 -6 -133 -120 -207
-c-96 -61 -228 -85 -315 -94l73 -72l267 -267c40 -41 40 -107 0 -147l-12 -13c-41 -40 -107 -40 -148 0c-67 68 -165 166 -267 268l-267 -268c-41 -40 -107 -40 -147 0l-12 13c-41 40 -41 106 0 147c68 68 165 166 267 267l72 72c-86 9 -220 32 -317 94
-c-114 74 -164 117 -120 207c26 51 97 94 191 20c0 0 127 -101 332 -101s332 101 332 101c94 74 165 31 191 -20z" />
-    <glyph glyph-name="linkedin" unicode="&#xf0e1;" 
-d="M349 911v-991h-330v991h330zM370 1217c1 -95 -71 -171 -186 -171h-2c-111 0 -182 76 -182 171c0 97 74 171 186 171c113 0 183 -74 184 -171zM1536 488v-568h-329v530c0 133 -48 224 -167 224c-91 0 -145 -61 -169 -120c-8 -22 -11 -51 -11 -81v-553h-329
-c4 898 0 991 0 991h329v-144h-2c43 68 121 167 299 167c217 0 379 -142 379 -446z" />
-    <glyph glyph-name="jpy" unicode="&#xf157;" horiz-adv-x="1026" 
-d="M603 0h-172c-18 0 -32 14 -32 32v330h-288c-18 0 -32 14 -32 32v103c0 18 14 32 32 32h288v85h-288c-18 0 -32 14 -32 32v104c0 17 14 32 32 32h214l-321 578c-5 10 -5 22 0 32c6 10 17 16 28 16h194c12 0 23 -7 29 -18l215 -425c24 -47 40 -87 56 -125
-c17 43 39 85 58 129l191 420c5 12 17 19 29 19h191c11 0 21 -6 27 -16c6 -9 6 -21 1 -31l-313 -579h215c18 0 32 -15 32 -32v-104c0 -18 -14 -32 -32 -32h-290v-85h290c18 0 32 -14 32 -32v-103c0 -18 -14 -32 -32 -32h-290v-330c0 -18 -15 -32 -32 -32z" />
-    <glyph glyph-name="skype" unicode="&#xf17e;" 
-d="M1173 473c0 174 -169 234 -311 266l-104 24c-76 18 -133 31 -133 89c0 53 56 77 144 77c157 0 160 -115 257 -115c65 0 104 51 104 109c0 115 -191 190 -380 190c-173 0 -374 -75 -374 -278c0 -168 112 -228 258 -263l146 -36c89 -22 144 -32 144 -96
-c0 -51 -57 -90 -145 -90c-185 0 -195 154 -302 154c-70 0 -101 -50 -101 -105c0 -123 188 -223 413 -223c188 0 384 94 384 297zM1536 256c0 -212 -172 -384 -384 -384c-88 0 -169 30 -234 80c-48 -10 -99 -16 -150 -16c-389 0 -704 315 -704 704c0 51 6 102 16 150
-c-50 65 -80 146 -80 234c0 212 172 384 384 384c88 0 169 -30 234 -80c48 10 99 16 150 16c389 0 704 -315 704 -704c0 -51 -6 -102 -16 -150c50 -65 80 -146 80 -234z" />
-    <glyph glyph-name="envelope-square" unicode="&#xf199;" 
-d="M1248 1408c159 0 288 -129 288 -288v-960c0 -159 -129 -288 -288 -288h-960c-159 0 -288 129 -288 288v960c0 159 129 288 288 288h960zM1280 352v436c-19 -21 -40 -40 -64 -55c-94 -62 -191 -120 -284 -184c-47 -33 -105 -69 -164 -69s-117 36 -164 69
-c-93 64 -191 121 -284 185c-23 15 -41 37 -64 54v-436c0 -53 43 -96 96 -96h832c53 0 96 43 96 96zM1280 925c0 54 -40 99 -96 99h-832c-53 0 -96 -43 -96 -96c0 -54 56 -113 98 -141c88 -59 179 -114 267 -172c38 -25 101 -71 147 -71s109 46 147 71c89 58 178 115 267 174
-c39 26 98 86 98 136z" />
-    <glyph glyph-name="question-circle-o" unicode="&#xf29c;" 
-d="M880 336v-160c0 -18 -14 -32 -32 -32h-160c-18 0 -32 14 -32 32v160c0 18 14 32 32 32h160c18 0 32 -14 32 -32zM1136 832c0 -142 -99 -198 -172 -239c-52 -30 -84 -49 -84 -81v-32c0 -18 -14 -32 -32 -32h-160c-18 0 -32 14 -32 32v68c0 123 88 162 159 194
-c60 28 97 47 97 92c0 58 -73 101 -139 101c-35 0 -72 -11 -95 -27c-22 -15 -43 -37 -80 -83c-6 -8 -15 -12 -25 -12c-7 0 -14 2 -19 6l-108 82c-13 10 -16 29 -7 43c82 129 197 192 349 192c164 0 348 -130 348 -304zM768 1280c-353 0 -640 -287 -640 -640
-s287 -640 640 -640s640 287 640 640s-287 640 -640 640zM1536 640c0 -424 -344 -768 -768 -768s-768 344 -768 768s344 768 768 768s768 -344 768 -768z" />
-    <glyph glyph-name="ship" unicode="&#xf21a;" horiz-adv-x="2010" 
-d="M1792 -19c25 25 65 25 90 0l128 -128l-90 -90l-83 83l-83 -83c-12 -13 -29 -19 -45 -19s-33 6 -45 19l-83 83l-83 -83c-25 -25 -65 -25 -90 0l-83 83l-83 -83c-25 -25 -65 -25 -90 0l-83 83l-83 -83c-25 -25 -65 -25 -90 0l-83 83l-83 -83c-25 -25 -65 -25 -90 0l-83 83
-l-83 -83c-25 -25 -65 -25 -90 0l-83 83l-83 -83c-25 -25 -65 -25 -90 0l-128 128l90 90l83 -83l83 83c25 25 65 25 90 0l83 -83l83 83c25 25 65 25 90 0l83 -83l83 83c25 25 65 25 90 0l83 -83l83 83c25 25 65 25 90 0l83 -83l83 83c25 25 65 25 90 0l83 -83l83 83
-c25 25 65 25 90 0l83 -83zM218 19c-25 -25 -65 -25 -90 0l-128 128l90 90l83 -82l83 82c25 25 65 25 90 0l83 -82l64 64v293l-210 314c-23 35 -7 83 33 97l177 58v299h128v128h256v128h256v-128h256v-128h128v-299l177 -58c40 -14 56 -62 33 -97l-210 -314v-293l19 18
-c25 25 65 25 90 0l83 -82l83 82c25 25 65 25 90 0l128 -128l-90 -90l-83 83l-83 -83c-12 -13 -29 -19 -45 -19s-33 6 -45 19l-83 83l-83 -83c-25 -25 -65 -25 -90 0l-83 83l-83 -83c-25 -25 -65 -25 -90 0l-83 83l-83 -83c-25 -25 -65 -25 -90 0l-83 83l-83 -83
-c-25 -25 -65 -25 -90 0l-83 83l-83 -83c-25 -25 -65 -25 -90 0l-83 83zM621 1152v-128l384 128l384 -128v128h-128v128h-512v-128h-128z" />
-    <glyph glyph-name="gimp" unicode="&#xf31b;" horiz-adv-x="1792" 
-d="M1760 1453c243 -1827 -975 -1550 -1432 -1186c28 4 55 13 78 30c50 38 74 102 73 173s-25 150 -73 220c-6 9 -13 17 -20 25l26 588s159 -366 481 -358c674 18 794 417 867 508zM612 937c-97 0 -177 -85 -177 -193s80 -194 177 -194c16 0 31 4 46 8
-c-67 3 -122 62 -122 133v0c0 73 57 133 127 133v0c56 0 112 -47 124 -104c1 8 2 16 2 24c0 108 -80 193 -177 193zM1031 928v0c-119 0 -216 -102 -216 -228s97 -227 216 -227c45 0 87 14 122 39c-17 -8 -47 -15 -66 -15c-90 0 -162 77 -162 171v0c0 94 72 170 162 170
-c75 0 147 -63 160 -141v3c0 126 -97 228 -216 228zM158 822v0c79 -2 166 -58 227 -146c46 -67 70 -141 70 -206s-21 -121 -64 -153s-100 -37 -158 -16s-118 67 -164 134s-69 141 -69 206s21 121 64 153c26 20 58 29 94 28zM1042 804c-42 0 -76 -36 -76 -80v0
-c0 -44 34 -80 76 -80s76 36 76 80v0c0 44 -34 80 -76 80zM615 787c-28 0 -50 -23 -50 -52v0v0c0 -29 22 -53 50 -53s50 24 50 53v0v0c0 29 -22 52 -50 52zM130 770c-47 0 -85 -47 -85 -106v0c0 -59 38 -107 85 -107s84 48 84 107v0c0 59 -37 106 -84 106zM1202 468
-c0 0 44 -38 69 -72c-96 -78 -261 -141 -583 -73c163 -60 300 -88 406 -81c-64 -22 -146 -39 -250 -44c233 -23 407 22 468 117c16 -18 32 -49 47 -89c10 69 36 101 -4 155s-153 87 -153 87z" />
-    <glyph glyph-name="dashcube" unicode="&#xf210;" horiz-adv-x="1408" 
-d="M0 856c0 173 138 322 314 322h742l352 358v-1470c0 -174 -138 -322 -314 -322h-780c-176 0 -314 148 -314 322v790zM1232 102l-176 180v425c0 61 -49 112 -110 112h-484c-61 0 -110 -51 -110 -112v-492c0 -61 49 -113 110 -113h770z" />
-    <glyph glyph-name="optin-monster" unicode="&#xf23c;" horiz-adv-x="2132" 
-d="M396 -139c-10 -21 -39 -50 -64 -60c-35 -12 -78 11 -80 35c-2 31 75 87 108 93c32 6 47 -42 36 -68zM1737 -139c-11 26 4 74 35 68c33 -6 111 -62 108 -93c-1 -24 -45 -47 -79 -35c-26 10 -55 39 -64 60zM1785 -30c-21 43 15 121 70 114c58 -6 183 -94 183 -160
-c0 -43 -58 -72 -119 -55c-45 12 -116 65 -134 101zM346 -30c-18 -36 -88 -89 -133 -101c-61 -17 -119 12 -119 55c0 66 125 154 183 160c55 7 91 -71 69 -114zM1076 1094c106 0 192 -80 192 -179s-86 -179 -192 -179s-191 80 -191 179c0 15 2 28 5 42c16 -25 46 -43 80 -43
-c51 0 92 38 92 85c0 37 -26 69 -61 80c23 10 49 15 76 15h-1zM1380 1312c-132 145 -301 177 -466 87c93 208 452 180 466 -87zM2130 73c5 -7 -1 -25 -11 -42c4 -13 7 -26 7 -40c3 -117 -164 -237 -272 -241c-64 -3 -128 31 -158 87c-420 -15 -840 -18 -1259 0
-c-31 -56 -95 -89 -159 -87c-107 4 -274 124 -272 241c1 14 3 27 7 40c-10 17 -16 35 -11 42c4 6 17 6 31 1c12 19 26 35 41 51c-4 17 -4 32 2 38c7 6 23 4 39 -4c17 12 37 24 59 34c0 18 5 32 13 37c12 6 33 2 51 -16c21 3 42 3 61 -2c13 -3 26 -10 38 -19v73
-c-6 0 -11 0 -18 2c-65 12 -136 57 -152 132c-6 25 -6 52 0 81c12 50 55 79 93 95c3 22 30 52 55 59c28 7 46 -17 52 -38h13c18 -2 47 -6 60 -23c2 -2 4 -5 5 -7c20 2 41 5 61 7c-9 7 -19 13 -30 17c-19 33 -51 41 -91 43c0 3 0 6 1 10c-73 2 -163 21 -203 66
-c-46 51 -54 138 -45 204c8 65 35 140 90 179c31 21 80 3 84 -36c2 -17 5 -75 21 -84c18 -9 47 -13 76 -12c30 29 62 54 98 74c-55 5 -107 -6 -162 -14l47 46c46 44 107 82 163 111c87 44 185 77 282 86c-69 29 -148 44 -221 61c283 60 646 82 904 -139
-c67 -57 120 -134 158 -222c41 -5 93 -6 121 9h1c16 9 19 66 21 84c4 38 53 57 84 35c55 -39 82 -114 91 -178c8 -66 1 -153 -46 -204c-40 -45 -127 -65 -199 -67v-10c-41 -1 -75 -9 -95 -43c-11 -4 -21 -10 -31 -17c21 -2 42 -5 62 -7c1 3 3 6 5 8c14 16 43 21 60 23h13
-c6 20 25 44 52 38s52 -37 55 -59c40 -16 82 -45 93 -95c7 -30 6 -56 1 -81c-17 -75 -88 -121 -153 -132c-5 -1 -12 -2 -17 -2c0 -25 0 -49 -1 -73c12 9 24 16 38 19c19 5 40 5 61 2c18 18 40 22 51 16c8 -5 14 -19 14 -37c21 -10 42 -22 59 -34c16 8 31 10 38 4
-c6 -6 7 -21 2 -38c15 -16 30 -33 41 -51c14 5 26 5 31 -1zM1855 1025c0 -23 -5 -43 -9 -54c64 -25 97 -82 112 -132c4 39 -10 146 -51 189c-27 27 -52 19 -52 -3zM1777 925c48 -58 63 -154 47 -233c40 8 76 23 97 45c7 8 14 18 18 28c-4 79 -38 158 -110 181
-c-12 -12 -34 -18 -52 -21zM1740 921c-14 0 -30 0 -44 1c28 -76 46 -158 53 -239c13 0 28 1 43 3c22 90 -1 191 -52 235zM176 839c15 50 48 107 112 132c-4 11 -9 31 -9 54c0 22 -26 30 -52 3c-42 -43 -55 -150 -51 -189zM212 737c21 -23 57 -37 97 -45c-16 79 -1 175 47 233
-c-18 3 -40 9 -52 21c-72 -23 -105 -102 -110 -181c5 -10 11 -20 18 -28zM389 683c9 82 34 162 73 235c-19 -4 -37 -11 -55 -18l-45 -19v1c-27 -52 -37 -127 -20 -196c17 -2 32 -3 47 -3zM1352 644c13 -66 18 -132 28 -198c4 -23 11 -28 33 -17c59 30 84 145 85 211
-c-48 3 -97 3 -146 4zM1070 1285c-155 0 -282 -126 -282 -281c0 -156 127 -282 282 -282s282 126 282 282c0 155 -127 281 -282 281zM1298 646c-70 1 -141 1 -211 0v1c-1 -19 1 -141 16 -152c41 -20 146 -17 189 -4c20 6 9 137 6 155zM1030 447c17 9 9 168 5 199v1
-c-72 -1 -143 -1 -214 -3c-7 -34 -17 -181 7 -191c48 -21 154 -19 202 -6zM636 636c-20 -73 1 -167 82 -203c20 -9 32 -9 36 16c7 32 9 136 18 193c-45 -1 -91 -3 -136 -6zM509 510c2 -18 -14 -29 -34 -36c162 -174 343 -317 577 -394c250 71 428 222 604 396
-c-18 7 -32 19 -30 34c1 4 2 6 3 9v1v-1c-33 3 -66 7 -98 10c-35 -122 -133 -196 -173 -117c-10 19 -13 43 -17 62c-14 -31 -49 -30 -91 -33c-49 -4 -117 -5 -163 11c-11 -48 -41 -48 -99 -53c-52 -5 -180 -15 -203 40c-4 -106 -130 -37 -167 26c-12 21 -20 42 -26 65
-c-29 -3 -58 -6 -87 -10c2 -3 3 -7 4 -10zM425 -118c2 9 3 19 3 30c-21 86 -69 184 -124 200c-83 25 -255 -87 -245 -202c47 -72 148 -132 219 -135c66 -3 133 41 147 107zM428 53c12 -33 24 -77 27 -119c124 72 256 132 392 174c-143 76 -252 177 -360 285
-c-8 -5 -19 -9 -29 -13c-1 -3 -1 -6 -2 -9c17 -10 29 -22 22 -37c-8 -15 -32 -28 -56 -34c-8 -10 -19 -18 -29 -24h-1c-1 -50 -1 -100 1 -150c14 -25 26 -51 35 -73zM497 -113c382 -15 764 -13 1145 0c-136 79 -274 153 -428 196c-51 -23 -103 -42 -156 -57
-c-8 -3 -8 -3 -16 0c-44 14 -86 30 -129 49c-149 -43 -286 -108 -416 -188h-1v-1c1 0 1 0 1 1zM1681 -67c3 42 16 87 28 120c8 22 19 47 33 71l-1 -1c2 51 3 102 3 153c-11 6 -21 15 -30 25c-24 5 -48 19 -56 33c-7 15 5 28 22 38c-1 2 -2 6 -2 9c-11 3 -20 7 -28 12
-c-117 -109 -242 -210 -383 -284c144 -43 281 -104 414 -176zM2073 -90c11 115 -161 227 -245 202c-54 -16 -103 -114 -124 -200c0 -11 1 -21 3 -30c14 -66 81 -110 147 -107c71 3 172 63 219 135z" />
-    <glyph glyph-name="paw" unicode="&#xf1b0;" horiz-adv-x="1664" 
-d="M780 1064c0 -112 -58 -245 -187 -245c-162 0 -260 204 -260 344c0 112 58 245 187 245c163 0 260 -204 260 -344zM438 581c0 -97 -51 -198 -161 -198c-160 0 -277 196 -277 341c0 97 52 199 161 199c160 0 277 -197 277 -342zM832 608c245 0 576 -353 576 -589
-c0 -127 -104 -147 -206 -147c-134 0 -242 90 -370 90c-134 0 -248 -89 -393 -89c-97 0 -183 33 -183 146c0 237 331 589 576 589zM1071 819c-129 0 -187 133 -187 245c0 140 97 344 260 344c129 0 187 -133 187 -245c0 -140 -98 -344 -260 -344zM1503 923
-c109 0 161 -102 161 -199c0 -145 -117 -341 -277 -341c-110 0 -161 101 -161 198c0 145 117 342 277 342z" />
-    <glyph glyph-name="venus-double" unicode="&#xf226;" horiz-adv-x="1792" 
-d="M1790 1007c25 -317 -207 -586 -510 -619v-260h224c18 0 32 -14 32 -32v-64c0 -18 -14 -32 -32 -32h-224v-224c0 -18 -14 -32 -32 -32h-64c-18 0 -32 14 -32 32v224h-512v-224c0 -18 -14 -32 -32 -32h-64c-18 0 -32 14 -32 32v224h-224c-18 0 -32 14 -32 32v64
-c0 18 14 32 32 32h224v260c-303 33 -535 302 -510 619c22 275 243 500 517 526c140 14 271 -23 377 -94c106 71 237 108 377 94c274 -26 495 -251 517 -526zM896 647c79 81 128 191 128 313s-49 232 -128 313c-79 -81 -128 -191 -128 -313s49 -232 128 -313zM576 512
-c79 0 153 21 218 57c-96 103 -154 240 -154 391s59 288 154 391c-65 36 -139 57 -218 57c-247 0 -448 -201 -448 -448s201 -448 448 -448zM1152 128v260c-94 10 -181 44 -256 94c-75 -50 -162 -84 -256 -94v-260h512zM1216 512c247 0 448 201 448 448s-201 448 -448 448
-c-79 0 -153 -21 -218 -57c95 -103 154 -240 154 -391s-58 -288 -154 -391c65 -36 139 -57 218 -57z" />
-    <glyph glyph-name="calendar-times-o" unicode="&#xf273;" horiz-adv-x="1664" 
-d="M1111 151l-46 -46c-12 -12 -32 -12 -45 0l-188 189l-188 -189c-13 -12 -33 -12 -45 0l-46 46c-12 12 -12 32 0 45l189 188l-189 188c-12 13 -12 33 0 45l46 46c12 12 32 12 45 0l188 -188l188 188c13 12 33 12 45 0l46 -46c12 -12 12 -32 0 -45l-188 -188l188 -188
-c12 -13 12 -33 0 -45zM128 -128h1408v1024h-1408v-1024zM512 1088v288c0 18 -14 32 -32 32h-64c-18 0 -32 -14 -32 -32v-288c0 -18 14 -32 32 -32h64c18 0 32 14 32 32zM1280 1088v288c0 18 -14 32 -32 32h-64c-18 0 -32 -14 -32 -32v-288c0 -18 14 -32 32 -32h64
-c18 0 32 14 32 32zM1664 1152v-1280c0 -70 -58 -128 -128 -128h-1408c-70 0 -128 58 -128 128v1280c0 70 58 128 128 128h128v96c0 88 72 160 160 160h64c88 0 160 -72 160 -160v-96h384v96c0 88 72 160 160 160h64c88 0 160 -72 160 -160v-96h128c70 0 128 -58 128 -128z
-" />
-    <glyph glyph-name="address-book-o" unicode="&#xf2ba;" horiz-adv-x="1664" 
-d="M1028 892c0 -143 -117 -259 -260 -259s-260 116 -260 259c0 144 117 260 260 260s260 -116 260 -260zM980 672c191 0 221 -227 221 -374c0 -84 -53 -170 -145 -170h-576c-92 0 -145 86 -145 170c0 141 30 374 216 374h5c66 -39 133 -87 212 -87s146 48 212 87zM1664 928
-c0 -17 -15 -32 -32 -32h-96v-128h96c17 0 32 -15 32 -32v-192c0 -17 -15 -32 -32 -32h-96v-128h96c17 0 32 -15 32 -32v-192c0 -17 -15 -32 -32 -32h-96v-224c0 -88 -72 -160 -160 -160h-1216c-88 0 -160 72 -160 160v1472c0 88 72 160 160 160h1216c88 0 160 -72 160 -160
-v-224h96c17 0 32 -15 32 -32v-192zM1408 -96v1472c0 17 -15 32 -32 32h-1216c-17 0 -32 -15 -32 -32v-1472c0 -17 15 -32 32 -32h1216c17 0 32 15 32 32z" />
-    <glyph glyph-name="check" unicode="&#xf00c;" horiz-adv-x="1550" 
-d="M1550 970c0 -25 -10 -50 -28 -68l-724 -724l-136 -136c-18 -18 -43 -28 -68 -28s-50 10 -68 28l-136 136l-362 362c-18 18 -28 43 -28 68s10 50 28 68l136 136c18 18 43 28 68 28s50 -10 68 -28l294 -295l656 657c18 18 43 28 68 28s50 -10 68 -28l136 -136
-c18 -18 28 -43 28 -68z" />
-    <glyph glyph-name="meetup" unicode="&#xf2e0;" horiz-adv-x="1847" 
-d="M1297 302c-11 72 -143 16 -151 95c-11 112 153 354 140 448c-12 84 -68 102 -117 103c-47 1 -59 -7 -75 -16c-10 -6 -23 -17 -41 1c-22 21 -39 41 -68 45c-43 7 -62 -7 -93 -34c-12 -10 -42 -45 -70 -32c-12 6 -54 27 -84 40c-57 25 -140 -16 -170 -70
-c-45 -80 -133 -396 -146 -438c-30 -93 38 -170 129 -165c39 2 64 16 89 61c14 26 146 377 156 394c7 12 31 28 51 18c20 -11 24 -33 21 -53c-4 -34 -98 -248 -101 -272c-12 -80 94 -93 135 -14c13 25 160 324 173 344c15 22 26 29 41 28c11 0 29 -3 25 -38
-c-5 -33 -123 -253 -136 -307c-16 -72 23 -145 87 -177c40 -20 219 -55 205 39zM346 86c4 -20 -8 -39 -28 -43c-19 -4 -38 8 -42 28c-4 19 8 39 27 43s39 -8 43 -28zM916 -177c16 -23 10 -54 -12 -70c-23 -16 -54 -10 -70 13c-15 23 -9 54 13 70c23 16 54 10 69 -13zM140 635
-c-24 -36 -72 -45 -107 -20c-35 24 -44 73 -20 108c24 36 72 45 107 21c35 -25 44 -73 20 -109zM1430 -42c25 -37 16 -88 -21 -114c-37 -25 -87 -16 -112 21s-16 88 20 114c37 26 87 16 113 -21zM1542 562c92 -151 53 -350 -92 -452c-61 -43 -130 -62 -199 -60
-c-42 -165 -243 -226 -368 -114c-4 -3 -9 -6 -13 -10c-137 -95 -323 -61 -418 78c-34 50 -51 107 -53 164c-229 38 -315 329 -144 489c-99 164 2 376 187 402c88 232 377 342 573 190c236 78 477 -103 458 -354c144 -44 185 -234 69 -333zM418 1222c18 -27 12 -64 -15 -83
-c-26 -18 -63 -12 -81 15s-12 64 15 83c26 18 63 12 81 -15zM577 1503c5 -22 -9 -44 -31 -49s-44 9 -49 32c-4 22 10 44 32 49s44 -9 48 -32zM1763 555c6 -27 -11 -53 -37 -58c-26 -6 -52 11 -57 37c-6 27 11 53 37 59c26 5 52 -12 57 -38zM1099 1448c21 -36 10 -84 -27 -106
-c-36 -22 -83 -10 -104 26c-22 37 -10 85 26 107s83 10 105 -27zM1845 792c5 -20 -8 -39 -27 -44c-20 -4 -39 9 -43 28c-4 20 8 40 28 44c19 4 38 -8 42 -28zM1654 1033c20 -30 13 -71 -16 -92c-30 -20 -71 -13 -91 17s-13 71 17 92c29 21 70 13 90 -17z" />
-    <glyph glyph-name="sliders" unicode="&#xf1de;" 
-d="M352 128v-128h-352v128h352zM704 256c35 0 64 -29 64 -64v-256c0 -35 -29 -64 -64 -64h-256c-35 0 -64 29 -64 64v256c0 35 29 64 64 64h256zM864 640v-128h-864v128h864zM224 1152v-128h-224v128h224zM1536 128v-128h-736v128h736zM576 1280c35 0 64 -29 64 -64v-256
-c0 -35 -29 -64 -64 -64h-256c-35 0 -64 29 -64 64v256c0 35 29 64 64 64h256zM1216 768c35 0 64 -29 64 -64v-256c0 -35 -29 -64 -64 -64h-256c-35 0 -64 29 -64 64v256c0 35 29 64 64 64h256zM1536 640v-128h-224v128h224zM1536 1152v-128h-864v128h864z" />
-    <glyph glyph-name="file-pdf-o" unicode="&#xf1c1;" 
-d="M1468 1156c37 -37 68 -111 68 -164v-1152c0 -53 -43 -96 -96 -96h-1344c-53 0 -96 43 -96 96v1600c0 53 43 96 96 96h896c53 0 127 -31 164 -68zM1024 1400v-376h376c-6 17 -15 34 -22 41l-313 313c-7 7 -24 16 -41 22zM1408 -128v1024h-416c-53 0 -96 43 -96 96v416
-h-768v-1536h1280zM894 465c25 -20 53 -38 84 -56c42 5 81 7 117 7c67 0 152 -8 177 -49c7 -10 13 -28 2 -52c-1 -1 -2 -3 -3 -4v-1c-3 -18 -18 -38 -71 -38c-64 0 -161 29 -245 73c-139 -15 -285 -46 -392 -83c-103 -176 -182 -262 -242 -262c-10 0 -19 2 -28 7l-24 12
-c-3 1 -4 3 -6 5c-5 5 -9 16 -6 36c10 46 64 123 188 188c8 5 18 2 23 -6c1 -1 2 -3 2 -4c31 51 67 116 107 197c45 90 80 178 104 262c-32 109 -42 221 -24 287c7 25 22 40 42 40h22c15 0 27 -5 35 -15c12 -14 15 -36 9 -68c-1 -3 -2 -6 -4 -8c1 -3 1 -5 1 -8v-30
-c-1 -63 -2 -123 -14 -192c35 -105 87 -190 146 -238zM318 54c30 14 73 57 137 158c-75 -58 -122 -124 -137 -158zM716 974c-10 -28 -10 -76 -2 -132c3 16 5 31 7 44c2 17 5 31 7 43c1 3 2 5 4 8c-1 1 -1 3 -2 5c-1 18 -7 29 -13 36c0 -2 -1 -3 -1 -4zM592 313
-c88 35 186 63 284 81c-10 8 -20 15 -29 23c-49 43 -93 103 -127 176c-19 -61 -47 -126 -83 -197c-15 -28 -30 -56 -45 -83zM1238 329c-5 5 -31 24 -140 24c49 -18 94 -28 124 -28c9 0 14 0 18 1c0 1 -1 2 -2 3z" />
-    <glyph glyph-name="android" unicode="&#xf17b;" horiz-adv-x="1408" 
-d="M493 1053c22 0 39 18 39 39s-17 39 -39 39c-21 0 -38 -18 -38 -39s17 -39 38 -39zM915 1053c21 0 38 18 38 39s-17 39 -38 39c-22 0 -39 -18 -39 -39s17 -39 39 -39zM103 869c56 0 102 -46 102 -102v-430c0 -57 -45 -103 -102 -103s-103 46 -103 103v430
-c0 56 46 102 103 102zM1163 850v-666c0 -61 -49 -110 -109 -110h-75v-227c0 -57 -46 -103 -103 -103s-103 46 -103 103v227h-138v-227c0 -57 -46 -103 -103 -103c-56 0 -102 46 -102 103l-1 227h-74c-61 0 -110 49 -110 110v666h918zM931 1255c140 -72 235 -210 235 -369
-h-925c0 159 95 297 236 369l-71 131c-4 7 -2 16 5 20c7 3 16 1 20 -6l72 -132c61 27 129 42 201 42s140 -15 201 -42l72 132c4 7 13 9 20 6c7 -4 9 -13 5 -20zM1408 767v-430c0 -57 -46 -103 -103 -103c-56 0 -102 46 -102 103v430c0 57 46 102 102 102
-c57 0 103 -45 103 -102z" />
-    <glyph glyph-name="hubzilla" unicode="&#xf2eb;" horiz-adv-x="1587" 
-d="M1349 1363c86 -43 165 -125 207 -213c16 -40 34 -78 30 -170c-3 -83 -8 -115 -34 -170c-68 -146 -203 -243 -356 -253l-83 -6l-29 -115c-24 -96 -27 -129 -27 -129c28 -29 91 -47 117 -115c36 -69 32 -168 -14 -225c-75 -93 -187 -121 -286 -70c-90 47 -136 164 -108 266
-c7 26 -2 34 -109 104l-116 77l-43 -35c-203 -162 -499 -19 -498 242c0 168 133 299 304 298c86 0 138 -20 202 -78l47 -42l104 53l105 51l-11 37c-16 55 -12 176 7 238c21 74 87 166 150 212c128 94 302 111 441 43v0zM580 413l233 -160s71 60 167 68l60 254
-s-185 59 -237 189l-217 -102s52 -128 -6 -248v-1z" />
-    <glyph glyph-name="stack-exchange" unicode="&#xf18d;" horiz-adv-x="1238" 
-d="M1238 283v-66c0 -113 -88 -204 -196 -204h-57l-260 -269v269h-529c-108 0 -196 91 -196 204v66h1238zM1238 609v-255h-1238v255h1238zM1238 937v-255h-1238v255h1238zM1238 1077v-67h-1238v67c0 112 88 203 196 203h846c108 0 196 -91 196 -203z" />
-    <glyph glyph-name="twitch" unicode="&#xf1e8;" horiz-adv-x="1592" 
-d="M796 1102v-434h-145v434h145zM1194 1102v-434h-145v434h145zM1194 342l253 254v795h-1194v-1049h326v-217l217 217h398zM1592 1536v-1013l-434 -434h-326l-217 -217h-217v217h-398v1158l109 289h1483z" />
-    <glyph glyph-name="caret-right" unicode="&#xf0da;" horiz-adv-x="576" 
-d="M576 640c0 -17 -7 -33 -19 -45l-448 -448c-12 -12 -28 -19 -45 -19c-35 0 -64 29 -64 64v896c0 35 29 64 64 64c17 0 33 -7 45 -19l448 -448c12 -12 19 -28 19 -45z" />
-    <glyph glyph-name="tree" unicode="&#xf1bb;" horiz-adv-x="1472" 
-d="M1472 64c0 -35 -29 -64 -64 -64h-462c3 -64 11 -131 11 -196c0 -33 -27 -60 -61 -60h-320c-34 0 -61 27 -61 60c0 65 8 132 11 196h-462c-35 0 -64 29 -64 64c0 17 7 33 19 45l402 403h-229c-35 0 -64 29 -64 64c0 17 7 33 19 45l402 403h-197c-35 0 -64 29 -64 64
-c0 17 7 33 19 45l384 384c12 12 28 19 45 19s33 -7 45 -19l384 -384c12 -12 19 -28 19 -45c0 -35 -29 -64 -64 -64h-197l402 -403c12 -12 19 -28 19 -45c0 -35 -29 -64 -64 -64h-229l402 -403c12 -12 19 -28 19 -45z" />
-    <glyph glyph-name="friendica" unicode="&#xf2e6;" horiz-adv-x="1520" 
-d="M0 1128c0 152 123 276 274 276h973c151 0 273 -124 273 -276v-980c0 -152 -122 -276 -273 -276h-973c-151 0 -274 124 -274 276v980zM1247 1343h-244v-368h-486v-310l485 3l1 -367h-486v-368h730c118 0 212 95 212 215v980c0 120 -94 215 -212 215z" />
-    <glyph glyph-name="gratipay" unicode="&#xf184;" 
-d="M773 234l350 473c27 37 59 156 -43 223c-86 56 -168 13 -211 -37c-16 -18 -44 -40 -96 -40s-79 22 -95 40c-43 50 -125 93 -212 37c-101 -67 -69 -186 -42 -223zM1536 640c0 -424 -344 -768 -768 -768s-768 344 -768 768s344 768 768 768s768 -344 768 -768z" />
-    <glyph glyph-name="map-marker" unicode="&#xf041;" horiz-adv-x="1024" 
-d="M768 896c0 141 -115 256 -256 256s-256 -115 -256 -256s115 -256 256 -256s256 115 256 256zM1024 896c0 -61 -7 -124 -33 -179l-364 -774c-21 -44 -67 -71 -115 -71s-94 27 -114 71l-365 774c-26 55 -33 118 -33 179c0 283 229 512 512 512s512 -229 512 -512z" />
-    <glyph glyph-name="globe-e" unicode="&#xf304;" 
-d="M768 1404c204 0 399 -81 543 -225s225 -339 225 -543s-81 -399 -225 -543s-339 -225 -543 -225s-399 81 -543 225s-225 339 -225 543s81 399 225 543s339 225 543 225zM863 1165h-1h-6c-78 -1 -136 -19 -204 -29s-157 -10 -205 -29s-58 -39 -87 -58s-72 -30 -87 -58
-s0 -58 0 -87s-28 -73 0 -88s58 39 87 58s68 70 88 59s6 -8 0 -29s-54 -44 -56 -87s110 -78 73 -135c-37 -56 -202 50 -250 18s-19 -58 -29 -87s-40 -57 -29 -88s55 -37 87 -58s87 -59 88 -62s21 -106 29 -145c6 -34 3 -78 4 -120c44 -36 123 -82 176 -102
-c21 41 37 107 53 139c24 48 77 133 87 174s0 39 0 58s8 32 0 58s-40 58 -59 87s-37 69 -58 88s-49 19 -58 29s-4 9 -4 14s-5 8 5 15s36 9 58 0s39 -39 58 -58s27 -55 58 -58s58 39 87 58c29 20 74 35 107 -22c8 -16 43 -35 68 -35s22 42 30 58s24 37 48 41s28 -14 44 -30
-s30 -69 53 -69s22 43 30 59c15 34 6 65 57 116c19 19 50 29 57 57s-21 62 -29 86s-28 63 -28 88c0 21 27 25 63 44c-24 30 -67 73 -97 97c-22 1 -41 2 -55 4c-69 8 -176 29 -253 29zM1251 411c-32 1 -70 -43 -105 -60c-39 -19 -100 -32 -116 -59s0 -39 0 -58s-14 -44 0 -58
-s38 0 58 0s37 9 59 0c12 -5 23 -17 33 -29c40 34 96 98 125 142c-5 11 -10 21 -14 32c-10 29 5 74 -29 88c-4 2 -7 2 -11 2z" />
-    <glyph glyph-name="american-sign-language-interpreting" unicode="&#xf2a3;" horiz-adv-x="2303" 
-d="M1032 576c-35 1 -68 21 -84 55c-22 45 -66 73 -116 73c-71 0 -128 -57 -128 -128c0 -34 12 -67 36 -89l10 -8c22 -20 51 -31 82 -31c50 0 94 28 116 73c16 34 49 54 84 55zM1600 704c0 34 -12 67 -36 89l-10 8c-22 20 -51 31 -82 31c-50 0 -94 -28 -116 -73
-c-16 -34 -49 -54 -84 -55c35 -1 68 -21 84 -55c22 -45 66 -73 116 -73c71 0 128 57 128 128zM1174 925c-23 -47 -81 -67 -128 -44c-42 21 -87 31 -134 31c-35 0 -68 -6 -99 -17c6 0 13 1 19 1c123 0 236 -72 289 -183c23 -48 2 -105 -46 -128c-12 -6 -25 -9 -39 -9
-c14 0 27 -3 39 -9c48 -23 69 -80 46 -128c-53 -111 -166 -183 -289 -183h-6c-15 2 -29 3 -44 4l-290 27l-239 -120c-10 -5 -19 -7 -29 -7c-23 0 -46 13 -57 35l-160 320c-15 31 -4 68 25 85l209 119l148 267c23 206 125 395 287 528c41 34 102 28 135 -13
-c34 -41 28 -101 -13 -135c-45 -38 -85 -81 -117 -128c78 53 168 89 267 101c53 7 101 -30 107 -83c7 -53 -30 -101 -83 -107c-58 -7 -112 -27 -159 -55c32 7 65 10 99 10c76 0 150 -17 218 -50c48 -24 68 -81 44 -129zM2137 1085l160 -320c15 -31 4 -68 -25 -85l-209 -119
-l-148 -267c-23 -206 -125 -395 -287 -528c-18 -15 -40 -22 -61 -22c-28 0 -55 12 -74 35c-34 41 -28 101 13 135c45 38 85 81 117 128c-78 -53 -168 -89 -267 -101c-4 -1 -8 -1 -12 -1c-48 0 -89 36 -95 84c-7 53 30 101 83 107c58 7 112 27 159 55c-32 -7 -65 -10 -99 -10
-c-76 0 -150 17 -218 50c-48 24 -68 81 -44 129c23 47 81 67 128 44c42 -21 87 -31 134 -31c35 0 68 6 99 17c-6 0 -13 -1 -19 -1c-123 0 -236 72 -289 183c-23 48 -2 105 46 128c12 6 25 9 39 9c-14 0 -27 3 -39 9c-48 23 -69 80 -46 128c53 111 166 183 289 183h7
-c14 -2 28 -3 42 -4l291 -27l239 120c10 5 19 7 29 7c23 0 46 -13 57 -35z" />
-    <glyph glyph-name="binoculars" unicode="&#xf1e5;" horiz-adv-x="1792" 
-d="M704 1216v-768c0 -35 -29 -64 -64 -64v-576c0 -35 -29 -64 -64 -64h-512c-35 0 -64 29 -64 64v512l249 873c4 14 17 23 31 23h424zM1024 1216v-704h-256v704h256zM1792 320v-512c0 -35 -29 -64 -64 -64h-512c-35 0 -64 29 -64 64v576c-35 0 -64 29 -64 64v768h424
-c14 0 27 -9 31 -23zM736 1504v-224h-352v224c0 18 14 32 32 32h288c18 0 32 -14 32 -32zM1408 1504v-224h-352v224c0 18 14 32 32 32h288c18 0 32 -14 32 -32z" />
-    <glyph glyph-name="sticky-note" unicode="&#xf249;" 
-d="M1024 288v-416h-928c-53 0 -96 43 -96 96v1344c0 53 43 96 96 96h1344c53 0 96 -43 96 -96v-928h-416c-53 0 -96 -43 -96 -96zM1152 256h381c-9 -48 -35 -102 -65 -132l-184 -184c-30 -30 -84 -56 -132 -65v381z" />
-    <glyph glyph-name="user" unicode="&#xf007;" horiz-adv-x="1280" 
-d="M1280 137c0 -146 -96 -265 -213 -265h-854c-117 0 -213 119 -213 265c0 263 65 567 327 567c81 -79 191 -128 313 -128s232 49 313 128c262 0 327 -304 327 -567zM1024 1024c0 -212 -172 -384 -384 -384s-384 172 -384 384s172 384 384 384s384 -172 384 -384z" />
-    <glyph glyph-name="php" unicode="&#xf30e;" horiz-adv-x="2299" 
-d="M1149 1245c635 0 1150 -271 1150 -605s-515 -605 -1150 -605s-1149 271 -1149 605s514 605 1149 605zM1049 1081l-130 -627h125l74 359l100 -1c32 0 52 -6 62 -18s12 -33 6 -62l-58 -278h126l61 291c13 65 4 109 -27 132c-30 23 -77 36 -138 37h-111l35 167h-125z
-M478 914v0l-129 -625h126l34 165h108c37 0 73 5 107 13s66 27 96 57c25 24 44 50 58 80s24 60 28 91c11 67 1 121 -31 160s-84 58 -155 59h-242zM1549 914l-130 -625h126l34 165h109c37 0 72 5 106 13s67 27 97 57c25 24 43 50 57 80s24 60 28 91c11 67 1 121 -31 160
-s-84 58 -155 59h-241zM623 815v0c48 1 88 -4 120 -13s43 -45 32 -106c-13 -73 -38 -115 -77 -127s-87 -18 -145 -17h-12c-3 0 -8 1 -11 1l54 261h18c7 0 14 0 21 1zM1693 815v0c48 1 88 -4 120 -13s44 -45 33 -106c-13 -73 -39 -115 -78 -127s-87 -18 -145 -17h-12
-c-3 0 -8 1 -11 1l54 261h18c7 0 14 0 21 1z" />
-    <glyph glyph-name="ioxhost" unicode="&#xf208;" horiz-adv-x="2048" 
-d="M1463 704c0 -47 -38 -86 -86 -86h-702c-48 0 -86 39 -86 86s38 86 86 86h702c48 0 86 -39 86 -86zM1677 704c0 59 -8 115 -23 170h-982c-48 0 -86 38 -86 85c0 48 38 86 86 86h908c-115 187 -321 311 -555 311c-360 0 -653 -292 -653 -652c0 -59 8 -115 23 -170h982
-c48 0 86 -38 86 -85c0 -48 -38 -86 -86 -86h-908c115 -187 321 -311 556 -311c359 0 652 292 652 652zM2048 959c0 -47 -38 -85 -86 -85h-131c11 -55 17 -112 17 -170c0 -454 -369 -824 -823 -824c-333 0 -620 198 -750 483h-189c-48 0 -86 38 -86 86c0 47 38 85 86 85h132
-c-11 55 -17 112 -17 170c0 454 369 824 824 824c332 0 619 -198 749 -483h188c48 0 86 -38 86 -86z" />
-    <glyph glyph-name="expand" unicode="&#xf065;" 
-d="M755 480c0 -8 -4 -17 -10 -23l-332 -332l144 -144c12 -12 19 -28 19 -45c0 -35 -29 -64 -64 -64h-448c-35 0 -64 29 -64 64v448c0 35 29 64 64 64c17 0 33 -7 45 -19l144 -144l332 332c6 6 15 10 23 10s17 -4 23 -10l114 -114c6 -6 10 -15 10 -23zM1536 1344v-448
-c0 -35 -29 -64 -64 -64c-17 0 -33 7 -45 19l-144 144l-332 -332c-6 -6 -15 -10 -23 -10s-17 4 -23 10l-114 114c-6 6 -10 15 -10 23s4 17 10 23l332 332l-144 144c-12 12 -19 28 -19 45c0 35 29 64 64 64h448c35 0 64 -29 64 -64z" />
-    <glyph glyph-name="discord-alt" unicode="&#xf2ef;" 
-d="M559 1212v0l13 -16c-237 -68 -346 -172 -346 -172s29 16 78 38c141 62 252 79 298 83c8 1 15 3 23 3c80 11 170 13 265 2c125 -14 259 -51 396 -126c0 0 -103 99 -327 167l18 21s181 4 370 -138c0 0 189 -343 189 -766c0 0 -111 -191 -402 -200c0 0 -48 56 -87 106
-c172 49 238 157 238 157c-54 -35 -105 -61 -151 -78c-66 -28 -129 -45 -191 -56c-126 -24 -242 -17 -341 1c-75 14 -139 36 -193 57c-30 12 -63 26 -96 44c-4 3 -8 4 -12 7c-3 1 -4 3 -5 4c-24 13 -37 22 -37 22s63 -105 230 -155c-39 -50 -88 -109 -88 -109
-c-291 9 -401 200 -401 200c0 423 189 766 189 766c189 142 370 138 370 138zM522 722v0c-75 0 -134 -66 -134 -146s60 -146 134 -146c75 0 134 66 134 146c1 80 -59 146 -134 146zM1002 722v0c-75 0 -134 -66 -134 -146s60 -146 134 -146c75 0 134 66 134 146
-s-59 146 -134 146z" />
-    <glyph glyph-name="bitbucket-square" unicode="&#xf172;" 
-d="M848 666c0 57 -70 96 -118 67c-57 -27 -57 -119 1 -143c52 -31 125 16 117 76zM928 682c11 -88 -58 -174 -146 -182s-171 64 -175 153c-3 66 38 130 98 157c94 42 210 -26 223 -128zM1100 1073c-44 -45 -111 -51 -170 -58c-107 -14 -216 -13 -324 0
-c-59 8 -124 15 -170 58c28 40 78 48 123 55c135 24 273 23 408 1c48 -7 102 -15 133 -56zM1142 327c0 24 25 65 -9 75c-215 -142 -515 -142 -731 0l-12 -6l-5 -12c12 -70 23 -141 41 -210c41 -71 129 -95 204 -108c142 -26 299 -18 428 53c75 42 63 137 84 208zM1272 1020
-c4 24 9 53 -8 75c-38 48 -98 71 -155 88c-158 46 -325 52 -487 36c-77 -7 -154 -20 -226 -46c-54 -21 -127 -49 -136 -113c18 -150 47 -297 72 -446c8 -42 8 -92 46 -122c81 -62 184 -89 284 -100c148 -16 305 -5 440 63c38 20 82 46 90 92c28 157 55 314 80 473zM1536 1120
-v-960c0 -159 -129 -288 -288 -288h-960c-159 0 -288 129 -288 288v960c0 159 129 288 288 288h960c159 0 288 -129 288 -288z" />
-    <glyph glyph-name="hand-paper-o" unicode="&#xf256;" horiz-adv-x="1632" 
-d="M880 1408c-62 0 -112 -50 -112 -112v-656h-32v528c0 62 -50 112 -112 112s-112 -50 -112 -112v-784l-154 205c-24 32 -62 51 -102 51c-71 0 -128 -58 -128 -128c0 -28 9 -55 26 -77l384 -512c24 -32 62 -51 102 -51h688c46 0 86 33 95 78l76 405c3 19 5 39 5 59v498
-c0 62 -50 112 -112 112s-112 -50 -112 -112v-272h-32v528c0 62 -50 112 -112 112s-112 -50 -112 -112v-528h-32v656c0 62 -50 112 -112 112zM880 1536c90 0 173 -51 214 -132c14 3 28 4 42 4c132 0 240 -108 240 -240v-17c139 8 256 -99 256 -239v-498c0 -28 -3 -56 -8 -83
-l-76 -404c-19 -106 -112 -183 -220 -183h-688c-80 0 -157 39 -205 102l-384 512c-33 44 -51 99 -51 154c0 141 114 256 256 256c42 0 93 -10 128 -34v434c0 132 108 240 240 240c14 0 28 -1 42 -4c41 81 124 132 214 132z" />
-    <glyph glyph-name="database" unicode="&#xf1c0;" 
-d="M768 768c301 0 603 54 768 170v-170c0 -141 -344 -256 -768 -256s-768 115 -768 256v170c165 -116 467 -170 768 -170zM768 0c301 0 603 54 768 170v-170c0 -141 -344 -256 -768 -256s-768 115 -768 256v170c165 -116 467 -170 768 -170zM768 384c301 0 603 54 768 170
-v-170c0 -141 -344 -256 -768 -256s-768 115 -768 256v170c165 -116 467 -170 768 -170zM768 1536c424 0 768 -115 768 -256v-128c0 -141 -344 -256 -768 -256s-768 115 -768 256v128c0 141 344 256 768 256z" />
-    <glyph glyph-name="jirafeau" unicode="&#xf318;" 
-d="M1459 1408c43 0 77 -34 77 -77v-1382c0 -43 -34 -77 -77 -77h-923c18 109 27 134 50 210c31 103 92 108 92 108c49 11 74 31 224 -36s270 -72 270 -72v0c15 -19 71 -80 137 -85c90 -7 128 19 128 19s31 91 -38 176s-336 376 -343 403c0 0 -40 47 -69 58s-119 63 -135 130
-s-42 168 -33 215s22 152 -32 130s-31 -74 -40 -137s-52 -190 -112 -190c0 0 -87 150 -145 132s-108 -181 -63 -275c0 0 -210 -295 -393 -772c-20 14 -34 37 -34 63v1382c0 43 34 77 77 77h1382z" />
-    <glyph glyph-name="user-circle-o" unicode="&#xf2be;" horiz-adv-x="1792" 
-d="M896 1536c495 0 896 -401 896 -896c0 -492 -399 -896 -896 -896c-496 0 -896 403 -896 896c0 495 401 896 896 896zM1515 185c93 128 149 285 149 455c0 423 -345 768 -768 768s-768 -345 -768 -768c0 -170 56 -327 149 -455c36 179 123 327 306 327
-c81 -79 191 -128 313 -128s232 49 313 128c183 0 270 -148 306 -327zM1280 832c0 -212 -172 -384 -384 -384s-384 172 -384 384s172 384 384 384s384 -172 384 -384z" />
-    <glyph glyph-name="hacker-news" unicode="&#xf1d4;" 
-d="M809 532l266 499h-112l-157 -312s-24 -48 -44 -92c-19 46 -42 92 -42 92l-155 312h-120l263 -493v-324h101v318zM1536 1120v-960c0 -159 -129 -288 -288 -288h-960c-159 0 -288 129 -288 288v960c0 159 129 288 288 288h960c159 0 288 -129 288 -288z" />
-    <glyph glyph-name="edge" unicode="&#xf282;" horiz-adv-x="1654" 
-d="M0 741h1c52 414 335 796 841 795c307 0 560 -144 708 -409c76 -137 104 -283 104 -442v-188h-1125c5 -464 682 -448 974 -244v-377c-171 -103 -557 -192 -858 -77c-255 98 -433 363 -436 621c-4 333 165 554 436 680c-57 -72 -101 -150 -124 -285h635
-c37 379 -359 379 -359 379c-374 -13 -644 -231 -797 -453z" />
-    <glyph glyph-name="calendar-plus-o" unicode="&#xf271;" horiz-adv-x="1664" 
-d="M1536 1280c70 0 128 -58 128 -128v-1280c0 -70 -58 -128 -128 -128h-1408c-70 0 -128 58 -128 128v1280c0 70 58 128 128 128h128v96c0 88 72 160 160 160h64c88 0 160 -72 160 -160v-96h384v96c0 88 72 160 160 160h64c88 0 160 -72 160 -160v-96h128zM1152 1376v-288
-c0 -18 14 -32 32 -32h64c18 0 32 14 32 32v288c0 18 -14 32 -32 32h-64c-18 0 -32 -14 -32 -32zM384 1376v-288c0 -18 14 -32 32 -32h64c18 0 32 14 32 32v288c0 18 -14 32 -32 32h-64c-18 0 -32 -14 -32 -32zM1536 -128v1024h-1408v-1024h1408zM896 448h224
-c18 0 32 -14 32 -32v-64c0 -18 -14 -32 -32 -32h-224v-224c0 -18 -14 -32 -32 -32h-64c-18 0 -32 14 -32 32v224h-224c-18 0 -32 14 -32 32v64c0 18 14 32 32 32h224v224c0 18 14 32 32 32h64c18 0 32 -14 32 -32v-224z" />
-    <glyph glyph-name="hand-lizard-o" unicode="&#xf258;" horiz-adv-x="2048" 
-d="M1151 1536c81 0 159 -39 207 -105l572 -781c77 -104 118 -229 118 -359v-355c0 -106 -86 -192 -192 -192h-384c-106 0 -192 86 -192 192v177l-286 143h-546c-106 0 -192 86 -192 192v32c0 159 129 288 288 288h420l42 128h-686c-133 0 -244 102 -255 234
-c-42 51 -65 116 -65 182v32c0 106 86 192 192 192h959zM1920 -64v355c0 101 -33 202 -93 284l-573 781c-24 32 -62 52 -103 52h-959c-35 0 -64 -29 -64 -64c0 -53 1 -90 36 -133c13 41 50 69 92 69h832v-32h-832c-35 0 -64 -29 -64 -64c0 -19 -1 -39 3 -58
-c11 -59 65 -102 125 -102h731c53 0 96 -43 96 -96c0 -10 -2 -21 -5 -30l-64 -192c-13 -39 -50 -66 -91 -66h-443c-88 0 -160 -72 -160 -160v-32c0 -35 29 -64 64 -64h561c10 0 20 -2 29 -7l317 -158c32 -17 53 -50 53 -86v-197c0 -35 29 -64 64 -64h384c35 0 64 29 64 64z
-" />
-    <glyph glyph-name="digitalocean" unicode="&#xf31d;" horiz-adv-x="1535" 
-d="M245 169h-191v190h191v-190zM473 -59h-228v228h228v-228zM769 465v-296h-296v296h296zM768 -128v298c315 0 559 312 438 644c-44 123 -142 221 -265 265c-332 120 -644 -123 -644 -438h-297c0 502 485 894 1012 729c230 -72 414 -255 485 -485
-c165 -527 -226 -1013 -729 -1013z" />
-    <glyph glyph-name="xing" unicode="&#xf168;" horiz-adv-x="1408" 
-d="M597 869c0 0 -10 -17 -257 -456c-13 -22 -30 -46 -65 -46h-239c-14 0 -25 7 -31 17s-7 23 0 36l253 448c1 0 1 0 0 1l-161 279c-7 13 -8 27 -1 37c6 10 18 15 32 15h239c36 0 54 -24 66 -45c163 -285 164 -286 164 -286zM1403 1511c7 -10 7 -24 0 -37l-528 -934
-c-1 0 -1 -1 0 -1l336 -615c7 -13 7 -27 1 -37c-7 -10 -18 -15 -32 -15h-239c-36 0 -55 24 -66 45c-339 621 -339 622 -339 622s17 30 531 942c13 23 28 45 64 45h241c14 0 25 -5 31 -15z" />
-    <glyph glyph-name="youtube-square" unicode="&#xf166;" 
-d="M919 233v157c0 33 -10 50 -29 50c-11 0 -22 -5 -33 -16v-224c11 -11 22 -16 33 -16c19 0 29 16 29 49zM1103 355h66v34c0 34 -11 51 -33 51s-33 -17 -33 -51v-34zM532 621v-70h-80v-423h-74v423h-78v70h232zM733 495v-367h-67v40c-26 -30 -51 -45 -76 -45
-c-21 0 -36 9 -42 28c-4 11 -6 28 -6 54v290h66v-270c0 -15 0 -24 1 -26c1 -10 6 -15 15 -15c14 0 27 10 42 31v280h67zM985 384v-146c0 -33 -2 -58 -7 -73c-8 -28 -26 -42 -53 -42c-23 0 -46 14 -68 41v-36h-67v493h67v-161c21 26 44 40 68 40c27 0 45 -14 53 -42
-c5 -15 7 -39 7 -74zM1236 255v-9c0 -22 -1 -36 -2 -43c-2 -15 -7 -28 -15 -40c-18 -27 -46 -40 -80 -40c-35 0 -62 13 -81 38c-14 18 -21 47 -21 86v129c0 39 6 67 20 86c19 25 46 38 80 38c33 0 60 -13 78 -38c14 -19 21 -47 21 -86v-76h-133v-65c0 -34 11 -51 34 -51
-c16 0 26 9 30 26c0 4 1 19 1 45h68zM785 1079v-156c0 -34 -11 -51 -32 -51c-22 0 -32 17 -32 51v156c0 34 10 52 32 52c21 0 32 -18 32 -52zM1318 366c0 86 0 177 -19 260c-14 59 -62 102 -119 108c-136 15 -274 15 -412 15c-137 0 -275 0 -411 -15
-c-58 -6 -106 -49 -119 -108c-19 -83 -20 -174 -20 -260c0 -85 0 -176 20 -260c13 -58 61 -101 118 -108c137 -15 275 -15 412 -15s275 0 412 15c57 7 105 50 118 108c20 84 20 175 20 260zM563 1017l90 296h-75l-51 -195l-53 195h-78c15 -46 32 -92 47 -138
-c24 -70 39 -122 46 -158v-201h74v201zM852 936v130c0 39 -7 68 -21 87c-19 25 -45 38 -78 38c-34 0 -60 -13 -78 -38c-14 -19 -21 -48 -21 -87v-130c0 -39 7 -68 21 -87c18 -25 44 -38 78 -38c33 0 59 13 78 38c14 18 21 48 21 87zM1033 816h67v370h-67v-283
-c-15 -21 -29 -31 -42 -31c-9 0 -15 5 -16 16c-1 2 -1 10 -1 26v272h-67v-293c0 -26 2 -43 6 -55c7 -18 22 -27 43 -27c25 0 50 15 77 45v-40zM1536 1120v-960c0 -159 -129 -288 -288 -288h-960c-159 0 -288 129 -288 288v960c0 159 129 288 288 288h960
-c159 0 288 -129 288 -288z" />
-    <glyph glyph-name="taxi" unicode="&#xf1ba;" horiz-adv-x="2048" 
-d="M1824 640c124 0 224 -100 224 -224v-384c0 -18 -14 -32 -32 -32h-96v-64c0 -106 -86 -192 -192 -192s-192 86 -192 192v64h-1024v-64c0 -106 -86 -192 -192 -192s-192 86 -192 192v64h-96c-18 0 -32 14 -32 32v384c0 124 100 224 224 224h28l105 419
-c31 126 153 221 283 221h128v224c0 18 14 32 32 32h448c18 0 32 -14 32 -32v-224h128c130 0 252 -95 283 -221l105 -419h28zM320 160c88 0 160 72 160 160s-72 160 -160 160s-160 -72 -160 -160s72 -160 160 -160zM516 640h1016l-89 357c-3 11 -23 27 -35 27h-768
-c-12 0 -32 -16 -35 -27zM1728 160c88 0 160 72 160 160s-72 160 -160 160s-160 -72 -160 -160s72 -160 160 -160z" />
-    <glyph glyph-name="sort-desc" unicode="&#xf0dd;" horiz-adv-x="1024" 
-d="M1024 448c0 -17 -7 -33 -19 -45l-448 -448c-12 -12 -28 -19 -45 -19s-33 7 -45 19l-448 448c-12 12 -19 28 -19 45c0 35 29 64 64 64h896c35 0 64 -29 64 -64z" />
-    <glyph glyph-name="rocket" unicode="&#xf135;" horiz-adv-x="1632" 
-d="M1408 1088c0 53 -43 96 -96 96s-96 -43 -96 -96s43 -96 96 -96s96 43 96 96zM1632 1376c0 -332 -92 -553 -329 -791c-58 -57 -124 -116 -195 -176l-20 -379c-1 -10 -7 -20 -16 -26l-384 -224c-5 -3 -10 -4 -16 -4c-8 0 -16 3 -23 9l-64 64c-8 9 -11 21 -8 32l85 276
-l-281 281l-276 -85c-3 -1 -6 -1 -9 -1c-8 0 -17 3 -23 9l-64 64c-10 11 -12 27 -5 39l224 384c6 9 16 15 26 16l379 20c60 71 119 137 176 195c250 249 441 329 789 329c18 0 34 -14 34 -32z" />
-    <glyph glyph-name="discord" unicode="&#xf2ee;" 
-d="M180 1516v0h1176c99 0 180 -81 180 -181v-1575l-189 167l-106 98l-112 105l46 -163h-995c-99 0 -180 81 -180 181v1187c0 100 81 181 180 181zM634 1107c0 0 -121 3 -247 -92c0 0 -126 -229 -126 -512c0 0 73 -128 267 -134c0 0 33 40 59 73c-111 33 -153 104 -153 104
-s8 -6 24 -15c1 -1 2 -2 4 -3c3 -2 5 -2 8 -4c22 -12 44 -22 64 -30c36 -14 79 -28 129 -38c66 -12 143 -17 227 -1c41 7 83 20 127 38c31 11 65 28 101 52c0 0 -44 -73 -159 -105c26 -33 58 -71 58 -71c194 6 269 134 269 134c0 283 -127 512 -127 512
-c-126 95 -246 92 -246 92l-12 -14c149 -46 218 -112 218 -112c-91 50 -181 75 -264 85c-63 7 -123 5 -177 -2c-5 0 -10 -1 -15 -2c-31 -3 -106 -14 -200 -55c-32 -15 -51 -26 -51 -26s72 69 230 115zM609 779c50 0 91 -43 90 -97c0 -54 -40 -98 -90 -98c-49 0 -89 44 -89 98
-s39 97 89 97zM930 779c50 0 89 -43 89 -97s-39 -98 -89 -98c-49 0 -90 44 -90 98s40 97 90 97z" />
-    <glyph glyph-name="money" unicode="&#xf0d6;" horiz-adv-x="1920" 
-d="M768 384h384v96h-128v448h-114l-148 -137l77 -80c24 21 39 32 55 57h2v-288h-128v-96zM1280 640c0 -182 -110 -416 -320 -416s-320 234 -320 416s110 416 320 416s320 -234 320 -416zM1792 384v512c-141 0 -256 115 -256 256h-1152c0 -141 -115 -256 -256 -256v-512
-c141 0 256 -115 256 -256h1152c0 141 115 256 256 256zM1920 1216v-1152c0 -35 -29 -64 -64 -64h-1792c-35 0 -64 29 -64 64v1152c0 35 29 64 64 64h1792c35 0 64 -29 64 -64z" />
-    <glyph glyph-name="laptop" unicode="&#xf109;" horiz-adv-x="1920" 
-d="M416 256c-88 0 -160 72 -160 160v704c0 88 72 160 160 160h1088c88 0 160 -72 160 -160v-704c0 -88 -72 -160 -160 -160h-1088zM384 1120v-704c0 -17 15 -32 32 -32h1088c17 0 32 15 32 32v704c0 17 -15 32 -32 32h-1088c-17 0 -32 -15 -32 -32zM1760 192h160v-96
-c0 -53 -72 -96 -160 -96h-1600c-88 0 -160 43 -160 96v96h1760zM1040 96c9 0 16 7 16 16s-7 16 -16 16h-160c-9 0 -16 -7 -16 -16s7 -16 16 -16h160z" />
-    <glyph glyph-name="arrows-alt" unicode="&#xf0b2;" 
-d="M1283 995l-355 -355l355 -355l144 144c18 19 46 24 70 14c23 -10 39 -33 39 -59v-448c0 -35 -29 -64 -64 -64h-448c-26 0 -49 16 -59 40c-10 23 -5 51 14 69l144 144l-355 355l-355 -355l144 -144c19 -18 24 -46 14 -69c-10 -24 -33 -40 -59 -40h-448
-c-35 0 -64 29 -64 64v448c0 26 16 49 40 59c23 10 51 5 69 -14l144 -144l355 355l-355 355l-144 -144c-12 -12 -28 -19 -45 -19c-8 0 -17 2 -24 5c-24 10 -40 33 -40 59v448c0 35 29 64 64 64h448c26 0 49 -16 59 -40c10 -23 5 -51 -14 -69l-144 -144l355 -355l355 355
-l-144 144c-19 18 -24 46 -14 69c10 24 33 40 59 40h448c35 0 64 -29 64 -64v-448c0 -26 -16 -49 -39 -59c-8 -3 -17 -5 -25 -5c-17 0 -33 7 -45 19z" />
-    <glyph glyph-name="thermometer-empty" unicode="&#xf2cb;" horiz-adv-x="1024" 
-d="M640 192c0 -106 -86 -192 -192 -192s-192 86 -192 192c0 105 85 192 192 192s192 -88 192 -192zM768 192c0 105 -50 197 -128 256v768c0 106 -86 192 -192 192s-192 -86 -192 -192v-768c-78 -59 -128 -151 -128 -256c0 -177 143 -320 320 -320s320 143 320 320zM896 192
-c0 -247 -201 -448 -448 -448s-448 201 -448 448c0 122 49 232 128 313v711c0 177 143 320 320 320s320 -143 320 -320v-711c79 -81 128 -191 128 -313zM1024 768v-128h-192v128h192zM1024 1024v-128h-192v128h192zM1024 1280v-128h-192v128h192z" />
-    <glyph glyph-name="underline" unicode="&#xf0cd;" 
-d="M48 1313c-18 1 -33 1 -45 4l-3 88c13 1 26 1 40 1c35 0 73 -1 112 -4c94 -5 150 -7 166 -7c57 0 113 1 168 3c54 2 103 4 146 5c42 0 71 1 86 2l-1 -14l2 -64v-9c-40 -6 -81 -9 -124 -9c-40 0 -66 -8 -79 -25c-9 -10 -13 -54 -13 -132c0 -24 1 -43 1 -58l1 -229l14 -280
-c4 -81 20 -148 51 -202c23 -39 55 -70 96 -92c60 -32 119 -47 177 -47c68 0 132 9 191 28c35 11 68 27 99 51c31 23 53 44 65 64c26 40 43 79 53 114c14 49 21 125 21 229c0 179 -13 184 -28 410l-4 59c-3 43 -10 73 -24 88c-22 23 -48 35 -77 34l-100 -2l-14 3l2 86h84
-l205 -10c68 -3 133 3 196 10l18 -2c4 -25 6 -42 6 -51s-2 -19 -4 -31c-27 -7 -55 -12 -84 -13c-47 -7 -74 -12 -79 -17c-9 -9 -15 -22 -15 -41c0 -13 2 -33 3 -58c0 0 8 -18 22 -396c5 -151 -5 -253 -15 -304s-24 -92 -41 -122c-26 -44 -64 -85 -112 -123
-c-49 -37 -109 -67 -182 -89s-158 -33 -255 -33c-110 0 -205 15 -284 46s-139 72 -179 122s-68 115 -83 195c-11 55 -16 134 -16 237v333c0 126 -6 197 -17 213c-16 23 -65 37 -147 39zM1536 -96c0 -18 -14 -32 -32 -32h-1472c-18 0 -32 14 -32 32v64c0 18 14 32 32 32h1472
-c18 0 32 -14 32 -32v-64z" />
-    <glyph glyph-name="sun-o" unicode="&#xf185;" horiz-adv-x="1707" 
-d="M1430 640c0 318 -258 576 -576 576s-576 -258 -576 -576s258 -576 576 -576s576 258 576 576zM1706 363c-3 -10 -11 -17 -20 -20l-292 -96v-306c0 -10 -5 -20 -13 -26c-9 -6 -19 -8 -29 -4l-292 94l-180 -248c-6 -8 -16 -13 -26 -13s-20 5 -26 13l-180 248l-292 -94
-c-10 -4 -20 -2 -29 4c-8 6 -13 16 -13 26v306l-292 96c-9 3 -17 10 -20 20s-2 21 4 29l180 248l-180 248c-6 9 -7 19 -4 29s11 17 20 20l292 96v306c0 10 5 20 13 26c9 6 19 8 29 4l292 -94l180 248c12 16 40 16 52 0l180 -248l292 94c10 4 20 2 29 -4c8 -6 13 -16 13 -26
-v-306l292 -96c9 -3 17 -10 20 -20s2 -20 -4 -29l-180 -248l180 -248c6 -8 7 -19 4 -29z" />
-    <glyph glyph-name="activitypub" unicode="&#xf2f2;" horiz-adv-x="2032" 
-d="M924 1280v-1280l-185 107v853l-739 -427v214zM1109 1280l923 -533v-214l-923 -533v213l739 427l-739 427v213zM1109 853l369 -213l-369 -213v426zM554 640v-427l-369 214z" />
-    <glyph glyph-name="play-circle" unicode="&#xf144;" 
-d="M768 1408c424 0 768 -344 768 -768s-344 -768 -768 -768s-768 344 -768 768s344 768 768 768zM1152 585c20 11 32 32 32 55s-12 44 -32 55l-544 320c-19 12 -44 12 -64 1c-20 -12 -32 -33 -32 -56v-640c0 -23 12 -44 32 -56c10 -5 21 -8 32 -8s22 3 32 9z" />
-    <glyph glyph-name="share-square-o" unicode="&#xf045;" horiz-adv-x="1664" 
-d="M1408 547v-259c0 -159 -129 -288 -288 -288h-832c-159 0 -288 129 -288 288v832c0 159 129 288 288 288h255c17 0 32 -14 32 -32c0 -16 -11 -29 -26 -32c-50 -17 -95 -37 -133 -60c-5 -2 -10 -4 -16 -4h-112c-88 0 -160 -72 -160 -160v-832c0 -88 72 -160 160 -160h832
-c88 0 160 72 160 160v214c0 12 7 23 18 29c20 9 38 22 54 37c9 9 23 13 35 8s21 -16 21 -29zM1645 1043l-384 -384c-12 -13 -28 -19 -45 -19c-8 0 -17 2 -25 5c-23 10 -39 33 -39 59v192h-160c-220 0 -360 -42 -438 -131c-81 -93 -105 -243 -74 -473c2 -14 -7 -28 -20 -34
-c-4 -1 -8 -2 -12 -2c-10 0 -20 5 -26 13c-7 10 -166 235 -166 435c0 268 84 576 736 576h160v192c0 26 16 49 39 59c8 3 17 5 25 5c17 0 33 -7 45 -19l384 -384c25 -25 25 -65 0 -90z" />
-    <glyph glyph-name="street-view" unicode="&#xf21d;" horiz-adv-x="1408" 
-d="M1408 0c0 -176 -365 -256 -704 -256s-704 80 -704 256c0 136 203 200 373 229c35 6 68 -17 74 -52s-17 -68 -52 -74c-206 -36 -264 -92 -267 -104c10 -34 202 -127 576 -127s566 93 576 129c-3 10 -61 66 -267 102c-35 6 -58 39 -52 74s39 58 74 52
-c170 -29 373 -93 373 -229zM1024 896v-384c0 -35 -29 -64 -64 -64h-64v-384c0 -35 -29 -64 -64 -64h-256c-35 0 -64 29 -64 64v384h-64c-35 0 -64 29 -64 64v384c0 71 57 128 128 128h384c71 0 128 -57 128 -128zM928 1280c0 -124 -100 -224 -224 -224s-224 100 -224 224
-s100 224 224 224s224 -100 224 -224z" />
-    <glyph glyph-name="arrow-circle-up" unicode="&#xf0aa;" 
-d="M1284 641c0 17 -6 33 -18 45l-362 362l-91 91c-12 12 -28 18 -45 18s-33 -6 -45 -18l-91 -91l-362 -362c-12 -12 -18 -28 -18 -45s6 -33 18 -45l91 -91c12 -12 28 -18 45 -18s33 6 45 18l189 189v-502c0 -35 29 -64 64 -64h128c35 0 64 29 64 64v502l189 -189
-c12 -12 28 -19 45 -19s33 7 45 19l91 91c12 12 18 28 18 45zM1536 640c0 -424 -344 -768 -768 -768s-768 344 -768 768s344 768 768 768s768 -344 768 -768z" />
-    <glyph glyph-name="podcast" unicode="&#xf2ce;" 
-d="M994 344c0 -66 -7 -132 -17 -197c-15 -104 -30 -211 -55 -313c-18 -73 -86 -90 -152 -90s-134 17 -152 90c-25 102 -40 209 -55 313c-10 65 -17 131 -17 197c0 135 109 168 224 168s224 -33 224 -168zM1536 768c0 -324 -200 -601 -484 -714c-11 -4 -23 6 -21 18
-c3 21 6 43 10 66c2 16 4 32 6 47c1 6 4 10 9 12c208 106 352 322 352 571c0 365 -306 659 -675 639c-338 -18 -607 -306 -605 -644c2 -249 147 -464 356 -568c5 -2 8 -7 9 -12c2 -14 4 -29 6 -45c4 -24 7 -46 11 -68c2 -12 -11 -22 -22 -17c-297 116 -504 412 -487 753
-c19 387 331 704 718 728c446 28 817 -326 817 -766zM994 800c0 -124 -100 -224 -224 -224s-224 100 -224 224s100 224 224 224s224 -100 224 -224zM1282 768c0 -165 -79 -313 -200 -406c-10 -8 -24 -1 -26 12c-3 28 -11 61 -29 92c-4 6 -3 14 3 20c76 70 124 170 124 282
-c0 226 -197 407 -428 382c-177 -20 -321 -166 -338 -344c-13 -126 37 -242 122 -320c6 -6 7 -14 3 -20c-18 -31 -26 -64 -29 -93c-2 -12 -16 -19 -26 -11c-124 96 -203 247 -200 417c6 266 222 488 487 500c294 14 537 -220 537 -511z" />
-    <glyph glyph-name="hackster" unicode="&#xf326;" 
-d="M768 -128c-424 0 -768 344 -768 768s344 768 768 768s768 -344 768 -768s-344 -768 -768 -768zM517 887c-10 -3 -17 -13 -17 -23s8 -18 18 -18h113c17 0 31 14 31 31v9c0 3 0 5 -1 8c-4 16 -22 26 -38 22zM661 739v59v5c-2 9 -12 13 -21 11l-325 -88c-5 -1 -9 -7 -9 -12
-s4 -9 9 -9h151c17 0 31 -14 31 -31v-86c0 -9 8 -17 17 -17h324c17 0 31 -13 31 -30v-59v-5c2 -9 12 -13 21 -11l325 88c5 1 9 7 9 12s-4 9 -9 9h-152c-17 0 -30 14 -30 31v85c0 9 -8 17 -17 17h-324c-17 0 -31 14 -31 31v0zM891 989c-13 -4 -23 -16 -23 -30v-176
-c0 -17 14 -31 31 -31h101c17 0 30 14 30 31v203v0c0 2 0 6 -1 8c-4 16 -21 26 -37 22zM1013 386c10 3 17 13 17 23s-8 19 -18 19h-113c-17 0 -31 -14 -31 -31v-9c0 -3 0 -5 1 -8c4 -16 22 -26 38 -22zM639 285c13 4 23 16 23 30v176c0 17 -14 30 -31 30h-101
-c-17 0 -30 -13 -30 -30v-204c0 -3 0 -5 1 -8c4 -16 21 -25 37 -21z" />
-    <glyph glyph-name="plus-square" unicode="&#xf0fe;" 
-d="M1280 576v128c0 35 -29 64 -64 64h-320v320c0 35 -29 64 -64 64h-128c-35 0 -64 -29 -64 -64v-320h-320c-35 0 -64 -29 -64 -64v-128c0 -35 29 -64 64 -64h320v-320c0 -35 29 -64 64 -64h128c35 0 64 29 64 64v320h320c35 0 64 29 64 64zM1536 1120v-960
-c0 -159 -129 -288 -288 -288h-960c-159 0 -288 129 -288 288v960c0 159 129 288 288 288h960c159 0 288 -129 288 -288z" />
-    <glyph glyph-name="desktop" unicode="&#xf108;" horiz-adv-x="1920" 
-d="M1792 544v832c0 17 -15 32 -32 32h-1600c-17 0 -32 -15 -32 -32v-832c0 -17 15 -32 32 -32h1600c17 0 32 15 32 32zM1920 1376v-1088c0 -88 -72 -160 -160 -160h-544c0 -85 64 -157 64 -192s-29 -64 -64 -64h-512c-35 0 -64 29 -64 64c0 37 64 105 64 192h-544
-c-88 0 -160 72 -160 160v1088c0 88 72 160 160 160h1600c88 0 160 -72 160 -160z" />
-    <glyph glyph-name="expeditedssl" unicode="&#xf23e;" horiz-adv-x="1792" 
-d="M896 1472c-459 0 -832 -373 -832 -832s373 -832 832 -832s832 373 832 832s-373 832 -832 832zM896 1536c495 0 896 -401 896 -896s-401 -896 -896 -896s-896 401 -896 896s401 896 896 896zM496 704c9 0 16 -7 16 -16v-480c0 -9 -7 -16 -16 -16h-32c-9 0 -16 7 -16 16
-v480c0 9 7 16 16 16h32zM896 640c71 0 128 -57 128 -128c0 -47 -26 -88 -64 -110v-114c0 -18 -14 -32 -32 -32h-64c-18 0 -32 14 -32 32v114c-38 22 -64 63 -64 110c0 71 57 128 128 128zM896 1408c424 0 768 -344 768 -768s-344 -768 -768 -768s-768 344 -768 768
-s344 768 768 768zM544 928v-96c0 -18 14 -32 32 -32h64c18 0 32 14 32 32v96c0 124 100 224 224 224s224 -100 224 -224v-96c0 -18 14 -32 32 -32h64c18 0 32 14 32 32v96c0 194 -158 352 -352 352s-352 -158 -352 -352zM1408 192v512c0 35 -29 64 -64 64h-896
-c-35 0 -64 -29 -64 -64v-512c0 -35 29 -64 64 -64h896c35 0 64 29 64 64z" />
-    <glyph glyph-name="toggle-on" unicode="&#xf205;" horiz-adv-x="2048" 
-d="M0 640c0 353 287 640 640 640h768c353 0 640 -287 640 -640s-287 -640 -640 -640h-768c-353 0 -640 287 -640 640zM1408 128c282 0 512 230 512 512s-230 512 -512 512s-512 -230 -512 -512s230 -512 512 -512z" />
-    <glyph glyph-name="minus-square" unicode="&#xf146;" 
-d="M1280 576v128c0 35 -29 64 -64 64h-896c-35 0 -64 -29 -64 -64v-128c0 -35 29 -64 64 -64h896c35 0 64 29 64 64zM1536 1120v-960c0 -159 -129 -288 -288 -288h-960c-159 0 -288 129 -288 288v960c0 159 129 288 288 288h960c159 0 288 -129 288 -288z" />
-    <glyph glyph-name="adn" unicode="&#xf170;" 
-d="M768 914l201 -306h-402zM1133 384h94l-459 691l-459 -691h94l104 160h522zM1536 640c0 -424 -344 -768 -768 -768s-768 344 -768 768s344 768 768 768s768 -344 768 -768z" />
-    <glyph glyph-name="whatsapp" unicode="&#xf232;" 
-d="M985 562c17 0 180 -85 187 -97c2 -5 2 -11 2 -15c0 -25 -8 -53 -17 -76c-23 -56 -116 -92 -173 -92c-48 0 -147 42 -190 62c-143 65 -232 176 -318 303c-38 56 -72 125 -71 194v8c2 66 26 113 74 158c15 14 31 22 52 22c12 0 24 -3 37 -3c27 0 32 -8 42 -34
-c7 -17 58 -153 58 -163c0 -38 -69 -81 -69 -104c0 -5 2 -10 5 -15c22 -47 64 -101 102 -137c46 -44 95 -73 151 -101c7 -4 14 -7 22 -7c30 0 80 97 106 97zM782 32c346 0 628 282 628 628s-282 628 -628 628s-628 -282 -628 -628c0 -132 42 -261 120 -368l-79 -233l242 77
-c102 -67 223 -104 345 -104zM782 1414c416 0 754 -338 754 -754s-338 -754 -754 -754c-127 0 -253 32 -365 94l-417 -134l136 405c-71 117 -108 252 -108 389c0 416 338 754 754 754z" />
-    <glyph glyph-name="puzzle-piece" unicode="&#xf12e;" horiz-adv-x="1664" 
-d="M1664 438c0 -103 -59 -189 -168 -189c-122 0 -154 111 -264 111c-80 0 -110 -50 -110 -124c0 -78 32 -153 31 -230v-5c-11 0 -22 0 -33 -1c-103 -10 -207 -30 -311 -30c-71 0 -145 28 -145 110c0 110 111 142 111 264c0 109 -86 168 -189 168c-105 0 -202 -58 -202 -173
-c0 -127 97 -182 97 -251c0 -35 -22 -66 -46 -89c-31 -29 -75 -35 -117 -35c-82 0 -164 11 -245 24c-18 3 -37 5 -55 8l-13 2c-2 1 -5 1 -5 2v1024c4 -3 63 -10 73 -12c81 -13 163 -24 245 -24c42 0 86 6 117 35c24 23 46 54 46 89c0 69 -97 124 -97 251
-c0 115 97 173 203 173c102 0 188 -59 188 -168c0 -122 -111 -154 -111 -264c0 -82 74 -110 145 -110c115 0 229 26 343 32v-2c-3 -4 -10 -63 -12 -73c-13 -81 -24 -163 -24 -245c0 -42 6 -86 35 -117c23 -24 54 -46 89 -46c69 0 124 97 251 97c115 0 173 -97 173 -202z" />
-    <glyph glyph-name="css3" unicode="&#xf13c;" horiz-adv-x="1768" 
-d="M263 1408h1505l-266 -1333l-804 -267l-698 267l71 356h297l-29 -147l422 -161l486 161l68 339h-1208l58 297h1209l38 191h-1208z" />
-    <glyph glyph-name="skyatlas" unicode="&#xf216;" horiz-adv-x="2048" 
-d="M1430 953c0 0 -1 1 0 0zM1690 749c194 0 358 -145 358 -343c0 -211 -168 -366 -376 -366c-531 0 -629 799 -1151 799c-202 0 -349 -129 -349 -336c0 -214 160 -343 367 -343c136 0 291 57 401 136c18 13 54 52 73 52s35 -16 35 -35c0 -25 -42 -61 -60 -77
-c-131 -114 -321 -196 -495 -196c-267 0 -493 189 -493 464s216 477 489 477c593 0 712 -787 1158 -787c134 0 235 87 235 224c0 127 -98 223 -224 223c-56 0 -112 -37 -150 -37c-27 0 -51 23 -51 50c0 37 17 76 17 116c0 213 -163 367 -374 367c-170 0 -256 -118 -284 -118
-c-20 0 -36 16 -36 36c0 18 13 33 25 46c81 92 207 140 329 140c254 0 445 -187 445 -441c0 -22 -1 -44 -4 -66c38 10 77 15 115 15z" />
-    <glyph glyph-name="level-down" unicode="&#xf149;" horiz-adv-x="1024" 
-d="M32 1280h704c18 0 32 -15 32 -33v-863h192c25 0 47 -15 58 -37c11 -23 7 -50 -9 -69l-320 -384c-24 -29 -74 -29 -98 0l-320 384c-16 19 -19 46 -9 69c11 22 33 37 58 37h192v640h-320c-9 0 -18 4 -25 11l-160 192c-8 9 -9 23 -4 34s17 19 29 19z" />
-    <glyph glyph-name="stack-overflow" unicode="&#xf16c;" horiz-adv-x="1514" 
-d="M1278 -96v480h160v-640h-1438v640h160v-480h1118zM336 428l33 157l783 -165l-33 -156zM439 802l67 146l725 -339l-67 -145zM640 1158l102 123l614 -513l-102 -123zM1037 1536l477 -641l-128 -96l-477 641zM319 65v159h800v-159h-800z" />
-    <glyph glyph-name="check-square-o" unicode="&#xf046;" horiz-adv-x="1663" 
-d="M1408 606v-318c0 -159 -129 -288 -288 -288h-832c-159 0 -288 129 -288 288v832c0 159 129 288 288 288h832c40 0 80 -8 117 -25c9 -4 16 -13 18 -23c2 -11 -1 -21 -9 -29l-49 -49c-6 -6 -15 -10 -23 -10c-3 0 -6 1 -9 2c-15 4 -30 6 -45 6h-832
-c-88 0 -160 -72 -160 -160v-832c0 -88 72 -160 160 -160h832c88 0 160 72 160 160v254c0 8 3 16 9 22l64 64c7 7 15 10 23 10c4 0 8 -1 12 -3c12 -5 20 -16 20 -29zM1639 1095l-814 -814c-32 -32 -82 -32 -114 0l-430 430c-32 32 -32 82 0 114l110 110c32 32 82 32 114 0
-l263 -263l647 647c32 32 82 32 114 0l110 -110c32 -32 32 -82 0 -114z" />
-    <glyph glyph-name="emby" unicode="&#xf319;" horiz-adv-x="1534" 
-d="M474 224l-62 -62l-412 415l356 356l-60 61l414 414l355 -355l58 57l411 -414l-352 -352l58 -58l-414 -414zM1091 633l-496 291v-578z" />
-    <glyph glyph-name="hand-spock-o" unicode="&#xf259;" horiz-adv-x="1920" 
-d="M459 -256c-103 0 -192 70 -217 170l-101 401c-8 35 -13 72 -13 108c0 23 0 45 -5 67l-116 477c-5 19 -7 38 -7 57c0 124 94 226 217 239c22 113 119 193 235 193c111 0 207 -76 233 -184l83 -348l103 428c26 108 122 184 233 184c119 0 217 -86 236 -202
-c123 -14 212 -118 212 -241c0 -19 -3 -39 -7 -59l-123 -512c80 60 138 118 243 118c139 0 255 -113 255 -253c0 -84 -41 -162 -107 -212l-507 -380c-44 -33 -98 -51 -153 -51h-694zM1104 1408c-51 0 -96 -36 -108 -86l-164 -682h-127l-145 602c-12 50 -57 86 -108 86
-c-64 0 -112 -51 -112 -113c0 -10 1 -19 3 -28l132 -547h-26l-99 408c-12 49 -57 88 -109 88c-62 0 -113 -50 -113 -112c0 -9 1 -18 3 -26l116 -478c14 -58 4 -116 19 -174l100 -401c11 -43 49 -73 93 -73h694c27 0 54 9 76 26l507 379c34 26 56 67 56 110
-c0 70 -58 125 -127 125c-28 0 -55 -9 -77 -26l-307 -230v227c0 8 129 538 139 581c2 9 4 19 4 29c0 62 -47 115 -111 115c-52 0 -97 -36 -109 -86l-116 -482h-26l150 624c2 9 3 19 3 28c0 63 -46 116 -111 116z" />
-    <glyph glyph-name="scuttlebutt" unicode="&#xf2ea;" horiz-adv-x="1709" 
-d="M760 -126c-31 4 -114 28 -131 38c-5 3 -12 10 -16 16l-8 10l-7 -5c-14 -9 -14 -9 -151 60c-70 36 -134 68 -141 71c-21 10 -30 25 -45 74c-5 17 -6 19 -12 21c-18 7 -84 50 -121 78c-27 21 -66 60 -70 70c-10 25 -31 91 -37 112c-18 60 -21 88 -21 178c0 60 0 68 4 76
-c5 11 24 29 46 43c29 19 128 68 192 96l8 4l-4 8c-3 5 -16 24 -29 42l-24 33h-10c-21 1 -28 3 -48 16s-21 13 -39 41c-56 87 -91 163 -95 205c-4 46 23 129 52 160c9 9 17 16 28 22c16 8 17 8 40 8c19 0 25 -1 35 -5c27 -11 44 -29 49 -50c2 -11 2 -17 -1 -43
-c-9 -68 -1 -127 21 -163c4 -6 16 -19 28 -29c19 -17 38 -37 38 -43c0 -7 4 -1 11 15c9 23 70 138 78 148l5 8l-2 25c-8 86 -8 113 0 139c5 18 16 33 31 39c26 12 96 16 121 8c15 -5 28 -14 35 -26c5 -7 6 -12 7 -27l1 -18l52 8c71 11 95 16 116 24c26 10 38 13 57 13
-c29 0 45 -6 104 -37c137 -72 176 -97 219 -139c24 -23 28 -31 49 -73c17 -34 19 -37 38 -57l20 -21l23 6c28 8 37 8 49 2c10 -5 22 -21 22 -29c0 -2 4 -9 9 -16c7 -10 24 -34 39 -58c0 0 6 1 12 3c13 5 27 6 38 1c4 -2 17 -10 28 -19c11 -8 20 -15 21 -15s12 -7 25 -15
-c13 -9 27 -17 32 -18s14 -6 20 -9c13 -8 27 -10 64 -13c15 -1 31 -4 35 -5c18 -5 46 -31 55 -51c8 -18 5 -43 -9 -65c-4 -6 -18 -21 -30 -33s-23 -23 -24 -26s1 -24 4 -47c8 -67 4 -101 -13 -127c-8 -12 -29 -26 -59 -40c-13 -6 -24 -13 -27 -15s-8 -14 -12 -26
-c-9 -26 -17 -44 -26 -54c-8 -10 -10 -18 -13 -57c-4 -53 -10 -71 -37 -99c-20 -21 -37 -29 -70 -39c-11 -3 -49 -16 -85 -28c-35 -12 -66 -22 -68 -22s-6 -5 -9 -11c-14 -25 -33 -48 -63 -75c-48 -43 -116 -83 -163 -97c-9 -3 -16 -7 -24 -14c-43 -38 -88 -56 -154 -62
-c-28 -2 -42 -3 -63 0zM820 -67c13 1 31 5 41 7c18 4 49 17 49 20c0 1 -9 6 -20 12s-37 22 -56 36c-70 48 -117 94 -124 121c-9 35 -9 157 1 321c2 29 3 52 2 53c-3 3 -131 99 -131 99c-2 -2 -20 -148 -25 -210c-5 -54 -7 -145 -4 -170c3 -21 10 -46 32 -105
-c24 -66 44 -109 63 -139l9 -14l26 -8c44 -15 83 -25 104 -25c5 0 20 1 33 2zM559 26c-15 35 -29 69 -47 122c-14 40 -15 45 -17 70c-6 75 4 212 26 365c4 29 7 55 7 57c0 3 -11 12 -33 28c-30 22 -50 32 -58 32c-5 0 -83 -100 -120 -153c-34 -49 -63 -103 -68 -122
-c-2 -10 42 -188 64 -258c16 -52 -1 -38 137 -108l120 -60s-5 12 -11 27zM988 8c27 8 80 38 113 63c21 16 45 38 44 39c-1 0 -24 -2 -51 -6c-28 -4 -58 -7 -68 -7c-45 0 -82 18 -99 48c-8 14 -22 51 -31 82c-7 24 -8 30 -9 64c-1 30 -3 43 -7 59c-6 22 -18 48 -26 55
-c-9 8 -48 36 -57 40c-5 2 -13 7 -18 10l-9 6l-1 -10c-4 -31 -7 -124 -7 -206c0 -107 -2 -99 22 -123c49 -49 155 -116 185 -117c4 0 13 1 19 3zM1086 191c27 4 59 9 71 11c31 6 92 24 138 41c22 8 49 17 61 20c39 11 51 21 55 44c1 8 2 8 -3 7c-48 -15 -87 -22 -143 -24
-c-94 -4 -148 8 -226 46c-23 12 -57 33 -74 47c-5 4 -9 7 -9 7s3 -13 6 -27c5 -20 7 -33 8 -62c2 -39 6 -57 22 -97c6 -14 7 -16 13 -18c12 -4 31 -2 81 5zM232 241c-1 2 -10 37 -20 78s-19 77 -20 79c-4 8 -3 30 3 48c18 54 75 143 164 253c11 13 19 25 19 26
-c0 3 -40 24 -53 27c-7 2 -20 6 -27 9c-13 5 -14 5 -22 1c-4 -2 -28 -13 -53 -24c-76 -34 -138 -68 -159 -84l-7 -5l1 -71c1 -78 3 -88 17 -138c6 -20 26 -79 36 -106c3 -8 33 -36 58 -55c20 -15 62 -42 64 -42c0 0 0 2 -1 4v0zM1306 380c32 4 65 11 87 20c16 7 40 20 47 27
-c5 5 12 18 11 20l-24 -2c-44 -4 -92 -5 -118 -2c-32 3 -55 10 -86 26c-59 29 -105 72 -127 117c-11 23 -13 31 -13 52c0 63 43 117 183 229c22 17 40 32 41 33c0 1 -7 14 -17 29l-18 28l-11 2c-11 2 -13 2 -44 -8c-41 -14 -52 -16 -104 -22c-23 -2 -48 -7 -55 -9
-c-17 -5 -40 -21 -57 -39c-19 -20 -75 -92 -90 -116c-19 -29 -19 -33 -11 -52c4 -9 13 -27 20 -41s16 -33 20 -43c6 -16 9 -25 23 -88c7 -34 14 -49 32 -69c31 -33 75 -60 131 -80c49 -17 105 -20 180 -12zM889 488c0 0 -1 6 -3 12s-6 26 -10 44c-8 41 -14 58 -29 86
-c-16 31 -34 71 -37 83c-3 14 1 37 9 58c10 24 35 62 74 111c54 68 87 98 126 115c19 8 40 13 80 17c18 2 35 4 38 5c5 1 5 1 -2 9c-11 13 -23 33 -36 62c-10 22 -16 31 -26 42c-29 31 -63 54 -150 100c-35 18 -68 36 -73 39c-14 9 -36 17 -46 17c-5 0 -19 -4 -31 -9
-c-25 -10 -61 -17 -144 -30c-29 -5 -53 -9 -54 -9c-3 -3 -2 -38 1 -62c7 -50 24 -108 42 -142c9 -18 10 -29 4 -39c-5 -8 -27 -28 -34 -31c-9 -4 -12 -25 -11 -72c0 -33 0 -38 6 -57c9 -29 14 -67 13 -106l-1 -32l86 -65c112 -84 134 -100 153 -111c9 -5 24 -15 34 -22
-c16 -12 21 -15 21 -13zM1392 530c61 4 104 12 148 30l26 11v13c1 12 -2 47 -4 49c0 1 -6 -1 -10 -3c-22 -12 -53 -16 -74 -9c-34 12 -72 52 -86 90c-5 13 -5 18 -4 34s1 21 7 34c8 18 25 39 39 51c6 5 11 9 11 10s-3 3 -7 4c-4 2 -14 8 -22 14l-14 11l-19 -16
-c-10 -9 -37 -32 -61 -51c-70 -55 -85 -67 -114 -98c-24 -24 -29 -32 -36 -46c-7 -13 -6 -18 -4 -28c10 -26 42 -57 80 -77c44 -24 66 -28 144 -23zM1533 717c27 16 74 54 62 49c-2 -1 -9 -2 -16 -3c-15 -1 -28 5 -38 17c-6 8 -8 8 -15 6c-18 -5 -43 -23 -51 -36
-c-4 -7 -5 -9 -2 -15c1 -4 8 -12 14 -19c11 -11 12 -12 20 -11c5 1 17 6 26 12zM525 805c-4 36 -5 39 -38 113c-9 21 -11 22 -17 22c-8 0 -16 4 -23 11c-3 3 -13 28 -23 55c-13 36 -18 48 -19 46c-4 -5 -29 -57 -35 -72c-10 -27 -13 -43 -19 -90c-4 -25 -7 -48 -7 -50
-c0 -3 5 -4 15 -7c8 -2 18 -7 23 -10s14 -7 20 -11s16 -10 21 -13s24 -10 41 -16c23 -8 35 -14 47 -22l16 -11v11c0 6 0 26 -2 44zM210 969c12 6 27 21 27 26c0 1 -11 11 -24 23c-40 34 -56 64 -67 125c-5 27 -5 80 0 114c4 24 4 25 0 27c-14 9 -30 11 -43 4
-c-9 -4 -10 -7 -21 -30c-22 -47 -28 -86 -19 -114c10 -32 40 -90 75 -146c26 -41 40 -47 72 -29zM519 1007c20 5 27 8 36 14c2 2 2 6 -4 22c-12 30 -23 69 -29 103c-7 36 -7 79 -3 124c3 27 2 70 -1 73c-5 5 -72 -1 -79 -7c-4 -4 -6 -29 -3 -62c-2 -41 16 -99 14 -134
-c-2 -25 0 -32 22 -93c14 -39 16 -45 20 -45c2 0 15 2 27 5z" />
-    <glyph glyph-name="social-home" unicode="&#xf2ec;" horiz-adv-x="1486" 
-d="M491 894h482v-621h-482v621v0zM1050 538h341v-666h-341v666zM91 273v0v620h318v-620h-318zM975 -128h-882v326h882v-326v0zM1053 894h340v-279h-340v279zM1452 1109v0c20 -5 34 -22 34 -44c0 -26 -93 -93 -93 -93h-1300s-87 62 -92 83s5 42 25 51l624 292
-c16 9 99 9 112 0z" />
-    <glyph glyph-name="leanpub" unicode="&#xf212;" horiz-adv-x="2048" 
-d="M1893 1144l155 -1272c-93 0 -173 19 -257 57c-125 57 -255 91 -393 91c-142 0 -273 -47 -374 -148c-101 101 -232 148 -374 148c-138 0 -268 -34 -393 -91c-81 -36 -163 -57 -252 -57h-5l155 1272c143 81 317 127 482 127c135 0 274 -28 387 -106c113 78 252 106 387 106
-c165 0 339 -46 482 -127zM1398 157c190 0 320 -51 492 -122l-124 1021c-112 51 -245 78 -368 78c-140 0 -271 -44 -374 -141c-103 97 -234 141 -374 141c-123 0 -256 -27 -368 -78l-124 -1021c172 71 302 122 492 122c137 0 258 -35 374 -108c116 73 237 108 374 108z
-M1438 191l-40 1c-132 3 -261 -32 -374 -102c-113 70 -242 102 -374 102c-166 0 -299 -39 -450 -101l114 941c104 43 224 66 336 66c150 0 269 -48 374 -155c101 103 215 152 359 155z" />
-    <glyph glyph-name="arrow-circle-left" unicode="&#xf0a8;" 
-d="M1280 576v128c0 35 -29 64 -64 64h-502l189 189c12 12 19 28 19 45s-7 33 -19 45l-91 91c-12 12 -28 18 -45 18s-33 -6 -45 -18l-362 -362l-91 -91c-12 -12 -18 -28 -18 -45s6 -33 18 -45l91 -91l362 -362c12 -12 28 -18 45 -18s33 6 45 18l91 91c12 12 18 28 18 45
-s-6 33 -18 45l-189 189h502c35 0 64 29 64 64zM1536 640c0 -424 -344 -768 -768 -768s-768 344 -768 768s344 768 768 768s768 -344 768 -768z" />
-    <glyph glyph-name="exclamation-triangle" unicode="&#xf071;" horiz-adv-x="1792" 
-d="M1024 161v190c0 18 -14 33 -32 33h-192c-18 0 -32 -15 -32 -33v-190c0 -18 14 -33 32 -33h192c18 0 32 15 32 33zM1022 535l18 459c0 6 -3 14 -10 19c-6 5 -15 11 -24 11h-220c-9 0 -18 -6 -24 -11c-7 -5 -10 -15 -10 -21l17 -457c0 -13 15 -23 34 -23h185
-c18 0 33 10 34 23zM1008 1469l768 -1408c22 -39 21 -87 -2 -126s-65 -63 -110 -63h-1536c-45 0 -87 24 -110 63s-24 87 -2 126l768 1408c22 41 65 67 112 67s90 -26 112 -67z" />
-    <glyph glyph-name="gift" unicode="&#xf06b;" 
-d="M928 180v716h-320v-716c0 -35 29 -52 64 -52h192c35 0 64 17 64 52zM472 1024h195l-126 161c-11 13 -35 31 -69 31c-53 0 -96 -43 -96 -96s43 -96 96 -96zM1160 1120c0 53 -43 96 -96 96c-34 0 -58 -18 -69 -31l-125 -161h194c53 0 96 43 96 96zM1536 864v-320
-c0 -18 -14 -32 -32 -32h-96v-416c0 -53 -43 -96 -96 -96h-1088c-53 0 -96 43 -96 96v416h-96c-18 0 -32 14 -32 32v320c0 18 14 32 32 32h440c-124 0 -224 100 -224 224s100 224 224 224c67 0 129 -28 168 -77l128 -165l128 165c39 49 101 77 168 77
-c124 0 224 -100 224 -224s-100 -224 -224 -224h440c18 0 32 -14 32 -32z" />
-    <glyph glyph-name="cogs" unicode="&#xf085;" horiz-adv-x="1920" 
-d="M896 640c0 141 -115 256 -256 256s-256 -115 -256 -256s115 -256 256 -256s256 115 256 256zM1664 128c0 70 -58 128 -128 128s-128 -58 -128 -128c0 -71 58 -128 128 -128c71 0 128 58 128 128zM1664 1152c0 70 -58 128 -128 128s-128 -58 -128 -128
-c0 -71 58 -128 128 -128c71 0 128 58 128 128zM1280 731v-185c0 -13 -10 -28 -23 -30l-155 -24c-8 -26 -19 -51 -32 -76c28 -40 58 -77 90 -115c4 -6 7 -12 7 -20c0 -7 -2 -14 -7 -19c-20 -27 -132 -149 -161 -149c-8 0 -15 3 -21 7l-115 90c-25 -13 -50 -23 -77 -31
-c-5 -51 -10 -106 -23 -155c-4 -14 -16 -24 -30 -24h-186c-14 0 -28 11 -30 25l-23 153c-26 8 -51 19 -75 31l-118 -89c-5 -5 -13 -7 -20 -7c-8 0 -15 3 -21 8c-26 24 -144 131 -144 160c0 7 3 13 7 19c29 38 59 75 88 114c-14 27 -26 54 -35 82l-152 24c-14 2 -24 15 -24 29
-v185c0 13 10 28 23 30l155 24c8 26 19 51 32 76c-28 40 -58 77 -90 115c-4 6 -7 13 -7 20s2 14 7 20c20 27 132 148 161 148c8 0 15 -3 21 -7l115 -90c25 13 50 23 77 32c5 50 10 105 23 154c4 14 16 24 30 24h186c14 0 28 -11 30 -25l23 -153c26 -8 51 -19 75 -31l118 89
-c6 5 13 7 20 7c8 0 15 -3 21 -8c26 -24 144 -132 144 -160c0 -7 -3 -13 -7 -19c-29 -39 -59 -75 -87 -114c13 -27 25 -54 34 -82l152 -23c14 -3 24 -16 24 -30zM1920 198v-140c0 -15 -129 -29 -149 -31c-8 -19 -18 -36 -30 -52c9 -20 51 -120 51 -138c0 -3 -1 -5 -4 -7
-c-12 -7 -119 -71 -124 -71c-13 0 -88 100 -98 115c-10 -1 -20 -2 -30 -2s-20 1 -30 2c-10 -15 -85 -115 -98 -115c-5 0 -112 64 -124 71c-3 2 -4 5 -4 7c0 17 42 118 51 138c-12 16 -22 33 -30 52c-20 2 -149 16 -149 31v140c0 15 129 29 149 31c8 18 18 36 30 52
-c-9 20 -51 121 -51 138c0 2 1 5 4 7c12 6 119 70 124 70c13 0 88 -99 98 -114c10 1 20 2 30 2s20 -1 30 -2c28 39 58 78 92 112l6 2c5 0 112 -63 124 -70c3 -2 4 -5 4 -7c0 -18 -42 -118 -51 -138c12 -16 22 -34 30 -52c20 -2 149 -16 149 -31zM1920 1222v-140
-c0 -15 -129 -29 -149 -31c-8 -19 -18 -36 -30 -52c9 -20 51 -120 51 -138c0 -3 -1 -5 -4 -7c-12 -7 -119 -71 -124 -71c-13 0 -88 100 -98 115c-10 -1 -20 -2 -30 -2s-20 1 -30 2c-10 -15 -85 -115 -98 -115c-5 0 -112 64 -124 71c-3 2 -4 5 -4 7c0 17 42 118 51 138
-c-12 16 -22 33 -30 52c-20 2 -149 16 -149 31v140c0 15 129 29 149 31c8 18 18 36 30 52c-9 20 -51 121 -51 138c0 2 1 5 4 7c12 6 119 70 124 70c13 0 88 -99 98 -114c10 1 20 2 30 2s20 -1 30 -2c28 39 58 78 92 112l6 2c5 0 112 -63 124 -70c3 -2 4 -5 4 -7
-c0 -18 -42 -118 -51 -138c12 -16 22 -34 30 -52c20 -2 149 -16 149 -31z" />
-    <glyph glyph-name="hackaday" unicode="&#xf30a;" horiz-adv-x="1686" 
-d="M215 1408c118 0 214 -95 215 -213v-2c0 -11 -1 -21 -3 -31l168 -149c-60 -45 -109 -106 -142 -178l-173 154c-21 -7 -42 -11 -65 -11c-119 0 -215 96 -215 215c0 14 1 28 4 42l138 -122l150 167l-134 120c18 5 37 8 57 8zM1247 436l162 -143c17 5 45 9 62 9v0
-c118 0 214 -95 215 -213v-2c0 -13 -2 -26 -4 -39l-139 123l-150 -166l140 -124c-20 -6 -41 -9 -62 -9c-119 0 -215 96 -215 215c0 12 1 24 3 35l-140 124c56 50 100 115 128 190zM1471 1408c20 0 39 -3 57 -8l-134 -120l150 -167l138 122c3 -14 4 -28 4 -42
-c0 -119 -96 -215 -215 -215c-23 0 -44 4 -65 11l-174 -154c-33 72 -81 133 -141 178l167 149c-2 10 -2 20 -2 31v2c1 118 97 213 215 213zM439 436v0c28 -75 71 -140 127 -190l-139 -124c2 -11 3 -23 3 -35c0 -119 -96 -215 -215 -215c-21 0 -42 3 -62 9l140 124l-150 166
-l-139 -123c-2 13 -4 26 -4 39v2c1 118 97 213 215 213v0c17 0 45 -4 62 -9zM843 1062c222 0 401 -199 401 -445c0 -153 -69 -288 -175 -368c8 -12 12 -26 12 -41c0 -42 -33 -76 -75 -76s-76 34 -76 76c0 4 0 8 1 12h-13c1 -3 0 -9 0 -12v0c0 -42 -33 -76 -75 -76
-s-76 34 -76 76c0 4 0 8 1 12h-10v-9c0 -43 -35 -79 -77 -79s-77 36 -77 79c0 15 4 28 11 40c-105 80 -173 214 -173 366c0 246 179 445 401 445zM670 730c-8 0 -15 -1 -22 -3c-28 -4 -52 -23 -69 -45c-15 -18 -26 -40 -26 -64c-2 -20 1 -39 5 -58c5 -23 21 -41 39 -54
-c8 -7 20 -16 31 -8c7 9 1 23 7 33c2 10 9 18 18 23c18 9 37 18 57 25c16 5 29 15 43 24c18 14 30 40 21 62c-10 18 -22 34 -39 46c-19 12 -42 19 -65 19zM1015 730c-23 0 -45 -7 -64 -19c-17 -12 -29 -28 -39 -46c-9 -22 3 -48 21 -62c14 -9 27 -19 43 -24
-c20 -7 38 -16 56 -25c9 -5 17 -13 19 -23c6 -10 0 -24 7 -33c11 -8 23 1 31 8c18 13 34 31 39 54c4 19 7 38 5 58c0 24 -11 46 -26 64c-17 22 -41 41 -69 45c-7 2 -15 3 -23 3zM844 502c-20 1 -44 -88 -40 -126c12 -51 16 36 40 36c23 -1 19 -88 37 -35
-c5 35 -16 124 -37 125z" />
-    <glyph glyph-name="frown-o" unicode="&#xf119;" 
-d="M1134 307c11 -34 -8 -69 -41 -80c-34 -11 -70 8 -81 42c-33 107 -132 179 -244 179s-211 -72 -244 -179c-11 -34 -47 -53 -80 -42c-34 11 -53 46 -42 80c50 161 197 269 366 269s316 -108 366 -269zM640 896c0 -71 -57 -128 -128 -128s-128 57 -128 128s57 128 128 128
-s128 -57 128 -128zM1152 896c0 -71 -57 -128 -128 -128s-128 57 -128 128s57 128 128 128s128 -57 128 -128zM1408 640c0 353 -287 640 -640 640s-640 -287 -640 -640s287 -640 640 -640s640 287 640 640zM1536 640c0 -424 -344 -768 -768 -768s-768 344 -768 768
-s344 768 768 768s768 -344 768 -768z" />
-    <glyph glyph-name="opera" unicode="&#xf26a;" horiz-adv-x="1792" 
-d="M1493 1308c-105 70 -228 110 -359 110c-213 0 -401 -109 -533 -273c-96 -120 -163 -290 -168 -484v-42c5 -194 72 -364 168 -484c132 -164 320 -273 533 -273c131 0 254 40 359 110c-158 -142 -368 -228 -597 -228c-14 0 -29 0 -43 1c-475 22 -853 414 -853 895
-c0 495 401 896 896 896h3c228 -1 436 -87 594 -228zM1792 640c0 -261 -112 -495 -290 -659c-68 -41 -143 -63 -222 -63c-92 0 -179 30 -255 84c203 74 353 331 353 638c0 306 -149 563 -352 638c76 53 162 83 254 83c81 0 157 -23 226 -65c176 -164 286 -397 286 -656z" />
-    <glyph glyph-name="viadeo" unicode="&#xf2a9;" horiz-adv-x="1278" 
-d="M1050 430c0 -143 -50 -269 -147 -374c-101 -110 -229 -161 -378 -161c-148 0 -277 50 -378 161c-97 105 -147 231 -147 374c0 297 224 540 525 540c62 0 124 -10 182 -31c-20 -39 -34 -82 -39 -126c-45 19 -94 28 -143 28c-227 0 -394 -194 -394 -414
-c0 -224 166 -407 394 -407s393 183 393 407c0 57 -10 113 -32 166c44 9 86 26 123 49c28 -67 41 -140 41 -212zM846 619c0 111 -19 221 -55 326c3 -34 3 -69 3 -103c0 -268 -53 -707 -342 -817c20 -3 41 -5 62 -5l14 1c216 136 318 346 318 598zM791 947v-2
-c-52 153 -124 301 -206 440c126 -85 195 -291 206 -438zM1035 744c-62 0 -117 33 -160 75c102 56 231 143 290 247c7 14 19 40 21 56c-58 -130 -206 -232 -344 -264c-22 34 -35 72 -35 113c0 48 24 112 60 147c41 39 102 59 157 74c80 22 145 84 180 159
-c52 -74 74 -164 74 -253c0 -45 -7 -127 -24 -170c-37 -90 -112 -184 -219 -184z" />
-    <glyph glyph-name="battery-empty" unicode="&#xf244;" horiz-adv-x="2304" 
-d="M2176 960c71 0 128 -57 128 -128v-384c0 -71 -57 -128 -128 -128v-160c0 -88 -72 -160 -160 -160h-1856c-88 0 -160 72 -160 160v960c0 88 72 160 160 160h1856c88 0 160 -72 160 -160v-160zM2176 448v384h-128v288c0 18 -14 32 -32 32h-1856c-18 0 -32 -14 -32 -32v-960
-c0 -18 14 -32 32 -32h1856c18 0 32 14 32 32v288h128z" />
-    <glyph glyph-name="freedombox" unicode="&#xf2fd;" horiz-adv-x="1816" 
-d="M152 1274v0h10c90 -2 180 -36 272 -79c4 -2 11 -5 15 -7c7 -3 13 -7 20 -10c116 -58 199 -126 267 -210l3 -3c2 -2 4 -7 6 -9l-255 -148l9 -492l37 465l50 -29l10 -491l37 464l49 -29l10 -490l37 463l50 -29l9 -488l37 461l50 -29l10 -487l37 466l422 245l-267 155
-c2 3 5 5 7 8s5 6 7 9c70 83 157 151 278 208c101 48 200 86 296 86h9c45 -1 84 -15 110 -44c80 -92 -8 -177 -39 -293c-41 -155 6 -321 -118 -429c-43 -37 -93 -47 -143 -52c65 -77 103 -183 82 -292c-4 -21 -10 -42 -18 -61c-6 -17 -13 -32 -22 -47l-9 -15
-c-2 -2 -3 -5 -5 -7c-63 -94 -168 -154 -281 -161c-6 0 -11 -1 -17 -1h-9c-15 0 -39 3 -53 5c-19 3 -49 12 -67 19c-3 1 -7 2 -9 3c-69 29 -124 80 -159 143c-2 3 -4 5 -5 8c-2 3 -5 3 -7 0c-1 -3 -3 -5 -5 -8s-2 -5 -4 -8c-48 -81 -131 -140 -231 -157c-12 -2 -23 -3 -35 -4
-c-6 0 -12 -1 -18 -1c-169 -3 -327 118 -361 292c-21 109 18 215 83 292c-50 5 -101 15 -144 52c-124 108 -78 274 -119 429c-31 116 -118 201 -38 293c26 29 65 43 110 44h9z" />
-    <glyph glyph-name="file-epub" unicode="&#xf321;" 
-d="M723 132l458 458l70 -71c24 -24 24 -64 0 -88l-483 -483c-24 -24 -65 -24 -89 0l-483 483c-24 24 -24 64 0 88l483 484c24 24 65 24 89 0l298 -299l-343 -343l-114 114l229 229l-115 114l-343 -343zM1468 1156c37 -37 68 -111 68 -164v-1152c0 -53 -43 -96 -96 -96h-1344
-c-53 0 -96 43 -96 96v1600c0 53 43 96 96 96h896c53 0 127 -31 164 -68zM1024 1400v-376h376c-6 17 -15 34 -22 41l-313 313c-7 7 -24 16 -41 22zM1408 -128v1024h-416c-53 0 -96 43 -96 96v416h-768v-1536h1280z" />
-    <glyph glyph-name="chevron-circle-left" unicode="&#xf137;" 
-d="M909 141l102 102c25 25 25 65 0 90l-307 307l307 307c25 25 25 65 0 90l-102 102c-25 25 -65 25 -90 0l-454 -454c-25 -25 -25 -65 0 -90l454 -454c25 -25 65 -25 90 0zM1536 640c0 -424 -344 -768 -768 -768s-768 344 -768 768s344 768 768 768s768 -344 768 -768z" />
-    <glyph glyph-name="signal" unicode="&#xf012;" horiz-adv-x="1792" 
-d="M256 96v-192c0 -18 -14 -32 -32 -32h-192c-18 0 -32 14 -32 32v192c0 18 14 32 32 32h192c18 0 32 -14 32 -32zM640 224v-320c0 -18 -14 -32 -32 -32h-192c-18 0 -32 14 -32 32v320c0 18 14 32 32 32h192c18 0 32 -14 32 -32zM1024 480v-576c0 -18 -14 -32 -32 -32h-192
-c-18 0 -32 14 -32 32v576c0 18 14 32 32 32h192c18 0 32 -14 32 -32zM1408 864v-960c0 -18 -14 -32 -32 -32h-192c-18 0 -32 14 -32 32v960c0 18 14 32 32 32h192c18 0 32 -14 32 -32zM1792 1376v-1472c0 -18 -14 -32 -32 -32h-192c-18 0 -32 14 -32 32v1472
-c0 18 14 32 32 32h192c18 0 32 -14 32 -32z" />
-    <glyph glyph-name="sitemap" unicode="&#xf0e8;" horiz-adv-x="1792" 
-d="M1792 288v-320c0 -53 -43 -96 -96 -96h-320c-53 0 -96 43 -96 96v320c0 53 43 96 96 96h96v192h-512v-192h96c53 0 96 -43 96 -96v-320c0 -53 -43 -96 -96 -96h-320c-53 0 -96 43 -96 96v320c0 53 43 96 96 96h96v192h-512v-192h96c53 0 96 -43 96 -96v-320
-c0 -53 -43 -96 -96 -96h-320c-53 0 -96 43 -96 96v320c0 53 43 96 96 96h96v192c0 70 58 128 128 128h512v192h-96c-53 0 -96 43 -96 96v320c0 53 43 96 96 96h320c53 0 96 -43 96 -96v-320c0 -53 -43 -96 -96 -96h-96v-192h512c70 0 128 -58 128 -128v-192h96
-c53 0 96 -43 96 -96z" />
-    <glyph glyph-name="wheelchair-alt" unicode="&#xf29b;" horiz-adv-x="1399" 
-d="M1370 723c21 -22 32 -52 29 -82l-44 -551c-5 -56 -51 -98 -106 -98c-3 0 -6 0 -9 1c-59 4 -102 56 -98 114l35 429l-143 -8c35 -72 55 -154 55 -240c0 -144 -56 -275 -148 -372l-137 137c56 62 91 145 91 235c0 194 -157 351 -350 351c-91 0 -173 -35 -236 -92l-137 138
-c77 73 175 123 284 141l264 300l-149 87l-181 -161c-44 -40 -111 -36 -150 8s-35 111 8 150l239 213c34 31 84 36 124 12c487 -283 488 -283 488 -283c26 -15 41 -41 48 -68c10 -39 3 -83 -26 -117l-205 -232l371 20c31 2 61 -9 83 -32zM1172 1180c-98 0 -178 79 -178 178
-c0 98 80 178 178 178c99 0 179 -80 179 -178c0 -99 -80 -178 -179 -178zM545 -62c72 0 140 23 196 61l139 -139c-92 -73 -209 -116 -335 -116c-301 0 -545 244 -545 544c0 127 43 243 116 336l139 -139c-38 -56 -60 -124 -60 -197c0 -193 157 -350 350 -350z" />
-    <glyph glyph-name="external-link-square" unicode="&#xf14c;" 
-d="M1280 608v480c0 35 -29 64 -64 64h-480c-26 0 -49 -16 -59 -39c-10 -24 -5 -52 14 -70l144 -144l-534 -534c-25 -25 -25 -65 0 -90l102 -102c25 -25 65 -25 90 0l534 534l144 -144c12 -13 28 -19 45 -19c8 0 17 2 25 5c23 10 39 33 39 59zM1536 1120v-960
-c0 -159 -129 -288 -288 -288h-960c-159 0 -288 129 -288 288v960c0 159 129 288 288 288h960c159 0 288 -129 288 -288z" />
-    <glyph glyph-name="google" unicode="&#xf1a0;" horiz-adv-x="1505" 
-d="M768 750h725c7 -39 12 -77 12 -128c0 -438 -294 -750 -737 -750c-425 0 -768 343 -768 768s343 768 768 768c207 0 381 -76 515 -201l-209 -201c-57 55 -157 119 -306 119c-262 0 -476 -217 -476 -485s214 -485 476 -485c304 0 418 218 436 331h-436v264z" />
-    <glyph glyph-name="volume-off" unicode="&#xf026;" horiz-adv-x="768" 
-d="M768 1184v-1088c0 -35 -29 -64 -64 -64c-17 0 -33 7 -45 19l-333 333h-262c-35 0 -64 29 -64 64v384c0 35 29 64 64 64h262l333 333c12 12 28 19 45 19c35 0 64 -29 64 -64z" />
-    <glyph glyph-name="twitter" unicode="&#xf099;" horiz-adv-x="1576" 
-d="M1576 1128c-44 -64 -99 -121 -162 -167c1 -14 1 -28 1 -42c0 -427 -325 -919 -919 -919c-183 0 -353 53 -496 145c26 -3 51 -4 78 -4c151 0 290 51 401 138c-142 3 -261 96 -302 224c20 -3 40 -5 61 -5c29 0 58 4 85 11c-148 30 -259 160 -259 317v4
-c43 -24 93 -39 146 -41c-87 58 -144 157 -144 269c0 60 16 115 44 163c159 -196 398 -324 666 -338c-5 24 -8 49 -8 74c0 178 144 323 323 323c93 0 177 -39 236 -102c73 14 143 41 205 78c-24 -75 -75 -138 -142 -178c65 7 128 25 186 50z" />
-    <glyph glyph-name="battery-full" unicode="&#xf240;" horiz-adv-x="2304" 
-d="M1920 1024v-768h-1664v768h1664zM2048 448h128v384h-128v288c0 18 -14 32 -32 32h-1856c-18 0 -32 -14 -32 -32v-960c0 -18 14 -32 32 -32h1856c18 0 32 14 32 32v288zM2304 832v-384c0 -71 -57 -128 -128 -128v-160c0 -88 -72 -160 -160 -160h-1856
-c-88 0 -160 72 -160 160v960c0 88 72 160 160 160h1856c88 0 160 -72 160 -160v-160c71 0 128 -57 128 -128z" />
-    <glyph glyph-name="deaf" unicode="&#xf2a4;" horiz-adv-x="1792" 
-d="M1056 704c0 124 -101 224 -224 224s-224 -100 -224 -224c0 -35 -29 -64 -64 -64s-64 29 -64 64c0 194 158 352 352 352s352 -158 352 -352c0 -35 -29 -64 -64 -64s-64 29 -64 64zM835 1280c318 0 576 -258 576 -576c0 -166 -78 -255 -146 -334
-c-63 -72 -113 -129 -113 -242c0 -212 -172 -384 -384 -384c-35 0 -64 29 -64 64s29 64 64 64c141 0 256 115 256 256c0 161 77 249 144 326c62 71 115 132 115 250c0 247 -201 448 -448 448s-448 -201 -448 -448c0 -35 -29 -64 -64 -64s-64 29 -64 64c0 318 258 576 576 576
-zM591 561l226 -226l-579 -579c-16 -16 -42 -16 -58 0l-168 168c-16 16 -16 42 0 58zM1612 1524l168 -168c16 -16 16 -42 0 -59l-233 -233l-26 -25l-71 -71c-43 100 -109 188 -195 258l91 91l207 207c17 16 43 16 59 0z" />
-    <glyph glyph-name="window-close-o" unicode="&#xf2d4;" horiz-adv-x="1792" 
-d="M1257 425l-146 -146c-13 -13 -33 -13 -46 0l-169 169l-169 -169c-13 -13 -33 -13 -46 0l-146 146c-13 13 -13 33 0 46l169 169l-169 169c-13 13 -13 33 0 46l146 146c13 13 33 13 46 0l169 -169l169 169c13 13 33 13 46 0l146 -146c13 -13 13 -33 0 -46l-169 -169
-l169 -169c13 -13 13 -33 0 -46zM256 128h1280v1024h-1280v-1024zM1792 1248v-1216c0 -88 -72 -160 -160 -160h-1472c-88 0 -160 72 -160 160v1216c0 88 72 160 160 160h1472c88 0 160 -72 160 -160z" />
-    <glyph glyph-name="phone" unicode="&#xf095;" horiz-adv-x="1408" 
-d="M1408 296c0 -36 -16 -106 -31 -139c-21 -49 -77 -81 -122 -106c-59 -32 -119 -51 -186 -51c-93 0 -177 38 -262 69c-61 22 -120 49 -175 83c-170 105 -375 310 -480 480c-34 55 -61 114 -83 175c-31 85 -69 169 -69 262c0 67 19 127 51 186c25 45 57 101 106 122
-c33 15 103 31 139 31c7 0 14 0 21 -3c21 -7 43 -56 53 -76c32 -57 63 -115 96 -171c16 -26 46 -58 46 -89c0 -61 -181 -150 -181 -204c0 -27 25 -62 39 -86c101 -182 227 -308 409 -409c24 -14 59 -39 86 -39c54 0 143 181 204 181c31 0 63 -30 89 -46
-c56 -33 114 -64 171 -96c20 -10 69 -32 76 -53c3 -7 3 -14 3 -21z" />
-    <glyph glyph-name="mars-double" unicode="&#xf227;" horiz-adv-x="1920" 
-d="M1536 1120c0 18 14 32 32 32h288c35 0 64 -29 64 -64v-288c0 -18 -14 -32 -32 -32h-64c-18 0 -32 14 -32 32v134l-254 -255c98 -123 147 -286 117 -461c-42 -243 -240 -434 -484 -468c-286 -40 -539 131 -626 380c-316 16 -565 288 -544 613c18 274 235 502 508 533
-c161 19 311 -31 426 -122l255 254h-134c-18 0 -32 14 -32 32v64c0 18 14 32 32 32h288c35 0 64 -29 64 -64v-288c0 -18 -14 -32 -32 -32h-64c-18 0 -32 14 -32 32v134l-254 -255c40 -50 71 -107 93 -169c124 -6 237 -52 328 -124l255 254h-134c-18 0 -32 14 -32 32v64z
-M1024 704c0 20 -2 39 -4 58c-215 -33 -380 -218 -380 -442c0 -20 2 -39 4 -58c215 33 380 218 380 442zM128 704c0 -226 169 -413 387 -443c-2 19 -3 39 -3 59c0 282 204 517 473 566c-70 157 -227 266 -409 266c-247 0 -448 -201 -448 -448zM1088 -128
-c247 0 448 201 448 448c0 226 -169 413 -387 443c2 -19 3 -39 3 -59c0 -282 -204 -517 -473 -566c70 -157 227 -266 409 -266z" />
-    <glyph glyph-name="maxcdn" unicode="&#xf136;" horiz-adv-x="1755" 
-d="M1745 763l-164 -763h-334l178 832c8 35 3 67 -15 88c-17 21 -47 33 -83 33h-169l-204 -953h-334l204 953h-286l-204 -953h-334l204 953l-153 327h1276c135 0 258 -56 337 -154c80 -98 109 -231 81 -363z" />
-    <glyph glyph-name="hand-peace-o" unicode="&#xf25b;" 
-d="M1288 889c37 0 74 -7 107 -23c96 -43 141 -122 141 -226v-177c0 -63 -8 -126 -23 -186l-85 -339c-28 -114 -130 -194 -248 -194h-668c-141 0 -256 115 -256 256v401l-239 628c-11 29 -17 60 -17 91c0 141 115 256 256 256c106 0 202 -66 239 -165l17 -44v113
-c0 141 115 256 256 256s256 -115 256 -256v-261c16 3 32 5 48 5c92 0 176 -53 216 -135zM1072 896c-44 0 -84 -26 -102 -66l-74 -163l-71 -155h55c67 0 126 -47 140 -112l154 338c7 14 10 30 10 46c0 62 -50 112 -112 112zM1293 761c-76 0 -100 -61 -127 -121l-132 -290
-c-7 -14 -10 -30 -10 -46c0 -62 50 -112 112 -112c44 0 84 26 102 66l160 352c5 10 9 26 9 38c0 67 -48 113 -114 113zM128 1120c0 -16 3 -31 8 -46l248 -650v-69l102 111c27 29 66 46 106 46h198l106 233v535c0 71 -57 128 -128 128s-128 -57 -128 -128v-640h-64l-200 526
-c-19 49 -67 82 -120 82c-71 0 -128 -58 -128 -128zM1180 -128c59 0 110 40 124 97l85 339c13 50 19 103 19 155v91l-141 -310c-23 -51 -75 -84 -131 -84c-70 0 -131 51 -142 121c-27 -35 -69 -57 -114 -57h-208v32h208c61 0 116 50 116 112c0 61 -46 112 -108 112h-296
-c-31 0 -61 -13 -82 -36l-126 -136v-308c0 -71 57 -128 128 -128h668z" />
-    <glyph glyph-name="envira" unicode="&#xf299;" horiz-adv-x="1792" 
-d="M896 720c-127 240 -244 474 -577 632c-199 94 -21 -37 -21 -37c181 -125 264 -294 361 -479c126 -241 316 -559 577 -671c260 -112 137 -50 24 34c-113 85 -273 348 -364 521zM549 177c-361 286 -341 628 -549 1359c1911 0 1467 -1269 1469 -1465l323 -327h-104l-281 285
-c-156 -17 -498 -138 -858 148z" />
-    <glyph glyph-name="lastfm-square" unicode="&#xf203;" 
-d="M1432 484c0 141 -114 205 -234 239c-55 15 -100 28 -120 88c-1 5 -6 24 -6 28c0 48 38 83 85 83c22 0 53 1 71 -15h-1c19 -14 28 -30 39 -51l93 71c-15 21 -30 46 -49 64c-47 42 -91 49 -153 49c-105 0 -204 -86 -204 -195c0 -8 1 -15 2 -23c22 -136 91 -178 213 -213
-c60 -17 145 -44 146 -118v-5c1 -80 -66 -128 -141 -128c-82 0 -135 78 -167 144c-116 239 -134 538 -478 538c-207 0 -393 -191 -386 -396v-1c7 -214 154 -403 380 -403c107 0 207 25 279 110c12 16 23 33 31 51l-60 109c-56 -106 -125 -152 -245 -152
-c-158 0 -267 140 -267 291c0 139 128 273 268 273c160 0 218 -83 274 -226c67 -172 139 -456 371 -456c139 0 259 101 259 244zM1536 1120v-960c0 -159 -129 -288 -288 -288h-960c-159 0 -288 129 -288 288v960c0 159 129 288 288 288h960c159 0 288 -129 288 -288z" />
-    <glyph glyph-name="home" unicode="&#xf015;" horiz-adv-x="1612" 
-d="M1382 544v-480c0 -35 -29 -64 -64 -64h-384v384h-256v-384h-384c-35 0 -64 29 -64 64v480c0 2 1 4 1 6l575 474l575 -474c1 -2 1 -4 1 -6zM1605 613l-62 -74c-5 -6 -13 -10 -21 -11h-3c-8 0 -15 2 -21 7l-692 577l-692 -577c-7 -5 -15 -8 -24 -7c-8 1 -16 5 -21 11
-l-62 74c-11 13 -9 34 4 45l719 599c42 35 110 35 152 0l244 -204v195c0 18 14 32 32 32h192c18 0 32 -14 32 -32v-408l219 -182c13 -11 15 -32 4 -45z" />
-    <glyph glyph-name="empire" unicode="&#xf1d1;" horiz-adv-x="1792" 
-d="M874 -102v-66c-282 8 -529 160 -668 385l58 34c21 -35 46 -68 73 -99l65 57c94 -107 222 -183 368 -212l-17 -86c39 -7 80 -12 121 -13zM276 428l-83 -28c14 -39 30 -76 49 -112l-57 -33c-62 114 -98 246 -98 385s36 271 98 385l57 -33c-19 -35 -36 -73 -49 -112l82 -28
-c-23 -66 -35 -138 -35 -212s13 -146 36 -212zM1528 251l58 -34c-139 -225 -386 -377 -668 -385v66c41 1 82 6 121 13l-17 86c146 29 274 105 368 212l65 -57c27 31 52 64 73 99zM1377 805l-233 -80c9 -27 14 -55 14 -85s-5 -58 -14 -85l232 -80c-21 -63 -55 -120 -98 -169
-l-185 162c-37 -43 -88 -73 -147 -85l48 -241c-31 -6 -64 -10 -98 -10s-67 4 -98 10l48 241c-59 12 -110 42 -147 85l-185 -162c-43 49 -77 106 -98 169l232 80c-9 27 -14 55 -14 85s5 58 14 85l-233 80c22 63 56 120 99 169l185 -162c37 43 88 74 147 86l-48 240
-c31 7 64 10 98 10s67 -3 98 -10l-48 -240c59 -12 110 -43 147 -86l185 162c43 -49 77 -106 99 -169zM874 1448v-66c-41 -1 -82 -5 -121 -13l17 -86c-146 -28 -274 -104 -368 -211l-65 56c-27 -30 -51 -63 -73 -98l-57 33c139 226 385 377 667 385zM1705 640
-c0 -139 -36 -271 -98 -385l-57 33c19 36 35 73 49 112l-83 28c23 66 36 138 36 212s-12 146 -35 212l82 28c-13 39 -30 77 -49 112l57 33c62 -114 98 -246 98 -385zM1585 1063l-57 -33c-22 35 -46 68 -73 98l-65 -56c-94 107 -222 183 -368 211l17 86c-39 8 -80 12 -121 13
-v66c282 -8 528 -159 667 -385zM1748 640c0 470 -382 852 -852 852s-852 -382 -852 -852s382 -852 852 -852s852 382 852 852zM1792 640c0 -495 -401 -896 -896 -896s-896 401 -896 896s401 896 896 896s896 -401 896 -896z" />
-    <glyph glyph-name="server" unicode="&#xf233;" horiz-adv-x="1792" 
-d="M128 128h1024v128h-1024v-128zM128 640h1024v128h-1024v-128zM1696 192c0 53 -43 96 -96 96s-96 -43 -96 -96s43 -96 96 -96s96 43 96 96zM128 1152h1024v128h-1024v-128zM1696 704c0 53 -43 96 -96 96s-96 -43 -96 -96s43 -96 96 -96s96 43 96 96zM1696 1216
-c0 53 -43 96 -96 96s-96 -43 -96 -96s43 -96 96 -96s96 43 96 96zM1792 384v-384h-1792v384h1792zM1792 896v-384h-1792v384h1792zM1792 1408v-384h-1792v384h1792z" />
-    <glyph glyph-name="inkscape" unicode="&#xf312;" 
-d="M755 1398v0c47 0 95 -17 131 -52l588 -601c234 -234 -259 -288 -401 -371c-50 -51 153 -85 132 -147c-42 -126 -157 -45 -280 -171c-50 -51 95 -46 45 -97c-93 -68 -285 -115 -300 -32c-21 117 -135 68 -185 119s101 104 51 155s-299 97 -349 148s191 88 141 139
-c-138 68 -461 41 -269 278l567 580c34 35 82 52 129 52zM760 1343v0c-34 0 -68 -13 -93 -38c-49 -50 -140 -138 -219 -223c-45 -45 -40 -109 10 -109h123l80 139l49 -199l149 95l93 -49l22 131l111 -89c12 12 12 54 -9 76l-224 228c-24 25 -58 38 -92 38zM491 456
-c-74 0 219 -119 279 -103c27 14 40 34 21 38c-56 9 -285 56 -300 65zM1390 297c43 -1 86 -22 100 -63c0 -54 -212 -36 -212 -7c13 47 63 71 112 70zM409 172c26 0 50 -8 64 -26c-23 -61 -101 -115 -151 -72c-57 50 21 99 87 98zM1251 168c71 -14 85 -65 71 -79
-c-64 -38 -136 21 -71 79z" />
-    <glyph glyph-name="search-minus" unicode="&#xf010;" horiz-adv-x="1664" 
-d="M1024 736v-64c0 -17 -15 -32 -32 -32h-576c-17 0 -32 15 -32 32v64c0 17 15 32 32 32h576c17 0 32 -15 32 -32zM1152 704c0 247 -201 448 -448 448s-448 -201 -448 -448s201 -448 448 -448s448 201 448 448zM1664 -128c0 -71 -57 -128 -128 -128c-34 0 -67 14 -90 38
-l-343 342c-117 -81 -257 -124 -399 -124c-389 0 -704 315 -704 704s315 704 704 704s704 -315 704 -704c0 -142 -43 -282 -124 -399l343 -343c23 -23 37 -56 37 -90z" />
-    <glyph glyph-name="leaf" unicode="&#xf06c;" horiz-adv-x="1792" 
-d="M1280 832c0 35 -29 64 -64 64c-354 0 -582 -148 -813 -403c-12 -13 -19 -27 -19 -45c0 -35 29 -64 64 -64c18 0 32 7 45 19c49 44 93 92 141 137c181 163 336 228 582 228c35 0 64 29 64 64zM1792 1030c0 -64 -7 -129 -20 -193c-64 -311 -264 -513 -542 -651
-c-135 -68 -286 -108 -438 -108c-96 0 -195 16 -286 47c-48 16 -144 79 -184 79c-50 0 -110 -204 -197 -204c-63 0 -82 31 -109 77c-9 17 -16 23 -16 44c0 104 198 185 198 243c0 9 -26 62 -30 82c-6 34 -9 69 -9 104c0 318 253 545 537 639c205 68 641 -11 780 121
-c55 51 82 98 166 98c113 0 150 -293 150 -378z" />
-    <glyph glyph-name="envelope-open-o" unicode="&#xf2b7;" horiz-adv-x="1792" 
-d="M1474 623l39 -51c11 -14 8 -33 -5 -44c-100 -78 -330 -255 -340 -263c-71 -58 -167 -138 -271 -137h-2c-104 0 -200 79 -271 137c-11 9 -233 180 -331 256c-14 11 -17 30 -6 44l37 52c11 15 32 18 46 6c68 -53 164 -127 306 -236c50 -38 149 -131 219 -131h2
-c70 0 169 93 219 131c147 113 245 188 313 242c14 11 34 8 45 -6zM1664 -96v928c-100 93 -85 85 -548 443c-50 39 -149 133 -219 133h-2c-70 0 -169 -94 -219 -133c-463 -358 -448 -350 -548 -443v-928c0 -17 15 -32 32 -32h1472c17 0 32 15 32 32zM1792 832v-928
-c0 -88 -72 -160 -160 -160h-1472c-88 0 -160 72 -160 160v928c0 36 15 70 41 94c205 190 441 355 583 472c70 58 167 138 271 138h2c104 0 201 -80 271 -138c132 -109 383 -286 583 -472c26 -24 41 -58 41 -94z" />
-    <glyph glyph-name="exclamation-circle" unicode="&#xf06a;" 
-d="M768 1408c424 0 768 -344 768 -768s-344 -768 -768 -768s-768 344 -768 768s344 768 768 768zM896 161v190c0 18 -14 33 -31 33h-192c-18 0 -33 -15 -33 -33v-190c0 -18 15 -33 33 -33h192c17 0 31 15 31 33zM894 505l18 621c0 7 -3 14 -10 18c-6 5 -15 8 -24 8h-220
-c-9 0 -18 -3 -24 -8c-7 -4 -10 -11 -10 -18l17 -621c0 -14 15 -25 34 -25h185c18 0 33 11 34 25z" />
-    <glyph glyph-name="comments" unicode="&#xf086;" horiz-adv-x="1792" 
-d="M1408 768c0 -283 -315 -512 -704 -512c-61 0 -120 6 -176 16c-83 -59 -177 -102 -278 -128c-27 -7 -56 -12 -86 -16h-3c-15 0 -29 12 -32 29c-4 19 9 31 20 44c39 44 83 83 117 166c-162 94 -266 239 -266 401c0 283 315 512 704 512s704 -229 704 -512zM1792 512
-c0 -163 -104 -307 -266 -401c34 -83 78 -122 117 -166c11 -13 24 -25 20 -44c-4 -18 -19 -31 -35 -29c-30 4 -59 9 -86 16c-101 26 -195 69 -278 128c-56 -10 -115 -16 -176 -16c-181 0 -347 50 -472 132c29 -2 59 -4 88 -4c215 0 418 62 573 174c167 122 259 287 259 466
-c0 52 -8 103 -23 152c169 -93 279 -241 279 -408z" />
-    <glyph glyph-name="moon" unicode="&#xf328;" horiz-adv-x="1471" 
-d="M1465 318c-125 -271 -399 -446 -697 -446c-423 0 -768 345 -768 768c0 415 325 752 739 767c28 1 51 -15 61 -39c11 -25 4 -54 -15 -72c-114 -104 -177 -246 -177 -400c0 -300 244 -544 544 -544c79 0 155 17 228 51c25 11 53 6 72 -13s24 -48 13 -72z" />
-    <glyph glyph-name="facebook-official" unicode="&#xf230;" 
-d="M1451 1408c47 0 85 -38 85 -85v-1366c0 -47 -38 -85 -85 -85h-391v595h199l30 232h-229v148c0 67 18 112 115 112l122 1v207c-21 3 -94 9 -178 9c-177 0 -299 -108 -299 -306v-171h-200v-232h200v-595h-735c-47 0 -85 38 -85 85v1366c0 47 38 85 85 85h1366z" />
-    <glyph glyph-name="clock-o" unicode="&#xf017;" 
-d="M896 992v-448c0 -18 -14 -32 -32 -32h-320c-18 0 -32 14 -32 32v64c0 18 14 32 32 32h224v352c0 18 14 32 32 32h64c18 0 32 -14 32 -32zM1312 640c0 300 -244 544 -544 544s-544 -244 -544 -544s244 -544 544 -544s544 244 544 544zM1536 640
-c0 -424 -344 -768 -768 -768s-768 344 -768 768s344 768 768 768s768 -344 768 -768z" />
-    <glyph glyph-name="caret-square-o-left" unicode="&#xf191;" 
-d="M1024 960v-640c0 -35 -29 -64 -64 -64c-13 0 -26 4 -37 12l-448 320c-17 12 -27 31 -27 52c0 20 10 40 27 52l448 320c11 8 24 12 37 12c35 0 64 -29 64 -64zM1280 160v960c0 17 -15 32 -32 32h-960c-17 0 -32 -15 -32 -32v-960c0 -17 15 -32 32 -32h960
-c17 0 32 15 32 32zM1536 1120v-960c0 -159 -129 -288 -288 -288h-960c-159 0 -288 129 -288 288v960c0 159 129 288 288 288h960c159 0 288 -129 288 -288z" />
-    <glyph glyph-name="hand-scissors-o" unicode="&#xf257;" horiz-adv-x="1792" 
-d="M1073 -128h-177c-104 0 -183 45 -226 141c-15 32 -23 67 -23 102v5c-82 40 -135 124 -135 216c0 11 0 38 5 48h-261c-141 0 -256 115 -256 256s115 256 256 256h113l-44 17c-99 37 -165 133 -165 239c0 141 115 256 256 256c31 0 62 -6 91 -17l628 -239h401
-c141 0 256 -115 256 -256v-668c0 -118 -80 -220 -194 -248l-339 -85c-60 -15 -123 -23 -186 -23zM1024 583l-155 -71l-163 -74c-40 -18 -66 -58 -66 -102c0 -62 50 -112 112 -112c16 0 32 3 46 10l338 154c-65 14 -112 73 -112 140v55zM1344 272c0 62 -50 112 -112 112
-c-16 0 -32 -3 -46 -10l-290 -132c-60 -27 -121 -51 -121 -127c0 -66 46 -114 113 -114c12 0 28 4 38 9l352 160c40 18 66 58 66 102zM1112 1024l-650 248c-15 5 -30 8 -46 8c-70 0 -128 -57 -128 -128c0 -53 33 -101 82 -120l526 -200v-64h-640c-71 0 -128 -57 -128 -128
-s57 -128 128 -128h535l233 106v198c0 40 17 79 46 106l111 102h-69zM1073 0c52 0 105 6 155 19l339 85c57 14 97 65 97 124v668c0 71 -57 128 -128 128h-308l-136 -126c-23 -21 -36 -51 -36 -82v-296c0 -62 51 -108 112 -108c62 0 112 55 112 116v208h32v-208
-c0 -45 -22 -87 -57 -114c70 -11 121 -72 121 -142c0 -56 -33 -108 -84 -131l-310 -141h91z" />
-    <glyph glyph-name="tumblr-square" unicode="&#xf174;" 
-d="M1136 75l-62 183c-24 -12 -69 -22 -103 -22c-102 -3 -123 71 -123 126v398h257v194h-256v326h-188c-3 0 -8 -3 -9 -10c-11 -99 -58 -275 -252 -345v-165h130v-418c0 -143 105 -347 384 -342c94 2 199 41 222 75zM1536 1120v-960c0 -159 -129 -288 -288 -288h-960
-c-159 0 -288 129 -288 288v960c0 159 129 288 288 288h960c159 0 288 -129 288 -288z" />
-    <glyph glyph-name="rub" unicode="&#xf158;" horiz-adv-x="1280" 
-d="M1043 971c0 134 -95 224 -236 224h-320v-448h320c141 0 236 90 236 224zM1280 971c0 -257 -186 -437 -453 -437h-340v-118h505c18 0 32 -14 32 -32v-128c0 -18 -14 -32 -32 -32h-505v-192c0 -18 -14 -32 -32 -32h-167c-18 0 -32 14 -32 32v192h-224c-18 0 -32 14 -32 32
-v128c0 18 14 32 32 32h224v118h-224c-18 0 -32 14 -32 32v149c0 18 14 32 32 32h224v629c0 18 14 32 32 32h539c267 0 453 -180 453 -437z" />
-    <glyph glyph-name="chevron-circle-up" unicode="&#xf139;" 
-d="M1165 397l102 102c25 25 25 65 0 90l-454 454c-25 25 -65 25 -90 0l-454 -454c-25 -25 -25 -65 0 -90l102 -102c25 -25 65 -25 90 0l307 307l307 -307c25 -25 65 -25 90 0zM1536 640c0 -424 -344 -768 -768 -768s-768 344 -768 768s344 768 768 768s768 -344 768 -768z
-" />
-    <glyph glyph-name="opencart" unicode="&#xf23d;" horiz-adv-x="2304" 
-d="M1524 -25c0 -91 -73 -164 -164 -164s-165 73 -165 164s74 165 165 165s164 -74 164 -165zM775 -25c0 -91 -74 -164 -165 -164s-164 73 -164 164s73 165 164 165s165 -74 165 -165zM0 1469c295 -311 572 -357 1660 -357s610 -242 -62 -842c213 370 945 698 -255 680
-c-1151 -17 -1219 333 -1343 519z" />
-    <glyph glyph-name="artstation" unicode="&#xf2ed;" horiz-adv-x="1533" 
-d="M601 1277v0h267c51 0 112 -37 136 -83l504 -878c16 -24 25 -53 25 -84c0 -35 -7 -53 -31 -94l-123 -213zM474 1058l348 -604h-695zM0 233v0h949l178 -309h-859c-53 0 -114 38 -138 85h-1z" />
-    <glyph glyph-name="thumbs-up" unicode="&#xf164;" horiz-adv-x="1600" 
-d="M256 192c0 35 -29 64 -64 64c-36 0 -64 -29 -64 -64c0 -36 28 -64 64 -64c35 0 64 28 64 64zM416 704v-640c0 -35 -29 -64 -64 -64h-288c-35 0 -64 29 -64 64v640c0 35 29 64 64 64h288c35 0 64 -29 64 -64zM1600 704c0 -53 -21 -110 -55 -149c11 -32 15 -62 15 -76
-c2 -50 -13 -97 -43 -137c11 -37 11 -77 0 -117c-10 -37 -29 -70 -54 -94c6 -75 -11 -136 -49 -181c-43 -51 -109 -77 -197 -78h-129c-143 0 -278 47 -386 84c-63 22 -123 43 -158 44c-34 1 -64 29 -64 64v641c0 33 28 61 61 64c37 3 133 122 177 180c36 46 70 89 101 120
-c39 39 50 99 62 157c11 59 23 121 66 163c12 12 28 19 45 19c224 0 224 -179 224 -256c0 -82 -29 -140 -56 -192c-11 -22 -21 -32 -29 -64h277c104 0 192 -88 192 -192z" />
-    <glyph glyph-name="vimeo-square" unicode="&#xf194;" 
-d="M1292 898c7 145 -47 218 -161 222c-154 5 -258 -82 -312 -261c28 12 55 19 82 19c56 0 81 -32 74 -96c-3 -38 -28 -94 -74 -167c-47 -74 -82 -110 -105 -110c-30 0 -56 56 -82 169c-8 34 -23 118 -45 255c-20 126 -73 185 -160 177c-36 -4 -92 -36 -164 -100
-c-54 -47 -107 -96 -162 -144l52 -67c50 34 79 52 87 52c38 0 74 -60 107 -179c30 -110 60 -219 90 -329c45 -119 99 -179 164 -179c104 0 232 98 383 294c146 188 222 336 226 444zM1536 1120v-960c0 -159 -129 -288 -288 -288h-960c-159 0 -288 129 -288 288v960
-c0 159 129 288 288 288h960c159 0 288 -129 288 -288z" />
-    <glyph glyph-name="arrow-circle-right" unicode="&#xf0a9;" 
-d="M1285 640c0 17 -6 33 -18 45l-91 91l-362 362c-12 12 -28 18 -45 18s-33 -6 -45 -18l-91 -91c-12 -12 -18 -28 -18 -45s6 -33 18 -45l189 -189h-502c-35 0 -64 -29 -64 -64v-128c0 -35 29 -64 64 -64h502l-189 -189c-12 -12 -19 -28 -19 -45s7 -33 19 -45l91 -91
-c12 -12 28 -18 45 -18s33 6 45 18l362 362l91 91c12 12 18 28 18 45zM1536 640c0 -424 -344 -768 -768 -768s-768 344 -768 768s344 768 768 768s768 -344 768 -768z" />
-    <glyph glyph-name="bolt" unicode="&#xf0e7;" horiz-adv-x="896" 
-d="M885 970c11 -12 14 -29 7 -44l-540 -1157c-8 -15 -24 -25 -42 -25c-4 0 -9 1 -14 2c-22 7 -35 28 -30 49l197 808l-406 -101c-4 -1 -8 -1 -12 -1c-11 0 -23 4 -31 11c-12 10 -16 25 -13 39l201 825c5 19 23 32 44 32h328c25 0 45 -19 45 -42c0 -6 -2 -12 -5 -18
-l-171 -463l396 98c4 1 8 2 12 2c13 0 25 -6 34 -15z" />
-    <glyph glyph-name="thermometer-quarter" unicode="&#xf2ca;" horiz-adv-x="1024" 
-d="M640 192c0 -106 -86 -192 -192 -192s-192 86 -192 192c0 80 50 153 128 181v139h128v-139c78 -28 128 -101 128 -181zM768 192c0 105 -50 197 -128 256v768c0 106 -86 192 -192 192s-192 -86 -192 -192v-768c-78 -59 -128 -151 -128 -256c0 -177 143 -320 320 -320
-s320 143 320 320zM896 192c0 -247 -201 -448 -448 -448s-448 201 -448 448c0 122 49 232 128 313v711c0 177 143 320 320 320s320 -143 320 -320v-711c79 -81 128 -191 128 -313zM1024 768v-128h-192v128h192zM1024 1024v-128h-192v128h192zM1024 1280v-128h-192v128h192z
-" />
-    <glyph glyph-name="hdd-o" unicode="&#xf0a0;" 
-d="M1040 320c0 -44 -36 -80 -80 -80s-80 36 -80 80s36 80 80 80s80 -36 80 -80zM1296 320c0 -44 -36 -80 -80 -80s-80 36 -80 80s36 80 80 80s80 -36 80 -80zM1408 160v320c0 17 -15 32 -32 32h-1216c-17 0 -32 -15 -32 -32v-320c0 -17 15 -32 32 -32h1216c17 0 32 15 32 32
-zM178 640h1180l-157 482c-5 17 -24 30 -42 30h-782c-18 0 -37 -13 -42 -30zM1536 480v-320c0 -88 -72 -160 -160 -160h-1216c-88 0 -160 72 -160 160v320c0 27 8 50 16 75l197 606c23 70 90 119 164 119h782c74 0 141 -49 164 -119l197 -606c8 -25 16 -48 16 -75z" />
-    <glyph glyph-name="id-card-o" unicode="&#xf2c3;" horiz-adv-x="2048" 
-d="M896 324c0 -73 -48 -132 -107 -132h-426c-59 0 -107 59 -107 132c0 132 32 284 164 284c40 -40 95 -64 156 -64s116 24 156 64c132 0 164 -152 164 -284zM768 768c0 -106 -86 -192 -192 -192s-192 86 -192 192s86 192 192 192s192 -86 192 -192zM1792 352v-64
-c0 -18 -14 -32 -32 -32h-704c-18 0 -32 14 -32 32v64c0 18 14 32 32 32h704c18 0 32 -14 32 -32zM1408 608v-64c0 -18 -14 -32 -32 -32h-320c-18 0 -32 14 -32 32v64c0 18 14 32 32 32h320c18 0 32 -14 32 -32zM1792 608v-64c0 -18 -14 -32 -32 -32h-192
-c-18 0 -32 14 -32 32v64c0 18 14 32 32 32h192c18 0 32 -14 32 -32zM1792 864v-64c0 -18 -14 -32 -32 -32h-704c-18 0 -32 14 -32 32v64c0 18 14 32 32 32h704c18 0 32 -14 32 -32zM1920 32v1120h-1792v-1120c0 -17 15 -32 32 -32h1728c17 0 32 15 32 32zM2048 1248v-1216
-c0 -88 -72 -160 -160 -160h-1728c-88 0 -160 72 -160 160v1216c0 88 72 160 160 160h1728c88 0 160 -72 160 -160z" />
-    <glyph glyph-name="plug" unicode="&#xf1e6;" horiz-adv-x="1792" 
-d="M1755 1083c49 -50 49 -131 0 -181l-401 -400l150 -150l-160 -160c-219 -219 -553 -250 -801 -86l-362 -362h-181v181l362 362c-164 248 -133 582 86 801l160 160l150 -150l400 401c50 49 131 49 181 0c50 -50 50 -132 0 -181l-400 -401l234 -234l401 400
-c50 50 131 50 181 0z" />
-    <glyph glyph-name="react" unicode="&#xf302;" horiz-adv-x="1755" 
-d="M1434 910v0c187 -64 321 -165 321 -269c0 -109 -143 -215 -341 -280c-11 -3 -21 -7 -32 -10c3 -13 7 -33 10 -46c39 -197 10 -360 -83 -413c-89 -52 -235 -1 -382 125c-16 14 -31 28 -46 43c-12 -12 -24 -22 -36 -33c-152 -133 -307 -187 -400 -134
-c-90 52 -118 203 -82 393c4 21 9 40 14 61c-16 4 -32 10 -47 15c-190 65 -330 172 -330 279c0 104 131 205 314 268c20 7 42 14 64 20c-5 19 -9 38 -13 57c-38 193 -11 348 79 400c94 55 250 -3 406 -142c8 -7 21 -20 29 -27c14 13 28 27 43 40c149 130 296 184 386 132
-c94 -54 121 -219 79 -423c-3 -13 -6 -25 -9 -38c15 -5 41 -13 56 -18zM970 1201v0c-14 -12 -27 -23 -40 -36c53 -57 101 -118 146 -182c77 -7 155 -20 231 -37c3 11 5 23 7 35c36 177 15 311 -43 344c-54 31 -173 -13 -301 -124zM524 553c-22 -52 -41 -104 -56 -153
-c52 -11 106 -19 159 -25c-19 29 -37 59 -54 89c-17 29 -33 59 -49 89zM524 726c15 30 32 61 49 90s35 59 53 87c-55 -7 -108 -16 -157 -27c15 -48 33 -99 55 -150zM563 640v0c23 -47 48 -93 74 -139c22 -38 59 -98 84 -134c50 -3 103 -5 157 -5s107 2 158 6
-c29 44 57 87 83 133c22 38 55 101 74 140c-23 47 -49 94 -75 139c-22 37 -59 96 -83 132c-51 4 -104 6 -157 6s-107 -2 -158 -6c-29 -44 -57 -87 -83 -133s-51 -92 -74 -139zM1182 464c-17 -29 -34 -59 -53 -88c54 6 108 16 161 28c-17 52 -35 102 -57 152
-c-16 -31 -34 -62 -51 -92zM1232 726c21 49 39 98 55 149c-49 11 -102 21 -157 28c15 -24 38 -63 52 -87c17 -29 34 -60 50 -90zM878 1112v0c-34 -37 -68 -79 -102 -123c28 1 74 3 102 3s74 -2 102 -3c-32 43 -66 84 -102 123zM481 1322c-54 -31 -76 -156 -44 -322
-c4 -18 8 -36 12 -53c76 17 154 29 231 36c45 64 94 125 147 182c-9 8 -17 16 -26 24c-135 119 -262 167 -320 133zM397 419c24 75 52 149 85 221c-33 71 -61 144 -84 218c-20 -6 -40 -12 -60 -19c-156 -55 -264 -135 -264 -198c7 -41 29 -78 64 -102
-c60 -48 143 -84 216 -107c14 -5 29 -9 43 -13zM796 83c11 10 22 19 33 30c-53 58 -103 119 -148 183c-79 6 -156 18 -233 34c-5 -19 -8 -38 -12 -57c-31 -163 -9 -284 46 -316c39 -15 83 -13 121 5c71 28 136 69 193 121zM880 166c36 40 70 81 102 125
-c-34 -2 -69 -3 -104 -3c-34 0 -68 1 -101 2c34 -45 68 -86 103 -124zM1328 63c11 76 9 153 -8 227c-2 12 -6 31 -9 42c-64 -14 -169 -31 -234 -36c-44 -64 -93 -126 -145 -184c15 -14 30 -27 44 -39c125 -108 241 -149 296 -117c33 26 53 65 56 107zM1391 432
-c171 57 291 143 291 210c0 62 -112 144 -272 199c-16 5 -34 11 -52 16c-23 -74 -51 -146 -84 -216c34 -71 64 -143 88 -218c10 3 19 6 29 9zM878 797c87 0 157 -70 157 -157s-70 -157 -157 -157s-157 70 -157 157s70 157 157 157z" />
-    <glyph glyph-name="themeisle" unicode="&#xf2b2;" horiz-adv-x="1792" 
-d="M852 1227c0 -36 -23 -76 -62 -76c-40 0 -62 40 -62 76c0 35 22 76 62 76c39 0 62 -41 62 -76zM688 -149v114c0 39 -31 73 -71 73s-70 -34 -70 -73v-114c0 -39 30 -74 70 -74s71 34 71 74zM860 -149v114c0 39 -30 73 -70 73s-71 -34 -71 -73v-114c0 -39 31 -74 71 -74
-s70 35 70 74zM1034 -149v114c0 39 -31 73 -71 73s-71 -34 -71 -73v-114c0 -39 31 -74 71 -74s71 34 71 74zM1208 -149v114c0 39 -31 73 -71 73s-71 -34 -71 -73v-114c0 -39 31 -74 71 -74s71 35 71 74zM1476 535c-108 -207 -316 -359 -555 -359c-338 0 -562 296 -562 618
-c0 59 7 117 21 174c-70 -118 -104 -254 -104 -390c0 -211 87 -426 250 -563c18 34 52 57 91 57c35 0 68 -20 86 -50c19 30 51 50 87 50c35 0 68 -20 86 -50c19 30 52 50 87 50s68 -20 87 -50c18 30 51 50 86 50c38 0 73 -23 90 -56c152 127 240 322 250 519zM1326 564
-c0 50 -22 75 -72 75c-16 0 -32 -3 -47 -6c-50 -10 -99 -19 -149 -19c-158 0 -226 92 -226 243c0 69 13 137 30 204c-53 -81 -83 -178 -83 -275c0 -189 120 -371 324 -371c75 0 149 27 210 70c7 26 13 52 13 79zM884 1223c0 63 -44 129 -113 129s-113 -66 -113 -129
-c0 -64 44 -130 113 -130s113 66 113 130zM1513 884c0 188 -121 370 -324 370c-106 0 -205 -53 -276 -129c-25 -83 -48 -180 -48 -268c0 -133 53 -210 193 -210c48 0 95 9 142 19c18 3 35 6 53 6c69 0 104 -40 104 -108c0 -15 -1 -31 -4 -46c101 91 160 230 160 366z
-M1792 667c0 -126 -40 -358 -127 -454c-80 -87 -306 -214 -423 -247l-4 -1v-114c0 -57 -44 -107 -102 -107c-35 0 -68 20 -86 50c-19 -30 -52 -50 -87 -50s-68 20 -87 50c-18 -30 -51 -50 -86 -50c-36 0 -68 20 -87 50c-18 -30 -51 -50 -86 -50c-66 0 -103 55 -103 115
-c-57 -43 -125 -68 -198 -68c-77 0 -152 29 -211 80c36 1 72 8 106 20c-73 20 -138 66 -182 127c23 -5 47 -7 71 -7c58 0 115 16 164 46c-77 77 -198 206 -240 306c-20 47 -24 110 -24 160c0 174 71 560 302 560c37 0 66 -17 81 -52c13 19 27 37 42 54c7 9 20 19 25 29
-c28 44 41 74 76 119c113 144 286 243 472 243c21 0 42 -1 62 -4c38 41 91 64 146 64c51 0 104 -21 140 -57c3 -3 5 -8 5 -12c0 -13 -36 -47 -45 -57c15 -5 55 -24 55 -42c0 -10 -10 -18 -16 -25c110 -97 173 -235 197 -378c15 18 36 30 60 30c37 0 73 -25 100 -49
-c73 -65 90 -186 90 -279z" />
-    <glyph glyph-name="braille" unicode="&#xf2a1;" horiz-adv-x="2176" 
-d="M192 352c-88 0 -160 -72 -160 -160s72 -160 160 -160s160 72 160 160s-72 160 -160 160zM704 352c-88 0 -160 -72 -160 -160s72 -160 160 -160s160 72 160 160s-72 160 -160 160zM704 864c-88 0 -160 -72 -160 -160s72 -160 160 -160s160 72 160 160s-72 160 -160 160z
-M1472 352c-88 0 -160 -72 -160 -160s72 -160 160 -160s160 72 160 160s-72 160 -160 160zM1984 352c-88 0 -160 -72 -160 -160s72 -160 160 -160s160 72 160 160s-72 160 -160 160zM1472 864c-88 0 -160 -72 -160 -160s72 -160 160 -160s160 72 160 160s-72 160 -160 160z
-M1984 864c-88 0 -160 -72 -160 -160s72 -160 160 -160s160 72 160 160s-72 160 -160 160zM1984 1376c-88 0 -160 -72 -160 -160s72 -160 160 -160s160 72 160 160s-72 160 -160 160zM384 192c0 -106 -86 -192 -192 -192s-192 86 -192 192s86 192 192 192s192 -86 192 -192z
-M896 192c0 -106 -86 -192 -192 -192s-192 86 -192 192s86 192 192 192s192 -86 192 -192zM384 704c0 -106 -86 -192 -192 -192s-192 86 -192 192s86 192 192 192s192 -86 192 -192zM896 704c0 -106 -86 -192 -192 -192s-192 86 -192 192s86 192 192 192s192 -86 192 -192z
-M384 1216c0 -106 -86 -192 -192 -192s-192 86 -192 192s86 192 192 192s192 -86 192 -192zM1664 192c0 -106 -86 -192 -192 -192s-192 86 -192 192s86 192 192 192s192 -86 192 -192zM896 1216c0 -106 -86 -192 -192 -192s-192 86 -192 192s86 192 192 192s192 -86 192 -192
-zM2176 192c0 -106 -86 -192 -192 -192s-192 86 -192 192s86 192 192 192s192 -86 192 -192zM1664 704c0 -106 -86 -192 -192 -192s-192 86 -192 192s86 192 192 192s192 -86 192 -192zM2176 704c0 -106 -86 -192 -192 -192s-192 86 -192 192s86 192 192 192
-s192 -86 192 -192zM1664 1216c0 -106 -86 -192 -192 -192s-192 86 -192 192s86 192 192 192s192 -86 192 -192zM2176 1216c0 -106 -86 -192 -192 -192s-192 86 -192 192s86 192 192 192s192 -86 192 -192z" />
-    <glyph glyph-name="industry" unicode="&#xf275;" horiz-adv-x="1792" 
-d="M448 1536c35 0 64 -29 64 -64v-891l536 429c11 9 26 14 40 14c35 0 64 -29 64 -64v-379l536 429c11 9 26 14 40 14c35 0 64 -29 64 -64v-1152c0 -35 -29 -64 -64 -64h-1664c-35 0 -64 29 -64 64v1664c0 35 29 64 64 64h384z" />
-    <glyph glyph-name="map-o" unicode="&#xf278;" horiz-adv-x="2048" 
-d="M2020 1525c17 -12 28 -32 28 -53v-1408c0 -26 -16 -50 -40 -59l-640 -256c-16 -7 -32 -7 -48 0l-616 246l-616 -246c-8 -4 -16 -5 -24 -5c-13 0 -25 4 -36 11c-17 12 -28 32 -28 53v1408c0 26 16 50 40 59l640 256c16 7 32 7 48 0l616 -246l616 246c20 8 42 6 60 -6z
-M736 1390v-1270l576 -230v1270zM128 1173v-1270l544 217v1270zM1920 107v1270l-544 -217v-1270z" />
-    <glyph glyph-name="krw" unicode="&#xf159;" horiz-adv-x="1792" 
-d="M514 341l81 299h-159l75 -300c1 -2 1 -4 2 -6c0 2 1 5 1 7zM630 768l35 128h-292l32 -128h225zM822 768h139l-35 128h-70zM1271 340l78 300h-162l81 -299c1 -3 1 -5 2 -7c0 2 1 4 1 6zM1382 768l33 128h-297l34 -128h230zM1792 736v-64c0 -18 -14 -32 -32 -32h-213
-l-164 -616c-4 -14 -17 -24 -31 -24h-159c-14 0 -27 10 -31 24l-166 616h-209l-167 -616c-4 -14 -16 -24 -31 -24h-159c-14 0 -27 10 -30 24l-160 616h-208c-18 0 -32 14 -32 32v64c0 18 14 32 32 32h175l-33 128h-142c-18 0 -32 14 -32 32v64c0 18 14 32 32 32h109l-89 344
-c-3 10 -1 20 5 28c6 7 16 12 26 12h137c15 0 28 -10 31 -24l90 -360h359l97 360c4 14 17 24 31 24h126c15 0 27 -10 31 -24l98 -360h365l93 360c3 14 16 24 31 24h137c10 0 20 -5 26 -12c6 -8 8 -19 5 -28l-91 -344h111c18 0 32 -14 32 -32v-64c0 -18 -14 -32 -32 -32h-145
-l-34 -128h179c18 0 32 -14 32 -32z" />
-    <glyph glyph-name="joomla" unicode="&#xf1aa;" 
-d="M1070 463l-160 -160l-151 -152l-30 -30c-88 -87 -211 -117 -323 -89c-21 -92 -103 -160 -201 -160c-113 0 -205 92 -205 206c0 97 67 179 158 200c-29 113 1 237 89 325l12 12l151 -152l-11 -11c-50 -49 -49 -129 0 -179c49 -49 129 -49 178 0l30 30l151 152l161 160z
-M729 1145l12 -12l-152 -152l-12 12c-49 49 -129 49 -178 0s-49 -130 0 -179l29 -29l152 -152l160 -160l-151 -152l-161 160l-151 152l-30 30c-92 91 -120 222 -85 339c-92 20 -160 102 -160 200c0 114 92 206 205 206c103 0 187 -75 203 -172c111 26 232 -5 319 -91z
-M1536 78c0 -114 -92 -206 -205 -206c-100 0 -183 71 -202 165c-116 -36 -249 -8 -341 84l-11 12l151 152l12 -12c49 -49 129 -49 178 0s49 129 0 178l-30 30l-152 152l-160 160l152 152l160 -160l152 -152l29 -30c87 -87 118 -210 90 -322c100 -14 177 -99 177 -203z
-M1534 1202c0 -104 -78 -190 -178 -204c33 -115 4 -244 -87 -335l-12 -12l-151 152l12 12c49 49 49 129 0 178s-129 49 -178 0l-30 -30l-152 -152l-160 -160l-152 152l161 160l152 152l29 30c91 91 221 120 337 86c14 100 100 177 204 177c113 0 205 -92 205 -206z" />
-    <glyph glyph-name="ethereum" unicode="&#xf2f3;" horiz-adv-x="1064" 
-d="M1064 623l-532 -325l-532 325l532 913zM532 194l532 325l-532 -775l-532 775z" />
-    <glyph glyph-name="plus" unicode="&#xf067;" horiz-adv-x="1408" 
-d="M1408 800v-192c0 -53 -43 -96 -96 -96h-416v-416c0 -53 -43 -96 -96 -96h-192c-53 0 -96 43 -96 96v416h-416c-53 0 -96 43 -96 96v192c0 53 43 96 96 96h416v416c0 53 43 96 96 96h192c53 0 96 -43 96 -96v-416h416c53 0 96 -43 96 -96z" />
-    <glyph glyph-name="list-ul" unicode="&#xf0ca;" horiz-adv-x="1792" 
-d="M384 128c0 -106 -86 -192 -192 -192s-192 86 -192 192s86 192 192 192s192 -86 192 -192zM384 640c0 -106 -86 -192 -192 -192s-192 86 -192 192s86 192 192 192s192 -86 192 -192zM1792 224v-192c0 -17 -15 -32 -32 -32h-1216c-17 0 -32 15 -32 32v192c0 17 15 32 32 32
-h1216c17 0 32 -15 32 -32zM384 1152c0 -106 -86 -192 -192 -192s-192 86 -192 192s86 192 192 192s192 -86 192 -192zM1792 736v-192c0 -17 -15 -32 -32 -32h-1216c-17 0 -32 15 -32 32v192c0 17 15 32 32 32h1216c17 0 32 -15 32 -32zM1792 1248v-192
-c0 -17 -15 -32 -32 -32h-1216c-17 0 -32 15 -32 32v192c0 17 15 32 32 32h1216c17 0 32 -15 32 -32z" />
-    <glyph glyph-name="play-circle-o" unicode="&#xf01d;" 
-d="M1184 640c0 -23 -12 -44 -32 -55l-544 -320c-10 -6 -21 -9 -32 -9s-22 3 -32 8c-20 12 -32 33 -32 56v640c0 23 12 44 32 56c20 11 45 11 64 -1l544 -320c20 -11 32 -32 32 -55zM1312 640c0 300 -244 544 -544 544s-544 -244 -544 -544s244 -544 544 -544
-s544 244 544 544zM1536 640c0 -424 -344 -768 -768 -768s-768 344 -768 768s344 768 768 768s768 -344 768 -768z" />
-    <glyph glyph-name="joplin" unicode="&#xf310;" 
-d="M288 1408h960c159 0 288 -129 288 -288v-960c0 -159 -129 -288 -288 -288h-960c-159 0 -288 129 -288 288v960c0 159 129 288 288 288zM737 1171v-148l43 -1c59 -2 70 -6 81 -30c4 -10 5 -13 5 -296c0 -323 0 -323 -16 -362c-16 -38 -48 -69 -87 -83
-c-13 -5 -21 -5 -43 -6c-33 -1 -53 2 -80 15c-30 14 -50 37 -62 69c-9 24 -10 34 -12 88c-2 51 -1 56 -7 70c-9 23 -25 45 -40 56c-24 18 -49 24 -87 22c-40 -2 -68 -13 -95 -41c-23 -23 -35 -44 -44 -75c-4 -15 -5 -23 -5 -54c0 -38 1 -46 11 -79c26 -82 92 -156 178 -199
-c46 -23 85 -35 155 -44v0c20 -3 119 -3 142 0c87 10 150 32 208 71c73 49 127 125 142 199c8 40 9 47 10 343l1 291l6 13c6 15 15 24 29 28c5 2 28 3 52 4l43 1v74l-1 73l-263 1h-264z" />
-    <glyph glyph-name="mars-stroke" unicode="&#xf229;" 
-d="M1472 1408c35 0 64 -29 64 -64v-416c0 -18 -14 -32 -32 -32h-64c-18 0 -32 14 -32 32v262l-213 -214l140 -140c12 -13 12 -33 0 -45l-46 -46c-12 -12 -32 -12 -45 0l-140 141l-78 -79c79 -98 126 -223 126 -359c0 -318 -258 -576 -576 -576s-576 258 -576 576
-s258 576 576 576c136 0 261 -47 359 -126l78 78l-172 172c-12 13 -12 33 0 45l46 46c12 12 32 12 45 0l172 -172l213 213h-261c-18 0 -32 14 -32 32v64c0 18 14 32 32 32h416zM576 0c247 0 448 201 448 448s-201 448 -448 448s-448 -201 -448 -448s201 -448 448 -448z" />
-    <glyph glyph-name="road" unicode="&#xf018;" horiz-adv-x="1820" 
-d="M1061 540v4l-24 320c-1 18 -17 32 -34 32h-186c-17 0 -33 -14 -34 -32l-24 -320v-4c-1 -16 14 -28 29 -28h244c15 0 30 12 29 28zM1820 73c0 -29 -8 -73 -46 -73h-704c17 0 31 14 30 32l-20 256c-1 18 -17 32 -34 32h-272c-17 0 -33 -14 -34 -32l-20 -256
-c-1 -18 13 -32 30 -32h-704c-38 0 -46 44 -46 73c0 40 11 80 26 116l417 1044c10 25 37 47 64 47h339c-17 0 -33 -14 -34 -32l-15 -192c-1 -18 12 -32 30 -32h166c18 0 31 14 30 32l-15 192c-1 18 -17 32 -34 32h339c27 0 54 -22 64 -47l417 -1044c15 -36 26 -76 26 -116z
-" />
-    <glyph glyph-name="volume-down" unicode="&#xf027;" horiz-adv-x="1152" 
-d="M768 1184v-1088c0 -35 -29 -64 -64 -64c-17 0 -33 7 -45 19l-333 333h-262c-35 0 -64 29 -64 64v384c0 35 29 64 64 64h262l333 333c12 12 28 19 45 19c35 0 64 -29 64 -64zM1152 640c0 -100 -61 -197 -155 -235c-8 -4 -17 -5 -25 -5c-35 0 -64 28 -64 64
-c0 76 116 55 116 176s-116 100 -116 176c0 36 29 64 64 64c8 0 17 -1 25 -5c94 -37 155 -135 155 -235z" />
-    <glyph glyph-name="question-circle" unicode="&#xf059;" 
-d="M896 160v192c0 18 -14 32 -32 32h-192c-18 0 -32 -14 -32 -32v-192c0 -18 14 -32 32 -32h192c18 0 32 14 32 32zM1152 832c0 183 -192 320 -364 320c-163 0 -285 -70 -371 -213c-9 -14 -5 -32 8 -42l132 -100c5 -4 12 -6 19 -6c9 0 19 4 25 12c47 60 67 78 86 92
-c17 12 50 24 86 24c64 0 123 -41 123 -85c0 -52 -27 -78 -88 -106c-71 -32 -168 -115 -168 -212v-36c0 -18 14 -32 32 -32h192c18 0 32 14 32 32c0 23 29 72 76 99c76 43 180 101 180 253zM1536 640c0 -424 -344 -768 -768 -768s-768 344 -768 768s344 768 768 768
-s768 -344 768 -768z" />
-    <glyph glyph-name="paypal" unicode="&#xf1ed;" horiz-adv-x="1519" 
-d="M1510 890c13 -60 10 -129 -4 -204c-65 -330 -284 -444 -565 -444h-44c-34 0 -62 -25 -68 -59l-4 -19l-55 -346l-2 -15c-7 -34 -35 -59 -69 -59h-251c-28 0 -46 23 -42 51c18 112 35 224 53 336s36 223 54 335c3 24 19 37 43 37c40 0 80 1 131 0c72 -1 155 3 236 21
-c108 24 206 68 287 144c73 68 122 152 155 246c15 44 27 88 35 133c2 12 5 10 12 5c55 -41 86 -96 98 -162zM1338 1172c0 -82 -19 -160 -46 -236c-52 -151 -150 -259 -302 -315c-81 -29 -166 -41 -252 -42c-60 -1 -120 0 -180 0c-65 0 -106 -32 -118 -96
-c-14 -76 -69 -430 -85 -530c-1 -7 -4 -10 -12 -10h-295c-30 0 -52 26 -48 55l232 1471c6 38 40 67 79 67h598c43 0 142 -19 209 -45c142 -55 220 -167 220 -319z" />
-    <glyph glyph-name="child" unicode="&#xf1ae;" horiz-adv-x="1152" 
-d="M1124 988l-292 -292v-824c0 -62 -50 -112 -112 -112s-112 50 -112 112v384h-64v-384c0 -62 -50 -112 -112 -112s-112 50 -112 112v824l-292 292c-37 38 -37 98 0 136c38 37 98 37 136 0l228 -228h368l228 228c38 37 98 37 136 0c37 -38 37 -98 0 -136zM800 1152
-c0 -124 -100 -224 -224 -224s-224 100 -224 224s100 224 224 224s224 -100 224 -224z" />
-    <glyph glyph-name="fork-awesome" unicode="&#xf2e3;" horiz-adv-x="1533" 
-d="M766 1404v0c423 0 767 -343 767 -766v-1v-2c0 -8 -1 -17 -1 -25v-2c-14 -388 -318 -703 -701 -735v1c-18 -2 -47 -2 -65 -2s-47 1 -65 3v-2c-383 32 -685 347 -700 735v2c0 8 -1 17 -1 25v2v1c0 423 343 766 766 766zM594 1085h-66c-35 -251 -54 -525 -29 -712
-s145 -157 181 -351c5 -29 10 -59 14 -89c20 -2 52 -4 72 -4s52 2 72 4c4 30 9 60 14 89c36 194 156 164 181 351s6 456 -28 712h-65c3 -190 12 -430 -8 -640c-8 -89 -103 -87 -108 0c-13 208 -15 428 -26 639h-64c-11 -211 -18 -431 -26 -643c-3 -82 -100 -81 -108 0
-c-19 208 -10 453 -6 644z" />
-    <glyph glyph-name="angle-double-up" unicode="&#xf102;" horiz-adv-x="998" 
-d="M998 224c0 -8 -4 -17 -10 -23l-50 -50c-6 -6 -14 -10 -23 -10c-8 0 -17 4 -23 10l-393 393l-393 -393c-6 -6 -15 -10 -23 -10s-17 4 -23 10l-50 50c-6 6 -10 15 -10 23s4 17 10 23l466 466c6 6 15 10 23 10s17 -4 23 -10l466 -466c6 -6 10 -15 10 -23zM998 608
-c0 -8 -4 -17 -10 -23l-50 -50c-6 -6 -14 -10 -23 -10c-8 0 -17 4 -23 10l-393 393l-393 -393c-6 -6 -15 -10 -23 -10s-17 4 -23 10l-50 50c-6 6 -10 15 -10 23s4 17 10 23l466 466c6 6 15 10 23 10s17 -4 23 -10l466 -466c6 -6 10 -15 10 -23z" />
-    <glyph glyph-name="bath" unicode="&#xf2cd;" horiz-adv-x="1792" 
-d="M1664 448v-192c0 -114 -50 -215 -128 -286v-194c0 -18 -14 -32 -32 -32h-64c-18 0 -32 14 -32 32v118c-40 -14 -83 -22 -128 -22h-768c-45 0 -88 8 -128 22v-110c0 -22 -14 -40 -32 -40h-64c-18 0 -32 18 -32 40v186c-78 71 -128 172 -128 286v192h1536zM704 864
-c0 -18 -14 -32 -32 -32s-32 14 -32 32s14 32 32 32s32 -14 32 -32zM768 928c0 -18 -14 -32 -32 -32s-32 14 -32 32s14 32 32 32s32 -14 32 -32zM704 992c0 -18 -14 -32 -32 -32s-32 14 -32 32s14 32 32 32s32 -14 32 -32zM832 992c0 -18 -14 -32 -32 -32s-32 14 -32 32
-s14 32 32 32s32 -14 32 -32zM768 1056c0 -18 -14 -32 -32 -32s-32 14 -32 32s14 32 32 32s32 -14 32 -32zM704 1120c0 -18 -14 -32 -32 -32s-32 14 -32 32s14 32 32 32s32 -14 32 -32zM1792 608v-64c0 -18 -14 -32 -32 -32h-1728c-18 0 -32 14 -32 32v64c0 18 14 32 32 32
-h96v640c0 141 115 256 256 256c72 0 137 -30 184 -78c62 25 136 16 191 -27l22 22c6 6 16 6 22 0l42 -42c6 -6 6 -16 0 -22l-314 -314c-6 -6 -16 -6 -22 0l-42 42c-6 6 -6 16 0 22l22 22c-48 61 -54 145 -17 212c-23 22 -54 35 -88 35c-71 0 -128 -57 -128 -128v-640h1504
-c18 0 32 -14 32 -32zM896 1056c0 -18 -14 -32 -32 -32s-32 14 -32 32s14 32 32 32s32 -14 32 -32zM832 1120c0 -18 -14 -32 -32 -32s-32 14 -32 32s14 32 32 32s32 -14 32 -32zM768 1184c0 -18 -14 -32 -32 -32s-32 14 -32 32s14 32 32 32s32 -14 32 -32zM960 1120
-c0 -18 -14 -32 -32 -32s-32 14 -32 32s14 32 32 32s32 -14 32 -32zM896 1184c0 -18 -14 -32 -32 -32s-32 14 -32 32s14 32 32 32s32 -14 32 -32zM832 1248c0 -18 -14 -32 -32 -32s-32 14 -32 32s14 32 32 32s32 -14 32 -32zM1024 1184c0 -18 -14 -32 -32 -32s-32 14 -32 32
-s14 32 32 32s32 -14 32 -32zM960 1248c0 -18 -14 -32 -32 -32s-32 14 -32 32s14 32 32 32s32 -14 32 -32zM1088 1248c0 -18 -14 -32 -32 -32s-32 14 -32 32s14 32 32 32s32 -14 32 -32z" />
-    <glyph glyph-name="reply-all" unicode="&#xf122;" horiz-adv-x="1792" 
-d="M640 454v-70c0 -26 -16 -49 -39 -59c-8 -3 -17 -5 -25 -5c-17 0 -33 6 -45 19l-512 512c-25 25 -25 65 0 90l512 512c18 19 46 24 70 14c23 -10 39 -33 39 -59v-69l-397 -398c-25 -25 -25 -65 0 -90zM1792 416c0 -208 -157 -514 -164 -527c-5 -11 -16 -17 -28 -17
-c-3 0 -6 0 -9 1c-15 5 -24 19 -23 34c29 273 -5 453 -106 565c-85 95 -223 146 -438 163v-251c0 -26 -16 -49 -39 -59c-8 -3 -17 -5 -25 -5c-17 0 -33 6 -45 19l-512 512c-25 25 -25 65 0 90l512 512c18 19 46 24 70 14c23 -10 39 -33 39 -59v-262c276 -19 473 -92 599 -221
-c151 -155 169 -365 169 -509z" />
-    <glyph glyph-name="patreon" unicode="&#xf2f0;" 
-d="M985 1341c-305 0 -553 -248 -553 -553c0 -304 248 -551 553 -551c304 0 551 247 551 551c0 305 -247 553 -551 553zM270 -132h-270v1473h270v-1473z" />
-    <glyph glyph-name="inbox" unicode="&#xf01c;" 
-d="M1023 576h316c-2 5 -3 11 -5 16l-212 496h-708l-212 -496c-2 -5 -3 -11 -5 -16h316l95 -192h320zM1536 546v-482c0 -35 -29 -64 -64 -64h-1408c-35 0 -64 29 -64 64v482c0 36 11 89 25 123l238 552c14 33 54 59 89 59h832c35 0 75 -26 89 -59l238 -552
-c14 -34 25 -87 25 -123z" />
-    <glyph glyph-name="female" unicode="&#xf182;" horiz-adv-x="1280" 
-d="M1280 480c0 -53 -43 -96 -96 -96c-32 0 -62 16 -80 43l-227 341h-45v-132l247 -411c6 -10 9 -21 9 -33c0 -35 -29 -64 -64 -64h-192v-272c0 -62 -50 -112 -112 -112h-160c-61 0 -112 50 -112 112v272h-192c-35 0 -64 29 -64 64c0 12 3 23 9 33l247 411v132h-45l-227 -341
-c-18 -27 -48 -43 -80 -43c-53 0 -96 43 -96 96c0 19 6 38 16 53l256 384c40 59 102 107 176 107h384c74 0 136 -48 176 -107l256 -384c10 -15 16 -34 16 -53zM864 1280c0 -124 -100 -224 -224 -224s-224 100 -224 224s100 224 224 224s224 -100 224 -224z" />
-    <glyph glyph-name="gavel" unicode="&#xf0e3;" horiz-adv-x="1731" 
-d="M1731 0c0 -34 -14 -67 -37 -90l-107 -108c-24 -23 -57 -37 -91 -37s-67 14 -90 37l-363 364c-24 23 -38 56 -38 90c0 38 16 69 43 96l-256 256l-126 -126c-9 -9 -21 -14 -34 -14s-25 5 -34 14c30 -30 58 -52 58 -98c0 -26 -10 -49 -28 -68c-34 -36 -70 -84 -124 -84
-c-25 0 -50 10 -68 28l-408 408c-18 18 -28 43 -28 68c0 54 48 90 84 124c19 18 42 28 68 28c46 0 68 -28 98 -58c-9 9 -14 21 -14 34s5 25 14 34l348 348c9 9 21 14 34 14s25 -5 34 -14c-30 30 -58 52 -58 98c0 26 10 49 28 68c34 36 70 84 124 84c25 0 50 -10 68 -28
-l408 -408c18 -18 28 -43 28 -68c0 -54 -48 -90 -84 -124c-19 -18 -42 -28 -68 -28c-46 0 -68 28 -98 58c9 -9 14 -21 14 -34s-5 -25 -14 -34l-126 -126l256 -256c27 27 58 43 96 43c34 0 67 -14 91 -37l363 -363c23 -24 37 -57 37 -91z" />
-    <glyph glyph-name="jsfiddle" unicode="&#xf1cc;" horiz-adv-x="2048" 
-d="M1800 764c145 -60 248 -202 248 -367c0 -219 -181 -397 -403 -397c-8 0 -15 1 -22 1h-1217c-224 13 -406 184 -406 406c0 149 81 279 202 350c-8 26 -12 53 -12 82c0 153 125 277 281 277c64 0 124 -22 172 -58c98 202 306 342 549 342c337 0 609 -269 609 -600
-c0 -12 -1 -24 -1 -36zM468 498c0 -169 133 -264 292 -264c98 0 169 31 240 99c-29 36 -61 71 -91 107c-41 -40 -86 -65 -144 -65c-71 0 -132 47 -132 121c0 73 61 121 130 121c220 0 267 -384 587 -384c156 0 288 98 288 262c0 166 -133 263 -291 263
-c-98 0 -171 -28 -241 -97c32 -35 62 -72 93 -108c40 39 85 64 142 64c66 0 132 -47 132 -117c0 -77 -56 -126 -131 -126c-213 0 -270 384 -582 384c-155 0 -292 -95 -292 -260z" />
-    <glyph glyph-name="git" unicode="&#xf1d3;" horiz-adv-x="1656" 
-d="M527 22c0 88 -97 100 -165 100c-71 0 -158 -15 -158 -104c0 -90 103 -101 172 -101c73 0 151 18 151 105zM468 777c0 75 -36 143 -119 143c-92 0 -124 -61 -124 -145c0 -83 36 -135 124 -135c87 0 119 56 119 137zM737 1101v-202c-26 -9 -52 -16 -79 -22
-c10 -27 16 -55 16 -84c0 -169 -104 -298 -270 -329c-50 -10 -79 -31 -79 -85c0 -153 404 -49 404 -331c0 -229 -155 -304 -363 -304c-171 0 -366 57 -366 263c0 120 73 189 182 225v4c-46 28 -67 72 -67 126c0 51 11 114 63 137v4c-101 34 -167 173 -167 274
-c0 187 145 324 330 324c62 0 124 -16 178 -47c75 0 149 20 218 47zM1055 220h-222c4 45 4 89 4 134v609c0 43 1 86 -4 128h222c-5 -41 -4 -83 -4 -124v-613c0 -45 0 -89 4 -134zM1656 442v-196c-53 -29 -114 -39 -174 -39c-214 0 -239 169 -239 343v351h2v4
-c-13 0 -25 2 -37 2c-20 0 -40 -3 -59 -6v190h96v76c0 30 -1 60 -6 89h227c-8 -55 -6 -110 -6 -165h171v-190c-29 0 -58 4 -86 4h-85v-365c0 -59 13 -131 87 -131c39 0 77 11 109 33zM1080 1389c0 -75 -58 -145 -135 -145c-79 0 -138 69 -138 145c0 77 58 147 138 147
-c79 0 135 -72 135 -147z" />
-    <glyph glyph-name="signalapp" unicode="&#xf30c;" horiz-adv-x="1652" 
-d="M710 1400c32 4 84 8 116 8v0c27 0 53 -2 80 -4l-3 -42c-21 2 -56 3 -77 3c-31 0 -81 -3 -111 -7zM977 1351l8 43c54 -10 138 -36 188 -58l-17 -39c-48 21 -128 45 -179 54zM446 1321c49 24 133 54 186 66l10 -42c-51 -11 -130 -39 -177 -62zM1223 1264l21 37
-c48 -27 120 -78 160 -115l-29 -32c-38 35 -106 85 -152 110zM222 1161c39 39 108 93 155 122l22 -36c-44 -27 -110 -79 -147 -116l-30 30v0zM1427 1101l32 28c37 -41 87 -114 112 -163l-38 -20c-24 46 -71 116 -106 155v0zM65 934c23 50 69 125 104 168l33 -27
-c-33 -40 -77 -112 -98 -159zM1564 878l39 15c20 -52 41 -138 46 -193l-43 -4c-5 52 -23 133 -42 182zM0 664c3 55 19 143 36 196l41 -14c-16 -49 -32 -132 -34 -184zM1582 436c14 50 26 133 27 185h43c-1 -55 -14 -144 -29 -197zM-0 585l43 2c2 -70 10 -131 23 -187l-42 -11
-c-14 59 -22 123 -24 196zM1464 203c32 41 73 114 93 162l40 -16c-21 -51 -66 -128 -99 -172zM47 313l40 15c22 -60 52 -113 92 -160l-33 -28c-43 51 -75 108 -99 173v0zM1273 26c44 28 107 82 143 120l31 -29c-37 -40 -105 -97 -151 -127zM202 82l28 32
-c12 -11 34 -28 47 -38c4 -3 6 -7 7 -11l40 -125l-41 -13l-37 118c-13 10 -32 26 -44 37v0zM1033 -80c50 13 129 44 175 68l20 -39c-48 -25 -131 -56 -184 -70zM644 -86c2 1 7 2 9 2s3 -1 5 -1c17 -5 31 -8 42 -11l-9 -42c-10 2 -27 7 -37 10l-128 -57l-18 40l136 59v0z
-M826 -106c45 0 90 4 134 11l7 -42c-39 -6 -102 -12 -141 -12c-22 0 -40 0 -55 1l2 43c15 -1 31 -1 53 -1v0zM357 -256v0v0c-9 0 -17 7 -20 15l-30 93l41 13l23 -70l67 29l17 -39l-89 -39c-2 -1 -7 -2 -9 -2zM442 -65c-11 0 -21 8 -22 19l-16 213c-70 53 -124 122 -161 204
-c-37 81 -56 171 -56 268c0 332 292 602 651 602s651 -270 651 -602s-292 -602 -651 -602c-60 0 -119 8 -176 23l-209 -123c-3 -2 -7 -2 -11 -2v0z" />
-    <glyph glyph-name="share-square" unicode="&#xf14d;" 
-d="M1005 435l352 352c25 25 25 65 0 90l-352 352c-18 19 -46 24 -69 14c-24 -10 -40 -33 -40 -59v-160c-574 0 -640 -329 -640 -576c0 -201 161 -396 167 -404c7 -8 16 -12 25 -12c4 0 9 1 13 3c13 5 21 19 19 33c-30 241 -11 391 62 473c61 69 167 99 354 99v-160
-c0 -26 16 -49 40 -59c7 -3 16 -5 24 -5c17 0 33 7 45 19zM1536 1120v-960c0 -159 -129 -288 -288 -288h-960c-159 0 -288 129 -288 288v960c0 159 129 288 288 288h960c159 0 288 -129 288 -288z" />
-    <glyph glyph-name="thermometer-half" unicode="&#xf2c9;" horiz-adv-x="1024" 
-d="M640 192c0 -106 -86 -192 -192 -192s-192 86 -192 192c0 80 50 153 128 181v395h128v-395c78 -28 128 -101 128 -181zM768 192c0 105 -50 197 -128 256v768c0 106 -86 192 -192 192s-192 -86 -192 -192v-768c-78 -59 -128 -151 -128 -256c0 -177 143 -320 320 -320
-s320 143 320 320zM896 192c0 -247 -201 -448 -448 -448s-448 201 -448 448c0 122 49 232 128 313v711c0 177 143 320 320 320s320 -143 320 -320v-711c79 -81 128 -191 128 -313zM1024 768v-128h-192v128h192zM1024 1024v-128h-192v128h192zM1024 1280v-128h-192v128h192z
-" />
-    <glyph glyph-name="question" unicode="&#xf128;" horiz-adv-x="924" 
-d="M608 280v-240c0 -22 -18 -40 -40 -40h-240c-22 0 -40 18 -40 40v240c0 22 18 40 40 40h240c22 0 40 -18 40 -40zM924 880c0 -190 -129 -263 -224 -316c-59 -34 -96 -103 -96 -132c0 -22 -17 -48 -40 -48h-240c-22 0 -36 34 -36 56v45c0 121 120 225 208 265
-c77 35 109 68 109 132c0 56 -73 106 -154 106c-45 0 -86 -14 -108 -29c-24 -17 -48 -41 -107 -115c-8 -10 -20 -16 -31 -16c-9 0 -17 3 -25 8l-164 125c-17 13 -21 35 -10 53c108 179 260 266 464 266c214 0 454 -171 454 -400z" />
-    <glyph glyph-name="low-vision" unicode="&#xf2a8;" horiz-adv-x="1792" 
-d="M335 180c-2 0 -4 1 -6 2c-117 78 -234 206 -308 325c-14 20 -21 44 -21 69c0 52 36 94 65 133c116 158 271 288 452 365c-15 27 -110 193 -110 211c0 12 7 23 17 29c20 11 110 64 128 64c11 0 22 -6 28 -16l124 -229c63 13 128 19 192 19c362 0 684 -205 876 -507
-c13 -20 20 -44 20 -69s-7 -49 -20 -69c-119 -187 -293 -342 -497 -429c15 -27 110 -193 110 -211c0 -12 -6 -23 -17 -29c-20 -11 -110 -64 -127 -64c-12 0 -23 6 -29 16l-124 229l-64 119l-444 820l7 7c-34 -14 -67 -29 -99 -47c12 -23 489 -899 489 -906c0 -5 -4 -8 -9 -9
-c-22 -5 -50 -3 -72 -3c-11 0 -56 -2 -60 7l-456 841c-29 -21 -56 -44 -82 -68c22 -39 404 -742 404 -748c0 -8 -5 -10 -11 -10c-17 0 -150 41 -155 50l-106 197l-224 413c-28 -34 -54 -69 -78 -106c13 -19 30 -39 41 -59c14 -26 176 -321 176 -327c0 -5 -5 -10 -10 -10z
-M1165 282l49 -91c187 76 341 216 450 385c-111 171 -269 313 -459 389c89 -85 139 -202 139 -325c0 -141 -66 -274 -179 -358zM848 896c0 -26 22 -48 48 -48c55 0 108 -22 147 -61s61 -92 61 -147c0 -26 22 -48 48 -48s48 22 48 48c0 168 -136 304 -304 304
-c-26 0 -48 -22 -48 -48zM1214 961l-9 4l7 -7z" />
-    <glyph glyph-name="camera" unicode="&#xf030;" horiz-adv-x="1920" 
-d="M960 864c159 0 288 -129 288 -288s-129 -288 -288 -288s-288 129 -288 288s129 288 288 288zM1664 1280c141 0 256 -115 256 -256v-896c0 -141 -115 -256 -256 -256h-1408c-141 0 -256 115 -256 256v896c0 141 115 256 256 256h224l51 136c25 66 103 120 173 120h512
-c70 0 148 -54 173 -120l51 -136h224zM960 128c247 0 448 201 448 448s-201 448 -448 448s-448 -201 -448 -448s201 -448 448 -448z" />
-    <glyph glyph-name="wordpress" unicode="&#xf19a;" horiz-adv-x="1792" 
-d="M127 640c0 111 24 217 67 313l367 -1005c-257 125 -434 388 -434 692zM1415 679c0 -66 -27 -142 -59 -249l-76 -256l-278 826s46 3 88 8c41 5 36 66 -5 63c-125 -9 -205 -10 -205 -10s-75 1 -202 10c-42 3 -47 -60 -5 -63c39 -4 80 -8 80 -8l120 -328l-168 -504l-280 832
-s46 3 88 8c41 5 36 66 -5 63c-124 -9 -205 -10 -205 -10c-14 0 -31 1 -49 1c137 209 373 347 642 347c200 0 382 -77 519 -202h-10c-75 0 -129 -65 -129 -136c0 -63 37 -116 76 -180c30 -51 63 -117 63 -212zM909 573l237 -647c1 -4 3 -8 5 -11c-80 -28 -165 -44 -255 -44
-c-75 0 -148 11 -217 32zM1570 1009c60 -110 95 -235 95 -369c0 -284 -154 -531 -383 -664l235 678c39 112 59 198 59 276c0 28 -2 54 -6 79zM896 1536c494 0 896 -402 896 -896s-402 -896 -896 -896s-896 402 -896 896s402 896 896 896zM896 -215c471 0 855 384 855 855
-s-384 855 -855 855s-855 -384 -855 -855s384 -855 855 -855z" />
-    <glyph glyph-name="italic" unicode="&#xf033;" horiz-adv-x="1024" 
-d="M0 -126l17 85c64 20 133 28 193 59c23 29 34 66 41 101c13 68 231 1049 228 1129v25c-55 30 -122 22 -182 32l19 103c129 -6 260 -16 390 -16c106 0 212 10 318 16c-4 -30 -11 -60 -19 -89c-69 -24 -142 -35 -210 -62c-22 -54 -27 -113 -37 -170
-c-48 -259 -112 -518 -165 -775c-10 -48 -59 -247 -55 -289l1 -18c61 -14 123 -21 185 -31c-2 -33 -8 -66 -16 -99c-22 0 -43 -3 -65 -3c-57 0 -116 19 -173 20c-69 1 -138 2 -206 2c-89 0 -176 -15 -264 -20z" />
-    <glyph glyph-name="forward" unicode="&#xf04e;" horiz-adv-x="1542" 
-d="M45 -115c-25 -25 -45 -16 -45 19v1472c0 35 20 44 45 19l710 -710c6 -6 10 -12 13 -19v710c0 35 20 44 45 19l710 -710c25 -25 25 -65 0 -90l-710 -710c-25 -25 -45 -16 -45 19v710c-3 -7 -7 -13 -13 -19z" />
-    <glyph glyph-name="steam-square" unicode="&#xf1b7;" 
-d="M1242 889c0 106 -87 193 -194 193c-106 0 -193 -87 -193 -193c0 -107 87 -193 193 -193c107 0 194 86 194 193zM632 301c0 -110 -88 -198 -198 -198c-76 0 -142 43 -175 106c33 -13 65 -26 98 -40c80 -32 172 7 205 88c32 80 -7 172 -88 204l-82 33c13 3 28 5 42 5
-c110 0 198 -88 198 -198zM1536 1120v-960c0 -159 -129 -288 -288 -288h-960c-159 0 -288 129 -288 288v153l172 -69c26 -121 134 -212 262 -212c140 0 255 107 268 243l345 252c200 0 361 162 361 360c0 200 -161 361 -361 361c-197 0 -358 -160 -360 -357l-225 -322
-c-9 1 -18 1 -28 1c-50 0 -97 -13 -137 -37l-297 119v468c0 159 129 288 288 288h960c159 0 288 -129 288 -288zM1289 887c0 -133 -108 -241 -242 -241c-133 0 -241 108 -241 241c0 134 108 242 241 242c134 0 242 -108 242 -242z" />
-    <glyph glyph-name="medium-square" unicode="&#xf2f8;" 
-d="M0 1404h1536v-1536h-1536v1536zM257 1057v-17l97 -116c7 -7 13 -20 13 -30v-4v-456v-9c0 -12 -6 -28 -14 -36l-109 -132v-17h308v17l-109 132c-9 9 -15 26 -15 38v7v395l270 -589h31l232 589v-469c0 -13 0 -16 -8 -24l-84 -80v-18h405v18l-80 79c-5 4 -10 12 -10 19
-c0 1 1 3 1 4v580c0 1 -1 3 -1 4c0 7 5 15 10 19l82 79v17h-285l-203 -507l-232 507h-299z" />
-    <glyph glyph-name="sort-numeric-desc" unicode="&#xf163;" horiz-adv-x="1454" 
-d="M1314 1247c0 82 -67 169 -147 169c-70 0 -114 -57 -114 -131c0 -72 46 -133 141 -133c65 0 120 39 120 95zM704 96c0 -9 -4 -17 -10 -24l-319 -319c-7 -6 -15 -9 -23 -9s-16 3 -23 9l-320 320c-9 10 -12 23 -7 35s17 20 30 20h192v1376c0 18 14 32 32 32h192
-c18 0 32 -14 32 -32v-1376h192c18 0 32 -14 32 -32zM1424 -142v-114h-469v114h167v432c0 13 1 26 1 36v16h-2l-7 -12c-5 -8 -13 -18 -26 -31l-62 -58l-82 86l192 185h123v-654h165zM1454 1189c0 -202 -110 -421 -348 -421c-45 0 -82 7 -108 16c-16 5 -30 10 -42 15l39 113
-c9 -4 20 -8 31 -11c20 -7 46 -13 75 -13c120 0 182 100 201 204h-2c-28 -30 -87 -51 -146 -51c-145 0 -240 114 -240 244c0 138 106 251 253 251c159 0 287 -130 287 -347z" />
-    <glyph glyph-name="video-camera" unicode="&#xf03d;" horiz-adv-x="1792" 
-d="M1792 1184v-1088c0 -26 -16 -49 -39 -59c-8 -3 -17 -5 -25 -5c-17 0 -33 6 -45 19l-403 403v-166c0 -159 -129 -288 -288 -288h-704c-159 0 -288 129 -288 288v704c0 159 129 288 288 288h704c159 0 288 -129 288 -288v-165l403 402c12 13 28 19 45 19c8 0 17 -2 25 -5
-c23 -10 39 -33 39 -59z" />
-    <glyph glyph-name="thumbs-down" unicode="&#xf165;" horiz-adv-x="1600" 
-d="M256 960c0 36 -29 64 -64 64c-36 0 -64 -28 -64 -64c0 -35 28 -64 64 -64c35 0 64 29 64 64zM416 448c0 -35 -29 -64 -64 -64h-288c-35 0 -64 29 -64 64v640c0 35 29 64 64 64h288c35 0 64 -29 64 -64v-640zM1545 597c34 -38 55 -96 55 -149c-1 -104 -88 -192 -192 -192
-h-277c8 -32 18 -42 29 -64c26 -52 56 -110 56 -192c0 -77 0 -256 -224 -256c-17 0 -33 7 -45 19c-43 42 -55 104 -66 163c-12 58 -23 118 -62 157c-31 31 -65 74 -101 120c-44 58 -140 177 -177 180c-33 3 -61 31 -61 64v641c0 35 30 63 64 64c35 1 95 22 158 44
-c108 37 243 84 386 84h129c88 -1 154 -27 197 -78c38 -45 55 -106 49 -181c25 -24 44 -57 54 -94c11 -40 11 -80 0 -117c30 -40 45 -87 43 -137c0 -14 -4 -44 -15 -76z" />
-    <glyph glyph-name="medium" unicode="&#xf23a;" 
-d="M182 999v6c0 15 -8 34 -19 44l-144 173v26h446l344 -755l302 755h425v-26l-123 -117c-8 -6 -14 -19 -14 -29c0 -2 1 -4 1 -6v-864c0 -2 -1 -4 -1 -6c0 -10 6 -23 14 -29l120 -117v-26h-602v26l124 120c12 12 12 16 12 35v698l-345 -876h-47l-401 876v-587
-c0 -3 -1 -8 -1 -11c0 -18 10 -44 23 -57l162 -195v-26h-458v26l161 195c12 13 22 38 22 55c0 4 0 9 -1 13v679z" />
-    <glyph glyph-name="chevron-right" unicode="&#xf054;" horiz-adv-x="1036" 
-d="M1017 659l-742 -742c-25 -25 -65 -25 -90 0l-166 166c-25 25 -25 65 0 90l531 531l-531 531c-25 25 -25 65 0 90l166 166c25 25 65 25 90 0l742 -742c25 -25 25 -65 0 -90z" />
-    <glyph glyph-name="bus" unicode="&#xf207;" 
-d="M384 320c0 71 -57 128 -128 128s-128 -57 -128 -128s57 -128 128 -128s128 57 128 128zM1408 320c0 71 -57 128 -128 128s-128 -57 -128 -128s57 -128 128 -128s128 57 128 128zM1362 716l-72 384c-6 30 -32 52 -63 52h-918c-31 0 -57 -22 -63 -52l-72 -384
-c-7 -40 23 -76 63 -76h1062c40 0 70 36 63 76zM1136 1328c0 27 -21 48 -48 48h-640c-26 0 -48 -21 -48 -48s22 -48 48 -48h640c27 0 48 21 48 48zM1536 603v-603h-128v-128c0 -71 -57 -128 -128 -128s-128 57 -128 128v128h-768v-128c0 -71 -57 -128 -128 -128
-s-128 57 -128 128v128h-128v603c0 82 7 143 25 223l103 454c19 160 299 256 640 256s621 -96 640 -256l105 -454c18 -80 23 -141 23 -223z" />
-    <glyph glyph-name="registered" unicode="&#xf25d;" horiz-adv-x="1792" 
-d="M1042 833c0 58 -20 99 -60 121c-20 11 -48 18 -117 18h-123v-281h162c88 0 138 52 138 142zM1094 548l205 -373c5 -10 5 -22 -1 -31c-5 -10 -16 -16 -27 -16h-152c-12 0 -23 6 -28 17l-194 365h-155v-350c0 -18 -14 -32 -32 -32h-134c-18 0 -32 14 -32 32v960
-c0 18 14 32 32 32h294c105 0 151 -9 190 -24c113 -42 183 -153 183 -289c0 -123 -61 -227 -158 -275c3 -5 6 -10 9 -16zM896 1376c-406 0 -736 -330 -736 -736s330 -736 736 -736s736 330 736 736s-330 736 -736 736zM1792 640c0 -495 -401 -896 -896 -896
-s-896 401 -896 896s401 896 896 896s896 -401 896 -896z" />
-    <glyph glyph-name="mars" unicode="&#xf222;" 
-d="M1472 1408c35 0 64 -29 64 -64v-416c0 -18 -14 -32 -32 -32h-64c-18 0 -32 14 -32 32v262l-382 -383c79 -98 126 -223 126 -359c0 -318 -258 -576 -576 -576s-576 258 -576 576s258 576 576 576c136 0 261 -47 359 -126l382 382h-261c-18 0 -32 14 -32 32v64
-c0 18 14 32 32 32h416zM576 0c247 0 448 201 448 448s-201 448 -448 448s-448 -201 -448 -448s201 -448 448 -448z" />
-    <glyph glyph-name="hand-rock-o" unicode="&#xf255;" 
-d="M768 1152c-71 0 -128 -57 -128 -128v-128h-32v93c0 63 -48 115 -112 115c-62 0 -112 -50 -112 -112v-429l-32 30v172c0 63 -48 115 -112 115c-62 0 -112 -50 -112 -112v-224c0 -31 13 -60 35 -82l310 -296c29 -29 39 -62 39 -102c0 -35 29 -64 64 -64h640
-c35 0 64 29 64 64v25c0 26 3 52 10 77l108 436c7 25 10 51 10 77v246c0 63 -48 115 -112 115c-62 0 -112 -50 -112 -112v-32h-32v125c0 53 -36 102 -89 113c-7 1 -15 2 -23 2c-62 0 -112 -50 -112 -112v-128h-32v122c0 67 -48 126 -115 133c-5 1 -9 1 -13 1zM768 1280
-c54 0 106 -17 149 -50c37 22 80 34 123 34c79 0 152 -38 197 -103c19 5 39 7 59 7c134 0 240 -110 240 -243v-246c0 -36 -5 -73 -13 -108l-109 -436c-6 -24 -6 -47 -6 -71c0 -106 -86 -192 -192 -192h-640c-114 0 -192 91 -192 201l-308 296c-47 45 -76 109 -76 175v224
-c0 132 108 240 240 240c6 0 11 0 16 -1c8 127 114 225 240 225c34 0 67 -7 98 -21c47 45 109 69 174 69z" />
-    <glyph glyph-name="window-close" unicode="&#xf2d3;" horiz-adv-x="1792" 
-d="M1175 215l146 146c13 13 13 33 0 46l-233 233l233 233c13 13 13 33 0 46l-146 146c-13 13 -33 13 -46 0l-233 -233l-233 233c-13 13 -33 13 -46 0l-146 -146c-13 -13 -13 -33 0 -46l233 -233l-233 -233c-13 -13 -13 -33 0 -46l146 -146c13 -13 33 -13 46 0l233 233
-l233 -233c13 -13 33 -13 46 0zM1792 1248v-1216c0 -88 -72 -160 -160 -160h-1472c-88 0 -160 72 -160 160v1216c0 88 72 160 160 160h1472c88 0 160 -72 160 -160z" />
-    <glyph glyph-name="link" unicode="&#xf0c1;" horiz-adv-x="1632" 
-d="M1440 320c0 26 -10 50 -28 68l-208 208c-18 18 -43 28 -68 28c-29 0 -52 -11 -72 -32c33 -33 72 -61 72 -112c0 -53 -43 -96 -96 -96c-51 0 -79 39 -112 72c-21 -20 -33 -43 -33 -73c0 -25 10 -50 28 -68l206 -207c18 -18 43 -27 68 -27s50 9 68 26l147 146
-c18 18 28 42 28 67zM737 1025c0 25 -10 50 -28 68l-206 207c-18 18 -43 28 -68 28s-50 -10 -68 -27l-147 -146c-18 -18 -28 -42 -28 -67c0 -26 10 -50 28 -68l208 -208c18 -18 43 -27 68 -27c29 0 52 10 72 31c-33 33 -72 61 -72 112c0 53 43 96 96 96c51 0 79 -39 112 -72
-c21 20 33 43 33 73zM1632 320c0 -76 -31 -150 -85 -203l-147 -146c-54 -54 -127 -83 -203 -83c-77 0 -150 30 -204 85l-206 207c-54 54 -83 127 -83 203c0 79 32 154 88 209l-88 88c-55 -56 -129 -88 -208 -88c-76 0 -150 30 -204 84l-208 208c-55 55 -84 127 -84 204
-c0 76 31 150 85 203l147 146c54 54 127 83 203 83c77 0 150 -30 204 -85l206 -207c54 -54 83 -127 83 -203c0 -79 -32 -154 -88 -209l88 -88c55 56 129 88 208 88c76 0 150 -30 204 -84l208 -208c55 -55 84 -127 84 -204z" />
-    <glyph glyph-name="window-minimize" unicode="&#xf2d1;" horiz-adv-x="1792" 
-d="M1792 224v-192c0 -88 -72 -160 -160 -160h-1472c-88 0 -160 72 -160 160v192c0 88 72 160 160 160h1472c88 0 160 -72 160 -160z" />
-    <glyph glyph-name="eyedropper" unicode="&#xf1fb;" horiz-adv-x="1792" 
-d="M1698 1442c125 -125 126 -328 0 -452l-225 -223l104 -104c13 -13 13 -33 0 -46l-210 -210c-13 -13 -33 -13 -46 0l-105 105l-603 -603c-24 -24 -56 -37 -90 -37h-203l-256 -128l-64 64l128 256v203c0 34 13 66 37 90l603 603l-105 105c-13 13 -13 33 0 46l210 210
-c13 13 33 13 46 0l104 -104l223 225c124 126 327 125 452 0zM512 64l576 576l-192 192l-576 -576v-192h192z" />
-    <glyph glyph-name="bug" unicode="&#xf188;" horiz-adv-x="1600" 
-d="M1600 576c0 -35 -29 -64 -64 -64h-224c0 -125 -27 -219 -67 -290l208 -209c25 -25 25 -65 0 -90c-12 -13 -29 -19 -45 -19s-33 6 -45 19l-198 197s-131 -120 -301 -120v896h-128v-896c-181 0 -313 132 -313 132l-183 -207c-13 -14 -30 -21 -48 -21c-15 0 -30 5 -43 16
-c-26 24 -28 64 -5 91l202 227c-35 69 -58 158 -58 274h-224c-35 0 -64 29 -64 64s29 64 64 64h224v294l-173 173c-25 25 -25 65 0 90s65 25 90 0l173 -173h844l173 173c25 25 65 25 90 0s25 -65 0 -90l-173 -173v-294h224c35 0 64 -29 64 -64zM1120 1152h-640
-c0 177 143 320 320 320s320 -143 320 -320z" />
-    <glyph glyph-name="angellist" unicode="&#xf209;" horiz-adv-x="1258" 
-d="M942 1158l-114 -328l117 -21c30 82 165 451 165 518c0 25 -8 56 -38 56c-56 0 -116 -182 -130 -225zM643 471c11 -29 23 -58 33 -88c22 25 45 48 71 67c-35 7 -70 10 -104 21zM351 1367c0 -102 121 -420 159 -521c14 8 32 10 49 10c24 0 51 -3 75 -5l-121 351
-c-13 38 -71 220 -123 220c-27 0 -39 -32 -39 -55zM272 608c0 -73 196 -342 269 -342c20 0 37 22 37 40c0 23 -23 80 -32 102c-26 67 -121 274 -203 274c-27 0 -71 -47 -71 -74zM114 273c0 -36 12 -71 25 -104c79 -195 257 -309 465 -309c152 0 280 58 382 170
-c108 120 152 268 152 427c0 56 1 145 -43 185c-84 74 -369 102 -482 102c-14 0 -38 -1 -49 -11c-12 -5 -12 -24 -12 -35c0 -153 323 -139 420 -139c19 0 28 -5 40 -19c13 -16 17 -35 19 -55c-26 -26 -62 -41 -96 -54c-33 -12 -65 -25 -93 -46c-77 -56 -153 -152 -153 -251
-c0 -62 37 -115 37 -176c0 -1 -7 -23 -7 -26c-114 8 -142 121 -146 216c-12 -3 -28 -2 -41 -2c2 -7 2 -14 2 -21c0 -73 -65 -126 -135 -126c-108 0 -251 127 -251 237c0 30 13 47 33 67c20 -25 41 -50 60 -76c29 -39 79 -104 133 -104c14 0 41 12 41 29
-c0 45 -164 256 -204 256c-63 0 -97 -83 -97 -135zM0 264c0 130 50 216 179 251c-11 29 -28 73 -28 104c0 82 101 184 183 184c24 0 48 -7 70 -15c-42 119 -163 454 -163 567c0 101 51 181 160 181c140 0 299 -504 333 -604c44 110 182 571 338 571c98 0 153 -78 153 -171
-c0 -106 -118 -436 -159 -550c168 -41 192 -177 192 -328c0 -400 -255 -710 -668 -710c-76 0 -151 15 -223 42c-190 72 -367 267 -367 478z" />
-    <glyph glyph-name="chain-broken" unicode="&#xf127;" horiz-adv-x="1664" 
-d="M439 265l-256 -256c-7 -6 -15 -9 -23 -9s-16 3 -23 9c-12 13 -12 33 0 46l256 256c13 12 33 12 46 0c12 -13 12 -33 0 -46zM608 224v-320c0 -18 -14 -32 -32 -32s-32 14 -32 32v320c0 18 14 32 32 32s32 -14 32 -32zM384 448c0 -18 -14 -32 -32 -32h-320
-c-18 0 -32 14 -32 32s14 32 32 32h320c18 0 32 -14 32 -32zM1648 320c0 -77 -30 -149 -85 -203l-147 -146c-54 -54 -126 -83 -203 -83s-150 30 -204 85l-334 335c-17 17 -30 36 -42 56l239 18l273 -274c36 -36 100 -37 136 -1l147 146c18 18 28 42 28 67c0 26 -10 50 -28 68
-l-274 275l18 239c20 -12 39 -25 56 -42l336 -336c54 -55 84 -127 84 -204zM1031 1044l-239 -18l-273 274c-18 18 -42 28 -68 28s-50 -10 -68 -27l-147 -146c-18 -18 -28 -42 -28 -67c0 -26 10 -50 28 -68l274 -274l-18 -240c-20 12 -39 25 -56 42l-336 336
-c-54 55 -84 127 -84 204s30 149 85 203l147 146c54 54 126 83 203 83s150 -30 204 -85l334 -335c17 -17 30 -36 42 -56zM1664 960c0 -18 -14 -32 -32 -32h-320c-18 0 -32 14 -32 32s14 32 32 32h320c18 0 32 -14 32 -32zM1120 1504v-320c0 -18 -14 -32 -32 -32
-s-32 14 -32 32v320c0 18 14 32 32 32s32 -14 32 -32zM1527 1353l-256 -256c-7 -6 -15 -9 -23 -9s-16 3 -23 9c-12 13 -12 33 0 46l256 256c13 12 33 12 46 0c12 -13 12 -33 0 -46z" />
-    <glyph glyph-name="info" unicode="&#xf129;" horiz-adv-x="640" 
-d="M640 192v-128c0 -35 -29 -64 -64 -64h-512c-35 0 -64 29 -64 64v128c0 35 29 64 64 64h64v384h-64c-35 0 -64 29 -64 64v128c0 35 29 64 64 64h384c35 0 64 -29 64 -64v-576h64c35 0 64 -29 64 -64zM512 1344v-192c0 -35 -29 -64 -64 -64h-256c-35 0 -64 29 -64 64v192
-c0 35 29 64 64 64h256c35 0 64 -29 64 -64z" />
-    <glyph glyph-name="tumblr" unicode="&#xf173;" horiz-adv-x="956" 
-d="M876 207l80 -237c-30 -45 -166 -96 -288 -98c-363 -6 -500 258 -500 444v544h-168v215c252 91 313 319 327 449c1 8 8 12 12 12h244v-424h333v-252h-334v-518c0 -70 26 -167 160 -164c44 1 103 14 134 29z" />
-    <glyph glyph-name="line-chart" unicode="&#xf201;" horiz-adv-x="2048" 
-d="M2048 0v-128h-2048v1536h128v-1408h1920zM1920 1248v-435c0 -28 -34 -43 -55 -22l-121 121l-633 -633c-13 -13 -33 -13 -46 0l-233 233l-416 -416l-192 192l585 585c13 13 33 13 46 0l233 -233l464 464l-121 121c-21 21 -6 55 22 55h435c18 0 32 -14 32 -32z" />
-    <glyph glyph-name="long-arrow-up" unicode="&#xf176;" horiz-adv-x="767" 
-d="M765 1043c-5 -11 -16 -19 -29 -19h-224v-1248c0 -18 -14 -32 -32 -32h-192c-18 0 -32 14 -32 32v1248h-224c-13 0 -24 7 -29 19s-3 25 5 35l350 384c6 6 14 10 23 10s18 -4 24 -10l355 -384c8 -10 10 -23 5 -35z" />
-    <glyph glyph-name="simplybuilt" unicode="&#xf215;" horiz-adv-x="2048" 
-d="M863 504c0 150 -121 271 -271 271c-149 0 -270 -121 -270 -271c0 -149 121 -270 270 -270c150 0 271 121 271 270zM1726 505c0 149 -121 270 -270 270c-150 0 -271 -121 -271 -270c0 -150 121 -271 271 -271c149 0 270 121 270 271zM2048 1314v-1348
-c0 -59 -48 -107 -108 -107h-1832c-60 0 -108 48 -108 107v1348c0 59 48 107 108 107h431c59 0 108 -48 108 -107v-161h754v161c0 59 49 107 108 107h431c60 0 108 -48 108 -107z" />
-    <glyph glyph-name="trash" unicode="&#xf1f8;" horiz-adv-x="1408" 
-d="M512 160v704c0 18 -14 32 -32 32h-64c-18 0 -32 -14 -32 -32v-704c0 -18 14 -32 32 -32h64c18 0 32 14 32 32zM768 160v704c0 18 -14 32 -32 32h-64c-18 0 -32 -14 -32 -32v-704c0 -18 14 -32 32 -32h64c18 0 32 14 32 32zM1024 160v704c0 18 -14 32 -32 32h-64
-c-18 0 -32 -14 -32 -32v-704c0 -18 14 -32 32 -32h64c18 0 32 14 32 32zM480 1152h448l-48 117c-3 4 -12 10 -17 11h-317c-6 -1 -14 -7 -17 -11zM1408 1120v-64c0 -18 -14 -32 -32 -32h-96v-948c0 -110 -72 -204 -160 -204h-832c-88 0 -160 90 -160 200v952h-96
-c-18 0 -32 14 -32 32v64c0 18 14 32 32 32h309l70 167c20 49 80 89 133 89h320c53 0 113 -40 133 -89l70 -167h309c18 0 32 -14 32 -32z" />
-    <glyph glyph-name="free-code-camp" unicode="&#xf2c5;" horiz-adv-x="2304" 
-d="M453 -101c0 -28 -25 -54 -53 -54c-4 0 -9 2 -13 3c-56 13 -128 97 -162 140c-156 197 -225 427 -225 676c0 232 70 431 213 614c33 43 131 156 189 156c25 0 51 -20 51 -46c0 -30 -44 -71 -63 -90c-55 -57 -106 -115 -147 -184c-85 -142 -119 -284 -119 -449
-c0 -177 33 -337 123 -491c38 -65 83 -119 136 -173c21 -23 70 -68 70 -102zM1796 33c0 -37 -25 -68 -64 -68h-1081c-35 0 -64 29 -64 64c0 37 25 68 64 68h1081c35 0 64 -29 64 -64zM1581 644c0 -84 -19 -162 -67 -233c-33 -49 -100 -112 -153 -139c-8 -5 -18 -10 -27 -10
-c-8 0 -23 9 -23 18c0 29 122 98 122 232c0 44 -11 93 -35 130c-7 10 -32 42 -46 42c-3 0 -3 -2 -3 -5c0 -24 15 -47 15 -72c0 -32 -39 -48 -66 -48c-47 0 -66 33 -66 76c0 29 3 59 3 88c0 21 -1 27 -10 46c-14 27 -60 82 -93 82c-9 0 -12 0 -12 -9c0 -14 32 -29 32 -80
-c0 -133 -183 -157 -183 -290c0 -60 8 -110 42 -160c21 -31 44 -49 79 -63c9 -3 18 -4 18 -15s-9 -16 -18 -16c-5 0 -28 9 -33 11c-154 56 -271 190 -271 358c0 199 239 373 239 564c0 37 -6 63 -25 94c-11 18 -38 53 -56 64c-8 4 -19 11 -19 21c0 17 29 20 41 20
-c36 0 77 -13 110 -29c139 -66 168 -167 192 -307c6 -33 18 -138 66 -138c31 0 51 21 51 51c0 45 -40 94 -40 119c0 7 4 10 10 10c25 0 77 -53 93 -70c97 -103 133 -203 133 -342zM2304 615c0 -176 -47 -352 -138 -503c-42 -70 -180 -266 -271 -266c-21 0 -46 26 -46 47
-c0 34 117 143 146 180c124 156 183 332 183 531c0 164 -20 297 -93 446c-45 92 -92 154 -163 228c-23 24 -73 69 -73 105c0 25 26 52 51 52c66 0 161 -122 196 -169c134 -180 191 -365 206 -587c1 -21 2 -43 2 -64z" />
-    <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="calendar-o" unicode="&#xf133;" horiz-adv-x="1664" 
-d="M128 -128h1408v1024h-1408v-1024zM512 1088v288c0 18 -14 32 -32 32h-64c-18 0 -32 -14 -32 -32v-288c0 -18 14 -32 32 -32h64c18 0 32 14 32 32zM1280 1088v288c0 18 -14 32 -32 32h-64c-18 0 -32 -14 -32 -32v-288c0 -18 14 -32 32 -32h64c18 0 32 14 32 32zM1664 1152
-v-1280c0 -70 -58 -128 -128 -128h-1408c-70 0 -128 58 -128 128v1280c0 70 58 128 128 128h128v96c0 88 72 160 160 160h64c88 0 160 -72 160 -160v-96h384v96c0 88 72 160 160 160h64c88 0 160 -72 160 -160v-96h128c70 0 128 -58 128 -128z" />
-    <glyph glyph-name="suitcase" unicode="&#xf0f2;" horiz-adv-x="1792" 
-d="M640 1152h512v128h-512v-128zM288 1152v-1280h-64c-123 0 -224 101 -224 224v832c0 123 101 224 224 224h64zM1408 1152v-1280h-1024v1280h128v160c0 53 43 96 96 96h576c53 0 96 -43 96 -96v-160h128zM1792 928v-832c0 -123 -101 -224 -224 -224h-64v1280h64
-c123 0 224 -101 224 -224z" />
-    <glyph glyph-name="arrow-circle-o-up" unicode="&#xf01b;" 
-d="M1118 660c-5 -12 -17 -20 -30 -20h-192v-352c0 -18 -14 -32 -32 -32h-192c-18 0 -32 14 -32 32v352h-192c-18 0 -32 14 -32 32c0 9 4 17 10 24l319 319c7 6 15 9 23 9s16 -3 23 -9l320 -320c9 -10 12 -23 7 -35zM768 1184c-300 0 -544 -244 -544 -544s244 -544 544 -544
-s544 244 544 544s-244 544 -544 544zM1536 640c0 -424 -344 -768 -768 -768s-768 344 -768 768s344 768 768 768s768 -344 768 -768z" />
-    <glyph glyph-name="arrow-up" unicode="&#xf062;" horiz-adv-x="1558" 
-d="M1558 565c0 -34 -14 -66 -37 -90l-75 -75c-24 -24 -57 -38 -91 -38s-67 14 -90 38l-294 293v-704c0 -72 -60 -117 -128 -117h-128c-68 0 -128 45 -128 117v704l-294 -293c-23 -24 -56 -38 -90 -38s-67 14 -90 38l-75 75c-24 24 -38 56 -38 90s14 67 38 91l651 651
-c23 24 56 37 90 37s67 -13 91 -37l651 -651c23 -24 37 -57 37 -91z" />
-    <glyph glyph-name="venus-mars" unicode="&#xf228;" horiz-adv-x="2048" 
-d="M1664 1504c0 18 14 32 32 32h288c35 0 64 -29 64 -64v-288c0 -18 -14 -32 -32 -32h-64c-18 0 -32 14 -32 32v134l-254 -255c98 -123 147 -286 117 -461c-42 -240 -237 -431 -478 -467c-152 -23 -295 14 -409 90c-75 -50 -162 -83 -256 -93v-132h96c18 0 32 -14 32 -32
-v-64c0 -18 -14 -32 -32 -32h-96v-96c0 -18 -14 -32 -32 -32h-64c-18 0 -32 14 -32 32v96h-96c-18 0 -32 14 -32 32v64c0 18 14 32 32 32h96v132c-314 35 -553 323 -506 654c34 249 232 449 480 487c153 23 296 -14 410 -90c92 61 202 97 320 97c136 0 261 -48 359 -126
-l255 254h-134c-18 0 -32 14 -32 32v64zM896 391c79 81 128 191 128 313s-49 232 -128 313c-79 -81 -128 -191 -128 -313s49 -232 128 -313zM128 704c0 -247 201 -448 448 -448c79 0 154 21 218 57c-95 103 -154 240 -154 391s59 288 154 391c-64 36 -139 57 -218 57
-c-247 0 -448 -201 -448 -448zM1216 256c247 0 448 201 448 448s-201 448 -448 448c-79 0 -154 -21 -218 -57c95 -103 154 -240 154 -391s-59 -288 -154 -391c64 -36 139 -57 218 -57z" />
-    <glyph glyph-name="pause-circle" unicode="&#xf28b;" 
-d="M704 352v576c0 18 -14 32 -32 32h-256c-18 0 -32 -14 -32 -32v-576c0 -18 14 -32 32 -32h256c18 0 32 14 32 32zM1152 352v576c0 18 -14 32 -32 32h-256c-18 0 -32 -14 -32 -32v-576c0 -18 14 -32 32 -32h256c18 0 32 14 32 32zM1536 640c0 -424 -344 -768 -768 -768
-s-768 344 -768 768s344 768 768 768s768 -344 768 -768z" />
-    <glyph glyph-name="shopping-cart" unicode="&#xf07a;" horiz-adv-x="1664" 
-d="M640 0c0 -70 -58 -128 -128 -128s-128 58 -128 128s58 128 128 128s128 -58 128 -128zM1536 0c0 -70 -58 -128 -128 -128s-128 58 -128 128s58 128 128 128s128 -58 128 -128zM1664 1088v-512c0 -32 -25 -60 -57 -64l-1044 -122c5 -23 13 -46 13 -70
-c0 -23 -14 -44 -24 -64h920c35 0 64 -29 64 -64s-29 -64 -64 -64h-1024c-35 0 -64 29 -64 64c0 31 45 106 61 137l-177 823h-204c-35 0 -64 29 -64 64s29 64 64 64h256c67 0 69 -80 79 -128h1201c35 0 64 -29 64 -64z" />
-    <glyph glyph-name="files-o" unicode="&#xf0c5;" horiz-adv-x="1792" 
-d="M1696 1152c53 0 96 -43 96 -96v-1216c0 -53 -43 -96 -96 -96h-960c-53 0 -96 43 -96 96v288h-544c-53 0 -96 43 -96 96v672c0 53 31 127 68 164l408 408c37 37 111 68 164 68h416c53 0 96 -43 96 -96v-328c39 23 89 40 128 40h416zM1152 939l-299 -299h299v299zM512 1323
-l-299 -299h299v299zM708 676l316 316v416h-384v-416c0 -53 -43 -96 -96 -96h-416v-640h512v256c0 53 31 127 68 164zM1664 -128v1152h-384v-416c0 -53 -43 -96 -96 -96h-416v-640h896z" />
-    <glyph glyph-name="mastodon-square" unicode="&#xf300;" 
-d="M288 1408h960c159 0 288 -129 288 -288v-960c0 -159 -129 -288 -288 -288h-960c-159 0 -288 129 -288 288v960c0 159 129 288 288 288zM766 1189v0c-140 -1 -275 -17 -354 -53c0 0 -156 -70 -156 -308c0 -55 -1 -119 1 -188c6 -233 43 -463 258 -520
-c99 -26 184 -32 253 -28c124 7 195 45 195 45l-5 90s-88 -28 -188 -25c-99 3 -204 11 -220 133c-1 11 -2 22 -2 34c0 0 97 -24 220 -30c75 -3 146 4 218 13c138 16 257 102 272 179c24 122 22 297 22 297c0 238 -156 308 -156 308c-79 36 -214 52 -354 53h-4zM608 1003v0
-c58 0 103 -23 132 -68l28 -47l28 47c29 45 74 68 132 68c51 0 92 -18 123 -53c31 -34 45 -81 45 -140v-288h-114v280c0 59 -25 88 -75 88c-55 0 -82 -35 -82 -105v-153h-114v153c0 70 -27 105 -82 105c-50 0 -75 -29 -75 -88v-280h-114v288c0 59 15 105 45 140
-c31 35 72 53 123 53z" />
-    <glyph glyph-name="th-large" unicode="&#xf009;" horiz-adv-x="1664" 
-d="M768 512v-384c0 -70 -58 -128 -128 -128h-512c-70 0 -128 58 -128 128v384c0 70 58 128 128 128h512c70 0 128 -58 128 -128zM768 1280v-384c0 -70 -58 -128 -128 -128h-512c-70 0 -128 58 -128 128v384c0 70 58 128 128 128h512c70 0 128 -58 128 -128zM1664 512v-384
-c0 -70 -58 -128 -128 -128h-512c-70 0 -128 58 -128 128v384c0 70 58 128 128 128h512c70 0 128 -58 128 -128zM1664 1280v-384c0 -70 -58 -128 -128 -128h-512c-70 0 -128 58 -128 128v384c0 70 58 128 128 128h512c70 0 128 -58 128 -128z" />
-    <glyph glyph-name="at" unicode="&#xf1fa;" 
-d="M972 761c0 144 -75 230 -201 230c-166 0 -344 -165 -344 -432c0 -149 74 -234 204 -234c201 0 341 230 341 436zM1536 640c0 -311 -222 -428 -412 -434c-13 0 -18 -1 -32 -1c-62 0 -111 18 -142 53c-19 22 -30 50 -33 83c-62 -78 -170 -154 -305 -154
-c-215 0 -338 133 -338 365c0 319 221 578 491 578c117 0 211 -50 261 -135l2 19l11 56c1 8 8 18 15 18h118c5 0 10 -7 13 -11c3 -3 4 -11 3 -16l-120 -614c-4 -19 -5 -34 -5 -48c0 -54 16 -65 57 -65c68 2 288 30 288 306c0 389 -251 640 -640 640
-c-353 0 -640 -287 -640 -640s287 -640 640 -640c147 0 291 51 405 144c14 12 34 10 45 -4l41 -49c5 -7 8 -15 7 -24c-1 -8 -5 -16 -12 -22c-136 -111 -309 -173 -486 -173c-423 0 -768 345 -768 768s345 768 768 768c459 0 768 -309 768 -768z" />
-    <glyph glyph-name="file" unicode="&#xf15b;" 
-d="M1024 1024v472c14 -9 26 -18 36 -28l408 -408c10 -10 19 -22 28 -36h-472zM896 992c0 -53 43 -96 96 -96h544v-1056c0 -53 -43 -96 -96 -96h-1344c-53 0 -96 43 -96 96v1600c0 53 43 96 96 96h800v-544z" />
-    <glyph glyph-name="star-half" unicode="&#xf089;" horiz-adv-x="832" 
-d="M832 1504v-1339l-449 -236c-13 -7 -26 -12 -40 -12c-29 0 -42 24 -42 50c0 7 1 13 2 20l86 500l-364 354c-12 13 -25 30 -25 48c0 30 31 42 56 46l502 73l225 455c9 19 26 41 49 41z" />
-    <glyph glyph-name="futbol-o" unicode="&#xf1e3;" horiz-adv-x="1792" 
-d="M609 720l287 208l287 -208l-109 -336h-355zM896 1536c495 0 896 -401 896 -896s-401 -896 -896 -896s-896 401 -896 896s401 896 896 896zM1515 186c94 128 149 284 149 454v3l-102 -89l-240 224l63 323l134 -12c-95 131 -231 232 -389 282l53 -124l-287 -159l-287 159
-l53 124c-158 -50 -294 -151 -389 -282l135 12l62 -323l-240 -224l-102 89v-3c0 -170 55 -326 149 -454l30 132l326 -40l139 -298l-116 -69c75 -25 156 -39 240 -39s165 14 240 39l-116 69l139 298l326 40z" />
-    <glyph glyph-name="flag-checkered" unicode="&#xf11e;" horiz-adv-x="1728" 
-d="M768 536v192c-122 -11 -269 -60 -384 -117v-185c116 54 260 100 384 110zM768 954v197c-126 -6 -274 -65 -384 -126v-189c118 61 260 113 384 118zM1600 491v184c-91 -45 -250 -112 -384 -71v224c-13 4 -26 9 -39 15c-115 58 -209 112 -360 112c-16 0 -32 -1 -49 -3v-222
-h19c151 0 275 -54 390 -111c13 -6 26 -11 39 -15v-188c27 -11 57 -17 91 -17c111 0 231 59 293 92zM1600 918v189c-80 -43 -192 -91 -306 -91c-27 0 -53 2 -78 8v-196c134 -38 293 39 384 90zM256 1280c0 -47 -26 -88 -64 -110v-1266c0 -18 -14 -32 -32 -32h-64
-c-18 0 -32 14 -32 32v1266c-38 22 -64 63 -64 110c0 71 57 128 128 128s128 -57 128 -128zM1728 1216v-763c0 -24 -14 -46 -35 -57c-4 -2 -10 -5 -17 -9c-64 -34 -215 -116 -369 -116c-59 0 -112 12 -158 35l-28 14c-101 51 -181 91 -304 91c-144 0 -347 -75 -464 -146
-c-10 -6 -22 -9 -33 -9s-22 3 -32 8c-20 12 -32 33 -32 56v742c0 22 12 43 31 55c64 38 290 163 500 163c167 0 303 -61 418 -117c26 -13 56 -19 89 -19c118 0 248 75 310 112c13 7 24 13 31 17c20 10 43 9 62 -2c19 -12 31 -33 31 -55z" />
-    <glyph glyph-name="genderless" unicode="&#xf22d;" horiz-adv-x="1152" 
-d="M1024 576c0 247 -201 448 -448 448s-448 -201 -448 -448s201 -448 448 -448s448 201 448 448zM1152 576c0 -318 -258 -576 -576 -576s-576 258 -576 576s258 576 576 576s576 -258 576 -576z" />
-    <glyph glyph-name="archive" unicode="&#xf187;" horiz-adv-x="1664" 
-d="M1024 704c0 35 -29 64 -64 64h-256c-35 0 -64 -29 -64 -64s29 -64 64 -64h256c35 0 64 29 64 64zM1600 896v-960c0 -35 -29 -64 -64 -64h-1408c-35 0 -64 29 -64 64v960c0 35 29 64 64 64h1408c35 0 64 -29 64 -64zM1664 1344v-256c0 -35 -29 -64 -64 -64h-1536
-c-35 0 -64 29 -64 64v256c0 35 29 64 64 64h1536c35 0 64 -29 64 -64z" />
-    <glyph glyph-name="film" unicode="&#xf008;" horiz-adv-x="1920" 
-d="M384 -64v128c0 35 -29 64 -64 64h-128c-35 0 -64 -29 -64 -64v-128c0 -35 29 -64 64 -64h128c35 0 64 29 64 64zM384 320v128c0 35 -29 64 -64 64h-128c-35 0 -64 -29 -64 -64v-128c0 -35 29 -64 64 -64h128c35 0 64 29 64 64zM384 704v128c0 35 -29 64 -64 64h-128
-c-35 0 -64 -29 -64 -64v-128c0 -35 29 -64 64 -64h128c35 0 64 29 64 64zM1408 -64v512c0 35 -29 64 -64 64h-768c-35 0 -64 -29 -64 -64v-512c0 -35 29 -64 64 -64h768c35 0 64 29 64 64zM384 1088v128c0 35 -29 64 -64 64h-128c-35 0 -64 -29 -64 -64v-128
-c0 -35 29 -64 64 -64h128c35 0 64 29 64 64zM1792 -64v128c0 35 -29 64 -64 64h-128c-35 0 -64 -29 -64 -64v-128c0 -35 29 -64 64 -64h128c35 0 64 29 64 64zM1408 704v512c0 35 -29 64 -64 64h-768c-35 0 -64 -29 -64 -64v-512c0 -35 29 -64 64 -64h768c35 0 64 29 64 64z
-M1792 320v128c0 35 -29 64 -64 64h-128c-35 0 -64 -29 -64 -64v-128c0 -35 29 -64 64 -64h128c35 0 64 29 64 64zM1792 704v128c0 35 -29 64 -64 64h-128c-35 0 -64 -29 -64 -64v-128c0 -35 29 -64 64 -64h128c35 0 64 29 64 64zM1792 1088v128c0 35 -29 64 -64 64h-128
-c-35 0 -64 -29 -64 -64v-128c0 -35 29 -64 64 -64h128c35 0 64 29 64 64zM1920 1248v-1344c0 -88 -72 -160 -160 -160h-1600c-88 0 -160 72 -160 160v1344c0 88 72 160 160 160h1600c88 0 160 -72 160 -160z" />
-    <glyph glyph-name="power-off" unicode="&#xf011;" 
-d="M1536 640c0 -423 -345 -768 -768 -768s-768 345 -768 768c0 243 112 467 307 613c57 43 137 32 179 -25c43 -56 31 -137 -25 -179c-130 -98 -205 -247 -205 -409c0 -282 230 -512 512 -512s512 230 512 512c0 162 -75 311 -205 409c-56 42 -68 123 -25 179
-c42 57 123 68 179 25c195 -146 307 -370 307 -613zM896 1408v-640c0 -70 -58 -128 -128 -128s-128 58 -128 128v640c0 70 58 128 128 128s128 -58 128 -128z" />
-    <glyph glyph-name="percent" unicode="&#xf295;" 
-d="M1280 256c0 70 -58 128 -128 128s-128 -58 -128 -128s58 -128 128 -128s128 58 128 128zM512 1024c0 70 -58 128 -128 128s-128 -58 -128 -128s58 -128 128 -128s128 58 128 128zM1536 256c0 -212 -172 -384 -384 -384s-384 172 -384 384s172 384 384 384
-s384 -172 384 -384zM1440 1344c0 -14 -5 -27 -13 -38l-1056 -1408c-12 -16 -31 -26 -51 -26h-160c-35 0 -64 29 -64 64c0 14 5 27 13 38l1056 1408c12 16 31 26 51 26h160c35 0 64 -29 64 -64zM768 1024c0 -212 -172 -384 -384 -384s-384 172 -384 384s172 384 384 384
-s384 -172 384 -384z" />
-    <glyph glyph-name="google-wallet" unicode="&#xf1ee;" horiz-adv-x="1756" 
-d="M405 864c20 0 40 -10 52 -26c175 -239 297 -495 362 -774h-446c-80 278 -198 532 -367 749c-16 21 0 51 26 51h373zM964 507c-33 -135 -75 -266 -125 -393c-53 209 -138 405 -256 594c26 145 41 294 44 449c141 -227 253 -443 337 -650zM1063 1216
-c299 -412 521 -920 569 -1472h-451c-33 534 -279 1040 -553 1472h435zM1756 640c0 -278 -38 -570 -101 -812c-44 370 -166 738 -359 1083c-17 202 -53 398 -106 584c-5 21 10 41 31 41h359c28 0 54 -19 61 -46c76 -270 115 -556 115 -850z" />
-    <glyph glyph-name="book" unicode="&#xf02d;" horiz-adv-x="1664" 
-d="M1639 1058c25 -36 32 -83 18 -129l-275 -906c-25 -85 -113 -151 -199 -151h-923c-102 0 -211 81 -248 185c-16 45 -16 89 -2 127c2 20 6 40 7 64c1 16 -8 29 -6 41c4 24 25 41 41 68c30 50 64 131 75 183c5 19 -5 41 0 58c5 19 24 33 34 51c27 46 62 135 67 182
-c2 21 -8 44 -2 60c7 23 29 33 44 53c24 33 64 128 70 181c2 17 -8 34 -5 52c4 19 28 39 44 62c42 62 50 199 177 163l-1 -3c17 4 34 9 51 9h761c47 0 89 -21 114 -56c26 -36 32 -83 18 -130l-274 -906c-47 -154 -73 -188 -200 -188h-869c-13 0 -29 -3 -38 -15
-c-8 -12 -9 -21 -1 -43c20 -58 89 -70 144 -70h923c37 0 80 21 91 57l300 987c6 19 6 39 5 57c23 -9 44 -23 59 -43zM575 1056c-6 -18 4 -32 22 -32h608c17 0 36 14 42 32l21 64c6 18 -4 32 -22 32h-608c-17 0 -36 -14 -42 -32zM492 800c-6 -18 4 -32 22 -32h608
-c17 0 36 14 42 32l21 64c6 18 -4 32 -22 32h-608c-17 0 -36 -14 -42 -32z" />
-    <glyph glyph-name="thermometer-three-quarters" unicode="&#xf2c8;" horiz-adv-x="1024" 
-d="M640 192c0 -106 -86 -192 -192 -192s-192 86 -192 192c0 80 50 153 128 181v651h128v-651c78 -28 128 -101 128 -181zM768 192c0 105 -50 197 -128 256v768c0 106 -86 192 -192 192s-192 -86 -192 -192v-768c-78 -59 -128 -151 -128 -256c0 -177 143 -320 320 -320
-s320 143 320 320zM896 192c0 -247 -201 -448 -448 -448s-448 201 -448 448c0 122 49 232 128 313v711c0 177 143 320 320 320s320 -143 320 -320v-711c79 -81 128 -191 128 -313zM1024 768v-128h-192v128h192zM1024 1024v-128h-192v128h192zM1024 1280v-128h-192v128h192z
-" />
-    <glyph glyph-name="transgender" unicode="&#xf224;" horiz-adv-x="1408" 
-d="M1024 1504c0 18 14 32 32 32h288c35 0 64 -29 64 -64v-288c0 -18 -14 -32 -32 -32h-64c-18 0 -32 14 -32 32v134l-254 -255c78 -98 126 -223 126 -359c0 -296 -224 -540 -512 -572v-132h96c18 0 32 -14 32 -32v-64c0 -18 -14 -32 -32 -32h-96v-96c0 -18 -14 -32 -32 -32
-h-64c-18 0 -32 14 -32 32v96h-96c-18 0 -32 14 -32 32v64c0 18 14 32 32 32h96v132c-302 33 -535 302 -510 618c21 272 237 495 507 526c162 19 312 -31 426 -122l255 254h-134c-18 0 -32 14 -32 32v64zM576 256c247 0 448 201 448 448s-201 448 -448 448
-s-448 -201 -448 -448s201 -448 448 -448z" />
-    <glyph glyph-name="cloud-upload" unicode="&#xf0ee;" horiz-adv-x="1920" 
-d="M1280 672c0 8 -3 17 -9 23l-352 352c-6 6 -14 9 -23 9c-8 0 -17 -3 -23 -9l-351 -351c-6 -7 -10 -15 -10 -24c0 -18 14 -32 32 -32h224v-352c0 -17 15 -32 32 -32h192c17 0 32 15 32 32v352h224c18 0 32 15 32 32zM1920 384c0 -212 -172 -384 -384 -384h-1088
-c-247 0 -448 201 -448 448c0 174 101 332 258 405c-1 15 -2 29 -2 43c0 283 229 512 512 512c208 0 395 -126 474 -318c46 40 105 62 166 62c141 0 256 -115 256 -256c0 -49 -14 -97 -41 -138c174 -41 297 -196 297 -374z" />
-    <glyph glyph-name="bullseye" unicode="&#xf140;" 
-d="M1024 640c0 -141 -115 -256 -256 -256s-256 115 -256 256s115 256 256 256s256 -115 256 -256zM1152 640c0 212 -172 384 -384 384s-384 -172 -384 -384s172 -384 384 -384s384 172 384 384zM1280 640c0 -283 -229 -512 -512 -512s-512 229 -512 512s229 512 512 512
-s512 -229 512 -512zM1408 640c0 353 -287 640 -640 640s-640 -287 -640 -640s287 -640 640 -640s640 287 640 640zM1536 640c0 -424 -344 -768 -768 -768s-768 344 -768 768s344 768 768 768s768 -344 768 -768z" />
-    <glyph glyph-name="openid" unicode="&#xf19b;" horiz-adv-x="1792" 
-d="M1086 1536v-1536l-272 -128c-460 41 -814 286 -814 583c0 286 330 524 767 577v-172c-286 -50 -496 -212 -496 -405c0 -204 234 -373 543 -412v1360zM1755 954l37 -390l-525 114l147 83c-78 46 -174 80 -280 99v172c185 -22 351 -78 481 -157z" />
-    <glyph glyph-name="repeat" unicode="&#xf01e;" 
-d="M1536 1280v-448c0 -35 -29 -64 -64 -64h-448c-26 0 -49 16 -59 40c-10 23 -5 51 14 69l138 138c-94 87 -218 137 -349 137c-282 0 -512 -230 -512 -512s230 -512 512 -512c159 0 306 72 404 199c5 7 14 11 23 12c9 0 18 -3 25 -9l137 -138c12 -11 12 -30 2 -43
-c-146 -176 -362 -277 -591 -277c-423 0 -768 345 -768 768s345 768 768 768c197 0 388 -79 529 -212l130 129c18 19 46 24 70 14c23 -10 39 -33 39 -59z" />
-    <glyph glyph-name="star" unicode="&#xf005;" horiz-adv-x="1664" 
-d="M1664 889c0 -18 -13 -35 -26 -48l-363 -354l86 -500c1 -7 1 -13 1 -20c0 -26 -12 -50 -41 -50c-14 0 -28 5 -40 12l-449 236l-449 -236c-13 -7 -26 -12 -40 -12c-29 0 -42 24 -42 50c0 7 1 13 2 20l86 500l-364 354c-12 13 -25 30 -25 48c0 30 31 42 56 46l502 73
-l225 455c9 19 26 41 49 41s40 -22 49 -41l225 -455l502 -73c24 -4 56 -16 56 -46z" />
-    <glyph glyph-name="users" unicode="&#xf0c0;" horiz-adv-x="1920" 
-d="M593 640c-104 -3 -198 -48 -265 -128h-134c-100 0 -194 48 -194 159c0 81 -3 353 124 353c21 0 125 -85 260 -85c46 0 90 8 133 23c-3 -22 -5 -44 -5 -66c0 -91 29 -181 81 -256zM1664 3c0 -162 -107 -259 -267 -259h-874c-160 0 -267 97 -267 259c0 226 53 573 346 573
-c34 0 158 -139 358 -139s324 139 358 139c293 0 346 -347 346 -573zM640 1280c0 -141 -115 -256 -256 -256s-256 115 -256 256s115 256 256 256s256 -115 256 -256zM1344 896c0 -212 -172 -384 -384 -384s-384 172 -384 384s172 384 384 384s384 -172 384 -384zM1920 671
-c0 -111 -94 -159 -194 -159h-134c-67 80 -161 125 -265 128c52 75 81 165 81 256c0 22 -2 44 -5 66c43 -15 87 -23 133 -23c135 0 239 85 260 85c127 0 124 -272 124 -353zM1792 1280c0 -141 -115 -256 -256 -256s-256 115 -256 256s115 256 256 256s256 -115 256 -256z" />
-    <glyph glyph-name="transgender-alt" unicode="&#xf225;" horiz-adv-x="1664" 
-d="M1280 1504c0 18 14 32 32 32h288c35 0 64 -29 64 -64v-288c0 -18 -14 -32 -32 -32h-64c-18 0 -32 14 -32 32v134l-254 -255c78 -98 126 -223 126 -359c0 -296 -224 -540 -512 -572v-132h96c18 0 32 -14 32 -32v-64c0 -18 -14 -32 -32 -32h-96v-96c0 -18 -14 -32 -32 -32
-h-64c-18 0 -32 14 -32 32v96h-96c-18 0 -32 14 -32 32v64c0 18 14 32 32 32h96v132c-288 32 -512 276 -512 572c0 136 48 261 126 359l-52 53l-101 -111c-12 -13 -32 -14 -45 -3l-48 44c-13 11 -14 32 -2 45l105 115l-111 112v-134c0 -18 -14 -32 -32 -32h-64
-c-18 0 -32 14 -32 32v288c0 35 29 64 64 64h288c18 0 32 -14 32 -32v-64c0 -18 -14 -32 -32 -32h-133l106 -107l86 94c12 13 32 14 45 3l48 -44c13 -11 14 -32 2 -45l-90 -99l57 -56c98 78 223 126 359 126s261 -48 359 -126l255 254h-134c-18 0 -32 14 -32 32v64zM832 256
-c247 0 448 201 448 448s-201 448 -448 448s-448 -201 -448 -448s201 -448 448 -448z" />
-    <glyph glyph-name="chevron-up" unicode="&#xf077;" horiz-adv-x="1612" 
-d="M1593 205l-166 -165c-25 -25 -65 -25 -90 0l-531 531l-531 -531c-25 -25 -65 -25 -90 0l-166 165c-25 25 -25 66 0 91l742 741c25 25 65 25 90 0l742 -741c25 -25 25 -66 0 -91z" />
-    <glyph glyph-name="asterisk" unicode="&#xf069;" horiz-adv-x="1428" 
-d="M1364 486c61 -35 82 -114 47 -175l-64 -110c-35 -61 -114 -82 -175 -47l-266 153v-307c0 -70 -58 -128 -128 -128h-128c-70 0 -128 58 -128 128v307l-266 -153c-61 -35 -140 -14 -175 47l-64 110c-35 61 -14 140 47 175l266 154l-266 154c-61 35 -82 114 -47 175l64 110
-c35 61 114 82 175 47l266 -153v307c0 70 58 128 128 128h128c70 0 128 -58 128 -128v-307l266 153c61 35 140 14 175 -47l64 -110c35 -61 14 -140 -47 -175l-266 -154z" />
-    <glyph glyph-name="plus-circle" unicode="&#xf055;" 
-d="M1216 576v128c0 35 -29 64 -64 64h-256v256c0 35 -29 64 -64 64h-128c-35 0 -64 -29 -64 -64v-256h-256c-35 0 -64 -29 -64 -64v-128c0 -35 29 -64 64 -64h256v-256c0 -35 29 -64 64 -64h128c35 0 64 29 64 64v256h256c35 0 64 29 64 64zM1536 640
-c0 -424 -344 -768 -768 -768s-768 344 -768 768s344 768 768 768s768 -344 768 -768z" />
-    <glyph glyph-name="cart-arrow-down" unicode="&#xf218;" horiz-adv-x="1664" 
-d="M1280 832c0 35 -29 64 -64 64c-17 0 -33 -7 -45 -19l-147 -146v293c0 35 -29 64 -64 64s-64 -29 -64 -64v-293l-147 146c-12 12 -28 19 -45 19c-35 0 -64 -29 -64 -64c0 -17 7 -33 19 -45l256 -256c12 -12 28 -19 45 -19s33 7 45 19l256 256c12 12 19 28 19 45zM640 0
-c0 -71 -57 -128 -128 -128s-128 57 -128 128s57 128 128 128s128 -57 128 -128zM1536 0c0 -71 -57 -128 -128 -128s-128 57 -128 128s57 128 128 128s128 -57 128 -128zM1664 1088v-512c0 -32 -24 -60 -57 -64l-1044 -122c4 -22 13 -47 13 -70s-14 -44 -24 -64h920
-c35 0 64 -29 64 -64s-29 -64 -64 -64h-1024c-35 0 -64 29 -64 64c0 31 47 108 61 137l-177 823h-204c-35 0 -64 29 -64 64s29 64 64 64h256c68 0 69 -80 79 -128h1201c35 0 64 -29 64 -64z" />
-    <glyph glyph-name="dropbox" unicode="&#xf16b;" horiz-adv-x="1664" 
-d="M338 829l494 -305l-342 -285l-490 319zM1324 274v-108l-490 -293v-1l-1 1l-1 -1v1l-489 293v108l147 -96l342 284v2l1 -1l1 1v-2l343 -284zM490 1418l342 -285l-494 -304l-338 270zM1326 829l338 -271l-489 -319l-343 285zM1175 1418l489 -319l-338 -270l-494 304z" />
-    <glyph glyph-name="debian" unicode="&#xf2ff;" horiz-adv-x="1440" 
-d="M1 954c3 22 -11 29 15 62c-4 -17 -6 -33 -15 -62zM61 1152c0 -18 30 18 8 -31c-40 -28 -3 -12 -8 31zM754 1527c20 7 49 4 70 9c-28 -2 -55 -3 -82 -7l12 -2zM1399 728c-8 -61 -27 -121 -56 -176c26 52 43 108 51 165zM582 550l10 -27c-12 21 -26 42 -33 66
-c7 -14 13 -28 23 -39zM536 548c25 -47 38 -61 56 -96c-25 21 -40 49 -60 76zM1274 762c2 -48 -15 -72 -29 -113l-25 -13c-21 -41 2 -26 -13 -58c-33 -29 -100 -91 -121 -97c-16 0 11 19 14 26c-44 -30 -36 -46 -103 -64l-2 4c-166 -78 -395 76 -392 287
-c-2 -13 -5 -10 -9 -15c-9 108 50 218 149 262c97 48 210 28 279 -37c-38 50 -113 103 -203 98c-88 -1 -171 -57 -198 -118c-45 -28 -49 -109 -69 -124c-26 -194 49 -277 178 -376c20 -14 5 -16 8 -26c-43 20 -82 50 -114 87c17 -25 35 -49 59 -68c-40 14 -93 98 -109 101
-c69 -124 282 -218 393 -172c-51 -2 -117 -1 -175 20c-24 12 -57 39 -51 44c152 -57 308 -43 439 62c33 26 70 70 81 71c-16 -24 2 -12 -10 -33c33 54 -14 22 35 93l18 -25c-7 45 55 99 49 169c14 22 16 -23 1 -73c21 55 5 65 10 110c6 -15 14 -32 18 -48
-c-14 53 14 89 21 120c-7 3 -22 -23 -25 40c0 27 8 14 11 21c-5 3 -19 24 -28 64c6 9 17 -25 25 -26c-5 32 -15 57 -15 81c-25 51 -9 -7 -29 22c-26 82 22 19 25 56c40 -58 63 -147 73 -184c-8 45 -21 89 -37 131c12 -5 -19 93 16 28c-38 138 -161 266 -274 327
-c14 -13 31 -29 25 -31c-56 34 -46 37 -54 51c-46 19 -49 -1 -79 0c-86 46 -103 40 -183 69l4 -17c-57 19 -67 -7 -129 0c-4 3 20 11 39 14c-55 -7 -53 11 -107 -2c13 9 28 15 42 23c-45 -3 -107 -26 -88 -5c-74 -33 -205 -78 -278 -147l-2 15c-34 -40 -147 -121 -156 -173
-l-9 -2c-17 -30 -29 -64 -43 -94c-23 -39 -33 -15 -30 -21c-45 -91 -68 -168 -87 -231c14 -21 1 -123 6 -206c-23 -408 286 -804 624 -896c50 -18 123 -17 186 -19c-74 21 -84 11 -156 36c-52 24 -63 53 -100 85l15 -26c-72 26 -42 31 -101 50l16 20c-23 2 -62 40 -73 61
-l-25 -1c-31 38 -47 65 -46 86l-8 -15c-9 16 -114 142 -60 113c-10 9 -23 15 -37 41l11 13c-26 33 -48 76 -46 90c14 -19 23 -22 32 -25c-65 162 -68 9 -118 165l10 1c-8 12 -13 25 -19 38l5 45c-47 54 -14 232 -7 329c5 39 40 81 66 147l-16 3c31 53 174 214 241 206
-c32 41 -6 1 -12 11c71 74 93 52 141 65c52 31 -45 -13 -20 11c89 23 63 52 180 64c12 -7 -28 -11 -38 -20c75 36 235 28 340 -20c122 -57 259 -225 264 -383l6 -2c-3 -63 10 -135 -12 -202l15 32zM779 1504l-11 -2l11 1v1zM748 1513c53 -2 48 -5 31 -9c3 4 -15 6 -31 9z
-M1079 782c-5 -22 -10 13 -16 16c5 20 20 37 16 -16zM1020 629c18 24 30 51 35 79c-4 -20 -15 -37 -25 -55c-56 -35 -5 21 0 42c-60 -75 -8 -45 -10 -66zM860 589c-30 0 6 -15 45 -21c8 7 21 18 29 25c-24 -6 -49 -6 -74 -4z" />
-    <glyph glyph-name="newspaper-o" 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-960c0 -35 29 -64 64 -64
-s64 29 64 64zM1920 192v1088h-1536v-1088c0 -22 -4 -44 -11 -64h1483c35 0 64 29 64 64zM2048 1408v-1216c0 -106 -86 -192 -192 -192h-1664c-106 0 -192 86 -192 192v1088h256v128h1792z" />
-    <glyph glyph-name="building" unicode="&#xf1ad;" horiz-adv-x="1408" 
-d="M1344 1536c35 0 64 -29 64 -64v-1664c0 -35 -29 -64 -64 -64h-1280c-35 0 -64 29 -64 64v1664c0 35 29 64 64 64h1280zM512 1248v-64c0 -18 14 -32 32 -32h64c18 0 32 14 32 32v64c0 18 -14 32 -32 32h-64c-18 0 -32 -14 -32 -32zM512 992v-64c0 -18 14 -32 32 -32h64
-c18 0 32 14 32 32v64c0 18 -14 32 -32 32h-64c-18 0 -32 -14 -32 -32zM512 736v-64c0 -18 14 -32 32 -32h64c18 0 32 14 32 32v64c0 18 -14 32 -32 32h-64c-18 0 -32 -14 -32 -32zM512 480v-64c0 -18 14 -32 32 -32h64c18 0 32 14 32 32v64c0 18 -14 32 -32 32h-64
-c-18 0 -32 -14 -32 -32zM384 160v64c0 18 -14 32 -32 32h-64c-18 0 -32 -14 -32 -32v-64c0 -18 14 -32 32 -32h64c18 0 32 14 32 32zM384 416v64c0 18 -14 32 -32 32h-64c-18 0 -32 -14 -32 -32v-64c0 -18 14 -32 32 -32h64c18 0 32 14 32 32zM384 672v64
-c0 18 -14 32 -32 32h-64c-18 0 -32 -14 -32 -32v-64c0 -18 14 -32 32 -32h64c18 0 32 14 32 32zM384 928v64c0 18 -14 32 -32 32h-64c-18 0 -32 -14 -32 -32v-64c0 -18 14 -32 32 -32h64c18 0 32 14 32 32zM384 1184v64c0 18 -14 32 -32 32h-64c-18 0 -32 -14 -32 -32v-64
-c0 -18 14 -32 32 -32h64c18 0 32 14 32 32zM896 -96v192c0 18 -14 32 -32 32h-320c-18 0 -32 -14 -32 -32v-192c0 -18 14 -32 32 -32h320c18 0 32 14 32 32zM896 416v64c0 18 -14 32 -32 32h-64c-18 0 -32 -14 -32 -32v-64c0 -18 14 -32 32 -32h64c18 0 32 14 32 32z
-M896 672v64c0 18 -14 32 -32 32h-64c-18 0 -32 -14 -32 -32v-64c0 -18 14 -32 32 -32h64c18 0 32 14 32 32zM896 928v64c0 18 -14 32 -32 32h-64c-18 0 -32 -14 -32 -32v-64c0 -18 14 -32 32 -32h64c18 0 32 14 32 32zM896 1184v64c0 18 -14 32 -32 32h-64
-c-18 0 -32 -14 -32 -32v-64c0 -18 14 -32 32 -32h64c18 0 32 14 32 32zM1152 160v64c0 18 -14 32 -32 32h-64c-18 0 -32 -14 -32 -32v-64c0 -18 14 -32 32 -32h64c18 0 32 14 32 32zM1152 416v64c0 18 -14 32 -32 32h-64c-18 0 -32 -14 -32 -32v-64c0 -18 14 -32 32 -32h64
-c18 0 32 14 32 32zM1152 672v64c0 18 -14 32 -32 32h-64c-18 0 -32 -14 -32 -32v-64c0 -18 14 -32 32 -32h64c18 0 32 14 32 32zM1152 928v64c0 18 -14 32 -32 32h-64c-18 0 -32 -14 -32 -32v-64c0 -18 14 -32 32 -32h64c18 0 32 14 32 32zM1152 1184v64c0 18 -14 32 -32 32
-h-64c-18 0 -32 -14 -32 -32v-64c0 -18 14 -32 32 -32h64c18 0 32 14 32 32z" />
-    <glyph glyph-name="bitbucket" unicode="&#xf171;" horiz-adv-x="1408" 
-d="M815 677c11 -84 -91 -150 -162 -107c-80 35 -80 162 -2 198c67 41 164 -13 164 -91zM926 698c-18 142 -179 236 -310 177c-83 -37 -139 -125 -135 -218c5 -122 121 -222 243 -211s217 130 202 252zM1165 1240c-44 58 -119 68 -185 79c-187 30 -379 31 -566 -2
-c-62 -10 -132 -21 -171 -77c64 -60 155 -69 237 -79c148 -19 300 -20 448 -1c83 10 175 18 237 80zM1222 205c-28 -98 -12 -230 -116 -287c-179 -99 -396 -110 -593 -75c-104 19 -226 52 -283 150c-25 96 -41 194 -57 292l6 16l18 9c298 -197 715 -197 1014 0
-c47 -14 12 -71 11 -105zM1403 1166c-34 -219 -73 -437 -111 -655c-11 -64 -73 -100 -125 -127c-187 -94 -405 -110 -610 -88c-139 15 -281 52 -394 139c-53 41 -53 111 -63 170c-35 205 -75 410 -100 617c12 90 113 129 188 157c100 37 207 54 313 64c226 22 457 14 676 -50
-c78 -23 162 -55 215 -122c24 -31 16 -70 11 -105z" />
-    <glyph glyph-name="yelp" unicode="&#xf1e9;" horiz-adv-x="1366" 
-d="M688 217v-127c-1 -282 -1 -292 -6 -305c-8 -21 -26 -35 -51 -40c-72 -12 -297 71 -344 127c-10 11 -15 24 -17 36c-1 9 1 18 4 26c5 14 14 25 215 263c0 0 1 0 60 70c20 25 56 33 89 21c33 -13 51 -41 50 -71zM539 468c-2 -35 -22 -61 -52 -70l-120 -39
-c-269 -86 -278 -88 -292 -88c-22 1 -42 14 -54 36c-8 16 -14 43 -17 75c-11 98 2 245 31 291c14 22 34 33 56 32c15 0 27 -6 317 -124c0 0 -1 -1 84 -34c30 -12 49 -43 47 -79zM1365 171c-10 -72 -159 -261 -227 -288c-23 -9 -46 -7 -63 7c-12 9 -24 27 -184 287l-47 77
-c-18 28 -15 64 8 92c22 27 54 36 83 26c0 0 1 -1 119 -40c269 -88 278 -91 289 -100c18 -14 26 -35 22 -61zM693 803c5 -104 -39 -117 -54 -122c-14 -4 -58 -17 -114 71c-368 581 -378 598 -378 598c-5 21 1 44 19 62c55 57 354 141 432 121c25 -6 43 -22 49 -45
-c4 -25 40 -564 46 -685zM1355 695c2 -25 -7 -46 -26 -59c-12 -8 -24 -12 -329 -86c-49 -11 -76 -18 -91 -23l1 2c-30 -8 -64 6 -83 36s-18 63 0 87c0 0 1 1 75 102c164 224 172 235 184 243c19 13 42 13 65 2c65 -31 196 -226 204 -301v-3z" />
-    <glyph glyph-name="neuter" unicode="&#xf22c;" horiz-adv-x="1152" 
-d="M1152 960c0 -296 -224 -540 -512 -572v-612c0 -18 -14 -32 -32 -32h-64c-18 0 -32 14 -32 32v612c-288 32 -512 276 -512 572c0 318 258 576 576 576s576 -258 576 -576zM576 512c247 0 448 201 448 448s-201 448 -448 448s-448 -201 -448 -448s201 -448 448 -448z" />
-    <glyph glyph-name="behance-square" unicode="&#xf1b5;" 
-d="M1248 1408c159 0 288 -129 288 -288v-960c0 -159 -129 -288 -288 -288h-960c-159 0 -288 129 -288 288v960c0 159 129 288 288 288h960zM499 1041h-371v-787h382c143 0 277 68 277 228c0 99 -47 172 -143 200c70 34 107 85 107 164c0 157 -117 195 -252 195zM477 723
-h-176v184h163c62 0 119 -17 119 -90c0 -67 -44 -94 -106 -94zM486 388h-185v217h189c76 0 124 -33 124 -113s-57 -104 -128 -104zM1136 356c-92 0 -140 54 -140 145h411c1 10 1 20 1 30c0 168 -99 309 -278 309c-173 0 -292 -131 -292 -302c0 -178 112 -299 292 -299
-c137 0 225 61 267 191h-138c-15 -48 -76 -74 -123 -74zM1126 722c78 0 117 -47 124 -122h-254c5 75 55 122 130 122zM964 988v-77h319v77h-319z" />
-    <glyph glyph-name="wifi" unicode="&#xf1eb;" horiz-adv-x="1964" 
-d="M982 13c-26 0 -166 140 -166 167c0 49 128 76 166 76s166 -27 166 -76c0 -27 -140 -167 -166 -167zM1252 284c-14 0 -123 100 -270 100c-148 0 -255 -100 -270 -100c-24 0 -169 144 -169 168c0 9 4 17 10 23c107 106 281 165 429 165s322 -59 429 -165
-c6 -6 10 -14 10 -23c0 -24 -145 -168 -169 -168zM1525 556c-8 0 -17 4 -23 8c-165 128 -304 204 -520 204c-302 0 -532 -212 -543 -212c-23 0 -167 144 -167 168c0 8 4 16 10 22c179 179 449 278 700 278s521 -99 700 -278c6 -6 10 -14 10 -22c0 -24 -144 -168 -167 -168z
-M1796 827c-8 0 -16 4 -22 9c-231 203 -480 316 -792 316s-561 -113 -792 -316c-6 -5 -14 -9 -22 -9c-23 0 -168 144 -168 168c0 9 4 17 10 23c253 251 618 390 972 390s719 -139 972 -390c6 -6 10 -14 10 -23c0 -24 -145 -168 -168 -168z" />
-    <glyph glyph-name="youtube" unicode="&#xf167;" horiz-adv-x="1482" 
-d="M944 292v-211c0 -45 -13 -67 -39 -67c-15 0 -30 7 -45 22v301c15 15 30 22 45 22c26 0 39 -23 39 -67zM1282 291v-46h-90v46c0 45 15 68 45 68s45 -23 45 -68zM316 509h107v94h-312v-94h105v-569h100v569zM604 -60h89v494h-89v-378c-20 -28 -39 -42 -57 -42
-c-12 0 -19 7 -21 21c-1 3 -1 14 -1 35v364h-89v-391c0 -35 3 -58 8 -73c8 -25 29 -37 58 -37c32 0 66 20 102 61v-54zM1033 88v197c0 46 -2 79 -9 99c-11 37 -36 56 -71 56c-33 0 -64 -18 -93 -54v217h-89v-663h89v48c30 -37 61 -55 93 -55c35 0 60 19 71 55
-c7 21 9 54 9 100zM1371 98v13h-91c0 -36 -1 -56 -2 -61c-5 -24 -18 -36 -40 -36c-31 0 -46 23 -46 69v87h179v103c0 53 -9 91 -27 116c-26 34 -61 51 -106 51c-46 0 -81 -17 -107 -51c-19 -25 -28 -63 -28 -116v-173c0 -53 10 -92 29 -116c26 -34 61 -51 108 -51
-s84 18 108 53c11 16 19 34 21 54c2 9 2 29 2 58zM763 1011v210c0 46 -13 69 -43 69c-29 0 -43 -23 -43 -69v-210c0 -46 14 -70 43 -70c30 0 43 24 43 70zM1482 260c0 -115 -1 -238 -26 -350c-19 -79 -83 -137 -160 -145c-184 -21 -370 -21 -555 -21s-371 0 -555 21
-c-77 8 -142 66 -160 145c-26 112 -26 235 -26 350c0 116 1 238 26 350c19 79 83 137 161 146c183 20 369 20 554 20s371 0 555 -20c77 -9 142 -67 160 -146c26 -112 26 -234 26 -350zM484 1536h102l-121 -399v-271h-100v271c-9 49 -29 119 -61 212c-22 62 -44 125 -65 187
-h106l71 -263zM854 1203v-175c0 -53 -9 -93 -28 -118c-25 -34 -60 -51 -106 -51c-45 0 -80 17 -105 51c-19 26 -28 65 -28 118v175c0 53 9 92 28 117c25 34 60 51 105 51c46 0 81 -17 106 -51c19 -25 28 -64 28 -117zM1189 1365v-499h-91v55c-36 -42 -70 -62 -103 -62
-c-29 0 -50 12 -59 37c-5 15 -8 39 -8 75v394h91v-367c0 -21 0 -33 1 -35c2 -14 9 -22 21 -22c18 0 37 14 57 43v381h91z" />
-    <glyph glyph-name="angle-double-down" unicode="&#xf103;" horiz-adv-x="998" 
-d="M998 672c0 -8 -4 -17 -10 -23l-466 -466c-6 -6 -15 -10 -23 -10s-17 4 -23 10l-466 466c-6 6 -10 15 -10 23s4 17 10 23l50 50c6 6 14 10 23 10c8 0 17 -4 23 -10l393 -393l393 393c6 6 15 10 23 10s17 -4 23 -10l50 -50c6 -6 10 -15 10 -23zM998 1056
-c0 -8 -4 -17 -10 -23l-466 -466c-6 -6 -15 -10 -23 -10s-17 4 -23 10l-466 466c-6 6 -10 15 -10 23s4 17 10 23l50 50c6 6 14 10 23 10c8 0 17 -4 23 -10l393 -393l393 393c6 6 15 10 23 10s17 -4 23 -10l50 -50c6 -6 10 -15 10 -23z" />
-    <glyph glyph-name="sort-alpha-asc" unicode="&#xf15d;" horiz-adv-x="1629" 
-d="M1159 1128h177l-72 218l-12 47c-1 8 -2 14 -2 20h-4l-3 -20c-3 -12 -4 -27 -11 -47zM704 96c0 -9 -4 -17 -10 -24l-319 -319c-7 -6 -15 -9 -23 -9s-16 3 -23 9l-320 320c-9 10 -12 23 -7 35s17 20 30 20h192v1376c0 18 14 32 32 32h192c18 0 32 -14 32 -32v-1376h192
-c18 0 32 -14 32 -32zM1540 -23v-233h-584v90l369 529c8 12 16 22 21 27l11 9v3c-4 0 -8 -1 -14 -1c-8 -2 -18 -3 -30 -3h-232v-115h-120v229h567v-89l-369 -530c-6 -9 -14 -18 -21 -26l-11 -11v-2l14 2c9 2 18 2 30 2h248v119h121zM1629 874v-106h-288v106h75l-47 144h-243
-l-47 -144h75v-106h-287v106h70l230 662h162l230 -662h70z" />
-    <glyph glyph-name="area-chart" unicode="&#xf1fe;" horiz-adv-x="2048" 
-d="M2048 0v-128h-2048v1536h128v-1408h1920zM1664 1024l256 -896h-1664v576l448 576l576 -576z" />
-    <glyph glyph-name="dev-to" unicode="&#xf316;" 
-d="M39 1403v0c13 5 121 6 735 5c717 -1 721 -1 734 -9c7 -5 15 -14 20 -21c8 -13 8 -16 8 -739s0 -726 -8 -739c-5 -7 -13 -15 -20 -20c-13 -8 -16 -8 -739 -8s-726 0 -739 8c-7 5 -16 13 -21 20c-8 13 -8 16 -9 731c0 490 0 723 3 733c5 19 18 33 36 39zM404 935
-c-18 4 -53 6 -119 6h-93v-603h84c46 0 96 1 111 3c72 9 131 63 144 132c5 26 5 306 0 332c-6 31 -20 59 -43 83c-25 26 -50 40 -84 47zM897 886v55h-118c-92 0 -121 -2 -133 -6c-20 -7 -42 -30 -47 -50c-3 -11 -4 -89 -3 -254c1 -265 -1 -250 27 -274c20 -17 39 -19 163 -19
-h111v109l-95 1l-96 1l-1 69v69h116v109h-116v136h192v54zM1081 933c-3 8 -4 8 -62 8h-59l3 -10c26 -106 136 -514 143 -528c11 -23 33 -49 49 -57c18 -9 47 -7 67 4c16 9 45 45 50 62c8 25 138 522 138 525s-16 4 -60 3l-58 -1l-52 -198c-28 -109 -52 -199 -53 -202
-s-24 83 -52 190s-52 199 -54 204zM301 639v193l41 -1c37 -2 42 -2 56 -11c28 -18 27 -18 27 -178c0 -164 0 -166 -29 -183c-15 -9 -22 -10 -56 -11l-39 -2v193z" />
-    <glyph glyph-name="stethoscope" unicode="&#xf0f1;" horiz-adv-x="1408" 
-d="M1280 832c0 35 -29 64 -64 64s-64 -29 -64 -64s29 -64 64 -64s64 29 64 64zM1408 832c0 -84 -53 -154 -128 -181v-395c0 -212 -201 -384 -448 -384s-448 172 -448 384v132c-217 27 -384 187 -384 380v512c0 35 29 64 64 64c6 0 11 -1 16 -2c22 39 64 66 112 66
-c71 0 128 -57 128 -128s-57 -128 -128 -128c-23 0 -45 7 -64 18v-402c0 -141 144 -256 320 -256s320 115 320 256v402c-19 -11 -41 -18 -64 -18c-71 0 -128 57 -128 128s57 128 128 128c48 0 90 -27 112 -66c5 1 10 2 16 2c35 0 64 -29 64 -64v-512
-c0 -193 -167 -353 -384 -380v-132c0 -141 144 -256 320 -256s320 115 320 256v395c-75 27 -128 97 -128 181c0 106 86 192 192 192s192 -86 192 -192z" />
-    <glyph glyph-name="step-forward" unicode="&#xf051;" horiz-adv-x="1024" 
-d="M45 -115c-25 -25 -45 -16 -45 19v1472c0 35 20 44 45 19l710 -710c6 -6 10 -12 13 -19v678c0 35 29 64 64 64h128c35 0 64 -29 64 -64v-1408c0 -35 -29 -64 -64 -64h-128c-35 0 -64 29 -64 64v678c-3 -7 -7 -13 -13 -19z" />
-    <glyph glyph-name="backward" unicode="&#xf04a;" horiz-adv-x="1542" 
-d="M1497 1395c25 25 45 16 45 -19v-1472c0 -35 -20 -44 -45 -19l-710 710c-6 6 -10 12 -13 19v-710c0 -35 -20 -44 -45 -19l-710 710c-25 25 -25 65 0 90l710 710c25 25 45 16 45 -19v-710c3 7 7 13 13 19z" />
-  </font>
-</defs></svg>
diff --git a/ceph/src/pybind/mgr/dashboard/frontend/dist/en-US/forkawesome-webfont.c0fee260bb6fd5fd.eot b/ceph/src/pybind/mgr/dashboard/frontend/dist/en-US/forkawesome-webfont.c0fee260bb6fd5fd.eot
new file mode 100644 (file)
index 0000000..b96d208
Binary files /dev/null and b/ceph/src/pybind/mgr/dashboard/frontend/dist/en-US/forkawesome-webfont.c0fee260bb6fd5fd.eot differ
diff --git a/ceph/src/pybind/mgr/dashboard/frontend/dist/en-US/forkawesome-webfont.d0a4ad9e6369d510.woff2 b/ceph/src/pybind/mgr/dashboard/frontend/dist/en-US/forkawesome-webfont.d0a4ad9e6369d510.woff2
new file mode 100644 (file)
index 0000000..f3520b5
Binary files /dev/null and b/ceph/src/pybind/mgr/dashboard/frontend/dist/en-US/forkawesome-webfont.d0a4ad9e6369d510.woff2 differ
diff --git a/ceph/src/pybind/mgr/dashboard/frontend/dist/en-US/forkawesome-webfont.e182ad6df04f9177b326.eot b/ceph/src/pybind/mgr/dashboard/frontend/dist/en-US/forkawesome-webfont.e182ad6df04f9177b326.eot
deleted file mode 100644 (file)
index b96d208..0000000
Binary files a/ceph/src/pybind/mgr/dashboard/frontend/dist/en-US/forkawesome-webfont.e182ad6df04f9177b326.eot and /dev/null differ
diff --git a/ceph/src/pybind/mgr/dashboard/frontend/dist/en-US/forkawesome-webfont.ee4d8bfd0af89fc714a2.ttf b/ceph/src/pybind/mgr/dashboard/frontend/dist/en-US/forkawesome-webfont.ee4d8bfd0af89fc714a2.ttf
deleted file mode 100644 (file)
index 6cf62ef..0000000
Binary files a/ceph/src/pybind/mgr/dashboard/frontend/dist/en-US/forkawesome-webfont.ee4d8bfd0af89fc714a2.ttf and /dev/null differ
index d37b61f38da3d7a7eba0d168da4ba2646e7a2241..d1a7b26413838a0c3c3862de25fb457aac6c7ede 100644 (file)
@@ -1,10 +1,10 @@
-<!DOCTYPE html><html lang="en-US"><head>
+<!DOCTYPE html><html lang="en-US" dir="ltr"><head>
   <meta charset="utf-8">
   <title>Ceph</title>
 
   <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
   <link rel="icon" type="image/x-icon" id="cdFavicon" href="favicon.ico">
   <meta charset="utf-8">
   <title>Ceph</title>
 
   <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
   <link rel="icon" type="image/x-icon" id="cdFavicon" href="favicon.ico">
-<style>@charset "UTF-8";:root{--gray-100:#f8f9fa;--gray-200:#e9ecef;--gray-300:#dee2e6;--gray-400:#ced4da;--gray-500:#adb5bd;--gray-600:#6c757d;--gray-700:#495057;--gray-800:#343a40;--gray-900:#212529;--black:#000;--barley-white:#fcecba;--fg-color-over-dark-bg:#fff;--fg-hover-color-over-dark-bg:#adb5bd;--body-color-bright:#f8f9fa;--body-bg:#fff;--body-color:#212529;--body-bg-alt:#e9ecef;--health-color-error:red;--health-color-healthy:#0b0;--health-color-warning:orange;--chart-color-red:#c9190b;--chart-color-blue:#06c;--chart-color-orange:#ef9234;--chart-color-yellow:#f6d173;--chart-color-green:#7cc674;--chart-color-gray:#ededed;--chart-color-cyan:#73c5c5;--chart-color-purple:#3c3d99;--chart-color-center-text:#151515;--chart-color-center-text-description:#72767b;--chart-color-tooltip-background:#000;--chart-danger:#c9190b;--card-cap-bg:#f8f9fa;--grid-gutter-width:30px;--datatable-divider-color:#00000017;--nav-tabs-margin-bottom:1rem;--tooltip-color:#fff;--tooltip-bg:#212529;--screen-sm-min:576px;--screen-md-min:768px;--screen-lg-min:992px;--screen-xl-min:1200px;--screen-xs-max:calc(576px - 1px);--screen-sm-max:calc(768px - 1px);--screen-md-max:calc(992px - 1px);--screen-lg-max:calc(1200px - 1px);--navbar-height:43px;--blue:#007bff;--indigo:#6610f2;--purple:#6f42c1;--pink:#a94442;--red:#ef5c55;--orange:#fd7e14;--yellow:#ffc200;--green:#0b0;--teal:#20c997;--cyan:#17a2b8;--white:#fff;--gray:#6c757d;--gray-dark:#343a40;--primary:#2b99a8;--secondary:#374249;--success:#0b0;--info:#2b99a8;--warning:#ffc200;--danger:#ef5c55;--light:#f8f9fa;--dark:#777;--accent:#ef5c55;--warning-dark:#fd7e14;--breakpoint-xs:0;--breakpoint-sm:576px;--breakpoint-md:768px;--breakpoint-lg:992px;--breakpoint-xl:1200px;--breakpoint-2xl:1450px;--font-family-sans-serif:"Helvetica Neue",Helvetica,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:rgba(0,0,0,0)}body{margin:0;font-family:Helvetica Neue,Helvetica,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.5;color:#212529;text-align:left;background-color:#fff}@media print{*,:after,:before{text-shadow:none!important;box-shadow:none!important}@page{size:a3}body{min-width:992px!important}}html{background-color:#fff}body,html{font-size:12px;height:100%;width:100%}</style><link rel="stylesheet" href="styles.ffb7f665775e3c191fa3.css" media="print" onload="this.media='all'"><noscript><link rel="stylesheet" href="styles.ffb7f665775e3c191fa3.css"></noscript></head>
+<style>@charset "UTF-8";:root{--white:#fff;--gray-100:#f8f9fa;--gray-200:#e9ecef;--gray-300:#dee2e6;--gray-400:#ced4da;--gray-500:#adb5bd;--gray-600:#6c757d;--gray-700:#495057;--gray-800:#343a40;--gray-900:#212529;--black:#000;--blue:#007bff;--indigo:#6610f2;--purple:#6f42c1;--pink:#a94442;--red:#dc3545;--orange:#fd7e14;--yellow:#d48200;--green:#008a00;--teal:#20c997;--cyan:#17a2b8;--barley-white:#fcecba;--primary:#25828e;--primary-500:#2b99a8;--secondary:#374249;--success:#008a00;--info:#25828e;--warning:#d48200;--danger:#dc3545;--light:#f8f9fa;--dark:#343a40;--green-300:#6ec664;--cyan-300:#009596;--purple-300:#a18fff;--light-blue-300:#35caed;--gold-300:#f4c145;--light-green-300:#ace12e;--accent:#25828e;--warning-dark:#fd7e14;--fg-color-over-dark-bg:#fff;--fg-hover-color-over-dark-bg:#adb5bd;--body-color-bright:#f8f9fa;--body-bg:#fff;--body-color:#212529;--body-bg-alt:#e9ecef;--health-color-error:#dc3545;--health-color-healthy:#008a00;--health-color-warning:#d48200;--health-color-warning-800:#9d6d10;--chart-color-red:#dc3545;--chart-color-blue:#06c;--chart-color-orange:#ef9234;--chart-color-yellow:#f6d173;--chart-color-green:#008a00;--chart-color-gray:#ededed;--chart-color-cyan:#2b99a8;--chart-color-purple:#3c3d99;--chart-color-center-text:#151515;--chart-color-center-text-description:#72767b;--chart-color-tooltip-background:#000;--chart-danger:#c9190b;--font-family-sans-serif:"Helvetica Neue", Helvetica, Arial, "Noto Sans", sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji";--card-cap-bg:#f8f9fa;--grid-gutter-width:30px;--datatable-divider-color:rgba(0, 0, 0, .09);--nav-tabs-margin-bottom:1rem;--tooltip-color:#fff;--tooltip-bg:#212529;--tooltip-opacity:1;--screen-sm-min:576px;--screen-md-min:768px;--screen-lg-min:992px;--screen-xl-min:1200px;--screen-xs-max:575px;--screen-sm-max:767px;--screen-md-max:991px;--screen-lg-max:1199px;--navbar-height:43px}:root{--bs-blue:#007bff;--bs-indigo:#6610f2;--bs-purple:#6f42c1;--bs-pink:#a94442;--bs-red:#dc3545;--bs-orange:#fd7e14;--bs-yellow:#d48200;--bs-green:#008a00;--bs-teal:#20c997;--bs-cyan:#17a2b8;--bs-white:#fff;--bs-gray:#6c757d;--bs-gray-dark:#343a40;--bs-accent:#25828e;--bs-warning-dark:#fd7e14;--bs-primary:#25828e;--bs-secondary:#374249;--bs-success:#008a00;--bs-info:#25828e;--bs-warning:#d48200;--bs-danger:#dc3545;--bs-light:#f8f9fa;--bs-dark:#343a40;--bs-font-sans-serif:"Helvetica Neue", Helvetica, Arial, "Noto Sans", sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji";--bs-font-monospace:SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace;--bs-gradient:linear-gradient(180deg, rgba(255, 255, 255, .15), rgba(255, 255, 255, 0))}*,*:before,*:after{box-sizing:border-box}@media (prefers-reduced-motion: no-preference){:root{scroll-behavior:smooth}}body{margin:0;font-family:var(--bs-font-sans-serif);font-size:1rem;font-weight:400;line-height:1.5;color:#212529;background-color:#fff;-webkit-text-size-adjust:100%;-webkit-tap-highlight-color:rgba(0,0,0,0)}html{background-color:#fff}html,body{font-size:12px;height:100%;width:100%}</style><link rel="stylesheet" href="styles.8b6796664b673424.css" media="print" onload="this.media='all'"><noscript><link rel="stylesheet" href="styles.8b6796664b673424.css"></noscript></head>
 <body>
   <noscript>
     <div class="noscript container"
 <body>
   <noscript>
     <div class="noscript container"
@@ -18,6 +18,6 @@
   </noscript>
 
   <cd-root></cd-root>
   </noscript>
 
   <cd-root></cd-root>
-<script src="runtime.ab6c27cac6d7501e18e8.js" defer></script><script src="polyfills.2068f3f22a496426465b.js" defer></script><script src="scripts.6bda3fa7e09a87cd4228.js" defer></script><script src="main.86799889c70942fa9a19.js" defer></script>
+<script src="runtime.4fd39655e7ea619b.js" type="module"></script><script src="polyfills.4b60b22744014b0b.js" type="module"></script><script src="scripts.cfd741a72b67f696.js" defer></script><script src="main.ddd4de0999172734.js" type="module"></script>
 
 </body></html>
\ No newline at end of file
 
 </body></html>
\ No newline at end of file
diff --git a/ceph/src/pybind/mgr/dashboard/frontend/dist/en-US/main.86799889c70942fa9a19.js b/ceph/src/pybind/mgr/dashboard/frontend/dist/en-US/main.86799889c70942fa9a19.js
deleted file mode 100644 (file)
index de8588b..0000000
+++ /dev/null
@@ -1,3 +0,0 @@
-var $localize=Object.assign(void 0===$localize?{}:$localize,{locale:"en-US"});
-"use strict";(function(global){global.ng=global.ng||{};global.ng.common=global.ng.common||{};global.ng.common.locales=global.ng.common.locales||{};const u=undefined;function plural(n){const i=Math.floor(Math.abs(n)),v=n.toString().replace(/^[^.]*\.?/,"").length;if(i===1&&v===0)return 1;return 5}global.ng.common.locales["en-us-posix"]=["en-US-POSIX",[["a","p"],["AM","PM"],u],[["AM","PM"],u,u],[["S","M","T","W","T","F","S"],["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],["Su","Mo","Tu","We","Th","Fr","Sa"]],u,[["J","F","M","A","M","J","J","A","S","O","N","D"],["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"],["January","February","March","April","May","June","July","August","September","October","November","December"]],u,[["B","A"],["BC","AD"],["Before Christ","Anno Domini"]],0,[6,0],["M/d/yy","MMM d, y","MMMM d, y","EEEE, MMMM d, y"],["h:mm a","h:mm:ss a","h:mm:ss a z","h:mm:ss a zzzz"],["{1}, {0}",u,"{1} 'at' {0}",u],[".",",",";","%","+","-","E","\xD7","0/00","INF","NaN",":"],["0.######","0%","\xA4\xA00.00","0.000000E+000"],"USD","$","US Dollar",{},"ltr",plural,[[["mi","n","in the morning","in the afternoon","in the evening","at night"],["midnight","noon","in the morning","in the afternoon","in the evening","at night"],u],[["midnight","noon","morning","afternoon","evening","night"],u,u],["00:00","12:00",["06:00","12:00"],["12:00","18:00"],["18:00","21:00"],["21:00","06:00"]]]]})(typeof globalThis!=="undefined"&&globalThis||typeof global!=="undefined"&&global||typeof window!=="undefined"&&window);;
-var Sm=Math.pow;(self.webpackChunkceph_dashboard=self.webpackChunkceph_dashboard||[]).push([[179],{98255:v=>{function S(i){return Promise.resolve().then(()=>{var r=new Error("Cannot find module '"+i+"'");throw r.code="MODULE_NOT_FOUND",r})}S.keys=()=>[],S.resolve=S,S.id=98255,v.exports=S},56083:(v,S,i)=>{"use strict";i.d(S,{l3:()=>p,_j:()=>r,LC:()=>u,ZN:()=>$,jt:()=>e,vP:()=>y,SB:()=>M,oB:()=>T,eR:()=>F,X$:()=>f,ZE:()=>se,k1:()=>ve});class r{}class u{}const p="*";function f(oe,he){return{type:7,name:oe,definitions:he,options:{}}}function e(oe,he=null){return{type:4,styles:he,timings:oe}}function y(oe,he=null){return{type:2,steps:oe,options:he}}function T(oe){return{type:6,styles:oe,offset:null}}function M(oe,he,me){return{type:0,name:oe,styles:he,options:me}}function F(oe,he,me=null){return{type:1,expr:oe,animation:he,options:me}}function ae(oe){Promise.resolve(null).then(oe)}class ${constructor(he=0,me=0){this._onDoneFns=[],this._onStartFns=[],this._onDestroyFns=[],this._started=!1,this._destroyed=!1,this._finished=!1,this._position=0,this.parentPlayer=null,this.totalTime=he+me}_onFinish(){this._finished||(this._finished=!0,this._onDoneFns.forEach(he=>he()),this._onDoneFns=[])}onStart(he){this._onStartFns.push(he)}onDone(he){this._onDoneFns.push(he)}onDestroy(he){this._onDestroyFns.push(he)}hasStarted(){return this._started}init(){}play(){this.hasStarted()||(this._onStart(),this.triggerMicrotask()),this._started=!0}triggerMicrotask(){ae(()=>this._onFinish())}_onStart(){this._onStartFns.forEach(he=>he()),this._onStartFns=[]}pause(){}restart(){}finish(){this._onFinish()}destroy(){this._destroyed||(this._destroyed=!0,this.hasStarted()||this._onStart(),this.finish(),this._onDestroyFns.forEach(he=>he()),this._onDestroyFns=[])}reset(){this._started=!1}setPosition(he){this._position=this.totalTime?he*this.totalTime:1}getPosition(){return this.totalTime?this._position/this.totalTime:1}triggerCallback(he){const me="start"==he?this._onStartFns:this._onDoneFns;me.forEach(Oe=>Oe()),me.length=0}}class se{constructor(he){this._onDoneFns=[],this._onStartFns=[],this._finished=!1,this._started=!1,this._destroyed=!1,this._onDestroyFns=[],this.parentPlayer=null,this.totalTime=0,this.players=he;let me=0,Oe=0,ce=0;const dt=this.players.length;0==dt?ae(()=>this._onFinish()):this.players.forEach(ze=>{ze.onDone(()=>{++me==dt&&this._onFinish()}),ze.onDestroy(()=>{++Oe==dt&&this._onDestroy()}),ze.onStart(()=>{++ce==dt&&this._onStart()})}),this.totalTime=this.players.reduce((ze,Ye)=>Math.max(ze,Ye.totalTime),0)}_onFinish(){this._finished||(this._finished=!0,this._onDoneFns.forEach(he=>he()),this._onDoneFns=[])}init(){this.players.forEach(he=>he.init())}onStart(he){this._onStartFns.push(he)}_onStart(){this.hasStarted()||(this._started=!0,this._onStartFns.forEach(he=>he()),this._onStartFns=[])}onDone(he){this._onDoneFns.push(he)}onDestroy(he){this._onDestroyFns.push(he)}hasStarted(){return this._started}play(){this.parentPlayer||this.init(),this._onStart(),this.players.forEach(he=>he.play())}pause(){this.players.forEach(he=>he.pause())}restart(){this.players.forEach(he=>he.restart())}finish(){this._onFinish(),this.players.forEach(he=>he.finish())}destroy(){this._onDestroy()}_onDestroy(){this._destroyed||(this._destroyed=!0,this._onFinish(),this.players.forEach(he=>he.destroy()),this._onDestroyFns.forEach(he=>he()),this._onDestroyFns=[])}reset(){this.players.forEach(he=>he.reset()),this._destroyed=!1,this._finished=!1,this._started=!1}setPosition(he){const me=he*this.totalTime;this.players.forEach(Oe=>{const ce=Oe.totalTime?Math.min(1,me/Oe.totalTime):1;Oe.setPosition(ce)})}getPosition(){const he=this.players.reduce((me,Oe)=>null===me||Oe.totalTime>me.totalTime?Oe:me,null);return null!=he?he.getPosition():0}beforeDestroy(){this.players.forEach(he=>{he.beforeDestroy&&he.beforeDestroy()})}triggerCallback(he){const me="start"==he?this._onStartFns:this._onDoneFns;me.forEach(Oe=>Oe()),me.length=0}}const ve="!"},12057:(v,S,i)=>{"use strict";i.d(S,{mr:()=>se,Ov:()=>Qs,ez:()=>To,K0:()=>y,uU:()=>Co,JJ:()=>sn,x:()=>je,Do:()=>oe,Gx:()=>ro,Ts:()=>on,Nd:()=>$e,V_:()=>R,Ye:()=>he,S$:()=>ae,i8:()=>Fo,mk:()=>pr,sg:()=>br,O5:()=>Do,PC:()=>yl,RF:()=>qo,n9:()=>ra,ED:()=>Ia,tP:()=>fo,b0:()=>ve,Zx:()=>ei,lw:()=>T,rS:()=>ks,Tn:()=>Ie,gd:()=>ms,EM:()=>$s,JF:()=>jl,p6:()=>hi,Mn:()=>$t,ol:()=>en,UT:()=>Gt,NF:()=>yc,w_:()=>_,bD:()=>Ea,q:()=>p,Mx:()=>Ct,HT:()=>e});var r=i(74788);let u=null;function p(){return u}function e(rt){u||(u=rt)}class _{}const y=new r.OlP("DocumentToken");let T=(()=>{class rt{historyGo(ct){throw new Error("Not implemented")}}return rt.\u0275fac=function(ct){return new(ct||rt)},rt.\u0275prov=(0,r.Yz7)({factory:M,token:rt,providedIn:"platform"}),rt})();function M(){return(0,r.LFG)(F)}const R=new r.OlP("Location Initialized");let F=(()=>{class rt extends T{constructor(ct){super(),this._doc=ct,this._init()}_init(){this.location=window.location,this._history=window.history}getBaseHrefFromDOM(){return p().getBaseHref(this._doc)}onPopState(ct){const Te=p().getGlobalEventTarget(this._doc,"window");return Te.addEventListener("popstate",ct,!1),()=>Te.removeEventListener("popstate",ct)}onHashChange(ct){const Te=p().getGlobalEventTarget(this._doc,"window");return Te.addEventListener("hashchange",ct,!1),()=>Te.removeEventListener("hashchange",ct)}get href(){return this.location.href}get protocol(){return this.location.protocol}get hostname(){return this.location.hostname}get port(){return this.location.port}get pathname(){return this.location.pathname}get search(){return this.location.search}get hash(){return this.location.hash}set pathname(ct){this.location.pathname=ct}pushState(ct,Te,Me){Z()?this._history.pushState(ct,Te,Me):this.location.hash=Me}replaceState(ct,Te,Me){Z()?this._history.replaceState(ct,Te,Me):this.location.hash=Me}forward(){this._history.forward()}back(){this._history.back()}historyGo(ct=0){this._history.go(ct)}getState(){return this._history.state}}return rt.\u0275fac=function(ct){return new(ct||rt)(r.LFG(y))},rt.\u0275prov=(0,r.Yz7)({factory:J,token:rt,providedIn:"platform"}),rt})();function Z(){return!!window.history.pushState}function J(){return new F((0,r.LFG)(y))}function Q(rt,Nt){if(0==rt.length)return Nt;if(0==Nt.length)return rt;let ct=0;return rt.endsWith("/")&&ct++,Nt.startsWith("/")&&ct++,2==ct?rt+Nt.substring(1):1==ct?rt+Nt:rt+"/"+Nt}function ee(rt){const Nt=rt.match(/#|\?|$/),ct=Nt&&Nt.index||rt.length;return rt.slice(0,ct-("/"===rt[ct-1]?1:0))+rt.slice(ct)}function ue(rt){return rt&&"?"!==rt[0]?"?"+rt:rt}let ae=(()=>{class rt{historyGo(ct){throw new Error("Not implemented")}}return rt.\u0275fac=function(ct){return new(ct||rt)},rt.\u0275prov=(0,r.Yz7)({factory:$,token:rt,providedIn:"root"}),rt})();function $(rt){const Nt=(0,r.LFG)(y).location;return new ve((0,r.LFG)(T),Nt&&Nt.origin||"")}const se=new r.OlP("appBaseHref");let ve=(()=>{class rt extends ae{constructor(ct,Te){if(super(),this._platformLocation=ct,this._removeListenerFns=[],null==Te&&(Te=this._platformLocation.getBaseHrefFromDOM()),null==Te)throw new Error("No base href set. Please provide a value for the APP_BASE_HREF token or add a base element to the document.");this._baseHref=Te}ngOnDestroy(){for(;this._removeListenerFns.length;)this._removeListenerFns.pop()()}onPopState(ct){this._removeListenerFns.push(this._platformLocation.onPopState(ct),this._platformLocation.onHashChange(ct))}getBaseHref(){return this._baseHref}prepareExternalUrl(ct){return Q(this._baseHref,ct)}path(ct=!1){const Te=this._platformLocation.pathname+ue(this._platformLocation.search),Me=this._platformLocation.hash;return Me&&ct?`${Te}${Me}`:Te}pushState(ct,Te,Me,De){const Tt=this.prepareExternalUrl(Me+ue(De));this._platformLocation.pushState(ct,Te,Tt)}replaceState(ct,Te,Me,De){const Tt=this.prepareExternalUrl(Me+ue(De));this._platformLocation.replaceState(ct,Te,Tt)}forward(){this._platformLocation.forward()}back(){this._platformLocation.back()}historyGo(ct=0){var Te,Me;null===(Me=(Te=this._platformLocation).historyGo)||void 0===Me||Me.call(Te,ct)}}return rt.\u0275fac=function(ct){return new(ct||rt)(r.LFG(T),r.LFG(se,8))},rt.\u0275prov=r.Yz7({token:rt,factory:rt.\u0275fac}),rt})(),oe=(()=>{class rt extends ae{constructor(ct,Te){super(),this._platformLocation=ct,this._baseHref="",this._removeListenerFns=[],null!=Te&&(this._baseHref=Te)}ngOnDestroy(){for(;this._removeListenerFns.length;)this._removeListenerFns.pop()()}onPopState(ct){this._removeListenerFns.push(this._platformLocation.onPopState(ct),this._platformLocation.onHashChange(ct))}getBaseHref(){return this._baseHref}path(ct=!1){let Te=this._platformLocation.hash;return null==Te&&(Te="#"),Te.length>0?Te.substring(1):Te}prepareExternalUrl(ct){const Te=Q(this._baseHref,ct);return Te.length>0?"#"+Te:Te}pushState(ct,Te,Me,De){let Tt=this.prepareExternalUrl(Me+ue(De));0==Tt.length&&(Tt=this._platformLocation.pathname),this._platformLocation.pushState(ct,Te,Tt)}replaceState(ct,Te,Me,De){let Tt=this.prepareExternalUrl(Me+ue(De));0==Tt.length&&(Tt=this._platformLocation.pathname),this._platformLocation.replaceState(ct,Te,Tt)}forward(){this._platformLocation.forward()}back(){this._platformLocation.back()}historyGo(ct=0){var Te,Me;null===(Me=(Te=this._platformLocation).historyGo)||void 0===Me||Me.call(Te,ct)}}return rt.\u0275fac=function(ct){return new(ct||rt)(r.LFG(T),r.LFG(se,8))},rt.\u0275prov=r.Yz7({token:rt,factory:rt.\u0275fac}),rt})(),he=(()=>{class rt{constructor(ct,Te){this._subject=new r.vpe,this._urlChangeListeners=[],this._platformStrategy=ct;const Me=this._platformStrategy.getBaseHref();this._platformLocation=Te,this._baseHref=ee(ce(Me)),this._platformStrategy.onPopState(De=>{this._subject.emit({url:this.path(!0),pop:!0,state:De.state,type:De.type})})}path(ct=!1){return this.normalize(this._platformStrategy.path(ct))}getState(){return this._platformLocation.getState()}isCurrentPathEqualTo(ct,Te=""){return this.path()==this.normalize(ct+ue(Te))}normalize(ct){return rt.stripTrailingSlash(function(rt,Nt){return rt&&Nt.startsWith(rt)?Nt.substring(rt.length):Nt}(this._baseHref,ce(ct)))}prepareExternalUrl(ct){return ct&&"/"!==ct[0]&&(ct="/"+ct),this._platformStrategy.prepareExternalUrl(ct)}go(ct,Te="",Me=null){this._platformStrategy.pushState(Me,"",ct,Te),this._notifyUrlChangeListeners(this.prepareExternalUrl(ct+ue(Te)),Me)}replaceState(ct,Te="",Me=null){this._platformStrategy.replaceState(Me,"",ct,Te),this._notifyUrlChangeListeners(this.prepareExternalUrl(ct+ue(Te)),Me)}forward(){this._platformStrategy.forward()}back(){this._platformStrategy.back()}historyGo(ct=0){var Te,Me;null===(Me=(Te=this._platformStrategy).historyGo)||void 0===Me||Me.call(Te,ct)}onUrlChange(ct){this._urlChangeListeners.push(ct),this._urlChangeSubscription||(this._urlChangeSubscription=this.subscribe(Te=>{this._notifyUrlChangeListeners(Te.url,Te.state)}))}_notifyUrlChangeListeners(ct="",Te){this._urlChangeListeners.forEach(Me=>Me(ct,Te))}subscribe(ct,Te,Me){return this._subject.subscribe({next:ct,error:Te,complete:Me})}}return rt.\u0275fac=function(ct){return new(ct||rt)(r.LFG(ae),r.LFG(T))},rt.normalizeQueryParams=ue,rt.joinWithSlash=Q,rt.stripTrailingSlash=ee,rt.\u0275prov=(0,r.Yz7)({factory:me,token:rt,providedIn:"root"}),rt})();function me(){return new he((0,r.LFG)(ae),(0,r.LFG)(T))}function ce(rt){return rt.replace(/\/index.html$/,"")}var ze=(()=>((ze=ze||{})[ze.Decimal=0]="Decimal",ze[ze.Percent=1]="Percent",ze[ze.Currency=2]="Currency",ze[ze.Scientific=3]="Scientific",ze))(),Ye=(()=>((Ye=Ye||{})[Ye.Zero=0]="Zero",Ye[Ye.One=1]="One",Ye[Ye.Two=2]="Two",Ye[Ye.Few=3]="Few",Ye[Ye.Many=4]="Many",Ye[Ye.Other=5]="Other",Ye))(),je=(()=>((je=je||{})[je.Format=0]="Format",je[je.Standalone=1]="Standalone",je))(),Ie=(()=>((Ie=Ie||{})[Ie.Narrow=0]="Narrow",Ie[Ie.Abbreviated=1]="Abbreviated",Ie[Ie.Wide=2]="Wide",Ie[Ie.Short=3]="Short",Ie))(),Ve=(()=>((Ve=Ve||{})[Ve.Short=0]="Short",Ve[Ve.Medium=1]="Medium",Ve[Ve.Long=2]="Long",Ve[Ve.Full=3]="Full",Ve))(),He=(()=>((He=He||{})[He.Decimal=0]="Decimal",He[He.Group=1]="Group",He[He.List=2]="List",He[He.PercentSign=3]="PercentSign",He[He.PlusSign=4]="PlusSign",He[He.MinusSign=5]="MinusSign",He[He.Exponential=6]="Exponential",He[He.SuperscriptingExponent=7]="SuperscriptingExponent",He[He.PerMille=8]="PerMille",He[He.Infinity=9]="Infinity",He[He.NaN=10]="NaN",He[He.TimeSeparator=11]="TimeSeparator",He[He.CurrencyDecimal=12]="CurrencyDecimal",He[He.CurrencyGroup=13]="CurrencyGroup",He))();function en(rt,Nt,ct){const Te=(0,r.cg1)(rt),De=di([Te[r.wAp.DayPeriodsFormat],Te[r.wAp.DayPeriodsStandalone]],Nt);return di(De,ct)}function $t(rt,Nt,ct){const Te=(0,r.cg1)(rt),De=di([Te[r.wAp.DaysFormat],Te[r.wAp.DaysStandalone]],Nt);return di(De,ct)}function Gt(rt,Nt,ct){const Te=(0,r.cg1)(rt),De=di([Te[r.wAp.MonthsFormat],Te[r.wAp.MonthsStandalone]],Nt);return di(De,ct)}function Yt(rt,Nt){return di((0,r.cg1)(rt)[r.wAp.DateFormat],Nt)}function Dt(rt,Nt){return di((0,r.cg1)(rt)[r.wAp.TimeFormat],Nt)}function zt(rt,Nt){return di((0,r.cg1)(rt)[r.wAp.DateTimeFormat],Nt)}function Yn(rt,Nt){const ct=(0,r.cg1)(rt),Te=ct[r.wAp.NumberSymbols][Nt];if(void 0===Te){if(Nt===He.CurrencyDecimal)return ct[r.wAp.NumberSymbols][He.Decimal];if(Nt===He.CurrencyGroup)return ct[r.wAp.NumberSymbols][He.Group]}return Te}function Hr(rt,Nt){return(0,r.cg1)(rt)[r.wAp.NumberFormats][Nt]}const Kr=r.kL8;function In(rt){if(!rt[r.wAp.ExtraData])throw new Error(`Missing extra locale data for the locale "${rt[r.wAp.LocaleId]}". Use "registerLocaleData" to load new data. See the "I18n guide" on angular.io to know more.`)}function di(rt,Nt){for(let ct=Nt;ct>-1;ct--)if(void 0!==rt[ct])return rt[ct];throw new Error("Locale data API: locale data undefined")}function $i(rt){const[Nt,ct]=rt.split(":");return{hours:+Nt,minutes:+ct}}const Wt=/^(\d{4})-?(\d\d)-?(\d\d)(?:T(\d\d)(?::?(\d\d)(?::?(\d\d)(?:\.(\d+))?)?)?(Z|([+-])(\d\d):?(\d\d))?)?$/,Jn={},ir=/((?:[^BEGHLMOSWYZabcdhmswyz']+)|(?:'(?:[^']|'')*')|(?:G{1,5}|y{1,4}|Y{1,4}|M{1,5}|L{1,5}|w{1,2}|W{1}|d{1,2}|E{1,6}|c{1,6}|a{1,5}|b{1,5}|B{1,5}|h{1,2}|H{1,2}|m{1,2}|s{1,2}|S{1,3}|z{1,4}|Z{1,5}|O{1,4}))([\s\S]*)/;var Lr=(()=>((Lr=Lr||{})[Lr.Short=0]="Short",Lr[Lr.ShortGMT=1]="ShortGMT",Lr[Lr.Long=2]="Long",Lr[Lr.Extended=3]="Extended",Lr))(),Vn=(()=>((Vn=Vn||{})[Vn.FullYear=0]="FullYear",Vn[Vn.Month=1]="Month",Vn[Vn.Date=2]="Date",Vn[Vn.Hours=3]="Hours",Vn[Vn.Minutes=4]="Minutes",Vn[Vn.Seconds=5]="Seconds",Vn[Vn.FractionalSeconds=6]="FractionalSeconds",Vn[Vn.Day=7]="Day",Vn))(),zr=(()=>((zr=zr||{})[zr.DayPeriods=0]="DayPeriods",zr[zr.Days=1]="Days",zr[zr.Months=2]="Months",zr[zr.Eras=3]="Eras",zr))();function hi(rt,Nt,ct,Te){let Me=function(rt){if(po(rt))return rt;if("number"==typeof rt&&!isNaN(rt))return new Date(rt);if("string"==typeof rt){if(rt=rt.trim(),/^(\d{4}(-\d{1,2}(-\d{1,2})?)?)$/.test(rt)){const[Me,De=1,Tt=1]=rt.split("-").map(dr=>+dr);return Ai(Me,De-1,Tt)}const ct=parseFloat(rt);if(!isNaN(rt-ct))return new Date(ct);let Te;if(Te=rt.match(Wt))return function(rt){const Nt=new Date(0);let ct=0,Te=0;const Me=rt[8]?Nt.setUTCFullYear:Nt.setFullYear,De=rt[8]?Nt.setUTCHours:Nt.setHours;rt[9]&&(ct=Number(rt[9]+rt[10]),Te=Number(rt[9]+rt[11])),Me.call(Nt,Number(rt[1]),Number(rt[2])-1,Number(rt[3]));const Tt=Number(rt[4]||0)-ct,dr=Number(rt[5]||0)-Te,Qi=Number(rt[6]||0),Jo=Math.floor(1e3*parseFloat("0."+(rt[7]||0)));return De.call(Nt,Tt,dr,Qi,Jo),Nt}(Te)}const Nt=new Date(rt);if(!po(Nt))throw new Error(`Unable to convert "${rt}" into a date`);return Nt}(rt);Nt=Tr(ct,Nt)||Nt;let dr,Tt=[];for(;Nt;){if(dr=ir.exec(Nt),!dr){Tt.push(Nt);break}{Tt=Tt.concat(dr.slice(1));const Es=Tt.pop();if(!Es)break;Nt=Es}}let Qi=Me.getTimezoneOffset();Te&&(Qi=Wn(Te,Qi),Me=function(rt,Nt,ct){const Me=rt.getTimezoneOffset();return function(rt,Nt){return(rt=new Date(rt.getTime())).setMinutes(rt.getMinutes()+Nt),rt}(rt,-1*(Wn(Nt,Me)-Me))}(Me,Te));let Jo="";return Tt.forEach(Es=>{const vs=function(rt){if(xt[rt])return xt[rt];let Nt;switch(rt){case"G":case"GG":case"GGG":Nt=zn(zr.Eras,Ie.Abbreviated);break;case"GGGG":Nt=zn(zr.Eras,Ie.Wide);break;case"GGGGG":Nt=zn(zr.Eras,Ie.Narrow);break;case"y":Nt=mr(Vn.FullYear,1,0,!1,!0);break;case"yy":Nt=mr(Vn.FullYear,2,0,!0,!0);break;case"yyy":Nt=mr(Vn.FullYear,3,0,!1,!0);break;case"yyyy":Nt=mr(Vn.FullYear,4,0,!1,!0);break;case"Y":Nt=jt(1);break;case"YY":Nt=jt(2,!0);break;case"YYY":Nt=jt(3);break;case"YYYY":Nt=jt(4);break;case"M":case"L":Nt=mr(Vn.Month,1,1);break;case"MM":case"LL":Nt=mr(Vn.Month,2,1);break;case"MMM":Nt=zn(zr.Months,Ie.Abbreviated);break;case"MMMM":Nt=zn(zr.Months,Ie.Wide);break;case"MMMMM":Nt=zn(zr.Months,Ie.Narrow);break;case"LLL":Nt=zn(zr.Months,Ie.Abbreviated,je.Standalone);break;case"LLLL":Nt=zn(zr.Months,Ie.Wide,je.Standalone);break;case"LLLLL":Nt=zn(zr.Months,Ie.Narrow,je.Standalone);break;case"w":Nt=Dr(1);break;case"ww":Nt=Dr(2);break;case"W":Nt=Dr(1,!0);break;case"d":Nt=mr(Vn.Date,1);break;case"dd":Nt=mr(Vn.Date,2);break;case"c":case"cc":Nt=mr(Vn.Day,1);break;case"ccc":Nt=zn(zr.Days,Ie.Abbreviated,je.Standalone);break;case"cccc":Nt=zn(zr.Days,Ie.Wide,je.Standalone);break;case"ccccc":Nt=zn(zr.Days,Ie.Narrow,je.Standalone);break;case"cccccc":Nt=zn(zr.Days,Ie.Short,je.Standalone);break;case"E":case"EE":case"EEE":Nt=zn(zr.Days,Ie.Abbreviated);break;case"EEEE":Nt=zn(zr.Days,Ie.Wide);break;case"EEEEE":Nt=zn(zr.Days,Ie.Narrow);break;case"EEEEEE":Nt=zn(zr.Days,Ie.Short);break;case"a":case"aa":case"aaa":Nt=zn(zr.DayPeriods,Ie.Abbreviated);break;case"aaaa":Nt=zn(zr.DayPeriods,Ie.Wide);break;case"aaaaa":Nt=zn(zr.DayPeriods,Ie.Narrow);break;case"b":case"bb":case"bbb":Nt=zn(zr.DayPeriods,Ie.Abbreviated,je.Standalone,!0);break;case"bbbb":Nt=zn(zr.DayPeriods,Ie.Wide,je.Standalone,!0);break;case"bbbbb":Nt=zn(zr.DayPeriods,Ie.Narrow,je.Standalone,!0);break;case"B":case"BB":case"BBB":Nt=zn(zr.DayPeriods,Ie.Abbreviated,je.Format,!0);break;case"BBBB":Nt=zn(zr.DayPeriods,Ie.Wide,je.Format,!0);break;case"BBBBB":Nt=zn(zr.DayPeriods,Ie.Narrow,je.Format,!0);break;case"h":Nt=mr(Vn.Hours,1,-12);break;case"hh":Nt=mr(Vn.Hours,2,-12);break;case"H":Nt=mr(Vn.Hours,1);break;case"HH":Nt=mr(Vn.Hours,2);break;case"m":Nt=mr(Vn.Minutes,1);break;case"mm":Nt=mr(Vn.Minutes,2);break;case"s":Nt=mr(Vn.Seconds,1);break;case"ss":Nt=mr(Vn.Seconds,2);break;case"S":Nt=mr(Vn.FractionalSeconds,1);break;case"SS":Nt=mr(Vn.FractionalSeconds,2);break;case"SSS":Nt=mr(Vn.FractionalSeconds,3);break;case"Z":case"ZZ":case"ZZZ":Nt=si(Lr.Short);break;case"ZZZZZ":Nt=si(Lr.Extended);break;case"O":case"OO":case"OOO":case"z":case"zz":case"zzz":Nt=si(Lr.ShortGMT);break;case"OOOO":case"ZZZZ":case"zzzz":Nt=si(Lr.Long);break;default:return null}return xt[rt]=Nt,Nt}(Es);Jo+=vs?vs(Me,ct,Qi):"''"===Es?"'":Es.replace(/(^'|'$)/g,"").replace(/''/g,"'")}),Jo}function Ai(rt,Nt,ct){const Te=new Date(0);return Te.setFullYear(rt,Nt,ct),Te.setHours(0,0,0),Te}function Tr(rt,Nt){const ct=function(rt){return(0,r.cg1)(rt)[r.wAp.LocaleId]}(rt);if(Jn[ct]=Jn[ct]||{},Jn[ct][Nt])return Jn[ct][Nt];let Te="";switch(Nt){case"shortDate":Te=Yt(rt,Ve.Short);break;case"mediumDate":Te=Yt(rt,Ve.Medium);break;case"longDate":Te=Yt(rt,Ve.Long);break;case"fullDate":Te=Yt(rt,Ve.Full);break;case"shortTime":Te=Dt(rt,Ve.Short);break;case"mediumTime":Te=Dt(rt,Ve.Medium);break;case"longTime":Te=Dt(rt,Ve.Long);break;case"fullTime":Te=Dt(rt,Ve.Full);break;case"short":const Me=Tr(rt,"shortTime"),De=Tr(rt,"shortDate");Te=Nr(zt(rt,Ve.Short),[Me,De]);break;case"medium":const Tt=Tr(rt,"mediumTime"),dr=Tr(rt,"mediumDate");Te=Nr(zt(rt,Ve.Medium),[Tt,dr]);break;case"long":const Qi=Tr(rt,"longTime"),Jo=Tr(rt,"longDate");Te=Nr(zt(rt,Ve.Long),[Qi,Jo]);break;case"full":const Es=Tr(rt,"fullTime"),vs=Tr(rt,"fullDate");Te=Nr(zt(rt,Ve.Full),[Es,vs])}return Te&&(Jn[ct][Nt]=Te),Te}function Nr(rt,Nt){return Nt&&(rt=rt.replace(/\{([^}]+)}/g,function(ct,Te){return null!=Nt&&Te in Nt?Nt[Te]:ct})),rt}function gn(rt,Nt,ct="-",Te,Me){let De="";(rt<0||Me&&rt<=0)&&(Me?rt=1-rt:(rt=-rt,De=ct));let Tt=String(rt);for(;Tt.length<Nt;)Tt="0"+Tt;return Te&&(Tt=Tt.substr(Tt.length-Nt)),De+Tt}function mr(rt,Nt,ct=0,Te=!1,Me=!1){return function(De,Tt){let dr=function(rt,Nt){switch(rt){case Vn.FullYear:return Nt.getFullYear();case Vn.Month:return Nt.getMonth();case Vn.Date:return Nt.getDate();case Vn.Hours:return Nt.getHours();case Vn.Minutes:return Nt.getMinutes();case Vn.Seconds:return Nt.getSeconds();case Vn.FractionalSeconds:return Nt.getMilliseconds();case Vn.Day:return Nt.getDay();default:throw new Error(`Unknown DateType value "${rt}".`)}}(rt,De);if((ct>0||dr>-ct)&&(dr+=ct),rt===Vn.Hours)0===dr&&-12===ct&&(dr=12);else if(rt===Vn.FractionalSeconds)return function(rt,Nt){return gn(rt,3).substr(0,Nt)}(dr,Nt);const Qi=Yn(Tt,He.MinusSign);return gn(dr,Nt,Qi,Te,Me)}}function zn(rt,Nt,ct=je.Format,Te=!1){return function(Me,De){return function(rt,Nt,ct,Te,Me,De){switch(ct){case zr.Months:return Gt(Nt,Me,Te)[rt.getMonth()];case zr.Days:return $t(Nt,Me,Te)[rt.getDay()];case zr.DayPeriods:const Tt=rt.getHours(),dr=rt.getMinutes();if(De){const Jo=function(rt){const Nt=(0,r.cg1)(rt);return In(Nt),(Nt[r.wAp.ExtraData][2]||[]).map(Te=>"string"==typeof Te?$i(Te):[$i(Te[0]),$i(Te[1])])}(Nt),Es=function(rt,Nt,ct){const Te=(0,r.cg1)(rt);In(Te);const De=di([Te[r.wAp.ExtraData][0],Te[r.wAp.ExtraData][1]],Nt)||[];return di(De,ct)||[]}(Nt,Me,Te),vs=Jo.findIndex(Ms=>{if(Array.isArray(Ms)){const[Ma,uu]=Ms,Wa=Tt>=Ma.hours&&dr>=Ma.minutes,Pl=Tt<uu.hours||Tt===uu.hours&&dr<uu.minutes;if(Ma.hours<uu.hours){if(Wa&&Pl)return!0}else if(Wa||Pl)return!0}else if(Ms.hours===Tt&&Ms.minutes===dr)return!0;return!1});if(-1!==vs)return Es[vs]}return en(Nt,Me,Te)[Tt<12?0:1];case zr.Eras:return function(rt,Nt){return di((0,r.cg1)(rt)[r.wAp.Eras],Nt)}(Nt,Te)[rt.getFullYear()<=0?0:1];default:throw new Error(`unexpected translation type ${ct}`)}}(Me,De,rt,Nt,ct,Te)}}function si(rt){return function(Nt,ct,Te){const Me=-1*Te,De=Yn(ct,He.MinusSign),Tt=Me>0?Math.floor(Me/60):Math.ceil(Me/60);switch(rt){case Lr.Short:return(Me>=0?"+":"")+gn(Tt,2,De)+gn(Math.abs(Me%60),2,De);case Lr.ShortGMT:return"GMT"+(Me>=0?"+":"")+gn(Tt,1,De);case Lr.Long:return"GMT"+(Me>=0?"+":"")+gn(Tt,2,De)+":"+gn(Math.abs(Me%60),2,De);case Lr.Extended:return 0===Te?"Z":(Me>=0?"+":"")+gn(Tt,2,De)+":"+gn(Math.abs(Me%60),2,De);default:throw new Error(`Unknown zone width "${rt}"`)}}}function Ze(rt){return Ai(rt.getFullYear(),rt.getMonth(),rt.getDate()+(4-rt.getDay()))}function Dr(rt,Nt=!1){return function(ct,Te){let Me;if(Nt){const De=new Date(ct.getFullYear(),ct.getMonth(),1).getDay()-1,Tt=ct.getDate();Me=1+Math.floor((Tt+De)/7)}else{const De=Ze(ct),Tt=function(rt){const Nt=Ai(rt,0,1).getDay();return Ai(rt,0,1+(Nt<=4?4:11)-Nt)}(De.getFullYear()),dr=De.getTime()-Tt.getTime();Me=1+Math.round(dr/6048e5)}return gn(Me,rt,Yn(Te,He.MinusSign))}}function jt(rt,Nt=!1){return function(ct,Te){return gn(Ze(ct).getFullYear(),rt,Yn(Te,He.MinusSign),Nt)}}const xt={};function Wn(rt,Nt){rt=rt.replace(/:/g,"");const ct=Date.parse("Jan 01, 1970 00:00:00 "+rt)/6e4;return isNaN(ct)?Nt:ct}function po(rt){return rt instanceof Date&&!isNaN(rt.valueOf())}const yo=/^(\d+)?\.((\d+)(-(\d+))?)?$/;function cr(rt,Nt,ct,Te,Me,De,Tt=!1){let dr="",Qi=!1;if(isFinite(rt)){let Jo=function(rt){let Te,Me,De,Tt,dr,Nt=Math.abs(rt)+"",ct=0;for((Me=Nt.indexOf("."))>-1&&(Nt=Nt.replace(".","")),(De=Nt.search(/e/i))>0?(Me<0&&(Me=De),Me+=+Nt.slice(De+1),Nt=Nt.substring(0,De)):Me<0&&(Me=Nt.length),De=0;"0"===Nt.charAt(De);De++);if(De===(dr=Nt.length))Te=[0],Me=1;else{for(dr--;"0"===Nt.charAt(dr);)dr--;for(Me-=De,Te=[],Tt=0;De<=dr;De++,Tt++)Te[Tt]=Number(Nt.charAt(De))}return Me>22&&(Te=Te.splice(0,21),ct=Me-1,Me=1),{digits:Te,exponent:ct,integerLen:Me}}(rt);Tt&&(Jo=function(rt){if(0===rt.digits[0])return rt;const Nt=rt.digits.length-rt.integerLen;return rt.exponent?rt.exponent+=2:(0===Nt?rt.digits.push(0,0):1===Nt&&rt.digits.push(0),rt.integerLen+=2),rt}(Jo));let Es=Nt.minInt,vs=Nt.minFrac,Ms=Nt.maxFrac;if(De){const Ol=De.match(yo);if(null===Ol)throw new Error(`${De} is not a valid digit info`);const Ts=Ol[1],Nc=Ol[3],Ec=Ol[5];null!=Ts&&(Es=Li(Ts)),null!=Nc&&(vs=Li(Nc)),null!=Ec?Ms=Li(Ec):null!=Nc&&vs>Ms&&(Ms=vs)}!function(rt,Nt,ct){if(Nt>ct)throw new Error(`The minimum number of digits after fraction (${Nt}) is higher than the maximum (${ct}).`);let Te=rt.digits,Me=Te.length-rt.integerLen;const De=Math.min(Math.max(Nt,Me),ct);let Tt=De+rt.integerLen,dr=Te[Tt];if(Tt>0){Te.splice(Math.max(rt.integerLen,Tt));for(let vs=Tt;vs<Te.length;vs++)Te[vs]=0}else{Me=Math.max(0,Me),rt.integerLen=1,Te.length=Math.max(1,Tt=De+1),Te[0]=0;for(let vs=1;vs<Tt;vs++)Te[vs]=0}if(dr>=5)if(Tt-1<0){for(let vs=0;vs>Tt;vs--)Te.unshift(0),rt.integerLen++;Te.unshift(1),rt.integerLen++}else Te[Tt-1]++;for(;Me<Math.max(0,De);Me++)Te.push(0);let Qi=0!==De;const Jo=Nt+rt.integerLen,Es=Te.reduceRight(function(vs,Ms,Ma,uu){return uu[Ma]=(Ms+=vs)<10?Ms:Ms-10,Qi&&(0===uu[Ma]&&Ma>=Jo?uu.pop():Qi=!1),Ms>=10?1:0},0);Es&&(Te.unshift(Es),rt.integerLen++)}(Jo,vs,Ms);let Ma=Jo.digits,uu=Jo.integerLen;const Wa=Jo.exponent;let Pl=[];for(Qi=Ma.every(Ol=>!Ol);uu<Es;uu++)Ma.unshift(0);for(;uu<0;uu++)Ma.unshift(0);uu>0?Pl=Ma.splice(uu,Ma.length):(Pl=Ma,Ma=[0]);const ec=[];for(Ma.length>=Nt.lgSize&&ec.unshift(Ma.splice(-Nt.lgSize,Ma.length).join(""));Ma.length>Nt.gSize;)ec.unshift(Ma.splice(-Nt.gSize,Ma.length).join(""));Ma.length&&ec.unshift(Ma.join("")),dr=ec.join(Yn(ct,Te)),Pl.length&&(dr+=Yn(ct,Me)+Pl.join("")),Wa&&(dr+=Yn(ct,He.Exponential)+"+"+Wa)}else dr=Yn(ct,He.Infinity);return dr=rt<0&&!Qi?Nt.negPre+dr+Nt.negSuf:Nt.posPre+dr+Nt.posSuf,dr}function ho(rt,Nt="-"){const ct={minInt:1,minFrac:0,maxFrac:0,posPre:"",posSuf:"",negPre:"",negSuf:"",gSize:0,lgSize:0},Te=rt.split(";"),Me=Te[0],De=Te[1],Tt=-1!==Me.indexOf(".")?Me.split("."):[Me.substring(0,Me.lastIndexOf("0")+1),Me.substring(Me.lastIndexOf("0")+1)],dr=Tt[0],Qi=Tt[1]||"";ct.posPre=dr.substr(0,dr.indexOf("#"));for(let Es=0;Es<Qi.length;Es++){const vs=Qi.charAt(Es);"0"===vs?ct.minFrac=ct.maxFrac=Es+1:"#"===vs?ct.maxFrac=Es+1:ct.posSuf+=vs}const Jo=dr.split(",");if(ct.gSize=Jo[1]?Jo[1].length:0,ct.lgSize=Jo[2]||Jo[1]?(Jo[2]||Jo[1]).length:0,De){const Es=Me.length-ct.posPre.length-ct.posSuf.length,vs=De.indexOf("#");ct.negPre=De.substr(0,vs).replace(/'/g,""),ct.negSuf=De.substr(vs+Es).replace(/'/g,"")}else ct.negPre=Nt+ct.posPre,ct.negSuf=ct.posSuf;return ct}function Li(rt){const Nt=parseInt(rt);if(isNaN(Nt))throw new Error("Invalid integer literal when parsing "+rt);return Nt}class ar{}let Ht=(()=>{class rt extends ar{constructor(ct){super(),this.locale=ct}getPluralCategory(ct,Te){switch(Kr(Te||this.locale)(ct)){case Ye.Zero:return"zero";case Ye.One:return"one";case Ye.Two:return"two";case Ye.Few:return"few";case Ye.Many:return"many";default:return"other"}}}return rt.\u0275fac=function(ct){return new(ct||rt)(r.LFG(r.soG))},rt.\u0275prov=r.Yz7({token:rt,factory:rt.\u0275fac}),rt})();function Ct(rt,Nt){Nt=encodeURIComponent(Nt);for(const ct of rt.split(";")){const Te=ct.indexOf("="),[Me,De]=-1==Te?[ct,""]:[ct.slice(0,Te),ct.slice(Te+1)];if(Me.trim()===Nt)return decodeURIComponent(De)}return null}let pr=(()=>{class rt{constructor(ct,Te,Me,De){this._iterableDiffers=ct,this._keyValueDiffers=Te,this._ngEl=Me,this._renderer=De,this._iterableDiffer=null,this._keyValueDiffer=null,this._initialClasses=[],this._rawClass=null}set klass(ct){this._removeClasses(this._initialClasses),this._initialClasses="string"==typeof ct?ct.split(/\s+/):[],this._applyClasses(this._initialClasses),this._applyClasses(this._rawClass)}set ngClass(ct){this._removeClasses(this._rawClass),this._applyClasses(this._initialClasses),this._iterableDiffer=null,this._keyValueDiffer=null,this._rawClass="string"==typeof ct?ct.split(/\s+/):ct,this._rawClass&&((0,r.sIi)(this._rawClass)?this._iterableDiffer=this._iterableDiffers.find(this._rawClass).create():this._keyValueDiffer=this._keyValueDiffers.find(this._rawClass).create())}ngDoCheck(){if(this._iterableDiffer){const ct=this._iterableDiffer.diff(this._rawClass);ct&&this._applyIterableChanges(ct)}else if(this._keyValueDiffer){const ct=this._keyValueDiffer.diff(this._rawClass);ct&&this._applyKeyValueChanges(ct)}}_applyKeyValueChanges(ct){ct.forEachAddedItem(Te=>this._toggleClass(Te.key,Te.currentValue)),ct.forEachChangedItem(Te=>this._toggleClass(Te.key,Te.currentValue)),ct.forEachRemovedItem(Te=>{Te.previousValue&&this._toggleClass(Te.key,!1)})}_applyIterableChanges(ct){ct.forEachAddedItem(Te=>{if("string"!=typeof Te.item)throw new Error(`NgClass can only toggle CSS classes expressed as strings, got ${(0,r.AaK)(Te.item)}`);this._toggleClass(Te.item,!0)}),ct.forEachRemovedItem(Te=>this._toggleClass(Te.item,!1))}_applyClasses(ct){ct&&(Array.isArray(ct)||ct instanceof Set?ct.forEach(Te=>this._toggleClass(Te,!0)):Object.keys(ct).forEach(Te=>this._toggleClass(Te,!!ct[Te])))}_removeClasses(ct){ct&&(Array.isArray(ct)||ct instanceof Set?ct.forEach(Te=>this._toggleClass(Te,!1)):Object.keys(ct).forEach(Te=>this._toggleClass(Te,!1)))}_toggleClass(ct,Te){(ct=ct.trim())&&ct.split(/\s+/g).forEach(Me=>{Te?this._renderer.addClass(this._ngEl.nativeElement,Me):this._renderer.removeClass(this._ngEl.nativeElement,Me)})}}return rt.\u0275fac=function(ct){return new(ct||rt)(r.Y36(r.ZZ4),r.Y36(r.aQg),r.Y36(r.SBq),r.Y36(r.Qsj))},rt.\u0275dir=r.lG2({type:rt,selectors:[["","ngClass",""]],inputs:{klass:["class","klass"],ngClass:"ngClass"}}),rt})();class Cn{constructor(Nt,ct,Te,Me){this.$implicit=Nt,this.ngForOf=ct,this.index=Te,this.count=Me}get first(){return 0===this.index}get last(){return this.index===this.count-1}get even(){return this.index%2==0}get odd(){return!this.even}}let br=(()=>{class rt{constructor(ct,Te,Me){this._viewContainer=ct,this._template=Te,this._differs=Me,this._ngForOf=null,this._ngForOfDirty=!0,this._differ=null}set ngForOf(ct){this._ngForOf=ct,this._ngForOfDirty=!0}set ngForTrackBy(ct){this._trackByFn=ct}get ngForTrackBy(){return this._trackByFn}set ngForTemplate(ct){ct&&(this._template=ct)}ngDoCheck(){if(this._ngForOfDirty){this._ngForOfDirty=!1;const ct=this._ngForOf;if(!this._differ&&ct)try{this._differ=this._differs.find(ct).create(this.ngForTrackBy)}catch(Te){throw new Error(`Cannot find a differ supporting object '${ct}' of type '${function(rt){return rt.name||typeof rt}(ct)}'. NgFor only supports binding to Iterables such as Arrays.`)}}if(this._differ){const ct=this._differ.diff(this._ngForOf);ct&&this._applyChanges(ct)}}_applyChanges(ct){const Te=[];ct.forEachOperation((Me,De,Tt)=>{if(null==Me.previousIndex){const dr=this._viewContainer.createEmbeddedView(this._template,new Cn(null,this._ngForOf,-1,-1),null===Tt?void 0:Tt),Qi=new zi(Me,dr);Te.push(Qi)}else if(null==Tt)this._viewContainer.remove(null===De?void 0:De);else if(null!==De){const dr=this._viewContainer.get(De);this._viewContainer.move(dr,Tt);const Qi=new zi(Me,dr);Te.push(Qi)}});for(let Me=0;Me<Te.length;Me++)this._perViewChange(Te[Me].view,Te[Me].record);for(let Me=0,De=this._viewContainer.length;Me<De;Me++){const Tt=this._viewContainer.get(Me);Tt.context.index=Me,Tt.context.count=De,Tt.context.ngForOf=this._ngForOf}ct.forEachIdentityChange(Me=>{this._viewContainer.get(Me.currentIndex).context.$implicit=Me.item})}_perViewChange(ct,Te){ct.context.$implicit=Te.item}static ngTemplateContextGuard(ct,Te){return!0}}return rt.\u0275fac=function(ct){return new(ct||rt)(r.Y36(r.s_b),r.Y36(r.Rgc),r.Y36(r.ZZ4))},rt.\u0275dir=r.lG2({type:rt,selectors:[["","ngFor","","ngForOf",""]],inputs:{ngForOf:"ngForOf",ngForTrackBy:"ngForTrackBy",ngForTemplate:"ngForTemplate"}}),rt})();class zi{constructor(Nt,ct){this.record=Nt,this.view=ct}}let Do=(()=>{class rt{constructor(ct,Te){this._viewContainer=ct,this._context=new Js,this._thenTemplateRef=null,this._elseTemplateRef=null,this._thenViewRef=null,this._elseViewRef=null,this._thenTemplateRef=Te}set ngIf(ct){this._context.$implicit=this._context.ngIf=ct,this._updateView()}set ngIfThen(ct){_s("ngIfThen",ct),this._thenTemplateRef=ct,this._thenViewRef=null,this._updateView()}set ngIfElse(ct){_s("ngIfElse",ct),this._elseTemplateRef=ct,this._elseViewRef=null,this._updateView()}_updateView(){this._context.$implicit?this._thenViewRef||(this._viewContainer.clear(),this._elseViewRef=null,this._thenTemplateRef&&(this._thenViewRef=this._viewContainer.createEmbeddedView(this._thenTemplateRef,this._context))):this._elseViewRef||(this._viewContainer.clear(),this._thenViewRef=null,this._elseTemplateRef&&(this._elseViewRef=this._viewContainer.createEmbeddedView(this._elseTemplateRef,this._context)))}static ngTemplateContextGuard(ct,Te){return!0}}return rt.\u0275fac=function(ct){return new(ct||rt)(r.Y36(r.s_b),r.Y36(r.Rgc))},rt.\u0275dir=r.lG2({type:rt,selectors:[["","ngIf",""]],inputs:{ngIf:"ngIf",ngIfThen:"ngIfThen",ngIfElse:"ngIfElse"}}),rt})();class Js{constructor(){this.$implicit=null,this.ngIf=null}}function _s(rt,Nt){if(Nt&&!Nt.createEmbeddedView)throw new Error(`${rt} must be a TemplateRef, but received '${(0,r.AaK)(Nt)}'.`)}class bs{constructor(Nt,ct){this._viewContainerRef=Nt,this._templateRef=ct,this._created=!1}create(){this._created=!0,this._viewContainerRef.createEmbeddedView(this._templateRef)}destroy(){this._created=!1,this._viewContainerRef.clear()}enforceState(Nt){Nt&&!this._created?this.create():!Nt&&this._created&&this.destroy()}}let qo=(()=>{class rt{constructor(){this._defaultUsed=!1,this._caseCount=0,this._lastCaseCheckIndex=0,this._lastCasesMatched=!1}set ngSwitch(ct){this._ngSwitch=ct,0===this._caseCount&&this._updateDefaultCases(!0)}_addCase(){return this._caseCount++}_addDefault(ct){this._defaultViews||(this._defaultViews=[]),this._defaultViews.push(ct)}_matchCase(ct){const Te=ct==this._ngSwitch;return this._lastCasesMatched=this._lastCasesMatched||Te,this._lastCaseCheckIndex++,this._lastCaseCheckIndex===this._caseCount&&(this._updateDefaultCases(!this._lastCasesMatched),this._lastCaseCheckIndex=0,this._lastCasesMatched=!1),Te}_updateDefaultCases(ct){if(this._defaultViews&&ct!==this._defaultUsed){this._defaultUsed=ct;for(let Te=0;Te<this._defaultViews.length;Te++)this._defaultViews[Te].enforceState(ct)}}}return rt.\u0275fac=function(ct){return new(ct||rt)},rt.\u0275dir=r.lG2({type:rt,selectors:[["","ngSwitch",""]],inputs:{ngSwitch:"ngSwitch"}}),rt})(),ra=(()=>{class rt{constructor(ct,Te,Me){this.ngSwitch=Me,Me._addCase(),this._view=new bs(ct,Te)}ngDoCheck(){this._view.enforceState(this.ngSwitch._matchCase(this.ngSwitchCase))}}return rt.\u0275fac=function(ct){return new(ct||rt)(r.Y36(r.s_b),r.Y36(r.Rgc),r.Y36(qo,9))},rt.\u0275dir=r.lG2({type:rt,selectors:[["","ngSwitchCase",""]],inputs:{ngSwitchCase:"ngSwitchCase"}}),rt})(),Ia=(()=>{class rt{constructor(ct,Te,Me){Me._addDefault(new bs(ct,Te))}}return rt.\u0275fac=function(ct){return new(ct||rt)(r.Y36(r.s_b),r.Y36(r.Rgc),r.Y36(qo,9))},rt.\u0275dir=r.lG2({type:rt,selectors:[["","ngSwitchDefault",""]]}),rt})(),yl=(()=>{class rt{constructor(ct,Te,Me){this._ngEl=ct,this._differs=Te,this._renderer=Me,this._ngStyle=null,this._differ=null}set ngStyle(ct){this._ngStyle=ct,!this._differ&&ct&&(this._differ=this._differs.find(ct).create())}ngDoCheck(){if(this._differ){const ct=this._differ.diff(this._ngStyle);ct&&this._applyChanges(ct)}}_setStyle(ct,Te){const[Me,De]=ct.split(".");null!=(Te=null!=Te&&De?`${Te}${De}`:Te)?this._renderer.setStyle(this._ngEl.nativeElement,Me,Te):this._renderer.removeStyle(this._ngEl.nativeElement,Me)}_applyChanges(ct){ct.forEachRemovedItem(Te=>this._setStyle(Te.key,null)),ct.forEachAddedItem(Te=>this._setStyle(Te.key,Te.currentValue)),ct.forEachChangedItem(Te=>this._setStyle(Te.key,Te.currentValue))}}return rt.\u0275fac=function(ct){return new(ct||rt)(r.Y36(r.SBq),r.Y36(r.aQg),r.Y36(r.Qsj))},rt.\u0275dir=r.lG2({type:rt,selectors:[["","ngStyle",""]],inputs:{ngStyle:"ngStyle"}}),rt})(),fo=(()=>{class rt{constructor(ct){this._viewContainerRef=ct,this._viewRef=null,this.ngTemplateOutletContext=null,this.ngTemplateOutlet=null}ngOnChanges(ct){if(ct.ngTemplateOutlet){const Te=this._viewContainerRef;this._viewRef&&Te.remove(Te.indexOf(this._viewRef)),this._viewRef=this.ngTemplateOutlet?Te.createEmbeddedView(this.ngTemplateOutlet,this.ngTemplateOutletContext):null}else this._viewRef&&ct.ngTemplateOutletContext&&this.ngTemplateOutletContext&&(this._viewRef.context=this.ngTemplateOutletContext)}}return rt.\u0275fac=function(ct){return new(ct||rt)(r.Y36(r.s_b))},rt.\u0275dir=r.lG2({type:rt,selectors:[["","ngTemplateOutlet",""]],inputs:{ngTemplateOutletContext:"ngTemplateOutletContext",ngTemplateOutlet:"ngTemplateOutlet"},features:[r.TTD]}),rt})();function Ao(rt,Nt){return Error(`InvalidPipeArgument: '${Nt}' for pipe '${(0,r.AaK)(rt)}'`)}class ls{createSubscription(Nt,ct){return Nt.subscribe({next:ct,error:Te=>{throw Te}})}dispose(Nt){Nt.unsubscribe()}onDestroy(Nt){Nt.unsubscribe()}}class gs{createSubscription(Nt,ct){return Nt.then(ct,Te=>{throw Te})}dispose(Nt){}onDestroy(Nt){}}const Ra=new gs,pl=new ls;let Qs=(()=>{class rt{constructor(ct){this._ref=ct,this._latestValue=null,this._subscription=null,this._obj=null,this._strategy=null}ngOnDestroy(){this._subscription&&this._dispose()}transform(ct){return this._obj?ct!==this._obj?(this._dispose(),this.transform(ct)):this._latestValue:(ct&&this._subscribe(ct),this._latestValue)}_subscribe(ct){this._obj=ct,this._strategy=this._selectStrategy(ct),this._subscription=this._strategy.createSubscription(ct,Te=>this._updateLatestValue(ct,Te))}_selectStrategy(ct){if((0,r.QGY)(ct))return Ra;if((0,r.F4k)(ct))return pl;throw Ao(rt,ct)}_dispose(){this._strategy.dispose(this._subscription),this._latestValue=null,this._subscription=null,this._obj=null}_updateLatestValue(ct,Te){ct===this._obj&&(this._latestValue=Te,this._ref.markForCheck())}}return rt.\u0275fac=function(ct){return new(ct||rt)(r.Y36(r.sBO,16))},rt.\u0275pipe=r.Yjl({name:"async",type:rt,pure:!1}),rt})(),Fo=(()=>{class rt{transform(ct){if(null==ct)return null;if("string"!=typeof ct)throw Ao(rt,ct);return ct.toLowerCase()}}return rt.\u0275fac=function(ct){return new(ct||rt)},rt.\u0275pipe=r.Yjl({name:"lowercase",type:rt,pure:!0}),rt})();const Eo=/(?:[0-9A-Za-z\xAA\xB5\xBA\xC0-\xD6\xD8-\xF6\xF8-\u02C1\u02C6-\u02D1\u02E0-\u02E4\u02EC\u02EE\u0370-\u0374\u0376\u0377\u037A-\u037D\u037F\u0386\u0388-\u038A\u038C\u038E-\u03A1\u03A3-\u03F5\u03F7-\u0481\u048A-\u052F\u0531-\u0556\u0559\u0560-\u0588\u05D0-\u05EA\u05EF-\u05F2\u0620-\u064A\u066E\u066F\u0671-\u06D3\u06D5\u06E5\u06E6\u06EE\u06EF\u06FA-\u06FC\u06FF\u0710\u0712-\u072F\u074D-\u07A5\u07B1\u07CA-\u07EA\u07F4\u07F5\u07FA\u0800-\u0815\u081A\u0824\u0828\u0840-\u0858\u0860-\u086A\u0870-\u0887\u0889-\u088E\u08A0-\u08C9\u0904-\u0939\u093D\u0950\u0958-\u0961\u0971-\u0980\u0985-\u098C\u098F\u0990\u0993-\u09A8\u09AA-\u09B0\u09B2\u09B6-\u09B9\u09BD\u09CE\u09DC\u09DD\u09DF-\u09E1\u09F0\u09F1\u09FC\u0A05-\u0A0A\u0A0F\u0A10\u0A13-\u0A28\u0A2A-\u0A30\u0A32\u0A33\u0A35\u0A36\u0A38\u0A39\u0A59-\u0A5C\u0A5E\u0A72-\u0A74\u0A85-\u0A8D\u0A8F-\u0A91\u0A93-\u0AA8\u0AAA-\u0AB0\u0AB2\u0AB3\u0AB5-\u0AB9\u0ABD\u0AD0\u0AE0\u0AE1\u0AF9\u0B05-\u0B0C\u0B0F\u0B10\u0B13-\u0B28\u0B2A-\u0B30\u0B32\u0B33\u0B35-\u0B39\u0B3D\u0B5C\u0B5D\u0B5F-\u0B61\u0B71\u0B83\u0B85-\u0B8A\u0B8E-\u0B90\u0B92-\u0B95\u0B99\u0B9A\u0B9C\u0B9E\u0B9F\u0BA3\u0BA4\u0BA8-\u0BAA\u0BAE-\u0BB9\u0BD0\u0C05-\u0C0C\u0C0E-\u0C10\u0C12-\u0C28\u0C2A-\u0C39\u0C3D\u0C58-\u0C5A\u0C5D\u0C60\u0C61\u0C80\u0C85-\u0C8C\u0C8E-\u0C90\u0C92-\u0CA8\u0CAA-\u0CB3\u0CB5-\u0CB9\u0CBD\u0CDD\u0CDE\u0CE0\u0CE1\u0CF1\u0CF2\u0D04-\u0D0C\u0D0E-\u0D10\u0D12-\u0D3A\u0D3D\u0D4E\u0D54-\u0D56\u0D5F-\u0D61\u0D7A-\u0D7F\u0D85-\u0D96\u0D9A-\u0DB1\u0DB3-\u0DBB\u0DBD\u0DC0-\u0DC6\u0E01-\u0E30\u0E32\u0E33\u0E40-\u0E46\u0E81\u0E82\u0E84\u0E86-\u0E8A\u0E8C-\u0EA3\u0EA5\u0EA7-\u0EB0\u0EB2\u0EB3\u0EBD\u0EC0-\u0EC4\u0EC6\u0EDC-\u0EDF\u0F00\u0F40-\u0F47\u0F49-\u0F6C\u0F88-\u0F8C\u1000-\u102A\u103F\u1050-\u1055\u105A-\u105D\u1061\u1065\u1066\u106E-\u1070\u1075-\u1081\u108E\u10A0-\u10C5\u10C7\u10CD\u10D0-\u10FA\u10FC-\u1248\u124A-\u124D\u1250-\u1256\u1258\u125A-\u125D\u1260-\u1288\u128A-\u128D\u1290-\u12B0\u12B2-\u12B5\u12B8-\u12BE\u12C0\u12C2-\u12C5\u12C8-\u12D6\u12D8-\u1310\u1312-\u1315\u1318-\u135A\u1380-\u138F\u13A0-\u13F5\u13F8-\u13FD\u1401-\u166C\u166F-\u167F\u1681-\u169A\u16A0-\u16EA\u16F1-\u16F8\u1700-\u1711\u171F-\u1731\u1740-\u1751\u1760-\u176C\u176E-\u1770\u1780-\u17B3\u17D7\u17DC\u1820-\u1878\u1880-\u1884\u1887-\u18A8\u18AA\u18B0-\u18F5\u1900-\u191E\u1950-\u196D\u1970-\u1974\u1980-\u19AB\u19B0-\u19C9\u1A00-\u1A16\u1A20-\u1A54\u1AA7\u1B05-\u1B33\u1B45-\u1B4C\u1B83-\u1BA0\u1BAE\u1BAF\u1BBA-\u1BE5\u1C00-\u1C23\u1C4D-\u1C4F\u1C5A-\u1C7D\u1C80-\u1C88\u1C90-\u1CBA\u1CBD-\u1CBF\u1CE9-\u1CEC\u1CEE-\u1CF3\u1CF5\u1CF6\u1CFA\u1D00-\u1DBF\u1E00-\u1F15\u1F18-\u1F1D\u1F20-\u1F45\u1F48-\u1F4D\u1F50-\u1F57\u1F59\u1F5B\u1F5D\u1F5F-\u1F7D\u1F80-\u1FB4\u1FB6-\u1FBC\u1FBE\u1FC2-\u1FC4\u1FC6-\u1FCC\u1FD0-\u1FD3\u1FD6-\u1FDB\u1FE0-\u1FEC\u1FF2-\u1FF4\u1FF6-\u1FFC\u2071\u207F\u2090-\u209C\u2102\u2107\u210A-\u2113\u2115\u2119-\u211D\u2124\u2126\u2128\u212A-\u212D\u212F-\u2139\u213C-\u213F\u2145-\u2149\u214E\u2183\u2184\u2C00-\u2CE4\u2CEB-\u2CEE\u2CF2\u2CF3\u2D00-\u2D25\u2D27\u2D2D\u2D30-\u2D67\u2D6F\u2D80-\u2D96\u2DA0-\u2DA6\u2DA8-\u2DAE\u2DB0-\u2DB6\u2DB8-\u2DBE\u2DC0-\u2DC6\u2DC8-\u2DCE\u2DD0-\u2DD6\u2DD8-\u2DDE\u2E2F\u3005\u3006\u3031-\u3035\u303B\u303C\u3041-\u3096\u309D-\u309F\u30A1-\u30FA\u30FC-\u30FF\u3105-\u312F\u3131-\u318E\u31A0-\u31BF\u31F0-\u31FF\u3400-\u4DBF\u4E00-\uA48C\uA4D0-\uA4FD\uA500-\uA60C\uA610-\uA61F\uA62A\uA62B\uA640-\uA66E\uA67F-\uA69D\uA6A0-\uA6E5\uA717-\uA71F\uA722-\uA788\uA78B-\uA7CA\uA7D0\uA7D1\uA7D3\uA7D5-\uA7D9\uA7F2-\uA801\uA803-\uA805\uA807-\uA80A\uA80C-\uA822\uA840-\uA873\uA882-\uA8B3\uA8F2-\uA8F7\uA8FB\uA8FD\uA8FE\uA90A-\uA925\uA930-\uA946\uA960-\uA97C\uA984-\uA9B2\uA9CF\uA9E0-\uA9E4\uA9E6-\uA9EF\uA9FA-\uA9FE\uAA00-\uAA28\uAA40-\uAA42\uAA44-\uAA4B\uAA60-\uAA76\uAA7A\uAA7E-\uAAAF\uAAB1\uAAB5\uAAB6\uAAB9-\uAABD\uAAC0\uAAC2\uAADB-\uAADD\uAAE0-\uAAEA\uAAF2-\uAAF4\uAB01-\uAB06\uAB09-\uAB0E\uAB11-\uAB16\uAB20-\uAB26\uAB28-\uAB2E\uAB30-\uAB5A\uAB5C-\uAB69\uAB70-\uABE2\uAC00-\uD7A3\uD7B0-\uD7C6\uD7CB-\uD7FB\uF900-\uFA6D\uFA70-\uFAD9\uFB00-\uFB06\uFB13-\uFB17\uFB1D\uFB1F-\uFB28\uFB2A-\uFB36\uFB38-\uFB3C\uFB3E\uFB40\uFB41\uFB43\uFB44\uFB46-\uFBB1\uFBD3-\uFD3D\uFD50-\uFD8F\uFD92-\uFDC7\uFDF0-\uFDFB\uFE70-\uFE74\uFE76-\uFEFC\uFF21-\uFF3A\uFF41-\uFF5A\uFF66-\uFFBE\uFFC2-\uFFC7\uFFCA-\uFFCF\uFFD2-\uFFD7\uFFDA-\uFFDC]|\uD800[\uDC00-\uDC0B\uDC0D-\uDC26\uDC28-\uDC3A\uDC3C\uDC3D\uDC3F-\uDC4D\uDC50-\uDC5D\uDC80-\uDCFA\uDE80-\uDE9C\uDEA0-\uDED0\uDF00-\uDF1F\uDF2D-\uDF40\uDF42-\uDF49\uDF50-\uDF75\uDF80-\uDF9D\uDFA0-\uDFC3\uDFC8-\uDFCF]|\uD801[\uDC00-\uDC9D\uDCB0-\uDCD3\uDCD8-\uDCFB\uDD00-\uDD27\uDD30-\uDD63\uDD70-\uDD7A\uDD7C-\uDD8A\uDD8C-\uDD92\uDD94\uDD95\uDD97-\uDDA1\uDDA3-\uDDB1\uDDB3-\uDDB9\uDDBB\uDDBC\uDE00-\uDF36\uDF40-\uDF55\uDF60-\uDF67\uDF80-\uDF85\uDF87-\uDFB0\uDFB2-\uDFBA]|\uD802[\uDC00-\uDC05\uDC08\uDC0A-\uDC35\uDC37\uDC38\uDC3C\uDC3F-\uDC55\uDC60-\uDC76\uDC80-\uDC9E\uDCE0-\uDCF2\uDCF4\uDCF5\uDD00-\uDD15\uDD20-\uDD39\uDD80-\uDDB7\uDDBE\uDDBF\uDE00\uDE10-\uDE13\uDE15-\uDE17\uDE19-\uDE35\uDE60-\uDE7C\uDE80-\uDE9C\uDEC0-\uDEC7\uDEC9-\uDEE4\uDF00-\uDF35\uDF40-\uDF55\uDF60-\uDF72\uDF80-\uDF91]|\uD803[\uDC00-\uDC48\uDC80-\uDCB2\uDCC0-\uDCF2\uDD00-\uDD23\uDE80-\uDEA9\uDEB0\uDEB1\uDF00-\uDF1C\uDF27\uDF30-\uDF45\uDF70-\uDF81\uDFB0-\uDFC4\uDFE0-\uDFF6]|\uD804[\uDC03-\uDC37\uDC71\uDC72\uDC75\uDC83-\uDCAF\uDCD0-\uDCE8\uDD03-\uDD26\uDD44\uDD47\uDD50-\uDD72\uDD76\uDD83-\uDDB2\uDDC1-\uDDC4\uDDDA\uDDDC\uDE00-\uDE11\uDE13-\uDE2B\uDE80-\uDE86\uDE88\uDE8A-\uDE8D\uDE8F-\uDE9D\uDE9F-\uDEA8\uDEB0-\uDEDE\uDF05-\uDF0C\uDF0F\uDF10\uDF13-\uDF28\uDF2A-\uDF30\uDF32\uDF33\uDF35-\uDF39\uDF3D\uDF50\uDF5D-\uDF61]|\uD805[\uDC00-\uDC34\uDC47-\uDC4A\uDC5F-\uDC61\uDC80-\uDCAF\uDCC4\uDCC5\uDCC7\uDD80-\uDDAE\uDDD8-\uDDDB\uDE00-\uDE2F\uDE44\uDE80-\uDEAA\uDEB8\uDF00-\uDF1A\uDF40-\uDF46]|\uD806[\uDC00-\uDC2B\uDCA0-\uDCDF\uDCFF-\uDD06\uDD09\uDD0C-\uDD13\uDD15\uDD16\uDD18-\uDD2F\uDD3F\uDD41\uDDA0-\uDDA7\uDDAA-\uDDD0\uDDE1\uDDE3\uDE00\uDE0B-\uDE32\uDE3A\uDE50\uDE5C-\uDE89\uDE9D\uDEB0-\uDEF8]|\uD807[\uDC00-\uDC08\uDC0A-\uDC2E\uDC40\uDC72-\uDC8F\uDD00-\uDD06\uDD08\uDD09\uDD0B-\uDD30\uDD46\uDD60-\uDD65\uDD67\uDD68\uDD6A-\uDD89\uDD98\uDEE0-\uDEF2\uDFB0]|\uD808[\uDC00-\uDF99]|\uD809[\uDC80-\uDD43]|\uD80B[\uDF90-\uDFF0]|[\uD80C\uD81C-\uD820\uD822\uD840-\uD868\uD86A-\uD86C\uD86F-\uD872\uD874-\uD879\uD880-\uD883][\uDC00-\uDFFF]|\uD80D[\uDC00-\uDC2E]|\uD811[\uDC00-\uDE46]|\uD81A[\uDC00-\uDE38\uDE40-\uDE5E\uDE70-\uDEBE\uDED0-\uDEED\uDF00-\uDF2F\uDF40-\uDF43\uDF63-\uDF77\uDF7D-\uDF8F]|\uD81B[\uDE40-\uDE7F\uDF00-\uDF4A\uDF50\uDF93-\uDF9F\uDFE0\uDFE1\uDFE3]|\uD821[\uDC00-\uDFF7]|\uD823[\uDC00-\uDCD5\uDD00-\uDD08]|\uD82B[\uDFF0-\uDFF3\uDFF5-\uDFFB\uDFFD\uDFFE]|\uD82C[\uDC00-\uDD22\uDD50-\uDD52\uDD64-\uDD67\uDD70-\uDEFB]|\uD82F[\uDC00-\uDC6A\uDC70-\uDC7C\uDC80-\uDC88\uDC90-\uDC99]|\uD835[\uDC00-\uDC54\uDC56-\uDC9C\uDC9E\uDC9F\uDCA2\uDCA5\uDCA6\uDCA9-\uDCAC\uDCAE-\uDCB9\uDCBB\uDCBD-\uDCC3\uDCC5-\uDD05\uDD07-\uDD0A\uDD0D-\uDD14\uDD16-\uDD1C\uDD1E-\uDD39\uDD3B-\uDD3E\uDD40-\uDD44\uDD46\uDD4A-\uDD50\uDD52-\uDEA5\uDEA8-\uDEC0\uDEC2-\uDEDA\uDEDC-\uDEFA\uDEFC-\uDF14\uDF16-\uDF34\uDF36-\uDF4E\uDF50-\uDF6E\uDF70-\uDF88\uDF8A-\uDFA8\uDFAA-\uDFC2\uDFC4-\uDFCB]|\uD837[\uDF00-\uDF1E]|\uD838[\uDD00-\uDD2C\uDD37-\uDD3D\uDD4E\uDE90-\uDEAD\uDEC0-\uDEEB]|\uD839[\uDFE0-\uDFE6\uDFE8-\uDFEB\uDFED\uDFEE\uDFF0-\uDFFE]|\uD83A[\uDC00-\uDCC4\uDD00-\uDD43\uDD4B]|\uD83B[\uDE00-\uDE03\uDE05-\uDE1F\uDE21\uDE22\uDE24\uDE27\uDE29-\uDE32\uDE34-\uDE37\uDE39\uDE3B\uDE42\uDE47\uDE49\uDE4B\uDE4D-\uDE4F\uDE51\uDE52\uDE54\uDE57\uDE59\uDE5B\uDE5D\uDE5F\uDE61\uDE62\uDE64\uDE67-\uDE6A\uDE6C-\uDE72\uDE74-\uDE77\uDE79-\uDE7C\uDE7E\uDE80-\uDE89\uDE8B-\uDE9B\uDEA1-\uDEA3\uDEA5-\uDEA9\uDEAB-\uDEBB]|\uD869[\uDC00-\uDEDF\uDF00-\uDFFF]|\uD86D[\uDC00-\uDF38\uDF40-\uDFFF]|\uD86E[\uDC00-\uDC1D\uDC20-\uDFFF]|\uD873[\uDC00-\uDEA1\uDEB0-\uDFFF]|\uD87A[\uDC00-\uDFE0]|\uD87E[\uDC00-\uDE1D]|\uD884[\uDC00-\uDF4A])\S*/g;let ks=(()=>{class rt{transform(ct){if(null==ct)return null;if("string"!=typeof ct)throw Ao(rt,ct);return ct.replace(Eo,Te=>Te[0].toUpperCase()+Te.substr(1).toLowerCase())}}return rt.\u0275fac=function(ct){return new(ct||rt)},rt.\u0275pipe=r.Yjl({name:"titlecase",type:rt,pure:!0}),rt})(),ms=(()=>{class rt{transform(ct){if(null==ct)return null;if("string"!=typeof ct)throw Ao(rt,ct);return ct.toUpperCase()}}return rt.\u0275fac=function(ct){return new(ct||rt)},rt.\u0275pipe=r.Yjl({name:"uppercase",type:rt,pure:!0}),rt})(),Co=(()=>{class rt{constructor(ct){this.locale=ct}transform(ct,Te="mediumDate",Me,De){if(null==ct||""===ct||ct!=ct)return null;try{return hi(ct,Te,De||this.locale,Me)}catch(Tt){throw Ao(rt,Tt.message)}}}return rt.\u0275fac=function(ct){return new(ct||rt)(r.Y36(r.soG,16))},rt.\u0275pipe=r.Yjl({name:"date",type:rt,pure:!0}),rt})();const kr=/#/g;let ro=(()=>{class rt{constructor(ct){this._localization=ct}transform(ct,Te,Me){if(null==ct)return"";if("object"!=typeof Te||null===Te)throw Ao(rt,Te);return Te[function(rt,Nt,ct,Te){let Me=`=${rt}`;if(Nt.indexOf(Me)>-1||(Me=ct.getPluralCategory(rt,Te),Nt.indexOf(Me)>-1))return Me;if(Nt.indexOf("other")>-1)return"other";throw new Error(`No plural message found for value "${rt}"`)}(ct,Object.keys(Te),this._localization,Me)].replace(kr,ct.toString())}}return rt.\u0275fac=function(ct){return new(ct||rt)(r.Y36(ar,16))},rt.\u0275pipe=r.Yjl({name:"i18nPlural",type:rt,pure:!0}),rt})(),on=(()=>{class rt{transform(ct){return JSON.stringify(ct,null,2)}}return rt.\u0275fac=function(ct){return new(ct||rt)},rt.\u0275pipe=r.Yjl({name:"json",type:rt,pure:!1}),rt})(),$e=(()=>{class rt{constructor(ct){this.differs=ct,this.keyValues=[],this.compareFn=Pt}transform(ct,Te=Pt){if(!ct||!(ct instanceof Map)&&"object"!=typeof ct)return null;this.differ||(this.differ=this.differs.find(ct).create());const Me=this.differ.diff(ct),De=Te!==this.compareFn;return Me&&(this.keyValues=[],Me.forEachItem(Tt=>{this.keyValues.push(function(rt,Nt){return{key:rt,value:Nt}}(Tt.key,Tt.currentValue))})),(Me||De)&&(this.keyValues.sort(Te),this.compareFn=Te),this.keyValues}}return rt.\u0275fac=function(ct){return new(ct||rt)(r.Y36(r.aQg,16))},rt.\u0275pipe=r.Yjl({name:"keyvalue",type:rt,pure:!1}),rt})();function Pt(rt,Nt){const ct=rt.key,Te=Nt.key;if(ct===Te)return 0;if(void 0===ct)return 1;if(void 0===Te)return-1;if(null===ct)return 1;if(null===Te)return-1;if("string"==typeof ct&&"string"==typeof Te)return ct<Te?-1:1;if("number"==typeof ct&&"number"==typeof Te)return ct-Te;if("boolean"==typeof ct&&"boolean"==typeof Te)return ct<Te?-1:1;const Me=String(ct),De=String(Te);return Me==De?0:Me<De?-1:1}let sn=(()=>{class rt{constructor(ct){this._locale=ct}transform(ct,Te,Me){if(!Oi(ct))return null;Me=Me||this._locale;try{return function(rt,Nt,ct){return cr(rt,ho(Hr(Nt,ze.Decimal),Yn(Nt,He.MinusSign)),Nt,He.Group,He.Decimal,ct)}(os(ct),Me,Te)}catch(De){throw Ao(rt,De.message)}}}return rt.\u0275fac=function(ct){return new(ct||rt)(r.Y36(r.soG,16))},rt.\u0275pipe=r.Yjl({name:"number",type:rt,pure:!0}),rt})(),ei=(()=>{class rt{constructor(ct){this._locale=ct}transform(ct,Te,Me){if(!Oi(ct))return null;Me=Me||this._locale;try{return function(rt,Nt,ct){return cr(rt,ho(Hr(Nt,ze.Percent),Yn(Nt,He.MinusSign)),Nt,He.Group,He.Decimal,ct,!0).replace(new RegExp("%","g"),Yn(Nt,He.PercentSign))}(os(ct),Me,Te)}catch(De){throw Ao(rt,De.message)}}}return rt.\u0275fac=function(ct){return new(ct||rt)(r.Y36(r.soG,16))},rt.\u0275pipe=r.Yjl({name:"percent",type:rt,pure:!0}),rt})();function Oi(rt){return!(null==rt||""===rt||rt!=rt)}function os(rt){if("string"==typeof rt&&!isNaN(Number(rt)-parseFloat(rt)))return Number(rt);if("number"!=typeof rt)throw new Error(`${rt} is not a number`);return rt}let To=(()=>{class rt{}return rt.\u0275fac=function(ct){return new(ct||rt)},rt.\u0275mod=r.oAB({type:rt}),rt.\u0275inj=r.cJS({providers:[{provide:ar,useClass:Ht}]}),rt})();const Ea="browser";function yc(rt){return rt===Ea}let $s=(()=>{class rt{}return rt.\u0275prov=(0,r.Yz7)({token:rt,providedIn:"root",factory:()=>new dc((0,r.LFG)(y),window)}),rt})();class dc{constructor(Nt,ct){this.document=Nt,this.window=ct,this.offset=()=>[0,0]}setOffset(Nt){this.offset=Array.isArray(Nt)?()=>Nt:Nt}getScrollPosition(){return this.supportsScrolling()?[this.window.pageXOffset,this.window.pageYOffset]:[0,0]}scrollToPosition(Nt){this.supportsScrolling()&&this.window.scrollTo(Nt[0],Nt[1])}scrollToAnchor(Nt){if(!this.supportsScrolling())return;const ct=function(rt,Nt){const ct=rt.getElementById(Nt)||rt.getElementsByName(Nt)[0];if(ct)return ct;if("function"==typeof rt.createTreeWalker&&rt.body&&(rt.body.createShadowRoot||rt.body.attachShadow)){const Te=rt.createTreeWalker(rt.body,NodeFilter.SHOW_ELEMENT);let Me=Te.currentNode;for(;Me;){const De=Me.shadowRoot;if(De){const Tt=De.getElementById(Nt)||De.querySelector(`[name="${Nt}"]`);if(Tt)return Tt}Me=Te.nextNode()}}return null}(this.document,Nt);ct&&(this.scrollToElement(ct),this.attemptFocus(ct))}setHistoryScrollRestoration(Nt){if(this.supportScrollRestoration()){const ct=this.window.history;ct&&ct.scrollRestoration&&(ct.scrollRestoration=Nt)}}scrollToElement(Nt){const ct=Nt.getBoundingClientRect(),Te=ct.left+this.window.pageXOffset,Me=ct.top+this.window.pageYOffset,De=this.offset();this.window.scrollTo(Te-De[0],Me-De[1])}attemptFocus(Nt){return Nt.focus(),this.document.activeElement===Nt}supportScrollRestoration(){try{if(!this.supportsScrolling())return!1;const Nt=ou(this.window.history)||ou(Object.getPrototypeOf(this.window.history));return!(!Nt||!Nt.writable&&!Nt.set)}catch(Nt){return!1}}supportsScrolling(){try{return!!this.window&&!!this.window.scrollTo&&"pageXOffset"in this.window}catch(Nt){return!1}}}function ou(rt){return Object.getOwnPropertyDescriptor(rt,"scrollRestoration")}class jl{}},58497:(v,S,i)=>{"use strict";i.d(S,{TP:()=>st,eN:()=>He,JF:()=>di,UA:()=>Ie,LE:()=>ae});var r=i(12057),u=i(74788),p=i(25917),f=i(18891),e=i(94612),_=i(45435),y=i(88002);class T{}class M{}class R{constructor(On){this.normalizedNames=new Map,this.lazyUpdate=null,On?this.lazyInit="string"==typeof On?()=>{this.headers=new Map,On.split("\n").forEach(Wt=>{const Jn=Wt.indexOf(":");if(Jn>0){const ir=Wt.slice(0,Jn),Lr=ir.toLowerCase(),Vn=Wt.slice(Jn+1).trim();this.maybeSetNormalizedName(ir,Lr),this.headers.has(Lr)?this.headers.get(Lr).push(Vn):this.headers.set(Lr,[Vn])}})}:()=>{this.headers=new Map,Object.keys(On).forEach(Wt=>{let Jn=On[Wt];const ir=Wt.toLowerCase();"string"==typeof Jn&&(Jn=[Jn]),Jn.length>0&&(this.headers.set(ir,Jn),this.maybeSetNormalizedName(Wt,ir))})}:this.headers=new Map}has(On){return this.init(),this.headers.has(On.toLowerCase())}get(On){this.init();const Wt=this.headers.get(On.toLowerCase());return Wt&&Wt.length>0?Wt[0]:null}keys(){return this.init(),Array.from(this.normalizedNames.values())}getAll(On){return this.init(),this.headers.get(On.toLowerCase())||null}append(On,Wt){return this.clone({name:On,value:Wt,op:"a"})}set(On,Wt){return this.clone({name:On,value:Wt,op:"s"})}delete(On,Wt){return this.clone({name:On,value:Wt,op:"d"})}maybeSetNormalizedName(On,Wt){this.normalizedNames.has(Wt)||this.normalizedNames.set(Wt,On)}init(){this.lazyInit&&(this.lazyInit instanceof R?this.copyFrom(this.lazyInit):this.lazyInit(),this.lazyInit=null,this.lazyUpdate&&(this.lazyUpdate.forEach(On=>this.applyUpdate(On)),this.lazyUpdate=null))}copyFrom(On){On.init(),Array.from(On.headers.keys()).forEach(Wt=>{this.headers.set(Wt,On.headers.get(Wt)),this.normalizedNames.set(Wt,On.normalizedNames.get(Wt))})}clone(On){const Wt=new R;return Wt.lazyInit=this.lazyInit&&this.lazyInit instanceof R?this.lazyInit:this,Wt.lazyUpdate=(this.lazyUpdate||[]).concat([On]),Wt}applyUpdate(On){const Wt=On.name.toLowerCase();switch(On.op){case"a":case"s":let Jn=On.value;if("string"==typeof Jn&&(Jn=[Jn]),0===Jn.length)return;this.maybeSetNormalizedName(On.name,Wt);const ir=("a"===On.op?this.headers.get(Wt):void 0)||[];ir.push(...Jn),this.headers.set(Wt,ir);break;case"d":const Lr=On.value;if(Lr){let Vn=this.headers.get(Wt);if(!Vn)return;Vn=Vn.filter(zr=>-1===Lr.indexOf(zr)),0===Vn.length?(this.headers.delete(Wt),this.normalizedNames.delete(Wt)):this.headers.set(Wt,Vn)}else this.headers.delete(Wt),this.normalizedNames.delete(Wt)}}forEach(On){this.init(),Array.from(this.normalizedNames.keys()).forEach(Wt=>On(this.normalizedNames.get(Wt),this.headers.get(Wt)))}}class F{encodeKey(On){return ee(On)}encodeValue(On){return ee(On)}decodeKey(On){return decodeURIComponent(On)}decodeValue(On){return decodeURIComponent(On)}}const J=/%(\d[a-f0-9])/gi,Q={40:"@","3A":":",24:"$","2C":",","3B":";","2B":"+","3D":"=","3F":"?","2F":"/"};function ee(Br){return encodeURIComponent(Br).replace(J,(On,Wt)=>{var Jn;return null!==(Jn=Q[Wt])&&void 0!==Jn?Jn:On})}function ue(Br){return`${Br}`}class ae{constructor(On={}){if(this.updates=null,this.cloneFrom=null,this.encoder=On.encoder||new F,On.fromString){if(On.fromObject)throw new Error("Cannot specify both fromString and fromObject.");this.map=function(Br,On){const Wt=new Map;return Br.length>0&&Br.replace(/^\?/,"").split("&").forEach(ir=>{const Lr=ir.indexOf("="),[Vn,zr]=-1==Lr?[On.decodeKey(ir),""]:[On.decodeKey(ir.slice(0,Lr)),On.decodeValue(ir.slice(Lr+1))],hi=Wt.get(Vn)||[];hi.push(zr),Wt.set(Vn,hi)}),Wt}(On.fromString,this.encoder)}else On.fromObject?(this.map=new Map,Object.keys(On.fromObject).forEach(Wt=>{const Jn=On.fromObject[Wt];this.map.set(Wt,Array.isArray(Jn)?Jn:[Jn])})):this.map=null}has(On){return this.init(),this.map.has(On)}get(On){this.init();const Wt=this.map.get(On);return Wt?Wt[0]:null}getAll(On){return this.init(),this.map.get(On)||null}keys(){return this.init(),Array.from(this.map.keys())}append(On,Wt){return this.clone({param:On,value:Wt,op:"a"})}appendAll(On){const Wt=[];return Object.keys(On).forEach(Jn=>{const ir=On[Jn];Array.isArray(ir)?ir.forEach(Lr=>{Wt.push({param:Jn,value:Lr,op:"a"})}):Wt.push({param:Jn,value:ir,op:"a"})}),this.clone(Wt)}set(On,Wt){return this.clone({param:On,value:Wt,op:"s"})}delete(On,Wt){return this.clone({param:On,value:Wt,op:"d"})}toString(){return this.init(),this.keys().map(On=>{const Wt=this.encoder.encodeKey(On);return this.map.get(On).map(Jn=>Wt+"="+this.encoder.encodeValue(Jn)).join("&")}).filter(On=>""!==On).join("&")}clone(On){const Wt=new ae({encoder:this.encoder});return Wt.cloneFrom=this.cloneFrom||this,Wt.updates=(this.updates||[]).concat(On),Wt}init(){null===this.map&&(this.map=new Map),null!==this.cloneFrom&&(this.cloneFrom.init(),this.cloneFrom.keys().forEach(On=>this.map.set(On,this.cloneFrom.map.get(On))),this.updates.forEach(On=>{switch(On.op){case"a":case"s":const Wt=("a"===On.op?this.map.get(On.param):void 0)||[];Wt.push(ue(On.value)),this.map.set(On.param,Wt);break;case"d":if(void 0===On.value){this.map.delete(On.param);break}{let Jn=this.map.get(On.param)||[];const ir=Jn.indexOf(ue(On.value));-1!==ir&&Jn.splice(ir,1),Jn.length>0?this.map.set(On.param,Jn):this.map.delete(On.param)}}}),this.cloneFrom=this.updates=null)}}class se{constructor(){this.map=new Map}set(On,Wt){return this.map.set(On,Wt),this}get(On){return this.map.has(On)||this.map.set(On,On.defaultValue()),this.map.get(On)}delete(On){return this.map.delete(On),this}keys(){return this.map.keys()}}function oe(Br){return"undefined"!=typeof ArrayBuffer&&Br instanceof ArrayBuffer}function he(Br){return"undefined"!=typeof Blob&&Br instanceof Blob}function me(Br){return"undefined"!=typeof FormData&&Br instanceof FormData}class ce{constructor(On,Wt,Jn,ir){let Lr;if(this.url=Wt,this.body=null,this.reportProgress=!1,this.withCredentials=!1,this.responseType="json",this.method=On.toUpperCase(),function(Br){switch(Br){case"DELETE":case"GET":case"HEAD":case"OPTIONS":case"JSONP":return!1;default:return!0}}(this.method)||ir?(this.body=void 0!==Jn?Jn:null,Lr=ir):Lr=Jn,Lr&&(this.reportProgress=!!Lr.reportProgress,this.withCredentials=!!Lr.withCredentials,Lr.responseType&&(this.responseType=Lr.responseType),Lr.headers&&(this.headers=Lr.headers),Lr.context&&(this.context=Lr.context),Lr.params&&(this.params=Lr.params)),this.headers||(this.headers=new R),this.context||(this.context=new se),this.params){const Vn=this.params.toString();if(0===Vn.length)this.urlWithParams=Wt;else{const zr=Wt.indexOf("?");this.urlWithParams=Wt+(-1===zr?"?":zr<Wt.length-1?"&":"")+Vn}}else this.params=new ae,this.urlWithParams=Wt}serializeBody(){return null===this.body?null:oe(this.body)||he(this.body)||me(this.body)||"undefined"!=typeof URLSearchParams&&this.body instanceof URLSearchParams||"string"==typeof this.body?this.body:this.body instanceof ae?this.body.toString():"object"==typeof this.body||"boolean"==typeof this.body||Array.isArray(this.body)?JSON.stringify(this.body):this.body.toString()}detectContentTypeHeader(){return null===this.body||me(this.body)?null:he(this.body)?this.body.type||null:oe(this.body)?null:"string"==typeof this.body?"text/plain":this.body instanceof ae?"application/x-www-form-urlencoded;charset=UTF-8":"object"==typeof this.body||"number"==typeof this.body||"boolean"==typeof this.body?"application/json":null}clone(On={}){var Wt;const Jn=On.method||this.method,ir=On.url||this.url,Lr=On.responseType||this.responseType,Vn=void 0!==On.body?On.body:this.body,zr=void 0!==On.withCredentials?On.withCredentials:this.withCredentials,hi=void 0!==On.reportProgress?On.reportProgress:this.reportProgress;let Ai=On.headers||this.headers,Tr=On.params||this.params;const Nr=null!==(Wt=On.context)&&void 0!==Wt?Wt:this.context;return void 0!==On.setHeaders&&(Ai=Object.keys(On.setHeaders).reduce((gn,En)=>gn.set(En,On.setHeaders[En]),Ai)),On.setParams&&(Tr=Object.keys(On.setParams).reduce((gn,En)=>gn.set(En,On.setParams[En]),Tr)),new ce(Jn,ir,Vn,{params:Tr,headers:Ai,context:Nr,reportProgress:hi,responseType:Lr,withCredentials:zr})}}var dt=(()=>((dt=dt||{})[dt.Sent=0]="Sent",dt[dt.UploadProgress=1]="UploadProgress",dt[dt.ResponseHeader=2]="ResponseHeader",dt[dt.DownloadProgress=3]="DownloadProgress",dt[dt.Response=4]="Response",dt[dt.User=5]="User",dt))();class ze{constructor(On,Wt=200,Jn="OK"){this.headers=On.headers||new R,this.status=void 0!==On.status?On.status:Wt,this.statusText=On.statusText||Jn,this.url=On.url||null,this.ok=this.status>=200&&this.status<300}}class Ye extends ze{constructor(On={}){super(On),this.type=dt.ResponseHeader}clone(On={}){return new Ye({headers:On.headers||this.headers,status:void 0!==On.status?On.status:this.status,statusText:On.statusText||this.statusText,url:On.url||this.url||void 0})}}class je extends ze{constructor(On={}){super(On),this.type=dt.Response,this.body=void 0!==On.body?On.body:null}clone(On={}){return new je({body:void 0!==On.body?On.body:this.body,headers:On.headers||this.headers,status:void 0!==On.status?On.status:this.status,statusText:On.statusText||this.statusText,url:On.url||this.url||void 0})}}class Ie extends ze{constructor(On){super(On,0,"Unknown Error"),this.name="HttpErrorResponse",this.ok=!1,this.message=this.status>=200&&this.status<300?`Http failure during parsing for ${On.url||"(unknown url)"}`:`Http failure response for ${On.url||"(unknown url)"}: ${On.status} ${On.statusText}`,this.error=On.error||null}}function Ve(Br,On){return{body:On,headers:Br.headers,context:Br.context,observe:Br.observe,params:Br.params,reportProgress:Br.reportProgress,responseType:Br.responseType,withCredentials:Br.withCredentials}}let He=(()=>{class Br{constructor(Wt){this.handler=Wt}request(Wt,Jn,ir={}){let Lr;if(Wt instanceof ce)Lr=Wt;else{let hi,Ai;hi=ir.headers instanceof R?ir.headers:new R(ir.headers),ir.params&&(Ai=ir.params instanceof ae?ir.params:new ae({fromObject:ir.params})),Lr=new ce(Wt,Jn,void 0!==ir.body?ir.body:null,{headers:hi,context:ir.context,params:Ai,reportProgress:ir.reportProgress,responseType:ir.responseType||"json",withCredentials:ir.withCredentials})}const Vn=(0,p.of)(Lr).pipe((0,e.b)(hi=>this.handler.handle(hi)));if(Wt instanceof ce||"events"===ir.observe)return Vn;const zr=Vn.pipe((0,_.h)(hi=>hi instanceof je));switch(ir.observe||"body"){case"body":switch(Lr.responseType){case"arraybuffer":return zr.pipe((0,y.U)(hi=>{if(null!==hi.body&&!(hi.body instanceof ArrayBuffer))throw new Error("Response is not an ArrayBuffer.");return hi.body}));case"blob":return zr.pipe((0,y.U)(hi=>{if(null!==hi.body&&!(hi.body instanceof Blob))throw new Error("Response is not a Blob.");return hi.body}));case"text":return zr.pipe((0,y.U)(hi=>{if(null!==hi.body&&"string"!=typeof hi.body)throw new Error("Response is not a string.");return hi.body}));case"json":default:return zr.pipe((0,y.U)(hi=>hi.body))}case"response":return zr;default:throw new Error(`Unreachable: unhandled observe type ${ir.observe}}`)}}delete(Wt,Jn={}){return this.request("DELETE",Wt,Jn)}get(Wt,Jn={}){return this.request("GET",Wt,Jn)}head(Wt,Jn={}){return this.request("HEAD",Wt,Jn)}jsonp(Wt,Jn){return this.request("JSONP",Wt,{params:(new ae).append(Jn,"JSONP_CALLBACK"),observe:"body",responseType:"json"})}options(Wt,Jn={}){return this.request("OPTIONS",Wt,Jn)}patch(Wt,Jn,ir={}){return this.request("PATCH",Wt,Ve(ir,Jn))}post(Wt,Jn,ir={}){return this.request("POST",Wt,Ve(ir,Jn))}put(Wt,Jn,ir={}){return this.request("PUT",Wt,Ve(ir,Jn))}}return Br.\u0275fac=function(Wt){return new(Wt||Br)(u.LFG(T))},Br.\u0275prov=u.Yz7({token:Br,factory:Br.\u0275fac}),Br})();class Zt{constructor(On,Wt){this.next=On,this.interceptor=Wt}handle(On){return this.interceptor.intercept(On,this.next)}}const st=new u.OlP("HTTP_INTERCEPTORS");let en=(()=>{class Br{intercept(Wt,Jn){return Jn.handle(Wt)}}return Br.\u0275fac=function(Wt){return new(Wt||Br)},Br.\u0275prov=u.Yz7({token:Br,factory:Br.\u0275fac}),Br})();const zt=/^\)\]\}',?\n/;let Hr=(()=>{class Br{constructor(Wt){this.xhrFactory=Wt}handle(Wt){if("JSONP"===Wt.method)throw new Error("Attempted to construct Jsonp request without HttpClientJsonpModule installed.");return new f.y(Jn=>{const ir=this.xhrFactory.build();if(ir.open(Wt.method,Wt.urlWithParams),Wt.withCredentials&&(ir.withCredentials=!0),Wt.headers.forEach((En,mr)=>ir.setRequestHeader(En,mr.join(","))),Wt.headers.has("Accept")||ir.setRequestHeader("Accept","application/json, text/plain, */*"),!Wt.headers.has("Content-Type")){const En=Wt.detectContentTypeHeader();null!==En&&ir.setRequestHeader("Content-Type",En)}if(Wt.responseType){const En=Wt.responseType.toLowerCase();ir.responseType="json"!==En?En:"text"}const Lr=Wt.serializeBody();let Vn=null;const zr=()=>{if(null!==Vn)return Vn;const En=1223===ir.status?204:ir.status,mr=ir.statusText||"OK",Xt=new R(ir.getAllResponseHeaders()),zn=function(Br){return"responseURL"in Br&&Br.responseURL?Br.responseURL:/^X-Request-URL:/m.test(Br.getAllResponseHeaders())?Br.getResponseHeader("X-Request-URL"):null}(ir)||Wt.url;return Vn=new Ye({headers:Xt,status:En,statusText:mr,url:zn}),Vn},hi=()=>{let{headers:En,status:mr,statusText:Xt,url:zn}=zr(),vr=null;204!==mr&&(vr=void 0===ir.response?ir.responseText:ir.response),0===mr&&(mr=vr?200:0);let si=mr>=200&&mr<300;if("json"===Wt.responseType&&"string"==typeof vr){const Ii=vr;vr=vr.replace(zt,"");try{vr=""!==vr?JSON.parse(vr):null}catch(no){vr=Ii,si&&(si=!1,vr={error:no,text:vr})}}si?(Jn.next(new je({body:vr,headers:En,status:mr,statusText:Xt,url:zn||void 0})),Jn.complete()):Jn.error(new Ie({error:vr,headers:En,status:mr,statusText:Xt,url:zn||void 0}))},Ai=En=>{const{url:mr}=zr(),Xt=new Ie({error:En,status:ir.status||0,statusText:ir.statusText||"Unknown Error",url:mr||void 0});Jn.error(Xt)};let Tr=!1;const Nr=En=>{Tr||(Jn.next(zr()),Tr=!0);let mr={type:dt.DownloadProgress,loaded:En.loaded};En.lengthComputable&&(mr.total=En.total),"text"===Wt.responseType&&!!ir.responseText&&(mr.partialText=ir.responseText),Jn.next(mr)},gn=En=>{let mr={type:dt.UploadProgress,loaded:En.loaded};En.lengthComputable&&(mr.total=En.total),Jn.next(mr)};return ir.addEventListener("load",hi),ir.addEventListener("error",Ai),ir.addEventListener("timeout",Ai),ir.addEventListener("abort",Ai),Wt.reportProgress&&(ir.addEventListener("progress",Nr),null!==Lr&&ir.upload&&ir.upload.addEventListener("progress",gn)),ir.send(Lr),Jn.next({type:dt.Sent}),()=>{ir.removeEventListener("error",Ai),ir.removeEventListener("abort",Ai),ir.removeEventListener("load",hi),ir.removeEventListener("timeout",Ai),Wt.reportProgress&&(ir.removeEventListener("progress",Nr),null!==Lr&&ir.upload&&ir.upload.removeEventListener("progress",gn)),ir.readyState!==ir.DONE&&ir.abort()}})}}return Br.\u0275fac=function(Wt){return new(Wt||Br)(u.LFG(r.JF))},Br.\u0275prov=u.Yz7({token:Br,factory:Br.\u0275fac}),Br})();const ci=new u.OlP("XSRF_COOKIE_NAME"),Ir=new u.OlP("XSRF_HEADER_NAME");class wr{}let Qr=(()=>{class Br{constructor(Wt,Jn,ir){this.doc=Wt,this.platform=Jn,this.cookieName=ir,this.lastCookieString="",this.lastToken=null,this.parseCount=0}getToken(){if("server"===this.platform)return null;const Wt=this.doc.cookie||"";return Wt!==this.lastCookieString&&(this.parseCount++,this.lastToken=(0,r.Mx)(Wt,this.cookieName),this.lastCookieString=Wt),this.lastToken}}return Br.\u0275fac=function(Wt){return new(Wt||Br)(u.LFG(r.K0),u.LFG(u.Lbi),u.LFG(ci))},Br.\u0275prov=u.Yz7({token:Br,factory:Br.\u0275fac}),Br})(),Kr=(()=>{class Br{constructor(Wt,Jn){this.tokenService=Wt,this.headerName=Jn}intercept(Wt,Jn){const ir=Wt.url.toLowerCase();if("GET"===Wt.method||"HEAD"===Wt.method||ir.startsWith("http://")||ir.startsWith("https://"))return Jn.handle(Wt);const Lr=this.tokenService.getToken();return null!==Lr&&!Wt.headers.has(this.headerName)&&(Wt=Wt.clone({headers:Wt.headers.set(this.headerName,Lr)})),Jn.handle(Wt)}}return Br.\u0275fac=function(Wt){return new(Wt||Br)(u.LFG(wr),u.LFG(Ir))},Br.\u0275prov=u.Yz7({token:Br,factory:Br.\u0275fac}),Br})(),In=(()=>{class Br{constructor(Wt,Jn){this.backend=Wt,this.injector=Jn,this.chain=null}handle(Wt){if(null===this.chain){const Jn=this.injector.get(st,[]);this.chain=Jn.reduceRight((ir,Lr)=>new Zt(ir,Lr),this.backend)}return this.chain.handle(Wt)}}return Br.\u0275fac=function(Wt){return new(Wt||Br)(u.LFG(M),u.LFG(u.zs3))},Br.\u0275prov=u.Yz7({token:Br,factory:Br.\u0275fac}),Br})(),Ur=(()=>{class Br{static disable(){return{ngModule:Br,providers:[{provide:Kr,useClass:en}]}}static withOptions(Wt={}){return{ngModule:Br,providers:[Wt.cookieName?{provide:ci,useValue:Wt.cookieName}:[],Wt.headerName?{provide:Ir,useValue:Wt.headerName}:[]]}}}return Br.\u0275fac=function(Wt){return new(Wt||Br)},Br.\u0275mod=u.oAB({type:Br}),Br.\u0275inj=u.cJS({providers:[Kr,{provide:st,useExisting:Kr,multi:!0},{provide:wr,useClass:Qr},{provide:ci,useValue:"XSRF-TOKEN"},{provide:Ir,useValue:"X-XSRF-TOKEN"}]}),Br})(),di=(()=>{class Br{}return Br.\u0275fac=function(Wt){return new(Wt||Br)},Br.\u0275mod=u.oAB({type:Br}),Br.\u0275inj=u.cJS({providers:[He,{provide:T,useClass:In},Hr,{provide:M,useExisting:Hr}],imports:[[Ur.withOptions({cookieName:"XSRF-TOKEN",headerName:"X-XSRF-TOKEN"})]]}),Br})()},74788:(v,S,i)=>{"use strict";i.d(S,{deG:()=>yd,tb:()=>MT,AFp:()=>D2,ip1:()=>TT,CZH:()=>Gv,hGG:()=>e3,z2F:()=>m0,sBO:()=>$w,Sil:()=>da,_Vd:()=>kv,UuU:()=>Ew,EJc:()=>OT,SBq:()=>sg,qLn:()=>Zf,vpe:()=>ug,gxx:()=>Gg,tBr:()=>ga,XFs:()=>Ur,OlP:()=>Xl,zs3:()=>Gu,IIB:()=>A2,ZZ4:()=>Ny,aQg:()=>Py,soG:()=>Qy,YKP:()=>vM,v3s:()=>W2,h0i:()=>Wm,PXZ:()=>RD,R0b:()=>Np,FiY:()=>sa,r_U:()=>pD,Lbi:()=>CT,g9A:()=>p0,Qsj:()=>Cw,FYo:()=>Ry,JOm:()=>Bd,Tiy:()=>YE,q3G:()=>zs,tp0:()=>ol,EAV:()=>UD,Rgc:()=>j1,dDg:()=>RT,DyG:()=>kf,GfV:()=>cM,i9L:()=>dp,s_b:()=>Fy,ifc:()=>Vn,eFA:()=>tb,G48:()=>AD,Gpc:()=>F,X6Q:()=>qy,_c5:()=>WD,VLi:()=>MD,c2e:()=>Jy,zSh:()=>Hm,wAp:()=>Za,vHH:()=>ee,EiD:()=>ts,mCW:()=>vf,qzn:()=>Uf,JVY:()=>Ed,pB0:()=>Oh,eBb:()=>qp,L6k:()=>Ah,LAX:()=>eh,cg1:()=>ME,Tjo:()=>GD,kL8:()=>wC,yhl:()=>Kp,dqk:()=>Nr,sIi:()=>Zm,CqO:()=>cE,QGY:()=>$1,F4k:()=>Rv,RDi:()=>el,AaK:()=>T,z3N:()=>kd,qOj:()=>D1,TTD:()=>To,_Bn:()=>HE,xp6:()=>La,uIk:()=>I1,Tol:()=>oC,Gre:()=>gC,MT6:()=>mC,DjV:()=>vC,ekj:()=>mE,Suo:()=>la,Xpm:()=>jt,lG2:()=>po,Yz7:()=>Dt,cJS:()=>Yn,oAB:()=>wn,Yjl:()=>yo,Y36:()=>k1,_UZ:()=>kS,GkF:()=>HS,BQk:()=>uE,ynx:()=>lE,qZA:()=>aE,TgZ:()=>sE,EpF:()=>US,n5z:()=>Ff,Ikx:()=>SE,SDv:()=>qC,QtT:()=>tM,DtL:()=>eM,N_p:()=>xy,pQV:()=>IE,Zx4:()=>nM,tHW:()=>PE,LFG:()=>Rn,$8M:()=>Tl,NdJ:()=>dE,CRH:()=>l2,oxw:()=>jS,ALo:()=>r2,lcZ:()=>i2,xi3:()=>Dg,Dn7:()=>o2,Hsn:()=>VS,F$t:()=>GS,Q6J:()=>iE,s9C:()=>pE,MGl:()=>by,hYB:()=>hE,DdM:()=>i0,VKq:()=>sT,WLB:()=>XM,kEZ:()=>KM,l5B:()=>qM,qbA:()=>e2,iGM:()=>Su,MAs:()=>Ke,pYS:()=>jf,Jf7:()=>Lh,CHM:()=>Aa,oJD:()=>_c,uOi:()=>Hd,LSH:()=>wu,kYT:()=>nr,Udp:()=>gE,d8E:()=>CE,YNc:()=>H,W1O:()=>Gy,_uU:()=>Ty,Oqu:()=>bE,hij:()=>Sy,AsE:()=>EE,lnq:()=>TE,Gf:()=>a2});var r=i(79765),u=i(75319),p=i(18891),f=i(66682),e=i(18819);function _(a){for(let l in a)if(a[l]===_)return l;throw Error("Could not find renamed property on target object.")}function y(a,l){for(const d in l)l.hasOwnProperty(d)&&!a.hasOwnProperty(d)&&(a[d]=l[d])}function T(a){if("string"==typeof a)return a;if(Array.isArray(a))return"["+a.map(T).join(", ")+"]";if(null==a)return""+a;if(a.overriddenName)return`${a.overriddenName}`;if(a.name)return`${a.name}`;const l=a.toString();if(null==l)return""+l;const d=l.indexOf("\n");return-1===d?l:l.substring(0,d)}function M(a,l){return null==a||""===a?null===l?"":l:null==l||""===l?a:a+" "+l}const R=_({__forward_ref__:_});function F(a){return a.__forward_ref__=F,a.toString=function(){return T(this())},a}function Z(a){return J(a)?a():a}function J(a){return"function"==typeof a&&a.hasOwnProperty(R)&&a.__forward_ref__===F}class ee extends Error{constructor(l,d){super(function(a,l){return`${a?`NG0${a}: `:""}${l}`}(l,d)),this.code=l}}function $(a){return"string"==typeof a?a:null==a?"":String(a)}function se(a){return"function"==typeof a?a.name||a.toString():"object"==typeof a&&null!=a&&"function"==typeof a.type?a.type.name||a.type.toString():$(a)}function me(a,l){const d=l?` in ${l}`:"";throw new ee("201",`No provider for ${se(a)} found${d}`)}function Ut(a,l,d,m){throw new Error(`ASSERTION ERROR: ${a}`+(null==m?"":` [Expected=> ${d} ${m} ${l} <=Actual]`))}function Dt(a){return{token:a.token,providedIn:a.providedIn||null,factory:a.factory,value:void 0}}function Yn(a){return{providers:a.providers||[],imports:a.imports||[]}}function Hr(a){return ci(a,Kr)||ci(a,Hn)}function ci(a,l){return a.hasOwnProperty(l)?a[l]:null}function Qr(a){return a&&(a.hasOwnProperty(In)||a.hasOwnProperty(Zr))?a[In]:null}const Kr=_({\u0275prov:_}),In=_({\u0275inj:_}),Hn=_({ngInjectableDef:_}),Zr=_({ngInjectorDef:_});var Ur=(()=>((Ur=Ur||{})[Ur.Default=0]="Default",Ur[Ur.Host=1]="Host",Ur[Ur.Self=2]="Self",Ur[Ur.SkipSelf=4]="SkipSelf",Ur[Ur.Optional=8]="Optional",Ur))();let di;function Hi(a){const l=di;return di=a,l}function Br(a,l,d){const m=Hr(a);return m&&"root"==m.providedIn?void 0===m.value?m.value=m.factory():m.value:d&Ur.Optional?null:void 0!==l?l:void me(T(a),"Injector")}function Wt(a){return{toString:a}.toString()}var Jn=(()=>((Jn=Jn||{})[Jn.OnPush=0]="OnPush",Jn[Jn.Default=1]="Default",Jn))(),Vn=(()=>((Vn=Vn||{})[Vn.Emulated=0]="Emulated",Vn[Vn.None=2]="None",Vn[Vn.ShadowDom=3]="ShadowDom",Vn))();const zr="undefined"!=typeof globalThis&&globalThis,hi="undefined"!=typeof window&&window,Ai="undefined"!=typeof self&&"undefined"!=typeof WorkerGlobalScope&&self instanceof WorkerGlobalScope&&self,Nr=zr||"undefined"!=typeof global&&global||hi||Ai,mr={},Xt=[],zn=_({\u0275cmp:_}),vr=_({\u0275dir:_}),si=_({\u0275pipe:_}),Ii=_({\u0275mod:_}),no=_({\u0275loc:_}),so=_({\u0275fac:_}),Ze=_({__NG_ELEMENT_ID__:_});let Dr=0;function jt(a){return Wt(()=>{const d={},m={type:a.type,providersResolver:null,decls:a.decls,vars:a.vars,factory:null,template:a.template||null,consts:a.consts||null,ngContentSelectors:a.ngContentSelectors,hostBindings:a.hostBindings||null,hostVars:a.hostVars||0,hostAttrs:a.hostAttrs||null,contentQueries:a.contentQueries||null,declaredInputs:d,inputs:null,outputs:null,exportAs:a.exportAs||null,onPush:a.changeDetection===Jn.OnPush,directiveDefs:null,pipeDefs:null,selectors:a.selectors||Xt,viewQuery:a.viewQuery||null,features:a.features||null,data:a.data||{},encapsulation:a.encapsulation||Vn.Emulated,id:"c",styles:a.styles||Xt,_:null,setInput:null,schemas:a.schemas||null,tView:null},A=a.directives,L=a.features,te=a.pipes;return m.id+=Dr++,m.inputs=Gi(a.inputs,d),m.outputs=Gi(a.outputs),L&&L.forEach(le=>le(m)),m.directiveDefs=A?()=>("function"==typeof A?A():A).map(mn):null,m.pipeDefs=te?()=>("function"==typeof te?te():te).map(Wn):null,m})}function mn(a){return Mo(a)||function(a){return a[vr]||null}(a)}function Wn(a){return function(a){return a[si]||null}(a)}const kn={};function wn(a){return Wt(()=>{const l={type:a.type,bootstrap:a.bootstrap||Xt,declarations:a.declarations||Xt,imports:a.imports||Xt,exports:a.exports||Xt,transitiveCompileScopes:null,schemas:a.schemas||null,id:a.id||null};return null!=a.id&&(kn[a.id]=a.type),l})}function nr(a,l){return Wt(()=>{const d=zo(a,!0);d.declarations=l.declarations||Xt,d.imports=l.imports||Xt,d.exports=l.exports||Xt})}function Gi(a,l){if(null==a)return mr;const d={};for(const m in a)if(a.hasOwnProperty(m)){let A=a[m],L=A;Array.isArray(A)&&(L=A[1],A=A[0]),d[A]=m,l&&(l[A]=L)}return d}const po=jt;function yo(a){return{type:a.type,name:a.name,factory:null,pure:!1!==a.pure,onDestroy:a.type.prototype.ngOnDestroy||null}}function Mo(a){return a[zn]||null}function zo(a,l){const d=a[Ii]||null;if(!d&&!0===l)throw new Error(`Type ${T(a)} does not have '\u0275mod' property.`);return d}function pa(a){return Array.isArray(a)&&"object"==typeof a[1]}function Bs(a){return Array.isArray(a)&&!0===a[1]}function Yl(a){return 0!=(8&a.flags)}function yl(a){return 2==(2&a.flags)}function fo(a){return 1==(1&a.flags)}function Da(a){return null!==a.template}function Ao(a){return 0!=(512&a[2])}function Ro(a,l){return a.hasOwnProperty(so)?a[so]:null}class Uo{constructor(l,d,m){this.previousValue=l,this.currentValue=d,this.firstChange=m}isFirstChange(){return this.firstChange}}function To(){return Ea}function Ea(a){return a.type.prototype.ngOnChanges&&(a.setInput=qu),al}function al(){const a=yc(this),l=null==a?void 0:a.current;if(l){const d=a.previous;if(d===mr)a.previous=l;else for(let m in l)d[m]=l[m];a.current=null,this.ngOnChanges(l)}}function qu(a,l,d,m){const A=yc(a)||function(a,l){return a[Ru]=l}(a,{previous:mr,current:null}),L=A.current||(A.current={}),te=A.previous,le=this.declaredInputs[d],Ne=te[le];L[le]=new Uo(Ne&&Ne.currentValue,l,te===mr),a[m]=l}To.ngInherit=!0;const Ru="__ngSimpleChanges__";function yc(a){return a[Ru]||null}let ou;function el(a){ou=a}function Cu(){return void 0!==ou?ou:"undefined"!=typeof document?document:void 0}function rt(a){return!!a.listen}const ct={createRenderer:(a,l)=>Cu()};function Me(a){for(;Array.isArray(a);)a=a[0];return a}function dr(a,l){return Me(l[a])}function Qi(a,l){return Me(l[a.index])}function Es(a,l){return a.data[l]}function vs(a,l){return a[l]}function Ms(a,l){const d=l[a];return pa(d)?d:d[0]}function Ma(a){return 4==(4&a[2])}function uu(a){return 128==(128&a[2])}function Pl(a,l){return null==l?null:a[l]}function ec(a){a[18]=0}function Ol(a,l){a[5]+=l;let d=a,m=a[3];for(;null!==m&&(1===l&&1===d[5]||-1===l&&0===d[5]);)m[5]+=l,d=m,m=m[3]}const Ts={lFrame:Or(null),bindingsEnabled:!0,isInCheckNoChangesMode:!1};function Ic(){return Ts.bindingsEnabled}function Fi(){return Ts.lFrame.lView}function ua(){return Ts.lFrame.tView}function Aa(a){return Ts.lFrame.contextLView=a,a[8]}function As(){let a=ku();for(;null!==a&&64===a.type;)a=a.parent;return a}function ku(){return Ts.lFrame.currentTNode}function bl(){const a=Ts.lFrame,l=a.currentTNode;return a.isParent?l:l.parent}function Au(a,l){const d=Ts.lFrame;d.currentTNode=a,d.isParent=l}function bu(){return Ts.lFrame.isParent}function cu(){Ts.lFrame.isParent=!1}function Hu(){return Ts.isInCheckNoChangesMode}function Yo(a){Ts.isInCheckNoChangesMode=a}function du(){const a=Ts.lFrame;let l=a.bindingRootIndex;return-1===l&&(l=a.bindingRootIndex=a.tView.bindingStartIndex),l}function Ar(){return Ts.lFrame.bindingIndex}function _u(){return Ts.lFrame.bindingIndex++}function fa(a){const l=Ts.lFrame,d=l.bindingIndex;return l.bindingIndex=l.bindingIndex+a,d}function Ja(a){Ts.lFrame.inI18n=a}function hl(a,l){const d=Ts.lFrame;d.bindingIndex=d.bindingRootIndex=a,Hs(l)}function Hs(a){Ts.lFrame.currentDirectiveIndex=a}function V(a){const l=Ts.lFrame.currentDirectiveIndex;return-1===l?null:a[l]}function Ae(){return Ts.lFrame.currentQueryIndex}function ot(a){Ts.lFrame.currentQueryIndex=a}function _t(a){const l=a[1];return 2===l.type?l.declTNode:1===l.type?a[6]:null}function lt(a,l,d){if(d&Ur.SkipSelf){let A=l,L=a;for(;!(A=A.parent,null!==A||d&Ur.Host||(A=_t(L),null===A||(L=L[15],10&A.type))););if(null===A)return!1;l=A,a=L}const m=Ts.lFrame=yn();return m.currentTNode=l,m.lView=a,!0}function un(a){const l=yn(),d=a[1];Ts.lFrame=l,l.currentTNode=d.firstChild,l.lView=a,l.tView=d,l.contextLView=a,l.bindingIndex=d.bindingStartIndex,l.inI18n=!1}function yn(){const a=Ts.lFrame,l=null===a?null:a.child;return null===l?Or(a):l}function Or(a){const l={currentTNode:null,isParent:!0,lView:null,tView:null,selectedIndex:-1,contextLView:null,elementDepthCount:0,currentNamespace:null,currentDirectiveIndex:-1,bindingRootIndex:-1,bindingIndex:-1,currentQueryIndex:0,parent:a,child:null,inI18n:!1};return null!==a&&(a.child=l),l}function Vr(){const a=Ts.lFrame;return Ts.lFrame=a.parent,a.currentTNode=null,a.lView=null,a}const _i=Vr;function oi(){const a=Vr();a.isParent=!0,a.tView=null,a.selectedIndex=-1,a.contextLView=null,a.elementDepthCount=0,a.currentDirectiveIndex=-1,a.currentNamespace=null,a.bindingRootIndex=-1,a.bindingIndex=-1,a.currentQueryIndex=0}function Ln(){return Ts.lFrame.selectedIndex}function Mr(a){Ts.lFrame.selectedIndex=a}function gr(){const a=Ts.lFrame;return Es(a.tView,a.selectedIndex)}function Lc(a,l){for(let d=l.directiveStart,m=l.directiveEnd;d<m;d++){const L=a.data[d].type.prototype,{ngAfterContentInit:te,ngAfterContentChecked:le,ngAfterViewInit:Ne,ngAfterViewChecked:qe,ngOnDestroy:Mt}=L;te&&(a.contentHooks||(a.contentHooks=[])).push(-d,te),le&&((a.contentHooks||(a.contentHooks=[])).push(d,le),(a.contentCheckHooks||(a.contentCheckHooks=[])).push(d,le)),Ne&&(a.viewHooks||(a.viewHooks=[])).push(-d,Ne),qe&&((a.viewHooks||(a.viewHooks=[])).push(d,qe),(a.viewCheckHooks||(a.viewCheckHooks=[])).push(d,qe)),null!=Mt&&(a.destroyHooks||(a.destroyHooks=[])).push(d,Mt)}}function zl(a,l,d){_a(a,l,3,d)}function ki(a,l,d,m){(3&a[2])===d&&_a(a,l,d,m)}function No(a,l){let d=a[2];(3&d)===l&&(d&=2047,d+=1,a[2]=d)}function _a(a,l,d,m){const L=null!=m?m:-1,te=l.length-1;let le=0;for(let Ne=void 0!==m?65535&a[18]:0;Ne<te;Ne++)if("number"==typeof l[Ne+1]){if(le=l[Ne],null!=m&&le>=m)break}else l[Ne]<0&&(a[18]+=65536),(le<L||-1==L)&&(ll(a,d,l,Ne),a[18]=(4294901760&a[18])+Ne+2),Ne++}function ll(a,l,d,m){const A=d[m]<0,L=d[m+1],le=a[A?-d[m]:d[m]];if(A){if(a[2]>>11<a[18]>>16&&(3&a[2])===l){a[2]+=2048;try{L.call(le)}finally{}}}else try{L.call(le)}finally{}}class Xs{constructor(l,d,m){this.factory=l,this.resolving=!1,this.canSeeViewProviders=d,this.injectImpl=m}}function nc(a,l,d){const m=rt(a);let A=0;for(;A<d.length;){const L=d[A];if("number"==typeof L){if(0!==L)break;A++;const te=d[A++],le=d[A++],Ne=d[A++];m?a.setAttribute(l,le,Ne,te):l.setAttributeNS(te,le,Ne)}else{const te=L,le=d[++A];ul(te)?m&&a.setProperty(l,te,le):m?a.setAttribute(l,te,le):l.setAttribute(te,le),A++}}return A}function df(a){return 3===a||4===a||6===a}function ul(a){return 64===a.charCodeAt(0)}function zd(a,l){if(null!==l&&0!==l.length)if(null===a||0===a.length)a=l.slice();else{let d=-1;for(let m=0;m<l.length;m++){const A=l[m];"number"==typeof A?d=A:0===d||Wd(a,d,A,null,-1===d||2===d?l[++m]:null)}}return a}function Wd(a,l,d,m,A){let L=0,te=a.length;if(-1===l)te=-1;else for(;L<a.length;){const le=a[L++];if("number"==typeof le){if(le===l){te=-1;break}if(le>l){te=L-1;break}}}for(;L<a.length;){const le=a[L];if("number"==typeof le)break;if(le===d){if(null===m)return void(null!==A&&(a[L+1]=A));if(m===a[L+1])return void(a[L+2]=A)}L++,null!==m&&L++,null!==A&&L++}-1!==te&&(a.splice(te,0,l),L=te+1),a.splice(L++,0,d),null!==m&&a.splice(L++,0,m),null!==A&&a.splice(L++,0,A)}function Be(a){return-1!==a}function Pe(a){return 32767&a}function it(a,l){let d=function(a){return a>>16}(a),m=l;for(;d>0;)m=m[15],d--;return m}let yt=!0;function qt(a){const l=yt;return yt=a,l}let Go=0;function ss(a,l){const d=Us(a,l);if(-1!==d)return d;const m=l[1];m.firstCreatePass&&(a.injectorIndex=l.length,Oa(m.data,a),Oa(l,null),Oa(m.blueprint,null));const A=fc(a,l),L=a.injectorIndex;if(Be(A)){const te=Pe(A),le=it(A,l),Ne=le[1].data;for(let qe=0;qe<8;qe++)l[L+qe]=le[te+qe]|Ne[te+qe]}return l[L+8]=A,L}function Oa(a,l){a.push(0,0,0,0,0,0,0,0,l)}function Us(a,l){return-1===a.injectorIndex||a.parent&&a.parent.injectorIndex===a.injectorIndex||null===l[a.injectorIndex+8]?-1:a.injectorIndex}function fc(a,l){if(a.parent&&-1!==a.parent.injectorIndex)return a.parent.injectorIndex;let d=0,m=null,A=l;for(;null!==A;){const L=A[1],te=L.type;if(m=2===te?L.declTNode:1===te?A[6]:null,null===m)return-1;if(d++,A=A[15],-1!==m.injectorIndex)return m.injectorIndex|d<<16}return-1}function va(a,l,d){!function(a,l,d){let m;"string"==typeof d?m=d.charCodeAt(0)||0:d.hasOwnProperty(Ze)&&(m=d[Ze]),null==m&&(m=d[Ze]=Go++);const A=255&m;l.data[a+(A>>5)]|=1<<A}(a,l,d)}function tl(a,l,d){if(d&Ur.Optional)return a;me(l,"NodeInjector")}function $a(a,l,d,m){if(d&Ur.Optional&&void 0===m&&(m=null),0==(d&(Ur.Self|Ur.Host))){const A=a[9],L=Hi(void 0);try{return A?A.get(l,m,d&Ur.Optional):Br(l,m,d&Ur.Optional)}finally{Hi(L)}}return tl(m,l,d)}function Ha(a,l,d,m=Ur.Default,A){if(null!==a){const L=function(a){if("string"==typeof a)return a.charCodeAt(0)||0;const l=a.hasOwnProperty(Ze)?a[Ze]:void 0;return"number"==typeof l?l>=0?255&l:Of:l}(d);if("function"==typeof L){if(!lt(l,a,m))return m&Ur.Host?tl(A,d,m):$a(l,d,m,A);try{const te=L(m);if(null!=te||m&Ur.Optional)return te;me(d)}finally{_i()}}else if("number"==typeof L){let te=null,le=Us(a,l),Ne=-1,qe=m&Ur.Host?l[16][6]:null;for((-1===le||m&Ur.SkipSelf)&&(Ne=-1===le?fc(a,l):l[le+8],-1!==Ne&&Qd(m,!1)?(te=l[1],le=Pe(Ne),l=it(Ne,l)):le=-1);-1!==le;){const Mt=l[1];if(Sc(L,le,Mt.data)){const an=Dd(le,l,d,te,m,qe);if(an!==nl)return an}Ne=l[le+8],-1!==Ne&&Qd(m,l[1].data[le+8]===qe)&&Sc(L,le,l)?(te=Mt,le=Pe(Ne),l=it(Ne,l)):le=-1}}}return $a(l,d,m,A)}const nl={};function Of(){return new Gc(As(),Fi())}function Dd(a,l,d,m,A,L){const te=l[1],le=te.data[a+8],Mt=Jd(le,te,d,null==m?yl(le)&&yt:m!=te&&0!=(3&le.type),A&Ur.Host&&L===le);return null!==Mt?Tc(l,te,Mt,le):nl}function Jd(a,l,d,m,A){const L=a.providerIndexes,te=l.data,le=1048575&L,Ne=a.directiveStart,Mt=L>>20,_n=A?le+Mt:a.directiveEnd;for(let or=m?le:le+Mt;or<_n;or++){const Rr=te[or];if(or<Ne&&d===Rr||or>=Ne&&Rr.type===d)return or}if(A){const or=te[Ne];if(or&&Da(or)&&or.type===d)return Ne}return null}function Tc(a,l,d,m){let A=a[d];const L=l.data;if(function(a){return a instanceof Xs}(A)){const te=A;te.resolving&&function(a,l){throw new ee("200",`Circular dependency in DI detected for ${a}`)}(se(L[d]));const le=qt(te.canSeeViewProviders);te.resolving=!0;const Ne=te.injectImpl?Hi(te.injectImpl):null;lt(a,m,Ur.Default);try{A=a[d]=te.factory(void 0,L,a,m),l.firstCreatePass&&d>=m.directiveStart&&function(a,l,d){const{ngOnChanges:m,ngOnInit:A,ngDoCheck:L}=l.type.prototype;if(m){const te=Ea(l);(d.preOrderHooks||(d.preOrderHooks=[])).push(a,te),(d.preOrderCheckHooks||(d.preOrderCheckHooks=[])).push(a,te)}A&&(d.preOrderHooks||(d.preOrderHooks=[])).push(0-a,A),L&&((d.preOrderHooks||(d.preOrderHooks=[])).push(a,L),(d.preOrderCheckHooks||(d.preOrderCheckHooks=[])).push(a,L))}(d,L[d],l)}finally{null!==Ne&&Hi(Ne),qt(le),te.resolving=!1,_i()}}return A}function Sc(a,l,d){return!!(d[l+(a>>5)]&1<<a)}function Qd(a,l){return!(a&Ur.Self||a&Ur.Host&&l)}class Gc{constructor(l,d){this._tNode=l,this._lView=d}get(l,d,m){return Ha(this._tNode,this._lView,l,m,d)}}function Ff(a){return Wt(()=>{const l=a.prototype.constructor,d=l[so]||zu(l),m=Object.prototype;let A=Object.getPrototypeOf(a.prototype).constructor;for(;A&&A!==m;){const L=A[so]||zu(A);if(L&&L!==d)return L;A=Object.getPrototypeOf(A)}return L=>new L})}function zu(a){return J(a)?()=>{const l=zu(Z(a));return l&&l()}:Ro(a)}function Tl(a){return function(a,l){if("class"===l)return a.classes;if("style"===l)return a.styles;const d=a.attrs;if(d){const m=d.length;let A=0;for(;A<m;){const L=d[A];if(df(L))break;if(0===L)A+=2;else if("number"==typeof L)for(A++;A<m&&"string"==typeof d[A];)A++;else{if(L===l)return d[A+1];A+=2}}}return null}(As(),a)}const kl="__parameters__",Nu="__prop__metadata__";function Wu(a){return function(...d){if(a){const m=a(...d);for(const A in m)this[A]=m[A]}}}function tn(a,l,d){return Wt(()=>{const m=Wu(l);function A(...L){if(this instanceof A)return m.apply(this,L),this;const te=new A(...L);return le.annotation=te,le;function le(Ne,qe,Mt){const an=Ne.hasOwnProperty(kl)?Ne[kl]:Object.defineProperty(Ne,kl,{value:[]})[kl];for(;an.length<=Mt;)an.push(null);return(an[Mt]=an[Mt]||[]).push(te),Ne}}return d&&(A.prototype=Object.create(d.prototype)),A.prototype.ngMetadataName=a,A.annotationCls=A,A})}function Mc(a,l,d,m){return Wt(()=>{const A=Wu(l);function L(...te){if(this instanceof L)return A.apply(this,te),this;const le=new L(...te);return function(qe,Mt){const an=qe.constructor,_n=an.hasOwnProperty(Nu)?an[Nu]:Object.defineProperty(an,Nu,{value:{}})[Nu];_n[Mt]=_n.hasOwnProperty(Mt)&&_n[Mt]||[],_n[Mt].unshift(le),m&&m(qe,Mt,...te)}}return d&&(L.prototype=Object.create(d.prototype)),L.prototype.ngMetadataName=a,L.annotationCls=L,L})}class Xl{constructor(l,d){this._desc=l,this.ngMetadataName="InjectionToken",this.\u0275prov=void 0,"number"==typeof d?this.__NG_ELEMENT_ID__=d:void 0!==d&&(this.\u0275prov=Dt({token:this,providedIn:d.providedIn||"root",factory:d.factory}))}toString(){return`InjectionToken ${this._desc}`}}const yd=new Xl("AnalyzeForEntryComponents");class Vc{}const dp=Mc("ViewChild",(a,l)=>Object.assign({selector:a,first:!0,isViewQuery:!0,descendants:!0},l),Vc),kf=Function;function wc(a,l){void 0===l&&(l=a);for(let d=0;d<a.length;d++){let m=a[d];Array.isArray(m)?(l===a&&(l=a.slice(0,d)),wc(m,l)):l!==a&&l.push(m)}return l}function ql(a,l){a.forEach(d=>Array.isArray(d)?ql(d,l):l(d))}function Ji(a,l,d){l>=a.length?a.push(d):a.splice(l,0,d)}function cl(a,l){return l>=a.length-1?a.pop():a.splice(l,1)[0]}function Ll(a,l){const d=[];for(let m=0;m<a;m++)d.push(l);return d}function Wl(a,l,d){let m=rc(a,l);return m>=0?a[1|m]=d:(m=~m,function(a,l,d,m){let A=a.length;if(A==l)a.push(d,m);else if(1===A)a.push(m,a[0]),a[0]=d;else{for(A--,a.push(a[A-1],a[A]);A>l;)a[A]=a[A-2],A--;a[l]=d,a[l+1]=m}}(a,m,l,d)),m}function Pd(a,l){const d=rc(a,l);if(d>=0)return a[1|d]}function rc(a,l){return function(a,l,d){let m=0,A=a.length>>d;for(;A!==m;){const L=m+(A-m>>1),te=a[L<<d];if(l===te)return L<<d;te>l?A=L:m=L+1}return~(A<<d)}(a,l,1)}const N={},k="__NG_DI_FLAG__",K="ngTempTokenPath",be=/\n/gm,we="__source",gt=_({provide:String,useValue:_});let vt;function Jt(a){const l=vt;return vt=a,l}function Pn(a,l=Ur.Default){if(void 0===vt)throw new Error("inject() must be called from an injection context");return null===vt?Br(a,void 0,l):vt.get(a,l&Ur.Optional?null:void 0,l)}function Rn(a,l=Ur.Default){return(di||Pn)(Z(a),l)}function Ni(a){const l=[];for(let d=0;d<a.length;d++){const m=Z(a[d]);if(Array.isArray(m)){if(0===m.length)throw new Error("Arguments array must have arguments.");let A,L=Ur.Default;for(let te=0;te<m.length;te++){const le=m[te],Ne=$o(le);"number"==typeof Ne?-1===Ne?A=le.token:L|=Ne:A=le}l.push(Rn(A,L))}else l.push(Rn(m))}return l}function Vo(a,l){return a[k]=l,a.prototype[k]=l,a}function $o(a){return a[k]}function Vs(a,l,d,m){const A=a[K];throw l[we]&&A.unshift(l[we]),a.message=function(a,l,d,m=null){a=a&&"\n"===a.charAt(0)&&"\u0275"==a.charAt(1)?a.substr(2):a;let A=T(l);if(Array.isArray(l))A=l.map(T).join(" -> ");else if("object"==typeof l){let L=[];for(let te in l)if(l.hasOwnProperty(te)){let le=l[te];L.push(te+":"+("string"==typeof le?JSON.stringify(le):T(le)))}A=`{${L.join(", ")}}`}return`${d}${m?"("+m+")":""}[${A}]: ${a.replace(be,"\n  ")}`}("\n"+a.message,A,d,m),a.ngTokenPath=A,a[K]=null,a}const ga=Vo(tn("Inject",a=>({token:a})),-1),sa=Vo(tn("Optional"),8),ol=Vo(tn("SkipSelf"),4);let ia,$p;function Jl(a){var l;return(null===(l=function(){if(void 0===ia&&(ia=null,Nr.trustedTypes))try{ia=Nr.trustedTypes.createPolicy("angular",{createHTML:a=>a,createScript:a=>a,createScriptURL:a=>a})}catch(a){}return ia}())||void 0===l?void 0:l.createHTML(a))||a}function Hp(){if(void 0===$p&&($p=null,Nr.trustedTypes))try{$p=Nr.trustedTypes.createPolicy("angular#unsafe-bypass",{createHTML:a=>a,createScript:a=>a,createScriptURL:a=>a})}catch(a){}return $p}function mf(a){var l;return(null===(l=Hp())||void 0===l?void 0:l.createHTML(a))||a}function dd(a){var l;return(null===(l=Hp())||void 0===l?void 0:l.createScriptURL(a))||a}class Fd{constructor(l){this.changingThisBreaksApplicationSecurity=l}toString(){return`SafeValue must use [property]=binding: ${this.changingThisBreaksApplicationSecurity} (see https://g.co/ng/security#xss)`}}class fp extends Fd{getTypeName(){return"HTML"}}class fl extends Fd{getTypeName(){return"Style"}}class Kh extends Fd{getTypeName(){return"Script"}}class F_ extends Fd{getTypeName(){return"URL"}}class Hf extends Fd{getTypeName(){return"ResourceURL"}}function kd(a){return a instanceof Fd?a.changingThisBreaksApplicationSecurity:a}function Uf(a,l){const d=Kp(a);if(null!=d&&d!==l){if("ResourceURL"===d&&"URL"===l)return!0;throw new Error(`Required a safe ${l}, got a ${d} (see https://g.co/ng/security#xss)`)}return d===l}function Kp(a){return a instanceof Fd&&a.getTypeName()||null}function Ed(a){return new fp(a)}function Ah(a){return new fl(a)}function qp(a){return new Kh(a)}function eh(a){return new F_(a)}function Oh(a){return new Hf(a)}function th(a){const l=new xf(a);return function(){try{return!!(new window.DOMParser).parseFromString(Jl(""),"text/html")}catch(a){return!1}}()?new Td(l):l}class Td{constructor(l){this.inertDocumentHelper=l}getInertBodyElement(l){l="<body><remove></remove>"+l;try{const d=(new window.DOMParser).parseFromString(Jl(l),"text/html").body;return null===d?this.inertDocumentHelper.getInertBodyElement(l):(d.removeChild(d.firstChild),d)}catch(d){return null}}}class xf{constructor(l){if(this.defaultDoc=l,this.inertDocument=this.defaultDoc.implementation.createHTMLDocument("sanitization-inert"),null==this.inertDocument.body){const d=this.inertDocument.createElement("html");this.inertDocument.appendChild(d);const m=this.inertDocument.createElement("body");d.appendChild(m)}}getInertBodyElement(l){const d=this.inertDocument.createElement("template");if("content"in d)return d.innerHTML=Jl(l),d;const m=this.inertDocument.createElement("body");return m.innerHTML=Jl(l),this.defaultDoc.documentMode&&this.stripCustomNsAttrs(m),m}stripCustomNsAttrs(l){const d=l.attributes;for(let A=d.length-1;0<A;A--){const te=d.item(A).name;("xmlns:ns1"===te||0===te.indexOf("ns1:"))&&l.removeAttribute(te)}let m=l.firstChild;for(;m;)m.nodeType===Node.ELEMENT_NODE&&this.stripCustomNsAttrs(m),m=m.nextSibling}}const Up=/^(?:(?:https?|mailto|ftp|tel|file|sms):|[^&:/?#]*(?:[/?#]|$))/gi,xh=/^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 vf(a){return(a=String(a)).match(Up)||a.match(xh)?a:"unsafe:"+a}function Dh(a){return(a=String(a)).split(",").map(l=>vf(l.trim())).join(", ")}function $d(a){const l={};for(const d of a.split(","))l[d]=!0;return l}function pp(...a){const l={};for(const d of a)for(const m in d)d.hasOwnProperty(m)&&(l[m]=!0);return l}const Bf=$d("area,br,col,hr,img,wbr"),Kd=$d("colgroup,dd,dt,li,p,tbody,td,tfoot,th,thead,tr"),oc=$d("rp,rt"),Y=pp(Bf,pp(Kd,$d("address,article,aside,blockquote,caption,center,del,details,dialog,dir,div,dl,figure,figcaption,footer,h1,h2,h3,h4,h5,h6,header,hgroup,hr,ins,main,map,menu,nav,ol,pre,section,summary,table,ul")),pp(oc,$d("a,abbr,acronym,audio,b,bdi,bdo,big,br,cite,code,del,dfn,em,font,i,img,ins,kbd,label,map,mark,picture,q,ruby,rp,rt,s,samp,small,source,span,strike,strong,sub,sup,time,track,tt,u,var,video")),pp(oc,Kd)),fe=$d("background,cite,href,itemtype,longdesc,poster,src,xlink:href"),w=$d("srcset"),ut=pp(fe,w,$d("abbr,accesskey,align,alt,autoplay,axis,bgcolor,border,cellpadding,cellspacing,class,clear,color,cols,colspan,compact,controls,coords,datetime,default,dir,download,face,headers,height,hidden,hreflang,hspace,ismap,itemscope,itemprop,kind,label,lang,language,loop,media,muted,nohref,nowrap,open,preload,rel,rev,role,rows,rowspan,rules,scope,scrolling,shape,size,sizes,span,srclang,start,summary,tabindex,target,title,translate,type,usemap,valign,value,vspace,width"),$d("aria-activedescendant,aria-atomic,aria-autocomplete,aria-busy,aria-checked,aria-colcount,aria-colindex,aria-colspan,aria-controls,aria-current,aria-describedby,aria-details,aria-disabled,aria-dropeffect,aria-errormessage,aria-expanded,aria-flowto,aria-grabbed,aria-haspopup,aria-hidden,aria-invalid,aria-keyshortcuts,aria-label,aria-labelledby,aria-level,aria-live,aria-modal,aria-multiline,aria-multiselectable,aria-orientation,aria-owns,aria-placeholder,aria-posinset,aria-pressed,aria-readonly,aria-relevant,aria-required,aria-roledescription,aria-rowcount,aria-rowindex,aria-rowspan,aria-selected,aria-setsize,aria-sort,aria-valuemax,aria-valuemin,aria-valuenow,aria-valuetext")),Xn=$d("script,style,template");class Fr{constructor(){this.sanitizedSomething=!1,this.buf=[]}sanitizeChildren(l){let d=l.firstChild,m=!0;for(;d;)if(d.nodeType===Node.ELEMENT_NODE?m=this.startElement(d):d.nodeType===Node.TEXT_NODE?this.chars(d.nodeValue):this.sanitizedSomething=!0,m&&d.firstChild)d=d.firstChild;else for(;d;){d.nodeType===Node.ELEMENT_NODE&&this.endElement(d);let A=this.checkClobberedElement(d,d.nextSibling);if(A){d=A;break}d=this.checkClobberedElement(d,d.parentNode)}return this.buf.join("")}startElement(l){const d=l.nodeName.toLowerCase();if(!Y.hasOwnProperty(d))return this.sanitizedSomething=!0,!Xn.hasOwnProperty(d);this.buf.push("<"),this.buf.push(d);const m=l.attributes;for(let A=0;A<m.length;A++){const L=m.item(A),te=L.name,le=te.toLowerCase();if(!ut.hasOwnProperty(le)){this.sanitizedSomething=!0;continue}let Ne=L.value;fe[le]&&(Ne=vf(Ne)),w[le]&&(Ne=Dh(Ne)),this.buf.push(" ",te,'="',Po(Ne),'"')}return this.buf.push(">"),!0}endElement(l){const d=l.nodeName.toLowerCase();Y.hasOwnProperty(d)&&!Bf.hasOwnProperty(d)&&(this.buf.push("</"),this.buf.push(d),this.buf.push(">"))}chars(l){this.buf.push(Po(l))}checkClobberedElement(l,d){if(d&&(l.compareDocumentPosition(d)&Node.DOCUMENT_POSITION_CONTAINED_BY)===Node.DOCUMENT_POSITION_CONTAINED_BY)throw new Error(`Failed to sanitize html because the element is clobbered: ${l.outerHTML}`);return d}}const gi=/[\uD800-\uDBFF][\uDC00-\uDFFF]/g,Wi=/([^\#-~ |!])/g;function Po(a){return a.replace(/&/g,"&amp;").replace(gi,function(l){return"&#"+(1024*(l.charCodeAt(0)-55296)+(l.charCodeAt(1)-56320)+65536)+";"}).replace(Wi,function(l){return"&#"+l.charCodeAt(0)+";"}).replace(/</g,"&lt;").replace(/>/g,"&gt;")}let Ns;function ts(a,l){let d=null;try{Ns=Ns||th(a);let m=l?String(l):"";d=Ns.getInertBodyElement(m);let A=5,L=m;do{if(0===A)throw new Error("Failed to sanitize html because the input is unstable");A--,m=L,L=d.innerHTML,d=Ns.getInertBodyElement(m)}while(m!==L);return Jl((new Fr).sanitizeChildren(Is(d)||d))}finally{if(d){const m=Is(d)||d;for(;m.firstChild;)m.removeChild(m.firstChild)}}}function Is(a){return"content"in a&&function(a){return a.nodeType===Node.ELEMENT_NODE&&"TEMPLATE"===a.nodeName}(a)?a.content:null}var zs=(()=>((zs=zs||{})[zs.NONE=0]="NONE",zs[zs.HTML=1]="HTML",zs[zs.STYLE=2]="STYLE",zs[zs.SCRIPT=3]="SCRIPT",zs[zs.URL=4]="URL",zs[zs.RESOURCE_URL=5]="RESOURCE_URL",zs))();function _c(a){const l=_p();return l?mf(l.sanitize(zs.HTML,a)||""):Uf(a,"HTML")?mf(kd(a)):ts(Cu(),$(a))}function wu(a){const l=_p();return l?l.sanitize(zs.URL,a)||"":Uf(a,"URL")?kd(a):vf($(a))}function Hd(a){const l=_p();if(l)return dd(l.sanitize(zs.RESOURCE_URL,a)||"");if(Uf(a,"ResourceURL"))return dd(kd(a));throw new Error("unsafe value used in a resource URL context (see https://g.co/ng/security#xss)")}function _p(){const a=Fi();return a&&a[12]}const B_="__ngContext__";function Jc(a,l){a[B_]=l}function t_(a){const l=function(a){return a[B_]||null}(a);return l?Array.isArray(l)?l:l.lView:null}function Yu(a){return a.ngOriginalError}function Bp(a,...l){a.error(...l)}class Zf{constructor(){this._console=console}handleError(l){const d=this._findOriginalError(l),m=this._findContext(l),A=(a=l)&&a.ngErrorLogger||Bp;var a;A(this._console,"ERROR",l),d&&A(this._console,"ORIGINAL ERROR",d),m&&A(this._console,"ERROR CONTEXT",m)}_findContext(l){return l?l.ngDebugContext||this._findContext(Yu(l)):null}_findOriginalError(l){let d=l&&Yu(l);for(;d&&Yu(d);)d=Yu(d);return d||null}}const Z_=/^>|^->|<!--|-->|--!>|<!-$/g,j_=/(<|>)/;const Ih=(()=>("undefined"!=typeof requestAnimationFrame&&requestAnimationFrame||setTimeout).bind(Nr))();function Lh(a){return a.ownerDocument.defaultView}function jf(a){return a.ownerDocument.body}function yf(a){return a instanceof Function?a():a}var Bd=(()=>((Bd=Bd||{})[Bd.Important=1]="Important",Bd[Bd.DashCase=2]="DashCase",Bd))();let fd;function bf(a,l){return fd(a,l)}function sd(a){const l=a[3];return Bs(l)?l[3]:l}function tp(a){return ch(a[13])}function V_(a){return ch(a[4])}function ch(a){for(;null!==a&&!Bs(a);)a=a[4];return a}function Uc(a,l,d,m,A){if(null!=m){let L,te=!1;Bs(m)?L=m:pa(m)&&(te=!0,m=m[0]);const le=Me(m);0===a&&null!==d?null==A?$g(l,d,le):ph(l,d,le,A||null,!0):1===a&&null!==d?ph(l,d,le,A||null,!0):2===a?p_(l,le,te):3===a&&l.destroyNode(le),null!=L&&function(a,l,d,m,A){const L=d[7];L!==Me(d)&&Uc(l,a,m,L,A);for(let le=10;le<d.length;le++){const Ne=d[le];Hh(Ne[1],Ne,a,l,m,L)}}(l,a,L,d,A)}}function Rf(a,l){return rt(a)?a.createText(l):a.createTextNode(l)}function dh(a,l,d){rt(a)?a.setValue(l,d):l.textContent=d}function vg(a,l){return a.createComment(function(a){return a.replace(Z_,l=>l.replace(j_,"\u200b$1\u200b"))}(l))}function Fh(a,l,d){return rt(a)?a.createElement(l,d):null===d?a.createElement(l):a.createElementNS(d,l)}function Fg(a,l){const d=a[9],m=d.indexOf(l),A=l[3];1024&l[2]&&(l[2]&=-1025,Ol(A,-1)),d.splice(m,1)}function yg(a,l){if(a.length<=10)return;const d=10+l,m=a[d];if(m){const A=m[17];null!==A&&A!==a&&Fg(A,m),l>0&&(a[d-1][4]=m[4]);const L=cl(a,10+l);!function(a,l){Hh(a,l,l[11],2,null,null),l[0]=null,l[6]=null}(m[1],m);const te=L[19];null!==te&&te.detachView(L[1]),m[3]=null,m[4]=null,m[2]&=-129}return m}function bp(a,l){if(!(256&l[2])){const d=l[11];rt(d)&&d.destroyNode&&Hh(a,l,d,3,null,null),function(a){let l=a[13];if(!l)return bg(a[1],a);for(;l;){let d=null;if(pa(l))d=l[13];else{const m=l[10];m&&(d=m)}if(!d){for(;l&&!l[4]&&l!==a;)pa(l)&&bg(l[1],l),l=l[3];null===l&&(l=a),pa(l)&&bg(l[1],l),d=l&&l[4]}l=d}}(l)}}function bg(a,l){if(!(256&l[2])){l[2]&=-129,l[2]|=256,function(a,l){let d;if(null!=a&&null!=(d=a.destroyHooks))for(let m=0;m<d.length;m+=2){const A=l[d[m]];if(!(A instanceof Xs)){const L=d[m+1];if(Array.isArray(L))for(let te=0;te<L.length;te+=2){const le=A[L[te]],Ne=L[te+1];try{Ne.call(le)}finally{}}else try{L.call(A)}finally{}}}}(a,l),function(a,l){const d=a.cleanup,m=l[7];let A=-1;if(null!==d)for(let L=0;L<d.length-1;L+=2)if("string"==typeof d[L]){const te=d[L+1],le="function"==typeof te?te(l):Me(l[te]),Ne=m[A=d[L+2]],qe=d[L+3];"boolean"==typeof qe?le.removeEventListener(d[L],Ne,qe):qe>=0?m[A=qe]():m[A=-qe].unsubscribe(),L+=2}else{const te=m[A=d[L+1]];d[L].call(te)}if(null!==m){for(let L=A+1;L<m.length;L++)m[L]();l[7]=null}}(a,l),1===l[1].type&&rt(l[11])&&l[11].destroy();const d=l[17];if(null!==d&&Bs(l[3])){d!==l[3]&&Fg(d,l);const m=l[19];null!==m&&m.detachView(a)}}}function z_(a,l,d){return Ep(a,l.parent,d)}function Ep(a,l,d){let m=l;for(;null!==m&&40&m.type;)m=(l=m).parent;if(null===m)return d[0];if(2&m.flags){const A=a.data[m.directiveStart].encapsulation;if(A===Vn.None||A===Vn.Emulated)return null}return Qi(m,d)}function ph(a,l,d,m,A){rt(a)?a.insertBefore(l,d,m,A):l.insertBefore(d,m,A)}function $g(a,l,d){rt(a)?a.appendChild(l,d):l.appendChild(d)}function W_(a,l,d,m,A){null!==m?ph(a,l,d,m,A):$g(a,l,d)}function Yd(a,l){return rt(a)?a.parentNode(l):l.parentNode}function Hg(a,l,d){return f_(a,l,d)}function Tp(a,l,d){return 40&a.type?Qi(a,d):null}let Qc,f_=Tp;function J_(a,l){f_=a,Qc=l}function kh(a,l,d,m){const A=z_(a,m,l),L=l[11],le=Hg(m.parent||l[6],m,l);if(null!=A)if(Array.isArray(d))for(let Ne=0;Ne<d.length;Ne++)W_(L,A,d[Ne],le,!1);else W_(L,A,d,le,!1);void 0!==Qc&&Qc(L,m,l,d,A)}function $h(a,l){if(null!==l){const d=l.type;if(3&d)return Qi(l,a);if(4&d)return Cg(-1,a[l.index]);if(8&d){const m=l.child;if(null!==m)return $h(a,m);{const A=a[l.index];return Bs(A)?Cg(-1,A):Me(A)}}if(32&d)return bf(l,a)()||Me(a[l.index]);{const m=Sg(a,l);return null!==m?Array.isArray(m)?m[0]:$h(sd(a[16]),m):$h(a,l.next)}}return null}function Sg(a,l){return null!==l?a[16][6].projection[l.projection]:null}function Cg(a,l){const d=10+a+1;if(d<l.length){const m=l[d],A=m[1].firstChild;if(null!==A)return $h(m,A)}return l[7]}function p_(a,l,d){const m=Yd(a,l);m&&function(a,l,d,m){rt(a)?a.removeChild(l,d,m):l.removeChild(d)}(a,m,l,d)}function h_(a,l,d,m,A,L,te){for(;null!=d;){const le=m[d.index],Ne=d.type;if(te&&0===l&&(le&&Jc(Me(le),m),d.flags|=4),64!=(64&d.flags))if(8&Ne)h_(a,l,d.child,m,A,L,!1),Uc(l,a,A,le,L);else if(32&Ne){const qe=bf(d,m);let Mt;for(;Mt=qe();)Uc(l,a,A,Mt,L);Uc(l,a,A,le,L)}else 16&Ne?Zp(a,l,m,d,A,L):Uc(l,a,A,le,L);d=te?d.projectionNext:d.next}}function Hh(a,l,d,m,A,L){h_(d,m,a.firstChild,l,A,L,!1)}function Zp(a,l,d,m,A,L){const te=d[16],Ne=te[6].projection[m.projection];if(Array.isArray(Ne))for(let qe=0;qe<Ne.length;qe++)Uc(l,a,A,Ne[qe],L);else h_(a,l,Ne,te[3],A,L,!0)}function Ug(a,l,d){rt(a)?a.setAttribute(l,"style",d):l.style.cssText=d}function Uh(a,l,d){rt(a)?""===d?a.removeAttribute(l,"class"):a.setAttribute(l,"class",d):l.className=d}function Ag(a,l,d){let m=a.length;for(;;){const A=a.indexOf(l,d);if(-1===A)return A;if(0===A||a.charCodeAt(A-1)<=32){const L=l.length;if(A+L===m||a.charCodeAt(A+L)<=32)return A}d=A+1}}const Bh="ng-template";function Om(a,l,d){let m=0;for(;m<a.length;){let A=a[m++];if(d&&"class"===A){if(A=a[m],-1!==Ag(A.toLowerCase(),l,0))return!0}else if(1===A){for(;m<a.length&&"string"==typeof(A=a[m++]);)if(A.toLowerCase()===l)return!0;return!1}}return!1}function m_(a){return 4===a.type&&a.value!==Bh}function b(a,l,d){return l===(4!==a.type||d?a.value:Bh)}function x(a,l,d){let m=4;const A=a.attrs||[],L=function(a){for(let l=0;l<a.length;l++)if(df(a[l]))return l;return a.length}(A);let te=!1;for(let le=0;le<l.length;le++){const Ne=l[le];if("number"!=typeof Ne){if(!te)if(4&m){if(m=2|1&m,""!==Ne&&!b(a,Ne,d)||""===Ne&&1===l.length){if(G(m))return!1;te=!0}}else{const qe=8&m?Ne:l[++le];if(8&m&&null!==a.attrs){if(!Om(a.attrs,qe,d)){if(G(m))return!1;te=!0}continue}const an=Se(8&m?"class":Ne,A,m_(a),d);if(-1===an){if(G(m))return!1;te=!0;continue}if(""!==qe){let _n;_n=an>L?"":A[an+1].toLowerCase();const or=8&m?_n:null;if(or&&-1!==Ag(or,qe,0)||2&m&&qe!==_n){if(G(m))return!1;te=!0}}}}else{if(!te&&!G(m)&&!G(Ne))return!1;if(te&&G(Ne))continue;te=!1,m=Ne|1&m}}return G(m)||te}function G(a){return 0==(1&a)}function Se(a,l,d,m){if(null===l)return-1;let A=0;if(m||!d){let L=!1;for(;A<l.length;){const te=l[A];if(te===a)return A;if(3===te||6===te)L=!0;else{if(1===te||2===te){let le=l[++A];for(;"string"==typeof le;)le=l[++A];continue}if(4===te)break;if(0===te){A+=4;continue}}A+=L?1:2}return-1}return function(a,l){let d=a.indexOf(4);if(d>-1)for(d++;d<a.length;){const m=a[d];if("number"==typeof m)return-1;if(m===l)return d;d++}return-1}(l,a)}function We(a,l,d=!1){for(let m=0;m<l.length;m++)if(x(a,l[m],d))return!0;return!1}function Er(a,l){e:for(let d=0;d<l.length;d++){const m=l[d];if(a.length===m.length){for(let A=0;A<a.length;A++)if(a[A]!==m[A])continue e;return!0}}return!1}function Ei(a,l){return a?":not("+l.trim()+")":l}function fs(a){let l=a[0],d=1,m=2,A="",L=!1;for(;d<a.length;){let te=a[d];if("string"==typeof te)if(2&m){const le=a[++d];A+="["+te+(le.length>0?'="'+le+'"':"")+"]"}else 8&m?A+="."+te:4&m&&(A+=" "+te);else""!==A&&!G(te)&&(l+=Ei(L,A),A=""),m=te,L=L||!G(m);d++}return""!==A&&(l+=Ei(L,A)),l}const _o={};function La(a){Sa(ua(),Fi(),Ln()+a,Hu())}function Sa(a,l,d,m){if(!m)if(3==(3&l[2])){const L=a.preOrderCheckHooks;null!==L&&zl(l,L,d)}else{const L=a.preOrderHooks;null!==L&&ki(l,L,0,d)}Mr(d)}function ti(a,l){return a<<17|l<<2}function Sr(a){return a>>17&32767}function ao(a){return 2|a}function ba(a){return(131068&a)>>2}function Os(a,l){return-131069&a|l<<2}function Dl(a){return 1|a}function gv(a,l){const d=a.contentQueries;if(null!==d)for(let m=0;m<d.length;m+=2){const A=d[m],L=d[m+1];if(-1!==L){const te=a.data[L];ot(A),te.contentQueries(2,l[L],L)}}}function Mp(a,l,d,m,A,L,te,le,Ne,qe){const Mt=l.blueprint.slice();return Mt[0]=A,Mt[2]=140|m,ec(Mt),Mt[3]=Mt[15]=a,Mt[8]=d,Mt[10]=te||a&&a[10],Mt[11]=le||a&&a[11],Mt[12]=Ne||a&&a[12]||null,Mt[9]=qe||a&&a[9]||null,Mt[6]=L,Mt[16]=2==l.type?a[16]:Mt,Mt}function rp(a,l,d,m,A){let L=a.data[l];if(null===L)L=jh(a,l,d,m,A),Ts.lFrame.inI18n&&(L.flags|=64);else if(64&L.type){L.type=d,L.value=m,L.attrs=A;const te=bl();L.injectorIndex=null===te?-1:te.injectorIndex}return Au(L,!0),L}function jh(a,l,d,m,A){const L=ku(),te=bu(),Ne=a.data[l]=function(a,l,d,m,A,L){return{type:d,index:m,insertBeforeIndex:null,injectorIndex:l?l.injectorIndex:-1,directiveStart:-1,directiveEnd:-1,directiveStylingLast:-1,propertyBindings:null,flags:0,providerIndexes:0,value:A,attrs:L,mergedAttrs:null,localNames:null,initialInputs:void 0,inputs:null,outputs:null,tViews:null,next:null,projectionNext:null,child:null,parent:l,projection:null,styles:null,stylesWithoutHost:null,residualStyles:void 0,classes:null,classesWithoutHost:null,residualClasses:void 0,classBindings:0,styleBindings:0}}(0,te?L:L&&L.parent,d,l,m,A);return null===a.firstChild&&(a.firstChild=Ne),null!==L&&(te?null==L.child&&null!==Ne.parent&&(L.child=Ne):null===L.next&&(L.next=Ne)),Ne}function Gp(a,l,d,m){if(0===d)return-1;const A=l.length;for(let L=0;L<d;L++)l.push(m),a.blueprint.push(m),a.data.push(null);return A}function X_(a,l,d){un(l);try{const m=a.viewQuery;null!==m&&zf(1,m,d);const A=a.template;null!==A&&Lm(a,l,A,1,d),a.firstCreatePass&&(a.firstCreatePass=!1),a.staticContentQueries&&gv(a,l),a.staticViewQueries&&zf(2,a.viewQuery,d);const L=a.components;null!==L&&function(a,l){for(let d=0;d<l.length;d++)km(a,l[d])}(l,L)}catch(m){throw a.firstCreatePass&&(a.incompleteFirstPass=!0,a.firstCreatePass=!1),m}finally{l[2]&=-5,oi()}}function v_(a,l,d,m){const A=l[2];if(256==(256&A))return;un(l);const L=Hu();try{ec(l),function(a){Ts.lFrame.bindingIndex=a}(a.bindingStartIndex),null!==d&&Lm(a,l,d,2,m);const te=3==(3&A);if(!L)if(te){const qe=a.preOrderCheckHooks;null!==qe&&zl(l,qe,null)}else{const qe=a.preOrderHooks;null!==qe&&ki(l,qe,0,null),No(l,0)}if(function(a){for(let l=tp(a);null!==l;l=V_(l)){if(!l[2])continue;const d=l[9];for(let m=0;m<d.length;m++){const A=d[m],L=A[3];0==(1024&A[2])&&Ol(L,1),A[2]|=1024}}}(l),function(a){for(let l=tp(a);null!==l;l=V_(l))for(let d=10;d<l.length;d++){const m=l[d],A=m[1];uu(m)&&v_(A,m,A.template,m[8])}}(l),null!==a.contentQueries&&gv(a,l),!L)if(te){const qe=a.contentCheckHooks;null!==qe&&zl(l,qe)}else{const qe=a.contentHooks;null!==qe&&ki(l,qe,1),No(l,1)}!function(a,l){const d=a.hostBindingOpCodes;if(null!==d)try{for(let m=0;m<d.length;m++){const A=d[m];if(A<0)Mr(~A);else{const L=A,te=d[++m],le=d[++m];hl(te,L),le(2,l[L])}}}finally{Mr(-1)}}(a,l);const le=a.components;null!==le&&function(a,l){for(let d=0;d<l.length;d++)bv(a,l[d])}(l,le);const Ne=a.viewQuery;if(null!==Ne&&zf(2,Ne,m),!L)if(te){const qe=a.viewCheckHooks;null!==qe&&zl(l,qe)}else{const qe=a.viewHooks;null!==qe&&ki(l,qe,2),No(l,2)}!0===a.firstUpdatePass&&(a.firstUpdatePass=!1),L||(l[2]&=-73),1024&l[2]&&(l[2]&=-1025,Ol(l[3],-1))}finally{oi()}}function Im(a,l,d,m){const A=l[10],L=!Hu(),te=Ma(l);try{L&&!te&&A.begin&&A.begin(),te&&X_(a,l,m),v_(a,l,d,m)}finally{L&&!te&&A.end&&A.end()}}function Lm(a,l,d,m,A){const L=Ln(),te=2&m;try{Mr(-1),te&&l.length>20&&Sa(a,l,20,Hu()),d(m,A)}finally{Mr(L)}}function m1(a,l,d){if(Yl(l)){const A=l.directiveEnd;for(let L=l.directiveStart;L<A;L++){const te=a.data[L];te.contentQueries&&te.contentQueries(1,d[L],L)}}}function Fm(a,l,d){!Ic()||(function(a,l,d,m){const A=d.directiveStart,L=d.directiveEnd;a.firstCreatePass||ss(d,l),Jc(m,l);const te=d.initialInputs;for(let le=A;le<L;le++){const Ne=a.data[le],qe=Da(Ne);qe&&Ab(l,d,Ne);const Mt=Tc(l,a,le,d);Jc(Mt,l),null!==te&&Ob(0,le-A,Mt,Ne,0,te),qe&&(Ms(d.index,l)[8]=Mt)}}(a,l,d,Qi(d,l)),128==(128&d.flags)&&function(a,l,d){const m=d.directiveStart,A=d.directiveEnd,te=d.index,le=Ts.lFrame.currentDirectiveIndex;try{Mr(te);for(let Ne=m;Ne<A;Ne++){const qe=a.data[Ne],Mt=l[Ne];Hs(Ne),(null!==qe.hostBindings||0!==qe.hostVars||null!==qe.hostAttrs)&&Xc(qe,Mt)}}finally{Mr(-1),Hs(le)}}(a,l,d))}function Zg(a,l,d=Qi){const m=l.localNames;if(null!==m){let A=l.index+1;for(let L=0;L<m.length;L+=2){const te=m[L+1],le=-1===te?d(l,a):a[te];a[A++]=le}}}function mv(a){const l=a.tView;return null===l||l.incompleteFirstPass?a.tView=jg(1,null,a.template,a.decls,a.vars,a.directiveDefs,a.pipeDefs,a.viewQuery,a.schemas,a.consts):l}function jg(a,l,d,m,A,L,te,le,Ne,qe){const Mt=20+m,an=Mt+A,_n=function(a,l){const d=[];for(let m=0;m<l;m++)d.push(m<a?null:_o);return d}(Mt,an),or="function"==typeof qe?qe():qe;return _n[1]={type:a,blueprint:_n,template:d,queries:null,viewQuery:le,declTNode:l,data:_n.slice().fill(null,Mt),bindingStartIndex:Mt,expandoStartIndex:an,hostBindingOpCodes:null,firstCreatePass:!0,firstUpdatePass:!0,staticViewQueries:!1,staticContentQueries:!1,preOrderHooks:null,preOrderCheckHooks:null,contentHooks:null,contentCheckHooks:null,viewHooks:null,viewCheckHooks:null,destroyHooks:null,cleanup:null,contentQueries:null,components:null,directiveRegistry:"function"==typeof L?L():L,pipeRegistry:"function"==typeof te?te():te,firstChild:null,schemas:Ne,consts:or,incompleteFirstPass:!1}}function at(a,l,d,m){const A=ju(l);null===d?A.push(m):(A.push(d),a.firstCreatePass&&$m(a).push(m,A.length-1))}function Gn(a,l,d){for(let m in a)if(a.hasOwnProperty(m)){const A=a[m];(d=null===d?{}:d).hasOwnProperty(m)?d[m].push(l,A):d[m]=[l,A]}return d}function Io(a,l,d,m,A,L,te,le){const Ne=Qi(l,d);let Mt,qe=l.inputs;!le&&null!=qe&&(Mt=qe[m])?(Rb(a,d,Mt,m,A),yl(l)&&function(a,l){const d=Ms(l,a);16&d[2]||(d[2]|=64)}(d,l.index)):3&l.type&&(m=function(a){return"class"===a?"className":"for"===a?"htmlFor":"formaction"===a?"formAction":"innerHtml"===a?"innerHTML":"readonly"===a?"readOnly":"tabindex"===a?"tabIndex":a}(m),A=null!=te?te(A,l.value||"",m):A,rt(L)?L.setProperty(Ne,m,A):ul(m)||(Ne.setProperty?Ne.setProperty(m,A):Ne[m]=A))}function Bc(a,l,d,m){let A=!1;if(Ic()){const L=function(a,l,d){const m=a.directiveRegistry;let A=null;if(m)for(let L=0;L<m.length;L++){const te=m[L];We(d,te.selectors,!1)&&(A||(A=[]),va(ss(d,l),a,te.type),Da(te)?(Zu(a,d),A.unshift(te)):A.push(te))}return A}(a,l,d),te=null===m?null:{"":-1};if(null!==L){A=!0,F0(d,a.data.length,L.length);for(let Mt=0;Mt<L.length;Mt++){const an=L[Mt];an.providersResolver&&an.providersResolver(an)}let le=!1,Ne=!1,qe=Gp(a,l,L.length,null);for(let Mt=0;Mt<L.length;Mt++){const an=L[Mt];d.mergedAttrs=zd(d.mergedAttrs,an.hostAttrs),k0(a,d,l,qe,an),L0(qe,an,te),null!==an.contentQueries&&(d.flags|=8),(null!==an.hostBindings||null!==an.hostAttrs||0!==an.hostVars)&&(d.flags|=128);const _n=an.type.prototype;!le&&(_n.ngOnChanges||_n.ngOnInit||_n.ngDoCheck)&&((a.preOrderHooks||(a.preOrderHooks=[])).push(d.index),le=!0),!Ne&&(_n.ngOnChanges||_n.ngDoCheck)&&((a.preOrderCheckHooks||(a.preOrderCheckHooks=[])).push(d.index),Ne=!0),qe++}!function(a,l){const m=l.directiveEnd,A=a.data,L=l.attrs,te=[];let le=null,Ne=null;for(let qe=l.directiveStart;qe<m;qe++){const Mt=A[qe],an=Mt.inputs,_n=null===L||m_(l)?null:$0(an,L);te.push(_n),le=Gn(an,qe,le),Ne=Gn(Mt.outputs,qe,Ne)}null!==le&&(le.hasOwnProperty("class")&&(l.flags|=16),le.hasOwnProperty("style")&&(l.flags|=32)),l.initialInputs=te,l.inputs=le,l.outputs=Ne}(a,d)}te&&function(a,l,d){if(l){const m=a.localNames=[];for(let A=0;A<l.length;A+=2){const L=d[l[A+1]];if(null==L)throw new ee("301",`Export of name '${l[A+1]}' not found!`);m.push(l[A],L)}}}(d,m,te)}return d.mergedAttrs=zd(d.mergedAttrs,d.attrs),A}function Ap(a,l,d,m,A,L){const te=L.hostBindings;if(te){let le=a.hostBindingOpCodes;null===le&&(le=a.hostBindingOpCodes=[]);const Ne=~l.index;(function(a){let l=a.length;for(;l>0;){const d=a[--l];if("number"==typeof d&&d<0)return d}return 0})(le)!=Ne&&le.push(Ne),le.push(m,A,te)}}function Xc(a,l){null!==a.hostBindings&&a.hostBindings(1,l)}function Zu(a,l){l.flags|=2,(a.components||(a.components=[])).push(l.index)}function L0(a,l,d){if(d){if(l.exportAs)for(let m=0;m<l.exportAs.length;m++)d[l.exportAs[m]]=a;Da(l)&&(d[""]=a)}}function F0(a,l,d){a.flags|=1,a.directiveStart=l,a.directiveEnd=l+d,a.providerIndexes=l}function k0(a,l,d,m,A){a.data[m]=A;const L=A.factory||(A.factory=Ro(A.type)),te=new Xs(L,Da(A),null);a.blueprint[m]=te,d[m]=te,Ap(a,l,0,m,Gp(a,d,A.hostVars,_o),A)}function Ab(a,l,d){const m=Qi(l,a),A=mv(d),L=a[10],te=y1(a,Mp(a,A,null,d.onPush?64:16,m,l,L,L.createRenderer(m,d),null,null));a[l.index]=te}function v1(a,l,d,m,A,L,te){if(null==L)rt(a)?a.removeAttribute(l,A,d):l.removeAttribute(A);else{const le=null==te?$(L):te(L,m||"",A);rt(a)?a.setAttribute(l,A,le,d):d?l.setAttributeNS(d,A,le):l.setAttribute(A,le)}}function Ob(a,l,d,m,A,L){const te=L[l];if(null!==te){const le=m.setInput;for(let Ne=0;Ne<te.length;){const qe=te[Ne++],Mt=te[Ne++],an=te[Ne++];null!==le?m.setInput(d,an,qe,Mt):d[Mt]=an}}}function $0(a,l){let d=null,m=0;for(;m<l.length;){const A=l[m];if(0!==A)if(5!==A){if("number"==typeof A)break;a.hasOwnProperty(A)&&(null===d&&(d=[]),d.push(A,a[A],l[m+1])),m+=2}else m+=2;else m+=4}return d}function yv(a,l,d,m){return new Array(a,!0,!1,l,null,0,m,d,null,null)}function bv(a,l){const d=Ms(l,a);if(uu(d)){const m=d[1];80&d[2]?v_(m,d,m.template,d[8]):d[5]>0&&Ef(d)}}function Ef(a){for(let m=tp(a);null!==m;m=V_(m))for(let A=10;A<m.length;A++){const L=m[A];if(1024&L[2]){const te=L[1];v_(te,L,te.template,L[8])}else L[5]>0&&Ef(L)}const d=a[1].components;if(null!==d)for(let m=0;m<d.length;m++){const A=Ms(d[m],a);uu(A)&&A[5]>0&&Ef(A)}}function km(a,l){const d=Ms(l,a),m=d[1];(function(a,l){for(let d=l.length;d<a.blueprint.length;d++)l.push(a.blueprint[d])})(m,d),X_(m,d,d[8])}function y1(a,l){return a[13]?a[14][4]=l:a[13]=l,a[14]=l,l}function tf(a){for(;a;){a[2]|=64;const l=sd(a);if(Ao(a)&&!l)return a;a=l}return null}function b1(a,l,d){const m=l[10];m.begin&&m.begin();try{v_(a,l,a.template,d)}catch(A){throw Ev(l,A),A}finally{m.end&&m.end()}}function y_(a){!function(a){for(let l=0;l<a.components.length;l++){const d=a.components[l],m=t_(d),A=m[1];Im(A,m,A.template,d)}}(a[8])}function zf(a,l,d){ot(0),l(a,d)}const bS=(()=>Promise.resolve(null))();function ju(a){return a[7]||(a[7]=[])}function $m(a){return a.cleanup||(a.cleanup=[])}function Ev(a,l){const d=a[9],m=d?d.get(Zf,null):null;m&&m.handleError(l)}function Rb(a,l,d,m,A){for(let L=0;L<d.length;){const te=d[L++],le=d[L++],Ne=l[te],qe=a.data[te];null!==qe.setInput?qe.setInput(Ne,A,m,le):Ne[le]=A}}function eg(a,l,d){const m=dr(l,a);dh(a[11],m,d)}function E1(a,l,d){let m=d?a.styles:null,A=d?a.classes:null,L=0;if(null!==l)for(let te=0;te<l.length;te++){const le=l[te];"number"==typeof le?L=le:1==L?A=M(A,le):2==L&&(m=M(m,le+": "+l[++te]+";"))}d?a.styles=m:a.stylesWithoutHost=m,d?a.classes=A:a.classesWithoutHost=A}const Gg=new Xl("INJECTOR",-1);class Z0{get(l,d=N){if(d===N){const m=new Error(`NullInjectorError: No provider for ${T(l)}!`);throw m.name="NullInjectorError",m}return d}}const Hm=new Xl("Set Injector scope."),Um={},Nb={};let T1;function j0(){return void 0===T1&&(T1=new Z0),T1}function ad(a,l=null,d=null,m){return new wg(a,d,l||j0(),m)}class wg{constructor(l,d,m,A=null){this.parent=m,this.records=new Map,this.injectorDefTypes=new Set,this.onDestroy=new Set,this._destroyed=!1;const L=[];d&&ql(d,le=>this.processProvider(le,l,d)),ql([l],le=>this.processInjectorType(le,[],L)),this.records.set(Gg,Md(void 0,this));const te=this.records.get(Hm);this.scope=null!=te?te.value:null,this.source=A||("object"==typeof l?null:T(l))}get destroyed(){return this._destroyed}destroy(){this.assertNotDestroyed(),this._destroyed=!0;try{this.onDestroy.forEach(l=>l.ngOnDestroy())}finally{this.records.clear(),this.onDestroy.clear(),this.injectorDefTypes.clear()}}get(l,d=N,m=Ur.Default){this.assertNotDestroyed();const A=Jt(this),L=Hi(void 0);try{if(!(m&Ur.SkipSelf)){let le=this.records.get(l);if(void 0===le){const Ne=("function"==typeof(a=l)||"object"==typeof a&&a instanceof Xl)&&Hr(l);le=Ne&&this.injectableDefInScope(Ne)?Md(tg(l),Um):null,this.records.set(l,le)}if(null!=le)return this.hydrate(l,le)}return(m&Ur.Self?j0():this.parent).get(l,d=m&Ur.Optional&&d===N?null:d)}catch(te){if("NullInjectorError"===te.name){if((te[K]=te[K]||[]).unshift(T(l)),A)throw te;return Vs(te,l,"R3InjectorError",this.source)}throw te}finally{Hi(L),Jt(A)}var a}_resolveInjectorDefTypes(){this.injectorDefTypes.forEach(l=>this.get(l))}toString(){const l=[];return this.records.forEach((m,A)=>l.push(T(A))),`R3Injector[${l.join(", ")}]`}assertNotDestroyed(){if(this._destroyed)throw new Error("Injector has already been destroyed.")}processInjectorType(l,d,m){if(!(l=Z(l)))return!1;let A=Qr(l);const L=null==A&&l.ngModule||void 0,te=void 0===L?l:L,le=-1!==m.indexOf(te);if(void 0!==L&&(A=Qr(L)),null==A)return!1;if(null!=A.imports&&!le){let Mt;m.push(te);try{ql(A.imports,an=>{this.processInjectorType(an,d,m)&&(void 0===Mt&&(Mt=[]),Mt.push(an))})}finally{}if(void 0!==Mt)for(let an=0;an<Mt.length;an++){const{ngModule:_n,providers:or}=Mt[an];ql(or,Rr=>this.processProvider(Rr,_n,or||Xt))}}this.injectorDefTypes.add(te);const Ne=Ro(te)||(()=>new te);this.records.set(te,Md(Ne,Um));const qe=A.providers;if(null!=qe&&!le){const Mt=l;ql(qe,an=>this.processProvider(an,Mt,qe))}return void 0!==L&&void 0!==l.providers}processProvider(l,d,m){let A=Vh(l=Z(l))?l:Z(l&&l.provide);const L=C1(a=l)?Md(void 0,a.useValue):Md(nf(a),Um);var a;if(Vh(l)||!0!==l.multi)this.records.get(A);else{let te=this.records.get(A);te||(te=Md(void 0,Um,!0),te.factory=()=>Ni(te.multi),this.records.set(A,te)),A=l,te.multi.push(l)}this.records.set(A,L)}hydrate(l,d){return d.value===Um&&(d.value=Nb,d.value=d.factory()),"object"==typeof d.value&&d.value&&null!==(a=d.value)&&"object"==typeof a&&"function"==typeof a.ngOnDestroy&&this.onDestroy.add(d.value),d.value;var a}injectableDefInScope(l){if(!l.providedIn)return!1;const d=Z(l.providedIn);return"string"==typeof d?"any"===d||d===this.scope:this.injectorDefTypes.has(d)}}function tg(a){const l=Hr(a),d=null!==l?l.factory:Ro(a);if(null!==d)return d;if(a instanceof Xl)throw new Error(`Token ${T(a)} is missing a \u0275prov definition.`);if(a instanceof Function)return function(a){const l=a.length;if(l>0){const m=Ll(l,"?");throw new Error(`Can't resolve all parameters for ${T(a)}: (${m.join(", ")}).`)}const d=function(a){const l=a&&(a[Kr]||a[Hn]);if(l){const d=function(a){if(a.hasOwnProperty("name"))return a.name;const l=(""+a).match(/^function\s*([^\s(]+)/);return null===l?"":l[1]}(a);return console.warn(`DEPRECATED: DI is instantiating a token "${d}" that inherits its @Injectable decorator but does not provide one itself.\nThis will become an error in a future version of Angular. Please add @Injectable() to the "${d}" class.`),l}return null}(a);return null!==d?()=>d.factory(a):()=>new a}(a);throw new Error("unreachable")}function nf(a,l,d){let m;if(Vh(a)){const A=Z(a);return Ro(A)||tg(A)}if(C1(a))m=()=>Z(a.useValue);else if(function(a){return!(!a||!a.useFactory)}(a))m=()=>a.useFactory(...Ni(a.deps||[]));else if(function(a){return!(!a||!a.useExisting)}(a))m=()=>Rn(Z(a.useExisting));else{const A=Z(a&&(a.useClass||a.provide));if(!function(a){return!!a.deps}(a))return Ro(A)||tg(A);m=()=>new A(...Ni(a.deps))}return m}function Md(a,l,d=!1){return{factory:a,value:l,multi:d?[]:void 0}}function C1(a){return null!==a&&"object"==typeof a&&gt in a}function Vh(a){return"function"==typeof a}const W0=function(a,l,d){return function(a,l=null,d=null,m){const A=ad(a,l,d,m);return A._resolveInjectorDefTypes(),A}({name:d},l,a,d)};let Gu=(()=>{class a{static create(d,m){return Array.isArray(d)?W0(d,m,""):W0(d.providers,d.parent,d.name||"")}}return a.THROW_IF_NOT_FOUND=N,a.NULL=new Z0,a.\u0275prov=Dt({token:a,providedIn:"any",factory:()=>Rn(Gg)}),a.__NG_ELEMENT_ID__=-1,a})();function Wb(a,l){Lc(t_(a)[1],As())}function D1(a){let l=function(a){return Object.getPrototypeOf(a.prototype).constructor}(a.type),d=!0;const m=[a];for(;l;){let A;if(Da(a))A=l.\u0275cmp||l.\u0275dir;else{if(l.\u0275cmp)throw new Error("Directives cannot inherit Components");A=l.\u0275dir}if(A){if(d){m.push(A);const te=a;te.inputs=Nf(a.inputs),te.declaredInputs=Nf(a.declaredInputs),te.outputs=Nf(a.outputs);const le=A.hostBindings;le&&Qb(a,le);const Ne=A.viewQuery,qe=A.contentQueries;if(Ne&&R1(a,Ne),qe&&Jb(a,qe),y(a.inputs,A.inputs),y(a.declaredInputs,A.declaredInputs),y(a.outputs,A.outputs),Da(A)&&A.data.animation){const Mt=a.data;Mt.animation=(Mt.animation||[]).concat(A.data.animation)}}const L=A.features;if(L)for(let te=0;te<L.length;te++){const le=L[te];le&&le.ngInherit&&le(a),le===D1&&(d=!1)}}l=Object.getPrototypeOf(l)}!function(a){let l=0,d=null;for(let m=a.length-1;m>=0;m--){const A=a[m];A.hostVars=l+=A.hostVars,A.hostAttrs=zd(A.hostAttrs,d=zd(d,A.hostAttrs))}}(m)}function Nf(a){return a===mr?{}:a===Xt?[]:a}function R1(a,l){const d=a.viewQuery;a.viewQuery=d?(m,A)=>{l(m,A),d(m,A)}:l}function Jb(a,l){const d=a.contentQueries;a.contentQueries=d?(m,A,L)=>{l(m,A,L),d(m,A,L)}:l}function Qb(a,l){const d=a.hostBindings;a.hostBindings=d?(m,A)=>{l(m,A),d(m,A)}:l}let Av=null;function ng(){if(!Av){const a=Nr.Symbol;if(a&&a.iterator)Av=a.iterator;else{const l=Object.getOwnPropertyNames(Map.prototype);for(let d=0;d<l.length;++d){const m=l[d];"entries"!==m&&"size"!==m&&Map.prototype[m]===Map.prototype.entries&&(Av=m)}}}return Av}class _h{constructor(l){this.wrapped=l}static wrap(l){return new _h(l)}static unwrap(l){return _h.isWrapped(l)?l.wrapped:l}static isWrapped(l){return l instanceof _h}}function Zm(a){return!!P1(a)&&(Array.isArray(a)||!(a instanceof Map)&&ng()in a)}function P1(a){return null!==a&&("function"==typeof a||"object"==typeof a)}function zh(a,l,d){return a[l]=d}function jm(a,l){return a[l]}function rf(a,l,d){return!Object.is(a[l],d)&&(a[l]=d,!0)}function E_(a,l,d,m){const A=rf(a,l,d);return rf(a,l+1,m)||A}function Ov(a,l,d,m,A){const L=E_(a,l,d,m);return rf(a,l+2,A)||L}function Vp(a,l,d,m,A,L){const te=E_(a,l,d,m);return E_(a,l+2,A,L)||te}function I1(a,l,d,m){const A=Fi();return rf(A,_u(),l)&&(ua(),function(a,l,d,m,A,L){const te=Qi(a,l);v1(l[11],te,L,a.value,d,m,A)}(gr(),A,a,l,d,m)),I1}function Wg(a,l,d,m){return rf(a,_u(),d)?l+$(d)+m:_o}function Jg(a,l,d,m,A,L){const le=E_(a,Ar(),d,A);return fa(2),le?l+$(d)+m+$(A)+L:_o}function H(a,l,d,m,A,L,te,le){const Ne=Fi(),qe=ua(),Mt=a+20,an=qe.firstCreatePass?function(a,l,d,m,A,L,te,le,Ne){const qe=l.consts,Mt=rp(l,a,4,te||null,Pl(qe,le));Bc(l,d,Mt,Pl(qe,Ne)),Lc(l,Mt);const an=Mt.tViews=jg(2,Mt,m,A,L,l.directiveRegistry,l.pipeRegistry,null,l.schemas,qe);return null!==l.queries&&(l.queries.template(l,Mt),an.queries=l.queries.embeddedTView(Mt)),Mt}(Mt,qe,Ne,l,d,m,A,L,te):qe.data[Mt];Au(an,!1);const _n=Ne[11].createComment("");kh(qe,Ne,_n,an),Jc(_n,Ne),y1(Ne,Ne[Mt]=yv(_n,Ne,_n,an)),fo(an)&&Fm(qe,Ne,an),null!=te&&Zg(Ne,an,le)}function Ke(a){return vs(Ts.lFrame.contextLView,20+a)}function k1(a,l=Ur.Default){const d=Fi();return null===d?Rn(a,l):Ha(As(),d,Z(a),l)}function iE(a,l,d){const m=Fi();return rf(m,_u(),l)&&Io(ua(),gr(),m,a,l,m[11],d,!1),iE}function oE(a,l,d,m,A){const te=A?"class":"style";Rb(a,d,l.inputs[te],te,m)}function sE(a,l,d,m){const A=Fi(),L=ua(),te=20+a,le=A[11],Ne=A[te]=Fh(le,l,Ts.lFrame.currentNamespace),qe=L.firstCreatePass?function(a,l,d,m,A,L,te){const le=l.consts,qe=rp(l,a,2,A,Pl(le,L));return Bc(l,d,qe,Pl(le,te)),null!==qe.attrs&&E1(qe,qe.attrs,!1),null!==qe.mergedAttrs&&E1(qe,qe.mergedAttrs,!0),null!==l.queries&&l.queries.elementStart(l,qe),qe}(te,L,A,0,l,d,m):L.data[te];Au(qe,!0);const Mt=qe.mergedAttrs;null!==Mt&&nc(le,Ne,Mt);const an=qe.classes;null!==an&&Uh(le,Ne,an);const _n=qe.styles;null!==_n&&Ug(le,Ne,_n),64!=(64&qe.flags)&&kh(L,A,Ne,qe),0===Ts.lFrame.elementDepthCount&&Jc(Ne,A),Ts.lFrame.elementDepthCount++,fo(qe)&&(Fm(L,A,qe),m1(L,qe,A)),null!==m&&Zg(A,qe)}function aE(){let a=As();bu()?cu():(a=a.parent,Au(a,!1));const l=a;Ts.lFrame.elementDepthCount--;const d=ua();d.firstCreatePass&&(Lc(d,a),Yl(a)&&d.queries.elementEnd(a)),null!=l.classesWithoutHost&&function(a){return 0!=(16&a.flags)}(l)&&oE(d,l,Fi(),l.classesWithoutHost,!0),null!=l.stylesWithoutHost&&function(a){return 0!=(32&a.flags)}(l)&&oE(d,l,Fi(),l.stylesWithoutHost,!1)}function kS(a,l,d,m){sE(a,l,d,m),aE()}function lE(a,l,d){const m=Fi(),A=ua(),L=a+20,te=A.firstCreatePass?function(a,l,d,m,A){const L=l.consts,te=Pl(L,m),le=rp(l,a,8,"ng-container",te);return null!==te&&E1(le,te,!0),Bc(l,d,le,Pl(L,A)),null!==l.queries&&l.queries.elementStart(l,le),le}(L,A,m,l,d):A.data[L];Au(te,!0);const le=m[L]=m[11].createComment("");kh(A,m,le,te),Jc(le,m),fo(te)&&(Fm(A,m,te),m1(A,te,m)),null!=d&&Zg(m,te)}function uE(){let a=As();const l=ua();bu()?cu():(a=a.parent,Au(a,!1)),l.firstCreatePass&&(Lc(l,a),Yl(a)&&l.queries.elementEnd(a))}function HS(a,l,d){lE(a,l,d),uE()}function US(){return Fi()}function $1(a){return!!a&&"function"==typeof a.then}function Rv(a){return!!a&&"function"==typeof a.subscribe}const cE=Rv;function dE(a,l,d,m){const A=Fi(),L=ua(),te=As();return function(a,l,d,m,A,L,te,le){const Ne=fo(m),Mt=a.firstCreatePass&&$m(a),an=l[8],_n=ju(l);let or=!0;if(3&m.type||le){const ni=Qi(m,l),Oo=le?le(ni):ni,Xi=_n.length,oa=le?Va=>le(Me(Va[m.index])):m.index;if(rt(d)){let Va=null;if(!le&&Ne&&(Va=function(a,l,d,m){const A=a.cleanup;if(null!=A)for(let L=0;L<A.length-1;L+=2){const te=A[L];if(te===d&&A[L+1]===m){const le=l[7],Ne=A[L+2];return le.length>Ne?le[Ne]:null}"string"==typeof te&&(L+=2)}return null}(a,l,A,m.index)),null!==Va)(Va.__ngLastListenerFn__||Va).__ngNextListenerFn__=L,Va.__ngLastListenerFn__=L,or=!1;else{L=fE(m,l,an,L,!1);const pu=d.listen(Oo,A,L);_n.push(L,pu),Mt&&Mt.push(A,oa,Xi,Xi+1)}}else L=fE(m,l,an,L,!0),Oo.addEventListener(A,L,te),_n.push(L),Mt&&Mt.push(A,oa,Xi,te)}else L=fE(m,l,an,L,!1);const Rr=m.outputs;let bi;if(or&&null!==Rr&&(bi=Rr[A])){const ni=bi.length;if(ni)for(let Oo=0;Oo<ni;Oo+=2){const Mf=l[bi[Oo]][bi[Oo+1]].subscribe(L),Qh=_n.length;_n.push(L,Mf),Mt&&Mt.push(A,m.index,Qh,-(Qh+1))}}}(L,A,A[11],te,a,l,!!d,m),dE}function ZS(a,l,d,m){try{return!1!==d(m)}catch(A){return Ev(a,A),!1}}function fE(a,l,d,m,A){return function L(te){if(te===Function)return m;const le=2&a.flags?Ms(a.index,l):l;0==(32&l[2])&&tf(le);let Ne=ZS(l,0,m,te),qe=L.__ngNextListenerFn__;for(;qe;)Ne=ZS(l,0,qe,te)&&Ne,qe=qe.__ngNextListenerFn__;return A&&!1===Ne&&(te.preventDefault(),te.returnValue=!1),Ne}}function jS(a=1){return function(a){return(Ts.lFrame.contextLView=function(a,l){for(;a>0;)l=l[15],a--;return l}(a,Ts.lFrame.contextLView))[8]}(a)}function eO(a,l){let d=null;const m=function(a){const l=a.attrs;if(null!=l){const d=l.indexOf(5);if(0==(1&d))return l[d+1]}return null}(a);for(let A=0;A<l.length;A++){const L=l[A];if("*"!==L){if(null===m?We(a,L,!0):Er(m,L))return A}else d=A}return d}function GS(a){const l=Fi()[16][6];if(!l.projection){const m=l.projection=Ll(a?a.length:1,null),A=m.slice();let L=l.child;for(;null!==L;){const te=a?eO(L,a):0;null!==te&&(A[te]?A[te].projectionNext=L:m[te]=L,A[te]=L),L=L.next}}}function VS(a,l=0,d){const m=Fi(),A=ua(),L=rp(A,20+a,16,null,d||null);null===L.projection&&(L.projection=l),cu(),64!=(64&L.flags)&&function(a,l,d){Zp(l[11],0,l,d,z_(a,d,l),Hg(d.parent||l[6],d,l))}(A,m,L)}function pE(a,l,d){return by(a,"",l,"",d),pE}function by(a,l,d,m,A){const L=Fi(),te=Wg(L,l,d,m);return te!==_o&&Io(ua(),gr(),L,a,te,L[11],A,!1),by}function hE(a,l,d,m,A,L,te){const le=Fi(),Ne=Jg(le,l,d,m,A,L);return Ne!==_o&&Io(ua(),gr(),le,a,Ne,le[11],te,!1),hE}function KS(a,l,d,m,A){const L=a[d+1],te=null===l;let le=m?Sr(L):ba(L),Ne=!1;for(;0!==le&&(!1===Ne||te);){const Mt=a[le+1];rO(a[le],l)&&(Ne=!0,a[le+1]=m?Dl(Mt):ao(Mt)),le=m?Sr(Mt):ba(Mt)}Ne&&(a[d+1]=m?ao(L):Dl(L))}function rO(a,l){return null===a||null==l||(Array.isArray(a)?a[1]:a)===l||!(!Array.isArray(a)||"string"!=typeof l)&&rc(a,l)>=0}const Tf={textEnd:0,key:0,keyEnd:0,value:0,valueEnd:0};function qS(a){return a.substring(Tf.key,Tf.keyEnd)}function eC(a,l){const d=Tf.textEnd;return d===l?-1:(l=Tf.keyEnd=function(a,l,d){for(;l<d&&a.charCodeAt(l)>32;)l++;return l}(a,Tf.key=l,d),Nv(a,l,d))}function Nv(a,l,d){for(;l<d&&a.charCodeAt(l)<=32;)l++;return l}function gE(a,l,d){return T_(a,l,d,!1),gE}function mE(a,l){return T_(a,l,null,!0),mE}function oC(a){S_(Wl,og,a,!0)}function og(a,l){for(let d=function(a){return function(a){Tf.key=0,Tf.keyEnd=0,Tf.value=0,Tf.valueEnd=0,Tf.textEnd=a.length}(a),eC(a,Nv(a,0,Tf.textEnd))}(l);d>=0;d=eC(l,d))Wl(a,qS(l),!0)}function T_(a,l,d,m){const A=Fi(),L=ua(),te=fa(2);L.firstUpdatePass&&aC(L,a,te,m),l!==_o&&rf(A,te,l)&&uC(L,L.data[Ln()],A,A[11],a,A[te+1]=function(a,l){return null==a||("string"==typeof l?a+=l:"object"==typeof a&&(a=T(kd(a)))),a}(l,d),m,te)}function S_(a,l,d,m){const A=ua(),L=fa(2);A.firstUpdatePass&&aC(A,null,L,m);const te=Fi();if(d!==_o&&rf(te,L,d)){const le=A.data[Ln()];if(yE(le,m)&&!sC(A,L)){let Ne=m?le.classesWithoutHost:le.stylesWithoutHost;null!==Ne&&(d=M(Ne,d||"")),oE(A,le,te,d,m)}else!function(a,l,d,m,A,L,te,le){A===_o&&(A=Xt);let Ne=0,qe=0,Mt=0<A.length?A[0]:null,an=0<L.length?L[0]:null;for(;null!==Mt||null!==an;){const _n=Ne<A.length?A[Ne+1]:void 0,or=qe<L.length?L[qe+1]:void 0;let bi,Rr=null;Mt===an?(Ne+=2,qe+=2,_n!==or&&(Rr=an,bi=or)):null===an||null!==Mt&&Mt<an?(Ne+=2,Rr=Mt):(qe+=2,Rr=an,bi=or),null!==Rr&&uC(a,l,d,m,Rr,bi,te,le),Mt=Ne<A.length?A[Ne]:null,an=qe<L.length?L[qe]:null}}(A,le,te,te[11],te[L+1],te[L+1]=function(a,l,d){if(null==d||""===d)return Xt;const m=[],A=kd(d);if(Array.isArray(A))for(let L=0;L<A.length;L++)a(m,A[L],!0);else if("object"==typeof A)for(const L in A)A.hasOwnProperty(L)&&a(m,L,A[L]);else"string"==typeof A&&l(m,A);return m}(a,l,d),m,L)}}function sC(a,l){return l>=a.expandoStartIndex}function aC(a,l,d,m){const A=a.data;if(null===A[d+1]){const L=A[Ln()],te=sC(a,d);yE(L,m)&&null===l&&!te&&(l=!1),l=function(a,l,d,m){const A=V(a);let L=m?l.residualClasses:l.residualStyles;if(null===A)0===(m?l.classBindings:l.styleBindings)&&(d=H1(d=vE(null,a,l,d,m),l.attrs,m),L=null);else{const te=l.directiveStylingLast;if(-1===te||a[te]!==A)if(d=vE(A,a,l,d,m),null===L){let Ne=function(a,l,d){const m=d?l.classBindings:l.styleBindings;if(0!==ba(m))return a[Sr(m)]}(a,l,m);void 0!==Ne&&Array.isArray(Ne)&&(Ne=vE(null,a,l,Ne[1],m),Ne=H1(Ne,l.attrs,m),function(a,l,d,m){a[Sr(d?l.classBindings:l.styleBindings)]=m}(a,l,m,Ne))}else L=function(a,l,d){let m;const A=l.directiveEnd;for(let L=1+l.directiveStylingLast;L<A;L++)m=H1(m,a[L].hostAttrs,d);return H1(m,l.attrs,d)}(a,l,m)}return void 0!==L&&(m?l.residualClasses=L:l.residualStyles=L),d}(A,L,l,m),function(a,l,d,m,A,L){let te=L?l.classBindings:l.styleBindings,le=Sr(te),Ne=ba(te);a[m]=d;let Mt,qe=!1;if(Array.isArray(d)){const an=d;Mt=an[1],(null===Mt||rc(an,Mt)>0)&&(qe=!0)}else Mt=d;if(A)if(0!==Ne){const _n=Sr(a[le+1]);a[m+1]=ti(_n,le),0!==_n&&(a[_n+1]=Os(a[_n+1],m)),a[le+1]=function(a,l){return 131071&a|l<<17}(a[le+1],m)}else a[m+1]=ti(le,0),0!==le&&(a[le+1]=Os(a[le+1],m)),le=m;else a[m+1]=ti(Ne,0),0===le?le=m:a[Ne+1]=Os(a[Ne+1],m),Ne=m;qe&&(a[m+1]=ao(a[m+1])),KS(a,Mt,m,!0),KS(a,Mt,m,!1),function(a,l,d,m,A){const L=A?a.residualClasses:a.residualStyles;null!=L&&"string"==typeof l&&rc(L,l)>=0&&(d[m+1]=Dl(d[m+1]))}(l,Mt,a,m,L),te=ti(le,Ne),L?l.classBindings=te:l.styleBindings=te}(A,L,l,d,te,m)}}function vE(a,l,d,m,A){let L=null;const te=d.directiveEnd;let le=d.directiveStylingLast;for(-1===le?le=d.directiveStart:le++;le<te&&(L=l[le],m=H1(m,L.hostAttrs,A),L!==a);)le++;return null!==a&&(d.directiveStylingLast=le),m}function H1(a,l,d){const m=d?1:2;let A=-1;if(null!==l)for(let L=0;L<l.length;L++){const te=l[L];"number"==typeof te?A=te:A===m&&(Array.isArray(a)||(a=void 0===a?[]:["",a]),Wl(a,te,!!d||l[++L]))}return void 0===a?null:a}function uC(a,l,d,m,A,L,te,le){if(!(3&l.type))return;const Ne=a.data,qe=Ne[le+1];Ey(function(a){return 1==(1&a)}(qe)?Pv(Ne,l,d,A,ba(qe),te):void 0)||(Ey(L)||function(a){return 2==(2&a)}(qe)&&(L=Pv(Ne,null,d,A,le,te)),function(a,l,d,m,A){const L=rt(a);if(l)A?L?a.addClass(d,m):d.classList.add(m):L?a.removeClass(d,m):d.classList.remove(m);else{let te=-1===m.indexOf("-")?void 0:Bd.DashCase;if(null==A)L?a.removeStyle(d,m,te):d.style.removeProperty(m);else{const le="string"==typeof A&&A.endsWith("!important");le&&(A=A.slice(0,-10),te|=Bd.Important),L?a.setStyle(d,m,A,te):d.style.setProperty(m,A,le?"important":"")}}}(m,te,dr(Ln(),d),A,L))}function Pv(a,l,d,m,A,L){const te=null===l;let le;for(;A>0;){const Ne=a[A],qe=Array.isArray(Ne),Mt=qe?Ne[1]:Ne,an=null===Mt;let _n=d[A+1];_n===_o&&(_n=an?Xt:void 0);let or=an?Pd(_n,m):Mt===m?_n:void 0;if(qe&&!Ey(or)&&(or=Pd(Ne,m)),Ey(or)&&(le=or,te))return le;const Rr=a[A+1];A=te?Sr(Rr):ba(Rr)}if(null!==l){let Ne=L?l.residualClasses:l.residualStyles;null!=Ne&&(le=Pd(Ne,m))}return le}function Ey(a){return void 0!==a}function yE(a,l){return 0!=(a.flags&(l?16:32))}function Ty(a,l=""){const d=Fi(),m=ua(),A=a+20,L=m.firstCreatePass?rp(m,A,1,l,null):m.data[A],te=d[A]=Rf(d[11],l);kh(m,d,te,L),Au(L,!1)}function bE(a){return Sy("",a,""),bE}function Sy(a,l,d){const m=Fi(),A=Wg(m,a,l,d);return A!==_o&&eg(m,Ln(),A),Sy}function EE(a,l,d,m,A){const L=Fi(),te=Jg(L,a,l,d,m,A);return te!==_o&&eg(L,Ln(),te),EE}function TE(a,l,d,m,A,L,te){const le=Fi(),Ne=function(a,l,d,m,A,L,te,le){const qe=Ov(a,Ar(),d,A,te);return fa(3),qe?l+$(d)+m+$(A)+L+$(te)+le:_o}(le,a,l,d,m,A,L,te);return Ne!==_o&&eg(le,Ln(),Ne),TE}function gC(a,l,d){S_(Wl,og,Wg(Fi(),a,l,d),!0)}function mC(a,l,d,m,A){S_(Wl,og,Jg(Fi(),a,l,d,m,A),!0)}function vC(a,l,d,m,A,L,te,le,Ne){S_(Wl,og,function(a,l,d,m,A,L,te,le,Ne,qe){const an=Vp(a,Ar(),d,A,te,Ne);return fa(4),an?l+$(d)+m+$(A)+L+$(te)+le+$(Ne)+qe:_o}(Fi(),a,l,d,m,A,L,te,le,Ne),!0)}function SE(a,l,d){const m=Fi();return rf(m,_u(),l)&&Io(ua(),gr(),m,a,l,m[11],d,!0),SE}function CE(a,l,d){const m=Fi();if(rf(m,_u(),l)){const L=ua(),te=gr();Io(L,te,m,a,l,function(a,l,d){return(null===a||Da(a))&&(d=function(a){for(;Array.isArray(a);){if("object"==typeof a[1])return a;a=a[0]}return null}(d[l.index])),d[11]}(V(L.data),te,m),d,!0)}return CE}const Gm=void 0;var IO=["en",[["a","p"],["AM","PM"],Gm],[["AM","PM"],Gm,Gm],[["S","M","T","W","T","F","S"],["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],["Su","Mo","Tu","We","Th","Fr","Sa"]],Gm,[["J","F","M","A","M","J","J","A","S","O","N","D"],["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"],["January","February","March","April","May","June","July","August","September","October","November","December"]],Gm,[["B","A"],["BC","AD"],["Before Christ","Anno Domini"]],0,[6,0],["M/d/yy","MMM d, y","MMMM d, y","EEEE, MMMM d, y"],["h:mm a","h:mm:ss a","h:mm:ss a z","h:mm:ss a zzzz"],["{1}, {0}",Gm,"{1} 'at' {0}",Gm],[".",",",";","%","+","-","E","\xd7","\u2030","\u221e","NaN",":"],["#,##0.###","#,##0%","\xa4#,##0.00","#E0"],"USD","$","US Dollar",{},"ltr",function(a){const l=Math.floor(Math.abs(a)),d=a.toString().replace(/^[^.]*\.?/,"").length;return 1===l&&0===d?1:5}];let Iv={};function ME(a){const l=function(a){return a.toLowerCase().replace(/_/g,"-")}(a);let d=xC(l);if(d)return d;const m=l.split("-")[0];if(d=xC(m),d)return d;if("en"===m)return IO;throw new Error(`Missing locale data for the locale "${a}".`)}function wC(a){return ME(a)[Za.PluralCase]}function xC(a){return a in Iv||(Iv[a]=Nr.ng&&Nr.ng.common&&Nr.ng.common.locales&&Nr.ng.common.locales[a]),Iv[a]}var Za=(()=>((Za=Za||{})[Za.LocaleId=0]="LocaleId",Za[Za.DayPeriodsFormat=1]="DayPeriodsFormat",Za[Za.DayPeriodsStandalone=2]="DayPeriodsStandalone",Za[Za.DaysFormat=3]="DaysFormat",Za[Za.DaysStandalone=4]="DaysStandalone",Za[Za.MonthsFormat=5]="MonthsFormat",Za[Za.MonthsStandalone=6]="MonthsStandalone",Za[Za.Eras=7]="Eras",Za[Za.FirstDayOfWeek=8]="FirstDayOfWeek",Za[Za.WeekendRange=9]="WeekendRange",Za[Za.DateFormat=10]="DateFormat",Za[Za.TimeFormat=11]="TimeFormat",Za[Za.DateTimeFormat=12]="DateTimeFormat",Za[Za.NumberSymbols=13]="NumberSymbols",Za[Za.NumberFormats=14]="NumberFormats",Za[Za.CurrencyCode=15]="CurrencyCode",Za[Za.CurrencySymbol=16]="CurrencySymbol",Za[Za.CurrencyName=17]="CurrencyName",Za[Za.Currencies=18]="Currencies",Za[Za.Directionality=19]="Directionality",Za[Za.PluralCase=20]="PluralCase",Za[Za.ExtraData=21]="ExtraData",Za))();const FO=["zero","one","two","few","many"],Cy="en-US",My={marker:"element"},Ay={marker:"ICU"};var Ad=(()=>((Ad=Ad||{})[Ad.SHIFT=2]="SHIFT",Ad[Ad.APPEND_EAGERLY=1]="APPEND_EAGERLY",Ad[Ad.COMMENT=2]="COMMENT",Ad))();let DC=Cy;function AE(a){(function(a,l){null==a&&Ut(l,a,null,"!=")})(a,"Expected localeId to be defined"),"string"==typeof a&&(DC=a.toLowerCase().replace(/_/g,"-"))}function RC(a,l,d){const m=l.insertBeforeIndex,A=Array.isArray(m)?m[0]:m;return null===A?Tp(a,0,d):Me(d[A])}function NC(a,l,d,m,A){const L=l.insertBeforeIndex;if(Array.isArray(L)){let te=m,le=null;if(3&l.type||(le=te,te=A),null!==te&&0==(2&l.flags))for(let Ne=1;Ne<L.length;Ne++)ph(a,te,d[L[Ne]],le,!1)}}function OE(a,l){if(a.push(l),a.length>1)for(let d=a.length-2;d>=0;d--){const m=a[d];wE(m)||UO(m,l)&&null===BO(m)&&YO(m,l.index)}}function wE(a){return!(64&a.type)}function UO(a,l){return wE(l)||a.index>l.index}function BO(a){const l=a.insertBeforeIndex;return Array.isArray(l)?l[0]:l}function YO(a,l){const d=a.insertBeforeIndex;Array.isArray(d)?d[0]=l:(J_(RC,NC),a.insertBeforeIndex=l)}function U1(a,l){const d=a.data[l];return null===d||"string"==typeof d?null:d.hasOwnProperty("currentCaseLViewIndex")?d:d.value}function GO(a,l,d){const m=jh(a,d,64,null,null);return OE(l,m),m}function Oy(a,l){const d=l[a.currentCaseLViewIndex];return null===d?d:d<0?~d:d}function PC(a){return a>>>17}function IC(a){return(131070&a)>>>1}let Vm=0,Lv=0;function FC(a,l,d,m){const A=d[11];let te,L=null;for(let le=0;le<l.length;le++){const Ne=l[le];if("string"==typeof Ne){const qe=l[++le];null===d[qe]&&(d[qe]=Rf(A,Ne))}else if("number"==typeof Ne)switch(1&Ne){case 0:const qe=PC(Ne);let Mt,an;if(null===L&&(L=qe,te=Yd(A,m)),qe===L?(Mt=m,an=te):(Mt=null,an=Me(d[qe])),null!==an){const bi=IC(Ne);ph(A,an,d[bi],Mt,!1);const Oo=U1(a,bi);if(null!==Oo&&"object"==typeof Oo){const Xi=Oy(Oo,d);null!==Xi&&FC(a,Oo.create[Xi],d,d[Oo.anchorIdx])}}break;case 1:const or=l[++le],Rr=l[++le];v1(A,dr(Ne>>>1,d),null,null,or,Rr,null);break;default:throw new Error(`Unable to determine the type of mutate operation for "${Ne}"`)}else switch(Ne){case Ay:const qe=l[++le],Mt=l[++le];null===d[Mt]&&Jc(d[Mt]=vg(A,qe),d);break;case My:const an=l[++le],_n=l[++le];null===d[_n]&&Jc(d[_n]=Fh(A,an,null),d)}}}function kC(a,l,d,m,A){for(let L=0;L<d.length;L++){const te=d[L],le=d[++L];if(te&A){let Ne="";for(let qe=L+1;qe<=L+le;qe++){const Mt=d[qe];if("string"==typeof Mt)Ne+=Mt;else if("number"==typeof Mt)if(Mt<0)Ne+=$(l[m-Mt]);else{const an=Mt>>>2;switch(3&Mt){case 1:const _n=d[++qe],or=d[++qe],Rr=a.data[an];"string"==typeof Rr?v1(l[11],l[an],null,Rr,_n,Ne,or):Io(a,Rr,l,_n,Ne,l[11],or,!1);break;case 0:const bi=l[an];null!==bi&&dh(l[11],bi,Ne);break;case 2:JO(a,U1(a,an),l,Ne);break;case 3:$C(a,U1(a,an),m,l)}}}}else{const Ne=d[L+1];if(Ne>0&&3==(3&Ne)){const Mt=U1(a,Ne>>>2);l[Mt.currentCaseLViewIndex]<0&&$C(a,Mt,m,l)}}L+=le}}function $C(a,l,d,m){let A=m[l.currentCaseLViewIndex];if(null!==A){let L=Vm;A<0&&(A=m[l.currentCaseLViewIndex]=~A,L=-1),kC(a,m,l.update[A],d,L)}}function JO(a,l,d,m){const A=function(a,l){let d=a.cases.indexOf(l);if(-1===d)switch(a.type){case 1:{const m=function(a,l){const d=wC(l)(parseInt(a,10)),m=FO[d];return void 0!==m?m:"other"}(l,DC);d=a.cases.indexOf(m),-1===d&&"other"!==m&&(d=a.cases.indexOf("other"));break}case 0:d=a.cases.indexOf("other")}return-1===d?null:d}(l,m);if(Oy(l,d)!==A&&(HC(a,l,d),d[l.currentCaseLViewIndex]=null===A?null:~A,null!==A)){const te=d[l.anchorIdx];te&&FC(a,l.create[A],d,te)}}function HC(a,l,d){let m=Oy(l,d);if(null!==m){const A=l.remove[m];for(let L=0;L<A.length;L++){const te=A[L];if(te>0){const le=dr(te,d);null!==le&&p_(d[11],le)}else HC(a,U1(a,~te),d)}}}function UC(){const a=[];let d,m,l=-1;function L(le,Ne){l=0;const qe=Oy(le,Ne);m=null!==qe?le.remove[qe]:Xt}function te(){if(l<m.length){const le=m[l++];return le>0?d[le]:(a.push(l,m),L(d[1].data[~le],d),te())}return 0===a.length?null:(m=a.pop(),l=a.pop(),te())}return function(le,Ne){for(d=Ne;a.length;)a.pop();return L(le.value,Ne),te}}const wy=/\ufffd(\d+):?\d*\ufffd/gi,XO=/({\s*\ufffd\d+:?\d*\ufffd\s*,\s*\S{6}\s*,[\s\S]*})/gi,KO=/\ufffd(\d+)\ufffd/,YC=/^\s*(\ufffd\d+:?\d*\ufffd)\s*,\s*(select|plural)\s*,/,qO=/\ufffd\/?\*(\d+:\d+)\ufffd/gi,ew=/\ufffd(\/?[#*]\d+):?\d*\ufffd/gi,tw=/\uE500/g;function jC(a,l,d,m,A,L,te){const le=Gp(a,m,1,null);let Ne=le<<Ad.SHIFT,qe=bl();l===qe&&(qe=null),null===qe&&(Ne|=Ad.APPEND_EAGERLY),te&&(Ne|=Ad.COMMENT,function(a){void 0===fd&&(fd=a())}(UC)),A.push(Ne,null===L?"":L);const Mt=jh(a,le,te?32:1,null===L?"":L,null);OE(d,Mt);const an=Mt.index;return Au(Mt,!1),null!==qe&&l!==qe&&function(a,l){let d=a.insertBeforeIndex;null===d?(J_(RC,NC),d=a.insertBeforeIndex=[null,l]):(function(a,l,d){a!=l&&Ut(d,a,l,"==")}(Array.isArray(d),!0,"Expecting array here"),d.push(l))}(qe,an),Mt}function rw(a,l,d,m,A,L,te){const le=te.match(wy),Ne=jC(a,l,d,L,m,le?null:te,!1);le&&Fv(A,te,Ne.index,null,0,null)}function Fv(a,l,d,m,A,L){const te=a.length,le=te+1;a.push(null,null);const Ne=te+2,qe=l.split(wy);let Mt=0;for(let an=0;an<qe.length;an++){const _n=qe[an];if(1&an){const or=A+parseInt(_n,10);a.push(-1-or),Mt|=GC(or)}else""!==_n&&a.push(_n)}return a.push(d<<2|(m?1:0)),m&&a.push(m,L),a[te]=Mt,a[le]=a.length-Ne,Mt}function ow(a){let l=0;for(let d=0;d<a.length;d++){const m=a[d];"number"==typeof m&&m<0&&l++}return l}function GC(a){return 1<<Math.min(a,31)}function VC(a){let l,L,d="",m=0,A=!1;for(;null!==(l=qO.exec(a));)A?l[0]===`\ufffd/*${L}\ufffd`&&(m=l.index,A=!1):(d+=a.substring(m,l.index+l[0].length),L=l[1],A=!0);return d+=a.substr(m),d}function zC(a,l,d,m,A,L){let te=0;const le={type:A.type,currentCaseLViewIndex:Gp(a,l,1,null),anchorIdx:L,cases:[],create:[],remove:[],update:[]};(function(a,l,d){a.push(GC(l.mainBinding),2,-1-l.mainBinding,d<<2|2)})(d,A,L),function(a,l,d){const m=a.data[l];null===m?a.data[l]=d:m.value=d}(a,L,le);const Ne=A.values;for(let qe=0;qe<Ne.length;qe++){const Mt=Ne[qe],an=[];for(let _n=0;_n<Mt.length;_n++){const or=Mt[_n];if("string"!=typeof or){const Rr=an.push(or)-1;Mt[_n]=`\x3c!--\ufffd${Rr}\ufffd--\x3e`}}te=Y1(a,le,l,d,m,A.cases[qe],Mt.join(""),an)|te}te&&function(a,l,d){a.push(l,1,d<<2|3)}(d,te,L)}function WC(a){const l=[],d=[];let m=1,A=0;const L=DE(a=a.replace(YC,function(te,le,Ne){return m="select"===Ne?0:1,A=parseInt(le.substr(1),10),""}));for(let te=0;te<L.length;){let le=L[te++].trim();1===m&&(le=le.replace(/\s*(?:=)?(\w+)\s*/,"$1")),le.length&&l.push(le);const Ne=DE(L[te++]);l.length>d.length&&d.push(Ne)}return{type:m,mainBinding:A,cases:l,values:d}}function DE(a){if(!a)return[];let l=0;const d=[],m=[],A=/[{}]/g;let L;for(A.lastIndex=0;L=A.exec(a);){const le=L.index;if("}"==L[0]){if(d.pop(),0==d.length){const Ne=a.substring(l,le);YC.test(Ne)?m.push(WC(Ne)):m.push(Ne),l=le+1}}else{if(0==d.length){const Ne=a.substring(l,le);m.push(Ne),l=le+1}d.push("{")}}const te=a.substring(l);return m.push(te),m}function Y1(a,l,d,m,A,L,te,le){const Ne=[],qe=[],Mt=[];l.cases.push(L),l.create.push(Ne),l.remove.push(qe),l.update.push(Mt);const _n=th(Cu()).getInertBodyElement(te),or=Is(_n)||_n;return or?JC(a,l,d,m,Ne,qe,Mt,or,A,le,0):0}function JC(a,l,d,m,A,L,te,le,Ne,qe,Mt){let an=0,_n=le.firstChild;for(;_n;){const or=Gp(a,d,1,null);switch(_n.nodeType){case Node.ELEMENT_NODE:const Rr=_n,bi=Rr.tagName.toLowerCase();if(Y.hasOwnProperty(bi)){NE(A,My,bi,Ne,or),a.data[or]=bi;const oa=Rr.attributes;for(let Va=0;Va<oa.length;Va++){const pu=oa.item(Va),Mf=pu.name.toLowerCase();pu.value.match(wy)?ut.hasOwnProperty(Mf)&&Fv(te,pu.value,or,pu.name,0,fe[Mf]?vf:w[Mf]?Dh:null):dw(A,or,pu)}an=JC(a,l,d,m,A,L,te,_n,or,qe,Mt+1)|an,RE(L,or,Mt)}break;case Node.TEXT_NODE:const ni=_n.textContent||"",Oo=ni.match(wy);NE(A,null,Oo?"":ni,Ne,or),RE(L,or,Mt),Oo&&(an=Fv(te,ni,or,null,0,null)|an);break;case Node.COMMENT_NODE:const Xi=KO.exec(_n.textContent||"");if(Xi){const Va=qe[parseInt(Xi[1],10)];NE(A,Ay,"",Ne,or),zC(a,d,m,Ne,Va,or),lw(L,or,Mt)}}_n=_n.nextSibling}return an}function RE(a,l,d){0===d&&a.push(l)}function lw(a,l,d){0===d&&(a.push(~l),a.push(l))}function NE(a,l,d,m,A){null!==l&&a.push(l),a.push(d,A,function(a,l,d){return 0|l<<17|d<<1}(0,m,A))}function dw(a,l,d){a.push(l<<1|1,d.name,d.value)}const QC=/\[(\ufffd.+?\ufffd?)\]/,fw=/\[(\ufffd.+?\ufffd?)\]|(\ufffd\/?\*\d+:\d+\ufffd)/g,XC=/({\s*)(VAR_(PLURAL|SELECT)(_\d+)?)(\s*,)/g,pw=/{([A-Z0-9_]+)}/g,hw=/\ufffdI18N_EXP_(ICU(_\d+)?)\ufffd/g,KC=/\/\*/,_w=/\d+\:(\d+)/;function PE(a,l,d=-1){const m=ua(),A=Fi(),L=20+a,te=Pl(m.consts,l),le=bl();m.firstCreatePass&&function(a,l,d,m,A,L){const te=bl(),le=[],Ne=[],qe=[[]],Mt=function(a){return a.replace(tw," ")}(A=function(a,l){if(function(a){return-1===a}(l))return VC(a);{const d=a.indexOf(`:${l}\ufffd`)+2+l.toString().length,m=a.search(new RegExp(`\ufffd\\/\\*\\d+:${l}\ufffd`));return VC(a.substring(d,m))}}(A,L)).split(ew);for(let an=0;an<Mt.length;an++){let _n=Mt[an];if(0==(1&an)){const or=DE(_n);for(let Rr=0;Rr<or.length;Rr++){let bi=or[Rr];if(0==(1&Rr)){const ni=bi;""!==ni&&rw(a,te,qe[0],le,Ne,d,ni)}else{const ni=bi;if("object"!=typeof ni)throw new Error(`Unable to parse ICU expression in "${A}" message.`);zC(a,d,Ne,l,ni,jC(a,te,qe[0],d,le,"",!0).index)}}}else{const or=47===_n.charCodeAt(0),bi=(_n.charCodeAt(or?1:0),20+Number.parseInt(_n.substring(or?2:1)));if(or)qe.shift(),Au(bl(),!1);else{const ni=GO(a,qe[0],bi);qe.unshift([]),Au(ni,!0)}}}a.data[m]={create:le,update:Ne}}(m,null===le?0:le.index,A,L,te,d);const Ne=m.data[L],Mt=Ep(m,le===A[6]?null:le,A);(function(a,l,d,m){const A=a[11];for(let L=0;L<l.length;L++){const te=l[L++],le=l[L],Ne=(te&Ad.COMMENT)===Ad.COMMENT,qe=(te&Ad.APPEND_EAGERLY)===Ad.APPEND_EAGERLY,Mt=te>>>Ad.SHIFT;let an=a[Mt];null===an&&(an=a[Mt]=Ne?A.createComment(le):Rf(A,le)),qe&&null!==d&&ph(A,d,an,m,!1)}})(A,Ne.create,Mt,le&&8&le.type?A[le.index]:null),Ja(!0)}function xy(){Ja(!1)}function qC(a,l,d){PE(a,l,d),xy()}function eM(a,l){const d=ua();!function(a,l,d){const A=As().index,L=[];if(a.firstCreatePass&&null===a.data[l]){for(let te=0;te<d.length;te+=2){const le=d[te],Ne=d[te+1];if(""!==Ne){if(XO.test(Ne))throw new Error(`ICU expressions are not supported in attributes. Message: "${Ne}".`);Fv(L,Ne,A,le,ow(L),null)}}a.data[l]=L}}(d,a+20,Pl(d.consts,l))}function IE(a){return function(a){a&&(Vm|=1<<Math.min(Lv,31)),Lv++}(rf(Fi(),_u(),a)),IE}function tM(a){!function(a,l,d){if(Lv>0){const m=a.data[d];kC(a,l,Array.isArray(m)?m:m.update,Ar()-Lv-1,Vm)}Vm=0,Lv=0}(ua(),Fi(),a+20)}function nM(a,l={}){return function(a,l={}){let d=a;if(QC.test(a)){const m={},A=[0];d=d.replace(fw,(L,te,le)=>{const Ne=te||le,qe=m[Ne]||[];if(qe.length||(Ne.split("|").forEach(bi=>{const ni=bi.match(_w),Oo=ni?parseInt(ni[1],10):0,Xi=KC.test(bi);qe.push([Oo,Xi,bi])}),m[Ne]=qe),!qe.length)throw new Error(`i18n postprocess: unmatched placeholder - ${Ne}`);const Mt=A[A.length-1];let an=0;for(let bi=0;bi<qe.length;bi++)if(qe[bi][0]===Mt){an=bi;break}const[_n,or,Rr]=qe[an];return or?A.pop():Mt!==_n&&A.push(_n),qe.splice(an,1),Rr})}return Object.keys(l).length&&(d=d.replace(XC,(m,A,L,te,le,Ne)=>l.hasOwnProperty(L)?`${A}${l[L]}${Ne}`:m),d=d.replace(pw,(m,A)=>l.hasOwnProperty(A)?l[A]:m),d=d.replace(hw,(m,A)=>{if(l.hasOwnProperty(A)){const L=l[A];if(!L.length)throw new Error(`i18n postprocess: unmatched ICU - ${m} with key: ${A}`);return L.shift()}return m})),d}(a,l)}function LE(a,l,d,m,A){if(a=Z(a),Array.isArray(a))for(let L=0;L<a.length;L++)LE(a[L],l,d,m,A);else{const L=ua(),te=Fi();let le=Vh(a)?a:Z(a.provide),Ne=nf(a);const qe=As(),Mt=1048575&qe.providerIndexes,an=qe.directiveStart,_n=qe.providerIndexes>>20;if(Vh(a)||!a.multi){const or=new Xs(Ne,A,k1),Rr=kE(le,l,A?Mt:Mt+_n,an);-1===Rr?(va(ss(qe,te),L,le),FE(L,a,l.length),l.push(le),qe.directiveStart++,qe.directiveEnd++,A&&(qe.providerIndexes+=1048576),d.push(or),te.push(or)):(d[Rr]=or,te[Rr]=or)}else{const or=kE(le,l,Mt+_n,an),Rr=kE(le,l,Mt,Mt+_n),bi=or>=0&&d[or],ni=Rr>=0&&d[Rr];if(A&&!ni||!A&&!bi){va(ss(qe,te),L,le);const Oo=function(a,l,d,m,A){const L=new Xs(a,d,k1);return L.multi=[],L.index=l,L.componentProviders=0,rM(L,A,m&&!d),L}(A?yw:vw,d.length,A,m,Ne);!A&&ni&&(d[Rr].providerFactory=Oo),FE(L,a,l.length,0),l.push(le),qe.directiveStart++,qe.directiveEnd++,A&&(qe.providerIndexes+=1048576),d.push(Oo),te.push(Oo)}else FE(L,a,or>-1?or:Rr,rM(d[A?Rr:or],Ne,!A&&m));!A&&m&&ni&&d[Rr].componentProviders++}}}function FE(a,l,d,m){const A=Vh(l);if(A||function(a){return!!a.useClass}(l)){const te=(l.useClass||l).prototype.ngOnDestroy;if(te){const le=a.destroyHooks||(a.destroyHooks=[]);if(!A&&l.multi){const Ne=le.indexOf(d);-1===Ne?le.push(d,[m,te]):le[Ne+1].push(m,te)}else le.push(d,te)}}}function rM(a,l,d){return d&&a.componentProviders++,a.multi.push(l)-1}function kE(a,l,d,m){for(let A=d;A<m;A++)if(l[A]===a)return A;return-1}function vw(a,l,d,m){return $E(this.multi,[])}function yw(a,l,d,m){const A=this.multi;let L;if(this.providerFactory){const te=this.providerFactory.componentProviders,le=Tc(d,d[1],this.providerFactory.index,m);L=le.slice(0,te),$E(A,L);for(let Ne=te;Ne<le.length;Ne++)L.push(le[Ne])}else L=[],$E(A,L);return L}function $E(a,l){for(let d=0;d<a.length;d++)l.push((0,a[d])());return l}function HE(a,l=[]){return d=>{d.providersResolver=(m,A)=>function(a,l,d){const m=ua();if(m.firstCreatePass){const A=Da(a);LE(d,m.data,m.blueprint,A,!0),LE(l,m.data,m.blueprint,A,!1)}}(m,A?A(a):a,l)}}class Ew{}class iM{}const sM="ngComponent";class UE{resolveComponentFactory(l){throw function(a){const l=Error(`No component factory found for ${T(a)}. Did you add it to @NgModule.entryComponents?`);return l[sM]=a,l}(l)}}let kv=(()=>{class a{}return a.NULL=new UE,a})();function Dy(...a){}function im(a,l){return new sg(Qi(a,l))}const Sw=function(){return im(As(),Fi())};let sg=(()=>{class a{constructor(d){this.nativeElement=d}}return a.__NG_ELEMENT_ID__=Sw,a})();function uM(a){return a instanceof sg?a.nativeElement:a}class Ry{}let Cw=(()=>{class a{}return a.__NG_ELEMENT_ID__=()=>Aw(),a})();const Aw=function(){const a=Fi(),d=Ms(As().index,a);return function(a){return a[11]}(pa(d)?d:a)};let YE=(()=>{class a{}return a.\u0275prov=Dt({token:a,providedIn:"root",factory:()=>null}),a})();class cM{constructor(l){this.full=l,this.major=l.split(".")[0],this.minor=l.split(".")[1],this.patch=l.split(".").slice(2).join(".")}}const dM=new cM("12.2.13");class fM{constructor(){}supports(l){return Zm(l)}create(l){return new Dw(l)}}const xw=(a,l)=>l;class Dw{constructor(l){this.length=0,this._linkedRecords=null,this._unlinkedRecords=null,this._previousItHead=null,this._itHead=null,this._itTail=null,this._additionsHead=null,this._additionsTail=null,this._movesHead=null,this._movesTail=null,this._removalsHead=null,this._removalsTail=null,this._identityChangesHead=null,this._identityChangesTail=null,this._trackByFn=l||xw}forEachItem(l){let d;for(d=this._itHead;null!==d;d=d._next)l(d)}forEachOperation(l){let d=this._itHead,m=this._removalsHead,A=0,L=null;for(;d||m;){const te=!m||d&&d.currentIndex<hM(m,A,L)?d:m,le=hM(te,A,L),Ne=te.currentIndex;if(te===m)A--,m=m._nextRemoved;else if(d=d._next,null==te.previousIndex)A++;else{L||(L=[]);const qe=le-A,Mt=Ne-A;if(qe!=Mt){for(let _n=0;_n<qe;_n++){const or=_n<L.length?L[_n]:L[_n]=0,Rr=or+_n;Mt<=Rr&&Rr<qe&&(L[_n]=or+1)}L[te.previousIndex]=Mt-qe}}le!==Ne&&l(te,le,Ne)}}forEachPreviousItem(l){let d;for(d=this._previousItHead;null!==d;d=d._nextPrevious)l(d)}forEachAddedItem(l){let d;for(d=this._additionsHead;null!==d;d=d._nextAdded)l(d)}forEachMovedItem(l){let d;for(d=this._movesHead;null!==d;d=d._nextMoved)l(d)}forEachRemovedItem(l){let d;for(d=this._removalsHead;null!==d;d=d._nextRemoved)l(d)}forEachIdentityChange(l){let d;for(d=this._identityChangesHead;null!==d;d=d._nextIdentityChange)l(d)}diff(l){if(null==l&&(l=[]),!Zm(l))throw new Error(`Error trying to diff '${T(l)}'. Only arrays and iterables are allowed`);return this.check(l)?this:null}onDestroy(){}check(l){this._reset();let A,L,te,d=this._itHead,m=!1;if(Array.isArray(l)){this.length=l.length;for(let le=0;le<this.length;le++)L=l[le],te=this._trackByFn(le,L),null!==d&&Object.is(d.trackById,te)?(m&&(d=this._verifyReinsertion(d,L,te,le)),Object.is(d.item,L)||this._addIdentityChange(d,L)):(d=this._mismatch(d,L,te,le),m=!0),d=d._next}else A=0,function(a,l){if(Array.isArray(a))for(let d=0;d<a.length;d++)l(a[d]);else{const d=a[ng()]();let m;for(;!(m=d.next()).done;)l(m.value)}}(l,le=>{te=this._trackByFn(A,le),null!==d&&Object.is(d.trackById,te)?(m&&(d=this._verifyReinsertion(d,le,te,A)),Object.is(d.item,le)||this._addIdentityChange(d,le)):(d=this._mismatch(d,le,te,A),m=!0),d=d._next,A++}),this.length=A;return this._truncate(d),this.collection=l,this.isDirty}get isDirty(){return null!==this._additionsHead||null!==this._movesHead||null!==this._removalsHead||null!==this._identityChangesHead}_reset(){if(this.isDirty){let l;for(l=this._previousItHead=this._itHead;null!==l;l=l._next)l._nextPrevious=l._next;for(l=this._additionsHead;null!==l;l=l._nextAdded)l.previousIndex=l.currentIndex;for(this._additionsHead=this._additionsTail=null,l=this._movesHead;null!==l;l=l._nextMoved)l.previousIndex=l.currentIndex;this._movesHead=this._movesTail=null,this._removalsHead=this._removalsTail=null,this._identityChangesHead=this._identityChangesTail=null}}_mismatch(l,d,m,A){let L;return null===l?L=this._itTail:(L=l._prev,this._remove(l)),null!==(l=null===this._unlinkedRecords?null:this._unlinkedRecords.get(m,null))?(Object.is(l.item,d)||this._addIdentityChange(l,d),this._reinsertAfter(l,L,A)):null!==(l=null===this._linkedRecords?null:this._linkedRecords.get(m,A))?(Object.is(l.item,d)||this._addIdentityChange(l,d),this._moveAfter(l,L,A)):l=this._addAfter(new Rw(d,m),L,A),l}_verifyReinsertion(l,d,m,A){let L=null===this._unlinkedRecords?null:this._unlinkedRecords.get(m,null);return null!==L?l=this._reinsertAfter(L,l._prev,A):l.currentIndex!=A&&(l.currentIndex=A,this._addToMoves(l,A)),l}_truncate(l){for(;null!==l;){const d=l._next;this._addToRemovals(this._unlink(l)),l=d}null!==this._unlinkedRecords&&this._unlinkedRecords.clear(),null!==this._additionsTail&&(this._additionsTail._nextAdded=null),null!==this._movesTail&&(this._movesTail._nextMoved=null),null!==this._itTail&&(this._itTail._next=null),null!==this._removalsTail&&(this._removalsTail._nextRemoved=null),null!==this._identityChangesTail&&(this._identityChangesTail._nextIdentityChange=null)}_reinsertAfter(l,d,m){null!==this._unlinkedRecords&&this._unlinkedRecords.remove(l);const A=l._prevRemoved,L=l._nextRemoved;return null===A?this._removalsHead=L:A._nextRemoved=L,null===L?this._removalsTail=A:L._prevRemoved=A,this._insertAfter(l,d,m),this._addToMoves(l,m),l}_moveAfter(l,d,m){return this._unlink(l),this._insertAfter(l,d,m),this._addToMoves(l,m),l}_addAfter(l,d,m){return this._insertAfter(l,d,m),this._additionsTail=null===this._additionsTail?this._additionsHead=l:this._additionsTail._nextAdded=l,l}_insertAfter(l,d,m){const A=null===d?this._itHead:d._next;return l._next=A,l._prev=d,null===A?this._itTail=l:A._prev=l,null===d?this._itHead=l:d._next=l,null===this._linkedRecords&&(this._linkedRecords=new pM),this._linkedRecords.put(l),l.currentIndex=m,l}_remove(l){return this._addToRemovals(this._unlink(l))}_unlink(l){null!==this._linkedRecords&&this._linkedRecords.remove(l);const d=l._prev,m=l._next;return null===d?this._itHead=m:d._next=m,null===m?this._itTail=d:m._prev=d,l}_addToMoves(l,d){return l.previousIndex===d||(this._movesTail=null===this._movesTail?this._movesHead=l:this._movesTail._nextMoved=l),l}_addToRemovals(l){return null===this._unlinkedRecords&&(this._unlinkedRecords=new pM),this._unlinkedRecords.put(l),l.currentIndex=null,l._nextRemoved=null,null===this._removalsTail?(this._removalsTail=this._removalsHead=l,l._prevRemoved=null):(l._prevRemoved=this._removalsTail,this._removalsTail=this._removalsTail._nextRemoved=l),l}_addIdentityChange(l,d){return l.item=d,this._identityChangesTail=null===this._identityChangesTail?this._identityChangesHead=l:this._identityChangesTail._nextIdentityChange=l,l}}class Rw{constructor(l,d){this.item=l,this.trackById=d,this.currentIndex=null,this.previousIndex=null,this._nextPrevious=null,this._prev=null,this._next=null,this._prevDup=null,this._nextDup=null,this._prevRemoved=null,this._nextRemoved=null,this._nextAdded=null,this._nextMoved=null,this._nextIdentityChange=null}}class Nw{constructor(){this._head=null,this._tail=null}add(l){null===this._head?(this._head=this._tail=l,l._nextDup=null,l._prevDup=null):(this._tail._nextDup=l,l._prevDup=this._tail,l._nextDup=null,this._tail=l)}get(l,d){let m;for(m=this._head;null!==m;m=m._nextDup)if((null===d||d<=m.currentIndex)&&Object.is(m.trackById,l))return m;return null}remove(l){const d=l._prevDup,m=l._nextDup;return null===d?this._head=m:d._nextDup=m,null===m?this._tail=d:m._prevDup=d,null===this._head}}class pM{constructor(){this.map=new Map}put(l){const d=l.trackById;let m=this.map.get(d);m||(m=new Nw,this.map.set(d,m)),m.add(l)}get(l,d){const A=this.map.get(l);return A?A.get(l,d):null}remove(l){const d=l.trackById;return this.map.get(d).remove(l)&&this.map.delete(d),l}get isEmpty(){return 0===this.map.size}clear(){this.map.clear()}}function hM(a,l,d){const m=a.previousIndex;if(null===m)return m;let A=0;return d&&m<d.length&&(A=d[m]),m+l+A}class _M{constructor(){}supports(l){return l instanceof Map||P1(l)}create(){return new Pw}}class Pw{constructor(){this._records=new Map,this._mapHead=null,this._appendAfter=null,this._previousMapHead=null,this._changesHead=null,this._changesTail=null,this._additionsHead=null,this._additionsTail=null,this._removalsHead=null,this._removalsTail=null}get isDirty(){return null!==this._additionsHead||null!==this._changesHead||null!==this._removalsHead}forEachItem(l){let d;for(d=this._mapHead;null!==d;d=d._next)l(d)}forEachPreviousItem(l){let d;for(d=this._previousMapHead;null!==d;d=d._nextPrevious)l(d)}forEachChangedItem(l){let d;for(d=this._changesHead;null!==d;d=d._nextChanged)l(d)}forEachAddedItem(l){let d;for(d=this._additionsHead;null!==d;d=d._nextAdded)l(d)}forEachRemovedItem(l){let d;for(d=this._removalsHead;null!==d;d=d._nextRemoved)l(d)}diff(l){if(l){if(!(l instanceof Map||P1(l)))throw new Error(`Error trying to diff '${T(l)}'. Only maps and objects are allowed`)}else l=new Map;return this.check(l)?this:null}onDestroy(){}check(l){this._reset();let d=this._mapHead;if(this._appendAfter=null,this._forEach(l,(m,A)=>{if(d&&d.key===A)this._maybeAddToChanges(d,m),this._appendAfter=d,d=d._next;else{const L=this._getOrCreateRecordForKey(A,m);d=this._insertBeforeOrAppend(d,L)}}),d){d._prev&&(d._prev._next=null),this._removalsHead=d;for(let m=d;null!==m;m=m._nextRemoved)m===this._mapHead&&(this._mapHead=null),this._records.delete(m.key),m._nextRemoved=m._next,m.previousValue=m.currentValue,m.currentValue=null,m._prev=null,m._next=null}return this._changesTail&&(this._changesTail._nextChanged=null),this._additionsTail&&(this._additionsTail._nextAdded=null),this.isDirty}_insertBeforeOrAppend(l,d){if(l){const m=l._prev;return d._next=l,d._prev=m,l._prev=d,m&&(m._next=d),l===this._mapHead&&(this._mapHead=d),this._appendAfter=l,l}return this._appendAfter?(this._appendAfter._next=d,d._prev=this._appendAfter):this._mapHead=d,this._appendAfter=d,null}_getOrCreateRecordForKey(l,d){if(this._records.has(l)){const A=this._records.get(l);this._maybeAddToChanges(A,d);const L=A._prev,te=A._next;return L&&(L._next=te),te&&(te._prev=L),A._next=null,A._prev=null,A}const m=new Iw(l);return this._records.set(l,m),m.currentValue=d,this._addToAdditions(m),m}_reset(){if(this.isDirty){let l;for(this._previousMapHead=this._mapHead,l=this._previousMapHead;null!==l;l=l._next)l._nextPrevious=l._next;for(l=this._changesHead;null!==l;l=l._nextChanged)l.previousValue=l.currentValue;for(l=this._additionsHead;null!=l;l=l._nextAdded)l.previousValue=l.currentValue;this._changesHead=this._changesTail=null,this._additionsHead=this._additionsTail=null,this._removalsHead=null}}_maybeAddToChanges(l,d){Object.is(d,l.currentValue)||(l.previousValue=l.currentValue,l.currentValue=d,this._addToChanges(l))}_addToAdditions(l){null===this._additionsHead?this._additionsHead=this._additionsTail=l:(this._additionsTail._nextAdded=l,this._additionsTail=l)}_addToChanges(l){null===this._changesHead?this._changesHead=this._changesTail=l:(this._changesTail._nextChanged=l,this._changesTail=l)}_forEach(l,d){l instanceof Map?l.forEach(d):Object.keys(l).forEach(m=>d(l[m],m))}}class Iw{constructor(l){this.key=l,this.previousValue=null,this.currentValue=null,this._nextPrevious=null,this._next=null,this._prev=null,this._nextAdded=null,this._nextRemoved=null,this._nextChanged=null}}function gM(){return new Ny([new fM])}let Ny=(()=>{class a{constructor(d){this.factories=d}static create(d,m){if(null!=m){const A=m.factories.slice();d=d.concat(A)}return new a(d)}static extend(d){return{provide:a,useFactory:m=>a.create(d,m||gM()),deps:[[a,new ol,new sa]]}}find(d){const m=this.factories.find(A=>A.supports(d));if(null!=m)return m;throw new Error(`Cannot find a differ supporting object '${d}' of type '${function(a){return a.name||typeof a}(d)}'`)}}return a.\u0275prov=Dt({token:a,providedIn:"root",factory:gM}),a})();function mM(){return new Py([new _M])}let Py=(()=>{class a{constructor(d){this.factories=d}static create(d,m){if(m){const A=m.factories.slice();d=d.concat(A)}return new a(d)}static extend(d){return{provide:a,useFactory:m=>a.create(d,m||mM()),deps:[[a,new ol,new sa]]}}find(d){const m=this.factories.find(A=>A.supports(d));if(m)return m;throw new Error(`Cannot find a differ supporting object '${d}'`)}}return a.\u0275prov=Dt({token:a,providedIn:"root",factory:mM}),a})();function Iy(a,l,d,m,A=!1){for(;null!==d;){const L=l[d.index];if(null!==L&&m.push(Me(L)),Bs(L))for(let le=10;le<L.length;le++){const Ne=L[le],qe=Ne[1].firstChild;null!==qe&&Iy(Ne[1],Ne,qe,m)}const te=d.type;if(8&te)Iy(a,l,d.child,m);else if(32&te){const le=bf(d,l);let Ne;for(;Ne=le();)m.push(Ne)}else if(16&te){const le=Sg(l,d);if(Array.isArray(le))m.push(...le);else{const Ne=sd(l[16]);Iy(Ne[1],Ne,le,m,!0)}}d=A?d.projectionNext:d.next}return m}class Z1{constructor(l,d){this._lView=l,this._cdRefInjectingView=d,this._appRef=null,this._attachedToViewContainer=!1}get rootNodes(){const l=this._lView,d=l[1];return Iy(d,l,d.firstChild,[])}get context(){return this._lView[8]}set context(l){this._lView[8]=l}get destroyed(){return 256==(256&this._lView[2])}destroy(){if(this._appRef)this._appRef.detachView(this);else if(this._attachedToViewContainer){const l=this._lView[3];if(Bs(l)){const d=l[8],m=d?d.indexOf(this):-1;m>-1&&(yg(l,m),cl(d,m))}this._attachedToViewContainer=!1}bp(this._lView[1],this._lView)}onDestroy(l){at(this._lView[1],this._lView,null,l)}markForCheck(){tf(this._cdRefInjectingView||this._lView)}detach(){this._lView[2]&=-129}reattach(){this._lView[2]|=128}detectChanges(){b1(this._lView[1],this._lView,this.context)}checkNoChanges(){!function(a,l,d){Yo(!0);try{b1(a,l,d)}finally{Yo(!1)}}(this._lView[1],this._lView,this.context)}attachToViewContainerRef(){if(this._appRef)throw new Error("This view is already attached directly to the ApplicationRef!");this._attachedToViewContainer=!0}detachFromAppRef(){var l;this._appRef=null,Hh(this._lView[1],l=this._lView,l[11],2,null,null)}attachToAppRef(l){if(this._attachedToViewContainer)throw new Error("This view is already attached to a ViewContainer!");this._appRef=l}}class Fw extends Z1{constructor(l){super(l),this._view=l}detectChanges(){y_(this._view)}checkNoChanges(){!function(a){Yo(!0);try{y_(a)}finally{Yo(!1)}}(this._view)}get context(){return null}}const kw=function(a){return function(a,l,d){if(yl(a)&&!d){const m=Ms(a.index,l);return new Z1(m,m)}return 47&a.type?new Z1(l[16],l):null}(As(),Fi(),16==(16&a))};let $w=(()=>{class a{}return a.__NG_ELEMENT_ID__=kw,a})();const Bw=[new _M],Zw=new Ny([new fM]),jw=new Py(Bw),Vw=function(){return Ly(As(),Fi())};let j1=(()=>{class a{}return a.__NG_ELEMENT_ID__=Vw,a})();const zw=j1,Ww=class extends zw{constructor(l,d,m){super(),this._declarationLView=l,this._declarationTContainer=d,this.elementRef=m}createEmbeddedView(l){const d=this._declarationTContainer.tViews,m=Mp(this._declarationLView,d,l,16,null,d.declTNode,null,null,null,null);m[17]=this._declarationLView[this._declarationTContainer.index];const L=this._declarationLView[19];return null!==L&&(m[19]=L.createEmbeddedView(d)),X_(d,m,l),new Z1(m)}};function Ly(a,l){return 4&a.type?new Ww(l,a,im(a,l)):null}class Wm{}class vM{}const Xw=function(){return EM(As(),Fi())};let Fy=(()=>{class a{}return a.__NG_ELEMENT_ID__=Xw,a})();const qw=Fy,yM=class extends qw{constructor(l,d,m){super(),this._lContainer=l,this._hostTNode=d,this._hostLView=m}get element(){return im(this._hostTNode,this._hostLView)}get injector(){return new Gc(this._hostTNode,this._hostLView)}get parentInjector(){const l=fc(this._hostTNode,this._hostLView);if(Be(l)){const d=it(l,this._hostLView),m=Pe(l);return new Gc(d[1].data[m+8],d)}return new Gc(null,this._hostLView)}clear(){for(;this.length>0;)this.remove(this.length-1)}get(l){const d=bM(this._lContainer);return null!==d&&d[l]||null}get length(){return this._lContainer.length-10}createEmbeddedView(l,d,m){const A=l.createEmbeddedView(d||{});return this.insert(A,m),A}createComponent(l,d,m,A,L){const te=m||this.parentInjector;if(!L&&null==l.ngModule&&te){const Ne=te.get(Wm,null);Ne&&(L=Ne)}const le=l.create(te,A,void 0,L);return this.insert(le.hostView,d),le}insert(l,d){const m=l._lView,A=m[1];if(Bs(m[3])){const Mt=this.indexOf(l);if(-1!==Mt)this.detach(Mt);else{const an=m[3],_n=new yM(an,an[6],an[3]);_n.detach(_n.indexOf(l))}}const L=this._adjustIndex(d),te=this._lContainer;!function(a,l,d,m){const A=10+m,L=d.length;m>0&&(d[A-1][4]=l),m<L-10?(l[4]=d[A],Ji(d,10+m,l)):(d.push(l),l[4]=null),l[3]=d;const te=l[17];null!==te&&d!==te&&function(a,l){const d=a[9];l[16]!==l[3][3][16]&&(a[2]=!0),null===d?a[9]=[l]:d.push(l)}(te,l);const le=l[19];null!==le&&le.insertView(a),l[2]|=128}(A,m,te,L);const le=Cg(L,te),Ne=m[11],qe=Yd(Ne,te[7]);return null!==qe&&function(a,l,d,m,A,L){m[0]=A,m[6]=l,Hh(a,m,d,1,A,L)}(A,te[6],Ne,m,qe,le),l.attachToViewContainerRef(),Ji(jE(te),L,l),l}move(l,d){return this.insert(l,d)}indexOf(l){const d=bM(this._lContainer);return null!==d?d.indexOf(l):-1}remove(l){const d=this._adjustIndex(l,-1),m=yg(this._lContainer,d);m&&(cl(jE(this._lContainer),d),bp(m[1],m))}detach(l){const d=this._adjustIndex(l,-1),m=yg(this._lContainer,d);return m&&null!=cl(jE(this._lContainer),d)?new Z1(m):null}_adjustIndex(l,d=0){return null==l?this.length+d:l}};function bM(a){return a[8]}function jE(a){return a[8]||(a[8]=[])}function EM(a,l){let d;const m=l[a.index];if(Bs(m))d=m;else{let A;if(8&a.type)A=Me(m);else{const L=l[11];A=L.createComment("");const te=Qi(a,l);ph(L,Yd(L,te),A,function(a,l){return rt(a)?a.nextSibling(l):l.nextSibling}(L,te),!1)}l[a.index]=d=yv(m,l,A,a),y1(l,d)}return new yM(d,a,l)}const Bv={};class WM extends kv{constructor(l){super(),this.ngModule=l}resolveComponentFactory(l){const d=Mo(l);return new QM(d,this.ngModule)}}function JM(a){const l=[];for(let d in a)a.hasOwnProperty(d)&&l.push({propName:a[d],templateName:d});return l}const Nx=new Xl("SCHEDULER_TOKEN",{providedIn:"root",factory:()=>Ih});class QM extends iM{constructor(l,d){super(),this.componentDef=l,this.ngModule=d,this.componentType=l.type,this.selector=l.selectors.map(fs).join(","),this.ngContentSelectors=l.ngContentSelectors?l.ngContentSelectors:[],this.isBoundToModule=!!d}get inputs(){return JM(this.componentDef.inputs)}get outputs(){return JM(this.componentDef.outputs)}create(l,d,m,A){const L=(A=A||this.ngModule)?function(a,l){return{get:(d,m,A)=>{const L=a.get(d,Bv,A);return L!==Bv||m===Bv?L:l.get(d,m,A)}}}(l,A.injector):l,te=L.get(Ry,ct),le=L.get(YE,null),Ne=te.createRenderer(null,this.componentDef),qe=this.componentDef.selectors[0][0]||"div",Mt=m?function(a,l,d){if(rt(a))return a.selectRootElement(l,d===Vn.ShadowDom);let m="string"==typeof l?a.querySelector(l):l;return m.textContent="",m}(Ne,m,this.componentDef.encapsulation):Fh(te.createRenderer(null,this.componentDef),qe,function(a){const l=a.toLowerCase();return"svg"===l?"http://www.w3.org/2000/svg":"math"===l?"http://www.w3.org/1998/MathML/":null}(qe)),an=this.componentDef.onPush?576:528,_n=function(a,l){return{components:[],scheduler:a||Ih,clean:bS,playerHandler:l||null,flags:0}}(),or=jg(0,null,null,1,0,null,null,null,null,null),Rr=Mp(null,or,_n,an,null,null,te,Ne,le,L);let bi,ni;un(Rr);try{const Oo=function(a,l,d,m,A,L){const te=d[1];d[20]=a;const Ne=rp(te,20,2,"#host",null),qe=Ne.mergedAttrs=l.hostAttrs;null!==qe&&(E1(Ne,qe,!0),null!==a&&(nc(A,a,qe),null!==Ne.classes&&Uh(A,a,Ne.classes),null!==Ne.styles&&Ug(A,a,Ne.styles)));const Mt=m.createRenderer(a,l),an=Mp(d,mv(l),null,l.onPush?64:16,d[20],Ne,m,Mt,L||null,null);return te.firstCreatePass&&(va(ss(Ne,d),te,l.type),Zu(te,Ne),F0(Ne,d.length,1)),y1(d,an),d[20]=an}(Mt,this.componentDef,Rr,te,Ne);if(Mt)if(m)nc(Ne,Mt,["ng-version",dM.full]);else{const{attrs:Xi,classes:oa}=function(a){const l=[],d=[];let m=1,A=2;for(;m<a.length;){let L=a[m];if("string"==typeof L)2===A?""!==L&&l.push(L,a[++m]):8===A&&d.push(L);else{if(!G(A))break;A=L}m++}return{attrs:l,classes:d}}(this.componentDef.selectors[0]);Xi&&nc(Ne,Mt,Xi),oa&&oa.length>0&&Uh(Ne,Mt,oa.join(" "))}if(ni=Es(or,20),void 0!==d){const Xi=ni.projection=[];for(let oa=0;oa<this.ngContentSelectors.length;oa++){const Va=d[oa];Xi.push(null!=Va?Array.from(Va):null)}}bi=function(a,l,d,m,A){const L=d[1],te=function(a,l,d){const m=As();a.firstCreatePass&&(d.providersResolver&&d.providersResolver(d),k0(a,m,l,Gp(a,l,1,null),d));const A=Tc(l,a,m.directiveStart,m);Jc(A,l);const L=Qi(m,l);return L&&Jc(L,l),A}(L,d,l);if(m.components.push(te),a[8]=te,A&&A.forEach(Ne=>Ne(te,l)),l.contentQueries){const Ne=As();l.contentQueries(1,te,Ne.directiveStart)}const le=As();return!L.firstCreatePass||null===l.hostBindings&&null===l.hostAttrs||(Mr(le.index),Ap(d[1],le,0,le.directiveStart,le.directiveEnd,l),Xc(l,te)),te}(Oo,this.componentDef,Rr,_n,[Wb]),X_(or,Rr,null)}finally{oi()}return new Lx(this.componentType,bi,im(ni,Rr),Rr,ni)}}class Lx extends Ew{constructor(l,d,m,A,L){super(),this.location=m,this._rootLView=A,this._tNode=L,this.instance=d,this.hostView=this.changeDetectorRef=new Fw(A),this.componentType=l}get injector(){return new Gc(this._tNode,this._rootLView)}destroy(){this.hostView.destroy()}onDestroy(l){this.hostView.onDestroy(l)}}const lm=new Map;class Hx extends Wm{constructor(l,d){super(),this._parent=d,this._bootstrapComponents=[],this.injector=this,this.destroyCbs=[],this.componentFactoryResolver=new WM(this);const m=zo(l),A=l[no]||null;A&&AE(A),this._bootstrapComponents=yf(m.bootstrap),this._r3Injector=ad(l,d,[{provide:Wm,useValue:this},{provide:kv,useValue:this.componentFactoryResolver}],T(l)),this._r3Injector._resolveInjectorDefTypes(),this.instance=this.get(l)}get(l,d=Gu.THROW_IF_NOT_FOUND,m=Ur.Default){return l===Gu||l===Wm||l===Gg?this:this._r3Injector.get(l,d,m)}destroy(){const l=this._r3Injector;!l.destroyed&&l.destroy(),this.destroyCbs.forEach(d=>d()),this.destroyCbs=null}onDestroy(l){this.destroyCbs.push(l)}}class r0 extends vM{constructor(l){super(),this.moduleType=l,null!==zo(l)&&function(a){const l=new Set;!function d(m){const A=zo(m,!0),L=A.id;null!==L&&(function(a,l,d){if(l&&l!==d)throw new Error(`Duplicate module registered for ${a} - ${T(l)} vs ${T(l.name)}`)}(L,lm.get(L),m),lm.set(L,m));const te=yf(A.imports);for(const le of te)l.has(le)||(l.add(le),d(le))}(a)}(l)}create(l){return new Hx(this.moduleType,l)}}function i0(a,l,d){const m=du()+a,A=Fi();return A[m]===_o?zh(A,m,d?l.call(d):l()):jm(A,m)}function sT(a,l,d,m){return t2(Fi(),du(),a,l,d,m)}function XM(a,l,d,m,A){return n2(Fi(),du(),a,l,d,m,A)}function KM(a,l,d,m,A,L){return aT(Fi(),du(),a,l,d,m,A,L)}function qM(a,l,d,m,A,L,te){return function(a,l,d,m,A,L,te,le,Ne){const qe=l+d;return Vp(a,qe,A,L,te,le)?zh(a,qe+4,Ne?m.call(Ne,A,L,te,le):m(A,L,te,le)):o0(a,qe+4)}(Fi(),du(),a,l,d,m,A,L,te)}function e2(a,l,d,m,A,L,te,le){const Ne=du()+a,qe=Fi(),Mt=Vp(qe,Ne,d,m,A,L);return rf(qe,Ne+4,te)||Mt?zh(qe,Ne+5,le?l.call(le,d,m,A,L,te):l(d,m,A,L,te)):jm(qe,Ne+5)}function o0(a,l){const d=a[l];return d===_o?void 0:d}function t2(a,l,d,m,A,L){const te=l+d;return rf(a,te,A)?zh(a,te+1,L?m.call(L,A):m(A)):o0(a,te+1)}function n2(a,l,d,m,A,L,te){const le=l+d;return E_(a,le,A,L)?zh(a,le+2,te?m.call(te,A,L):m(A,L)):o0(a,le+2)}function aT(a,l,d,m,A,L,te,le){const Ne=l+d;return Ov(a,Ne,A,L,te)?zh(a,Ne+3,le?m.call(le,A,L,te):m(A,L,te)):o0(a,Ne+3)}function r2(a,l){const d=ua();let m;const A=a+20;d.firstCreatePass?(m=function(a,l){if(l)for(let d=l.length-1;d>=0;d--){const m=l[d];if(a===m.name)return m}throw new ee("302",`The pipe '${a}' could not be found!`)}(l,d.pipeRegistry),d.data[A]=m,m.onDestroy&&(d.destroyHooks||(d.destroyHooks=[])).push(A,m.onDestroy)):m=d.data[A];const L=m.factory||(m.factory=Ro(m.type)),te=Hi(k1);try{const le=qt(!1),Ne=L();return qt(le),function(a,l,d,m){d>=a.data.length&&(a.data[d]=null,a.blueprint[d]=null),l[d]=m}(d,Fi(),A,Ne),Ne}finally{Hi(te)}}function i2(a,l,d){const m=a+20,A=Fi(),L=vs(A,m);return l0(A,a0(A,m)?t2(A,du(),l,L.transform,d,L):L.transform(d))}function Dg(a,l,d,m){const A=a+20,L=Fi(),te=vs(L,A);return l0(L,a0(L,A)?n2(L,du(),l,te.transform,d,m,te):te.transform(d,m))}function o2(a,l,d,m,A){const L=a+20,te=Fi(),le=vs(te,L);return l0(te,a0(te,L)?aT(te,du(),l,le.transform,d,m,A,le):le.transform(d,m,A))}function a0(a,l){return a[1].data[l].pure}function l0(a,l){return _h.isWrapped(l)&&(l=_h.unwrap(l),a[Ar()]=_o),l}function uT(a){return l=>{setTimeout(a,void 0,l)}}const ug=class extends r.xQ{constructor(l=!1){super(),this.__isAsync=l}emit(l){super.next(l)}subscribe(l,d,m){var A,L,te;let le=l,Ne=d||(()=>null),qe=m;if(l&&"object"==typeof l){const an=l;le=null===(A=an.next)||void 0===A?void 0:A.bind(an),Ne=null===(L=an.error)||void 0===L?void 0:L.bind(an),qe=null===(te=an.complete)||void 0===te?void 0:te.bind(an)}this.__isAsync&&(Ne=uT(Ne),le&&(le=uT(le)),qe&&(qe=uT(qe)));const Mt=super.subscribe({next:le,error:Ne,complete:qe});return l instanceof u.w&&l.add(Mt),Mt}};function cm(){return this._results[ng()]()}class jy{constructor(l=!1){this._emitDistinctChangesOnly=l,this.dirty=!0,this._results=[],this._changesDetected=!1,this._changes=null,this.length=0,this.first=void 0,this.last=void 0;const d=ng(),m=jy.prototype;m[d]||(m[d]=cm)}get changes(){return this._changes||(this._changes=new ug)}get(l){return this._results[l]}map(l){return this._results.map(l)}filter(l){return this._results.filter(l)}find(l){return this._results.find(l)}reduce(l,d){return this._results.reduce(l,d)}forEach(l){this._results.forEach(l)}some(l){return this._results.some(l)}toArray(){return this._results.slice()}toString(){return this._results.toString()}reset(l,d){const m=this;m.dirty=!1;const A=wc(l);(this._changesDetected=!function(a,l,d){if(a.length!==l.length)return!1;for(let m=0;m<a.length;m++){let A=a[m],L=l[m];if(d&&(A=d(A),L=d(L)),L!==A)return!1}return!0}(m._results,A,d))&&(m._results=A,m.length=A.length,m.last=A[this.length-1],m.first=A[0])}notifyOnChanges(){this._changes&&(this._changesDetected||!this._emitDistinctChangesOnly)&&this._changes.emit(this)}setDirty(){this.dirty=!0}destroy(){this.changes.complete(),this.changes.unsubscribe()}}Symbol;class cT{constructor(l){this.queryList=l,this.matches=null}clone(){return new cT(this.queryList)}setDirty(){this.queryList.setDirty()}}class dm{constructor(l=[]){this.queries=l}createEmbeddedView(l){const d=l.queries;if(null!==d){const m=null!==l.contentQueries?l.contentQueries[0]:d.length,A=[];for(let L=0;L<m;L++){const te=d.getByIndex(L);A.push(this.queries[te.indexInDeclarationView].clone())}return new dm(A)}return null}insertView(l){this.dirtyQueriesWithMatches(l)}detachView(l){this.dirtyQueriesWithMatches(l)}dirtyQueriesWithMatches(l){for(let d=0;d<this.queries.length;d++)null!==d2(l,d).matches&&this.queries[d].setDirty()}}class s2{constructor(l,d,m=null){this.predicate=l,this.flags=d,this.read=m}}class u0{constructor(l=[]){this.queries=l}elementStart(l,d){for(let m=0;m<this.queries.length;m++)this.queries[m].elementStart(l,d)}elementEnd(l){for(let d=0;d<this.queries.length;d++)this.queries[d].elementEnd(l)}embeddedTView(l){let d=null;for(let m=0;m<this.length;m++){const A=null!==d?d.length:0,L=this.getByIndex(m).embeddedTView(l,A);L&&(L.indexInDeclarationView=m,null!==d?d.push(L):d=[L])}return null!==d?new u0(d):null}template(l,d){for(let m=0;m<this.queries.length;m++)this.queries[m].template(l,d)}getByIndex(l){return this.queries[l]}get length(){return this.queries.length}track(l){this.queries.push(l)}}class dT{constructor(l,d=-1){this.metadata=l,this.matches=null,this.indexInDeclarationView=-1,this.crossesNgTemplate=!1,this._appliesToNextNode=!0,this._declarationNodeIndex=d}elementStart(l,d){this.isApplyingToNode(d)&&this.matchTNode(l,d)}elementEnd(l){this._declarationNodeIndex===l.index&&(this._appliesToNextNode=!1)}template(l,d){this.elementStart(l,d)}embeddedTView(l,d){return this.isApplyingToNode(l)?(this.crossesNgTemplate=!0,this.addMatch(-l.index,d),new dT(this.metadata)):null}isApplyingToNode(l){if(this._appliesToNextNode&&1!=(1&this.metadata.flags)){const d=this._declarationNodeIndex;let m=l.parent;for(;null!==m&&8&m.type&&m.index!==d;)m=m.parent;return d===(null!==m?m.index:-1)}return this._appliesToNextNode}matchTNode(l,d){const m=this.metadata.predicate;if(Array.isArray(m))for(let A=0;A<m.length;A++){const L=m[A];this.matchTNodeWithReadOption(l,d,fT(d,L)),this.matchTNodeWithReadOption(l,d,Jd(d,l,L,!1,!1))}else m===j1?4&d.type&&this.matchTNodeWithReadOption(l,d,-1):this.matchTNodeWithReadOption(l,d,Jd(d,l,m,!1,!1))}matchTNodeWithReadOption(l,d,m){if(null!==m){const A=this.metadata.read;if(null!==A)if(A===sg||A===Fy||A===j1&&4&d.type)this.addMatch(d.index,-2);else{const L=Jd(d,l,A,!1,!1);null!==L&&this.addMatch(d.index,L)}else this.addMatch(d.index,m)}}addMatch(l,d){null===this.matches?this.matches=[l,d]:this.matches.push(l,d)}}function fT(a,l){const d=a.localNames;if(null!==d)for(let m=0;m<d.length;m+=2)if(d[m]===l)return d[m+1];return null}function c0(a,l,d,m){return-1===d?function(a,l){return 11&a.type?im(a,l):4&a.type?Ly(a,l):null}(l,a):-2===d?function(a,l,d){return d===sg?im(l,a):d===j1?Ly(l,a):d===Fy?EM(l,a):void 0}(a,l,m):Tc(a,a[1],d,l)}function Lu(a,l,d,m){const A=l[19].queries[m];if(null===A.matches){const L=a.data,te=d.matches,le=[];for(let Ne=0;Ne<te.length;Ne+=2){const qe=te[Ne];le.push(qe<0?null:c0(l,L[qe],te[Ne+1],d.metadata.read))}A.matches=le}return A.matches}function pT(a,l,d,m){const A=a.queries.getByIndex(d),L=A.matches;if(null!==L){const te=Lu(a,l,A,d);for(let le=0;le<L.length;le+=2){const Ne=L[le];if(Ne>0)m.push(te[le/2]);else{const qe=L[le+1],Mt=l[-Ne];for(let an=10;an<Mt.length;an++){const _n=Mt[an];_n[17]===_n[3]&&pT(_n[1],_n,qe,m)}if(null!==Mt[9]){const an=Mt[9];for(let _n=0;_n<an.length;_n++){const or=an[_n];pT(or[1],or,qe,m)}}}}}return m}function Su(a){const l=Fi(),d=ua(),m=Ae();ot(m+1);const A=d2(d,m);if(a.dirty&&Ma(l)===(2==(2&A.metadata.flags))){if(null===A.matches)a.reset([]);else{const L=A.crossesNgTemplate?pT(d,l,m,[]):Lu(d,l,A,m);a.reset(L,uM),a.notifyOnChanges()}return!0}return!1}function a2(a,l,d){const m=ua();m.firstCreatePass&&(zp(m,new s2(a,l,d),-1),2==(2&l)&&(m.staticViewQueries=!0)),c2(m,Fi(),l)}function la(a,l,d,m){const A=ua();if(A.firstCreatePass){const L=As();zp(A,new s2(l,d,m),L.index),function(a,l){const d=a.contentQueries||(a.contentQueries=[]);l!==(d.length?d[d.length-1]:-1)&&d.push(a.queries.length-1,l)}(A,a),2==(2&d)&&(A.staticContentQueries=!0)}c2(A,Fi(),d)}function l2(){return a=Fi(),l=Ae(),a[19].queries[l].queryList;var a,l}function c2(a,l,d){const m=new jy(4==(4&d));at(a,l,m,m.destroy),null===l[19]&&(l[19]=new dm),l[19].queries.push(new cT(m))}function zp(a,l,d){null===a.queries&&(a.queries=new u0),a.queries.track(new dT(l,d))}function d2(a,l){return a.queries.getByIndex(l)}function Gy(a,l){return Ly(a,l)}const A2=Mc("Input",a=>({bindingPropertyName:a})),pD=Mc("Output",a=>({bindingPropertyName:a})),TT=new Xl("Application Initializer");let Gv=(()=>{class a{constructor(d){this.appInits=d,this.resolve=Dy,this.reject=Dy,this.initialized=!1,this.done=!1,this.donePromise=new Promise((m,A)=>{this.resolve=m,this.reject=A})}runInitializers(){if(this.initialized)return;const d=[],m=()=>{this.done=!0,this.resolve()};if(this.appInits)for(let A=0;A<this.appInits.length;A++){const L=this.appInits[A]();if($1(L))d.push(L);else if(cE(L)){const te=new Promise((le,Ne)=>{L.subscribe({complete:le,error:Ne})});d.push(te)}}Promise.all(d).then(()=>{m()}).catch(A=>{this.reject(A)}),0===d.length&&m(),this.initialized=!0}}return a.\u0275fac=function(d){return new(d||a)(Rn(TT,8))},a.\u0275prov=Dt({token:a,factory:a.\u0275fac}),a})();const D2=new Xl("AppId"),ST={provide:D2,useFactory:function(){return`${cg()}${cg()}${cg()}`},deps:[]};function cg(){return String.fromCharCode(97+Math.floor(25*Math.random()))}const p0=new Xl("Platform Initializer"),CT=new Xl("Platform ID"),MT=new Xl("appBootstrapListener");let Jy=(()=>{class a{log(d){console.log(d)}warn(d){console.warn(d)}}return a.\u0275fac=function(d){return new(d||a)},a.\u0275prov=Dt({token:a,factory:a.\u0275fac}),a})();const Qy=new Xl("LocaleId"),OT=new Xl("DefaultCurrencyCode");class dg{constructor(l,d){this.ngModuleFactory=l,this.componentFactories=d}}const fm=function(a){return new r0(a)},ED=fm,P2=function(a){return Promise.resolve(fm(a))},wT=function(a){const l=fm(a),m=yf(zo(a).declarations).reduce((A,L)=>{const te=Mo(L);return te&&A.push(new QM(te)),A},[]);return new dg(l,m)},I2=wT,L2=function(a){return Promise.resolve(wT(a))};let da=(()=>{class a{constructor(){this.compileModuleSync=ED,this.compileModuleAsync=P2,this.compileModuleAndAllComponentsSync=I2,this.compileModuleAndAllComponentsAsync=L2}clearCache(){}clearCacheFor(d){}getModuleId(d){}}return a.\u0275fac=function(d){return new(d||a)},a.\u0275prov=Dt({token:a,factory:a.\u0275fac}),a})();const pm=(()=>Promise.resolve(0))();function Ky(a){"undefined"==typeof Zone?pm.then(()=>{a&&a.apply(null,null)}):Zone.current.scheduleMicroTask("scheduleMicrotask",a)}class Np{constructor({enableLongStackTrace:l=!1,shouldCoalesceEventChangeDetection:d=!1,shouldCoalesceRunChangeDetection:m=!1}){if(this.hasPendingMacrotasks=!1,this.hasPendingMicrotasks=!1,this.isStable=!0,this.onUnstable=new ug(!1),this.onMicrotaskEmpty=new ug(!1),this.onStable=new ug(!1),this.onError=new ug(!1),"undefined"==typeof Zone)throw new Error("In this configuration Angular requires Zone.js");Zone.assertZonePatched();const A=this;A._nesting=0,A._outer=A._inner=Zone.current,Zone.TaskTrackingZoneSpec&&(A._inner=A._inner.fork(new Zone.TaskTrackingZoneSpec)),l&&Zone.longStackTraceZoneSpec&&(A._inner=A._inner.fork(Zone.longStackTraceZoneSpec)),A.shouldCoalesceEventChangeDetection=!m&&d,A.shouldCoalesceRunChangeDetection=m,A.lastRequestAnimationFrameId=-1,A.nativeRequestAnimationFrame=function(){let a=Nr.requestAnimationFrame,l=Nr.cancelAnimationFrame;if("undefined"!=typeof Zone&&a&&l){const d=a[Zone.__symbol__("OriginalDelegate")];d&&(a=d);const m=l[Zone.__symbol__("OriginalDelegate")];m&&(l=m)}return{nativeRequestAnimationFrame:a,nativeCancelAnimationFrame:l}}().nativeRequestAnimationFrame,function(a){const l=()=>{!function(a){a.isCheckStableRunning||-1!==a.lastRequestAnimationFrameId||(a.lastRequestAnimationFrameId=a.nativeRequestAnimationFrame.call(Nr,()=>{a.fakeTopEventTask||(a.fakeTopEventTask=Zone.root.scheduleEventTask("fakeTopEventTask",()=>{a.lastRequestAnimationFrameId=-1,DT(a),a.isCheckStableRunning=!0,Wv(a),a.isCheckStableRunning=!1},void 0,()=>{},()=>{})),a.fakeTopEventTask.invoke()}),DT(a))}(a)};a._inner=a._inner.fork({name:"angular",properties:{isAngularZone:!0},onInvokeTask:(d,m,A,L,te,le)=>{try{return k2(a),d.invokeTask(A,L,te,le)}finally{(a.shouldCoalesceEventChangeDetection&&"eventTask"===L.type||a.shouldCoalesceRunChangeDetection)&&l(),$2(a)}},onInvoke:(d,m,A,L,te,le,Ne)=>{try{return k2(a),d.invoke(A,L,te,le,Ne)}finally{a.shouldCoalesceRunChangeDetection&&l(),$2(a)}},onHasTask:(d,m,A,L)=>{d.hasTask(A,L),m===A&&("microTask"==L.change?(a._hasPendingMicrotasks=L.microTask,DT(a),Wv(a)):"macroTask"==L.change&&(a.hasPendingMacrotasks=L.macroTask))},onHandleError:(d,m,A,L)=>(d.handleError(A,L),a.runOutsideAngular(()=>a.onError.emit(L)),!1)})}(A)}static isInAngularZone(){return!0===Zone.current.get("isAngularZone")}static assertInAngularZone(){if(!Np.isInAngularZone())throw new Error("Expected to be in Angular Zone, but it is not!")}static assertNotInAngularZone(){if(Np.isInAngularZone())throw new Error("Expected to not be in Angular Zone, but it is!")}run(l,d,m){return this._inner.run(l,d,m)}runTask(l,d,m,A){const L=this._inner,te=L.scheduleEventTask("NgZoneEvent: "+A,l,of,Dy,Dy);try{return L.runTask(te,d,m)}finally{L.cancelTask(te)}}runGuarded(l,d,m){return this._inner.runGuarded(l,d,m)}runOutsideAngular(l){return this._outer.run(l)}}const of={};function Wv(a){if(0==a._nesting&&!a.hasPendingMicrotasks&&!a.isStable)try{a._nesting++,a.onMicrotaskEmpty.emit(null)}finally{if(a._nesting--,!a.hasPendingMicrotasks)try{a.runOutsideAngular(()=>a.onStable.emit(null))}finally{a.isStable=!0}}}function DT(a){a.hasPendingMicrotasks=!!(a._hasPendingMicrotasks||(a.shouldCoalesceEventChangeDetection||a.shouldCoalesceRunChangeDetection)&&-1!==a.lastRequestAnimationFrameId)}function k2(a){a._nesting++,a.isStable&&(a.isStable=!1,a.onUnstable.emit(null))}function $2(a){a._nesting--,Wv(a)}class SD{constructor(){this.hasPendingMicrotasks=!1,this.hasPendingMacrotasks=!1,this.isStable=!0,this.onUnstable=new ug,this.onMicrotaskEmpty=new ug,this.onStable=new ug,this.onError=new ug}run(l,d,m){return l.apply(d,m)}runGuarded(l,d,m){return l.apply(d,m)}runOutsideAngular(l){return l()}runTask(l,d,m,A){return l.apply(d,m)}}let RT=(()=>{class a{constructor(d){this._ngZone=d,this._pendingCount=0,this._isZoneStable=!0,this._didWork=!1,this._callbacks=[],this.taskTrackingZone=null,this._watchAngularEvents(),d.run(()=>{this.taskTrackingZone="undefined"==typeof Zone?null:Zone.current.get("TaskTrackingZone")})}_watchAngularEvents(){this._ngZone.onUnstable.subscribe({next:()=>{this._didWork=!0,this._isZoneStable=!1}}),this._ngZone.runOutsideAngular(()=>{this._ngZone.onStable.subscribe({next:()=>{Np.assertNotInAngularZone(),Ky(()=>{this._isZoneStable=!0,this._runCallbacksIfReady()})}})})}increasePendingRequestCount(){return this._pendingCount+=1,this._didWork=!0,this._pendingCount}decreasePendingRequestCount(){if(this._pendingCount-=1,this._pendingCount<0)throw new Error("pending async requests below zero");return this._runCallbacksIfReady(),this._pendingCount}isStable(){return this._isZoneStable&&0===this._pendingCount&&!this._ngZone.hasPendingMacrotasks}_runCallbacksIfReady(){if(this.isStable())Ky(()=>{for(;0!==this._callbacks.length;){let d=this._callbacks.pop();clearTimeout(d.timeoutId),d.doneCb(this._didWork)}this._didWork=!1});else{let d=this.getPendingTasks();this._callbacks=this._callbacks.filter(m=>!m.updateCb||!m.updateCb(d)||(clearTimeout(m.timeoutId),!1)),this._didWork=!0}}getPendingTasks(){return this.taskTrackingZone?this.taskTrackingZone.macroTasks.map(d=>({source:d.source,creationLocation:d.creationLocation,data:d.data})):[]}addCallback(d,m,A){let L=-1;m&&m>0&&(L=setTimeout(()=>{this._callbacks=this._callbacks.filter(te=>te.timeoutId!==L),d(this._didWork,this.getPendingTasks())},m)),this._callbacks.push({doneCb:d,timeoutId:L,updateCb:A})}whenStable(d,m,A){if(A&&!this.taskTrackingZone)throw new Error('Task tracking zone is required when passing an update callback to whenStable(). Is "zone.js/plugins/task-tracking" loaded?');this.addCallback(d,m,A),this._runCallbacksIfReady()}getPendingRequestCount(){return this._pendingCount}findProviders(d,m,A){return[]}}return a.\u0275fac=function(d){return new(d||a)(Rn(Np))},a.\u0275prov=Dt({token:a,factory:a.\u0275fac}),a})(),H2=(()=>{class a{constructor(){this._applications=new Map,NT.addToWindow(this)}registerApplication(d,m){this._applications.set(d,m)}unregisterApplication(d){this._applications.delete(d)}unregisterAllApplications(){this._applications.clear()}getTestability(d){return this._applications.get(d)||null}getAllTestabilities(){return Array.from(this._applications.values())}getAllRootElements(){return Array.from(this._applications.keys())}findTestabilityInTree(d,m=!0){return NT.findTestabilityInTree(this,d,m)}}return a.\u0275fac=function(d){return new(d||a)},a.\u0275prov=Dt({token:a,factory:a.\u0275fac}),a})();class CD{addToWindow(l){}findTestabilityInTree(l,d,m){return null}}function MD(a){NT=a}let NT=new CD,Km=!0,U2=!1;function qy(){return U2=!0,Km}function AD(){if(U2)throw new Error("Cannot enable prod mode after platform setup.");Km=!1}let O_;const Z2=new Xl("AllowMultipleToken");class RD{constructor(l,d){this.name=l,this.token=d}}function tb(a,l,d=[]){const m=`Platform: ${l}`,A=new Xl(m);return(L=[])=>{let te=j2();if(!te||te.injector.get(Z2,!1))if(a)a(d.concat(L).concat({provide:A,useValue:!0}));else{const le=d.concat(L).concat({provide:A,useValue:!0},{provide:Hm,useValue:"platform"});!function(a){if(O_&&!O_.destroyed&&!O_.injector.get(Z2,!1))throw new Error("There can be only one platform. Destroy the previous one to create a new one.");O_=a.get(G2);const l=a.get(p0,null);l&&l.forEach(d=>d())}(Gu.create({providers:le,name:m}))}return function(a){const l=j2();if(!l)throw new Error("No platform exists!");if(!l.injector.get(a,null))throw new Error("A platform with a different configuration has been created. Please destroy it first.");return l}(A)}}function j2(){return O_&&!O_.destroyed?O_:null}let G2=(()=>{class a{constructor(d){this._injector=d,this._modules=[],this._destroyListeners=[],this._destroyed=!1}bootstrapModuleFactory(d,m){const le=function(a,l){let d;return d="noop"===a?new SD:("zone.js"===a?void 0:a)||new Np({enableLongStackTrace:qy(),shouldCoalesceEventChangeDetection:!!(null==l?void 0:l.ngZoneEventCoalescing),shouldCoalesceRunChangeDetection:!!(null==l?void 0:l.ngZoneRunCoalescing)}),d}(m?m.ngZone:void 0,{ngZoneEventCoalescing:m&&m.ngZoneEventCoalescing||!1,ngZoneRunCoalescing:m&&m.ngZoneRunCoalescing||!1}),Ne=[{provide:Np,useValue:le}];return le.run(()=>{const qe=Gu.create({providers:Ne,parent:this.injector,name:d.moduleType.name}),Mt=d.create(qe),an=Mt.injector.get(Zf,null);if(!an)throw new Error("No ErrorHandler. Is platform module (BrowserModule) included?");return le.runOutsideAngular(()=>{const _n=le.onError.subscribe({next:or=>{an.handleError(or)}});Mt.onDestroy(()=>{IT(this._modules,Mt),_n.unsubscribe()})}),function(a,l,d){try{const m=d();return $1(m)?m.catch(A=>{throw l.runOutsideAngular(()=>a.handleError(A)),A}):m}catch(m){throw l.runOutsideAngular(()=>a.handleError(m)),m}}(an,le,()=>{const _n=Mt.injector.get(Gv);return _n.runInitializers(),_n.donePromise.then(()=>(AE(Mt.injector.get(Qy,Cy)||Cy),this._moduleDoBootstrap(Mt),Mt))})})}bootstrapModule(d,m=[]){const A=g0({},m);return function(a,l,d){const m=new r0(d);return Promise.resolve(m)}(0,0,d).then(L=>this.bootstrapModuleFactory(L,A))}_moduleDoBootstrap(d){const m=d.injector.get(m0);if(d._bootstrapComponents.length>0)d._bootstrapComponents.forEach(A=>m.bootstrap(A));else{if(!d.instance.ngDoBootstrap)throw new Error(`The module ${T(d.instance.constructor)} was bootstrapped, but it does not declare "@NgModule.bootstrap" components nor a "ngDoBootstrap" method. Please define one of these.`);d.instance.ngDoBootstrap(m)}this._modules.push(d)}onDestroy(d){this._destroyListeners.push(d)}get injector(){return this._injector}destroy(){if(this._destroyed)throw new Error("The platform has already been destroyed!");this._modules.slice().forEach(d=>d.destroy()),this._destroyListeners.forEach(d=>d()),this._destroyed=!0}get destroyed(){return this._destroyed}}return a.\u0275fac=function(d){return new(d||a)(Rn(Gu))},a.\u0275prov=Dt({token:a,factory:a.\u0275fac}),a})();function g0(a,l){return Array.isArray(l)?l.reduce(g0,a):Object.assign(Object.assign({},a),l)}let m0=(()=>{class a{constructor(d,m,A,L,te){this._zone=d,this._injector=m,this._exceptionHandler=A,this._componentFactoryResolver=L,this._initStatus=te,this._bootstrapListeners=[],this._views=[],this._runningTick=!1,this._stable=!0,this.componentTypes=[],this.components=[],this._onMicrotaskEmptySubscription=this._zone.onMicrotaskEmpty.subscribe({next:()=>{this._zone.run(()=>{this.tick()})}});const le=new p.y(qe=>{this._stable=this._zone.isStable&&!this._zone.hasPendingMacrotasks&&!this._zone.hasPendingMicrotasks,this._zone.runOutsideAngular(()=>{qe.next(this._stable),qe.complete()})}),Ne=new p.y(qe=>{let Mt;this._zone.runOutsideAngular(()=>{Mt=this._zone.onStable.subscribe(()=>{Np.assertNotInAngularZone(),Ky(()=>{!this._stable&&!this._zone.hasPendingMacrotasks&&!this._zone.hasPendingMicrotasks&&(this._stable=!0,qe.next(!0))})})});const an=this._zone.onUnstable.subscribe(()=>{Np.assertInAngularZone(),this._stable&&(this._stable=!1,this._zone.runOutsideAngular(()=>{qe.next(!1)}))});return()=>{Mt.unsubscribe(),an.unsubscribe()}});this.isStable=(0,f.T)(le,Ne.pipe((0,e.B)()))}bootstrap(d,m){if(!this._initStatus.done)throw new Error("Cannot bootstrap as there are still asynchronous initializers running. Bootstrap components in the `ngDoBootstrap` method of the root module.");let A;A=d instanceof iM?d:this._componentFactoryResolver.resolveComponentFactory(d),this.componentTypes.push(A.componentType);const L=function(a){return a.isBoundToModule}(A)?void 0:this._injector.get(Wm),le=A.create(Gu.NULL,[],m||A.selector,L),Ne=le.location.nativeElement,qe=le.injector.get(RT,null),Mt=qe&&le.injector.get(H2);return qe&&Mt&&Mt.registerApplication(Ne,qe),le.onDestroy(()=>{this.detachView(le.hostView),IT(this.components,le),Mt&&Mt.unregisterApplication(Ne)}),this._loadComponent(le),le}tick(){if(this._runningTick)throw new Error("ApplicationRef.tick is called recursively");try{this._runningTick=!0;for(let d of this._views)d.detectChanges()}catch(d){this._zone.runOutsideAngular(()=>this._exceptionHandler.handleError(d))}finally{this._runningTick=!1}}attachView(d){const m=d;this._views.push(m),m.attachToAppRef(this)}detachView(d){const m=d;IT(this._views,m),m.detachFromAppRef()}_loadComponent(d){this.attachView(d.hostView),this.tick(),this.components.push(d),this._injector.get(MT,[]).concat(this._bootstrapListeners).forEach(A=>A(d))}ngOnDestroy(){this._views.slice().forEach(d=>d.destroy()),this._onMicrotaskEmptySubscription.unsubscribe()}get viewCount(){return this._views.length}}return a.\u0275fac=function(d){return new(d||a)(Rn(Np),Rn(Gu),Rn(Zf),Rn(kv),Rn(Gv))},a.\u0275prov=Dt({token:a,factory:a.\u0275fac}),a})();function IT(a,l){const d=a.indexOf(l);d>-1&&a.splice(d,1)}class W2{}class $D{}const HD={factoryPathPrefix:"",factoryPathSuffix:".ngfactory"};let UD=(()=>{class a{constructor(d,m){this._compiler=d,this._config=m||HD}load(d){return this.loadAndCompile(d)}loadAndCompile(d){let[m,A]=d.split("#");return void 0===A&&(A="default"),i(98255)(m).then(L=>L[A]).then(L=>Q2(L,m,A)).then(L=>this._compiler.compileModuleAsync(L))}loadFactory(d){let[m,A]=d.split("#"),L="NgFactory";return void 0===A&&(A="default",L=""),i(98255)(this._config.factoryPathPrefix+m+this._config.factoryPathSuffix).then(te=>te[A+L]).then(te=>Q2(te,m,A))}}return a.\u0275fac=function(d){return new(d||a)(Rn(da),Rn($D,8))},a.\u0275prov=Dt({token:a,factory:a.\u0275fac}),a})();function Q2(a,l,d){if(!a)throw new Error(`Cannot find '${d}' in '${l}'`);return a}const GD=function(a){return null},WD=tb(null,"core",[{provide:CT,useValue:"unknown"},{provide:G2,deps:[Gu]},{provide:H2,deps:[]},{provide:Jy,deps:[]}]),KD=[{provide:m0,useClass:m0,deps:[Np,Gu,Zf,kv,Gv]},{provide:Nx,deps:[Np],useFactory:function(a){let l=[];return a.onStable.subscribe(()=>{for(;l.length;)l.pop()()}),function(d){l.push(d)}}},{provide:Gv,useClass:Gv,deps:[[new sa,TT]]},{provide:da,useClass:da,deps:[]},ST,{provide:Ny,useFactory:function(){return Zw},deps:[]},{provide:Py,useFactory:function(){return jw},deps:[]},{provide:Qy,useFactory:function(a){return AE(a=a||"undefined"!=typeof $localize&&$localize.locale||Cy),a},deps:[[new ga(Qy),new sa,new ol]]},{provide:OT,useValue:"USD"}];let e3=(()=>{class a{constructor(d){}}return a.\u0275fac=function(d){return new(d||a)(Rn(m0))},a.\u0275mod=wn({type:a}),a.\u0275inj=Yn({providers:KD}),a})()},24751:(v,S,i)=>{"use strict";i.d(S,{TO:()=>ai,Wl:()=>R,gN:()=>wr,Fj:()=>Q,Oe:()=>yr,CE:()=>gs,qu:()=>Nt,NI:()=>Zn,u:()=>Qs,cw:()=>cr,sg:()=>fo,x0:()=>Ao,u5:()=>Cu,Fd:()=>fi,qQ:()=>os,Cf:()=>ae,JU:()=>T,a5:()=>Qr,JJ:()=>Zr,JL:()=>Ur,F:()=>Ti,On:()=>Cn,YN:()=>Co,wV:()=>Wo,_:()=>qo,UX:()=>jl,Q7:()=>To,EJ:()=>ms,kI:()=>ve,_Y:()=>br,Kr:()=>$e});var r=i(74788),u=i(12057),p=i(94402),f=i(35758),e=i(88002);let _=(()=>{class Te{constructor(De,Tt){this._renderer=De,this._elementRef=Tt,this.onChange=dr=>{},this.onTouched=()=>{}}setProperty(De,Tt){this._renderer.setProperty(this._elementRef.nativeElement,De,Tt)}registerOnTouched(De){this.onTouched=De}registerOnChange(De){this.onChange=De}setDisabledState(De){this.setProperty("disabled",De)}}return Te.\u0275fac=function(De){return new(De||Te)(r.Y36(r.Qsj),r.Y36(r.SBq))},Te.\u0275dir=r.lG2({type:Te}),Te})(),y=(()=>{class Te extends _{}return Te.\u0275fac=function(){let Me;return function(Tt){return(Me||(Me=r.n5z(Te)))(Tt||Te)}}(),Te.\u0275dir=r.lG2({type:Te,features:[r.qOj]}),Te})();const T=new r.OlP("NgValueAccessor"),M={provide:T,useExisting:(0,r.Gpc)(()=>R),multi:!0};let R=(()=>{class Te extends y{writeValue(De){this.setProperty("checked",De)}}return Te.\u0275fac=function(){let Me;return function(Tt){return(Me||(Me=r.n5z(Te)))(Tt||Te)}}(),Te.\u0275dir=r.lG2({type:Te,selectors:[["input","type","checkbox","formControlName",""],["input","type","checkbox","formControl",""],["input","type","checkbox","ngModel",""]],hostBindings:function(De,Tt){1&De&&r.NdJ("change",function(Qi){return Tt.onChange(Qi.target.checked)})("blur",function(){return Tt.onTouched()})},features:[r._Bn([M]),r.qOj]}),Te})();const F={provide:T,useExisting:(0,r.Gpc)(()=>Q),multi:!0},J=new r.OlP("CompositionEventMode");let Q=(()=>{class Te extends _{constructor(De,Tt,dr){super(De,Tt),this._compositionMode=dr,this._composing=!1,null==this._compositionMode&&(this._compositionMode=!function(){const Te=(0,u.q)()?(0,u.q)().getUserAgent():"";return/android (\d+)/.test(Te.toLowerCase())}())}writeValue(De){this.setProperty("value",null==De?"":De)}_handleInput(De){(!this._compositionMode||this._compositionMode&&!this._composing)&&this.onChange(De)}_compositionStart(){this._composing=!0}_compositionEnd(De){this._composing=!1,this._compositionMode&&this.onChange(De)}}return Te.\u0275fac=function(De){return new(De||Te)(r.Y36(r.Qsj),r.Y36(r.SBq),r.Y36(J,8))},Te.\u0275dir=r.lG2({type:Te,selectors:[["input","formControlName","",3,"type","checkbox"],["textarea","formControlName",""],["input","formControl","",3,"type","checkbox"],["textarea","formControl",""],["input","ngModel","",3,"type","checkbox"],["textarea","ngModel",""],["","ngDefaultControl",""]],hostBindings:function(De,Tt){1&De&&r.NdJ("input",function(Qi){return Tt._handleInput(Qi.target.value)})("blur",function(){return Tt.onTouched()})("compositionstart",function(){return Tt._compositionStart()})("compositionend",function(Qi){return Tt._compositionEnd(Qi.target.value)})},features:[r._Bn([F]),r.qOj]}),Te})();function ee(Te){return null==Te||0===Te.length}function ue(Te){return null!=Te&&"number"==typeof Te.length}const ae=new r.OlP("NgValidators"),$=new r.OlP("NgAsyncValidators"),se=/^(?=.{1,254}$)(?=.{1,64}@)[a-zA-Z0-9!#$%&'*+/=?^_`{|}~-]+(?:\.[a-zA-Z0-9!#$%&'*+/=?^_`{|}~-]+)*@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*$/;class ve{static min(Me){return oe(Me)}static max(Me){return he(Me)}static required(Me){return me(Me)}static requiredTrue(Me){return!0===Me.value?null:{required:!0}}static email(Me){return ee((Te=Me).value)||se.test(Te.value)?null:{email:!0};var Te}static minLength(Me){return Te=Me,Me=>ee(Me.value)||!ue(Me.value)?null:Me.value.length<Te?{minlength:{requiredLength:Te,actualLength:Me.value.length}}:null;var Te}static maxLength(Me){return Te=Me,Me=>ue(Me.value)&&Me.value.length>Te?{maxlength:{requiredLength:Te,actualLength:Me.value.length}}:null;var Te}static pattern(Me){return function(Te){if(!Te)return je;let Me,De;return"string"==typeof Te?(De="","^"!==Te.charAt(0)&&(De+="^"),De+=Te,"$"!==Te.charAt(Te.length-1)&&(De+="$"),Me=new RegExp(De)):(De=Te.toString(),Me=Te),Tt=>{if(ee(Tt.value))return null;const dr=Tt.value;return Me.test(dr)?null:{pattern:{requiredPattern:De,actualValue:dr}}}}(Me)}static nullValidator(Me){return null}static compose(Me){return $t(Me)}static composeAsync(Me){return Ut(Me)}}function oe(Te){return Me=>{if(ee(Me.value)||ee(Te))return null;const De=parseFloat(Me.value);return!isNaN(De)&&De<Te?{min:{min:Te,actual:Me.value}}:null}}function he(Te){return Me=>{if(ee(Me.value)||ee(Te))return null;const De=parseFloat(Me.value);return!isNaN(De)&&De>Te?{max:{max:Te,actual:Me.value}}:null}}function me(Te){return ee(Te.value)?{required:!0}:null}function je(Te){return null}function Ie(Te){return null!=Te}function Ve(Te){const Me=(0,r.QGY)(Te)?(0,p.D)(Te):Te;return(0,r.CqO)(Me),Me}function He(Te){let Me={};return Te.forEach(De=>{Me=null!=De?Object.assign(Object.assign({},Me),De):Me}),0===Object.keys(Me).length?null:Me}function Zt(Te,Me){return Me.map(De=>De(Te))}function en(Te){return Te.map(Me=>function(Te){return!Te.validate}(Me)?Me:De=>Me.validate(De))}function $t(Te){if(!Te)return null;const Me=Te.filter(Ie);return 0==Me.length?null:function(De){return He(Zt(De,Me))}}function Gt(Te){return null!=Te?$t(en(Te)):null}function Ut(Te){if(!Te)return null;const Me=Te.filter(Ie);return 0==Me.length?null:function(De){const Tt=Zt(De,Me).map(Ve);return(0,f.D)(Tt).pipe((0,e.U)(He))}}function Bt(Te){return null!=Te?Ut(en(Te)):null}function mt(Te,Me){return null===Te?[Me]:Array.isArray(Te)?[...Te,Me]:[Te,Me]}function Yt(Te){return Te._rawValidators}function Dt(Te){return Te._rawAsyncValidators}function zt(Te){return Te?Array.isArray(Te)?Te:[Te]:[]}function Yn(Te,Me){return Array.isArray(Te)?Te.includes(Me):Te===Me}function Hr(Te,Me){const De=zt(Me);return zt(Te).forEach(dr=>{Yn(De,dr)||De.push(dr)}),De}function ci(Te,Me){return zt(Me).filter(De=>!Yn(Te,De))}let Ir=(()=>{class Te{constructor(){this._rawValidators=[],this._rawAsyncValidators=[],this._onDestroyCallbacks=[]}get value(){return this.control?this.control.value:null}get valid(){return this.control?this.control.valid:null}get invalid(){return this.control?this.control.invalid:null}get pending(){return this.control?this.control.pending:null}get disabled(){return this.control?this.control.disabled:null}get enabled(){return this.control?this.control.enabled:null}get errors(){return this.control?this.control.errors:null}get pristine(){return this.control?this.control.pristine:null}get dirty(){return this.control?this.control.dirty:null}get touched(){return this.control?this.control.touched:null}get status(){return this.control?this.control.status:null}get untouched(){return this.control?this.control.untouched:null}get statusChanges(){return this.control?this.control.statusChanges:null}get valueChanges(){return this.control?this.control.valueChanges:null}get path(){return null}_setValidators(De){this._rawValidators=De||[],this._composedValidatorFn=Gt(this._rawValidators)}_setAsyncValidators(De){this._rawAsyncValidators=De||[],this._composedAsyncValidatorFn=Bt(this._rawAsyncValidators)}get validator(){return this._composedValidatorFn||null}get asyncValidator(){return this._composedAsyncValidatorFn||null}_registerOnDestroy(De){this._onDestroyCallbacks.push(De)}_invokeOnDestroyCallbacks(){this._onDestroyCallbacks.forEach(De=>De()),this._onDestroyCallbacks=[]}reset(De){this.control&&this.control.reset(De)}hasError(De,Tt){return!!this.control&&this.control.hasError(De,Tt)}getError(De,Tt){return this.control?this.control.getError(De,Tt):null}}return Te.\u0275fac=function(De){return new(De||Te)},Te.\u0275dir=r.lG2({type:Te}),Te})(),wr=(()=>{class Te extends Ir{get formDirective(){return null}get path(){return null}}return Te.\u0275fac=function(){let Me;return function(Tt){return(Me||(Me=r.n5z(Te)))(Tt||Te)}}(),Te.\u0275dir=r.lG2({type:Te,features:[r.qOj]}),Te})();class Qr extends Ir{constructor(){super(...arguments),this._parent=null,this.name=null,this.valueAccessor=null}}class Kr{constructor(Me){this._cd=Me}is(Me){var De,Tt,dr;return"submitted"===Me?!!(null===(De=this._cd)||void 0===De?void 0:De.submitted):!!(null===(dr=null===(Tt=this._cd)||void 0===Tt?void 0:Tt.control)||void 0===dr?void 0:dr[Me])}}let Zr=(()=>{class Te extends Kr{constructor(De){super(De)}}return Te.\u0275fac=function(De){return new(De||Te)(r.Y36(Qr,2))},Te.\u0275dir=r.lG2({type:Te,selectors:[["","formControlName",""],["","ngModel",""],["","formControl",""]],hostVars:14,hostBindings:function(De,Tt){2&De&&r.ekj("ng-untouched",Tt.is("untouched"))("ng-touched",Tt.is("touched"))("ng-pristine",Tt.is("pristine"))("ng-dirty",Tt.is("dirty"))("ng-valid",Tt.is("valid"))("ng-invalid",Tt.is("invalid"))("ng-pending",Tt.is("pending"))},features:[r.qOj]}),Te})(),Ur=(()=>{class Te extends Kr{constructor(De){super(De)}}return Te.\u0275fac=function(De){return new(De||Te)(r.Y36(wr,10))},Te.\u0275dir=r.lG2({type:Te,selectors:[["","formGroupName",""],["","formArrayName",""],["","ngModelGroup",""],["","formGroup",""],["form",3,"ngNoForm",""],["","ngForm",""]],hostVars:16,hostBindings:function(De,Tt){2&De&&r.ekj("ng-untouched",Tt.is("untouched"))("ng-touched",Tt.is("touched"))("ng-pristine",Tt.is("pristine"))("ng-dirty",Tt.is("dirty"))("ng-valid",Tt.is("valid"))("ng-invalid",Tt.is("invalid"))("ng-pending",Tt.is("pending"))("ng-submitted",Tt.is("submitted"))},features:[r.qOj]}),Te})();function Ai(Te,Me){return[...Me.path,Te]}function Tr(Te,Me){mr(Te,Me),Me.valueAccessor.writeValue(Te.value),function(Te,Me){Me.valueAccessor.registerOnChange(De=>{Te._pendingValue=De,Te._pendingChange=!0,Te._pendingDirty=!0,"change"===Te.updateOn&&si(Te,Me)})}(Te,Me),function(Te,Me){const De=(Tt,dr)=>{Me.valueAccessor.writeValue(Tt),dr&&Me.viewToModelUpdate(Tt)};Te.registerOnChange(De),Me._registerOnDestroy(()=>{Te._unregisterOnChange(De)})}(Te,Me),function(Te,Me){Me.valueAccessor.registerOnTouched(()=>{Te._pendingTouched=!0,"blur"===Te.updateOn&&Te._pendingChange&&si(Te,Me),"submit"!==Te.updateOn&&Te.markAsTouched()})}(Te,Me),function(Te,Me){if(Me.valueAccessor.setDisabledState){const De=Tt=>{Me.valueAccessor.setDisabledState(Tt)};Te.registerOnDisabledChange(De),Me._registerOnDestroy(()=>{Te._unregisterOnDisabledChange(De)})}}(Te,Me)}function Nr(Te,Me,De=!0){const Tt=()=>{};Me.valueAccessor&&(Me.valueAccessor.registerOnChange(Tt),Me.valueAccessor.registerOnTouched(Tt)),Xt(Te,Me),Te&&(Me._invokeOnDestroyCallbacks(),Te._registerOnCollectionChange(()=>{}))}function gn(Te,Me){Te.forEach(De=>{De.registerOnValidatorChange&&De.registerOnValidatorChange(Me)})}function mr(Te,Me){const De=Yt(Te);null!==Me.validator?Te.setValidators(mt(De,Me.validator)):"function"==typeof De&&Te.setValidators([De]);const Tt=Dt(Te);null!==Me.asyncValidator?Te.setAsyncValidators(mt(Tt,Me.asyncValidator)):"function"==typeof Tt&&Te.setAsyncValidators([Tt]);const dr=()=>Te.updateValueAndValidity();gn(Me._rawValidators,dr),gn(Me._rawAsyncValidators,dr)}function Xt(Te,Me){let De=!1;if(null!==Te){if(null!==Me.validator){const dr=Yt(Te);if(Array.isArray(dr)&&dr.length>0){const Qi=dr.filter(Jo=>Jo!==Me.validator);Qi.length!==dr.length&&(De=!0,Te.setValidators(Qi))}}if(null!==Me.asyncValidator){const dr=Dt(Te);if(Array.isArray(dr)&&dr.length>0){const Qi=dr.filter(Jo=>Jo!==Me.asyncValidator);Qi.length!==dr.length&&(De=!0,Te.setAsyncValidators(Qi))}}}const Tt=()=>{};return gn(Me._rawValidators,Tt),gn(Me._rawAsyncValidators,Tt),De}function si(Te,Me){Te._pendingDirty&&Te.markAsDirty(),Te.setValue(Te._pendingValue,{emitModelToViewChange:!1}),Me.viewToModelUpdate(Te._pendingValue),Te._pendingChange=!1}function no(Te,Me){mr(Te,Me)}function jt(Te,Me){if(!Te.hasOwnProperty("model"))return!1;const De=Te.model;return!!De.isFirstChange()||!Object.is(Me,De.currentValue)}function mn(Te,Me){Te._syncPendingControls(),Me.forEach(De=>{const Tt=De.control;"submit"===Tt.updateOn&&Tt._pendingChange&&(De.viewToModelUpdate(Tt._pendingValue),Tt._pendingChange=!1)})}function Wn(Te,Me){if(!Me)return null;let De,Tt,dr;return Array.isArray(Me),Me.forEach(Qi=>{Qi.constructor===Q?De=Qi:function(Te){return Object.getPrototypeOf(Te.constructor)===y}(Qi)?Tt=Qi:dr=Qi}),dr||Tt||De||null}function kn(Te,Me){const De=Te.indexOf(Me);De>-1&&Te.splice(De,1)}const nr="VALID",Gi="INVALID",po="PENDING",yo="DISABLED";function Vi(Te){return(Si(Te)?Te.validators:Te)||null}function cs(Te){return Array.isArray(Te)?Gt(Te):Te||null}function zo(Te,Me){return(Si(Me)?Me.asyncValidators:Te)||null}function So(Te){return Array.isArray(Te)?Bt(Te):Te||null}function Si(Te){return null!=Te&&!Array.isArray(Te)&&"object"==typeof Te}class ai{constructor(Me,De){this._hasOwnPendingAsyncValidator=!1,this._onCollectionChange=()=>{},this._parent=null,this.pristine=!0,this.touched=!1,this._onDisabledChange=[],this._rawValidators=Me,this._rawAsyncValidators=De,this._composedValidatorFn=cs(this._rawValidators),this._composedAsyncValidatorFn=So(this._rawAsyncValidators)}get validator(){return this._composedValidatorFn}set validator(Me){this._rawValidators=this._composedValidatorFn=Me}get asyncValidator(){return this._composedAsyncValidatorFn}set asyncValidator(Me){this._rawAsyncValidators=this._composedAsyncValidatorFn=Me}get parent(){return this._parent}get valid(){return this.status===nr}get invalid(){return this.status===Gi}get pending(){return this.status==po}get disabled(){return this.status===yo}get enabled(){return this.status!==yo}get dirty(){return!this.pristine}get untouched(){return!this.touched}get updateOn(){return this._updateOn?this._updateOn:this.parent?this.parent.updateOn:"change"}setValidators(Me){this._rawValidators=Me,this._composedValidatorFn=cs(Me)}setAsyncValidators(Me){this._rawAsyncValidators=Me,this._composedAsyncValidatorFn=So(Me)}addValidators(Me){this.setValidators(Hr(Me,this._rawValidators))}addAsyncValidators(Me){this.setAsyncValidators(Hr(Me,this._rawAsyncValidators))}removeValidators(Me){this.setValidators(ci(Me,this._rawValidators))}removeAsyncValidators(Me){this.setAsyncValidators(ci(Me,this._rawAsyncValidators))}hasValidator(Me){return Yn(this._rawValidators,Me)}hasAsyncValidator(Me){return Yn(this._rawAsyncValidators,Me)}clearValidators(){this.validator=null}clearAsyncValidators(){this.asyncValidator=null}markAsTouched(Me={}){this.touched=!0,this._parent&&!Me.onlySelf&&this._parent.markAsTouched(Me)}markAllAsTouched(){this.markAsTouched({onlySelf:!0}),this._forEachChild(Me=>Me.markAllAsTouched())}markAsUntouched(Me={}){this.touched=!1,this._pendingTouched=!1,this._forEachChild(De=>{De.markAsUntouched({onlySelf:!0})}),this._parent&&!Me.onlySelf&&this._parent._updateTouched(Me)}markAsDirty(Me={}){this.pristine=!1,this._parent&&!Me.onlySelf&&this._parent.markAsDirty(Me)}markAsPristine(Me={}){this.pristine=!0,this._pendingDirty=!1,this._forEachChild(De=>{De.markAsPristine({onlySelf:!0})}),this._parent&&!Me.onlySelf&&this._parent._updatePristine(Me)}markAsPending(Me={}){this.status=po,!1!==Me.emitEvent&&this.statusChanges.emit(this.status),this._parent&&!Me.onlySelf&&this._parent.markAsPending(Me)}disable(Me={}){const De=this._parentMarkedDirty(Me.onlySelf);this.status=yo,this.errors=null,this._forEachChild(Tt=>{Tt.disable(Object.assign(Object.assign({},Me),{onlySelf:!0}))}),this._updateValue(),!1!==Me.emitEvent&&(this.valueChanges.emit(this.value),this.statusChanges.emit(this.status)),this._updateAncestors(Object.assign(Object.assign({},Me),{skipPristineCheck:De})),this._onDisabledChange.forEach(Tt=>Tt(!0))}enable(Me={}){const De=this._parentMarkedDirty(Me.onlySelf);this.status=nr,this._forEachChild(Tt=>{Tt.enable(Object.assign(Object.assign({},Me),{onlySelf:!0}))}),this.updateValueAndValidity({onlySelf:!0,emitEvent:Me.emitEvent}),this._updateAncestors(Object.assign(Object.assign({},Me),{skipPristineCheck:De})),this._onDisabledChange.forEach(Tt=>Tt(!1))}_updateAncestors(Me){this._parent&&!Me.onlySelf&&(this._parent.updateValueAndValidity(Me),Me.skipPristineCheck||this._parent._updatePristine(),this._parent._updateTouched())}setParent(Me){this._parent=Me}updateValueAndValidity(Me={}){this._setInitialStatus(),this._updateValue(),this.enabled&&(this._cancelExistingSubscription(),this.errors=this._runValidator(),this.status=this._calculateStatus(),(this.status===nr||this.status===po)&&this._runAsyncValidator(Me.emitEvent)),!1!==Me.emitEvent&&(this.valueChanges.emit(this.value),this.statusChanges.emit(this.status)),this._parent&&!Me.onlySelf&&this._parent.updateValueAndValidity(Me)}_updateTreeValidity(Me={emitEvent:!0}){this._forEachChild(De=>De._updateTreeValidity(Me)),this.updateValueAndValidity({onlySelf:!0,emitEvent:Me.emitEvent})}_setInitialStatus(){this.status=this._allControlsDisabled()?yo:nr}_runValidator(){return this.validator?this.validator(this):null}_runAsyncValidator(Me){if(this.asyncValidator){this.status=po,this._hasOwnPendingAsyncValidator=!0;const De=Ve(this.asyncValidator(this));this._asyncValidationSubscription=De.subscribe(Tt=>{this._hasOwnPendingAsyncValidator=!1,this.setErrors(Tt,{emitEvent:Me})})}}_cancelExistingSubscription(){this._asyncValidationSubscription&&(this._asyncValidationSubscription.unsubscribe(),this._hasOwnPendingAsyncValidator=!1)}setErrors(Me,De={}){this.errors=Me,this._updateControlsErrors(!1!==De.emitEvent)}get(Me){return function(Te,Me,De){if(null==Me||(Array.isArray(Me)||(Me=Me.split(".")),Array.isArray(Me)&&0===Me.length))return null;let Tt=Te;return Me.forEach(dr=>{Tt=Tt instanceof cr?Tt.controls.hasOwnProperty(dr)?Tt.controls[dr]:null:Tt instanceof yr&&Tt.at(dr)||null}),Tt}(this,Me)}getError(Me,De){const Tt=De?this.get(De):this;return Tt&&Tt.errors?Tt.errors[Me]:null}hasError(Me,De){return!!this.getError(Me,De)}get root(){let Me=this;for(;Me._parent;)Me=Me._parent;return Me}_updateControlsErrors(Me){this.status=this._calculateStatus(),Me&&this.statusChanges.emit(this.status),this._parent&&this._parent._updateControlsErrors(Me)}_initObservables(){this.valueChanges=new r.vpe,this.statusChanges=new r.vpe}_calculateStatus(){return this._allControlsDisabled()?yo:this.errors?Gi:this._hasOwnPendingAsyncValidator||this._anyControlsHaveStatus(po)?po:this._anyControlsHaveStatus(Gi)?Gi:nr}_anyControlsHaveStatus(Me){return this._anyControls(De=>De.status===Me)}_anyControlsDirty(){return this._anyControls(Me=>Me.dirty)}_anyControlsTouched(){return this._anyControls(Me=>Me.touched)}_updatePristine(Me={}){this.pristine=!this._anyControlsDirty(),this._parent&&!Me.onlySelf&&this._parent._updatePristine(Me)}_updateTouched(Me={}){this.touched=this._anyControlsTouched(),this._parent&&!Me.onlySelf&&this._parent._updateTouched(Me)}_isBoxedValue(Me){return"object"==typeof Me&&null!==Me&&2===Object.keys(Me).length&&"value"in Me&&"disabled"in Me}_registerOnCollectionChange(Me){this._onCollectionChange=Me}_setUpdateStrategy(Me){Si(Me)&&null!=Me.updateOn&&(this._updateOn=Me.updateOn)}_parentMarkedDirty(Me){return!Me&&!(!this._parent||!this._parent.dirty)&&!this._parent._anyControlsDirty()}}class Zn extends ai{constructor(Me=null,De,Tt){super(Vi(De),zo(Tt,De)),this._onChange=[],this._applyFormState(Me),this._setUpdateStrategy(De),this._initObservables(),this.updateValueAndValidity({onlySelf:!0,emitEvent:!!this.asyncValidator})}setValue(Me,De={}){this.value=this._pendingValue=Me,this._onChange.length&&!1!==De.emitModelToViewChange&&this._onChange.forEach(Tt=>Tt(this.value,!1!==De.emitViewToModelChange)),this.updateValueAndValidity(De)}patchValue(Me,De={}){this.setValue(Me,De)}reset(Me=null,De={}){this._applyFormState(Me),this.markAsPristine(De),this.markAsUntouched(De),this.setValue(this.value,De),this._pendingChange=!1}_updateValue(){}_anyControls(Me){return!1}_allControlsDisabled(){return this.disabled}registerOnChange(Me){this._onChange.push(Me)}_unregisterOnChange(Me){kn(this._onChange,Me)}registerOnDisabledChange(Me){this._onDisabledChange.push(Me)}_unregisterOnDisabledChange(Me){kn(this._onDisabledChange,Me)}_forEachChild(Me){}_syncPendingControls(){return!("submit"!==this.updateOn||(this._pendingDirty&&this.markAsDirty(),this._pendingTouched&&this.markAsTouched(),!this._pendingChange)||(this.setValue(this._pendingValue,{onlySelf:!0,emitModelToViewChange:!1}),0))}_applyFormState(Me){this._isBoxedValue(Me)?(this.value=this._pendingValue=Me.value,Me.disabled?this.disable({onlySelf:!0,emitEvent:!1}):this.enable({onlySelf:!0,emitEvent:!1})):this.value=this._pendingValue=Me}}class cr extends ai{constructor(Me,De,Tt){super(Vi(De),zo(Tt,De)),this.controls=Me,this._initObservables(),this._setUpdateStrategy(De),this._setUpControls(),this.updateValueAndValidity({onlySelf:!0,emitEvent:!!this.asyncValidator})}registerControl(Me,De){return this.controls[Me]?this.controls[Me]:(this.controls[Me]=De,De.setParent(this),De._registerOnCollectionChange(this._onCollectionChange),De)}addControl(Me,De,Tt={}){this.registerControl(Me,De),this.updateValueAndValidity({emitEvent:Tt.emitEvent}),this._onCollectionChange()}removeControl(Me,De={}){this.controls[Me]&&this.controls[Me]._registerOnCollectionChange(()=>{}),delete this.controls[Me],this.updateValueAndValidity({emitEvent:De.emitEvent}),this._onCollectionChange()}setControl(Me,De,Tt={}){this.controls[Me]&&this.controls[Me]._registerOnCollectionChange(()=>{}),delete this.controls[Me],De&&this.registerControl(Me,De),this.updateValueAndValidity({emitEvent:Tt.emitEvent}),this._onCollectionChange()}contains(Me){return this.controls.hasOwnProperty(Me)&&this.controls[Me].enabled}setValue(Me,De={}){this._checkAllValuesPresent(Me),Object.keys(Me).forEach(Tt=>{this._throwIfControlMissing(Tt),this.controls[Tt].setValue(Me[Tt],{onlySelf:!0,emitEvent:De.emitEvent})}),this.updateValueAndValidity(De)}patchValue(Me,De={}){null!=Me&&(Object.keys(Me).forEach(Tt=>{this.controls[Tt]&&this.controls[Tt].patchValue(Me[Tt],{onlySelf:!0,emitEvent:De.emitEvent})}),this.updateValueAndValidity(De))}reset(Me={},De={}){this._forEachChild((Tt,dr)=>{Tt.reset(Me[dr],{onlySelf:!0,emitEvent:De.emitEvent})}),this._updatePristine(De),this._updateTouched(De),this.updateValueAndValidity(De)}getRawValue(){return this._reduceChildren({},(Me,De,Tt)=>(Me[Tt]=De instanceof Zn?De.value:De.getRawValue(),Me))}_syncPendingControls(){let Me=this._reduceChildren(!1,(De,Tt)=>!!Tt._syncPendingControls()||De);return Me&&this.updateValueAndValidity({onlySelf:!0}),Me}_throwIfControlMissing(Me){if(!Object.keys(this.controls).length)throw new Error("\n        There are no form controls registered with this group yet. If you're using ngModel,\n        you may want to check next tick (e.g. use setTimeout).\n      ");if(!this.controls[Me])throw new Error(`Cannot find form control with name: ${Me}.`)}_forEachChild(Me){Object.keys(this.controls).forEach(De=>{const Tt=this.controls[De];Tt&&Me(Tt,De)})}_setUpControls(){this._forEachChild(Me=>{Me.setParent(this),Me._registerOnCollectionChange(this._onCollectionChange)})}_updateValue(){this.value=this._reduceValue()}_anyControls(Me){for(const De of Object.keys(this.controls)){const Tt=this.controls[De];if(this.contains(De)&&Me(Tt))return!0}return!1}_reduceValue(){return this._reduceChildren({},(Me,De,Tt)=>((De.enabled||this.disabled)&&(Me[Tt]=De.value),Me))}_reduceChildren(Me,De){let Tt=Me;return this._forEachChild((dr,Qi)=>{Tt=De(Tt,dr,Qi)}),Tt}_allControlsDisabled(){for(const Me of Object.keys(this.controls))if(this.controls[Me].enabled)return!1;return Object.keys(this.controls).length>0||this.disabled}_checkAllValuesPresent(Me){this._forEachChild((De,Tt)=>{if(void 0===Me[Tt])throw new Error(`Must supply a value for form control with name: '${Tt}'.`)})}}class yr extends ai{constructor(Me,De,Tt){super(Vi(De),zo(Tt,De)),this.controls=Me,this._initObservables(),this._setUpdateStrategy(De),this._setUpControls(),this.updateValueAndValidity({onlySelf:!0,emitEvent:!!this.asyncValidator})}at(Me){return this.controls[Me]}push(Me,De={}){this.controls.push(Me),this._registerControl(Me),this.updateValueAndValidity({emitEvent:De.emitEvent}),this._onCollectionChange()}insert(Me,De,Tt={}){this.controls.splice(Me,0,De),this._registerControl(De),this.updateValueAndValidity({emitEvent:Tt.emitEvent})}removeAt(Me,De={}){this.controls[Me]&&this.controls[Me]._registerOnCollectionChange(()=>{}),this.controls.splice(Me,1),this.updateValueAndValidity({emitEvent:De.emitEvent})}setControl(Me,De,Tt={}){this.controls[Me]&&this.controls[Me]._registerOnCollectionChange(()=>{}),this.controls.splice(Me,1),De&&(this.controls.splice(Me,0,De),this._registerControl(De)),this.updateValueAndValidity({emitEvent:Tt.emitEvent}),this._onCollectionChange()}get length(){return this.controls.length}setValue(Me,De={}){this._checkAllValuesPresent(Me),Me.forEach((Tt,dr)=>{this._throwIfControlMissing(dr),this.at(dr).setValue(Tt,{onlySelf:!0,emitEvent:De.emitEvent})}),this.updateValueAndValidity(De)}patchValue(Me,De={}){null!=Me&&(Me.forEach((Tt,dr)=>{this.at(dr)&&this.at(dr).patchValue(Tt,{onlySelf:!0,emitEvent:De.emitEvent})}),this.updateValueAndValidity(De))}reset(Me=[],De={}){this._forEachChild((Tt,dr)=>{Tt.reset(Me[dr],{onlySelf:!0,emitEvent:De.emitEvent})}),this._updatePristine(De),this._updateTouched(De),this.updateValueAndValidity(De)}getRawValue(){return this.controls.map(Me=>Me instanceof Zn?Me.value:Me.getRawValue())}clear(Me={}){this.controls.length<1||(this._forEachChild(De=>De._registerOnCollectionChange(()=>{})),this.controls.splice(0),this.updateValueAndValidity({emitEvent:Me.emitEvent}))}_syncPendingControls(){let Me=this.controls.reduce((De,Tt)=>!!Tt._syncPendingControls()||De,!1);return Me&&this.updateValueAndValidity({onlySelf:!0}),Me}_throwIfControlMissing(Me){if(!this.controls.length)throw new Error("\n        There are no form controls registered with this array yet. If you're using ngModel,\n        you may want to check next tick (e.g. use setTimeout).\n      ");if(!this.at(Me))throw new Error(`Cannot find form control at index ${Me}`)}_forEachChild(Me){this.controls.forEach((De,Tt)=>{Me(De,Tt)})}_updateValue(){this.value=this.controls.filter(Me=>Me.enabled||this.disabled).map(Me=>Me.value)}_anyControls(Me){return this.controls.some(De=>De.enabled&&Me(De))}_setUpControls(){this._forEachChild(Me=>this._registerControl(Me))}_checkAllValuesPresent(Me){this._forEachChild((De,Tt)=>{if(void 0===Me[Tt])throw new Error(`Must supply a value for form control at index: ${Tt}.`)})}_allControlsDisabled(){for(const Me of this.controls)if(Me.enabled)return!1;return this.controls.length>0||this.disabled}_registerControl(Me){Me.setParent(this),Me._registerOnCollectionChange(this._onCollectionChange)}}const rr={provide:wr,useExisting:(0,r.Gpc)(()=>Ti)},ho=(()=>Promise.resolve(null))();let Ti=(()=>{class Te extends wr{constructor(De,Tt){super(),this.submitted=!1,this._directives=[],this.ngSubmit=new r.vpe,this.form=new cr({},Gt(De),Bt(Tt))}ngAfterViewInit(){this._setUpdateStrategy()}get formDirective(){return this}get control(){return this.form}get path(){return[]}get controls(){return this.form.controls}addControl(De){ho.then(()=>{const Tt=this._findContainer(De.path);De.control=Tt.registerControl(De.name,De.control),Tr(De.control,De),De.control.updateValueAndValidity({emitEvent:!1}),this._directives.push(De)})}getControl(De){return this.form.get(De.path)}removeControl(De){ho.then(()=>{const Tt=this._findContainer(De.path);Tt&&Tt.removeControl(De.name),kn(this._directives,De)})}addFormGroup(De){ho.then(()=>{const Tt=this._findContainer(De.path),dr=new cr({});no(dr,De),Tt.registerControl(De.name,dr),dr.updateValueAndValidity({emitEvent:!1})})}removeFormGroup(De){ho.then(()=>{const Tt=this._findContainer(De.path);Tt&&Tt.removeControl(De.name)})}getFormGroup(De){return this.form.get(De.path)}updateModel(De,Tt){ho.then(()=>{this.form.get(De.path).setValue(Tt)})}setValue(De){this.control.setValue(De)}onSubmit(De){return this.submitted=!0,mn(this.form,this._directives),this.ngSubmit.emit(De),!1}onReset(){this.resetForm()}resetForm(De){this.form.reset(De),this.submitted=!1}_setUpdateStrategy(){this.options&&null!=this.options.updateOn&&(this.form._updateOn=this.options.updateOn)}_findContainer(De){return De.pop(),De.length?this.form.get(De):this.form}}return Te.\u0275fac=function(De){return new(De||Te)(r.Y36(ae,10),r.Y36($,10))},Te.\u0275dir=r.lG2({type:Te,selectors:[["form",3,"ngNoForm","",3,"formGroup",""],["ng-form"],["","ngForm",""]],hostBindings:function(De,Tt){1&De&&r.NdJ("submit",function(Qi){return Tt.onSubmit(Qi)})("reset",function(){return Tt.onReset()})},inputs:{options:["ngFormOptions","options"]},outputs:{ngSubmit:"ngSubmit"},exportAs:["ngForm"],features:[r._Bn([rr]),r.qOj]}),Te})(),Bo=(()=>{class Te extends wr{ngOnInit(){this._checkParentType(),this.formDirective.addFormGroup(this)}ngOnDestroy(){this.formDirective&&this.formDirective.removeFormGroup(this)}get control(){return this.formDirective.getFormGroup(this)}get path(){return Ai(null==this.name?this.name:this.name.toString(),this._parent)}get formDirective(){return this._parent?this._parent.formDirective:null}_checkParentType(){}}return Te.\u0275fac=function(){let Me;return function(Tt){return(Me||(Me=r.n5z(Te)))(Tt||Te)}}(),Te.\u0275dir=r.lG2({type:Te,features:[r.qOj]}),Te})();const Ct={provide:Qr,useExisting:(0,r.Gpc)(()=>Cn)},nn=(()=>Promise.resolve(null))();let Cn=(()=>{class Te extends Qr{constructor(De,Tt,dr,Qi){super(),this.control=new Zn,this._registered=!1,this.update=new r.vpe,this._parent=De,this._setValidators(Tt),this._setAsyncValidators(dr),this.valueAccessor=Wn(0,Qi)}ngOnChanges(De){this._checkForErrors(),this._registered||this._setUpControl(),"isDisabled"in De&&this._updateDisabled(De),jt(De,this.viewModel)&&(this._updateValue(this.model),this.viewModel=this.model)}ngOnDestroy(){this.formDirective&&this.formDirective.removeControl(this)}get path(){return this._parent?Ai(this.name,this._parent):[this.name]}get formDirective(){return this._parent?this._parent.formDirective:null}viewToModelUpdate(De){this.viewModel=De,this.update.emit(De)}_setUpControl(){this._setUpdateStrategy(),this._isStandalone()?this._setUpStandalone():this.formDirective.addControl(this),this._registered=!0}_setUpdateStrategy(){this.options&&null!=this.options.updateOn&&(this.control._updateOn=this.options.updateOn)}_isStandalone(){return!this._parent||!(!this.options||!this.options.standalone)}_setUpStandalone(){Tr(this.control,this),this.control.updateValueAndValidity({emitEvent:!1})}_checkForErrors(){this._isStandalone()||this._checkParentType(),this._checkName()}_checkParentType(){}_checkName(){this.options&&this.options.name&&(this.name=this.options.name),this._isStandalone()}_updateValue(De){nn.then(()=>{this.control.setValue(De,{emitViewToModelChange:!1})})}_updateDisabled(De){const Tt=De.isDisabled.currentValue,dr=""===Tt||Tt&&"false"!==Tt;nn.then(()=>{dr&&!this.control.disabled?this.control.disable():!dr&&this.control.disabled&&this.control.enable()})}}return Te.\u0275fac=function(De){return new(De||Te)(r.Y36(wr,9),r.Y36(ae,10),r.Y36($,10),r.Y36(T,10))},Te.\u0275dir=r.lG2({type:Te,selectors:[["","ngModel","",3,"formControlName","",3,"formControl",""]],inputs:{name:"name",isDisabled:["disabled","isDisabled"],model:["ngModel","model"],options:["ngModelOptions","options"]},outputs:{update:"ngModelChange"},exportAs:["ngModel"],features:[r._Bn([Ct]),r.qOj,r.TTD]}),Te})(),br=(()=>{class Te{}return Te.\u0275fac=function(De){return new(De||Te)},Te.\u0275dir=r.lG2({type:Te,selectors:[["form",3,"ngNoForm","",3,"ngNativeValidate",""]],hostAttrs:["novalidate",""]}),Te})();const zi={provide:T,useExisting:(0,r.Gpc)(()=>Wo),multi:!0};let Wo=(()=>{class Te extends y{writeValue(De){this.setProperty("value",null==De?"":De)}registerOnChange(De){this.onChange=Tt=>{De(""==Tt?null:parseFloat(Tt))}}}return Te.\u0275fac=function(){let Me;return function(Tt){return(Me||(Me=r.n5z(Te)))(Tt||Te)}}(),Te.\u0275dir=r.lG2({type:Te,selectors:[["input","type","number","formControlName",""],["input","type","number","formControl",""],["input","type","number","ngModel",""]],hostBindings:function(De,Tt){1&De&&r.NdJ("input",function(Qi){return Tt.onChange(Qi.target.value)})("blur",function(){return Tt.onTouched()})},features:[r._Bn([zi]),r.qOj]}),Te})();const Do={provide:T,useExisting:(0,r.Gpc)(()=>qo),multi:!0};let _s=(()=>{class Te{}return Te.\u0275fac=function(De){return new(De||Te)},Te.\u0275mod=r.oAB({type:Te}),Te.\u0275inj=r.cJS({}),Te})(),bs=(()=>{class Te{constructor(){this._accessors=[]}add(De,Tt){this._accessors.push([De,Tt])}remove(De){for(let Tt=this._accessors.length-1;Tt>=0;--Tt)if(this._accessors[Tt][1]===De)return void this._accessors.splice(Tt,1)}select(De){this._accessors.forEach(Tt=>{this._isSameGroup(Tt,De)&&Tt[1]!==De&&Tt[1].fireUncheck(De.value)})}_isSameGroup(De,Tt){return!!De[0].control&&De[0]._parent===Tt._control._parent&&De[1].name===Tt.name}}return Te.\u0275fac=function(De){return new(De||Te)},Te.\u0275prov=(0,r.Yz7)({factory:function(){return new Te},token:Te,providedIn:_s}),Te})(),qo=(()=>{class Te extends y{constructor(De,Tt,dr,Qi){super(De,Tt),this._registry=dr,this._injector=Qi,this.onChange=()=>{}}ngOnInit(){this._control=this._injector.get(Qr),this._checkName(),this._registry.add(this._control,this)}ngOnDestroy(){this._registry.remove(this)}writeValue(De){this._state=De===this.value,this.setProperty("checked",this._state)}registerOnChange(De){this._fn=De,this.onChange=()=>{De(this.value),this._registry.select(this)}}fireUncheck(De){this.writeValue(De)}_checkName(){!this.name&&this.formControlName&&(this.name=this.formControlName)}}return Te.\u0275fac=function(De){return new(De||Te)(r.Y36(r.Qsj),r.Y36(r.SBq),r.Y36(bs),r.Y36(r.zs3))},Te.\u0275dir=r.lG2({type:Te,selectors:[["input","type","radio","formControlName",""],["input","type","radio","formControl",""],["input","type","radio","ngModel",""]],hostBindings:function(De,Tt){1&De&&r.NdJ("change",function(){return Tt.onChange()})("blur",function(){return Tt.onTouched()})},inputs:{name:"name",formControlName:"formControlName",value:"value"},features:[r._Bn([Do]),r.qOj]}),Te})();const pa=new r.OlP("NgModelWithFormControlWarning"),yl={provide:wr,useExisting:(0,r.Gpc)(()=>fo)};let fo=(()=>{class Te extends wr{constructor(De,Tt){super(),this.validators=De,this.asyncValidators=Tt,this.submitted=!1,this._onCollectionChange=()=>this._updateDomValue(),this.directives=[],this.form=null,this.ngSubmit=new r.vpe,this._setValidators(De),this._setAsyncValidators(Tt)}ngOnChanges(De){this._checkFormPresent(),De.hasOwnProperty("form")&&(this._updateValidators(),this._updateDomValue(),this._updateRegistrations(),this._oldForm=this.form)}ngOnDestroy(){this.form&&(Xt(this.form,this),this.form._onCollectionChange===this._onCollectionChange&&this.form._registerOnCollectionChange(()=>{}))}get formDirective(){return this}get control(){return this.form}get path(){return[]}addControl(De){const Tt=this.form.get(De.path);return Tr(Tt,De),Tt.updateValueAndValidity({emitEvent:!1}),this.directives.push(De),Tt}getControl(De){return this.form.get(De.path)}removeControl(De){Nr(De.control||null,De,!1),kn(this.directives,De)}addFormGroup(De){this._setUpFormContainer(De)}removeFormGroup(De){this._cleanUpFormContainer(De)}getFormGroup(De){return this.form.get(De.path)}addFormArray(De){this._setUpFormContainer(De)}removeFormArray(De){this._cleanUpFormContainer(De)}getFormArray(De){return this.form.get(De.path)}updateModel(De,Tt){this.form.get(De.path).setValue(Tt)}onSubmit(De){return this.submitted=!0,mn(this.form,this.directives),this.ngSubmit.emit(De),!1}onReset(){this.resetForm()}resetForm(De){this.form.reset(De),this.submitted=!1}_updateDomValue(){this.directives.forEach(De=>{const Tt=De.control,dr=this.form.get(De.path);Tt!==dr&&(Nr(Tt||null,De),dr instanceof Zn&&(Tr(dr,De),De.control=dr))}),this.form._updateTreeValidity({emitEvent:!1})}_setUpFormContainer(De){const Tt=this.form.get(De.path);no(Tt,De),Tt.updateValueAndValidity({emitEvent:!1})}_cleanUpFormContainer(De){if(this.form){const Tt=this.form.get(De.path);Tt&&function(Te,Me){return Xt(Te,Me)}(Tt,De)&&Tt.updateValueAndValidity({emitEvent:!1})}}_updateRegistrations(){this.form._registerOnCollectionChange(this._onCollectionChange),this._oldForm&&this._oldForm._registerOnCollectionChange(()=>{})}_updateValidators(){mr(this.form,this),this._oldForm&&Xt(this._oldForm,this)}_checkFormPresent(){}}return Te.\u0275fac=function(De){return new(De||Te)(r.Y36(ae,10),r.Y36($,10))},Te.\u0275dir=r.lG2({type:Te,selectors:[["","formGroup",""]],hostBindings:function(De,Tt){1&De&&r.NdJ("submit",function(Qi){return Tt.onSubmit(Qi)})("reset",function(){return Tt.onReset()})},inputs:{form:["formGroup","form"]},outputs:{ngSubmit:"ngSubmit"},exportAs:["ngForm"],features:[r._Bn([yl]),r.qOj,r.TTD]}),Te})();const Da={provide:wr,useExisting:(0,r.Gpc)(()=>Ao)};let Ao=(()=>{class Te extends Bo{constructor(De,Tt,dr){super(),this._parent=De,this._setValidators(Tt),this._setAsyncValidators(dr)}_checkParentType(){Ra(this._parent)}}return Te.\u0275fac=function(De){return new(De||Te)(r.Y36(wr,13),r.Y36(ae,10),r.Y36($,10))},Te.\u0275dir=r.lG2({type:Te,selectors:[["","formGroupName",""]],inputs:{name:["formGroupName","name"]},features:[r._Bn([Da]),r.qOj]}),Te})();const ls={provide:wr,useExisting:(0,r.Gpc)(()=>gs)};let gs=(()=>{class Te extends wr{constructor(De,Tt,dr){super(),this._parent=De,this._setValidators(Tt),this._setAsyncValidators(dr)}ngOnInit(){this._checkParentType(),this.formDirective.addFormArray(this)}ngOnDestroy(){this.formDirective&&this.formDirective.removeFormArray(this)}get control(){return this.formDirective.getFormArray(this)}get formDirective(){return this._parent?this._parent.formDirective:null}get path(){return Ai(null==this.name?this.name:this.name.toString(),this._parent)}_checkParentType(){Ra(this._parent)}}return Te.\u0275fac=function(De){return new(De||Te)(r.Y36(wr,13),r.Y36(ae,10),r.Y36($,10))},Te.\u0275dir=r.lG2({type:Te,selectors:[["","formArrayName",""]],inputs:{name:["formArrayName","name"]},features:[r._Bn([ls]),r.qOj]}),Te})();function Ra(Te){return!(Te instanceof Ao||Te instanceof fo||Te instanceof gs)}const pl={provide:Qr,useExisting:(0,r.Gpc)(()=>Qs)};let Qs=(()=>{class Te extends Qr{constructor(De,Tt,dr,Qi,Jo){super(),this._ngModelWarningConfig=Jo,this._added=!1,this.update=new r.vpe,this._ngModelWarningSent=!1,this._parent=De,this._setValidators(Tt),this._setAsyncValidators(dr),this.valueAccessor=Wn(0,Qi)}set isDisabled(De){}ngOnChanges(De){this._added||this._setUpControl(),jt(De,this.viewModel)&&(this.viewModel=this.model,this.formDirective.updateModel(this,this.model))}ngOnDestroy(){this.formDirective&&this.formDirective.removeControl(this)}viewToModelUpdate(De){this.viewModel=De,this.update.emit(De)}get path(){return Ai(null==this.name?this.name:this.name.toString(),this._parent)}get formDirective(){return this._parent?this._parent.formDirective:null}_checkParentType(){}_setUpControl(){this._checkParentType(),this.control=this.formDirective.addControl(this),this.control.disabled&&this.valueAccessor.setDisabledState&&this.valueAccessor.setDisabledState(!0),this._added=!0}}return Te.\u0275fac=function(De){return new(De||Te)(r.Y36(wr,13),r.Y36(ae,10),r.Y36($,10),r.Y36(T,10),r.Y36(pa,8))},Te.\u0275dir=r.lG2({type:Te,selectors:[["","formControlName",""]],inputs:{isDisabled:["disabled","isDisabled"],name:["formControlName","name"],model:["ngModel","model"]},outputs:{update:"ngModelChange"},features:[r._Bn([pl]),r.qOj,r.TTD]}),Te._ngModelWarningSentOnce=!1,Te})();const Fo={provide:T,useExisting:(0,r.Gpc)(()=>ms),multi:!0};function Eo(Te,Me){return null==Te?`${Me}`:(Me&&"object"==typeof Me&&(Me="Object"),`${Te}: ${Me}`.slice(0,50))}let ms=(()=>{class Te extends y{constructor(){super(...arguments),this._optionMap=new Map,this._idCounter=0,this._compareWith=Object.is}set compareWith(De){this._compareWith=De}writeValue(De){this.value=De;const Tt=this._getOptionId(De);null==Tt&&this.setProperty("selectedIndex",-1);const dr=Eo(Tt,De);this.setProperty("value",dr)}registerOnChange(De){this.onChange=Tt=>{this.value=this._getOptionValue(Tt),De(this.value)}}_registerOption(){return(this._idCounter++).toString()}_getOptionId(De){for(const Tt of Array.from(this._optionMap.keys()))if(this._compareWith(this._optionMap.get(Tt),De))return Tt;return null}_getOptionValue(De){const Tt=function(Te){return Te.split(":")[0]}(De);return this._optionMap.has(Tt)?this._optionMap.get(Tt):De}}return Te.\u0275fac=function(){let Me;return function(Tt){return(Me||(Me=r.n5z(Te)))(Tt||Te)}}(),Te.\u0275dir=r.lG2({type:Te,selectors:[["select","formControlName","",3,"multiple",""],["select","formControl","",3,"multiple",""],["select","ngModel","",3,"multiple",""]],hostBindings:function(De,Tt){1&De&&r.NdJ("change",function(Qi){return Tt.onChange(Qi.target.value)})("blur",function(){return Tt.onTouched()})},inputs:{compareWith:"compareWith"},features:[r._Bn([Fo]),r.qOj]}),Te})(),Co=(()=>{class Te{constructor(De,Tt,dr){this._element=De,this._renderer=Tt,this._select=dr,this._select&&(this.id=this._select._registerOption())}set ngValue(De){null!=this._select&&(this._select._optionMap.set(this.id,De),this._setElementValue(Eo(this.id,De)),this._select.writeValue(this._select.value))}set value(De){this._setElementValue(De),this._select&&this._select.writeValue(this._select.value)}_setElementValue(De){this._renderer.setProperty(this._element.nativeElement,"value",De)}ngOnDestroy(){this._select&&(this._select._optionMap.delete(this.id),this._select.writeValue(this._select.value))}}return Te.\u0275fac=function(De){return new(De||Te)(r.Y36(r.SBq),r.Y36(r.Qsj),r.Y36(ms,9))},Te.\u0275dir=r.lG2({type:Te,selectors:[["option"]],inputs:{ngValue:"ngValue",value:"value"}}),Te})();const kr={provide:T,useExisting:(0,r.Gpc)(()=>ne),multi:!0};function ro(Te,Me){return null==Te?`${Me}`:("string"==typeof Me&&(Me=`'${Me}'`),Me&&"object"==typeof Me&&(Me="Object"),`${Te}: ${Me}`.slice(0,50))}let ne=(()=>{class Te extends y{constructor(){super(...arguments),this._optionMap=new Map,this._idCounter=0,this._compareWith=Object.is}set compareWith(De){this._compareWith=De}writeValue(De){let Tt;if(this.value=De,Array.isArray(De)){const dr=De.map(Qi=>this._getOptionId(Qi));Tt=(Qi,Jo)=>{Qi._setSelected(dr.indexOf(Jo.toString())>-1)}}else Tt=(dr,Qi)=>{dr._setSelected(!1)};this._optionMap.forEach(Tt)}registerOnChange(De){this.onChange=Tt=>{const dr=[];if(void 0!==Tt.selectedOptions){const Qi=Tt.selectedOptions;for(let Jo=0;Jo<Qi.length;Jo++){const Es=Qi.item(Jo),vs=this._getOptionValue(Es.value);dr.push(vs)}}else{const Qi=Tt.options;for(let Jo=0;Jo<Qi.length;Jo++){const Es=Qi.item(Jo);if(Es.selected){const vs=this._getOptionValue(Es.value);dr.push(vs)}}}this.value=dr,De(dr)}}_registerOption(De){const Tt=(this._idCounter++).toString();return this._optionMap.set(Tt,De),Tt}_getOptionId(De){for(const Tt of Array.from(this._optionMap.keys()))if(this._compareWith(this._optionMap.get(Tt)._value,De))return Tt;return null}_getOptionValue(De){const Tt=function(Te){return Te.split(":")[0]}(De);return this._optionMap.has(Tt)?this._optionMap.get(Tt)._value:De}}return Te.\u0275fac=function(){let Me;return function(Tt){return(Me||(Me=r.n5z(Te)))(Tt||Te)}}(),Te.\u0275dir=r.lG2({type:Te,selectors:[["select","multiple","","formControlName",""],["select","multiple","","formControl",""],["select","multiple","","ngModel",""]],hostBindings:function(De,Tt){1&De&&r.NdJ("change",function(Qi){return Tt.onChange(Qi.target)})("blur",function(){return Tt.onTouched()})},inputs:{compareWith:"compareWith"},features:[r._Bn([kr]),r.qOj]}),Te})(),$e=(()=>{class Te{constructor(De,Tt,dr){this._element=De,this._renderer=Tt,this._select=dr,this._select&&(this.id=this._select._registerOption(this))}set ngValue(De){null!=this._select&&(this._value=De,this._setElementValue(ro(this.id,De)),this._select.writeValue(this._select.value))}set value(De){this._select?(this._value=De,this._setElementValue(ro(this.id,De)),this._select.writeValue(this._select.value)):this._setElementValue(De)}_setElementValue(De){this._renderer.setProperty(this._element.nativeElement,"value",De)}_setSelected(De){this._renderer.setProperty(this._element.nativeElement,"selected",De)}ngOnDestroy(){this._select&&(this._select._optionMap.delete(this.id),this._select.writeValue(this._select.value))}}return Te.\u0275fac=function(De){return new(De||Te)(r.Y36(r.SBq),r.Y36(r.Qsj),r.Y36(ne,9))},Te.\u0275dir=r.lG2({type:Te,selectors:[["option"]],inputs:{ngValue:"ngValue",value:"value"}}),Te})(),sn=(()=>{class Te{constructor(){this._validator=je}handleChanges(De){if(this.inputName in De){const Tt=this.normalizeInput(De[this.inputName].currentValue);this._validator=this.createValidator(Tt),this._onChange&&this._onChange()}}validate(De){return this._validator(De)}registerOnValidatorChange(De){this._onChange=De}}return Te.\u0275fac=function(De){return new(De||Te)},Te.\u0275dir=r.lG2({type:Te}),Te})();const ei={provide:ae,useExisting:(0,r.Gpc)(()=>fi),multi:!0};let fi=(()=>{class Te extends sn{constructor(){super(...arguments),this.inputName="max",this.normalizeInput=De=>parseFloat(De),this.createValidator=De=>he(De)}ngOnChanges(De){this.handleChanges(De)}}return Te.\u0275fac=function(){let Me;return function(Tt){return(Me||(Me=r.n5z(Te)))(Tt||Te)}}(),Te.\u0275dir=r.lG2({type:Te,selectors:[["input","type","number","max","","formControlName",""],["input","type","number","max","","formControl",""],["input","type","number","max","","ngModel",""]],hostVars:1,hostBindings:function(De,Tt){if(2&De){let dr;r.uIk("max",null!==(dr=Tt.max)&&void 0!==dr?dr:null)}},inputs:{max:"max"},features:[r._Bn([ei]),r.qOj,r.TTD]}),Te})();const Oi={provide:ae,useExisting:(0,r.Gpc)(()=>os),multi:!0};let os=(()=>{class Te extends sn{constructor(){super(...arguments),this.inputName="min",this.normalizeInput=De=>parseFloat(De),this.createValidator=De=>oe(De)}ngOnChanges(De){this.handleChanges(De)}}return Te.\u0275fac=function(){let Me;return function(Tt){return(Me||(Me=r.n5z(Te)))(Tt||Te)}}(),Te.\u0275dir=r.lG2({type:Te,selectors:[["input","type","number","min","","formControlName",""],["input","type","number","min","","formControl",""],["input","type","number","min","","ngModel",""]],hostVars:1,hostBindings:function(De,Tt){if(2&De){let dr;r.uIk("min",null!==(dr=Tt.min)&&void 0!==dr?dr:null)}},inputs:{min:"min"},features:[r._Bn([Oi]),r.qOj,r.TTD]}),Te})();const Ro={provide:ae,useExisting:(0,r.Gpc)(()=>To),multi:!0};let To=(()=>{class Te{constructor(){this._required=!1}get required(){return this._required}set required(De){this._required=null!=De&&!1!==De&&"false"!=`${De}`,this._onChange&&this._onChange()}validate(De){return this.required?me(De):null}registerOnValidatorChange(De){this._onChange=De}}return Te.\u0275fac=function(De){return new(De||Te)},Te.\u0275dir=r.lG2({type:Te,selectors:[["","required","","formControlName","",3,"type","checkbox"],["","required","","formControl","",3,"type","checkbox"],["","required","","ngModel","",3,"type","checkbox"]],hostVars:1,hostBindings:function(De,Tt){2&De&&r.uIk("required",Tt.required?"":null)},inputs:{required:"required"},features:[r._Bn([Ro])]}),Te})(),el=(()=>{class Te{}return Te.\u0275fac=function(De){return new(De||Te)},Te.\u0275mod=r.oAB({type:Te}),Te.\u0275inj=r.cJS({imports:[[_s]]}),Te})(),Cu=(()=>{class Te{}return Te.\u0275fac=function(De){return new(De||Te)},Te.\u0275mod=r.oAB({type:Te}),Te.\u0275inj=r.cJS({imports:[el]}),Te})(),jl=(()=>{class Te{static withConfig(De){return{ngModule:Te,providers:[{provide:pa,useValue:De.warnOnNgModelWithFormControl}]}}}return Te.\u0275fac=function(De){return new(De||Te)},Te.\u0275mod=r.oAB({type:Te}),Te.\u0275inj=r.cJS({imports:[el]}),Te})(),Nt=(()=>{class Te{group(De,Tt=null){const dr=this._reduceControls(De);let Es,Qi=null,Jo=null;return null!=Tt&&(function(Te){return void 0!==Te.asyncValidators||void 0!==Te.validators||void 0!==Te.updateOn}(Tt)?(Qi=null!=Tt.validators?Tt.validators:null,Jo=null!=Tt.asyncValidators?Tt.asyncValidators:null,Es=null!=Tt.updateOn?Tt.updateOn:void 0):(Qi=null!=Tt.validator?Tt.validator:null,Jo=null!=Tt.asyncValidator?Tt.asyncValidator:null)),new cr(dr,{asyncValidators:Jo,updateOn:Es,validators:Qi})}control(De,Tt,dr){return new Zn(De,Tt,dr)}array(De,Tt,dr){const Qi=De.map(Jo=>this._createControl(Jo));return new yr(Qi,Tt,dr)}_reduceControls(De){const Tt={};return Object.keys(De).forEach(dr=>{Tt[dr]=this._createControl(De[dr])}),Tt}_createControl(De){return De instanceof Zn||De instanceof cr||De instanceof yr?De:Array.isArray(De)?this.control(De[0],De.length>1?De[1]:null,De.length>2?De[2]:null):this.control(De)}}return Te.\u0275fac=function(De){return new(De||Te)},Te.\u0275prov=(0,r.Yz7)({factory:function(){return new Te},token:Te,providedIn:jl}),Te})()},91211:(v,S,i)=>{"use strict";i.d(S,{b2:()=>wn,H7:()=>zn,HJ:()=>ai,q6:()=>Wn,se:()=>ci});var r=i(12057),u=i(74788);class p extends r.w_{constructor(){super(...arguments),this.supportsDOMEvents=!0}}class f extends p{static makeCurrent(){(0,r.HT)(new f)}onAndCancel(ln,Ht,cn){return ln.addEventListener(Ht,cn,!1),()=>{ln.removeEventListener(Ht,cn,!1)}}dispatchEvent(ln,Ht){ln.dispatchEvent(Ht)}remove(ln){ln.parentNode&&ln.parentNode.removeChild(ln)}createElement(ln,Ht){return(Ht=Ht||this.getDefaultDocument()).createElement(ln)}createHtmlDocument(){return document.implementation.createHTMLDocument("fakeTitle")}getDefaultDocument(){return document}isElementNode(ln){return ln.nodeType===Node.ELEMENT_NODE}isShadowRoot(ln){return ln instanceof DocumentFragment}getGlobalEventTarget(ln,Ht){return"window"===Ht?window:"document"===Ht?ln:"body"===Ht?ln.body:null}getBaseHref(ln){const Ht=(e=e||document.querySelector("base"),e?e.getAttribute("href"):null);return null==Ht?null:function(ar){y=y||document.createElement("a"),y.setAttribute("href",ar);const ln=y.pathname;return"/"===ln.charAt(0)?ln:`/${ln}`}(Ht)}resetBaseElement(){e=null}getUserAgent(){return window.navigator.userAgent}getCookie(ln){return(0,r.Mx)(document.cookie,ln)}}let y,e=null;const M=new u.OlP("TRANSITION_ID"),F=[{provide:u.ip1,useFactory:function(ar,ln,Ht){return()=>{Ht.get(u.CZH).donePromise.then(()=>{const cn=(0,r.q)(),Ct=ln.querySelectorAll(`style[ng-transition="${ar}"]`);for(let pr=0;pr<Ct.length;pr++)cn.remove(Ct[pr])})}},deps:[M,r.K0,u.zs3],multi:!0}];class Z{static init(){(0,u.VLi)(new Z)}addToWindow(ln){u.dqk.getAngularTestability=(cn,Ct=!0)=>{const pr=ln.findTestabilityInTree(cn,Ct);if(null==pr)throw new Error("Could not find testability for element.");return pr},u.dqk.getAllAngularTestabilities=()=>ln.getAllTestabilities(),u.dqk.getAllAngularRootElements=()=>ln.getAllRootElements(),u.dqk.frameworkStabilizers||(u.dqk.frameworkStabilizers=[]),u.dqk.frameworkStabilizers.push(cn=>{const Ct=u.dqk.getAllAngularTestabilities();let pr=Ct.length,nn=!1;const Cn=function(br){nn=nn||br,pr--,0==pr&&cn(nn)};Ct.forEach(function(br){br.whenStable(Cn)})})}findTestabilityInTree(ln,Ht,cn){if(null==Ht)return null;const Ct=ln.getTestability(Ht);return null!=Ct?Ct:cn?(0,r.q)().isShadowRoot(Ht)?this.findTestabilityInTree(ln,Ht.host,!0):this.findTestabilityInTree(ln,Ht.parentElement,!0):null}}let J=(()=>{class ar{build(){return new XMLHttpRequest}}return ar.\u0275fac=function(Ht){return new(Ht||ar)},ar.\u0275prov=u.Yz7({token:ar,factory:ar.\u0275fac}),ar})();const je=new u.OlP("EventManagerPlugins");let Ie=(()=>{class ar{constructor(Ht,cn){this._zone=cn,this._eventNameToPlugin=new Map,Ht.forEach(Ct=>Ct.manager=this),this._plugins=Ht.slice().reverse()}addEventListener(Ht,cn,Ct){return this._findPluginFor(cn).addEventListener(Ht,cn,Ct)}addGlobalEventListener(Ht,cn,Ct){return this._findPluginFor(cn).addGlobalEventListener(Ht,cn,Ct)}getZone(){return this._zone}_findPluginFor(Ht){const cn=this._eventNameToPlugin.get(Ht);if(cn)return cn;const Ct=this._plugins;for(let pr=0;pr<Ct.length;pr++){const nn=Ct[pr];if(nn.supports(Ht))return this._eventNameToPlugin.set(Ht,nn),nn}throw new Error(`No event manager plugin found for event ${Ht}`)}}return ar.\u0275fac=function(Ht){return new(Ht||ar)(u.LFG(je),u.LFG(u.R0b))},ar.\u0275prov=u.Yz7({token:ar,factory:ar.\u0275fac}),ar})();class Ve{constructor(ln){this._doc=ln}addGlobalEventListener(ln,Ht,cn){const Ct=(0,r.q)().getGlobalEventTarget(this._doc,ln);if(!Ct)throw new Error(`Unsupported event target ${Ct} for event ${Ht}`);return this.addEventListener(Ct,Ht,cn)}}let He=(()=>{class ar{constructor(){this._stylesSet=new Set}addStyles(Ht){const cn=new Set;Ht.forEach(Ct=>{this._stylesSet.has(Ct)||(this._stylesSet.add(Ct),cn.add(Ct))}),this.onStylesAdded(cn)}onStylesAdded(Ht){}getAllStyles(){return Array.from(this._stylesSet)}}return ar.\u0275fac=function(Ht){return new(Ht||ar)},ar.\u0275prov=u.Yz7({token:ar,factory:ar.\u0275fac}),ar})(),Zt=(()=>{class ar extends He{constructor(Ht){super(),this._doc=Ht,this._hostNodes=new Map,this._hostNodes.set(Ht.head,[])}_addStylesToHost(Ht,cn,Ct){Ht.forEach(pr=>{const nn=this._doc.createElement("style");nn.textContent=pr,Ct.push(cn.appendChild(nn))})}addHost(Ht){const cn=[];this._addStylesToHost(this._stylesSet,Ht,cn),this._hostNodes.set(Ht,cn)}removeHost(Ht){const cn=this._hostNodes.get(Ht);cn&&cn.forEach(st),this._hostNodes.delete(Ht)}onStylesAdded(Ht){this._hostNodes.forEach((cn,Ct)=>{this._addStylesToHost(Ht,Ct,cn)})}ngOnDestroy(){this._hostNodes.forEach(Ht=>Ht.forEach(st))}}return ar.\u0275fac=function(Ht){return new(Ht||ar)(u.LFG(r.K0))},ar.\u0275prov=u.Yz7({token:ar,factory:ar.\u0275fac}),ar})();function st(ar){(0,r.q)().remove(ar)}const en={svg:"http://www.w3.org/2000/svg",xhtml:"http://www.w3.org/1999/xhtml",xlink:"http://www.w3.org/1999/xlink",xml:"http://www.w3.org/XML/1998/namespace",xmlns:"http://www.w3.org/2000/xmlns/"},$t=/%COMP%/g;function zt(ar,ln,Ht){for(let cn=0;cn<ln.length;cn++){let Ct=ln[cn];Array.isArray(Ct)?zt(ar,Ct,Ht):(Ct=Ct.replace($t,ar),Ht.push(Ct))}return Ht}function Yn(ar){return ln=>{if("__ngUnwrap__"===ln)return ar;!1===ar(ln)&&(ln.preventDefault(),ln.returnValue=!1)}}let ci=(()=>{class ar{constructor(Ht,cn,Ct){this.eventManager=Ht,this.sharedStylesHost=cn,this.appId=Ct,this.rendererByCompId=new Map,this.defaultRenderer=new Ir(Ht)}createRenderer(Ht,cn){if(!Ht||!cn)return this.defaultRenderer;switch(cn.encapsulation){case u.ifc.Emulated:{let Ct=this.rendererByCompId.get(cn.id);return Ct||(Ct=new In(this.eventManager,this.sharedStylesHost,cn,this.appId),this.rendererByCompId.set(cn.id,Ct)),Ct.applyToHost(Ht),Ct}case 1:case u.ifc.ShadowDom:return new Hn(this.eventManager,this.sharedStylesHost,Ht,cn);default:if(!this.rendererByCompId.has(cn.id)){const Ct=zt(cn.id,cn.styles,[]);this.sharedStylesHost.addStyles(Ct),this.rendererByCompId.set(cn.id,this.defaultRenderer)}return this.defaultRenderer}}begin(){}end(){}}return ar.\u0275fac=function(Ht){return new(Ht||ar)(u.LFG(Ie),u.LFG(Zt),u.LFG(u.AFp))},ar.\u0275prov=u.Yz7({token:ar,factory:ar.\u0275fac}),ar})();class Ir{constructor(ln){this.eventManager=ln,this.data=Object.create(null)}destroy(){}createElement(ln,Ht){return Ht?document.createElementNS(en[Ht]||Ht,ln):document.createElement(ln)}createComment(ln){return document.createComment(ln)}createText(ln){return document.createTextNode(ln)}appendChild(ln,Ht){ln.appendChild(Ht)}insertBefore(ln,Ht,cn){ln&&ln.insertBefore(Ht,cn)}removeChild(ln,Ht){ln&&ln.removeChild(Ht)}selectRootElement(ln,Ht){let cn="string"==typeof ln?document.querySelector(ln):ln;if(!cn)throw new Error(`The selector "${ln}" did not match any elements`);return Ht||(cn.textContent=""),cn}parentNode(ln){return ln.parentNode}nextSibling(ln){return ln.nextSibling}setAttribute(ln,Ht,cn,Ct){if(Ct){Ht=Ct+":"+Ht;const pr=en[Ct];pr?ln.setAttributeNS(pr,Ht,cn):ln.setAttribute(Ht,cn)}else ln.setAttribute(Ht,cn)}removeAttribute(ln,Ht,cn){if(cn){const Ct=en[cn];Ct?ln.removeAttributeNS(Ct,Ht):ln.removeAttribute(`${cn}:${Ht}`)}else ln.removeAttribute(Ht)}addClass(ln,Ht){ln.classList.add(Ht)}removeClass(ln,Ht){ln.classList.remove(Ht)}setStyle(ln,Ht,cn,Ct){Ct&(u.JOm.DashCase|u.JOm.Important)?ln.style.setProperty(Ht,cn,Ct&u.JOm.Important?"important":""):ln.style[Ht]=cn}removeStyle(ln,Ht,cn){cn&u.JOm.DashCase?ln.style.removeProperty(Ht):ln.style[Ht]=""}setProperty(ln,Ht,cn){ln[Ht]=cn}setValue(ln,Ht){ln.nodeValue=Ht}listen(ln,Ht,cn){return"string"==typeof ln?this.eventManager.addGlobalEventListener(ln,Ht,Yn(cn)):this.eventManager.addEventListener(ln,Ht,Yn(cn))}}class In extends Ir{constructor(ln,Ht,cn,Ct){super(ln),this.component=cn;const pr=zt(Ct+"-"+cn.id,cn.styles,[]);Ht.addStyles(pr),this.contentAttr="_ngcontent-%COMP%".replace($t,Ct+"-"+cn.id),this.hostAttr="_nghost-%COMP%".replace($t,Ct+"-"+cn.id)}applyToHost(ln){super.setAttribute(ln,this.hostAttr,"")}createElement(ln,Ht){const cn=super.createElement(ln,Ht);return super.setAttribute(cn,this.contentAttr,""),cn}}class Hn extends Ir{constructor(ln,Ht,cn,Ct){super(ln),this.sharedStylesHost=Ht,this.hostEl=cn,this.shadowRoot=cn.attachShadow({mode:"open"}),this.sharedStylesHost.addHost(this.shadowRoot);const pr=zt(Ct.id,Ct.styles,[]);for(let nn=0;nn<pr.length;nn++){const Cn=document.createElement("style");Cn.textContent=pr[nn],this.shadowRoot.appendChild(Cn)}}nodeOrShadowRoot(ln){return ln===this.hostEl?this.shadowRoot:ln}destroy(){this.sharedStylesHost.removeHost(this.shadowRoot)}appendChild(ln,Ht){return super.appendChild(this.nodeOrShadowRoot(ln),Ht)}insertBefore(ln,Ht,cn){return super.insertBefore(this.nodeOrShadowRoot(ln),Ht,cn)}removeChild(ln,Ht){return super.removeChild(this.nodeOrShadowRoot(ln),Ht)}parentNode(ln){return this.nodeOrShadowRoot(super.parentNode(this.nodeOrShadowRoot(ln)))}}let Zr=(()=>{class ar extends Ve{constructor(Ht){super(Ht)}supports(Ht){return!0}addEventListener(Ht,cn,Ct){return Ht.addEventListener(cn,Ct,!1),()=>this.removeEventListener(Ht,cn,Ct)}removeEventListener(Ht,cn,Ct){return Ht.removeEventListener(cn,Ct)}}return ar.\u0275fac=function(Ht){return new(Ht||ar)(u.LFG(r.K0))},ar.\u0275prov=u.Yz7({token:ar,factory:ar.\u0275fac}),ar})();const Lr=["alt","control","meta","shift"],zr={"\b":"Backspace","\t":"Tab","\x7f":"Delete","\x1b":"Escape",Del:"Delete",Esc:"Escape",Left:"ArrowLeft",Right:"ArrowRight",Up:"ArrowUp",Down:"ArrowDown",Menu:"ContextMenu",Scroll:"ScrollLock",Win:"OS"},hi={A:"1",B:"2",C:"3",D:"4",E:"5",F:"6",G:"7",H:"8",I:"9",J:"*",K:"+",M:"-",N:".",O:"/","`":"0","\x90":"NumLock"},En={alt:ar=>ar.altKey,control:ar=>ar.ctrlKey,meta:ar=>ar.metaKey,shift:ar=>ar.shiftKey};let mr=(()=>{class ar extends Ve{constructor(Ht){super(Ht)}supports(Ht){return null!=ar.parseEventName(Ht)}addEventListener(Ht,cn,Ct){const pr=ar.parseEventName(cn),nn=ar.eventCallback(pr.fullKey,Ct,this.manager.getZone());return this.manager.getZone().runOutsideAngular(()=>(0,r.q)().onAndCancel(Ht,pr.domEventName,nn))}static parseEventName(Ht){const cn=Ht.toLowerCase().split("."),Ct=cn.shift();if(0===cn.length||"keydown"!==Ct&&"keyup"!==Ct)return null;const pr=ar._normalizeKey(cn.pop());let nn="";if(Lr.forEach(br=>{const zi=cn.indexOf(br);zi>-1&&(cn.splice(zi,1),nn+=br+".")}),nn+=pr,0!=cn.length||0===pr.length)return null;const Cn={};return Cn.domEventName=Ct,Cn.fullKey=nn,Cn}static getEventFullKey(Ht){let cn="",Ct=function(ar){let ln=ar.key;if(null==ln){if(ln=ar.keyIdentifier,null==ln)return"Unidentified";ln.startsWith("U+")&&(ln=String.fromCharCode(parseInt(ln.substring(2),16)),3===ar.location&&hi.hasOwnProperty(ln)&&(ln=hi[ln]))}return zr[ln]||ln}(Ht);return Ct=Ct.toLowerCase()," "===Ct?Ct="space":"."===Ct&&(Ct="dot"),Lr.forEach(pr=>{pr!=Ct&&En[pr](Ht)&&(cn+=pr+".")}),cn+=Ct,cn}static eventCallback(Ht,cn,Ct){return pr=>{ar.getEventFullKey(pr)===Ht&&Ct.runGuarded(()=>cn(pr))}}static _normalizeKey(Ht){switch(Ht){case"esc":return"escape";default:return Ht}}}return ar.\u0275fac=function(Ht){return new(Ht||ar)(u.LFG(r.K0))},ar.\u0275prov=u.Yz7({token:ar,factory:ar.\u0275fac}),ar})(),zn=(()=>{class ar{}return ar.\u0275fac=function(Ht){return new(Ht||ar)},ar.\u0275prov=(0,u.Yz7)({factory:function(){return(0,u.LFG)(si)},token:ar,providedIn:"root"}),ar})(),si=(()=>{class ar extends zn{constructor(Ht){super(),this._doc=Ht}sanitize(Ht,cn){if(null==cn)return null;switch(Ht){case u.q3G.NONE:return cn;case u.q3G.HTML:return(0,u.qzn)(cn,"HTML")?(0,u.z3N)(cn):(0,u.EiD)(this._doc,String(cn)).toString();case u.q3G.STYLE:return(0,u.qzn)(cn,"Style")?(0,u.z3N)(cn):cn;case u.q3G.SCRIPT:if((0,u.qzn)(cn,"Script"))return(0,u.z3N)(cn);throw new Error("unsafe value used in a script context");case u.q3G.URL:return(0,u.yhl)(cn),(0,u.qzn)(cn,"URL")?(0,u.z3N)(cn):(0,u.mCW)(String(cn));case u.q3G.RESOURCE_URL:if((0,u.qzn)(cn,"ResourceURL"))return(0,u.z3N)(cn);throw new Error("unsafe value used in a resource URL context (see https://g.co/ng/security#xss)");default:throw new Error(`Unexpected SecurityContext ${Ht} (see https://g.co/ng/security#xss)`)}}bypassSecurityTrustHtml(Ht){return(0,u.JVY)(Ht)}bypassSecurityTrustStyle(Ht){return(0,u.L6k)(Ht)}bypassSecurityTrustScript(Ht){return(0,u.eBb)(Ht)}bypassSecurityTrustUrl(Ht){return(0,u.LAX)(Ht)}bypassSecurityTrustResourceUrl(Ht){return(0,u.pB0)(Ht)}}return ar.\u0275fac=function(Ht){return new(Ht||ar)(u.LFG(r.K0))},ar.\u0275prov=(0,u.Yz7)({factory:function(){return function(ar){return new si(ar.get(r.K0))}((0,u.LFG)(u.gxx))},token:ar,providedIn:"root"}),ar})();const Wn=(0,u.eFA)(u._c5,"browser",[{provide:u.Lbi,useValue:r.bD},{provide:u.g9A,useValue:function(){f.makeCurrent(),Z.init()},multi:!0},{provide:r.K0,useFactory:function(){return(0,u.RDi)(document),document},deps:[]}]),kn=[[],{provide:u.zSh,useValue:"root"},{provide:u.qLn,useFactory:function(){return new u.qLn},deps:[]},{provide:je,useClass:Zr,multi:!0,deps:[r.K0,u.R0b,u.Lbi]},{provide:je,useClass:mr,multi:!0,deps:[r.K0]},[],{provide:ci,useClass:ci,deps:[Ie,Zt,u.AFp]},{provide:u.FYo,useExisting:ci},{provide:He,useExisting:Zt},{provide:Zt,useClass:Zt,deps:[r.K0]},{provide:u.dDg,useClass:u.dDg,deps:[u.R0b]},{provide:Ie,useClass:Ie,deps:[je,u.R0b]},{provide:r.JF,useClass:J,deps:[]},[]];let wn=(()=>{class ar{constructor(Ht){if(Ht)throw new Error("BrowserModule has already been loaded. If you need access to common directives such as NgIf and NgFor from a lazy loaded module, import CommonModule instead.")}static withServerTransition(Ht){return{ngModule:ar,providers:[{provide:u.AFp,useValue:Ht.appId},{provide:M,useExisting:u.AFp},F]}}}return ar.\u0275fac=function(Ht){return new(Ht||ar)(u.LFG(ar,12))},ar.\u0275mod=u.oAB({type:ar}),ar.\u0275inj=u.cJS({providers:kn,imports:[r.ez,u.hGG]}),ar})();const Vi="undefined"!=typeof window&&window||{};class cs{constructor(ln,Ht){this.msPerTick=ln,this.numTicks=Ht}}class zo{constructor(ln){this.appRef=ln.injector.get(u.z2F)}timeChangeDetection(ln){const Ht=ln&&ln.record,cn="Change Detection",Ct=null!=Vi.console.profile;Ht&&Ct&&Vi.console.profile(cn);const pr=So();let nn=0;for(;nn<5||So()-pr<500;)this.appRef.tick(),nn++;const Cn=So();Ht&&Ct&&Vi.console.profileEnd(cn);const br=(Cn-pr)/nn;return Vi.console.log(`ran ${nn} change detection cycles`),Vi.console.log(`${br.toFixed(2)} ms per check`),new cs(br,nn)}}function So(){return Vi.performance&&Vi.performance.now?Vi.performance.now():(new Date).getTime()}function ai(ar){return function(ar,ln){"undefined"!=typeof COMPILED&&COMPILED||((u.dqk.ng=u.dqk.ng||{})[ar]=ln)}("profiler",new zo(ar)),ar}},6283:(v,S,i)=>{"use strict";i.d(S,{gz:()=>xo,m2:()=>He,OD:()=>Ve,wm:()=>El,F0:()=>Vr,rH:()=>ko,Od:()=>Mr,yS:()=>Ho,Bz:()=>Xs,lC:()=>co});var r=i(12057),u=i(74788),p=i(18891),f=i(94402),e=i(59193);function _(Be){return new p.y(Pe=>{let Ce;try{Ce=Be()}catch(yt){return void Pe.error(yt)}return(Ce?(0,f.D)(Ce):(0,e.c)()).subscribe(Pe)})}var y=i(25917),T=i(26215),M=i(9112),R=i(13410),F=i(58071),Z=i(52441),J=i(79765),Q=i(88002),ee=i(43190),ue=i(15257),ae=i(39761),$=i(42145),se=i(45435),ve=i(5304),oe=i(94612),he=i(12627),me=i(28049),Oe=i(19773),ce=i(68307),dt=i(548),ze=i(51307),Ye=i(68939),je=i(63282);class Ie{constructor(Pe,Ce){this.id=Pe,this.url=Ce}}class Ve extends Ie{constructor(Pe,Ce,it="imperative",yt=null){super(Pe,Ce),this.navigationTrigger=it,this.restoredState=yt}toString(){return`NavigationStart(id: ${this.id}, url: '${this.url}')`}}class He extends Ie{constructor(Pe,Ce,it){super(Pe,Ce),this.urlAfterRedirects=it}toString(){return`NavigationEnd(id: ${this.id}, url: '${this.url}', urlAfterRedirects: '${this.urlAfterRedirects}')`}}class Zt extends Ie{constructor(Pe,Ce,it){super(Pe,Ce),this.reason=it}toString(){return`NavigationCancel(id: ${this.id}, url: '${this.url}')`}}class st extends Ie{constructor(Pe,Ce,it){super(Pe,Ce),this.error=it}toString(){return`NavigationError(id: ${this.id}, url: '${this.url}', error: ${this.error})`}}class en extends Ie{constructor(Pe,Ce,it,yt){super(Pe,Ce),this.urlAfterRedirects=it,this.state=yt}toString(){return`RoutesRecognized(id: ${this.id}, url: '${this.url}', urlAfterRedirects: '${this.urlAfterRedirects}', state: ${this.state})`}}class $t extends Ie{constructor(Pe,Ce,it,yt){super(Pe,Ce),this.urlAfterRedirects=it,this.state=yt}toString(){return`GuardsCheckStart(id: ${this.id}, url: '${this.url}', urlAfterRedirects: '${this.urlAfterRedirects}', state: ${this.state})`}}class Gt extends Ie{constructor(Pe,Ce,it,yt,qt){super(Pe,Ce),this.urlAfterRedirects=it,this.state=yt,this.shouldActivate=qt}toString(){return`GuardsCheckEnd(id: ${this.id}, url: '${this.url}', urlAfterRedirects: '${this.urlAfterRedirects}', state: ${this.state}, shouldActivate: ${this.shouldActivate})`}}class Ut extends Ie{constructor(Pe,Ce,it,yt){super(Pe,Ce),this.urlAfterRedirects=it,this.state=yt}toString(){return`ResolveStart(id: ${this.id}, url: '${this.url}', urlAfterRedirects: '${this.urlAfterRedirects}', state: ${this.state})`}}class Bt extends Ie{constructor(Pe,Ce,it,yt){super(Pe,Ce),this.urlAfterRedirects=it,this.state=yt}toString(){return`ResolveEnd(id: ${this.id}, url: '${this.url}', urlAfterRedirects: '${this.urlAfterRedirects}', state: ${this.state})`}}class mt{constructor(Pe){this.route=Pe}toString(){return`RouteConfigLoadStart(path: ${this.route.path})`}}class Yt{constructor(Pe){this.route=Pe}toString(){return`RouteConfigLoadEnd(path: ${this.route.path})`}}class Dt{constructor(Pe){this.snapshot=Pe}toString(){return`ChildActivationStart(path: '${this.snapshot.routeConfig&&this.snapshot.routeConfig.path||""}')`}}class zt{constructor(Pe){this.snapshot=Pe}toString(){return`ChildActivationEnd(path: '${this.snapshot.routeConfig&&this.snapshot.routeConfig.path||""}')`}}class Yn{constructor(Pe){this.snapshot=Pe}toString(){return`ActivationStart(path: '${this.snapshot.routeConfig&&this.snapshot.routeConfig.path||""}')`}}class Hr{constructor(Pe){this.snapshot=Pe}toString(){return`ActivationEnd(path: '${this.snapshot.routeConfig&&this.snapshot.routeConfig.path||""}')`}}class ci{constructor(Pe,Ce,it){this.routerEvent=Pe,this.position=Ce,this.anchor=it}toString(){return`Scroll(anchor: '${this.anchor}', position: '${this.position?`${this.position[0]}, ${this.position[1]}`:null}')`}}const Ir="primary";class wr{constructor(Pe){this.params=Pe||{}}has(Pe){return Object.prototype.hasOwnProperty.call(this.params,Pe)}get(Pe){if(this.has(Pe)){const Ce=this.params[Pe];return Array.isArray(Ce)?Ce[0]:Ce}return null}getAll(Pe){if(this.has(Pe)){const Ce=this.params[Pe];return Array.isArray(Ce)?Ce:[Ce]}return[]}get keys(){return Object.keys(this.params)}}function Qr(Be){return new wr(Be)}const Kr="ngNavigationCancelingError";function In(Be){const Pe=Error("NavigationCancelingError: "+Be);return Pe[Kr]=!0,Pe}function Zr(Be,Pe,Ce){const it=Ce.path.split("/");if(it.length>Be.length||"full"===Ce.pathMatch&&(Pe.hasChildren()||it.length<Be.length))return null;const yt={};for(let qt=0;qt<it.length;qt++){const Un=it[qt],qn=Be[qt];if(Un.startsWith(":"))yt[Un.substring(1)]=qn;else if(Un!==qn.path)return null}return{consumed:Be.slice(0,it.length),posParams:yt}}function di(Be,Pe){const Ce=Be?Object.keys(Be):void 0,it=Pe?Object.keys(Pe):void 0;if(!Ce||!it||Ce.length!=it.length)return!1;let yt;for(let qt=0;qt<Ce.length;qt++)if(yt=Ce[qt],!$i(Be[yt],Pe[yt]))return!1;return!0}function $i(Be,Pe){if(Array.isArray(Be)&&Array.isArray(Pe)){if(Be.length!==Pe.length)return!1;const Ce=[...Be].sort(),it=[...Pe].sort();return Ce.every((yt,qt)=>it[qt]===yt)}return Be===Pe}function Hi(Be){return Array.prototype.concat.apply([],Be)}function Br(Be){return Be.length>0?Be[Be.length-1]:null}function Wt(Be,Pe){for(const Ce in Be)Be.hasOwnProperty(Ce)&&Pe(Be[Ce],Ce)}function Jn(Be){return(0,u.CqO)(Be)?Be:(0,u.QGY)(Be)?(0,f.D)(Promise.resolve(Be)):(0,y.of)(Be)}const Lr={exact:function Ai(Be,Pe,Ce){if(!si(Be.segments,Pe.segments)||!En(Be.segments,Pe.segments,Ce)||Be.numberOfChildren!==Pe.numberOfChildren)return!1;for(const it in Pe.children)if(!Be.children[it]||!Ai(Be.children[it],Pe.children[it],Ce))return!1;return!0},subset:Nr},Vn={exact:function(Be,Pe){return di(Be,Pe)},subset:function(Be,Pe){return Object.keys(Pe).length<=Object.keys(Be).length&&Object.keys(Pe).every(Ce=>$i(Be[Ce],Pe[Ce]))},ignored:()=>!0};function zr(Be,Pe,Ce){return Lr[Ce.paths](Be.root,Pe.root,Ce.matrixParams)&&Vn[Ce.queryParams](Be.queryParams,Pe.queryParams)&&!("exact"===Ce.fragment&&Be.fragment!==Pe.fragment)}function Nr(Be,Pe,Ce){return gn(Be,Pe,Pe.segments,Ce)}function gn(Be,Pe,Ce,it){if(Be.segments.length>Ce.length){const yt=Be.segments.slice(0,Ce.length);return!(!si(yt,Ce)||Pe.hasChildren()||!En(yt,Ce,it))}if(Be.segments.length===Ce.length){if(!si(Be.segments,Ce)||!En(Be.segments,Ce,it))return!1;for(const yt in Pe.children)if(!Be.children[yt]||!Nr(Be.children[yt],Pe.children[yt],it))return!1;return!0}{const yt=Ce.slice(0,Be.segments.length),qt=Ce.slice(Be.segments.length);return!!(si(Be.segments,yt)&&En(Be.segments,yt,it)&&Be.children[Ir])&&gn(Be.children[Ir],Pe,qt,it)}}function En(Be,Pe,Ce){return Pe.every((it,yt)=>Vn[Ce](Be[yt].parameters,it.parameters))}class mr{constructor(Pe,Ce,it){this.root=Pe,this.queryParams=Ce,this.fragment=it}get queryParamMap(){return this._queryParamMap||(this._queryParamMap=Qr(this.queryParams)),this._queryParamMap}toString(){return Ze.serialize(this)}}class Xt{constructor(Pe,Ce){this.segments=Pe,this.children=Ce,this.parent=null,Wt(Ce,(it,yt)=>it.parent=this)}hasChildren(){return this.numberOfChildren>0}get numberOfChildren(){return Object.keys(this.children).length}toString(){return Dr(this)}}class zn{constructor(Pe,Ce){this.path=Pe,this.parameters=Ce}get parameterMap(){return this._parameterMap||(this._parameterMap=Qr(this.parameters)),this._parameterMap}toString(){return Gi(this)}}function si(Be,Pe){return Be.length===Pe.length&&Be.every((Ce,it)=>Ce.path===Pe[it].path)}class no{}class so{parse(Pe){const Ce=new ai(Pe);return new mr(Ce.parseRootSegment(),Ce.parseQueryParams(),Ce.parseFragment())}serialize(Pe){var Be;return`${`/${jt(Pe.root,!0)}`}${function(Be){const Pe=Object.keys(Be).map(Ce=>{const it=Be[Ce];return Array.isArray(it)?it.map(yt=>`${mn(Ce)}=${mn(yt)}`).join("&"):`${mn(Ce)}=${mn(it)}`}).filter(Ce=>!!Ce);return Pe.length?`?${Pe.join("&")}`:""}(Pe.queryParams)}${"string"==typeof Pe.fragment?`#${Be=Pe.fragment,encodeURI(Be)}`:""}`}}const Ze=new so;function Dr(Be){return Be.segments.map(Pe=>Gi(Pe)).join("/")}function jt(Be,Pe){if(!Be.hasChildren())return Dr(Be);if(Pe){const Ce=Be.children[Ir]?jt(Be.children[Ir],!1):"",it=[];return Wt(Be.children,(yt,qt)=>{qt!==Ir&&it.push(`${qt}:${jt(yt,!1)}`)}),it.length>0?`${Ce}(${it.join("//")})`:Ce}{const Ce=function(Be,Pe){let Ce=[];return Wt(Be.children,(it,yt)=>{yt===Ir&&(Ce=Ce.concat(Pe(it,yt)))}),Wt(Be.children,(it,yt)=>{yt!==Ir&&(Ce=Ce.concat(Pe(it,yt)))}),Ce}(Be,(it,yt)=>yt===Ir?[jt(Be.children[Ir],!1)]:[`${yt}:${jt(it,!1)}`]);return 1===Object.keys(Be.children).length&&null!=Be.children[Ir]?`${Dr(Be)}/${Ce[0]}`:`${Dr(Be)}/(${Ce.join("//")})`}}function xt(Be){return encodeURIComponent(Be).replace(/%40/g,"@").replace(/%3A/gi,":").replace(/%24/g,"$").replace(/%2C/gi,",")}function mn(Be){return xt(Be).replace(/%3B/gi,";")}function kn(Be){return xt(Be).replace(/\(/g,"%28").replace(/\)/g,"%29").replace(/%26/gi,"&")}function wn(Be){return decodeURIComponent(Be)}function nr(Be){return wn(Be.replace(/\+/g,"%20"))}function Gi(Be){return`${kn(Be.path)}${function(Be){return Object.keys(Be).map(Pe=>`;${kn(Pe)}=${kn(Be[Pe])}`).join("")}(Be.parameters)}`}const Mo=/^[^\/()?;=#]+/;function Vi(Be){const Pe=Be.match(Mo);return Pe?Pe[0]:""}const cs=/^[^=?&#]+/,So=/^[^?&#]+/;class ai{constructor(Pe){this.url=Pe,this.remaining=Pe}parseRootSegment(){return this.consumeOptional("/"),""===this.remaining||this.peekStartsWith("?")||this.peekStartsWith("#")?new Xt([],{}):new Xt([],this.parseChildren())}parseQueryParams(){const Pe={};if(this.consumeOptional("?"))do{this.parseQueryParam(Pe)}while(this.consumeOptional("&"));return Pe}parseFragment(){return this.consumeOptional("#")?decodeURIComponent(this.remaining):null}parseChildren(){if(""===this.remaining)return{};this.consumeOptional("/");const Pe=[];for(this.peekStartsWith("(")||Pe.push(this.parseSegment());this.peekStartsWith("/")&&!this.peekStartsWith("//")&&!this.peekStartsWith("/(");)this.capture("/"),Pe.push(this.parseSegment());let Ce={};this.peekStartsWith("/(")&&(this.capture("/"),Ce=this.parseParens(!0));let it={};return this.peekStartsWith("(")&&(it=this.parseParens(!1)),(Pe.length>0||Object.keys(Ce).length>0)&&(it[Ir]=new Xt(Pe,Ce)),it}parseSegment(){const Pe=Vi(this.remaining);if(""===Pe&&this.peekStartsWith(";"))throw new Error(`Empty path url segment cannot have parameters: '${this.remaining}'.`);return this.capture(Pe),new zn(wn(Pe),this.parseMatrixParams())}parseMatrixParams(){const Pe={};for(;this.consumeOptional(";");)this.parseParam(Pe);return Pe}parseParam(Pe){const Ce=Vi(this.remaining);if(!Ce)return;this.capture(Ce);let it="";if(this.consumeOptional("=")){const yt=Vi(this.remaining);yt&&(it=yt,this.capture(it))}Pe[wn(Ce)]=wn(it)}parseQueryParam(Pe){const Ce=function(Be){const Pe=Be.match(cs);return Pe?Pe[0]:""}(this.remaining);if(!Ce)return;this.capture(Ce);let it="";if(this.consumeOptional("=")){const Un=function(Be){const Pe=Be.match(So);return Pe?Pe[0]:""}(this.remaining);Un&&(it=Un,this.capture(it))}const yt=nr(Ce),qt=nr(it);if(Pe.hasOwnProperty(yt)){let Un=Pe[yt];Array.isArray(Un)||(Un=[Un],Pe[yt]=Un),Un.push(qt)}else Pe[yt]=qt}parseParens(Pe){const Ce={};for(this.capture("(");!this.consumeOptional(")")&&this.remaining.length>0;){const it=Vi(this.remaining),yt=this.remaining[it.length];if("/"!==yt&&")"!==yt&&";"!==yt)throw new Error(`Cannot parse url '${this.url}'`);let qt;it.indexOf(":")>-1?(qt=it.substr(0,it.indexOf(":")),this.capture(qt),this.capture(":")):Pe&&(qt=Ir);const Un=this.parseChildren();Ce[qt]=1===Object.keys(Un).length?Un[Ir]:new Xt([],Un),this.consumeOptional("//")}return Ce}peekStartsWith(Pe){return this.remaining.startsWith(Pe)}consumeOptional(Pe){return!!this.peekStartsWith(Pe)&&(this.remaining=this.remaining.substring(Pe.length),!0)}capture(Pe){if(!this.consumeOptional(Pe))throw new Error(`Expected "${Pe}".`)}}class Zn{constructor(Pe){this._root=Pe}get root(){return this._root.value}parent(Pe){const Ce=this.pathFromRoot(Pe);return Ce.length>1?Ce[Ce.length-2]:null}children(Pe){const Ce=cr(Pe,this._root);return Ce?Ce.children.map(it=>it.value):[]}firstChild(Pe){const Ce=cr(Pe,this._root);return Ce&&Ce.children.length>0?Ce.children[0].value:null}siblings(Pe){const Ce=yr(Pe,this._root);return Ce.length<2?[]:Ce[Ce.length-2].children.map(yt=>yt.value).filter(yt=>yt!==Pe)}pathFromRoot(Pe){return yr(Pe,this._root).map(Ce=>Ce.value)}}function cr(Be,Pe){if(Be===Pe.value)return Pe;for(const Ce of Pe.children){const it=cr(Be,Ce);if(it)return it}return null}function yr(Be,Pe){if(Be===Pe.value)return[Pe];for(const Ce of Pe.children){const it=yr(Be,Ce);if(it.length)return it.unshift(Pe),it}return[]}class rr{constructor(Pe,Ce){this.value=Pe,this.children=Ce}toString(){return`TreeNode(${this.value})`}}function ri(Be){const Pe={};return Be&&Be.children.forEach(Ce=>Pe[Ce.value.outlet]=Ce),Pe}class ho extends Zn{constructor(Pe,Ce){super(Pe),this.snapshot=Ce,cn(this,Pe)}toString(){return this.snapshot.toString()}}function Ti(Be,Pe){const Ce=function(Be,Pe){const Un=new ln([],{},{},"",{},Ir,Pe,null,Be.root,-1,{});return new Ht("",new rr(Un,[]))}(Be,Pe),it=new T.X([new zn("",{})]),yt=new T.X({}),qt=new T.X({}),Un=new T.X({}),qn=new T.X(""),yi=new xo(it,yt,Un,qn,qt,Ir,Pe,Ce.root);return yi.snapshot=Ce.root,new ho(new rr(yi,[]),Ce)}class xo{constructor(Pe,Ce,it,yt,qt,Un,qn,yi){this.url=Pe,this.params=Ce,this.queryParams=it,this.fragment=yt,this.data=qt,this.outlet=Un,this.component=qn,this._futureSnapshot=yi}get routeConfig(){return this._futureSnapshot.routeConfig}get root(){return this._routerState.root}get parent(){return this._routerState.parent(this)}get firstChild(){return this._routerState.firstChild(this)}get children(){return this._routerState.children(this)}get pathFromRoot(){return this._routerState.pathFromRoot(this)}get paramMap(){return this._paramMap||(this._paramMap=this.params.pipe((0,Q.U)(Pe=>Qr(Pe)))),this._paramMap}get queryParamMap(){return this._queryParamMap||(this._queryParamMap=this.queryParams.pipe((0,Q.U)(Pe=>Qr(Pe)))),this._queryParamMap}toString(){return this.snapshot?this.snapshot.toString():`Future(${this._futureSnapshot})`}}function Li(Be,Pe="emptyOnly"){const Ce=Be.pathFromRoot;let it=0;if("always"!==Pe)for(it=Ce.length-1;it>=1;){const yt=Ce[it],qt=Ce[it-1];if(yt.routeConfig&&""===yt.routeConfig.path)it--;else{if(qt.component)break;it--}}return function(Be){return Be.reduce((Pe,Ce)=>({params:Object.assign(Object.assign({},Pe.params),Ce.params),data:Object.assign(Object.assign({},Pe.data),Ce.data),resolve:Object.assign(Object.assign({},Pe.resolve),Ce._resolvedData)}),{params:{},data:{},resolve:{}})}(Ce.slice(it))}class ln{constructor(Pe,Ce,it,yt,qt,Un,qn,yi,Go,ka,ss){this.url=Pe,this.params=Ce,this.queryParams=it,this.fragment=yt,this.data=qt,this.outlet=Un,this.component=qn,this.routeConfig=yi,this._urlSegment=Go,this._lastPathIndex=ka,this._resolve=ss}get root(){return this._routerState.root}get parent(){return this._routerState.parent(this)}get firstChild(){return this._routerState.firstChild(this)}get children(){return this._routerState.children(this)}get pathFromRoot(){return this._routerState.pathFromRoot(this)}get paramMap(){return this._paramMap||(this._paramMap=Qr(this.params)),this._paramMap}get queryParamMap(){return this._queryParamMap||(this._queryParamMap=Qr(this.queryParams)),this._queryParamMap}toString(){return`Route(url:'${this.url.map(it=>it.toString()).join("/")}', path:'${this.routeConfig?this.routeConfig.path:""}')`}}class Ht extends Zn{constructor(Pe,Ce){super(Ce),this.url=Pe,cn(this,Ce)}toString(){return Ct(this._root)}}function cn(Be,Pe){Pe.value._routerState=Be,Pe.children.forEach(Ce=>cn(Be,Ce))}function Ct(Be){const Pe=Be.children.length>0?` { ${Be.children.map(Ct).join(", ")} } `:"";return`${Be.value}${Pe}`}function pr(Be){if(Be.snapshot){const Pe=Be.snapshot,Ce=Be._futureSnapshot;Be.snapshot=Ce,di(Pe.queryParams,Ce.queryParams)||Be.queryParams.next(Ce.queryParams),Pe.fragment!==Ce.fragment&&Be.fragment.next(Ce.fragment),di(Pe.params,Ce.params)||Be.params.next(Ce.params),function(Be,Pe){if(Be.length!==Pe.length)return!1;for(let Ce=0;Ce<Be.length;++Ce)if(!di(Be[Ce],Pe[Ce]))return!1;return!0}(Pe.url,Ce.url)||Be.url.next(Ce.url),di(Pe.data,Ce.data)||Be.data.next(Ce.data)}else Be.snapshot=Be._futureSnapshot,Be.data.next(Be._futureSnapshot.data)}function nn(Be,Pe){return di(Be.params,Pe.params)&&function(Be,Pe){return si(Be,Pe)&&Be.every((Ce,it)=>di(Ce.parameters,Pe[it].parameters))}(Be.url,Pe.url)&&!(!Be.parent!=!Pe.parent)&&(!Be.parent||nn(Be.parent,Pe.parent))}function br(Be,Pe,Ce){if(Ce&&Be.shouldReuseRoute(Pe.value,Ce.value.snapshot)){const it=Ce.value;it._futureSnapshot=Pe.value;const yt=function(Be,Pe,Ce){return Pe.children.map(it=>{for(const yt of Ce.children)if(Be.shouldReuseRoute(it.value,yt.value.snapshot))return br(Be,it,yt);return br(Be,it)})}(Be,Pe,Ce);return new rr(it,yt)}{if(Be.shouldAttach(Pe.value)){const qt=Be.retrieve(Pe.value);if(null!==qt){const Un=qt.route;return zi(Pe,Un),Un}}const it=function(Be){return new xo(new T.X(Be.url),new T.X(Be.params),new T.X(Be.queryParams),new T.X(Be.fragment),new T.X(Be.data),Be.outlet,Be.component,Be)}(Pe.value),yt=Pe.children.map(qt=>br(Be,qt));return new rr(it,yt)}}function zi(Be,Pe){if(Be.value.routeConfig!==Pe.value.routeConfig)throw new Error("Cannot reattach ActivatedRouteSnapshot created from a different route");if(Be.children.length!==Pe.children.length)throw new Error("Cannot reattach ActivatedRouteSnapshot with a different number of children");Pe.value._futureSnapshot=Be.value;for(let Ce=0;Ce<Be.children.length;++Ce)zi(Be.children[Ce],Pe.children[Ce])}function _s(Be){return"object"==typeof Be&&null!=Be&&!Be.outlets&&!Be.segmentPath}function bs(Be){return"object"==typeof Be&&null!=Be&&Be.outlets}function qo(Be,Pe,Ce,it,yt){let qt={};return it&&Wt(it,(Un,qn)=>{qt[qn]=Array.isArray(Un)?Un.map(yi=>`${yi}`):`${Un}`}),new mr(Ce.root===Be?Pe:ra(Ce.root,Be,Pe),qt,yt)}function ra(Be,Pe,Ce){const it={};return Wt(Be.children,(yt,qt)=>{it[qt]=yt===Pe?Ce:ra(yt,Pe,Ce)}),new Xt(Be.segments,it)}class Ia{constructor(Pe,Ce,it){if(this.isAbsolute=Pe,this.numberOfDoubleDots=Ce,this.commands=it,Pe&&it.length>0&&_s(it[0]))throw new Error("Root segment cannot have matrix parameters");const yt=it.find(bs);if(yt&&yt!==Br(it))throw new Error("{outlets:{}} has to be the last command")}toRoot(){return this.isAbsolute&&1===this.commands.length&&"/"==this.commands[0]}}class Bs{constructor(Pe,Ce,it){this.segmentGroup=Pe,this.processChildren=Ce,this.index=it}}function Da(Be,Pe,Ce){if(Be||(Be=new Xt([],{})),0===Be.segments.length&&Be.hasChildren())return Ao(Be,Pe,Ce);const it=function(Be,Pe,Ce){let it=0,yt=Pe;const qt={match:!1,pathIndex:0,commandIndex:0};for(;yt<Be.segments.length;){if(it>=Ce.length)return qt;const Un=Be.segments[yt],qn=Ce[it];if(bs(qn))break;const yi=`${qn}`,Go=it<Ce.length-1?Ce[it+1]:null;if(yt>0&&void 0===yi)break;if(yi&&Go&&"object"==typeof Go&&void 0===Go.outlets){if(!Qs(yi,Go,Un))return qt;it+=2}else{if(!Qs(yi,{},Un))return qt;it++}yt++}return{match:!0,pathIndex:yt,commandIndex:it}}(Be,Pe,Ce),yt=Ce.slice(it.commandIndex);if(it.match&&it.pathIndex<Be.segments.length){const qt=new Xt(Be.segments.slice(0,it.pathIndex),{});return qt.children[Ir]=new Xt(Be.segments.slice(it.pathIndex),Be.children),Ao(qt,0,yt)}return it.match&&0===yt.length?new Xt(Be.segments,{}):it.match&&!Be.hasChildren()?gs(Be,Pe,Ce):it.match?Ao(Be,0,yt):gs(Be,Pe,Ce)}function Ao(Be,Pe,Ce){if(0===Ce.length)return new Xt(Be.segments,{});{const it=function(Be){return bs(Be[0])?Be[0].outlets:{[Ir]:Be}}(Ce),yt={};return Wt(it,(qt,Un)=>{"string"==typeof qt&&(qt=[qt]),null!==qt&&(yt[Un]=Da(Be.children[Un],Pe,qt))}),Wt(Be.children,(qt,Un)=>{void 0===it[Un]&&(yt[Un]=qt)}),new Xt(Be.segments,yt)}}function gs(Be,Pe,Ce){const it=Be.segments.slice(0,Pe);let yt=0;for(;yt<Ce.length;){const qt=Ce[yt];if(bs(qt)){const yi=Ra(qt.outlets);return new Xt(it,yi)}if(0===yt&&_s(Ce[0])){it.push(new zn(Be.segments[Pe].path,pl(Ce[0]))),yt++;continue}const Un=bs(qt)?qt.outlets[Ir]:`${qt}`,qn=yt<Ce.length-1?Ce[yt+1]:null;Un&&qn&&_s(qn)?(it.push(new zn(Un,pl(qn))),yt+=2):(it.push(new zn(Un,{})),yt++)}return new Xt(it,{})}function Ra(Be){const Pe={};return Wt(Be,(Ce,it)=>{"string"==typeof Ce&&(Ce=[Ce]),null!==Ce&&(Pe[it]=gs(new Xt([],{}),0,Ce))}),Pe}function pl(Be){const Pe={};return Wt(Be,(Ce,it)=>Pe[it]=`${Ce}`),Pe}function Qs(Be,Pe,Ce){return Be==Ce.path&&di(Pe,Ce.parameters)}class Eo{constructor(Pe,Ce,it,yt){this.routeReuseStrategy=Pe,this.futureState=Ce,this.currState=it,this.forwardEvent=yt}activate(Pe){const Ce=this.futureState._root,it=this.currState?this.currState._root:null;this.deactivateChildRoutes(Ce,it,Pe),pr(this.futureState.root),this.activateChildRoutes(Ce,it,Pe)}deactivateChildRoutes(Pe,Ce,it){const yt=ri(Ce);Pe.children.forEach(qt=>{const Un=qt.value.outlet;this.deactivateRoutes(qt,yt[Un],it),delete yt[Un]}),Wt(yt,(qt,Un)=>{this.deactivateRouteAndItsChildren(qt,it)})}deactivateRoutes(Pe,Ce,it){const yt=Pe.value,qt=Ce?Ce.value:null;if(yt===qt)if(yt.component){const Un=it.getContext(yt.outlet);Un&&this.deactivateChildRoutes(Pe,Ce,Un.children)}else this.deactivateChildRoutes(Pe,Ce,it);else qt&&this.deactivateRouteAndItsChildren(Ce,it)}deactivateRouteAndItsChildren(Pe,Ce){this.routeReuseStrategy.shouldDetach(Pe.value.snapshot)?this.detachAndStoreRouteSubtree(Pe,Ce):this.deactivateRouteAndOutlet(Pe,Ce)}detachAndStoreRouteSubtree(Pe,Ce){const it=Ce.getContext(Pe.value.outlet);if(it&&it.outlet){const yt=it.outlet.detach(),qt=it.children.onOutletDeactivated();this.routeReuseStrategy.store(Pe.value.snapshot,{componentRef:yt,route:Pe,contexts:qt})}}deactivateRouteAndOutlet(Pe,Ce){const it=Ce.getContext(Pe.value.outlet),yt=it&&Pe.value.component?it.children:Ce,qt=ri(Pe);for(const Un of Object.keys(qt))this.deactivateRouteAndItsChildren(qt[Un],yt);it&&it.outlet&&(it.outlet.deactivate(),it.children.onOutletDeactivated(),it.attachRef=null,it.resolver=null,it.route=null)}activateChildRoutes(Pe,Ce,it){const yt=ri(Ce);Pe.children.forEach(qt=>{this.activateRoutes(qt,yt[qt.value.outlet],it),this.forwardEvent(new Hr(qt.value.snapshot))}),Pe.children.length&&this.forwardEvent(new zt(Pe.value.snapshot))}activateRoutes(Pe,Ce,it){const yt=Pe.value,qt=Ce?Ce.value:null;if(pr(yt),yt===qt)if(yt.component){const Un=it.getOrCreateContext(yt.outlet);this.activateChildRoutes(Pe,Ce,Un.children)}else this.activateChildRoutes(Pe,Ce,it);else if(yt.component){const Un=it.getOrCreateContext(yt.outlet);if(this.routeReuseStrategy.shouldAttach(yt.snapshot)){const qn=this.routeReuseStrategy.retrieve(yt.snapshot);this.routeReuseStrategy.store(yt.snapshot,null),Un.children.onOutletReAttached(qn.contexts),Un.attachRef=qn.componentRef,Un.route=qn.route.value,Un.outlet&&Un.outlet.attach(qn.componentRef,qn.route.value),ks(qn.route)}else{const qn=function(Be){for(let Pe=Be.parent;Pe;Pe=Pe.parent){const Ce=Pe.routeConfig;if(Ce&&Ce._loadedConfig)return Ce._loadedConfig;if(Ce&&Ce.component)return null}return null}(yt.snapshot),yi=qn?qn.module.componentFactoryResolver:null;Un.attachRef=null,Un.route=yt,Un.resolver=yi,Un.outlet&&Un.outlet.activateWith(yt,yi),this.activateChildRoutes(Pe,null,Un.children)}}else this.activateChildRoutes(Pe,null,it)}}function ks(Be){pr(Be.value),Be.children.forEach(ks)}class Co{constructor(Pe,Ce){this.routes=Pe,this.module=Ce}}function kr(Be){return"function"==typeof Be}function tt(Be){return Be instanceof mr}const sn=Symbol("INITIAL_VALUE");function ei(){return(0,ee.w)(Be=>(0,M.aj)(Be.map(Pe=>Pe.pipe((0,ue.q)(1),(0,ae.O)(sn)))).pipe((0,$.R)((Pe,Ce)=>{let it=!1;return Ce.reduce((yt,qt,Un)=>yt!==sn?yt:(qt===sn&&(it=!0),it||!1!==qt&&Un!==Ce.length-1&&!tt(qt)?yt:qt),Pe)},sn),(0,se.h)(Pe=>Pe!==sn),(0,Q.U)(Pe=>tt(Pe)?Pe:!0===Pe),(0,ue.q)(1)))}let fi=(()=>{class Be{}return Be.\u0275fac=function(Ce){return new(Ce||Be)},Be.\u0275cmp=u.Xpm({type:Be,selectors:[["ng-component"]],decls:1,vars:0,template:function(Ce,it){1&Ce&&u._UZ(0,"router-outlet")},directives:function(){return[co]},encapsulation:2}),Be})();function Oi(Be,Pe=""){for(let Ce=0;Ce<Be.length;Ce++){const it=Be[Ce];os(it,Ro(Pe,it))}}function os(Be,Pe){Be.children&&Oi(Be.children,Pe)}function Ro(Be,Pe){return Pe?Be||Pe.path?Be&&!Pe.path?`${Be}/`:!Be&&Pe.path?Pe.path:`${Be}/${Pe.path}`:"":Be}function Uo(Be){const Pe=Be.children&&Be.children.map(Uo),Ce=Pe?Object.assign(Object.assign({},Be),{children:Pe}):Object.assign({},Be);return!Ce.component&&(Pe||Ce.loadChildren)&&Ce.outlet&&Ce.outlet!==Ir&&(Ce.component=fi),Ce}function To(Be){return Be.outlet||Ir}function Ea(Be,Pe){const Ce=Be.filter(it=>To(it)===Pe);return Ce.push(...Be.filter(it=>To(it)!==Pe)),Ce}const al={matched:!1,consumedSegments:[],lastChild:0,parameters:{},positionalParamSegments:{}};function qu(Be,Pe,Ce){var it;if(""===Pe.path)return"full"===Pe.pathMatch&&(Be.hasChildren()||Ce.length>0)?Object.assign({},al):{matched:!0,consumedSegments:[],lastChild:0,parameters:{},positionalParamSegments:{}};const qt=(Pe.matcher||Zr)(Ce,Be,Pe);if(!qt)return Object.assign({},al);const Un={};Wt(qt.posParams,(yi,Go)=>{Un[Go]=yi.path});const qn=qt.consumed.length>0?Object.assign(Object.assign({},Un),qt.consumed[qt.consumed.length-1].parameters):Un;return{matched:!0,consumedSegments:qt.consumed,lastChild:qt.consumed.length,parameters:qn,positionalParamSegments:null!==(it=qt.posParams)&&void 0!==it?it:{}}}function Ru(Be,Pe,Ce,it,yt="corrected"){if(Ce.length>0&&function(Be,Pe,Ce){return Ce.some(it=>Zl(Be,Pe,it)&&To(it)!==Ir)}(Be,Ce,it)){const Un=new Xt(Pe,function(Be,Pe,Ce,it){const yt={};yt[Ir]=it,it._sourceSegment=Be,it._segmentIndexShift=Pe.length;for(const qt of Ce)if(""===qt.path&&To(qt)!==Ir){const Un=new Xt([],{});Un._sourceSegment=Be,Un._segmentIndexShift=Pe.length,yt[To(qt)]=Un}return yt}(Be,Pe,it,new Xt(Ce,Be.children)));return Un._sourceSegment=Be,Un._segmentIndexShift=Pe.length,{segmentGroup:Un,slicedSegments:[]}}if(0===Ce.length&&function(Be,Pe,Ce){return Ce.some(it=>Zl(Be,Pe,it))}(Be,Ce,it)){const Un=new Xt(Be.segments,function(Be,Pe,Ce,it,yt,qt){const Un={};for(const qn of it)if(Zl(Be,Ce,qn)&&!yt[To(qn)]){const yi=new Xt([],{});yi._sourceSegment=Be,yi._segmentIndexShift="legacy"===qt?Be.segments.length:Pe.length,Un[To(qn)]=yi}return Object.assign(Object.assign({},yt),Un)}(Be,Pe,Ce,it,Be.children,yt));return Un._sourceSegment=Be,Un._segmentIndexShift=Pe.length,{segmentGroup:Un,slicedSegments:Ce}}const qt=new Xt(Be.segments,Be.children);return qt._sourceSegment=Be,qt._segmentIndexShift=Pe.length,{segmentGroup:qt,slicedSegments:Ce}}function Zl(Be,Pe,Ce){return(!(Be.hasChildren()||Pe.length>0)||"full"!==Ce.pathMatch)&&""===Ce.path}function $s(Be,Pe,Ce,it){return!!(To(Be)===it||it!==Ir&&Zl(Pe,Ce,Be))&&("**"===Be.path||qu(Pe,Be,Ce).matched)}function dc(Be,Pe,Ce){return 0===Pe.length&&!Be.children[Ce]}class ou{constructor(Pe){this.segmentGroup=Pe||null}}class el{constructor(Pe){this.urlTree=Pe}}function Cu(Be){return new p.y(Pe=>Pe.error(new ou(Be)))}function jl(Be){return new p.y(Pe=>Pe.error(new el(Be)))}function rt(Be){return new p.y(Pe=>Pe.error(new Error(`Only absolute redirects can have named outlets. redirectTo: '${Be}'`)))}class Te{constructor(Pe,Ce,it,yt,qt){this.configLoader=Ce,this.urlSerializer=it,this.urlTree=yt,this.config=qt,this.allowRedirects=!0,this.ngModule=Pe.get(u.h0i)}apply(){const Pe=Ru(this.urlTree.root,[],[],this.config).segmentGroup,Ce=new Xt(Pe.segments,Pe.children);return this.expandSegmentGroup(this.ngModule,this.config,Ce,Ir).pipe((0,Q.U)(qt=>this.createUrlTree(De(qt),this.urlTree.queryParams,this.urlTree.fragment))).pipe((0,ve.K)(qt=>{if(qt instanceof el)return this.allowRedirects=!1,this.match(qt.urlTree);throw qt instanceof ou?this.noMatchError(qt):qt}))}match(Pe){return this.expandSegmentGroup(this.ngModule,this.config,Pe.root,Ir).pipe((0,Q.U)(yt=>this.createUrlTree(De(yt),Pe.queryParams,Pe.fragment))).pipe((0,ve.K)(yt=>{throw yt instanceof ou?this.noMatchError(yt):yt}))}noMatchError(Pe){return new Error(`Cannot match any routes. URL Segment: '${Pe.segmentGroup}'`)}createUrlTree(Pe,Ce,it){const yt=Pe.segments.length>0?new Xt([],{[Ir]:Pe}):Pe;return new mr(yt,Ce,it)}expandSegmentGroup(Pe,Ce,it,yt){return 0===it.segments.length&&it.hasChildren()?this.expandChildren(Pe,Ce,it).pipe((0,Q.U)(qt=>new Xt([],qt))):this.expandSegment(Pe,it,Ce,it.segments,yt,!0)}expandChildren(Pe,Ce,it){const yt=[];for(const qt of Object.keys(it.children))"primary"===qt?yt.unshift(qt):yt.push(qt);return(0,f.D)(yt).pipe((0,oe.b)(qt=>{const Un=it.children[qt],qn=Ea(Ce,qt);return this.expandSegmentGroup(Pe,qn,Un,qt).pipe((0,Q.U)(yi=>({segment:yi,outlet:qt})))}),(0,$.R)((qt,Un)=>(qt[Un.outlet]=Un.segment,qt),{}),(0,he.Z)())}expandSegment(Pe,Ce,it,yt,qt,Un){return(0,f.D)(it).pipe((0,oe.b)(qn=>this.expandSegmentAgainstRoute(Pe,Ce,it,qn,yt,qt,Un).pipe((0,ve.K)(Go=>{if(Go instanceof ou)return(0,y.of)(null);throw Go}))),(0,me.P)(qn=>!!qn),(0,ve.K)((qn,yi)=>{if(qn instanceof R.K||"EmptyError"===qn.name){if(dc(Ce,yt,qt))return(0,y.of)(new Xt([],{}));throw new ou(Ce)}throw qn}))}expandSegmentAgainstRoute(Pe,Ce,it,yt,qt,Un,qn){return $s(yt,Ce,qt,Un)?void 0===yt.redirectTo?this.matchSegmentAgainstRoute(Pe,Ce,yt,qt,Un):qn&&this.allowRedirects?this.expandSegmentAgainstRouteUsingRedirect(Pe,Ce,it,yt,qt,Un):Cu(Ce):Cu(Ce)}expandSegmentAgainstRouteUsingRedirect(Pe,Ce,it,yt,qt,Un){return"**"===yt.path?this.expandWildCardWithParamsAgainstRouteUsingRedirect(Pe,it,yt,Un):this.expandRegularSegmentAgainstRouteUsingRedirect(Pe,Ce,it,yt,qt,Un)}expandWildCardWithParamsAgainstRouteUsingRedirect(Pe,Ce,it,yt){const qt=this.applyRedirectCommands([],it.redirectTo,{});return it.redirectTo.startsWith("/")?jl(qt):this.lineralizeSegments(it,qt).pipe((0,Oe.zg)(Un=>{const qn=new Xt(Un,{});return this.expandSegment(Pe,qn,Ce,Un,yt,!1)}))}expandRegularSegmentAgainstRouteUsingRedirect(Pe,Ce,it,yt,qt,Un){const{matched:qn,consumedSegments:yi,lastChild:Go,positionalParamSegments:ka}=qu(Ce,yt,qt);if(!qn)return Cu(Ce);const ss=this.applyRedirectCommands(yi,yt.redirectTo,ka);return yt.redirectTo.startsWith("/")?jl(ss):this.lineralizeSegments(yt,ss).pipe((0,Oe.zg)(Oa=>this.expandSegment(Pe,Ce,it,Oa.concat(qt.slice(Go)),Un,!1)))}matchSegmentAgainstRoute(Pe,Ce,it,yt,qt){if("**"===it.path)return it.loadChildren?(it._loadedConfig?(0,y.of)(it._loadedConfig):this.configLoader.load(Pe.injector,it)).pipe((0,Q.U)(Oa=>(it._loadedConfig=Oa,new Xt(yt,{})))):(0,y.of)(new Xt(yt,{}));const{matched:Un,consumedSegments:qn,lastChild:yi}=qu(Ce,it,yt);if(!Un)return Cu(Ce);const Go=yt.slice(yi);return this.getChildConfig(Pe,it,yt).pipe((0,Oe.zg)(ss=>{const Oa=ss.module,Us=ss.routes,{segmentGroup:fc,slicedSegments:va}=Ru(Ce,qn,Go,Us),wl=new Xt(fc.segments,fc.children);if(0===va.length&&wl.hasChildren())return this.expandChildren(Oa,Us,wl).pipe((0,Q.U)(nl=>new Xt(qn,nl)));if(0===Us.length&&0===va.length)return(0,y.of)(new Xt(qn,{}));const tl=To(it)===qt;return this.expandSegment(Oa,wl,Us,va,tl?Ir:qt,!0).pipe((0,Q.U)(Ha=>new Xt(qn.concat(Ha.segments),Ha.children)))}))}getChildConfig(Pe,Ce,it){return Ce.children?(0,y.of)(new Co(Ce.children,Pe)):Ce.loadChildren?void 0!==Ce._loadedConfig?(0,y.of)(Ce._loadedConfig):this.runCanLoadGuards(Pe.injector,Ce,it).pipe((0,Oe.zg)(yt=>{return yt?this.configLoader.load(Pe.injector,Ce).pipe((0,Q.U)(qt=>(Ce._loadedConfig=qt,qt))):(Be=Ce,new p.y(Pe=>Pe.error(In(`Cannot load children because the guard of the route "path: '${Be.path}'" returned false`))));var Be})):(0,y.of)(new Co([],Pe))}runCanLoadGuards(Pe,Ce,it){const yt=Ce.canLoad;if(!yt||0===yt.length)return(0,y.of)(!0);const qt=yt.map(Un=>{const qn=Pe.get(Un);let yi;if((Be=qn)&&kr(Be.canLoad))yi=qn.canLoad(Ce,it);else{if(!kr(qn))throw new Error("Invalid CanLoad guard");yi=qn(Ce,it)}var Be;return Jn(yi)});return(0,y.of)(qt).pipe(ei(),(0,ce.b)(Un=>{if(!tt(Un))return;const qn=In(`Redirecting to "${this.urlSerializer.serialize(Un)}"`);throw qn.url=Un,qn}),(0,Q.U)(Un=>!0===Un))}lineralizeSegments(Pe,Ce){let it=[],yt=Ce.root;for(;;){if(it=it.concat(yt.segments),0===yt.numberOfChildren)return(0,y.of)(it);if(yt.numberOfChildren>1||!yt.children[Ir])return rt(Pe.redirectTo);yt=yt.children[Ir]}}applyRedirectCommands(Pe,Ce,it){return this.applyRedirectCreatreUrlTree(Ce,this.urlSerializer.parse(Ce),Pe,it)}applyRedirectCreatreUrlTree(Pe,Ce,it,yt){const qt=this.createSegmentGroup(Pe,Ce.root,it,yt);return new mr(qt,this.createQueryParams(Ce.queryParams,this.urlTree.queryParams),Ce.fragment)}createQueryParams(Pe,Ce){const it={};return Wt(Pe,(yt,qt)=>{if("string"==typeof yt&&yt.startsWith(":")){const qn=yt.substring(1);it[qt]=Ce[qn]}else it[qt]=yt}),it}createSegmentGroup(Pe,Ce,it,yt){const qt=this.createSegments(Pe,Ce.segments,it,yt);let Un={};return Wt(Ce.children,(qn,yi)=>{Un[yi]=this.createSegmentGroup(Pe,qn,it,yt)}),new Xt(qt,Un)}createSegments(Pe,Ce,it,yt){return Ce.map(qt=>qt.path.startsWith(":")?this.findPosParam(Pe,qt,yt):this.findOrReturn(qt,it))}findPosParam(Pe,Ce,it){const yt=it[Ce.path.substring(1)];if(!yt)throw new Error(`Cannot redirect to '${Pe}'. Cannot find '${Ce.path}'.`);return yt}findOrReturn(Pe,Ce){let it=0;for(const yt of Ce){if(yt.path===Pe.path)return Ce.splice(it),yt;it++}return Pe}}function De(Be){const Pe={};for(const it of Object.keys(Be.children)){const qt=De(Be.children[it]);(qt.segments.length>0||qt.hasChildren())&&(Pe[it]=qt)}return function(Be){if(1===Be.numberOfChildren&&Be.children[Ir]){const Pe=Be.children[Ir];return new Xt(Be.segments.concat(Pe.segments),Pe.children)}return Be}(new Xt(Be.segments,Pe))}class dr{constructor(Pe){this.path=Pe,this.route=this.path[this.path.length-1]}}class Qi{constructor(Pe,Ce){this.component=Pe,this.route=Ce}}function Jo(Be,Pe,Ce){const it=Be._root;return Ma(it,Pe?Pe._root:null,Ce,[it.value])}function vs(Be,Pe,Ce){const it=function(Be){if(!Be)return null;for(let Pe=Be.parent;Pe;Pe=Pe.parent){const Ce=Pe.routeConfig;if(Ce&&Ce._loadedConfig)return Ce._loadedConfig}return null}(Pe);return(it?it.module.injector:Ce).get(Be)}function Ma(Be,Pe,Ce,it,yt={canDeactivateChecks:[],canActivateChecks:[]}){const qt=ri(Pe);return Be.children.forEach(Un=>{(function(Be,Pe,Ce,it,yt={canDeactivateChecks:[],canActivateChecks:[]}){const qt=Be.value,Un=Pe?Pe.value:null,qn=Ce?Ce.getContext(Be.value.outlet):null;if(Un&&qt.routeConfig===Un.routeConfig){const yi=function(Be,Pe,Ce){if("function"==typeof Ce)return Ce(Be,Pe);switch(Ce){case"pathParamsChange":return!si(Be.url,Pe.url);case"pathParamsOrQueryParamsChange":return!si(Be.url,Pe.url)||!di(Be.queryParams,Pe.queryParams);case"always":return!0;case"paramsOrQueryParamsChange":return!nn(Be,Pe)||!di(Be.queryParams,Pe.queryParams);case"paramsChange":default:return!nn(Be,Pe)}}(Un,qt,qt.routeConfig.runGuardsAndResolvers);yi?yt.canActivateChecks.push(new dr(it)):(qt.data=Un.data,qt._resolvedData=Un._resolvedData),Ma(Be,Pe,qt.component?qn?qn.children:null:Ce,it,yt),yi&&qn&&qn.outlet&&qn.outlet.isActivated&&yt.canDeactivateChecks.push(new Qi(qn.outlet.component,Un))}else Un&&Pl(Pe,qn,yt),yt.canActivateChecks.push(new dr(it)),Ma(Be,null,qt.component?qn?qn.children:null:Ce,it,yt)})(Un,qt[Un.value.outlet],Ce,it.concat([Un.value]),yt),delete qt[Un.value.outlet]}),Wt(qt,(Un,qn)=>Pl(Un,Ce.getContext(qn),yt)),yt}function Pl(Be,Pe,Ce){const it=ri(Be),yt=Be.value;Wt(it,(qt,Un)=>{Pl(qt,yt.component?Pe?Pe.children.getContext(Un):null:Pe,Ce)}),Ce.canDeactivateChecks.push(new Qi(yt.component&&Pe&&Pe.outlet&&Pe.outlet.isActivated?Pe.outlet.component:null,yt))}class md{}function tc(Be){return new p.y(Pe=>Pe.error(Be))}class ua{constructor(Pe,Ce,it,yt,qt,Un){this.rootComponentType=Pe,this.config=Ce,this.urlTree=it,this.url=yt,this.paramsInheritanceStrategy=qt,this.relativeLinkResolution=Un}recognize(){const Pe=Ru(this.urlTree.root,[],[],this.config.filter(Un=>void 0===Un.redirectTo),this.relativeLinkResolution).segmentGroup,Ce=this.processSegmentGroup(this.config,Pe,Ir);if(null===Ce)return null;const it=new ln([],Object.freeze({}),Object.freeze(Object.assign({},this.urlTree.queryParams)),this.urlTree.fragment,{},Ir,this.rootComponentType,null,this.urlTree.root,-1,{}),yt=new rr(it,Ce),qt=new Ht(this.url,yt);return this.inheritParamsAndData(qt._root),qt}inheritParamsAndData(Pe){const Ce=Pe.value,it=Li(Ce,this.paramsInheritanceStrategy);Ce.params=Object.freeze(it.params),Ce.data=Object.freeze(it.data),Pe.children.forEach(yt=>this.inheritParamsAndData(yt))}processSegmentGroup(Pe,Ce,it){return 0===Ce.segments.length&&Ce.hasChildren()?this.processChildren(Pe,Ce):this.processSegment(Pe,Ce,Ce.segments,it)}processChildren(Pe,Ce){const it=[];for(const qt of Object.keys(Ce.children)){const Un=Ce.children[qt],qn=Ea(Pe,qt),yi=this.processSegmentGroup(qn,Un,qt);if(null===yi)return null;it.push(...yi)}const yt=bl(it);return yt.sort((Pe,Ce)=>Pe.value.outlet===Ir?-1:Ce.value.outlet===Ir?1:Pe.value.outlet.localeCompare(Ce.value.outlet)),yt}processSegment(Pe,Ce,it,yt){for(const qt of Pe){const Un=this.processSegmentAgainstRoute(qt,Ce,it,yt);if(null!==Un)return Un}return dc(Ce,it,yt)?[]:null}processSegmentAgainstRoute(Pe,Ce,it,yt){if(Pe.redirectTo||!$s(Pe,Ce,it,yt))return null;let qt,Un=[],qn=[];if("**"===Pe.path){const Us=it.length>0?Br(it).parameters:{};qt=new ln(it,Us,Object.freeze(Object.assign({},this.urlTree.queryParams)),this.urlTree.fragment,Gs(Pe),To(Pe),Pe.component,Pe,bu(Ce),cu(Ce)+it.length,$u(Pe))}else{const Us=qu(Ce,Pe,it);if(!Us.matched)return null;Un=Us.consumedSegments,qn=it.slice(Us.lastChild),qt=new ln(Un,Us.parameters,Object.freeze(Object.assign({},this.urlTree.queryParams)),this.urlTree.fragment,Gs(Pe),To(Pe),Pe.component,Pe,bu(Ce),cu(Ce)+Un.length,$u(Pe))}const yi=(Be=Pe).children?Be.children:Be.loadChildren?Be._loadedConfig.routes:[],{segmentGroup:Go,slicedSegments:ka}=Ru(Ce,Un,qn,yi.filter(Us=>void 0===Us.redirectTo),this.relativeLinkResolution);var Be;if(0===ka.length&&Go.hasChildren()){const Us=this.processChildren(yi,Go);return null===Us?null:[new rr(qt,Us)]}if(0===yi.length&&0===ka.length)return[new rr(qt,[])];const ss=To(Pe)===yt,Oa=this.processSegment(yi,Go,ka,ss?Ir:yt);return null===Oa?null:[new rr(qt,Oa)]}}function ku(Be){const Pe=Be.value.routeConfig;return Pe&&""===Pe.path&&void 0===Pe.redirectTo}function bl(Be){const Pe=[],Ce=new Set;for(const it of Be){if(!ku(it)){Pe.push(it);continue}const yt=Pe.find(qt=>it.value.routeConfig===qt.value.routeConfig);void 0!==yt?(yt.children.push(...it.children),Ce.add(yt)):Pe.push(it)}for(const it of Ce){const yt=bl(it.children);Pe.push(new rr(it.value,yt))}return Pe.filter(it=>!Ce.has(it))}function bu(Be){let Pe=Be;for(;Pe._sourceSegment;)Pe=Pe._sourceSegment;return Pe}function cu(Be){let Pe=Be,Ce=Pe._segmentIndexShift?Pe._segmentIndexShift:0;for(;Pe._sourceSegment;)Pe=Pe._sourceSegment,Ce+=Pe._segmentIndexShift?Pe._segmentIndexShift:0;return Ce-1}function Gs(Be){return Be.data||{}}function $u(Be){return Be.resolve||{}}function _u(Be){return(0,ee.w)(Pe=>{const Ce=Be(Pe);return Ce?(0,f.D)(Ce).pipe((0,Q.U)(()=>Pe)):(0,y.of)(Pe)})}class Ja extends class{shouldDetach(Pe){return!1}store(Pe,Ce){}shouldAttach(Pe){return!1}retrieve(Pe){return null}shouldReuseRoute(Pe,Ce){return Pe.routeConfig===Ce.routeConfig}}{}const hl=new u.OlP("ROUTES");class Vl{constructor(Pe,Ce,it,yt){this.loader=Pe,this.compiler=Ce,this.onLoadStartListener=it,this.onLoadEndListener=yt}load(Pe,Ce){if(Ce._loader$)return Ce._loader$;this.onLoadStartListener&&this.onLoadStartListener(Ce);const yt=this.loadModuleFactory(Ce.loadChildren).pipe((0,Q.U)(qt=>{this.onLoadEndListener&&this.onLoadEndListener(Ce);const Un=qt.create(Pe);return new Co(Hi(Un.injector.get(hl,void 0,u.XFs.Self|u.XFs.Optional)).map(Uo),Un)}),(0,ve.K)(qt=>{throw Ce._loader$=void 0,qt}));return Ce._loader$=new Z.c(yt,()=>new J.xQ).pipe((0,ze.x)()),Ce._loader$}loadModuleFactory(Pe){return"string"==typeof Pe?(0,f.D)(this.loader.load(Pe)):Jn(Pe()).pipe((0,Oe.zg)(Ce=>Ce instanceof u.YKP?(0,y.of)(Ce):(0,f.D)(this.compiler.compileModuleAsync(Ce))))}}class Hs{constructor(){this.outlet=null,this.route=null,this.resolver=null,this.children=new V,this.attachRef=null}}class V{constructor(){this.contexts=new Map}onChildOutletCreated(Pe,Ce){const it=this.getOrCreateContext(Pe);it.outlet=Ce,this.contexts.set(Pe,it)}onChildOutletDestroyed(Pe){const Ce=this.getContext(Pe);Ce&&(Ce.outlet=null,Ce.attachRef=null)}onOutletDeactivated(){const Pe=this.contexts;return this.contexts=new Map,Pe}onOutletReAttached(Pe){this.contexts=Pe}getOrCreateContext(Pe){let Ce=this.getContext(Pe);return Ce||(Ce=new Hs,this.contexts.set(Pe,Ce)),Ce}getContext(Pe){return this.contexts.get(Pe)||null}}class ot{shouldProcessUrl(Pe){return!0}extract(Pe){return Pe}merge(Pe,Ce){return Pe}}function _t(Be){throw Be}function lt(Be,Pe,Ce){return Pe.parse("/")}function un(Be,Pe){return(0,y.of)(null)}const yn={paths:"exact",fragment:"ignored",matrixParams:"ignored",queryParams:"exact"},Or={paths:"subset",fragment:"ignored",matrixParams:"ignored",queryParams:"subset"};let Vr=(()=>{class Be{constructor(Ce,it,yt,qt,Un,qn,yi,Go){this.rootComponentType=Ce,this.urlSerializer=it,this.rootContexts=yt,this.location=qt,this.config=Go,this.lastSuccessfulNavigation=null,this.currentNavigation=null,this.disposed=!1,this.lastLocationChangeInfo=null,this.navigationId=0,this.currentPageId=0,this.isNgZoneEnabled=!1,this.events=new J.xQ,this.errorHandler=_t,this.malformedUriErrorHandler=lt,this.navigated=!1,this.lastSuccessfulId=-1,this.hooks={beforePreactivation:un,afterPreactivation:un},this.urlHandlingStrategy=new ot,this.routeReuseStrategy=new Ja,this.onSameUrlNavigation="ignore",this.paramsInheritanceStrategy="emptyOnly",this.urlUpdateStrategy="deferred",this.relativeLinkResolution="corrected",this.canceledNavigationResolution="replace",this.ngModule=Un.get(u.h0i),this.console=Un.get(u.c2e);const Oa=Un.get(u.R0b);this.isNgZoneEnabled=Oa instanceof u.R0b&&u.R0b.isInAngularZone(),this.resetConfig(Go),this.currentUrlTree=new mr(new Xt([],{}),{},null),this.rawUrlTree=this.currentUrlTree,this.browserUrlTree=this.currentUrlTree,this.configLoader=new Vl(qn,yi,Us=>this.triggerEvent(new mt(Us)),Us=>this.triggerEvent(new Yt(Us))),this.routerState=Ti(this.currentUrlTree,this.rootComponentType),this.transitions=new T.X({id:0,targetPageId:0,currentUrlTree:this.currentUrlTree,currentRawUrl:this.currentUrlTree,extractedUrl:this.urlHandlingStrategy.extract(this.currentUrlTree),urlAfterRedirects:this.urlHandlingStrategy.extract(this.currentUrlTree),rawUrl:this.currentUrlTree,extras:{},resolve:null,reject:null,promise:Promise.resolve(!0),source:"imperative",restoredState:null,currentSnapshot:this.routerState.snapshot,targetSnapshot:null,currentRouterState:this.routerState,targetRouterState:null,guards:{canActivateChecks:[],canDeactivateChecks:[]},guardsResult:null}),this.navigations=this.setupNavigations(this.transitions),this.processNavigations()}get browserPageId(){var Ce;return null===(Ce=this.location.getState())||void 0===Ce?void 0:Ce.\u0275routerPageId}setupNavigations(Ce){const it=this.events;return Ce.pipe((0,se.h)(yt=>0!==yt.id),(0,Q.U)(yt=>Object.assign(Object.assign({},yt),{extractedUrl:this.urlHandlingStrategy.extract(yt.rawUrl)})),(0,ee.w)(yt=>{let qt=!1,Un=!1;return(0,y.of)(yt).pipe((0,ce.b)(qn=>{this.currentNavigation={id:qn.id,initialUrl:qn.currentRawUrl,extractedUrl:qn.extractedUrl,trigger:qn.source,extras:qn.extras,previousNavigation:this.lastSuccessfulNavigation?Object.assign(Object.assign({},this.lastSuccessfulNavigation),{previousNavigation:null}):null}}),(0,ee.w)(qn=>{const yi=this.browserUrlTree.toString(),Go=!this.navigated||qn.extractedUrl.toString()!==yi||yi!==this.currentUrlTree.toString();if(("reload"===this.onSameUrlNavigation||Go)&&this.urlHandlingStrategy.shouldProcessUrl(qn.rawUrl))return oi(qn.source)&&(this.browserUrlTree=qn.extractedUrl),(0,y.of)(qn).pipe((0,ee.w)(ss=>{const Oa=this.transitions.getValue();return it.next(new Ve(ss.id,this.serializeUrl(ss.extractedUrl),ss.source,ss.restoredState)),Oa!==this.transitions.getValue()?e.E:Promise.resolve(ss)}),function(Be,Pe,Ce,it){return(0,ee.w)(yt=>function(Be,Pe,Ce,it,yt){return new Te(Be,Pe,Ce,it,yt).apply()}(Be,Pe,Ce,yt.extractedUrl,it).pipe((0,Q.U)(qt=>Object.assign(Object.assign({},yt),{urlAfterRedirects:qt}))))}(this.ngModule.injector,this.configLoader,this.urlSerializer,this.config),(0,ce.b)(ss=>{this.currentNavigation=Object.assign(Object.assign({},this.currentNavigation),{finalUrl:ss.urlAfterRedirects})}),function(Be,Pe,Ce,it,yt){return(0,Oe.zg)(qt=>function(Be,Pe,Ce,it,yt="emptyOnly",qt="legacy"){try{const Un=new ua(Be,Pe,Ce,it,yt,qt).recognize();return null===Un?tc(new md):(0,y.of)(Un)}catch(Un){return tc(Un)}}(Be,Pe,qt.urlAfterRedirects,Ce(qt.urlAfterRedirects),it,yt).pipe((0,Q.U)(Un=>Object.assign(Object.assign({},qt),{targetSnapshot:Un}))))}(this.rootComponentType,this.config,ss=>this.serializeUrl(ss),this.paramsInheritanceStrategy,this.relativeLinkResolution),(0,ce.b)(ss=>{"eager"===this.urlUpdateStrategy&&(ss.extras.skipLocationChange||this.setBrowserUrl(ss.urlAfterRedirects,ss),this.browserUrlTree=ss.urlAfterRedirects);const Oa=new en(ss.id,this.serializeUrl(ss.extractedUrl),this.serializeUrl(ss.urlAfterRedirects),ss.targetSnapshot);it.next(Oa)}));if(Go&&this.rawUrlTree&&this.urlHandlingStrategy.shouldProcessUrl(this.rawUrlTree)){const{id:Oa,extractedUrl:Us,source:fc,restoredState:va,extras:wl}=qn,tl=new Ve(Oa,this.serializeUrl(Us),fc,va);it.next(tl);const $a=Ti(Us,this.rootComponentType).snapshot;return(0,y.of)(Object.assign(Object.assign({},qn),{targetSnapshot:$a,urlAfterRedirects:Us,extras:Object.assign(Object.assign({},wl),{skipLocationChange:!1,replaceUrl:!1})}))}return this.rawUrlTree=qn.rawUrl,this.browserUrlTree=qn.urlAfterRedirects,qn.resolve(null),e.E}),_u(qn=>{const{targetSnapshot:yi,id:Go,extractedUrl:ka,rawUrl:ss,extras:{skipLocationChange:Oa,replaceUrl:Us}}=qn;return this.hooks.beforePreactivation(yi,{navigationId:Go,appliedUrlTree:ka,rawUrlTree:ss,skipLocationChange:!!Oa,replaceUrl:!!Us})}),(0,ce.b)(qn=>{const yi=new $t(qn.id,this.serializeUrl(qn.extractedUrl),this.serializeUrl(qn.urlAfterRedirects),qn.targetSnapshot);this.triggerEvent(yi)}),(0,Q.U)(qn=>Object.assign(Object.assign({},qn),{guards:Jo(qn.targetSnapshot,qn.currentSnapshot,this.rootContexts)})),function(Be,Pe){return(0,Oe.zg)(Ce=>{const{targetSnapshot:it,currentSnapshot:yt,guards:{canActivateChecks:qt,canDeactivateChecks:Un}}=Ce;return 0===Un.length&&0===qt.length?(0,y.of)(Object.assign(Object.assign({},Ce),{guardsResult:!0})):function(Be,Pe,Ce,it){return(0,f.D)(Be).pipe((0,Oe.zg)(yt=>function(Be,Pe,Ce,it,yt){const qt=Pe&&Pe.routeConfig?Pe.routeConfig.canDeactivate:null;if(!qt||0===qt.length)return(0,y.of)(!0);const Un=qt.map(qn=>{const yi=vs(qn,Pe,yt);let Go;if(function(Be){return Be&&kr(Be.canDeactivate)}(yi))Go=Jn(yi.canDeactivate(Be,Pe,Ce,it));else{if(!kr(yi))throw new Error("Invalid CanDeactivate guard");Go=Jn(yi(Be,Pe,Ce,it))}return Go.pipe((0,me.P)())});return(0,y.of)(Un).pipe(ei())}(yt.component,yt.route,Ce,Pe,it)),(0,me.P)(yt=>!0!==yt,!0))}(Un,it,yt,Be).pipe((0,Oe.zg)(qn=>qn&&function(Be){return"boolean"==typeof Be}(qn)?function(Be,Pe,Ce,it){return(0,f.D)(Pe).pipe((0,oe.b)(yt=>(0,F.z)(function(Be,Pe){return null!==Be&&Pe&&Pe(new Dt(Be)),(0,y.of)(!0)}(yt.route.parent,it),function(Be,Pe){return null!==Be&&Pe&&Pe(new Yn(Be)),(0,y.of)(!0)}(yt.route,it),function(Be,Pe,Ce){const it=Pe[Pe.length-1],qt=Pe.slice(0,Pe.length-1).reverse().map(Un=>function(Be){const Pe=Be.routeConfig?Be.routeConfig.canActivateChild:null;return Pe&&0!==Pe.length?{node:Be,guards:Pe}:null}(Un)).filter(Un=>null!==Un).map(Un=>_(()=>{const qn=Un.guards.map(yi=>{const Go=vs(yi,Un.node,Ce);let ka;if(function(Be){return Be&&kr(Be.canActivateChild)}(Go))ka=Jn(Go.canActivateChild(it,Be));else{if(!kr(Go))throw new Error("Invalid CanActivateChild guard");ka=Jn(Go(it,Be))}return ka.pipe((0,me.P)())});return(0,y.of)(qn).pipe(ei())}));return(0,y.of)(qt).pipe(ei())}(Be,yt.path,Ce),function(Be,Pe,Ce){const it=Pe.routeConfig?Pe.routeConfig.canActivate:null;if(!it||0===it.length)return(0,y.of)(!0);const yt=it.map(qt=>_(()=>{const Un=vs(qt,Pe,Ce);let qn;if(function(Be){return Be&&kr(Be.canActivate)}(Un))qn=Jn(Un.canActivate(Pe,Be));else{if(!kr(Un))throw new Error("Invalid CanActivate guard");qn=Jn(Un(Pe,Be))}return qn.pipe((0,me.P)())}));return(0,y.of)(yt).pipe(ei())}(Be,yt.route,Ce))),(0,me.P)(yt=>!0!==yt,!0))}(it,qt,Be,Pe):(0,y.of)(qn)),(0,Q.U)(qn=>Object.assign(Object.assign({},Ce),{guardsResult:qn})))})}(this.ngModule.injector,qn=>this.triggerEvent(qn)),(0,ce.b)(qn=>{if(tt(qn.guardsResult)){const Go=In(`Redirecting to "${this.serializeUrl(qn.guardsResult)}"`);throw Go.url=qn.guardsResult,Go}const yi=new Gt(qn.id,this.serializeUrl(qn.extractedUrl),this.serializeUrl(qn.urlAfterRedirects),qn.targetSnapshot,!!qn.guardsResult);this.triggerEvent(yi)}),(0,se.h)(qn=>!!qn.guardsResult||(this.restoreHistory(qn),this.cancelNavigationTransition(qn,""),!1)),_u(qn=>{if(qn.guards.canActivateChecks.length)return(0,y.of)(qn).pipe((0,ce.b)(yi=>{const Go=new Ut(yi.id,this.serializeUrl(yi.extractedUrl),this.serializeUrl(yi.urlAfterRedirects),yi.targetSnapshot);this.triggerEvent(Go)}),(0,ee.w)(yi=>{let Go=!1;return(0,y.of)(yi).pipe(function(Be,Pe){return(0,Oe.zg)(Ce=>{const{targetSnapshot:it,guards:{canActivateChecks:yt}}=Ce;if(!yt.length)return(0,y.of)(Ce);let qt=0;return(0,f.D)(yt).pipe((0,oe.b)(Un=>function(Be,Pe,Ce,it){return function(Be,Pe,Ce,it){const yt=Object.keys(Be);if(0===yt.length)return(0,y.of)({});const qt={};return(0,f.D)(yt).pipe((0,Oe.zg)(Un=>function(Be,Pe,Ce,it){const yt=vs(Be,Pe,it);return Jn(yt.resolve?yt.resolve(Pe,Ce):yt(Pe,Ce))}(Be[Un],Pe,Ce,it).pipe((0,ce.b)(qn=>{qt[Un]=qn}))),(0,dt.h)(1),(0,Oe.zg)(()=>Object.keys(qt).length===yt.length?(0,y.of)(qt):e.E))}(Be._resolve,Be,Pe,it).pipe((0,Q.U)(qt=>(Be._resolvedData=qt,Be.data=Object.assign(Object.assign({},Be.data),Li(Be,Ce).resolve),null)))}(Un.route,it,Be,Pe)),(0,ce.b)(()=>qt++),(0,dt.h)(1),(0,Oe.zg)(Un=>qt===yt.length?(0,y.of)(Ce):e.E))})}(this.paramsInheritanceStrategy,this.ngModule.injector),(0,ce.b)({next:()=>Go=!0,complete:()=>{Go||(this.restoreHistory(yi),this.cancelNavigationTransition(yi,"At least one route resolver didn't emit any value."))}}))}),(0,ce.b)(yi=>{const Go=new Bt(yi.id,this.serializeUrl(yi.extractedUrl),this.serializeUrl(yi.urlAfterRedirects),yi.targetSnapshot);this.triggerEvent(Go)}))}),_u(qn=>{const{targetSnapshot:yi,id:Go,extractedUrl:ka,rawUrl:ss,extras:{skipLocationChange:Oa,replaceUrl:Us}}=qn;return this.hooks.afterPreactivation(yi,{navigationId:Go,appliedUrlTree:ka,rawUrlTree:ss,skipLocationChange:!!Oa,replaceUrl:!!Us})}),(0,Q.U)(qn=>{const yi=function(Be,Pe,Ce){const it=br(Be,Pe._root,Ce?Ce._root:void 0);return new ho(it,Pe)}(this.routeReuseStrategy,qn.targetSnapshot,qn.currentRouterState);return Object.assign(Object.assign({},qn),{targetRouterState:yi})}),(0,ce.b)(qn=>{this.currentUrlTree=qn.urlAfterRedirects,this.rawUrlTree=this.urlHandlingStrategy.merge(qn.urlAfterRedirects,qn.rawUrl),this.routerState=qn.targetRouterState,"deferred"===this.urlUpdateStrategy&&(qn.extras.skipLocationChange||this.setBrowserUrl(this.rawUrlTree,qn),this.browserUrlTree=qn.urlAfterRedirects)}),((Be,Pe,Ce)=>(0,Q.U)(it=>(new Eo(Pe,it.targetRouterState,it.currentRouterState,Ce).activate(Be),it)))(this.rootContexts,this.routeReuseStrategy,qn=>this.triggerEvent(qn)),(0,ce.b)({next(){qt=!0},complete(){qt=!0}}),(0,Ye.x)(()=>{var qn;if(!qt&&!Un){const yi=`Navigation ID ${yt.id} is not equal to the current navigation id ${this.navigationId}`;"replace"===this.canceledNavigationResolution?(this.restoreHistory(yt),this.cancelNavigationTransition(yt,yi)):this.cancelNavigationTransition(yt,yi)}(null===(qn=this.currentNavigation)||void 0===qn?void 0:qn.id)===yt.id&&(this.currentNavigation=null)}),(0,ve.K)(qn=>{if(Un=!0,function(Be){return Be&&Be[Kr]}(qn)){const yi=tt(qn.url);yi||(this.navigated=!0,this.restoreHistory(yt,!0));const Go=new Zt(yt.id,this.serializeUrl(yt.extractedUrl),qn.message);it.next(Go),yi?setTimeout(()=>{const ka=this.urlHandlingStrategy.merge(qn.url,this.rawUrlTree),ss={skipLocationChange:yt.extras.skipLocationChange,replaceUrl:"eager"===this.urlUpdateStrategy||oi(yt.source)};this.scheduleNavigation(ka,"imperative",null,ss,{resolve:yt.resolve,reject:yt.reject,promise:yt.promise})},0):yt.resolve(!1)}else{this.restoreHistory(yt,!0);const yi=new st(yt.id,this.serializeUrl(yt.extractedUrl),qn);it.next(yi);try{yt.resolve(this.errorHandler(qn))}catch(Go){yt.reject(Go)}}return e.E}))}))}resetRootComponentType(Ce){this.rootComponentType=Ce,this.routerState.root.component=this.rootComponentType}getTransition(){const Ce=this.transitions.value;return Ce.urlAfterRedirects=this.browserUrlTree,Ce}setTransition(Ce){this.transitions.next(Object.assign(Object.assign({},this.getTransition()),Ce))}initialNavigation(){this.setUpLocationChangeListener(),0===this.navigationId&&this.navigateByUrl(this.location.path(!0),{replaceUrl:!0})}setUpLocationChangeListener(){this.locationSubscription||(this.locationSubscription=this.location.subscribe(Ce=>{const it=this.extractLocationChangeInfoFromEvent(Ce);this.shouldScheduleNavigation(this.lastLocationChangeInfo,it)&&setTimeout(()=>{const{source:yt,state:qt,urlTree:Un}=it,qn={replaceUrl:!0};if(qt){const yi=Object.assign({},qt);delete yi.navigationId,delete yi.\u0275routerPageId,0!==Object.keys(yi).length&&(qn.state=yi)}this.scheduleNavigation(Un,yt,qt,qn)},0),this.lastLocationChangeInfo=it}))}extractLocationChangeInfoFromEvent(Ce){var it;return{source:"popstate"===Ce.type?"popstate":"hashchange",urlTree:this.parseUrl(Ce.url),state:(null===(it=Ce.state)||void 0===it?void 0:it.navigationId)?Ce.state:null,transitionId:this.getTransition().id}}shouldScheduleNavigation(Ce,it){if(!Ce)return!0;const yt=it.urlTree.toString()===Ce.urlTree.toString();return it.transitionId!==Ce.transitionId||!yt||!("hashchange"===it.source&&"popstate"===Ce.source||"popstate"===it.source&&"hashchange"===Ce.source)}get url(){return this.serializeUrl(this.currentUrlTree)}getCurrentNavigation(){return this.currentNavigation}triggerEvent(Ce){this.events.next(Ce)}resetConfig(Ce){Oi(Ce),this.config=Ce.map(Uo),this.navigated=!1,this.lastSuccessfulId=-1}ngOnDestroy(){this.dispose()}dispose(){this.transitions.complete(),this.locationSubscription&&(this.locationSubscription.unsubscribe(),this.locationSubscription=void 0),this.disposed=!0}createUrlTree(Ce,it={}){const{relativeTo:yt,queryParams:qt,fragment:Un,queryParamsHandling:qn,preserveFragment:yi}=it,Go=yt||this.routerState.root,ka=yi?this.currentUrlTree.fragment:Un;let ss=null;switch(qn){case"merge":ss=Object.assign(Object.assign({},this.currentUrlTree.queryParams),qt);break;case"preserve":ss=this.currentUrlTree.queryParams;break;default:ss=qt||null}return null!==ss&&(ss=this.removeEmptyProps(ss)),function(Be,Pe,Ce,it,yt){if(0===Ce.length)return qo(Pe.root,Pe.root,Pe,it,yt);const qt=function(Be){if("string"==typeof Be[0]&&1===Be.length&&"/"===Be[0])return new Ia(!0,0,Be);let Pe=0,Ce=!1;const it=Be.reduce((yt,qt,Un)=>{if("object"==typeof qt&&null!=qt){if(qt.outlets){const qn={};return Wt(qt.outlets,(yi,Go)=>{qn[Go]="string"==typeof yi?yi.split("/"):yi}),[...yt,{outlets:qn}]}if(qt.segmentPath)return[...yt,qt.segmentPath]}return"string"!=typeof qt?[...yt,qt]:0===Un?(qt.split("/").forEach((qn,yi)=>{0==yi&&"."===qn||(0==yi&&""===qn?Ce=!0:".."===qn?Pe++:""!=qn&&yt.push(qn))}),yt):[...yt,qt]},[]);return new Ia(Ce,Pe,it)}(Ce);if(qt.toRoot())return qo(Pe.root,new Xt([],{}),Pe,it,yt);const Un=function(Be,Pe,Ce){if(Be.isAbsolute)return new Bs(Pe.root,!0,0);if(-1===Ce.snapshot._lastPathIndex){const qt=Ce.snapshot._urlSegment;return new Bs(qt,qt===Pe.root,0)}const it=_s(Be.commands[0])?0:1;return function(Be,Pe,Ce){let it=Be,yt=Pe,qt=Ce;for(;qt>yt;){if(qt-=yt,it=it.parent,!it)throw new Error("Invalid number of '../'");yt=it.segments.length}return new Bs(it,!1,yt-qt)}(Ce.snapshot._urlSegment,Ce.snapshot._lastPathIndex+it,Be.numberOfDoubleDots)}(qt,Pe,Be),qn=Un.processChildren?Ao(Un.segmentGroup,Un.index,qt.commands):Da(Un.segmentGroup,Un.index,qt.commands);return qo(Un.segmentGroup,qn,Pe,it,yt)}(Go,this.currentUrlTree,Ce,ss,null!=ka?ka:null)}navigateByUrl(Ce,it={skipLocationChange:!1}){const yt=tt(Ce)?Ce:this.parseUrl(Ce),qt=this.urlHandlingStrategy.merge(yt,this.rawUrlTree);return this.scheduleNavigation(qt,"imperative",null,it)}navigate(Ce,it={skipLocationChange:!1}){return function(Be){for(let Pe=0;Pe<Be.length;Pe++){const Ce=Be[Pe];if(null==Ce)throw new Error(`The requested path contains ${Ce} segment at index ${Pe}`)}}(Ce),this.navigateByUrl(this.createUrlTree(Ce,it),it)}serializeUrl(Ce){return this.urlSerializer.serialize(Ce)}parseUrl(Ce){let it;try{it=this.urlSerializer.parse(Ce)}catch(yt){it=this.malformedUriErrorHandler(yt,this.urlSerializer,Ce)}return it}isActive(Ce,it){let yt;if(yt=!0===it?Object.assign({},yn):!1===it?Object.assign({},Or):it,tt(Ce))return zr(this.currentUrlTree,Ce,yt);const qt=this.parseUrl(Ce);return zr(this.currentUrlTree,qt,yt)}removeEmptyProps(Ce){return Object.keys(Ce).reduce((it,yt)=>{const qt=Ce[yt];return null!=qt&&(it[yt]=qt),it},{})}processNavigations(){this.navigations.subscribe(Ce=>{this.navigated=!0,this.lastSuccessfulId=Ce.id,this.currentPageId=Ce.targetPageId,this.events.next(new He(Ce.id,this.serializeUrl(Ce.extractedUrl),this.serializeUrl(this.currentUrlTree))),this.lastSuccessfulNavigation=this.currentNavigation,Ce.resolve(!0)},Ce=>{this.console.warn(`Unhandled Navigation Error: ${Ce}`)})}scheduleNavigation(Ce,it,yt,qt,Un){var qn,yi;if(this.disposed)return Promise.resolve(!1);const Go=this.getTransition(),ka=oi(it)&&Go&&!oi(Go.source),Us=(this.lastSuccessfulId===Go.id||this.currentNavigation?Go.rawUrl:Go.urlAfterRedirects).toString()===Ce.toString();if(ka&&Us)return Promise.resolve(!0);let fc,va,wl;Un?(fc=Un.resolve,va=Un.reject,wl=Un.promise):wl=new Promise((Ha,nl)=>{fc=Ha,va=nl});const tl=++this.navigationId;let $a;return"computed"===this.canceledNavigationResolution?(0===this.currentPageId&&(yt=this.location.getState()),$a=yt&&yt.\u0275routerPageId?yt.\u0275routerPageId:qt.replaceUrl||qt.skipLocationChange?null!==(qn=this.browserPageId)&&void 0!==qn?qn:0:(null!==(yi=this.browserPageId)&&void 0!==yi?yi:0)+1):$a=0,this.setTransition({id:tl,targetPageId:$a,source:it,restoredState:yt,currentUrlTree:this.currentUrlTree,currentRawUrl:this.rawUrlTree,rawUrl:Ce,extras:qt,resolve:fc,reject:va,promise:wl,currentSnapshot:this.routerState.snapshot,currentRouterState:this.routerState}),wl.catch(Ha=>Promise.reject(Ha))}setBrowserUrl(Ce,it){const yt=this.urlSerializer.serialize(Ce),qt=Object.assign(Object.assign({},it.extras.state),this.generateNgRouterState(it.id,it.targetPageId));this.location.isCurrentPathEqualTo(yt)||it.extras.replaceUrl?this.location.replaceState(yt,"",qt):this.location.go(yt,"",qt)}restoreHistory(Ce,it=!1){var yt,qt;if("computed"===this.canceledNavigationResolution){const Un=this.currentPageId-Ce.targetPageId;"popstate"!==Ce.source&&"eager"!==this.urlUpdateStrategy&&this.currentUrlTree!==(null===(yt=this.currentNavigation)||void 0===yt?void 0:yt.finalUrl)||0===Un?this.currentUrlTree===(null===(qt=this.currentNavigation)||void 0===qt?void 0:qt.finalUrl)&&0===Un&&(this.resetState(Ce),this.browserUrlTree=Ce.currentUrlTree,this.resetUrlToCurrentUrlTree()):this.location.historyGo(Un)}else"replace"===this.canceledNavigationResolution&&(it&&this.resetState(Ce),this.resetUrlToCurrentUrlTree())}resetState(Ce){this.routerState=Ce.currentRouterState,this.currentUrlTree=Ce.currentUrlTree,this.rawUrlTree=this.urlHandlingStrategy.merge(this.currentUrlTree,Ce.rawUrl)}resetUrlToCurrentUrlTree(){this.location.replaceState(this.urlSerializer.serialize(this.rawUrlTree),"",this.generateNgRouterState(this.lastSuccessfulId,this.currentPageId))}cancelNavigationTransition(Ce,it){const yt=new Zt(Ce.id,this.serializeUrl(Ce.extractedUrl),it);this.triggerEvent(yt),Ce.resolve(!1)}generateNgRouterState(Ce,it){return"computed"===this.canceledNavigationResolution?{navigationId:Ce,\u0275routerPageId:it}:{navigationId:Ce}}}return Be.\u0275fac=function(Ce){return new(Ce||Be)(u.LFG(u.DyG),u.LFG(no),u.LFG(V),u.LFG(r.Ye),u.LFG(u.zs3),u.LFG(u.v3s),u.LFG(u.Sil),u.LFG(void 0))},Be.\u0275prov=u.Yz7({token:Be,factory:Be.\u0275fac}),Be})();function oi(Be){return"imperative"!==Be}let ko=(()=>{class Be{constructor(Ce,it,yt,qt,Un){this.router=Ce,this.route=it,this.commands=[],this.onChanges=new J.xQ,null==yt&&qt.setAttribute(Un.nativeElement,"tabindex","0")}ngOnChanges(Ce){this.onChanges.next(this)}set routerLink(Ce){this.commands=null!=Ce?Array.isArray(Ce)?Ce:[Ce]:[]}onClick(){const Ce={skipLocationChange:Ln(this.skipLocationChange),replaceUrl:Ln(this.replaceUrl),state:this.state};return this.router.navigateByUrl(this.urlTree,Ce),!0}get urlTree(){return this.router.createUrlTree(this.commands,{relativeTo:void 0!==this.relativeTo?this.relativeTo:this.route,queryParams:this.queryParams,fragment:this.fragment,queryParamsHandling:this.queryParamsHandling,preserveFragment:Ln(this.preserveFragment)})}}return Be.\u0275fac=function(Ce){return new(Ce||Be)(u.Y36(Vr),u.Y36(xo),u.$8M("tabindex"),u.Y36(u.Qsj),u.Y36(u.SBq))},Be.\u0275dir=u.lG2({type:Be,selectors:[["","routerLink","",5,"a",5,"area"]],hostBindings:function(Ce,it){1&Ce&&u.NdJ("click",function(){return it.onClick()})},inputs:{routerLink:"routerLink",queryParams:"queryParams",fragment:"fragment",queryParamsHandling:"queryParamsHandling",preserveFragment:"preserveFragment",skipLocationChange:"skipLocationChange",replaceUrl:"replaceUrl",state:"state",relativeTo:"relativeTo"},features:[u.TTD]}),Be})(),Ho=(()=>{class Be{constructor(Ce,it,yt){this.router=Ce,this.route=it,this.locationStrategy=yt,this.commands=[],this.onChanges=new J.xQ,this.subscription=Ce.events.subscribe(qt=>{qt instanceof He&&this.updateTargetUrlAndHref()})}set routerLink(Ce){this.commands=null!=Ce?Array.isArray(Ce)?Ce:[Ce]:[]}ngOnChanges(Ce){this.updateTargetUrlAndHref(),this.onChanges.next(this)}ngOnDestroy(){this.subscription.unsubscribe()}onClick(Ce,it,yt,qt,Un){if(0!==Ce||it||yt||qt||Un||"string"==typeof this.target&&"_self"!=this.target)return!0;const qn={skipLocationChange:Ln(this.skipLocationChange),replaceUrl:Ln(this.replaceUrl),state:this.state};return this.router.navigateByUrl(this.urlTree,qn),!1}updateTargetUrlAndHref(){this.href=this.locationStrategy.prepareExternalUrl(this.router.serializeUrl(this.urlTree))}get urlTree(){return this.router.createUrlTree(this.commands,{relativeTo:void 0!==this.relativeTo?this.relativeTo:this.route,queryParams:this.queryParams,fragment:this.fragment,queryParamsHandling:this.queryParamsHandling,preserveFragment:Ln(this.preserveFragment)})}}return Be.\u0275fac=function(Ce){return new(Ce||Be)(u.Y36(Vr),u.Y36(xo),u.Y36(r.S$))},Be.\u0275dir=u.lG2({type:Be,selectors:[["a","routerLink",""],["area","routerLink",""]],hostVars:2,hostBindings:function(Ce,it){1&Ce&&u.NdJ("click",function(qt){return it.onClick(qt.button,qt.ctrlKey,qt.shiftKey,qt.altKey,qt.metaKey)}),2&Ce&&(u.Ikx("href",it.href,u.LSH),u.uIk("target",it.target))},inputs:{routerLink:"routerLink",target:"target",queryParams:"queryParams",fragment:"fragment",queryParamsHandling:"queryParamsHandling",preserveFragment:"preserveFragment",skipLocationChange:"skipLocationChange",replaceUrl:"replaceUrl",state:"state",relativeTo:"relativeTo"},features:[u.TTD]}),Be})();function Ln(Be){return""===Be||!!Be}let Mr=(()=>{class Be{constructor(Ce,it,yt,qt,Un,qn){this.router=Ce,this.element=it,this.renderer=yt,this.cdr=qt,this.link=Un,this.linkWithHref=qn,this.classes=[],this.isActive=!1,this.routerLinkActiveOptions={exact:!1},this.routerEventsSubscription=Ce.events.subscribe(yi=>{yi instanceof He&&this.update()})}ngAfterContentInit(){(0,y.of)(this.links.changes,this.linksWithHrefs.changes,(0,y.of)(null)).pipe((0,je.J)()).subscribe(Ce=>{this.update(),this.subscribeToEachLinkOnChanges()})}subscribeToEachLinkOnChanges(){var Ce;null===(Ce=this.linkInputChangesSubscription)||void 0===Ce||Ce.unsubscribe();const it=[...this.links.toArray(),...this.linksWithHrefs.toArray(),this.link,this.linkWithHref].filter(yt=>!!yt).map(yt=>yt.onChanges);this.linkInputChangesSubscription=(0,f.D)(it).pipe((0,je.J)()).subscribe(yt=>{this.isActive!==this.isLinkActive(this.router)(yt)&&this.update()})}set routerLinkActive(Ce){const it=Array.isArray(Ce)?Ce:Ce.split(" ");this.classes=it.filter(yt=>!!yt)}ngOnChanges(Ce){this.update()}ngOnDestroy(){var Ce;this.routerEventsSubscription.unsubscribe(),null===(Ce=this.linkInputChangesSubscription)||void 0===Ce||Ce.unsubscribe()}update(){!this.links||!this.linksWithHrefs||!this.router.navigated||Promise.resolve().then(()=>{const Ce=this.hasActiveLinks();this.isActive!==Ce&&(this.isActive=Ce,this.cdr.markForCheck(),this.classes.forEach(it=>{Ce?this.renderer.addClass(this.element.nativeElement,it):this.renderer.removeClass(this.element.nativeElement,it)}))})}isLinkActive(Ce){const it=function(Be){return!!Be.paths}(this.routerLinkActiveOptions)?this.routerLinkActiveOptions:this.routerLinkActiveOptions.exact||!1;return yt=>Ce.isActive(yt.urlTree,it)}hasActiveLinks(){const Ce=this.isLinkActive(this.router);return this.link&&Ce(this.link)||this.linkWithHref&&Ce(this.linkWithHref)||this.links.some(Ce)||this.linksWithHrefs.some(Ce)}}return Be.\u0275fac=function(Ce){return new(Ce||Be)(u.Y36(Vr),u.Y36(u.SBq),u.Y36(u.Qsj),u.Y36(u.sBO),u.Y36(ko,8),u.Y36(Ho,8))},Be.\u0275dir=u.lG2({type:Be,selectors:[["","routerLinkActive",""]],contentQueries:function(Ce,it,yt){if(1&Ce&&(u.Suo(yt,ko,5),u.Suo(yt,Ho,5)),2&Ce){let qt;u.iGM(qt=u.CRH())&&(it.links=qt),u.iGM(qt=u.CRH())&&(it.linksWithHrefs=qt)}},inputs:{routerLinkActiveOptions:"routerLinkActiveOptions",routerLinkActive:"routerLinkActive"},exportAs:["routerLinkActive"],features:[u.TTD]}),Be})(),co=(()=>{class Be{constructor(Ce,it,yt,qt,Un){this.parentContexts=Ce,this.location=it,this.resolver=yt,this.changeDetector=Un,this.activated=null,this._activatedRoute=null,this.activateEvents=new u.vpe,this.deactivateEvents=new u.vpe,this.name=qt||Ir,Ce.onChildOutletCreated(this.name,this)}ngOnDestroy(){this.parentContexts.onChildOutletDestroyed(this.name)}ngOnInit(){if(!this.activated){const Ce=this.parentContexts.getContext(this.name);Ce&&Ce.route&&(Ce.attachRef?this.attach(Ce.attachRef,Ce.route):this.activateWith(Ce.route,Ce.resolver||null))}}get isActivated(){return!!this.activated}get component(){if(!this.activated)throw new Error("Outlet is not activated");return this.activated.instance}get activatedRoute(){if(!this.activated)throw new Error("Outlet is not activated");return this._activatedRoute}get activatedRouteData(){return this._activatedRoute?this._activatedRoute.snapshot.data:{}}detach(){if(!this.activated)throw new Error("Outlet is not activated");this.location.detach();const Ce=this.activated;return this.activated=null,this._activatedRoute=null,Ce}attach(Ce,it){this.activated=Ce,this._activatedRoute=it,this.location.insert(Ce.hostView)}deactivate(){if(this.activated){const Ce=this.component;this.activated.destroy(),this.activated=null,this._activatedRoute=null,this.deactivateEvents.emit(Ce)}}activateWith(Ce,it){if(this.isActivated)throw new Error("Cannot activate an already activated outlet");this._activatedRoute=Ce;const Un=(it=it||this.resolver).resolveComponentFactory(Ce._futureSnapshot.routeConfig.component),qn=this.parentContexts.getOrCreateContext(this.name).children,yi=new Ss(Ce,qn,this.location.injector);this.activated=this.location.createComponent(Un,this.location.length,yi),this.changeDetector.markForCheck(),this.activateEvents.emit(this.activated.instance)}}return Be.\u0275fac=function(Ce){return new(Ce||Be)(u.Y36(V),u.Y36(u.s_b),u.Y36(u._Vd),u.$8M("name"),u.Y36(u.sBO))},Be.\u0275dir=u.lG2({type:Be,selectors:[["router-outlet"]],outputs:{activateEvents:"activate",deactivateEvents:"deactivate"},exportAs:["outlet"]}),Be})();class Ss{constructor(Pe,Ce,it){this.route=Pe,this.childContexts=Ce,this.parent=it}get(Pe,Ce){return Pe===xo?this.route:Pe===V?this.childContexts:this.parent.get(Pe,Ce)}}class Na{}class El{preload(Pe,Ce){return Ce().pipe((0,ve.K)(()=>(0,y.of)(null)))}}class Ks{preload(Pe,Ce){return(0,y.of)(null)}}let td=(()=>{class Be{constructor(Ce,it,yt,qt,Un){this.router=Ce,this.injector=qt,this.preloadingStrategy=Un,this.loader=new Vl(it,yt,Go=>Ce.triggerEvent(new mt(Go)),Go=>Ce.triggerEvent(new Yt(Go)))}setUpPreloading(){this.subscription=this.router.events.pipe((0,se.h)(Ce=>Ce instanceof He),(0,oe.b)(()=>this.preload())).subscribe(()=>{})}preload(){const Ce=this.injector.get(u.h0i);return this.processRoutes(Ce,this.router.config)}ngOnDestroy(){this.subscription&&this.subscription.unsubscribe()}processRoutes(Ce,it){const yt=[];for(const qt of it)if(qt.loadChildren&&!qt.canLoad&&qt._loadedConfig){const Un=qt._loadedConfig;yt.push(this.processRoutes(Un.module,Un.routes))}else qt.loadChildren&&!qt.canLoad?yt.push(this.preloadConfig(Ce,qt)):qt.children&&yt.push(this.processRoutes(Ce,qt.children));return(0,f.D)(yt).pipe((0,je.J)(),(0,Q.U)(qt=>{}))}preloadConfig(Ce,it){return this.preloadingStrategy.preload(it,()=>(it._loadedConfig?(0,y.of)(it._loadedConfig):this.loader.load(Ce.injector,it)).pipe((0,Oe.zg)(qt=>(it._loadedConfig=qt,this.processRoutes(qt.module,qt.routes)))))}}return Be.\u0275fac=function(Ce){return new(Ce||Be)(u.LFG(Vr),u.LFG(u.v3s),u.LFG(u.Sil),u.LFG(u.zs3),u.LFG(Na))},Be.\u0275prov=u.Yz7({token:Be,factory:Be.\u0275fac}),Be})(),Lc=(()=>{class Be{constructor(Ce,it,yt={}){this.router=Ce,this.viewportScroller=it,this.options=yt,this.lastId=0,this.lastSource="imperative",this.restoredId=0,this.store={},yt.scrollPositionRestoration=yt.scrollPositionRestoration||"disabled",yt.anchorScrolling=yt.anchorScrolling||"disabled"}init(){"disabled"!==this.options.scrollPositionRestoration&&this.viewportScroller.setHistoryScrollRestoration("manual"),this.routerEventsSubscription=this.createScrollEvents(),this.scrollEventsSubscription=this.consumeScrollEvents()}createScrollEvents(){return this.router.events.subscribe(Ce=>{Ce instanceof Ve?(this.store[this.lastId]=this.viewportScroller.getScrollPosition(),this.lastSource=Ce.navigationTrigger,this.restoredId=Ce.restoredState?Ce.restoredState.navigationId:0):Ce instanceof He&&(this.lastId=Ce.id,this.scheduleScrollEvent(Ce,this.router.parseUrl(Ce.urlAfterRedirects).fragment))})}consumeScrollEvents(){return this.router.events.subscribe(Ce=>{Ce instanceof ci&&(Ce.position?"top"===this.options.scrollPositionRestoration?this.viewportScroller.scrollToPosition([0,0]):"enabled"===this.options.scrollPositionRestoration&&this.viewportScroller.scrollToPosition(Ce.position):Ce.anchor&&"enabled"===this.options.anchorScrolling?this.viewportScroller.scrollToAnchor(Ce.anchor):"disabled"!==this.options.scrollPositionRestoration&&this.viewportScroller.scrollToPosition([0,0]))})}scheduleScrollEvent(Ce,it){this.router.triggerEvent(new ci(Ce,"popstate"===this.lastSource?this.store[this.restoredId]:null,it))}ngOnDestroy(){this.routerEventsSubscription&&this.routerEventsSubscription.unsubscribe(),this.scrollEventsSubscription&&this.scrollEventsSubscription.unsubscribe()}}return Be.\u0275fac=function(Ce){return new(Ce||Be)(u.LFG(Vr),u.LFG(r.EM),u.LFG(void 0))},Be.\u0275prov=u.Yz7({token:Be,factory:Be.\u0275fac}),Be})();const ki=new u.OlP("ROUTER_CONFIGURATION"),No=new u.OlP("ROUTER_FORROOT_GUARD"),ll=[r.Ye,{provide:no,useClass:so},{provide:Vr,useFactory:function(Be,Pe,Ce,it,yt,qt,Un,qn={},yi,Go){const ka=new Vr(null,Be,Pe,Ce,it,yt,qt,Hi(Un));return yi&&(ka.urlHandlingStrategy=yi),Go&&(ka.routeReuseStrategy=Go),function(Be,Pe){Be.errorHandler&&(Pe.errorHandler=Be.errorHandler),Be.malformedUriErrorHandler&&(Pe.malformedUriErrorHandler=Be.malformedUriErrorHandler),Be.onSameUrlNavigation&&(Pe.onSameUrlNavigation=Be.onSameUrlNavigation),Be.paramsInheritanceStrategy&&(Pe.paramsInheritanceStrategy=Be.paramsInheritanceStrategy),Be.relativeLinkResolution&&(Pe.relativeLinkResolution=Be.relativeLinkResolution),Be.urlUpdateStrategy&&(Pe.urlUpdateStrategy=Be.urlUpdateStrategy)}(qn,ka),qn.enableTracing&&ka.events.subscribe(ss=>{var Oa,Us;null===(Oa=console.group)||void 0===Oa||Oa.call(console,`Router Event: ${ss.constructor.name}`),console.log(ss.toString()),console.log(ss),null===(Us=console.groupEnd)||void 0===Us||Us.call(console)}),ka},deps:[no,V,r.Ye,u.zs3,u.v3s,u.Sil,hl,ki,[class{},new u.FiY],[class{},new u.FiY]]},V,{provide:xo,useFactory:function(Be){return Be.routerState.root},deps:[Vr]},{provide:u.v3s,useClass:u.EAV},td,Ks,El,{provide:ki,useValue:{enableTracing:!1}}];function Ul(){return new u.PXZ("Router",Vr)}let Xs=(()=>{class Be{constructor(Ce,it){}static forRoot(Ce,it){return{ngModule:Be,providers:[ll,nd(Ce),{provide:No,useFactory:Il,deps:[[Vr,new u.FiY,new u.tp0]]},{provide:ki,useValue:it||{}},{provide:r.S$,useFactory:vn,deps:[r.lw,[new u.tBr(r.mr),new u.FiY],ki]},{provide:Lc,useFactory:vd,deps:[Vr,r.EM,ki]},{provide:Na,useExisting:it&&it.preloadingStrategy?it.preloadingStrategy:Ks},{provide:u.PXZ,multi:!0,useFactory:Ul},[jc,{provide:u.ip1,multi:!0,useFactory:nc,deps:[jc]},{provide:ul,useFactory:df,deps:[jc]},{provide:u.tb,multi:!0,useExisting:ul}]]}}static forChild(Ce){return{ngModule:Be,providers:[nd(Ce)]}}}return Be.\u0275fac=function(Ce){return new(Ce||Be)(u.LFG(No,8),u.LFG(Vr,8))},Be.\u0275mod=u.oAB({type:Be}),Be.\u0275inj=u.cJS({}),Be})();function vd(Be,Pe,Ce){return Ce.scrollOffset&&Pe.setOffset(Ce.scrollOffset),new Lc(Be,Pe,Ce)}function vn(Be,Pe,Ce={}){return Ce.useHash?new r.Do(Be,Pe):new r.b0(Be,Pe)}function Il(Be){return"guarded"}function nd(Be){return[{provide:u.deG,multi:!0,useValue:Be},{provide:hl,multi:!0,useValue:Be}]}let jc=(()=>{class Be{constructor(Ce){this.injector=Ce,this.initNavigation=!1,this.destroyed=!1,this.resultOfPreactivationDone=new J.xQ}appInitializer(){return this.injector.get(r.V_,Promise.resolve(null)).then(()=>{if(this.destroyed)return Promise.resolve(!0);let it=null;const yt=new Promise(qn=>it=qn),qt=this.injector.get(Vr),Un=this.injector.get(ki);return"disabled"===Un.initialNavigation?(qt.setUpLocationChangeListener(),it(!0)):"enabled"===Un.initialNavigation||"enabledBlocking"===Un.initialNavigation?(qt.hooks.afterPreactivation=()=>this.initNavigation?(0,y.of)(null):(this.initNavigation=!0,it(!0),this.resultOfPreactivationDone),qt.initialNavigation()):it(!0),yt})}bootstrapListener(Ce){const it=this.injector.get(ki),yt=this.injector.get(td),qt=this.injector.get(Lc),Un=this.injector.get(Vr),qn=this.injector.get(u.z2F);Ce===qn.components[0]&&(("enabledNonBlocking"===it.initialNavigation||void 0===it.initialNavigation)&&Un.initialNavigation(),yt.setUpPreloading(),qt.init(),Un.resetRootComponentType(qn.componentTypes[0]),this.resultOfPreactivationDone.next(null),this.resultOfPreactivationDone.complete())}ngOnDestroy(){this.destroyed=!0}}return Be.\u0275fac=function(Ce){return new(Ce||Be)(u.LFG(u.zs3))},Be.\u0275prov=u.Yz7({token:Be,factory:Be.\u0275fac}),Be})();function nc(Be){return Be.appInitializer.bind(Be)}function df(Be){return Be.bootstrapListener.bind(Be)}const ul=new u.OlP("Router Initializer")},43155:(v,S)=>{"use strict";S.N=void 0;var r=/^([^\w]*)(javascript|data|vbscript)/im,u=/&#(\w+)(^\w|;)?/g,p=/[\u0000-\u001F\u007F-\u009F\u2000-\u200D\uFEFF]/gim,f=/^([^:]+):/gm,e=[".","/"];S.N=function(M){var R=function(M){return M.replace(u,function(R,F){return String.fromCharCode(F)})}(M||"").replace(p,"").trim();if(!R)return"about:blank";if(function(M){return e.indexOf(M[0])>-1}(R))return R;var F=R.match(f);return F&&r.test(F[0])?"about:blank":R}},19723:(v,S,i)=>{"use strict";i.d(S,{iM:()=>np,qr:()=>Nm,xc:()=>jg});var r=i(74788),u=i(12057),p=function(I,z){return(p=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(B,Ee){B.__proto__=Ee}||function(B,Ee){for(var at in Ee)Ee.hasOwnProperty(at)&&(B[at]=Ee[at])})(I,z)};function f(I,z){function B(){this.constructor=I}p(I,z),I.prototype=null===z?Object.create(z):(B.prototype=z.prototype,new B)}var e=function(){return(e=Object.assign||function(z){for(var B,Ee=1,at=arguments.length;Ee<at;Ee++)for(var Ft in B=arguments[Ee])Object.prototype.hasOwnProperty.call(B,Ft)&&(z[Ft]=B[Ft]);return z}).apply(this,arguments)};function _(I,z){var B="function"==typeof Symbol&&I[Symbol.iterator];if(!B)return I;var at,Gn,Ee=B.call(I),Ft=[];try{for(;(void 0===z||z-- >0)&&!(at=Ee.next()).done;)Ft.push(at.value)}catch(hr){Gn={error:hr}}finally{try{at&&!at.done&&(B=Ee.return)&&B.call(Ee)}finally{if(Gn)throw Gn.error}}return Ft}function y(){for(var I=[],z=0;z<arguments.length;z++)I=I.concat(_(arguments[z]));return I}var M=[];Object.freeze(M);var R={};Object.freeze(R);var F={};function Z(){return"undefined"!=typeof window?window:"undefined"!=typeof global?global:F}function J(){return++Ct.mobxGuid}function Q(I){throw ee(!1,I),"X"}function ee(I,z){if(!I)throw new Error("[mobx] "+(z||"An invariant failed, however the error is obfuscated because this is an production build."))}function $(I){var z=!1;return function(){if(!z)return z=!0,I.apply(this,arguments)}}var se=function(){};function oe(I){return null!==I&&"object"==typeof I}function he(I){if(null===I||"object"!=typeof I)return!1;var z=Object.getPrototypeOf(I);return z===Object.prototype||null===z}function ce(I,z,B){Object.defineProperty(I,z,{enumerable:!1,writable:!0,configurable:!0,value:B})}function dt(I,z,B){Object.defineProperty(I,z,{enumerable:!1,writable:!1,configurable:!0,value:B})}function je(I,z){var B="isMobX"+I;return z.prototype[B]=!0,function(Ee){return oe(Ee)&&!0===Ee[B]}}function He(I){return void 0!==Z().Map&&I instanceof Z().Map}function Zt(I){return I instanceof Set}function st(I){for(var z=[];;){var B=I.next();if(B.done)break;z.push(B.value)}return z}function en(){return"function"==typeof Symbol&&Symbol.toPrimitive||"@@toPrimitive"}function $t(I){return null===I?null:"object"==typeof I?""+I:I}function Gt(){return"function"==typeof Symbol&&Symbol.iterator||"@@iterator"}function Ut(I,z){dt(I,Gt(),z)}function Bt(I){return I[Gt()]=Yt,I}function mt(){return"function"==typeof Symbol&&Symbol.toStringTag||"@@toStringTag"}function Yt(){return this}var Dt=function(){function I(z){void 0===z&&(z="Atom@"+J()),this.name=z,this.isPendingUnobservation=!1,this.isBeingObserved=!1,this.observers=[],this.observersIndexes={},this.diffValue=0,this.lastAccessedBy=0,this.lowestObserverState=Ii.NOT_TRACKING}return I.prototype.onBecomeUnobserved=function(){},I.prototype.onBecomeObserved=function(){},I.prototype.reportObserved=function(){return qo(this)},I.prototype.reportChanged=function(){_s(),function(I){if(I.lowestObserverState!==Ii.STALE){I.lowestObserverState=Ii.STALE;for(var z=I.observers,B=z.length;B--;){var Ee=z[B];Ee.dependenciesState===Ii.UP_TO_DATE&&(Ee.isTracing!==no.NONE&&Bs(Ee,I),Ee.onBecomeStale()),Ee.dependenciesState=Ii.STALE}}}(this),bs()},I.prototype.toString=function(){return this.name},I}(),zt=je("Atom",Dt);function Hr(I,z){return I===z}var Qr={identity:Hr,structural:function(I,z){return El(I,z)},default:function(I,z){return function(I,z){return"number"==typeof I&&"number"==typeof z&&isNaN(I)&&isNaN(z)}(I,z)||Hr(I,z)},shallow:function(I,z){return El(I,z,1)}},Kr={},In={};function Hn(I,z){var B=z?Kr:In;return B[I]||(B[I]={configurable:!0,enumerable:z,get:function(){return Zr(this),this[I]},set:function(Ee){Zr(this),this[I]=Ee}})}function Zr(I){if(!0!==I.__mobxDidRunLazyInitializers){var z=I.__mobxDecorators;if(z)for(var B in ce(I,"__mobxDidRunLazyInitializers",!0),z){var Ee=z[B];Ee.propertyCreator(I,Ee.prop,Ee.descriptor,Ee.decoratorTarget,Ee.decoratorArguments)}}}function Ur(I,z){return function(){var Ee,at=function(Gn,hr,li,Io){return!0===Io?(z(Gn,hr,li,Gn,Ee),null):(Object.prototype.hasOwnProperty.call(Gn,"__mobxDecorators")||ce(Gn,"__mobxDecorators",e({},Gn.__mobxDecorators)),Gn.__mobxDecorators[hr]={prop:hr,propertyCreator:z,descriptor:li,decoratorTarget:Gn,decoratorArguments:Ee},Hn(hr,I))};return di(arguments)?(Ee=M,at.apply(null,arguments)):(Ee=Array.prototype.slice.call(arguments),at)}}function di(I){return(2===I.length||3===I.length)&&"string"==typeof I[1]||4===I.length&&!0===I[3]}function $i(I,z,B){return De(I)?I:Array.isArray(I)?mr.array(I,{name:B}):he(I)?mr.object(I,void 0,{name:B}):He(I)?mr.map(I,{name:B}):Zt(I)?mr.set(I,{name:B}):I}function Br(I){return I}function Wt(I){var z=Ur(!0,function(Ee,at,Ft,Gn,hr){!function(I,z,B,Ee){var at=lt(I);if(Fi(at)){var Ft=Aa(at,{object:I,name:z,type:"add",newValue:B});if(!Ft)return;B=Ft.newValue}B=(at.values[z]=new Ti(B,Ee,at.name+"."+z,!1)).value,Object.defineProperty(I,z,function(I){return Or[I]||(Or[I]={configurable:!0,enumerable:!0,get:function(){return this.$mobx.read(this,I)},set:function(z){this.$mobx.write(this,I,z)}})}(z)),at.keys&&at.keys.push(z),function(I,z,B,Ee){var at=As(I),Ft=Qs(),Gn=at||Ft?{type:"add",object:z,name:B,newValue:Ee}:null;Ft&&Eo(e({},Gn,{name:I.name,key:B})),at&&bl(I,Gn),Ft&&ms()}(at,I,z,B)}(Ee,at,Ft?Ft.initializer?Ft.initializer.call(Ee):Ft.value:void 0,I)}),B=("undefined"!=typeof process&&process,z);return B.enhancer=I,B}var Jn={deep:!0,name:void 0,defaultDecorator:void 0};function Vn(I){return null==I?Jn:"string"==typeof I?{name:I,deep:!0}:I}function zr(I){return I.defaultDecorator?I.defaultDecorator.enhancer:!1===I.deep?Br:$i}Object.freeze(Jn),Object.freeze({deep:!1,name:void 0,defaultDecorator:void 0});var hi=Wt($i),Ai=Wt(function(I,z,B){return null==I||Mr(I)||Gl(I)||Hs(I)||ot(I)?I:Array.isArray(I)?mr.array(I,{name:B,deep:!1}):he(I)?mr.object(I,void 0,{name:B,deep:!1}):He(I)?mr.map(I,{name:B,deep:!1}):Zt(I)?mr.set(I,{name:B,deep:!1}):Q(!1)}),Tr=Wt(Br),Nr=Wt(function(I,z,B){return El(I,z)?z:I}),En={box:function(I,z){arguments.length>2&&Xt("box");var B=Vn(z);return new Ti(I,zr(B),B.name,!0,B.equals)},shallowBox:function(I,z){return arguments.length>2&&Xt("shallowBox"),mr.box(I,{name:z,deep:!1})},array:function(I,z){arguments.length>2&&Xt("array");var B=Vn(z);return new Yo(I,zr(B),B.name)},shallowArray:function(I,z){return arguments.length>2&&Xt("shallowArray"),mr.array(I,{name:z,deep:!1})},map:function(I,z){arguments.length>2&&Xt("map");var B=Vn(z);return new hl(I,zr(B),B.name)},shallowMap:function(I,z){return arguments.length>2&&Xt("shallowMap"),mr.map(I,{name:z,deep:!1})},set:function(I,z){arguments.length>2&&Xt("set");var B=Vn(z);return new Ae(I,zr(B),B.name)},object:function(I,z,B){"string"==typeof arguments[1]&&Xt("object");var Ee=Vn(B);return yc({},I,z,Ee)},shallowObject:function(I,z){return"string"==typeof arguments[1]&&Xt("shallowObject"),mr.object(I,{},{name:z,deep:!1})},ref:Tr,shallow:Ai,deep:hi,struct:Nr},mr=function(I,z,B){if("string"==typeof arguments[1])return hi.apply(null,arguments);if(De(I))return I;var Ee=he(I)?mr.object(I,z,B):Array.isArray(I)?mr.array(I,z):He(I)?mr.map(I,z):Zt(I)?mr.set(I,z):I;if(Ee!==I)return Ee;Q(!1)};function Xt(I){Q("Expected one or two arguments to observable."+I+". Did you accidentally try to use observable."+I+" as decorator?")}Object.keys(En).forEach(function(I){return mr[I]=En[I]});var zn=Ur(!1,function(I,z,B,Ee,at){!function(I,z,B){var Ee=lt(I);B.name=Ee.name+"."+z,B.context=I,Ee.values[z]=new xo(B),Object.defineProperty(I,z,function(I){return Vr[I]||(Vr[I]={configurable:Ct.computedConfigurable,enumerable:!1,get:function(){return oi(this).read(this,I)},set:function(z){oi(this).write(this,I,z)}})}(z))}(I,z,e({get:B.get,set:B.set},at[0]||{}))}),vr=zn({equals:Qr.structural}),si=function(z,B,Ee){if("string"==typeof B||null!==z&&"object"==typeof z&&1===arguments.length)return zn.apply(null,arguments);var at="object"==typeof B?B:{};return at.get=z,at.set="function"==typeof B?B:at.set,at.name=at.name||z.name||"",new xo(at)};si.struct=vr;var Ii=(()=>{return(I=Ii||(Ii={}))[I.NOT_TRACKING=-1]="NOT_TRACKING",I[I.UP_TO_DATE=0]="UP_TO_DATE",I[I.POSSIBLY_STALE=1]="POSSIBLY_STALE",I[I.STALE=2]="STALE",Ii;var I})(),no=(()=>{return(I=no||(no={}))[I.NONE=0]="NONE",I[I.LOG=1]="LOG",I[I.BREAK=2]="BREAK",no;var I})(),so=function(z){this.cause=z};function Ze(I){return I instanceof so}function Dr(I){switch(I.dependenciesState){case Ii.UP_TO_DATE:return!1;case Ii.NOT_TRACKING:case Ii.STALE:return!0;case Ii.POSSIBLY_STALE:for(var z=po(),B=I.observing,Ee=B.length,at=0;at<Ee;at++){var Ft=B[at];if(Li(Ft)){if(Ct.disableErrorBoundaries)Ft.get();else try{Ft.get()}catch(Gn){return yo(z),!0}if(I.dependenciesState===Ii.STALE)return yo(z),!0}}return cs(I),yo(z),!1}}function xt(I){var z=I.observers.length>0;Ct.computationDepth>0&&z&&Q(!1),!Ct.allowStateChanges&&(z||"strict"===Ct.enforceActions)&&Q(!1)}function Wn(I,z,B){var Ee=Mo(!0);cs(I),I.newObserving=new Array(I.observing.length+100),I.unboundDepsCount=0,I.runId=++Ct.runId;var Ft,at=Ct.trackingDerivation;if(Ct.trackingDerivation=I,!0===Ct.disableErrorBoundaries)Ft=z.call(B);else try{Ft=z.call(B)}catch(Gn){Ft=new so(Gn)}return Ct.trackingDerivation=at,function(I){for(var z=I.observing,B=I.observing=I.newObserving,Ee=Ii.UP_TO_DATE,at=0,Ft=I.unboundDepsCount,Gn=0;Gn<Ft;Gn++)0===(hr=B[Gn]).diffValue&&(hr.diffValue=1,at!==Gn&&(B[at]=hr),at++),hr.dependenciesState>Ee&&(Ee=hr.dependenciesState);for(B.length=at,I.newObserving=null,Ft=z.length;Ft--;)0===(hr=z[Ft]).diffValue&&Do(hr,I),hr.diffValue=0;for(;at--;){var hr;1===(hr=B[at]).diffValue&&(hr.diffValue=0,Wo(hr,I))}Ee!==Ii.UP_TO_DATE&&(I.dependenciesState=Ee,I.onBecomeStale())}(I),Vi(Ee),Ft}function nr(I){var z=I.observing;I.observing=[];for(var B=z.length;B--;)Do(z[B],I);I.dependenciesState=Ii.NOT_TRACKING}function Gi(I){var z=po(),B=I();return yo(z),B}function po(){var I=Ct.trackingDerivation;return Ct.trackingDerivation=null,I}function yo(I){Ct.trackingDerivation=I}function Mo(I){var z=Ct.allowStateReads;return Ct.allowStateReads=I,z}function Vi(I){Ct.allowStateReads=I}function cs(I){if(I.dependenciesState!==Ii.UP_TO_DATE){I.dependenciesState=Ii.UP_TO_DATE;for(var z=I.observing,B=z.length;B--;)z[B].lowestObserverState=Ii.UP_TO_DATE}}var zo=0,So=1;function Si(I,z){var B=function(){return ai(I,z,this,arguments)};return B.isMobxAction=!0,B}function ai(I,z,B,Ee){var at=function(I,z,B){var Ee=Qs()&&!!I,at=0;if(Ee){at=Date.now();var Ft=B&&B.length||0,Gn=new Array(Ft);if(Ft>0)for(var hr=0;hr<Ft;hr++)Gn[hr]=B[hr];Eo({type:"action",name:I,object:z,arguments:Gn})}var li=po();_s();var ws={prevDerivation:li,prevAllowStateChanges:rr(!0),prevAllowStateReads:Mo(!0),notifySpy:Ee,startTime:at,actionId:So++,parentActionId:zo};return zo=ws.actionId,ws}(I,B,Ee);try{return z.apply(B,Ee)}catch(Ft){throw at.error=Ft,Ft}finally{!function(I){zo!==I.actionId&&Q("invalid action stack. did you forget to finish an action?"),zo=I.parentActionId,void 0!==I.error&&(Ct.suppressReactionErrors=!0),ri(I.prevAllowStateChanges),Vi(I.prevAllowStateReads),bs(),yo(I.prevDerivation),I.notifySpy&&ms({time:Date.now()-I.startTime}),Ct.suppressReactionErrors=!1}(at)}}function rr(I){var z=Ct.allowStateChanges;return Ct.allowStateChanges=I,z}function ri(I){Ct.allowStateChanges=I}var Ti=function(I){function z(B,Ee,at,Ft,Gn){void 0===at&&(at="ObservableValue@"+J()),void 0===Ft&&(Ft=!0),void 0===Gn&&(Gn=Qr.default);var hr=I.call(this,at)||this;return hr.enhancer=Ee,hr.name=at,hr.equals=Gn,hr.hasUnreportedChange=!1,hr.value=Ee(B,void 0,at),Ft&&Qs()&&Fo({type:"create",name:hr.name,newValue:""+hr.value}),hr}return f(z,I),z.prototype.dehanceValue=function(B){return void 0!==this.dehancer?this.dehancer(B):B},z.prototype.set=function(B){var Ee=this.value;if((B=this.prepareNewValue(B))!==Ct.UNCHANGED){var at=Qs();at&&Eo({type:"update",name:this.name,newValue:B,oldValue:Ee}),this.setNewValue(B),at&&ms()}},z.prototype.prepareNewValue=function(B){if(xt(this),Fi(this)){var Ee=Aa(this,{object:this,type:"update",newValue:B});if(!Ee)return Ct.UNCHANGED;B=Ee.newValue}return B=this.enhancer(B,this.value,this.name),this.equals(this.value,B)?Ct.UNCHANGED:B},z.prototype.setNewValue=function(B){var Ee=this.value;this.value=B,this.reportChanged(),As(this)&&bl(this,{type:"update",object:this,newValue:B,oldValue:Ee})},z.prototype.get=function(){return this.reportObserved(),this.dehanceValue(this.value)},z.prototype.intercept=function(B){return ua(this,B)},z.prototype.observe=function(B,Ee){return Ee&&B({object:this,type:"update",newValue:this.value,oldValue:void 0}),ku(this,B)},z.prototype.toJSON=function(){return this.get()},z.prototype.toString=function(){return this.name+"["+this.value+"]"},z.prototype.valueOf=function(){return $t(this.get())},z}(Dt);Ti.prototype[en()]=Ti.prototype.valueOf,je("ObservableValue",Ti);var xo=function(){function I(z){this.dependenciesState=Ii.NOT_TRACKING,this.observing=[],this.newObserving=null,this.isBeingObserved=!1,this.isPendingUnobservation=!1,this.observers=[],this.observersIndexes={},this.diffValue=0,this.runId=0,this.lastAccessedBy=0,this.lowestObserverState=Ii.UP_TO_DATE,this.unboundDepsCount=0,this.__mapid="#"+J(),this.value=new so(null),this.isComputing=!1,this.isRunningSetter=!1,this.isTracing=no.NONE,this.derivation=z.get,this.name=z.name||"ComputedValue@"+J(),z.set&&(this.setter=Si(this.name+"-setter",z.set)),this.equals=z.equals||(z.compareStructural||z.struct?Qr.structural:Qr.default),this.scope=z.context,this.requiresReaction=!!z.requiresReaction,this.keepAlive=!!z.keepAlive}return I.prototype.onBecomeStale=function(){!function(I){if(I.lowestObserverState===Ii.UP_TO_DATE){I.lowestObserverState=Ii.POSSIBLY_STALE;for(var z=I.observers,B=z.length;B--;){var Ee=z[B];Ee.dependenciesState===Ii.UP_TO_DATE&&(Ee.dependenciesState=Ii.POSSIBLY_STALE,Ee.isTracing!==no.NONE&&Bs(Ee,I),Ee.onBecomeStale())}}}(this)},I.prototype.onBecomeUnobserved=function(){},I.prototype.onBecomeObserved=function(){},I.prototype.get=function(){this.isComputing&&Q("Cycle detected in computation "+this.name+": "+this.derivation),0!==Ct.inBatch||0!==this.observers.length||this.keepAlive?(qo(this),Dr(this)&&this.trackAndCompute()&&function(I){if(I.lowestObserverState!==Ii.STALE){I.lowestObserverState=Ii.STALE;for(var z=I.observers,B=z.length;B--;){var Ee=z[B];Ee.dependenciesState===Ii.POSSIBLY_STALE?Ee.dependenciesState=Ii.STALE:Ee.dependenciesState===Ii.UP_TO_DATE&&(I.lowestObserverState=Ii.UP_TO_DATE)}}}(this)):Dr(this)&&(this.warnAboutUntrackedRead(),_s(),this.value=this.computeValue(!1),bs());var z=this.value;if(Ze(z))throw z.cause;return z},I.prototype.peek=function(){var z=this.computeValue(!1);if(Ze(z))throw z.cause;return z},I.prototype.set=function(z){if(this.setter){ee(!this.isRunningSetter,"The setter of computed value '"+this.name+"' is trying to update itself. Did you intend to update an _observable_ value, instead of the computed property?"),this.isRunningSetter=!0;try{this.setter.call(this.scope,z)}finally{this.isRunningSetter=!1}}else ee(!1,!1)},I.prototype.trackAndCompute=function(){Qs()&&Fo({object:this.scope,type:"compute",name:this.name});var z=this.value,B=this.dependenciesState===Ii.NOT_TRACKING,Ee=this.computeValue(!0),at=B||Ze(z)||Ze(Ee)||!this.equals(z,Ee);return at&&(this.value=Ee),at},I.prototype.computeValue=function(z){var B;if(this.isComputing=!0,Ct.computationDepth++,z)B=Wn(this,this.derivation,this.scope);else if(!0===Ct.disableErrorBoundaries)B=this.derivation.call(this.scope);else try{B=this.derivation.call(this.scope)}catch(Ee){B=new so(Ee)}return Ct.computationDepth--,this.isComputing=!1,B},I.prototype.suspend=function(){this.keepAlive||(nr(this),this.value=void 0)},I.prototype.observe=function(z,B){var Ee=this,at=!0,Ft=void 0;return ei(function(){var Gn=Ee.get();if(!at||B){var hr=po();z({type:"update",object:Ee,newValue:Gn,oldValue:Ft}),yo(hr)}at=!1,Ft=Gn})},I.prototype.warnAboutUntrackedRead=function(){},I.prototype.toJSON=function(){return this.get()},I.prototype.toString=function(){return this.name+"["+this.derivation.toString()+"]"},I.prototype.valueOf=function(){return $t(this.get())},I}();xo.prototype[en()]=xo.prototype.valueOf;var I,Li=je("ComputedValue",xo),ln=function(){this.version=5,this.UNCHANGED={},this.trackingDerivation=null,this.computationDepth=0,this.runId=0,this.mobxGuid=0,this.inBatch=0,this.pendingUnobservations=[],this.pendingReactions=[],this.isRunningReactions=!1,this.allowStateChanges=!0,this.allowStateReads=!0,this.enforceActions=!1,this.spyListeners=[],this.globalReactionErrorHandlers=[],this.computedRequiresReaction=!1,this.reactionRequiresObservable=!1,this.observableRequiresReaction=!1,this.computedConfigurable=!1,this.disableErrorBoundaries=!1,this.suppressReactionErrors=!1},Ht=!0,Ct=((I=Z()).__mobxInstanceCount>0&&!I.__mobxGlobals&&(Ht=!1),I.__mobxGlobals&&I.__mobxGlobals.version!==(new ln).version&&(Ht=!1),Ht?I.__mobxGlobals?(I.__mobxInstanceCount+=1,I.__mobxGlobals.UNCHANGED||(I.__mobxGlobals.UNCHANGED={}),I.__mobxGlobals):(I.__mobxInstanceCount=1,I.__mobxGlobals=new ln):(setTimeout(function(){Q("There are multiple, different versions of MobX active. Make sure MobX is loaded only once or use `configure({ isolateGlobalState: true })`")},1),new ln));function Wo(I,z){var B=I.observers.length;B&&(I.observersIndexes[z.__mapid]=B),I.observers[B]=z,I.lowestObserverState>z.dependenciesState&&(I.lowestObserverState=z.dependenciesState)}function Do(I,z){if(1===I.observers.length)I.observers.length=0,Js(I);else{var B=I.observers,Ee=I.observersIndexes,at=B.pop();if(at!==z){var Ft=Ee[z.__mapid]||0;Ft?Ee[at.__mapid]=Ft:delete Ee[at.__mapid],B[Ft]=at}delete Ee[z.__mapid]}}function Js(I){!1===I.isPendingUnobservation&&(I.isPendingUnobservation=!0,Ct.pendingUnobservations.push(I))}function _s(){Ct.inBatch++}function bs(){if(0==--Ct.inBatch){ls();for(var I=Ct.pendingUnobservations,z=0;z<I.length;z++){var B=I[z];B.isPendingUnobservation=!1,0===B.observers.length&&(B.isBeingObserved&&(B.isBeingObserved=!1,B.onBecomeUnobserved()),B instanceof xo&&B.suspend())}Ct.pendingUnobservations=[]}}function qo(I){var z=Ct.trackingDerivation;return null!==z?(z.runId!==I.lastAccessedBy&&(I.lastAccessedBy=z.runId,z.newObserving[z.unboundDepsCount++]=I,I.isBeingObserved||(I.isBeingObserved=!0,I.onBecomeObserved())),!0):(0===I.observers.length&&Ct.inBatch>0&&Js(I),!1)}function Bs(I,z){if(console.log("[mobx.trace] '"+I.name+"' is invalidated due to a change in: '"+z.name+"'"),I.isTracing===no.BREAK){var B=[];Yl(function(I,z){return ed(gr(I,void 0))}(I),B,1),new Function("debugger;\n/*\nTracing '"+I.name+"'\n\nYou are entering this break point because derivation '"+I.name+"' is being traced and '"+z.name+"' is now forcing it to update.\nJust follow the stacktrace you should now see in the devtools to see precisely what piece of your code is causing this update\nThe stackframe you are looking for is at least ~6-8 stack-frames up.\n\n"+(I instanceof xo?I.derivation.toString().replace(/[*]\//g,"/"):"")+"\n\nThe dependencies for this derivation are:\n\n"+B.join("\n")+"\n*/\n    ")()}}function Yl(I,z,B){z.length>=1e3?z.push("(and many more)"):(z.push(""+new Array(B).join("\t")+I.name),I.dependencies&&I.dependencies.forEach(function(Ee){return Yl(Ee,z,B+1)}))}var yl=function(){function I(z,B,Ee,at){void 0===z&&(z="Reaction@"+J()),void 0===at&&(at=!1),this.name=z,this.onInvalidate=B,this.errorHandler=Ee,this.requiresObservable=at,this.observing=[],this.newObserving=[],this.dependenciesState=Ii.NOT_TRACKING,this.diffValue=0,this.runId=0,this.unboundDepsCount=0,this.__mapid="#"+J(),this.isDisposed=!1,this._isScheduled=!1,this._isTrackPending=!1,this._isRunning=!1,this.isTracing=no.NONE}return I.prototype.onBecomeStale=function(){this.schedule()},I.prototype.schedule=function(){this._isScheduled||(this._isScheduled=!0,Ct.pendingReactions.push(this),ls())},I.prototype.isScheduled=function(){return this._isScheduled},I.prototype.runReaction=function(){if(!this.isDisposed){if(_s(),this._isScheduled=!1,Dr(this)){this._isTrackPending=!0;try{this.onInvalidate(),this._isTrackPending&&Qs()&&Fo({name:this.name,type:"scheduled-reaction"})}catch(z){this.reportExceptionInDerivation(z)}}bs()}},I.prototype.track=function(z){_s();var Ee,B=Qs();B&&(Ee=Date.now(),Eo({name:this.name,type:"reaction"})),this._isRunning=!0;var at=Wn(this,z,void 0);this._isRunning=!1,this._isTrackPending=!1,this.isDisposed&&nr(this),Ze(at)&&this.reportExceptionInDerivation(at.cause),B&&ms({time:Date.now()-Ee}),bs()},I.prototype.reportExceptionInDerivation=function(z){var B=this;if(this.errorHandler)this.errorHandler(z,this);else{if(Ct.disableErrorBoundaries)throw z;var Ee="[mobx] Encountered an uncaught exception that was thrown by a reaction or observer component, in: '"+this+"'";Ct.suppressReactionErrors?console.warn("[mobx] (error in reaction '"+this.name+"' suppressed, fix error of causing action below)"):console.error(Ee,z),Qs()&&Fo({type:"error",name:this.name,message:Ee,error:""+z}),Ct.globalReactionErrorHandlers.forEach(function(at){return at(z,B)})}},I.prototype.dispose=function(){this.isDisposed||(this.isDisposed=!0,this._isRunning||(_s(),nr(this),bs()))},I.prototype.getDisposer=function(){var z=this.dispose.bind(this);return z.$mobx=this,z},I.prototype.toString=function(){return"Reaction["+this.name+"]"},I.prototype.trace=function(z){void 0===z&&(z=!1),function(){for(var I=[],z=0;z<arguments.length;z++)I[z]=arguments[z];var B=!1;"boolean"==typeof I[I.length-1]&&(B=I.pop());var Ee=Pc(I);if(!Ee)return Q(!1);Ee.isTracing===no.NONE&&console.log("[mobx.trace] '"+Ee.name+"' tracing enabled"),Ee.isTracing=B?no.BREAK:no.LOG}(this,z)},I}();function ls(){Ct.inBatch>0||Ct.isRunningReactions||function(I){I()}(gs)}function gs(){Ct.isRunningReactions=!0;for(var I=Ct.pendingReactions,z=0;I.length>0;){100==++z&&(console.error("Reaction doesn't converge to a stable state after 100 iterations. Probably there is a cycle in the reactive function: "+I[0]),I.splice(0));for(var B=I.splice(0),Ee=0,at=B.length;Ee<at;Ee++)B[Ee].runReaction()}Ct.isRunningReactions=!1}var Ra=je("Reaction",yl);function Qs(){return!!Ct.spyListeners.length}function Fo(I){if(Ct.spyListeners.length)for(var z=Ct.spyListeners,B=0,Ee=z.length;B<Ee;B++)z[B](I)}function Eo(I){Fo(e({},I,{spyReportStart:!0}))}var ks={spyReportEnd:!0};function ms(I){Fo(I?e({},I,{spyReportEnd:!0}):ks)}function kr(){Q(!1)}function ro(I){return function(z,B,Ee){if(Ee){if(Ee.value)return{value:Si(I,Ee.value),enumerable:!1,configurable:!0,writable:!0};var at=Ee.initializer;return{enumerable:!1,configurable:!0,writable:!0,initializer:function(){return Si(I,at.call(this))}}}return tt(I).apply(this,arguments)}}function tt(I){return function(z,B,Ee){Object.defineProperty(z,B,{configurable:!0,enumerable:!1,get:function(){},set:function(at){ce(this,B,ne(I,at))}})}}var ne=function(z,B,Ee,at){return 1===arguments.length&&"function"==typeof z?Si(z.name||"<unnamed action>",z):2===arguments.length&&"function"==typeof B?Si(z,B):1===arguments.length&&"string"==typeof z?ro(z):!0!==at?ro(B).apply(null,arguments):void(z[B]=Si(z.name||B,Ee.value))};function sn(I,z,B){ce(I,z,Si(z,B.bind(I)))}function ei(I,z){void 0===z&&(z=R);var at,B=z&&z.name||I.name||"Autorun@"+J();if(z.scheduler||z.delay){var Ft=Oi(z),Gn=!1;at=new yl(B,function(){Gn||(Gn=!0,Ft(function(){Gn=!1,at.isDisposed||at.track(hr)}))},z.onError,z.requiresObservable)}else at=new yl(B,function(){this.track(hr)},z.onError,z.requiresObservable);function hr(){I(at)}return at.schedule(),at.getDisposer()}ne.bound=function(I,z,B,Ee){return!0===Ee?(sn(I,z,B.value),null):B?{configurable:!0,enumerable:!1,get:function(){return sn(this,z,B.value||B.initializer.call(this)),this[z]},set:kr}:{enumerable:!1,configurable:!0,set:function(at){sn(this,z,at)},get:function(){}}};var fi=function(I){return I()};function Oi(I){return I.scheduler?I.scheduler:I.delay?function(z){return setTimeout(z,I.delay)}:fi}function os(I,z,B){void 0===B&&(B=R),"boolean"==typeof B&&(B={fireImmediately:B});var Io,Ee=B.name||"Reaction@"+J(),at=ne(Ee,B.onError?function(I,z){return function(){try{return z.apply(this,arguments)}catch(B){I.call(this,B)}}}(B.onError,z):z),Ft=!B.scheduler&&!B.delay,Gn=Oi(B),hr=!0,li=!1,Qo=B.compareStructural?Qr.structural:B.equals||Qr.default,ws=new yl(Ee,function(){hr||Ft?Rl():li||(li=!0,Gn(Rl))},B.onError,B.requiresObservable);function Rl(){if(li=!1,!ws.isDisposed){var Tu=!1;ws.track(function(){var tu=I(ws);Tu=hr||!Qo(Io,tu),Io=tu}),hr&&B.fireImmediately&&at(Io,ws),!hr&&!0===Tu&&at(Io,ws),hr&&(hr=!1)}}return ws.schedule(),ws.getDisposer()}function To(I,z,B){return Ea("onBecomeUnobserved",I,z,B)}function Ea(I,z,B,Ee){var at="function"==typeof Ee?gr(z,B):gr(z),Ft="function"==typeof Ee?Ee:B,Gn=at[I];return"function"!=typeof Gn?Q(!1):(at[I]=function(){Gn.call(this),Ft.call(this)},function(){at[I]=Gn})}function yc(I,z,B,Ee){var Ft=(Ee=Vn(Ee)).defaultDecorator||(!1===Ee.deep?Tr:hi);Zr(I),lt(I,Ee.name,Ft.enhancer),_s();try{for(var at in z){var Gn=Object.getOwnPropertyDescriptor(z,at),li=(B&&at in B?B[at]:Gn.get?zn:Ft)(I,at,Gn,!0);li&&Object.defineProperty(I,at,li)}}finally{bs()}return I}function ed(I){var z={name:I.name};return I.observing&&I.observing.length>0&&(z.dependencies=function(I){var z=[];return I.forEach(function(B){-1===z.indexOf(B)&&z.push(B)}),z}(I.observing).map(ed)),z}function Me(I,z){if(null==I)return!1;if(void 0!==z){if(Mr(I)){var B=I.$mobx;return B.values&&!!B.values[z]}return!1}return Mr(I)||!!I.$mobx||zt(I)||Ra(I)||Li(I)}function De(I){return 1!==arguments.length&&Q(!1),Me(I)}function Pc(I){switch(I.length){case 0:return Ct.trackingDerivation;case 1:return gr(I[0]);case 2:return gr(I[0],I[1])}}function Mu(I,z){void 0===z&&(z=void 0),_s();try{return I.apply(z)}finally{bs()}}function Fi(I){return void 0!==I.interceptors&&I.interceptors.length>0}function ua(I,z){var B=I.interceptors||(I.interceptors=[]);return B.push(z),$(function(){var Ee=B.indexOf(z);-1!==Ee&&B.splice(Ee,1)})}function Aa(I,z){var B=po();try{var Ee=I.interceptors;if(Ee)for(var at=0,Ft=Ee.length;at<Ft&&(ee(!(z=Ee[at](z))||z.type,"Intercept handlers should return nothing or a change object"),z);at++);return z}finally{yo(B)}}function As(I){return void 0!==I.changeListeners&&I.changeListeners.length>0}function ku(I,z){var B=I.changeListeners||(I.changeListeners=[]);return B.push(z),$(function(){var Ee=B.indexOf(z);-1!==Ee&&B.splice(Ee,1)})}function bl(I,z){var B=po(),Ee=I.changeListeners;if(Ee){for(var at=0,Ft=(Ee=Ee.slice()).length;at<Ft;at++)Ee[at](z);yo(B)}}var bu=function(){var I=!1,z={};return Object.defineProperty(z,"0",{set:function(){I=!0}}),Object.create(z)[0]=1,!1===I}(),cu=0,Gs=function(){};(function(I,z){void 0!==Object.setPrototypeOf?Object.setPrototypeOf(I.prototype,z):void 0!==I.prototype.__proto__?I.prototype.__proto__=z:I.prototype=z})(Gs,Array.prototype),Object.isFrozen(Array)&&["constructor","push","shift","concat","pop","unshift","replace","find","findIndex","splice","reverse","sort"].forEach(function(I){Object.defineProperty(Gs.prototype,I,{configurable:!0,writable:!0,value:Array.prototype[I]})});var Hu=function(){function I(z,B,Ee,at){this.array=Ee,this.owned=at,this.values=[],this.lastKnownLength=0,this.atom=new Dt(z||"ObservableArray@"+J()),this.enhancer=function(Ft,Gn){return B(Ft,Gn,z+"[..]")}}return I.prototype.dehanceValue=function(z){return void 0!==this.dehancer?this.dehancer(z):z},I.prototype.dehanceValues=function(z){return void 0!==this.dehancer&&z.length>0?z.map(this.dehancer):z},I.prototype.intercept=function(z){return ua(this,z)},I.prototype.observe=function(z,B){return void 0===B&&(B=!1),B&&z({object:this.array,type:"splice",index:0,added:this.values.slice(),addedCount:this.values.length,removed:[],removedCount:0}),ku(this,z)},I.prototype.getArrayLength=function(){return this.atom.reportObserved(),this.values.length},I.prototype.setArrayLength=function(z){if("number"!=typeof z||z<0)throw new Error("[mobx.array] Out of range: "+z);var B=this.values.length;if(z!==B)if(z>B){for(var Ee=new Array(z-B),at=0;at<z-B;at++)Ee[at]=void 0;this.spliceWithArray(B,0,Ee)}else this.spliceWithArray(z,B-z)},I.prototype.updateArrayLength=function(z,B){if(z!==this.lastKnownLength)throw new Error("[mobx] Modification exception: the internal structure of an observable array was changed. Did you use peek() to change it?");this.lastKnownLength+=B,B>0&&z+B+1>cu&&_u(z+B+1)},I.prototype.spliceWithArray=function(z,B,Ee){var at=this;xt(this.atom);var Ft=this.values.length;if(void 0===z?z=0:z>Ft?z=Ft:z<0&&(z=Math.max(0,Ft+z)),B=1===arguments.length?Ft-z:null==B?0:Math.max(0,Math.min(B,Ft-z)),void 0===Ee&&(Ee=M),Fi(this)){var Gn=Aa(this,{object:this.array,type:"splice",index:z,removedCount:B,added:Ee});if(!Gn)return M;B=Gn.removedCount,Ee=Gn.added}var hr=(Ee=0===Ee.length?Ee:Ee.map(function(Io){return at.enhancer(Io,void 0)})).length-B;this.updateArrayLength(Ft,hr);var li=this.spliceItemsIntoValues(z,B,Ee);return(0!==B||0!==Ee.length)&&this.notifyArraySplice(z,Ee,li),this.dehanceValues(li)},I.prototype.spliceItemsIntoValues=function(z,B,Ee){var at;if(Ee.length<1e4)return(at=this.values).splice.apply(at,y([z,B],Ee));var Ft=this.values.slice(z,z+B);return this.values=this.values.slice(0,z).concat(Ee,this.values.slice(z+B)),Ft},I.prototype.notifyArrayChildUpdate=function(z,B,Ee){var at=!this.owned&&Qs(),Ft=As(this),Gn=Ft||at?{object:this.array,type:"update",index:z,newValue:B,oldValue:Ee}:null;at&&Eo(e({},Gn,{name:this.atom.name})),this.atom.reportChanged(),Ft&&bl(this,Gn),at&&ms()},I.prototype.notifyArraySplice=function(z,B,Ee){var at=!this.owned&&Qs(),Ft=As(this),Gn=Ft||at?{object:this.array,type:"splice",index:z,removed:Ee,added:B,removedCount:Ee.length,addedCount:B.length}:null;at&&Eo(e({},Gn,{name:this.atom.name})),this.atom.reportChanged(),Ft&&bl(this,Gn),at&&ms()},I}(),Yo=function(I){function z(B,Ee,at,Ft){void 0===at&&(at="ObservableArray@"+J()),void 0===Ft&&(Ft=!1);var Gn=I.call(this)||this,hr=new Hu(at,Ee,Gn,Ft);if(dt(Gn,"$mobx",hr),B&&B.length){var li=rr(!0);Gn.spliceWithArray(0,0,B),ri(li)}return bu&&Object.defineProperty(hr.array,"0",du),Gn}return f(z,I),z.prototype.intercept=function(B){return this.$mobx.intercept(B)},z.prototype.observe=function(B,Ee){return void 0===Ee&&(Ee=!1),this.$mobx.observe(B,Ee)},z.prototype.clear=function(){return this.splice(0)},z.prototype.concat=function(){for(var B=[],Ee=0;Ee<arguments.length;Ee++)B[Ee]=arguments[Ee];return this.$mobx.atom.reportObserved(),Array.prototype.concat.apply(this.peek(),B.map(function(at){return Gl(at)?at.peek():at}))},z.prototype.replace=function(B){return this.$mobx.spliceWithArray(0,this.$mobx.values.length,B)},z.prototype.toJS=function(){return this.slice()},z.prototype.toJSON=function(){return this.toJS()},z.prototype.peek=function(){return this.$mobx.atom.reportObserved(),this.$mobx.dehanceValues(this.$mobx.values)},z.prototype.find=function(B,Ee,at){void 0===at&&(at=0);var Ft=this.findIndex.apply(this,arguments);return-1===Ft?void 0:this.get(Ft)},z.prototype.findIndex=function(B,Ee,at){void 0===at&&(at=0);for(var Ft=this.peek(),Gn=Ft.length,hr=at;hr<Gn;hr++)if(B.call(Ee,Ft[hr],hr,this))return hr;return-1},z.prototype.splice=function(B,Ee){for(var at=[],Ft=2;Ft<arguments.length;Ft++)at[Ft-2]=arguments[Ft];switch(arguments.length){case 0:return[];case 1:return this.$mobx.spliceWithArray(B);case 2:return this.$mobx.spliceWithArray(B,Ee)}return this.$mobx.spliceWithArray(B,Ee,at)},z.prototype.spliceWithArray=function(B,Ee,at){return this.$mobx.spliceWithArray(B,Ee,at)},z.prototype.push=function(){for(var B=[],Ee=0;Ee<arguments.length;Ee++)B[Ee]=arguments[Ee];var at=this.$mobx;return at.spliceWithArray(at.values.length,0,B),at.values.length},z.prototype.pop=function(){return this.splice(Math.max(this.$mobx.values.length-1,0),1)[0]},z.prototype.shift=function(){return this.splice(0,1)[0]},z.prototype.unshift=function(){for(var B=[],Ee=0;Ee<arguments.length;Ee++)B[Ee]=arguments[Ee];var at=this.$mobx;return at.spliceWithArray(0,0,B),at.values.length},z.prototype.reverse=function(){var B=this.slice();return B.reverse.apply(B,arguments)},z.prototype.sort=function(B){var Ee=this.slice();return Ee.sort.apply(Ee,arguments)},z.prototype.remove=function(B){var Ee=this.$mobx.dehanceValues(this.$mobx.values).indexOf(B);return Ee>-1&&(this.splice(Ee,1),!0)},z.prototype.move=function(B,Ee){function at(hr){if(hr<0)throw new Error("[mobx.array] Index out of bounds: "+hr+" is negative");var li=this.$mobx.values.length;if(hr>=li)throw new Error("[mobx.array] Index out of bounds: "+hr+" is not smaller than "+li)}if(at.call(this,B),at.call(this,Ee),B!==Ee){var Gn,Ft=this.$mobx.values;Gn=B<Ee?y(Ft.slice(0,B),Ft.slice(B+1,Ee+1),[Ft[B]],Ft.slice(Ee+1)):y(Ft.slice(0,Ee),[Ft[B]],Ft.slice(Ee,B),Ft.slice(B+1)),this.replace(Gn)}},z.prototype.get=function(B){var Ee=this.$mobx;if(Ee){if(B<Ee.values.length)return Ee.atom.reportObserved(),Ee.dehanceValue(Ee.values[B]);console.warn("[mobx.array] Attempt to read an array index ("+B+") that is out of bounds ("+Ee.values.length+"). Please check length first. Out of bound indices will not be tracked by MobX")}},z.prototype.set=function(B,Ee){var at=this.$mobx,Ft=at.values;if(B<Ft.length){xt(at.atom);var Gn=Ft[B];if(Fi(at)){var hr=Aa(at,{type:"update",object:this,index:B,newValue:Ee});if(!hr)return;Ee=hr.newValue}(Ee=at.enhancer(Ee,Gn))!==Gn&&(Ft[B]=Ee,at.notifyArrayChildUpdate(B,Ee,Gn))}else{if(B!==Ft.length)throw new Error("[mobx.array] Index out of bounds, "+B+" is larger than "+Ft.length);at.spliceWithArray(B,0,[Ee])}},z}(Gs);Ut(Yo.prototype,function(){this.$mobx.atom.reportObserved();var I=this,z=0;return Bt({next:function(){return z<I.length?{value:I[z++],done:!1}:{done:!0,value:void 0}}})}),Object.defineProperty(Yo.prototype,"length",{enumerable:!1,configurable:!0,get:function(){return this.$mobx.getArrayLength()},set:function(I){this.$mobx.setArrayLength(I)}}),ce(Yo.prototype,mt(),"Array"),["every","filter","forEach","indexOf","join","lastIndexOf","map","reduce","reduceRight","slice","some","toString","toLocaleString"].forEach(function(I){var z=Array.prototype[I];ee("function"==typeof z,"Base function not defined on Array prototype: '"+I+"'"),ce(Yo.prototype,I,function(){return z.apply(this.peek(),arguments)})}),function(I,z){for(var B=0;B<z.length;B++)ce(I,z[B],I[z[B]])}(Yo.prototype,["constructor","intercept","observe","clear","concat","get","replace","toJS","toJSON","peek","find","findIndex","splice","spliceWithArray","push","pop","set","shift","unshift","reverse","sort","remove","move","toString","toLocaleString"]);var du=Ar(0);function Ar(I){return{enumerable:!1,configurable:!1,get:function(){return this.get(I)},set:function(z){this.set(I,z)}}}function ha(I){Object.defineProperty(Yo.prototype,""+I,Ar(I))}function _u(I){for(var z=cu;z<I;z++)ha(z);cu=I}_u(1e3);var fa=je("ObservableArrayAdministration",Hu);function Gl(I){return oe(I)&&fa(I.$mobx)}var Ja={},hl=function(){function I(z,B,Ee){if(void 0===B&&(B=$i),void 0===Ee&&(Ee="ObservableMap@"+J()),this.enhancer=B,this.name=Ee,this.$mobx=Ja,this._keys=new Yo(void 0,Br,this.name+".keys()",!0),"function"!=typeof Map)throw new Error("mobx.map requires Map polyfill for the current browser. Check babel-polyfill or core-js/es6/map.js");this._data=new Map,this._hasMap=new Map,this.merge(z)}return I.prototype._has=function(z){return this._data.has(z)},I.prototype.has=function(z){var B=this;if(!Ct.trackingDerivation)return this._has(z);var Ee=this._hasMap.get(z);if(!Ee){var at=Ee=new Ti(this._has(z),Br,this.name+"."+Vl(z)+"?",!1);this._hasMap.set(z,at),To(at,function(){return B._hasMap.delete(z)})}return Ee.get()},I.prototype.set=function(z,B){var Ee=this._has(z);if(Fi(this)){var at=Aa(this,{type:Ee?"update":"add",object:this,newValue:B,name:z});if(!at)return this;B=at.newValue}return Ee?this._updateValue(z,B):this._addValue(z,B),this},I.prototype.delete=function(z){var B=this;if(Fi(this)&&!(Ee=Aa(this,{type:"delete",object:this,name:z})))return!1;if(this._has(z)){var at=Qs(),Ft=As(this),Ee=Ft||at?{type:"delete",object:this,oldValue:this._data.get(z).value,name:z}:null;return at&&Eo(e({},Ee,{name:this.name,key:z})),Mu(function(){B._keys.remove(z),B._updateHasMapEntry(z,!1),B._data.get(z).setNewValue(void 0),B._data.delete(z)}),Ft&&bl(this,Ee),at&&ms(),!0}return!1},I.prototype._updateHasMapEntry=function(z,B){var Ee=this._hasMap.get(z);Ee&&Ee.setNewValue(B)},I.prototype._updateValue=function(z,B){var Ee=this._data.get(z);if((B=Ee.prepareNewValue(B))!==Ct.UNCHANGED){var at=Qs(),Ft=As(this),Gn=Ft||at?{type:"update",object:this,oldValue:Ee.value,name:z,newValue:B}:null;at&&Eo(e({},Gn,{name:this.name,key:z})),Ee.setNewValue(B),Ft&&bl(this,Gn),at&&ms()}},I.prototype._addValue=function(z,B){var Ee=this;Mu(function(){var hr=new Ti(B,Ee.enhancer,Ee.name+"."+Vl(z),!1);Ee._data.set(z,hr),B=hr.value,Ee._updateHasMapEntry(z,!0),Ee._keys.push(z)});var at=Qs(),Ft=As(this),Gn=Ft||at?{type:"add",object:this,name:z,newValue:B}:null;at&&Eo(e({},Gn,{name:this.name,key:z})),Ft&&bl(this,Gn),at&&ms()},I.prototype.get=function(z){return this.has(z)?this.dehanceValue(this._data.get(z).get()):this.dehanceValue(void 0)},I.prototype.dehanceValue=function(z){return void 0!==this.dehancer?this.dehancer(z):z},I.prototype.keys=function(){return this._keys[Gt()]()},I.prototype.values=function(){var z=this,B=0;return Bt({next:function(){return B<z._keys.length?{value:z.get(z._keys[B++]),done:!1}:{value:void 0,done:!0}}})},I.prototype.entries=function(){var z=this,B=0;return Bt({next:function(){if(B<z._keys.length){var Ee=z._keys[B++];return{value:[Ee,z.get(Ee)],done:!1}}return{done:!0}}})},I.prototype.forEach=function(z,B){var Ee=this;this._keys.forEach(function(at){return z.call(B,Ee.get(at),at,Ee)})},I.prototype.merge=function(z){var B=this;return Hs(z)&&(z=z.toJS()),Mu(function(){he(z)?Object.keys(z).forEach(function(Ee){return B.set(Ee,z[Ee])}):Array.isArray(z)?z.forEach(function(Ee){var at=_(Ee,2);return B.set(at[0],at[1])}):He(z)?z.constructor!==Map?Q("Cannot initialize from classes that inherit from Map: "+z.constructor.name):z.forEach(function(Ee,at){return B.set(at,Ee)}):null!=z&&Q("Cannot initialize map from "+z)}),this},I.prototype.clear=function(){var z=this;Mu(function(){Gi(function(){z._keys.slice().forEach(function(B){return z.delete(B)})})})},I.prototype.replace=function(z){var B=this;return Mu(function(){for(var Ee=function(I){return He(I)||Hs(I)?I:Array.isArray(I)?new Map(I):he(I)?new Map(Object.entries(I)):Q("Cannot convert to map from '"+I+"'")}(z),at=B._keys,Ft=Array.from(Ee.keys()),Gn=!1,hr=0;hr<at.length;hr++){var li=at[hr];at.length===Ft.length&&li!==Ft[hr]&&(Gn=!0),Ee.has(li)||(Gn=!0,B.delete(li))}Ee.forEach(function(Io,Qo){B._data.has(Qo)||(Gn=!0),B.set(Qo,Io)}),Gn&&B._keys.replace(Ft)}),this},Object.defineProperty(I.prototype,"size",{get:function(){return this._keys.length},enumerable:!0,configurable:!0}),I.prototype.toPOJO=function(){var z=this,B={};return this._keys.forEach(function(Ee){return B["symbol"==typeof Ee?Ee:Vl(Ee)]=z.get(Ee)}),B},I.prototype.toJS=function(){var z=this,B=new Map;return this._keys.forEach(function(Ee){return B.set(Ee,z.get(Ee))}),B},I.prototype.toJSON=function(){return this.toPOJO()},I.prototype.toString=function(){var z=this;return this.name+"[{ "+this._keys.map(function(B){return Vl(B)+": "+z.get(B)}).join(", ")+" }]"},I.prototype.observe=function(z,B){return ku(this,z)},I.prototype.intercept=function(z){return ua(this,z)},I}();function Vl(I){return I&&I.toString?I.toString():new String(I).toString()}Ut(hl.prototype,function(){return this.entries()}),dt(hl.prototype,mt(),"Map");var Hs=je("ObservableMap",hl),V={},Ae=function(){function I(z,B,Ee){if(void 0===B&&(B=$i),void 0===Ee&&(Ee="ObservableSet@"+J()),this.name=Ee,this.$mobx=V,this._data=new Set,this._atom=function(I,z,B){void 0===z&&(z=se),void 0===B&&(B=se);var Ee=new Dt(I);return function(I,z,B){Ea("onBecomeObserved",I,z,void 0)}(Ee,z),To(Ee,B),Ee}(this.name),"function"!=typeof Set)throw new Error("mobx.set requires Set polyfill for the current browser. Check babel-polyfill or core-js/es6/set.js");this.enhancer=function(at,Ft){return B(at,Ft,Ee)},z&&this.replace(z)}return I.prototype.dehanceValue=function(z){return void 0!==this.dehancer?this.dehancer(z):z},I.prototype.clear=function(){var z=this;Mu(function(){Gi(function(){z._data.forEach(function(B){z.delete(B)})})})},I.prototype.forEach=function(z,B){var Ee=this;this._data.forEach(function(at){z.call(B,at,at,Ee)})},Object.defineProperty(I.prototype,"size",{get:function(){return this._atom.reportObserved(),this._data.size},enumerable:!0,configurable:!0}),I.prototype.add=function(z){var B=this;if(xt(this._atom),Fi(this)&&!(Ee=Aa(this,{type:"add",object:this,newValue:z})))return this;if(!this.has(z)){Mu(function(){B._data.add(B.enhancer(z,void 0)),B._atom.reportChanged()});var at=Qs(),Ft=As(this),Ee=Ft||at?{type:"add",object:this,newValue:z}:null;Ft&&bl(this,Ee)}return this},I.prototype.delete=function(z){var B=this;if(Fi(this)&&!(Ee=Aa(this,{type:"delete",object:this,oldValue:z})))return!1;if(this.has(z)){var at=Qs(),Ft=As(this),Ee=Ft||at?{type:"delete",object:this,oldValue:z}:null;return Mu(function(){B._atom.reportChanged(),B._data.delete(z)}),Ft&&bl(this,Ee),!0}return!1},I.prototype.has=function(z){return this._atom.reportObserved(),this._data.has(this.dehanceValue(z))},I.prototype.entries=function(){var z=0,B=st(this.keys()),Ee=st(this.values());return Bt({next:function(){var at=z;return z+=1,at<Ee.length?{value:[B[at],Ee[at]],done:!1}:{done:!0}}})},I.prototype.keys=function(){return this.values()},I.prototype.values=function(){this._atom.reportObserved();var Ee,z=this,B=0;return void 0!==this._data.values?Ee=st(this._data.values()):(Ee=[],this._data.forEach(function(at){return Ee.push(at)})),Bt({next:function(){return B<Ee.length?{value:z.dehanceValue(Ee[B++]),done:!1}:{done:!0}}})},I.prototype.replace=function(z){var B=this;return ot(z)&&(z=z.toJS()),Mu(function(){Array.isArray(z)||Zt(z)?(B.clear(),z.forEach(function(Ee){return B.add(Ee)})):null!=z&&Q("Cannot initialize set from "+z)}),this},I.prototype.observe=function(z,B){return ku(this,z)},I.prototype.intercept=function(z){return ua(this,z)},I.prototype.toJS=function(){return new Set(this)},I.prototype.toString=function(){return this.name+"[ "+st(this.keys()).join(", ")+" ]"},I}();Ut(Ae.prototype,function(){return this.values()}),dt(Ae.prototype,mt(),"Set");var ot=je("ObservableSet",Ae),_t=function(){function I(z,B,Ee){this.target=z,this.name=B,this.defaultEnhancer=Ee,this.values={}}return I.prototype.read=function(z,B){if(this.target===z||(this.illegalAccess(z,B),this.values[B]))return this.values[B].get()},I.prototype.write=function(z,B,Ee){var at=this.target;at!==z&&this.illegalAccess(z,B);var Ft=this.values[B];if(Ft instanceof xo)Ft.set(Ee);else{if(Fi(this)){if(!(Gn=Aa(this,{type:"update",object:at,name:B,newValue:Ee})))return;Ee=Gn.newValue}if((Ee=Ft.prepareNewValue(Ee))!==Ct.UNCHANGED){var hr=As(this),li=Qs(),Gn=hr||li?{type:"update",object:at,oldValue:Ft.value,name:B,newValue:Ee}:null;li&&Eo(e({},Gn,{name:this.name,key:B})),Ft.setNewValue(Ee),hr&&bl(this,Gn),li&&ms()}}},I.prototype.remove=function(z){if(this.values[z]){var B=this.target;if(Fi(this)&&!(Ee=Aa(this,{object:B,name:z,type:"remove"})))return;try{_s();var at=As(this),Ft=Qs(),Gn=this.values[z].get();this.keys&&this.keys.remove(z),delete this.values[z],delete this.target[z];var Ee=at||Ft?{type:"remove",object:B,oldValue:Gn,name:z}:null;Ft&&Eo(e({},Ee,{name:this.name,key:z})),at&&bl(this,Ee),Ft&&ms()}finally{bs()}}},I.prototype.illegalAccess=function(z,B){console.warn("Property '"+B+"' of '"+z+"' was accessed through the prototype chain. Use 'decorate' instead to declare the prop or access it statically through it's owner")},I.prototype.observe=function(z,B){return ku(this,z)},I.prototype.intercept=function(z){return ua(this,z)},I.prototype.getKeys=function(){var z=this;return void 0===this.keys&&(this.keys=new Yo(Object.keys(this.values).filter(function(B){return z.values[B]instanceof Ti}),Br,"keys("+this.name+")",!0)),this.keys.slice()},I}();function lt(I,z,B){void 0===z&&(z=""),void 0===B&&(B=$i);var Ee=I.$mobx;return Ee||(he(I)||(z=(I.constructor.name||"ObservableObject")+"@"+J()),z||(z="ObservableObject@"+J()),dt(I,"$mobx",Ee=new _t(I,z,B)),Ee)}var Or=Object.create(null),Vr=Object.create(null);function oi(I){return I.$mobx||(Zr(I),I.$mobx)}var Ln=je("ObservableObjectAdministration",_t);function Mr(I){return!!oe(I)&&(Zr(I),Ln(I.$mobx))}function gr(I,z){if("object"==typeof I&&null!==I){if(Gl(I))return void 0!==z&&Q(!1),I.$mobx.atom;if(ot(I))return I.$mobx;if(Hs(I)){var B=I;return void 0===z?gr(B._keys):((Ee=B._data.get(z)||B._hasMap.get(z))||Q(!1),Ee)}var Ee;if(Zr(I),Mr(I))return z?((Ee=I.$mobx.values[z])||Q(!1),Ee):Q(!1);if(zt(I)||Li(I)||Ra(I))return I}else if("function"==typeof I&&Ra(I.$mobx))return I.$mobx;return Q(!1)}function co(I,z){return I||Q("Expecting some object"),void 0!==z?co(gr(I,z)):zt(I)||Li(I)||Ra(I)||Hs(I)||ot(I)?I:(Zr(I),I.$mobx?I.$mobx:void Q(!1))}var Na=Object.prototype.toString;function El(I,z,B){return void 0===B&&(B=-1),Ks(I,z,B)}function Ks(I,z,B,Ee,at){if(I===z)return 0!==I||1/I==1/z;if(null==I||null==z)return!1;if(I!=I)return z!=z;var Ft=typeof I;if("function"!==Ft&&"object"!==Ft&&"object"!=typeof z)return!1;I=td(I),z=td(z);var Gn=Na.call(I);if(Gn!==Na.call(z))return!1;switch(Gn){case"[object RegExp]":case"[object String]":return""+I==""+z;case"[object Number]":return+I!=+I?+z!=+z:0==+I?1/+I==1/z:+I==+z;case"[object Date]":case"[object Boolean]":return+I==+z;case"[object Symbol]":return"undefined"!=typeof Symbol&&Symbol.valueOf.call(I)===Symbol.valueOf.call(z)}var hr="[object Array]"===Gn;if(!hr){if("object"!=typeof I||"object"!=typeof z)return!1;var li=I.constructor,Io=z.constructor;if(li!==Io&&!("function"==typeof li&&li instanceof li&&"function"==typeof Io&&Io instanceof Io)&&"constructor"in I&&"constructor"in z)return!1}if(0===B)return!1;B<0&&(B=-1),at=at||[];for(var Qo=(Ee=Ee||[]).length;Qo--;)if(Ee[Qo]===I)return at[Qo]===z;if(Ee.push(I),at.push(z),hr){if((Qo=I.length)!==z.length)return!1;for(;Qo--;)if(!Ks(I[Qo],z[Qo],B-1,Ee,at))return!1}else{var ws=Object.keys(I),Rl=void 0;if(Qo=ws.length,Object.keys(z).length!==Qo)return!1;for(;Qo--;)if(!Lc(z,Rl=ws[Qo])||!Ks(I[Rl],z[Rl],B-1,Ee,at))return!1}return Ee.pop(),at.pop(),!0}function td(I){return Gl(I)?I.peek():He(I)||Hs(I)||Zt(I)||ot(I)?st(I.entries()):I}function Lc(I,z){return Object.prototype.hasOwnProperty.call(I,z)}"object"==typeof __MOBX_DEVTOOLS_GLOBAL_HOOK__&&__MOBX_DEVTOOLS_GLOBAL_HOOK__.injectMobx({spy:function(I){return Ct.spyListeners.push(I),$(function(){Ct.spyListeners=Ct.spyListeners.filter(function(z){return z!==I})})},extras:{getDebugName:function(I,z){return(void 0!==z?gr(I,z):Mr(I)||Hs(I)||ot(I)?co(I):gr(I)).name}},$mobx:"$mobx"});const ll=function(I,z,B){switch(B.length){case 0:return I.call(z);case 1:return I.call(z,B[0]);case 2:return I.call(z,B[0],B[1]);case 3:return I.call(z,B[0],B[1],B[2])}return I.apply(z,B)},Xs=function(I){return I};var vd=Math.max;const Il=function(I,z,B){return z=vd(void 0===z?I.length-1:z,0),function(){for(var Ee=arguments,at=-1,Ft=vd(Ee.length-z,0),Gn=Array(Ft);++at<Ft;)Gn[at]=Ee[z+at];at=-1;for(var hr=Array(z+1);++at<z;)hr[at]=Ee[at];return hr[z]=B(Gn),ll(I,this,hr)}},Vd=function(I){return function(){return I}};var ds=i(99567),ul=Date.now;const Pe=function(I){var z=0,B=0;return function(){var Ee=ul(),at=16-(Ee-B);if(B=Ee,at>0){if(++z>=800)return arguments[0]}else z=0;return I.apply(void 0,arguments)}}(ds.Z?function(I,z){return(0,ds.Z)(I,"toString",{configurable:!0,enumerable:!1,value:Vd(z),writable:!0})}:Xs),it=function(I,z){return Pe(Il(I,z,Xs),I+"")};var yt=i(7475),qt=i(2951),Un=i(66224);const yi=function(I,z,B){(void 0!==B&&!(0,Un.Z)(I[z],B)||void 0===B&&!(z in I))&&(0,qt.Z)(I,z,B)},Oa=function(z,B,Ee){for(var at=-1,Ft=Object(z),Gn=Ee(z),hr=Gn.length;hr--;){var li=Gn[++at];if(!1===B(Ft[li],li,Ft))break}return z};var Us=i(27672),fc=i(1044),va=i(36889),wl=i(22595),tl=i(2172),$a=i(34654),Ha=i(18402),nl=i(6539);var Jd=i(12434),Tc=i(58209),Vu=i(4214),Sc=i(46382),Qd=i(11595),Tl=Function.prototype.toString,xl=Object.prototype.hasOwnProperty,kl=Tl.call(Object);const Qa=function(I){if(!(0,nl.Z)(I)||"[object Object]"!=(0,Sc.Z)(I))return!1;var z=(0,Qd.Z)(I);if(null===z)return!0;var B=xl.call(z,"constructor")&&z.constructor;return"function"==typeof B&&B instanceof B&&Tl.call(B)==kl};var Wu=i(99436);const Mc=function(I,z){if(("constructor"!==z||"function"!=typeof I[z])&&"__proto__"!=z)return I[z]};var Ou=i(57640),Pu=i(76212);const yd=function(I,z,B,Ee,at,Ft,Gn){var hr=Mc(I,B),li=Mc(z,B),Io=Gn.get(li);if(Io)yi(I,B,Io);else{var Qo=Ft?Ft(hr,li,B+"",I,z,Gn):void 0,ws=void 0===Qo;if(ws){var Rl=(0,$a.Z)(li),Tu=!Rl&&(0,Jd.Z)(li),tu=!Rl&&!Tu&&(0,Wu.Z)(li);Qo=li,Rl||Tu||tu?(0,$a.Z)(hr)?Qo=hr:function(I){return(0,nl.Z)(I)&&(0,Ha.Z)(I)}(hr)?Qo=(0,va.Z)(hr):Tu?(ws=!1,Qo=(0,Us.Z)(li,!0)):tu?(ws=!1,Qo=(0,fc.Z)(li,!0)):Qo=[]:Qa(li)||(0,tl.Z)(li)?(Qo=hr,(0,tl.Z)(hr)?Qo=function(I){return(0,Ou.Z)(I,(0,Pu.Z)(I))}(hr):(!(0,Vu.Z)(hr)||(0,Tc.Z)(hr))&&(Qo=(0,wl.Z)(li))):ws=!1}ws&&(Gn.set(li,Qo),at(Qo,li,Ee,Ft,Gn),Gn.delete(li)),yi(I,B,Qo)}},Vc=function Ac(I,z,B,Ee,at){I!==z&&Oa(z,function(Ft,Gn){if(at||(at=new yt.Z),(0,Vu.Z)(Ft))yd(I,z,Gn,B,Ac,Ee,at);else{var hr=Ee?Ee(Mc(I,Gn),Ft,Gn+"",I,z,at):void 0;void 0===hr&&(hr=Ft),yi(I,Gn,hr)}},Pu.Z)},Oc=function pf(I,z,B,Ee,at,Ft){return(0,Vu.Z)(I)&&(0,Vu.Z)(z)&&(Ft.set(z,I),Vc(I,z,void 0,pf,Ft),Ft.delete(z)),I};var hf=i(28078);const su=function(I,z,B){if(!(0,Vu.Z)(B))return!1;var Ee=typeof z;return!!("number"==Ee?(0,Ha.Z)(B)&&(0,hf.Z)(z,B.length):"string"==Ee&&z in B)&&(0,Un.Z)(B[z],I)},_f=function(I){return it(function(z,B){var Ee=-1,at=B.length,Ft=at>1?B[at-1]:void 0,Gn=at>2?B[2]:void 0;for(Ft=I.length>3&&"function"==typeof Ft?(at--,Ft):void 0,Gn&&su(B[0],B[1],Gn)&&(Ft=at<3?void 0:Ft,at=1),z=Object(z);++Ee<at;){var hr=B[Ee];hr&&I(z,hr,Ee,Ft)}return z})}(function(I,z,B,Ee){Vc(I,z,B,Ee)}),Kl=it(function(I){return I.push(void 0,Oc),ll(_f,void 0,I)}),Xf=function(I){return"symbol"==typeof I||(0,nl.Z)(I)&&"[object Symbol]"==(0,Sc.Z)(I)};var Rd=/\.|\[(?:[^[\]]*|(["'])(?:(?!\1)[^\\]|\\.)*?\1)\]/,wc=/^\w*$/;const Ji=function(I,z){if((0,$a.Z)(I))return!1;var B=typeof I;return!("number"!=B&&"symbol"!=B&&"boolean"!=B&&null!=I&&!Xf(I))||wc.test(I)||!Rd.test(I)||null!=z&&I in Object(z)};var cl=i(79489);function Nd(I,z){if("function"!=typeof I||null!=z&&"function"!=typeof z)throw new TypeError("Expected a function");var B=function(){var Ee=arguments,at=z?z.apply(this,Ee):Ee[0],Ft=B.cache;if(Ft.has(at))return Ft.get(at);var Gn=I.apply(this,Ee);return B.cache=Ft.set(at,Gn)||Ft,Gn};return B.cache=new(Nd.Cache||cl.Z),B}Nd.Cache=cl.Z;var wf=/[^.[\]]+|\[(?:(-?\d+(?:\.\d+)?)|(["'])((?:(?!\2)[^\\]|\\.)*?)\2)\]|(?=(?:\.|\[\])(?:\.|\[\]|$))/g,Wl=/\\(\\)?/g;const rc=(z=Nd(function(I){var z=[];return 46===I.charCodeAt(0)&&z.push(""),I.replace(wf,function(B,Ee,at,Ft){z.push(at?Ft.replace(Wl,"$1"):Ee||B)}),z},function(Ee){return 500===B.size&&B.clear(),Ee}),B=z.cache,z);var z,B,hc=i(35770);const Cc=function(I,z){for(var B=-1,Ee=null==I?0:I.length,at=Array(Ee);++B<Ee;)at[B]=z(I[B],B,I);return at};var fu=hc.Z?hc.Z.prototype:void 0,Id=fu?fu.toString:void 0;const kc=function Sl(I){if("string"==typeof I)return I;if((0,$a.Z)(I))return Cc(I,Sl)+"";if(Xf(I))return Id?Id.call(I):"";var z=I+"";return"0"==z&&1/I==-1/0?"-0":z},h=function(I){return null==I?"":kc(I)},N=function(I,z){return(0,$a.Z)(I)?I:Ji(I,z)?[I]:rc(h(I))},de=function(I){if("string"==typeof I||Xf(I))return I;var z=I+"";return"0"==z&&1/I==-1/0?"-0":z},Ue=function(I,z){for(var B=0,Ee=(z=N(z,I)).length;null!=I&&B<Ee;)I=I[de(z[B++])];return B&&B==Ee?I:void 0},Xe=function(I,z,B){var Ee=null==I?void 0:Ue(I,z);return void 0===Ee?B:Ee};var gt=i(57765);const Jt=function(I){var z=null==I?0:I.length;return z?I[z-1]:void 0},jr=function(I,z){return z.length<2?I:Ue(I,function(I,z,B){var Ee=-1,at=I.length;z<0&&(z=-z>at?0:at+z),(B=B>at?at:B)<0&&(B+=at),at=z>B?0:B-z>>>0,z>>>=0;for(var Ft=Array(at);++Ee<at;)Ft[Ee]=I[Ee+z];return Ft}(z,0,-1))},Vo=function(I,z){return z=N(z,I),null==(I=jr(I,z))||delete I[de(Jt(z))]},Vs=function(I){return Qa(I)?void 0:I};var qs=i(57052),dl=hc.Z?hc.Z.isConcatSpreadable:void 0;const sa=function(I){return(0,$a.Z)(I)||(0,tl.Z)(I)||!!(dl&&I&&I[dl])},ol=function Pa(I,z,B,Ee,at){var Ft=-1,Gn=I.length;for(B||(B=sa),at||(at=[]);++Ft<Gn;){var hr=I[Ft];z>0&&B(hr)?z>1?Pa(hr,z-1,B,Ee,at):(0,qs.Z)(at,hr):Ee||(at[at.length]=hr)}return at},wa=function(I){return null!=I&&I.length?ol(I,1):[]},mu=function(I){return Pe(Il(I,void 0,wa),I+"")};var xc=i(23359);const ye=mu(function(I,z){var B={};if(null==I)return B;var Ee=!1;z=Cc(z,function(Ft){return Ft=N(Ft,I),Ee||(Ee=Ft.length>1),Ft}),(0,Ou.Z)(I,(0,xc.Z)(I),B),Ee&&(B=(0,gt.Z)(B,7,Vs));for(var at=z.length;at--;)Vo(B,z[at]);return B}),vi=function(I,z){for(var B=-1,Ee=null==I?0:I.length;++B<Ee;)if(z(I[B],B,I))return!0;return!1};function Wc(I){var z=-1,B=null==I?0:I.length;for(this.__data__=new cl.Z;++z<B;)this.add(I[z])}Wc.prototype.add=Wc.prototype.push=function(I){return this.__data__.set(I,"__lodash_hash_undefined__"),this},Wc.prototype.has=function(I){return this.__data__.has(I)};const Kf=Wc,$p=function(I,z){return I.has(z)},dd=function(I,z,B,Ee,at,Ft){var Gn=1&B,hr=I.length,li=z.length;if(hr!=li&&!(Gn&&li>hr))return!1;var Io=Ft.get(I),Qo=Ft.get(z);if(Io&&Qo)return Io==z&&Qo==I;var ws=-1,Rl=!0,Tu=2&B?new Kf:void 0;for(Ft.set(I,z),Ft.set(z,I);++ws<hr;){var tu=I[ws],Qu=z[ws];if(Ee)var Zd=Gn?Ee(Qu,tu,ws,z,I,Ft):Ee(tu,Qu,ws,I,z,Ft);if(void 0!==Zd){if(Zd)continue;Rl=!1;break}if(Tu){if(!vi(z,function(Bc,Ap){if(!$p(Tu,Ap)&&(tu===Bc||at(tu,Bc,B,Ee,Ft)))return Tu.push(Ap)})){Rl=!1;break}}else if(tu!==Qu&&!at(tu,Qu,B,Ee,Ft)){Rl=!1;break}}return Ft.delete(I),Ft.delete(z),Rl};var Fd=i(83345);const fl=function(I){var z=-1,B=Array(I.size);return I.forEach(function(Ee,at){B[++z]=[at,Ee]}),B},F_=function(I){var z=-1,B=Array(I.size);return I.forEach(function(Ee){B[++z]=Ee}),B};var Up=hc.Z?hc.Z.prototype:void 0,nh=Up?Up.valueOf:void 0;var Dh=i(22018),Bf=Object.prototype.hasOwnProperty;var rh=i(81901),qh="[object Arguments]",Y="[object Array]",fe="[object Object]",q=Object.prototype.hasOwnProperty;const ut=function(I,z,B,Ee,at,Ft){var Gn=(0,$a.Z)(I),hr=(0,$a.Z)(z),li=Gn?Y:(0,rh.Z)(I),Io=hr?Y:(0,rh.Z)(z),Qo=(li=li==qh?fe:li)==fe,ws=(Io=Io==qh?fe:Io)==fe,Rl=li==Io;if(Rl&&(0,Jd.Z)(I)){if(!(0,Jd.Z)(z))return!1;Gn=!0,Qo=!1}if(Rl&&!Qo)return Ft||(Ft=new yt.Z),Gn||(0,Wu.Z)(I)?dd(I,z,B,Ee,at,Ft):function(I,z,B,Ee,at,Ft,Gn){switch(B){case"[object DataView]":if(I.byteLength!=z.byteLength||I.byteOffset!=z.byteOffset)return!1;I=I.buffer,z=z.buffer;case"[object ArrayBuffer]":return!(I.byteLength!=z.byteLength||!Ft(new Fd.Z(I),new Fd.Z(z)));case"[object Boolean]":case"[object Date]":case"[object Number]":return(0,Un.Z)(+I,+z);case"[object Error]":return I.name==z.name&&I.message==z.message;case"[object RegExp]":case"[object String]":return I==z+"";case"[object Map]":var hr=fl;case"[object Set]":if(hr||(hr=F_),I.size!=z.size&&!(1&Ee))return!1;var Io=Gn.get(I);if(Io)return Io==z;Ee|=2,Gn.set(I,z);var Qo=dd(hr(I),hr(z),Ee,at,Ft,Gn);return Gn.delete(I),Qo;case"[object Symbol]":if(nh)return nh.call(I)==nh.call(z)}return!1}(I,z,li,B,Ee,at,Ft);if(!(1&B)){var Tu=Qo&&q.call(I,"__wrapped__"),tu=ws&&q.call(z,"__wrapped__");if(Tu||tu){var Qu=Tu?I.value():I,Zd=tu?z.value():z;return Ft||(Ft=new yt.Z),at(Qu,Zd,B,Ee,Ft)}}return!!Rl&&(Ft||(Ft=new yt.Z),function(I,z,B,Ee,at,Ft){var Gn=1&B,hr=(0,Dh.Z)(I),li=hr.length;if(li!=(0,Dh.Z)(z).length&&!Gn)return!1;for(var ws=li;ws--;){var Rl=hr[ws];if(!(Gn?Rl in z:Bf.call(z,Rl)))return!1}var Tu=Ft.get(I),tu=Ft.get(z);if(Tu&&tu)return Tu==z&&tu==I;var Qu=!0;Ft.set(I,z),Ft.set(z,I);for(var Zd=Gn;++ws<li;){var Bc=I[Rl=hr[ws]],Ap=z[Rl];if(Ee)var K_=Gn?Ee(Ap,Bc,Rl,z,I,Ft):Ee(Bc,Ap,Rl,I,z,Ft);if(!(void 0===K_?Bc===Ap||at(Bc,Ap,B,Ee,Ft):K_)){Qu=!1;break}Zd||(Zd="constructor"==Rl)}if(Qu&&!Zd){var q_=I.constructor,ef=z.constructor;q_!=ef&&"constructor"in I&&"constructor"in z&&!("function"==typeof q_&&q_ instanceof q_&&"function"==typeof ef&&ef instanceof ef)&&(Qu=!1)}return Ft.delete(I),Ft.delete(z),Qu}(I,z,B,Ee,at,Ft))},Fr=function Xn(I,z,B,Ee,at){return I===z||(null==I||null==z||!(0,nl.Z)(I)&&!(0,nl.Z)(z)?I!=I&&z!=z:ut(I,z,B,Ee,Xn,at))},Is=function(I){return I==I&&!(0,Vu.Z)(I)};var ya=i(6251);const wu=function(I,z){return function(B){return null!=B&&B[I]===z&&(void 0!==z||I in Object(B))}},$_=function(I){var z=function(I){for(var z=(0,ya.Z)(I),B=z.length;B--;){var Ee=z[B],at=I[Ee];z[B]=[Ee,at,Is(at)]}return z}(I);return 1==z.length&&z[0][2]?wu(z[0][0],z[0][1]):function(B){return B===I||function(I,z,B,Ee){var at=B.length,Ft=at,Gn=!Ee;if(null==I)return!Ft;for(I=Object(I);at--;){var hr=B[at];if(Gn&&hr[2]?hr[1]!==I[hr[0]]:!(hr[0]in I))return!1}for(;++at<Ft;){var li=(hr=B[at])[0],Io=I[li],Qo=hr[1];if(Gn&&hr[2]){if(void 0===Io&&!(li in I))return!1}else{var ws=new yt.Z;if(Ee)var Rl=Ee(Io,Qo,li,I,z,ws);if(!(void 0===Rl?Fr(Qo,Io,3,Ee,ws):Rl))return!1}}return!0}(B,I,z)}},oh=function(I,z){return null!=I&&z in Object(I)};var hp=i(19238);const _p=function(I,z){return null!=I&&function(I,z,B){for(var Ee=-1,at=(z=N(z,I)).length,Ft=!1;++Ee<at;){var Gn=de(z[Ee]);if(!(Ft=null!=I&&B(I,Gn)))break;I=I[Gn]}return Ft||++Ee!=at?Ft:!!(at=null==I?0:I.length)&&(0,hp.Z)(at)&&(0,hf.Z)(Gn,at)&&((0,$a.Z)(I)||(0,tl.Z)(I))}(I,z,oh)},sh=function(I){return Ji(I)?function(I){return function(z){return null==z?void 0:z[I]}}(de(I)):function(I){return function(z){return Ue(z,I)}}(I)},id=function(I){return"function"==typeof I?I:null==I?Xs:"object"==typeof I?(0,$a.Z)(I)?function(I,z){return Ji(I)&&Is(z)?wu(de(I),z):function(B){var Ee=Xe(B,I);return void 0===Ee&&Ee===z?_p(B,I):Fr(z,Ee,3)}}(I[0],I[1]):$_(I):sh(I)},Ta=function(B,Ee){if(null==B)return B;if(!(0,Ha.Z)(B))return function(I,z){return I&&Oa(I,z,ya.Z)}(B,Ee);for(var at=B.length,Ft=-1,Gn=Object(B);++Ft<at&&!1!==Ee(Gn[Ft],Ft,Gn););return B},Ju=function(I,z){var B;return Ta(I,function(Ee,at,Ft){return!(B=z(Ee,at,Ft))}),!!B},Yu=function(I,z){for(var B=-1,Ee=null==I?0:I.length;++B<Ee;)if(!z(I[B],B,I))return!1;return!0},Bp=function(I,z){var B=!0;return Ta(I,function(Ee,at,Ft){return B=!!z(Ee,at,Ft)}),B},Z_=function(I){return I&&I.length?I[0]:void 0},Nh=function(I){for(var z=-1,B=null==I?0:I.length,Ee=0,at=[];++z<B;){var Ft=I[z];Ft&&(at[Ee++]=Ft)}return at},G_=function(I,z,B,Ee){for(var at=I.length,Ft=B+(Ee?1:-1);Ee?Ft--:++Ft<at;)if(z(I[Ft],Ft,I))return Ft;return-1};var od=/\s/;var Ih=/^\s+/;const mg=function(I){return I&&I.slice(0,function(I){for(var z=I.length;z--&&od.test(I.charAt(z)););return z}(I)+1).replace(Ih,"")};var Ud=/^[-+]0x[0-9a-f]+$/i,yf=/^0b[01]+$/i,a_=/^0o[0-7]+$/i,vp=parseInt;const yp=function(I){if("number"==typeof I)return I;if(Xf(I))return NaN;if((0,Vu.Z)(I)){var z="function"==typeof I.valueOf?I.valueOf():I;I=(0,Vu.Z)(z)?z+"":z}if("string"!=typeof I)return 0===I?I:+I;I=mg(I);var B=yf.test(I);return B||a_.test(I)?vp(I.slice(2),B?2:8):Ud.test(I)?NaN:+I},sd=function(I){var z=function(I){return I?1/0===(I=yp(I))||-1/0===I?17976931348623157e292*(I<0?-1:1):I==I?I:0:0===I?I:0}(I),B=z%1;return z==z?B?z-B:z:0};var uh=Math.max;const ch=function(z,B,Ee){var at=Object(z);if(!(0,Ha.Z)(z)){var Ft=id(B);z=(0,ya.Z)(z),B=function(hr){return Ft(at[hr],hr,at)}}var Gn=function(I,z,B){var Ee=null==I?0:I.length;if(!Ee)return-1;var at=null==B?0:sd(B);return at<0&&(at=uh(Ee+at,0)),G_(I,id(z),at)}(z,B,Ee);return Gn>-1?at[Ft?z[Gn]:Gn]:void 0},Rf=function(I){return"string"==typeof I||!(0,$a.Z)(I)&&(0,nl.Z)(I)&&"[object String]"==(0,Sc.Z)(I)};var dh=i(40309);const Fh=function(){return dh.Z.Date.now()};var Cm=Math.max,Mm=Math.min;const yg=function(I,z,B){var Ee=!0,at=!0;if("function"!=typeof I)throw new TypeError("Expected a function");return(0,Vu.Z)(B)&&(Ee="leading"in B?!!B.leading:Ee,at="trailing"in B?!!B.trailing:at),function(I,z,B){var Ee,at,Ft,Gn,hr,li,Io=0,Qo=!1,ws=!1,Rl=!0;if("function"!=typeof I)throw new TypeError("Expected a function");function Tu(Xc){var Op=Ee,Zu=at;return Ee=at=void 0,Io=Xc,Gn=I.apply(Zu,Op)}function tu(Xc){return Io=Xc,hr=setTimeout(Bc,z),Qo?Tu(Xc):Gn}function Zd(Xc){var Op=Xc-li;return void 0===li||Op>=z||Op<0||ws&&Xc-Io>=Ft}function Bc(){var Xc=Fh();if(Zd(Xc))return Ap(Xc);hr=setTimeout(Bc,function(Xc){var Rc=z-(Xc-li);return ws?Mm(Rc,Ft-(Xc-Io)):Rc}(Xc))}function Ap(Xc){return hr=void 0,Rl&&Ee?Tu(Xc):(Ee=at=void 0,Gn)}function ef(){var Xc=Fh(),Op=Zd(Xc);if(Ee=arguments,at=this,li=Xc,Op){if(void 0===hr)return tu(li);if(ws)return clearTimeout(hr),hr=setTimeout(Bc,z),Tu(li)}return void 0===hr&&(hr=setTimeout(Bc,z)),Gn}return z=yp(z)||0,(0,Vu.Z)(B)&&(Qo=!!B.leading,Ft=(ws="maxWait"in B)?Cm(yp(B.maxWait)||0,z):Ft,Rl="trailing"in B?!!B.trailing:Rl),ef.cancel=function(){void 0!==hr&&clearTimeout(hr),Io=0,Ee=li=at=hr=void 0},ef.flush=function(){return void 0===hr?Gn:Ap(Fh())},ef}(I,z,{leading:Ee,maxWait:z,trailing:at})},bg=function(I){return I!=I},Am=function(I){return null==I?[]:function(I,z){return Cc(z,function(B){return I[B]})}(I,(0,ya.Z)(I))};var Yd=Math.max;const Hg=function(I,z,B,Ee){I=(0,Ha.Z)(I)?I:Am(I),B=B&&!Ee?sd(B):0;var at=I.length;return B<0&&(B=Yd(at+B,0)),Rf(I)?B<=at&&I.indexOf(z,B)>-1:!!at&&function(I,z,B){return z==z?function(I,z,B){for(var Ee=B-1,at=I.length;++Ee<at;)if(I[Ee]===z)return Ee;return-1}(I,z,B):G_(I,bg,B)}(I,z,B)>-1};var Tp=i(15427);const Qc=function(I,z,B,Ee){if(!(0,Vu.Z)(I))return I;for(var at=-1,Ft=(z=N(z,I)).length,Gn=Ft-1,hr=I;null!=hr&&++at<Ft;){var li=de(z[at]),Io=B;if("__proto__"===li||"constructor"===li||"prototype"===li)return I;if(at!=Gn){var Qo=hr[li];void 0===(Io=Ee?Ee(Qo,li,hr):void 0)&&(Io=(0,Vu.Z)(Qo)?Qo:(0,hf.Z)(z[at+1])?[]:{})}(0,Tp.Z)(hr,li,Io),hr=hr[li]}return I},Sg=function(I,z){return function(I,z,B){for(var Ee=-1,at=z.length,Ft={};++Ee<at;){var Gn=z[Ee],hr=Ue(I,Gn);B(hr,Gn)&&Qc(Ft,N(Gn,I),hr)}return Ft}(I,z,function(B,Ee){return _p(I,Ee)})},p_=mu(function(I,z){return null==I?{}:Sg(I,z)});function h_(I,z){1&I&&(r.TgZ(0,"span"),r._uU(1,"loading..."),r.qZA())}const Hh=function(I){return{$implicit:I}};function __(I,z){if(1&I&&(r.ynx(0),r.TgZ(1,"div"),r.Hsn(2),r.qZA(),r.BQk()),2&I){const B=r.oxw();r.xp6(1),r.Udp("height",B.getTotalHeight())}}const Zp=function(){return{dontDetach:!0}},Mg=["*"],g_=["loadingTemplate"],Ug=["treeNodeTemplate"],Uh=["treeNodeWrapperTemplate"],Ag=["treeNodeFullTemplate"],ov=["viewport"],Bh=function(I,z,B,Ee){return{loadingTemplate:I,treeNodeTemplate:z,treeNodeWrapperTemplate:B,treeNodeFullTemplate:Ee}};function Om(I,z){if(1&I&&r._UZ(0,"tree-node-collection",4),2&I){const B=r.oxw();r.Q6J("nodes",B.treeModel.roots)("treeModel",B.treeModel)("templates",r.l5B(3,Bh,B.loadingTemplate,B.treeNodeTemplate,B.treeNodeWrapperTemplate,B.treeNodeFullTemplate))}}function m_(I,z){if(1&I&&r._UZ(0,"tree-node-drop-slot",5),2&I){const B=r.oxw();r.Q6J("dropIndex",0)("node",B.treeModel.virtualRoot)}}function b(I,z){if(1&I&&r._UZ(0,"tree-node-drop-slot",6),2&I){const B=r.oxw(3);r.Q6J("dropIndex",B.node.index)("node",B.node.parent)}}function x(I,z){if(1&I&&(r.TgZ(0,"div"),r.YNc(1,b,1,2,"tree-node-drop-slot",3),r._UZ(2,"tree-node-wrapper",4),r._UZ(3,"tree-node-children",5),r._UZ(4,"tree-node-drop-slot",6),r.qZA()),2&I){const B=r.oxw(2);r.Tol(B.node.getClass()),r.ekj("tree-node",!0)("tree-node-expanded",B.node.isExpanded&&B.node.hasChildren)("tree-node-collapsed",B.node.isCollapsed&&B.node.hasChildren)("tree-node-leaf",B.node.isLeaf)("tree-node-active",B.node.isActive)("tree-node-focused",B.node.isFocused),r.xp6(1),r.Q6J("ngIf",0===B.index),r.xp6(1),r.Q6J("node",B.node)("index",B.index)("templates",B.templates),r.xp6(1),r.Q6J("node",B.node)("templates",B.templates),r.xp6(1),r.Q6J("dropIndex",B.node.index+1)("node",B.node.parent)}}const G=function(I,z,B,Ee){return{$implicit:I,node:z,index:B,templates:Ee}};function Se(I,z){if(1&I&&(r.ynx(0),r.YNc(1,x,5,22,"div",1),r.GkF(2,2),r.BQk()),2&I){const B=r.oxw();r.xp6(1),r.Q6J("ngIf",!B.templates.treeNodeFullTemplate),r.xp6(1),r.Q6J("ngTemplateOutlet",B.templates.treeNodeFullTemplate)("ngTemplateOutletContext",r.l5B(3,G,B.node,B.node,B.index,B.templates))}}function We(I,z){if(1&I&&(r.TgZ(0,"span"),r._uU(1),r.qZA()),2&I){const B=r.oxw();r.xp6(1),r.Oqu(B.node.displayField)}}const Rt=function(I,z,B){return{$implicit:I,node:z,index:B}};function rn(I,z){if(1&I){const B=r.EpF();r.TgZ(0,"span",3),r.NdJ("click",function(at){return r.CHM(B),r.oxw(2).node.mouseAction("expanderClick",at)}),r._UZ(1,"span",4),r.qZA()}if(2&I){const B=r.oxw(2);r.ekj("toggle-children-wrapper-expanded",B.node.isExpanded)("toggle-children-wrapper-collapsed",B.node.isCollapsed)}}function xn(I,z){1&I&&r._UZ(0,"span",5)}function Er(I,z){if(1&I&&(r.ynx(0),r.YNc(1,rn,2,4,"span",1),r.YNc(2,xn,1,0,"span",2),r.BQk()),2&I){const B=r.oxw();r.xp6(1),r.Q6J("ngIf",B.node.hasChildren),r.xp6(1),r.Q6J("ngIf",!B.node.hasChildren)}}function Ei(I,z){if(1&I&&r._UZ(0,"tree-node-collection",4),2&I){const B=r.oxw(3);r.Q6J("nodes",B.node.children)("templates",B.templates)("treeModel",B.node.treeModel)}}function fs(I,z){if(1&I&&r._UZ(0,"tree-loading-component",5),2&I){const B=r.oxw(3);r.Udp("padding-left",B.node.getNodePadding()),r.Q6J("template",B.templates.loadingTemplate)("node",B.node)}}function Ua(I,z){if(1&I&&(r.TgZ(0,"div"),r.YNc(1,Ei,1,3,"tree-node-collection",2),r.YNc(2,fs,1,4,"tree-loading-component",3),r.qZA()),2&I){const B=r.oxw(2);r.ekj("tree-children",!0)("tree-children-no-padding",B.node.options.levelPadding),r.xp6(1),r.Q6J("ngIf",B.node.children),r.xp6(1),r.Q6J("ngIf",!B.node.children)}}function mo(I,z){if(1&I&&(r.ynx(0),r.YNc(1,Ua,3,6,"div",1),r.BQk()),2&I){const B=r.oxw();r.xp6(1),r.Q6J("treeAnimateOpen",B.node.isExpanded)("treeAnimateOpenSpeed",B.node.options.animateSpeed)("treeAnimateOpenAcceleration",B.node.options.animateAcceleration)("treeAnimateOpenEnabled",B.node.options.animateExpand)}}function _o(I,z){if(1&I&&r._UZ(0,"tree-node",2),2&I){const B=z.$implicit,Ee=z.index,at=r.oxw(2);r.Q6J("node",B)("index",Ee)("templates",at.templates)}}function La(I,z){if(1&I&&(r.ynx(0),r.TgZ(1,"div"),r.YNc(2,_o,1,3,"tree-node",1),r.qZA(),r.BQk()),2&I){const B=r.oxw();r.xp6(1),r.Udp("margin-top",B.marginTop),r.xp6(1),r.Q6J("ngForOf",B.viewportNodes)("ngForTrackBy",B.trackNode)}}function Sa(I,z){if(1&I&&r._UZ(0,"tree-node-checkbox",4),2&I){const B=r.oxw(2);r.Q6J("node",B.node)}}function ti(I,z){if(1&I){const B=r.EpF();r.TgZ(0,"div",2),r.YNc(1,Sa,1,1,"tree-node-checkbox",3),r._UZ(2,"tree-node-expander",4),r.TgZ(3,"div",5),r.NdJ("click",function(at){return r.CHM(B),r.oxw().node.mouseAction("click",at)})("dblclick",function(at){return r.CHM(B),r.oxw().node.mouseAction("dblClick",at)})("mouseover",function(at){return r.CHM(B),r.oxw().node.mouseAction("mouseOver",at)})("mouseout",function(at){return r.CHM(B),r.oxw().node.mouseAction("mouseOut",at)})("contextmenu",function(at){return r.CHM(B),r.oxw().node.mouseAction("contextMenu",at)})("treeDrop",function(at){return r.CHM(B),r.oxw().node.onDrop(at)})("treeDropDragOver",function(at){return r.CHM(B),r.oxw().node.mouseAction("dragOver",at)})("treeDropDragLeave",function(at){return r.CHM(B),r.oxw().node.mouseAction("dragLeave",at)})("treeDropDragEnter",function(at){return r.CHM(B),r.oxw().node.mouseAction("dragEnter",at)}),r._UZ(4,"tree-node-content",6),r.qZA(),r.qZA()}if(2&I){const B=r.oxw();r.Udp("padding-left",B.node.getNodePadding()),r.xp6(1),r.Q6J("ngIf",B.node.options.useCheckbox),r.xp6(1),r.Q6J("node",B.node),r.xp6(1),r.ekj("node-content-wrapper-active",B.node.isActive)("node-content-wrapper-focused",B.node.isFocused),r.Q6J("treeAllowDrop",B.node.allowDrop)("allowDragoverStyling",B.node.allowDragoverStyling())("treeDrag",B.node)("treeDragEnabled",B.node.allowDrag()),r.xp6(1),r.Q6J("node",B.node)("index",B.index)("template",B.templates.treeNodeTemplate)}}function Sr(I,z){if(1&I){const B=r.EpF();r.ynx(0),r.TgZ(1,"input",1),r.NdJ("click",function(at){return r.CHM(B),r.oxw().node.mouseAction("checkboxClick",at)}),r.qZA(),r.BQk()}if(2&I){const B=r.oxw();r.xp6(1),r.Q6J("checked",B.node.isSelected)("indeterminate",B.node.isPartiallySelected)}}let Wr=(()=>{class I{constructor(B,Ee){this.templateRef=B,this.viewContainer=Ee,this.templateBindings={}}ngOnInit(){this.view=this.viewContainer.createEmbeddedView(this.templateRef),this.dispose&&this.dispose(),this.shouldDetach()&&this.view.detach(),this.autoDetect(this.view)}shouldDetach(){return this.treeMobxAutorun&&this.treeMobxAutorun.detach}autoDetect(B){this.dispose=ei(()=>B.detectChanges())}ngOnDestroy(){this.dispose&&this.dispose()}}return I.\u0275fac=function(B){return new(B||I)(r.Y36(r.Rgc),r.Y36(r.s_b))},I.\u0275dir=r.lG2({type:I,selectors:[["","treeMobxAutorun",""]],inputs:{treeMobxAutorun:"treeMobxAutorun"}}),I})();const np={TOGGLE_ACTIVE:(I,z,B)=>z&&z.toggleActivated(),TOGGLE_ACTIVE_MULTI:(I,z,B)=>z&&z.toggleActivated(!0),TOGGLE_SELECTED:(I,z,B)=>z&&z.toggleSelected(),ACTIVATE:(I,z,B)=>z.setIsActive(!0),DEACTIVATE:(I,z,B)=>z.setIsActive(!1),SELECT:(I,z,B)=>z.setIsSelected(!0),DESELECT:(I,z,B)=>z.setIsSelected(!1),FOCUS:(I,z,B)=>z.focus(),TOGGLE_EXPANDED:(I,z,B)=>z.hasChildren&&z.toggleExpanded(),EXPAND:(I,z,B)=>z.expand(),COLLAPSE:(I,z,B)=>z.collapse(),DRILL_DOWN:(I,z,B)=>I.focusDrillDown(),DRILL_UP:(I,z,B)=>I.focusDrillUp(),NEXT_NODE:(I,z,B)=>I.focusNextNode(),PREVIOUS_NODE:(I,z,B)=>I.focusPreviousNode(),MOVE_NODE:(I,z,B,{from:Ee,to:at})=>{B.ctrlKey?I.copyNode(Ee,at):I.moveNode(Ee,at)}},lv={mouse:{click:np.TOGGLE_ACTIVE,dblClick:null,contextMenu:null,expanderClick:np.TOGGLE_EXPANDED,checkboxClick:np.TOGGLE_SELECTED,drop:np.MOVE_NODE},keys:{39:np.DRILL_DOWN,37:np.DRILL_UP,40:np.NEXT_NODE,38:np.PREVIOUS_NODE,32:np.TOGGLE_ACTIVE,13:np.TOGGLE_ACTIVE}};class Dm{constructor(z={}){this.options=z,this.actionMapping=Kl({},this.options.actionMapping,lv),z.rtl&&(this.actionMapping.keys[39]=Xe(z,["actionMapping","keys",39])||np.DRILL_UP,this.actionMapping.keys[37]=Xe(z,["actionMapping","keys",37])||np.DRILL_DOWN)}get hasChildrenField(){return this.options.hasChildrenField||"hasChildren"}get childrenField(){return this.options.childrenField||"children"}get displayField(){return this.options.displayField||"name"}get idField(){return this.options.idField||"id"}get isExpandedField(){return this.options.isExpandedField||"isExpanded"}get getChildren(){return this.options.getChildren}get levelPadding(){return this.options.levelPadding||0}get useVirtualScroll(){return this.options.useVirtualScroll}get animateExpand(){return this.options.animateExpand}get animateSpeed(){return this.options.animateSpeed||1}get animateAcceleration(){return this.options.animateAcceleration||1.2}get scrollOnActivate(){return void 0===this.options.scrollOnActivate||this.options.scrollOnActivate}get rtl(){return!!this.options.rtl}get rootId(){return this.options.rootId}get useCheckbox(){return this.options.useCheckbox}get useTriState(){return void 0===this.options.useTriState||this.options.useTriState}get scrollContainer(){return this.options.scrollContainer}get allowDragoverStyling(){return void 0===this.options.allowDragoverStyling||this.options.allowDragoverStyling}getNodeClone(z){return this.options.getNodeClone?this.options.getNodeClone(z):ye(Object.assign({},z.data),["id"])}allowDrop(z,B,Ee){return this.options.allowDrop instanceof Function?this.options.allowDrop(z,B,Ee):void 0===this.options.allowDrop||this.options.allowDrop}allowDrag(z){return this.options.allowDrag instanceof Function?this.options.allowDrag(z):this.options.allowDrag}nodeClass(z){return this.options.nodeClass?this.options.nodeClass(z):""}nodeHeight(z){if(z.data.virtual)return 0;let B=this.options.nodeHeight||22;return"function"==typeof B&&(B=B(z)),B+(0===z.index?2:1)*this.dropSlotHeight}get dropSlotHeight(){return function(I){return"number"==typeof I||(0,nl.Z)(I)&&"[object Number]"==(0,Sc.Z)(I)}(this.options.dropSlotHeight)?this.options.dropSlotHeight:2}}const mc={toggleExpanded:"toggleExpanded",activate:"activate",deactivate:"deactivate",nodeActivate:"nodeActivate",nodeDeactivate:"nodeDeactivate",select:"select",deselect:"deselect",focus:"focus",blur:"blur",initialized:"initialized",updateData:"updateData",moveNode:"moveNode",copyNode:"copyNode",event:"event",loadNodeChildren:"loadNodeChildren",changeFilter:"changeFilter",stateChange:"stateChange"};var qd=function(I,z,B,Ee){var Gn,at=arguments.length,Ft=at<3?z:null===Ee?Ee=Object.getOwnPropertyDescriptor(z,B):Ee;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)Ft=Reflect.decorate(I,z,B,Ee);else for(var hr=I.length-1;hr>=0;hr--)(Gn=I[hr])&&(Ft=(at<3?Gn(Ft):at>3?Gn(z,B,Ft):Gn(z,B))||Ft);return at>3&&Ft&&Object.defineProperty(z,B,Ft),Ft},Iu=function(I,z){if("object"==typeof Reflect&&"function"==typeof Reflect.metadata)return Reflect.metadata(I,z)};let p1=(()=>{class I{constructor(B,Ee,at,Ft){this.data=B,this.parent=Ee,this.treeModel=at,this.position=0,this.allowDrop=(Gn,hr)=>this.options.allowDrop(Gn,{parent:this,index:0},hr),this.allowDragoverStyling=()=>this.options.allowDragoverStyling,null==this.id&&(this.id=Math.floor(1e13*Math.random())),this.index=Ft,this.getField("children")&&this._initChildren(),this.autoLoadChildren()}get isHidden(){return this.treeModel.isHidden(this)}get isExpanded(){return this.treeModel.isExpanded(this)}get isActive(){return this.treeModel.isActive(this)}get isFocused(){return this.treeModel.isNodeFocused(this)}get isSelected(){return this.isSelectable()?this.treeModel.isSelected(this):function(I,z,B){var Ee=(0,$a.Z)(I)?vi:Ju;return B&&su(I,z,B)&&(z=void 0),Ee(I,id(z))}(this.children,B=>B.isSelected)}get isAllSelected(){return this.isSelectable()?this.treeModel.isSelected(this):function(I,z,B){var Ee=(0,$a.Z)(I)?Yu:Bp;return B&&su(I,z,B)&&(z=void 0),Ee(I,id(z))}(this.children,B=>B.isAllSelected)}get isPartiallySelected(){return this.isSelected&&!this.isAllSelected}get level(){return this.parent?this.parent.level+1:0}get path(){return this.parent?[...this.parent.path,this.id]:[]}get elementRef(){throw"Element Ref is no longer supported since introducing virtual scroll\n\n      You may use a template to obtain a reference to the element"}get originalNode(){return this._originalNode}get hasChildren(){return!!(this.getField("hasChildren")||this.children&&this.children.length>0)}get isCollapsed(){return!this.isExpanded}get isLeaf(){return!this.hasChildren}get isRoot(){return this.parent.data.virtual}get realParent(){return this.isRoot?null:this.parent}get options(){return this.treeModel.options}fireEvent(B){this.treeModel.fireEvent(B)}get displayField(){return this.getField("display")}get id(){return this.getField("id")}set id(B){this.setField("id",B)}getField(B){return this.data[this.options[`${B}Field`]]}setField(B,Ee){this.data[this.options[`${B}Field`]]=Ee}_findAdjacentSibling(B,Ee=!1){const at=this._getParentsChildren(Ee),Ft=at.indexOf(this);return at.length>Ft+B?at[Ft+B]:null}findNextSibling(B=!1){return this._findAdjacentSibling(1,B)}findPreviousSibling(B=!1){return this._findAdjacentSibling(-1,B)}getVisibleChildren(){return this.visibleChildren}get visibleChildren(){return(this.children||[]).filter(B=>!B.isHidden)}getFirstChild(B=!1){return Z_((B?this.visibleChildren:this.children)||[])}getLastChild(B=!1){return Jt((B?this.visibleChildren:this.children)||[])}findNextNode(B=!0,Ee=!1){return B&&this.isExpanded&&this.getFirstChild(Ee)||this.findNextSibling(Ee)||this.parent&&this.parent.findNextNode(!1,Ee)}findPreviousNode(B=!1){let Ee=this.findPreviousSibling(B);return Ee?Ee._getLastOpenDescendant(B):this.realParent}_getLastOpenDescendant(B=!1){const Ee=this.getLastChild(B);return this.isCollapsed||!Ee?this:Ee._getLastOpenDescendant(B)}_getParentsChildren(B=!1){return this.parent&&(B?this.parent.getVisibleChildren():this.parent.children)||[]}getIndexInParent(B=!1){return this._getParentsChildren(B).indexOf(this)}isDescendantOf(B){return this===B||this.parent&&this.parent.isDescendantOf(B)}getNodePadding(){return this.options.levelPadding*(this.level-1)+"px"}getClass(){return[this.options.nodeClass(this),`tree-node-level-${this.level}`].join(" ")}onDrop(B){this.mouseAction("drop",B.event,{from:B.element,to:{parent:this,index:0,dropOnNode:!0}})}allowDrag(){return this.options.allowDrag(this)}loadNodeChildren(){return this.options.getChildren?Promise.resolve(this.options.getChildren(this)).then(B=>{B&&(this.setField("children",B),this._initChildren(),this.options.useTriState&&this.treeModel.isSelected(this)&&this.setIsSelected(!0),this.children.forEach(Ee=>{Ee.getField("isExpanded")&&Ee.hasChildren&&Ee.expand()}))}).then(()=>{this.fireEvent({eventName:mc.loadNodeChildren,node:this})}):Promise.resolve()}expand(){return this.isExpanded||this.toggleExpanded(),this}collapse(){return this.isExpanded&&this.toggleExpanded(),this}doForAll(B){Promise.resolve(B(this)).then(()=>{this.children&&this.children.forEach(Ee=>Ee.doForAll(B))})}expandAll(){this.doForAll(B=>B.expand())}collapseAll(){this.doForAll(B=>B.collapse())}ensureVisible(){return this.realParent&&(this.realParent.expand(),this.realParent.ensureVisible()),this}toggleExpanded(){return this.setIsExpanded(!this.isExpanded),this}setIsExpanded(B){return this.hasChildren&&this.treeModel.setExpandedNode(this,B),this}autoLoadChildren(){this.handler=os(()=>this.isExpanded,B=>{!this.children&&this.hasChildren&&B&&this.loadNodeChildren()},{fireImmediately:!0})}dispose(){this.children&&this.children.forEach(B=>B.dispose()),this.handler&&this.handler(),this.parent=null,this.children=null}setIsActive(B,Ee=!1){return this.treeModel.setActiveNode(this,B,Ee),B&&this.focus(this.options.scrollOnActivate),this}isSelectable(){return this.isLeaf||!this.children||!this.options.useTriState}setIsSelected(B){return this.isSelectable()?this.treeModel.setSelectedNode(this,B):this.visibleChildren.forEach(Ee=>Ee.setIsSelected(B)),this}toggleSelected(){return this.setIsSelected(!this.isSelected),this}toggleActivated(B=!1){return this.setIsActive(!this.isActive,B),this}setActiveAndVisible(B=!1){return this.setIsActive(!0,B).ensureVisible(),setTimeout(this.scrollIntoView.bind(this)),this}scrollIntoView(B=!1){this.treeModel.virtualScroll.scrollIntoView(this,B)}focus(B=!0){let Ee=this.treeModel.getFocusedNode();return this.treeModel.setFocusedNode(this),B&&this.scrollIntoView(),Ee&&this.fireEvent({eventName:mc.blur,node:Ee}),this.fireEvent({eventName:mc.focus,node:this}),this}blur(){let B=this.treeModel.getFocusedNode();return this.treeModel.setFocusedNode(null),B&&this.fireEvent({eventName:mc.blur,node:this}),this}setIsHidden(B){this.treeModel.setIsHidden(this,B)}hide(){this.setIsHidden(!0)}show(){this.setIsHidden(!1)}mouseAction(B,Ee,at=null){this.treeModel.setFocus(!0);const Gn=this.options.actionMapping.mouse[B];Gn&&Gn(this.treeModel,this,Ee,at)}getSelfHeight(){return this.options.nodeHeight(this)}_initChildren(){this.children=this.getField("children").map((B,Ee)=>new I(B,this,this.treeModel,Ee))}}return qd([si,Iu("design:type",Object),Iu("design:paramtypes",[])],I.prototype,"isHidden",null),qd([si,Iu("design:type",Object),Iu("design:paramtypes",[])],I.prototype,"isExpanded",null),qd([si,Iu("design:type",Object),Iu("design:paramtypes",[])],I.prototype,"isActive",null),qd([si,Iu("design:type",Object),Iu("design:paramtypes",[])],I.prototype,"isFocused",null),qd([si,Iu("design:type",Object),Iu("design:paramtypes",[])],I.prototype,"isSelected",null),qd([si,Iu("design:type",Object),Iu("design:paramtypes",[])],I.prototype,"isAllSelected",null),qd([si,Iu("design:type",Object),Iu("design:paramtypes",[])],I.prototype,"isPartiallySelected",null),qd([mr,Iu("design:type",Array)],I.prototype,"children",void 0),qd([mr,Iu("design:type",Number)],I.prototype,"index",void 0),qd([mr,Iu("design:type",Object)],I.prototype,"position",void 0),qd([mr,Iu("design:type",Number)],I.prototype,"height",void 0),qd([si,Iu("design:type",Number),Iu("design:paramtypes",[])],I.prototype,"level",null),qd([si,Iu("design:type",Array),Iu("design:paramtypes",[])],I.prototype,"path",null),qd([si,Iu("design:type",Object),Iu("design:paramtypes",[])],I.prototype,"visibleChildren",null),qd([ne,Iu("design:type",Function),Iu("design:paramtypes",[Object]),Iu("design:returntype",void 0)],I.prototype,"setIsSelected",null),qd([ne,Iu("design:type",Function),Iu("design:paramtypes",[]),Iu("design:returntype",void 0)],I.prototype,"_initChildren",null),I})();var vu=function(I,z,B,Ee){var Gn,at=arguments.length,Ft=at<3?z:null===Ee?Ee=Object.getOwnPropertyDescriptor(z,B):Ee;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)Ft=Reflect.decorate(I,z,B,Ee);else for(var hr=I.length-1;hr>=0;hr--)(Gn=I[hr])&&(Ft=(at<3?Gn(Ft):at>3?Gn(z,B,Ft):Gn(z,B))||Ft);return at>3&&Ft&&Object.defineProperty(z,B,Ft),Ft},es=function(I,z){if("object"==typeof Reflect&&"function"==typeof Reflect.metadata)return Reflect.metadata(I,z)};let eu=(()=>{class I{constructor(){this.options=new Dm,this.eventNames=Object.keys(mc),this.expandedNodeIds={},this.selectedLeafNodeIds={},this.activeNodeIds={},this.hiddenNodeIds={},this.focusedNodeId=null,this.firstUpdate=!0,this.subscriptions=[]}fireEvent(B){B.treeModel=this,this.events[B.eventName].emit(B),this.events.event.emit(B)}subscribe(B,Ee){const at=this.events[B].subscribe(Ee);this.subscriptions.push(at)}getFocusedNode(){return this.focusedNode}getActiveNode(){return this.activeNodes[0]}getActiveNodes(){return this.activeNodes}getVisibleRoots(){return this.virtualRoot.visibleChildren}getFirstRoot(B=!1){return Z_(B?this.getVisibleRoots():this.roots)}getLastRoot(B=!1){return Jt(B?this.getVisibleRoots():this.roots)}get isFocused(){return I.focusedTree===this}isNodeFocused(B){return this.focusedNode===B}isEmptyTree(){return this.roots&&0===this.roots.length}get focusedNode(){return this.focusedNodeId?this.getNodeById(this.focusedNodeId):null}get expandedNodes(){const B=Object.keys(this.expandedNodeIds).filter(Ee=>this.expandedNodeIds[Ee]).map(Ee=>this.getNodeById(Ee));return Nh(B)}get activeNodes(){const B=Object.keys(this.activeNodeIds).filter(Ee=>this.activeNodeIds[Ee]).map(Ee=>this.getNodeById(Ee));return Nh(B)}get hiddenNodes(){const B=Object.keys(this.hiddenNodeIds).filter(Ee=>this.hiddenNodeIds[Ee]).map(Ee=>this.getNodeById(Ee));return Nh(B)}get selectedLeafNodes(){const B=Object.keys(this.selectedLeafNodeIds).filter(Ee=>this.selectedLeafNodeIds[Ee]).map(Ee=>this.getNodeById(Ee));return Nh(B)}getNodeByPath(B,Ee=null){if(!B)return null;if(Ee=Ee||this.virtualRoot,0===B.length)return Ee;if(!Ee.children)return null;const at=B.shift(),Ft=ch(Ee.children,{id:at});return Ft?this.getNodeByPath(B,Ft):null}getNodeById(B){const Ee=B.toString();return this.getNodeBy(at=>at.id.toString()===Ee)}getNodeBy(B,Ee=null){if(!(Ee=Ee||this.virtualRoot).children)return null;const at=ch(Ee.children,B);if(at)return at;for(let Ft of Ee.children){const Gn=this.getNodeBy(B,Ft);if(Gn)return Gn}}isExpanded(B){return this.expandedNodeIds[B.id]}isHidden(B){return this.hiddenNodeIds[B.id]}isActive(B){return this.activeNodeIds[B.id]}isSelected(B){return this.selectedLeafNodeIds[B.id]}ngOnDestroy(){this.dispose(),this.unsubscribeAll()}dispose(){this.virtualRoot&&this.virtualRoot.dispose()}unsubscribeAll(){this.subscriptions.forEach(B=>B.unsubscribe()),this.subscriptions=[]}setData({nodes:B,options:Ee=null,events:at=null}){Ee&&(this.options=new Dm(Ee)),at&&(this.events=at),B&&(this.nodes=B),this.update()}update(){let B={id:this.options.rootId,virtual:!0,[this.options.childrenField]:this.nodes};this.dispose(),this.virtualRoot=new p1(B,null,this,0),this.roots=this.virtualRoot.children,this.firstUpdate?this.roots&&(this.firstUpdate=!1,this._calculateExpandedNodes()):this.fireEvent({eventName:mc.updateData})}setFocusedNode(B){this.focusedNodeId=B?B.id:null}setFocus(B){I.focusedTree=B?this:null}doForAll(B){this.roots.forEach(Ee=>Ee.doForAll(B))}focusNextNode(){let B=this.getFocusedNode(),Ee=B?B.findNextNode(!0,!0):this.getFirstRoot(!0);Ee&&Ee.focus()}focusPreviousNode(){let B=this.getFocusedNode(),Ee=B?B.findPreviousNode(!0):this.getLastRoot(!0);Ee&&Ee.focus()}focusDrillDown(){let B=this.getFocusedNode();if(B&&B.isCollapsed&&B.hasChildren)B.toggleExpanded();else{let Ee=B?B.getFirstChild(!0):this.getFirstRoot(!0);Ee&&Ee.focus()}}focusDrillUp(){let B=this.getFocusedNode();if(B)if(B.isExpanded)B.toggleExpanded();else{let Ee=B.realParent;Ee&&Ee.focus()}}setActiveNode(B,Ee,at=!1){at?this._setActiveNodeMulti(B,Ee):this._setActiveNodeSingle(B,Ee),Ee?(B.focus(this.options.scrollOnActivate),this.fireEvent({eventName:mc.activate,node:B}),this.fireEvent({eventName:mc.nodeActivate,node:B})):(this.fireEvent({eventName:mc.deactivate,node:B}),this.fireEvent({eventName:mc.nodeDeactivate,node:B}))}setSelectedNode(B,Ee){this.selectedLeafNodeIds=Object.assign({},this.selectedLeafNodeIds,{[B.id]:Ee}),Ee?(B.focus(),this.fireEvent({eventName:mc.select,node:B})):this.fireEvent({eventName:mc.deselect,node:B})}setExpandedNode(B,Ee){this.expandedNodeIds=Object.assign({},this.expandedNodeIds,{[B.id]:Ee}),this.fireEvent({eventName:mc.toggleExpanded,node:B,isExpanded:Ee})}expandAll(){this.roots.forEach(B=>B.expandAll())}collapseAll(){this.roots.forEach(B=>B.collapseAll())}setIsHidden(B,Ee){this.hiddenNodeIds=Object.assign({},this.hiddenNodeIds,{[B.id]:Ee})}setHiddenNodeIds(B){this.hiddenNodeIds=B.reduce((Ee,at)=>Object.assign(Ee,{[at]:!0}),{})}performKeyAction(B,Ee){const at=this.options.actionMapping.keys[Ee.keyCode];return!!at&&(Ee.preventDefault(),at(this,B,Ee),!0)}filterNodes(B,Ee=!0){let at;if(!B)return this.clearFilter();if(Rf(B))at=Gn=>-1!==Gn.displayField.toLowerCase().indexOf(B.toLowerCase());else{if(!(0,Tc.Z)(B))return console.error("Don't know what to do with filter",B),void console.error("Should be either a string or function");at=B}const Ft={};this.roots.forEach(Gn=>this._filterNode(Ft,Gn,at,Ee)),this.hiddenNodeIds=Ft,this.fireEvent({eventName:mc.changeFilter})}clearFilter(){this.hiddenNodeIds={},this.fireEvent({eventName:mc.changeFilter})}moveNode(B,Ee){const at=B.getIndexInParent(),Ft=B.parent;if(!this.canMoveNode(B,Ee,at))return;const Gn=Ft.getField("children");Ee.parent.getField("children")||Ee.parent.setField("children",[]);const hr=Ee.parent.getField("children"),li=Gn.splice(at,1)[0];let Io=Ft===Ee.parent&&Ee.index>at?Ee.index-1:Ee.index;hr.splice(Io,0,li),Ft.treeModel.update(),Ee.parent.treeModel!==Ft.treeModel&&Ee.parent.treeModel.update(),this.fireEvent({eventName:mc.moveNode,node:li,to:{parent:Ee.parent.data,index:Io},from:{parent:Ft.data,index:at}})}copyNode(B,Ee){const at=B.getIndexInParent();if(!this.canMoveNode(B,Ee,at))return;Ee.parent.getField("children")||Ee.parent.setField("children",[]);const Ft=Ee.parent.getField("children"),Gn=this.options.getNodeClone(B);Ft.splice(Ee.index,0,Gn),B.treeModel.update(),Ee.parent.treeModel!==B.treeModel&&Ee.parent.treeModel.update(),this.fireEvent({eventName:mc.copyNode,node:Gn,to:{parent:Ee.parent.data,index:Ee.index}})}getState(){return{expandedNodeIds:this.expandedNodeIds,selectedLeafNodeIds:this.selectedLeafNodeIds,activeNodeIds:this.activeNodeIds,hiddenNodeIds:this.hiddenNodeIds,focusedNodeId:this.focusedNodeId}}setState(B){!B||Object.assign(this,{expandedNodeIds:B.expandedNodeIds||{},selectedLeafNodeIds:B.selectedLeafNodeIds||{},activeNodeIds:B.activeNodeIds||{},hiddenNodeIds:B.hiddenNodeIds||{},focusedNodeId:B.focusedNodeId})}subscribeToState(B){ei(()=>B(this.getState()))}canMoveNode(B,Ee,at){return at||B.getIndexInParent(),(B.parent!==Ee.parent||at!==Ee.index)&&!Ee.parent.isDescendantOf(B)}calculateExpandedNodes(){this._calculateExpandedNodes()}_filterNode(B,Ee,at,Ft){let Gn=at(Ee);return Ee.children&&Ee.children.forEach(hr=>{this._filterNode(B,hr,at,Ft)&&(Gn=!0)}),Gn||(B[Ee.id]=!0),Ft&&Gn&&Ee.ensureVisible(),Gn}_calculateExpandedNodes(B=null){(B=B||this.virtualRoot).data[this.options.isExpandedField]&&(this.expandedNodeIds=Object.assign({},this.expandedNodeIds,{[B.id]:!0})),B.children&&B.children.forEach(Ee=>this._calculateExpandedNodes(Ee))}_setActiveNodeSingle(B,Ee){this.activeNodes.filter(at=>at!==B).forEach(at=>{this.fireEvent({eventName:mc.deactivate,node:at}),this.fireEvent({eventName:mc.nodeDeactivate,node:at})}),this.activeNodeIds=Ee?{[B.id]:!0}:{}}_setActiveNodeMulti(B,Ee){this.activeNodeIds=Object.assign({},this.activeNodeIds,{[B.id]:Ee})}}return I.\u0275fac=function(B){return new(B||I)},I.\u0275prov=r.Yz7({token:I,factory:I.\u0275fac}),I.focusedTree=null,I})();vu([mr,es("design:type",Array)],eu.prototype,"roots",void 0),vu([mr,es("design:type",Object)],eu.prototype,"expandedNodeIds",void 0),vu([mr,es("design:type",Object)],eu.prototype,"selectedLeafNodeIds",void 0),vu([mr,es("design:type",Object)],eu.prototype,"activeNodeIds",void 0),vu([mr,es("design:type",Object)],eu.prototype,"hiddenNodeIds",void 0),vu([mr,es("design:type",Object)],eu.prototype,"focusedNodeId",void 0),vu([mr,es("design:type",p1)],eu.prototype,"virtualRoot",void 0),vu([si,es("design:type",Object),es("design:paramtypes",[])],eu.prototype,"focusedNode",null),vu([si,es("design:type",Object),es("design:paramtypes",[])],eu.prototype,"expandedNodes",null),vu([si,es("design:type",Object),es("design:paramtypes",[])],eu.prototype,"activeNodes",null),vu([si,es("design:type",Object),es("design:paramtypes",[])],eu.prototype,"hiddenNodes",null),vu([si,es("design:type",Object),es("design:paramtypes",[])],eu.prototype,"selectedLeafNodes",null),vu([ne,es("design:type",Function),es("design:paramtypes",[Object]),es("design:returntype",void 0)],eu.prototype,"setData",null),vu([ne,es("design:type",Function),es("design:paramtypes",[]),es("design:returntype",void 0)],eu.prototype,"update",null),vu([ne,es("design:type",Function),es("design:paramtypes",[Object]),es("design:returntype",void 0)],eu.prototype,"setFocusedNode",null),vu([ne,es("design:type",Function),es("design:paramtypes",[Object]),es("design:returntype",void 0)],eu.prototype,"setFocus",null),vu([ne,es("design:type",Function),es("design:paramtypes",[Object]),es("design:returntype",void 0)],eu.prototype,"doForAll",null),vu([ne,es("design:type",Function),es("design:paramtypes",[]),es("design:returntype",void 0)],eu.prototype,"focusNextNode",null),vu([ne,es("design:type",Function),es("design:paramtypes",[]),es("design:returntype",void 0)],eu.prototype,"focusPreviousNode",null),vu([ne,es("design:type",Function),es("design:paramtypes",[]),es("design:returntype",void 0)],eu.prototype,"focusDrillDown",null),vu([ne,es("design:type",Function),es("design:paramtypes",[]),es("design:returntype",void 0)],eu.prototype,"focusDrillUp",null),vu([ne,es("design:type",Function),es("design:paramtypes",[Object,Object,Object]),es("design:returntype",void 0)],eu.prototype,"setActiveNode",null),vu([ne,es("design:type",Function),es("design:paramtypes",[Object,Object]),es("design:returntype",void 0)],eu.prototype,"setSelectedNode",null),vu([ne,es("design:type",Function),es("design:paramtypes",[Object,Object]),es("design:returntype",void 0)],eu.prototype,"setExpandedNode",null),vu([ne,es("design:type",Function),es("design:paramtypes",[]),es("design:returntype",void 0)],eu.prototype,"expandAll",null),vu([ne,es("design:type",Function),es("design:paramtypes",[]),es("design:returntype",void 0)],eu.prototype,"collapseAll",null),vu([ne,es("design:type",Function),es("design:paramtypes",[Object,Object]),es("design:returntype",void 0)],eu.prototype,"setIsHidden",null),vu([ne,es("design:type",Function),es("design:paramtypes",[Object]),es("design:returntype",void 0)],eu.prototype,"setHiddenNodeIds",null),vu([ne,es("design:type",Function),es("design:paramtypes",[Object,Object]),es("design:returntype",void 0)],eu.prototype,"filterNodes",null),vu([ne,es("design:type",Function),es("design:paramtypes",[]),es("design:returntype",void 0)],eu.prototype,"clearFilter",null),vu([ne,es("design:type",Function),es("design:paramtypes",[Object,Object]),es("design:returntype",void 0)],eu.prototype,"moveNode",null),vu([ne,es("design:type",Function),es("design:paramtypes",[Object,Object]),es("design:returntype",void 0)],eu.prototype,"copyNode",null),vu([ne,es("design:type",Function),es("design:paramtypes",[Object]),es("design:returntype",void 0)],eu.prototype,"setState",null);let cv=(()=>{class I{constructor(){this._draggedElement=null}set(B){this._draggedElement=B}get(){return this._draggedElement}isDragging(){return!!this.get()}}return I.\u0275fac=function(B){return new(B||I)},I.\u0275prov=(0,r.Yz7)({factory:function(){return new I},token:I,providedIn:"root"}),I})();var Zh=function(I,z,B,Ee){var Gn,at=arguments.length,Ft=at<3?z:null===Ee?Ee=Object.getOwnPropertyDescriptor(z,B):Ee;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)Ft=Reflect.decorate(I,z,B,Ee);else for(var hr=I.length-1;hr>=0;hr--)(Gn=I[hr])&&(Ft=(at<3?Gn(Ft):at>3?Gn(z,B,Ft):Gn(z,B))||Ft);return at>3&&Ft&&Object.defineProperty(z,B,Ft),Ft},Cd=function(I,z){if("object"==typeof Reflect&&"function"==typeof Reflect.metadata)return Reflect.metadata(I,z)};let Vf=(()=>{class I{constructor(B){this.treeModel=B,this.yBlocks=0,this.x=0,this.viewportHeight=null,this.viewport=null,B.virtualScroll=this,this._dispose=[ei(()=>this.fixScroll())]}get y(){return 150*this.yBlocks}get totalHeight(){return this.treeModel.virtualRoot?this.treeModel.virtualRoot.height:0}fireEvent(B){this.treeModel.fireEvent(B)}init(){const B=this.recalcPositions.bind(this);B(),this._dispose=[...this._dispose,os(()=>this.treeModel.roots,B),os(()=>this.treeModel.expandedNodeIds,B),os(()=>this.treeModel.hiddenNodeIds,B)],this.treeModel.subscribe(mc.loadNodeChildren,B)}isEnabled(){return this.treeModel.options.useVirtualScroll}_setYBlocks(B){this.yBlocks=B}recalcPositions(){this.treeModel.virtualRoot.height=this._getPositionAfter(this.treeModel.getVisibleRoots(),0)}_getPositionAfter(B,Ee){let at=Ee;return B.forEach(Ft=>{Ft.position=at,at=this._getPositionAfterNode(Ft,at)}),at}_getPositionAfterNode(B,Ee){let at=B.getSelfHeight()+Ee;return B.children&&B.isExpanded&&(at=this._getPositionAfter(B.visibleChildren,at)),B.height=at-Ee,at}clear(){this._dispose.forEach(B=>B())}setViewport(B){Object.assign(this,{viewport:B,x:B.scrollLeft,yBlocks:Math.round(B.scrollTop/150),viewportHeight:B.getBoundingClientRect?B.getBoundingClientRect().height:0})}scrollIntoView(B,Ee,at=!0){if(B.options.scrollContainer){const Ft=B.options.scrollContainer,Gn=Ft.getBoundingClientRect().height,hr=Ft.getBoundingClientRect().top,li=this.viewport.getBoundingClientRect().top+B.position-hr;(Ee||li<Ft.scrollTop||li+B.getSelfHeight()>Ft.scrollTop+Gn)&&(Ft.scrollTop=at?li-Gn/2:li)}else(Ee||B.position<this.y||B.position+B.getSelfHeight()>this.y+this.viewportHeight)&&this.viewport&&(this.viewport.scrollTop=at?B.position-this.viewportHeight/2:B.position,this._setYBlocks(Math.floor(this.viewport.scrollTop/150)))}getViewportNodes(B){if(!B)return[];const Ee=B.filter(Io=>!Io.isHidden);if(!this.isEnabled())return Ee;if(!this.viewportHeight||!Ee.length)return[];const at=fv(Ee,Io=>Io.position+500>this.y||Io.position+Io.height>this.y),Ft=fv(Ee,Io=>Io.position-500>this.y+this.viewportHeight,at),Gn=[];if(Ft-at>(1e3+this.viewportHeight)/Ee[0].treeModel.options.options.nodeHeight)return[];for(let Io=at;Io<=Ft;Io++)Gn.push(Ee[Io]);return Gn}fixScroll(){const B=Math.max(0,this.totalHeight-this.viewportHeight);this.y<0&&this._setYBlocks(0),this.y>B&&this._setYBlocks(B/150)}}return I.\u0275fac=function(B){return new(B||I)(r.LFG(eu))},I.\u0275prov=r.Yz7({token:I,factory:I.\u0275fac}),I})();function fv(I,z,B=0){let Ee=B,at=I.length-1;for(;Ee!==at;){let Ft=Math.floor((Ee+at)/2);z(I[Ft])?at=Ft:Ee=Ee===Ft?at:Ft}return Ee}Zh([mr,Cd("design:type",Object)],Vf.prototype,"yBlocks",void 0),Zh([mr,Cd("design:type",Object)],Vf.prototype,"x",void 0),Zh([mr,Cd("design:type",Object)],Vf.prototype,"viewportHeight",void 0),Zh([si,Cd("design:type",Object),Cd("design:paramtypes",[])],Vf.prototype,"y",null),Zh([si,Cd("design:type",Object),Cd("design:paramtypes",[])],Vf.prototype,"totalHeight",null),Zh([ne,Cd("design:type",Function),Cd("design:paramtypes",[Object]),Cd("design:returntype",void 0)],Vf.prototype,"_setYBlocks",null),Zh([ne,Cd("design:type",Function),Cd("design:paramtypes",[]),Cd("design:returntype",void 0)],Vf.prototype,"recalcPositions",null),Zh([ne,Cd("design:type",Function),Cd("design:paramtypes",[Object]),Cd("design:returntype",void 0)],Vf.prototype,"setViewport",null),Zh([ne,Cd("design:type",Function),Cd("design:paramtypes",[Object,Object,Object]),Cd("design:returntype",void 0)],Vf.prototype,"scrollIntoView",null);let pv=(()=>{class I{}return I.\u0275fac=function(B){return new(B||I)},I.\u0275cmp=r.Xpm({type:I,selectors:[["tree-loading-component"]],inputs:{template:"template",node:"node"},decls:2,vars:5,consts:[[4,"ngIf"],[3,"ngTemplateOutlet","ngTemplateOutletContext"]],template:function(B,Ee){1&B&&(r.YNc(0,h_,2,0,"span",0),r.GkF(1,1)),2&B&&(r.Q6J("ngIf",!Ee.template),r.xp6(1),r.Q6J("ngTemplateOutlet",Ee.template)("ngTemplateOutletContext",r.VKq(3,Hh,Ee.node)))},directives:[u.O5,u.tP],encapsulation:2}),I})(),Q_=(()=>{class I{constructor(B,Ee,at){this.elementRef=B,this.ngZone=Ee,this.virtualScroll=at,this.setViewport=yg(()=>{this.virtualScroll.setViewport(this.elementRef.nativeElement)},17),this.scrollEventHandler=this.setViewport.bind(this)}ngOnInit(){this.virtualScroll.init()}ngAfterViewInit(){setTimeout(()=>{this.setViewport(),this.virtualScroll.fireEvent({eventName:mc.initialized})});let B=this.elementRef.nativeElement;this.ngZone.runOutsideAngular(()=>{B.addEventListener("scroll",this.scrollEventHandler)})}ngOnDestroy(){this.virtualScroll.clear(),this.elementRef.nativeElement.removeEventListener("scroll",this.scrollEventHandler)}getTotalHeight(){return this.virtualScroll.isEnabled()&&this.virtualScroll.totalHeight+"px"||"auto"}}return I.\u0275fac=function(B){return new(B||I)(r.Y36(r.SBq),r.Y36(r.R0b),r.Y36(Vf))},I.\u0275cmp=r.Xpm({type:I,selectors:[["tree-viewport"]],features:[r._Bn([Vf])],ngContentSelectors:Mg,decls:1,vars:2,consts:[[4,"treeMobxAutorun"]],template:function(B,Ee){1&B&&(r.F$t(),r.YNc(0,__,3,2,"ng-container",0)),2&B&&r.Q6J("treeMobxAutorun",r.DdM(1,Zp))},directives:[Wr],encapsulation:2}),I})(),Nm=(()=>{class I{constructor(B,Ee){this.treeModel=B,this.treeDraggedElement=Ee,B.eventNames.forEach(at=>this[at]=new r.vpe),B.subscribeToState(at=>this.stateChange.emit(at))}set nodes(B){}set options(B){}set focused(B){this.treeModel.setFocus(B)}set state(B){this.treeModel.setState(B)}onKeydown(B){if(!this.treeModel.isFocused||Hg(["input","textarea"],document.activeElement.tagName.toLowerCase()))return;const Ee=this.treeModel.getFocusedNode();this.treeModel.performKeyAction(Ee,B)}onMousedown(B){(function Ee(at,Ft){return!at||at.localName!==Ft&&Ee(at.parentElement,Ft)})(B.target,"tree-root")&&this.treeModel.setFocus(!1)}ngOnChanges(B){(B.options||B.nodes)&&this.treeModel.setData({options:B.options&&B.options.currentValue,nodes:B.nodes&&B.nodes.currentValue,events:p_(this,this.treeModel.eventNames)})}sizeChanged(){this.viewportComponent.setViewport()}}return I.\u0275fac=function(B){return new(B||I)(r.Y36(eu),r.Y36(cv))},I.\u0275cmp=r.Xpm({type:I,selectors:[["Tree"],["tree-root"]],contentQueries:function(B,Ee,at){if(1&B&&(r.Suo(at,g_,5),r.Suo(at,Ug,5),r.Suo(at,Uh,5),r.Suo(at,Ag,5)),2&B){let Ft;r.iGM(Ft=r.CRH())&&(Ee.loadingTemplate=Ft.first),r.iGM(Ft=r.CRH())&&(Ee.treeNodeTemplate=Ft.first),r.iGM(Ft=r.CRH())&&(Ee.treeNodeWrapperTemplate=Ft.first),r.iGM(Ft=r.CRH())&&(Ee.treeNodeFullTemplate=Ft.first)}},viewQuery:function(B,Ee){if(1&B&&r.Gf(ov,5),2&B){let at;r.iGM(at=r.CRH())&&(Ee.viewportComponent=at.first)}},hostBindings:function(B,Ee){1&B&&r.NdJ("keydown",function(Ft){return Ee.onKeydown(Ft)},!1,r.pYS)("mousedown",function(Ft){return Ee.onMousedown(Ft)},!1,r.pYS)},inputs:{nodes:"nodes",options:"options",focused:"focused",state:"state"},outputs:{toggleExpanded:"toggleExpanded",activate:"activate",deactivate:"deactivate",nodeActivate:"nodeActivate",nodeDeactivate:"nodeDeactivate",select:"select",deselect:"deselect",focus:"focus",blur:"blur",updateData:"updateData",initialized:"initialized",moveNode:"moveNode",copyNode:"copyNode",loadNodeChildren:"loadNodeChildren",changeFilter:"changeFilter",event:"event",stateChange:"stateChange"},features:[r._Bn([eu]),r.TTD],decls:5,vars:6,consts:[["viewport",""],[1,"angular-tree-component"],[3,"nodes","treeModel","templates",4,"ngIf"],["class","empty-tree-drop-slot",3,"dropIndex","node",4,"ngIf"],[3,"nodes","treeModel","templates"],[1,"empty-tree-drop-slot",3,"dropIndex","node"]],template:function(B,Ee){1&B&&(r.TgZ(0,"tree-viewport",null,0),r.TgZ(2,"div",1),r.YNc(3,Om,1,8,"tree-node-collection",2),r.YNc(4,m_,1,2,"tree-node-drop-slot",3),r.qZA(),r.qZA()),2&B&&(r.xp6(2),r.ekj("node-dragging",Ee.treeDraggedElement.isDragging())("angular-tree-component-rtl",Ee.treeModel.options.rtl),r.xp6(1),r.Q6J("ngIf",Ee.treeModel.roots),r.xp6(1),r.Q6J("ngIf",Ee.treeModel.isEmptyTree()))},directives:function(){return[Q_,u.O5,jh,Cp]},encapsulation:2}),I})(),Bg=(()=>{class I{}return I.\u0275fac=function(B){return new(B||I)},I.\u0275cmp=r.Xpm({type:I,selectors:[["TreeNode"],["tree-node"]],inputs:{node:"node",index:"index",templates:"templates"},decls:1,vars:2,consts:[[4,"treeMobxAutorun"],[3,"class","tree-node","tree-node-expanded","tree-node-collapsed","tree-node-leaf","tree-node-active","tree-node-focused",4,"ngIf"],[3,"ngTemplateOutlet","ngTemplateOutletContext"],[3,"dropIndex","node",4,"ngIf"],[3,"node","index","templates"],[3,"node","templates"],[3,"dropIndex","node"]],template:function(B,Ee){1&B&&r.YNc(0,Se,3,8,"ng-container",0),2&B&&r.Q6J("treeMobxAutorun",r.DdM(1,Zp))},directives:function(){return[Wr,u.O5,u.tP,Gp,_v,Cp]},encapsulation:2}),I})(),hv=(()=>{class I{}return I.\u0275fac=function(B){return new(B||I)},I.\u0275cmp=r.Xpm({type:I,selectors:[["tree-node-content"]],inputs:{node:"node",index:"index",template:"template"},decls:2,vars:7,consts:[[4,"ngIf"],[3,"ngTemplateOutlet","ngTemplateOutletContext"]],template:function(B,Ee){1&B&&(r.YNc(0,We,2,1,"span",0),r.GkF(1,1)),2&B&&(r.Q6J("ngIf",!Ee.template),r.xp6(1),r.Q6J("ngTemplateOutlet",Ee.template)("ngTemplateOutletContext",r.kEZ(3,Rt,Ee.node,Ee.node,Ee.index)))},directives:[u.O5,u.tP],encapsulation:2}),I})(),Cp=(()=>{class I{onDrop(B){this.node.mouseAction("drop",B.event,{from:B.element,to:{parent:this.node,index:this.dropIndex}})}allowDrop(B,Ee){return this.node.options.allowDrop(B,{parent:this.node,index:this.dropIndex},Ee)}}return I.\u0275fac=function(B){return new(B||I)},I.\u0275cmp=r.Xpm({type:I,selectors:[["TreeNodeDropSlot"],["tree-node-drop-slot"]],inputs:{node:"node",dropIndex:"dropIndex"},decls:1,vars:2,consts:[[1,"node-drop-slot",3,"treeAllowDrop","allowDragoverStyling","treeDrop"]],template:function(B,Ee){1&B&&(r.TgZ(0,"div",0),r.NdJ("treeDrop",function(Ft){return Ee.onDrop(Ft)}),r.qZA()),2&B&&r.Q6J("treeAllowDrop",Ee.allowDrop.bind(Ee))("allowDragoverStyling",!0)},directives:function(){return[Lm]},encapsulation:2}),I})(),Pm=(()=>{class I{}return I.\u0275fac=function(B){return new(B||I)},I.\u0275cmp=r.Xpm({type:I,selectors:[["tree-node-expander"]],inputs:{node:"node"},decls:1,vars:2,consts:[[4,"treeMobxAutorun"],["class","toggle-children-wrapper",3,"toggle-children-wrapper-expanded","toggle-children-wrapper-collapsed","click",4,"ngIf"],["class","toggle-children-placeholder",4,"ngIf"],[1,"toggle-children-wrapper",3,"click"],[1,"toggle-children"],[1,"toggle-children-placeholder"]],template:function(B,Ee){1&B&&r.YNc(0,Er,3,2,"ng-container",0),2&B&&r.Q6J("treeMobxAutorun",r.DdM(1,Zp))},directives:[Wr,u.O5],encapsulation:2}),I})(),_v=(()=>{class I{}return I.\u0275fac=function(B){return new(B||I)},I.\u0275cmp=r.Xpm({type:I,selectors:[["tree-node-children"]],inputs:{node:"node",templates:"templates"},decls:1,vars:2,consts:[[4,"treeMobxAutorun"],[3,"tree-children","tree-children-no-padding",4,"treeAnimateOpen","treeAnimateOpenSpeed","treeAnimateOpenAcceleration","treeAnimateOpenEnabled"],[3,"nodes","templates","treeModel",4,"ngIf"],["class","tree-node-loading",3,"padding-left","template","node",4,"ngIf"],[3,"nodes","templates","treeModel"],[1,"tree-node-loading",3,"template","node"]],template:function(B,Ee){1&B&&r.YNc(0,mo,2,4,"ng-container",0),2&B&&r.Q6J("treeMobxAutorun",r.DdM(1,Zp))},directives:function(){return[Wr,mv,u.O5,jh,pv]},encapsulation:2}),I})();const Yg=Object.assign(function(...I){return ne(...I)},ne),gv=Object.assign(function(...I){return si(...I)},si),Og=Object.assign(function(...I){return mr(...I)},mr);var Mp=function(I,z,B,Ee){var Gn,at=arguments.length,Ft=at<3?z:null===Ee?Ee=Object.getOwnPropertyDescriptor(z,B):Ee;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)Ft=Reflect.decorate(I,z,B,Ee);else for(var hr=I.length-1;hr>=0;hr--)(Gn=I[hr])&&(Ft=(at<3?Gn(Ft):at>3?Gn(z,B,Ft):Gn(z,B))||Ft);return at>3&&Ft&&Object.defineProperty(z,B,Ft),Ft},rp=function(I,z){if("object"==typeof Reflect&&"function"==typeof Reflect.metadata)return Reflect.metadata(I,z)};let jh=(()=>{class I{constructor(){this._dispose=[]}get nodes(){return this._nodes}set nodes(B){this.setNodes(B)}get marginTop(){const B=this.viewportNodes&&this.viewportNodes.length&&this.viewportNodes[0];return(B&&B.parent?B.position-B.parent.position-B.parent.getSelfHeight():0)+"px"}setNodes(B){this._nodes=B}ngOnInit(){this.virtualScroll=this.treeModel.virtualScroll,this._dispose=[os(()=>this.virtualScroll.getViewportNodes(this.nodes).map(B=>B.index),B=>{this.viewportNodes=B.map(Ee=>this.nodes[Ee])},{compareStructural:!0,fireImmediately:!0}),os(()=>this.nodes,B=>{this.viewportNodes=this.virtualScroll.getViewportNodes(B)})]}ngOnDestroy(){this._dispose.forEach(B=>B())}trackNode(B,Ee){return Ee.id}}return I.\u0275fac=function(B){return new(B||I)},I.\u0275cmp=r.Xpm({type:I,selectors:[["tree-node-collection"]],inputs:{nodes:"nodes",treeModel:"treeModel",templates:"templates"},decls:1,vars:2,consts:[[4,"treeMobxAutorun"],[3,"node","index","templates",4,"ngFor","ngForOf","ngForTrackBy"],[3,"node","index","templates"]],template:function(B,Ee){1&B&&r.YNc(0,La,3,4,"ng-container",0),2&B&&r.Q6J("treeMobxAutorun",r.DdM(1,Zp))},directives:[Wr,u.sg,Bg],encapsulation:2}),I})();Mp([Og,rp("design:type",Object)],jh.prototype,"_nodes",void 0),Mp([Og,rp("design:type",Array)],jh.prototype,"viewportNodes",void 0),Mp([gv,rp("design:type",String),rp("design:paramtypes",[])],jh.prototype,"marginTop",null),Mp([Yg,rp("design:type",Function),rp("design:paramtypes",[Object]),rp("design:returntype",void 0)],jh.prototype,"setNodes",null);let Gp=(()=>{class I{constructor(){}}return I.\u0275fac=function(B){return new(B||I)},I.\u0275cmp=r.Xpm({type:I,selectors:[["tree-node-wrapper"]],inputs:{node:"node",index:"index",templates:"templates"},decls:2,vars:8,consts:[["class","node-wrapper",3,"padding-left",4,"ngIf"],[3,"ngTemplateOutlet","ngTemplateOutletContext"],[1,"node-wrapper"],[3,"node",4,"ngIf"],[3,"node"],[1,"node-content-wrapper",3,"treeAllowDrop","allowDragoverStyling","treeDrag","treeDragEnabled","click","dblclick","mouseover","mouseout","contextmenu","treeDrop","treeDropDragOver","treeDropDragLeave","treeDropDragEnter"],[3,"node","index","template"]],template:function(B,Ee){1&B&&(r.YNc(0,ti,5,15,"div",0),r.GkF(1,1)),2&B&&(r.Q6J("ngIf",!Ee.templates.treeNodeWrapperTemplate),r.xp6(1),r.Q6J("ngTemplateOutlet",Ee.templates.treeNodeWrapperTemplate)("ngTemplateOutletContext",r.l5B(3,G,Ee.node,Ee.node,Ee.index,Ee.templates)))},directives:function(){return[u.O5,u.tP,Pm,Fm,Lm,hv,X_]},encapsulation:2}),I})(),X_=(()=>{class I{}return I.\u0275fac=function(B){return new(B||I)},I.\u0275cmp=r.Xpm({type:I,selectors:[["tree-node-checkbox"]],inputs:{node:"node"},decls:1,vars:2,consts:[[4,"treeMobxAutorun"],["type","checkbox",1,"tree-node-checkbox",3,"checked","indeterminate","click"]],template:function(B,Ee){1&B&&r.YNc(0,Sr,2,2,"ng-container",0),2&B&&r.Q6J("treeMobxAutorun",r.DdM(1,Zp))},directives:[Wr],encapsulation:2}),I})();const v_="is-dragging-over",Im="is-dragging-over-disabled";let Lm=(()=>{class I{constructor(B,Ee,at,Ft){this.el=B,this.renderer=Ee,this.treeDraggedElement=at,this.ngZone=Ft,this.allowDragoverStyling=!0,this.onDropCallback=new r.vpe,this.onDragOverCallback=new r.vpe,this.onDragLeaveCallback=new r.vpe,this.onDragEnterCallback=new r.vpe,this._allowDrop=(Gn,hr)=>!0,this.dragOverEventHandler=this.onDragOver.bind(this),this.dragEnterEventHandler=this.onDragEnter.bind(this),this.dragLeaveEventHandler=this.onDragLeave.bind(this)}set treeAllowDrop(B){this._allowDrop=B instanceof Function?B:(Ee,at)=>B}allowDrop(B){return this._allowDrop(this.treeDraggedElement.get(),B)}ngAfterViewInit(){let B=this.el.nativeElement;this.ngZone.runOutsideAngular(()=>{B.addEventListener("dragover",this.dragOverEventHandler),B.addEventListener("dragenter",this.dragEnterEventHandler),B.addEventListener("dragleave",this.dragLeaveEventHandler)})}ngOnDestroy(){let B=this.el.nativeElement;B.removeEventListener("dragover",this.dragOverEventHandler),B.removeEventListener("dragenter",this.dragEnterEventHandler),B.removeEventListener("dragleave",this.dragLeaveEventHandler)}onDragOver(B){if(!this.allowDrop(B))return this.allowDragoverStyling?this.addDisabledClass():void 0;this.onDragOverCallback.emit({event:B,element:this.treeDraggedElement.get()}),B.preventDefault(),this.allowDragoverStyling&&this.addClass()}onDragEnter(B){!this.allowDrop(B)||(B.preventDefault(),this.onDragEnterCallback.emit({event:B,element:this.treeDraggedElement.get()}))}onDragLeave(B){if(!this.allowDrop(B))return this.allowDragoverStyling?this.removeDisabledClass():void 0;this.onDragLeaveCallback.emit({event:B,element:this.treeDraggedElement.get()}),this.allowDragoverStyling&&this.removeClass()}onDrop(B){!this.allowDrop(B)||(B.preventDefault(),this.onDropCallback.emit({event:B,element:this.treeDraggedElement.get()}),this.allowDragoverStyling&&this.removeClass(),this.treeDraggedElement.set(null))}addClass(){this.renderer.addClass(this.el.nativeElement,v_)}removeClass(){this.renderer.removeClass(this.el.nativeElement,v_)}addDisabledClass(){this.renderer.addClass(this.el.nativeElement,Im)}removeDisabledClass(){this.renderer.removeClass(this.el.nativeElement,Im)}}return I.\u0275fac=function(B){return new(B||I)(r.Y36(r.SBq),r.Y36(r.Qsj),r.Y36(cv),r.Y36(r.R0b))},I.\u0275dir=r.lG2({type:I,selectors:[["","treeDrop",""]],hostBindings:function(B,Ee){1&B&&r.NdJ("drop",function(Ft){return Ee.onDrop(Ft)})},inputs:{allowDragoverStyling:"allowDragoverStyling",treeAllowDrop:"treeAllowDrop"},outputs:{onDropCallback:"treeDrop",onDragOverCallback:"treeDropDragOver",onDragLeaveCallback:"treeDropDragLeave",onDragEnterCallback:"treeDropDragEnter"}}),I})(),Fm=(()=>{class I{constructor(B,Ee,at,Ft){this.el=B,this.renderer=Ee,this.treeDraggedElement=at,this.ngZone=Ft,this.dragEventHandler=this.onDrag.bind(this)}ngAfterViewInit(){let B=this.el.nativeElement;this.ngZone.runOutsideAngular(()=>{B.addEventListener("drag",this.dragEventHandler)})}ngDoCheck(){this.renderer.setAttribute(this.el.nativeElement,"draggable",this.treeDragEnabled?"true":"false")}ngOnDestroy(){this.el.nativeElement.removeEventListener("drag",this.dragEventHandler)}onDragStart(B){B.dataTransfer.setData("text",B.target.id),this.treeDraggedElement.set(this.draggedElement),this.draggedElement.mouseAction&&this.draggedElement.mouseAction("dragStart",B)}onDrag(B){this.draggedElement.mouseAction&&this.draggedElement.mouseAction("drag",B)}onDragEnd(){this.draggedElement.mouseAction&&this.draggedElement.mouseAction("dragEnd"),this.treeDraggedElement.set(null)}}return I.\u0275fac=function(B){return new(B||I)(r.Y36(r.SBq),r.Y36(r.Qsj),r.Y36(cv),r.Y36(r.R0b))},I.\u0275dir=r.lG2({type:I,selectors:[["","treeDrag",""]],hostBindings:function(B,Ee){1&B&&r.NdJ("dragstart",function(Ft){return Ee.onDragStart(Ft)})("dragend",function(){return Ee.onDragEnd()})},inputs:{draggedElement:["treeDrag","draggedElement"],treeDragEnabled:"treeDragEnabled"}}),I})(),mv=(()=>{class I{constructor(B,Ee,at){this.renderer=B,this.templateRef=Ee,this.viewContainerRef=at}set isOpen(B){B?(this._show(),this.isEnabled&&!1===this._isOpen&&this._animateOpen()):this.isEnabled?this._animateClose():this._hide(),this._isOpen=!!B}_show(){this.innerElement||(this.innerElement=this.viewContainerRef.createEmbeddedView(this.templateRef).rootNodes[0])}_hide(){this.viewContainerRef.clear(),this.innerElement=null}_animateOpen(){let B=this.animateSpeed,Ee=this.animateAcceleration,at=0;this.renderer.setStyle(this.innerElement,"max-height","0"),setTimeout(()=>{const Ft=setInterval(()=>{if(!this._isOpen||!this.innerElement)return clearInterval(Ft);at+=B;const Gn=Math.round(at);this.renderer.setStyle(this.innerElement,"max-height",`${Gn}px`);const hr=this.innerElement.getBoundingClientRect?this.innerElement.getBoundingClientRect().height:0;B*=Ee,Ee*=1.005,hr<Gn&&(this.renderer.setStyle(this.innerElement,"max-height",null),clearInterval(Ft))},17)})}_animateClose(){if(!this.innerElement)return;let B=this.animateSpeed,Ee=this.animateAcceleration,at=this.innerElement.getBoundingClientRect().height;const Ft=setInterval(()=>{if(this._isOpen||!this.innerElement)return clearInterval(Ft);at-=B,this.renderer.setStyle(this.innerElement,"max-height",`${at}px`),B*=Ee,Ee*=1.005,at<=0&&(this.viewContainerRef.clear(),this.innerElement=null,clearInterval(Ft))},17)}}return I.\u0275fac=function(B){return new(B||I)(r.Y36(r.Qsj),r.Y36(r.Rgc),r.Y36(r.s_b))},I.\u0275dir=r.lG2({type:I,selectors:[["","treeAnimateOpen",""]],inputs:{isOpen:["treeAnimateOpen","isOpen"],animateSpeed:["treeAnimateOpenSpeed","animateSpeed"],animateAcceleration:["treeAnimateOpenAcceleration","animateAcceleration"],isEnabled:["treeAnimateOpenEnabled","isEnabled"]}}),I})(),jg=(()=>{class I{}return I.\u0275fac=function(B){return new(B||I)},I.\u0275mod=r.oAB({type:I}),I.\u0275inj=r.cJS({providers:[],imports:[[u.ez]]}),I})()},38549:(v,S,i)=>{"use strict";i.d(S,{Kz:()=>E,xm:()=>Pl,_A:()=>ec,vL:()=>Vl,_D:()=>ha,lQ:()=>_u,VL:()=>zl,M:()=>Bu,jt:()=>hc,TH:()=>wf,Vi:()=>Wl,XC:()=>Cc,iD:()=>rc,J4:()=>qt,FF:()=>be,Pz:()=>Rn,uN:()=>Jt,nv:()=>Pn,Vx:()=>sr,Oz:()=>qs,tO:()=>$o,M2:()=>Xd,o8:()=>ia,AX:()=>vi,dT:()=>_l,Ly:()=>Wc,ZQ:()=>Kf,Pm:()=>kd,UL:()=>Uf,_L:()=>wh,xI:()=>th,HK:()=>Up,dR:()=>oc,ZS:()=>rh});var r=i(74788),u=i(12057),p=i(59796),f=i(56693),e=i(55197),_=i(20509);function y(...Y){if(1===Y.length){if(!(0,p.k)(Y[0]))return Y[0];Y=Y[0]}return(0,f.n)(Y,void 0).lift(new T)}class T{call(fe,w){return w.subscribe(new M(fe))}}class M extends e.L{constructor(fe){super(fe),this.hasFirst=!1,this.observables=[],this.subscriptions=[]}_next(fe){this.observables.push(fe)}_complete(){const fe=this.observables,w=fe.length;if(0===w)this.destination.complete();else{for(let q=0;q<w&&!this.hasFirst;q++){const ut=(0,_.D)(this,fe[q],void 0,q);this.subscriptions&&this.subscriptions.push(ut),this.add(ut)}this.observables=null}}notifyNext(fe,w,q){if(!this.hasFirst){this.hasFirst=!0;for(let Fe=0;Fe<this.subscriptions.length;Fe++)if(Fe!==q){let ut=this.subscriptions[Fe];ut.unsubscribe(),this.remove(ut)}this.subscriptions=null}this.destination.next(w)}}var R=i(77393),F=i(20377),Z=i(85345);function J(...Y){const fe=Y[Y.length-1];return"function"==typeof fe&&Y.pop(),(0,f.n)(Y,void 0).lift(new Q(fe))}class Q{constructor(fe){this.resultSelector=fe}call(fe,w){return w.subscribe(new ee(fe,this.resultSelector))}}class ee extends R.L{constructor(fe,w,q=Object.create(null)){super(fe),this.resultSelector=w,this.iterators=[],this.active=0,this.resultSelector="function"==typeof w?w:void 0}_next(fe){const w=this.iterators;(0,p.k)(fe)?w.push(new ae(fe)):w.push("function"==typeof fe[F.hZ]?new ue(fe[F.hZ]()):new $(this.destination,this,fe))}_complete(){const fe=this.iterators,w=fe.length;if(this.unsubscribe(),0!==w){this.active=w;for(let q=0;q<w;q++){let Fe=fe[q];Fe.stillUnsubscribed?this.destination.add(Fe.subscribe()):this.active--}}else this.destination.complete()}notifyInactive(){this.active--,0===this.active&&this.destination.complete()}checkIterators(){const fe=this.iterators,w=fe.length,q=this.destination;for(let Xn=0;Xn<w;Xn++){let Fr=fe[Xn];if("function"==typeof Fr.hasValue&&!Fr.hasValue())return}let Fe=!1;const ut=[];for(let Xn=0;Xn<w;Xn++){let Fr=fe[Xn],gi=Fr.next();if(Fr.hasCompleted()&&(Fe=!0),gi.done)return void q.complete();ut.push(gi.value)}this.resultSelector?this._tryresultSelector(ut):q.next(ut),Fe&&q.complete()}_tryresultSelector(fe){let w;try{w=this.resultSelector.apply(this,fe)}catch(q){return void this.destination.error(q)}this.destination.next(w)}}class ue{constructor(fe){this.iterator=fe,this.nextResult=fe.next()}hasValue(){return!0}next(){const fe=this.nextResult;return this.nextResult=this.iterator.next(),fe}hasCompleted(){const fe=this.nextResult;return Boolean(fe&&fe.done)}}class ae{constructor(fe){this.array=fe,this.index=0,this.length=0,this.length=fe.length}[F.hZ](){return this}next(fe){const w=this.index++;return w<this.length?{value:this.array[w],done:!1}:{value:null,done:!0}}hasValue(){return this.array.length>this.index}hasCompleted(){return this.array.length===this.index}}class $ extends Z.Ds{constructor(fe,w,q){super(fe),this.parent=w,this.observable=q,this.stillUnsubscribed=!0,this.buffer=[],this.isComplete=!1}[F.hZ](){return this}next(){const fe=this.buffer;return 0===fe.length&&this.isComplete?{value:null,done:!0}:{value:fe.shift(),done:!1}}hasValue(){return this.buffer.length>0}hasCompleted(){return 0===this.buffer.length&&this.isComplete}notifyComplete(){this.buffer.length>0?(this.isComplete=!0,this.parent.notifyInactive()):this.destination.complete()}notifyNext(fe){this.buffer.push(fe),this.parent.checkIterators()}subscribe(){return(0,Z.ft)(this.observable,new Z.IY(this))}}var se=i(18891),ve=i(59193),oe=i(25917),he=i(79765),me=i(22759),Oe=i(46797),ce=i(26215),Ye=(i(9112),i(17757),i(66682)),je=i(58071);function Ve(...Y){return fe=>{let w;return"function"==typeof Y[Y.length-1]&&(w=Y.pop()),fe.lift(new He(Y,w))}}class He{constructor(fe,w){this.observables=fe,this.project=w}call(fe,w){return w.subscribe(new Zt(fe,this.observables,this.project))}}class Zt extends e.L{constructor(fe,w,q){super(fe),this.observables=w,this.project=q,this.toRespond=[];const Fe=w.length;this.values=new Array(Fe);for(let ut=0;ut<Fe;ut++)this.toRespond.push(ut);for(let ut=0;ut<Fe;ut++)this.add((0,_.D)(this,w[ut],void 0,ut))}notifyNext(fe,w,q){this.values[q]=w;const Fe=this.toRespond;if(Fe.length>0){const ut=Fe.indexOf(q);-1!==ut&&Fe.splice(ut,1)}}notifyComplete(){}_next(fe){if(0===this.toRespond.length){const w=[fe,...this.values];this.project?this._tryProject(w):this.destination.next(w)}}_tryProject(fe){let w;try{w=this.project.apply(this,fe)}catch(q){return void this.destination.error(q)}this.destination.next(w)}}class en{constructor(fe){this.total=fe}call(fe,w){return w.subscribe(new $t(fe,this.total))}}class $t extends R.L{constructor(fe,w){super(fe),this.total=w,this.count=0}_next(fe){++this.count>this.total&&this.destination.next(fe)}}var Gt=i(46782),Ut=i(45435),Bt=i(15257),mt=i(88002),Yt=i(39761),Dt=i(87519),zt=i(43190),Yn=i(68307),Hr=i(71289),ci=i(19773),Ir=i(18819),wr=i(24751);function $i(Y,fe){if(1&Y){const w=r.EpF();r.TgZ(0,"button",1),r.NdJ("click",function(){return r.CHM(w),r.oxw().close()}),r.TgZ(1,"span",2),r._uU(2,"\xd7"),r.qZA(),r.qZA()}}const Hi=["*"],Lr=["defaultDayTemplate"],Vn=["content"];function zr(Y,fe){if(1&Y&&r._UZ(0,"div",7),2&Y){const q=fe.currentMonth,Fe=fe.selected,ut=fe.disabled,Xn=fe.focused;r.Q6J("date",fe.date)("currentMonth",q)("selected",Fe)("disabled",ut)("focused",Xn)}}function hi(Y,fe){if(1&Y&&(r.TgZ(0,"div",12),r._uU(1),r.qZA()),2&Y){const w=r.oxw().$implicit,q=r.oxw(2);r.xp6(1),r.hij(" ",q.i18n.getMonthLabel(w.firstDate)," ")}}function Ai(Y,fe){if(1&Y&&(r.TgZ(0,"div",9),r.YNc(1,hi,2,1,"div",10),r._UZ(2,"ngb-datepicker-month",11),r.qZA()),2&Y){const w=fe.$implicit,q=r.oxw(2);r.xp6(1),r.Q6J("ngIf","none"===q.navigation||q.displayMonths>1&&"select"===q.navigation),r.xp6(1),r.Q6J("month",w.firstDate)}}function Tr(Y,fe){if(1&Y&&r.YNc(0,Ai,3,2,"div",8),2&Y){const w=r.oxw();r.Q6J("ngForOf",w.model.months)}}function Nr(Y,fe){if(1&Y){const w=r.EpF();r.TgZ(0,"ngb-datepicker-navigation",13),r.NdJ("navigate",function(Fe){return r.CHM(w),r.oxw().onNavigateEvent(Fe)})("select",function(Fe){return r.CHM(w),r.oxw().onNavigateDateSelect(Fe)}),r.qZA()}if(2&Y){const w=r.oxw();r.Q6J("date",w.model.firstDate)("months",w.model.months)("disabled",w.model.disabled)("showSelect","select"===w.model.navigation)("prevDisabled",w.model.prevDisabled)("nextDisabled",w.model.nextDisabled)("selectBoxes",w.model.selectBoxes)}}function gn(Y,fe){}function En(Y,fe){}function mr(Y,fe){if(1&Y&&(r.TgZ(0,"div",5),r._uU(1),r.qZA()),2&Y){const w=r.oxw(2);r.xp6(1),r.Oqu(w.i18n.getWeekLabel())}}function Xt(Y,fe){if(1&Y&&(r.TgZ(0,"div",6),r._uU(1),r.qZA()),2&Y){const w=fe.$implicit;r.xp6(1),r.Oqu(w)}}function zn(Y,fe){if(1&Y&&(r.TgZ(0,"div",2),r.YNc(1,mr,2,1,"div",3),r.YNc(2,Xt,2,1,"div",4),r.qZA()),2&Y){const w=r.oxw();r.xp6(1),r.Q6J("ngIf",w.datepicker.showWeekNumbers),r.xp6(1),r.Q6J("ngForOf",w.viewModel.weekdays)}}function vr(Y,fe){if(1&Y&&(r.TgZ(0,"div",11),r._uU(1),r.qZA()),2&Y){const w=r.oxw(2).$implicit,q=r.oxw();r.xp6(1),r.Oqu(q.i18n.getWeekNumerals(w.number))}}function si(Y,fe){}function Ii(Y,fe){if(1&Y&&r.YNc(0,si,0,0,"ng-template",14),2&Y){const w=r.oxw().$implicit,q=r.oxw(3);r.Q6J("ngTemplateOutlet",q.datepicker.dayTemplate)("ngTemplateOutletContext",w.context)}}function no(Y,fe){if(1&Y){const w=r.EpF();r.TgZ(0,"div",12),r.NdJ("click",function(Fe){const Xn=r.CHM(w).$implicit;return r.oxw(3).doSelect(Xn),Fe.preventDefault()}),r.YNc(1,Ii,1,2,"ng-template",13),r.qZA()}if(2&Y){const w=fe.$implicit;r.ekj("disabled",w.context.disabled)("hidden",w.hidden)("ngb-dp-today",w.context.today),r.Q6J("tabindex",w.tabindex),r.uIk("aria-label",w.ariaLabel),r.xp6(1),r.Q6J("ngIf",!w.hidden)}}function so(Y,fe){if(1&Y&&(r.TgZ(0,"div",8),r.YNc(1,vr,2,1,"div",9),r.YNc(2,no,2,9,"div",10),r.qZA()),2&Y){const w=r.oxw().$implicit,q=r.oxw();r.xp6(1),r.Q6J("ngIf",q.datepicker.showWeekNumbers),r.xp6(1),r.Q6J("ngForOf",w.days)}}function Ze(Y,fe){1&Y&&r.YNc(0,so,3,2,"div",7),2&Y&&r.Q6J("ngIf",!fe.$implicit.collapsed)}function Dr(Y,fe){if(1&Y){const w=r.EpF();r.TgZ(0,"ngb-datepicker-navigation-select",7),r.NdJ("select",function(Fe){return r.CHM(w),r.oxw().select.emit(Fe)}),r.qZA()}if(2&Y){const w=r.oxw();r.Q6J("date",w.date)("disabled",w.disabled)("months",w.selectBoxes.months)("years",w.selectBoxes.years)}}function jt(Y,fe){1&Y&&r._UZ(0,"div",0)}function xt(Y,fe){1&Y&&r._UZ(0,"div",0)}function mn(Y,fe){if(1&Y&&(r.YNc(0,jt,1,0,"div",9),r.TgZ(1,"div",10),r._uU(2),r.qZA(),r.YNc(3,xt,1,0,"div",9)),2&Y){const w=fe.$implicit,q=fe.index,Fe=r.oxw(2);r.Q6J("ngIf",q>0),r.xp6(2),r.hij(" ",Fe.i18n.getMonthLabel(w.firstDate)," "),r.xp6(1),r.Q6J("ngIf",q!==Fe.months.length-1)}}function Wn(Y,fe){if(1&Y&&r.YNc(0,mn,4,3,"ng-template",8),2&Y){const w=r.oxw();r.Q6J("ngForOf",w.months)}}const kn=["ngbDatepickerDayView",""],wn=["month"],nr=["year"];function Gi(Y,fe){if(1&Y&&(r.TgZ(0,"option",5),r._uU(1),r.qZA()),2&Y){const w=fe.$implicit,q=r.oxw();r.Q6J("value",w),r.uIk("aria-label",q.i18n.getMonthFullName(w,null==q.date?null:q.date.year)),r.xp6(1),r.Oqu(q.i18n.getMonthShortName(w,null==q.date?null:q.date.year))}}function po(Y,fe){if(1&Y&&(r.TgZ(0,"option",5),r._uU(1),r.qZA()),2&Y){const w=fe.$implicit,q=r.oxw();r.Q6J("value",w),r.xp6(1),r.Oqu(q.i18n.getYearNumerals(w))}}const yo=["dialog"],Mo=["ngbNavOutlet",""];function Vi(Y,fe){}const cs=function(Y){return{$implicit:Y}};function zo(Y,fe){if(1&Y&&(r.TgZ(0,"div",2),r.YNc(1,Vi,0,0,"ng-template",3),r.qZA()),2&Y){const w=r.oxw().$implicit,q=r.oxw();r.Q6J("item",w)("nav",q.nav)("role",q.paneRole),r.xp6(1),r.Q6J("ngTemplateOutlet",(null==w.contentTpl?null:w.contentTpl.templateRef)||null)("ngTemplateOutletContext",r.VKq(5,cs,w.active||q.isPanelTransitioning(w)))}}function So(Y,fe){if(1&Y&&r.YNc(0,zo,2,7,"div",1),2&Y){const w=fe.$implicit,q=r.oxw();r.Q6J("ngIf",w.isPanelInDom()||q.isPanelTransitioning(w))}}function qo(Y,fe){if(1&Y&&r._uU(0),2&Y){const w=r.oxw(2);r.Oqu(w.title)}}function ra(Y,fe){}function Ia(Y,fe){if(1&Y&&(r.TgZ(0,"h3",3),r.YNc(1,qo,1,1,"ng-template",null,4,r.W1O),r.YNc(3,ra,0,0,"ng-template",5),r.qZA()),2&Y){const w=r.MAs(2),q=r.oxw();r.xp6(3),r.Q6J("ngTemplateOutlet",q.isTitleTemplate()?q.title:w)("ngTemplateOutletContext",q.context)}}function pa(Y,fe){if(1&Y&&(r.TgZ(0,"span"),r.SDv(1,2),r.ALo(2,"percent"),r.qZA()),2&Y){const w=r.oxw();r.xp6(2),r.pQV(r.lcZ(2,1,w.getValue()/w.max)),r.QtT(1)}}function fo(Y,fe){if(1&Y){const w=r.EpF();r.TgZ(0,"button",11),r.NdJ("click",function(){r.CHM(w);const Fe=r.oxw();return Fe.changeHour(Fe.hourStep)}),r._UZ(1,"span",12),r.TgZ(2,"span",13),r.SDv(3,14),r.qZA(),r.qZA()}if(2&Y){const w=r.oxw();r.ekj("btn-sm",w.isSmallSize)("btn-lg",w.isLargeSize)("disabled",w.disabled),r.Q6J("disabled",w.disabled)}}function Da(Y,fe){if(1&Y){const w=r.EpF();r.TgZ(0,"button",11),r.NdJ("click",function(){r.CHM(w);const Fe=r.oxw();return Fe.changeHour(-Fe.hourStep)}),r._UZ(1,"span",15),r.TgZ(2,"span",13),r.SDv(3,16),r.qZA(),r.qZA()}if(2&Y){const w=r.oxw();r.ekj("btn-sm",w.isSmallSize)("btn-lg",w.isLargeSize)("disabled",w.disabled),r.Q6J("disabled",w.disabled)}}function Ao(Y,fe){if(1&Y){const w=r.EpF();r.TgZ(0,"button",11),r.NdJ("click",function(){r.CHM(w);const Fe=r.oxw();return Fe.changeMinute(Fe.minuteStep)}),r._UZ(1,"span",12),r.TgZ(2,"span",13),r.SDv(3,17),r.qZA(),r.qZA()}if(2&Y){const w=r.oxw();r.ekj("btn-sm",w.isSmallSize)("btn-lg",w.isLargeSize)("disabled",w.disabled),r.Q6J("disabled",w.disabled)}}function ls(Y,fe){if(1&Y){const w=r.EpF();r.TgZ(0,"button",11),r.NdJ("click",function(){r.CHM(w);const Fe=r.oxw();return Fe.changeMinute(-Fe.minuteStep)}),r._UZ(1,"span",15),r.TgZ(2,"span",13),r.SDv(3,18),r.qZA(),r.qZA()}if(2&Y){const w=r.oxw();r.ekj("btn-sm",w.isSmallSize)("btn-lg",w.isLargeSize)("disabled",w.disabled),r.Q6J("disabled",w.disabled)}}function gs(Y,fe){1&Y&&(r.TgZ(0,"div",5),r._uU(1,":"),r.qZA())}function Ra(Y,fe){if(1&Y){const w=r.EpF();r.TgZ(0,"button",11),r.NdJ("click",function(){r.CHM(w);const Fe=r.oxw(2);return Fe.changeSecond(Fe.secondStep)}),r._UZ(1,"span",12),r.TgZ(2,"span",13),r.SDv(3,21),r.qZA(),r.qZA()}if(2&Y){const w=r.oxw(2);r.ekj("btn-sm",w.isSmallSize)("btn-lg",w.isLargeSize)("disabled",w.disabled),r.Q6J("disabled",w.disabled)}}function pl(Y,fe){if(1&Y){const w=r.EpF();r.TgZ(0,"button",11),r.NdJ("click",function(){r.CHM(w);const Fe=r.oxw(2);return Fe.changeSecond(-Fe.secondStep)}),r._UZ(1,"span",15),r.TgZ(2,"span",13),r.SDv(3,22),r.qZA(),r.qZA()}if(2&Y){const w=r.oxw(2);r.ekj("btn-sm",w.isSmallSize)("btn-lg",w.isLargeSize)("disabled",w.disabled),r.Q6J("disabled",w.disabled)}}function Qs(Y,fe){if(1&Y){const w=r.EpF();r.TgZ(0,"div",19),r.YNc(1,Ra,4,7,"button",3),r.TgZ(2,"input",20),r.NdJ("change",function(Fe){return r.CHM(w),r.oxw().updateSecond(Fe.target.value)})("blur",function(){return r.CHM(w),r.oxw().handleBlur()})("input",function(Fe){return r.CHM(w),r.oxw().formatInput(Fe.target)})("keydown.ArrowUp",function(Fe){r.CHM(w);const ut=r.oxw();return ut.changeSecond(ut.secondStep),Fe.preventDefault()})("keydown.ArrowDown",function(Fe){r.CHM(w);const ut=r.oxw();return ut.changeSecond(-ut.secondStep),Fe.preventDefault()}),r.qZA(),r.YNc(3,pl,4,7,"button",3),r.qZA()}if(2&Y){const w=r.oxw();r.xp6(1),r.Q6J("ngIf",w.spinners),r.xp6(1),r.ekj("form-control-sm",w.isSmallSize)("form-control-lg",w.isLargeSize),r.Q6J("value",w.formatMinSec(null==w.model?null:w.model.second))("readOnly",w.readonlyInputs)("disabled",w.disabled),r.xp6(1),r.Q6J("ngIf",w.spinners)}}function Fo(Y,fe){1&Y&&r._UZ(0,"div",5)}function Eo(Y,fe){if(1&Y&&(r.ynx(0),r.SDv(1,27),r.BQk()),2&Y){const w=r.oxw(2);r.xp6(1),r.pQV(w.i18n.getAfternoonPeriod()),r.QtT(1)}}function ks(Y,fe){if(1&Y&&r.SDv(0,28),2&Y){const w=r.oxw(2);r.pQV(w.i18n.getMorningPeriod()),r.QtT(0)}}function ms(Y,fe){if(1&Y){const w=r.EpF();r.TgZ(0,"div",23),r.TgZ(1,"button",24),r.NdJ("click",function(){return r.CHM(w),r.oxw().toggleMeridian()}),r.YNc(2,Eo,2,1,"ng-container",25),r.YNc(3,ks,1,1,"ng-template",null,26,r.W1O),r.qZA(),r.qZA()}if(2&Y){const w=r.MAs(4),q=r.oxw();r.xp6(1),r.ekj("btn-sm",q.isSmallSize)("btn-lg",q.isLargeSize)("disabled",q.disabled),r.Q6J("disabled",q.disabled),r.xp6(1),r.Q6J("ngIf",q.model&&q.model.hour>=12)("ngIfElse",w)}}function tt(Y,fe){if(1&Y&&(r.TgZ(0,"span"),r._uU(1),r.qZA()),2&Y){const w=r.oxw().$implicit,q=r.oxw();r.Tol(q.highlightClass),r.xp6(1),r.Oqu(w)}}function on(Y,fe){if(1&Y&&r._uU(0),2&Y){const w=r.oxw().$implicit;r.Oqu(w)}}function ne(Y,fe){if(1&Y&&(r.YNc(0,tt,2,3,"span",1),r.YNc(1,on,1,1,"ng-template",null,2,r.W1O)),2&Y){const w=fe.odd,q=r.MAs(2);r.Q6J("ngIf",w)("ngIfElse",q)}}function $e(Y,fe){if(1&Y&&r._UZ(0,"ngb-highlight",2),2&Y){const q=fe.term;r.Q6J("result",(0,fe.formatter)(fe.result))("term",q)}}function Pt(Y,fe){}const sn=function(Y,fe,w){return{result:Y,term:fe,formatter:w}};function ei(Y,fe){if(1&Y){const w=r.EpF();r.TgZ(0,"button",3),r.NdJ("mouseenter",function(){const ut=r.CHM(w).index;return r.oxw().markActive(ut)})("click",function(){const ut=r.CHM(w).$implicit;return r.oxw().select(ut)}),r.YNc(1,Pt,0,0,"ng-template",4),r.qZA()}if(2&Y){const w=fe.$implicit,q=fe.index,Fe=r.oxw(),ut=r.MAs(1);r.ekj("active",q===Fe.activeIdx),r.Q6J("id",Fe.id+"-"+q),r.xp6(1),r.Q6J("ngTemplateOutlet",Fe.resultTemplate||ut)("ngTemplateOutletContext",r.kEZ(5,sn,w,Fe.term,Fe.formatter))}}function fi(Y){return parseInt(`${Y}`,10)}function Oi(Y){return null!=Y?`${Y}`:""}function Ro(Y){return"string"==typeof Y}function Uo(Y){return!isNaN(fi(Y))}function To(Y){return"number"==typeof Y&&isFinite(Y)&&Math.floor(Y)===Y}function Ea(Y){return null!=Y}function al(Y){return Uo(Y)?`0${Y}`.slice(-2):""}function Ru(Y,fe){return Y&&Y.className&&Y.className.split&&Y.className.split(/\s+/).indexOf(fe)>=0}function bc(Y){return(Y||document.body).getBoundingClientRect()}function Hl(Y){return Y.normalize("NFD").replace(/[\u0300-\u036f]/g,"")}"undefined"!=typeof Element&&!Element.prototype.closest&&(Element.prototype.matches||(Element.prototype.matches=Element.prototype.msMatchesSelector||Element.prototype.webkitMatchesSelector),Element.prototype.closest=function(Y){let fe=this;if(!document.documentElement.contains(fe))return null;do{if(fe.matches(Y))return fe;fe=fe.parentElement||fe.parentNode}while(null!==fe&&1===fe.nodeType);return null});const Zl={animation:!0,transitionTimerDelayMs:5};let $s=(()=>{class Y{constructor(){this.animation=Zl.animation}}return Y.\u0275fac=function(w){return new(w||Y)},Y.\u0275prov=r.Yz7({factory:function(){return new Y},token:Y,providedIn:"root"}),Y})();const el=()=>{},{transitionTimerDelayMs:jl}=Zl,rt=new Map,Nt=(Y,fe,w,q)=>{let Fe=q.context||{};const ut=rt.get(fe);if(ut)switch(q.runningTransition){case"continue":return ve.E;case"stop":Y.run(()=>ut.transition$.complete()),Fe=Object.assign(ut.context,Fe),rt.delete(fe)}const Xn=w(fe,q.animation,Fe)||el;if(!q.animation||"none"===window.getComputedStyle(fe).transitionProperty)return Y.run(()=>Xn()),(0,oe.of)(void 0).pipe(function(Y){return fe=>new se.y(w=>fe.subscribe(Xn=>Y.run(()=>w.next(Xn)),Xn=>Y.run(()=>w.error(Xn)),()=>Y.run(()=>w.complete())))}(Y));const Fr=new he.xQ,gi=new he.xQ,Wi=Fr.pipe(function(...Y){return fe=>(0,je.z)(fe,(0,oe.of)(...Y))}(!0));rt.set(fe,{transition$:Fr,complete:()=>{gi.next(),gi.complete()},context:Fe});const Po=function(Y){const{transitionDelay:fe,transitionDuration:w}=window.getComputedStyle(Y);return 1e3*(parseFloat(fe)+parseFloat(w))}(fe);return Y.runOutsideAngular(()=>{const Ns=(0,me.R)(fe,"transitionend").pipe((0,Gt.R)(Wi),(0,Ut.h)(({target:Is})=>Is===fe));y((0,Oe.H)(Po+jl).pipe((0,Gt.R)(Wi)),Ns,gi).pipe((0,Gt.R)(Wi)).subscribe(()=>{rt.delete(fe),Y.run(()=>{Xn(),Fr.next(),Fr.complete()})})}),Fr.asObservable()},Me=(Y,fe,w)=>{let{direction:q,maxHeight:Fe}=w;const{classList:ut}=Y;function Xn(){ut.add("collapse"),"show"===q?ut.add("show"):ut.remove("show")}if(fe)return Fe||(Fe=function(Y){if("undefined"==typeof navigator)return"0px";const{classList:fe}=Y,w=fe.contains("show");w||fe.add("show"),Y.style.height="";const q=Y.getBoundingClientRect().height+"px";return w||fe.remove("show"),q}(Y),w.maxHeight=Fe,Y.style.height="show"!==q?Fe:"0px",ut.remove("collapse"),ut.remove("collapsing"),ut.remove("show"),bc(Y),ut.add("collapsing")),Y.style.height="show"===q?Fe:"0px",()=>{Xn(),ut.remove("collapsing"),Y.style.height=""};Xn()};let uu=(()=>{class Y{constructor(w){this._ngbConfig=w,this.dismissible=!0,this.type="warning"}get animation(){return void 0===this._animation?this._ngbConfig.animation:this._animation}set animation(w){this._animation=w}}return Y.\u0275fac=function(w){return new(w||Y)(r.LFG($s))},Y.\u0275prov=r.Yz7({factory:function(){return new Y(r.LFG($s))},token:Y,providedIn:"root"}),Y})();const Wa=({classList:Y})=>{Y.remove("show")};let Pl=(()=>{class Y{constructor(w,q,Fe,ut){this._renderer=q,this._element=Fe,this._zone=ut,this.closed=new r.vpe,this.dismissible=w.dismissible,this.type=w.type,this.animation=w.animation}close(){const w=Nt(this._zone,this._element.nativeElement,Wa,{animation:this.animation,runningTransition:"continue"});return w.subscribe(()=>this.closed.emit()),w}ngOnChanges(w){const q=w.type;q&&!q.firstChange&&(this._renderer.removeClass(this._element.nativeElement,`alert-${q.previousValue}`),this._renderer.addClass(this._element.nativeElement,`alert-${q.currentValue}`))}ngOnInit(){this._renderer.addClass(this._element.nativeElement,`alert-${this.type}`)}}return Y.\u0275fac=function(w){return new(w||Y)(r.Y36(uu),r.Y36(r.Qsj),r.Y36(r.SBq),r.Y36(r.R0b))},Y.\u0275cmp=r.Xpm({type:Y,selectors:[["ngb-alert"]],hostAttrs:["role","alert",1,"alert","show"],hostVars:4,hostBindings:function(w,q){2&w&&r.ekj("fade",q.animation)("alert-dismissible",q.dismissible)},inputs:{dismissible:"dismissible",type:"type",animation:"animation"},outputs:{closed:"closed"},exportAs:["ngbAlert"],features:[r.TTD],ngContentSelectors:Hi,decls:2,vars:1,consts:function(){let fe;return fe="Close",[["type","button","class","close","aria-label",fe,3,"click",4,"ngIf"],["type","button","aria-label",fe,1,"close",3,"click"],["aria-hidden","true"]]},template:function(w,q){1&w&&(r.F$t(),r.Hsn(0),r.YNc(1,$i,3,0,"button",0)),2&w&&(r.xp6(1),r.Q6J("ngIf",q.dismissible))},directives:[u.O5],styles:["ngb-alert{display:block}"],encapsulation:2,changeDetection:0}),Y})(),ec=(()=>{class Y{}return Y.\u0275fac=function(w){return new(w||Y)},Y.\u0275mod=r.oAB({type:Y}),Y.\u0275inj=r.cJS({imports:[[u.ez]]}),Y})(),Ar=(()=>{class Y{constructor(w){this._ngbConfig=w}get animation(){return void 0===this._animation?this._ngbConfig.animation:this._animation}set animation(w){this._animation=w}}return Y.\u0275fac=function(w){return new(w||Y)(r.LFG($s))},Y.\u0275prov=r.Yz7({factory:function(){return new Y(r.LFG($s))},token:Y,providedIn:"root"}),Y})(),ha=(()=>{class Y{constructor(w,q,Fe){this._element=w,this._zone=Fe,this.collapsed=!1,this.ngbCollapseChange=new r.vpe,this.shown=new r.vpe,this.hidden=new r.vpe,this.animation=q.animation}ngOnInit(){this._runTransition(this.collapsed,!1)}ngOnChanges({collapsed:w}){w.firstChange||this._runTransitionWithEvents(this.collapsed,this.animation)}toggle(w=this.collapsed){this.collapsed=!w,this.ngbCollapseChange.next(this.collapsed),this._runTransitionWithEvents(this.collapsed,this.animation)}_runTransition(w,q){return Nt(this._zone,this._element.nativeElement,Me,{animation:q,runningTransition:"stop",context:{direction:w?"hide":"show"}})}_runTransitionWithEvents(w,q){this._runTransition(w,q).subscribe(()=>{w?this.hidden.emit():this.shown.emit()})}}return Y.\u0275fac=function(w){return new(w||Y)(r.Y36(r.SBq),r.Y36(Ar),r.Y36(r.R0b))},Y.\u0275dir=r.lG2({type:Y,selectors:[["","ngbCollapse",""]],inputs:{collapsed:["ngbCollapse","collapsed"],animation:"animation"},outputs:{ngbCollapseChange:"ngbCollapseChange",shown:"shown",hidden:"hidden"},exportAs:["ngbCollapse"],features:[r.TTD]}),Y})(),_u=(()=>{class Y{}return Y.\u0275fac=function(w){return new(w||Y)},Y.\u0275mod=r.oAB({type:Y}),Y.\u0275inj=r.cJS({}),Y})();class fa{constructor(fe,w,q){this.year=To(fe)?fe:null,this.month=To(w)?w:null,this.day=To(q)?q:null}static from(fe){return fe instanceof fa?fe:fe?new fa(fe.year,fe.month,fe.day):null}equals(fe){return null!=fe&&this.year===fe.year&&this.month===fe.month&&this.day===fe.day}before(fe){return!!fe&&(this.year===fe.year?this.month===fe.month?this.day!==fe.day&&this.day<fe.day:this.month<fe.month:this.year<fe.year)}after(fe){return!!fe&&(this.year===fe.year?this.month===fe.month?this.day!==fe.day&&this.day>fe.day:this.month>fe.month:this.year>fe.year)}}function Gl(Y){return new fa(Y.getFullYear(),Y.getMonth()+1,Y.getDate())}function Ja(Y){const fe=new Date(Y.year,Y.month-1,Y.day,12);return isNaN(fe.getTime())||fe.setFullYear(Y.year),fe}function hl(){return new Hs}let Vl=(()=>{class Y{}return Y.\u0275fac=function(w){return new(w||Y)},Y.\u0275prov=r.Yz7({factory:hl,token:Y,providedIn:"root"}),Y})(),Hs=(()=>{class Y extends Vl{getDaysPerWeek(){return 7}getMonths(){return[1,2,3,4,5,6,7,8,9,10,11,12]}getWeeksPerMonth(){return 6}getNext(w,q="d",Fe=1){let ut=Ja(w),Xn=!0,Fr=ut.getMonth();switch(q){case"y":ut.setFullYear(ut.getFullYear()+Fe);break;case"m":Fr+=Fe,ut.setMonth(Fr),Fr%=12,Fr<0&&(Fr+=12);break;case"d":ut.setDate(ut.getDate()+Fe),Xn=!1;break;default:return w}return Xn&&ut.getMonth()!==Fr&&ut.setDate(0),Gl(ut)}getPrev(w,q="d",Fe=1){return this.getNext(w,q,-Fe)}getWeekday(w){let Fe=Ja(w).getDay();return 0===Fe?7:Fe}getWeekNumber(w,q){7===q&&(q=0);const Xn=Ja(w[(11-q)%7]);Xn.setDate(Xn.getDate()+4-(Xn.getDay()||7));const Fr=Xn.getTime();return Xn.setMonth(0),Xn.setDate(1),Math.floor(Math.round((Fr-Xn.getTime())/864e5)/7)+1}getToday(){return Gl(new Date)}isValid(w){if(!(w&&To(w.year)&&To(w.month)&&To(w.day)&&0!==w.year))return!1;const q=Ja(w);return!isNaN(q.getTime())&&q.getFullYear()===w.year&&q.getMonth()+1===w.month&&q.getDate()===w.day}}return Y.\u0275fac=function(){let fe;return function(q){return(fe||(fe=r.n5z(Y)))(q||Y)}}(),Y.\u0275prov=r.Yz7({token:Y,factory:Y.\u0275fac}),Y})();function V(Y,fe){return!function(Y,fe){return!Y&&!fe||!!Y&&!!fe&&Y.equals(fe)}(Y,fe)}function Ae(Y,fe){return!(!Y&&!fe||Y&&fe&&Y.year===fe.year&&Y.month===fe.month)}function lt(Y,fe,w){return Y&&fe&&Y.before(fe)?fe:Y&&w&&Y.after(w)?w:Y||null}function un(Y,fe){const{minDate:w,maxDate:q,disabled:Fe,markDisabled:ut}=fe;return!(null==Y||Fe||ut&&ut(Y,{year:Y.year,month:Y.month})||w&&Y.before(w)||q&&Y.after(q))}let Mr=(()=>{class Y{getMonthLabel(w){return`${this.getMonthFullName(w.month,w.year)} ${this.getYearNumerals(w.year)}`}getDayNumerals(w){return`${w.day}`}getWeekNumerals(w){return`${w}`}getYearNumerals(w){return`${w}`}getWeekLabel(){return""}}return Y.\u0275fac=function(w){return new(w||Y)},Y.\u0275prov=r.Yz7({factory:function(){return function(Y){return new gr(Y)}(r.LFG(r.soG))},token:Y,providedIn:"root"}),Y})(),gr=(()=>{class Y extends Mr{constructor(w){super(),this._locale=w,this._monthsShort=(0,u.UT)(w,u.x.Standalone,u.Tn.Abbreviated),this._monthsFull=(0,u.UT)(w,u.x.Standalone,u.Tn.Wide)}getWeekdayLabel(w,q){const Fe=(0,u.Mn)(this._locale,u.x.Standalone,void 0===q?u.Tn.Short:q);return Fe.map((Xn,Fr)=>Fe[(Fr+1)%7])[w-1]||""}getMonthShortName(w){return this._monthsShort[w-1]||""}getMonthFullName(w){return this._monthsFull[w-1]||""}getDayAriaLabel(w){const q=new Date(w.year,w.month-1,w.day);return(0,u.p6)(q,"fullDate",this._locale)}}return Y.\u0275fac=function(w){return new(w||Y)(r.LFG(r.soG))},Y.\u0275prov=r.Yz7({token:Y,factory:Y.\u0275fac}),Y})(),co=(()=>{class Y{constructor(w,q){this._calendar=w,this._i18n=q,this._VALIDATORS={dayTemplateData:Fe=>{if(this._state.dayTemplateData!==Fe)return{dayTemplateData:Fe}},displayMonths:Fe=>{if(To(Fe=fi(Fe))&&Fe>0&&this._state.displayMonths!==Fe)return{displayMonths:Fe}},disabled:Fe=>{if(this._state.disabled!==Fe)return{disabled:Fe}},firstDayOfWeek:Fe=>{if(To(Fe=fi(Fe))&&Fe>=0&&this._state.firstDayOfWeek!==Fe)return{firstDayOfWeek:Fe}},focusVisible:Fe=>{if(this._state.focusVisible!==Fe&&!this._state.disabled)return{focusVisible:Fe}},markDisabled:Fe=>{if(this._state.markDisabled!==Fe)return{markDisabled:Fe}},maxDate:Fe=>{const ut=this.toValidDate(Fe,null);if(V(this._state.maxDate,ut))return{maxDate:ut}},minDate:Fe=>{const ut=this.toValidDate(Fe,null);if(V(this._state.minDate,ut))return{minDate:ut}},navigation:Fe=>{if(this._state.navigation!==Fe)return{navigation:Fe}},outsideDays:Fe=>{if(this._state.outsideDays!==Fe)return{outsideDays:Fe}},weekdays:Fe=>{const ut=!0===Fe||!1===Fe?u.Tn.Short:Fe,Xn=!0!==Fe&&!1!==Fe||Fe;if(this._state.weekdayWidth!==ut||this._state.weekdaysVisible!==Xn)return{weekdayWidth:ut,weekdaysVisible:Xn}}},this._model$=new he.xQ,this._dateSelect$=new he.xQ,this._state={dayTemplateData:null,markDisabled:null,maxDate:null,minDate:null,disabled:!1,displayMonths:1,firstDate:null,firstDayOfWeek:1,lastDate:null,focusDate:null,focusVisible:!1,months:[],navigation:"select",outsideDays:"visible",prevDisabled:!1,nextDisabled:!1,selectedDate:null,selectBoxes:{years:[],months:[]},weekdayWidth:u.Tn.Short,weekdaysVisible:!0}}get model$(){return this._model$.pipe((0,Ut.h)(w=>w.months.length>0))}get dateSelect$(){return this._dateSelect$.pipe((0,Ut.h)(w=>null!==w))}set(w){let q=Object.keys(w).map(Fe=>this._VALIDATORS[Fe](w[Fe])).reduce((Fe,ut)=>Object.assign(Object.assign({},Fe),ut),{});Object.keys(q).length>0&&this._nextState(q)}focus(w){const q=this.toValidDate(w,null);null!=q&&!this._state.disabled&&V(this._state.focusDate,q)&&this._nextState({focusDate:w})}focusSelect(){un(this._state.focusDate,this._state)&&this.select(this._state.focusDate,{emitEvent:!0})}open(w){const q=this.toValidDate(w,this._calendar.getToday());null!=q&&!this._state.disabled&&(!this._state.firstDate||Ae(this._state.firstDate,q))&&this._nextState({firstDate:q})}select(w,q={}){const Fe=this.toValidDate(w,null);null!=Fe&&!this._state.disabled&&(V(this._state.selectedDate,Fe)&&this._nextState({selectedDate:Fe}),q.emitEvent&&un(Fe,this._state)&&this._dateSelect$.next(Fe))}toValidDate(w,q){const Fe=fa.from(w);return void 0===q&&(q=this._calendar.getToday()),this._calendar.isValid(Fe)?Fe:q}getMonth(w){for(let q of this._state.months)if(w.month===q.number&&w.year===q.year)return q;throw new Error(`month ${w.month} of year ${w.year} not found`)}_nextState(w){const q=this._updateState(w);this._patchContexts(q),this._state=q,this._model$.next(this._state)}_patchContexts(w){const{months:q,displayMonths:Fe,selectedDate:ut,focusDate:Xn,focusVisible:Fr,disabled:gi,outsideDays:Wi}=w;w.months.forEach(Po=>{Po.weeks.forEach(Ns=>{Ns.days.forEach(ts=>{Xn&&(ts.context.focused=Xn.equals(ts.date)&&Fr),ts.tabindex=!gi&&Xn&&ts.date.equals(Xn)&&Xn.month===Po.number?0:-1,!0===gi&&(ts.context.disabled=!0),void 0!==ut&&(ts.context.selected=null!==ut&&ut.equals(ts.date)),Po.number!==ts.date.month&&(ts.hidden="hidden"===Wi||"collapsed"===Wi||Fe>1&&ts.date.after(q[0].firstDate)&&ts.date.before(q[Fe-1].lastDate))})})})}_updateState(w){const q=Object.assign({},this._state,w);let Fe=q.firstDate;if(("minDate"in w||"maxDate"in w)&&(function(Y,fe){if(fe&&Y&&fe.before(Y))throw new Error(`'maxDate' ${fe} should be greater than 'minDate' ${Y}`)}(q.minDate,q.maxDate),q.focusDate=lt(q.focusDate,q.minDate,q.maxDate),q.firstDate=lt(q.firstDate,q.minDate,q.maxDate),Fe=q.focusDate),"disabled"in w&&(q.focusVisible=!1),"selectedDate"in w&&0===this._state.months.length&&(Fe=q.selectedDate),"focusVisible"in w||"focusDate"in w&&(q.focusDate=lt(q.focusDate,q.minDate,q.maxDate),Fe=q.focusDate,0!==q.months.length&&q.focusDate&&!q.focusDate.before(q.firstDate)&&!q.focusDate.after(q.lastDate)))return q;if("firstDate"in w&&(q.firstDate=lt(q.firstDate,q.minDate,q.maxDate),Fe=q.firstDate),Fe){const Xn=function(Y,fe,w,q,Fe){const{displayMonths:ut,months:Xn}=w,Fr=Xn.splice(0,Xn.length);return Array.from({length:ut},(Wi,Po)=>{const Ns=Object.assign(Y.getNext(fe,"m",Po),{day:1});if(Xn[Po]=null,!Fe){const ts=Fr.findIndex(Is=>Is.firstDate.equals(Ns));-1!==ts&&(Xn[Po]=Fr.splice(ts,1)[0])}return Ns}).forEach((Wi,Po)=>{null===Xn[Po]&&(Xn[Po]=function(Y,fe,w,q,Fe={}){const{dayTemplateData:ut,minDate:Xn,maxDate:Fr,firstDayOfWeek:gi,markDisabled:Wi,outsideDays:Po,weekdayWidth:Ns,weekdaysVisible:ts}=w,Is=Y.getToday();Fe.firstDate=null,Fe.lastDate=null,Fe.number=fe.month,Fe.year=fe.year,Fe.weeks=Fe.weeks||[],Fe.weekdays=Fe.weekdays||[],fe=function(Y,fe,w){const q=Y.getDaysPerWeek(),Fe=new fa(fe.year,fe.month,1),ut=Y.getWeekday(Fe)%q;return Y.getPrev(Fe,"d",(q+ut-w)%q)}(Y,fe,gi),ts||(Fe.weekdays.length=0);for(let ya=0;ya<Y.getWeeksPerMonth();ya++){let zs=Fe.weeks[ya];zs||(zs=Fe.weeks[ya]={number:0,days:[],collapsed:!0});const _c=zs.days;for(let rd=0;rd<Y.getDaysPerWeek();rd++){0===ya&&ts&&(Fe.weekdays[rd]=q.getWeekdayLabel(Y.getWeekday(fe),Ns));const wu=new fa(fe.year,fe.month,fe.day),Hd=Y.getNext(wu),$_=q.getDayAriaLabel(wu);let ih=!!(Xn&&wu.before(Xn)||Fr&&wu.after(Fr));!ih&&Wi&&(ih=Wi(wu,{month:Fe.number,year:Fe.year}));let oh=wu.equals(Is),hp=ut?ut(wu,{month:Fe.number,year:Fe.year}):void 0;null===Fe.firstDate&&wu.month===Fe.number&&(Fe.firstDate=wu),wu.month===Fe.number&&Hd.month!==Fe.number&&(Fe.lastDate=wu);let Yf=_c[rd];Yf||(Yf=_c[rd]={}),Yf.date=wu,Yf.context=Object.assign(Yf.context||{},{$implicit:wu,date:wu,data:hp,currentMonth:Fe.number,currentYear:Fe.year,disabled:ih,focused:!1,selected:!1,today:oh}),Yf.tabindex=-1,Yf.ariaLabel=$_,Yf.hidden=!1,fe=Hd}zs.number=Y.getWeekNumber(_c.map(rd=>rd.date),gi),zs.collapsed="collapsed"===Po&&_c[0].date.month!==Fe.number&&_c[_c.length-1].date.month!==Fe.number}return Fe}(Y,Wi,w,q,Fr.shift()||{}))}),Xn}(this._calendar,Fe,q,this._i18n,"dayTemplateData"in w||"firstDayOfWeek"in w||"markDisabled"in w||"minDate"in w||"maxDate"in w||"disabled"in w||"outsideDays"in w||"weekdaysVisible"in w);q.months=Xn,q.firstDate=Xn[0].firstDate,q.lastDate=Xn[Xn.length-1].lastDate,"selectedDate"in w&&!un(q.selectedDate,q)&&(q.selectedDate=null),"firstDate"in w&&(!q.focusDate||q.focusDate.before(q.firstDate)||q.focusDate.after(q.lastDate))&&(q.focusDate=Fe);const Fr=!this._state.firstDate||this._state.firstDate.year!==q.firstDate.year,gi=!this._state.firstDate||this._state.firstDate.month!==q.firstDate.month;"select"===q.navigation?(("minDate"in w||"maxDate"in w||0===q.selectBoxes.years.length||Fr)&&(q.selectBoxes.years=function(Y,fe,w){if(!Y)return[];const q=fe?Math.max(fe.year,Y.year-500):Y.year-10,ut=(w?Math.min(w.year,Y.year+500):Y.year+10)-q+1,Xn=Array(ut);for(let Fr=0;Fr<ut;Fr++)Xn[Fr]=q+Fr;return Xn}(q.firstDate,q.minDate,q.maxDate)),("minDate"in w||"maxDate"in w||0===q.selectBoxes.months.length||Fr)&&(q.selectBoxes.months=function(Y,fe,w,q){if(!fe)return[];let Fe=Y.getMonths(fe.year);if(w&&fe.year===w.year){const ut=Fe.findIndex(Xn=>Xn===w.month);Fe=Fe.slice(ut)}if(q&&fe.year===q.year){const ut=Fe.findIndex(Xn=>Xn===q.month);Fe=Fe.slice(0,ut+1)}return Fe}(this._calendar,q.firstDate,q.minDate,q.maxDate))):q.selectBoxes={years:[],months:[]},("arrows"===q.navigation||"select"===q.navigation)&&(gi||Fr||"minDate"in w||"maxDate"in w||"disabled"in w)&&(q.prevDisabled=q.disabled||function(Y,fe,w){const q=Object.assign(Y.getPrev(fe,"m"),{day:1});return null!=w&&(q.year===w.year&&q.month<w.month||q.year<w.year&&1===w.month)}(this._calendar,q.firstDate,q.minDate),q.nextDisabled=q.disabled||function(Y,fe,w){const q=Object.assign(Y.getNext(fe,"m"),{day:1});return null!=w&&q.after(w)}(this._calendar,q.lastDate,q.maxDate))}return q}}return Y.\u0275fac=function(w){return new(w||Y)(r.LFG(Vl),r.LFG(Mr))},Y.\u0275prov=r.Yz7({token:Y,factory:Y.\u0275fac}),Y})();var Ss=(()=>{return(Y=Ss||(Ss={}))[Y.PREV=0]="PREV",Y[Y.NEXT=1]="NEXT",Ss;var Y})();let Na=(()=>{class Y{constructor(){this.displayMonths=1,this.firstDayOfWeek=1,this.navigation="select",this.outsideDays="visible",this.showWeekNumbers=!1,this.weekdays=u.Tn.Short}}return Y.\u0275fac=function(w){return new(w||Y)},Y.\u0275prov=r.Yz7({factory:function(){return new Y},token:Y,providedIn:"root"}),Y})();function El(){return new td}let Ks=(()=>{class Y{}return Y.\u0275fac=function(w){return new(w||Y)},Y.\u0275prov=r.Yz7({factory:El,token:Y,providedIn:"root"}),Y})(),td=(()=>{class Y extends Ks{fromModel(w){return w&&To(w.year)&&To(w.month)&&To(w.day)?{year:w.year,month:w.month,day:w.day}:null}toModel(w){return w&&To(w.year)&&To(w.month)&&To(w.day)?{year:w.year,month:w.month,day:w.day}:null}}return Y.\u0275fac=function(){let fe;return function(q){return(fe||(fe=r.n5z(Y)))(q||Y)}}(),Y.\u0275prov=r.Yz7({token:Y,factory:Y.\u0275fac}),Y})(),Lc=(()=>{class Y{constructor(w){this.templateRef=w}}return Y.\u0275fac=function(w){return new(w||Y)(r.Y36(r.Rgc))},Y.\u0275dir=r.lG2({type:Y,selectors:[["ng-template","ngbDatepickerContent",""]]}),Y})(),zl=(()=>{class Y{constructor(w,q,Fe,ut,Xn,Fr,gi,Wi){this._service=w,this._calendar=q,this.i18n=Fe,this._elementRef=Fr,this._ngbDateAdapter=gi,this._ngZone=Wi,this._controlValue=null,this._destroyed$=new he.xQ,this._publicState={},this.navigate=new r.vpe,this.dateSelect=new r.vpe,this.onChange=Po=>{},this.onTouched=()=>{},["dayTemplate","dayTemplateData","displayMonths","firstDayOfWeek","footerTemplate","markDisabled","minDate","maxDate","navigation","outsideDays","showWeekNumbers","startDate","weekdays"].forEach(Po=>this[Po]=ut[Po]),w.dateSelect$.pipe((0,Gt.R)(this._destroyed$)).subscribe(Po=>{this.dateSelect.emit(Po)}),w.model$.pipe((0,Gt.R)(this._destroyed$)).subscribe(Po=>{const Ns=Po.firstDate,ts=this.model?this.model.firstDate:null;this._publicState={maxDate:Po.maxDate,minDate:Po.minDate,firstDate:Po.firstDate,lastDate:Po.lastDate,focusedDate:Po.focusDate,months:Po.months.map(rd=>rd.firstDate)};let Is=!1;if(!Ns.equals(ts)&&(this.navigate.emit({current:ts?{year:ts.year,month:ts.month}:null,next:{year:Ns.year,month:Ns.month},preventDefault:()=>Is=!0}),Is&&null!==ts))return void this._service.open(ts);const ya=Po.selectedDate,zs=Po.focusDate,_c=this.model?this.model.focusDate:null;this.model=Po,V(ya,this._controlValue)&&(this._controlValue=ya,this.onTouched(),this.onChange(this._ngbDateAdapter.toModel(ya))),V(zs,_c)&&_c&&Po.focusVisible&&this.focus(),Xn.markForCheck()})}get state(){return this._publicState}get calendar(){return this._calendar}focusDate(w){this._service.focus(fa.from(w))}focusSelect(){this._service.focusSelect()}focus(){this._ngZone.onStable.asObservable().pipe((0,Bt.q)(1)).subscribe(()=>{const w=this._elementRef.nativeElement.querySelector('div.ngb-dp-day[tabindex="0"]');w&&w.focus()})}navigateTo(w){this._service.open(fa.from(w?w.day?w:Object.assign(Object.assign({},w),{day:1}):null))}ngAfterViewInit(){this._ngZone.runOutsideAngular(()=>{const w=(0,me.R)(this._contentEl.nativeElement,"focusin"),q=(0,me.R)(this._contentEl.nativeElement,"focusout"),{nativeElement:Fe}=this._elementRef;(0,Ye.T)(w,q).pipe((0,Ut.h)(({target:ut,relatedTarget:Xn})=>!(Ru(ut,"ngb-dp-day")&&Ru(Xn,"ngb-dp-day")&&Fe.contains(ut)&&Fe.contains(Xn))),(0,Gt.R)(this._destroyed$)).subscribe(({type:ut})=>this._ngZone.run(()=>this._service.set({focusVisible:"focusin"===ut})))})}ngOnDestroy(){this._destroyed$.next()}ngOnInit(){if(void 0===this.model){const w={};["dayTemplateData","displayMonths","markDisabled","firstDayOfWeek","navigation","minDate","maxDate","outsideDays","weekdays"].forEach(q=>w[q]=this[q]),this._service.set(w),this.navigateTo(this.startDate)}this.dayTemplate||(this.dayTemplate=this._defaultDayTemplate)}ngOnChanges(w){const q={};if(["dayTemplateData","displayMonths","markDisabled","firstDayOfWeek","navigation","minDate","maxDate","outsideDays","weekdays"].filter(Fe=>Fe in w).forEach(Fe=>q[Fe]=this[Fe]),this._service.set(q),"startDate"in w){const{currentValue:Fe,previousValue:ut}=w.startDate;Ae(ut,Fe)&&this.navigateTo(this.startDate)}}onDateSelect(w){this._service.focus(w),this._service.select(w,{emitEvent:!0})}onNavigateDateSelect(w){this._service.open(w)}onNavigateEvent(w){switch(w){case Ss.PREV:this._service.open(this._calendar.getPrev(this.model.firstDate,"m",1));break;case Ss.NEXT:this._service.open(this._calendar.getNext(this.model.firstDate,"m",1))}}registerOnChange(w){this.onChange=w}registerOnTouched(w){this.onTouched=w}setDisabledState(w){this._service.set({disabled:w})}writeValue(w){this._controlValue=fa.from(this._ngbDateAdapter.fromModel(w)),this._service.select(this._controlValue)}}return Y.\u0275fac=function(w){return new(w||Y)(r.Y36(co),r.Y36(Vl),r.Y36(Mr),r.Y36(Na),r.Y36(r.sBO),r.Y36(r.SBq),r.Y36(Ks),r.Y36(r.R0b))},Y.\u0275cmp=r.Xpm({type:Y,selectors:[["ngb-datepicker"]],contentQueries:function(w,q,Fe){if(1&w&&r.Suo(Fe,Lc,7),2&w){let ut;r.iGM(ut=r.CRH())&&(q.contentTemplate=ut.first)}},viewQuery:function(w,q){if(1&w&&(r.Gf(Lr,7),r.Gf(Vn,7)),2&w){let Fe;r.iGM(Fe=r.CRH())&&(q._defaultDayTemplate=Fe.first),r.iGM(Fe=r.CRH())&&(q._contentEl=Fe.first)}},inputs:{dayTemplate:"dayTemplate",dayTemplateData:"dayTemplateData",displayMonths:"displayMonths",firstDayOfWeek:"firstDayOfWeek",footerTemplate:"footerTemplate",markDisabled:"markDisabled",maxDate:"maxDate",minDate:"minDate",navigation:"navigation",outsideDays:"outsideDays",showWeekNumbers:"showWeekNumbers",startDate:"startDate",weekdays:"weekdays"},outputs:{navigate:"navigate",dateSelect:"dateSelect"},exportAs:["ngbDatepicker"],features:[r._Bn([{provide:wr.JU,useExisting:(0,r.Gpc)(()=>Y),multi:!0},co]),r.TTD],decls:10,vars:5,consts:[["defaultDayTemplate",""],["defaultContentTemplate",""],[1,"ngb-dp-header"],[3,"date","months","disabled","showSelect","prevDisabled","nextDisabled","selectBoxes","navigate","select",4,"ngIf"],[1,"ngb-dp-content"],["content",""],[3,"ngTemplateOutlet"],["ngbDatepickerDayView","",3,"date","currentMonth","selected","disabled","focused"],["class","ngb-dp-month",4,"ngFor","ngForOf"],[1,"ngb-dp-month"],["class","ngb-dp-month-name",4,"ngIf"],[3,"month"],[1,"ngb-dp-month-name"],[3,"date","months","disabled","showSelect","prevDisabled","nextDisabled","selectBoxes","navigate","select"]],template:function(w,q){if(1&w&&(r.YNc(0,zr,1,5,"ng-template",null,0,r.W1O),r.YNc(2,Tr,1,1,"ng-template",null,1,r.W1O),r.TgZ(4,"div",2),r.YNc(5,Nr,1,7,"ngb-datepicker-navigation",3),r.qZA(),r.TgZ(6,"div",4,5),r.YNc(8,gn,0,0,"ng-template",6),r.qZA(),r.YNc(9,En,0,0,"ng-template",6)),2&w){const Fe=r.MAs(3);r.xp6(5),r.Q6J("ngIf","none"!==q.navigation),r.xp6(1),r.ekj("ngb-dp-months",!q.contentTemplate),r.xp6(2),r.Q6J("ngTemplateOutlet",(null==q.contentTemplate?null:q.contentTemplate.templateRef)||Fe),r.xp6(1),r.Q6J("ngTemplateOutlet",q.footerTemplate)}},directives:function(){return[u.O5,u.tP,Un,u.sg,_a,ll]},styles:["ngb-datepicker{border:1px solid #dfdfdf;border-radius:.25rem;display:inline-block}ngb-datepicker-month{pointer-events:auto}ngb-datepicker.dropdown-menu{padding:0}.ngb-dp-body{z-index:1050}.ngb-dp-header{border-bottom:0;border-radius:.25rem .25rem 0 0;padding-top:.25rem;background-color:#f8f9fa;background-color:var(--light)}.ngb-dp-months{display:flex}.ngb-dp-month{pointer-events:none}.ngb-dp-month-name{font-size:larger;height:2rem;line-height:2rem;text-align:center;background-color:#f8f9fa;background-color:var(--light)}.ngb-dp-month+.ngb-dp-month .ngb-dp-month-name,.ngb-dp-month+.ngb-dp-month .ngb-dp-week{padding-left:1rem}.ngb-dp-month:last-child .ngb-dp-week{padding-right:.25rem}.ngb-dp-month:first-child .ngb-dp-week{padding-left:.25rem}.ngb-dp-month .ngb-dp-week:last-child{padding-bottom:.25rem}"],encapsulation:2,changeDetection:0}),Y})();var ki=(()=>{return(Y=ki||(ki={}))[Y.Tab=9]="Tab",Y[Y.Enter=13]="Enter",Y[Y.Escape=27]="Escape",Y[Y.Space=32]="Space",Y[Y.PageUp=33]="PageUp",Y[Y.PageDown=34]="PageDown",Y[Y.End=35]="End",Y[Y.Home=36]="Home",Y[Y.ArrowLeft=37]="ArrowLeft",Y[Y.ArrowUp=38]="ArrowUp",Y[Y.ArrowRight=39]="ArrowRight",Y[Y.ArrowDown=40]="ArrowDown",ki;var Y})();let No=(()=>{class Y{processKey(w,q){const{state:Fe,calendar:ut}=q;switch(w.which){case ki.PageUp:q.focusDate(ut.getPrev(Fe.focusedDate,w.shiftKey?"y":"m",1));break;case ki.PageDown:q.focusDate(ut.getNext(Fe.focusedDate,w.shiftKey?"y":"m",1));break;case ki.End:q.focusDate(w.shiftKey?Fe.maxDate:Fe.lastDate);break;case ki.Home:q.focusDate(w.shiftKey?Fe.minDate:Fe.firstDate);break;case ki.ArrowLeft:q.focusDate(ut.getPrev(Fe.focusedDate,"d",1));break;case ki.ArrowUp:q.focusDate(ut.getPrev(Fe.focusedDate,"d",ut.getDaysPerWeek()));break;case ki.ArrowRight:q.focusDate(ut.getNext(Fe.focusedDate,"d",1));break;case ki.ArrowDown:q.focusDate(ut.getNext(Fe.focusedDate,"d",ut.getDaysPerWeek()));break;case ki.Enter:case ki.Space:q.focusSelect();break;default:return}w.preventDefault(),w.stopPropagation()}}return Y.\u0275fac=function(w){return new(w||Y)},Y.\u0275prov=r.Yz7({factory:function(){return new Y},token:Y,providedIn:"root"}),Y})(),_a=(()=>{class Y{constructor(w,q,Fe,ut){this.i18n=w,this.datepicker=q,this._keyboardService=Fe,this._service=ut}set month(w){this.viewModel=this._service.getMonth(w)}onKeyDown(w){this._keyboardService.processKey(w,this.datepicker)}doSelect(w){!w.context.disabled&&!w.hidden&&this.datepicker.onDateSelect(w.date)}}return Y.\u0275fac=function(w){return new(w||Y)(r.Y36(Mr),r.Y36(zl),r.Y36(No),r.Y36(co))},Y.\u0275cmp=r.Xpm({type:Y,selectors:[["ngb-datepicker-month"]],hostAttrs:["role","grid"],hostBindings:function(w,q){1&w&&r.NdJ("keydown",function(ut){return q.onKeyDown(ut)})},inputs:{month:"month"},decls:2,vars:2,consts:[["class","ngb-dp-week ngb-dp-weekdays","role","row",4,"ngIf"],["ngFor","",3,"ngForOf"],["role","row",1,"ngb-dp-week","ngb-dp-weekdays"],["class","ngb-dp-weekday ngb-dp-showweek small",4,"ngIf"],["class","ngb-dp-weekday small","role","columnheader",4,"ngFor","ngForOf"],[1,"ngb-dp-weekday","ngb-dp-showweek","small"],["role","columnheader",1,"ngb-dp-weekday","small"],["class","ngb-dp-week","role","row",4,"ngIf"],["role","row",1,"ngb-dp-week"],["class","ngb-dp-week-number small text-muted",4,"ngIf"],["class","ngb-dp-day","role","gridcell",3,"disabled","tabindex","hidden","ngb-dp-today","click",4,"ngFor","ngForOf"],[1,"ngb-dp-week-number","small","text-muted"],["role","gridcell",1,"ngb-dp-day",3,"tabindex","click"],[3,"ngIf"],[3,"ngTemplateOutlet","ngTemplateOutletContext"]],template:function(w,q){1&w&&(r.YNc(0,zn,3,2,"div",0),r.YNc(1,Ze,1,1,"ng-template",1)),2&w&&(r.Q6J("ngIf",q.viewModel.weekdays.length>0),r.xp6(1),r.Q6J("ngForOf",q.viewModel.weeks))},directives:[u.O5,u.sg,u.tP],styles:['ngb-datepicker-month{display:block}.ngb-dp-week-number,.ngb-dp-weekday{line-height:2rem;text-align:center;font-style:italic}.ngb-dp-weekday{color:#5bc0de;color:var(--info)}.ngb-dp-week{border-radius:.25rem;display:flex}.ngb-dp-weekdays{border-bottom:1px solid rgba(0,0,0,.125);border-radius:0;background-color:#f8f9fa;background-color:var(--light)}.ngb-dp-day,.ngb-dp-week-number,.ngb-dp-weekday{width:2rem;height:2rem}.ngb-dp-day{cursor:pointer}.ngb-dp-day.disabled,.ngb-dp-day.hidden{cursor:default;pointer-events:none}.ngb-dp-day[tabindex="0"]{z-index:1}'],encapsulation:2}),Y})(),ll=(()=>{class Y{constructor(w){this.i18n=w,this.navigation=Ss,this.months=[],this.navigate=new r.vpe,this.select=new r.vpe}onClickPrev(w){w.currentTarget.focus(),this.navigate.emit(this.navigation.PREV)}onClickNext(w){w.currentTarget.focus(),this.navigate.emit(this.navigation.NEXT)}}return Y.\u0275fac=function(w){return new(w||Y)(r.Y36(Mr))},Y.\u0275cmp=r.Xpm({type:Y,selectors:[["ngb-datepicker-navigation"]],inputs:{months:"months",date:"date",disabled:"disabled",showSelect:"showSelect",prevDisabled:"prevDisabled",nextDisabled:"nextDisabled",selectBoxes:"selectBoxes"},outputs:{navigate:"navigate",select:"select"},decls:8,vars:4,consts:function(){let fe,w,q,Fe;return fe="Previous month",w="Previous month",q="Next month",Fe="Next month",[[1,"ngb-dp-arrow"],["type","button","aria-label",fe,"title",w,1,"btn","btn-link","ngb-dp-arrow-btn",3,"disabled","click"],[1,"ngb-dp-navigation-chevron"],["class","ngb-dp-navigation-select",3,"date","disabled","months","years","select",4,"ngIf"],[4,"ngIf"],[1,"ngb-dp-arrow","right"],["type","button","aria-label",q,"title",Fe,1,"btn","btn-link","ngb-dp-arrow-btn",3,"disabled","click"],[1,"ngb-dp-navigation-select",3,"date","disabled","months","years","select"],["ngFor","",3,"ngForOf"],["class","ngb-dp-arrow",4,"ngIf"],[1,"ngb-dp-month-name"]]},template:function(w,q){1&w&&(r.TgZ(0,"div",0),r.TgZ(1,"button",1),r.NdJ("click",function(ut){return q.onClickPrev(ut)}),r._UZ(2,"span",2),r.qZA(),r.qZA(),r.YNc(3,Dr,1,4,"ngb-datepicker-navigation-select",3),r.YNc(4,Wn,1,1,void 0,4),r.TgZ(5,"div",5),r.TgZ(6,"button",6),r.NdJ("click",function(ut){return q.onClickNext(ut)}),r._UZ(7,"span",2),r.qZA(),r.qZA()),2&w&&(r.xp6(1),r.Q6J("disabled",q.prevDisabled),r.xp6(2),r.Q6J("ngIf",q.showSelect),r.xp6(1),r.Q6J("ngIf",!q.showSelect),r.xp6(2),r.Q6J("disabled",q.nextDisabled))},directives:function(){return[u.O5,qn,u.sg]},styles:["ngb-datepicker-navigation{display:flex;align-items:center}.ngb-dp-navigation-chevron{border-style:solid;border-width:.2em .2em 0 0;display:inline-block;width:.75em;height:.75em;margin-left:.25em;margin-right:.15em;transform:rotate(-135deg)}.ngb-dp-arrow{display:flex;flex:1 1 auto;padding-right:0;padding-left:0;margin:0;width:2rem;height:2rem}.ngb-dp-arrow.right{justify-content:flex-end}.ngb-dp-arrow.right .ngb-dp-navigation-chevron{transform:rotate(45deg);margin-left:.15em;margin-right:.25em}.ngb-dp-arrow-btn{padding:0 .25rem;margin:0 .5rem;border:none;background-color:transparent;z-index:1}.ngb-dp-arrow-btn:focus{outline-width:1px;outline-style:auto}@media (-ms-high-contrast:active),(-ms-high-contrast:none){.ngb-dp-arrow-btn:focus{outline-style:solid}}.ngb-dp-month-name{font-size:larger;height:2rem;line-height:2rem;text-align:center}.ngb-dp-navigation-select{display:flex;flex:1 1 9rem}"],encapsulation:2,changeDetection:0}),Y})();const Ul=(Y,fe)=>!!fe&&fe.some(w=>w.contains(Y)),vd=(Y,fe)=>!fe||null!=function(Y,fe){return fe&&void 0!==Y.closest?Y.closest(fe):null}(Y,fe),nd="undefined"!=typeof navigator&&!!navigator.userAgent&&(/iPad|iPhone|iPod/.test(navigator.userAgent)||/Macintosh/.test(navigator.userAgent)&&navigator.maxTouchPoints&&navigator.maxTouchPoints>2||/Android/.test(navigator.userAgent));function ca(Y,fe,w,q,Fe,ut,Xn,Fr){w&&Y.runOutsideAngular((Y=>nd?()=>setTimeout(()=>Y(),100):Y)(()=>{const Wi=(0,me.R)(fe,"keydown").pipe((0,Gt.R)(Fe),(0,Ut.h)(ts=>ts.which===ki.Escape),(0,Yn.b)(ts=>ts.preventDefault())),Po=(0,me.R)(fe,"mousedown").pipe((0,mt.U)(ts=>{const Is=ts.target;return 2!==ts.button&&!Ul(Is,Xn)&&("inside"===w?Ul(Is,ut)&&vd(Is,Fr):"outside"===w?!Ul(Is,ut):vd(Is,Fr)||!Ul(Is,ut))}),(0,Gt.R)(Fe)),Ns=(0,me.R)(fe,"mouseup").pipe(Ve(Po),(0,Ut.h)(([ts,Is])=>Is),(0,Hr.g)(0),(0,Gt.R)(Fe));y([Wi.pipe((0,mt.U)(ts=>0)),Ns.pipe((0,mt.U)(ts=>1))]).subscribe(ts=>Y.run(()=>q(ts)))}))}const jc=["a[href]","button:not([disabled])",'input:not([disabled]):not([type="hidden"])',"select:not([disabled])","textarea:not([disabled])","[contenteditable]",'[tabindex]:not([tabindex="-1"])'].join(", ");function nc(Y){const fe=Array.from(Y.querySelectorAll(jc)).filter(w=>-1!==w.tabIndex);return[fe[0],fe[fe.length-1]]}const df=(Y,fe,w,q=!1)=>{Y.runOutsideAngular(()=>{const Fe=(0,me.R)(fe,"focusin").pipe((0,Gt.R)(w),(0,mt.U)(ut=>ut.target));(0,me.R)(fe,"keydown").pipe((0,Gt.R)(w),(0,Ut.h)(ut=>ut.which===ki.Tab),Ve(Fe)).subscribe(([ut,Xn])=>{const[Fr,gi]=nc(fe);(Xn===Fr||Xn===fe)&&ut.shiftKey&&(gi.focus(),ut.preventDefault()),Xn===gi&&!ut.shiftKey&&(Fr.focus(),ut.preventDefault())}),q&&(0,me.R)(fe,"click").pipe((0,Gt.R)(w),Ve(Fe),(0,mt.U)(ut=>ut[1])).subscribe(ut=>ut.focus())})},zd=/\s+/,Wd=new class{getAllStyles(fe){return window.getComputedStyle(fe)}getStyle(fe,w){return this.getAllStyles(fe)[w]}isStaticPositioned(fe){return"static"===(this.getStyle(fe,"position")||"static")}offsetParent(fe){let w=fe.offsetParent||document.documentElement;for(;w&&w!==document.documentElement&&this.isStaticPositioned(w);)w=w.offsetParent;return w||document.documentElement}position(fe,w=!0){let q,Fe={width:0,height:0,top:0,bottom:0,left:0,right:0};if("fixed"===this.getStyle(fe,"position"))q=fe.getBoundingClientRect(),q={top:q.top,bottom:q.bottom,left:q.left,right:q.right,height:q.height,width:q.width};else{const ut=this.offsetParent(fe);q=this.offset(fe,!1),ut!==document.documentElement&&(Fe=this.offset(ut,!1)),Fe.top+=ut.clientTop,Fe.left+=ut.clientLeft}return q.top-=Fe.top,q.bottom-=Fe.top,q.left-=Fe.left,q.right-=Fe.left,w&&(q.top=Math.round(q.top),q.bottom=Math.round(q.bottom),q.left=Math.round(q.left),q.right=Math.round(q.right)),q}offset(fe,w=!0){const q=fe.getBoundingClientRect(),Fe_top=window.pageYOffset-document.documentElement.clientTop,Fe_left=window.pageXOffset-document.documentElement.clientLeft;let ut={height:q.height||fe.offsetHeight,width:q.width||fe.offsetWidth,top:q.top+Fe_top,bottom:q.bottom+Fe_top,left:q.left+Fe_left,right:q.right+Fe_left};return w&&(ut.height=Math.round(ut.height),ut.width=Math.round(ut.width),ut.top=Math.round(ut.top),ut.bottom=Math.round(ut.bottom),ut.left=Math.round(ut.left),ut.right=Math.round(ut.right)),ut}positionElements(fe,w,q,Fe){const[ut="top",Xn="center"]=q.split("-"),Fr=Fe?this.offset(fe,!1):this.position(fe,!1),gi=this.getAllStyles(w),Wi=parseFloat(gi.marginTop),Po=parseFloat(gi.marginBottom),Ns=parseFloat(gi.marginLeft),ts=parseFloat(gi.marginRight);let Is=0,ya=0;switch(ut){case"top":Is=Fr.top-(w.offsetHeight+Wi+Po);break;case"bottom":Is=Fr.top+Fr.height;break;case"left":ya=Fr.left-(w.offsetWidth+Ns+ts);break;case"right":ya=Fr.left+Fr.width}switch(Xn){case"top":Is=Fr.top;break;case"bottom":Is=Fr.top+Fr.height-w.offsetHeight;break;case"left":ya=Fr.left;break;case"right":ya=Fr.left+Fr.width-w.offsetWidth;break;case"center":"top"===ut||"bottom"===ut?ya=Fr.left+Fr.width/2-w.offsetWidth/2:Is=Fr.top+Fr.height/2-w.offsetHeight/2}w.style.transform=`translate(${Math.round(ya)}px, ${Math.round(Is)}px)`;const zs=w.getBoundingClientRect(),_c=document.documentElement,rd=window.innerHeight||_c.clientHeight,wu=window.innerWidth||_c.clientWidth;return zs.left>=0&&zs.top>=0&&zs.right<=wu&&zs.bottom<=rd}};function Be(Y,fe,w,q,Fe){let ut=Array.isArray(w)?w:w.split(zd);const Xn=["top","bottom","left","right","top-left","top-right","bottom-left","bottom-right","left-top","left-bottom","right-top","right-bottom"],Fr=fe.classList,gi=Is=>{const[ya,zs]=Is.split("-"),_c=[];return Fe&&(_c.push(`${Fe}-${ya}`),zs&&_c.push(`${Fe}-${ya}-${zs}`),_c.forEach(rd=>{Fr.add(rd)})),_c};Fe&&Xn.forEach(Is=>{Fr.remove(`${Fe}-${Is}`)});let Wi=ut.findIndex(Is=>"auto"===Is);Wi>=0&&Xn.forEach(function(Is){null==ut.find(ya=>-1!==ya.search("^"+Is))&&ut.splice(Wi++,1,Is)});const Po=fe.style;Po.position="absolute",Po.top="0",Po.left="0",Po["will-change"]="transform";let Ns=null,ts=!1;for(Ns of ut){let Is=gi(Ns);if(Wd.positionElements(Y,fe,Ns,q)){ts=!0;break}Fe&&Is.forEach(ya=>{Fr.remove(ya)})}return ts||(Ns=ut[0],gi(Ns),Wd.positionElements(Y,fe,Ns,q)),Ns}function Pe(){return new it}let Ce=(()=>{class Y{}return Y.\u0275fac=function(w){return new(w||Y)},Y.\u0275prov=r.Yz7({factory:Pe,token:Y,providedIn:"root"}),Y})(),it=(()=>{class Y extends Ce{parse(w){if(null!=w){const q=w.trim().split("-");if(1===q.length&&Uo(q[0]))return{year:fi(q[0]),month:null,day:null};if(2===q.length&&Uo(q[0])&&Uo(q[1]))return{year:fi(q[0]),month:fi(q[1]),day:null};if(3===q.length&&Uo(q[0])&&Uo(q[1])&&Uo(q[2]))return{year:fi(q[0]),month:fi(q[1]),day:fi(q[2])}}return null}format(w){return w?`${w.year}-${Uo(w.month)?al(w.month):""}-${Uo(w.day)?al(w.day):""}`:""}}return Y.\u0275fac=function(){let fe;return function(q){return(fe||(fe=r.n5z(Y)))(q||Y)}}(),Y.\u0275prov=r.Yz7({token:Y,factory:Y.\u0275fac}),Y})(),yt=(()=>{class Y extends Na{constructor(){super(...arguments),this.autoClose=!0,this.placement=["bottom-left","bottom-right","top-left","top-right"],this.restoreFocus=!0}}return Y.\u0275fac=function(){let fe;return function(q){return(fe||(fe=r.n5z(Y)))(q||Y)}}(),Y.\u0275prov=r.Yz7({factory:function(){return new Y},token:Y,providedIn:"root"}),Y})(),qt=(()=>{class Y{constructor(w,q,Fe,ut,Xn,Fr,gi,Wi,Po,Ns,ts){this._parserFormatter=w,this._elRef=q,this._vcRef=Fe,this._renderer=ut,this._cfr=Xn,this._ngZone=Fr,this._calendar=gi,this._dateAdapter=Wi,this._document=Po,this._changeDetector=Ns,this._cRef=null,this._disabled=!1,this._elWithFocus=null,this._model=null,this.dateSelect=new r.vpe,this.navigate=new r.vpe,this.closed=new r.vpe,this._onChange=Is=>{},this._onTouched=()=>{},this._validatorChange=()=>{},["autoClose","container","positionTarget","placement"].forEach(Is=>this[Is]=ts[Is]),this._zoneSubscription=Fr.onStable.subscribe(()=>this._updatePopupPosition())}get disabled(){return this._disabled}set disabled(w){this._disabled=""===w||w&&"false"!==w,this.isOpen()&&this._cRef.instance.setDisabledState(this._disabled)}registerOnChange(w){this._onChange=w}registerOnTouched(w){this._onTouched=w}registerOnValidatorChange(w){this._validatorChange=w}setDisabledState(w){this.disabled=w}validate(w){const{value:q}=w;if(null!=q){const Fe=this._fromDateStruct(this._dateAdapter.fromModel(q));if(!Fe)return{ngbDate:{invalid:q}};if(this.minDate&&Fe.before(fa.from(this.minDate)))return{ngbDate:{minDate:{minDate:this.minDate,actual:q}}};if(this.maxDate&&Fe.after(fa.from(this.maxDate)))return{ngbDate:{maxDate:{maxDate:this.maxDate,actual:q}}}}return null}writeValue(w){this._model=this._fromDateStruct(this._dateAdapter.fromModel(w)),this._writeModelValue(this._model)}manualDateChange(w,q=!1){const Fe=w!==this._inputValue;Fe&&(this._inputValue=w,this._model=this._fromDateStruct(this._parserFormatter.parse(w))),(Fe||!q)&&this._onChange(this._model?this._dateAdapter.toModel(this._model):""===w?null:w),q&&this._model&&this._writeModelValue(this._model)}isOpen(){return!!this._cRef}open(){if(!this.isOpen()){const w=this._cfr.resolveComponentFactory(zl);this._cRef=this._vcRef.createComponent(w),this._applyPopupStyling(this._cRef.location.nativeElement),this._applyDatepickerInputs(this._cRef.instance),this._subscribeForDatepickerOutputs(this._cRef.instance),this._cRef.instance.ngOnInit(),this._cRef.instance.writeValue(this._dateAdapter.toModel(this._model)),this._cRef.instance.registerOnChange(q=>{this.writeValue(q),this._onChange(q),this._onTouched()}),this._cRef.changeDetectorRef.detectChanges(),this._cRef.instance.setDisabledState(this.disabled),"body"===this.container&&this._document.querySelector(this.container).appendChild(this._cRef.location.nativeElement),this._elWithFocus=this._document.activeElement,df(this._ngZone,this._cRef.location.nativeElement,this.closed,!0),this._cRef.instance.focus(),ca(this._ngZone,this._document,this.autoClose,()=>this.close(),this.closed,[],[this._elRef.nativeElement,this._cRef.location.nativeElement])}}close(){if(this.isOpen()){this._vcRef.remove(this._vcRef.indexOf(this._cRef.hostView)),this._cRef=null,this.closed.emit(),this._changeDetector.markForCheck();let w=this._elWithFocus;Ro(this.restoreFocus)?w=this._document.querySelector(this.restoreFocus):void 0!==this.restoreFocus&&(w=this.restoreFocus),w&&w.focus?w.focus():this._document.body.focus()}}toggle(){this.isOpen()?this.close():this.open()}navigateTo(w){this.isOpen()&&this._cRef.instance.navigateTo(w)}onBlur(){this._onTouched()}onFocus(){this._elWithFocus=this._elRef.nativeElement}ngOnChanges(w){if((w.minDate||w.maxDate)&&(this._validatorChange(),this.isOpen()&&(w.minDate&&(this._cRef.instance.minDate=this.minDate),w.maxDate&&(this._cRef.instance.maxDate=this.maxDate),this._cRef.instance.ngOnChanges(w))),w.datepickerClass){const{currentValue:q,previousValue:Fe}=w.datepickerClass;this._applyPopupClass(q,Fe)}}ngOnDestroy(){this.close(),this._zoneSubscription.unsubscribe()}_applyDatepickerInputs(w){["dayTemplate","dayTemplateData","displayMonths","firstDayOfWeek","footerTemplate","markDisabled","minDate","maxDate","navigation","outsideDays","showNavigation","showWeekNumbers","weekdays"].forEach(q=>{void 0!==this[q]&&(w[q]=this[q])}),w.startDate=this.startDate||this._model}_applyPopupClass(w,q){var Fe;const ut=null===(Fe=this._cRef)||void 0===Fe?void 0:Fe.location.nativeElement;ut&&(w&&this._renderer.addClass(ut,w),q&&this._renderer.removeClass(ut,q))}_applyPopupStyling(w){this._renderer.addClass(w,"dropdown-menu"),this._renderer.addClass(w,"show"),"body"===this.container&&this._renderer.addClass(w,"ngb-dp-body"),this._applyPopupClass(this.datepickerClass)}_subscribeForDatepickerOutputs(w){w.navigate.subscribe(q=>this.navigate.emit(q)),w.dateSelect.subscribe(q=>{this.dateSelect.emit(q),(!0===this.autoClose||"inside"===this.autoClose)&&this.close()})}_writeModelValue(w){const q=this._parserFormatter.format(w);this._inputValue=q,this._renderer.setProperty(this._elRef.nativeElement,"value",q),this.isOpen()&&(this._cRef.instance.writeValue(this._dateAdapter.toModel(w)),this._onTouched())}_fromDateStruct(w){const q=w?new fa(w.year,w.month,w.day):null;return this._calendar.isValid(q)?q:null}_updatePopupPosition(){if(!this._cRef)return;let w;if(w=Ro(this.positionTarget)?this._document.querySelector(this.positionTarget):this.positionTarget instanceof HTMLElement?this.positionTarget:this._elRef.nativeElement,this.positionTarget&&!w)throw new Error("ngbDatepicker could not find element declared in [positionTarget] to position against.");Be(w,this._cRef.location.nativeElement,this.placement,"body"===this.container)}}return Y.\u0275fac=function(w){return new(w||Y)(r.Y36(Ce),r.Y36(r.SBq),r.Y36(r.s_b),r.Y36(r.Qsj),r.Y36(r._Vd),r.Y36(r.R0b),r.Y36(Vl),r.Y36(Ks),r.Y36(u.K0),r.Y36(r.sBO),r.Y36(yt))},Y.\u0275dir=r.lG2({type:Y,selectors:[["input","ngbDatepicker",""]],hostVars:1,hostBindings:function(w,q){1&w&&r.NdJ("input",function(ut){return q.manualDateChange(ut.target.value)})("change",function(ut){return q.manualDateChange(ut.target.value,!0)})("focus",function(){return q.onFocus()})("blur",function(){return q.onBlur()}),2&w&&r.Ikx("disabled",q.disabled)},inputs:{disabled:"disabled",autoClose:"autoClose",datepickerClass:"datepickerClass",dayTemplate:"dayTemplate",dayTemplateData:"dayTemplateData",displayMonths:"displayMonths",firstDayOfWeek:"firstDayOfWeek",footerTemplate:"footerTemplate",markDisabled:"markDisabled",minDate:"minDate",maxDate:"maxDate",navigation:"navigation",outsideDays:"outsideDays",placement:"placement",restoreFocus:"restoreFocus",showWeekNumbers:"showWeekNumbers",startDate:"startDate",container:"container",positionTarget:"positionTarget",weekdays:"weekdays"},outputs:{dateSelect:"dateSelect",navigate:"navigate",closed:"closed"},exportAs:["ngbDatepicker"],features:[r._Bn([{provide:wr.JU,useExisting:(0,r.Gpc)(()=>Y),multi:!0},{provide:wr.Cf,useExisting:(0,r.Gpc)(()=>Y),multi:!0},{provide:Na,useExisting:yt}]),r.TTD]}),Y})(),Un=(()=>{class Y{constructor(w){this.i18n=w}isMuted(){return!this.selected&&(this.date.month!==this.currentMonth||this.disabled)}}return Y.\u0275fac=function(w){return new(w||Y)(r.Y36(Mr))},Y.\u0275cmp=r.Xpm({type:Y,selectors:[["","ngbDatepickerDayView",""]],hostAttrs:[1,"btn-light"],hostVars:10,hostBindings:function(w,q){2&w&&r.ekj("bg-primary",q.selected)("text-white",q.selected)("text-muted",q.isMuted())("outside",q.isMuted())("active",q.focused)},inputs:{currentMonth:"currentMonth",date:"date",disabled:"disabled",focused:"focused",selected:"selected"},attrs:kn,decls:1,vars:1,template:function(w,q){1&w&&r._uU(0),2&w&&r.Oqu(q.i18n.getDayNumerals(q.date))},styles:["[ngbDatepickerDayView]{text-align:center;width:2rem;height:2rem;line-height:2rem;border-radius:.25rem;background:transparent}[ngbDatepickerDayView].outside{opacity:.5}"],encapsulation:2,changeDetection:0}),Y})(),qn=(()=>{class Y{constructor(w,q){this.i18n=w,this._renderer=q,this.select=new r.vpe,this._month=-1,this._year=-1}changeMonth(w){this.select.emit(new fa(this.date.year,fi(w),1))}changeYear(w){this.select.emit(new fa(fi(w),this.date.month,1))}ngAfterViewChecked(){this.date&&(this.date.month!==this._month&&(this._month=this.date.month,this._renderer.setProperty(this.monthSelect.nativeElement,"value",this._month)),this.date.year!==this._year&&(this._year=this.date.year,this._renderer.setProperty(this.yearSelect.nativeElement,"value",this._year)))}}return Y.\u0275fac=function(w){return new(w||Y)(r.Y36(Mr),r.Y36(r.Qsj))},Y.\u0275cmp=r.Xpm({type:Y,selectors:[["ngb-datepicker-navigation-select"]],viewQuery:function(w,q){if(1&w&&(r.Gf(wn,7,r.SBq),r.Gf(nr,7,r.SBq)),2&w){let Fe;r.iGM(Fe=r.CRH())&&(q.monthSelect=Fe.first),r.iGM(Fe=r.CRH())&&(q.yearSelect=Fe.first)}},inputs:{date:"date",disabled:"disabled",months:"months",years:"years"},outputs:{select:"select"},decls:6,vars:4,consts:function(){let fe,w,q,Fe;return fe="Select month",w="Select month",q="Select year",Fe="Select year",[["aria-label",fe,"title",w,1,"custom-select",3,"disabled","change"],["month",""],[3,"value",4,"ngFor","ngForOf"],["aria-label",q,"title",Fe,1,"custom-select",3,"disabled","change"],["year",""],[3,"value"]]},template:function(w,q){1&w&&(r.TgZ(0,"select",0,1),r.NdJ("change",function(ut){return q.changeMonth(ut.target.value)}),r.YNc(2,Gi,2,3,"option",2),r.qZA(),r.TgZ(3,"select",3,4),r.NdJ("change",function(ut){return q.changeYear(ut.target.value)}),r.YNc(5,po,2,2,"option",2),r.qZA()),2&w&&(r.Q6J("disabled",q.disabled),r.xp6(2),r.Q6J("ngForOf",q.months),r.xp6(1),r.Q6J("disabled",q.disabled),r.xp6(2),r.Q6J("ngForOf",q.years))},directives:[u.sg,wr.YN,wr.Kr],styles:["ngb-datepicker-navigation-select>.custom-select{flex:1 1 auto;padding:0 .5rem;font-size:.875rem;height:1.85rem}ngb-datepicker-navigation-select>.custom-select:focus{z-index:1}ngb-datepicker-navigation-select>.custom-select::-ms-value{background-color:transparent!important}"],encapsulation:2,changeDetection:0}),Y})();new Date(1882,10,12),new Date(2174,10,25);let Bu=(()=>{class Y{}return Y.\u0275fac=function(w){return new(w||Y)},Y.\u0275mod=r.oAB({type:Y}),Y.\u0275inj=r.cJS({imports:[[u.ez,wr.u5]]}),Y})(),pc=(()=>{class Y{constructor(){this.autoClose=!0,this.placement=["bottom-left","bottom-right","top-left","top-right"]}}return Y.\u0275fac=function(w){return new(w||Y)},Y.\u0275prov=r.Yz7({factory:function(){return new Y},token:Y,providedIn:"root"}),Y})(),Xd=(()=>{class Y{}return Y.\u0275fac=function(w){return new(w||Y)},Y.\u0275dir=r.lG2({type:Y,selectors:[["",8,"navbar"]]}),Y})(),wf=(()=>{class Y{constructor(w){this.elementRef=w,this._disabled=!1}set disabled(w){this._disabled=""===w||!0===w}get disabled(){return this._disabled}}return Y.\u0275fac=function(w){return new(w||Y)(r.Y36(r.SBq))},Y.\u0275dir=r.lG2({type:Y,selectors:[["","ngbDropdownItem",""]],hostAttrs:[1,"dropdown-item"],hostVars:2,hostBindings:function(w,q){2&w&&r.ekj("disabled",q.disabled)},inputs:{disabled:"disabled"}}),Y})(),Wl=(()=>{class Y{constructor(w,q){this.dropdown=w,this.placement="bottom",this.isOpen=!1,this.nativeElement=q.nativeElement}}return Y.\u0275fac=function(w){return new(w||Y)(r.Y36((0,r.Gpc)(()=>hc)),r.Y36(r.SBq))},Y.\u0275dir=r.lG2({type:Y,selectors:[["","ngbDropdownMenu",""]],contentQueries:function(w,q,Fe){if(1&w&&r.Suo(Fe,wf,4),2&w){let ut;r.iGM(ut=r.CRH())&&(q.menuItems=ut)}},hostVars:5,hostBindings:function(w,q){1&w&&r.NdJ("keydown.ArrowUp",function(ut){return q.dropdown.onKeyDown(ut)})("keydown.ArrowDown",function(ut){return q.dropdown.onKeyDown(ut)})("keydown.Home",function(ut){return q.dropdown.onKeyDown(ut)})("keydown.End",function(ut){return q.dropdown.onKeyDown(ut)})("keydown.Enter",function(ut){return q.dropdown.onKeyDown(ut)})("keydown.Space",function(ut){return q.dropdown.onKeyDown(ut)})("keydown.Tab",function(ut){return q.dropdown.onKeyDown(ut)})("keydown.Shift.Tab",function(ut){return q.dropdown.onKeyDown(ut)}),2&w&&(r.uIk("x-placement",q.placement),r.ekj("dropdown-menu",!0)("show",q.dropdown.isOpen()))}}),Y})(),Pd=(()=>{class Y{constructor(w,q){this.dropdown=w,this.nativeElement=q.nativeElement}}return Y.\u0275fac=function(w){return new(w||Y)(r.Y36((0,r.Gpc)(()=>hc)),r.Y36(r.SBq))},Y.\u0275dir=r.lG2({type:Y,selectors:[["","ngbDropdownAnchor",""]],hostAttrs:[1,"dropdown-toggle"],hostVars:1,hostBindings:function(w,q){2&w&&r.uIk("aria-expanded",q.dropdown.isOpen())}}),Y})(),rc=(()=>{class Y extends Pd{constructor(w,q){super(w,q)}}return Y.\u0275fac=function(w){return new(w||Y)(r.Y36((0,r.Gpc)(()=>hc)),r.Y36(r.SBq))},Y.\u0275dir=r.lG2({type:Y,selectors:[["","ngbDropdownToggle",""]],hostAttrs:[1,"dropdown-toggle"],hostVars:1,hostBindings:function(w,q){1&w&&r.NdJ("click",function(){return q.dropdown.toggle()})("keydown.ArrowUp",function(ut){return q.dropdown.onKeyDown(ut)})("keydown.ArrowDown",function(ut){return q.dropdown.onKeyDown(ut)})("keydown.Home",function(ut){return q.dropdown.onKeyDown(ut)})("keydown.End",function(ut){return q.dropdown.onKeyDown(ut)})("keydown.Tab",function(ut){return q.dropdown.onKeyDown(ut)})("keydown.Shift.Tab",function(ut){return q.dropdown.onKeyDown(ut)}),2&w&&r.uIk("aria-expanded",q.dropdown.isOpen())},features:[r._Bn([{provide:Pd,useExisting:(0,r.Gpc)(()=>Y)}]),r.qOj]}),Y})(),hc=(()=>{class Y{constructor(w,q,Fe,ut,Xn,Fr,gi){this._changeDetector=w,this._document=Fe,this._ngZone=ut,this._elementRef=Xn,this._renderer=Fr,this._closed$=new he.xQ,this._bodyContainer=null,this._open=!1,this.openChange=new r.vpe,this.placement=q.placement,this.container=q.container,this.autoClose=q.autoClose,this.display=gi?"static":"dynamic",this._zoneSubscription=ut.onStable.subscribe(()=>{this._positionMenu()})}ngAfterContentInit(){this._ngZone.onStable.pipe((0,Bt.q)(1)).subscribe(()=>{this._applyPlacementClasses(),this._open&&this._setCloseHandlers()})}ngOnChanges(w){if(w.container&&this._open&&this._applyContainer(this.container),w.placement&&!w.placement.isFirstChange&&this._applyPlacementClasses(),w.dropdownClass){const{currentValue:q,previousValue:Fe}=w.dropdownClass;this._applyCustomDropdownClass(q,Fe)}}isOpen(){return this._open}open(){this._open||(this._open=!0,this._applyContainer(this.container),this.openChange.emit(!0),this._setCloseHandlers(),this._anchor&&this._anchor.nativeElement.focus())}_setCloseHandlers(){ca(this._ngZone,this._document,this.autoClose,w=>{this.close(),0===w&&this._anchor.nativeElement.focus()},this._closed$,this._menu?[this._menu.nativeElement]:[],this._anchor?[this._anchor.nativeElement]:[],".dropdown-item,.dropdown-divider")}close(){this._open&&(this._open=!1,this._resetContainer(),this._closed$.next(),this.openChange.emit(!1),this._changeDetector.markForCheck())}toggle(){this.isOpen()?this.close():this.open()}ngOnDestroy(){this._resetContainer(),this._closed$.next(),this._zoneSubscription.unsubscribe()}onKeyDown(w){const q=w.which,Fe=this._getMenuElements();let ut=-1,Xn=null;const Fr=this._isEventFromToggle(w);if(!Fr&&Fe.length&&Fe.forEach((gi,Wi)=>{gi.contains(w.target)&&(Xn=gi),gi===this._document.activeElement&&(ut=Wi)}),q!==ki.Space&&q!==ki.Enter){if(q!==ki.Tab){if(Fr||Xn){if(this.open(),Fe.length){switch(q){case ki.ArrowDown:ut=Math.min(ut+1,Fe.length-1);break;case ki.ArrowUp:if(this._isDropup()&&-1===ut){ut=Fe.length-1;break}ut=Math.max(ut-1,0);break;case ki.Home:ut=0;break;case ki.End:ut=Fe.length-1}Fe[ut].focus()}w.preventDefault()}}else if(w.target&&this.isOpen()&&this.autoClose){if(this._anchor.nativeElement===w.target)return void("body"!==this.container||w.shiftKey?w.shiftKey&&this.close():(this._renderer.setAttribute(this._menu.nativeElement,"tabindex","0"),this._menu.nativeElement.focus(),this._renderer.removeAttribute(this._menu.nativeElement,"tabindex")));if("body"===this.container){const gi=this._menu.nativeElement.querySelectorAll(jc);w.shiftKey&&w.target===gi[0]?(this._anchor.nativeElement.focus(),w.preventDefault()):!w.shiftKey&&w.target===gi[gi.length-1]&&(this._anchor.nativeElement.focus(),this.close())}else(0,me.R)(w.target,"focusout").pipe((0,Bt.q)(1)).subscribe(({relatedTarget:gi})=>{this._elementRef.nativeElement.contains(gi)||this.close()})}}else Xn&&(!0===this.autoClose||"inside"===this.autoClose)&&(0,me.R)(Xn,"click").pipe((0,Bt.q)(1)).subscribe(()=>this.close())}_isDropup(){return this._elementRef.nativeElement.classList.contains("dropup")}_isEventFromToggle(w){return this._anchor.nativeElement.contains(w.target)}_getMenuElements(){const w=this._menu;return null==w?[]:w.menuItems.filter(q=>!q.disabled).map(q=>q.elementRef.nativeElement)}_positionMenu(){const w=this._menu;this.isOpen()&&w&&this._applyPlacementClasses("dynamic"===this.display?Be(this._anchor.nativeElement,this._bodyContainer||this._menu.nativeElement,this.placement,"body"===this.container):this._getFirstPlacement(this.placement))}_getFirstPlacement(w){return Array.isArray(w)?w[0]:w.split(" ")[0]}_resetContainer(){const w=this._renderer;if(this._menu){const Fe=this._menu.nativeElement;w.appendChild(this._elementRef.nativeElement,Fe),w.removeStyle(Fe,"position"),w.removeStyle(Fe,"transform")}this._bodyContainer&&(w.removeChild(this._document.body,this._bodyContainer),this._bodyContainer=null)}_applyContainer(w=null){if(this._resetContainer(),"body"===w){const q=this._renderer,Fe=this._menu.nativeElement,ut=this._bodyContainer=this._bodyContainer||q.createElement("div");q.setStyle(ut,"position","absolute"),q.setStyle(Fe,"position","static"),q.setStyle(ut,"z-index","1050"),q.appendChild(ut,Fe),q.appendChild(this._document.body,ut)}this._applyCustomDropdownClass(this.dropdownClass)}_applyCustomDropdownClass(w,q){const Fe="body"===this.container?this._bodyContainer:this._elementRef.nativeElement;Fe&&(q&&this._renderer.removeClass(Fe,q),w&&this._renderer.addClass(Fe,w))}_applyPlacementClasses(w){const q=this._menu;if(q){w||(w=this._getFirstPlacement(this.placement));const Fe=this._renderer,ut=this._elementRef.nativeElement;Fe.removeClass(ut,"dropup"),Fe.removeClass(ut,"dropdown"),q.placement="static"===this.display?null:w;const Xn=-1!==w.search("^top")?"dropup":"dropdown";Fe.addClass(ut,Xn);const Fr=this._bodyContainer;Fr&&(Fe.removeClass(Fr,"dropup"),Fe.removeClass(Fr,"dropdown"),Fe.addClass(Fr,Xn))}}}return Y.\u0275fac=function(w){return new(w||Y)(r.Y36(r.sBO),r.Y36(pc),r.Y36(u.K0),r.Y36(r.R0b),r.Y36(r.SBq),r.Y36(r.Qsj),r.Y36(Xd,8))},Y.\u0275dir=r.lG2({type:Y,selectors:[["","ngbDropdown",""]],contentQueries:function(w,q,Fe){if(1&w&&(r.Suo(Fe,Wl,5),r.Suo(Fe,Pd,5)),2&w){let ut;r.iGM(ut=r.CRH())&&(q._menu=ut.first),r.iGM(ut=r.CRH())&&(q._anchor=ut.first)}},hostVars:2,hostBindings:function(w,q){2&w&&r.ekj("show",q.isOpen())},inputs:{_open:["open","_open"],placement:"placement",container:"container",autoClose:"autoClose",display:"display",dropdownClass:"dropdownClass"},outputs:{openChange:"openChange"},exportAs:["ngbDropdown"],features:[r.TTD]}),Y})(),Cc=(()=>{class Y{}return Y.\u0275fac=function(w){return new(w||Y)},Y.\u0275mod=r.oAB({type:Y}),Y.\u0275inj=r.cJS({}),Y})(),Fc=(()=>{class Y{constructor(w){this._ngbConfig=w,this.backdrop=!0,this.keyboard=!0}get animation(){return void 0===this._animation?this._ngbConfig.animation:this._animation}set animation(w){this._animation=w}}return Y.\u0275fac=function(w){return new(w||Y)(r.LFG($s))},Y.\u0275prov=r.Yz7({factory:function(){return new Y(r.LFG($s))},token:Y,providedIn:"root"}),Y})();class fu{constructor(fe,w,q){this.nodes=fe,this.viewRef=w,this.componentRef=q}}class Id{constructor(fe,w,q,Fe,ut,Xn,Fr){this._type=fe,this._injector=w,this._viewContainerRef=q,this._renderer=Fe,this._ngZone=ut,this._componentFactoryResolver=Xn,this._applicationRef=Fr,this._windowRef=null,this._contentRef=null}open(fe,w,q=!1){this._windowRef||(this._contentRef=this._getContentRef(fe,w),this._windowRef=this._viewContainerRef.createComponent(this._componentFactoryResolver.resolveComponentFactory(this._type),this._viewContainerRef.length,this._injector,this._contentRef.nodes));const{nativeElement:Fe}=this._windowRef.location,ut=this._ngZone.onStable.pipe((0,Bt.q)(1),(0,ci.zg)(()=>Nt(this._ngZone,Fe,({classList:Xn})=>Xn.add("show"),{animation:q,runningTransition:"continue"})));return{windowRef:this._windowRef,transition$:ut}}close(fe=!1){return this._windowRef?Nt(this._ngZone,this._windowRef.location.nativeElement,({classList:w})=>w.remove("show"),{animation:fe,runningTransition:"stop"}).pipe((0,Yn.b)(()=>{var w;this._windowRef&&(this._viewContainerRef.remove(this._viewContainerRef.indexOf(this._windowRef.hostView)),this._windowRef=null),(null===(w=this._contentRef)||void 0===w?void 0:w.viewRef)&&(this._applicationRef.detachView(this._contentRef.viewRef),this._contentRef.viewRef.destroy(),this._contentRef=null)})):(0,oe.of)(void 0)}_getContentRef(fe,w){if(fe){if(fe instanceof r.Rgc){const q=fe.createEmbeddedView(w);return this._applicationRef.attachView(q),new fu([q.rootNodes],q)}return new fu([[this._renderer.createText(`${fe}`)]])}return new fu([])}}const Sl=()=>{};let $c=(()=>{class Y{constructor(w){this._document=w}compensate(){const w=this._getWidth();return this._isPresent(w)?this._adjustBody(w):Sl}_adjustBody(w){const q=this._document.body,Fe=q.style.paddingRight,ut=parseFloat(window.getComputedStyle(q)["padding-right"]);return q.style["padding-right"]=`${ut+w}px`,()=>q.style["padding-right"]=Fe}_isPresent(w){const q=this._document.body.getBoundingClientRect();return window.innerWidth-(q.left+q.right)>=w-.1*w}_getWidth(){const w=this._document.createElement("div");w.className="modal-scrollbar-measure";const q=this._document.body;q.appendChild(w);const Fe=w.getBoundingClientRect().width-w.clientWidth;return q.removeChild(w),Fe}}return Y.\u0275fac=function(w){return new(w||Y)(r.LFG(u.K0))},Y.\u0275prov=r.Yz7({factory:function(){return new Y(r.LFG(u.K0))},token:Y,providedIn:"root"}),Y})(),h=(()=>{class Y{constructor(w,q){this._el=w,this._zone=q}ngOnInit(){this._zone.onStable.asObservable().pipe((0,Bt.q)(1)).subscribe(()=>{Nt(this._zone,this._el.nativeElement,(w,q)=>{q&&bc(w),w.classList.add("show")},{animation:this.animation,runningTransition:"continue"})})}hide(){return Nt(this._zone,this._el.nativeElement,({classList:w})=>w.remove("show"),{animation:this.animation,runningTransition:"stop"})}}return Y.\u0275fac=function(w){return new(w||Y)(r.Y36(r.SBq),r.Y36(r.R0b))},Y.\u0275cmp=r.Xpm({type:Y,selectors:[["ngb-modal-backdrop"]],hostAttrs:[2,"z-index","1050"],hostVars:6,hostBindings:function(w,q){2&w&&(r.Tol("modal-backdrop"+(q.backdropClass?" "+q.backdropClass:"")),r.ekj("show",!q.animation)("fade",q.animation))},inputs:{animation:"animation",backdropClass:"backdropClass"},decls:0,vars:0,template:function(w,q){},encapsulation:2}),Y})();class E{close(fe){}dismiss(fe){}}class N{constructor(fe,w,q,Fe){this._windowCmptRef=fe,this._contentRef=w,this._backdropCmptRef=q,this._beforeDismiss=Fe,this._closed=new he.xQ,this._dismissed=new he.xQ,this._hidden=new he.xQ,fe.instance.dismissEvent.subscribe(ut=>{this.dismiss(ut)}),this.result=new Promise((ut,Xn)=>{this._resolve=ut,this._reject=Xn}),this.result.then(null,()=>{})}get componentInstance(){if(this._contentRef&&this._contentRef.componentRef)return this._contentRef.componentRef.instance}get closed(){return this._closed.asObservable().pipe((0,Gt.R)(this._hidden))}get dismissed(){return this._dismissed.asObservable().pipe((0,Gt.R)(this._hidden))}get hidden(){return this._hidden.asObservable()}get shown(){return this._windowCmptRef.instance.shown.asObservable()}close(fe){this._windowCmptRef&&(this._closed.next(fe),this._resolve(fe),this._removeModalElements())}_dismiss(fe){this._dismissed.next(fe),this._reject(fe),this._removeModalElements()}dismiss(fe){if(this._windowCmptRef)if(this._beforeDismiss){const w=this._beforeDismiss();w&&w.then?w.then(q=>{!1!==q&&this._dismiss(fe)},()=>{}):!1!==w&&this._dismiss(fe)}else this._dismiss(fe)}_removeModalElements(){const fe=this._windowCmptRef.instance.hide(),w=this._backdropCmptRef?this._backdropCmptRef.instance.hide():(0,oe.of)(void 0);fe.subscribe(()=>{const{nativeElement:q}=this._windowCmptRef.location;q.parentNode.removeChild(q),this._windowCmptRef.destroy(),this._contentRef&&this._contentRef.viewRef&&this._contentRef.viewRef.destroy(),this._windowCmptRef=null,this._contentRef=null}),w.subscribe(()=>{if(this._backdropCmptRef){const{nativeElement:q}=this._backdropCmptRef.location;q.parentNode.removeChild(q),this._backdropCmptRef.destroy(),this._backdropCmptRef=null}}),J(fe,w).subscribe(()=>{this._hidden.next(),this._hidden.complete()})}}var k=(()=>{return(Y=k||(k={}))[Y.BACKDROP_CLICK=0]="BACKDROP_CLICK",Y[Y.ESC=1]="ESC",k;var Y})();let K=(()=>{class Y{constructor(w,q,Fe){this._document=w,this._elRef=q,this._zone=Fe,this._closed$=new he.xQ,this._elWithFocus=null,this.backdrop=!0,this.keyboard=!0,this.dismissEvent=new r.vpe,this.shown=new he.xQ,this.hidden=new he.xQ}dismiss(w){this.dismissEvent.emit(w)}ngOnInit(){this._elWithFocus=this._document.activeElement,this._zone.onStable.asObservable().pipe((0,Bt.q)(1)).subscribe(()=>{this._show()})}ngOnDestroy(){this._disableEventHandling()}hide(){const{nativeElement:w}=this._elRef,q={animation:this.animation,runningTransition:"stop"},Xn=J(Nt(this._zone,w,()=>w.classList.remove("show"),q),Nt(this._zone,this._dialogEl.nativeElement,()=>{},q));return Xn.subscribe(()=>{this.hidden.next(),this.hidden.complete()}),this._disableEventHandling(),this._restoreFocus(),Xn}_show(){const w={animation:this.animation,runningTransition:"continue"};J(Nt(this._zone,this._elRef.nativeElement,(ut,Xn)=>{Xn&&bc(ut),ut.classList.add("show")},w),Nt(this._zone,this._dialogEl.nativeElement,()=>{},w)).subscribe(()=>{this.shown.next(),this.shown.complete()}),this._enableEventHandling(),this._setFocus()}_enableEventHandling(){const{nativeElement:w}=this._elRef;this._zone.runOutsideAngular(()=>{(0,me.R)(w,"keydown").pipe((0,Gt.R)(this._closed$),(0,Ut.h)(Fe=>Fe.which===ki.Escape)).subscribe(Fe=>{this.keyboard?requestAnimationFrame(()=>{Fe.defaultPrevented||this._zone.run(()=>this.dismiss(k.ESC))}):"static"===this.backdrop&&this._bumpBackdrop()});let q=!1;(0,me.R)(this._dialogEl.nativeElement,"mousedown").pipe((0,Gt.R)(this._closed$),(0,Yn.b)(()=>q=!1),(0,zt.w)(()=>(0,me.R)(w,"mouseup").pipe((0,Gt.R)(this._closed$),(0,Bt.q)(1))),(0,Ut.h)(({target:Fe})=>w===Fe)).subscribe(()=>{q=!0}),(0,me.R)(w,"click").pipe((0,Gt.R)(this._closed$)).subscribe(({target:Fe})=>{w===Fe&&("static"===this.backdrop?this._bumpBackdrop():!0===this.backdrop&&!q&&this._zone.run(()=>this.dismiss(k.BACKDROP_CLICK))),q=!1})})}_disableEventHandling(){this._closed$.next()}_setFocus(){const{nativeElement:w}=this._elRef;if(!w.contains(document.activeElement)){const q=w.querySelector("[ngbAutofocus]"),Fe=nc(w)[0];(q||Fe||w).focus()}}_restoreFocus(){const w=this._document.body,q=this._elWithFocus;let Fe;Fe=q&&q.focus&&w.contains(q)?q:w,this._zone.runOutsideAngular(()=>{setTimeout(()=>Fe.focus()),this._elWithFocus=null})}_bumpBackdrop(){"static"===this.backdrop&&Nt(this._zone,this._elRef.nativeElement,({classList:w})=>(w.add("modal-static"),()=>w.remove("modal-static")),{animation:this.animation,runningTransition:"continue"})}}return Y.\u0275fac=function(w){return new(w||Y)(r.Y36(u.K0),r.Y36(r.SBq),r.Y36(r.R0b))},Y.\u0275cmp=r.Xpm({type:Y,selectors:[["ngb-modal-window"]],viewQuery:function(w,q){if(1&w&&r.Gf(yo,7),2&w){let Fe;r.iGM(Fe=r.CRH())&&(q._dialogEl=Fe.first)}},hostAttrs:["role","dialog","tabindex","-1"],hostVars:7,hostBindings:function(w,q){2&w&&(r.uIk("aria-modal",!0)("aria-labelledby",q.ariaLabelledBy)("aria-describedby",q.ariaDescribedBy),r.Tol("modal d-block"+(q.windowClass?" "+q.windowClass:"")),r.ekj("fade",q.animation))},inputs:{backdrop:"backdrop",keyboard:"keyboard",animation:"animation",ariaLabelledBy:"ariaLabelledBy",ariaDescribedBy:"ariaDescribedBy",centered:"centered",scrollable:"scrollable",size:"size",windowClass:"windowClass",modalDialogClass:"modalDialogClass"},outputs:{dismissEvent:"dismiss"},ngContentSelectors:Hi,decls:4,vars:2,consts:[["role","document"],["dialog",""],[1,"modal-content"]],template:function(w,q){1&w&&(r.F$t(),r.TgZ(0,"div",0,1),r.TgZ(2,"div",2),r.Hsn(3),r.qZA(),r.qZA()),2&w&&r.Tol("modal-dialog"+(q.size?" modal-"+q.size:"")+(q.centered?" modal-dialog-centered":"")+(q.scrollable?" modal-dialog-scrollable":"")+(q.modalDialogClass?" "+q.modalDialogClass:""))},styles:["ngb-modal-window .component-host-scrollable{display:flex;flex-direction:column;overflow:hidden}"],encapsulation:2}),Y})(),de=(()=>{class Y{constructor(w,q,Fe,ut,Xn,Fr){this._applicationRef=w,this._injector=q,this._document=Fe,this._scrollBar=ut,this._rendererFactory=Xn,this._ngZone=Fr,this._activeWindowCmptHasChanged=new he.xQ,this._ariaHiddenValues=new Map,this._backdropAttributes=["animation","backdropClass"],this._modalRefs=[],this._windowAttributes=["animation","ariaLabelledBy","ariaDescribedBy","backdrop","centered","keyboard","scrollable","size","windowClass","modalDialogClass"],this._windowCmpts=[],this._activeInstances=new r.vpe,this._activeWindowCmptHasChanged.subscribe(()=>{if(this._windowCmpts.length){const gi=this._windowCmpts[this._windowCmpts.length-1];df(this._ngZone,gi.location.nativeElement,this._activeWindowCmptHasChanged),this._revertAriaHidden(),this._setAriaHidden(gi.location.nativeElement)}})}open(w,q,Fe,ut){const Xn=ut.container instanceof HTMLElement?ut.container:Ea(ut.container)?this._document.querySelector(ut.container):this._document.body,Fr=this._rendererFactory.createRenderer(null,null),gi=this._scrollBar.compensate(),Wi=()=>{this._modalRefs.length||(Fr.removeClass(this._document.body,"modal-open"),this._revertAriaHidden())};if(!Xn)throw new Error(`The specified modal container "${ut.container||"body"}" was not found in the DOM.`);const Po=new E,Ns=this._getContentRef(w,ut.injector||q,Fe,Po,ut);let ts=!1!==ut.backdrop?this._attachBackdrop(w,Xn):void 0,Is=this._attachWindowComponent(w,Xn,Ns),ya=new N(Is,Ns,ts,ut.beforeDismiss);return this._registerModalRef(ya),this._registerWindowCmpt(Is),ya.result.then(gi,gi),ya.result.then(Wi,Wi),Po.close=zs=>{ya.close(zs)},Po.dismiss=zs=>{ya.dismiss(zs)},this._applyWindowOptions(Is.instance,ut),1===this._modalRefs.length&&Fr.addClass(this._document.body,"modal-open"),ts&&ts.instance&&(this._applyBackdropOptions(ts.instance,ut),ts.changeDetectorRef.detectChanges()),Is.changeDetectorRef.detectChanges(),ya}get activeInstances(){return this._activeInstances}dismissAll(w){this._modalRefs.forEach(q=>q.dismiss(w))}hasOpenModals(){return this._modalRefs.length>0}_attachBackdrop(w,q){let ut=w.resolveComponentFactory(h).create(this._injector);return this._applicationRef.attachView(ut.hostView),q.appendChild(ut.location.nativeElement),ut}_attachWindowComponent(w,q,Fe){let Xn=w.resolveComponentFactory(K).create(this._injector,Fe.nodes);return this._applicationRef.attachView(Xn.hostView),q.appendChild(Xn.location.nativeElement),Xn}_applyWindowOptions(w,q){this._windowAttributes.forEach(Fe=>{Ea(q[Fe])&&(w[Fe]=q[Fe])})}_applyBackdropOptions(w,q){this._backdropAttributes.forEach(Fe=>{Ea(q[Fe])&&(w[Fe]=q[Fe])})}_getContentRef(w,q,Fe,ut,Xn){return Fe?Fe instanceof r.Rgc?this._createFromTemplateRef(Fe,ut):Ro(Fe)?this._createFromString(Fe):this._createFromComponent(w,q,Fe,ut,Xn):new fu([])}_createFromTemplateRef(w,q){const ut=w.createEmbeddedView({$implicit:q,close(Xn){q.close(Xn)},dismiss(Xn){q.dismiss(Xn)}});return this._applicationRef.attachView(ut),new fu([ut.rootNodes],ut)}_createFromString(w){const q=this._document.createTextNode(`${w}`);return new fu([[q]])}_createFromComponent(w,q,Fe,ut,Xn){const Fr=w.resolveComponentFactory(Fe),gi=r.zs3.create({providers:[{provide:E,useValue:ut}],parent:q}),Wi=Fr.create(gi),Po=Wi.location.nativeElement;return Xn.scrollable&&Po.classList.add("component-host-scrollable"),this._applicationRef.attachView(Wi.hostView),new fu([[Po]],Wi.hostView,Wi)}_setAriaHidden(w){const q=w.parentElement;q&&w!==this._document.body&&(Array.from(q.children).forEach(Fe=>{Fe!==w&&"SCRIPT"!==Fe.nodeName&&(this._ariaHiddenValues.set(Fe,Fe.getAttribute("aria-hidden")),Fe.setAttribute("aria-hidden","true"))}),this._setAriaHidden(q))}_revertAriaHidden(){this._ariaHiddenValues.forEach((w,q)=>{w?q.setAttribute("aria-hidden",w):q.removeAttribute("aria-hidden")}),this._ariaHiddenValues.clear()}_registerModalRef(w){const q=()=>{const Fe=this._modalRefs.indexOf(w);Fe>-1&&(this._modalRefs.splice(Fe,1),this._activeInstances.emit(this._modalRefs))};this._modalRefs.push(w),this._activeInstances.emit(this._modalRefs),w.result.then(q,q)}_registerWindowCmpt(w){this._windowCmpts.push(w),this._activeWindowCmptHasChanged.next(),w.onDestroy(()=>{const q=this._windowCmpts.indexOf(w);q>-1&&(this._windowCmpts.splice(q,1),this._activeWindowCmptHasChanged.next())})}}return Y.\u0275fac=function(w){return new(w||Y)(r.LFG(r.z2F),r.LFG(r.zs3),r.LFG(u.K0),r.LFG($c),r.LFG(r.FYo),r.LFG(r.R0b))},Y.\u0275prov=r.Yz7({factory:function(){return new Y(r.LFG(r.z2F),r.LFG(r.gxx),r.LFG(u.K0),r.LFG($c),r.LFG(r.FYo),r.LFG(r.R0b))},token:Y,providedIn:"root"}),Y})(),be=(()=>{class Y{constructor(w,q,Fe,ut){this._moduleCFR=w,this._injector=q,this._modalStack=Fe,this._config=ut}open(w,q={}){const Fe=Object.assign(Object.assign(Object.assign({},this._config),{animation:this._config.animation}),q);return this._modalStack.open(this._moduleCFR,this._injector,w,Fe)}get activeInstances(){return this._modalStack.activeInstances}dismissAll(w){this._modalStack.dismissAll(w)}hasOpenModals(){return this._modalStack.hasOpenModals()}}return Y.\u0275fac=function(w){return new(w||Y)(r.LFG(r._Vd),r.LFG(r.zs3),r.LFG(de),r.LFG(Fc))},Y.\u0275prov=r.Yz7({factory:function(){return new Y(r.LFG(r._Vd),r.LFG(r.gxx),r.LFG(de),r.LFG(Fc))},token:Y,providedIn:"root"}),Y})(),we=(()=>{class Y{constructor(w){this._ngbConfig=w,this.destroyOnHide=!0,this.orientation="horizontal",this.roles="tablist",this.keyboard=!1}get animation(){return void 0===this._animation?this._ngbConfig.animation:this._animation}set animation(w){this._animation=w}}return Y.\u0275fac=function(w){return new(w||Y)(r.LFG($s))},Y.\u0275prov=r.Yz7({factory:function(){return new Y(r.LFG($s))},token:Y,providedIn:"root"}),Y})();const Xe=Y=>Ea(Y)&&""!==Y;let vt=0,Jt=(()=>{class Y{constructor(w){this.templateRef=w}}return Y.\u0275fac=function(w){return new(w||Y)(r.Y36(r.Rgc))},Y.\u0275dir=r.lG2({type:Y,selectors:[["ng-template","ngbNavContent",""]]}),Y})(),Pn=(()=>{class Y{constructor(w,q){this.elementRef=q,this.disabled=!1,this.shown=new r.vpe,this.hidden=new r.vpe,this._nav=w}ngAfterContentChecked(){this.contentTpl=this.contentTpls.first}ngOnInit(){Ea(this.domId)||(this.domId="ngb-nav-"+vt++)}get active(){return this._nav.activeId===this.id}get id(){return Xe(this._id)?this._id:this.domId}get panelDomId(){return`${this.domId}-panel`}isPanelInDom(){return(Ea(this.destroyOnHide)?!this.destroyOnHide:!this._nav.destroyOnHide)||this.active}}return Y.\u0275fac=function(w){return new(w||Y)(r.Y36((0,r.Gpc)(()=>Rn)),r.Y36(r.SBq))},Y.\u0275dir=r.lG2({type:Y,selectors:[["","ngbNavItem",""]],contentQueries:function(w,q,Fe){if(1&w&&r.Suo(Fe,Jt,4),2&w){let ut;r.iGM(ut=r.CRH())&&(q.contentTpls=ut)}},hostVars:2,hostBindings:function(w,q){2&w&&r.ekj("nav-item",!0)},inputs:{disabled:"disabled",domId:"domId",destroyOnHide:"destroyOnHide",_id:["ngbNavItem","_id"]},outputs:{shown:"shown",hidden:"hidden"},exportAs:["ngbNavItem"]}),Y})(),Rn=(()=>{class Y{constructor(w,q,Fe,ut){this.role=w,this._cd=Fe,this._document=ut,this.activeIdChange=new r.vpe,this.shown=new r.vpe,this.hidden=new r.vpe,this.destroy$=new he.xQ,this.navItemChange$=new he.xQ,this.navChange=new r.vpe,this.animation=q.animation,this.destroyOnHide=q.destroyOnHide,this.orientation=q.orientation,this.roles=q.roles,this.keyboard=q.keyboard}click(w){w.disabled||this._updateActiveId(w.id)}onKeyDown(w){if("tablist"!==this.roles||!this.keyboard)return;const q=w.which,Fe=this.links.filter(Fr=>!Fr.navItem.disabled),{length:ut}=Fe;let Xn=-1;if(Fe.forEach((Fr,gi)=>{Fr.elRef.nativeElement===this._document.activeElement&&(Xn=gi)}),ut){switch(q){case ki.ArrowLeft:if("vertical"===this.orientation)return;Xn=(Xn-1+ut)%ut;break;case ki.ArrowRight:if("vertical"===this.orientation)return;Xn=(Xn+1)%ut;break;case ki.ArrowDown:if("horizontal"===this.orientation)return;Xn=(Xn+1)%ut;break;case ki.ArrowUp:if("horizontal"===this.orientation)return;Xn=(Xn-1+ut)%ut;break;case ki.Home:Xn=0;break;case ki.End:Xn=ut-1}"changeWithArrows"===this.keyboard&&this.select(Fe[Xn].navItem.id),Fe[Xn].elRef.nativeElement.focus(),w.preventDefault()}}select(w){this._updateActiveId(w,!1)}ngAfterContentInit(){if(!Ea(this.activeId)){const w=this.items.first?this.items.first.id:null;Xe(w)&&(this._updateActiveId(w,!1),this._cd.detectChanges())}this.items.changes.pipe((0,Gt.R)(this.destroy$)).subscribe(()=>this._notifyItemChanged(this.activeId))}ngOnChanges({activeId:w}){w&&!w.firstChange&&this._notifyItemChanged(w.currentValue)}ngOnDestroy(){this.destroy$.next()}_updateActiveId(w,q=!0){if(this.activeId!==w){let Fe=!1;q&&this.navChange.emit({activeId:this.activeId,nextId:w,preventDefault:()=>{Fe=!0}}),Fe||(this.activeId=w,this.activeIdChange.emit(w),this._notifyItemChanged(w))}}_notifyItemChanged(w){this.navItemChange$.next(this._getItemById(w))}_getItemById(w){return this.items&&this.items.find(q=>q.id===w)||null}}return Y.\u0275fac=function(w){return new(w||Y)(r.$8M("role"),r.Y36(we),r.Y36(r.sBO),r.Y36(u.K0))},Y.\u0275dir=r.lG2({type:Y,selectors:[["","ngbNav",""]],contentQueries:function(w,q,Fe){if(1&w&&(r.Suo(Fe,Pn,4),r.Suo(Fe,sr,5)),2&w){let ut;r.iGM(ut=r.CRH())&&(q.items=ut),r.iGM(ut=r.CRH())&&(q.links=ut)}},hostVars:6,hostBindings:function(w,q){1&w&&r.NdJ("keydown.arrowLeft",function(ut){return q.onKeyDown(ut)})("keydown.arrowRight",function(ut){return q.onKeyDown(ut)})("keydown.arrowDown",function(ut){return q.onKeyDown(ut)})("keydown.arrowUp",function(ut){return q.onKeyDown(ut)})("keydown.Home",function(ut){return q.onKeyDown(ut)})("keydown.End",function(ut){return q.onKeyDown(ut)}),2&w&&(r.uIk("aria-orientation","vertical"===q.orientation&&"tablist"===q.roles?"vertical":void 0)("role",q.role?q.role:q.roles?"tablist":void 0),r.ekj("nav",!0)("flex-column","vertical"===q.orientation))},inputs:{animation:"animation",destroyOnHide:"destroyOnHide",orientation:"orientation",roles:"roles",keyboard:"keyboard",activeId:"activeId"},outputs:{activeIdChange:"activeIdChange",shown:"shown",hidden:"hidden",navChange:"navChange"},exportAs:["ngbNav"],features:[r.TTD]}),Y})(),sr=(()=>{class Y{constructor(w,q,Fe,ut){this.role=w,this.navItem=q,this.nav=Fe,this.elRef=ut}hasNavItemClass(){return this.navItem.elementRef.nativeElement.nodeType===Node.COMMENT_NODE}}return Y.\u0275fac=function(w){return new(w||Y)(r.$8M("role"),r.Y36(Pn),r.Y36(Rn),r.Y36(r.SBq))},Y.\u0275dir=r.lG2({type:Y,selectors:[["a","ngbNavLink",""]],hostAttrs:["href",""],hostVars:14,hostBindings:function(w,q){1&w&&r.NdJ("click",function(ut){return q.nav.click(q.navItem),ut.preventDefault()}),2&w&&(r.Ikx("id",q.navItem.domId),r.uIk("role",q.role?q.role:q.nav.roles?"tab":void 0)("tabindex",q.navItem.disabled?-1:void 0)("aria-controls",q.navItem.isPanelInDom()?q.navItem.panelDomId:null)("aria-selected",q.navItem.active)("aria-disabled",q.navItem.disabled),r.ekj("nav-link",!0)("nav-item",q.hasNavItemClass())("active",q.navItem.active)("disabled",q.navItem.disabled))}}),Y})();const jr=({classList:Y})=>(Y.remove("show"),()=>Y.remove("active")),Ni=(Y,fe)=>{fe&&bc(Y),Y.classList.add("show")};let Vo=(()=>{class Y{constructor(w){this.elRef=w}}return Y.\u0275fac=function(w){return new(w||Y)(r.Y36(r.SBq))},Y.\u0275dir=r.lG2({type:Y,selectors:[["","ngbNavPane",""]],hostAttrs:[1,"tab-pane"],hostVars:5,hostBindings:function(w,q){2&w&&(r.Ikx("id",q.item.panelDomId),r.uIk("role",q.role?q.role:q.nav.roles?"tabpanel":void 0)("aria-labelledby",q.item.domId),r.ekj("fade",q.nav.animation))},inputs:{item:"item",nav:"nav",role:"role"}}),Y})(),$o=(()=>{class Y{constructor(w,q){this._cd=w,this._ngZone=q,this._activePane=null}isPanelTransitioning(w){var q;return(null===(q=this._activePane)||void 0===q?void 0:q.item)===w}ngAfterViewInit(){var w;this._updateActivePane(),this.nav.navItemChange$.pipe((0,Gt.R)(this.nav.destroy$),(0,Yt.O)((null===(w=this._activePane)||void 0===w?void 0:w.item)||null),(0,Dt.x)(),fe=>fe.lift(new en(1))).subscribe(q=>{const Fe={animation:this.nav.animation,runningTransition:"stop"};this._cd.detectChanges(),this._activePane?Nt(this._ngZone,this._activePane.elRef.nativeElement,jr,Fe).subscribe(()=>{var ut;const Xn=null===(ut=this._activePane)||void 0===ut?void 0:ut.item;this._activePane=this._getPaneForItem(q),this._cd.markForCheck(),this._activePane&&(this._activePane.elRef.nativeElement.classList.add("active"),Nt(this._ngZone,this._activePane.elRef.nativeElement,Ni,Fe).subscribe(()=>{q&&(q.shown.emit(),this.nav.shown.emit(q.id))})),Xn&&(Xn.hidden.emit(),this.nav.hidden.emit(Xn.id))}):this._updateActivePane()})}_updateActivePane(){var w,q;this._activePane=this._getActivePane(),null===(w=this._activePane)||void 0===w||w.elRef.nativeElement.classList.add("show"),null===(q=this._activePane)||void 0===q||q.elRef.nativeElement.classList.add("active")}_getPaneForItem(w){return this._panes&&this._panes.find(q=>q.item===w)||null}_getActivePane(){return this._panes&&this._panes.find(w=>w.item.active)||null}}return Y.\u0275fac=function(w){return new(w||Y)(r.Y36(r.sBO),r.Y36(r.R0b))},Y.\u0275cmp=r.Xpm({type:Y,selectors:[["","ngbNavOutlet",""]],viewQuery:function(w,q){if(1&w&&r.Gf(Vo,5),2&w){let Fe;r.iGM(Fe=r.CRH())&&(q._panes=Fe)}},hostVars:2,hostBindings:function(w,q){2&w&&r.ekj("tab-content",!0)},inputs:{paneRole:"paneRole",nav:["ngbNavOutlet","nav"]},attrs:Mo,decls:1,vars:1,consts:[["ngFor","",3,"ngForOf"],["ngbNavPane","",3,"item","nav","role",4,"ngIf"],["ngbNavPane","",3,"item","nav","role"],[3,"ngTemplateOutlet","ngTemplateOutletContext"]],template:function(w,q){1&w&&r.YNc(0,So,1,1,"ng-template",0),2&w&&r.Q6J("ngForOf",q.nav.items)},directives:[u.sg,u.O5,Vo,u.tP],encapsulation:2,changeDetection:0}),Y})(),qs=(()=>{class Y{}return Y.\u0275fac=function(w){return new(w||Y)},Y.\u0275mod=r.oAB({type:Y}),Y.\u0275inj=r.cJS({imports:[[u.ez]]}),Y})();class gf{constructor(fe,w){this.open=fe,this.close=w,w||(this.close=fe)}isManual(){return"manual"===this.open||"manual"===this.close}}const Ga={hover:["mouseenter","mouseleave"],focus:["focusin","focusout"]},nt=Y=>Y>0?(0,Hr.g)(Y):fe=>fe;function fr(Y,fe,w,q,Fe,ut,Xn=0,Fr=0){const gi=function(Y,fe=Ga){const w=(Y||"").trim();if(0===w.length)return[];const q=w.split(/\s+/).map(ut=>ut.split(":")).map(ut=>{let Xn=fe[ut[0]]||ut;return new gf(Xn[0],Xn[1])}),Fe=q.filter(ut=>ut.isManual());if(Fe.length>1)throw"Triggers parse error: only one manual trigger is allowed";if(1===Fe.length&&q.length>1)throw"Triggers parse error: manual trigger can't be mixed with other triggers";return q}(w);if(1===gi.length&&gi[0].isManual())return()=>{};const Wi=function(Y,fe,w,q){return new se.y(Fe=>{const ut=[],Xn=()=>Fe.next(!0),Fr=()=>Fe.next(!1),gi=()=>Fe.next(!q());return w.forEach(Wi=>{Wi.open===Wi.close?ut.push(Y.listen(fe,Wi.open,gi)):ut.push(Y.listen(fe,Wi.open,Xn),Y.listen(fe,Wi.close,Fr))}),()=>{ut.forEach(Wi=>Wi())}})}(Y,fe,gi,q).pipe(function(Y,fe,w){return q=>{let Fe=null;const ut=q.pipe((0,mt.U)(gi=>({open:gi})),(0,Ut.h)(gi=>{const Wi=w();return Wi===gi.open||Fe&&Fe.open!==Wi?(Fe&&Fe.open!==gi.open&&(Fe=null),!1):(Fe=gi,!0)}),(0,Ir.B)()),Xn=ut.pipe((0,Ut.h)(gi=>gi.open),nt(Y)),Fr=ut.pipe((0,Ut.h)(gi=>!gi.open),nt(fe));return(0,Ye.T)(Xn,Fr).pipe((0,Ut.h)(gi=>gi===Fe&&(Fe=null,gi.open!==w())),(0,mt.U)(gi=>gi.open))}}(Xn,Fr,q)).subscribe(Po=>Po?Fe():ut());return()=>Wi.unsubscribe()}let vi=(()=>{class Y{constructor(w){this._ngbConfig=w,this.autoClose=!0,this.placement="auto",this.triggers="click",this.disablePopover=!1,this.openDelay=0,this.closeDelay=0}get animation(){return void 0===this._animation?this._ngbConfig.animation:this._animation}set animation(w){this._animation=w}}return Y.\u0275fac=function(w){return new(w||Y)(r.LFG($s))},Y.\u0275prov=r.Yz7({factory:function(){return new Y(r.LFG($s))},token:Y,providedIn:"root"}),Y})(),ps=0,xa=(()=>{class Y{isTitleTemplate(){return this.title instanceof r.Rgc}}return Y.\u0275fac=function(w){return new(w||Y)},Y.\u0275cmp=r.Xpm({type:Y,selectors:[["ngb-popover-window"]],hostAttrs:["role","tooltip"],hostVars:5,hostBindings:function(w,q){2&w&&(r.Ikx("id",q.id),r.Tol("popover"+(q.popoverClass?" "+q.popoverClass:"")),r.ekj("fade",q.animation))},inputs:{animation:"animation",title:"title",id:"id",popoverClass:"popoverClass",context:"context"},ngContentSelectors:Hi,decls:4,vars:1,consts:[[1,"arrow"],["class","popover-header",4,"ngIf"],[1,"popover-body"],[1,"popover-header"],["simpleTitle",""],[3,"ngTemplateOutlet","ngTemplateOutletContext"]],template:function(w,q){1&w&&(r.F$t(),r._UZ(0,"div",0),r.YNc(1,Ia,4,2,"h3",1),r.TgZ(2,"div",2),r.Hsn(3),r.qZA()),2&w&&(r.xp6(1),r.Q6J("ngIf",q.title))},directives:[u.O5,u.tP],styles:["ngb-popover-window.bs-popover-bottom>.arrow,ngb-popover-window.bs-popover-top>.arrow{left:50%;margin-left:-.5rem}ngb-popover-window.bs-popover-bottom-left>.arrow,ngb-popover-window.bs-popover-top-left>.arrow{left:2em}ngb-popover-window.bs-popover-bottom-right>.arrow,ngb-popover-window.bs-popover-top-right>.arrow{left:auto;right:2em}ngb-popover-window.bs-popover-left>.arrow,ngb-popover-window.bs-popover-right>.arrow{top:50%;margin-top:-.5rem}ngb-popover-window.bs-popover-left-top>.arrow,ngb-popover-window.bs-popover-right-top>.arrow{top:.7em}ngb-popover-window.bs-popover-left-bottom>.arrow,ngb-popover-window.bs-popover-right-bottom>.arrow{top:auto;bottom:.7em}"],encapsulation:2,changeDetection:0}),Y})(),ia=(()=>{class Y{constructor(w,q,Fe,ut,Xn,Fr,gi,Wi,Po,Ns){this._elementRef=w,this._renderer=q,this._ngZone=gi,this._document=Wi,this._changeDetector=Po,this.shown=new r.vpe,this.hidden=new r.vpe,this._ngbPopoverWindowId="ngb-popover-"+ps++,this._windowRef=null,this.animation=Fr.animation,this.autoClose=Fr.autoClose,this.placement=Fr.placement,this.triggers=Fr.triggers,this.container=Fr.container,this.disablePopover=Fr.disablePopover,this.popoverClass=Fr.popoverClass,this.openDelay=Fr.openDelay,this.closeDelay=Fr.closeDelay,this._popupService=new Id(xa,Fe,Xn,q,this._ngZone,ut,Ns),this._zoneSubscription=gi.onStable.subscribe(()=>{this._windowRef&&Be(this._elementRef.nativeElement,this._windowRef.location.nativeElement,this.placement,"body"===this.container,"bs-popover")})}_isDisabled(){return!(!this.disablePopover&&(this.ngbPopover||this.popoverTitle))}open(w){if(!this._windowRef&&!this._isDisabled()){const{windowRef:q,transition$:Fe}=this._popupService.open(this.ngbPopover,w,this.animation);this._windowRef=q,this._windowRef.instance.animation=this.animation,this._windowRef.instance.title=this.popoverTitle,this._windowRef.instance.context=w,this._windowRef.instance.popoverClass=this.popoverClass,this._windowRef.instance.id=this._ngbPopoverWindowId,this._renderer.setAttribute(this._elementRef.nativeElement,"aria-describedby",this._ngbPopoverWindowId),"body"===this.container&&this._document.querySelector(this.container).appendChild(this._windowRef.location.nativeElement),this._windowRef.changeDetectorRef.detectChanges(),this._windowRef.changeDetectorRef.markForCheck(),ca(this._ngZone,this._document,this.autoClose,()=>this.close(),this.hidden,[this._windowRef.location.nativeElement]),Fe.subscribe(()=>this.shown.emit())}}close(){this._windowRef&&(this._renderer.removeAttribute(this._elementRef.nativeElement,"aria-describedby"),this._popupService.close(this.animation).subscribe(()=>{this._windowRef=null,this.hidden.emit(),this._changeDetector.markForCheck()}))}toggle(){this._windowRef?this.close():this.open()}isOpen(){return null!=this._windowRef}ngOnInit(){this._unregisterListenersFn=fr(this._renderer,this._elementRef.nativeElement,this.triggers,this.isOpen.bind(this),this.open.bind(this),this.close.bind(this),+this.openDelay,+this.closeDelay)}ngOnChanges({ngbPopover:w,popoverTitle:q,disablePopover:Fe,popoverClass:ut}){ut&&this.isOpen()&&(this._windowRef.instance.popoverClass=ut.currentValue),(w||q||Fe)&&this._isDisabled()&&this.close()}ngOnDestroy(){this.close(),this._unregisterListenersFn&&this._unregisterListenersFn(),this._zoneSubscription.unsubscribe()}}return Y.\u0275fac=function(w){return new(w||Y)(r.Y36(r.SBq),r.Y36(r.Qsj),r.Y36(r.zs3),r.Y36(r._Vd),r.Y36(r.s_b),r.Y36(vi),r.Y36(r.R0b),r.Y36(u.K0),r.Y36(r.sBO),r.Y36(r.z2F))},Y.\u0275dir=r.lG2({type:Y,selectors:[["","ngbPopover",""]],inputs:{animation:"animation",autoClose:"autoClose",placement:"placement",triggers:"triggers",container:"container",disablePopover:"disablePopover",popoverClass:"popoverClass",openDelay:"openDelay",closeDelay:"closeDelay",ngbPopover:"ngbPopover",popoverTitle:"popoverTitle"},outputs:{shown:"shown",hidden:"hidden"},exportAs:["ngbPopover"],features:[r.TTD]}),Y})(),_l=(()=>{class Y{}return Y.\u0275fac=function(w){return new(w||Y)},Y.\u0275mod=r.oAB({type:Y}),Y.\u0275inj=r.cJS({imports:[[u.ez]]}),Y})(),Jl=(()=>{class Y{constructor(){this.max=100,this.animated=!1,this.striped=!1,this.showValue=!1}}return Y.\u0275fac=function(w){return new(w||Y)},Y.\u0275prov=r.Yz7({factory:function(){return new Y},token:Y,providedIn:"root"}),Y})(),Wc=(()=>{class Y{constructor(w){this.value=0,this.max=w.max,this.animated=w.animated,this.striped=w.striped,this.textType=w.textType,this.type=w.type,this.showValue=w.showValue,this.height=w.height}set max(w){this._max=!Uo(w)||w<=0?100:w}get max(){return this._max}getValue(){return function(Y,fe,w=0){return Math.max(Math.min(Y,fe),w)}(this.value,this.max)}getPercentValue(){return 100*this.getValue()/this.max}}return Y.\u0275fac=function(w){return new(w||Y)(r.Y36(Jl))},Y.\u0275cmp=r.Xpm({type:Y,selectors:[["ngb-progressbar"]],hostAttrs:[1,"progress"],hostVars:2,hostBindings:function(w,q){2&w&&r.Udp("height",q.height)},inputs:{value:"value",max:"max",animated:"animated",striped:"striped",textType:"textType",type:"type",showValue:"showValue",height:"height"},ngContentSelectors:Hi,decls:3,vars:11,consts:function(){let fe;return fe="" + "\ufffd0\ufffd" + "",[["role","progressbar","aria-valuemin","0"],[4,"ngIf"],fe]},template:function(w,q){1&w&&(r.F$t(),r.TgZ(0,"div",0),r.YNc(1,pa,3,3,"span",1),r.Hsn(2),r.qZA()),2&w&&(r.DjV("progress-bar",q.type?" bg-"+q.type:"","",q.textType?" text-"+q.textType:"","\n    ",q.animated?" progress-bar-animated":"","",q.striped?" progress-bar-striped":"",""),r.Udp("width",q.getPercentValue(),"%"),r.uIk("aria-valuenow",q.getValue())("aria-valuemax",q.max),r.xp6(1),r.Q6J("ngIf",q.showValue))},directives:[u.O5],pipes:[u.Zx],encapsulation:2,changeDetection:0}),Y})(),Kf=(()=>{class Y{}return Y.\u0275fac=function(w){return new(w||Y)},Y.\u0275mod=r.oAB({type:Y}),Y.\u0275inj=r.cJS({imports:[[u.ez]]}),Y})();class mf{constructor(fe,w,q){this.hour=fi(fe),this.minute=fi(w),this.second=fi(q)}changeHour(fe=1){this.updateHour((isNaN(this.hour)?0:this.hour)+fe)}updateHour(fe){this.hour=Uo(fe)?(fe<0?24+fe:fe)%24:NaN}changeMinute(fe=1){this.updateMinute((isNaN(this.minute)?0:this.minute)+fe)}updateMinute(fe){Uo(fe)?(this.minute=fe%60<0?60+fe%60:fe%60,this.changeHour(Math.floor(fe/60))):this.minute=NaN}changeSecond(fe=1){this.updateSecond((isNaN(this.second)?0:this.second)+fe)}updateSecond(fe){Uo(fe)?(this.second=fe<0?60+fe%60:fe%60,this.changeMinute(Math.floor(fe/60))):this.second=NaN}isValid(fe=!0){return Uo(this.hour)&&Uo(this.minute)&&(!fe||Uo(this.second))}toString(){return`${this.hour||0}:${this.minute||0}:${this.second||0}`}}let $f=(()=>{class Y{constructor(){this.meridian=!1,this.spinners=!0,this.seconds=!1,this.hourStep=1,this.minuteStep=1,this.secondStep=1,this.disabled=!1,this.readonlyInputs=!1,this.size="medium"}}return Y.\u0275fac=function(w){return new(w||Y)},Y.\u0275prov=r.Yz7({factory:function(){return new Y},token:Y,providedIn:"root"}),Y})();function dd(){return new fp}let Fd=(()=>{class Y{}return Y.\u0275fac=function(w){return new(w||Y)},Y.\u0275prov=r.Yz7({factory:dd,token:Y,providedIn:"root"}),Y})(),fp=(()=>{class Y extends Fd{fromModel(w){return w&&To(w.hour)&&To(w.minute)?{hour:w.hour,minute:w.minute,second:To(w.second)?w.second:null}:null}toModel(w){return w&&To(w.hour)&&To(w.minute)?{hour:w.hour,minute:w.minute,second:To(w.second)?w.second:null}:null}}return Y.\u0275fac=function(){let fe;return function(q){return(fe||(fe=r.n5z(Y)))(q||Y)}}(),Y.\u0275prov=r.Yz7({token:Y,factory:Y.\u0275fac}),Y})(),Kh=(()=>{class Y{}return Y.\u0275fac=function(w){return new(w||Y)},Y.\u0275prov=r.Yz7({factory:function(){return function(Y){return new F_(Y)}(r.LFG(r.soG))},token:Y,providedIn:"root"}),Y})(),F_=(()=>{class Y extends Kh{constructor(w){super(),this._periods=(0,u.ol)(w,u.x.Standalone,u.Tn.Narrow)}getMorningPeriod(){return this._periods[0]}getAfternoonPeriod(){return this._periods[1]}}return Y.\u0275fac=function(w){return new(w||Y)(r.LFG(r.soG))},Y.\u0275prov=r.Yz7({token:Y,factory:Y.\u0275fac}),Y})();const Hf=/[^0-9]/g;let kd=(()=>{class Y{constructor(w,q,Fe,ut){this._config=w,this._ngbTimeAdapter=q,this._cd=Fe,this.i18n=ut,this.onChange=Xn=>{},this.onTouched=()=>{},this.meridian=w.meridian,this.spinners=w.spinners,this.seconds=w.seconds,this.hourStep=w.hourStep,this.minuteStep=w.minuteStep,this.secondStep=w.secondStep,this.disabled=w.disabled,this.readonlyInputs=w.readonlyInputs,this.size=w.size}set hourStep(w){this._hourStep=To(w)?w:this._config.hourStep}get hourStep(){return this._hourStep}set minuteStep(w){this._minuteStep=To(w)?w:this._config.minuteStep}get minuteStep(){return this._minuteStep}set secondStep(w){this._secondStep=To(w)?w:this._config.secondStep}get secondStep(){return this._secondStep}writeValue(w){const q=this._ngbTimeAdapter.fromModel(w);this.model=q?new mf(q.hour,q.minute,q.second):new mf,!this.seconds&&(!q||!Uo(q.second))&&(this.model.second=0),this._cd.markForCheck()}registerOnChange(w){this.onChange=w}registerOnTouched(w){this.onTouched=w}setDisabledState(w){this.disabled=w}changeHour(w){this.model.changeHour(w),this.propagateModelChange()}changeMinute(w){this.model.changeMinute(w),this.propagateModelChange()}changeSecond(w){this.model.changeSecond(w),this.propagateModelChange()}updateHour(w){const q=this.model.hour>=12,Fe=fi(w);this.model.updateHour(this.meridian&&(q&&Fe<12||!q&&12===Fe)?Fe+12:Fe),this.propagateModelChange()}updateMinute(w){this.model.updateMinute(fi(w)),this.propagateModelChange()}updateSecond(w){this.model.updateSecond(fi(w)),this.propagateModelChange()}toggleMeridian(){this.meridian&&this.changeHour(12)}formatInput(w){w.value=w.value.replace(Hf,"")}formatHour(w){return Uo(w)?al(this.meridian?w%12==0?12:w%12:w%24):al(NaN)}formatMinSec(w){return al(Uo(w)?w:NaN)}handleBlur(){this.onTouched()}get isSmallSize(){return"small"===this.size}get isLargeSize(){return"large"===this.size}ngOnChanges(w){w.seconds&&!this.seconds&&this.model&&!Uo(this.model.second)&&(this.model.second=0,this.propagateModelChange(!1))}propagateModelChange(w=!0){w&&this.onTouched(),this.model.isValid(this.seconds)?this.onChange(this._ngbTimeAdapter.toModel({hour:this.model.hour,minute:this.model.minute,second:this.model.second})):this.onChange(this._ngbTimeAdapter.toModel(null))}}return Y.\u0275fac=function(w){return new(w||Y)(r.Y36($f),r.Y36(Fd),r.Y36(r.sBO),r.Y36(Kh))},Y.\u0275cmp=r.Xpm({type:Y,selectors:[["ngb-timepicker"]],inputs:{meridian:"meridian",spinners:"spinners",seconds:"seconds",hourStep:"hourStep",minuteStep:"minuteStep",secondStep:"secondStep",readonlyInputs:"readonlyInputs",size:"size"},features:[r._Bn([{provide:wr.JU,useExisting:(0,r.Gpc)(()=>Y),multi:!0}]),r.TTD],decls:16,vars:25,consts:function(){let fe,w,q,Fe,ut,Xn,Fr,gi,Wi,Po,Ns,ts,Is,ya;return fe="HH",w="Hours",q="MM",Fe="Minutes",ut="Increment hours",Xn="Decrement hours",Fr="Increment minutes",gi="Decrement minutes",Wi="SS",Po="Seconds",Ns="Increment seconds",ts="Decrement seconds",Is="" + "\ufffd0\ufffd" + "",ya="" + "\ufffd0\ufffd" + "",[[3,"disabled"],[1,"ngb-tp"],[1,"ngb-tp-input-container","ngb-tp-hour"],["tabindex","-1","type","button","class","btn btn-link",3,"btn-sm","btn-lg","disabled","click",4,"ngIf"],["type","text","maxlength","2","inputmode","numeric","placeholder",fe,"aria-label",w,1,"ngb-tp-input","form-control",3,"value","readOnly","disabled","change","blur","input","keydown.ArrowUp","keydown.ArrowDown"],[1,"ngb-tp-spacer"],[1,"ngb-tp-input-container","ngb-tp-minute"],["type","text","maxlength","2","inputmode","numeric","placeholder",q,"aria-label",Fe,1,"ngb-tp-input","form-control",3,"value","readOnly","disabled","change","blur","input","keydown.ArrowUp","keydown.ArrowDown"],["class","ngb-tp-spacer",4,"ngIf"],["class","ngb-tp-input-container ngb-tp-second",4,"ngIf"],["class","ngb-tp-meridian",4,"ngIf"],["tabindex","-1","type","button",1,"btn","btn-link",3,"disabled","click"],[1,"chevron","ngb-tp-chevron"],[1,"sr-only"],ut,[1,"chevron","ngb-tp-chevron","bottom"],Xn,Fr,gi,[1,"ngb-tp-input-container","ngb-tp-second"],["type","text","maxlength","2","inputmode","numeric","placeholder",Wi,"aria-label",Po,1,"ngb-tp-input","form-control",3,"value","readOnly","disabled","change","blur","input","keydown.ArrowUp","keydown.ArrowDown"],Ns,ts,[1,"ngb-tp-meridian"],["type","button",1,"btn","btn-outline-primary",3,"disabled","click"],[4,"ngIf","ngIfElse"],["am",""],Is,ya]},template:function(w,q){1&w&&(r.TgZ(0,"fieldset",0),r.TgZ(1,"div",1),r.TgZ(2,"div",2),r.YNc(3,fo,4,7,"button",3),r.TgZ(4,"input",4),r.NdJ("change",function(ut){return q.updateHour(ut.target.value)})("blur",function(){return q.handleBlur()})("input",function(ut){return q.formatInput(ut.target)})("keydown.ArrowUp",function(ut){return q.changeHour(q.hourStep),ut.preventDefault()})("keydown.ArrowDown",function(ut){return q.changeHour(-q.hourStep),ut.preventDefault()}),r.qZA(),r.YNc(5,Da,4,7,"button",3),r.qZA(),r.TgZ(6,"div",5),r._uU(7,":"),r.qZA(),r.TgZ(8,"div",6),r.YNc(9,Ao,4,7,"button",3),r.TgZ(10,"input",7),r.NdJ("change",function(ut){return q.updateMinute(ut.target.value)})("blur",function(){return q.handleBlur()})("input",function(ut){return q.formatInput(ut.target)})("keydown.ArrowUp",function(ut){return q.changeMinute(q.minuteStep),ut.preventDefault()})("keydown.ArrowDown",function(ut){return q.changeMinute(-q.minuteStep),ut.preventDefault()}),r.qZA(),r.YNc(11,ls,4,7,"button",3),r.qZA(),r.YNc(12,gs,2,0,"div",8),r.YNc(13,Qs,4,9,"div",9),r.YNc(14,Fo,1,0,"div",8),r.YNc(15,ms,5,9,"div",10),r.qZA(),r.qZA()),2&w&&(r.ekj("disabled",q.disabled),r.Q6J("disabled",q.disabled),r.xp6(3),r.Q6J("ngIf",q.spinners),r.xp6(1),r.ekj("form-control-sm",q.isSmallSize)("form-control-lg",q.isLargeSize),r.Q6J("value",q.formatHour(null==q.model?null:q.model.hour))("readOnly",q.readonlyInputs)("disabled",q.disabled),r.xp6(1),r.Q6J("ngIf",q.spinners),r.xp6(4),r.Q6J("ngIf",q.spinners),r.xp6(1),r.ekj("form-control-sm",q.isSmallSize)("form-control-lg",q.isLargeSize),r.Q6J("value",q.formatMinSec(null==q.model?null:q.model.minute))("readOnly",q.readonlyInputs)("disabled",q.disabled),r.xp6(1),r.Q6J("ngIf",q.spinners),r.xp6(1),r.Q6J("ngIf",q.seconds),r.xp6(1),r.Q6J("ngIf",q.seconds),r.xp6(1),r.Q6J("ngIf",q.meridian),r.xp6(1),r.Q6J("ngIf",q.meridian))},directives:[u.O5],styles:['ngb-timepicker{font-size:1rem}.ngb-tp{display:flex;align-items:center}.ngb-tp-input-container{width:4em}.ngb-tp-chevron:before{border-style:solid;border-width:.29em .29em 0 0;content:"";display:inline-block;height:.69em;left:.05em;position:relative;top:.15em;transform:rotate(-45deg);vertical-align:middle;width:.69em}.ngb-tp-chevron.bottom:before{top:-.3em;transform:rotate(135deg)}.ngb-tp-input{text-align:center}.ngb-tp-hour,.ngb-tp-meridian,.ngb-tp-minute,.ngb-tp-second{display:flex;flex-direction:column;align-items:center;justify-content:space-around}.ngb-tp-spacer{width:1em;text-align:center}'],encapsulation:2}),Y})(),Uf=(()=>{class Y{}return Y.\u0275fac=function(w){return new(w||Y)},Y.\u0275mod=r.oAB({type:Y}),Y.\u0275inj=r.cJS({imports:[[u.ez]]}),Y})(),th=(()=>{class Y{constructor(w){this._ngbConfig=w,this.autoClose=!0,this.placement="auto",this.triggers="hover focus",this.disableTooltip=!1,this.openDelay=0,this.closeDelay=0}get animation(){return void 0===this._animation?this._ngbConfig.animation:this._animation}set animation(w){this._animation=w}}return Y.\u0275fac=function(w){return new(w||Y)(r.LFG($s))},Y.\u0275prov=r.Yz7({factory:function(){return new Y(r.LFG($s))},token:Y,providedIn:"root"}),Y})(),Td=0,xf=(()=>{class Y{}return Y.\u0275fac=function(w){return new(w||Y)},Y.\u0275cmp=r.Xpm({type:Y,selectors:[["ngb-tooltip-window"]],hostAttrs:["role","tooltip"],hostVars:5,hostBindings:function(w,q){2&w&&(r.Ikx("id",q.id),r.Tol("tooltip"+(q.tooltipClass?" "+q.tooltipClass:"")),r.ekj("fade",q.animation))},inputs:{animation:"animation",id:"id",tooltipClass:"tooltipClass"},ngContentSelectors:Hi,decls:3,vars:0,consts:[[1,"arrow"],[1,"tooltip-inner"]],template:function(w,q){1&w&&(r.F$t(),r._UZ(0,"div",0),r.TgZ(1,"div",1),r.Hsn(2),r.qZA())},styles:["ngb-tooltip-window{pointer-events:none}ngb-tooltip-window .tooltip-inner{pointer-events:auto}ngb-tooltip-window.bs-tooltip-bottom .arrow,ngb-tooltip-window.bs-tooltip-top .arrow{left:calc(50% - .4rem)}ngb-tooltip-window.bs-tooltip-bottom-left .arrow,ngb-tooltip-window.bs-tooltip-top-left .arrow{left:1em}ngb-tooltip-window.bs-tooltip-bottom-right .arrow,ngb-tooltip-window.bs-tooltip-top-right .arrow{left:auto;right:.8rem}ngb-tooltip-window.bs-tooltip-left .arrow,ngb-tooltip-window.bs-tooltip-right .arrow{top:calc(50% - .4rem)}ngb-tooltip-window.bs-tooltip-left-top .arrow,ngb-tooltip-window.bs-tooltip-right-top .arrow{top:.4rem}ngb-tooltip-window.bs-tooltip-left-bottom .arrow,ngb-tooltip-window.bs-tooltip-right-bottom .arrow{top:auto;bottom:.4rem}"],encapsulation:2,changeDetection:0}),Y})(),wh=(()=>{class Y{constructor(w,q,Fe,ut,Xn,Fr,gi,Wi,Po,Ns){this._elementRef=w,this._renderer=q,this._ngZone=gi,this._document=Wi,this._changeDetector=Po,this.shown=new r.vpe,this.hidden=new r.vpe,this._ngbTooltipWindowId="ngb-tooltip-"+Td++,this._windowRef=null,this.animation=Fr.animation,this.autoClose=Fr.autoClose,this.placement=Fr.placement,this.triggers=Fr.triggers,this.container=Fr.container,this.disableTooltip=Fr.disableTooltip,this.tooltipClass=Fr.tooltipClass,this.openDelay=Fr.openDelay,this.closeDelay=Fr.closeDelay,this._popupService=new Id(xf,Fe,Xn,q,this._ngZone,ut,Ns),this._zoneSubscription=gi.onStable.subscribe(()=>{this._windowRef&&Be(this._elementRef.nativeElement,this._windowRef.location.nativeElement,this.placement,"body"===this.container,"bs-tooltip")})}set ngbTooltip(w){this._ngbTooltip=w,!w&&this._windowRef&&this.close()}get ngbTooltip(){return this._ngbTooltip}open(w){if(!this._windowRef&&this._ngbTooltip&&!this.disableTooltip){const{windowRef:q,transition$:Fe}=this._popupService.open(this._ngbTooltip,w,this.animation);this._windowRef=q,this._windowRef.instance.animation=this.animation,this._windowRef.instance.tooltipClass=this.tooltipClass,this._windowRef.instance.id=this._ngbTooltipWindowId,this._renderer.setAttribute(this._elementRef.nativeElement,"aria-describedby",this._ngbTooltipWindowId),"body"===this.container&&this._document.querySelector(this.container).appendChild(this._windowRef.location.nativeElement),this._windowRef.changeDetectorRef.detectChanges(),this._windowRef.changeDetectorRef.markForCheck(),ca(this._ngZone,this._document,this.autoClose,()=>this.close(),this.hidden,[this._windowRef.location.nativeElement]),Fe.subscribe(()=>this.shown.emit())}}close(){null!=this._windowRef&&(this._renderer.removeAttribute(this._elementRef.nativeElement,"aria-describedby"),this._popupService.close(this.animation).subscribe(()=>{this._windowRef=null,this.hidden.emit(),this._changeDetector.markForCheck()}))}toggle(){this._windowRef?this.close():this.open()}isOpen(){return null!=this._windowRef}ngOnInit(){this._unregisterListenersFn=fr(this._renderer,this._elementRef.nativeElement,this.triggers,this.isOpen.bind(this),this.open.bind(this),this.close.bind(this),+this.openDelay,+this.closeDelay)}ngOnChanges({tooltipClass:w}){w&&this.isOpen()&&(this._windowRef.instance.tooltipClass=w.currentValue)}ngOnDestroy(){this.close(),this._unregisterListenersFn&&this._unregisterListenersFn(),this._zoneSubscription.unsubscribe()}}return Y.\u0275fac=function(w){return new(w||Y)(r.Y36(r.SBq),r.Y36(r.Qsj),r.Y36(r.zs3),r.Y36(r._Vd),r.Y36(r.s_b),r.Y36(th),r.Y36(r.R0b),r.Y36(u.K0),r.Y36(r.sBO),r.Y36(r.z2F))},Y.\u0275dir=r.lG2({type:Y,selectors:[["","ngbTooltip",""]],inputs:{animation:"animation",autoClose:"autoClose",placement:"placement",triggers:"triggers",container:"container",disableTooltip:"disableTooltip",tooltipClass:"tooltipClass",openDelay:"openDelay",closeDelay:"closeDelay",ngbTooltip:"ngbTooltip"},outputs:{shown:"shown",hidden:"hidden"},exportAs:["ngbTooltip"],features:[r.TTD]}),Y})(),Up=(()=>{class Y{}return Y.\u0275fac=function(w){return new(w||Y)},Y.\u0275mod=r.oAB({type:Y}),Y.\u0275inj=r.cJS({}),Y})(),nh=(()=>{class Y{constructor(){this.highlightClass="ngb-highlight",this.accentSensitive=!0}ngOnChanges(w){!this.accentSensitive&&!String.prototype.normalize&&(console.warn("The `accentSensitive` input in `ngb-highlight` cannot be set to `false` in a browser that does not implement the `String.normalize` function. You will have to include a polyfill in your application to use this feature in the current browser."),this.accentSensitive=!0);const q=Oi(this.result),Fe=Array.isArray(this.term)?this.term:[this.term],ut=Wi=>this.accentSensitive?Wi:Hl(Wi),Xn=Fe.map(Wi=>function(Y){return Y.replace(/[-[\]{}()*+?.,\\^$|#\s]/g,"\\$&")}(ut(Oi(Wi)))).filter(Wi=>Wi),Fr=this.accentSensitive?q:Hl(q),gi=Xn.length?Fr.split(new RegExp(`(${Xn.join("|")})`,"gmi")):[q];if(this.accentSensitive)this.parts=gi;else{let Wi=0;this.parts=gi.map(Po=>q.substring(Wi,Wi+=Po.length))}}}return Y.\u0275fac=function(w){return new(w||Y)},Y.\u0275cmp=r.Xpm({type:Y,selectors:[["ngb-highlight"]],inputs:{highlightClass:"highlightClass",accentSensitive:"accentSensitive",result:"result",term:"term"},features:[r.TTD],decls:1,vars:1,consts:[["ngFor","",3,"ngForOf"],[3,"class",4,"ngIf","ngIfElse"],["even",""]],template:function(w,q){1&w&&r.YNc(0,ne,3,2,"ng-template",0),2&w&&r.Q6J("ngForOf",q.parts)},directives:[u.sg,u.O5],styles:[".ngb-highlight{font-weight:700}"],encapsulation:2,changeDetection:0}),Y})(),xh=(()=>{class Y{constructor(){this.activeIdx=0,this.focusFirst=!0,this.formatter=Oi,this.selectEvent=new r.vpe,this.activeChangeEvent=new r.vpe}hasActive(){return this.activeIdx>-1&&this.activeIdx<this.results.length}getActive(){return this.results[this.activeIdx]}markActive(w){this.activeIdx=w,this._activeChanged()}next(){this.activeIdx===this.results.length-1?this.activeIdx=this.focusFirst?(this.activeIdx+1)%this.results.length:-1:this.activeIdx++,this._activeChanged()}prev(){this.activeIdx<0?this.activeIdx=this.results.length-1:0===this.activeIdx?this.activeIdx=this.focusFirst?this.results.length-1:-1:this.activeIdx--,this._activeChanged()}resetActive(){this.activeIdx=this.focusFirst?0:-1,this._activeChanged()}select(w){this.selectEvent.emit(w)}ngOnInit(){this.resetActive()}_activeChanged(){this.activeChangeEvent.emit(this.activeIdx>=0?this.id+"-"+this.activeIdx:void 0)}}return Y.\u0275fac=function(w){return new(w||Y)},Y.\u0275cmp=r.Xpm({type:Y,selectors:[["ngb-typeahead-window"]],hostAttrs:["role","listbox"],hostVars:3,hostBindings:function(w,q){1&w&&r.NdJ("mousedown",function(ut){return ut.preventDefault()}),2&w&&(r.Ikx("id",q.id),r.Tol("dropdown-menu show"+(q.popupClass?" "+q.popupClass:"")))},inputs:{focusFirst:"focusFirst",formatter:"formatter",id:"id",results:"results",term:"term",resultTemplate:"resultTemplate",popupClass:"popupClass"},outputs:{selectEvent:"select",activeChangeEvent:"activeChange"},exportAs:["ngbTypeaheadWindow"],decls:3,vars:1,consts:[["rt",""],["ngFor","",3,"ngForOf"],[3,"result","term"],["type","button","role","option",1,"dropdown-item",3,"id","mouseenter","click"],[3,"ngTemplateOutlet","ngTemplateOutletContext"]],template:function(w,q){1&w&&(r.YNc(0,$e,1,2,"ng-template",null,0,r.W1O),r.YNc(2,ei,2,9,"ng-template",1)),2&w&&(r.xp6(2),r.Q6J("ngForOf",q.results))},directives:[u.sg,nh,u.tP],encapsulation:2}),Y})();const vf=new r.OlP("live announcer delay",{providedIn:"root",factory:function(){return 100}});function $d(Y,fe=!1){let w=Y.body.querySelector("#ngb-live");return null==w&&fe&&(w=Y.createElement("div"),w.setAttribute("id","ngb-live"),w.setAttribute("aria-live","polite"),w.setAttribute("aria-atomic","true"),w.classList.add("sr-only"),Y.body.appendChild(w)),w}let pp=(()=>{class Y{constructor(w,q){this._document=w,this._delay=q}ngOnDestroy(){const w=$d(this._document);w&&w.parentElement.removeChild(w)}say(w){const q=$d(this._document,!0),Fe=this._delay;if(null!=q){q.textContent="";const ut=()=>q.textContent=w;null===Fe?ut():setTimeout(ut,Fe)}}}return Y.\u0275fac=function(w){return new(w||Y)(r.LFG(u.K0),r.LFG(vf))},Y.\u0275prov=r.Yz7({factory:function(){return new Y(r.LFG(u.K0),r.LFG(vf))},token:Y,providedIn:"root"}),Y})(),Bf=(()=>{class Y{constructor(){this.editable=!0,this.focusFirst=!0,this.showHint=!1,this.placement=["bottom-left","bottom-right","top-left","top-right"]}}return Y.\u0275fac=function(w){return new(w||Y)},Y.\u0275prov=r.Yz7({factory:function(){return new Y},token:Y,providedIn:"root"}),Y})(),Kd=0,oc=(()=>{class Y{constructor(w,q,Fe,ut,Xn,Fr,gi,Wi,Po,Ns,ts,Is){this._elementRef=w,this._renderer=Fe,this._live=Wi,this._document=Po,this._ngZone=Ns,this._changeDetector=ts,this._subscription=null,this._closed$=new he.xQ,this._inputValueBackup=null,this._windowRef=null,this.autocomplete="off",this.placement="bottom-left",this.selectItem=new r.vpe,this.activeDescendant=null,this.popupId="ngb-typeahead-"+Kd++,this._onTouched=()=>{},this._onChange=ya=>{},this.container=Fr.container,this.editable=Fr.editable,this.focusFirst=Fr.focusFirst,this.showHint=Fr.showHint,this.placement=Fr.placement,this._valueChanges=(0,me.R)(w.nativeElement,"input").pipe((0,mt.U)(ya=>ya.target.value)),this._resubscribeTypeahead=new ce.X(null),this._popupService=new Id(xh,ut,q,Fe,this._ngZone,Xn,Is),this._zoneSubscription=gi.onStable.subscribe(()=>{this.isPopupOpen()&&Be(this._elementRef.nativeElement,this._windowRef.location.nativeElement,this.placement,"body"===this.container)})}ngOnInit(){this._subscribeToUserInput()}ngOnChanges({ngbTypeahead:w}){w&&!w.firstChange&&(this._unsubscribeFromUserInput(),this._subscribeToUserInput())}ngOnDestroy(){this._closePopup(),this._unsubscribeFromUserInput(),this._zoneSubscription.unsubscribe()}registerOnChange(w){this._onChange=w}registerOnTouched(w){this._onTouched=w}writeValue(w){this._writeInputValue(this._formatItemForInput(w)),this.showHint&&(this._inputValueBackup=w)}setDisabledState(w){this._renderer.setProperty(this._elementRef.nativeElement,"disabled",w)}dismissPopup(){this.isPopupOpen()&&(this._resubscribeTypeahead.next(null),this._closePopup(),this.showHint&&null!==this._inputValueBackup&&this._writeInputValue(this._inputValueBackup),this._changeDetector.markForCheck())}isPopupOpen(){return null!=this._windowRef}handleBlur(){this._resubscribeTypeahead.next(null),this._onTouched()}handleKeyDown(w){if(this.isPopupOpen())switch(w.which){case ki.ArrowDown:w.preventDefault(),this._windowRef.instance.next(),this._showHint();break;case ki.ArrowUp:w.preventDefault(),this._windowRef.instance.prev(),this._showHint();break;case ki.Enter:case ki.Tab:const q=this._windowRef.instance.getActive();Ea(q)&&(w.preventDefault(),w.stopPropagation(),this._selectResult(q)),this._closePopup()}}_openPopup(){if(!this.isPopupOpen()){this._inputValueBackup=this._elementRef.nativeElement.value;const{windowRef:w}=this._popupService.open();this._windowRef=w,this._windowRef.instance.id=this.popupId,this._windowRef.instance.selectEvent.subscribe(q=>this._selectResultClosePopup(q)),this._windowRef.instance.activeChangeEvent.subscribe(q=>this.activeDescendant=q),this._windowRef.instance.popupClass=this.popupClass,"body"===this.container&&this._document.querySelector(this.container).appendChild(this._windowRef.location.nativeElement),this._changeDetector.markForCheck(),ca(this._ngZone,this._document,"outside",()=>this.dismissPopup(),this._closed$,[this._elementRef.nativeElement,this._windowRef.location.nativeElement])}}_closePopup(){this._popupService.close().subscribe(()=>{this._closed$.next(),this._windowRef=null,this.activeDescendant=null})}_selectResult(w){let q=!1;this.selectItem.emit({item:w,preventDefault:()=>{q=!0}}),this._resubscribeTypeahead.next(null),q||(this.writeValue(w),this._onChange(w))}_selectResultClosePopup(w){this._selectResult(w),this._closePopup()}_showHint(){var w;if(this.showHint&&(null===(w=this._windowRef)||void 0===w?void 0:w.instance.hasActive())&&null!=this._inputValueBackup){const q=this._inputValueBackup.toLowerCase(),Fe=this._formatItemForInput(this._windowRef.instance.getActive());q===Fe.substr(0,this._inputValueBackup.length).toLowerCase()?(this._writeInputValue(this._inputValueBackup+Fe.substr(this._inputValueBackup.length)),this._elementRef.nativeElement.setSelectionRange.apply(this._elementRef.nativeElement,[this._inputValueBackup.length,Fe.length])):this._writeInputValue(Fe)}}_formatItemForInput(w){return null!=w&&this.inputFormatter?this.inputFormatter(w):Oi(w)}_writeInputValue(w){this._renderer.setProperty(this._elementRef.nativeElement,"value",Oi(w))}_subscribeToUserInput(){const w=this._valueChanges.pipe((0,Yn.b)(q=>{this._inputValueBackup=this.showHint?q:null,this._onChange(this.editable?q:void 0)}),this.ngbTypeahead?this.ngbTypeahead:()=>(0,oe.of)([]));this._subscription=this._resubscribeTypeahead.pipe((0,zt.w)(()=>w)).subscribe(q=>{q&&0!==q.length?(this._openPopup(),this._windowRef.instance.focusFirst=this.focusFirst,this._windowRef.instance.results=q,this._windowRef.instance.term=this._elementRef.nativeElement.value,this.resultFormatter&&(this._windowRef.instance.formatter=this.resultFormatter),this.resultTemplate&&(this._windowRef.instance.resultTemplate=this.resultTemplate),this._windowRef.instance.resetActive(),this._windowRef.changeDetectorRef.detectChanges(),this._showHint()):this._closePopup();const Fe=q?q.length:0;this._live.say(0===Fe?"No results available":`${Fe} result${1===Fe?"":"s"} available`)})}_unsubscribeFromUserInput(){this._subscription&&this._subscription.unsubscribe(),this._subscription=null}}return Y.\u0275fac=function(w){return new(w||Y)(r.Y36(r.SBq),r.Y36(r.s_b),r.Y36(r.Qsj),r.Y36(r.zs3),r.Y36(r._Vd),r.Y36(Bf),r.Y36(r.R0b),r.Y36(pp),r.Y36(u.K0),r.Y36(r.R0b),r.Y36(r.sBO),r.Y36(r.z2F))},Y.\u0275dir=r.lG2({type:Y,selectors:[["input","ngbTypeahead",""]],hostAttrs:["autocapitalize","off","autocorrect","off","role","combobox","aria-multiline","false"],hostVars:7,hostBindings:function(w,q){1&w&&r.NdJ("blur",function(){return q.handleBlur()})("keydown",function(ut){return q.handleKeyDown(ut)}),2&w&&(r.Ikx("autocomplete",q.autocomplete),r.uIk("aria-autocomplete",q.showHint?"both":"list")("aria-activedescendant",q.activeDescendant)("aria-owns",q.isPopupOpen()?q.popupId:null)("aria-expanded",q.isPopupOpen()),r.ekj("open",q.isPopupOpen()))},inputs:{autocomplete:"autocomplete",placement:"placement",container:"container",editable:"editable",focusFirst:"focusFirst",showHint:"showHint",inputFormatter:"inputFormatter",ngbTypeahead:"ngbTypeahead",resultFormatter:"resultFormatter",resultTemplate:"resultTemplate",popupClass:"popupClass"},outputs:{selectItem:"selectItem"},exportAs:["ngbTypeahead"],features:[r._Bn([{provide:wr.JU,useExisting:(0,r.Gpc)(()=>Y),multi:!0}]),r.TTD]}),Y})(),rh=(()=>{class Y{}return Y.\u0275fac=function(w){return new(w||Y)},Y.\u0275mod=r.oAB({type:Y}),Y.\u0275inj=r.cJS({imports:[[u.ez]]}),Y})()},84051:(v,S,i)=>{"use strict";i.d(S,{vq:()=>po,ii:()=>ir,Ke:()=>fo,nE:()=>Bs,dX:()=>zo,$7:()=>cs,AR:()=>Vi,xD:()=>Co,Sr:()=>qo,Hg:()=>mr});var r=i(74788),u=i(12057),p=i(79765),f=i(22759),e=i(26215),_=i(46782),y=i(64762);const T=["*"];function M(tt,on){1&tt&&r._UZ(0,"datatable-progress")}function R(tt,on){if(1&tt&&r._UZ(0,"datatable-summary-row",9),2&tt){const ne=r.oxw(2);r.Q6J("rowHeight",ne.summaryHeight)("offsetX",ne.offsetX)("innerWidth",ne.innerWidth)("rows",ne.rows)("columns",ne.columns)}}function F(tt,on){if(1&tt){const ne=r.EpF();r.TgZ(0,"datatable-body-row",13),r.NdJ("treeAction",function(){r.CHM(ne);const Pt=r.oxw().$implicit;return r.oxw(2).onTreeAction(Pt)})("activate",function(Pt){r.CHM(ne);const sn=r.oxw().index,ei=r.oxw(2);return r.MAs(2).onActivate(Pt,ei.indexes.first+sn)}),r.qZA()}if(2&tt){const ne=r.oxw().$implicit,$e=r.oxw(2),Pt=r.MAs(2);r.Q6J("isSelected",Pt.getRowSelected(ne))("innerWidth",$e.innerWidth)("offsetX",$e.offsetX)("columns",$e.columns)("rowHeight",$e.getRowHeight(ne))("row",ne)("rowIndex",$e.getRowIndex(ne))("expanded",$e.getRowExpanded(ne))("rowClass",$e.rowClass)("displayCheck",$e.displayCheck)("treeStatus",ne&&ne.treeStatus)}}function Z(tt,on){if(1&tt){const ne=r.EpF();r.TgZ(0,"datatable-body-row",15),r.NdJ("activate",function(Pt){const ei=r.CHM(ne).index;return r.oxw(4),r.MAs(2).onActivate(Pt,ei)}),r.qZA()}if(2&tt){const ne=on.$implicit,$e=r.oxw(2).$implicit,Pt=r.oxw(2),sn=r.MAs(2);r.Q6J("isSelected",sn.getRowSelected(ne))("innerWidth",Pt.innerWidth)("offsetX",Pt.offsetX)("columns",Pt.columns)("rowHeight",Pt.getRowHeight(ne))("row",ne)("group",$e.value)("rowIndex",Pt.getRowIndex(ne))("expanded",Pt.getRowExpanded(ne))("rowClass",Pt.rowClass)}}function J(tt,on){if(1&tt&&r.YNc(0,Z,1,10,"datatable-body-row",14),2&tt){const ne=r.oxw().$implicit,$e=r.oxw(2);r.Q6J("ngForOf",ne.value)("ngForTrackBy",$e.rowTrackingFn)}}function Q(tt,on){if(1&tt){const ne=r.EpF();r.TgZ(0,"datatable-row-wrapper",10),r.NdJ("rowContextmenu",function(Pt){return r.CHM(ne),r.oxw(2).rowContextmenu.emit(Pt)}),r.YNc(1,F,1,11,"datatable-body-row",11),r.YNc(2,J,1,2,"ng-template",null,12,r.W1O),r.qZA()}if(2&tt){const ne=on.$implicit,$e=on.index,Pt=r.MAs(3),sn=r.oxw(2);r.Q6J("groupedRows",sn.groupedRows)("innerWidth",sn.innerWidth)("ngStyle",sn.getRowsStyles(ne))("rowDetail",sn.rowDetail)("groupHeader",sn.groupHeader)("offsetX",sn.offsetX)("detailRowHeight",sn.getDetailRowHeight(ne&&ne[$e],$e))("row",ne)("expanded",sn.getRowExpanded(ne))("rowIndex",sn.getRowIndex(ne&&ne[$e])),r.xp6(1),r.Q6J("ngIf",!sn.groupedRows)("ngIfElse",Pt)}}function ee(tt,on){if(1&tt&&r._UZ(0,"datatable-summary-row",16),2&tt){const ne=r.oxw(2);r.Q6J("ngStyle",ne.getBottomSummaryRowStyles())("rowHeight",ne.summaryHeight)("offsetX",ne.offsetX)("innerWidth",ne.innerWidth)("rows",ne.rows)("columns",ne.columns)}}function ue(tt,on){if(1&tt){const ne=r.EpF();r.TgZ(0,"datatable-scroller",5),r.NdJ("scroll",function(Pt){return r.CHM(ne),r.oxw().onBodyScroll(Pt)}),r.YNc(1,R,1,5,"datatable-summary-row",6),r.YNc(2,Q,4,12,"datatable-row-wrapper",7),r.YNc(3,ee,1,6,"datatable-summary-row",8),r.qZA()}if(2&tt){const ne=r.oxw();r.Q6J("scrollbarV",ne.scrollbarV)("scrollbarH",ne.scrollbarH)("scrollHeight",ne.scrollHeight)("scrollWidth",null==ne.columnGroupWidths?null:ne.columnGroupWidths.total),r.xp6(1),r.Q6J("ngIf",ne.summaryRow&&"top"===ne.summaryPosition),r.xp6(1),r.Q6J("ngForOf",ne.temp)("ngForTrackBy",ne.rowTrackingFn),r.xp6(1),r.Q6J("ngIf",ne.summaryRow&&"bottom"===ne.summaryPosition)}}function ae(tt,on){if(1&tt&&r._UZ(0,"div",17),2&tt){const ne=r.oxw();r.Q6J("innerHTML",ne.emptyMessage,r.oJD)}}function $(tt,on){if(1&tt){const ne=r.EpF();r.TgZ(0,"datatable-header-cell",4),r.NdJ("resize",function(Pt){const ei=r.CHM(ne).$implicit;return r.oxw(2).onColumnResized(Pt,ei)})("longPressStart",function(Pt){return r.CHM(ne),r.oxw(2).onLongPressStart(Pt)})("longPressEnd",function(Pt){return r.CHM(ne),r.oxw(2).onLongPressEnd(Pt)})("sort",function(Pt){return r.CHM(ne),r.oxw(2).onSort(Pt)})("select",function(Pt){return r.CHM(ne),r.oxw(2).select.emit(Pt)})("columnContextmenu",function(Pt){return r.CHM(ne),r.oxw(2).columnContextmenu.emit(Pt)}),r.qZA()}if(2&tt){const ne=on.$implicit,$e=r.oxw(2);r.Q6J("resizeEnabled",ne.resizeable)("pressModel",ne)("pressEnabled",$e.reorderable&&ne.draggable)("dragX",$e.reorderable&&ne.draggable&&ne.dragging)("dragY",!1)("dragModel",ne)("dragEventTarget",$e.dragEventTarget)("headerHeight",$e.headerHeight)("isTarget",ne.isTarget)("targetMarkerTemplate",$e.targetMarkerTemplate)("targetMarkerContext",ne.targetMarkerContext)("column",ne)("sortType",$e.sortType)("sorts",$e.sorts)("selectionType",$e.selectionType)("sortAscendingIcon",$e.sortAscendingIcon)("sortDescendingIcon",$e.sortDescendingIcon)("sortUnsetIcon",$e.sortUnsetIcon)("allRowsSelected",$e.allRowsSelected)}}function se(tt,on){if(1&tt&&(r.TgZ(0,"div",2),r.YNc(1,$,1,19,"datatable-header-cell",3),r.qZA()),2&tt){const ne=on.$implicit,$e=r.oxw();r.Tol("datatable-row-"+ne.type),r.Q6J("ngStyle",$e._styleByGroup[ne.type]),r.xp6(1),r.Q6J("ngForOf",ne.columns)("ngForTrackBy",$e.columnTrackingFn)}}function ve(tt,on){if(1&tt){const ne=r.EpF();r.TgZ(0,"datatable-header",4),r.NdJ("sort",function(Pt){return r.CHM(ne),r.oxw().onColumnSort(Pt)})("resize",function(Pt){return r.CHM(ne),r.oxw().onColumnResize(Pt)})("reorder",function(Pt){return r.CHM(ne),r.oxw().onColumnReorder(Pt)})("select",function(Pt){return r.CHM(ne),r.oxw().onHeaderSelect(Pt)})("columnContextmenu",function(Pt){return r.CHM(ne),r.oxw().onColumnContextmenu(Pt)}),r.ALo(1,"async"),r.qZA()}if(2&tt){const ne=r.oxw();r.Q6J("sorts",ne.sorts)("sortType",ne.sortType)("scrollbarH",ne.scrollbarH)("innerWidth",ne._innerWidth)("offsetX",r.lcZ(1,15,ne._offsetX))("dealsWithGroup",void 0!==ne.groupedRows)("columns",ne._internalColumns)("headerHeight",ne.headerHeight)("reorderable",ne.reorderable)("targetMarkerTemplate",ne.targetMarkerTemplate)("sortAscendingIcon",ne.cssClasses.sortAscending)("sortDescendingIcon",ne.cssClasses.sortDescending)("sortUnsetIcon",ne.cssClasses.sortUnset)("allRowsSelected",ne.allRowsSelected)("selectionType",ne.selectionType)}}function oe(tt,on){if(1&tt){const ne=r.EpF();r.TgZ(0,"datatable-footer",5),r.NdJ("page",function(Pt){return r.CHM(ne),r.oxw().onFooterPage(Pt)}),r.qZA()}if(2&tt){const ne=r.oxw();r.Q6J("rowCount",ne.rowCount)("pageSize",ne.pageSize)("offset",ne.offset)("footerHeight",ne.footerHeight)("footerTemplate",ne.footer)("totalMessage",ne.messages.totalMessage)("pagerLeftArrowIcon",ne.cssClasses.pagerLeftArrow)("pagerRightArrowIcon",ne.cssClasses.pagerRightArrow)("pagerPreviousIcon",ne.cssClasses.pagerPrevious)("selectedCount",ne.selected.length)("selectedMessage",!!ne.selectionType&&ne.messages.selectedMessage)("pagerNextIcon",ne.cssClasses.pagerNext)}}function he(tt,on){}function me(tt,on){if(1&tt&&r.YNc(0,he,0,0,"ng-template",5),2&tt){const ne=r.oxw();r.Q6J("ngTemplateOutlet",ne.targetMarkerTemplate)("ngTemplateOutletContext",ne.targetMarkerContext)}}function Oe(tt,on){if(1&tt){const ne=r.EpF();r.TgZ(0,"label",6),r.TgZ(1,"input",7),r.NdJ("change",function(){r.CHM(ne);const Pt=r.oxw();return Pt.select.emit(!Pt.allRowsSelected)}),r.qZA(),r.qZA()}if(2&tt){const ne=r.oxw();r.xp6(1),r.Q6J("checked",ne.allRowsSelected)}}function ce(tt,on){if(1&tt){const ne=r.EpF();r.TgZ(0,"span",8),r.TgZ(1,"span",9),r.NdJ("click",function(){return r.CHM(ne),r.oxw().onSort()}),r.qZA(),r.qZA()}if(2&tt){const ne=r.oxw();r.xp6(1),r.Q6J("innerHTML",ne.name,r.oJD)}}function dt(tt,on){}function ze(tt,on){if(1&tt&&r.YNc(0,dt,0,0,"ng-template",5),2&tt){const ne=r.oxw();r.Q6J("ngTemplateOutlet",ne.column.headerTemplate)("ngTemplateOutletContext",ne.cellContext)}}function Ye(tt,on){}const je=function(tt,on,ne,$e,Pt){return{rowCount:tt,pageSize:on,selectedCount:ne,curPage:$e,offset:Pt}};function Ie(tt,on){if(1&tt&&r.YNc(0,Ye,0,0,"ng-template",4),2&tt){const ne=r.oxw();r.Q6J("ngTemplateOutlet",ne.footerTemplate.template)("ngTemplateOutletContext",r.qbA(2,je,ne.rowCount,ne.pageSize,ne.selectedCount,ne.curPage,ne.offset))}}function Ve(tt,on){if(1&tt&&(r.TgZ(0,"span"),r._uU(1),r.qZA()),2&tt){const ne=r.oxw(2);r.xp6(1),r.AsE(" ",null==ne.selectedCount?null:ne.selectedCount.toLocaleString()," ",ne.selectedMessage," / ")}}function He(tt,on){if(1&tt&&(r.TgZ(0,"div",5),r.YNc(1,Ve,2,2,"span",1),r._uU(2),r.qZA()),2&tt){const ne=r.oxw();r.xp6(1),r.Q6J("ngIf",ne.selectedMessage),r.xp6(1),r.AsE(" ",null==ne.rowCount?null:ne.rowCount.toLocaleString()," ",ne.totalMessage," ")}}function Zt(tt,on){if(1&tt){const ne=r.EpF();r.TgZ(0,"datatable-pager",6),r.NdJ("change",function(Pt){return r.CHM(ne),r.oxw().page.emit(Pt)}),r.qZA()}if(2&tt){const ne=r.oxw();r.Q6J("pagerLeftArrowIcon",ne.pagerLeftArrowIcon)("pagerRightArrowIcon",ne.pagerRightArrowIcon)("pagerPreviousIcon",ne.pagerPreviousIcon)("pagerNextIcon",ne.pagerNextIcon)("page",ne.curPage)("size",ne.pageSize)("count",ne.rowCount)("hidden",!ne.isVisible)}}const st=function(tt){return{"selected-count":tt}};function en(tt,on){if(1&tt){const ne=r.EpF();r.TgZ(0,"li",6),r.TgZ(1,"a",7),r.NdJ("click",function(){const sn=r.CHM(ne).$implicit;return r.oxw().selectPage(sn.number)}),r._uU(2),r.qZA(),r.qZA()}if(2&tt){const ne=on.$implicit,$e=r.oxw();r.ekj("active",ne.number===$e.page),r.uIk("aria-label","page "+ne.number),r.xp6(2),r.hij(" ",ne.text," ")}}function $t(tt,on){if(1&tt){const ne=r.EpF();r.TgZ(0,"datatable-body-cell",3),r.NdJ("activate",function(Pt){const ei=r.CHM(ne).index;return r.oxw(2).onActivate(Pt,ei)})("treeAction",function(){return r.CHM(ne),r.oxw(2).onTreeAction()}),r.qZA()}if(2&tt){const ne=on.$implicit,$e=r.oxw(2);r.Q6J("row",$e.row)("group",$e.group)("expanded",$e.expanded)("isSelected",$e.isSelected)("rowIndex",$e.rowIndex)("column",ne)("rowHeight",$e.rowHeight)("displayCheck",$e.displayCheck)("treeStatus",$e.treeStatus)}}function Gt(tt,on){if(1&tt&&(r.TgZ(0,"div",1),r.YNc(1,$t,1,9,"datatable-body-cell",2),r.qZA()),2&tt){const ne=on.$implicit,$e=r.oxw();r.Gre("datatable-row-",ne.type," datatable-row-group"),r.Q6J("ngStyle",$e._groupStyles[ne.type]),r.xp6(1),r.Q6J("ngForOf",ne.columns)("ngForTrackBy",$e.columnTrackingFn)}}function Ut(tt,on){}function Bt(tt,on){if(1&tt&&r.YNc(0,Ut,0,0,"ng-template",4),2&tt){const ne=r.oxw(2);r.Q6J("ngTemplateOutlet",ne.groupHeader.template)("ngTemplateOutletContext",ne.groupContext)}}function mt(tt,on){if(1&tt&&(r.TgZ(0,"div",3),r.YNc(1,Bt,1,2,void 0,1),r.qZA()),2&tt){const ne=r.oxw();r.Q6J("ngStyle",ne.getGroupHeaderStyle()),r.xp6(1),r.Q6J("ngIf",ne.groupHeader&&ne.groupHeader.template)}}function Yt(tt,on){1&tt&&r.Hsn(0,0,["*ngIf","(groupHeader && groupHeader.template && expanded) || !groupHeader || !groupHeader.template"])}function Dt(tt,on){}function zt(tt,on){if(1&tt&&r.YNc(0,Dt,0,0,"ng-template",4),2&tt){const ne=r.oxw(2);r.Q6J("ngTemplateOutlet",ne.rowDetail.template)("ngTemplateOutletContext",ne.rowContext)}}function Yn(tt,on){if(1&tt&&(r.TgZ(0,"div",5),r.YNc(1,zt,1,2,void 0,1),r.qZA()),2&tt){const ne=r.oxw();r.Udp("height",ne.detailRowHeight,"px"),r.xp6(1),r.Q6J("ngIf",ne.rowDetail&&ne.rowDetail.template)}}const Hr=["cellTemplate"];function ci(tt,on){if(1&tt){const ne=r.EpF();r.TgZ(0,"label",4),r.TgZ(1,"input",5),r.NdJ("click",function(Pt){return r.CHM(ne),r.oxw().onCheckboxChange(Pt)}),r.qZA(),r.qZA()}if(2&tt){const ne=r.oxw();r.xp6(1),r.Q6J("checked",ne.isSelected)}}function Ir(tt,on){1&tt&&r._UZ(0,"i",11)}function wr(tt,on){1&tt&&r._UZ(0,"i",12)}function Qr(tt,on){1&tt&&r._UZ(0,"i",13)}function Kr(tt,on){if(1&tt){const ne=r.EpF();r.TgZ(0,"button",7),r.NdJ("click",function(){return r.CHM(ne),r.oxw(2).onTreeAction()}),r.TgZ(1,"span"),r.YNc(2,Ir,1,0,"i",8),r.YNc(3,wr,1,0,"i",9),r.YNc(4,Qr,1,0,"i",10),r.qZA(),r.qZA()}if(2&tt){const ne=r.oxw(2);r.Q6J("disabled","disabled"===ne.treeStatus),r.xp6(2),r.Q6J("ngIf","loading"===ne.treeStatus),r.xp6(1),r.Q6J("ngIf","collapsed"===ne.treeStatus),r.xp6(1),r.Q6J("ngIf","expanded"===ne.treeStatus||"disabled"===ne.treeStatus)}}function In(tt,on){}const Hn=function(tt){return{cellContext:tt}};function Zr(tt,on){if(1&tt&&r.YNc(0,In,0,0,"ng-template",14),2&tt){const ne=r.oxw(2);r.Q6J("ngTemplateOutlet",ne.column.treeToggleTemplate)("ngTemplateOutletContext",r.VKq(2,Hn,ne.cellContext))}}function Ur(tt,on){if(1&tt&&(r.ynx(0),r.YNc(1,Kr,5,4,"button",6),r.YNc(2,Zr,1,4,void 0,2),r.BQk()),2&tt){const ne=r.oxw();r.xp6(1),r.Q6J("ngIf",!ne.column.treeToggleTemplate),r.xp6(1),r.Q6J("ngIf",ne.column.treeToggleTemplate)}}function di(tt,on){if(1&tt&&r._UZ(0,"span",15),2&tt){const ne=r.oxw();r.Q6J("title",ne.sanitizedValue)("innerHTML",ne.value,r.oJD)}}function $i(tt,on){}function Hi(tt,on){if(1&tt&&r.YNc(0,$i,0,0,"ng-template",14,16,r.W1O),2&tt){const ne=r.oxw();r.Q6J("ngTemplateOutlet",ne.column.cellTemplate)("ngTemplateOutletContext",ne.cellContext)}}function Br(tt,on){if(1&tt&&r._UZ(0,"datatable-body-row",1),2&tt){const ne=r.oxw();r.Q6J("innerWidth",ne.innerWidth)("offsetX",ne.offsetX)("columns",ne._internalColumns)("rowHeight",ne.rowHeight)("row",ne.summaryRow)("rowIndex",-1)}}let On=(()=>{class tt{constructor(ne){this.document=ne,this.width=this.getWidth()}getWidth(){const ne=this.document.createElement("div");ne.style.visibility="hidden",ne.style.width="100px",ne.style.msOverflowStyle="scrollbar",this.document.body.appendChild(ne);const $e=ne.offsetWidth;ne.style.overflow="scroll";const Pt=this.document.createElement("div");Pt.style.width="100%",ne.appendChild(Pt);const sn=Pt.offsetWidth;return ne.parentNode.removeChild(ne),$e-sn}}return tt.\u0275fac=function(ne){return new(ne||tt)(r.LFG(u.K0))},tt.\u0275prov=r.Yz7({token:tt,factory:tt.\u0275fac}),tt})(),Wt=(()=>{class tt{getDimensions(ne){return ne.getBoundingClientRect()}}return tt.\u0275fac=function(ne){return new(ne||tt)},tt.\u0275prov=r.Yz7({token:tt,factory:tt.\u0275fac}),tt})(),Jn=(()=>{class tt{constructor(){this.columnInputChanges=new p.xQ}get columnInputChanges$(){return this.columnInputChanges.asObservable()}onInputChange(){this.columnInputChanges.next()}}return tt.\u0275fac=function(ne){return new(ne||tt)},tt.\u0275prov=r.Yz7({token:tt,factory:tt.\u0275fac}),tt})(),ir=(()=>{class tt{constructor(ne){this.template=ne}}return tt.\u0275fac=function(ne){return new(ne||tt)(r.Y36(r.Rgc))},tt.\u0275dir=r.lG2({type:tt,selectors:[["","ngx-datatable-footer-template",""]]}),tt})(),Lr=(()=>{class tt{constructor(ne,$e){this.element=ne,this.zone=$e,this.isVisible=!1,this.visible=new r.vpe}ngOnInit(){this.runCheck()}ngOnDestroy(){clearTimeout(this.timeout)}onVisibilityChange(){this.zone.run(()=>{this.isVisible=!0,this.visible.emit(!0)})}runCheck(){const ne=()=>{const{offsetHeight:$e,offsetWidth:Pt}=this.element.nativeElement;$e&&Pt?(clearTimeout(this.timeout),this.onVisibilityChange()):(clearTimeout(this.timeout),this.zone.runOutsideAngular(()=>{this.timeout=setTimeout(()=>ne(),50)}))};this.timeout=setTimeout(()=>ne())}}return tt.\u0275fac=function(ne){return new(ne||tt)(r.Y36(r.SBq),r.Y36(r.R0b))},tt.\u0275dir=r.lG2({type:tt,selectors:[["","visibilityObserver",""]],hostVars:2,hostBindings:function(ne,$e){2&ne&&r.ekj("visible",$e.isVisible)},outputs:{visible:"visible"}}),tt})(),Vn=(()=>{class tt{constructor(ne){this.dragX=!0,this.dragY=!0,this.dragStart=new r.vpe,this.dragging=new r.vpe,this.dragEnd=new r.vpe,this.isDragging=!1,this.element=ne.nativeElement}ngOnChanges(ne){ne.dragEventTarget&&ne.dragEventTarget.currentValue&&this.dragModel.dragging&&this.onMousedown(ne.dragEventTarget.currentValue)}ngOnDestroy(){this._destroySubscription()}onMouseup(ne){!this.isDragging||(this.isDragging=!1,this.element.classList.remove("dragging"),this.subscription&&(this._destroySubscription(),this.dragEnd.emit({event:ne,element:this.element,model:this.dragModel})))}onMousedown(ne){if(ne.target.classList.contains("draggable")&&(this.dragX||this.dragY)){ne.preventDefault(),this.isDragging=!0;const Pt={x:ne.clientX,y:ne.clientY},sn=(0,f.R)(document,"mouseup");this.subscription=sn.subscribe(fi=>this.onMouseup(fi));const ei=(0,f.R)(document,"mousemove").pipe((0,_.R)(sn)).subscribe(fi=>this.move(fi,Pt));this.subscription.add(ei),this.dragStart.emit({event:ne,element:this.element,model:this.dragModel})}}move(ne,$e){if(!this.isDragging)return;const sn=ne.clientY-$e.y;this.dragX&&(this.element.style.left=ne.clientX-$e.x+"px"),this.dragY&&(this.element.style.top=`${sn}px`),this.element.classList.add("dragging"),this.dragging.emit({event:ne,element:this.element,model:this.dragModel})}_destroySubscription(){this.subscription&&(this.subscription.unsubscribe(),this.subscription=void 0)}}return tt.\u0275fac=function(ne){return new(ne||tt)(r.Y36(r.SBq))},tt.\u0275dir=r.lG2({type:tt,selectors:[["","draggable",""]],inputs:{dragX:"dragX",dragY:"dragY",dragEventTarget:"dragEventTarget",dragModel:"dragModel"},outputs:{dragStart:"dragStart",dragging:"dragging",dragEnd:"dragEnd"},features:[r.TTD]}),tt})(),zr=(()=>{class tt{constructor(ne,$e){this.renderer=$e,this.resizeEnabled=!0,this.resize=new r.vpe,this.resizing=!1,this.element=ne.nativeElement}ngAfterViewInit(){const ne=this.renderer;this.resizeHandle=ne.createElement("span"),ne.addClass(this.resizeHandle,this.resizeEnabled?"resize-handle":"resize-handle--not-resizable"),ne.appendChild(this.element,this.resizeHandle)}ngOnDestroy(){this._destroySubscription(),this.renderer.destroyNode?this.renderer.destroyNode(this.resizeHandle):this.resizeHandle&&this.renderer.removeChild(this.renderer.parentNode(this.resizeHandle),this.resizeHandle)}onMouseup(){this.resizing=!1,this.subscription&&!this.subscription.closed&&(this._destroySubscription(),this.resize.emit(this.element.clientWidth))}onMousedown(ne){const $e=ne.target.classList.contains("resize-handle"),Pt=this.element.clientWidth,sn=ne.screenX;if($e){ne.stopPropagation(),this.resizing=!0;const ei=(0,f.R)(document,"mouseup");this.subscription=ei.subscribe(Oi=>this.onMouseup());const fi=(0,f.R)(document,"mousemove").pipe((0,_.R)(ei)).subscribe(Oi=>this.move(Oi,Pt,sn));this.subscription.add(fi)}}move(ne,$e,Pt){const ei=$e+(ne.screenX-Pt);(!this.minWidth||ei>=this.minWidth)&&(!this.maxWidth||ei<=this.maxWidth)&&(this.element.style.width=`${ei}px`)}_destroySubscription(){this.subscription&&(this.subscription.unsubscribe(),this.subscription=void 0)}}return tt.\u0275fac=function(ne){return new(ne||tt)(r.Y36(r.SBq),r.Y36(r.Qsj))},tt.\u0275dir=r.lG2({type:tt,selectors:[["","resizeable",""]],hostVars:2,hostBindings:function(ne,$e){1&ne&&r.NdJ("mousedown",function(sn){return $e.onMousedown(sn)}),2&ne&&r.ekj("resizeable",$e.resizeEnabled)},inputs:{resizeEnabled:"resizeEnabled",minWidth:"minWidth",maxWidth:"maxWidth"},outputs:{resize:"resize"}}),tt})(),hi=(()=>{class tt{constructor(ne,$e){this.document=$e,this.reorder=new r.vpe,this.targetChanged=new r.vpe,this.differ=ne.find({}).create()}ngAfterContentInit(){this.updateSubscriptions(),this.draggables.changes.subscribe(this.updateSubscriptions.bind(this))}ngOnDestroy(){this.draggables.forEach(ne=>{ne.dragStart.unsubscribe(),ne.dragging.unsubscribe(),ne.dragEnd.unsubscribe()})}updateSubscriptions(){const ne=this.differ.diff(this.createMapDiffs());if(ne){const $e=({currentValue:sn,previousValue:ei})=>{Pt({previousValue:ei}),sn&&(sn.dragStart.subscribe(this.onDragStart.bind(this)),sn.dragging.subscribe(this.onDragging.bind(this)),sn.dragEnd.subscribe(this.onDragEnd.bind(this)))},Pt=({previousValue:sn})=>{sn&&(sn.dragStart.unsubscribe(),sn.dragging.unsubscribe(),sn.dragEnd.unsubscribe())};ne.forEachAddedItem($e),ne.forEachRemovedItem(Pt)}}onDragStart(){this.positions={};let ne=0;for(const $e of this.draggables.toArray()){const Pt=$e.element,sn=parseInt(Pt.offsetLeft.toString(),0);this.positions[$e.dragModel.prop]={left:sn,right:sn+parseInt(Pt.offsetWidth.toString(),0),index:ne++,element:Pt}}}onDragging({model:$e,event:Pt}){const sn=this.positions[$e.prop],ei=this.isTarget($e,Pt);ei?this.lastDraggingIndex!==ei.i&&(this.targetChanged.emit({prevIndex:this.lastDraggingIndex,newIndex:ei.i,initialIndex:sn.index}),this.lastDraggingIndex=ei.i):this.lastDraggingIndex!==sn.index&&(this.targetChanged.emit({prevIndex:this.lastDraggingIndex,initialIndex:sn.index}),this.lastDraggingIndex=sn.index)}onDragEnd({element:ne,model:$e,event:Pt}){const sn=this.positions[$e.prop],ei=this.isTarget($e,Pt);ei&&this.reorder.emit({prevIndex:sn.index,newIndex:ei.i,model:$e}),this.lastDraggingIndex=void 0,ne.style.left="auto"}isTarget(ne,$e){let Pt=0;const fi=this.document.elementsFromPoint($e.x||$e.clientX,$e.y||$e.clientY);for(const Oi in this.positions){const os=this.positions[Oi];if(ne.prop!==Oi&&fi.find(Ro=>Ro===os.element))return{pos:os,i:Pt};Pt++}}createMapDiffs(){return this.draggables.toArray().reduce((ne,$e)=>(ne[$e.dragModel.$$id]=$e,ne),{})}}return tt.\u0275fac=function(ne){return new(ne||tt)(r.Y36(r.aQg),r.Y36(u.K0))},tt.\u0275dir=r.lG2({type:tt,selectors:[["","orderable",""]],contentQueries:function(ne,$e,Pt){if(1&ne&&r.Suo(Pt,Vn,5),2&ne){let sn;r.iGM(sn=r.CRH())&&($e.draggables=sn)}},outputs:{reorder:"reorder",targetChanged:"targetChanged"}}),tt})(),Ai=(()=>{class tt{constructor(){this.pressEnabled=!0,this.duration=500,this.longPressStart=new r.vpe,this.longPressing=new r.vpe,this.longPressEnd=new r.vpe,this.mouseX=0,this.mouseY=0}get press(){return this.pressing}get isLongPress(){return this.isLongPressing}onMouseDown(ne){if(1!==ne.which||!this.pressEnabled||ne.target.classList.contains("resize-handle"))return;this.mouseX=ne.clientX,this.mouseY=ne.clientY,this.pressing=!0,this.isLongPressing=!1;const Pt=(0,f.R)(document,"mouseup");this.subscription=Pt.subscribe(sn=>this.onMouseup()),this.timeout=setTimeout(()=>{this.isLongPressing=!0,this.longPressStart.emit({event:ne,model:this.pressModel}),this.subscription.add((0,f.R)(document,"mousemove").pipe((0,_.R)(Pt)).subscribe(sn=>this.onMouseMove(sn))),this.loop(ne)},this.duration),this.loop(ne)}onMouseMove(ne){if(this.pressing&&!this.isLongPressing){const $e=Math.abs(ne.clientX-this.mouseX)>10,Pt=Math.abs(ne.clientY-this.mouseY)>10;($e||Pt)&&this.endPress()}}loop(ne){this.isLongPressing&&(this.timeout=setTimeout(()=>{this.longPressing.emit({event:ne,model:this.pressModel}),this.loop(ne)},50))}endPress(){clearTimeout(this.timeout),this.isLongPressing=!1,this.pressing=!1,this._destroySubscription(),this.longPressEnd.emit({model:this.pressModel})}onMouseup(){this.endPress()}ngOnDestroy(){this._destroySubscription()}_destroySubscription(){this.subscription&&(this.subscription.unsubscribe(),this.subscription=void 0)}}return tt.\u0275fac=function(ne){return new(ne||tt)},tt.\u0275dir=r.lG2({type:tt,selectors:[["","long-press",""]],hostVars:4,hostBindings:function(ne,$e){1&ne&&r.NdJ("mousedown",function(sn){return $e.onMouseDown(sn)}),2&ne&&r.ekj("press",$e.press)("longpress",$e.isLongPress)},inputs:{pressEnabled:"pressEnabled",duration:"duration",pressModel:"pressModel"},outputs:{longPressStart:"longPressStart",longPressing:"longPressing",longPressEnd:"longPressEnd"}}),tt})(),Tr=(()=>{class tt{constructor(ne,$e,Pt){this.ngZone=ne,this.renderer=Pt,this.scrollbarV=!1,this.scrollbarH=!1,this.scroll=new r.vpe,this.scrollYPos=0,this.scrollXPos=0,this.prevScrollYPos=0,this.prevScrollXPos=0,this._scrollEventListener=null,this.element=$e.nativeElement}ngOnInit(){if(this.scrollbarV||this.scrollbarH){const ne=this.renderer;this.parentElement=ne.parentNode(ne.parentNode(this.element)),this._scrollEventListener=this.onScrolled.bind(this),this.parentElement.addEventListener("scroll",this._scrollEventListener)}}ngOnDestroy(){this._scrollEventListener&&(this.parentElement.removeEventListener("scroll",this._scrollEventListener),this._scrollEventListener=null)}setOffset(ne){this.parentElement&&(this.parentElement.scrollTop=ne)}onScrolled(ne){const $e=ne.currentTarget;requestAnimationFrame(()=>{this.scrollYPos=$e.scrollTop,this.scrollXPos=$e.scrollLeft,this.updateOffset()})}updateOffset(){let ne;this.scrollYPos<this.prevScrollYPos?ne="down":this.scrollYPos>this.prevScrollYPos&&(ne="up"),this.scroll.emit({direction:ne,scrollYPos:this.scrollYPos,scrollXPos:this.scrollXPos}),this.prevScrollYPos=this.scrollYPos,this.prevScrollXPos=this.scrollXPos}}return tt.\u0275fac=function(ne){return new(ne||tt)(r.Y36(r.R0b),r.Y36(r.SBq),r.Y36(r.Qsj))},tt.\u0275cmp=r.Xpm({type:tt,selectors:[["datatable-scroller"]],hostAttrs:[1,"datatable-scroll"],hostVars:4,hostBindings:function(ne,$e){2&ne&&r.Udp("height",$e.scrollHeight,"px")("width",$e.scrollWidth,"px")},inputs:{scrollbarV:"scrollbarV",scrollbarH:"scrollbarH",scrollHeight:"scrollHeight",scrollWidth:"scrollWidth"},outputs:{scroll:"scroll"},ngContentSelectors:T,decls:1,vars:0,template:function(ne,$e){1&ne&&(r.F$t(),r.Hsn(0))},encapsulation:2,changeDetection:0}),tt})(),Nr=(()=>{class tt{constructor(ne){this.template=ne}}return tt.\u0275fac=function(ne){return new(ne||tt)(r.Y36(r.Rgc))},tt.\u0275dir=r.lG2({type:tt,selectors:[["","ngx-datatable-group-header-template",""]]}),tt})(),gn=(()=>{class tt{constructor(){this.rowHeight=0,this.toggle=new r.vpe}get template(){return this._templateInput||this._templateQuery}toggleExpandGroup(ne){this.toggle.emit({type:"group",value:ne})}expandAllGroups(){this.toggle.emit({type:"all",value:!0})}collapseAllGroups(){this.toggle.emit({type:"all",value:!1})}}return tt.\u0275fac=function(ne){return new(ne||tt)},tt.\u0275dir=r.lG2({type:tt,selectors:[["ngx-datatable-group-header"]],contentQueries:function(ne,$e,Pt){if(1&ne&&r.Suo(Pt,Nr,7,r.Rgc),2&ne){let sn;r.iGM(sn=r.CRH())&&($e._templateQuery=sn.first)}},inputs:{rowHeight:"rowHeight",_templateInput:["template","_templateInput"]},outputs:{toggle:"toggle"}}),tt})();function En(){return""}function mr(tt){return null==tt?En:"number"==typeof tt?Xt:-1!==tt.indexOf(".")?vr:zn}function Xt(tt,on){if(null==tt)return"";if(!tt||null==on)return tt;const ne=tt[on];return null==ne?"":ne}function zn(tt,on){if(null==tt)return"";if(!tt||!on)return tt;const ne=tt[on];return null==ne?"":ne}function vr(tt,on){if(null==tt)return"";if(!tt||!on)return tt;let ne=tt[on];if(void 0!==ne)return ne;ne=tt;const $e=on.split(".");if($e.length)for(let Pt=0;Pt<$e.length;Pt++)if(ne=ne[$e[Pt]],null==ne)return"";return ne}function si(tt){return tt&&(on=>mr(tt)(on,tt))}function Ii(tt,on,ne){if(on&&ne){const $e={},Pt=tt.length;let sn=null;$e[0]=new no;const ei=tt.reduce((Oi,os)=>{const Ro=ne(os);return-1===Oi.indexOf(Ro)&&Oi.push(Ro),Oi},[]);for(let Oi=0;Oi<Pt;Oi++)$e[ne(tt[Oi])]=new no(tt[Oi]);for(let Oi=0;Oi<Pt;Oi++){sn=$e[ne(tt[Oi])];let os=0;const Ro=on(sn.row);!!Ro&&ei.indexOf(Ro)>-1&&(os=Ro),sn.parent=$e[os],sn.row.level=sn.parent.row.level+1,sn.parent.children.push(sn)}let fi=[];return $e[0].flatten(function(){fi=[...fi,this.row]},!0),fi}return tt}class no{constructor(on=null){on||(on={level:-1,treeStatus:"expanded"}),this.row=on,this.parent=null,this.children=[]}flatten(on,ne){if("expanded"===this.row.treeStatus)for(let $e=0,Pt=this.children.length;$e<Pt;$e++){const sn=this.children[$e];on.apply(sn,Array.prototype.slice.call(arguments,2)),ne&&sn.flatten.apply(sn,arguments)}}}function so(tt){return(tt=(tt=(tt=tt.replace(/[^a-zA-Z0-9 ]/g," ")).replace(/([a-z](?=[A-Z]))/g,"$1 ")).replace(/([^a-zA-Z0-9 ])|^[0-9]+/g,"").trim().toLowerCase()).replace(/([ 0-9]+)([a-zA-Z])/g,function(on,ne,$e){return ne.trim()+$e.toUpperCase()})}function Ze(tt){return tt.replace(/([A-Z])/g,on=>` ${on}`).replace(/^./,on=>on.toUpperCase())}function jt(tt){if(!tt)return;let on=!1;for(const ne of tt)ne.$$id||(ne.$$id=("0000"+(Math.random()*Math.pow(36,4)<<0).toString(36)).slice(-4)),xt(ne.prop)&&ne.name&&(ne.prop=so(ne.name)),ne.$$valueGetter||(ne.$$valueGetter=mr(ne.prop)),!xt(ne.prop)&&xt(ne.name)&&(ne.name=Ze(String(ne.prop))),xt(ne.prop)&&xt(ne.name)&&(ne.name=""),ne.hasOwnProperty("resizeable")||(ne.resizeable=!0),ne.hasOwnProperty("sortable")||(ne.sortable=!0),ne.hasOwnProperty("draggable")||(ne.draggable=!0),ne.hasOwnProperty("canAutoResize")||(ne.canAutoResize=!0),ne.hasOwnProperty("width")||(ne.width=150),ne.hasOwnProperty("isTreeColumn")&&ne.isTreeColumn&&!on?on=!0:ne.isTreeColumn=!1}function xt(tt){return null==tt}var Wn=(()=>{return(tt=Wn||(Wn={})).standard="standard",tt.flex="flex",tt.force="force",Wn;var tt})(),kn=(()=>{return(tt=kn||(kn={})).single="single",tt.multi="multi",tt.multiClick="multiClick",tt.cell="cell",tt.checkbox="checkbox",kn;var tt})(),wn=(()=>{return(tt=wn||(wn={})).single="single",tt.multi="multi",wn;var tt})(),nr=(()=>{return(tt=nr||(nr={})).header="header",tt.body="body",nr;var tt})();let Gi=(()=>{class tt{constructor(ne){this.template=ne}}return tt.\u0275fac=function(ne){return new(ne||tt)(r.Y36(r.Rgc))},tt.\u0275dir=r.lG2({type:tt,selectors:[["","ngx-datatable-header-template",""]]}),tt})(),po=(()=>{class tt{constructor(ne){this.template=ne}}return tt.\u0275fac=function(ne){return new(ne||tt)(r.Y36(r.Rgc))},tt.\u0275dir=r.lG2({type:tt,selectors:[["","ngx-datatable-cell-template",""]]}),tt})(),yo=(()=>{class tt{constructor(ne){this.template=ne}}return tt.\u0275fac=function(ne){return new(ne||tt)(r.Y36(r.Rgc))},tt.\u0275dir=r.lG2({type:tt,selectors:[["","ngx-datatable-tree-toggle",""]]}),tt})(),Mo=(()=>{class tt{constructor(ne){this.columnChangesService=ne,this.isFirstChange=!0}get cellTemplate(){return this._cellTemplateInput||this._cellTemplateQuery}get headerTemplate(){return this._headerTemplateInput||this._headerTemplateQuery}get treeToggleTemplate(){return this._treeToggleTemplateInput||this._treeToggleTemplateQuery}ngOnChanges(){this.isFirstChange?this.isFirstChange=!1:this.columnChangesService.onInputChange()}}return tt.\u0275fac=function(ne){return new(ne||tt)(r.Y36(Jn))},tt.\u0275dir=r.lG2({type:tt,selectors:[["ngx-datatable-column"]],contentQueries:function(ne,$e,Pt){if(1&ne&&(r.Suo(Pt,po,7,r.Rgc),r.Suo(Pt,Gi,7,r.Rgc),r.Suo(Pt,yo,7,r.Rgc)),2&ne){let sn;r.iGM(sn=r.CRH())&&($e._cellTemplateQuery=sn.first),r.iGM(sn=r.CRH())&&($e._headerTemplateQuery=sn.first),r.iGM(sn=r.CRH())&&($e._treeToggleTemplateQuery=sn.first)}},inputs:{name:"name",prop:"prop",frozenLeft:"frozenLeft",frozenRight:"frozenRight",flexGrow:"flexGrow",resizeable:"resizeable",comparator:"comparator",pipe:"pipe",sortable:"sortable",draggable:"draggable",canAutoResize:"canAutoResize",minWidth:"minWidth",width:"width",maxWidth:"maxWidth",checkboxable:"checkboxable",headerCheckboxable:"headerCheckboxable",headerClass:"headerClass",cellClass:"cellClass",isTreeColumn:"isTreeColumn",treeLevelIndent:"treeLevelIndent",summaryFunc:"summaryFunc",summaryTemplate:"summaryTemplate",_cellTemplateInput:["cellTemplate","_cellTemplateInput"],_headerTemplateInput:["headerTemplate","_headerTemplateInput"],_treeToggleTemplateInput:["treeToggleTemplate","_treeToggleTemplateInput"]},features:[r.TTD]}),tt})(),Vi=(()=>{class tt{constructor(ne){this.template=ne}}return tt.\u0275fac=function(ne){return new(ne||tt)(r.Y36(r.Rgc))},tt.\u0275dir=r.lG2({type:tt,selectors:[["","ngx-datatable-row-detail-template",""]]}),tt})(),cs=(()=>{class tt{constructor(){this.rowHeight=0,this.toggle=new r.vpe}get template(){return this._templateInput||this._templateQuery}toggleExpandRow(ne){this.toggle.emit({type:"row",value:ne})}expandAllRows(){this.toggle.emit({type:"all",value:!0})}collapseAllRows(){this.toggle.emit({type:"all",value:!1})}}return tt.\u0275fac=function(ne){return new(ne||tt)},tt.\u0275dir=r.lG2({type:tt,selectors:[["ngx-datatable-row-detail"]],contentQueries:function(ne,$e,Pt){if(1&ne&&r.Suo(Pt,Vi,7,r.Rgc),2&ne){let sn;r.iGM(sn=r.CRH())&&($e._templateQuery=sn.first)}},inputs:{rowHeight:"rowHeight",_templateInput:["template","_templateInput"]},outputs:{toggle:"toggle"}}),tt})(),zo=(()=>{class tt{get template(){return this._templateInput||this._templateQuery}}return tt.\u0275fac=function(ne){return new(ne||tt)},tt.\u0275dir=r.lG2({type:tt,selectors:[["ngx-datatable-footer"]],contentQueries:function(ne,$e,Pt){if(1&ne&&r.Suo(Pt,ir,5,r.Rgc),2&ne){let sn;r.iGM(sn=r.CRH())&&($e._templateQuery=sn.first)}},inputs:{footerHeight:"footerHeight",totalMessage:"totalMessage",selectedMessage:"selectedMessage",pagerLeftArrowIcon:"pagerLeftArrowIcon",pagerRightArrowIcon:"pagerRightArrowIcon",pagerPreviousIcon:"pagerPreviousIcon",pagerNextIcon:"pagerNextIcon",_templateInput:["template","_templateInput"]}}),tt})();function So(tt){const on={left:[],center:[],right:[]};if(tt)for(const ne of tt)ne.frozenLeft?on.left.push(ne):ne.frozenRight?on.right.push(ne):on.center.push(ne);return on}function Si(tt,on){return{left:ai(tt.left),center:ai(tt.center),right:ai(tt.right),total:Math.floor(ai(on))}}function ai(tt,on){let ne=0;if(tt)for(const $e of tt)ne+=parseFloat(on&&$e[on]?$e[on]:$e.width);return ne}function cr(tt){const on=[],ne=So(tt);return on.push({type:"left",columns:ne.left}),on.push({type:"center",columns:ne.center}),on.push({type:"right",columns:ne.right}),on}class yr{constructor(){this.treeArray=[]}clearCache(){this.treeArray=[]}initCache(on){const{rows:ne,rowHeight:$e,detailRowHeight:Pt,externalVirtual:sn,rowCount:ei,rowIndexes:fi,rowExpansions:Oi}=on,os="function"==typeof $e,Ro="function"==typeof Pt;if(!os&&isNaN($e))throw new Error(`Row Height cache initialization failed. Please ensure that 'rowHeight' is a\n        valid number or function value: (${$e}) when 'scrollbarV' is enabled.`);if(!Ro&&isNaN(Pt))throw new Error(`Row Height cache initialization failed. Please ensure that 'detailRowHeight' is a\n        valid number or function value: (${Pt}) when 'scrollbarV' is enabled.`);const Uo=sn?ei:ne.length;this.treeArray=new Array(Uo);for(let To=0;To<Uo;++To)this.treeArray[To]=0;for(let To=0;To<Uo;++To){const Ea=ne[To];let al=$e;os&&(al=$e(Ea));const qu=Oi.has(Ea);Ea&&qu&&(al+=Ro?Pt(Ea,fi.get(Ea)):Pt),this.update(To,al)}}getRowIndex(on){return 0===on?0:this.calcRowIndex(on)}update(on,ne){if(!this.treeArray.length)throw new Error(`Update at index ${on} with value ${ne} failed:\n        Row Height cache not initialized.`);const $e=this.treeArray.length;for(on|=0;on<$e;)this.treeArray[on]+=ne,on|=on+1}query(on){if(!this.treeArray.length)throw new Error(`query at index ${on} failed: Fenwick tree array not initialized.`);let ne=0;for(on|=0;on>=0;)ne+=this.treeArray[on],on=(on&on+1)-1;return ne}queryBetween(on,ne){return this.query(ne)-this.query(on-1)}calcRowIndex(on){if(!this.treeArray.length)return 0;let ne=-1;const $e=this.treeArray.length;for(let sn=Math.pow(2,$e.toString(2).length-1);0!==sn;sn>>=1){const ei=ne+sn;ei<$e&&on>=this.treeArray[ei]&&(on-=this.treeArray[ei],ne=ei)}return ne+1}}const rr={},ri="undefined"!=typeof document?document.createElement("div").style:void 0,Ti=function(){const tt="undefined"!=typeof window?window.getComputedStyle(document.documentElement,""):void 0,on=void 0!==tt?Array.prototype.slice.call(tt).join("").match(/-(moz|webkit|ms)-/):null,ne=null!==on?on[1]:void 0,$e=void 0!==ne?"WebKit|Moz|MS|O".match(new RegExp("("+ne+")","i"))[1]:void 0;return $e?{dom:$e,lowercase:ne,css:`-${ne}-`,js:ne[0].toUpperCase()+ne.substr(1)}:void 0}();function Bo(tt){const on=so(tt);return rr[on]||(void 0!==Ti&&void 0!==ri[Ti.css+tt]?rr[on]=Ti.css+tt:void 0!==ri[tt]&&(rr[on]=tt)),rr[on]}const xo="undefined"!=typeof window?Bo("transform"):void 0,Li="undefined"!=typeof window?Bo("backfaceVisibility"):void 0,ar="undefined"!=typeof window?!!Bo("transform"):void 0,ln="undefined"!=typeof window?!!Bo("perspective"):void 0,Ht="undefined"!=typeof window?window.navigator.userAgent:"Chrome",cn=/Safari\//.test(Ht)&&!/Chrome\//.test(Ht);function Ct(tt,on,ne){void 0!==xo&&ar?!cn&&ln?(tt[xo]=`translate3d(${on}px, ${ne}px, 0)`,tt[Li]="hidden"):tt[so(xo)]=`translate(${on}px, ${ne}px)`:(tt.top=`${ne}px`,tt.left=`${on}px`)}let pr=(()=>{class tt{constructor(ne){this.cd=ne,this.selected=[],this.scroll=new r.vpe,this.page=new r.vpe,this.activate=new r.vpe,this.select=new r.vpe,this.detailToggle=new r.vpe,this.rowContextmenu=new r.vpe(!1),this.treeAction=new r.vpe,this.rowHeightsCache=new yr,this.temp=[],this.offsetY=0,this.indexes={},this.rowIndexes=new WeakMap,this.rowExpansions=[],this.getDetailRowHeight=($e,Pt)=>{if(!this.rowDetail)return 0;const sn=this.rowDetail.rowHeight;return"function"==typeof sn?sn($e,Pt):sn},this.rowTrackingFn=($e,Pt)=>{const sn=this.getRowIndex(Pt);return this.trackByProp?Pt[this.trackByProp]:sn}}set pageSize(ne){this._pageSize=ne,this.recalcLayout()}get pageSize(){return this._pageSize}set rows(ne){this._rows=ne,this.recalcLayout()}get rows(){return this._rows}set columns(ne){this._columns=ne;const $e=So(ne);this.columnGroupWidths=Si($e,ne)}get columns(){return this._columns}set offset(ne){this._offset=ne,(!this.scrollbarV||this.scrollbarV&&!this.virtualization)&&this.recalcLayout()}get offset(){return this._offset}set rowCount(ne){this._rowCount=ne,this.recalcLayout()}get rowCount(){return this._rowCount}get bodyWidth(){return this.scrollbarH?this.innerWidth+"px":"100%"}set bodyHeight(ne){this._bodyHeight=this.scrollbarV?ne+"px":"auto",this.recalcLayout()}get bodyHeight(){return this._bodyHeight}get selectEnabled(){return!!this.selectionType}get scrollHeight(){if(this.scrollbarV&&this.virtualization&&this.rowCount)return this.rowHeightsCache.query(this.rowCount-1)}ngOnInit(){this.rowDetail&&(this.listener=this.rowDetail.toggle.subscribe(({type:ne,value:$e})=>{"row"===ne&&this.toggleRowExpansion($e),"all"===ne&&this.toggleAllRows($e),this.updateIndexes(),this.updateRows(),this.cd.markForCheck()})),this.groupHeader&&(this.listener=this.groupHeader.toggle.subscribe(({type:ne,value:$e})=>{"group"===ne&&this.toggleRowExpansion($e),"all"===ne&&this.toggleAllRows($e),this.updateIndexes(),this.updateRows(),this.cd.markForCheck()}))}ngOnDestroy(){(this.rowDetail||this.groupHeader)&&this.listener.unsubscribe()}updateOffsetY(ne){this.scroller&&(this.scrollbarV&&this.virtualization&&ne?ne=this.rowHeightsCache.query(this.pageSize*ne-1):this.scrollbarV&&!this.virtualization&&(ne=0),this.scroller.setOffset(ne||0))}onBodyScroll(ne){const $e=ne.scrollYPos,Pt=ne.scrollXPos;(this.offsetY!==$e||this.offsetX!==Pt)&&this.scroll.emit({offsetY:$e,offsetX:Pt}),this.offsetY=$e,this.offsetX=Pt,this.updateIndexes(),this.updatePage(ne.direction),this.updateRows()}updatePage(ne){let $e=this.indexes.first/this.pageSize;"up"===ne?$e=Math.ceil($e):"down"===ne&&($e=Math.floor($e)),void 0!==ne&&!isNaN($e)&&this.page.emit({offset:$e})}updateRows(){const{first:ne,last:$e}=this.indexes;let Pt=ne,sn=0;const ei=[];if(this.groupedRows){let fi=3;for(1===this.groupedRows.length&&(fi=this.groupedRows[0].value.length);Pt<$e&&Pt<this.groupedRows.length;){const Oi=this.groupedRows[Pt];this.rowIndexes.set(Oi,Pt),Oi.value&&Oi.value.forEach((os,Ro)=>{this.rowIndexes.set(os,`${Pt}-${Ro}`)}),ei[sn]=Oi,sn++,Pt++}}else for(;Pt<$e&&Pt<this.rowCount;){const fi=this.rows[Pt];fi&&(this.rowIndexes.set(fi,Pt),ei[sn]=fi),sn++,Pt++}this.temp=ei}getRowHeight(ne){return"function"==typeof this.rowHeight?this.rowHeight(ne):this.rowHeight}getGroupHeight(ne){let $e=0;if(ne.value)for(let Pt=0;Pt<ne.value.length;Pt++)$e+=this.getRowAndDetailHeight(ne.value[Pt]);return $e}getRowAndDetailHeight(ne){let $e=this.getRowHeight(ne);return this.getRowExpanded(ne)&&($e+=this.getDetailRowHeight(ne)),$e}getRowsStyles(ne){const $e={};if(this.groupedRows&&($e.width=this.columnGroupWidths.total),this.scrollbarV&&this.virtualization){let Pt=0;if(this.groupedRows){const ei=ne[ne.length-1];Pt=ei?this.getRowIndex(ei):0}else Pt=this.getRowIndex(ne);Ct($e,0,this.rowHeightsCache.query(Pt-1))}return $e}getBottomSummaryRowStyles(){if(!this.scrollbarV||!this.rows||!this.rows.length)return null;const ne={position:"absolute"};return Ct(ne,0,this.rowHeightsCache.query(this.rows.length-1)),ne}hideIndicator(){setTimeout(()=>this.loadingIndicator=!1,500)}updateIndexes(){let ne=0,$e=0;if(this.scrollbarV)if(this.virtualization){const Pt=parseInt(this.bodyHeight,0);ne=this.rowHeightsCache.getRowIndex(this.offsetY),$e=this.rowHeightsCache.getRowIndex(Pt+this.offsetY)+1}else ne=0,$e=this.rowCount;else this.externalPaging||(ne=Math.max(this.offset*this.pageSize,0)),$e=Math.min(ne+this.pageSize,this.rowCount);this.indexes={first:ne,last:$e}}refreshRowHeightCache(){if(this.scrollbarV&&(!this.scrollbarV||this.virtualization)&&(this.rowHeightsCache.clearCache(),this.rows&&this.rows.length)){const ne=new Set;for(const $e of this.rows)this.getRowExpanded($e)&&ne.add($e);this.rowHeightsCache.initCache({rows:this.rows,rowHeight:this.rowHeight,detailRowHeight:this.getDetailRowHeight,externalVirtual:this.scrollbarV&&this.externalPaging,rowCount:this.rowCount,rowIndexes:this.rowIndexes,rowExpansions:ne})}}getAdjustedViewPortIndex(){const ne=this.indexes.first;return this.scrollbarV&&this.virtualization&&this.rowHeightsCache.query(ne-1)<=this.offsetY?ne-1:ne}toggleRowExpansion(ne){const $e=this.getAdjustedViewPortIndex(),Pt=this.getRowExpandedIdx(ne,this.rowExpansions),sn=Pt>-1;if(this.scrollbarV&&this.virtualization){const ei=this.getDetailRowHeight(ne)*(sn?-1:1),fi=this.getRowIndex(ne);this.rowHeightsCache.update(fi,ei)}sn?this.rowExpansions.splice(Pt,1):this.rowExpansions.push(ne),this.detailToggle.emit({rows:[ne],currentIndex:$e})}toggleAllRows(ne){this.rowExpansions=[];const $e=this.getAdjustedViewPortIndex();if(ne)for(const Pt of this.rows)this.rowExpansions.push(Pt);this.scrollbarV&&this.recalcLayout(),this.detailToggle.emit({rows:this.rows,currentIndex:$e})}recalcLayout(){this.refreshRowHeightCache(),this.updateIndexes(),this.updateRows()}columnTrackingFn(ne,$e){return $e.$$id}stylesByGroup(ne){const $e=this.columnGroupWidths,Pt=this.offsetX,sn={width:`${$e[ne]}px`};if("left"===ne)Ct(sn,Pt,0);else if("right"===ne){const ei=parseInt(this.innerWidth+"",0);Ct(sn,-1*($e.total-ei-Pt),0)}return sn}getRowExpanded(ne){if(0===this.rowExpansions.length&&this.groupExpansionDefault)for(const $e of this.groupedRows)this.rowExpansions.push($e);return this.getRowExpandedIdx(ne,this.rowExpansions)>-1}getRowExpandedIdx(ne,$e){if(!$e||!$e.length)return-1;const Pt=this.rowIdentity(ne);return $e.findIndex(sn=>this.rowIdentity(sn)===Pt)}getRowIndex(ne){return this.rowIndexes.get(ne)||0}onTreeAction(ne){this.treeAction.emit({row:ne})}}return tt.\u0275fac=function(ne){return new(ne||tt)(r.Y36(r.sBO))},tt.\u0275cmp=r.Xpm({type:tt,selectors:[["datatable-body"]],viewQuery:function(ne,$e){if(1&ne&&r.Gf(Tr,5),2&ne){let Pt;r.iGM(Pt=r.CRH())&&($e.scroller=Pt.first)}},hostAttrs:[1,"datatable-body"],hostVars:4,hostBindings:function(ne,$e){2&ne&&r.Udp("width",$e.bodyWidth)("height",$e.bodyHeight)},inputs:{selected:"selected",pageSize:"pageSize",rows:"rows",columns:"columns",offset:"offset",rowCount:"rowCount",bodyHeight:"bodyHeight",offsetX:"offsetX",loadingIndicator:"loadingIndicator",scrollbarV:"scrollbarV",scrollbarH:"scrollbarH",externalPaging:"externalPaging",rowHeight:"rowHeight",emptyMessage:"emptyMessage",selectionType:"selectionType",rowIdentity:"rowIdentity",rowDetail:"rowDetail",groupHeader:"groupHeader",selectCheck:"selectCheck",displayCheck:"displayCheck",trackByProp:"trackByProp",rowClass:"rowClass",groupedRows:"groupedRows",groupExpansionDefault:"groupExpansionDefault",innerWidth:"innerWidth",groupRowsBy:"groupRowsBy",virtualization:"virtualization",summaryRow:"summaryRow",summaryPosition:"summaryPosition",summaryHeight:"summaryHeight"},outputs:{scroll:"scroll",page:"page",activate:"activate",select:"select",detailToggle:"detailToggle",rowContextmenu:"rowContextmenu",treeAction:"treeAction"},decls:5,vars:9,consts:[[4,"ngIf"],[3,"selected","rows","selectCheck","selectEnabled","selectionType","rowIdentity","select","activate"],["selector",""],[3,"scrollbarV","scrollbarH","scrollHeight","scrollWidth","scroll",4,"ngIf"],["class","empty-row",3,"innerHTML",4,"ngIf"],[3,"scrollbarV","scrollbarH","scrollHeight","scrollWidth","scroll"],[3,"rowHeight","offsetX","innerWidth","rows","columns",4,"ngIf"],[3,"groupedRows","innerWidth","ngStyle","rowDetail","groupHeader","offsetX","detailRowHeight","row","expanded","rowIndex","rowContextmenu",4,"ngFor","ngForOf","ngForTrackBy"],[3,"ngStyle","rowHeight","offsetX","innerWidth","rows","columns",4,"ngIf"],[3,"rowHeight","offsetX","innerWidth","rows","columns"],[3,"groupedRows","innerWidth","ngStyle","rowDetail","groupHeader","offsetX","detailRowHeight","row","expanded","rowIndex","rowContextmenu"],["tabindex","-1",3,"isSelected","innerWidth","offsetX","columns","rowHeight","row","rowIndex","expanded","rowClass","displayCheck","treeStatus","treeAction","activate",4,"ngIf","ngIfElse"],["groupedRowsTemplate",""],["tabindex","-1",3,"isSelected","innerWidth","offsetX","columns","rowHeight","row","rowIndex","expanded","rowClass","displayCheck","treeStatus","treeAction","activate"],["tabindex","-1",3,"isSelected","innerWidth","offsetX","columns","rowHeight","row","group","rowIndex","expanded","rowClass","activate",4,"ngFor","ngForOf","ngForTrackBy"],["tabindex","-1",3,"isSelected","innerWidth","offsetX","columns","rowHeight","row","group","rowIndex","expanded","rowClass","activate"],[3,"ngStyle","rowHeight","offsetX","innerWidth","rows","columns"],[1,"empty-row",3,"innerHTML"]],template:function(ne,$e){1&ne&&(r.YNc(0,M,1,0,"datatable-progress",0),r.TgZ(1,"datatable-selection",1,2),r.NdJ("select",function(sn){return $e.select.emit(sn)})("activate",function(sn){return $e.activate.emit(sn)}),r.YNc(3,ue,4,8,"datatable-scroller",3),r.YNc(4,ae,1,1,"div",4),r.qZA()),2&ne&&(r.Q6J("ngIf",$e.loadingIndicator),r.xp6(1),r.Q6J("selected",$e.selected)("rows",$e.rows)("selectCheck",$e.selectCheck)("selectEnabled",$e.selectEnabled)("selectionType",$e.selectionType)("rowIdentity",$e.rowIdentity),r.xp6(2),r.Q6J("ngIf",null==$e.rows?null:$e.rows.length),r.xp6(1),r.Q6J("ngIf",!(null!=$e.rows&&$e.rows.length||$e.loadingIndicator)))},directives:function(){return[u.O5,Fo,Da,Tr,u.sg,ms,gs,u.PC,ls]},encapsulation:2,changeDetection:0}),tt})(),nn=(()=>{class tt{constructor(ne){this.cd=ne,this.sort=new r.vpe,this.reorder=new r.vpe,this.resize=new r.vpe,this.select=new r.vpe,this.columnContextmenu=new r.vpe(!1),this._columnGroupWidths={total:100},this._styleByGroup={left:{},center:{},right:{}},this.destroyed=!1}set innerWidth(ne){this._innerWidth=ne,setTimeout(()=>{if(this._columns){const $e=So(this._columns);this._columnGroupWidths=Si($e,this._columns),this.setStylesByGroup()}})}get innerWidth(){return this._innerWidth}set headerHeight(ne){this._headerHeight="auto"!==ne?`${ne}px`:ne}get headerHeight(){return this._headerHeight}set columns(ne){this._columns=ne;const $e=So(ne);this._columnsByPin=cr(ne),setTimeout(()=>{this._columnGroupWidths=Si($e,ne),this.setStylesByGroup()})}get columns(){return this._columns}set offsetX(ne){this._offsetX=ne,this.setStylesByGroup()}get offsetX(){return this._offsetX}ngOnDestroy(){this.destroyed=!0}onLongPressStart({event:ne,model:$e}){$e.dragging=!0,this.dragEventTarget=ne}onLongPressEnd({event:ne,model:$e}){this.dragEventTarget=ne,setTimeout(()=>{const Pt=this._columns.find(sn=>sn.$$id===$e.$$id);Pt&&(Pt.dragging=!1)},5)}get headerWidth(){return this.scrollbarH?this.innerWidth+"px":"100%"}trackByGroups(ne,$e){return $e.type}columnTrackingFn(ne,$e){return $e.$$id}onColumnResized(ne,$e){ne<=$e.minWidth?ne=$e.minWidth:ne>=$e.maxWidth&&(ne=$e.maxWidth),this.resize.emit({column:$e,prevValue:$e.width,newValue:ne})}onColumnReordered({prevIndex:ne,newIndex:$e,model:Pt}){const sn=this.getColumn($e);sn.isTarget=!1,sn.targetMarkerContext=void 0,this.reorder.emit({column:Pt,prevValue:ne,newValue:$e})}onTargetChanged({prevIndex:ne,newIndex:$e,initialIndex:Pt}){if(ne||0===ne){const sn=this.getColumn(ne);sn.isTarget=!1,sn.targetMarkerContext=void 0}if($e||0===$e){const sn=this.getColumn($e);sn.isTarget=!0,Pt!==$e&&(sn.targetMarkerContext={class:"targetMarker ".concat(Pt>$e?"dragFromRight":"dragFromLeft")})}}getColumn(ne){const $e=this._columnsByPin[0].columns.length;if(ne<$e)return this._columnsByPin[0].columns[ne];const Pt=this._columnsByPin[1].columns.length;return ne<$e+Pt?this._columnsByPin[1].columns[ne-$e]:this._columnsByPin[2].columns[ne-$e-Pt]}onSort({column:ne,prevValue:$e,newValue:Pt}){if(ne.dragging)return;const sn=this.calcNewSorts(ne,$e,Pt);this.sort.emit({sorts:sn,column:ne,prevValue:$e,newValue:Pt})}calcNewSorts(ne,$e,Pt){let sn=0;this.sorts||(this.sorts=[]);const ei=this.sorts.map((fi,Oi)=>((fi=Object.assign({},fi)).prop===ne.prop&&(sn=Oi),fi));return void 0===Pt?ei.splice(sn,1):$e?ei[sn].dir=Pt:(this.sortType===wn.single&&ei.splice(0,this.sorts.length),ei.push({dir:Pt,prop:ne.prop})),ei}setStylesByGroup(){this._styleByGroup.left=this.calcStylesByGroup("left"),this._styleByGroup.center=this.calcStylesByGroup("center"),this._styleByGroup.right=this.calcStylesByGroup("right"),this.destroyed||this.cd.detectChanges()}calcStylesByGroup(ne){const $e=this._columnGroupWidths,sn={width:`${$e[ne]}px`};return"center"===ne?Ct(sn,-1*this.offsetX,0):"right"===ne&&Ct(sn,-1*($e.total-this.innerWidth),0),sn}}return tt.\u0275fac=function(ne){return new(ne||tt)(r.Y36(r.sBO))},tt.\u0275cmp=r.Xpm({type:tt,selectors:[["datatable-header"]],hostAttrs:[1,"datatable-header"],hostVars:4,hostBindings:function(ne,$e){2&ne&&r.Udp("height",$e.headerHeight)("width",$e.headerWidth)},inputs:{innerWidth:"innerWidth",headerHeight:"headerHeight",columns:"columns",offsetX:"offsetX",sorts:"sorts",sortAscendingIcon:"sortAscendingIcon",sortDescendingIcon:"sortDescendingIcon",sortUnsetIcon:"sortUnsetIcon",scrollbarH:"scrollbarH",dealsWithGroup:"dealsWithGroup",targetMarkerTemplate:"targetMarkerTemplate",sortType:"sortType",allRowsSelected:"allRowsSelected",selectionType:"selectionType",reorderable:"reorderable"},outputs:{sort:"sort",reorder:"reorder",resize:"resize",select:"select",columnContextmenu:"columnContextmenu"},decls:2,vars:4,consts:[["orderable","",1,"datatable-header-inner",3,"reorder","targetChanged"],[3,"class","ngStyle",4,"ngFor","ngForOf","ngForTrackBy"],[3,"ngStyle"],["resizeable","","long-press","","draggable","",3,"resizeEnabled","pressModel","pressEnabled","dragX","dragY","dragModel","dragEventTarget","headerHeight","isTarget","targetMarkerTemplate","targetMarkerContext","column","sortType","sorts","selectionType","sortAscendingIcon","sortDescendingIcon","sortUnsetIcon","allRowsSelected","resize","longPressStart","longPressEnd","sort","select","columnContextmenu",4,"ngFor","ngForOf","ngForTrackBy"],["resizeable","","long-press","","draggable","",3,"resizeEnabled","pressModel","pressEnabled","dragX","dragY","dragModel","dragEventTarget","headerHeight","isTarget","targetMarkerTemplate","targetMarkerContext","column","sortType","sorts","selectionType","sortAscendingIcon","sortDescendingIcon","sortUnsetIcon","allRowsSelected","resize","longPressStart","longPressEnd","sort","select","columnContextmenu"]],template:function(ne,$e){1&ne&&(r.TgZ(0,"div",0),r.NdJ("reorder",function(sn){return $e.onColumnReordered(sn)})("targetChanged",function(sn){return $e.onTargetChanged(sn)}),r.YNc(1,se,2,5,"div",1),r.qZA()),2&ne&&(r.Udp("width",$e._columnGroupWidths.total,"px"),r.xp6(1),r.Q6J("ngForOf",$e._columnsByPin)("ngForTrackBy",$e.trackByGroups))},directives:function(){return[hi,u.sg,u.PC,Yl,zr,Ai,Vn]},encapsulation:2,changeDetection:0}),tt})();function Cn(tt,on,ne){ne=ne||{};let $e,Pt,sn,ei=null,fi=0;function Oi(){fi=!1===ne.leading?0:+new Date,ei=null,sn=tt.apply($e,Pt)}return function(){const os=+new Date;!fi&&!1===ne.leading&&(fi=os);const Ro=on-(os-fi);return $e=this,Pt=arguments,Ro<=0?(clearTimeout(ei),ei=null,fi=os,sn=tt.apply($e,Pt)):!ei&&!1!==ne.trailing&&(ei=setTimeout(Oi,Ro)),sn}}function br(tt,on){return function($e,Pt,sn){return{configurable:!0,enumerable:sn.enumerable,get:function(){return Object.defineProperty(this,Pt,{configurable:!0,enumerable:sn.enumerable,value:Cn(sn.value,tt,on)}),this[Pt]}}}}function _s(tt,on){for(const ne of on){const $e=tt.indexOf(ne);tt.splice($e,1)}}function bs(tt,on=300){let ne=0;for(const $e of tt)ne+=$e.width||on;return ne}var qo=(()=>{return(tt=qo||(qo={})).asc="asc",tt.desc="desc",qo;var tt})();function Ia(tt,on){if(null==tt&&(tt=0),null==on&&(on=0),tt instanceof Date&&on instanceof Date){if(tt<on)return-1;if(tt>on)return 1}else if(isNaN(parseFloat(tt))||!isFinite(tt)||isNaN(parseFloat(on))||!isFinite(on)){if(tt=String(tt),on=String(on),tt.toLowerCase()<on.toLowerCase())return-1;if(tt.toLowerCase()>on.toLowerCase())return 1}else{if(parseFloat(tt)<parseFloat(on))return-1;if(parseFloat(tt)>parseFloat(on))return 1}return 0}let Bs=(()=>{class tt{constructor(ne,$e,Pt,sn,ei,fi,Oi){this.scrollbarHelper=ne,this.dimensionsHelper=$e,this.cd=Pt,this.columnChangesService=fi,this.configuration=Oi,this.selected=[],this.scrollbarV=!1,this.scrollbarH=!1,this.rowHeight=30,this.columnMode=Wn.standard,this.headerHeight=30,this.footerHeight=0,this.externalPaging=!1,this.externalSorting=!1,this.loadingIndicator=!1,this.reorderable=!0,this.swapColumns=!0,this.sortType=wn.single,this.sorts=[],this.cssClasses={sortAscending:"datatable-icon-up",sortDescending:"datatable-icon-down",sortUnset:"datatable-icon-sort-unset",pagerLeftArrow:"datatable-icon-left",pagerRightArrow:"datatable-icon-right",pagerPrevious:"datatable-icon-prev",pagerNext:"datatable-icon-skip"},this.messages={emptyMessage:"No data to display",totalMessage:"total",selectedMessage:"selected"},this.groupExpansionDefault=!1,this.selectAllRowsOnPage=!1,this.virtualization=!0,this.summaryRow=!1,this.summaryHeight=30,this.summaryPosition="top",this.scroll=new r.vpe,this.activate=new r.vpe,this.select=new r.vpe,this.sort=new r.vpe,this.page=new r.vpe,this.reorder=new r.vpe,this.resize=new r.vpe,this.tableContextmenu=new r.vpe(!1),this.treeAction=new r.vpe,this.rowCount=0,this._offsetX=new e.X(0),this._count=0,this._offset=0,this._subscriptions=[],this.rowIdentity=os=>this._groupRowsBy?os.key:os,this.element=sn.nativeElement,this.rowDiffer=ei.find({}).create(),this.configuration&&this.configuration.messages&&(this.messages=Object.assign({},this.configuration.messages))}set rows(ne){this._rows=ne,ne&&(this._internalRows=[...ne]),this.externalSorting||this.sortInternalRows(),this._internalRows=Ii(this._internalRows,si(this.treeFromRelation),si(this.treeToRelation)),this.recalculate(),this._rows&&this._groupRowsBy&&(this.groupedRows=this.groupArrayBy(this._rows,this._groupRowsBy)),this.cd.markForCheck()}get rows(){return this._rows}set groupRowsBy(ne){ne&&(this._groupRowsBy=ne,this._rows&&this._groupRowsBy&&(this.groupedRows=this.groupArrayBy(this._rows,this._groupRowsBy)))}get groupRowsBy(){return this._groupRowsBy}set columns(ne){ne&&(this._internalColumns=[...ne],jt(this._internalColumns),this.recalculateColumns()),this._columns=ne}get columns(){return this._columns}set limit(ne){this._limit=ne,this.recalculate()}get limit(){return this._limit}set count(ne){this._count=ne,this.recalculate()}get count(){return this._count}set offset(ne){this._offset=ne}get offset(){return Math.max(Math.min(this._offset,Math.ceil(this.rowCount/this.pageSize)-1),0)}get isFixedHeader(){const ne=this.headerHeight;return"string"!=typeof ne||"auto"!==ne}get isFixedRow(){return"auto"!==this.rowHeight}get isVertScroll(){return this.scrollbarV}get isVirtualized(){return this.virtualization}get isHorScroll(){return this.scrollbarH}get isSelectable(){return void 0!==this.selectionType}get isCheckboxSelection(){return this.selectionType===kn.checkbox}get isCellSelection(){return this.selectionType===kn.cell}get isSingleSelection(){return this.selectionType===kn.single}get isMultiSelection(){return this.selectionType===kn.multi}get isMultiClickSelection(){return this.selectionType===kn.multiClick}set columnTemplates(ne){this._columnTemplates=ne,this.translateColumns(ne)}get columnTemplates(){return this._columnTemplates}get allRowsSelected(){let ne=this.rows&&this.selected&&this.selected.length===this.rows.length;if(this.bodyComponent&&this.selectAllRowsOnPage){const $e=this.bodyComponent.indexes;ne=this.selected.length===$e.last-$e.first}return this.selected&&this.rows&&0!==this.rows.length&&ne}ngOnInit(){this.recalculate()}ngAfterViewInit(){this.externalSorting||this.sortInternalRows(),"undefined"!=typeof requestAnimationFrame&&requestAnimationFrame(()=>{this.recalculate(),this.externalPaging&&this.scrollbarV&&this.page.emit({count:this.count,pageSize:this.pageSize,limit:this.limit,offset:0})})}ngAfterContentInit(){this.columnTemplates.changes.subscribe(ne=>this.translateColumns(ne)),this.listenForColumnInputChanges()}translateColumns(ne){if(ne){const $e=ne.toArray();$e.length&&(this._internalColumns=function(tt){const on=[];for(const ne of tt){const $e={},Pt=Object.getOwnPropertyNames(ne);for(const sn of Pt)$e[sn]=ne[sn];ne.headerTemplate&&($e.headerTemplate=ne.headerTemplate),ne.cellTemplate&&($e.cellTemplate=ne.cellTemplate),ne.summaryFunc&&($e.summaryFunc=ne.summaryFunc),ne.summaryTemplate&&($e.summaryTemplate=ne.summaryTemplate),on.push($e)}return on}($e),jt(this._internalColumns),this.recalculateColumns(),this.sortInternalRows(),this.cd.markForCheck())}}groupArrayBy(ne,$e){const Pt=new Map;return ne.forEach(fi=>{const Oi=fi[$e];Pt.has(Oi)?Pt.get(Oi).push(fi):Pt.set(Oi,[fi])}),Array.from(Pt,fi=>((fi,Oi)=>({key:fi,value:Oi}))(fi[0],fi[1]))}ngDoCheck(){this.rowDiffer.diff(this.rows)&&(this.externalSorting?this._internalRows=[...this.rows]:this.sortInternalRows(),this._internalRows=Ii(this._internalRows,si(this.treeFromRelation),si(this.treeToRelation)),this.recalculatePages(),this.cd.markForCheck())}recalculate(){this.recalculateDims(),this.recalculateColumns(),this.cd.markForCheck()}onWindowResize(){this.recalculate()}recalculateColumns(ne=this._internalColumns,$e=-1,Pt=this.scrollbarH){if(!ne)return;let sn=this._innerWidth;return this.scrollbarV&&(sn-=this.scrollbarHelper.width),this.columnMode===Wn.force?function(tt,on,ne,$e,Pt=300){const sn=tt.slice(ne+1,tt.length).filter(To=>!1!==To.canAutoResize);for(const To of sn)To.$$oldWidth||(To.$$oldWidth=To.width);let ei=0,fi=!1,Oi=bs(tt,Pt),os=on-Oi;const Ro=[];do{ei=os/sn.length,fi=Oi>=on;for(const To of sn){if(fi&&$e)To.width=To.$$oldWidth||To.width||Pt;else{const Ea=(To.width||Pt)+ei;To.minWidth&&Ea<To.minWidth?(To.width=To.minWidth,Ro.push(To)):To.maxWidth&&Ea>To.maxWidth?(To.width=To.maxWidth,Ro.push(To)):To.width=Ea}To.width=Math.max(0,To.width)}Oi=bs(tt),os=on-Oi,_s(sn,Ro)}while(os>1&&0!==sn.length)}(ne,sn,$e,Pt):this.columnMode===Wn.flex&&function(tt,on){const ne=function(tt,on){let ne=0;for(const $e of tt)ne+=$e.width;return ne}(tt),$e=function(tt){let on=0;for(const ne of tt)on+=ne.flexGrow||0;return on}(tt),Pt=So(tt);ne!==on&&function(tt,on,ne){for(const sn in tt)for(const ei of tt[sn])ei.canAutoResize?ei.width=0:(on-=ei.width,ne-=ei.flexGrow?ei.flexGrow:0);const $e={};let Pt=on;do{const sn=Pt/ne;Pt=0;for(const ei in tt)for(const fi of tt[ei])if(fi.canAutoResize&&!$e[fi.prop]){const Oi=fi.width+fi.flexGrow*sn;void 0!==fi.minWidth&&Oi<fi.minWidth?(Pt+=Oi-fi.minWidth,fi.width=fi.minWidth,$e[fi.prop]=!0):fi.width=Oi}}while(0!==Pt)}(Pt,on,$e)}(ne,sn),ne}recalculateDims(){const ne=this.dimensionsHelper.getDimensions(this.element);if(this._innerWidth=Math.floor(ne.width),this.scrollbarV){let $e=ne.height;this.headerHeight&&($e-=this.headerHeight),this.footerHeight&&($e-=this.footerHeight),this.bodyHeight=$e}this.recalculatePages()}recalculatePages(){this.pageSize=this.calcPageSize(),this.rowCount=this.calcRowCount()}onBodyPage({offset:ne}){this.externalPaging&&!this.virtualization||(this.offset=ne,this.page.emit({count:this.count,pageSize:this.pageSize,limit:this.limit,offset:this.offset}))}onBodyScroll(ne){this._offsetX.next(ne.offsetX),this.scroll.emit(ne),this.cd.detectChanges()}onFooterPage(ne){this.offset=ne.page-1,this.bodyComponent.updateOffsetY(this.offset),this.page.emit({count:this.count,pageSize:this.pageSize,limit:this.limit,offset:this.offset}),this.selectAllRowsOnPage&&(this.selected=[],this.select.emit({selected:this.selected}))}calcPageSize(ne=this.rows){if(this.scrollbarV&&this.virtualization){const $e=Math.ceil(this.bodyHeight/this.rowHeight);return Math.max($e,0)}return void 0!==this.limit?this.limit:ne?ne.length:0}calcRowCount(ne=this.rows){return this.externalPaging?this.count:ne?this.groupedRows?this.groupedRows.length:null!=this.treeFromRelation&&null!=this.treeToRelation?this._internalRows.length:ne.length:0}onColumnContextmenu({event:ne,column:$e}){this.tableContextmenu.emit({event:ne,type:nr.header,content:$e})}onRowContextmenu({event:ne,row:$e}){this.tableContextmenu.emit({event:ne,type:nr.body,content:$e})}onColumnResize({column:ne,newValue:$e}){if(void 0===ne)return;let Pt;const sn=this._internalColumns.map((ei,fi)=>((ei=Object.assign({},ei)).$$id===ne.$$id&&(Pt=fi,ei.width=$e,ei.$$oldWidth=$e),ei));this.recalculateColumns(sn,Pt),this._internalColumns=sn,this.resize.emit({column:ne,newValue:$e})}onColumnReorder({column:ne,newValue:$e,prevValue:Pt}){const sn=this._internalColumns.map(ei=>Object.assign({},ei));if(this.swapColumns){const ei=sn[$e];sn[$e]=ne,sn[Pt]=ei}else if($e>Pt){const ei=sn[Pt];for(let fi=Pt;fi<$e;fi++)sn[fi]=sn[fi+1];sn[$e]=ei}else{const ei=sn[Pt];for(let fi=Pt;fi>$e;fi--)sn[fi]=sn[fi-1];sn[$e]=ei}this._internalColumns=sn,this.reorder.emit({column:ne,newValue:$e,prevValue:Pt})}onColumnSort(ne){this.selectAllRowsOnPage&&(this.selected=[],this.select.emit({selected:this.selected})),this.sorts=ne.sorts,!1===this.externalSorting&&this.sortInternalRows(),this._internalRows=Ii(this._internalRows,si(this.treeFromRelation),si(this.treeToRelation)),this.offset=0,this.bodyComponent.updateOffsetY(this.offset),this.sort.emit(ne)}onHeaderSelect(ne){if(this.bodyComponent&&this.selectAllRowsOnPage){const $e=this.bodyComponent.indexes.first,Pt=this.bodyComponent.indexes.last,sn=this.selected.length===Pt-$e;this.selected=[],sn||this.selected.push(...this._internalRows.slice($e,Pt))}else{const $e=this.selected.length===this.rows.length;this.selected=[],$e||this.selected.push(...this.rows)}this.select.emit({selected:this.selected})}onBodySelect(ne){this.select.emit(ne)}onTreeAction(ne){const $e=ne.row,Pt=this._rows.findIndex(sn=>sn[this.treeToRelation]===ne.row[this.treeToRelation]);this.treeAction.emit({row:$e,rowIndex:Pt})}ngOnDestroy(){this._subscriptions.forEach(ne=>ne.unsubscribe())}listenForColumnInputChanges(){this._subscriptions.push(this.columnChangesService.columnInputChanges$.subscribe(()=>{this.columnTemplates&&this.columnTemplates.notifyOnChanges()}))}sortInternalRows(){this._internalRows=function(tt,on,ne){if(!tt)return[];if(!ne||!ne.length||!on)return[...tt];const $e=new Map;tt.forEach((fi,Oi)=>$e.set(fi,Oi));const Pt=[...tt],sn=on.reduce((fi,Oi)=>(Oi.comparator&&"function"==typeof Oi.comparator&&(fi[Oi.prop]=Oi.comparator),fi),{}),ei=ne.map(fi=>{const Oi=fi.prop;return{prop:Oi,dir:fi.dir,valueGetter:mr(Oi),compareFn:sn[Oi]||Ia}});return Pt.sort(function(fi,Oi){for(const os of ei){const{prop:Ro,valueGetter:Uo}=os,To=Uo(fi,Ro),Ea=Uo(Oi,Ro),al=os.dir!==qo.desc?os.compareFn(To,Ea,fi,Oi,os.dir):-os.compareFn(To,Ea,fi,Oi,os.dir);if(0!==al)return al}return $e.has(fi)&&$e.has(Oi)?$e.get(fi)<$e.get(Oi)?-1:1:0})}(this._internalRows,this._internalColumns,this.sorts)}}return tt.\u0275fac=function(ne){return new(ne||tt)(r.Y36(On,4),r.Y36(Wt,4),r.Y36(r.sBO),r.Y36(r.SBq),r.Y36(r.aQg),r.Y36(Jn),r.Y36("configuration",8))},tt.\u0275cmp=r.Xpm({type:tt,selectors:[["ngx-datatable"]],contentQueries:function(ne,$e,Pt){if(1&ne&&(r.Suo(Pt,cs,5),r.Suo(Pt,gn,5),r.Suo(Pt,zo,5),r.Suo(Pt,Mo,4)),2&ne){let sn;r.iGM(sn=r.CRH())&&($e.rowDetail=sn.first),r.iGM(sn=r.CRH())&&($e.groupHeader=sn.first),r.iGM(sn=r.CRH())&&($e.footer=sn.first),r.iGM(sn=r.CRH())&&($e.columnTemplates=sn)}},viewQuery:function(ne,$e){if(1&ne&&(r.Gf(pr,5),r.Gf(nn,5)),2&ne){let Pt;r.iGM(Pt=r.CRH())&&($e.bodyComponent=Pt.first),r.iGM(Pt=r.CRH())&&($e.headerComponent=Pt.first)}},hostAttrs:[1,"ngx-datatable"],hostVars:22,hostBindings:function(ne,$e){1&ne&&r.NdJ("resize",function(){return $e.onWindowResize()},!1,r.Jf7),2&ne&&r.ekj("fixed-header",$e.isFixedHeader)("fixed-row",$e.isFixedRow)("scroll-vertical",$e.isVertScroll)("virtualized",$e.isVirtualized)("scroll-horz",$e.isHorScroll)("selectable",$e.isSelectable)("checkbox-selection",$e.isCheckboxSelection)("cell-selection",$e.isCellSelection)("single-selection",$e.isSingleSelection)("multi-selection",$e.isMultiSelection)("multi-click-selection",$e.isMultiClickSelection)},inputs:{selected:"selected",scrollbarV:"scrollbarV",scrollbarH:"scrollbarH",rowHeight:"rowHeight",columnMode:"columnMode",headerHeight:"headerHeight",footerHeight:"footerHeight",externalPaging:"externalPaging",externalSorting:"externalSorting",loadingIndicator:"loadingIndicator",reorderable:"reorderable",swapColumns:"swapColumns",sortType:"sortType",sorts:"sorts",cssClasses:"cssClasses",messages:"messages",groupExpansionDefault:"groupExpansionDefault",selectAllRowsOnPage:"selectAllRowsOnPage",virtualization:"virtualization",summaryRow:"summaryRow",summaryHeight:"summaryHeight",summaryPosition:"summaryPosition",rowIdentity:"rowIdentity",rows:"rows",groupedRows:"groupedRows",groupRowsBy:"groupRowsBy",columns:"columns",limit:"limit",count:"count",offset:"offset",targetMarkerTemplate:"targetMarkerTemplate",selectionType:"selectionType",rowClass:"rowClass",selectCheck:"selectCheck",displayCheck:"displayCheck",trackByProp:"trackByProp",treeFromRelation:"treeFromRelation",treeToRelation:"treeToRelation"},outputs:{scroll:"scroll",activate:"activate",select:"select",sort:"sort",page:"page",reorder:"reorder",resize:"resize",tableContextmenu:"tableContextmenu",treeAction:"treeAction"},decls:5,vars:34,consts:[["visibilityObserver","",3,"visible"],[3,"sorts","sortType","scrollbarH","innerWidth","offsetX","dealsWithGroup","columns","headerHeight","reorderable","targetMarkerTemplate","sortAscendingIcon","sortDescendingIcon","sortUnsetIcon","allRowsSelected","selectionType","sort","resize","reorder","select","columnContextmenu",4,"ngIf"],[3,"groupRowsBy","groupedRows","rows","groupExpansionDefault","scrollbarV","scrollbarH","virtualization","loadingIndicator","externalPaging","rowHeight","rowCount","offset","trackByProp","columns","pageSize","offsetX","rowDetail","groupHeader","selected","innerWidth","bodyHeight","selectionType","emptyMessage","rowIdentity","rowClass","selectCheck","displayCheck","summaryRow","summaryHeight","summaryPosition","page","activate","rowContextmenu","select","scroll","treeAction"],[3,"rowCount","pageSize","offset","footerHeight","footerTemplate","totalMessage","pagerLeftArrowIcon","pagerRightArrowIcon","pagerPreviousIcon","selectedCount","selectedMessage","pagerNextIcon","page",4,"ngIf"],[3,"sorts","sortType","scrollbarH","innerWidth","offsetX","dealsWithGroup","columns","headerHeight","reorderable","targetMarkerTemplate","sortAscendingIcon","sortDescendingIcon","sortUnsetIcon","allRowsSelected","selectionType","sort","resize","reorder","select","columnContextmenu"],[3,"rowCount","pageSize","offset","footerHeight","footerTemplate","totalMessage","pagerLeftArrowIcon","pagerRightArrowIcon","pagerPreviousIcon","selectedCount","selectedMessage","pagerNextIcon","page"]],template:function(ne,$e){1&ne&&(r.TgZ(0,"div",0),r.NdJ("visible",function(){return $e.recalculate()}),r.YNc(1,ve,2,17,"datatable-header",1),r.TgZ(2,"datatable-body",2),r.NdJ("page",function(sn){return $e.onBodyPage(sn)})("activate",function(sn){return $e.activate.emit(sn)})("rowContextmenu",function(sn){return $e.onRowContextmenu(sn)})("select",function(sn){return $e.onBodySelect(sn)})("scroll",function(sn){return $e.onBodyScroll(sn)})("treeAction",function(sn){return $e.onTreeAction(sn)}),r.ALo(3,"async"),r.qZA(),r.YNc(4,oe,1,12,"datatable-footer",3),r.qZA()),2&ne&&(r.xp6(1),r.Q6J("ngIf",$e.headerHeight),r.xp6(1),r.Q6J("groupRowsBy",$e.groupRowsBy)("groupedRows",$e.groupedRows)("rows",$e._internalRows)("groupExpansionDefault",$e.groupExpansionDefault)("scrollbarV",$e.scrollbarV)("scrollbarH",$e.scrollbarH)("virtualization",$e.virtualization)("loadingIndicator",$e.loadingIndicator)("externalPaging",$e.externalPaging)("rowHeight",$e.rowHeight)("rowCount",$e.rowCount)("offset",$e.offset)("trackByProp",$e.trackByProp)("columns",$e._internalColumns)("pageSize",$e.pageSize)("offsetX",r.lcZ(3,32,$e._offsetX))("rowDetail",$e.rowDetail)("groupHeader",$e.groupHeader)("selected",$e.selected)("innerWidth",$e._innerWidth)("bodyHeight",$e.bodyHeight)("selectionType",$e.selectionType)("emptyMessage",$e.messages.emptyMessage)("rowIdentity",$e.rowIdentity)("rowClass",$e.rowClass)("selectCheck",$e.selectCheck)("displayCheck",$e.displayCheck)("summaryRow",$e.summaryRow)("summaryHeight",$e.summaryHeight)("summaryPosition",$e.summaryPosition),r.xp6(2),r.Q6J("ngIf",$e.footerHeight))},directives:function(){return[Lr,u.O5,pr,nn,yl]},pipes:function(){return[u.Ov]},styles:[".ngx-datatable{display:block;justify-content:center;overflow:hidden;position:relative;transform:translateZ(0)}.ngx-datatable [hidden]{display:none!important}.ngx-datatable *,.ngx-datatable :after,.ngx-datatable :before{box-sizing:border-box}.ngx-datatable.scroll-vertical .datatable-body{overflow-y:auto}.ngx-datatable.scroll-vertical.virtualized .datatable-body .datatable-row-wrapper{position:absolute}.ngx-datatable.scroll-horz .datatable-body{-webkit-overflow-scrolling:touch;overflow-x:auto}.ngx-datatable.fixed-header .datatable-header .datatable-header-inner{white-space:nowrap}.ngx-datatable.fixed-header .datatable-header .datatable-header-inner .datatable-header-cell{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.ngx-datatable.fixed-row .datatable-scroll,.ngx-datatable.fixed-row .datatable-scroll .datatable-body-row{white-space:nowrap}.ngx-datatable.fixed-row .datatable-scroll .datatable-body-row .datatable-body-cell,.ngx-datatable.fixed-row .datatable-scroll .datatable-body-row .datatable-body-group-cell{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.ngx-datatable .datatable-body-row,.ngx-datatable .datatable-header-inner,.ngx-datatable .datatable-row-center{-o-flex-flow:row;display:flex;flex-direction:row;flex-flow:row}.ngx-datatable .datatable-body-cell,.ngx-datatable .datatable-header-cell{display:inline-block;line-height:1.625;overflow-x:hidden;vertical-align:top}.ngx-datatable .datatable-body-cell:focus,.ngx-datatable .datatable-header-cell:focus{outline:none}.ngx-datatable .datatable-row-left,.ngx-datatable .datatable-row-right{z-index:9}.ngx-datatable .datatable-row-center,.ngx-datatable .datatable-row-group,.ngx-datatable .datatable-row-left,.ngx-datatable .datatable-row-right{position:relative}.ngx-datatable .datatable-header{display:block;overflow:hidden}.ngx-datatable .datatable-header .datatable-header-inner{-webkit-align-items:stretch;align-items:stretch}.ngx-datatable .datatable-header .datatable-header-cell{display:inline-block;position:relative}.ngx-datatable .datatable-header .datatable-header-cell.sortable .datatable-header-cell-wrapper{cursor:pointer}.ngx-datatable .datatable-header .datatable-header-cell.longpress .datatable-header-cell-wrapper{cursor:move}.ngx-datatable .datatable-header .datatable-header-cell .sort-btn{cursor:pointer;display:inline-block;line-height:100%;vertical-align:middle}.ngx-datatable .datatable-header .datatable-header-cell .resize-handle,.ngx-datatable .datatable-header .datatable-header-cell .resize-handle--not-resizable{bottom:0;display:inline-block;padding:0 4px;position:absolute;right:0;top:0;visibility:hidden;width:5px}.ngx-datatable .datatable-header .datatable-header-cell .resize-handle{cursor:ew-resize}.ngx-datatable .datatable-header .datatable-header-cell.resizeable:hover .resize-handle,.ngx-datatable .datatable-header .datatable-header-cell:hover .resize-handle--not-resizable{visibility:visible}.ngx-datatable .datatable-header .datatable-header-cell .targetMarker{bottom:0;position:absolute;top:0}.ngx-datatable .datatable-header .datatable-header-cell .targetMarker.dragFromLeft{right:0}.ngx-datatable .datatable-header .datatable-header-cell .targetMarker.dragFromRight{left:0}.ngx-datatable .datatable-header .datatable-header-cell .datatable-header-cell-template-wrap{height:inherit}.ngx-datatable .datatable-body{display:block;position:relative;z-index:10}.ngx-datatable .datatable-body .datatable-scroll{display:inline-block}.ngx-datatable .datatable-body .datatable-row-detail{overflow-y:hidden}.ngx-datatable .datatable-body .datatable-row-wrapper{display:flex;flex-direction:column}.ngx-datatable .datatable-body .datatable-body-row{outline:none}.ngx-datatable .datatable-body .datatable-body-row>div{display:flex}.ngx-datatable .datatable-footer{display:block;overflow:auto;width:100%}.ngx-datatable .datatable-footer .datatable-footer-inner{align-items:center;display:flex;width:100%}.ngx-datatable .datatable-footer .selected-count .page-count{flex:1 1 40%}.ngx-datatable .datatable-footer .selected-count .datatable-pager{flex:1 1 60%}.ngx-datatable .datatable-footer .page-count{flex:1 1 20%}.ngx-datatable .datatable-footer .datatable-pager{flex:1 1 80%;text-align:right}.ngx-datatable .datatable-footer .datatable-pager .pager,.ngx-datatable .datatable-footer .datatable-pager .pager li{display:inline-block;list-style:none;margin:0;padding:0}.ngx-datatable .datatable-footer .datatable-pager .pager li,.ngx-datatable .datatable-footer .datatable-pager .pager li a{outline:none}.ngx-datatable .datatable-footer .datatable-pager .pager li a{cursor:pointer;display:inline-block}.ngx-datatable .datatable-footer .datatable-pager .pager li.disabled a{cursor:not-allowed}"],encapsulation:2,changeDetection:0}),(0,y.gn)([br(5)],tt.prototype,"onWindowResize",null),tt})(),Yl=(()=>{class tt{constructor(ne){this.cd=ne,this.sort=new r.vpe,this.select=new r.vpe,this.columnContextmenu=new r.vpe(!1),this.sortFn=this.onSort.bind(this),this.selectFn=this.select.emit.bind(this.select),this.cellContext={column:this.column,sortDir:this.sortDir,sortFn:this.sortFn,allRowsSelected:this.allRowsSelected,selectFn:this.selectFn}}set allRowsSelected(ne){this._allRowsSelected=ne,this.cellContext.allRowsSelected=ne}get allRowsSelected(){return this._allRowsSelected}set column(ne){this._column=ne,this.cellContext.column=ne,this.cd.markForCheck()}get column(){return this._column}set sorts(ne){this._sorts=ne,this.sortDir=this.calcSortDir(ne),this.cellContext.sortDir=this.sortDir,this.sortClass=this.calcSortClass(this.sortDir),this.cd.markForCheck()}get sorts(){return this._sorts}get columnCssClasses(){let ne="datatable-header-cell";if(this.column.sortable&&(ne+=" sortable"),this.column.resizeable&&(ne+=" resizeable"),this.column.headerClass)if("string"==typeof this.column.headerClass)ne+=" "+this.column.headerClass;else if("function"==typeof this.column.headerClass){const Pt=this.column.headerClass({column:this.column});if("string"==typeof Pt)ne+=Pt;else if("object"==typeof Pt){const sn=Object.keys(Pt);for(const ei of sn)!0===Pt[ei]&&(ne+=` ${ei}`)}}const $e=this.sortDir;return $e&&(ne+=` sort-active sort-${$e}`),ne}get name(){return void 0===this.column.headerTemplate?this.column.name:void 0}get minWidth(){return this.column.minWidth}get maxWidth(){return this.column.maxWidth}get width(){return this.column.width}get isCheckboxable(){return this.column.checkboxable&&this.column.headerCheckboxable&&this.selectionType===kn.checkbox}onContextmenu(ne){this.columnContextmenu.emit({event:ne,column:this.column})}ngOnInit(){this.sortClass=this.calcSortClass(this.sortDir)}calcSortDir(ne){if(ne&&this.column){const $e=ne.find(Pt=>Pt.prop===this.column.prop);if($e)return $e.dir}}onSort(){if(!this.column.sortable)return;const ne=function(tt,on){return tt===wn.single?on===qo.asc?qo.desc:qo.asc:on?on===qo.asc?qo.desc:void 0:qo.asc}(this.sortType,this.sortDir);this.sort.emit({column:this.column,prevValue:this.sortDir,newValue:ne})}calcSortClass(ne){if(this.cellContext.column.sortable)return ne===qo.asc?`sort-btn sort-asc ${this.sortAscendingIcon}`:ne===qo.desc?`sort-btn sort-desc ${this.sortDescendingIcon}`:`sort-btn ${this.sortUnsetIcon}`}}return tt.\u0275fac=function(ne){return new(ne||tt)(r.Y36(r.sBO))},tt.\u0275cmp=r.Xpm({type:tt,selectors:[["datatable-header-cell"]],hostAttrs:[1,"datatable-header-cell"],hostVars:11,hostBindings:function(ne,$e){1&ne&&r.NdJ("contextmenu",function(sn){return $e.onContextmenu(sn)}),2&ne&&(r.uIk("title",$e.name),r.Tol($e.columnCssClasses),r.Udp("min-width",$e.minWidth,"px")("max-width",$e.maxWidth,"px")("width",$e.width,"px")("height",$e.headerHeight,"px"))},inputs:{allRowsSelected:"allRowsSelected",column:"column",sorts:"sorts",sortType:"sortType",sortAscendingIcon:"sortAscendingIcon",sortDescendingIcon:"sortDescendingIcon",sortUnsetIcon:"sortUnsetIcon",isTarget:"isTarget",targetMarkerTemplate:"targetMarkerTemplate",targetMarkerContext:"targetMarkerContext",selectionType:"selectionType",headerHeight:"headerHeight"},outputs:{sort:"sort",select:"select",columnContextmenu:"columnContextmenu"},decls:6,vars:6,consts:[[1,"datatable-header-cell-template-wrap"],[4,"ngIf"],["class","datatable-checkbox",4,"ngIf"],["class","datatable-header-cell-wrapper",4,"ngIf"],[3,"click"],[3,"ngTemplateOutlet","ngTemplateOutletContext"],[1,"datatable-checkbox"],["type","checkbox",3,"checked","change"],[1,"datatable-header-cell-wrapper"],[1,"datatable-header-cell-label","draggable",3,"innerHTML","click"]],template:function(ne,$e){1&ne&&(r.TgZ(0,"div",0),r.YNc(1,me,1,2,void 0,1),r.YNc(2,Oe,2,1,"label",2),r.YNc(3,ce,2,1,"span",3),r.YNc(4,ze,1,2,void 0,1),r.TgZ(5,"span",4),r.NdJ("click",function(){return $e.onSort()}),r.qZA(),r.qZA()),2&ne&&(r.xp6(1),r.Q6J("ngIf",$e.isTarget),r.xp6(1),r.Q6J("ngIf",$e.isCheckboxable),r.xp6(1),r.Q6J("ngIf",!$e.column.headerTemplate),r.xp6(1),r.Q6J("ngIf",$e.column.headerTemplate),r.xp6(1),r.Tol($e.sortClass))},directives:[u.O5,u.tP],encapsulation:2,changeDetection:0}),tt})(),yl=(()=>{class tt{constructor(){this.selectedCount=0,this.page=new r.vpe}get isVisible(){return this.rowCount/this.pageSize>1}get curPage(){return this.offset+1}}return tt.\u0275fac=function(ne){return new(ne||tt)},tt.\u0275cmp=r.Xpm({type:tt,selectors:[["datatable-footer"]],hostAttrs:[1,"datatable-footer"],inputs:{selectedCount:"selectedCount",footerHeight:"footerHeight",rowCount:"rowCount",pageSize:"pageSize",offset:"offset",pagerLeftArrowIcon:"pagerLeftArrowIcon",pagerRightArrowIcon:"pagerRightArrowIcon",pagerPreviousIcon:"pagerPreviousIcon",pagerNextIcon:"pagerNextIcon",totalMessage:"totalMessage",footerTemplate:"footerTemplate",selectedMessage:"selectedMessage"},outputs:{page:"page"},decls:4,vars:8,consts:[[1,"datatable-footer-inner",3,"ngClass"],[4,"ngIf"],["class","page-count",4,"ngIf"],[3,"pagerLeftArrowIcon","pagerRightArrowIcon","pagerPreviousIcon","pagerNextIcon","page","size","count","hidden","change",4,"ngIf"],[3,"ngTemplateOutlet","ngTemplateOutletContext"],[1,"page-count"],[3,"pagerLeftArrowIcon","pagerRightArrowIcon","pagerPreviousIcon","pagerNextIcon","page","size","count","hidden","change"]],template:function(ne,$e){1&ne&&(r.TgZ(0,"div",0),r.YNc(1,Ie,1,8,void 0,1),r.YNc(2,He,3,3,"div",2),r.YNc(3,Zt,1,8,"datatable-pager",3),r.qZA()),2&ne&&(r.Udp("height",$e.footerHeight,"px"),r.Q6J("ngClass",r.VKq(6,st,$e.selectedMessage)),r.xp6(1),r.Q6J("ngIf",$e.footerTemplate),r.xp6(1),r.Q6J("ngIf",!$e.footerTemplate),r.xp6(1),r.Q6J("ngIf",!$e.footerTemplate))},directives:function(){return[u.mk,u.O5,u.tP,fo]},encapsulation:2,changeDetection:0}),tt})(),fo=(()=>{class tt{constructor(){this.change=new r.vpe,this._count=0,this._page=1,this._size=0}set size(ne){this._size=ne,this.pages=this.calcPages()}get size(){return this._size}set count(ne){this._count=ne,this.pages=this.calcPages()}get count(){return this._count}set page(ne){this._page=ne,this.pages=this.calcPages()}get page(){return this._page}get totalPages(){const ne=this.size<1?1:Math.ceil(this.count/this.size);return Math.max(ne||0,1)}canPrevious(){return this.page>1}canNext(){return this.page<this.totalPages}prevPage(){this.selectPage(this.page-1)}nextPage(){this.selectPage(this.page+1)}selectPage(ne){ne>0&&ne<=this.totalPages&&ne!==this.page&&(this.page=ne,this.change.emit({page:ne}))}calcPages(ne){const $e=[];let Pt=1,sn=this.totalPages;ne=ne||this.page,5<this.totalPages&&(Pt=ne-Math.floor(2.5),sn=ne+Math.floor(2.5),Pt<1?(Pt=1,sn=Math.min(Pt+5-1,this.totalPages)):sn>this.totalPages&&(Pt=Math.max(this.totalPages-5+1,1),sn=this.totalPages));for(let Oi=Pt;Oi<=sn;Oi++)$e.push({number:Oi,text:Oi});return $e}}return tt.\u0275fac=function(ne){return new(ne||tt)},tt.\u0275cmp=r.Xpm({type:tt,selectors:[["datatable-pager"]],hostAttrs:[1,"datatable-pager"],inputs:{size:"size",count:"count",page:"page",pagerLeftArrowIcon:"pagerLeftArrowIcon",pagerRightArrowIcon:"pagerRightArrowIcon",pagerPreviousIcon:"pagerPreviousIcon",pagerNextIcon:"pagerNextIcon"},outputs:{change:"change"},decls:14,vars:21,consts:[[1,"pager"],["role","button","aria-label","go to first page","href","javascript:void(0)",3,"click"],["role","button","aria-label","go to previous page","href","javascript:void(0)",3,"click"],["role","button","class","pages",3,"active",4,"ngFor","ngForOf"],["role","button","aria-label","go to next page","href","javascript:void(0)",3,"click"],["role","button","aria-label","go to last page","href","javascript:void(0)",3,"click"],["role","button",1,"pages"],["href","javascript:void(0)",3,"click"]],template:function(ne,$e){1&ne&&(r.TgZ(0,"ul",0),r.TgZ(1,"li"),r.TgZ(2,"a",1),r.NdJ("click",function(){return $e.selectPage(1)}),r._UZ(3,"i"),r.qZA(),r.qZA(),r.TgZ(4,"li"),r.TgZ(5,"a",2),r.NdJ("click",function(){return $e.prevPage()}),r._UZ(6,"i"),r.qZA(),r.qZA(),r.YNc(7,en,3,4,"li",3),r.TgZ(8,"li"),r.TgZ(9,"a",4),r.NdJ("click",function(){return $e.nextPage()}),r._UZ(10,"i"),r.qZA(),r.qZA(),r.TgZ(11,"li"),r.TgZ(12,"a",5),r.NdJ("click",function(){return $e.selectPage($e.totalPages)}),r._UZ(13,"i"),r.qZA(),r.qZA(),r.qZA()),2&ne&&(r.xp6(1),r.ekj("disabled",!$e.canPrevious()),r.xp6(2),r.Tol($e.pagerPreviousIcon),r.xp6(1),r.ekj("disabled",!$e.canPrevious()),r.xp6(2),r.Tol($e.pagerLeftArrowIcon),r.xp6(1),r.Q6J("ngForOf",$e.pages),r.xp6(1),r.ekj("disabled",!$e.canNext()),r.xp6(2),r.Tol($e.pagerRightArrowIcon),r.xp6(1),r.ekj("disabled",!$e.canNext()),r.xp6(2),r.Tol($e.pagerNextIcon))},directives:[u.sg],encapsulation:2,changeDetection:0}),tt})(),Da=(()=>{class tt{}return tt.\u0275fac=function(ne){return new(ne||tt)},tt.\u0275cmp=r.Xpm({type:tt,selectors:[["datatable-progress"]],decls:3,vars:0,consts:[["role","progressbar",1,"progress-linear"],[1,"container"],[1,"bar"]],template:function(ne,$e){1&ne&&(r.TgZ(0,"div",0),r.TgZ(1,"div",1),r._UZ(2,"div",2),r.qZA(),r.qZA())},encapsulation:2,changeDetection:0}),tt})();var Ao=(()=>{return(tt=Ao||(Ao={}))[tt.up=38]="up",tt[tt.down=40]="down",tt[tt.return=13]="return",tt[tt.escape=27]="escape",tt[tt.left=37]="left",tt[tt.right=39]="right",Ao;var tt})();let ls=(()=>{class tt{constructor(ne,$e,Pt,sn){this.differs=ne,this.scrollbarHelper=$e,this.cd=Pt,this.treeStatus="collapsed",this.activate=new r.vpe,this.treeAction=new r.vpe,this._groupStyles={left:{},center:{},right:{}},this._element=sn.nativeElement,this._rowDiffer=ne.find({}).create()}set columns(ne){this._columns=ne,this.recalculateColumns(ne),this.buildStylesByGroup()}get columns(){return this._columns}set innerWidth(ne){if(this._columns){const $e=So(this._columns);this._columnGroupWidths=Si($e,this._columns)}this._innerWidth=ne,this.recalculateColumns(),this.buildStylesByGroup()}get innerWidth(){return this._innerWidth}set offsetX(ne){this._offsetX=ne,this.buildStylesByGroup()}get offsetX(){return this._offsetX}get cssClass(){let ne="datatable-body-row";if(this.isSelected&&(ne+=" active"),this.rowIndex%2!=0&&(ne+=" datatable-row-odd"),this.rowIndex%2==0&&(ne+=" datatable-row-even"),this.rowClass){const $e=this.rowClass(this.row);if("string"==typeof $e)ne+=` ${$e}`;else if("object"==typeof $e){const Pt=Object.keys($e);for(const sn of Pt)!0===$e[sn]&&(ne+=` ${sn}`)}}return ne}get columnsTotalWidths(){return this._columnGroupWidths.total}ngDoCheck(){this._rowDiffer.diff(this.row)&&this.cd.markForCheck()}trackByGroups(ne,$e){return $e.type}columnTrackingFn(ne,$e){return $e.$$id}buildStylesByGroup(){this._groupStyles.left=this.calcStylesByGroup("left"),this._groupStyles.center=this.calcStylesByGroup("center"),this._groupStyles.right=this.calcStylesByGroup("right"),this.cd.markForCheck()}calcStylesByGroup(ne){const $e=this._columnGroupWidths,Pt=this.offsetX,sn={width:`${$e[ne]}px`};if("left"===ne)Ct(sn,Pt,0);else if("right"===ne){const ei=parseInt(this.innerWidth+"",0);Ct(sn,-1*($e.total-ei-Pt+this.scrollbarHelper.width),0)}return sn}onActivate(ne,$e){ne.cellIndex=$e,ne.rowElement=this._element,this.activate.emit(ne)}onKeyDown(ne){const $e=ne.keyCode;($e===Ao.return||$e===Ao.down||$e===Ao.up||$e===Ao.left||$e===Ao.right)&&ne.target===this._element&&(ne.preventDefault(),ne.stopPropagation(),this.activate.emit({type:"keydown",event:ne,row:this.row,rowElement:this._element}))}onMouseenter(ne){this.activate.emit({type:"mouseenter",event:ne,row:this.row,rowElement:this._element})}recalculateColumns(ne=this.columns){this._columns=ne;const $e=So(this._columns);this._columnsByPin=cr(this._columns),this._columnGroupWidths=Si($e,this._columns)}onTreeAction(){this.treeAction.emit()}}return tt.\u0275fac=function(ne){return new(ne||tt)(r.Y36(r.aQg),r.Y36(On,4),r.Y36(r.sBO),r.Y36(r.SBq))},tt.\u0275cmp=r.Xpm({type:tt,selectors:[["datatable-body-row"]],hostVars:6,hostBindings:function(ne,$e){1&ne&&r.NdJ("keydown",function(sn){return $e.onKeyDown(sn)})("mouseenter",function(sn){return $e.onMouseenter(sn)}),2&ne&&(r.Tol($e.cssClass),r.Udp("width",$e.columnsTotalWidths,"px")("height",$e.rowHeight,"px"))},inputs:{treeStatus:"treeStatus",columns:"columns",innerWidth:"innerWidth",offsetX:"offsetX",expanded:"expanded",rowClass:"rowClass",row:"row",group:"group",isSelected:"isSelected",rowIndex:"rowIndex",displayCheck:"displayCheck",rowHeight:"rowHeight"},outputs:{activate:"activate",treeAction:"treeAction"},decls:1,vars:2,consts:[[3,"class","ngStyle",4,"ngFor","ngForOf","ngForTrackBy"],[3,"ngStyle"],["tabindex","-1",3,"row","group","expanded","isSelected","rowIndex","column","rowHeight","displayCheck","treeStatus","activate","treeAction",4,"ngFor","ngForOf","ngForTrackBy"],["tabindex","-1",3,"row","group","expanded","isSelected","rowIndex","column","rowHeight","displayCheck","treeStatus","activate","treeAction"]],template:function(ne,$e){1&ne&&r.YNc(0,Gt,2,6,"div",0),2&ne&&r.Q6J("ngForOf",$e._columnsByPin)("ngForTrackBy",$e.trackByGroups)},directives:function(){return[u.sg,u.PC,Ra]},encapsulation:2,changeDetection:0}),tt})(),gs=(()=>{class tt{constructor(ne,$e){this.cd=ne,this.differs=$e,this.rowContextmenu=new r.vpe(!1),this.groupContext={group:this.row,expanded:this.expanded,rowIndex:this.rowIndex},this.rowContext={row:this.row,expanded:this.expanded,rowIndex:this.rowIndex},this._expanded=!1,this.rowDiffer=$e.find({}).create()}set rowIndex(ne){this._rowIndex=ne,this.rowContext.rowIndex=ne,this.groupContext.rowIndex=ne,this.cd.markForCheck()}get rowIndex(){return this._rowIndex}set expanded(ne){this._expanded=ne,this.groupContext.expanded=ne,this.rowContext.expanded=ne,this.cd.markForCheck()}get expanded(){return this._expanded}ngDoCheck(){this.rowDiffer.diff(this.row)&&(this.rowContext.row=this.row,this.groupContext.group=this.row,this.cd.markForCheck())}onContextmenu(ne){this.rowContextmenu.emit({event:ne,row:this.row})}getGroupHeaderStyle(){const ne={};return ne.transform="translate3d("+this.offsetX+"px, 0px, 0px)",ne["backface-visibility"]="hidden",ne.width=this.innerWidth,ne}}return tt.\u0275fac=function(ne){return new(ne||tt)(r.Y36(r.sBO),r.Y36(r.aQg))},tt.\u0275cmp=r.Xpm({type:tt,selectors:[["datatable-row-wrapper"]],hostAttrs:[1,"datatable-row-wrapper"],hostBindings:function(ne,$e){1&ne&&r.NdJ("contextmenu",function(sn){return $e.onContextmenu(sn)})},inputs:{rowIndex:"rowIndex",expanded:"expanded",innerWidth:"innerWidth",rowDetail:"rowDetail",groupHeader:"groupHeader",offsetX:"offsetX",detailRowHeight:"detailRowHeight",row:"row",groupedRows:"groupedRows"},outputs:{rowContextmenu:"rowContextmenu"},ngContentSelectors:T,decls:3,vars:3,consts:[["class","datatable-group-header",3,"ngStyle",4,"ngIf"],[4,"ngIf"],["class","datatable-row-detail",3,"height",4,"ngIf"],[1,"datatable-group-header",3,"ngStyle"],[3,"ngTemplateOutlet","ngTemplateOutletContext"],[1,"datatable-row-detail"]],template:function(ne,$e){1&ne&&(r.F$t(),r.YNc(0,mt,2,2,"div",0),r.YNc(1,Yt,1,0,"ng-content",1),r.YNc(2,Yn,2,3,"div",2)),2&ne&&(r.Q6J("ngIf",$e.groupHeader&&$e.groupHeader.template),r.xp6(1),r.Q6J("ngIf",$e.groupHeader&&$e.groupHeader.template&&$e.expanded||!$e.groupHeader||!$e.groupHeader.template),r.xp6(1),r.Q6J("ngIf",$e.rowDetail&&$e.rowDetail.template&&$e.expanded))},directives:[u.O5,u.PC,u.tP],encapsulation:2,changeDetection:0}),tt})(),Ra=(()=>{class tt{constructor(ne,$e){this.cd=$e,this.activate=new r.vpe,this.treeAction=new r.vpe,this.isFocused=!1,this.onCheckboxChangeFn=this.onCheckboxChange.bind(this),this.activateFn=this.activate.emit.bind(this.activate),this.cellContext={onCheckboxChangeFn:this.onCheckboxChangeFn,activateFn:this.activateFn,row:this.row,group:this.group,value:this.value,column:this.column,rowHeight:this.rowHeight,isSelected:this.isSelected,rowIndex:this.rowIndex,treeStatus:this.treeStatus,onTreeAction:this.onTreeAction.bind(this)},this._element=ne.nativeElement}set group(ne){this._group=ne,this.cellContext.group=ne,this.checkValueUpdates(),this.cd.markForCheck()}get group(){return this._group}set rowHeight(ne){this._rowHeight=ne,this.cellContext.rowHeight=ne,this.checkValueUpdates(),this.cd.markForCheck()}get rowHeight(){return this._rowHeight}set isSelected(ne){this._isSelected=ne,this.cellContext.isSelected=ne,this.cd.markForCheck()}get isSelected(){return this._isSelected}set expanded(ne){this._expanded=ne,this.cellContext.expanded=ne,this.cd.markForCheck()}get expanded(){return this._expanded}set rowIndex(ne){this._rowIndex=ne,this.cellContext.rowIndex=ne,this.checkValueUpdates(),this.cd.markForCheck()}get rowIndex(){return this._rowIndex}set column(ne){this._column=ne,this.cellContext.column=ne,this.checkValueUpdates(),this.cd.markForCheck()}get column(){return this._column}set row(ne){this._row=ne,this.cellContext.row=ne,this.checkValueUpdates(),this.cd.markForCheck()}get row(){return this._row}set sorts(ne){this._sorts=ne,this.calcSortDir=this.calcSortDir(ne)}get sorts(){return this._sorts}set treeStatus(ne){this._treeStatus="collapsed"!==ne&&"expanded"!==ne&&"loading"!==ne&&"disabled"!==ne?"collapsed":ne,this.cellContext.treeStatus=this._treeStatus,this.checkValueUpdates(),this.cd.markForCheck()}get treeStatus(){return this._treeStatus}get columnCssClasses(){let ne="datatable-body-cell";if(this.column.cellClass)if("string"==typeof this.column.cellClass)ne+=" "+this.column.cellClass;else if("function"==typeof this.column.cellClass){const $e=this.column.cellClass({row:this.row,group:this.group,column:this.column,value:this.value,rowHeight:this.rowHeight});if("string"==typeof $e)ne+=" "+$e;else if("object"==typeof $e){const Pt=Object.keys($e);for(const sn of Pt)!0===$e[sn]&&(ne+=` ${sn}`)}}return this.sortDir||(ne+=" sort-active"),this.isFocused&&(ne+=" active"),this.sortDir===qo.asc&&(ne+=" sort-asc"),this.sortDir===qo.desc&&(ne+=" sort-desc"),ne}get width(){return this.column.width}get minWidth(){return this.column.minWidth}get maxWidth(){return this.column.maxWidth}get height(){const ne=this.rowHeight;return isNaN(ne)?ne:ne+"px"}ngDoCheck(){this.checkValueUpdates()}ngOnDestroy(){this.cellTemplate&&this.cellTemplate.clear()}checkValueUpdates(){let ne="";if(this.row&&this.column){const $e=this.column.$$valueGetter(this.row,this.column.prop),Pt=this.column.pipe;Pt?ne=Pt.transform($e):void 0!==ne&&(ne=$e)}else ne="";this.value!==ne&&(this.value=ne,this.cellContext.value=ne,this.sanitizedValue=null!=ne?this.stripHtml(ne):ne,this.cd.markForCheck())}onFocus(){this.isFocused=!0}onBlur(){this.isFocused=!1}onClick(ne){this.activate.emit({type:"click",event:ne,row:this.row,group:this.group,rowHeight:this.rowHeight,column:this.column,value:this.value,cellElement:this._element})}onDblClick(ne){this.activate.emit({type:"dblclick",event:ne,row:this.row,group:this.group,rowHeight:this.rowHeight,column:this.column,value:this.value,cellElement:this._element})}onKeyDown(ne){const $e=ne.keyCode;($e===Ao.return||$e===Ao.down||$e===Ao.up||$e===Ao.left||$e===Ao.right)&&ne.target===this._element&&(ne.preventDefault(),ne.stopPropagation(),this.activate.emit({type:"keydown",event:ne,row:this.row,group:this.group,rowHeight:this.rowHeight,column:this.column,value:this.value,cellElement:this._element}))}onCheckboxChange(ne){this.activate.emit({type:"checkbox",event:ne,row:this.row,group:this.group,rowHeight:this.rowHeight,column:this.column,value:this.value,cellElement:this._element,treeStatus:"collapsed"})}calcSortDir(ne){if(!ne)return;const $e=ne.find(Pt=>Pt.prop===this.column.prop);return $e?$e.dir:void 0}stripHtml(ne){return ne.replace?ne.replace(/<\/?[^>]+(>|$)/g,""):ne}onTreeAction(){this.treeAction.emit(this.row)}calcLeftMargin(ne,$e){return ne.isTreeColumn?$e.level*(null!=ne.treeLevelIndent?ne.treeLevelIndent:50):0}}return tt.\u0275fac=function(ne){return new(ne||tt)(r.Y36(r.SBq),r.Y36(r.sBO))},tt.\u0275cmp=r.Xpm({type:tt,selectors:[["datatable-body-cell"]],viewQuery:function(ne,$e){if(1&ne&&r.Gf(Hr,7,r.s_b),2&ne){let Pt;r.iGM(Pt=r.CRH())&&($e.cellTemplate=Pt.first)}},hostVars:10,hostBindings:function(ne,$e){1&ne&&r.NdJ("focus",function(){return $e.onFocus()})("blur",function(){return $e.onBlur()})("click",function(sn){return $e.onClick(sn)})("dblclick",function(sn){return $e.onDblClick(sn)})("keydown",function(sn){return $e.onKeyDown(sn)}),2&ne&&(r.Tol($e.columnCssClasses),r.Udp("width",$e.width,"px")("min-width",$e.minWidth,"px")("max-width",$e.maxWidth,"px")("height",$e.height))},inputs:{group:"group",rowHeight:"rowHeight",isSelected:"isSelected",expanded:"expanded",rowIndex:"rowIndex",column:"column",row:"row",sorts:"sorts",treeStatus:"treeStatus",displayCheck:"displayCheck"},outputs:{activate:"activate",treeAction:"treeAction"},decls:5,vars:6,consts:[[1,"datatable-body-cell-label"],["class","datatable-checkbox",4,"ngIf"],[4,"ngIf"],[3,"title","innerHTML",4,"ngIf"],[1,"datatable-checkbox"],["type","checkbox",3,"checked","click"],["class","datatable-tree-button",3,"disabled","click",4,"ngIf"],[1,"datatable-tree-button",3,"disabled","click"],["class","icon datatable-icon-collapse",4,"ngIf"],["class","icon datatable-icon-up",4,"ngIf"],["class","icon datatable-icon-down",4,"ngIf"],[1,"icon","datatable-icon-collapse"],[1,"icon","datatable-icon-up"],[1,"icon","datatable-icon-down"],[3,"ngTemplateOutlet","ngTemplateOutletContext"],[3,"title","innerHTML"],["cellTemplate",""]],template:function(ne,$e){1&ne&&(r.TgZ(0,"div",0),r.YNc(1,ci,2,1,"label",1),r.YNc(2,Ur,3,2,"ng-container",2),r.YNc(3,di,1,2,"span",3),r.YNc(4,Hi,2,2,void 0,2),r.qZA()),2&ne&&(r.Udp("margin-left",$e.calcLeftMargin($e.column,$e.row),"px"),r.xp6(1),r.Q6J("ngIf",$e.column.checkboxable&&(!$e.displayCheck||$e.displayCheck($e.row,$e.column,$e.value))),r.xp6(1),r.Q6J("ngIf",$e.column.isTreeColumn),r.xp6(1),r.Q6J("ngIf",!$e.column.cellTemplate),r.xp6(1),r.Q6J("ngIf",$e.column.cellTemplate))},directives:[u.O5,u.tP],encapsulation:2,changeDetection:0}),tt})();function pl(tt,on,ne){const $e=ne(on,tt);return $e>-1?tt.splice($e,1):tt.push(on),tt}let Fo=(()=>{class tt{constructor(){this.activate=new r.vpe,this.select=new r.vpe}selectRow(ne,$e,Pt){if(!this.selectEnabled)return;const sn=this.selectionType===kn.checkbox,fi=this.selectionType===kn.multiClick;let Oi=[];Oi=this.selectionType===kn.multi||sn||fi?ne.shiftKey?function(tt,on,ne,$e,Pt){const sn=ne<$e;for(let ei=0;ei<on.length;ei++){const fi=on[ei],Oi=ei>=$e&&ei<=ne,os=ei<=$e&&ei>=ne;let Ro={start:0,end:0};Ro=sn?{start:ne,end:$e}:{start:$e,end:ne+1},(sn&&os||!sn&&Oi)&&ei>=Ro.start&&ei<=Ro.end&&tt.push(fi)}return tt}([],this.rows,$e,this.prevIndex,this.getRowSelectedIdx.bind(this)):pl(ne.ctrlKey||ne.metaKey||fi||sn?[...this.selected]:[],Pt,this.getRowSelectedIdx.bind(this)):pl([],Pt,this.getRowSelectedIdx.bind(this)),"function"==typeof this.selectCheck&&(Oi=Oi.filter(this.selectCheck.bind(this))),this.selected.splice(0,this.selected.length),this.selected.push(...Oi),this.prevIndex=$e,this.select.emit({selected:Oi})}onActivate(ne,$e){const{type:Pt,event:sn,row:ei}=ne,fi=this.selectionType===kn.checkbox;!fi&&("click"===Pt||"dblclick"===Pt)||fi&&"checkbox"===Pt?this.selectRow(sn,$e,ei):"keydown"===Pt&&(sn.keyCode===Ao.return?this.selectRow(sn,$e,ei):this.onKeyboardFocus(ne)),this.activate.emit(ne)}onKeyboardFocus(ne){const{keyCode:$e}=ne.event;if($e===Ao.up||$e===Ao.down||$e===Ao.right||$e===Ao.left){const sn=this.selectionType===kn.cell;ne.cellElement&&sn?sn&&this.focusCell(ne.cellElement,ne.rowElement,$e,ne.cellIndex):this.focusRow(ne.rowElement,$e)}}focusRow(ne,$e){const Pt=this.getPrevNextRow(ne,$e);Pt&&Pt.focus()}getPrevNextRow(ne,$e){const Pt=ne.parentElement;if(Pt){let sn;if($e===Ao.up?sn=Pt.previousElementSibling:$e===Ao.down&&(sn=Pt.nextElementSibling),sn&&sn.children.length)return sn.children[0]}}focusCell(ne,$e,Pt,sn){let ei;if(Pt===Ao.left)ei=ne.previousElementSibling;else if(Pt===Ao.right)ei=ne.nextElementSibling;else if(Pt===Ao.up||Pt===Ao.down){const fi=this.getPrevNextRow($e,Pt);if(fi){const Oi=fi.getElementsByClassName("datatable-body-cell");Oi.length&&(ei=Oi[sn])}}ei&&ei.focus()}getRowSelected(ne){return this.getRowSelectedIdx(ne,this.selected)>-1}getRowSelectedIdx(ne,$e){if(!$e||!$e.length)return-1;const Pt=this.rowIdentity(ne);return $e.findIndex(sn=>this.rowIdentity(sn)===Pt)}}return tt.\u0275fac=function(ne){return new(ne||tt)},tt.\u0275cmp=r.Xpm({type:tt,selectors:[["datatable-selection"]],inputs:{rows:"rows",selected:"selected",selectEnabled:"selectEnabled",selectionType:"selectionType",rowIdentity:"rowIdentity",selectCheck:"selectCheck"},outputs:{activate:"activate",select:"select"},ngContentSelectors:T,decls:1,vars:0,template:function(ne,$e){1&ne&&(r.F$t(),r.Hsn(0))},encapsulation:2,changeDetection:0}),tt})();function Eo(tt){const on=tt.filter(ne=>!!ne);return!on.length||on.some(ne=>"number"!=typeof ne)?null:on.reduce((ne,$e)=>ne+$e)}function ks(tt){return null}let ms=(()=>{class tt{constructor(){this.summaryRow={}}ngOnChanges(){!this.columns||!this.rows||(this.updateInternalColumns(),this.updateValues())}updateInternalColumns(){this._internalColumns=this.columns.map(ne=>Object.assign(Object.assign({},ne),{cellTemplate:ne.summaryTemplate}))}updateValues(){this.summaryRow={},this.columns.filter(ne=>!ne.summaryTemplate).forEach(ne=>{const $e=this.rows.map(sn=>sn[ne.prop]),Pt=this.getSummaryFunction(ne);this.summaryRow[ne.prop]=ne.pipe?ne.pipe.transform(Pt($e)):Pt($e)})}getSummaryFunction(ne){return void 0===ne.summaryFunc?Eo:null===ne.summaryFunc?ks:ne.summaryFunc}}return tt.\u0275fac=function(ne){return new(ne||tt)},tt.\u0275cmp=r.Xpm({type:tt,selectors:[["datatable-summary-row"]],hostAttrs:[1,"datatable-summary-row"],inputs:{rows:"rows",columns:"columns",rowHeight:"rowHeight",offsetX:"offsetX",innerWidth:"innerWidth"},features:[r.TTD],decls:1,vars:1,consts:[["tabindex","-1",3,"innerWidth","offsetX","columns","rowHeight","row","rowIndex",4,"ngIf"],["tabindex","-1",3,"innerWidth","offsetX","columns","rowHeight","row","rowIndex"]],template:function(ne,$e){1&ne&&r.YNc(0,Br,1,6,"datatable-body-row",0),2&ne&&r.Q6J("ngIf",$e.summaryRow&&$e._internalColumns)},directives:[u.O5,ls],encapsulation:2}),tt})(),Co=(()=>{class tt{static forRoot(ne){return{ngModule:tt,providers:[{provide:"configuration",useValue:ne}]}}}return tt.\u0275fac=function(ne){return new(ne||tt)},tt.\u0275mod=r.oAB({type:tt}),tt.\u0275inj=r.cJS({providers:[On,Wt,Jn],imports:[[u.ez]]}),tt})();"undefined"!=typeof document&&!document.elementsFromPoint&&(document.elementsFromPoint=function(tt,on){const ne=[],$e=[];let Pt,sn,ei;for(;(Pt=document.elementFromPoint(tt,on))&&-1===ne.indexOf(Pt)&&null!=Pt;)ne.push(Pt),$e.push({value:Pt.style.getPropertyValue("pointer-events"),priority:Pt.style.getPropertyPriority("pointer-events")}),Pt.style.setProperty("pointer-events","none","important");for(sn=$e.length;ei=$e[--sn];)ne[sn].style.setProperty("pointer-events",ei.value?ei.value:"",ei.priority);return ne})},67506:v=>{"use strict";function S(u,p,f){u instanceof RegExp&&(u=i(u,f)),p instanceof RegExp&&(p=i(p,f));var e=r(u,p,f);return e&&{start:e[0],end:e[1],pre:f.slice(0,e[0]),body:f.slice(e[0]+u.length,e[1]),post:f.slice(e[1]+p.length)}}function i(u,p){var f=p.match(u);return f?f[0]:null}function r(u,p,f){var e,_,y,T,M,R=f.indexOf(u),F=f.indexOf(p,R+1),Z=R;if(R>=0&&F>0){if(u===p)return[R,F];for(e=[],y=f.length;Z>=0&&!M;)Z==R?(e.push(Z),R=f.indexOf(u,Z+1)):1==e.length?M=[e.pop(),F]:((_=e.pop())<y&&(y=_,T=F),F=f.indexOf(p,Z+1)),Z=R<F&&R>=0?R:F;e.length&&(M=[y,T])}return M}v.exports=S,S.range=r},96434:(v,S)=>{"use strict";S.byteLength=function(J){var Q=_(J),ue=Q[1];return 3*(Q[0]+ue)/4-ue},S.toByteArray=function(J){var Q,oe,ee=_(J),ue=ee[0],ae=ee[1],$=new u(function(J,Q,ee){return 3*(Q+ee)/4-ee}(0,ue,ae)),se=0,ve=ae>0?ue-4:ue;for(oe=0;oe<ve;oe+=4)Q=r[J.charCodeAt(oe)]<<18|r[J.charCodeAt(oe+1)]<<12|r[J.charCodeAt(oe+2)]<<6|r[J.charCodeAt(oe+3)],$[se++]=Q>>16&255,$[se++]=Q>>8&255,$[se++]=255&Q;return 2===ae&&(Q=r[J.charCodeAt(oe)]<<2|r[J.charCodeAt(oe+1)]>>4,$[se++]=255&Q),1===ae&&(Q=r[J.charCodeAt(oe)]<<10|r[J.charCodeAt(oe+1)]<<4|r[J.charCodeAt(oe+2)]>>2,$[se++]=Q>>8&255,$[se++]=255&Q),$},S.fromByteArray=function(J){for(var Q,ee=J.length,ue=ee%3,ae=[],$=16383,se=0,ve=ee-ue;se<ve;se+=$)ae.push(F(J,se,se+$>ve?ve:se+$));return 1===ue?ae.push(i[(Q=J[ee-1])>>2]+i[Q<<4&63]+"=="):2===ue&&ae.push(i[(Q=(J[ee-2]<<8)+J[ee-1])>>10]+i[Q>>4&63]+i[Q<<2&63]+"="),ae.join("")};for(var i=[],r=[],u="undefined"!=typeof Uint8Array?Uint8Array:Array,p="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/",f=0,e=p.length;f<e;++f)i[f]=p[f],r[p.charCodeAt(f)]=f;function _(J){var Q=J.length;if(Q%4>0)throw new Error("Invalid string. Length must be a multiple of 4");var ee=J.indexOf("=");return-1===ee&&(ee=Q),[ee,ee===Q?0:4-ee%4]}function R(J){return i[J>>18&63]+i[J>>12&63]+i[J>>6&63]+i[63&J]}function F(J,Q,ee){for(var ae=[],$=Q;$<ee;$+=3)ae.push(R((J[$]<<16&16711680)+(J[$+1]<<8&65280)+(255&J[$+2])));return ae.join("")}r["-".charCodeAt(0)]=62,r["_".charCodeAt(0)]=63},33512:(v,S,i)=>{var r=i(2665),u=i(67506);v.exports=function(se){return se?("{}"===se.substr(0,2)&&(se="\\{\\}"+se.substr(2)),$(function(se){return se.split("\\\\").join(p).split("\\{").join(f).split("\\}").join(e).split("\\,").join(_).split("\\.").join(y)}(se),!0).map(R)):[]};var p="\0SLASH"+Math.random()+"\0",f="\0OPEN"+Math.random()+"\0",e="\0CLOSE"+Math.random()+"\0",_="\0COMMA"+Math.random()+"\0",y="\0PERIOD"+Math.random()+"\0";function T(se){return parseInt(se,10)==se?parseInt(se,10):se.charCodeAt(0)}function R(se){return se.split(p).join("\\").split(f).join("{").split(e).join("}").split(_).join(",").split(y).join(".")}function F(se){if(!se)return[""];var ve=[],oe=u("{","}",se);if(!oe)return se.split(",");var me=oe.body,Oe=oe.post,ce=oe.pre.split(",");ce[ce.length-1]+="{"+me+"}";var dt=F(Oe);return Oe.length&&(ce[ce.length-1]+=dt.shift(),ce.push.apply(ce,dt)),ve.push.apply(ve,ce),ve}function Q(se){return"{"+se+"}"}function ee(se){return/^-?0\d/.test(se)}function ue(se,ve){return se<=ve}function ae(se,ve){return se>=ve}function $(se,ve){var oe=[],he=u("{","}",se);if(!he||/\$$/.test(he.pre))return[se];var ze,me=/^-?\d+\.\.-?\d+(?:\.\.-?\d+)?$/.test(he.body),Oe=/^[a-zA-Z]\.\.[a-zA-Z](?:\.\.-?\d+)?$/.test(he.body),ce=me||Oe,dt=he.body.indexOf(",")>=0;if(!ce&&!dt)return he.post.match(/,.*\}/)?$(se=he.pre+"{"+he.body+e+he.post):[se];if(ce)ze=he.body.split(/\.\./);else if(1===(ze=F(he.body)).length&&1===(ze=$(ze[0],!1).map(Q)).length)return(je=he.post.length?$(he.post,!1):[""]).map(function(ci){return he.pre+ze[0]+ci});var Ie,Ye=he.pre,je=he.post.length?$(he.post,!1):[""];if(ce){var Ve=T(ze[0]),He=T(ze[1]),Zt=Math.max(ze[0].length,ze[1].length),st=3==ze.length?Math.abs(T(ze[2])):1,en=ue;He<Ve&&(st*=-1,en=ae);var Gt=ze.some(ee);Ie=[];for(var Ut=Ve;en(Ut,He);Ut+=st){var Bt;if(Oe)"\\"===(Bt=String.fromCharCode(Ut))&&(Bt="");else if(Bt=String(Ut),Gt){var mt=Zt-Bt.length;if(mt>0){var Yt=new Array(mt+1).join("0");Bt=Ut<0?"-"+Yt+Bt.slice(1):Yt+Bt}}Ie.push(Bt)}}else Ie=r(ze,function(Hr){return $(Hr,!1)});for(var Dt=0;Dt<Ie.length;Dt++)for(var zt=0;zt<je.length;zt++){var Yn=Ye+Ie[Dt]+je[zt];(!ve||ce||Yn)&&oe.push(Yn)}return oe}},19568:(v,S,i)=>{"use strict";var r=i(18540),u=i(60044),p=u(r("String.prototype.indexOf"));v.exports=function(e,_){var y=r(e,!!_);return"function"==typeof y&&p(e,".prototype.")>-1?u(y):y}},60044:(v,S,i)=>{"use strict";var r=i(75396),u=i(18540),p=u("%Function.prototype.apply%"),f=u("%Function.prototype.call%"),e=u("%Reflect.apply%",!0)||r.call(f,p),_=u("%Object.getOwnPropertyDescriptor%",!0),y=u("%Object.defineProperty%",!0),T=u("%Math.max%");if(y)try{y({},"a",{value:1})}catch(R){y=null}v.exports=function(F){var Z=e(r,f,arguments);if(_&&y){var J=_(Z,"length");J.configurable&&y(Z,"length",{value:1+T(0,F.length-(arguments.length-1))})}return Z};var M=function(){return e(r,p,arguments)};y?y(v.exports,"apply",{value:M}):v.exports.apply=M},72318:v=>{var S=!("undefined"==typeof window||!window.document||!window.document.createElement);v.exports=S},6823:function(v,S,i){v.exports=function(r){"use strict";r=r&&r.hasOwnProperty("default")?r.default:r;var f={aliceblue:[240,248,255],antiquewhite:[250,235,215],aqua:[0,255,255],aquamarine:[127,255,212],azure:[240,255,255],beige:[245,245,220],bisque:[255,228,196],black:[0,0,0],blanchedalmond:[255,235,205],blue:[0,0,255],blueviolet:[138,43,226],brown:[165,42,42],burlywood:[222,184,135],cadetblue:[95,158,160],chartreuse:[127,255,0],chocolate:[210,105,30],coral:[255,127,80],cornflowerblue:[100,149,237],cornsilk:[255,248,220],crimson:[220,20,60],cyan:[0,255,255],darkblue:[0,0,139],darkcyan:[0,139,139],darkgoldenrod:[184,134,11],darkgray:[169,169,169],darkgreen:[0,100,0],darkgrey:[169,169,169],darkkhaki:[189,183,107],darkmagenta:[139,0,139],darkolivegreen:[85,107,47],darkorange:[255,140,0],darkorchid:[153,50,204],darkred:[139,0,0],darksalmon:[233,150,122],darkseagreen:[143,188,143],darkslateblue:[72,61,139],darkslategray:[47,79,79],darkslategrey:[47,79,79],darkturquoise:[0,206,209],darkviolet:[148,0,211],deeppink:[255,20,147],deepskyblue:[0,191,255],dimgray:[105,105,105],dimgrey:[105,105,105],dodgerblue:[30,144,255],firebrick:[178,34,34],floralwhite:[255,250,240],forestgreen:[34,139,34],fuchsia:[255,0,255],gainsboro:[220,220,220],ghostwhite:[248,248,255],gold:[255,215,0],goldenrod:[218,165,32],gray:[128,128,128],green:[0,128,0],greenyellow:[173,255,47],grey:[128,128,128],honeydew:[240,255,240],hotpink:[255,105,180],indianred:[205,92,92],indigo:[75,0,130],ivory:[255,255,240],khaki:[240,230,140],lavender:[230,230,250],lavenderblush:[255,240,245],lawngreen:[124,252,0],lemonchiffon:[255,250,205],lightblue:[173,216,230],lightcoral:[240,128,128],lightcyan:[224,255,255],lightgoldenrodyellow:[250,250,210],lightgray:[211,211,211],lightgreen:[144,238,144],lightgrey:[211,211,211],lightpink:[255,182,193],lightsalmon:[255,160,122],lightseagreen:[32,178,170],lightskyblue:[135,206,250],lightslategray:[119,136,153],lightslategrey:[119,136,153],lightsteelblue:[176,196,222],lightyellow:[255,255,224],lime:[0,255,0],limegreen:[50,205,50],linen:[250,240,230],magenta:[255,0,255],maroon:[128,0,0],mediumaquamarine:[102,205,170],mediumblue:[0,0,205],mediumorchid:[186,85,211],mediumpurple:[147,112,219],mediumseagreen:[60,179,113],mediumslateblue:[123,104,238],mediumspringgreen:[0,250,154],mediumturquoise:[72,209,204],mediumvioletred:[199,21,133],midnightblue:[25,25,112],mintcream:[245,255,250],mistyrose:[255,228,225],moccasin:[255,228,181],navajowhite:[255,222,173],navy:[0,0,128],oldlace:[253,245,230],olive:[128,128,0],olivedrab:[107,142,35],orange:[255,165,0],orangered:[255,69,0],orchid:[218,112,214],palegoldenrod:[238,232,170],palegreen:[152,251,152],paleturquoise:[175,238,238],palevioletred:[219,112,147],papayawhip:[255,239,213],peachpuff:[255,218,185],peru:[205,133,63],pink:[255,192,203],plum:[221,160,221],powderblue:[176,224,230],purple:[128,0,128],rebeccapurple:[102,51,153],red:[255,0,0],rosybrown:[188,143,143],royalblue:[65,105,225],saddlebrown:[139,69,19],salmon:[250,128,114],sandybrown:[244,164,96],seagreen:[46,139,87],seashell:[255,245,238],sienna:[160,82,45],silver:[192,192,192],skyblue:[135,206,235],slateblue:[106,90,205],slategray:[112,128,144],slategrey:[112,128,144],snow:[255,250,250],springgreen:[0,255,127],steelblue:[70,130,180],tan:[210,180,140],teal:[0,128,128],thistle:[216,191,216],tomato:[255,99,71],turquoise:[64,224,208],violet:[238,130,238],wheat:[245,222,179],white:[255,255,255],whitesmoke:[245,245,245],yellow:[255,255,0],yellowgreen:[154,205,50]},e=function(h,E){return h(E={exports:{}},E.exports),E.exports}(function(h){var E={};for(var N in f)f.hasOwnProperty(N)&&(E[f[N]]=N);var k=h.exports={rgb:{channels:3,labels:"rgb"},hsl:{channels:3,labels:"hsl"},hsv:{channels:3,labels:"hsv"},hwb:{channels:3,labels:"hwb"},cmyk:{channels:4,labels:"cmyk"},xyz:{channels:3,labels:"xyz"},lab:{channels:3,labels:"lab"},lch:{channels:3,labels:"lch"},hex:{channels:1,labels:["hex"]},keyword:{channels:1,labels:["keyword"]},ansi16:{channels:1,labels:["ansi16"]},ansi256:{channels:1,labels:["ansi256"]},hcg:{channels:3,labels:["h","c","g"]},apple:{channels:3,labels:["r16","g16","b16"]},gray:{channels:1,labels:["gray"]}};for(var K in k)if(k.hasOwnProperty(K)){if(!("channels"in k[K]))throw new Error("missing channels property: "+K);if(!("labels"in k[K]))throw new Error("missing channel labels property: "+K);if(k[K].labels.length!==k[K].channels)throw new Error("channel and label counts mismatch: "+K);var de=k[K].channels,be=k[K].labels;delete k[K].channels,delete k[K].labels,Object.defineProperty(k[K],"channels",{value:de}),Object.defineProperty(k[K],"labels",{value:be})}function Ue(we,Xe){return Math.pow(we[0]-Xe[0],2)+Math.pow(we[1]-Xe[1],2)+Math.pow(we[2]-Xe[2],2)}k.rgb.hsl=function(we){var sr,Ni,Xe=we[0]/255,gt=we[1]/255,vt=we[2]/255,Jt=Math.min(Xe,gt,vt),Pn=Math.max(Xe,gt,vt),Rn=Pn-Jt;return Pn===Jt?sr=0:Xe===Pn?sr=(gt-vt)/Rn:gt===Pn?sr=2+(vt-Xe)/Rn:vt===Pn&&(sr=4+(Xe-gt)/Rn),(sr=Math.min(60*sr,360))<0&&(sr+=360),Ni=(Jt+Pn)/2,[sr,100*(Pn===Jt?0:Ni<=.5?Rn/(Pn+Jt):Rn/(2-Pn-Jt)),100*Ni]},k.rgb.hsv=function(we){var Xe,gt,vt,Jt,Pn,Rn=we[0]/255,sr=we[1]/255,jr=we[2]/255,Ni=Math.max(Rn,sr,jr),Vo=Ni-Math.min(Rn,sr,jr),$o=function(Vs){return(Ni-Vs)/6/Vo+.5};return 0===Vo?Jt=Pn=0:(Pn=Vo/Ni,Xe=$o(Rn),gt=$o(sr),vt=$o(jr),Rn===Ni?Jt=vt-gt:sr===Ni?Jt=1/3+Xe-vt:jr===Ni&&(Jt=2/3+gt-Xe),Jt<0?Jt+=1:Jt>1&&(Jt-=1)),[360*Jt,100*Pn,100*Ni]},k.rgb.hwb=function(we){var Xe=we[0],gt=we[1],vt=we[2];return[k.rgb.hsl(we)[0],1/255*Math.min(Xe,Math.min(gt,vt))*100,100*(vt=1-1/255*Math.max(Xe,Math.max(gt,vt)))]},k.rgb.cmyk=function(we){var sr,Xe=we[0]/255,gt=we[1]/255,vt=we[2]/255;return[100*((1-Xe-(sr=Math.min(1-Xe,1-gt,1-vt)))/(1-sr)||0),100*((1-gt-sr)/(1-sr)||0),100*((1-vt-sr)/(1-sr)||0),100*sr]},k.rgb.keyword=function(we){var Xe=E[we];if(Xe)return Xe;var vt,gt=1/0;for(var Jt in f)if(f.hasOwnProperty(Jt)){var Rn=Ue(we,f[Jt]);Rn<gt&&(gt=Rn,vt=Jt)}return vt},k.keyword.rgb=function(we){return f[we]},k.rgb.xyz=function(we){var Xe=we[0]/255,gt=we[1]/255,vt=we[2]/255;return[100*(.4124*(Xe=Xe>.04045?Math.pow((Xe+.055)/1.055,2.4):Xe/12.92)+.3576*(gt=gt>.04045?Math.pow((gt+.055)/1.055,2.4):gt/12.92)+.1805*(vt=vt>.04045?Math.pow((vt+.055)/1.055,2.4):vt/12.92)),100*(.2126*Xe+.7152*gt+.0722*vt),100*(.0193*Xe+.1192*gt+.9505*vt)]},k.rgb.lab=function(we){var Xe=k.rgb.xyz(we),gt=Xe[0],vt=Xe[1],Jt=Xe[2];return vt/=100,Jt/=108.883,gt=(gt/=95.047)>.008856?Math.pow(gt,1/3):7.787*gt+16/116,[116*(vt=vt>.008856?Math.pow(vt,1/3):7.787*vt+16/116)-16,500*(gt-vt),200*(vt-(Jt=Jt>.008856?Math.pow(Jt,1/3):7.787*Jt+16/116))]},k.hsl.rgb=function(we){var Jt,Pn,Rn,sr,jr,Xe=we[0]/360,gt=we[1]/100,vt=we[2]/100;if(0===gt)return[jr=255*vt,jr,jr];Jt=2*vt-(Pn=vt<.5?vt*(1+gt):vt+gt-vt*gt),sr=[0,0,0];for(var Ni=0;Ni<3;Ni++)(Rn=Xe+1/3*-(Ni-1))<0&&Rn++,Rn>1&&Rn--,sr[Ni]=255*(jr=6*Rn<1?Jt+6*(Pn-Jt)*Rn:2*Rn<1?Pn:3*Rn<2?Jt+(Pn-Jt)*(2/3-Rn)*6:Jt);return sr},k.hsl.hsv=function(we){var Xe=we[0],gt=we[1]/100,vt=we[2]/100,Jt=gt,Pn=Math.max(vt,.01);return gt*=(vt*=2)<=1?vt:2-vt,Jt*=Pn<=1?Pn:2-Pn,[Xe,100*(0===vt?2*Jt/(Pn+Jt):2*gt/(vt+gt)),(vt+gt)/2*100]},k.hsv.rgb=function(we){var Xe=we[0]/60,gt=we[1]/100,vt=we[2]/100,Jt=Math.floor(Xe)%6,Pn=Xe-Math.floor(Xe),Rn=255*vt*(1-gt),sr=255*vt*(1-gt*Pn),jr=255*vt*(1-gt*(1-Pn));switch(vt*=255,Jt){case 0:return[vt,jr,Rn];case 1:return[sr,vt,Rn];case 2:return[Rn,vt,jr];case 3:return[Rn,sr,vt];case 4:return[jr,Rn,vt];case 5:return[vt,Rn,sr]}},k.hsv.hsl=function(we){var Pn,Rn,sr,Xe=we[0],gt=we[1]/100,vt=we[2]/100,Jt=Math.max(vt,.01);return sr=(2-gt)*vt,Rn=gt*Jt,[Xe,100*(Rn=(Rn/=(Pn=(2-gt)*Jt)<=1?Pn:2-Pn)||0),100*(sr/=2)]},k.hwb.rgb=function(we){var Pn,Rn,sr,jr,Ni,Vo,$o,Xe=we[0]/360,gt=we[1]/100,vt=we[2]/100,Jt=gt+vt;switch(Jt>1&&(gt/=Jt,vt/=Jt),sr=6*Xe-(Pn=Math.floor(6*Xe)),0!=(1&Pn)&&(sr=1-sr),jr=gt+sr*((Rn=1-vt)-gt),Pn){default:case 6:case 0:Ni=Rn,Vo=jr,$o=gt;break;case 1:Ni=jr,Vo=Rn,$o=gt;break;case 2:Ni=gt,Vo=Rn,$o=jr;break;case 3:Ni=gt,Vo=jr,$o=Rn;break;case 4:Ni=jr,Vo=gt,$o=Rn;break;case 5:Ni=Rn,Vo=gt,$o=jr}return[255*Ni,255*Vo,255*$o]},k.cmyk.rgb=function(we){var gt=we[1]/100,vt=we[2]/100,Jt=we[3]/100;return[255*(1-Math.min(1,we[0]/100*(1-Jt)+Jt)),255*(1-Math.min(1,gt*(1-Jt)+Jt)),255*(1-Math.min(1,vt*(1-Jt)+Jt))]},k.xyz.rgb=function(we){var Jt,Pn,Rn,Xe=we[0]/100,gt=we[1]/100,vt=we[2]/100;return Pn=-.9689*Xe+1.8758*gt+.0415*vt,Rn=.0557*Xe+-.204*gt+1.057*vt,Jt=(Jt=3.2406*Xe+-1.5372*gt+-.4986*vt)>.0031308?1.055*Math.pow(Jt,1/2.4)-.055:12.92*Jt,Pn=Pn>.0031308?1.055*Math.pow(Pn,1/2.4)-.055:12.92*Pn,Rn=Rn>.0031308?1.055*Math.pow(Rn,1/2.4)-.055:12.92*Rn,[255*(Jt=Math.min(Math.max(0,Jt),1)),255*(Pn=Math.min(Math.max(0,Pn),1)),255*(Rn=Math.min(Math.max(0,Rn),1))]},k.xyz.lab=function(we){var Xe=we[0],gt=we[1],vt=we[2];return gt/=100,vt/=108.883,Xe=(Xe/=95.047)>.008856?Math.pow(Xe,1/3):7.787*Xe+16/116,[116*(gt=gt>.008856?Math.pow(gt,1/3):7.787*gt+16/116)-16,500*(Xe-gt),200*(gt-(vt=vt>.008856?Math.pow(vt,1/3):7.787*vt+16/116))]},k.lab.xyz=function(we){var Jt,Pn,Rn;Jt=we[1]/500+(Pn=(we[0]+16)/116),Rn=Pn-we[2]/200;var sr=Math.pow(Pn,3),jr=Math.pow(Jt,3),Ni=Math.pow(Rn,3);return Pn=sr>.008856?sr:(Pn-16/116)/7.787,Jt=jr>.008856?jr:(Jt-16/116)/7.787,Rn=Ni>.008856?Ni:(Rn-16/116)/7.787,[Jt*=95.047,Pn*=100,Rn*=108.883]},k.lab.lch=function(we){var Pn,Xe=we[0],gt=we[1],vt=we[2];return(Pn=360*Math.atan2(vt,gt)/2/Math.PI)<0&&(Pn+=360),[Xe,Math.sqrt(gt*gt+vt*vt),Pn]},k.lch.lab=function(we){var Rn,gt=we[1];return Rn=we[2]/360*2*Math.PI,[we[0],gt*Math.cos(Rn),gt*Math.sin(Rn)]},k.rgb.ansi16=function(we){var Xe=we[0],gt=we[1],vt=we[2],Jt=1 in arguments?arguments[1]:k.rgb.hsv(we)[2];if(0===(Jt=Math.round(Jt/50)))return 30;var Pn=30+(Math.round(vt/255)<<2|Math.round(gt/255)<<1|Math.round(Xe/255));return 2===Jt&&(Pn+=60),Pn},k.hsv.ansi16=function(we){return k.rgb.ansi16(k.hsv.rgb(we),we[2])},k.rgb.ansi256=function(we){var Xe=we[0],gt=we[1],vt=we[2];return Xe===gt&&gt===vt?Xe<8?16:Xe>248?231:Math.round((Xe-8)/247*24)+232:16+36*Math.round(Xe/255*5)+6*Math.round(gt/255*5)+Math.round(vt/255*5)},k.ansi16.rgb=function(we){var Xe=we%10;if(0===Xe||7===Xe)return we>50&&(Xe+=3.5),[Xe=Xe/10.5*255,Xe,Xe];var gt=.5*(1+~~(we>50));return[(1&Xe)*gt*255,(Xe>>1&1)*gt*255,(Xe>>2&1)*gt*255]},k.ansi256.rgb=function(we){if(we>=232){var Xe=10*(we-232)+8;return[Xe,Xe,Xe]}var gt;return we-=16,[Math.floor(we/36)/5*255,Math.floor((gt=we%36)/6)/5*255,gt%6/5*255]},k.rgb.hex=function(we){var gt=(((255&Math.round(we[0]))<<16)+((255&Math.round(we[1]))<<8)+(255&Math.round(we[2]))).toString(16).toUpperCase();return"000000".substring(gt.length)+gt},k.hex.rgb=function(we){var Xe=we.toString(16).match(/[a-f0-9]{6}|[a-f0-9]{3}/i);if(!Xe)return[0,0,0];var gt=Xe[0];3===Xe[0].length&&(gt=gt.split("").map(function(sr){return sr+sr}).join(""));var vt=parseInt(gt,16);return[vt>>16&255,vt>>8&255,255&vt]},k.rgb.hcg=function(we){var jr,Xe=we[0]/255,gt=we[1]/255,vt=we[2]/255,Jt=Math.max(Math.max(Xe,gt),vt),Pn=Math.min(Math.min(Xe,gt),vt),Rn=Jt-Pn;return jr=Rn<=0?0:Jt===Xe?(gt-vt)/Rn%6:Jt===gt?2+(vt-Xe)/Rn:4+(Xe-gt)/Rn+4,jr/=6,[360*(jr%=1),100*Rn,100*(Rn<1?Pn/(1-Rn):0)]},k.hsl.hcg=function(we){var vt,Xe=we[1]/100,gt=we[2]/100,Jt=0;return(vt=gt<.5?2*Xe*gt:2*Xe*(1-gt))<1&&(Jt=(gt-.5*vt)/(1-vt)),[we[0],100*vt,100*Jt]},k.hsv.hcg=function(we){var gt=we[2]/100,vt=we[1]/100*gt,Jt=0;return vt<1&&(Jt=(gt-vt)/(1-vt)),[we[0],100*vt,100*Jt]},k.hcg.rgb=function(we){var gt=we[1]/100,vt=we[2]/100;if(0===gt)return[255*vt,255*vt,255*vt];var jr,Jt=[0,0,0],Pn=we[0]/360%1*6,Rn=Pn%1,sr=1-Rn;switch(Math.floor(Pn)){case 0:Jt[0]=1,Jt[1]=Rn,Jt[2]=0;break;case 1:Jt[0]=sr,Jt[1]=1,Jt[2]=0;break;case 2:Jt[0]=0,Jt[1]=1,Jt[2]=Rn;break;case 3:Jt[0]=0,Jt[1]=sr,Jt[2]=1;break;case 4:Jt[0]=Rn,Jt[1]=0,Jt[2]=1;break;default:Jt[0]=1,Jt[1]=0,Jt[2]=sr}return[255*(gt*Jt[0]+(jr=(1-gt)*vt)),255*(gt*Jt[1]+jr),255*(gt*Jt[2]+jr)]},k.hcg.hsv=function(we){var Xe=we[1]/100,vt=Xe+we[2]/100*(1-Xe),Jt=0;return vt>0&&(Jt=Xe/vt),[we[0],100*Jt,100*vt]},k.hcg.hsl=function(we){var Xe=we[1]/100,vt=we[2]/100*(1-Xe)+.5*Xe,Jt=0;return vt>0&&vt<.5?Jt=Xe/(2*vt):vt>=.5&&vt<1&&(Jt=Xe/(2*(1-vt))),[we[0],100*Jt,100*vt]},k.hcg.hwb=function(we){var Xe=we[1]/100,vt=Xe+we[2]/100*(1-Xe);return[we[0],100*(vt-Xe),100*(1-vt)]},k.hwb.hcg=function(we){var vt=1-we[2]/100,Jt=vt-we[1]/100,Pn=0;return Jt<1&&(Pn=(vt-Jt)/(1-Jt)),[we[0],100*Jt,100*Pn]},k.apple.rgb=function(we){return[we[0]/65535*255,we[1]/65535*255,we[2]/65535*255]},k.rgb.apple=function(we){return[we[0]/255*65535,we[1]/255*65535,we[2]/255*65535]},k.gray.rgb=function(we){return[we[0]/100*255,we[0]/100*255,we[0]/100*255]},k.gray.hsl=k.gray.hsv=function(we){return[0,0,we[0]]},k.gray.hwb=function(we){return[0,100,we[0]]},k.gray.cmyk=function(we){return[0,0,0,we[0]]},k.gray.lab=function(we){return[we[0],0,0]},k.gray.hex=function(we){var Xe=255&Math.round(we[0]/100*255),vt=((Xe<<16)+(Xe<<8)+Xe).toString(16).toUpperCase();return"000000".substring(vt.length)+vt},k.rgb.gray=function(we){return[(we[0]+we[1]+we[2])/3/255*100]}});function he(h){var E=function(){for(var h={},E=Object.keys(e),N=E.length,k=0;k<N;k++)h[E[k]]={distance:-1,parent:null};return h}(),N=[h];for(E[h].distance=0;N.length;)for(var k=N.pop(),K=Object.keys(e[k]),de=K.length,be=0;be<de;be++){var Ue=K[be],we=E[Ue];-1===we.distance&&(we.distance=E[k].distance+1,we.parent=k,N.unshift(Ue))}return E}function me(h,E){return function(N){return E(h(N))}}function Oe(h,E){for(var N=[E[h].parent,h],k=e[E[h].parent][h],K=E[h].parent;E[K].parent;)N.unshift(E[K].parent),k=me(e[E[K].parent][K],k),K=E[K].parent;return k.conversion=N,k}var dt={};Object.keys(e).forEach(function(h){dt[h]={},Object.defineProperty(dt[h],"channels",{value:e[h].channels}),Object.defineProperty(dt[h],"labels",{value:e[h].labels});var E=function(h){for(var E=he(h),N={},k=Object.keys(E),K=k.length,de=0;de<K;de++){var be=k[de];null!==E[be].parent&&(N[be]=Oe(be,E))}return N}(h);Object.keys(E).forEach(function(k){var K=E[k];dt[h][k]=function(h){var E=function(N){if(null==N)return N;arguments.length>1&&(N=Array.prototype.slice.call(arguments));var k=h(N);if("object"==typeof k)for(var K=k.length,de=0;de<K;de++)k[de]=Math.round(k[de]);return k};return"conversion"in h&&(E.conversion=h.conversion),E}(K),dt[h][k].raw=function(h){var E=function(N){return null==N?N:(arguments.length>1&&(N=Array.prototype.slice.call(arguments)),h(N))};return"conversion"in h&&(E.conversion=h.conversion),E}(K)})});var Ie=dt,Ve={aliceblue:[240,248,255],antiquewhite:[250,235,215],aqua:[0,255,255],aquamarine:[127,255,212],azure:[240,255,255],beige:[245,245,220],bisque:[255,228,196],black:[0,0,0],blanchedalmond:[255,235,205],blue:[0,0,255],blueviolet:[138,43,226],brown:[165,42,42],burlywood:[222,184,135],cadetblue:[95,158,160],chartreuse:[127,255,0],chocolate:[210,105,30],coral:[255,127,80],cornflowerblue:[100,149,237],cornsilk:[255,248,220],crimson:[220,20,60],cyan:[0,255,255],darkblue:[0,0,139],darkcyan:[0,139,139],darkgoldenrod:[184,134,11],darkgray:[169,169,169],darkgreen:[0,100,0],darkgrey:[169,169,169],darkkhaki:[189,183,107],darkmagenta:[139,0,139],darkolivegreen:[85,107,47],darkorange:[255,140,0],darkorchid:[153,50,204],darkred:[139,0,0],darksalmon:[233,150,122],darkseagreen:[143,188,143],darkslateblue:[72,61,139],darkslategray:[47,79,79],darkslategrey:[47,79,79],darkturquoise:[0,206,209],darkviolet:[148,0,211],deeppink:[255,20,147],deepskyblue:[0,191,255],dimgray:[105,105,105],dimgrey:[105,105,105],dodgerblue:[30,144,255],firebrick:[178,34,34],floralwhite:[255,250,240],forestgreen:[34,139,34],fuchsia:[255,0,255],gainsboro:[220,220,220],ghostwhite:[248,248,255],gold:[255,215,0],goldenrod:[218,165,32],gray:[128,128,128],green:[0,128,0],greenyellow:[173,255,47],grey:[128,128,128],honeydew:[240,255,240],hotpink:[255,105,180],indianred:[205,92,92],indigo:[75,0,130],ivory:[255,255,240],khaki:[240,230,140],lavender:[230,230,250],lavenderblush:[255,240,245],lawngreen:[124,252,0],lemonchiffon:[255,250,205],lightblue:[173,216,230],lightcoral:[240,128,128],lightcyan:[224,255,255],lightgoldenrodyellow:[250,250,210],lightgray:[211,211,211],lightgreen:[144,238,144],lightgrey:[211,211,211],lightpink:[255,182,193],lightsalmon:[255,160,122],lightseagreen:[32,178,170],lightskyblue:[135,206,250],lightslategray:[119,136,153],lightslategrey:[119,136,153],lightsteelblue:[176,196,222],lightyellow:[255,255,224],lime:[0,255,0],limegreen:[50,205,50],linen:[250,240,230],magenta:[255,0,255],maroon:[128,0,0],mediumaquamarine:[102,205,170],mediumblue:[0,0,205],mediumorchid:[186,85,211],mediumpurple:[147,112,219],mediumseagreen:[60,179,113],mediumslateblue:[123,104,238],mediumspringgreen:[0,250,154],mediumturquoise:[72,209,204],mediumvioletred:[199,21,133],midnightblue:[25,25,112],mintcream:[245,255,250],mistyrose:[255,228,225],moccasin:[255,228,181],navajowhite:[255,222,173],navy:[0,0,128],oldlace:[253,245,230],olive:[128,128,0],olivedrab:[107,142,35],orange:[255,165,0],orangered:[255,69,0],orchid:[218,112,214],palegoldenrod:[238,232,170],palegreen:[152,251,152],paleturquoise:[175,238,238],palevioletred:[219,112,147],papayawhip:[255,239,213],peachpuff:[255,218,185],peru:[205,133,63],pink:[255,192,203],plum:[221,160,221],powderblue:[176,224,230],purple:[128,0,128],rebeccapurple:[102,51,153],red:[255,0,0],rosybrown:[188,143,143],royalblue:[65,105,225],saddlebrown:[139,69,19],salmon:[250,128,114],sandybrown:[244,164,96],seagreen:[46,139,87],seashell:[255,245,238],sienna:[160,82,45],silver:[192,192,192],skyblue:[135,206,235],slateblue:[106,90,205],slategray:[112,128,144],slategrey:[112,128,144],snow:[255,250,250],springgreen:[0,255,127],steelblue:[70,130,180],tan:[210,180,140],teal:[0,128,128],thistle:[216,191,216],tomato:[255,99,71],turquoise:[64,224,208],violet:[238,130,238],wheat:[245,222,179],white:[255,255,255],whitesmoke:[245,245,245],yellow:[255,255,0],yellowgreen:[154,205,50]},He={getRgba:Zt,getHsla:st,getRgb:function(h){var E=Zt(h);return E&&E.slice(0,3)},getHsl:function(h){var E=st(h);return E&&E.slice(0,3)},getHwb:en,getAlpha:function(h){var E=Zt(h);return E||(E=st(h))||(E=en(h))?E[3]:void 0},hexString:function(h,E){return E=void 0!==E&&3===h.length?E:h[3],"#"+Qr(h[0])+Qr(h[1])+Qr(h[2])+(E>=0&&E<1?Qr(Math.round(255*E)):"")},rgbString:function(h,E){return E<1||h[3]&&h[3]<1?Yt(h,E):"rgb("+h[0]+", "+h[1]+", "+h[2]+")"},rgbaString:Yt,percentString:function(h,E){return E<1||h[3]&&h[3]<1?zt(h,E):"rgb("+Math.round(h[0]/255*100)+"%, "+Math.round(h[1]/255*100)+"%, "+Math.round(h[2]/255*100)+"%)"},percentaString:zt,hslString:function(h,E){return E<1||h[3]&&h[3]<1?Hr(h,E):"hsl("+h[0]+", "+h[1]+"%, "+h[2]+"%)"},hslaString:Hr,hwbString:function(h,E){return void 0===E&&(E=void 0!==h[3]?h[3]:1),"hwb("+h[0]+", "+h[1]+"%, "+h[2]+"%"+(void 0!==E&&1!==E?", "+E:"")+")"},keyword:function(h){return Kr[h.slice(0,3)]}};function Zt(h){if(h){var be=[0,0,0],Ue=1,we=h.match(/^#([a-fA-F0-9]{3,4})$/i),Xe="";if(we){Xe=(we=we[1])[3];for(var gt=0;gt<be.length;gt++)be[gt]=parseInt(we[gt]+we[gt],16);Xe&&(Ue=Math.round(parseInt(Xe+Xe,16)/255*100)/100)}else if(we=h.match(/^#([a-fA-F0-9]{6}([a-fA-F0-9]{2})?)$/i)){for(Xe=we[2],we=we[1],gt=0;gt<be.length;gt++)be[gt]=parseInt(we.slice(2*gt,2*gt+2),16);Xe&&(Ue=Math.round(parseInt(Xe,16)/255*100)/100)}else if(we=h.match(/^rgba?\(\s*([+-]?\d+)\s*,\s*([+-]?\d+)\s*,\s*([+-]?\d+)\s*(?:,\s*([+-]?[\d\.]+)\s*)?\)$/i)){for(gt=0;gt<be.length;gt++)be[gt]=parseInt(we[gt+1]);Ue=parseFloat(we[4])}else if(we=h.match(/^rgba?\(\s*([+-]?[\d\.]+)\%\s*,\s*([+-]?[\d\.]+)\%\s*,\s*([+-]?[\d\.]+)\%\s*(?:,\s*([+-]?[\d\.]+)\s*)?\)$/i)){for(gt=0;gt<be.length;gt++)be[gt]=Math.round(2.55*parseFloat(we[gt+1]));Ue=parseFloat(we[4])}else if(we=h.match(/(\w+)/)){if("transparent"==we[1])return[0,0,0,0];if(!(be=Ve[we[1]]))return}for(gt=0;gt<be.length;gt++)be[gt]=wr(be[gt],0,255);return Ue=Ue||0==Ue?wr(Ue,0,1):1,be[3]=Ue,be}}function st(h){if(h){var N=h.match(/^hsla?\(\s*([+-]?\d+)(?:deg)?\s*,\s*([+-]?[\d\.]+)%\s*,\s*([+-]?[\d\.]+)%\s*(?:,\s*([+-]?[\d\.]+)\s*)?\)/);if(N){var k=parseFloat(N[4]);return[wr(parseInt(N[1]),0,360),wr(parseFloat(N[2]),0,100),wr(parseFloat(N[3]),0,100),wr(isNaN(k)?1:k,0,1)]}}}function en(h){if(h){var N=h.match(/^hwb\(\s*([+-]?\d+)(?:deg)?\s*,\s*([+-]?[\d\.]+)%\s*,\s*([+-]?[\d\.]+)%\s*(?:,\s*([+-]?[\d\.]+)\s*)?\)/);if(N){var k=parseFloat(N[4]);return[wr(parseInt(N[1]),0,360),wr(parseFloat(N[2]),0,100),wr(parseFloat(N[3]),0,100),wr(isNaN(k)?1:k,0,1)]}}}function Yt(h,E){return void 0===E&&(E=void 0!==h[3]?h[3]:1),"rgba("+h[0]+", "+h[1]+", "+h[2]+", "+E+")"}function zt(h,E){return"rgba("+Math.round(h[0]/255*100)+"%, "+Math.round(h[1]/255*100)+"%, "+Math.round(h[2]/255*100)+"%, "+(E||h[3]||1)+")"}function Hr(h,E){return void 0===E&&(E=void 0!==h[3]?h[3]:1),"hsla("+h[0]+", "+h[1]+"%, "+h[2]+"%, "+E+")"}function wr(h,E,N){return Math.min(Math.max(E,h),N)}function Qr(h){var E=h.toString(16).toUpperCase();return E.length<2?"0"+E:E}var Kr={};for(var In in Ve)Kr[Ve[In]]=In;var Hn=function(h){return h instanceof Hn?h:this instanceof Hn?(this.valid=!1,this.values={rgb:[0,0,0],hsl:[0,0,0],hsv:[0,0,0],hwb:[0,0,0],cmyk:[0,0,0,0],alpha:1},void("string"==typeof h?(E=He.getRgba(h))?this.setValues("rgb",E):(E=He.getHsla(h))?this.setValues("hsl",E):(E=He.getHwb(h))&&this.setValues("hwb",E):"object"==typeof h&&(void 0!==(E=h).r||void 0!==E.red?this.setValues("rgb",E):void 0!==E.l||void 0!==E.lightness?this.setValues("hsl",E):void 0!==E.v||void 0!==E.value?this.setValues("hsv",E):void 0!==E.w||void 0!==E.whiteness?this.setValues("hwb",E):(void 0!==E.c||void 0!==E.cyan)&&this.setValues("cmyk",E)))):new Hn(h);var E};Hn.prototype={isValid:function(){return this.valid},rgb:function(){return this.setSpace("rgb",arguments)},hsl:function(){return this.setSpace("hsl",arguments)},hsv:function(){return this.setSpace("hsv",arguments)},hwb:function(){return this.setSpace("hwb",arguments)},cmyk:function(){return this.setSpace("cmyk",arguments)},rgbArray:function(){return this.values.rgb},hslArray:function(){return this.values.hsl},hsvArray:function(){return this.values.hsv},hwbArray:function(){var h=this.values;return 1!==h.alpha?h.hwb.concat([h.alpha]):h.hwb},cmykArray:function(){return this.values.cmyk},rgbaArray:function(){var h=this.values;return h.rgb.concat([h.alpha])},hslaArray:function(){var h=this.values;return h.hsl.concat([h.alpha])},alpha:function(h){return void 0===h?this.values.alpha:(this.setValues("alpha",h),this)},red:function(h){return this.setChannel("rgb",0,h)},green:function(h){return this.setChannel("rgb",1,h)},blue:function(h){return this.setChannel("rgb",2,h)},hue:function(h){return h&&(h=(h%=360)<0?360+h:h),this.setChannel("hsl",0,h)},saturation:function(h){return this.setChannel("hsl",1,h)},lightness:function(h){return this.setChannel("hsl",2,h)},saturationv:function(h){return this.setChannel("hsv",1,h)},whiteness:function(h){return this.setChannel("hwb",1,h)},blackness:function(h){return this.setChannel("hwb",2,h)},value:function(h){return this.setChannel("hsv",2,h)},cyan:function(h){return this.setChannel("cmyk",0,h)},magenta:function(h){return this.setChannel("cmyk",1,h)},yellow:function(h){return this.setChannel("cmyk",2,h)},black:function(h){return this.setChannel("cmyk",3,h)},hexString:function(){return He.hexString(this.values.rgb)},rgbString:function(){return He.rgbString(this.values.rgb,this.values.alpha)},rgbaString:function(){return He.rgbaString(this.values.rgb,this.values.alpha)},percentString:function(){return He.percentString(this.values.rgb,this.values.alpha)},hslString:function(){return He.hslString(this.values.hsl,this.values.alpha)},hslaString:function(){return He.hslaString(this.values.hsl,this.values.alpha)},hwbString:function(){return He.hwbString(this.values.hwb,this.values.alpha)},keyword:function(){return He.keyword(this.values.rgb,this.values.alpha)},rgbNumber:function(){var h=this.values.rgb;return h[0]<<16|h[1]<<8|h[2]},luminosity:function(){for(var h=this.values.rgb,E=[],N=0;N<h.length;N++){var k=h[N]/255;E[N]=k<=.03928?k/12.92:Math.pow((k+.055)/1.055,2.4)}return.2126*E[0]+.7152*E[1]+.0722*E[2]},contrast:function(h){var E=this.luminosity(),N=h.luminosity();return E>N?(E+.05)/(N+.05):(N+.05)/(E+.05)},level:function(h){var E=this.contrast(h);return E>=7.1?"AAA":E>=4.5?"AA":""},dark:function(){var h=this.values.rgb;return(299*h[0]+587*h[1]+114*h[2])/1e3<128},light:function(){return!this.dark()},negate:function(){for(var h=[],E=0;E<3;E++)h[E]=255-this.values.rgb[E];return this.setValues("rgb",h),this},lighten:function(h){var E=this.values.hsl;return E[2]+=E[2]*h,this.setValues("hsl",E),this},darken:function(h){var E=this.values.hsl;return E[2]-=E[2]*h,this.setValues("hsl",E),this},saturate:function(h){var E=this.values.hsl;return E[1]+=E[1]*h,this.setValues("hsl",E),this},desaturate:function(h){var E=this.values.hsl;return E[1]-=E[1]*h,this.setValues("hsl",E),this},whiten:function(h){var E=this.values.hwb;return E[1]+=E[1]*h,this.setValues("hwb",E),this},blacken:function(h){var E=this.values.hwb;return E[2]+=E[2]*h,this.setValues("hwb",E),this},greyscale:function(){var h=this.values.rgb,E=.3*h[0]+.59*h[1]+.11*h[2];return this.setValues("rgb",[E,E,E]),this},clearer:function(h){var E=this.values.alpha;return this.setValues("alpha",E-E*h),this},opaquer:function(h){var E=this.values.alpha;return this.setValues("alpha",E+E*h),this},rotate:function(h){var E=this.values.hsl,N=(E[0]+h)%360;return E[0]=N<0?360+N:N,this.setValues("hsl",E),this},mix:function(h,E){var N=this,k=h,K=void 0===E?.5:E,de=2*K-1,be=N.alpha()-k.alpha(),Ue=((de*be==-1?de:(de+be)/(1+de*be))+1)/2,we=1-Ue;return this.rgb(Ue*N.red()+we*k.red(),Ue*N.green()+we*k.green(),Ue*N.blue()+we*k.blue()).alpha(N.alpha()*K+k.alpha()*(1-K))},toJSON:function(){return this.rgb()},clone:function(){var k,K,h=new Hn,E=this.values,N=h.values;for(var de in E)E.hasOwnProperty(de)&&("[object Array]"===(K={}.toString.call(k=E[de]))?N[de]=k.slice(0):"[object Number]"===K?N[de]=k:console.error("unexpected color value:",k));return h}},Hn.prototype.spaces={rgb:["red","green","blue"],hsl:["hue","saturation","lightness"],hsv:["hue","saturation","value"],hwb:["hue","whiteness","blackness"],cmyk:["cyan","magenta","yellow","black"]},Hn.prototype.maxes={rgb:[255,255,255],hsl:[360,100,100],hsv:[360,100,100],hwb:[360,100,100],cmyk:[100,100,100,100]},Hn.prototype.getValues=function(h){for(var E=this.values,N={},k=0;k<h.length;k++)N[h.charAt(k)]=E[h][k];return 1!==E.alpha&&(N.a=E.alpha),N},Hn.prototype.setValues=function(h,E){var be,we,N=this.values,k=this.spaces,K=this.maxes,de=1;if(this.valid=!0,"alpha"===h)de=E;else if(E.length)N[h]=E.slice(0,h.length),de=E[h.length];else if(void 0!==E[h.charAt(0)]){for(be=0;be<h.length;be++)N[h][be]=E[h.charAt(be)];de=E.a}else if(void 0!==E[k[h][0]]){var Ue=k[h];for(be=0;be<h.length;be++)N[h][be]=E[Ue[be]];de=E.alpha}if(N.alpha=Math.max(0,Math.min(1,void 0===de?N.alpha:de)),"alpha"===h)return!1;for(be=0;be<h.length;be++)we=Math.max(0,Math.min(K[h][be],N[h][be])),N[h][be]=Math.round(we);for(var Xe in k)Xe!==h&&(N[Xe]=Ie[h][Xe](N[h]));return!0},Hn.prototype.setSpace=function(h,E){var N=E[0];return void 0===N?this.getValues(h):("number"==typeof N&&(N=Array.prototype.slice.call(E)),this.setValues(h,N),this)},Hn.prototype.setChannel=function(h,E,N){var k=this.values[h];return void 0===N?k[E]:(N===k[E]||(k[E]=N,this.setValues(h,k)),this)},"undefined"!=typeof window&&(window.Color=Hn);var Zr=Hn;function Ur(h){return-1===["__proto__","prototype","constructor"].indexOf(h)}var h,di={noop:function(){},uid:(h=0,function(){return h++}),isNullOrUndef:function(h){return null==h},isArray:function(h){if(Array.isArray&&Array.isArray(h))return!0;var E=Object.prototype.toString.call(h);return"[object"===E.substr(0,7)&&"Array]"===E.substr(-6)},isObject:function(h){return null!==h&&"[object Object]"===Object.prototype.toString.call(h)},isFinite:function(h){return("number"==typeof h||h instanceof Number)&&isFinite(h)},valueOrDefault:function(h,E){return void 0===h?E:h},valueAtIndexOrDefault:function(h,E,N){return di.valueOrDefault(di.isArray(h)?h[E]:h,N)},callback:function(h,E,N){if(h&&"function"==typeof h.call)return h.apply(N,E)},each:function(h,E,N,k){var K,de,be;if(di.isArray(h))if(de=h.length,k)for(K=de-1;K>=0;K--)E.call(N,h[K],K);else for(K=0;K<de;K++)E.call(N,h[K],K);else if(di.isObject(h))for(de=(be=Object.keys(h)).length,K=0;K<de;K++)E.call(N,h[be[K]],be[K])},arrayEquals:function(h,E){var N,k,K,de;if(!h||!E||h.length!==E.length)return!1;for(N=0,k=h.length;N<k;++N)if(de=E[N],(K=h[N])instanceof Array&&de instanceof Array){if(!di.arrayEquals(K,de))return!1}else if(K!==de)return!1;return!0},clone:function(h){if(di.isArray(h))return h.map(di.clone);if(di.isObject(h)){for(var E=Object.create(h),N=Object.keys(h),k=N.length,K=0;K<k;++K)E[N[K]]=di.clone(h[N[K]]);return E}return h},_merger:function(h,E,N,k){if(Ur(h)){var K=E[h],de=N[h];di.isObject(K)&&di.isObject(de)?di.merge(K,de,k):E[h]=di.clone(de)}},_mergerIf:function(h,E,N){if(Ur(h)){var k=E[h],K=N[h];di.isObject(k)&&di.isObject(K)?di.mergeIf(k,K):E.hasOwnProperty(h)||(E[h]=di.clone(K))}},merge:function(h,E,N){var de,be,Ue,we,Xe,k=di.isArray(E)?E:[E],K=k.length;if(!di.isObject(h))return h;for(de=(N=N||{}).merger||di._merger,be=0;be<K;++be)if(di.isObject(E=k[be]))for(Xe=0,we=(Ue=Object.keys(E)).length;Xe<we;++Xe)de(Ue[Xe],h,E,N);return h},mergeIf:function(h,E){return di.merge(h,E,{merger:di._mergerIf})},extend:Object.assign||function(h){return di.merge(h,[].slice.call(arguments,1),{merger:function(E,N,k){N[E]=k[E]}})},inherits:function(h){var E=this,N=h&&h.hasOwnProperty("constructor")?h.constructor:function(){return E.apply(this,arguments)},k=function(){this.constructor=N};return k.prototype=E.prototype,N.prototype=new k,N.extend=di.inherits,h&&di.extend(N.prototype,h),N.__super__=E.prototype,N},_deprecated:function(h,E,N,k){void 0!==E&&console.warn(h+': "'+N+'" is deprecated. Please use "'+k+'" instead')}},$i=di;di.callCallback=di.callback,di.indexOf=function(h,E,N){return Array.prototype.indexOf.call(h,E,N)},di.getValueOrDefault=di.valueOrDefault,di.getValueAtIndexOrDefault=di.valueAtIndexOrDefault;var Hi={linear:function(h){return h},easeInQuad:function(h){return h*h},easeOutQuad:function(h){return-h*(h-2)},easeInOutQuad:function(h){return(h/=.5)<1?.5*h*h:-.5*(--h*(h-2)-1)},easeInCubic:function(h){return h*h*h},easeOutCubic:function(h){return(h-=1)*h*h+1},easeInOutCubic:function(h){return(h/=.5)<1?.5*h*h*h:.5*((h-=2)*h*h+2)},easeInQuart:function(h){return h*h*h*h},easeOutQuart:function(h){return-((h-=1)*h*h*h-1)},easeInOutQuart:function(h){return(h/=.5)<1?.5*h*h*h*h:-.5*((h-=2)*h*h*h-2)},easeInQuint:function(h){return h*h*h*h*h},easeOutQuint:function(h){return(h-=1)*h*h*h*h+1},easeInOutQuint:function(h){return(h/=.5)<1?.5*h*h*h*h*h:.5*((h-=2)*h*h*h*h+2)},easeInSine:function(h){return 1-Math.cos(h*(Math.PI/2))},easeOutSine:function(h){return Math.sin(h*(Math.PI/2))},easeInOutSine:function(h){return-.5*(Math.cos(Math.PI*h)-1)},easeInExpo:function(h){return 0===h?0:Math.pow(2,10*(h-1))},easeOutExpo:function(h){return 1===h?1:1-Math.pow(2,-10*h)},easeInOutExpo:function(h){return 0===h?0:1===h?1:(h/=.5)<1?.5*Math.pow(2,10*(h-1)):.5*(2-Math.pow(2,-10*--h))},easeInCirc:function(h){return h>=1?h:-(Math.sqrt(1-h*h)-1)},easeOutCirc:function(h){return Math.sqrt(1-(h-=1)*h)},easeInOutCirc:function(h){return(h/=.5)<1?-.5*(Math.sqrt(1-h*h)-1):.5*(Math.sqrt(1-(h-=2)*h)+1)},easeInElastic:function(h){var E=1.70158,N=0,k=1;return 0===h?0:1===h?1:(N||(N=.3),k<1?(k=1,E=N/4):E=N/(2*Math.PI)*Math.asin(1/k),-k*Math.pow(2,10*(h-=1))*Math.sin((h-E)*(2*Math.PI)/N))},easeOutElastic:function(h){var E=1.70158,N=0,k=1;return 0===h?0:1===h?1:(N||(N=.3),k<1?(k=1,E=N/4):E=N/(2*Math.PI)*Math.asin(1/k),k*Math.pow(2,-10*h)*Math.sin((h-E)*(2*Math.PI)/N)+1)},easeInOutElastic:function(h){var E=1.70158,N=0,k=1;return 0===h?0:2==(h/=.5)?1:(N||(N=.45),k<1?(k=1,E=N/4):E=N/(2*Math.PI)*Math.asin(1/k),h<1?k*Math.pow(2,10*(h-=1))*Math.sin((h-E)*(2*Math.PI)/N)*-.5:k*Math.pow(2,-10*(h-=1))*Math.sin((h-E)*(2*Math.PI)/N)*.5+1)},easeInBack:function(h){var E=1.70158;return h*h*((E+1)*h-E)},easeOutBack:function(h){var E=1.70158;return(h-=1)*h*((E+1)*h+E)+1},easeInOutBack:function(h){var E=1.70158;return(h/=.5)<1?h*h*((1+(E*=1.525))*h-E)*.5:.5*((h-=2)*h*((1+(E*=1.525))*h+E)+2)},easeInBounce:function(h){return 1-Hi.easeOutBounce(1-h)},easeOutBounce:function(h){return h<1/2.75?7.5625*h*h:h<2/2.75?7.5625*(h-=1.5/2.75)*h+.75:h<2.5/2.75?7.5625*(h-=2.25/2.75)*h+.9375:7.5625*(h-=2.625/2.75)*h+.984375},easeInOutBounce:function(h){return h<.5?.5*Hi.easeInBounce(2*h):.5*Hi.easeOutBounce(2*h-1)+.5}},Br={effects:Hi};$i.easingEffects=Hi;var On=Math.PI,Wt=On/180,Jn=2*On,ir=On/2,Lr=On/4,Vn=2*On/3,zr={clear:function(h){h.ctx.clearRect(0,0,h.width,h.height)},roundedRect:function(h,E,N,k,K,de){if(de){var be=Math.min(de,K/2,k/2),Ue=E+be,we=N+be,Xe=E+k-be,gt=N+K-be;h.moveTo(E,we),Ue<Xe&&we<gt?(h.arc(Ue,we,be,-On,-ir),h.arc(Xe,we,be,-ir,0),h.arc(Xe,gt,be,0,ir),h.arc(Ue,gt,be,ir,On)):Ue<Xe?(h.moveTo(Ue,N),h.arc(Xe,we,be,-ir,ir),h.arc(Ue,we,be,ir,On+ir)):we<gt?(h.arc(Ue,we,be,-On,0),h.arc(Ue,gt,be,0,On)):h.arc(Ue,we,be,-On,On),h.closePath(),h.moveTo(E,N)}else h.rect(E,N,k,K)},drawPoint:function(h,E,N,k,K,de){var be,Ue,we,Xe,gt,vt=(de||0)*Wt;if(E&&"object"==typeof E&&("[object HTMLImageElement]"===(be=E.toString())||"[object HTMLCanvasElement]"===be))return h.save(),h.translate(k,K),h.rotate(vt),h.drawImage(E,-E.width/2,-E.height/2,E.width,E.height),void h.restore();if(!(isNaN(N)||N<=0)){switch(h.beginPath(),E){default:h.arc(k,K,N,0,Jn),h.closePath();break;case"triangle":h.moveTo(k+Math.sin(vt)*N,K-Math.cos(vt)*N),vt+=Vn,h.lineTo(k+Math.sin(vt)*N,K-Math.cos(vt)*N),vt+=Vn,h.lineTo(k+Math.sin(vt)*N,K-Math.cos(vt)*N),h.closePath();break;case"rectRounded":Xe=N-(gt=.516*N),Ue=Math.cos(vt+Lr)*Xe,we=Math.sin(vt+Lr)*Xe,h.arc(k-Ue,K-we,gt,vt-On,vt-ir),h.arc(k+we,K-Ue,gt,vt-ir,vt),h.arc(k+Ue,K+we,gt,vt,vt+ir),h.arc(k-we,K+Ue,gt,vt+ir,vt+On),h.closePath();break;case"rect":if(!de){Xe=Math.SQRT1_2*N,h.rect(k-Xe,K-Xe,2*Xe,2*Xe);break}vt+=Lr;case"rectRot":Ue=Math.cos(vt)*N,we=Math.sin(vt)*N,h.moveTo(k-Ue,K-we),h.lineTo(k+we,K-Ue),h.lineTo(k+Ue,K+we),h.lineTo(k-we,K+Ue),h.closePath();break;case"crossRot":vt+=Lr;case"cross":Ue=Math.cos(vt)*N,we=Math.sin(vt)*N,h.moveTo(k-Ue,K-we),h.lineTo(k+Ue,K+we),h.moveTo(k+we,K-Ue),h.lineTo(k-we,K+Ue);break;case"star":Ue=Math.cos(vt)*N,we=Math.sin(vt)*N,h.moveTo(k-Ue,K-we),h.lineTo(k+Ue,K+we),h.moveTo(k+we,K-Ue),h.lineTo(k-we,K+Ue),vt+=Lr,Ue=Math.cos(vt)*N,we=Math.sin(vt)*N,h.moveTo(k-Ue,K-we),h.lineTo(k+Ue,K+we),h.moveTo(k+we,K-Ue),h.lineTo(k-we,K+Ue);break;case"line":Ue=Math.cos(vt)*N,we=Math.sin(vt)*N,h.moveTo(k-Ue,K-we),h.lineTo(k+Ue,K+we);break;case"dash":h.moveTo(k,K),h.lineTo(k+Math.cos(vt)*N,K+Math.sin(vt)*N)}h.fill(),h.stroke()}},_isPointInArea:function(h,E){var N=1e-6;return h.x>E.left-N&&h.x<E.right+N&&h.y>E.top-N&&h.y<E.bottom+N},clipArea:function(h,E){h.save(),h.beginPath(),h.rect(E.left,E.top,E.right-E.left,E.bottom-E.top),h.clip()},unclipArea:function(h){h.restore()},lineTo:function(h,E,N,k){var K=N.steppedLine;if(K){if("middle"===K){var de=(E.x+N.x)/2;h.lineTo(de,k?N.y:E.y),h.lineTo(de,k?E.y:N.y)}else"after"===K&&!k||"after"!==K&&k?h.lineTo(E.x,N.y):h.lineTo(N.x,E.y);h.lineTo(N.x,N.y)}else N.tension?h.bezierCurveTo(k?E.controlPointPreviousX:E.controlPointNextX,k?E.controlPointPreviousY:E.controlPointNextY,k?N.controlPointNextX:N.controlPointPreviousX,k?N.controlPointNextY:N.controlPointPreviousY,N.x,N.y):h.lineTo(N.x,N.y)}},hi=zr;$i.clear=zr.clear,$i.drawRoundedRectangle=function(h){h.beginPath(),zr.roundedRect.apply(zr,arguments)};var Ai={_set:function(h,E){return $i.merge(this[h]||(this[h]={}),E)}};Ai._set("global",{defaultColor:"rgba(0,0,0,0.1)",defaultFontColor:"#666",defaultFontFamily:"'Helvetica Neue', 'Helvetica', 'Arial', sans-serif",defaultFontSize:12,defaultFontStyle:"normal",defaultLineHeight:1.2,showLines:!0});var Tr=Ai,Nr=$i.valueOrDefault;var En={toLineHeight:function(h,E){var N=(""+h).match(/^(normal|(\d+(?:\.\d+)?)(px|em|%)?)$/);if(!N||"normal"===N[1])return 1.2*E;switch(h=+N[2],N[3]){case"px":return h;case"%":h/=100}return E*h},toPadding:function(h){var E,N,k,K;return $i.isObject(h)?(E=+h.top||0,N=+h.right||0,k=+h.bottom||0,K=+h.left||0):E=N=k=K=+h||0,{top:E,right:N,bottom:k,left:K,height:E+k,width:K+N}},_parseFont:function(h){var E=Tr.global,N=Nr(h.fontSize,E.defaultFontSize),k={family:Nr(h.fontFamily,E.defaultFontFamily),lineHeight:$i.options.toLineHeight(Nr(h.lineHeight,E.defaultLineHeight),N),size:N,style:Nr(h.fontStyle,E.defaultFontStyle),weight:null,string:""};return k.string=function(h){return!h||$i.isNullOrUndef(h.size)||$i.isNullOrUndef(h.family)?null:(h.style?h.style+" ":"")+(h.weight?h.weight+" ":"")+h.size+"px "+h.family}(k),k},resolve:function(h,E,N,k){var de,be,Ue,K=!0;for(de=0,be=h.length;de<be;++de)if(void 0!==(Ue=h[de])&&(void 0!==E&&"function"==typeof Ue&&(Ue=Ue(E),K=!1),void 0!==N&&$i.isArray(Ue)&&(Ue=Ue[N],K=!1),void 0!==Ue))return k&&!K&&(k.cacheable=!1),Ue}},mr={_factorize:function(h){var k,E=[],N=Math.sqrt(h);for(k=1;k<N;k++)h%k==0&&(E.push(k),E.push(h/k));return N===(0|N)&&E.push(N),E.sort(function(K,de){return K-de}).pop(),E},log10:Math.log10||function(h){var E=Math.log(h)*Math.LOG10E,N=Math.round(E);return h===Math.pow(10,N)?N:E}},Xt=mr;$i.log10=mr.log10;var Ze=$i,jt=hi,xt=En,mn=Xt,Wn={getRtlAdapter:function(h,E,N){return h?function(h,E){return{x:function(N){return h+h+E-N},setWidth:function(N){E=N},textAlign:function(N){return"center"===N?N:"right"===N?"left":"right"},xPlus:function(N,k){return N-k},leftForLtr:function(N,k){return N-k}}}(E,N):{x:function(h){return h},setWidth:function(h){},textAlign:function(h){return h},xPlus:function(h,E){return h+E},leftForLtr:function(h,E){return h}}},overrideTextDirection:function(h,E){var N,k;("ltr"===E||"rtl"===E)&&(k=[(N=h.canvas.style).getPropertyValue("direction"),N.getPropertyPriority("direction")],N.setProperty("direction",E,"important"),h.prevTextDirection=k)},restoreTextDirection:function(h){var E=h.prevTextDirection;void 0!==E&&(delete h.prevTextDirection,h.canvas.style.setProperty("direction",E[0],E[1]))}};Ze.easing=Br,Ze.canvas=jt,Ze.options=xt,Ze.math=mn,Ze.rtl=Wn;var wn=function(h){Ze.extend(this,h),this.initialize.apply(this,arguments)};Ze.extend(wn.prototype,{_type:void 0,initialize:function(){this.hidden=!1},pivot:function(){var h=this;return h._view||(h._view=Ze.extend({},h._model)),h._start={},h},transition:function(h){var E=this,N=E._model,k=E._start,K=E._view;return N&&1!==h?(K||(K=E._view={}),k||(k=E._start={}),function(h,E,N,k){var de,be,Ue,we,Xe,gt,vt,Jt,Pn,K=Object.keys(N);for(de=0,be=K.length;de<be;++de)if(gt=N[Ue=K[de]],E.hasOwnProperty(Ue)||(E[Ue]=gt),(we=E[Ue])!==gt&&"_"!==Ue[0]){if(h.hasOwnProperty(Ue)||(h[Ue]=we),(vt=typeof gt)==typeof(Xe=h[Ue]))if("string"===vt){if((Jt=Zr(Xe)).valid&&(Pn=Zr(gt)).valid){E[Ue]=Pn.mix(Jt,k).rgbString();continue}}else if(Ze.isFinite(Xe)&&Ze.isFinite(gt)){E[Ue]=Xe+(gt-Xe)*k;continue}E[Ue]=gt}}(k,K,N,h),E):(E._view=Ze.extend({},N),E._start=null,E)},tooltipPosition:function(){return{x:this._model.x,y:this._model.y}},hasValue:function(){return Ze.isNumber(this._model.x)&&Ze.isNumber(this._model.y)}}),wn.extend=Ze.inherits;var nr=wn,Gi=nr.extend({chart:null,currentStep:0,numSteps:60,easing:"",render:null,onAnimationProgress:null,onAnimationComplete:null}),po=Gi;Object.defineProperty(Gi.prototype,"animationObject",{get:function(){return this}}),Object.defineProperty(Gi.prototype,"chartInstance",{get:function(){return this.chart},set:function(h){this.chart=h}}),Tr._set("global",{animation:{duration:1e3,easing:"easeOutQuart",onProgress:Ze.noop,onComplete:Ze.noop}});var yo={animations:[],request:null,addAnimation:function(h,E,N,k){var de,be,K=this.animations;for(E.chart=h,E.startTime=Date.now(),E.duration=N,k||(h.animating=!0),de=0,be=K.length;de<be;++de)if(K[de].chart===h)return void(K[de]=E);K.push(E),1===K.length&&this.requestAnimationFrame()},cancelAnimation:function(h){var E=Ze.findIndex(this.animations,function(N){return N.chart===h});-1!==E&&(this.animations.splice(E,1),h.animating=!1)},requestAnimationFrame:function(){var h=this;null===h.request&&(h.request=Ze.requestAnimFrame.call(window,function(){h.request=null,h.startDigest()}))},startDigest:function(){var h=this;h.advance(),h.animations.length>0&&h.requestAnimationFrame()},advance:function(){for(var E,N,k,K,h=this.animations,de=0;de<h.length;)N=(E=h[de]).chart,k=E.numSteps,K=Math.floor((Date.now()-E.startTime)/E.duration*k)+1,E.currentStep=Math.min(K,k),Ze.callback(E.render,[N,E],N),Ze.callback(E.onAnimationProgress,[E],N),E.currentStep>=k?(Ze.callback(E.onAnimationComplete,[E],N),N.animating=!1,h.splice(de,1)):++de}},Mo=Ze.options.resolve,Vi=["push","pop","shift","splice","unshift"];function zo(h,E){var N=h._chartjs;if(N){var k=N.listeners,K=k.indexOf(E);-1!==K&&k.splice(K,1),!(k.length>0)&&(Vi.forEach(function(de){delete h[de]}),delete h._chartjs)}}var So=function(h,E){this.initialize(h,E)};Ze.extend(So.prototype,{datasetElementType:null,dataElementType:null,_datasetElementOptions:["backgroundColor","borderCapStyle","borderColor","borderDash","borderDashOffset","borderJoinStyle","borderWidth"],_dataElementOptions:["backgroundColor","borderColor","borderWidth","pointStyle"],initialize:function(h,E){var N=this;N.chart=h,N.index=E,N.linkScales(),N.addElements(),N._type=N.getMeta().type},updateIndex:function(h){this.index=h},linkScales:function(){var h=this,E=h.getMeta(),N=h.chart,k=N.scales,K=h.getDataset(),de=N.options.scales;(null===E.xAxisID||!(E.xAxisID in k)||K.xAxisID)&&(E.xAxisID=K.xAxisID||de.xAxes[0].id),(null===E.yAxisID||!(E.yAxisID in k)||K.yAxisID)&&(E.yAxisID=K.yAxisID||de.yAxes[0].id)},getDataset:function(){return this.chart.data.datasets[this.index]},getMeta:function(){return this.chart.getDatasetMeta(this.index)},getScaleForId:function(h){return this.chart.scales[h]},_getValueScaleId:function(){return this.getMeta().yAxisID},_getIndexScaleId:function(){return this.getMeta().xAxisID},_getValueScale:function(){return this.getScaleForId(this._getValueScaleId())},_getIndexScale:function(){return this.getScaleForId(this._getIndexScaleId())},reset:function(){this._update(!0)},destroy:function(){this._data&&zo(this._data,this)},createMetaDataset:function(){var h=this,E=h.datasetElementType;return E&&new E({_chart:h.chart,_datasetIndex:h.index})},createMetaData:function(h){var E=this,N=E.dataElementType;return N&&new N({_chart:E.chart,_datasetIndex:E.index,_index:h})},addElements:function(){var K,de,h=this,E=h.getMeta(),N=h.getDataset().data||[],k=E.data;for(K=0,de=N.length;K<de;++K)k[K]=k[K]||h.createMetaData(K);E.dataset=E.dataset||h.createMetaDataset()},addElementAndReset:function(h){var E=this.createMetaData(h);this.getMeta().data.splice(h,0,E),this.updateElement(E,h,!0)},buildOrUpdateElements:function(){var h=this,E=h.getDataset(),N=E.data||(E.data=[]);h._data!==N&&(h._data&&zo(h._data,h),N&&Object.isExtensible(N)&&function(h,E){h._chartjs?h._chartjs.listeners.push(E):(Object.defineProperty(h,"_chartjs",{configurable:!0,enumerable:!1,value:{listeners:[E]}}),Vi.forEach(function(N){var k="onData"+N.charAt(0).toUpperCase()+N.slice(1),K=h[N];Object.defineProperty(h,N,{configurable:!0,enumerable:!1,value:function(){var de=Array.prototype.slice.call(arguments),be=K.apply(this,de);return Ze.each(h._chartjs.listeners,function(Ue){"function"==typeof Ue[k]&&Ue[k].apply(Ue,de)}),be}})}))}(N,h),h._data=N),h.resyncElements()},_configure:function(){var h=this;h._config=Ze.merge(Object.create(null),[h.chart.options.datasets[h._type],h.getDataset()],{merger:function(E,N,k){"_meta"!==E&&"data"!==E&&Ze._merger(E,N,k)}})},_update:function(h){var E=this;E._configure(),E._cachedDataOpts=null,E.update(h)},update:Ze.noop,transition:function(h){for(var E=this.getMeta(),N=E.data||[],k=N.length,K=0;K<k;++K)N[K].transition(h);E.dataset&&E.dataset.transition(h)},draw:function(){var h=this.getMeta(),E=h.data||[],N=E.length,k=0;for(h.dataset&&h.dataset.draw();k<N;++k)E[k].draw()},getStyle:function(h){var K,E=this,N=E.getMeta(),k=N.dataset;return E._configure(),(!1===(K=k&&void 0===h?E._resolveDatasetElementOptions(k||{}):E._resolveDataElementOptions(N.data[h=h||0]||{},h)).fill||null===K.fill)&&(K.backgroundColor=K.borderColor),K},_resolveDatasetElementOptions:function(h,E){var Xe,gt,vt,Jt,N=this,k=N.chart,K=N._config,de=h.custom||{},be=k.options.elements[N.datasetElementType.prototype._type]||{},Ue=N._datasetElementOptions,we={},Pn={chart:k,dataset:N.getDataset(),datasetIndex:N.index,hover:E};for(Xe=0,gt=Ue.length;Xe<gt;++Xe)vt=Ue[Xe],Jt=E?"hover"+vt.charAt(0).toUpperCase()+vt.slice(1):vt,we[vt]=Mo([de[Jt],K[Jt],be[Jt]],Pn);return we},_resolveDataElementOptions:function(h,E){var N=this,k=h&&h.custom,K=N._cachedDataOpts;if(K&&!k)return K;var Jt,Pn,Rn,sr,de=N.chart,be=N._config,Ue=de.options.elements[N.dataElementType.prototype._type]||{},we=N._dataElementOptions,Xe={},gt={chart:de,dataIndex:E,dataset:N.getDataset(),datasetIndex:N.index},vt={cacheable:!k};if(k=k||{},Ze.isArray(we))for(Pn=0,Rn=we.length;Pn<Rn;++Pn)Xe[sr=we[Pn]]=Mo([k[sr],be[sr],Ue[sr]],gt,E,vt);else for(Pn=0,Rn=(Jt=Object.keys(we)).length;Pn<Rn;++Pn)Xe[sr=Jt[Pn]]=Mo([k[sr],be[we[sr]],be[sr],Ue[sr]],gt,E,vt);return vt.cacheable&&(N._cachedDataOpts=Object.freeze(Xe)),Xe},removeHoverStyle:function(h){Ze.merge(h._model,h.$previousStyle||{}),delete h.$previousStyle},setHoverStyle:function(h){var E=this.chart.data.datasets[h._datasetIndex],N=h._index,k=h.custom||{},K=h._model,de=Ze.getHoverColor;h.$previousStyle={backgroundColor:K.backgroundColor,borderColor:K.borderColor,borderWidth:K.borderWidth},K.backgroundColor=Mo([k.hoverBackgroundColor,E.hoverBackgroundColor,de(K.backgroundColor)],void 0,N),K.borderColor=Mo([k.hoverBorderColor,E.hoverBorderColor,de(K.borderColor)],void 0,N),K.borderWidth=Mo([k.hoverBorderWidth,E.hoverBorderWidth,K.borderWidth],void 0,N)},_removeDatasetHoverStyle:function(){var h=this.getMeta().dataset;h&&this.removeHoverStyle(h)},_setDatasetHoverStyle:function(){var N,k,K,de,be,Ue,h=this.getMeta().dataset,E={};if(h){for(Ue=h._model,be=this._resolveDatasetElementOptions(h,!0),N=0,k=(de=Object.keys(be)).length;N<k;++N)E[K=de[N]]=Ue[K],Ue[K]=be[K];h.$previousStyle=E}},resyncElements:function(){var h=this,E=h.getMeta(),N=h.getDataset().data,k=E.data.length,K=N.length;K<k?E.data.splice(K,k-K):K>k&&h.insertElements(k,K-k)},insertElements:function(h,E){for(var N=0;N<E;++N)this.addElementAndReset(h+N)},onDataPush:function(){var h=arguments.length;this.insertElements(this.getDataset().data.length-h,h)},onDataPop:function(){this.getMeta().data.pop()},onDataShift:function(){this.getMeta().data.shift()},onDataSplice:function(h,E){this.getMeta().data.splice(h,E),this.insertElements(h,arguments.length-2)},onDataUnshift:function(){this.insertElements(0,arguments.length)}}),So.extend=Ze.inherits;var Si=So,ai=2*Math.PI;function Zn(h,E){var N=E.startAngle,k=E.endAngle,K=E.pixelMargin,de=K/E.outerRadius,be=E.x,Ue=E.y;h.beginPath(),h.arc(be,Ue,E.outerRadius,N-de,k+de),E.innerRadius>K?h.arc(be,Ue,E.innerRadius-K,k+(de=K/E.innerRadius),N-de,!0):h.arc(be,Ue,K,k+Math.PI/2,N-Math.PI/2),h.closePath(),h.clip()}function yr(h,E,N){var k="inner"===E.borderAlign;k?(h.lineWidth=2*E.borderWidth,h.lineJoin="round"):(h.lineWidth=E.borderWidth,h.lineJoin="bevel"),N.fullCircles&&function(h,E,N,k){var de,K=N.endAngle;for(k&&(N.endAngle=N.startAngle+ai,Zn(h,N),N.endAngle=K,N.endAngle===N.startAngle&&N.fullCircles&&(N.endAngle+=ai,N.fullCircles--)),h.beginPath(),h.arc(N.x,N.y,N.innerRadius,N.startAngle+ai,N.startAngle,!0),de=0;de<N.fullCircles;++de)h.stroke();for(h.beginPath(),h.arc(N.x,N.y,E.outerRadius,N.startAngle,N.startAngle+ai),de=0;de<N.fullCircles;++de)h.stroke()}(h,E,N,k),k&&Zn(h,N),h.beginPath(),h.arc(N.x,N.y,E.outerRadius,N.startAngle,N.endAngle),h.arc(N.x,N.y,N.innerRadius,N.endAngle,N.startAngle,!0),h.closePath(),h.stroke()}Tr._set("global",{elements:{arc:{backgroundColor:Tr.global.defaultColor,borderColor:"#fff",borderWidth:2,borderAlign:"center"}}});var rr=nr.extend({_type:"arc",inLabelRange:function(h){var E=this._view;return!!E&&Math.pow(h-E.x,2)<Math.pow(E.radius+E.hoverRadius,2)},inRange:function(h,E){var N=this._view;if(N){for(var k=Ze.getAngleFromPoint(N,{x:h,y:E}),K=k.angle,de=k.distance,be=N.startAngle,Ue=N.endAngle;Ue<be;)Ue+=ai;for(;K>Ue;)K-=ai;for(;K<be;)K+=ai;return K>=be&&K<=Ue&&de>=N.innerRadius&&de<=N.outerRadius}return!1},getCenterPoint:function(){var h=this._view,E=(h.startAngle+h.endAngle)/2,N=(h.innerRadius+h.outerRadius)/2;return{x:h.x+Math.cos(E)*N,y:h.y+Math.sin(E)*N}},getArea:function(){var h=this._view;return Math.PI*((h.endAngle-h.startAngle)/(2*Math.PI))*(Math.pow(h.outerRadius,2)-Math.pow(h.innerRadius,2))},tooltipPosition:function(){var h=this._view,E=h.startAngle+(h.endAngle-h.startAngle)/2,N=(h.outerRadius-h.innerRadius)/2+h.innerRadius;return{x:h.x+Math.cos(E)*N,y:h.y+Math.sin(E)*N}},draw:function(){var K,h=this._chart.ctx,E=this._view,N="inner"===E.borderAlign?.33:0,k={x:E.x,y:E.y,innerRadius:E.innerRadius,outerRadius:Math.max(E.outerRadius-N,0),pixelMargin:N,startAngle:E.startAngle,endAngle:E.endAngle,fullCircles:Math.floor(E.circumference/ai)};if(h.save(),h.fillStyle=E.backgroundColor,h.strokeStyle=E.borderColor,k.fullCircles){for(k.endAngle=k.startAngle+ai,h.beginPath(),h.arc(k.x,k.y,k.outerRadius,k.startAngle,k.endAngle),h.arc(k.x,k.y,k.innerRadius,k.endAngle,k.startAngle,!0),h.closePath(),K=0;K<k.fullCircles;++K)h.fill();k.endAngle=k.startAngle+E.circumference%ai}h.beginPath(),h.arc(k.x,k.y,k.outerRadius,k.startAngle,k.endAngle),h.arc(k.x,k.y,k.innerRadius,k.endAngle,k.startAngle,!0),h.closePath(),h.fill(),E.borderWidth&&yr(h,E,k),h.restore()}}),ri=Ze.valueOrDefault,ho=Tr.global.defaultColor;Tr._set("global",{elements:{line:{tension:.4,backgroundColor:ho,borderWidth:3,borderColor:ho,borderCapStyle:"butt",borderDash:[],borderDashOffset:0,borderJoinStyle:"miter",capBezierPoints:!0,fill:!0}}});var Ti=nr.extend({_type:"line",draw:function(){var Xe,gt,vt,h=this,E=h._view,N=h._chart.ctx,k=E.spanGaps,K=h._children.slice(),de=Tr.global,be=de.elements.line,Ue=-1,we=h._loop;if(K.length){if(h._loop){for(Xe=0;Xe<K.length;++Xe)if(gt=Ze.previousItem(K,Xe),!K[Xe]._view.skip&&gt._view.skip){K=K.slice(Xe).concat(K.slice(0,Xe)),we=k;break}we&&K.push(K[0])}for(N.save(),N.lineCap=E.borderCapStyle||be.borderCapStyle,N.setLineDash&&N.setLineDash(E.borderDash||be.borderDash),N.lineDashOffset=ri(E.borderDashOffset,be.borderDashOffset),N.lineJoin=E.borderJoinStyle||be.borderJoinStyle,N.lineWidth=ri(E.borderWidth,be.borderWidth),N.strokeStyle=E.borderColor||de.defaultColor,N.beginPath(),(vt=K[0]._view).skip||(N.moveTo(vt.x,vt.y),Ue=0),Xe=1;Xe<K.length;++Xe)vt=K[Xe]._view,gt=-1===Ue?Ze.previousItem(K,Xe):K[Ue],vt.skip||(Ue!==Xe-1&&!k||-1===Ue?N.moveTo(vt.x,vt.y):Ze.canvas.lineTo(N,gt._view,vt),Ue=Xe);we&&N.closePath(),N.stroke(),N.restore()}}}),Bo=Ze.valueOrDefault,xo=Tr.global.defaultColor;function Li(h){var E=this._view;return!!E&&Math.abs(h-E.x)<E.radius+E.hitRadius}Tr._set("global",{elements:{point:{radius:3,pointStyle:"circle",backgroundColor:xo,borderColor:xo,borderWidth:1,hitRadius:1,hoverRadius:4,hoverBorderWidth:1}}});var ln=nr.extend({_type:"point",inRange:function(h,E){var N=this._view;return!!N&&Math.pow(h-N.x,2)+Math.pow(E-N.y,2)<Math.pow(N.hitRadius+N.radius,2)},inLabelRange:Li,inXRange:Li,inYRange:function(h){var E=this._view;return!!E&&Math.abs(h-E.y)<E.radius+E.hitRadius},getCenterPoint:function(){var h=this._view;return{x:h.x,y:h.y}},getArea:function(){return Math.PI*Math.pow(this._view.radius,2)},tooltipPosition:function(){var h=this._view;return{x:h.x,y:h.y,padding:h.radius+h.borderWidth}},draw:function(h){var E=this._view,N=this._chart.ctx,k=E.pointStyle,K=E.rotation,de=E.radius,be=E.x,Ue=E.y,we=Tr.global,Xe=we.defaultColor;E.skip||(void 0===h||Ze.canvas._isPointInArea(E,h))&&(N.strokeStyle=E.borderColor||Xe,N.lineWidth=Bo(E.borderWidth,we.elements.point.borderWidth),N.fillStyle=E.backgroundColor||Xe,Ze.canvas.drawPoint(N,k,de,be,Ue,K))}}),Ht=Tr.global.defaultColor;function cn(h){return h&&void 0!==h.width}function Ct(h){var E,N,k,K,de;return cn(h)?(E=h.x-(de=h.width/2),N=h.x+de,k=Math.min(h.y,h.base),K=Math.max(h.y,h.base)):(de=h.height/2,E=Math.min(h.x,h.base),N=Math.max(h.x,h.base),k=h.y-de,K=h.y+de),{left:E,top:k,right:N,bottom:K}}function pr(h,E,N){return h===E?N:h===N?E:h}function Cn(h,E,N){var de,be,Ue,we,k=h.borderWidth,K=function(h){var E=h.borderSkipped,N={};return E&&(h.horizontal?h.base>h.x&&(E=pr(E,"left","right")):h.base<h.y&&(E=pr(E,"bottom","top")),N[E]=!0),N}(h);return Ze.isObject(k)?(de=+k.top||0,be=+k.right||0,Ue=+k.bottom||0,we=+k.left||0):de=be=Ue=we=+k||0,{t:K.top||de<0?0:de>N?N:de,r:K.right||be<0?0:be>E?E:be,b:K.bottom||Ue<0?0:Ue>N?N:Ue,l:K.left||we<0?0:we>E?E:we}}function zi(h,E,N){var k=null===E,K=null===N,de=!(!h||k&&K)&&Ct(h);return de&&(k||E>=de.left&&E<=de.right)&&(K||N>=de.top&&N<=de.bottom)}Tr._set("global",{elements:{rectangle:{backgroundColor:Ht,borderColor:Ht,borderSkipped:"bottom",borderWidth:0}}});var Wo=nr.extend({_type:"rectangle",draw:function(){var h=this._chart.ctx,E=this._view,N=function(h){var E=Ct(h),N=E.right-E.left,k=E.bottom-E.top,K=Cn(h,N/2,k/2);return{outer:{x:E.left,y:E.top,w:N,h:k},inner:{x:E.left+K.l,y:E.top+K.t,w:N-K.l-K.r,h:k-K.t-K.b}}}(E),k=N.outer,K=N.inner;h.fillStyle=E.backgroundColor,h.fillRect(k.x,k.y,k.w,k.h),(k.w!==K.w||k.h!==K.h)&&(h.save(),h.beginPath(),h.rect(k.x,k.y,k.w,k.h),h.clip(),h.fillStyle=E.borderColor,h.rect(K.x,K.y,K.w,K.h),h.fill("evenodd"),h.restore())},height:function(){var h=this._view;return h.base-h.y},inRange:function(h,E){return zi(this._view,h,E)},inLabelRange:function(h,E){var N=this._view;return cn(N)?zi(N,h,null):zi(N,null,E)},inXRange:function(h){return zi(this._view,h,null)},inYRange:function(h){return zi(this._view,null,h)},getCenterPoint:function(){var E,N,h=this._view;return cn(h)?(E=h.x,N=(h.y+h.base)/2):(E=(h.x+h.base)/2,N=h.y),{x:E,y:N}},getArea:function(){var h=this._view;return cn(h)?h.width*Math.abs(h.y-h.base):h.height*Math.abs(h.x-h.base)},tooltipPosition:function(){var h=this._view;return{x:h.x,y:h.y}}}),Do={},_s=Ti,bs=ln,qo=Wo;Do.Arc=rr,Do.Line=_s,Do.Point=bs,Do.Rectangle=qo;var ra=Ze._deprecated,Ia=Ze.valueOrDefault;function Bs(h,E,N){var Ue,we,k=N.barThickness,K=E.stackCount,de=E.pixels[h],be=Ze.isNullOrUndef(k)?function(h,E){var k,K,de,be,N=h._length;for(de=1,be=E.length;de<be;++de)N=Math.min(N,Math.abs(E[de]-E[de-1]));for(de=0,be=h.getTicks().length;de<be;++de)K=h.getPixelForTick(de),N=de>0?Math.min(N,Math.abs(K-k)):N,k=K;return N}(E.scale,E.pixels):-1;return Ze.isNullOrUndef(k)?(Ue=be*N.categoryPercentage,we=N.barPercentage):(Ue=k*K,we=1),{chunk:Ue/K,ratio:we,start:de-Ue/2}}Tr._set("bar",{hover:{mode:"label"},scales:{xAxes:[{type:"category",offset:!0,gridLines:{offsetGridLines:!0}}],yAxes:[{type:"linear"}]}}),Tr._set("global",{datasets:{bar:{categoryPercentage:.8,barPercentage:.9}}});var yl=Si.extend({dataElementType:Do.Rectangle,_dataElementOptions:["backgroundColor","borderColor","borderSkipped","borderWidth","barPercentage","barThickness","categoryPercentage","maxBarThickness","minBarLength"],initialize:function(){var E,N,h=this;Si.prototype.initialize.apply(h,arguments),(E=h.getMeta()).stack=h.getDataset().stack,E.bar=!0,N=h._getIndexScale().options,ra("bar chart",N.barPercentage,"scales.[x/y]Axes.barPercentage","dataset.barPercentage"),ra("bar chart",N.barThickness,"scales.[x/y]Axes.barThickness","dataset.barThickness"),ra("bar chart",N.categoryPercentage,"scales.[x/y]Axes.categoryPercentage","dataset.categoryPercentage"),ra("bar chart",h._getValueScale().options.minBarLength,"scales.[x/y]Axes.minBarLength","dataset.minBarLength"),ra("bar chart",N.maxBarThickness,"scales.[x/y]Axes.maxBarThickness","dataset.maxBarThickness")},update:function(h){var k,K,E=this,N=E.getMeta().data;for(E._ruler=E.getRuler(),k=0,K=N.length;k<K;++k)E.updateElement(N[k],k,h)},updateElement:function(h,E,N){var k=this,K=k.getMeta(),de=k.getDataset(),be=k._resolveDataElementOptions(h,E);h._xScale=k.getScaleForId(K.xAxisID),h._yScale=k.getScaleForId(K.yAxisID),h._datasetIndex=k.index,h._index=E,h._model={backgroundColor:be.backgroundColor,borderColor:be.borderColor,borderSkipped:be.borderSkipped,borderWidth:be.borderWidth,datasetLabel:de.label,label:k.chart.data.labels[E]},Ze.isArray(de.data[E])&&(h._model.borderSkipped=null),k._updateElementGeometry(h,E,N,be),h.pivot()},_updateElementGeometry:function(h,E,N,k){var K=this,de=h._model,be=K._getValueScale(),Ue=be.getBasePixel(),we=be.isHorizontal(),Xe=K._ruler||K.getRuler(),gt=K.calculateBarValuePixels(K.index,E,k),vt=K.calculateBarIndexPixels(K.index,E,Xe,k);de.horizontal=we,de.base=N?Ue:gt.base,de.x=we?N?Ue:gt.head:vt.center,de.y=we?vt.center:N?Ue:gt.head,de.height=we?vt.size:void 0,de.width=we?void 0:vt.size},_getStacks:function(h){var Ue,we,N=this._getIndexScale(),k=N._getMatchingVisibleMetas(this._type),K=N.options.stacked,de=k.length,be=[];for(Ue=0;Ue<de&&(we=k[Ue],(!1===K||-1===be.indexOf(we.stack)||void 0===K&&void 0===we.stack)&&be.push(we.stack),we.index!==h);++Ue);return be},getStackCount:function(){return this._getStacks().length},getStackIndex:function(h,E){var N=this._getStacks(h),k=void 0!==E?N.indexOf(E):-1;return-1===k?N.length-1:k},getRuler:function(){var k,K,h=this,E=h._getIndexScale(),N=[];for(k=0,K=h.getMeta().data.length;k<K;++k)N.push(E.getPixelForValue(null,k,h.index));return{pixels:N,start:E._startPixel,end:E._endPixel,stackCount:h.getStackCount(),scale:E}},calculateBarValuePixels:function(h,E,N){var jr,Ni,Vo,$o,Vs,qs,dl,k=this,K=k.chart,de=k._getValueScale(),be=de.isHorizontal(),Ue=K.data.datasets,we=de._getMatchingVisibleMetas(k._type),Xe=de._parseValue(Ue[h].data[E]),gt=N.minBarLength,vt=de.options.stacked,Jt=k.getMeta().stack,Pn=void 0===Xe.start?0:Xe.max>=0&&Xe.min>=0?Xe.min:Xe.max,Rn=void 0===Xe.start?Xe.end:Xe.max>=0&&Xe.min>=0?Xe.max-Xe.min:Xe.min-Xe.max,sr=we.length;if(vt||void 0===vt&&void 0!==Jt)for(jr=0;jr<sr&&(Ni=we[jr]).index!==h;++jr)Ni.stack===Jt&&(Vo=void 0===(dl=de._parseValue(Ue[Ni.index].data[E])).start?dl.end:dl.min>=0&&dl.max>=0?dl.max:dl.min,(Xe.min<0&&Vo<0||Xe.max>=0&&Vo>0)&&(Pn+=Vo));return $o=de.getPixelForValue(Pn),qs=(Vs=de.getPixelForValue(Pn+Rn))-$o,void 0!==gt&&Math.abs(qs)<gt&&(qs=gt,Vs=Rn>=0&&!be||Rn<0&&be?$o-gt:$o+gt),{size:qs,base:$o,head:Vs,center:Vs+qs/2}},calculateBarIndexPixels:function(h,E,N,k){var de="flex"===k.barThickness?function(h,E,N){var we,k=E.pixels,K=k[h],de=h>0?k[h-1]:null,be=h<k.length-1?k[h+1]:null,Ue=N.categoryPercentage;return null===de&&(de=K-(null===be?E.end-E.start:be-K)),null===be&&(be=K+K-de),we=K-(K-Math.min(de,be))/2*Ue,{chunk:Math.abs(be-de)/2*Ue/E.stackCount,ratio:N.barPercentage,start:we}}(E,N,k):Bs(E,N,k),be=this.getStackIndex(h,this.getMeta().stack),Ue=de.start+de.chunk*be+de.chunk/2,we=Math.min(Ia(k.maxBarThickness,1/0),de.chunk*de.ratio);return{base:Ue-we/2,head:Ue+we/2,center:Ue,size:we}},draw:function(){var h=this,E=h.chart,N=h._getValueScale(),k=h.getMeta().data,K=h.getDataset(),de=k.length,be=0;for(Ze.canvas.clipArea(E.ctx,E.chartArea);be<de;++be){var Ue=N._parseValue(K.data[be]);!isNaN(Ue.min)&&!isNaN(Ue.max)&&k[be].draw()}Ze.canvas.unclipArea(E.ctx)},_resolveDataElementOptions:function(){var h=this,E=Ze.extend({},Si.prototype._resolveDataElementOptions.apply(h,arguments)),N=h._getIndexScale().options,k=h._getValueScale().options;return E.barPercentage=Ia(N.barPercentage,E.barPercentage),E.barThickness=Ia(N.barThickness,E.barThickness),E.categoryPercentage=Ia(N.categoryPercentage,E.categoryPercentage),E.maxBarThickness=Ia(N.maxBarThickness,E.maxBarThickness),E.minBarLength=Ia(k.minBarLength,E.minBarLength),E}}),fo=Ze.valueOrDefault,Da=Ze.options.resolve;Tr._set("bubble",{hover:{mode:"single"},scales:{xAxes:[{type:"linear",position:"bottom",id:"x-axis-0"}],yAxes:[{type:"linear",position:"left",id:"y-axis-0"}]},tooltips:{callbacks:{title:function(){return""},label:function(h,E){return(E.datasets[h.datasetIndex].label||"")+": ("+h.xLabel+", "+h.yLabel+", "+E.datasets[h.datasetIndex].data[h.index].r+")"}}}});var Ao=Si.extend({dataElementType:Do.Point,_dataElementOptions:["backgroundColor","borderColor","borderWidth","hoverBackgroundColor","hoverBorderColor","hoverBorderWidth","hoverRadius","hitRadius","pointStyle","rotation"],update:function(h){var E=this,N=E.getMeta();Ze.each(N.data,function(K,de){E.updateElement(K,de,h)})},updateElement:function(h,E,N){var k=this,K=k.getMeta(),de=h.custom||{},be=k.getScaleForId(K.xAxisID),Ue=k.getScaleForId(K.yAxisID),we=k._resolveDataElementOptions(h,E),Xe=k.getDataset().data[E],gt=k.index,vt=N?be.getPixelForDecimal(.5):be.getPixelForValue("object"==typeof Xe?Xe:NaN,E,gt),Jt=N?Ue.getBasePixel():Ue.getPixelForValue(Xe,E,gt);h._xScale=be,h._yScale=Ue,h._options=we,h._datasetIndex=gt,h._index=E,h._model={backgroundColor:we.backgroundColor,borderColor:we.borderColor,borderWidth:we.borderWidth,hitRadius:we.hitRadius,pointStyle:we.pointStyle,rotation:we.rotation,radius:N?0:we.radius,skip:de.skip||isNaN(vt)||isNaN(Jt),x:vt,y:Jt},h.pivot()},setHoverStyle:function(h){var E=h._model,N=h._options,k=Ze.getHoverColor;h.$previousStyle={backgroundColor:E.backgroundColor,borderColor:E.borderColor,borderWidth:E.borderWidth,radius:E.radius},E.backgroundColor=fo(N.hoverBackgroundColor,k(N.backgroundColor)),E.borderColor=fo(N.hoverBorderColor,k(N.borderColor)),E.borderWidth=fo(N.hoverBorderWidth,N.borderWidth),E.radius=N.radius+N.hoverRadius},_resolveDataElementOptions:function(h,E){var N=this,k=N.chart,K=N.getDataset(),de=h.custom||{},be=K.data[E]||{},Ue=Si.prototype._resolveDataElementOptions.apply(N,arguments),we={chart:k,dataIndex:E,dataset:K,datasetIndex:N.index};return N._cachedDataOpts===Ue&&(Ue=Ze.extend({},Ue)),Ue.radius=Da([de.radius,be.r,N._config.radius,k.options.elements.point.radius],we,E),Ue}}),ls=Ze.valueOrDefault,gs=Math.PI,Ra=2*gs,pl=gs/2;Tr._set("doughnut",{animation:{animateRotate:!0,animateScale:!1},hover:{mode:"single"},legendCallback:function(h){var de,be,Ue,E=document.createElement("ul"),N=h.data,k=N.datasets,K=N.labels;if(E.setAttribute("class",h.id+"-legend"),k.length)for(de=0,be=k[0].data.length;de<be;++de)(Ue=E.appendChild(document.createElement("li"))).appendChild(document.createElement("span")).style.backgroundColor=k[0].backgroundColor[de],K[de]&&Ue.appendChild(document.createTextNode(K[de]));return E.outerHTML},legend:{labels:{generateLabels:function(h){var E=h.data;return E.labels.length&&E.datasets.length?E.labels.map(function(N,k){var K=h.getDatasetMeta(0),de=K.controller.getStyle(k);return{text:N,fillStyle:de.backgroundColor,strokeStyle:de.borderColor,lineWidth:de.borderWidth,hidden:isNaN(E.datasets[0].data[k])||K.data[k].hidden,index:k}}):[]}},onClick:function(h,E){var K,de,be,N=E.index,k=this.chart;for(K=0,de=(k.data.datasets||[]).length;K<de;++K)(be=k.getDatasetMeta(K)).data[N]&&(be.data[N].hidden=!be.data[N].hidden);k.update()}},cutoutPercentage:50,rotation:-pl,circumference:Ra,tooltips:{callbacks:{title:function(){return""},label:function(h,E){var N=E.labels[h.index],k=": "+E.datasets[h.datasetIndex].data[h.index];return Ze.isArray(N)?(N=N.slice())[0]+=k:N+=k,N}}}});var Qs=Si.extend({dataElementType:Do.Arc,linkScales:Ze.noop,_dataElementOptions:["backgroundColor","borderColor","borderWidth","borderAlign","hoverBackgroundColor","hoverBorderColor","hoverBorderWidth"],getRingIndex:function(h){for(var E=0,N=0;N<h;++N)this.chart.isDatasetVisible(N)&&++E;return E},update:function(h){var jr,Ni,E=this,N=E.chart,k=N.chartArea,K=N.options,de=1,be=1,Ue=0,we=0,Xe=E.getMeta(),gt=Xe.data,vt=K.cutoutPercentage/100||0,Jt=K.circumference,Pn=E._getRingWeight(E.index);if(Jt<Ra){var Vo=K.rotation%Ra,$o=(Vo+=Vo>=gs?-Ra:Vo<-gs?Ra:0)+Jt,Vs=Math.cos(Vo),qs=Math.sin(Vo),dl=Math.cos($o),ga=Math.sin($o),sa=Vo<=0&&$o>=0||$o>=Ra,Pa=Vo<=pl&&$o>=pl||$o>=Ra+pl,Eu=Vo<=-pl&&$o>=-pl||$o>=gs+pl,wa=Vo===-gs||$o>=gs?-1:Math.min(Vs,Vs*vt,dl,dl*vt),au=Eu?-1:Math.min(qs,qs*vt,ga,ga*vt),mu=sa?1:Math.max(Vs,Vs*vt,dl,dl*vt),xc=Pa?1:Math.max(qs,qs*vt,ga,ga*vt);de=(mu-wa)/2,be=(xc-au)/2,Ue=-(mu+wa)/2,we=-(xc+au)/2}for(jr=0,Ni=gt.length;jr<Ni;++jr)gt[jr]._options=E._resolveDataElementOptions(gt[jr],jr);for(N.borderWidth=E.getMaxBorderWidth(),N.outerRadius=Math.max(Math.min((k.right-k.left-N.borderWidth)/de,(k.bottom-k.top-N.borderWidth)/be)/2,0),N.innerRadius=Math.max(N.outerRadius*vt,0),N.radiusLength=(N.outerRadius-N.innerRadius)/(E._getVisibleDatasetWeightTotal()||1),N.offsetX=Ue*N.outerRadius,N.offsetY=we*N.outerRadius,Xe.total=E.calculateTotal(),E.outerRadius=N.outerRadius-N.radiusLength*E._getRingWeightOffset(E.index),E.innerRadius=Math.max(E.outerRadius-N.radiusLength*Pn,0),jr=0,Ni=gt.length;jr<Ni;++jr)E.updateElement(gt[jr],jr,h)},updateElement:function(h,E,N){var k=this,K=k.chart,de=K.chartArea,be=K.options,Ue=be.animation,we=(de.left+de.right)/2,Xe=(de.top+de.bottom)/2,gt=be.rotation,vt=be.rotation,Jt=k.getDataset(),Pn=N&&Ue.animateRotate||h.hidden?0:k.calculateCircumference(Jt.data[E])*(be.circumference/Ra),jr=h._options||{};Ze.extend(h,{_datasetIndex:k.index,_index:E,_model:{backgroundColor:jr.backgroundColor,borderColor:jr.borderColor,borderWidth:jr.borderWidth,borderAlign:jr.borderAlign,x:we+K.offsetX,y:Xe+K.offsetY,startAngle:gt,endAngle:vt,circumference:Pn,outerRadius:N&&Ue.animateScale?0:k.outerRadius,innerRadius:N&&Ue.animateScale?0:k.innerRadius,label:Ze.valueAtIndexOrDefault(Jt.label,E,K.data.labels[E])}});var Ni=h._model;(!N||!Ue.animateRotate)&&(Ni.startAngle=0===E?be.rotation:k.getMeta().data[E-1]._model.endAngle,Ni.endAngle=Ni.startAngle+Ni.circumference),h.pivot()},calculateTotal:function(){var k,h=this.getDataset(),E=this.getMeta(),N=0;return Ze.each(E.data,function(K,de){k=h.data[de],!isNaN(k)&&!K.hidden&&(N+=Math.abs(k))}),N},calculateCircumference:function(h){var E=this.getMeta().total;return E>0&&!isNaN(h)?Ra*(Math.abs(h)/E):0},getMaxBorderWidth:function(h){var K,de,be,Ue,we,Xe,gt,vt,N=0,k=this.chart;if(!h)for(K=0,de=k.data.datasets.length;K<de;++K)if(k.isDatasetVisible(K)){h=(be=k.getDatasetMeta(K)).data,K!==this.index&&(we=be.controller);break}if(!h)return 0;for(K=0,de=h.length;K<de;++K)Ue=h[K],we?(we._configure(),Xe=we._resolveDataElementOptions(Ue,K)):Xe=Ue._options,"inner"!==Xe.borderAlign&&(N=(vt=Xe.hoverBorderWidth)>(N=(gt=Xe.borderWidth)>N?gt:N)?vt:N);return N},setHoverStyle:function(h){var E=h._model,N=h._options,k=Ze.getHoverColor;h.$previousStyle={backgroundColor:E.backgroundColor,borderColor:E.borderColor,borderWidth:E.borderWidth},E.backgroundColor=ls(N.hoverBackgroundColor,k(N.backgroundColor)),E.borderColor=ls(N.hoverBorderColor,k(N.borderColor)),E.borderWidth=ls(N.hoverBorderWidth,N.borderWidth)},_getRingWeightOffset:function(h){for(var E=0,N=0;N<h;++N)this.chart.isDatasetVisible(N)&&(E+=this._getRingWeight(N));return E},_getRingWeight:function(h){return Math.max(ls(this.chart.data.datasets[h].weight,1),0)},_getVisibleDatasetWeightTotal:function(){return this._getRingWeightOffset(this.chart.data.datasets.length)}});Tr._set("horizontalBar",{hover:{mode:"index",axis:"y"},scales:{xAxes:[{type:"linear",position:"bottom"}],yAxes:[{type:"category",position:"left",offset:!0,gridLines:{offsetGridLines:!0}}]},elements:{rectangle:{borderSkipped:"left"}},tooltips:{mode:"index",axis:"y"}}),Tr._set("global",{datasets:{horizontalBar:{categoryPercentage:.8,barPercentage:.9}}});var Fo=yl.extend({_getValueScaleId:function(){return this.getMeta().xAxisID},_getIndexScaleId:function(){return this.getMeta().yAxisID}}),Eo=Ze.valueOrDefault,ks=Ze.options.resolve,ms=Ze.canvas._isPointInArea;function Co(h,E){var N=h&&h.options.ticks||{},k=N.reverse,K=void 0===N.min?E:0,de=void 0===N.max?E:0;return{start:k?de:K,end:k?K:de}}function kr(h,E,N){var k=N/2,K=Co(h,k),de=Co(E,k);return{top:de.end,right:K.end,bottom:de.start,left:K.start}}function ro(h){var E,N,k,K;return Ze.isObject(h)?(E=h.top,N=h.right,k=h.bottom,K=h.left):E=N=k=K=h,{top:E,right:N,bottom:k,left:K}}Tr._set("line",{showLines:!0,spanGaps:!1,hover:{mode:"label"},scales:{xAxes:[{type:"category",id:"x-axis-0"}],yAxes:[{type:"linear",id:"y-axis-0"}]}});var tt=Si.extend({datasetElementType:Do.Line,dataElementType:Do.Point,_datasetElementOptions:["backgroundColor","borderCapStyle","borderColor","borderDash","borderDashOffset","borderJoinStyle","borderWidth","cubicInterpolationMode","fill"],_dataElementOptions:{backgroundColor:"pointBackgroundColor",borderColor:"pointBorderColor",borderWidth:"pointBorderWidth",hitRadius:"pointHitRadius",hoverBackgroundColor:"pointHoverBackgroundColor",hoverBorderColor:"pointHoverBorderColor",hoverBorderWidth:"pointHoverBorderWidth",hoverRadius:"pointHoverRadius",pointStyle:"pointStyle",radius:"pointRadius",rotation:"pointRotation"},update:function(h){var we,Xe,E=this,N=E.getMeta(),k=N.dataset,K=N.data||[],be=E._config,Ue=E._showLine=Eo(be.showLine,E.chart.options.showLines);for(E._xScale=E.getScaleForId(N.xAxisID),E._yScale=E.getScaleForId(N.yAxisID),Ue&&(void 0!==be.tension&&void 0===be.lineTension&&(be.lineTension=be.tension),k._scale=E._yScale,k._datasetIndex=E.index,k._children=K,k._model=E._resolveDatasetElementOptions(k),k.pivot()),we=0,Xe=K.length;we<Xe;++we)E.updateElement(K[we],we,h);for(Ue&&0!==k._model.tension&&E.updateBezierControlPoints(),we=0,Xe=K.length;we<Xe;++we)K[we].pivot()},updateElement:function(h,E,N){var Jt,Pn,k=this,K=k.getMeta(),de=h.custom||{},be=k.getDataset(),Ue=k.index,we=be.data[E],Xe=k._xScale,gt=k._yScale,vt=K.dataset._model,Rn=k._resolveDataElementOptions(h,E);Jt=Xe.getPixelForValue("object"==typeof we?we:NaN,E,Ue),Pn=N?gt.getBasePixel():k.calculatePointY(we,E,Ue),h._xScale=Xe,h._yScale=gt,h._options=Rn,h._datasetIndex=Ue,h._index=E,h._model={x:Jt,y:Pn,skip:de.skip||isNaN(Jt)||isNaN(Pn),radius:Rn.radius,pointStyle:Rn.pointStyle,rotation:Rn.rotation,backgroundColor:Rn.backgroundColor,borderColor:Rn.borderColor,borderWidth:Rn.borderWidth,tension:Eo(de.tension,vt?vt.tension:0),steppedLine:!!vt&&vt.steppedLine,hitRadius:Rn.hitRadius}},_resolveDatasetElementOptions:function(h){var E=this,N=E._config,k=h.custom||{},K=E.chart.options,de=K.elements.line,be=Si.prototype._resolveDatasetElementOptions.apply(E,arguments);return be.spanGaps=Eo(N.spanGaps,K.spanGaps),be.tension=Eo(N.lineTension,de.tension),be.steppedLine=ks([k.steppedLine,N.steppedLine,de.stepped]),be.clip=ro(Eo(N.clip,kr(E._xScale,E._yScale,be.borderWidth))),be},calculatePointY:function(h,E,N){var we,gt,vt,Jt,Pn,Rn,K=this.chart,de=this._yScale,be=0,Ue=0;if(de.options.stacked){for(Jt=+de.getRightValue(h),Rn=(Pn=K._getSortedVisibleDatasetMetas()).length,we=0;we<Rn&&(gt=Pn[we]).index!==N;++we)"line"===gt.type&&gt.yAxisID===de.id&&((vt=+de.getRightValue(K.data.datasets[gt.index].data[E]))<0?Ue+=vt||0:be+=vt||0);return de.getPixelForValue(Jt<0?Ue+Jt:be+Jt)}return de.getPixelForValue(h)},updateBezierControlPoints:function(){var be,Ue,we,Xe,E=this.chart,N=this.getMeta(),k=N.dataset._model,K=E.chartArea,de=N.data||[];function gt(vt,Jt,Pn){return Math.max(Math.min(vt,Pn),Jt)}if(k.spanGaps&&(de=de.filter(function(vt){return!vt._model.skip})),"monotone"===k.cubicInterpolationMode)Ze.splineCurveMonotone(de);else for(be=0,Ue=de.length;be<Ue;++be)we=de[be]._model,Xe=Ze.splineCurve(Ze.previousItem(de,be)._model,we,Ze.nextItem(de,be)._model,k.tension),we.controlPointPreviousX=Xe.previous.x,we.controlPointPreviousY=Xe.previous.y,we.controlPointNextX=Xe.next.x,we.controlPointNextY=Xe.next.y;if(E.options.elements.line.capBezierPoints)for(be=0,Ue=de.length;be<Ue;++be)ms(we=de[be]._model,K)&&(be>0&&ms(de[be-1]._model,K)&&(we.controlPointPreviousX=gt(we.controlPointPreviousX,K.left,K.right),we.controlPointPreviousY=gt(we.controlPointPreviousY,K.top,K.bottom)),be<de.length-1&&ms(de[be+1]._model,K)&&(we.controlPointNextX=gt(we.controlPointNextX,K.left,K.right),we.controlPointNextY=gt(we.controlPointNextY,K.top,K.bottom)))},draw:function(){var we,h=this,E=h.chart,N=h.getMeta(),k=N.data||[],K=E.chartArea,de=E.canvas,be=0,Ue=k.length;for(h._showLine&&(Ze.canvas.clipArea(E.ctx,{left:!1===(we=N.dataset._model.clip).left?0:K.left-we.left,right:!1===we.right?de.width:K.right+we.right,top:!1===we.top?0:K.top-we.top,bottom:!1===we.bottom?de.height:K.bottom+we.bottom}),N.dataset.draw(),Ze.canvas.unclipArea(E.ctx));be<Ue;++be)k[be].draw(K)},setHoverStyle:function(h){var E=h._model,N=h._options,k=Ze.getHoverColor;h.$previousStyle={backgroundColor:E.backgroundColor,borderColor:E.borderColor,borderWidth:E.borderWidth,radius:E.radius},E.backgroundColor=Eo(N.hoverBackgroundColor,k(N.backgroundColor)),E.borderColor=Eo(N.hoverBorderColor,k(N.borderColor)),E.borderWidth=Eo(N.hoverBorderWidth,N.borderWidth),E.radius=Eo(N.hoverRadius,N.radius)}}),on=Ze.options.resolve;Tr._set("polarArea",{scale:{type:"radialLinear",angleLines:{display:!1},gridLines:{circular:!0},pointLabels:{display:!1},ticks:{beginAtZero:!0}},animation:{animateRotate:!0,animateScale:!0},startAngle:-.5*Math.PI,legendCallback:function(h){var de,be,Ue,E=document.createElement("ul"),N=h.data,k=N.datasets,K=N.labels;if(E.setAttribute("class",h.id+"-legend"),k.length)for(de=0,be=k[0].data.length;de<be;++de)(Ue=E.appendChild(document.createElement("li"))).appendChild(document.createElement("span")).style.backgroundColor=k[0].backgroundColor[de],K[de]&&Ue.appendChild(document.createTextNode(K[de]));return E.outerHTML},legend:{labels:{generateLabels:function(h){var E=h.data;return E.labels.length&&E.datasets.length?E.labels.map(function(N,k){var K=h.getDatasetMeta(0),de=K.controller.getStyle(k);return{text:N,fillStyle:de.backgroundColor,strokeStyle:de.borderColor,lineWidth:de.borderWidth,hidden:isNaN(E.datasets[0].data[k])||K.data[k].hidden,index:k}}):[]}},onClick:function(h,E){var K,de,be,N=E.index,k=this.chart;for(K=0,de=(k.data.datasets||[]).length;K<de;++K)(be=k.getDatasetMeta(K)).data[N].hidden=!be.data[N].hidden;k.update()}},tooltips:{callbacks:{title:function(){return""},label:function(h,E){return E.labels[h.index]+": "+h.yLabel}}}});var ne=Si.extend({dataElementType:Do.Arc,linkScales:Ze.noop,_dataElementOptions:["backgroundColor","borderColor","borderWidth","borderAlign","hoverBackgroundColor","hoverBorderColor","hoverBorderWidth"],_getIndexScaleId:function(){return this.chart.scale.id},_getValueScaleId:function(){return this.chart.scale.id},update:function(h){var we,Xe,gt,E=this,N=E.getDataset(),k=E.getMeta(),K=E.chart.options.startAngle||0,de=E._starts=[],be=E._angles=[],Ue=k.data;for(E._updateRadius(),k.count=E.countVisibleElements(),we=0,Xe=N.data.length;we<Xe;we++)de[we]=K,gt=E._computeAngle(we),be[we]=gt,K+=gt;for(we=0,Xe=Ue.length;we<Xe;++we)Ue[we]._options=E._resolveDataElementOptions(Ue[we],we),E.updateElement(Ue[we],we,h)},_updateRadius:function(){var h=this,E=h.chart,N=E.chartArea,k=E.options,K=Math.min(N.right-N.left,N.bottom-N.top);E.outerRadius=Math.max(K/2,0),E.innerRadius=Math.max(k.cutoutPercentage?E.outerRadius/100*k.cutoutPercentage:1,0),E.radiusLength=(E.outerRadius-E.innerRadius)/E.getVisibleDatasetCount(),h.outerRadius=E.outerRadius-E.radiusLength*h.index,h.innerRadius=h.outerRadius-E.radiusLength},updateElement:function(h,E,N){var k=this,K=k.chart,de=k.getDataset(),be=K.options,Ue=be.animation,we=K.scale,Xe=K.data.labels,gt=we.xCenter,vt=we.yCenter,Jt=be.startAngle,Pn=h.hidden?0:we.getDistanceFromCenterForValue(de.data[E]),Rn=k._starts[E],sr=Rn+(h.hidden?0:k._angles[E]),jr=Ue.animateScale?0:we.getDistanceFromCenterForValue(de.data[E]),Ni=h._options||{};Ze.extend(h,{_datasetIndex:k.index,_index:E,_scale:we,_model:{backgroundColor:Ni.backgroundColor,borderColor:Ni.borderColor,borderWidth:Ni.borderWidth,borderAlign:Ni.borderAlign,x:gt,y:vt,innerRadius:0,outerRadius:N?jr:Pn,startAngle:N&&Ue.animateRotate?Jt:Rn,endAngle:N&&Ue.animateRotate?Jt:sr,label:Ze.valueAtIndexOrDefault(Xe,E,Xe[E])}}),h.pivot()},countVisibleElements:function(){var h=this.getDataset(),E=this.getMeta(),N=0;return Ze.each(E.data,function(k,K){!isNaN(h.data[K])&&!k.hidden&&N++}),N},setHoverStyle:function(h){var E=h._model,N=h._options,k=Ze.getHoverColor,K=Ze.valueOrDefault;h.$previousStyle={backgroundColor:E.backgroundColor,borderColor:E.borderColor,borderWidth:E.borderWidth},E.backgroundColor=K(N.hoverBackgroundColor,k(N.backgroundColor)),E.borderColor=K(N.hoverBorderColor,k(N.borderColor)),E.borderWidth=K(N.hoverBorderWidth,N.borderWidth)},_computeAngle:function(h){var E=this,N=this.getMeta().count,k=E.getDataset(),K=E.getMeta();return isNaN(k.data[h])||K.data[h].hidden?0:on([E.chart.options.elements.arc.angle,2*Math.PI/N],{chart:E.chart,dataIndex:h,dataset:k,datasetIndex:E.index},h)}});Tr._set("pie",Ze.clone(Tr.doughnut)),Tr._set("pie",{cutoutPercentage:0});var $e=Qs,Pt=Ze.valueOrDefault;Tr._set("radar",{spanGaps:!1,scale:{type:"radialLinear"},elements:{line:{fill:"start",tension:0}}});var sn=Si.extend({datasetElementType:Do.Line,dataElementType:Do.Point,linkScales:Ze.noop,_datasetElementOptions:["backgroundColor","borderWidth","borderColor","borderCapStyle","borderDash","borderDashOffset","borderJoinStyle","fill"],_dataElementOptions:{backgroundColor:"pointBackgroundColor",borderColor:"pointBorderColor",borderWidth:"pointBorderWidth",hitRadius:"pointHitRadius",hoverBackgroundColor:"pointHoverBackgroundColor",hoverBorderColor:"pointHoverBorderColor",hoverBorderWidth:"pointHoverBorderWidth",hoverRadius:"pointHoverRadius",pointStyle:"pointStyle",radius:"pointRadius",rotation:"pointRotation"},_getIndexScaleId:function(){return this.chart.scale.id},_getValueScaleId:function(){return this.chart.scale.id},update:function(h){var Ue,we,E=this,N=E.getMeta(),k=N.dataset,K=N.data||[],de=E.chart.scale,be=E._config;for(void 0!==be.tension&&void 0===be.lineTension&&(be.lineTension=be.tension),k._scale=de,k._datasetIndex=E.index,k._children=K,k._loop=!0,k._model=E._resolveDatasetElementOptions(k),k.pivot(),Ue=0,we=K.length;Ue<we;++Ue)E.updateElement(K[Ue],Ue,h);for(E.updateBezierControlPoints(),Ue=0,we=K.length;Ue<we;++Ue)K[Ue].pivot()},updateElement:function(h,E,N){var k=this,K=h.custom||{},de=k.getDataset(),be=k.chart.scale,Ue=be.getPointPositionForValue(E,de.data[E]),we=k._resolveDataElementOptions(h,E),Xe=k.getMeta().dataset._model,gt=N?be.xCenter:Ue.x,vt=N?be.yCenter:Ue.y;h._scale=be,h._options=we,h._datasetIndex=k.index,h._index=E,h._model={x:gt,y:vt,skip:K.skip||isNaN(gt)||isNaN(vt),radius:we.radius,pointStyle:we.pointStyle,rotation:we.rotation,backgroundColor:we.backgroundColor,borderColor:we.borderColor,borderWidth:we.borderWidth,tension:Pt(K.tension,Xe?Xe.tension:0),hitRadius:we.hitRadius}},_resolveDatasetElementOptions:function(){var h=this,E=h._config,N=h.chart.options,k=Si.prototype._resolveDatasetElementOptions.apply(h,arguments);return k.spanGaps=Pt(E.spanGaps,N.spanGaps),k.tension=Pt(E.lineTension,N.elements.line.tension),k},updateBezierControlPoints:function(){var K,de,be,Ue,E=this.getMeta(),N=this.chart.chartArea,k=E.data||[];function we(Xe,gt,vt){return Math.max(Math.min(Xe,vt),gt)}for(E.dataset._model.spanGaps&&(k=k.filter(function(Xe){return!Xe._model.skip})),K=0,de=k.length;K<de;++K)be=k[K]._model,Ue=Ze.splineCurve(Ze.previousItem(k,K,!0)._model,be,Ze.nextItem(k,K,!0)._model,be.tension),be.controlPointPreviousX=we(Ue.previous.x,N.left,N.right),be.controlPointPreviousY=we(Ue.previous.y,N.top,N.bottom),be.controlPointNextX=we(Ue.next.x,N.left,N.right),be.controlPointNextY=we(Ue.next.y,N.top,N.bottom)},setHoverStyle:function(h){var E=h._model,N=h._options,k=Ze.getHoverColor;h.$previousStyle={backgroundColor:E.backgroundColor,borderColor:E.borderColor,borderWidth:E.borderWidth,radius:E.radius},E.backgroundColor=Pt(N.hoverBackgroundColor,k(N.backgroundColor)),E.borderColor=Pt(N.hoverBorderColor,k(N.borderColor)),E.borderWidth=Pt(N.hoverBorderWidth,N.borderWidth),E.radius=Pt(N.hoverRadius,N.radius)}});Tr._set("scatter",{hover:{mode:"single"},scales:{xAxes:[{id:"x-axis-1",type:"linear",position:"bottom"}],yAxes:[{id:"y-axis-1",type:"linear",position:"left"}]},tooltips:{callbacks:{title:function(){return""},label:function(h){return"("+h.xLabel+", "+h.yLabel+")"}}}}),Tr._set("global",{datasets:{scatter:{showLine:!1}}});var fi={bar:yl,bubble:Ao,doughnut:Qs,horizontalBar:Fo,line:tt,polarArea:ne,pie:$e,radar:sn,scatter:tt};function Oi(h,E){return h.native?{x:h.x,y:h.y}:Ze.getRelativePosition(h,E)}function os(h,E){var k,K,de,be,Ue,we,N=h._getSortedVisibleDatasetMetas();for(K=0,be=N.length;K<be;++K)for(de=0,Ue=(k=N[K].data).length;de<Ue;++de)(we=k[de])._view.skip||E(we)}function Ro(h,E){var N=[];return os(h,function(k){k.inRange(E.x,E.y)&&N.push(k)}),N}function Uo(h,E,N,k){var K=Number.POSITIVE_INFINITY,de=[];return os(h,function(be){if(!N||be.inRange(E.x,E.y)){var Ue=be.getCenterPoint(),we=k(E,Ue);we<K?(de=[be],K=we):we===K&&de.push(be)}}),de}function To(h){var E=-1!==h.indexOf("x"),N=-1!==h.indexOf("y");return function(k,K){var de=E?Math.abs(k.x-K.x):0,be=N?Math.abs(k.y-K.y):0;return Math.sqrt(Math.pow(de,2)+Math.pow(be,2))}}function Ea(h,E,N){var k=Oi(E,h);N.axis=N.axis||"x";var K=To(N.axis),de=N.intersect?Ro(h,k):Uo(h,k,!1,K),be=[];return de.length?(h._getSortedVisibleDatasetMetas().forEach(function(Ue){var we=Ue.data[de[0]._index];we&&!we._view.skip&&be.push(we)}),be):[]}var al={modes:{single:function(h,E){var N=Oi(E,h),k=[];return os(h,function(K){if(K.inRange(N.x,N.y))return k.push(K),k}),k.slice(0,1)},label:Ea,index:Ea,dataset:function(h,E,N){var k=Oi(E,h);N.axis=N.axis||"xy";var K=To(N.axis),de=N.intersect?Ro(h,k):Uo(h,k,!1,K);return de.length>0&&(de=h.getDatasetMeta(de[0]._datasetIndex).data),de},"x-axis":function(h,E){return Ea(h,E,{intersect:!1})},point:function(h,E){return Ro(h,Oi(E,h))},nearest:function(h,E,N){var k=Oi(E,h);N.axis=N.axis||"xy";var K=To(N.axis);return Uo(h,k,N.intersect,K)},x:function(h,E,N){var k=Oi(E,h),K=[],de=!1;return os(h,function(be){be.inXRange(k.x)&&K.push(be),be.inRange(k.x,k.y)&&(de=!0)}),N.intersect&&!de&&(K=[]),K},y:function(h,E,N){var k=Oi(E,h),K=[],de=!1;return os(h,function(be){be.inYRange(k.y)&&K.push(be),be.inRange(k.x,k.y)&&(de=!0)}),N.intersect&&!de&&(K=[]),K}}},qu=Ze.extend;function Ru(h,E){return Ze.where(h,function(N){return N.pos===E})}function yc(h,E){return h.sort(function(N,k){var K=E?k:N,de=E?N:k;return K.weight===de.weight?K.index-de.index:K.weight-de.weight})}function Zl(h,E,N,k){return Math.max(h[N],E[N])+Math.max(h[k],E[k])}function $s(h,E,N){var de,be,k=N.box,K=h.maxPadding;if(N.size&&(h[N.pos]-=N.size),N.size=N.horizontal?k.height:k.width,h[N.pos]+=N.size,k.getPadding){var Ue=k.getPadding();K.top=Math.max(K.top,Ue.top),K.left=Math.max(K.left,Ue.left),K.bottom=Math.max(K.bottom,Ue.bottom),K.right=Math.max(K.right,Ue.right)}if(de=E.outerWidth-Zl(K,h,"left","right"),be=E.outerHeight-Zl(K,h,"top","bottom"),de!==h.w||be!==h.h){h.w=de,h.h=be;var we=N.horizontal?[de,h.w]:[be,h.h];return!(we[0]===we[1]||isNaN(we[0])&&isNaN(we[1]))}}function ou(h,E){var de,N=E.maxPadding;return de={left:0,top:0,right:0,bottom:0},(h?["left","right"]:["top","bottom"]).forEach(function(be){de[be]=Math.max(E[be],N[be])}),de}function el(h,E,N){var K,de,be,Ue,we,Xe,k=[];for(K=0,de=h.length;K<de;++K)(Ue=(be=h[K]).box).update(be.width||E.w,be.height||E.h,ou(be.horizontal,E)),$s(E,N,be)&&(Xe=!0,k.length&&(we=!0)),Ue.fullWidth||k.push(be);return we&&el(k,E,N)||Xe}function Cu(h,E,N){var be,Ue,we,Xe,k=N.padding,K=E.x,de=E.y;for(be=0,Ue=h.length;be<Ue;++be)Xe=(we=h[be]).box,we.horizontal?(Xe.left=Xe.fullWidth?k.left:E.left,Xe.right=Xe.fullWidth?N.outerWidth-k.right:E.left+E.w,Xe.top=de,Xe.bottom=de+Xe.height,Xe.width=Xe.right-Xe.left,de=Xe.bottom):(Xe.left=K,Xe.right=K+Xe.width,Xe.top=E.top,Xe.bottom=E.top+E.h,Xe.height=Xe.bottom-Xe.top,K=Xe.right);E.x=K,E.y=de}Tr._set("global",{layout:{padding:{top:0,right:0,bottom:0,left:0}}});var jl={defaults:{},addBox:function(h,E){h.boxes||(h.boxes=[]),E.fullWidth=E.fullWidth||!1,E.position=E.position||"top",E.weight=E.weight||0,E._layers=E._layers||function(){return[{z:0,draw:function(){E.draw.apply(E,arguments)}}]},h.boxes.push(E)},removeBox:function(h,E){var N=h.boxes?h.boxes.indexOf(E):-1;-1!==N&&h.boxes.splice(N,1)},configure:function(h,E,N){for(var be,k=["fullWidth","position","weight"],K=k.length,de=0;de<K;++de)N.hasOwnProperty(be=k[de])&&(E[be]=N[be])},update:function(h,E,N){if(h){var K=Ze.options.toPadding((h.options.layout||{}).padding),de=E-K.width,be=N-K.height,Ue=function(h){var E=function(h){var N,k,K,E=[];for(N=0,k=(h||[]).length;N<k;++N)E.push({index:N,box:K=h[N],pos:K.position,horizontal:K.isHorizontal(),weight:K.weight});return E}(h),N=yc(Ru(E,"left"),!0),k=yc(Ru(E,"right")),K=yc(Ru(E,"top"),!0),de=yc(Ru(E,"bottom"));return{leftAndTop:N.concat(K),rightAndBottom:k.concat(de),chartArea:Ru(E,"chartArea"),vertical:N.concat(k),horizontal:K.concat(de)}}(h.boxes),we=Ue.vertical,Xe=Ue.horizontal,gt=Object.freeze({outerWidth:E,outerHeight:N,padding:K,availableWidth:de,vBoxMaxWidth:de/2/we.length,hBoxMaxHeight:be/2}),vt=qu({maxPadding:qu({},K),w:de,h:be,x:K.left,y:K.top},K);(function(h,E){var N,k,K;for(N=0,k=h.length;N<k;++N)(K=h[N]).width=K.horizontal?K.box.fullWidth&&E.availableWidth:E.vBoxMaxWidth,K.height=K.horizontal&&E.hBoxMaxHeight})(we.concat(Xe),gt),el(we,vt,gt),el(Xe,vt,gt)&&el(we,vt,gt),function(h){var E=h.maxPadding;function N(k){var K=Math.max(E[k]-h[k],0);return h[k]+=K,K}h.y+=N("top"),h.x+=N("left"),N("right"),N("bottom")}(vt),Cu(Ue.leftAndTop,vt,gt),vt.x+=vt.w,vt.y+=vt.h,Cu(Ue.rightAndBottom,vt,gt),h.chartArea={left:vt.left,top:vt.top,right:vt.left+vt.w,bottom:vt.top+vt.h},Ze.each(Ue.chartArea,function(Jt){var Pn=Jt.box;qu(Pn,h.chartArea),Pn.update(vt.w,vt.h)})}}},Te=function(h){return h&&h.default||h}(Object.freeze({__proto__:null,default:"/*\r\n * DOM element rendering detection\r\n * https://davidwalsh.name/detect-node-insertion\r\n */\r\n@keyframes chartjs-render-animation {\r\n\tfrom { opacity: 0.99; }\r\n\tto { opacity: 1; }\r\n}\r\n\r\n.chartjs-render-monitor {\r\n\tanimation: chartjs-render-animation 0.001s;\r\n}\r\n\r\n/*\r\n * DOM element resizing detection\r\n * https://github.com/marcj/css-element-queries\r\n */\r\n.chartjs-size-monitor,\r\n.chartjs-size-monitor-expand,\r\n.chartjs-size-monitor-shrink {\r\n\tposition: absolute;\r\n\tdirection: ltr;\r\n\tleft: 0;\r\n\ttop: 0;\r\n\tright: 0;\r\n\tbottom: 0;\r\n\toverflow: hidden;\r\n\tpointer-events: none;\r\n\tvisibility: hidden;\r\n\tz-index: -1;\r\n}\r\n\r\n.chartjs-size-monitor-expand > div {\r\n\tposition: absolute;\r\n\twidth: 1000000px;\r\n\theight: 1000000px;\r\n\tleft: 0;\r\n\ttop: 0;\r\n}\r\n\r\n.chartjs-size-monitor-shrink > div {\r\n\tposition: absolute;\r\n\twidth: 200%;\r\n\theight: 200%;\r\n\tleft: 0;\r\n\ttop: 0;\r\n}\r\n"})),Me="$chartjs",De="chartjs-",Tt=De+"size-monitor",dr=De+"render-monitor",Jo=["animationstart","webkitAnimationStart"],Es={touchstart:"mousedown",touchmove:"mousemove",touchend:"mouseup",pointerenter:"mouseenter",pointerdown:"mousedown",pointermove:"mousemove",pointerup:"mouseup",pointerleave:"mouseout",pointerout:"mouseout"};function vs(h,E){var N=Ze.getStyle(h,E),k=N&&N.match(/^(\d+)(\.\d+)?px$/);return k?Number(k[1]):void 0}var uu=!!function(){var h=!1;try{var E=Object.defineProperty({},"passive",{get:function(){h=!0}});window.addEventListener("e",null,E)}catch(N){}return h}()&&{passive:!0};function Wa(h,E,N){h.addEventListener(E,N,uu)}function Pl(h,E,N){h.removeEventListener(E,N,uu)}function ec(h,E,N,k,K){return{type:h,chart:E,native:K||null,x:void 0!==N?N:null,y:void 0!==k?k:null}}function Nc(h){var E=document.createElement("div");return E.className=h||"",E}function Ic(h,E,N){var k=h[Me]||(h[Me]={}),K=k.resizer=function(h){var E=1e6,N=Nc(Tt),k=Nc(Tt+"-expand"),K=Nc(Tt+"-shrink");k.appendChild(Nc()),K.appendChild(Nc()),N.appendChild(k),N.appendChild(K),N._reset=function(){k.scrollLeft=E,k.scrollTop=E,K.scrollLeft=E,K.scrollTop=E};var de=function(){N._reset(),h()};return Wa(k,"scroll",de.bind(k,"expand")),Wa(K,"scroll",de.bind(K,"shrink")),N}(function(h,E){var N=!1,k=[];return function(){k=Array.prototype.slice.call(arguments),E=E||this,N||(N=!0,Ze.requestAnimFrame.call(window,function(){N=!1,h.apply(E,k)}))}}(function(){if(k.resizer){var de=N.options.maintainAspectRatio&&h.parentNode,be=de?de.clientWidth:0;E(ec("resize",N)),de&&de.clientWidth<be&&N.canvas&&E(ec("resize",N))}}));!function(h,E){var N=h[Me]||(h[Me]={}),k=N.renderProxy=function(K){"chartjs-render-animation"===K.animationName&&E()};Ze.each(Jo,function(K){Wa(h,K,k)}),N.reflow=!!h.offsetParent,h.classList.add(dr)}(h,function(){if(k.resizer){var de=h.parentNode;de&&de!==K.parentNode&&de.insertBefore(K,de.firstChild),K._reset()}})}function md(h){var E=h[Me]||{},N=E.resizer;delete E.resizer,function(h){var E=h[Me]||{},N=E.renderProxy;N&&(Ze.each(Jo,function(k){Pl(h,k,N)}),delete E.renderProxy),h.classList.remove(dr)}(h),N&&N.parentNode&&N.parentNode.removeChild(N)}var Fi={disableCSSInjection:!1,_enabled:"undefined"!=typeof window&&"undefined"!=typeof document,_ensureLoaded:function(h){if(!this.disableCSSInjection){var E=h.getRootNode?h.getRootNode():document;!function(h,E){var N=h[Me]||(h[Me]={});if(!N.containsStyles){N.containsStyles=!0,E="/* Chart.js */\n"+E;var k=document.createElement("style");k.setAttribute("type","text/css"),k.appendChild(document.createTextNode(E)),h.appendChild(k)}}(E.host?E:document.head,Te)}},acquireContext:function(h,E){"string"==typeof h?h=document.getElementById(h):h.length&&(h=h[0]),h&&h.canvas&&(h=h.canvas);var N=h&&h.getContext&&h.getContext("2d");return N&&N.canvas===h?(this._ensureLoaded(h),function(h,E){var N=h.style,k=h.getAttribute("height"),K=h.getAttribute("width");if(h[Me]={initial:{height:k,width:K,style:{display:N.display,height:N.height,width:N.width}}},N.display=N.display||"block",null===K||""===K){var de=vs(h,"width");void 0!==de&&(h.width=de)}if(null===k||""===k)if(""===h.style.height)h.height=h.width/(E.options.aspectRatio||2);else{var be=vs(h,"height");void 0!==de&&(h.height=be)}}(h,E),N):null},releaseContext:function(h){var E=h.canvas;if(E[Me]){var N=E[Me].initial;["height","width"].forEach(function(k){var K=N[k];Ze.isNullOrUndef(K)?E.removeAttribute(k):E.setAttribute(k,K)}),Ze.each(N.style||{},function(k,K){E.style[K]=k}),E.width=E.width,delete E[Me]}},addEventListener:function(h,E,N){var k=h.canvas;if("resize"!==E){var K=N[Me]||(N[Me]={});Wa(k,E,(K.proxies||(K.proxies={}))[h.id+"_"+E]=function(Ue){N(function(h,E){var N=Es[h.type]||h.type,k=Ze.getRelativePosition(h,E);return ec(N,E,k.x,k.y,h)}(Ue,h))})}else Ic(k,N,h)},removeEventListener:function(h,E,N){var k=h.canvas;if("resize"!==E){var be=((N[Me]||{}).proxies||{})[h.id+"_"+E];!be||Pl(k,E,be)}else md(k)}};Ze.addEvent=Wa,Ze.removeEvent=Pl;var Aa=Ze.extend({initialize:function(){},acquireContext:function(){},releaseContext:function(){},addEventListener:function(){},removeEventListener:function(){}},Fi._enabled?Fi:{acquireContext:function(h){return h&&h.canvas&&(h=h.canvas),h&&h.getContext("2d")||null}});Tr._set("global",{plugins:{}});var As={_plugins:[],_cacheId:0,register:function(h){var E=this._plugins;[].concat(h).forEach(function(N){-1===E.indexOf(N)&&E.push(N)}),this._cacheId++},unregister:function(h){var E=this._plugins;[].concat(h).forEach(function(N){var k=E.indexOf(N);-1!==k&&E.splice(k,1)}),this._cacheId++},clear:function(){this._plugins=[],this._cacheId++},count:function(){return this._plugins.length},getAll:function(){return this._plugins},notify:function(h,E,N){var de,be,Ue,we,Xe,k=this.descriptors(h),K=k.length;for(de=0;de<K;++de)if("function"==typeof(Xe=(Ue=(be=k[de]).plugin)[E])&&((we=[h].concat(N||[])).push(be.options),!1===Xe.apply(Ue,we)))return!1;return!0},descriptors:function(h){var E=h.$plugins||(h.$plugins={});if(E.id===this._cacheId)return E.descriptors;var N=[],k=[],K=h&&h.config||{},de=K.options&&K.options.plugins||{};return this._plugins.concat(K.plugins||[]).forEach(function(be){if(-1===N.indexOf(be)){var we=be.id,Xe=de[we];!1!==Xe&&(!0===Xe&&(Xe=Ze.clone(Tr.global.plugins[we])),N.push(be),k.push({plugin:be,options:Xe||{}}))}}),E.descriptors=k,E.id=this._cacheId,k},_invalidate:function(h){delete h.$plugins}},ku={constructors:{},defaults:{},registerScaleType:function(h,E,N){this.constructors[h]=E,this.defaults[h]=Ze.clone(N)},getScaleConstructor:function(h){return this.constructors.hasOwnProperty(h)?this.constructors[h]:void 0},getScaleDefaults:function(h){return this.defaults.hasOwnProperty(h)?Ze.merge(Object.create(null),[Tr.scale,this.defaults[h]]):{}},updateScaleDefaults:function(h,E){var N=this;N.defaults.hasOwnProperty(h)&&(N.defaults[h]=Ze.extend(N.defaults[h],E))},addScalesToLayout:function(h){Ze.each(h.scales,function(E){E.fullWidth=E.options.fullWidth,E.position=E.options.position,E.weight=E.options.weight,jl.addBox(h,E)})}},bl=Ze.valueOrDefault,Au=Ze.rtl.getRtlAdapter;Tr._set("global",{tooltips:{enabled:!0,custom:null,mode:"nearest",position:"average",intersect:!0,backgroundColor:"rgba(0,0,0,0.8)",titleFontStyle:"bold",titleSpacing:2,titleMarginBottom:6,titleFontColor:"#fff",titleAlign:"left",bodySpacing:2,bodyFontColor:"#fff",bodyAlign:"left",footerFontStyle:"bold",footerSpacing:2,footerMarginTop:6,footerFontColor:"#fff",footerAlign:"left",yPadding:6,xPadding:6,caretPadding:2,caretSize:5,cornerRadius:6,multiKeyBackground:"#fff",displayColors:!0,borderColor:"rgba(0,0,0,0)",borderWidth:0,callbacks:{beforeTitle:Ze.noop,title:function(h,E){var N="",k=E.labels,K=k?k.length:0;if(h.length>0){var de=h[0];de.label?N=de.label:de.xLabel?N=de.xLabel:K>0&&de.index<K&&(N=k[de.index])}return N},afterTitle:Ze.noop,beforeBody:Ze.noop,beforeLabel:Ze.noop,label:function(h,E){var N=E.datasets[h.datasetIndex].label||"";return N&&(N+=": "),Ze.isNullOrUndef(h.value)?N+=h.yLabel:N+=h.value,N},labelColor:function(h,E){var K=E.getDatasetMeta(h.datasetIndex).data[h.index]._view;return{borderColor:K.borderColor,backgroundColor:K.backgroundColor}},labelTextColor:function(){return this._options.bodyFontColor},afterLabel:Ze.noop,afterBody:Ze.noop,beforeFooter:Ze.noop,footer:Ze.noop,afterFooter:Ze.noop}}});var bu={average:function(h){if(!h.length)return!1;var E,N,k=0,K=0,de=0;for(E=0,N=h.length;E<N;++E){var be=h[E];if(be&&be.hasValue()){var Ue=be.tooltipPosition();k+=Ue.x,K+=Ue.y,++de}}return{x:k/de,y:K/de}},nearest:function(h,E){var de,be,Ue,N=E.x,k=E.y,K=Number.POSITIVE_INFINITY;for(de=0,be=h.length;de<be;++de){var we=h[de];if(we&&we.hasValue()){var Xe=we.getCenterPoint(),gt=Ze.distanceBetweenPoints(E,Xe);gt<K&&(K=gt,Ue=we)}}if(Ue){var vt=Ue.tooltipPosition();N=vt.x,k=vt.y}return{x:N,y:k}}};function cu(h,E){return E&&(Ze.isArray(E)?Array.prototype.push.apply(h,E):h.push(E)),h}function Gs(h){return("string"==typeof h||h instanceof String)&&h.indexOf("\n")>-1?h.split("\n"):h}function $u(h){var E=h._xScale,N=h._yScale||h._scale,k=h._index,K=h._datasetIndex,de=h._chart.getDatasetMeta(K).controller,be=de._getIndexScale(),Ue=de._getValueScale();return{xLabel:E?E.getLabelForIndex(k,K):"",yLabel:N?N.getLabelForIndex(k,K):"",label:be?""+be.getLabelForIndex(k,K):"",value:Ue?""+Ue.getLabelForIndex(k,K):"",index:k,datasetIndex:K,x:h._model.x,y:h._model.y}}function Hu(h){var E=Tr.global;return{xPadding:h.xPadding,yPadding:h.yPadding,xAlign:h.xAlign,yAlign:h.yAlign,rtl:h.rtl,textDirection:h.textDirection,bodyFontColor:h.bodyFontColor,_bodyFontFamily:bl(h.bodyFontFamily,E.defaultFontFamily),_bodyFontStyle:bl(h.bodyFontStyle,E.defaultFontStyle),_bodyAlign:h.bodyAlign,bodyFontSize:bl(h.bodyFontSize,E.defaultFontSize),bodySpacing:h.bodySpacing,titleFontColor:h.titleFontColor,_titleFontFamily:bl(h.titleFontFamily,E.defaultFontFamily),_titleFontStyle:bl(h.titleFontStyle,E.defaultFontStyle),titleFontSize:bl(h.titleFontSize,E.defaultFontSize),_titleAlign:h.titleAlign,titleSpacing:h.titleSpacing,titleMarginBottom:h.titleMarginBottom,footerFontColor:h.footerFontColor,_footerFontFamily:bl(h.footerFontFamily,E.defaultFontFamily),_footerFontStyle:bl(h.footerFontStyle,E.defaultFontStyle),footerFontSize:bl(h.footerFontSize,E.defaultFontSize),_footerAlign:h.footerAlign,footerSpacing:h.footerSpacing,footerMarginTop:h.footerMarginTop,caretSize:h.caretSize,cornerRadius:h.cornerRadius,backgroundColor:h.backgroundColor,opacity:0,legendColorBackground:h.multiKeyBackground,displayColors:h.displayColors,borderColor:h.borderColor,borderWidth:h.borderWidth}}function ha(h,E){return"center"===E?h.x+h.width/2:"right"===E?h.x+h.width-h.xPadding:h.x+h.xPadding}function _u(h){return cu([],Gs(h))}var Ja=nr.extend({initialize:function(){this._model=Hu(this._options),this._lastActive=[]},getTitle:function(){var h=this,N=h._options.callbacks,k=N.beforeTitle.apply(h,arguments),K=N.title.apply(h,arguments),de=N.afterTitle.apply(h,arguments),be=[];return be=cu(be,Gs(k)),be=cu(be,Gs(K)),cu(be,Gs(de))},getBeforeBody:function(){return _u(this._options.callbacks.beforeBody.apply(this,arguments))},getBody:function(h,E){var N=this,k=N._options.callbacks,K=[];return Ze.each(h,function(de){var be={before:[],lines:[],after:[]};cu(be.before,Gs(k.beforeLabel.call(N,de,E))),cu(be.lines,k.label.call(N,de,E)),cu(be.after,Gs(k.afterLabel.call(N,de,E))),K.push(be)}),K},getAfterBody:function(){return _u(this._options.callbacks.afterBody.apply(this,arguments))},getFooter:function(){var h=this,E=h._options.callbacks,N=E.beforeFooter.apply(h,arguments),k=E.footer.apply(h,arguments),K=E.afterFooter.apply(h,arguments),de=[];return de=cu(de,Gs(N)),de=cu(de,Gs(k)),cu(de,Gs(K))},update:function(h){var vt,Jt,E=this,N=E._options,k=E._model,K=E._model=Hu(N),de=E._active,be=E._data,Ue={xAlign:k.xAlign,yAlign:k.yAlign},we={x:k.x,y:k.y},Xe={width:k.width,height:k.height},gt={x:k.caretX,y:k.caretY};if(de.length){K.opacity=1;var Pn=[],Rn=[];gt=bu[N.position].call(E,de,E._eventPosition);var sr=[];for(vt=0,Jt=de.length;vt<Jt;++vt)sr.push($u(de[vt]));N.filter&&(sr=sr.filter(function(jr){return N.filter(jr,be)})),N.itemSort&&(sr=sr.sort(function(jr,Ni){return N.itemSort(jr,Ni,be)})),Ze.each(sr,function(jr){Pn.push(N.callbacks.labelColor.call(E,jr,E._chart)),Rn.push(N.callbacks.labelTextColor.call(E,jr,E._chart))}),K.title=E.getTitle(sr,be),K.beforeBody=E.getBeforeBody(sr,be),K.body=E.getBody(sr,be),K.afterBody=E.getAfterBody(sr,be),K.footer=E.getFooter(sr,be),K.x=gt.x,K.y=gt.y,K.caretPadding=N.caretPadding,K.labelColors=Pn,K.labelTextColors=Rn,K.dataPoints=sr,we=function(h,E,N,k){var K=h.x,de=h.y,Ue=h.caretPadding,Xe=N.xAlign,gt=N.yAlign,vt=h.caretSize+Ue,Jt=h.cornerRadius+Ue;return"right"===Xe?K-=E.width:"center"===Xe&&((K-=E.width/2)+E.width>k.width&&(K=k.width-E.width),K<0&&(K=0)),"top"===gt?de+=vt:de-="bottom"===gt?E.height+vt:E.height/2,"center"===gt?"left"===Xe?K+=vt:"right"===Xe&&(K-=vt):"left"===Xe?K-=Jt:"right"===Xe&&(K+=Jt),{x:K,y:de}}(K,Xe=function(h,E){var N=h._chart.ctx,k=2*E.yPadding,K=0,de=E.body,be=de.reduce(function(Rn,sr){return Rn+sr.before.length+sr.lines.length+sr.after.length},0),Ue=E.title.length,we=E.footer.length,Xe=E.titleFontSize,gt=E.bodyFontSize,vt=E.footerFontSize;k+=Ue*Xe,k+=Ue?(Ue-1)*E.titleSpacing:0,k+=Ue?E.titleMarginBottom:0,k+=(be+=E.beforeBody.length+E.afterBody.length)*gt,k+=be?(be-1)*E.bodySpacing:0,k+=we?E.footerMarginTop:0,k+=we*vt,k+=we?(we-1)*E.footerSpacing:0;var Jt=0,Pn=function(Rn){K=Math.max(K,N.measureText(Rn).width+Jt)};return N.font=Ze.fontString(Xe,E._titleFontStyle,E._titleFontFamily),Ze.each(E.title,Pn),N.font=Ze.fontString(gt,E._bodyFontStyle,E._bodyFontFamily),Ze.each(E.beforeBody.concat(E.afterBody),Pn),Jt=E.displayColors?gt+2:0,Ze.each(de,function(Rn){Ze.each(Rn.before,Pn),Ze.each(Rn.lines,Pn),Ze.each(Rn.after,Pn)}),Jt=0,N.font=Ze.fontString(vt,E._footerFontStyle,E._footerFontFamily),Ze.each(E.footer,Pn),{width:K+=2*E.xPadding,height:k}}(this,K),Ue=function(h,E){var N=h._model,k=h._chart,K=h._chart.chartArea,de="center",be="center";N.y<E.height?be="top":N.y>k.height-E.height&&(be="bottom");var Ue,we,Xe,gt,vt,Jt=(K.left+K.right)/2,Pn=(K.top+K.bottom)/2;"center"===be?(Ue=function(sr){return sr<=Jt},we=function(sr){return sr>Jt}):(Ue=function(sr){return sr<=E.width/2},we=function(sr){return sr>=k.width-E.width/2}),Xe=function(sr){return sr+E.width+N.caretSize+N.caretPadding>k.width},gt=function(sr){return sr-E.width-N.caretSize-N.caretPadding<0},vt=function(sr){return sr<=Pn?"top":"bottom"},Ue(N.x)?(de="left",Xe(N.x)&&(de="center",be=vt(N.y))):we(N.x)&&(de="right",gt(N.x)&&(de="center",be=vt(N.y)));var Rn=h._options;return{xAlign:Rn.xAlign?Rn.xAlign:de,yAlign:Rn.yAlign?Rn.yAlign:be}}(this,Xe),E._chart)}else K.opacity=0;return K.xAlign=Ue.xAlign,K.yAlign=Ue.yAlign,K.x=we.x,K.y=we.y,K.width=Xe.width,K.height=Xe.height,K.caretX=gt.x,K.caretY=gt.y,E._model=K,h&&N.custom&&N.custom.call(E,K),E},drawCaret:function(h,E){var N=this._chart.ctx,K=this.getCaretPosition(h,E,this._view);N.lineTo(K.x1,K.y1),N.lineTo(K.x2,K.y2),N.lineTo(K.x3,K.y3)},getCaretPosition:function(h,E,N){var k,K,de,be,Ue,we,Xe=N.caretSize,gt=N.cornerRadius,vt=N.xAlign,Jt=N.yAlign,Pn=h.x,Rn=h.y,sr=E.width,jr=E.height;if("center"===Jt)Ue=Rn+jr/2,"left"===vt?(K=(k=Pn)-Xe,de=k,be=Ue+Xe,we=Ue-Xe):(K=(k=Pn+sr)+Xe,de=k,be=Ue-Xe,we=Ue+Xe);else if("left"===vt?(k=(K=Pn+gt+Xe)-Xe,de=K+Xe):"right"===vt?(k=(K=Pn+sr-gt-Xe)-Xe,de=K+Xe):(k=(K=N.caretX)-Xe,de=K+Xe),"top"===Jt)Ue=(be=Rn)-Xe,we=be;else{Ue=(be=Rn+jr)+Xe,we=be;var Ni=de;de=k,k=Ni}return{x1:k,x2:K,x3:de,y1:be,y2:Ue,y3:we}},drawTitle:function(h,E,N){var de,be,Ue,k=E.title,K=k.length;if(K){var we=Au(E.rtl,E.x,E.width);for(h.x=ha(E,E._titleAlign),N.textAlign=we.textAlign(E._titleAlign),N.textBaseline="middle",de=E.titleFontSize,be=E.titleSpacing,N.fillStyle=E.titleFontColor,N.font=Ze.fontString(de,E._titleFontStyle,E._titleFontFamily),Ue=0;Ue<K;++Ue)N.fillText(k[Ue],we.x(h.x),h.y+de/2),h.y+=de+be,Ue+1===K&&(h.y+=E.titleMarginBottom-be)}},drawBody:function(h,E,N){var Jt,Pn,Rn,sr,jr,Ni,Vo,$o,k=E.bodyFontSize,K=E.bodySpacing,de=E._bodyAlign,be=E.body,Ue=E.displayColors,we=0,Xe=Ue?ha(E,"left"):0,gt=Au(E.rtl,E.x,E.width),vt=function(dl){N.fillText(dl,gt.x(h.x+we),h.y+k/2),h.y+=k+K},Vs=gt.textAlign(de);for(N.textAlign=de,N.textBaseline="middle",N.font=Ze.fontString(k,E._bodyFontStyle,E._bodyFontFamily),h.x=ha(E,Vs),N.fillStyle=E.bodyFontColor,Ze.each(E.beforeBody,vt),we=Ue&&"right"!==Vs?"center"===de?k/2+1:k+2:0,jr=0,Vo=be.length;jr<Vo;++jr){for(Jt=be[jr],Rn=E.labelColors[jr],N.fillStyle=Pn=E.labelTextColors[jr],Ze.each(Jt.before,vt),Ni=0,$o=(sr=Jt.lines).length;Ni<$o;++Ni){if(Ue){var qs=gt.x(Xe);N.fillStyle=E.legendColorBackground,N.fillRect(gt.leftForLtr(qs,k),h.y,k,k),N.lineWidth=1,N.strokeStyle=Rn.borderColor,N.strokeRect(gt.leftForLtr(qs,k),h.y,k,k),N.fillStyle=Rn.backgroundColor,N.fillRect(gt.leftForLtr(gt.xPlus(qs,1),k-2),h.y+1,k-2,k-2),N.fillStyle=Pn}vt(sr[Ni])}Ze.each(Jt.after,vt)}we=0,Ze.each(E.afterBody,vt),h.y-=K},drawFooter:function(h,E,N){var de,be,k=E.footer,K=k.length;if(K){var Ue=Au(E.rtl,E.x,E.width);for(h.x=ha(E,E._footerAlign),h.y+=E.footerMarginTop,N.textAlign=Ue.textAlign(E._footerAlign),N.textBaseline="middle",de=E.footerFontSize,N.fillStyle=E.footerFontColor,N.font=Ze.fontString(de,E._footerFontStyle,E._footerFontFamily),be=0;be<K;++be)N.fillText(k[be],Ue.x(h.x),h.y+de/2),h.y+=de+E.footerSpacing}},drawBackground:function(h,E,N,k){N.fillStyle=E.backgroundColor,N.strokeStyle=E.borderColor,N.lineWidth=E.borderWidth;var K=E.xAlign,de=E.yAlign,be=h.x,Ue=h.y,we=k.width,Xe=k.height,gt=E.cornerRadius;N.beginPath(),N.moveTo(be+gt,Ue),"top"===de&&this.drawCaret(h,k),N.lineTo(be+we-gt,Ue),N.quadraticCurveTo(be+we,Ue,be+we,Ue+gt),"center"===de&&"right"===K&&this.drawCaret(h,k),N.lineTo(be+we,Ue+Xe-gt),N.quadraticCurveTo(be+we,Ue+Xe,be+we-gt,Ue+Xe),"bottom"===de&&this.drawCaret(h,k),N.lineTo(be+gt,Ue+Xe),N.quadraticCurveTo(be,Ue+Xe,be,Ue+Xe-gt),"center"===de&&"left"===K&&this.drawCaret(h,k),N.lineTo(be,Ue+gt),N.quadraticCurveTo(be,Ue,be+gt,Ue),N.closePath(),N.fill(),E.borderWidth>0&&N.stroke()},draw:function(){var h=this._chart.ctx,E=this._view;if(0!==E.opacity){var N={width:E.width,height:E.height},k={x:E.x,y:E.y},K=Math.abs(E.opacity<.001)?0:E.opacity;this._options.enabled&&(E.title.length||E.beforeBody.length||E.body.length||E.afterBody.length||E.footer.length)&&(h.save(),h.globalAlpha=K,this.drawBackground(k,E,h,N),k.y+=E.yPadding,Ze.rtl.overrideTextDirection(h,E.textDirection),this.drawTitle(k,E,h),this.drawBody(k,E,h),this.drawFooter(k,E,h),Ze.rtl.restoreTextDirection(h,E.textDirection),h.restore())}},handleEvent:function(h){var k,E=this,N=E._options;return E._lastActive=E._lastActive||[],"mouseout"===h.type?E._active=[]:(E._active=E._chart.getElementsAtEventForMode(h,N.mode,N),N.reverse&&E._active.reverse()),(k=!Ze.arrayEquals(E._active,E._lastActive))&&(E._lastActive=E._active,(N.enabled||N.custom)&&(E._eventPosition={x:h.x,y:h.y},E.update(!0),E.pivot())),k}});Ja.positioners=bu;var hl=Ze.valueOrDefault;function Vl(){return Ze.merge(Object.create(null),[].slice.call(arguments),{merger:function(h,E,N,k){if("xAxes"===h||"yAxes"===h){var de,be,Ue,K=N[h].length;for(E[h]||(E[h]=[]),de=0;de<K;++de)be=hl((Ue=N[h][de]).type,"xAxes"===h?"category":"linear"),de>=E[h].length&&E[h].push({}),Ze.merge(E[h][de],!E[h][de].type||Ue.type&&Ue.type!==E[h][de].type?[ku.getScaleDefaults(be),Ue]:Ue)}else Ze._merger(h,E,N,k)}})}function Hs(){return Ze.merge(Object.create(null),[].slice.call(arguments),{merger:function(h,E,N,k){var K=E[h]||Object.create(null),de=N[h];"scales"===h?E[h]=Vl(K,de):"scale"===h?E[h]=Ze.merge(K,[ku.getScaleDefaults(de.type),de]):Ze._merger(h,E,N,k)}})}function Ae(h){var E=h.options;Ze.each(h.scales,function(N){jl.removeBox(h,N)}),E=Hs(Tr.global,Tr[h.config.type],E),h.options=h.config.options=E,h.ensureScalesHaveIDs(),h.buildOrUpdateScales(),h.tooltip._options=E.tooltips,h.tooltip.initialize()}function ot(h,E,N){var k,K=function(de){return de.id===k};do{k=E+N++}while(Ze.findIndex(h,K)>=0);return k}function _t(h){return"top"===h||"bottom"===h}function lt(h,E){return function(N,k){return N[h]===k[h]?N[E]-k[E]:N[h]-k[h]}}Tr._set("global",{elements:{},events:["mousemove","mouseout","click","touchstart","touchmove"],hover:{onHover:null,mode:"nearest",intersect:!0,animationDuration:400},onClick:null,maintainAspectRatio:!0,responsive:!0,responsiveAnimationDuration:0});var un=function(h,E){return this.construct(h,E),this};Ze.extend(un.prototype,{construct:function(h,E){var N=this;E=function(h){var E=(h=h||Object.create(null)).data=h.data||{};return E.datasets=E.datasets||[],E.labels=E.labels||[],h.options=Hs(Tr.global,Tr[h.type],h.options||{}),h}(E);var k=Aa.acquireContext(h,E),K=k&&k.canvas,de=K&&K.height,be=K&&K.width;N.id=Ze.uid(),N.ctx=k,N.canvas=K,N.config=E,N.width=be,N.height=de,N.aspectRatio=de?be/de:null,N.options=E.options,N._bufferedRender=!1,N._layers=[],N.chart=N,N.controller=N,un.instances[N.id]=N,Object.defineProperty(N,"data",{get:function(){return N.config.data},set:function(Ue){N.config.data=Ue}}),k&&K?(N.initialize(),N.update()):console.error("Failed to create chart: can't acquire context from the given item")},initialize:function(){var h=this;return As.notify(h,"beforeInit"),Ze.retinaScale(h,h.options.devicePixelRatio),h.bindEvents(),h.options.responsive&&h.resize(!0),h.initToolTip(),As.notify(h,"afterInit"),h},clear:function(){return Ze.canvas.clear(this),this},stop:function(){return yo.cancelAnimation(this),this},resize:function(h){var E=this,N=E.options,k=E.canvas,K=N.maintainAspectRatio&&E.aspectRatio||null,de=Math.max(0,Math.floor(Ze.getMaximumWidth(k))),be=Math.max(0,Math.floor(K?de/K:Ze.getMaximumHeight(k)));if((E.width!==de||E.height!==be)&&(k.width=E.width=de,k.height=E.height=be,k.style.width=de+"px",k.style.height=be+"px",Ze.retinaScale(E,N.devicePixelRatio),!h)){var Ue={width:de,height:be};As.notify(E,"resize",[Ue]),N.onResize&&N.onResize(E,Ue),E.stop(),E.update({duration:N.responsiveAnimationDuration})}},ensureScalesHaveIDs:function(){var h=this.options,E=h.scales||{},N=h.scale;Ze.each(E.xAxes,function(k,K){k.id||(k.id=ot(E.xAxes,"x-axis-",K))}),Ze.each(E.yAxes,function(k,K){k.id||(k.id=ot(E.yAxes,"y-axis-",K))}),N&&(N.id=N.id||"scale")},buildOrUpdateScales:function(){var h=this,E=h.options,N=h.scales||{},k=[],K=Object.keys(N).reduce(function(de,be){return de[be]=!1,de},{});E.scales&&(k=k.concat((E.scales.xAxes||[]).map(function(de){return{options:de,dtype:"category",dposition:"bottom"}}),(E.scales.yAxes||[]).map(function(de){return{options:de,dtype:"linear",dposition:"left"}}))),E.scale&&k.push({options:E.scale,dtype:"radialLinear",isDefault:!0,dposition:"chartArea"}),Ze.each(k,function(de){var be=de.options,Ue=be.id,we=hl(be.type,de.dtype);_t(be.position)!==_t(de.dposition)&&(be.position=de.dposition),K[Ue]=!0;var Xe=null;if(Ue in N&&N[Ue].type===we)(Xe=N[Ue]).options=be,Xe.ctx=h.ctx,Xe.chart=h;else{var gt=ku.getScaleConstructor(we);if(!gt)return;Xe=new gt({id:Ue,type:we,options:be,ctx:h.ctx,chart:h}),N[Xe.id]=Xe}Xe.mergeTicksOptions(),de.isDefault&&(h.scale=Xe)}),Ze.each(K,function(de,be){de||delete N[be]}),h.scales=N,ku.addScalesToLayout(this)},buildOrUpdateControllers:function(){var k,K,h=this,E=[],N=h.data.datasets;for(k=0,K=N.length;k<K;k++){var de=N[k],be=h.getDatasetMeta(k),Ue=de.type||h.config.type;if(be.type&&be.type!==Ue&&(h.destroyDatasetMeta(k),be=h.getDatasetMeta(k)),be.type=Ue,be.order=de.order||0,be.index=k,be.controller)be.controller.updateIndex(k),be.controller.linkScales();else{var we=fi[be.type];if(void 0===we)throw new Error('"'+be.type+'" is not a chart type.');be.controller=new we(h,k),E.push(be.controller)}}return E},resetElements:function(){var h=this;Ze.each(h.data.datasets,function(E,N){h.getDatasetMeta(N).controller.reset()},h)},reset:function(){this.resetElements(),this.tooltip.initialize()},update:function(h){var N,k,E=this;if((!h||"object"!=typeof h)&&(h={duration:h,lazy:arguments[1]}),Ae(E),As._invalidate(E),!1!==As.notify(E,"beforeUpdate")){E.tooltip._data=E.data;var K=E.buildOrUpdateControllers();for(N=0,k=E.data.datasets.length;N<k;N++)E.getDatasetMeta(N).controller.buildOrUpdateElements();E.updateLayout(),E.options.animation&&E.options.animation.duration&&Ze.each(K,function(de){de.reset()}),E.updateDatasets(),E.tooltip.initialize(),E.lastActive=[],As.notify(E,"afterUpdate"),E._layers.sort(lt("z","_idx")),E._bufferedRender?E._bufferedRequest={duration:h.duration,easing:h.easing,lazy:h.lazy}:E.render(h)}},updateLayout:function(){var h=this;!1!==As.notify(h,"beforeLayout")&&(jl.update(this,this.width,this.height),h._layers=[],Ze.each(h.boxes,function(E){E._configure&&E._configure(),h._layers.push.apply(h._layers,E._layers())},h),h._layers.forEach(function(E,N){E._idx=N}),As.notify(h,"afterScaleUpdate"),As.notify(h,"afterLayout"))},updateDatasets:function(){var h=this;if(!1!==As.notify(h,"beforeDatasetsUpdate")){for(var E=0,N=h.data.datasets.length;E<N;++E)h.updateDataset(E);As.notify(h,"afterDatasetsUpdate")}},updateDataset:function(h){var E=this,N=E.getDatasetMeta(h),k={meta:N,index:h};!1!==As.notify(E,"beforeDatasetUpdate",[k])&&(N.controller._update(),As.notify(E,"afterDatasetUpdate",[k]))},render:function(h){var E=this;(!h||"object"!=typeof h)&&(h={duration:h,lazy:arguments[1]});var N=E.options.animation,k=hl(h.duration,N&&N.duration),K=h.lazy;if(!1!==As.notify(E,"beforeRender")){var de=function(Ue){As.notify(E,"afterRender"),Ze.callback(N&&N.onComplete,[Ue],E)};if(N&&k){var be=new po({numSteps:k/16.66,easing:h.easing||N.easing,render:function(Ue,we){var gt=we.currentStep,vt=gt/we.numSteps;Ue.draw((0,Ze.easing.effects[we.easing])(vt),vt,gt)},onAnimationProgress:N.onProgress,onAnimationComplete:de});yo.addAnimation(E,be,k,K)}else E.draw(),de(new po({numSteps:0,chart:E}));return E}},draw:function(h){var N,k,E=this;if(E.clear(),Ze.isNullOrUndef(h)&&(h=1),E.transition(h),!(E.width<=0||E.height<=0)&&!1!==As.notify(E,"beforeDraw",[h])){for(k=E._layers,N=0;N<k.length&&k[N].z<=0;++N)k[N].draw(E.chartArea);for(E.drawDatasets(h);N<k.length;++N)k[N].draw(E.chartArea);E._drawTooltip(h),As.notify(E,"afterDraw",[h])}},transition:function(h){for(var E=this,N=0,k=(E.data.datasets||[]).length;N<k;++N)E.isDatasetVisible(N)&&E.getDatasetMeta(N).controller.transition(h);E.tooltip.transition(h)},_getSortedDatasetMetas:function(h){var K,de,E=this,k=[];for(K=0,de=(E.data.datasets||[]).length;K<de;++K)(!h||E.isDatasetVisible(K))&&k.push(E.getDatasetMeta(K));return k.sort(lt("order","index")),k},_getSortedVisibleDatasetMetas:function(){return this._getSortedDatasetMetas(!0)},drawDatasets:function(h){var N,k,E=this;if(!1!==As.notify(E,"beforeDatasetsDraw",[h])){for(k=(N=E._getSortedVisibleDatasetMetas()).length-1;k>=0;--k)E.drawDataset(N[k],h);As.notify(E,"afterDatasetsDraw",[h])}},drawDataset:function(h,E){var k={meta:h,index:h.index,easingValue:E};!1!==As.notify(this,"beforeDatasetDraw",[k])&&(h.controller.draw(E),As.notify(this,"afterDatasetDraw",[k]))},_drawTooltip:function(h){var E=this,N=E.tooltip,k={tooltip:N,easingValue:h};!1!==As.notify(E,"beforeTooltipDraw",[k])&&(N.draw(),As.notify(E,"afterTooltipDraw",[k]))},getElementAtEvent:function(h){return al.modes.single(this,h)},getElementsAtEvent:function(h){return al.modes.label(this,h,{intersect:!0})},getElementsAtXAxis:function(h){return al.modes["x-axis"](this,h,{intersect:!0})},getElementsAtEventForMode:function(h,E,N){var k=al.modes[E];return"function"==typeof k?k(this,h,N):[]},getDatasetAtEvent:function(h){return al.modes.dataset(this,h,{intersect:!0})},getDatasetMeta:function(h){var E=this,N=E.data.datasets[h];N._meta||(N._meta={});var k=N._meta[E.id];return k||(k=N._meta[E.id]={type:null,data:[],dataset:null,controller:null,hidden:null,xAxisID:null,yAxisID:null,order:N.order||0,index:h}),k},getVisibleDatasetCount:function(){for(var h=0,E=0,N=this.data.datasets.length;E<N;++E)this.isDatasetVisible(E)&&h++;return h},isDatasetVisible:function(h){var E=this.getDatasetMeta(h);return"boolean"==typeof E.hidden?!E.hidden:!this.data.datasets[h].hidden},generateLegend:function(){return this.options.legendCallback(this)},destroyDatasetMeta:function(h){var E=this.id,N=this.data.datasets[h],k=N._meta&&N._meta[E];k&&(k.controller.destroy(),delete N._meta[E])},destroy:function(){var N,k,h=this,E=h.canvas;for(h.stop(),N=0,k=h.data.datasets.length;N<k;++N)h.destroyDatasetMeta(N);E&&(h.unbindEvents(),Ze.canvas.clear(h),Aa.releaseContext(h.ctx),h.canvas=null,h.ctx=null),As.notify(h,"destroy"),delete un.instances[h.id]},toBase64Image:function(){return this.canvas.toDataURL.apply(this.canvas,arguments)},initToolTip:function(){var h=this;h.tooltip=new Ja({_chart:h,_chartInstance:h,_data:h.data,_options:h.options.tooltips},h)},bindEvents:function(){var h=this,E=h._listeners={},N=function(){h.eventHandler.apply(h,arguments)};Ze.each(h.options.events,function(k){Aa.addEventListener(h,k,N),E[k]=N}),h.options.responsive&&(N=function(){h.resize()},Aa.addEventListener(h,"resize",N),E.resize=N)},unbindEvents:function(){var h=this,E=h._listeners;!E||(delete h._listeners,Ze.each(E,function(N,k){Aa.removeEventListener(h,k,N)}))},updateHoverStyle:function(h,E,N){var K,de,be,k=N?"set":"remove";for(de=0,be=h.length;de<be;++de)(K=h[de])&&this.getDatasetMeta(K._datasetIndex).controller[k+"HoverStyle"](K);"dataset"===E&&this.getDatasetMeta(h[0]._datasetIndex).controller["_"+k+"DatasetHoverStyle"]()},eventHandler:function(h){var E=this,N=E.tooltip;if(!1!==As.notify(E,"beforeEvent",[h])){E._bufferedRender=!0,E._bufferedRequest=null;var k=E.handleEvent(h);N&&(k=N._start?N.handleEvent(h):k|N.handleEvent(h)),As.notify(E,"afterEvent",[h]);var K=E._bufferedRequest;return K?E.render(K):k&&!E.animating&&(E.stop(),E.render({duration:E.options.hover.animationDuration,lazy:!0})),E._bufferedRender=!1,E._bufferedRequest=null,E}},handleEvent:function(h){var K,E=this,N=E.options||{},k=N.hover;return E.lastActive=E.lastActive||[],E.active="mouseout"===h.type?[]:E.getElementsAtEventForMode(h,k.mode,k),Ze.callback(N.onHover||N.hover.onHover,[h.native,E.active],E),("mouseup"===h.type||"click"===h.type)&&N.onClick&&N.onClick.call(E,h.native,E.active),E.lastActive.length&&E.updateHoverStyle(E.lastActive,k.mode,!1),E.active.length&&k.mode&&E.updateHoverStyle(E.active,k.mode,!0),K=!Ze.arrayEquals(E.active,E.lastActive),E.lastActive=E.active,K}}),un.instances={};var yn=un;un.Controller=un,un.types={},Ze.configMerge=Hs,Ze.scaleMerge=Vl;function Vr(){throw new Error("This method is not implemented: either no adapter can be found or an incomplete integration was provided.")}function _i(h){this.options=h||{}}Ze.extend(_i.prototype,{formats:Vr,parse:Vr,format:Vr,add:Vr,diff:Vr,startOf:Vr,endOf:Vr,_create:function(h){return h}}),_i.override=function(h){Ze.extend(_i.prototype,h)};var ko={_date:_i},Ho={formatters:{values:function(h){return Ze.isArray(h)?h:""+h},linear:function(h,E,N){var k=N.length>3?N[2]-N[1]:N[1]-N[0];Math.abs(k)>1&&h!==Math.floor(h)&&(k=h-Math.floor(h));var K=Ze.log10(Math.abs(k)),de="";if(0!==h)if(Math.max(Math.abs(N[0]),Math.abs(N[N.length-1]))<1e-4){var Ue=Ze.log10(Math.abs(h)),we=Math.floor(Ue)-Math.floor(K);we=Math.max(Math.min(we,20),0),de=h.toExponential(we)}else{var Xe=-1*Math.floor(K);Xe=Math.max(Math.min(Xe,20),0),de=h.toFixed(Xe)}else de="0";return de},logarithmic:function(h,E,N){var k=h/Math.pow(10,Math.floor(Ze.log10(h)));return 0===h?"0":1===k||2===k||5===k||0===E||E===N.length-1?h.toExponential():""}}},Ln=Ze.isArray,Mr=Ze.isNullOrUndef,gr=Ze.valueOrDefault,co=Ze.valueAtIndexOrDefault;function Na(h,E,N){var Xe,k=h.getTicks().length,K=Math.min(E,k-1),de=h.getPixelForTick(K),be=h._startPixel,Ue=h._endPixel;if(!(N&&(Xe=1===k?Math.max(de-be,Ue-de):0===E?(h.getPixelForTick(1)-de)/2:(de-h.getPixelForTick(K-1))/2,de+=K<E?Xe:-Xe,de<be-1e-6||de>Ue+1e-6)))return de}function Ks(h,E,N,k){var gt,vt,Jt,Pn,Rn,sr,jr,Ni,Vo,$o,Vs,qs,dl,K=N.length,de=[],be=[],Ue=[],we=0,Xe=0;for(gt=0;gt<K;++gt){if(Pn=N[gt].label,h.font=sr=(Rn=N[gt].major?E.major:E.minor).string,jr=k[sr]=k[sr]||{data:{},gc:[]},Ni=Rn.lineHeight,Vo=$o=0,Mr(Pn)||Ln(Pn)){if(Ln(Pn))for(vt=0,Jt=Pn.length;vt<Jt;++vt)!Mr(Vs=Pn[vt])&&!Ln(Vs)&&(Vo=Ze.measureText(h,jr.data,jr.gc,Vo,Vs),$o+=Ni)}else Vo=Ze.measureText(h,jr.data,jr.gc,Vo,Pn),$o=Ni;de.push(Vo),be.push($o),Ue.push(Ni/2),we=Math.max(Vo,we),Xe=Math.max($o,Xe)}function ga(sa){return{width:de[sa]||0,height:be[sa]||0,offset:Ue[sa]||0}}return function(h,E){Ze.each(h,function(N){var de,k=N.gc,K=k.length/2;if(K>E){for(de=0;de<K;++de)delete N.data[k[de]];k.splice(0,K)}})}(k,K),qs=de.indexOf(we),dl=be.indexOf(Xe),{first:ga(0),last:ga(K-1),widest:ga(qs),highest:ga(dl)}}function td(h){return h.drawTicks?h.tickMarkLength:0}function Lc(h){var E,N;return h.display?(E=Ze.options._parseFont(h),N=Ze.options.toPadding(h.padding),E.lineHeight+N.height):0}function zl(h,E){return Ze.extend(Ze.options._parseFont({fontFamily:gr(E.fontFamily,h.fontFamily),fontSize:gr(E.fontSize,h.fontSize),fontStyle:gr(E.fontStyle,h.fontStyle),lineHeight:gr(E.lineHeight,h.lineHeight)}),{color:Ze.options.resolve([E.fontColor,h.fontColor,Tr.global.defaultFontColor])})}function ki(h){var E=zl(h,h.minor);return{minor:E,major:h.major.enabled?zl(h,h.major):E}}function No(h){var N,k,K,E=[];for(k=0,K=h.length;k<K;++k)void 0!==(N=h[k])._index&&E.push(N);return E}function vd(h,E,N,k){var Ue,we,Xe,gt,K=gr(N,0),de=Math.min(gr(k,h.length),h.length),be=0;for(E=Math.ceil(E),k&&(E=(Ue=k-N)/Math.floor(Ue/E)),gt=K;gt<0;)be++,gt=Math.round(K+be*E);for(we=Math.max(K,0);we<de;we++)Xe=h[we],we===gt?(Xe._index=we,be++,gt=Math.round(K+be*E)):delete Xe.label}Tr._set("scale",{display:!0,position:"left",offset:!1,gridLines:{display:!0,color:"rgba(0,0,0,0.1)",lineWidth:1,drawBorder:!0,drawOnChartArea:!0,drawTicks:!0,tickMarkLength:10,zeroLineWidth:1,zeroLineColor:"rgba(0,0,0,0.25)",zeroLineBorderDash:[],zeroLineBorderDashOffset:0,offsetGridLines:!1,borderDash:[],borderDashOffset:0},scaleLabel:{display:!1,labelString:"",padding:{top:4,bottom:4}},ticks:{beginAtZero:!1,minRotation:0,maxRotation:50,mirror:!1,padding:0,reverse:!1,display:!0,autoSkip:!0,autoSkipPadding:0,labelOffset:0,callback:Ho.formatters.values,minor:{},major:{}}});var vn=nr.extend({zeroLineIndex:0,getPadding:function(){var h=this;return{left:h.paddingLeft||0,top:h.paddingTop||0,right:h.paddingRight||0,bottom:h.paddingBottom||0}},getTicks:function(){return this._ticks},_getLabels:function(){var h=this.chart.data;return this.options.labels||(this.isHorizontal()?h.xLabels:h.yLabels)||h.labels||[]},mergeTicksOptions:function(){},beforeUpdate:function(){Ze.callback(this.options.beforeUpdate,[this])},update:function(h,E,N){var be,Ue,we,Xe,gt,k=this,K=k.options.ticks,de=K.sampleSize;if(k.beforeUpdate(),k.maxWidth=h,k.maxHeight=E,k.margins=Ze.extend({left:0,right:0,top:0,bottom:0},N),k._ticks=null,k.ticks=null,k._labelSizes=null,k._maxLabelLines=0,k.longestLabelWidth=0,k.longestTextCache=k.longestTextCache||{},k._gridLineItems=null,k._labelItems=null,k.beforeSetDimensions(),k.setDimensions(),k.afterSetDimensions(),k.beforeDataLimits(),k.determineDataLimits(),k.afterDataLimits(),k.beforeBuildTicks(),Xe=k.buildTicks()||[],(!(Xe=k.afterBuildTicks(Xe)||Xe)||!Xe.length)&&k.ticks)for(Xe=[],be=0,Ue=k.ticks.length;be<Ue;++be)Xe.push({value:k.ticks[be],major:!1});return k._ticks=Xe,we=k._convertTicksToLabels((gt=de<Xe.length)?function(h,E){for(var N=[],k=h.length/E,K=0,de=h.length;K<de;K+=k)N.push(h[Math.floor(K)]);return N}(Xe,de):Xe),k._configure(),k.beforeCalculateTickRotation(),k.calculateTickRotation(),k.afterCalculateTickRotation(),k.beforeFit(),k.fit(),k.afterFit(),k._ticksToDraw=K.display&&(K.autoSkip||"auto"===K.source)?k._autoSkip(Xe):Xe,gt&&(we=k._convertTicksToLabels(k._ticksToDraw)),k.ticks=we,k.afterUpdate(),k.minSize},_configure:function(){var N,k,h=this,E=h.options.ticks.reverse;h.isHorizontal()?(N=h.left,k=h.right):(N=h.top,k=h.bottom,E=!E),h._startPixel=N,h._endPixel=k,h._reversePixels=E,h._length=k-N},afterUpdate:function(){Ze.callback(this.options.afterUpdate,[this])},beforeSetDimensions:function(){Ze.callback(this.options.beforeSetDimensions,[this])},setDimensions:function(){var h=this;h.isHorizontal()?(h.width=h.maxWidth,h.left=0,h.right=h.width):(h.height=h.maxHeight,h.top=0,h.bottom=h.height),h.paddingLeft=0,h.paddingTop=0,h.paddingRight=0,h.paddingBottom=0},afterSetDimensions:function(){Ze.callback(this.options.afterSetDimensions,[this])},beforeDataLimits:function(){Ze.callback(this.options.beforeDataLimits,[this])},determineDataLimits:Ze.noop,afterDataLimits:function(){Ze.callback(this.options.afterDataLimits,[this])},beforeBuildTicks:function(){Ze.callback(this.options.beforeBuildTicks,[this])},buildTicks:Ze.noop,afterBuildTicks:function(h){var E=this;return Ln(h)&&h.length?Ze.callback(E.options.afterBuildTicks,[E,h]):(E.ticks=Ze.callback(E.options.afterBuildTicks,[E,E.ticks])||E.ticks,h)},beforeTickToLabelConversion:function(){Ze.callback(this.options.beforeTickToLabelConversion,[this])},convertTicksToLabels:function(){var h=this,E=h.options.ticks;h.ticks=h.ticks.map(E.userCallback||E.callback,this)},afterTickToLabelConversion:function(){Ze.callback(this.options.afterTickToLabelConversion,[this])},beforeCalculateTickRotation:function(){Ze.callback(this.options.beforeCalculateTickRotation,[this])},calculateTickRotation:function(){var Ue,we,Xe,gt,vt,Jt,Pn,h=this,E=h.options,N=E.ticks,k=h.getTicks().length,K=N.minRotation||0,de=N.maxRotation,be=K;!h._isVisible()||!N.display||K>=de||k<=1||!h.isHorizontal()?h.labelRotation=K:(we=(Ue=h._getLabelSizes()).widest.width,Xe=Ue.highest.height-Ue.highest.offset,gt=Math.min(h.maxWidth,h.chart.width-we),we+6>(vt=E.offset?h.maxWidth/k:gt/(k-1))&&(vt=gt/(k-(E.offset?.5:1)),Jt=h.maxHeight-td(E.gridLines)-N.padding-Lc(E.scaleLabel),Pn=Math.sqrt(we*we+Xe*Xe),be=Ze.toDegrees(Math.min(Math.asin(Math.min((Ue.highest.height+6)/vt,1)),Math.asin(Math.min(Jt/Pn,1))-Math.asin(Xe/Pn))),be=Math.max(K,Math.min(de,be))),h.labelRotation=be)},afterCalculateTickRotation:function(){Ze.callback(this.options.afterCalculateTickRotation,[this])},beforeFit:function(){Ze.callback(this.options.beforeFit,[this])},fit:function(){var h=this,E=h.minSize={width:0,height:0},N=h.chart,k=h.options,K=k.ticks,de=k.scaleLabel,be=k.gridLines,Ue=h._isVisible(),we="bottom"===k.position,Xe=h.isHorizontal();if(Xe?E.width=h.maxWidth:Ue&&(E.width=td(be)+Lc(de)),Xe?Ue&&(E.height=td(be)+Lc(de)):E.height=h.maxHeight,K.display&&Ue){var gt=ki(K),vt=h._getLabelSizes(),Jt=vt.first,Pn=vt.last,Rn=vt.widest,sr=vt.highest,jr=.4*gt.minor.lineHeight,Ni=K.padding;if(Xe){var Vo=0!==h.labelRotation,$o=Ze.toRadians(h.labelRotation),Vs=Math.cos($o),qs=Math.sin($o);E.height=Math.min(h.maxHeight,E.height+(qs*Rn.width+Vs*(sr.height-(Vo?sr.offset:0))+(Vo?0:jr))+Ni);var Pa,ol,ga=h.getPixelForTick(0)-h.left,sa=h.right-h.getPixelForTick(h.getTicks().length-1);Vo?(Pa=we?Vs*Jt.width+qs*Jt.offset:qs*(Jt.height-Jt.offset),ol=we?qs*(Pn.height-Pn.offset):Vs*Pn.width+qs*Pn.offset):(Pa=Jt.width/2,ol=Pn.width/2),h.paddingLeft=Math.max((Pa-ga)*h.width/(h.width-ga),0)+3,h.paddingRight=Math.max((ol-sa)*h.width/(h.width-sa),0)+3}else E.width=Math.min(h.maxWidth,E.width+(K.mirror?0:Rn.width+Ni+jr)),h.paddingTop=Jt.height/2,h.paddingBottom=Pn.height/2}h.handleMargins(),Xe?(h.width=h._length=N.width-h.margins.left-h.margins.right,h.height=E.height):(h.width=E.width,h.height=h._length=N.height-h.margins.top-h.margins.bottom)},handleMargins:function(){var h=this;h.margins&&(h.margins.left=Math.max(h.paddingLeft,h.margins.left),h.margins.top=Math.max(h.paddingTop,h.margins.top),h.margins.right=Math.max(h.paddingRight,h.margins.right),h.margins.bottom=Math.max(h.paddingBottom,h.margins.bottom))},afterFit:function(){Ze.callback(this.options.afterFit,[this])},isHorizontal:function(){var h=this.options.position;return"top"===h||"bottom"===h},isFullWidth:function(){return this.options.fullWidth},getRightValue:function(h){if(Mr(h))return NaN;if(("number"==typeof h||h instanceof Number)&&!isFinite(h))return NaN;if(h)if(this.isHorizontal()){if(void 0!==h.x)return this.getRightValue(h.x)}else if(void 0!==h.y)return this.getRightValue(h.y);return h},_convertTicksToLabels:function(h){var N,k,K,E=this;for(E.ticks=h.map(function(de){return de.value}),E.beforeTickToLabelConversion(),N=E.convertTicksToLabels(h)||E.ticks,E.afterTickToLabelConversion(),k=0,K=h.length;k<K;++k)h[k].label=N[k];return N},_getLabelSizes:function(){var h=this,E=h._labelSizes;return E||(h._labelSizes=E=Ks(h.ctx,ki(h.options.ticks),h.getTicks(),h.longestTextCache),h.longestLabelWidth=E.widest.width),E},_parseValue:function(h){var E,N,k,K;return Ln(h)?(E=+this.getRightValue(h[0]),N=+this.getRightValue(h[1]),k=Math.min(E,N),K=Math.max(E,N)):(E=void 0,N=h=+this.getRightValue(h),k=h,K=h),{min:k,max:K,start:E,end:N}},_getScaleLabel:function(h){var E=this._parseValue(h);return void 0!==E.start?"["+E.start+", "+E.end+"]":+this.getRightValue(h)},getLabelForIndex:Ze.noop,getPixelForValue:Ze.noop,getValueForPixel:Ze.noop,getPixelForTick:function(h){var E=this,N=E.options.offset,k=E._ticks.length,K=1/Math.max(k-(N?0:1),1);return h<0||h>k-1?null:E.getPixelForDecimal(h*K+(N?K/2:0))},getPixelForDecimal:function(h){var E=this;return E._reversePixels&&(h=1-h),E._startPixel+h*E._length},getDecimalForPixel:function(h){var E=(h-this._startPixel)/this._length;return this._reversePixels?1-E:E},getBasePixel:function(){return this.getPixelForValue(this.getBaseValue())},getBaseValue:function(){var h=this,E=h.min,N=h.max;return h.beginAtZero?0:E<0&&N<0?N:E>0&&N>0?E:0},_autoSkip:function(h){var Xe,gt,vt,Jt,E=this,N=E.options.ticks,k=E._length,K=N.maxTicksLimit||k/E._tickSize()+1,de=N.major.enabled?function(h){var N,k,E=[];for(N=0,k=h.length;N<k;N++)h[N].major&&E.push(N);return E}(h):[],be=de.length,Ue=de[0],we=de[be-1];if(be>K)return function(h,E,N){var de,be,k=0,K=E[0];for(N=Math.ceil(N),de=0;de<h.length;de++)be=h[de],de===K?(be._index=de,K=E[++k*N]):delete be.label}(h,de,be/K),No(h);if(vt=function(h,E,N,k){var be,Ue,we,Xe,K=function(h){var N,k,E=h.length;if(E<2)return!1;for(k=h[0],N=1;N<E;++N)if(h[N]-h[N-1]!==k)return!1;return k}(h),de=(E.length-1)/k;if(!K)return Math.max(de,1);for(we=0,Xe=(be=Ze.math._factorize(K)).length-1;we<Xe;we++)if((Ue=be[we])>de)return Ue;return Math.max(de,1)}(de,h,0,K),be>0){for(Xe=0,gt=be-1;Xe<gt;Xe++)vd(h,vt,de[Xe],de[Xe+1]);return vd(h,vt,Ze.isNullOrUndef(Jt=be>1?(we-Ue)/(be-1):null)?0:Ue-Jt,Ue),vd(h,vt,we,Ze.isNullOrUndef(Jt)?h.length:we+Jt),No(h)}return vd(h,vt),No(h)},_tickSize:function(){var h=this,E=h.options.ticks,N=Ze.toRadians(h.labelRotation),k=Math.abs(Math.cos(N)),K=Math.abs(Math.sin(N)),de=h._getLabelSizes(),be=E.autoSkipPadding||0,Ue=de?de.widest.width+be:0,we=de?de.highest.height+be:0;return h.isHorizontal()?we*k>Ue*K?Ue/k:we/K:we*K<Ue*k?we/k:Ue/K},_isVisible:function(){var k,K,de,h=this,E=h.chart,N=h.options.display;if("auto"!==N)return!!N;for(k=0,K=E.data.datasets.length;k<K;++k)if(E.isDatasetVisible(k)&&((de=E.getDatasetMeta(k)).xAxisID===h.id||de.yAxisID===h.id))return!0;return!1},_computeGridLineItems:function(h){var jr,Ni,Vo,$o,Vs,qs,dl,ga,sa,Pa,ol,Eu,wa,au,mu,xc,ic,E=this,N=E.chart,k=E.options,K=k.gridLines,de=k.position,be=K.offsetGridLines,Ue=E.isHorizontal(),we=E._ticksToDraw,Xe=we.length+(be?1:0),gt=td(K),vt=[],Jt=K.drawBorder?co(K.lineWidth,0,0):0,Pn=Jt/2,Rn=Ze._alignPixel,sr=function(gf){return Rn(N,gf,Jt)};for("top"===de?(jr=sr(E.bottom),dl=E.bottom-gt,sa=jr-Pn,ol=sr(h.top)+Pn,wa=h.bottom):"bottom"===de?(jr=sr(E.top),ol=h.top,wa=sr(h.bottom)-Pn,dl=jr+Pn,sa=E.top+gt):"left"===de?(jr=sr(E.right),qs=E.right-gt,ga=jr-Pn,Pa=sr(h.left)+Pn,Eu=h.right):(jr=sr(E.left),Pa=h.left,Eu=sr(h.right)-Pn,qs=jr+Pn,ga=E.left+gt),Ni=0;Ni<Xe;++Ni)!(Mr((Vo=we[Ni]||{}).label)&&Ni<we.length)&&(Ni===E.zeroLineIndex&&k.offset===be?(au=K.zeroLineWidth,mu=K.zeroLineColor,xc=K.zeroLineBorderDash||[],ic=K.zeroLineBorderDashOffset||0):(au=co(K.lineWidth,Ni,1),mu=co(K.color,Ni,"rgba(0,0,0,0.1)"),xc=K.borderDash||[],ic=K.borderDashOffset||0),void 0!==($o=Na(E,Vo._index||Ni,be))&&(Vs=Rn(N,$o,au),Ue?qs=ga=Pa=Eu=Vs:dl=sa=ol=wa=Vs,vt.push({tx1:qs,ty1:dl,tx2:ga,ty2:sa,x1:Pa,y1:ol,x2:Eu,y2:wa,width:au,color:mu,borderDash:xc,borderDashOffset:ic})));return vt.ticksLength=Xe,vt.borderValue=jr,vt},_computeLabelItems:function(){var Jt,Pn,Rn,sr,jr,Ni,Vo,$o,Vs,qs,dl,ga,h=this,E=h.options,N=E.ticks,k=E.position,K=N.mirror,de=h.isHorizontal(),be=h._ticksToDraw,Ue=ki(N),we=N.padding,Xe=td(E.gridLines),gt=-Ze.toRadians(h.labelRotation),vt=[];for("top"===k?(Ni=h.bottom-Xe-we,Vo=gt?"left":"center"):"bottom"===k?(Ni=h.top+Xe+we,Vo=gt?"right":"center"):"left"===k?(jr=h.right-(K?0:Xe)-we,Vo=K?"left":"right"):(jr=h.left+(K?0:Xe)+we,Vo=K?"right":"left"),Jt=0,Pn=be.length;Jt<Pn;++Jt)!Mr(sr=(Rn=be[Jt]).label)&&($o=h.getPixelForTick(Rn._index||Jt)+N.labelOffset,qs=(Vs=Rn.major?Ue.major:Ue.minor).lineHeight,dl=Ln(sr)?sr.length:1,de?(jr=$o,ga="top"===k?((gt?1:.5)-dl)*qs:(gt?0:.5)*qs):(Ni=$o,ga=(1-dl)*qs/2),vt.push({x:jr,y:Ni,rotation:gt,label:sr,font:Vs,textOffset:ga,textAlign:Vo}));return vt},_drawGrid:function(h){var E=this,N=E.options.gridLines;if(N.display){var we,Xe,gt,vt,Jt,k=E.ctx,K=E.chart,de=Ze._alignPixel,be=N.drawBorder?co(N.lineWidth,0,0):0,Ue=E._gridLineItems||(E._gridLineItems=E._computeGridLineItems(h));for(gt=0,vt=Ue.length;gt<vt;++gt)Xe=(Jt=Ue[gt]).color,(we=Jt.width)&&Xe&&(k.save(),k.lineWidth=we,k.strokeStyle=Xe,k.setLineDash&&(k.setLineDash(Jt.borderDash),k.lineDashOffset=Jt.borderDashOffset),k.beginPath(),N.drawTicks&&(k.moveTo(Jt.tx1,Jt.ty1),k.lineTo(Jt.tx2,Jt.ty2)),N.drawOnChartArea&&(k.moveTo(Jt.x1,Jt.y1),k.lineTo(Jt.x2,Jt.y2)),k.stroke(),k.restore());if(be){var jr,Ni,Vo,$o,Pn=be,Rn=co(N.lineWidth,Ue.ticksLength-1,1),sr=Ue.borderValue;E.isHorizontal()?(jr=de(K,E.left,Pn)-Pn/2,Ni=de(K,E.right,Rn)+Rn/2,Vo=$o=sr):(Vo=de(K,E.top,Pn)-Pn/2,$o=de(K,E.bottom,Rn)+Rn/2,jr=Ni=sr),k.lineWidth=be,k.strokeStyle=co(N.color,0),k.beginPath(),k.moveTo(jr,Vo),k.lineTo(Ni,$o),k.stroke()}}},_drawLabels:function(){var h=this;if(h.options.ticks.display){var K,de,be,Ue,we,Xe,gt,vt,N=h.ctx,k=h._labelItems||(h._labelItems=h._computeLabelItems());for(K=0,be=k.length;K<be;++K){if(Xe=(we=k[K]).font,N.save(),N.translate(we.x,we.y),N.rotate(we.rotation),N.font=Xe.string,N.fillStyle=Xe.color,N.textBaseline="middle",N.textAlign=we.textAlign,vt=we.textOffset,Ln(gt=we.label))for(de=0,Ue=gt.length;de<Ue;++de)N.fillText(""+gt[de],0,vt),vt+=Xe.lineHeight;else N.fillText(gt,0,vt);N.restore()}}},_drawTitle:function(){var h=this,E=h.ctx,N=h.options,k=N.scaleLabel;if(k.display){var gt,vt,K=gr(k.fontColor,Tr.global.defaultFontColor),de=Ze.options._parseFont(k),be=Ze.options.toPadding(k.padding),Ue=de.lineHeight/2,we=N.position,Xe=0;if(h.isHorizontal())gt=h.left+h.width/2,vt="bottom"===we?h.bottom-Ue-be.bottom:h.top+Ue+be.top;else{var Jt="left"===we;gt=Jt?h.left+Ue+be.top:h.right-Ue-be.top,vt=h.top+h.height/2,Xe=Jt?-.5*Math.PI:.5*Math.PI}E.save(),E.translate(gt,vt),E.rotate(Xe),E.textAlign="center",E.textBaseline="middle",E.fillStyle=K,E.font=de.string,E.fillText(k.labelString,0,0),E.restore()}},draw:function(h){var E=this;!E._isVisible()||(E._drawGrid(h),E._drawTitle(),E._drawLabels())},_layers:function(){var h=this,E=h.options,N=E.ticks&&E.ticks.z||0,k=E.gridLines&&E.gridLines.z||0;return h._isVisible()&&N!==k&&h.draw===h._draw?[{z:k,draw:function(){h._drawGrid.apply(h,arguments),h._drawTitle.apply(h,arguments)}},{z:N,draw:function(){h._drawLabels.apply(h,arguments)}}]:[{z:N,draw:function(){h.draw.apply(h,arguments)}}]},_getMatchingVisibleMetas:function(h){var E=this,N=E.isHorizontal();return E.chart._getSortedVisibleDatasetMetas().filter(function(k){return(!h||k.type===h)&&(N?k.xAxisID===E.id:k.yAxisID===E.id)})}});vn.prototype._draw=vn.prototype.draw;var Il=vn,nd=Ze.isNullOrUndef,ds=Il.extend({determineDataLimits:function(){var Ue,h=this,E=h._getLabels(),N=h.options.ticks,k=N.min,K=N.max,de=0,be=E.length-1;void 0!==k&&(Ue=E.indexOf(k))>=0&&(de=Ue),void 0!==K&&(Ue=E.indexOf(K))>=0&&(be=Ue),h.minIndex=de,h.maxIndex=be,h.min=E[de],h.max=E[be]},buildTicks:function(){var h=this,E=h._getLabels(),N=h.minIndex,k=h.maxIndex;h.ticks=0===N&&k===E.length-1?E:E.slice(N,k+1)},getLabelForIndex:function(h,E){var N=this,k=N.chart;return k.getDatasetMeta(E).controller._getValueScaleId()===N.id?N.getRightValue(k.data.datasets[E].data[h]):N._getLabels()[h]},_configure:function(){var h=this,E=h.options.offset,N=h.ticks;Il.prototype._configure.call(h),h.isHorizontal()||(h._reversePixels=!h._reversePixels),N&&(h._startValue=h.minIndex-(E?.5:0),h._valueRange=Math.max(N.length-(E?0:1),1))},getPixelForValue:function(h,E,N){var K,de,be,k=this;return!nd(E)&&!nd(N)&&(h=k.chart.data.datasets[N].data[E]),nd(h)||(K=k.isHorizontal()?h.x:h.y),(void 0!==K||void 0!==h&&isNaN(E))&&(de=k._getLabels(),h=Ze.valueOrDefault(K,h),E=-1!==(be=de.indexOf(h))?be:E,isNaN(E)&&(E=h)),k.getPixelForDecimal((E-k._startValue)/k._valueRange)},getPixelForTick:function(h){var E=this.ticks;return h<0||h>E.length-1?null:this.getPixelForValue(E[h],h+this.minIndex)},getValueForPixel:function(h){var E=this,N=Math.round(E._startValue+E.getDecimalForPixel(h)*E._valueRange);return Math.min(Math.max(N,0),E.ticks.length-1)},getBasePixel:function(){return this.bottom}});ds._defaults={position:"bottom"};var nc=Ze.isNullOrUndef;var ul=Il.extend({getRightValue:function(h){return"string"==typeof h?+h:Il.prototype.getRightValue.call(this,h)},handleTickRangeOptions:function(){var h=this,N=h.options.ticks;if(N.beginAtZero){var k=Ze.sign(h.min),K=Ze.sign(h.max);k<0&&K<0?h.max=0:k>0&&K>0&&(h.min=0)}var de=void 0!==N.min||void 0!==N.suggestedMin,be=void 0!==N.max||void 0!==N.suggestedMax;void 0!==N.min?h.min=N.min:void 0!==N.suggestedMin&&(h.min=null===h.min?N.suggestedMin:Math.min(h.min,N.suggestedMin)),void 0!==N.max?h.max=N.max:void 0!==N.suggestedMax&&(h.max=null===h.max?N.suggestedMax:Math.max(h.max,N.suggestedMax)),de!==be&&h.min>=h.max&&(de?h.max=h.min+1:h.min=h.max-1),h.min===h.max&&(h.max++,N.beginAtZero||h.min--)},getTickLimit:function(){var K,h=this,E=h.options.ticks,N=E.stepSize,k=E.maxTicksLimit;return N?K=Math.ceil(h.max/N)-Math.floor(h.min/N)+1:(K=h._computeTickLimit(),k=k||11),k&&(K=Math.min(k,K)),K},_computeTickLimit:function(){return Number.POSITIVE_INFINITY},handleDirectionalChanges:Ze.noop,buildTicks:function(){var h=this,N=h.options.ticks,k=h.getTickLimit(),K={maxTicks:k=Math.max(2,k),min:N.min,max:N.max,precision:N.precision,stepSize:Ze.valueOrDefault(N.fixedStepSize,N.stepSize)},de=h.ticks=function(h,E){var Pn,Rn,sr,jr,N=[],K=h.stepSize,de=K||1,be=h.maxTicks-1,Ue=h.min,we=h.max,Xe=h.precision,gt=E.min,vt=E.max,Jt=Ze.niceNum((vt-gt)/be/de)*de;if(Jt<1e-14&&nc(Ue)&&nc(we))return[gt,vt];(jr=Math.ceil(vt/Jt)-Math.floor(gt/Jt))>be&&(Jt=Ze.niceNum(jr*Jt/be/de)*de),K||nc(Xe)?Pn=Math.pow(10,Ze._decimalPlaces(Jt)):(Pn=Math.pow(10,Xe),Jt=Math.ceil(Jt*Pn)/Pn),Rn=Math.floor(gt/Jt)*Jt,sr=Math.ceil(vt/Jt)*Jt,K&&(!nc(Ue)&&Ze.almostWhole(Ue/Jt,Jt/1e3)&&(Rn=Ue),!nc(we)&&Ze.almostWhole(we/Jt,Jt/1e3)&&(sr=we)),jr=Ze.almostEquals(jr=(sr-Rn)/Jt,Math.round(jr),Jt/1e3)?Math.round(jr):Math.ceil(jr),Rn=Math.round(Rn*Pn)/Pn,sr=Math.round(sr*Pn)/Pn,N.push(nc(Ue)?Rn:Ue);for(var Ni=1;Ni<jr;++Ni)N.push(Math.round((Rn+Ni*Jt)*Pn)/Pn);return N.push(nc(we)?sr:we),N}(K,h);h.handleDirectionalChanges(),h.max=Ze.max(de),h.min=Ze.min(de),N.reverse?(de.reverse(),h.start=h.max,h.end=h.min):(h.start=h.min,h.end=h.max)},convertTicksToLabels:function(){var h=this;h.ticksAsNumbers=h.ticks.slice(),h.zeroLineIndex=h.ticks.indexOf(0),Il.prototype.convertTicksToLabels.call(h)},_configure:function(){var K,h=this,E=h.getTicks(),N=h.min,k=h.max;Il.prototype._configure.call(h),h.options.offset&&E.length&&(N-=K=(k-N)/Math.max(E.length-1,1)/2,k+=K),h._startValue=N,h._endValue=k,h._valueRange=k-N}}),zd={position:"left",ticks:{callback:Ho.formatters.linear}};function Ce(h,E,N,k){var gt,vt,K=h.options,be=function(h,E,N){var k=[N.type,void 0===E&&void 0===N.stack?N.index:"",N.stack].join(".");return void 0===h[k]&&(h[k]={pos:[],neg:[]}),h[k]}(E,K.stacked,N),Ue=be.pos,we=be.neg,Xe=k.length;for(gt=0;gt<Xe;++gt)vt=h._parseValue(k[gt]),!(isNaN(vt.min)||isNaN(vt.max)||N.data[gt].hidden)&&(Ue[gt]=Ue[gt]||0,we[gt]=we[gt]||0,K.relativePoints?Ue[gt]=100:vt.min<0||vt.max<0?we[gt]+=vt.min:Ue[gt]+=vt.max)}function it(h,E,N){var K,de,k=N.length;for(K=0;K<k;++K)de=h._parseValue(N[K]),!(isNaN(de.min)||isNaN(de.max)||E.data[K].hidden)&&(h.min=Math.min(h.min,de.min),h.max=Math.max(h.max,de.max))}var yt=ul.extend({determineDataLimits:function(){var we,Xe,gt,vt,h=this,E=h.options,k=h.chart.data.datasets,K=h._getMatchingVisibleMetas(),de=E.stacked,be={},Ue=K.length;if(h.min=Number.POSITIVE_INFINITY,h.max=Number.NEGATIVE_INFINITY,void 0===de)for(we=0;!de&&we<Ue;++we)de=void 0!==(Xe=K[we]).stack;for(we=0;we<Ue;++we)gt=k[(Xe=K[we]).index].data,de?Ce(h,be,Xe,gt):it(h,Xe,gt);Ze.each(be,function(Jt){vt=Jt.pos.concat(Jt.neg),h.min=Math.min(h.min,Ze.min(vt)),h.max=Math.max(h.max,Ze.max(vt))}),h.min=Ze.isFinite(h.min)&&!isNaN(h.min)?h.min:0,h.max=Ze.isFinite(h.max)&&!isNaN(h.max)?h.max:1,h.handleTickRangeOptions()},_computeTickLimit:function(){var E,h=this;return h.isHorizontal()?Math.ceil(h.width/40):(E=Ze.options._parseFont(h.options.ticks),Math.ceil(h.height/E.lineHeight))},handleDirectionalChanges:function(){this.isHorizontal()||this.ticks.reverse()},getLabelForIndex:function(h,E){return this._getScaleLabel(this.chart.data.datasets[E].data[h])},getPixelForValue:function(h){var E=this;return E.getPixelForDecimal((+E.getRightValue(h)-E._startValue)/E._valueRange)},getValueForPixel:function(h){return this._startValue+this.getDecimalForPixel(h)*this._valueRange},getPixelForTick:function(h){var E=this.ticksAsNumbers;return h<0||h>E.length-1?null:this.getPixelForValue(E[h])}});yt._defaults=zd;var Un=Ze.valueOrDefault,qn=Ze.math.log10;var Go={position:"left",ticks:{callback:Ho.formatters.logarithmic}};function ka(h,E){return Ze.isFinite(h)&&h>=0?h:E}var ss=Il.extend({determineDataLimits:function(){var be,Ue,we,Xe,gt,vt,h=this,E=h.options,N=h.chart,k=N.data.datasets,K=h.isHorizontal();function de(jr){return K?jr.xAxisID===h.id:jr.yAxisID===h.id}h.min=Number.POSITIVE_INFINITY,h.max=Number.NEGATIVE_INFINITY,h.minNotZero=Number.POSITIVE_INFINITY;var Jt=E.stacked;if(void 0===Jt)for(be=0;be<k.length;be++)if(Ue=N.getDatasetMeta(be),N.isDatasetVisible(be)&&de(Ue)&&void 0!==Ue.stack){Jt=!0;break}if(E.stacked||Jt){var Pn={};for(be=0;be<k.length;be++){var Rn=[(Ue=N.getDatasetMeta(be)).type,void 0===E.stacked&&void 0===Ue.stack?be:"",Ue.stack].join(".");if(N.isDatasetVisible(be)&&de(Ue))for(void 0===Pn[Rn]&&(Pn[Rn]=[]),gt=0,vt=(Xe=k[be].data).length;gt<vt;gt++){var sr=Pn[Rn];we=h._parseValue(Xe[gt]),!(isNaN(we.min)||isNaN(we.max)||Ue.data[gt].hidden||we.min<0||we.max<0)&&(sr[gt]=sr[gt]||0,sr[gt]+=we.max)}}Ze.each(Pn,function(jr){if(jr.length>0){var Ni=Ze.min(jr),Vo=Ze.max(jr);h.min=Math.min(h.min,Ni),h.max=Math.max(h.max,Vo)}})}else for(be=0;be<k.length;be++)if(Ue=N.getDatasetMeta(be),N.isDatasetVisible(be)&&de(Ue))for(gt=0,vt=(Xe=k[be].data).length;gt<vt;gt++)we=h._parseValue(Xe[gt]),!(isNaN(we.min)||isNaN(we.max)||Ue.data[gt].hidden||we.min<0||we.max<0)&&(h.min=Math.min(we.min,h.min),h.max=Math.max(we.max,h.max),0!==we.min&&(h.minNotZero=Math.min(we.min,h.minNotZero)));h.min=Ze.isFinite(h.min)?h.min:null,h.max=Ze.isFinite(h.max)?h.max:null,h.minNotZero=Ze.isFinite(h.minNotZero)?h.minNotZero:null,this.handleTickRangeOptions()},handleTickRangeOptions:function(){var h=this,E=h.options.ticks;h.min=ka(E.min,h.min),h.max=ka(E.max,h.max),h.min===h.max&&(0!==h.min&&null!==h.min?(h.min=Math.pow(10,Math.floor(qn(h.min))-1),h.max=Math.pow(10,Math.floor(qn(h.max))+1)):(h.min=1,h.max=10)),null===h.min&&(h.min=Math.pow(10,Math.floor(qn(h.max))-1)),null===h.max&&(h.max=0!==h.min?Math.pow(10,Math.floor(qn(h.min))+1):10),null===h.minNotZero&&(h.minNotZero=h.min>0?h.min:h.max<1?Math.pow(10,Math.floor(qn(h.max))):1)},buildTicks:function(){var h=this,E=h.options.ticks,N=!h.isHorizontal(),k={min:ka(E.min),max:ka(E.max)},K=h.ticks=function(h,E){var be,Ue,N=[],k=Un(h.min,Math.pow(10,Math.floor(qn(E.min)))),K=Math.floor(qn(E.max)),de=Math.ceil(E.max/Math.pow(10,K));0===k?(be=Math.floor(qn(E.minNotZero)),Ue=Math.floor(E.minNotZero/Math.pow(10,be)),N.push(k),k=Ue*Math.pow(10,be)):(be=Math.floor(qn(k)),Ue=Math.floor(k/Math.pow(10,be)));var we=be<0?Math.pow(10,Math.abs(be)):1;do{N.push(k),10==++Ue&&(Ue=1,we=++be>=0?1:we),k=Math.round(Ue*Math.pow(10,be)*we)/we}while(be<K||be===K&&Ue<de);var Xe=Un(h.max,k);return N.push(Xe),N}(k,h);h.max=Ze.max(K),h.min=Ze.min(K),E.reverse?(N=!N,h.start=h.max,h.end=h.min):(h.start=h.min,h.end=h.max),N&&K.reverse()},convertTicksToLabels:function(){this.tickValues=this.ticks.slice(),Il.prototype.convertTicksToLabels.call(this)},getLabelForIndex:function(h,E){return this._getScaleLabel(this.chart.data.datasets[E].data[h])},getPixelForTick:function(h){var E=this.tickValues;return h<0||h>E.length-1?null:this.getPixelForValue(E[h])},_getFirstTickValue:function(h){var E=Math.floor(qn(h));return Math.floor(h/Math.pow(10,E))*Math.pow(10,E)},_configure:function(){var h=this,E=h.min,N=0;Il.prototype._configure.call(h),0===E&&(E=h._getFirstTickValue(h.minNotZero),N=Un(h.options.ticks.fontSize,Tr.global.defaultFontSize)/h._length),h._startValue=qn(E),h._valueOffset=N,h._valueRange=(qn(h.max)-qn(E))/(1-N)},getPixelForValue:function(h){var E=this,N=0;return(h=+E.getRightValue(h))>E.min&&h>0&&(N=(qn(h)-E._startValue)/E._valueRange+E._valueOffset),E.getPixelForDecimal(N)},getValueForPixel:function(h){var E=this,N=E.getDecimalForPixel(h);return 0===N&&0===E.min?0:Math.pow(10,E._startValue+(N-E._valueOffset)*E._valueRange)}});ss._defaults=Go;var Us=Ze.valueOrDefault,fc=Ze.valueAtIndexOrDefault,va=Ze.options.resolve,wl={display:!0,animate:!0,position:"chartArea",angleLines:{display:!0,color:"rgba(0,0,0,0.1)",lineWidth:1,borderDash:[],borderDashOffset:0},gridLines:{circular:!1},ticks:{showLabelBackdrop:!0,backdropColor:"rgba(255,255,255,0.75)",backdropPaddingY:2,backdropPaddingX:2,callback:Ho.formatters.linear},pointLabels:{display:!0,fontSize:10,callback:function(h){return h}}};function tl(h){var E=h.ticks;return E.display&&h.display?Us(E.fontSize,Tr.global.defaultFontSize)+2*E.backdropPaddingY:0}function $a(h,E,N){return Ze.isArray(N)?{w:Ze.longestText(h,h.font,N),h:N.length*E}:{w:h.measureText(N).width,h:E}}function Ha(h,E,N,k,K){return h===k||h===K?{start:E-N/2,end:E+N/2}:h<k||h>K?{start:E-N,end:E}:{start:E,end:E+N}}function Of(h){return 0===h||180===h?"center":h<180?"left":"right"}function Dd(h,E,N,k){var de,be,K=N.y+k/2;if(Ze.isArray(E))for(de=0,be=E.length;de<be;++de)h.fillText(E[de],N.x,K),K+=k;else h.fillText(E,N.x,K)}function Jd(h,E,N){90===h||270===h?N.y-=E.h/2:(h>270||h<90)&&(N.y-=E.h)}function Sc(h){return Ze.isNumber(h)?h:0}var Qd=ul.extend({setDimensions:function(){var h=this;h.width=h.maxWidth,h.height=h.maxHeight,h.paddingTop=tl(h.options)/2,h.xCenter=Math.floor(h.width/2),h.yCenter=Math.floor((h.height-h.paddingTop)/2),h.drawingArea=Math.min(h.height-h.paddingTop,h.width)/2},determineDataLimits:function(){var h=this,E=h.chart,N=Number.POSITIVE_INFINITY,k=Number.NEGATIVE_INFINITY;Ze.each(E.data.datasets,function(K,de){if(E.isDatasetVisible(de)){var be=E.getDatasetMeta(de);Ze.each(K.data,function(Ue,we){var Xe=+h.getRightValue(Ue);isNaN(Xe)||be.data[we].hidden||(N=Math.min(Xe,N),k=Math.max(Xe,k))})}}),h.min=N===Number.POSITIVE_INFINITY?0:N,h.max=k===Number.NEGATIVE_INFINITY?0:k,h.handleTickRangeOptions()},_computeTickLimit:function(){return Math.ceil(this.drawingArea/tl(this.options))},convertTicksToLabels:function(){var h=this;ul.prototype.convertTicksToLabels.call(h),h.pointLabels=h.chart.data.labels.map(function(){var E=Ze.callback(h.options.pointLabels.callback,arguments,h);return E||0===E?E:""})},getLabelForIndex:function(h,E){return+this.getRightValue(this.chart.data.datasets[E].data[h])},fit:function(){var h=this,E=h.options;E.display&&E.pointLabels.display?function(h){var K,de,be,E=Ze.options._parseFont(h.options.pointLabels),N={l:0,r:h.width,t:0,b:h.height-h.paddingTop},k={};h.ctx.font=E.string,h._pointLabelSizes=[];var Ue=h.chart.data.labels.length;for(K=0;K<Ue;K++){be=h.getPointPosition(K,h.drawingArea+5),de=$a(h.ctx,E.lineHeight,h.pointLabels[K]),h._pointLabelSizes[K]=de;var we=h.getIndexAngle(K),Xe=Ze.toDegrees(we)%360,gt=Ha(Xe,be.x,de.w,0,180),vt=Ha(Xe,be.y,de.h,90,270);gt.start<N.l&&(N.l=gt.start,k.l=we),gt.end>N.r&&(N.r=gt.end,k.r=we),vt.start<N.t&&(N.t=vt.start,k.t=we),vt.end>N.b&&(N.b=vt.end,k.b=we)}h.setReductions(h.drawingArea,N,k)}(h):h.setCenterPoint(0,0,0,0)},setReductions:function(h,E,N){var k=this,K=E.l/Math.sin(N.l),de=Math.max(E.r-k.width,0)/Math.sin(N.r),be=-E.t/Math.cos(N.t),Ue=-Math.max(E.b-(k.height-k.paddingTop),0)/Math.cos(N.b);K=Sc(K),de=Sc(de),be=Sc(be),Ue=Sc(Ue),k.drawingArea=Math.min(Math.floor(h-(K+de)/2),Math.floor(h-(be+Ue)/2)),k.setCenterPoint(K,de,be,Ue)},setCenterPoint:function(h,E,N,k){var K=this,Ue=N+K.drawingArea,we=K.height-K.paddingTop-k-K.drawingArea;K.xCenter=Math.floor((h+K.drawingArea+(K.width-E-K.drawingArea))/2+K.left),K.yCenter=Math.floor((Ue+we)/2+K.top+K.paddingTop)},getIndexAngle:function(h){var E=this.chart,de=(h*(360/E.data.labels.length)+((E.options||{}).startAngle||0))%360;return(de<0?de+360:de)*Math.PI*2/360},getDistanceFromCenterForValue:function(h){var E=this;if(Ze.isNullOrUndef(h))return NaN;var N=E.drawingArea/(E.max-E.min);return E.options.ticks.reverse?(E.max-h)*N:(h-E.min)*N},getPointPosition:function(h,E){var N=this,k=N.getIndexAngle(h)-Math.PI/2;return{x:Math.cos(k)*E+N.xCenter,y:Math.sin(k)*E+N.yCenter}},getPointPositionForValue:function(h,E){return this.getPointPosition(h,this.getDistanceFromCenterForValue(E))},getBasePosition:function(h){var E=this,N=E.min,k=E.max;return E.getPointPositionForValue(h||0,E.beginAtZero?0:N<0&&k<0?k:N>0&&k>0?N:0)},_drawGrid:function(){var Ue,we,Xe,h=this,E=h.ctx,N=h.options,k=N.gridLines,K=N.angleLines,de=Us(K.lineWidth,k.lineWidth),be=Us(K.color,k.color);if(N.pointLabels.display&&function(h){var E=h.ctx,N=h.options,k=N.pointLabels,K=tl(N),de=h.getDistanceFromCenterForValue(N.ticks.reverse?h.min:h.max),be=Ze.options._parseFont(k);E.save(),E.font=be.string,E.textBaseline="middle";for(var Ue=h.chart.data.labels.length-1;Ue>=0;Ue--){var Xe=h.getPointPosition(Ue,de+(0===Ue?K/2:0)+5),gt=fc(k.fontColor,Ue,Tr.global.defaultFontColor);E.fillStyle=gt;var vt=h.getIndexAngle(Ue),Jt=Ze.toDegrees(vt);E.textAlign=Of(Jt),Jd(Jt,h._pointLabelSizes[Ue],Xe),Dd(E,h.pointLabels[Ue],Xe,be.lineHeight)}E.restore()}(h),k.display&&Ze.each(h.ticks,function(gt,vt){0!==vt&&(we=h.getDistanceFromCenterForValue(h.ticksAsNumbers[vt]),function(h,E,N,k){var Xe,K=h.ctx,de=E.circular,be=h.chart.data.labels.length,Ue=fc(E.color,k-1),we=fc(E.lineWidth,k-1);if((de||be)&&Ue&&we){if(K.save(),K.strokeStyle=Ue,K.lineWidth=we,K.setLineDash&&(K.setLineDash(E.borderDash||[]),K.lineDashOffset=E.borderDashOffset||0),K.beginPath(),de)K.arc(h.xCenter,h.yCenter,N,0,2*Math.PI);else{Xe=h.getPointPosition(0,N),K.moveTo(Xe.x,Xe.y);for(var gt=1;gt<be;gt++)Xe=h.getPointPosition(gt,N),K.lineTo(Xe.x,Xe.y)}K.closePath(),K.stroke(),K.restore()}}(h,k,we,vt))}),K.display&&de&&be){for(E.save(),E.lineWidth=de,E.strokeStyle=be,E.setLineDash&&(E.setLineDash(va([K.borderDash,k.borderDash,[]])),E.lineDashOffset=va([K.borderDashOffset,k.borderDashOffset,0])),Ue=h.chart.data.labels.length-1;Ue>=0;Ue--)we=h.getDistanceFromCenterForValue(N.ticks.reverse?h.min:h.max),Xe=h.getPointPosition(Ue,we),E.beginPath(),E.moveTo(h.xCenter,h.yCenter),E.lineTo(Xe.x,Xe.y),E.stroke();E.restore()}},_drawLabels:function(){var h=this,E=h.ctx,k=h.options.ticks;if(k.display){var Ue,we,K=h.getIndexAngle(0),de=Ze.options._parseFont(k),be=Us(k.fontColor,Tr.global.defaultFontColor);E.save(),E.font=de.string,E.translate(h.xCenter,h.yCenter),E.rotate(K),E.textAlign="center",E.textBaseline="middle",Ze.each(h.ticks,function(Xe,gt){0===gt&&!k.reverse||(Ue=h.getDistanceFromCenterForValue(h.ticksAsNumbers[gt]),k.showLabelBackdrop&&(we=E.measureText(Xe).width,E.fillStyle=k.backdropColor,E.fillRect(-we/2-k.backdropPaddingX,-Ue-de.size/2-k.backdropPaddingY,we+2*k.backdropPaddingX,de.size+2*k.backdropPaddingY)),E.fillStyle=be,E.fillText(Xe,0,-Ue))}),E.restore()}},_drawTitle:Ze.noop});Qd._defaults=wl;var Ff=Ze._deprecated,zu=Ze.options.resolve,Tl=Ze.valueOrDefault,xl=Number.MIN_SAFE_INTEGER||-9007199254740991,kl=Number.MAX_SAFE_INTEGER||9007199254740991,Nu={millisecond:{common:!0,size:1,steps:1e3},second:{common:!0,size:1e3,steps:60},minute:{common:!0,size:6e4,steps:60},hour:{common:!0,size:36e5,steps:24},day:{common:!0,size:864e5,steps:30},week:{common:!1,size:6048e5,steps:4},month:{common:!0,size:2628e6,steps:12},quarter:{common:!1,size:7884e6,steps:4},year:{common:!0,size:3154e7}},Qa=Object.keys(Nu);function Wu(h,E){return h-E}function Mc(h){return Ze.valueOrDefault(h.time.min,h.ticks.min)}function Ou(h){return Ze.valueOrDefault(h.time.max,h.ticks.max)}function ff(h,E,N,k){var K=function(h,E,N){for(var de,be,Ue,k=0,K=h.length-1;k>=0&&k<=K;){if(Ue=h[de=k+K>>1],!(be=h[de-1]||null))return{lo:null,hi:Ue};if(Ue[E]<N)k=de+1;else{if(!(be[E]>N))return{lo:be,hi:Ue};K=de-1}}return{lo:Ue,hi:null}}(h,E,N),de=K.lo?K.hi?K.lo:h[h.length-2]:h[0],be=K.lo?K.hi?K.hi:h[h.length-1]:h[1],Ue=be[E]-de[E];return de[k]+(be[k]-de[k])*(Ue?(N-de[E])/Ue:0)}function Xl(h,E){var N=h._adapter,k=h.options.time,K=k.parser,de=K||k.format,be=E;return"function"==typeof K&&(be=K(be)),Ze.isFinite(be)||(be="string"==typeof de?N.parse(be,de):N.parse(be)),null!==be?+be:(!K&&"function"==typeof de&&(be=de(E),Ze.isFinite(be)||(be=N.parse(be))),be)}function yd(h,E){if(Ze.isNullOrUndef(E))return null;var N=h.options.time,k=Xl(h,h.getRightValue(E));return null===k||N.round&&(k=+h._adapter.startOf(k,N.round)),k}function Ac(h,E,N,k){var de,be,K=Qa.length;for(de=Qa.indexOf(h);de<K-1;++de)if((be=Nu[Qa[de]]).common&&Math.ceil((N-E)/((be.steps?be.steps:kl)*be.size))<=k)return Qa[de];return Qa[K-1]}function su(h,E,N){var be,Ue,k=[],K={},de=E.length;for(be=0;be<de;++be)K[Ue=E[be]]=be,k.push({value:Ue,major:!1});return 0!==de&&N?function(h,E,N,k){var Ue,we,K=h._adapter,de=+K.startOf(E[0].value,k),be=E[E.length-1].value;for(Ue=de;Ue<=be;Ue=+K.add(Ue,1,k))(we=N[Ue])>=0&&(E[we].major=!0);return E}(h,k,K,N):k}var kp=Il.extend({initialize:function(){this.mergeTicksOptions(),Il.prototype.initialize.call(this)},update:function(){var h=this,E=h.options,N=E.time||(E.time={}),k=h._adapter=new ko._date(E.adapters.date);return Ff("time scale",N.format,"time.format","time.parser"),Ff("time scale",N.min,"time.min","ticks.min"),Ff("time scale",N.max,"time.max","ticks.max"),Ze.mergeIf(N.displayFormats,k.formats()),Il.prototype.update.apply(h,arguments)},getRightValue:function(h){return h&&void 0!==h.t&&(h=h.t),Il.prototype.getRightValue.call(this,h)},determineDataLimits:function(){var gt,vt,Jt,Pn,Rn,sr,jr,h=this,E=h.chart,N=h._adapter,k=h.options,K=k.time.unit||"day",de=kl,be=xl,Ue=[],we=[],Xe=[],Ni=h._getLabels();for(gt=0,Jt=Ni.length;gt<Jt;++gt)Xe.push(yd(h,Ni[gt]));for(gt=0,Jt=(E.data.datasets||[]).length;gt<Jt;++gt)if(E.isDatasetVisible(gt))if(Ze.isObject((Rn=E.data.datasets[gt].data)[0]))for(we[gt]=[],vt=0,Pn=Rn.length;vt<Pn;++vt)sr=yd(h,Rn[vt]),Ue.push(sr),we[gt][vt]=sr;else we[gt]=Xe.slice(0),jr||(Ue=Ue.concat(Xe),jr=!0);else we[gt]=[];Xe.length&&(de=Math.min(de,Xe[0]),be=Math.max(be,Xe[Xe.length-1])),Ue.length&&(Ue=Jt>1?function(h){var k,K,de,E={},N=[];for(k=0,K=h.length;k<K;++k)E[de=h[k]]||(E[de]=!0,N.push(de));return N}(Ue).sort(Wu):Ue.sort(Wu),de=Math.min(de,Ue[0]),be=Math.max(be,Ue[Ue.length-1])),de=yd(h,Mc(k))||de,be=yd(h,Ou(k))||be,de=de===kl?+N.startOf(Date.now(),K):de,be=be===xl?+N.endOf(Date.now(),K)+1:be,h.min=Math.min(de,be),h.max=Math.max(de+1,be),h._table=[],h._timestamps={data:Ue,datasets:we,labels:Xe}},buildTicks:function(){var vt,Jt,Pn,h=this,E=h.min,N=h.max,k=h.options,K=k.ticks,de=k.time,be=h._timestamps,Ue=[],we=h.getLabelCapacity(E),Xe=K.source,gt=k.distribution;for(be="data"===Xe||"auto"===Xe&&"series"===gt?be.data:"labels"===Xe?be.labels:function(h,E,N,k){var Jt,K=h._adapter,de=h.options,be=de.time,Ue=be.unit||Ac(be.minUnit,E,N,k),we=zu([be.stepSize,be.unitStepSize,1]),Xe="week"===Ue&&be.isoWeekday,gt=E,vt=[];if(Xe&&(gt=+K.startOf(gt,"isoWeek",Xe)),gt=+K.startOf(gt,Xe?"day":Ue),K.diff(N,E,Ue)>1e5*we)throw E+" and "+N+" are too far apart with stepSize of "+we+" "+Ue;for(Jt=gt;Jt<N;Jt=+K.add(Jt,we,Ue))vt.push(Jt);return(Jt===N||"ticks"===de.bounds)&&vt.push(Jt),vt}(h,E,N,we),"ticks"===k.bounds&&be.length&&(E=be[0],N=be[be.length-1]),E=yd(h,Mc(k))||E,N=yd(h,Ou(k))||N,vt=0,Jt=be.length;vt<Jt;++vt)(Pn=be[vt])>=E&&Pn<=N&&Ue.push(Pn);return h.min=E,h.max=N,h._unit=de.unit||(K.autoSkip?Ac(de.minUnit,h.min,h.max,we):function(h,E,N,k,K){var de,be;for(de=Qa.length-1;de>=Qa.indexOf(N);de--)if(Nu[be=Qa[de]].common&&h._adapter.diff(K,k,be)>=E-1)return be;return Qa[N?Qa.indexOf(N):0]}(h,Ue.length,de.minUnit,h.min,h.max)),h._majorUnit=K.major.enabled&&"year"!==h._unit?function(h){for(var E=Qa.indexOf(h)+1,N=Qa.length;E<N;++E)if(Nu[Qa[E]].common)return Qa[E]}(h._unit):void 0,h._table=function(h,E,N,k){if("linear"===k||!h.length)return[{time:E,pos:0},{time:N,pos:1}];var be,Ue,we,Xe,gt,K=[],de=[E];for(be=0,Ue=h.length;be<Ue;++be)(Xe=h[be])>E&&Xe<N&&de.push(Xe);for(de.push(N),be=0,Ue=de.length;be<Ue;++be)gt=de[be+1],Xe=de[be],(void 0===(we=de[be-1])||void 0===gt||Math.round((gt+we)/2)!==Xe)&&K.push({time:Xe,pos:be/(Ue-1)});return K}(h._timestamps.data,E,N,gt),h._offsets=function(h,E,N,k,K){var Ue,we,de=0,be=0;return K.offset&&E.length&&(Ue=ff(h,"time",E[0],"pos"),de=1===E.length?1-Ue:(ff(h,"time",E[1],"pos")-Ue)/2,we=ff(h,"time",E[E.length-1],"pos"),be=1===E.length?we:(we-ff(h,"time",E[E.length-2],"pos"))/2),{start:de,end:be,factor:1/(de+1+be)}}(h._table,Ue,0,0,k),K.reverse&&Ue.reverse(),su(h,Ue,h._majorUnit)},getLabelForIndex:function(h,E){var N=this,k=N._adapter,K=N.chart.data,de=N.options.time,be=K.labels&&h<K.labels.length?K.labels[h]:"",Ue=K.datasets[E].data[h];return Ze.isObject(Ue)&&(be=N.getRightValue(Ue)),de.tooltipFormat?k.format(Xl(N,be),de.tooltipFormat):"string"==typeof be?be:k.format(Xl(N,be),de.displayFormats.datetime)},tickFormatFunction:function(h,E,N,k){var K=this,be=K.options,Ue=be.time.displayFormats,Xe=K._majorUnit,gt=Ue[Xe],vt=N[E],Jt=be.ticks,Pn=Xe&&gt&&vt&&vt.major,Rn=K._adapter.format(h,k||(Pn?gt:Ue[K._unit])),sr=Pn?Jt.major:Jt.minor,jr=zu([sr.callback,sr.userCallback,Jt.callback,Jt.userCallback]);return jr?jr(Rn,E,N):Rn},convertTicksToLabels:function(h){var N,k,E=[];for(N=0,k=h.length;N<k;++N)E.push(this.tickFormatFunction(h[N].value,N,h));return E},getPixelForOffset:function(h){var E=this,N=E._offsets,k=ff(E._table,"time",h,"pos");return E.getPixelForDecimal((N.start+k)*N.factor)},getPixelForValue:function(h,E,N){var k=this,K=null;if(void 0!==E&&void 0!==N&&(K=k._timestamps.datasets[N][E]),null===K&&(K=yd(k,h)),null!==K)return k.getPixelForOffset(K)},getPixelForTick:function(h){var E=this.getTicks();return h>=0&&h<E.length?this.getPixelForOffset(E[h].value):null},getValueForPixel:function(h){var E=this,N=E._offsets,k=E.getDecimalForPixel(h)/N.factor-N.end,K=ff(E._table,"pos",k,"time");return E._adapter._create(K)},_getLabelSize:function(h){var E=this,N=E.options.ticks,k=E.ctx.measureText(h).width,K=Ze.toRadians(E.isHorizontal()?N.maxRotation:N.minRotation),de=Math.cos(K),be=Math.sin(K),Ue=Tl(N.fontSize,Tr.global.defaultFontSize);return{w:k*de+Ue*be,h:k*be+Ue*de}},getLabelWidth:function(h){return this._getLabelSize(h).w},getLabelCapacity:function(h){var E=this,N=E.options.time,k=N.displayFormats,K=k[N.unit]||k.millisecond,de=E.tickFormatFunction(h,0,su(E,[h],E._majorUnit),K),be=E._getLabelSize(de),Ue=Math.floor(E.isHorizontal()?E.width/be.w:E.height/be.h);return E.options.offset&&Ue--,Ue>0?Ue:1}});kp._defaults={position:"bottom",distribution:"linear",bounds:"data",adapters:{},time:{parser:!1,unit:!1,round:!1,displayFormat:!1,isoWeekday:!1,minUnit:"millisecond",displayFormats:{}},ticks:{autoSkip:!1,source:"auto",major:{enabled:!1}}};var _f={category:ds,linear:yt,logarithmic:ss,radialLinear:Qd,time:kp},Mh={datetime:"MMM D, YYYY, h:mm:ss a",millisecond:"h:mm:ss.SSS a",second:"h:mm:ss a",minute:"h:mm a",hour:"hA",day:"MMM D",week:"ll",month:"MMM YYYY",quarter:"[Q]Q - YYYY",year:"YYYY"};ko._date.override("function"==typeof r?{_id:"moment",formats:function(){return Mh},parse:function(h,E){return"string"==typeof h&&"string"==typeof E?h=r(h,E):h instanceof r||(h=r(h)),h.isValid()?h.valueOf():null},format:function(h,E){return r(h).format(E)},add:function(h,E,N){return r(h).add(E,N).valueOf()},diff:function(h,E,N){return r(h).diff(r(E),N)},startOf:function(h,E,N){return h=r(h),"isoWeek"===E?h.isoWeekday(N).valueOf():h.startOf(E).valueOf()},endOf:function(h,E){return r(h).endOf(E).valueOf()},_create:function(h){return r(h)}}:{}),Tr._set("global",{plugins:{filler:{propagate:!0}}});var Kl={dataset:function(h){var E=h.fill,N=h.chart,k=N.getDatasetMeta(E),de=k&&N.isDatasetVisible(E)&&k.dataset._children||[],be=de.length||0;return be?function(Ue,we){return we<be&&de[we]._view||null}:null},boundary:function(h){var E=h.boundary,N=E?E.x:null,k=E?E.y:null;return Ze.isArray(E)?function(K,de){return E[de]}:function(K){return{x:null===N?K.x:N,y:null===k?K.y:k}}}};function kf(h,E,N){var de,k=h._model||{},K=k.fill;if(void 0===K&&(K=!!k.backgroundColor),!1===K||null===K)return!1;if(!0===K)return"origin";if(de=parseFloat(K,10),isFinite(de)&&Math.floor(de)===de)return("-"===K[0]||"+"===K[0])&&(de=E+de),!(de===E||de<0||de>=N)&&de;switch(K){case"bottom":return"start";case"top":return"end";case"zero":return"origin";case"origin":case"start":case"end":return K;default:return!1}}function Rd(h){return(h.el._scale||{}).getPointPositionForValue?function(h){var be,Ue,we,Xe,gt,E=h.el._scale,N=E.options,k=E.chart.data.labels.length,K=h.fill,de=[];if(!k)return null;for(Ue=N.ticks.reverse?E.min:E.max,we=E.getPointPositionForValue(0,be=N.ticks.reverse?E.max:E.min),Xe=0;Xe<k;++Xe)gt="start"===K||"end"===K?E.getPointPositionForValue(Xe,"start"===K?be:Ue):E.getBasePosition(Xe),N.gridLines.circular&&(gt.cx=we.x,gt.cy=we.y,gt.angle=E.getIndexAngle(Xe)-Math.PI/2),de.push(gt);return de}(h):function(h){var de,E=h.el._model||{},N=h.el._scale||{},k=h.fill,K=null;if(isFinite(k))return null;if("start"===k?K=void 0===E.scaleBottom?N.bottom:E.scaleBottom:"end"===k?K=void 0===E.scaleTop?N.top:E.scaleTop:void 0!==E.scaleZero?K=E.scaleZero:N.getBasePixel&&(K=N.getBasePixel()),null!=K){if(void 0!==K.x&&void 0!==K.y)return K;if(Ze.isFinite(K))return{x:(de=N.isHorizontal())?K:null,y:de?null:K}}return null}(h)}function wc(h,E,N){var be,K=h[E].fill,de=[E];if(!N)return K;for(;!1!==K&&-1===de.indexOf(K);){if(!isFinite(K))return K;if(!(be=h[K]))return!1;if(be.visible)return K;de.push(K),K=be.fill}return!1}function ql(h){var E=h.fill,N="dataset";return!1===E?null:(isFinite(E)||(N="boundary"),Kl[N](h))}function Ji(h){return h&&!h.skip}function cl(h,E,N,k,K){var de,be,Ue,we;if(k&&K){for(h.moveTo(E[0].x,E[0].y),de=1;de<k;++de)Ze.canvas.lineTo(h,E[de-1],E[de]);if(void 0!==N[0].angle){for(be=N[0].cx,Ue=N[0].cy,we=Math.sqrt(Math.pow(N[0].x-be,2)+Math.pow(N[0].y-Ue,2)),de=K-1;de>0;--de)h.arc(be,Ue,we,N[de].angle,N[de-1].angle,!0);return}for(h.lineTo(N[K-1].x,N[K-1].y),de=K-1;de>0;--de)Ze.canvas.lineTo(h,N[de],N[de-1],!0)}}function Ll(h,E,N,k,K,de){var Jt,Pn,Rn,sr,jr,Ni,Vo,$o,be=E.length,Ue=k.spanGaps,we=[],Xe=[],gt=0,vt=0;for(h.beginPath(),Jt=0,Pn=be;Jt<Pn;++Jt)jr=N(sr=E[Rn=Jt%be]._view,Rn,k),Ni=Ji(sr),Vo=Ji(jr),de&&void 0===$o&&Ni&&(Pn=be+($o=Jt+1)),Ni&&Vo?(gt=we.push(sr),vt=Xe.push(jr)):gt&&vt&&(Ue?(Ni&&we.push(sr),Vo&&Xe.push(jr)):(cl(h,we,Xe,gt,vt),gt=vt=0,we=[],Xe=[]));cl(h,we,Xe,gt,vt),h.closePath(),h.fillStyle=K,h.fill()}var Nd={id:"filler",afterDatasetsUpdate:function(h,E){var de,be,Ue,we,N=(h.data.datasets||[]).length,k=E.propagate,K=[];for(be=0;be<N;++be)we=null,(Ue=(de=h.getDatasetMeta(be)).dataset)&&Ue._model&&Ue instanceof Do.Line&&(we={visible:h.isDatasetVisible(be),fill:kf(Ue,be,N),chart:h,el:Ue}),de.$filler=we,K.push(we);for(be=0;be<N;++be)(we=K[be])&&(we.fill=wc(K,be,k),we.boundary=Rd(we),we.mapper=ql(we))},beforeDatasetsDraw:function(h){var k,K,de,be,Ue,we,Xe,E=h._getSortedVisibleDatasetMetas(),N=h.ctx;for(K=E.length-1;K>=0;--K)(k=E[K].$filler)&&k.visible&&(Ue=(de=k.el)._children||[],Xe=(be=de._view).backgroundColor||Tr.global.defaultColor,(we=k.mapper)&&Xe&&Ue.length&&(Ze.canvas.clipArea(N,h.chartArea),Ll(N,Ue,we,be,Xe,de._loop),Ze.canvas.unclipArea(N)))}},il=Ze.rtl.getRtlAdapter,Bu=Ze.noop,pc=Ze.valueOrDefault;function Xd(h,E){return h.usePointStyle&&h.boxWidth>E?E:h.boxWidth}Tr._set("global",{legend:{display:!0,position:"top",align:"center",fullWidth:!0,reverse:!1,weight:1e3,onClick:function(h,E){var N=E.datasetIndex,k=this.chart,K=k.getDatasetMeta(N);K.hidden=null===K.hidden?!k.data.datasets[N].hidden:null,k.update()},onHover:null,onLeave:null,labels:{boxWidth:40,padding:10,generateLabels:function(h){var E=h.data.datasets,N=h.options.legend||{},k=N.labels&&N.labels.usePointStyle;return h._getSortedDatasetMetas().map(function(K){var de=K.controller.getStyle(k?0:void 0);return{text:E[K.index].label,fillStyle:de.backgroundColor,hidden:!h.isDatasetVisible(K.index),lineCap:de.borderCapStyle,lineDash:de.borderDash,lineDashOffset:de.borderDashOffset,lineJoin:de.borderJoinStyle,lineWidth:de.borderWidth,strokeStyle:de.borderColor,pointStyle:de.pointStyle,rotation:de.rotation,datasetIndex:K.index}},this)}}},legendCallback:function(h){var k,K,de,E=document.createElement("ul"),N=h.data.datasets;for(E.setAttribute("class",h.id+"-legend"),k=0,K=N.length;k<K;k++)(de=E.appendChild(document.createElement("li"))).appendChild(document.createElement("span")).style.backgroundColor=N[k].backgroundColor,N[k].label&&de.appendChild(document.createTextNode(N[k].label));return E.outerHTML}});var wf=nr.extend({initialize:function(h){var E=this;Ze.extend(E,h),E.legendHitBoxes=[],E._hoveredItem=null,E.doughnutMode=!1},beforeUpdate:Bu,update:function(h,E,N){var k=this;return k.beforeUpdate(),k.maxWidth=h,k.maxHeight=E,k.margins=N,k.beforeSetDimensions(),k.setDimensions(),k.afterSetDimensions(),k.beforeBuildLabels(),k.buildLabels(),k.afterBuildLabels(),k.beforeFit(),k.fit(),k.afterFit(),k.afterUpdate(),k.minSize},afterUpdate:Bu,beforeSetDimensions:Bu,setDimensions:function(){var h=this;h.isHorizontal()?(h.width=h.maxWidth,h.left=0,h.right=h.width):(h.height=h.maxHeight,h.top=0,h.bottom=h.height),h.paddingLeft=0,h.paddingTop=0,h.paddingRight=0,h.paddingBottom=0,h.minSize={width:0,height:0}},afterSetDimensions:Bu,beforeBuildLabels:Bu,buildLabels:function(){var h=this,E=h.options.labels||{},N=Ze.callback(E.generateLabels,[h.chart],h)||[];E.filter&&(N=N.filter(function(k){return E.filter(k,h.chart.data)})),h.options.reverse&&N.reverse(),h.legendItems=N},afterBuildLabels:Bu,beforeFit:Bu,fit:function(){var h=this,E=h.options,N=E.labels,k=E.display,K=h.ctx,de=Ze.options._parseFont(N),be=de.size,Ue=h.legendHitBoxes=[],we=h.minSize,Xe=h.isHorizontal();if(Xe?(we.width=h.maxWidth,we.height=k?10:0):(we.width=k?10:0,we.height=h.maxHeight),k){if(K.font=de.string,Xe){var gt=h.lineWidths=[0],vt=0;K.textAlign="left",K.textBaseline="middle",Ze.each(h.legendItems,function(Vo,$o){var qs=Xd(N,be)+be/2+K.measureText(Vo.text).width;(0===$o||gt[gt.length-1]+qs+2*N.padding>we.width)&&(vt+=be+N.padding,gt[gt.length-($o>0?0:1)]=0),Ue[$o]={left:0,top:0,width:qs,height:be},gt[gt.length-1]+=qs+N.padding}),we.height+=vt}else{var Jt=N.padding,Pn=h.columnWidths=[],Rn=h.columnHeights=[],sr=N.padding,jr=0,Ni=0;Ze.each(h.legendItems,function(Vo,$o){var qs=Xd(N,be)+be/2+K.measureText(Vo.text).width;$o>0&&Ni+be+2*Jt>we.height&&(sr+=jr+N.padding,Pn.push(jr),Rn.push(Ni),jr=0,Ni=0),jr=Math.max(jr,qs),Ni+=be+Jt,Ue[$o]={left:0,top:0,width:qs,height:be}}),sr+=jr,Pn.push(jr),Rn.push(Ni),we.width+=sr}h.width=we.width,h.height=we.height}else h.width=we.width=h.height=we.height=0},afterFit:Bu,isHorizontal:function(){return"top"===this.options.position||"bottom"===this.options.position},draw:function(){var h=this,E=h.options,N=E.labels,k=Tr.global,K=k.defaultColor,de=k.elements.line,be=h.height,Ue=h.columnHeights,we=h.width,Xe=h.lineWidths;if(E.display){var sr,gt=il(E.rtl,h.left,h.minSize.width),vt=h.ctx,Jt=pc(N.fontColor,k.defaultFontColor),Pn=Ze.options._parseFont(N),Rn=Pn.size;vt.textAlign=gt.textAlign("left"),vt.textBaseline="middle",vt.lineWidth=.5,vt.strokeStyle=Jt,vt.fillStyle=Jt,vt.font=Pn.string;var jr=Xd(N,Rn),Ni=h.legendHitBoxes,Vs=function(ga,sa){switch(E.align){case"start":return N.padding;case"end":return ga-sa;default:return(ga-sa+N.padding)/2}},qs=h.isHorizontal();sr=qs?{x:h.left+Vs(we,Xe[0]),y:h.top+N.padding,line:0}:{x:h.left+N.padding,y:h.top+Vs(be,Ue[0]),line:0},Ze.rtl.overrideTextDirection(h.ctx,E.textDirection);var dl=Rn+N.padding;Ze.each(h.legendItems,function(ga,sa){var Pa=vt.measureText(ga.text).width,ol=jr+Rn/2+Pa,Eu=sr.x,wa=sr.y;gt.setWidth(h.minSize.width),qs?sa>0&&Eu+ol+N.padding>h.left+h.minSize.width&&(wa=sr.y+=dl,sr.line++,Eu=sr.x=h.left+Vs(we,Xe[sr.line])):sa>0&&wa+dl>h.top+h.minSize.height&&(Eu=sr.x=Eu+h.columnWidths[sr.line]+N.padding,sr.line++,wa=sr.y=h.top+Vs(be,Ue[sr.line]));var au=gt.x(Eu);(function(ga,sa,Pa){if(!(isNaN(jr)||jr<=0)){vt.save();var ol=pc(Pa.lineWidth,de.borderWidth);if(vt.fillStyle=pc(Pa.fillStyle,K),vt.lineCap=pc(Pa.lineCap,de.borderCapStyle),vt.lineDashOffset=pc(Pa.lineDashOffset,de.borderDashOffset),vt.lineJoin=pc(Pa.lineJoin,de.borderJoinStyle),vt.lineWidth=ol,vt.strokeStyle=pc(Pa.strokeStyle,K),vt.setLineDash&&vt.setLineDash(pc(Pa.lineDash,de.borderDash)),N&&N.usePointStyle){var Eu=jr*Math.SQRT2/2,wa=gt.xPlus(ga,jr/2);Ze.canvas.drawPoint(vt,Pa.pointStyle,Eu,wa,sa+Rn/2,Pa.rotation)}else vt.fillRect(gt.leftForLtr(ga,jr),sa,jr,Rn),0!==ol&&vt.strokeRect(gt.leftForLtr(ga,jr),sa,jr,Rn);vt.restore()}})(au,wa,ga),Ni[sa].left=gt.leftForLtr(au,Ni[sa].width),Ni[sa].top=wa,function(ga,sa,Pa,ol){var Eu=Rn/2,wa=gt.xPlus(ga,jr+Eu),au=sa+Eu;vt.fillText(Pa.text,wa,au),Pa.hidden&&(vt.beginPath(),vt.lineWidth=2,vt.moveTo(wa,au),vt.lineTo(gt.xPlus(wa,ol),au),vt.stroke())}(au,wa,ga,Pa),qs?sr.x+=ol+N.padding:sr.y+=dl}),Ze.rtl.restoreTextDirection(h.ctx,E.textDirection)}},_getLegendItemAt:function(h,E){var k,K,de,N=this;if(h>=N.left&&h<=N.right&&E>=N.top&&E<=N.bottom)for(de=N.legendHitBoxes,k=0;k<de.length;++k)if(h>=(K=de[k]).left&&h<=K.left+K.width&&E>=K.top&&E<=K.top+K.height)return N.legendItems[k];return null},handleEvent:function(h){var K,E=this,N=E.options,k="mouseup"===h.type?"click":h.type;if("mousemove"===k){if(!N.onHover&&!N.onLeave)return}else{if("click"!==k)return;if(!N.onClick)return}K=E._getLegendItemAt(h.x,h.y),"click"===k?K&&N.onClick&&N.onClick.call(E,h.native,K):(N.onLeave&&K!==E._hoveredItem&&(E._hoveredItem&&N.onLeave.call(E,h.native,E._hoveredItem),E._hoveredItem=K),N.onHover&&K&&N.onHover.call(E,h.native,K))}});function Wl(h,E){var N=new wf({ctx:h.ctx,options:E,chart:h});jl.configure(h,N,E),jl.addBox(h,N),h.legend=N}var Pd={id:"legend",_element:wf,beforeInit:function(h){var E=h.options.legend;E&&Wl(h,E)},beforeUpdate:function(h){var E=h.options.legend,N=h.legend;E?(Ze.mergeIf(E,Tr.global.legend),N?(jl.configure(h,N,E),N.options=E):Wl(h,E)):N&&(jl.removeBox(h,N),delete h.legend)},afterEvent:function(h,E){var N=h.legend;N&&N.handleEvent(E)}},rc=Ze.noop;Tr._set("global",{title:{display:!1,fontStyle:"bold",fullWidth:!0,padding:10,position:"top",text:"",weight:2e3}});var hc=nr.extend({initialize:function(h){Ze.extend(this,h),this.legendHitBoxes=[]},beforeUpdate:rc,update:function(h,E,N){var k=this;return k.beforeUpdate(),k.maxWidth=h,k.maxHeight=E,k.margins=N,k.beforeSetDimensions(),k.setDimensions(),k.afterSetDimensions(),k.beforeBuildLabels(),k.buildLabels(),k.afterBuildLabels(),k.beforeFit(),k.fit(),k.afterFit(),k.afterUpdate(),k.minSize},afterUpdate:rc,beforeSetDimensions:rc,setDimensions:function(){var h=this;h.isHorizontal()?(h.width=h.maxWidth,h.left=0,h.right=h.width):(h.height=h.maxHeight,h.top=0,h.bottom=h.height),h.paddingLeft=0,h.paddingTop=0,h.paddingRight=0,h.paddingBottom=0,h.minSize={width:0,height:0}},afterSetDimensions:rc,beforeBuildLabels:rc,buildLabels:rc,afterBuildLabels:rc,beforeFit:rc,fit:function(){var de,h=this,E=h.options,N=h.minSize={},k=h.isHorizontal();E.display?(de=(Ze.isArray(E.text)?E.text.length:1)*Ze.options._parseFont(E).lineHeight+2*E.padding,h.width=N.width=k?h.maxWidth:de,h.height=N.height=k?de:h.maxHeight):h.width=N.width=h.height=N.height=0},afterFit:rc,isHorizontal:function(){var h=this.options.position;return"top"===h||"bottom"===h},draw:function(){var h=this,E=h.ctx,N=h.options;if(N.display){var vt,Jt,Pn,k=Ze.options._parseFont(N),K=k.lineHeight,de=K/2+N.padding,be=0,Ue=h.top,we=h.left,Xe=h.bottom,gt=h.right;E.fillStyle=Ze.valueOrDefault(N.fontColor,Tr.global.defaultFontColor),E.font=k.string,h.isHorizontal()?(Jt=we+(gt-we)/2,Pn=Ue+de,vt=gt-we):(Jt="left"===N.position?we+de:gt-de,Pn=Ue+(Xe-Ue)/2,vt=Xe-Ue,be=Math.PI*("left"===N.position?-.5:.5)),E.save(),E.translate(Jt,Pn),E.rotate(be),E.textAlign="center",E.textBaseline="middle";var Rn=N.text;if(Ze.isArray(Rn))for(var sr=0,jr=0;jr<Rn.length;++jr)E.fillText(Rn[jr],0,sr,vt),sr+=K;else E.fillText(Rn,0,0,vt);E.restore()}}});function gu(h,E){var N=new hc({ctx:h.ctx,options:E,chart:h});jl.configure(h,N,E),jl.addBox(h,N),h.titleBlock=N}var Fc={},fu=Nd,Id=Pd,Sl={id:"title",_element:hc,beforeInit:function(h){var E=h.options.title;E&&gu(h,E)},beforeUpdate:function(h){var E=h.options.title,N=h.titleBlock;E?(Ze.mergeIf(E,Tr.global.title),N?(jl.configure(h,N,E),N.options=E):gu(h,E)):N&&(jl.removeBox(h,N),delete h.titleBlock)}};for(var kc in Fc.filler=fu,Fc.legend=Id,Fc.title=Sl,yn.helpers=Ze,function(){function h(k,K,de){var be;return"string"==typeof k?(be=parseInt(k,10),-1!==k.indexOf("%")&&(be=be/100*K.parentNode[de])):be=k,be}function E(k){return null!=k&&"none"!==k}function N(k,K,de){var be=document.defaultView,Ue=Ze._getParentNode(k),we=be.getComputedStyle(k)[K],Xe=be.getComputedStyle(Ue)[K],gt=E(we),vt=E(Xe),Jt=Number.POSITIVE_INFINITY;return gt||vt?Math.min(gt?h(we,k,de):Jt,vt?h(Xe,Ue,de):Jt):"none"}Ze.where=function(k,K){if(Ze.isArray(k)&&Array.prototype.filter)return k.filter(K);var de=[];return Ze.each(k,function(be){K(be)&&de.push(be)}),de},Ze.findIndex=Array.prototype.findIndex?function(k,K,de){return k.findIndex(K,de)}:function(k,K,de){de=void 0===de?k:de;for(var be=0,Ue=k.length;be<Ue;++be)if(K.call(de,k[be],be,k))return be;return-1},Ze.findNextWhere=function(k,K,de){Ze.isNullOrUndef(de)&&(de=-1);for(var be=de+1;be<k.length;be++){var Ue=k[be];if(K(Ue))return Ue}},Ze.findPreviousWhere=function(k,K,de){Ze.isNullOrUndef(de)&&(de=k.length);for(var be=de-1;be>=0;be--){var Ue=k[be];if(K(Ue))return Ue}},Ze.isNumber=function(k){return!isNaN(parseFloat(k))&&isFinite(k)},Ze.almostEquals=function(k,K,de){return Math.abs(k-K)<de},Ze.almostWhole=function(k,K){var de=Math.round(k);return de-K<=k&&de+K>=k},Ze.max=function(k){return k.reduce(function(K,de){return isNaN(de)?K:Math.max(K,de)},Number.NEGATIVE_INFINITY)},Ze.min=function(k){return k.reduce(function(K,de){return isNaN(de)?K:Math.min(K,de)},Number.POSITIVE_INFINITY)},Ze.sign=Math.sign?function(k){return Math.sign(k)}:function(k){return 0==(k=+k)||isNaN(k)?k:k>0?1:-1},Ze.toRadians=function(k){return k*(Math.PI/180)},Ze.toDegrees=function(k){return k*(180/Math.PI)},Ze._decimalPlaces=function(k){if(Ze.isFinite(k)){for(var K=1,de=0;Math.round(k*K)/K!==k;)K*=10,de++;return de}},Ze.getAngleFromPoint=function(k,K){var de=K.x-k.x,be=K.y-k.y,Ue=Math.sqrt(de*de+be*be),we=Math.atan2(be,de);return we<-.5*Math.PI&&(we+=2*Math.PI),{angle:we,distance:Ue}},Ze.distanceBetweenPoints=function(k,K){return Math.sqrt(Math.pow(K.x-k.x,2)+Math.pow(K.y-k.y,2))},Ze.aliasPixel=function(k){return k%2==0?0:.5},Ze._alignPixel=function(k,K,de){var be=k.currentDevicePixelRatio,Ue=de/2;return Math.round((K-Ue)*be)/be+Ue},Ze.splineCurve=function(k,K,de,be){var Ue=k.skip?K:k,we=K,Xe=de.skip?K:de,gt=Math.sqrt(Math.pow(we.x-Ue.x,2)+Math.pow(we.y-Ue.y,2)),vt=Math.sqrt(Math.pow(Xe.x-we.x,2)+Math.pow(Xe.y-we.y,2)),Jt=gt/(gt+vt),Pn=vt/(gt+vt),Rn=be*(Jt=isNaN(Jt)?0:Jt),sr=be*(Pn=isNaN(Pn)?0:Pn);return{previous:{x:we.x-Rn*(Xe.x-Ue.x),y:we.y-Rn*(Xe.y-Ue.y)},next:{x:we.x+sr*(Xe.x-Ue.x),y:we.y+sr*(Xe.y-Ue.y)}}},Ze.EPSILON=Number.EPSILON||1e-14,Ze.splineCurveMonotone=function(k){var be,Ue,we,Xe,vt,Jt,Pn,Rn,sr,K=(k||[]).map(function(jr){return{model:jr._model,deltaK:0,mK:0}}),de=K.length;for(be=0;be<de;++be)if(!(we=K[be]).model.skip){if(Ue=be>0?K[be-1]:null,(Xe=be<de-1?K[be+1]:null)&&!Xe.model.skip){var gt=Xe.model.x-we.model.x;we.deltaK=0!==gt?(Xe.model.y-we.model.y)/gt:0}we.mK=!Ue||Ue.model.skip?we.deltaK:!Xe||Xe.model.skip?Ue.deltaK:this.sign(Ue.deltaK)!==this.sign(we.deltaK)?0:(Ue.deltaK+we.deltaK)/2}for(be=0;be<de-1;++be)if(Xe=K[be+1],!(we=K[be]).model.skip&&!Xe.model.skip){if(Ze.almostEquals(we.deltaK,0,this.EPSILON)){we.mK=Xe.mK=0;continue}vt=we.mK/we.deltaK,Jt=Xe.mK/we.deltaK,!((Rn=Math.pow(vt,2)+Math.pow(Jt,2))<=9)&&(Pn=3/Math.sqrt(Rn),we.mK=vt*Pn*we.deltaK,Xe.mK=Jt*Pn*we.deltaK)}for(be=0;be<de;++be)!(we=K[be]).model.skip&&(Xe=be<de-1?K[be+1]:null,(Ue=be>0?K[be-1]:null)&&!Ue.model.skip&&(we.model.controlPointPreviousX=we.model.x-(sr=(we.model.x-Ue.model.x)/3),we.model.controlPointPreviousY=we.model.y-sr*we.mK),Xe&&!Xe.model.skip&&(we.model.controlPointNextX=we.model.x+(sr=(Xe.model.x-we.model.x)/3),we.model.controlPointNextY=we.model.y+sr*we.mK))},Ze.nextItem=function(k,K,de){return de?K>=k.length-1?k[0]:k[K+1]:K>=k.length-1?k[k.length-1]:k[K+1]},Ze.previousItem=function(k,K,de){return de?K<=0?k[k.length-1]:k[K-1]:K<=0?k[0]:k[K-1]},Ze.niceNum=function(k,K){var de=Math.floor(Ze.log10(k)),be=k/Math.pow(10,de);return(K?be<1.5?1:be<3?2:be<7?5:10:be<=1?1:be<=2?2:be<=5?5:10)*Math.pow(10,de)},Ze.requestAnimFrame="undefined"==typeof window?function(k){k()}:window.requestAnimationFrame||window.webkitRequestAnimationFrame||window.mozRequestAnimationFrame||window.oRequestAnimationFrame||window.msRequestAnimationFrame||function(k){return window.setTimeout(k,1e3/60)},Ze.getRelativePosition=function(k,K){var de,be,Ue=k.originalEvent||k,we=k.target||k.srcElement,Xe=we.getBoundingClientRect(),gt=Ue.touches;gt&&gt.length>0?(de=gt[0].clientX,be=gt[0].clientY):(de=Ue.clientX,be=Ue.clientY);var vt=parseFloat(Ze.getStyle(we,"padding-left")),Jt=parseFloat(Ze.getStyle(we,"padding-top")),Pn=parseFloat(Ze.getStyle(we,"padding-right")),Rn=parseFloat(Ze.getStyle(we,"padding-bottom")),jr=Xe.bottom-Xe.top-Jt-Rn;return{x:de=Math.round((de-Xe.left-vt)/(Xe.right-Xe.left-vt-Pn)*we.width/K.currentDevicePixelRatio),y:be=Math.round((be-Xe.top-Jt)/jr*we.height/K.currentDevicePixelRatio)}},Ze.getConstraintWidth=function(k){return N(k,"max-width","clientWidth")},Ze.getConstraintHeight=function(k){return N(k,"max-height","clientHeight")},Ze._calculatePadding=function(k,K,de){return(K=Ze.getStyle(k,K)).indexOf("%")>-1?de*parseInt(K,10)/100:parseInt(K,10)},Ze._getParentNode=function(k){var K=k.parentNode;return K&&"[object ShadowRoot]"===K.toString()&&(K=K.host),K},Ze.getMaximumWidth=function(k){var K=Ze._getParentNode(k);if(!K)return k.clientWidth;var de=K.clientWidth,we=de-Ze._calculatePadding(K,"padding-left",de)-Ze._calculatePadding(K,"padding-right",de),Xe=Ze.getConstraintWidth(k);return isNaN(Xe)?we:Math.min(we,Xe)},Ze.getMaximumHeight=function(k){var K=Ze._getParentNode(k);if(!K)return k.clientHeight;var de=K.clientHeight,we=de-Ze._calculatePadding(K,"padding-top",de)-Ze._calculatePadding(K,"padding-bottom",de),Xe=Ze.getConstraintHeight(k);return isNaN(Xe)?we:Math.min(we,Xe)},Ze.getStyle=function(k,K){return k.currentStyle?k.currentStyle[K]:document.defaultView.getComputedStyle(k,null).getPropertyValue(K)},Ze.retinaScale=function(k,K){var de=k.currentDevicePixelRatio=K||"undefined"!=typeof window&&window.devicePixelRatio||1;if(1!==de){var be=k.canvas,Ue=k.height,we=k.width;be.height=Ue*de,be.width=we*de,k.ctx.scale(de,de),!be.style.height&&!be.style.width&&(be.style.height=Ue+"px",be.style.width=we+"px")}},Ze.fontString=function(k,K,de){return K+" "+k+"px "+de},Ze.longestText=function(k,K,de,be){var Ue=(be=be||{}).data=be.data||{},we=be.garbageCollect=be.garbageCollect||[];be.font!==K&&(Ue=be.data={},we=be.garbageCollect=[],be.font=K),k.font=K;var vt,Jt,Pn,Rn,sr,Xe=0,gt=de.length;for(vt=0;vt<gt;vt++)if(null!=(Rn=de[vt])&&!0!==Ze.isArray(Rn))Xe=Ze.measureText(k,Ue,we,Xe,Rn);else if(Ze.isArray(Rn))for(Jt=0,Pn=Rn.length;Jt<Pn;Jt++)null!=(sr=Rn[Jt])&&!Ze.isArray(sr)&&(Xe=Ze.measureText(k,Ue,we,Xe,sr));var jr=we.length/2;if(jr>de.length){for(vt=0;vt<jr;vt++)delete Ue[we[vt]];we.splice(0,jr)}return Xe},Ze.measureText=function(k,K,de,be,Ue){var we=K[Ue];return we||(we=K[Ue]=k.measureText(Ue).width,de.push(Ue)),we>be&&(be=we),be},Ze.numberOfLabelLines=function(k){var K=1;return Ze.each(k,function(de){Ze.isArray(de)&&de.length>K&&(K=de.length)}),K},Ze.color=Zr?function(k){return k instanceof CanvasGradient&&(k=Tr.global.defaultColor),Zr(k)}:function(k){return console.error("Color.js not found!"),k},Ze.getHoverColor=function(k){return k instanceof CanvasPattern||k instanceof CanvasGradient?k:Ze.color(k).saturate(.5).darken(.1).rgbString()}}(),yn._adapters=ko,yn.Animation=po,yn.animationService=yo,yn.controllers=fi,yn.DatasetController=Si,yn.defaults=Tr,yn.Element=nr,yn.elements=Do,yn.Interaction=al,yn.layouts=jl,yn.platform=Aa,yn.plugins=As,yn.Scale=Il,yn.scaleService=ku,yn.Ticks=Ho,yn.Tooltip=Ja,yn.helpers.each(_f,function(h,E){yn.scaleService.registerScaleType(E,h,h._defaults)}),Fc)Fc.hasOwnProperty(kc)&&yn.plugins.register(Fc[kc]);yn.platform.initialize();var $c=yn;return"undefined"!=typeof window&&(window.Chart=yn),yn.Chart=yn,yn.Legend=Fc.legend._element,yn.Title=Fc.title._element,yn.pluginService=yn.plugins,yn.PluginBase=yn.Element.extend({}),yn.canvasHelpers=yn.helpers.canvas,yn.layoutService=yn.layouts,yn.LinearScaleBase=ul,yn.helpers.each(["Bar","Bubble","Doughnut","Line","PolarArea","Radar","Scatter"],function(h){yn[h]=function(E,N){return new yn(E,yn.helpers.merge(N||{},{type:h.charAt(0).toLowerCase()+h.slice(1)}))}}),$c}(function(){try{return i(16738)}catch(p){}}())},82885:(v,S)=>{var r;!function(){"use strict";var u={}.hasOwnProperty;function p(){for(var f=[],e=0;e<arguments.length;e++){var _=arguments[e];if(_){var y=typeof _;if("string"===y||"number"===y)f.push(_);else if(Array.isArray(_)){if(_.length){var T=p.apply(null,_);T&&f.push(T)}}else if("object"===y)if(_.toString===Object.prototype.toString)for(var M in _)u.call(_,M)&&_[M]&&f.push(M);else f.push(_.toString())}}return f.join(" ")}v.exports?(p.default=p,v.exports=p):void 0!==(r=function(){return p}.apply(S,[]))&&(v.exports=r)}()},2665:v=>{v.exports=function(i,r){for(var u=[],p=0;p<i.length;p++){var f=r(i[p],p);S(f)?u.push.apply(u,f):u.push(f)}return u};var S=Array.isArray||function(i){return"[object Array]"===Object.prototype.toString.call(i)}},7281:(v,S)=>{"use strict";S.parse=function(T,M){if("string"!=typeof T)throw new TypeError("argument str must be a string");for(var R={},Z=(M||{}).decode||f,J=0;J<T.length;){var Q=T.indexOf("=",J);if(-1===Q)break;var ee=T.indexOf(";",J);if(-1===ee)ee=T.length;else if(ee<Q){J=T.lastIndexOf(";",Q-1)+1;continue}var ue=T.slice(J,Q).trim();if(void 0===R[ue]){var ae=T.slice(Q+1,ee).trim();34===ae.charCodeAt(0)&&(ae=ae.slice(1,-1)),R[ue]=y(ae,Z)}J=ee+1}return R},S.serialize=function(T,M,R){var F=R||{},Z=F.encode||e;if("function"!=typeof Z)throw new TypeError("option encode is invalid");if(!r.test(T))throw new TypeError("argument name is invalid");var J=Z(M);if(J&&!r.test(J))throw new TypeError("argument val is invalid");var Q=T+"="+J;if(null!=F.maxAge){var ee=F.maxAge-0;if(isNaN(ee)||!isFinite(ee))throw new TypeError("option maxAge is invalid");Q+="; Max-Age="+Math.floor(ee)}if(F.domain){if(!r.test(F.domain))throw new TypeError("option domain is invalid");Q+="; Domain="+F.domain}if(F.path){if(!r.test(F.path))throw new TypeError("option path is invalid");Q+="; Path="+F.path}if(F.expires){var ue=F.expires;if(!function(T){return"[object Date]"===i.call(T)||T instanceof Date}(ue)||isNaN(ue.valueOf()))throw new TypeError("option expires is invalid");Q+="; Expires="+ue.toUTCString()}if(F.httpOnly&&(Q+="; HttpOnly"),F.secure&&(Q+="; Secure"),F.priority)switch("string"==typeof F.priority?F.priority.toLowerCase():F.priority){case"low":Q+="; Priority=Low";break;case"medium":Q+="; Priority=Medium";break;case"high":Q+="; Priority=High";break;default:throw new TypeError("option priority is invalid")}if(F.sameSite)switch("string"==typeof F.sameSite?F.sameSite.toLowerCase():F.sameSite){case!0:Q+="; SameSite=Strict";break;case"lax":Q+="; SameSite=Lax";break;case"strict":Q+="; SameSite=Strict";break;case"none":Q+="; SameSite=None";break;default:throw new TypeError("option sameSite is invalid")}return Q};var i=Object.prototype.toString,r=/^[\u0009\u0020-\u007e\u0080-\u00ff]+$/;function f(T){return-1!==T.indexOf("%")?decodeURIComponent(T):T}function e(T){return encodeURIComponent(T)}function y(T,M){try{return M(T)}catch(R){return T}}},96967:(v,S,i)=>{"use strict";var r=i(35311),u={"text/plain":"Text","text/html":"Url",default:"Text"};v.exports=function(_,y){var T,M,R,F,Z,J,Q=!1;y||(y={}),T=y.debug||!1;try{if(R=r(),F=document.createRange(),Z=document.getSelection(),(J=document.createElement("span")).textContent=_,J.ariaHidden="true",J.style.all="unset",J.style.position="fixed",J.style.top=0,J.style.clip="rect(0, 0, 0, 0)",J.style.whiteSpace="pre",J.style.webkitUserSelect="text",J.style.MozUserSelect="text",J.style.msUserSelect="text",J.style.userSelect="text",J.addEventListener("copy",function(ue){ue.stopPropagation(),y.format&&(ue.preventDefault(),void 0===ue.clipboardData?(T&&console.warn("unable to use e.clipboardData"),T&&console.warn("trying IE specific stuff"),window.clipboardData.clearData(),window.clipboardData.setData(u[y.format]||u.default,_)):(ue.clipboardData.clearData(),ue.clipboardData.setData(y.format,_))),y.onCopy&&(ue.preventDefault(),y.onCopy(ue.clipboardData))}),document.body.appendChild(J),F.selectNodeContents(J),Z.addRange(F),!document.execCommand("copy"))throw new Error("copy command was unsuccessful");Q=!0}catch(ue){T&&console.error("unable to copy using execCommand: ",ue),T&&console.warn("trying IE specific stuff");try{window.clipboardData.setData(y.format||"text",_),y.onCopy&&y.onCopy(window.clipboardData),Q=!0}catch(ae){T&&console.error("unable to copy using clipboardData: ",ae),T&&console.error("falling back to prompt"),M=function(_){var y=(/mac os x/i.test(navigator.userAgent)?"\u2318":"Ctrl")+"+C";return _.replace(/#{\s*key\s*}/g,y)}("message"in y?y.message:"Copy to clipboard: #{key}, Enter"),window.prompt(M,_)}}finally{Z&&("function"==typeof Z.removeRange?Z.removeRange(F):Z.removeAllRanges()),J&&document.body.removeChild(J),R()}return Q}},43987:(v,S,i)=>{var r=i(75242);v.exports=r},99556:(v,S,i)=>{var r=i(10323);v.exports=r},39287:(v,S,i)=>{var r=i(8748);v.exports=r},52964:(v,S,i)=>{var r=i(47506);v.exports=r},25272:(v,S,i)=>{var r=i(71873);v.exports=r},54450:(v,S,i)=>{var r=i(19095);v.exports=r},39557:(v,S,i)=>{var r=i(52049);v.exports=r},61611:(v,S,i)=>{var r=i(87054);v.exports=r},22549:(v,S,i)=>{var r=i(45284);v.exports=r},47646:(v,S,i)=>{var r=i(70157);v.exports=r},78663:(v,S,i)=>{var r=i(640);v.exports=r},48498:(v,S,i)=>{var r=i(50320);v.exports=r},4922:(v,S,i)=>{var r=i(93006);v.exports=r},95190:(v,S,i)=>{var r=i(36226);v.exports=r},78525:(v,S,i)=>{var r=i(21968);v.exports=r},21064:(v,S,i)=>{var r=i(87259);v.exports=r},65641:(v,S,i)=>{var r=i(62021);v.exports=r},21693:(v,S,i)=>{var r=i(57682);v.exports=r},88907:(v,S,i)=>{var r=i(94222);v.exports=r},41432:(v,S,i)=>{var r=i(1162);v.exports=r},7398:(v,S,i)=>{var r=i(82805);v.exports=r},67221:(v,S,i)=>{var r=i(26498);v.exports=r},67447:(v,S,i)=>{var r=i(44850);v.exports=r},58811:(v,S,i)=>{var r=i(9634);v.exports=r},19573:(v,S,i)=>{var r=i(96551);v.exports=r},10226:(v,S,i)=>{var r=i(98908);v.exports=r},74771:(v,S,i)=>{i(3934),i(261);var r=i(13544);v.exports=r.Array.from},8412:(v,S,i)=>{i(2862);var r=i(13544);v.exports=r.Array.isArray},77377:(v,S,i)=>{i(1625);var r=i(97911);v.exports=r("Array").concat},399:(v,S,i)=>{i(1285),i(17221);var r=i(97911);v.exports=r("Array").entries},66933:(v,S,i)=>{i(70466);var r=i(97911);v.exports=r("Array").every},9504:(v,S,i)=>{i(24990);var r=i(97911);v.exports=r("Array").fill},82168:(v,S,i)=>{i(56534);var r=i(97911);v.exports=r("Array").filter},65618:(v,S,i)=>{i(12773);var r=i(97911);v.exports=r("Array").findIndex},9186:(v,S,i)=>{i(60326);var r=i(97911);v.exports=r("Array").find},98812:(v,S,i)=>{i(98792);var r=i(97911);v.exports=r("Array").forEach},58479:(v,S,i)=>{i(77059);var r=i(97911);v.exports=r("Array").includes},43207:(v,S,i)=>{i(2795);var r=i(97911);v.exports=r("Array").indexOf},33195:(v,S,i)=>{i(1285),i(17221);var r=i(97911);v.exports=r("Array").keys},63033:(v,S,i)=>{i(74926);var r=i(97911);v.exports=r("Array").lastIndexOf},5736:(v,S,i)=>{i(88119);var r=i(97911);v.exports=r("Array").map},7198:(v,S,i)=>{i(46250);var r=i(97911);v.exports=r("Array").reduce},84302:(v,S,i)=>{i(32836);var r=i(97911);v.exports=r("Array").reverse},86693:(v,S,i)=>{i(72999);var r=i(97911);v.exports=r("Array").slice},24273:(v,S,i)=>{i(50733);var r=i(97911);v.exports=r("Array").some},45974:(v,S,i)=>{i(93639);var r=i(97911);v.exports=r("Array").sort},68012:(v,S,i)=>{i(63117);var r=i(97911);v.exports=r("Array").splice},46332:(v,S,i)=>{i(1285),i(17221);var r=i(97911);v.exports=r("Array").values},42618:(v,S,i)=>{i(34699);var r=i(13544);v.exports=r.Date.now},97724:(v,S,i)=>{i(33379);var r=i(97911);v.exports=r("Function").bind},63791:(v,S,i)=>{i(1285),i(3934);var r=i(34014);v.exports=r},27959:(v,S,i)=>{i(87404),v.exports=i(70009)},69029:(v,S,i)=>{var r=i(23336),u=i(97724),p=Function.prototype;v.exports=function(f){var e=f.bind;return f===p||r(p,f)&&e===p.bind?u:e}},28924:(v,S,i)=>{var r=i(23336),u=i(77377),p=Array.prototype;v.exports=function(f){var e=f.concat;return f===p||r(p,f)&&e===p.concat?u:e}},98709:(v,S,i)=>{var r=i(23336),u=i(66933),p=Array.prototype;v.exports=function(f){var e=f.every;return f===p||r(p,f)&&e===p.every?u:e}},65991:(v,S,i)=>{var r=i(23336),u=i(9504),p=Array.prototype;v.exports=function(f){var e=f.fill;return f===p||r(p,f)&&e===p.fill?u:e}},64158:(v,S,i)=>{var r=i(23336),u=i(82168),p=Array.prototype;v.exports=function(f){var e=f.filter;return f===p||r(p,f)&&e===p.filter?u:e}},91799:(v,S,i)=>{var r=i(23336),u=i(65618),p=Array.prototype;v.exports=function(f){var e=f.findIndex;return f===p||r(p,f)&&e===p.findIndex?u:e}},26155:(v,S,i)=>{var r=i(23336),u=i(9186),p=Array.prototype;v.exports=function(f){var e=f.find;return f===p||r(p,f)&&e===p.find?u:e}},33758:(v,S,i)=>{var r=i(23336),u=i(58479),p=i(85136),f=Array.prototype,e=String.prototype;v.exports=function(_){var y=_.includes;return _===f||r(f,_)&&y===f.includes?u:"string"==typeof _||_===e||r(e,_)&&y===e.includes?p:y}},7592:(v,S,i)=>{var r=i(23336),u=i(43207),p=Array.prototype;v.exports=function(f){var e=f.indexOf;return f===p||r(p,f)&&e===p.indexOf?u:e}},17480:(v,S,i)=>{var r=i(23336),u=i(63033),p=Array.prototype;v.exports=function(f){var e=f.lastIndexOf;return f===p||r(p,f)&&e===p.lastIndexOf?u:e}},20681:(v,S,i)=>{var r=i(23336),u=i(5736),p=Array.prototype;v.exports=function(f){var e=f.map;return f===p||r(p,f)&&e===p.map?u:e}},90949:(v,S,i)=>{var r=i(23336),u=i(7198),p=Array.prototype;v.exports=function(f){var e=f.reduce;return f===p||r(p,f)&&e===p.reduce?u:e}},99316:(v,S,i)=>{var r=i(23336),u=i(96302),p=String.prototype;v.exports=function(f){var e=f.repeat;return"string"==typeof f||f===p||r(p,f)&&e===p.repeat?u:e}},62212:(v,S,i)=>{var r=i(23336),u=i(84302),p=Array.prototype;v.exports=function(f){var e=f.reverse;return f===p||r(p,f)&&e===p.reverse?u:e}},49073:(v,S,i)=>{var r=i(23336),u=i(86693),p=Array.prototype;v.exports=function(f){var e=f.slice;return f===p||r(p,f)&&e===p.slice?u:e}},24146:(v,S,i)=>{var r=i(23336),u=i(24273),p=Array.prototype;v.exports=function(f){var e=f.some;return f===p||r(p,f)&&e===p.some?u:e}},40104:(v,S,i)=>{var r=i(23336),u=i(45974),p=Array.prototype;v.exports=function(f){var e=f.sort;return f===p||r(p,f)&&e===p.sort?u:e}},3555:(v,S,i)=>{var r=i(23336),u=i(68012),p=Array.prototype;v.exports=function(f){var e=f.splice;return f===p||r(p,f)&&e===p.splice?u:e}},68333:(v,S,i)=>{var r=i(23336),u=i(98720),p=String.prototype;v.exports=function(f){var e=f.startsWith;return"string"==typeof f||f===p||r(p,f)&&e===p.startsWith?u:e}},65786:(v,S,i)=>{var r=i(23336),u=i(75998),p=String.prototype;v.exports=function(f){var e=f.trim;return"string"==typeof f||f===p||r(p,f)&&e===p.trim?u:e}},66306:(v,S,i)=>{i(75071);var r=i(13544),u=i(2543);r.JSON||(r.JSON={stringify:JSON.stringify}),v.exports=function(f,e,_){return u(r.JSON.stringify,null,arguments)}},31845:(v,S,i)=>{i(1285),i(85140),i(17221),i(3934);var r=i(13544);v.exports=r.Map},44168:(v,S,i)=>{i(67234);var r=i(13544);v.exports=r.Object.assign},25852:(v,S,i)=>{i(86516);var u=i(13544).Object;v.exports=function(f,e){return u.create(f,e)}},24457:(v,S,i)=>{i(36255);var u=i(13544).Object,p=v.exports=function(e,_){return u.defineProperties(e,_)};u.defineProperties.sham&&(p.sham=!0)},99671:(v,S,i)=>{i(84468);var u=i(13544).Object,p=v.exports=function(e,_,y){return u.defineProperty(e,_,y)};u.defineProperty.sham&&(p.sham=!0)},35161:(v,S,i)=>{i(54989);var r=i(13544);v.exports=r.Object.entries},38007:(v,S,i)=>{i(86627);var u=i(13544).Object,p=v.exports=function(e,_){return u.getOwnPropertyDescriptor(e,_)};u.getOwnPropertyDescriptor.sham&&(p.sham=!0)},57432:(v,S,i)=>{i(78275);var r=i(13544);v.exports=r.Object.getOwnPropertyDescriptors},36541:(v,S,i)=>{i(56728);var r=i(13544);v.exports=r.Object.getOwnPropertySymbols},17303:(v,S,i)=>{i(31193);var r=i(13544);v.exports=r.Object.getPrototypeOf},62149:(v,S,i)=>{i(56557);var r=i(13544);v.exports=r.Object.keys},86537:(v,S,i)=>{i(17971);var r=i(13544);v.exports=r.Object.setPrototypeOf},79553:(v,S,i)=>{i(88923);var r=i(13544);v.exports=r.Object.values},80092:(v,S,i)=>{i(10901),i(1285),i(17221),i(66793),i(84798),i(98857),i(30185),i(3934);var r=i(13544);v.exports=r.Promise},472:(v,S,i)=>{i(19539);var r=i(13544);v.exports=r.Reflect.construct},4678:(v,S,i)=>{i(60851);var r=i(13544);v.exports=r.Reflect.get},85136:(v,S,i)=>{i(97764);var r=i(97911);v.exports=r("String").includes},96302:(v,S,i)=>{i(3588);var r=i(97911);v.exports=r("String").repeat},98720:(v,S,i)=>{i(24655);var r=i(97911);v.exports=r("String").startsWith},75998:(v,S,i)=>{i(90451);var r=i(97911);v.exports=r("String").trim},61697:(v,S,i)=>{i(1625),i(17221),i(56728),i(16426),i(1172),i(99579),i(41258),i(2383),i(44339),i(64776),i(88215),i(65389),i(12733),i(97977),i(59792),i(60242),i(26291),i(32300),i(63603),i(44864);var r=i(13544);v.exports=r.Symbol},42497:(v,S,i)=>{i(1285),i(17221),i(3934),i(2383);var r=i(89734);v.exports=r.f("iterator")},58255:(v,S,i)=>{i(1285),i(17221),i(90770);var r=i(13544);v.exports=r.WeakMap},56286:(v,S,i)=>{v.exports=i(73875)},54153:(v,S,i)=>{v.exports=i(91700)},90755:(v,S,i)=>{v.exports=i(70589)},60833:(v,S,i)=>{v.exports=i(6324)},98235:(v,S,i)=>{v.exports=i(71432)},78096:(v,S,i)=>{v.exports=i(73712)},31236:(v,S,i)=>{v.exports=i(58044)},15819:(v,S,i)=>{v.exports=i(55451)},44948:(v,S,i)=>{v.exports=i(61483)},96471:(v,S,i)=>{v.exports=i(46815)},5228:(v,S,i)=>{v.exports=i(28296)},50182:(v,S,i)=>{v.exports=i(96973)},41171:(v,S,i)=>{v.exports=i(47194)},54585:(v,S,i)=>{v.exports=i(56805)},62005:(v,S,i)=>{v.exports=i(32944)},39964:(v,S,i)=>{v.exports=i(70729)},70326:(v,S,i)=>{v.exports=i(48299)},98162:(v,S,i)=>{v.exports=i(33969)},42346:(v,S,i)=>{v.exports=i(26421)},4204:(v,S,i)=>{v.exports=i(37785)},24329:(v,S,i)=>{v.exports=i(15123)},2793:(v,S,i)=>{v.exports=i(49745)},42700:(v,S,i)=>{v.exports=i(29044)},70269:(v,S,i)=>{v.exports=i(20611)},88819:(v,S,i)=>{v.exports=i(65861)},55912:(v,S,i)=>{v.exports=i(63816)},73875:(v,S,i)=>{var r=i(43987);v.exports=r},91700:(v,S,i)=>{var r=i(99556);v.exports=r},70589:(v,S,i)=>{var r=i(39287);v.exports=r},6324:(v,S,i)=>{i(65237);var r=i(52964);v.exports=r},71432:(v,S,i)=>{var r=i(25272);v.exports=r},73712:(v,S,i)=>{var r=i(54450);v.exports=r},58044:(v,S,i)=>{var r=i(39557);v.exports=r},55451:(v,S,i)=>{var r=i(61611);v.exports=r},61483:(v,S,i)=>{var r=i(22549);v.exports=r},46815:(v,S,i)=>{var r=i(47646);v.exports=r},28296:(v,S,i)=>{var r=i(78663);i(78271),i(60854),i(10509),i(30887),i(54547),i(68996),i(1530),i(60176),i(41554),i(41688),i(92847),i(17316),i(58786),i(35517),i(12783),i(69773),i(22337),i(40199),i(69046),i(84131),v.exports=r},96973:(v,S,i)=>{var r=i(48498);v.exports=r},47194:(v,S,i)=>{var r=i(4922);v.exports=r},56805:(v,S,i)=>{var r=i(95190);v.exports=r},32944:(v,S,i)=>{var r=i(78525);v.exports=r},70729:(v,S,i)=>{var r=i(21064);v.exports=r},48299:(v,S,i)=>{var r=i(65641);v.exports=r},33969:(v,S,i)=>{var r=i(21693);v.exports=r},26421:(v,S,i)=>{var r=i(88907);v.exports=r},37785:(v,S,i)=>{var r=i(41432);v.exports=r},15123:(v,S,i)=>{var r=i(7398);v.exports=r},49745:(v,S,i)=>{var r=i(67221);i(67670),i(61127),i(93114),i(45975),v.exports=r},29044:(v,S,i)=>{var r=i(67447);v.exports=r},20611:(v,S,i)=>{var r=i(58811);v.exports=r},65861:(v,S,i)=>{var r=i(19573);i(55461),i(5737),i(87097),i(29559),i(90212),i(71985),i(93770),i(47743),v.exports=r},63816:(v,S,i)=>{var r=i(10226);v.exports=r},61812:(v,S,i)=>{var r=i(52208),u=i(7378),p=TypeError;v.exports=function(f){if(r(f))return f;throw p(u(f)+" is not a function")}},54356:(v,S,i)=>{var r=i(81177),u=i(7378),p=TypeError;v.exports=function(f){if(r(f))return f;throw p(u(f)+" is not a constructor")}},93221:(v,S,i)=>{var r=i(52208),u=String,p=TypeError;v.exports=function(f){if("object"==typeof f||r(f))return f;throw p("Can't set "+u(f)+" as a prototype")}},82196:v=>{v.exports=function(){}},54849:(v,S,i)=>{var r=i(23336),u=TypeError;v.exports=function(p,f){if(r(f,p))return p;throw u("Incorrect invocation")}},64562:(v,S,i)=>{var r=i(77293),u=String,p=TypeError;v.exports=function(f){if(r(f))return f;throw p(u(f)+" is not an object")}},76318:(v,S,i)=>{var r=i(55756);v.exports=r(function(){if("function"==typeof ArrayBuffer){var u=new ArrayBuffer(8);Object.isExtensible(u)&&Object.defineProperty(u,"a",{value:8})}})},35277:(v,S,i)=>{"use strict";var r=i(70267),u=i(19401),p=i(6381);v.exports=function(e){for(var _=r(this),y=p(_),T=arguments.length,M=u(T>1?arguments[1]:void 0,y),R=T>2?arguments[2]:void 0,F=void 0===R?y:u(R,y);F>M;)_[M++]=e;return _}},8366:(v,S,i)=>{"use strict";var r=i(68607).forEach,p=i(33620)("forEach");v.exports=p?[].forEach:function(e){return r(this,e,arguments.length>1?arguments[1]:void 0)}},51923:(v,S,i)=>{"use strict";var r=i(76781),u=i(25401),p=i(70267),f=i(93463),e=i(39918),_=i(81177),y=i(6381),T=i(46751),M=i(88055),R=i(34014),F=Array;v.exports=function(J){var Q=p(J),ee=_(this),ue=arguments.length,ae=ue>1?arguments[1]:void 0,$=void 0!==ae;$&&(ae=r(ae,ue>2?arguments[2]:void 0));var oe,he,me,Oe,ce,dt,se=R(Q),ve=0;if(!se||this===F&&e(se))for(oe=y(Q),he=ee?new this(oe):F(oe);oe>ve;ve++)dt=$?ae(Q[ve],ve):Q[ve],T(he,ve,dt);else for(ce=(Oe=M(Q,se)).next,he=ee?new this:[];!(me=u(ce,Oe)).done;ve++)dt=$?f(Oe,ae,[me.value,ve],!0):me.value,T(he,ve,dt);return he.length=ve,he}},95171:(v,S,i)=>{var r=i(81010),u=i(19401),p=i(6381),f=function(e){return function(_,y,T){var Z,M=r(_),R=p(M),F=u(T,R);if(e&&y!=y){for(;R>F;)if((Z=M[F++])!=Z)return!0}else for(;R>F;F++)if((e||F in M)&&M[F]===y)return e||F||0;return!e&&-1}};v.exports={includes:f(!0),indexOf:f(!1)}},68607:(v,S,i)=>{var r=i(76781),u=i(23634),p=i(20973),f=i(70267),e=i(6381),_=i(2103),y=u([].push),T=function(M){var R=1==M,F=2==M,Z=3==M,J=4==M,Q=6==M,ee=7==M,ue=5==M||Q;return function(ae,$,se,ve){for(var Ye,je,oe=f(ae),he=p(oe),me=r($,se),Oe=e(he),ce=0,dt=ve||_,ze=R?dt(ae,Oe):F||ee?dt(ae,0):void 0;Oe>ce;ce++)if((ue||ce in he)&&(je=me(Ye=he[ce],ce,oe),M))if(R)ze[ce]=je;else if(je)switch(M){case 3:return!0;case 5:return Ye;case 6:return ce;case 2:y(ze,Ye)}else switch(M){case 4:return!1;case 7:y(ze,Ye)}return Q?-1:Z||J?J:ze}};v.exports={forEach:T(0),map:T(1),filter:T(2),some:T(3),every:T(4),find:T(5),findIndex:T(6),filterReject:T(7)}},78375:(v,S,i)=>{"use strict";var r=i(2543),u=i(81010),p=i(33912),f=i(6381),e=i(33620),_=Math.min,y=[].lastIndexOf,T=!!y&&1/[1].lastIndexOf(1,-0)<0,M=e("lastIndexOf");v.exports=T||!M?function(Z){if(T)return r(y,this,arguments)||0;var J=u(this),Q=f(J),ee=Q-1;for(arguments.length>1&&(ee=_(ee,p(arguments[1]))),ee<0&&(ee=Q+ee);ee>=0;ee--)if(ee in J&&J[ee]===Z)return ee||0;return-1}:y},95913:(v,S,i)=>{var r=i(55756),u=i(91840),p=i(63556),f=u("species");v.exports=function(e){return p>=51||!r(function(){var _=[];return(_.constructor={})[f]=function(){return{foo:1}},1!==_[e](Boolean).foo})}},33620:(v,S,i)=>{"use strict";var r=i(55756);v.exports=function(u,p){var f=[][u];return!!f&&r(function(){f.call(null,p||function(){return 1},1)})}},88908:(v,S,i)=>{var r=i(61812),u=i(70267),p=i(20973),f=i(6381),e=TypeError,_=function(y){return function(T,M,R,F){r(M);var Z=u(T),J=p(Z),Q=f(Z),ee=y?Q-1:0,ue=y?-1:1;if(R<2)for(;;){if(ee in J){F=J[ee],ee+=ue;break}if(ee+=ue,y?ee<0:Q<=ee)throw e("Reduce of empty array with no initial value")}for(;y?ee>=0:Q>ee;ee+=ue)ee in J&&(F=M(F,J[ee],ee,Z));return F}};v.exports={left:_(!1),right:_(!0)}},8681:(v,S,i)=>{var r=i(19401),u=i(6381),p=i(46751),f=Array,e=Math.max;v.exports=function(_,y,T){for(var M=u(_),R=r(y,M),F=r(void 0===T?M:T,M),Z=f(e(F-R,0)),J=0;R<F;R++,J++)p(Z,J,_[R]);return Z.length=J,Z}},37591:(v,S,i)=>{var r=i(23634);v.exports=r([].slice)},84865:(v,S,i)=>{var r=i(8681),u=Math.floor,p=function(_,y){var T=_.length,M=u(T/2);return T<8?f(_,y):e(_,p(r(_,0,M),y),p(r(_,M),y),y)},f=function(_,y){for(var R,F,T=_.length,M=1;M<T;){for(F=M,R=_[M];F&&y(_[F-1],R)>0;)_[F]=_[--F];F!==M++&&(_[F]=R)}return _},e=function(_,y,T,M){for(var R=y.length,F=T.length,Z=0,J=0;Z<R||J<F;)_[Z+J]=Z<R&&J<F?M(y[Z],T[J])<=0?y[Z++]:T[J++]:Z<R?y[Z++]:T[J++];return _};v.exports=p},48045:(v,S,i)=>{var r=i(89735),u=i(81177),p=i(77293),e=i(91840)("species"),_=Array;v.exports=function(y){var T;return r(y)&&(u(T=y.constructor)&&(T===_||r(T.prototype))||p(T)&&null===(T=T[e]))&&(T=void 0),void 0===T?_:T}},2103:(v,S,i)=>{var r=i(48045);v.exports=function(u,p){return new(r(u))(0===p?0:p)}},93463:(v,S,i)=>{var r=i(64562),u=i(40798);v.exports=function(p,f,e,_){try{return _?f(r(e)[0],e[1]):f(e)}catch(y){u(p,"throw",y)}}},5253:(v,S,i)=>{var u=i(91840)("iterator"),p=!1;try{var f=0,e={next:function(){return{done:!!f++}},return:function(){p=!0}};e[u]=function(){return this},Array.from(e,function(){throw 2})}catch(_){}v.exports=function(_,y){if(!y&&!p)return!1;var T=!1;try{var M={};M[u]=function(){return{next:function(){return{done:T=!0}}}},_(M)}catch(R){}return T}},49806:(v,S,i)=>{var r=i(23634),u=r({}.toString),p=r("".slice);v.exports=function(f){return p(u(f),8,-1)}},35329:(v,S,i)=>{var r=i(25014),u=i(52208),p=i(49806),e=i(91840)("toStringTag"),_=Object,y="Arguments"==p(function(){return arguments}());v.exports=r?p:function(M){var R,F,Z;return void 0===M?"Undefined":null===M?"Null":"string"==typeof(F=function(M,R){try{return M[R]}catch(F){}}(R=_(M),e))?F:y?p(R):"Object"==(Z=p(R))&&u(R.callee)?"Arguments":Z}},41995:(v,S,i)=>{var r=i(23634),u=Error,p=r("".replace),f=String(u("zxcasd").stack),e=/\n\s*at [^:]*:[^\n]*/,_=e.test(f);v.exports=function(y,T){if(_&&"string"==typeof y&&!u.prepareStackTrace)for(;T--;)y=p(y,e,"");return y}},37353:(v,S,i)=>{"use strict";var r=i(25401),u=i(61812),p=i(64562);v.exports=function(){for(var T,e=p(this),_=u(e.delete),y=!0,M=0,R=arguments.length;M<R;M++)T=r(_,e,arguments[M]),y=y&&T;return!!y}},83483:(v,S,i)=>{"use strict";var r=i(76781),u=i(25401),p=i(61812),f=i(54356),e=i(41605),_=[].push;v.exports=function(T){var F,Z,J,Q,M=arguments.length,R=M>1?arguments[1]:void 0;return f(this),(F=void 0!==R)&&p(R),null==T?new this:(Z=[],F?(J=0,Q=r(R,M>2?arguments[2]:void 0),e(T,function(ee){u(_,Z,Q(ee,J++))})):e(T,_,{that:Z}),new this(Z))}},13067:(v,S,i)=>{"use strict";var r=i(37591);v.exports=function(){return new this(r(arguments))}},26650:(v,S,i)=>{"use strict";var r=i(48011).f,u=i(83272),p=i(84604),f=i(76781),e=i(54849),_=i(41605),y=i(32837),T=i(58014),M=i(49642),R=i(57867).fastKey,F=i(91093),Z=F.set,J=F.getterFor;v.exports={getConstructor:function(Q,ee,ue,ae){var $=Q(function(me,Oe){e(me,se),Z(me,{type:ee,index:u(null),first:void 0,last:void 0,size:0}),M||(me.size=0),null!=Oe&&_(Oe,me[ae],{that:me,AS_ENTRIES:ue})}),se=$.prototype,ve=J(ee),oe=function(me,Oe,ce){var Ye,je,dt=ve(me),ze=he(me,Oe);return ze?ze.value=ce:(dt.last=ze={index:je=R(Oe,!0),key:Oe,value:ce,previous:Ye=dt.last,next:void 0,removed:!1},dt.first||(dt.first=ze),Ye&&(Ye.next=ze),M?dt.size++:me.size++,"F"!==je&&(dt.index[je]=ze)),me},he=function(me,Oe){var ze,ce=ve(me),dt=R(Oe);if("F"!==dt)return ce.index[dt];for(ze=ce.first;ze;ze=ze.next)if(ze.key==Oe)return ze};return p(se,{clear:function(){for(var ce=ve(this),dt=ce.index,ze=ce.first;ze;)ze.removed=!0,ze.previous&&(ze.previous=ze.previous.next=void 0),delete dt[ze.index],ze=ze.next;ce.first=ce.last=void 0,M?ce.size=0:this.size=0},delete:function(me){var ce=ve(this),dt=he(this,me);if(dt){var ze=dt.next,Ye=dt.previous;delete ce.index[dt.index],dt.removed=!0,Ye&&(Ye.next=ze),ze&&(ze.previous=Ye),ce.first==dt&&(ce.first=ze),ce.last==dt&&(ce.last=Ye),M?ce.size--:this.size--}return!!dt},forEach:function(Oe){for(var ze,ce=ve(this),dt=f(Oe,arguments.length>1?arguments[1]:void 0);ze=ze?ze.next:ce.first;)for(dt(ze.value,ze.key,this);ze&&ze.removed;)ze=ze.previous},has:function(Oe){return!!he(this,Oe)}}),p(se,ue?{get:function(Oe){var ce=he(this,Oe);return ce&&ce.value},set:function(Oe,ce){return oe(this,0===Oe?0:Oe,ce)}}:{add:function(Oe){return oe(this,Oe=0===Oe?0:Oe,Oe)}}),M&&r(se,"size",{get:function(){return ve(this).size}}),$},setStrong:function(Q,ee,ue){var ae=ee+" Iterator",$=J(ee),se=J(ae);y(Q,ee,function(ve,oe){Z(this,{type:ae,target:ve,state:$(ve),kind:oe,last:void 0})},function(){for(var ve=se(this),oe=ve.kind,he=ve.last;he&&he.removed;)he=he.previous;return ve.target&&(ve.last=he=he?he.next:ve.state.first)?"keys"==oe?{value:he.key,done:!1}:"values"==oe?{value:he.value,done:!1}:{value:[he.key,he.value],done:!1}:(ve.target=void 0,{value:void 0,done:!0})},ue?"entries":"values",!ue,!0),T(ee)}}},84049:(v,S,i)=>{"use strict";var r=i(23634),u=i(84604),p=i(57867).getWeakData,f=i(64562),e=i(77293),_=i(54849),y=i(41605),T=i(68607),M=i(80112),R=i(91093),F=R.set,Z=R.getterFor,J=T.find,Q=T.findIndex,ee=r([].splice),ue=0,ae=function(ve){return ve.frozen||(ve.frozen=new $)},$=function(){this.entries=[]},se=function(ve,oe){return J(ve.entries,function(he){return he[0]===oe})};$.prototype={get:function(ve){var oe=se(this,ve);if(oe)return oe[1]},has:function(ve){return!!se(this,ve)},set:function(ve,oe){var he=se(this,ve);he?he[1]=oe:this.entries.push([ve,oe])},delete:function(ve){var oe=Q(this.entries,function(he){return he[0]===ve});return~oe&&ee(this.entries,oe,1),!!~oe}},v.exports={getConstructor:function(ve,oe,he,me){var Oe=ve(function(Ye,je){_(Ye,ce),F(Ye,{type:oe,id:ue++,frozen:void 0}),null!=je&&y(je,Ye[me],{that:Ye,AS_ENTRIES:he})}),ce=Oe.prototype,dt=Z(oe),ze=function(Ye,je,Ie){var Ve=dt(Ye),He=p(f(je),!0);return!0===He?ae(Ve).set(je,Ie):He[Ve.id]=Ie,Ye};return u(ce,{delete:function(Ye){var je=dt(this);if(!e(Ye))return!1;var Ie=p(Ye);return!0===Ie?ae(je).delete(Ye):Ie&&M(Ie,je.id)&&delete Ie[je.id]},has:function(je){var Ie=dt(this);if(!e(je))return!1;var Ve=p(je);return!0===Ve?ae(Ie).has(je):Ve&&M(Ve,Ie.id)}}),u(ce,he?{get:function(je){var Ie=dt(this);if(e(je)){var Ve=p(je);return!0===Ve?ae(Ie).get(je):Ve?Ve[Ie.id]:void 0}},set:function(je,Ie){return ze(this,je,Ie)}}:{add:function(je){return ze(this,je,!0)}}),Oe}}},85116:(v,S,i)=>{"use strict";var r=i(90513),u=i(70009),p=i(57867),f=i(55756),e=i(65162),_=i(41605),y=i(54849),T=i(52208),M=i(77293),R=i(85681),F=i(48011).f,Z=i(68607).forEach,J=i(49642),Q=i(91093),ee=Q.set,ue=Q.getterFor;v.exports=function(ae,$,se){var dt,ve=-1!==ae.indexOf("Map"),oe=-1!==ae.indexOf("Weak"),he=ve?"set":"add",me=u[ae],Oe=me&&me.prototype,ce={};if(J&&T(me)&&(oe||Oe.forEach&&!f(function(){(new me).entries().next()}))){var ze=(dt=$(function(je,Ie){ee(y(je,ze),{type:ae,collection:new me}),null!=Ie&&_(Ie,je[he],{that:je,AS_ENTRIES:ve})})).prototype,Ye=ue(ae);Z(["add","clear","delete","forEach","get","has","set","keys","values","entries"],function(je){var Ie="add"==je||"set"==je;je in Oe&&(!oe||"clear"!=je)&&e(ze,je,function(Ve,He){var Zt=Ye(this).collection;if(!Ie&&oe&&!M(Ve))return"get"==je&&void 0;var st=Zt[je](0===Ve?0:Ve,He);return Ie?this:st})}),oe||F(ze,"size",{configurable:!0,get:function(){return Ye(this).collection.size}})}else dt=se.getConstructor($,ae,ve,he),p.enable();return R(dt,ae,!1,!0),ce[ae]=dt,r({global:!0,forced:!0},ce),oe||se.setStrong(dt,ae,ve),dt}},65031:(v,S,i)=>{var r=i(80112),u=i(59823),p=i(25525),f=i(48011);v.exports=function(e,_,y){for(var T=u(_),M=f.f,R=p.f,F=0;F<T.length;F++){var Z=T[F];!r(e,Z)&&(!y||!r(y,Z))&&M(e,Z,R(_,Z))}}},79668:(v,S,i)=>{var u=i(91840)("match");v.exports=function(p){var f=/./;try{"/./"[p](f)}catch(e){try{return f[u]=!1,"/./"[p](f)}catch(_){}}return!1}},37112:(v,S,i)=>{var r=i(55756);v.exports=!r(function(){function u(){}return u.prototype.constructor=null,Object.getPrototypeOf(new u)!==u.prototype})},65297:(v,S,i)=>{"use strict";var r=i(38432).IteratorPrototype,u=i(83272),p=i(51361),f=i(85681),e=i(84394),_=function(){return this};v.exports=function(y,T,M,R){var F=T+" Iterator";return y.prototype=u(r,{next:p(+!R,M)}),f(y,F,!1,!0),e[F]=_,y}},65162:(v,S,i)=>{var r=i(49642),u=i(48011),p=i(51361);v.exports=r?function(f,e,_){return u.f(f,e,p(1,_))}:function(f,e,_){return f[e]=_,f}},51361:v=>{v.exports=function(S,i){return{enumerable:!(1&S),configurable:!(2&S),writable:!(4&S),value:i}}},46751:(v,S,i)=>{"use strict";var r=i(62939),u=i(48011),p=i(51361);v.exports=function(f,e,_){var y=r(e);y in f?u.f(f,y,p(0,_)):f[y]=_}},1707:(v,S,i)=>{var r=i(48011);v.exports=function(u,p,f){return r.f(u,p,f)}},42915:(v,S,i)=>{var r=i(65162);v.exports=function(u,p,f,e){return e&&e.enumerable?u[p]=f:r(u,p,f),u}},84604:(v,S,i)=>{var r=i(42915);v.exports=function(u,p,f){for(var e in p)f&&f.unsafe&&u[e]?u[e]=p[e]:r(u,e,p[e],f);return u}},34056:(v,S,i)=>{var r=i(70009),u=Object.defineProperty;v.exports=function(p,f){try{u(r,p,{value:f,configurable:!0,writable:!0})}catch(e){r[p]=f}return f}},32837:(v,S,i)=>{"use strict";var r=i(90513),u=i(25401),p=i(81124),f=i(29862),e=i(52208),_=i(65297),y=i(31426),T=i(54945),M=i(85681),R=i(65162),F=i(42915),Z=i(91840),J=i(84394),Q=i(38432),ee=f.PROPER,ue=f.CONFIGURABLE,ae=Q.IteratorPrototype,$=Q.BUGGY_SAFARI_ITERATORS,se=Z("iterator"),oe="values",he="entries",me=function(){return this};v.exports=function(Oe,ce,dt,ze,Ye,je,Ie){_(dt,ce,ze);var Ut,Bt,mt,Ve=function(Yt){if(Yt===Ye&&$t)return $t;if(!$&&Yt in st)return st[Yt];switch(Yt){case"keys":case oe:case he:return function(){return new dt(this,Yt)}}return function(){return new dt(this)}},He=ce+" Iterator",Zt=!1,st=Oe.prototype,en=st[se]||st["@@iterator"]||Ye&&st[Ye],$t=!$&&en||Ve(Ye),Gt="Array"==ce&&st.entries||en;if(Gt&&(Ut=y(Gt.call(new Oe)))!==Object.prototype&&Ut.next&&(!p&&y(Ut)!==ae&&(T?T(Ut,ae):e(Ut[se])||F(Ut,se,me)),M(Ut,He,!0,!0),p&&(J[He]=me)),ee&&Ye==oe&&en&&en.name!==oe&&(!p&&ue?R(st,"name",oe):(Zt=!0,$t=function(){return u(en,this)})),Ye)if(Bt={values:Ve(oe),keys:je?$t:Ve("keys"),entries:Ve(he)},Ie)for(mt in Bt)($||Zt||!(mt in st))&&F(st,mt,Bt[mt]);else r({target:ce,proto:!0,forced:$||Zt},Bt);return(!p||Ie)&&st[se]!==$t&&F(st,se,$t,{name:Ye}),J[ce]=$t,Bt}},16925:(v,S,i)=>{var r=i(13544),u=i(80112),p=i(89734),f=i(48011).f;v.exports=function(e){var _=r.Symbol||(r.Symbol={});u(_,e)||f(_,e,{value:p.f(e)})}},67236:(v,S,i)=>{"use strict";var r=i(7378),u=TypeError;v.exports=function(p,f){if(!delete p[f])throw u("Cannot delete property "+r(f)+" of "+r(p))}},49642:(v,S,i)=>{var r=i(55756);v.exports=!r(function(){return 7!=Object.defineProperty({},1,{get:function(){return 7}})[1]})},96682:(v,S,i)=>{var r=i(70009),u=i(77293),p=r.document,f=u(p)&&u(p.createElement);v.exports=function(e){return f?p.createElement(e):{}}},11594:v=>{var S=TypeError;v.exports=function(r){if(r>9007199254740991)throw S("Maximum allowed index exceeded");return r}},44125:v=>{v.exports={CSSRuleList:0,CSSStyleDeclaration:0,CSSValueList:0,ClientRectList:0,DOMRectList:0,DOMStringList:0,DOMTokenList:1,DataTransferItemList:0,FileList:0,HTMLAllCollection:0,HTMLCollection:0,HTMLFormElement:0,HTMLSelectElement:0,MediaList:0,MimeTypeArray:0,NamedNodeMap:0,NodeList:1,PaintRequestList:0,Plugin:0,PluginArray:0,SVGLengthList:0,SVGNumberList:0,SVGPathSegList:0,SVGPointList:0,SVGStringList:0,SVGTransformList:0,SourceBufferList:0,StyleSheetList:0,TextTrackCueList:0,TextTrackList:0,TouchList:0}},36410:(v,S,i)=>{var u=i(86053).match(/firefox\/(\d+)/i);v.exports=!!u&&+u[1]},34008:(v,S,i)=>{var r=i(31813),u=i(3787);v.exports=!r&&!u&&"object"==typeof window&&"object"==typeof document},31813:v=>{v.exports="object"==typeof Deno&&Deno&&"object"==typeof Deno.version},5329:(v,S,i)=>{var r=i(86053);v.exports=/MSIE|Trident/.test(r)},16137:(v,S,i)=>{var r=i(86053),u=i(70009);v.exports=/ipad|iphone|ipod/i.test(r)&&void 0!==u.Pebble},3877:(v,S,i)=>{var r=i(86053);v.exports=/(?:ipad|iphone|ipod).*applewebkit/i.test(r)},3787:(v,S,i)=>{var r=i(49806),u=i(70009);v.exports="process"==r(u.process)},85308:(v,S,i)=>{var r=i(86053);v.exports=/web0s(?!.*chrome)/i.test(r)},86053:(v,S,i)=>{var r=i(7365);v.exports=r("navigator","userAgent")||""},63556:(v,S,i)=>{var y,T,r=i(70009),u=i(86053),p=r.process,f=r.Deno,e=p&&p.versions||f&&f.version,_=e&&e.v8;_&&(T=(y=_.split("."))[0]>0&&y[0]<4?1:+(y[0]+y[1])),!T&&u&&(!(y=u.match(/Edge\/(\d+)/))||y[1]>=74)&&(y=u.match(/Chrome\/(\d+)/))&&(T=+y[1]),v.exports=T},34545:(v,S,i)=>{var u=i(86053).match(/AppleWebKit\/(\d+)\./);v.exports=!!u&&+u[1]},97911:(v,S,i)=>{var r=i(13544);v.exports=function(u){return r[u+"Prototype"]}},44939:v=>{v.exports=["constructor","hasOwnProperty","isPrototypeOf","propertyIsEnumerable","toLocaleString","toString","valueOf"]},50499:(v,S,i)=>{var r=i(55756),u=i(51361);v.exports=!r(function(){var p=Error("a");return!("stack"in p)||(Object.defineProperty(p,"stack",u(1,7)),7!==p.stack)})},90513:(v,S,i)=>{"use strict";var r=i(70009),u=i(2543),p=i(23634),f=i(52208),e=i(25525).f,_=i(79482),y=i(13544),T=i(76781),M=i(65162),R=i(80112),F=function(Z){var J=function(Q,ee,ue){if(this instanceof J){switch(arguments.length){case 0:return new Z;case 1:return new Z(Q);case 2:return new Z(Q,ee)}return new Z(Q,ee,ue)}return u(Z,this,arguments)};return J.prototype=Z.prototype,J};v.exports=function(Z,J){var he,me,Oe,ce,dt,ze,Ye,je,Q=Z.target,ee=Z.global,ue=Z.stat,ae=Z.proto,$=ee?r:ue?r[Q]:(r[Q]||{}).prototype,se=ee?y:y[Q]||M(y,Q,{})[Q],ve=se.prototype;for(Oe in J)he=!_(ee?Oe:Q+(ue?".":"#")+Oe,Z.forced)&&$&&R($,Oe),dt=se[Oe],he&&(ze=Z.dontCallGetSet?(je=e($,Oe))&&je.value:$[Oe]),ce=he&&ze?ze:J[Oe],(!he||typeof dt!=typeof ce)&&(Ye=Z.bind&&he?T(ce,r):Z.wrap&&he?F(ce):ae&&f(ce)?p(ce):ce,(Z.sham||ce&&ce.sham||dt&&dt.sham)&&M(Ye,"sham",!0),M(se,Oe,Ye),ae&&(R(y,me=Q+"Prototype")||M(y,me,{}),M(y[me],Oe,ce),Z.real&&ve&&!ve[Oe]&&M(ve,Oe,ce)))}},55756:v=>{v.exports=function(S){try{return!!S()}catch(i){return!0}}},3124:(v,S,i)=>{var r=i(55756);v.exports=!r(function(){return Object.isExtensible(Object.preventExtensions({}))})},2543:(v,S,i)=>{var r=i(29046),u=Function.prototype,p=u.apply,f=u.call;v.exports="object"==typeof Reflect&&Reflect.apply||(r?f.bind(p):function(){return f.apply(p,arguments)})},76781:(v,S,i)=>{var r=i(23634),u=i(61812),p=i(29046),f=r(r.bind);v.exports=function(e,_){return u(e),void 0===_?e:p?f(e,_):function(){return e.apply(_,arguments)}}},29046:(v,S,i)=>{var r=i(55756);v.exports=!r(function(){var u=function(){}.bind();return"function"!=typeof u||u.hasOwnProperty("prototype")})},44197:(v,S,i)=>{"use strict";var r=i(23634),u=i(61812),p=i(77293),f=i(80112),e=i(37591),_=i(29046),y=Function,T=r([].concat),M=r([].join),R={},F=function(Z,J,Q){if(!f(R,J)){for(var ee=[],ue=0;ue<J;ue++)ee[ue]="a["+ue+"]";R[J]=y("C,a","return new C("+M(ee,",")+")")}return R[J](Z,Q)};v.exports=_?y.bind:function(J){var Q=u(this),ee=Q.prototype,ue=e(arguments,1),ae=function(){var se=T(ue,e(arguments));return this instanceof ae?F(Q,se.length,se):Q.apply(J,se)};return p(ee)&&(ae.prototype=ee),ae}},25401:(v,S,i)=>{var r=i(29046),u=Function.prototype.call;v.exports=r?u.bind(u):function(){return u.apply(u,arguments)}},29862:(v,S,i)=>{var r=i(49642),u=i(80112),p=Function.prototype,f=r&&Object.getOwnPropertyDescriptor,e=u(p,"name"),_=e&&"something"===function(){}.name,y=e&&(!r||r&&f(p,"name").configurable);v.exports={EXISTS:e,PROPER:_,CONFIGURABLE:y}},23634:(v,S,i)=>{var r=i(29046),u=Function.prototype,f=u.call,e=r&&u.bind.bind(f,f);v.exports=r?function(_){return _&&e(_)}:function(_){return _&&function(){return f.apply(_,arguments)}}},7365:(v,S,i)=>{var r=i(13544),u=i(70009),p=i(52208),f=function(e){return p(e)?e:void 0};v.exports=function(e,_){return arguments.length<2?f(r[e])||f(u[e]):r[e]&&r[e][_]||u[e]&&u[e][_]}},34014:(v,S,i)=>{var r=i(35329),u=i(34778),p=i(84394),e=i(91840)("iterator");v.exports=function(_){if(null!=_)return u(_,e)||u(_,"@@iterator")||p[r(_)]}},88055:(v,S,i)=>{var r=i(25401),u=i(61812),p=i(64562),f=i(7378),e=i(34014),_=TypeError;v.exports=function(y,T){var M=arguments.length<2?e(y):T;if(u(M))return p(r(M,y));throw _(f(y)+" is not iterable")}},37444:(v,S,i)=>{var r=i(88055);v.exports=r},34778:(v,S,i)=>{var r=i(61812);v.exports=function(u,p){var f=u[p];return null==f?void 0:r(f)}},70009:v=>{var S=function(i){return i&&i.Math==Math&&i};v.exports=S("object"==typeof globalThis&&globalThis)||S("object"==typeof window&&window)||S("object"==typeof self&&self)||S("object"==typeof global&&global)||function(){return this}()||Function("return this")()},80112:(v,S,i)=>{var r=i(23634),u=i(70267),p=r({}.hasOwnProperty);v.exports=Object.hasOwn||function(e,_){return p(u(e),_)}},45599:v=>{v.exports={}},52912:(v,S,i)=>{var r=i(70009);v.exports=function(u,p){var f=r.console;f&&f.error&&(1==arguments.length?f.error(u):f.error(u,p))}},55690:(v,S,i)=>{var r=i(7365);v.exports=r("document","documentElement")},50495:(v,S,i)=>{var r=i(49642),u=i(55756),p=i(96682);v.exports=!r&&!u(function(){return 7!=Object.defineProperty(p("div"),"a",{get:function(){return 7}}).a})},20973:(v,S,i)=>{var r=i(23634),u=i(55756),p=i(49806),f=Object,e=r("".split);v.exports=u(function(){return!f("z").propertyIsEnumerable(0)})?function(_){return"String"==p(_)?e(_,""):f(_)}:f},26699:(v,S,i)=>{var r=i(23634),u=i(52208),p=i(24766),f=r(Function.toString);u(p.inspectSource)||(p.inspectSource=function(e){return f(e)}),v.exports=p.inspectSource},33411:(v,S,i)=>{var r=i(77293),u=i(65162);v.exports=function(p,f){r(f)&&"cause"in f&&u(p,"cause",f.cause)}},57867:(v,S,i)=>{var r=i(90513),u=i(23634),p=i(45599),f=i(77293),e=i(80112),_=i(48011).f,y=i(51518),T=i(62469),M=i(46401),R=i(13708),F=i(3124),Z=!1,J=R("meta"),Q=0,ee=function(oe){_(oe,J,{value:{objectID:"O"+Q++,weakData:{}}})},ve=v.exports={enable:function(){ve.enable=function(){},Z=!0;var oe=y.f,he=u([].splice),me={};me[J]=1,oe(me).length&&(y.f=function(Oe){for(var ce=oe(Oe),dt=0,ze=ce.length;dt<ze;dt++)if(ce[dt]===J){he(ce,dt,1);break}return ce},r({target:"Object",stat:!0,forced:!0},{getOwnPropertyNames:T.f}))},fastKey:function(oe,he){if(!f(oe))return"symbol"==typeof oe?oe:("string"==typeof oe?"S":"P")+oe;if(!e(oe,J)){if(!M(oe))return"F";if(!he)return"E";ee(oe)}return oe[J].objectID},getWeakData:function(oe,he){if(!e(oe,J)){if(!M(oe))return!0;if(!he)return!1;ee(oe)}return oe[J].weakData},onFreeze:function(oe){return F&&Z&&M(oe)&&!e(oe,J)&&ee(oe),oe}};p[J]=!0},91093:(v,S,i)=>{var J,Q,ee,r=i(13179),u=i(70009),p=i(23634),f=i(77293),e=i(65162),_=i(80112),y=i(24766),T=i(86066),M=i(45599),R="Object already initialized",F=u.TypeError;if(r||y.state){var $=y.state||(y.state=new(0,u.WeakMap)),se=p($.get),ve=p($.has),oe=p($.set);J=function(me,Oe){if(ve($,me))throw new F(R);return Oe.facade=me,oe($,me,Oe),Oe},Q=function(me){return se($,me)||{}},ee=function(me){return ve($,me)}}else{var he=T("state");M[he]=!0,J=function(me,Oe){if(_(me,he))throw new F(R);return Oe.facade=me,e(me,he,Oe),Oe},Q=function(me){return _(me,he)?me[he]:{}},ee=function(me){return _(me,he)}}v.exports={set:J,get:Q,has:ee,enforce:function(me){return ee(me)?Q(me):J(me,{})},getterFor:function(me){return function(Oe){var ce;if(!f(Oe)||(ce=Q(Oe)).type!==me)throw F("Incompatible receiver, "+me+" required");return ce}}}},39918:(v,S,i)=>{var r=i(91840),u=i(84394),p=r("iterator"),f=Array.prototype;v.exports=function(e){return void 0!==e&&(u.Array===e||f[p]===e)}},89735:(v,S,i)=>{var r=i(49806);v.exports=Array.isArray||function(p){return"Array"==r(p)}},52208:v=>{v.exports=function(S){return"function"==typeof S}},81177:(v,S,i)=>{var r=i(23634),u=i(55756),p=i(52208),f=i(35329),e=i(7365),_=i(26699),y=function(){},T=[],M=e("Reflect","construct"),R=/^\s*(?:class|function)\b/,F=r(R.exec),Z=!R.exec(y),J=function(ue){if(!p(ue))return!1;try{return M(y,T,ue),!0}catch(ae){return!1}},Q=function(ue){if(!p(ue))return!1;switch(f(ue)){case"AsyncFunction":case"GeneratorFunction":case"AsyncGeneratorFunction":return!1}try{return Z||!!F(R,_(ue))}catch(ae){return!0}};Q.sham=!0,v.exports=!M||u(function(){var ee;return J(J.call)||!J(Object)||!J(function(){ee=!0})||ee})?Q:J},27029:(v,S,i)=>{var r=i(80112);v.exports=function(u){return void 0!==u&&(r(u,"value")||r(u,"writable"))}},79482:(v,S,i)=>{var r=i(55756),u=i(52208),p=/#|\.prototype\./,f=function(M,R){var F=_[e(M)];return F==T||F!=y&&(u(R)?r(R):!!R)},e=f.normalize=function(M){return String(M).replace(p,".").toLowerCase()},_=f.data={},y=f.NATIVE="N",T=f.POLYFILL="P";v.exports=f},77293:(v,S,i)=>{var r=i(52208);v.exports=function(u){return"object"==typeof u?null!==u:r(u)}},81124:v=>{v.exports=!0},60373:(v,S,i)=>{var r=i(77293),u=i(49806),f=i(91840)("match");v.exports=function(e){var _;return r(e)&&(void 0!==(_=e[f])?!!_:"RegExp"==u(e))}},74717:(v,S,i)=>{var r=i(7365),u=i(52208),p=i(23336),f=i(99554),e=Object;v.exports=f?function(_){return"symbol"==typeof _}:function(_){var y=r("Symbol");return u(y)&&p(y.prototype,e(_))}},41605:(v,S,i)=>{var r=i(76781),u=i(25401),p=i(64562),f=i(7378),e=i(39918),_=i(6381),y=i(23336),T=i(88055),M=i(34014),R=i(40798),F=TypeError,Z=function(Q,ee){this.stopped=Q,this.result=ee},J=Z.prototype;v.exports=function(Q,ee,ue){var me,Oe,ce,dt,ze,Ye,je,$=!(!ue||!ue.AS_ENTRIES),se=!(!ue||!ue.IS_RECORD),ve=!(!ue||!ue.IS_ITERATOR),oe=!(!ue||!ue.INTERRUPTED),he=r(ee,ue&&ue.that),Ie=function(He){return me&&R(me,"normal",He),new Z(!0,He)},Ve=function(He){return $?(p(He),oe?he(He[0],He[1],Ie):he(He[0],He[1])):oe?he(He,Ie):he(He)};if(se)me=Q.iterator;else if(ve)me=Q;else{if(!(Oe=M(Q)))throw F(f(Q)+" is not iterable");if(e(Oe)){for(ce=0,dt=_(Q);dt>ce;ce++)if((ze=Ve(Q[ce]))&&y(J,ze))return ze;return new Z(!1)}me=T(Q,Oe)}for(Ye=se?Q.next:me.next;!(je=u(Ye,me)).done;){try{ze=Ve(je.value)}catch(He){R(me,"throw",He)}if("object"==typeof ze&&ze&&y(J,ze))return ze}return new Z(!1)}},40798:(v,S,i)=>{var r=i(25401),u=i(64562),p=i(34778);v.exports=function(f,e,_){var y,T;u(f);try{if(!(y=p(f,"return"))){if("throw"===e)throw _;return _}y=r(y,f)}catch(M){T=!0,y=M}if("throw"===e)throw _;if(T)throw y;return u(y),_}},38432:(v,S,i)=>{"use strict";var R,F,Z,r=i(55756),u=i(52208),p=i(83272),f=i(31426),e=i(42915),_=i(91840),y=i(81124),T=_("iterator"),M=!1;[].keys&&("next"in(Z=[].keys())?(F=f(f(Z)))!==Object.prototype&&(R=F):M=!0),null==R||r(function(){var Q={};return R[T].call(Q)!==Q})?R={}:y&&(R=p(R)),u(R[T])||e(R,T,function(){return this}),v.exports={IteratorPrototype:R,BUGGY_SAFARI_ITERATORS:M}},84394:v=>{v.exports={}},6381:(v,S,i)=>{var r=i(48869);v.exports=function(u){return r(u.length)}},12864:(v,S,i)=>{"use strict";var r=i(25401),u=i(61812),p=i(64562);v.exports=function(e,_){var F,Z,y=p(this),T=u(y.get),M=u(y.has),R=u(y.set);return r(M,y,e)?(F=r(T,y,e),"update"in _&&(F=_.update(F,e,y),r(R,y,e,F)),F):(Z=_.insert(e,y),r(R,y,e,Z),Z)}},57729:(v,S,i)=>{"use strict";var r=i(25401),u=i(61812),p=i(52208),f=i(64562),e=TypeError;v.exports=function(y,T){var Q,M=f(this),R=u(M.get),F=u(M.has),Z=u(M.set),J=arguments.length>2?arguments[2]:void 0;if(!p(T)&&!p(J))throw e("At least one callback required");return r(F,M,y)?(Q=r(R,M,y),p(T)&&(Q=T(Q),r(Z,M,y,Q))):p(J)&&(Q=J(),r(Z,M,y,Q)),Q}},8651:v=>{var S=Math.ceil,i=Math.floor;v.exports=Math.trunc||function(u){var p=+u;return(p>0?i:S)(p)}},58991:(v,S,i)=>{var ee,ue,ae,$,se,ve,oe,he,r=i(70009),u=i(76781),p=i(25525).f,f=i(37352).set,e=i(3877),_=i(16137),y=i(85308),T=i(3787),M=r.MutationObserver||r.WebKitMutationObserver,R=r.document,F=r.process,Z=r.Promise,J=p(r,"queueMicrotask"),Q=J&&J.value;Q||(ee=function(){var me,Oe;for(T&&(me=F.domain)&&me.exit();ue;){Oe=ue.fn,ue=ue.next;try{Oe()}catch(ce){throw ue?$():ae=void 0,ce}}ae=void 0,me&&me.enter()},e||T||y||!M||!R?!_&&Z&&Z.resolve?((oe=Z.resolve(void 0)).constructor=Z,he=u(oe.then,oe),$=function(){he(ee)}):T?$=function(){F.nextTick(ee)}:(f=u(f,r),$=function(){f(ee)}):(se=!0,ve=R.createTextNode(""),new M(ee).observe(ve,{characterData:!0}),$=function(){ve.data=se=!se})),v.exports=Q||function(me){var Oe={fn:me,next:void 0};ae&&(ae.next=Oe),ue||(ue=Oe,$()),ae=Oe}},53900:(v,S,i)=>{var r=i(29333);v.exports=r&&!!Symbol.for&&!!Symbol.keyFor},29333:(v,S,i)=>{var r=i(63556),u=i(55756);v.exports=!!Object.getOwnPropertySymbols&&!u(function(){var p=Symbol();return!String(p)||!(Object(p)instanceof Symbol)||!Symbol.sham&&r&&r<41})},29407:(v,S,i)=>{var r=i(55756),u=i(91840),p=i(81124),f=u("iterator");v.exports=!r(function(){var e=new URL("b?a=1&b=2&c=3","http://a"),_=e.searchParams,y="";return e.pathname="c%20d",_.forEach(function(T,M){_.delete("b"),y+=M+T}),p&&!e.toJSON||!_.sort||"http://a/c%20d?a=1&c=3"!==e.href||"3"!==_.get("c")||"a=1"!==String(new URLSearchParams("?a=1"))||!_[f]||"a"!==new URL("https://a@b").username||"b"!==new URLSearchParams(new URLSearchParams("a=b")).get("a")||"xn--e1aybc"!==new URL("http://\u0442\u0435\u0441\u0442").host||"#%D0%B1"!==new URL("http://a#\u0431").hash||"a1c3"!==y||"x"!==new URL("http://x",void 0).host})},13179:(v,S,i)=>{var r=i(70009),u=i(52208),p=i(26699),f=r.WeakMap;v.exports=u(f)&&/native code/.test(p(f))},54256:(v,S,i)=>{"use strict";var r=i(61812),u=function(p){var f,e;this.promise=new p(function(_,y){if(void 0!==f||void 0!==e)throw TypeError("Bad Promise constructor");f=_,e=y}),this.resolve=r(f),this.reject=r(e)};v.exports.f=function(p){return new u(p)}},63313:(v,S,i)=>{var r=i(41433);v.exports=function(u,p){return void 0===u?arguments.length<2?"":p:r(u)}},56421:(v,S,i)=>{var r=i(60373),u=TypeError;v.exports=function(p){if(r(p))throw u("The method doesn't accept regular expressions");return p}},75791:(v,S,i)=>{"use strict";var r=i(49642),u=i(23634),p=i(25401),f=i(55756),e=i(28474),_=i(47238),y=i(25558),T=i(70267),M=i(20973),R=Object.assign,F=Object.defineProperty,Z=u([].concat);v.exports=!R||f(function(){if(r&&1!==R({b:1},R(F({},"a",{enumerable:!0,get:function(){F(this,"b",{value:3,enumerable:!1})}}),{b:2})).b)return!0;var J={},Q={},ee=Symbol(),ue="abcdefghijklmnopqrst";return J[ee]=7,ue.split("").forEach(function(ae){Q[ae]=ae}),7!=R({},J)[ee]||e(R({},Q)).join("")!=ue})?function(Q,ee){for(var ue=T(Q),ae=arguments.length,$=1,se=_.f,ve=y.f;ae>$;)for(var ce,oe=M(arguments[$++]),he=se?Z(e(oe),se(oe)):e(oe),me=he.length,Oe=0;me>Oe;)ce=he[Oe++],(!r||p(ve,oe,ce))&&(ue[ce]=oe[ce]);return ue}:R},83272:(v,S,i)=>{var ae,r=i(64562),u=i(25913),p=i(44939),f=i(45599),e=i(55690),_=i(96682),y=i(86066),R="prototype",F="script",Z=y("IE_PROTO"),J=function(){},Q=function(se){return"<"+F+">"+se+"</"+F+">"},ee=function(se){se.write(Q("")),se.close();var ve=se.parentWindow.Object;return se=null,ve},$=function(){try{ae=new ActiveXObject("htmlfile")}catch(ve){}$="undefined"!=typeof document?document.domain&&ae?ee(ae):function(){var oe,se=_("iframe");return se.style.display="none",e.appendChild(se),se.src=String("javascript:"),(oe=se.contentWindow.document).open(),oe.write(Q("document.F=Object")),oe.close(),oe.F}():ee(ae);for(var se=p.length;se--;)delete $[R][p[se]];return $()};f[Z]=!0,v.exports=Object.create||function(ve,oe){var he;return null!==ve?(J[R]=r(ve),he=new J,J[R]=null,he[Z]=ve):he=$(),void 0===oe?he:u.f(he,oe)}},25913:(v,S,i)=>{var r=i(49642),u=i(47960),p=i(48011),f=i(64562),e=i(81010),_=i(28474);S.f=r&&!u?Object.defineProperties:function(T,M){f(T);for(var Q,R=e(M),F=_(M),Z=F.length,J=0;Z>J;)p.f(T,Q=F[J++],R[Q]);return T}},48011:(v,S,i)=>{var r=i(49642),u=i(50495),p=i(47960),f=i(64562),e=i(62939),_=TypeError,y=Object.defineProperty,T=Object.getOwnPropertyDescriptor,M="enumerable",R="configurable",F="writable";S.f=r?p?function(J,Q,ee){if(f(J),Q=e(Q),f(ee),"function"==typeof J&&"prototype"===Q&&"value"in ee&&F in ee&&!ee[F]){var ue=T(J,Q);ue&&ue[F]&&(J[Q]=ee.value,ee={configurable:R in ee?ee[R]:ue[R],enumerable:M in ee?ee[M]:ue[M],writable:!1})}return y(J,Q,ee)}:y:function(J,Q,ee){if(f(J),Q=e(Q),f(ee),u)try{return y(J,Q,ee)}catch(ue){}if("get"in ee||"set"in ee)throw _("Accessors not supported");return"value"in ee&&(J[Q]=ee.value),J}},25525:(v,S,i)=>{var r=i(49642),u=i(25401),p=i(25558),f=i(51361),e=i(81010),_=i(62939),y=i(80112),T=i(50495),M=Object.getOwnPropertyDescriptor;S.f=r?M:function(F,Z){if(F=e(F),Z=_(Z),T)try{return M(F,Z)}catch(J){}if(y(F,Z))return f(!u(p.f,F,Z),F[Z])}},62469:(v,S,i)=>{var r=i(49806),u=i(81010),p=i(51518).f,f=i(8681),e="object"==typeof window&&window&&Object.getOwnPropertyNames?Object.getOwnPropertyNames(window):[];v.exports.f=function(T){return e&&"Window"==r(T)?function(y){try{return p(y)}catch(T){return f(e)}}(T):p(u(T))}},51518:(v,S,i)=>{var r=i(66250),p=i(44939).concat("length","prototype");S.f=Object.getOwnPropertyNames||function(e){return r(e,p)}},47238:(v,S)=>{S.f=Object.getOwnPropertySymbols},31426:(v,S,i)=>{var r=i(80112),u=i(52208),p=i(70267),f=i(86066),e=i(37112),_=f("IE_PROTO"),y=Object,T=y.prototype;v.exports=e?y.getPrototypeOf:function(M){var R=p(M);if(r(R,_))return R[_];var F=R.constructor;return u(F)&&R instanceof F?F.prototype:R instanceof y?T:null}},46401:(v,S,i)=>{var r=i(55756),u=i(77293),p=i(49806),f=i(76318),e=Object.isExtensible,_=r(function(){e(1)});v.exports=_||f?function(T){return!(!u(T)||f&&"ArrayBuffer"==p(T))&&(!e||e(T))}:e},23336:(v,S,i)=>{var r=i(23634);v.exports=r({}.isPrototypeOf)},66250:(v,S,i)=>{var r=i(23634),u=i(80112),p=i(81010),f=i(95171).indexOf,e=i(45599),_=r([].push);v.exports=function(y,T){var Z,M=p(y),R=0,F=[];for(Z in M)!u(e,Z)&&u(M,Z)&&_(F,Z);for(;T.length>R;)u(M,Z=T[R++])&&(~f(F,Z)||_(F,Z));return F}},28474:(v,S,i)=>{var r=i(66250),u=i(44939);v.exports=Object.keys||function(f){return r(f,u)}},25558:(v,S)=>{"use strict";var i={}.propertyIsEnumerable,r=Object.getOwnPropertyDescriptor,u=r&&!i.call({1:2},1);S.f=u?function(f){var e=r(this,f);return!!e&&e.enumerable}:i},54945:(v,S,i)=>{var r=i(23634),u=i(64562),p=i(93221);v.exports=Object.setPrototypeOf||("__proto__"in{}?function(){var _,f=!1,e={};try{(_=r(Object.getOwnPropertyDescriptor(Object.prototype,"__proto__").set))(e,[]),f=e instanceof Array}catch(y){}return function(T,M){return u(T),p(M),f?_(T,M):T.__proto__=M,T}}():void 0)},36805:(v,S,i)=>{var r=i(49642),u=i(23634),p=i(28474),f=i(81010),_=u(i(25558).f),y=u([].push),T=function(M){return function(R){for(var ue,F=f(R),Z=p(F),J=Z.length,Q=0,ee=[];J>Q;)ue=Z[Q++],(!r||_(F,ue))&&y(ee,M?[ue,F[ue]]:F[ue]);return ee}};v.exports={entries:T(!0),values:T(!1)}},97686:(v,S,i)=>{"use strict";var r=i(25014),u=i(35329);v.exports=r?{}.toString:function(){return"[object "+u(this)+"]"}},71689:(v,S,i)=>{var r=i(25401),u=i(52208),p=i(77293),f=TypeError;v.exports=function(e,_){var y,T;if("string"===_&&u(y=e.toString)&&!p(T=r(y,e))||u(y=e.valueOf)&&!p(T=r(y,e))||"string"!==_&&u(y=e.toString)&&!p(T=r(y,e)))return T;throw f("Can't convert object to primitive value")}},59823:(v,S,i)=>{var r=i(7365),u=i(23634),p=i(51518),f=i(47238),e=i(64562),_=u([].concat);v.exports=r("Reflect","ownKeys")||function(T){var M=p.f(e(T)),R=f.f;return R?_(M,R(T)):M}},13544:v=>{v.exports={}},26975:v=>{v.exports=function(S){try{return{error:!1,value:S()}}catch(i){return{error:!0,value:i}}}},9936:(v,S,i)=>{var r=i(70009),u=i(46456),p=i(52208),f=i(79482),e=i(26699),_=i(91840),y=i(34008),T=i(31813),M=i(81124),R=i(63556),F=u&&u.prototype,Z=_("species"),J=!1,Q=p(r.PromiseRejectionEvent),ee=f("Promise",function(){var ue=e(u),ae=ue!==String(u);if(!ae&&66===R||M&&(!F.catch||!F.finally))return!0;if(!R||R<51||!/native code/.test(ue)){var $=new u(function(oe){oe(1)}),se=function(oe){oe(function(){},function(){})};if(($.constructor={})[Z]=se,!(J=$.then(function(){})instanceof se))return!0}return!ae&&(y||T)&&!Q});v.exports={CONSTRUCTOR:ee,REJECTION_EVENT:Q,SUBCLASSING:J}},46456:(v,S,i)=>{var r=i(70009);v.exports=r.Promise},25524:(v,S,i)=>{var r=i(64562),u=i(77293),p=i(54256);v.exports=function(f,e){if(r(f),u(e)&&e.constructor===f)return e;var _=p.f(f);return(0,_.resolve)(e),_.promise}},95758:(v,S,i)=>{var r=i(46456),u=i(5253),p=i(9936).CONSTRUCTOR;v.exports=p||!u(function(f){r.all(f).then(void 0,function(){})})},70918:v=>{var S=function(){this.head=null,this.tail=null};S.prototype={add:function(i){var r={item:i,next:null};this.head?this.tail.next=r:this.head=r,this.tail=r},get:function(){var i=this.head;if(i)return this.head=i.next,this.tail===i&&(this.tail=null),i.item}},v.exports=S},67917:v=>{var S=TypeError;v.exports=function(i){if(null==i)throw S("Can't call method on "+i);return i}},29627:v=>{v.exports=function(S,i){return S===i||S!=S&&i!=i}},53814:(v,S,i)=>{var r=i(70009),u=i(2543),p=i(52208),f=i(86053),e=i(37591),_=i(15086),y=/MSIE .\./.test(f),T=r.Function,M=function(R){return y?function(F,Z){var J=_(arguments.length,1)>2,Q=p(F)?F:T(F),ee=J?e(arguments,2):void 0;return R(J?function(){u(Q,this,ee)}:Q,Z)}:R};v.exports={setTimeout:M(r.setTimeout),setInterval:M(r.setInterval)}},58014:(v,S,i)=>{"use strict";var r=i(7365),u=i(48011),p=i(91840),f=i(49642),e=p("species");v.exports=function(_){var y=r(_);f&&y&&!y[e]&&(0,u.f)(y,e,{configurable:!0,get:function(){return this}})}},85681:(v,S,i)=>{var r=i(25014),u=i(48011).f,p=i(65162),f=i(80112),e=i(97686),y=i(91840)("toStringTag");v.exports=function(T,M,R,F){if(T){var Z=R?T:T.prototype;f(Z,y)||u(Z,y,{configurable:!0,value:M}),F&&!r&&p(Z,"toString",e)}}},86066:(v,S,i)=>{var r=i(64579),u=i(13708),p=r("keys");v.exports=function(f){return p[f]||(p[f]=u(f))}},24766:(v,S,i)=>{var r=i(70009),u=i(34056),p="__core-js_shared__",f=r[p]||u(p,{});v.exports=f},64579:(v,S,i)=>{var r=i(81124),u=i(24766);(v.exports=function(p,f){return u[p]||(u[p]=void 0!==f?f:{})})("versions",[]).push({version:"3.24.1",mode:r?"pure":"global",copyright:"\xa9 2014-2022 Denis Pushkarev (zloirock.ru)",license:"https://github.com/zloirock/core-js/blob/v3.24.1/LICENSE",source:"https://github.com/zloirock/core-js"})},95869:(v,S,i)=>{var r=i(64562),u=i(54356),f=i(91840)("species");v.exports=function(e,_){var T,y=r(e).constructor;return void 0===y||null==(T=r(y)[f])?_:u(T)}},61557:(v,S,i)=>{var r=i(23634),u=i(33912),p=i(41433),f=i(67917),e=r("".charAt),_=r("".charCodeAt),y=r("".slice),T=function(M){return function(R,F){var ee,ue,Z=p(f(R)),J=u(F),Q=Z.length;return J<0||J>=Q?M?"":void 0:(ee=_(Z,J))<55296||ee>56319||J+1===Q||(ue=_(Z,J+1))<56320||ue>57343?M?e(Z,J):ee:M?y(Z,J,J+2):ue-56320+(ee-55296<<10)+65536}};v.exports={codeAt:T(!1),charAt:T(!0)}},26662:(v,S,i)=>{"use strict";var r=i(23634),u=2147483647,F=/[^\0-\u007E]/,Z=/[.\u3002\uFF0E\uFF61]/g,J="Overflow: input needs wider integers to process",ee=RangeError,ue=r(Z.exec),ae=Math.floor,$=String.fromCharCode,se=r("".charCodeAt),ve=r([].join),oe=r([].push),he=r("".replace),me=r("".split),Oe=r("".toLowerCase),dt=function(je){return je+22+75*(je<26)},ze=function(je,Ie,Ve){var He=0;for(je=Ve?ae(je/700):je>>1,je+=ae(je/Ie);je>455;)je=ae(je/35),He+=36;return ae(He+36*je/(je+38))},Ye=function(je){var en,$t,Ie=[],Ve=(je=function(je){for(var Ie=[],Ve=0,He=je.length;Ve<He;){var Zt=se(je,Ve++);if(Zt>=55296&&Zt<=56319&&Ve<He){var st=se(je,Ve++);56320==(64512&st)?oe(Ie,((1023&Zt)<<10)+(1023&st)+65536):(oe(Ie,Zt),Ve--)}else oe(Ie,Zt)}return Ie}(je)).length,He=128,Zt=0,st=72;for(en=0;en<je.length;en++)($t=je[en])<128&&oe(Ie,$($t));var Gt=Ie.length,Ut=Gt;for(Gt&&oe(Ie,"-");Ut<Ve;){var Bt=u;for(en=0;en<je.length;en++)($t=je[en])>=He&&$t<Bt&&(Bt=$t);var mt=Ut+1;if(Bt-He>ae((u-Zt)/mt))throw ee(J);for(Zt+=(Bt-He)*mt,He=Bt,en=0;en<je.length;en++){if(($t=je[en])<He&&++Zt>u)throw ee(J);if($t==He){for(var Yt=Zt,Dt=36;;){var zt=Dt<=st?1:Dt>=st+26?26:Dt-st;if(Yt<zt)break;var Yn=Yt-zt,Hr=36-zt;oe(Ie,$(dt(zt+Yn%Hr))),Yt=ae(Yn/Hr),Dt+=36}oe(Ie,$(dt(Yt))),st=ze(Zt,mt,Ut==Gt),Zt=0,Ut++}}Zt++,He++}return ve(Ie,"")};v.exports=function(je){var He,Zt,Ie=[],Ve=me(he(Oe(je),Z,"."),".");for(He=0;He<Ve.length;He++)oe(Ie,ue(F,Zt=Ve[He])?"xn--"+Ye(Zt):Zt);return ve(Ie,".")}},53411:(v,S,i)=>{"use strict";var r=i(33912),u=i(41433),p=i(67917),f=RangeError;v.exports=function(_){var y=u(p(this)),T="",M=r(_);if(M<0||M==1/0)throw f("Wrong number of repetitions");for(;M>0;(M>>>=1)&&(y+=y))1&M&&(T+=y);return T}},85462:(v,S,i)=>{var r=i(29862).PROPER,u=i(55756),p=i(88185);v.exports=function(e){return u(function(){return!!p[e]()||"\u200b\x85\u180e"!=="\u200b\x85\u180e"[e]()||r&&p[e].name!==e})}},89858:(v,S,i)=>{var r=i(23634),u=i(67917),p=i(41433),f=i(88185),e=r("".replace),_="["+f+"]",y=RegExp("^"+_+_+"*"),T=RegExp(_+_+"*$"),M=function(R){return function(F){var Z=p(u(F));return 1&R&&(Z=e(Z,y,"")),2&R&&(Z=e(Z,T,"")),Z}};v.exports={start:M(1),end:M(2),trim:M(3)}},56992:(v,S,i)=>{var r=i(25401),u=i(7365),p=i(91840),f=i(42915);v.exports=function(){var e=u("Symbol"),_=e&&e.prototype,y=_&&_.valueOf,T=p("toPrimitive");_&&!_[T]&&f(_,T,function(M){return r(y,this)},{arity:1})}},37352:(v,S,i)=>{var me,Oe,ce,dt,r=i(70009),u=i(2543),p=i(76781),f=i(52208),e=i(80112),_=i(55756),y=i(55690),T=i(37591),M=i(96682),R=i(15086),F=i(3877),Z=i(3787),J=r.setImmediate,Q=r.clearImmediate,ee=r.process,ue=r.Dispatch,ae=r.Function,$=r.MessageChannel,se=r.String,ve=0,oe={},he="onreadystatechange";try{me=r.location}catch(Ve){}var ze=function(Ve){if(e(oe,Ve)){var He=oe[Ve];delete oe[Ve],He()}},Ye=function(Ve){return function(){ze(Ve)}},je=function(Ve){ze(Ve.data)},Ie=function(Ve){r.postMessage(se(Ve),me.protocol+"//"+me.host)};(!J||!Q)&&(J=function(He){R(arguments.length,1);var Zt=f(He)?He:ae(He),st=T(arguments,1);return oe[++ve]=function(){u(Zt,void 0,st)},Oe(ve),ve},Q=function(He){delete oe[He]},Z?Oe=function(Ve){ee.nextTick(Ye(Ve))}:ue&&ue.now?Oe=function(Ve){ue.now(Ye(Ve))}:$&&!F?(dt=(ce=new $).port2,ce.port1.onmessage=je,Oe=p(dt.postMessage,dt)):r.addEventListener&&f(r.postMessage)&&!r.importScripts&&me&&"file:"!==me.protocol&&!_(Ie)?(Oe=Ie,r.addEventListener("message",je,!1)):Oe=he in M("script")?function(Ve){y.appendChild(M("script"))[he]=function(){y.removeChild(this),ze(Ve)}}:function(Ve){setTimeout(Ye(Ve),0)}),v.exports={set:J,clear:Q}},19401:(v,S,i)=>{var r=i(33912),u=Math.max,p=Math.min;v.exports=function(f,e){var _=r(f);return _<0?u(_+e,0):p(_,e)}},81010:(v,S,i)=>{var r=i(20973),u=i(67917);v.exports=function(p){return r(u(p))}},33912:(v,S,i)=>{var r=i(8651);v.exports=function(u){var p=+u;return p!=p||0===p?0:r(p)}},48869:(v,S,i)=>{var r=i(33912),u=Math.min;v.exports=function(p){return p>0?u(r(p),9007199254740991):0}},70267:(v,S,i)=>{var r=i(67917),u=Object;v.exports=function(p){return u(r(p))}},1645:(v,S,i)=>{var r=i(25401),u=i(77293),p=i(74717),f=i(34778),e=i(71689),_=i(91840),y=TypeError,T=_("toPrimitive");v.exports=function(M,R){if(!u(M)||p(M))return M;var Z,F=f(M,T);if(F){if(void 0===R&&(R="default"),Z=r(F,M,R),!u(Z)||p(Z))return Z;throw y("Can't convert object to primitive value")}return void 0===R&&(R="number"),e(M,R)}},62939:(v,S,i)=>{var r=i(1645),u=i(74717);v.exports=function(p){var f=r(p,"string");return u(f)?f:f+""}},25014:(v,S,i)=>{var p={};p[i(91840)("toStringTag")]="z",v.exports="[object z]"===String(p)},41433:(v,S,i)=>{var r=i(35329),u=String;v.exports=function(p){if("Symbol"===r(p))throw TypeError("Cannot convert a Symbol value to a string");return u(p)}},7378:v=>{var S=String;v.exports=function(i){try{return S(i)}catch(r){return"Object"}}},13708:(v,S,i)=>{var r=i(23634),u=0,p=Math.random(),f=r(1..toString);v.exports=function(e){return"Symbol("+(void 0===e?"":e)+")_"+f(++u+p,36)}},99554:(v,S,i)=>{var r=i(29333);v.exports=r&&!Symbol.sham&&"symbol"==typeof Symbol.iterator},47960:(v,S,i)=>{var r=i(49642),u=i(55756);v.exports=r&&u(function(){return 42!=Object.defineProperty(function(){},"prototype",{value:42,writable:!1}).prototype})},15086:v=>{var S=TypeError;v.exports=function(i,r){if(i<r)throw S("Not enough arguments");return i}},89734:(v,S,i)=>{var r=i(91840);S.f=r},91840:(v,S,i)=>{var r=i(70009),u=i(64579),p=i(80112),f=i(13708),e=i(29333),_=i(99554),y=u("wks"),T=r.Symbol,M=T&&T.for,R=_?T:T&&T.withoutSetter||f;v.exports=function(F){if(!p(y,F)||!e&&"string"!=typeof y[F]){var Z="Symbol."+F;y[F]=e&&p(T,F)?T[F]:_&&M?M(Z):R(Z)}return y[F]}},88185:v=>{v.exports="\t\n\v\f\r \xa0\u1680\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200a\u202f\u205f\u3000\u2028\u2029\ufeff"},70210:(v,S,i)=>{"use strict";var r=i(90513),u=i(23336),p=i(31426),f=i(54945),e=i(65031),_=i(83272),y=i(65162),T=i(51361),M=i(41995),R=i(33411),F=i(41605),Z=i(63313),J=i(91840),Q=i(50499),ee=J("toStringTag"),ue=Error,ae=[].push,$=function(oe,he){var ce,me=arguments.length>2?arguments[2]:void 0,Oe=u(se,this);f?ce=f(new ue,Oe?p(this):se):(ce=Oe?this:_(se),y(ce,ee,"Error")),void 0!==he&&y(ce,"message",Z(he)),Q&&y(ce,"stack",M(ce.stack,1)),R(ce,me);var dt=[];return F(oe,ae,{that:dt}),y(ce,"errors",dt),ce};f?f($,ue):e($,ue,{name:!0});var se=$.prototype=_(ue.prototype,{constructor:T(1,$),message:T(1,""),name:T(1,"AggregateError")});r({global:!0,constructor:!0,arity:2},{AggregateError:$})},10901:(v,S,i)=>{i(70210)},1625:(v,S,i)=>{"use strict";var r=i(90513),u=i(55756),p=i(89735),f=i(77293),e=i(70267),_=i(6381),y=i(11594),T=i(46751),M=i(2103),R=i(95913),F=i(91840),Z=i(63556),J=F("isConcatSpreadable"),Q=Z>=51||!u(function(){var $=[];return $[J]=!1,$.concat()[0]!==$}),ee=R("concat"),ue=function($){if(!f($))return!1;var se=$[J];return void 0!==se?!!se:p($)};r({target:"Array",proto:!0,arity:1,forced:!Q||!ee},{concat:function(se){var me,Oe,ce,dt,ze,ve=e(this),oe=M(ve,0),he=0;for(me=-1,ce=arguments.length;me<ce;me++)if(ue(ze=-1===me?ve:arguments[me]))for(dt=_(ze),y(he+dt),Oe=0;Oe<dt;Oe++,he++)Oe in ze&&T(oe,he,ze[Oe]);else y(he+1),T(oe,he++,ze);return oe.length=he,oe}})},70466:(v,S,i)=>{"use strict";var r=i(90513),u=i(68607).every;r({target:"Array",proto:!0,forced:!i(33620)("every")},{every:function(_){return u(this,_,arguments.length>1?arguments[1]:void 0)}})},24990:(v,S,i)=>{var r=i(90513),u=i(35277),p=i(82196);r({target:"Array",proto:!0},{fill:u}),p("fill")},56534:(v,S,i)=>{"use strict";var r=i(90513),u=i(68607).filter;r({target:"Array",proto:!0,forced:!i(95913)("filter")},{filter:function(_){return u(this,_,arguments.length>1?arguments[1]:void 0)}})},12773:(v,S,i)=>{"use strict";var r=i(90513),u=i(68607).findIndex,p=i(82196),f="findIndex",e=!0;f in[]&&Array(1)[f](function(){e=!1}),r({target:"Array",proto:!0,forced:e},{findIndex:function(y){return u(this,y,arguments.length>1?arguments[1]:void 0)}}),p(f)},60326:(v,S,i)=>{"use strict";var r=i(90513),u=i(68607).find,p=i(82196),f="find",e=!0;f in[]&&Array(1)[f](function(){e=!1}),r({target:"Array",proto:!0,forced:e},{find:function(y){return u(this,y,arguments.length>1?arguments[1]:void 0)}}),p(f)},98792:(v,S,i)=>{"use strict";var r=i(90513),u=i(8366);r({target:"Array",proto:!0,forced:[].forEach!=u},{forEach:u})},261:(v,S,i)=>{var r=i(90513),u=i(51923);r({target:"Array",stat:!0,forced:!i(5253)(function(e){Array.from(e)})},{from:u})},77059:(v,S,i)=>{"use strict";var r=i(90513),u=i(95171).includes,p=i(55756),f=i(82196);r({target:"Array",proto:!0,forced:p(function(){return!Array(1).includes()})},{includes:function(y){return u(this,y,arguments.length>1?arguments[1]:void 0)}}),f("includes")},2795:(v,S,i)=>{"use strict";var r=i(90513),u=i(23634),p=i(95171).indexOf,f=i(33620),e=u([].indexOf),_=!!e&&1/e([1],1,-0)<0,y=f("indexOf");r({target:"Array",proto:!0,forced:_||!y},{indexOf:function(M){var R=arguments.length>1?arguments[1]:void 0;return _?e(this,M,R)||0:p(this,M,R)}})},2862:(v,S,i)=>{i(90513)({target:"Array",stat:!0},{isArray:i(89735)})},1285:(v,S,i)=>{"use strict";var r=i(81010),u=i(82196),p=i(84394),f=i(91093),e=i(48011).f,_=i(32837),y=i(81124),T=i(49642),M="Array Iterator",R=f.set,F=f.getterFor(M);v.exports=_(Array,"Array",function(J,Q){R(this,{type:M,target:r(J),index:0,kind:Q})},function(){var J=F(this),Q=J.target,ee=J.kind,ue=J.index++;return!Q||ue>=Q.length?(J.target=void 0,{value:void 0,done:!0}):"keys"==ee?{value:ue,done:!1}:"values"==ee?{value:Q[ue],done:!1}:{value:[ue,Q[ue]],done:!1}},"values");var Z=p.Arguments=p.Array;if(u("keys"),u("values"),u("entries"),!y&&T&&"values"!==Z.name)try{e(Z,"name",{value:"values"})}catch(J){}},74926:(v,S,i)=>{var r=i(90513),u=i(78375);r({target:"Array",proto:!0,forced:u!==[].lastIndexOf},{lastIndexOf:u})},88119:(v,S,i)=>{"use strict";var r=i(90513),u=i(68607).map;r({target:"Array",proto:!0,forced:!i(95913)("map")},{map:function(_){return u(this,_,arguments.length>1?arguments[1]:void 0)}})},46250:(v,S,i)=>{"use strict";var r=i(90513),u=i(88908).left,p=i(33620),f=i(63556),e=i(3787);r({target:"Array",proto:!0,forced:!p("reduce")||!e&&f>79&&f<83},{reduce:function(M){var R=arguments.length;return u(this,M,R,R>1?arguments[1]:void 0)}})},32836:(v,S,i)=>{"use strict";var r=i(90513),u=i(23634),p=i(89735),f=u([].reverse),e=[1,2];r({target:"Array",proto:!0,forced:String(e)===String(e.reverse())},{reverse:function(){return p(this)&&(this.length=this.length),f(this)}})},72999:(v,S,i)=>{"use strict";var r=i(90513),u=i(89735),p=i(81177),f=i(77293),e=i(19401),_=i(6381),y=i(81010),T=i(46751),M=i(91840),R=i(95913),F=i(37591),Z=R("slice"),J=M("species"),Q=Array,ee=Math.max;r({target:"Array",proto:!0,forced:!Z},{slice:function(ae,$){var me,Oe,ce,se=y(this),ve=_(se),oe=e(ae,ve),he=e(void 0===$?ve:$,ve);if(u(se)&&((p(me=se.constructor)&&(me===Q||u(me.prototype))||f(me)&&null===(me=me[J]))&&(me=void 0),me===Q||void 0===me))return F(se,oe,he);for(Oe=new(void 0===me?Q:me)(ee(he-oe,0)),ce=0;oe<he;oe++,ce++)oe in se&&T(Oe,ce,se[oe]);return Oe.length=ce,Oe}})},50733:(v,S,i)=>{"use strict";var r=i(90513),u=i(68607).some;r({target:"Array",proto:!0,forced:!i(33620)("some")},{some:function(_){return u(this,_,arguments.length>1?arguments[1]:void 0)}})},93639:(v,S,i)=>{"use strict";var r=i(90513),u=i(23634),p=i(61812),f=i(70267),e=i(6381),_=i(67236),y=i(41433),T=i(55756),M=i(84865),R=i(33620),F=i(36410),Z=i(5329),J=i(63556),Q=i(34545),ee=[],ue=u(ee.sort),ae=u(ee.push),$=T(function(){ee.sort(void 0)}),se=T(function(){ee.sort(null)}),ve=R("sort"),oe=!T(function(){if(J)return J<70;if(!(F&&F>3)){if(Z)return!0;if(Q)return Q<603;var ce,dt,ze,Ye,Oe="";for(ce=65;ce<76;ce++){switch(dt=String.fromCharCode(ce),ce){case 66:case 69:case 70:case 72:ze=3;break;case 68:case 71:ze=4;break;default:ze=2}for(Ye=0;Ye<47;Ye++)ee.push({k:dt+Ye,v:ze})}for(ee.sort(function(je,Ie){return Ie.v-je.v}),Ye=0;Ye<ee.length;Ye++)dt=ee[Ye].k.charAt(0),Oe.charAt(Oe.length-1)!==dt&&(Oe+=dt);return"DGBEFHACIJK"!==Oe}});r({target:"Array",proto:!0,forced:$||!se||!ve||!oe},{sort:function(ce){void 0!==ce&&p(ce);var dt=f(this);if(oe)return void 0===ce?ue(dt):ue(dt,ce);var je,Ie,ze=[],Ye=e(dt);for(Ie=0;Ie<Ye;Ie++)Ie in dt&&ae(ze,dt[Ie]);for(M(ze,function(Oe){return function(ce,dt){return void 0===dt?-1:void 0===ce?1:void 0!==Oe?+Oe(ce,dt)||0:y(ce)>y(dt)?1:-1}}(ce)),je=ze.length,Ie=0;Ie<je;)dt[Ie]=ze[Ie++];for(;Ie<Ye;)_(dt,Ie++);return dt}})},63117:(v,S,i)=>{"use strict";var r=i(90513),u=i(70267),p=i(19401),f=i(33912),e=i(6381),_=i(11594),y=i(2103),T=i(46751),M=i(67236),F=i(95913)("splice"),Z=Math.max,J=Math.min;r({target:"Array",proto:!0,forced:!F},{splice:function(ee,ue){var oe,he,me,Oe,ce,dt,ae=u(this),$=e(ae),se=p(ee,$),ve=arguments.length;for(0===ve?oe=he=0:1===ve?(oe=0,he=$-se):(oe=ve-2,he=J(Z(f(ue),0),$-se)),_($+oe-he),me=y(ae,he),Oe=0;Oe<he;Oe++)(ce=se+Oe)in ae&&T(me,Oe,ae[ce]);if(me.length=he,oe<he){for(Oe=se;Oe<$-he;Oe++)dt=Oe+oe,(ce=Oe+he)in ae?ae[dt]=ae[ce]:M(ae,dt);for(Oe=$;Oe>$-he+oe;Oe--)M(ae,Oe-1)}else if(oe>he)for(Oe=$-he;Oe>se;Oe--)dt=Oe+oe-1,(ce=Oe+he-1)in ae?ae[dt]=ae[ce]:M(ae,dt);for(Oe=0;Oe<oe;Oe++)ae[Oe+se]=arguments[Oe+2];return ae.length=$-he+oe,me}})},34699:(v,S,i)=>{var r=i(90513),u=i(23634),p=Date,f=u(p.prototype.getTime);r({target:"Date",stat:!0},{now:function(){return f(new p)}})},33379:(v,S,i)=>{var r=i(90513),u=i(44197);r({target:"Function",proto:!0,forced:Function.bind!==u},{bind:u})},87404:(v,S,i)=>{i(90513)({global:!0},{globalThis:i(70009)})},75071:(v,S,i)=>{var r=i(90513),u=i(7365),p=i(2543),f=i(25401),e=i(23634),_=i(55756),y=i(89735),T=i(52208),M=i(77293),R=i(74717),F=i(37591),Z=i(29333),J=u("JSON","stringify"),Q=e(/./.exec),ee=e("".charAt),ue=e("".charCodeAt),ae=e("".replace),$=e(1..toString),se=/[\uD800-\uDFFF]/g,ve=/^[\uD800-\uDBFF]$/,oe=/^[\uDC00-\uDFFF]$/,he=!Z||_(function(){var dt=u("Symbol")();return"[null]"!=J([dt])||"{}"!=J({a:dt})||"{}"!=J(Object(dt))}),me=_(function(){return'"\\udf06\\ud834"'!==J("\udf06\ud834")||'"\\udead"'!==J("\udead")}),Oe=function(dt,ze){var Ye=F(arguments),je=ze;if((M(ze)||void 0!==dt)&&!R(dt))return y(ze)||(ze=function(Ie,Ve){if(T(je)&&(Ve=f(je,this,Ie,Ve)),!R(Ve))return Ve}),Ye[1]=ze,p(J,null,Ye)},ce=function(dt,ze,Ye){var je=ee(Ye,ze-1),Ie=ee(Ye,ze+1);return Q(ve,dt)&&!Q(oe,Ie)||Q(oe,dt)&&!Q(ve,je)?"\\u"+$(ue(dt,0),16):dt};J&&r({target:"JSON",stat:!0,arity:3,forced:he||me},{stringify:function(ze,Ye,je){var Ie=F(arguments),Ve=p(he?Oe:J,null,Ie);return me&&"string"==typeof Ve?ae(Ve,se,ce):Ve}})},32300:(v,S,i)=>{var r=i(70009);i(85681)(r.JSON,"JSON",!0)},83616:(v,S,i)=>{"use strict";i(85116)("Map",function(p){return function(){return p(this,arguments.length?arguments[0]:void 0)}},i(26650))},85140:(v,S,i)=>{i(83616)},63603:()=>{},67234:(v,S,i)=>{var r=i(90513),u=i(75791);r({target:"Object",stat:!0,arity:2,forced:Object.assign!==u},{assign:u})},86516:(v,S,i)=>{i(90513)({target:"Object",stat:!0,sham:!i(49642)},{create:i(83272)})},36255:(v,S,i)=>{var r=i(90513),u=i(49642),p=i(25913).f;r({target:"Object",stat:!0,forced:Object.defineProperties!==p,sham:!u},{defineProperties:p})},84468:(v,S,i)=>{var r=i(90513),u=i(49642),p=i(48011).f;r({target:"Object",stat:!0,forced:Object.defineProperty!==p,sham:!u},{defineProperty:p})},54989:(v,S,i)=>{var r=i(90513),u=i(36805).entries;r({target:"Object",stat:!0},{entries:function(f){return u(f)}})},86627:(v,S,i)=>{var r=i(90513),u=i(55756),p=i(81010),f=i(25525).f,e=i(49642),_=u(function(){f(1)});r({target:"Object",stat:!0,forced:!e||_,sham:!e},{getOwnPropertyDescriptor:function(M,R){return f(p(M),R)}})},78275:(v,S,i)=>{var r=i(90513),u=i(49642),p=i(59823),f=i(81010),e=i(25525),_=i(46751);r({target:"Object",stat:!0,sham:!u},{getOwnPropertyDescriptors:function(T){for(var Q,ee,M=f(T),R=e.f,F=p(M),Z={},J=0;F.length>J;)void 0!==(ee=R(M,Q=F[J++]))&&_(Z,Q,ee);return Z}})},37764:(v,S,i)=>{var r=i(90513),u=i(29333),p=i(55756),f=i(47238),e=i(70267);r({target:"Object",stat:!0,forced:!u||p(function(){f.f(1)})},{getOwnPropertySymbols:function(T){var M=f.f;return M?M(e(T)):[]}})},31193:(v,S,i)=>{var r=i(90513),u=i(55756),p=i(70267),f=i(31426),e=i(37112);r({target:"Object",stat:!0,forced:u(function(){f(1)}),sham:!e},{getPrototypeOf:function(T){return f(p(T))}})},56557:(v,S,i)=>{var r=i(90513),u=i(70267),p=i(28474);r({target:"Object",stat:!0,forced:i(55756)(function(){p(1)})},{keys:function(y){return p(u(y))}})},17971:(v,S,i)=>{i(90513)({target:"Object",stat:!0},{setPrototypeOf:i(54945)})},17221:()=>{},88923:(v,S,i)=>{var r=i(90513),u=i(36805).values;r({target:"Object",stat:!0},{values:function(f){return u(f)}})},84798:(v,S,i)=>{"use strict";var r=i(90513),u=i(25401),p=i(61812),f=i(54256),e=i(26975),_=i(41605);r({target:"Promise",stat:!0},{allSettled:function(T){var M=this,R=f.f(M),F=R.resolve,Z=R.reject,J=e(function(){var Q=p(M.resolve),ee=[],ue=0,ae=1;_(T,function($){var se=ue++,ve=!1;ae++,u(Q,M,$).then(function(oe){ve||(ve=!0,ee[se]={status:"fulfilled",value:oe},--ae||F(ee))},function(oe){ve||(ve=!0,ee[se]={status:"rejected",reason:oe},--ae||F(ee))})}),--ae||F(ee)});return J.error&&Z(J.value),R.promise}})},58085:(v,S,i)=>{"use strict";var r=i(90513),u=i(25401),p=i(61812),f=i(54256),e=i(26975),_=i(41605);r({target:"Promise",stat:!0,forced:i(95758)},{all:function(M){var R=this,F=f.f(R),Z=F.resolve,J=F.reject,Q=e(function(){var ee=p(R.resolve),ue=[],ae=0,$=1;_(M,function(se){var ve=ae++,oe=!1;$++,u(ee,R,se).then(function(he){oe||(oe=!0,ue[ve]=he,--$||Z(ue))},J)}),--$||Z(ue)});return Q.error&&J(Q.value),F.promise}})},98857:(v,S,i)=>{"use strict";var r=i(90513),u=i(25401),p=i(61812),f=i(7365),e=i(54256),_=i(26975),y=i(41605),T="No one promise resolved";r({target:"Promise",stat:!0},{any:function(R){var F=this,Z=f("AggregateError"),J=e.f(F),Q=J.resolve,ee=J.reject,ue=_(function(){var ae=p(F.resolve),$=[],se=0,ve=1,oe=!1;y(R,function(he){var me=se++,Oe=!1;ve++,u(ae,F,he).then(function(ce){Oe||oe||(oe=!0,Q(ce))},function(ce){Oe||oe||(Oe=!0,$[me]=ce,--ve||ee(new Z($,T)))})}),--ve||ee(new Z($,T))});return ue.error&&ee(ue.value),J.promise}})},5846:(v,S,i)=>{"use strict";var r=i(90513),u=i(81124),p=i(9936).CONSTRUCTOR,f=i(46456),e=i(7365),_=i(52208),y=i(42915),T=f&&f.prototype;if(r({target:"Promise",proto:!0,forced:p,real:!0},{catch:function(R){return this.then(void 0,R)}}),!u&&_(f)){var M=e("Promise").prototype.catch;T.catch!==M&&y(T,"catch",M,{unsafe:!0})}},38206:(v,S,i)=>{"use strict";var ci,Ir,Qr,r=i(90513),u=i(81124),p=i(3787),f=i(70009),e=i(25401),_=i(42915),y=i(54945),T=i(85681),M=i(58014),R=i(61812),F=i(52208),Z=i(77293),J=i(54849),Q=i(95869),ee=i(37352).set,ue=i(58991),ae=i(52912),$=i(26975),se=i(70918),ve=i(91093),oe=i(46456),he=i(9936),me=i(54256),Oe="Promise",ce=he.CONSTRUCTOR,dt=he.REJECTION_EVENT,ze=he.SUBCLASSING,Ye=ve.getterFor(Oe),je=ve.set,Ie=oe&&oe.prototype,Ve=oe,He=Ie,Zt=f.TypeError,st=f.document,en=f.process,$t=me.f,Gt=$t,Ut=!!(st&&st.createEvent&&f.dispatchEvent),Bt="unhandledrejection",Kr=function(Wt){var Jn;return!(!Z(Wt)||!F(Jn=Wt.then))&&Jn},In=function(Wt,Jn){var Tr,Nr,gn,ir=Jn.value,Lr=1==Jn.state,Vn=Lr?Wt.ok:Wt.fail,zr=Wt.resolve,hi=Wt.reject,Ai=Wt.domain;try{Vn?(Lr||(2===Jn.rejection&&$i(Jn),Jn.rejection=1),!0===Vn?Tr=ir:(Ai&&Ai.enter(),Tr=Vn(ir),Ai&&(Ai.exit(),gn=!0)),Tr===Wt.promise?hi(Zt("Promise-chain cycle")):(Nr=Kr(Tr))?e(Nr,Tr,zr,hi):zr(Tr)):hi(ir)}catch(En){Ai&&!gn&&Ai.exit(),hi(En)}},Hn=function(Wt,Jn){Wt.notified||(Wt.notified=!0,ue(function(){for(var Lr,ir=Wt.reactions;Lr=ir.get();)In(Lr,Wt);Wt.notified=!1,Jn&&!Wt.rejection&&Ur(Wt)}))},Zr=function(Wt,Jn,ir){var Lr,Vn;Ut?((Lr=st.createEvent("Event")).promise=Jn,Lr.reason=ir,Lr.initEvent(Wt,!1,!0),f.dispatchEvent(Lr)):Lr={promise:Jn,reason:ir},!dt&&(Vn=f["on"+Wt])?Vn(Lr):Wt===Bt&&ae("Unhandled promise rejection",ir)},Ur=function(Wt){e(ee,f,function(){var Vn,Jn=Wt.facade,ir=Wt.value;if(di(Wt)&&(Vn=$(function(){p?en.emit("unhandledRejection",ir,Jn):Zr(Bt,Jn,ir)}),Wt.rejection=p||di(Wt)?2:1,Vn.error))throw Vn.value})},di=function(Wt){return 1!==Wt.rejection&&!Wt.parent},$i=function(Wt){e(ee,f,function(){var Jn=Wt.facade;p?en.emit("rejectionHandled",Jn):Zr("rejectionhandled",Jn,Wt.value)})},Hi=function(Wt,Jn,ir){return function(Lr){Wt(Jn,Lr,ir)}},Br=function(Wt,Jn,ir){Wt.done||(Wt.done=!0,ir&&(Wt=ir),Wt.value=Jn,Wt.state=2,Hn(Wt,!0))},On=function(Wt,Jn,ir){if(!Wt.done){Wt.done=!0,ir&&(Wt=ir);try{if(Wt.facade===Jn)throw Zt("Promise can't be resolved itself");var Lr=Kr(Jn);Lr?ue(function(){var Vn={done:!1};try{e(Lr,Jn,Hi(On,Vn,Wt),Hi(Br,Vn,Wt))}catch(zr){Br(Vn,zr,Wt)}}):(Wt.value=Jn,Wt.state=1,Hn(Wt,!1))}catch(Vn){Br({done:!1},Vn,Wt)}}};if(ce&&(Ve=function(Jn){J(this,He),R(Jn),e(ci,this);var ir=Ye(this);try{Jn(Hi(On,ir),Hi(Br,ir))}catch(Lr){Br(ir,Lr)}},(ci=function(Jn){je(this,{type:Oe,done:!1,notified:!1,parent:!1,reactions:new se,rejection:!1,state:0,value:void 0})}).prototype=_(He=Ve.prototype,"then",function(Jn,ir){var Lr=Ye(this),Vn=$t(Q(this,Ve));return Lr.parent=!0,Vn.ok=!F(Jn)||Jn,Vn.fail=F(ir)&&ir,Vn.domain=p?en.domain:void 0,0==Lr.state?Lr.reactions.add(Vn):ue(function(){In(Vn,Lr)}),Vn.promise}),Ir=function(){var Wt=new ci,Jn=Ye(Wt);this.promise=Wt,this.resolve=Hi(On,Jn),this.reject=Hi(Br,Jn)},me.f=$t=function(Wt){return Wt===Ve||void 0===Wt?new Ir(Wt):Gt(Wt)},!u&&F(oe)&&Ie!==Object.prototype)){Qr=Ie.then,ze||_(Ie,"then",function(Jn,ir){var Lr=this;return new Ve(function(Vn,zr){e(Qr,Lr,Vn,zr)}).then(Jn,ir)},{unsafe:!0});try{delete Ie.constructor}catch(Wt){}y&&y(Ie,He)}r({global:!0,constructor:!0,wrap:!0,forced:ce},{Promise:Ve}),T(Ve,Oe,!1,!0),M(Oe)},30185:(v,S,i)=>{"use strict";var r=i(90513),u=i(81124),p=i(46456),f=i(55756),e=i(7365),_=i(52208),y=i(95869),T=i(25524),M=i(42915),R=p&&p.prototype;if(r({target:"Promise",proto:!0,real:!0,forced:!!p&&f(function(){R.finally.call({then:function(){}},function(){})})},{finally:function(J){var Q=y(this,e("Promise")),ee=_(J);return this.then(ee?function(ue){return T(Q,J()).then(function(){return ue})}:J,ee?function(ue){return T(Q,J()).then(function(){throw ue})}:J)}}),!u&&_(p)){var Z=e("Promise").prototype.finally;R.finally!==Z&&M(R,"finally",Z,{unsafe:!0})}},66793:(v,S,i)=>{i(38206),i(58085),i(5846),i(44738),i(74767),i(4991)},44738:(v,S,i)=>{"use strict";var r=i(90513),u=i(25401),p=i(61812),f=i(54256),e=i(26975),_=i(41605);r({target:"Promise",stat:!0,forced:i(95758)},{race:function(M){var R=this,F=f.f(R),Z=F.reject,J=e(function(){var Q=p(R.resolve);_(M,function(ee){u(Q,R,ee).then(F.resolve,Z)})});return J.error&&Z(J.value),F.promise}})},74767:(v,S,i)=>{"use strict";var r=i(90513),u=i(25401),p=i(54256);r({target:"Promise",stat:!0,forced:i(9936).CONSTRUCTOR},{reject:function(_){var y=p.f(this);return u(y.reject,void 0,_),y.promise}})},4991:(v,S,i)=>{"use strict";var r=i(90513),u=i(7365),p=i(81124),f=i(46456),e=i(9936).CONSTRUCTOR,_=i(25524),y=u("Promise"),T=p&&!e;r({target:"Promise",stat:!0,forced:p||e},{resolve:function(R){return _(T&&this===y?f:this,R)}})},19539:(v,S,i)=>{var r=i(90513),u=i(7365),p=i(2543),f=i(44197),e=i(54356),_=i(64562),y=i(77293),T=i(83272),M=i(55756),R=u("Reflect","construct"),F=Object.prototype,Z=[].push,J=M(function(){function ue(){}return!(R(function(){},[],ue)instanceof ue)}),Q=!M(function(){R(function(){})}),ee=J||Q;r({target:"Reflect",stat:!0,forced:ee,sham:ee},{construct:function(ae,$){e(ae),_($);var se=arguments.length<3?ae:e(arguments[2]);if(Q&&!J)return R(ae,$,se);if(ae==se){switch($.length){case 0:return new ae;case 1:return new ae($[0]);case 2:return new ae($[0],$[1]);case 3:return new ae($[0],$[1],$[2]);case 4:return new ae($[0],$[1],$[2],$[3])}var ve=[null];return p(Z,ve,$),new(p(f,ae,ve))}var oe=se.prototype,he=T(y(oe)?oe:F),me=p(ae,he,$);return y(me)?me:he}})},60851:(v,S,i)=>{var r=i(90513),u=i(25401),p=i(77293),f=i(64562),e=i(27029),_=i(25525),y=i(31426);r({target:"Reflect",stat:!0},{get:function T(M,R){var Z,J,F=arguments.length<3?M:arguments[2];return f(M)===F?M[R]:(Z=_.f(M,R))?e(Z)?Z.value:void 0===Z.get?void 0:u(Z.get,F):p(J=y(M))?T(J,R,F):void 0}})},44864:()=>{},97764:(v,S,i)=>{"use strict";var r=i(90513),u=i(23634),p=i(56421),f=i(67917),e=i(41433),_=i(79668),y=u("".indexOf);r({target:"String",proto:!0,forced:!_("includes")},{includes:function(M){return!!~y(e(f(this)),e(p(M)),arguments.length>1?arguments[1]:void 0)}})},3934:(v,S,i)=>{"use strict";var r=i(61557).charAt,u=i(41433),p=i(91093),f=i(32837),e="String Iterator",_=p.set,y=p.getterFor(e);f(String,"String",function(T){_(this,{type:e,string:u(T),index:0})},function(){var Z,M=y(this),R=M.string,F=M.index;return F>=R.length?{value:void 0,done:!0}:(Z=r(R,F),M.index+=Z.length,{value:Z,done:!1})})},3588:(v,S,i)=>{i(90513)({target:"String",proto:!0},{repeat:i(53411)})},24655:(v,S,i)=>{"use strict";var ee,r=i(90513),u=i(23634),p=i(25525).f,f=i(48869),e=i(41433),_=i(56421),y=i(67917),T=i(79668),M=i(81124),R=u("".startsWith),F=u("".slice),Z=Math.min,J=T("startsWith");r({target:"String",proto:!0,forced:!(!M&&!J&&(ee=p(String.prototype,"startsWith"),ee&&!ee.writable)||J)},{startsWith:function(ue){var ae=e(y(this));_(ue);var $=f(Z(arguments.length>1?arguments[1]:void 0,ae.length)),se=e(ue);return R?R(ae,se,$):F(ae,$,$+se.length)===se}})},90451:(v,S,i)=>{"use strict";var r=i(90513),u=i(89858).trim;r({target:"String",proto:!0,forced:i(85462)("trim")},{trim:function(){return u(this)}})},16426:(v,S,i)=>{i(16925)("asyncIterator")},17858:(v,S,i)=>{"use strict";var r=i(90513),u=i(70009),p=i(25401),f=i(23634),e=i(81124),_=i(49642),y=i(29333),T=i(55756),M=i(80112),R=i(23336),F=i(64562),Z=i(81010),J=i(62939),Q=i(41433),ee=i(51361),ue=i(83272),ae=i(28474),$=i(51518),se=i(62469),ve=i(47238),oe=i(25525),he=i(48011),me=i(25913),Oe=i(25558),ce=i(42915),dt=i(64579),ze=i(86066),Ye=i(45599),je=i(13708),Ie=i(91840),Ve=i(89734),He=i(16925),Zt=i(56992),st=i(85681),en=i(91093),$t=i(68607).forEach,Gt=ze("hidden"),Ut="Symbol",Bt="prototype",mt=en.set,Yt=en.getterFor(Ut),Dt=Object[Bt],zt=u.Symbol,Yn=zt&&zt[Bt],Hr=u.TypeError,ci=u.QObject,Ir=oe.f,wr=he.f,Qr=se.f,Kr=Oe.f,In=f([].push),Hn=dt("symbols"),Zr=dt("op-symbols"),Ur=dt("wks"),di=!ci||!ci[Bt]||!ci[Bt].findChild,$i=_&&T(function(){return 7!=ue(wr({},"a",{get:function(){return wr(this,"a",{value:7}).a}})).a})?function(zr,hi,Ai){var Tr=Ir(Dt,hi);Tr&&delete Dt[hi],wr(zr,hi,Ai),Tr&&zr!==Dt&&wr(Dt,hi,Tr)}:wr,Hi=function(zr,hi){var Ai=Hn[zr]=ue(Yn);return mt(Ai,{type:Ut,tag:zr,description:hi}),_||(Ai.description=hi),Ai},Br=function(hi,Ai,Tr){hi===Dt&&Br(Zr,Ai,Tr),F(hi);var Nr=J(Ai);return F(Tr),M(Hn,Nr)?(Tr.enumerable?(M(hi,Gt)&&hi[Gt][Nr]&&(hi[Gt][Nr]=!1),Tr=ue(Tr,{enumerable:ee(0,!1)})):(M(hi,Gt)||wr(hi,Gt,ee(1,{})),hi[Gt][Nr]=!0),$i(hi,Nr,Tr)):wr(hi,Nr,Tr)},On=function(hi,Ai){F(hi);var Tr=Z(Ai),Nr=ae(Tr).concat(Vn(Tr));return $t(Nr,function(gn){(!_||p(Jn,Tr,gn))&&Br(hi,gn,Tr[gn])}),hi},Jn=function(hi){var Ai=J(hi),Tr=p(Kr,this,Ai);return!(this===Dt&&M(Hn,Ai)&&!M(Zr,Ai))&&(!(Tr||!M(this,Ai)||!M(Hn,Ai)||M(this,Gt)&&this[Gt][Ai])||Tr)},ir=function(hi,Ai){var Tr=Z(hi),Nr=J(Ai);if(Tr!==Dt||!M(Hn,Nr)||M(Zr,Nr)){var gn=Ir(Tr,Nr);return gn&&M(Hn,Nr)&&!(M(Tr,Gt)&&Tr[Gt][Nr])&&(gn.enumerable=!0),gn}},Lr=function(hi){var Ai=Qr(Z(hi)),Tr=[];return $t(Ai,function(Nr){!M(Hn,Nr)&&!M(Ye,Nr)&&In(Tr,Nr)}),Tr},Vn=function(zr){var hi=zr===Dt,Ai=Qr(hi?Zr:Z(zr)),Tr=[];return $t(Ai,function(Nr){M(Hn,Nr)&&(!hi||M(Dt,Nr))&&In(Tr,Hn[Nr])}),Tr};y||(ce(Yn=(zt=function(){if(R(Yn,this))throw Hr("Symbol is not a constructor");var hi=arguments.length&&void 0!==arguments[0]?Q(arguments[0]):void 0,Ai=je(hi),Tr=function(Nr){this===Dt&&p(Tr,Zr,Nr),M(this,Gt)&&M(this[Gt],Ai)&&(this[Gt][Ai]=!1),$i(this,Ai,ee(1,Nr))};return _&&di&&$i(Dt,Ai,{configurable:!0,set:Tr}),Hi(Ai,hi)})[Bt],"toString",function(){return Yt(this).tag}),ce(zt,"withoutSetter",function(zr){return Hi(je(zr),zr)}),Oe.f=Jn,he.f=Br,me.f=On,oe.f=ir,$.f=se.f=Lr,ve.f=Vn,Ve.f=function(zr){return Hi(Ie(zr),zr)},_&&(wr(Yn,"description",{configurable:!0,get:function(){return Yt(this).description}}),e||ce(Dt,"propertyIsEnumerable",Jn,{unsafe:!0}))),r({global:!0,constructor:!0,wrap:!0,forced:!y,sham:!y},{Symbol:zt}),$t(ae(Ur),function(zr){He(zr)}),r({target:Ut,stat:!0,forced:!y},{useSetter:function(){di=!0},useSimple:function(){di=!1}}),r({target:"Object",stat:!0,forced:!y,sham:!_},{create:function(hi,Ai){return void 0===Ai?ue(hi):On(ue(hi),Ai)},defineProperty:Br,defineProperties:On,getOwnPropertyDescriptor:ir}),r({target:"Object",stat:!0,forced:!y},{getOwnPropertyNames:Lr}),Zt(),st(zt,Ut),Ye[Gt]=!0},1172:()=>{},12353:(v,S,i)=>{var r=i(90513),u=i(7365),p=i(80112),f=i(41433),e=i(64579),_=i(53900),y=e("string-to-symbol-registry"),T=e("symbol-to-string-registry");r({target:"Symbol",stat:!0,forced:!_},{for:function(M){var R=f(M);if(p(y,R))return y[R];var F=u("Symbol")(R);return y[R]=F,T[F]=R,F}})},99579:(v,S,i)=>{i(16925)("hasInstance")},41258:(v,S,i)=>{i(16925)("isConcatSpreadable")},2383:(v,S,i)=>{i(16925)("iterator")},56728:(v,S,i)=>{i(17858),i(12353),i(27632),i(75071),i(37764)},27632:(v,S,i)=>{var r=i(90513),u=i(80112),p=i(74717),f=i(7378),e=i(64579),_=i(53900),y=e("symbol-to-string-registry");r({target:"Symbol",stat:!0,forced:!_},{keyFor:function(M){if(!p(M))throw TypeError(f(M)+" is not a symbol");if(u(y,M))return y[M]}})},64776:(v,S,i)=>{i(16925)("matchAll")},44339:(v,S,i)=>{i(16925)("match")},88215:(v,S,i)=>{i(16925)("replace")},65389:(v,S,i)=>{i(16925)("search")},12733:(v,S,i)=>{i(16925)("species")},97977:(v,S,i)=>{i(16925)("split")},59792:(v,S,i)=>{var r=i(16925),u=i(56992);r("toPrimitive"),u()},60242:(v,S,i)=>{var r=i(7365),u=i(16925),p=i(85681);u("toStringTag"),p(r("Symbol"),"Symbol")},26291:(v,S,i)=>{i(16925)("unscopables")},3119:(v,S,i)=>{"use strict";var Z,r=i(70009),u=i(23634),p=i(84604),f=i(57867),e=i(85116),_=i(84049),y=i(77293),T=i(46401),M=i(91093).enforce,R=i(13179),F=!r.ActiveXObject&&"ActiveXObject"in r,J=function(ve){return function(){return ve(this,arguments.length?arguments[0]:void 0)}},Q=e("WeakMap",J,_);if(R&&F){Z=_.getConstructor(J,"WeakMap",!0),f.enable();var ee=Q.prototype,ue=u(ee.delete),ae=u(ee.has),$=u(ee.get),se=u(ee.set);p(ee,{delete:function(ve){if(y(ve)&&!T(ve)){var oe=M(this);return oe.frozen||(oe.frozen=new Z),ue(this,ve)||oe.frozen.delete(ve)}return ue(this,ve)},has:function(oe){if(y(oe)&&!T(oe)){var he=M(this);return he.frozen||(he.frozen=new Z),ae(this,oe)||he.frozen.has(oe)}return ae(this,oe)},get:function(oe){if(y(oe)&&!T(oe)){var he=M(this);return he.frozen||(he.frozen=new Z),ae(this,oe)?$(this,oe):he.frozen.get(oe)}return $(this,oe)},set:function(oe,he){if(y(oe)&&!T(oe)){var me=M(this);me.frozen||(me.frozen=new Z),ae(this,oe)?se(this,oe,he):me.frozen.set(oe,he)}else se(this,oe,he);return this}})}},90770:(v,S,i)=>{i(3119)},67670:(v,S,i)=>{i(10901)},65237:(v,S,i)=>{i(87404)},10509:(v,S,i)=>{"use strict";i(90513)({target:"Map",proto:!0,real:!0,forced:!0},{deleteAll:i(37353)})},30887:(v,S,i)=>{"use strict";i(90513)({target:"Map",proto:!0,real:!0,forced:!0},{emplace:i(12864)})},54547:(v,S,i)=>{"use strict";var r=i(90513),u=i(64562),p=i(76781),f=i(37444),e=i(41605);r({target:"Map",proto:!0,real:!0,forced:!0},{every:function(y){var T=u(this),M=f(T),R=p(y,arguments.length>1?arguments[1]:void 0);return!e(M,function(F,Z,J){if(!R(Z,F,T))return J()},{AS_ENTRIES:!0,IS_ITERATOR:!0,INTERRUPTED:!0}).stopped}})},68996:(v,S,i)=>{"use strict";var r=i(90513),u=i(7365),p=i(76781),f=i(25401),e=i(61812),_=i(64562),y=i(95869),T=i(37444),M=i(41605);r({target:"Map",proto:!0,real:!0,forced:!0},{filter:function(F){var Z=_(this),J=T(Z),Q=p(F,arguments.length>1?arguments[1]:void 0),ee=new(y(Z,u("Map"))),ue=e(ee.set);return M(J,function(ae,$){Q($,ae,Z)&&f(ue,ee,ae,$)},{AS_ENTRIES:!0,IS_ITERATOR:!0}),ee}})},60176:(v,S,i)=>{"use strict";var r=i(90513),u=i(64562),p=i(76781),f=i(37444),e=i(41605);r({target:"Map",proto:!0,real:!0,forced:!0},{findKey:function(y){var T=u(this),M=f(T),R=p(y,arguments.length>1?arguments[1]:void 0);return e(M,function(F,Z,J){if(R(Z,F,T))return J(F)},{AS_ENTRIES:!0,IS_ITERATOR:!0,INTERRUPTED:!0}).result}})},1530:(v,S,i)=>{"use strict";var r=i(90513),u=i(64562),p=i(76781),f=i(37444),e=i(41605);r({target:"Map",proto:!0,real:!0,forced:!0},{find:function(y){var T=u(this),M=f(T),R=p(y,arguments.length>1?arguments[1]:void 0);return e(M,function(F,Z,J){if(R(Z,F,T))return J(Z)},{AS_ENTRIES:!0,IS_ITERATOR:!0,INTERRUPTED:!0}).result}})},78271:(v,S,i)=>{i(90513)({target:"Map",stat:!0,forced:!0},{from:i(83483)})},41554:(v,S,i)=>{"use strict";var r=i(90513),u=i(25401),p=i(23634),f=i(61812),e=i(88055),_=i(41605),y=p([].push);r({target:"Map",stat:!0,forced:!0},{groupBy:function(M,R){f(R);var F=e(M),Z=new this,J=f(Z.has),Q=f(Z.get),ee=f(Z.set);return _(F,function(ue){var ae=R(ue);u(J,Z,ae)?y(u(Q,Z,ae),ue):u(ee,Z,ae,[ue])},{IS_ITERATOR:!0}),Z}})},41688:(v,S,i)=>{"use strict";var r=i(90513),u=i(64562),p=i(37444),f=i(29627),e=i(41605);r({target:"Map",proto:!0,real:!0,forced:!0},{includes:function(y){return e(p(u(this)),function(T,M,R){if(f(M,y))return R()},{AS_ENTRIES:!0,IS_ITERATOR:!0,INTERRUPTED:!0}).stopped}})},92847:(v,S,i)=>{"use strict";var r=i(90513),u=i(25401),p=i(41605),f=i(61812);r({target:"Map",stat:!0,forced:!0},{keyBy:function(_,y){var T=new this;f(y);var M=f(T.set);return p(_,function(R){u(M,T,y(R),R)}),T}})},17316:(v,S,i)=>{"use strict";var r=i(90513),u=i(64562),p=i(37444),f=i(41605);r({target:"Map",proto:!0,real:!0,forced:!0},{keyOf:function(_){return f(p(u(this)),function(y,T,M){if(T===_)return M(y)},{AS_ENTRIES:!0,IS_ITERATOR:!0,INTERRUPTED:!0}).result}})},58786:(v,S,i)=>{"use strict";var r=i(90513),u=i(7365),p=i(76781),f=i(25401),e=i(61812),_=i(64562),y=i(95869),T=i(37444),M=i(41605);r({target:"Map",proto:!0,real:!0,forced:!0},{mapKeys:function(F){var Z=_(this),J=T(Z),Q=p(F,arguments.length>1?arguments[1]:void 0),ee=new(y(Z,u("Map"))),ue=e(ee.set);return M(J,function(ae,$){f(ue,ee,Q($,ae,Z),$)},{AS_ENTRIES:!0,IS_ITERATOR:!0}),ee}})},35517:(v,S,i)=>{"use strict";var r=i(90513),u=i(7365),p=i(76781),f=i(25401),e=i(61812),_=i(64562),y=i(95869),T=i(37444),M=i(41605);r({target:"Map",proto:!0,real:!0,forced:!0},{mapValues:function(F){var Z=_(this),J=T(Z),Q=p(F,arguments.length>1?arguments[1]:void 0),ee=new(y(Z,u("Map"))),ue=e(ee.set);return M(J,function(ae,$){f(ue,ee,ae,Q($,ae,Z))},{AS_ENTRIES:!0,IS_ITERATOR:!0}),ee}})},12783:(v,S,i)=>{"use strict";var r=i(90513),u=i(61812),p=i(64562),f=i(41605);r({target:"Map",proto:!0,real:!0,arity:1,forced:!0},{merge:function(_){for(var y=p(this),T=u(y.set),M=arguments.length,R=0;R<M;)f(arguments[R++],T,{that:y,AS_ENTRIES:!0});return y}})},60854:(v,S,i)=>{i(90513)({target:"Map",stat:!0,forced:!0},{of:i(13067)})},69773:(v,S,i)=>{"use strict";var r=i(90513),u=i(64562),p=i(61812),f=i(37444),e=i(41605),_=TypeError;r({target:"Map",proto:!0,real:!0,forced:!0},{reduce:function(T){var M=u(this),R=f(M),F=arguments.length<2,Z=F?void 0:arguments[1];if(p(T),e(R,function(J,Q){F?(F=!1,Z=Q):Z=T(Z,Q,J,M)},{AS_ENTRIES:!0,IS_ITERATOR:!0}),F)throw _("Reduce of empty map with no initial value");return Z}})},22337:(v,S,i)=>{"use strict";var r=i(90513),u=i(64562),p=i(76781),f=i(37444),e=i(41605);r({target:"Map",proto:!0,real:!0,forced:!0},{some:function(y){var T=u(this),M=f(T),R=p(y,arguments.length>1?arguments[1]:void 0);return e(M,function(F,Z,J){if(R(Z,F,T))return J()},{AS_ENTRIES:!0,IS_ITERATOR:!0,INTERRUPTED:!0}).stopped}})},84131:(v,S,i)=>{"use strict";i(90513)({target:"Map",proto:!0,real:!0,name:"upsert",forced:!0},{updateOrInsert:i(57729)})},40199:(v,S,i)=>{"use strict";var r=i(90513),u=i(25401),p=i(64562),f=i(61812),e=TypeError;r({target:"Map",proto:!0,real:!0,forced:!0},{update:function(y,T){var M=p(this),R=f(M.get),F=f(M.has),Z=f(M.set),J=arguments.length;f(T);var Q=u(F,M,y);if(!Q&&J<3)throw e("Updating absent value");var ee=Q?u(R,M,y):f(J>2?arguments[2]:void 0)(y,M);return u(Z,M,y,T(ee,y,M)),M}})},69046:(v,S,i)=>{"use strict";i(90513)({target:"Map",proto:!0,real:!0,forced:!0},{upsert:i(57729)})},61127:(v,S,i)=>{i(84798)},45975:(v,S,i)=>{i(98857)},93114:(v,S,i)=>{"use strict";var r=i(90513),u=i(54256),p=i(26975);r({target:"Promise",stat:!0,forced:!0},{try:function(f){var e=u.f(this),_=p(f);return(_.error?e.reject:e.resolve)(_.value),e.promise}})},55461:(v,S,i)=>{i(16925)("asyncDispose")},5737:(v,S,i)=>{i(16925)("dispose")},87097:(v,S,i)=>{i(16925)("matcher")},29559:(v,S,i)=>{i(16925)("metadataKey")},71985:(v,S,i)=>{i(16925)("metadata")},90212:(v,S,i)=>{i(16925)("observable")},93770:(v,S,i)=>{i(16925)("patternMatch")},47743:(v,S,i)=>{i(16925)("replaceAll")},33089:(v,S,i)=>{i(1285);var r=i(44125),u=i(70009),p=i(35329),f=i(65162),e=i(84394),y=i(91840)("toStringTag");for(var T in r){var M=u[T],R=M&&M.prototype;R&&p(R)!==y&&f(R,y,T),e[T]=e.Array}},94784:(v,S,i)=>{var r=i(90513),u=i(70009),p=i(53814).setInterval;r({global:!0,bind:!0,forced:u.setInterval!==p},{setInterval:p})},36445:(v,S,i)=>{var r=i(90513),u=i(70009),p=i(53814).setTimeout;r({global:!0,bind:!0,forced:u.setTimeout!==p},{setTimeout:p})},69280:(v,S,i)=>{i(94784),i(36445)},73842:(v,S,i)=>{"use strict";i(1285);var r=i(90513),u=i(70009),p=i(25401),f=i(23634),e=i(49642),_=i(29407),y=i(42915),T=i(84604),M=i(85681),R=i(65297),F=i(91093),Z=i(54849),J=i(52208),Q=i(80112),ee=i(76781),ue=i(35329),ae=i(64562),$=i(77293),se=i(41433),ve=i(83272),oe=i(51361),he=i(88055),me=i(34014),Oe=i(15086),ce=i(91840),dt=i(84865),ze=ce("iterator"),Ye="URLSearchParams",je=Ye+"Iterator",Ie=F.set,Ve=F.getterFor(Ye),He=F.getterFor(je),Zt=Object.getOwnPropertyDescriptor,st=function(Nr){if(!e)return u[Nr];var gn=Zt(u,Nr);return gn&&gn.value},en=st("fetch"),$t=st("Request"),Gt=st("Headers"),Ut=$t&&$t.prototype,Bt=Gt&&Gt.prototype,mt=u.RegExp,Yt=u.TypeError,Dt=u.decodeURIComponent,zt=u.encodeURIComponent,Yn=f("".charAt),Hr=f([].join),ci=f([].push),Ir=f("".replace),wr=f([].shift),Qr=f([].splice),Kr=f("".split),In=f("".slice),Hn=/\+/g,Zr=Array(4),Ur=function(Nr){return Zr[Nr-1]||(Zr[Nr-1]=mt("((?:%[\\da-f]{2}){"+Nr+"})","gi"))},di=function(Nr){try{return Dt(Nr)}catch(gn){return Nr}},$i=function(Nr){var gn=Ir(Nr,Hn," "),En=4;try{return Dt(gn)}catch(mr){for(;En;)gn=Ir(gn,Ur(En--),di);return gn}},Hi=/[!'()~]|%20/g,Br={"!":"%21","'":"%27","(":"%28",")":"%29","~":"%7E","%20":"+"},On=function(Nr){return Br[Nr]},Wt=function(Nr){return Ir(zt(Nr),Hi,On)},Jn=R(function(gn,En){Ie(this,{type:je,iterator:he(Ve(gn).entries),kind:En})},"Iterator",function(){var gn=He(this),En=gn.kind,mr=gn.iterator.next(),Xt=mr.value;return mr.done||(mr.value="keys"===En?Xt.key:"values"===En?Xt.value:[Xt.key,Xt.value]),mr},!0),ir=function(Nr){this.entries=[],this.url=null,void 0!==Nr&&($(Nr)?this.parseObject(Nr):this.parseQuery("string"==typeof Nr?"?"===Yn(Nr,0)?In(Nr,1):Nr:se(Nr)))};ir.prototype={type:Ye,bindURL:function(Nr){this.url=Nr,this.update()},parseObject:function(Nr){var En,mr,Xt,zn,vr,si,Ii,gn=me(Nr);if(gn)for(mr=(En=he(Nr,gn)).next;!(Xt=p(mr,En)).done;){if(zn=he(ae(Xt.value)),(si=p(vr=zn.next,zn)).done||(Ii=p(vr,zn)).done||!p(vr,zn).done)throw Yt("Expected sequence with length 2");ci(this.entries,{key:se(si.value),value:se(Ii.value)})}else for(var no in Nr)Q(Nr,no)&&ci(this.entries,{key:no,value:se(Nr[no])})},parseQuery:function(Nr){if(Nr)for(var mr,Xt,gn=Kr(Nr,"&"),En=0;En<gn.length;)(mr=gn[En++]).length&&(Xt=Kr(mr,"="),ci(this.entries,{key:$i(wr(Xt)),value:$i(Hr(Xt,"="))}))},serialize:function(){for(var mr,Nr=this.entries,gn=[],En=0;En<Nr.length;)mr=Nr[En++],ci(gn,Wt(mr.key)+"="+Wt(mr.value));return Hr(gn,"&")},update:function(){this.entries.length=0,this.parseQuery(this.url.query)},updateURL:function(){this.url&&this.url.update()}};var Lr=function(){Z(this,Vn);var gn=arguments.length>0?arguments[0]:void 0;Ie(this,new ir(gn))},Vn=Lr.prototype;if(T(Vn,{append:function(gn,En){Oe(arguments.length,2);var mr=Ve(this);ci(mr.entries,{key:se(gn),value:se(En)}),mr.updateURL()},delete:function(Nr){Oe(arguments.length,1);for(var gn=Ve(this),En=gn.entries,mr=se(Nr),Xt=0;Xt<En.length;)En[Xt].key===mr?Qr(En,Xt,1):Xt++;gn.updateURL()},get:function(gn){Oe(arguments.length,1);for(var En=Ve(this).entries,mr=se(gn),Xt=0;Xt<En.length;Xt++)if(En[Xt].key===mr)return En[Xt].value;return null},getAll:function(gn){Oe(arguments.length,1);for(var En=Ve(this).entries,mr=se(gn),Xt=[],zn=0;zn<En.length;zn++)En[zn].key===mr&&ci(Xt,En[zn].value);return Xt},has:function(gn){Oe(arguments.length,1);for(var En=Ve(this).entries,mr=se(gn),Xt=0;Xt<En.length;)if(En[Xt++].key===mr)return!0;return!1},set:function(gn,En){Oe(arguments.length,1);for(var no,mr=Ve(this),Xt=mr.entries,zn=!1,vr=se(gn),si=se(En),Ii=0;Ii<Xt.length;Ii++)(no=Xt[Ii]).key===vr&&(zn?Qr(Xt,Ii--,1):(zn=!0,no.value=si));zn||ci(Xt,{key:vr,value:si}),mr.updateURL()},sort:function(){var gn=Ve(this);dt(gn.entries,function(En,mr){return En.key>mr.key?1:-1}),gn.updateURL()},forEach:function(gn){for(var zn,En=Ve(this).entries,mr=ee(gn,arguments.length>1?arguments[1]:void 0),Xt=0;Xt<En.length;)mr((zn=En[Xt++]).value,zn.key,this)},keys:function(){return new Jn(this,"keys")},values:function(){return new Jn(this,"values")},entries:function(){return new Jn(this,"entries")}},{enumerable:!0}),y(Vn,ze,Vn.entries,{name:"entries"}),y(Vn,"toString",function(){return Ve(this).serialize()},{enumerable:!0}),M(Lr,Ye),r({global:!0,constructor:!0,forced:!_},{URLSearchParams:Lr}),!_&&J(Gt)){var zr=f(Bt.has),hi=f(Bt.set),Ai=function(Nr){if($(Nr)){var En,gn=Nr.body;if(ue(gn)===Ye)return En=Nr.headers?new Gt(Nr.headers):new Gt,zr(En,"content-type")||hi(En,"content-type","application/x-www-form-urlencoded;charset=UTF-8"),ve(Nr,{body:oe(0,se(gn)),headers:oe(0,En)})}return Nr};if(J(en)&&r({global:!0,enumerable:!0,dontCallGetSet:!0,forced:!0},{fetch:function(gn){return en(gn,arguments.length>1?Ai(arguments[1]):{})}}),J($t)){var Tr=function(gn){return Z(this,Ut),new $t(gn,arguments.length>1?Ai(arguments[1]):{})};Ut.constructor=Tr,Tr.prototype=Ut,r({global:!0,constructor:!0,dontCallGetSet:!0,forced:!0},{Request:Tr})}}v.exports={URLSearchParams:Lr,getState:Ve}},26953:(v,S,i)=>{i(73842)},80504:(v,S,i)=>{"use strict";i(3934);var Hi,r=i(90513),u=i(49642),p=i(29407),f=i(70009),e=i(76781),_=i(23634),y=i(42915),T=i(1707),M=i(54849),R=i(80112),F=i(75791),Z=i(51923),J=i(8681),Q=i(61557).codeAt,ee=i(26662),ue=i(41433),ae=i(85681),$=i(15086),se=i(73842),ve=i(91093),oe=ve.set,he=ve.getterFor("URL"),me=se.URLSearchParams,Oe=se.getState,ce=f.URL,dt=f.TypeError,ze=f.parseInt,Ye=Math.floor,je=Math.pow,Ie=_("".charAt),Ve=_(/./.exec),He=_([].join),Zt=_(1..toString),st=_([].pop),en=_([].push),$t=_("".replace),Gt=_([].shift),Ut=_("".split),Bt=_("".slice),mt=_("".toLowerCase),Yt=_([].unshift),zt="Invalid scheme",Yn="Invalid host",Hr="Invalid port",ci=/[a-z]/i,Ir=/[\d+-.a-z]/i,wr=/\d/,Qr=/^0x/i,Kr=/^[0-7]+$/,In=/^\d+$/,Hn=/^[\da-f]+$/i,Zr=/[\0\t\n\r #%/:<>?@[\\\]^|]/,Ur=/[\0\t\n\r #/:<>?@[\\\]^|]/,di=/^[\u0000-\u0020]+|[\u0000-\u0020]+$/g,$i=/[\t\n\r]/g,Jn=function(Zn){var cr,yr,rr,ri;if("number"==typeof Zn){for(cr=[],yr=0;yr<4;yr++)Yt(cr,Zn%256),Zn=Ye(Zn/256);return He(cr,".")}if("object"==typeof Zn){for(cr="",rr=function(Zn){for(var cr=null,yr=1,rr=null,ri=0,ho=0;ho<8;ho++)0!==Zn[ho]?(ri>yr&&(cr=rr,yr=ri),rr=null,ri=0):(null===rr&&(rr=ho),++ri);return ri>yr&&(cr=rr,yr=ri),cr}(Zn),yr=0;yr<8;yr++)ri&&0===Zn[yr]||(ri&&(ri=!1),rr===yr?(cr+=yr?":":"::",ri=!0):(cr+=Zt(Zn[yr],16),yr<7&&(cr+=":")));return"["+cr+"]"}return Zn},ir={},Lr=F({},ir,{" ":1,'"':1,"<":1,">":1,"`":1}),Vn=F({},Lr,{"#":1,"?":1,"{":1,"}":1}),zr=F({},Vn,{"/":1,":":1,";":1,"=":1,"@":1,"[":1,"\\":1,"]":1,"^":1,"|":1}),hi=function(Zn,cr){var yr=Q(Zn,0);return yr>32&&yr<127&&!R(cr,Zn)?Zn:encodeURIComponent(Zn)},Ai={ftp:21,file:null,http:80,https:443,ws:80,wss:443},Tr=function(Zn,cr){var yr;return 2==Zn.length&&Ve(ci,Ie(Zn,0))&&(":"==(yr=Ie(Zn,1))||!cr&&"|"==yr)},Nr=function(Zn){var cr;return Zn.length>1&&Tr(Bt(Zn,0,2))&&(2==Zn.length||"/"===(cr=Ie(Zn,2))||"\\"===cr||"?"===cr||"#"===cr)},gn=function(Zn){return"."===Zn||"%2e"===mt(Zn)},En=function(Zn){return".."===(Zn=mt(Zn))||"%2e."===Zn||".%2e"===Zn||"%2e%2e"===Zn},mr={},Xt={},zn={},vr={},si={},Ii={},no={},so={},Ze={},Dr={},jt={},xt={},mn={},Wn={},kn={},wn={},nr={},Gi={},po={},yo={},Mo={},Vi=function(Zn,cr,yr){var ri,ho,Ti,rr=ue(Zn);if(cr){if(ho=this.parse(rr))throw dt(ho);this.searchParams=null}else{if(void 0!==yr&&(ri=new Vi(yr,!0)),ho=this.parse(rr,null,ri))throw dt(ho);(Ti=Oe(new me)).bindURL(this),this.searchParams=Ti}};Vi.prototype={type:"URL",parse:function(Zn,cr,yr){var ar,ln,Ht,cn,rr=this,ri=cr||mr,ho=0,Ti="",Bo=!1,xo=!1,Li=!1;for(Zn=ue(Zn),cr||(rr.scheme="",rr.username="",rr.password="",rr.host=null,rr.port=null,rr.path=[],rr.query=null,rr.fragment=null,rr.cannotBeABaseURL=!1,Zn=$t(Zn,di,"")),Zn=$t(Zn,$i,""),ar=Z(Zn);ho<=ar.length;){switch(ln=ar[ho],ri){case mr:if(!ln||!Ve(ci,ln)){if(cr)return zt;ri=zn;continue}Ti+=mt(ln),ri=Xt;break;case Xt:if(ln&&(Ve(Ir,ln)||"+"==ln||"-"==ln||"."==ln))Ti+=mt(ln);else{if(":"!=ln){if(cr)return zt;Ti="",ri=zn,ho=0;continue}if(cr&&(rr.isSpecial()!=R(Ai,Ti)||"file"==Ti&&(rr.includesCredentials()||null!==rr.port)||"file"==rr.scheme&&!rr.host))return;if(rr.scheme=Ti,cr)return void(rr.isSpecial()&&Ai[rr.scheme]==rr.port&&(rr.port=null));Ti="","file"==rr.scheme?ri=Wn:rr.isSpecial()&&yr&&yr.scheme==rr.scheme?ri=vr:rr.isSpecial()?ri=so:"/"==ar[ho+1]?(ri=si,ho++):(rr.cannotBeABaseURL=!0,en(rr.path,""),ri=po)}break;case zn:if(!yr||yr.cannotBeABaseURL&&"#"!=ln)return zt;if(yr.cannotBeABaseURL&&"#"==ln){rr.scheme=yr.scheme,rr.path=J(yr.path),rr.query=yr.query,rr.fragment="",rr.cannotBeABaseURL=!0,ri=Mo;break}ri="file"==yr.scheme?Wn:Ii;continue;case vr:if("/"!=ln||"/"!=ar[ho+1]){ri=Ii;continue}ri=Ze,ho++;break;case si:if("/"==ln){ri=Dr;break}ri=Gi;continue;case Ii:if(rr.scheme=yr.scheme,ln==Hi)rr.username=yr.username,rr.password=yr.password,rr.host=yr.host,rr.port=yr.port,rr.path=J(yr.path),rr.query=yr.query;else if("/"==ln||"\\"==ln&&rr.isSpecial())ri=no;else if("?"==ln)rr.username=yr.username,rr.password=yr.password,rr.host=yr.host,rr.port=yr.port,rr.path=J(yr.path),rr.query="",ri=yo;else{if("#"!=ln){rr.username=yr.username,rr.password=yr.password,rr.host=yr.host,rr.port=yr.port,rr.path=J(yr.path),rr.path.length--,ri=Gi;continue}rr.username=yr.username,rr.password=yr.password,rr.host=yr.host,rr.port=yr.port,rr.path=J(yr.path),rr.query=yr.query,rr.fragment="",ri=Mo}break;case no:if(!rr.isSpecial()||"/"!=ln&&"\\"!=ln){if("/"!=ln){rr.username=yr.username,rr.password=yr.password,rr.host=yr.host,rr.port=yr.port,ri=Gi;continue}ri=Dr}else ri=Ze;break;case so:if(ri=Ze,"/"!=ln||"/"!=Ie(Ti,ho+1))continue;ho++;break;case Ze:if("/"!=ln&&"\\"!=ln){ri=Dr;continue}break;case Dr:if("@"==ln){Bo&&(Ti="%40"+Ti),Bo=!0,Ht=Z(Ti);for(var Ct=0;Ct<Ht.length;Ct++){var pr=Ht[Ct];if(":"!=pr||Li){var nn=hi(pr,zr);Li?rr.password+=nn:rr.username+=nn}else Li=!0}Ti=""}else if(ln==Hi||"/"==ln||"?"==ln||"#"==ln||"\\"==ln&&rr.isSpecial()){if(Bo&&""==Ti)return"Invalid authority";ho-=Z(Ti).length+1,Ti="",ri=jt}else Ti+=ln;break;case jt:case xt:if(cr&&"file"==rr.scheme){ri=wn;continue}if(":"!=ln||xo){if(ln==Hi||"/"==ln||"?"==ln||"#"==ln||"\\"==ln&&rr.isSpecial()){if(rr.isSpecial()&&""==Ti)return Yn;if(cr&&""==Ti&&(rr.includesCredentials()||null!==rr.port))return;if(cn=rr.parseHost(Ti))return cn;if(Ti="",ri=nr,cr)return;continue}"["==ln?xo=!0:"]"==ln&&(xo=!1),Ti+=ln}else{if(""==Ti)return Yn;if(cn=rr.parseHost(Ti))return cn;if(Ti="",ri=mn,cr==xt)return}break;case mn:if(!Ve(wr,ln)){if(ln==Hi||"/"==ln||"?"==ln||"#"==ln||"\\"==ln&&rr.isSpecial()||cr){if(""!=Ti){var Cn=ze(Ti,10);if(Cn>65535)return Hr;rr.port=rr.isSpecial()&&Cn===Ai[rr.scheme]?null:Cn,Ti=""}if(cr)return;ri=nr;continue}return Hr}Ti+=ln;break;case Wn:if(rr.scheme="file","/"==ln||"\\"==ln)ri=kn;else{if(!yr||"file"!=yr.scheme){ri=Gi;continue}if(ln==Hi)rr.host=yr.host,rr.path=J(yr.path),rr.query=yr.query;else if("?"==ln)rr.host=yr.host,rr.path=J(yr.path),rr.query="",ri=yo;else{if("#"!=ln){Nr(He(J(ar,ho),""))||(rr.host=yr.host,rr.path=J(yr.path),rr.shortenPath()),ri=Gi;continue}rr.host=yr.host,rr.path=J(yr.path),rr.query=yr.query,rr.fragment="",ri=Mo}}break;case kn:if("/"==ln||"\\"==ln){ri=wn;break}yr&&"file"==yr.scheme&&!Nr(He(J(ar,ho),""))&&(Tr(yr.path[0],!0)?en(rr.path,yr.path[0]):rr.host=yr.host),ri=Gi;continue;case wn:if(ln==Hi||"/"==ln||"\\"==ln||"?"==ln||"#"==ln){if(!cr&&Tr(Ti))ri=Gi;else if(""==Ti){if(rr.host="",cr)return;ri=nr}else{if(cn=rr.parseHost(Ti))return cn;if("localhost"==rr.host&&(rr.host=""),cr)return;Ti="",ri=nr}continue}Ti+=ln;break;case nr:if(rr.isSpecial()){if(ri=Gi,"/"!=ln&&"\\"!=ln)continue}else if(cr||"?"!=ln)if(cr||"#"!=ln){if(ln!=Hi&&(ri=Gi,"/"!=ln))continue}else rr.fragment="",ri=Mo;else rr.query="",ri=yo;break;case Gi:if(ln==Hi||"/"==ln||"\\"==ln&&rr.isSpecial()||!cr&&("?"==ln||"#"==ln)){if(En(Ti)?(rr.shortenPath(),"/"!=ln&&!("\\"==ln&&rr.isSpecial())&&en(rr.path,"")):gn(Ti)?"/"!=ln&&!("\\"==ln&&rr.isSpecial())&&en(rr.path,""):("file"==rr.scheme&&!rr.path.length&&Tr(Ti)&&(rr.host&&(rr.host=""),Ti=Ie(Ti,0)+":"),en(rr.path,Ti)),Ti="","file"==rr.scheme&&(ln==Hi||"?"==ln||"#"==ln))for(;rr.path.length>1&&""===rr.path[0];)Gt(rr.path);"?"==ln?(rr.query="",ri=yo):"#"==ln&&(rr.fragment="",ri=Mo)}else Ti+=hi(ln,Vn);break;case po:"?"==ln?(rr.query="",ri=yo):"#"==ln?(rr.fragment="",ri=Mo):ln!=Hi&&(rr.path[0]+=hi(ln,ir));break;case yo:cr||"#"!=ln?ln!=Hi&&("'"==ln&&rr.isSpecial()?rr.query+="%27":rr.query+="#"==ln?"%23":hi(ln,ir)):(rr.fragment="",ri=Mo);break;case Mo:ln!=Hi&&(rr.fragment+=hi(ln,Lr))}ho++}},parseHost:function(Zn){var cr,yr,rr;if("["==Ie(Zn,0)){if("]"!=Ie(Zn,Zn.length-1)||!(cr=function(Zn){var ho,Ti,Bo,xo,Li,ar,ln,cr=[0,0,0,0,0,0,0,0],yr=0,rr=null,ri=0,Ht=function(){return Ie(Zn,ri)};if(":"==Ht()){if(":"!=Ie(Zn,1))return;ri+=2,rr=++yr}for(;Ht();){if(8==yr)return;if(":"!=Ht()){for(ho=Ti=0;Ti<4&&Ve(Hn,Ht());)ho=16*ho+ze(Ht(),16),ri++,Ti++;if("."==Ht()){if(0==Ti||(ri-=Ti,yr>6))return;for(Bo=0;Ht();){if(xo=null,Bo>0){if(!("."==Ht()&&Bo<4))return;ri++}if(!Ve(wr,Ht()))return;for(;Ve(wr,Ht());){if(Li=ze(Ht(),10),null===xo)xo=Li;else{if(0==xo)return;xo=10*xo+Li}if(xo>255)return;ri++}cr[yr]=256*cr[yr]+xo,(2==++Bo||4==Bo)&&yr++}if(4!=Bo)return;break}if(":"==Ht()){if(ri++,!Ht())return}else if(Ht())return;cr[yr++]=ho}else{if(null!==rr)return;ri++,rr=++yr}}if(null!==rr)for(ar=yr-rr,yr=7;0!=yr&&ar>0;)ln=cr[yr],cr[yr--]=cr[rr+ar-1],cr[rr+--ar]=ln;else if(8!=yr)return;return cr}(Bt(Zn,1,-1))))return Yn;this.host=cr}else if(this.isSpecial()){if(Zn=ee(Zn),Ve(Zr,Zn)||null===(cr=function(Zn){var yr,rr,ri,ho,Ti,Bo,xo,cr=Ut(Zn,".");if(cr.length&&""==cr[cr.length-1]&&cr.length--,(yr=cr.length)>4)return Zn;for(rr=[],ri=0;ri<yr;ri++){if(""==(ho=cr[ri]))return Zn;if(Ti=10,ho.length>1&&"0"==Ie(ho,0)&&(Ti=Ve(Qr,ho)?16:8,ho=Bt(ho,8==Ti?1:2)),""===ho)Bo=0;else{if(!Ve(10==Ti?In:8==Ti?Kr:Hn,ho))return Zn;Bo=ze(ho,Ti)}en(rr,Bo)}for(ri=0;ri<yr;ri++)if(Bo=rr[ri],ri==yr-1){if(Bo>=je(256,5-yr))return null}else if(Bo>255)return null;for(xo=st(rr),ri=0;ri<rr.length;ri++)xo+=rr[ri]*je(256,3-ri);return xo}(Zn)))return Yn;this.host=cr}else{if(Ve(Ur,Zn))return Yn;for(cr="",yr=Z(Zn),rr=0;rr<yr.length;rr++)cr+=hi(yr[rr],ir);this.host=cr}},cannotHaveUsernamePasswordPort:function(){return!this.host||this.cannotBeABaseURL||"file"==this.scheme},includesCredentials:function(){return""!=this.username||""!=this.password},isSpecial:function(){return R(Ai,this.scheme)},shortenPath:function(){var Zn=this.path,cr=Zn.length;cr&&("file"!=this.scheme||1!=cr||!Tr(Zn[0],!0))&&Zn.length--},serialize:function(){var Zn=this,cr=Zn.scheme,yr=Zn.username,rr=Zn.password,ri=Zn.host,ho=Zn.port,Ti=Zn.path,Bo=Zn.query,xo=Zn.fragment,Li=cr+":";return null!==ri?(Li+="//",Zn.includesCredentials()&&(Li+=yr+(rr?":"+rr:"")+"@"),Li+=Jn(ri),null!==ho&&(Li+=":"+ho)):"file"==cr&&(Li+="//"),Li+=Zn.cannotBeABaseURL?Ti[0]:Ti.length?"/"+He(Ti,"/"):"",null!==Bo&&(Li+="?"+Bo),null!==xo&&(Li+="#"+xo),Li},setHref:function(Zn){var cr=this.parse(Zn);if(cr)throw dt(cr);this.searchParams.update()},getOrigin:function(){var Zn=this.scheme,cr=this.port;if("blob"==Zn)try{return new cs(Zn.path[0]).origin}catch(yr){return"null"}return"file"!=Zn&&this.isSpecial()?Zn+"://"+Jn(this.host)+(null!==cr?":"+cr:""):"null"},getProtocol:function(){return this.scheme+":"},setProtocol:function(Zn){this.parse(ue(Zn)+":",mr)},getUsername:function(){return this.username},setUsername:function(Zn){var cr=Z(ue(Zn));if(!this.cannotHaveUsernamePasswordPort()){this.username="";for(var yr=0;yr<cr.length;yr++)this.username+=hi(cr[yr],zr)}},getPassword:function(){return this.password},setPassword:function(Zn){var cr=Z(ue(Zn));if(!this.cannotHaveUsernamePasswordPort()){this.password="";for(var yr=0;yr<cr.length;yr++)this.password+=hi(cr[yr],zr)}},getHost:function(){var Zn=this.host,cr=this.port;return null===Zn?"":null===cr?Jn(Zn):Jn(Zn)+":"+cr},setHost:function(Zn){this.cannotBeABaseURL||this.parse(Zn,jt)},getHostname:function(){var Zn=this.host;return null===Zn?"":Jn(Zn)},setHostname:function(Zn){this.cannotBeABaseURL||this.parse(Zn,xt)},getPort:function(){var Zn=this.port;return null===Zn?"":ue(Zn)},setPort:function(Zn){this.cannotHaveUsernamePasswordPort()||(""==(Zn=ue(Zn))?this.port=null:this.parse(Zn,mn))},getPathname:function(){var Zn=this.path;return this.cannotBeABaseURL?Zn[0]:Zn.length?"/"+He(Zn,"/"):""},setPathname:function(Zn){this.cannotBeABaseURL||(this.path=[],this.parse(Zn,nr))},getSearch:function(){var Zn=this.query;return Zn?"?"+Zn:""},setSearch:function(Zn){""==(Zn=ue(Zn))?this.query=null:("?"==Ie(Zn,0)&&(Zn=Bt(Zn,1)),this.query="",this.parse(Zn,yo)),this.searchParams.update()},getSearchParams:function(){return this.searchParams.facade},getHash:function(){var Zn=this.fragment;return Zn?"#"+Zn:""},setHash:function(Zn){""!=(Zn=ue(Zn))?("#"==Ie(Zn,0)&&(Zn=Bt(Zn,1)),this.fragment="",this.parse(Zn,Mo)):this.fragment=null},update:function(){this.query=this.searchParams.serialize()||null}};var cs=function(cr){var yr=M(this,zo),rr=$(arguments.length,1)>1?arguments[1]:void 0,ri=oe(yr,new Vi(cr,!1,rr));u||(yr.href=ri.serialize(),yr.origin=ri.getOrigin(),yr.protocol=ri.getProtocol(),yr.username=ri.getUsername(),yr.password=ri.getPassword(),yr.host=ri.getHost(),yr.hostname=ri.getHostname(),yr.port=ri.getPort(),yr.pathname=ri.getPathname(),yr.search=ri.getSearch(),yr.searchParams=ri.getSearchParams(),yr.hash=ri.getHash())},zo=cs.prototype,So=function(Zn,cr){return{get:function(){return he(this)[Zn]()},set:cr&&function(yr){return he(this)[cr](yr)},configurable:!0,enumerable:!0}};if(u&&(T(zo,"href",So("serialize","setHref")),T(zo,"origin",So("getOrigin")),T(zo,"protocol",So("getProtocol","setProtocol")),T(zo,"username",So("getUsername","setUsername")),T(zo,"password",So("getPassword","setPassword")),T(zo,"host",So("getHost","setHost")),T(zo,"hostname",So("getHostname","setHostname")),T(zo,"port",So("getPort","setPort")),T(zo,"pathname",So("getPathname","setPathname")),T(zo,"search",So("getSearch","setSearch")),T(zo,"searchParams",So("getSearchParams")),T(zo,"hash",So("getHash","setHash"))),y(zo,"toJSON",function(){return he(this).serialize()},{enumerable:!0}),y(zo,"toString",function(){return he(this).serialize()},{enumerable:!0}),ce){var Si=ce.createObjectURL,ai=ce.revokeObjectURL;Si&&y(cs,"createObjectURL",e(Si,ce)),ai&&y(cs,"revokeObjectURL",e(ai,ce))}ae(cs,"URL"),r({global:!0,constructor:!0,forced:!p,sham:!u},{URL:cs})},95981:(v,S,i)=>{i(80504)},71324:()=>{},75242:(v,S,i)=>{var r=i(74771);v.exports=r},10323:(v,S,i)=>{var r=i(8412);v.exports=r},99940:(v,S,i)=>{var r=i(399);v.exports=r},89919:(v,S,i)=>{var r=i(98812);v.exports=r},14869:(v,S,i)=>{var r=i(33195);v.exports=r},4475:(v,S,i)=>{var r=i(46332);v.exports=r},38762:(v,S,i)=>{var r=i(42618);v.exports=r},8748:(v,S,i)=>{var r=i(63791);i(33089),v.exports=r},47506:(v,S,i)=>{var r=i(27959);v.exports=r},71873:(v,S,i)=>{var r=i(69029);v.exports=r},61599:(v,S,i)=>{var r=i(28924);v.exports=r},34097:(v,S,i)=>{i(33089);var r=i(35329),u=i(80112),p=i(23336),f=i(99940),e=Array.prototype,_={DOMTokenList:!0,NodeList:!0};v.exports=function(y){var T=y.entries;return y===e||p(e,y)&&T===e.entries||u(_,r(y))?f:T}},15149:(v,S,i)=>{var r=i(98709);v.exports=r},83361:(v,S,i)=>{var r=i(65991);v.exports=r},19095:(v,S,i)=>{var r=i(64158);v.exports=r},71420:(v,S,i)=>{var r=i(91799);v.exports=r},13178:(v,S,i)=>{var r=i(26155);v.exports=r},52049:(v,S,i)=>{i(33089);var r=i(35329),u=i(80112),p=i(23336),f=i(89919),e=Array.prototype,_={DOMTokenList:!0,NodeList:!0};v.exports=function(y){var T=y.forEach;return y===e||p(e,y)&&T===e.forEach||u(_,r(y))?f:T}},83655:(v,S,i)=>{var r=i(33758);v.exports=r},87054:(v,S,i)=>{var r=i(7592);v.exports=r},51946:(v,S,i)=>{i(33089);var r=i(35329),u=i(80112),p=i(23336),f=i(14869),e=Array.prototype,_={DOMTokenList:!0,NodeList:!0};v.exports=function(y){var T=y.keys;return y===e||p(e,y)&&T===e.keys||u(_,r(y))?f:T}},40764:(v,S,i)=>{var r=i(17480);v.exports=r},81214:(v,S,i)=>{var r=i(20681);v.exports=r},50881:(v,S,i)=>{var r=i(90949);v.exports=r},38813:(v,S,i)=>{var r=i(99316);v.exports=r},45284:(v,S,i)=>{var r=i(62212);v.exports=r},70157:(v,S,i)=>{var r=i(49073);v.exports=r},3502:(v,S,i)=>{var r=i(24146);v.exports=r},81610:(v,S,i)=>{var r=i(40104);v.exports=r},19543:(v,S,i)=>{var r=i(3555);v.exports=r},74046:(v,S,i)=>{var r=i(68333);v.exports=r},13731:(v,S,i)=>{var r=i(65786);v.exports=r},80129:(v,S,i)=>{i(33089);var r=i(35329),u=i(80112),p=i(23336),f=i(4475),e=Array.prototype,_={DOMTokenList:!0,NodeList:!0};v.exports=function(y){var T=y.values;return y===e||p(e,y)&&T===e.values||u(_,r(y))?f:T}},43720:(v,S,i)=>{var r=i(66306);v.exports=r},640:(v,S,i)=>{var r=i(31845);i(33089),v.exports=r},50320:(v,S,i)=>{var r=i(44168);v.exports=r},93006:(v,S,i)=>{var r=i(25852);v.exports=r},36226:(v,S,i)=>{var r=i(24457);v.exports=r},21968:(v,S,i)=>{var r=i(99671);v.exports=r},15554:(v,S,i)=>{var r=i(35161);v.exports=r},87259:(v,S,i)=>{var r=i(38007);v.exports=r},62021:(v,S,i)=>{var r=i(57432);v.exports=r},57682:(v,S,i)=>{var r=i(36541);v.exports=r},94222:(v,S,i)=>{var r=i(17303);v.exports=r},1162:(v,S,i)=>{var r=i(62149);v.exports=r},82805:(v,S,i)=>{var r=i(86537);v.exports=r},70809:(v,S,i)=>{var r=i(79553);v.exports=r},26498:(v,S,i)=>{var r=i(80092);i(33089),v.exports=r},44850:(v,S,i)=>{var r=i(472);v.exports=r},9634:(v,S,i)=>{var r=i(4678);v.exports=r},12118:(v,S,i)=>{i(69280);var r=i(13544);v.exports=r.setTimeout},96551:(v,S,i)=>{var r=i(61697);i(33089),v.exports=r},98908:(v,S,i)=>{var r=i(42497);i(33089),v.exports=r},44675:(v,S,i)=>{var r=i(41530);i(33089),v.exports=r},70906:(v,S,i)=>{var r=i(75081);v.exports=r},95050:(v,S,i)=>{var r=i(58255);i(33089),v.exports=r},41530:(v,S,i)=>{i(26953);var r=i(13544);v.exports=r.URLSearchParams},75081:(v,S,i)=>{i(95981),i(71324),i(26953);var r=i(13544);v.exports=r.URL},71577:function(){var v;v="undefined"!=typeof self?self:this,function(i){var r_searchParams="URLSearchParams"in v,r_iterable="Symbol"in v&&"iterator"in Symbol,r_blob="FileReader"in v&&"Blob"in v&&function(){try{return new Blob,!0}catch(Oe){return!1}}(),r_formData="FormData"in v,r_arrayBuffer="ArrayBuffer"in v;if(r_arrayBuffer)var p=["[object Int8Array]","[object Uint8Array]","[object Uint8ClampedArray]","[object Int16Array]","[object Uint16Array]","[object Int32Array]","[object Uint32Array]","[object Float32Array]","[object Float64Array]"],f=ArrayBuffer.isView||function(Oe){return Oe&&p.indexOf(Object.prototype.toString.call(Oe))>-1};function e(Oe){if("string"!=typeof Oe&&(Oe=String(Oe)),/[^a-z0-9\-#$%&'*+.^_`|~]/i.test(Oe))throw new TypeError("Invalid character in header field name");return Oe.toLowerCase()}function _(Oe){return"string"!=typeof Oe&&(Oe=String(Oe)),Oe}function y(Oe){var ce={next:function(){var dt=Oe.shift();return{done:void 0===dt,value:dt}}};return r_iterable&&(ce[Symbol.iterator]=function(){return ce}),ce}function T(Oe){this.map={},Oe instanceof T?Oe.forEach(function(ce,dt){this.append(dt,ce)},this):Array.isArray(Oe)?Oe.forEach(function(ce){this.append(ce[0],ce[1])},this):Oe&&Object.getOwnPropertyNames(Oe).forEach(function(ce){this.append(ce,Oe[ce])},this)}function M(Oe){if(Oe.bodyUsed)return Promise.reject(new TypeError("Already read"));Oe.bodyUsed=!0}function R(Oe){return new Promise(function(ce,dt){Oe.onload=function(){ce(Oe.result)},Oe.onerror=function(){dt(Oe.error)}})}function F(Oe){var ce=new FileReader,dt=R(ce);return ce.readAsArrayBuffer(Oe),dt}function Q(Oe){if(Oe.slice)return Oe.slice(0);var ce=new Uint8Array(Oe.byteLength);return ce.set(new Uint8Array(Oe)),ce.buffer}function ee(){return this.bodyUsed=!1,this._initBody=function(Oe){this._bodyInit=Oe,Oe?"string"==typeof Oe?this._bodyText=Oe:r_blob&&Blob.prototype.isPrototypeOf(Oe)?this._bodyBlob=Oe:r_formData&&FormData.prototype.isPrototypeOf(Oe)?this._bodyFormData=Oe:r_searchParams&&URLSearchParams.prototype.isPrototypeOf(Oe)?this._bodyText=Oe.toString():r_arrayBuffer&&r_blob&&function(Oe){return Oe&&DataView.prototype.isPrototypeOf(Oe)}(Oe)?(this._bodyArrayBuffer=Q(Oe.buffer),this._bodyInit=new Blob([this._bodyArrayBuffer])):r_arrayBuffer&&(ArrayBuffer.prototype.isPrototypeOf(Oe)||f(Oe))?this._bodyArrayBuffer=Q(Oe):this._bodyText=Oe=Object.prototype.toString.call(Oe):this._bodyText="",this.headers.get("content-type")||("string"==typeof Oe?this.headers.set("content-type","text/plain;charset=UTF-8"):this._bodyBlob&&this._bodyBlob.type?this.headers.set("content-type",this._bodyBlob.type):r_searchParams&&URLSearchParams.prototype.isPrototypeOf(Oe)&&this.headers.set("content-type","application/x-www-form-urlencoded;charset=UTF-8"))},r_blob&&(this.blob=function(){var Oe=M(this);if(Oe)return Oe;if(this._bodyBlob)return Promise.resolve(this._bodyBlob);if(this._bodyArrayBuffer)return Promise.resolve(new Blob([this._bodyArrayBuffer]));if(this._bodyFormData)throw new Error("could not read FormData body as blob");return Promise.resolve(new Blob([this._bodyText]))},this.arrayBuffer=function(){return this._bodyArrayBuffer?M(this)||Promise.resolve(this._bodyArrayBuffer):this.blob().then(F)}),this.text=function(){var Oe=M(this);if(Oe)return Oe;if(this._bodyBlob)return function(Oe){var ce=new FileReader,dt=R(ce);return ce.readAsText(Oe),dt}(this._bodyBlob);if(this._bodyArrayBuffer)return Promise.resolve(function(Oe){for(var ce=new Uint8Array(Oe),dt=new Array(ce.length),ze=0;ze<ce.length;ze++)dt[ze]=String.fromCharCode(ce[ze]);return dt.join("")}(this._bodyArrayBuffer));if(this._bodyFormData)throw new Error("could not read FormData body as text");return Promise.resolve(this._bodyText)},r_formData&&(this.formData=function(){return this.text().then(se)}),this.json=function(){return this.text().then(JSON.parse)},this}T.prototype.append=function(Oe,ce){Oe=e(Oe),ce=_(ce);var dt=this.map[Oe];this.map[Oe]=dt?dt+", "+ce:ce},T.prototype.delete=function(Oe){delete this.map[e(Oe)]},T.prototype.get=function(Oe){return Oe=e(Oe),this.has(Oe)?this.map[Oe]:null},T.prototype.has=function(Oe){return this.map.hasOwnProperty(e(Oe))},T.prototype.set=function(Oe,ce){this.map[e(Oe)]=_(ce)},T.prototype.forEach=function(Oe,ce){for(var dt in this.map)this.map.hasOwnProperty(dt)&&Oe.call(ce,this.map[dt],dt,this)},T.prototype.keys=function(){var Oe=[];return this.forEach(function(ce,dt){Oe.push(dt)}),y(Oe)},T.prototype.values=function(){var Oe=[];return this.forEach(function(ce){Oe.push(ce)}),y(Oe)},T.prototype.entries=function(){var Oe=[];return this.forEach(function(ce,dt){Oe.push([dt,ce])}),y(Oe)},r_iterable&&(T.prototype[Symbol.iterator]=T.prototype.entries);var ue=["DELETE","GET","HEAD","OPTIONS","POST","PUT"];function $(Oe,ce){var dt=(ce=ce||{}).body;if(Oe instanceof $){if(Oe.bodyUsed)throw new TypeError("Already read");this.url=Oe.url,this.credentials=Oe.credentials,ce.headers||(this.headers=new T(Oe.headers)),this.method=Oe.method,this.mode=Oe.mode,this.signal=Oe.signal,!dt&&null!=Oe._bodyInit&&(dt=Oe._bodyInit,Oe.bodyUsed=!0)}else this.url=String(Oe);if(this.credentials=ce.credentials||this.credentials||"same-origin",(ce.headers||!this.headers)&&(this.headers=new T(ce.headers)),this.method=function(Oe){var ce=Oe.toUpperCase();return ue.indexOf(ce)>-1?ce:Oe}(ce.method||this.method||"GET"),this.mode=ce.mode||this.mode||null,this.signal=ce.signal||this.signal,this.referrer=null,("GET"===this.method||"HEAD"===this.method)&&dt)throw new TypeError("Body not allowed for GET or HEAD requests");this._initBody(dt)}function se(Oe){var ce=new FormData;return Oe.trim().split("&").forEach(function(dt){if(dt){var ze=dt.split("="),Ye=ze.shift().replace(/\+/g," "),je=ze.join("=").replace(/\+/g," ");ce.append(decodeURIComponent(Ye),decodeURIComponent(je))}}),ce}function ve(Oe){var ce=new T;return Oe.replace(/\r?\n[\t ]+/g," ").split(/\r?\n/).forEach(function(ze){var Ye=ze.split(":"),je=Ye.shift().trim();if(je){var Ie=Ye.join(":").trim();ce.append(je,Ie)}}),ce}function oe(Oe,ce){ce||(ce={}),this.type="default",this.status=void 0===ce.status?200:ce.status,this.ok=this.status>=200&&this.status<300,this.statusText="statusText"in ce?ce.statusText:"OK",this.headers=new T(ce.headers),this.url=ce.url||"",this._initBody(Oe)}$.prototype.clone=function(){return new $(this,{body:this._bodyInit})},ee.call($.prototype),ee.call(oe.prototype),oe.prototype.clone=function(){return new oe(this._bodyInit,{status:this.status,statusText:this.statusText,headers:new T(this.headers),url:this.url})},oe.error=function(){var Oe=new oe(null,{status:0,statusText:""});return Oe.type="error",Oe};var he=[301,302,303,307,308];oe.redirect=function(Oe,ce){if(-1===he.indexOf(ce))throw new RangeError("Invalid status code");return new oe(null,{status:ce,headers:{location:Oe}})},i.DOMException=v.DOMException;try{new i.DOMException}catch(Oe){i.DOMException=function(ce,dt){this.message=ce,this.name=dt;var ze=Error(ce);this.stack=ze.stack},i.DOMException.prototype=Object.create(Error.prototype),i.DOMException.prototype.constructor=i.DOMException}function me(Oe,ce){return new Promise(function(dt,ze){var Ye=new $(Oe,ce);if(Ye.signal&&Ye.signal.aborted)return ze(new i.DOMException("Aborted","AbortError"));var je=new XMLHttpRequest;function Ie(){je.abort()}je.onload=function(){var Ve={status:je.status,statusText:je.statusText,headers:ve(je.getAllResponseHeaders()||"")};Ve.url="responseURL"in je?je.responseURL:Ve.headers.get("X-Request-URL"),dt(new oe("response"in je?je.response:je.responseText,Ve))},je.onerror=function(){ze(new TypeError("Network request failed"))},je.ontimeout=function(){ze(new TypeError("Network request failed"))},je.onabort=function(){ze(new i.DOMException("Aborted","AbortError"))},je.open(Ye.method,Ye.url,!0),"include"===Ye.credentials?je.withCredentials=!0:"omit"===Ye.credentials&&(je.withCredentials=!1),"responseType"in je&&r_blob&&(je.responseType="blob"),Ye.headers.forEach(function(Ve,He){je.setRequestHeader(He,Ve)}),Ye.signal&&(Ye.signal.addEventListener("abort",Ie),je.onreadystatechange=function(){4===je.readyState&&Ye.signal.removeEventListener("abort",Ie)}),je.send(void 0===Ye._bodyInit?null:Ye._bodyInit)})}me.polyfill=!0,v.fetch||(v.fetch=me,v.Headers=T,v.Request=$,v.Response=oe),i.Headers=T,i.Request=$,i.Response=oe,i.fetch=me,Object.defineProperty(i,"__esModule",{value:!0})}({})},52243:function(v){var S;S="undefined"!=typeof global?global:this,v.exports=function(S){if(S.CSS&&S.CSS.escape)return S.CSS.escape;var i=function(r){if(0==arguments.length)throw new TypeError("`CSS.escape` requires an argument.");for(var e,u=String(r),p=u.length,f=-1,_="",y=u.charCodeAt(0);++f<p;)0!=(e=u.charCodeAt(f))?_+=e>=1&&e<=31||127==e||0==f&&e>=48&&e<=57||1==f&&e>=48&&e<=57&&45==y?"\\"+e.toString(16)+" ":0==f&&1==p&&45==e||!(e>=128||45==e||95==e||e>=48&&e<=57||e>=65&&e<=90||e>=97&&e<=122)?"\\"+u.charAt(f):u.charAt(f):_+="\ufffd";return _};return S.CSS||(S.CSS={}),S.CSS.escape=i,i}(S)},89225:v=>{"use strict";var S=function(ae){return!(!(ue=ae)||"object"!=typeof ue||function(ue){var ae=Object.prototype.toString.call(ue);return"[object RegExp]"===ae||"[object Date]"===ae||function(ue){return ue.$$typeof===p}(ue)}(ae));var ue},p="function"==typeof Symbol&&Symbol.for?Symbol.for("react.element"):60103;function _(ue,ae){return!1!==ae.clone&&ae.isMergeableObject(ue)?Q(function(ue){return Array.isArray(ue)?[]:{}}(ue),ue,ae):ue}function y(ue,ae,$){return ue.concat(ae).map(function(se){return _(se,$)})}function R(ue){return Object.keys(ue).concat(function(ue){return Object.getOwnPropertySymbols?Object.getOwnPropertySymbols(ue).filter(function(ae){return ue.propertyIsEnumerable(ae)}):[]}(ue))}function F(ue,ae){try{return ae in ue}catch($){return!1}}function Q(ue,ae,$){($=$||{}).arrayMerge=$.arrayMerge||y,$.isMergeableObject=$.isMergeableObject||S,$.cloneUnlessOtherwiseSpecified=_;var se=Array.isArray(ae);return se===Array.isArray(ue)?se?$.arrayMerge(ue,ae,$):function(ue,ae,$){var se={};return $.isMergeableObject(ue)&&R(ue).forEach(function(ve){se[ve]=_(ue[ve],$)}),R(ae).forEach(function(ve){(function(ue,ae){return F(ue,ae)&&!(Object.hasOwnProperty.call(ue,ae)&&Object.propertyIsEnumerable.call(ue,ae))})(ue,ve)||(se[ve]=F(ue,ve)&&$.isMergeableObject(ae[ve])?function(ue,ae){if(!ae.customMerge)return Q;var $=ae.customMerge(ue);return"function"==typeof $?$:Q}(ve,$)(ue[ve],ae[ve],$):_(ae[ve],$))}),se}(ue,ae,$):_(ae,$)}Q.all=function(ae,$){if(!Array.isArray(ae))throw new Error("first argument should be an array");return ae.reduce(function(se,ve){return Q(se,ve,$)},{})},v.exports=Q},97057:(v,S,i)=>{"use strict";i.d(S,{qY:()=>Z});var u=function(ve,oe,he){this.name=ve,this.version=oe,this.os=he,this.type="browser"},p=function(ve){this.version=ve,this.type="node",this.name="node",this.os=process.platform},f=function(ve,oe,he,me){this.name=ve,this.version=oe,this.os=he,this.bot=me,this.type="bot-device"},e=function(){this.type="bot",this.bot=!0,this.name="bot",this.version=null,this.os=null},_=function(){this.type="react-native",this.name="react-native",this.version=null,this.os=null},T=/(nuhk|Googlebot|Yammybot|Openbot|Slurp|MSNBot|Ask\ Jeeves\/Teoma|ia_archiver)/,R=[["aol",/AOLShield\/([0-9\._]+)/],["edge",/Edge\/([0-9\._]+)/],["edge-ios",/EdgiOS\/([0-9\._]+)/],["yandexbrowser",/YaBrowser\/([0-9\._]+)/],["kakaotalk",/KAKAOTALK\s([0-9\.]+)/],["samsung",/SamsungBrowser\/([0-9\.]+)/],["silk",/\bSilk\/([0-9._-]+)\b/],["miui",/MiuiBrowser\/([0-9\.]+)$/],["beaker",/BeakerBrowser\/([0-9\.]+)/],["edge-chromium",/EdgA?\/([0-9\.]+)/],["chromium-webview",/(?!Chrom.*OPR)wv\).*Chrom(?:e|ium)\/([0-9\.]+)(:?\s|$)/],["chrome",/(?!Chrom.*OPR)Chrom(?:e|ium)\/([0-9\.]+)(:?\s|$)/],["phantomjs",/PhantomJS\/([0-9\.]+)(:?\s|$)/],["crios",/CriOS\/([0-9\.]+)(:?\s|$)/],["firefox",/Firefox\/([0-9\.]+)(?:\s|$)/],["fxios",/FxiOS\/([0-9\.]+)/],["opera-mini",/Opera Mini.*Version\/([0-9\.]+)/],["opera",/Opera\/([0-9\.]+)(?:\s|$)/],["opera",/OPR\/([0-9\.]+)(:?\s|$)/],["ie",/Trident\/7\.0.*rv\:([0-9\.]+).*\).*Gecko$/],["ie",/MSIE\s([0-9\.]+);.*Trident\/[4-7].0/],["ie",/MSIE\s(7\.0)/],["bb10",/BB10;\sTouch.*Version\/([0-9\.]+)/],["android",/Android\s([0-9\.]+)/],["ios",/Version\/([0-9\._]+).*Mobile.*Safari.*/],["safari",/Version\/([0-9\._]+).*Safari/],["facebook",/FBAV\/([0-9\.]+)/],["instagram",/Instagram\s([0-9\.]+)/],["ios-webview",/AppleWebKit\/([0-9\.]+).*Mobile/],["ios-webview",/AppleWebKit\/([0-9\.]+).*Gecko\)$/],["searchbot",/alexa|bot|crawl(er|ing)|facebookexternalhit|feedburner|google web preview|nagios|postrank|pingdom|slurp|spider|yahoo!|yandex/]],F=[["iOS",/iP(hone|od|ad)/],["Android OS",/Android/],["BlackBerry OS",/BlackBerry|BB10/],["Windows Mobile",/IEMobile/],["Amazon OS",/Kindle/],["Windows 3.11",/Win16/],["Windows 95",/(Windows 95)|(Win95)|(Windows_95)/],["Windows 98",/(Windows 98)|(Win98)/],["Windows 2000",/(Windows NT 5.0)|(Windows 2000)/],["Windows XP",/(Windows NT 5.1)|(Windows XP)/],["Windows Server 2003",/(Windows NT 5.2)/],["Windows Vista",/(Windows NT 6.0)/],["Windows 7",/(Windows NT 6.1)/],["Windows 8",/(Windows NT 6.2)/],["Windows 8.1",/(Windows NT 6.3)/],["Windows 10",/(Windows NT 10.0)/],["Windows ME",/Windows ME/],["Open BSD",/OpenBSD/],["Sun OS",/SunOS/],["Chrome OS",/CrOS/],["Linux",/(Linux)|(X11)/],["Mac OS",/(Mac_PowerPC)|(Macintosh)/],["QNX",/QNX/],["BeOS",/BeOS/],["OS/2",/OS\/2/]];function Z(se){return se?ee(se):"undefined"==typeof document&&"undefined"!=typeof navigator&&"ReactNative"===navigator.product?new _:"undefined"!=typeof navigator?ee(navigator.userAgent):"undefined"!=typeof process&&process.version?new p(process.version.slice(1)):null}function ee(se){var ve=function(se){return""!==se&&R.reduce(function(ve,oe){var he=oe[0];if(ve)return ve;var Oe=oe[1].exec(se);return!!Oe&&[he,Oe]},!1)}(se);if(!ve)return null;var oe=ve[0],he=ve[1];if("searchbot"===oe)return new e;var me=he[1]&&he[1].split(/[._]/).slice(0,3);me?me.length<3&&(me=function(){for(var se=0,ve=0,oe=arguments.length;ve<oe;ve++)se+=arguments[ve].length;var he=Array(se),me=0;for(ve=0;ve<oe;ve++)for(var Oe=arguments[ve],ce=0,dt=Oe.length;ce<dt;ce++,me++)he[me]=Oe[ce];return he}(me,function(se){for(var ve=[],oe=0;oe<se;oe++)ve.push("0");return ve}(3-me.length))):me=[];var Oe=me.join("."),ce=function(se){for(var ve=0,oe=F.length;ve<oe;ve++){var he=F[ve],me=he[0];if(he[1].exec(se))return me}return null}(se),dt=T.exec(se);return dt&&dt[1]?new f(oe,Oe,ce,dt[1]):new u(oe,Oe,ce)}},23358:function(v){v.exports=function(){"use strict";var i=Object.hasOwnProperty,r=Object.setPrototypeOf,u=Object.isFrozen,p=Object.getPrototypeOf,f=Object.getOwnPropertyDescriptor,e=Object.freeze,_=Object.seal,y=Object.create,T="undefined"!=typeof Reflect&&Reflect,M=T.apply,R=T.construct;M||(M=function(In,Hn,Zr){return In.apply(Hn,Zr)}),e||(e=function(In){return In}),_||(_=function(In){return In}),R||(R=function(In,Hn){return new(Function.prototype.bind.apply(In,[null].concat(function(Kr){if(Array.isArray(Kr)){for(var In=0,Hn=Array(Kr.length);In<Kr.length;In++)Hn[In]=Kr[In];return Hn}return Array.from(Kr)}(Hn))))});var Kr,F=oe(Array.prototype.forEach),Z=oe(Array.prototype.pop),J=oe(Array.prototype.push),Q=oe(String.prototype.toLowerCase),ee=oe(String.prototype.match),ue=oe(String.prototype.replace),ae=oe(String.prototype.indexOf),$=oe(String.prototype.trim),se=oe(RegExp.prototype.test),ve=(Kr=TypeError,function(){for(var In=arguments.length,Hn=Array(In),Zr=0;Zr<In;Zr++)Hn[Zr]=arguments[Zr];return R(Kr,Hn)});function oe(Kr){return function(In){for(var Hn=arguments.length,Zr=Array(Hn>1?Hn-1:0),Ur=1;Ur<Hn;Ur++)Zr[Ur-1]=arguments[Ur];return M(Kr,In,Zr)}}function me(Kr,In){r&&r(Kr,null);for(var Hn=In.length;Hn--;){var Zr=In[Hn];if("string"==typeof Zr){var Ur=Q(Zr);Ur!==Zr&&(u(In)||(In[Hn]=Ur),Zr=Ur)}Kr[Zr]=!0}return Kr}function Oe(Kr){var In=y(null),Hn=void 0;for(Hn in Kr)M(i,Kr,[Hn])&&(In[Hn]=Kr[Hn]);return In}function ce(Kr,In){for(;null!==Kr;){var Hn=f(Kr,In);if(Hn){if(Hn.get)return oe(Hn.get);if("function"==typeof Hn.value)return oe(Hn.value)}Kr=p(Kr)}return function(Ur){return console.warn("fallback value for",Ur),null}}var dt=e(["a","abbr","acronym","address","area","article","aside","audio","b","bdi","bdo","big","blink","blockquote","body","br","button","canvas","caption","center","cite","code","col","colgroup","content","data","datalist","dd","decorator","del","details","dfn","dialog","dir","div","dl","dt","element","em","fieldset","figcaption","figure","font","footer","form","h1","h2","h3","h4","h5","h6","head","header","hgroup","hr","html","i","img","input","ins","kbd","label","legend","li","main","map","mark","marquee","menu","menuitem","meter","nav","nobr","ol","optgroup","option","output","p","picture","pre","progress","q","rp","rt","ruby","s","samp","section","select","shadow","small","source","spacer","span","strike","strong","style","sub","summary","sup","table","tbody","td","template","textarea","tfoot","th","thead","time","tr","track","tt","u","ul","var","video","wbr"]),ze=e(["svg","a","altglyph","altglyphdef","altglyphitem","animatecolor","animatemotion","animatetransform","circle","clippath","defs","desc","ellipse","filter","font","g","glyph","glyphref","hkern","image","line","lineargradient","marker","mask","metadata","mpath","path","pattern","polygon","polyline","radialgradient","rect","stop","style","switch","symbol","text","textpath","title","tref","tspan","view","vkern"]),Ye=e(["feBlend","feColorMatrix","feComponentTransfer","feComposite","feConvolveMatrix","feDiffuseLighting","feDisplacementMap","feDistantLight","feFlood","feFuncA","feFuncB","feFuncG","feFuncR","feGaussianBlur","feMerge","feMergeNode","feMorphology","feOffset","fePointLight","feSpecularLighting","feSpotLight","feTile","feTurbulence"]),je=e(["animate","color-profile","cursor","discard","fedropshadow","feimage","font-face","font-face-format","font-face-name","font-face-src","font-face-uri","foreignobject","hatch","hatchpath","mesh","meshgradient","meshpatch","meshrow","missing-glyph","script","set","solidcolor","unknown","use"]),Ie=e(["math","menclose","merror","mfenced","mfrac","mglyph","mi","mlabeledtr","mmultiscripts","mn","mo","mover","mpadded","mphantom","mroot","mrow","ms","mspace","msqrt","mstyle","msub","msup","msubsup","mtable","mtd","mtext","mtr","munder","munderover"]),Ve=e(["maction","maligngroup","malignmark","mlongdiv","mscarries","mscarry","msgroup","mstack","msline","msrow","semantics","annotation","annotation-xml","mprescripts","none"]),He=e(["#text"]),Zt=e(["accept","action","align","alt","autocapitalize","autocomplete","autopictureinpicture","autoplay","background","bgcolor","border","capture","cellpadding","cellspacing","checked","cite","class","clear","color","cols","colspan","controls","controlslist","coords","crossorigin","datetime","decoding","default","dir","disabled","disablepictureinpicture","disableremoteplayback","download","draggable","enctype","enterkeyhint","face","for","headers","height","hidden","high","href","hreflang","id","inputmode","integrity","ismap","kind","label","lang","list","loading","loop","low","max","maxlength","media","method","min","minlength","multiple","muted","name","noshade","novalidate","nowrap","open","optimum","pattern","placeholder","playsinline","poster","preload","pubdate","radiogroup","readonly","rel","required","rev","reversed","role","rows","rowspan","spellcheck","scope","selected","shape","size","sizes","span","srclang","start","src","srcset","step","style","summary","tabindex","title","translate","type","usemap","valign","value","width","xmlns","slot"]),st=e(["accent-height","accumulate","additive","alignment-baseline","ascent","attributename","attributetype","azimuth","basefrequency","baseline-shift","begin","bias","by","class","clip","clippathunits","clip-path","clip-rule","color","color-interpolation","color-interpolation-filters","color-profile","color-rendering","cx","cy","d","dx","dy","diffuseconstant","direction","display","divisor","dur","edgemode","elevation","end","fill","fill-opacity","fill-rule","filter","filterunits","flood-color","flood-opacity","font-family","font-size","font-size-adjust","font-stretch","font-style","font-variant","font-weight","fx","fy","g1","g2","glyph-name","glyphref","gradientunits","gradienttransform","height","href","id","image-rendering","in","in2","k","k1","k2","k3","k4","kerning","keypoints","keysplines","keytimes","lang","lengthadjust","letter-spacing","kernelmatrix","kernelunitlength","lighting-color","local","marker-end","marker-mid","marker-start","markerheight","markerunits","markerwidth","maskcontentunits","maskunits","max","mask","media","method","mode","min","name","numoctaves","offset","operator","opacity","order","orient","orientation","origin","overflow","paint-order","path","pathlength","patterncontentunits","patterntransform","patternunits","points","preservealpha","preserveaspectratio","primitiveunits","r","rx","ry","radius","refx","refy","repeatcount","repeatdur","restart","result","rotate","scale","seed","shape-rendering","specularconstant","specularexponent","spreadmethod","startoffset","stddeviation","stitchtiles","stop-color","stop-opacity","stroke-dasharray","stroke-dashoffset","stroke-linecap","stroke-linejoin","stroke-miterlimit","stroke-opacity","stroke","stroke-width","style","surfacescale","systemlanguage","tabindex","targetx","targety","transform","text-anchor","text-decoration","text-rendering","textlength","type","u1","u2","unicode","values","viewbox","visibility","version","vert-adv-y","vert-origin-x","vert-origin-y","width","word-spacing","wrap","writing-mode","xchannelselector","ychannelselector","x","x1","x2","xmlns","y","y1","y2","z","zoomandpan"]),en=e(["accent","accentunder","align","bevelled","close","columnsalign","columnlines","columnspan","denomalign","depth","dir","display","displaystyle","encoding","fence","frame","height","href","id","largeop","length","linethickness","lspace","lquote","mathbackground","mathcolor","mathsize","mathvariant","maxsize","minsize","movablelimits","notation","numalign","open","rowalign","rowlines","rowspacing","rowspan","rspace","rquote","scriptlevel","scriptminsize","scriptsizemultiplier","selection","separator","separators","stretchy","subscriptshift","supscriptshift","symmetric","voffset","width","xmlns"]),$t=e(["xlink:href","xml:id","xlink:title","xml:space","xmlns:xlink"]),Gt=_(/\{\{[\s\S]*|[\s\S]*\}\}/gm),Ut=_(/<%[\s\S]*|[\s\S]*%>/gm),Bt=_(/^data-[\-\w.\u00B7-\uFFFF]/),mt=_(/^aria-[\-\w]+$/),Yt=_(/^(?:(?:(?:f|ht)tps?|mailto|tel|callto|cid|xmpp):|[^a-z]|[a-z+.\-]+(?:[^a-z+.\-:]|$))/i),Dt=_(/^(?:\w+script|data):/i),zt=_(/[\u0000-\u0020\u00A0\u1680\u180E\u2000-\u2029\u205F\u3000]/g),Yn="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(Kr){return typeof Kr}:function(Kr){return Kr&&"function"==typeof Symbol&&Kr.constructor===Symbol&&Kr!==Symbol.prototype?"symbol":typeof Kr};function Hr(Kr){if(Array.isArray(Kr)){for(var In=0,Hn=Array(Kr.length);In<Kr.length;In++)Hn[In]=Kr[In];return Hn}return Array.from(Kr)}var ci=function(){return"undefined"==typeof window?null:window},Ir=function(In,Hn){if("object"!==(void 0===In?"undefined":Yn(In))||"function"!=typeof In.createPolicy)return null;var Zr=null,Ur="data-tt-policy-suffix";Hn.currentScript&&Hn.currentScript.hasAttribute(Ur)&&(Zr=Hn.currentScript.getAttribute(Ur));var di="dompurify"+(Zr?"#"+Zr:"");try{return In.createPolicy(di,{createHTML:function(Hi){return Hi}})}catch($i){return console.warn("TrustedTypes policy "+di+" could not be created."),null}};return function wr(){var Kr=arguments.length>0&&void 0!==arguments[0]?arguments[0]:ci(),In=function(kr){return wr(kr)};if(In.version="2.3.3",In.removed=[],!Kr||!Kr.document||9!==Kr.document.nodeType)return In.isSupported=!1,In;var Hn=Kr.document,Zr=Kr.document,Ur=Kr.DocumentFragment,di=Kr.HTMLTemplateElement,$i=Kr.Node,Hi=Kr.Element,Br=Kr.NodeFilter,On=Kr.NamedNodeMap,Wt=void 0===On?Kr.NamedNodeMap||Kr.MozNamedAttrMap:On,Jn=Kr.Text,ir=Kr.Comment,Lr=Kr.DOMParser,Vn=Kr.trustedTypes,zr=Hi.prototype,hi=ce(zr,"cloneNode"),Ai=ce(zr,"nextSibling"),Tr=ce(zr,"childNodes"),Nr=ce(zr,"parentNode");if("function"==typeof di){var gn=Zr.createElement("template");gn.content&&gn.content.ownerDocument&&(Zr=gn.content.ownerDocument)}var En=Ir(Vn,Hn),mr=En&&ho?En.createHTML(""):"",zn=Zr.implementation,vr=Zr.createNodeIterator,si=Zr.createDocumentFragment,Ii=Zr.getElementsByTagName,no=Hn.importNode,so={};try{so=Oe(Zr).documentMode?Zr.documentMode:{}}catch(Co){}var Ze={};In.isSupported="function"==typeof Nr&&zn&&void 0!==zn.createHTMLDocument&&9!==so;var Dr=Gt,jt=Ut,xt=Bt,mn=mt,Wn=Dt,kn=zt,wn=Yt,nr=null,Gi=me({},[].concat(Hr(dt),Hr(ze),Hr(Ye),Hr(Ie),Hr(He))),po=null,yo=me({},[].concat(Hr(Zt),Hr(st),Hr(en),Hr($t))),Mo=null,Vi=null,cs=!0,zo=!0,So=!1,Si=!1,ai=!1,Zn=!1,cr=!1,yr=!1,rr=!1,ri=!0,ho=!1,Ti=!0,Bo=!0,xo=!1,Li={},ar=null,ln=me({},["annotation-xml","audio","colgroup","desc","foreignobject","head","iframe","math","mi","mn","mo","ms","mtext","noembed","noframes","noscript","plaintext","script","style","svg","template","thead","title","video","xmp"]),Ht=null,cn=me({},["audio","video","img","source","image","track"]),Ct=null,pr=me({},["alt","class","for","id","label","name","pattern","placeholder","role","summary","title","value","style","xmlns"]),nn="http://www.w3.org/1998/Math/MathML",Cn="http://www.w3.org/2000/svg",br="http://www.w3.org/1999/xhtml",zi=br,Wo=!1,Do=void 0,Js=["application/xhtml+xml","text/html"],_s="text/html",bs=void 0,qo=null,ra=Zr.createElement("form"),Ia=function(kr){qo&&qo===kr||((!kr||"object"!==(void 0===kr?"undefined":Yn(kr)))&&(kr={}),kr=Oe(kr),nr="ALLOWED_TAGS"in kr?me({},kr.ALLOWED_TAGS):Gi,po="ALLOWED_ATTR"in kr?me({},kr.ALLOWED_ATTR):yo,Ct="ADD_URI_SAFE_ATTR"in kr?me(Oe(pr),kr.ADD_URI_SAFE_ATTR):pr,Ht="ADD_DATA_URI_TAGS"in kr?me(Oe(cn),kr.ADD_DATA_URI_TAGS):cn,ar="FORBID_CONTENTS"in kr?me({},kr.FORBID_CONTENTS):ln,Mo="FORBID_TAGS"in kr?me({},kr.FORBID_TAGS):{},Vi="FORBID_ATTR"in kr?me({},kr.FORBID_ATTR):{},Li="USE_PROFILES"in kr&&kr.USE_PROFILES,cs=!1!==kr.ALLOW_ARIA_ATTR,zo=!1!==kr.ALLOW_DATA_ATTR,So=kr.ALLOW_UNKNOWN_PROTOCOLS||!1,Si=kr.SAFE_FOR_TEMPLATES||!1,ai=kr.WHOLE_DOCUMENT||!1,yr=kr.RETURN_DOM||!1,rr=kr.RETURN_DOM_FRAGMENT||!1,ri=!1!==kr.RETURN_DOM_IMPORT,ho=kr.RETURN_TRUSTED_TYPE||!1,cr=kr.FORCE_BODY||!1,Ti=!1!==kr.SANITIZE_DOM,Bo=!1!==kr.KEEP_CONTENT,xo=kr.IN_PLACE||!1,wn=kr.ALLOWED_URI_REGEXP||wn,zi=kr.NAMESPACE||br,Do=Do=-1===Js.indexOf(kr.PARSER_MEDIA_TYPE)?_s:kr.PARSER_MEDIA_TYPE,bs="application/xhtml+xml"===Do?function(ro){return ro}:Q,Si&&(zo=!1),rr&&(yr=!0),Li&&(nr=me({},[].concat(Hr(He))),po=[],!0===Li.html&&(me(nr,dt),me(po,Zt)),!0===Li.svg&&(me(nr,ze),me(po,st),me(po,$t)),!0===Li.svgFilters&&(me(nr,Ye),me(po,st),me(po,$t)),!0===Li.mathMl&&(me(nr,Ie),me(po,en),me(po,$t))),kr.ADD_TAGS&&(nr===Gi&&(nr=Oe(nr)),me(nr,kr.ADD_TAGS)),kr.ADD_ATTR&&(po===yo&&(po=Oe(po)),me(po,kr.ADD_ATTR)),kr.ADD_URI_SAFE_ATTR&&me(Ct,kr.ADD_URI_SAFE_ATTR),kr.FORBID_CONTENTS&&(ar===ln&&(ar=Oe(ar)),me(ar,kr.FORBID_CONTENTS)),Bo&&(nr["#text"]=!0),ai&&me(nr,["html","head","body"]),nr.table&&(me(nr,["tbody"]),delete Mo.tbody),e&&e(kr),qo=kr)},pa=me({},["mi","mo","mn","ms","mtext"]),Bs=me({},["foreignobject","desc","title","annotation-xml"]),Yl=me({},ze);me(Yl,Ye),me(Yl,je);var yl=me({},Ie);me(yl,Ve);var fo=function(kr){var ro=Nr(kr);(!ro||!ro.tagName)&&(ro={namespaceURI:br,tagName:"template"});var tt=Q(kr.tagName),on=Q(ro.tagName);if(kr.namespaceURI===Cn)return ro.namespaceURI===br?"svg"===tt:ro.namespaceURI===nn?"svg"===tt&&("annotation-xml"===on||pa[on]):Boolean(Yl[tt]);if(kr.namespaceURI===nn)return ro.namespaceURI===br?"math"===tt:ro.namespaceURI===Cn?"math"===tt&&Bs[on]:Boolean(yl[tt]);if(kr.namespaceURI===br){if(ro.namespaceURI===Cn&&!Bs[on]||ro.namespaceURI===nn&&!pa[on])return!1;var ne=me({},["title","style","font","a","script"]);return!yl[tt]&&(ne[tt]||!Yl[tt])}return!1},Da=function(kr){J(In.removed,{element:kr});try{kr.parentNode.removeChild(kr)}catch(ro){try{kr.outerHTML=mr}catch(tt){kr.remove()}}},Ao=function(kr,ro){try{J(In.removed,{attribute:ro.getAttributeNode(kr),from:ro})}catch(tt){J(In.removed,{attribute:null,from:ro})}if(ro.removeAttribute(kr),"is"===kr&&!po[kr])if(yr||rr)try{Da(ro)}catch(tt){}else try{ro.setAttribute(kr,"")}catch(tt){}},ls=function(kr){var ro=void 0,tt=void 0;if(cr)kr="<remove></remove>"+kr;else{var on=ee(kr,/^[\r\n\t ]+/);tt=on&&on[0]}"application/xhtml+xml"===Do&&(kr='<html xmlns="http://www.w3.org/1999/xhtml"><head></head><body>'+kr+"</body></html>");var ne=En?En.createHTML(kr):kr;if(zi===br)try{ro=(new Lr).parseFromString(ne,Do)}catch(Pt){}if(!ro||!ro.documentElement){ro=zn.createDocument(zi,"template",null);try{ro.documentElement.innerHTML=Wo?"":ne}catch(Pt){}}var $e=ro.body||ro.documentElement;return kr&&tt&&$e.insertBefore(Zr.createTextNode(tt),$e.childNodes[0]||null),zi===br?Ii.call(ro,ai?"html":"body")[0]:ai?ro.documentElement:$e},gs=function(kr){return vr.call(kr.ownerDocument||kr,kr,Br.SHOW_ELEMENT|Br.SHOW_COMMENT|Br.SHOW_TEXT,null,!1)},Ra=function(kr){return!(kr instanceof Jn||kr instanceof ir||"string"==typeof kr.nodeName&&"string"==typeof kr.textContent&&"function"==typeof kr.removeChild&&kr.attributes instanceof Wt&&"function"==typeof kr.removeAttribute&&"function"==typeof kr.setAttribute&&"string"==typeof kr.namespaceURI&&"function"==typeof kr.insertBefore)},pl=function(kr){return"object"===(void 0===$i?"undefined":Yn($i))?kr instanceof $i:kr&&"object"===(void 0===kr?"undefined":Yn(kr))&&"number"==typeof kr.nodeType&&"string"==typeof kr.nodeName},Qs=function(kr,ro,tt){!Ze[kr]||F(Ze[kr],function(on){on.call(In,ro,tt,qo)})},Fo=function(kr){var ro=void 0;if(Qs("beforeSanitizeElements",kr,null),Ra(kr)||ee(kr.nodeName,/[\u0080-\uFFFF]/))return Da(kr),!0;var tt=bs(kr.nodeName);if(Qs("uponSanitizeElement",kr,{tagName:tt,allowedTags:nr}),!pl(kr.firstElementChild)&&(!pl(kr.content)||!pl(kr.content.firstElementChild))&&se(/<[/\w]/g,kr.innerHTML)&&se(/<[/\w]/g,kr.textContent)||"select"===tt&&se(/<template/i,kr.innerHTML))return Da(kr),!0;if(!nr[tt]||Mo[tt]){if(Bo&&!ar[tt]){var on=Nr(kr)||kr.parentNode,ne=Tr(kr)||kr.childNodes;if(ne&&on)for(var Pt=ne.length-1;Pt>=0;--Pt)on.insertBefore(hi(ne[Pt],!0),Ai(kr))}return Da(kr),!0}return kr instanceof Hi&&!fo(kr)||("noscript"===tt||"noembed"===tt)&&se(/<\/no(script|embed)/i,kr.innerHTML)?(Da(kr),!0):(Si&&3===kr.nodeType&&(ro=ue(ro=kr.textContent,Dr," "),ro=ue(ro,jt," "),kr.textContent!==ro&&(J(In.removed,{element:kr.cloneNode()}),kr.textContent=ro)),Qs("afterSanitizeElements",kr,null),!1)},Eo=function(kr,ro,tt){if(Ti&&("id"===ro||"name"===ro)&&(tt in Zr||tt in ra))return!1;if((!zo||Vi[ro]||!se(xt,ro))&&(!cs||!se(mn,ro))){if(!po[ro]||Vi[ro])return!1;if(!Ct[ro]&&!se(wn,ue(tt,kn,""))&&("src"!==ro&&"xlink:href"!==ro&&"href"!==ro||"script"===kr||0!==ae(tt,"data:")||!Ht[kr])&&(!So||se(Wn,ue(tt,kn,"")))&&tt)return!1}return!0},ks=function(kr){var ro=void 0,tt=void 0,on=void 0,ne=void 0;Qs("beforeSanitizeAttributes",kr,null);var $e=kr.attributes;if($e){var Pt={attrName:"",attrValue:"",keepAttr:!0,allowedAttributes:po};for(ne=$e.length;ne--;){var ei=(ro=$e[ne]).name,fi=ro.namespaceURI;if(tt=$(ro.value),on=bs(ei),Pt.attrName=on,Pt.attrValue=tt,Pt.keepAttr=!0,Pt.forceKeepAttr=void 0,Qs("uponSanitizeAttribute",kr,Pt),tt=Pt.attrValue,!Pt.forceKeepAttr&&(Ao(ei,kr),Pt.keepAttr)){if(se(/\/>/i,tt)){Ao(ei,kr);continue}Si&&(tt=ue(tt,Dr," "),tt=ue(tt,jt," "));var Oi=bs(kr.nodeName);if(Eo(Oi,on,tt))try{fi?kr.setAttributeNS(fi,ei,tt):kr.setAttribute(ei,tt),Z(In.removed)}catch(os){}}}Qs("afterSanitizeAttributes",kr,null)}},ms=function Co(kr){var ro=void 0,tt=gs(kr);for(Qs("beforeSanitizeShadowDOM",kr,null);ro=tt.nextNode();)Qs("uponSanitizeShadowNode",ro,null),!Fo(ro)&&(ro.content instanceof Ur&&Co(ro.content),ks(ro));Qs("afterSanitizeShadowDOM",kr,null)};return In.sanitize=function(Co,kr){var ro=void 0,tt=void 0,on=void 0,ne=void 0,$e=void 0;if((Wo=!Co)&&(Co="\x3c!--\x3e"),"string"!=typeof Co&&!pl(Co)){if("function"!=typeof Co.toString)throw ve("toString is not a function");if("string"!=typeof(Co=Co.toString()))throw ve("dirty is not a string, aborting")}if(!In.isSupported){if("object"===Yn(Kr.toStaticHTML)||"function"==typeof Kr.toStaticHTML){if("string"==typeof Co)return Kr.toStaticHTML(Co);if(pl(Co))return Kr.toStaticHTML(Co.outerHTML)}return Co}if(Zn||Ia(kr),In.removed=[],"string"==typeof Co&&(xo=!1),!xo)if(Co instanceof $i)1===(tt=(ro=ls("\x3c!----\x3e")).ownerDocument.importNode(Co,!0)).nodeType&&"BODY"===tt.nodeName||"HTML"===tt.nodeName?ro=tt:ro.appendChild(tt);else{if(!yr&&!Si&&!ai&&-1===Co.indexOf("<"))return En&&ho?En.createHTML(Co):Co;if(!(ro=ls(Co)))return yr?null:mr}ro&&cr&&Da(ro.firstChild);for(var Pt=gs(xo?Co:ro);on=Pt.nextNode();)3===on.nodeType&&on===ne||Fo(on)||(on.content instanceof Ur&&ms(on.content),ks(on),ne=on);if(ne=null,xo)return Co;if(yr){if(rr)for($e=si.call(ro.ownerDocument);ro.firstChild;)$e.appendChild(ro.firstChild);else $e=ro;return ri&&($e=no.call(Hn,$e,!0)),$e}var sn=ai?ro.outerHTML:ro.innerHTML;return Si&&(sn=ue(sn,Dr," "),sn=ue(sn,jt," ")),En&&ho?En.createHTML(sn):sn},In.setConfig=function(Co){Ia(Co),Zn=!0},In.clearConfig=function(){qo=null,Zn=!1},In.isValidAttribute=function(Co,kr,ro){qo||Ia({});var tt=bs(Co),on=bs(kr);return Eo(tt,on,ro)},In.addHook=function(Co,kr){"function"==typeof kr&&(Ze[Co]=Ze[Co]||[],J(Ze[Co],kr))},In.removeHook=function(Co){Ze[Co]&&Z(Ze[Co])},In.removeHooks=function(Co){Ze[Co]&&(Ze[Co]=[])},In.removeAllHooks=function(){Ze={}},In}()}()},32582:v=>{"use strict";class S{constructor(u,p){this.low=u,this.high=p,this.length=1+p-u}overlaps(u){return!(this.high<u.low||this.low>u.high)}touches(u){return!(this.high+1<u.low||this.low-1>u.high)}add(u){return new S(Math.min(this.low,u.low),Math.max(this.high,u.high))}subtract(u){return u.low<=this.low&&u.high>=this.high?[]:u.low>this.low&&u.high<this.high?[new S(this.low,u.low-1),new S(u.high+1,this.high)]:u.low<=this.low?[new S(u.high+1,this.high)]:[new S(this.low,u.low-1)]}toString(){return this.low==this.high?this.low.toString():this.low+"-"+this.high}}class i{constructor(u,p){this.ranges=[],this.length=0,null!=u&&this.add(u,p)}_update_length(){this.length=this.ranges.reduce((u,p)=>u+p.length,0)}add(u,p){var f=e=>{for(var _=0;_<this.ranges.length&&!e.touches(this.ranges[_]);)_++;for(var y=this.ranges.slice(0,_);_<this.ranges.length&&e.touches(this.ranges[_]);)e=e.add(this.ranges[_]),_++;y.push(e),this.ranges=y.concat(this.ranges.slice(_)),this._update_length()};return u instanceof i?u.ranges.forEach(f):(null==p&&(p=u),f(new S(u,p))),this}subtract(u,p){var f=e=>{for(var _=0;_<this.ranges.length&&!e.overlaps(this.ranges[_]);)_++;for(var y=this.ranges.slice(0,_);_<this.ranges.length&&e.overlaps(this.ranges[_]);)y=y.concat(this.ranges[_].subtract(e)),_++;this.ranges=y.concat(this.ranges.slice(_)),this._update_length()};return u instanceof i?u.ranges.forEach(f):(null==p&&(p=u),f(new S(u,p))),this}intersect(u,p){var f=[],e=_=>{for(var y=0;y<this.ranges.length&&!_.overlaps(this.ranges[y]);)y++;for(;y<this.ranges.length&&_.overlaps(this.ranges[y]);){var T=Math.max(this.ranges[y].low,_.low),M=Math.min(this.ranges[y].high,_.high);f.push(new S(T,M)),y++}};return u instanceof i?u.ranges.forEach(e):(null==p&&(p=u),e(new S(u,p))),this.ranges=f,this._update_length(),this}index(u){for(var p=0;p<this.ranges.length&&this.ranges[p].length<=u;)u-=this.ranges[p].length,p++;return this.ranges[p].low+u}toString(){return"[ "+this.ranges.join(", ")+" ]"}clone(){return new i(this)}numbers(){return this.ranges.reduce((u,p)=>{for(var f=p.low;f<=p.high;)u.push(f),f++;return u},[])}subranges(){return this.ranges.map(u=>({low:u.low,high:u.high,length:1+u.high-u.low}))}}v.exports=i},11926:(v,S,i)=>{"use strict";var r=i(88430),u=p(Error);function p(f){return e.displayName=f.displayName||f.name,e;function e(_){return _&&(_=r.apply(null,arguments)),new f(_)}}v.exports=u,u.eval=p(EvalError),u.range=p(RangeError),u.reference=p(ReferenceError),u.syntax=p(SyntaxError),u.type=p(TypeError),u.uri=p(URIError),u.create=p},49457:function(v,S){var i,u;void 0!==(u="function"==typeof(i=function(){"use strict";function f(M,R,F){var Z=new XMLHttpRequest;Z.open("GET",M),Z.responseType="blob",Z.onload=function(){T(Z.response,R,F)},Z.onerror=function(){console.error("could not download file")},Z.send()}function e(M){var R=new XMLHttpRequest;R.open("HEAD",M,!1);try{R.send()}catch(F){}return 200<=R.status&&299>=R.status}function _(M){try{M.dispatchEvent(new MouseEvent("click"))}catch(F){var R=document.createEvent("MouseEvents");R.initMouseEvent("click",!0,!0,window,0,0,0,80,20,!1,!1,!1,!1,0,null),M.dispatchEvent(R)}}var y="object"==typeof window&&window.window===window?window:"object"==typeof self&&self.self===self?self:"object"==typeof global&&global.global===global?global:void 0,T=y.saveAs||("object"!=typeof window||window!==y?function(){}:"download"in HTMLAnchorElement.prototype?function(M,R,F){var Z=y.URL||y.webkitURL,J=document.createElement("a");J.download=R=R||M.name||"download",J.rel="noopener","string"==typeof M?(J.href=M,J.origin===location.origin?_(J):e(J.href)?f(M,R,F):_(J,J.target="_blank")):(J.href=Z.createObjectURL(M),setTimeout(function(){Z.revokeObjectURL(J.href)},4e4),setTimeout(function(){_(J)},0))}:"msSaveOrOpenBlob"in navigator?function(M,R,F){if(R=R||M.name||"download","string"!=typeof M)navigator.msSaveOrOpenBlob(function(M,R){return void 0===R?R={autoBom:!1}:"object"!=typeof R&&(console.warn("Deprecated: Expected third argument to be a object"),R={autoBom:!R}),R.autoBom&&/^\s*(?:text\/\S*|application\/xml|\S*\/\S*\+xml)\s*;.*charset\s*=\s*utf-8/i.test(M.type)?new Blob(["\ufeff",M],{type:M.type}):M}(M,F),R);else if(e(M))f(M,R,F);else{var Z=document.createElement("a");Z.href=M,Z.target="_blank",setTimeout(function(){_(Z)})}}:function(M,R,F,Z){if((Z=Z||open("","_blank"))&&(Z.document.title=Z.document.body.innerText="downloading..."),"string"==typeof M)return f(M,R,F);var J="application/octet-stream"===M.type,Q=/constructor/i.test(y.HTMLElement)||y.safari,ee=/CriOS\/[\d]+/.test(navigator.userAgent);if((ee||J&&Q)&&"object"==typeof FileReader){var ue=new FileReader;ue.onloadend=function(){var se=ue.result;se=ee?se:se.replace(/^data:[^;]*;/,"data:attachment/file;"),Z?Z.location.href=se:location=se,Z=null},ue.readAsDataURL(M)}else{var ae=y.URL||y.webkitURL,$=ae.createObjectURL(M);Z?Z.location=$:location.href=$,Z=null,setTimeout(function(){ae.revokeObjectURL($)},4e4)}});y.saveAs=T.saveAs=T,v.exports=T})?i.apply(S,[]):i)&&(v.exports=u)},88430:v=>{!function(){var S;function u(p){for(var M,F,Z,Q,f=1,e=[].slice.call(arguments),_=0,y=p.length,T="",R=!1,J=!1,ee=function(){return e[f++]},ue=function(){for(var ae="";/\d/.test(p[_]);)ae+=p[_++],M=p[_];return ae.length>0?parseInt(ae):null};_<y;++_)if(M=p[_],R)switch(R=!1,"."==M?(J=!1,M=p[++_]):"0"==M&&"."==p[_+1]?(J=!0,_+=2,M=p[_]):J=!0,Q=ue(),M){case"b":T+=parseInt(ee(),10).toString(2);break;case"c":T+="string"==typeof(F=ee())||F instanceof String?F:String.fromCharCode(parseInt(F,10));break;case"d":T+=parseInt(ee(),10);break;case"f":Z=String(parseFloat(ee()).toFixed(Q||6)),T+=J?Z:Z.replace(/^0/,"");break;case"j":T+=JSON.stringify(ee());break;case"o":T+="0"+parseInt(ee(),10).toString(8);break;case"s":T+=ee();break;case"x":T+="0x"+parseInt(ee(),10).toString(16);break;case"X":T+="0x"+parseInt(ee(),10).toString(16).toUpperCase();break;default:T+=M}else"%"===M?R=!0:T+=M;return T}(S=v.exports=u).format=u,S.vsprintf=function(p,f){return u.apply(null,[p].concat(f))},"undefined"!=typeof console&&"function"==typeof console.log&&(S.printf=function(){console.log(u.apply(null,arguments))})}()},31609:v=>{"use strict";var S="Function.prototype.bind called on incompatible ",i=Array.prototype.slice,r=Object.prototype.toString,u="[object Function]";v.exports=function(f){var e=this;if("function"!=typeof e||r.call(e)!==u)throw new TypeError(S+e);for(var y,_=i.call(arguments,1),T=function(){if(this instanceof y){var J=e.apply(this,_.concat(i.call(arguments)));return Object(J)===J?J:this}return e.apply(f,_.concat(i.call(arguments)))},M=Math.max(0,e.length-_.length),R=[],F=0;F<M;F++)R.push("$"+F);if(y=Function("binder","return function ("+R.join(",")+"){ return binder.apply(this,arguments); }")(T),e.prototype){var Z=function(){};Z.prototype=e.prototype,y.prototype=new Z,Z.prototype=null}return y}},75396:(v,S,i)=>{"use strict";var r=i(31609);v.exports=Function.prototype.bind||r},18540:(v,S,i)=>{"use strict";var r,u=SyntaxError,p=Function,f=TypeError,e=function(ze){try{return p('"use strict"; return ('+ze+").constructor;")()}catch(Ye){}},_=Object.getOwnPropertyDescriptor;if(_)try{_({},"")}catch(ze){_=null}var y=function(){throw new f},T=_?function(){try{return y}catch(ze){try{return _(arguments,"callee").get}catch(Ye){return y}}}():y,M=i(59326)(),R=Object.getPrototypeOf||function(ze){return ze.__proto__},F={},Z="undefined"==typeof Uint8Array?r:R(Uint8Array),J={"%AggregateError%":"undefined"==typeof AggregateError?r:AggregateError,"%Array%":Array,"%ArrayBuffer%":"undefined"==typeof ArrayBuffer?r:ArrayBuffer,"%ArrayIteratorPrototype%":M?R([][Symbol.iterator]()):r,"%AsyncFromSyncIteratorPrototype%":r,"%AsyncFunction%":F,"%AsyncGenerator%":F,"%AsyncGeneratorFunction%":F,"%AsyncIteratorPrototype%":F,"%Atomics%":"undefined"==typeof Atomics?r:Atomics,"%BigInt%":"undefined"==typeof BigInt?r:BigInt,"%Boolean%":Boolean,"%DataView%":"undefined"==typeof DataView?r:DataView,"%Date%":Date,"%decodeURI%":decodeURI,"%decodeURIComponent%":decodeURIComponent,"%encodeURI%":encodeURI,"%encodeURIComponent%":encodeURIComponent,"%Error%":Error,"%eval%":eval,"%EvalError%":EvalError,"%Float32Array%":"undefined"==typeof Float32Array?r:Float32Array,"%Float64Array%":"undefined"==typeof Float64Array?r:Float64Array,"%FinalizationRegistry%":"undefined"==typeof FinalizationRegistry?r:FinalizationRegistry,"%Function%":p,"%GeneratorFunction%":F,"%Int8Array%":"undefined"==typeof Int8Array?r:Int8Array,"%Int16Array%":"undefined"==typeof Int16Array?r:Int16Array,"%Int32Array%":"undefined"==typeof Int32Array?r:Int32Array,"%isFinite%":isFinite,"%isNaN%":isNaN,"%IteratorPrototype%":M?R(R([][Symbol.iterator]())):r,"%JSON%":"object"==typeof JSON?JSON:r,"%Map%":"undefined"==typeof Map?r:Map,"%MapIteratorPrototype%":"undefined"!=typeof Map&&M?R((new Map)[Symbol.iterator]()):r,"%Math%":Math,"%Number%":Number,"%Object%":Object,"%parseFloat%":parseFloat,"%parseInt%":parseInt,"%Promise%":"undefined"==typeof Promise?r:Promise,"%Proxy%":"undefined"==typeof Proxy?r:Proxy,"%RangeError%":RangeError,"%ReferenceError%":ReferenceError,"%Reflect%":"undefined"==typeof Reflect?r:Reflect,"%RegExp%":RegExp,"%Set%":"undefined"==typeof Set?r:Set,"%SetIteratorPrototype%":"undefined"!=typeof Set&&M?R((new Set)[Symbol.iterator]()):r,"%SharedArrayBuffer%":"undefined"==typeof SharedArrayBuffer?r:SharedArrayBuffer,"%String%":String,"%StringIteratorPrototype%":M?R(""[Symbol.iterator]()):r,"%Symbol%":M?Symbol:r,"%SyntaxError%":u,"%ThrowTypeError%":T,"%TypedArray%":Z,"%TypeError%":f,"%Uint8Array%":"undefined"==typeof Uint8Array?r:Uint8Array,"%Uint8ClampedArray%":"undefined"==typeof Uint8ClampedArray?r:Uint8ClampedArray,"%Uint16Array%":"undefined"==typeof Uint16Array?r:Uint16Array,"%Uint32Array%":"undefined"==typeof Uint32Array?r:Uint32Array,"%URIError%":URIError,"%WeakMap%":"undefined"==typeof WeakMap?r:WeakMap,"%WeakRef%":"undefined"==typeof WeakRef?r:WeakRef,"%WeakSet%":"undefined"==typeof WeakSet?r:WeakSet},Q=function ze(Ye){var je;if("%AsyncFunction%"===Ye)je=e("async function () {}");else if("%GeneratorFunction%"===Ye)je=e("function* () {}");else if("%AsyncGeneratorFunction%"===Ye)je=e("async function* () {}");else if("%AsyncGenerator%"===Ye){var Ie=ze("%AsyncGeneratorFunction%");Ie&&(je=Ie.prototype)}else if("%AsyncIteratorPrototype%"===Ye){var Ve=ze("%AsyncGenerator%");Ve&&(je=R(Ve.prototype))}return J[Ye]=je,je},ee={"%ArrayBufferPrototype%":["ArrayBuffer","prototype"],"%ArrayPrototype%":["Array","prototype"],"%ArrayProto_entries%":["Array","prototype","entries"],"%ArrayProto_forEach%":["Array","prototype","forEach"],"%ArrayProto_keys%":["Array","prototype","keys"],"%ArrayProto_values%":["Array","prototype","values"],"%AsyncFunctionPrototype%":["AsyncFunction","prototype"],"%AsyncGenerator%":["AsyncGeneratorFunction","prototype"],"%AsyncGeneratorPrototype%":["AsyncGeneratorFunction","prototype","prototype"],"%BooleanPrototype%":["Boolean","prototype"],"%DataViewPrototype%":["DataView","prototype"],"%DatePrototype%":["Date","prototype"],"%ErrorPrototype%":["Error","prototype"],"%EvalErrorPrototype%":["EvalError","prototype"],"%Float32ArrayPrototype%":["Float32Array","prototype"],"%Float64ArrayPrototype%":["Float64Array","prototype"],"%FunctionPrototype%":["Function","prototype"],"%Generator%":["GeneratorFunction","prototype"],"%GeneratorPrototype%":["GeneratorFunction","prototype","prototype"],"%Int8ArrayPrototype%":["Int8Array","prototype"],"%Int16ArrayPrototype%":["Int16Array","prototype"],"%Int32ArrayPrototype%":["Int32Array","prototype"],"%JSONParse%":["JSON","parse"],"%JSONStringify%":["JSON","stringify"],"%MapPrototype%":["Map","prototype"],"%NumberPrototype%":["Number","prototype"],"%ObjectPrototype%":["Object","prototype"],"%ObjProto_toString%":["Object","prototype","toString"],"%ObjProto_valueOf%":["Object","prototype","valueOf"],"%PromisePrototype%":["Promise","prototype"],"%PromiseProto_then%":["Promise","prototype","then"],"%Promise_all%":["Promise","all"],"%Promise_reject%":["Promise","reject"],"%Promise_resolve%":["Promise","resolve"],"%RangeErrorPrototype%":["RangeError","prototype"],"%ReferenceErrorPrototype%":["ReferenceError","prototype"],"%RegExpPrototype%":["RegExp","prototype"],"%SetPrototype%":["Set","prototype"],"%SharedArrayBufferPrototype%":["SharedArrayBuffer","prototype"],"%StringPrototype%":["String","prototype"],"%SymbolPrototype%":["Symbol","prototype"],"%SyntaxErrorPrototype%":["SyntaxError","prototype"],"%TypedArrayPrototype%":["TypedArray","prototype"],"%TypeErrorPrototype%":["TypeError","prototype"],"%Uint8ArrayPrototype%":["Uint8Array","prototype"],"%Uint8ClampedArrayPrototype%":["Uint8ClampedArray","prototype"],"%Uint16ArrayPrototype%":["Uint16Array","prototype"],"%Uint32ArrayPrototype%":["Uint32Array","prototype"],"%URIErrorPrototype%":["URIError","prototype"],"%WeakMapPrototype%":["WeakMap","prototype"],"%WeakSetPrototype%":["WeakSet","prototype"]},ue=i(75396),ae=i(57709),$=ue.call(Function.call,Array.prototype.concat),se=ue.call(Function.apply,Array.prototype.splice),ve=ue.call(Function.call,String.prototype.replace),oe=ue.call(Function.call,String.prototype.slice),he=ue.call(Function.call,RegExp.prototype.exec),me=/[^%.[\]]+|\[(?:(-?\d+(?:\.\d+)?)|(["'])((?:(?!\2)[^\\]|\\.)*?)\2)\]|(?=(?:\.|\[\])(?:\.|\[\]|%$))/g,Oe=/\\(\\)?/g,ce=function(Ye){var je=oe(Ye,0,1),Ie=oe(Ye,-1);if("%"===je&&"%"!==Ie)throw new u("invalid intrinsic syntax, expected closing `%`");if("%"===Ie&&"%"!==je)throw new u("invalid intrinsic syntax, expected opening `%`");var Ve=[];return ve(Ye,me,function(He,Zt,st,en){Ve[Ve.length]=st?ve(en,Oe,"$1"):Zt||He}),Ve},dt=function(Ye,je){var Ve,Ie=Ye;if(ae(ee,Ie)&&(Ie="%"+(Ve=ee[Ie])[0]+"%"),ae(J,Ie)){var He=J[Ie];if(He===F&&(He=Q(Ie)),void 0===He&&!je)throw new f("intrinsic "+Ye+" exists, but is not available. Please file an issue!");return{alias:Ve,name:Ie,value:He}}throw new u("intrinsic "+Ye+" does not exist!")};v.exports=function(Ye,je){if("string"!=typeof Ye||0===Ye.length)throw new f("intrinsic name must be a non-empty string");if(arguments.length>1&&"boolean"!=typeof je)throw new f('"allowMissing" argument must be a boolean');if(null===he(/^%?[^%]*%?$/g,Ye))throw new u("`%` may not be present anywhere but at the beginning and end of the intrinsic name");var Ie=ce(Ye),Ve=Ie.length>0?Ie[0]:"",He=dt("%"+Ve+"%",je),Zt=He.name,st=He.value,en=!1,$t=He.alias;$t&&(Ve=$t[0],se(Ie,$([0,1],$t)));for(var Gt=1,Ut=!0;Gt<Ie.length;Gt+=1){var Bt=Ie[Gt],mt=oe(Bt,0,1),Yt=oe(Bt,-1);if(('"'===mt||"'"===mt||"`"===mt||'"'===Yt||"'"===Yt||"`"===Yt)&&mt!==Yt)throw new u("property names with quotes must have matching quotes");if(("constructor"===Bt||!Ut)&&(en=!0),ae(J,Zt="%"+(Ve+="."+Bt)+"%"))st=J[Zt];else if(null!=st){if(!(Bt in st)){if(!je)throw new f("base intrinsic for "+Ye+" exists, but the property is not available.");return}if(_&&Gt+1>=Ie.length){var Dt=_(st,Bt);st=(Ut=!!Dt)&&"get"in Dt&&!("originalValue"in Dt.get)?Dt.get:st[Bt]}else Ut=ae(st,Bt),st=st[Bt];Ut&&!en&&(J[Zt]=st)}}return st}},59326:(v,S,i)=>{"use strict";var r="undefined"!=typeof Symbol&&Symbol,u=i(79045);v.exports=function(){return"function"==typeof r&&"function"==typeof Symbol&&"symbol"==typeof r("foo")&&"symbol"==typeof Symbol("bar")&&u()}},79045:v=>{"use strict";v.exports=function(){if("function"!=typeof Symbol||"function"!=typeof Object.getOwnPropertySymbols)return!1;if("symbol"==typeof Symbol.iterator)return!0;var i={},r=Symbol("test"),u=Object(r);if("string"==typeof r||"[object Symbol]"!==Object.prototype.toString.call(r)||"[object Symbol]"!==Object.prototype.toString.call(u))return!1;for(r in i[r]=42,i)return!1;if("function"==typeof Object.keys&&0!==Object.keys(i).length||"function"==typeof Object.getOwnPropertyNames&&0!==Object.getOwnPropertyNames(i).length)return!1;var f=Object.getOwnPropertySymbols(i);if(1!==f.length||f[0]!==r||!Object.prototype.propertyIsEnumerable.call(i,r))return!1;if("function"==typeof Object.getOwnPropertyDescriptor){var e=Object.getOwnPropertyDescriptor(i,r);if(42!==e.value||!0!==e.enumerable)return!1}return!0}},57709:(v,S,i)=>{"use strict";var r=i(75396);v.exports=r.call(Function.call,Object.prototype.hasOwnProperty)},7856:v=>{function S(Xt){return Xt instanceof Map?Xt.clear=Xt.delete=Xt.set=function(){throw new Error("map is read-only")}:Xt instanceof Set&&(Xt.add=Xt.clear=Xt.delete=function(){throw new Error("set is read-only")}),Object.freeze(Xt),Object.getOwnPropertyNames(Xt).forEach(function(zn){var vr=Xt[zn];"object"==typeof vr&&!Object.isFrozen(vr)&&S(vr)}),Xt}var i=S;i.default=S;class u{constructor(zn){void 0===zn.data&&(zn.data={}),this.data=zn.data,this.isMatchIgnored=!1}ignoreMatch(){this.isMatchIgnored=!0}}function p(Xt){return Xt.replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;").replace(/"/g,"&quot;").replace(/'/g,"&#x27;")}function f(Xt,...zn){const vr=Object.create(null);for(const si in Xt)vr[si]=Xt[si];return zn.forEach(function(si){for(const Ii in si)vr[Ii]=si[Ii]}),vr}const _=Xt=>!!Xt.kind;class y{constructor(zn,vr){this.buffer="",this.classPrefix=vr.classPrefix,zn.walk(this)}addText(zn){this.buffer+=p(zn)}openNode(zn){if(!_(zn))return;let vr=zn.kind;zn.sublanguage||(vr=`${this.classPrefix}${vr}`),this.span(vr)}closeNode(zn){!_(zn)||(this.buffer+="</span>")}value(){return this.buffer}span(zn){this.buffer+=`<span class="${zn}">`}}class T{constructor(){this.rootNode={children:[]},this.stack=[this.rootNode]}get top(){return this.stack[this.stack.length-1]}get root(){return this.rootNode}add(zn){this.top.children.push(zn)}openNode(zn){const vr={kind:zn,children:[]};this.add(vr),this.stack.push(vr)}closeNode(){if(this.stack.length>1)return this.stack.pop()}closeAllNodes(){for(;this.closeNode(););}toJSON(){return JSON.stringify(this.rootNode,null,4)}walk(zn){return this.constructor._walk(zn,this.rootNode)}static _walk(zn,vr){return"string"==typeof vr?zn.addText(vr):vr.children&&(zn.openNode(vr),vr.children.forEach(si=>this._walk(zn,si)),zn.closeNode(vr)),zn}static _collapse(zn){"string"!=typeof zn&&(!zn.children||(zn.children.every(vr=>"string"==typeof vr)?zn.children=[zn.children.join("")]:zn.children.forEach(vr=>{T._collapse(vr)})))}}class M extends T{constructor(zn){super(),this.options=zn}addKeyword(zn,vr){""!==zn&&(this.openNode(vr),this.addText(zn),this.closeNode())}addText(zn){""!==zn&&this.add(zn)}addSublanguage(zn,vr){const si=zn.root;si.kind=vr,si.sublanguage=!0,this.add(si)}toHTML(){return new y(this,this.options).value()}finalize(){return!0}}function F(Xt){return Xt?"string"==typeof Xt?Xt:Xt.source:null}const ue=/\[(?:[^\\\]]|\\.)*\]|\(\??|\\([1-9][0-9]*)|\\./,se="[a-zA-Z]\\w*",ve="[a-zA-Z_]\\w*",oe="\\b\\d+(\\.\\d+)?",he="(-?)(\\b0[xX][a-fA-F0-9]+|(\\b\\d+(\\.\\d*)?|\\.\\d+)([eE][-+]?\\d+)?)",me="\\b(0b[01]+)",dt={begin:"\\\\[\\s\\S]",relevance:0},ze={className:"string",begin:"'",end:"'",illegal:"\\n",contains:[dt]},Ye={className:"string",begin:'"',end:'"',illegal:"\\n",contains:[dt]},je={begin:/\b(a|an|the|are|I'm|isn't|don't|doesn't|won't|but|just|should|pretty|simply|enough|gonna|going|wtf|so|such|will|you|your|they|like|more)\b/},Ie=function(Xt,zn,vr={}){const si=f({className:"comment",begin:Xt,end:zn,contains:[]},vr);return si.contains.push(je),si.contains.push({className:"doctag",begin:"(?:TODO|FIXME|NOTE|BUG|OPTIMIZE|HACK|XXX):",relevance:0}),si},Ve=Ie("//","$"),He=Ie("/\\*","\\*/"),Zt=Ie("#","$");var zt=Object.freeze({__proto__:null,MATCH_NOTHING_RE:/\b\B/,IDENT_RE:se,UNDERSCORE_IDENT_RE:ve,NUMBER_RE:oe,C_NUMBER_RE:he,BINARY_NUMBER_RE:me,RE_STARTERS_RE:"!|!=|!==|%|%=|&|&&|&=|\\*|\\*=|\\+|\\+=|,|-|-=|/=|/|:|;|<<|<<=|<=|<|===|==|=|>>>=|>>=|>=|>>>|>>|>|\\?|\\[|\\{|\\(|\\^|\\^=|\\||\\|=|\\|\\||~",SHEBANG:(Xt={})=>{const zn=/^#![ ]*\//;return Xt.binary&&(Xt.begin=function(...Xt){return Xt.map(vr=>F(vr)).join("")}(zn,/.*\b/,Xt.binary,/\b.*/)),f({className:"meta",begin:zn,end:/$/,relevance:0,"on:begin":(vr,si)=>{0!==vr.index&&si.ignoreMatch()}},Xt)},BACKSLASH_ESCAPE:dt,APOS_STRING_MODE:ze,QUOTE_STRING_MODE:Ye,PHRASAL_WORDS_MODE:je,COMMENT:Ie,C_LINE_COMMENT_MODE:Ve,C_BLOCK_COMMENT_MODE:He,HASH_COMMENT_MODE:Zt,NUMBER_MODE:{className:"number",begin:oe,relevance:0},C_NUMBER_MODE:{className:"number",begin:he,relevance:0},BINARY_NUMBER_MODE:{className:"number",begin:me,relevance:0},CSS_NUMBER_MODE:{className:"number",begin:oe+"(%|em|ex|ch|rem|vw|vh|vmin|vmax|cm|mm|in|pt|pc|px|deg|grad|rad|turn|s|ms|Hz|kHz|dpi|dpcm|dppx)?",relevance:0},REGEXP_MODE:{begin:/(?=\/[^/\n]*\/)/,contains:[{className:"regexp",begin:/\//,end:/\/[gimuy]*/,illegal:/\n/,contains:[dt,{begin:/\[/,end:/\]/,relevance:0,contains:[dt]}]}]},TITLE_MODE:{className:"title",begin:se,relevance:0},UNDERSCORE_TITLE_MODE:{className:"title",begin:ve,relevance:0},METHOD_GUARD:{begin:"\\.\\s*"+ve,relevance:0},END_SAME_AS_BEGIN:function(Xt){return Object.assign(Xt,{"on:begin":(zn,vr)=>{vr.data._beginMatch=zn[1]},"on:end":(zn,vr)=>{vr.data._beginMatch!==zn[1]&&vr.ignoreMatch()}})}});function Yn(Xt,zn){"."===Xt.input[Xt.index-1]&&zn.ignoreMatch()}function Hr(Xt,zn){!zn||!Xt.beginKeywords||(Xt.begin="\\b("+Xt.beginKeywords.split(" ").join("|")+")(?!\\.)(?=\\b|\\s)",Xt.__beforeBegin=Yn,Xt.keywords=Xt.keywords||Xt.beginKeywords,delete Xt.beginKeywords,void 0===Xt.relevance&&(Xt.relevance=0))}function ci(Xt,zn){!Array.isArray(Xt.illegal)||(Xt.illegal=function(...Xt){return"("+Xt.map(vr=>F(vr)).join("|")+")"}(...Xt.illegal))}function Ir(Xt,zn){if(Xt.match){if(Xt.begin||Xt.end)throw new Error("begin & end are not supported with match");Xt.begin=Xt.match,delete Xt.match}}function wr(Xt,zn){void 0===Xt.relevance&&(Xt.relevance=1)}const Qr=["of","and","for","in","not","or","if","then","parent","list","value"];function In(Xt,zn,vr="keyword"){const si={};return"string"==typeof Xt?Ii(vr,Xt.split(" ")):Array.isArray(Xt)?Ii(vr,Xt):Object.keys(Xt).forEach(function(no){Object.assign(si,In(Xt[no],zn,no))}),si;function Ii(no,so){zn&&(so=so.map(Ze=>Ze.toLowerCase())),so.forEach(function(Ze){const Dr=Ze.split("|");si[Dr[0]]=[no,Hn(Dr[0],Dr[1])]})}}function Hn(Xt,zn){return zn?Number(zn):function(Xt){return Qr.includes(Xt.toLowerCase())}(Xt)?0:1}function Ur(Xt,{}){function vr(Ze,Dr){return new RegExp(F(Ze),"m"+(Xt.case_insensitive?"i":"")+(Dr?"g":""))}class si{constructor(){this.matchIndexes={},this.regexes=[],this.matchAt=1,this.position=0}addRule(Dr,jt){jt.position=this.position++,this.matchIndexes[this.matchAt]=jt,this.regexes.push([jt,Dr]),this.matchAt+=function(Xt){return new RegExp(Xt.toString()+"|").exec("").length-1}(Dr)+1}compile(){0===this.regexes.length&&(this.exec=()=>null);const Dr=this.regexes.map(jt=>jt[1]);this.matcherRe=vr(function(Xt,zn="|"){let vr=0;return Xt.map(si=>{vr+=1;const Ii=vr;let no=F(si),so="";for(;no.length>0;){const Ze=ue.exec(no);if(!Ze){so+=no;break}so+=no.substring(0,Ze.index),no=no.substring(Ze.index+Ze[0].length),"\\"===Ze[0][0]&&Ze[1]?so+="\\"+String(Number(Ze[1])+Ii):(so+=Ze[0],"("===Ze[0]&&vr++)}return so}).map(si=>`(${si})`).join(zn)}(Dr),!0),this.lastIndex=0}exec(Dr){this.matcherRe.lastIndex=this.lastIndex;const jt=this.matcherRe.exec(Dr);if(!jt)return null;const xt=jt.findIndex((Wn,kn)=>kn>0&&void 0!==Wn),mn=this.matchIndexes[xt];return jt.splice(0,xt),Object.assign(jt,mn)}}class Ii{constructor(){this.rules=[],this.multiRegexes=[],this.count=0,this.lastIndex=0,this.regexIndex=0}getMatcher(Dr){if(this.multiRegexes[Dr])return this.multiRegexes[Dr];const jt=new si;return this.rules.slice(Dr).forEach(([xt,mn])=>jt.addRule(xt,mn)),jt.compile(),this.multiRegexes[Dr]=jt,jt}resumingScanAtSamePosition(){return 0!==this.regexIndex}considerAll(){this.regexIndex=0}addRule(Dr,jt){this.rules.push([Dr,jt]),"begin"===jt.type&&this.count++}exec(Dr){const jt=this.getMatcher(this.regexIndex);jt.lastIndex=this.lastIndex;let xt=jt.exec(Dr);if(this.resumingScanAtSamePosition()&&(!xt||xt.index!==this.lastIndex)){const mn=this.getMatcher(0);mn.lastIndex=this.lastIndex+1,xt=mn.exec(Dr)}return xt&&(this.regexIndex+=xt.position+1,this.regexIndex===this.count&&this.considerAll()),xt}}if(Xt.compilerExtensions||(Xt.compilerExtensions=[]),Xt.contains&&Xt.contains.includes("self"))throw new Error("ERR: contains `self` is not supported at the top-level of a language.  See documentation.");return Xt.classNameAliases=f(Xt.classNameAliases||{}),function so(Ze,Dr){const jt=Ze;if(Ze.isCompiled)return jt;[Ir].forEach(mn=>mn(Ze,Dr)),Xt.compilerExtensions.forEach(mn=>mn(Ze,Dr)),Ze.__beforeBegin=null,[Hr,ci,wr].forEach(mn=>mn(Ze,Dr)),Ze.isCompiled=!0;let xt=null;if("object"==typeof Ze.keywords&&(xt=Ze.keywords.$pattern,delete Ze.keywords.$pattern),Ze.keywords&&(Ze.keywords=In(Ze.keywords,Xt.case_insensitive)),Ze.lexemes&&xt)throw new Error("ERR: Prefer `keywords.$pattern` to `mode.lexemes`, BOTH are not allowed. (see mode reference) ");return xt=xt||Ze.lexemes||/\w+/,jt.keywordPatternRe=vr(xt,!0),Dr&&(Ze.begin||(Ze.begin=/\B|\b/),jt.beginRe=vr(Ze.begin),Ze.endSameAsBegin&&(Ze.end=Ze.begin),!Ze.end&&!Ze.endsWithParent&&(Ze.end=/\B|\b/),Ze.end&&(jt.endRe=vr(Ze.end)),jt.terminatorEnd=F(Ze.end)||"",Ze.endsWithParent&&Dr.terminatorEnd&&(jt.terminatorEnd+=(Ze.end?"|":"")+Dr.terminatorEnd)),Ze.illegal&&(jt.illegalRe=vr(Ze.illegal)),Ze.contains||(Ze.contains=[]),Ze.contains=[].concat(...Ze.contains.map(function(mn){return function(Xt){return Xt.variants&&!Xt.cachedVariants&&(Xt.cachedVariants=Xt.variants.map(function(zn){return f(Xt,{variants:null},zn)})),Xt.cachedVariants?Xt.cachedVariants:di(Xt)?f(Xt,{starts:Xt.starts?f(Xt.starts):null}):Object.isFrozen(Xt)?f(Xt):Xt}("self"===mn?Ze:mn)})),Ze.contains.forEach(function(mn){so(mn,jt)}),Ze.starts&&so(Ze.starts,Dr),jt.matcher=function(Ze){const Dr=new Ii;return Ze.contains.forEach(jt=>Dr.addRule(jt.begin,{rule:jt,type:"begin"})),Ze.terminatorEnd&&Dr.addRule(Ze.terminatorEnd,{type:"end"}),Ze.illegal&&Dr.addRule(Ze.illegal,{type:"illegal"}),Dr}(jt),jt}(Xt)}function di(Xt){return!!Xt&&(Xt.endsWithParent||di(Xt.starts))}function On(Xt){const zn={props:["language","code","autodetect"],data:function(){return{detectedLanguage:"",unknownLanguage:!1}},computed:{className(){return this.unknownLanguage?"":"hljs "+this.detectedLanguage},highlighted(){if(!this.autoDetect&&!Xt.getLanguage(this.language))return console.warn(`The language "${this.language}" you specified could not be found.`),this.unknownLanguage=!0,p(this.code);let si={};return this.autoDetect?(si=Xt.highlightAuto(this.code),this.detectedLanguage=si.language):(si=Xt.highlight(this.language,this.code,this.ignoreIllegals),this.detectedLanguage=this.language),si.value},autoDetect(){return!this.language||function(Xt){return Boolean(Xt||""===Xt)}(this.autodetect)},ignoreIllegals:()=>!0},render(si){return si("pre",{},[si("code",{class:this.className,domProps:{innerHTML:this.highlighted}})])}};return{Component:zn,VuePlugin:{install(si){si.component("highlightjs",zn)}}}}const Wt={"after:highlightElement":({el:Xt,result:zn,text:vr})=>{const si=ir(Xt);if(!si.length)return;const Ii=document.createElement("div");Ii.innerHTML=zn.value,zn.value=function(Xt,zn,vr){let si=0,Ii="";const no=[];function so(){return Xt.length&&zn.length?Xt[0].offset!==zn[0].offset?Xt[0].offset<zn[0].offset?Xt:zn:"start"===zn[0].event?Xt:zn:Xt.length?Xt:zn}function Ze(xt){Ii+="<"+Jn(xt)+[].map.call(xt.attributes,function(Wn){return" "+Wn.nodeName+'="'+p(Wn.value)+'"'}).join("")+">"}function Dr(xt){Ii+="</"+Jn(xt)+">"}function jt(xt){("start"===xt.event?Ze:Dr)(xt.node)}for(;Xt.length||zn.length;){let xt=so();if(Ii+=p(vr.substring(si,xt[0].offset)),si=xt[0].offset,xt===Xt){no.reverse().forEach(Dr);do{jt(xt.splice(0,1)[0]),xt=so()}while(xt===Xt&&xt.length&&xt[0].offset===si);no.reverse().forEach(Ze)}else"start"===xt[0].event?no.push(xt[0].node):no.pop(),jt(xt.splice(0,1)[0])}return Ii+p(vr.substr(si))}(si,ir(Ii),vr)}};function Jn(Xt){return Xt.nodeName.toLowerCase()}function ir(Xt){const zn=[];return function vr(si,Ii){for(let no=si.firstChild;no;no=no.nextSibling)3===no.nodeType?Ii+=no.nodeValue.length:1===no.nodeType&&(zn.push({event:"start",offset:Ii,node:no}),Ii=vr(no,Ii),Jn(no).match(/br|hr|img|input/)||zn.push({event:"stop",offset:Ii,node:no}));return Ii}(Xt,0),zn}const Vn={},zr=Xt=>{console.error(Xt)},hi=(Xt,...zn)=>{console.log(`WARN: ${Xt}`,...zn)},Ai=(Xt,zn)=>{Vn[`${Xt}/${zn}`]||(console.log(`Deprecated as of ${Xt}. ${zn}`),Vn[`${Xt}/${zn}`]=!0)},Tr=p,Nr=f,gn=Symbol("nomatch");var mr=function(Xt){const zn=Object.create(null),vr=Object.create(null),si=[];let Ii=!0;const no=/(^(<[^>]+>|\t|)+|\n)/gm,so="Could not find the language '{}', did you forget to load/include a language module?",Ze={disableAutodetect:!0,name:"Plain text",contains:[]};let Dr={noHighlightRe:/^(no-?highlight)$/i,languageDetectRe:/\blang(?:uage)?-([\w-]+)\b/i,classPrefix:"hljs-",tabReplace:null,useBR:!1,languages:null,__emitter:M};function jt(cn){return Dr.noHighlightRe.test(cn)}function mn(cn,Ct,pr,nn){let Cn="",br="";"object"==typeof Ct?(Cn=cn,pr=Ct.ignoreIllegals,br=Ct.language,nn=void 0):(Ai("10.7.0","highlight(lang, code, ...args) has been deprecated."),Ai("10.7.0","Please use highlight(code, options) instead.\nhttps://github.com/highlightjs/highlight.js/issues/2277"),br=cn,Cn=Ct);const zi={code:Cn,language:br};ar("before:highlight",zi);const Wo=zi.result?zi.result:Wn(zi.language,zi.code,pr,nn);return Wo.code=zi.code,ar("after:highlight",Wo),Wo}function Wn(cn,Ct,pr,nn){function Cn(Fo,Eo){const ks=Bs.case_insensitive?Eo[0].toLowerCase():Eo[0];return Object.prototype.hasOwnProperty.call(Fo.keywords,ks)&&Fo.keywords[ks]}function Wo(){null!=fo.subLanguage?function(){if(""===ls)return;let Fo=null;if("string"==typeof fo.subLanguage){if(!zn[fo.subLanguage])return void Ao.addText(ls);Fo=Wn(fo.subLanguage,ls,!0,Da[fo.subLanguage]),Da[fo.subLanguage]=Fo.top}else Fo=wn(ls,fo.subLanguage.length?fo.subLanguage:null);fo.relevance>0&&(gs+=Fo.relevance),Ao.addSublanguage(Fo.emitter,Fo.language)}():function(){if(!fo.keywords)return void Ao.addText(ls);let Fo=0;fo.keywordPatternRe.lastIndex=0;let Eo=fo.keywordPatternRe.exec(ls),ks="";for(;Eo;){ks+=ls.substring(Fo,Eo.index);const ms=Cn(fo,Eo);if(ms){const[Co,kr]=ms;Ao.addText(ks),ks="",gs+=kr,Co.startsWith("_")?ks+=Eo[0]:Ao.addKeyword(Eo[0],Bs.classNameAliases[Co]||Co)}else ks+=Eo[0];Fo=fo.keywordPatternRe.lastIndex,Eo=fo.keywordPatternRe.exec(ls)}ks+=ls.substr(Fo),Ao.addText(ks)}(),ls=""}function Do(Fo){return Fo.className&&Ao.openNode(Bs.classNameAliases[Fo.className]||Fo.className),fo=Object.create(Fo,{parent:{value:fo}}),fo}function Js(Fo,Eo,ks){let ms=function(Xt,zn){const vr=Xt&&Xt.exec(zn);return vr&&0===vr.index}(Fo.endRe,ks);if(ms){if(Fo["on:end"]){const Co=new u(Fo);Fo["on:end"](Eo,Co),Co.isMatchIgnored&&(ms=!1)}if(ms){for(;Fo.endsParent&&Fo.parent;)Fo=Fo.parent;return Fo}}if(Fo.endsWithParent)return Js(Fo.parent,Eo,ks)}function _s(Fo){return 0===fo.matcher.regexIndex?(ls+=Fo[0],1):(Qs=!0,0)}function qo(Fo){const Eo=Fo[0],ks=Ct.substr(Fo.index),ms=Js(fo,Fo,ks);if(!ms)return gn;const Co=fo;Co.skip?ls+=Eo:(Co.returnEnd||Co.excludeEnd||(ls+=Eo),Wo(),Co.excludeEnd&&(ls=Eo));do{fo.className&&Ao.closeNode(),!fo.skip&&!fo.subLanguage&&(gs+=fo.relevance),fo=fo.parent}while(fo!==ms.parent);return ms.starts&&(ms.endSameAsBegin&&(ms.starts.endRe=ms.endRe),Do(ms.starts)),Co.returnEnd?0:Eo.length}let Ia={};function pa(Fo,Eo){const ks=Eo&&Eo[0];if(ls+=Fo,null==ks)return Wo(),0;if("begin"===Ia.type&&"end"===Eo.type&&Ia.index===Eo.index&&""===ks){if(ls+=Ct.slice(Eo.index,Eo.index+1),!Ii){const ms=new Error("0 width match regex");throw ms.languageName=cn,ms.badRule=Ia.rule,ms}return 1}if(Ia=Eo,"begin"===Eo.type)return function(Fo){const Eo=Fo[0],ks=Fo.rule,ms=new u(ks),Co=[ks.__beforeBegin,ks["on:begin"]];for(const kr of Co)if(kr&&(kr(Fo,ms),ms.isMatchIgnored))return _s(Eo);return ks&&ks.endSameAsBegin&&(ks.endRe=function(Xt){return new RegExp(Xt.replace(/[-/\\^$*+?.()|[\]{}]/g,"\\$&"),"m")}(Eo)),ks.skip?ls+=Eo:(ks.excludeBegin&&(ls+=Eo),Wo(),!ks.returnBegin&&!ks.excludeBegin&&(ls=Eo)),Do(ks),ks.returnBegin?0:Eo.length}(Eo);if("illegal"===Eo.type&&!pr){const ms=new Error('Illegal lexeme "'+ks+'" for mode "'+(fo.className||"<unnamed>")+'"');throw ms.mode=fo,ms}if("end"===Eo.type){const ms=qo(Eo);if(ms!==gn)return ms}if("illegal"===Eo.type&&""===ks)return 1;if(pl>1e5&&pl>3*Eo.index)throw new Error("potential infinite loop, way more iterations than matches");return ls+=ks,ks.length}const Bs=ho(cn);if(!Bs)throw zr(so.replace("{}",cn)),new Error('Unknown language: "'+cn+'"');const Yl=Ur(Bs,{plugins:si});let yl="",fo=nn||Yl;const Da={},Ao=new Dr.__emitter(Dr);!function(){const Fo=[];for(let Eo=fo;Eo!==Bs;Eo=Eo.parent)Eo.className&&Fo.unshift(Eo.className);Fo.forEach(Eo=>Ao.openNode(Eo))}();let ls="",gs=0,Ra=0,pl=0,Qs=!1;try{for(fo.matcher.considerAll();;){pl++,Qs?Qs=!1:fo.matcher.considerAll(),fo.matcher.lastIndex=Ra;const Fo=fo.matcher.exec(Ct);if(!Fo)break;const ks=pa(Ct.substring(Ra,Fo.index),Fo);Ra=Fo.index+ks}return pa(Ct.substr(Ra)),Ao.closeAllNodes(),Ao.finalize(),yl=Ao.toHTML(),{relevance:Math.floor(gs),value:yl,language:cn,illegal:!1,emitter:Ao,top:fo}}catch(Fo){if(Fo.message&&Fo.message.includes("Illegal"))return{illegal:!0,illegalBy:{msg:Fo.message,context:Ct.slice(Ra-100,Ra+100),mode:Fo.mode},sofar:yl,relevance:0,value:Tr(Ct),emitter:Ao};if(Ii)return{illegal:!1,relevance:0,value:Tr(Ct),emitter:Ao,language:cn,top:fo,errorRaised:Fo};throw Fo}}function wn(cn,Ct){Ct=Ct||Dr.languages||Object.keys(zn);const pr=function(cn){const Ct={relevance:0,emitter:new Dr.__emitter(Dr),value:Tr(cn),illegal:!1,top:Ze};return Ct.emitter.addText(cn),Ct}(cn),nn=Ct.filter(ho).filter(Bo).map(Do=>Wn(Do,cn,!1));nn.unshift(pr);const Cn=nn.sort((Do,Js)=>{if(Do.relevance!==Js.relevance)return Js.relevance-Do.relevance;if(Do.language&&Js.language){if(ho(Do.language).supersetOf===Js.language)return 1;if(ho(Js.language).supersetOf===Do.language)return-1}return 0}),[br,zi]=Cn,Wo=br;return Wo.second_best=zi,Wo}const po={"before:highlightElement":({el:cn})=>{Dr.useBR&&(cn.innerHTML=cn.innerHTML.replace(/\n/g,"").replace(/<br[ /]*>/g,"\n"))},"after:highlightElement":({result:cn})=>{Dr.useBR&&(cn.value=cn.value.replace(/\n/g,"<br>"))}},yo=/^(<[^>]+>|\t)+/gm,Mo={"after:highlightElement":({result:cn})=>{Dr.tabReplace&&(cn.value=cn.value.replace(yo,Ct=>Ct.replace(/\t/g,Dr.tabReplace)))}};function Vi(cn){let Ct=null;const pr=function(cn){let Ct=cn.className+" ";Ct+=cn.parentNode?cn.parentNode.className:"";const pr=Dr.languageDetectRe.exec(Ct);if(pr){const nn=ho(pr[1]);return nn||(hi(so.replace("{}",pr[1])),hi("Falling back to no-highlight mode for this block.",cn)),nn?pr[1]:"no-highlight"}return Ct.split(/\s+/).find(nn=>jt(nn)||ho(nn))}(cn);if(jt(pr))return;ar("before:highlightElement",{el:cn,language:pr}),Ct=cn;const nn=Ct.textContent,Cn=pr?mn(nn,{language:pr,ignoreIllegals:!0}):wn(nn);ar("after:highlightElement",{el:cn,result:Cn,text:nn}),cn.innerHTML=Cn.value,function(cn,Ct,pr){const nn=Ct?vr[Ct]:pr;cn.classList.add("hljs"),nn&&cn.classList.add(nn)}(cn,pr,Cn.language),cn.result={language:Cn.language,re:Cn.relevance,relavance:Cn.relevance},Cn.second_best&&(cn.second_best={language:Cn.second_best.language,re:Cn.second_best.relevance,relavance:Cn.second_best.relevance})}const zo=()=>{zo.called||(zo.called=!0,Ai("10.6.0","initHighlighting() is deprecated.  Use highlightAll() instead."),document.querySelectorAll("pre code").forEach(Vi))};let Si=!1;function ai(){"loading"!==document.readyState?document.querySelectorAll("pre code").forEach(Vi):Si=!0}function ho(cn){return cn=(cn||"").toLowerCase(),zn[cn]||zn[vr[cn]]}function Ti(cn,{languageName:Ct}){"string"==typeof cn&&(cn=[cn]),cn.forEach(pr=>{vr[pr.toLowerCase()]=Ct})}function Bo(cn){const Ct=ho(cn);return Ct&&!Ct.disableAutodetect}function ar(cn,Ct){const pr=cn;si.forEach(function(nn){nn[pr]&&nn[pr](Ct)})}"undefined"!=typeof window&&window.addEventListener&&window.addEventListener("DOMContentLoaded",function(){Si&&ai()},!1),Object.assign(Xt,{highlight:mn,highlightAuto:wn,highlightAll:ai,fixMarkup:function(cn){return Ai("10.2.0","fixMarkup will be removed entirely in v11.0"),Ai("10.2.0","Please see https://github.com/highlightjs/highlight.js/issues/2534"),function(cn){return Dr.tabReplace||Dr.useBR?cn.replace(no,Ct=>"\n"===Ct?Dr.useBR?"<br>":Ct:Dr.tabReplace?Ct.replace(/\t/g,Dr.tabReplace):Ct):cn}(cn)},highlightElement:Vi,highlightBlock:function(cn){return Ai("10.7.0","highlightBlock will be removed entirely in v12.0"),Ai("10.7.0","Please use highlightElement now."),Vi(cn)},configure:function(cn){cn.useBR&&(Ai("10.3.0","'useBR' will be removed entirely in v11.0"),Ai("10.3.0","Please see https://github.com/highlightjs/highlight.js/issues/2559")),Dr=Nr(Dr,cn)},initHighlighting:zo,initHighlightingOnLoad:function(){Ai("10.6.0","initHighlightingOnLoad() is deprecated.  Use highlightAll() instead."),Si=!0},registerLanguage:function(cn,Ct){let pr=null;try{pr=Ct(Xt)}catch(nn){if(zr("Language definition for '{}' could not be registered.".replace("{}",cn)),!Ii)throw nn;zr(nn),pr=Ze}pr.name||(pr.name=cn),zn[cn]=pr,pr.rawDefinition=Ct.bind(null,Xt),pr.aliases&&Ti(pr.aliases,{languageName:cn})},unregisterLanguage:function(cn){delete zn[cn];for(const Ct of Object.keys(vr))vr[Ct]===cn&&delete vr[Ct]},listLanguages:function(){return Object.keys(zn)},getLanguage:ho,registerAliases:Ti,requireLanguage:function(cn){Ai("10.4.0","requireLanguage will be removed entirely in v11."),Ai("10.4.0","Please see https://github.com/highlightjs/highlight.js/pull/2844");const Ct=ho(cn);if(Ct)return Ct;throw new Error("The '{}' language is required, but not loaded.".replace("{}",cn))},autoDetection:Bo,inherit:Nr,addPlugin:function(cn){(function(cn){cn["before:highlightBlock"]&&!cn["before:highlightElement"]&&(cn["before:highlightElement"]=Ct=>{cn["before:highlightBlock"](Object.assign({block:Ct.el},Ct))}),cn["after:highlightBlock"]&&!cn["after:highlightElement"]&&(cn["after:highlightElement"]=Ct=>{cn["after:highlightBlock"](Object.assign({block:Ct.el},Ct))})})(cn),si.push(cn)},vuePlugin:On(Xt).VuePlugin}),Xt.debugMode=function(){Ii=!1},Xt.safeMode=function(){Ii=!0},Xt.versionString="10.7.3";for(const cn in zt)"object"==typeof zt[cn]&&i(zt[cn]);return Object.assign(Xt,zt),Xt.addPlugin(po),Xt.addPlugin(Wt),Xt.addPlugin(Mo),Xt}({});v.exports=mr},4357:v=>{function i(...u){return u.map(f=>function(u){return u?"string"==typeof u?u:u.source:null}(f)).join("")}v.exports=function(u){const p={},f={begin:/\$\{/,end:/\}/,contains:["self",{begin:/:-/,contains:[p]}]};Object.assign(p,{className:"variable",variants:[{begin:i(/\$[\w\d#@][\w\d_]*/,"(?![\\w\\d])(?![$])")},f]});const e={className:"subst",begin:/\$\(/,end:/\)/,contains:[u.BACKSLASH_ESCAPE]},_={begin:/<<-?\s*(?=\w+)/,starts:{contains:[u.END_SAME_AS_BEGIN({begin:/(\w+)/,end:/(\w+)/,className:"string"})]}},y={className:"string",begin:/"/,end:/"/,contains:[u.BACKSLASH_ESCAPE,p,e]};e.contains.push(y);const R={begin:/\$\(\(/,end:/\)\)/,contains:[{begin:/\d+#[0-9a-f]+/,className:"number"},u.NUMBER_MODE,p]},Z=u.SHEBANG({binary:`(${["fish","bash","zsh","sh","csh","ksh","tcsh","dash","scsh"].join("|")})`,relevance:10}),J={className:"function",begin:/\w[\w\d_]*\s*\(\s*\)\s*\{/,returnBegin:!0,contains:[u.inherit(u.TITLE_MODE,{begin:/\w[\w\d_]*/})],relevance:0};return{name:"Bash",aliases:["sh","zsh"],keywords:{$pattern:/\b[a-z._-]+\b/,keyword:"if then else elif fi for while in do done case esac function",literal:"true false",built_in:"break cd continue eval exec exit export getopts hash pwd readonly return shift test times trap umask unset alias bind builtin caller command declare echo enable help let local logout mapfile printf read readarray source type typeset ulimit unalias set shopt autoload bg bindkey bye cap chdir clone comparguments compcall compctl compdescribe compfiles compgroups compquote comptags comptry compvalues dirs disable disown echotc echoti emulate fc fg float functions getcap getln history integer jobs kill limit log noglob popd print pushd pushln rehash sched setcap setopt stat suspend ttyctl unfunction unhash unlimit unsetopt vared wait whence where which zcompile zformat zftp zle zmodload zparseopts zprof zpty zregexparse zsocket zstyle ztcp"},contains:[Z,u.SHEBANG(),J,R,u.HASH_COMMENT_MODE,_,y,{className:"",begin:/\\"/},{className:"string",begin:/'/,end:/'/},p]}}},28390:v=>{function i(...u){return u.map(f=>function(u){return u?"string"==typeof u?u:u.source:null}(f)).join("")}v.exports=function(u){const p="HTTP/(2|1\\.[01])",e={className:"attribute",begin:i("^",/[A-Za-z][A-Za-z0-9-]*/,"(?=\\:\\s)"),starts:{contains:[{className:"punctuation",begin:/: /,relevance:0,starts:{end:"$",relevance:0}}]}},_=[e,{begin:"\\n\\n",starts:{subLanguage:[],endsWithParent:!0}}];return{name:"HTTP",aliases:["https"],illegal:/\S/,contains:[{begin:"^(?="+p+" \\d{3})",end:/$/,contains:[{className:"meta",begin:p},{className:"number",begin:"\\b\\d{3}\\b"}],starts:{end:/\b\B/,illegal:/\S/,contains:_}},{begin:"(?=^[A-Z]+ (.*?) "+p+"$)",end:/$/,contains:[{className:"string",begin:" ",end:" ",excludeBegin:!0,excludeEnd:!0},{className:"meta",begin:p},{className:"keyword",begin:"[A-Z]+"}],starts:{end:/\b\B/,illegal:/\S/,contains:_}},u.inherit(e,{relevance:0})]}}},36147:v=>{const S="[A-Za-z$_][0-9A-Za-z$_]*",i=["as","in","of","if","for","while","finally","var","new","function","do","return","void","else","break","catch","instanceof","with","throw","case","default","try","switch","continue","typeof","delete","let","yield","const","class","debugger","async","await","static","import","from","export","extends"],r=["true","false","null","undefined","NaN","Infinity"],_=[].concat(["setInterval","setTimeout","clearInterval","clearTimeout","require","exports","eval","isFinite","isNaN","parseFloat","parseInt","decodeURI","decodeURIComponent","encodeURI","encodeURIComponent","escape","unescape"],["arguments","this","super","console","window","document","localStorage","module","global"],["Intl","DataView","Number","Math","Date","String","RegExp","Object","Function","Boolean","Error","Symbol","Set","Map","WeakSet","WeakMap","Proxy","Reflect","JSON","Promise","Float64Array","Int16Array","Int32Array","Int8Array","Uint16Array","Uint32Array","Float32Array","Array","Uint8Array","Uint8ClampedArray","ArrayBuffer","BigInt64Array","BigUint64Array","BigInt"],["EvalError","InternalError","RangeError","ReferenceError","SyntaxError","TypeError","URIError"]);function T(F){return M("(?=",F,")")}function M(...F){return F.map(J=>function(F){return F?"string"==typeof F?F:F.source:null}(J)).join("")}v.exports=function(F){const J=S,ee={begin:/<[A-Za-z0-9\\._:-]+/,end:/\/[A-Za-z0-9\\._:-]+>|\/>/,isTrulyOpeningTag:(Ve,He)=>{const Zt=Ve[0].length+Ve.index,st=Ve.input[Zt];"<"!==st?">"===st&&(((Ve,{after:He})=>{const Zt="</"+Ve[0].slice(1);return-1!==Ve.input.indexOf(Zt,He)})(Ve,{after:Zt})||He.ignoreMatch()):He.ignoreMatch()}},ue={$pattern:S,keyword:i,literal:r,built_in:_},ae="[0-9](_?[0-9])*",$=`\\.(${ae})`,se="0|[1-9](_?[0-9])*|0[0-7]*[89][0-9]*",ve={className:"number",variants:[{begin:`(\\b(${se})((${$})|\\.)?|(${$}))[eE][+-]?(${ae})\\b`},{begin:`\\b(${se})\\b((${$})\\b|\\.)?|(${$})\\b`},{begin:"\\b(0|[1-9](_?[0-9])*)n\\b"},{begin:"\\b0[xX][0-9a-fA-F](_?[0-9a-fA-F])*n?\\b"},{begin:"\\b0[bB][0-1](_?[0-1])*n?\\b"},{begin:"\\b0[oO][0-7](_?[0-7])*n?\\b"},{begin:"\\b0[0-7]+n?\\b"}],relevance:0},oe={className:"subst",begin:"\\$\\{",end:"\\}",keywords:ue,contains:[]},he={begin:"html`",end:"",starts:{end:"`",returnEnd:!1,contains:[F.BACKSLASH_ESCAPE,oe],subLanguage:"xml"}},me={begin:"css`",end:"",starts:{end:"`",returnEnd:!1,contains:[F.BACKSLASH_ESCAPE,oe],subLanguage:"css"}},Oe={className:"string",begin:"`",end:"`",contains:[F.BACKSLASH_ESCAPE,oe]},dt={className:"comment",variants:[F.COMMENT(/\/\*\*(?!\/)/,"\\*/",{relevance:0,contains:[{className:"doctag",begin:"@[A-Za-z]+",contains:[{className:"type",begin:"\\{",end:"\\}",relevance:0},{className:"variable",begin:J+"(?=\\s*(-)|$)",endsParent:!0,relevance:0},{begin:/(?=[^\n])\s/,relevance:0}]}]}),F.C_BLOCK_COMMENT_MODE,F.C_LINE_COMMENT_MODE]},ze=[F.APOS_STRING_MODE,F.QUOTE_STRING_MODE,he,me,Oe,ve,F.REGEXP_MODE];oe.contains=ze.concat({begin:/\{/,end:/\}/,keywords:ue,contains:["self"].concat(ze)});const Ye=[].concat(dt,oe.contains),je=Ye.concat([{begin:/\(/,end:/\)/,keywords:ue,contains:["self"].concat(Ye)}]),Ie={className:"params",begin:/\(/,end:/\)/,excludeBegin:!0,excludeEnd:!0,keywords:ue,contains:je};return{name:"Javascript",aliases:["js","jsx","mjs","cjs"],keywords:ue,exports:{PARAMS_CONTAINS:je},illegal:/#(?![$_A-z])/,contains:[F.SHEBANG({label:"shebang",binary:"node",relevance:5}),{label:"use_strict",className:"meta",relevance:10,begin:/^\s*['"]use (strict|asm)['"]/},F.APOS_STRING_MODE,F.QUOTE_STRING_MODE,he,me,Oe,dt,ve,{begin:M(/[{,\n]\s*/,T(M(/(((\/\/.*$)|(\/\*(\*[^/]|[^*])*\*\/))\s*)*/,J+"\\s*:"))),relevance:0,contains:[{className:"attr",begin:J+T("\\s*:"),relevance:0}]},{begin:"("+F.RE_STARTERS_RE+"|\\b(case|return|throw)\\b)\\s*",keywords:"return throw case",contains:[dt,F.REGEXP_MODE,{className:"function",begin:"(\\([^()]*(\\([^()]*(\\([^()]*\\)[^()]*)*\\)[^()]*)*\\)|"+F.UNDERSCORE_IDENT_RE+")\\s*=>",returnBegin:!0,end:"\\s*=>",contains:[{className:"params",variants:[{begin:F.UNDERSCORE_IDENT_RE,relevance:0},{className:null,begin:/\(\s*\)/,skip:!0},{begin:/\(/,end:/\)/,excludeBegin:!0,excludeEnd:!0,keywords:ue,contains:je}]}]},{begin:/,/,relevance:0},{className:"",begin:/\s/,end:/\s*/,skip:!0},{variants:[{begin:"<>",end:"</>"},{begin:ee.begin,"on:begin":ee.isTrulyOpeningTag,end:ee.end}],subLanguage:"xml",contains:[{begin:ee.begin,end:ee.end,skip:!0,contains:["self"]}]}],relevance:0},{className:"function",beginKeywords:"function",end:/[{;]/,excludeEnd:!0,keywords:ue,contains:["self",F.inherit(F.TITLE_MODE,{begin:J}),Ie],illegal:/%/},{beginKeywords:"while if switch catch for"},{className:"function",begin:F.UNDERSCORE_IDENT_RE+"\\([^()]*(\\([^()]*(\\([^()]*\\)[^()]*)*\\)[^()]*)*\\)\\s*\\{",returnBegin:!0,contains:[Ie,F.inherit(F.TITLE_MODE,{begin:J})]},{variants:[{begin:"\\."+J},{begin:"\\$"+J}],relevance:0},{className:"class",beginKeywords:"class",end:/[{;=]/,excludeEnd:!0,illegal:/[:"[\]]/,contains:[{beginKeywords:"extends"},F.UNDERSCORE_TITLE_MODE]},{begin:/\b(?=constructor)/,end:/[{;]/,excludeEnd:!0,contains:[F.inherit(F.TITLE_MODE,{begin:J}),"self",Ie]},{begin:"(get|set)\\s+(?="+J+"\\()",end:/\{/,keywords:"get set",contains:[F.inherit(F.TITLE_MODE,{begin:J}),{begin:/\(\)/},Ie]},{begin:/\$[(.]/}]}}},92229:v=>{v.exports=function(i){const r={literal:"true false null"},u=[i.C_LINE_COMMENT_MODE,i.C_BLOCK_COMMENT_MODE],p=[i.QUOTE_STRING_MODE,i.C_NUMBER_MODE],f={end:",",endsWithParent:!0,excludeEnd:!0,contains:p,keywords:r},e={begin:/\{/,end:/\}/,contains:[{className:"attr",begin:/"/,end:/"/,contains:[i.BACKSLASH_ESCAPE],illegal:"\\n"},i.inherit(f,{begin:/:/})].concat(u),illegal:"\\S"},_={begin:"\\[",end:"\\]",contains:[i.inherit(f)],illegal:"\\S"};return p.push(e,_),u.forEach(function(y){p.push(y)}),{name:"JSON",contains:p,keywords:r,illegal:"\\S"}}},78932:v=>{v.exports=function(i){const f={$pattern:/-?[A-z\.\-]+\b/,keyword:"if else foreach return do while until elseif begin for trap data dynamicparam end break throw param continue finally in switch exit filter try process catch hidden static parameter",built_in:"ac asnp cat cd CFS chdir clc clear clhy cli clp cls clv cnsn compare copy cp cpi cpp curl cvpa dbp del diff dir dnsn ebp echo|0 epal epcsv epsn erase etsn exsn fc fhx fl ft fw gal gbp gc gcb gci gcm gcs gdr gerr ghy gi gin gjb gl gm gmo gp gps gpv group gsn gsnp gsv gtz gu gv gwmi h history icm iex ihy ii ipal ipcsv ipmo ipsn irm ise iwmi iwr kill lp ls man md measure mi mount move mp mv nal ndr ni nmo npssc nsn nv ogv oh popd ps pushd pwd r rbp rcjb rcsn rd rdr ren ri rjb rm rmdir rmo rni rnp rp rsn rsnp rujb rv rvpa rwmi sajb sal saps sasv sbp sc scb select set shcm si sl sleep sls sort sp spjb spps spsv start stz sujb sv swmi tee trcm type wget where wjb write"},_={begin:"`[\\s\\S]",relevance:0},y={className:"variable",variants:[{begin:/\$\B/},{className:"keyword",begin:/\$this/},{begin:/\$[\w\d][\w\d_:]*/}]},M={className:"string",variants:[{begin:/"/,end:/"/},{begin:/@"/,end:/^"@/}],contains:[_,y,{className:"variable",begin:/\$[A-z]/,end:/[^A-z]/}]},R={className:"string",variants:[{begin:/'/,end:/'/},{begin:/@'/,end:/^'@/}]},Z=i.inherit(i.COMMENT(null,null),{variants:[{begin:/#/,end:/$/},{begin:/<#/,end:/#>/}],contains:[{className:"doctag",variants:[{begin:/\.(synopsis|description|example|inputs|outputs|notes|link|component|role|functionality)/},{begin:/\.(parameter|forwardhelptargetname|forwardhelpcategory|remotehelprunspace|externalhelp)\s+\S+/}]}]}),J={className:"built_in",variants:[{begin:"(".concat("Add|Clear|Close|Copy|Enter|Exit|Find|Format|Get|Hide|Join|Lock|Move|New|Open|Optimize|Pop|Push|Redo|Remove|Rename|Reset|Resize|Search|Select|Set|Show|Skip|Split|Step|Switch|Undo|Unlock|Watch|Backup|Checkpoint|Compare|Compress|Convert|ConvertFrom|ConvertTo|Dismount|Edit|Expand|Export|Group|Import|Initialize|Limit|Merge|Mount|Out|Publish|Restore|Save|Sync|Unpublish|Update|Approve|Assert|Build|Complete|Confirm|Deny|Deploy|Disable|Enable|Install|Invoke|Register|Request|Restart|Resume|Start|Stop|Submit|Suspend|Uninstall|Unregister|Wait|Debug|Measure|Ping|Repair|Resolve|Test|Trace|Connect|Disconnect|Read|Receive|Send|Write|Block|Grant|Protect|Revoke|Unblock|Unprotect|Use|ForEach|Sort|Tee|Where",")+(-)[\\w\\d]+")}]},Q={className:"class",beginKeywords:"class enum",end:/\s*[{]/,excludeEnd:!0,relevance:0,contains:[i.TITLE_MODE]},ee={className:"function",begin:/function\s+/,end:/\s*\{|$/,excludeEnd:!0,returnBegin:!0,relevance:0,contains:[{begin:"function",relevance:0,className:"keyword"},{className:"title",begin:/\w[\w\d]*((-)[\w\d]+)*/,relevance:0},{begin:/\(/,end:/\)/,className:"params",relevance:0,contains:[y]}]},ue={begin:/using\s/,end:/$/,returnBegin:!0,contains:[M,R,{className:"keyword",begin:/(using|assembly|command|module|namespace|type)/}]},ae={variants:[{className:"operator",begin:"(".concat("-and|-as|-band|-bnot|-bor|-bxor|-casesensitive|-ccontains|-ceq|-cge|-cgt|-cle|-clike|-clt|-cmatch|-cne|-cnotcontains|-cnotlike|-cnotmatch|-contains|-creplace|-csplit|-eq|-exact|-f|-file|-ge|-gt|-icontains|-ieq|-ige|-igt|-ile|-ilike|-ilt|-imatch|-in|-ine|-inotcontains|-inotlike|-inotmatch|-ireplace|-is|-isnot|-isplit|-join|-le|-like|-lt|-match|-ne|-not|-notcontains|-notin|-notlike|-notmatch|-or|-regex|-replace|-shl|-shr|-split|-wildcard|-xor",")\\b")},{className:"literal",begin:/(-)[\w\d]+/,relevance:0}]},se={className:"function",begin:/\[.*\]\s*[\w]+[ ]??\(/,end:/$/,returnBegin:!0,relevance:0,contains:[{className:"keyword",begin:"(".concat(f.keyword.toString().replace(/\s/g,"|"),")\\b"),endsParent:!0,relevance:0},i.inherit(i.TITLE_MODE,{endsParent:!0})]},ve=[se,Z,_,i.NUMBER_MODE,M,R,J,y,{className:"literal",begin:/\$(null|true|false)\b/},{className:"selector-tag",begin:/@\B/,relevance:0}],oe={begin:/\[/,end:/\]/,excludeBegin:!0,excludeEnd:!0,relevance:0,contains:[].concat("self",ve,{begin:"("+["string","char","byte","int","long","bool","decimal","single","double","DateTime","xml","array","hashtable","void"].join("|")+")",className:"built_in",relevance:0},{className:"type",begin:/[\.\w\d]+/,relevance:0})};return se.contains.unshift(oe),{name:"PowerShell",aliases:["ps","ps1"],case_insensitive:!0,keywords:f,contains:ve.concat(Q,ee,ue,ae,oe)}}},13546:v=>{function S(e){return e?"string"==typeof e?e:e.source:null}function i(e){return u("(?=",e,")")}function u(...e){return e.map(y=>S(y)).join("")}function p(...e){return"("+e.map(y=>S(y)).join("|")+")"}v.exports=function(e){const _=u(/[A-Z_]/,u("(",/[A-Z0-9_.-]*:/,")?"),/[A-Z0-9_.-]*/),T={className:"symbol",begin:/&[a-z]+;|&#[0-9]+;|&#x[a-f0-9]+;/},M={begin:/\s/,contains:[{className:"meta-keyword",begin:/#?[a-z_][a-z1-9_-]+/,illegal:/\n/}]},R=e.inherit(M,{begin:/\(/,end:/\)/}),F=e.inherit(e.APOS_STRING_MODE,{className:"meta-string"}),Z=e.inherit(e.QUOTE_STRING_MODE,{className:"meta-string"}),J={endsWithParent:!0,illegal:/</,relevance:0,contains:[{className:"attr",begin:/[A-Za-z0-9._:-]+/,relevance:0},{begin:/=\s*/,relevance:0,contains:[{className:"string",endsParent:!0,variants:[{begin:/"/,end:/"/,contains:[T]},{begin:/'/,end:/'/,contains:[T]},{begin:/[^\s"'=<>`]+/}]}]}]};return{name:"HTML, XML",aliases:["html","xhtml","rss","atom","xjb","xsd","xsl","plist","wsf","svg"],case_insensitive:!0,contains:[{className:"meta",begin:/<![a-z]/,end:/>/,relevance:10,contains:[M,Z,F,R,{begin:/\[/,end:/\]/,contains:[{className:"meta",begin:/<![a-z]/,end:/>/,contains:[M,R,Z,F]}]}]},e.COMMENT(/<!--/,/-->/,{relevance:10}),{begin:/<!\[CDATA\[/,end:/\]\]>/,relevance:10},T,{className:"meta",begin:/<\?xml/,end:/\?>/,relevance:10},{className:"tag",begin:/<style(?=\s|>)/,end:/>/,keywords:{name:"style"},contains:[J],starts:{end:/<\/style>/,returnEnd:!0,subLanguage:["css","xml"]}},{className:"tag",begin:/<script(?=\s|>)/,end:/>/,keywords:{name:"script"},contains:[J],starts:{end:/<\/script>/,returnEnd:!0,subLanguage:["javascript","handlebars","xml"]}},{className:"tag",begin:/<>|<\/>/},{className:"tag",begin:u(/</,i(u(_,p(/\/>/,/>/,/\s/)))),end:/\/?>/,contains:[{className:"name",begin:_,relevance:0,starts:J}]},{className:"tag",begin:u(/<\//,i(u(_,/>/))),contains:[{className:"name",begin:_,relevance:0},{begin:/>/,relevance:0,endsParent:!0}]}]}}},44776:v=>{v.exports=function(i){var r="true false yes no null",u="[\\w#;/?:@&=+$,.~*'()[\\]]+",e={className:"string",relevance:0,variants:[{begin:/'/,end:/'/},{begin:/"/,end:/"/},{begin:/\S+/}],contains:[i.BACKSLASH_ESCAPE,{className:"template-variable",variants:[{begin:/\{\{/,end:/\}\}/},{begin:/%\{/,end:/\}/}]}]},_=i.inherit(e,{variants:[{begin:/'/,end:/'/},{begin:/"/,end:/"/},{begin:/[^\s,{}[\]]+/}]}),Z={end:",",endsWithParent:!0,excludeEnd:!0,keywords:r,relevance:0},ee=[{className:"attr",variants:[{begin:"\\w[\\w :\\/.-]*:(?=[ \t]|$)"},{begin:'"\\w[\\w :\\/.-]*":(?=[ \t]|$)'},{begin:"'\\w[\\w :\\/.-]*':(?=[ \t]|$)"}]},{className:"meta",begin:"^---\\s*$",relevance:10},{className:"string",begin:"[\\|>]([1-9]?[+-])?[ ]*\\n( +)[^ ][^\\n]*\\n(\\2[^\\n]+\\n?)*"},{begin:"<%[%=-]?",end:"[%-]?%>",subLanguage:"ruby",excludeBegin:!0,excludeEnd:!0,relevance:0},{className:"type",begin:"!\\w+!"+u},{className:"type",begin:"!<"+u+">"},{className:"type",begin:"!"+u},{className:"type",begin:"!!"+u},{className:"meta",begin:"&"+i.UNDERSCORE_IDENT_RE+"$"},{className:"meta",begin:"\\*"+i.UNDERSCORE_IDENT_RE+"$"},{className:"bullet",begin:"-(?=[ ]|$)",relevance:0},i.HASH_COMMENT_MODE,{beginKeywords:r,keywords:{literal:r}},{className:"number",begin:"\\b[0-9]{4}(-[0-9][0-9]){0,2}([Tt \\t][0-9][0-9]?(:[0-9][0-9]){2})?(\\.[0-9]*)?([ \\t])*(Z|[-+][0-9][0-9]?(:[0-9][0-9])?)?\\b"},{className:"number",begin:i.C_NUMBER_RE+"\\b",relevance:0},{begin:/\{/,end:/\}/,contains:[Z],illegal:"\\n",relevance:0},{begin:"\\[",end:"\\]",contains:[Z],illegal:"\\n",relevance:0},e],ue=[...ee];return ue.pop(),ue.push(_),Z.contains=ue,{name:"YAML",case_insensitive:!0,aliases:["yml"],contains:ee}}},62568:(v,S,i)=>{"use strict";var r=i(38308),u={childContextTypes:!0,contextType:!0,contextTypes:!0,defaultProps:!0,displayName:!0,getDefaultProps:!0,getDerivedStateFromError:!0,getDerivedStateFromProps:!0,mixins:!0,propTypes:!0,type:!0},p={name:!0,length:!0,prototype:!0,caller:!0,callee:!0,arguments:!0,arity:!0},e={$$typeof:!0,compare:!0,defaultProps:!0,displayName:!0,propTypes:!0,type:!0},_={};function y(ee){return r.isMemo(ee)?e:_[ee.$$typeof]||u}_[r.ForwardRef]={$$typeof:!0,render:!0,defaultProps:!0,displayName:!0,propTypes:!0},_[r.Memo]=e;var T=Object.defineProperty,M=Object.getOwnPropertyNames,R=Object.getOwnPropertySymbols,F=Object.getOwnPropertyDescriptor,Z=Object.getPrototypeOf,J=Object.prototype;v.exports=function Q(ee,ue,ae){if("string"!=typeof ue){if(J){var $=Z(ue);$&&$!==J&&Q(ee,$,ae)}var se=M(ue);R&&(se=se.concat(R(ue)));for(var ve=y(ee),oe=y(ue),he=0;he<se.length;++he){var me=se[he];if(!(p[me]||ae&&ae[me]||oe&&oe[me]||ve&&ve[me])){var Oe=F(ue,me);try{T(ee,me,Oe)}catch(ce){}}}}return ee}},12658:(v,S)=>{S.read=function(i,r,u,p,f){var e,_,y=8*f-p-1,T=(1<<y)-1,M=T>>1,R=-7,F=u?f-1:0,Z=u?-1:1,J=i[r+F];for(F+=Z,e=J&(1<<-R)-1,J>>=-R,R+=y;R>0;e=256*e+i[r+F],F+=Z,R-=8);for(_=e&(1<<-R)-1,e>>=-R,R+=p;R>0;_=256*_+i[r+F],F+=Z,R-=8);if(0===e)e=1-M;else{if(e===T)return _?NaN:1/0*(J?-1:1);_+=Math.pow(2,p),e-=M}return(J?-1:1)*_*Math.pow(2,e-p)},S.write=function(i,r,u,p,f,e){var _,y,T,M=8*e-f-1,R=(1<<M)-1,F=R>>1,Z=23===f?Math.pow(2,-24)-Math.pow(2,-77):0,J=p?0:e-1,Q=p?1:-1,ee=r<0||0===r&&1/r<0?1:0;for(r=Math.abs(r),isNaN(r)||r===1/0?(y=isNaN(r)?1:0,_=R):(_=Math.floor(Math.log(r)/Math.LN2),r*(T=Math.pow(2,-_))<1&&(_--,T*=2),(r+=_+F>=1?Z/T:Z*Math.pow(2,1-F))*T>=2&&(_++,T/=2),_+F>=R?(y=0,_=R):_+F>=1?(y=(r*T-1)*Math.pow(2,f),_+=F):(y=r*Math.pow(2,F-1)*Math.pow(2,f),_=0));f>=8;i[u+J]=255&y,J+=Q,y/=256,f-=8);for(_=_<<f|y,M+=f;M>0;i[u+J]=255&_,J+=Q,_/=256,M-=8);i[u+J-Q]|=128*ee}},16482:function(v){v.exports=function(){"use strict";var S=Array.prototype.slice;function i(V,Ae){Ae&&(V.prototype=Object.create(Ae.prototype)),V.prototype.constructor=V}function r(V){return e(V)?V:ci(V)}function u(V){return _(V)?V:Ir(V)}function p(V){return y(V)?V:wr(V)}function f(V){return e(V)&&!T(V)?V:Qr(V)}function e(V){return!(!V||!V[R])}function _(V){return!(!V||!V[F])}function y(V){return!(!V||!V[Z])}function T(V){return _(V)||y(V)}function M(V){return!(!V||!V[J])}i(u,r),i(p,r),i(f,r),r.isIterable=e,r.isKeyed=_,r.isIndexed=y,r.isAssociative=T,r.isOrdered=M,r.Keyed=u,r.Indexed=p,r.Set=f;var R="@@__IMMUTABLE_ITERABLE__@@",F="@@__IMMUTABLE_KEYED__@@",Z="@@__IMMUTABLE_INDEXED__@@",J="@@__IMMUTABLE_ORDERED__@@",Q="delete",$={},se={value:!1},ve={value:!1};function oe(V){return V.value=!1,V}function he(V){V&&(V.value=!0)}function me(){}function Oe(V,Ae){Ae=Ae||0;for(var ot=Math.max(0,V.length-Ae),_t=new Array(ot),lt=0;lt<ot;lt++)_t[lt]=V[lt+Ae];return _t}function ce(V){return void 0===V.size&&(V.size=V.__iterate(ze)),V.size}function dt(V,Ae){if("number"!=typeof Ae){var ot=Ae>>>0;if(""+ot!==Ae||4294967295===ot)return NaN;Ae=ot}return Ae<0?ce(V)+Ae:Ae}function ze(){return!0}function Ye(V,Ae,ot){return(0===V||void 0!==ot&&V<=-ot)&&(void 0===Ae||void 0!==ot&&Ae>=ot)}function je(V,Ae){return Ve(V,Ae,0)}function Ie(V,Ae){return Ve(V,Ae,Ae)}function Ve(V,Ae,ot){return void 0===V?ot:V<0?Math.max(0,Ae+V):void 0===Ae?V:Math.min(Ae,V)}var en="function"==typeof Symbol&&Symbol.iterator,$t="@@iterator",Gt=en||$t;function Ut(V){this.next=V}function Bt(V,Ae,ot,_t){var lt=0===V?Ae:1===V?ot:[Ae,ot];return _t?_t.value=lt:_t={value:lt,done:!1},_t}function mt(){return{value:void 0,done:!0}}function Yt(V){return!!Yn(V)}function Dt(V){return V&&"function"==typeof V.next}function zt(V){var Ae=Yn(V);return Ae&&Ae.call(V)}function Yn(V){var Ae=V&&(en&&V[en]||V[$t]);if("function"==typeof Ae)return Ae}function Hr(V){return V&&"number"==typeof V.length}function ci(V){return null==V?Hi():e(V)?V.toSeq():function(V){var Ae=Jn(V)||"object"==typeof V&&new Hn(V);if(!Ae)throw new TypeError("Expected Array or iterable object of values, or keyed object: "+V);return Ae}(V)}function Ir(V){return null==V?Hi().toKeyedSeq():e(V)?_(V)?V.toSeq():V.fromEntrySeq():Br(V)}function wr(V){return null==V?Hi():e(V)?_(V)?V.entrySeq():V.toIndexedSeq():On(V)}function Qr(V){return(null==V?Hi():e(V)?_(V)?V.entrySeq():V:On(V)).toSetSeq()}Ut.prototype.toString=function(){return"[Iterator]"},Ut.KEYS=0,Ut.VALUES=1,Ut.ENTRIES=2,Ut.prototype.inspect=Ut.prototype.toSource=function(){return this.toString()},Ut.prototype[Gt]=function(){return this},i(ci,r),ci.of=function(){return ci(arguments)},ci.prototype.toSeq=function(){return this},ci.prototype.toString=function(){return this.__toString("Seq {","}")},ci.prototype.cacheResult=function(){return!this._cache&&this.__iterateUncached&&(this._cache=this.entrySeq().toArray(),this.size=this._cache.length),this},ci.prototype.__iterate=function(V,Ae){return ir(this,V,Ae,!0)},ci.prototype.__iterator=function(V,Ae){return Lr(this,V,Ae,!0)},i(Ir,ci),Ir.prototype.toKeyedSeq=function(){return this},i(wr,ci),wr.of=function(){return wr(arguments)},wr.prototype.toIndexedSeq=function(){return this},wr.prototype.toString=function(){return this.__toString("Seq [","]")},wr.prototype.__iterate=function(V,Ae){return ir(this,V,Ae,!1)},wr.prototype.__iterator=function(V,Ae){return Lr(this,V,Ae,!1)},i(Qr,ci),Qr.of=function(){return Qr(arguments)},Qr.prototype.toSetSeq=function(){return this},ci.isSeq=di,ci.Keyed=Ir,ci.Set=Qr,ci.Indexed=wr;var $i,En,zn,Kr="@@__IMMUTABLE_SEQ__@@";function In(V){this._array=V,this.size=V.length}function Hn(V){var Ae=Object.keys(V);this._object=V,this._keys=Ae,this.size=Ae.length}function Zr(V){this._iterable=V,this.size=V.length||V.size}function Ur(V){this._iterator=V,this._iteratorCache=[]}function di(V){return!(!V||!V[Kr])}function Hi(){return $i||($i=new In([]))}function Br(V){var Ae=Array.isArray(V)?new In(V).fromEntrySeq():Dt(V)?new Ur(V).fromEntrySeq():Yt(V)?new Zr(V).fromEntrySeq():"object"==typeof V?new Hn(V):void 0;if(!Ae)throw new TypeError("Expected Array or iterable object of [k, v] entries, or keyed object: "+V);return Ae}function On(V){var Ae=Jn(V);if(!Ae)throw new TypeError("Expected Array or iterable object of values: "+V);return Ae}function Jn(V){return Hr(V)?new In(V):Dt(V)?new Ur(V):Yt(V)?new Zr(V):void 0}function ir(V,Ae,ot,_t){var lt=V._cache;if(lt){for(var un=lt.length-1,yn=0;yn<=un;yn++){var Or=lt[ot?un-yn:yn];if(!1===Ae(Or[1],_t?Or[0]:yn,V))return yn+1}return yn}return V.__iterateUncached(Ae,ot)}function Lr(V,Ae,ot,_t){var lt=V._cache;if(lt){var un=lt.length-1,yn=0;return new Ut(function(){var Or=lt[ot?un-yn:yn];return yn++>un?{value:void 0,done:!0}:Bt(Ae,_t?Or[0]:yn-1,Or[1])})}return V.__iteratorUncached(Ae,ot)}function Vn(V,Ae){return Ae?zr(Ae,V,"",{"":V}):hi(V)}function zr(V,Ae,ot,_t){return Array.isArray(Ae)?V.call(_t,ot,wr(Ae).map(function(lt,un){return zr(V,lt,un,Ae)})):Ai(Ae)?V.call(_t,ot,Ir(Ae).map(function(lt,un){return zr(V,lt,un,Ae)})):Ae}function hi(V){return Array.isArray(V)?wr(V).map(hi).toList():Ai(V)?Ir(V).map(hi).toMap():V}function Ai(V){return V&&(V.constructor===Object||void 0===V.constructor)}function Tr(V,Ae){if(V===Ae||V!=V&&Ae!=Ae)return!0;if(!V||!Ae)return!1;if("function"==typeof V.valueOf&&"function"==typeof Ae.valueOf){if((V=V.valueOf())===(Ae=Ae.valueOf())||V!=V&&Ae!=Ae)return!0;if(!V||!Ae)return!1}return!("function"!=typeof V.equals||"function"!=typeof Ae.equals||!V.equals(Ae))}function Nr(V,Ae){if(V===Ae)return!0;if(!e(Ae)||void 0!==V.size&&void 0!==Ae.size&&V.size!==Ae.size||void 0!==V.__hash&&void 0!==Ae.__hash&&V.__hash!==Ae.__hash||_(V)!==_(Ae)||y(V)!==y(Ae)||M(V)!==M(Ae))return!1;if(0===V.size&&0===Ae.size)return!0;var ot=!T(V);if(M(V)){var _t=V.entries();return Ae.every(function(Vr,_i){var oi=_t.next().value;return oi&&Tr(oi[1],Vr)&&(ot||Tr(oi[0],_i))})&&_t.next().done}var lt=!1;if(void 0===V.size)if(void 0===Ae.size)"function"==typeof V.cacheResult&&V.cacheResult();else{lt=!0;var un=V;V=Ae,Ae=un}var yn=!0,Or=Ae.__iterate(function(Vr,_i){if(ot?!V.has(Vr):lt?!Tr(Vr,V.get(_i,$)):!Tr(V.get(_i,$),Vr))return yn=!1,!1});return yn&&V.size===Or}function gn(V,Ae){if(!(this instanceof gn))return new gn(V,Ae);if(this._value=V,this.size=void 0===Ae?1/0:Math.max(0,Ae),0===this.size){if(En)return En;En=this}}function mr(V,Ae){if(!V)throw new Error(Ae)}function Xt(V,Ae,ot){if(!(this instanceof Xt))return new Xt(V,Ae,ot);if(mr(0!==ot,"Cannot step a Range by 0"),V=V||0,void 0===Ae&&(Ae=1/0),ot=void 0===ot?1:Math.abs(ot),Ae<V&&(ot=-ot),this._start=V,this._end=Ae,this._step=ot,this.size=Math.max(0,Math.ceil((Ae-V)/ot-1)+1),0===this.size){if(zn)return zn;zn=this}}function vr(){throw TypeError("Abstract")}function si(){}function Ii(){}function no(){}ci.prototype[Kr]=!0,i(In,wr),In.prototype.get=function(V,Ae){return this.has(V)?this._array[dt(this,V)]:Ae},In.prototype.__iterate=function(V,Ae){for(var ot=this._array,_t=ot.length-1,lt=0;lt<=_t;lt++)if(!1===V(ot[Ae?_t-lt:lt],lt,this))return lt+1;return lt},In.prototype.__iterator=function(V,Ae){var ot=this._array,_t=ot.length-1,lt=0;return new Ut(function(){return lt>_t?{value:void 0,done:!0}:Bt(V,lt,ot[Ae?_t-lt++:lt++])})},i(Hn,Ir),Hn.prototype.get=function(V,Ae){return void 0===Ae||this.has(V)?this._object[V]:Ae},Hn.prototype.has=function(V){return this._object.hasOwnProperty(V)},Hn.prototype.__iterate=function(V,Ae){for(var ot=this._object,_t=this._keys,lt=_t.length-1,un=0;un<=lt;un++){var yn=_t[Ae?lt-un:un];if(!1===V(ot[yn],yn,this))return un+1}return un},Hn.prototype.__iterator=function(V,Ae){var ot=this._object,_t=this._keys,lt=_t.length-1,un=0;return new Ut(function(){var yn=_t[Ae?lt-un:un];return un++>lt?{value:void 0,done:!0}:Bt(V,yn,ot[yn])})},Hn.prototype[J]=!0,i(Zr,wr),Zr.prototype.__iterateUncached=function(V,Ae){if(Ae)return this.cacheResult().__iterate(V,Ae);var _t=zt(this._iterable),lt=0;if(Dt(_t))for(var un;!(un=_t.next()).done&&!1!==V(un.value,lt++,this););return lt},Zr.prototype.__iteratorUncached=function(V,Ae){if(Ae)return this.cacheResult().__iterator(V,Ae);var _t=zt(this._iterable);if(!Dt(_t))return new Ut(mt);var lt=0;return new Ut(function(){var un=_t.next();return un.done?un:Bt(V,lt++,un.value)})},i(Ur,wr),Ur.prototype.__iterateUncached=function(V,Ae){if(Ae)return this.cacheResult().__iterate(V,Ae);for(var ot=this._iterator,_t=this._iteratorCache,lt=0;lt<_t.length;)if(!1===V(_t[lt],lt++,this))return lt;for(var un;!(un=ot.next()).done;){var yn=un.value;if(_t[lt]=yn,!1===V(yn,lt++,this))break}return lt},Ur.prototype.__iteratorUncached=function(V,Ae){if(Ae)return this.cacheResult().__iterator(V,Ae);var ot=this._iterator,_t=this._iteratorCache,lt=0;return new Ut(function(){if(lt>=_t.length){var un=ot.next();if(un.done)return un;_t[lt]=un.value}return Bt(V,lt,_t[lt++])})},i(gn,wr),gn.prototype.toString=function(){return 0===this.size?"Repeat []":"Repeat [ "+this._value+" "+this.size+" times ]"},gn.prototype.get=function(V,Ae){return this.has(V)?this._value:Ae},gn.prototype.includes=function(V){return Tr(this._value,V)},gn.prototype.slice=function(V,Ae){var ot=this.size;return Ye(V,Ae,ot)?this:new gn(this._value,Ie(Ae,ot)-je(V,ot))},gn.prototype.reverse=function(){return this},gn.prototype.indexOf=function(V){return Tr(this._value,V)?0:-1},gn.prototype.lastIndexOf=function(V){return Tr(this._value,V)?this.size:-1},gn.prototype.__iterate=function(V,Ae){for(var ot=0;ot<this.size;ot++)if(!1===V(this._value,ot,this))return ot+1;return ot},gn.prototype.__iterator=function(V,Ae){var ot=this,_t=0;return new Ut(function(){return _t<ot.size?Bt(V,_t++,ot._value):{value:void 0,done:!0}})},gn.prototype.equals=function(V){return V instanceof gn?Tr(this._value,V._value):Nr(V)},i(Xt,wr),Xt.prototype.toString=function(){return 0===this.size?"Range []":"Range [ "+this._start+"..."+this._end+(1!==this._step?" by "+this._step:"")+" ]"},Xt.prototype.get=function(V,Ae){return this.has(V)?this._start+dt(this,V)*this._step:Ae},Xt.prototype.includes=function(V){var Ae=(V-this._start)/this._step;return Ae>=0&&Ae<this.size&&Ae===Math.floor(Ae)},Xt.prototype.slice=function(V,Ae){return Ye(V,Ae,this.size)?this:(V=je(V,this.size),(Ae=Ie(Ae,this.size))<=V?new Xt(0,0):new Xt(this.get(V,this._end),this.get(Ae,this._end),this._step))},Xt.prototype.indexOf=function(V){var Ae=V-this._start;if(Ae%this._step==0){var ot=Ae/this._step;if(ot>=0&&ot<this.size)return ot}return-1},Xt.prototype.lastIndexOf=function(V){return this.indexOf(V)},Xt.prototype.__iterate=function(V,Ae){for(var ot=this.size-1,_t=this._step,lt=Ae?this._start+ot*_t:this._start,un=0;un<=ot;un++){if(!1===V(lt,un,this))return un+1;lt+=Ae?-_t:_t}return un},Xt.prototype.__iterator=function(V,Ae){var ot=this.size-1,_t=this._step,lt=Ae?this._start+ot*_t:this._start,un=0;return new Ut(function(){var yn=lt;return lt+=Ae?-_t:_t,un>ot?{value:void 0,done:!0}:Bt(V,un++,yn)})},Xt.prototype.equals=function(V){return V instanceof Xt?this._start===V._start&&this._end===V._end&&this._step===V._step:Nr(this,V)},i(vr,r),i(si,vr),i(Ii,vr),i(no,vr),vr.Keyed=si,vr.Indexed=Ii,vr.Set=no;var so="function"==typeof Math.imul&&-2===Math.imul(4294967295,2)?Math.imul:function(Ae,ot){var _t=65535&(Ae|=0),lt=65535&(ot|=0);return _t*lt+((Ae>>>16)*lt+_t*(ot>>>16)<<16>>>0)|0};function Ze(V){return V>>>1&1073741824|3221225471&V}function Dr(V){if(!1===V||null==V||"function"==typeof V.valueOf&&(!1===(V=V.valueOf())||null==V))return 0;if(!0===V)return 1;var Ae=typeof V;if("number"===Ae){if(V!=V||V===1/0)return 0;var ot=0|V;for(ot!==V&&(ot^=4294967295*V);V>4294967295;)ot^=V/=4294967295;return Ze(ot)}if("string"===Ae)return V.length>Mo?function(V){var Ae=zo[V];return void 0===Ae&&(Ae=xt(V),cs===Vi&&(cs=0,zo={}),cs++,zo[V]=Ae),Ae}(V):xt(V);if("function"==typeof V.hashCode)return V.hashCode();if("object"===Ae)return function(V){var Ae;if(nr&&void 0!==(Ae=Gi.get(V))||void 0!==(Ae=V[yo])||!kn&&(void 0!==(Ae=V.propertyIsEnumerable&&V.propertyIsEnumerable[yo])||void 0!==(Ae=function(V){if(V&&V.nodeType>0)switch(V.nodeType){case 1:return V.uniqueID;case 9:return V.documentElement&&V.documentElement.uniqueID}}(V))))return Ae;if(Ae=++po,1073741824&po&&(po=0),nr)Gi.set(V,Ae);else{if(void 0!==Wn&&!1===Wn(V))throw new Error("Non-extensible objects are not allowed as keys.");if(kn)Object.defineProperty(V,yo,{enumerable:!1,configurable:!1,writable:!1,value:Ae});else if(void 0!==V.propertyIsEnumerable&&V.propertyIsEnumerable===V.constructor.prototype.propertyIsEnumerable)V.propertyIsEnumerable=function(){return this.constructor.prototype.propertyIsEnumerable.apply(this,arguments)},V.propertyIsEnumerable[yo]=Ae;else{if(void 0===V.nodeType)throw new Error("Unable to set a non-enumerable property on object.");V[yo]=Ae}}return Ae}(V);if("function"==typeof V.toString)return xt(V.toString());throw new Error("Value type "+Ae+" cannot be hashed.")}function xt(V){for(var Ae=0,ot=0;ot<V.length;ot++)Ae=31*Ae+V.charCodeAt(ot)|0;return Ze(Ae)}var Wn=Object.isExtensible,kn=function(){try{return Object.defineProperty({},"@",{}),!0}catch(V){return!1}}();var Gi,nr="function"==typeof WeakMap;nr&&(Gi=new WeakMap);var po=0,yo="__immutablehash__";"function"==typeof Symbol&&(yo=Symbol(yo));var Mo=16,Vi=255,cs=0,zo={};function So(V){mr(V!==1/0,"Cannot perform this action with an infinite size.")}function Si(V){return null==V?Ht():ai(V)&&!M(V)?V:Ht().withMutations(function(Ae){var ot=u(V);So(ot.size),ot.forEach(function(_t,lt){return Ae.set(lt,_t)})})}function ai(V){return!(!V||!V[Zn])}i(Si,si),Si.of=function(){var V=S.call(arguments,0);return Ht().withMutations(function(Ae){for(var ot=0;ot<V.length;ot+=2){if(ot+1>=V.length)throw new Error("Missing value for key: "+V[ot]);Ae.set(V[ot],V[ot+1])}})},Si.prototype.toString=function(){return this.__toString("Map {","}")},Si.prototype.get=function(V,Ae){return this._root?this._root.get(0,void 0,V,Ae):Ae},Si.prototype.set=function(V,Ae){return cn(this,V,Ae)},Si.prototype.setIn=function(V,Ae){return this.updateIn(V,$,function(){return Ae})},Si.prototype.remove=function(V){return cn(this,V,$)},Si.prototype.deleteIn=function(V){return this.updateIn(V,function(){return $})},Si.prototype.update=function(V,Ae,ot){return 1===arguments.length?V(this):this.updateIn([V],Ae,ot)},Si.prototype.updateIn=function(V,Ae,ot){ot||(ot=Ae,Ae=void 0);var _t=bs(this,Qi(V),Ae,ot);return _t===$?void 0:_t},Si.prototype.clear=function(){return 0===this.size?this:this.__ownerID?(this.size=0,this._root=null,this.__hash=void 0,this.__altered=!0,this):Ht()},Si.prototype.merge=function(){return Wo(this,void 0,arguments)},Si.prototype.mergeWith=function(V){return Wo(this,V,S.call(arguments,1))},Si.prototype.mergeIn=function(V){var Ae=S.call(arguments,1);return this.updateIn(V,Ht(),function(ot){return"function"==typeof ot.merge?ot.merge.apply(ot,Ae):Ae[Ae.length-1]})},Si.prototype.mergeDeep=function(){return Wo(this,Do,arguments)},Si.prototype.mergeDeepWith=function(V){var Ae=S.call(arguments,1);return Wo(this,Js(V),Ae)},Si.prototype.mergeDeepIn=function(V){var Ae=S.call(arguments,1);return this.updateIn(V,Ht(),function(ot){return"function"==typeof ot.mergeDeep?ot.mergeDeep.apply(ot,Ae):Ae[Ae.length-1]})},Si.prototype.sort=function(V){return ne(el(this,V))},Si.prototype.sortBy=function(V,Ae){return ne(el(this,Ae,V))},Si.prototype.withMutations=function(V){var Ae=this.asMutable();return V(Ae),Ae.wasAltered()?Ae.__ensureOwner(this.__ownerID):this},Si.prototype.asMutable=function(){return this.__ownerID?this:this.__ensureOwner(new me)},Si.prototype.asImmutable=function(){return this.__ensureOwner()},Si.prototype.wasAltered=function(){return this.__altered},Si.prototype.__iterator=function(V,Ae){return new Bo(this,V,Ae)},Si.prototype.__iterate=function(V,Ae){var ot=this,_t=0;return this._root&&this._root.iterate(function(lt){return _t++,V(lt[1],lt[0],ot)},Ae),_t},Si.prototype.__ensureOwner=function(V){return V===this.__ownerID?this:V?ar(this.size,this._root,V,this.__hash):(this.__ownerID=V,this.__altered=!1,this)},Si.isMap=ai;var ln,Zn="@@__IMMUTABLE_MAP__@@",cr=Si.prototype;function yr(V,Ae){this.ownerID=V,this.entries=Ae}function rr(V,Ae,ot){this.ownerID=V,this.bitmap=Ae,this.nodes=ot}function ri(V,Ae,ot){this.ownerID=V,this.count=Ae,this.nodes=ot}function ho(V,Ae,ot){this.ownerID=V,this.keyHash=Ae,this.entries=ot}function Ti(V,Ae,ot){this.ownerID=V,this.keyHash=Ae,this.entry=ot}function Bo(V,Ae,ot){this._type=Ae,this._reverse=ot,this._stack=V._root&&Li(V._root)}function xo(V,Ae){return Bt(V,Ae[0],Ae[1])}function Li(V,Ae){return{node:V,index:0,__prev:Ae}}function ar(V,Ae,ot,_t){var lt=Object.create(cr);return lt.size=V,lt._root=Ae,lt.__ownerID=ot,lt.__hash=_t,lt.__altered=!1,lt}function Ht(){return ln||(ln=ar(0))}function cn(V,Ae,ot){var _t,lt;if(V._root){var un=oe(se),yn=oe(ve);if(_t=Ct(V._root,V.__ownerID,0,void 0,Ae,ot,un,yn),!yn.value)return V;lt=V.size+(un.value?ot===$?-1:1:0)}else{if(ot===$)return V;lt=1,_t=new yr(V.__ownerID,[[Ae,ot]])}return V.__ownerID?(V.size=lt,V._root=_t,V.__hash=void 0,V.__altered=!0,V):_t?ar(lt,_t):Ht()}function Ct(V,Ae,ot,_t,lt,un,yn,Or){return V?V.update(Ae,ot,_t,lt,un,yn,Or):un===$?V:(he(Or),he(yn),new Ti(Ae,_t,[lt,un]))}function pr(V){return V.constructor===Ti||V.constructor===ho}function nn(V,Ae,ot,_t,lt){if(V.keyHash===_t)return new ho(Ae,_t,[V.entry,lt]);var Or,un=31&(0===ot?V.keyHash:V.keyHash>>>ot),yn=31&(0===ot?_t:_t>>>ot);return new rr(Ae,1<<un|1<<yn,un===yn?[nn(V,Ae,ot+5,_t,lt)]:(Or=new Ti(Ae,_t,lt),un<yn?[V,Or]:[Or,V]))}function Wo(V,Ae,ot){for(var _t=[],lt=0;lt<ot.length;lt++){var un=ot[lt],yn=u(un);e(un)||(yn=yn.map(function(Or){return Vn(Or)})),_t.push(yn)}return _s(V,Ae,_t)}function Do(V,Ae,ot){return V&&V.mergeDeep&&e(Ae)?V.mergeDeep(Ae):Tr(V,Ae)?V:Ae}function Js(V){return function(Ae,ot,_t){if(Ae&&Ae.mergeDeepWith&&e(ot))return Ae.mergeDeepWith(V,ot);var lt=V(Ae,ot,_t);return Tr(Ae,lt)?Ae:lt}}function _s(V,Ae,ot){return 0===(ot=ot.filter(function(_t){return 0!==_t.size})).length?V:0!==V.size||V.__ownerID||1!==ot.length?V.withMutations(function(_t){for(var lt=Ae?function(yn,Or){_t.update(Or,$,function(Vr){return Vr===$?yn:Ae(Vr,yn,Or)})}:function(yn,Or){_t.set(Or,yn)},un=0;un<ot.length;un++)ot[un].forEach(lt)}):V.constructor(ot[0])}function bs(V,Ae,ot,_t){var lt=V===$,un=Ae.next();if(un.done){var yn=lt?ot:V,Or=_t(yn);return Or===yn?V:Or}mr(lt||V&&V.set,"invalid keyPath");var Vr=un.value,_i=lt?$:V.get(Vr,$),oi=bs(_i,Ae,ot,_t);return oi===_i?V:oi===$?V.remove(Vr):(lt?Ht():V).set(Vr,oi)}function qo(V){return V=(V=(858993459&(V-=V>>1&1431655765))+(V>>2&858993459))+(V>>4)&252645135,127&(V+=V>>8)+(V>>16)}function ra(V,Ae,ot,_t){var lt=_t?V:Oe(V);return lt[Ae]=ot,lt}cr[Zn]=!0,cr[Q]=cr.remove,cr.removeIn=cr.deleteIn,yr.prototype.get=function(V,Ae,ot,_t){for(var lt=this.entries,un=0,yn=lt.length;un<yn;un++)if(Tr(ot,lt[un][0]))return lt[un][1];return _t},yr.prototype.update=function(V,Ae,ot,_t,lt,un,yn){for(var Or=lt===$,Vr=this.entries,_i=0,oi=Vr.length;_i<oi&&!Tr(_t,Vr[_i][0]);_i++);var ko=_i<oi;if(ko?Vr[_i][1]===lt:Or)return this;if(he(yn),(Or||!ko)&&he(un),!Or||1!==Vr.length){if(!ko&&!Or&&Vr.length>=Bs)return function(V,Ae,ot,_t){V||(V=new me);for(var lt=new Ti(V,Dr(ot),[ot,_t]),un=0;un<Ae.length;un++){var yn=Ae[un];lt=lt.update(V,0,void 0,yn[0],yn[1])}return lt}(V,Vr,_t,lt);var Ho=V&&V===this.ownerID,Ln=Ho?Vr:Oe(Vr);return ko?Or?_i===oi-1?Ln.pop():Ln[_i]=Ln.pop():Ln[_i]=[_t,lt]:Ln.push([_t,lt]),Ho?(this.entries=Ln,this):new yr(V,Ln)}},rr.prototype.get=function(V,Ae,ot,_t){void 0===Ae&&(Ae=Dr(ot));var lt=1<<(31&(0===V?Ae:Ae>>>V)),un=this.bitmap;return 0==(un&lt)?_t:this.nodes[qo(un&lt-1)].get(V+5,Ae,ot,_t)},rr.prototype.update=function(V,Ae,ot,_t,lt,un,yn){void 0===ot&&(ot=Dr(_t));var Or=31&(0===Ae?ot:ot>>>Ae),Vr=1<<Or,_i=this.bitmap,oi=0!=(_i&Vr);if(!oi&&lt===$)return this;var ko=qo(_i&Vr-1),Ho=this.nodes,Ln=oi?Ho[ko]:void 0,Mr=Ct(Ln,V,Ae+5,ot,_t,lt,un,yn);if(Mr===Ln)return this;if(!oi&&Mr&&Ho.length>=Yl)return function(V,Ae,ot,_t,lt){for(var un=0,yn=new Array(32),Or=0;0!==ot;Or++,ot>>>=1)yn[Or]=1&ot?Ae[un++]:void 0;return yn[_t]=lt,new ri(V,un+1,yn)}(V,Ho,_i,Or,Mr);if(oi&&!Mr&&2===Ho.length&&pr(Ho[1^ko]))return Ho[1^ko];if(oi&&Mr&&1===Ho.length&&pr(Mr))return Mr;var gr=V&&V===this.ownerID,co=oi?Mr?_i:_i^Vr:_i|Vr,Ss=oi?Mr?ra(Ho,ko,Mr,gr):function(V,Ae,ot){var _t=V.length-1;if(ot&&Ae===_t)return V.pop(),V;for(var lt=new Array(_t),un=0,yn=0;yn<_t;yn++)yn===Ae&&(un=1),lt[yn]=V[yn+un];return lt}(Ho,ko,gr):function(V,Ae,ot,_t){var lt=V.length+1;if(_t&&Ae+1===lt)return V[Ae]=ot,V;for(var un=new Array(lt),yn=0,Or=0;Or<lt;Or++)Or===Ae?(un[Or]=ot,yn=-1):un[Or]=V[Or+yn];return un}(Ho,ko,Mr,gr);return gr?(this.bitmap=co,this.nodes=Ss,this):new rr(V,co,Ss)},ri.prototype.get=function(V,Ae,ot,_t){void 0===Ae&&(Ae=Dr(ot));var un=this.nodes[31&(0===V?Ae:Ae>>>V)];return un?un.get(V+5,Ae,ot,_t):_t},ri.prototype.update=function(V,Ae,ot,_t,lt,un,yn){void 0===ot&&(ot=Dr(_t));var Or=31&(0===Ae?ot:ot>>>Ae),_i=this.nodes,oi=_i[Or];if(lt===$&&!oi)return this;var ko=Ct(oi,V,Ae+5,ot,_t,lt,un,yn);if(ko===oi)return this;var Ho=this.count;if(oi){if(!ko&&--Ho<yl)return function(V,Ae,ot,_t){for(var lt=0,un=0,yn=new Array(ot),Or=0,Vr=1,_i=Ae.length;Or<_i;Or++,Vr<<=1){var oi=Ae[Or];void 0!==oi&&Or!==_t&&(lt|=Vr,yn[un++]=oi)}return new rr(V,lt,yn)}(V,_i,Ho,Or)}else Ho++;var Ln=V&&V===this.ownerID,Mr=ra(_i,Or,ko,Ln);return Ln?(this.count=Ho,this.nodes=Mr,this):new ri(V,Ho,Mr)},ho.prototype.get=function(V,Ae,ot,_t){for(var lt=this.entries,un=0,yn=lt.length;un<yn;un++)if(Tr(ot,lt[un][0]))return lt[un][1];return _t},ho.prototype.update=function(V,Ae,ot,_t,lt,un,yn){void 0===ot&&(ot=Dr(_t));var Or=lt===$;if(ot!==this.keyHash)return Or?this:(he(yn),he(un),nn(this,V,Ae,ot,[_t,lt]));for(var Vr=this.entries,_i=0,oi=Vr.length;_i<oi&&!Tr(_t,Vr[_i][0]);_i++);var ko=_i<oi;if(ko?Vr[_i][1]===lt:Or)return this;if(he(yn),(Or||!ko)&&he(un),Or&&2===oi)return new Ti(V,this.keyHash,Vr[1^_i]);var Ho=V&&V===this.ownerID,Ln=Ho?Vr:Oe(Vr);return ko?Or?_i===oi-1?Ln.pop():Ln[_i]=Ln.pop():Ln[_i]=[_t,lt]:Ln.push([_t,lt]),Ho?(this.entries=Ln,this):new ho(V,this.keyHash,Ln)},Ti.prototype.get=function(V,Ae,ot,_t){return Tr(ot,this.entry[0])?this.entry[1]:_t},Ti.prototype.update=function(V,Ae,ot,_t,lt,un,yn){var Or=lt===$,Vr=Tr(_t,this.entry[0]);return(Vr?lt===this.entry[1]:Or)?this:(he(yn),Or?void he(un):Vr?V&&V===this.ownerID?(this.entry[1]=lt,this):new Ti(V,this.keyHash,[_t,lt]):(he(un),nn(this,V,Ae,Dr(_t),[_t,lt])))},yr.prototype.iterate=ho.prototype.iterate=function(V,Ae){for(var ot=this.entries,_t=0,lt=ot.length-1;_t<=lt;_t++)if(!1===V(ot[Ae?lt-_t:_t]))return!1},rr.prototype.iterate=ri.prototype.iterate=function(V,Ae){for(var ot=this.nodes,_t=0,lt=ot.length-1;_t<=lt;_t++){var un=ot[Ae?lt-_t:_t];if(un&&!1===un.iterate(V,Ae))return!1}},Ti.prototype.iterate=function(V,Ae){return V(this.entry)},i(Bo,Ut),Bo.prototype.next=function(){for(var V=this._type,Ae=this._stack;Ae;){var lt,ot=Ae.node,_t=Ae.index++;if(ot.entry){if(0===_t)return xo(V,ot.entry)}else if(ot.entries){if(_t<=(lt=ot.entries.length-1))return xo(V,ot.entries[this._reverse?lt-_t:_t])}else if(_t<=(lt=ot.nodes.length-1)){var un=ot.nodes[this._reverse?lt-_t:_t];if(un){if(un.entry)return xo(V,un.entry);Ae=this._stack=Li(un,Ae)}continue}Ae=this._stack=this._stack.__prev}return{value:void 0,done:!0}};var Bs=8,Yl=16,yl=8;function fo(V){var Ae=Eo();if(null==V)return Ae;if(Da(V))return V;var ot=p(V),_t=ot.size;return 0===_t?Ae:(So(_t),_t>0&&_t<32?Qs(0,_t,5,null,new gs(ot.toArray())):Ae.withMutations(function(lt){lt.setSize(_t),ot.forEach(function(un,yn){return lt.set(yn,un)})}))}function Da(V){return!(!V||!V[Ao])}i(fo,Ii),fo.of=function(){return this(arguments)},fo.prototype.toString=function(){return this.__toString("List [","]")},fo.prototype.get=function(V,Ae){if((V=dt(this,V))>=0&&V<this.size){var ot=kr(this,V+=this._origin);return ot&&ot.array[31&V]}return Ae},fo.prototype.set=function(V,Ae){return function(V,Ae,ot){if((Ae=dt(V,Ae))!=Ae)return V;if(Ae>=V.size||Ae<0)return V.withMutations(function(yn){Ae<0?ro(yn,Ae).set(0,ot):ro(yn,0,Ae+1).set(Ae,ot)});Ae+=V._origin;var _t=V._tail,lt=V._root,un=oe(ve);return Ae>=on(V._capacity)?_t=ms(_t,V.__ownerID,0,Ae,ot,un):lt=ms(lt,V.__ownerID,V._level,Ae,ot,un),un.value?V.__ownerID?(V._root=lt,V._tail=_t,V.__hash=void 0,V.__altered=!0,V):Qs(V._origin,V._capacity,V._level,lt,_t):V}(this,V,Ae)},fo.prototype.remove=function(V){return this.has(V)?0===V?this.shift():V===this.size-1?this.pop():this.splice(V,1):this},fo.prototype.insert=function(V,Ae){return this.splice(V,0,Ae)},fo.prototype.clear=function(){return 0===this.size?this:this.__ownerID?(this.size=this._origin=this._capacity=0,this._level=5,this._root=this._tail=null,this.__hash=void 0,this.__altered=!0,this):Eo()},fo.prototype.push=function(){var V=arguments,Ae=this.size;return this.withMutations(function(ot){ro(ot,0,Ae+V.length);for(var _t=0;_t<V.length;_t++)ot.set(Ae+_t,V[_t])})},fo.prototype.pop=function(){return ro(this,0,-1)},fo.prototype.unshift=function(){var V=arguments;return this.withMutations(function(Ae){ro(Ae,-V.length);for(var ot=0;ot<V.length;ot++)Ae.set(ot,V[ot])})},fo.prototype.shift=function(){return ro(this,1)},fo.prototype.merge=function(){return tt(this,void 0,arguments)},fo.prototype.mergeWith=function(V){return tt(this,V,S.call(arguments,1))},fo.prototype.mergeDeep=function(){return tt(this,Do,arguments)},fo.prototype.mergeDeepWith=function(V){var Ae=S.call(arguments,1);return tt(this,Js(V),Ae)},fo.prototype.setSize=function(V){return ro(this,0,V)},fo.prototype.slice=function(V,Ae){var ot=this.size;return Ye(V,Ae,ot)?this:ro(this,je(V,ot),Ie(Ae,ot))},fo.prototype.__iterator=function(V,Ae){var ot=0,_t=pl(this,Ae);return new Ut(function(){var lt=_t();return lt===Ra?{value:void 0,done:!0}:Bt(V,ot++,lt)})},fo.prototype.__iterate=function(V,Ae){for(var lt,ot=0,_t=pl(this,Ae);(lt=_t())!==Ra&&!1!==V(lt,ot++,this););return ot},fo.prototype.__ensureOwner=function(V){return V===this.__ownerID?this:V?Qs(this._origin,this._capacity,this._level,this._root,this._tail,V,this.__hash):(this.__ownerID=V,this)},fo.isList=Da;var Ao="@@__IMMUTABLE_LIST__@@",ls=fo.prototype;function gs(V,Ae){this.array=V,this.ownerID=Ae}ls[Ao]=!0,ls[Q]=ls.remove,ls.setIn=cr.setIn,ls.deleteIn=ls.removeIn=cr.removeIn,ls.update=cr.update,ls.updateIn=cr.updateIn,ls.mergeIn=cr.mergeIn,ls.mergeDeepIn=cr.mergeDeepIn,ls.withMutations=cr.withMutations,ls.asMutable=cr.asMutable,ls.asImmutable=cr.asImmutable,ls.wasAltered=cr.wasAltered,gs.prototype.removeBefore=function(V,Ae,ot){if(ot===Ae?1<<Ae:0===this.array.length)return this;var _t=ot>>>Ae&31;if(_t>=this.array.length)return new gs([],V);var un,lt=0===_t;if(Ae>0){var yn=this.array[_t];if((un=yn&&yn.removeBefore(V,Ae-5,ot))===yn&&lt)return this}if(lt&&!un)return this;var Or=Co(this,V);if(!lt)for(var Vr=0;Vr<_t;Vr++)Or.array[Vr]=void 0;return un&&(Or.array[_t]=un),Or},gs.prototype.removeAfter=function(V,Ae,ot){if(ot===(Ae?1<<Ae:0)||0===this.array.length)return this;var lt,_t=ot-1>>>Ae&31;if(_t>=this.array.length)return this;if(Ae>0){var un=this.array[_t];if((lt=un&&un.removeAfter(V,Ae-5,ot))===un&&_t===this.array.length-1)return this}var yn=Co(this,V);return yn.array.splice(_t+1),lt&&(yn.array[_t]=lt),yn};var Fo,sn,Ra={};function pl(V,Ae){var ot=V._origin,_t=V._capacity,lt=on(_t),un=V._tail;return yn(V._root,V._level,0);function yn(_i,oi,ko){return 0===oi?function(_i,oi){var ko=oi===lt?un&&un.array:_i&&_i.array,Ho=oi>ot?0:ot-oi,Ln=_t-oi;return Ln>32&&(Ln=32),function(){if(Ho===Ln)return Ra;var Mr=Ae?--Ln:Ho++;return ko&&ko[Mr]}}(_i,ko):function(_i,oi,ko){var Ho,Ln=_i&&_i.array,Mr=ko>ot?0:ot-ko>>oi,gr=1+(_t-ko>>oi);return gr>32&&(gr=32),function(){for(;;){if(Ho){var co=Ho();if(co!==Ra)return co;Ho=null}if(Mr===gr)return Ra;var Ss=Ae?--gr:Mr++;Ho=yn(Ln&&Ln[Ss],oi-5,ko+(Ss<<oi))}}}(_i,oi,ko)}}function Qs(V,Ae,ot,_t,lt,un,yn){var Or=Object.create(ls);return Or.size=Ae-V,Or._origin=V,Or._capacity=Ae,Or._level=ot,Or._root=_t,Or._tail=lt,Or.__ownerID=un,Or.__hash=yn,Or.__altered=!1,Or}function Eo(){return Fo||(Fo=Qs(0,0,5))}function ms(V,Ae,ot,_t,lt,un){var Vr,yn=_t>>>ot&31,Or=V&&yn<V.array.length;if(!Or&&void 0===lt)return V;if(ot>0){var _i=V&&V.array[yn],oi=ms(_i,Ae,ot-5,_t,lt,un);return oi===_i?V:((Vr=Co(V,Ae)).array[yn]=oi,Vr)}return Or&&V.array[yn]===lt?V:(he(un),Vr=Co(V,Ae),void 0===lt&&yn===Vr.array.length-1?Vr.array.pop():Vr.array[yn]=lt,Vr)}function Co(V,Ae){return Ae&&V&&Ae===V.ownerID?V:new gs(V?V.array.slice():[],Ae)}function kr(V,Ae){if(Ae>=on(V._capacity))return V._tail;if(Ae<1<<V._level+5){for(var ot=V._root,_t=V._level;ot&&_t>0;)ot=ot.array[Ae>>>_t&31],_t-=5;return ot}}function ro(V,Ae,ot){void 0!==Ae&&(Ae|=0),void 0!==ot&&(ot|=0);var _t=V.__ownerID||new me,lt=V._origin,un=V._capacity,yn=lt+Ae,Or=void 0===ot?un:ot<0?un+ot:lt+ot;if(yn===lt&&Or===un)return V;if(yn>=Or)return V.clear();for(var Vr=V._level,_i=V._root,oi=0;yn+oi<0;)_i=new gs(_i&&_i.array.length?[void 0,_i]:[],_t),oi+=1<<(Vr+=5);oi&&(yn+=oi,lt+=oi,Or+=oi,un+=oi);for(var ko=on(un),Ho=on(Or);Ho>=1<<Vr+5;)_i=new gs(_i&&_i.array.length?[_i]:[],_t),Vr+=5;var Ln=V._tail,Mr=Ho<ko?kr(V,Or-1):Ho>ko?new gs([],_t):Ln;if(Ln&&Ho>ko&&yn<un&&Ln.array.length){for(var gr=_i=Co(_i,_t),co=Vr;co>5;co-=5){var Ss=ko>>>co&31;gr=gr.array[Ss]=Co(gr.array[Ss],_t)}gr.array[ko>>>5&31]=Ln}if(Or<un&&(Mr=Mr&&Mr.removeAfter(_t,0,Or)),yn>=Ho)yn-=Ho,Or-=Ho,Vr=5,_i=null,Mr=Mr&&Mr.removeBefore(_t,0,yn);else if(yn>lt||Ho<ko){for(oi=0;_i;){var Na=yn>>>Vr&31;if(Na!==Ho>>>Vr&31)break;Na&&(oi+=(1<<Vr)*Na),Vr-=5,_i=_i.array[Na]}_i&&yn>lt&&(_i=_i.removeBefore(_t,Vr,yn-oi)),_i&&Ho<ko&&(_i=_i.removeAfter(_t,Vr,Ho-oi)),oi&&(yn-=oi,Or-=oi)}return V.__ownerID?(V.size=Or-yn,V._origin=yn,V._capacity=Or,V._level=Vr,V._root=_i,V._tail=Mr,V.__hash=void 0,V.__altered=!0,V):Qs(yn,Or,Vr,_i,Mr)}function tt(V,Ae,ot){for(var _t=[],lt=0,un=0;un<ot.length;un++){var yn=ot[un],Or=p(yn);Or.size>lt&&(lt=Or.size),e(yn)||(Or=Or.map(function(Vr){return Vn(Vr)})),_t.push(Or)}return lt>V.size&&(V=V.setSize(lt)),_s(V,Ae,_t)}function on(V){return V<32?0:V-1>>>5<<5}function ne(V){return null==V?ei():$e(V)?V:ei().withMutations(function(Ae){var ot=u(V);So(ot.size),ot.forEach(function(_t,lt){return Ae.set(lt,_t)})})}function $e(V){return ai(V)&&M(V)}function Pt(V,Ae,ot,_t){var lt=Object.create(ne.prototype);return lt.size=V?V.size:0,lt._map=V,lt._list=Ae,lt.__ownerID=ot,lt.__hash=_t,lt}function ei(){return sn||(sn=Pt(Ht(),Eo()))}function fi(V,Ae,ot){var Or,Vr,_t=V._map,lt=V._list,un=_t.get(Ae),yn=void 0!==un;if(ot===$){if(!yn)return V;lt.size>=32&&lt.size>=2*_t.size?(Or=(Vr=lt.filter(function(_i,oi){return void 0!==_i&&un!==oi})).toKeyedSeq().map(function(_i){return _i[0]}).flip().toMap(),V.__ownerID&&(Or.__ownerID=Vr.__ownerID=V.__ownerID)):(Or=_t.remove(Ae),Vr=un===lt.size-1?lt.pop():lt.set(un,void 0))}else if(yn){if(ot===lt.get(un)[1])return V;Or=_t,Vr=lt.set(un,[Ae,ot])}else Or=_t.set(Ae,lt.size),Vr=lt.set(lt.size,[Ae,ot]);return V.__ownerID?(V.size=Or.size,V._map=Or,V._list=Vr,V.__hash=void 0,V):Pt(Or,Vr)}function Oi(V,Ae){this._iter=V,this._useKeys=Ae,this.size=V.size}function os(V){this._iter=V,this.size=V.size}function Ro(V){this._iter=V,this.size=V.size}function Uo(V){this._iter=V,this.size=V.size}function To(V){var Ae=De(V);return Ae._iter=V,Ae.size=V.size,Ae.flip=function(){return V},Ae.reverse=function(){var ot=V.reverse.apply(this);return ot.flip=function(){return V.reverse()},ot},Ae.has=function(ot){return V.includes(ot)},Ae.includes=function(ot){return V.has(ot)},Ae.cacheResult=Tt,Ae.__iterateUncached=function(ot,_t){var lt=this;return V.__iterate(function(un,yn){return!1!==ot(yn,un,lt)},_t)},Ae.__iteratorUncached=function(ot,_t){if(2===ot){var lt=V.__iterator(ot,_t);return new Ut(function(){var un=lt.next();if(!un.done){var yn=un.value[0];un.value[0]=un.value[1],un.value[1]=yn}return un})}return V.__iterator(1===ot?0:1,_t)},Ae}function Ea(V,Ae,ot){var _t=De(V);return _t.size=V.size,_t.has=function(lt){return V.has(lt)},_t.get=function(lt,un){var yn=V.get(lt,$);return yn===$?un:Ae.call(ot,yn,lt,V)},_t.__iterateUncached=function(lt,un){var yn=this;return V.__iterate(function(Or,Vr,_i){return!1!==lt(Ae.call(ot,Or,Vr,_i),Vr,yn)},un)},_t.__iteratorUncached=function(lt,un){var yn=V.__iterator(2,un);return new Ut(function(){var Or=yn.next();if(Or.done)return Or;var Vr=Or.value,_i=Vr[0];return Bt(lt,_i,Ae.call(ot,Vr[1],_i,V),Or)})},_t}function al(V,Ae){var ot=De(V);return ot._iter=V,ot.size=V.size,ot.reverse=function(){return V},V.flip&&(ot.flip=function(){var _t=To(V);return _t.reverse=function(){return V.flip()},_t}),ot.get=function(_t,lt){return V.get(Ae?_t:-1-_t,lt)},ot.has=function(_t){return V.has(Ae?_t:-1-_t)},ot.includes=function(_t){return V.includes(_t)},ot.cacheResult=Tt,ot.__iterate=function(_t,lt){var un=this;return V.__iterate(function(yn,Or){return _t(yn,Or,un)},!lt)},ot.__iterator=function(_t,lt){return V.__iterator(_t,!lt)},ot}function qu(V,Ae,ot,_t){var lt=De(V);return _t&&(lt.has=function(un){var yn=V.get(un,$);return yn!==$&&!!Ae.call(ot,yn,un,V)},lt.get=function(un,yn){var Or=V.get(un,$);return Or!==$&&Ae.call(ot,Or,un,V)?Or:yn}),lt.__iterateUncached=function(un,yn){var Or=this,Vr=0;return V.__iterate(function(_i,oi,ko){if(Ae.call(ot,_i,oi,ko))return Vr++,un(_i,_t?oi:Vr-1,Or)},yn),Vr},lt.__iteratorUncached=function(un,yn){var Or=V.__iterator(2,yn),Vr=0;return new Ut(function(){for(;;){var _i=Or.next();if(_i.done)return _i;var oi=_i.value,ko=oi[0],Ho=oi[1];if(Ae.call(ot,Ho,ko,V))return Bt(un,_t?ko:Vr++,Ho,_i)}})},lt}function bc(V,Ae,ot,_t){var lt=V.size;if(void 0!==Ae&&(Ae|=0),void 0!==ot&&(ot===1/0?ot=lt:ot|=0),Ye(Ae,ot,lt))return V;var un=je(Ae,lt),yn=Ie(ot,lt);if(un!=un||yn!=yn)return bc(V.toSeq().cacheResult(),Ae,ot,_t);var Vr,Or=yn-un;Or==Or&&(Vr=Or<0?0:Or);var _i=De(V);return _i.size=0===Vr?Vr:V.size&&Vr||void 0,!_t&&di(V)&&Vr>=0&&(_i.get=function(oi,ko){return(oi=dt(this,oi))>=0&&oi<Vr?V.get(oi+un,ko):ko}),_i.__iterateUncached=function(oi,ko){var Ho=this;if(0===Vr)return 0;if(ko)return this.cacheResult().__iterate(oi,ko);var Ln=0,Mr=!0,gr=0;return V.__iterate(function(co,Ss){if(!Mr||!(Mr=Ln++<un))return gr++,!1!==oi(co,_t?Ss:gr-1,Ho)&&gr!==Vr}),gr},_i.__iteratorUncached=function(oi,ko){if(0!==Vr&&ko)return this.cacheResult().__iterator(oi,ko);var Ho=0!==Vr&&V.__iterator(oi,ko),Ln=0,Mr=0;return new Ut(function(){for(;Ln++<un;)Ho.next();if(++Mr>Vr)return{value:void 0,done:!0};var gr=Ho.next();return _t||1===oi?gr:Bt(oi,Mr-1,0===oi?void 0:gr.value[1],gr)})},_i}function Hl(V,Ae,ot,_t){var lt=De(V);return lt.__iterateUncached=function(un,yn){var Or=this;if(yn)return this.cacheResult().__iterate(un,yn);var Vr=!0,_i=0;return V.__iterate(function(oi,ko,Ho){if(!Vr||!(Vr=Ae.call(ot,oi,ko,Ho)))return _i++,un(oi,_t?ko:_i-1,Or)}),_i},lt.__iteratorUncached=function(un,yn){var Or=this;if(yn)return this.cacheResult().__iterator(un,yn);var Vr=V.__iterator(2,yn),_i=!0,oi=0;return new Ut(function(){var ko,Ho,Ln;do{if((ko=Vr.next()).done)return _t||1===un?ko:Bt(un,oi++,0===un?void 0:ko.value[1],ko);var Mr=ko.value;Ho=Mr[0],Ln=Mr[1],_i&&(_i=Ae.call(ot,Ln,Ho,Or))}while(_i);return 2===un?ko:Bt(un,Ho,Ln,ko)})},lt}function Zl(V,Ae){var ot=_(V),_t=[V].concat(Ae).map(function(yn){return e(yn)?ot&&(yn=u(yn)):yn=ot?Br(yn):On(Array.isArray(yn)?yn:[yn]),yn}).filter(function(yn){return 0!==yn.size});if(0===_t.length)return V;if(1===_t.length){var lt=_t[0];if(lt===V||ot&&_(lt)||y(V)&&y(lt))return lt}var un=new In(_t);return ot?un=un.toKeyedSeq():y(V)||(un=un.toSetSeq()),(un=un.flatten(!0)).size=_t.reduce(function(yn,Or){if(void 0!==yn){var Vr=Or.size;if(void 0!==Vr)return yn+Vr}},0),un}function $s(V,Ae,ot){var _t=De(V);return _t.__iterateUncached=function(lt,un){var yn=0,Or=!1;return function Vr(_i,oi){var ko=this;_i.__iterate(function(Ho,Ln){return(!Ae||oi<Ae)&&e(Ho)?Vr(Ho,oi+1):!1===lt(Ho,ot?Ln:yn++,ko)&&(Or=!0),!Or},un)}(V,0),yn},_t.__iteratorUncached=function(lt,un){var yn=V.__iterator(lt,un),Or=[],Vr=0;return new Ut(function(){for(;yn;){var _i=yn.next();if(!1===_i.done){var oi=_i.value;if(2===lt&&(oi=oi[1]),Ae&&!(Or.length<Ae)||!e(oi))return ot?_i:Bt(lt,Vr++,oi,_i);Or.push(yn),yn=oi.__iterator(lt,un)}else yn=Or.pop()}return{value:void 0,done:!0}})},_t}function el(V,Ae,ot){Ae||(Ae=dr);var _t=_(V),lt=0,un=V.toSeq().map(function(yn,Or){return[Or,yn,lt++,ot?ot(yn,Or,V):yn]}).toArray();return un.sort(function(yn,Or){return Ae(yn[3],Or[3])||yn[2]-Or[2]}).forEach(_t?function(yn,Or){un[Or].length=2}:function(yn,Or){un[Or]=yn[1]}),_t?Ir(un):y(V)?wr(un):Qr(un)}function Cu(V,Ae,ot){if(Ae||(Ae=dr),ot){var _t=V.toSeq().map(function(lt,un){return[lt,ot(lt,un,V)]}).reduce(function(lt,un){return jl(Ae,lt[1],un[1])?un:lt});return _t&&_t[0]}return V.reduce(function(lt,un){return jl(Ae,lt,un)?un:lt})}function jl(V,Ae,ot){var _t=V(ot,Ae);return 0===_t&&ot!==Ae&&(null==ot||ot!=ot)||_t>0}function rt(V,Ae,ot){var _t=De(V);return _t.size=new In(ot).map(function(lt){return lt.size}).min(),_t.__iterate=function(lt,un){for(var Or,yn=this.__iterator(1,un),Vr=0;!(Or=yn.next()).done&&!1!==lt(Or.value,Vr++,this););return Vr},_t.__iteratorUncached=function(lt,un){var yn=ot.map(function(_i){return _i=r(_i),zt(un?_i.reverse():_i)}),Or=0,Vr=!1;return new Ut(function(){var _i;return Vr||(_i=yn.map(function(oi){return oi.next()}),Vr=_i.some(function(oi){return oi.done})),Vr?{value:void 0,done:!0}:Bt(lt,Or++,Ae.apply(null,_i.map(function(oi){return oi.value})))})},_t}function Nt(V,Ae){return di(V)?Ae:V.constructor(Ae)}function ct(V){if(V!==Object(V))throw new TypeError("Expected [K, V] tuple: "+V)}function Te(V){return So(V.size),ce(V)}function Me(V){return _(V)?u:y(V)?p:f}function De(V){return Object.create((_(V)?Ir:y(V)?wr:Qr).prototype)}function Tt(){return this._iter.cacheResult?(this._iter.cacheResult(),this.size=this._iter.size,this):ci.prototype.cacheResult.call(this)}function dr(V,Ae){return V>Ae?1:V<Ae?-1:0}function Qi(V){var Ae=zt(V);if(!Ae){if(!Hr(V))throw new TypeError("Expected iterable or array-like: "+V);Ae=zt(r(V))}return Ae}function Jo(V,Ae){var ot,_t=function(yn){if(yn instanceof _t)return yn;if(!(this instanceof _t))return new _t(yn);if(!ot){ot=!0;var Or=Object.keys(V);(function(V,Ae){try{Ae.forEach(uu.bind(void 0,V))}catch(ot){}})(lt,Or),lt.size=Or.length,lt._name=Ae,lt._keys=Or,lt._defaultValues=V}this._map=Si(yn)},lt=_t.prototype=Object.create(Es);return lt.constructor=_t,_t}i(ne,Si),ne.of=function(){return this(arguments)},ne.prototype.toString=function(){return this.__toString("OrderedMap {","}")},ne.prototype.get=function(V,Ae){var ot=this._map.get(V);return void 0!==ot?this._list.get(ot)[1]:Ae},ne.prototype.clear=function(){return 0===this.size?this:this.__ownerID?(this.size=0,this._map.clear(),this._list.clear(),this):ei()},ne.prototype.set=function(V,Ae){return fi(this,V,Ae)},ne.prototype.remove=function(V){return fi(this,V,$)},ne.prototype.wasAltered=function(){return this._map.wasAltered()||this._list.wasAltered()},ne.prototype.__iterate=function(V,Ae){var ot=this;return this._list.__iterate(function(_t){return _t&&V(_t[1],_t[0],ot)},Ae)},ne.prototype.__iterator=function(V,Ae){return this._list.fromEntrySeq().__iterator(V,Ae)},ne.prototype.__ensureOwner=function(V){if(V===this.__ownerID)return this;var Ae=this._map.__ensureOwner(V),ot=this._list.__ensureOwner(V);return V?Pt(Ae,ot,V,this.__hash):(this.__ownerID=V,this._map=Ae,this._list=ot,this)},ne.isOrderedMap=$e,ne.prototype[J]=!0,ne.prototype[Q]=ne.prototype.remove,i(Oi,Ir),Oi.prototype.get=function(V,Ae){return this._iter.get(V,Ae)},Oi.prototype.has=function(V){return this._iter.has(V)},Oi.prototype.valueSeq=function(){return this._iter.valueSeq()},Oi.prototype.reverse=function(){var V=this,Ae=al(this,!0);return this._useKeys||(Ae.valueSeq=function(){return V._iter.toSeq().reverse()}),Ae},Oi.prototype.map=function(V,Ae){var ot=this,_t=Ea(this,V,Ae);return this._useKeys||(_t.valueSeq=function(){return ot._iter.toSeq().map(V,Ae)}),_t},Oi.prototype.__iterate=function(V,Ae){var _t,ot=this;return this._iter.__iterate(this._useKeys?function(lt,un){return V(lt,un,ot)}:(_t=Ae?Te(this):0,function(lt){return V(lt,Ae?--_t:_t++,ot)}),Ae)},Oi.prototype.__iterator=function(V,Ae){if(this._useKeys)return this._iter.__iterator(V,Ae);var ot=this._iter.__iterator(1,Ae),_t=Ae?Te(this):0;return new Ut(function(){var lt=ot.next();return lt.done?lt:Bt(V,Ae?--_t:_t++,lt.value,lt)})},Oi.prototype[J]=!0,i(os,wr),os.prototype.includes=function(V){return this._iter.includes(V)},os.prototype.__iterate=function(V,Ae){var ot=this,_t=0;return this._iter.__iterate(function(lt){return V(lt,_t++,ot)},Ae)},os.prototype.__iterator=function(V,Ae){var ot=this._iter.__iterator(1,Ae),_t=0;return new Ut(function(){var lt=ot.next();return lt.done?lt:Bt(V,_t++,lt.value,lt)})},i(Ro,Qr),Ro.prototype.has=function(V){return this._iter.includes(V)},Ro.prototype.__iterate=function(V,Ae){var ot=this;return this._iter.__iterate(function(_t){return V(_t,_t,ot)},Ae)},Ro.prototype.__iterator=function(V,Ae){var ot=this._iter.__iterator(1,Ae);return new Ut(function(){var _t=ot.next();return _t.done?_t:Bt(V,_t.value,_t.value,_t)})},i(Uo,Ir),Uo.prototype.entrySeq=function(){return this._iter.toSeq()},Uo.prototype.__iterate=function(V,Ae){var ot=this;return this._iter.__iterate(function(_t){if(_t){ct(_t);var lt=e(_t);return V(lt?_t.get(1):_t[1],lt?_t.get(0):_t[0],ot)}},Ae)},Uo.prototype.__iterator=function(V,Ae){var ot=this._iter.__iterator(1,Ae);return new Ut(function(){for(;;){var _t=ot.next();if(_t.done)return _t;var lt=_t.value;if(lt){ct(lt);var un=e(lt);return Bt(V,un?lt.get(0):lt[0],un?lt.get(1):lt[1],_t)}}})},os.prototype.cacheResult=Oi.prototype.cacheResult=Ro.prototype.cacheResult=Uo.prototype.cacheResult=Tt,i(Jo,si),Jo.prototype.toString=function(){return this.__toString(Ms(this)+" {","}")},Jo.prototype.has=function(V){return this._defaultValues.hasOwnProperty(V)},Jo.prototype.get=function(V,Ae){if(!this.has(V))return Ae;var ot=this._defaultValues[V];return this._map?this._map.get(V,ot):ot},Jo.prototype.clear=function(){if(this.__ownerID)return this._map&&this._map.clear(),this;var V=this.constructor;return V._empty||(V._empty=vs(this,Ht()))},Jo.prototype.set=function(V,Ae){if(!this.has(V))throw new Error('Cannot set unknown key "'+V+'" on '+Ms(this));if(this._map&&!this._map.has(V)&&Ae===this._defaultValues[V])return this;var _t=this._map&&this._map.set(V,Ae);return this.__ownerID||_t===this._map?this:vs(this,_t)},Jo.prototype.remove=function(V){if(!this.has(V))return this;var Ae=this._map&&this._map.remove(V);return this.__ownerID||Ae===this._map?this:vs(this,Ae)},Jo.prototype.wasAltered=function(){return this._map.wasAltered()},Jo.prototype.__iterator=function(V,Ae){var ot=this;return u(this._defaultValues).map(function(_t,lt){return ot.get(lt)}).__iterator(V,Ae)},Jo.prototype.__iterate=function(V,Ae){var ot=this;return u(this._defaultValues).map(function(_t,lt){return ot.get(lt)}).__iterate(V,Ae)},Jo.prototype.__ensureOwner=function(V){if(V===this.__ownerID)return this;var Ae=this._map&&this._map.__ensureOwner(V);return V?vs(this,Ae,V):(this.__ownerID=V,this._map=Ae,this)};var Es=Jo.prototype;function vs(V,Ae,ot){var _t=Object.create(Object.getPrototypeOf(V));return _t._map=Ae,_t.__ownerID=ot,_t}function Ms(V){return V._name||V.constructor.name||"Record"}function uu(V,Ae){Object.defineProperty(V,Ae,{get:function(){return this.get(Ae)},set:function(ot){mr(this.__ownerID,"Cannot set on an immutable record."),this.set(Ae,ot)}})}function Wa(V){return null==V?Pc():Pl(V)&&!M(V)?V:Pc().withMutations(function(Ae){var ot=f(V);So(ot.size),ot.forEach(function(_t){return Ae.add(_t)})})}function Pl(V){return!(!V||!V[ec])}Es[Q]=Es.remove,Es.deleteIn=Es.removeIn=cr.removeIn,Es.merge=cr.merge,Es.mergeWith=cr.mergeWith,Es.mergeIn=cr.mergeIn,Es.mergeDeep=cr.mergeDeep,Es.mergeDeepWith=cr.mergeDeepWith,Es.mergeDeepIn=cr.mergeDeepIn,Es.setIn=cr.setIn,Es.update=cr.update,Es.updateIn=cr.updateIn,Es.withMutations=cr.withMutations,Es.asMutable=cr.asMutable,Es.asImmutable=cr.asImmutable,i(Wa,no),Wa.of=function(){return this(arguments)},Wa.fromKeys=function(V){return this(u(V).keySeq())},Wa.prototype.toString=function(){return this.__toString("Set {","}")},Wa.prototype.has=function(V){return this._map.has(V)},Wa.prototype.add=function(V){return Ts(this,this._map.set(V,!0))},Wa.prototype.remove=function(V){return Ts(this,this._map.remove(V))},Wa.prototype.clear=function(){return Ts(this,this._map.clear())},Wa.prototype.union=function(){var V=S.call(arguments,0);return 0===(V=V.filter(function(Ae){return 0!==Ae.size})).length?this:0!==this.size||this.__ownerID||1!==V.length?this.withMutations(function(Ae){for(var ot=0;ot<V.length;ot++)f(V[ot]).forEach(function(_t){return Ae.add(_t)})}):this.constructor(V[0])},Wa.prototype.intersect=function(){var V=S.call(arguments,0);if(0===V.length)return this;V=V.map(function(ot){return f(ot)});var Ae=this;return this.withMutations(function(ot){Ae.forEach(function(_t){V.every(function(lt){return lt.includes(_t)})||ot.remove(_t)})})},Wa.prototype.subtract=function(){var V=S.call(arguments,0);if(0===V.length)return this;V=V.map(function(ot){return f(ot)});var Ae=this;return this.withMutations(function(ot){Ae.forEach(function(_t){V.some(function(lt){return lt.includes(_t)})&&ot.remove(_t)})})},Wa.prototype.merge=function(){return this.union.apply(this,arguments)},Wa.prototype.mergeWith=function(V){var Ae=S.call(arguments,1);return this.union.apply(this,Ae)},Wa.prototype.sort=function(V){return Mu(el(this,V))},Wa.prototype.sortBy=function(V,Ae){return Mu(el(this,Ae,V))},Wa.prototype.wasAltered=function(){return this._map.wasAltered()},Wa.prototype.__iterate=function(V,Ae){var ot=this;return this._map.__iterate(function(_t,lt){return V(lt,lt,ot)},Ae)},Wa.prototype.__iterator=function(V,Ae){return this._map.map(function(ot,_t){return _t}).__iterator(V,Ae)},Wa.prototype.__ensureOwner=function(V){if(V===this.__ownerID)return this;var Ae=this._map.__ensureOwner(V);return V?this.__make(Ae,V):(this.__ownerID=V,this._map=Ae,this)},Wa.isSet=Pl;var Ec,ec="@@__IMMUTABLE_SET__@@",Ol=Wa.prototype;function Ts(V,Ae){return V.__ownerID?(V.size=Ae.size,V._map=Ae,V):Ae===V._map?V:0===Ae.size?V.__empty():V.__make(Ae)}function Nc(V,Ae){var ot=Object.create(Ol);return ot.size=V?V.size:0,ot._map=V,ot.__ownerID=Ae,ot}function Pc(){return Ec||(Ec=Nc(Ht()))}function Mu(V){return null==V?ua():Ic(V)?V:ua().withMutations(function(Ae){var ot=f(V);So(ot.size),ot.forEach(function(_t){return Ae.add(_t)})})}function Ic(V){return Pl(V)&&M(V)}Ol[ec]=!0,Ol[Q]=Ol.remove,Ol.mergeDeep=Ol.merge,Ol.mergeDeepWith=Ol.mergeWith,Ol.withMutations=cr.withMutations,Ol.asMutable=cr.asMutable,Ol.asImmutable=cr.asImmutable,Ol.__empty=Pc,Ol.__make=Nc,i(Mu,Wa),Mu.of=function(){return this(arguments)},Mu.fromKeys=function(V){return this(u(V).keySeq())},Mu.prototype.toString=function(){return this.__toString("OrderedSet {","}")},Mu.isOrderedSet=Ic;var Fi,md=Mu.prototype;function tc(V,Ae){var ot=Object.create(md);return ot.size=V?V.size:0,ot._map=V,ot.__ownerID=Ae,ot}function ua(){return Fi||(Fi=tc(ei()))}function Aa(V){return null==V?cu():As(V)?V:cu().unshiftAll(V)}function As(V){return!(!V||!V[ku])}md[J]=!0,md.__empty=ua,md.__make=tc,i(Aa,Ii),Aa.of=function(){return this(arguments)},Aa.prototype.toString=function(){return this.__toString("Stack [","]")},Aa.prototype.get=function(V,Ae){var ot=this._head;for(V=dt(this,V);ot&&V--;)ot=ot.next;return ot?ot.value:Ae},Aa.prototype.peek=function(){return this._head&&this._head.value},Aa.prototype.push=function(){if(0===arguments.length)return this;for(var V=this.size+arguments.length,Ae=this._head,ot=arguments.length-1;ot>=0;ot--)Ae={value:arguments[ot],next:Ae};return this.__ownerID?(this.size=V,this._head=Ae,this.__hash=void 0,this.__altered=!0,this):Au(V,Ae)},Aa.prototype.pushAll=function(V){if(0===(V=p(V)).size)return this;So(V.size);var Ae=this.size,ot=this._head;return V.reverse().forEach(function(_t){Ae++,ot={value:_t,next:ot}}),this.__ownerID?(this.size=Ae,this._head=ot,this.__hash=void 0,this.__altered=!0,this):Au(Ae,ot)},Aa.prototype.pop=function(){return this.slice(1)},Aa.prototype.unshift=function(){return this.push.apply(this,arguments)},Aa.prototype.unshiftAll=function(V){return this.pushAll(V)},Aa.prototype.shift=function(){return this.pop.apply(this,arguments)},Aa.prototype.clear=function(){return 0===this.size?this:this.__ownerID?(this.size=0,this._head=void 0,this.__hash=void 0,this.__altered=!0,this):cu()},Aa.prototype.slice=function(V,Ae){if(Ye(V,Ae,this.size))return this;var ot=je(V,this.size);if(Ie(Ae,this.size)!==this.size)return Ii.prototype.slice.call(this,V,Ae);for(var lt=this.size-ot,un=this._head;ot--;)un=un.next;return this.__ownerID?(this.size=lt,this._head=un,this.__hash=void 0,this.__altered=!0,this):Au(lt,un)},Aa.prototype.__ensureOwner=function(V){return V===this.__ownerID?this:V?Au(this.size,this._head,V,this.__hash):(this.__ownerID=V,this.__altered=!1,this)},Aa.prototype.__iterate=function(V,Ae){if(Ae)return this.reverse().__iterate(V);for(var ot=0,_t=this._head;_t&&!1!==V(_t.value,ot++,this);)_t=_t.next;return ot},Aa.prototype.__iterator=function(V,Ae){if(Ae)return this.reverse().__iterator(V);var ot=0,_t=this._head;return new Ut(function(){if(_t){var lt=_t.value;return _t=_t.next,Bt(V,ot++,lt)}return{value:void 0,done:!0}})},Aa.isStack=As;var bu,ku="@@__IMMUTABLE_STACK__@@",bl=Aa.prototype;function Au(V,Ae,ot,_t){var lt=Object.create(bl);return lt.size=V,lt._head=Ae,lt.__ownerID=ot,lt.__hash=_t,lt.__altered=!1,lt}function cu(){return bu||(bu=Au(0))}function Gs(V,Ae){var ot=function(_t){V.prototype[_t]=Ae[_t]};return Object.keys(Ae).forEach(ot),Object.getOwnPropertySymbols&&Object.getOwnPropertySymbols(Ae).forEach(ot),V}bl[ku]=!0,bl.withMutations=cr.withMutations,bl.asMutable=cr.asMutable,bl.asImmutable=cr.asImmutable,bl.wasAltered=cr.wasAltered,r.Iterator=Ut,Gs(r,{toArray:function(){So(this.size);var V=new Array(this.size||0);return this.valueSeq().__iterate(function(Ae,ot){V[ot]=Ae}),V},toIndexedSeq:function(){return new os(this)},toJS:function(){return this.toSeq().map(function(V){return V&&"function"==typeof V.toJS?V.toJS():V}).__toJS()},toJSON:function(){return this.toSeq().map(function(V){return V&&"function"==typeof V.toJSON?V.toJSON():V}).__toJS()},toKeyedSeq:function(){return new Oi(this,!0)},toMap:function(){return Si(this.toKeyedSeq())},toObject:function(){So(this.size);var V={};return this.__iterate(function(Ae,ot){V[ot]=Ae}),V},toOrderedMap:function(){return ne(this.toKeyedSeq())},toOrderedSet:function(){return Mu(_(this)?this.valueSeq():this)},toSet:function(){return Wa(_(this)?this.valueSeq():this)},toSetSeq:function(){return new Ro(this)},toSeq:function(){return y(this)?this.toIndexedSeq():_(this)?this.toKeyedSeq():this.toSetSeq()},toStack:function(){return Aa(_(this)?this.valueSeq():this)},toList:function(){return fo(_(this)?this.valueSeq():this)},toString:function(){return"[Iterable]"},__toString:function(V,Ae){return 0===this.size?V+Ae:V+" "+this.toSeq().map(this.__toStringMapper).join(", ")+" "+Ae},concat:function(){return Nt(this,Zl(this,S.call(arguments,0)))},includes:function(V){return this.some(function(Ae){return Tr(Ae,V)})},entries:function(){return this.__iterator(2)},every:function(V,Ae){So(this.size);var ot=!0;return this.__iterate(function(_t,lt,un){if(!V.call(Ae,_t,lt,un))return ot=!1,!1}),ot},filter:function(V,Ae){return Nt(this,qu(this,V,Ae,!0))},find:function(V,Ae,ot){var _t=this.findEntry(V,Ae);return _t?_t[1]:ot},forEach:function(V,Ae){return So(this.size),this.__iterate(Ae?V.bind(Ae):V)},join:function(V){So(this.size),V=void 0!==V?""+V:",";var Ae="",ot=!0;return this.__iterate(function(_t){ot?ot=!1:Ae+=V,Ae+=null!=_t?_t.toString():""}),Ae},keys:function(){return this.__iterator(0)},map:function(V,Ae){return Nt(this,Ea(this,V,Ae))},reduce:function(V,Ae,ot){var _t,lt;return So(this.size),arguments.length<2?lt=!0:_t=Ae,this.__iterate(function(un,yn,Or){lt?(lt=!1,_t=un):_t=V.call(ot,_t,un,yn,Or)}),_t},reduceRight:function(V,Ae,ot){var _t=this.toKeyedSeq().reverse();return _t.reduce.apply(_t,arguments)},reverse:function(){return Nt(this,al(this,!0))},slice:function(V,Ae){return Nt(this,bc(this,V,Ae,!0))},some:function(V,Ae){return!this.every(Ar(V),Ae)},sort:function(V){return Nt(this,el(this,V))},values:function(){return this.__iterator(1)},butLast:function(){return this.slice(0,-1)},isEmpty:function(){return void 0!==this.size?0===this.size:!this.some(function(){return!0})},count:function(V,Ae){return ce(V?this.toSeq().filter(V,Ae):this)},countBy:function(V,Ae){return function(V,Ae,ot){var _t=Si().asMutable();return V.__iterate(function(lt,un){_t.update(Ae.call(ot,lt,un,V),0,function(yn){return yn+1})}),_t.asImmutable()}(this,V,Ae)},equals:function(V){return Nr(this,V)},entrySeq:function(){var V=this;if(V._cache)return new In(V._cache);var Ae=V.toSeq().map(du).toIndexedSeq();return Ae.fromEntrySeq=function(){return V.toSeq()},Ae},filterNot:function(V,Ae){return this.filter(Ar(V),Ae)},findEntry:function(V,Ae,ot){var _t=ot;return this.__iterate(function(lt,un,yn){if(V.call(Ae,lt,un,yn))return _t=[un,lt],!1}),_t},findKey:function(V,Ae){var ot=this.findEntry(V,Ae);return ot&&ot[0]},findLast:function(V,Ae,ot){return this.toKeyedSeq().reverse().find(V,Ae,ot)},findLastEntry:function(V,Ae,ot){return this.toKeyedSeq().reverse().findEntry(V,Ae,ot)},findLastKey:function(V,Ae){return this.toKeyedSeq().reverse().findKey(V,Ae)},first:function(){return this.find(ze)},flatMap:function(V,Ae){return Nt(this,function(V,Ae,ot){var _t=Me(V);return V.toSeq().map(function(lt,un){return _t(Ae.call(ot,lt,un,V))}).flatten(!0)}(this,V,Ae))},flatten:function(V){return Nt(this,$s(this,V,!0))},fromEntrySeq:function(){return new Uo(this)},get:function(V,Ae){return this.find(function(ot,_t){return Tr(_t,V)},void 0,Ae)},getIn:function(V,Ae){for(var lt,ot=this,_t=Qi(V);!(lt=_t.next()).done;)if((ot=ot&&ot.get?ot.get(lt.value,$):$)===$)return Ae;return ot},groupBy:function(V,Ae){return function(V,Ae,ot){var _t=_(V),lt=(M(V)?ne():Si()).asMutable();V.__iterate(function(yn,Or){lt.update(Ae.call(ot,yn,Or,V),function(Vr){return(Vr=Vr||[]).push(_t?[Or,yn]:yn),Vr})});var un=Me(V);return lt.map(function(yn){return Nt(V,un(yn))})}(this,V,Ae)},has:function(V){return this.get(V,$)!==$},hasIn:function(V){return this.getIn(V,$)!==$},isSubset:function(V){return V="function"==typeof V.includes?V:r(V),this.every(function(Ae){return V.includes(Ae)})},isSuperset:function(V){return(V="function"==typeof V.isSubset?V:r(V)).isSubset(this)},keyOf:function(V){return this.findKey(function(Ae){return Tr(Ae,V)})},keySeq:function(){return this.toSeq().map(Yo).toIndexedSeq()},last:function(){return this.toSeq().reverse().first()},lastKeyOf:function(V){return this.toKeyedSeq().reverse().keyOf(V)},max:function(V){return Cu(this,V)},maxBy:function(V,Ae){return Cu(this,Ae,V)},min:function(V){return Cu(this,V?ha(V):Gl)},minBy:function(V,Ae){return Cu(this,Ae?ha(Ae):Gl,V)},rest:function(){return this.slice(1)},skip:function(V){return this.slice(Math.max(0,V))},skipLast:function(V){return Nt(this,this.toSeq().reverse().skip(V).reverse())},skipWhile:function(V,Ae){return Nt(this,Hl(this,V,Ae,!0))},skipUntil:function(V,Ae){return this.skipWhile(Ar(V),Ae)},sortBy:function(V,Ae){return Nt(this,el(this,Ae,V))},take:function(V){return this.slice(0,Math.max(0,V))},takeLast:function(V){return Nt(this,this.toSeq().reverse().take(V).reverse())},takeWhile:function(V,Ae){return Nt(this,function(V,Ae,ot){var _t=De(V);return _t.__iterateUncached=function(lt,un){var yn=this;if(un)return this.cacheResult().__iterate(lt,un);var Or=0;return V.__iterate(function(Vr,_i,oi){return Ae.call(ot,Vr,_i,oi)&&++Or&&lt(Vr,_i,yn)}),Or},_t.__iteratorUncached=function(lt,un){var yn=this;if(un)return this.cacheResult().__iterator(lt,un);var Or=V.__iterator(2,un),Vr=!0;return new Ut(function(){if(!Vr)return{value:void 0,done:!0};var _i=Or.next();if(_i.done)return _i;var oi=_i.value,ko=oi[0],Ho=oi[1];return Ae.call(ot,Ho,ko,yn)?2===lt?_i:Bt(lt,ko,Ho,_i):(Vr=!1,{value:void 0,done:!0})})},_t}(this,V,Ae))},takeUntil:function(V,Ae){return this.takeWhile(Ar(V),Ae)},valueSeq:function(){return this.toIndexedSeq()},hashCode:function(){return this.__hash||(this.__hash=function(V){if(V.size===1/0)return 0;var Ae=M(V),ot=_(V),_t=Ae?1:0;return function(V,Ae){return Ae=so(Ae,3432918353),Ae=so(Ae<<15|Ae>>>-15,461845907),Ae=so(Ae<<13|Ae>>>-13,5),Ae=so((Ae=(Ae+3864292196|0)^V)^Ae>>>16,2246822507),Ze((Ae=so(Ae^Ae>>>13,3266489909))^Ae>>>16)}(V.__iterate(ot?Ae?function(un,yn){_t=31*_t+Vl(Dr(un),Dr(yn))|0}:function(un,yn){_t=_t+Vl(Dr(un),Dr(yn))|0}:Ae?function(un){_t=31*_t+Dr(un)|0}:function(un){_t=_t+Dr(un)|0}),_t)}(this))}});var $u=r.prototype;$u[R]=!0,$u[Gt]=$u.values,$u.__toJS=$u.toArray,$u.__toStringMapper=_u,$u.inspect=$u.toSource=function(){return this.toString()},$u.chain=$u.flatMap,$u.contains=$u.includes,Gs(u,{flip:function(){return Nt(this,To(this))},mapEntries:function(V,Ae){var ot=this,_t=0;return Nt(this,this.toSeq().map(function(lt,un){return V.call(Ae,[un,lt],_t++,ot)}).fromEntrySeq())},mapKeys:function(V,Ae){var ot=this;return Nt(this,this.toSeq().flip().map(function(_t,lt){return V.call(Ae,_t,lt,ot)}).flip())}});var Hu=u.prototype;function Yo(V,Ae){return Ae}function du(V,Ae){return[Ae,V]}function Ar(V){return function(){return!V.apply(this,arguments)}}function ha(V){return function(){return-V.apply(this,arguments)}}function _u(V){return"string"==typeof V?JSON.stringify(V):String(V)}function fa(){return Oe(arguments)}function Gl(V,Ae){return V<Ae?1:V>Ae?-1:0}function Vl(V,Ae){return V^Ae+2654435769+(V<<6)+(V>>2)|0}return Hu[F]=!0,Hu[Gt]=$u.entries,Hu.__toJS=$u.toObject,Hu.__toStringMapper=function(V,Ae){return JSON.stringify(Ae)+": "+_u(V)},Gs(p,{toKeyedSeq:function(){return new Oi(this,!1)},filter:function(V,Ae){return Nt(this,qu(this,V,Ae,!1))},findIndex:function(V,Ae){var ot=this.findEntry(V,Ae);return ot?ot[0]:-1},indexOf:function(V){var Ae=this.keyOf(V);return void 0===Ae?-1:Ae},lastIndexOf:function(V){var Ae=this.lastKeyOf(V);return void 0===Ae?-1:Ae},reverse:function(){return Nt(this,al(this,!1))},slice:function(V,Ae){return Nt(this,bc(this,V,Ae,!1))},splice:function(V,Ae){var ot=arguments.length;if(Ae=Math.max(0|Ae,0),0===ot||2===ot&&!Ae)return this;V=je(V,V<0?this.count():this.size);var _t=this.slice(0,V);return Nt(this,1===ot?_t:_t.concat(Oe(arguments,2),this.slice(V+Ae)))},findLastIndex:function(V,Ae){var ot=this.findLastEntry(V,Ae);return ot?ot[0]:-1},first:function(){return this.get(0)},flatten:function(V){return Nt(this,$s(this,V,!1))},get:function(V,Ae){return(V=dt(this,V))<0||this.size===1/0||void 0!==this.size&&V>this.size?Ae:this.find(function(ot,_t){return _t===V},void 0,Ae)},has:function(V){return(V=dt(this,V))>=0&&(void 0!==this.size?this.size===1/0||V<this.size:-1!==this.indexOf(V))},interpose:function(V){return Nt(this,function(V,Ae){var ot=De(V);return ot.size=V.size&&2*V.size-1,ot.__iterateUncached=function(_t,lt){var un=this,yn=0;return V.__iterate(function(Or,Vr){return(!yn||!1!==_t(Ae,yn++,un))&&!1!==_t(Or,yn++,un)},lt),yn},ot.__iteratorUncached=function(_t,lt){var Or,un=V.__iterator(1,lt),yn=0;return new Ut(function(){return(!Or||yn%2)&&(Or=un.next()).done?Or:yn%2?Bt(_t,yn++,Ae):Bt(_t,yn++,Or.value,Or)})},ot}(this,V))},interleave:function(){var V=[this].concat(Oe(arguments)),Ae=rt(this.toSeq(),wr.of,V),ot=Ae.flatten(!0);return Ae.size&&(ot.size=Ae.size*V.length),Nt(this,ot)},keySeq:function(){return Xt(0,this.size)},last:function(){return this.get(-1)},skipWhile:function(V,Ae){return Nt(this,Hl(this,V,Ae,!1))},zip:function(){return Nt(this,rt(this,fa,[this].concat(Oe(arguments))))},zipWith:function(V){var Ae=Oe(arguments);return Ae[0]=this,Nt(this,rt(this,V,Ae))}}),p.prototype[Z]=!0,p.prototype[J]=!0,Gs(f,{get:function(V,Ae){return this.has(V)?V:Ae},includes:function(V){return this.has(V)},keySeq:function(){return this.valueSeq()}}),f.prototype.has=$u.includes,f.prototype.contains=f.prototype.includes,Gs(Ir,u.prototype),Gs(wr,p.prototype),Gs(Qr,f.prototype),Gs(si,u.prototype),Gs(Ii,p.prototype),Gs(no,f.prototype),{Iterable:r,Seq:ci,Collection:vr,Map:Si,OrderedMap:ne,List:fo,Stack:Aa,Set:Wa,OrderedSet:Mu,Record:Jo,Range:Xt,Repeat:gn,is:Tr,fromJS:Vn}}()},74299:v=>{v.exports=function(S,i,r,u){var f=new Blob(void 0!==u?[u,S]:[S],{type:r||"application/octet-stream"});if(void 0!==window.navigator.msSaveBlob)window.navigator.msSaveBlob(f,i);else{var e=window.URL&&window.URL.createObjectURL?window.URL.createObjectURL(f):window.webkitURL.createObjectURL(f),_=document.createElement("a");_.style.display="none",_.href=e,_.setAttribute("download",i),void 0===_.download&&_.setAttribute("target","_blank"),document.body.appendChild(_),_.click(),setTimeout(function(){document.body.removeChild(_),window.URL.revokeObjectURL(e)},200)}}},86906:v=>{var u=/^\s+|\s+$/g,p=/^[-+]0x[0-9a-f]+$/i,f=/^0b[01]+$/i,e=/^0o[0-7]+$/i,_=parseInt,y="object"==typeof global&&global&&global.Object===Object&&global,T="object"==typeof self&&self&&self.Object===Object&&self,M=y||T||Function("return this")(),F=Object.prototype.toString,Z=Math.max,J=Math.min,Q=function(){return M.Date.now()};function ue(ve){var oe=typeof ve;return!!ve&&("object"==oe||"function"==oe)}function se(ve){if("number"==typeof ve)return ve;if(function(ve){return"symbol"==typeof ve||function(ve){return!!ve&&"object"==typeof ve}(ve)&&"[object Symbol]"==F.call(ve)}(ve))return NaN;if(ue(ve)){var oe="function"==typeof ve.valueOf?ve.valueOf():ve;ve=ue(oe)?oe+"":oe}if("string"!=typeof ve)return 0===ve?ve:+ve;ve=ve.replace(u,"");var he=f.test(ve);return he||e.test(ve)?_(ve.slice(2),he?2:8):p.test(ve)?NaN:+ve}v.exports=function(ve,oe,he){var me,Oe,ce,dt,ze,Ye,je=0,Ie=!1,Ve=!1,He=!0;if("function"!=typeof ve)throw new TypeError("Expected a function");function Zt(Dt){var zt=me,Yn=Oe;return me=Oe=void 0,je=Dt,dt=ve.apply(Yn,zt)}function st(Dt){return je=Dt,ze=setTimeout(Gt,oe),Ie?Zt(Dt):dt}function $t(Dt){var zt=Dt-Ye;return void 0===Ye||zt>=oe||zt<0||Ve&&Dt-je>=ce}function Gt(){var Dt=Q();if($t(Dt))return Ut(Dt);ze=setTimeout(Gt,function(Dt){var Hr=oe-(Dt-Ye);return Ve?J(Hr,ce-(Dt-je)):Hr}(Dt))}function Ut(Dt){return ze=void 0,He&&me?Zt(Dt):(me=Oe=void 0,dt)}function Yt(){var Dt=Q(),zt=$t(Dt);if(me=arguments,Oe=this,Ye=Dt,zt){if(void 0===ze)return st(Ye);if(Ve)return ze=setTimeout(Gt,oe),Zt(Ye)}return void 0===ze&&(ze=setTimeout(Gt,oe)),dt}return oe=se(oe)||0,ue(he)&&(Ie=!!he.leading,ce=(Ve="maxWait"in he)?Z(se(he.maxWait)||0,oe):ce,He="trailing"in he?!!he.trailing:He),Yt.cancel=function(){void 0!==ze&&clearTimeout(ze),je=0,me=Ye=Oe=ze=void 0},Yt.flush=function(){return void 0===ze?dt:Ut(Q())},Yt}},66941:v=>{var In,i="__lodash_hash_undefined__",f=/^\[object .+?Constructor\]$/,e="object"==typeof global&&global&&global.Object===Object&&global,_="object"==typeof self&&self&&self.Object===Object&&self,y=e||_||Function("return this")(),R=Array.prototype,F=Function.prototype,Z=Object.prototype,J=y["__core-js_shared__"],Q=(In=/[^.]+$/.exec(J&&J.keys&&J.keys.IE_PROTO||""))?"Symbol(src)_1."+In:"",ee=F.toString,ue=Z.hasOwnProperty,ae=Z.toString,$=RegExp("^"+ee.call(ue).replace(/[\\^$.*+?()[\]{}|]/g,"\\$&").replace(/hasOwnProperty|(function).*?(?=\\\()| for .+?(?=\\\])/g,"$1.*?")+"$"),se=R.splice,ve=zt(y,"Map"),oe=zt(Object,"create");function he(In){var Hn=-1,Zr=In?In.length:0;for(this.clear();++Hn<Zr;){var Ur=In[Hn];this.set(Ur[0],Ur[1])}}function Ye(In){var Hn=-1,Zr=In?In.length:0;for(this.clear();++Hn<Zr;){var Ur=In[Hn];this.set(Ur[0],Ur[1])}}function st(In){var Hn=-1,Zr=In?In.length:0;for(this.clear();++Hn<Zr;){var Ur=In[Hn];this.set(Ur[0],Ur[1])}}function mt(In,Hn){for(var Zr=In.length;Zr--;)if(wr(In[Zr][0],Hn))return Zr;return-1}function Dt(In,Hn){var Zr=In.__data__;return function(In){var Hn=typeof In;return"string"==Hn||"number"==Hn||"symbol"==Hn||"boolean"==Hn?"__proto__"!==In:null===In}(Hn)?Zr["string"==typeof Hn?"string":"hash"]:Zr.map}function zt(In,Hn){var Zr=function(In,Hn){return null==In?void 0:In[Hn]}(In,Hn);return function(In){return!(!Kr(In)||function(In){return!!Q&&Q in In}(In))&&(function(In){var Hn=Kr(In)?ae.call(In):"";return"[object Function]"==Hn||"[object GeneratorFunction]"==Hn}(In)||function(In){var Hn=!1;if(null!=In&&"function"!=typeof In.toString)try{Hn=!!(In+"")}catch(Zr){}return Hn}(In)?$:f).test(function(In){if(null!=In){try{return ee.call(In)}catch(Hn){}try{return In+""}catch(Hn){}}return""}(In))}(Zr)?Zr:void 0}function Ir(In,Hn){if("function"!=typeof In||Hn&&"function"!=typeof Hn)throw new TypeError("Expected a function");var Zr=function(){var Ur=arguments,di=Hn?Hn.apply(this,Ur):Ur[0],$i=Zr.cache;if($i.has(di))return $i.get(di);var Hi=In.apply(this,Ur);return Zr.cache=$i.set(di,Hi),Hi};return Zr.cache=new(Ir.Cache||st),Zr}function wr(In,Hn){return In===Hn||In!=In&&Hn!=Hn}function Kr(In){var Hn=typeof In;return!!In&&("object"==Hn||"function"==Hn)}he.prototype.clear=function(){this.__data__=oe?oe(null):{}},he.prototype.delete=function(In){return this.has(In)&&delete this.__data__[In]},he.prototype.get=function(In){var Hn=this.__data__;if(oe){var Zr=Hn[In];return Zr===i?void 0:Zr}return ue.call(Hn,In)?Hn[In]:void 0},he.prototype.has=function(In){var Hn=this.__data__;return oe?void 0!==Hn[In]:ue.call(Hn,In)},he.prototype.set=function(In,Hn){return this.__data__[In]=oe&&void 0===Hn?i:Hn,this},Ye.prototype.clear=function(){this.__data__=[]},Ye.prototype.delete=function(In){var Hn=this.__data__,Zr=mt(Hn,In);return!(Zr<0||(Zr==Hn.length-1?Hn.pop():se.call(Hn,Zr,1),0))},Ye.prototype.get=function(In){var Hn=this.__data__,Zr=mt(Hn,In);return Zr<0?void 0:Hn[Zr][1]},Ye.prototype.has=function(In){return mt(this.__data__,In)>-1},Ye.prototype.set=function(In,Hn){var Zr=this.__data__,Ur=mt(Zr,In);return Ur<0?Zr.push([In,Hn]):Zr[Ur][1]=Hn,this},st.prototype.clear=function(){this.__data__={hash:new he,map:new(ve||Ye),string:new he}},st.prototype.delete=function(In){return Dt(this,In).delete(In)},st.prototype.get=function(In){return Dt(this,In).get(In)},st.prototype.has=function(In){return Dt(this,In).has(In)},st.prototype.set=function(In,Hn){return Dt(this,In).set(In,Hn),this},Ir.Cache=st,v.exports=Ir},6123:v=>{var S="Expected a function",u=/^\s+|\s+$/g,p=/^[-+]0x[0-9a-f]+$/i,f=/^0b[01]+$/i,e=/^0o[0-7]+$/i,_=parseInt,y="object"==typeof global&&global&&global.Object===Object&&global,T="object"==typeof self&&self&&self.Object===Object&&self,M=y||T||Function("return this")(),F=Object.prototype.toString,Z=Math.max,J=Math.min,Q=function(){return M.Date.now()};function ae(oe){var he=typeof oe;return!!oe&&("object"==he||"function"==he)}function ve(oe){if("number"==typeof oe)return oe;if(function(oe){return"symbol"==typeof oe||function(oe){return!!oe&&"object"==typeof oe}(oe)&&"[object Symbol]"==F.call(oe)}(oe))return NaN;if(ae(oe)){var he="function"==typeof oe.valueOf?oe.valueOf():oe;oe=ae(he)?he+"":he}if("string"!=typeof oe)return 0===oe?oe:+oe;oe=oe.replace(u,"");var me=f.test(oe);return me||e.test(oe)?_(oe.slice(2),me?2:8):p.test(oe)?NaN:+oe}v.exports=function(oe,he,me){var Oe=!0,ce=!0;if("function"!=typeof oe)throw new TypeError(S);return ae(me)&&(Oe="leading"in me?!!me.leading:Oe,ce="trailing"in me?!!me.trailing:ce),function(oe,he,me){var Oe,ce,dt,ze,Ye,je,Ie=0,Ve=!1,He=!1,Zt=!0;if("function"!=typeof oe)throw new TypeError(S);function st(zt){var Yn=Oe,Hr=ce;return Oe=ce=void 0,Ie=zt,ze=oe.apply(Hr,Yn)}function en(zt){return Ie=zt,Ye=setTimeout(Ut,he),Ve?st(zt):ze}function Gt(zt){var Yn=zt-je;return void 0===je||Yn>=he||Yn<0||He&&zt-Ie>=dt}function Ut(){var zt=Q();if(Gt(zt))return Bt(zt);Ye=setTimeout(Ut,function(zt){var ci=he-(zt-je);return He?J(ci,dt-(zt-Ie)):ci}(zt))}function Bt(zt){return Ye=void 0,Zt&&Oe?st(zt):(Oe=ce=void 0,ze)}function Dt(){var zt=Q(),Yn=Gt(zt);if(Oe=arguments,ce=this,je=zt,Yn){if(void 0===Ye)return en(je);if(He)return Ye=setTimeout(Ut,he),st(je)}return void 0===Ye&&(Ye=setTimeout(Ut,he)),ze}return he=ve(he)||0,ae(me)&&(Ve=!!me.leading,dt=(He="maxWait"in me)?Z(ve(me.maxWait)||0,he):dt,Zt="trailing"in me?!!me.trailing:Zt),Dt.cancel=function(){void 0!==Ye&&clearTimeout(Ye),Ie=0,Oe=je=ce=Ye=void 0},Dt.flush=function(){return void 0===Ye?ze:Bt(Q())},Dt}(oe,he,{leading:Oe,maxWait:he,trailing:ce})}},81235:(v,S,i)=>{var p=i(4153)(i(27038),"DataView");v.exports=p},41505:(v,S,i)=>{var r=i(59410),u=i(21143),p=i(604),f=i(80584),e=i(7792);function _(y){var T=-1,M=null==y?0:y.length;for(this.clear();++T<M;){var R=y[T];this.set(R[0],R[1])}}_.prototype.clear=r,_.prototype.delete=u,_.prototype.get=p,_.prototype.has=f,_.prototype.set=e,v.exports=_},73545:(v,S,i)=>{var r=i(63391),u=i(68971),p=i(18858),f=i(13913),e=i(68944);function _(y){var T=-1,M=null==y?0:y.length;for(this.clear();++T<M;){var R=y[T];this.set(R[0],R[1])}}_.prototype.clear=r,_.prototype.delete=u,_.prototype.get=p,_.prototype.has=f,_.prototype.set=e,v.exports=_},39046:(v,S,i)=>{var p=i(4153)(i(27038),"Map");v.exports=p},93177:(v,S,i)=>{var r=i(70536),u=i(61502),p=i(94960),f=i(61539),e=i(34138);function _(y){var T=-1,M=null==y?0:y.length;for(this.clear();++T<M;){var R=y[T];this.set(R[0],R[1])}}_.prototype.clear=r,_.prototype.delete=u,_.prototype.get=p,_.prototype.has=f,_.prototype.set=e,v.exports=_},97129:(v,S,i)=>{var p=i(4153)(i(27038),"Promise");v.exports=p},74918:(v,S,i)=>{var p=i(4153)(i(27038),"Set");v.exports=p},48690:(v,S,i)=>{var r=i(93177),u=i(30365),p=i(58235);function f(e){var _=-1,y=null==e?0:e.length;for(this.__data__=new r;++_<y;)this.add(e[_])}f.prototype.add=f.prototype.push=u,f.prototype.has=p,v.exports=f},33667:(v,S,i)=>{var r=i(73545),u=i(18034),p=i(37238),f=i(75887),e=i(81450),_=i(61386);function y(T){var M=this.__data__=new r(T);this.size=M.size}y.prototype.clear=u,y.prototype.delete=p,y.prototype.get=f,y.prototype.has=e,y.prototype.set=_,v.exports=y},57333:(v,S,i)=>{var r=i(27038);v.exports=r.Symbol},96820:(v,S,i)=>{var r=i(27038);v.exports=r.Uint8Array},54203:(v,S,i)=>{var p=i(4153)(i(27038),"WeakMap");v.exports=p},81638:v=>{v.exports=function(i,r,u){switch(u.length){case 0:return i.call(r);case 1:return i.call(r,u[0]);case 2:return i.call(r,u[0],u[1]);case 3:return i.call(r,u[0],u[1],u[2])}return i.apply(r,u)}},4500:v=>{v.exports=function(i,r){for(var u=-1,p=null==i?0:i.length;++u<p&&!1!==r(i[u],u,i););return i}},11375:v=>{v.exports=function(i,r){for(var u=-1,p=null==i?0:i.length,f=0,e=[];++u<p;){var _=i[u];r(_,u,i)&&(e[f++]=_)}return e}},71890:(v,S,i)=>{var r=i(48282),u=i(2952),p=i(81690),f=i(84444),e=i(20968),_=i(47679),T=Object.prototype.hasOwnProperty;v.exports=function(R,F){var Z=p(R),J=!Z&&u(R),Q=!Z&&!J&&f(R),ee=!Z&&!J&&!Q&&_(R),ue=Z||J||Q||ee,ae=ue?r(R.length,String):[],$=ae.length;for(var se in R)(F||T.call(R,se))&&(!ue||!("length"==se||Q&&("offset"==se||"parent"==se)||ee&&("buffer"==se||"byteLength"==se||"byteOffset"==se)||e(se,$)))&&ae.push(se);return ae}},14992:v=>{v.exports=function(i,r){for(var u=-1,p=null==i?0:i.length,f=Array(p);++u<p;)f[u]=r(i[u],u,i);return f}},94165:v=>{v.exports=function(i,r){for(var u=-1,p=r.length,f=i.length;++u<p;)i[f+u]=r[u];return i}},89731:v=>{v.exports=function(i,r,u,p){var f=-1,e=null==i?0:i.length;for(p&&e&&(u=i[++f]);++f<e;)u=r(u,i[f],f,i);return u}},8141:v=>{v.exports=function(i,r){for(var u=-1,p=null==i?0:i.length;++u<p;)if(r(i[u],u,i))return!0;return!1}},87280:v=>{v.exports=function(i){return i.split("")}},54561:v=>{var S=/[^\x00-\x2f\x3a-\x40\x5b-\x60\x7b-\x7f]+/g;v.exports=function(r){return r.match(S)||[]}},63530:(v,S,i)=>{var r=i(92007),u=i(71166);v.exports=function(f,e,_){(void 0!==_&&!u(f[e],_)||void 0===_&&!(e in f))&&r(f,e,_)}},23898:(v,S,i)=>{var r=i(92007),u=i(71166),f=Object.prototype.hasOwnProperty;v.exports=function(_,y,T){var M=_[y];(!f.call(_,y)||!u(M,T)||void 0===T&&!(y in _))&&r(_,y,T)}},15758:(v,S,i)=>{var r=i(71166);v.exports=function(p,f){for(var e=p.length;e--;)if(r(p[e][0],f))return e;return-1}},22067:(v,S,i)=>{var r=i(11694),u=i(59108);v.exports=function(f,e){return f&&r(e,u(e),f)}},70882:(v,S,i)=>{var r=i(11694),u=i(42970);v.exports=function(f,e){return f&&r(e,u(e),f)}},92007:(v,S,i)=>{var r=i(20395);v.exports=function(p,f,e){"__proto__"==f&&r?r(p,f,{configurable:!0,enumerable:!0,value:e,writable:!0}):p[f]=e}},77007:(v,S,i)=>{var r=i(33667),u=i(4500),p=i(23898),f=i(22067),e=i(70882),_=i(50694),y=i(53595),T=i(14746),M=i(78857),R=i(58605),F=i(51675),Z=i(26663),J=i(62963),Q=i(32143),ee=i(31563),ue=i(81690),ae=i(84444),$=i(32e3),se=i(53867),ve=i(48855),oe=i(59108),he=i(42970),dt="[object Arguments]",Ve="[object Function]",en="[object Object]",Hn={};Hn[dt]=Hn["[object Array]"]=Hn["[object ArrayBuffer]"]=Hn["[object DataView]"]=Hn["[object Boolean]"]=Hn["[object Date]"]=Hn["[object Float32Array]"]=Hn["[object Float64Array]"]=Hn["[object Int8Array]"]=Hn["[object Int16Array]"]=Hn["[object Int32Array]"]=Hn["[object Map]"]=Hn["[object Number]"]=Hn[en]=Hn["[object RegExp]"]=Hn["[object Set]"]=Hn["[object String]"]=Hn["[object Symbol]"]=Hn["[object Uint8Array]"]=Hn["[object Uint8ClampedArray]"]=Hn["[object Uint16Array]"]=Hn["[object Uint32Array]"]=!0,Hn["[object Error]"]=Hn[Ve]=Hn["[object WeakMap]"]=!1,v.exports=function Zr(Ur,di,$i,Hi,Br,On){var Wt,Jn=1&di,ir=2&di,Lr=4&di;if($i&&(Wt=Br?$i(Ur,Hi,Br,On):$i(Ur)),void 0!==Wt)return Wt;if(!se(Ur))return Ur;var Vn=ue(Ur);if(Vn){if(Wt=J(Ur),!Jn)return y(Ur,Wt)}else{var zr=Z(Ur),hi=zr==Ve||"[object GeneratorFunction]"==zr;if(ae(Ur))return _(Ur,Jn);if(zr==en||zr==dt||hi&&!Br){if(Wt=ir||hi?{}:ee(Ur),!Jn)return ir?M(Ur,e(Wt,Ur)):T(Ur,f(Wt,Ur))}else{if(!Hn[zr])return Br?Ur:{};Wt=Q(Ur,zr,Jn)}}On||(On=new r);var Ai=On.get(Ur);if(Ai)return Ai;On.set(Ur,Wt),ve(Ur)?Ur.forEach(function(gn){Wt.add(Zr(gn,di,$i,gn,Ur,On))}):$(Ur)&&Ur.forEach(function(gn,En){Wt.set(En,Zr(gn,di,$i,En,Ur,On))});var Nr=Vn?void 0:(Lr?ir?F:R:ir?he:oe)(Ur);return u(Nr||Ur,function(gn,En){Nr&&(gn=Ur[En=gn]),p(Wt,En,Zr(gn,di,$i,En,Ur,On))}),Wt}},60920:(v,S,i)=>{var r=i(53867),u=Object.create,p=function(){function f(){}return function(e){if(!r(e))return{};if(u)return u(e);f.prototype=e;var _=new f;return f.prototype=void 0,_}}();v.exports=p},59026:(v,S,i)=>{var r=i(18022),p=i(99889)(r);v.exports=p},12229:v=>{v.exports=function(i,r,u,p){for(var f=i.length,e=u+(p?1:-1);p?e--:++e<f;)if(r(i[e],e,i))return e;return-1}},56369:(v,S,i)=>{var r=i(94165),u=i(21006);v.exports=function p(f,e,_,y,T){var M=-1,R=f.length;for(_||(_=u),T||(T=[]);++M<R;){var F=f[M];e>0&&_(F)?e>1?p(F,e-1,_,y,T):r(T,F):y||(T[T.length]=F)}return T}},75290:(v,S,i)=>{var u=i(8269)();v.exports=u},18022:(v,S,i)=>{var r=i(75290),u=i(59108);v.exports=function(f,e){return f&&r(f,e,u)}},93436:(v,S,i)=>{var r=i(64667),u=i(82773);v.exports=function(f,e){for(var _=0,y=(e=r(e,f)).length;null!=f&&_<y;)f=f[u(e[_++])];return _&&_==y?f:void 0}},19215:(v,S,i)=>{var r=i(94165),u=i(81690);v.exports=function(f,e,_){var y=e(f);return u(f)?y:r(y,_(f))}},72802:(v,S,i)=>{var r=i(57333),u=i(21613),p=i(81244),_=r?r.toStringTag:void 0;v.exports=function(T){return null==T?void 0===T?"[object Undefined]":"[object Null]":_&&_ in Object(T)?u(T):p(T)}},55333:v=>{v.exports=function(i,r){return null!=i&&r in Object(i)}},77090:(v,S,i)=>{var r=i(72802),u=i(27503);v.exports=function(e){return u(e)&&"[object Arguments]"==r(e)}},30696:(v,S,i)=>{var r=i(36863),u=i(27503);v.exports=function p(f,e,_,y,T){return f===e||(null==f||null==e||!u(f)&&!u(e)?f!=f&&e!=e:r(f,e,_,y,p,T))}},36863:(v,S,i)=>{var r=i(33667),u=i(27667),p=i(64630),f=i(70838),e=i(26663),_=i(81690),y=i(84444),T=i(47679),R="[object Arguments]",F="[object Array]",Z="[object Object]",Q=Object.prototype.hasOwnProperty;v.exports=function(ue,ae,$,se,ve,oe){var he=_(ue),me=_(ae),Oe=he?F:e(ue),ce=me?F:e(ae),dt=(Oe=Oe==R?Z:Oe)==Z,ze=(ce=ce==R?Z:ce)==Z,Ye=Oe==ce;if(Ye&&y(ue)){if(!y(ae))return!1;he=!0,dt=!1}if(Ye&&!dt)return oe||(oe=new r),he||T(ue)?u(ue,ae,$,se,ve,oe):p(ue,ae,Oe,$,se,ve,oe);if(!(1&$)){var je=dt&&Q.call(ue,"__wrapped__"),Ie=ze&&Q.call(ae,"__wrapped__");if(je||Ie){var Ve=je?ue.value():ue,He=Ie?ae.value():ae;return oe||(oe=new r),ve(Ve,He,$,se,oe)}}return!!Ye&&(oe||(oe=new r),f(ue,ae,$,se,ve,oe))}},63434:(v,S,i)=>{var r=i(26663),u=i(27503);v.exports=function(e){return u(e)&&"[object Map]"==r(e)}},88783:(v,S,i)=>{var r=i(33667),u=i(30696);v.exports=function(_,y,T,M){var R=T.length,F=R,Z=!M;if(null==_)return!F;for(_=Object(_);R--;){var J=T[R];if(Z&&J[2]?J[1]!==_[J[0]]:!(J[0]in _))return!1}for(;++R<F;){var Q=(J=T[R])[0],ee=_[Q],ue=J[1];if(Z&&J[2]){if(void 0===ee&&!(Q in _))return!1}else{var ae=new r;if(M)var $=M(ee,ue,Q,_,y,ae);if(!(void 0===$?u(ue,ee,3,M,ae):$))return!1}}return!0}},43540:(v,S,i)=>{var r=i(55836),u=i(38466),p=i(53867),f=i(51217),_=/^\[object .+?Constructor\]$/,F=RegExp("^"+Function.prototype.toString.call(Object.prototype.hasOwnProperty).replace(/[\\^$.*+?()[\]{}|]/g,"\\$&").replace(/hasOwnProperty|(function).*?(?=\\\()| for .+?(?=\\\])/g,"$1.*?")+"$");v.exports=function(J){return!(!p(J)||u(J))&&(r(J)?F:_).test(f(J))}},67495:(v,S,i)=>{var r=i(26663),u=i(27503);v.exports=function(e){return u(e)&&"[object Set]"==r(e)}},99390:(v,S,i)=>{var r=i(72802),u=i(8613),p=i(27503),Ye={};Ye["[object Float32Array]"]=Ye["[object Float64Array]"]=Ye["[object Int8Array]"]=Ye["[object Int16Array]"]=Ye["[object Int32Array]"]=Ye["[object Uint8Array]"]=Ye["[object Uint8ClampedArray]"]=Ye["[object Uint16Array]"]=Ye["[object Uint32Array]"]=!0,Ye["[object Arguments]"]=Ye["[object Array]"]=Ye["[object ArrayBuffer]"]=Ye["[object Boolean]"]=Ye["[object DataView]"]=Ye["[object Date]"]=Ye["[object Error]"]=Ye["[object Function]"]=Ye["[object Map]"]=Ye["[object Number]"]=Ye["[object Object]"]=Ye["[object RegExp]"]=Ye["[object Set]"]=Ye["[object String]"]=Ye["[object WeakMap]"]=!1,v.exports=function(Ie){return p(Ie)&&u(Ie.length)&&!!Ye[r(Ie)]}},5245:(v,S,i)=>{var r=i(69433),u=i(68608),p=i(80290),f=i(81690),e=i(63354);v.exports=function(y){return"function"==typeof y?y:null==y?p:"object"==typeof y?f(y)?u(y[0],y[1]):r(y):e(y)}},92488:(v,S,i)=>{var r=i(58845),u=i(36700),f=Object.prototype.hasOwnProperty;v.exports=function(_){if(!r(_))return u(_);var y=[];for(var T in Object(_))f.call(_,T)&&"constructor"!=T&&y.push(T);return y}},50762:(v,S,i)=>{var r=i(53867),u=i(58845),p=i(25618),e=Object.prototype.hasOwnProperty;v.exports=function(y){if(!r(y))return p(y);var T=u(y),M=[];for(var R in y)"constructor"==R&&(T||!e.call(y,R))||M.push(R);return M}},69433:(v,S,i)=>{var r=i(88783),u=i(48834),p=i(63587);v.exports=function(e){var _=u(e);return 1==_.length&&_[0][2]?p(_[0][0],_[0][1]):function(y){return y===e||r(y,e,_)}}},68608:(v,S,i)=>{var r=i(30696),u=i(58102),p=i(18303),f=i(99743),e=i(45774),_=i(63587),y=i(82773);v.exports=function(F,Z){return f(F)&&e(Z)?_(y(F),Z):function(J){var Q=u(J,F);return void 0===Q&&Q===Z?p(J,F):r(Z,Q,3)}}},9085:(v,S,i)=>{var r=i(33667),u=i(63530),p=i(75290),f=i(23607),e=i(53867),_=i(42970),y=i(45959);v.exports=function T(M,R,F,Z,J){M!==R&&p(R,function(Q,ee){if(J||(J=new r),e(Q))f(M,R,ee,F,T,Z,J);else{var ue=Z?Z(y(M,ee),Q,ee+"",M,R,J):void 0;void 0===ue&&(ue=Q),u(M,ee,ue)}},_)}},23607:(v,S,i)=>{var r=i(63530),u=i(50694),p=i(96282),f=i(53595),e=i(31563),_=i(2952),y=i(81690),T=i(82027),M=i(84444),R=i(55836),F=i(53867),Z=i(82358),J=i(47679),Q=i(45959),ee=i(31413);v.exports=function(ae,$,se,ve,oe,he,me){var Oe=Q(ae,se),ce=Q($,se),dt=me.get(ce);if(dt)r(ae,se,dt);else{var ze=he?he(Oe,ce,se+"",ae,$,me):void 0,Ye=void 0===ze;if(Ye){var je=y(ce),Ie=!je&&M(ce),Ve=!je&&!Ie&&J(ce);ze=ce,je||Ie||Ve?y(Oe)?ze=Oe:T(Oe)?ze=f(Oe):Ie?(Ye=!1,ze=u(ce,!0)):Ve?(Ye=!1,ze=p(ce,!0)):ze=[]:Z(ce)||_(ce)?(ze=Oe,_(Oe)?ze=ee(Oe):(!F(Oe)||R(Oe))&&(ze=e(ce))):Ye=!1}Ye&&(me.set(ce,ze),oe(ze,ce,ve,he,me),me.delete(ce)),r(ae,se,ze)}}},68840:v=>{v.exports=function(i){return function(r){return null==r?void 0:r[i]}}},59866:(v,S,i)=>{var r=i(93436);v.exports=function(p){return function(f){return r(f,p)}}},17421:v=>{v.exports=function(i){return function(r){return null==i?void 0:i[r]}}},85105:v=>{v.exports=function(i,r,u,p,f){return f(i,function(e,_,y){u=p?(p=!1,e):r(u,e,_,y)}),u}},84441:(v,S,i)=>{var r=i(80290),u=i(15529),p=i(39009);v.exports=function(e,_){return p(u(e,_,r),e+"")}},32773:(v,S,i)=>{var r=i(23898),u=i(64667),p=i(20968),f=i(53867),e=i(82773);v.exports=function(y,T,M,R){if(!f(y))return y;for(var F=-1,Z=(T=u(T,y)).length,J=Z-1,Q=y;null!=Q&&++F<Z;){var ee=e(T[F]),ue=M;if("__proto__"===ee||"constructor"===ee||"prototype"===ee)return y;if(F!=J){var ae=Q[ee];void 0===(ue=R?R(ae,ee,Q):void 0)&&(ue=f(ae)?ae:p(T[F+1])?[]:{})}r(Q,ee,ue),Q=Q[ee]}return y}},99372:(v,S,i)=>{var r=i(45654),u=i(20395),p=i(80290);v.exports=u?function(e,_){return u(e,"toString",{configurable:!0,enumerable:!1,value:r(_),writable:!0})}:p},63586:v=>{v.exports=function(i,r,u){var p=-1,f=i.length;r<0&&(r=-r>f?0:f+r),(u=u>f?f:u)<0&&(u+=f),f=r>u?0:u-r>>>0,r>>>=0;for(var e=Array(f);++p<f;)e[p]=i[p+r];return e}},37834:(v,S,i)=>{var r=i(59026);v.exports=function(p,f){var e;return r(p,function(_,y,T){return!(e=f(_,y,T))}),!!e}},48282:v=>{v.exports=function(i,r){for(var u=-1,p=Array(i);++u<i;)p[u]=r(u);return p}},68166:(v,S,i)=>{var r=i(57333),u=i(14992),p=i(81690),f=i(7786),_=r?r.prototype:void 0,y=_?_.toString:void 0;v.exports=function T(M){if("string"==typeof M)return M;if(p(M))return u(M,T)+"";if(f(M))return y?y.call(M):"";var R=M+"";return"0"==R&&1/M==-1/0?"-0":R}},13743:(v,S,i)=>{var r=i(87478),u=/^\s+/;v.exports=function(f){return f&&f.slice(0,r(f)+1).replace(u,"")}},70544:v=>{v.exports=function(i){return function(r){return i(r)}}},72064:(v,S,i)=>{var r=i(64667),u=i(27842),p=i(61746),f=i(82773);v.exports=function(_,y){return y=r(y,_),null==(_=p(_,y))||delete _[f(u(y))]}},25687:v=>{v.exports=function(i,r,u){for(var p=-1,f=i.length,e=r.length,_={};++p<f;)u(_,i[p],p<e?r[p]:void 0);return _}},13747:v=>{v.exports=function(i,r){return i.has(r)}},64667:(v,S,i)=>{var r=i(81690),u=i(99743),p=i(89775),f=i(41233);v.exports=function(_,y){return r(_)?_:u(_,y)?[_]:p(f(_))}},26477:(v,S,i)=>{var r=i(63586);v.exports=function(p,f,e){var _=p.length;return e=void 0===e?_:e,!f&&e>=_?p:r(p,f,e)}},88461:(v,S,i)=>{var r=i(96820);v.exports=function(p){var f=new p.constructor(p.byteLength);return new r(f).set(new r(p)),f}},50694:(v,S,i)=>{v=i.nmd(v);var r=i(27038),u=S&&!S.nodeType&&S,p=u&&v&&!v.nodeType&&v,e=p&&p.exports===u?r.Buffer:void 0,_=e?e.allocUnsafe:void 0;v.exports=function(T,M){if(M)return T.slice();var R=T.length,F=_?_(R):new T.constructor(R);return T.copy(F),F}},59757:(v,S,i)=>{var r=i(88461);v.exports=function(p,f){var e=f?r(p.buffer):p.buffer;return new p.constructor(e,p.byteOffset,p.byteLength)}},83615:v=>{var S=/\w*$/;v.exports=function(r){var u=new r.constructor(r.source,S.exec(r));return u.lastIndex=r.lastIndex,u}},42282:(v,S,i)=>{var r=i(57333),u=r?r.prototype:void 0,p=u?u.valueOf:void 0;v.exports=function(e){return p?Object(p.call(e)):{}}},96282:(v,S,i)=>{var r=i(88461);v.exports=function(p,f){var e=f?r(p.buffer):p.buffer;return new p.constructor(e,p.byteOffset,p.length)}},53595:v=>{v.exports=function(i,r){var u=-1,p=i.length;for(r||(r=Array(p));++u<p;)r[u]=i[u];return r}},11694:(v,S,i)=>{var r=i(23898),u=i(92007);v.exports=function(f,e,_,y){var T=!_;_||(_={});for(var M=-1,R=e.length;++M<R;){var F=e[M],Z=y?y(_[F],f[F],F,_,f):void 0;void 0===Z&&(Z=f[F]),T?u(_,F,Z):r(_,F,Z)}return _}},14746:(v,S,i)=>{var r=i(11694),u=i(10296);v.exports=function(f,e){return r(f,u(f),e)}},78857:(v,S,i)=>{var r=i(11694),u=i(29572);v.exports=function(f,e){return r(f,u(f),e)}},93412:(v,S,i)=>{var r=i(27038);v.exports=r["__core-js_shared__"]},30906:(v,S,i)=>{var r=i(84441),u=i(71100);v.exports=function(f){return r(function(e,_){var y=-1,T=_.length,M=T>1?_[T-1]:void 0,R=T>2?_[2]:void 0;for(M=f.length>3&&"function"==typeof M?(T--,M):void 0,R&&u(_[0],_[1],R)&&(M=T<3?void 0:M,T=1),e=Object(e);++y<T;){var F=_[y];F&&f(e,F,y,M)}return e})}},99889:(v,S,i)=>{var r=i(93406);v.exports=function(p,f){return function(e,_){if(null==e)return e;if(!r(e))return p(e,_);for(var y=e.length,T=f?y:-1,M=Object(e);(f?T--:++T<y)&&!1!==_(M[T],T,M););return e}}},8269:v=>{v.exports=function(i){return function(r,u,p){for(var f=-1,e=Object(r),_=p(r),y=_.length;y--;){var T=_[i?y:++f];if(!1===u(e[T],T,e))break}return r}}},66803:(v,S,i)=>{var r=i(26477),u=i(407),p=i(2150),f=i(41233);v.exports=function(_){return function(y){y=f(y);var T=u(y)?p(y):void 0,M=T?T[0]:y.charAt(0),R=T?r(T,1).join(""):y.slice(1);return M[_]()+R}}},17407:(v,S,i)=>{var r=i(89731),u=i(75289),p=i(96590),e=RegExp("['\u2019]","g");v.exports=function(y){return function(T){return r(p(u(T).replace(e,"")),y,"")}}},44674:(v,S,i)=>{var r=i(5245),u=i(93406),p=i(59108);v.exports=function(e){return function(_,y,T){var M=Object(_);if(!u(_)){var R=r(y,3);_=p(_),y=function(Z){return R(M[Z],Z,M)}}var F=e(_,y,T);return F>-1?M[R?_[F]:F]:void 0}}},925:(v,S,i)=>{var r=i(82358);v.exports=function(p){return r(p)?void 0:p}},4068:(v,S,i)=>{var p=i(17421)({\u00c0:"A",\u00c1:"A",\u00c2:"A",\u00c3:"A",\u00c4:"A",\u00c5:"A",\u00e0:"a",\u00e1:"a",\u00e2:"a",\u00e3:"a",\u00e4:"a",\u00e5:"a",\u00c7:"C",\u00e7:"c",\u00d0:"D",\u00f0:"d",\u00c8:"E",\u00c9:"E",\u00ca:"E",\u00cb:"E",\u00e8:"e",\u00e9:"e",\u00ea:"e",\u00eb:"e",\u00cc:"I",\u00cd:"I",\u00ce:"I",\u00cf:"I",\u00ec:"i",\u00ed:"i",\u00ee:"i",\u00ef:"i",\u00d1:"N",\u00f1:"n",\u00d2:"O",\u00d3:"O",\u00d4:"O",\u00d5:"O",\u00d6:"O",\u00d8:"O",\u00f2:"o",\u00f3:"o",\u00f4:"o",\u00f5:"o",\u00f6:"o",\u00f8:"o",\u00d9:"U",\u00da:"U",\u00db:"U",\u00dc:"U",\u00f9:"u",\u00fa:"u",\u00fb:"u",\u00fc:"u",\u00dd:"Y",\u00fd:"y",\u00ff:"y",\u00c6:"Ae",\u00e6:"ae",\u00de:"Th",\u00fe:"th",\u00df:"ss",\u0100:"A",\u0102:"A",\u0104:"A",\u0101:"a",\u0103:"a",\u0105:"a",\u0106:"C",\u0108:"C",\u010a:"C",\u010c:"C",\u0107:"c",\u0109:"c",\u010b:"c",\u010d:"c",\u010e:"D",\u0110:"D",\u010f:"d",\u0111:"d",\u0112:"E",\u0114:"E",\u0116:"E",\u0118:"E",\u011a:"E",\u0113:"e",\u0115:"e",\u0117:"e",\u0119:"e",\u011b:"e",\u011c:"G",\u011e:"G",\u0120:"G",\u0122:"G",\u011d:"g",\u011f:"g",\u0121:"g",\u0123:"g",\u0124:"H",\u0126:"H",\u0125:"h",\u0127:"h",\u0128:"I",\u012a:"I",\u012c:"I",\u012e:"I",\u0130:"I",\u0129:"i",\u012b:"i",\u012d:"i",\u012f:"i",\u0131:"i",\u0134:"J",\u0135:"j",\u0136:"K",\u0137:"k",\u0138:"k",\u0139:"L",\u013b:"L",\u013d:"L",\u013f:"L",\u0141:"L",\u013a:"l",\u013c:"l",\u013e:"l",\u0140:"l",\u0142:"l",\u0143:"N",\u0145:"N",\u0147:"N",\u014a:"N",\u0144:"n",\u0146:"n",\u0148:"n",\u014b:"n",\u014c:"O",\u014e:"O",\u0150:"O",\u014d:"o",\u014f:"o",\u0151:"o",\u0154:"R",\u0156:"R",\u0158:"R",\u0155:"r",\u0157:"r",\u0159:"r",\u015a:"S",\u015c:"S",\u015e:"S",\u0160:"S",\u015b:"s",\u015d:"s",\u015f:"s",\u0161:"s",\u0162:"T",\u0164:"T",\u0166:"T",\u0163:"t",\u0165:"t",\u0167:"t",\u0168:"U",\u016a:"U",\u016c:"U",\u016e:"U",\u0170:"U",\u0172:"U",\u0169:"u",\u016b:"u",\u016d:"u",\u016f:"u",\u0171:"u",\u0173:"u",\u0174:"W",\u0175:"w",\u0176:"Y",\u0177:"y",\u0178:"Y",\u0179:"Z",\u017b:"Z",\u017d:"Z",\u017a:"z",\u017c:"z",\u017e:"z",\u0132:"IJ",\u0133:"ij",\u0152:"Oe",\u0153:"oe",\u0149:"'n",\u017f:"s"});v.exports=p},20395:(v,S,i)=>{var r=i(4153),u=function(){try{var p=r(Object,"defineProperty");return p({},"",{}),p}catch(f){}}();v.exports=u},27667:(v,S,i)=>{var r=i(48690),u=i(8141),p=i(13747);v.exports=function(y,T,M,R,F,Z){var J=1&M,Q=y.length,ee=T.length;if(Q!=ee&&!(J&&ee>Q))return!1;var ue=Z.get(y),ae=Z.get(T);if(ue&&ae)return ue==T&&ae==y;var $=-1,se=!0,ve=2&M?new r:void 0;for(Z.set(y,T),Z.set(T,y);++$<Q;){var oe=y[$],he=T[$];if(R)var me=J?R(he,oe,$,T,y,Z):R(oe,he,$,y,T,Z);if(void 0!==me){if(me)continue;se=!1;break}if(ve){if(!u(T,function(Oe,ce){if(!p(ve,ce)&&(oe===Oe||F(oe,Oe,M,R,Z)))return ve.push(ce)})){se=!1;break}}else if(oe!==he&&!F(oe,he,M,R,Z)){se=!1;break}}return Z.delete(y),Z.delete(T),se}},64630:(v,S,i)=>{var r=i(57333),u=i(96820),p=i(71166),f=i(27667),e=i(37461),_=i(57673),ve=r?r.prototype:void 0,oe=ve?ve.valueOf:void 0;v.exports=function(me,Oe,ce,dt,ze,Ye,je){switch(ce){case"[object DataView]":if(me.byteLength!=Oe.byteLength||me.byteOffset!=Oe.byteOffset)return!1;me=me.buffer,Oe=Oe.buffer;case"[object ArrayBuffer]":return!(me.byteLength!=Oe.byteLength||!Ye(new u(me),new u(Oe)));case"[object Boolean]":case"[object Date]":case"[object Number]":return p(+me,+Oe);case"[object Error]":return me.name==Oe.name&&me.message==Oe.message;case"[object RegExp]":case"[object String]":return me==Oe+"";case"[object Map]":var Ie=e;case"[object Set]":if(Ie||(Ie=_),me.size!=Oe.size&&!(1&dt))return!1;var He=je.get(me);if(He)return He==Oe;dt|=2,je.set(me,Oe);var Zt=f(Ie(me),Ie(Oe),dt,ze,Ye,je);return je.delete(me),Zt;case"[object Symbol]":if(oe)return oe.call(me)==oe.call(Oe)}return!1}},70838:(v,S,i)=>{var r=i(58605),f=Object.prototype.hasOwnProperty;v.exports=function(_,y,T,M,R,F){var Z=1&T,J=r(_),Q=J.length;if(Q!=r(y).length&&!Z)return!1;for(var ae=Q;ae--;){var $=J[ae];if(!(Z?$ in y:f.call(y,$)))return!1}var se=F.get(_),ve=F.get(y);if(se&&ve)return se==y&&ve==_;var oe=!0;F.set(_,y),F.set(y,_);for(var he=Z;++ae<Q;){var me=_[$=J[ae]],Oe=y[$];if(M)var ce=Z?M(Oe,me,$,y,_,F):M(me,Oe,$,_,y,F);if(!(void 0===ce?me===Oe||R(me,Oe,T,M,F):ce)){oe=!1;break}he||(he="constructor"==$)}if(oe&&!he){var dt=_.constructor,ze=y.constructor;dt!=ze&&"constructor"in _&&"constructor"in y&&!("function"==typeof dt&&dt instanceof dt&&"function"==typeof ze&&ze instanceof ze)&&(oe=!1)}return F.delete(_),F.delete(y),oe}},10058:(v,S,i)=>{var r=i(94694),u=i(15529),p=i(39009);v.exports=function(e){return p(u(e,void 0,r),e+"")}},61138:v=>{var S="object"==typeof global&&global&&global.Object===Object&&global;v.exports=S},58605:(v,S,i)=>{var r=i(19215),u=i(10296),p=i(59108);v.exports=function(e){return r(e,p,u)}},51675:(v,S,i)=>{var r=i(19215),u=i(29572),p=i(42970);v.exports=function(e){return r(e,p,u)}},85556:(v,S,i)=>{var r=i(36586);v.exports=function(p,f){var e=p.__data__;return r(f)?e["string"==typeof f?"string":"hash"]:e.map}},48834:(v,S,i)=>{var r=i(45774),u=i(59108);v.exports=function(f){for(var e=u(f),_=e.length;_--;){var y=e[_],T=f[y];e[_]=[y,T,r(T)]}return e}},4153:(v,S,i)=>{var r=i(43540),u=i(36825);v.exports=function(f,e){var _=u(f,e);return r(_)?_:void 0}},52398:(v,S,i)=>{var u=i(93332)(Object.getPrototypeOf,Object);v.exports=u},21613:(v,S,i)=>{var r=i(57333),u=Object.prototype,p=u.hasOwnProperty,f=u.toString,e=r?r.toStringTag:void 0;v.exports=function(y){var T=p.call(y,e),M=y[e];try{y[e]=void 0;var R=!0}catch(Z){}var F=f.call(y);return R&&(T?y[e]=M:delete y[e]),F}},10296:(v,S,i)=>{var r=i(11375),u=i(65336),f=Object.prototype.propertyIsEnumerable,e=Object.getOwnPropertySymbols;v.exports=e?function(y){return null==y?[]:(y=Object(y),r(e(y),function(T){return f.call(y,T)}))}:u},29572:(v,S,i)=>{var r=i(94165),u=i(52398),p=i(10296),f=i(65336);v.exports=Object.getOwnPropertySymbols?function(y){for(var T=[];y;)r(T,p(y)),y=u(y);return T}:f},26663:(v,S,i)=>{var r=i(81235),u=i(39046),p=i(97129),f=i(74918),e=i(54203),_=i(72802),y=i(51217),T="[object Map]",R="[object Promise]",F="[object Set]",Z="[object WeakMap]",J="[object DataView]",Q=y(r),ee=y(u),ue=y(p),ae=y(f),$=y(e),se=_;(r&&se(new r(new ArrayBuffer(1)))!=J||u&&se(new u)!=T||p&&se(p.resolve())!=R||f&&se(new f)!=F||e&&se(new e)!=Z)&&(se=function(ve){var oe=_(ve),he="[object Object]"==oe?ve.constructor:void 0,me=he?y(he):"";if(me)switch(me){case Q:return J;case ee:return T;case ue:return R;case ae:return F;case $:return Z}return oe}),v.exports=se},36825:v=>{v.exports=function(i,r){return null==i?void 0:i[r]}},82138:(v,S,i)=>{var r=i(64667),u=i(2952),p=i(81690),f=i(20968),e=i(8613),_=i(82773);v.exports=function(T,M,R){for(var F=-1,Z=(M=r(M,T)).length,J=!1;++F<Z;){var Q=_(M[F]);if(!(J=null!=T&&R(T,Q)))break;T=T[Q]}return J||++F!=Z?J:!!(Z=null==T?0:T.length)&&e(Z)&&f(Q,Z)&&(p(T)||u(T))}},407:v=>{var _=RegExp("[\\u200d\\ud800-\\udfff\\u0300-\\u036f\\ufe20-\\ufe2f\\u20d0-\\u20ff\\ufe0e\\ufe0f]");v.exports=function(T){return _.test(T)}},59316:v=>{var S=/[a-z][A-Z]|[A-Z]{2}[a-z]|[0-9][a-zA-Z]|[a-zA-Z][0-9]|[^a-zA-Z0-9 ]/;v.exports=function(r){return S.test(r)}},59410:(v,S,i)=>{var r=i(95969);v.exports=function(){this.__data__=r?r(null):{},this.size=0}},21143:v=>{v.exports=function(i){var r=this.has(i)&&delete this.__data__[i];return this.size-=r?1:0,r}},604:(v,S,i)=>{var r=i(95969),f=Object.prototype.hasOwnProperty;v.exports=function(_){var y=this.__data__;if(r){var T=y[_];return"__lodash_hash_undefined__"===T?void 0:T}return f.call(y,_)?y[_]:void 0}},80584:(v,S,i)=>{var r=i(95969),p=Object.prototype.hasOwnProperty;v.exports=function(e){var _=this.__data__;return r?void 0!==_[e]:p.call(_,e)}},7792:(v,S,i)=>{var r=i(95969);v.exports=function(f,e){var _=this.__data__;return this.size+=this.has(f)?0:1,_[f]=r&&void 0===e?"__lodash_hash_undefined__":e,this}},62963:v=>{var i=Object.prototype.hasOwnProperty;v.exports=function(u){var p=u.length,f=new u.constructor(p);return p&&"string"==typeof u[0]&&i.call(u,"index")&&(f.index=u.index,f.input=u.input),f}},32143:(v,S,i)=>{var r=i(88461),u=i(59757),p=i(83615),f=i(42282),e=i(96282);v.exports=function(dt,ze,Ye){var je=dt.constructor;switch(ze){case"[object ArrayBuffer]":return r(dt);case"[object Boolean]":case"[object Date]":return new je(+dt);case"[object DataView]":return u(dt,Ye);case"[object Float32Array]":case"[object Float64Array]":case"[object Int8Array]":case"[object Int16Array]":case"[object Int32Array]":case"[object Uint8Array]":case"[object Uint8ClampedArray]":case"[object Uint16Array]":case"[object Uint32Array]":return e(dt,Ye);case"[object Map]":return new je;case"[object Number]":case"[object String]":return new je(dt);case"[object RegExp]":return p(dt);case"[object Set]":return new je;case"[object Symbol]":return f(dt)}}},31563:(v,S,i)=>{var r=i(60920),u=i(52398),p=i(58845);v.exports=function(e){return"function"!=typeof e.constructor||p(e)?{}:r(u(e))}},21006:(v,S,i)=>{var r=i(57333),u=i(2952),p=i(81690),f=r?r.isConcatSpreadable:void 0;v.exports=function(_){return p(_)||u(_)||!!(f&&_&&_[f])}},20968:v=>{var i=/^(?:0|[1-9]\d*)$/;v.exports=function(u,p){var f=typeof u;return!!(p=null==p?9007199254740991:p)&&("number"==f||"symbol"!=f&&i.test(u))&&u>-1&&u%1==0&&u<p}},71100:(v,S,i)=>{var r=i(71166),u=i(93406),p=i(20968),f=i(53867);v.exports=function(_,y,T){if(!f(T))return!1;var M=typeof y;return!!("number"==M?u(T)&&p(y,T.length):"string"==M&&y in T)&&r(T[y],_)}},99743:(v,S,i)=>{var r=i(81690),u=i(7786),p=/\.|\[(?:[^[\]]*|(["'])(?:(?!\1)[^\\]|\\.)*?\1)\]/,f=/^\w*$/;v.exports=function(_,y){if(r(_))return!1;var T=typeof _;return!("number"!=T&&"symbol"!=T&&"boolean"!=T&&null!=_&&!u(_))||f.test(_)||!p.test(_)||null!=y&&_ in Object(y)}},36586:v=>{v.exports=function(i){var r=typeof i;return"string"==r||"number"==r||"symbol"==r||"boolean"==r?"__proto__"!==i:null===i}},38466:(v,S,i)=>{var f,r=i(93412),u=(f=/[^.]+$/.exec(r&&r.keys&&r.keys.IE_PROTO||""))?"Symbol(src)_1."+f:"";v.exports=function(f){return!!u&&u in f}},58845:v=>{var S=Object.prototype;v.exports=function(r){var u=r&&r.constructor;return r===("function"==typeof u&&u.prototype||S)}},45774:(v,S,i)=>{var r=i(53867);v.exports=function(p){return p==p&&!r(p)}},63391:v=>{v.exports=function(){this.__data__=[],this.size=0}},68971:(v,S,i)=>{var r=i(15758),p=Array.prototype.splice;v.exports=function(e){var _=this.__data__,y=r(_,e);return!(y<0||(y==_.length-1?_.pop():p.call(_,y,1),--this.size,0))}},18858:(v,S,i)=>{var r=i(15758);v.exports=function(p){var f=this.__data__,e=r(f,p);return e<0?void 0:f[e][1]}},13913:(v,S,i)=>{var r=i(15758);v.exports=function(p){return r(this.__data__,p)>-1}},68944:(v,S,i)=>{var r=i(15758);v.exports=function(p,f){var e=this.__data__,_=r(e,p);return _<0?(++this.size,e.push([p,f])):e[_][1]=f,this}},70536:(v,S,i)=>{var r=i(41505),u=i(73545),p=i(39046);v.exports=function(){this.size=0,this.__data__={hash:new r,map:new(p||u),string:new r}}},61502:(v,S,i)=>{var r=i(85556);v.exports=function(p){var f=r(this,p).delete(p);return this.size-=f?1:0,f}},94960:(v,S,i)=>{var r=i(85556);v.exports=function(p){return r(this,p).get(p)}},61539:(v,S,i)=>{var r=i(85556);v.exports=function(p){return r(this,p).has(p)}},34138:(v,S,i)=>{var r=i(85556);v.exports=function(p,f){var e=r(this,p),_=e.size;return e.set(p,f),this.size+=e.size==_?0:1,this}},37461:v=>{v.exports=function(i){var r=-1,u=Array(i.size);return i.forEach(function(p,f){u[++r]=[f,p]}),u}},63587:v=>{v.exports=function(i,r){return function(u){return null!=u&&u[i]===r&&(void 0!==r||i in Object(u))}}},43911:(v,S,i)=>{var r=i(97425);v.exports=function(f){var e=r(f,function(y){return 500===_.size&&_.clear(),y}),_=e.cache;return e}},95969:(v,S,i)=>{var u=i(4153)(Object,"create");v.exports=u},36700:(v,S,i)=>{var u=i(93332)(Object.keys,Object);v.exports=u},25618:v=>{v.exports=function(i){var r=[];if(null!=i)for(var u in Object(i))r.push(u);return r}},70938:(v,S,i)=>{v=i.nmd(v);var r=i(61138),u=S&&!S.nodeType&&S,p=u&&v&&!v.nodeType&&v,e=p&&p.exports===u&&r.process,_=function(){try{return p&&p.require&&p.require("util").types||e&&e.binding&&e.binding("util")}catch(T){}}();v.exports=_},81244:v=>{var i=Object.prototype.toString;v.exports=function(u){return i.call(u)}},93332:v=>{v.exports=function(i,r){return function(u){return i(r(u))}}},15529:(v,S,i)=>{var r=i(81638),u=Math.max;v.exports=function(f,e,_){return e=u(void 0===e?f.length-1:e,0),function(){for(var y=arguments,T=-1,M=u(y.length-e,0),R=Array(M);++T<M;)R[T]=y[e+T];T=-1;for(var F=Array(e+1);++T<e;)F[T]=y[T];return F[e]=_(R),r(f,this,F)}}},61746:(v,S,i)=>{var r=i(93436),u=i(63586);v.exports=function(f,e){return e.length<2?f:r(f,u(e,0,-1))}},27038:(v,S,i)=>{var r=i(61138),u="object"==typeof self&&self&&self.Object===Object&&self,p=r||u||Function("return this")();v.exports=p},45959:v=>{v.exports=function(i,r){if(("constructor"!==r||"function"!=typeof i[r])&&"__proto__"!=r)return i[r]}},30365:v=>{v.exports=function(r){return this.__data__.set(r,"__lodash_hash_undefined__"),this}},58235:v=>{v.exports=function(i){return this.__data__.has(i)}},57673:v=>{v.exports=function(i){var r=-1,u=Array(i.size);return i.forEach(function(p){u[++r]=p}),u}},39009:(v,S,i)=>{var r=i(99372),p=i(44094)(r);v.exports=p},44094:v=>{var r=Date.now;v.exports=function(p){var f=0,e=0;return function(){var _=r(),y=16-(_-e);if(e=_,y>0){if(++f>=800)return arguments[0]}else f=0;return p.apply(void 0,arguments)}}},18034:(v,S,i)=>{var r=i(73545);v.exports=function(){this.__data__=new r,this.size=0}},37238:v=>{v.exports=function(i){var r=this.__data__,u=r.delete(i);return this.size=r.size,u}},75887:v=>{v.exports=function(i){return this.__data__.get(i)}},81450:v=>{v.exports=function(i){return this.__data__.has(i)}},61386:(v,S,i)=>{var r=i(73545),u=i(39046),p=i(93177);v.exports=function(_,y){var T=this.__data__;if(T instanceof r){var M=T.__data__;if(!u||M.length<199)return M.push([_,y]),this.size=++T.size,this;T=this.__data__=new p(M)}return T.set(_,y),this.size=T.size,this}},2150:(v,S,i)=>{var r=i(87280),u=i(407),p=i(1879);v.exports=function(e){return u(e)?p(e):r(e)}},89775:(v,S,i)=>{var r=i(43911),u=/[^.[\]]+|\[(?:(-?\d+(?:\.\d+)?)|(["'])((?:(?!\2)[^\\]|\\.)*?)\2)\]|(?=(?:\.|\[\])(?:\.|\[\]|$))/g,p=/\\(\\)?/g,f=r(function(e){var _=[];return 46===e.charCodeAt(0)&&_.push(""),e.replace(u,function(y,T,M,R){_.push(M?R.replace(p,"$1"):T||y)}),_});v.exports=f},82773:(v,S,i)=>{var r=i(7786);v.exports=function(f){if("string"==typeof f||r(f))return f;var e=f+"";return"0"==e&&1/f==-1/0?"-0":e}},51217:v=>{var i=Function.prototype.toString;v.exports=function(u){if(null!=u){try{return i.call(u)}catch(p){}try{return u+""}catch(p){}}return""}},87478:v=>{var S=/\s/;v.exports=function(r){for(var u=r.length;u--&&S.test(r.charAt(u)););return u}},1879:v=>{var S="\\ud800-\\udfff",e="["+S+"]",_="[\\u0300-\\u036f\\ufe20-\\ufe2f\\u20d0-\\u20ff]",y="\\ud83c[\\udffb-\\udfff]",M="[^"+S+"]",R="(?:\\ud83c[\\udde6-\\uddff]){2}",F="[\\ud800-\\udbff][\\udc00-\\udfff]",J="(?:"+_+"|"+y+")?",Q="[\\ufe0e\\ufe0f]?",ue=Q+J+"(?:\\u200d(?:"+[M,R,F].join("|")+")"+Q+J+")*",ae="(?:"+[M+_+"?",_,R,F,e].join("|")+")",$=RegExp(y+"(?="+y+")|"+ae+ue,"g");v.exports=function(ve){return ve.match($)||[]}},58863:v=>{var S="\\ud800-\\udfff",f="\\u2700-\\u27bf",e="a-z\\xdf-\\xf6\\xf8-\\xff",R="A-Z\\xc0-\\xd6\\xd8-\\xde",Z="\\xac\\xb1\\xd7\\xf7\\x00-\\x2f\\x3a-\\x40\\x5b-\\x60\\x7b-\\xbf\\u2000-\\u206f \\t\\x0b\\f\\xa0\\ufeff\\n\\r\\u2028\\u2029\\u1680\\u180e\\u2000\\u2001\\u2002\\u2003\\u2004\\u2005\\u2006\\u2007\\u2008\\u2009\\u200a\\u202f\\u205f\\u3000",Q="["+Z+"]",ue="\\d+",ae="["+f+"]",$="["+e+"]",se="[^"+S+Z+ue+f+e+R+"]",me="(?:\\ud83c[\\udde6-\\uddff]){2}",Oe="[\\ud800-\\udbff][\\udc00-\\udfff]",ce="["+R+"]",ze="(?:"+$+"|"+se+")",Ye="(?:"+ce+"|"+se+")",je="(?:['\u2019](?:d|ll|m|re|s|t|ve))?",Ie="(?:['\u2019](?:D|LL|M|RE|S|T|VE))?",Ve="(?:[\\u0300-\\u036f\\ufe20-\\ufe2f\\u20d0-\\u20ff]|\\ud83c[\\udffb-\\udfff])?",He="[\\ufe0e\\ufe0f]?",$t=He+Ve+"(?:\\u200d(?:"+["[^"+S+"]",me,Oe].join("|")+")"+He+Ve+")*",Gt="(?:"+[ae,me,Oe].join("|")+")"+$t,Ut=RegExp([ce+"?"+$+"+"+je+"(?="+[Q,ce,"$"].join("|")+")",Ye+"+"+Ie+"(?="+[Q,ce+ze,"$"].join("|")+")",ce+"?"+ze+"+"+je,ce+"+"+Ie,"\\d*(?:1ST|2ND|3RD|(?![123])\\dTH)(?=\\b|[a-z_])","\\d*(?:1st|2nd|3rd|(?![123])\\dth)(?=\\b|[A-Z_])",ue,Gt].join("|"),"g");v.exports=function(mt){return mt.match(Ut)||[]}},35037:(v,S,i)=>{var r=i(76974),p=i(17407)(function(f,e,_){return e=e.toLowerCase(),f+(_?r(e):e)});v.exports=p},76974:(v,S,i)=>{var r=i(41233),u=i(93890);v.exports=function(f){return u(r(f).toLowerCase())}},45654:v=>{v.exports=function(i){return function(){return i}}},41776:(v,S,i)=>{var r=i(53867),u=i(30765),p=i(45038),e=Math.max,_=Math.min;v.exports=function(T,M,R){var F,Z,J,Q,ee,ue,ae=0,$=!1,se=!1,ve=!0;if("function"!=typeof T)throw new TypeError("Expected a function");function oe(Ie){var Ve=F,He=Z;return F=Z=void 0,ae=Ie,Q=T.apply(He,Ve)}function he(Ie){return ae=Ie,ee=setTimeout(ce,M),$?oe(Ie):Q}function Oe(Ie){var Ve=Ie-ue;return void 0===ue||Ve>=M||Ve<0||se&&Ie-ae>=J}function ce(){var Ie=u();if(Oe(Ie))return dt(Ie);ee=setTimeout(ce,function(Ie){var Zt=M-(Ie-ue);return se?_(Zt,J-(Ie-ae)):Zt}(Ie))}function dt(Ie){return ee=void 0,ve&&F?oe(Ie):(F=Z=void 0,Q)}function je(){var Ie=u(),Ve=Oe(Ie);if(F=arguments,Z=this,ue=Ie,Ve){if(void 0===ee)return he(ue);if(se)return clearTimeout(ee),ee=setTimeout(ce,M),oe(ue)}return void 0===ee&&(ee=setTimeout(ce,M)),Q}return M=p(M)||0,r(R)&&($=!!R.leading,J=(se="maxWait"in R)?e(p(R.maxWait)||0,M):J,ve="trailing"in R?!!R.trailing:ve),je.cancel=function(){void 0!==ee&&clearTimeout(ee),ae=0,F=ue=Z=ee=void 0},je.flush=function(){return void 0===ee?Q:dt(u())},je}},75289:(v,S,i)=>{var r=i(4068),u=i(41233),p=/[\xc0-\xd6\xd8-\xf6\xf8-\xff\u0100-\u017f]/g,M=RegExp("[\\u0300-\\u036f\\ufe20-\\ufe2f\\u20d0-\\u20ff]","g");v.exports=function(F){return(F=u(F))&&F.replace(p,r).replace(M,"")}},71166:v=>{v.exports=function(i,r){return i===r||i!=i&&r!=r}},98990:(v,S,i)=>{var p=i(44674)(i(84857));v.exports=p},84857:(v,S,i)=>{var r=i(12229),u=i(5245),p=i(32781),f=Math.max;v.exports=function(_,y,T){var M=null==_?0:_.length;if(!M)return-1;var R=null==T?0:p(T);return R<0&&(R=f(M+R,0)),r(_,u(y,3),R)}},94694:(v,S,i)=>{var r=i(56369);v.exports=function(p){return null!=p&&p.length?r(p,1):[]}},58102:(v,S,i)=>{var r=i(93436);v.exports=function(p,f,e){var _=null==p?void 0:r(p,f);return void 0===_?e:_}},18303:(v,S,i)=>{var r=i(55333),u=i(82138);v.exports=function(f,e){return null!=f&&u(f,e,r)}},80290:v=>{v.exports=function(i){return i}},2952:(v,S,i)=>{var r=i(77090),u=i(27503),p=Object.prototype,f=p.hasOwnProperty,e=p.propertyIsEnumerable,_=r(function(){return arguments}())?r:function(y){return u(y)&&f.call(y,"callee")&&!e.call(y,"callee")};v.exports=_},81690:v=>{v.exports=Array.isArray},93406:(v,S,i)=>{var r=i(55836),u=i(8613);v.exports=function(f){return null!=f&&u(f.length)&&!r(f)}},82027:(v,S,i)=>{var r=i(93406),u=i(27503);v.exports=function(f){return u(f)&&r(f)}},84444:(v,S,i)=>{v=i.nmd(v);var r=i(27038),u=i(61711),p=S&&!S.nodeType&&S,f=p&&v&&!v.nodeType&&v,_=f&&f.exports===p?r.Buffer:void 0;v.exports=(_?_.isBuffer:void 0)||u},12232:(v,S,i)=>{var r=i(92488),u=i(26663),p=i(2952),f=i(81690),e=i(93406),_=i(84444),y=i(58845),T=i(47679),Z=Object.prototype.hasOwnProperty;v.exports=function(Q){if(null==Q)return!0;if(e(Q)&&(f(Q)||"string"==typeof Q||"function"==typeof Q.splice||_(Q)||T(Q)||p(Q)))return!Q.length;var ee=u(Q);if("[object Map]"==ee||"[object Set]"==ee)return!Q.size;if(y(Q))return!r(Q).length;for(var ue in Q)if(Z.call(Q,ue))return!1;return!0}},55836:(v,S,i)=>{var r=i(72802),u=i(53867);v.exports=function(T){if(!u(T))return!1;var M=r(T);return"[object Function]"==M||"[object GeneratorFunction]"==M||"[object AsyncFunction]"==M||"[object Proxy]"==M}},8613:v=>{v.exports=function(r){return"number"==typeof r&&r>-1&&r%1==0&&r<=9007199254740991}},32e3:(v,S,i)=>{var r=i(63434),u=i(70544),p=i(70938),f=p&&p.isMap,e=f?u(f):r;v.exports=e},53867:v=>{v.exports=function(i){var r=typeof i;return null!=i&&("object"==r||"function"==r)}},27503:v=>{v.exports=function(i){return null!=i&&"object"==typeof i}},82358:(v,S,i)=>{var r=i(72802),u=i(52398),p=i(27503),y=Function.prototype.toString,T=Object.prototype.hasOwnProperty,M=y.call(Object);v.exports=function(F){if(!p(F)||"[object Object]"!=r(F))return!1;var Z=u(F);if(null===Z)return!0;var J=T.call(Z,"constructor")&&Z.constructor;return"function"==typeof J&&J instanceof J&&y.call(J)==M}},48855:(v,S,i)=>{var r=i(67495),u=i(70544),p=i(70938),f=p&&p.isSet,e=f?u(f):r;v.exports=e},64871:(v,S,i)=>{var r=i(72802),u=i(81690),p=i(27503);v.exports=function(_){return"string"==typeof _||!u(_)&&p(_)&&"[object String]"==r(_)}},7786:(v,S,i)=>{var r=i(72802),u=i(27503);v.exports=function(e){return"symbol"==typeof e||u(e)&&"[object Symbol]"==r(e)}},47679:(v,S,i)=>{var r=i(99390),u=i(70544),p=i(70938),f=p&&p.isTypedArray,e=f?u(f):r;v.exports=e},59108:(v,S,i)=>{var r=i(71890),u=i(92488),p=i(93406);v.exports=function(e){return p(e)?r(e):u(e)}},42970:(v,S,i)=>{var r=i(71890),u=i(50762),p=i(93406);v.exports=function(e){return p(e)?r(e,!0):u(e)}},27842:v=>{v.exports=function(i){var r=null==i?0:i.length;return r?i[r-1]:void 0}},23815:function(v,S,i){var r;v=i.nmd(v),function(){var u,_="Expected a function",T="__lodash_hash_undefined__",R="__lodash_placeholder__",Zt=1/0,st=9007199254740991,Gt=4294967295,mt=[["ary",128],["bind",1],["bindKey",2],["curry",8],["curryRight",16],["flip",512],["partial",32],["partialRight",64],["rearg",256]],Yt="[object Arguments]",Dt="[object Array]",Yn="[object Boolean]",Hr="[object Date]",Ir="[object Error]",wr="[object Function]",Qr="[object GeneratorFunction]",Kr="[object Map]",In="[object Number]",Zr="[object Object]",Ur="[object Promise]",$i="[object RegExp]",Hi="[object Set]",Br="[object String]",On="[object Symbol]",Jn="[object WeakMap]",Lr="[object ArrayBuffer]",Vn="[object DataView]",zr="[object Float32Array]",hi="[object Float64Array]",Ai="[object Int8Array]",Tr="[object Int16Array]",Nr="[object Int32Array]",gn="[object Uint8Array]",En="[object Uint8ClampedArray]",mr="[object Uint16Array]",Xt="[object Uint32Array]",zn=/\b__p \+= '';/g,vr=/\b(__p \+=) '' \+/g,si=/(__e\(.*?\)|\b__t\)) \+\n'';/g,Ii=/&(?:amp|lt|gt|quot|#39);/g,no=/[&<>"']/g,so=RegExp(Ii.source),Ze=RegExp(no.source),Dr=/<%-([\s\S]+?)%>/g,jt=/<%([\s\S]+?)%>/g,xt=/<%=([\s\S]+?)%>/g,mn=/\.|\[(?:[^[\]]*|(["'])(?:(?!\1)[^\\]|\\.)*?\1)\]/,Wn=/^\w*$/,kn=/[^.[\]]+|\[(?:(-?\d+(?:\.\d+)?)|(["'])((?:(?!\2)[^\\]|\\.)*?)\2)\]|(?=(?:\.|\[\])(?:\.|\[\]|$))/g,wn=/[\\^$.*+?()[\]{}|]/g,nr=RegExp(wn.source),Gi=/^\s+/,po=/\s/,yo=/\{(?:\n\/\* \[wrapped with .+\] \*\/)?\n?/,Mo=/\{\n\/\* \[wrapped with (.+)\] \*/,Vi=/,? & /,cs=/[^\x00-\x2f\x3a-\x40\x5b-\x60\x7b-\x7f]+/g,zo=/[()=,{}\[\]\/\s]/,So=/\\(\\)?/g,Si=/\$\{([^\\}]*(?:\\.[^\\}]*)*)\}/g,ai=/\w*$/,Zn=/^[-+]0x[0-9a-f]+$/i,cr=/^0b[01]+$/i,yr=/^\[object .+?Constructor\]$/,rr=/^0o[0-7]+$/i,ri=/^(?:0|[1-9]\d*)$/,ho=/[\xc0-\xd6\xd8-\xf6\xf8-\xff\u0100-\u017f]/g,Ti=/($^)/,Bo=/['\n\r\u2028\u2029\\]/g,xo="\\ud800-\\udfff",Ht="\\u0300-\\u036f\\ufe20-\\ufe2f\\u20d0-\\u20ff",cn="\\u2700-\\u27bf",Ct="a-z\\xdf-\\xf6\\xf8-\\xff",zi="A-Z\\xc0-\\xd6\\xd8-\\xde",Wo="\\ufe0e\\ufe0f",Do="\\xac\\xb1\\xd7\\xf7\\x00-\\x2f\\x3a-\\x40\\x5b-\\x60\\x7b-\\xbf\\u2000-\\u206f \\t\\x0b\\f\\xa0\\ufeff\\n\\r\\u2028\\u2029\\u1680\\u180e\\u2000\\u2001\\u2002\\u2003\\u2004\\u2005\\u2006\\u2007\\u2008\\u2009\\u200a\\u202f\\u205f\\u3000",_s="["+xo+"]",bs="["+Do+"]",qo="["+Ht+"]",ra="\\d+",Ia="["+cn+"]",pa="["+Ct+"]",Bs="[^"+xo+Do+ra+cn+Ct+zi+"]",Yl="\\ud83c[\\udffb-\\udfff]",fo="[^"+xo+"]",Da="(?:\\ud83c[\\udde6-\\uddff]){2}",Ao="[\\ud800-\\udbff][\\udc00-\\udfff]",ls="["+zi+"]",Ra="(?:"+pa+"|"+Bs+")",pl="(?:"+ls+"|"+Bs+")",Qs="(?:['\u2019](?:d|ll|m|re|s|t|ve))?",Fo="(?:['\u2019](?:D|LL|M|RE|S|T|VE))?",Eo="(?:"+qo+"|"+Yl+")?",ks="["+Wo+"]?",ro=ks+Eo+"(?:\\u200d(?:"+[fo,Da,Ao].join("|")+")"+ks+Eo+")*",tt="(?:"+[Ia,Da,Ao].join("|")+")"+ro,on="(?:"+[fo+qo+"?",qo,Da,Ao,_s].join("|")+")",ne=RegExp("['\u2019]","g"),$e=RegExp(qo,"g"),Pt=RegExp(Yl+"(?="+Yl+")|"+on+ro,"g"),sn=RegExp([ls+"?"+pa+"+"+Qs+"(?="+[bs,ls,"$"].join("|")+")",pl+"+"+Fo+"(?="+[bs,ls+Ra,"$"].join("|")+")",ls+"?"+Ra+"+"+Qs,ls+"+"+Fo,"\\d*(?:1ST|2ND|3RD|(?![123])\\dTH)(?=\\b|[a-z_])","\\d*(?:1st|2nd|3rd|(?![123])\\dth)(?=\\b|[A-Z_])",ra,tt].join("|"),"g"),ei=RegExp("[\\u200d"+xo+Ht+Wo+"]"),fi=/[a-z][A-Z]|[A-Z]{2}[a-z]|[0-9][a-zA-Z]|[a-zA-Z][0-9]|[^a-zA-Z0-9 ]/,Oi=["Array","Buffer","DataView","Date","Error","Float32Array","Float64Array","Function","Int8Array","Int16Array","Int32Array","Map","Math","Object","Promise","RegExp","Set","String","Symbol","TypeError","Uint8Array","Uint8ClampedArray","Uint16Array","Uint32Array","WeakMap","_","clearTimeout","isFinite","parseInt","setTimeout"],os=-1,Ro={};Ro[zr]=Ro[hi]=Ro[Ai]=Ro[Tr]=Ro[Nr]=Ro[gn]=Ro[En]=Ro[mr]=Ro[Xt]=!0,Ro[Yt]=Ro[Dt]=Ro[Lr]=Ro[Yn]=Ro[Vn]=Ro[Hr]=Ro[Ir]=Ro[wr]=Ro[Kr]=Ro[In]=Ro[Zr]=Ro[$i]=Ro[Hi]=Ro[Br]=Ro[Jn]=!1;var Uo={};Uo[Yt]=Uo[Dt]=Uo[Lr]=Uo[Vn]=Uo[Yn]=Uo[Hr]=Uo[zr]=Uo[hi]=Uo[Ai]=Uo[Tr]=Uo[Nr]=Uo[Kr]=Uo[In]=Uo[Zr]=Uo[$i]=Uo[Hi]=Uo[Br]=Uo[On]=Uo[gn]=Uo[En]=Uo[mr]=Uo[Xt]=!0,Uo[Ir]=Uo[wr]=Uo[Jn]=!1;var qu={"\\":"\\","'":"'","\n":"n","\r":"r","\u2028":"u2028","\u2029":"u2029"},Ru=parseFloat,yc=parseInt,bc="object"==typeof global&&global&&global.Object===Object&&global,ed="object"==typeof self&&self&&self.Object===Object&&self,Hl=bc||ed||Function("return this")(),Zl=S&&!S.nodeType&&S,$s=Zl&&v&&!v.nodeType&&v,dc=$s&&$s.exports===Zl,ou=dc&&bc.process,el=function(){try{return $s&&$s.require&&$s.require("util").types||ou&&ou.binding&&ou.binding("util")}catch(Mr){}}(),Cu=el&&el.isArrayBuffer,jl=el&&el.isDate,rt=el&&el.isMap,Nt=el&&el.isRegExp,ct=el&&el.isSet,Te=el&&el.isTypedArray;function Me(Ln,Mr,gr){switch(gr.length){case 0:return Ln.call(Mr);case 1:return Ln.call(Mr,gr[0]);case 2:return Ln.call(Mr,gr[0],gr[1]);case 3:return Ln.call(Mr,gr[0],gr[1],gr[2])}return Ln.apply(Mr,gr)}function De(Ln,Mr,gr,co){for(var Ss=-1,Na=null==Ln?0:Ln.length;++Ss<Na;){var El=Ln[Ss];Mr(co,El,gr(El),Ln)}return co}function Tt(Ln,Mr){for(var gr=-1,co=null==Ln?0:Ln.length;++gr<co&&!1!==Mr(Ln[gr],gr,Ln););return Ln}function dr(Ln,Mr){for(var gr=null==Ln?0:Ln.length;gr--&&!1!==Mr(Ln[gr],gr,Ln););return Ln}function Qi(Ln,Mr){for(var gr=-1,co=null==Ln?0:Ln.length;++gr<co;)if(!Mr(Ln[gr],gr,Ln))return!1;return!0}function Jo(Ln,Mr){for(var gr=-1,co=null==Ln?0:Ln.length,Ss=0,Na=[];++gr<co;){var El=Ln[gr];Mr(El,gr,Ln)&&(Na[Ss++]=El)}return Na}function Es(Ln,Mr){return!(null==Ln||!Ln.length)&&Pc(Ln,Mr,0)>-1}function vs(Ln,Mr,gr){for(var co=-1,Ss=null==Ln?0:Ln.length;++co<Ss;)if(gr(Mr,Ln[co]))return!0;return!1}function Ms(Ln,Mr){for(var gr=-1,co=null==Ln?0:Ln.length,Ss=Array(co);++gr<co;)Ss[gr]=Mr(Ln[gr],gr,Ln);return Ss}function Ma(Ln,Mr){for(var gr=-1,co=Mr.length,Ss=Ln.length;++gr<co;)Ln[Ss+gr]=Mr[gr];return Ln}function uu(Ln,Mr,gr,co){var Ss=-1,Na=null==Ln?0:Ln.length;for(co&&Na&&(gr=Ln[++Ss]);++Ss<Na;)gr=Mr(gr,Ln[Ss],Ss,Ln);return gr}function Wa(Ln,Mr,gr,co){var Ss=null==Ln?0:Ln.length;for(co&&Ss&&(gr=Ln[--Ss]);Ss--;)gr=Mr(gr,Ln[Ss],Ss,Ln);return gr}function Pl(Ln,Mr){for(var gr=-1,co=null==Ln?0:Ln.length;++gr<co;)if(Mr(Ln[gr],gr,Ln))return!0;return!1}var ec=tc("length");function Nc(Ln,Mr,gr){var co;return gr(Ln,function(Ss,Na,El){if(Mr(Ss,Na,El))return co=Na,!1}),co}function Ec(Ln,Mr,gr,co){for(var Ss=Ln.length,Na=gr+(co?1:-1);co?Na--:++Na<Ss;)if(Mr(Ln[Na],Na,Ln))return Na;return-1}function Pc(Ln,Mr,gr){return Mr==Mr?function(Ln,Mr,gr){for(var co=gr-1,Ss=Ln.length;++co<Ss;)if(Ln[co]===Mr)return co;return-1}(Ln,Mr,gr):Ec(Ln,Ic,gr)}function Mu(Ln,Mr,gr,co){for(var Ss=gr-1,Na=Ln.length;++Ss<Na;)if(co(Ln[Ss],Mr))return Ss;return-1}function Ic(Ln){return Ln!=Ln}function md(Ln,Mr){var gr=null==Ln?0:Ln.length;return gr?As(Ln,Mr)/gr:NaN}function tc(Ln){return function(Mr){return null==Mr?u:Mr[Ln]}}function Fi(Ln){return function(Mr){return null==Ln?u:Ln[Mr]}}function ua(Ln,Mr,gr,co,Ss){return Ss(Ln,function(Na,El,Ks){gr=co?(co=!1,Na):Mr(gr,Na,El,Ks)}),gr}function As(Ln,Mr){for(var gr,co=-1,Ss=Ln.length;++co<Ss;){var Na=Mr(Ln[co]);Na!==u&&(gr=gr===u?Na:gr+Na)}return gr}function ku(Ln,Mr){for(var gr=-1,co=Array(Ln);++gr<Ln;)co[gr]=Mr(gr);return co}function Au(Ln){return Ln&&Ln.slice(0,yn(Ln)+1).replace(Gi,"")}function bu(Ln){return function(Mr){return Ln(Mr)}}function cu(Ln,Mr){return Ms(Mr,function(gr){return Ln[gr]})}function Gs(Ln,Mr){return Ln.has(Mr)}function $u(Ln,Mr){for(var gr=-1,co=Ln.length;++gr<co&&Pc(Mr,Ln[gr],0)>-1;);return gr}function Hu(Ln,Mr){for(var gr=Ln.length;gr--&&Pc(Mr,Ln[gr],0)>-1;);return gr}function Yo(Ln,Mr){for(var gr=Ln.length,co=0;gr--;)Ln[gr]===Mr&&++co;return co}var du=Fi({\u00c0:"A",\u00c1:"A",\u00c2:"A",\u00c3:"A",\u00c4:"A",\u00c5:"A",\u00e0:"a",\u00e1:"a",\u00e2:"a",\u00e3:"a",\u00e4:"a",\u00e5:"a",\u00c7:"C",\u00e7:"c",\u00d0:"D",\u00f0:"d",\u00c8:"E",\u00c9:"E",\u00ca:"E",\u00cb:"E",\u00e8:"e",\u00e9:"e",\u00ea:"e",\u00eb:"e",\u00cc:"I",\u00cd:"I",\u00ce:"I",\u00cf:"I",\u00ec:"i",\u00ed:"i",\u00ee:"i",\u00ef:"i",\u00d1:"N",\u00f1:"n",\u00d2:"O",\u00d3:"O",\u00d4:"O",\u00d5:"O",\u00d6:"O",\u00d8:"O",\u00f2:"o",\u00f3:"o",\u00f4:"o",\u00f5:"o",\u00f6:"o",\u00f8:"o",\u00d9:"U",\u00da:"U",\u00db:"U",\u00dc:"U",\u00f9:"u",\u00fa:"u",\u00fb:"u",\u00fc:"u",\u00dd:"Y",\u00fd:"y",\u00ff:"y",\u00c6:"Ae",\u00e6:"ae",\u00de:"Th",\u00fe:"th",\u00df:"ss",\u0100:"A",\u0102:"A",\u0104:"A",\u0101:"a",\u0103:"a",\u0105:"a",\u0106:"C",\u0108:"C",\u010a:"C",\u010c:"C",\u0107:"c",\u0109:"c",\u010b:"c",\u010d:"c",\u010e:"D",\u0110:"D",\u010f:"d",\u0111:"d",\u0112:"E",\u0114:"E",\u0116:"E",\u0118:"E",\u011a:"E",\u0113:"e",\u0115:"e",\u0117:"e",\u0119:"e",\u011b:"e",\u011c:"G",\u011e:"G",\u0120:"G",\u0122:"G",\u011d:"g",\u011f:"g",\u0121:"g",\u0123:"g",\u0124:"H",\u0126:"H",\u0125:"h",\u0127:"h",\u0128:"I",\u012a:"I",\u012c:"I",\u012e:"I",\u0130:"I",\u0129:"i",\u012b:"i",\u012d:"i",\u012f:"i",\u0131:"i",\u0134:"J",\u0135:"j",\u0136:"K",\u0137:"k",\u0138:"k",\u0139:"L",\u013b:"L",\u013d:"L",\u013f:"L",\u0141:"L",\u013a:"l",\u013c:"l",\u013e:"l",\u0140:"l",\u0142:"l",\u0143:"N",\u0145:"N",\u0147:"N",\u014a:"N",\u0144:"n",\u0146:"n",\u0148:"n",\u014b:"n",\u014c:"O",\u014e:"O",\u0150:"O",\u014d:"o",\u014f:"o",\u0151:"o",\u0154:"R",\u0156:"R",\u0158:"R",\u0155:"r",\u0157:"r",\u0159:"r",\u015a:"S",\u015c:"S",\u015e:"S",\u0160:"S",\u015b:"s",\u015d:"s",\u015f:"s",\u0161:"s",\u0162:"T",\u0164:"T",\u0166:"T",\u0163:"t",\u0165:"t",\u0167:"t",\u0168:"U",\u016a:"U",\u016c:"U",\u016e:"U",\u0170:"U",\u0172:"U",\u0169:"u",\u016b:"u",\u016d:"u",\u016f:"u",\u0171:"u",\u0173:"u",\u0174:"W",\u0175:"w",\u0176:"Y",\u0177:"y",\u0178:"Y",\u0179:"Z",\u017b:"Z",\u017d:"Z",\u017a:"z",\u017c:"z",\u017e:"z",\u0132:"IJ",\u0133:"ij",\u0152:"Oe",\u0153:"oe",\u0149:"'n",\u017f:"s"}),Ar=Fi({"&":"&amp;","<":"&lt;",">":"&gt;",'"':"&quot;","'":"&#39;"});function ha(Ln){return"\\"+qu[Ln]}function fa(Ln){return ei.test(Ln)}function hl(Ln){var Mr=-1,gr=Array(Ln.size);return Ln.forEach(function(co,Ss){gr[++Mr]=[Ss,co]}),gr}function Vl(Ln,Mr){return function(gr){return Ln(Mr(gr))}}function Hs(Ln,Mr){for(var gr=-1,co=Ln.length,Ss=0,Na=[];++gr<co;){var El=Ln[gr];(El===Mr||El===R)&&(Ln[gr]=R,Na[Ss++]=gr)}return Na}function V(Ln){var Mr=-1,gr=Array(Ln.size);return Ln.forEach(function(co){gr[++Mr]=co}),gr}function lt(Ln){return fa(Ln)?function(Ln){for(var Mr=Pt.lastIndex=0;Pt.test(Ln);)++Mr;return Mr}(Ln):ec(Ln)}function un(Ln){return fa(Ln)?function(Ln){return Ln.match(Pt)||[]}(Ln):function(Ln){return Ln.split("")}(Ln)}function yn(Ln){for(var Mr=Ln.length;Mr--&&po.test(Ln.charAt(Mr)););return Mr}var Or=Fi({"&amp;":"&","&lt;":"<","&gt;":">","&quot;":'"',"&#39;":"'"}),Ho=function Ln(Mr){var O,gr=(Mr=null==Mr?Hl:Ho.defaults(Hl.Object(),Mr,Ho.pick(Hl,Oi))).Array,co=Mr.Date,Ss=Mr.Error,Na=Mr.Function,El=Mr.Math,Ks=Mr.Object,td=Mr.RegExp,Lc=Mr.String,zl=Mr.TypeError,ki=gr.prototype,_a=Ks.prototype,ll=Mr["__core-js_shared__"],Ul=Na.prototype.toString,Xs=_a.hasOwnProperty,vd=0,vn=(O=/[^.]+$/.exec(ll&&ll.keys&&ll.keys.IE_PROTO||""))?"Symbol(src)_1."+O:"",Il=_a.toString,nd=Ul.call(Ks),Vd=Hl._,ds=td("^"+Ul.call(Xs).replace(wn,"\\$&").replace(/hasOwnProperty|(function).*?(?=\\\()| for .+?(?=\\\])/g,"$1.*?")+"$"),ca=dc?Mr.Buffer:u,jc=Mr.Symbol,nc=Mr.Uint8Array,df=ca?ca.allocUnsafe:u,ul=Vl(Ks.getPrototypeOf,Ks),zd=Ks.create,Wd=_a.propertyIsEnumerable,Be=ki.splice,Pe=jc?jc.isConcatSpreadable:u,Ce=jc?jc.iterator:u,it=jc?jc.toStringTag:u,yt=function(){try{var O=Yu(Ks,"defineProperty");return O({},"",{}),O}catch(H){}}(),qt=Mr.clearTimeout!==Hl.clearTimeout&&Mr.clearTimeout,Un=co&&co.now!==Hl.Date.now&&co.now,qn=Mr.setTimeout!==Hl.setTimeout&&Mr.setTimeout,yi=El.ceil,Go=El.floor,ka=Ks.getOwnPropertySymbols,ss=ca?ca.isBuffer:u,Oa=Mr.isFinite,Us=ki.join,fc=Vl(Ks.keys,Ks),va=El.max,wl=El.min,tl=co.now,$a=Mr.parseInt,Ha=El.random,nl=ki.reverse,Of=Yu(Mr,"DataView"),Dd=Yu(Mr,"Map"),Jd=Yu(Mr,"Promise"),Tc=Yu(Mr,"Set"),Vu=Yu(Mr,"WeakMap"),Sc=Yu(Ks,"create"),Qd=Vu&&new Vu,Gc={},Ff=Rf(Of),zu=Rf(Dd),Tl=Rf(Jd),xl=Rf(Tc),kl=Rf(Vu),Nu=jc?jc.prototype:u,Qa=Nu?Nu.valueOf:u,Wu=Nu?Nu.toString:u;function tn(O){if(Rc(O)&&!li(O)&&!(O instanceof rl)){if(O instanceof Pu)return O;if(Xs.call(O,"__wrapped__"))return vg(O)}return new Pu(O)}var Mc=function(){function O(){}return function(H){if(!Zu(H))return{};if(zd)return zd(H);O.prototype=H;var pe=new O;return O.prototype=u,pe}}();function Ou(){}function Pu(O,H){this.__wrapped__=O,this.__actions__=[],this.__chain__=!!H,this.__index__=0,this.__values__=u}function rl(O){this.__wrapped__=O,this.__actions__=[],this.__dir__=1,this.__filtered__=!1,this.__iteratees__=[],this.__takeCount__=Gt,this.__views__=[]}function Ac(O){var H=-1,pe=null==O?0:O.length;for(this.clear();++H<pe;){var Ke=O[H];this.set(Ke[0],Ke[1])}}function su(O){var H=-1,pe=null==O?0:O.length;for(this.clear();++H<pe;){var Ke=O[H];this.set(Ke[0],Ke[1])}}function Kl(O){var H=-1,pe=null==O?0:O.length;for(this.clear();++H<pe;){var Ke=O[H];this.set(Ke[0],Ke[1])}}function ql(O){var H=-1,pe=null==O?0:O.length;for(this.__data__=new Kl;++H<pe;)this.add(O[H])}function Ll(O){var H=this.__data__=new su(O);this.size=H.size}function wf(O,H){var pe=li(O),Ke=!pe&&hr(O),kt=!pe&&!Ke&&Tu(O),pn=!pe&&!Ke&&!kt&&km(O),er=pe||Ke||kt||pn,Cr=er?ku(O.length,Lc):[],Xr=Cr.length;for(var oo in O)(H||Xs.call(O,oo))&&(!er||!("length"==oo||kt&&("offset"==oo||"parent"==oo)||pn&&("buffer"==oo||"byteLength"==oo||"byteOffset"==oo)||od(oo,Xr)))&&Cr.push(oo);return Cr}function Wl(O){var H=O.length;return H?O[dd(0,H-1)]:u}function Pd(O,H){return ch(gi(O),$c(H,0,O.length))}function rc(O){return ch(gi(O))}function hc(O,H,pe){(pe!==u&&!at(O[H],pe)||pe===u&&!(H in O))&&Sl(O,H,pe)}function gu(O,H,pe){var Ke=O[H];(!Xs.call(O,H)||!at(Ke,pe)||pe===u&&!(H in O))&&Sl(O,H,pe)}function Cc(O,H){for(var pe=O.length;pe--;)if(at(O[pe][0],H))return pe;return-1}function Fc(O,H,pe,Ke){return de(O,function(kt,pn,er){H(Ke,kt,pe(kt),er)}),Ke}function fu(O,H){return O&&Wi(H,nf(H),O)}function Sl(O,H,pe){"__proto__"==H&&yt?yt(O,H,{configurable:!0,enumerable:!0,value:pe,writable:!0}):O[H]=pe}function kc(O,H){for(var pe=-1,Ke=H.length,kt=gr(Ke),pn=null==O;++pe<Ke;)kt[pe]=pn?u:S1(O,H[pe]);return kt}function $c(O,H,pe){return O==O&&(pe!==u&&(O=O<=pe?O:pe),H!==u&&(O=O>=H?O:H)),O}function h(O,H,pe,Ke,kt,pn){var er,Cr=1&H,Xr=2&H,oo=4&H;if(pe&&(er=kt?pe(O,Ke,kt,pn):pe(O)),er!==u)return er;if(!Zu(O))return O;var io=li(O);if(io){if(er=function(O){var H=O.length,pe=new O.constructor(H);return H&&"string"==typeof O[0]&&Xs.call(O,"index")&&(pe.index=O.index,pe.input=O.input),pe}(O),!Cr)return gi(O,er)}else{var vo=Dc(O),hs=vo==wr||vo==Qr;if(Tu(O))return k_(O,Cr);if(vo==Zr||vo==Yt||hs&&!kt){if(er=Xr||hs?{}:ep(O),!Cr)return Xr?function(O,H){return Wi(O,Zf(O),H)}(O,function(O,H){return O&&Wi(H,Md(H),O)}(er,O)):function(O,H){return Wi(O,Bp(O),H)}(O,fu(er,O))}else{if(!Uo[vo])return kt?O:{};er=function(O,H,pe){var Ke=O.constructor;switch(H){case Lr:return qh(O);case Yn:case Hr:return new Ke(+O);case Vn:return function(O,H){var pe=H?qh(O.buffer):O.buffer;return new O.constructor(pe,O.byteOffset,O.byteLength)}(O,pe);case zr:case hi:case Ai:case Tr:case Nr:case gn:case En:case mr:case Xt:return q(O,pe);case Kr:return new Ke;case In:case Br:return new Ke(O);case $i:return function(O){var H=new O.constructor(O.source,ai.exec(O));return H.lastIndex=O.lastIndex,H}(O);case Hi:return new Ke;case On:return function(O){return Qa?Ks(Qa.call(O)):{}}(O)}}(O,vo,Cr)}}pn||(pn=new Ll);var aa=pn.get(O);if(aa)return aa;pn.set(O,er),H0(O)?O.forEach(function(Ya){er.add(h(Ya,H,pe,Ya,O,pn))}):L0(O)&&O.forEach(function(Ya,lu){er.set(lu,h(Ya,H,pe,lu,O,pn))});var Nl=io?u:(oo?Xr?o_:i_:Xr?Md:nf)(O);return Tt(Nl||O,function(Ya,lu){Nl&&(Ya=O[lu=Ya]),gu(er,lu,h(Ya,H,pe,lu,O,pn))}),er}function N(O,H,pe){var Ke=pe.length;if(null==O)return!Ke;for(O=Ks(O);Ke--;){var kt=pe[Ke],er=O[kt];if(er===u&&!(kt in O)||!(0,H[kt])(er))return!1}return!0}function k(O,H,pe){if("function"!=typeof O)throw new zl(_);return uh(function(){O.apply(u,pe)},H)}function K(O,H,pe,Ke){var kt=-1,pn=Es,er=!0,Cr=O.length,Xr=[],oo=H.length;if(!Cr)return Xr;pe&&(H=Ms(H,bu(pe))),Ke?(pn=vs,er=!1):H.length>=200&&(pn=Gs,er=!1,H=new ql(H));e:for(;++kt<Cr;){var io=O[kt],vo=null==pe?io:pe(io);if(io=Ke||0!==io?io:0,er&&vo==vo){for(var hs=oo;hs--;)if(H[hs]===vo)continue e;Xr.push(io)}else pn(H,vo,Ke)||Xr.push(io)}return Xr}tn.templateSettings={escape:Dr,evaluate:jt,interpolate:xt,variable:"",imports:{_:tn}},(tn.prototype=Ou.prototype).constructor=tn,(Pu.prototype=Mc(Ou.prototype)).constructor=Pu,(rl.prototype=Mc(Ou.prototype)).constructor=rl,Ac.prototype.clear=function(){this.__data__=Sc?Sc(null):{},this.size=0},Ac.prototype.delete=function(O){var H=this.has(O)&&delete this.__data__[O];return this.size-=H?1:0,H},Ac.prototype.get=function(O){var H=this.__data__;if(Sc){var pe=H[O];return pe===T?u:pe}return Xs.call(H,O)?H[O]:u},Ac.prototype.has=function(O){var H=this.__data__;return Sc?H[O]!==u:Xs.call(H,O)},Ac.prototype.set=function(O,H){var pe=this.__data__;return this.size+=this.has(O)?0:1,pe[O]=Sc&&H===u?T:H,this},su.prototype.clear=function(){this.__data__=[],this.size=0},su.prototype.delete=function(O){var H=this.__data__,pe=Cc(H,O);return!(pe<0||(pe==H.length-1?H.pop():Be.call(H,pe,1),--this.size,0))},su.prototype.get=function(O){var H=this.__data__,pe=Cc(H,O);return pe<0?u:H[pe][1]},su.prototype.has=function(O){return Cc(this.__data__,O)>-1},su.prototype.set=function(O,H){var pe=this.__data__,Ke=Cc(pe,O);return Ke<0?(++this.size,pe.push([O,H])):pe[Ke][1]=H,this},Kl.prototype.clear=function(){this.size=0,this.__data__={hash:new Ac,map:new(Dd||su),string:new Ac}},Kl.prototype.delete=function(O){var H=mp(this,O).delete(O);return this.size-=H?1:0,H},Kl.prototype.get=function(O){return mp(this,O).get(O)},Kl.prototype.has=function(O){return mp(this,O).has(O)},Kl.prototype.set=function(O,H){var pe=mp(this,O),Ke=pe.size;return pe.set(O,H),this.size+=pe.size==Ke?0:1,this},ql.prototype.add=ql.prototype.push=function(O){return this.__data__.set(O,T),this},ql.prototype.has=function(O){return this.__data__.has(O)},Ll.prototype.clear=function(){this.__data__=new su,this.size=0},Ll.prototype.delete=function(O){var H=this.__data__,pe=H.delete(O);return this.size=H.size,pe},Ll.prototype.get=function(O){return this.__data__.get(O)},Ll.prototype.has=function(O){return this.__data__.has(O)},Ll.prototype.set=function(O,H){var pe=this.__data__;if(pe instanceof su){var Ke=pe.__data__;if(!Dd||Ke.length<199)return Ke.push([O,H]),this.size=++pe.size,this;pe=this.__data__=new Kl(Ke)}return pe.set(O,H),this.size=pe.size,this};var de=ya(Rn),be=ya(sr,!0);function Ue(O,H){var pe=!0;return de(O,function(Ke,kt,pn){return pe=!!H(Ke,kt,pn)}),pe}function we(O,H,pe){for(var Ke=-1,kt=O.length;++Ke<kt;){var pn=O[Ke],er=H(pn);if(null!=er&&(Cr===u?er==er&&!Ef(er):pe(er,Cr)))var Cr=er,Xr=pn}return Xr}function gt(O,H){var pe=[];return de(O,function(Ke,kt,pn){H(Ke,kt,pn)&&pe.push(Ke)}),pe}function vt(O,H,pe,Ke,kt){var pn=-1,er=O.length;for(pe||(pe=G_),kt||(kt=[]);++pn<er;){var Cr=O[pn];H>0&&pe(Cr)?H>1?vt(Cr,H-1,pe,Ke,kt):Ma(kt,Cr):Ke||(kt[kt.length]=Cr)}return kt}var Jt=zs(),Pn=zs(!0);function Rn(O,H){return O&&Jt(O,H,nf)}function sr(O,H){return O&&Pn(O,H,nf)}function jr(O,H){return Jo(H,function(pe){return ef(O[pe])})}function Ni(O,H){for(var pe=0,Ke=(H=Bf(H,O)).length;null!=O&&pe<Ke;)O=O[Uc(H[pe++])];return pe&&pe==Ke?O:u}function Vo(O,H,pe){var Ke=H(O);return li(O)?Ke:Ma(Ke,pe(O))}function $o(O){return null==O?O===u?"[object Undefined]":"[object Null]":it&&it in Ks(O)?function(O){var H=Xs.call(O,it),pe=O[it];try{O[it]=u;var Ke=!0}catch(pn){}var kt=Il.call(O);return Ke&&(H?O[it]=pe:delete O[it]),kt}(O):function(O){return Il.call(O)}(O)}function Vs(O,H){return O>H}function qs(O,H){return null!=O&&Xs.call(O,H)}function dl(O,H){return null!=O&&H in Ks(O)}function sa(O,H,pe){for(var Ke=pe?vs:Es,kt=O[0].length,pn=O.length,er=pn,Cr=gr(pn),Xr=1/0,oo=[];er--;){var io=O[er];er&&H&&(io=Ms(io,bu(H))),Xr=wl(io.length,Xr),Cr[er]=!pe&&(H||kt>=120&&io.length>=120)?new ql(er&&io):u}io=O[0];var vo=-1,hs=Cr[0];e:for(;++vo<kt&&oo.length<Xr;){var aa=io[vo],Ba=H?H(aa):aa;if(aa=pe||0!==aa?aa:0,!(hs?Gs(hs,Ba):Ke(oo,Ba,pe))){for(er=pn;--er;){var Nl=Cr[er];if(!(Nl?Gs(Nl,Ba):Ke(O[er],Ba,pe)))continue e}hs&&hs.push(Ba),oo.push(aa)}}return oo}function ol(O,H,pe){var Ke=null==(O=bf(O,H=Bf(H,O)))?O:O[Uc(Qc(H))];return null==Ke?u:Me(Ke,O,pe)}function Eu(O){return Rc(O)&&$o(O)==Yt}function mu(O,H,pe,Ke,kt){return O===H||(null==O||null==H||!Rc(O)&&!Rc(H)?O!=O&&H!=H:function(O,H,pe,Ke,kt,pn){var er=li(O),Cr=li(H),Xr=er?Dt:Dc(O),oo=Cr?Dt:Dc(H),io=(Xr=Xr==Yt?Zr:Xr)==Zr,vo=(oo=oo==Yt?Zr:oo)==Zr,hs=Xr==oo;if(hs&&Tu(O)){if(!Tu(H))return!1;er=!0,io=!1}if(hs&&!io)return pn||(pn=new Ll),er||km(O)?id(O,H,pe,Ke,kt,pn):function(O,H,pe,Ke,kt,pn,er){switch(pe){case Vn:if(O.byteLength!=H.byteLength||O.byteOffset!=H.byteOffset)return!1;O=O.buffer,H=H.buffer;case Lr:return!(O.byteLength!=H.byteLength||!pn(new nc(O),new nc(H)));case Yn:case Hr:case In:return at(+O,+H);case Ir:return O.name==H.name&&O.message==H.message;case $i:case Br:return O==H+"";case Kr:var Cr=hl;case Hi:if(Cr||(Cr=V),O.size!=H.size&&!(1&Ke))return!1;var oo=er.get(O);if(oo)return oo==H;Ke|=2,er.set(O,H);var io=id(Cr(O),Cr(H),Ke,kt,pn,er);return er.delete(O),io;case On:if(Qa)return Qa.call(O)==Qa.call(H)}return!1}(O,H,Xr,pe,Ke,kt,pn);if(!(1&pe)){var aa=io&&Xs.call(O,"__wrapped__"),Ba=vo&&Xs.call(H,"__wrapped__");if(aa||Ba){var Nl=aa?O.value():O,Ya=Ba?H.value():H;return pn||(pn=new Ll),kt(Nl,Ya,pe,Ke,pn)}}return!!hs&&(pn||(pn=new Ll),function(O,H,pe,Ke,kt,pn){var er=1&pe,Cr=i_(O),Xr=Cr.length;if(Xr!=i_(H).length&&!er)return!1;for(var vo=Xr;vo--;){var hs=Cr[vo];if(!(er?hs in H:Xs.call(H,hs)))return!1}var aa=pn.get(O),Ba=pn.get(H);if(aa&&Ba)return aa==H&&Ba==O;var Nl=!0;pn.set(O,H),pn.set(H,O);for(var Ya=er;++vo<Xr;){var lu=O[hs=Cr[vo]],yu=H[hs];if(Ke)var wp=er?Ke(yu,lu,hs,H,O,pn):Ke(lu,yu,hs,O,H,pn);if(!(wp===u?lu===yu||kt(lu,yu,pe,Ke,pn):wp)){Nl=!1;break}Ya||(Ya="constructor"==hs)}if(Nl&&!Ya){var ip=O.constructor,xp=H.constructor;ip!=xp&&"constructor"in O&&"constructor"in H&&!("function"==typeof ip&&ip instanceof ip&&"function"==typeof xp&&xp instanceof xp)&&(Nl=!1)}return pn.delete(O),pn.delete(H),Nl}(O,H,pe,Ke,kt,pn))}(O,H,pe,Ke,mu,kt))}function gf(O,H,pe,Ke){var kt=pe.length,pn=kt,er=!Ke;if(null==O)return!pn;for(O=Ks(O);kt--;){var Cr=pe[kt];if(er&&Cr[2]?Cr[1]!==O[Cr[0]]:!(Cr[0]in O))return!1}for(;++kt<pn;){var Xr=(Cr=pe[kt])[0],oo=O[Xr],io=Cr[1];if(er&&Cr[2]){if(oo===u&&!(Xr in O))return!1}else{var vo=new Ll;if(Ke)var hs=Ke(oo,io,Xr,O,H,vo);if(!(hs===u?mu(io,oo,3,Ke,vo):hs))return!1}}return!0}function Ga(O){return!(!Zu(O)||function(O){return!!vn&&vn in O}(O))&&(ef(O)?ds:yr).test(Rf(O))}function bt(O){return"function"==typeof O?O:null==O?Nf:"object"==typeof O?li(O)?ia(O[0],O[1]):xa(O):fy(O)}function Qt(O){if(!Ud(O))return fc(O);var H=[];for(var pe in Ks(O))Xs.call(O,pe)&&"constructor"!=pe&&H.push(pe);return H}function vi(O,H){return O<H}function ps(O,H){var pe=-1,Ke=Qo(O)?gr(O.length):[];return de(O,function(kt,pn,er){Ke[++pe]=H(kt,pn,er)}),Ke}function xa(O){var H=ah(O);return 1==H.length&&H[0][2]?a_(H[0][0],H[0][1]):function(pe){return pe===O||gf(pe,O,H)}}function ia(O,H){return Ph(O)&&yf(H)?a_(Uc(O),H):function(pe){var Ke=S1(pe,O);return Ke===u&&Ke===H?wg(pe,O):mu(H,Ke,3)}}function _l(O,H,pe,Ke,kt){O!==H&&Jt(H,function(pn,er){if(kt||(kt=new Ll),Zu(pn))!function(O,H,pe,Ke,kt,pn,er){var Cr=lh(O,pe),Xr=lh(H,pe),oo=er.get(Xr);if(oo)hc(O,pe,oo);else{var io=pn?pn(Cr,Xr,pe+"",O,H,er):u,vo=io===u;if(vo){var hs=li(Xr),aa=!hs&&Tu(Xr),Ba=!hs&&!aa&&km(Xr);io=Xr,hs||aa||Ba?li(Cr)?io=Cr:ws(Cr)?io=gi(Cr):aa?(vo=!1,io=k_(Xr,!0)):Ba?(vo=!1,io=q(Xr,!0)):io=[]:vv(Xr)||hr(Xr)?(io=Cr,hr(Cr)?io=Db(Cr):(!Zu(Cr)||ef(Cr))&&(io=ep(Xr))):vo=!1}vo&&(er.set(Xr,io),kt(io,Xr,Ke,pn,er),er.delete(Xr)),hc(O,pe,io)}}(O,H,er,pe,_l,Ke,kt);else{var Cr=Ke?Ke(lh(O,er),pn,er+"",O,H,kt):u;Cr===u&&(Cr=pn),hc(O,er,Cr)}},Md)}function Wc(O,H){var pe=O.length;if(pe)return od(H+=H<0?pe:0,pe)?O[H]:u}function Kf(O,H,pe){H=H.length?Ms(H,function(pn){return li(pn)?function(er){return Ni(er,1===pn.length?pn[0]:pn)}:pn}):[Nf];var Ke=-1;return H=Ms(H,bu(Ps())),function(Ln,Mr){var gr=Ln.length;for(Ln.sort(function(pn,er){return function(O,H,pe){for(var Ke=-1,kt=O.criteria,pn=H.criteria,er=kt.length,Cr=pe.length;++Ke<er;){var Xr=Fe(kt[Ke],pn[Ke]);if(Xr)return Ke>=Cr?Xr:Xr*("desc"==pe[Ke]?-1:1)}return O.index-H.index}(pn,er,pe)});gr--;)Ln[gr]=Ln[gr].value;return Ln}(ps(O,function(pn,er,Cr){return{criteria:Ms(H,function(oo){return oo(pn)}),index:++Ke,value:pn}}))}function $p(O,H,pe){for(var Ke=-1,kt=H.length,pn={};++Ke<kt;){var er=H[Ke],Cr=Ni(O,er);pe(Cr,er)&&Hf(pn,Bf(er,O),Cr)}return pn}function mf(O,H,pe,Ke){var kt=Ke?Mu:Pc,pn=-1,er=H.length,Cr=O;for(O===H&&(H=gi(H)),pe&&(Cr=Ms(O,bu(pe)));++pn<er;)for(var Xr=0,oo=H[pn],io=pe?pe(oo):oo;(Xr=kt(Cr,io,Xr,Ke))>-1;)Cr!==O&&Be.call(Cr,Xr,1),Be.call(O,Xr,1);return O}function $f(O,H){for(var pe=O?H.length:0,Ke=pe-1;pe--;){var kt=H[pe];if(pe==Ke||kt!==pn){var pn=kt;od(kt)?Be.call(O,kt,1):wh(O,kt)}}return O}function dd(O,H){return O+Go(Ha()*(H-O+1))}function fp(O,H){var pe="";if(!O||H<1||H>st)return pe;do{H%2&&(pe+=O),(H=Go(H/2))&&(O+=O)}while(H);return pe}function fl(O,H){return Df(fd(O,H,Nf),O+"")}function Kh(O){return Wl(Bm(O))}function F_(O,H){var pe=Bm(O);return ch(pe,$c(H,0,pe.length))}function Hf(O,H,pe,Ke){if(!Zu(O))return O;for(var kt=-1,pn=(H=Bf(H,O)).length,er=pn-1,Cr=O;null!=Cr&&++kt<pn;){var Xr=Uc(H[kt]),oo=pe;if("__proto__"===Xr||"constructor"===Xr||"prototype"===Xr)return O;if(kt!=er){var io=Cr[Xr];(oo=Ke?Ke(io,Xr,Cr):u)===u&&(oo=Zu(io)?io:od(H[kt+1])?[]:{})}gu(Cr,Xr,oo),Cr=Cr[Xr]}return O}var kd=Qd?function(O,H){return Qd.set(O,H),O}:Nf,Uf=yt?function(O,H){return yt(O,"toString",{configurable:!0,enumerable:!1,value:uy(H),writable:!0})}:Nf;function Kp(O){return ch(Bm(O))}function Ed(O,H,pe){var Ke=-1,kt=O.length;H<0&&(H=-H>kt?0:kt+H),(pe=pe>kt?kt:pe)<0&&(pe+=kt),kt=H>pe?0:pe-H>>>0,H>>>=0;for(var pn=gr(kt);++Ke<kt;)pn[Ke]=O[Ke+H];return pn}function Ah(O,H){var pe;return de(O,function(Ke,kt,pn){return!(pe=H(Ke,kt,pn))}),!!pe}function qp(O,H,pe){var Ke=0,kt=null==O?Ke:O.length;if("number"==typeof H&&H==H&&kt<=2147483647){for(;Ke<kt;){var pn=Ke+kt>>>1,er=O[pn];null!==er&&!Ef(er)&&(pe?er<=H:er<H)?Ke=pn+1:kt=pn}return kt}return eh(O,H,Nf,pe)}function eh(O,H,pe,Ke){var kt=0,pn=null==O?0:O.length;if(0===pn)return 0;for(var er=(H=pe(H))!=H,Cr=null===H,Xr=Ef(H),oo=H===u;kt<pn;){var io=Go((kt+pn)/2),vo=pe(O[io]),hs=vo!==u,aa=null===vo,Ba=vo==vo,Nl=Ef(vo);if(er)var Ya=Ke||Ba;else Ya=oo?Ba&&(Ke||hs):Cr?Ba&&hs&&(Ke||!aa):Xr?Ba&&hs&&!aa&&(Ke||!Nl):!aa&&!Nl&&(Ke?vo<=H:vo<H);Ya?kt=io+1:pn=io}return wl(pn,4294967294)}function Oh(O,H){for(var pe=-1,Ke=O.length,kt=0,pn=[];++pe<Ke;){var er=O[pe],Cr=H?H(er):er;if(!pe||!at(Cr,Xr)){var Xr=Cr;pn[kt++]=0===er?0:er}}return pn}function th(O){return"number"==typeof O?O:Ef(O)?NaN:+O}function Td(O){if("string"==typeof O)return O;if(li(O))return Ms(O,Td)+"";if(Ef(O))return Wu?Wu.call(O):"";var H=O+"";return"0"==H&&1/O==-Zt?"-0":H}function xf(O,H,pe){var Ke=-1,kt=Es,pn=O.length,er=!0,Cr=[],Xr=Cr;if(pe)er=!1,kt=vs;else if(pn>=200){var oo=H?null:Rh(O);if(oo)return V(oo);er=!1,kt=Gs,Xr=new ql}else Xr=H?[]:Cr;e:for(;++Ke<pn;){var io=O[Ke],vo=H?H(io):io;if(io=pe||0!==io?io:0,er&&vo==vo){for(var hs=Xr.length;hs--;)if(Xr[hs]===vo)continue e;H&&Xr.push(vo),Cr.push(io)}else kt(Xr,vo,pe)||(Xr!==Cr&&Xr.push(vo),Cr.push(io))}return Cr}function wh(O,H){return null==(O=bf(O,H=Bf(H,O)))||delete O[Uc(Qc(H))]}function Up(O,H,pe,Ke){return Hf(O,H,pe(Ni(O,H)),Ke)}function nh(O,H,pe,Ke){for(var kt=O.length,pn=Ke?kt:-1;(Ke?pn--:++pn<kt)&&H(O[pn],pn,O););return pe?Ed(O,Ke?0:pn,Ke?pn+1:kt):Ed(O,Ke?pn+1:0,Ke?kt:pn)}function xh(O,H){var pe=O;return pe instanceof rl&&(pe=pe.value()),uu(H,function(Ke,kt){return kt.func.apply(kt.thisArg,Ma([Ke],kt.args))},pe)}function vf(O,H,pe){var Ke=O.length;if(Ke<2)return Ke?xf(O[0]):[];for(var kt=-1,pn=gr(Ke);++kt<Ke;)for(var er=O[kt],Cr=-1;++Cr<Ke;)Cr!=kt&&(pn[kt]=K(pn[kt]||er,O[Cr],H,pe));return xf(vt(pn,1),H,pe)}function Dh(O,H,pe){for(var Ke=-1,kt=O.length,pn=H.length,er={};++Ke<kt;)pe(er,O[Ke],Ke<pn?H[Ke]:u);return er}function $d(O){return ws(O)?O:[]}function pp(O){return"function"==typeof O?O:Nf}function Bf(O,H){return li(O)?O:Ph(O,H)?[O]:u_(ju(O))}var Kd=fl;function oc(O,H,pe){var Ke=O.length;return pe=pe===u?Ke:pe,!H&&pe>=Ke?O:Ed(O,H,pe)}var rh=qt||function(O){return Hl.clearTimeout(O)};function k_(O,H){if(H)return O.slice();var pe=O.length,Ke=df?df(pe):new O.constructor(pe);return O.copy(Ke),Ke}function qh(O){var H=new O.constructor(O.byteLength);return new nc(H).set(new nc(O)),H}function q(O,H){var pe=H?qh(O.buffer):O.buffer;return new O.constructor(pe,O.byteOffset,O.length)}function Fe(O,H){if(O!==H){var pe=O!==u,Ke=null===O,kt=O==O,pn=Ef(O),er=H!==u,Cr=null===H,Xr=H==H,oo=Ef(H);if(!Cr&&!oo&&!pn&&O>H||pn&&er&&Xr&&!Cr&&!oo||Ke&&er&&Xr||!pe&&Xr||!kt)return 1;if(!Ke&&!pn&&!oo&&O<H||oo&&pe&&kt&&!Ke&&!pn||Cr&&pe&&kt||!er&&kt||!Xr)return-1}return 0}function Xn(O,H,pe,Ke){for(var kt=-1,pn=O.length,er=pe.length,Cr=-1,Xr=H.length,oo=va(pn-er,0),io=gr(Xr+oo),vo=!Ke;++Cr<Xr;)io[Cr]=H[Cr];for(;++kt<er;)(vo||kt<pn)&&(io[pe[kt]]=O[kt]);for(;oo--;)io[Cr++]=O[kt++];return io}function Fr(O,H,pe,Ke){for(var kt=-1,pn=O.length,er=-1,Cr=pe.length,Xr=-1,oo=H.length,io=va(pn-Cr,0),vo=gr(io+oo),hs=!Ke;++kt<io;)vo[kt]=O[kt];for(var aa=kt;++Xr<oo;)vo[aa+Xr]=H[Xr];for(;++er<Cr;)(hs||kt<pn)&&(vo[aa+pe[er]]=O[kt++]);return vo}function gi(O,H){var pe=-1,Ke=O.length;for(H||(H=gr(Ke));++pe<Ke;)H[pe]=O[pe];return H}function Wi(O,H,pe,Ke){var kt=!pe;pe||(pe={});for(var pn=-1,er=H.length;++pn<er;){var Cr=H[pn],Xr=Ke?Ke(pe[Cr],O[Cr],Cr,pe,O):u;Xr===u&&(Xr=O[Cr]),kt?Sl(pe,Cr,Xr):gu(pe,Cr,Xr)}return pe}function ts(O,H){return function(pe,Ke){var kt=li(pe)?De:Fc,pn=H?H():{};return kt(pe,O,Ps(Ke,2),pn)}}function Is(O){return fl(function(H,pe){var Ke=-1,kt=pe.length,pn=kt>1?pe[kt-1]:u,er=kt>2?pe[2]:u;for(pn=O.length>3&&"function"==typeof pn?(kt--,pn):u,er&&gc(pe[0],pe[1],er)&&(pn=kt<3?u:pn,kt=1),H=Ks(H);++Ke<kt;){var Cr=pe[Ke];Cr&&O(H,Cr,Ke,pn)}return H})}function ya(O,H){return function(pe,Ke){if(null==pe)return pe;if(!Qo(pe))return O(pe,Ke);for(var kt=pe.length,pn=H?kt:-1,er=Ks(pe);(H?pn--:++pn<kt)&&!1!==Ke(er[pn],pn,er););return pe}}function zs(O){return function(H,pe,Ke){for(var kt=-1,pn=Ks(H),er=Ke(H),Cr=er.length;Cr--;){var Xr=er[O?Cr:++kt];if(!1===pe(pn[Xr],Xr,pn))break}return H}}function rd(O){return function(H){var pe=fa(H=ju(H))?un(H):u,Ke=pe?pe[0]:H.charAt(0),kt=pe?oc(pe,1).join(""):H.slice(1);return Ke[O]()+kt}}function wu(O){return function(H){return uu(zb(X0(H).replace(ne,"")),O,"")}}function Hd(O){return function(){var H=arguments;switch(H.length){case 0:return new O;case 1:return new O(H[0]);case 2:return new O(H[0],H[1]);case 3:return new O(H[0],H[1],H[2]);case 4:return new O(H[0],H[1],H[2],H[3]);case 5:return new O(H[0],H[1],H[2],H[3],H[4]);case 6:return new O(H[0],H[1],H[2],H[3],H[4],H[5]);case 7:return new O(H[0],H[1],H[2],H[3],H[4],H[5],H[6])}var pe=Mc(O.prototype),Ke=O.apply(pe,H);return Zu(Ke)?Ke:pe}}function ih(O){return function(H,pe,Ke){var kt=Ks(H);if(!Qo(H)){var pn=Ps(pe,3);H=nf(H),pe=function(Cr){return pn(kt[Cr],Cr,kt)}}var er=O(H,pe,Ke);return er>-1?kt[pn?H[er]:er]:u}}function oh(O){return gp(function(H){var pe=H.length,Ke=pe,kt=Pu.prototype.thru;for(O&&H.reverse();Ke--;){var pn=H[Ke];if("function"!=typeof pn)throw new zl(_);if(kt&&!er&&"wrapper"==Hc(pn))var er=new Pu([],!0)}for(Ke=er?Ke:pe;++Ke<pe;){var Cr=Hc(pn=H[Ke]),Xr="wrapper"==Cr?Ta(pn):u;er=Xr&&Lh(Xr[0])&&424==Xr[1]&&!Xr[4].length&&1==Xr[9]?er[Hc(Xr[0])].apply(er,Xr[3]):1==pn.length&&Lh(pn)?er[Cr]():er.thru(pn)}return function(){var oo=arguments,io=oo[0];if(er&&1==oo.length&&li(io))return er.plant(io).value();for(var vo=0,hs=pe?H[vo].apply(this,oo):io;++vo<pe;)hs=H[vo].call(this,hs);return hs}})}function hp(O,H,pe,Ke,kt,pn,er,Cr,Xr,oo){var io=128&H,vo=1&H,hs=2&H,aa=24&H,Ba=512&H,Nl=hs?u:Hd(O);return function Ya(){for(var lu=arguments.length,yu=gr(lu),wp=lu;wp--;)yu[wp]=arguments[wp];if(aa)var ip=Ju(Ya),xp=Yo(yu,ip);if(Ke&&(yu=Xn(yu,Ke,kt,aa)),pn&&(yu=Fr(yu,pn,er,aa)),lu-=xp,aa&&lu<oo){var pd=Hs(yu,ip);return B_(O,H,hp,Ya.placeholder,pe,yu,pd,Cr,Xr,oo-lu)}var Dp=vo?pe:this,gh=hs?Dp[O]:O;return lu=yu.length,Cr?yu=Gf(yu,Cr):Ba&&lu>1&&yu.reverse(),io&&Xr<lu&&(yu.length=Xr),this&&this!==Hl&&this instanceof Ya&&(gh=Nl||Hd(gh)),gh.apply(Dp,yu)}}function Yf(O,H){return function(pe,Ke){return function(O,H,pe,Ke){return Rn(O,function(kt,pn,er){H(Ke,pe(kt),pn,er)}),Ke}(pe,O,H(Ke),{})}}function H_(O,H){return function(pe,Ke){var kt;if(pe===u&&Ke===u)return H;if(pe!==u&&(kt=pe),Ke!==u){if(kt===u)return Ke;"string"==typeof pe||"string"==typeof Ke?(pe=Td(pe),Ke=Td(Ke)):(pe=th(pe),Ke=th(Ke)),kt=O(pe,Ke)}return kt}}function _g(O){return gp(function(H){return H=Ms(H,bu(Ps())),fl(function(pe){var Ke=this;return O(H,function(kt){return Me(kt,Ke,pe)})})})}function _p(O,H){var pe=(H=H===u?" ":Td(H)).length;if(pe<2)return pe?fp(H,O):H;var Ke=fp(H,yi(O/lt(H)));return fa(H)?oc(un(Ke),0,O).join(""):Ke.slice(0,O)}function U_(O){return function(H,pe,Ke){return Ke&&"number"!=typeof Ke&&gc(H,pe,Ke)&&(pe=Ke=u),H=y_(H),pe===u?(pe=H,H=0):pe=y_(pe),function(O,H,pe,Ke){for(var kt=-1,pn=va(yi((H-O)/(pe||1)),0),er=gr(pn);pn--;)er[Ke?pn:++kt]=O,O+=pe;return er}(H,pe,Ke=Ke===u?H<pe?1:-1:y_(Ke),O)}}function e_(O){return function(H,pe){return"string"==typeof H&&"string"==typeof pe||(H=zf(H),pe=zf(pe)),O(H,pe)}}function B_(O,H,pe,Ke,kt,pn,er,Cr,Xr,oo){var io=8&H;H|=io?32:64,4&(H&=~(io?64:32))||(H&=-4);var Nl=[O,H,kt,io?pn:u,io?er:u,io?u:pn,io?u:er,Cr,Xr,oo],Ya=pe.apply(u,Nl);return Lh(O)&&sd(Ya,Nl),Ya.placeholder=Ke,tp(Ya,O,H)}function Jc(O){var H=El[O];return function(pe,Ke){if(pe=zf(pe),(Ke=null==Ke?0:wl($l(Ke),292))&&Oa(pe)){var kt=(ju(pe)+"e").split("e");return+((kt=(ju(H(kt[0]+"e"+(+kt[1]+Ke)))+"e").split("e"))[0]+"e"+(+kt[1]-Ke))}return H(pe)}}var Rh=Tc&&1/V(new Tc([,-0]))[1]==Zt?function(O){return new Tc(O)}:ng;function t_(O){return function(H){var pe=Dc(H);return pe==Kr?hl(H):pe==Hi?function(Ln){var Mr=-1,gr=Array(Ln.size);return Ln.forEach(function(co){gr[++Mr]=[co,co]}),gr}(H):function(Ln,Mr){return Ms(Mr,function(gr){return[gr,Ln[gr]]})}(H,O(H))}}function qf(O,H,pe,Ke,kt,pn,er,Cr){var Xr=2&H;if(!Xr&&"function"!=typeof O)throw new zl(_);var oo=Ke?Ke.length:0;if(oo||(H&=-97,Ke=kt=u),er=er===u?er:va($l(er),0),Cr=Cr===u?Cr:$l(Cr),oo-=kt?kt.length:0,64&H){var io=Ke,vo=kt;Ke=kt=u}var hs=Xr?u:Ta(O),aa=[O,H,pe,Ke,kt,io,vo,pn,er,Cr];if(hs&&function(O,H){var pe=O[1],Ke=H[1],kt=pe|Ke;if(!(kt<131||(128==Ke&&8==pe||128==Ke&&256==pe&&O[7].length<=H[8]||384==Ke&&H[7].length<=H[8]&&8==pe)))return O;1&Ke&&(O[2]=H[2],kt|=1&pe?0:4);var Cr=H[3];if(Cr){var Xr=O[3];O[3]=Xr?Xn(Xr,Cr,H[4]):Cr,O[4]=Xr?Hs(O[3],R):H[4]}(Cr=H[5])&&(O[5]=(Xr=O[5])?Fr(Xr,Cr,H[6]):Cr,O[6]=Xr?Hs(O[5],R):H[6]),(Cr=H[7])&&(O[7]=Cr),128&Ke&&(O[8]=null==O[8]?H[8]:wl(O[8],H[8])),null==O[9]&&(O[9]=H[9]),O[0]=H[0],O[1]=kt}(aa,hs),O=aa[0],H=aa[1],pe=aa[2],Ke=aa[3],kt=aa[4],!(Cr=aa[9]=aa[9]===u?Xr?0:O.length:va(aa[9]-oo,0))&&24&H&&(H&=-25),H&&1!=H)Ba=8==H||16==H?function(O,H,pe){var Ke=Hd(O);return function kt(){for(var pn=arguments.length,er=gr(pn),Cr=pn,Xr=Ju(kt);Cr--;)er[Cr]=arguments[Cr];var oo=pn<3&&er[0]!==Xr&&er[pn-1]!==Xr?[]:Hs(er,Xr);return(pn-=oo.length)<pe?B_(O,H,hp,kt.placeholder,u,er,oo,u,u,pe-pn):Me(this&&this!==Hl&&this instanceof kt?Ke:O,this,er)}}(O,H,Cr):32!=H&&33!=H||kt.length?hp.apply(u,aa):function(O,H,pe,Ke){var kt=1&H,pn=Hd(O);return function er(){for(var Cr=-1,Xr=arguments.length,oo=-1,io=Ke.length,vo=gr(io+Xr),hs=this&&this!==Hl&&this instanceof er?pn:O;++oo<io;)vo[oo]=Ke[oo];for(;Xr--;)vo[oo++]=arguments[++Cr];return Me(hs,kt?pe:this,vo)}}(O,H,pe,Ke);else var Ba=function(O,H,pe){var Ke=1&H,kt=Hd(O);return function pn(){return(this&&this!==Hl&&this instanceof pn?kt:O).apply(Ke?pe:this,arguments)}}(O,H,pe);return tp((hs?kd:sd)(Ba,aa),O,H)}function n_(O,H,pe,Ke){return O===u||at(O,_a[pe])&&!Xs.call(Ke,pe)?H:O}function sh(O,H,pe,Ke,kt,pn){return Zu(O)&&Zu(H)&&(pn.set(H,O),_l(O,H,u,sh,pn),pn.delete(H)),O}function r_(O){return vv(O)?u:O}function id(O,H,pe,Ke,kt,pn){var er=1&pe,Cr=O.length,Xr=H.length;if(Cr!=Xr&&!(er&&Xr>Cr))return!1;var oo=pn.get(O),io=pn.get(H);if(oo&&io)return oo==H&&io==O;var vo=-1,hs=!0,aa=2&pe?new ql:u;for(pn.set(O,H),pn.set(H,O);++vo<Cr;){var Ba=O[vo],Nl=H[vo];if(Ke)var Ya=er?Ke(Nl,Ba,vo,H,O,pn):Ke(Ba,Nl,vo,O,H,pn);if(Ya!==u){if(Ya)continue;hs=!1;break}if(aa){if(!Pl(H,function(lu,yu){if(!Gs(aa,yu)&&(Ba===lu||kt(Ba,lu,pe,Ke,pn)))return aa.push(yu)})){hs=!1;break}}else if(Ba!==Nl&&!kt(Ba,Nl,pe,Ke,pn)){hs=!1;break}}return pn.delete(O),pn.delete(H),hs}function gp(O){return Df(fd(O,u,z_),O+"")}function i_(O){return Vo(O,nf,Bp)}function o_(O){return Vo(O,Md,Zf)}var Ta=Qd?function(O){return Qd.get(O)}:ng;function Hc(O){for(var H=O.name+"",pe=Gc[H],Ke=Xs.call(Gc,H)?pe.length:0;Ke--;){var kt=pe[Ke],pn=kt.func;if(null==pn||pn==O)return kt.name}return H}function Ju(O){return(Xs.call(tn,"placeholder")?tn:O).placeholder}function Ps(){var O=tn.iteratee||R1;return O=O===R1?bt:O,arguments.length?O(arguments[0],arguments[1]):O}function mp(O,H){var pe=O.__data__;return function(O){var H=typeof O;return"string"==H||"number"==H||"symbol"==H||"boolean"==H?"__proto__"!==O:null===O}(H)?pe["string"==typeof H?"string":"hash"]:pe.map}function ah(O){for(var H=nf(O),pe=H.length;pe--;){var Ke=H[pe],kt=O[Ke];H[pe]=[Ke,kt,yf(kt)]}return H}function Yu(O,H){var pe=function(Ln,Mr){return null==Ln?u:Ln[Mr]}(O,H);return Ga(pe)?pe:u}var Bp=ka?function(O){return null==O?[]:(O=Ks(O),Jo(ka(O),function(H){return Wd.call(O,H)}))}:rf,Zf=ka?function(O){for(var H=[];O;)Ma(H,Bp(O)),O=ul(O);return H}:rf,Dc=$o;function j_(O,H,pe){for(var Ke=-1,kt=(H=Bf(H,O)).length,pn=!1;++Ke<kt;){var er=Uc(H[Ke]);if(!(pn=null!=O&&pe(O,er)))break;O=O[er]}return pn||++Ke!=kt?pn:!!(kt=null==O?0:O.length)&&Op(kt)&&od(er,kt)&&(li(O)||hr(O))}function ep(O){return"function"!=typeof O.constructor||Ud(O)?{}:Mc(ul(O))}function G_(O){return li(O)||hr(O)||!!(Pe&&O&&O[Pe])}function od(O,H){var pe=typeof O;return!!(H=null==H?st:H)&&("number"==pe||"symbol"!=pe&&ri.test(O))&&O>-1&&O%1==0&&O<H}function gc(O,H,pe){if(!Zu(pe))return!1;var Ke=typeof H;return!!("number"==Ke?Qo(pe)&&od(H,pe.length):"string"==Ke&&H in pe)&&at(pe[H],O)}function Ph(O,H){if(li(O))return!1;var pe=typeof O;return!("number"!=pe&&"symbol"!=pe&&"boolean"!=pe&&null!=O&&!Ef(O))||Wn.test(O)||!mn.test(O)||null!=H&&O in Ks(H)}function Lh(O){var H=Hc(O),pe=tn[H];if("function"!=typeof pe||!(H in rl.prototype))return!1;if(O===pe)return!0;var Ke=Ta(pe);return!!Ke&&O===Ke[0]}(Of&&Dc(new Of(new ArrayBuffer(1)))!=Vn||Dd&&Dc(new Dd)!=Kr||Jd&&Dc(Jd.resolve())!=Ur||Tc&&Dc(new Tc)!=Hi||Vu&&Dc(new Vu)!=Jn)&&(Dc=function(O){var H=$o(O),pe=H==Zr?O.constructor:u,Ke=pe?Rf(pe):"";if(Ke)switch(Ke){case Ff:return Vn;case zu:return Kr;case Tl:return Ur;case xl:return Hi;case kl:return Jn}return H});var jf=ll?ef:E_;function Ud(O){var H=O&&O.constructor;return O===("function"==typeof H&&H.prototype||_a)}function yf(O){return O==O&&!Zu(O)}function a_(O,H){return function(pe){return null!=pe&&pe[O]===H&&(H!==u||O in Ks(pe))}}function fd(O,H,pe){return H=va(H===u?O.length-1:H,0),function(){for(var Ke=arguments,kt=-1,pn=va(Ke.length-H,0),er=gr(pn);++kt<pn;)er[kt]=Ke[H+kt];kt=-1;for(var Cr=gr(H+1);++kt<H;)Cr[kt]=Ke[kt];return Cr[H]=pe(er),Me(O,this,Cr)}}function bf(O,H){return H.length<2?O:Ni(O,Ed(H,0,-1))}function Gf(O,H){for(var pe=O.length,Ke=wl(H.length,pe),kt=gi(O);Ke--;){var pn=H[Ke];O[Ke]=od(pn,pe)?kt[pn]:u}return O}function lh(O,H){if(("constructor"!==H||"function"!=typeof O[H])&&"__proto__"!=H)return O[H]}var sd=V_(kd),uh=qn||function(O,H){return Hl.setTimeout(O,H)},Df=V_(Uf);function tp(O,H,pe){var Ke=H+"";return Df(O,function(O,H){var pe=H.length;if(!pe)return O;var Ke=pe-1;return H[Ke]=(pe>1?"& ":"")+H[Ke],H=H.join(pe>2?", ":" "),O.replace(yo,"{\n/* [wrapped with "+H+"] */\n")}(Ke,function(O,H){return Tt(mt,function(pe){var Ke="_."+pe[0];H&pe[1]&&!Es(O,Ke)&&O.push(Ke)}),O.sort()}(function(O){var H=O.match(Mo);return H?H[1].split(Vi):[]}(Ke),pe)))}function V_(O){var H=0,pe=0;return function(){var Ke=tl(),kt=16-(Ke-pe);if(pe=Ke,kt>0){if(++H>=800)return arguments[0]}else H=0;return O.apply(u,arguments)}}function ch(O,H){var pe=-1,Ke=O.length,kt=Ke-1;for(H=H===u?Ke:H;++pe<H;){var pn=dd(pe,kt),er=O[pn];O[pn]=O[pe],O[pe]=er}return O.length=H,O}var H,pe,u_=(H=Og(function(O){var H=[];return 46===O.charCodeAt(0)&&H.push(""),O.replace(kn,function(pe,Ke,kt,pn){H.push(kt?pn.replace(So,"$1"):Ke||pe)}),H},function(Ke){return 500===pe.size&&pe.clear(),Ke}),pe=H.cache,H);function Uc(O){if("string"==typeof O||Ef(O))return O;var H=O+"";return"0"==H&&1/O==-Zt?"-0":H}function Rf(O){if(null!=O){try{return Ul.call(O)}catch(H){}try{return O+""}catch(H){}}return""}function vg(O){if(O instanceof rl)return O.clone();var H=new Pu(O.__wrapped__,O.__chain__);return H.__actions__=gi(O.__actions__),H.__index__=O.__index__,H.__values__=O.__values__,H}var Mm=fl(function(O,H){return ws(O)?K(O,vt(H,1,ws,!0)):[]}),d_=fl(function(O,H){var pe=Qc(H);return ws(pe)&&(pe=u),ws(O)?K(O,vt(H,1,ws,!0),Ps(pe,2)):[]}),Yp=fl(function(O,H){var pe=Qc(H);return ws(pe)&&(pe=u),ws(O)?K(O,vt(H,1,ws,!0),u,pe):[]});function Eg(O,H,pe){var Ke=null==O?0:O.length;if(!Ke)return-1;var kt=null==pe?0:$l(pe);return kt<0&&(kt=va(Ke+kt,0)),Ec(O,Ps(H,3),kt)}function kg(O,H,pe){var Ke=null==O?0:O.length;if(!Ke)return-1;var kt=Ke-1;return pe!==u&&(kt=$l(pe),kt=pe<0?va(Ke+kt,0):wl(kt,Ke-1)),Ec(O,Ps(H,3),kt,!0)}function z_(O){return null!=O&&O.length?vt(O,1):[]}function W_(O){return O&&O.length?O[0]:u}var Tg=fl(function(O){var H=Ms(O,$d);return H.length&&H[0]===O[0]?sa(H):[]}),Hg=fl(function(O){var H=Qc(O),pe=Ms(O,$d);return H===Qc(pe)?H=u:pe.pop(),pe.length&&pe[0]===O[0]?sa(pe,Ps(H,2)):[]}),Tp=fl(function(O){var H=Qc(O),pe=Ms(O,$d);return(H="function"==typeof H?H:u)&&pe.pop(),pe.length&&pe[0]===O[0]?sa(pe,u,H):[]});function Qc(O){var H=null==O?0:O.length;return H?O[H-1]:u}var $h=fl(Sg);function Sg(O,H){return O&&O.length&&H&&H.length?mf(O,H):O}var h_=gp(function(O,H){var pe=null==O?0:O.length,Ke=kc(O,H);return $f(O,Ms(H,function(kt){return od(kt,pe)?+kt:kt}).sort(Fe)),Ke});function __(O){return null==O?O:nl.call(O)}var We=fl(function(O){return xf(vt(O,1,ws,!0))}),Rt=fl(function(O){var H=Qc(O);return ws(H)&&(H=u),xf(vt(O,1,ws,!0),Ps(H,2))}),rn=fl(function(O){var H=Qc(O);return H="function"==typeof H?H:u,xf(vt(O,1,ws,!0),u,H)});function fs(O){if(!O||!O.length)return[];var H=0;return O=Jo(O,function(pe){if(ws(pe))return H=va(pe.length,H),!0}),ku(H,function(pe){return Ms(O,tc(pe))})}function Ua(O,H){if(!O||!O.length)return[];var pe=fs(O);return null==H?pe:Ms(pe,function(Ke){return Me(H,u,Ke)})}var mo=fl(function(O,H){return ws(O)?K(O,H):[]}),_o=fl(function(O){return vf(Jo(O,ws))}),La=fl(function(O){var H=Qc(O);return ws(H)&&(H=u),vf(Jo(O,ws),Ps(H,2))}),Sa=fl(function(O){var H=Qc(O);return H="function"==typeof H?H:u,vf(Jo(O,ws),u,H)}),ti=fl(fs),Bi=fl(function(O){var H=O.length,pe=H>1?O[H-1]:u;return pe="function"==typeof pe?(O.pop(),pe):u,Ua(O,pe)});function ao(O){var H=tn(O);return H.__chain__=!0,H}function Os(O,H){return H(O)}var Xa=gp(function(O){var H=O.length,pe=H?O[0]:0,Ke=this.__wrapped__,kt=function(pn){return kc(pn,O)};return!(H>1||this.__actions__.length)&&Ke instanceof rl&&od(pe)?((Ke=Ke.slice(pe,+pe+(H?1:0))).__actions__.push({func:Os,args:[kt],thisArg:u}),new Pu(Ke,this.__chain__).thru(function(pn){return H&&!pn.length&&pn.push(u),pn})):this.thru(kt)}),sv=ts(function(O,H,pe){Xs.call(O,pe)?++O[pe]:Sl(O,pe,1)}),f1=ih(Eg),Mb=ih(kg);function uv(O,H){return(li(O)?Tt:de)(O,Ps(H,3))}function Dm(O,H){return(li(O)?dr:be)(O,Ps(H,3))}var mc=ts(function(O,H,pe){Xs.call(O,pe)?O[pe].push(H):Sl(O,pe,[H])}),Iu=fl(function(O,H,pe){var Ke=-1,kt="function"==typeof H,pn=Qo(O)?gr(O.length):[];return de(O,function(er){pn[++Ke]=kt?Me(H,er,pe):ol(er,H,pe)}),pn}),p1=ts(function(O,H,pe){Sl(O,pe,H)});function Rm(O,H){return(li(O)?Ms:ps)(O,Ps(H,3))}var es=ts(function(O,H,pe){O[pe?0:1].push(H)},function(){return[[],[]]}),pv=fl(function(O,H){if(null==O)return[];var pe=H.length;return pe>1&&gc(O,H[0],H[1])?H=[]:pe>2&&gc(H[0],H[1],H[2])&&(H=[H[0]]),Kf(O,vt(H,1),[])}),Q_=Un||function(){return Hl.Date.now()};function Bg(O,H,pe){return H=pe?u:H,qf(O,128,u,u,u,u,H=O&&null==H?O.length:H)}function hv(O,H){var pe;if("function"!=typeof H)throw new zl(_);return O=$l(O),function(){return--O>0&&(pe=H.apply(this,arguments)),O<=1&&(H=u),pe}}var Cp=fl(function(O,H,pe){var Ke=1;if(pe.length){var kt=Hs(pe,Ju(Cp));Ke|=32}return qf(O,Ke,H,pe,kt)}),Pm=fl(function(O,H,pe){var Ke=3;if(pe.length){var kt=Hs(pe,Ju(Pm));Ke|=32}return qf(H,Ke,O,pe,kt)});function Yg(O,H,pe){var Ke,kt,pn,er,Cr,Xr,oo=0,io=!1,vo=!1,hs=!0;if("function"!=typeof O)throw new zl(_);function aa(pd){var Dp=Ke,gh=kt;return Ke=kt=u,oo=pd,er=O.apply(gh,Dp)}function Ba(pd){return oo=pd,Cr=uh(lu,H),io?aa(pd):er}function Ya(pd){var Dp=pd-Xr;return Xr===u||Dp>=H||Dp<0||vo&&pd-oo>=pn}function lu(){var pd=Q_();if(Ya(pd))return yu(pd);Cr=uh(lu,function(pd){var gy=H-(pd-Xr);return vo?wl(gy,pn-(pd-oo)):gy}(pd))}function yu(pd){return Cr=u,hs&&Ke?aa(pd):(Ke=kt=u,er)}function xp(){var pd=Q_(),Dp=Ya(pd);if(Ke=arguments,kt=this,Xr=pd,Dp){if(Cr===u)return Ba(Xr);if(vo)return rh(Cr),Cr=uh(lu,H),aa(Xr)}return Cr===u&&(Cr=uh(lu,H)),er}return H=zf(H)||0,Zu(pe)&&(io=!!pe.leading,pn=(vo="maxWait"in pe)?va(zf(pe.maxWait)||0,H):pn,hs="trailing"in pe?!!pe.trailing:hs),xp.cancel=function(){Cr!==u&&rh(Cr),oo=0,Ke=Xr=kt=Cr=u},xp.flush=function(){return Cr===u?er:yu(Q_())},xp}var _1=fl(function(O,H){return k(O,1,H)}),gv=fl(function(O,H,pe){return k(O,zf(H)||0,pe)});function Og(O,H){if("function"!=typeof O||null!=H&&"function"!=typeof H)throw new zl(_);var pe=function(){var Ke=arguments,kt=H?H.apply(this,Ke):Ke[0],pn=pe.cache;if(pn.has(kt))return pn.get(kt);var er=O.apply(this,Ke);return pe.cache=pn.set(kt,er)||pn,er};return pe.cache=new(Og.Cache||Kl),pe}function Mp(O){if("function"!=typeof O)throw new zl(_);return function(){var H=arguments;switch(H.length){case 0:return!O.call(this);case 1:return!O.call(this,H[0]);case 2:return!O.call(this,H[0],H[1]);case 3:return!O.call(this,H[0],H[1],H[2])}return!O.apply(this,H)}}Og.Cache=Kl;var jh=Kd(function(O,H){var pe=(H=1==H.length&&li(H[0])?Ms(H[0],bu(Ps())):Ms(vt(H,1),bu(Ps()))).length;return fl(function(Ke){for(var kt=-1,pn=wl(Ke.length,pe);++kt<pn;)Ke[kt]=H[kt].call(this,Ke[kt]);return Me(O,this,Ke)})}),Gp=fl(function(O,H){var pe=Hs(H,Ju(Gp));return qf(O,32,u,H,pe)}),X_=fl(function(O,H){var pe=Hs(H,Ju(X_));return qf(O,64,u,H,pe)}),v_=gp(function(O,H){return qf(O,256,u,u,u,H)});function at(O,H){return O===H||O!=O&&H!=H}var Ft=e_(Vs),Gn=e_(function(O,H){return O>=H}),hr=Eu(function(){return arguments}())?Eu:function(O){return Rc(O)&&Xs.call(O,"callee")&&!Wd.call(O,"callee")},li=gr.isArray,Io=Cu?bu(Cu):function(O){return Rc(O)&&$o(O)==Lr};function Qo(O){return null!=O&&Op(O.length)&&!ef(O)}function ws(O){return Rc(O)&&Qo(O)}var Tu=ss||E_,tu=jl?bu(jl):function(O){return Rc(O)&&$o(O)==Hr};function K_(O){if(!Rc(O))return!1;var H=$o(O);return H==Ir||"[object DOMException]"==H||"string"==typeof O.message&&"string"==typeof O.name&&!vv(O)}function ef(O){if(!Zu(O))return!1;var H=$o(O);return H==wr||H==Qr||"[object AsyncFunction]"==H||"[object Proxy]"==H}function Xc(O){return"number"==typeof O&&O==$l(O)}function Op(O){return"number"==typeof O&&O>-1&&O%1==0&&O<=st}function Zu(O){var H=typeof O;return null!=O&&("object"==H||"function"==H)}function Rc(O){return null!=O&&"object"==typeof O}var L0=rt?bu(rt):function(O){return Rc(O)&&Dc(O)==Kr};function $0(O){return"number"==typeof O||Rc(O)&&$o(O)==In}function vv(O){if(!Rc(O)||$o(O)!=Zr)return!1;var H=ul(O);if(null===H)return!0;var pe=Xs.call(H,"constructor")&&H.constructor;return"function"==typeof pe&&pe instanceof pe&&Ul.call(pe)==nd}var yv=Nt?bu(Nt):function(O){return Rc(O)&&$o(O)==$i},H0=ct?bu(ct):function(O){return Rc(O)&&Dc(O)==Hi};function bv(O){return"string"==typeof O||!li(O)&&Rc(O)&&$o(O)==Br}function Ef(O){return"symbol"==typeof O||Rc(O)&&$o(O)==On}var km=Te?bu(Te):function(O){return Rc(O)&&Op(O.length)&&!!Ro[$o(O)]},yS=e_(vi),B0=e_(function(O,H){return O<=H});function b1(O){if(!O)return[];if(Qo(O))return bv(O)?un(O):gi(O);if(Ce&&O[Ce])return function(Ln){for(var Mr,gr=[];!(Mr=Ln.next()).done;)gr.push(Mr.value);return gr}(O[Ce]());var H=Dc(O);return(H==Kr?hl:H==Hi?V:Bm)(O)}function y_(O){return O?(O=zf(O))===Zt||O===-Zt?17976931348623157e292*(O<0?-1:1):O==O?O:0:0===O?O:0}function $l(O){var H=y_(O),pe=H%1;return H==H?pe?H-pe:H:0}function xb(O){return O?$c($l(O),0,Gt):0}function zf(O){if("number"==typeof O)return O;if(Ef(O))return NaN;if(Zu(O)){var H="function"==typeof O.valueOf?O.valueOf():O;O=Zu(H)?H+"":H}if("string"!=typeof O)return 0===O?O:+O;O=Au(O);var pe=cr.test(O);return pe||rr.test(O)?yc(O.slice(2),pe?2:8):Zn.test(O)?NaN:+O}function Db(O){return Wi(O,Md(O))}function ju(O){return null==O?"":Td(O)}var $m=Is(function(O,H){if(Ud(H)||Qo(H))Wi(H,nf(H),O);else for(var pe in H)Xs.call(H,pe)&&gu(O,pe,H[pe])}),Y0=Is(function(O,H){Wi(H,Md(H),O)}),Ev=Is(function(O,H,pe,Ke){Wi(H,Md(H),O,Ke)}),Rb=Is(function(O,H,pe,Ke){Wi(H,nf(H),O,Ke)}),eg=gp(kc),ES=fl(function(O,H){O=Ks(O);var pe=-1,Ke=H.length,kt=Ke>2?H[2]:u;for(kt&&gc(H[0],H[1],kt)&&(Ke=1);++pe<Ke;)for(var pn=H[pe],er=Md(pn),Cr=-1,Xr=er.length;++Cr<Xr;){var oo=er[Cr],io=O[oo];(io===u||at(io,_a[oo])&&!Xs.call(O,oo))&&(O[oo]=pn[oo])}return O}),TS=fl(function(O){return O.push(u,sh),Me(Vh,u,O)});function S1(O,H,pe){var Ke=null==O?u:Ni(O,H);return Ke===u?pe:Ke}function wg(O,H){return null!=O&&j_(O,H,dl)}var tg=Yf(function(O,H,pe){null!=H&&"function"!=typeof H.toString&&(H=Il.call(H)),O[H]=pe},uy(Nf)),Pb=Yf(function(O,H,pe){null!=H&&"function"!=typeof H.toString&&(H=Il.call(H)),Xs.call(O,H)?O[H].push(pe):O[H]=[pe]},Ps),SS=fl(ol);function nf(O){return Qo(O)?wf(O):Qt(O)}function Md(O){return Qo(O)?wf(O,!0):function(O){if(!Zu(O))return function(O){var H=[];if(null!=O)for(var pe in Ks(O))H.push(pe);return H}(O);var H=Ud(O),pe=[];for(var Ke in O)"constructor"==Ke&&(H||!Xs.call(O,Ke))||pe.push(Ke);return pe}(O)}var G0=Is(function(O,H,pe){_l(O,H,pe)}),Vh=Is(function(O,H,pe,Ke){_l(O,H,pe,Ke)}),V0=gp(function(O,H){var pe={};if(null==O)return pe;var Ke=!1;H=Ms(H,function(pn){return pn=Bf(pn,O),Ke||(Ke=pn.length>1),pn}),Wi(O,o_(O),pe),Ke&&(pe=h(pe,7,r_));for(var kt=H.length;kt--;)wh(pe,H[kt]);return pe}),Vg=gp(function(O,H){return null==O?{}:function(O,H){return $p(O,H,function(pe,Ke){return wg(O,Ke)})}(O,H)});function z0(O,H){if(null==O)return{};var pe=Ms(o_(O),function(Ke){return[Ke]});return H=Ps(H),$p(O,pe,function(Ke,kt){return H(Ke,kt[0])})}var Gu=t_(nf),Tv=t_(Md);function Bm(O){return null==O?[]:cu(O,nf(O))}var Q0=wu(function(O,H,pe){return H=H.toLowerCase(),O+(pe?A1(H):H)});function A1(O){return sy(ju(O).toLowerCase())}function X0(O){return(O=ju(O))&&O.replace(ho,du).replace($e,"")}var K0=wu(function(O,H,pe){return O+(pe?"-":"")+H.toLowerCase()}),q0=wu(function(O,H,pe){return O+(pe?" ":"")+H.toLowerCase()}),ey=rd("toLowerCase"),Zb=wu(function(O,H,pe){return O+(pe?"_":"")+H.toLowerCase()}),jb=wu(function(O,H,pe){return O+(pe?" ":"")+sy(H)}),DS=wu(function(O,H,pe){return O+(pe?" ":"")+H.toUpperCase()}),sy=rd("toUpperCase");function zb(O,H,pe){return O=ju(O),(H=pe?u:H)===u?function(Ln){return fi.test(Ln)}(O)?function(Ln){return Ln.match(sn)||[]}(O):function(Ln){return Ln.match(cs)||[]}(O):O.match(H)||[]}var x1=fl(function(O,H){try{return Me(O,u,H)}catch(pe){return K_(pe)?pe:new Ss(pe)}}),ay=gp(function(O,H){return Tt(H,function(pe){pe=Uc(pe),Sl(O,pe,Cp(O[pe],O))}),O});function uy(O){return function(){return O}}var D1=oh(),cy=oh(!0);function Nf(O){return O}function R1(O){return bt("function"==typeof O?O:h(O,1))}var Xb=fl(function(O,H){return function(pe){return ol(pe,O,H)}}),Kb=fl(function(O,H){return function(pe){return ol(O,pe,H)}});function N1(O,H,pe){var Ke=nf(H),kt=jr(H,Ke);null==pe&&(!Zu(H)||!kt.length&&Ke.length)&&(pe=H,H=O,O=this,kt=jr(H,nf(H)));var pn=!(Zu(pe)&&"chain"in pe&&!pe.chain),er=ef(O);return Tt(kt,function(Cr){var Xr=H[Cr];O[Cr]=Xr,er&&(O.prototype[Cr]=function(){var oo=this.__chain__;if(pn||oo){var io=O(this.__wrapped__),vo=io.__actions__=gi(this.__actions__);return vo.push({func:Xr,args:arguments,thisArg:O}),io.__chain__=oo,io}return Xr.apply(O,Ma([this.value()],arguments))})}),O}function ng(){}var _h=_g(Ms),Zm=_g(Qi),qb=_g(Pl);function fy(O){return Ph(O)?tc(Uc(O)):function(O){return function(H){return Ni(H,O)}}(O)}var zh=U_(),jm=U_(!0);function rf(){return[]}function E_(){return!1}var Qg=H_(function(O,H){return O+H},0),Xg=Jc("ceil"),Kg=H_(function(O,H){return O/H},1),qg=Jc("floor"),wv=H_(function(O,H){return O*H},1),F1=Jc("round"),nm=H_(function(O,H){return O-H},0);return tn.after=function(O,H){if("function"!=typeof H)throw new zl(_);return O=$l(O),function(){if(--O<1)return H.apply(this,arguments)}},tn.ary=Bg,tn.assign=$m,tn.assignIn=Y0,tn.assignInWith=Ev,tn.assignWith=Rb,tn.at=eg,tn.before=hv,tn.bind=Cp,tn.bindAll=ay,tn.bindKey=Pm,tn.castArray=function(){if(!arguments.length)return[];var O=arguments[0];return li(O)?O:[O]},tn.chain=ao,tn.chunk=function(O,H,pe){H=(pe?gc(O,H,pe):H===u)?1:va($l(H),0);var Ke=null==O?0:O.length;if(!Ke||H<1)return[];for(var kt=0,pn=0,er=gr(yi(Ke/H));kt<Ke;)er[pn++]=Ed(O,kt,kt+=H);return er},tn.compact=function(O){for(var H=-1,pe=null==O?0:O.length,Ke=0,kt=[];++H<pe;){var pn=O[H];pn&&(kt[Ke++]=pn)}return kt},tn.concat=function(){var O=arguments.length;if(!O)return[];for(var H=gr(O-1),pe=arguments[0],Ke=O;Ke--;)H[Ke-1]=arguments[Ke];return Ma(li(pe)?gi(pe):[pe],vt(H,1))},tn.cond=function(O){var H=null==O?0:O.length,pe=Ps();return O=H?Ms(O,function(Ke){if("function"!=typeof Ke[1])throw new zl(_);return[pe(Ke[0]),Ke[1]]}):[],fl(function(Ke){for(var kt=-1;++kt<H;){var pn=O[kt];if(Me(pn[0],this,Ke))return Me(pn[1],this,Ke)}})},tn.conforms=function(O){return function(O){var H=nf(O);return function(pe){return N(pe,O,H)}}(h(O,1))},tn.constant=uy,tn.countBy=sv,tn.create=function(O,H){var pe=Mc(O);return null==H?pe:fu(pe,H)},tn.curry=function _v(O,H,pe){var Ke=qf(O,8,u,u,u,u,u,H=pe?u:H);return Ke.placeholder=_v.placeholder,Ke},tn.curryRight=function h1(O,H,pe){var Ke=qf(O,16,u,u,u,u,u,H=pe?u:H);return Ke.placeholder=h1.placeholder,Ke},tn.debounce=Yg,tn.defaults=ES,tn.defaultsDeep=TS,tn.defer=_1,tn.delay=gv,tn.difference=Mm,tn.differenceBy=d_,tn.differenceWith=Yp,tn.drop=function(O,H,pe){var Ke=null==O?0:O.length;return Ke?Ed(O,(H=pe||H===u?1:$l(H))<0?0:H,Ke):[]},tn.dropRight=function(O,H,pe){var Ke=null==O?0:O.length;return Ke?Ed(O,0,(H=Ke-(H=pe||H===u?1:$l(H)))<0?0:H):[]},tn.dropRightWhile=function(O,H){return O&&O.length?nh(O,Ps(H,3),!0,!0):[]},tn.dropWhile=function(O,H){return O&&O.length?nh(O,Ps(H,3),!0):[]},tn.fill=function(O,H,pe,Ke){var kt=null==O?0:O.length;return kt?(pe&&"number"!=typeof pe&&gc(O,H,pe)&&(pe=0,Ke=kt),function(O,H,pe,Ke){var kt=O.length;for((pe=$l(pe))<0&&(pe=-pe>kt?0:kt+pe),(Ke=Ke===u||Ke>kt?kt:$l(Ke))<0&&(Ke+=kt),Ke=pe>Ke?0:xb(Ke);pe<Ke;)O[pe++]=H;return O}(O,H,pe,Ke)):[]},tn.filter=function(O,H){return(li(O)?Jo:gt)(O,Ps(H,3))},tn.flatMap=function(O,H){return vt(Rm(O,H),1)},tn.flatMapDeep=function(O,H){return vt(Rm(O,H),Zt)},tn.flatMapDepth=function(O,H,pe){return pe=pe===u?1:$l(pe),vt(Rm(O,H),pe)},tn.flatten=z_,tn.flattenDeep=function(O){return null!=O&&O.length?vt(O,Zt):[]},tn.flattenDepth=function(O,H){return null!=O&&O.length?vt(O,H=H===u?1:$l(H)):[]},tn.flip=function(O){return qf(O,512)},tn.flow=D1,tn.flowRight=cy,tn.fromPairs=function(O){for(var H=-1,pe=null==O?0:O.length,Ke={};++H<pe;){var kt=O[H];Ke[kt[0]]=kt[1]}return Ke},tn.functions=function(O){return null==O?[]:jr(O,nf(O))},tn.functionsIn=function(O){return null==O?[]:jr(O,Md(O))},tn.groupBy=mc,tn.initial=function(O){return null!=O&&O.length?Ed(O,0,-1):[]},tn.intersection=Tg,tn.intersectionBy=Hg,tn.intersectionWith=Tp,tn.invert=tg,tn.invertBy=Pb,tn.invokeMap=Iu,tn.iteratee=R1,tn.keyBy=p1,tn.keys=nf,tn.keysIn=Md,tn.map=Rm,tn.mapKeys=function(O,H){var pe={};return H=Ps(H,3),Rn(O,function(Ke,kt,pn){Sl(pe,H(Ke,kt,pn),Ke)}),pe},tn.mapValues=function(O,H){var pe={};return H=Ps(H,3),Rn(O,function(Ke,kt,pn){Sl(pe,kt,H(Ke,kt,pn))}),pe},tn.matches=function(O){return xa(h(O,1))},tn.matchesProperty=function(O,H){return ia(O,h(H,1))},tn.memoize=Og,tn.merge=G0,tn.mergeWith=Vh,tn.method=Xb,tn.methodOf=Kb,tn.mixin=N1,tn.negate=Mp,tn.nthArg=function(O){return O=$l(O),fl(function(H){return Wc(H,O)})},tn.omit=V0,tn.omitBy=function(O,H){return z0(O,Mp(Ps(H)))},tn.once=function(O){return hv(2,O)},tn.orderBy=function(O,H,pe,Ke){return null==O?[]:(li(H)||(H=null==H?[]:[H]),li(pe=Ke?u:pe)||(pe=null==pe?[]:[pe]),Kf(O,H,pe))},tn.over=_h,tn.overArgs=jh,tn.overEvery=Zm,tn.overSome=qb,tn.partial=Gp,tn.partialRight=X_,tn.partition=es,tn.pick=Vg,tn.pickBy=z0,tn.property=fy,tn.propertyOf=function(O){return function(H){return null==O?u:Ni(O,H)}},tn.pull=$h,tn.pullAll=Sg,tn.pullAllBy=function(O,H,pe){return O&&O.length&&H&&H.length?mf(O,H,Ps(pe,2)):O},tn.pullAllWith=function(O,H,pe){return O&&O.length&&H&&H.length?mf(O,H,u,pe):O},tn.pullAt=h_,tn.range=zh,tn.rangeRight=jm,tn.rearg=v_,tn.reject=function(O,H){return(li(O)?Jo:gt)(O,Mp(Ps(H,3)))},tn.remove=function(O,H){var pe=[];if(!O||!O.length)return pe;var Ke=-1,kt=[],pn=O.length;for(H=Ps(H,3);++Ke<pn;){var er=O[Ke];H(er,Ke,O)&&(pe.push(er),kt.push(Ke))}return $f(O,kt),pe},tn.rest=function(O,H){if("function"!=typeof O)throw new zl(_);return fl(O,H=H===u?H:$l(H))},tn.reverse=__,tn.sampleSize=function(O,H,pe){return H=(pe?gc(O,H,pe):H===u)?1:$l(H),(li(O)?Pd:F_)(O,H)},tn.set=function(O,H,pe){return null==O?O:Hf(O,H,pe)},tn.setWith=function(O,H,pe,Ke){return Ke="function"==typeof Ke?Ke:u,null==O?O:Hf(O,H,pe,Ke)},tn.shuffle=function(O){return(li(O)?rc:Kp)(O)},tn.slice=function(O,H,pe){var Ke=null==O?0:O.length;return Ke?(pe&&"number"!=typeof pe&&gc(O,H,pe)?(H=0,pe=Ke):(H=null==H?0:$l(H),pe=pe===u?Ke:$l(pe)),Ed(O,H,pe)):[]},tn.sortBy=pv,tn.sortedUniq=function(O){return O&&O.length?Oh(O):[]},tn.sortedUniqBy=function(O,H){return O&&O.length?Oh(O,Ps(H,2)):[]},tn.split=function(O,H,pe){return pe&&"number"!=typeof pe&&gc(O,H,pe)&&(H=pe=u),(pe=pe===u?Gt:pe>>>0)?(O=ju(O))&&("string"==typeof H||null!=H&&!yv(H))&&!(H=Td(H))&&fa(O)?oc(un(O),0,pe):O.split(H,pe):[]},tn.spread=function(O,H){if("function"!=typeof O)throw new zl(_);return H=null==H?0:va($l(H),0),fl(function(pe){var Ke=pe[H],kt=oc(pe,0,H);return Ke&&Ma(kt,Ke),Me(O,this,kt)})},tn.tail=function(O){var H=null==O?0:O.length;return H?Ed(O,1,H):[]},tn.take=function(O,H,pe){return O&&O.length?Ed(O,0,(H=pe||H===u?1:$l(H))<0?0:H):[]},tn.takeRight=function(O,H,pe){var Ke=null==O?0:O.length;return Ke?Ed(O,(H=Ke-(H=pe||H===u?1:$l(H)))<0?0:H,Ke):[]},tn.takeRightWhile=function(O,H){return O&&O.length?nh(O,Ps(H,3),!1,!0):[]},tn.takeWhile=function(O,H){return O&&O.length?nh(O,Ps(H,3)):[]},tn.tap=function(O,H){return H(O),O},tn.throttle=function(O,H,pe){var Ke=!0,kt=!0;if("function"!=typeof O)throw new zl(_);return Zu(pe)&&(Ke="leading"in pe?!!pe.leading:Ke,kt="trailing"in pe?!!pe.trailing:kt),Yg(O,H,{leading:Ke,maxWait:H,trailing:kt})},tn.thru=Os,tn.toArray=b1,tn.toPairs=Gu,tn.toPairsIn=Tv,tn.toPath=function(O){return li(O)?Ms(O,Uc):Ef(O)?[O]:gi(u_(ju(O)))},tn.toPlainObject=Db,tn.transform=function(O,H,pe){var Ke=li(O),kt=Ke||Tu(O)||km(O);if(H=Ps(H,4),null==pe){var pn=O&&O.constructor;pe=kt?Ke?new pn:[]:Zu(O)&&ef(pn)?Mc(ul(O)):{}}return(kt?Tt:Rn)(O,function(er,Cr,Xr){return H(pe,er,Cr,Xr)}),pe},tn.unary=function(O){return Bg(O,1)},tn.union=We,tn.unionBy=Rt,tn.unionWith=rn,tn.uniq=function(O){return O&&O.length?xf(O):[]},tn.uniqBy=function(O,H){return O&&O.length?xf(O,Ps(H,2)):[]},tn.uniqWith=function(O,H){return H="function"==typeof H?H:u,O&&O.length?xf(O,u,H):[]},tn.unset=function(O,H){return null==O||wh(O,H)},tn.unzip=fs,tn.unzipWith=Ua,tn.update=function(O,H,pe){return null==O?O:Up(O,H,pp(pe))},tn.updateWith=function(O,H,pe,Ke){return Ke="function"==typeof Ke?Ke:u,null==O?O:Up(O,H,pp(pe),Ke)},tn.values=Bm,tn.valuesIn=function(O){return null==O?[]:cu(O,Md(O))},tn.without=mo,tn.words=zb,tn.wrap=function(O,H){return Gp(pp(H),O)},tn.xor=_o,tn.xorBy=La,tn.xorWith=Sa,tn.zip=ti,tn.zipObject=function(O,H){return Dh(O||[],H||[],gu)},tn.zipObjectDeep=function(O,H){return Dh(O||[],H||[],Hf)},tn.zipWith=Bi,tn.entries=Gu,tn.entriesIn=Tv,tn.extend=Y0,tn.extendWith=Ev,N1(tn,tn),tn.add=Qg,tn.attempt=x1,tn.camelCase=Q0,tn.capitalize=A1,tn.ceil=Xg,tn.clamp=function(O,H,pe){return pe===u&&(pe=H,H=u),pe!==u&&(pe=(pe=zf(pe))==pe?pe:0),H!==u&&(H=(H=zf(H))==H?H:0),$c(zf(O),H,pe)},tn.clone=function(O){return h(O,4)},tn.cloneDeep=function(O){return h(O,5)},tn.cloneDeepWith=function(O,H){return h(O,5,H="function"==typeof H?H:u)},tn.cloneWith=function(O,H){return h(O,4,H="function"==typeof H?H:u)},tn.conformsTo=function(O,H){return null==H||N(O,H,nf(H))},tn.deburr=X0,tn.defaultTo=function(O,H){return null==O||O!=O?H:O},tn.divide=Kg,tn.endsWith=function(O,H,pe){O=ju(O),H=Td(H);var Ke=O.length,kt=pe=pe===u?Ke:$c($l(pe),0,Ke);return(pe-=H.length)>=0&&O.slice(pe,kt)==H},tn.eq=at,tn.escape=function(O){return(O=ju(O))&&Ze.test(O)?O.replace(no,Ar):O},tn.escapeRegExp=function(O){return(O=ju(O))&&nr.test(O)?O.replace(wn,"\\$&"):O},tn.every=function(O,H,pe){var Ke=li(O)?Qi:Ue;return pe&&gc(O,H,pe)&&(H=u),Ke(O,Ps(H,3))},tn.find=f1,tn.findIndex=Eg,tn.findKey=function(O,H){return Nc(O,Ps(H,3),Rn)},tn.findLast=Mb,tn.findLastIndex=kg,tn.findLastKey=function(O,H){return Nc(O,Ps(H,3),sr)},tn.floor=qg,tn.forEach=uv,tn.forEachRight=Dm,tn.forIn=function(O,H){return null==O?O:Jt(O,Ps(H,3),Md)},tn.forInRight=function(O,H){return null==O?O:Pn(O,Ps(H,3),Md)},tn.forOwn=function(O,H){return O&&Rn(O,Ps(H,3))},tn.forOwnRight=function(O,H){return O&&sr(O,Ps(H,3))},tn.get=S1,tn.gt=Ft,tn.gte=Gn,tn.has=function(O,H){return null!=O&&j_(O,H,qs)},tn.hasIn=wg,tn.head=W_,tn.identity=Nf,tn.includes=function(O,H,pe,Ke){O=Qo(O)?O:Bm(O),pe=pe&&!Ke?$l(pe):0;var kt=O.length;return pe<0&&(pe=va(kt+pe,0)),bv(O)?pe<=kt&&O.indexOf(H,pe)>-1:!!kt&&Pc(O,H,pe)>-1},tn.indexOf=function(O,H,pe){var Ke=null==O?0:O.length;if(!Ke)return-1;var kt=null==pe?0:$l(pe);return kt<0&&(kt=va(Ke+kt,0)),Pc(O,H,kt)},tn.inRange=function(O,H,pe){return H=y_(H),pe===u?(pe=H,H=0):pe=y_(pe),function(O,H,pe){return O>=wl(H,pe)&&O<va(H,pe)}(O=zf(O),H,pe)},tn.invoke=SS,tn.isArguments=hr,tn.isArray=li,tn.isArrayBuffer=Io,tn.isArrayLike=Qo,tn.isArrayLikeObject=ws,tn.isBoolean=function(O){return!0===O||!1===O||Rc(O)&&$o(O)==Yn},tn.isBuffer=Tu,tn.isDate=tu,tn.isElement=function(O){return Rc(O)&&1===O.nodeType&&!vv(O)},tn.isEmpty=function(O){if(null==O)return!0;if(Qo(O)&&(li(O)||"string"==typeof O||"function"==typeof O.splice||Tu(O)||km(O)||hr(O)))return!O.length;var H=Dc(O);if(H==Kr||H==Hi)return!O.size;if(Ud(O))return!Qt(O).length;for(var pe in O)if(Xs.call(O,pe))return!1;return!0},tn.isEqual=function(O,H){return mu(O,H)},tn.isEqualWith=function(O,H,pe){var Ke=(pe="function"==typeof pe?pe:u)?pe(O,H):u;return Ke===u?mu(O,H,u,pe):!!Ke},tn.isError=K_,tn.isFinite=function(O){return"number"==typeof O&&Oa(O)},tn.isFunction=ef,tn.isInteger=Xc,tn.isLength=Op,tn.isMap=L0,tn.isMatch=function(O,H){return O===H||gf(O,H,ah(H))},tn.isMatchWith=function(O,H,pe){return pe="function"==typeof pe?pe:u,gf(O,H,ah(H),pe)},tn.isNaN=function(O){return $0(O)&&O!=+O},tn.isNative=function(O){if(jf(O))throw new Ss("Unsupported core-js use. Try https://npms.io/search?q=ponyfill.");return Ga(O)},tn.isNil=function(O){return null==O},tn.isNull=function(O){return null===O},tn.isNumber=$0,tn.isObject=Zu,tn.isObjectLike=Rc,tn.isPlainObject=vv,tn.isRegExp=yv,tn.isSafeInteger=function(O){return Xc(O)&&O>=-st&&O<=st},tn.isSet=H0,tn.isString=bv,tn.isSymbol=Ef,tn.isTypedArray=km,tn.isUndefined=function(O){return O===u},tn.isWeakMap=function(O){return Rc(O)&&Dc(O)==Jn},tn.isWeakSet=function(O){return Rc(O)&&"[object WeakSet]"==$o(O)},tn.join=function(O,H){return null==O?"":Us.call(O,H)},tn.kebabCase=K0,tn.last=Qc,tn.lastIndexOf=function(O,H,pe){var Ke=null==O?0:O.length;if(!Ke)return-1;var kt=Ke;return pe!==u&&(kt=(kt=$l(pe))<0?va(Ke+kt,0):wl(kt,Ke-1)),H==H?function(Ln,Mr,gr){for(var co=gr+1;co--;)if(Ln[co]===Mr)return co;return co}(O,H,kt):Ec(O,Ic,kt,!0)},tn.lowerCase=q0,tn.lowerFirst=ey,tn.lt=yS,tn.lte=B0,tn.max=function(O){return O&&O.length?we(O,Nf,Vs):u},tn.maxBy=function(O,H){return O&&O.length?we(O,Ps(H,2),Vs):u},tn.mean=function(O){return md(O,Nf)},tn.meanBy=function(O,H){return md(O,Ps(H,2))},tn.min=function(O){return O&&O.length?we(O,Nf,vi):u},tn.minBy=function(O,H){return O&&O.length?we(O,Ps(H,2),vi):u},tn.stubArray=rf,tn.stubFalse=E_,tn.stubObject=function(){return{}},tn.stubString=function(){return""},tn.stubTrue=function(){return!0},tn.multiply=wv,tn.nth=function(O,H){return O&&O.length?Wc(O,$l(H)):u},tn.noConflict=function(){return Hl._===this&&(Hl._=Vd),this},tn.noop=ng,tn.now=Q_,tn.pad=function(O,H,pe){O=ju(O);var Ke=(H=$l(H))?lt(O):0;if(!H||Ke>=H)return O;var kt=(H-Ke)/2;return _p(Go(kt),pe)+O+_p(yi(kt),pe)},tn.padEnd=function(O,H,pe){O=ju(O);var Ke=(H=$l(H))?lt(O):0;return H&&Ke<H?O+_p(H-Ke,pe):O},tn.padStart=function(O,H,pe){O=ju(O);var Ke=(H=$l(H))?lt(O):0;return H&&Ke<H?_p(H-Ke,pe)+O:O},tn.parseInt=function(O,H,pe){return pe||null==H?H=0:H&&(H=+H),$a(ju(O).replace(Gi,""),H||0)},tn.random=function(O,H,pe){if(pe&&"boolean"!=typeof pe&&gc(O,H,pe)&&(H=pe=u),pe===u&&("boolean"==typeof H?(pe=H,H=u):"boolean"==typeof O&&(pe=O,O=u)),O===u&&H===u?(O=0,H=1):(O=y_(O),H===u?(H=O,O=0):H=y_(H)),O>H){var Ke=O;O=H,H=Ke}if(pe||O%1||H%1){var kt=Ha();return wl(O+kt*(H-O+Ru("1e-"+((kt+"").length-1))),H)}return dd(O,H)},tn.reduce=function(O,H,pe){var Ke=li(O)?uu:ua,kt=arguments.length<3;return Ke(O,Ps(H,4),pe,kt,de)},tn.reduceRight=function(O,H,pe){var Ke=li(O)?Wa:ua,kt=arguments.length<3;return Ke(O,Ps(H,4),pe,kt,be)},tn.repeat=function(O,H,pe){return H=(pe?gc(O,H,pe):H===u)?1:$l(H),fp(ju(O),H)},tn.replace=function(){var O=arguments,H=ju(O[0]);return O.length<3?H:H.replace(O[1],O[2])},tn.result=function(O,H,pe){var Ke=-1,kt=(H=Bf(H,O)).length;for(kt||(kt=1,O=u);++Ke<kt;){var pn=null==O?u:O[Uc(H[Ke])];pn===u&&(Ke=kt,pn=pe),O=ef(pn)?pn.call(O):pn}return O},tn.round=F1,tn.runInContext=Ln,tn.sample=function(O){return(li(O)?Wl:Kh)(O)},tn.size=function(O){if(null==O)return 0;if(Qo(O))return bv(O)?lt(O):O.length;var H=Dc(O);return H==Kr||H==Hi?O.size:Qt(O).length},tn.snakeCase=Zb,tn.some=function(O,H,pe){var Ke=li(O)?Pl:Ah;return pe&&gc(O,H,pe)&&(H=u),Ke(O,Ps(H,3))},tn.sortedIndex=function(O,H){return qp(O,H)},tn.sortedIndexBy=function(O,H,pe){return eh(O,H,Ps(pe,2))},tn.sortedIndexOf=function(O,H){var pe=null==O?0:O.length;if(pe){var Ke=qp(O,H);if(Ke<pe&&at(O[Ke],H))return Ke}return-1},tn.sortedLastIndex=function(O,H){return qp(O,H,!0)},tn.sortedLastIndexBy=function(O,H,pe){return eh(O,H,Ps(pe,2),!0)},tn.sortedLastIndexOf=function(O,H){if(null!=O&&O.length){var Ke=qp(O,H,!0)-1;if(at(O[Ke],H))return Ke}return-1},tn.startCase=jb,tn.startsWith=function(O,H,pe){return O=ju(O),pe=null==pe?0:$c($l(pe),0,O.length),H=Td(H),O.slice(pe,pe+H.length)==H},tn.subtract=nm,tn.sum=function(O){return O&&O.length?As(O,Nf):0},tn.sumBy=function(O,H){return O&&O.length?As(O,Ps(H,2)):0},tn.template=function(O,H,pe){var Ke=tn.templateSettings;pe&&gc(O,H,pe)&&(H=u),O=ju(O),H=Ev({},H,Ke,n_);var Cr,Xr,kt=Ev({},H.imports,Ke.imports,n_),pn=nf(kt),er=cu(kt,pn),oo=0,io=H.interpolate||Ti,vo="__p += '",hs=td((H.escape||Ti).source+"|"+io.source+"|"+(io===xt?Si:Ti).source+"|"+(H.evaluate||Ti).source+"|$","g"),aa="//# sourceURL="+(Xs.call(H,"sourceURL")?(H.sourceURL+"").replace(/\s/g," "):"lodash.templateSources["+ ++os+"]")+"\n";O.replace(hs,function(Ya,lu,yu,wp,ip,xp){return yu||(yu=wp),vo+=O.slice(oo,xp).replace(Bo,ha),lu&&(Cr=!0,vo+="' +\n__e("+lu+") +\n'"),ip&&(Xr=!0,vo+="';\n"+ip+";\n__p += '"),yu&&(vo+="' +\n((__t = ("+yu+")) == null ? '' : __t) +\n'"),oo=xp+Ya.length,Ya}),vo+="';\n";var Ba=Xs.call(H,"variable")&&H.variable;if(Ba){if(zo.test(Ba))throw new Ss("Invalid `variable` option passed into `_.template`")}else vo="with (obj) {\n"+vo+"\n}\n";vo=(Xr?vo.replace(zn,""):vo).replace(vr,"$1").replace(si,"$1;"),vo="function("+(Ba||"obj")+") {\n"+(Ba?"":"obj || (obj = {});\n")+"var __t, __p = ''"+(Cr?", __e = _.escape":"")+(Xr?", __j = Array.prototype.join;\nfunction print() { __p += __j.call(arguments, '') }\n":";\n")+vo+"return __p\n}";var Nl=x1(function(){return Na(pn,aa+"return "+vo).apply(u,er)});if(Nl.source=vo,K_(Nl))throw Nl;return Nl},tn.times=function(O,H){if((O=$l(O))<1||O>st)return[];var pe=Gt,Ke=wl(O,Gt);H=Ps(H),O-=Gt;for(var kt=ku(Ke,H);++pe<O;)H(pe);return kt},tn.toFinite=y_,tn.toInteger=$l,tn.toLength=xb,tn.toLower=function(O){return ju(O).toLowerCase()},tn.toNumber=zf,tn.toSafeInteger=function(O){return O?$c($l(O),-st,st):0===O?O:0},tn.toString=ju,tn.toUpper=function(O){return ju(O).toUpperCase()},tn.trim=function(O,H,pe){if((O=ju(O))&&(pe||H===u))return Au(O);if(!O||!(H=Td(H)))return O;var Ke=un(O),kt=un(H);return oc(Ke,$u(Ke,kt),Hu(Ke,kt)+1).join("")},tn.trimEnd=function(O,H,pe){if((O=ju(O))&&(pe||H===u))return O.slice(0,yn(O)+1);if(!O||!(H=Td(H)))return O;var Ke=un(O);return oc(Ke,0,Hu(Ke,un(H))+1).join("")},tn.trimStart=function(O,H,pe){if((O=ju(O))&&(pe||H===u))return O.replace(Gi,"");if(!O||!(H=Td(H)))return O;var Ke=un(O);return oc(Ke,$u(Ke,un(H))).join("")},tn.truncate=function(O,H){var pe=30,Ke="...";if(Zu(H)){var kt="separator"in H?H.separator:kt;pe="length"in H?$l(H.length):pe,Ke="omission"in H?Td(H.omission):Ke}var pn=(O=ju(O)).length;if(fa(O)){var er=un(O);pn=er.length}if(pe>=pn)return O;var Cr=pe-lt(Ke);if(Cr<1)return Ke;var Xr=er?oc(er,0,Cr).join(""):O.slice(0,Cr);if(kt===u)return Xr+Ke;if(er&&(Cr+=Xr.length-Cr),yv(kt)){if(O.slice(Cr).search(kt)){var oo,io=Xr;for(kt.global||(kt=td(kt.source,ju(ai.exec(kt))+"g")),kt.lastIndex=0;oo=kt.exec(io);)var vo=oo.index;Xr=Xr.slice(0,vo===u?Cr:vo)}}else if(O.indexOf(Td(kt),Cr)!=Cr){var hs=Xr.lastIndexOf(kt);hs>-1&&(Xr=Xr.slice(0,hs))}return Xr+Ke},tn.unescape=function(O){return(O=ju(O))&&so.test(O)?O.replace(Ii,Or):O},tn.uniqueId=function(O){var H=++vd;return ju(O)+H},tn.upperCase=DS,tn.upperFirst=sy,tn.each=uv,tn.eachRight=Dm,tn.first=W_,N1(tn,function(){var O={};return Rn(tn,function(H,pe){Xs.call(tn.prototype,pe)||(O[pe]=H)}),O}(),{chain:!1}),tn.VERSION="4.17.21",Tt(["bind","bindKey","curry","curryRight","partial","partialRight"],function(O){tn[O].placeholder=tn}),Tt(["drop","take"],function(O,H){rl.prototype[O]=function(pe){pe=pe===u?1:va($l(pe),0);var Ke=this.__filtered__&&!H?new rl(this):this.clone();return Ke.__filtered__?Ke.__takeCount__=wl(pe,Ke.__takeCount__):Ke.__views__.push({size:wl(pe,Gt),type:O+(Ke.__dir__<0?"Right":"")}),Ke},rl.prototype[O+"Right"]=function(pe){return this.reverse()[O](pe).reverse()}}),Tt(["filter","map","takeWhile"],function(O,H){var pe=H+1,Ke=1==pe||3==pe;rl.prototype[O]=function(kt){var pn=this.clone();return pn.__iteratees__.push({iteratee:Ps(kt,3),type:pe}),pn.__filtered__=pn.__filtered__||Ke,pn}}),Tt(["head","last"],function(O,H){var pe="take"+(H?"Right":"");rl.prototype[O]=function(){return this[pe](1).value()[0]}}),Tt(["initial","tail"],function(O,H){var pe="drop"+(H?"":"Right");rl.prototype[O]=function(){return this.__filtered__?new rl(this):this[pe](1)}}),rl.prototype.compact=function(){return this.filter(Nf)},rl.prototype.find=function(O){return this.filter(O).head()},rl.prototype.findLast=function(O){return this.reverse().find(O)},rl.prototype.invokeMap=fl(function(O,H){return"function"==typeof O?new rl(this):this.map(function(pe){return ol(pe,O,H)})}),rl.prototype.reject=function(O){return this.filter(Mp(Ps(O)))},rl.prototype.slice=function(O,H){O=$l(O);var pe=this;return pe.__filtered__&&(O>0||H<0)?new rl(pe):(O<0?pe=pe.takeRight(-O):O&&(pe=pe.drop(O)),H!==u&&(pe=(H=$l(H))<0?pe.dropRight(-H):pe.take(H-O)),pe)},rl.prototype.takeRightWhile=function(O){return this.reverse().takeWhile(O).reverse()},rl.prototype.toArray=function(){return this.take(Gt)},Rn(rl.prototype,function(O,H){var pe=/^(?:filter|find|map|reject)|While$/.test(H),Ke=/^(?:head|last)$/.test(H),kt=tn[Ke?"take"+("last"==H?"Right":""):H],pn=Ke||/^find/.test(H);!kt||(tn.prototype[H]=function(){var er=this.__wrapped__,Cr=Ke?[1]:arguments,Xr=er instanceof rl,oo=Cr[0],io=Xr||li(er),vo=function(lu){var yu=kt.apply(tn,Ma([lu],Cr));return Ke&&hs?yu[0]:yu};io&&pe&&"function"==typeof oo&&1!=oo.length&&(Xr=io=!1);var hs=this.__chain__,aa=!!this.__actions__.length,Ba=pn&&!hs,Nl=Xr&&!aa;if(!pn&&io){er=Nl?er:new rl(this);var Ya=O.apply(er,Cr);return Ya.__actions__.push({func:Os,args:[vo],thisArg:u}),new Pu(Ya,hs)}return Ba&&Nl?O.apply(this,Cr):(Ya=this.thru(vo),Ba?Ke?Ya.value()[0]:Ya.value():Ya)})}),Tt(["pop","push","shift","sort","splice","unshift"],function(O){var H=ki[O],pe=/^(?:push|sort|unshift)$/.test(O)?"tap":"thru",Ke=/^(?:pop|shift)$/.test(O);tn.prototype[O]=function(){var kt=arguments;if(Ke&&!this.__chain__){var pn=this.value();return H.apply(li(pn)?pn:[],kt)}return this[pe](function(er){return H.apply(li(er)?er:[],kt)})}}),Rn(rl.prototype,function(O,H){var pe=tn[H];if(pe){var Ke=pe.name+"";Xs.call(Gc,Ke)||(Gc[Ke]=[]),Gc[Ke].push({name:H,func:pe})}}),Gc[hp(u,2).name]=[{name:"wrapper",func:u}],rl.prototype.clone=function(){var O=new rl(this.__wrapped__);return O.__actions__=gi(this.__actions__),O.__dir__=this.__dir__,O.__filtered__=this.__filtered__,O.__iteratees__=gi(this.__iteratees__),O.__takeCount__=this.__takeCount__,O.__views__=gi(this.__views__),O},rl.prototype.reverse=function(){if(this.__filtered__){var O=new rl(this);O.__dir__=-1,O.__filtered__=!0}else(O=this.clone()).__dir__*=-1;return O},rl.prototype.value=function(){var O=this.__wrapped__.value(),H=this.__dir__,pe=li(O),Ke=H<0,kt=pe?O.length:0,pn=function(O,H,pe){for(var Ke=-1,kt=pe.length;++Ke<kt;){var pn=pe[Ke],er=pn.size;switch(pn.type){case"drop":O+=er;break;case"dropRight":H-=er;break;case"take":H=wl(H,O+er);break;case"takeRight":O=va(O,H-er)}}return{start:O,end:H}}(0,kt,this.__views__),er=pn.start,Cr=pn.end,Xr=Cr-er,oo=Ke?Cr:er-1,io=this.__iteratees__,vo=io.length,hs=0,aa=wl(Xr,this.__takeCount__);if(!pe||!Ke&&kt==Xr&&aa==Xr)return xh(O,this.__actions__);var Ba=[];e:for(;Xr--&&hs<aa;){for(var Nl=-1,Ya=O[oo+=H];++Nl<vo;){var lu=io[Nl],wp=lu.type,ip=(0,lu.iteratee)(Ya);if(2==wp)Ya=ip;else if(!ip){if(1==wp)continue e;break e}}Ba[hs++]=Ya}return Ba},tn.prototype.at=Xa,tn.prototype.chain=function(){return ao(this)},tn.prototype.commit=function(){return new Pu(this.value(),this.__chain__)},tn.prototype.next=function(){this.__values__===u&&(this.__values__=b1(this.value()));var O=this.__index__>=this.__values__.length;return{done:O,value:O?u:this.__values__[this.__index__++]}},tn.prototype.plant=function(O){for(var H,pe=this;pe instanceof Ou;){var Ke=vg(pe);Ke.__index__=0,Ke.__values__=u,H?kt.__wrapped__=Ke:H=Ke;var kt=Ke;pe=pe.__wrapped__}return kt.__wrapped__=O,H},tn.prototype.reverse=function(){var O=this.__wrapped__;if(O instanceof rl){var H=O;return this.__actions__.length&&(H=new rl(this)),(H=H.reverse()).__actions__.push({func:Os,args:[__],thisArg:u}),new Pu(H,this.__chain__)}return this.thru(__)},tn.prototype.toJSON=tn.prototype.valueOf=tn.prototype.value=function(){return xh(this.__wrapped__,this.__actions__)},tn.prototype.first=tn.prototype.head,Ce&&(tn.prototype[Ce]=function(){return this}),tn}();Hl._=Ho,(r=function(){return Ho}.call(S,i,S,v))!==u&&(v.exports=r)}.call(this)},97425:(v,S,i)=>{var r=i(93177);function p(f,e){if("function"!=typeof f||null!=e&&"function"!=typeof e)throw new TypeError("Expected a function");var _=function(){var y=arguments,T=e?e.apply(this,y):y[0],M=_.cache;if(M.has(T))return M.get(T);var R=f.apply(this,y);return _.cache=M.set(T,R)||M,R};return _.cache=new(p.Cache||r),_}p.Cache=r,v.exports=p},3912:(v,S,i)=>{var r=i(9085),p=i(30906)(function(f,e,_){r(f,e,_)});v.exports=p},30765:(v,S,i)=>{var r=i(27038);v.exports=function(){return r.Date.now()}},12482:(v,S,i)=>{var r=i(14992),u=i(77007),p=i(72064),f=i(64667),e=i(11694),_=i(925),y=i(10058),T=i(51675),Z=y(function(J,Q){var ee={};if(null==J)return ee;var ue=!1;Q=r(Q,function($){return $=f($,J),ue||(ue=$.length>1),$}),e(J,T(J),ee),ue&&(ee=u(ee,7,_));for(var ae=Q.length;ae--;)p(ee,Q[ae]);return ee});v.exports=Z},63354:(v,S,i)=>{var r=i(68840),u=i(59866),p=i(99743),f=i(82773);v.exports=function(_){return p(_)?r(f(_)):u(_)}},86101:(v,S,i)=>{var r=i(89731),u=i(59026),p=i(5245),f=i(85105),e=i(81690);v.exports=function(y,T,M){var R=e(y)?r:f,F=arguments.length<3;return R(y,p(T,4),M,F,u)}},12666:(v,S,i)=>{var r=i(32773);v.exports=function(p,f,e){return null==p?p:r(p,f,e)}},52190:(v,S,i)=>{var r=i(8141),u=i(5245),p=i(37834),f=i(81690),e=i(71100);v.exports=function(y,T,M){var R=f(y)?r:p;return M&&e(y,T,M)&&(T=void 0),R(y,u(T,3))}},65336:v=>{v.exports=function(){return[]}},61711:v=>{v.exports=function(){return!1}},5152:(v,S,i)=>{var r=i(45038),u=1/0;v.exports=function(e){return e?(e=r(e))===u||e===-u?17976931348623157e292*(e<0?-1:1):e==e?e:0:0===e?e:0}},32781:(v,S,i)=>{var r=i(5152);v.exports=function(p){var f=r(p),e=f%1;return f==f?e?f-e:f:0}},69883:(v,S,i)=>{var r=i(41233);v.exports=function(p){return r(p).toLowerCase()}},45038:(v,S,i)=>{var r=i(13743),u=i(53867),p=i(7786),e=/^[-+]0x[0-9a-f]+$/i,_=/^0b[01]+$/i,y=/^0o[0-7]+$/i,T=parseInt;v.exports=function(R){if("number"==typeof R)return R;if(p(R))return NaN;if(u(R)){var F="function"==typeof R.valueOf?R.valueOf():R;R=u(F)?F+"":F}if("string"!=typeof R)return 0===R?R:+R;R=r(R);var Z=_.test(R);return Z||y.test(R)?T(R.slice(2),Z?2:8):e.test(R)?NaN:+R}},31413:(v,S,i)=>{var r=i(11694),u=i(42970);v.exports=function(f){return r(f,u(f))}},41233:(v,S,i)=>{var r=i(68166);v.exports=function(p){return null==p?"":r(p)}},93890:(v,S,i)=>{var u=i(66803)("toUpperCase");v.exports=u},96590:(v,S,i)=>{var r=i(54561),u=i(59316),p=i(41233),f=i(58863);v.exports=function(_,y,T){return _=p(_),void 0===(y=T?void 0:y)?u(_)?f(_):r(_):_.match(y)||[]}},31507:(v,S,i)=>{var r=i(23898),u=i(25687);v.exports=function(f,e){return u(f||[],e||[],r)}},74538:(v,S,i)=>{"use strict";var r=i(7856),u=i(11926);S.highlight=f,S.highlightAuto=function(ae,$){var Oe,ce,dt,ze,se=$||{},ve=se.subset||r.listLanguages(),oe=se.prefix,he=ve.length,me=-1;if(null==oe&&(oe=p),"string"!=typeof ae)throw u("Expected `string` for value, got `%s`",ae);for(ce={relevance:0,language:null,value:[]},Oe={relevance:0,language:null,value:[]};++me<he;)r.getLanguage(ze=ve[me])&&((dt=f(ze,ae,$)).language=ze,dt.relevance>ce.relevance&&(ce=dt),dt.relevance>Oe.relevance&&(ce=Oe,Oe=dt));return ce.language&&(Oe.secondBest=ce),Oe},S.registerLanguage=function(ae,$){r.registerLanguage(ae,$)},S.listLanguages=function(){return r.listLanguages()},S.registerAlias=function(ae,$){var ve,se=ae;for(ve in $&&((se={})[ae]=$),se)r.registerAliases(se[ve],{languageName:ve})},M.prototype.addText=function(ae){var se,ve,$=this.stack;""!==ae&&((ve=(se=$[$.length-1]).children[se.children.length-1])&&"text"===ve.type?ve.value+=ae:se.children.push({type:"text",value:ae}))},M.prototype.addKeyword=function(ae,$){this.openNode($),this.addText(ae),this.closeNode()},M.prototype.addSublanguage=function(ae,$){var se=this.stack,ve=se[se.length-1],oe=ae.rootNode.children;ve.children=ve.children.concat($?{type:"element",tagName:"span",properties:{className:[$]},children:oe}:oe)},M.prototype.openNode=function(ae){var $=this.stack,oe={type:"element",tagName:"span",properties:{className:[this.options.classPrefix+ae]},children:[]};$[$.length-1].children.push(oe),$.push(oe)},M.prototype.closeNode=function(){this.stack.pop()},M.prototype.closeAllNodes=ue,M.prototype.finalize=ue,M.prototype.toHTML=function(){return""};var p="hljs-";function f(ae,$,se){var me,ve=r.configure({}),he=(se||{}).prefix;if("string"!=typeof ae)throw u("Expected `string` for name, got `%s`",ae);if(!r.getLanguage(ae))throw u("Unknown language: `%s` is not registered",ae);if("string"!=typeof $)throw u("Expected `string` for value, got `%s`",$);if(null==he&&(he=p),r.configure({__emitter:M,classPrefix:he}),me=r.highlight($,{language:ae,ignoreIllegals:!0}),r.configure(ve||{}),me.errorRaised)throw me.errorRaised;return{relevance:me.relevance,language:me.language,value:me.emitter.rootNode.children}}function M(ae){this.options=ae,this.rootNode={children:[]},this.stack=[this.rootNode]}function ue(){}},26431:function(v,S,i){!function(r){"use strict";r.defineLocale("af",{months:"Januarie_Februarie_Maart_April_Mei_Junie_Julie_Augustus_September_Oktober_November_Desember".split("_"),monthsShort:"Jan_Feb_Mrt_Apr_Mei_Jun_Jul_Aug_Sep_Okt_Nov_Des".split("_"),weekdays:"Sondag_Maandag_Dinsdag_Woensdag_Donderdag_Vrydag_Saterdag".split("_"),weekdaysShort:"Son_Maa_Din_Woe_Don_Vry_Sat".split("_"),weekdaysMin:"So_Ma_Di_Wo_Do_Vr_Sa".split("_"),meridiemParse:/vm|nm/i,isPM:function(p){return/^nm$/i.test(p)},meridiem:function(p,f,e){return p<12?e?"vm":"VM":e?"nm":"NM"},longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd, D MMMM YYYY HH:mm"},calendar:{sameDay:"[Vandag om] LT",nextDay:"[M\xf4re om] LT",nextWeek:"dddd [om] LT",lastDay:"[Gister om] LT",lastWeek:"[Laas] dddd [om] LT",sameElse:"L"},relativeTime:{future:"oor %s",past:"%s gelede",s:"'n paar sekondes",ss:"%d sekondes",m:"'n minuut",mm:"%d minute",h:"'n uur",hh:"%d ure",d:"'n dag",dd:"%d dae",M:"'n maand",MM:"%d maande",y:"'n jaar",yy:"%d jaar"},dayOfMonthOrdinalParse:/\d{1,2}(ste|de)/,ordinal:function(p){return p+(1===p||8===p||p>=20?"ste":"de")},week:{dow:1,doy:4}})}(i(16738))},1616:function(v,S,i){!function(r){"use strict";var u=function(y){return 0===y?0:1===y?1:2===y?2:y%100>=3&&y%100<=10?3:y%100>=11?4:5},p={s:["\u0623\u0642\u0644 \u0645\u0646 \u062b\u0627\u0646\u064a\u0629","\u062b\u0627\u0646\u064a\u0629 \u0648\u0627\u062d\u062f\u0629",["\u062b\u0627\u0646\u064a\u062a\u0627\u0646","\u062b\u0627\u0646\u064a\u062a\u064a\u0646"],"%d \u062b\u0648\u0627\u0646","%d \u062b\u0627\u0646\u064a\u0629","%d \u062b\u0627\u0646\u064a\u0629"],m:["\u0623\u0642\u0644 \u0645\u0646 \u062f\u0642\u064a\u0642\u0629","\u062f\u0642\u064a\u0642\u0629 \u0648\u0627\u062d\u062f\u0629",["\u062f\u0642\u064a\u0642\u062a\u0627\u0646","\u062f\u0642\u064a\u0642\u062a\u064a\u0646"],"%d \u062f\u0642\u0627\u0626\u0642","%d \u062f\u0642\u064a\u0642\u0629","%d \u062f\u0642\u064a\u0642\u0629"],h:["\u0623\u0642\u0644 \u0645\u0646 \u0633\u0627\u0639\u0629","\u0633\u0627\u0639\u0629 \u0648\u0627\u062d\u062f\u0629",["\u0633\u0627\u0639\u062a\u0627\u0646","\u0633\u0627\u0639\u062a\u064a\u0646"],"%d \u0633\u0627\u0639\u0627\u062a","%d \u0633\u0627\u0639\u0629","%d \u0633\u0627\u0639\u0629"],d:["\u0623\u0642\u0644 \u0645\u0646 \u064a\u0648\u0645","\u064a\u0648\u0645 \u0648\u0627\u062d\u062f",["\u064a\u0648\u0645\u0627\u0646","\u064a\u0648\u0645\u064a\u0646"],"%d \u0623\u064a\u0627\u0645","%d \u064a\u0648\u0645\u064b\u0627","%d \u064a\u0648\u0645"],M:["\u0623\u0642\u0644 \u0645\u0646 \u0634\u0647\u0631","\u0634\u0647\u0631 \u0648\u0627\u062d\u062f",["\u0634\u0647\u0631\u0627\u0646","\u0634\u0647\u0631\u064a\u0646"],"%d \u0623\u0634\u0647\u0631","%d \u0634\u0647\u0631\u0627","%d \u0634\u0647\u0631"],y:["\u0623\u0642\u0644 \u0645\u0646 \u0639\u0627\u0645","\u0639\u0627\u0645 \u0648\u0627\u062d\u062f",["\u0639\u0627\u0645\u0627\u0646","\u0639\u0627\u0645\u064a\u0646"],"%d \u0623\u0639\u0648\u0627\u0645","%d \u0639\u0627\u0645\u064b\u0627","%d \u0639\u0627\u0645"]},f=function(y){return function(T,M,R,F){var Z=u(T),J=p[y][u(T)];return 2===Z&&(J=J[M?0:1]),J.replace(/%d/i,T)}},e=["\u062c\u0627\u0646\u0641\u064a","\u0641\u064a\u0641\u0631\u064a","\u0645\u0627\u0631\u0633","\u0623\u0641\u0631\u064a\u0644","\u0645\u0627\u064a","\u062c\u0648\u0627\u0646","\u062c\u0648\u064a\u0644\u064a\u0629","\u0623\u0648\u062a","\u0633\u0628\u062a\u0645\u0628\u0631","\u0623\u0643\u062a\u0648\u0628\u0631","\u0646\u0648\u0641\u0645\u0628\u0631","\u062f\u064a\u0633\u0645\u0628\u0631"];r.defineLocale("ar-dz",{months:e,monthsShort:e,weekdays:"\u0627\u0644\u0623\u062d\u062f_\u0627\u0644\u0625\u062b\u0646\u064a\u0646_\u0627\u0644\u062b\u0644\u0627\u062b\u0627\u0621_\u0627\u0644\u0623\u0631\u0628\u0639\u0627\u0621_\u0627\u0644\u062e\u0645\u064a\u0633_\u0627\u0644\u062c\u0645\u0639\u0629_\u0627\u0644\u0633\u0628\u062a".split("_"),weekdaysShort:"\u0623\u062d\u062f_\u0625\u062b\u0646\u064a\u0646_\u062b\u0644\u0627\u062b\u0627\u0621_\u0623\u0631\u0628\u0639\u0627\u0621_\u062e\u0645\u064a\u0633_\u062c\u0645\u0639\u0629_\u0633\u0628\u062a".split("_"),weekdaysMin:"\u062d_\u0646_\u062b_\u0631_\u062e_\u062c_\u0633".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"D/\u200fM/\u200fYYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd D MMMM YYYY HH:mm"},meridiemParse:/\u0635|\u0645/,isPM:function(y){return"\u0645"===y},meridiem:function(y,T,M){return y<12?"\u0635":"\u0645"},calendar:{sameDay:"[\u0627\u0644\u064a\u0648\u0645 \u0639\u0646\u062f \u0627\u0644\u0633\u0627\u0639\u0629] LT",nextDay:"[\u063a\u062f\u064b\u0627 \u0639\u0646\u062f \u0627\u0644\u0633\u0627\u0639\u0629] LT",nextWeek:"dddd [\u0639\u0646\u062f \u0627\u0644\u0633\u0627\u0639\u0629] LT",lastDay:"[\u0623\u0645\u0633 \u0639\u0646\u062f \u0627\u0644\u0633\u0627\u0639\u0629] LT",lastWeek:"dddd [\u0639\u0646\u062f \u0627\u0644\u0633\u0627\u0639\u0629] LT",sameElse:"L"},relativeTime:{future:"\u0628\u0639\u062f %s",past:"\u0645\u0646\u0630 %s",s:f("s"),ss:f("s"),m:f("m"),mm:f("m"),h:f("h"),hh:f("h"),d:f("d"),dd:f("d"),M:f("M"),MM:f("M"),y:f("y"),yy:f("y")},postformat:function(y){return y.replace(/,/g,"\u060c")},week:{dow:0,doy:4}})}(i(16738))},9759:function(v,S,i){!function(r){"use strict";r.defineLocale("ar-kw",{months:"\u064a\u0646\u0627\u064a\u0631_\u0641\u0628\u0631\u0627\u064a\u0631_\u0645\u0627\u0631\u0633_\u0623\u0628\u0631\u064a\u0644_\u0645\u0627\u064a_\u064a\u0648\u0646\u064a\u0648_\u064a\u0648\u0644\u064a\u0648\u0632_\u063a\u0634\u062a_\u0634\u062a\u0646\u0628\u0631_\u0623\u0643\u062a\u0648\u0628\u0631_\u0646\u0648\u0646\u0628\u0631_\u062f\u062c\u0646\u0628\u0631".split("_"),monthsShort:"\u064a\u0646\u0627\u064a\u0631_\u0641\u0628\u0631\u0627\u064a\u0631_\u0645\u0627\u0631\u0633_\u0623\u0628\u0631\u064a\u0644_\u0645\u0627\u064a_\u064a\u0648\u0646\u064a\u0648_\u064a\u0648\u0644\u064a\u0648\u0632_\u063a\u0634\u062a_\u0634\u062a\u0646\u0628\u0631_\u0623\u0643\u062a\u0648\u0628\u0631_\u0646\u0648\u0646\u0628\u0631_\u062f\u062c\u0646\u0628\u0631".split("_"),weekdays:"\u0627\u0644\u0623\u062d\u062f_\u0627\u0644\u0625\u062a\u0646\u064a\u0646_\u0627\u0644\u062b\u0644\u0627\u062b\u0627\u0621_\u0627\u0644\u0623\u0631\u0628\u0639\u0627\u0621_\u0627\u0644\u062e\u0645\u064a\u0633_\u0627\u0644\u062c\u0645\u0639\u0629_\u0627\u0644\u0633\u0628\u062a".split("_"),weekdaysShort:"\u0627\u062d\u062f_\u0627\u062a\u0646\u064a\u0646_\u062b\u0644\u0627\u062b\u0627\u0621_\u0627\u0631\u0628\u0639\u0627\u0621_\u062e\u0645\u064a\u0633_\u062c\u0645\u0639\u0629_\u0633\u0628\u062a".split("_"),weekdaysMin:"\u062d_\u0646_\u062b_\u0631_\u062e_\u062c_\u0633".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd D MMMM YYYY HH:mm"},calendar:{sameDay:"[\u0627\u0644\u064a\u0648\u0645 \u0639\u0644\u0649 \u0627\u0644\u0633\u0627\u0639\u0629] LT",nextDay:"[\u063a\u062f\u0627 \u0639\u0644\u0649 \u0627\u0644\u0633\u0627\u0639\u0629] LT",nextWeek:"dddd [\u0639\u0644\u0649 \u0627\u0644\u0633\u0627\u0639\u0629] LT",lastDay:"[\u0623\u0645\u0633 \u0639\u0644\u0649 \u0627\u0644\u0633\u0627\u0639\u0629] LT",lastWeek:"dddd [\u0639\u0644\u0649 \u0627\u0644\u0633\u0627\u0639\u0629] LT",sameElse:"L"},relativeTime:{future:"\u0641\u064a %s",past:"\u0645\u0646\u0630 %s",s:"\u062b\u0648\u0627\u0646",ss:"%d \u062b\u0627\u0646\u064a\u0629",m:"\u062f\u0642\u064a\u0642\u0629",mm:"%d \u062f\u0642\u0627\u0626\u0642",h:"\u0633\u0627\u0639\u0629",hh:"%d \u0633\u0627\u0639\u0627\u062a",d:"\u064a\u0648\u0645",dd:"%d \u0623\u064a\u0627\u0645",M:"\u0634\u0647\u0631",MM:"%d \u0623\u0634\u0647\u0631",y:"\u0633\u0646\u0629",yy:"%d \u0633\u0646\u0648\u0627\u062a"},week:{dow:0,doy:12}})}(i(16738))},43160:function(v,S,i){!function(r){"use strict";var u={1:"1",2:"2",3:"3",4:"4",5:"5",6:"6",7:"7",8:"8",9:"9",0:"0"},p=function(T){return 0===T?0:1===T?1:2===T?2:T%100>=3&&T%100<=10?3:T%100>=11?4:5},f={s:["\u0623\u0642\u0644 \u0645\u0646 \u062b\u0627\u0646\u064a\u0629","\u062b\u0627\u0646\u064a\u0629 \u0648\u0627\u062d\u062f\u0629",["\u062b\u0627\u0646\u064a\u062a\u0627\u0646","\u062b\u0627\u0646\u064a\u062a\u064a\u0646"],"%d \u062b\u0648\u0627\u0646","%d \u062b\u0627\u0646\u064a\u0629","%d \u062b\u0627\u0646\u064a\u0629"],m:["\u0623\u0642\u0644 \u0645\u0646 \u062f\u0642\u064a\u0642\u0629","\u062f\u0642\u064a\u0642\u0629 \u0648\u0627\u062d\u062f\u0629",["\u062f\u0642\u064a\u0642\u062a\u0627\u0646","\u062f\u0642\u064a\u0642\u062a\u064a\u0646"],"%d \u062f\u0642\u0627\u0626\u0642","%d \u062f\u0642\u064a\u0642\u0629","%d \u062f\u0642\u064a\u0642\u0629"],h:["\u0623\u0642\u0644 \u0645\u0646 \u0633\u0627\u0639\u0629","\u0633\u0627\u0639\u0629 \u0648\u0627\u062d\u062f\u0629",["\u0633\u0627\u0639\u062a\u0627\u0646","\u0633\u0627\u0639\u062a\u064a\u0646"],"%d \u0633\u0627\u0639\u0627\u062a","%d \u0633\u0627\u0639\u0629","%d \u0633\u0627\u0639\u0629"],d:["\u0623\u0642\u0644 \u0645\u0646 \u064a\u0648\u0645","\u064a\u0648\u0645 \u0648\u0627\u062d\u062f",["\u064a\u0648\u0645\u0627\u0646","\u064a\u0648\u0645\u064a\u0646"],"%d \u0623\u064a\u0627\u0645","%d \u064a\u0648\u0645\u064b\u0627","%d \u064a\u0648\u0645"],M:["\u0623\u0642\u0644 \u0645\u0646 \u0634\u0647\u0631","\u0634\u0647\u0631 \u0648\u0627\u062d\u062f",["\u0634\u0647\u0631\u0627\u0646","\u0634\u0647\u0631\u064a\u0646"],"%d \u0623\u0634\u0647\u0631","%d \u0634\u0647\u0631\u0627","%d \u0634\u0647\u0631"],y:["\u0623\u0642\u0644 \u0645\u0646 \u0639\u0627\u0645","\u0639\u0627\u0645 \u0648\u0627\u062d\u062f",["\u0639\u0627\u0645\u0627\u0646","\u0639\u0627\u0645\u064a\u0646"],"%d \u0623\u0639\u0648\u0627\u0645","%d \u0639\u0627\u0645\u064b\u0627","%d \u0639\u0627\u0645"]},e=function(T){return function(M,R,F,Z){var J=p(M),Q=f[T][p(M)];return 2===J&&(Q=Q[R?0:1]),Q.replace(/%d/i,M)}},_=["\u064a\u0646\u0627\u064a\u0631","\u0641\u0628\u0631\u0627\u064a\u0631","\u0645\u0627\u0631\u0633","\u0623\u0628\u0631\u064a\u0644","\u0645\u0627\u064a\u0648","\u064a\u0648\u0646\u064a\u0648","\u064a\u0648\u0644\u064a\u0648","\u0623\u063a\u0633\u0637\u0633","\u0633\u0628\u062a\u0645\u0628\u0631","\u0623\u0643\u062a\u0648\u0628\u0631","\u0646\u0648\u0641\u0645\u0628\u0631","\u062f\u064a\u0633\u0645\u0628\u0631"];r.defineLocale("ar-ly",{months:_,monthsShort:_,weekdays:"\u0627\u0644\u0623\u062d\u062f_\u0627\u0644\u0625\u062b\u0646\u064a\u0646_\u0627\u0644\u062b\u0644\u0627\u062b\u0627\u0621_\u0627\u0644\u0623\u0631\u0628\u0639\u0627\u0621_\u0627\u0644\u062e\u0645\u064a\u0633_\u0627\u0644\u062c\u0645\u0639\u0629_\u0627\u0644\u0633\u0628\u062a".split("_"),weekdaysShort:"\u0623\u062d\u062f_\u0625\u062b\u0646\u064a\u0646_\u062b\u0644\u0627\u062b\u0627\u0621_\u0623\u0631\u0628\u0639\u0627\u0621_\u062e\u0645\u064a\u0633_\u062c\u0645\u0639\u0629_\u0633\u0628\u062a".split("_"),weekdaysMin:"\u062d_\u0646_\u062b_\u0631_\u062e_\u062c_\u0633".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"D/\u200fM/\u200fYYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd D MMMM YYYY HH:mm"},meridiemParse:/\u0635|\u0645/,isPM:function(T){return"\u0645"===T},meridiem:function(T,M,R){return T<12?"\u0635":"\u0645"},calendar:{sameDay:"[\u0627\u0644\u064a\u0648\u0645 \u0639\u0646\u062f \u0627\u0644\u0633\u0627\u0639\u0629] LT",nextDay:"[\u063a\u062f\u064b\u0627 \u0639\u0646\u062f \u0627\u0644\u0633\u0627\u0639\u0629] LT",nextWeek:"dddd [\u0639\u0646\u062f \u0627\u0644\u0633\u0627\u0639\u0629] LT",lastDay:"[\u0623\u0645\u0633 \u0639\u0646\u062f \u0627\u0644\u0633\u0627\u0639\u0629] LT",lastWeek:"dddd [\u0639\u0646\u062f \u0627\u0644\u0633\u0627\u0639\u0629] LT",sameElse:"L"},relativeTime:{future:"\u0628\u0639\u062f %s",past:"\u0645\u0646\u0630 %s",s:e("s"),ss:e("s"),m:e("m"),mm:e("m"),h:e("h"),hh:e("h"),d:e("d"),dd:e("d"),M:e("M"),MM:e("M"),y:e("y"),yy:e("y")},preparse:function(T){return T.replace(/\u060c/g,",")},postformat:function(T){return T.replace(/\d/g,function(M){return u[M]}).replace(/,/g,"\u060c")},week:{dow:6,doy:12}})}(i(16738))},62551:function(v,S,i){!function(r){"use strict";r.defineLocale("ar-ma",{months:"\u064a\u0646\u0627\u064a\u0631_\u0641\u0628\u0631\u0627\u064a\u0631_\u0645\u0627\u0631\u0633_\u0623\u0628\u0631\u064a\u0644_\u0645\u0627\u064a_\u064a\u0648\u0646\u064a\u0648_\u064a\u0648\u0644\u064a\u0648\u0632_\u063a\u0634\u062a_\u0634\u062a\u0646\u0628\u0631_\u0623\u0643\u062a\u0648\u0628\u0631_\u0646\u0648\u0646\u0628\u0631_\u062f\u062c\u0646\u0628\u0631".split("_"),monthsShort:"\u064a\u0646\u0627\u064a\u0631_\u0641\u0628\u0631\u0627\u064a\u0631_\u0645\u0627\u0631\u0633_\u0623\u0628\u0631\u064a\u0644_\u0645\u0627\u064a_\u064a\u0648\u0646\u064a\u0648_\u064a\u0648\u0644\u064a\u0648\u0632_\u063a\u0634\u062a_\u0634\u062a\u0646\u0628\u0631_\u0623\u0643\u062a\u0648\u0628\u0631_\u0646\u0648\u0646\u0628\u0631_\u062f\u062c\u0646\u0628\u0631".split("_"),weekdays:"\u0627\u0644\u0623\u062d\u062f_\u0627\u0644\u0625\u062b\u0646\u064a\u0646_\u0627\u0644\u062b\u0644\u0627\u062b\u0627\u0621_\u0627\u0644\u0623\u0631\u0628\u0639\u0627\u0621_\u0627\u0644\u062e\u0645\u064a\u0633_\u0627\u0644\u062c\u0645\u0639\u0629_\u0627\u0644\u0633\u0628\u062a".split("_"),weekdaysShort:"\u0627\u062d\u062f_\u0627\u062b\u0646\u064a\u0646_\u062b\u0644\u0627\u062b\u0627\u0621_\u0627\u0631\u0628\u0639\u0627\u0621_\u062e\u0645\u064a\u0633_\u062c\u0645\u0639\u0629_\u0633\u0628\u062a".split("_"),weekdaysMin:"\u062d_\u0646_\u062b_\u0631_\u062e_\u062c_\u0633".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd D MMMM YYYY HH:mm"},calendar:{sameDay:"[\u0627\u0644\u064a\u0648\u0645 \u0639\u0644\u0649 \u0627\u0644\u0633\u0627\u0639\u0629] LT",nextDay:"[\u063a\u062f\u0627 \u0639\u0644\u0649 \u0627\u0644\u0633\u0627\u0639\u0629] LT",nextWeek:"dddd [\u0639\u0644\u0649 \u0627\u0644\u0633\u0627\u0639\u0629] LT",lastDay:"[\u0623\u0645\u0633 \u0639\u0644\u0649 \u0627\u0644\u0633\u0627\u0639\u0629] LT",lastWeek:"dddd [\u0639\u0644\u0649 \u0627\u0644\u0633\u0627\u0639\u0629] LT",sameElse:"L"},relativeTime:{future:"\u0641\u064a %s",past:"\u0645\u0646\u0630 %s",s:"\u062b\u0648\u0627\u0646",ss:"%d \u062b\u0627\u0646\u064a\u0629",m:"\u062f\u0642\u064a\u0642\u0629",mm:"%d \u062f\u0642\u0627\u0626\u0642",h:"\u0633\u0627\u0639\u0629",hh:"%d \u0633\u0627\u0639\u0627\u062a",d:"\u064a\u0648\u0645",dd:"%d \u0623\u064a\u0627\u0645",M:"\u0634\u0647\u0631",MM:"%d \u0623\u0634\u0647\u0631",y:"\u0633\u0646\u0629",yy:"%d \u0633\u0646\u0648\u0627\u062a"},week:{dow:1,doy:4}})}(i(16738))},79989:function(v,S,i){!function(r){"use strict";var u={1:"\u0661",2:"\u0662",3:"\u0663",4:"\u0664",5:"\u0665",6:"\u0666",7:"\u0667",8:"\u0668",9:"\u0669",0:"\u0660"},p={"\u0661":"1","\u0662":"2","\u0663":"3","\u0664":"4","\u0665":"5","\u0666":"6","\u0667":"7","\u0668":"8","\u0669":"9","\u0660":"0"};r.defineLocale("ar-sa",{months:"\u064a\u0646\u0627\u064a\u0631_\u0641\u0628\u0631\u0627\u064a\u0631_\u0645\u0627\u0631\u0633_\u0623\u0628\u0631\u064a\u0644_\u0645\u0627\u064a\u0648_\u064a\u0648\u0646\u064a\u0648_\u064a\u0648\u0644\u064a\u0648_\u0623\u063a\u0633\u0637\u0633_\u0633\u0628\u062a\u0645\u0628\u0631_\u0623\u0643\u062a\u0648\u0628\u0631_\u0646\u0648\u0641\u0645\u0628\u0631_\u062f\u064a\u0633\u0645\u0628\u0631".split("_"),monthsShort:"\u064a\u0646\u0627\u064a\u0631_\u0641\u0628\u0631\u0627\u064a\u0631_\u0645\u0627\u0631\u0633_\u0623\u0628\u0631\u064a\u0644_\u0645\u0627\u064a\u0648_\u064a\u0648\u0646\u064a\u0648_\u064a\u0648\u0644\u064a\u0648_\u0623\u063a\u0633\u0637\u0633_\u0633\u0628\u062a\u0645\u0628\u0631_\u0623\u0643\u062a\u0648\u0628\u0631_\u0646\u0648\u0641\u0645\u0628\u0631_\u062f\u064a\u0633\u0645\u0628\u0631".split("_"),weekdays:"\u0627\u0644\u0623\u062d\u062f_\u0627\u0644\u0625\u062b\u0646\u064a\u0646_\u0627\u0644\u062b\u0644\u0627\u062b\u0627\u0621_\u0627\u0644\u0623\u0631\u0628\u0639\u0627\u0621_\u0627\u0644\u062e\u0645\u064a\u0633_\u0627\u0644\u062c\u0645\u0639\u0629_\u0627\u0644\u0633\u0628\u062a".split("_"),weekdaysShort:"\u0623\u062d\u062f_\u0625\u062b\u0646\u064a\u0646_\u062b\u0644\u0627\u062b\u0627\u0621_\u0623\u0631\u0628\u0639\u0627\u0621_\u062e\u0645\u064a\u0633_\u062c\u0645\u0639\u0629_\u0633\u0628\u062a".split("_"),weekdaysMin:"\u062d_\u0646_\u062b_\u0631_\u062e_\u062c_\u0633".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd D MMMM YYYY HH:mm"},meridiemParse:/\u0635|\u0645/,isPM:function(e){return"\u0645"===e},meridiem:function(e,_,y){return e<12?"\u0635":"\u0645"},calendar:{sameDay:"[\u0627\u0644\u064a\u0648\u0645 \u0639\u0644\u0649 \u0627\u0644\u0633\u0627\u0639\u0629] LT",nextDay:"[\u063a\u062f\u0627 \u0639\u0644\u0649 \u0627\u0644\u0633\u0627\u0639\u0629] LT",nextWeek:"dddd [\u0639\u0644\u0649 \u0627\u0644\u0633\u0627\u0639\u0629] LT",lastDay:"[\u0623\u0645\u0633 \u0639\u0644\u0649 \u0627\u0644\u0633\u0627\u0639\u0629] LT",lastWeek:"dddd [\u0639\u0644\u0649 \u0627\u0644\u0633\u0627\u0639\u0629] LT",sameElse:"L"},relativeTime:{future:"\u0641\u064a %s",past:"\u0645\u0646\u0630 %s",s:"\u062b\u0648\u0627\u0646",ss:"%d \u062b\u0627\u0646\u064a\u0629",m:"\u062f\u0642\u064a\u0642\u0629",mm:"%d \u062f\u0642\u0627\u0626\u0642",h:"\u0633\u0627\u0639\u0629",hh:"%d \u0633\u0627\u0639\u0627\u062a",d:"\u064a\u0648\u0645",dd:"%d \u0623\u064a\u0627\u0645",M:"\u0634\u0647\u0631",MM:"%d \u0623\u0634\u0647\u0631",y:"\u0633\u0646\u0629",yy:"%d \u0633\u0646\u0648\u0627\u062a"},preparse:function(e){return e.replace(/[\u0661\u0662\u0663\u0664\u0665\u0666\u0667\u0668\u0669\u0660]/g,function(_){return p[_]}).replace(/\u060c/g,",")},postformat:function(e){return e.replace(/\d/g,function(_){return u[_]}).replace(/,/g,"\u060c")},week:{dow:0,doy:6}})}(i(16738))},6962:function(v,S,i){!function(r){"use strict";r.defineLocale("ar-tn",{months:"\u062c\u0627\u0646\u0641\u064a_\u0641\u064a\u0641\u0631\u064a_\u0645\u0627\u0631\u0633_\u0623\u0641\u0631\u064a\u0644_\u0645\u0627\u064a_\u062c\u0648\u0627\u0646_\u062c\u0648\u064a\u0644\u064a\u0629_\u0623\u0648\u062a_\u0633\u0628\u062a\u0645\u0628\u0631_\u0623\u0643\u062a\u0648\u0628\u0631_\u0646\u0648\u0641\u0645\u0628\u0631_\u062f\u064a\u0633\u0645\u0628\u0631".split("_"),monthsShort:"\u062c\u0627\u0646\u0641\u064a_\u0641\u064a\u0641\u0631\u064a_\u0645\u0627\u0631\u0633_\u0623\u0641\u0631\u064a\u0644_\u0645\u0627\u064a_\u062c\u0648\u0627\u0646_\u062c\u0648\u064a\u0644\u064a\u0629_\u0623\u0648\u062a_\u0633\u0628\u062a\u0645\u0628\u0631_\u0623\u0643\u062a\u0648\u0628\u0631_\u0646\u0648\u0641\u0645\u0628\u0631_\u062f\u064a\u0633\u0645\u0628\u0631".split("_"),weekdays:"\u0627\u0644\u0623\u062d\u062f_\u0627\u0644\u0625\u062b\u0646\u064a\u0646_\u0627\u0644\u062b\u0644\u0627\u062b\u0627\u0621_\u0627\u0644\u0623\u0631\u0628\u0639\u0627\u0621_\u0627\u0644\u062e\u0645\u064a\u0633_\u0627\u0644\u062c\u0645\u0639\u0629_\u0627\u0644\u0633\u0628\u062a".split("_"),weekdaysShort:"\u0623\u062d\u062f_\u0625\u062b\u0646\u064a\u0646_\u062b\u0644\u0627\u062b\u0627\u0621_\u0623\u0631\u0628\u0639\u0627\u0621_\u062e\u0645\u064a\u0633_\u062c\u0645\u0639\u0629_\u0633\u0628\u062a".split("_"),weekdaysMin:"\u062d_\u0646_\u062b_\u0631_\u062e_\u062c_\u0633".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd D MMMM YYYY HH:mm"},calendar:{sameDay:"[\u0627\u0644\u064a\u0648\u0645 \u0639\u0644\u0649 \u0627\u0644\u0633\u0627\u0639\u0629] LT",nextDay:"[\u063a\u062f\u0627 \u0639\u0644\u0649 \u0627\u0644\u0633\u0627\u0639\u0629] LT",nextWeek:"dddd [\u0639\u0644\u0649 \u0627\u0644\u0633\u0627\u0639\u0629] LT",lastDay:"[\u0623\u0645\u0633 \u0639\u0644\u0649 \u0627\u0644\u0633\u0627\u0639\u0629] LT",lastWeek:"dddd [\u0639\u0644\u0649 \u0627\u0644\u0633\u0627\u0639\u0629] LT",sameElse:"L"},relativeTime:{future:"\u0641\u064a %s",past:"\u0645\u0646\u0630 %s",s:"\u062b\u0648\u0627\u0646",ss:"%d \u062b\u0627\u0646\u064a\u0629",m:"\u062f\u0642\u064a\u0642\u0629",mm:"%d \u062f\u0642\u0627\u0626\u0642",h:"\u0633\u0627\u0639\u0629",hh:"%d \u0633\u0627\u0639\u0627\u062a",d:"\u064a\u0648\u0645",dd:"%d \u0623\u064a\u0627\u0645",M:"\u0634\u0647\u0631",MM:"%d \u0623\u0634\u0647\u0631",y:"\u0633\u0646\u0629",yy:"%d \u0633\u0646\u0648\u0627\u062a"},week:{dow:1,doy:4}})}(i(16738))},81286:function(v,S,i){!function(r){"use strict";var u={1:"\u0661",2:"\u0662",3:"\u0663",4:"\u0664",5:"\u0665",6:"\u0666",7:"\u0667",8:"\u0668",9:"\u0669",0:"\u0660"},p={"\u0661":"1","\u0662":"2","\u0663":"3","\u0664":"4","\u0665":"5","\u0666":"6","\u0667":"7","\u0668":"8","\u0669":"9","\u0660":"0"},f=function(M){return 0===M?0:1===M?1:2===M?2:M%100>=3&&M%100<=10?3:M%100>=11?4:5},e={s:["\u0623\u0642\u0644 \u0645\u0646 \u062b\u0627\u0646\u064a\u0629","\u062b\u0627\u0646\u064a\u0629 \u0648\u0627\u062d\u062f\u0629",["\u062b\u0627\u0646\u064a\u062a\u0627\u0646","\u062b\u0627\u0646\u064a\u062a\u064a\u0646"],"%d \u062b\u0648\u0627\u0646","%d \u062b\u0627\u0646\u064a\u0629","%d \u062b\u0627\u0646\u064a\u0629"],m:["\u0623\u0642\u0644 \u0645\u0646 \u062f\u0642\u064a\u0642\u0629","\u062f\u0642\u064a\u0642\u0629 \u0648\u0627\u062d\u062f\u0629",["\u062f\u0642\u064a\u0642\u062a\u0627\u0646","\u062f\u0642\u064a\u0642\u062a\u064a\u0646"],"%d \u062f\u0642\u0627\u0626\u0642","%d \u062f\u0642\u064a\u0642\u0629","%d \u062f\u0642\u064a\u0642\u0629"],h:["\u0623\u0642\u0644 \u0645\u0646 \u0633\u0627\u0639\u0629","\u0633\u0627\u0639\u0629 \u0648\u0627\u062d\u062f\u0629",["\u0633\u0627\u0639\u062a\u0627\u0646","\u0633\u0627\u0639\u062a\u064a\u0646"],"%d \u0633\u0627\u0639\u0627\u062a","%d \u0633\u0627\u0639\u0629","%d \u0633\u0627\u0639\u0629"],d:["\u0623\u0642\u0644 \u0645\u0646 \u064a\u0648\u0645","\u064a\u0648\u0645 \u0648\u0627\u062d\u062f",["\u064a\u0648\u0645\u0627\u0646","\u064a\u0648\u0645\u064a\u0646"],"%d \u0623\u064a\u0627\u0645","%d \u064a\u0648\u0645\u064b\u0627","%d \u064a\u0648\u0645"],M:["\u0623\u0642\u0644 \u0645\u0646 \u0634\u0647\u0631","\u0634\u0647\u0631 \u0648\u0627\u062d\u062f",["\u0634\u0647\u0631\u0627\u0646","\u0634\u0647\u0631\u064a\u0646"],"%d \u0623\u0634\u0647\u0631","%d \u0634\u0647\u0631\u0627","%d \u0634\u0647\u0631"],y:["\u0623\u0642\u0644 \u0645\u0646 \u0639\u0627\u0645","\u0639\u0627\u0645 \u0648\u0627\u062d\u062f",["\u0639\u0627\u0645\u0627\u0646","\u0639\u0627\u0645\u064a\u0646"],"%d \u0623\u0639\u0648\u0627\u0645","%d \u0639\u0627\u0645\u064b\u0627","%d \u0639\u0627\u0645"]},_=function(M){return function(R,F,Z,J){var Q=f(R),ee=e[M][f(R)];return 2===Q&&(ee=ee[F?0:1]),ee.replace(/%d/i,R)}},y=["\u064a\u0646\u0627\u064a\u0631","\u0641\u0628\u0631\u0627\u064a\u0631","\u0645\u0627\u0631\u0633","\u0623\u0628\u0631\u064a\u0644","\u0645\u0627\u064a\u0648","\u064a\u0648\u0646\u064a\u0648","\u064a\u0648\u0644\u064a\u0648","\u0623\u063a\u0633\u0637\u0633","\u0633\u0628\u062a\u0645\u0628\u0631","\u0623\u0643\u062a\u0648\u0628\u0631","\u0646\u0648\u0641\u0645\u0628\u0631","\u062f\u064a\u0633\u0645\u0628\u0631"];r.defineLocale("ar",{months:y,monthsShort:y,weekdays:"\u0627\u0644\u0623\u062d\u062f_\u0627\u0644\u0625\u062b\u0646\u064a\u0646_\u0627\u0644\u062b\u0644\u0627\u062b\u0627\u0621_\u0627\u0644\u0623\u0631\u0628\u0639\u0627\u0621_\u0627\u0644\u062e\u0645\u064a\u0633_\u0627\u0644\u062c\u0645\u0639\u0629_\u0627\u0644\u0633\u0628\u062a".split("_"),weekdaysShort:"\u0623\u062d\u062f_\u0625\u062b\u0646\u064a\u0646_\u062b\u0644\u0627\u062b\u0627\u0621_\u0623\u0631\u0628\u0639\u0627\u0621_\u062e\u0645\u064a\u0633_\u062c\u0645\u0639\u0629_\u0633\u0628\u062a".split("_"),weekdaysMin:"\u062d_\u0646_\u062b_\u0631_\u062e_\u062c_\u0633".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"D/\u200fM/\u200fYYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd D MMMM YYYY HH:mm"},meridiemParse:/\u0635|\u0645/,isPM:function(M){return"\u0645"===M},meridiem:function(M,R,F){return M<12?"\u0635":"\u0645"},calendar:{sameDay:"[\u0627\u0644\u064a\u0648\u0645 \u0639\u0646\u062f \u0627\u0644\u0633\u0627\u0639\u0629] LT",nextDay:"[\u063a\u062f\u064b\u0627 \u0639\u0646\u062f \u0627\u0644\u0633\u0627\u0639\u0629] LT",nextWeek:"dddd [\u0639\u0646\u062f \u0627\u0644\u0633\u0627\u0639\u0629] LT",lastDay:"[\u0623\u0645\u0633 \u0639\u0646\u062f \u0627\u0644\u0633\u0627\u0639\u0629] LT",lastWeek:"dddd [\u0639\u0646\u062f \u0627\u0644\u0633\u0627\u0639\u0629] LT",sameElse:"L"},relativeTime:{future:"\u0628\u0639\u062f %s",past:"\u0645\u0646\u0630 %s",s:_("s"),ss:_("s"),m:_("m"),mm:_("m"),h:_("h"),hh:_("h"),d:_("d"),dd:_("d"),M:_("M"),MM:_("M"),y:_("y"),yy:_("y")},preparse:function(M){return M.replace(/[\u0661\u0662\u0663\u0664\u0665\u0666\u0667\u0668\u0669\u0660]/g,function(R){return p[R]}).replace(/\u060c/g,",")},postformat:function(M){return M.replace(/\d/g,function(R){return u[R]}).replace(/,/g,"\u060c")},week:{dow:6,doy:12}})}(i(16738))},15887:function(v,S,i){!function(r){"use strict";var u={1:"-inci",5:"-inci",8:"-inci",70:"-inci",80:"-inci",2:"-nci",7:"-nci",20:"-nci",50:"-nci",3:"-\xfcnc\xfc",4:"-\xfcnc\xfc",100:"-\xfcnc\xfc",6:"-nc\u0131",9:"-uncu",10:"-uncu",30:"-uncu",60:"-\u0131nc\u0131",90:"-\u0131nc\u0131"};r.defineLocale("az",{months:"yanvar_fevral_mart_aprel_may_iyun_iyul_avqust_sentyabr_oktyabr_noyabr_dekabr".split("_"),monthsShort:"yan_fev_mar_apr_may_iyn_iyl_avq_sen_okt_noy_dek".split("_"),weekdays:"Bazar_Bazar ert\u0259si_\xc7\u0259r\u015f\u0259nb\u0259 ax\u015fam\u0131_\xc7\u0259r\u015f\u0259nb\u0259_C\xfcm\u0259 ax\u015fam\u0131_C\xfcm\u0259_\u015e\u0259nb\u0259".split("_"),weekdaysShort:"Baz_BzE_\xc7Ax_\xc7\u0259r_CAx_C\xfcm_\u015e\u0259n".split("_"),weekdaysMin:"Bz_BE_\xc7A_\xc7\u0259_CA_C\xfc_\u015e\u0259".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD.MM.YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd, D MMMM YYYY HH:mm"},calendar:{sameDay:"[bug\xfcn saat] LT",nextDay:"[sabah saat] LT",nextWeek:"[g\u0259l\u0259n h\u0259ft\u0259] dddd [saat] LT",lastDay:"[d\xfcn\u0259n] LT",lastWeek:"[ke\xe7\u0259n h\u0259ft\u0259] dddd [saat] LT",sameElse:"L"},relativeTime:{future:"%s sonra",past:"%s \u0259vv\u0259l",s:"bir ne\xe7\u0259 saniy\u0259",ss:"%d saniy\u0259",m:"bir d\u0259qiq\u0259",mm:"%d d\u0259qiq\u0259",h:"bir saat",hh:"%d saat",d:"bir g\xfcn",dd:"%d g\xfcn",M:"bir ay",MM:"%d ay",y:"bir il",yy:"%d il"},meridiemParse:/gec\u0259|s\u0259h\u0259r|g\xfcnd\xfcz|ax\u015fam/,isPM:function(f){return/^(g\xfcnd\xfcz|ax\u015fam)$/.test(f)},meridiem:function(f,e,_){return f<4?"gec\u0259":f<12?"s\u0259h\u0259r":f<17?"g\xfcnd\xfcz":"ax\u015fam"},dayOfMonthOrdinalParse:/\d{1,2}-(\u0131nc\u0131|inci|nci|\xfcnc\xfc|nc\u0131|uncu)/,ordinal:function(f){if(0===f)return f+"-\u0131nc\u0131";var e=f%10;return f+(u[e]||u[f%100-e]||u[f>=100?100:null])},week:{dow:1,doy:7}})}(i(16738))},14572:function(v,S,i){!function(r){"use strict";function p(e,_,y){return"m"===y?_?"\u0445\u0432\u0456\u043b\u0456\u043d\u0430":"\u0445\u0432\u0456\u043b\u0456\u043d\u0443":"h"===y?_?"\u0433\u0430\u0434\u0437\u0456\u043d\u0430":"\u0433\u0430\u0434\u0437\u0456\u043d\u0443":e+" "+function(e,_){var y=e.split("_");return _%10==1&&_%100!=11?y[0]:_%10>=2&&_%10<=4&&(_%100<10||_%100>=20)?y[1]:y[2]}({ss:_?"\u0441\u0435\u043a\u0443\u043d\u0434\u0430_\u0441\u0435\u043a\u0443\u043d\u0434\u044b_\u0441\u0435\u043a\u0443\u043d\u0434":"\u0441\u0435\u043a\u0443\u043d\u0434\u0443_\u0441\u0435\u043a\u0443\u043d\u0434\u044b_\u0441\u0435\u043a\u0443\u043d\u0434",mm:_?"\u0445\u0432\u0456\u043b\u0456\u043d\u0430_\u0445\u0432\u0456\u043b\u0456\u043d\u044b_\u0445\u0432\u0456\u043b\u0456\u043d":"\u0445\u0432\u0456\u043b\u0456\u043d\u0443_\u0445\u0432\u0456\u043b\u0456\u043d\u044b_\u0445\u0432\u0456\u043b\u0456\u043d",hh:_?"\u0433\u0430\u0434\u0437\u0456\u043d\u0430_\u0433\u0430\u0434\u0437\u0456\u043d\u044b_\u0433\u0430\u0434\u0437\u0456\u043d":"\u0433\u0430\u0434\u0437\u0456\u043d\u0443_\u0433\u0430\u0434\u0437\u0456\u043d\u044b_\u0433\u0430\u0434\u0437\u0456\u043d",dd:"\u0434\u0437\u0435\u043d\u044c_\u0434\u043d\u0456_\u0434\u0437\u0451\u043d",MM:"\u043c\u0435\u0441\u044f\u0446_\u043c\u0435\u0441\u044f\u0446\u044b_\u043c\u0435\u0441\u044f\u0446\u0430\u045e",yy:"\u0433\u043e\u0434_\u0433\u0430\u0434\u044b_\u0433\u0430\u0434\u043e\u045e"}[y],+e)}r.defineLocale("be",{months:{format:"\u0441\u0442\u0443\u0434\u0437\u0435\u043d\u044f_\u043b\u044e\u0442\u0430\u0433\u0430_\u0441\u0430\u043a\u0430\u0432\u0456\u043a\u0430_\u043a\u0440\u0430\u0441\u0430\u0432\u0456\u043a\u0430_\u0442\u0440\u0430\u045e\u043d\u044f_\u0447\u044d\u0440\u0432\u0435\u043d\u044f_\u043b\u0456\u043f\u0435\u043d\u044f_\u0436\u043d\u0456\u045e\u043d\u044f_\u0432\u0435\u0440\u0430\u0441\u043d\u044f_\u043a\u0430\u0441\u0442\u0440\u044b\u0447\u043d\u0456\u043a\u0430_\u043b\u0456\u0441\u0442\u0430\u043f\u0430\u0434\u0430_\u0441\u043d\u0435\u0436\u043d\u044f".split("_"),standalone:"\u0441\u0442\u0443\u0434\u0437\u0435\u043d\u044c_\u043b\u044e\u0442\u044b_\u0441\u0430\u043a\u0430\u0432\u0456\u043a_\u043a\u0440\u0430\u0441\u0430\u0432\u0456\u043a_\u0442\u0440\u0430\u0432\u0435\u043d\u044c_\u0447\u044d\u0440\u0432\u0435\u043d\u044c_\u043b\u0456\u043f\u0435\u043d\u044c_\u0436\u043d\u0456\u0432\u0435\u043d\u044c_\u0432\u0435\u0440\u0430\u0441\u0435\u043d\u044c_\u043a\u0430\u0441\u0442\u0440\u044b\u0447\u043d\u0456\u043a_\u043b\u0456\u0441\u0442\u0430\u043f\u0430\u0434_\u0441\u043d\u0435\u0436\u0430\u043d\u044c".split("_")},monthsShort:"\u0441\u0442\u0443\u0434_\u043b\u044e\u0442_\u0441\u0430\u043a_\u043a\u0440\u0430\u0441_\u0442\u0440\u0430\u0432_\u0447\u044d\u0440\u0432_\u043b\u0456\u043f_\u0436\u043d\u0456\u0432_\u0432\u0435\u0440_\u043a\u0430\u0441\u0442_\u043b\u0456\u0441\u0442_\u0441\u043d\u0435\u0436".split("_"),weekdays:{format:"\u043d\u044f\u0434\u0437\u0435\u043b\u044e_\u043f\u0430\u043d\u044f\u0434\u0437\u0435\u043b\u0430\u043a_\u0430\u045e\u0442\u043e\u0440\u0430\u043a_\u0441\u0435\u0440\u0430\u0434\u0443_\u0447\u0430\u0446\u0432\u0435\u0440_\u043f\u044f\u0442\u043d\u0456\u0446\u0443_\u0441\u0443\u0431\u043e\u0442\u0443".split("_"),standalone:"\u043d\u044f\u0434\u0437\u0435\u043b\u044f_\u043f\u0430\u043d\u044f\u0434\u0437\u0435\u043b\u0430\u043a_\u0430\u045e\u0442\u043e\u0440\u0430\u043a_\u0441\u0435\u0440\u0430\u0434\u0430_\u0447\u0430\u0446\u0432\u0435\u0440_\u043f\u044f\u0442\u043d\u0456\u0446\u0430_\u0441\u0443\u0431\u043e\u0442\u0430".split("_"),isFormat:/\[ ?[\u0423\u0443\u045e] ?(?:\u043c\u0456\u043d\u0443\u043b\u0443\u044e|\u043d\u0430\u0441\u0442\u0443\u043f\u043d\u0443\u044e)? ?\] ?dddd/},weekdaysShort:"\u043d\u0434_\u043f\u043d_\u0430\u0442_\u0441\u0440_\u0447\u0446_\u043f\u0442_\u0441\u0431".split("_"),weekdaysMin:"\u043d\u0434_\u043f\u043d_\u0430\u0442_\u0441\u0440_\u0447\u0446_\u043f\u0442_\u0441\u0431".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD.MM.YYYY",LL:"D MMMM YYYY \u0433.",LLL:"D MMMM YYYY \u0433., HH:mm",LLLL:"dddd, D MMMM YYYY \u0433., HH:mm"},calendar:{sameDay:"[\u0421\u0451\u043d\u043d\u044f \u045e] LT",nextDay:"[\u0417\u0430\u045e\u0442\u0440\u0430 \u045e] LT",lastDay:"[\u0423\u0447\u043e\u0440\u0430 \u045e] LT",nextWeek:function(){return"[\u0423] dddd [\u045e] LT"},lastWeek:function(){switch(this.day()){case 0:case 3:case 5:case 6:return"[\u0423 \u043c\u0456\u043d\u0443\u043b\u0443\u044e] dddd [\u045e] LT";case 1:case 2:case 4:return"[\u0423 \u043c\u0456\u043d\u0443\u043b\u044b] dddd [\u045e] LT"}},sameElse:"L"},relativeTime:{future:"\u043f\u0440\u0430\u0437 %s",past:"%s \u0442\u0430\u043c\u0443",s:"\u043d\u0435\u043a\u0430\u043b\u044c\u043a\u0456 \u0441\u0435\u043a\u0443\u043d\u0434",m:p,mm:p,h:p,hh:p,d:"\u0434\u0437\u0435\u043d\u044c",dd:p,M:"\u043c\u0435\u0441\u044f\u0446",MM:p,y:"\u0433\u043e\u0434",yy:p},meridiemParse:/\u043d\u043e\u0447\u044b|\u0440\u0430\u043d\u0456\u0446\u044b|\u0434\u043d\u044f|\u0432\u0435\u0447\u0430\u0440\u0430/,isPM:function(e){return/^(\u0434\u043d\u044f|\u0432\u0435\u0447\u0430\u0440\u0430)$/.test(e)},meridiem:function(e,_,y){return e<4?"\u043d\u043e\u0447\u044b":e<12?"\u0440\u0430\u043d\u0456\u0446\u044b":e<17?"\u0434\u043d\u044f":"\u0432\u0435\u0447\u0430\u0440\u0430"},dayOfMonthOrdinalParse:/\d{1,2}-(\u0456|\u044b|\u0433\u0430)/,ordinal:function(e,_){switch(_){case"M":case"d":case"DDD":case"w":case"W":return e%10!=2&&e%10!=3||e%100==12||e%100==13?e+"-\u044b":e+"-\u0456";case"D":return e+"-\u0433\u0430";default:return e}},week:{dow:1,doy:7}})}(i(16738))},3276:function(v,S,i){!function(r){"use strict";r.defineLocale("bg",{months:"\u044f\u043d\u0443\u0430\u0440\u0438_\u0444\u0435\u0432\u0440\u0443\u0430\u0440\u0438_\u043c\u0430\u0440\u0442_\u0430\u043f\u0440\u0438\u043b_\u043c\u0430\u0439_\u044e\u043d\u0438_\u044e\u043b\u0438_\u0430\u0432\u0433\u0443\u0441\u0442_\u0441\u0435\u043f\u0442\u0435\u043c\u0432\u0440\u0438_\u043e\u043a\u0442\u043e\u043c\u0432\u0440\u0438_\u043d\u043e\u0435\u043c\u0432\u0440\u0438_\u0434\u0435\u043a\u0435\u043c\u0432\u0440\u0438".split("_"),monthsShort:"\u044f\u043d\u0443_\u0444\u0435\u0432_\u043c\u0430\u0440_\u0430\u043f\u0440_\u043c\u0430\u0439_\u044e\u043d\u0438_\u044e\u043b\u0438_\u0430\u0432\u0433_\u0441\u0435\u043f_\u043e\u043a\u0442_\u043d\u043e\u0435_\u0434\u0435\u043a".split("_"),weekdays:"\u043d\u0435\u0434\u0435\u043b\u044f_\u043f\u043e\u043d\u0435\u0434\u0435\u043b\u043d\u0438\u043a_\u0432\u0442\u043e\u0440\u043d\u0438\u043a_\u0441\u0440\u044f\u0434\u0430_\u0447\u0435\u0442\u0432\u044a\u0440\u0442\u044a\u043a_\u043f\u0435\u0442\u044a\u043a_\u0441\u044a\u0431\u043e\u0442\u0430".split("_"),weekdaysShort:"\u043d\u0435\u0434_\u043f\u043e\u043d_\u0432\u0442\u043e_\u0441\u0440\u044f_\u0447\u0435\u0442_\u043f\u0435\u0442_\u0441\u044a\u0431".split("_"),weekdaysMin:"\u043d\u0434_\u043f\u043d_\u0432\u0442_\u0441\u0440_\u0447\u0442_\u043f\u0442_\u0441\u0431".split("_"),longDateFormat:{LT:"H:mm",LTS:"H:mm:ss",L:"D.MM.YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY H:mm",LLLL:"dddd, D MMMM YYYY H:mm"},calendar:{sameDay:"[\u0414\u043d\u0435\u0441 \u0432] LT",nextDay:"[\u0423\u0442\u0440\u0435 \u0432] LT",nextWeek:"dddd [\u0432] LT",lastDay:"[\u0412\u0447\u0435\u0440\u0430 \u0432] LT",lastWeek:function(){switch(this.day()){case 0:case 3:case 6:return"[\u041c\u0438\u043d\u0430\u043b\u0430\u0442\u0430] dddd [\u0432] LT";case 1:case 2:case 4:case 5:return"[\u041c\u0438\u043d\u0430\u043b\u0438\u044f] dddd [\u0432] LT"}},sameElse:"L"},relativeTime:{future:"\u0441\u043b\u0435\u0434 %s",past:"\u043f\u0440\u0435\u0434\u0438 %s",s:"\u043d\u044f\u043a\u043e\u043b\u043a\u043e \u0441\u0435\u043a\u0443\u043d\u0434\u0438",ss:"%d \u0441\u0435\u043a\u0443\u043d\u0434\u0438",m:"\u043c\u0438\u043d\u0443\u0442\u0430",mm:"%d \u043c\u0438\u043d\u0443\u0442\u0438",h:"\u0447\u0430\u0441",hh:"%d \u0447\u0430\u0441\u0430",d:"\u0434\u0435\u043d",dd:"%d \u0434\u0435\u043d\u0430",w:"\u0441\u0435\u0434\u043c\u0438\u0446\u0430",ww:"%d \u0441\u0435\u0434\u043c\u0438\u0446\u0438",M:"\u043c\u0435\u0441\u0435\u0446",MM:"%d \u043c\u0435\u0441\u0435\u0446\u0430",y:"\u0433\u043e\u0434\u0438\u043d\u0430",yy:"%d \u0433\u043e\u0434\u0438\u043d\u0438"},dayOfMonthOrdinalParse:/\d{1,2}-(\u0435\u0432|\u0435\u043d|\u0442\u0438|\u0432\u0438|\u0440\u0438|\u043c\u0438)/,ordinal:function(p){var f=p%10,e=p%100;return 0===p?p+"-\u0435\u0432":0===e?p+"-\u0435\u043d":e>10&&e<20?p+"-\u0442\u0438":1===f?p+"-\u0432\u0438":2===f?p+"-\u0440\u0438":7===f||8===f?p+"-\u043c\u0438":p+"-\u0442\u0438"},week:{dow:1,doy:7}})}(i(16738))},93344:function(v,S,i){!function(r){"use strict";r.defineLocale("bm",{months:"Zanwuyekalo_Fewuruyekalo_Marisikalo_Awirilikalo_M\u025bkalo_Zuw\u025bnkalo_Zuluyekalo_Utikalo_S\u025btanburukalo_\u0254kut\u0254burukalo_Nowanburukalo_Desanburukalo".split("_"),monthsShort:"Zan_Few_Mar_Awi_M\u025b_Zuw_Zul_Uti_S\u025bt_\u0254ku_Now_Des".split("_"),weekdays:"Kari_Nt\u025bn\u025bn_Tarata_Araba_Alamisa_Juma_Sibiri".split("_"),weekdaysShort:"Kar_Nt\u025b_Tar_Ara_Ala_Jum_Sib".split("_"),weekdaysMin:"Ka_Nt_Ta_Ar_Al_Ju_Si".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"MMMM [tile] D [san] YYYY",LLL:"MMMM [tile] D [san] YYYY [l\u025br\u025b] HH:mm",LLLL:"dddd MMMM [tile] D [san] YYYY [l\u025br\u025b] HH:mm"},calendar:{sameDay:"[Bi l\u025br\u025b] LT",nextDay:"[Sini l\u025br\u025b] LT",nextWeek:"dddd [don l\u025br\u025b] LT",lastDay:"[Kunu l\u025br\u025b] LT",lastWeek:"dddd [t\u025bm\u025bnen l\u025br\u025b] LT",sameElse:"L"},relativeTime:{future:"%s k\u0254n\u0254",past:"a b\u025b %s b\u0254",s:"sanga dama dama",ss:"sekondi %d",m:"miniti kelen",mm:"miniti %d",h:"l\u025br\u025b kelen",hh:"l\u025br\u025b %d",d:"tile kelen",dd:"tile %d",M:"kalo kelen",MM:"kalo %d",y:"san kelen",yy:"san %d"},week:{dow:1,doy:4}})}(i(16738))},83990:function(v,S,i){!function(r){"use strict";var u={1:"\u09e7",2:"\u09e8",3:"\u09e9",4:"\u09ea",5:"\u09eb",6:"\u09ec",7:"\u09ed",8:"\u09ee",9:"\u09ef",0:"\u09e6"},p={"\u09e7":"1","\u09e8":"2","\u09e9":"3","\u09ea":"4","\u09eb":"5","\u09ec":"6","\u09ed":"7","\u09ee":"8","\u09ef":"9","\u09e6":"0"};r.defineLocale("bn-bd",{months:"\u099c\u09be\u09a8\u09c1\u09df\u09be\u09b0\u09bf_\u09ab\u09c7\u09ac\u09cd\u09b0\u09c1\u09df\u09be\u09b0\u09bf_\u09ae\u09be\u09b0\u09cd\u099a_\u098f\u09aa\u09cd\u09b0\u09bf\u09b2_\u09ae\u09c7_\u099c\u09c1\u09a8_\u099c\u09c1\u09b2\u09be\u0987_\u0986\u0997\u09b8\u09cd\u099f_\u09b8\u09c7\u09aa\u09cd\u099f\u09c7\u09ae\u09cd\u09ac\u09b0_\u0985\u0995\u09cd\u099f\u09cb\u09ac\u09b0_\u09a8\u09ad\u09c7\u09ae\u09cd\u09ac\u09b0_\u09a1\u09bf\u09b8\u09c7\u09ae\u09cd\u09ac\u09b0".split("_"),monthsShort:"\u099c\u09be\u09a8\u09c1_\u09ab\u09c7\u09ac\u09cd\u09b0\u09c1_\u09ae\u09be\u09b0\u09cd\u099a_\u098f\u09aa\u09cd\u09b0\u09bf\u09b2_\u09ae\u09c7_\u099c\u09c1\u09a8_\u099c\u09c1\u09b2\u09be\u0987_\u0986\u0997\u09b8\u09cd\u099f_\u09b8\u09c7\u09aa\u09cd\u099f_\u0985\u0995\u09cd\u099f\u09cb_\u09a8\u09ad\u09c7_\u09a1\u09bf\u09b8\u09c7".split("_"),weekdays:"\u09b0\u09ac\u09bf\u09ac\u09be\u09b0_\u09b8\u09cb\u09ae\u09ac\u09be\u09b0_\u09ae\u0999\u09cd\u0997\u09b2\u09ac\u09be\u09b0_\u09ac\u09c1\u09a7\u09ac\u09be\u09b0_\u09ac\u09c3\u09b9\u09b8\u09cd\u09aa\u09a4\u09bf\u09ac\u09be\u09b0_\u09b6\u09c1\u0995\u09cd\u09b0\u09ac\u09be\u09b0_\u09b6\u09a8\u09bf\u09ac\u09be\u09b0".split("_"),weekdaysShort:"\u09b0\u09ac\u09bf_\u09b8\u09cb\u09ae_\u09ae\u0999\u09cd\u0997\u09b2_\u09ac\u09c1\u09a7_\u09ac\u09c3\u09b9\u09b8\u09cd\u09aa\u09a4\u09bf_\u09b6\u09c1\u0995\u09cd\u09b0_\u09b6\u09a8\u09bf".split("_"),weekdaysMin:"\u09b0\u09ac\u09bf_\u09b8\u09cb\u09ae_\u09ae\u0999\u09cd\u0997\u09b2_\u09ac\u09c1\u09a7_\u09ac\u09c3\u09b9_\u09b6\u09c1\u0995\u09cd\u09b0_\u09b6\u09a8\u09bf".split("_"),longDateFormat:{LT:"A h:mm \u09b8\u09ae\u09df",LTS:"A h:mm:ss \u09b8\u09ae\u09df",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY, A h:mm \u09b8\u09ae\u09df",LLLL:"dddd, D MMMM YYYY, A h:mm \u09b8\u09ae\u09df"},calendar:{sameDay:"[\u0986\u099c] LT",nextDay:"[\u0986\u0997\u09be\u09ae\u09c0\u0995\u09be\u09b2] LT",nextWeek:"dddd, LT",lastDay:"[\u0997\u09a4\u0995\u09be\u09b2] LT",lastWeek:"[\u0997\u09a4] dddd, LT",sameElse:"L"},relativeTime:{future:"%s \u09aa\u09b0\u09c7",past:"%s \u0986\u0997\u09c7",s:"\u0995\u09df\u09c7\u0995 \u09b8\u09c7\u0995\u09c7\u09a8\u09cd\u09a1",ss:"%d \u09b8\u09c7\u0995\u09c7\u09a8\u09cd\u09a1",m:"\u098f\u0995 \u09ae\u09bf\u09a8\u09bf\u099f",mm:"%d \u09ae\u09bf\u09a8\u09bf\u099f",h:"\u098f\u0995 \u0998\u09a8\u09cd\u099f\u09be",hh:"%d \u0998\u09a8\u09cd\u099f\u09be",d:"\u098f\u0995 \u09a6\u09bf\u09a8",dd:"%d \u09a6\u09bf\u09a8",M:"\u098f\u0995 \u09ae\u09be\u09b8",MM:"%d \u09ae\u09be\u09b8",y:"\u098f\u0995 \u09ac\u099b\u09b0",yy:"%d \u09ac\u099b\u09b0"},preparse:function(e){return e.replace(/[\u09e7\u09e8\u09e9\u09ea\u09eb\u09ec\u09ed\u09ee\u09ef\u09e6]/g,function(_){return p[_]})},postformat:function(e){return e.replace(/\d/g,function(_){return u[_]})},meridiemParse:/\u09b0\u09be\u09a4|\u09ad\u09cb\u09b0|\u09b8\u0995\u09be\u09b2|\u09a6\u09c1\u09aa\u09c1\u09b0|\u09ac\u09bf\u0995\u09be\u09b2|\u09b8\u09a8\u09cd\u09a7\u09cd\u09af\u09be|\u09b0\u09be\u09a4/,meridiemHour:function(e,_){return 12===e&&(e=0),"\u09b0\u09be\u09a4"===_?e<4?e:e+12:"\u09ad\u09cb\u09b0"===_||"\u09b8\u0995\u09be\u09b2"===_?e:"\u09a6\u09c1\u09aa\u09c1\u09b0"===_?e>=3?e:e+12:"\u09ac\u09bf\u0995\u09be\u09b2"===_||"\u09b8\u09a8\u09cd\u09a7\u09cd\u09af\u09be"===_?e+12:void 0},meridiem:function(e,_,y){return e<4?"\u09b0\u09be\u09a4":e<6?"\u09ad\u09cb\u09b0":e<12?"\u09b8\u0995\u09be\u09b2":e<15?"\u09a6\u09c1\u09aa\u09c1\u09b0":e<18?"\u09ac\u09bf\u0995\u09be\u09b2":e<20?"\u09b8\u09a8\u09cd\u09a7\u09cd\u09af\u09be":"\u09b0\u09be\u09a4"},week:{dow:0,doy:6}})}(i(16738))},58985:function(v,S,i){!function(r){"use strict";var u={1:"\u09e7",2:"\u09e8",3:"\u09e9",4:"\u09ea",5:"\u09eb",6:"\u09ec",7:"\u09ed",8:"\u09ee",9:"\u09ef",0:"\u09e6"},p={"\u09e7":"1","\u09e8":"2","\u09e9":"3","\u09ea":"4","\u09eb":"5","\u09ec":"6","\u09ed":"7","\u09ee":"8","\u09ef":"9","\u09e6":"0"};r.defineLocale("bn",{months:"\u099c\u09be\u09a8\u09c1\u09df\u09be\u09b0\u09bf_\u09ab\u09c7\u09ac\u09cd\u09b0\u09c1\u09df\u09be\u09b0\u09bf_\u09ae\u09be\u09b0\u09cd\u099a_\u098f\u09aa\u09cd\u09b0\u09bf\u09b2_\u09ae\u09c7_\u099c\u09c1\u09a8_\u099c\u09c1\u09b2\u09be\u0987_\u0986\u0997\u09b8\u09cd\u099f_\u09b8\u09c7\u09aa\u09cd\u099f\u09c7\u09ae\u09cd\u09ac\u09b0_\u0985\u0995\u09cd\u099f\u09cb\u09ac\u09b0_\u09a8\u09ad\u09c7\u09ae\u09cd\u09ac\u09b0_\u09a1\u09bf\u09b8\u09c7\u09ae\u09cd\u09ac\u09b0".split("_"),monthsShort:"\u099c\u09be\u09a8\u09c1_\u09ab\u09c7\u09ac\u09cd\u09b0\u09c1_\u09ae\u09be\u09b0\u09cd\u099a_\u098f\u09aa\u09cd\u09b0\u09bf\u09b2_\u09ae\u09c7_\u099c\u09c1\u09a8_\u099c\u09c1\u09b2\u09be\u0987_\u0986\u0997\u09b8\u09cd\u099f_\u09b8\u09c7\u09aa\u09cd\u099f_\u0985\u0995\u09cd\u099f\u09cb_\u09a8\u09ad\u09c7_\u09a1\u09bf\u09b8\u09c7".split("_"),weekdays:"\u09b0\u09ac\u09bf\u09ac\u09be\u09b0_\u09b8\u09cb\u09ae\u09ac\u09be\u09b0_\u09ae\u0999\u09cd\u0997\u09b2\u09ac\u09be\u09b0_\u09ac\u09c1\u09a7\u09ac\u09be\u09b0_\u09ac\u09c3\u09b9\u09b8\u09cd\u09aa\u09a4\u09bf\u09ac\u09be\u09b0_\u09b6\u09c1\u0995\u09cd\u09b0\u09ac\u09be\u09b0_\u09b6\u09a8\u09bf\u09ac\u09be\u09b0".split("_"),weekdaysShort:"\u09b0\u09ac\u09bf_\u09b8\u09cb\u09ae_\u09ae\u0999\u09cd\u0997\u09b2_\u09ac\u09c1\u09a7_\u09ac\u09c3\u09b9\u09b8\u09cd\u09aa\u09a4\u09bf_\u09b6\u09c1\u0995\u09cd\u09b0_\u09b6\u09a8\u09bf".split("_"),weekdaysMin:"\u09b0\u09ac\u09bf_\u09b8\u09cb\u09ae_\u09ae\u0999\u09cd\u0997\u09b2_\u09ac\u09c1\u09a7_\u09ac\u09c3\u09b9_\u09b6\u09c1\u0995\u09cd\u09b0_\u09b6\u09a8\u09bf".split("_"),longDateFormat:{LT:"A h:mm \u09b8\u09ae\u09df",LTS:"A h:mm:ss \u09b8\u09ae\u09df",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY, A h:mm \u09b8\u09ae\u09df",LLLL:"dddd, D MMMM YYYY, A h:mm \u09b8\u09ae\u09df"},calendar:{sameDay:"[\u0986\u099c] LT",nextDay:"[\u0986\u0997\u09be\u09ae\u09c0\u0995\u09be\u09b2] LT",nextWeek:"dddd, LT",lastDay:"[\u0997\u09a4\u0995\u09be\u09b2] LT",lastWeek:"[\u0997\u09a4] dddd, LT",sameElse:"L"},relativeTime:{future:"%s \u09aa\u09b0\u09c7",past:"%s \u0986\u0997\u09c7",s:"\u0995\u09df\u09c7\u0995 \u09b8\u09c7\u0995\u09c7\u09a8\u09cd\u09a1",ss:"%d \u09b8\u09c7\u0995\u09c7\u09a8\u09cd\u09a1",m:"\u098f\u0995 \u09ae\u09bf\u09a8\u09bf\u099f",mm:"%d \u09ae\u09bf\u09a8\u09bf\u099f",h:"\u098f\u0995 \u0998\u09a8\u09cd\u099f\u09be",hh:"%d \u0998\u09a8\u09cd\u099f\u09be",d:"\u098f\u0995 \u09a6\u09bf\u09a8",dd:"%d \u09a6\u09bf\u09a8",M:"\u098f\u0995 \u09ae\u09be\u09b8",MM:"%d \u09ae\u09be\u09b8",y:"\u098f\u0995 \u09ac\u099b\u09b0",yy:"%d \u09ac\u099b\u09b0"},preparse:function(e){return e.replace(/[\u09e7\u09e8\u09e9\u09ea\u09eb\u09ec\u09ed\u09ee\u09ef\u09e6]/g,function(_){return p[_]})},postformat:function(e){return e.replace(/\d/g,function(_){return u[_]})},meridiemParse:/\u09b0\u09be\u09a4|\u09b8\u0995\u09be\u09b2|\u09a6\u09c1\u09aa\u09c1\u09b0|\u09ac\u09bf\u0995\u09be\u09b2|\u09b0\u09be\u09a4/,meridiemHour:function(e,_){return 12===e&&(e=0),"\u09b0\u09be\u09a4"===_&&e>=4||"\u09a6\u09c1\u09aa\u09c1\u09b0"===_&&e<5||"\u09ac\u09bf\u0995\u09be\u09b2"===_?e+12:e},meridiem:function(e,_,y){return e<4?"\u09b0\u09be\u09a4":e<10?"\u09b8\u0995\u09be\u09b2":e<17?"\u09a6\u09c1\u09aa\u09c1\u09b0":e<20?"\u09ac\u09bf\u0995\u09be\u09b2":"\u09b0\u09be\u09a4"},week:{dow:0,doy:6}})}(i(16738))},94391:function(v,S,i){!function(r){"use strict";var u={1:"\u0f21",2:"\u0f22",3:"\u0f23",4:"\u0f24",5:"\u0f25",6:"\u0f26",7:"\u0f27",8:"\u0f28",9:"\u0f29",0:"\u0f20"},p={"\u0f21":"1","\u0f22":"2","\u0f23":"3","\u0f24":"4","\u0f25":"5","\u0f26":"6","\u0f27":"7","\u0f28":"8","\u0f29":"9","\u0f20":"0"};r.defineLocale("bo",{months:"\u0f5f\u0fb3\u0f0b\u0f56\u0f0b\u0f51\u0f44\u0f0b\u0f54\u0f7c_\u0f5f\u0fb3\u0f0b\u0f56\u0f0b\u0f42\u0f49\u0f72\u0f66\u0f0b\u0f54_\u0f5f\u0fb3\u0f0b\u0f56\u0f0b\u0f42\u0f66\u0f74\u0f58\u0f0b\u0f54_\u0f5f\u0fb3\u0f0b\u0f56\u0f0b\u0f56\u0f5e\u0f72\u0f0b\u0f54_\u0f5f\u0fb3\u0f0b\u0f56\u0f0b\u0f63\u0f94\u0f0b\u0f54_\u0f5f\u0fb3\u0f0b\u0f56\u0f0b\u0f51\u0fb2\u0f74\u0f42\u0f0b\u0f54_\u0f5f\u0fb3\u0f0b\u0f56\u0f0b\u0f56\u0f51\u0f74\u0f53\u0f0b\u0f54_\u0f5f\u0fb3\u0f0b\u0f56\u0f0b\u0f56\u0f62\u0f92\u0fb1\u0f51\u0f0b\u0f54_\u0f5f\u0fb3\u0f0b\u0f56\u0f0b\u0f51\u0f42\u0f74\u0f0b\u0f54_\u0f5f\u0fb3\u0f0b\u0f56\u0f0b\u0f56\u0f45\u0f74\u0f0b\u0f54_\u0f5f\u0fb3\u0f0b\u0f56\u0f0b\u0f56\u0f45\u0f74\u0f0b\u0f42\u0f45\u0f72\u0f42\u0f0b\u0f54_\u0f5f\u0fb3\u0f0b\u0f56\u0f0b\u0f56\u0f45\u0f74\u0f0b\u0f42\u0f49\u0f72\u0f66\u0f0b\u0f54".split("_"),monthsShort:"\u0f5f\u0fb3\u0f0b1_\u0f5f\u0fb3\u0f0b2_\u0f5f\u0fb3\u0f0b3_\u0f5f\u0fb3\u0f0b4_\u0f5f\u0fb3\u0f0b5_\u0f5f\u0fb3\u0f0b6_\u0f5f\u0fb3\u0f0b7_\u0f5f\u0fb3\u0f0b8_\u0f5f\u0fb3\u0f0b9_\u0f5f\u0fb3\u0f0b10_\u0f5f\u0fb3\u0f0b11_\u0f5f\u0fb3\u0f0b12".split("_"),monthsShortRegex:/^(\u0f5f\u0fb3\u0f0b\d{1,2})/,monthsParseExact:!0,weekdays:"\u0f42\u0f5f\u0f60\u0f0b\u0f49\u0f72\u0f0b\u0f58\u0f0b_\u0f42\u0f5f\u0f60\u0f0b\u0f5f\u0fb3\u0f0b\u0f56\u0f0b_\u0f42\u0f5f\u0f60\u0f0b\u0f58\u0f72\u0f42\u0f0b\u0f51\u0f58\u0f62\u0f0b_\u0f42\u0f5f\u0f60\u0f0b\u0f63\u0fb7\u0f42\u0f0b\u0f54\u0f0b_\u0f42\u0f5f\u0f60\u0f0b\u0f55\u0f74\u0f62\u0f0b\u0f56\u0f74_\u0f42\u0f5f\u0f60\u0f0b\u0f54\u0f0b\u0f66\u0f44\u0f66\u0f0b_\u0f42\u0f5f\u0f60\u0f0b\u0f66\u0fa4\u0f7a\u0f53\u0f0b\u0f54\u0f0b".split("_"),weekdaysShort:"\u0f49\u0f72\u0f0b\u0f58\u0f0b_\u0f5f\u0fb3\u0f0b\u0f56\u0f0b_\u0f58\u0f72\u0f42\u0f0b\u0f51\u0f58\u0f62\u0f0b_\u0f63\u0fb7\u0f42\u0f0b\u0f54\u0f0b_\u0f55\u0f74\u0f62\u0f0b\u0f56\u0f74_\u0f54\u0f0b\u0f66\u0f44\u0f66\u0f0b_\u0f66\u0fa4\u0f7a\u0f53\u0f0b\u0f54\u0f0b".split("_"),weekdaysMin:"\u0f49\u0f72_\u0f5f\u0fb3_\u0f58\u0f72\u0f42_\u0f63\u0fb7\u0f42_\u0f55\u0f74\u0f62_\u0f66\u0f44\u0f66_\u0f66\u0fa4\u0f7a\u0f53".split("_"),longDateFormat:{LT:"A h:mm",LTS:"A h:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY, A h:mm",LLLL:"dddd, D MMMM YYYY, A h:mm"},calendar:{sameDay:"[\u0f51\u0f72\u0f0b\u0f62\u0f72\u0f44] LT",nextDay:"[\u0f66\u0f44\u0f0b\u0f49\u0f72\u0f53] LT",nextWeek:"[\u0f56\u0f51\u0f74\u0f53\u0f0b\u0f55\u0fb2\u0f42\u0f0b\u0f62\u0f97\u0f7a\u0f66\u0f0b\u0f58], LT",lastDay:"[\u0f41\u0f0b\u0f66\u0f44] LT",lastWeek:"[\u0f56\u0f51\u0f74\u0f53\u0f0b\u0f55\u0fb2\u0f42\u0f0b\u0f58\u0f50\u0f60\u0f0b\u0f58] dddd, LT",sameElse:"L"},relativeTime:{future:"%s \u0f63\u0f0b",past:"%s \u0f66\u0f94\u0f53\u0f0b\u0f63",s:"\u0f63\u0f58\u0f0b\u0f66\u0f44",ss:"%d \u0f66\u0f90\u0f62\u0f0b\u0f46\u0f0d",m:"\u0f66\u0f90\u0f62\u0f0b\u0f58\u0f0b\u0f42\u0f45\u0f72\u0f42",mm:"%d \u0f66\u0f90\u0f62\u0f0b\u0f58",h:"\u0f46\u0f74\u0f0b\u0f5a\u0f7c\u0f51\u0f0b\u0f42\u0f45\u0f72\u0f42",hh:"%d \u0f46\u0f74\u0f0b\u0f5a\u0f7c\u0f51",d:"\u0f49\u0f72\u0f53\u0f0b\u0f42\u0f45\u0f72\u0f42",dd:"%d \u0f49\u0f72\u0f53\u0f0b",M:"\u0f5f\u0fb3\u0f0b\u0f56\u0f0b\u0f42\u0f45\u0f72\u0f42",MM:"%d \u0f5f\u0fb3\u0f0b\u0f56",y:"\u0f63\u0f7c\u0f0b\u0f42\u0f45\u0f72\u0f42",yy:"%d \u0f63\u0f7c"},preparse:function(e){return e.replace(/[\u0f21\u0f22\u0f23\u0f24\u0f25\u0f26\u0f27\u0f28\u0f29\u0f20]/g,function(_){return p[_]})},postformat:function(e){return e.replace(/\d/g,function(_){return u[_]})},meridiemParse:/\u0f58\u0f5a\u0f53\u0f0b\u0f58\u0f7c|\u0f5e\u0f7c\u0f42\u0f66\u0f0b\u0f40\u0f66|\u0f49\u0f72\u0f53\u0f0b\u0f42\u0f74\u0f44|\u0f51\u0f42\u0f7c\u0f44\u0f0b\u0f51\u0f42|\u0f58\u0f5a\u0f53\u0f0b\u0f58\u0f7c/,meridiemHour:function(e,_){return 12===e&&(e=0),"\u0f58\u0f5a\u0f53\u0f0b\u0f58\u0f7c"===_&&e>=4||"\u0f49\u0f72\u0f53\u0f0b\u0f42\u0f74\u0f44"===_&&e<5||"\u0f51\u0f42\u0f7c\u0f44\u0f0b\u0f51\u0f42"===_?e+12:e},meridiem:function(e,_,y){return e<4?"\u0f58\u0f5a\u0f53\u0f0b\u0f58\u0f7c":e<10?"\u0f5e\u0f7c\u0f42\u0f66\u0f0b\u0f40\u0f66":e<17?"\u0f49\u0f72\u0f53\u0f0b\u0f42\u0f74\u0f44":e<20?"\u0f51\u0f42\u0f7c\u0f44\u0f0b\u0f51\u0f42":"\u0f58\u0f5a\u0f53\u0f0b\u0f58\u0f7c"},week:{dow:0,doy:6}})}(i(16738))},46728:function(v,S,i){!function(r){"use strict";function u(ee,ue,ae){return ee+" "+function(ee,ue){return 2===ue?function(ee){var ue={m:"v",b:"v",d:"z"};return void 0===ue[ee.charAt(0)]?ee:ue[ee.charAt(0)]+ee.substring(1)}(ee):ee}({mm:"munutenn",MM:"miz",dd:"devezh"}[ae],ee)}function f(ee){return ee>9?f(ee%10):ee}var y=[/^gen/i,/^c[\u02bc\']hwe/i,/^meu/i,/^ebr/i,/^mae/i,/^(mez|eve)/i,/^gou/i,/^eos/i,/^gwe/i,/^her/i,/^du/i,/^ker/i],T=/^(genver|c[\u02bc\']hwevrer|meurzh|ebrel|mae|mezheven|gouere|eost|gwengolo|here|du|kerzu|gen|c[\u02bc\']hwe|meu|ebr|mae|eve|gou|eos|gwe|her|du|ker)/i,J=[/^Su/i,/^Lu/i,/^Me([^r]|$)/i,/^Mer/i,/^Ya/i,/^Gw/i,/^Sa/i];r.defineLocale("br",{months:"Genver_C\u02bchwevrer_Meurzh_Ebrel_Mae_Mezheven_Gouere_Eost_Gwengolo_Here_Du_Kerzu".split("_"),monthsShort:"Gen_C\u02bchwe_Meu_Ebr_Mae_Eve_Gou_Eos_Gwe_Her_Du_Ker".split("_"),weekdays:"Sul_Lun_Meurzh_Merc\u02bcher_Yaou_Gwener_Sadorn".split("_"),weekdaysShort:"Sul_Lun_Meu_Mer_Yao_Gwe_Sad".split("_"),weekdaysMin:"Su_Lu_Me_Mer_Ya_Gw_Sa".split("_"),weekdaysParse:J,fullWeekdaysParse:[/^sul/i,/^lun/i,/^meurzh/i,/^merc[\u02bc\']her/i,/^yaou/i,/^gwener/i,/^sadorn/i],shortWeekdaysParse:[/^Sul/i,/^Lun/i,/^Meu/i,/^Mer/i,/^Yao/i,/^Gwe/i,/^Sad/i],minWeekdaysParse:J,monthsRegex:T,monthsShortRegex:T,monthsStrictRegex:/^(genver|c[\u02bc\']hwevrer|meurzh|ebrel|mae|mezheven|gouere|eost|gwengolo|here|du|kerzu)/i,monthsShortStrictRegex:/^(gen|c[\u02bc\']hwe|meu|ebr|mae|eve|gou|eos|gwe|her|du|ker)/i,monthsParse:y,longMonthsParse:y,shortMonthsParse:y,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D [a viz] MMMM YYYY",LLL:"D [a viz] MMMM YYYY HH:mm",LLLL:"dddd, D [a viz] MMMM YYYY HH:mm"},calendar:{sameDay:"[Hiziv da] LT",nextDay:"[Warc\u02bchoazh da] LT",nextWeek:"dddd [da] LT",lastDay:"[Dec\u02bch da] LT",lastWeek:"dddd [paset da] LT",sameElse:"L"},relativeTime:{future:"a-benn %s",past:"%s \u02bczo",s:"un nebeud segondenno\xf9",ss:"%d eilenn",m:"ur vunutenn",mm:u,h:"un eur",hh:"%d eur",d:"un devezh",dd:u,M:"ur miz",MM:u,y:"ur bloaz",yy:function(ee){switch(f(ee)){case 1:case 3:case 4:case 5:case 9:return ee+" bloaz";default:return ee+" vloaz"}}},dayOfMonthOrdinalParse:/\d{1,2}(a\xf1|vet)/,ordinal:function(ee){return ee+(1===ee?"a\xf1":"vet")},week:{dow:1,doy:4},meridiemParse:/a.m.|g.m./,isPM:function(ee){return"g.m."===ee},meridiem:function(ee,ue,ae){return ee<12?"a.m.":"g.m."}})}(i(16738))},5536:function(v,S,i){!function(r){"use strict";function u(f,e,_){var y=f+" ";switch(_){case"ss":return y+(1===f?"sekunda":2===f||3===f||4===f?"sekunde":"sekundi");case"m":return e?"jedna minuta":"jedne minute";case"mm":return y+(1===f?"minuta":2===f||3===f||4===f?"minute":"minuta");case"h":return e?"jedan sat":"jednog sata";case"hh":return y+(1===f?"sat":2===f||3===f||4===f?"sata":"sati");case"dd":return y+(1===f?"dan":"dana");case"MM":return y+(1===f?"mjesec":2===f||3===f||4===f?"mjeseca":"mjeseci");case"yy":return y+(1===f?"godina":2===f||3===f||4===f?"godine":"godina")}}r.defineLocale("bs",{months:"januar_februar_mart_april_maj_juni_juli_august_septembar_oktobar_novembar_decembar".split("_"),monthsShort:"jan._feb._mar._apr._maj._jun._jul._aug._sep._okt._nov._dec.".split("_"),monthsParseExact:!0,weekdays:"nedjelja_ponedjeljak_utorak_srijeda_\u010detvrtak_petak_subota".split("_"),weekdaysShort:"ned._pon._uto._sri._\u010det._pet._sub.".split("_"),weekdaysMin:"ne_po_ut_sr_\u010de_pe_su".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"H:mm",LTS:"H:mm:ss",L:"DD.MM.YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY H:mm",LLLL:"dddd, D. MMMM YYYY H:mm"},calendar:{sameDay:"[danas u] LT",nextDay:"[sutra u] LT",nextWeek:function(){switch(this.day()){case 0:return"[u] [nedjelju] [u] LT";case 3:return"[u] [srijedu] [u] LT";case 6:return"[u] [subotu] [u] LT";case 1:case 2:case 4:case 5:return"[u] dddd [u] LT"}},lastDay:"[ju\u010der u] LT",lastWeek:function(){switch(this.day()){case 0:case 3:return"[pro\u0161lu] dddd [u] LT";case 6:return"[pro\u0161le] [subote] [u] LT";case 1:case 2:case 4:case 5:return"[pro\u0161li] dddd [u] LT"}},sameElse:"L"},relativeTime:{future:"za %s",past:"prije %s",s:"par sekundi",ss:u,m:u,mm:u,h:u,hh:u,d:"dan",dd:u,M:"mjesec",MM:u,y:"godinu",yy:u},dayOfMonthOrdinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:7}})}(i(16738))},41043:function(v,S,i){!function(r){"use strict";r.defineLocale("ca",{months:{standalone:"gener_febrer_mar\xe7_abril_maig_juny_juliol_agost_setembre_octubre_novembre_desembre".split("_"),format:"de gener_de febrer_de mar\xe7_d'abril_de maig_de juny_de juliol_d'agost_de setembre_d'octubre_de novembre_de desembre".split("_"),isFormat:/D[oD]?(\s)+MMMM/},monthsShort:"gen._febr._mar\xe7_abr._maig_juny_jul._ag._set._oct._nov._des.".split("_"),monthsParseExact:!0,weekdays:"diumenge_dilluns_dimarts_dimecres_dijous_divendres_dissabte".split("_"),weekdaysShort:"dg._dl._dt._dc._dj._dv._ds.".split("_"),weekdaysMin:"dg_dl_dt_dc_dj_dv_ds".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"H:mm",LTS:"H:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM [de] YYYY",ll:"D MMM YYYY",LLL:"D MMMM [de] YYYY [a les] H:mm",lll:"D MMM YYYY, H:mm",LLLL:"dddd D MMMM [de] YYYY [a les] H:mm",llll:"ddd D MMM YYYY, H:mm"},calendar:{sameDay:function(){return"[avui a "+(1!==this.hours()?"les":"la")+"] LT"},nextDay:function(){return"[dem\xe0 a "+(1!==this.hours()?"les":"la")+"] LT"},nextWeek:function(){return"dddd [a "+(1!==this.hours()?"les":"la")+"] LT"},lastDay:function(){return"[ahir a "+(1!==this.hours()?"les":"la")+"] LT"},lastWeek:function(){return"[el] dddd [passat a "+(1!==this.hours()?"les":"la")+"] LT"},sameElse:"L"},relativeTime:{future:"d'aqu\xed %s",past:"fa %s",s:"uns segons",ss:"%d segons",m:"un minut",mm:"%d minuts",h:"una hora",hh:"%d hores",d:"un dia",dd:"%d dies",M:"un mes",MM:"%d mesos",y:"un any",yy:"%d anys"},dayOfMonthOrdinalParse:/\d{1,2}(r|n|t|\xe8|a)/,ordinal:function(p,f){var e=1===p?"r":2===p?"n":3===p?"r":4===p?"t":"\xe8";return("w"===f||"W"===f)&&(e="a"),p+e},week:{dow:1,doy:4}})}(i(16738))},70420:function(v,S,i){!function(r){"use strict";var u={format:"leden_\xfanor_b\u0159ezen_duben_kv\u011bten_\u010derven_\u010dervenec_srpen_z\xe1\u0159\xed_\u0159\xedjen_listopad_prosinec".split("_"),standalone:"ledna_\xfanora_b\u0159ezna_dubna_kv\u011btna_\u010dervna_\u010dervence_srpna_z\xe1\u0159\xed_\u0159\xedjna_listopadu_prosince".split("_")},p="led_\xfano_b\u0159e_dub_kv\u011b_\u010dvn_\u010dvc_srp_z\xe1\u0159_\u0159\xedj_lis_pro".split("_"),f=[/^led/i,/^\xfano/i,/^b\u0159e/i,/^dub/i,/^kv\u011b/i,/^(\u010dvn|\u010derven$|\u010dervna)/i,/^(\u010dvc|\u010dervenec|\u010dervence)/i,/^srp/i,/^z\xe1\u0159/i,/^\u0159\xedj/i,/^lis/i,/^pro/i],e=/^(leden|\xfanor|b\u0159ezen|duben|kv\u011bten|\u010dervenec|\u010dervence|\u010derven|\u010dervna|srpen|z\xe1\u0159\xed|\u0159\xedjen|listopad|prosinec|led|\xfano|b\u0159e|dub|kv\u011b|\u010dvn|\u010dvc|srp|z\xe1\u0159|\u0159\xedj|lis|pro)/i;function _(M){return M>1&&M<5&&1!=~~(M/10)}function y(M,R,F,Z){var J=M+" ";switch(F){case"s":return R||Z?"p\xe1r sekund":"p\xe1r sekundami";case"ss":return R||Z?J+(_(M)?"sekundy":"sekund"):J+"sekundami";case"m":return R?"minuta":Z?"minutu":"minutou";case"mm":return R||Z?J+(_(M)?"minuty":"minut"):J+"minutami";case"h":return R?"hodina":Z?"hodinu":"hodinou";case"hh":return R||Z?J+(_(M)?"hodiny":"hodin"):J+"hodinami";case"d":return R||Z?"den":"dnem";case"dd":return R||Z?J+(_(M)?"dny":"dn\xed"):J+"dny";case"M":return R||Z?"m\u011bs\xedc":"m\u011bs\xedcem";case"MM":return R||Z?J+(_(M)?"m\u011bs\xedce":"m\u011bs\xedc\u016f"):J+"m\u011bs\xedci";case"y":return R||Z?"rok":"rokem";case"yy":return R||Z?J+(_(M)?"roky":"let"):J+"lety"}}r.defineLocale("cs",{months:u,monthsShort:p,monthsRegex:e,monthsShortRegex:e,monthsStrictRegex:/^(leden|ledna|\xfanora|\xfanor|b\u0159ezen|b\u0159ezna|duben|dubna|kv\u011bten|kv\u011btna|\u010dervenec|\u010dervence|\u010derven|\u010dervna|srpen|srpna|z\xe1\u0159\xed|\u0159\xedjen|\u0159\xedjna|listopadu|listopad|prosinec|prosince)/i,monthsShortStrictRegex:/^(led|\xfano|b\u0159e|dub|kv\u011b|\u010dvn|\u010dvc|srp|z\xe1\u0159|\u0159\xedj|lis|pro)/i,monthsParse:f,longMonthsParse:f,shortMonthsParse:f,weekdays:"ned\u011ble_pond\u011bl\xed_\xfater\xfd_st\u0159eda_\u010dtvrtek_p\xe1tek_sobota".split("_"),weekdaysShort:"ne_po_\xfat_st_\u010dt_p\xe1_so".split("_"),weekdaysMin:"ne_po_\xfat_st_\u010dt_p\xe1_so".split("_"),longDateFormat:{LT:"H:mm",LTS:"H:mm:ss",L:"DD.MM.YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY H:mm",LLLL:"dddd D. MMMM YYYY H:mm",l:"D. M. YYYY"},calendar:{sameDay:"[dnes v] LT",nextDay:"[z\xedtra v] LT",nextWeek:function(){switch(this.day()){case 0:return"[v ned\u011bli v] LT";case 1:case 2:return"[v] dddd [v] LT";case 3:return"[ve st\u0159edu v] LT";case 4:return"[ve \u010dtvrtek v] LT";case 5:return"[v p\xe1tek v] LT";case 6:return"[v sobotu v] LT"}},lastDay:"[v\u010dera v] LT",lastWeek:function(){switch(this.day()){case 0:return"[minulou ned\u011bli v] LT";case 1:case 2:return"[minul\xe9] dddd [v] LT";case 3:return"[minulou st\u0159edu v] LT";case 4:case 5:return"[minul\xfd] dddd [v] LT";case 6:return"[minulou sobotu v] LT"}},sameElse:"L"},relativeTime:{future:"za %s",past:"p\u0159ed %s",s:y,ss:y,m:y,mm:y,h:y,hh:y,d:y,dd:y,M:y,MM:y,y,yy:y},dayOfMonthOrdinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:4}})}(i(16738))},33513:function(v,S,i){!function(r){"use strict";r.defineLocale("cv",{months:"\u043a\u04d1\u0440\u043b\u0430\u0447_\u043d\u0430\u0440\u04d1\u0441_\u043f\u0443\u0448_\u0430\u043a\u0430_\u043c\u0430\u0439_\u04ab\u04d7\u0440\u0442\u043c\u0435_\u0443\u0442\u04d1_\u04ab\u0443\u0440\u043b\u0430_\u0430\u0432\u04d1\u043d_\u044e\u043f\u0430_\u0447\u04f3\u043a_\u0440\u0430\u0448\u0442\u0430\u0432".split("_"),monthsShort:"\u043a\u04d1\u0440_\u043d\u0430\u0440_\u043f\u0443\u0448_\u0430\u043a\u0430_\u043c\u0430\u0439_\u04ab\u04d7\u0440_\u0443\u0442\u04d1_\u04ab\u0443\u0440_\u0430\u0432\u043d_\u044e\u043f\u0430_\u0447\u04f3\u043a_\u0440\u0430\u0448".split("_"),weekdays:"\u0432\u044b\u0440\u0441\u0430\u0440\u043d\u0438\u043a\u0443\u043d_\u0442\u0443\u043d\u0442\u0438\u043a\u0443\u043d_\u044b\u0442\u043b\u0430\u0440\u0438\u043a\u0443\u043d_\u044e\u043d\u043a\u0443\u043d_\u043a\u04d7\u04ab\u043d\u0435\u0440\u043d\u0438\u043a\u0443\u043d_\u044d\u0440\u043d\u0435\u043a\u0443\u043d_\u0448\u04d1\u043c\u0430\u0442\u043a\u0443\u043d".split("_"),weekdaysShort:"\u0432\u044b\u0440_\u0442\u0443\u043d_\u044b\u0442\u043b_\u044e\u043d_\u043a\u04d7\u04ab_\u044d\u0440\u043d_\u0448\u04d1\u043c".split("_"),weekdaysMin:"\u0432\u0440_\u0442\u043d_\u044b\u0442_\u044e\u043d_\u043a\u04ab_\u044d\u0440_\u0448\u043c".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD-MM-YYYY",LL:"YYYY [\u04ab\u0443\u043b\u0445\u0438] MMMM [\u0443\u0439\u04d1\u0445\u04d7\u043d] D[-\u043c\u04d7\u0448\u04d7]",LLL:"YYYY [\u04ab\u0443\u043b\u0445\u0438] MMMM [\u0443\u0439\u04d1\u0445\u04d7\u043d] D[-\u043c\u04d7\u0448\u04d7], HH:mm",LLLL:"dddd, YYYY [\u04ab\u0443\u043b\u0445\u0438] MMMM [\u0443\u0439\u04d1\u0445\u04d7\u043d] D[-\u043c\u04d7\u0448\u04d7], HH:mm"},calendar:{sameDay:"[\u041f\u0430\u044f\u043d] LT [\u0441\u0435\u0445\u0435\u0442\u0440\u0435]",nextDay:"[\u042b\u0440\u0430\u043d] LT [\u0441\u0435\u0445\u0435\u0442\u0440\u0435]",lastDay:"[\u04d6\u043d\u0435\u0440] LT [\u0441\u0435\u0445\u0435\u0442\u0440\u0435]",nextWeek:"[\u04aa\u0438\u0442\u0435\u0441] dddd LT [\u0441\u0435\u0445\u0435\u0442\u0440\u0435]",lastWeek:"[\u0418\u0440\u0442\u043d\u04d7] dddd LT [\u0441\u0435\u0445\u0435\u0442\u0440\u0435]",sameElse:"L"},relativeTime:{future:function(p){return p+(/\u0441\u0435\u0445\u0435\u0442$/i.exec(p)?"\u0440\u0435\u043d":/\u04ab\u0443\u043b$/i.exec(p)?"\u0442\u0430\u043d":"\u0440\u0430\u043d")},past:"%s \u043a\u0430\u044f\u043b\u043b\u0430",s:"\u043f\u04d7\u0440-\u0438\u043a \u04ab\u0435\u043a\u043a\u0443\u043d\u0442",ss:"%d \u04ab\u0435\u043a\u043a\u0443\u043d\u0442",m:"\u043f\u04d7\u0440 \u043c\u0438\u043d\u0443\u0442",mm:"%d \u043c\u0438\u043d\u0443\u0442",h:"\u043f\u04d7\u0440 \u0441\u0435\u0445\u0435\u0442",hh:"%d \u0441\u0435\u0445\u0435\u0442",d:"\u043f\u04d7\u0440 \u043a\u0443\u043d",dd:"%d \u043a\u0443\u043d",M:"\u043f\u04d7\u0440 \u0443\u0439\u04d1\u0445",MM:"%d \u0443\u0439\u04d1\u0445",y:"\u043f\u04d7\u0440 \u04ab\u0443\u043b",yy:"%d \u04ab\u0443\u043b"},dayOfMonthOrdinalParse:/\d{1,2}-\u043c\u04d7\u0448/,ordinal:"%d-\u043c\u04d7\u0448",week:{dow:1,doy:7}})}(i(16738))},6771:function(v,S,i){!function(r){"use strict";r.defineLocale("cy",{months:"Ionawr_Chwefror_Mawrth_Ebrill_Mai_Mehefin_Gorffennaf_Awst_Medi_Hydref_Tachwedd_Rhagfyr".split("_"),monthsShort:"Ion_Chwe_Maw_Ebr_Mai_Meh_Gor_Aws_Med_Hyd_Tach_Rhag".split("_"),weekdays:"Dydd Sul_Dydd Llun_Dydd Mawrth_Dydd Mercher_Dydd Iau_Dydd Gwener_Dydd Sadwrn".split("_"),weekdaysShort:"Sul_Llun_Maw_Mer_Iau_Gwe_Sad".split("_"),weekdaysMin:"Su_Ll_Ma_Me_Ia_Gw_Sa".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd, D MMMM YYYY HH:mm"},calendar:{sameDay:"[Heddiw am] LT",nextDay:"[Yfory am] LT",nextWeek:"dddd [am] LT",lastDay:"[Ddoe am] LT",lastWeek:"dddd [diwethaf am] LT",sameElse:"L"},relativeTime:{future:"mewn %s",past:"%s yn \xf4l",s:"ychydig eiliadau",ss:"%d eiliad",m:"munud",mm:"%d munud",h:"awr",hh:"%d awr",d:"diwrnod",dd:"%d diwrnod",M:"mis",MM:"%d mis",y:"blwyddyn",yy:"%d flynedd"},dayOfMonthOrdinalParse:/\d{1,2}(fed|ain|af|il|ydd|ed|eg)/,ordinal:function(p){var e="";return p>20?e=40===p||50===p||60===p||80===p||100===p?"fed":"ain":p>0&&(e=["","af","il","ydd","ydd","ed","ed","ed","fed","fed","fed","eg","fed","eg","eg","fed","eg","eg","fed","eg","fed"][p]),p+e},week:{dow:1,doy:4}})}(i(16738))},47978:function(v,S,i){!function(r){"use strict";r.defineLocale("da",{months:"januar_februar_marts_april_maj_juni_juli_august_september_oktober_november_december".split("_"),monthsShort:"jan_feb_mar_apr_maj_jun_jul_aug_sep_okt_nov_dec".split("_"),weekdays:"s\xf8ndag_mandag_tirsdag_onsdag_torsdag_fredag_l\xf8rdag".split("_"),weekdaysShort:"s\xf8n_man_tir_ons_tor_fre_l\xf8r".split("_"),weekdaysMin:"s\xf8_ma_ti_on_to_fr_l\xf8".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD.MM.YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY HH:mm",LLLL:"dddd [d.] D. MMMM YYYY [kl.] HH:mm"},calendar:{sameDay:"[i dag kl.] LT",nextDay:"[i morgen kl.] LT",nextWeek:"p\xe5 dddd [kl.] LT",lastDay:"[i g\xe5r kl.] LT",lastWeek:"[i] dddd[s kl.] LT",sameElse:"L"},relativeTime:{future:"om %s",past:"%s siden",s:"f\xe5 sekunder",ss:"%d sekunder",m:"et minut",mm:"%d minutter",h:"en time",hh:"%d timer",d:"en dag",dd:"%d dage",M:"en m\xe5ned",MM:"%d m\xe5neder",y:"et \xe5r",yy:"%d \xe5r"},dayOfMonthOrdinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:4}})}(i(16738))},25204:function(v,S,i){!function(r){"use strict";function u(f,e,_,y){var T={m:["eine Minute","einer Minute"],h:["eine Stunde","einer Stunde"],d:["ein Tag","einem Tag"],dd:[f+" Tage",f+" Tagen"],w:["eine Woche","einer Woche"],M:["ein Monat","einem Monat"],MM:[f+" Monate",f+" Monaten"],y:["ein Jahr","einem Jahr"],yy:[f+" Jahre",f+" Jahren"]};return e?T[_][0]:T[_][1]}r.defineLocale("de-at",{months:"J\xe4nner_Februar_M\xe4rz_April_Mai_Juni_Juli_August_September_Oktober_November_Dezember".split("_"),monthsShort:"J\xe4n._Feb._M\xe4rz_Apr._Mai_Juni_Juli_Aug._Sep._Okt._Nov._Dez.".split("_"),monthsParseExact:!0,weekdays:"Sonntag_Montag_Dienstag_Mittwoch_Donnerstag_Freitag_Samstag".split("_"),weekdaysShort:"So._Mo._Di._Mi._Do._Fr._Sa.".split("_"),weekdaysMin:"So_Mo_Di_Mi_Do_Fr_Sa".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD.MM.YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY HH:mm",LLLL:"dddd, D. MMMM YYYY HH:mm"},calendar:{sameDay:"[heute um] LT [Uhr]",sameElse:"L",nextDay:"[morgen um] LT [Uhr]",nextWeek:"dddd [um] LT [Uhr]",lastDay:"[gestern um] LT [Uhr]",lastWeek:"[letzten] dddd [um] LT [Uhr]"},relativeTime:{future:"in %s",past:"vor %s",s:"ein paar Sekunden",ss:"%d Sekunden",m:u,mm:"%d Minuten",h:u,hh:"%d Stunden",d:u,dd:u,w:u,ww:"%d Wochen",M:u,MM:u,y:u,yy:u},dayOfMonthOrdinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:4}})}(i(16738))},2653:function(v,S,i){!function(r){"use strict";function u(f,e,_,y){var T={m:["eine Minute","einer Minute"],h:["eine Stunde","einer Stunde"],d:["ein Tag","einem Tag"],dd:[f+" Tage",f+" Tagen"],w:["eine Woche","einer Woche"],M:["ein Monat","einem Monat"],MM:[f+" Monate",f+" Monaten"],y:["ein Jahr","einem Jahr"],yy:[f+" Jahre",f+" Jahren"]};return e?T[_][0]:T[_][1]}r.defineLocale("de-ch",{months:"Januar_Februar_M\xe4rz_April_Mai_Juni_Juli_August_September_Oktober_November_Dezember".split("_"),monthsShort:"Jan._Feb._M\xe4rz_Apr._Mai_Juni_Juli_Aug._Sep._Okt._Nov._Dez.".split("_"),monthsParseExact:!0,weekdays:"Sonntag_Montag_Dienstag_Mittwoch_Donnerstag_Freitag_Samstag".split("_"),weekdaysShort:"So_Mo_Di_Mi_Do_Fr_Sa".split("_"),weekdaysMin:"So_Mo_Di_Mi_Do_Fr_Sa".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD.MM.YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY HH:mm",LLLL:"dddd, D. MMMM YYYY HH:mm"},calendar:{sameDay:"[heute um] LT [Uhr]",sameElse:"L",nextDay:"[morgen um] LT [Uhr]",nextWeek:"dddd [um] LT [Uhr]",lastDay:"[gestern um] LT [Uhr]",lastWeek:"[letzten] dddd [um] LT [Uhr]"},relativeTime:{future:"in %s",past:"vor %s",s:"ein paar Sekunden",ss:"%d Sekunden",m:u,mm:"%d Minuten",h:u,hh:"%d Stunden",d:u,dd:u,w:u,ww:"%d Wochen",M:u,MM:u,y:u,yy:u},dayOfMonthOrdinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:4}})}(i(16738))},46061:function(v,S,i){!function(r){"use strict";function u(f,e,_,y){var T={m:["eine Minute","einer Minute"],h:["eine Stunde","einer Stunde"],d:["ein Tag","einem Tag"],dd:[f+" Tage",f+" Tagen"],w:["eine Woche","einer Woche"],M:["ein Monat","einem Monat"],MM:[f+" Monate",f+" Monaten"],y:["ein Jahr","einem Jahr"],yy:[f+" Jahre",f+" Jahren"]};return e?T[_][0]:T[_][1]}r.defineLocale("de",{months:"Januar_Februar_M\xe4rz_April_Mai_Juni_Juli_August_September_Oktober_November_Dezember".split("_"),monthsShort:"Jan._Feb._M\xe4rz_Apr._Mai_Juni_Juli_Aug._Sep._Okt._Nov._Dez.".split("_"),monthsParseExact:!0,weekdays:"Sonntag_Montag_Dienstag_Mittwoch_Donnerstag_Freitag_Samstag".split("_"),weekdaysShort:"So._Mo._Di._Mi._Do._Fr._Sa.".split("_"),weekdaysMin:"So_Mo_Di_Mi_Do_Fr_Sa".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD.MM.YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY HH:mm",LLLL:"dddd, D. MMMM YYYY HH:mm"},calendar:{sameDay:"[heute um] LT [Uhr]",sameElse:"L",nextDay:"[morgen um] LT [Uhr]",nextWeek:"dddd [um] LT [Uhr]",lastDay:"[gestern um] LT [Uhr]",lastWeek:"[letzten] dddd [um] LT [Uhr]"},relativeTime:{future:"in %s",past:"vor %s",s:"ein paar Sekunden",ss:"%d Sekunden",m:u,mm:"%d Minuten",h:u,hh:"%d Stunden",d:u,dd:u,w:u,ww:"%d Wochen",M:u,MM:u,y:u,yy:u},dayOfMonthOrdinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:4}})}(i(16738))},85:function(v,S,i){!function(r){"use strict";var u=["\u0796\u07ac\u0782\u07aa\u0787\u07a6\u0783\u07a9","\u078a\u07ac\u0784\u07b0\u0783\u07aa\u0787\u07a6\u0783\u07a9","\u0789\u07a7\u0783\u07a8\u0797\u07aa","\u0787\u07ad\u0795\u07b0\u0783\u07a9\u078d\u07aa","\u0789\u07ad","\u0796\u07ab\u0782\u07b0","\u0796\u07aa\u078d\u07a6\u0787\u07a8","\u0787\u07af\u078e\u07a6\u0790\u07b0\u0793\u07aa","\u0790\u07ac\u0795\u07b0\u0793\u07ac\u0789\u07b0\u0784\u07a6\u0783\u07aa","\u0787\u07ae\u0786\u07b0\u0793\u07af\u0784\u07a6\u0783\u07aa","\u0782\u07ae\u0788\u07ac\u0789\u07b0\u0784\u07a6\u0783\u07aa","\u0791\u07a8\u0790\u07ac\u0789\u07b0\u0784\u07a6\u0783\u07aa"],p=["\u0787\u07a7\u078b\u07a8\u0787\u07b0\u078c\u07a6","\u0780\u07af\u0789\u07a6","\u0787\u07a6\u0782\u07b0\u078e\u07a7\u0783\u07a6","\u0784\u07aa\u078b\u07a6","\u0784\u07aa\u0783\u07a7\u0790\u07b0\u078a\u07a6\u078c\u07a8","\u0780\u07aa\u0786\u07aa\u0783\u07aa","\u0780\u07ae\u0782\u07a8\u0780\u07a8\u0783\u07aa"];r.defineLocale("dv",{months:u,monthsShort:u,weekdays:p,weekdaysShort:p,weekdaysMin:"\u0787\u07a7\u078b\u07a8_\u0780\u07af\u0789\u07a6_\u0787\u07a6\u0782\u07b0_\u0784\u07aa\u078b\u07a6_\u0784\u07aa\u0783\u07a7_\u0780\u07aa\u0786\u07aa_\u0780\u07ae\u0782\u07a8".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"D/M/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd D MMMM YYYY HH:mm"},meridiemParse:/\u0789\u0786|\u0789\u078a/,isPM:function(e){return"\u0789\u078a"===e},meridiem:function(e,_,y){return e<12?"\u0789\u0786":"\u0789\u078a"},calendar:{sameDay:"[\u0789\u07a8\u0787\u07a6\u078b\u07aa] LT",nextDay:"[\u0789\u07a7\u078b\u07a6\u0789\u07a7] LT",nextWeek:"dddd LT",lastDay:"[\u0787\u07a8\u0787\u07b0\u0794\u07ac] LT",lastWeek:"[\u078a\u07a7\u0787\u07a8\u078c\u07aa\u0788\u07a8] dddd LT",sameElse:"L"},relativeTime:{future:"\u078c\u07ac\u0783\u07ad\u078e\u07a6\u0787\u07a8 %s",past:"\u0786\u07aa\u0783\u07a8\u0782\u07b0 %s",s:"\u0790\u07a8\u0786\u07aa\u0782\u07b0\u078c\u07aa\u0786\u07ae\u0785\u07ac\u0787\u07b0",ss:"d% \u0790\u07a8\u0786\u07aa\u0782\u07b0\u078c\u07aa",m:"\u0789\u07a8\u0782\u07a8\u0793\u07ac\u0787\u07b0",mm:"\u0789\u07a8\u0782\u07a8\u0793\u07aa %d",h:"\u078e\u07a6\u0791\u07a8\u0787\u07a8\u0783\u07ac\u0787\u07b0",hh:"\u078e\u07a6\u0791\u07a8\u0787\u07a8\u0783\u07aa %d",d:"\u078b\u07aa\u0788\u07a6\u0780\u07ac\u0787\u07b0",dd:"\u078b\u07aa\u0788\u07a6\u0790\u07b0 %d",M:"\u0789\u07a6\u0780\u07ac\u0787\u07b0",MM:"\u0789\u07a6\u0790\u07b0 %d",y:"\u0787\u07a6\u0780\u07a6\u0783\u07ac\u0787\u07b0",yy:"\u0787\u07a6\u0780\u07a6\u0783\u07aa %d"},preparse:function(e){return e.replace(/\u060c/g,",")},postformat:function(e){return e.replace(/,/g,"\u060c")},week:{dow:7,doy:12}})}(i(16738))},8579:function(v,S,i){!function(r){"use strict";r.defineLocale("el",{monthsNominativeEl:"\u0399\u03b1\u03bd\u03bf\u03c5\u03ac\u03c1\u03b9\u03bf\u03c2_\u03a6\u03b5\u03b2\u03c1\u03bf\u03c5\u03ac\u03c1\u03b9\u03bf\u03c2_\u039c\u03ac\u03c1\u03c4\u03b9\u03bf\u03c2_\u0391\u03c0\u03c1\u03af\u03bb\u03b9\u03bf\u03c2_\u039c\u03ac\u03b9\u03bf\u03c2_\u0399\u03bf\u03cd\u03bd\u03b9\u03bf\u03c2_\u0399\u03bf\u03cd\u03bb\u03b9\u03bf\u03c2_\u0391\u03cd\u03b3\u03bf\u03c5\u03c3\u03c4\u03bf\u03c2_\u03a3\u03b5\u03c0\u03c4\u03ad\u03bc\u03b2\u03c1\u03b9\u03bf\u03c2_\u039f\u03ba\u03c4\u03ce\u03b2\u03c1\u03b9\u03bf\u03c2_\u039d\u03bf\u03ad\u03bc\u03b2\u03c1\u03b9\u03bf\u03c2_\u0394\u03b5\u03ba\u03ad\u03bc\u03b2\u03c1\u03b9\u03bf\u03c2".split("_"),monthsGenitiveEl:"\u0399\u03b1\u03bd\u03bf\u03c5\u03b1\u03c1\u03af\u03bf\u03c5_\u03a6\u03b5\u03b2\u03c1\u03bf\u03c5\u03b1\u03c1\u03af\u03bf\u03c5_\u039c\u03b1\u03c1\u03c4\u03af\u03bf\u03c5_\u0391\u03c0\u03c1\u03b9\u03bb\u03af\u03bf\u03c5_\u039c\u03b1\u0390\u03bf\u03c5_\u0399\u03bf\u03c5\u03bd\u03af\u03bf\u03c5_\u0399\u03bf\u03c5\u03bb\u03af\u03bf\u03c5_\u0391\u03c5\u03b3\u03bf\u03cd\u03c3\u03c4\u03bf\u03c5_\u03a3\u03b5\u03c0\u03c4\u03b5\u03bc\u03b2\u03c1\u03af\u03bf\u03c5_\u039f\u03ba\u03c4\u03c9\u03b2\u03c1\u03af\u03bf\u03c5_\u039d\u03bf\u03b5\u03bc\u03b2\u03c1\u03af\u03bf\u03c5_\u0394\u03b5\u03ba\u03b5\u03bc\u03b2\u03c1\u03af\u03bf\u03c5".split("_"),months:function(f,e){return f?"string"==typeof e&&/D/.test(e.substring(0,e.indexOf("MMMM")))?this._monthsGenitiveEl[f.month()]:this._monthsNominativeEl[f.month()]:this._monthsNominativeEl},monthsShort:"\u0399\u03b1\u03bd_\u03a6\u03b5\u03b2_\u039c\u03b1\u03c1_\u0391\u03c0\u03c1_\u039c\u03b1\u03ca_\u0399\u03bf\u03c5\u03bd_\u0399\u03bf\u03c5\u03bb_\u0391\u03c5\u03b3_\u03a3\u03b5\u03c0_\u039f\u03ba\u03c4_\u039d\u03bf\u03b5_\u0394\u03b5\u03ba".split("_"),weekdays:"\u039a\u03c5\u03c1\u03b9\u03b1\u03ba\u03ae_\u0394\u03b5\u03c5\u03c4\u03ad\u03c1\u03b1_\u03a4\u03c1\u03af\u03c4\u03b7_\u03a4\u03b5\u03c4\u03ac\u03c1\u03c4\u03b7_\u03a0\u03ad\u03bc\u03c0\u03c4\u03b7_\u03a0\u03b1\u03c1\u03b1\u03c3\u03ba\u03b5\u03c5\u03ae_\u03a3\u03ac\u03b2\u03b2\u03b1\u03c4\u03bf".split("_"),weekdaysShort:"\u039a\u03c5\u03c1_\u0394\u03b5\u03c5_\u03a4\u03c1\u03b9_\u03a4\u03b5\u03c4_\u03a0\u03b5\u03bc_\u03a0\u03b1\u03c1_\u03a3\u03b1\u03b2".split("_"),weekdaysMin:"\u039a\u03c5_\u0394\u03b5_\u03a4\u03c1_\u03a4\u03b5_\u03a0\u03b5_\u03a0\u03b1_\u03a3\u03b1".split("_"),meridiem:function(f,e,_){return f>11?_?"\u03bc\u03bc":"\u039c\u039c":_?"\u03c0\u03bc":"\u03a0\u039c"},isPM:function(f){return"\u03bc"===(f+"").toLowerCase()[0]},meridiemParse:/[\u03a0\u039c]\.?\u039c?\.?/i,longDateFormat:{LT:"h:mm A",LTS:"h:mm:ss A",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY h:mm A",LLLL:"dddd, D MMMM YYYY h:mm A"},calendarEl:{sameDay:"[\u03a3\u03ae\u03bc\u03b5\u03c1\u03b1 {}] LT",nextDay:"[\u0391\u03cd\u03c1\u03b9\u03bf {}] LT",nextWeek:"dddd [{}] LT",lastDay:"[\u03a7\u03b8\u03b5\u03c2 {}] LT",lastWeek:function(){switch(this.day()){case 6:return"[\u03c4\u03bf \u03c0\u03c1\u03bf\u03b7\u03b3\u03bf\u03cd\u03bc\u03b5\u03bd\u03bf] dddd [{}] LT";default:return"[\u03c4\u03b7\u03bd \u03c0\u03c1\u03bf\u03b7\u03b3\u03bf\u03cd\u03bc\u03b5\u03bd\u03b7] dddd [{}] LT"}},sameElse:"L"},calendar:function(f,e){var _=this._calendarEl[f],y=e&&e.hours();return function(f){return"undefined"!=typeof Function&&f instanceof Function||"[object Function]"===Object.prototype.toString.call(f)}(_)&&(_=_.apply(e)),_.replace("{}",y%12==1?"\u03c3\u03c4\u03b7":"\u03c3\u03c4\u03b9\u03c2")},relativeTime:{future:"\u03c3\u03b5 %s",past:"%s \u03c0\u03c1\u03b9\u03bd",s:"\u03bb\u03af\u03b3\u03b1 \u03b4\u03b5\u03c5\u03c4\u03b5\u03c1\u03cc\u03bb\u03b5\u03c0\u03c4\u03b1",ss:"%d \u03b4\u03b5\u03c5\u03c4\u03b5\u03c1\u03cc\u03bb\u03b5\u03c0\u03c4\u03b1",m:"\u03ad\u03bd\u03b1 \u03bb\u03b5\u03c0\u03c4\u03cc",mm:"%d \u03bb\u03b5\u03c0\u03c4\u03ac",h:"\u03bc\u03af\u03b1 \u03ce\u03c1\u03b1",hh:"%d \u03ce\u03c1\u03b5\u03c2",d:"\u03bc\u03af\u03b1 \u03bc\u03ad\u03c1\u03b1",dd:"%d \u03bc\u03ad\u03c1\u03b5\u03c2",M:"\u03ad\u03bd\u03b1\u03c2 \u03bc\u03ae\u03bd\u03b1\u03c2",MM:"%d \u03bc\u03ae\u03bd\u03b5\u03c2",y:"\u03ad\u03bd\u03b1\u03c2 \u03c7\u03c1\u03cc\u03bd\u03bf\u03c2",yy:"%d \u03c7\u03c1\u03cc\u03bd\u03b9\u03b1"},dayOfMonthOrdinalParse:/\d{1,2}\u03b7/,ordinal:"%d\u03b7",week:{dow:1,doy:4}})}(i(16738))},25724:function(v,S,i){!function(r){"use strict";r.defineLocale("en-au",{months:"January_February_March_April_May_June_July_August_September_October_November_December".split("_"),monthsShort:"Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec".split("_"),weekdays:"Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday".split("_"),weekdaysShort:"Sun_Mon_Tue_Wed_Thu_Fri_Sat".split("_"),weekdaysMin:"Su_Mo_Tu_We_Th_Fr_Sa".split("_"),longDateFormat:{LT:"h:mm A",LTS:"h:mm:ss A",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY h:mm A",LLLL:"dddd, D MMMM YYYY h:mm A"},calendar:{sameDay:"[Today at] LT",nextDay:"[Tomorrow at] LT",nextWeek:"dddd [at] LT",lastDay:"[Yesterday at] LT",lastWeek:"[Last] dddd [at] LT",sameElse:"L"},relativeTime:{future:"in %s",past:"%s ago",s:"a few seconds",ss:"%d seconds",m:"a minute",mm:"%d minutes",h:"an hour",hh:"%d hours",d:"a day",dd:"%d days",M:"a month",MM:"%d months",y:"a year",yy:"%d years"},dayOfMonthOrdinalParse:/\d{1,2}(st|nd|rd|th)/,ordinal:function(p){var f=p%10;return p+(1==~~(p%100/10)?"th":1===f?"st":2===f?"nd":3===f?"rd":"th")},week:{dow:0,doy:4}})}(i(16738))},10525:function(v,S,i){!function(r){"use strict";r.defineLocale("en-ca",{months:"January_February_March_April_May_June_July_August_September_October_November_December".split("_"),monthsShort:"Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec".split("_"),weekdays:"Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday".split("_"),weekdaysShort:"Sun_Mon_Tue_Wed_Thu_Fri_Sat".split("_"),weekdaysMin:"Su_Mo_Tu_We_Th_Fr_Sa".split("_"),longDateFormat:{LT:"h:mm A",LTS:"h:mm:ss A",L:"YYYY-MM-DD",LL:"MMMM D, YYYY",LLL:"MMMM D, YYYY h:mm A",LLLL:"dddd, MMMM D, YYYY h:mm A"},calendar:{sameDay:"[Today at] LT",nextDay:"[Tomorrow at] LT",nextWeek:"dddd [at] LT",lastDay:"[Yesterday at] LT",lastWeek:"[Last] dddd [at] LT",sameElse:"L"},relativeTime:{future:"in %s",past:"%s ago",s:"a few seconds",ss:"%d seconds",m:"a minute",mm:"%d minutes",h:"an hour",hh:"%d hours",d:"a day",dd:"%d days",M:"a month",MM:"%d months",y:"a year",yy:"%d years"},dayOfMonthOrdinalParse:/\d{1,2}(st|nd|rd|th)/,ordinal:function(p){var f=p%10;return p+(1==~~(p%100/10)?"th":1===f?"st":2===f?"nd":3===f?"rd":"th")}})}(i(16738))},52847:function(v,S,i){!function(r){"use strict";r.defineLocale("en-gb",{months:"January_February_March_April_May_June_July_August_September_October_November_December".split("_"),monthsShort:"Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec".split("_"),weekdays:"Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday".split("_"),weekdaysShort:"Sun_Mon_Tue_Wed_Thu_Fri_Sat".split("_"),weekdaysMin:"Su_Mo_Tu_We_Th_Fr_Sa".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd, D MMMM YYYY HH:mm"},calendar:{sameDay:"[Today at] LT",nextDay:"[Tomorrow at] LT",nextWeek:"dddd [at] LT",lastDay:"[Yesterday at] LT",lastWeek:"[Last] dddd [at] LT",sameElse:"L"},relativeTime:{future:"in %s",past:"%s ago",s:"a few seconds",ss:"%d seconds",m:"a minute",mm:"%d minutes",h:"an hour",hh:"%d hours",d:"a day",dd:"%d days",M:"a month",MM:"%d months",y:"a year",yy:"%d years"},dayOfMonthOrdinalParse:/\d{1,2}(st|nd|rd|th)/,ordinal:function(p){var f=p%10;return p+(1==~~(p%100/10)?"th":1===f?"st":2===f?"nd":3===f?"rd":"th")},week:{dow:1,doy:4}})}(i(16738))},67216:function(v,S,i){!function(r){"use strict";r.defineLocale("en-ie",{months:"January_February_March_April_May_June_July_August_September_October_November_December".split("_"),monthsShort:"Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec".split("_"),weekdays:"Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday".split("_"),weekdaysShort:"Sun_Mon_Tue_Wed_Thu_Fri_Sat".split("_"),weekdaysMin:"Su_Mo_Tu_We_Th_Fr_Sa".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd D MMMM YYYY HH:mm"},calendar:{sameDay:"[Today at] LT",nextDay:"[Tomorrow at] LT",nextWeek:"dddd [at] LT",lastDay:"[Yesterday at] LT",lastWeek:"[Last] dddd [at] LT",sameElse:"L"},relativeTime:{future:"in %s",past:"%s ago",s:"a few seconds",ss:"%d seconds",m:"a minute",mm:"%d minutes",h:"an hour",hh:"%d hours",d:"a day",dd:"%d days",M:"a month",MM:"%d months",y:"a year",yy:"%d years"},dayOfMonthOrdinalParse:/\d{1,2}(st|nd|rd|th)/,ordinal:function(p){var f=p%10;return p+(1==~~(p%100/10)?"th":1===f?"st":2===f?"nd":3===f?"rd":"th")},week:{dow:1,doy:4}})}(i(16738))},39305:function(v,S,i){!function(r){"use strict";r.defineLocale("en-il",{months:"January_February_March_April_May_June_July_August_September_October_November_December".split("_"),monthsShort:"Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec".split("_"),weekdays:"Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday".split("_"),weekdaysShort:"Sun_Mon_Tue_Wed_Thu_Fri_Sat".split("_"),weekdaysMin:"Su_Mo_Tu_We_Th_Fr_Sa".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd, D MMMM YYYY HH:mm"},calendar:{sameDay:"[Today at] LT",nextDay:"[Tomorrow at] LT",nextWeek:"dddd [at] LT",lastDay:"[Yesterday at] LT",lastWeek:"[Last] dddd [at] LT",sameElse:"L"},relativeTime:{future:"in %s",past:"%s ago",s:"a few seconds",ss:"%d seconds",m:"a minute",mm:"%d minutes",h:"an hour",hh:"%d hours",d:"a day",dd:"%d days",M:"a month",MM:"%d months",y:"a year",yy:"%d years"},dayOfMonthOrdinalParse:/\d{1,2}(st|nd|rd|th)/,ordinal:function(p){var f=p%10;return p+(1==~~(p%100/10)?"th":1===f?"st":2===f?"nd":3===f?"rd":"th")}})}(i(16738))},73364:function(v,S,i){!function(r){"use strict";r.defineLocale("en-in",{months:"January_February_March_April_May_June_July_August_September_October_November_December".split("_"),monthsShort:"Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec".split("_"),weekdays:"Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday".split("_"),weekdaysShort:"Sun_Mon_Tue_Wed_Thu_Fri_Sat".split("_"),weekdaysMin:"Su_Mo_Tu_We_Th_Fr_Sa".split("_"),longDateFormat:{LT:"h:mm A",LTS:"h:mm:ss A",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY h:mm A",LLLL:"dddd, D MMMM YYYY h:mm A"},calendar:{sameDay:"[Today at] LT",nextDay:"[Tomorrow at] LT",nextWeek:"dddd [at] LT",lastDay:"[Yesterday at] LT",lastWeek:"[Last] dddd [at] LT",sameElse:"L"},relativeTime:{future:"in %s",past:"%s ago",s:"a few seconds",ss:"%d seconds",m:"a minute",mm:"%d minutes",h:"an hour",hh:"%d hours",d:"a day",dd:"%d days",M:"a month",MM:"%d months",y:"a year",yy:"%d years"},dayOfMonthOrdinalParse:/\d{1,2}(st|nd|rd|th)/,ordinal:function(p){var f=p%10;return p+(1==~~(p%100/10)?"th":1===f?"st":2===f?"nd":3===f?"rd":"th")},week:{dow:0,doy:6}})}(i(16738))},79130:function(v,S,i){!function(r){"use strict";r.defineLocale("en-nz",{months:"January_February_March_April_May_June_July_August_September_October_November_December".split("_"),monthsShort:"Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec".split("_"),weekdays:"Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday".split("_"),weekdaysShort:"Sun_Mon_Tue_Wed_Thu_Fri_Sat".split("_"),weekdaysMin:"Su_Mo_Tu_We_Th_Fr_Sa".split("_"),longDateFormat:{LT:"h:mm A",LTS:"h:mm:ss A",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY h:mm A",LLLL:"dddd, D MMMM YYYY h:mm A"},calendar:{sameDay:"[Today at] LT",nextDay:"[Tomorrow at] LT",nextWeek:"dddd [at] LT",lastDay:"[Yesterday at] LT",lastWeek:"[Last] dddd [at] LT",sameElse:"L"},relativeTime:{future:"in %s",past:"%s ago",s:"a few seconds",ss:"%d seconds",m:"a minute",mm:"%d minutes",h:"an hour",hh:"%d hours",d:"a day",dd:"%d days",M:"a month",MM:"%d months",y:"a year",yy:"%d years"},dayOfMonthOrdinalParse:/\d{1,2}(st|nd|rd|th)/,ordinal:function(p){var f=p%10;return p+(1==~~(p%100/10)?"th":1===f?"st":2===f?"nd":3===f?"rd":"th")},week:{dow:1,doy:4}})}(i(16738))},11161:function(v,S,i){!function(r){"use strict";r.defineLocale("en-sg",{months:"January_February_March_April_May_June_July_August_September_October_November_December".split("_"),monthsShort:"Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec".split("_"),weekdays:"Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday".split("_"),weekdaysShort:"Sun_Mon_Tue_Wed_Thu_Fri_Sat".split("_"),weekdaysMin:"Su_Mo_Tu_We_Th_Fr_Sa".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd, D MMMM YYYY HH:mm"},calendar:{sameDay:"[Today at] LT",nextDay:"[Tomorrow at] LT",nextWeek:"dddd [at] LT",lastDay:"[Yesterday at] LT",lastWeek:"[Last] dddd [at] LT",sameElse:"L"},relativeTime:{future:"in %s",past:"%s ago",s:"a few seconds",ss:"%d seconds",m:"a minute",mm:"%d minutes",h:"an hour",hh:"%d hours",d:"a day",dd:"%d days",M:"a month",MM:"%d months",y:"a year",yy:"%d years"},dayOfMonthOrdinalParse:/\d{1,2}(st|nd|rd|th)/,ordinal:function(p){var f=p%10;return p+(1==~~(p%100/10)?"th":1===f?"st":2===f?"nd":3===f?"rd":"th")},week:{dow:1,doy:4}})}(i(16738))},50802:function(v,S,i){!function(r){"use strict";r.defineLocale("eo",{months:"januaro_februaro_marto_aprilo_majo_junio_julio_a\u016dgusto_septembro_oktobro_novembro_decembro".split("_"),monthsShort:"jan_feb_mart_apr_maj_jun_jul_a\u016dg_sept_okt_nov_dec".split("_"),weekdays:"diman\u0109o_lundo_mardo_merkredo_\u0135a\u016ddo_vendredo_sabato".split("_"),weekdaysShort:"dim_lun_mard_merk_\u0135a\u016d_ven_sab".split("_"),weekdaysMin:"di_lu_ma_me_\u0135a_ve_sa".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"YYYY-MM-DD",LL:"[la] D[-an de] MMMM, YYYY",LLL:"[la] D[-an de] MMMM, YYYY HH:mm",LLLL:"dddd[n], [la] D[-an de] MMMM, YYYY HH:mm",llll:"ddd, [la] D[-an de] MMM, YYYY HH:mm"},meridiemParse:/[ap]\.t\.m/i,isPM:function(p){return"p"===p.charAt(0).toLowerCase()},meridiem:function(p,f,e){return p>11?e?"p.t.m.":"P.T.M.":e?"a.t.m.":"A.T.M."},calendar:{sameDay:"[Hodia\u016d je] LT",nextDay:"[Morga\u016d je] LT",nextWeek:"dddd[n je] LT",lastDay:"[Hiera\u016d je] LT",lastWeek:"[pasintan] dddd[n je] LT",sameElse:"L"},relativeTime:{future:"post %s",past:"anta\u016d %s",s:"kelkaj sekundoj",ss:"%d sekundoj",m:"unu minuto",mm:"%d minutoj",h:"unu horo",hh:"%d horoj",d:"unu tago",dd:"%d tagoj",M:"unu monato",MM:"%d monatoj",y:"unu jaro",yy:"%d jaroj"},dayOfMonthOrdinalParse:/\d{1,2}a/,ordinal:"%da",week:{dow:1,doy:7}})}(i(16738))},45551:function(v,S,i){!function(r){"use strict";var u="ene._feb._mar._abr._may._jun._jul._ago._sep._oct._nov._dic.".split("_"),p="ene_feb_mar_abr_may_jun_jul_ago_sep_oct_nov_dic".split("_"),f=[/^ene/i,/^feb/i,/^mar/i,/^abr/i,/^may/i,/^jun/i,/^jul/i,/^ago/i,/^sep/i,/^oct/i,/^nov/i,/^dic/i],e=/^(enero|febrero|marzo|abril|mayo|junio|julio|agosto|septiembre|octubre|noviembre|diciembre|ene\.?|feb\.?|mar\.?|abr\.?|may\.?|jun\.?|jul\.?|ago\.?|sep\.?|oct\.?|nov\.?|dic\.?)/i;r.defineLocale("es-do",{months:"enero_febrero_marzo_abril_mayo_junio_julio_agosto_septiembre_octubre_noviembre_diciembre".split("_"),monthsShort:function(y,T){return y?/-MMM-/.test(T)?p[y.month()]:u[y.month()]:u},monthsRegex:e,monthsShortRegex:e,monthsStrictRegex:/^(enero|febrero|marzo|abril|mayo|junio|julio|agosto|septiembre|octubre|noviembre|diciembre)/i,monthsShortStrictRegex:/^(ene\.?|feb\.?|mar\.?|abr\.?|may\.?|jun\.?|jul\.?|ago\.?|sep\.?|oct\.?|nov\.?|dic\.?)/i,monthsParse:f,longMonthsParse:f,shortMonthsParse:f,weekdays:"domingo_lunes_martes_mi\xe9rcoles_jueves_viernes_s\xe1bado".split("_"),weekdaysShort:"dom._lun._mar._mi\xe9._jue._vie._s\xe1b.".split("_"),weekdaysMin:"do_lu_ma_mi_ju_vi_s\xe1".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"h:mm A",LTS:"h:mm:ss A",L:"DD/MM/YYYY",LL:"D [de] MMMM [de] YYYY",LLL:"D [de] MMMM [de] YYYY h:mm A",LLLL:"dddd, D [de] MMMM [de] YYYY h:mm A"},calendar:{sameDay:function(){return"[hoy a la"+(1!==this.hours()?"s":"")+"] LT"},nextDay:function(){return"[ma\xf1ana a la"+(1!==this.hours()?"s":"")+"] LT"},nextWeek:function(){return"dddd [a la"+(1!==this.hours()?"s":"")+"] LT"},lastDay:function(){return"[ayer a la"+(1!==this.hours()?"s":"")+"] LT"},lastWeek:function(){return"[el] dddd [pasado a la"+(1!==this.hours()?"s":"")+"] LT"},sameElse:"L"},relativeTime:{future:"en %s",past:"hace %s",s:"unos segundos",ss:"%d segundos",m:"un minuto",mm:"%d minutos",h:"una hora",hh:"%d horas",d:"un d\xeda",dd:"%d d\xedas",w:"una semana",ww:"%d semanas",M:"un mes",MM:"%d meses",y:"un a\xf1o",yy:"%d a\xf1os"},dayOfMonthOrdinalParse:/\d{1,2}\xba/,ordinal:"%d\xba",week:{dow:1,doy:4}})}(i(16738))},75615:function(v,S,i){!function(r){"use strict";var u="ene._feb._mar._abr._may._jun._jul._ago._sep._oct._nov._dic.".split("_"),p="ene_feb_mar_abr_may_jun_jul_ago_sep_oct_nov_dic".split("_"),f=[/^ene/i,/^feb/i,/^mar/i,/^abr/i,/^may/i,/^jun/i,/^jul/i,/^ago/i,/^sep/i,/^oct/i,/^nov/i,/^dic/i],e=/^(enero|febrero|marzo|abril|mayo|junio|julio|agosto|septiembre|octubre|noviembre|diciembre|ene\.?|feb\.?|mar\.?|abr\.?|may\.?|jun\.?|jul\.?|ago\.?|sep\.?|oct\.?|nov\.?|dic\.?)/i;r.defineLocale("es-mx",{months:"enero_febrero_marzo_abril_mayo_junio_julio_agosto_septiembre_octubre_noviembre_diciembre".split("_"),monthsShort:function(y,T){return y?/-MMM-/.test(T)?p[y.month()]:u[y.month()]:u},monthsRegex:e,monthsShortRegex:e,monthsStrictRegex:/^(enero|febrero|marzo|abril|mayo|junio|julio|agosto|septiembre|octubre|noviembre|diciembre)/i,monthsShortStrictRegex:/^(ene\.?|feb\.?|mar\.?|abr\.?|may\.?|jun\.?|jul\.?|ago\.?|sep\.?|oct\.?|nov\.?|dic\.?)/i,monthsParse:f,longMonthsParse:f,shortMonthsParse:f,weekdays:"domingo_lunes_martes_mi\xe9rcoles_jueves_viernes_s\xe1bado".split("_"),weekdaysShort:"dom._lun._mar._mi\xe9._jue._vie._s\xe1b.".split("_"),weekdaysMin:"do_lu_ma_mi_ju_vi_s\xe1".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"H:mm",LTS:"H:mm:ss",L:"DD/MM/YYYY",LL:"D [de] MMMM [de] YYYY",LLL:"D [de] MMMM [de] YYYY H:mm",LLLL:"dddd, D [de] MMMM [de] YYYY H:mm"},calendar:{sameDay:function(){return"[hoy a la"+(1!==this.hours()?"s":"")+"] LT"},nextDay:function(){return"[ma\xf1ana a la"+(1!==this.hours()?"s":"")+"] LT"},nextWeek:function(){return"dddd [a la"+(1!==this.hours()?"s":"")+"] LT"},lastDay:function(){return"[ayer a la"+(1!==this.hours()?"s":"")+"] LT"},lastWeek:function(){return"[el] dddd [pasado a la"+(1!==this.hours()?"s":"")+"] LT"},sameElse:"L"},relativeTime:{future:"en %s",past:"hace %s",s:"unos segundos",ss:"%d segundos",m:"un minuto",mm:"%d minutos",h:"una hora",hh:"%d horas",d:"un d\xeda",dd:"%d d\xedas",w:"una semana",ww:"%d semanas",M:"un mes",MM:"%d meses",y:"un a\xf1o",yy:"%d a\xf1os"},dayOfMonthOrdinalParse:/\d{1,2}\xba/,ordinal:"%d\xba",week:{dow:0,doy:4},invalidDate:"Fecha inv\xe1lida"})}(i(16738))},64790:function(v,S,i){!function(r){"use strict";var u="ene._feb._mar._abr._may._jun._jul._ago._sep._oct._nov._dic.".split("_"),p="ene_feb_mar_abr_may_jun_jul_ago_sep_oct_nov_dic".split("_"),f=[/^ene/i,/^feb/i,/^mar/i,/^abr/i,/^may/i,/^jun/i,/^jul/i,/^ago/i,/^sep/i,/^oct/i,/^nov/i,/^dic/i],e=/^(enero|febrero|marzo|abril|mayo|junio|julio|agosto|septiembre|octubre|noviembre|diciembre|ene\.?|feb\.?|mar\.?|abr\.?|may\.?|jun\.?|jul\.?|ago\.?|sep\.?|oct\.?|nov\.?|dic\.?)/i;r.defineLocale("es-us",{months:"enero_febrero_marzo_abril_mayo_junio_julio_agosto_septiembre_octubre_noviembre_diciembre".split("_"),monthsShort:function(y,T){return y?/-MMM-/.test(T)?p[y.month()]:u[y.month()]:u},monthsRegex:e,monthsShortRegex:e,monthsStrictRegex:/^(enero|febrero|marzo|abril|mayo|junio|julio|agosto|septiembre|octubre|noviembre|diciembre)/i,monthsShortStrictRegex:/^(ene\.?|feb\.?|mar\.?|abr\.?|may\.?|jun\.?|jul\.?|ago\.?|sep\.?|oct\.?|nov\.?|dic\.?)/i,monthsParse:f,longMonthsParse:f,shortMonthsParse:f,weekdays:"domingo_lunes_martes_mi\xe9rcoles_jueves_viernes_s\xe1bado".split("_"),weekdaysShort:"dom._lun._mar._mi\xe9._jue._vie._s\xe1b.".split("_"),weekdaysMin:"do_lu_ma_mi_ju_vi_s\xe1".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"h:mm A",LTS:"h:mm:ss A",L:"MM/DD/YYYY",LL:"D [de] MMMM [de] YYYY",LLL:"D [de] MMMM [de] YYYY h:mm A",LLLL:"dddd, D [de] MMMM [de] YYYY h:mm A"},calendar:{sameDay:function(){return"[hoy a la"+(1!==this.hours()?"s":"")+"] LT"},nextDay:function(){return"[ma\xf1ana a la"+(1!==this.hours()?"s":"")+"] LT"},nextWeek:function(){return"dddd [a la"+(1!==this.hours()?"s":"")+"] LT"},lastDay:function(){return"[ayer a la"+(1!==this.hours()?"s":"")+"] LT"},lastWeek:function(){return"[el] dddd [pasado a la"+(1!==this.hours()?"s":"")+"] LT"},sameElse:"L"},relativeTime:{future:"en %s",past:"hace %s",s:"unos segundos",ss:"%d segundos",m:"un minuto",mm:"%d minutos",h:"una hora",hh:"%d horas",d:"un d\xeda",dd:"%d d\xedas",w:"una semana",ww:"%d semanas",M:"un mes",MM:"%d meses",y:"un a\xf1o",yy:"%d a\xf1os"},dayOfMonthOrdinalParse:/\d{1,2}\xba/,ordinal:"%d\xba",week:{dow:0,doy:6}})}(i(16738))},40328:function(v,S,i){!function(r){"use strict";var u="ene._feb._mar._abr._may._jun._jul._ago._sep._oct._nov._dic.".split("_"),p="ene_feb_mar_abr_may_jun_jul_ago_sep_oct_nov_dic".split("_"),f=[/^ene/i,/^feb/i,/^mar/i,/^abr/i,/^may/i,/^jun/i,/^jul/i,/^ago/i,/^sep/i,/^oct/i,/^nov/i,/^dic/i],e=/^(enero|febrero|marzo|abril|mayo|junio|julio|agosto|septiembre|octubre|noviembre|diciembre|ene\.?|feb\.?|mar\.?|abr\.?|may\.?|jun\.?|jul\.?|ago\.?|sep\.?|oct\.?|nov\.?|dic\.?)/i;r.defineLocale("es",{months:"enero_febrero_marzo_abril_mayo_junio_julio_agosto_septiembre_octubre_noviembre_diciembre".split("_"),monthsShort:function(y,T){return y?/-MMM-/.test(T)?p[y.month()]:u[y.month()]:u},monthsRegex:e,monthsShortRegex:e,monthsStrictRegex:/^(enero|febrero|marzo|abril|mayo|junio|julio|agosto|septiembre|octubre|noviembre|diciembre)/i,monthsShortStrictRegex:/^(ene\.?|feb\.?|mar\.?|abr\.?|may\.?|jun\.?|jul\.?|ago\.?|sep\.?|oct\.?|nov\.?|dic\.?)/i,monthsParse:f,longMonthsParse:f,shortMonthsParse:f,weekdays:"domingo_lunes_martes_mi\xe9rcoles_jueves_viernes_s\xe1bado".split("_"),weekdaysShort:"dom._lun._mar._mi\xe9._jue._vie._s\xe1b.".split("_"),weekdaysMin:"do_lu_ma_mi_ju_vi_s\xe1".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"H:mm",LTS:"H:mm:ss",L:"DD/MM/YYYY",LL:"D [de] MMMM [de] YYYY",LLL:"D [de] MMMM [de] YYYY H:mm",LLLL:"dddd, D [de] MMMM [de] YYYY H:mm"},calendar:{sameDay:function(){return"[hoy a la"+(1!==this.hours()?"s":"")+"] LT"},nextDay:function(){return"[ma\xf1ana a la"+(1!==this.hours()?"s":"")+"] LT"},nextWeek:function(){return"dddd [a la"+(1!==this.hours()?"s":"")+"] LT"},lastDay:function(){return"[ayer a la"+(1!==this.hours()?"s":"")+"] LT"},lastWeek:function(){return"[el] dddd [pasado a la"+(1!==this.hours()?"s":"")+"] LT"},sameElse:"L"},relativeTime:{future:"en %s",past:"hace %s",s:"unos segundos",ss:"%d segundos",m:"un minuto",mm:"%d minutos",h:"una hora",hh:"%d horas",d:"un d\xeda",dd:"%d d\xedas",w:"una semana",ww:"%d semanas",M:"un mes",MM:"%d meses",y:"un a\xf1o",yy:"%d a\xf1os"},dayOfMonthOrdinalParse:/\d{1,2}\xba/,ordinal:"%d\xba",week:{dow:1,doy:4},invalidDate:"Fecha inv\xe1lida"})}(i(16738))},96389:function(v,S,i){!function(r){"use strict";function u(f,e,_,y){var T={s:["m\xf5ne sekundi","m\xf5ni sekund","paar sekundit"],ss:[f+"sekundi",f+"sekundit"],m:["\xfche minuti","\xfcks minut"],mm:[f+" minuti",f+" minutit"],h:["\xfche tunni","tund aega","\xfcks tund"],hh:[f+" tunni",f+" tundi"],d:["\xfche p\xe4eva","\xfcks p\xe4ev"],M:["kuu aja","kuu aega","\xfcks kuu"],MM:[f+" kuu",f+" kuud"],y:["\xfche aasta","aasta","\xfcks aasta"],yy:[f+" aasta",f+" aastat"]};return e?T[_][2]?T[_][2]:T[_][1]:y?T[_][0]:T[_][1]}r.defineLocale("et",{months:"jaanuar_veebruar_m\xe4rts_aprill_mai_juuni_juuli_august_september_oktoober_november_detsember".split("_"),monthsShort:"jaan_veebr_m\xe4rts_apr_mai_juuni_juuli_aug_sept_okt_nov_dets".split("_"),weekdays:"p\xfchap\xe4ev_esmasp\xe4ev_teisip\xe4ev_kolmap\xe4ev_neljap\xe4ev_reede_laup\xe4ev".split("_"),weekdaysShort:"P_E_T_K_N_R_L".split("_"),weekdaysMin:"P_E_T_K_N_R_L".split("_"),longDateFormat:{LT:"H:mm",LTS:"H:mm:ss",L:"DD.MM.YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY H:mm",LLLL:"dddd, D. MMMM YYYY H:mm"},calendar:{sameDay:"[T\xe4na,] LT",nextDay:"[Homme,] LT",nextWeek:"[J\xe4rgmine] dddd LT",lastDay:"[Eile,] LT",lastWeek:"[Eelmine] dddd LT",sameElse:"L"},relativeTime:{future:"%s p\xe4rast",past:"%s tagasi",s:u,ss:u,m:u,mm:u,h:u,hh:u,d:u,dd:"%d p\xe4eva",M:u,MM:u,y:u,yy:u},dayOfMonthOrdinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:4}})}(i(16738))},52961:function(v,S,i){!function(r){"use strict";r.defineLocale("eu",{months:"urtarrila_otsaila_martxoa_apirila_maiatza_ekaina_uztaila_abuztua_iraila_urria_azaroa_abendua".split("_"),monthsShort:"urt._ots._mar._api._mai._eka._uzt._abu._ira._urr._aza._abe.".split("_"),monthsParseExact:!0,weekdays:"igandea_astelehena_asteartea_asteazkena_osteguna_ostirala_larunbata".split("_"),weekdaysShort:"ig._al._ar._az._og._ol._lr.".split("_"),weekdaysMin:"ig_al_ar_az_og_ol_lr".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"YYYY-MM-DD",LL:"YYYY[ko] MMMM[ren] D[a]",LLL:"YYYY[ko] MMMM[ren] D[a] HH:mm",LLLL:"dddd, YYYY[ko] MMMM[ren] D[a] HH:mm",l:"YYYY-M-D",ll:"YYYY[ko] MMM D[a]",lll:"YYYY[ko] MMM D[a] HH:mm",llll:"ddd, YYYY[ko] MMM D[a] HH:mm"},calendar:{sameDay:"[gaur] LT[etan]",nextDay:"[bihar] LT[etan]",nextWeek:"dddd LT[etan]",lastDay:"[atzo] LT[etan]",lastWeek:"[aurreko] dddd LT[etan]",sameElse:"L"},relativeTime:{future:"%s barru",past:"duela %s",s:"segundo batzuk",ss:"%d segundo",m:"minutu bat",mm:"%d minutu",h:"ordu bat",hh:"%d ordu",d:"egun bat",dd:"%d egun",M:"hilabete bat",MM:"%d hilabete",y:"urte bat",yy:"%d urte"},dayOfMonthOrdinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:7}})}(i(16738))},26151:function(v,S,i){!function(r){"use strict";var u={1:"\u06f1",2:"\u06f2",3:"\u06f3",4:"\u06f4",5:"\u06f5",6:"\u06f6",7:"\u06f7",8:"\u06f8",9:"\u06f9",0:"\u06f0"},p={"\u06f1":"1","\u06f2":"2","\u06f3":"3","\u06f4":"4","\u06f5":"5","\u06f6":"6","\u06f7":"7","\u06f8":"8","\u06f9":"9","\u06f0":"0"};r.defineLocale("fa",{months:"\u0698\u0627\u0646\u0648\u06cc\u0647_\u0641\u0648\u0631\u06cc\u0647_\u0645\u0627\u0631\u0633_\u0622\u0648\u0631\u06cc\u0644_\u0645\u0647_\u0698\u0648\u0626\u0646_\u0698\u0648\u0626\u06cc\u0647_\u0627\u0648\u062a_\u0633\u067e\u062a\u0627\u0645\u0628\u0631_\u0627\u06a9\u062a\u0628\u0631_\u0646\u0648\u0627\u0645\u0628\u0631_\u062f\u0633\u0627\u0645\u0628\u0631".split("_"),monthsShort:"\u0698\u0627\u0646\u0648\u06cc\u0647_\u0641\u0648\u0631\u06cc\u0647_\u0645\u0627\u0631\u0633_\u0622\u0648\u0631\u06cc\u0644_\u0645\u0647_\u0698\u0648\u0626\u0646_\u0698\u0648\u0626\u06cc\u0647_\u0627\u0648\u062a_\u0633\u067e\u062a\u0627\u0645\u0628\u0631_\u0627\u06a9\u062a\u0628\u0631_\u0646\u0648\u0627\u0645\u0628\u0631_\u062f\u0633\u0627\u0645\u0628\u0631".split("_"),weekdays:"\u06cc\u06a9\u200c\u0634\u0646\u0628\u0647_\u062f\u0648\u0634\u0646\u0628\u0647_\u0633\u0647\u200c\u0634\u0646\u0628\u0647_\u0686\u0647\u0627\u0631\u0634\u0646\u0628\u0647_\u067e\u0646\u062c\u200c\u0634\u0646\u0628\u0647_\u062c\u0645\u0639\u0647_\u0634\u0646\u0628\u0647".split("_"),weekdaysShort:"\u06cc\u06a9\u200c\u0634\u0646\u0628\u0647_\u062f\u0648\u0634\u0646\u0628\u0647_\u0633\u0647\u200c\u0634\u0646\u0628\u0647_\u0686\u0647\u0627\u0631\u0634\u0646\u0628\u0647_\u067e\u0646\u062c\u200c\u0634\u0646\u0628\u0647_\u062c\u0645\u0639\u0647_\u0634\u0646\u0628\u0647".split("_"),weekdaysMin:"\u06cc_\u062f_\u0633_\u0686_\u067e_\u062c_\u0634".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd, D MMMM YYYY HH:mm"},meridiemParse:/\u0642\u0628\u0644 \u0627\u0632 \u0638\u0647\u0631|\u0628\u0639\u062f \u0627\u0632 \u0638\u0647\u0631/,isPM:function(e){return/\u0628\u0639\u062f \u0627\u0632 \u0638\u0647\u0631/.test(e)},meridiem:function(e,_,y){return e<12?"\u0642\u0628\u0644 \u0627\u0632 \u0638\u0647\u0631":"\u0628\u0639\u062f \u0627\u0632 \u0638\u0647\u0631"},calendar:{sameDay:"[\u0627\u0645\u0631\u0648\u0632 \u0633\u0627\u0639\u062a] LT",nextDay:"[\u0641\u0631\u062f\u0627 \u0633\u0627\u0639\u062a] LT",nextWeek:"dddd [\u0633\u0627\u0639\u062a] LT",lastDay:"[\u062f\u06cc\u0631\u0648\u0632 \u0633\u0627\u0639\u062a] LT",lastWeek:"dddd [\u067e\u06cc\u0634] [\u0633\u0627\u0639\u062a] LT",sameElse:"L"},relativeTime:{future:"\u062f\u0631 %s",past:"%s \u067e\u06cc\u0634",s:"\u0686\u0646\u062f \u062b\u0627\u0646\u06cc\u0647",ss:"%d \u062b\u0627\u0646\u06cc\u0647",m:"\u06cc\u06a9 \u062f\u0642\u06cc\u0642\u0647",mm:"%d \u062f\u0642\u06cc\u0642\u0647",h:"\u06cc\u06a9 \u0633\u0627\u0639\u062a",hh:"%d \u0633\u0627\u0639\u062a",d:"\u06cc\u06a9 \u0631\u0648\u0632",dd:"%d \u0631\u0648\u0632",M:"\u06cc\u06a9 \u0645\u0627\u0647",MM:"%d \u0645\u0627\u0647",y:"\u06cc\u06a9 \u0633\u0627\u0644",yy:"%d \u0633\u0627\u0644"},preparse:function(e){return e.replace(/[\u06f0-\u06f9]/g,function(_){return p[_]}).replace(/\u060c/g,",")},postformat:function(e){return e.replace(/\d/g,function(_){return u[_]}).replace(/,/g,"\u060c")},dayOfMonthOrdinalParse:/\d{1,2}\u0645/,ordinal:"%d\u0645",week:{dow:6,doy:12}})}(i(16738))},7997:function(v,S,i){!function(r){"use strict";var u="nolla yksi kaksi kolme nelj\xe4 viisi kuusi seitsem\xe4n kahdeksan yhdeks\xe4n".split(" "),p=["nolla","yhden","kahden","kolmen","nelj\xe4n","viiden","kuuden",u[7],u[8],u[9]];function f(y,T,M,R){var F="";switch(M){case"s":return R?"muutaman sekunnin":"muutama sekunti";case"ss":F=R?"sekunnin":"sekuntia";break;case"m":return R?"minuutin":"minuutti";case"mm":F=R?"minuutin":"minuuttia";break;case"h":return R?"tunnin":"tunti";case"hh":F=R?"tunnin":"tuntia";break;case"d":return R?"p\xe4iv\xe4n":"p\xe4iv\xe4";case"dd":F=R?"p\xe4iv\xe4n":"p\xe4iv\xe4\xe4";break;case"M":return R?"kuukauden":"kuukausi";case"MM":F=R?"kuukauden":"kuukautta";break;case"y":return R?"vuoden":"vuosi";case"yy":F=R?"vuoden":"vuotta"}return function(y,T){return y<10?T?p[y]:u[y]:y}(y,R)+" "+F}r.defineLocale("fi",{months:"tammikuu_helmikuu_maaliskuu_huhtikuu_toukokuu_kes\xe4kuu_hein\xe4kuu_elokuu_syyskuu_lokakuu_marraskuu_joulukuu".split("_"),monthsShort:"tammi_helmi_maalis_huhti_touko_kes\xe4_hein\xe4_elo_syys_loka_marras_joulu".split("_"),weekdays:"sunnuntai_maanantai_tiistai_keskiviikko_torstai_perjantai_lauantai".split("_"),weekdaysShort:"su_ma_ti_ke_to_pe_la".split("_"),weekdaysMin:"su_ma_ti_ke_to_pe_la".split("_"),longDateFormat:{LT:"HH.mm",LTS:"HH.mm.ss",L:"DD.MM.YYYY",LL:"Do MMMM[ta] YYYY",LLL:"Do MMMM[ta] YYYY, [klo] HH.mm",LLLL:"dddd, Do MMMM[ta] YYYY, [klo] HH.mm",l:"D.M.YYYY",ll:"Do MMM YYYY",lll:"Do MMM YYYY, [klo] HH.mm",llll:"ddd, Do MMM YYYY, [klo] HH.mm"},calendar:{sameDay:"[t\xe4n\xe4\xe4n] [klo] LT",nextDay:"[huomenna] [klo] LT",nextWeek:"dddd [klo] LT",lastDay:"[eilen] [klo] LT",lastWeek:"[viime] dddd[na] [klo] LT",sameElse:"L"},relativeTime:{future:"%s p\xe4\xe4st\xe4",past:"%s sitten",s:f,ss:f,m:f,mm:f,h:f,hh:f,d:f,dd:f,M:f,MM:f,y:f,yy:f},dayOfMonthOrdinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:4}})}(i(16738))},58898:function(v,S,i){!function(r){"use strict";r.defineLocale("fil",{months:"Enero_Pebrero_Marso_Abril_Mayo_Hunyo_Hulyo_Agosto_Setyembre_Oktubre_Nobyembre_Disyembre".split("_"),monthsShort:"Ene_Peb_Mar_Abr_May_Hun_Hul_Ago_Set_Okt_Nob_Dis".split("_"),weekdays:"Linggo_Lunes_Martes_Miyerkules_Huwebes_Biyernes_Sabado".split("_"),weekdaysShort:"Lin_Lun_Mar_Miy_Huw_Biy_Sab".split("_"),weekdaysMin:"Li_Lu_Ma_Mi_Hu_Bi_Sab".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"MM/D/YYYY",LL:"MMMM D, YYYY",LLL:"MMMM D, YYYY HH:mm",LLLL:"dddd, MMMM DD, YYYY HH:mm"},calendar:{sameDay:"LT [ngayong araw]",nextDay:"[Bukas ng] LT",nextWeek:"LT [sa susunod na] dddd",lastDay:"LT [kahapon]",lastWeek:"LT [noong nakaraang] dddd",sameElse:"L"},relativeTime:{future:"sa loob ng %s",past:"%s ang nakalipas",s:"ilang segundo",ss:"%d segundo",m:"isang minuto",mm:"%d minuto",h:"isang oras",hh:"%d oras",d:"isang araw",dd:"%d araw",M:"isang buwan",MM:"%d buwan",y:"isang taon",yy:"%d taon"},dayOfMonthOrdinalParse:/\d{1,2}/,ordinal:function(p){return p},week:{dow:1,doy:4}})}(i(16738))},37779:function(v,S,i){!function(r){"use strict";r.defineLocale("fo",{months:"januar_februar_mars_apr\xedl_mai_juni_juli_august_september_oktober_november_desember".split("_"),monthsShort:"jan_feb_mar_apr_mai_jun_jul_aug_sep_okt_nov_des".split("_"),weekdays:"sunnudagur_m\xe1nadagur_t\xfdsdagur_mikudagur_h\xf3sdagur_fr\xedggjadagur_leygardagur".split("_"),weekdaysShort:"sun_m\xe1n_t\xfds_mik_h\xf3s_fr\xed_ley".split("_"),weekdaysMin:"su_m\xe1_t\xfd_mi_h\xf3_fr_le".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd D. MMMM, YYYY HH:mm"},calendar:{sameDay:"[\xcd dag kl.] LT",nextDay:"[\xcd morgin kl.] LT",nextWeek:"dddd [kl.] LT",lastDay:"[\xcd gj\xe1r kl.] LT",lastWeek:"[s\xed\xf0stu] dddd [kl] LT",sameElse:"L"},relativeTime:{future:"um %s",past:"%s s\xed\xf0ani",s:"f\xe1 sekund",ss:"%d sekundir",m:"ein minuttur",mm:"%d minuttir",h:"ein t\xedmi",hh:"%d t\xedmar",d:"ein dagur",dd:"%d dagar",M:"ein m\xe1na\xf0ur",MM:"%d m\xe1na\xf0ir",y:"eitt \xe1r",yy:"%d \xe1r"},dayOfMonthOrdinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:4}})}(i(16738))},3287:function(v,S,i){!function(r){"use strict";r.defineLocale("fr-ca",{months:"janvier_f\xe9vrier_mars_avril_mai_juin_juillet_ao\xfbt_septembre_octobre_novembre_d\xe9cembre".split("_"),monthsShort:"janv._f\xe9vr._mars_avr._mai_juin_juil._ao\xfbt_sept._oct._nov._d\xe9c.".split("_"),monthsParseExact:!0,weekdays:"dimanche_lundi_mardi_mercredi_jeudi_vendredi_samedi".split("_"),weekdaysShort:"dim._lun._mar._mer._jeu._ven._sam.".split("_"),weekdaysMin:"di_lu_ma_me_je_ve_sa".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"YYYY-MM-DD",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd D MMMM YYYY HH:mm"},calendar:{sameDay:"[Aujourd\u2019hui \xe0] LT",nextDay:"[Demain \xe0] LT",nextWeek:"dddd [\xe0] LT",lastDay:"[Hier \xe0] LT",lastWeek:"dddd [dernier \xe0] LT",sameElse:"L"},relativeTime:{future:"dans %s",past:"il y a %s",s:"quelques secondes",ss:"%d secondes",m:"une minute",mm:"%d minutes",h:"une heure",hh:"%d heures",d:"un jour",dd:"%d jours",M:"un mois",MM:"%d mois",y:"un an",yy:"%d ans"},dayOfMonthOrdinalParse:/\d{1,2}(er|e)/,ordinal:function(p,f){switch(f){default:case"M":case"Q":case"D":case"DDD":case"d":return p+(1===p?"er":"e");case"w":case"W":return p+(1===p?"re":"e")}}})}(i(16738))},38867:function(v,S,i){!function(r){"use strict";r.defineLocale("fr-ch",{months:"janvier_f\xe9vrier_mars_avril_mai_juin_juillet_ao\xfbt_septembre_octobre_novembre_d\xe9cembre".split("_"),monthsShort:"janv._f\xe9vr._mars_avr._mai_juin_juil._ao\xfbt_sept._oct._nov._d\xe9c.".split("_"),monthsParseExact:!0,weekdays:"dimanche_lundi_mardi_mercredi_jeudi_vendredi_samedi".split("_"),weekdaysShort:"dim._lun._mar._mer._jeu._ven._sam.".split("_"),weekdaysMin:"di_lu_ma_me_je_ve_sa".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD.MM.YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd D MMMM YYYY HH:mm"},calendar:{sameDay:"[Aujourd\u2019hui \xe0] LT",nextDay:"[Demain \xe0] LT",nextWeek:"dddd [\xe0] LT",lastDay:"[Hier \xe0] LT",lastWeek:"dddd [dernier \xe0] LT",sameElse:"L"},relativeTime:{future:"dans %s",past:"il y a %s",s:"quelques secondes",ss:"%d secondes",m:"une minute",mm:"%d minutes",h:"une heure",hh:"%d heures",d:"un jour",dd:"%d jours",M:"un mois",MM:"%d mois",y:"un an",yy:"%d ans"},dayOfMonthOrdinalParse:/\d{1,2}(er|e)/,ordinal:function(p,f){switch(f){default:case"M":case"Q":case"D":case"DDD":case"d":return p+(1===p?"er":"e");case"w":case"W":return p+(1===p?"re":"e")}},week:{dow:1,doy:4}})}(i(16738))},28174:function(v,S,i){!function(r){"use strict";var f=/(janv\.?|f\xe9vr\.?|mars|avr\.?|mai|juin|juil\.?|ao\xfbt|sept\.?|oct\.?|nov\.?|d\xe9c\.?|janvier|f\xe9vrier|mars|avril|mai|juin|juillet|ao\xfbt|septembre|octobre|novembre|d\xe9cembre)/i,e=[/^janv/i,/^f\xe9vr/i,/^mars/i,/^avr/i,/^mai/i,/^juin/i,/^juil/i,/^ao\xfbt/i,/^sept/i,/^oct/i,/^nov/i,/^d\xe9c/i];r.defineLocale("fr",{months:"janvier_f\xe9vrier_mars_avril_mai_juin_juillet_ao\xfbt_septembre_octobre_novembre_d\xe9cembre".split("_"),monthsShort:"janv._f\xe9vr._mars_avr._mai_juin_juil._ao\xfbt_sept._oct._nov._d\xe9c.".split("_"),monthsRegex:f,monthsShortRegex:f,monthsStrictRegex:/^(janvier|f\xe9vrier|mars|avril|mai|juin|juillet|ao\xfbt|septembre|octobre|novembre|d\xe9cembre)/i,monthsShortStrictRegex:/(janv\.?|f\xe9vr\.?|mars|avr\.?|mai|juin|juil\.?|ao\xfbt|sept\.?|oct\.?|nov\.?|d\xe9c\.?)/i,monthsParse:e,longMonthsParse:e,shortMonthsParse:e,weekdays:"dimanche_lundi_mardi_mercredi_jeudi_vendredi_samedi".split("_"),weekdaysShort:"dim._lun._mar._mer._jeu._ven._sam.".split("_"),weekdaysMin:"di_lu_ma_me_je_ve_sa".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd D MMMM YYYY HH:mm"},calendar:{sameDay:"[Aujourd\u2019hui \xe0] LT",nextDay:"[Demain \xe0] LT",nextWeek:"dddd [\xe0] LT",lastDay:"[Hier \xe0] LT",lastWeek:"dddd [dernier \xe0] LT",sameElse:"L"},relativeTime:{future:"dans %s",past:"il y a %s",s:"quelques secondes",ss:"%d secondes",m:"une minute",mm:"%d minutes",h:"une heure",hh:"%d heures",d:"un jour",dd:"%d jours",w:"une semaine",ww:"%d semaines",M:"un mois",MM:"%d mois",y:"un an",yy:"%d ans"},dayOfMonthOrdinalParse:/\d{1,2}(er|)/,ordinal:function(y,T){switch(T){case"D":return y+(1===y?"er":"");default:case"M":case"Q":case"DDD":case"d":return y+(1===y?"er":"e");case"w":case"W":return y+(1===y?"re":"e")}},week:{dow:1,doy:4}})}(i(16738))},50452:function(v,S,i){!function(r){"use strict";var u="jan._feb._mrt._apr._mai_jun._jul._aug._sep._okt._nov._des.".split("_"),p="jan_feb_mrt_apr_mai_jun_jul_aug_sep_okt_nov_des".split("_");r.defineLocale("fy",{months:"jannewaris_febrewaris_maart_april_maaie_juny_july_augustus_septimber_oktober_novimber_desimber".split("_"),monthsShort:function(e,_){return e?/-MMM-/.test(_)?p[e.month()]:u[e.month()]:u},monthsParseExact:!0,weekdays:"snein_moandei_tiisdei_woansdei_tongersdei_freed_sneon".split("_"),weekdaysShort:"si._mo._ti._wo._to._fr._so.".split("_"),weekdaysMin:"Si_Mo_Ti_Wo_To_Fr_So".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD-MM-YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd D MMMM YYYY HH:mm"},calendar:{sameDay:"[hjoed om] LT",nextDay:"[moarn om] LT",nextWeek:"dddd [om] LT",lastDay:"[juster om] LT",lastWeek:"[\xf4fr\xfbne] dddd [om] LT",sameElse:"L"},relativeTime:{future:"oer %s",past:"%s lyn",s:"in pear sekonden",ss:"%d sekonden",m:"ien min\xfat",mm:"%d minuten",h:"ien oere",hh:"%d oeren",d:"ien dei",dd:"%d dagen",M:"ien moanne",MM:"%d moannen",y:"ien jier",yy:"%d jierren"},dayOfMonthOrdinalParse:/\d{1,2}(ste|de)/,ordinal:function(e){return e+(1===e||8===e||e>=20?"ste":"de")},week:{dow:1,doy:4}})}(i(16738))},45014:function(v,S,i){!function(r){"use strict";r.defineLocale("ga",{months:["Ean\xe1ir","Feabhra","M\xe1rta","Aibre\xe1n","Bealtaine","Meitheamh","I\xfail","L\xfanasa","Me\xe1n F\xf3mhair","Deireadh F\xf3mhair","Samhain","Nollaig"],monthsShort:["Ean","Feabh","M\xe1rt","Aib","Beal","Meith","I\xfail","L\xfan","M.F.","D.F.","Samh","Noll"],monthsParseExact:!0,weekdays:["D\xe9 Domhnaigh","D\xe9 Luain","D\xe9 M\xe1irt","D\xe9 C\xe9adaoin","D\xe9ardaoin","D\xe9 hAoine","D\xe9 Sathairn"],weekdaysShort:["Domh","Luan","M\xe1irt","C\xe9ad","D\xe9ar","Aoine","Sath"],weekdaysMin:["Do","Lu","M\xe1","C\xe9","D\xe9","A","Sa"],longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd, D MMMM YYYY HH:mm"},calendar:{sameDay:"[Inniu ag] LT",nextDay:"[Am\xe1rach ag] LT",nextWeek:"dddd [ag] LT",lastDay:"[Inn\xe9 ag] LT",lastWeek:"dddd [seo caite] [ag] LT",sameElse:"L"},relativeTime:{future:"i %s",past:"%s \xf3 shin",s:"c\xfapla soicind",ss:"%d soicind",m:"n\xf3im\xe9ad",mm:"%d n\xf3im\xe9ad",h:"uair an chloig",hh:"%d uair an chloig",d:"l\xe1",dd:"%d l\xe1",M:"m\xed",MM:"%d m\xedonna",y:"bliain",yy:"%d bliain"},dayOfMonthOrdinalParse:/\d{1,2}(d|na|mh)/,ordinal:function(T){return T+(1===T?"d":T%10==2?"na":"mh")},week:{dow:1,doy:4}})}(i(16738))},74127:function(v,S,i){!function(r){"use strict";r.defineLocale("gd",{months:["Am Faoilleach","An Gearran","Am M\xe0rt","An Giblean","An C\xe8itean","An t-\xd2gmhios","An t-Iuchar","An L\xf9nastal","An t-Sultain","An D\xe0mhair","An t-Samhain","An D\xf9bhlachd"],monthsShort:["Faoi","Gear","M\xe0rt","Gibl","C\xe8it","\xd2gmh","Iuch","L\xf9n","Sult","D\xe0mh","Samh","D\xf9bh"],monthsParseExact:!0,weekdays:["Did\xf2mhnaich","Diluain","Dim\xe0irt","Diciadain","Diardaoin","Dihaoine","Disathairne"],weekdaysShort:["Did","Dil","Dim","Dic","Dia","Dih","Dis"],weekdaysMin:["D\xf2","Lu","M\xe0","Ci","Ar","Ha","Sa"],longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd, D MMMM YYYY HH:mm"},calendar:{sameDay:"[An-diugh aig] LT",nextDay:"[A-m\xe0ireach aig] LT",nextWeek:"dddd [aig] LT",lastDay:"[An-d\xe8 aig] LT",lastWeek:"dddd [seo chaidh] [aig] LT",sameElse:"L"},relativeTime:{future:"ann an %s",past:"bho chionn %s",s:"beagan diogan",ss:"%d diogan",m:"mionaid",mm:"%d mionaidean",h:"uair",hh:"%d uairean",d:"latha",dd:"%d latha",M:"m\xecos",MM:"%d m\xecosan",y:"bliadhna",yy:"%d bliadhna"},dayOfMonthOrdinalParse:/\d{1,2}(d|na|mh)/,ordinal:function(T){return T+(1===T?"d":T%10==2?"na":"mh")},week:{dow:1,doy:4}})}(i(16738))},72124:function(v,S,i){!function(r){"use strict";r.defineLocale("gl",{months:"xaneiro_febreiro_marzo_abril_maio_xu\xf1o_xullo_agosto_setembro_outubro_novembro_decembro".split("_"),monthsShort:"xan._feb._mar._abr._mai._xu\xf1._xul._ago._set._out._nov._dec.".split("_"),monthsParseExact:!0,weekdays:"domingo_luns_martes_m\xe9rcores_xoves_venres_s\xe1bado".split("_"),weekdaysShort:"dom._lun._mar._m\xe9r._xov._ven._s\xe1b.".split("_"),weekdaysMin:"do_lu_ma_m\xe9_xo_ve_s\xe1".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"H:mm",LTS:"H:mm:ss",L:"DD/MM/YYYY",LL:"D [de] MMMM [de] YYYY",LLL:"D [de] MMMM [de] YYYY H:mm",LLLL:"dddd, D [de] MMMM [de] YYYY H:mm"},calendar:{sameDay:function(){return"[hoxe "+(1!==this.hours()?"\xe1s":"\xe1")+"] LT"},nextDay:function(){return"[ma\xf1\xe1 "+(1!==this.hours()?"\xe1s":"\xe1")+"] LT"},nextWeek:function(){return"dddd ["+(1!==this.hours()?"\xe1s":"a")+"] LT"},lastDay:function(){return"[onte "+(1!==this.hours()?"\xe1":"a")+"] LT"},lastWeek:function(){return"[o] dddd [pasado "+(1!==this.hours()?"\xe1s":"a")+"] LT"},sameElse:"L"},relativeTime:{future:function(p){return 0===p.indexOf("un")?"n"+p:"en "+p},past:"hai %s",s:"uns segundos",ss:"%d segundos",m:"un minuto",mm:"%d minutos",h:"unha hora",hh:"%d horas",d:"un d\xeda",dd:"%d d\xedas",M:"un mes",MM:"%d meses",y:"un ano",yy:"%d anos"},dayOfMonthOrdinalParse:/\d{1,2}\xba/,ordinal:"%d\xba",week:{dow:1,doy:4}})}(i(16738))},6444:function(v,S,i){!function(r){"use strict";function u(f,e,_,y){var T={s:["\u0925\u094b\u0921\u092f\u093e \u0938\u0945\u0915\u0902\u0921\u093e\u0902\u0928\u0940","\u0925\u094b\u0921\u0947 \u0938\u0945\u0915\u0902\u0921"],ss:[f+" \u0938\u0945\u0915\u0902\u0921\u093e\u0902\u0928\u0940",f+" \u0938\u0945\u0915\u0902\u0921"],m:["\u090f\u0915\u093e \u092e\u093f\u0923\u091f\u093e\u0928","\u090f\u0915 \u092e\u093f\u0928\u0942\u091f"],mm:[f+" \u092e\u093f\u0923\u091f\u093e\u0902\u0928\u0940",f+" \u092e\u093f\u0923\u091f\u093e\u0902"],h:["\u090f\u0915\u093e \u0935\u0930\u093e\u0928","\u090f\u0915 \u0935\u0930"],hh:[f+" \u0935\u0930\u093e\u0902\u0928\u0940",f+" \u0935\u0930\u093e\u0902"],d:["\u090f\u0915\u093e \u0926\u093f\u0938\u093e\u0928","\u090f\u0915 \u0926\u0940\u0938"],dd:[f+" \u0926\u093f\u0938\u093e\u0902\u0928\u0940",f+" \u0926\u0940\u0938"],M:["\u090f\u0915\u093e \u092e\u094d\u0939\u092f\u0928\u094d\u092f\u093e\u0928","\u090f\u0915 \u092e\u094d\u0939\u092f\u0928\u094b"],MM:[f+" \u092e\u094d\u0939\u092f\u0928\u094d\u092f\u093e\u0928\u0940",f+" \u092e\u094d\u0939\u092f\u0928\u0947"],y:["\u090f\u0915\u093e \u0935\u0930\u094d\u0938\u093e\u0928","\u090f\u0915 \u0935\u0930\u094d\u0938"],yy:[f+" \u0935\u0930\u094d\u0938\u093e\u0902\u0928\u0940",f+" \u0935\u0930\u094d\u0938\u093e\u0902"]};return y?T[_][0]:T[_][1]}r.defineLocale("gom-deva",{months:{standalone:"\u091c\u093e\u0928\u0947\u0935\u093e\u0930\u0940_\u092b\u0947\u092c\u094d\u0930\u0941\u0935\u093e\u0930\u0940_\u092e\u093e\u0930\u094d\u091a_\u090f\u092a\u094d\u0930\u0940\u0932_\u092e\u0947_\u091c\u0942\u0928_\u091c\u0941\u0932\u092f_\u0911\u0917\u0938\u094d\u091f_\u0938\u092a\u094d\u091f\u0947\u0902\u092c\u0930_\u0911\u0915\u094d\u091f\u094b\u092c\u0930_\u0928\u094b\u0935\u094d\u0939\u0947\u0902\u092c\u0930_\u0921\u093f\u0938\u0947\u0902\u092c\u0930".split("_"),format:"\u091c\u093e\u0928\u0947\u0935\u093e\u0930\u0940\u091a\u094d\u092f\u093e_\u092b\u0947\u092c\u094d\u0930\u0941\u0935\u093e\u0930\u0940\u091a\u094d\u092f\u093e_\u092e\u093e\u0930\u094d\u091a\u093e\u091a\u094d\u092f\u093e_\u090f\u092a\u094d\u0930\u0940\u0932\u093e\u091a\u094d\u092f\u093e_\u092e\u0947\u092f\u093e\u091a\u094d\u092f\u093e_\u091c\u0942\u0928\u093e\u091a\u094d\u092f\u093e_\u091c\u0941\u0932\u092f\u093e\u091a\u094d\u092f\u093e_\u0911\u0917\u0938\u094d\u091f\u093e\u091a\u094d\u092f\u093e_\u0938\u092a\u094d\u091f\u0947\u0902\u092c\u0930\u093e\u091a\u094d\u092f\u093e_\u0911\u0915\u094d\u091f\u094b\u092c\u0930\u093e\u091a\u094d\u092f\u093e_\u0928\u094b\u0935\u094d\u0939\u0947\u0902\u092c\u0930\u093e\u091a\u094d\u092f\u093e_\u0921\u093f\u0938\u0947\u0902\u092c\u0930\u093e\u091a\u094d\u092f\u093e".split("_"),isFormat:/MMMM(\s)+D[oD]?/},monthsShort:"\u091c\u093e\u0928\u0947._\u092b\u0947\u092c\u094d\u0930\u0941._\u092e\u093e\u0930\u094d\u091a_\u090f\u092a\u094d\u0930\u0940._\u092e\u0947_\u091c\u0942\u0928_\u091c\u0941\u0932._\u0911\u0917._\u0938\u092a\u094d\u091f\u0947\u0902._\u0911\u0915\u094d\u091f\u094b._\u0928\u094b\u0935\u094d\u0939\u0947\u0902._\u0921\u093f\u0938\u0947\u0902.".split("_"),monthsParseExact:!0,weekdays:"\u0906\u092f\u0924\u093e\u0930_\u0938\u094b\u092e\u093e\u0930_\u092e\u0902\u0917\u0933\u093e\u0930_\u092c\u0941\u0927\u0935\u093e\u0930_\u092c\u093f\u0930\u0947\u0938\u094d\u0924\u093e\u0930_\u0938\u0941\u0915\u094d\u0930\u093e\u0930_\u0936\u0947\u0928\u0935\u093e\u0930".split("_"),weekdaysShort:"\u0906\u092f\u0924._\u0938\u094b\u092e._\u092e\u0902\u0917\u0933._\u092c\u0941\u0927._\u092c\u094d\u0930\u0947\u0938\u094d\u0924._\u0938\u0941\u0915\u094d\u0930._\u0936\u0947\u0928.".split("_"),weekdaysMin:"\u0906_\u0938\u094b_\u092e\u0902_\u092c\u0941_\u092c\u094d\u0930\u0947_\u0938\u0941_\u0936\u0947".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"A h:mm [\u0935\u093e\u091c\u0924\u093e\u0902]",LTS:"A h:mm:ss [\u0935\u093e\u091c\u0924\u093e\u0902]",L:"DD-MM-YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY A h:mm [\u0935\u093e\u091c\u0924\u093e\u0902]",LLLL:"dddd, MMMM Do, YYYY, A h:mm [\u0935\u093e\u091c\u0924\u093e\u0902]",llll:"ddd, D MMM YYYY, A h:mm [\u0935\u093e\u091c\u0924\u093e\u0902]"},calendar:{sameDay:"[\u0906\u092f\u091c] LT",nextDay:"[\u092b\u093e\u0932\u094d\u092f\u093e\u0902] LT",nextWeek:"[\u092b\u0941\u0921\u0932\u094b] dddd[,] LT",lastDay:"[\u0915\u093e\u0932] LT",lastWeek:"[\u092b\u093e\u091f\u0932\u094b] dddd[,] LT",sameElse:"L"},relativeTime:{future:"%s",past:"%s \u0906\u0926\u0940\u0902",s:u,ss:u,m:u,mm:u,h:u,hh:u,d:u,dd:u,M:u,MM:u,y:u,yy:u},dayOfMonthOrdinalParse:/\d{1,2}(\u0935\u0947\u0930)/,ordinal:function(f,e){switch(e){case"D":return f+"\u0935\u0947\u0930";default:case"M":case"Q":case"DDD":case"d":case"w":case"W":return f}},week:{dow:0,doy:3},meridiemParse:/\u0930\u093e\u0924\u0940|\u0938\u0915\u093e\u0933\u0940\u0902|\u0926\u0928\u092a\u093e\u0930\u093e\u0902|\u0938\u093e\u0902\u091c\u0947/,meridiemHour:function(f,e){return 12===f&&(f=0),"\u0930\u093e\u0924\u0940"===e?f<4?f:f+12:"\u0938\u0915\u093e\u0933\u0940\u0902"===e?f:"\u0926\u0928\u092a\u093e\u0930\u093e\u0902"===e?f>12?f:f+12:"\u0938\u093e\u0902\u091c\u0947"===e?f+12:void 0},meridiem:function(f,e,_){return f<4?"\u0930\u093e\u0924\u0940":f<12?"\u0938\u0915\u093e\u0933\u0940\u0902":f<16?"\u0926\u0928\u092a\u093e\u0930\u093e\u0902":f<20?"\u0938\u093e\u0902\u091c\u0947":"\u0930\u093e\u0924\u0940"}})}(i(16738))},37953:function(v,S,i){!function(r){"use strict";function u(f,e,_,y){var T={s:["thoddea sekondamni","thodde sekond"],ss:[f+" sekondamni",f+" sekond"],m:["eka mintan","ek minut"],mm:[f+" mintamni",f+" mintam"],h:["eka voran","ek vor"],hh:[f+" voramni",f+" voram"],d:["eka disan","ek dis"],dd:[f+" disamni",f+" dis"],M:["eka mhoinean","ek mhoino"],MM:[f+" mhoineamni",f+" mhoine"],y:["eka vorsan","ek voros"],yy:[f+" vorsamni",f+" vorsam"]};return y?T[_][0]:T[_][1]}r.defineLocale("gom-latn",{months:{standalone:"Janer_Febrer_Mars_Abril_Mai_Jun_Julai_Agost_Setembr_Otubr_Novembr_Dezembr".split("_"),format:"Janerachea_Febrerachea_Marsachea_Abrilachea_Maiachea_Junachea_Julaiachea_Agostachea_Setembrachea_Otubrachea_Novembrachea_Dezembrachea".split("_"),isFormat:/MMMM(\s)+D[oD]?/},monthsShort:"Jan._Feb._Mars_Abr._Mai_Jun_Jul._Ago._Set._Otu._Nov._Dez.".split("_"),monthsParseExact:!0,weekdays:"Aitar_Somar_Mongllar_Budhvar_Birestar_Sukrar_Son'var".split("_"),weekdaysShort:"Ait._Som._Mon._Bud._Bre._Suk._Son.".split("_"),weekdaysMin:"Ai_Sm_Mo_Bu_Br_Su_Sn".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"A h:mm [vazta]",LTS:"A h:mm:ss [vazta]",L:"DD-MM-YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY A h:mm [vazta]",LLLL:"dddd, MMMM Do, YYYY, A h:mm [vazta]",llll:"ddd, D MMM YYYY, A h:mm [vazta]"},calendar:{sameDay:"[Aiz] LT",nextDay:"[Faleam] LT",nextWeek:"[Fuddlo] dddd[,] LT",lastDay:"[Kal] LT",lastWeek:"[Fattlo] dddd[,] LT",sameElse:"L"},relativeTime:{future:"%s",past:"%s adim",s:u,ss:u,m:u,mm:u,h:u,hh:u,d:u,dd:u,M:u,MM:u,y:u,yy:u},dayOfMonthOrdinalParse:/\d{1,2}(er)/,ordinal:function(f,e){switch(e){case"D":return f+"er";default:case"M":case"Q":case"DDD":case"d":case"w":case"W":return f}},week:{dow:0,doy:3},meridiemParse:/rati|sokallim|donparam|sanje/,meridiemHour:function(f,e){return 12===f&&(f=0),"rati"===e?f<4?f:f+12:"sokallim"===e?f:"donparam"===e?f>12?f:f+12:"sanje"===e?f+12:void 0},meridiem:function(f,e,_){return f<4?"rati":f<12?"sokallim":f<16?"donparam":f<20?"sanje":"rati"}})}(i(16738))},76604:function(v,S,i){!function(r){"use strict";var u={1:"\u0ae7",2:"\u0ae8",3:"\u0ae9",4:"\u0aea",5:"\u0aeb",6:"\u0aec",7:"\u0aed",8:"\u0aee",9:"\u0aef",0:"\u0ae6"},p={"\u0ae7":"1","\u0ae8":"2","\u0ae9":"3","\u0aea":"4","\u0aeb":"5","\u0aec":"6","\u0aed":"7","\u0aee":"8","\u0aef":"9","\u0ae6":"0"};r.defineLocale("gu",{months:"\u0a9c\u0abe\u0aa8\u0acd\u0aaf\u0ac1\u0a86\u0ab0\u0ac0_\u0aab\u0ac7\u0aac\u0acd\u0ab0\u0ac1\u0a86\u0ab0\u0ac0_\u0aae\u0abe\u0ab0\u0acd\u0a9a_\u0a8f\u0aaa\u0acd\u0ab0\u0abf\u0ab2_\u0aae\u0ac7_\u0a9c\u0ac2\u0aa8_\u0a9c\u0ac1\u0ab2\u0abe\u0a88_\u0a91\u0a97\u0ab8\u0acd\u0a9f_\u0ab8\u0aaa\u0acd\u0a9f\u0ac7\u0aae\u0acd\u0aac\u0ab0_\u0a91\u0a95\u0acd\u0a9f\u0acd\u0aac\u0ab0_\u0aa8\u0ab5\u0ac7\u0aae\u0acd\u0aac\u0ab0_\u0aa1\u0abf\u0ab8\u0ac7\u0aae\u0acd\u0aac\u0ab0".split("_"),monthsShort:"\u0a9c\u0abe\u0aa8\u0acd\u0aaf\u0ac1._\u0aab\u0ac7\u0aac\u0acd\u0ab0\u0ac1._\u0aae\u0abe\u0ab0\u0acd\u0a9a_\u0a8f\u0aaa\u0acd\u0ab0\u0abf._\u0aae\u0ac7_\u0a9c\u0ac2\u0aa8_\u0a9c\u0ac1\u0ab2\u0abe._\u0a91\u0a97._\u0ab8\u0aaa\u0acd\u0a9f\u0ac7._\u0a91\u0a95\u0acd\u0a9f\u0acd._\u0aa8\u0ab5\u0ac7._\u0aa1\u0abf\u0ab8\u0ac7.".split("_"),monthsParseExact:!0,weekdays:"\u0ab0\u0ab5\u0abf\u0ab5\u0abe\u0ab0_\u0ab8\u0acb\u0aae\u0ab5\u0abe\u0ab0_\u0aae\u0a82\u0a97\u0ab3\u0ab5\u0abe\u0ab0_\u0aac\u0ac1\u0aa7\u0acd\u0ab5\u0abe\u0ab0_\u0a97\u0ac1\u0ab0\u0ac1\u0ab5\u0abe\u0ab0_\u0ab6\u0ac1\u0a95\u0acd\u0ab0\u0ab5\u0abe\u0ab0_\u0ab6\u0aa8\u0abf\u0ab5\u0abe\u0ab0".split("_"),weekdaysShort:"\u0ab0\u0ab5\u0abf_\u0ab8\u0acb\u0aae_\u0aae\u0a82\u0a97\u0ab3_\u0aac\u0ac1\u0aa7\u0acd_\u0a97\u0ac1\u0ab0\u0ac1_\u0ab6\u0ac1\u0a95\u0acd\u0ab0_\u0ab6\u0aa8\u0abf".split("_"),weekdaysMin:"\u0ab0_\u0ab8\u0acb_\u0aae\u0a82_\u0aac\u0ac1_\u0a97\u0ac1_\u0ab6\u0ac1_\u0ab6".split("_"),longDateFormat:{LT:"A h:mm \u0ab5\u0abe\u0a97\u0acd\u0aaf\u0ac7",LTS:"A h:mm:ss \u0ab5\u0abe\u0a97\u0acd\u0aaf\u0ac7",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY, A h:mm \u0ab5\u0abe\u0a97\u0acd\u0aaf\u0ac7",LLLL:"dddd, D MMMM YYYY, A h:mm \u0ab5\u0abe\u0a97\u0acd\u0aaf\u0ac7"},calendar:{sameDay:"[\u0a86\u0a9c] LT",nextDay:"[\u0a95\u0abe\u0ab2\u0ac7] LT",nextWeek:"dddd, LT",lastDay:"[\u0a97\u0a87\u0a95\u0abe\u0ab2\u0ac7] LT",lastWeek:"[\u0aaa\u0abe\u0a9b\u0ab2\u0abe] dddd, LT",sameElse:"L"},relativeTime:{future:"%s \u0aae\u0abe",past:"%s \u0aaa\u0ab9\u0ac7\u0ab2\u0abe",s:"\u0a85\u0aae\u0ac1\u0a95 \u0aaa\u0ab3\u0acb",ss:"%d \u0ab8\u0ac7\u0a95\u0a82\u0aa1",m:"\u0a8f\u0a95 \u0aae\u0abf\u0aa8\u0abf\u0a9f",mm:"%d \u0aae\u0abf\u0aa8\u0abf\u0a9f",h:"\u0a8f\u0a95 \u0a95\u0ab2\u0abe\u0a95",hh:"%d \u0a95\u0ab2\u0abe\u0a95",d:"\u0a8f\u0a95 \u0aa6\u0abf\u0ab5\u0ab8",dd:"%d \u0aa6\u0abf\u0ab5\u0ab8",M:"\u0a8f\u0a95 \u0aae\u0ab9\u0abf\u0aa8\u0acb",MM:"%d \u0aae\u0ab9\u0abf\u0aa8\u0acb",y:"\u0a8f\u0a95 \u0ab5\u0ab0\u0acd\u0ab7",yy:"%d \u0ab5\u0ab0\u0acd\u0ab7"},preparse:function(e){return e.replace(/[\u0ae7\u0ae8\u0ae9\u0aea\u0aeb\u0aec\u0aed\u0aee\u0aef\u0ae6]/g,function(_){return p[_]})},postformat:function(e){return e.replace(/\d/g,function(_){return u[_]})},meridiemParse:/\u0ab0\u0abe\u0aa4|\u0aac\u0aaa\u0acb\u0ab0|\u0ab8\u0ab5\u0abe\u0ab0|\u0ab8\u0abe\u0a82\u0a9c/,meridiemHour:function(e,_){return 12===e&&(e=0),"\u0ab0\u0abe\u0aa4"===_?e<4?e:e+12:"\u0ab8\u0ab5\u0abe\u0ab0"===_?e:"\u0aac\u0aaa\u0acb\u0ab0"===_?e>=10?e:e+12:"\u0ab8\u0abe\u0a82\u0a9c"===_?e+12:void 0},meridiem:function(e,_,y){return e<4?"\u0ab0\u0abe\u0aa4":e<10?"\u0ab8\u0ab5\u0abe\u0ab0":e<17?"\u0aac\u0aaa\u0acb\u0ab0":e<20?"\u0ab8\u0abe\u0a82\u0a9c":"\u0ab0\u0abe\u0aa4"},week:{dow:0,doy:6}})}(i(16738))},1222:function(v,S,i){!function(r){"use strict";r.defineLocale("he",{months:"\u05d9\u05e0\u05d5\u05d0\u05e8_\u05e4\u05d1\u05e8\u05d5\u05d0\u05e8_\u05de\u05e8\u05e5_\u05d0\u05e4\u05e8\u05d9\u05dc_\u05de\u05d0\u05d9_\u05d9\u05d5\u05e0\u05d9_\u05d9\u05d5\u05dc\u05d9_\u05d0\u05d5\u05d2\u05d5\u05e1\u05d8_\u05e1\u05e4\u05d8\u05de\u05d1\u05e8_\u05d0\u05d5\u05e7\u05d8\u05d5\u05d1\u05e8_\u05e0\u05d5\u05d1\u05de\u05d1\u05e8_\u05d3\u05e6\u05de\u05d1\u05e8".split("_"),monthsShort:"\u05d9\u05e0\u05d5\u05f3_\u05e4\u05d1\u05e8\u05f3_\u05de\u05e8\u05e5_\u05d0\u05e4\u05e8\u05f3_\u05de\u05d0\u05d9_\u05d9\u05d5\u05e0\u05d9_\u05d9\u05d5\u05dc\u05d9_\u05d0\u05d5\u05d2\u05f3_\u05e1\u05e4\u05d8\u05f3_\u05d0\u05d5\u05e7\u05f3_\u05e0\u05d5\u05d1\u05f3_\u05d3\u05e6\u05de\u05f3".split("_"),weekdays:"\u05e8\u05d0\u05e9\u05d5\u05df_\u05e9\u05e0\u05d9_\u05e9\u05dc\u05d9\u05e9\u05d9_\u05e8\u05d1\u05d9\u05e2\u05d9_\u05d7\u05de\u05d9\u05e9\u05d9_\u05e9\u05d9\u05e9\u05d9_\u05e9\u05d1\u05ea".split("_"),weekdaysShort:"\u05d0\u05f3_\u05d1\u05f3_\u05d2\u05f3_\u05d3\u05f3_\u05d4\u05f3_\u05d5\u05f3_\u05e9\u05f3".split("_"),weekdaysMin:"\u05d0_\u05d1_\u05d2_\u05d3_\u05d4_\u05d5_\u05e9".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D [\u05d1]MMMM YYYY",LLL:"D [\u05d1]MMMM YYYY HH:mm",LLLL:"dddd, D [\u05d1]MMMM YYYY HH:mm",l:"D/M/YYYY",ll:"D MMM YYYY",lll:"D MMM YYYY HH:mm",llll:"ddd, D MMM YYYY HH:mm"},calendar:{sameDay:"[\u05d4\u05d9\u05d5\u05dd \u05d1\u05be]LT",nextDay:"[\u05de\u05d7\u05e8 \u05d1\u05be]LT",nextWeek:"dddd [\u05d1\u05e9\u05e2\u05d4] LT",lastDay:"[\u05d0\u05ea\u05de\u05d5\u05dc \u05d1\u05be]LT",lastWeek:"[\u05d1\u05d9\u05d5\u05dd] dddd [\u05d4\u05d0\u05d7\u05e8\u05d5\u05df \u05d1\u05e9\u05e2\u05d4] LT",sameElse:"L"},relativeTime:{future:"\u05d1\u05e2\u05d5\u05d3 %s",past:"\u05dc\u05e4\u05e0\u05d9 %s",s:"\u05de\u05e1\u05e4\u05e8 \u05e9\u05e0\u05d9\u05d5\u05ea",ss:"%d \u05e9\u05e0\u05d9\u05d5\u05ea",m:"\u05d3\u05e7\u05d4",mm:"%d \u05d3\u05e7\u05d5\u05ea",h:"\u05e9\u05e2\u05d4",hh:function(p){return 2===p?"\u05e9\u05e2\u05ea\u05d9\u05d9\u05dd":p+" \u05e9\u05e2\u05d5\u05ea"},d:"\u05d9\u05d5\u05dd",dd:function(p){return 2===p?"\u05d9\u05d5\u05de\u05d9\u05d9\u05dd":p+" \u05d9\u05de\u05d9\u05dd"},M:"\u05d7\u05d5\u05d3\u05e9",MM:function(p){return 2===p?"\u05d7\u05d5\u05d3\u05e9\u05d9\u05d9\u05dd":p+" \u05d7\u05d5\u05d3\u05e9\u05d9\u05dd"},y:"\u05e9\u05e0\u05d4",yy:function(p){return 2===p?"\u05e9\u05e0\u05ea\u05d9\u05d9\u05dd":p%10==0&&10!==p?p+" \u05e9\u05e0\u05d4":p+" \u05e9\u05e0\u05d9\u05dd"}},meridiemParse:/\u05d0\u05d7\u05d4"\u05e6|\u05dc\u05e4\u05e0\u05d4"\u05e6|\u05d0\u05d7\u05e8\u05d9 \u05d4\u05e6\u05d4\u05e8\u05d9\u05d9\u05dd|\u05dc\u05e4\u05e0\u05d9 \u05d4\u05e6\u05d4\u05e8\u05d9\u05d9\u05dd|\u05dc\u05e4\u05e0\u05d5\u05ea \u05d1\u05d5\u05e7\u05e8|\u05d1\u05d1\u05d5\u05e7\u05e8|\u05d1\u05e2\u05e8\u05d1/i,isPM:function(p){return/^(\u05d0\u05d7\u05d4"\u05e6|\u05d0\u05d7\u05e8\u05d9 \u05d4\u05e6\u05d4\u05e8\u05d9\u05d9\u05dd|\u05d1\u05e2\u05e8\u05d1)$/.test(p)},meridiem:function(p,f,e){return p<5?"\u05dc\u05e4\u05e0\u05d5\u05ea \u05d1\u05d5\u05e7\u05e8":p<10?"\u05d1\u05d1\u05d5\u05e7\u05e8":p<12?e?'\u05dc\u05e4\u05e0\u05d4"\u05e6':"\u05dc\u05e4\u05e0\u05d9 \u05d4\u05e6\u05d4\u05e8\u05d9\u05d9\u05dd":p<18?e?'\u05d0\u05d7\u05d4"\u05e6':"\u05d0\u05d7\u05e8\u05d9 \u05d4\u05e6\u05d4\u05e8\u05d9\u05d9\u05dd":"\u05d1\u05e2\u05e8\u05d1"}})}(i(16738))},74235:function(v,S,i){!function(r){"use strict";var u={1:"\u0967",2:"\u0968",3:"\u0969",4:"\u096a",5:"\u096b",6:"\u096c",7:"\u096d",8:"\u096e",9:"\u096f",0:"\u0966"},p={"\u0967":"1","\u0968":"2","\u0969":"3","\u096a":"4","\u096b":"5","\u096c":"6","\u096d":"7","\u096e":"8","\u096f":"9","\u0966":"0"},f=[/^\u091c\u0928/i,/^\u092b\u093c\u0930|\u092b\u0930/i,/^\u092e\u093e\u0930\u094d\u091a/i,/^\u0905\u092a\u094d\u0930\u0948/i,/^\u092e\u0908/i,/^\u091c\u0942\u0928/i,/^\u091c\u0941\u0932/i,/^\u0905\u0917/i,/^\u0938\u093f\u0924\u0902|\u0938\u093f\u0924/i,/^\u0905\u0915\u094d\u091f\u0942/i,/^\u0928\u0935|\u0928\u0935\u0902/i,/^\u0926\u093f\u0938\u0902|\u0926\u093f\u0938/i];r.defineLocale("hi",{months:{format:"\u091c\u0928\u0935\u0930\u0940_\u092b\u093c\u0930\u0935\u0930\u0940_\u092e\u093e\u0930\u094d\u091a_\u0905\u092a\u094d\u0930\u0948\u0932_\u092e\u0908_\u091c\u0942\u0928_\u091c\u0941\u0932\u093e\u0908_\u0905\u0917\u0938\u094d\u0924_\u0938\u093f\u0924\u092e\u094d\u092c\u0930_\u0905\u0915\u094d\u091f\u0942\u092c\u0930_\u0928\u0935\u092e\u094d\u092c\u0930_\u0926\u093f\u0938\u092e\u094d\u092c\u0930".split("_"),standalone:"\u091c\u0928\u0935\u0930\u0940_\u092b\u0930\u0935\u0930\u0940_\u092e\u093e\u0930\u094d\u091a_\u0905\u092a\u094d\u0930\u0948\u0932_\u092e\u0908_\u091c\u0942\u0928_\u091c\u0941\u0932\u093e\u0908_\u0905\u0917\u0938\u094d\u0924_\u0938\u093f\u0924\u0902\u092c\u0930_\u0905\u0915\u094d\u091f\u0942\u092c\u0930_\u0928\u0935\u0902\u092c\u0930_\u0926\u093f\u0938\u0902\u092c\u0930".split("_")},monthsShort:"\u091c\u0928._\u092b\u093c\u0930._\u092e\u093e\u0930\u094d\u091a_\u0905\u092a\u094d\u0930\u0948._\u092e\u0908_\u091c\u0942\u0928_\u091c\u0941\u0932._\u0905\u0917._\u0938\u093f\u0924._\u0905\u0915\u094d\u091f\u0942._\u0928\u0935._\u0926\u093f\u0938.".split("_"),weekdays:"\u0930\u0935\u093f\u0935\u093e\u0930_\u0938\u094b\u092e\u0935\u093e\u0930_\u092e\u0902\u0917\u0932\u0935\u093e\u0930_\u092c\u0941\u0927\u0935\u093e\u0930_\u0917\u0941\u0930\u0942\u0935\u093e\u0930_\u0936\u0941\u0915\u094d\u0930\u0935\u093e\u0930_\u0936\u0928\u093f\u0935\u093e\u0930".split("_"),weekdaysShort:"\u0930\u0935\u093f_\u0938\u094b\u092e_\u092e\u0902\u0917\u0932_\u092c\u0941\u0927_\u0917\u0941\u0930\u0942_\u0936\u0941\u0915\u094d\u0930_\u0936\u0928\u093f".split("_"),weekdaysMin:"\u0930_\u0938\u094b_\u092e\u0902_\u092c\u0941_\u0917\u0941_\u0936\u0941_\u0936".split("_"),longDateFormat:{LT:"A h:mm \u092c\u091c\u0947",LTS:"A h:mm:ss \u092c\u091c\u0947",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY, A h:mm \u092c\u091c\u0947",LLLL:"dddd, D MMMM YYYY, A h:mm \u092c\u091c\u0947"},monthsParse:f,longMonthsParse:f,shortMonthsParse:[/^\u091c\u0928/i,/^\u092b\u093c\u0930/i,/^\u092e\u093e\u0930\u094d\u091a/i,/^\u0905\u092a\u094d\u0930\u0948/i,/^\u092e\u0908/i,/^\u091c\u0942\u0928/i,/^\u091c\u0941\u0932/i,/^\u0905\u0917/i,/^\u0938\u093f\u0924/i,/^\u0905\u0915\u094d\u091f\u0942/i,/^\u0928\u0935/i,/^\u0926\u093f\u0938/i],monthsRegex:/^(\u091c\u0928\u0935\u0930\u0940|\u091c\u0928\.?|\u092b\u093c\u0930\u0935\u0930\u0940|\u092b\u0930\u0935\u0930\u0940|\u092b\u093c\u0930\.?|\u092e\u093e\u0930\u094d\u091a?|\u0905\u092a\u094d\u0930\u0948\u0932|\u0905\u092a\u094d\u0930\u0948\.?|\u092e\u0908?|\u091c\u0942\u0928?|\u091c\u0941\u0932\u093e\u0908|\u091c\u0941\u0932\.?|\u0905\u0917\u0938\u094d\u0924|\u0905\u0917\.?|\u0938\u093f\u0924\u092e\u094d\u092c\u0930|\u0938\u093f\u0924\u0902\u092c\u0930|\u0938\u093f\u0924\.?|\u0905\u0915\u094d\u091f\u0942\u092c\u0930|\u0905\u0915\u094d\u091f\u0942\.?|\u0928\u0935\u092e\u094d\u092c\u0930|\u0928\u0935\u0902\u092c\u0930|\u0928\u0935\.?|\u0926\u093f\u0938\u092e\u094d\u092c\u0930|\u0926\u093f\u0938\u0902\u092c\u0930|\u0926\u093f\u0938\.?)/i,monthsShortRegex:/^(\u091c\u0928\u0935\u0930\u0940|\u091c\u0928\.?|\u092b\u093c\u0930\u0935\u0930\u0940|\u092b\u0930\u0935\u0930\u0940|\u092b\u093c\u0930\.?|\u092e\u093e\u0930\u094d\u091a?|\u0905\u092a\u094d\u0930\u0948\u0932|\u0905\u092a\u094d\u0930\u0948\.?|\u092e\u0908?|\u091c\u0942\u0928?|\u091c\u0941\u0932\u093e\u0908|\u091c\u0941\u0932\.?|\u0905\u0917\u0938\u094d\u0924|\u0905\u0917\.?|\u0938\u093f\u0924\u092e\u094d\u092c\u0930|\u0938\u093f\u0924\u0902\u092c\u0930|\u0938\u093f\u0924\.?|\u0905\u0915\u094d\u091f\u0942\u092c\u0930|\u0905\u0915\u094d\u091f\u0942\.?|\u0928\u0935\u092e\u094d\u092c\u0930|\u0928\u0935\u0902\u092c\u0930|\u0928\u0935\.?|\u0926\u093f\u0938\u092e\u094d\u092c\u0930|\u0926\u093f\u0938\u0902\u092c\u0930|\u0926\u093f\u0938\.?)/i,monthsStrictRegex:/^(\u091c\u0928\u0935\u0930\u0940?|\u092b\u093c\u0930\u0935\u0930\u0940|\u092b\u0930\u0935\u0930\u0940?|\u092e\u093e\u0930\u094d\u091a?|\u0905\u092a\u094d\u0930\u0948\u0932?|\u092e\u0908?|\u091c\u0942\u0928?|\u091c\u0941\u0932\u093e\u0908?|\u0905\u0917\u0938\u094d\u0924?|\u0938\u093f\u0924\u092e\u094d\u092c\u0930|\u0938\u093f\u0924\u0902\u092c\u0930|\u0938\u093f\u0924?\.?|\u0905\u0915\u094d\u091f\u0942\u092c\u0930|\u0905\u0915\u094d\u091f\u0942\.?|\u0928\u0935\u092e\u094d\u092c\u0930|\u0928\u0935\u0902\u092c\u0930?|\u0926\u093f\u0938\u092e\u094d\u092c\u0930|\u0926\u093f\u0938\u0902\u092c\u0930?)/i,monthsShortStrictRegex:/^(\u091c\u0928\.?|\u092b\u093c\u0930\.?|\u092e\u093e\u0930\u094d\u091a?|\u0905\u092a\u094d\u0930\u0948\.?|\u092e\u0908?|\u091c\u0942\u0928?|\u091c\u0941\u0932\.?|\u0905\u0917\.?|\u0938\u093f\u0924\.?|\u0905\u0915\u094d\u091f\u0942\.?|\u0928\u0935\.?|\u0926\u093f\u0938\.?)/i,calendar:{sameDay:"[\u0906\u091c] LT",nextDay:"[\u0915\u0932] LT",nextWeek:"dddd, LT",lastDay:"[\u0915\u0932] LT",lastWeek:"[\u092a\u093f\u091b\u0932\u0947] dddd, LT",sameElse:"L"},relativeTime:{future:"%s \u092e\u0947\u0902",past:"%s \u092a\u0939\u0932\u0947",s:"\u0915\u0941\u091b \u0939\u0940 \u0915\u094d\u0937\u0923",ss:"%d \u0938\u0947\u0915\u0902\u0921",m:"\u090f\u0915 \u092e\u093f\u0928\u091f",mm:"%d \u092e\u093f\u0928\u091f",h:"\u090f\u0915 \u0918\u0902\u091f\u093e",hh:"%d \u0918\u0902\u091f\u0947",d:"\u090f\u0915 \u0926\u093f\u0928",dd:"%d \u0926\u093f\u0928",M:"\u090f\u0915 \u092e\u0939\u0940\u0928\u0947",MM:"%d \u092e\u0939\u0940\u0928\u0947",y:"\u090f\u0915 \u0935\u0930\u094d\u0937",yy:"%d \u0935\u0930\u094d\u0937"},preparse:function(y){return y.replace(/[\u0967\u0968\u0969\u096a\u096b\u096c\u096d\u096e\u096f\u0966]/g,function(T){return p[T]})},postformat:function(y){return y.replace(/\d/g,function(T){return u[T]})},meridiemParse:/\u0930\u093e\u0924|\u0938\u0941\u092c\u0939|\u0926\u094b\u092a\u0939\u0930|\u0936\u093e\u092e/,meridiemHour:function(y,T){return 12===y&&(y=0),"\u0930\u093e\u0924"===T?y<4?y:y+12:"\u0938\u0941\u092c\u0939"===T?y:"\u0926\u094b\u092a\u0939\u0930"===T?y>=10?y:y+12:"\u0936\u093e\u092e"===T?y+12:void 0},meridiem:function(y,T,M){return y<4?"\u0930\u093e\u0924":y<10?"\u0938\u0941\u092c\u0939":y<17?"\u0926\u094b\u092a\u0939\u0930":y<20?"\u0936\u093e\u092e":"\u0930\u093e\u0924"},week:{dow:0,doy:6}})}(i(16738))},622:function(v,S,i){!function(r){"use strict";function u(f,e,_){var y=f+" ";switch(_){case"ss":return y+(1===f?"sekunda":2===f||3===f||4===f?"sekunde":"sekundi");case"m":return e?"jedna minuta":"jedne minute";case"mm":return y+(1===f?"minuta":2===f||3===f||4===f?"minute":"minuta");case"h":return e?"jedan sat":"jednog sata";case"hh":return y+(1===f?"sat":2===f||3===f||4===f?"sata":"sati");case"dd":return y+(1===f?"dan":"dana");case"MM":return y+(1===f?"mjesec":2===f||3===f||4===f?"mjeseca":"mjeseci");case"yy":return y+(1===f?"godina":2===f||3===f||4===f?"godine":"godina")}}r.defineLocale("hr",{months:{format:"sije\u010dnja_velja\u010de_o\u017eujka_travnja_svibnja_lipnja_srpnja_kolovoza_rujna_listopada_studenoga_prosinca".split("_"),standalone:"sije\u010danj_velja\u010da_o\u017eujak_travanj_svibanj_lipanj_srpanj_kolovoz_rujan_listopad_studeni_prosinac".split("_")},monthsShort:"sij._velj._o\u017eu._tra._svi._lip._srp._kol._ruj._lis._stu._pro.".split("_"),monthsParseExact:!0,weekdays:"nedjelja_ponedjeljak_utorak_srijeda_\u010detvrtak_petak_subota".split("_"),weekdaysShort:"ned._pon._uto._sri._\u010det._pet._sub.".split("_"),weekdaysMin:"ne_po_ut_sr_\u010de_pe_su".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"H:mm",LTS:"H:mm:ss",L:"DD.MM.YYYY",LL:"Do MMMM YYYY",LLL:"Do MMMM YYYY H:mm",LLLL:"dddd, Do MMMM YYYY H:mm"},calendar:{sameDay:"[danas u] LT",nextDay:"[sutra u] LT",nextWeek:function(){switch(this.day()){case 0:return"[u] [nedjelju] [u] LT";case 3:return"[u] [srijedu] [u] LT";case 6:return"[u] [subotu] [u] LT";case 1:case 2:case 4:case 5:return"[u] dddd [u] LT"}},lastDay:"[ju\u010der u] LT",lastWeek:function(){switch(this.day()){case 0:return"[pro\u0161lu] [nedjelju] [u] LT";case 3:return"[pro\u0161lu] [srijedu] [u] LT";case 6:return"[pro\u0161le] [subote] [u] LT";case 1:case 2:case 4:case 5:return"[pro\u0161li] dddd [u] LT"}},sameElse:"L"},relativeTime:{future:"za %s",past:"prije %s",s:"par sekundi",ss:u,m:u,mm:u,h:u,hh:u,d:"dan",dd:u,M:"mjesec",MM:u,y:"godinu",yy:u},dayOfMonthOrdinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:7}})}(i(16738))},37735:function(v,S,i){!function(r){"use strict";var u="vas\xe1rnap h\xe9tf\u0151n kedden szerd\xe1n cs\xfct\xf6rt\xf6k\xf6n p\xe9nteken szombaton".split(" ");function p(_,y,T,M){var R=_;switch(T){case"s":return M||y?"n\xe9h\xe1ny m\xe1sodperc":"n\xe9h\xe1ny m\xe1sodperce";case"ss":return R+(M||y)?" m\xe1sodperc":" m\xe1sodperce";case"m":return"egy"+(M||y?" perc":" perce");case"mm":return R+(M||y?" perc":" perce");case"h":return"egy"+(M||y?" \xf3ra":" \xf3r\xe1ja");case"hh":return R+(M||y?" \xf3ra":" \xf3r\xe1ja");case"d":return"egy"+(M||y?" nap":" napja");case"dd":return R+(M||y?" nap":" napja");case"M":return"egy"+(M||y?" h\xf3nap":" h\xf3napja");case"MM":return R+(M||y?" h\xf3nap":" h\xf3napja");case"y":return"egy"+(M||y?" \xe9v":" \xe9ve");case"yy":return R+(M||y?" \xe9v":" \xe9ve")}return""}function f(_){return(_?"":"[m\xfalt] ")+"["+u[this.day()]+"] LT[-kor]"}r.defineLocale("hu",{months:"janu\xe1r_febru\xe1r_m\xe1rcius_\xe1prilis_m\xe1jus_j\xfanius_j\xfalius_augusztus_szeptember_okt\xf3ber_november_december".split("_"),monthsShort:"jan._feb._m\xe1rc._\xe1pr._m\xe1j._j\xfan._j\xfal._aug._szept._okt._nov._dec.".split("_"),monthsParseExact:!0,weekdays:"vas\xe1rnap_h\xe9tf\u0151_kedd_szerda_cs\xfct\xf6rt\xf6k_p\xe9ntek_szombat".split("_"),weekdaysShort:"vas_h\xe9t_kedd_sze_cs\xfct_p\xe9n_szo".split("_"),weekdaysMin:"v_h_k_sze_cs_p_szo".split("_"),longDateFormat:{LT:"H:mm",LTS:"H:mm:ss",L:"YYYY.MM.DD.",LL:"YYYY. MMMM D.",LLL:"YYYY. MMMM D. H:mm",LLLL:"YYYY. MMMM D., dddd H:mm"},meridiemParse:/de|du/i,isPM:function(_){return"u"===_.charAt(1).toLowerCase()},meridiem:function(_,y,T){return _<12?!0===T?"de":"DE":!0===T?"du":"DU"},calendar:{sameDay:"[ma] LT[-kor]",nextDay:"[holnap] LT[-kor]",nextWeek:function(){return f.call(this,!0)},lastDay:"[tegnap] LT[-kor]",lastWeek:function(){return f.call(this,!1)},sameElse:"L"},relativeTime:{future:"%s m\xfalva",past:"%s",s:p,ss:p,m:p,mm:p,h:p,hh:p,d:p,dd:p,M:p,MM:p,y:p,yy:p},dayOfMonthOrdinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:4}})}(i(16738))},90402:function(v,S,i){!function(r){"use strict";r.defineLocale("hy-am",{months:{format:"\u0570\u0578\u0582\u0576\u057e\u0561\u0580\u056b_\u0583\u0565\u057f\u0580\u057e\u0561\u0580\u056b_\u0574\u0561\u0580\u057f\u056b_\u0561\u057a\u0580\u056b\u056c\u056b_\u0574\u0561\u0575\u056b\u057d\u056b_\u0570\u0578\u0582\u0576\u056b\u057d\u056b_\u0570\u0578\u0582\u056c\u056b\u057d\u056b_\u0585\u0563\u0578\u057d\u057f\u0578\u057d\u056b_\u057d\u0565\u057a\u057f\u0565\u0574\u0562\u0565\u0580\u056b_\u0570\u0578\u056f\u057f\u0565\u0574\u0562\u0565\u0580\u056b_\u0576\u0578\u0575\u0565\u0574\u0562\u0565\u0580\u056b_\u0564\u0565\u056f\u057f\u0565\u0574\u0562\u0565\u0580\u056b".split("_"),standalone:"\u0570\u0578\u0582\u0576\u057e\u0561\u0580_\u0583\u0565\u057f\u0580\u057e\u0561\u0580_\u0574\u0561\u0580\u057f_\u0561\u057a\u0580\u056b\u056c_\u0574\u0561\u0575\u056b\u057d_\u0570\u0578\u0582\u0576\u056b\u057d_\u0570\u0578\u0582\u056c\u056b\u057d_\u0585\u0563\u0578\u057d\u057f\u0578\u057d_\u057d\u0565\u057a\u057f\u0565\u0574\u0562\u0565\u0580_\u0570\u0578\u056f\u057f\u0565\u0574\u0562\u0565\u0580_\u0576\u0578\u0575\u0565\u0574\u0562\u0565\u0580_\u0564\u0565\u056f\u057f\u0565\u0574\u0562\u0565\u0580".split("_")},monthsShort:"\u0570\u0576\u057e_\u0583\u057f\u0580_\u0574\u0580\u057f_\u0561\u057a\u0580_\u0574\u0575\u057d_\u0570\u0576\u057d_\u0570\u056c\u057d_\u0585\u0563\u057d_\u057d\u057a\u057f_\u0570\u056f\u057f_\u0576\u0574\u0562_\u0564\u056f\u057f".split("_"),weekdays:"\u056f\u056b\u0580\u0561\u056f\u056b_\u0565\u0580\u056f\u0578\u0582\u0577\u0561\u0562\u0569\u056b_\u0565\u0580\u0565\u0584\u0577\u0561\u0562\u0569\u056b_\u0579\u0578\u0580\u0565\u0584\u0577\u0561\u0562\u0569\u056b_\u0570\u056b\u0576\u0563\u0577\u0561\u0562\u0569\u056b_\u0578\u0582\u0580\u0562\u0561\u0569_\u0577\u0561\u0562\u0561\u0569".split("_"),weekdaysShort:"\u056f\u0580\u056f_\u0565\u0580\u056f_\u0565\u0580\u0584_\u0579\u0580\u0584_\u0570\u0576\u0563_\u0578\u0582\u0580\u0562_\u0577\u0562\u0569".split("_"),weekdaysMin:"\u056f\u0580\u056f_\u0565\u0580\u056f_\u0565\u0580\u0584_\u0579\u0580\u0584_\u0570\u0576\u0563_\u0578\u0582\u0580\u0562_\u0577\u0562\u0569".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD.MM.YYYY",LL:"D MMMM YYYY \u0569.",LLL:"D MMMM YYYY \u0569., HH:mm",LLLL:"dddd, D MMMM YYYY \u0569., HH:mm"},calendar:{sameDay:"[\u0561\u0575\u057d\u0585\u0580] LT",nextDay:"[\u057e\u0561\u0572\u0568] LT",lastDay:"[\u0565\u0580\u0565\u056f] LT",nextWeek:function(){return"dddd [\u0585\u0580\u0568 \u056a\u0561\u0574\u0568] LT"},lastWeek:function(){return"[\u0561\u0576\u0581\u0561\u056e] dddd [\u0585\u0580\u0568 \u056a\u0561\u0574\u0568] LT"},sameElse:"L"},relativeTime:{future:"%s \u0570\u0565\u057f\u0578",past:"%s \u0561\u057c\u0561\u057b",s:"\u0574\u056b \u0584\u0561\u0576\u056b \u057e\u0561\u0575\u0580\u056f\u0575\u0561\u0576",ss:"%d \u057e\u0561\u0575\u0580\u056f\u0575\u0561\u0576",m:"\u0580\u0578\u057a\u0565",mm:"%d \u0580\u0578\u057a\u0565",h:"\u056a\u0561\u0574",hh:"%d \u056a\u0561\u0574",d:"\u0585\u0580",dd:"%d \u0585\u0580",M:"\u0561\u0574\u056b\u057d",MM:"%d \u0561\u0574\u056b\u057d",y:"\u057f\u0561\u0580\u056b",yy:"%d \u057f\u0561\u0580\u056b"},meridiemParse:/\u0563\u056b\u0577\u0565\u0580\u057e\u0561|\u0561\u057c\u0561\u057e\u0578\u057f\u057e\u0561|\u0581\u0565\u0580\u0565\u056f\u057e\u0561|\u0565\u0580\u0565\u056f\u0578\u0575\u0561\u0576/,isPM:function(p){return/^(\u0581\u0565\u0580\u0565\u056f\u057e\u0561|\u0565\u0580\u0565\u056f\u0578\u0575\u0561\u0576)$/.test(p)},meridiem:function(p){return p<4?"\u0563\u056b\u0577\u0565\u0580\u057e\u0561":p<12?"\u0561\u057c\u0561\u057e\u0578\u057f\u057e\u0561":p<17?"\u0581\u0565\u0580\u0565\u056f\u057e\u0561":"\u0565\u0580\u0565\u056f\u0578\u0575\u0561\u0576"},dayOfMonthOrdinalParse:/\d{1,2}|\d{1,2}-(\u056b\u0576|\u0580\u0564)/,ordinal:function(p,f){switch(f){case"DDD":case"w":case"W":case"DDDo":return 1===p?p+"-\u056b\u0576":p+"-\u0580\u0564";default:return p}},week:{dow:1,doy:7}})}(i(16738))},59187:function(v,S,i){!function(r){"use strict";r.defineLocale("id",{months:"Januari_Februari_Maret_April_Mei_Juni_Juli_Agustus_September_Oktober_November_Desember".split("_"),monthsShort:"Jan_Feb_Mar_Apr_Mei_Jun_Jul_Agt_Sep_Okt_Nov_Des".split("_"),weekdays:"Minggu_Senin_Selasa_Rabu_Kamis_Jumat_Sabtu".split("_"),weekdaysShort:"Min_Sen_Sel_Rab_Kam_Jum_Sab".split("_"),weekdaysMin:"Mg_Sn_Sl_Rb_Km_Jm_Sb".split("_"),longDateFormat:{LT:"HH.mm",LTS:"HH.mm.ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY [pukul] HH.mm",LLLL:"dddd, D MMMM YYYY [pukul] HH.mm"},meridiemParse:/pagi|siang|sore|malam/,meridiemHour:function(p,f){return 12===p&&(p=0),"pagi"===f?p:"siang"===f?p>=11?p:p+12:"sore"===f||"malam"===f?p+12:void 0},meridiem:function(p,f,e){return p<11?"pagi":p<15?"siang":p<19?"sore":"malam"},calendar:{sameDay:"[Hari ini pukul] LT",nextDay:"[Besok pukul] LT",nextWeek:"dddd [pukul] LT",lastDay:"[Kemarin pukul] LT",lastWeek:"dddd [lalu pukul] LT",sameElse:"L"},relativeTime:{future:"dalam %s",past:"%s yang lalu",s:"beberapa detik",ss:"%d detik",m:"semenit",mm:"%d menit",h:"sejam",hh:"%d jam",d:"sehari",dd:"%d hari",M:"sebulan",MM:"%d bulan",y:"setahun",yy:"%d tahun"},week:{dow:0,doy:6}})}(i(16738))},30536:function(v,S,i){!function(r){"use strict";function u(e){return e%100==11||e%10!=1}function p(e,_,y,T){var M=e+" ";switch(y){case"s":return _||T?"nokkrar sek\xfandur":"nokkrum sek\xfandum";case"ss":return u(e)?M+(_||T?"sek\xfandur":"sek\xfandum"):M+"sek\xfanda";case"m":return _?"m\xedn\xfata":"m\xedn\xfatu";case"mm":return u(e)?M+(_||T?"m\xedn\xfatur":"m\xedn\xfatum"):_?M+"m\xedn\xfata":M+"m\xedn\xfatu";case"hh":return u(e)?M+(_||T?"klukkustundir":"klukkustundum"):M+"klukkustund";case"d":return _?"dagur":T?"dag":"degi";case"dd":return u(e)?_?M+"dagar":M+(T?"daga":"d\xf6gum"):_?M+"dagur":M+(T?"dag":"degi");case"M":return _?"m\xe1nu\xf0ur":T?"m\xe1nu\xf0":"m\xe1nu\xf0i";case"MM":return u(e)?_?M+"m\xe1nu\xf0ir":M+(T?"m\xe1nu\xf0i":"m\xe1nu\xf0um"):_?M+"m\xe1nu\xf0ur":M+(T?"m\xe1nu\xf0":"m\xe1nu\xf0i");case"y":return _||T?"\xe1r":"\xe1ri";case"yy":return u(e)?M+(_||T?"\xe1r":"\xe1rum"):M+(_||T?"\xe1r":"\xe1ri")}}r.defineLocale("is",{months:"jan\xfaar_febr\xfaar_mars_apr\xedl_ma\xed_j\xfan\xed_j\xfal\xed_\xe1g\xfast_september_okt\xf3ber_n\xf3vember_desember".split("_"),monthsShort:"jan_feb_mar_apr_ma\xed_j\xfan_j\xfal_\xe1g\xfa_sep_okt_n\xf3v_des".split("_"),weekdays:"sunnudagur_m\xe1nudagur_\xferi\xf0judagur_mi\xf0vikudagur_fimmtudagur_f\xf6studagur_laugardagur".split("_"),weekdaysShort:"sun_m\xe1n_\xferi_mi\xf0_fim_f\xf6s_lau".split("_"),weekdaysMin:"Su_M\xe1_\xder_Mi_Fi_F\xf6_La".split("_"),longDateFormat:{LT:"H:mm",LTS:"H:mm:ss",L:"DD.MM.YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY [kl.] H:mm",LLLL:"dddd, D. MMMM YYYY [kl.] H:mm"},calendar:{sameDay:"[\xed dag kl.] LT",nextDay:"[\xe1 morgun kl.] LT",nextWeek:"dddd [kl.] LT",lastDay:"[\xed g\xe6r kl.] LT",lastWeek:"[s\xed\xf0asta] dddd [kl.] LT",sameElse:"L"},relativeTime:{future:"eftir %s",past:"fyrir %s s\xed\xf0an",s:p,ss:p,m:p,mm:p,h:"klukkustund",hh:p,d:p,dd:p,M:p,MM:p,y:p,yy:p},dayOfMonthOrdinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:4}})}(i(16738))},94667:function(v,S,i){!function(r){"use strict";r.defineLocale("it-ch",{months:"gennaio_febbraio_marzo_aprile_maggio_giugno_luglio_agosto_settembre_ottobre_novembre_dicembre".split("_"),monthsShort:"gen_feb_mar_apr_mag_giu_lug_ago_set_ott_nov_dic".split("_"),weekdays:"domenica_luned\xec_marted\xec_mercoled\xec_gioved\xec_venerd\xec_sabato".split("_"),weekdaysShort:"dom_lun_mar_mer_gio_ven_sab".split("_"),weekdaysMin:"do_lu_ma_me_gi_ve_sa".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD.MM.YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd D MMMM YYYY HH:mm"},calendar:{sameDay:"[Oggi alle] LT",nextDay:"[Domani alle] LT",nextWeek:"dddd [alle] LT",lastDay:"[Ieri alle] LT",lastWeek:function(){switch(this.day()){case 0:return"[la scorsa] dddd [alle] LT";default:return"[lo scorso] dddd [alle] LT"}},sameElse:"L"},relativeTime:{future:function(p){return(/^[0-9].+$/.test(p)?"tra":"in")+" "+p},past:"%s fa",s:"alcuni secondi",ss:"%d secondi",m:"un minuto",mm:"%d minuti",h:"un'ora",hh:"%d ore",d:"un giorno",dd:"%d giorni",M:"un mese",MM:"%d mesi",y:"un anno",yy:"%d anni"},dayOfMonthOrdinalParse:/\d{1,2}\xba/,ordinal:"%d\xba",week:{dow:1,doy:4}})}(i(16738))},35007:function(v,S,i){!function(r){"use strict";r.defineLocale("it",{months:"gennaio_febbraio_marzo_aprile_maggio_giugno_luglio_agosto_settembre_ottobre_novembre_dicembre".split("_"),monthsShort:"gen_feb_mar_apr_mag_giu_lug_ago_set_ott_nov_dic".split("_"),weekdays:"domenica_luned\xec_marted\xec_mercoled\xec_gioved\xec_venerd\xec_sabato".split("_"),weekdaysShort:"dom_lun_mar_mer_gio_ven_sab".split("_"),weekdaysMin:"do_lu_ma_me_gi_ve_sa".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd D MMMM YYYY HH:mm"},calendar:{sameDay:function(){return"[Oggi a"+(this.hours()>1?"lle ":0===this.hours()?" ":"ll'")+"]LT"},nextDay:function(){return"[Domani a"+(this.hours()>1?"lle ":0===this.hours()?" ":"ll'")+"]LT"},nextWeek:function(){return"dddd [a"+(this.hours()>1?"lle ":0===this.hours()?" ":"ll'")+"]LT"},lastDay:function(){return"[Ieri a"+(this.hours()>1?"lle ":0===this.hours()?" ":"ll'")+"]LT"},lastWeek:function(){switch(this.day()){case 0:return"[La scorsa] dddd [a"+(this.hours()>1?"lle ":0===this.hours()?" ":"ll'")+"]LT";default:return"[Lo scorso] dddd [a"+(this.hours()>1?"lle ":0===this.hours()?" ":"ll'")+"]LT"}},sameElse:"L"},relativeTime:{future:"tra %s",past:"%s fa",s:"alcuni secondi",ss:"%d secondi",m:"un minuto",mm:"%d minuti",h:"un'ora",hh:"%d ore",d:"un giorno",dd:"%d giorni",w:"una settimana",ww:"%d settimane",M:"un mese",MM:"%d mesi",y:"un anno",yy:"%d anni"},dayOfMonthOrdinalParse:/\d{1,2}\xba/,ordinal:"%d\xba",week:{dow:1,doy:4}})}(i(16738))},62093:function(v,S,i){!function(r){"use strict";r.defineLocale("ja",{eras:[{since:"2019-05-01",offset:1,name:"\u4ee4\u548c",narrow:"\u32ff",abbr:"R"},{since:"1989-01-08",until:"2019-04-30",offset:1,name:"\u5e73\u6210",narrow:"\u337b",abbr:"H"},{since:"1926-12-25",until:"1989-01-07",offset:1,name:"\u662d\u548c",narrow:"\u337c",abbr:"S"},{since:"1912-07-30",until:"1926-12-24",offset:1,name:"\u5927\u6b63",narrow:"\u337d",abbr:"T"},{since:"1873-01-01",until:"1912-07-29",offset:6,name:"\u660e\u6cbb",narrow:"\u337e",abbr:"M"},{since:"0001-01-01",until:"1873-12-31",offset:1,name:"\u897f\u66a6",narrow:"AD",abbr:"AD"},{since:"0000-12-31",until:-1/0,offset:1,name:"\u7d00\u5143\u524d",narrow:"BC",abbr:"BC"}],eraYearOrdinalRegex:/(\u5143|\d+)\u5e74/,eraYearOrdinalParse:function(p,f){return"\u5143"===f[1]?1:parseInt(f[1]||p,10)},months:"1\u6708_2\u6708_3\u6708_4\u6708_5\u6708_6\u6708_7\u6708_8\u6708_9\u6708_10\u6708_11\u6708_12\u6708".split("_"),monthsShort:"1\u6708_2\u6708_3\u6708_4\u6708_5\u6708_6\u6708_7\u6708_8\u6708_9\u6708_10\u6708_11\u6708_12\u6708".split("_"),weekdays:"\u65e5\u66dc\u65e5_\u6708\u66dc\u65e5_\u706b\u66dc\u65e5_\u6c34\u66dc\u65e5_\u6728\u66dc\u65e5_\u91d1\u66dc\u65e5_\u571f\u66dc\u65e5".split("_"),weekdaysShort:"\u65e5_\u6708_\u706b_\u6c34_\u6728_\u91d1_\u571f".split("_"),weekdaysMin:"\u65e5_\u6708_\u706b_\u6c34_\u6728_\u91d1_\u571f".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"YYYY/MM/DD",LL:"YYYY\u5e74M\u6708D\u65e5",LLL:"YYYY\u5e74M\u6708D\u65e5 HH:mm",LLLL:"YYYY\u5e74M\u6708D\u65e5 dddd HH:mm",l:"YYYY/MM/DD",ll:"YYYY\u5e74M\u6708D\u65e5",lll:"YYYY\u5e74M\u6708D\u65e5 HH:mm",llll:"YYYY\u5e74M\u6708D\u65e5(ddd) HH:mm"},meridiemParse:/\u5348\u524d|\u5348\u5f8c/i,isPM:function(p){return"\u5348\u5f8c"===p},meridiem:function(p,f,e){return p<12?"\u5348\u524d":"\u5348\u5f8c"},calendar:{sameDay:"[\u4eca\u65e5] LT",nextDay:"[\u660e\u65e5] LT",nextWeek:function(p){return p.week()!==this.week()?"[\u6765\u9031]dddd LT":"dddd LT"},lastDay:"[\u6628\u65e5] LT",lastWeek:function(p){return this.week()!==p.week()?"[\u5148\u9031]dddd LT":"dddd LT"},sameElse:"L"},dayOfMonthOrdinalParse:/\d{1,2}\u65e5/,ordinal:function(p,f){switch(f){case"y":return 1===p?"\u5143\u5e74":p+"\u5e74";case"d":case"D":case"DDD":return p+"\u65e5";default:return p}},relativeTime:{future:"%s\u5f8c",past:"%s\u524d",s:"\u6570\u79d2",ss:"%d\u79d2",m:"1\u5206",mm:"%d\u5206",h:"1\u6642\u9593",hh:"%d\u6642\u9593",d:"1\u65e5",dd:"%d\u65e5",M:"1\u30f6\u6708",MM:"%d\u30f6\u6708",y:"1\u5e74",yy:"%d\u5e74"}})}(i(16738))},80059:function(v,S,i){!function(r){"use strict";r.defineLocale("jv",{months:"Januari_Februari_Maret_April_Mei_Juni_Juli_Agustus_September_Oktober_Nopember_Desember".split("_"),monthsShort:"Jan_Feb_Mar_Apr_Mei_Jun_Jul_Ags_Sep_Okt_Nop_Des".split("_"),weekdays:"Minggu_Senen_Seloso_Rebu_Kemis_Jemuwah_Septu".split("_"),weekdaysShort:"Min_Sen_Sel_Reb_Kem_Jem_Sep".split("_"),weekdaysMin:"Mg_Sn_Sl_Rb_Km_Jm_Sp".split("_"),longDateFormat:{LT:"HH.mm",LTS:"HH.mm.ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY [pukul] HH.mm",LLLL:"dddd, D MMMM YYYY [pukul] HH.mm"},meridiemParse:/enjing|siyang|sonten|ndalu/,meridiemHour:function(p,f){return 12===p&&(p=0),"enjing"===f?p:"siyang"===f?p>=11?p:p+12:"sonten"===f||"ndalu"===f?p+12:void 0},meridiem:function(p,f,e){return p<11?"enjing":p<15?"siyang":p<19?"sonten":"ndalu"},calendar:{sameDay:"[Dinten puniko pukul] LT",nextDay:"[Mbenjang pukul] LT",nextWeek:"dddd [pukul] LT",lastDay:"[Kala wingi pukul] LT",lastWeek:"dddd [kepengker pukul] LT",sameElse:"L"},relativeTime:{future:"wonten ing %s",past:"%s ingkang kepengker",s:"sawetawis detik",ss:"%d detik",m:"setunggal menit",mm:"%d menit",h:"setunggal jam",hh:"%d jam",d:"sedinten",dd:"%d dinten",M:"sewulan",MM:"%d wulan",y:"setaun",yy:"%d taun"},week:{dow:1,doy:7}})}(i(16738))},66870:function(v,S,i){!function(r){"use strict";r.defineLocale("ka",{months:"\u10d8\u10d0\u10dc\u10d5\u10d0\u10e0\u10d8_\u10d7\u10d4\u10d1\u10d4\u10e0\u10d5\u10d0\u10da\u10d8_\u10db\u10d0\u10e0\u10e2\u10d8_\u10d0\u10de\u10e0\u10d8\u10da\u10d8_\u10db\u10d0\u10d8\u10e1\u10d8_\u10d8\u10d5\u10dc\u10d8\u10e1\u10d8_\u10d8\u10d5\u10da\u10d8\u10e1\u10d8_\u10d0\u10d2\u10d5\u10d8\u10e1\u10e2\u10dd_\u10e1\u10d4\u10e5\u10e2\u10d4\u10db\u10d1\u10d4\u10e0\u10d8_\u10dd\u10e5\u10e2\u10dd\u10db\u10d1\u10d4\u10e0\u10d8_\u10dc\u10dd\u10d4\u10db\u10d1\u10d4\u10e0\u10d8_\u10d3\u10d4\u10d9\u10d4\u10db\u10d1\u10d4\u10e0\u10d8".split("_"),monthsShort:"\u10d8\u10d0\u10dc_\u10d7\u10d4\u10d1_\u10db\u10d0\u10e0_\u10d0\u10de\u10e0_\u10db\u10d0\u10d8_\u10d8\u10d5\u10dc_\u10d8\u10d5\u10da_\u10d0\u10d2\u10d5_\u10e1\u10d4\u10e5_\u10dd\u10e5\u10e2_\u10dc\u10dd\u10d4_\u10d3\u10d4\u10d9".split("_"),weekdays:{standalone:"\u10d9\u10d5\u10d8\u10e0\u10d0_\u10dd\u10e0\u10e8\u10d0\u10d1\u10d0\u10d7\u10d8_\u10e1\u10d0\u10db\u10e8\u10d0\u10d1\u10d0\u10d7\u10d8_\u10dd\u10d7\u10ee\u10e8\u10d0\u10d1\u10d0\u10d7\u10d8_\u10ee\u10e3\u10d7\u10e8\u10d0\u10d1\u10d0\u10d7\u10d8_\u10de\u10d0\u10e0\u10d0\u10e1\u10d9\u10d4\u10d5\u10d8_\u10e8\u10d0\u10d1\u10d0\u10d7\u10d8".split("_"),format:"\u10d9\u10d5\u10d8\u10e0\u10d0\u10e1_\u10dd\u10e0\u10e8\u10d0\u10d1\u10d0\u10d7\u10e1_\u10e1\u10d0\u10db\u10e8\u10d0\u10d1\u10d0\u10d7\u10e1_\u10dd\u10d7\u10ee\u10e8\u10d0\u10d1\u10d0\u10d7\u10e1_\u10ee\u10e3\u10d7\u10e8\u10d0\u10d1\u10d0\u10d7\u10e1_\u10de\u10d0\u10e0\u10d0\u10e1\u10d9\u10d4\u10d5\u10e1_\u10e8\u10d0\u10d1\u10d0\u10d7\u10e1".split("_"),isFormat:/(\u10ec\u10d8\u10dc\u10d0|\u10e8\u10d4\u10db\u10d3\u10d4\u10d2)/},weekdaysShort:"\u10d9\u10d5\u10d8_\u10dd\u10e0\u10e8_\u10e1\u10d0\u10db_\u10dd\u10d7\u10ee_\u10ee\u10e3\u10d7_\u10de\u10d0\u10e0_\u10e8\u10d0\u10d1".split("_"),weekdaysMin:"\u10d9\u10d5_\u10dd\u10e0_\u10e1\u10d0_\u10dd\u10d7_\u10ee\u10e3_\u10de\u10d0_\u10e8\u10d0".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd, D MMMM YYYY HH:mm"},calendar:{sameDay:"[\u10d3\u10e6\u10d4\u10e1] LT[-\u10d6\u10d4]",nextDay:"[\u10ee\u10d5\u10d0\u10da] LT[-\u10d6\u10d4]",lastDay:"[\u10d2\u10e3\u10e8\u10d8\u10dc] LT[-\u10d6\u10d4]",nextWeek:"[\u10e8\u10d4\u10db\u10d3\u10d4\u10d2] dddd LT[-\u10d6\u10d4]",lastWeek:"[\u10ec\u10d8\u10dc\u10d0] dddd LT-\u10d6\u10d4",sameElse:"L"},relativeTime:{future:function(p){return p.replace(/(\u10ec\u10d0\u10db|\u10ec\u10e3\u10d7|\u10e1\u10d0\u10d0\u10d7|\u10ec\u10d4\u10da|\u10d3\u10e6|\u10d7\u10d5)(\u10d8|\u10d4)/,function(f,e,_){return"\u10d8"===_?e+"\u10e8\u10d8":e+_+"\u10e8\u10d8"})},past:function(p){return/(\u10ec\u10d0\u10db\u10d8|\u10ec\u10e3\u10d7\u10d8|\u10e1\u10d0\u10d0\u10d7\u10d8|\u10d3\u10e6\u10d4|\u10d7\u10d5\u10d4)/.test(p)?p.replace(/(\u10d8|\u10d4)$/,"\u10d8\u10e1 \u10ec\u10d8\u10dc"):/\u10ec\u10d4\u10da\u10d8/.test(p)?p.replace(/\u10ec\u10d4\u10da\u10d8$/,"\u10ec\u10da\u10d8\u10e1 \u10ec\u10d8\u10dc"):p},s:"\u10e0\u10d0\u10db\u10d3\u10d4\u10dc\u10d8\u10db\u10d4 \u10ec\u10d0\u10db\u10d8",ss:"%d \u10ec\u10d0\u10db\u10d8",m:"\u10ec\u10e3\u10d7\u10d8",mm:"%d \u10ec\u10e3\u10d7\u10d8",h:"\u10e1\u10d0\u10d0\u10d7\u10d8",hh:"%d \u10e1\u10d0\u10d0\u10d7\u10d8",d:"\u10d3\u10e6\u10d4",dd:"%d \u10d3\u10e6\u10d4",M:"\u10d7\u10d5\u10d4",MM:"%d \u10d7\u10d5\u10d4",y:"\u10ec\u10d4\u10da\u10d8",yy:"%d \u10ec\u10d4\u10da\u10d8"},dayOfMonthOrdinalParse:/0|1-\u10da\u10d8|\u10db\u10d4-\d{1,2}|\d{1,2}-\u10d4/,ordinal:function(p){return 0===p?p:1===p?p+"-\u10da\u10d8":p<20||p<=100&&p%20==0||p%100==0?"\u10db\u10d4-"+p:p+"-\u10d4"},week:{dow:1,doy:7}})}(i(16738))},80880:function(v,S,i){!function(r){"use strict";var u={0:"-\u0448\u0456",1:"-\u0448\u0456",2:"-\u0448\u0456",3:"-\u0448\u0456",4:"-\u0448\u0456",5:"-\u0448\u0456",6:"-\u0448\u044b",7:"-\u0448\u0456",8:"-\u0448\u0456",9:"-\u0448\u044b",10:"-\u0448\u044b",20:"-\u0448\u044b",30:"-\u0448\u044b",40:"-\u0448\u044b",50:"-\u0448\u0456",60:"-\u0448\u044b",70:"-\u0448\u0456",80:"-\u0448\u0456",90:"-\u0448\u044b",100:"-\u0448\u0456"};r.defineLocale("kk",{months:"\u049b\u0430\u04a3\u0442\u0430\u0440_\u0430\u049b\u043f\u0430\u043d_\u043d\u0430\u0443\u0440\u044b\u0437_\u0441\u04d9\u0443\u0456\u0440_\u043c\u0430\u043c\u044b\u0440_\u043c\u0430\u0443\u0441\u044b\u043c_\u0448\u0456\u043b\u0434\u0435_\u0442\u0430\u043c\u044b\u0437_\u049b\u044b\u0440\u043a\u04af\u0439\u0435\u043a_\u049b\u0430\u0437\u0430\u043d_\u049b\u0430\u0440\u0430\u0448\u0430_\u0436\u0435\u043b\u0442\u043e\u049b\u0441\u0430\u043d".split("_"),monthsShort:"\u049b\u0430\u04a3_\u0430\u049b\u043f_\u043d\u0430\u0443_\u0441\u04d9\u0443_\u043c\u0430\u043c_\u043c\u0430\u0443_\u0448\u0456\u043b_\u0442\u0430\u043c_\u049b\u044b\u0440_\u049b\u0430\u0437_\u049b\u0430\u0440_\u0436\u0435\u043b".split("_"),weekdays:"\u0436\u0435\u043a\u0441\u0435\u043d\u0431\u0456_\u0434\u04af\u0439\u0441\u0435\u043d\u0431\u0456_\u0441\u0435\u0439\u0441\u0435\u043d\u0431\u0456_\u0441\u04d9\u0440\u0441\u0435\u043d\u0431\u0456_\u0431\u0435\u0439\u0441\u0435\u043d\u0431\u0456_\u0436\u04b1\u043c\u0430_\u0441\u0435\u043d\u0431\u0456".split("_"),weekdaysShort:"\u0436\u0435\u043a_\u0434\u04af\u0439_\u0441\u0435\u0439_\u0441\u04d9\u0440_\u0431\u0435\u0439_\u0436\u04b1\u043c_\u0441\u0435\u043d".split("_"),weekdaysMin:"\u0436\u043a_\u0434\u0439_\u0441\u0439_\u0441\u0440_\u0431\u0439_\u0436\u043c_\u0441\u043d".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD.MM.YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd, D MMMM YYYY HH:mm"},calendar:{sameDay:"[\u0411\u04af\u0433\u0456\u043d \u0441\u0430\u0493\u0430\u0442] LT",nextDay:"[\u0415\u0440\u0442\u0435\u04a3 \u0441\u0430\u0493\u0430\u0442] LT",nextWeek:"dddd [\u0441\u0430\u0493\u0430\u0442] LT",lastDay:"[\u041a\u0435\u0448\u0435 \u0441\u0430\u0493\u0430\u0442] LT",lastWeek:"[\u04e8\u0442\u043a\u0435\u043d \u0430\u043f\u0442\u0430\u043d\u044b\u04a3] dddd [\u0441\u0430\u0493\u0430\u0442] LT",sameElse:"L"},relativeTime:{future:"%s \u0456\u0448\u0456\u043d\u0434\u0435",past:"%s \u0431\u04b1\u0440\u044b\u043d",s:"\u0431\u0456\u0440\u043d\u0435\u0448\u0435 \u0441\u0435\u043a\u0443\u043d\u0434",ss:"%d \u0441\u0435\u043a\u0443\u043d\u0434",m:"\u0431\u0456\u0440 \u043c\u0438\u043d\u0443\u0442",mm:"%d \u043c\u0438\u043d\u0443\u0442",h:"\u0431\u0456\u0440 \u0441\u0430\u0493\u0430\u0442",hh:"%d \u0441\u0430\u0493\u0430\u0442",d:"\u0431\u0456\u0440 \u043a\u04af\u043d",dd:"%d \u043a\u04af\u043d",M:"\u0431\u0456\u0440 \u0430\u0439",MM:"%d \u0430\u0439",y:"\u0431\u0456\u0440 \u0436\u044b\u043b",yy:"%d \u0436\u044b\u043b"},dayOfMonthOrdinalParse:/\d{1,2}-(\u0448\u0456|\u0448\u044b)/,ordinal:function(f){return f+(u[f]||u[f%10]||u[f>=100?100:null])},week:{dow:1,doy:7}})}(i(16738))},1083:function(v,S,i){!function(r){"use strict";var u={1:"\u17e1",2:"\u17e2",3:"\u17e3",4:"\u17e4",5:"\u17e5",6:"\u17e6",7:"\u17e7",8:"\u17e8",9:"\u17e9",0:"\u17e0"},p={"\u17e1":"1","\u17e2":"2","\u17e3":"3","\u17e4":"4","\u17e5":"5","\u17e6":"6","\u17e7":"7","\u17e8":"8","\u17e9":"9","\u17e0":"0"};r.defineLocale("km",{months:"\u1798\u1780\u179a\u17b6_\u1780\u17bb\u1798\u17d2\u1797\u17c8_\u1798\u17b8\u1793\u17b6_\u1798\u17c1\u179f\u17b6_\u17a7\u179f\u1797\u17b6_\u1798\u17b7\u1790\u17bb\u1793\u17b6_\u1780\u1780\u17d2\u1780\u178a\u17b6_\u179f\u17b8\u17a0\u17b6_\u1780\u1789\u17d2\u1789\u17b6_\u178f\u17bb\u179b\u17b6_\u179c\u17b7\u1785\u17d2\u1786\u17b7\u1780\u17b6_\u1792\u17d2\u1793\u17bc".split("_"),monthsShort:"\u1798\u1780\u179a\u17b6_\u1780\u17bb\u1798\u17d2\u1797\u17c8_\u1798\u17b8\u1793\u17b6_\u1798\u17c1\u179f\u17b6_\u17a7\u179f\u1797\u17b6_\u1798\u17b7\u1790\u17bb\u1793\u17b6_\u1780\u1780\u17d2\u1780\u178a\u17b6_\u179f\u17b8\u17a0\u17b6_\u1780\u1789\u17d2\u1789\u17b6_\u178f\u17bb\u179b\u17b6_\u179c\u17b7\u1785\u17d2\u1786\u17b7\u1780\u17b6_\u1792\u17d2\u1793\u17bc".split("_"),weekdays:"\u17a2\u17b6\u1791\u17b7\u178f\u17d2\u1799_\u1785\u17d0\u1793\u17d2\u1791_\u17a2\u1784\u17d2\u1782\u17b6\u179a_\u1796\u17bb\u1792_\u1796\u17d2\u179a\u17a0\u179f\u17d2\u1794\u178f\u17b7\u17cd_\u179f\u17bb\u1780\u17d2\u179a_\u179f\u17c5\u179a\u17cd".split("_"),weekdaysShort:"\u17a2\u17b6_\u1785_\u17a2_\u1796_\u1796\u17d2\u179a_\u179f\u17bb_\u179f".split("_"),weekdaysMin:"\u17a2\u17b6_\u1785_\u17a2_\u1796_\u1796\u17d2\u179a_\u179f\u17bb_\u179f".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd, D MMMM YYYY HH:mm"},meridiemParse:/\u1796\u17d2\u179a\u17b9\u1780|\u179b\u17d2\u1784\u17b6\u1785/,isPM:function(e){return"\u179b\u17d2\u1784\u17b6\u1785"===e},meridiem:function(e,_,y){return e<12?"\u1796\u17d2\u179a\u17b9\u1780":"\u179b\u17d2\u1784\u17b6\u1785"},calendar:{sameDay:"[\u1790\u17d2\u1784\u17c3\u1793\u17c1\u17c7 \u1798\u17c9\u17c4\u1784] LT",nextDay:"[\u179f\u17d2\u17a2\u17c2\u1780 \u1798\u17c9\u17c4\u1784] LT",nextWeek:"dddd [\u1798\u17c9\u17c4\u1784] LT",lastDay:"[\u1798\u17d2\u179f\u17b7\u179b\u1798\u17b7\u1789 \u1798\u17c9\u17c4\u1784] LT",lastWeek:"dddd [\u179f\u1794\u17d2\u178f\u17b6\u17a0\u17cd\u1798\u17bb\u1793] [\u1798\u17c9\u17c4\u1784] LT",sameElse:"L"},relativeTime:{future:"%s\u1791\u17c0\u178f",past:"%s\u1798\u17bb\u1793",s:"\u1794\u17c9\u17bb\u1793\u17d2\u1798\u17b6\u1793\u179c\u17b7\u1793\u17b6\u1791\u17b8",ss:"%d \u179c\u17b7\u1793\u17b6\u1791\u17b8",m:"\u1798\u17bd\u1799\u1793\u17b6\u1791\u17b8",mm:"%d \u1793\u17b6\u1791\u17b8",h:"\u1798\u17bd\u1799\u1798\u17c9\u17c4\u1784",hh:"%d \u1798\u17c9\u17c4\u1784",d:"\u1798\u17bd\u1799\u1790\u17d2\u1784\u17c3",dd:"%d \u1790\u17d2\u1784\u17c3",M:"\u1798\u17bd\u1799\u1781\u17c2",MM:"%d \u1781\u17c2",y:"\u1798\u17bd\u1799\u1786\u17d2\u1793\u17b6\u17c6",yy:"%d \u1786\u17d2\u1793\u17b6\u17c6"},dayOfMonthOrdinalParse:/\u1791\u17b8\d{1,2}/,ordinal:"\u1791\u17b8%d",preparse:function(e){return e.replace(/[\u17e1\u17e2\u17e3\u17e4\u17e5\u17e6\u17e7\u17e8\u17e9\u17e0]/g,function(_){return p[_]})},postformat:function(e){return e.replace(/\d/g,function(_){return u[_]})},week:{dow:1,doy:4}})}(i(16738))},68785:function(v,S,i){!function(r){"use strict";var u={1:"\u0ce7",2:"\u0ce8",3:"\u0ce9",4:"\u0cea",5:"\u0ceb",6:"\u0cec",7:"\u0ced",8:"\u0cee",9:"\u0cef",0:"\u0ce6"},p={"\u0ce7":"1","\u0ce8":"2","\u0ce9":"3","\u0cea":"4","\u0ceb":"5","\u0cec":"6","\u0ced":"7","\u0cee":"8","\u0cef":"9","\u0ce6":"0"};r.defineLocale("kn",{months:"\u0c9c\u0ca8\u0cb5\u0cb0\u0cbf_\u0cab\u0cc6\u0cac\u0ccd\u0cb0\u0cb5\u0cb0\u0cbf_\u0cae\u0cbe\u0cb0\u0ccd\u0c9a\u0ccd_\u0c8f\u0caa\u0ccd\u0cb0\u0cbf\u0cb2\u0ccd_\u0cae\u0cc6\u0cd5_\u0c9c\u0cc2\u0ca8\u0ccd_\u0c9c\u0cc1\u0cb2\u0cc6\u0cd6_\u0c86\u0c97\u0cb8\u0ccd\u0c9f\u0ccd_\u0cb8\u0cc6\u0caa\u0ccd\u0c9f\u0cc6\u0c82\u0cac\u0cb0\u0ccd_\u0c85\u0c95\u0ccd\u0c9f\u0cc6\u0cc2\u0cd5\u0cac\u0cb0\u0ccd_\u0ca8\u0cb5\u0cc6\u0c82\u0cac\u0cb0\u0ccd_\u0ca1\u0cbf\u0cb8\u0cc6\u0c82\u0cac\u0cb0\u0ccd".split("_"),monthsShort:"\u0c9c\u0ca8_\u0cab\u0cc6\u0cac\u0ccd\u0cb0_\u0cae\u0cbe\u0cb0\u0ccd\u0c9a\u0ccd_\u0c8f\u0caa\u0ccd\u0cb0\u0cbf\u0cb2\u0ccd_\u0cae\u0cc6\u0cd5_\u0c9c\u0cc2\u0ca8\u0ccd_\u0c9c\u0cc1\u0cb2\u0cc6\u0cd6_\u0c86\u0c97\u0cb8\u0ccd\u0c9f\u0ccd_\u0cb8\u0cc6\u0caa\u0ccd\u0c9f\u0cc6\u0c82_\u0c85\u0c95\u0ccd\u0c9f\u0cc6\u0cc2\u0cd5_\u0ca8\u0cb5\u0cc6\u0c82_\u0ca1\u0cbf\u0cb8\u0cc6\u0c82".split("_"),monthsParseExact:!0,weekdays:"\u0cad\u0cbe\u0ca8\u0cc1\u0cb5\u0cbe\u0cb0_\u0cb8\u0cc6\u0cc2\u0cd5\u0cae\u0cb5\u0cbe\u0cb0_\u0cae\u0c82\u0c97\u0cb3\u0cb5\u0cbe\u0cb0_\u0cac\u0cc1\u0ca7\u0cb5\u0cbe\u0cb0_\u0c97\u0cc1\u0cb0\u0cc1\u0cb5\u0cbe\u0cb0_\u0cb6\u0cc1\u0c95\u0ccd\u0cb0\u0cb5\u0cbe\u0cb0_\u0cb6\u0ca8\u0cbf\u0cb5\u0cbe\u0cb0".split("_"),weekdaysShort:"\u0cad\u0cbe\u0ca8\u0cc1_\u0cb8\u0cc6\u0cc2\u0cd5\u0cae_\u0cae\u0c82\u0c97\u0cb3_\u0cac\u0cc1\u0ca7_\u0c97\u0cc1\u0cb0\u0cc1_\u0cb6\u0cc1\u0c95\u0ccd\u0cb0_\u0cb6\u0ca8\u0cbf".split("_"),weekdaysMin:"\u0cad\u0cbe_\u0cb8\u0cc6\u0cc2\u0cd5_\u0cae\u0c82_\u0cac\u0cc1_\u0c97\u0cc1_\u0cb6\u0cc1_\u0cb6".split("_"),longDateFormat:{LT:"A h:mm",LTS:"A h:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY, A h:mm",LLLL:"dddd, D MMMM YYYY, A h:mm"},calendar:{sameDay:"[\u0c87\u0c82\u0ca6\u0cc1] LT",nextDay:"[\u0ca8\u0cbe\u0cb3\u0cc6] LT",nextWeek:"dddd, LT",lastDay:"[\u0ca8\u0cbf\u0ca8\u0ccd\u0ca8\u0cc6] LT",lastWeek:"[\u0c95\u0cc6\u0cc2\u0ca8\u0cc6\u0caf] dddd, LT",sameElse:"L"},relativeTime:{future:"%s \u0ca8\u0c82\u0ca4\u0cb0",past:"%s \u0cb9\u0cbf\u0c82\u0ca6\u0cc6",s:"\u0c95\u0cc6\u0cb2\u0cb5\u0cc1 \u0c95\u0ccd\u0cb7\u0ca3\u0c97\u0cb3\u0cc1",ss:"%d \u0cb8\u0cc6\u0c95\u0cc6\u0c82\u0ca1\u0cc1\u0c97\u0cb3\u0cc1",m:"\u0c92\u0c82\u0ca6\u0cc1 \u0ca8\u0cbf\u0cae\u0cbf\u0cb7",mm:"%d \u0ca8\u0cbf\u0cae\u0cbf\u0cb7",h:"\u0c92\u0c82\u0ca6\u0cc1 \u0c97\u0c82\u0c9f\u0cc6",hh:"%d \u0c97\u0c82\u0c9f\u0cc6",d:"\u0c92\u0c82\u0ca6\u0cc1 \u0ca6\u0cbf\u0ca8",dd:"%d \u0ca6\u0cbf\u0ca8",M:"\u0c92\u0c82\u0ca6\u0cc1 \u0ca4\u0cbf\u0c82\u0c97\u0cb3\u0cc1",MM:"%d \u0ca4\u0cbf\u0c82\u0c97\u0cb3\u0cc1",y:"\u0c92\u0c82\u0ca6\u0cc1 \u0cb5\u0cb0\u0ccd\u0cb7",yy:"%d \u0cb5\u0cb0\u0ccd\u0cb7"},preparse:function(e){return e.replace(/[\u0ce7\u0ce8\u0ce9\u0cea\u0ceb\u0cec\u0ced\u0cee\u0cef\u0ce6]/g,function(_){return p[_]})},postformat:function(e){return e.replace(/\d/g,function(_){return u[_]})},meridiemParse:/\u0cb0\u0cbe\u0ca4\u0ccd\u0cb0\u0cbf|\u0cac\u0cc6\u0cb3\u0cbf\u0c97\u0ccd\u0c97\u0cc6|\u0cae\u0ca7\u0ccd\u0caf\u0cbe\u0cb9\u0ccd\u0ca8|\u0cb8\u0c82\u0c9c\u0cc6/,meridiemHour:function(e,_){return 12===e&&(e=0),"\u0cb0\u0cbe\u0ca4\u0ccd\u0cb0\u0cbf"===_?e<4?e:e+12:"\u0cac\u0cc6\u0cb3\u0cbf\u0c97\u0ccd\u0c97\u0cc6"===_?e:"\u0cae\u0ca7\u0ccd\u0caf\u0cbe\u0cb9\u0ccd\u0ca8"===_?e>=10?e:e+12:"\u0cb8\u0c82\u0c9c\u0cc6"===_?e+12:void 0},meridiem:function(e,_,y){return e<4?"\u0cb0\u0cbe\u0ca4\u0ccd\u0cb0\u0cbf":e<10?"\u0cac\u0cc6\u0cb3\u0cbf\u0c97\u0ccd\u0c97\u0cc6":e<17?"\u0cae\u0ca7\u0ccd\u0caf\u0cbe\u0cb9\u0ccd\u0ca8":e<20?"\u0cb8\u0c82\u0c9c\u0cc6":"\u0cb0\u0cbe\u0ca4\u0ccd\u0cb0\u0cbf"},dayOfMonthOrdinalParse:/\d{1,2}(\u0ca8\u0cc6\u0cd5)/,ordinal:function(e){return e+"\u0ca8\u0cc6\u0cd5"},week:{dow:0,doy:6}})}(i(16738))},21721:function(v,S,i){!function(r){"use strict";r.defineLocale("ko",{months:"1\uc6d4_2\uc6d4_3\uc6d4_4\uc6d4_5\uc6d4_6\uc6d4_7\uc6d4_8\uc6d4_9\uc6d4_10\uc6d4_11\uc6d4_12\uc6d4".split("_"),monthsShort:"1\uc6d4_2\uc6d4_3\uc6d4_4\uc6d4_5\uc6d4_6\uc6d4_7\uc6d4_8\uc6d4_9\uc6d4_10\uc6d4_11\uc6d4_12\uc6d4".split("_"),weekdays:"\uc77c\uc694\uc77c_\uc6d4\uc694\uc77c_\ud654\uc694\uc77c_\uc218\uc694\uc77c_\ubaa9\uc694\uc77c_\uae08\uc694\uc77c_\ud1a0\uc694\uc77c".split("_"),weekdaysShort:"\uc77c_\uc6d4_\ud654_\uc218_\ubaa9_\uae08_\ud1a0".split("_"),weekdaysMin:"\uc77c_\uc6d4_\ud654_\uc218_\ubaa9_\uae08_\ud1a0".split("_"),longDateFormat:{LT:"A h:mm",LTS:"A h:mm:ss",L:"YYYY.MM.DD.",LL:"YYYY\ub144 MMMM D\uc77c",LLL:"YYYY\ub144 MMMM D\uc77c A h:mm",LLLL:"YYYY\ub144 MMMM D\uc77c dddd A h:mm",l:"YYYY.MM.DD.",ll:"YYYY\ub144 MMMM D\uc77c",lll:"YYYY\ub144 MMMM D\uc77c A h:mm",llll:"YYYY\ub144 MMMM D\uc77c dddd A h:mm"},calendar:{sameDay:"\uc624\ub298 LT",nextDay:"\ub0b4\uc77c LT",nextWeek:"dddd LT",lastDay:"\uc5b4\uc81c LT",lastWeek:"\uc9c0\ub09c\uc8fc dddd LT",sameElse:"L"},relativeTime:{future:"%s \ud6c4",past:"%s \uc804",s:"\uba87 \ucd08",ss:"%d\ucd08",m:"1\ubd84",mm:"%d\ubd84",h:"\ud55c \uc2dc\uac04",hh:"%d\uc2dc\uac04",d:"\ud558\ub8e8",dd:"%d\uc77c",M:"\ud55c \ub2ec",MM:"%d\ub2ec",y:"\uc77c \ub144",yy:"%d\ub144"},dayOfMonthOrdinalParse:/\d{1,2}(\uc77c|\uc6d4|\uc8fc)/,ordinal:function(p,f){switch(f){case"d":case"D":case"DDD":return p+"\uc77c";case"M":return p+"\uc6d4";case"w":case"W":return p+"\uc8fc";default:return p}},meridiemParse:/\uc624\uc804|\uc624\ud6c4/,isPM:function(p){return"\uc624\ud6c4"===p},meridiem:function(p,f,e){return p<12?"\uc624\uc804":"\uc624\ud6c4"}})}(i(16738))},37851:function(v,S,i){!function(r){"use strict";var u={1:"\u0661",2:"\u0662",3:"\u0663",4:"\u0664",5:"\u0665",6:"\u0666",7:"\u0667",8:"\u0668",9:"\u0669",0:"\u0660"},p={"\u0661":"1","\u0662":"2","\u0663":"3","\u0664":"4","\u0665":"5","\u0666":"6","\u0667":"7","\u0668":"8","\u0669":"9","\u0660":"0"},f=["\u06a9\u0627\u0646\u0648\u0646\u06cc \u062f\u0648\u0648\u06d5\u0645","\u0634\u0648\u0628\u0627\u062a","\u0626\u0627\u0632\u0627\u0631","\u0646\u06cc\u0633\u0627\u0646","\u0626\u0627\u06cc\u0627\u0631","\u062d\u0648\u0632\u06d5\u06cc\u0631\u0627\u0646","\u062a\u06d5\u0645\u0645\u0648\u0632","\u0626\u0627\u0628","\u0626\u06d5\u06cc\u0644\u0648\u0648\u0644","\u062a\u0634\u0631\u06cc\u0646\u06cc \u06cc\u06d5\u0643\u06d5\u0645","\u062a\u0634\u0631\u06cc\u0646\u06cc \u062f\u0648\u0648\u06d5\u0645","\u0643\u0627\u0646\u0648\u0646\u06cc \u06cc\u06d5\u06a9\u06d5\u0645"];r.defineLocale("ku",{months:f,monthsShort:f,weekdays:"\u06cc\u0647\u200c\u0643\u0634\u0647\u200c\u0645\u0645\u0647\u200c_\u062f\u0648\u0648\u0634\u0647\u200c\u0645\u0645\u0647\u200c_\u0633\u06ce\u0634\u0647\u200c\u0645\u0645\u0647\u200c_\u0686\u0648\u0627\u0631\u0634\u0647\u200c\u0645\u0645\u0647\u200c_\u067e\u06ce\u0646\u062c\u0634\u0647\u200c\u0645\u0645\u0647\u200c_\u0647\u0647\u200c\u06cc\u0646\u06cc_\u0634\u0647\u200c\u0645\u0645\u0647\u200c".split("_"),weekdaysShort:"\u06cc\u0647\u200c\u0643\u0634\u0647\u200c\u0645_\u062f\u0648\u0648\u0634\u0647\u200c\u0645_\u0633\u06ce\u0634\u0647\u200c\u0645_\u0686\u0648\u0627\u0631\u0634\u0647\u200c\u0645_\u067e\u06ce\u0646\u062c\u0634\u0647\u200c\u0645_\u0647\u0647\u200c\u06cc\u0646\u06cc_\u0634\u0647\u200c\u0645\u0645\u0647\u200c".split("_"),weekdaysMin:"\u06cc_\u062f_\u0633_\u0686_\u067e_\u0647_\u0634".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd, D MMMM YYYY HH:mm"},meridiemParse:/\u0626\u06ce\u0648\u0627\u0631\u0647\u200c|\u0628\u0647\u200c\u06cc\u0627\u0646\u06cc/,isPM:function(_){return/\u0626\u06ce\u0648\u0627\u0631\u0647\u200c/.test(_)},meridiem:function(_,y,T){return _<12?"\u0628\u0647\u200c\u06cc\u0627\u0646\u06cc":"\u0626\u06ce\u0648\u0627\u0631\u0647\u200c"},calendar:{sameDay:"[\u0626\u0647\u200c\u0645\u0631\u06c6 \u0643\u0627\u062a\u0698\u0645\u06ce\u0631] LT",nextDay:"[\u0628\u0647\u200c\u06cc\u0627\u0646\u06cc \u0643\u0627\u062a\u0698\u0645\u06ce\u0631] LT",nextWeek:"dddd [\u0643\u0627\u062a\u0698\u0645\u06ce\u0631] LT",lastDay:"[\u062f\u0648\u06ce\u0646\u06ce \u0643\u0627\u062a\u0698\u0645\u06ce\u0631] LT",lastWeek:"dddd [\u0643\u0627\u062a\u0698\u0645\u06ce\u0631] LT",sameElse:"L"},relativeTime:{future:"\u0644\u0647\u200c %s",past:"%s",s:"\u0686\u0647\u200c\u0646\u062f \u0686\u0631\u0643\u0647\u200c\u06cc\u0647\u200c\u0643",ss:"\u0686\u0631\u0643\u0647\u200c %d",m:"\u06cc\u0647\u200c\u0643 \u062e\u0648\u0644\u0647\u200c\u0643",mm:"%d \u062e\u0648\u0644\u0647\u200c\u0643",h:"\u06cc\u0647\u200c\u0643 \u0643\u0627\u062a\u0698\u0645\u06ce\u0631",hh:"%d \u0643\u0627\u062a\u0698\u0645\u06ce\u0631",d:"\u06cc\u0647\u200c\u0643 \u0695\u06c6\u0698",dd:"%d \u0695\u06c6\u0698",M:"\u06cc\u0647\u200c\u0643 \u0645\u0627\u0646\u06af",MM:"%d \u0645\u0627\u0646\u06af",y:"\u06cc\u0647\u200c\u0643 \u0633\u0627\u06b5",yy:"%d \u0633\u0627\u06b5"},preparse:function(_){return _.replace(/[\u0661\u0662\u0663\u0664\u0665\u0666\u0667\u0668\u0669\u0660]/g,function(y){return p[y]}).replace(/\u060c/g,",")},postformat:function(_){return _.replace(/\d/g,function(y){return u[y]}).replace(/,/g,"\u060c")},week:{dow:6,doy:12}})}(i(16738))},1727:function(v,S,i){!function(r){"use strict";var u={0:"-\u0447\u04af",1:"-\u0447\u0438",2:"-\u0447\u0438",3:"-\u0447\u04af",4:"-\u0447\u04af",5:"-\u0447\u0438",6:"-\u0447\u044b",7:"-\u0447\u0438",8:"-\u0447\u0438",9:"-\u0447\u0443",10:"-\u0447\u0443",20:"-\u0447\u044b",30:"-\u0447\u0443",40:"-\u0447\u044b",50:"-\u0447\u04af",60:"-\u0447\u044b",70:"-\u0447\u0438",80:"-\u0447\u0438",90:"-\u0447\u0443",100:"-\u0447\u04af"};r.defineLocale("ky",{months:"\u044f\u043d\u0432\u0430\u0440\u044c_\u0444\u0435\u0432\u0440\u0430\u043b\u044c_\u043c\u0430\u0440\u0442_\u0430\u043f\u0440\u0435\u043b\u044c_\u043c\u0430\u0439_\u0438\u044e\u043d\u044c_\u0438\u044e\u043b\u044c_\u0430\u0432\u0433\u0443\u0441\u0442_\u0441\u0435\u043d\u0442\u044f\u0431\u0440\u044c_\u043e\u043a\u0442\u044f\u0431\u0440\u044c_\u043d\u043e\u044f\u0431\u0440\u044c_\u0434\u0435\u043a\u0430\u0431\u0440\u044c".split("_"),monthsShort:"\u044f\u043d\u0432_\u0444\u0435\u0432_\u043c\u0430\u0440\u0442_\u0430\u043f\u0440_\u043c\u0430\u0439_\u0438\u044e\u043d\u044c_\u0438\u044e\u043b\u044c_\u0430\u0432\u0433_\u0441\u0435\u043d_\u043e\u043a\u0442_\u043d\u043e\u044f_\u0434\u0435\u043a".split("_"),weekdays:"\u0416\u0435\u043a\u0448\u0435\u043c\u0431\u0438_\u0414\u04af\u0439\u0448\u04e9\u043c\u0431\u04af_\u0428\u0435\u0439\u0448\u0435\u043c\u0431\u0438_\u0428\u0430\u0440\u0448\u0435\u043c\u0431\u0438_\u0411\u0435\u0439\u0448\u0435\u043c\u0431\u0438_\u0416\u0443\u043c\u0430_\u0418\u0448\u0435\u043c\u0431\u0438".split("_"),weekdaysShort:"\u0416\u0435\u043a_\u0414\u04af\u0439_\u0428\u0435\u0439_\u0428\u0430\u0440_\u0411\u0435\u0439_\u0416\u0443\u043c_\u0418\u0448\u0435".split("_"),weekdaysMin:"\u0416\u043a_\u0414\u0439_\u0428\u0439_\u0428\u0440_\u0411\u0439_\u0416\u043c_\u0418\u0448".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD.MM.YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd, D MMMM YYYY HH:mm"},calendar:{sameDay:"[\u0411\u04af\u0433\u04af\u043d \u0441\u0430\u0430\u0442] LT",nextDay:"[\u042d\u0440\u0442\u0435\u04a3 \u0441\u0430\u0430\u0442] LT",nextWeek:"dddd [\u0441\u0430\u0430\u0442] LT",lastDay:"[\u041a\u0435\u0447\u044d\u044d \u0441\u0430\u0430\u0442] LT",lastWeek:"[\u04e8\u0442\u043a\u04e9\u043d \u0430\u043f\u0442\u0430\u043d\u044b\u043d] dddd [\u043a\u04af\u043d\u04af] [\u0441\u0430\u0430\u0442] LT",sameElse:"L"},relativeTime:{future:"%s \u0438\u0447\u0438\u043d\u0434\u0435",past:"%s \u043c\u0443\u0440\u0443\u043d",s:"\u0431\u0438\u0440\u043d\u0435\u0447\u0435 \u0441\u0435\u043a\u0443\u043d\u0434",ss:"%d \u0441\u0435\u043a\u0443\u043d\u0434",m:"\u0431\u0438\u0440 \u043c\u04af\u043d\u04e9\u0442",mm:"%d \u043c\u04af\u043d\u04e9\u0442",h:"\u0431\u0438\u0440 \u0441\u0430\u0430\u0442",hh:"%d \u0441\u0430\u0430\u0442",d:"\u0431\u0438\u0440 \u043a\u04af\u043d",dd:"%d \u043a\u04af\u043d",M:"\u0431\u0438\u0440 \u0430\u0439",MM:"%d \u0430\u0439",y:"\u0431\u0438\u0440 \u0436\u044b\u043b",yy:"%d \u0436\u044b\u043b"},dayOfMonthOrdinalParse:/\d{1,2}-(\u0447\u0438|\u0447\u044b|\u0447\u04af|\u0447\u0443)/,ordinal:function(f){return f+(u[f]||u[f%10]||u[f>=100?100:null])},week:{dow:1,doy:7}})}(i(16738))},40346:function(v,S,i){!function(r){"use strict";function u(y,T,M,R){var F={m:["eng Minutt","enger Minutt"],h:["eng Stonn","enger Stonn"],d:["een Dag","engem Dag"],M:["ee Mount","engem Mount"],y:["ee Joer","engem Joer"]};return T?F[M][0]:F[M][1]}function e(y){if(y=parseInt(y,10),isNaN(y))return!1;if(y<0)return!0;if(y<10)return 4<=y&&y<=7;if(y<100){var T=y%10;return e(0===T?y/10:T)}if(y<1e4){for(;y>=10;)y/=10;return e(y)}return e(y/=1e3)}r.defineLocale("lb",{months:"Januar_Februar_M\xe4erz_Abr\xebll_Mee_Juni_Juli_August_September_Oktober_November_Dezember".split("_"),monthsShort:"Jan._Febr._Mrz._Abr._Mee_Jun._Jul._Aug._Sept._Okt._Nov._Dez.".split("_"),monthsParseExact:!0,weekdays:"Sonndeg_M\xe9indeg_D\xebnschdeg_M\xebttwoch_Donneschdeg_Freideg_Samschdeg".split("_"),weekdaysShort:"So._M\xe9._D\xeb._M\xeb._Do._Fr._Sa.".split("_"),weekdaysMin:"So_M\xe9_D\xeb_M\xeb_Do_Fr_Sa".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"H:mm [Auer]",LTS:"H:mm:ss [Auer]",L:"DD.MM.YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY H:mm [Auer]",LLLL:"dddd, D. MMMM YYYY H:mm [Auer]"},calendar:{sameDay:"[Haut um] LT",sameElse:"L",nextDay:"[Muer um] LT",nextWeek:"dddd [um] LT",lastDay:"[G\xebschter um] LT",lastWeek:function(){switch(this.day()){case 2:case 4:return"[Leschten] dddd [um] LT";default:return"[Leschte] dddd [um] LT"}}},relativeTime:{future:function(y){return e(y.substr(0,y.indexOf(" ")))?"a "+y:"an "+y},past:function(y){return e(y.substr(0,y.indexOf(" ")))?"viru "+y:"virun "+y},s:"e puer Sekonnen",ss:"%d Sekonnen",m:u,mm:"%d Minutten",h:u,hh:"%d Stonnen",d:u,dd:"%d Deeg",M:u,MM:"%d M\xe9int",y:u,yy:"%d Joer"},dayOfMonthOrdinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:4}})}(i(16738))},93002:function(v,S,i){!function(r){"use strict";r.defineLocale("lo",{months:"\u0ea1\u0eb1\u0e87\u0e81\u0ead\u0e99_\u0e81\u0eb8\u0ea1\u0e9e\u0eb2_\u0ea1\u0eb5\u0e99\u0eb2_\u0ec0\u0ea1\u0eaa\u0eb2_\u0e9e\u0eb6\u0e94\u0eaa\u0eb0\u0e9e\u0eb2_\u0ea1\u0eb4\u0e96\u0eb8\u0e99\u0eb2_\u0e81\u0ecd\u0ea5\u0eb0\u0e81\u0ebb\u0e94_\u0eaa\u0eb4\u0e87\u0eab\u0eb2_\u0e81\u0eb1\u0e99\u0e8d\u0eb2_\u0e95\u0eb8\u0ea5\u0eb2_\u0e9e\u0eb0\u0e88\u0eb4\u0e81_\u0e97\u0eb1\u0e99\u0ea7\u0eb2".split("_"),monthsShort:"\u0ea1\u0eb1\u0e87\u0e81\u0ead\u0e99_\u0e81\u0eb8\u0ea1\u0e9e\u0eb2_\u0ea1\u0eb5\u0e99\u0eb2_\u0ec0\u0ea1\u0eaa\u0eb2_\u0e9e\u0eb6\u0e94\u0eaa\u0eb0\u0e9e\u0eb2_\u0ea1\u0eb4\u0e96\u0eb8\u0e99\u0eb2_\u0e81\u0ecd\u0ea5\u0eb0\u0e81\u0ebb\u0e94_\u0eaa\u0eb4\u0e87\u0eab\u0eb2_\u0e81\u0eb1\u0e99\u0e8d\u0eb2_\u0e95\u0eb8\u0ea5\u0eb2_\u0e9e\u0eb0\u0e88\u0eb4\u0e81_\u0e97\u0eb1\u0e99\u0ea7\u0eb2".split("_"),weekdays:"\u0ead\u0eb2\u0e97\u0eb4\u0e94_\u0e88\u0eb1\u0e99_\u0ead\u0eb1\u0e87\u0e84\u0eb2\u0e99_\u0e9e\u0eb8\u0e94_\u0e9e\u0eb0\u0eab\u0eb1\u0e94_\u0eaa\u0eb8\u0e81_\u0ec0\u0eaa\u0ebb\u0eb2".split("_"),weekdaysShort:"\u0e97\u0eb4\u0e94_\u0e88\u0eb1\u0e99_\u0ead\u0eb1\u0e87\u0e84\u0eb2\u0e99_\u0e9e\u0eb8\u0e94_\u0e9e\u0eb0\u0eab\u0eb1\u0e94_\u0eaa\u0eb8\u0e81_\u0ec0\u0eaa\u0ebb\u0eb2".split("_"),weekdaysMin:"\u0e97_\u0e88_\u0ead\u0e84_\u0e9e_\u0e9e\u0eab_\u0eaa\u0e81_\u0eaa".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"\u0ea7\u0eb1\u0e99dddd D MMMM YYYY HH:mm"},meridiemParse:/\u0e95\u0ead\u0e99\u0ec0\u0e8a\u0ebb\u0ec9\u0eb2|\u0e95\u0ead\u0e99\u0ec1\u0ea5\u0e87/,isPM:function(p){return"\u0e95\u0ead\u0e99\u0ec1\u0ea5\u0e87"===p},meridiem:function(p,f,e){return p<12?"\u0e95\u0ead\u0e99\u0ec0\u0e8a\u0ebb\u0ec9\u0eb2":"\u0e95\u0ead\u0e99\u0ec1\u0ea5\u0e87"},calendar:{sameDay:"[\u0ea1\u0eb7\u0ec9\u0e99\u0eb5\u0ec9\u0ec0\u0ea7\u0ea5\u0eb2] LT",nextDay:"[\u0ea1\u0eb7\u0ec9\u0ead\u0eb7\u0ec8\u0e99\u0ec0\u0ea7\u0ea5\u0eb2] LT",nextWeek:"[\u0ea7\u0eb1\u0e99]dddd[\u0edc\u0ec9\u0eb2\u0ec0\u0ea7\u0ea5\u0eb2] LT",lastDay:"[\u0ea1\u0eb7\u0ec9\u0ea7\u0eb2\u0e99\u0e99\u0eb5\u0ec9\u0ec0\u0ea7\u0ea5\u0eb2] LT",lastWeek:"[\u0ea7\u0eb1\u0e99]dddd[\u0ec1\u0ea5\u0ec9\u0ea7\u0e99\u0eb5\u0ec9\u0ec0\u0ea7\u0ea5\u0eb2] LT",sameElse:"L"},relativeTime:{future:"\u0ead\u0eb5\u0e81 %s",past:"%s\u0e9c\u0ec8\u0eb2\u0e99\u0ea1\u0eb2",s:"\u0e9a\u0ecd\u0ec8\u0ec0\u0e97\u0ebb\u0ec8\u0eb2\u0ec3\u0e94\u0ea7\u0eb4\u0e99\u0eb2\u0e97\u0eb5",ss:"%d \u0ea7\u0eb4\u0e99\u0eb2\u0e97\u0eb5",m:"1 \u0e99\u0eb2\u0e97\u0eb5",mm:"%d \u0e99\u0eb2\u0e97\u0eb5",h:"1 \u0e8a\u0ebb\u0ec8\u0ea7\u0ec2\u0ea1\u0e87",hh:"%d \u0e8a\u0ebb\u0ec8\u0ea7\u0ec2\u0ea1\u0e87",d:"1 \u0ea1\u0eb7\u0ec9",dd:"%d \u0ea1\u0eb7\u0ec9",M:"1 \u0ec0\u0e94\u0eb7\u0ead\u0e99",MM:"%d \u0ec0\u0e94\u0eb7\u0ead\u0e99",y:"1 \u0e9b\u0eb5",yy:"%d \u0e9b\u0eb5"},dayOfMonthOrdinalParse:/(\u0e97\u0eb5\u0ec8)\d{1,2}/,ordinal:function(p){return"\u0e97\u0eb5\u0ec8"+p}})}(i(16738))},64035:function(v,S,i){!function(r){"use strict";var u={ss:"sekund\u0117_sekund\u017ei\u0173_sekundes",m:"minut\u0117_minut\u0117s_minut\u0119",mm:"minut\u0117s_minu\u010di\u0173_minutes",h:"valanda_valandos_valand\u0105",hh:"valandos_valand\u0173_valandas",d:"diena_dienos_dien\u0105",dd:"dienos_dien\u0173_dienas",M:"m\u0117nuo_m\u0117nesio_m\u0117nes\u012f",MM:"m\u0117nesiai_m\u0117nesi\u0173_m\u0117nesius",y:"metai_met\u0173_metus",yy:"metai_met\u0173_metus"};function f(M,R,F,Z){return R?_(F)[0]:Z?_(F)[1]:_(F)[2]}function e(M){return M%10==0||M>10&&M<20}function _(M){return u[M].split("_")}function y(M,R,F,Z){var J=M+" ";return 1===M?J+f(0,R,F[0],Z):R?J+(e(M)?_(F)[1]:_(F)[0]):Z?J+_(F)[1]:J+(e(M)?_(F)[1]:_(F)[2])}r.defineLocale("lt",{months:{format:"sausio_vasario_kovo_baland\u017eio_gegu\u017e\u0117s_bir\u017eelio_liepos_rugpj\u016b\u010dio_rugs\u0117jo_spalio_lapkri\u010dio_gruod\u017eio".split("_"),standalone:"sausis_vasaris_kovas_balandis_gegu\u017e\u0117_bir\u017eelis_liepa_rugpj\u016btis_rugs\u0117jis_spalis_lapkritis_gruodis".split("_"),isFormat:/D[oD]?(\[[^\[\]]*\]|\s)+MMMM?|MMMM?(\[[^\[\]]*\]|\s)+D[oD]?/},monthsShort:"sau_vas_kov_bal_geg_bir_lie_rgp_rgs_spa_lap_grd".split("_"),weekdays:{format:"sekmadien\u012f_pirmadien\u012f_antradien\u012f_tre\u010diadien\u012f_ketvirtadien\u012f_penktadien\u012f_\u0161e\u0161tadien\u012f".split("_"),standalone:"sekmadienis_pirmadienis_antradienis_tre\u010diadienis_ketvirtadienis_penktadienis_\u0161e\u0161tadienis".split("_"),isFormat:/dddd HH:mm/},weekdaysShort:"Sek_Pir_Ant_Tre_Ket_Pen_\u0160e\u0161".split("_"),weekdaysMin:"S_P_A_T_K_Pn_\u0160".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"YYYY-MM-DD",LL:"YYYY [m.] MMMM D [d.]",LLL:"YYYY [m.] MMMM D [d.], HH:mm [val.]",LLLL:"YYYY [m.] MMMM D [d.], dddd, HH:mm [val.]",l:"YYYY-MM-DD",ll:"YYYY [m.] MMMM D [d.]",lll:"YYYY [m.] MMMM D [d.], HH:mm [val.]",llll:"YYYY [m.] MMMM D [d.], ddd, HH:mm [val.]"},calendar:{sameDay:"[\u0160iandien] LT",nextDay:"[Rytoj] LT",nextWeek:"dddd LT",lastDay:"[Vakar] LT",lastWeek:"[Pra\u0117jus\u012f] dddd LT",sameElse:"L"},relativeTime:{future:"po %s",past:"prie\u0161 %s",s:function(M,R,F,Z){return R?"kelios sekund\u0117s":Z?"keli\u0173 sekund\u017ei\u0173":"kelias sekundes"},ss:y,m:f,mm:y,h:f,hh:y,d:f,dd:y,M:f,MM:y,y:f,yy:y},dayOfMonthOrdinalParse:/\d{1,2}-oji/,ordinal:function(M){return M+"-oji"},week:{dow:1,doy:4}})}(i(16738))},56927:function(v,S,i){!function(r){"use strict";var u={ss:"sekundes_sekund\u0113m_sekunde_sekundes".split("_"),m:"min\u016btes_min\u016bt\u0113m_min\u016bte_min\u016btes".split("_"),mm:"min\u016btes_min\u016bt\u0113m_min\u016bte_min\u016btes".split("_"),h:"stundas_stund\u0101m_stunda_stundas".split("_"),hh:"stundas_stund\u0101m_stunda_stundas".split("_"),d:"dienas_dien\u0101m_diena_dienas".split("_"),dd:"dienas_dien\u0101m_diena_dienas".split("_"),M:"m\u0113ne\u0161a_m\u0113ne\u0161iem_m\u0113nesis_m\u0113ne\u0161i".split("_"),MM:"m\u0113ne\u0161a_m\u0113ne\u0161iem_m\u0113nesis_m\u0113ne\u0161i".split("_"),y:"gada_gadiem_gads_gadi".split("_"),yy:"gada_gadiem_gads_gadi".split("_")};function p(T,M,R){return R?M%10==1&&M%100!=11?T[2]:T[3]:M%10==1&&M%100!=11?T[0]:T[1]}function f(T,M,R){return T+" "+p(u[R],T,M)}function e(T,M,R){return p(u[R],T,M)}r.defineLocale("lv",{months:"janv\u0101ris_febru\u0101ris_marts_apr\u012blis_maijs_j\u016bnijs_j\u016blijs_augusts_septembris_oktobris_novembris_decembris".split("_"),monthsShort:"jan_feb_mar_apr_mai_j\u016bn_j\u016bl_aug_sep_okt_nov_dec".split("_"),weekdays:"sv\u0113tdiena_pirmdiena_otrdiena_tre\u0161diena_ceturtdiena_piektdiena_sestdiena".split("_"),weekdaysShort:"Sv_P_O_T_C_Pk_S".split("_"),weekdaysMin:"Sv_P_O_T_C_Pk_S".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD.MM.YYYY.",LL:"YYYY. [gada] D. MMMM",LLL:"YYYY. [gada] D. MMMM, HH:mm",LLLL:"YYYY. [gada] D. MMMM, dddd, HH:mm"},calendar:{sameDay:"[\u0160odien pulksten] LT",nextDay:"[R\u012bt pulksten] LT",nextWeek:"dddd [pulksten] LT",lastDay:"[Vakar pulksten] LT",lastWeek:"[Pag\u0101ju\u0161\u0101] dddd [pulksten] LT",sameElse:"L"},relativeTime:{future:"p\u0113c %s",past:"pirms %s",s:function(T,M){return M?"da\u017eas sekundes":"da\u017e\u0101m sekund\u0113m"},ss:f,m:e,mm:f,h:e,hh:f,d:e,dd:f,M:e,MM:f,y:e,yy:f},dayOfMonthOrdinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:4}})}(i(16738))},5634:function(v,S,i){!function(r){"use strict";var u={words:{ss:["sekund","sekunda","sekundi"],m:["jedan minut","jednog minuta"],mm:["minut","minuta","minuta"],h:["jedan sat","jednog sata"],hh:["sat","sata","sati"],dd:["dan","dana","dana"],MM:["mjesec","mjeseca","mjeseci"],yy:["godina","godine","godina"]},correctGrammaticalCase:function(f,e){return 1===f?e[0]:f>=2&&f<=4?e[1]:e[2]},translate:function(f,e,_){var y=u.words[_];return 1===_.length?e?y[0]:y[1]:f+" "+u.correctGrammaticalCase(f,y)}};r.defineLocale("me",{months:"januar_februar_mart_april_maj_jun_jul_avgust_septembar_oktobar_novembar_decembar".split("_"),monthsShort:"jan._feb._mar._apr._maj_jun_jul_avg._sep._okt._nov._dec.".split("_"),monthsParseExact:!0,weekdays:"nedjelja_ponedjeljak_utorak_srijeda_\u010detvrtak_petak_subota".split("_"),weekdaysShort:"ned._pon._uto._sri._\u010det._pet._sub.".split("_"),weekdaysMin:"ne_po_ut_sr_\u010de_pe_su".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"H:mm",LTS:"H:mm:ss",L:"DD.MM.YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY H:mm",LLLL:"dddd, D. MMMM YYYY H:mm"},calendar:{sameDay:"[danas u] LT",nextDay:"[sjutra u] LT",nextWeek:function(){switch(this.day()){case 0:return"[u] [nedjelju] [u] LT";case 3:return"[u] [srijedu] [u] LT";case 6:return"[u] [subotu] [u] LT";case 1:case 2:case 4:case 5:return"[u] dddd [u] LT"}},lastDay:"[ju\u010de u] LT",lastWeek:function(){return["[pro\u0161le] [nedjelje] [u] LT","[pro\u0161log] [ponedjeljka] [u] LT","[pro\u0161log] [utorka] [u] LT","[pro\u0161le] [srijede] [u] LT","[pro\u0161log] [\u010detvrtka] [u] LT","[pro\u0161log] [petka] [u] LT","[pro\u0161le] [subote] [u] LT"][this.day()]},sameElse:"L"},relativeTime:{future:"za %s",past:"prije %s",s:"nekoliko sekundi",ss:u.translate,m:u.translate,mm:u.translate,h:u.translate,hh:u.translate,d:"dan",dd:u.translate,M:"mjesec",MM:u.translate,y:"godinu",yy:u.translate},dayOfMonthOrdinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:7}})}(i(16738))},94173:function(v,S,i){!function(r){"use strict";r.defineLocale("mi",{months:"Kohi-t\u0101te_Hui-tanguru_Pout\u016b-te-rangi_Paenga-wh\u0101wh\u0101_Haratua_Pipiri_H\u014dngoingoi_Here-turi-k\u014dk\u0101_Mahuru_Whiringa-\u0101-nuku_Whiringa-\u0101-rangi_Hakihea".split("_"),monthsShort:"Kohi_Hui_Pou_Pae_Hara_Pipi_H\u014dngoi_Here_Mahu_Whi-nu_Whi-ra_Haki".split("_"),monthsRegex:/(?:['a-z\u0101\u014D\u016B]+\-?){1,3}/i,monthsStrictRegex:/(?:['a-z\u0101\u014D\u016B]+\-?){1,3}/i,monthsShortRegex:/(?:['a-z\u0101\u014D\u016B]+\-?){1,3}/i,monthsShortStrictRegex:/(?:['a-z\u0101\u014D\u016B]+\-?){1,2}/i,weekdays:"R\u0101tapu_Mane_T\u016brei_Wenerei_T\u0101ite_Paraire_H\u0101tarei".split("_"),weekdaysShort:"Ta_Ma_T\u016b_We_T\u0101i_Pa_H\u0101".split("_"),weekdaysMin:"Ta_Ma_T\u016b_We_T\u0101i_Pa_H\u0101".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY [i] HH:mm",LLLL:"dddd, D MMMM YYYY [i] HH:mm"},calendar:{sameDay:"[i teie mahana, i] LT",nextDay:"[apopo i] LT",nextWeek:"dddd [i] LT",lastDay:"[inanahi i] LT",lastWeek:"dddd [whakamutunga i] LT",sameElse:"L"},relativeTime:{future:"i roto i %s",past:"%s i mua",s:"te h\u0113kona ruarua",ss:"%d h\u0113kona",m:"he meneti",mm:"%d meneti",h:"te haora",hh:"%d haora",d:"he ra",dd:"%d ra",M:"he marama",MM:"%d marama",y:"he tau",yy:"%d tau"},dayOfMonthOrdinalParse:/\d{1,2}\xba/,ordinal:"%d\xba",week:{dow:1,doy:4}})}(i(16738))},86320:function(v,S,i){!function(r){"use strict";r.defineLocale("mk",{months:"\u0458\u0430\u043d\u0443\u0430\u0440\u0438_\u0444\u0435\u0432\u0440\u0443\u0430\u0440\u0438_\u043c\u0430\u0440\u0442_\u0430\u043f\u0440\u0438\u043b_\u043c\u0430\u0458_\u0458\u0443\u043d\u0438_\u0458\u0443\u043b\u0438_\u0430\u0432\u0433\u0443\u0441\u0442_\u0441\u0435\u043f\u0442\u0435\u043c\u0432\u0440\u0438_\u043e\u043a\u0442\u043e\u043c\u0432\u0440\u0438_\u043d\u043e\u0435\u043c\u0432\u0440\u0438_\u0434\u0435\u043a\u0435\u043c\u0432\u0440\u0438".split("_"),monthsShort:"\u0458\u0430\u043d_\u0444\u0435\u0432_\u043c\u0430\u0440_\u0430\u043f\u0440_\u043c\u0430\u0458_\u0458\u0443\u043d_\u0458\u0443\u043b_\u0430\u0432\u0433_\u0441\u0435\u043f_\u043e\u043a\u0442_\u043d\u043e\u0435_\u0434\u0435\u043a".split("_"),weekdays:"\u043d\u0435\u0434\u0435\u043b\u0430_\u043f\u043e\u043d\u0435\u0434\u0435\u043b\u043d\u0438\u043a_\u0432\u0442\u043e\u0440\u043d\u0438\u043a_\u0441\u0440\u0435\u0434\u0430_\u0447\u0435\u0442\u0432\u0440\u0442\u043e\u043a_\u043f\u0435\u0442\u043e\u043a_\u0441\u0430\u0431\u043e\u0442\u0430".split("_"),weekdaysShort:"\u043d\u0435\u0434_\u043f\u043e\u043d_\u0432\u0442\u043e_\u0441\u0440\u0435_\u0447\u0435\u0442_\u043f\u0435\u0442_\u0441\u0430\u0431".split("_"),weekdaysMin:"\u043de_\u043fo_\u0432\u0442_\u0441\u0440_\u0447\u0435_\u043f\u0435_\u0441a".split("_"),longDateFormat:{LT:"H:mm",LTS:"H:mm:ss",L:"D.MM.YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY H:mm",LLLL:"dddd, D MMMM YYYY H:mm"},calendar:{sameDay:"[\u0414\u0435\u043d\u0435\u0441 \u0432\u043e] LT",nextDay:"[\u0423\u0442\u0440\u0435 \u0432\u043e] LT",nextWeek:"[\u0412\u043e] dddd [\u0432\u043e] LT",lastDay:"[\u0412\u0447\u0435\u0440\u0430 \u0432\u043e] LT",lastWeek:function(){switch(this.day()){case 0:case 3:case 6:return"[\u0418\u0437\u043c\u0438\u043d\u0430\u0442\u0430\u0442\u0430] dddd [\u0432\u043e] LT";case 1:case 2:case 4:case 5:return"[\u0418\u0437\u043c\u0438\u043d\u0430\u0442\u0438\u043e\u0442] dddd [\u0432\u043e] LT"}},sameElse:"L"},relativeTime:{future:"\u0437\u0430 %s",past:"\u043f\u0440\u0435\u0434 %s",s:"\u043d\u0435\u043a\u043e\u043b\u043a\u0443 \u0441\u0435\u043a\u0443\u043d\u0434\u0438",ss:"%d \u0441\u0435\u043a\u0443\u043d\u0434\u0438",m:"\u0435\u0434\u043d\u0430 \u043c\u0438\u043d\u0443\u0442\u0430",mm:"%d \u043c\u0438\u043d\u0443\u0442\u0438",h:"\u0435\u0434\u0435\u043d \u0447\u0430\u0441",hh:"%d \u0447\u0430\u0441\u0430",d:"\u0435\u0434\u0435\u043d \u0434\u0435\u043d",dd:"%d \u0434\u0435\u043d\u0430",M:"\u0435\u0434\u0435\u043d \u043c\u0435\u0441\u0435\u0446",MM:"%d \u043c\u0435\u0441\u0435\u0446\u0438",y:"\u0435\u0434\u043d\u0430 \u0433\u043e\u0434\u0438\u043d\u0430",yy:"%d \u0433\u043e\u0434\u0438\u043d\u0438"},dayOfMonthOrdinalParse:/\d{1,2}-(\u0435\u0432|\u0435\u043d|\u0442\u0438|\u0432\u0438|\u0440\u0438|\u043c\u0438)/,ordinal:function(p){var f=p%10,e=p%100;return 0===p?p+"-\u0435\u0432":0===e?p+"-\u0435\u043d":e>10&&e<20?p+"-\u0442\u0438":1===f?p+"-\u0432\u0438":2===f?p+"-\u0440\u0438":7===f||8===f?p+"-\u043c\u0438":p+"-\u0442\u0438"},week:{dow:1,doy:7}})}(i(16738))},11705:function(v,S,i){!function(r){"use strict";r.defineLocale("ml",{months:"\u0d1c\u0d28\u0d41\u0d35\u0d30\u0d3f_\u0d2b\u0d46\u0d2c\u0d4d\u0d30\u0d41\u0d35\u0d30\u0d3f_\u0d2e\u0d3e\u0d7c\u0d1a\u0d4d\u0d1a\u0d4d_\u0d0f\u0d2a\u0d4d\u0d30\u0d3f\u0d7d_\u0d2e\u0d47\u0d2f\u0d4d_\u0d1c\u0d42\u0d7a_\u0d1c\u0d42\u0d32\u0d48_\u0d13\u0d17\u0d38\u0d4d\u0d31\u0d4d\u0d31\u0d4d_\u0d38\u0d46\u0d2a\u0d4d\u0d31\u0d4d\u0d31\u0d02\u0d2c\u0d7c_\u0d12\u0d15\u0d4d\u0d1f\u0d4b\u0d2c\u0d7c_\u0d28\u0d35\u0d02\u0d2c\u0d7c_\u0d21\u0d3f\u0d38\u0d02\u0d2c\u0d7c".split("_"),monthsShort:"\u0d1c\u0d28\u0d41._\u0d2b\u0d46\u0d2c\u0d4d\u0d30\u0d41._\u0d2e\u0d3e\u0d7c._\u0d0f\u0d2a\u0d4d\u0d30\u0d3f._\u0d2e\u0d47\u0d2f\u0d4d_\u0d1c\u0d42\u0d7a_\u0d1c\u0d42\u0d32\u0d48._\u0d13\u0d17._\u0d38\u0d46\u0d2a\u0d4d\u0d31\u0d4d\u0d31._\u0d12\u0d15\u0d4d\u0d1f\u0d4b._\u0d28\u0d35\u0d02._\u0d21\u0d3f\u0d38\u0d02.".split("_"),monthsParseExact:!0,weekdays:"\u0d1e\u0d3e\u0d2f\u0d31\u0d3e\u0d34\u0d4d\u0d1a_\u0d24\u0d3f\u0d19\u0d4d\u0d15\u0d33\u0d3e\u0d34\u0d4d\u0d1a_\u0d1a\u0d4a\u0d35\u0d4d\u0d35\u0d3e\u0d34\u0d4d\u0d1a_\u0d2c\u0d41\u0d27\u0d28\u0d3e\u0d34\u0d4d\u0d1a_\u0d35\u0d4d\u0d2f\u0d3e\u0d34\u0d3e\u0d34\u0d4d\u0d1a_\u0d35\u0d46\u0d33\u0d4d\u0d33\u0d3f\u0d2f\u0d3e\u0d34\u0d4d\u0d1a_\u0d36\u0d28\u0d3f\u0d2f\u0d3e\u0d34\u0d4d\u0d1a".split("_"),weekdaysShort:"\u0d1e\u0d3e\u0d2f\u0d7c_\u0d24\u0d3f\u0d19\u0d4d\u0d15\u0d7e_\u0d1a\u0d4a\u0d35\u0d4d\u0d35_\u0d2c\u0d41\u0d27\u0d7b_\u0d35\u0d4d\u0d2f\u0d3e\u0d34\u0d02_\u0d35\u0d46\u0d33\u0d4d\u0d33\u0d3f_\u0d36\u0d28\u0d3f".split("_"),weekdaysMin:"\u0d1e\u0d3e_\u0d24\u0d3f_\u0d1a\u0d4a_\u0d2c\u0d41_\u0d35\u0d4d\u0d2f\u0d3e_\u0d35\u0d46_\u0d36".split("_"),longDateFormat:{LT:"A h:mm -\u0d28\u0d41",LTS:"A h:mm:ss -\u0d28\u0d41",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY, A h:mm -\u0d28\u0d41",LLLL:"dddd, D MMMM YYYY, A h:mm -\u0d28\u0d41"},calendar:{sameDay:"[\u0d07\u0d28\u0d4d\u0d28\u0d4d] LT",nextDay:"[\u0d28\u0d3e\u0d33\u0d46] LT",nextWeek:"dddd, LT",lastDay:"[\u0d07\u0d28\u0d4d\u0d28\u0d32\u0d46] LT",lastWeek:"[\u0d15\u0d34\u0d3f\u0d1e\u0d4d\u0d1e] dddd, LT",sameElse:"L"},relativeTime:{future:"%s \u0d15\u0d34\u0d3f\u0d1e\u0d4d\u0d1e\u0d4d",past:"%s \u0d2e\u0d41\u0d7b\u0d2a\u0d4d",s:"\u0d05\u0d7d\u0d2a \u0d28\u0d3f\u0d2e\u0d3f\u0d37\u0d19\u0d4d\u0d19\u0d7e",ss:"%d \u0d38\u0d46\u0d15\u0d4d\u0d15\u0d7b\u0d21\u0d4d",m:"\u0d12\u0d30\u0d41 \u0d2e\u0d3f\u0d28\u0d3f\u0d31\u0d4d\u0d31\u0d4d",mm:"%d \u0d2e\u0d3f\u0d28\u0d3f\u0d31\u0d4d\u0d31\u0d4d",h:"\u0d12\u0d30\u0d41 \u0d2e\u0d23\u0d3f\u0d15\u0d4d\u0d15\u0d42\u0d7c",hh:"%d \u0d2e\u0d23\u0d3f\u0d15\u0d4d\u0d15\u0d42\u0d7c",d:"\u0d12\u0d30\u0d41 \u0d26\u0d3f\u0d35\u0d38\u0d02",dd:"%d \u0d26\u0d3f\u0d35\u0d38\u0d02",M:"\u0d12\u0d30\u0d41 \u0d2e\u0d3e\u0d38\u0d02",MM:"%d \u0d2e\u0d3e\u0d38\u0d02",y:"\u0d12\u0d30\u0d41 \u0d35\u0d7c\u0d37\u0d02",yy:"%d \u0d35\u0d7c\u0d37\u0d02"},meridiemParse:/\u0d30\u0d3e\u0d24\u0d4d\u0d30\u0d3f|\u0d30\u0d3e\u0d35\u0d3f\u0d32\u0d46|\u0d09\u0d1a\u0d4d\u0d1a \u0d15\u0d34\u0d3f\u0d1e\u0d4d\u0d1e\u0d4d|\u0d35\u0d48\u0d15\u0d41\u0d28\u0d4d\u0d28\u0d47\u0d30\u0d02|\u0d30\u0d3e\u0d24\u0d4d\u0d30\u0d3f/i,meridiemHour:function(p,f){return 12===p&&(p=0),"\u0d30\u0d3e\u0d24\u0d4d\u0d30\u0d3f"===f&&p>=4||"\u0d09\u0d1a\u0d4d\u0d1a \u0d15\u0d34\u0d3f\u0d1e\u0d4d\u0d1e\u0d4d"===f||"\u0d35\u0d48\u0d15\u0d41\u0d28\u0d4d\u0d28\u0d47\u0d30\u0d02"===f?p+12:p},meridiem:function(p,f,e){return p<4?"\u0d30\u0d3e\u0d24\u0d4d\u0d30\u0d3f":p<12?"\u0d30\u0d3e\u0d35\u0d3f\u0d32\u0d46":p<17?"\u0d09\u0d1a\u0d4d\u0d1a \u0d15\u0d34\u0d3f\u0d1e\u0d4d\u0d1e\u0d4d":p<20?"\u0d35\u0d48\u0d15\u0d41\u0d28\u0d4d\u0d28\u0d47\u0d30\u0d02":"\u0d30\u0d3e\u0d24\u0d4d\u0d30\u0d3f"}})}(i(16738))},31062:function(v,S,i){!function(r){"use strict";function u(f,e,_,y){switch(_){case"s":return e?"\u0445\u044d\u0434\u0445\u044d\u043d \u0441\u0435\u043a\u0443\u043d\u0434":"\u0445\u044d\u0434\u0445\u044d\u043d \u0441\u0435\u043a\u0443\u043d\u0434\u044b\u043d";case"ss":return f+(e?" \u0441\u0435\u043a\u0443\u043d\u0434":" \u0441\u0435\u043a\u0443\u043d\u0434\u044b\u043d");case"m":case"mm":return f+(e?" \u043c\u0438\u043d\u0443\u0442":" \u043c\u0438\u043d\u0443\u0442\u044b\u043d");case"h":case"hh":return f+(e?" \u0446\u0430\u0433":" \u0446\u0430\u0433\u0438\u0439\u043d");case"d":case"dd":return f+(e?" \u04e9\u0434\u04e9\u0440":" \u04e9\u0434\u0440\u0438\u0439\u043d");case"M":case"MM":return f+(e?" \u0441\u0430\u0440":" \u0441\u0430\u0440\u044b\u043d");case"y":case"yy":return f+(e?" \u0436\u0438\u043b":" \u0436\u0438\u043b\u0438\u0439\u043d");default:return f}}r.defineLocale("mn",{months:"\u041d\u044d\u0433\u0434\u04af\u0433\u044d\u044d\u0440 \u0441\u0430\u0440_\u0425\u043e\u0451\u0440\u0434\u0443\u0433\u0430\u0430\u0440 \u0441\u0430\u0440_\u0413\u0443\u0440\u0430\u0432\u0434\u0443\u0433\u0430\u0430\u0440 \u0441\u0430\u0440_\u0414\u04e9\u0440\u04e9\u0432\u0434\u04af\u0433\u044d\u044d\u0440 \u0441\u0430\u0440_\u0422\u0430\u0432\u0434\u0443\u0433\u0430\u0430\u0440 \u0441\u0430\u0440_\u0417\u0443\u0440\u0433\u0430\u0434\u0443\u0433\u0430\u0430\u0440 \u0441\u0430\u0440_\u0414\u043e\u043b\u0434\u0443\u0433\u0430\u0430\u0440 \u0441\u0430\u0440_\u041d\u0430\u0439\u043c\u0434\u0443\u0433\u0430\u0430\u0440 \u0441\u0430\u0440_\u0415\u0441\u0434\u04af\u0433\u044d\u044d\u0440 \u0441\u0430\u0440_\u0410\u0440\u0430\u0432\u0434\u0443\u0433\u0430\u0430\u0440 \u0441\u0430\u0440_\u0410\u0440\u0432\u0430\u043d \u043d\u044d\u0433\u0434\u04af\u0433\u044d\u044d\u0440 \u0441\u0430\u0440_\u0410\u0440\u0432\u0430\u043d \u0445\u043e\u0451\u0440\u0434\u0443\u0433\u0430\u0430\u0440 \u0441\u0430\u0440".split("_"),monthsShort:"1 \u0441\u0430\u0440_2 \u0441\u0430\u0440_3 \u0441\u0430\u0440_4 \u0441\u0430\u0440_5 \u0441\u0430\u0440_6 \u0441\u0430\u0440_7 \u0441\u0430\u0440_8 \u0441\u0430\u0440_9 \u0441\u0430\u0440_10 \u0441\u0430\u0440_11 \u0441\u0430\u0440_12 \u0441\u0430\u0440".split("_"),monthsParseExact:!0,weekdays:"\u041d\u044f\u043c_\u0414\u0430\u0432\u0430\u0430_\u041c\u044f\u0433\u043c\u0430\u0440_\u041b\u0445\u0430\u0433\u0432\u0430_\u041f\u04af\u0440\u044d\u0432_\u0411\u0430\u0430\u0441\u0430\u043d_\u0411\u044f\u043c\u0431\u0430".split("_"),weekdaysShort:"\u041d\u044f\u043c_\u0414\u0430\u0432_\u041c\u044f\u0433_\u041b\u0445\u0430_\u041f\u04af\u0440_\u0411\u0430\u0430_\u0411\u044f\u043c".split("_"),weekdaysMin:"\u041d\u044f_\u0414\u0430_\u041c\u044f_\u041b\u0445_\u041f\u04af_\u0411\u0430_\u0411\u044f".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"YYYY-MM-DD",LL:"YYYY \u043e\u043d\u044b MMMM\u044b\u043d D",LLL:"YYYY \u043e\u043d\u044b MMMM\u044b\u043d D HH:mm",LLLL:"dddd, YYYY \u043e\u043d\u044b MMMM\u044b\u043d D HH:mm"},meridiemParse:/\u04ae\u04e8|\u04ae\u0425/i,isPM:function(f){return"\u04ae\u0425"===f},meridiem:function(f,e,_){return f<12?"\u04ae\u04e8":"\u04ae\u0425"},calendar:{sameDay:"[\u04e8\u043d\u04e9\u04e9\u0434\u04e9\u0440] LT",nextDay:"[\u041c\u0430\u0440\u0433\u0430\u0430\u0448] LT",nextWeek:"[\u0418\u0440\u044d\u0445] dddd LT",lastDay:"[\u04e8\u0447\u0438\u0433\u0434\u04e9\u0440] LT",lastWeek:"[\u04e8\u043d\u0433\u04e9\u0440\u0441\u04e9\u043d] dddd LT",sameElse:"L"},relativeTime:{future:"%s \u0434\u0430\u0440\u0430\u0430",past:"%s \u04e9\u043c\u043d\u04e9",s:u,ss:u,m:u,mm:u,h:u,hh:u,d:u,dd:u,M:u,MM:u,y:u,yy:u},dayOfMonthOrdinalParse:/\d{1,2} \u04e9\u0434\u04e9\u0440/,ordinal:function(f,e){switch(e){case"d":case"D":case"DDD":return f+" \u04e9\u0434\u04e9\u0440";default:return f}}})}(i(16738))},92805:function(v,S,i){!function(r){"use strict";var u={1:"\u0967",2:"\u0968",3:"\u0969",4:"\u096a",5:"\u096b",6:"\u096c",7:"\u096d",8:"\u096e",9:"\u096f",0:"\u0966"},p={"\u0967":"1","\u0968":"2","\u0969":"3","\u096a":"4","\u096b":"5","\u096c":"6","\u096d":"7","\u096e":"8","\u096f":"9","\u0966":"0"};function f(_,y,T,M){var R="";if(y)switch(T){case"s":R="\u0915\u093e\u0939\u0940 \u0938\u0947\u0915\u0902\u0926";break;case"ss":R="%d \u0938\u0947\u0915\u0902\u0926";break;case"m":R="\u090f\u0915 \u092e\u093f\u0928\u093f\u091f";break;case"mm":R="%d \u092e\u093f\u0928\u093f\u091f\u0947";break;case"h":R="\u090f\u0915 \u0924\u093e\u0938";break;case"hh":R="%d \u0924\u093e\u0938";break;case"d":R="\u090f\u0915 \u0926\u093f\u0935\u0938";break;case"dd":R="%d \u0926\u093f\u0935\u0938";break;case"M":R="\u090f\u0915 \u092e\u0939\u093f\u0928\u093e";break;case"MM":R="%d \u092e\u0939\u093f\u0928\u0947";break;case"y":R="\u090f\u0915 \u0935\u0930\u094d\u0937";break;case"yy":R="%d \u0935\u0930\u094d\u0937\u0947"}else switch(T){case"s":R="\u0915\u093e\u0939\u0940 \u0938\u0947\u0915\u0902\u0926\u093e\u0902";break;case"ss":R="%d \u0938\u0947\u0915\u0902\u0926\u093e\u0902";break;case"m":R="\u090f\u0915\u093e \u092e\u093f\u0928\u093f\u091f\u093e";break;case"mm":R="%d \u092e\u093f\u0928\u093f\u091f\u093e\u0902";break;case"h":R="\u090f\u0915\u093e \u0924\u093e\u0938\u093e";break;case"hh":R="%d \u0924\u093e\u0938\u093e\u0902";break;case"d":R="\u090f\u0915\u093e \u0926\u093f\u0935\u0938\u093e";break;case"dd":R="%d \u0926\u093f\u0935\u0938\u093e\u0902";break;case"M":R="\u090f\u0915\u093e \u092e\u0939\u093f\u0928\u094d\u092f\u093e";break;case"MM":R="%d \u092e\u0939\u093f\u0928\u094d\u092f\u093e\u0902";break;case"y":R="\u090f\u0915\u093e \u0935\u0930\u094d\u0937\u093e";break;case"yy":R="%d \u0935\u0930\u094d\u0937\u093e\u0902"}return R.replace(/%d/i,_)}r.defineLocale("mr",{months:"\u091c\u093e\u0928\u0947\u0935\u093e\u0930\u0940_\u092b\u0947\u092c\u094d\u0930\u0941\u0935\u093e\u0930\u0940_\u092e\u093e\u0930\u094d\u091a_\u090f\u092a\u094d\u0930\u093f\u0932_\u092e\u0947_\u091c\u0942\u0928_\u091c\u0941\u0932\u0948_\u0911\u0917\u0938\u094d\u091f_\u0938\u092a\u094d\u091f\u0947\u0902\u092c\u0930_\u0911\u0915\u094d\u091f\u094b\u092c\u0930_\u0928\u094b\u0935\u094d\u0939\u0947\u0902\u092c\u0930_\u0921\u093f\u0938\u0947\u0902\u092c\u0930".split("_"),monthsShort:"\u091c\u093e\u0928\u0947._\u092b\u0947\u092c\u094d\u0930\u0941._\u092e\u093e\u0930\u094d\u091a._\u090f\u092a\u094d\u0930\u093f._\u092e\u0947._\u091c\u0942\u0928._\u091c\u0941\u0932\u0948._\u0911\u0917._\u0938\u092a\u094d\u091f\u0947\u0902._\u0911\u0915\u094d\u091f\u094b._\u0928\u094b\u0935\u094d\u0939\u0947\u0902._\u0921\u093f\u0938\u0947\u0902.".split("_"),monthsParseExact:!0,weekdays:"\u0930\u0935\u093f\u0935\u093e\u0930_\u0938\u094b\u092e\u0935\u093e\u0930_\u092e\u0902\u0917\u0933\u0935\u093e\u0930_\u092c\u0941\u0927\u0935\u093e\u0930_\u0917\u0941\u0930\u0942\u0935\u093e\u0930_\u0936\u0941\u0915\u094d\u0930\u0935\u093e\u0930_\u0936\u0928\u093f\u0935\u093e\u0930".split("_"),weekdaysShort:"\u0930\u0935\u093f_\u0938\u094b\u092e_\u092e\u0902\u0917\u0933_\u092c\u0941\u0927_\u0917\u0941\u0930\u0942_\u0936\u0941\u0915\u094d\u0930_\u0936\u0928\u093f".split("_"),weekdaysMin:"\u0930_\u0938\u094b_\u092e\u0902_\u092c\u0941_\u0917\u0941_\u0936\u0941_\u0936".split("_"),longDateFormat:{LT:"A h:mm \u0935\u093e\u091c\u0924\u093e",LTS:"A h:mm:ss \u0935\u093e\u091c\u0924\u093e",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY, A h:mm \u0935\u093e\u091c\u0924\u093e",LLLL:"dddd, D MMMM YYYY, A h:mm \u0935\u093e\u091c\u0924\u093e"},calendar:{sameDay:"[\u0906\u091c] LT",nextDay:"[\u0909\u0926\u094d\u092f\u093e] LT",nextWeek:"dddd, LT",lastDay:"[\u0915\u093e\u0932] LT",lastWeek:"[\u092e\u093e\u0917\u0940\u0932] dddd, LT",sameElse:"L"},relativeTime:{future:"%s\u092e\u0927\u094d\u092f\u0947",past:"%s\u092a\u0942\u0930\u094d\u0935\u0940",s:f,ss:f,m:f,mm:f,h:f,hh:f,d:f,dd:f,M:f,MM:f,y:f,yy:f},preparse:function(_){return _.replace(/[\u0967\u0968\u0969\u096a\u096b\u096c\u096d\u096e\u096f\u0966]/g,function(y){return p[y]})},postformat:function(_){return _.replace(/\d/g,function(y){return u[y]})},meridiemParse:/\u092a\u0939\u093e\u091f\u0947|\u0938\u0915\u093e\u0933\u0940|\u0926\u0941\u092a\u093e\u0930\u0940|\u0938\u093e\u092f\u0902\u0915\u093e\u0933\u0940|\u0930\u093e\u0924\u094d\u0930\u0940/,meridiemHour:function(_,y){return 12===_&&(_=0),"\u092a\u0939\u093e\u091f\u0947"===y||"\u0938\u0915\u093e\u0933\u0940"===y?_:"\u0926\u0941\u092a\u093e\u0930\u0940"===y||"\u0938\u093e\u092f\u0902\u0915\u093e\u0933\u0940"===y||"\u0930\u093e\u0924\u094d\u0930\u0940"===y?_>=12?_:_+12:void 0},meridiem:function(_,y,T){return _>=0&&_<6?"\u092a\u0939\u093e\u091f\u0947":_<12?"\u0938\u0915\u093e\u0933\u0940":_<17?"\u0926\u0941\u092a\u093e\u0930\u0940":_<20?"\u0938\u093e\u092f\u0902\u0915\u093e\u0933\u0940":"\u0930\u093e\u0924\u094d\u0930\u0940"},week:{dow:0,doy:6}})}(i(16738))},59900:function(v,S,i){!function(r){"use strict";r.defineLocale("ms-my",{months:"Januari_Februari_Mac_April_Mei_Jun_Julai_Ogos_September_Oktober_November_Disember".split("_"),monthsShort:"Jan_Feb_Mac_Apr_Mei_Jun_Jul_Ogs_Sep_Okt_Nov_Dis".split("_"),weekdays:"Ahad_Isnin_Selasa_Rabu_Khamis_Jumaat_Sabtu".split("_"),weekdaysShort:"Ahd_Isn_Sel_Rab_Kha_Jum_Sab".split("_"),weekdaysMin:"Ah_Is_Sl_Rb_Km_Jm_Sb".split("_"),longDateFormat:{LT:"HH.mm",LTS:"HH.mm.ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY [pukul] HH.mm",LLLL:"dddd, D MMMM YYYY [pukul] HH.mm"},meridiemParse:/pagi|tengahari|petang|malam/,meridiemHour:function(p,f){return 12===p&&(p=0),"pagi"===f?p:"tengahari"===f?p>=11?p:p+12:"petang"===f||"malam"===f?p+12:void 0},meridiem:function(p,f,e){return p<11?"pagi":p<15?"tengahari":p<19?"petang":"malam"},calendar:{sameDay:"[Hari ini pukul] LT",nextDay:"[Esok pukul] LT",nextWeek:"dddd [pukul] LT",lastDay:"[Kelmarin pukul] LT",lastWeek:"dddd [lepas pukul] LT",sameElse:"L"},relativeTime:{future:"dalam %s",past:"%s yang lepas",s:"beberapa saat",ss:"%d saat",m:"seminit",mm:"%d minit",h:"sejam",hh:"%d jam",d:"sehari",dd:"%d hari",M:"sebulan",MM:"%d bulan",y:"setahun",yy:"%d tahun"},week:{dow:1,doy:7}})}(i(16738))},11341:function(v,S,i){!function(r){"use strict";r.defineLocale("ms",{months:"Januari_Februari_Mac_April_Mei_Jun_Julai_Ogos_September_Oktober_November_Disember".split("_"),monthsShort:"Jan_Feb_Mac_Apr_Mei_Jun_Jul_Ogs_Sep_Okt_Nov_Dis".split("_"),weekdays:"Ahad_Isnin_Selasa_Rabu_Khamis_Jumaat_Sabtu".split("_"),weekdaysShort:"Ahd_Isn_Sel_Rab_Kha_Jum_Sab".split("_"),weekdaysMin:"Ah_Is_Sl_Rb_Km_Jm_Sb".split("_"),longDateFormat:{LT:"HH.mm",LTS:"HH.mm.ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY [pukul] HH.mm",LLLL:"dddd, D MMMM YYYY [pukul] HH.mm"},meridiemParse:/pagi|tengahari|petang|malam/,meridiemHour:function(p,f){return 12===p&&(p=0),"pagi"===f?p:"tengahari"===f?p>=11?p:p+12:"petang"===f||"malam"===f?p+12:void 0},meridiem:function(p,f,e){return p<11?"pagi":p<15?"tengahari":p<19?"petang":"malam"},calendar:{sameDay:"[Hari ini pukul] LT",nextDay:"[Esok pukul] LT",nextWeek:"dddd [pukul] LT",lastDay:"[Kelmarin pukul] LT",lastWeek:"dddd [lepas pukul] LT",sameElse:"L"},relativeTime:{future:"dalam %s",past:"%s yang lepas",s:"beberapa saat",ss:"%d saat",m:"seminit",mm:"%d minit",h:"sejam",hh:"%d jam",d:"sehari",dd:"%d hari",M:"sebulan",MM:"%d bulan",y:"setahun",yy:"%d tahun"},week:{dow:1,doy:7}})}(i(16738))},37734:function(v,S,i){!function(r){"use strict";r.defineLocale("mt",{months:"Jannar_Frar_Marzu_April_Mejju_\u0120unju_Lulju_Awwissu_Settembru_Ottubru_Novembru_Di\u010bembru".split("_"),monthsShort:"Jan_Fra_Mar_Apr_Mej_\u0120un_Lul_Aww_Set_Ott_Nov_Di\u010b".split("_"),weekdays:"Il-\u0126add_It-Tnejn_It-Tlieta_L-Erbg\u0127a_Il-\u0126amis_Il-\u0120img\u0127a_Is-Sibt".split("_"),weekdaysShort:"\u0126ad_Tne_Tli_Erb_\u0126am_\u0120im_Sib".split("_"),weekdaysMin:"\u0126a_Tn_Tl_Er_\u0126a_\u0120i_Si".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd, D MMMM YYYY HH:mm"},calendar:{sameDay:"[Illum fil-]LT",nextDay:"[G\u0127ada fil-]LT",nextWeek:"dddd [fil-]LT",lastDay:"[Il-biera\u0127 fil-]LT",lastWeek:"dddd [li g\u0127adda] [fil-]LT",sameElse:"L"},relativeTime:{future:"f\u2019 %s",past:"%s ilu",s:"ftit sekondi",ss:"%d sekondi",m:"minuta",mm:"%d minuti",h:"sieg\u0127a",hh:"%d sieg\u0127at",d:"\u0121urnata",dd:"%d \u0121ranet",M:"xahar",MM:"%d xhur",y:"sena",yy:"%d sni"},dayOfMonthOrdinalParse:/\d{1,2}\xba/,ordinal:"%d\xba",week:{dow:1,doy:4}})}(i(16738))},19034:function(v,S,i){!function(r){"use strict";var u={1:"\u1041",2:"\u1042",3:"\u1043",4:"\u1044",5:"\u1045",6:"\u1046",7:"\u1047",8:"\u1048",9:"\u1049",0:"\u1040"},p={"\u1041":"1","\u1042":"2","\u1043":"3","\u1044":"4","\u1045":"5","\u1046":"6","\u1047":"7","\u1048":"8","\u1049":"9","\u1040":"0"};r.defineLocale("my",{months:"\u1007\u1014\u103a\u1014\u101d\u102b\u101b\u102e_\u1016\u1031\u1016\u1031\u102c\u103a\u101d\u102b\u101b\u102e_\u1019\u1010\u103a_\u1027\u1015\u103c\u102e_\u1019\u1031_\u1007\u103d\u1014\u103a_\u1007\u1030\u101c\u102d\u102f\u1004\u103a_\u101e\u103c\u1002\u102f\u1010\u103a_\u1005\u1000\u103a\u1010\u1004\u103a\u1018\u102c_\u1021\u1031\u102c\u1000\u103a\u1010\u102d\u102f\u1018\u102c_\u1014\u102d\u102f\u101d\u1004\u103a\u1018\u102c_\u1012\u102e\u1007\u1004\u103a\u1018\u102c".split("_"),monthsShort:"\u1007\u1014\u103a_\u1016\u1031_\u1019\u1010\u103a_\u1015\u103c\u102e_\u1019\u1031_\u1007\u103d\u1014\u103a_\u101c\u102d\u102f\u1004\u103a_\u101e\u103c_\u1005\u1000\u103a_\u1021\u1031\u102c\u1000\u103a_\u1014\u102d\u102f_\u1012\u102e".split("_"),weekdays:"\u1010\u1014\u1004\u103a\u1039\u1002\u1014\u103d\u1031_\u1010\u1014\u1004\u103a\u1039\u101c\u102c_\u1021\u1004\u103a\u1039\u1002\u102b_\u1017\u102f\u1012\u1039\u1013\u101f\u1030\u1038_\u1000\u103c\u102c\u101e\u1015\u1010\u1031\u1038_\u101e\u1031\u102c\u1000\u103c\u102c_\u1005\u1014\u1031".split("_"),weekdaysShort:"\u1014\u103d\u1031_\u101c\u102c_\u1002\u102b_\u101f\u1030\u1038_\u1000\u103c\u102c_\u101e\u1031\u102c_\u1014\u1031".split("_"),weekdaysMin:"\u1014\u103d\u1031_\u101c\u102c_\u1002\u102b_\u101f\u1030\u1038_\u1000\u103c\u102c_\u101e\u1031\u102c_\u1014\u1031".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd D MMMM YYYY HH:mm"},calendar:{sameDay:"[\u101a\u1014\u1031.] LT [\u1019\u103e\u102c]",nextDay:"[\u1019\u1014\u1000\u103a\u1016\u103c\u1014\u103a] LT [\u1019\u103e\u102c]",nextWeek:"dddd LT [\u1019\u103e\u102c]",lastDay:"[\u1019\u1014\u1031.\u1000] LT [\u1019\u103e\u102c]",lastWeek:"[\u1015\u103c\u102e\u1038\u1001\u1032\u1037\u101e\u1031\u102c] dddd LT [\u1019\u103e\u102c]",sameElse:"L"},relativeTime:{future:"\u101c\u102c\u1019\u100a\u103a\u1037 %s \u1019\u103e\u102c",past:"\u101c\u103d\u1014\u103a\u1001\u1032\u1037\u101e\u1031\u102c %s \u1000",s:"\u1005\u1000\u1039\u1000\u1014\u103a.\u1021\u1014\u100a\u103a\u1038\u1004\u101a\u103a",ss:"%d \u1005\u1000\u1039\u1000\u1014\u1037\u103a",m:"\u1010\u1005\u103a\u1019\u102d\u1014\u1005\u103a",mm:"%d \u1019\u102d\u1014\u1005\u103a",h:"\u1010\u1005\u103a\u1014\u102c\u101b\u102e",hh:"%d \u1014\u102c\u101b\u102e",d:"\u1010\u1005\u103a\u101b\u1000\u103a",dd:"%d \u101b\u1000\u103a",M:"\u1010\u1005\u103a\u101c",MM:"%d \u101c",y:"\u1010\u1005\u103a\u1014\u103e\u1005\u103a",yy:"%d \u1014\u103e\u1005\u103a"},preparse:function(e){return e.replace(/[\u1041\u1042\u1043\u1044\u1045\u1046\u1047\u1048\u1049\u1040]/g,function(_){return p[_]})},postformat:function(e){return e.replace(/\d/g,function(_){return u[_]})},week:{dow:1,doy:4}})}(i(16738))},9324:function(v,S,i){!function(r){"use strict";r.defineLocale("nb",{months:"januar_februar_mars_april_mai_juni_juli_august_september_oktober_november_desember".split("_"),monthsShort:"jan._feb._mars_apr._mai_juni_juli_aug._sep._okt._nov._des.".split("_"),monthsParseExact:!0,weekdays:"s\xf8ndag_mandag_tirsdag_onsdag_torsdag_fredag_l\xf8rdag".split("_"),weekdaysShort:"s\xf8._ma._ti._on._to._fr._l\xf8.".split("_"),weekdaysMin:"s\xf8_ma_ti_on_to_fr_l\xf8".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD.MM.YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY [kl.] HH:mm",LLLL:"dddd D. MMMM YYYY [kl.] HH:mm"},calendar:{sameDay:"[i dag kl.] LT",nextDay:"[i morgen kl.] LT",nextWeek:"dddd [kl.] LT",lastDay:"[i g\xe5r kl.] LT",lastWeek:"[forrige] dddd [kl.] LT",sameElse:"L"},relativeTime:{future:"om %s",past:"%s siden",s:"noen sekunder",ss:"%d sekunder",m:"ett minutt",mm:"%d minutter",h:"en time",hh:"%d timer",d:"en dag",dd:"%d dager",w:"en uke",ww:"%d uker",M:"en m\xe5ned",MM:"%d m\xe5neder",y:"ett \xe5r",yy:"%d \xe5r"},dayOfMonthOrdinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:4}})}(i(16738))},46495:function(v,S,i){!function(r){"use strict";var u={1:"\u0967",2:"\u0968",3:"\u0969",4:"\u096a",5:"\u096b",6:"\u096c",7:"\u096d",8:"\u096e",9:"\u096f",0:"\u0966"},p={"\u0967":"1","\u0968":"2","\u0969":"3","\u096a":"4","\u096b":"5","\u096c":"6","\u096d":"7","\u096e":"8","\u096f":"9","\u0966":"0"};r.defineLocale("ne",{months:"\u091c\u0928\u0935\u0930\u0940_\u092b\u0947\u092c\u094d\u0930\u0941\u0935\u0930\u0940_\u092e\u093e\u0930\u094d\u091a_\u0905\u092a\u094d\u0930\u093f\u0932_\u092e\u0908_\u091c\u0941\u0928_\u091c\u0941\u0932\u093e\u0908_\u0905\u0917\u0937\u094d\u091f_\u0938\u0947\u092a\u094d\u091f\u0947\u092e\u094d\u092c\u0930_\u0905\u0915\u094d\u091f\u094b\u092c\u0930_\u0928\u094b\u092d\u0947\u092e\u094d\u092c\u0930_\u0921\u093f\u0938\u0947\u092e\u094d\u092c\u0930".split("_"),monthsShort:"\u091c\u0928._\u092b\u0947\u092c\u094d\u0930\u0941._\u092e\u093e\u0930\u094d\u091a_\u0905\u092a\u094d\u0930\u093f._\u092e\u0908_\u091c\u0941\u0928_\u091c\u0941\u0932\u093e\u0908._\u0905\u0917._\u0938\u0947\u092a\u094d\u091f._\u0905\u0915\u094d\u091f\u094b._\u0928\u094b\u092d\u0947._\u0921\u093f\u0938\u0947.".split("_"),monthsParseExact:!0,weekdays:"\u0906\u0907\u0924\u092c\u093e\u0930_\u0938\u094b\u092e\u092c\u093e\u0930_\u092e\u0919\u094d\u0917\u0932\u092c\u093e\u0930_\u092c\u0941\u0927\u092c\u093e\u0930_\u092c\u093f\u0939\u093f\u092c\u093e\u0930_\u0936\u0941\u0915\u094d\u0930\u092c\u093e\u0930_\u0936\u0928\u093f\u092c\u093e\u0930".split("_"),weekdaysShort:"\u0906\u0907\u0924._\u0938\u094b\u092e._\u092e\u0919\u094d\u0917\u0932._\u092c\u0941\u0927._\u092c\u093f\u0939\u093f._\u0936\u0941\u0915\u094d\u0930._\u0936\u0928\u093f.".split("_"),weekdaysMin:"\u0906._\u0938\u094b._\u092e\u0902._\u092c\u0941._\u092c\u093f._\u0936\u0941._\u0936.".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"A\u0915\u094b h:mm \u092c\u091c\u0947",LTS:"A\u0915\u094b h:mm:ss \u092c\u091c\u0947",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY, A\u0915\u094b h:mm \u092c\u091c\u0947",LLLL:"dddd, D MMMM YYYY, A\u0915\u094b h:mm \u092c\u091c\u0947"},preparse:function(e){return e.replace(/[\u0967\u0968\u0969\u096a\u096b\u096c\u096d\u096e\u096f\u0966]/g,function(_){return p[_]})},postformat:function(e){return e.replace(/\d/g,function(_){return u[_]})},meridiemParse:/\u0930\u093e\u0924\u093f|\u092c\u093f\u0939\u093e\u0928|\u0926\u093f\u0909\u0901\u0938\u094b|\u0938\u093e\u0901\u091d/,meridiemHour:function(e,_){return 12===e&&(e=0),"\u0930\u093e\u0924\u093f"===_?e<4?e:e+12:"\u092c\u093f\u0939\u093e\u0928"===_?e:"\u0926\u093f\u0909\u0901\u0938\u094b"===_?e>=10?e:e+12:"\u0938\u093e\u0901\u091d"===_?e+12:void 0},meridiem:function(e,_,y){return e<3?"\u0930\u093e\u0924\u093f":e<12?"\u092c\u093f\u0939\u093e\u0928":e<16?"\u0926\u093f\u0909\u0901\u0938\u094b":e<20?"\u0938\u093e\u0901\u091d":"\u0930\u093e\u0924\u093f"},calendar:{sameDay:"[\u0906\u091c] LT",nextDay:"[\u092d\u094b\u0932\u093f] LT",nextWeek:"[\u0906\u0909\u0901\u0926\u094b] dddd[,] LT",lastDay:"[\u0939\u093f\u091c\u094b] LT",lastWeek:"[\u0917\u090f\u0915\u094b] dddd[,] LT",sameElse:"L"},relativeTime:{future:"%s\u092e\u093e",past:"%s \u0905\u0917\u093e\u0921\u093f",s:"\u0915\u0947\u0939\u0940 \u0915\u094d\u0937\u0923",ss:"%d \u0938\u0947\u0915\u0947\u0923\u094d\u0921",m:"\u090f\u0915 \u092e\u093f\u0928\u0947\u091f",mm:"%d \u092e\u093f\u0928\u0947\u091f",h:"\u090f\u0915 \u0918\u0923\u094d\u091f\u093e",hh:"%d \u0918\u0923\u094d\u091f\u093e",d:"\u090f\u0915 \u0926\u093f\u0928",dd:"%d \u0926\u093f\u0928",M:"\u090f\u0915 \u092e\u0939\u093f\u0928\u093e",MM:"%d \u092e\u0939\u093f\u0928\u093e",y:"\u090f\u0915 \u092c\u0930\u094d\u0937",yy:"%d \u092c\u0930\u094d\u0937"},week:{dow:0,doy:6}})}(i(16738))},76272:function(v,S,i){!function(r){"use strict";var u="jan._feb._mrt._apr._mei_jun._jul._aug._sep._okt._nov._dec.".split("_"),p="jan_feb_mrt_apr_mei_jun_jul_aug_sep_okt_nov_dec".split("_"),f=[/^jan/i,/^feb/i,/^maart|mrt.?$/i,/^apr/i,/^mei$/i,/^jun[i.]?$/i,/^jul[i.]?$/i,/^aug/i,/^sep/i,/^okt/i,/^nov/i,/^dec/i],e=/^(januari|februari|maart|april|mei|ju[nl]i|augustus|september|oktober|november|december|jan\.?|feb\.?|mrt\.?|apr\.?|ju[nl]\.?|aug\.?|sep\.?|okt\.?|nov\.?|dec\.?)/i;r.defineLocale("nl-be",{months:"januari_februari_maart_april_mei_juni_juli_augustus_september_oktober_november_december".split("_"),monthsShort:function(y,T){return y?/-MMM-/.test(T)?p[y.month()]:u[y.month()]:u},monthsRegex:e,monthsShortRegex:e,monthsStrictRegex:/^(januari|februari|maart|april|mei|ju[nl]i|augustus|september|oktober|november|december)/i,monthsShortStrictRegex:/^(jan\.?|feb\.?|mrt\.?|apr\.?|mei|ju[nl]\.?|aug\.?|sep\.?|okt\.?|nov\.?|dec\.?)/i,monthsParse:f,longMonthsParse:f,shortMonthsParse:f,weekdays:"zondag_maandag_dinsdag_woensdag_donderdag_vrijdag_zaterdag".split("_"),weekdaysShort:"zo._ma._di._wo._do._vr._za.".split("_"),weekdaysMin:"zo_ma_di_wo_do_vr_za".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd D MMMM YYYY HH:mm"},calendar:{sameDay:"[vandaag om] LT",nextDay:"[morgen om] LT",nextWeek:"dddd [om] LT",lastDay:"[gisteren om] LT",lastWeek:"[afgelopen] dddd [om] LT",sameElse:"L"},relativeTime:{future:"over %s",past:"%s geleden",s:"een paar seconden",ss:"%d seconden",m:"\xe9\xe9n minuut",mm:"%d minuten",h:"\xe9\xe9n uur",hh:"%d uur",d:"\xe9\xe9n dag",dd:"%d dagen",M:"\xe9\xe9n maand",MM:"%d maanden",y:"\xe9\xe9n jaar",yy:"%d jaar"},dayOfMonthOrdinalParse:/\d{1,2}(ste|de)/,ordinal:function(y){return y+(1===y||8===y||y>=20?"ste":"de")},week:{dow:1,doy:4}})}(i(16738))},70673:function(v,S,i){!function(r){"use strict";var u="jan._feb._mrt._apr._mei_jun._jul._aug._sep._okt._nov._dec.".split("_"),p="jan_feb_mrt_apr_mei_jun_jul_aug_sep_okt_nov_dec".split("_"),f=[/^jan/i,/^feb/i,/^maart|mrt.?$/i,/^apr/i,/^mei$/i,/^jun[i.]?$/i,/^jul[i.]?$/i,/^aug/i,/^sep/i,/^okt/i,/^nov/i,/^dec/i],e=/^(januari|februari|maart|april|mei|ju[nl]i|augustus|september|oktober|november|december|jan\.?|feb\.?|mrt\.?|apr\.?|ju[nl]\.?|aug\.?|sep\.?|okt\.?|nov\.?|dec\.?)/i;r.defineLocale("nl",{months:"januari_februari_maart_april_mei_juni_juli_augustus_september_oktober_november_december".split("_"),monthsShort:function(y,T){return y?/-MMM-/.test(T)?p[y.month()]:u[y.month()]:u},monthsRegex:e,monthsShortRegex:e,monthsStrictRegex:/^(januari|februari|maart|april|mei|ju[nl]i|augustus|september|oktober|november|december)/i,monthsShortStrictRegex:/^(jan\.?|feb\.?|mrt\.?|apr\.?|mei|ju[nl]\.?|aug\.?|sep\.?|okt\.?|nov\.?|dec\.?)/i,monthsParse:f,longMonthsParse:f,shortMonthsParse:f,weekdays:"zondag_maandag_dinsdag_woensdag_donderdag_vrijdag_zaterdag".split("_"),weekdaysShort:"zo._ma._di._wo._do._vr._za.".split("_"),weekdaysMin:"zo_ma_di_wo_do_vr_za".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD-MM-YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd D MMMM YYYY HH:mm"},calendar:{sameDay:"[vandaag om] LT",nextDay:"[morgen om] LT",nextWeek:"dddd [om] LT",lastDay:"[gisteren om] LT",lastWeek:"[afgelopen] dddd [om] LT",sameElse:"L"},relativeTime:{future:"over %s",past:"%s geleden",s:"een paar seconden",ss:"%d seconden",m:"\xe9\xe9n minuut",mm:"%d minuten",h:"\xe9\xe9n uur",hh:"%d uur",d:"\xe9\xe9n dag",dd:"%d dagen",w:"\xe9\xe9n week",ww:"%d weken",M:"\xe9\xe9n maand",MM:"%d maanden",y:"\xe9\xe9n jaar",yy:"%d jaar"},dayOfMonthOrdinalParse:/\d{1,2}(ste|de)/,ordinal:function(y){return y+(1===y||8===y||y>=20?"ste":"de")},week:{dow:1,doy:4}})}(i(16738))},72486:function(v,S,i){!function(r){"use strict";r.defineLocale("nn",{months:"januar_februar_mars_april_mai_juni_juli_august_september_oktober_november_desember".split("_"),monthsShort:"jan._feb._mars_apr._mai_juni_juli_aug._sep._okt._nov._des.".split("_"),monthsParseExact:!0,weekdays:"sundag_m\xe5ndag_tysdag_onsdag_torsdag_fredag_laurdag".split("_"),weekdaysShort:"su._m\xe5._ty._on._to._fr._lau.".split("_"),weekdaysMin:"su_m\xe5_ty_on_to_fr_la".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD.MM.YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY [kl.] H:mm",LLLL:"dddd D. MMMM YYYY [kl.] HH:mm"},calendar:{sameDay:"[I dag klokka] LT",nextDay:"[I morgon klokka] LT",nextWeek:"dddd [klokka] LT",lastDay:"[I g\xe5r klokka] LT",lastWeek:"[F\xf8reg\xe5ande] dddd [klokka] LT",sameElse:"L"},relativeTime:{future:"om %s",past:"%s sidan",s:"nokre sekund",ss:"%d sekund",m:"eit minutt",mm:"%d minutt",h:"ein time",hh:"%d timar",d:"ein dag",dd:"%d dagar",w:"ei veke",ww:"%d veker",M:"ein m\xe5nad",MM:"%d m\xe5nader",y:"eit \xe5r",yy:"%d \xe5r"},dayOfMonthOrdinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:4}})}(i(16738))},46219:function(v,S,i){!function(r){"use strict";r.defineLocale("oc-lnc",{months:{standalone:"geni\xe8r_febri\xe8r_mar\xe7_abril_mai_junh_julhet_agost_setembre_oct\xf2bre_novembre_decembre".split("_"),format:"de geni\xe8r_de febri\xe8r_de mar\xe7_d'abril_de mai_de junh_de julhet_d'agost_de setembre_d'oct\xf2bre_de novembre_de decembre".split("_"),isFormat:/D[oD]?(\s)+MMMM/},monthsShort:"gen._febr._mar\xe7_abr._mai_junh_julh._ago._set._oct._nov._dec.".split("_"),monthsParseExact:!0,weekdays:"dimenge_diluns_dimars_dim\xe8cres_dij\xf2us_divendres_dissabte".split("_"),weekdaysShort:"dg._dl._dm._dc._dj._dv._ds.".split("_"),weekdaysMin:"dg_dl_dm_dc_dj_dv_ds".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"H:mm",LTS:"H:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM [de] YYYY",ll:"D MMM YYYY",LLL:"D MMMM [de] YYYY [a] H:mm",lll:"D MMM YYYY, H:mm",LLLL:"dddd D MMMM [de] YYYY [a] H:mm",llll:"ddd D MMM YYYY, H:mm"},calendar:{sameDay:"[u\xe8i a] LT",nextDay:"[deman a] LT",nextWeek:"dddd [a] LT",lastDay:"[i\xe8r a] LT",lastWeek:"dddd [passat a] LT",sameElse:"L"},relativeTime:{future:"d'aqu\xed %s",past:"fa %s",s:"unas segondas",ss:"%d segondas",m:"una minuta",mm:"%d minutas",h:"una ora",hh:"%d oras",d:"un jorn",dd:"%d jorns",M:"un mes",MM:"%d meses",y:"un an",yy:"%d ans"},dayOfMonthOrdinalParse:/\d{1,2}(r|n|t|\xe8|a)/,ordinal:function(p,f){var e=1===p?"r":2===p?"n":3===p?"r":4===p?"t":"\xe8";return("w"===f||"W"===f)&&(e="a"),p+e},week:{dow:1,doy:4}})}(i(16738))},2829:function(v,S,i){!function(r){"use strict";var u={1:"\u0a67",2:"\u0a68",3:"\u0a69",4:"\u0a6a",5:"\u0a6b",6:"\u0a6c",7:"\u0a6d",8:"\u0a6e",9:"\u0a6f",0:"\u0a66"},p={"\u0a67":"1","\u0a68":"2","\u0a69":"3","\u0a6a":"4","\u0a6b":"5","\u0a6c":"6","\u0a6d":"7","\u0a6e":"8","\u0a6f":"9","\u0a66":"0"};r.defineLocale("pa-in",{months:"\u0a1c\u0a28\u0a35\u0a30\u0a40_\u0a2b\u0a3c\u0a30\u0a35\u0a30\u0a40_\u0a2e\u0a3e\u0a30\u0a1a_\u0a05\u0a2a\u0a4d\u0a30\u0a48\u0a32_\u0a2e\u0a08_\u0a1c\u0a42\u0a28_\u0a1c\u0a41\u0a32\u0a3e\u0a08_\u0a05\u0a17\u0a38\u0a24_\u0a38\u0a24\u0a70\u0a2c\u0a30_\u0a05\u0a15\u0a24\u0a42\u0a2c\u0a30_\u0a28\u0a35\u0a70\u0a2c\u0a30_\u0a26\u0a38\u0a70\u0a2c\u0a30".split("_"),monthsShort:"\u0a1c\u0a28\u0a35\u0a30\u0a40_\u0a2b\u0a3c\u0a30\u0a35\u0a30\u0a40_\u0a2e\u0a3e\u0a30\u0a1a_\u0a05\u0a2a\u0a4d\u0a30\u0a48\u0a32_\u0a2e\u0a08_\u0a1c\u0a42\u0a28_\u0a1c\u0a41\u0a32\u0a3e\u0a08_\u0a05\u0a17\u0a38\u0a24_\u0a38\u0a24\u0a70\u0a2c\u0a30_\u0a05\u0a15\u0a24\u0a42\u0a2c\u0a30_\u0a28\u0a35\u0a70\u0a2c\u0a30_\u0a26\u0a38\u0a70\u0a2c\u0a30".split("_"),weekdays:"\u0a10\u0a24\u0a35\u0a3e\u0a30_\u0a38\u0a4b\u0a2e\u0a35\u0a3e\u0a30_\u0a2e\u0a70\u0a17\u0a32\u0a35\u0a3e\u0a30_\u0a2c\u0a41\u0a27\u0a35\u0a3e\u0a30_\u0a35\u0a40\u0a30\u0a35\u0a3e\u0a30_\u0a38\u0a3c\u0a41\u0a71\u0a15\u0a30\u0a35\u0a3e\u0a30_\u0a38\u0a3c\u0a28\u0a40\u0a1a\u0a30\u0a35\u0a3e\u0a30".split("_"),weekdaysShort:"\u0a10\u0a24_\u0a38\u0a4b\u0a2e_\u0a2e\u0a70\u0a17\u0a32_\u0a2c\u0a41\u0a27_\u0a35\u0a40\u0a30_\u0a38\u0a3c\u0a41\u0a15\u0a30_\u0a38\u0a3c\u0a28\u0a40".split("_"),weekdaysMin:"\u0a10\u0a24_\u0a38\u0a4b\u0a2e_\u0a2e\u0a70\u0a17\u0a32_\u0a2c\u0a41\u0a27_\u0a35\u0a40\u0a30_\u0a38\u0a3c\u0a41\u0a15\u0a30_\u0a38\u0a3c\u0a28\u0a40".split("_"),longDateFormat:{LT:"A h:mm \u0a35\u0a1c\u0a47",LTS:"A h:mm:ss \u0a35\u0a1c\u0a47",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY, A h:mm \u0a35\u0a1c\u0a47",LLLL:"dddd, D MMMM YYYY, A h:mm \u0a35\u0a1c\u0a47"},calendar:{sameDay:"[\u0a05\u0a1c] LT",nextDay:"[\u0a15\u0a32] LT",nextWeek:"[\u0a05\u0a17\u0a32\u0a3e] dddd, LT",lastDay:"[\u0a15\u0a32] LT",lastWeek:"[\u0a2a\u0a3f\u0a1b\u0a32\u0a47] dddd, LT",sameElse:"L"},relativeTime:{future:"%s \u0a35\u0a3f\u0a71\u0a1a",past:"%s \u0a2a\u0a3f\u0a1b\u0a32\u0a47",s:"\u0a15\u0a41\u0a1d \u0a38\u0a15\u0a3f\u0a70\u0a1f",ss:"%d \u0a38\u0a15\u0a3f\u0a70\u0a1f",m:"\u0a07\u0a15 \u0a2e\u0a3f\u0a70\u0a1f",mm:"%d \u0a2e\u0a3f\u0a70\u0a1f",h:"\u0a07\u0a71\u0a15 \u0a18\u0a70\u0a1f\u0a3e",hh:"%d \u0a18\u0a70\u0a1f\u0a47",d:"\u0a07\u0a71\u0a15 \u0a26\u0a3f\u0a28",dd:"%d \u0a26\u0a3f\u0a28",M:"\u0a07\u0a71\u0a15 \u0a2e\u0a39\u0a40\u0a28\u0a3e",MM:"%d \u0a2e\u0a39\u0a40\u0a28\u0a47",y:"\u0a07\u0a71\u0a15 \u0a38\u0a3e\u0a32",yy:"%d \u0a38\u0a3e\u0a32"},preparse:function(e){return e.replace(/[\u0a67\u0a68\u0a69\u0a6a\u0a6b\u0a6c\u0a6d\u0a6e\u0a6f\u0a66]/g,function(_){return p[_]})},postformat:function(e){return e.replace(/\d/g,function(_){return u[_]})},meridiemParse:/\u0a30\u0a3e\u0a24|\u0a38\u0a35\u0a47\u0a30|\u0a26\u0a41\u0a2a\u0a39\u0a3f\u0a30|\u0a38\u0a3c\u0a3e\u0a2e/,meridiemHour:function(e,_){return 12===e&&(e=0),"\u0a30\u0a3e\u0a24"===_?e<4?e:e+12:"\u0a38\u0a35\u0a47\u0a30"===_?e:"\u0a26\u0a41\u0a2a\u0a39\u0a3f\u0a30"===_?e>=10?e:e+12:"\u0a38\u0a3c\u0a3e\u0a2e"===_?e+12:void 0},meridiem:function(e,_,y){return e<4?"\u0a30\u0a3e\u0a24":e<10?"\u0a38\u0a35\u0a47\u0a30":e<17?"\u0a26\u0a41\u0a2a\u0a39\u0a3f\u0a30":e<20?"\u0a38\u0a3c\u0a3e\u0a2e":"\u0a30\u0a3e\u0a24"},week:{dow:0,doy:6}})}(i(16738))},78444:function(v,S,i){!function(r){"use strict";var u="stycze\u0144_luty_marzec_kwiecie\u0144_maj_czerwiec_lipiec_sierpie\u0144_wrzesie\u0144_pa\u017adziernik_listopad_grudzie\u0144".split("_"),p="stycznia_lutego_marca_kwietnia_maja_czerwca_lipca_sierpnia_wrze\u015bnia_pa\u017adziernika_listopada_grudnia".split("_"),f=[/^sty/i,/^lut/i,/^mar/i,/^kwi/i,/^maj/i,/^cze/i,/^lip/i,/^sie/i,/^wrz/i,/^pa\u017a/i,/^lis/i,/^gru/i];function e(T){return T%10<5&&T%10>1&&~~(T/10)%10!=1}function _(T,M,R){var F=T+" ";switch(R){case"ss":return F+(e(T)?"sekundy":"sekund");case"m":return M?"minuta":"minut\u0119";case"mm":return F+(e(T)?"minuty":"minut");case"h":return M?"godzina":"godzin\u0119";case"hh":return F+(e(T)?"godziny":"godzin");case"ww":return F+(e(T)?"tygodnie":"tygodni");case"MM":return F+(e(T)?"miesi\u0105ce":"miesi\u0119cy");case"yy":return F+(e(T)?"lata":"lat")}}r.defineLocale("pl",{months:function(T,M){return T?/D MMMM/.test(M)?p[T.month()]:u[T.month()]:u},monthsShort:"sty_lut_mar_kwi_maj_cze_lip_sie_wrz_pa\u017a_lis_gru".split("_"),monthsParse:f,longMonthsParse:f,shortMonthsParse:f,weekdays:"niedziela_poniedzia\u0142ek_wtorek_\u015broda_czwartek_pi\u0105tek_sobota".split("_"),weekdaysShort:"ndz_pon_wt_\u015br_czw_pt_sob".split("_"),weekdaysMin:"Nd_Pn_Wt_\u015ar_Cz_Pt_So".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD.MM.YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd, D MMMM YYYY HH:mm"},calendar:{sameDay:"[Dzi\u015b o] LT",nextDay:"[Jutro o] LT",nextWeek:function(){switch(this.day()){case 0:return"[W niedziel\u0119 o] LT";case 2:return"[We wtorek o] LT";case 3:return"[W \u015brod\u0119 o] LT";case 6:return"[W sobot\u0119 o] LT";default:return"[W] dddd [o] LT"}},lastDay:"[Wczoraj o] LT",lastWeek:function(){switch(this.day()){case 0:return"[W zesz\u0142\u0105 niedziel\u0119 o] LT";case 3:return"[W zesz\u0142\u0105 \u015brod\u0119 o] LT";case 6:return"[W zesz\u0142\u0105 sobot\u0119 o] LT";default:return"[W zesz\u0142y] dddd [o] LT"}},sameElse:"L"},relativeTime:{future:"za %s",past:"%s temu",s:"kilka sekund",ss:_,m:_,mm:_,h:_,hh:_,d:"1 dzie\u0144",dd:"%d dni",w:"tydzie\u0144",ww:_,M:"miesi\u0105c",MM:_,y:"rok",yy:_},dayOfMonthOrdinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:4}})}(i(16738))},66117:function(v,S,i){!function(r){"use strict";r.defineLocale("pt-br",{months:"janeiro_fevereiro_mar\xe7o_abril_maio_junho_julho_agosto_setembro_outubro_novembro_dezembro".split("_"),monthsShort:"jan_fev_mar_abr_mai_jun_jul_ago_set_out_nov_dez".split("_"),weekdays:"domingo_segunda-feira_ter\xe7a-feira_quarta-feira_quinta-feira_sexta-feira_s\xe1bado".split("_"),weekdaysShort:"dom_seg_ter_qua_qui_sex_s\xe1b".split("_"),weekdaysMin:"do_2\xaa_3\xaa_4\xaa_5\xaa_6\xaa_s\xe1".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D [de] MMMM [de] YYYY",LLL:"D [de] MMMM [de] YYYY [\xe0s] HH:mm",LLLL:"dddd, D [de] MMMM [de] YYYY [\xe0s] HH:mm"},calendar:{sameDay:"[Hoje \xe0s] LT",nextDay:"[Amanh\xe3 \xe0s] LT",nextWeek:"dddd [\xe0s] LT",lastDay:"[Ontem \xe0s] LT",lastWeek:function(){return 0===this.day()||6===this.day()?"[\xdaltimo] dddd [\xe0s] LT":"[\xdaltima] dddd [\xe0s] LT"},sameElse:"L"},relativeTime:{future:"em %s",past:"h\xe1 %s",s:"poucos segundos",ss:"%d segundos",m:"um minuto",mm:"%d minutos",h:"uma hora",hh:"%d horas",d:"um dia",dd:"%d dias",M:"um m\xeas",MM:"%d meses",y:"um ano",yy:"%d anos"},dayOfMonthOrdinalParse:/\d{1,2}\xba/,ordinal:"%d\xba",invalidDate:"Data inv\xe1lida"})}(i(16738))},53170:function(v,S,i){!function(r){"use strict";r.defineLocale("pt",{months:"janeiro_fevereiro_mar\xe7o_abril_maio_junho_julho_agosto_setembro_outubro_novembro_dezembro".split("_"),monthsShort:"jan_fev_mar_abr_mai_jun_jul_ago_set_out_nov_dez".split("_"),weekdays:"Domingo_Segunda-feira_Ter\xe7a-feira_Quarta-feira_Quinta-feira_Sexta-feira_S\xe1bado".split("_"),weekdaysShort:"Dom_Seg_Ter_Qua_Qui_Sex_S\xe1b".split("_"),weekdaysMin:"Do_2\xaa_3\xaa_4\xaa_5\xaa_6\xaa_S\xe1".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D [de] MMMM [de] YYYY",LLL:"D [de] MMMM [de] YYYY HH:mm",LLLL:"dddd, D [de] MMMM [de] YYYY HH:mm"},calendar:{sameDay:"[Hoje \xe0s] LT",nextDay:"[Amanh\xe3 \xe0s] LT",nextWeek:"dddd [\xe0s] LT",lastDay:"[Ontem \xe0s] LT",lastWeek:function(){return 0===this.day()||6===this.day()?"[\xdaltimo] dddd [\xe0s] LT":"[\xdaltima] dddd [\xe0s] LT"},sameElse:"L"},relativeTime:{future:"em %s",past:"h\xe1 %s",s:"segundos",ss:"%d segundos",m:"um minuto",mm:"%d minutos",h:"uma hora",hh:"%d horas",d:"um dia",dd:"%d dias",w:"uma semana",ww:"%d semanas",M:"um m\xeas",MM:"%d meses",y:"um ano",yy:"%d anos"},dayOfMonthOrdinalParse:/\d{1,2}\xba/,ordinal:"%d\xba",week:{dow:1,doy:4}})}(i(16738))},96587:function(v,S,i){!function(r){"use strict";function u(f,e,_){var T=" ";return(f%100>=20||f>=100&&f%100==0)&&(T=" de "),f+T+{ss:"secunde",mm:"minute",hh:"ore",dd:"zile",ww:"s\u0103pt\u0103m\xe2ni",MM:"luni",yy:"ani"}[_]}r.defineLocale("ro",{months:"ianuarie_februarie_martie_aprilie_mai_iunie_iulie_august_septembrie_octombrie_noiembrie_decembrie".split("_"),monthsShort:"ian._feb._mart._apr._mai_iun._iul._aug._sept._oct._nov._dec.".split("_"),monthsParseExact:!0,weekdays:"duminic\u0103_luni_mar\u021bi_miercuri_joi_vineri_s\xe2mb\u0103t\u0103".split("_"),weekdaysShort:"Dum_Lun_Mar_Mie_Joi_Vin_S\xe2m".split("_"),weekdaysMin:"Du_Lu_Ma_Mi_Jo_Vi_S\xe2".split("_"),longDateFormat:{LT:"H:mm",LTS:"H:mm:ss",L:"DD.MM.YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY H:mm",LLLL:"dddd, D MMMM YYYY H:mm"},calendar:{sameDay:"[azi la] LT",nextDay:"[m\xe2ine la] LT",nextWeek:"dddd [la] LT",lastDay:"[ieri la] LT",lastWeek:"[fosta] dddd [la] LT",sameElse:"L"},relativeTime:{future:"peste %s",past:"%s \xeen urm\u0103",s:"c\xe2teva secunde",ss:u,m:"un minut",mm:u,h:"o or\u0103",hh:u,d:"o zi",dd:u,w:"o s\u0103pt\u0103m\xe2n\u0103",ww:u,M:"o lun\u0103",MM:u,y:"un an",yy:u},week:{dow:1,doy:7}})}(i(16738))},39264:function(v,S,i){!function(r){"use strict";function p(_,y,T){return"m"===T?y?"\u043c\u0438\u043d\u0443\u0442\u0430":"\u043c\u0438\u043d\u0443\u0442\u0443":_+" "+function(_,y){var T=_.split("_");return y%10==1&&y%100!=11?T[0]:y%10>=2&&y%10<=4&&(y%100<10||y%100>=20)?T[1]:T[2]}({ss:y?"\u0441\u0435\u043a\u0443\u043d\u0434\u0430_\u0441\u0435\u043a\u0443\u043d\u0434\u044b_\u0441\u0435\u043a\u0443\u043d\u0434":"\u0441\u0435\u043a\u0443\u043d\u0434\u0443_\u0441\u0435\u043a\u0443\u043d\u0434\u044b_\u0441\u0435\u043a\u0443\u043d\u0434",mm:y?"\u043c\u0438\u043d\u0443\u0442\u0430_\u043c\u0438\u043d\u0443\u0442\u044b_\u043c\u0438\u043d\u0443\u0442":"\u043c\u0438\u043d\u0443\u0442\u0443_\u043c\u0438\u043d\u0443\u0442\u044b_\u043c\u0438\u043d\u0443\u0442",hh:"\u0447\u0430\u0441_\u0447\u0430\u0441\u0430_\u0447\u0430\u0441\u043e\u0432",dd:"\u0434\u0435\u043d\u044c_\u0434\u043d\u044f_\u0434\u043d\u0435\u0439",ww:"\u043d\u0435\u0434\u0435\u043b\u044f_\u043d\u0435\u0434\u0435\u043b\u0438_\u043d\u0435\u0434\u0435\u043b\u044c",MM:"\u043c\u0435\u0441\u044f\u0446_\u043c\u0435\u0441\u044f\u0446\u0430_\u043c\u0435\u0441\u044f\u0446\u0435\u0432",yy:"\u0433\u043e\u0434_\u0433\u043e\u0434\u0430_\u043b\u0435\u0442"}[T],+_)}var f=[/^\u044f\u043d\u0432/i,/^\u0444\u0435\u0432/i,/^\u043c\u0430\u0440/i,/^\u0430\u043f\u0440/i,/^\u043c\u0430[\u0439\u044f]/i,/^\u0438\u044e\u043d/i,/^\u0438\u044e\u043b/i,/^\u0430\u0432\u0433/i,/^\u0441\u0435\u043d/i,/^\u043e\u043a\u0442/i,/^\u043d\u043e\u044f/i,/^\u0434\u0435\u043a/i];r.defineLocale("ru",{months:{format:"\u044f\u043d\u0432\u0430\u0440\u044f_\u0444\u0435\u0432\u0440\u0430\u043b\u044f_\u043c\u0430\u0440\u0442\u0430_\u0430\u043f\u0440\u0435\u043b\u044f_\u043c\u0430\u044f_\u0438\u044e\u043d\u044f_\u0438\u044e\u043b\u044f_\u0430\u0432\u0433\u0443\u0441\u0442\u0430_\u0441\u0435\u043d\u0442\u044f\u0431\u0440\u044f_\u043e\u043a\u0442\u044f\u0431\u0440\u044f_\u043d\u043e\u044f\u0431\u0440\u044f_\u0434\u0435\u043a\u0430\u0431\u0440\u044f".split("_"),standalone:"\u044f\u043d\u0432\u0430\u0440\u044c_\u0444\u0435\u0432\u0440\u0430\u043b\u044c_\u043c\u0430\u0440\u0442_\u0430\u043f\u0440\u0435\u043b\u044c_\u043c\u0430\u0439_\u0438\u044e\u043d\u044c_\u0438\u044e\u043b\u044c_\u0430\u0432\u0433\u0443\u0441\u0442_\u0441\u0435\u043d\u0442\u044f\u0431\u0440\u044c_\u043e\u043a\u0442\u044f\u0431\u0440\u044c_\u043d\u043e\u044f\u0431\u0440\u044c_\u0434\u0435\u043a\u0430\u0431\u0440\u044c".split("_")},monthsShort:{format:"\u044f\u043d\u0432._\u0444\u0435\u0432\u0440._\u043c\u0430\u0440._\u0430\u043f\u0440._\u043c\u0430\u044f_\u0438\u044e\u043d\u044f_\u0438\u044e\u043b\u044f_\u0430\u0432\u0433._\u0441\u0435\u043d\u0442._\u043e\u043a\u0442._\u043d\u043e\u044f\u0431._\u0434\u0435\u043a.".split("_"),standalone:"\u044f\u043d\u0432._\u0444\u0435\u0432\u0440._\u043c\u0430\u0440\u0442_\u0430\u043f\u0440._\u043c\u0430\u0439_\u0438\u044e\u043d\u044c_\u0438\u044e\u043b\u044c_\u0430\u0432\u0433._\u0441\u0435\u043d\u0442._\u043e\u043a\u0442._\u043d\u043e\u044f\u0431._\u0434\u0435\u043a.".split("_")},weekdays:{standalone:"\u0432\u043e\u0441\u043a\u0440\u0435\u0441\u0435\u043d\u044c\u0435_\u043f\u043e\u043d\u0435\u0434\u0435\u043b\u044c\u043d\u0438\u043a_\u0432\u0442\u043e\u0440\u043d\u0438\u043a_\u0441\u0440\u0435\u0434\u0430_\u0447\u0435\u0442\u0432\u0435\u0440\u0433_\u043f\u044f\u0442\u043d\u0438\u0446\u0430_\u0441\u0443\u0431\u0431\u043e\u0442\u0430".split("_"),format:"\u0432\u043e\u0441\u043a\u0440\u0435\u0441\u0435\u043d\u044c\u0435_\u043f\u043e\u043d\u0435\u0434\u0435\u043b\u044c\u043d\u0438\u043a_\u0432\u0442\u043e\u0440\u043d\u0438\u043a_\u0441\u0440\u0435\u0434\u0443_\u0447\u0435\u0442\u0432\u0435\u0440\u0433_\u043f\u044f\u0442\u043d\u0438\u0446\u0443_\u0441\u0443\u0431\u0431\u043e\u0442\u0443".split("_"),isFormat:/\[ ?[\u0412\u0432] ?(?:\u043f\u0440\u043e\u0448\u043b\u0443\u044e|\u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0443\u044e|\u044d\u0442\u0443)? ?] ?dddd/},weekdaysShort:"\u0432\u0441_\u043f\u043d_\u0432\u0442_\u0441\u0440_\u0447\u0442_\u043f\u0442_\u0441\u0431".split("_"),weekdaysMin:"\u0432\u0441_\u043f\u043d_\u0432\u0442_\u0441\u0440_\u0447\u0442_\u043f\u0442_\u0441\u0431".split("_"),monthsParse:f,longMonthsParse:f,shortMonthsParse:f,monthsRegex:/^(\u044f\u043d\u0432\u0430\u0440[\u044c\u044f]|\u044f\u043d\u0432\.?|\u0444\u0435\u0432\u0440\u0430\u043b[\u044c\u044f]|\u0444\u0435\u0432\u0440?\.?|\u043c\u0430\u0440\u0442\u0430?|\u043c\u0430\u0440\.?|\u0430\u043f\u0440\u0435\u043b[\u044c\u044f]|\u0430\u043f\u0440\.?|\u043c\u0430[\u0439\u044f]|\u0438\u044e\u043d[\u044c\u044f]|\u0438\u044e\u043d\.?|\u0438\u044e\u043b[\u044c\u044f]|\u0438\u044e\u043b\.?|\u0430\u0432\u0433\u0443\u0441\u0442\u0430?|\u0430\u0432\u0433\.?|\u0441\u0435\u043d\u0442\u044f\u0431\u0440[\u044c\u044f]|\u0441\u0435\u043d\u0442?\.?|\u043e\u043a\u0442\u044f\u0431\u0440[\u044c\u044f]|\u043e\u043a\u0442\.?|\u043d\u043e\u044f\u0431\u0440[\u044c\u044f]|\u043d\u043e\u044f\u0431?\.?|\u0434\u0435\u043a\u0430\u0431\u0440[\u044c\u044f]|\u0434\u0435\u043a\.?)/i,monthsShortRegex:/^(\u044f\u043d\u0432\u0430\u0440[\u044c\u044f]|\u044f\u043d\u0432\.?|\u0444\u0435\u0432\u0440\u0430\u043b[\u044c\u044f]|\u0444\u0435\u0432\u0440?\.?|\u043c\u0430\u0440\u0442\u0430?|\u043c\u0430\u0440\.?|\u0430\u043f\u0440\u0435\u043b[\u044c\u044f]|\u0430\u043f\u0440\.?|\u043c\u0430[\u0439\u044f]|\u0438\u044e\u043d[\u044c\u044f]|\u0438\u044e\u043d\.?|\u0438\u044e\u043b[\u044c\u044f]|\u0438\u044e\u043b\.?|\u0430\u0432\u0433\u0443\u0441\u0442\u0430?|\u0430\u0432\u0433\.?|\u0441\u0435\u043d\u0442\u044f\u0431\u0440[\u044c\u044f]|\u0441\u0435\u043d\u0442?\.?|\u043e\u043a\u0442\u044f\u0431\u0440[\u044c\u044f]|\u043e\u043a\u0442\.?|\u043d\u043e\u044f\u0431\u0440[\u044c\u044f]|\u043d\u043e\u044f\u0431?\.?|\u0434\u0435\u043a\u0430\u0431\u0440[\u044c\u044f]|\u0434\u0435\u043a\.?)/i,monthsStrictRegex:/^(\u044f\u043d\u0432\u0430\u0440[\u044f\u044c]|\u0444\u0435\u0432\u0440\u0430\u043b[\u044f\u044c]|\u043c\u0430\u0440\u0442\u0430?|\u0430\u043f\u0440\u0435\u043b[\u044f\u044c]|\u043c\u0430[\u044f\u0439]|\u0438\u044e\u043d[\u044f\u044c]|\u0438\u044e\u043b[\u044f\u044c]|\u0430\u0432\u0433\u0443\u0441\u0442\u0430?|\u0441\u0435\u043d\u0442\u044f\u0431\u0440[\u044f\u044c]|\u043e\u043a\u0442\u044f\u0431\u0440[\u044f\u044c]|\u043d\u043e\u044f\u0431\u0440[\u044f\u044c]|\u0434\u0435\u043a\u0430\u0431\u0440[\u044f\u044c])/i,monthsShortStrictRegex:/^(\u044f\u043d\u0432\.|\u0444\u0435\u0432\u0440?\.|\u043c\u0430\u0440[\u0442.]|\u0430\u043f\u0440\.|\u043c\u0430[\u044f\u0439]|\u0438\u044e\u043d[\u044c\u044f.]|\u0438\u044e\u043b[\u044c\u044f.]|\u0430\u0432\u0433\.|\u0441\u0435\u043d\u0442?\.|\u043e\u043a\u0442\.|\u043d\u043e\u044f\u0431?\.|\u0434\u0435\u043a\.)/i,longDateFormat:{LT:"H:mm",LTS:"H:mm:ss",L:"DD.MM.YYYY",LL:"D MMMM YYYY \u0433.",LLL:"D MMMM YYYY \u0433., H:mm",LLLL:"dddd, D MMMM YYYY \u0433., H:mm"},calendar:{sameDay:"[\u0421\u0435\u0433\u043e\u0434\u043d\u044f, \u0432] LT",nextDay:"[\u0417\u0430\u0432\u0442\u0440\u0430, \u0432] LT",lastDay:"[\u0412\u0447\u0435\u0440\u0430, \u0432] LT",nextWeek:function(_){if(_.week()===this.week())return 2===this.day()?"[\u0412\u043e] dddd, [\u0432] LT":"[\u0412] dddd, [\u0432] LT";switch(this.day()){case 0:return"[\u0412 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0435] dddd, [\u0432] LT";case 1:case 2:case 4:return"[\u0412 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439] dddd, [\u0432] LT";case 3:case 5:case 6:return"[\u0412 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0443\u044e] dddd, [\u0432] LT"}},lastWeek:function(_){if(_.week()===this.week())return 2===this.day()?"[\u0412\u043e] dddd, [\u0432] LT":"[\u0412] dddd, [\u0432] LT";switch(this.day()){case 0:return"[\u0412 \u043f\u0440\u043e\u0448\u043b\u043e\u0435] dddd, [\u0432] LT";case 1:case 2:case 4:return"[\u0412 \u043f\u0440\u043e\u0448\u043b\u044b\u0439] dddd, [\u0432] LT";case 3:case 5:case 6:return"[\u0412 \u043f\u0440\u043e\u0448\u043b\u0443\u044e] dddd, [\u0432] LT"}},sameElse:"L"},relativeTime:{future:"\u0447\u0435\u0440\u0435\u0437 %s",past:"%s \u043d\u0430\u0437\u0430\u0434",s:"\u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0441\u0435\u043a\u0443\u043d\u0434",ss:p,m:p,mm:p,h:"\u0447\u0430\u0441",hh:p,d:"\u0434\u0435\u043d\u044c",dd:p,w:"\u043d\u0435\u0434\u0435\u043b\u044f",ww:p,M:"\u043c\u0435\u0441\u044f\u0446",MM:p,y:"\u0433\u043e\u0434",yy:p},meridiemParse:/\u043d\u043e\u0447\u0438|\u0443\u0442\u0440\u0430|\u0434\u043d\u044f|\u0432\u0435\u0447\u0435\u0440\u0430/i,isPM:function(_){return/^(\u0434\u043d\u044f|\u0432\u0435\u0447\u0435\u0440\u0430)$/.test(_)},meridiem:function(_,y,T){return _<4?"\u043d\u043e\u0447\u0438":_<12?"\u0443\u0442\u0440\u0430":_<17?"\u0434\u043d\u044f":"\u0432\u0435\u0447\u0435\u0440\u0430"},dayOfMonthOrdinalParse:/\d{1,2}-(\u0439|\u0433\u043e|\u044f)/,ordinal:function(_,y){switch(y){case"M":case"d":case"DDD":return _+"-\u0439";case"D":return _+"-\u0433\u043e";case"w":case"W":return _+"-\u044f";default:return _}},week:{dow:1,doy:4}})}(i(16738))},42135:function(v,S,i){!function(r){"use strict";var u=["\u062c\u0646\u0648\u0631\u064a","\u0641\u064a\u0628\u0631\u0648\u0631\u064a","\u0645\u0627\u0631\u0686","\u0627\u067e\u0631\u064a\u0644","\u0645\u0626\u064a","\u062c\u0648\u0646","\u062c\u0648\u0644\u0627\u0621\u0650","\u0622\u06af\u0633\u067d","\u0633\u064a\u067e\u067d\u0645\u0628\u0631","\u0622\u06aa\u067d\u0648\u0628\u0631","\u0646\u0648\u0645\u0628\u0631","\u068a\u0633\u0645\u0628\u0631"],p=["\u0622\u0686\u0631","\u0633\u0648\u0645\u0631","\u0627\u06b1\u0627\u0631\u0648","\u0627\u0631\u0628\u0639","\u062e\u0645\u064a\u0633","\u062c\u0645\u0639","\u0687\u0646\u0687\u0631"];r.defineLocale("sd",{months:u,monthsShort:u,weekdays:p,weekdaysShort:p,weekdaysMin:p,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd\u060c D MMMM YYYY HH:mm"},meridiemParse:/\u0635\u0628\u062d|\u0634\u0627\u0645/,isPM:function(e){return"\u0634\u0627\u0645"===e},meridiem:function(e,_,y){return e<12?"\u0635\u0628\u062d":"\u0634\u0627\u0645"},calendar:{sameDay:"[\u0627\u0684] LT",nextDay:"[\u0633\u0680\u0627\u06bb\u064a] LT",nextWeek:"dddd [\u0627\u06b3\u064a\u0646 \u0647\u0641\u062a\u064a \u062a\u064a] LT",lastDay:"[\u06aa\u0627\u0644\u0647\u0647] LT",lastWeek:"[\u06af\u0632\u0631\u064a\u0644 \u0647\u0641\u062a\u064a] dddd [\u062a\u064a] LT",sameElse:"L"},relativeTime:{future:"%s \u067e\u0648\u0621",past:"%s \u0627\u06b3",s:"\u0686\u0646\u062f \u0633\u064a\u06aa\u0646\u068a",ss:"%d \u0633\u064a\u06aa\u0646\u068a",m:"\u0647\u06aa \u0645\u0646\u067d",mm:"%d \u0645\u0646\u067d",h:"\u0647\u06aa \u06aa\u0644\u0627\u06aa",hh:"%d \u06aa\u0644\u0627\u06aa",d:"\u0647\u06aa \u068f\u064a\u0646\u0647\u0646",dd:"%d \u068f\u064a\u0646\u0647\u0646",M:"\u0647\u06aa \u0645\u0647\u064a\u0646\u0648",MM:"%d \u0645\u0647\u064a\u0646\u0627",y:"\u0647\u06aa \u0633\u0627\u0644",yy:"%d \u0633\u0627\u0644"},preparse:function(e){return e.replace(/\u060c/g,",")},postformat:function(e){return e.replace(/,/g,"\u060c")},week:{dow:1,doy:4}})}(i(16738))},95366:function(v,S,i){!function(r){"use strict";r.defineLocale("se",{months:"o\u0111\u0111ajagem\xe1nnu_guovvam\xe1nnu_njuk\u010dam\xe1nnu_cuo\u014bom\xe1nnu_miessem\xe1nnu_geassem\xe1nnu_suoidnem\xe1nnu_borgem\xe1nnu_\u010dak\u010dam\xe1nnu_golggotm\xe1nnu_sk\xe1bmam\xe1nnu_juovlam\xe1nnu".split("_"),monthsShort:"o\u0111\u0111j_guov_njuk_cuo_mies_geas_suoi_borg_\u010dak\u010d_golg_sk\xe1b_juov".split("_"),weekdays:"sotnabeaivi_vuoss\xe1rga_ma\u014b\u014beb\xe1rga_gaskavahkku_duorastat_bearjadat_l\xe1vvardat".split("_"),weekdaysShort:"sotn_vuos_ma\u014b_gask_duor_bear_l\xe1v".split("_"),weekdaysMin:"s_v_m_g_d_b_L".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD.MM.YYYY",LL:"MMMM D. [b.] YYYY",LLL:"MMMM D. [b.] YYYY [ti.] HH:mm",LLLL:"dddd, MMMM D. [b.] YYYY [ti.] HH:mm"},calendar:{sameDay:"[otne ti] LT",nextDay:"[ihttin ti] LT",nextWeek:"dddd [ti] LT",lastDay:"[ikte ti] LT",lastWeek:"[ovddit] dddd [ti] LT",sameElse:"L"},relativeTime:{future:"%s gea\u017ees",past:"ma\u014bit %s",s:"moadde sekunddat",ss:"%d sekunddat",m:"okta minuhta",mm:"%d minuhtat",h:"okta diimmu",hh:"%d diimmut",d:"okta beaivi",dd:"%d beaivvit",M:"okta m\xe1nnu",MM:"%d m\xe1nut",y:"okta jahki",yy:"%d jagit"},dayOfMonthOrdinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:4}})}(i(16738))},93379:function(v,S,i){!function(r){"use strict";r.defineLocale("si",{months:"\u0da2\u0db1\u0dc0\u0dcf\u0dbb\u0dd2_\u0db4\u0dd9\u0db6\u0dbb\u0dc0\u0dcf\u0dbb\u0dd2_\u0db8\u0dcf\u0dbb\u0dca\u0dad\u0dd4_\u0d85\u0db4\u0dca\u200d\u0dbb\u0dda\u0dbd\u0dca_\u0db8\u0dd0\u0dba\u0dd2_\u0da2\u0dd6\u0db1\u0dd2_\u0da2\u0dd6\u0dbd\u0dd2_\u0d85\u0d9c\u0ddd\u0dc3\u0dca\u0dad\u0dd4_\u0dc3\u0dd0\u0db4\u0dca\u0dad\u0dd0\u0db8\u0dca\u0db6\u0dbb\u0dca_\u0d94\u0d9a\u0dca\u0dad\u0ddd\u0db6\u0dbb\u0dca_\u0db1\u0ddc\u0dc0\u0dd0\u0db8\u0dca\u0db6\u0dbb\u0dca_\u0daf\u0dd9\u0dc3\u0dd0\u0db8\u0dca\u0db6\u0dbb\u0dca".split("_"),monthsShort:"\u0da2\u0db1_\u0db4\u0dd9\u0db6_\u0db8\u0dcf\u0dbb\u0dca_\u0d85\u0db4\u0dca_\u0db8\u0dd0\u0dba\u0dd2_\u0da2\u0dd6\u0db1\u0dd2_\u0da2\u0dd6\u0dbd\u0dd2_\u0d85\u0d9c\u0ddd_\u0dc3\u0dd0\u0db4\u0dca_\u0d94\u0d9a\u0dca_\u0db1\u0ddc\u0dc0\u0dd0_\u0daf\u0dd9\u0dc3\u0dd0".split("_"),weekdays:"\u0d89\u0dbb\u0dd2\u0daf\u0dcf_\u0dc3\u0db3\u0dd4\u0daf\u0dcf_\u0d85\u0d9f\u0dc4\u0dbb\u0dd4\u0dc0\u0dcf\u0daf\u0dcf_\u0db6\u0daf\u0dcf\u0daf\u0dcf_\u0db6\u0dca\u200d\u0dbb\u0dc4\u0dc3\u0dca\u0db4\u0dad\u0dd2\u0db1\u0dca\u0daf\u0dcf_\u0dc3\u0dd2\u0d9a\u0dd4\u0dbb\u0dcf\u0daf\u0dcf_\u0dc3\u0dd9\u0db1\u0dc3\u0dd4\u0dbb\u0dcf\u0daf\u0dcf".split("_"),weekdaysShort:"\u0d89\u0dbb\u0dd2_\u0dc3\u0db3\u0dd4_\u0d85\u0d9f_\u0db6\u0daf\u0dcf_\u0db6\u0dca\u200d\u0dbb\u0dc4_\u0dc3\u0dd2\u0d9a\u0dd4_\u0dc3\u0dd9\u0db1".split("_"),weekdaysMin:"\u0d89_\u0dc3_\u0d85_\u0db6_\u0db6\u0dca\u200d\u0dbb_\u0dc3\u0dd2_\u0dc3\u0dd9".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"a h:mm",LTS:"a h:mm:ss",L:"YYYY/MM/DD",LL:"YYYY MMMM D",LLL:"YYYY MMMM D, a h:mm",LLLL:"YYYY MMMM D [\u0dc0\u0dd0\u0db1\u0dd2] dddd, a h:mm:ss"},calendar:{sameDay:"[\u0d85\u0daf] LT[\u0da7]",nextDay:"[\u0dc4\u0dd9\u0da7] LT[\u0da7]",nextWeek:"dddd LT[\u0da7]",lastDay:"[\u0d8a\u0dba\u0dda] LT[\u0da7]",lastWeek:"[\u0db4\u0dc3\u0dd4\u0d9c\u0dd2\u0dba] dddd LT[\u0da7]",sameElse:"L"},relativeTime:{future:"%s\u0d9a\u0dd2\u0db1\u0dca",past:"%s\u0d9a\u0da7 \u0db4\u0dd9\u0dbb",s:"\u0dad\u0dad\u0dca\u0db4\u0dbb \u0d9a\u0dd2\u0dc4\u0dd2\u0db4\u0dba",ss:"\u0dad\u0dad\u0dca\u0db4\u0dbb %d",m:"\u0db8\u0dd2\u0db1\u0dd2\u0dad\u0dca\u0dad\u0dd4\u0dc0",mm:"\u0db8\u0dd2\u0db1\u0dd2\u0dad\u0dca\u0dad\u0dd4 %d",h:"\u0db4\u0dd0\u0dba",hh:"\u0db4\u0dd0\u0dba %d",d:"\u0daf\u0dd2\u0db1\u0dba",dd:"\u0daf\u0dd2\u0db1 %d",M:"\u0db8\u0dcf\u0dc3\u0dba",MM:"\u0db8\u0dcf\u0dc3 %d",y:"\u0dc0\u0dc3\u0dbb",yy:"\u0dc0\u0dc3\u0dbb %d"},dayOfMonthOrdinalParse:/\d{1,2} \u0dc0\u0dd0\u0db1\u0dd2/,ordinal:function(p){return p+" \u0dc0\u0dd0\u0db1\u0dd2"},meridiemParse:/\u0db4\u0dd9\u0dbb \u0dc0\u0dbb\u0dd4|\u0db4\u0dc3\u0dca \u0dc0\u0dbb\u0dd4|\u0db4\u0dd9.\u0dc0|\u0db4.\u0dc0./,isPM:function(p){return"\u0db4.\u0dc0."===p||"\u0db4\u0dc3\u0dca \u0dc0\u0dbb\u0dd4"===p},meridiem:function(p,f,e){return p>11?e?"\u0db4.\u0dc0.":"\u0db4\u0dc3\u0dca \u0dc0\u0dbb\u0dd4":e?"\u0db4\u0dd9.\u0dc0.":"\u0db4\u0dd9\u0dbb \u0dc0\u0dbb\u0dd4"}})}(i(16738))},46143:function(v,S,i){!function(r){"use strict";var u="janu\xe1r_febru\xe1r_marec_apr\xedl_m\xe1j_j\xfan_j\xfal_august_september_okt\xf3ber_november_december".split("_"),p="jan_feb_mar_apr_m\xe1j_j\xfan_j\xfal_aug_sep_okt_nov_dec".split("_");function f(y){return y>1&&y<5}function e(y,T,M,R){var F=y+" ";switch(M){case"s":return T||R?"p\xe1r sek\xfand":"p\xe1r sekundami";case"ss":return T||R?F+(f(y)?"sekundy":"sek\xfand"):F+"sekundami";case"m":return T?"min\xfata":R?"min\xfatu":"min\xfatou";case"mm":return T||R?F+(f(y)?"min\xfaty":"min\xfat"):F+"min\xfatami";case"h":return T?"hodina":R?"hodinu":"hodinou";case"hh":return T||R?F+(f(y)?"hodiny":"hod\xedn"):F+"hodinami";case"d":return T||R?"de\u0148":"d\u0148om";case"dd":return T||R?F+(f(y)?"dni":"dn\xed"):F+"d\u0148ami";case"M":return T||R?"mesiac":"mesiacom";case"MM":return T||R?F+(f(y)?"mesiace":"mesiacov"):F+"mesiacmi";case"y":return T||R?"rok":"rokom";case"yy":return T||R?F+(f(y)?"roky":"rokov"):F+"rokmi"}}r.defineLocale("sk",{months:u,monthsShort:p,weekdays:"nede\u013ea_pondelok_utorok_streda_\u0161tvrtok_piatok_sobota".split("_"),weekdaysShort:"ne_po_ut_st_\u0161t_pi_so".split("_"),weekdaysMin:"ne_po_ut_st_\u0161t_pi_so".split("_"),longDateFormat:{LT:"H:mm",LTS:"H:mm:ss",L:"DD.MM.YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY H:mm",LLLL:"dddd D. MMMM YYYY H:mm"},calendar:{sameDay:"[dnes o] LT",nextDay:"[zajtra o] LT",nextWeek:function(){switch(this.day()){case 0:return"[v nede\u013eu o] LT";case 1:case 2:return"[v] dddd [o] LT";case 3:return"[v stredu o] LT";case 4:return"[vo \u0161tvrtok o] LT";case 5:return"[v piatok o] LT";case 6:return"[v sobotu o] LT"}},lastDay:"[v\u010dera o] LT",lastWeek:function(){switch(this.day()){case 0:return"[minul\xfa nede\u013eu o] LT";case 1:case 2:return"[minul\xfd] dddd [o] LT";case 3:return"[minul\xfa stredu o] LT";case 4:case 5:return"[minul\xfd] dddd [o] LT";case 6:return"[minul\xfa sobotu o] LT"}},sameElse:"L"},relativeTime:{future:"za %s",past:"pred %s",s:e,ss:e,m:e,mm:e,h:e,hh:e,d:e,dd:e,M:e,MM:e,y:e,yy:e},dayOfMonthOrdinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:4}})}(i(16738))},196:function(v,S,i){!function(r){"use strict";function u(f,e,_,y){var T=f+" ";switch(_){case"s":return e||y?"nekaj sekund":"nekaj sekundami";case"ss":return T+(1===f?e?"sekundo":"sekundi":2===f?e||y?"sekundi":"sekundah":f<5?e||y?"sekunde":"sekundah":"sekund");case"m":return e?"ena minuta":"eno minuto";case"mm":return T+(1===f?e?"minuta":"minuto":2===f?e||y?"minuti":"minutama":f<5?e||y?"minute":"minutami":e||y?"minut":"minutami");case"h":return e?"ena ura":"eno uro";case"hh":return T+(1===f?e?"ura":"uro":2===f?e||y?"uri":"urama":f<5?e||y?"ure":"urami":e||y?"ur":"urami");case"d":return e||y?"en dan":"enim dnem";case"dd":return T+(1===f?e||y?"dan":"dnem":2===f?e||y?"dni":"dnevoma":e||y?"dni":"dnevi");case"M":return e||y?"en mesec":"enim mesecem";case"MM":return T+(1===f?e||y?"mesec":"mesecem":2===f?e||y?"meseca":"mesecema":f<5?e||y?"mesece":"meseci":e||y?"mesecev":"meseci");case"y":return e||y?"eno leto":"enim letom";case"yy":return T+(1===f?e||y?"leto":"letom":2===f?e||y?"leti":"letoma":f<5?e||y?"leta":"leti":e||y?"let":"leti")}}r.defineLocale("sl",{months:"januar_februar_marec_april_maj_junij_julij_avgust_september_oktober_november_december".split("_"),monthsShort:"jan._feb._mar._apr._maj._jun._jul._avg._sep._okt._nov._dec.".split("_"),monthsParseExact:!0,weekdays:"nedelja_ponedeljek_torek_sreda_\u010detrtek_petek_sobota".split("_"),weekdaysShort:"ned._pon._tor._sre._\u010det._pet._sob.".split("_"),weekdaysMin:"ne_po_to_sr_\u010de_pe_so".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"H:mm",LTS:"H:mm:ss",L:"DD. MM. YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY H:mm",LLLL:"dddd, D. MMMM YYYY H:mm"},calendar:{sameDay:"[danes ob] LT",nextDay:"[jutri ob] LT",nextWeek:function(){switch(this.day()){case 0:return"[v] [nedeljo] [ob] LT";case 3:return"[v] [sredo] [ob] LT";case 6:return"[v] [soboto] [ob] LT";case 1:case 2:case 4:case 5:return"[v] dddd [ob] LT"}},lastDay:"[v\u010deraj ob] LT",lastWeek:function(){switch(this.day()){case 0:return"[prej\u0161njo] [nedeljo] [ob] LT";case 3:return"[prej\u0161njo] [sredo] [ob] LT";case 6:return"[prej\u0161njo] [soboto] [ob] LT";case 1:case 2:case 4:case 5:return"[prej\u0161nji] dddd [ob] LT"}},sameElse:"L"},relativeTime:{future:"\u010dez %s",past:"pred %s",s:u,ss:u,m:u,mm:u,h:u,hh:u,d:u,dd:u,M:u,MM:u,y:u,yy:u},dayOfMonthOrdinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:7}})}(i(16738))},21082:function(v,S,i){!function(r){"use strict";r.defineLocale("sq",{months:"Janar_Shkurt_Mars_Prill_Maj_Qershor_Korrik_Gusht_Shtator_Tetor_N\xebntor_Dhjetor".split("_"),monthsShort:"Jan_Shk_Mar_Pri_Maj_Qer_Kor_Gus_Sht_Tet_N\xebn_Dhj".split("_"),weekdays:"E Diel_E H\xebn\xeb_E Mart\xeb_E M\xebrkur\xeb_E Enjte_E Premte_E Shtun\xeb".split("_"),weekdaysShort:"Die_H\xebn_Mar_M\xebr_Enj_Pre_Sht".split("_"),weekdaysMin:"D_H_Ma_M\xeb_E_P_Sh".split("_"),weekdaysParseExact:!0,meridiemParse:/PD|MD/,isPM:function(p){return"M"===p.charAt(0)},meridiem:function(p,f,e){return p<12?"PD":"MD"},longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd, D MMMM YYYY HH:mm"},calendar:{sameDay:"[Sot n\xeb] LT",nextDay:"[Nes\xebr n\xeb] LT",nextWeek:"dddd [n\xeb] LT",lastDay:"[Dje n\xeb] LT",lastWeek:"dddd [e kaluar n\xeb] LT",sameElse:"L"},relativeTime:{future:"n\xeb %s",past:"%s m\xeb par\xeb",s:"disa sekonda",ss:"%d sekonda",m:"nj\xeb minut\xeb",mm:"%d minuta",h:"nj\xeb or\xeb",hh:"%d or\xeb",d:"nj\xeb dit\xeb",dd:"%d dit\xeb",M:"nj\xeb muaj",MM:"%d muaj",y:"nj\xeb vit",yy:"%d vite"},dayOfMonthOrdinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:4}})}(i(16738))},98963:function(v,S,i){!function(r){"use strict";var u={words:{ss:["\u0441\u0435\u043a\u0443\u043d\u0434\u0430","\u0441\u0435\u043a\u0443\u043d\u0434\u0435","\u0441\u0435\u043a\u0443\u043d\u0434\u0438"],m:["\u0458\u0435\u0434\u0430\u043d \u043c\u0438\u043d\u0443\u0442","\u0458\u0435\u0434\u043d\u043e\u0433 \u043c\u0438\u043d\u0443\u0442\u0430"],mm:["\u043c\u0438\u043d\u0443\u0442","\u043c\u0438\u043d\u0443\u0442\u0430","\u043c\u0438\u043d\u0443\u0442\u0430"],h:["\u0458\u0435\u0434\u0430\u043d \u0441\u0430\u0442","\u0458\u0435\u0434\u043d\u043e\u0433 \u0441\u0430\u0442\u0430"],hh:["\u0441\u0430\u0442","\u0441\u0430\u0442\u0430","\u0441\u0430\u0442\u0438"],d:["\u0458\u0435\u0434\u0430\u043d \u0434\u0430\u043d","\u0458\u0435\u0434\u043d\u043e\u0433 \u0434\u0430\u043d\u0430"],dd:["\u0434\u0430\u043d","\u0434\u0430\u043d\u0430","\u0434\u0430\u043d\u0430"],M:["\u0458\u0435\u0434\u0430\u043d \u043c\u0435\u0441\u0435\u0446","\u0458\u0435\u0434\u043d\u043e\u0433 \u043c\u0435\u0441\u0435\u0446\u0430"],MM:["\u043c\u0435\u0441\u0435\u0446","\u043c\u0435\u0441\u0435\u0446\u0430","\u043c\u0435\u0441\u0435\u0446\u0438"],y:["\u0458\u0435\u0434\u043d\u0443 \u0433\u043e\u0434\u0438\u043d\u0443","\u0458\u0435\u0434\u043d\u0435 \u0433\u043e\u0434\u0438\u043d\u0435"],yy:["\u0433\u043e\u0434\u0438\u043d\u0443","\u0433\u043e\u0434\u0438\u043d\u0435","\u0433\u043e\u0434\u0438\u043d\u0430"]},correctGrammaticalCase:function(f,e){return f%10>=1&&f%10<=4&&(f%100<10||f%100>=20)?f%10==1?e[0]:e[1]:e[2]},translate:function(f,e,_,y){var M,T=u.words[_];return 1===_.length?"y"===_&&e?"\u0458\u0435\u0434\u043d\u0430 \u0433\u043e\u0434\u0438\u043d\u0430":y||e?T[0]:T[1]:(M=u.correctGrammaticalCase(f,T),"yy"===_&&e&&"\u0433\u043e\u0434\u0438\u043d\u0443"===M?f+" \u0433\u043e\u0434\u0438\u043d\u0430":f+" "+M)}};r.defineLocale("sr-cyrl",{months:"\u0458\u0430\u043d\u0443\u0430\u0440_\u0444\u0435\u0431\u0440\u0443\u0430\u0440_\u043c\u0430\u0440\u0442_\u0430\u043f\u0440\u0438\u043b_\u043c\u0430\u0458_\u0458\u0443\u043d_\u0458\u0443\u043b_\u0430\u0432\u0433\u0443\u0441\u0442_\u0441\u0435\u043f\u0442\u0435\u043c\u0431\u0430\u0440_\u043e\u043a\u0442\u043e\u0431\u0430\u0440_\u043d\u043e\u0432\u0435\u043c\u0431\u0430\u0440_\u0434\u0435\u0446\u0435\u043c\u0431\u0430\u0440".split("_"),monthsShort:"\u0458\u0430\u043d._\u0444\u0435\u0431._\u043c\u0430\u0440._\u0430\u043f\u0440._\u043c\u0430\u0458_\u0458\u0443\u043d_\u0458\u0443\u043b_\u0430\u0432\u0433._\u0441\u0435\u043f._\u043e\u043a\u0442._\u043d\u043e\u0432._\u0434\u0435\u0446.".split("_"),monthsParseExact:!0,weekdays:"\u043d\u0435\u0434\u0435\u0459\u0430_\u043f\u043e\u043d\u0435\u0434\u0435\u0459\u0430\u043a_\u0443\u0442\u043e\u0440\u0430\u043a_\u0441\u0440\u0435\u0434\u0430_\u0447\u0435\u0442\u0432\u0440\u0442\u0430\u043a_\u043f\u0435\u0442\u0430\u043a_\u0441\u0443\u0431\u043e\u0442\u0430".split("_"),weekdaysShort:"\u043d\u0435\u0434._\u043f\u043e\u043d._\u0443\u0442\u043e._\u0441\u0440\u0435._\u0447\u0435\u0442._\u043f\u0435\u0442._\u0441\u0443\u0431.".split("_"),weekdaysMin:"\u043d\u0435_\u043f\u043e_\u0443\u0442_\u0441\u0440_\u0447\u0435_\u043f\u0435_\u0441\u0443".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"H:mm",LTS:"H:mm:ss",L:"D. M. YYYY.",LL:"D. MMMM YYYY.",LLL:"D. MMMM YYYY. H:mm",LLLL:"dddd, D. MMMM YYYY. H:mm"},calendar:{sameDay:"[\u0434\u0430\u043d\u0430\u0441 \u0443] LT",nextDay:"[\u0441\u0443\u0442\u0440\u0430 \u0443] LT",nextWeek:function(){switch(this.day()){case 0:return"[\u0443] [\u043d\u0435\u0434\u0435\u0459\u0443] [\u0443] LT";case 3:return"[\u0443] [\u0441\u0440\u0435\u0434\u0443] [\u0443] LT";case 6:return"[\u0443] [\u0441\u0443\u0431\u043e\u0442\u0443] [\u0443] LT";case 1:case 2:case 4:case 5:return"[\u0443] dddd [\u0443] LT"}},lastDay:"[\u0458\u0443\u0447\u0435 \u0443] LT",lastWeek:function(){return["[\u043f\u0440\u043e\u0448\u043b\u0435] [\u043d\u0435\u0434\u0435\u0459\u0435] [\u0443] LT","[\u043f\u0440\u043e\u0448\u043b\u043e\u0433] [\u043f\u043e\u043d\u0435\u0434\u0435\u0459\u043a\u0430] [\u0443] LT","[\u043f\u0440\u043e\u0448\u043b\u043e\u0433] [\u0443\u0442\u043e\u0440\u043a\u0430] [\u0443] LT","[\u043f\u0440\u043e\u0448\u043b\u0435] [\u0441\u0440\u0435\u0434\u0435] [\u0443] LT","[\u043f\u0440\u043e\u0448\u043b\u043e\u0433] [\u0447\u0435\u0442\u0432\u0440\u0442\u043a\u0430] [\u0443] LT","[\u043f\u0440\u043e\u0448\u043b\u043e\u0433] [\u043f\u0435\u0442\u043a\u0430] [\u0443] LT","[\u043f\u0440\u043e\u0448\u043b\u0435] [\u0441\u0443\u0431\u043e\u0442\u0435] [\u0443] LT"][this.day()]},sameElse:"L"},relativeTime:{future:"\u0437\u0430 %s",past:"\u043f\u0440\u0435 %s",s:"\u043d\u0435\u043a\u043e\u043b\u0438\u043a\u043e \u0441\u0435\u043a\u0443\u043d\u0434\u0438",ss:u.translate,m:u.translate,mm:u.translate,h:u.translate,hh:u.translate,d:u.translate,dd:u.translate,M:u.translate,MM:u.translate,y:u.translate,yy:u.translate},dayOfMonthOrdinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:7}})}(i(16738))},91621:function(v,S,i){!function(r){"use strict";var u={words:{ss:["sekunda","sekunde","sekundi"],m:["jedan minut","jednog minuta"],mm:["minut","minuta","minuta"],h:["jedan sat","jednog sata"],hh:["sat","sata","sati"],d:["jedan dan","jednog dana"],dd:["dan","dana","dana"],M:["jedan mesec","jednog meseca"],MM:["mesec","meseca","meseci"],y:["jednu godinu","jedne godine"],yy:["godinu","godine","godina"]},correctGrammaticalCase:function(f,e){return f%10>=1&&f%10<=4&&(f%100<10||f%100>=20)?f%10==1?e[0]:e[1]:e[2]},translate:function(f,e,_,y){var M,T=u.words[_];return 1===_.length?"y"===_&&e?"jedna godina":y||e?T[0]:T[1]:(M=u.correctGrammaticalCase(f,T),"yy"===_&&e&&"godinu"===M?f+" godina":f+" "+M)}};r.defineLocale("sr",{months:"januar_februar_mart_april_maj_jun_jul_avgust_septembar_oktobar_novembar_decembar".split("_"),monthsShort:"jan._feb._mar._apr._maj_jun_jul_avg._sep._okt._nov._dec.".split("_"),monthsParseExact:!0,weekdays:"nedelja_ponedeljak_utorak_sreda_\u010detvrtak_petak_subota".split("_"),weekdaysShort:"ned._pon._uto._sre._\u010det._pet._sub.".split("_"),weekdaysMin:"ne_po_ut_sr_\u010de_pe_su".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"H:mm",LTS:"H:mm:ss",L:"D. M. YYYY.",LL:"D. MMMM YYYY.",LLL:"D. MMMM YYYY. H:mm",LLLL:"dddd, D. MMMM YYYY. H:mm"},calendar:{sameDay:"[danas u] LT",nextDay:"[sutra u] LT",nextWeek:function(){switch(this.day()){case 0:return"[u] [nedelju] [u] LT";case 3:return"[u] [sredu] [u] LT";case 6:return"[u] [subotu] [u] LT";case 1:case 2:case 4:case 5:return"[u] dddd [u] LT"}},lastDay:"[ju\u010de u] LT",lastWeek:function(){return["[pro\u0161le] [nedelje] [u] LT","[pro\u0161log] [ponedeljka] [u] LT","[pro\u0161log] [utorka] [u] LT","[pro\u0161le] [srede] [u] LT","[pro\u0161log] [\u010detvrtka] [u] LT","[pro\u0161log] [petka] [u] LT","[pro\u0161le] [subote] [u] LT"][this.day()]},sameElse:"L"},relativeTime:{future:"za %s",past:"pre %s",s:"nekoliko sekundi",ss:u.translate,m:u.translate,mm:u.translate,h:u.translate,hh:u.translate,d:u.translate,dd:u.translate,M:u.translate,MM:u.translate,y:u.translate,yy:u.translate},dayOfMonthOrdinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:7}})}(i(16738))},41404:function(v,S,i){!function(r){"use strict";r.defineLocale("ss",{months:"Bhimbidvwane_Indlovana_Indlov'lenkhulu_Mabasa_Inkhwekhweti_Inhlaba_Kholwane_Ingci_Inyoni_Imphala_Lweti_Ingongoni".split("_"),monthsShort:"Bhi_Ina_Inu_Mab_Ink_Inh_Kho_Igc_Iny_Imp_Lwe_Igo".split("_"),weekdays:"Lisontfo_Umsombuluko_Lesibili_Lesitsatfu_Lesine_Lesihlanu_Umgcibelo".split("_"),weekdaysShort:"Lis_Umb_Lsb_Les_Lsi_Lsh_Umg".split("_"),weekdaysMin:"Li_Us_Lb_Lt_Ls_Lh_Ug".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"h:mm A",LTS:"h:mm:ss A",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY h:mm A",LLLL:"dddd, D MMMM YYYY h:mm A"},calendar:{sameDay:"[Namuhla nga] LT",nextDay:"[Kusasa nga] LT",nextWeek:"dddd [nga] LT",lastDay:"[Itolo nga] LT",lastWeek:"dddd [leliphelile] [nga] LT",sameElse:"L"},relativeTime:{future:"nga %s",past:"wenteka nga %s",s:"emizuzwana lomcane",ss:"%d mzuzwana",m:"umzuzu",mm:"%d emizuzu",h:"lihora",hh:"%d emahora",d:"lilanga",dd:"%d emalanga",M:"inyanga",MM:"%d tinyanga",y:"umnyaka",yy:"%d iminyaka"},meridiemParse:/ekuseni|emini|entsambama|ebusuku/,meridiem:function(p,f,e){return p<11?"ekuseni":p<15?"emini":p<19?"entsambama":"ebusuku"},meridiemHour:function(p,f){return 12===p&&(p=0),"ekuseni"===f?p:"emini"===f?p>=11?p:p+12:"entsambama"===f||"ebusuku"===f?0===p?0:p+12:void 0},dayOfMonthOrdinalParse:/\d{1,2}/,ordinal:"%d",week:{dow:1,doy:4}})}(i(16738))},55685:function(v,S,i){!function(r){"use strict";r.defineLocale("sv",{months:"januari_februari_mars_april_maj_juni_juli_augusti_september_oktober_november_december".split("_"),monthsShort:"jan_feb_mar_apr_maj_jun_jul_aug_sep_okt_nov_dec".split("_"),weekdays:"s\xf6ndag_m\xe5ndag_tisdag_onsdag_torsdag_fredag_l\xf6rdag".split("_"),weekdaysShort:"s\xf6n_m\xe5n_tis_ons_tor_fre_l\xf6r".split("_"),weekdaysMin:"s\xf6_m\xe5_ti_on_to_fr_l\xf6".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"YYYY-MM-DD",LL:"D MMMM YYYY",LLL:"D MMMM YYYY [kl.] HH:mm",LLLL:"dddd D MMMM YYYY [kl.] HH:mm",lll:"D MMM YYYY HH:mm",llll:"ddd D MMM YYYY HH:mm"},calendar:{sameDay:"[Idag] LT",nextDay:"[Imorgon] LT",lastDay:"[Ig\xe5r] LT",nextWeek:"[P\xe5] dddd LT",lastWeek:"[I] dddd[s] LT",sameElse:"L"},relativeTime:{future:"om %s",past:"f\xf6r %s sedan",s:"n\xe5gra sekunder",ss:"%d sekunder",m:"en minut",mm:"%d minuter",h:"en timme",hh:"%d timmar",d:"en dag",dd:"%d dagar",M:"en m\xe5nad",MM:"%d m\xe5nader",y:"ett \xe5r",yy:"%d \xe5r"},dayOfMonthOrdinalParse:/\d{1,2}(\:e|\:a)/,ordinal:function(p){var f=p%10;return p+(1==~~(p%100/10)?":e":1===f||2===f?":a":":e")},week:{dow:1,doy:4}})}(i(16738))},3872:function(v,S,i){!function(r){"use strict";r.defineLocale("sw",{months:"Januari_Februari_Machi_Aprili_Mei_Juni_Julai_Agosti_Septemba_Oktoba_Novemba_Desemba".split("_"),monthsShort:"Jan_Feb_Mac_Apr_Mei_Jun_Jul_Ago_Sep_Okt_Nov_Des".split("_"),weekdays:"Jumapili_Jumatatu_Jumanne_Jumatano_Alhamisi_Ijumaa_Jumamosi".split("_"),weekdaysShort:"Jpl_Jtat_Jnne_Jtan_Alh_Ijm_Jmos".split("_"),weekdaysMin:"J2_J3_J4_J5_Al_Ij_J1".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"hh:mm A",LTS:"HH:mm:ss",L:"DD.MM.YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd, D MMMM YYYY HH:mm"},calendar:{sameDay:"[leo saa] LT",nextDay:"[kesho saa] LT",nextWeek:"[wiki ijayo] dddd [saat] LT",lastDay:"[jana] LT",lastWeek:"[wiki iliyopita] dddd [saat] LT",sameElse:"L"},relativeTime:{future:"%s baadaye",past:"tokea %s",s:"hivi punde",ss:"sekunde %d",m:"dakika moja",mm:"dakika %d",h:"saa limoja",hh:"masaa %d",d:"siku moja",dd:"siku %d",M:"mwezi mmoja",MM:"miezi %d",y:"mwaka mmoja",yy:"miaka %d"},week:{dow:1,doy:7}})}(i(16738))},54106:function(v,S,i){!function(r){"use strict";var u={1:"\u0be7",2:"\u0be8",3:"\u0be9",4:"\u0bea",5:"\u0beb",6:"\u0bec",7:"\u0bed",8:"\u0bee",9:"\u0bef",0:"\u0be6"},p={"\u0be7":"1","\u0be8":"2","\u0be9":"3","\u0bea":"4","\u0beb":"5","\u0bec":"6","\u0bed":"7","\u0bee":"8","\u0bef":"9","\u0be6":"0"};r.defineLocale("ta",{months:"\u0b9c\u0ba9\u0bb5\u0bb0\u0bbf_\u0baa\u0bbf\u0baa\u0bcd\u0bb0\u0bb5\u0bb0\u0bbf_\u0bae\u0bbe\u0bb0\u0bcd\u0b9a\u0bcd_\u0b8f\u0baa\u0bcd\u0bb0\u0bb2\u0bcd_\u0bae\u0bc7_\u0b9c\u0bc2\u0ba9\u0bcd_\u0b9c\u0bc2\u0bb2\u0bc8_\u0b86\u0b95\u0bb8\u0bcd\u0b9f\u0bcd_\u0b9a\u0bc6\u0baa\u0bcd\u0b9f\u0bc6\u0bae\u0bcd\u0baa\u0bb0\u0bcd_\u0b85\u0b95\u0bcd\u0b9f\u0bc7\u0bbe\u0baa\u0bb0\u0bcd_\u0ba8\u0bb5\u0bae\u0bcd\u0baa\u0bb0\u0bcd_\u0b9f\u0bbf\u0b9a\u0bae\u0bcd\u0baa\u0bb0\u0bcd".split("_"),monthsShort:"\u0b9c\u0ba9\u0bb5\u0bb0\u0bbf_\u0baa\u0bbf\u0baa\u0bcd\u0bb0\u0bb5\u0bb0\u0bbf_\u0bae\u0bbe\u0bb0\u0bcd\u0b9a\u0bcd_\u0b8f\u0baa\u0bcd\u0bb0\u0bb2\u0bcd_\u0bae\u0bc7_\u0b9c\u0bc2\u0ba9\u0bcd_\u0b9c\u0bc2\u0bb2\u0bc8_\u0b86\u0b95\u0bb8\u0bcd\u0b9f\u0bcd_\u0b9a\u0bc6\u0baa\u0bcd\u0b9f\u0bc6\u0bae\u0bcd\u0baa\u0bb0\u0bcd_\u0b85\u0b95\u0bcd\u0b9f\u0bc7\u0bbe\u0baa\u0bb0\u0bcd_\u0ba8\u0bb5\u0bae\u0bcd\u0baa\u0bb0\u0bcd_\u0b9f\u0bbf\u0b9a\u0bae\u0bcd\u0baa\u0bb0\u0bcd".split("_"),weekdays:"\u0b9e\u0bbe\u0baf\u0bbf\u0bb1\u0bcd\u0bb1\u0bc1\u0b95\u0bcd\u0b95\u0bbf\u0bb4\u0bae\u0bc8_\u0ba4\u0bbf\u0b99\u0bcd\u0b95\u0b9f\u0bcd\u0b95\u0bbf\u0bb4\u0bae\u0bc8_\u0b9a\u0bc6\u0bb5\u0bcd\u0bb5\u0bbe\u0baf\u0bcd\u0b95\u0bbf\u0bb4\u0bae\u0bc8_\u0baa\u0bc1\u0ba4\u0ba9\u0bcd\u0b95\u0bbf\u0bb4\u0bae\u0bc8_\u0bb5\u0bbf\u0baf\u0bbe\u0bb4\u0b95\u0bcd\u0b95\u0bbf\u0bb4\u0bae\u0bc8_\u0bb5\u0bc6\u0bb3\u0bcd\u0bb3\u0bbf\u0b95\u0bcd\u0b95\u0bbf\u0bb4\u0bae\u0bc8_\u0b9a\u0ba9\u0bbf\u0b95\u0bcd\u0b95\u0bbf\u0bb4\u0bae\u0bc8".split("_"),weekdaysShort:"\u0b9e\u0bbe\u0baf\u0bbf\u0bb1\u0bc1_\u0ba4\u0bbf\u0b99\u0bcd\u0b95\u0bb3\u0bcd_\u0b9a\u0bc6\u0bb5\u0bcd\u0bb5\u0bbe\u0baf\u0bcd_\u0baa\u0bc1\u0ba4\u0ba9\u0bcd_\u0bb5\u0bbf\u0baf\u0bbe\u0bb4\u0ba9\u0bcd_\u0bb5\u0bc6\u0bb3\u0bcd\u0bb3\u0bbf_\u0b9a\u0ba9\u0bbf".split("_"),weekdaysMin:"\u0b9e\u0bbe_\u0ba4\u0bbf_\u0b9a\u0bc6_\u0baa\u0bc1_\u0bb5\u0bbf_\u0bb5\u0bc6_\u0b9a".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY, HH:mm",LLLL:"dddd, D MMMM YYYY, HH:mm"},calendar:{sameDay:"[\u0b87\u0ba9\u0bcd\u0bb1\u0bc1] LT",nextDay:"[\u0ba8\u0bbe\u0bb3\u0bc8] LT",nextWeek:"dddd, LT",lastDay:"[\u0ba8\u0bc7\u0bb1\u0bcd\u0bb1\u0bc1] LT",lastWeek:"[\u0b95\u0b9f\u0ba8\u0bcd\u0ba4 \u0bb5\u0bbe\u0bb0\u0bae\u0bcd] dddd, LT",sameElse:"L"},relativeTime:{future:"%s \u0b87\u0bb2\u0bcd",past:"%s \u0bae\u0bc1\u0ba9\u0bcd",s:"\u0b92\u0bb0\u0bc1 \u0b9a\u0bbf\u0bb2 \u0bb5\u0bbf\u0ba8\u0bbe\u0b9f\u0bbf\u0b95\u0bb3\u0bcd",ss:"%d \u0bb5\u0bbf\u0ba8\u0bbe\u0b9f\u0bbf\u0b95\u0bb3\u0bcd",m:"\u0b92\u0bb0\u0bc1 \u0ba8\u0bbf\u0bae\u0bbf\u0b9f\u0bae\u0bcd",mm:"%d \u0ba8\u0bbf\u0bae\u0bbf\u0b9f\u0b99\u0bcd\u0b95\u0bb3\u0bcd",h:"\u0b92\u0bb0\u0bc1 \u0bae\u0ba3\u0bbf \u0ba8\u0bc7\u0bb0\u0bae\u0bcd",hh:"%d \u0bae\u0ba3\u0bbf \u0ba8\u0bc7\u0bb0\u0bae\u0bcd",d:"\u0b92\u0bb0\u0bc1 \u0ba8\u0bbe\u0bb3\u0bcd",dd:"%d \u0ba8\u0bbe\u0b9f\u0bcd\u0b95\u0bb3\u0bcd",M:"\u0b92\u0bb0\u0bc1 \u0bae\u0bbe\u0ba4\u0bae\u0bcd",MM:"%d \u0bae\u0bbe\u0ba4\u0b99\u0bcd\u0b95\u0bb3\u0bcd",y:"\u0b92\u0bb0\u0bc1 \u0bb5\u0bb0\u0bc1\u0b9f\u0bae\u0bcd",yy:"%d \u0b86\u0ba3\u0bcd\u0b9f\u0bc1\u0b95\u0bb3\u0bcd"},dayOfMonthOrdinalParse:/\d{1,2}\u0bb5\u0ba4\u0bc1/,ordinal:function(e){return e+"\u0bb5\u0ba4\u0bc1"},preparse:function(e){return e.replace(/[\u0be7\u0be8\u0be9\u0bea\u0beb\u0bec\u0bed\u0bee\u0bef\u0be6]/g,function(_){return p[_]})},postformat:function(e){return e.replace(/\d/g,function(_){return u[_]})},meridiemParse:/\u0baf\u0bbe\u0bae\u0bae\u0bcd|\u0bb5\u0bc8\u0b95\u0bb1\u0bc8|\u0b95\u0bbe\u0bb2\u0bc8|\u0ba8\u0ba3\u0bcd\u0baa\u0b95\u0bb2\u0bcd|\u0b8e\u0bb1\u0bcd\u0baa\u0bbe\u0b9f\u0bc1|\u0bae\u0bbe\u0bb2\u0bc8/,meridiem:function(e,_,y){return e<2?" \u0baf\u0bbe\u0bae\u0bae\u0bcd":e<6?" \u0bb5\u0bc8\u0b95\u0bb1\u0bc8":e<10?" \u0b95\u0bbe\u0bb2\u0bc8":e<14?" \u0ba8\u0ba3\u0bcd\u0baa\u0b95\u0bb2\u0bcd":e<18?" \u0b8e\u0bb1\u0bcd\u0baa\u0bbe\u0b9f\u0bc1":e<22?" \u0bae\u0bbe\u0bb2\u0bc8":" \u0baf\u0bbe\u0bae\u0bae\u0bcd"},meridiemHour:function(e,_){return 12===e&&(e=0),"\u0baf\u0bbe\u0bae\u0bae\u0bcd"===_?e<2?e:e+12:"\u0bb5\u0bc8\u0b95\u0bb1\u0bc8"===_||"\u0b95\u0bbe\u0bb2\u0bc8"===_||"\u0ba8\u0ba3\u0bcd\u0baa\u0b95\u0bb2\u0bcd"===_&&e>=10?e:e+12},week:{dow:0,doy:6}})}(i(16738))},39204:function(v,S,i){!function(r){"use strict";r.defineLocale("te",{months:"\u0c1c\u0c28\u0c35\u0c30\u0c3f_\u0c2b\u0c3f\u0c2c\u0c4d\u0c30\u0c35\u0c30\u0c3f_\u0c2e\u0c3e\u0c30\u0c4d\u0c1a\u0c3f_\u0c0f\u0c2a\u0c4d\u0c30\u0c3f\u0c32\u0c4d_\u0c2e\u0c47_\u0c1c\u0c42\u0c28\u0c4d_\u0c1c\u0c41\u0c32\u0c48_\u0c06\u0c17\u0c38\u0c4d\u0c1f\u0c41_\u0c38\u0c46\u0c2a\u0c4d\u0c1f\u0c46\u0c02\u0c2c\u0c30\u0c4d_\u0c05\u0c15\u0c4d\u0c1f\u0c4b\u0c2c\u0c30\u0c4d_\u0c28\u0c35\u0c02\u0c2c\u0c30\u0c4d_\u0c21\u0c3f\u0c38\u0c46\u0c02\u0c2c\u0c30\u0c4d".split("_"),monthsShort:"\u0c1c\u0c28._\u0c2b\u0c3f\u0c2c\u0c4d\u0c30._\u0c2e\u0c3e\u0c30\u0c4d\u0c1a\u0c3f_\u0c0f\u0c2a\u0c4d\u0c30\u0c3f._\u0c2e\u0c47_\u0c1c\u0c42\u0c28\u0c4d_\u0c1c\u0c41\u0c32\u0c48_\u0c06\u0c17._\u0c38\u0c46\u0c2a\u0c4d._\u0c05\u0c15\u0c4d\u0c1f\u0c4b._\u0c28\u0c35._\u0c21\u0c3f\u0c38\u0c46.".split("_"),monthsParseExact:!0,weekdays:"\u0c06\u0c26\u0c3f\u0c35\u0c3e\u0c30\u0c02_\u0c38\u0c4b\u0c2e\u0c35\u0c3e\u0c30\u0c02_\u0c2e\u0c02\u0c17\u0c33\u0c35\u0c3e\u0c30\u0c02_\u0c2c\u0c41\u0c27\u0c35\u0c3e\u0c30\u0c02_\u0c17\u0c41\u0c30\u0c41\u0c35\u0c3e\u0c30\u0c02_\u0c36\u0c41\u0c15\u0c4d\u0c30\u0c35\u0c3e\u0c30\u0c02_\u0c36\u0c28\u0c3f\u0c35\u0c3e\u0c30\u0c02".split("_"),weekdaysShort:"\u0c06\u0c26\u0c3f_\u0c38\u0c4b\u0c2e_\u0c2e\u0c02\u0c17\u0c33_\u0c2c\u0c41\u0c27_\u0c17\u0c41\u0c30\u0c41_\u0c36\u0c41\u0c15\u0c4d\u0c30_\u0c36\u0c28\u0c3f".split("_"),weekdaysMin:"\u0c06_\u0c38\u0c4b_\u0c2e\u0c02_\u0c2c\u0c41_\u0c17\u0c41_\u0c36\u0c41_\u0c36".split("_"),longDateFormat:{LT:"A h:mm",LTS:"A h:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY, A h:mm",LLLL:"dddd, D MMMM YYYY, A h:mm"},calendar:{sameDay:"[\u0c28\u0c47\u0c21\u0c41] LT",nextDay:"[\u0c30\u0c47\u0c2a\u0c41] LT",nextWeek:"dddd, LT",lastDay:"[\u0c28\u0c3f\u0c28\u0c4d\u0c28] LT",lastWeek:"[\u0c17\u0c24] dddd, LT",sameElse:"L"},relativeTime:{future:"%s \u0c32\u0c4b",past:"%s \u0c15\u0c4d\u0c30\u0c3f\u0c24\u0c02",s:"\u0c15\u0c4a\u0c28\u0c4d\u0c28\u0c3f \u0c15\u0c4d\u0c37\u0c23\u0c3e\u0c32\u0c41",ss:"%d \u0c38\u0c46\u0c15\u0c28\u0c4d\u0c32\u0c41",m:"\u0c12\u0c15 \u0c28\u0c3f\u0c2e\u0c3f\u0c37\u0c02",mm:"%d \u0c28\u0c3f\u0c2e\u0c3f\u0c37\u0c3e\u0c32\u0c41",h:"\u0c12\u0c15 \u0c17\u0c02\u0c1f",hh:"%d \u0c17\u0c02\u0c1f\u0c32\u0c41",d:"\u0c12\u0c15 \u0c30\u0c4b\u0c1c\u0c41",dd:"%d \u0c30\u0c4b\u0c1c\u0c41\u0c32\u0c41",M:"\u0c12\u0c15 \u0c28\u0c46\u0c32",MM:"%d \u0c28\u0c46\u0c32\u0c32\u0c41",y:"\u0c12\u0c15 \u0c38\u0c02\u0c35\u0c24\u0c4d\u0c38\u0c30\u0c02",yy:"%d \u0c38\u0c02\u0c35\u0c24\u0c4d\u0c38\u0c30\u0c3e\u0c32\u0c41"},dayOfMonthOrdinalParse:/\d{1,2}\u0c35/,ordinal:"%d\u0c35",meridiemParse:/\u0c30\u0c3e\u0c24\u0c4d\u0c30\u0c3f|\u0c09\u0c26\u0c2f\u0c02|\u0c2e\u0c27\u0c4d\u0c2f\u0c3e\u0c39\u0c4d\u0c28\u0c02|\u0c38\u0c3e\u0c2f\u0c02\u0c24\u0c4d\u0c30\u0c02/,meridiemHour:function(p,f){return 12===p&&(p=0),"\u0c30\u0c3e\u0c24\u0c4d\u0c30\u0c3f"===f?p<4?p:p+12:"\u0c09\u0c26\u0c2f\u0c02"===f?p:"\u0c2e\u0c27\u0c4d\u0c2f\u0c3e\u0c39\u0c4d\u0c28\u0c02"===f?p>=10?p:p+12:"\u0c38\u0c3e\u0c2f\u0c02\u0c24\u0c4d\u0c30\u0c02"===f?p+12:void 0},meridiem:function(p,f,e){return p<4?"\u0c30\u0c3e\u0c24\u0c4d\u0c30\u0c3f":p<10?"\u0c09\u0c26\u0c2f\u0c02":p<17?"\u0c2e\u0c27\u0c4d\u0c2f\u0c3e\u0c39\u0c4d\u0c28\u0c02":p<20?"\u0c38\u0c3e\u0c2f\u0c02\u0c24\u0c4d\u0c30\u0c02":"\u0c30\u0c3e\u0c24\u0c4d\u0c30\u0c3f"},week:{dow:0,doy:6}})}(i(16738))},83692:function(v,S,i){!function(r){"use strict";r.defineLocale("tet",{months:"Janeiru_Fevereiru_Marsu_Abril_Maiu_Ju\xf1u_Jullu_Agustu_Setembru_Outubru_Novembru_Dezembru".split("_"),monthsShort:"Jan_Fev_Mar_Abr_Mai_Jun_Jul_Ago_Set_Out_Nov_Dez".split("_"),weekdays:"Domingu_Segunda_Tersa_Kuarta_Kinta_Sesta_Sabadu".split("_"),weekdaysShort:"Dom_Seg_Ters_Kua_Kint_Sest_Sab".split("_"),weekdaysMin:"Do_Seg_Te_Ku_Ki_Ses_Sa".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd, D MMMM YYYY HH:mm"},calendar:{sameDay:"[Ohin iha] LT",nextDay:"[Aban iha] LT",nextWeek:"dddd [iha] LT",lastDay:"[Horiseik iha] LT",lastWeek:"dddd [semana kotuk] [iha] LT",sameElse:"L"},relativeTime:{future:"iha %s",past:"%s liuba",s:"segundu balun",ss:"segundu %d",m:"minutu ida",mm:"minutu %d",h:"oras ida",hh:"oras %d",d:"loron ida",dd:"loron %d",M:"fulan ida",MM:"fulan %d",y:"tinan ida",yy:"tinan %d"},dayOfMonthOrdinalParse:/\d{1,2}(st|nd|rd|th)/,ordinal:function(p){var f=p%10;return p+(1==~~(p%100/10)?"th":1===f?"st":2===f?"nd":3===f?"rd":"th")},week:{dow:1,doy:4}})}(i(16738))},86361:function(v,S,i){!function(r){"use strict";var u={0:"-\u0443\u043c",1:"-\u0443\u043c",2:"-\u044e\u043c",3:"-\u044e\u043c",4:"-\u0443\u043c",5:"-\u0443\u043c",6:"-\u0443\u043c",7:"-\u0443\u043c",8:"-\u0443\u043c",9:"-\u0443\u043c",10:"-\u0443\u043c",12:"-\u0443\u043c",13:"-\u0443\u043c",20:"-\u0443\u043c",30:"-\u044e\u043c",40:"-\u0443\u043c",50:"-\u0443\u043c",60:"-\u0443\u043c",70:"-\u0443\u043c",80:"-\u0443\u043c",90:"-\u0443\u043c",100:"-\u0443\u043c"};r.defineLocale("tg",{months:{format:"\u044f\u043d\u0432\u0430\u0440\u0438_\u0444\u0435\u0432\u0440\u0430\u043b\u0438_\u043c\u0430\u0440\u0442\u0438_\u0430\u043f\u0440\u0435\u043b\u0438_\u043c\u0430\u0439\u0438_\u0438\u044e\u043d\u0438_\u0438\u044e\u043b\u0438_\u0430\u0432\u0433\u0443\u0441\u0442\u0438_\u0441\u0435\u043d\u0442\u044f\u0431\u0440\u0438_\u043e\u043a\u0442\u044f\u0431\u0440\u0438_\u043d\u043e\u044f\u0431\u0440\u0438_\u0434\u0435\u043a\u0430\u0431\u0440\u0438".split("_"),standalone:"\u044f\u043d\u0432\u0430\u0440_\u0444\u0435\u0432\u0440\u0430\u043b_\u043c\u0430\u0440\u0442_\u0430\u043f\u0440\u0435\u043b_\u043c\u0430\u0439_\u0438\u044e\u043d_\u0438\u044e\u043b_\u0430\u0432\u0433\u0443\u0441\u0442_\u0441\u0435\u043d\u0442\u044f\u0431\u0440_\u043e\u043a\u0442\u044f\u0431\u0440_\u043d\u043e\u044f\u0431\u0440_\u0434\u0435\u043a\u0430\u0431\u0440".split("_")},monthsShort:"\u044f\u043d\u0432_\u0444\u0435\u0432_\u043c\u0430\u0440_\u0430\u043f\u0440_\u043c\u0430\u0439_\u0438\u044e\u043d_\u0438\u044e\u043b_\u0430\u0432\u0433_\u0441\u0435\u043d_\u043e\u043a\u0442_\u043d\u043e\u044f_\u0434\u0435\u043a".split("_"),weekdays:"\u044f\u043a\u0448\u0430\u043d\u0431\u0435_\u0434\u0443\u0448\u0430\u043d\u0431\u0435_\u0441\u0435\u0448\u0430\u043d\u0431\u0435_\u0447\u043e\u0440\u0448\u0430\u043d\u0431\u0435_\u043f\u0430\u043d\u04b7\u0448\u0430\u043d\u0431\u0435_\u04b7\u0443\u043c\u044a\u0430_\u0448\u0430\u043d\u0431\u0435".split("_"),weekdaysShort:"\u044f\u0448\u0431_\u0434\u0448\u0431_\u0441\u0448\u0431_\u0447\u0448\u0431_\u043f\u0448\u0431_\u04b7\u0443\u043c_\u0448\u043d\u0431".split("_"),weekdaysMin:"\u044f\u0448_\u0434\u0448_\u0441\u0448_\u0447\u0448_\u043f\u0448_\u04b7\u043c_\u0448\u0431".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD.MM.YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd, D MMMM YYYY HH:mm"},calendar:{sameDay:"[\u0418\u043c\u0440\u04ef\u0437 \u0441\u043e\u0430\u0442\u0438] LT",nextDay:"[\u0424\u0430\u0440\u0434\u043e \u0441\u043e\u0430\u0442\u0438] LT",lastDay:"[\u0414\u0438\u0440\u04ef\u0437 \u0441\u043e\u0430\u0442\u0438] LT",nextWeek:"dddd[\u0438] [\u04b3\u0430\u0444\u0442\u0430\u0438 \u043e\u044f\u043d\u0434\u0430 \u0441\u043e\u0430\u0442\u0438] LT",lastWeek:"dddd[\u0438] [\u04b3\u0430\u0444\u0442\u0430\u0438 \u0433\u0443\u0437\u0430\u0448\u0442\u0430 \u0441\u043e\u0430\u0442\u0438] LT",sameElse:"L"},relativeTime:{future:"\u0431\u0430\u044a\u0434\u0438 %s",past:"%s \u043f\u0435\u0448",s:"\u044f\u043a\u0447\u0430\u043d\u0434 \u0441\u043e\u043d\u0438\u044f",m:"\u044f\u043a \u0434\u0430\u049b\u0438\u049b\u0430",mm:"%d \u0434\u0430\u049b\u0438\u049b\u0430",h:"\u044f\u043a \u0441\u043e\u0430\u0442",hh:"%d \u0441\u043e\u0430\u0442",d:"\u044f\u043a \u0440\u04ef\u0437",dd:"%d \u0440\u04ef\u0437",M:"\u044f\u043a \u043c\u043e\u04b3",MM:"%d \u043c\u043e\u04b3",y:"\u044f\u043a \u0441\u043e\u043b",yy:"%d \u0441\u043e\u043b"},meridiemParse:/\u0448\u0430\u0431|\u0441\u0443\u0431\u04b3|\u0440\u04ef\u0437|\u0431\u0435\u0433\u043e\u04b3/,meridiemHour:function(f,e){return 12===f&&(f=0),"\u0448\u0430\u0431"===e?f<4?f:f+12:"\u0441\u0443\u0431\u04b3"===e?f:"\u0440\u04ef\u0437"===e?f>=11?f:f+12:"\u0431\u0435\u0433\u043e\u04b3"===e?f+12:void 0},meridiem:function(f,e,_){return f<4?"\u0448\u0430\u0431":f<11?"\u0441\u0443\u0431\u04b3":f<16?"\u0440\u04ef\u0437":f<19?"\u0431\u0435\u0433\u043e\u04b3":"\u0448\u0430\u0431"},dayOfMonthOrdinalParse:/\d{1,2}-(\u0443\u043c|\u044e\u043c)/,ordinal:function(f){return f+(u[f]||u[f%10]||u[f>=100?100:null])},week:{dow:1,doy:7}})}(i(16738))},31735:function(v,S,i){!function(r){"use strict";r.defineLocale("th",{months:"\u0e21\u0e01\u0e23\u0e32\u0e04\u0e21_\u0e01\u0e38\u0e21\u0e20\u0e32\u0e1e\u0e31\u0e19\u0e18\u0e4c_\u0e21\u0e35\u0e19\u0e32\u0e04\u0e21_\u0e40\u0e21\u0e29\u0e32\u0e22\u0e19_\u0e1e\u0e24\u0e29\u0e20\u0e32\u0e04\u0e21_\u0e21\u0e34\u0e16\u0e38\u0e19\u0e32\u0e22\u0e19_\u0e01\u0e23\u0e01\u0e0e\u0e32\u0e04\u0e21_\u0e2a\u0e34\u0e07\u0e2b\u0e32\u0e04\u0e21_\u0e01\u0e31\u0e19\u0e22\u0e32\u0e22\u0e19_\u0e15\u0e38\u0e25\u0e32\u0e04\u0e21_\u0e1e\u0e24\u0e28\u0e08\u0e34\u0e01\u0e32\u0e22\u0e19_\u0e18\u0e31\u0e19\u0e27\u0e32\u0e04\u0e21".split("_"),monthsShort:"\u0e21.\u0e04._\u0e01.\u0e1e._\u0e21\u0e35.\u0e04._\u0e40\u0e21.\u0e22._\u0e1e.\u0e04._\u0e21\u0e34.\u0e22._\u0e01.\u0e04._\u0e2a.\u0e04._\u0e01.\u0e22._\u0e15.\u0e04._\u0e1e.\u0e22._\u0e18.\u0e04.".split("_"),monthsParseExact:!0,weekdays:"\u0e2d\u0e32\u0e17\u0e34\u0e15\u0e22\u0e4c_\u0e08\u0e31\u0e19\u0e17\u0e23\u0e4c_\u0e2d\u0e31\u0e07\u0e04\u0e32\u0e23_\u0e1e\u0e38\u0e18_\u0e1e\u0e24\u0e2b\u0e31\u0e2a\u0e1a\u0e14\u0e35_\u0e28\u0e38\u0e01\u0e23\u0e4c_\u0e40\u0e2a\u0e32\u0e23\u0e4c".split("_"),weekdaysShort:"\u0e2d\u0e32\u0e17\u0e34\u0e15\u0e22\u0e4c_\u0e08\u0e31\u0e19\u0e17\u0e23\u0e4c_\u0e2d\u0e31\u0e07\u0e04\u0e32\u0e23_\u0e1e\u0e38\u0e18_\u0e1e\u0e24\u0e2b\u0e31\u0e2a_\u0e28\u0e38\u0e01\u0e23\u0e4c_\u0e40\u0e2a\u0e32\u0e23\u0e4c".split("_"),weekdaysMin:"\u0e2d\u0e32._\u0e08._\u0e2d._\u0e1e._\u0e1e\u0e24._\u0e28._\u0e2a.".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"H:mm",LTS:"H:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY \u0e40\u0e27\u0e25\u0e32 H:mm",LLLL:"\u0e27\u0e31\u0e19dddd\u0e17\u0e35\u0e48 D MMMM YYYY \u0e40\u0e27\u0e25\u0e32 H:mm"},meridiemParse:/\u0e01\u0e48\u0e2d\u0e19\u0e40\u0e17\u0e35\u0e48\u0e22\u0e07|\u0e2b\u0e25\u0e31\u0e07\u0e40\u0e17\u0e35\u0e48\u0e22\u0e07/,isPM:function(p){return"\u0e2b\u0e25\u0e31\u0e07\u0e40\u0e17\u0e35\u0e48\u0e22\u0e07"===p},meridiem:function(p,f,e){return p<12?"\u0e01\u0e48\u0e2d\u0e19\u0e40\u0e17\u0e35\u0e48\u0e22\u0e07":"\u0e2b\u0e25\u0e31\u0e07\u0e40\u0e17\u0e35\u0e48\u0e22\u0e07"},calendar:{sameDay:"[\u0e27\u0e31\u0e19\u0e19\u0e35\u0e49 \u0e40\u0e27\u0e25\u0e32] LT",nextDay:"[\u0e1e\u0e23\u0e38\u0e48\u0e07\u0e19\u0e35\u0e49 \u0e40\u0e27\u0e25\u0e32] LT",nextWeek:"dddd[\u0e2b\u0e19\u0e49\u0e32 \u0e40\u0e27\u0e25\u0e32] LT",lastDay:"[\u0e40\u0e21\u0e37\u0e48\u0e2d\u0e27\u0e32\u0e19\u0e19\u0e35\u0e49 \u0e40\u0e27\u0e25\u0e32] LT",lastWeek:"[\u0e27\u0e31\u0e19]dddd[\u0e17\u0e35\u0e48\u0e41\u0e25\u0e49\u0e27 \u0e40\u0e27\u0e25\u0e32] LT",sameElse:"L"},relativeTime:{future:"\u0e2d\u0e35\u0e01 %s",past:"%s\u0e17\u0e35\u0e48\u0e41\u0e25\u0e49\u0e27",s:"\u0e44\u0e21\u0e48\u0e01\u0e35\u0e48\u0e27\u0e34\u0e19\u0e32\u0e17\u0e35",ss:"%d \u0e27\u0e34\u0e19\u0e32\u0e17\u0e35",m:"1 \u0e19\u0e32\u0e17\u0e35",mm:"%d \u0e19\u0e32\u0e17\u0e35",h:"1 \u0e0a\u0e31\u0e48\u0e27\u0e42\u0e21\u0e07",hh:"%d \u0e0a\u0e31\u0e48\u0e27\u0e42\u0e21\u0e07",d:"1 \u0e27\u0e31\u0e19",dd:"%d \u0e27\u0e31\u0e19",w:"1 \u0e2a\u0e31\u0e1b\u0e14\u0e32\u0e2b\u0e4c",ww:"%d \u0e2a\u0e31\u0e1b\u0e14\u0e32\u0e2b\u0e4c",M:"1 \u0e40\u0e14\u0e37\u0e2d\u0e19",MM:"%d \u0e40\u0e14\u0e37\u0e2d\u0e19",y:"1 \u0e1b\u0e35",yy:"%d \u0e1b\u0e35"}})}(i(16738))},1568:function(v,S,i){!function(r){"use strict";var u={1:"'inji",5:"'inji",8:"'inji",70:"'inji",80:"'inji",2:"'nji",7:"'nji",20:"'nji",50:"'nji",3:"'\xfcnji",4:"'\xfcnji",100:"'\xfcnji",6:"'njy",9:"'unjy",10:"'unjy",30:"'unjy",60:"'ynjy",90:"'ynjy"};r.defineLocale("tk",{months:"\xddanwar_Fewral_Mart_Aprel_Ma\xfd_I\xfdun_I\xfdul_Awgust_Sent\xfdabr_Okt\xfdabr_No\xfdabr_Dekabr".split("_"),monthsShort:"\xddan_Few_Mar_Apr_Ma\xfd_I\xfdn_I\xfdl_Awg_Sen_Okt_No\xfd_Dek".split("_"),weekdays:"\xddek\u015fenbe_Du\u015fenbe_Si\u015fenbe_\xc7ar\u015fenbe_Pen\u015fenbe_Anna_\u015eenbe".split("_"),weekdaysShort:"\xddek_Du\u015f_Si\u015f_\xc7ar_Pen_Ann_\u015een".split("_"),weekdaysMin:"\xddk_D\u015f_S\u015f_\xc7r_Pn_An_\u015en".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD.MM.YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd, D MMMM YYYY HH:mm"},calendar:{sameDay:"[bug\xfcn sagat] LT",nextDay:"[ertir sagat] LT",nextWeek:"[indiki] dddd [sagat] LT",lastDay:"[d\xfc\xfdn] LT",lastWeek:"[ge\xe7en] dddd [sagat] LT",sameElse:"L"},relativeTime:{future:"%s so\u0148",past:"%s \xf6\u0148",s:"birn\xe4\xe7e sekunt",m:"bir minut",mm:"%d minut",h:"bir sagat",hh:"%d sagat",d:"bir g\xfcn",dd:"%d g\xfcn",M:"bir a\xfd",MM:"%d a\xfd",y:"bir \xfdyl",yy:"%d \xfdyl"},ordinal:function(f,e){switch(e){case"d":case"D":case"Do":case"DD":return f;default:if(0===f)return f+"'unjy";var _=f%10;return f+(u[_]||u[f%100-_]||u[f>=100?100:null])}},week:{dow:1,doy:7}})}(i(16738))},96129:function(v,S,i){!function(r){"use strict";r.defineLocale("tl-ph",{months:"Enero_Pebrero_Marso_Abril_Mayo_Hunyo_Hulyo_Agosto_Setyembre_Oktubre_Nobyembre_Disyembre".split("_"),monthsShort:"Ene_Peb_Mar_Abr_May_Hun_Hul_Ago_Set_Okt_Nob_Dis".split("_"),weekdays:"Linggo_Lunes_Martes_Miyerkules_Huwebes_Biyernes_Sabado".split("_"),weekdaysShort:"Lin_Lun_Mar_Miy_Huw_Biy_Sab".split("_"),weekdaysMin:"Li_Lu_Ma_Mi_Hu_Bi_Sab".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"MM/D/YYYY",LL:"MMMM D, YYYY",LLL:"MMMM D, YYYY HH:mm",LLLL:"dddd, MMMM DD, YYYY HH:mm"},calendar:{sameDay:"LT [ngayong araw]",nextDay:"[Bukas ng] LT",nextWeek:"LT [sa susunod na] dddd",lastDay:"LT [kahapon]",lastWeek:"LT [noong nakaraang] dddd",sameElse:"L"},relativeTime:{future:"sa loob ng %s",past:"%s ang nakalipas",s:"ilang segundo",ss:"%d segundo",m:"isang minuto",mm:"%d minuto",h:"isang oras",hh:"%d oras",d:"isang araw",dd:"%d araw",M:"isang buwan",MM:"%d buwan",y:"isang taon",yy:"%d taon"},dayOfMonthOrdinalParse:/\d{1,2}/,ordinal:function(p){return p},week:{dow:1,doy:4}})}(i(16738))},13759:function(v,S,i){!function(r){"use strict";var u="pagh_wa\u2019_cha\u2019_wej_loS_vagh_jav_Soch_chorgh_Hut".split("_");function e(T,M,R,F){var Z=function(T){var M=Math.floor(T%1e3/100),R=Math.floor(T%100/10),F=T%10,Z="";return M>0&&(Z+=u[M]+"vatlh"),R>0&&(Z+=(""!==Z?" ":"")+u[R]+"maH"),F>0&&(Z+=(""!==Z?" ":"")+u[F]),""===Z?"pagh":Z}(T);switch(R){case"ss":return Z+" lup";case"mm":return Z+" tup";case"hh":return Z+" rep";case"dd":return Z+" jaj";case"MM":return Z+" jar";case"yy":return Z+" DIS"}}r.defineLocale("tlh",{months:"tera\u2019 jar wa\u2019_tera\u2019 jar cha\u2019_tera\u2019 jar wej_tera\u2019 jar loS_tera\u2019 jar vagh_tera\u2019 jar jav_tera\u2019 jar Soch_tera\u2019 jar chorgh_tera\u2019 jar Hut_tera\u2019 jar wa\u2019maH_tera\u2019 jar wa\u2019maH wa\u2019_tera\u2019 jar wa\u2019maH cha\u2019".split("_"),monthsShort:"jar wa\u2019_jar cha\u2019_jar wej_jar loS_jar vagh_jar jav_jar Soch_jar chorgh_jar Hut_jar wa\u2019maH_jar wa\u2019maH wa\u2019_jar wa\u2019maH cha\u2019".split("_"),monthsParseExact:!0,weekdays:"lojmItjaj_DaSjaj_povjaj_ghItlhjaj_loghjaj_buqjaj_ghInjaj".split("_"),weekdaysShort:"lojmItjaj_DaSjaj_povjaj_ghItlhjaj_loghjaj_buqjaj_ghInjaj".split("_"),weekdaysMin:"lojmItjaj_DaSjaj_povjaj_ghItlhjaj_loghjaj_buqjaj_ghInjaj".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD.MM.YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd, D MMMM YYYY HH:mm"},calendar:{sameDay:"[DaHjaj] LT",nextDay:"[wa\u2019leS] LT",nextWeek:"LLL",lastDay:"[wa\u2019Hu\u2019] LT",lastWeek:"LLL",sameElse:"L"},relativeTime:{future:function(T){var M=T;return-1!==T.indexOf("jaj")?M.slice(0,-3)+"leS":-1!==T.indexOf("jar")?M.slice(0,-3)+"waQ":-1!==T.indexOf("DIS")?M.slice(0,-3)+"nem":M+" pIq"},past:function(T){var M=T;return-1!==T.indexOf("jaj")?M.slice(0,-3)+"Hu\u2019":-1!==T.indexOf("jar")?M.slice(0,-3)+"wen":-1!==T.indexOf("DIS")?M.slice(0,-3)+"ben":M+" ret"},s:"puS lup",ss:e,m:"wa\u2019 tup",mm:e,h:"wa\u2019 rep",hh:e,d:"wa\u2019 jaj",dd:e,M:"wa\u2019 jar",MM:e,y:"wa\u2019 DIS",yy:e},dayOfMonthOrdinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:4}})}(i(16738))},81644:function(v,S,i){!function(r){"use strict";var u={1:"'inci",5:"'inci",8:"'inci",70:"'inci",80:"'inci",2:"'nci",7:"'nci",20:"'nci",50:"'nci",3:"'\xfcnc\xfc",4:"'\xfcnc\xfc",100:"'\xfcnc\xfc",6:"'nc\u0131",9:"'uncu",10:"'uncu",30:"'uncu",60:"'\u0131nc\u0131",90:"'\u0131nc\u0131"};r.defineLocale("tr",{months:"Ocak_\u015eubat_Mart_Nisan_May\u0131s_Haziran_Temmuz_A\u011fustos_Eyl\xfcl_Ekim_Kas\u0131m_Aral\u0131k".split("_"),monthsShort:"Oca_\u015eub_Mar_Nis_May_Haz_Tem_A\u011fu_Eyl_Eki_Kas_Ara".split("_"),weekdays:"Pazar_Pazartesi_Sal\u0131_\xc7ar\u015famba_Per\u015fembe_Cuma_Cumartesi".split("_"),weekdaysShort:"Paz_Pzt_Sal_\xc7ar_Per_Cum_Cmt".split("_"),weekdaysMin:"Pz_Pt_Sa_\xc7a_Pe_Cu_Ct".split("_"),meridiem:function(f,e,_){return f<12?_?"\xf6\xf6":"\xd6\xd6":_?"\xf6s":"\xd6S"},meridiemParse:/\xf6\xf6|\xd6\xd6|\xf6s|\xd6S/,isPM:function(f){return"\xf6s"===f||"\xd6S"===f},longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD.MM.YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd, D MMMM YYYY HH:mm"},calendar:{sameDay:"[bug\xfcn saat] LT",nextDay:"[yar\u0131n saat] LT",nextWeek:"[gelecek] dddd [saat] LT",lastDay:"[d\xfcn] LT",lastWeek:"[ge\xe7en] dddd [saat] LT",sameElse:"L"},relativeTime:{future:"%s sonra",past:"%s \xf6nce",s:"birka\xe7 saniye",ss:"%d saniye",m:"bir dakika",mm:"%d dakika",h:"bir saat",hh:"%d saat",d:"bir g\xfcn",dd:"%d g\xfcn",w:"bir hafta",ww:"%d hafta",M:"bir ay",MM:"%d ay",y:"bir y\u0131l",yy:"%d y\u0131l"},ordinal:function(f,e){switch(e){case"d":case"D":case"Do":case"DD":return f;default:if(0===f)return f+"'\u0131nc\u0131";var _=f%10;return f+(u[_]||u[f%100-_]||u[f>=100?100:null])}},week:{dow:1,doy:7}})}(i(16738))},90875:function(v,S,i){!function(r){"use strict";function p(f,e,_,y){var T={s:["viensas secunds","'iensas secunds"],ss:[f+" secunds",f+" secunds"],m:["'n m\xedut","'iens m\xedut"],mm:[f+" m\xeduts",f+" m\xeduts"],h:["'n \xfeora","'iensa \xfeora"],hh:[f+" \xfeoras",f+" \xfeoras"],d:["'n ziua","'iensa ziua"],dd:[f+" ziuas",f+" ziuas"],M:["'n mes","'iens mes"],MM:[f+" mesen",f+" mesen"],y:["'n ar","'iens ar"],yy:[f+" ars",f+" ars"]};return y||e?T[_][0]:T[_][1]}r.defineLocale("tzl",{months:"Januar_Fevraglh_Mar\xe7_Avr\xefu_Mai_G\xfcn_Julia_Guscht_Setemvar_Listop\xe4ts_Noemvar_Zecemvar".split("_"),monthsShort:"Jan_Fev_Mar_Avr_Mai_G\xfcn_Jul_Gus_Set_Lis_Noe_Zec".split("_"),weekdays:"S\xfaladi_L\xfane\xe7i_Maitzi_M\xe1rcuri_Xh\xfaadi_Vi\xe9ner\xe7i_S\xe1turi".split("_"),weekdaysShort:"S\xfal_L\xfan_Mai_M\xe1r_Xh\xfa_Vi\xe9_S\xe1t".split("_"),weekdaysMin:"S\xfa_L\xfa_Ma_M\xe1_Xh_Vi_S\xe1".split("_"),longDateFormat:{LT:"HH.mm",LTS:"HH.mm.ss",L:"DD.MM.YYYY",LL:"D. MMMM [dallas] YYYY",LLL:"D. MMMM [dallas] YYYY HH.mm",LLLL:"dddd, [li] D. MMMM [dallas] YYYY HH.mm"},meridiemParse:/d\'o|d\'a/i,isPM:function(f){return"d'o"===f.toLowerCase()},meridiem:function(f,e,_){return f>11?_?"d'o":"D'O":_?"d'a":"D'A"},calendar:{sameDay:"[oxhi \xe0] LT",nextDay:"[dem\xe0 \xe0] LT",nextWeek:"dddd [\xe0] LT",lastDay:"[ieiri \xe0] LT",lastWeek:"[s\xfcr el] dddd [lasteu \xe0] LT",sameElse:"L"},relativeTime:{future:"osprei %s",past:"ja%s",s:p,ss:p,m:p,mm:p,h:p,hh:p,d:p,dd:p,M:p,MM:p,y:p,yy:p},dayOfMonthOrdinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:4}})}(i(16738))},11041:function(v,S,i){!function(r){"use strict";r.defineLocale("tzm-latn",{months:"innayr_br\u02e4ayr\u02e4_mar\u02e4s\u02e4_ibrir_mayyw_ywnyw_ywlywz_\u0263w\u0161t_\u0161wtanbir_kt\u02e4wbr\u02e4_nwwanbir_dwjnbir".split("_"),monthsShort:"innayr_br\u02e4ayr\u02e4_mar\u02e4s\u02e4_ibrir_mayyw_ywnyw_ywlywz_\u0263w\u0161t_\u0161wtanbir_kt\u02e4wbr\u02e4_nwwanbir_dwjnbir".split("_"),weekdays:"asamas_aynas_asinas_akras_akwas_asimwas_asi\u1e0dyas".split("_"),weekdaysShort:"asamas_aynas_asinas_akras_akwas_asimwas_asi\u1e0dyas".split("_"),weekdaysMin:"asamas_aynas_asinas_akras_akwas_asimwas_asi\u1e0dyas".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd D MMMM YYYY HH:mm"},calendar:{sameDay:"[asdkh g] LT",nextDay:"[aska g] LT",nextWeek:"dddd [g] LT",lastDay:"[assant g] LT",lastWeek:"dddd [g] LT",sameElse:"L"},relativeTime:{future:"dadkh s yan %s",past:"yan %s",s:"imik",ss:"%d imik",m:"minu\u1e0d",mm:"%d minu\u1e0d",h:"sa\u025ba",hh:"%d tassa\u025bin",d:"ass",dd:"%d ossan",M:"ayowr",MM:"%d iyyirn",y:"asgas",yy:"%d isgasn"},week:{dow:6,doy:12}})}(i(16738))},16878:function(v,S,i){!function(r){"use strict";r.defineLocale("tzm",{months:"\u2d49\u2d4f\u2d4f\u2d30\u2d62\u2d54_\u2d31\u2d55\u2d30\u2d62\u2d55_\u2d4e\u2d30\u2d55\u2d5a_\u2d49\u2d31\u2d54\u2d49\u2d54_\u2d4e\u2d30\u2d62\u2d62\u2d53_\u2d62\u2d53\u2d4f\u2d62\u2d53_\u2d62\u2d53\u2d4d\u2d62\u2d53\u2d63_\u2d56\u2d53\u2d5b\u2d5c_\u2d5b\u2d53\u2d5c\u2d30\u2d4f\u2d31\u2d49\u2d54_\u2d3d\u2d5f\u2d53\u2d31\u2d55_\u2d4f\u2d53\u2d61\u2d30\u2d4f\u2d31\u2d49\u2d54_\u2d37\u2d53\u2d4a\u2d4f\u2d31\u2d49\u2d54".split("_"),monthsShort:"\u2d49\u2d4f\u2d4f\u2d30\u2d62\u2d54_\u2d31\u2d55\u2d30\u2d62\u2d55_\u2d4e\u2d30\u2d55\u2d5a_\u2d49\u2d31\u2d54\u2d49\u2d54_\u2d4e\u2d30\u2d62\u2d62\u2d53_\u2d62\u2d53\u2d4f\u2d62\u2d53_\u2d62\u2d53\u2d4d\u2d62\u2d53\u2d63_\u2d56\u2d53\u2d5b\u2d5c_\u2d5b\u2d53\u2d5c\u2d30\u2d4f\u2d31\u2d49\u2d54_\u2d3d\u2d5f\u2d53\u2d31\u2d55_\u2d4f\u2d53\u2d61\u2d30\u2d4f\u2d31\u2d49\u2d54_\u2d37\u2d53\u2d4a\u2d4f\u2d31\u2d49\u2d54".split("_"),weekdays:"\u2d30\u2d59\u2d30\u2d4e\u2d30\u2d59_\u2d30\u2d62\u2d4f\u2d30\u2d59_\u2d30\u2d59\u2d49\u2d4f\u2d30\u2d59_\u2d30\u2d3d\u2d54\u2d30\u2d59_\u2d30\u2d3d\u2d61\u2d30\u2d59_\u2d30\u2d59\u2d49\u2d4e\u2d61\u2d30\u2d59_\u2d30\u2d59\u2d49\u2d39\u2d62\u2d30\u2d59".split("_"),weekdaysShort:"\u2d30\u2d59\u2d30\u2d4e\u2d30\u2d59_\u2d30\u2d62\u2d4f\u2d30\u2d59_\u2d30\u2d59\u2d49\u2d4f\u2d30\u2d59_\u2d30\u2d3d\u2d54\u2d30\u2d59_\u2d30\u2d3d\u2d61\u2d30\u2d59_\u2d30\u2d59\u2d49\u2d4e\u2d61\u2d30\u2d59_\u2d30\u2d59\u2d49\u2d39\u2d62\u2d30\u2d59".split("_"),weekdaysMin:"\u2d30\u2d59\u2d30\u2d4e\u2d30\u2d59_\u2d30\u2d62\u2d4f\u2d30\u2d59_\u2d30\u2d59\u2d49\u2d4f\u2d30\u2d59_\u2d30\u2d3d\u2d54\u2d30\u2d59_\u2d30\u2d3d\u2d61\u2d30\u2d59_\u2d30\u2d59\u2d49\u2d4e\u2d61\u2d30\u2d59_\u2d30\u2d59\u2d49\u2d39\u2d62\u2d30\u2d59".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd D MMMM YYYY HH:mm"},calendar:{sameDay:"[\u2d30\u2d59\u2d37\u2d45 \u2d34] LT",nextDay:"[\u2d30\u2d59\u2d3d\u2d30 \u2d34] LT",nextWeek:"dddd [\u2d34] LT",lastDay:"[\u2d30\u2d5a\u2d30\u2d4f\u2d5c \u2d34] LT",lastWeek:"dddd [\u2d34] LT",sameElse:"L"},relativeTime:{future:"\u2d37\u2d30\u2d37\u2d45 \u2d59 \u2d62\u2d30\u2d4f %s",past:"\u2d62\u2d30\u2d4f %s",s:"\u2d49\u2d4e\u2d49\u2d3d",ss:"%d \u2d49\u2d4e\u2d49\u2d3d",m:"\u2d4e\u2d49\u2d4f\u2d53\u2d3a",mm:"%d \u2d4e\u2d49\u2d4f\u2d53\u2d3a",h:"\u2d59\u2d30\u2d44\u2d30",hh:"%d \u2d5c\u2d30\u2d59\u2d59\u2d30\u2d44\u2d49\u2d4f",d:"\u2d30\u2d59\u2d59",dd:"%d o\u2d59\u2d59\u2d30\u2d4f",M:"\u2d30\u2d62o\u2d53\u2d54",MM:"%d \u2d49\u2d62\u2d62\u2d49\u2d54\u2d4f",y:"\u2d30\u2d59\u2d33\u2d30\u2d59",yy:"%d \u2d49\u2d59\u2d33\u2d30\u2d59\u2d4f"},week:{dow:6,doy:12}})}(i(16738))},74357:function(v,S,i){!function(r){"use strict";r.defineLocale("ug-cn",{months:"\u064a\u0627\u0646\u06cb\u0627\u0631_\u0641\u06d0\u06cb\u0631\u0627\u0644_\u0645\u0627\u0631\u062a_\u0626\u0627\u067e\u0631\u06d0\u0644_\u0645\u0627\u064a_\u0626\u0649\u064a\u06c7\u0646_\u0626\u0649\u064a\u06c7\u0644_\u0626\u0627\u06cb\u063a\u06c7\u0633\u062a_\u0633\u06d0\u0646\u062a\u06d5\u0628\u0649\u0631_\u0626\u06c6\u0643\u062a\u06d5\u0628\u0649\u0631_\u0646\u0648\u064a\u0627\u0628\u0649\u0631_\u062f\u06d0\u0643\u0627\u0628\u0649\u0631".split("_"),monthsShort:"\u064a\u0627\u0646\u06cb\u0627\u0631_\u0641\u06d0\u06cb\u0631\u0627\u0644_\u0645\u0627\u0631\u062a_\u0626\u0627\u067e\u0631\u06d0\u0644_\u0645\u0627\u064a_\u0626\u0649\u064a\u06c7\u0646_\u0626\u0649\u064a\u06c7\u0644_\u0626\u0627\u06cb\u063a\u06c7\u0633\u062a_\u0633\u06d0\u0646\u062a\u06d5\u0628\u0649\u0631_\u0626\u06c6\u0643\u062a\u06d5\u0628\u0649\u0631_\u0646\u0648\u064a\u0627\u0628\u0649\u0631_\u062f\u06d0\u0643\u0627\u0628\u0649\u0631".split("_"),weekdays:"\u064a\u06d5\u0643\u0634\u06d5\u0646\u0628\u06d5_\u062f\u06c8\u0634\u06d5\u0646\u0628\u06d5_\u0633\u06d5\u064a\u0634\u06d5\u0646\u0628\u06d5_\u0686\u0627\u0631\u0634\u06d5\u0646\u0628\u06d5_\u067e\u06d5\u064a\u0634\u06d5\u0646\u0628\u06d5_\u062c\u06c8\u0645\u06d5_\u0634\u06d5\u0646\u0628\u06d5".split("_"),weekdaysShort:"\u064a\u06d5_\u062f\u06c8_\u0633\u06d5_\u0686\u0627_\u067e\u06d5_\u062c\u06c8_\u0634\u06d5".split("_"),weekdaysMin:"\u064a\u06d5_\u062f\u06c8_\u0633\u06d5_\u0686\u0627_\u067e\u06d5_\u062c\u06c8_\u0634\u06d5".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"YYYY-MM-DD",LL:"YYYY-\u064a\u0649\u0644\u0649M-\u0626\u0627\u064a\u0646\u0649\u06adD-\u0643\u06c8\u0646\u0649",LLL:"YYYY-\u064a\u0649\u0644\u0649M-\u0626\u0627\u064a\u0646\u0649\u06adD-\u0643\u06c8\u0646\u0649\u060c HH:mm",LLLL:"dddd\u060c YYYY-\u064a\u0649\u0644\u0649M-\u0626\u0627\u064a\u0646\u0649\u06adD-\u0643\u06c8\u0646\u0649\u060c HH:mm"},meridiemParse:/\u064a\u06d0\u0631\u0649\u0645 \u0643\u06d0\u0686\u06d5|\u0633\u06d5\u06be\u06d5\u0631|\u0686\u06c8\u0634\u062a\u0649\u0646 \u0628\u06c7\u0631\u06c7\u0646|\u0686\u06c8\u0634|\u0686\u06c8\u0634\u062a\u0649\u0646 \u0643\u06d0\u064a\u0649\u0646|\u0643\u06d5\u0686/,meridiemHour:function(p,f){return 12===p&&(p=0),"\u064a\u06d0\u0631\u0649\u0645 \u0643\u06d0\u0686\u06d5"===f||"\u0633\u06d5\u06be\u06d5\u0631"===f||"\u0686\u06c8\u0634\u062a\u0649\u0646 \u0628\u06c7\u0631\u06c7\u0646"===f?p:"\u0686\u06c8\u0634\u062a\u0649\u0646 \u0643\u06d0\u064a\u0649\u0646"===f||"\u0643\u06d5\u0686"===f?p+12:p>=11?p:p+12},meridiem:function(p,f,e){var _=100*p+f;return _<600?"\u064a\u06d0\u0631\u0649\u0645 \u0643\u06d0\u0686\u06d5":_<900?"\u0633\u06d5\u06be\u06d5\u0631":_<1130?"\u0686\u06c8\u0634\u062a\u0649\u0646 \u0628\u06c7\u0631\u06c7\u0646":_<1230?"\u0686\u06c8\u0634":_<1800?"\u0686\u06c8\u0634\u062a\u0649\u0646 \u0643\u06d0\u064a\u0649\u0646":"\u0643\u06d5\u0686"},calendar:{sameDay:"[\u0628\u06c8\u06af\u06c8\u0646 \u0633\u0627\u0626\u06d5\u062a] LT",nextDay:"[\u0626\u06d5\u062a\u06d5 \u0633\u0627\u0626\u06d5\u062a] LT",nextWeek:"[\u0643\u06d0\u0644\u06d5\u0631\u0643\u0649] dddd [\u0633\u0627\u0626\u06d5\u062a] LT",lastDay:"[\u062a\u06c6\u0646\u06c8\u06af\u06c8\u0646] LT",lastWeek:"[\u0626\u0627\u0644\u062f\u0649\u0646\u0642\u0649] dddd [\u0633\u0627\u0626\u06d5\u062a] LT",sameElse:"L"},relativeTime:{future:"%s \u0643\u06d0\u064a\u0649\u0646",past:"%s \u0628\u06c7\u0631\u06c7\u0646",s:"\u0646\u06d5\u0686\u0686\u06d5 \u0633\u06d0\u0643\u0648\u0646\u062a",ss:"%d \u0633\u06d0\u0643\u0648\u0646\u062a",m:"\u0628\u0649\u0631 \u0645\u0649\u0646\u06c7\u062a",mm:"%d \u0645\u0649\u0646\u06c7\u062a",h:"\u0628\u0649\u0631 \u0633\u0627\u0626\u06d5\u062a",hh:"%d \u0633\u0627\u0626\u06d5\u062a",d:"\u0628\u0649\u0631 \u0643\u06c8\u0646",dd:"%d \u0643\u06c8\u0646",M:"\u0628\u0649\u0631 \u0626\u0627\u064a",MM:"%d \u0626\u0627\u064a",y:"\u0628\u0649\u0631 \u064a\u0649\u0644",yy:"%d \u064a\u0649\u0644"},dayOfMonthOrdinalParse:/\d{1,2}(-\u0643\u06c8\u0646\u0649|-\u0626\u0627\u064a|-\u06be\u06d5\u067e\u062a\u06d5)/,ordinal:function(p,f){switch(f){case"d":case"D":case"DDD":return p+"-\u0643\u06c8\u0646\u0649";case"w":case"W":return p+"-\u06be\u06d5\u067e\u062a\u06d5";default:return p}},preparse:function(p){return p.replace(/\u060c/g,",")},postformat:function(p){return p.replace(/,/g,"\u060c")},week:{dow:1,doy:7}})}(i(16738))},74810:function(v,S,i){!function(r){"use strict";function p(y,T,M){return"m"===M?T?"\u0445\u0432\u0438\u043b\u0438\u043d\u0430":"\u0445\u0432\u0438\u043b\u0438\u043d\u0443":"h"===M?T?"\u0433\u043e\u0434\u0438\u043d\u0430":"\u0433\u043e\u0434\u0438\u043d\u0443":y+" "+function(y,T){var M=y.split("_");return T%10==1&&T%100!=11?M[0]:T%10>=2&&T%10<=4&&(T%100<10||T%100>=20)?M[1]:M[2]}({ss:T?"\u0441\u0435\u043a\u0443\u043d\u0434\u0430_\u0441\u0435\u043a\u0443\u043d\u0434\u0438_\u0441\u0435\u043a\u0443\u043d\u0434":"\u0441\u0435\u043a\u0443\u043d\u0434\u0443_\u0441\u0435\u043a\u0443\u043d\u0434\u0438_\u0441\u0435\u043a\u0443\u043d\u0434",mm:T?"\u0445\u0432\u0438\u043b\u0438\u043d\u0430_\u0445\u0432\u0438\u043b\u0438\u043d\u0438_\u0445\u0432\u0438\u043b\u0438\u043d":"\u0445\u0432\u0438\u043b\u0438\u043d\u0443_\u0445\u0432\u0438\u043b\u0438\u043d\u0438_\u0445\u0432\u0438\u043b\u0438\u043d",hh:T?"\u0433\u043e\u0434\u0438\u043d\u0430_\u0433\u043e\u0434\u0438\u043d\u0438_\u0433\u043e\u0434\u0438\u043d":"\u0433\u043e\u0434\u0438\u043d\u0443_\u0433\u043e\u0434\u0438\u043d\u0438_\u0433\u043e\u0434\u0438\u043d",dd:"\u0434\u0435\u043d\u044c_\u0434\u043d\u0456_\u0434\u043d\u0456\u0432",MM:"\u043c\u0456\u0441\u044f\u0446\u044c_\u043c\u0456\u0441\u044f\u0446\u0456_\u043c\u0456\u0441\u044f\u0446\u0456\u0432",yy:"\u0440\u0456\u043a_\u0440\u043e\u043a\u0438_\u0440\u043e\u043a\u0456\u0432"}[M],+y)}function e(y){return function(){return y+"\u043e"+(11===this.hours()?"\u0431":"")+"] LT"}}r.defineLocale("uk",{months:{format:"\u0441\u0456\u0447\u043d\u044f_\u043b\u044e\u0442\u043e\u0433\u043e_\u0431\u0435\u0440\u0435\u0437\u043d\u044f_\u043a\u0432\u0456\u0442\u043d\u044f_\u0442\u0440\u0430\u0432\u043d\u044f_\u0447\u0435\u0440\u0432\u043d\u044f_\u043b\u0438\u043f\u043d\u044f_\u0441\u0435\u0440\u043f\u043d\u044f_\u0432\u0435\u0440\u0435\u0441\u043d\u044f_\u0436\u043e\u0432\u0442\u043d\u044f_\u043b\u0438\u0441\u0442\u043e\u043f\u0430\u0434\u0430_\u0433\u0440\u0443\u0434\u043d\u044f".split("_"),standalone:"\u0441\u0456\u0447\u0435\u043d\u044c_\u043b\u044e\u0442\u0438\u0439_\u0431\u0435\u0440\u0435\u0437\u0435\u043d\u044c_\u043a\u0432\u0456\u0442\u0435\u043d\u044c_\u0442\u0440\u0430\u0432\u0435\u043d\u044c_\u0447\u0435\u0440\u0432\u0435\u043d\u044c_\u043b\u0438\u043f\u0435\u043d\u044c_\u0441\u0435\u0440\u043f\u0435\u043d\u044c_\u0432\u0435\u0440\u0435\u0441\u0435\u043d\u044c_\u0436\u043e\u0432\u0442\u0435\u043d\u044c_\u043b\u0438\u0441\u0442\u043e\u043f\u0430\u0434_\u0433\u0440\u0443\u0434\u0435\u043d\u044c".split("_")},monthsShort:"\u0441\u0456\u0447_\u043b\u044e\u0442_\u0431\u0435\u0440_\u043a\u0432\u0456\u0442_\u0442\u0440\u0430\u0432_\u0447\u0435\u0440\u0432_\u043b\u0438\u043f_\u0441\u0435\u0440\u043f_\u0432\u0435\u0440_\u0436\u043e\u0432\u0442_\u043b\u0438\u0441\u0442_\u0433\u0440\u0443\u0434".split("_"),weekdays:function(y,T){var M={nominative:"\u043d\u0435\u0434\u0456\u043b\u044f_\u043f\u043e\u043d\u0435\u0434\u0456\u043b\u043e\u043a_\u0432\u0456\u0432\u0442\u043e\u0440\u043e\u043a_\u0441\u0435\u0440\u0435\u0434\u0430_\u0447\u0435\u0442\u0432\u0435\u0440_\u043f\u2019\u044f\u0442\u043d\u0438\u0446\u044f_\u0441\u0443\u0431\u043e\u0442\u0430".split("_"),accusative:"\u043d\u0435\u0434\u0456\u043b\u044e_\u043f\u043e\u043d\u0435\u0434\u0456\u043b\u043e\u043a_\u0432\u0456\u0432\u0442\u043e\u0440\u043e\u043a_\u0441\u0435\u0440\u0435\u0434\u0443_\u0447\u0435\u0442\u0432\u0435\u0440_\u043f\u2019\u044f\u0442\u043d\u0438\u0446\u044e_\u0441\u0443\u0431\u043e\u0442\u0443".split("_"),genitive:"\u043d\u0435\u0434\u0456\u043b\u0456_\u043f\u043e\u043d\u0435\u0434\u0456\u043b\u043a\u0430_\u0432\u0456\u0432\u0442\u043e\u0440\u043a\u0430_\u0441\u0435\u0440\u0435\u0434\u0438_\u0447\u0435\u0442\u0432\u0435\u0440\u0433\u0430_\u043f\u2019\u044f\u0442\u043d\u0438\u0446\u0456_\u0441\u0443\u0431\u043e\u0442\u0438".split("_")};return!0===y?M.nominative.slice(1,7).concat(M.nominative.slice(0,1)):y?M[/(\[[\u0412\u0432\u0423\u0443]\]) ?dddd/.test(T)?"accusative":/\[?(?:\u043c\u0438\u043d\u0443\u043b\u043e\u0457|\u043d\u0430\u0441\u0442\u0443\u043f\u043d\u043e\u0457)? ?\] ?dddd/.test(T)?"genitive":"nominative"][y.day()]:M.nominative},weekdaysShort:"\u043d\u0434_\u043f\u043d_\u0432\u0442_\u0441\u0440_\u0447\u0442_\u043f\u0442_\u0441\u0431".split("_"),weekdaysMin:"\u043d\u0434_\u043f\u043d_\u0432\u0442_\u0441\u0440_\u0447\u0442_\u043f\u0442_\u0441\u0431".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD.MM.YYYY",LL:"D MMMM YYYY \u0440.",LLL:"D MMMM YYYY \u0440., HH:mm",LLLL:"dddd, D MMMM YYYY \u0440., HH:mm"},calendar:{sameDay:e("[\u0421\u044c\u043e\u0433\u043e\u0434\u043d\u0456 "),nextDay:e("[\u0417\u0430\u0432\u0442\u0440\u0430 "),lastDay:e("[\u0412\u0447\u043e\u0440\u0430 "),nextWeek:e("[\u0423] dddd ["),lastWeek:function(){switch(this.day()){case 0:case 3:case 5:case 6:return e("[\u041c\u0438\u043d\u0443\u043b\u043e\u0457] dddd [").call(this);case 1:case 2:case 4:return e("[\u041c\u0438\u043d\u0443\u043b\u043e\u0433\u043e] dddd [").call(this)}},sameElse:"L"},relativeTime:{future:"\u0437\u0430 %s",past:"%s \u0442\u043e\u043c\u0443",s:"\u0434\u0435\u043a\u0456\u043b\u044c\u043a\u0430 \u0441\u0435\u043a\u0443\u043d\u0434",ss:p,m:p,mm:p,h:"\u0433\u043e\u0434\u0438\u043d\u0443",hh:p,d:"\u0434\u0435\u043d\u044c",dd:p,M:"\u043c\u0456\u0441\u044f\u0446\u044c",MM:p,y:"\u0440\u0456\u043a",yy:p},meridiemParse:/\u043d\u043e\u0447\u0456|\u0440\u0430\u043d\u043a\u0443|\u0434\u043d\u044f|\u0432\u0435\u0447\u043e\u0440\u0430/,isPM:function(y){return/^(\u0434\u043d\u044f|\u0432\u0435\u0447\u043e\u0440\u0430)$/.test(y)},meridiem:function(y,T,M){return y<4?"\u043d\u043e\u0447\u0456":y<12?"\u0440\u0430\u043d\u043a\u0443":y<17?"\u0434\u043d\u044f":"\u0432\u0435\u0447\u043e\u0440\u0430"},dayOfMonthOrdinalParse:/\d{1,2}-(\u0439|\u0433\u043e)/,ordinal:function(y,T){switch(T){case"M":case"d":case"DDD":case"w":case"W":return y+"-\u0439";case"D":return y+"-\u0433\u043e";default:return y}},week:{dow:1,doy:7}})}(i(16738))},86794:function(v,S,i){!function(r){"use strict";var u=["\u062c\u0646\u0648\u0631\u06cc","\u0641\u0631\u0648\u0631\u06cc","\u0645\u0627\u0631\u0686","\u0627\u067e\u0631\u06cc\u0644","\u0645\u0626\u06cc","\u062c\u0648\u0646","\u062c\u0648\u0644\u0627\u0626\u06cc","\u0627\u06af\u0633\u062a","\u0633\u062a\u0645\u0628\u0631","\u0627\u06a9\u062a\u0648\u0628\u0631","\u0646\u0648\u0645\u0628\u0631","\u062f\u0633\u0645\u0628\u0631"],p=["\u0627\u062a\u0648\u0627\u0631","\u067e\u06cc\u0631","\u0645\u0646\u06af\u0644","\u0628\u062f\u06be","\u062c\u0645\u0639\u0631\u0627\u062a","\u062c\u0645\u0639\u06c1","\u06c1\u0641\u062a\u06c1"];r.defineLocale("ur",{months:u,monthsShort:u,weekdays:p,weekdaysShort:p,weekdaysMin:p,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd\u060c D MMMM YYYY HH:mm"},meridiemParse:/\u0635\u0628\u062d|\u0634\u0627\u0645/,isPM:function(e){return"\u0634\u0627\u0645"===e},meridiem:function(e,_,y){return e<12?"\u0635\u0628\u062d":"\u0634\u0627\u0645"},calendar:{sameDay:"[\u0622\u062c \u0628\u0648\u0642\u062a] LT",nextDay:"[\u06a9\u0644 \u0628\u0648\u0642\u062a] LT",nextWeek:"dddd [\u0628\u0648\u0642\u062a] LT",lastDay:"[\u06af\u0630\u0634\u062a\u06c1 \u0631\u0648\u0632 \u0628\u0648\u0642\u062a] LT",lastWeek:"[\u06af\u0630\u0634\u062a\u06c1] dddd [\u0628\u0648\u0642\u062a] LT",sameElse:"L"},relativeTime:{future:"%s \u0628\u0639\u062f",past:"%s \u0642\u0628\u0644",s:"\u0686\u0646\u062f \u0633\u06cc\u06a9\u0646\u0688",ss:"%d \u0633\u06cc\u06a9\u0646\u0688",m:"\u0627\u06cc\u06a9 \u0645\u0646\u0679",mm:"%d \u0645\u0646\u0679",h:"\u0627\u06cc\u06a9 \u06af\u06be\u0646\u0679\u06c1",hh:"%d \u06af\u06be\u0646\u0679\u06d2",d:"\u0627\u06cc\u06a9 \u062f\u0646",dd:"%d \u062f\u0646",M:"\u0627\u06cc\u06a9 \u0645\u0627\u06c1",MM:"%d \u0645\u0627\u06c1",y:"\u0627\u06cc\u06a9 \u0633\u0627\u0644",yy:"%d \u0633\u0627\u0644"},preparse:function(e){return e.replace(/\u060c/g,",")},postformat:function(e){return e.replace(/,/g,"\u060c")},week:{dow:1,doy:4}})}(i(16738))},77959:function(v,S,i){!function(r){"use strict";r.defineLocale("uz-latn",{months:"Yanvar_Fevral_Mart_Aprel_May_Iyun_Iyul_Avgust_Sentabr_Oktabr_Noyabr_Dekabr".split("_"),monthsShort:"Yan_Fev_Mar_Apr_May_Iyun_Iyul_Avg_Sen_Okt_Noy_Dek".split("_"),weekdays:"Yakshanba_Dushanba_Seshanba_Chorshanba_Payshanba_Juma_Shanba".split("_"),weekdaysShort:"Yak_Dush_Sesh_Chor_Pay_Jum_Shan".split("_"),weekdaysMin:"Ya_Du_Se_Cho_Pa_Ju_Sha".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"D MMMM YYYY, dddd HH:mm"},calendar:{sameDay:"[Bugun soat] LT [da]",nextDay:"[Ertaga] LT [da]",nextWeek:"dddd [kuni soat] LT [da]",lastDay:"[Kecha soat] LT [da]",lastWeek:"[O'tgan] dddd [kuni soat] LT [da]",sameElse:"L"},relativeTime:{future:"Yaqin %s ichida",past:"Bir necha %s oldin",s:"soniya",ss:"%d soniya",m:"bir daqiqa",mm:"%d daqiqa",h:"bir soat",hh:"%d soat",d:"bir kun",dd:"%d kun",M:"bir oy",MM:"%d oy",y:"bir yil",yy:"%d yil"},week:{dow:1,doy:7}})}(i(16738))},28966:function(v,S,i){!function(r){"use strict";r.defineLocale("uz",{months:"\u044f\u043d\u0432\u0430\u0440_\u0444\u0435\u0432\u0440\u0430\u043b_\u043c\u0430\u0440\u0442_\u0430\u043f\u0440\u0435\u043b_\u043c\u0430\u0439_\u0438\u044e\u043d_\u0438\u044e\u043b_\u0430\u0432\u0433\u0443\u0441\u0442_\u0441\u0435\u043d\u0442\u044f\u0431\u0440_\u043e\u043a\u0442\u044f\u0431\u0440_\u043d\u043e\u044f\u0431\u0440_\u0434\u0435\u043a\u0430\u0431\u0440".split("_"),monthsShort:"\u044f\u043d\u0432_\u0444\u0435\u0432_\u043c\u0430\u0440_\u0430\u043f\u0440_\u043c\u0430\u0439_\u0438\u044e\u043d_\u0438\u044e\u043b_\u0430\u0432\u0433_\u0441\u0435\u043d_\u043e\u043a\u0442_\u043d\u043e\u044f_\u0434\u0435\u043a".split("_"),weekdays:"\u042f\u043a\u0448\u0430\u043d\u0431\u0430_\u0414\u0443\u0448\u0430\u043d\u0431\u0430_\u0421\u0435\u0448\u0430\u043d\u0431\u0430_\u0427\u043e\u0440\u0448\u0430\u043d\u0431\u0430_\u041f\u0430\u0439\u0448\u0430\u043d\u0431\u0430_\u0416\u0443\u043c\u0430_\u0428\u0430\u043d\u0431\u0430".split("_"),weekdaysShort:"\u042f\u043a\u0448_\u0414\u0443\u0448_\u0421\u0435\u0448_\u0427\u043e\u0440_\u041f\u0430\u0439_\u0416\u0443\u043c_\u0428\u0430\u043d".split("_"),weekdaysMin:"\u042f\u043a_\u0414\u0443_\u0421\u0435_\u0427\u043e_\u041f\u0430_\u0416\u0443_\u0428\u0430".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"D MMMM YYYY, dddd HH:mm"},calendar:{sameDay:"[\u0411\u0443\u0433\u0443\u043d \u0441\u043e\u0430\u0442] LT [\u0434\u0430]",nextDay:"[\u042d\u0440\u0442\u0430\u0433\u0430] LT [\u0434\u0430]",nextWeek:"dddd [\u043a\u0443\u043d\u0438 \u0441\u043e\u0430\u0442] LT [\u0434\u0430]",lastDay:"[\u041a\u0435\u0447\u0430 \u0441\u043e\u0430\u0442] LT [\u0434\u0430]",lastWeek:"[\u0423\u0442\u0433\u0430\u043d] dddd [\u043a\u0443\u043d\u0438 \u0441\u043e\u0430\u0442] LT [\u0434\u0430]",sameElse:"L"},relativeTime:{future:"\u042f\u043a\u0438\u043d %s \u0438\u0447\u0438\u0434\u0430",past:"\u0411\u0438\u0440 \u043d\u0435\u0447\u0430 %s \u043e\u043b\u0434\u0438\u043d",s:"\u0444\u0443\u0440\u0441\u0430\u0442",ss:"%d \u0444\u0443\u0440\u0441\u0430\u0442",m:"\u0431\u0438\u0440 \u0434\u0430\u043a\u0438\u043a\u0430",mm:"%d \u0434\u0430\u043a\u0438\u043a\u0430",h:"\u0431\u0438\u0440 \u0441\u043e\u0430\u0442",hh:"%d \u0441\u043e\u0430\u0442",d:"\u0431\u0438\u0440 \u043a\u0443\u043d",dd:"%d \u043a\u0443\u043d",M:"\u0431\u0438\u0440 \u043e\u0439",MM:"%d \u043e\u0439",y:"\u0431\u0438\u0440 \u0439\u0438\u043b",yy:"%d \u0439\u0438\u043b"},week:{dow:1,doy:7}})}(i(16738))},35386:function(v,S,i){!function(r){"use strict";r.defineLocale("vi",{months:"th\xe1ng 1_th\xe1ng 2_th\xe1ng 3_th\xe1ng 4_th\xe1ng 5_th\xe1ng 6_th\xe1ng 7_th\xe1ng 8_th\xe1ng 9_th\xe1ng 10_th\xe1ng 11_th\xe1ng 12".split("_"),monthsShort:"Thg 01_Thg 02_Thg 03_Thg 04_Thg 05_Thg 06_Thg 07_Thg 08_Thg 09_Thg 10_Thg 11_Thg 12".split("_"),monthsParseExact:!0,weekdays:"ch\u1ee7 nh\u1eadt_th\u1ee9 hai_th\u1ee9 ba_th\u1ee9 t\u01b0_th\u1ee9 n\u0103m_th\u1ee9 s\xe1u_th\u1ee9 b\u1ea3y".split("_"),weekdaysShort:"CN_T2_T3_T4_T5_T6_T7".split("_"),weekdaysMin:"CN_T2_T3_T4_T5_T6_T7".split("_"),weekdaysParseExact:!0,meridiemParse:/sa|ch/i,isPM:function(p){return/^ch$/i.test(p)},meridiem:function(p,f,e){return p<12?e?"sa":"SA":e?"ch":"CH"},longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM [n\u0103m] YYYY",LLL:"D MMMM [n\u0103m] YYYY HH:mm",LLLL:"dddd, D MMMM [n\u0103m] YYYY HH:mm",l:"DD/M/YYYY",ll:"D MMM YYYY",lll:"D MMM YYYY HH:mm",llll:"ddd, D MMM YYYY HH:mm"},calendar:{sameDay:"[H\xf4m nay l\xfac] LT",nextDay:"[Ng\xe0y mai l\xfac] LT",nextWeek:"dddd [tu\u1ea7n t\u1edbi l\xfac] LT",lastDay:"[H\xf4m qua l\xfac] LT",lastWeek:"dddd [tu\u1ea7n tr\u01b0\u1edbc l\xfac] LT",sameElse:"L"},relativeTime:{future:"%s t\u1edbi",past:"%s tr\u01b0\u1edbc",s:"v\xe0i gi\xe2y",ss:"%d gi\xe2y",m:"m\u1ed9t ph\xfat",mm:"%d ph\xfat",h:"m\u1ed9t gi\u1edd",hh:"%d gi\u1edd",d:"m\u1ed9t ng\xe0y",dd:"%d ng\xe0y",w:"m\u1ed9t tu\u1ea7n",ww:"%d tu\u1ea7n",M:"m\u1ed9t th\xe1ng",MM:"%d th\xe1ng",y:"m\u1ed9t n\u0103m",yy:"%d n\u0103m"},dayOfMonthOrdinalParse:/\d{1,2}/,ordinal:function(p){return p},week:{dow:1,doy:4}})}(i(16738))},23156:function(v,S,i){!function(r){"use strict";r.defineLocale("x-pseudo",{months:"J~\xe1\xf1\xfa\xe1~r\xfd_F~\xe9br\xfa~\xe1r\xfd_~M\xe1rc~h_\xc1p~r\xedl_~M\xe1\xfd_~J\xfa\xf1\xe9~_J\xfal~\xfd_\xc1\xfa~g\xfast~_S\xe9p~t\xe9mb~\xe9r_\xd3~ct\xf3b~\xe9r_\xd1~\xf3v\xe9m~b\xe9r_~D\xe9c\xe9~mb\xe9r".split("_"),monthsShort:"J~\xe1\xf1_~F\xe9b_~M\xe1r_~\xc1pr_~M\xe1\xfd_~J\xfa\xf1_~J\xfal_~\xc1\xfag_~S\xe9p_~\xd3ct_~\xd1\xf3v_~D\xe9c".split("_"),monthsParseExact:!0,weekdays:"S~\xfa\xf1d\xe1~\xfd_M\xf3~\xf1d\xe1\xfd~_T\xfa\xe9~sd\xe1\xfd~_W\xe9d~\xf1\xe9sd~\xe1\xfd_T~h\xfars~d\xe1\xfd_~Fr\xedd~\xe1\xfd_S~\xe1t\xfar~d\xe1\xfd".split("_"),weekdaysShort:"S~\xfa\xf1_~M\xf3\xf1_~T\xfa\xe9_~W\xe9d_~Th\xfa_~Fr\xed_~S\xe1t".split("_"),weekdaysMin:"S~\xfa_M\xf3~_T\xfa_~W\xe9_T~h_Fr~_S\xe1".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd, D MMMM YYYY HH:mm"},calendar:{sameDay:"[T~\xf3d\xe1~\xfd \xe1t] LT",nextDay:"[T~\xf3m\xf3~rr\xf3~w \xe1t] LT",nextWeek:"dddd [\xe1t] LT",lastDay:"[\xdd~\xe9st~\xe9rd\xe1~\xfd \xe1t] LT",lastWeek:"[L~\xe1st] dddd [\xe1t] LT",sameElse:"L"},relativeTime:{future:"\xed~\xf1 %s",past:"%s \xe1~g\xf3",s:"\xe1 ~f\xe9w ~s\xe9c\xf3~\xf1ds",ss:"%d s~\xe9c\xf3\xf1~ds",m:"\xe1 ~m\xed\xf1~\xfat\xe9",mm:"%d m~\xed\xf1\xfa~t\xe9s",h:"\xe1~\xf1 h\xf3~\xfar",hh:"%d h~\xf3\xfars",d:"\xe1 ~d\xe1\xfd",dd:"%d d~\xe1\xfds",M:"\xe1 ~m\xf3\xf1~th",MM:"%d m~\xf3\xf1t~hs",y:"\xe1 ~\xfd\xe9\xe1r",yy:"%d \xfd~\xe9\xe1rs"},dayOfMonthOrdinalParse:/\d{1,2}(th|st|nd|rd)/,ordinal:function(p){var f=p%10;return p+(1==~~(p%100/10)?"th":1===f?"st":2===f?"nd":3===f?"rd":"th")},week:{dow:1,doy:4}})}(i(16738))},68028:function(v,S,i){!function(r){"use strict";r.defineLocale("yo",{months:"S\u1eb9\u0301r\u1eb9\u0301_E\u0300re\u0300le\u0300_\u1eb8r\u1eb9\u0300na\u0300_I\u0300gbe\u0301_E\u0300bibi_O\u0300ku\u0300du_Ag\u1eb9mo_O\u0300gu\u0301n_Owewe_\u1ecc\u0300wa\u0300ra\u0300_Be\u0301lu\u0301_\u1ecc\u0300p\u1eb9\u0300\u0300".split("_"),monthsShort:"S\u1eb9\u0301r_E\u0300rl_\u1eb8rn_I\u0300gb_E\u0300bi_O\u0300ku\u0300_Ag\u1eb9_O\u0300gu\u0301_Owe_\u1ecc\u0300wa\u0300_Be\u0301l_\u1ecc\u0300p\u1eb9\u0300\u0300".split("_"),weekdays:"A\u0300i\u0300ku\u0301_Aje\u0301_I\u0300s\u1eb9\u0301gun_\u1eccj\u1ecd\u0301ru\u0301_\u1eccj\u1ecd\u0301b\u1ecd_\u1eb8ti\u0300_A\u0300ba\u0301m\u1eb9\u0301ta".split("_"),weekdaysShort:"A\u0300i\u0300k_Aje\u0301_I\u0300s\u1eb9\u0301_\u1eccjr_\u1eccjb_\u1eb8ti\u0300_A\u0300ba\u0301".split("_"),weekdaysMin:"A\u0300i\u0300_Aj_I\u0300s_\u1eccr_\u1eccb_\u1eb8t_A\u0300b".split("_"),longDateFormat:{LT:"h:mm A",LTS:"h:mm:ss A",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY h:mm A",LLLL:"dddd, D MMMM YYYY h:mm A"},calendar:{sameDay:"[O\u0300ni\u0300 ni] LT",nextDay:"[\u1ecc\u0300la ni] LT",nextWeek:"dddd [\u1eccs\u1eb9\u0300 to\u0301n'b\u1ecd] [ni] LT",lastDay:"[A\u0300na ni] LT",lastWeek:"dddd [\u1eccs\u1eb9\u0300 to\u0301l\u1ecd\u0301] [ni] LT",sameElse:"L"},relativeTime:{future:"ni\u0301 %s",past:"%s k\u1ecdja\u0301",s:"i\u0300s\u1eb9ju\u0301 aaya\u0301 die",ss:"aaya\u0301 %d",m:"i\u0300s\u1eb9ju\u0301 kan",mm:"i\u0300s\u1eb9ju\u0301 %d",h:"wa\u0301kati kan",hh:"wa\u0301kati %d",d:"\u1ecdj\u1ecd\u0301 kan",dd:"\u1ecdj\u1ecd\u0301 %d",M:"osu\u0300 kan",MM:"osu\u0300 %d",y:"\u1ecddu\u0301n kan",yy:"\u1ecddu\u0301n %d"},dayOfMonthOrdinalParse:/\u1ecdj\u1ecd\u0301\s\d{1,2}/,ordinal:"\u1ecdj\u1ecd\u0301 %d",week:{dow:1,doy:4}})}(i(16738))},9330:function(v,S,i){!function(r){"use strict";r.defineLocale("zh-cn",{months:"\u4e00\u6708_\u4e8c\u6708_\u4e09\u6708_\u56db\u6708_\u4e94\u6708_\u516d\u6708_\u4e03\u6708_\u516b\u6708_\u4e5d\u6708_\u5341\u6708_\u5341\u4e00\u6708_\u5341\u4e8c\u6708".split("_"),monthsShort:"1\u6708_2\u6708_3\u6708_4\u6708_5\u6708_6\u6708_7\u6708_8\u6708_9\u6708_10\u6708_11\u6708_12\u6708".split("_"),weekdays:"\u661f\u671f\u65e5_\u661f\u671f\u4e00_\u661f\u671f\u4e8c_\u661f\u671f\u4e09_\u661f\u671f\u56db_\u661f\u671f\u4e94_\u661f\u671f\u516d".split("_"),weekdaysShort:"\u5468\u65e5_\u5468\u4e00_\u5468\u4e8c_\u5468\u4e09_\u5468\u56db_\u5468\u4e94_\u5468\u516d".split("_"),weekdaysMin:"\u65e5_\u4e00_\u4e8c_\u4e09_\u56db_\u4e94_\u516d".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"YYYY/MM/DD",LL:"YYYY\u5e74M\u6708D\u65e5",LLL:"YYYY\u5e74M\u6708D\u65e5Ah\u70b9mm\u5206",LLLL:"YYYY\u5e74M\u6708D\u65e5ddddAh\u70b9mm\u5206",l:"YYYY/M/D",ll:"YYYY\u5e74M\u6708D\u65e5",lll:"YYYY\u5e74M\u6708D\u65e5 HH:mm",llll:"YYYY\u5e74M\u6708D\u65e5dddd HH:mm"},meridiemParse:/\u51cc\u6668|\u65e9\u4e0a|\u4e0a\u5348|\u4e2d\u5348|\u4e0b\u5348|\u665a\u4e0a/,meridiemHour:function(p,f){return 12===p&&(p=0),"\u51cc\u6668"===f||"\u65e9\u4e0a"===f||"\u4e0a\u5348"===f?p:"\u4e0b\u5348"===f||"\u665a\u4e0a"===f?p+12:p>=11?p:p+12},meridiem:function(p,f,e){var _=100*p+f;return _<600?"\u51cc\u6668":_<900?"\u65e9\u4e0a":_<1130?"\u4e0a\u5348":_<1230?"\u4e2d\u5348":_<1800?"\u4e0b\u5348":"\u665a\u4e0a"},calendar:{sameDay:"[\u4eca\u5929]LT",nextDay:"[\u660e\u5929]LT",nextWeek:function(p){return p.week()!==this.week()?"[\u4e0b]dddLT":"[\u672c]dddLT"},lastDay:"[\u6628\u5929]LT",lastWeek:function(p){return this.week()!==p.week()?"[\u4e0a]dddLT":"[\u672c]dddLT"},sameElse:"L"},dayOfMonthOrdinalParse:/\d{1,2}(\u65e5|\u6708|\u5468)/,ordinal:function(p,f){switch(f){case"d":case"D":case"DDD":return p+"\u65e5";case"M":return p+"\u6708";case"w":case"W":return p+"\u5468";default:return p}},relativeTime:{future:"%s\u540e",past:"%s\u524d",s:"\u51e0\u79d2",ss:"%d \u79d2",m:"1 \u5206\u949f",mm:"%d \u5206\u949f",h:"1 \u5c0f\u65f6",hh:"%d \u5c0f\u65f6",d:"1 \u5929",dd:"%d \u5929",w:"1 \u5468",ww:"%d \u5468",M:"1 \u4e2a\u6708",MM:"%d \u4e2a\u6708",y:"1 \u5e74",yy:"%d \u5e74"},week:{dow:1,doy:4}})}(i(16738))},89380:function(v,S,i){!function(r){"use strict";r.defineLocale("zh-hk",{months:"\u4e00\u6708_\u4e8c\u6708_\u4e09\u6708_\u56db\u6708_\u4e94\u6708_\u516d\u6708_\u4e03\u6708_\u516b\u6708_\u4e5d\u6708_\u5341\u6708_\u5341\u4e00\u6708_\u5341\u4e8c\u6708".split("_"),monthsShort:"1\u6708_2\u6708_3\u6708_4\u6708_5\u6708_6\u6708_7\u6708_8\u6708_9\u6708_10\u6708_11\u6708_12\u6708".split("_"),weekdays:"\u661f\u671f\u65e5_\u661f\u671f\u4e00_\u661f\u671f\u4e8c_\u661f\u671f\u4e09_\u661f\u671f\u56db_\u661f\u671f\u4e94_\u661f\u671f\u516d".split("_"),weekdaysShort:"\u9031\u65e5_\u9031\u4e00_\u9031\u4e8c_\u9031\u4e09_\u9031\u56db_\u9031\u4e94_\u9031\u516d".split("_"),weekdaysMin:"\u65e5_\u4e00_\u4e8c_\u4e09_\u56db_\u4e94_\u516d".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"YYYY/MM/DD",LL:"YYYY\u5e74M\u6708D\u65e5",LLL:"YYYY\u5e74M\u6708D\u65e5 HH:mm",LLLL:"YYYY\u5e74M\u6708D\u65e5dddd HH:mm",l:"YYYY/M/D",ll:"YYYY\u5e74M\u6708D\u65e5",lll:"YYYY\u5e74M\u6708D\u65e5 HH:mm",llll:"YYYY\u5e74M\u6708D\u65e5dddd HH:mm"},meridiemParse:/\u51cc\u6668|\u65e9\u4e0a|\u4e0a\u5348|\u4e2d\u5348|\u4e0b\u5348|\u665a\u4e0a/,meridiemHour:function(p,f){return 12===p&&(p=0),"\u51cc\u6668"===f||"\u65e9\u4e0a"===f||"\u4e0a\u5348"===f?p:"\u4e2d\u5348"===f?p>=11?p:p+12:"\u4e0b\u5348"===f||"\u665a\u4e0a"===f?p+12:void 0},meridiem:function(p,f,e){var _=100*p+f;return _<600?"\u51cc\u6668":_<900?"\u65e9\u4e0a":_<1200?"\u4e0a\u5348":1200===_?"\u4e2d\u5348":_<1800?"\u4e0b\u5348":"\u665a\u4e0a"},calendar:{sameDay:"[\u4eca\u5929]LT",nextDay:"[\u660e\u5929]LT",nextWeek:"[\u4e0b]ddddLT",lastDay:"[\u6628\u5929]LT",lastWeek:"[\u4e0a]ddddLT",sameElse:"L"},dayOfMonthOrdinalParse:/\d{1,2}(\u65e5|\u6708|\u9031)/,ordinal:function(p,f){switch(f){case"d":case"D":case"DDD":return p+"\u65e5";case"M":return p+"\u6708";case"w":case"W":return p+"\u9031";default:return p}},relativeTime:{future:"%s\u5f8c",past:"%s\u524d",s:"\u5e7e\u79d2",ss:"%d \u79d2",m:"1 \u5206\u9418",mm:"%d \u5206\u9418",h:"1 \u5c0f\u6642",hh:"%d \u5c0f\u6642",d:"1 \u5929",dd:"%d \u5929",M:"1 \u500b\u6708",MM:"%d \u500b\u6708",y:"1 \u5e74",yy:"%d \u5e74"}})}(i(16738))},60874:function(v,S,i){!function(r){"use strict";r.defineLocale("zh-mo",{months:"\u4e00\u6708_\u4e8c\u6708_\u4e09\u6708_\u56db\u6708_\u4e94\u6708_\u516d\u6708_\u4e03\u6708_\u516b\u6708_\u4e5d\u6708_\u5341\u6708_\u5341\u4e00\u6708_\u5341\u4e8c\u6708".split("_"),monthsShort:"1\u6708_2\u6708_3\u6708_4\u6708_5\u6708_6\u6708_7\u6708_8\u6708_9\u6708_10\u6708_11\u6708_12\u6708".split("_"),weekdays:"\u661f\u671f\u65e5_\u661f\u671f\u4e00_\u661f\u671f\u4e8c_\u661f\u671f\u4e09_\u661f\u671f\u56db_\u661f\u671f\u4e94_\u661f\u671f\u516d".split("_"),weekdaysShort:"\u9031\u65e5_\u9031\u4e00_\u9031\u4e8c_\u9031\u4e09_\u9031\u56db_\u9031\u4e94_\u9031\u516d".split("_"),weekdaysMin:"\u65e5_\u4e00_\u4e8c_\u4e09_\u56db_\u4e94_\u516d".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"YYYY\u5e74M\u6708D\u65e5",LLL:"YYYY\u5e74M\u6708D\u65e5 HH:mm",LLLL:"YYYY\u5e74M\u6708D\u65e5dddd HH:mm",l:"D/M/YYYY",ll:"YYYY\u5e74M\u6708D\u65e5",lll:"YYYY\u5e74M\u6708D\u65e5 HH:mm",llll:"YYYY\u5e74M\u6708D\u65e5dddd HH:mm"},meridiemParse:/\u51cc\u6668|\u65e9\u4e0a|\u4e0a\u5348|\u4e2d\u5348|\u4e0b\u5348|\u665a\u4e0a/,meridiemHour:function(p,f){return 12===p&&(p=0),"\u51cc\u6668"===f||"\u65e9\u4e0a"===f||"\u4e0a\u5348"===f?p:"\u4e2d\u5348"===f?p>=11?p:p+12:"\u4e0b\u5348"===f||"\u665a\u4e0a"===f?p+12:void 0},meridiem:function(p,f,e){var _=100*p+f;return _<600?"\u51cc\u6668":_<900?"\u65e9\u4e0a":_<1130?"\u4e0a\u5348":_<1230?"\u4e2d\u5348":_<1800?"\u4e0b\u5348":"\u665a\u4e0a"},calendar:{sameDay:"[\u4eca\u5929] LT",nextDay:"[\u660e\u5929] LT",nextWeek:"[\u4e0b]dddd LT",lastDay:"[\u6628\u5929] LT",lastWeek:"[\u4e0a]dddd LT",sameElse:"L"},dayOfMonthOrdinalParse:/\d{1,2}(\u65e5|\u6708|\u9031)/,ordinal:function(p,f){switch(f){case"d":case"D":case"DDD":return p+"\u65e5";case"M":return p+"\u6708";case"w":case"W":return p+"\u9031";default:return p}},relativeTime:{future:"%s\u5167",past:"%s\u524d",s:"\u5e7e\u79d2",ss:"%d \u79d2",m:"1 \u5206\u9418",mm:"%d \u5206\u9418",h:"1 \u5c0f\u6642",hh:"%d \u5c0f\u6642",d:"1 \u5929",dd:"%d \u5929",M:"1 \u500b\u6708",MM:"%d \u500b\u6708",y:"1 \u5e74",yy:"%d \u5e74"}})}(i(16738))},96508:function(v,S,i){!function(r){"use strict";r.defineLocale("zh-tw",{months:"\u4e00\u6708_\u4e8c\u6708_\u4e09\u6708_\u56db\u6708_\u4e94\u6708_\u516d\u6708_\u4e03\u6708_\u516b\u6708_\u4e5d\u6708_\u5341\u6708_\u5341\u4e00\u6708_\u5341\u4e8c\u6708".split("_"),monthsShort:"1\u6708_2\u6708_3\u6708_4\u6708_5\u6708_6\u6708_7\u6708_8\u6708_9\u6708_10\u6708_11\u6708_12\u6708".split("_"),weekdays:"\u661f\u671f\u65e5_\u661f\u671f\u4e00_\u661f\u671f\u4e8c_\u661f\u671f\u4e09_\u661f\u671f\u56db_\u661f\u671f\u4e94_\u661f\u671f\u516d".split("_"),weekdaysShort:"\u9031\u65e5_\u9031\u4e00_\u9031\u4e8c_\u9031\u4e09_\u9031\u56db_\u9031\u4e94_\u9031\u516d".split("_"),weekdaysMin:"\u65e5_\u4e00_\u4e8c_\u4e09_\u56db_\u4e94_\u516d".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"YYYY/MM/DD",LL:"YYYY\u5e74M\u6708D\u65e5",LLL:"YYYY\u5e74M\u6708D\u65e5 HH:mm",LLLL:"YYYY\u5e74M\u6708D\u65e5dddd HH:mm",l:"YYYY/M/D",ll:"YYYY\u5e74M\u6708D\u65e5",lll:"YYYY\u5e74M\u6708D\u65e5 HH:mm",llll:"YYYY\u5e74M\u6708D\u65e5dddd HH:mm"},meridiemParse:/\u51cc\u6668|\u65e9\u4e0a|\u4e0a\u5348|\u4e2d\u5348|\u4e0b\u5348|\u665a\u4e0a/,meridiemHour:function(p,f){return 12===p&&(p=0),"\u51cc\u6668"===f||"\u65e9\u4e0a"===f||"\u4e0a\u5348"===f?p:"\u4e2d\u5348"===f?p>=11?p:p+12:"\u4e0b\u5348"===f||"\u665a\u4e0a"===f?p+12:void 0},meridiem:function(p,f,e){var _=100*p+f;return _<600?"\u51cc\u6668":_<900?"\u65e9\u4e0a":_<1130?"\u4e0a\u5348":_<1230?"\u4e2d\u5348":_<1800?"\u4e0b\u5348":"\u665a\u4e0a"},calendar:{sameDay:"[\u4eca\u5929] LT",nextDay:"[\u660e\u5929] LT",nextWeek:"[\u4e0b]dddd LT",lastDay:"[\u6628\u5929] LT",lastWeek:"[\u4e0a]dddd LT",sameElse:"L"},dayOfMonthOrdinalParse:/\d{1,2}(\u65e5|\u6708|\u9031)/,ordinal:function(p,f){switch(f){case"d":case"D":case"DDD":return p+"\u65e5";case"M":return p+"\u6708";case"w":case"W":return p+"\u9031";default:return p}},relativeTime:{future:"%s\u5f8c",past:"%s\u524d",s:"\u5e7e\u79d2",ss:"%d \u79d2",m:"1 \u5206\u9418",mm:"%d \u5206\u9418",h:"1 \u5c0f\u6642",hh:"%d \u5c0f\u6642",d:"1 \u5929",dd:"%d \u5929",M:"1 \u500b\u6708",MM:"%d \u500b\u6708",y:"1 \u5e74",yy:"%d \u5e74"}})}(i(16738))},16738:function(v,S,i){(v=i.nmd(v)).exports=function(){"use strict";var r,ue;function u(){return r.apply(null,arguments)}function f(X){return X instanceof Array||"[object Array]"===Object.prototype.toString.call(X)}function e(X){return null!=X&&"[object Object]"===Object.prototype.toString.call(X)}function _(X,ye){return Object.prototype.hasOwnProperty.call(X,ye)}function y(X){if(Object.getOwnPropertyNames)return 0===Object.getOwnPropertyNames(X).length;var ye;for(ye in X)if(_(X,ye))return!1;return!0}function T(X){return void 0===X}function M(X){return"number"==typeof X||"[object Number]"===Object.prototype.toString.call(X)}function R(X){return X instanceof Date||"[object Date]"===Object.prototype.toString.call(X)}function F(X,ye){var bt,nt=[],Qt=X.length;for(bt=0;bt<Qt;++bt)nt.push(ye(X[bt],bt));return nt}function Z(X,ye){for(var nt in ye)_(ye,nt)&&(X[nt]=ye[nt]);return _(ye,"toString")&&(X.toString=ye.toString),_(ye,"valueOf")&&(X.valueOf=ye.valueOf),X}function J(X,ye,nt,bt){return cu(X,ye,nt,bt,!0).utc()}function ee(X){return null==X._pf&&(X._pf={empty:!1,unusedTokens:[],unusedInput:[],overflow:-2,charsLeftOver:0,nullInput:!1,invalidEra:null,invalidMonth:null,invalidFormat:!1,userInvalidated:!1,iso:!1,parsedDateParts:[],era:null,meridiem:null,rfc2822:!1,weekdayMismatch:!1}),X._pf}function ae(X){if(null==X._isValid){var ye=ee(X),nt=ue.call(ye.parsedDateParts,function(Qt){return null!=Qt}),bt=!isNaN(X._d.getTime())&&ye.overflow<0&&!ye.empty&&!ye.invalidEra&&!ye.invalidMonth&&!ye.invalidWeekday&&!ye.weekdayMismatch&&!ye.nullInput&&!ye.invalidFormat&&!ye.userInvalidated&&(!ye.meridiem||ye.meridiem&&nt);if(X._strict&&(bt=bt&&0===ye.charsLeftOver&&0===ye.unusedTokens.length&&void 0===ye.bigHour),null!=Object.isFrozen&&Object.isFrozen(X))return bt;X._isValid=bt}return X._isValid}function $(X){var ye=J(NaN);return null!=X?Z(ee(ye),X):ee(ye).userInvalidated=!0,ye}ue=Array.prototype.some?Array.prototype.some:function(X){var bt,ye=Object(this),nt=ye.length>>>0;for(bt=0;bt<nt;bt++)if(bt in ye&&X.call(this,ye[bt],bt,ye))return!0;return!1};var se=u.momentProperties=[],ve=!1;function oe(X,ye){var nt,bt,Qt,fr=se.length;if(T(ye._isAMomentObject)||(X._isAMomentObject=ye._isAMomentObject),T(ye._i)||(X._i=ye._i),T(ye._f)||(X._f=ye._f),T(ye._l)||(X._l=ye._l),T(ye._strict)||(X._strict=ye._strict),T(ye._tzm)||(X._tzm=ye._tzm),T(ye._isUTC)||(X._isUTC=ye._isUTC),T(ye._offset)||(X._offset=ye._offset),T(ye._pf)||(X._pf=ee(ye)),T(ye._locale)||(X._locale=ye._locale),fr>0)for(nt=0;nt<fr;nt++)T(Qt=ye[bt=se[nt]])||(X[bt]=Qt);return X}function he(X){oe(this,X),this._d=new Date(null!=X._d?X._d.getTime():NaN),this.isValid()||(this._d=new Date(NaN)),!1===ve&&(ve=!0,u.updateOffset(this),ve=!1)}function me(X){return X instanceof he||null!=X&&null!=X._isAMomentObject}function Oe(X){!1===u.suppressDeprecationWarnings&&"undefined"!=typeof console&&console.warn&&console.warn("Deprecation warning: "+X)}function ce(X,ye){var nt=!0;return Z(function(){if(null!=u.deprecationHandler&&u.deprecationHandler(null,X),nt){var Qt,fr,vi,bt=[],ps=arguments.length;for(fr=0;fr<ps;fr++){if(Qt="","object"==typeof arguments[fr]){for(vi in Qt+="\n["+fr+"] ",arguments[0])_(arguments[0],vi)&&(Qt+=vi+": "+arguments[0][vi]+", ");Qt=Qt.slice(0,-2)}else Qt=arguments[fr];bt.push(Qt)}Oe(X+"\nArguments: "+Array.prototype.slice.call(bt).join("")+"\n"+(new Error).stack),nt=!1}return ye.apply(this,arguments)},ye)}var He,dt={};function ze(X,ye){null!=u.deprecationHandler&&u.deprecationHandler(X,ye),dt[X]||(Oe(ye),dt[X]=!0)}function Ye(X){return"undefined"!=typeof Function&&X instanceof Function||"[object Function]"===Object.prototype.toString.call(X)}function Ie(X,ye){var bt,nt=Z({},X);for(bt in ye)_(ye,bt)&&(e(X[bt])&&e(ye[bt])?(nt[bt]={},Z(nt[bt],X[bt]),Z(nt[bt],ye[bt])):null!=ye[bt]?nt[bt]=ye[bt]:delete nt[bt]);for(bt in X)_(X,bt)&&!_(ye,bt)&&e(X[bt])&&(nt[bt]=Z({},nt[bt]));return nt}function Ve(X){null!=X&&this.set(X)}u.suppressDeprecationWarnings=!1,u.deprecationHandler=null,He=Object.keys?Object.keys:function(X){var ye,nt=[];for(ye in X)_(X,ye)&&nt.push(ye);return nt};function en(X,ye,nt){var bt=""+Math.abs(X);return(X>=0?nt?"+":"":"-")+Math.pow(10,Math.max(0,ye-bt.length)).toString().substr(1)+bt}var $t=/(\[[^\[]*\])|(\\)?([Hh]mm(ss)?|Mo|MM?M?M?|Do|DDDo|DD?D?D?|ddd?d?|do?|w[o|w]?|W[o|W]?|Qo?|N{1,5}|YYYYYY|YYYYY|YYYY|YY|y{2,4}|yo?|gg(ggg?)?|GG(GGG?)?|e|E|a|A|hh?|HH?|kk?|mm?|ss?|S{1,9}|x|X|zz?|ZZ?|.)/g,Gt=/(\[[^\[]*\])|(\\)?(LTS|LT|LL?L?L?|l{1,4})/g,Ut={},Bt={};function mt(X,ye,nt,bt){var Qt=bt;"string"==typeof bt&&(Qt=function(){return this[bt]()}),X&&(Bt[X]=Qt),ye&&(Bt[ye[0]]=function(){return en(Qt.apply(this,arguments),ye[1],ye[2])}),nt&&(Bt[nt]=function(){return this.localeData().ordinal(Qt.apply(this,arguments),X)})}function Yt(X){return X.match(/\[[\s\S]/)?X.replace(/^\[|\]$/g,""):X.replace(/\\/g,"")}function zt(X,ye){return X.isValid()?(ye=Yn(ye,X.localeData()),Ut[ye]=Ut[ye]||function(X){var nt,bt,ye=X.match($t);for(nt=0,bt=ye.length;nt<bt;nt++)ye[nt]=Bt[ye[nt]]?Bt[ye[nt]]:Yt(ye[nt]);return function(Qt){var vi,fr="";for(vi=0;vi<bt;vi++)fr+=Ye(ye[vi])?ye[vi].call(Qt,X):ye[vi];return fr}}(ye),Ut[ye](X)):X.localeData().invalidDate()}function Yn(X,ye){var nt=5;function bt(Qt){return ye.longDateFormat(Qt)||Qt}for(Gt.lastIndex=0;nt>=0&&Gt.test(X);)X=X.replace(Gt,bt),Gt.lastIndex=0,nt-=1;return X}var di={};function $i(X,ye){var nt=X.toLowerCase();di[nt]=di[nt+"s"]=di[ye]=X}function Hi(X){return"string"==typeof X?di[X]||di[X.toLowerCase()]:void 0}function Br(X){var nt,bt,ye={};for(bt in X)_(X,bt)&&(nt=Hi(bt))&&(ye[nt]=X[bt]);return ye}var On={};function Wt(X,ye){On[X]=ye}function ir(X){return X%4==0&&X%100!=0||X%400==0}function Lr(X){return X<0?Math.ceil(X)||0:Math.floor(X)}function Vn(X){var ye=+X,nt=0;return 0!==ye&&isFinite(ye)&&(nt=Lr(ye)),nt}function zr(X,ye){return function(nt){return null!=nt?(Ai(this,X,nt),u.updateOffset(this,ye),this):hi(this,X)}}function hi(X,ye){return X.isValid()?X._d["get"+(X._isUTC?"UTC":"")+ye]():NaN}function Ai(X,ye,nt){X.isValid()&&!isNaN(nt)&&("FullYear"===ye&&ir(X.year())&&1===X.month()&&29===X.date()?(nt=Vn(nt),X._d["set"+(X._isUTC?"UTC":"")+ye](nt,X.month(),xo(nt,X.month()))):X._d["set"+(X._isUTC?"UTC":"")+ye](nt))}var wn,gn=/\d/,En=/\d\d/,mr=/\d{3}/,Xt=/\d{4}/,zn=/[+-]?\d{6}/,vr=/\d\d?/,si=/\d\d\d\d?/,Ii=/\d\d\d\d\d\d?/,no=/\d{1,3}/,so=/\d{1,4}/,Ze=/[+-]?\d{1,6}/,Dr=/\d+/,jt=/[+-]?\d+/,xt=/Z|[+-]\d\d:?\d\d/gi,mn=/Z|[+-]\d\d(?::?\d\d)?/gi,kn=/[0-9]{0,256}['a-z\u00A0-\u05FF\u0700-\uD7FF\uF900-\uFDCF\uFDF0-\uFF07\uFF10-\uFFEF]{1,256}|[\u0600-\u06FF\/]{1,256}(\s*?[\u0600-\u06FF]{1,256}){1,2}/i;function nr(X,ye,nt){wn[X]=Ye(ye)?ye:function(bt,Qt){return bt&&nt?nt:ye}}function Gi(X,ye){return _(wn,X)?wn[X](ye._strict,ye._locale):new RegExp(function(X){return yo(X.replace("\\","").replace(/\\(\[)|\\(\])|\[([^\]\[]*)\]|\\(.)/g,function(ye,nt,bt,Qt,fr){return nt||bt||Qt||fr}))}(X))}function yo(X){return X.replace(/[-\/\\^$*+?.()|[\]{}]/g,"\\$&")}wn={};var Mo={};function Vi(X,ye){var nt,Qt,bt=ye;for("string"==typeof X&&(X=[X]),M(ye)&&(bt=function(fr,vi){vi[ye]=Vn(fr)}),Qt=X.length,nt=0;nt<Qt;nt++)Mo[X[nt]]=bt}function cs(X,ye){Vi(X,function(nt,bt,Qt,fr){Qt._w=Qt._w||{},ye(nt,Qt._w,Qt,fr)})}function zo(X,ye,nt){null!=ye&&_(Mo,X)&&Mo[X](ye,nt._a,nt,X)}var Bo;function xo(X,ye){if(isNaN(X)||isNaN(ye))return NaN;var nt=function(X,ye){return(X%ye+ye)%ye}(ye,12);return X+=(ye-nt)/12,1===nt?ir(X)?29:28:31-nt%7%2}Bo=Array.prototype.indexOf?Array.prototype.indexOf:function(X){var ye;for(ye=0;ye<this.length;++ye)if(this[ye]===X)return ye;return-1},mt("M",["MM",2],"Mo",function(){return this.month()+1}),mt("MMM",0,0,function(X){return this.localeData().monthsShort(this,X)}),mt("MMMM",0,0,function(X){return this.localeData().months(this,X)}),$i("month","M"),Wt("month",8),nr("M",vr),nr("MM",vr,En),nr("MMM",function(X,ye){return ye.monthsShortRegex(X)}),nr("MMMM",function(X,ye){return ye.monthsRegex(X)}),Vi(["M","MM"],function(X,ye){ye[1]=Vn(X)-1}),Vi(["MMM","MMMM"],function(X,ye,nt,bt){var Qt=nt._locale.monthsParse(X,bt,nt._strict);null!=Qt?ye[1]=Qt:ee(nt).invalidMonth=X});var Li="January_February_March_April_May_June_July_August_September_October_November_December".split("_"),ar="Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec".split("_"),ln=/D[oD]?(\[[^\[\]]*\]|\s)+MMMM?/,Ht=kn,cn=kn;function nn(X,ye,nt){var bt,Qt,fr,vi=X.toLocaleLowerCase();if(!this._monthsParse)for(this._monthsParse=[],this._longMonthsParse=[],this._shortMonthsParse=[],bt=0;bt<12;++bt)fr=J([2e3,bt]),this._shortMonthsParse[bt]=this.monthsShort(fr,"").toLocaleLowerCase(),this._longMonthsParse[bt]=this.months(fr,"").toLocaleLowerCase();return nt?"MMM"===ye?-1!==(Qt=Bo.call(this._shortMonthsParse,vi))?Qt:null:-1!==(Qt=Bo.call(this._longMonthsParse,vi))?Qt:null:"MMM"===ye?-1!==(Qt=Bo.call(this._shortMonthsParse,vi))||-1!==(Qt=Bo.call(this._longMonthsParse,vi))?Qt:null:-1!==(Qt=Bo.call(this._longMonthsParse,vi))||-1!==(Qt=Bo.call(this._shortMonthsParse,vi))?Qt:null}function br(X,ye){var nt;if(!X.isValid())return X;if("string"==typeof ye)if(/^\d+$/.test(ye))ye=Vn(ye);else if(!M(ye=X.localeData().monthsParse(ye)))return X;return nt=Math.min(X.date(),xo(X.year(),ye)),X._d["set"+(X._isUTC?"UTC":"")+"Month"](ye,nt),X}function zi(X){return null!=X?(br(this,X),u.updateOffset(this,!0),this):hi(this,"Month")}function _s(){function X(vi,ps){return ps.length-vi.length}var Qt,fr,ye=[],nt=[],bt=[];for(Qt=0;Qt<12;Qt++)fr=J([2e3,Qt]),ye.push(this.monthsShort(fr,"")),nt.push(this.months(fr,"")),bt.push(this.months(fr,"")),bt.push(this.monthsShort(fr,""));for(ye.sort(X),nt.sort(X),bt.sort(X),Qt=0;Qt<12;Qt++)ye[Qt]=yo(ye[Qt]),nt[Qt]=yo(nt[Qt]);for(Qt=0;Qt<24;Qt++)bt[Qt]=yo(bt[Qt]);this._monthsRegex=new RegExp("^("+bt.join("|")+")","i"),this._monthsShortRegex=this._monthsRegex,this._monthsStrictRegex=new RegExp("^("+nt.join("|")+")","i"),this._monthsShortStrictRegex=new RegExp("^("+ye.join("|")+")","i")}function bs(X){return ir(X)?366:365}mt("Y",0,0,function(){var X=this.year();return X<=9999?en(X,4):"+"+X}),mt(0,["YY",2],0,function(){return this.year()%100}),mt(0,["YYYY",4],0,"year"),mt(0,["YYYYY",5],0,"year"),mt(0,["YYYYYY",6,!0],0,"year"),$i("year","y"),Wt("year",1),nr("Y",jt),nr("YY",vr,En),nr("YYYY",so,Xt),nr("YYYYY",Ze,zn),nr("YYYYYY",Ze,zn),Vi(["YYYYY","YYYYYY"],0),Vi("YYYY",function(X,ye){ye[0]=2===X.length?u.parseTwoDigitYear(X):Vn(X)}),Vi("YY",function(X,ye){ye[0]=u.parseTwoDigitYear(X)}),Vi("Y",function(X,ye){ye[0]=parseInt(X,10)}),u.parseTwoDigitYear=function(X){return Vn(X)+(Vn(X)>68?1900:2e3)};var qo=zr("FullYear",!0);function Ia(X,ye,nt,bt,Qt,fr,vi){var ps;return X<100&&X>=0?(ps=new Date(X+400,ye,nt,bt,Qt,fr,vi),isFinite(ps.getFullYear())&&ps.setFullYear(X)):ps=new Date(X,ye,nt,bt,Qt,fr,vi),ps}function pa(X){var ye,nt;return X<100&&X>=0?((nt=Array.prototype.slice.call(arguments))[0]=X+400,ye=new Date(Date.UTC.apply(null,nt)),isFinite(ye.getUTCFullYear())&&ye.setUTCFullYear(X)):ye=new Date(Date.UTC.apply(null,arguments)),ye}function Bs(X,ye,nt){var bt=7+ye-nt;return-(7+pa(X,0,bt).getUTCDay()-ye)%7+bt-1}function Yl(X,ye,nt,bt,Qt){var xa,ia,ps=1+7*(ye-1)+(7+nt-bt)%7+Bs(X,bt,Qt);return ps<=0?ia=bs(xa=X-1)+ps:ps>bs(X)?(xa=X+1,ia=ps-bs(X)):(xa=X,ia=ps),{year:xa,dayOfYear:ia}}function yl(X,ye,nt){var fr,vi,bt=Bs(X.year(),ye,nt),Qt=Math.floor((X.dayOfYear()-bt-1)/7)+1;return Qt<1?fr=Qt+fo(vi=X.year()-1,ye,nt):Qt>fo(X.year(),ye,nt)?(fr=Qt-fo(X.year(),ye,nt),vi=X.year()+1):(vi=X.year(),fr=Qt),{week:fr,year:vi}}function fo(X,ye,nt){var bt=Bs(X,ye,nt),Qt=Bs(X+1,ye,nt);return(bs(X)-bt+Qt)/7}mt("w",["ww",2],"wo","week"),mt("W",["WW",2],"Wo","isoWeek"),$i("week","w"),$i("isoWeek","W"),Wt("week",5),Wt("isoWeek",5),nr("w",vr),nr("ww",vr,En),nr("W",vr),nr("WW",vr,En),cs(["w","ww","W","WW"],function(X,ye,nt,bt){ye[bt.substr(0,1)]=Vn(X)});function Eo(X,ye){return X.slice(ye,7).concat(X.slice(0,ye))}mt("d",0,"do","day"),mt("dd",0,0,function(X){return this.localeData().weekdaysMin(this,X)}),mt("ddd",0,0,function(X){return this.localeData().weekdaysShort(this,X)}),mt("dddd",0,0,function(X){return this.localeData().weekdays(this,X)}),mt("e",0,0,"weekday"),mt("E",0,0,"isoWeekday"),$i("day","d"),$i("weekday","e"),$i("isoWeekday","E"),Wt("day",11),Wt("weekday",11),Wt("isoWeekday",11),nr("d",vr),nr("e",vr),nr("E",vr),nr("dd",function(X,ye){return ye.weekdaysMinRegex(X)}),nr("ddd",function(X,ye){return ye.weekdaysShortRegex(X)}),nr("dddd",function(X,ye){return ye.weekdaysRegex(X)}),cs(["dd","ddd","dddd"],function(X,ye,nt,bt){var Qt=nt._locale.weekdaysParse(X,bt,nt._strict);null!=Qt?ye.d=Qt:ee(nt).invalidWeekday=X}),cs(["d","e","E"],function(X,ye,nt,bt){ye[bt]=Vn(X)});var ks="Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday".split("_"),ms="Sun_Mon_Tue_Wed_Thu_Fri_Sat".split("_"),Co="Su_Mo_Tu_We_Th_Fr_Sa".split("_"),kr=kn,ro=kn,tt=kn;function Pt(X,ye,nt){var bt,Qt,fr,vi=X.toLocaleLowerCase();if(!this._weekdaysParse)for(this._weekdaysParse=[],this._shortWeekdaysParse=[],this._minWeekdaysParse=[],bt=0;bt<7;++bt)fr=J([2e3,1]).day(bt),this._minWeekdaysParse[bt]=this.weekdaysMin(fr,"").toLocaleLowerCase(),this._shortWeekdaysParse[bt]=this.weekdaysShort(fr,"").toLocaleLowerCase(),this._weekdaysParse[bt]=this.weekdays(fr,"").toLocaleLowerCase();return nt?"dddd"===ye?-1!==(Qt=Bo.call(this._weekdaysParse,vi))?Qt:null:"ddd"===ye?-1!==(Qt=Bo.call(this._shortWeekdaysParse,vi))?Qt:null:-1!==(Qt=Bo.call(this._minWeekdaysParse,vi))?Qt:null:"dddd"===ye?-1!==(Qt=Bo.call(this._weekdaysParse,vi))||-1!==(Qt=Bo.call(this._shortWeekdaysParse,vi))||-1!==(Qt=Bo.call(this._minWeekdaysParse,vi))?Qt:null:"ddd"===ye?-1!==(Qt=Bo.call(this._shortWeekdaysParse,vi))||-1!==(Qt=Bo.call(this._weekdaysParse,vi))||-1!==(Qt=Bo.call(this._minWeekdaysParse,vi))?Qt:null:-1!==(Qt=Bo.call(this._minWeekdaysParse,vi))||-1!==(Qt=Bo.call(this._weekdaysParse,vi))||-1!==(Qt=Bo.call(this._shortWeekdaysParse,vi))?Qt:null}function To(){function X(_l,Jl){return Jl.length-_l.length}var fr,vi,ps,xa,ia,ye=[],nt=[],bt=[],Qt=[];for(fr=0;fr<7;fr++)vi=J([2e3,1]).day(fr),ps=yo(this.weekdaysMin(vi,"")),xa=yo(this.weekdaysShort(vi,"")),ia=yo(this.weekdays(vi,"")),ye.push(ps),nt.push(xa),bt.push(ia),Qt.push(ps),Qt.push(xa),Qt.push(ia);ye.sort(X),nt.sort(X),bt.sort(X),Qt.sort(X),this._weekdaysRegex=new RegExp("^("+Qt.join("|")+")","i"),this._weekdaysShortRegex=this._weekdaysRegex,this._weekdaysMinRegex=this._weekdaysRegex,this._weekdaysStrictRegex=new RegExp("^("+bt.join("|")+")","i"),this._weekdaysShortStrictRegex=new RegExp("^("+nt.join("|")+")","i"),this._weekdaysMinStrictRegex=new RegExp("^("+ye.join("|")+")","i")}function Ea(){return this.hours()%12||12}function qu(X,ye){mt(X,0,0,function(){return this.localeData().meridiem(this.hours(),this.minutes(),ye)})}function Ru(X,ye){return ye._meridiemParse}mt("H",["HH",2],0,"hour"),mt("h",["hh",2],0,Ea),mt("k",["kk",2],0,function(){return this.hours()||24}),mt("hmm",0,0,function(){return""+Ea.apply(this)+en(this.minutes(),2)}),mt("hmmss",0,0,function(){return""+Ea.apply(this)+en(this.minutes(),2)+en(this.seconds(),2)}),mt("Hmm",0,0,function(){return""+this.hours()+en(this.minutes(),2)}),mt("Hmmss",0,0,function(){return""+this.hours()+en(this.minutes(),2)+en(this.seconds(),2)}),qu("a",!0),qu("A",!1),$i("hour","h"),Wt("hour",13),nr("a",Ru),nr("A",Ru),nr("H",vr),nr("h",vr),nr("k",vr),nr("HH",vr,En),nr("hh",vr,En),nr("kk",vr,En),nr("hmm",si),nr("hmmss",Ii),nr("Hmm",si),nr("Hmmss",Ii),Vi(["H","HH"],3),Vi(["k","kk"],function(X,ye,nt){var bt=Vn(X);ye[3]=24===bt?0:bt}),Vi(["a","A"],function(X,ye,nt){nt._isPm=nt._locale.isPM(X),nt._meridiem=X}),Vi(["h","hh"],function(X,ye,nt){ye[3]=Vn(X),ee(nt).bigHour=!0}),Vi("hmm",function(X,ye,nt){var bt=X.length-2;ye[3]=Vn(X.substr(0,bt)),ye[4]=Vn(X.substr(bt)),ee(nt).bigHour=!0}),Vi("hmmss",function(X,ye,nt){var bt=X.length-4,Qt=X.length-2;ye[3]=Vn(X.substr(0,bt)),ye[4]=Vn(X.substr(bt,2)),ye[5]=Vn(X.substr(Qt)),ee(nt).bigHour=!0}),Vi("Hmm",function(X,ye,nt){var bt=X.length-2;ye[3]=Vn(X.substr(0,bt)),ye[4]=Vn(X.substr(bt))}),Vi("Hmmss",function(X,ye,nt){var bt=X.length-4,Qt=X.length-2;ye[3]=Vn(X.substr(0,bt)),ye[4]=Vn(X.substr(bt,2)),ye[5]=Vn(X.substr(Qt))});var ed=zr("Hours",!0);var ou,Zl={calendar:{sameDay:"[Today at] LT",nextDay:"[Tomorrow at] LT",nextWeek:"dddd [at] LT",lastDay:"[Yesterday at] LT",lastWeek:"[Last] dddd [at] LT",sameElse:"L"},longDateFormat:{LTS:"h:mm:ss A",LT:"h:mm A",L:"MM/DD/YYYY",LL:"MMMM D, YYYY",LLL:"MMMM D, YYYY h:mm A",LLLL:"dddd, MMMM D, YYYY h:mm A"},invalidDate:"Invalid date",ordinal:"%d",dayOfMonthOrdinalParse:/\d{1,2}/,relativeTime:{future:"in %s",past:"%s ago",s:"a few seconds",ss:"%d seconds",m:"a minute",mm:"%d minutes",h:"an hour",hh:"%d hours",d:"a day",dd:"%d days",w:"a week",ww:"%d weeks",M:"a month",MM:"%d months",y:"a year",yy:"%d years"},months:Li,monthsShort:ar,week:{dow:0,doy:6},weekdays:ks,weekdaysMin:Co,weekdaysShort:ms,meridiemParse:/[ap]\.?m?\.?/i},$s={},dc={};function el(X,ye){var nt,bt=Math.min(X.length,ye.length);for(nt=0;nt<bt;nt+=1)if(X[nt]!==ye[nt])return nt;return bt}function Cu(X){return X&&X.toLowerCase().replace("_","-")}function Nt(X){var ye=null;if(void 0===$s[X]&&v&&v.exports&&function(X){return null!=X.match("^[^/\\\\]*$")}(X))try{ye=ou._abbr,i(46700)("./"+X),ct(ye)}catch(bt){$s[X]=null}return $s[X]}function ct(X,ye){var nt;return X&&((nt=T(ye)?De(X):Te(X,ye))?ou=nt:"undefined"!=typeof console&&console.warn&&console.warn("Locale "+X+" not found. Did you forget to load it?")),ou._abbr}function Te(X,ye){if(null!==ye){var nt,bt=Zl;if(ye.abbr=X,null!=$s[X])ze("defineLocaleOverride","use moment.updateLocale(localeName, config) to change an existing locale. moment.defineLocale(localeName, config) should only be used for creating a new locale See http://momentjs.com/guides/#/warnings/define-locale/ for more info."),bt=$s[X]._config;else if(null!=ye.parentLocale)if(null!=$s[ye.parentLocale])bt=$s[ye.parentLocale]._config;else{if(null==(nt=Nt(ye.parentLocale)))return dc[ye.parentLocale]||(dc[ye.parentLocale]=[]),dc[ye.parentLocale].push({name:X,config:ye}),null;bt=nt._config}return $s[X]=new Ve(Ie(bt,ye)),dc[X]&&dc[X].forEach(function(Qt){Te(Qt.name,Qt.config)}),ct(X),$s[X]}return delete $s[X],null}function De(X){var ye;if(X&&X._locale&&X._locale._abbr&&(X=X._locale._abbr),!X)return ou;if(!f(X)){if(ye=Nt(X))return ye;X=[X]}return function(X){for(var nt,bt,Qt,fr,ye=0;ye<X.length;){for(nt=(fr=Cu(X[ye]).split("-")).length,bt=(bt=Cu(X[ye+1]))?bt.split("-"):null;nt>0;){if(Qt=Nt(fr.slice(0,nt).join("-")))return Qt;if(bt&&bt.length>=nt&&el(fr,bt)>=nt-1)break;nt--}ye++}return ou}(X)}function dr(X){var ye,nt=X._a;return nt&&-2===ee(X).overflow&&(ye=nt[1]<0||nt[1]>11?1:nt[2]<1||nt[2]>xo(nt[0],nt[1])?2:nt[3]<0||nt[3]>24||24===nt[3]&&(0!==nt[4]||0!==nt[5]||0!==nt[6])?3:nt[4]<0||nt[4]>59?4:nt[5]<0||nt[5]>59?5:nt[6]<0||nt[6]>999?6:-1,ee(X)._overflowDayOfYear&&(ye<0||ye>2)&&(ye=2),ee(X)._overflowWeeks&&-1===ye&&(ye=7),ee(X)._overflowWeekday&&-1===ye&&(ye=8),ee(X).overflow=ye),X}var Qi=/^\s*((?:[+-]\d{6}|\d{4})-(?:\d\d-\d\d|W\d\d-\d|W\d\d|\d\d\d|\d\d))(?:(T| )(\d\d(?::\d\d(?::\d\d(?:[.,]\d+)?)?)?)([+-]\d\d(?::?\d\d)?|\s*Z)?)?$/,Jo=/^\s*((?:[+-]\d{6}|\d{4})(?:\d\d\d\d|W\d\d\d|W\d\d|\d\d\d|\d\d|))(?:(T| )(\d\d(?:\d\d(?:\d\d(?:[.,]\d+)?)?)?)([+-]\d\d(?::?\d\d)?|\s*Z)?)?$/,Es=/Z|[+-]\d\d(?::?\d\d)?/,vs=[["YYYYYY-MM-DD",/[+-]\d{6}-\d\d-\d\d/],["YYYY-MM-DD",/\d{4}-\d\d-\d\d/],["GGGG-[W]WW-E",/\d{4}-W\d\d-\d/],["GGGG-[W]WW",/\d{4}-W\d\d/,!1],["YYYY-DDD",/\d{4}-\d{3}/],["YYYY-MM",/\d{4}-\d\d/,!1],["YYYYYYMMDD",/[+-]\d{10}/],["YYYYMMDD",/\d{8}/],["GGGG[W]WWE",/\d{4}W\d{3}/],["GGGG[W]WW",/\d{4}W\d{2}/,!1],["YYYYDDD",/\d{7}/],["YYYYMM",/\d{6}/,!1],["YYYY",/\d{4}/,!1]],Ms=[["HH:mm:ss.SSSS",/\d\d:\d\d:\d\d\.\d+/],["HH:mm:ss,SSSS",/\d\d:\d\d:\d\d,\d+/],["HH:mm:ss",/\d\d:\d\d:\d\d/],["HH:mm",/\d\d:\d\d/],["HHmmss.SSSS",/\d\d\d\d\d\d\.\d+/],["HHmmss,SSSS",/\d\d\d\d\d\d,\d+/],["HHmmss",/\d\d\d\d\d\d/],["HHmm",/\d\d\d\d/],["HH",/\d\d/]],Ma=/^\/?Date\((-?\d+)/i,uu=/^(?:(Mon|Tue|Wed|Thu|Fri|Sat|Sun),?\s)?(\d{1,2})\s(Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)\s(\d{2,4})\s(\d\d):(\d\d)(?::(\d\d))?\s(?:(UT|GMT|[ECMP][SD]T)|([Zz])|([+-]\d{4}))$/,Wa={UT:0,GMT:0,EDT:-240,EST:-300,CDT:-300,CST:-360,MDT:-360,MST:-420,PDT:-420,PST:-480};function Pl(X){var ye,nt,fr,vi,ps,xa,bt=X._i,Qt=Qi.exec(bt)||Jo.exec(bt),ia=vs.length,_l=Ms.length;if(Qt){for(ee(X).iso=!0,ye=0,nt=ia;ye<nt;ye++)if(vs[ye][1].exec(Qt[1])){vi=vs[ye][0],fr=!1!==vs[ye][2];break}if(null==vi)return void(X._isValid=!1);if(Qt[3]){for(ye=0,nt=_l;ye<nt;ye++)if(Ms[ye][1].exec(Qt[3])){ps=(Qt[2]||" ")+Ms[ye][0];break}if(null==ps)return void(X._isValid=!1)}if(!fr&&null!=ps)return void(X._isValid=!1);if(Qt[4]){if(!Es.exec(Qt[4]))return void(X._isValid=!1);xa="Z"}X._f=vi+(ps||"")+(xa||""),ua(X)}else X._isValid=!1}function Ol(X){var ye=parseInt(X,10);return ye<=49?2e3+ye:ye<=999?1900+ye:ye}function Pc(X){var nt,ye=uu.exec(function(X){return X.replace(/\([^)]*\)|[\n\t]/g," ").replace(/(\s\s+)/g," ").replace(/^\s\s*/,"").replace(/\s\s*$/,"")}(X._i));if(ye){if(nt=function(X,ye,nt,bt,Qt,fr){var vi=[Ol(X),ar.indexOf(ye),parseInt(nt,10),parseInt(bt,10),parseInt(Qt,10)];return fr&&vi.push(parseInt(fr,10)),vi}(ye[4],ye[3],ye[2],ye[5],ye[6],ye[7]),!function(X,ye,nt){return!X||ms.indexOf(X)===new Date(ye[0],ye[1],ye[2]).getDay()||(ee(nt).weekdayMismatch=!0,nt._isValid=!1,!1)}(ye[1],nt,X))return;X._a=nt,X._tzm=function(X,ye,nt){if(X)return Wa[X];if(ye)return 0;var bt=parseInt(nt,10),Qt=bt%100;return(bt-Qt)/100*60+Qt}(ye[8],ye[9],ye[10]),X._d=pa.apply(null,X._a),X._d.setUTCMinutes(X._d.getUTCMinutes()-X._tzm),ee(X).rfc2822=!0}else X._isValid=!1}function Ic(X,ye,nt){return null!=X?X:null!=ye?ye:nt}function tc(X){var ye,nt,Qt,fr,vi,bt=[];if(!X._d){for(Qt=function(X){var ye=new Date(u.now());return X._useUTC?[ye.getUTCFullYear(),ye.getUTCMonth(),ye.getUTCDate()]:[ye.getFullYear(),ye.getMonth(),ye.getDate()]}(X),X._w&&null==X._a[2]&&null==X._a[1]&&function(X){var ye,nt,bt,Qt,fr,vi,ps,xa,ia;null!=(ye=X._w).GG||null!=ye.W||null!=ye.E?(fr=1,vi=4,nt=Ic(ye.GG,X._a[0],yl(Gs(),1,4).year),bt=Ic(ye.W,1),((Qt=Ic(ye.E,1))<1||Qt>7)&&(xa=!0)):(fr=X._locale._week.dow,vi=X._locale._week.doy,ia=yl(Gs(),fr,vi),nt=Ic(ye.gg,X._a[0],ia.year),bt=Ic(ye.w,ia.week),null!=ye.d?((Qt=ye.d)<0||Qt>6)&&(xa=!0):null!=ye.e?(Qt=ye.e+fr,(ye.e<0||ye.e>6)&&(xa=!0)):Qt=fr),bt<1||bt>fo(nt,fr,vi)?ee(X)._overflowWeeks=!0:null!=xa?ee(X)._overflowWeekday=!0:(ps=Yl(nt,bt,Qt,fr,vi),X._a[0]=ps.year,X._dayOfYear=ps.dayOfYear)}(X),null!=X._dayOfYear&&(vi=Ic(X._a[0],Qt[0]),(X._dayOfYear>bs(vi)||0===X._dayOfYear)&&(ee(X)._overflowDayOfYear=!0),nt=pa(vi,0,X._dayOfYear),X._a[1]=nt.getUTCMonth(),X._a[2]=nt.getUTCDate()),ye=0;ye<3&&null==X._a[ye];++ye)X._a[ye]=bt[ye]=Qt[ye];for(;ye<7;ye++)X._a[ye]=bt[ye]=null==X._a[ye]?2===ye?1:0:X._a[ye];24===X._a[3]&&0===X._a[4]&&0===X._a[5]&&0===X._a[6]&&(X._nextDay=!0,X._a[3]=0),X._d=(X._useUTC?pa:Ia).apply(null,bt),fr=X._useUTC?X._d.getUTCDay():X._d.getDay(),null!=X._tzm&&X._d.setUTCMinutes(X._d.getUTCMinutes()-X._tzm),X._nextDay&&(X._a[3]=24),X._w&&void 0!==X._w.d&&X._w.d!==fr&&(ee(X).weekdayMismatch=!0)}}function ua(X){if(X._f!==u.ISO_8601)if(X._f!==u.RFC_2822){X._a=[],ee(X).empty=!0;var nt,bt,Qt,fr,vi,ia,_l,ye=""+X._i,ps=ye.length,xa=0;for(_l=(Qt=Yn(X._f,X._locale).match($t)||[]).length,nt=0;nt<_l;nt++)(bt=(ye.match(Gi(fr=Qt[nt],X))||[])[0])&&((vi=ye.substr(0,ye.indexOf(bt))).length>0&&ee(X).unusedInput.push(vi),ye=ye.slice(ye.indexOf(bt)+bt.length),xa+=bt.length),Bt[fr]?(bt?ee(X).empty=!1:ee(X).unusedTokens.push(fr),zo(fr,bt,X)):X._strict&&!bt&&ee(X).unusedTokens.push(fr);ee(X).charsLeftOver=ps-xa,ye.length>0&&ee(X).unusedInput.push(ye),X._a[3]<=12&&!0===ee(X).bigHour&&X._a[3]>0&&(ee(X).bigHour=void 0),ee(X).parsedDateParts=X._a.slice(0),ee(X).meridiem=X._meridiem,X._a[3]=function(X,ye,nt){var bt;return null==nt?ye:null!=X.meridiemHour?X.meridiemHour(ye,nt):(null!=X.isPM&&((bt=X.isPM(nt))&&ye<12&&(ye+=12),!bt&&12===ye&&(ye=0)),ye)}(X._locale,X._a[3],X._meridiem),null!==(ia=ee(X).era)&&(X._a[0]=X._locale.erasConvertYear(ia,X._a[0])),tc(X),dr(X)}else Pc(X);else Pl(X)}function Au(X){var ye=X._i,nt=X._f;return X._locale=X._locale||De(X._l),null===ye||void 0===nt&&""===ye?$({nullInput:!0}):("string"==typeof ye&&(X._i=ye=X._locale.preparse(ye)),me(ye)?new he(dr(ye)):(R(ye)?X._d=ye:f(nt)?function(X){var ye,nt,bt,Qt,fr,vi,ps=!1,xa=X._f.length;if(0===xa)return ee(X).invalidFormat=!0,void(X._d=new Date(NaN));for(Qt=0;Qt<xa;Qt++)fr=0,vi=!1,ye=oe({},X),null!=X._useUTC&&(ye._useUTC=X._useUTC),ye._f=X._f[Qt],ua(ye),ae(ye)&&(vi=!0),fr+=ee(ye).charsLeftOver,fr+=10*ee(ye).unusedTokens.length,ee(ye).score=fr,ps?fr<bt&&(bt=fr,nt=ye):(null==bt||fr<bt||vi)&&(bt=fr,nt=ye,vi&&(ps=!0));Z(X,nt||ye)}(X):nt?ua(X):function(X){var ye=X._i;T(ye)?X._d=new Date(u.now()):R(ye)?X._d=new Date(ye.valueOf()):"string"==typeof ye?function(X){var ye=Ma.exec(X._i);null===ye?(Pl(X),!1===X._isValid&&(delete X._isValid,Pc(X),!1===X._isValid&&(delete X._isValid,X._strict?X._isValid=!1:u.createFromInputFallback(X)))):X._d=new Date(+ye[1])}(X):f(ye)?(X._a=F(ye.slice(0),function(nt){return parseInt(nt,10)}),tc(X)):e(ye)?function(X){if(!X._d){var ye=Br(X._i);X._a=F([ye.year,ye.month,void 0===ye.day?ye.date:ye.day,ye.hour,ye.minute,ye.second,ye.millisecond],function(bt){return bt&&parseInt(bt,10)}),tc(X)}}(X):M(ye)?X._d=new Date(ye):u.createFromInputFallback(X)}(X),ae(X)||(X._d=null),X))}function cu(X,ye,nt,bt,Qt){var fr={};return(!0===ye||!1===ye)&&(bt=ye,ye=void 0),(!0===nt||!1===nt)&&(bt=nt,nt=void 0),(e(X)&&y(X)||f(X)&&0===X.length)&&(X=void 0),fr._isAMomentObject=!0,fr._useUTC=fr._isUTC=Qt,fr._l=nt,fr._i=X,fr._f=ye,fr._strict=bt,function(X){var ye=new he(dr(Au(X)));return ye._nextDay&&(ye.add(1,"d"),ye._nextDay=void 0),ye}(fr)}function Gs(X,ye,nt,bt){return cu(X,ye,nt,bt,!1)}u.createFromInputFallback=ce("value provided is not in a recognized RFC2822 or ISO format. moment construction falls back to js Date(), which is not reliable across all browsers and versions. Non RFC2822/ISO date formats are discouraged. Please refer to http://momentjs.com/guides/#/warnings/js-date/ for more info.",function(X){X._d=new Date(X._i+(X._useUTC?" UTC":""))}),u.ISO_8601=function(){},u.RFC_2822=function(){};var $u=ce("moment().min is deprecated, use moment.max instead. http://momentjs.com/guides/#/warnings/min-max/",function(){var X=Gs.apply(null,arguments);return this.isValid()&&X.isValid()?X<this?this:X:$()}),Hu=ce("moment().max is deprecated, use moment.min instead. http://momentjs.com/guides/#/warnings/min-max/",function(){var X=Gs.apply(null,arguments);return this.isValid()&&X.isValid()?X>this?this:X:$()});function Yo(X,ye){var nt,bt;if(1===ye.length&&f(ye[0])&&(ye=ye[0]),!ye.length)return Gs();for(nt=ye[0],bt=1;bt<ye.length;++bt)(!ye[bt].isValid()||ye[bt][X](nt))&&(nt=ye[bt]);return nt}var _u=["year","quarter","month","week","day","hour","minute","second","millisecond"];function hl(X){var ye=Br(X),nt=ye.year||0,bt=ye.quarter||0,Qt=ye.month||0,fr=ye.week||ye.isoWeek||0,vi=ye.day||0,ps=ye.hour||0,xa=ye.minute||0,ia=ye.second||0,_l=ye.millisecond||0;this._isValid=function(X){var ye,bt,nt=!1,Qt=_u.length;for(ye in X)if(_(X,ye)&&(-1===Bo.call(_u,ye)||null!=X[ye]&&isNaN(X[ye])))return!1;for(bt=0;bt<Qt;++bt)if(X[_u[bt]]){if(nt)return!1;parseFloat(X[_u[bt]])!==Vn(X[_u[bt]])&&(nt=!0)}return!0}(ye),this._milliseconds=+_l+1e3*ia+6e4*xa+1e3*ps*60*60,this._days=+vi+7*fr,this._months=+Qt+3*bt+12*nt,this._data={},this._locale=De(),this._bubble()}function Vl(X){return X instanceof hl}function Hs(X){return X<0?-1*Math.round(-1*X):Math.round(X)}function Ae(X,ye){mt(X,0,0,function(){var nt=this.utcOffset(),bt="+";return nt<0&&(nt=-nt,bt="-"),bt+en(~~(nt/60),2)+ye+en(~~nt%60,2)})}Ae("Z",":"),Ae("ZZ",""),nr("Z",mn),nr("ZZ",mn),Vi(["Z","ZZ"],function(X,ye,nt){nt._useUTC=!0,nt._tzm=_t(mn,X)});var ot=/([\+\-]|\d\d)/gi;function _t(X,ye){var Qt,fr,nt=(ye||"").match(X);return null===nt?null:0===(fr=60*(Qt=((nt[nt.length-1]||[])+"").match(ot)||["-",0,0])[1]+Vn(Qt[2]))?0:"+"===Qt[0]?fr:-fr}function lt(X,ye){var nt,bt;return ye._isUTC?(nt=ye.clone(),bt=(me(X)||R(X)?X.valueOf():Gs(X).valueOf())-nt.valueOf(),nt._d.setTime(nt._d.valueOf()+bt),u.updateOffset(nt,!1),nt):Gs(X).local()}function un(X){return-Math.round(X._d.getTimezoneOffset())}function co(){return!!this.isValid()&&this._isUTC&&0===this._offset}u.updateOffset=function(){};var Ss=/^(-|\+)?(?:(\d*)[. ])?(\d+):(\d+)(?::(\d+)(\.\d*)?)?$/,Na=/^(-|\+)?P(?:([-+]?[0-9,.]*)Y)?(?:([-+]?[0-9,.]*)M)?(?:([-+]?[0-9,.]*)W)?(?:([-+]?[0-9,.]*)D)?(?:T(?:([-+]?[0-9,.]*)H)?(?:([-+]?[0-9,.]*)M)?(?:([-+]?[0-9,.]*)S)?)?$/;function El(X,ye){var Qt,fr,vi,nt=X,bt=null;return Vl(X)?nt={ms:X._milliseconds,d:X._days,M:X._months}:M(X)||!isNaN(+X)?(nt={},ye?nt[ye]=+X:nt.milliseconds=+X):(bt=Ss.exec(X))?(Qt="-"===bt[1]?-1:1,nt={y:0,d:Vn(bt[2])*Qt,h:Vn(bt[3])*Qt,m:Vn(bt[4])*Qt,s:Vn(bt[5])*Qt,ms:Vn(Hs(1e3*bt[6]))*Qt}):(bt=Na.exec(X))?nt={y:Ks(bt[2],Qt="-"===bt[1]?-1:1),M:Ks(bt[3],Qt),w:Ks(bt[4],Qt),d:Ks(bt[5],Qt),h:Ks(bt[6],Qt),m:Ks(bt[7],Qt),s:Ks(bt[8],Qt)}:null==nt?nt={}:"object"==typeof nt&&("from"in nt||"to"in nt)&&(vi=function(X,ye){var nt;return X.isValid()&&ye.isValid()?(ye=lt(ye,X),X.isBefore(ye)?nt=td(X,ye):((nt=td(ye,X)).milliseconds=-nt.milliseconds,nt.months=-nt.months),nt):{milliseconds:0,months:0}}(Gs(nt.from),Gs(nt.to)),(nt={}).ms=vi.milliseconds,nt.M=vi.months),fr=new hl(nt),Vl(X)&&_(X,"_locale")&&(fr._locale=X._locale),Vl(X)&&_(X,"_isValid")&&(fr._isValid=X._isValid),fr}function Ks(X,ye){var nt=X&&parseFloat(X.replace(",","."));return(isNaN(nt)?0:nt)*ye}function td(X,ye){var nt={};return nt.months=ye.month()-X.month()+12*(ye.year()-X.year()),X.clone().add(nt.months,"M").isAfter(ye)&&--nt.months,nt.milliseconds=+ye-+X.clone().add(nt.months,"M"),nt}function zl(X,ye){return function(nt,bt){var fr;return null!==bt&&!isNaN(+bt)&&(ze(ye,"moment()."+ye+"(period, number) is deprecated. Please use moment()."+ye+"(number, period). See http://momentjs.com/guides/#/warnings/add-inverted-param/ for more info."),fr=nt,nt=bt,bt=fr),ki(this,El(nt,bt),X),this}}function ki(X,ye,nt,bt){var Qt=ye._milliseconds,fr=Hs(ye._days),vi=Hs(ye._months);!X.isValid()||(bt=null==bt||bt,vi&&br(X,hi(X,"Month")+vi*nt),fr&&Ai(X,"Date",hi(X,"Date")+fr*nt),Qt&&X._d.setTime(X._d.valueOf()+Qt*nt),bt&&u.updateOffset(X,fr||vi))}El.fn=hl.prototype,El.invalid=function(){return El(NaN)};var No=zl(1,"add"),_a=zl(-1,"subtract");function ll(X){return"string"==typeof X||X instanceof String}function Ul(X){return me(X)||R(X)||ll(X)||M(X)||function(X){var ye=f(X),nt=!1;return ye&&(nt=0===X.filter(function(bt){return!M(bt)&&ll(X)}).length),ye&&nt}(X)||function(X){var Qt,ye=e(X)&&!y(X),nt=!1,bt=["years","year","y","months","month","M","days","day","d","dates","date","D","hours","hour","h","minutes","minute","m","seconds","second","s","milliseconds","millisecond","ms"],vi=bt.length;for(Qt=0;Qt<vi;Qt+=1)nt=nt||_(X,bt[Qt]);return ye&&nt}(X)||null==X}function vn(X){var Qt,ye=e(X)&&!y(X),nt=!1,bt=["sameDay","nextDay","lastDay","nextWeek","lastWeek","sameElse"];for(Qt=0;Qt<bt.length;Qt+=1)nt=nt||_(X,bt[Qt]);return ye&&nt}function Wd(X,ye){if(X.date()<ye.date())return-Wd(ye,X);var nt=12*(ye.year()-X.year())+(ye.month()-X.month()),bt=X.clone().add(nt,"months");return-(nt+(ye-bt<0?(ye-bt)/(bt-X.clone().add(nt-1,"months")):(ye-bt)/(X.clone().add(nt+1,"months")-bt)))||0}function yi(X){var ye;return void 0===X?this._locale._abbr:(null!=(ye=De(X))&&(this._locale=ye),this)}u.defaultFormat="YYYY-MM-DDTHH:mm:ssZ",u.defaultFormatUtc="YYYY-MM-DDTHH:mm:ss[Z]";var Go=ce("moment().lang() is deprecated. Instead, use moment().localeData() to get the language configuration. Use moment().locale() to change languages.",function(X){return void 0===X?this.localeData():this.locale(X)});function ka(){return this._locale}var Oa=6e4,Us=60*Oa,fc=3506328*Us;function va(X,ye){return(X%ye+ye)%ye}function wl(X,ye,nt){return X<100&&X>=0?new Date(X+400,ye,nt)-fc:new Date(X,ye,nt).valueOf()}function tl(X,ye,nt){return X<100&&X>=0?Date.UTC(X+400,ye,nt)-fc:Date.UTC(X,ye,nt)}function Pu(X,ye){return ye.erasAbbrRegex(X)}function yd(){var Qt,fr,X=[],ye=[],nt=[],bt=[],vi=this.eras();for(Qt=0,fr=vi.length;Qt<fr;++Qt)ye.push(yo(vi[Qt].name)),X.push(yo(vi[Qt].abbr)),nt.push(yo(vi[Qt].narrow)),bt.push(yo(vi[Qt].name)),bt.push(yo(vi[Qt].abbr)),bt.push(yo(vi[Qt].narrow));this._erasRegex=new RegExp("^("+bt.join("|")+")","i"),this._erasNameRegex=new RegExp("^("+ye.join("|")+")","i"),this._erasAbbrRegex=new RegExp("^("+X.join("|")+")","i"),this._erasNarrowRegex=new RegExp("^("+nt.join("|")+")","i")}function Ac(X,ye){mt(0,[X,X.length],0,ye)}function bd(X,ye,nt,bt,Qt){var fr;return null==X?yl(this,bt,Qt).year:(ye>(fr=fo(X,bt,Qt))&&(ye=fr),kp.call(this,X,ye,nt,bt,Qt))}function kp(X,ye,nt,bt,Qt){var fr=Yl(X,ye,nt,bt,Qt),vi=pa(fr.year,0,fr.dayOfYear);return this.year(vi.getUTCFullYear()),this.month(vi.getUTCMonth()),this.date(vi.getUTCDate()),this}mt("N",0,0,"eraAbbr"),mt("NN",0,0,"eraAbbr"),mt("NNN",0,0,"eraAbbr"),mt("NNNN",0,0,"eraName"),mt("NNNNN",0,0,"eraNarrow"),mt("y",["y",1],"yo","eraYear"),mt("y",["yy",2],0,"eraYear"),mt("y",["yyy",3],0,"eraYear"),mt("y",["yyyy",4],0,"eraYear"),nr("N",Pu),nr("NN",Pu),nr("NNN",Pu),nr("NNNN",function(X,ye){return ye.erasNameRegex(X)}),nr("NNNNN",function(X,ye){return ye.erasNarrowRegex(X)}),Vi(["N","NN","NNN","NNNN","NNNNN"],function(X,ye,nt,bt){var Qt=nt._locale.erasParse(X,bt,nt._strict);Qt?ee(nt).era=Qt:ee(nt).invalidEra=X}),nr("y",Dr),nr("yy",Dr),nr("yyy",Dr),nr("yyyy",Dr),nr("yo",function(X,ye){return ye._eraYearOrdinalRegex||Dr}),Vi(["y","yy","yyy","yyyy"],0),Vi(["yo"],function(X,ye,nt,bt){var Qt;nt._locale._eraYearOrdinalRegex&&(Qt=X.match(nt._locale._eraYearOrdinalRegex)),ye[0]=nt._locale.eraYearOrdinalParse?nt._locale.eraYearOrdinalParse(X,Qt):parseInt(X,10)}),mt(0,["gg",2],0,function(){return this.weekYear()%100}),mt(0,["GG",2],0,function(){return this.isoWeekYear()%100}),Ac("gggg","weekYear"),Ac("ggggg","weekYear"),Ac("GGGG","isoWeekYear"),Ac("GGGGG","isoWeekYear"),$i("weekYear","gg"),$i("isoWeekYear","GG"),Wt("weekYear",1),Wt("isoWeekYear",1),nr("G",jt),nr("g",jt),nr("GG",vr,En),nr("gg",vr,En),nr("GGGG",so,Xt),nr("gggg",so,Xt),nr("GGGGG",Ze,zn),nr("ggggg",Ze,zn),cs(["gggg","ggggg","GGGG","GGGGG"],function(X,ye,nt,bt){ye[bt.substr(0,2)]=Vn(X)}),cs(["gg","GG"],function(X,ye,nt,bt){ye[bt]=u.parseTwoDigitYear(X)}),mt("Q",0,"Qo","quarter"),$i("quarter","Q"),Wt("quarter",7),nr("Q",gn),Vi("Q",function(X,ye){ye[1]=3*(Vn(X)-1)}),mt("D",["DD",2],"Do","date"),$i("date","D"),Wt("date",9),nr("D",vr),nr("DD",vr,En),nr("Do",function(X,ye){return X?ye._dayOfMonthOrdinalParse||ye._ordinalParse:ye._dayOfMonthOrdinalParseLenient}),Vi(["D","DD"],2),Vi("Do",function(X,ye){ye[2]=Vn(X.match(vr)[0])});var _f=zr("Date",!0);mt("DDD",["DDDD",3],"DDDo","dayOfYear"),$i("dayOfYear","DDD"),Wt("dayOfYear",4),nr("DDD",no),nr("DDDD",mr),Vi(["DDD","DDDD"],function(X,ye,nt){nt._dayOfYear=Vn(X)}),mt("m",["mm",2],0,"minute"),$i("minute","m"),Wt("minute",14),nr("m",vr),nr("mm",vr,En),Vi(["m","mm"],4);var Kl=zr("Minutes",!1);mt("s",["ss",2],0,"second"),$i("second","s"),Wt("second",15),nr("s",vr),nr("ss",vr,En),Vi(["s","ss"],5);var Uu,Xf,kf=zr("Seconds",!1);for(mt("S",0,0,function(){return~~(this.millisecond()/100)}),mt(0,["SS",2],0,function(){return~~(this.millisecond()/10)}),mt(0,["SSS",3],0,"millisecond"),mt(0,["SSSS",4],0,function(){return 10*this.millisecond()}),mt(0,["SSSSS",5],0,function(){return 100*this.millisecond()}),mt(0,["SSSSSS",6],0,function(){return 1e3*this.millisecond()}),mt(0,["SSSSSSS",7],0,function(){return 1e4*this.millisecond()}),mt(0,["SSSSSSSS",8],0,function(){return 1e5*this.millisecond()}),mt(0,["SSSSSSSSS",9],0,function(){return 1e6*this.millisecond()}),$i("millisecond","ms"),Wt("millisecond",16),nr("S",no,gn),nr("SS",no,En),nr("SSS",no,mr),Uu="SSSS";Uu.length<=9;Uu+="S")nr(Uu,Dr);function Rd(X,ye){ye[6]=Vn(1e3*("0."+X))}for(Uu="S";Uu.length<=9;Uu+="S")Vi(Uu,Rd);Xf=zr("Milliseconds",!1),mt("z",0,0,"zoneAbbr"),mt("zz",0,0,"zoneName");var Ji=he.prototype;function Nd(X){return X}Ji.add=No,Ji.calendar=function(X,ye){1===arguments.length&&(arguments[0]?Ul(arguments[0])?(X=arguments[0],ye=void 0):vn(arguments[0])&&(ye=arguments[0],X=void 0):(X=void 0,ye=void 0));var nt=X||Gs(),bt=lt(nt,this).startOf("day"),Qt=u.calendarFormat(this,bt)||"sameElse",fr=ye&&(Ye(ye[Qt])?ye[Qt].call(this,nt):ye[Qt]);return this.format(fr||this.localeData().calendar(Qt,this,Gs(nt)))},Ji.clone=function(){return new he(this)},Ji.diff=function(X,ye,nt){var bt,Qt,fr;if(!this.isValid())return NaN;if(!(bt=lt(X,this)).isValid())return NaN;switch(Qt=6e4*(bt.utcOffset()-this.utcOffset()),ye=Hi(ye)){case"year":fr=Wd(this,bt)/12;break;case"month":fr=Wd(this,bt);break;case"quarter":fr=Wd(this,bt)/3;break;case"second":fr=(this-bt)/1e3;break;case"minute":fr=(this-bt)/6e4;break;case"hour":fr=(this-bt)/36e5;break;case"day":fr=(this-bt-Qt)/864e5;break;case"week":fr=(this-bt-Qt)/6048e5;break;default:fr=this-bt}return nt?fr:Lr(fr)},Ji.endOf=function(X){var ye,nt;if(void 0===(X=Hi(X))||"millisecond"===X||!this.isValid())return this;switch(nt=this._isUTC?tl:wl,X){case"year":ye=nt(this.year()+1,0,1)-1;break;case"quarter":ye=nt(this.year(),this.month()-this.month()%3+3,1)-1;break;case"month":ye=nt(this.year(),this.month()+1,1)-1;break;case"week":ye=nt(this.year(),this.month(),this.date()-this.weekday()+7)-1;break;case"isoWeek":ye=nt(this.year(),this.month(),this.date()-(this.isoWeekday()-1)+7)-1;break;case"day":case"date":ye=nt(this.year(),this.month(),this.date()+1)-1;break;case"hour":ye=this._d.valueOf(),ye+=Us-va(ye+(this._isUTC?0:this.utcOffset()*Oa),Us)-1;break;case"minute":ye=this._d.valueOf(),ye+=Oa-va(ye,Oa)-1;break;case"second":ye=this._d.valueOf(),ye+=1e3-va(ye,1e3)-1}return this._d.setTime(ye),u.updateOffset(this,!0),this},Ji.format=function(X){X||(X=this.isUtc()?u.defaultFormatUtc:u.defaultFormat);var ye=zt(this,X);return this.localeData().postformat(ye)},Ji.from=function(X,ye){return this.isValid()&&(me(X)&&X.isValid()||Gs(X).isValid())?El({to:this,from:X}).locale(this.locale()).humanize(!ye):this.localeData().invalidDate()},Ji.fromNow=function(X){return this.from(Gs(),X)},Ji.to=function(X,ye){return this.isValid()&&(me(X)&&X.isValid()||Gs(X).isValid())?El({from:this,to:X}).locale(this.locale()).humanize(!ye):this.localeData().invalidDate()},Ji.toNow=function(X){return this.to(Gs(),X)},Ji.get=function(X){return Ye(this[X=Hi(X)])?this[X]():this},Ji.invalidAt=function(){return ee(this).overflow},Ji.isAfter=function(X,ye){var nt=me(X)?X:Gs(X);return!(!this.isValid()||!nt.isValid())&&("millisecond"===(ye=Hi(ye)||"millisecond")?this.valueOf()>nt.valueOf():nt.valueOf()<this.clone().startOf(ye).valueOf())},Ji.isBefore=function(X,ye){var nt=me(X)?X:Gs(X);return!(!this.isValid()||!nt.isValid())&&("millisecond"===(ye=Hi(ye)||"millisecond")?this.valueOf()<nt.valueOf():this.clone().endOf(ye).valueOf()<nt.valueOf())},Ji.isBetween=function(X,ye,nt,bt){var Qt=me(X)?X:Gs(X),fr=me(ye)?ye:Gs(ye);return!!(this.isValid()&&Qt.isValid()&&fr.isValid())&&("("===(bt=bt||"()")[0]?this.isAfter(Qt,nt):!this.isBefore(Qt,nt))&&(")"===bt[1]?this.isBefore(fr,nt):!this.isAfter(fr,nt))},Ji.isSame=function(X,ye){var bt,nt=me(X)?X:Gs(X);return!(!this.isValid()||!nt.isValid())&&("millisecond"===(ye=Hi(ye)||"millisecond")?this.valueOf()===nt.valueOf():(bt=nt.valueOf(),this.clone().startOf(ye).valueOf()<=bt&&bt<=this.clone().endOf(ye).valueOf()))},Ji.isSameOrAfter=function(X,ye){return this.isSame(X,ye)||this.isAfter(X,ye)},Ji.isSameOrBefore=function(X,ye){return this.isSame(X,ye)||this.isBefore(X,ye)},Ji.isValid=function(){return ae(this)},Ji.lang=Go,Ji.locale=yi,Ji.localeData=ka,Ji.max=Hu,Ji.min=$u,Ji.parsingFlags=function(){return Z({},ee(this))},Ji.set=function(X,ye){if("object"==typeof X){var bt,nt=function(X){var nt,ye=[];for(nt in X)_(X,nt)&&ye.push({unit:nt,priority:On[nt]});return ye.sort(function(bt,Qt){return bt.priority-Qt.priority}),ye}(X=Br(X)),Qt=nt.length;for(bt=0;bt<Qt;bt++)this[nt[bt].unit](X[nt[bt].unit])}else if(Ye(this[X=Hi(X)]))return this[X](ye);return this},Ji.startOf=function(X){var ye,nt;if(void 0===(X=Hi(X))||"millisecond"===X||!this.isValid())return this;switch(nt=this._isUTC?tl:wl,X){case"year":ye=nt(this.year(),0,1);break;case"quarter":ye=nt(this.year(),this.month()-this.month()%3,1);break;case"month":ye=nt(this.year(),this.month(),1);break;case"week":ye=nt(this.year(),this.month(),this.date()-this.weekday());break;case"isoWeek":ye=nt(this.year(),this.month(),this.date()-(this.isoWeekday()-1));break;case"day":case"date":ye=nt(this.year(),this.month(),this.date());break;case"hour":ye=this._d.valueOf(),ye-=va(ye+(this._isUTC?0:this.utcOffset()*Oa),Us);break;case"minute":ye=this._d.valueOf(),ye-=va(ye,Oa);break;case"second":ye=this._d.valueOf(),ye-=va(ye,1e3)}return this._d.setTime(ye),u.updateOffset(this,!0),this},Ji.subtract=_a,Ji.toArray=function(){var X=this;return[X.year(),X.month(),X.date(),X.hour(),X.minute(),X.second(),X.millisecond()]},Ji.toObject=function(){var X=this;return{years:X.year(),months:X.month(),date:X.date(),hours:X.hours(),minutes:X.minutes(),seconds:X.seconds(),milliseconds:X.milliseconds()}},Ji.toDate=function(){return new Date(this.valueOf())},Ji.toISOString=function(X){if(!this.isValid())return null;var ye=!0!==X,nt=ye?this.clone().utc():this;return nt.year()<0||nt.year()>9999?zt(nt,ye?"YYYYYY-MM-DD[T]HH:mm:ss.SSS[Z]":"YYYYYY-MM-DD[T]HH:mm:ss.SSSZ"):Ye(Date.prototype.toISOString)?ye?this.toDate().toISOString():new Date(this.valueOf()+60*this.utcOffset()*1e3).toISOString().replace("Z",zt(nt,"Z")):zt(nt,ye?"YYYY-MM-DD[T]HH:mm:ss.SSS[Z]":"YYYY-MM-DD[T]HH:mm:ss.SSSZ")},Ji.inspect=function(){if(!this.isValid())return"moment.invalid(/* "+this._i+" */)";var nt,bt,X="moment",ye="";return this.isLocal()||(X=0===this.utcOffset()?"moment.utc":"moment.parseZone",ye="Z"),nt="["+X+'("]',bt=0<=this.year()&&this.year()<=9999?"YYYY":"YYYYYY",this.format(nt+bt+"-MM-DD[T]HH:mm:ss.SSS"+ye+'[")]')},"undefined"!=typeof Symbol&&null!=Symbol.for&&(Ji[Symbol.for("nodejs.util.inspect.custom")]=function(){return"Moment<"+this.format()+">"}),Ji.toJSON=function(){return this.isValid()?this.toISOString():null},Ji.toString=function(){return this.clone().locale("en").format("ddd MMM DD YYYY HH:mm:ss [GMT]ZZ")},Ji.unix=function(){return Math.floor(this.valueOf()/1e3)},Ji.valueOf=function(){return this._d.valueOf()-6e4*(this._offset||0)},Ji.creationData=function(){return{input:this._i,format:this._f,locale:this._locale,isUTC:this._isUTC,strict:this._strict}},Ji.eraName=function(){var X,ye,nt,bt=this.localeData().eras();for(X=0,ye=bt.length;X<ye;++X)if(nt=this.clone().startOf("day").valueOf(),bt[X].since<=nt&&nt<=bt[X].until||bt[X].until<=nt&&nt<=bt[X].since)return bt[X].name;return""},Ji.eraNarrow=function(){var X,ye,nt,bt=this.localeData().eras();for(X=0,ye=bt.length;X<ye;++X)if(nt=this.clone().startOf("day").valueOf(),bt[X].since<=nt&&nt<=bt[X].until||bt[X].until<=nt&&nt<=bt[X].since)return bt[X].narrow;return""},Ji.eraAbbr=function(){var X,ye,nt,bt=this.localeData().eras();for(X=0,ye=bt.length;X<ye;++X)if(nt=this.clone().startOf("day").valueOf(),bt[X].since<=nt&&nt<=bt[X].until||bt[X].until<=nt&&nt<=bt[X].since)return bt[X].abbr;return""},Ji.eraYear=function(){var X,ye,nt,bt,Qt=this.localeData().eras();for(X=0,ye=Qt.length;X<ye;++X)if(nt=Qt[X].since<=Qt[X].until?1:-1,bt=this.clone().startOf("day").valueOf(),Qt[X].since<=bt&&bt<=Qt[X].until||Qt[X].until<=bt&&bt<=Qt[X].since)return(this.year()-u(Qt[X].since).year())*nt+Qt[X].offset;return this.year()},Ji.year=qo,Ji.isLeapYear=function(){return ir(this.year())},Ji.weekYear=function(X){return bd.call(this,X,this.week(),this.weekday(),this.localeData()._week.dow,this.localeData()._week.doy)},Ji.isoWeekYear=function(X){return bd.call(this,X,this.isoWeek(),this.isoWeekday(),1,4)},Ji.quarter=Ji.quarters=function(X){return null==X?Math.ceil((this.month()+1)/3):this.month(3*(X-1)+this.month()%3)},Ji.month=zi,Ji.daysInMonth=function(){return xo(this.year(),this.month())},Ji.week=Ji.weeks=function(X){var ye=this.localeData().week(this);return null==X?ye:this.add(7*(X-ye),"d")},Ji.isoWeek=Ji.isoWeeks=function(X){var ye=yl(this,1,4).week;return null==X?ye:this.add(7*(X-ye),"d")},Ji.weeksInYear=function(){var X=this.localeData()._week;return fo(this.year(),X.dow,X.doy)},Ji.weeksInWeekYear=function(){var X=this.localeData()._week;return fo(this.weekYear(),X.dow,X.doy)},Ji.isoWeeksInYear=function(){return fo(this.year(),1,4)},Ji.isoWeeksInISOWeekYear=function(){return fo(this.isoWeekYear(),1,4)},Ji.date=_f,Ji.day=Ji.days=function(X){if(!this.isValid())return null!=X?this:NaN;var ye=this._isUTC?this._d.getUTCDay():this._d.getDay();return null!=X?(X=function(X,ye){return"string"!=typeof X?X:isNaN(X)?"number"==typeof(X=ye.weekdaysParse(X))?X:null:parseInt(X,10)}(X,this.localeData()),this.add(X-ye,"d")):ye},Ji.weekday=function(X){if(!this.isValid())return null!=X?this:NaN;var ye=(this.day()+7-this.localeData()._week.dow)%7;return null==X?ye:this.add(X-ye,"d")},Ji.isoWeekday=function(X){if(!this.isValid())return null!=X?this:NaN;if(null!=X){var ye=function(X,ye){return"string"==typeof X?ye.weekdaysParse(X)%7||7:isNaN(X)?null:X}(X,this.localeData());return this.day(this.day()%7?ye:ye-7)}return this.day()||7},Ji.dayOfYear=function(X){var ye=Math.round((this.clone().startOf("day")-this.clone().startOf("year"))/864e5)+1;return null==X?ye:this.add(X-ye,"d")},Ji.hour=Ji.hours=ed,Ji.minute=Ji.minutes=Kl,Ji.second=Ji.seconds=kf,Ji.millisecond=Ji.milliseconds=Xf,Ji.utcOffset=function(X,ye,nt){var Qt,bt=this._offset||0;if(!this.isValid())return null!=X?this:NaN;if(null!=X){if("string"==typeof X){if(null===(X=_t(mn,X)))return this}else Math.abs(X)<16&&!nt&&(X*=60);return!this._isUTC&&ye&&(Qt=un(this)),this._offset=X,this._isUTC=!0,null!=Qt&&this.add(Qt,"m"),bt!==X&&(!ye||this._changeInProgress?ki(this,El(X-bt,"m"),1,!1):this._changeInProgress||(this._changeInProgress=!0,u.updateOffset(this,!0),this._changeInProgress=null)),this}return this._isUTC?bt:un(this)},Ji.utc=function(X){return this.utcOffset(0,X)},Ji.local=function(X){return this._isUTC&&(this.utcOffset(0,X),this._isUTC=!1,X&&this.subtract(un(this),"m")),this},Ji.parseZone=function(){if(null!=this._tzm)this.utcOffset(this._tzm,!1,!0);else if("string"==typeof this._i){var X=_t(xt,this._i);null!=X?this.utcOffset(X):this.utcOffset(0,!0)}return this},Ji.hasAlignedHourOffset=function(X){return!!this.isValid()&&(X=X?Gs(X).utcOffset():0,(this.utcOffset()-X)%60==0)},Ji.isDST=function(){return this.utcOffset()>this.clone().month(0).utcOffset()||this.utcOffset()>this.clone().month(5).utcOffset()},Ji.isLocal=function(){return!!this.isValid()&&!this._isUTC},Ji.isUtcOffset=function(){return!!this.isValid()&&this._isUTC},Ji.isUtc=co,Ji.isUTC=co,Ji.zoneAbbr=function(){return this._isUTC?"UTC":""},Ji.zoneName=function(){return this._isUTC?"Coordinated Universal Time":""},Ji.dates=ce("dates accessor is deprecated. Use date instead.",_f),Ji.months=ce("months accessor is deprecated. Use month instead",zi),Ji.years=ce("years accessor is deprecated. Use year instead",qo),Ji.zone=ce("moment().zone is deprecated, use moment().utcOffset instead. http://momentjs.com/guides/#/warnings/zone/",function(X,ye){return null!=X?("string"!=typeof X&&(X=-X),this.utcOffset(X,ye),this):-this.utcOffset()}),Ji.isDSTShifted=ce("isDSTShifted is deprecated. See http://momentjs.com/guides/#/warnings/dst-shifted/ for more information",function(){if(!T(this._isDSTShifted))return this._isDSTShifted;var ye,X={};return oe(X,this),(X=Au(X))._a?(ye=X._isUTC?J(X._a):Gs(X._a),this._isDSTShifted=this.isValid()&&function(X,ye,nt){var vi,bt=Math.min(X.length,ye.length),Qt=Math.abs(X.length-ye.length),fr=0;for(vi=0;vi<bt;vi++)(nt&&X[vi]!==ye[vi]||!nt&&Vn(X[vi])!==Vn(ye[vi]))&&fr++;return fr+Qt}(X._a,ye.toArray())>0):this._isDSTShifted=!1,this._isDSTShifted});var il=Ve.prototype;function Bu(X,ye,nt,bt){var Qt=De(),fr=J().set(bt,ye);return Qt[nt](fr,X)}function pc(X,ye,nt){if(M(X)&&(ye=X,X=void 0),X=X||"",null!=ye)return Bu(X,ye,nt,"month");var bt,Qt=[];for(bt=0;bt<12;bt++)Qt[bt]=Bu(X,bt,nt,"month");return Qt}function Xd(X,ye,nt,bt){"boolean"==typeof X?(M(ye)&&(nt=ye,ye=void 0),ye=ye||""):(nt=ye=X,X=!1,M(ye)&&(nt=ye,ye=void 0),ye=ye||"");var vi,Qt=De(),fr=X?Qt._week.dow:0,ps=[];if(null!=nt)return Bu(ye,(nt+fr)%7,bt,"day");for(vi=0;vi<7;vi++)ps[vi]=Bu(ye,(vi+fr)%7,bt,"day");return ps}il.calendar=function(X,ye,nt){var bt=this._calendar[X]||this._calendar.sameElse;return Ye(bt)?bt.call(ye,nt):bt},il.longDateFormat=function(X){var ye=this._longDateFormat[X],nt=this._longDateFormat[X.toUpperCase()];return ye||!nt?ye:(this._longDateFormat[X]=nt.match($t).map(function(bt){return"MMMM"===bt||"MM"===bt||"DD"===bt||"dddd"===bt?bt.slice(1):bt}).join(""),this._longDateFormat[X])},il.invalidDate=function(){return this._invalidDate},il.ordinal=function(X){return this._ordinal.replace("%d",X)},il.preparse=Nd,il.postformat=Nd,il.relativeTime=function(X,ye,nt,bt){var Qt=this._relativeTime[nt];return Ye(Qt)?Qt(X,ye,nt,bt):Qt.replace(/%d/i,X)},il.pastFuture=function(X,ye){var nt=this._relativeTime[X>0?"future":"past"];return Ye(nt)?nt(ye):nt.replace(/%s/i,ye)},il.set=function(X){var ye,nt;for(nt in X)_(X,nt)&&(Ye(ye=X[nt])?this[nt]=ye:this["_"+nt]=ye);this._config=X,this._dayOfMonthOrdinalParseLenient=new RegExp((this._dayOfMonthOrdinalParse.source||this._ordinalParse.source)+"|"+/\d{1,2}/.source)},il.eras=function(X,ye){var nt,bt,Qt,fr=this._eras||De("en")._eras;for(nt=0,bt=fr.length;nt<bt;++nt){switch(typeof fr[nt].since){case"string":Qt=u(fr[nt].since).startOf("day"),fr[nt].since=Qt.valueOf()}switch(typeof fr[nt].until){case"undefined":fr[nt].until=1/0;break;case"string":Qt=u(fr[nt].until).startOf("day").valueOf(),fr[nt].until=Qt.valueOf()}}return fr},il.erasParse=function(X,ye,nt){var bt,Qt,vi,ps,xa,fr=this.eras();for(X=X.toUpperCase(),bt=0,Qt=fr.length;bt<Qt;++bt)if(vi=fr[bt].name.toUpperCase(),ps=fr[bt].abbr.toUpperCase(),xa=fr[bt].narrow.toUpperCase(),nt)switch(ye){case"N":case"NN":case"NNN":if(ps===X)return fr[bt];break;case"NNNN":if(vi===X)return fr[bt];break;case"NNNNN":if(xa===X)return fr[bt]}else if([vi,ps,xa].indexOf(X)>=0)return fr[bt]},il.erasConvertYear=function(X,ye){var nt=X.since<=X.until?1:-1;return void 0===ye?u(X.since).year():u(X.since).year()+(ye-X.offset)*nt},il.erasAbbrRegex=function(X){return _(this,"_erasAbbrRegex")||yd.call(this),X?this._erasAbbrRegex:this._erasRegex},il.erasNameRegex=function(X){return _(this,"_erasNameRegex")||yd.call(this),X?this._erasNameRegex:this._erasRegex},il.erasNarrowRegex=function(X){return _(this,"_erasNarrowRegex")||yd.call(this),X?this._erasNarrowRegex:this._erasRegex},il.months=function(X,ye){return X?f(this._months)?this._months[X.month()]:this._months[(this._months.isFormat||ln).test(ye)?"format":"standalone"][X.month()]:f(this._months)?this._months:this._months.standalone},il.monthsShort=function(X,ye){return X?f(this._monthsShort)?this._monthsShort[X.month()]:this._monthsShort[ln.test(ye)?"format":"standalone"][X.month()]:f(this._monthsShort)?this._monthsShort:this._monthsShort.standalone},il.monthsParse=function(X,ye,nt){var bt,Qt,fr;if(this._monthsParseExact)return nn.call(this,X,ye,nt);for(this._monthsParse||(this._monthsParse=[],this._longMonthsParse=[],this._shortMonthsParse=[]),bt=0;bt<12;bt++){if(Qt=J([2e3,bt]),nt&&!this._longMonthsParse[bt]&&(this._longMonthsParse[bt]=new RegExp("^"+this.months(Qt,"").replace(".","")+"$","i"),this._shortMonthsParse[bt]=new RegExp("^"+this.monthsShort(Qt,"").replace(".","")+"$","i")),!nt&&!this._monthsParse[bt]&&(fr="^"+this.months(Qt,"")+"|^"+this.monthsShort(Qt,""),this._monthsParse[bt]=new RegExp(fr.replace(".",""),"i")),nt&&"MMMM"===ye&&this._longMonthsParse[bt].test(X))return bt;if(nt&&"MMM"===ye&&this._shortMonthsParse[bt].test(X))return bt;if(!nt&&this._monthsParse[bt].test(X))return bt}},il.monthsRegex=function(X){return this._monthsParseExact?(_(this,"_monthsRegex")||_s.call(this),X?this._monthsStrictRegex:this._monthsRegex):(_(this,"_monthsRegex")||(this._monthsRegex=cn),this._monthsStrictRegex&&X?this._monthsStrictRegex:this._monthsRegex)},il.monthsShortRegex=function(X){return this._monthsParseExact?(_(this,"_monthsRegex")||_s.call(this),X?this._monthsShortStrictRegex:this._monthsShortRegex):(_(this,"_monthsShortRegex")||(this._monthsShortRegex=Ht),this._monthsShortStrictRegex&&X?this._monthsShortStrictRegex:this._monthsShortRegex)},il.week=function(X){return yl(X,this._week.dow,this._week.doy).week},il.firstDayOfYear=function(){return this._week.doy},il.firstDayOfWeek=function(){return this._week.dow},il.weekdays=function(X,ye){var nt=f(this._weekdays)?this._weekdays:this._weekdays[X&&!0!==X&&this._weekdays.isFormat.test(ye)?"format":"standalone"];return!0===X?Eo(nt,this._week.dow):X?nt[X.day()]:nt},il.weekdaysMin=function(X){return!0===X?Eo(this._weekdaysMin,this._week.dow):X?this._weekdaysMin[X.day()]:this._weekdaysMin},il.weekdaysShort=function(X){return!0===X?Eo(this._weekdaysShort,this._week.dow):X?this._weekdaysShort[X.day()]:this._weekdaysShort},il.weekdaysParse=function(X,ye,nt){var bt,Qt,fr;if(this._weekdaysParseExact)return Pt.call(this,X,ye,nt);for(this._weekdaysParse||(this._weekdaysParse=[],this._minWeekdaysParse=[],this._shortWeekdaysParse=[],this._fullWeekdaysParse=[]),bt=0;bt<7;bt++){if(Qt=J([2e3,1]).day(bt),nt&&!this._fullWeekdaysParse[bt]&&(this._fullWeekdaysParse[bt]=new RegExp("^"+this.weekdays(Qt,"").replace(".","\\.?")+"$","i"),this._shortWeekdaysParse[bt]=new RegExp("^"+this.weekdaysShort(Qt,"").replace(".","\\.?")+"$","i"),this._minWeekdaysParse[bt]=new RegExp("^"+this.weekdaysMin(Qt,"").replace(".","\\.?")+"$","i")),this._weekdaysParse[bt]||(fr="^"+this.weekdays(Qt,"")+"|^"+this.weekdaysShort(Qt,"")+"|^"+this.weekdaysMin(Qt,""),this._weekdaysParse[bt]=new RegExp(fr.replace(".",""),"i")),nt&&"dddd"===ye&&this._fullWeekdaysParse[bt].test(X))return bt;if(nt&&"ddd"===ye&&this._shortWeekdaysParse[bt].test(X))return bt;if(nt&&"dd"===ye&&this._minWeekdaysParse[bt].test(X))return bt;if(!nt&&this._weekdaysParse[bt].test(X))return bt}},il.weekdaysRegex=function(X){return this._weekdaysParseExact?(_(this,"_weekdaysRegex")||To.call(this),X?this._weekdaysStrictRegex:this._weekdaysRegex):(_(this,"_weekdaysRegex")||(this._weekdaysRegex=kr),this._weekdaysStrictRegex&&X?this._weekdaysStrictRegex:this._weekdaysRegex)},il.weekdaysShortRegex=function(X){return this._weekdaysParseExact?(_(this,"_weekdaysRegex")||To.call(this),X?this._weekdaysShortStrictRegex:this._weekdaysShortRegex):(_(this,"_weekdaysShortRegex")||(this._weekdaysShortRegex=ro),this._weekdaysShortStrictRegex&&X?this._weekdaysShortStrictRegex:this._weekdaysShortRegex)},il.weekdaysMinRegex=function(X){return this._weekdaysParseExact?(_(this,"_weekdaysRegex")||To.call(this),X?this._weekdaysMinStrictRegex:this._weekdaysMinRegex):(_(this,"_weekdaysMinRegex")||(this._weekdaysMinRegex=tt),this._weekdaysMinStrictRegex&&X?this._weekdaysMinStrictRegex:this._weekdaysMinRegex)},il.isPM=function(X){return"p"===(X+"").toLowerCase().charAt(0)},il.meridiem=function(X,ye,nt){return X>11?nt?"pm":"PM":nt?"am":"AM"},ct("en",{eras:[{since:"0001-01-01",until:1/0,offset:1,name:"Anno Domini",narrow:"AD",abbr:"AD"},{since:"0000-12-31",until:-1/0,offset:1,name:"Before Christ",narrow:"BC",abbr:"BC"}],dayOfMonthOrdinalParse:/\d{1,2}(th|st|nd|rd)/,ordinal:function(X){var ye=X%10;return X+(1===Vn(X%100/10)?"th":1===ye?"st":2===ye?"nd":3===ye?"rd":"th")}}),u.lang=ce("moment.lang is deprecated. Use moment.locale instead.",ct),u.langData=ce("moment.langData is deprecated. Use moment.localeData instead.",De);var gu=Math.abs;function Fc(X,ye,nt,bt){var Qt=El(ye,nt);return X._milliseconds+=bt*Qt._milliseconds,X._days+=bt*Qt._days,X._months+=bt*Qt._months,X._bubble()}function Sl(X){return X<0?Math.floor(X):Math.ceil(X)}function $c(X){return 4800*X/146097}function h(X){return 146097*X/4800}function k(X){return function(){return this.as(X)}}var K=k("ms"),de=k("s"),be=k("m"),Ue=k("h"),we=k("d"),Xe=k("w"),gt=k("M"),vt=k("Q"),Jt=k("y");function sr(X){return function(){return this.isValid()?this._data[X]:NaN}}var jr=sr("milliseconds"),Ni=sr("seconds"),Vo=sr("minutes"),$o=sr("hours"),Vs=sr("days"),qs=sr("months"),dl=sr("years");var sa=Math.round,Pa={ss:44,s:45,m:45,h:22,d:26,w:null,M:11};function ol(X,ye,nt,bt,Qt){return Qt.relativeTime(ye||1,!!nt,X,bt)}var xc=Math.abs;function ic(X){return(X>0)-(X<0)||+X}function gf(){if(!this.isValid())return this.localeData().invalidDate();var bt,Qt,fr,vi,xa,ia,_l,Jl,X=xc(this._milliseconds)/1e3,ye=xc(this._days),nt=xc(this._months),ps=this.asSeconds();return ps?(bt=Lr(X/60),Qt=Lr(bt/60),X%=60,bt%=60,fr=Lr(nt/12),nt%=12,vi=X?X.toFixed(3).replace(/\.?0+$/,""):"",xa=ps<0?"-":"",ia=ic(this._months)!==ic(ps)?"-":"",_l=ic(this._days)!==ic(ps)?"-":"",Jl=ic(this._milliseconds)!==ic(ps)?"-":"",xa+"P"+(fr?ia+fr+"Y":"")+(nt?ia+nt+"M":"")+(ye?_l+ye+"D":"")+(Qt||bt||X?"T":"")+(Qt?Jl+Qt+"H":"")+(bt?Jl+bt+"M":"")+(X?Jl+vi+"S":"")):"P0D"}var Ga=hl.prototype;return Ga.isValid=function(){return this._isValid},Ga.abs=function(){var X=this._data;return this._milliseconds=gu(this._milliseconds),this._days=gu(this._days),this._months=gu(this._months),X.milliseconds=gu(X.milliseconds),X.seconds=gu(X.seconds),X.minutes=gu(X.minutes),X.hours=gu(X.hours),X.months=gu(X.months),X.years=gu(X.years),this},Ga.add=function(X,ye){return Fc(this,X,ye,1)},Ga.subtract=function(X,ye){return Fc(this,X,ye,-1)},Ga.as=function(X){if(!this.isValid())return NaN;var ye,nt,bt=this._milliseconds;if("month"===(X=Hi(X))||"quarter"===X||"year"===X)switch(ye=this._days+bt/864e5,nt=this._months+$c(ye),X){case"month":return nt;case"quarter":return nt/3;case"year":return nt/12}else switch(ye=this._days+Math.round(h(this._months)),X){case"week":return ye/7+bt/6048e5;case"day":return ye+bt/864e5;case"hour":return 24*ye+bt/36e5;case"minute":return 1440*ye+bt/6e4;case"second":return 86400*ye+bt/1e3;case"millisecond":return Math.floor(864e5*ye)+bt;default:throw new Error("Unknown unit "+X)}},Ga.asMilliseconds=K,Ga.asSeconds=de,Ga.asMinutes=be,Ga.asHours=Ue,Ga.asDays=we,Ga.asWeeks=Xe,Ga.asMonths=gt,Ga.asQuarters=vt,Ga.asYears=Jt,Ga.valueOf=function(){return this.isValid()?this._milliseconds+864e5*this._days+this._months%12*2592e6+31536e6*Vn(this._months/12):NaN},Ga._bubble=function(){var Qt,fr,vi,ps,xa,X=this._milliseconds,ye=this._days,nt=this._months,bt=this._data;return X>=0&&ye>=0&&nt>=0||X<=0&&ye<=0&&nt<=0||(X+=864e5*Sl(h(nt)+ye),ye=0,nt=0),bt.milliseconds=X%1e3,Qt=Lr(X/1e3),bt.seconds=Qt%60,fr=Lr(Qt/60),bt.minutes=fr%60,vi=Lr(fr/60),bt.hours=vi%24,ye+=Lr(vi/24),nt+=xa=Lr($c(ye)),ye-=Sl(h(xa)),ps=Lr(nt/12),nt%=12,bt.days=ye,bt.months=nt,bt.years=ps,this},Ga.clone=function(){return El(this)},Ga.get=function(X){return X=Hi(X),this.isValid()?this[X+"s"]():NaN},Ga.milliseconds=jr,Ga.seconds=Ni,Ga.minutes=Vo,Ga.hours=$o,Ga.days=Vs,Ga.weeks=function(){return Lr(this.days()/7)},Ga.months=qs,Ga.years=dl,Ga.humanize=function(X,ye){if(!this.isValid())return this.localeData().invalidDate();var Qt,fr,nt=!1,bt=Pa;return"object"==typeof X&&(ye=X,X=!1),"boolean"==typeof X&&(nt=X),"object"==typeof ye&&(bt=Object.assign({},Pa,ye),null!=ye.s&&null==ye.ss&&(bt.ss=ye.s-1)),fr=function(X,ye,nt,bt){var Qt=El(X).abs(),fr=sa(Qt.as("s")),vi=sa(Qt.as("m")),ps=sa(Qt.as("h")),xa=sa(Qt.as("d")),ia=sa(Qt.as("M")),_l=sa(Qt.as("w")),Jl=sa(Qt.as("y")),Wc=fr<=nt.ss&&["s",fr]||fr<nt.s&&["ss",fr]||vi<=1&&["m"]||vi<nt.m&&["mm",vi]||ps<=1&&["h"]||ps<nt.h&&["hh",ps]||xa<=1&&["d"]||xa<nt.d&&["dd",xa];return null!=nt.w&&(Wc=Wc||_l<=1&&["w"]||_l<nt.w&&["ww",_l]),(Wc=Wc||ia<=1&&["M"]||ia<nt.M&&["MM",ia]||Jl<=1&&["y"]||["yy",Jl])[2]=ye,Wc[3]=+X>0,Wc[4]=bt,ol.apply(null,Wc)}(this,!nt,bt,Qt=this.localeData()),nt&&(fr=Qt.pastFuture(+this,fr)),Qt.postformat(fr)},Ga.toISOString=gf,Ga.toString=gf,Ga.toJSON=gf,Ga.locale=yi,Ga.localeData=ka,Ga.toIsoString=ce("toIsoString() is deprecated. Please use toISOString() instead (notice the capitals)",gf),Ga.lang=Go,mt("X",0,0,"unix"),mt("x",0,0,"valueOf"),nr("x",jt),nr("X",/[+-]?\d+(\.\d{1,3})?/),Vi("X",function(X,ye,nt){nt._d=new Date(1e3*parseFloat(X))}),Vi("x",function(X,ye,nt){nt._d=new Date(Vn(X))}),u.version="2.29.3",r=Gs,u.fn=Ji,u.min=function(){return Yo("isBefore",[].slice.call(arguments,0))},u.max=function(){return Yo("isAfter",[].slice.call(arguments,0))},u.now=function(){return Date.now?Date.now():+new Date},u.utc=J,u.unix=function(X){return Gs(1e3*X)},u.months=function(X,ye){return pc(X,ye,"months")},u.isDate=R,u.locale=ct,u.invalid=$,u.duration=El,u.isMoment=me,u.weekdays=function(X,ye,nt){return Xd(X,ye,nt,"weekdays")},u.parseZone=function(){return Gs.apply(null,arguments).parseZone()},u.localeData=De,u.isDuration=Vl,u.monthsShort=function(X,ye){return pc(X,ye,"monthsShort")},u.weekdaysMin=function(X,ye,nt){return Xd(X,ye,nt,"weekdaysMin")},u.defineLocale=Te,u.updateLocale=function(X,ye){if(null!=ye){var nt,bt,Qt=Zl;null!=$s[X]&&null!=$s[X].parentLocale?$s[X].set(Ie($s[X]._config,ye)):(null!=(bt=Nt(X))&&(Qt=bt._config),ye=Ie(Qt,ye),null==bt&&(ye.abbr=X),(nt=new Ve(ye)).parentLocale=$s[X],$s[X]=nt),ct(X)}else null!=$s[X]&&(null!=$s[X].parentLocale?($s[X]=$s[X].parentLocale,X===ct()&&ct(X)):null!=$s[X]&&delete $s[X]);return $s[X]},u.locales=function(){return He($s)},u.weekdaysShort=function(X,ye,nt){return Xd(X,ye,nt,"weekdaysShort")},u.normalizeUnits=Hi,u.relativeTimeRounding=function(X){return void 0===X?sa:"function"==typeof X&&(sa=X,!0)},u.relativeTimeThreshold=function(X,ye){return void 0!==Pa[X]&&(void 0===ye?Pa[X]:(Pa[X]=ye,"s"===X&&(Pa.ss=ye-1),!0))},u.calendarFormat=function(X,ye){var nt=X.diff(ye,"days",!0);return nt<-6?"sameElse":nt<-1?"lastWeek":nt<0?"lastDay":nt<1?"sameDay":nt<2?"nextDay":nt<7?"nextWeek":"sameElse"},u.prototype=Ji,u.HTML5_FMT={DATETIME_LOCAL:"YYYY-MM-DDTHH:mm",DATETIME_LOCAL_SECONDS:"YYYY-MM-DDTHH:mm:ss",DATETIME_LOCAL_MS:"YYYY-MM-DDTHH:mm:ss.SSS",DATE:"YYYY-MM-DD",TIME:"HH:mm",TIME_SECONDS:"HH:mm:ss",TIME_MS:"HH:mm:ss.SSS",WEEK:"GGGG-[W]WW",MONTH:"YYYY-MM"},u}()},11971:(v,S,i)=>{"use strict";i.d(S,{_:()=>_,w:()=>T});var r=i(74788),u=i(12057),p=function(M,R,F,Z){var ee,J=arguments.length,Q=J<3?R:null===Z?Z=Object.getOwnPropertyDescriptor(R,F):Z;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)Q=Reflect.decorate(M,R,F,Z);else for(var ue=M.length-1;ue>=0;ue--)(ee=M[ue])&&(Q=(J<3?ee(Q):J>3?ee(R,F,Q):ee(R,F))||Q);return J>3&&Q&&Object.defineProperty(R,F,Q),Q},f=function(M,R){if("object"==typeof Reflect&&"function"==typeof Reflect.metadata)return Reflect.metadata(M,R)},e=function(M,R){return function(F,Z){R(F,Z,M)}},_=function(){function M(R,F,Z){this._el=R,this._ngZone=F,this.platformId=Z,this.clickOutsideEnabled=!0,this.attachOutsideOnClick=!1,this.delayClickOutsideInit=!1,this.emitOnBlur=!1,this.exclude="",this.excludeBeforeClick=!1,this.clickOutsideEvents="",this.clickOutside=new r.vpe,this._nodesExcluded=[],this._events=["click"],this._initOnClickBody=this._initOnClickBody.bind(this),this._onClickBody=this._onClickBody.bind(this),this._onWindowBlur=this._onWindowBlur.bind(this)}return M.prototype.ngOnInit=function(){!(0,u.NF)(this.platformId)||this._init()},M.prototype.ngOnDestroy=function(){!(0,u.NF)(this.platformId)||(this._removeClickOutsideListener(),this._removeAttachOutsideOnClickListener(),this._removeWindowBlurListener())},M.prototype.ngOnChanges=function(R){!(0,u.NF)(this.platformId)||(R.attachOutsideOnClick||R.exclude||R.emitOnBlur)&&this._init()},M.prototype._init=function(){""!==this.clickOutsideEvents&&(this._events=this.clickOutsideEvents.split(",").map(function(R){return R.trim()})),this._excludeCheck(),this.attachOutsideOnClick?this._initAttachOutsideOnClickListener():this._initOnClickBody(),this.emitOnBlur&&this._initWindowBlurListener()},M.prototype._initOnClickBody=function(){this.delayClickOutsideInit?setTimeout(this._initClickOutsideListener.bind(this)):this._initClickOutsideListener()},M.prototype._excludeCheck=function(){if(this.exclude)try{var R=Array.from(document.querySelectorAll(this.exclude));R&&(this._nodesExcluded=R)}catch(F){console.error("[ng-click-outside] Check your exclude selector syntax.",F)}},M.prototype._onClickBody=function(R){!this.clickOutsideEnabled||(this.excludeBeforeClick&&this._excludeCheck(),!this._el.nativeElement.contains(R.target)&&!this._shouldExclude(R.target)&&(this._emit(R),this.attachOutsideOnClick&&this._removeClickOutsideListener()))},M.prototype._onWindowBlur=function(R){var F=this;setTimeout(function(){document.hidden||F._emit(R)})},M.prototype._emit=function(R){var F=this;!this.clickOutsideEnabled||this._ngZone.run(function(){return F.clickOutside.emit(R)})},M.prototype._shouldExclude=function(R){for(var F=0,Z=this._nodesExcluded;F<Z.length;F++)if(Z[F].contains(R))return!0;return!1},M.prototype._initClickOutsideListener=function(){var R=this;this._ngZone.runOutsideAngular(function(){R._events.forEach(function(F){return document.addEventListener(F,R._onClickBody)})})},M.prototype._removeClickOutsideListener=function(){var R=this;this._ngZone.runOutsideAngular(function(){R._events.forEach(function(F){return document.removeEventListener(F,R._onClickBody)})})},M.prototype._initAttachOutsideOnClickListener=function(){var R=this;this._ngZone.runOutsideAngular(function(){R._events.forEach(function(F){return R._el.nativeElement.addEventListener(F,R._initOnClickBody)})})},M.prototype._removeAttachOutsideOnClickListener=function(){var R=this;this._ngZone.runOutsideAngular(function(){R._events.forEach(function(F){return R._el.nativeElement.removeEventListener(F,R._initOnClickBody)})})},M.prototype._initWindowBlurListener=function(){var R=this;this._ngZone.runOutsideAngular(function(){window.addEventListener("blur",R._onWindowBlur)})},M.prototype._removeWindowBlurListener=function(){var R=this;this._ngZone.runOutsideAngular(function(){window.removeEventListener("blur",R._onWindowBlur)})},p([(0,r.IIB)(),f("design:type",Boolean)],M.prototype,"clickOutsideEnabled",void 0),p([(0,r.IIB)(),f("design:type",Boolean)],M.prototype,"attachOutsideOnClick",void 0),p([(0,r.IIB)(),f("design:type",Boolean)],M.prototype,"delayClickOutsideInit",void 0),p([(0,r.IIB)(),f("design:type",Boolean)],M.prototype,"emitOnBlur",void 0),p([(0,r.IIB)(),f("design:type",String)],M.prototype,"exclude",void 0),p([(0,r.IIB)(),f("design:type",Boolean)],M.prototype,"excludeBeforeClick",void 0),p([(0,r.IIB)(),f("design:type",String)],M.prototype,"clickOutsideEvents",void 0),p([(0,r.r_U)(),f("design:type",r.vpe)],M.prototype,"clickOutside",void 0),(M=p([e(2,(0,r.tBr)(r.Lbi)),f("design:paramtypes",[r.SBq,r.R0b,Object])],M)).\u0275fac=function(F){return new(F||M)(r.Y36(r.SBq),r.Y36(r.R0b),r.Y36(r.Lbi))},M.\u0275dir=r.lG2({type:M,selectors:[["","clickOutside",""]],inputs:{clickOutsideEnabled:"clickOutsideEnabled",attachOutsideOnClick:"attachOutsideOnClick",delayClickOutsideInit:"delayClickOutsideInit",emitOnBlur:"emitOnBlur",exclude:"exclude",excludeBeforeClick:"excludeBeforeClick",clickOutsideEvents:"clickOutsideEvents"},outputs:{clickOutside:"clickOutside"},features:[r.TTD]}),M.\u0275prov=r.Yz7({token:M,factory:function(R){return M.\u0275fac(R)}}),M}(),T=function(){function M(){}return M.\u0275fac=function(F){return new(F||M)},M.\u0275mod=r.oAB({type:M}),M.\u0275inj=r.cJS({}),M}()},7194:(v,S,i)=>{"use strict";i.d(S,{jh:()=>me,m9:()=>Oe});var r=i(74788),u=i(26215),p=i(57765);var T=i(6823);const M=[[255,99,132],[54,162,235],[255,206,86],[231,233,237],[75,192,192],[151,187,205],[220,220,220],[247,70,74],[70,191,189],[253,180,92],[148,159,177],[77,83,96]];function F(je,Ie){return"rgba("+je.concat(Ie).join(",")+")"}function Z(je,Ie){return Math.floor(Math.random()*(Ie-je+1))+je}function ee(je){return{backgroundColor:je.map(Ie=>F(Ie,.6)),borderColor:je.map(()=>"#fff"),pointBackgroundColor:je.map(Ie=>F(Ie,1)),pointBorderColor:je.map(()=>"#fff"),pointHoverBackgroundColor:je.map(Ie=>F(Ie,1)),pointHoverBorderColor:je.map(Ie=>F(Ie,1))}}function ae(){return[Z(0,255),Z(0,255),Z(0,255)]}function $(je){return M[je]||ae()}function se(je){const Ie=new Array(je);for(let Ve=0;Ve<je;Ve++)Ie[Ve]=M[Ve]||ae();return Ie}let ve=(()=>{class je{constructor(){this.pColorschemesOptions={},this.colorschemesOptions=new u.X({})}setColorschemesOptions(Ve){this.pColorschemesOptions=Ve,this.colorschemesOptions.next(Ve)}getColorschemesOptions(){return this.pColorschemesOptions}}return je.\u0275fac=function(Ve){return new(Ve||je)},je.\u0275prov=(0,r.Yz7)({factory:function(){return new je},token:je,providedIn:"root"}),je})();const he={Default:0,Update:1,Refresh:2};he[he.Default]="Default",he[he.Update]="Update",he[he.Refresh]="Refresh";let me=(()=>{class je{constructor(Ve,He){this.element=Ve,this.themeService=He,this.options={},this.chartClick=new r.vpe,this.chartHover=new r.vpe,this.old={dataExists:!1,dataLength:0,datasetsExists:!1,datasetsLength:0,datasetsDataObjects:[],datasetsDataLengths:[],colorsExists:!1,colors:[],labelsExist:!1,labels:[],legendExists:!1,legend:{}},this.subs=[]}static registerPlugin(Ve){T.pluginService.register(Ve)}static unregisterPlugin(Ve){T.pluginService.unregister(Ve)}ngOnInit(){this.ctx=this.element.nativeElement.getContext("2d"),this.refresh(),this.subs.push(this.themeService.colorschemesOptions.subscribe(Ve=>this.themeChanged(Ve)))}themeChanged(Ve){this.refresh()}ngDoCheck(){if(!this.chart)return;let Ve=he.Default;const He=Zt=>{Ve=Zt>Ve?Zt:Ve};switch(!!this.data!==this.old.dataExists&&(this.propagateDataToDatasets(this.data),this.old.dataExists=!!this.data,He(he.Update)),this.data&&this.data.length!==this.old.dataLength&&(this.old.dataLength=this.data&&this.data.length||0,He(he.Update)),!!this.datasets!==this.old.datasetsExists&&(this.old.datasetsExists=!!this.datasets,He(he.Update)),this.datasets&&this.datasets.length!==this.old.datasetsLength&&(this.old.datasetsLength=this.datasets&&this.datasets.length||0,He(he.Update)),this.datasets&&this.datasets.filter((Zt,st)=>Zt.data!==this.old.datasetsDataObjects[st]).length&&(this.old.datasetsDataObjects=this.datasets.map(Zt=>Zt.data),He(he.Update)),this.datasets&&this.datasets.filter((Zt,st)=>Zt.data.length!==this.old.datasetsDataLengths[st]).length&&(this.old.datasetsDataLengths=this.datasets.map(Zt=>Zt.data.length),He(he.Update)),!!this.colors!==this.old.colorsExists&&(this.old.colorsExists=!!this.colors,this.updateColors(),He(he.Update)),this.colors&&this.colors.filter((Zt,st)=>!this.colorsEqual(Zt,this.old.colors[st])).length&&(this.old.colors=this.colors.map(Zt=>this.copyColor(Zt)),this.updateColors(),He(he.Update)),!!this.labels!==this.old.labelsExist&&(this.old.labelsExist=!!this.labels,He(he.Update)),this.labels&&this.labels.filter((Zt,st)=>!this.labelsEqual(Zt,this.old.labels[st])).length&&(this.old.labels=this.labels.map(Zt=>this.copyLabel(Zt)),He(he.Update)),!!this.options.legend!==this.old.legendExists&&(this.old.legendExists=!!this.options.legend,He(he.Refresh)),this.options.legend&&this.options.legend.position!==this.old.legend.position&&(this.old.legend.position=this.options.legend.position,He(he.Refresh)),Ve){case he.Default:break;case he.Update:this.update();break;case he.Refresh:this.refresh()}}copyLabel(Ve){return Array.isArray(Ve)?[...Ve]:Ve}labelsEqual(Ve,He){return Array.isArray(Ve)===Array.isArray(He)&&(Array.isArray(Ve)||Ve===He)&&(!Array.isArray(Ve)||Ve.length===He.length)&&(!Array.isArray(Ve)||0===Ve.filter((Zt,st)=>Zt!==He[st]).length)}copyColor(Ve){return{backgroundColor:Ve.backgroundColor,borderWidth:Ve.borderWidth,borderColor:Ve.borderColor,borderCapStyle:Ve.borderCapStyle,borderDash:Ve.borderDash,borderDashOffset:Ve.borderDashOffset,borderJoinStyle:Ve.borderJoinStyle,pointBorderColor:Ve.pointBorderColor,pointBackgroundColor:Ve.pointBackgroundColor,pointBorderWidth:Ve.pointBorderWidth,pointRadius:Ve.pointRadius,pointHoverRadius:Ve.pointHoverRadius,pointHitRadius:Ve.pointHitRadius,pointHoverBackgroundColor:Ve.pointHoverBackgroundColor,pointHoverBorderColor:Ve.pointHoverBorderColor,pointHoverBorderWidth:Ve.pointHoverBorderWidth,pointStyle:Ve.pointStyle,hoverBackgroundColor:Ve.hoverBackgroundColor,hoverBorderColor:Ve.hoverBorderColor,hoverBorderWidth:Ve.hoverBorderWidth}}colorsEqual(Ve,He){return!Ve==!He&&(!Ve||Ve.backgroundColor===He.backgroundColor&&Ve.borderWidth===He.borderWidth&&Ve.borderColor===He.borderColor&&Ve.borderCapStyle===He.borderCapStyle&&Ve.borderDash===He.borderDash&&Ve.borderDashOffset===He.borderDashOffset&&Ve.borderJoinStyle===He.borderJoinStyle&&Ve.pointBorderColor===He.pointBorderColor&&Ve.pointBackgroundColor===He.pointBackgroundColor&&Ve.pointBorderWidth===He.pointBorderWidth&&Ve.pointRadius===He.pointRadius&&Ve.pointHoverRadius===He.pointHoverRadius&&Ve.pointHitRadius===He.pointHitRadius&&Ve.pointHoverBackgroundColor===He.pointHoverBackgroundColor&&Ve.pointHoverBorderColor===He.pointHoverBorderColor&&Ve.pointHoverBorderWidth===He.pointHoverBorderWidth&&Ve.pointStyle===He.pointStyle&&Ve.hoverBackgroundColor===He.hoverBackgroundColor&&Ve.hoverBorderColor===He.hoverBorderColor&&Ve.hoverBorderWidth===He.hoverBorderWidth)}updateColors(){this.datasets.forEach((Ve,He)=>{this.colors&&this.colors[He]?Object.assign(Ve,this.colors[He]):Object.assign(Ve,function(je,Ie,Ve){if("pie"===je||"doughnut"===je)return ee(se(Ve));if("polarArea"===je)return function(je){return{backgroundColor:je.map(Ie=>F(Ie,.6)),borderColor:je.map(Ie=>F(Ie,1)),hoverBackgroundColor:je.map(Ie=>F(Ie,.8)),hoverBorderColor:je.map(Ie=>F(Ie,1))}}(se(Ve));if("line"===je||"radar"===je)return function(je){return{backgroundColor:F(je,.4),borderColor:F(je,1),pointBackgroundColor:F(je,1),pointBorderColor:"#fff",pointHoverBackgroundColor:"#fff",pointHoverBorderColor:F(je,.8)}}($(Ie));if("bar"===je||"horizontalBar"===je)return function(je){return{backgroundColor:F(je,.6),borderColor:F(je,1),hoverBackgroundColor:F(je,.8),hoverBorderColor:F(je,1)}}($(Ie));if("bubble"===je||"scatter"===je)return ee(se(Ve));throw new Error(`getColors - Unsupported chart type ${je}`)}(this.chartType,He,Ve.data.length),Object.assign({},Ve))})}ngOnChanges(Ve){let He=he.Default;const Zt=st=>{He=st>He?st:He};switch(Ve.hasOwnProperty("data")&&Ve.data.currentValue&&(this.propagateDataToDatasets(Ve.data.currentValue),Zt(he.Update)),Ve.hasOwnProperty("datasets")&&Ve.datasets.currentValue&&(this.propagateDatasetsToData(Ve.datasets.currentValue),Zt(he.Update)),Ve.hasOwnProperty("labels")&&(this.chart&&(this.chart.data.labels=Ve.labels.currentValue),Zt(he.Update)),Ve.hasOwnProperty("legend")&&(this.chart&&(this.chart.config.options.legend.display=Ve.legend.currentValue,this.chart.generateLegend()),Zt(he.Update)),Ve.hasOwnProperty("options")&&Zt(he.Refresh),He){case he.Update:this.update();break;case he.Refresh:case he.Default:this.refresh()}}ngOnDestroy(){this.chart&&(this.chart.destroy(),this.chart=void 0),this.subs.forEach(Ve=>Ve.unsubscribe())}update(Ve){if(this.chart)return this.chart.update(Ve)}hideDataset(Ve,He){this.chart.getDatasetMeta(Ve).hidden=He,this.chart.update()}isDatasetHidden(Ve){return this.chart.getDatasetMeta(Ve).hidden}toBase64Image(){return this.chart.toBase64Image()}getChartConfiguration(){const Ve=this.getDatasets(),He=Object.assign({},this.options);!1===this.legend&&(He.legend={display:!1}),He.hover=He.hover||{},He.hover.onHover||(He.hover.onHover=(st,en)=>{en&&!en.length||this.chartHover.emit({event:st,active:en})}),He.onClick||(He.onClick=(st,en)=>{this.chartClick.emit({event:st,active:en})});const Zt=this.smartMerge(He,this.themeService.getColorschemesOptions());return{type:this.chartType,data:{labels:this.labels||[],datasets:Ve},plugins:this.plugins,options:Zt}}getChartBuilder(Ve){const He=this.getChartConfiguration();return new T.Chart(Ve,He)}smartMerge(Ve,He,Zt=0){if(0===Zt&&(Ve=function(je){return(0,p.Z)(je,5)}(Ve)),Object.keys(He).forEach(en=>{if(Array.isArray(He[en])){const $t=Ve[en];$t&&$t.forEach(Gt=>{this.smartMerge(Gt,He[en][0],Zt+1)})}else"object"==typeof He[en]?(en in Ve||(Ve[en]={}),this.smartMerge(Ve[en],He[en],Zt+1)):Ve[en]=He[en]}),0===Zt)return Ve}isMultiLineLabel(Ve){return Array.isArray(Ve)}joinLabel(Ve){return Ve?this.isMultiLineLabel(Ve)?Ve.join(" "):Ve:null}propagateDatasetsToData(Ve){this.data=this.datasets.map(He=>He.data),this.chart&&(this.chart.data.datasets=Ve),this.updateColors()}propagateDataToDatasets(Ve){this.isMultiDataSet(Ve)?this.datasets&&Ve.length===this.datasets.length?this.datasets.forEach((He,Zt)=>{He.data=Ve[Zt]}):(this.datasets=Ve.map((He,Zt)=>({data:He,label:this.joinLabel(this.labels[Zt])||`Label ${Zt}`})),this.chart&&(this.chart.data.datasets=this.datasets)):this.datasets?(this.datasets[0]||(this.datasets[0]={}),this.datasets[0].data=Ve,this.datasets.splice(1)):(this.datasets=[{data:Ve}],this.chart&&(this.chart.data.datasets=this.datasets)),this.updateColors()}isMultiDataSet(Ve){return Array.isArray(Ve[0])}getDatasets(){if(!this.datasets&&!this.data)throw new Error(`ng-charts configuration error, data or datasets field are required to render chart ${this.chartType}`);return this.datasets?(this.propagateDatasetsToData(this.datasets),this.datasets):this.data?(this.propagateDataToDatasets(this.data),this.datasets):void 0}refresh(){this.chart&&(this.chart.destroy(),this.chart=void 0),this.ctx&&(this.chart=this.getChartBuilder(this.ctx))}}return je.\u0275fac=function(Ve){return new(Ve||je)(r.Y36(r.SBq),r.Y36(ve))},je.\u0275dir=r.lG2({type:je,selectors:[["canvas","baseChart",""]],inputs:{options:"options",data:"data",datasets:"datasets",labels:"labels",chartType:"chartType",colors:"colors",legend:"legend",plugins:"plugins"},outputs:{chartClick:"chartClick",chartHover:"chartHover"},exportAs:["base-chart"],features:[r.TTD]}),je})(),Oe=(()=>{class je{}return je.\u0275fac=function(Ve){return new(Ve||je)},je.\u0275mod=r.oAB({type:je}),je.\u0275inj=r.cJS({imports:[[]]}),je})()},37496:(v,S,i)=>{"use strict";i.d(S,{b:()=>p,i:()=>u});var r=i(74788);let u=(()=>{class f{transform(_,y,T){return T?y.call(T,_):y(_)}}return f.\u0275fac=function(_){return new(_||f)},f.\u0275pipe=r.Yjl({name:"pipeFunction",type:f,pure:!0}),f})(),p=(()=>{class f{}return f.\u0275fac=function(_){return new(_||f)},f.\u0275mod=r.oAB({type:f}),f.\u0275inj=r.cJS({}),f})()},91376:(v,S,i)=>{"use strict";i.d(S,{Rh:()=>en,_W:()=>He});var r=i(74788),u=i(56083),p=i(79765),f=i(91211),e=i(12057);const _=["toast-component",""];function y(mt,Yt){if(1&mt){const Dt=r.EpF();r.TgZ(0,"button",5),r.NdJ("click",function(){return r.CHM(Dt),r.oxw().remove()}),r.TgZ(1,"span",6),r._uU(2,"\xd7"),r.qZA(),r.qZA()}}function T(mt,Yt){if(1&mt&&(r.ynx(0),r._uU(1),r.BQk()),2&mt){const Dt=r.oxw(2);r.xp6(1),r.hij("[",Dt.duplicatesCount+1,"]")}}function M(mt,Yt){if(1&mt&&(r.TgZ(0,"div"),r._uU(1),r.YNc(2,T,2,1,"ng-container",4),r.qZA()),2&mt){const Dt=r.oxw();r.Tol(Dt.options.titleClass),r.uIk("aria-label",Dt.title),r.xp6(1),r.hij(" ",Dt.title," "),r.xp6(1),r.Q6J("ngIf",Dt.duplicatesCount)}}function R(mt,Yt){if(1&mt&&r._UZ(0,"div",7),2&mt){const Dt=r.oxw();r.Tol(Dt.options.messageClass),r.Q6J("innerHTML",Dt.message,r.oJD)}}function F(mt,Yt){if(1&mt&&(r.TgZ(0,"div",8),r._uU(1),r.qZA()),2&mt){const Dt=r.oxw();r.Tol(Dt.options.messageClass),r.uIk("aria-label",Dt.message),r.xp6(1),r.hij(" ",Dt.message," ")}}function Z(mt,Yt){if(1&mt&&(r.TgZ(0,"div"),r._UZ(1,"div",9),r.qZA()),2&mt){const Dt=r.oxw();r.xp6(1),r.Udp("width",Dt.width+"%")}}function J(mt,Yt){if(1&mt){const Dt=r.EpF();r.TgZ(0,"button",5),r.NdJ("click",function(){return r.CHM(Dt),r.oxw().remove()}),r.TgZ(1,"span",6),r._uU(2,"\xd7"),r.qZA(),r.qZA()}}function Q(mt,Yt){if(1&mt&&(r.ynx(0),r._uU(1),r.BQk()),2&mt){const Dt=r.oxw(2);r.xp6(1),r.hij("[",Dt.duplicatesCount+1,"]")}}function ee(mt,Yt){if(1&mt&&(r.TgZ(0,"div"),r._uU(1),r.YNc(2,Q,2,1,"ng-container",4),r.qZA()),2&mt){const Dt=r.oxw();r.Tol(Dt.options.titleClass),r.uIk("aria-label",Dt.title),r.xp6(1),r.hij(" ",Dt.title," "),r.xp6(1),r.Q6J("ngIf",Dt.duplicatesCount)}}function ue(mt,Yt){if(1&mt&&r._UZ(0,"div",7),2&mt){const Dt=r.oxw();r.Tol(Dt.options.messageClass),r.Q6J("innerHTML",Dt.message,r.oJD)}}function ae(mt,Yt){if(1&mt&&(r.TgZ(0,"div",8),r._uU(1),r.qZA()),2&mt){const Dt=r.oxw();r.Tol(Dt.options.messageClass),r.uIk("aria-label",Dt.message),r.xp6(1),r.hij(" ",Dt.message," ")}}function $(mt,Yt){if(1&mt&&(r.TgZ(0,"div"),r._UZ(1,"div",9),r.qZA()),2&mt){const Dt=r.oxw();r.xp6(1),r.Udp("width",Dt.width+"%")}}class oe{constructor(Yt,Dt,zt,Yn,Hr,ci){this.toastId=Yt,this.config=Dt,this.message=zt,this.title=Yn,this.toastType=Hr,this.toastRef=ci,this._onTap=new p.xQ,this._onAction=new p.xQ,this.toastRef.afterClosed().subscribe(()=>{this._onAction.complete(),this._onTap.complete()})}triggerTap(){this._onTap.next(),this.config.tapToDismiss&&this._onTap.complete()}onTap(){return this._onTap.asObservable()}triggerAction(Yt){this._onAction.next(Yt)}onAction(){return this._onAction.asObservable()}}const he={maxOpened:0,autoDismiss:!1,newestOnTop:!0,preventDuplicates:!1,countDuplicates:!1,resetTimeoutOnDuplicate:!1,includeTitleDuplicates:!1,iconClasses:{error:"toast-error",info:"toast-info",success:"toast-success",warning:"toast-warning"},closeButton:!1,disableTimeOut:!1,timeOut:5e3,extendedTimeOut:1e3,enableHtml:!1,progressBar:!1,toastClass:"ngx-toastr",positionClass:"toast-top-right",titleClass:"toast-title",messageClass:"toast-message",easing:"ease-in",easeTime:300,tapToDismiss:!0,onActivateTick:!1,progressAnimation:"decreasing",payload:null},me=new r.OlP("ToastConfig");class Oe{constructor(Yt,Dt){this.component=Yt,this.injector=Dt}attach(Yt,Dt){return this._attachedHost=Yt,Yt.attach(this,Dt)}detach(){const Yt=this._attachedHost;if(Yt)return this._attachedHost=void 0,Yt.detach()}get isAttached(){return null!=this._attachedHost}setAttachedHost(Yt){this._attachedHost=Yt}}class dt extends class{attach(Yt,Dt){return this._attachedPortal=Yt,this.attachComponentPortal(Yt,Dt)}detach(){this._attachedPortal&&this._attachedPortal.setAttachedHost(),this._attachedPortal=void 0,this._disposeFn&&(this._disposeFn(),this._disposeFn=void 0)}setDisposeFn(Yt){this._disposeFn=Yt}}{constructor(Yt,Dt,zt){super(),this._hostDomElement=Yt,this._componentFactoryResolver=Dt,this._appRef=zt}attachComponentPortal(Yt,Dt){const zt=this._componentFactoryResolver.resolveComponentFactory(Yt.component);let Yn;return Yn=zt.create(Yt.injector),this._appRef.attachView(Yn.hostView),this.setDisposeFn(()=>{this._appRef.detachView(Yn.hostView),Yn.destroy()}),Dt?this._hostDomElement.insertBefore(this._getComponentRootNode(Yn),this._hostDomElement.firstChild):this._hostDomElement.appendChild(this._getComponentRootNode(Yn)),Yn}_getComponentRootNode(Yt){return Yt.hostView.rootNodes[0]}}let ze=(()=>{class mt{constructor(Dt){this._document=Dt}ngOnDestroy(){this._containerElement&&this._containerElement.parentNode&&this._containerElement.parentNode.removeChild(this._containerElement)}getContainerElement(){return this._containerElement||this._createContainer(),this._containerElement}_createContainer(){const Dt=this._document.createElement("div");Dt.classList.add("overlay-container"),this._document.body.appendChild(Dt),this._containerElement=Dt}}return mt.\u0275fac=function(Dt){return new(Dt||mt)(r.LFG(e.K0))},mt.\u0275prov=r.Yz7({factory:function(){return new mt(r.LFG(e.K0))},token:mt,providedIn:"root"}),mt})();class Ye{constructor(Yt){this._portalHost=Yt}attach(Yt,Dt=!0){return this._portalHost.attach(Yt,Dt)}detach(){return this._portalHost.detach()}}let je=(()=>{class mt{constructor(Dt,zt,Yn,Hr){this._overlayContainer=Dt,this._componentFactoryResolver=zt,this._appRef=Yn,this._document=Hr,this._paneElements=new Map}create(Dt,zt){return this._createOverlayRef(this.getPaneElement(Dt,zt))}getPaneElement(Dt="",zt){return this._paneElements.get(zt)||this._paneElements.set(zt,{}),this._paneElements.get(zt)[Dt]||(this._paneElements.get(zt)[Dt]=this._createPaneElement(Dt,zt)),this._paneElements.get(zt)[Dt]}_createPaneElement(Dt,zt){const Yn=this._document.createElement("div");return Yn.id="toast-container",Yn.classList.add(Dt),Yn.classList.add("toast-container"),zt?zt.getContainerElement().appendChild(Yn):this._overlayContainer.getContainerElement().appendChild(Yn),Yn}_createPortalHost(Dt){return new dt(Dt,this._componentFactoryResolver,this._appRef)}_createOverlayRef(Dt){return new Ye(this._createPortalHost(Dt))}}return mt.\u0275fac=function(Dt){return new(Dt||mt)(r.LFG(ze),r.LFG(r._Vd),r.LFG(r.z2F),r.LFG(e.K0))},mt.\u0275prov=r.Yz7({factory:function(){return new mt(r.LFG(ze),r.LFG(r._Vd),r.LFG(r.z2F),r.LFG(e.K0))},token:mt,providedIn:"root"}),mt})();class Ie{constructor(Yt){this._overlayRef=Yt,this.duplicatesCount=0,this._afterClosed=new p.xQ,this._activate=new p.xQ,this._manualClose=new p.xQ,this._resetTimeout=new p.xQ,this._countDuplicate=new p.xQ}manualClose(){this._manualClose.next(),this._manualClose.complete()}manualClosed(){return this._manualClose.asObservable()}timeoutReset(){return this._resetTimeout.asObservable()}countDuplicate(){return this._countDuplicate.asObservable()}close(){this._overlayRef.detach(),this._afterClosed.next(),this._manualClose.next(),this._afterClosed.complete(),this._manualClose.complete(),this._activate.complete(),this._resetTimeout.complete(),this._countDuplicate.complete()}afterClosed(){return this._afterClosed.asObservable()}isInactive(){return this._activate.isStopped}activate(){this._activate.next(),this._activate.complete()}afterActivate(){return this._activate.asObservable()}onDuplicate(Yt,Dt){Yt&&this._resetTimeout.next(),Dt&&this._countDuplicate.next(++this.duplicatesCount)}}class Ve{constructor(Yt,Dt){this._toastPackage=Yt,this._parentInjector=Dt}get(Yt,Dt,zt){return Yt===oe?this._toastPackage:this._parentInjector.get(Yt,Dt,zt)}}let He=(()=>{class mt{constructor(Dt,zt,Yn,Hr,ci){this.overlay=zt,this._injector=Yn,this.sanitizer=Hr,this.ngZone=ci,this.currentlyActive=0,this.toasts=[],this.index=0,this.toastrConfig=Object.assign(Object.assign({},Dt.default),Dt.config),Dt.config.iconClasses&&(this.toastrConfig.iconClasses=Object.assign(Object.assign({},Dt.default.iconClasses),Dt.config.iconClasses))}show(Dt,zt,Yn={},Hr=""){return this._preBuildNotification(Hr,Dt,zt,this.applyConfig(Yn))}success(Dt,zt,Yn={}){return this._preBuildNotification(this.toastrConfig.iconClasses.success||"",Dt,zt,this.applyConfig(Yn))}error(Dt,zt,Yn={}){return this._preBuildNotification(this.toastrConfig.iconClasses.error||"",Dt,zt,this.applyConfig(Yn))}info(Dt,zt,Yn={}){return this._preBuildNotification(this.toastrConfig.iconClasses.info||"",Dt,zt,this.applyConfig(Yn))}warning(Dt,zt,Yn={}){return this._preBuildNotification(this.toastrConfig.iconClasses.warning||"",Dt,zt,this.applyConfig(Yn))}clear(Dt){for(const zt of this.toasts)if(void 0!==Dt){if(zt.toastId===Dt)return void zt.toastRef.manualClose()}else zt.toastRef.manualClose()}remove(Dt){const zt=this._findToast(Dt);if(!zt||(zt.activeToast.toastRef.close(),this.toasts.splice(zt.index,1),this.currentlyActive=this.currentlyActive-1,!this.toastrConfig.maxOpened||!this.toasts.length))return!1;if(this.currentlyActive<this.toastrConfig.maxOpened&&this.toasts[this.currentlyActive]){const Yn=this.toasts[this.currentlyActive].toastRef;Yn.isInactive()||(this.currentlyActive=this.currentlyActive+1,Yn.activate())}return!0}findDuplicate(Dt="",zt="",Yn,Hr){const{includeTitleDuplicates:ci}=this.toastrConfig;for(const Ir of this.toasts){const wr=ci&&Ir.title===Dt;if((!ci||wr)&&Ir.message===zt)return Ir.toastRef.onDuplicate(Yn,Hr),Ir}return null}applyConfig(Dt={}){return Object.assign(Object.assign({},this.toastrConfig),Dt)}_findToast(Dt){for(let zt=0;zt<this.toasts.length;zt++)if(this.toasts[zt].toastId===Dt)return{index:zt,activeToast:this.toasts[zt]};return null}_preBuildNotification(Dt,zt,Yn,Hr){return Hr.onActivateTick?this.ngZone.run(()=>this._buildNotification(Dt,zt,Yn,Hr)):this._buildNotification(Dt,zt,Yn,Hr)}_buildNotification(Dt,zt,Yn,Hr){if(!Hr.toastComponent)throw new Error("toastComponent required");const ci=this.findDuplicate(Yn,zt,this.toastrConfig.resetTimeoutOnDuplicate&&Hr.timeOut>0,this.toastrConfig.countDuplicates);if((this.toastrConfig.includeTitleDuplicates&&Yn||zt)&&this.toastrConfig.preventDuplicates&&null!==ci)return ci;this.previousToastMessage=zt;let Ir=!1;this.toastrConfig.maxOpened&&this.currentlyActive>=this.toastrConfig.maxOpened&&(Ir=!0,this.toastrConfig.autoDismiss&&this.clear(this.toasts[0].toastId));const wr=this.overlay.create(Hr.positionClass,this.overlayContainer);this.index=this.index+1;let Qr=zt;zt&&Hr.enableHtml&&(Qr=this.sanitizer.sanitize(r.q3G.HTML,zt));const Kr=new Ie(wr),In=new oe(this.index,Hr,Qr,Yn,Dt,Kr),Hn=new Ve(In,this._injector),Zr=new Oe(Hr.toastComponent,Hn),Ur=wr.attach(Zr,this.toastrConfig.newestOnTop);Kr.componentInstance=Ur.instance;const di={toastId:this.index,title:Yn||"",message:zt||"",toastRef:Kr,onShown:Kr.afterActivate(),onHidden:Kr.afterClosed(),onTap:In.onTap(),onAction:In.onAction(),portal:Ur};return Ir||(this.currentlyActive=this.currentlyActive+1,setTimeout(()=>{di.toastRef.activate()})),this.toasts.push(di),di}}return mt.\u0275fac=function(Dt){return new(Dt||mt)(r.LFG(me),r.LFG(je),r.LFG(r.zs3),r.LFG(f.H7),r.LFG(r.R0b))},mt.\u0275prov=r.Yz7({factory:function(){return new mt(r.LFG(me),r.LFG(je),r.LFG(r.gxx),r.LFG(f.H7),r.LFG(r.R0b))},token:mt,providedIn:"root"}),mt})(),Zt=(()=>{class mt{constructor(Dt,zt,Yn){this.toastrService=Dt,this.toastPackage=zt,this.ngZone=Yn,this.width=-1,this.toastClasses="",this.state={value:"inactive",params:{easeTime:this.toastPackage.config.easeTime,easing:"ease-in"}},this.message=zt.message,this.title=zt.title,this.options=zt.config,this.originalTimeout=zt.config.timeOut,this.toastClasses=`${zt.toastType} ${zt.config.toastClass}`,this.sub=zt.toastRef.afterActivate().subscribe(()=>{this.activateToast()}),this.sub1=zt.toastRef.manualClosed().subscribe(()=>{this.remove()}),this.sub2=zt.toastRef.timeoutReset().subscribe(()=>{this.resetTimeout()}),this.sub3=zt.toastRef.countDuplicate().subscribe(Hr=>{this.duplicatesCount=Hr})}get displayStyle(){if("inactive"===this.state.value)return"none"}ngOnDestroy(){this.sub.unsubscribe(),this.sub1.unsubscribe(),this.sub2.unsubscribe(),this.sub3.unsubscribe(),clearInterval(this.intervalId),clearTimeout(this.timeout)}activateToast(){this.state=Object.assign(Object.assign({},this.state),{value:"active"}),!0!==this.options.disableTimeOut&&"timeOut"!==this.options.disableTimeOut&&this.options.timeOut&&(this.outsideTimeout(()=>this.remove(),this.options.timeOut),this.hideTime=(new Date).getTime()+this.options.timeOut,this.options.progressBar&&this.outsideInterval(()=>this.updateProgress(),10))}updateProgress(){if(0===this.width||100===this.width||!this.options.timeOut)return;const Dt=(new Date).getTime();this.width=(this.hideTime-Dt)/this.options.timeOut*100,"increasing"===this.options.progressAnimation&&(this.width=100-this.width),this.width<=0&&(this.width=0),this.width>=100&&(this.width=100)}resetTimeout(){clearTimeout(this.timeout),clearInterval(this.intervalId),this.state=Object.assign(Object.assign({},this.state),{value:"active"}),this.outsideTimeout(()=>this.remove(),this.originalTimeout),this.options.timeOut=this.originalTimeout,this.hideTime=(new Date).getTime()+(this.options.timeOut||0),this.width=-1,this.options.progressBar&&this.outsideInterval(()=>this.updateProgress(),10)}remove(){"removed"!==this.state.value&&(clearTimeout(this.timeout),this.state=Object.assign(Object.assign({},this.state),{value:"removed"}),this.outsideTimeout(()=>this.toastrService.remove(this.toastPackage.toastId),+this.toastPackage.config.easeTime))}tapToast(){"removed"!==this.state.value&&(this.toastPackage.triggerTap(),this.options.tapToDismiss&&this.remove())}stickAround(){"removed"!==this.state.value&&(clearTimeout(this.timeout),this.options.timeOut=0,this.hideTime=0,clearInterval(this.intervalId),this.width=0)}delayedHideToast(){!0===this.options.disableTimeOut||"extendedTimeOut"===this.options.disableTimeOut||0===this.options.extendedTimeOut||"removed"===this.state.value||(this.outsideTimeout(()=>this.remove(),this.options.extendedTimeOut),this.options.timeOut=this.options.extendedTimeOut,this.hideTime=(new Date).getTime()+(this.options.timeOut||0),this.width=-1,this.options.progressBar&&this.outsideInterval(()=>this.updateProgress(),10))}outsideTimeout(Dt,zt){this.ngZone?this.ngZone.runOutsideAngular(()=>this.timeout=setTimeout(()=>this.runInsideAngular(Dt),zt)):this.timeout=setTimeout(()=>Dt(),zt)}outsideInterval(Dt,zt){this.ngZone?this.ngZone.runOutsideAngular(()=>this.intervalId=setInterval(()=>this.runInsideAngular(Dt),zt)):this.intervalId=setInterval(()=>Dt(),zt)}runInsideAngular(Dt){this.ngZone?this.ngZone.run(()=>Dt()):Dt()}}return mt.\u0275fac=function(Dt){return new(Dt||mt)(r.Y36(He),r.Y36(oe),r.Y36(r.R0b))},mt.\u0275cmp=r.Xpm({type:mt,selectors:[["","toast-component",""]],hostVars:5,hostBindings:function(Dt,zt){1&Dt&&r.NdJ("click",function(){return zt.tapToast()})("mouseenter",function(){return zt.stickAround()})("mouseleave",function(){return zt.delayedHideToast()}),2&Dt&&(r.d8E("@flyInOut",zt.state),r.Tol(zt.toastClasses),r.Udp("display",zt.displayStyle))},attrs:_,decls:5,vars:5,consts:[["type","button","class","toast-close-button","aria-label","Close",3,"click",4,"ngIf"],[3,"class",4,"ngIf"],["role","alertdialog","aria-live","polite",3,"class","innerHTML",4,"ngIf"],["role","alertdialog","aria-live","polite",3,"class",4,"ngIf"],[4,"ngIf"],["type","button","aria-label","Close",1,"toast-close-button",3,"click"],["aria-hidden","true"],["role","alertdialog","aria-live","polite",3,"innerHTML"],["role","alertdialog","aria-live","polite"],[1,"toast-progress"]],template:function(Dt,zt){1&Dt&&(r.YNc(0,y,3,0,"button",0),r.YNc(1,M,3,5,"div",1),r.YNc(2,R,1,3,"div",2),r.YNc(3,F,2,4,"div",3),r.YNc(4,Z,2,2,"div",4)),2&Dt&&(r.Q6J("ngIf",zt.options.closeButton),r.xp6(1),r.Q6J("ngIf",zt.title),r.xp6(1),r.Q6J("ngIf",zt.message&&zt.options.enableHtml),r.xp6(1),r.Q6J("ngIf",zt.message&&!zt.options.enableHtml),r.xp6(1),r.Q6J("ngIf",zt.options.progressBar))},directives:[e.O5],encapsulation:2,data:{animation:[(0,u.X$)("flyInOut",[(0,u.SB)("inactive",(0,u.oB)({opacity:0})),(0,u.SB)("active",(0,u.oB)({opacity:1})),(0,u.SB)("removed",(0,u.oB)({opacity:0})),(0,u.eR)("inactive => active",(0,u.jt)("{{ easeTime }}ms {{ easing }}")),(0,u.eR)("active => removed",(0,u.jt)("{{ easeTime }}ms {{ easing }}"))])]}}),mt})();const st=Object.assign(Object.assign({},he),{toastComponent:Zt});let en=(()=>{class mt{static forRoot(Dt={}){return{ngModule:mt,providers:[{provide:me,useValue:{default:st,config:Dt}}]}}}return mt.\u0275fac=function(Dt){return new(Dt||mt)},mt.\u0275mod=r.oAB({type:mt}),mt.\u0275inj=r.cJS({imports:[[e.ez]]}),mt})(),Gt=(()=>{class mt{constructor(Dt,zt,Yn){this.toastrService=Dt,this.toastPackage=zt,this.appRef=Yn,this.width=-1,this.toastClasses="",this.state="inactive",this.message=zt.message,this.title=zt.title,this.options=zt.config,this.originalTimeout=zt.config.timeOut,this.toastClasses=`${zt.toastType} ${zt.config.toastClass}`,this.sub=zt.toastRef.afterActivate().subscribe(()=>{this.activateToast()}),this.sub1=zt.toastRef.manualClosed().subscribe(()=>{this.remove()}),this.sub2=zt.toastRef.timeoutReset().subscribe(()=>{this.resetTimeout()}),this.sub3=zt.toastRef.countDuplicate().subscribe(Hr=>{this.duplicatesCount=Hr})}get displayStyle(){if("inactive"===this.state)return"none"}ngOnDestroy(){this.sub.unsubscribe(),this.sub1.unsubscribe(),this.sub2.unsubscribe(),this.sub3.unsubscribe(),clearInterval(this.intervalId),clearTimeout(this.timeout)}activateToast(){this.state="active",!(!0===this.options.disableTimeOut||"timeOut"===this.options.disableTimeOut)&&this.options.timeOut&&(this.timeout=setTimeout(()=>{this.remove()},this.options.timeOut),this.hideTime=(new Date).getTime()+this.options.timeOut,this.options.progressBar&&(this.intervalId=setInterval(()=>this.updateProgress(),10))),this.options.onActivateTick&&this.appRef.tick()}updateProgress(){if(0===this.width||100===this.width||!this.options.timeOut)return;const Dt=(new Date).getTime();this.width=(this.hideTime-Dt)/this.options.timeOut*100,"increasing"===this.options.progressAnimation&&(this.width=100-this.width),this.width<=0&&(this.width=0),this.width>=100&&(this.width=100)}resetTimeout(){clearTimeout(this.timeout),clearInterval(this.intervalId),this.state="active",this.options.timeOut=this.originalTimeout,this.timeout=setTimeout(()=>this.remove(),this.originalTimeout),this.hideTime=(new Date).getTime()+(this.originalTimeout||0),this.width=-1,this.options.progressBar&&(this.intervalId=setInterval(()=>this.updateProgress(),10))}remove(){"removed"!==this.state&&(clearTimeout(this.timeout),this.state="removed",this.timeout=setTimeout(()=>this.toastrService.remove(this.toastPackage.toastId)))}tapToast(){"removed"!==this.state&&(this.toastPackage.triggerTap(),this.options.tapToDismiss&&this.remove())}stickAround(){"removed"!==this.state&&(clearTimeout(this.timeout),this.options.timeOut=0,this.hideTime=0,clearInterval(this.intervalId),this.width=0)}delayedHideToast(){!0===this.options.disableTimeOut||"extendedTimeOut"===this.options.disableTimeOut||0===this.options.extendedTimeOut||"removed"===this.state||(this.timeout=setTimeout(()=>this.remove(),this.options.extendedTimeOut),this.options.timeOut=this.options.extendedTimeOut,this.hideTime=(new Date).getTime()+(this.options.timeOut||0),this.width=-1,this.options.progressBar&&(this.intervalId=setInterval(()=>this.updateProgress(),10)))}}return mt.\u0275fac=function(Dt){return new(Dt||mt)(r.Y36(He),r.Y36(oe),r.Y36(r.z2F))},mt.\u0275cmp=r.Xpm({type:mt,selectors:[["","toast-component",""]],hostVars:4,hostBindings:function(Dt,zt){1&Dt&&r.NdJ("click",function(){return zt.tapToast()})("mouseenter",function(){return zt.stickAround()})("mouseleave",function(){return zt.delayedHideToast()}),2&Dt&&(r.Tol(zt.toastClasses),r.Udp("display",zt.displayStyle))},attrs:_,decls:5,vars:5,consts:[["type","button","class","toast-close-button","aria-label","Close",3,"click",4,"ngIf"],[3,"class",4,"ngIf"],["role","alert","aria-live","polite",3,"class","innerHTML",4,"ngIf"],["role","alert","aria-live","polite",3,"class",4,"ngIf"],[4,"ngIf"],["type","button","aria-label","Close",1,"toast-close-button",3,"click"],["aria-hidden","true"],["role","alert","aria-live","polite",3,"innerHTML"],["role","alert","aria-live","polite"],[1,"toast-progress"]],template:function(Dt,zt){1&Dt&&(r.YNc(0,J,3,0,"button",0),r.YNc(1,ee,3,5,"div",1),r.YNc(2,ue,1,3,"div",2),r.YNc(3,ae,2,4,"div",3),r.YNc(4,$,2,2,"div",4)),2&Dt&&(r.Q6J("ngIf",zt.options.closeButton),r.xp6(1),r.Q6J("ngIf",zt.title),r.xp6(1),r.Q6J("ngIf",zt.message&&zt.options.enableHtml),r.xp6(1),r.Q6J("ngIf",zt.message&&!zt.options.enableHtml),r.xp6(1),r.Q6J("ngIf",zt.options.progressBar))},directives:[e.O5],encapsulation:2}),mt})();Object.assign(Object.assign({},he),{toastComponent:Gt})},18228:v=>{"use strict";var S=Object.getOwnPropertySymbols,i=Object.prototype.hasOwnProperty,r=Object.prototype.propertyIsEnumerable;function u(f){if(null==f)throw new TypeError("Object.assign cannot be called with null or undefined");return Object(f)}v.exports=function(){try{if(!Object.assign)return!1;var f=new String("abc");if(f[5]="de","5"===Object.getOwnPropertyNames(f)[0])return!1;for(var e={},_=0;_<10;_++)e["_"+String.fromCharCode(_)]=_;if("0123456789"!==Object.getOwnPropertyNames(e).map(function(M){return e[M]}).join(""))return!1;var T={};return"abcdefghijklmnopqrst".split("").forEach(function(M){T[M]=M}),"abcdefghijklmnopqrst"===Object.keys(Object.assign({},T)).join("")}catch(M){return!1}}()?Object.assign:function(f,e){for(var _,T,y=u(f),M=1;M<arguments.length;M++){for(var R in _=Object(arguments[M]))i.call(_,R)&&(y[R]=_[R]);if(S){T=S(_);for(var F=0;F<T.length;F++)r.call(_,T[F])&&(y[T[F]]=_[T[F]])}}return y}},81380:(v,S,i)=>{var r="function"==typeof Map&&Map.prototype,u=Object.getOwnPropertyDescriptor&&r?Object.getOwnPropertyDescriptor(Map.prototype,"size"):null,p=r&&u&&"function"==typeof u.get?u.get:null,f=r&&Map.prototype.forEach,e="function"==typeof Set&&Set.prototype,_=Object.getOwnPropertyDescriptor&&e?Object.getOwnPropertyDescriptor(Set.prototype,"size"):null,y=e&&_&&"function"==typeof _.get?_.get:null,T=e&&Set.prototype.forEach,R="function"==typeof WeakMap&&WeakMap.prototype?WeakMap.prototype.has:null,Z="function"==typeof WeakSet&&WeakSet.prototype?WeakSet.prototype.has:null,Q="function"==typeof WeakRef&&WeakRef.prototype?WeakRef.prototype.deref:null,ee=Boolean.prototype.valueOf,ue=Object.prototype.toString,ae=Function.prototype.toString,$=String.prototype.match,se=String.prototype.slice,ve=String.prototype.replace,oe=String.prototype.toUpperCase,he=String.prototype.toLowerCase,me=RegExp.prototype.test,Oe=Array.prototype.concat,ce=Array.prototype.join,dt=Array.prototype.slice,ze=Math.floor,Ye="function"==typeof BigInt?BigInt.prototype.valueOf:null,je=Object.getOwnPropertySymbols,Ie="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?Symbol.prototype.toString:null,Ve="function"==typeof Symbol&&"object"==typeof Symbol.iterator,He="function"==typeof Symbol&&Symbol.toStringTag&&(Symbol,1)?Symbol.toStringTag:null,Zt=Object.prototype.propertyIsEnumerable,st=("function"==typeof Reflect?Reflect.getPrototypeOf:Object.getPrototypeOf)||([].__proto__===Array.prototype?function(gn){return gn.__proto__}:null);function en(gn,En){if(gn===1/0||gn===-1/0||gn!=gn||gn&&gn>-1e3&&gn<1e3||me.call(/e/,En))return En;var mr=/[0-9](?=(?:[0-9]{3})+(?![0-9]))/g;if("number"==typeof gn){var Xt=gn<0?-ze(-gn):ze(gn);if(Xt!==gn){var zn=String(Xt),vr=se.call(En,zn.length+1);return ve.call(zn,mr,"$&_")+"."+ve.call(ve.call(vr,/([0-9]{3})/g,"$&_"),/_$/,"")}}return ve.call(En,mr,"$&_")}var $t=i(24654),Gt=$t.custom,Ut=wr(Gt)?Gt:null;function Bt(gn,En,mr){var Xt="double"===(mr.quoteStyle||En)?'"':"'";return Xt+gn+Xt}function mt(gn){return ve.call(String(gn),/"/g,"&quot;")}function Yt(gn){return!("[object Array]"!==Hn(gn)||He&&"object"==typeof gn&&He in gn)}function zt(gn){return!("[object RegExp]"!==Hn(gn)||He&&"object"==typeof gn&&He in gn)}function wr(gn){if(Ve)return gn&&"object"==typeof gn&&gn instanceof Symbol;if("symbol"==typeof gn)return!0;if(!gn||"object"!=typeof gn||!Ie)return!1;try{return Ie.call(gn),!0}catch(En){}return!1}v.exports=function gn(En,mr,Xt,zn){var vr=mr||{};if(In(vr,"quoteStyle")&&"single"!==vr.quoteStyle&&"double"!==vr.quoteStyle)throw new TypeError('option "quoteStyle" must be "single" or "double"');if(In(vr,"maxStringLength")&&("number"==typeof vr.maxStringLength?vr.maxStringLength<0&&vr.maxStringLength!==1/0:null!==vr.maxStringLength))throw new TypeError('option "maxStringLength", if provided, must be a positive integer, Infinity, or `null`');var si=!In(vr,"customInspect")||vr.customInspect;if("boolean"!=typeof si&&"symbol"!==si)throw new TypeError("option \"customInspect\", if provided, must be `true`, `false`, or `'symbol'`");if(In(vr,"indent")&&null!==vr.indent&&"\t"!==vr.indent&&!(parseInt(vr.indent,10)===vr.indent&&vr.indent>0))throw new TypeError('option "indent" must be "\\t", an integer > 0, or `null`');if(In(vr,"numericSeparator")&&"boolean"!=typeof vr.numericSeparator)throw new TypeError('option "numericSeparator", if provided, must be `true` or `false`');var Ii=vr.numericSeparator;if(void 0===En)return"undefined";if(null===En)return"null";if("boolean"==typeof En)return En?"true":"false";if("string"==typeof En)return Jn(En,vr);if("number"==typeof En){if(0===En)return 1/0/En>0?"0":"-0";var no=String(En);return Ii?en(En,no):no}if("bigint"==typeof En){var so=String(En)+"n";return Ii?en(En,so):so}var Ze=void 0===vr.depth?5:vr.depth;if(void 0===Xt&&(Xt=0),Xt>=Ze&&Ze>0&&"object"==typeof En)return Yt(En)?"[Array]":"[Object]";var Dr=function(gn,En){var mr;if("\t"===gn.indent)mr="\t";else{if(!("number"==typeof gn.indent&&gn.indent>0))return null;mr=ce.call(Array(gn.indent+1)," ")}return{base:mr,prev:ce.call(Array(En+1),mr)}}(vr,Xt);if(void 0===zn)zn=[];else if(Ur(zn,En)>=0)return"[Circular]";function jt(Zn,cr,yr){if(cr&&(zn=dt.call(zn)).push(cr),yr){var rr={depth:vr.depth};return In(vr,"quoteStyle")&&(rr.quoteStyle=vr.quoteStyle),gn(Zn,rr,Xt+1,zn)}return gn(Zn,vr,Xt+1,zn)}if("function"==typeof En&&!zt(En)){var xt=function(gn){if(gn.name)return gn.name;var En=$.call(ae.call(gn),/^function\s*([\w$]+)/);return En?En[1]:null}(En),mn=Nr(En,jt);return"[Function"+(xt?": "+xt:" (anonymous)")+"]"+(mn.length>0?" { "+ce.call(mn,", ")+" }":"")}if(wr(En)){var Wn=Ve?ve.call(String(En),/^(Symbol\(.*\))_[^)]*$/,"$1"):Ie.call(En);return"object"!=typeof En||Ve?Wn:Lr(Wn)}if(function(gn){return!(!gn||"object"!=typeof gn)&&("undefined"!=typeof HTMLElement&&gn instanceof HTMLElement||"string"==typeof gn.nodeName&&"function"==typeof gn.getAttribute)}(En)){for(var kn="<"+he.call(String(En.nodeName)),wn=En.attributes||[],nr=0;nr<wn.length;nr++)kn+=" "+wn[nr].name+"="+Bt(mt(wn[nr].value),"double",vr);return kn+=">",En.childNodes&&En.childNodes.length&&(kn+="..."),kn+"</"+he.call(String(En.nodeName))+">"}if(Yt(En)){if(0===En.length)return"[]";var Gi=Nr(En,jt);return Dr&&!function(gn){for(var En=0;En<gn.length;En++)if(Ur(gn[En],"\n")>=0)return!1;return!0}(Gi)?"["+Tr(Gi,Dr)+"]":"[ "+ce.call(Gi,", ")+" ]"}if(function(gn){return!("[object Error]"!==Hn(gn)||He&&"object"==typeof gn&&He in gn)}(En)){var po=Nr(En,jt);return"cause"in Error.prototype||!("cause"in En)||Zt.call(En,"cause")?0===po.length?"["+String(En)+"]":"{ ["+String(En)+"] "+ce.call(po,", ")+" }":"{ ["+String(En)+"] "+ce.call(Oe.call("[cause]: "+jt(En.cause),po),", ")+" }"}if("object"==typeof En&&si){if(Ut&&"function"==typeof En[Ut]&&$t)return $t(En,{depth:Ze-Xt});if("symbol"!==si&&"function"==typeof En.inspect)return En.inspect()}if(function(gn){if(!p||!gn||"object"!=typeof gn)return!1;try{p.call(gn);try{y.call(gn)}catch(En){return!0}return gn instanceof Map}catch(En){}return!1}(En)){var yo=[];return f.call(En,function(Zn,cr){yo.push(jt(cr,En,!0)+" => "+jt(Zn,En))}),zr("Map",p.call(En),yo,Dr)}if(function(gn){if(!y||!gn||"object"!=typeof gn)return!1;try{y.call(gn);try{p.call(gn)}catch(En){return!0}return gn instanceof Set}catch(En){}return!1}(En)){var Mo=[];return T.call(En,function(Zn){Mo.push(jt(Zn,En))}),zr("Set",y.call(En),Mo,Dr)}if(function(gn){if(!R||!gn||"object"!=typeof gn)return!1;try{R.call(gn,R);try{Z.call(gn,Z)}catch(En){return!0}return gn instanceof WeakMap}catch(En){}return!1}(En))return Vn("WeakMap");if(function(gn){if(!Z||!gn||"object"!=typeof gn)return!1;try{Z.call(gn,Z);try{R.call(gn,R)}catch(En){return!0}return gn instanceof WeakSet}catch(En){}return!1}(En))return Vn("WeakSet");if(function(gn){if(!Q||!gn||"object"!=typeof gn)return!1;try{return Q.call(gn),!0}catch(En){}return!1}(En))return Vn("WeakRef");if(function(gn){return!("[object Number]"!==Hn(gn)||He&&"object"==typeof gn&&He in gn)}(En))return Lr(jt(Number(En)));if(function(gn){if(!gn||"object"!=typeof gn||!Ye)return!1;try{return Ye.call(gn),!0}catch(En){}return!1}(En))return Lr(jt(Ye.call(En)));if(function(gn){return!("[object Boolean]"!==Hn(gn)||He&&"object"==typeof gn&&He in gn)}(En))return Lr(ee.call(En));if(function(gn){return!("[object String]"!==Hn(gn)||He&&"object"==typeof gn&&He in gn)}(En))return Lr(jt(String(En)));if(!function(gn){return!("[object Date]"!==Hn(gn)||He&&"object"==typeof gn&&He in gn)}(En)&&!zt(En)){var Vi=Nr(En,jt),cs=st?st(En)===Object.prototype:En instanceof Object||En.constructor===Object,zo=En instanceof Object?"":"null prototype",So=!cs&&He&&Object(En)===En&&He in En?se.call(Hn(En),8,-1):zo?"Object":"",ai=(cs||"function"!=typeof En.constructor?"":En.constructor.name?En.constructor.name+" ":"")+(So||zo?"["+ce.call(Oe.call([],So||[],zo||[]),": ")+"] ":"");return 0===Vi.length?ai+"{}":Dr?ai+"{"+Tr(Vi,Dr)+"}":ai+"{ "+ce.call(Vi,", ")+" }"}return String(En)};var Kr=Object.prototype.hasOwnProperty||function(gn){return gn in this};function In(gn,En){return Kr.call(gn,En)}function Hn(gn){return ue.call(gn)}function Ur(gn,En){if(gn.indexOf)return gn.indexOf(En);for(var mr=0,Xt=gn.length;mr<Xt;mr++)if(gn[mr]===En)return mr;return-1}function Jn(gn,En){if(gn.length>En.maxStringLength){var mr=gn.length-En.maxStringLength,Xt="... "+mr+" more character"+(mr>1?"s":"");return Jn(se.call(gn,0,En.maxStringLength),En)+Xt}return Bt(ve.call(ve.call(gn,/(['\\])/g,"\\$1"),/[\x00-\x1f]/g,ir),"single",En)}function ir(gn){var En=gn.charCodeAt(0),mr={8:"b",9:"t",10:"n",12:"f",13:"r"}[En];return mr?"\\"+mr:"\\x"+(En<16?"0":"")+oe.call(En.toString(16))}function Lr(gn){return"Object("+gn+")"}function Vn(gn){return gn+" { ? }"}function zr(gn,En,mr,Xt){return gn+" ("+En+") {"+(Xt?Tr(mr,Xt):ce.call(mr,", "))+"}"}function Tr(gn,En){if(0===gn.length)return"";var mr="\n"+En.prev+En.base;return mr+ce.call(gn,","+mr)+"\n"+En.prev}function Nr(gn,En){var mr=Yt(gn),Xt=[];if(mr){Xt.length=gn.length;for(var zn=0;zn<gn.length;zn++)Xt[zn]=In(gn,zn)?En(gn[zn],gn):""}var si,vr="function"==typeof je?je(gn):[];if(Ve){si={};for(var Ii=0;Ii<vr.length;Ii++)si["$"+vr[Ii]]=vr[Ii]}for(var no in gn)!In(gn,no)||mr&&String(Number(no))===no&&no<gn.length||Ve&&si["$"+no]instanceof Symbol||(me.call(/[^\w$]/,no)?Xt.push(En(no,gn)+": "+En(gn[no],gn)):Xt.push(no+": "+En(gn[no],gn)));if("function"==typeof je)for(var so=0;so<vr.length;so++)Zt.call(gn,vr[so])&&Xt.push("["+En(vr[so])+"]: "+En(gn[vr[so]],gn));return Xt}},25119:(v,S,i)=>{"use strict";var r=i(88411);function u(){}function p(){}p.resetWarningCache=u,v.exports=function(){function f(y,T,M,R,F,Z){if(Z!==r){var J=new Error("Calling PropTypes validators directly is not supported by the `prop-types` package. Use PropTypes.checkPropTypes() to call them. Read more at http://fb.me/use-check-prop-types");throw J.name="Invariant Violation",J}}function e(){return f}f.isRequired=f;var _={array:f,bigint:f,bool:f,func:f,number:f,object:f,string:f,symbol:f,any:f,arrayOf:e,element:f,elementType:f,instanceOf:e,node:f,objectOf:e,oneOf:e,oneOfType:e,shape:e,exact:e,checkPropTypes:p,resetWarningCache:u};return _.PropTypes=_,_}},76874:(v,S,i)=>{v.exports=i(25119)()},88411:v=>{"use strict";v.exports="SECRET_DO_NOT_PASS_THIS_OR_YOU_WILL_BE_FIRED"},87504:function(v,S,i){var r;v=i.nmd(v),function(u){"object"==typeof global&&global;var _,y=2147483647,T=36,ue=/^xn--/,ae=/[^\x20-\x7E]/,$=/[\x2E\u3002\uFF0E\uFF61]/g,se={overflow:"Overflow: input needs wider integers to process","not-basic":"Illegal input >= 0x80 (not a basic code point)","invalid-input":"Invalid input"},oe=Math.floor,he=String.fromCharCode;function Oe($t){throw RangeError(se[$t])}function ce($t,Gt){for(var Ut=$t.length,Bt=[];Ut--;)Bt[Ut]=Gt($t[Ut]);return Bt}function dt($t,Gt){var Ut=$t.split("@"),Bt="";return Ut.length>1&&(Bt=Ut[0]+"@",$t=Ut[1]),Bt+ce(($t=$t.replace($,".")).split("."),Gt).join(".")}function ze($t){for(var mt,Yt,Gt=[],Ut=0,Bt=$t.length;Ut<Bt;)(mt=$t.charCodeAt(Ut++))>=55296&&mt<=56319&&Ut<Bt?56320==(64512&(Yt=$t.charCodeAt(Ut++)))?Gt.push(((1023&mt)<<10)+(1023&Yt)+65536):(Gt.push(mt),Ut--):Gt.push(mt);return Gt}function Ye($t){return ce($t,function(Gt){var Ut="";return Gt>65535&&(Ut+=he((Gt-=65536)>>>10&1023|55296),Gt=56320|1023&Gt),Ut+he(Gt)}).join("")}function je($t){return $t-48<10?$t-22:$t-65<26?$t-65:$t-97<26?$t-97:T}function Ie($t,Gt){return $t+22+75*($t<26)-((0!=Gt)<<5)}function Ve($t,Gt,Ut){var Bt=0;for($t=Ut?oe($t/700):$t>>1,$t+=oe($t/Gt);$t>455;Bt+=T)$t=oe($t/35);return oe(Bt+36*$t/($t+38))}function He($t){var Bt,zt,Yn,Hr,ci,Ir,wr,Qr,Kr,In,Gt=[],Ut=$t.length,mt=0,Yt=128,Dt=72;for((zt=$t.lastIndexOf("-"))<0&&(zt=0),Yn=0;Yn<zt;++Yn)$t.charCodeAt(Yn)>=128&&Oe("not-basic"),Gt.push($t.charCodeAt(Yn));for(Hr=zt>0?zt+1:0;Hr<Ut;){for(ci=mt,Ir=1,wr=T;Hr>=Ut&&Oe("invalid-input"),((Qr=je($t.charCodeAt(Hr++)))>=T||Qr>oe((y-mt)/Ir))&&Oe("overflow"),mt+=Qr*Ir,!(Qr<(Kr=wr<=Dt?1:wr>=Dt+26?26:wr-Dt));wr+=T)Ir>oe(y/(In=T-Kr))&&Oe("overflow"),Ir*=In;Dt=Ve(mt-ci,Bt=Gt.length+1,0==ci),oe(mt/Bt)>y-Yt&&Oe("overflow"),Yt+=oe(mt/Bt),mt%=Bt,Gt.splice(mt++,0,Yt)}return Ye(Gt)}function Zt($t){var Gt,Ut,Bt,mt,Yt,Dt,zt,Yn,Hr,ci,Ir,Qr,Kr,In,Hn,wr=[];for(Qr=($t=ze($t)).length,Gt=128,Ut=0,Yt=72,Dt=0;Dt<Qr;++Dt)(Ir=$t[Dt])<128&&wr.push(he(Ir));for(Bt=mt=wr.length,mt&&wr.push("-");Bt<Qr;){for(zt=y,Dt=0;Dt<Qr;++Dt)(Ir=$t[Dt])>=Gt&&Ir<zt&&(zt=Ir);for(zt-Gt>oe((y-Ut)/(Kr=Bt+1))&&Oe("overflow"),Ut+=(zt-Gt)*Kr,Gt=zt,Dt=0;Dt<Qr;++Dt)if((Ir=$t[Dt])<Gt&&++Ut>y&&Oe("overflow"),Ir==Gt){for(Yn=Ut,Hr=T;!(Yn<(ci=Hr<=Yt?1:Hr>=Yt+26?26:Hr-Yt));Hr+=T)wr.push(he(Ie(ci+(Hn=Yn-ci)%(In=T-ci),0))),Yn=oe(Hn/In);wr.push(he(Ie(Yn,0))),Yt=Ve(Ut,Kr,Bt==mt),Ut=0,++Bt}++Ut,++Gt}return wr.join("")}_={version:"1.3.2",ucs2:{decode:ze,encode:Ye},decode:He,encode:Zt,toASCII:function($t){return dt($t,function(Gt){return ae.test(Gt)?"xn--"+Zt(Gt):Gt})},toUnicode:function($t){return dt($t,function(Gt){return ue.test(Gt)?He(Gt.slice(4).toLowerCase()):Gt})}},void 0!==(r=function(){return _}.call(S,i,S,v))&&(v.exports=r)}()},8157:v=>{"use strict";var S=String.prototype.replace,i=/%20/g;v.exports={default:"RFC3986",formatters:{RFC1738:function(u){return S.call(u,i,"+")},RFC3986:function(u){return String(u)}},RFC1738:"RFC1738",RFC3986:"RFC3986"}},59009:(v,S,i)=>{"use strict";var r=i(75672),u=i(19913),p=i(8157);v.exports={formats:p,parse:u,stringify:r}},19913:(v,S,i)=>{"use strict";var r=i(16835),u=Object.prototype.hasOwnProperty,p=Array.isArray,f={allowDots:!1,allowPrototypes:!1,allowSparse:!1,arrayLimit:20,charset:"utf-8",charsetSentinel:!1,comma:!1,decoder:r.decode,delimiter:"&",depth:5,ignoreQueryPrefix:!1,interpretNumericEntities:!1,parameterLimit:1e3,parseArrays:!0,plainObjects:!1,strictNullHandling:!1},_=function(J,Q){return J&&"string"==typeof J&&Q.comma&&J.indexOf(",")>-1?J.split(","):J},F=function(Q,ee,ue,ae){if(Q){var $=ue.allowDots?Q.replace(/\.([^.[]+)/g,"[$1]"):Q,ve=/(\[[^[\]]*])/g,oe=ue.depth>0&&/(\[[^[\]]*])/.exec($),he=oe?$.slice(0,oe.index):$,me=[];if(he){if(!ue.plainObjects&&u.call(Object.prototype,he)&&!ue.allowPrototypes)return;me.push(he)}for(var Oe=0;ue.depth>0&&null!==(oe=ve.exec($))&&Oe<ue.depth;){if(Oe+=1,!ue.plainObjects&&u.call(Object.prototype,oe[1].slice(1,-1))&&!ue.allowPrototypes)return;me.push(oe[1])}return oe&&me.push("["+$.slice(oe.index)+"]"),function(J,Q,ee,ue){for(var ae=ue?Q:_(Q,ee),$=J.length-1;$>=0;--$){var se,ve=J[$];if("[]"===ve&&ee.parseArrays)se=[].concat(ae);else{se=ee.plainObjects?Object.create(null):{};var oe="["===ve.charAt(0)&&"]"===ve.charAt(ve.length-1)?ve.slice(1,-1):ve,he=parseInt(oe,10);ee.parseArrays||""!==oe?!isNaN(he)&&ve!==oe&&String(he)===oe&&he>=0&&ee.parseArrays&&he<=ee.arrayLimit?(se=[])[he]=ae:"__proto__"!==oe&&(se[oe]=ae):se={0:ae}}ae=se}return ae}(me,ee,ue,ae)}};v.exports=function(J,Q){var ee=function(Q){if(!Q)return f;if(null!=Q.decoder&&"function"!=typeof Q.decoder)throw new TypeError("Decoder has to be a function.");if(void 0!==Q.charset&&"utf-8"!==Q.charset&&"iso-8859-1"!==Q.charset)throw new TypeError("The charset option must be either utf-8, iso-8859-1, or undefined");return{allowDots:void 0===Q.allowDots?f.allowDots:!!Q.allowDots,allowPrototypes:"boolean"==typeof Q.allowPrototypes?Q.allowPrototypes:f.allowPrototypes,allowSparse:"boolean"==typeof Q.allowSparse?Q.allowSparse:f.allowSparse,arrayLimit:"number"==typeof Q.arrayLimit?Q.arrayLimit:f.arrayLimit,charset:void 0===Q.charset?f.charset:Q.charset,charsetSentinel:"boolean"==typeof Q.charsetSentinel?Q.charsetSentinel:f.charsetSentinel,comma:"boolean"==typeof Q.comma?Q.comma:f.comma,decoder:"function"==typeof Q.decoder?Q.decoder:f.decoder,delimiter:"string"==typeof Q.delimiter||r.isRegExp(Q.delimiter)?Q.delimiter:f.delimiter,depth:"number"==typeof Q.depth||!1===Q.depth?+Q.depth:f.depth,ignoreQueryPrefix:!0===Q.ignoreQueryPrefix,interpretNumericEntities:"boolean"==typeof Q.interpretNumericEntities?Q.interpretNumericEntities:f.interpretNumericEntities,parameterLimit:"number"==typeof Q.parameterLimit?Q.parameterLimit:f.parameterLimit,parseArrays:!1!==Q.parseArrays,plainObjects:"boolean"==typeof Q.plainObjects?Q.plainObjects:f.plainObjects,strictNullHandling:"boolean"==typeof Q.strictNullHandling?Q.strictNullHandling:f.strictNullHandling}}(Q);if(""===J||null==J)return ee.plainObjects?Object.create(null):{};for(var ue="string"==typeof J?function(Q,ee){var oe,ue={},se=(ee.ignoreQueryPrefix?Q.replace(/^\?/,""):Q).split(ee.delimiter,ee.parameterLimit===1/0?void 0:ee.parameterLimit),ve=-1,he=ee.charset;if(ee.charsetSentinel)for(oe=0;oe<se.length;++oe)0===se[oe].indexOf("utf8=")&&("utf8=%E2%9C%93"===se[oe]?he="utf-8":"utf8=%26%2310003%3B"===se[oe]&&(he="iso-8859-1"),ve=oe,oe=se.length);for(oe=0;oe<se.length;++oe)if(oe!==ve){var dt,ze,me=se[oe],Oe=me.indexOf("]="),ce=-1===Oe?me.indexOf("="):Oe+1;-1===ce?(dt=ee.decoder(me,f.decoder,he,"key"),ze=ee.strictNullHandling?null:""):(dt=ee.decoder(me.slice(0,ce),f.decoder,he,"key"),ze=r.maybeMap(_(me.slice(ce+1),ee),function(Ye){return ee.decoder(Ye,f.decoder,he,"value")})),ze&&ee.interpretNumericEntities&&"iso-8859-1"===he&&(ze=ze.replace(/&#(\d+);/g,function(Q,ee){return String.fromCharCode(parseInt(ee,10))})),me.indexOf("[]=")>-1&&(ze=p(ze)?[ze]:ze),ue[dt]=u.call(ue,dt)?r.combine(ue[dt],ze):ze}return ue}(J,ee):J,ae=ee.plainObjects?Object.create(null):{},$=Object.keys(ue),se=0;se<$.length;++se){var ve=$[se],oe=F(ve,ue[ve],ee,"string"==typeof J);ae=r.merge(ae,oe,ee)}return!0===ee.allowSparse?ae:r.compact(ae)}},75672:(v,S,i)=>{"use strict";var r=i(11144),u=i(16835),p=i(8157),f=Object.prototype.hasOwnProperty,e={brackets:function($){return $+"[]"},comma:"comma",indices:function($,se){return $+"["+se+"]"},repeat:function($){return $}},_=Array.isArray,y=String.prototype.split,T=Array.prototype.push,M=function(ae,$){T.apply(ae,_($)?$:[$])},R=Date.prototype.toISOString,F=p.default,Z={addQueryPrefix:!1,allowDots:!1,charset:"utf-8",charsetSentinel:!1,delimiter:"&",encode:!0,encoder:u.encode,encodeValuesOnly:!1,format:F,formatter:p.formatters[F],indices:!1,serializeDate:function($){return R.call($)},skipNulls:!1,strictNullHandling:!1},Q={},ee=function ae($,se,ve,oe,he,me,Oe,ce,dt,ze,Ye,je,Ie,Ve,He,Zt){for(var st=$,en=Zt,$t=0,Gt=!1;void 0!==(en=en.get(Q))&&!Gt;){var Ut=en.get($);if($t+=1,void 0!==Ut){if(Ut===$t)throw new RangeError("Cyclic object value");Gt=!0}void 0===en.get(Q)&&($t=0)}if("function"==typeof ce?st=ce(se,st):st instanceof Date?st=Ye(st):"comma"===ve&&_(st)&&(st=u.maybeMap(st,function(Hn){return Hn instanceof Date?Ye(Hn):Hn})),null===st){if(he)return Oe&&!Ve?Oe(se,Z.encoder,He,"key",je):se;st=""}if(function($){return"string"==typeof $||"number"==typeof $||"boolean"==typeof $||"symbol"==typeof $||"bigint"==typeof $}(st)||u.isBuffer(st)){if(Oe){var Bt=Ve?se:Oe(se,Z.encoder,He,"key",je);if("comma"===ve&&Ve){for(var mt=y.call(String(st),","),Yt="",Dt=0;Dt<mt.length;++Dt)Yt+=(0===Dt?"":",")+Ie(Oe(mt[Dt],Z.encoder,He,"value",je));return[Ie(Bt)+(oe&&_(st)&&1===mt.length?"[]":"")+"="+Yt]}return[Ie(Bt)+"="+Ie(Oe(st,Z.encoder,He,"value",je))]}return[Ie(se)+"="+Ie(String(st))]}var Yn,zt=[];if(void 0===st)return zt;if("comma"===ve&&_(st))Yn=[{value:st.length>0?st.join(",")||null:void 0}];else if(_(ce))Yn=ce;else{var Hr=Object.keys(st);Yn=dt?Hr.sort(dt):Hr}for(var ci=oe&&_(st)&&1===st.length?se+"[]":se,Ir=0;Ir<Yn.length;++Ir){var wr=Yn[Ir],Qr="object"==typeof wr&&void 0!==wr.value?wr.value:st[wr];if(!me||null!==Qr){var Kr=_(st)?"function"==typeof ve?ve(ci,wr):ci:ci+(ze?"."+wr:"["+wr+"]");Zt.set($,$t);var In=r();In.set(Q,Zt),M(zt,ae(Qr,Kr,ve,oe,he,me,Oe,ce,dt,ze,Ye,je,Ie,Ve,He,In))}}return zt};v.exports=function(ae,$){var oe,se=ae,ve=function($){if(!$)return Z;if(null!=$.encoder&&"function"!=typeof $.encoder)throw new TypeError("Encoder has to be a function.");var se=$.charset||Z.charset;if(void 0!==$.charset&&"utf-8"!==$.charset&&"iso-8859-1"!==$.charset)throw new TypeError("The charset option must be either utf-8, iso-8859-1, or undefined");var ve=p.default;if(void 0!==$.format){if(!f.call(p.formatters,$.format))throw new TypeError("Unknown format option provided.");ve=$.format}var oe=p.formatters[ve],he=Z.filter;return("function"==typeof $.filter||_($.filter))&&(he=$.filter),{addQueryPrefix:"boolean"==typeof $.addQueryPrefix?$.addQueryPrefix:Z.addQueryPrefix,allowDots:void 0===$.allowDots?Z.allowDots:!!$.allowDots,charset:se,charsetSentinel:"boolean"==typeof $.charsetSentinel?$.charsetSentinel:Z.charsetSentinel,delimiter:void 0===$.delimiter?Z.delimiter:$.delimiter,encode:"boolean"==typeof $.encode?$.encode:Z.encode,encoder:"function"==typeof $.encoder?$.encoder:Z.encoder,encodeValuesOnly:"boolean"==typeof $.encodeValuesOnly?$.encodeValuesOnly:Z.encodeValuesOnly,filter:he,format:ve,formatter:oe,serializeDate:"function"==typeof $.serializeDate?$.serializeDate:Z.serializeDate,skipNulls:"boolean"==typeof $.skipNulls?$.skipNulls:Z.skipNulls,sort:"function"==typeof $.sort?$.sort:null,strictNullHandling:"boolean"==typeof $.strictNullHandling?$.strictNullHandling:Z.strictNullHandling}}($);"function"==typeof ve.filter?se=(0,ve.filter)("",se):_(ve.filter)&&(oe=ve.filter);var me=[];if("object"!=typeof se||null===se)return"";var ce=e[$&&$.arrayFormat in e?$.arrayFormat:$&&"indices"in $?$.indices?"indices":"repeat":"indices"];if($&&"commaRoundTrip"in $&&"boolean"!=typeof $.commaRoundTrip)throw new TypeError("`commaRoundTrip` must be a boolean, or absent");var dt="comma"===ce&&$&&$.commaRoundTrip;oe||(oe=Object.keys(se)),ve.sort&&oe.sort(ve.sort);for(var ze=r(),Ye=0;Ye<oe.length;++Ye){var je=oe[Ye];ve.skipNulls&&null===se[je]||M(me,ee(se[je],je,ce,dt,ve.strictNullHandling,ve.skipNulls,ve.encode?ve.encoder:null,ve.filter,ve.sort,ve.allowDots,ve.serializeDate,ve.format,ve.formatter,ve.encodeValuesOnly,ve.charset,ze))}var Ie=me.join(ve.delimiter),Ve=!0===ve.addQueryPrefix?"?":"";return ve.charsetSentinel&&(Ve+="iso-8859-1"===ve.charset?"utf8=%26%2310003%3B&":"utf8=%E2%9C%93&"),Ie.length>0?Ve+Ie:""}},16835:(v,S,i)=>{"use strict";var r=i(8157),u=Object.prototype.hasOwnProperty,p=Array.isArray,f=function(){for(var ue=[],ae=0;ae<256;++ae)ue.push("%"+((ae<16?"0":"")+ae.toString(16)).toUpperCase());return ue}(),_=function(ae,$){for(var se=$&&$.plainObjects?Object.create(null):{},ve=0;ve<ae.length;++ve)void 0!==ae[ve]&&(se[ve]=ae[ve]);return se};v.exports={arrayToObject:_,assign:function(ae,$){return Object.keys($).reduce(function(se,ve){return se[ve]=$[ve],se},ae)},combine:function(ae,$){return[].concat(ae,$)},compact:function(ae){for(var $=[{obj:{o:ae},prop:"o"}],se=[],ve=0;ve<$.length;++ve)for(var oe=$[ve],he=oe.obj[oe.prop],me=Object.keys(he),Oe=0;Oe<me.length;++Oe){var ce=me[Oe],dt=he[ce];"object"==typeof dt&&null!==dt&&-1===se.indexOf(dt)&&($.push({obj:he,prop:ce}),se.push(dt))}return function(ae){for(;ae.length>1;){var $=ae.pop(),se=$.obj[$.prop];if(p(se)){for(var ve=[],oe=0;oe<se.length;++oe)void 0!==se[oe]&&ve.push(se[oe]);$.obj[$.prop]=ve}}}($),ae},decode:function(ue,ae,$){var se=ue.replace(/\+/g," ");if("iso-8859-1"===$)return se.replace(/%[0-9a-f]{2}/gi,unescape);try{return decodeURIComponent(se)}catch(ve){return se}},encode:function(ae,$,se,ve,oe){if(0===ae.length)return ae;var he=ae;if("symbol"==typeof ae?he=Symbol.prototype.toString.call(ae):"string"!=typeof ae&&(he=String(ae)),"iso-8859-1"===se)return escape(he).replace(/%u[0-9a-f]{4}/gi,function(dt){return"%26%23"+parseInt(dt.slice(2),16)+"%3B"});for(var me="",Oe=0;Oe<he.length;++Oe){var ce=he.charCodeAt(Oe);45===ce||46===ce||95===ce||126===ce||ce>=48&&ce<=57||ce>=65&&ce<=90||ce>=97&&ce<=122||oe===r.RFC1738&&(40===ce||41===ce)?me+=he.charAt(Oe):ce<128?me+=f[ce]:ce<2048?me+=f[192|ce>>6]+f[128|63&ce]:ce<55296||ce>=57344?me+=f[224|ce>>12]+f[128|ce>>6&63]+f[128|63&ce]:(ce=65536+((1023&ce)<<10|1023&he.charCodeAt(Oe+=1)),me+=f[240|ce>>18]+f[128|ce>>12&63]+f[128|ce>>6&63]+f[128|63&ce])}return me},isBuffer:function(ae){return!(!ae||"object"!=typeof ae||!(ae.constructor&&ae.constructor.isBuffer&&ae.constructor.isBuffer(ae)))},isRegExp:function(ae){return"[object RegExp]"===Object.prototype.toString.call(ae)},maybeMap:function(ae,$){if(p(ae)){for(var se=[],ve=0;ve<ae.length;ve+=1)se.push($(ae[ve]));return se}return $(ae)},merge:function ue(ae,$,se){if(!$)return ae;if("object"!=typeof $){if(p(ae))ae.push($);else{if(!ae||"object"!=typeof ae)return[ae,$];(se&&(se.plainObjects||se.allowPrototypes)||!u.call(Object.prototype,$))&&(ae[$]=!0)}return ae}if(!ae||"object"!=typeof ae)return[ae].concat($);var ve=ae;return p(ae)&&!p($)&&(ve=_(ae,se)),p(ae)&&p($)?($.forEach(function(oe,he){if(u.call(ae,he)){var me=ae[he];me&&"object"==typeof me&&oe&&"object"==typeof oe?ae[he]=ue(me,oe,se):ae.push(oe)}else ae[he]=oe}),ae):Object.keys($).reduce(function(oe,he){var me=$[he];return oe[he]=u.call(oe,he)?ue(oe[he],me,se):me,oe},ve)}}},98216:v=>{"use strict";function S(i,r){return Object.prototype.hasOwnProperty.call(i,r)}v.exports=function(i,r,u,p){u=u||"=";var f={};if("string"!=typeof i||0===i.length)return f;var e=/\+/g;i=i.split(r=r||"&");var _=1e3;p&&"number"==typeof p.maxKeys&&(_=p.maxKeys);var y=i.length;_>0&&y>_&&(y=_);for(var T=0;T<y;++T){var F,Z,J,Q,M=i[T].replace(e,"%20"),R=M.indexOf(u);R>=0?(F=M.substr(0,R),Z=M.substr(R+1)):(F=M,Z=""),J=decodeURIComponent(F),Q=decodeURIComponent(Z),S(f,J)?Array.isArray(f[J])?f[J].push(Q):f[J]=[f[J],Q]:f[J]=Q}return f}},36173:v=>{"use strict";var S=function(i){switch(typeof i){case"string":return i;case"boolean":return i?"true":"false";case"number":return isFinite(i)?i:"";default:return""}};v.exports=function(i,r,u,p){return r=r||"&",u=u||"=",null===i&&(i=void 0),"object"==typeof i?Object.keys(i).map(function(f){var e=encodeURIComponent(S(f))+u;return Array.isArray(i[f])?i[f].map(function(_){return e+encodeURIComponent(S(_))}).join(r):e+encodeURIComponent(S(i[f]))}).join(r):p?encodeURIComponent(S(p))+u+encodeURIComponent(S(i)):""}},36284:(v,S,i)=>{"use strict";S.decode=S.parse=i(98216),S.encode=S.stringify=i(36173)},76959:(v,S)=>{"use strict";var i=Object.prototype.hasOwnProperty;function u(_){try{return decodeURIComponent(_.replace(/\+/g," "))}catch(y){return null}}function p(_){try{return encodeURIComponent(_)}catch(y){return null}}S.stringify=function(_,y){y=y||"";var M,R,T=[];for(R in"string"!=typeof y&&(y="?"),_)if(i.call(_,R)){if(!(M=_[R])&&(null==M||isNaN(M))&&(M=""),R=p(R),M=p(M),null===R||null===M)continue;T.push(R+"="+M)}return T.length?y+T.join("&"):""},S.parse=function(_){for(var M,y=/([^=?#&]+)=?([^&]*)/g,T={};M=y.exec(_);){var R=u(M[1]),F=u(M[2]);null===R||null===F||R in T||(T[R]=F)}return T}},17346:(v,S,i)=>{const r=i(66952),u=i(32582),p=r.types;v.exports=class vS{constructor(e,_){if(this._setDefaults(e),e instanceof RegExp)this.ignoreCase=e.ignoreCase,this.multiline=e.multiline,e=e.source;else{if("string"!=typeof e)throw new Error("Expected a regexp or string");this.ignoreCase=_&&-1!==_.indexOf("i"),this.multiline=_&&-1!==_.indexOf("m")}this.tokens=r(e)}_setDefaults(e){this.max=null!=e.max?e.max:null!=vS.prototype.max?vS.prototype.max:100,this.defaultRange=e.defaultRange?e.defaultRange:this.defaultRange.clone(),e.randInt&&(this.randInt=e.randInt)}gen(){return this._gen(this.tokens,[])}_gen(e,_){var y,T,M,R,F;switch(e.type){case p.ROOT:case p.GROUP:if(e.followedBy||e.notFollowedBy)return"";for(e.remember&&void 0===e.groupNumber&&(e.groupNumber=_.push(null)-1),T="",R=0,F=(y=e.options?this._randSelect(e.options):e.stack).length;R<F;R++)T+=this._gen(y[R],_);return e.remember&&(_[e.groupNumber]=T),T;case p.POSITION:return"";case p.SET:var Z=this._expand(e);return Z.length?String.fromCharCode(this._randSelect(Z)):"";case p.REPETITION:for(M=this.randInt(e.min,e.max===1/0?e.min+this.max:e.max),T="",R=0;R<M;R++)T+=this._gen(e.value,_);return T;case p.REFERENCE:return _[e.value-1]||"";case p.CHAR:var J=this.ignoreCase&&this._randBool()?this._toOtherCase(e.value):e.value;return String.fromCharCode(J)}}_toOtherCase(e){return e+(97<=e&&e<=122?-32:65<=e&&e<=90?32:0)}_randBool(){return!this.randInt(0,1)}_randSelect(e){return e instanceof u?e.index(this.randInt(0,e.length-1)):e[this.randInt(0,e.length-1)]}_expand(e){if(e.type===r.types.CHAR)return new u(e.value);if(e.type===r.types.RANGE)return new u(e.from,e.to);{let _=new u;for(let y=0;y<e.set.length;y++){let T=this._expand(e.set[y]);if(_.add(T),this.ignoreCase)for(let M=0;M<T.length;M++){let R=T.index(M),F=this._toOtherCase(R);R!==F&&_.add(F)}}return e.not?this.defaultRange.clone().subtract(_):this.defaultRange.clone().intersect(_)}}randInt(e,_){return e+Math.floor(Math.random()*(1+_-e))}get defaultRange(){return this._range=this._range||new u(32,126)}set defaultRange(e){this._range=e}static randexp(e,_){var y;return"string"==typeof e&&(e=new RegExp(e,_)),void 0===e._randexp?(y=new vS(e,_),e._randexp=y):(y=e._randexp)._setDefaults(e),y.gen()}static sugar(){RegExp.prototype.gen=function(){return vS.randexp(this)}}}},57021:(v,S,i)=>{"use strict";Object.defineProperty(S,"__esModule",{value:!0}),S.CopyToClipboard=void 0;var r=p(i(78139)),u=p(i(96967));function p(se){return se&&se.__esModule?se:{default:se}}function f(se){return(f="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(oe){return typeof oe}:function(oe){return oe&&"function"==typeof Symbol&&oe.constructor===Symbol&&oe!==Symbol.prototype?"symbol":typeof oe})(se)}function e(se,ve){var oe=Object.keys(se);if(Object.getOwnPropertySymbols){var he=Object.getOwnPropertySymbols(se);ve&&(he=he.filter(function(me){return Object.getOwnPropertyDescriptor(se,me).enumerable})),oe.push.apply(oe,he)}return oe}function M(se,ve){if(!(se instanceof ve))throw new TypeError("Cannot call a class as a function")}function R(se,ve){for(var oe=0;oe<ve.length;oe++){var he=ve[oe];he.enumerable=he.enumerable||!1,he.configurable=!0,"value"in he&&(he.writable=!0),Object.defineProperty(se,he.key,he)}}function Z(se,ve){return!ve||"object"!==f(ve)&&"function"!=typeof ve?Q(se):ve}function J(se){return(J=Object.setPrototypeOf?Object.getPrototypeOf:function(oe){return oe.__proto__||Object.getPrototypeOf(oe)})(se)}function Q(se){if(void 0===se)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return se}function ue(se,ve){return(ue=Object.setPrototypeOf||function(he,me){return he.__proto__=me,he})(se,ve)}function ae(se,ve,oe){return ve in se?Object.defineProperty(se,ve,{value:oe,enumerable:!0,configurable:!0,writable:!0}):se[ve]=oe,se}var $=function(se){function ve(){var oe,he;M(this,ve);for(var me=arguments.length,Oe=new Array(me),ce=0;ce<me;ce++)Oe[ce]=arguments[ce];return ae(Q(he=Z(this,(oe=J(ve)).call.apply(oe,[this].concat(Oe)))),"onClick",function(dt){var ze=he.props,Ye=ze.text,je=ze.onCopy,Ve=ze.options,He=r.default.Children.only(ze.children),Zt=(0,u.default)(Ye,Ve);je&&je(Ye,Zt),He&&He.props&&"function"==typeof He.props.onClick&&He.props.onClick(dt)}),he}return function(se,ve){if("function"!=typeof ve&&null!==ve)throw new TypeError("Super expression must either be null or a function");se.prototype=Object.create(ve&&ve.prototype,{constructor:{value:se,writable:!0,configurable:!0}}),ve&&ue(se,ve)}(ve,se),function(se,ve,oe){ve&&R(se.prototype,ve)}(ve,[{key:"render",value:function(){var he=this.props,dt=he.children,ze=function(se,ve){if(null==se)return{};var he,me,oe=function(se,ve){if(null==se)return{};var me,Oe,oe={},he=Object.keys(se);for(Oe=0;Oe<he.length;Oe++)!(ve.indexOf(me=he[Oe])>=0)&&(oe[me]=se[me]);return oe}(se,ve);if(Object.getOwnPropertySymbols){var Oe=Object.getOwnPropertySymbols(se);for(me=0;me<Oe.length;me++)!(ve.indexOf(he=Oe[me])>=0)&&(!Object.prototype.propertyIsEnumerable.call(se,he)||(oe[he]=se[he]))}return oe}(he,["text","onCopy","options","children"]),Ye=r.default.Children.only(dt);return r.default.cloneElement(Ye,function(se){for(var ve=1;ve<arguments.length;ve++){var oe=null!=arguments[ve]?arguments[ve]:{};ve%2?e(oe,!0).forEach(function(he){ae(se,he,oe[he])}):Object.getOwnPropertyDescriptors?Object.defineProperties(se,Object.getOwnPropertyDescriptors(oe)):e(oe).forEach(function(he){Object.defineProperty(se,he,Object.getOwnPropertyDescriptor(oe,he))})}return se}({},ze,{onClick:this.onClick}))}}]),ve}(r.default.PureComponent);S.CopyToClipboard=$,ae($,"defaultProps",{onCopy:void 0,options:void 0})},43409:(v,S,i)=>{"use strict";var u=i(57021).CopyToClipboard;u.CopyToClipboard=u,v.exports=u},16709:(v,S,i)=>{"use strict";Object.defineProperty(S,"__esModule",{value:!0}),S.DebounceInput=void 0;var r=p(i(78139)),u=p(i(86906));function p(oe){return oe&&oe.__esModule?oe:{default:oe}}function f(oe){return(f="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(me){return typeof me}:function(me){return me&&"function"==typeof Symbol&&me.constructor===Symbol&&me!==Symbol.prototype?"symbol":typeof me})(oe)}function y(oe,he){var me=Object.keys(oe);if(Object.getOwnPropertySymbols){var Oe=Object.getOwnPropertySymbols(oe);he&&(Oe=Oe.filter(function(ce){return Object.getOwnPropertyDescriptor(oe,ce).enumerable})),me.push.apply(me,Oe)}return me}function T(oe){for(var he=1;he<arguments.length;he++){var me=null!=arguments[he]?arguments[he]:{};he%2?y(Object(me),!0).forEach(function(Oe){se(oe,Oe,me[Oe])}):Object.getOwnPropertyDescriptors?Object.defineProperties(oe,Object.getOwnPropertyDescriptors(me)):y(Object(me)).forEach(function(Oe){Object.defineProperty(oe,Oe,Object.getOwnPropertyDescriptor(me,Oe))})}return oe}function R(oe,he){for(var me=0;me<he.length;me++){var Oe=he[me];Oe.enumerable=Oe.enumerable||!1,Oe.configurable=!0,"value"in Oe&&(Oe.writable=!0),Object.defineProperty(oe,Oe.key,Oe)}}function J(oe,he){return(J=Object.setPrototypeOf||function(Oe,ce){return Oe.__proto__=ce,Oe})(oe,he)}function ee(oe,he){return!he||"object"!==f(he)&&"function"!=typeof he?ue(oe):he}function ue(oe){if(void 0===oe)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return oe}function $(oe){return($=Object.setPrototypeOf?Object.getPrototypeOf:function(me){return me.__proto__||Object.getPrototypeOf(me)})(oe)}function se(oe,he,me){return he in oe?Object.defineProperty(oe,he,{value:me,enumerable:!0,configurable:!0,writable:!0}):oe[he]=me,oe}var ve=function(oe){!function(oe,he){if("function"!=typeof he&&null!==he)throw new TypeError("Super expression must either be null or a function");oe.prototype=Object.create(he&&he.prototype,{constructor:{value:oe,writable:!0,configurable:!0}}),he&&J(oe,he)}(me,oe);var he=function(oe){var he=function(){if("undefined"==typeof Reflect||!Reflect.construct||Reflect.construct.sham)return!1;if("function"==typeof Proxy)return!0;try{return Date.prototype.toString.call(Reflect.construct(Date,[],function(){})),!0}catch(oe){return!1}}();return function(){var ce,Oe=$(oe);if(he){var dt=$(this).constructor;ce=Reflect.construct(Oe,arguments,dt)}else ce=Oe.apply(this,arguments);return ee(this,ce)}}(me);function me(Oe){var ce;return function(oe,he){if(!(oe instanceof he))throw new TypeError("Cannot call a class as a function")}(this,me),se(ue(ce=he.call(this,Oe)),"onChange",function(ze){ze.persist();var Ye=ce.state.value,je=ce.props.minLength;ce.setState({value:ze.target.value},function(){var Ie=ce.state.value;Ie.length>=je?ce.notify(ze):Ye.length>Ie.length&&ce.notify(T(T({},ze),{},{target:T(T({},ze.target),{},{value:""})}))})}),se(ue(ce),"onKeyDown",function(ze){"Enter"===ze.key&&ce.forceNotify(ze);var Ye=ce.props.onKeyDown;Ye&&(ze.persist(),Ye(ze))}),se(ue(ce),"onBlur",function(ze){ce.forceNotify(ze);var Ye=ce.props.onBlur;Ye&&(ze.persist(),Ye(ze))}),se(ue(ce),"createNotifier",function(ze){if(ze<0)ce.notify=function(){return null};else if(0===ze)ce.notify=ce.doNotify;else{var Ye=(0,u.default)(function(je){ce.isDebouncing=!1,ce.doNotify(je)},ze);ce.notify=function(je){ce.isDebouncing=!0,Ye(je)},ce.flush=function(){return Ye.flush()},ce.cancel=function(){ce.isDebouncing=!1,Ye.cancel()}}}),se(ue(ce),"doNotify",function(){var ze=ce.props.onChange;ze.apply(void 0,arguments)}),se(ue(ce),"forceNotify",function(ze){if(ce.isDebouncing||!(ce.props.debounceTimeout>0)){ce.cancel&&ce.cancel();var je=ce.state.value;ce.doNotify(je.length>=ce.props.minLength?ze:T(T({},ze),{},{target:T(T({},ze.target),{},{value:je})}))}}),ce.isDebouncing=!1,ce.state={value:null==Oe.value?"":Oe.value},ce.createNotifier(ce.props.debounceTimeout),ce}return function(oe,he,me){he&&R(oe.prototype,he)}(me,[{key:"componentDidUpdate",value:function(ce){if(!this.isDebouncing){var dt=this.props,ze=dt.value,Ye=dt.debounceTimeout,je=ce.debounceTimeout;void 0!==ze&&ce.value!==ze&&this.state.value!==ze&&this.setState({value:ze}),Ye!==je&&this.createNotifier(Ye)}}},{key:"componentWillUnmount",value:function(){this.flush&&this.flush()}},{key:"render",value:function(){var Ut,Bt,ce=this.props,dt=ce.element,Ve=ce.forceNotifyByEnter,He=ce.forceNotifyOnBlur,Zt=ce.onKeyDown,st=ce.onBlur,en=ce.inputRef,$t=function(oe,he){if(null==oe)return{};var Oe,ce,me=function(oe,he){if(null==oe)return{};var ce,dt,me={},Oe=Object.keys(oe);for(dt=0;dt<Oe.length;dt++)!(he.indexOf(ce=Oe[dt])>=0)&&(me[ce]=oe[ce]);return me}(oe,he);if(Object.getOwnPropertySymbols){var dt=Object.getOwnPropertySymbols(oe);for(ce=0;ce<dt.length;ce++)!(he.indexOf(Oe=dt[ce])>=0)&&(!Object.prototype.propertyIsEnumerable.call(oe,Oe)||(me[Oe]=oe[Oe]))}return me}(ce,["element","onChange","value","minLength","debounceTimeout","forceNotifyByEnter","forceNotifyOnBlur","onKeyDown","onBlur","inputRef"]),Gt=this.state.value;Ut=Ve?{onKeyDown:this.onKeyDown}:Zt?{onKeyDown:Zt}:{},Bt=He?{onBlur:this.onBlur}:st?{onBlur:st}:{};var mt=en?{ref:en}:{};return r.default.createElement(dt,T(T(T(T({},$t),{},{onChange:this.onChange,value:Gt},Ut),Bt),mt))}}]),me}(r.default.PureComponent);S.DebounceInput=ve,se(ve,"defaultProps",{element:"input",type:"text",onKeyDown:void 0,onBlur:void 0,value:void 0,minLength:0,debounceTimeout:100,forceNotifyByEnter:!0,forceNotifyOnBlur:!0,inputRef:void 0})},41205:(v,S,i)=>{"use strict";var u=i(16709).DebounceInput;u.DebounceInput=u,v.exports=u},85503:(v,S,i)=>{"use strict";var r=i(78139),u=i(18228),p=i(88712);function f(b){for(var x="https://reactjs.org/docs/error-decoder.html?invariant="+b,G=1;G<arguments.length;G++)x+="&args[]="+encodeURIComponent(arguments[G]);return"Minified React error #"+b+"; visit "+x+" for the full message or use the non-minified dev environment for full errors and additional helpful warnings."}if(!r)throw Error(f(227));var e=new Set,_={};function y(b,x){T(b,x),T(b+"Capture",x)}function T(b,x){for(_[b]=x,b=0;b<x.length;b++)e.add(x[b])}var M=!("undefined"==typeof window||void 0===window.document||void 0===window.document.createElement),R=/^[:A-Z_a-z\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u02FF\u0370-\u037D\u037F-\u1FFF\u200C-\u200D\u2070-\u218F\u2C00-\u2FEF\u3001-\uD7FF\uF900-\uFDCF\uFDF0-\uFFFD][:A-Z_a-z\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u02FF\u0370-\u037D\u037F-\u1FFF\u200C-\u200D\u2070-\u218F\u2C00-\u2FEF\u3001-\uD7FF\uF900-\uFDCF\uFDF0-\uFFFD\-.0-9\u00B7\u0300-\u036F\u203F-\u2040]*$/,F=Object.prototype.hasOwnProperty,Z={},J={};function ae(b,x,G,Se,We,Rt,rn){this.acceptsBooleans=2===x||3===x||4===x,this.attributeName=Se,this.attributeNamespace=We,this.mustUseProperty=G,this.propertyName=b,this.type=x,this.sanitizeURL=Rt,this.removeEmptyString=rn}var $={};"children dangerouslySetInnerHTML defaultValue defaultChecked innerHTML suppressContentEditableWarning suppressHydrationWarning style".split(" ").forEach(function(b){$[b]=new ae(b,0,!1,b,null,!1,!1)}),[["acceptCharset","accept-charset"],["className","class"],["htmlFor","for"],["httpEquiv","http-equiv"]].forEach(function(b){var x=b[0];$[x]=new ae(x,1,!1,b[1],null,!1,!1)}),["contentEditable","draggable","spellCheck","value"].forEach(function(b){$[b]=new ae(b,2,!1,b.toLowerCase(),null,!1,!1)}),["autoReverse","externalResourcesRequired","focusable","preserveAlpha"].forEach(function(b){$[b]=new ae(b,2,!1,b,null,!1,!1)}),"allowFullScreen async autoFocus autoPlay controls default defer disabled disablePictureInPicture disableRemotePlayback formNoValidate hidden loop noModule noValidate open playsInline readOnly required reversed scoped seamless itemScope".split(" ").forEach(function(b){$[b]=new ae(b,3,!1,b.toLowerCase(),null,!1,!1)}),["checked","multiple","muted","selected"].forEach(function(b){$[b]=new ae(b,3,!0,b,null,!1,!1)}),["capture","download"].forEach(function(b){$[b]=new ae(b,4,!1,b,null,!1,!1)}),["cols","rows","size","span"].forEach(function(b){$[b]=new ae(b,6,!1,b,null,!1,!1)}),["rowSpan","start"].forEach(function(b){$[b]=new ae(b,5,!1,b.toLowerCase(),null,!1,!1)});var se=/[\-:]([a-z])/g;function ve(b){return b[1].toUpperCase()}function oe(b,x,G,Se){var We=$.hasOwnProperty(x)?$[x]:null;(null!==We?0===We.type:!Se&&2<x.length&&("o"===x[0]||"O"===x[0])&&("n"===x[1]||"N"===x[1]))||(function(b,x,G,Se){if(null==x||function(b,x,G,Se){if(null!==G&&0===G.type)return!1;switch(typeof x){case"function":case"symbol":return!0;case"boolean":return!Se&&(null!==G?!G.acceptsBooleans:"data-"!==(b=b.toLowerCase().slice(0,5))&&"aria-"!==b);default:return!1}}(b,x,G,Se))return!0;if(Se)return!1;if(null!==G)switch(G.type){case 3:return!x;case 4:return!1===x;case 5:return isNaN(x);case 6:return isNaN(x)||1>x}return!1}(x,G,We,Se)&&(G=null),Se||null===We?function(b){return!!F.call(J,b)||!F.call(Z,b)&&(R.test(b)?J[b]=!0:(Z[b]=!0,!1))}(x)&&(null===G?b.removeAttribute(x):b.setAttribute(x,""+G)):We.mustUseProperty?b[We.propertyName]=null===G?3!==We.type&&"":G:(x=We.attributeName,Se=We.attributeNamespace,null===G?b.removeAttribute(x):(G=3===(We=We.type)||4===We&&!0===G?"":""+G,Se?b.setAttributeNS(Se,x,G):b.setAttribute(x,G))))}"accent-height alignment-baseline arabic-form baseline-shift cap-height clip-path clip-rule color-interpolation color-interpolation-filters color-profile color-rendering dominant-baseline enable-background fill-opacity fill-rule flood-color flood-opacity font-family font-size font-size-adjust font-stretch font-style font-variant font-weight glyph-name glyph-orientation-horizontal glyph-orientation-vertical horiz-adv-x horiz-origin-x image-rendering letter-spacing lighting-color marker-end marker-mid marker-start overline-position overline-thickness paint-order panose-1 pointer-events rendering-intent shape-rendering stop-color stop-opacity strikethrough-position strikethrough-thickness stroke-dasharray stroke-dashoffset stroke-linecap stroke-linejoin stroke-miterlimit stroke-opacity stroke-width text-anchor text-decoration text-rendering underline-position underline-thickness unicode-bidi unicode-range units-per-em v-alphabetic v-hanging v-ideographic v-mathematical vector-effect vert-adv-y vert-origin-x vert-origin-y word-spacing writing-mode xmlns:xlink x-height".split(" ").forEach(function(b){var x=b.replace(se,ve);$[x]=new ae(x,1,!1,b,null,!1,!1)}),"xlink:actuate xlink:arcrole xlink:role xlink:show xlink:title xlink:type".split(" ").forEach(function(b){var x=b.replace(se,ve);$[x]=new ae(x,1,!1,b,"http://www.w3.org/1999/xlink",!1,!1)}),["xml:base","xml:lang","xml:space"].forEach(function(b){var x=b.replace(se,ve);$[x]=new ae(x,1,!1,b,"http://www.w3.org/XML/1998/namespace",!1,!1)}),["tabIndex","crossOrigin"].forEach(function(b){$[b]=new ae(b,1,!1,b.toLowerCase(),null,!1,!1)}),$.xlinkHref=new ae("xlinkHref",1,!1,"xlink:href","http://www.w3.org/1999/xlink",!0,!1),["src","href","action","formAction"].forEach(function(b){$[b]=new ae(b,1,!1,b.toLowerCase(),null,!0,!0)});var he=r.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED,me=60103,Oe=60106,ce=60107,dt=60108,ze=60114,Ye=60109,je=60110,Ie=60112,Ve=60113,He=60120,Zt=60115,st=60116,en=60121,$t=60128,Gt=60129,Ut=60130,Bt=60131;if("function"==typeof Symbol&&Symbol.for){var mt=Symbol.for;me=mt("react.element"),Oe=mt("react.portal"),ce=mt("react.fragment"),dt=mt("react.strict_mode"),ze=mt("react.profiler"),Ye=mt("react.provider"),je=mt("react.context"),Ie=mt("react.forward_ref"),Ve=mt("react.suspense"),He=mt("react.suspense_list"),Zt=mt("react.memo"),st=mt("react.lazy"),en=mt("react.block"),mt("react.scope"),$t=mt("react.opaque.id"),Gt=mt("react.debug_trace_mode"),Ut=mt("react.offscreen"),Bt=mt("react.legacy_hidden")}var zt,Yt="function"==typeof Symbol&&Symbol.iterator;function Dt(b){return null===b||"object"!=typeof b?null:"function"==typeof(b=Yt&&b[Yt]||b["@@iterator"])?b:null}function Yn(b){if(void 0===zt)try{throw Error()}catch(G){var x=G.stack.trim().match(/\n( *(at )?)/);zt=x&&x[1]||""}return"\n"+zt+b}var Hr=!1;function ci(b,x){if(!b||Hr)return"";Hr=!0;var G=Error.prepareStackTrace;Error.prepareStackTrace=void 0;try{if(x)if(x=function(){throw Error()},Object.defineProperty(x.prototype,"props",{set:function(){throw Error()}}),"object"==typeof Reflect&&Reflect.construct){try{Reflect.construct(x,[])}catch(Er){var Se=Er}Reflect.construct(b,[],x)}else{try{x.call()}catch(Er){Se=Er}b.call(x.prototype)}else{try{throw Error()}catch(Er){Se=Er}b()}}catch(Er){if(Er&&Se&&"string"==typeof Er.stack){for(var We=Er.stack.split("\n"),Rt=Se.stack.split("\n"),rn=We.length-1,xn=Rt.length-1;1<=rn&&0<=xn&&We[rn]!==Rt[xn];)xn--;for(;1<=rn&&0<=xn;rn--,xn--)if(We[rn]!==Rt[xn]){if(1!==rn||1!==xn)do{if(rn--,0>--xn||We[rn]!==Rt[xn])return"\n"+We[rn].replace(" at new "," at ")}while(1<=rn&&0<=xn);break}}}finally{Hr=!1,Error.prepareStackTrace=G}return(b=b?b.displayName||b.name:"")?Yn(b):""}function Ir(b){switch(b.tag){case 5:return Yn(b.type);case 16:return Yn("Lazy");case 13:return Yn("Suspense");case 19:return Yn("SuspenseList");case 0:case 2:case 15:return ci(b.type,!1);case 11:return ci(b.type.render,!1);case 22:return ci(b.type._render,!1);case 1:return ci(b.type,!0);default:return""}}function wr(b){if(null==b)return null;if("function"==typeof b)return b.displayName||b.name||null;if("string"==typeof b)return b;switch(b){case ce:return"Fragment";case Oe:return"Portal";case ze:return"Profiler";case dt:return"StrictMode";case Ve:return"Suspense";case He:return"SuspenseList"}if("object"==typeof b)switch(b.$$typeof){case je:return(b.displayName||"Context")+".Consumer";case Ye:return(b._context.displayName||"Context")+".Provider";case Ie:var x=b.render;return x=x.displayName||x.name||"",b.displayName||(""!==x?"ForwardRef("+x+")":"ForwardRef");case Zt:return wr(b.type);case en:return wr(b._render);case st:x=b._payload,b=b._init;try{return wr(b(x))}catch(G){}}return null}function Qr(b){switch(typeof b){case"boolean":case"number":case"object":case"string":case"undefined":return b;default:return""}}function Kr(b){var x=b.type;return(b=b.nodeName)&&"input"===b.toLowerCase()&&("checkbox"===x||"radio"===x)}function Hn(b){b._valueTracker||(b._valueTracker=function(b){var x=Kr(b)?"checked":"value",G=Object.getOwnPropertyDescriptor(b.constructor.prototype,x),Se=""+b[x];if(!b.hasOwnProperty(x)&&void 0!==G&&"function"==typeof G.get&&"function"==typeof G.set){var We=G.get,Rt=G.set;return Object.defineProperty(b,x,{configurable:!0,get:function(){return We.call(this)},set:function(rn){Se=""+rn,Rt.call(this,rn)}}),Object.defineProperty(b,x,{enumerable:G.enumerable}),{getValue:function(){return Se},setValue:function(rn){Se=""+rn},stopTracking:function(){b._valueTracker=null,delete b[x]}}}}(b))}function Zr(b){if(!b)return!1;var x=b._valueTracker;if(!x)return!0;var G=x.getValue(),Se="";return b&&(Se=Kr(b)?b.checked?"true":"false":b.value),(b=Se)!==G&&(x.setValue(b),!0)}function Ur(b){if(void 0===(b=b||("undefined"!=typeof document?document:void 0)))return null;try{return b.activeElement||b.body}catch(x){return b.body}}function di(b,x){var G=x.checked;return u({},x,{defaultChecked:void 0,defaultValue:void 0,value:void 0,checked:null!=G?G:b._wrapperState.initialChecked})}function $i(b,x){var G=null==x.defaultValue?"":x.defaultValue,Se=null!=x.checked?x.checked:x.defaultChecked;G=Qr(null!=x.value?x.value:G),b._wrapperState={initialChecked:Se,initialValue:G,controlled:"checkbox"===x.type||"radio"===x.type?null!=x.checked:null!=x.value}}function Hi(b,x){null!=(x=x.checked)&&oe(b,"checked",x,!1)}function Br(b,x){Hi(b,x);var G=Qr(x.value),Se=x.type;if(null!=G)"number"===Se?(0===G&&""===b.value||b.value!=G)&&(b.value=""+G):b.value!==""+G&&(b.value=""+G);else if("submit"===Se||"reset"===Se)return void b.removeAttribute("value");x.hasOwnProperty("value")?Wt(b,x.type,G):x.hasOwnProperty("defaultValue")&&Wt(b,x.type,Qr(x.defaultValue)),null==x.checked&&null!=x.defaultChecked&&(b.defaultChecked=!!x.defaultChecked)}function On(b,x,G){if(x.hasOwnProperty("value")||x.hasOwnProperty("defaultValue")){var Se=x.type;if(("submit"===Se||"reset"===Se)&&null==x.value)return;x=""+b._wrapperState.initialValue,G||x===b.value||(b.value=x),b.defaultValue=x}""!==(G=b.name)&&(b.name=""),b.defaultChecked=!!b._wrapperState.initialChecked,""!==G&&(b.name=G)}function Wt(b,x,G){("number"!==x||Ur(b.ownerDocument)!==b)&&(null==G?b.defaultValue=""+b._wrapperState.initialValue:b.defaultValue!==""+G&&(b.defaultValue=""+G))}function ir(b,x){return b=u({children:void 0},x),(x=function(b){var x="";return r.Children.forEach(b,function(G){null!=G&&(x+=G)}),x}(x.children))&&(b.children=x),b}function Lr(b,x,G,Se){if(b=b.options,x){x={};for(var We=0;We<G.length;We++)x["$"+G[We]]=!0;for(G=0;G<b.length;G++)We=x.hasOwnProperty("$"+b[G].value),b[G].selected!==We&&(b[G].selected=We),We&&Se&&(b[G].defaultSelected=!0)}else{for(G=""+Qr(G),x=null,We=0;We<b.length;We++){if(b[We].value===G)return b[We].selected=!0,void(Se&&(b[We].defaultSelected=!0));null!==x||b[We].disabled||(x=b[We])}null!==x&&(x.selected=!0)}}function Vn(b,x){if(null!=x.dangerouslySetInnerHTML)throw Error(f(91));return u({},x,{value:void 0,defaultValue:void 0,children:""+b._wrapperState.initialValue})}function zr(b,x){var G=x.value;if(null==G){if(G=x.children,x=x.defaultValue,null!=G){if(null!=x)throw Error(f(92));if(Array.isArray(G)){if(!(1>=G.length))throw Error(f(93));G=G[0]}x=G}null==x&&(x=""),G=x}b._wrapperState={initialValue:Qr(G)}}function hi(b,x){var G=Qr(x.value),Se=Qr(x.defaultValue);null!=G&&((G=""+G)!==b.value&&(b.value=G),null==x.defaultValue&&b.defaultValue!==G&&(b.defaultValue=G)),null!=Se&&(b.defaultValue=""+Se)}function Ai(b){var x=b.textContent;x===b._wrapperState.initialValue&&""!==x&&null!==x&&(b.value=x)}var Tr_html="http://www.w3.org/1999/xhtml";function Nr(b){switch(b){case"svg":return"http://www.w3.org/2000/svg";case"math":return"http://www.w3.org/1998/Math/MathML";default:return"http://www.w3.org/1999/xhtml"}}function gn(b,x){return null==b||"http://www.w3.org/1999/xhtml"===b?Nr(x):"http://www.w3.org/2000/svg"===b&&"foreignObject"===x?"http://www.w3.org/1999/xhtml":b}var En,b,mr=(b=function(b,x){if("http://www.w3.org/2000/svg"!==b.namespaceURI||"innerHTML"in b)b.innerHTML=x;else{for((En=En||document.createElement("div")).innerHTML="<svg>"+x.valueOf().toString()+"</svg>",x=En.firstChild;b.firstChild;)b.removeChild(b.firstChild);for(;x.firstChild;)b.appendChild(x.firstChild)}},"undefined"!=typeof MSApp&&MSApp.execUnsafeLocalFunction?function(x,G,Se,We){MSApp.execUnsafeLocalFunction(function(){return b(x,G)})}:b);function Xt(b,x){if(x){var G=b.firstChild;if(G&&G===b.lastChild&&3===G.nodeType)return void(G.nodeValue=x)}b.textContent=x}var zn={animationIterationCount:!0,borderImageOutset:!0,borderImageSlice:!0,borderImageWidth:!0,boxFlex:!0,boxFlexGroup:!0,boxOrdinalGroup:!0,columnCount:!0,columns:!0,flex:!0,flexGrow:!0,flexPositive:!0,flexShrink:!0,flexNegative:!0,flexOrder:!0,gridArea:!0,gridRow:!0,gridRowEnd:!0,gridRowSpan:!0,gridRowStart:!0,gridColumn:!0,gridColumnEnd:!0,gridColumnSpan:!0,gridColumnStart:!0,fontWeight:!0,lineClamp:!0,lineHeight:!0,opacity:!0,order:!0,orphans:!0,tabSize:!0,widows:!0,zIndex:!0,zoom:!0,fillOpacity:!0,floodOpacity:!0,stopOpacity:!0,strokeDasharray:!0,strokeDashoffset:!0,strokeMiterlimit:!0,strokeOpacity:!0,strokeWidth:!0},vr=["Webkit","ms","Moz","O"];function si(b,x,G){return null==x||"boolean"==typeof x||""===x?"":G||"number"!=typeof x||0===x||zn.hasOwnProperty(b)&&zn[b]?(""+x).trim():x+"px"}function Ii(b,x){for(var G in b=b.style,x)if(x.hasOwnProperty(G)){var Se=0===G.indexOf("--"),We=si(G,x[G],Se);"float"===G&&(G="cssFloat"),Se?b.setProperty(G,We):b[G]=We}}Object.keys(zn).forEach(function(b){vr.forEach(function(x){x=x+b.charAt(0).toUpperCase()+b.substring(1),zn[x]=zn[b]})});var no=u({menuitem:!0},{area:!0,base:!0,br:!0,col:!0,embed:!0,hr:!0,img:!0,input:!0,keygen:!0,link:!0,meta:!0,param:!0,source:!0,track:!0,wbr:!0});function so(b,x){if(x){if(no[b]&&(null!=x.children||null!=x.dangerouslySetInnerHTML))throw Error(f(137,b));if(null!=x.dangerouslySetInnerHTML){if(null!=x.children)throw Error(f(60));if("object"!=typeof x.dangerouslySetInnerHTML||!("__html"in x.dangerouslySetInnerHTML))throw Error(f(61))}if(null!=x.style&&"object"!=typeof x.style)throw Error(f(62))}}function Ze(b,x){if(-1===b.indexOf("-"))return"string"==typeof x.is;switch(b){case"annotation-xml":case"color-profile":case"font-face":case"font-face-src":case"font-face-uri":case"font-face-format":case"font-face-name":case"missing-glyph":return!1;default:return!0}}function Dr(b){return(b=b.target||b.srcElement||window).correspondingUseElement&&(b=b.correspondingUseElement),3===b.nodeType?b.parentNode:b}var jt=null,xt=null,mn=null;function Wn(b){if(b=Vu(b)){if("function"!=typeof jt)throw Error(f(280));var x=b.stateNode;x&&(x=Qd(x),jt(b.stateNode,b.type,x))}}function kn(b){xt?mn?mn.push(b):mn=[b]:xt=b}function wn(){if(xt){var b=xt,x=mn;if(mn=xt=null,Wn(b),x)for(b=0;b<x.length;b++)Wn(x[b])}}function nr(b,x){return b(x)}function Gi(b,x,G,Se,We){return b(x,G,Se,We)}function po(){}var yo=nr,Mo=!1,Vi=!1;function cs(){(null!==xt||null!==mn)&&(po(),wn())}function So(b,x){var G=b.stateNode;if(null===G)return null;var Se=Qd(G);if(null===Se)return null;G=Se[x];e:switch(x){case"onClick":case"onClickCapture":case"onDoubleClick":case"onDoubleClickCapture":case"onMouseDown":case"onMouseDownCapture":case"onMouseMove":case"onMouseMoveCapture":case"onMouseUp":case"onMouseUpCapture":case"onMouseEnter":(Se=!Se.disabled)||(Se=!("button"===(b=b.type)||"input"===b||"select"===b||"textarea"===b)),b=!Se;break e;default:b=!1}if(b)return null;if(G&&"function"!=typeof G)throw Error(f(231,x,typeof G));return G}var Si=!1;if(M)try{var ai={};Object.defineProperty(ai,"passive",{get:function(){Si=!0}}),window.addEventListener("test",ai,ai),window.removeEventListener("test",ai,ai)}catch(b){Si=!1}function Zn(b,x,G,Se,We,Rt,rn,xn,Er){var Ei=Array.prototype.slice.call(arguments,3);try{x.apply(G,Ei)}catch(fs){this.onError(fs)}}var cr=!1,yr=null,rr=!1,ri=null,ho={onError:function(b){cr=!0,yr=b}};function Ti(b,x,G,Se,We,Rt,rn,xn,Er){cr=!1,yr=null,Zn.apply(ho,arguments)}function xo(b){var x=b,G=b;if(b.alternate)for(;x.return;)x=x.return;else{b=x;do{0!=(1026&(x=b).flags)&&(G=x.return),b=x.return}while(b)}return 3===x.tag?G:null}function Li(b){if(13===b.tag){var x=b.memoizedState;if(null===x&&null!==(b=b.alternate)&&(x=b.memoizedState),null!==x)return x.dehydrated}return null}function ar(b){if(xo(b)!==b)throw Error(f(188))}function Ht(b){if(!(b=function(b){var x=b.alternate;if(!x){if(null===(x=xo(b)))throw Error(f(188));return x!==b?null:b}for(var G=b,Se=x;;){var We=G.return;if(null===We)break;var Rt=We.alternate;if(null===Rt){if(null!==(Se=We.return)){G=Se;continue}break}if(We.child===Rt.child){for(Rt=We.child;Rt;){if(Rt===G)return ar(We),b;if(Rt===Se)return ar(We),x;Rt=Rt.sibling}throw Error(f(188))}if(G.return!==Se.return)G=We,Se=Rt;else{for(var rn=!1,xn=We.child;xn;){if(xn===G){rn=!0,G=We,Se=Rt;break}if(xn===Se){rn=!0,Se=We,G=Rt;break}xn=xn.sibling}if(!rn){for(xn=Rt.child;xn;){if(xn===G){rn=!0,G=Rt,Se=We;break}if(xn===Se){rn=!0,Se=Rt,G=We;break}xn=xn.sibling}if(!rn)throw Error(f(189))}}if(G.alternate!==Se)throw Error(f(190))}if(3!==G.tag)throw Error(f(188));return G.stateNode.current===G?b:x}(b)))return null;for(var x=b;;){if(5===x.tag||6===x.tag)return x;if(x.child)x.child.return=x,x=x.child;else{if(x===b)break;for(;!x.sibling;){if(!x.return||x.return===b)return null;x=x.return}x.sibling.return=x.return,x=x.sibling}}return null}function cn(b,x){for(var G=b.alternate;null!==x;){if(x===b||x===G)return!0;x=x.return}return!1}var Ct,pr,nn,Cn,br=!1,zi=[],Wo=null,Do=null,Js=null,_s=new Map,bs=new Map,qo=[],ra="mousedown mouseup touchcancel touchend touchstart auxclick dblclick pointercancel pointerdown pointerup dragend dragstart drop compositionend compositionstart keydown keypress keyup input textInput copy cut paste click change contextmenu reset submit".split(" ");function Ia(b,x,G,Se,We){return{blockedOn:b,domEventName:x,eventSystemFlags:16|G,nativeEvent:We,targetContainers:[Se]}}function pa(b,x){switch(b){case"focusin":case"focusout":Wo=null;break;case"dragenter":case"dragleave":Do=null;break;case"mouseover":case"mouseout":Js=null;break;case"pointerover":case"pointerout":_s.delete(x.pointerId);break;case"gotpointercapture":case"lostpointercapture":bs.delete(x.pointerId)}}function Bs(b,x,G,Se,We,Rt){return null===b||b.nativeEvent!==Rt?(b=Ia(x,G,Se,We,Rt),null!==x&&null!==(x=Vu(x))&&pr(x),b):(b.eventSystemFlags|=Se,x=b.targetContainers,null!==We&&-1===x.indexOf(We)&&x.push(We),b)}function yl(b){var x=Tc(b.target);if(null!==x){var G=xo(x);if(null!==G)if(13===(x=G.tag)){if(null!==(x=Li(G)))return b.blockedOn=x,void Cn(b.lanePriority,function(){p.unstable_runWithPriority(b.priority,function(){nn(G)})})}else if(3===x&&G.stateNode.hydrate)return void(b.blockedOn=3===G.tag?G.stateNode.containerInfo:null)}b.blockedOn=null}function fo(b){if(null!==b.blockedOn)return!1;for(var x=b.targetContainers;0<x.length;){var G=ou(b.domEventName,b.eventSystemFlags,x[0],b.nativeEvent);if(null!==G)return null!==(x=Vu(G))&&pr(x),b.blockedOn=G,!1;x.shift()}return!0}function Da(b,x,G){fo(b)&&G.delete(x)}function Ao(){for(br=!1;0<zi.length;){var b=zi[0];if(null!==b.blockedOn){null!==(b=Vu(b.blockedOn))&&Ct(b);break}for(var x=b.targetContainers;0<x.length;){var G=ou(b.domEventName,b.eventSystemFlags,x[0],b.nativeEvent);if(null!==G){b.blockedOn=G;break}x.shift()}null===b.blockedOn&&zi.shift()}null!==Wo&&fo(Wo)&&(Wo=null),null!==Do&&fo(Do)&&(Do=null),null!==Js&&fo(Js)&&(Js=null),_s.forEach(Da),bs.forEach(Da)}function ls(b,x){b.blockedOn===x&&(b.blockedOn=null,br||(br=!0,p.unstable_scheduleCallback(p.unstable_NormalPriority,Ao)))}function gs(b){function x(We){return ls(We,b)}if(0<zi.length){ls(zi[0],b);for(var G=1;G<zi.length;G++){var Se=zi[G];Se.blockedOn===b&&(Se.blockedOn=null)}}for(null!==Wo&&ls(Wo,b),null!==Do&&ls(Do,b),null!==Js&&ls(Js,b),_s.forEach(x),bs.forEach(x),G=0;G<qo.length;G++)(Se=qo[G]).blockedOn===b&&(Se.blockedOn=null);for(;0<qo.length&&null===(G=qo[0]).blockedOn;)yl(G),null===G.blockedOn&&qo.shift()}function Ra(b,x){var G={};return G[b.toLowerCase()]=x.toLowerCase(),G["Webkit"+b]="webkit"+x,G["Moz"+b]="moz"+x,G}var pl={animationend:Ra("Animation","AnimationEnd"),animationiteration:Ra("Animation","AnimationIteration"),animationstart:Ra("Animation","AnimationStart"),transitionend:Ra("Transition","TransitionEnd")},Qs={},Fo={};function Eo(b){if(Qs[b])return Qs[b];if(!pl[b])return b;var G,x=pl[b];for(G in x)if(x.hasOwnProperty(G)&&G in Fo)return Qs[b]=x[G];return b}M&&(Fo=document.createElement("div").style,"AnimationEvent"in window||(delete pl.animationend.animation,delete pl.animationiteration.animation,delete pl.animationstart.animation),"TransitionEvent"in window||delete pl.transitionend.transition);var ks=Eo("animationend"),ms=Eo("animationiteration"),Co=Eo("animationstart"),kr=Eo("transitionend"),ro=new Map,tt=new Map,on=["abort","abort",ks,"animationEnd",ms,"animationIteration",Co,"animationStart","canplay","canPlay","canplaythrough","canPlayThrough","durationchange","durationChange","emptied","emptied","encrypted","encrypted","ended","ended","error","error","gotpointercapture","gotPointerCapture","load","load","loadeddata","loadedData","loadedmetadata","loadedMetadata","loadstart","loadStart","lostpointercapture","lostPointerCapture","playing","playing","progress","progress","seeking","seeking","stalled","stalled","suspend","suspend","timeupdate","timeUpdate",kr,"transitionEnd","waiting","waiting"];function ne(b,x){for(var G=0;G<b.length;G+=2){var Se=b[G],We=b[G+1];We="on"+(We[0].toUpperCase()+We.slice(1)),tt.set(Se,x),ro.set(Se,We),y(We,[Se])}}(0,p.unstable_now)();var Pt=8;function sn(b){if(0!=(1&b))return Pt=15,1;if(0!=(2&b))return Pt=14,2;if(0!=(4&b))return Pt=13,4;var x=24&b;return 0!==x?(Pt=12,x):0!=(32&b)?(Pt=11,32):0!=(x=192&b)?(Pt=10,x):0!=(256&b)?(Pt=9,256):0!=(x=3584&b)?(Pt=8,x):0!=(4096&b)?(Pt=7,4096):0!=(x=4186112&b)?(Pt=6,x):0!=(x=62914560&b)?(Pt=5,x):67108864&b?(Pt=4,67108864):0!=(134217728&b)?(Pt=3,134217728):0!=(x=805306368&b)?(Pt=2,x):0!=(1073741824&b)?(Pt=1,1073741824):(Pt=8,b)}function Oi(b,x){var G=b.pendingLanes;if(0===G)return Pt=0;var Se=0,We=0,Rt=b.expiredLanes,rn=b.suspendedLanes,xn=b.pingedLanes;if(0!==Rt)Se=Rt,We=Pt=15;else if(0!=(Rt=134217727&G)){var Er=Rt&~rn;0!==Er?(Se=sn(Er),We=Pt):0!=(xn&=Rt)&&(Se=sn(xn),We=Pt)}else 0!=(Rt=G&~rn)?(Se=sn(Rt),We=Pt):0!==xn&&(Se=sn(xn),We=Pt);if(0===Se)return 0;if(Se=G&((0>(Se=31-al(Se))?0:1<<Se)<<1)-1,0!==x&&x!==Se&&0==(x&rn)){if(sn(x),We<=Pt)return x;Pt=We}if(0!==(x=b.entangledLanes))for(b=b.entanglements,x&=Se;0<x;)Se|=b[G=31-al(x)],x&=~(We=1<<G);return Se}function os(b){return 0!=(b=-1073741825&b.pendingLanes)?b:1073741824&b?1073741824:0}function Ro(b,x){switch(b){case 15:return 1;case 14:return 2;case 12:return 0===(b=Uo(24&~x))?Ro(10,x):b;case 10:return 0===(b=Uo(192&~x))?Ro(8,x):b;case 8:return 0===(b=Uo(3584&~x))&&0===(b=Uo(4186112&~x))&&(b=512),b;case 2:return 0===(x=Uo(805306368&~x))&&(x=268435456),x}throw Error(f(358,b))}function Uo(b){return b&-b}function To(b){for(var x=[],G=0;31>G;G++)x.push(b);return x}function Ea(b,x,G){b.pendingLanes|=x;var Se=x-1;b.suspendedLanes&=Se,b.pingedLanes&=Se,(b=b.eventTimes)[x=31-al(x)]=G}var al=Math.clz32?Math.clz32:function(b){return 0===b?32:31-(qu(b)/Ru|0)|0},qu=Math.log,Ru=Math.LN2,bc=p.unstable_UserBlockingPriority,ed=p.unstable_runWithPriority,Hl=!0;function Zl(b,x,G,Se){Mo||po();var We=dc,Rt=Mo;Mo=!0;try{Gi(We,b,x,G,Se)}finally{(Mo=Rt)||cs()}}function $s(b,x,G,Se){ed(bc,dc.bind(null,b,x,G,Se))}function dc(b,x,G,Se){var We;if(Hl)if((We=0==(4&x))&&0<zi.length&&-1<ra.indexOf(b))b=Ia(null,b,x,G,Se),zi.push(b);else{var Rt=ou(b,x,G,Se);if(null===Rt)We&&pa(b,Se);else{if(We){if(-1<ra.indexOf(b))return b=Ia(Rt,b,x,G,Se),void zi.push(b);if(function(b,x,G,Se,We){switch(x){case"focusin":return Wo=Bs(Wo,b,x,G,Se,We),!0;case"dragenter":return Do=Bs(Do,b,x,G,Se,We),!0;case"mouseover":return Js=Bs(Js,b,x,G,Se,We),!0;case"pointerover":var Rt=We.pointerId;return _s.set(Rt,Bs(_s.get(Rt)||null,b,x,G,Se,We)),!0;case"gotpointercapture":return bs.set(Rt=We.pointerId,Bs(bs.get(Rt)||null,b,x,G,Se,We)),!0}return!1}(Rt,b,x,G,Se))return;pa(b,Se)}Ce(b,x,Se,null,G)}}}function ou(b,x,G,Se){var We=Dr(Se);if(null!==(We=Tc(We))){var Rt=xo(We);if(null===Rt)We=null;else{var rn=Rt.tag;if(13===rn){if(null!==(We=Li(Rt)))return We;We=null}else if(3===rn){if(Rt.stateNode.hydrate)return 3===Rt.tag?Rt.stateNode.containerInfo:null;We=null}else Rt!==We&&(We=null)}}return Ce(b,x,Se,We,G),null}var el=null,Cu=null,jl=null;function rt(){if(jl)return jl;var b,Se,x=Cu,G=x.length,We="value"in el?el.value:el.textContent,Rt=We.length;for(b=0;b<G&&x[b]===We[b];b++);var rn=G-b;for(Se=1;Se<=rn&&x[G-Se]===We[Rt-Se];Se++);return jl=We.slice(b,1<Se?1-Se:void 0)}function Nt(b){var x=b.keyCode;return"charCode"in b?0===(b=b.charCode)&&13===x&&(b=13):b=x,10===b&&(b=13),32<=b||13===b?b:0}function ct(){return!0}function Te(){return!1}function Me(b){function x(G,Se,We,Rt,rn){for(var xn in this._reactName=G,this._targetInst=We,this.type=Se,this.nativeEvent=Rt,this.target=rn,this.currentTarget=null,b)b.hasOwnProperty(xn)&&(this[xn]=(G=b[xn])?G(Rt):Rt[xn]);return this.isDefaultPrevented=(null!=Rt.defaultPrevented?Rt.defaultPrevented:!1===Rt.returnValue)?ct:Te,this.isPropagationStopped=Te,this}return u(x.prototype,{preventDefault:function(){this.defaultPrevented=!0;var G=this.nativeEvent;G&&(G.preventDefault?G.preventDefault():"unknown"!=typeof G.returnValue&&(G.returnValue=!1),this.isDefaultPrevented=ct)},stopPropagation:function(){var G=this.nativeEvent;G&&(G.stopPropagation?G.stopPropagation():"unknown"!=typeof G.cancelBubble&&(G.cancelBubble=!0),this.isPropagationStopped=ct)},persist:function(){},isPersistent:ct}),x}var Jo,Es,vs,De={eventPhase:0,bubbles:0,cancelable:0,timeStamp:function(b){return b.timeStamp||Date.now()},defaultPrevented:0,isTrusted:0},Tt=Me(De),dr=u({},De,{view:0,detail:0}),Qi=Me(dr),Ms=u({},dr,{screenX:0,screenY:0,clientX:0,clientY:0,pageX:0,pageY:0,ctrlKey:0,shiftKey:0,altKey:0,metaKey:0,getModifierState:ua,button:0,buttons:0,relatedTarget:function(b){return void 0===b.relatedTarget?b.fromElement===b.srcElement?b.toElement:b.fromElement:b.relatedTarget},movementX:function(b){return"movementX"in b?b.movementX:(b!==vs&&(vs&&"mousemove"===b.type?(Jo=b.screenX-vs.screenX,Es=b.screenY-vs.screenY):Es=Jo=0,vs=b),Jo)},movementY:function(b){return"movementY"in b?b.movementY:Es}}),Ma=Me(Ms),Wa=Me(u({},Ms,{dataTransfer:0})),ec=Me(u({},dr,{relatedTarget:0})),Ts=Me(u({},De,{animationName:0,elapsedTime:0,pseudoElement:0})),Ec=Me(u({},De,{clipboardData:function(b){return"clipboardData"in b?b.clipboardData:window.clipboardData}})),Mu=Me(u({},De,{data:0})),Ic={Esc:"Escape",Spacebar:" ",Left:"ArrowLeft",Up:"ArrowUp",Right:"ArrowRight",Down:"ArrowDown",Del:"Delete",Win:"OS",Menu:"ContextMenu",Apps:"ContextMenu",Scroll:"ScrollLock",MozPrintableKey:"Unidentified"},md={8:"Backspace",9:"Tab",12:"Clear",13:"Enter",16:"Shift",17:"Control",18:"Alt",19:"Pause",20:"CapsLock",27:"Escape",32:" ",33:"PageUp",34:"PageDown",35:"End",36:"Home",37:"ArrowLeft",38:"ArrowUp",39:"ArrowRight",40:"ArrowDown",45:"Insert",46:"Delete",112:"F1",113:"F2",114:"F3",115:"F4",116:"F5",117:"F6",118:"F7",119:"F8",120:"F9",121:"F10",122:"F11",123:"F12",144:"NumLock",145:"ScrollLock",224:"Meta"},tc={Alt:"altKey",Control:"ctrlKey",Meta:"metaKey",Shift:"shiftKey"};function Fi(b){var x=this.nativeEvent;return x.getModifierState?x.getModifierState(b):!!(b=tc[b])&&!!x[b]}function ua(){return Fi}var As=Me(u({},dr,{key:function(b){if(b.key){var x=Ic[b.key]||b.key;if("Unidentified"!==x)return x}return"keypress"===b.type?13===(b=Nt(b))?"Enter":String.fromCharCode(b):"keydown"===b.type||"keyup"===b.type?md[b.keyCode]||"Unidentified":""},code:0,location:0,ctrlKey:0,shiftKey:0,altKey:0,metaKey:0,repeat:0,locale:0,getModifierState:ua,charCode:function(b){return"keypress"===b.type?Nt(b):0},keyCode:function(b){return"keydown"===b.type||"keyup"===b.type?b.keyCode:0},which:function(b){return"keypress"===b.type?Nt(b):"keydown"===b.type||"keyup"===b.type?b.keyCode:0}})),bl=Me(u({},Ms,{pointerId:0,width:0,height:0,pressure:0,tangentialPressure:0,tiltX:0,tiltY:0,twist:0,pointerType:0,isPrimary:0})),bu=Me(u({},dr,{touches:0,targetTouches:0,changedTouches:0,altKey:0,metaKey:0,ctrlKey:0,shiftKey:0,getModifierState:ua})),Gs=Me(u({},De,{propertyName:0,elapsedTime:0,pseudoElement:0})),Hu=Me(u({},Ms,{deltaX:function(b){return"deltaX"in b?b.deltaX:"wheelDeltaX"in b?-b.wheelDeltaX:0},deltaY:function(b){return"deltaY"in b?b.deltaY:"wheelDeltaY"in b?-b.wheelDeltaY:"wheelDelta"in b?-b.wheelDelta:0},deltaZ:0,deltaMode:0})),Yo=[9,13,27,32],du=M&&"CompositionEvent"in window,Ar=null;M&&"documentMode"in document&&(Ar=document.documentMode);var ha=M&&"TextEvent"in window&&!Ar,_u=M&&(!du||Ar&&8<Ar&&11>=Ar),fa=String.fromCharCode(32),Gl=!1;function Ja(b,x){switch(b){case"keyup":return-1!==Yo.indexOf(x.keyCode);case"keydown":return 229!==x.keyCode;case"keypress":case"mousedown":case"focusout":return!0;default:return!1}}function hl(b){return"object"==typeof(b=b.detail)&&"data"in b?b.data:null}var Vl=!1,Ae={color:!0,date:!0,datetime:!0,"datetime-local":!0,email:!0,month:!0,number:!0,password:!0,range:!0,search:!0,tel:!0,text:!0,time:!0,url:!0,week:!0};function ot(b){var x=b&&b.nodeName&&b.nodeName.toLowerCase();return"input"===x?!!Ae[b.type]:"textarea"===x}function _t(b,x,G,Se){kn(Se),0<(x=yt(x,"onChange")).length&&(G=new Tt("onChange","change",null,G,Se),b.push({event:G,listeners:x}))}var lt=null,un=null;function yn(b){df(b,0)}function Or(b){if(Zr(Sc(b)))return b}function Vr(b,x){if("change"===b)return x}var _i=!1;if(M){var oi;if(M){var ko="oninput"in document;if(!ko){var Ho=document.createElement("div");Ho.setAttribute("oninput","return;"),ko="function"==typeof Ho.oninput}oi=ko}else oi=!1;_i=oi&&(!document.documentMode||9<document.documentMode)}function Ln(){lt&&(lt.detachEvent("onpropertychange",Mr),un=lt=null)}function Mr(b){if("value"===b.propertyName&&Or(un)){var x=[];if(_t(x,un,b,Dr(b)),b=yn,Mo)b(x);else{Mo=!0;try{nr(b,x)}finally{Mo=!1,cs()}}}}function gr(b,x,G){"focusin"===b?(Ln(),un=G,(lt=x).attachEvent("onpropertychange",Mr)):"focusout"===b&&Ln()}function co(b){if("selectionchange"===b||"keyup"===b||"keydown"===b)return Or(un)}function Ss(b,x){if("click"===b)return Or(x)}function Na(b,x){if("input"===b||"change"===b)return Or(x)}var Ks="function"==typeof Object.is?Object.is:function(b,x){return b===x&&(0!==b||1/b==1/x)||b!=b&&x!=x},td=Object.prototype.hasOwnProperty;function Lc(b,x){if(Ks(b,x))return!0;if("object"!=typeof b||null===b||"object"!=typeof x||null===x)return!1;var G=Object.keys(b),Se=Object.keys(x);if(G.length!==Se.length)return!1;for(Se=0;Se<G.length;Se++)if(!td.call(x,G[Se])||!Ks(b[G[Se]],x[G[Se]]))return!1;return!0}function zl(b){for(;b&&b.firstChild;)b=b.firstChild;return b}function ki(b,x){var Se,G=zl(b);for(b=0;G;){if(3===G.nodeType){if(Se=b+G.textContent.length,b<=x&&Se>=x)return{node:G,offset:x-b};b=Se}e:{for(;G;){if(G.nextSibling){G=G.nextSibling;break e}G=G.parentNode}G=void 0}G=zl(G)}}function No(b,x){return!(!b||!x)&&(b===x||(!b||3!==b.nodeType)&&(x&&3===x.nodeType?No(b,x.parentNode):"contains"in b?b.contains(x):!!b.compareDocumentPosition&&!!(16&b.compareDocumentPosition(x))))}function _a(){for(var b=window,x=Ur();x instanceof b.HTMLIFrameElement;){try{var G="string"==typeof x.contentWindow.location.href}catch(Se){G=!1}if(!G)break;x=Ur((b=x.contentWindow).document)}return x}function ll(b){var x=b&&b.nodeName&&b.nodeName.toLowerCase();return x&&("input"===x&&("text"===b.type||"search"===b.type||"tel"===b.type||"url"===b.type||"password"===b.type)||"textarea"===x||"true"===b.contentEditable)}var Ul=M&&"documentMode"in document&&11>=document.documentMode,Xs=null,vd=null,vn=null,Il=!1;function nd(b,x,G){var Se=G.window===G?G.document:9===G.nodeType?G:G.ownerDocument;Il||null==Xs||Xs!==Ur(Se)||(Se="selectionStart"in(Se=Xs)&&ll(Se)?{start:Se.selectionStart,end:Se.selectionEnd}:{anchorNode:(Se=(Se.ownerDocument&&Se.ownerDocument.defaultView||window).getSelection()).anchorNode,anchorOffset:Se.anchorOffset,focusNode:Se.focusNode,focusOffset:Se.focusOffset},vn&&Lc(vn,Se)||(vn=Se,0<(Se=yt(vd,"onSelect")).length&&(x=new Tt("onSelect","select",null,x,G),b.push({event:x,listeners:Se}),x.target=Xs)))}ne("cancel cancel click click close close contextmenu contextMenu copy copy cut cut auxclick auxClick dblclick doubleClick dragend dragEnd dragstart dragStart drop drop focusin focus focusout blur input input invalid invalid keydown keyDown keypress keyPress keyup keyUp mousedown mouseDown mouseup mouseUp paste paste pause pause play play pointercancel pointerCancel pointerdown pointerDown pointerup pointerUp ratechange rateChange reset reset seeked seeked submit submit touchcancel touchCancel touchend touchEnd touchstart touchStart volumechange volumeChange".split(" "),0),ne("drag drag dragenter dragEnter dragexit dragExit dragleave dragLeave dragover dragOver mousemove mouseMove mouseout mouseOut mouseover mouseOver pointermove pointerMove pointerout pointerOut pointerover pointerOver scroll scroll toggle toggle touchmove touchMove wheel wheel".split(" "),1),ne(on,2);for(var Vd="change selectionchange textInput compositionstart compositionend compositionupdate".split(" "),ds=0;ds<Vd.length;ds++)tt.set(Vd[ds],0);T("onMouseEnter",["mouseout","mouseover"]),T("onMouseLeave",["mouseout","mouseover"]),T("onPointerEnter",["pointerout","pointerover"]),T("onPointerLeave",["pointerout","pointerover"]),y("onChange","change click focusin focusout input keydown keyup selectionchange".split(" ")),y("onSelect","focusout contextmenu dragend focusin keydown keyup mousedown mouseup selectionchange".split(" ")),y("onBeforeInput",["compositionend","keypress","textInput","paste"]),y("onCompositionEnd","compositionend focusout keydown keypress keyup mousedown".split(" ")),y("onCompositionStart","compositionstart focusout keydown keypress keyup mousedown".split(" ")),y("onCompositionUpdate","compositionupdate focusout keydown keypress keyup mousedown".split(" "));var ca="abort canplay canplaythrough durationchange emptied encrypted ended error loadeddata loadedmetadata loadstart pause play playing progress ratechange seeked seeking stalled suspend timeupdate volumechange waiting".split(" "),jc=new Set("cancel close invalid load scroll toggle".split(" ").concat(ca));function nc(b,x,G){var Se=b.type||"unknown-event";b.currentTarget=G,function(b,x,G,Se,We,Rt,rn,xn,Er){if(Ti.apply(this,arguments),cr){if(!cr)throw Error(f(198));var Ei=yr;cr=!1,yr=null,rr||(rr=!0,ri=Ei)}}(Se,x,void 0,b),b.currentTarget=null}function df(b,x){x=0!=(4&x);for(var G=0;G<b.length;G++){var Se=b[G],We=Se.event;Se=Se.listeners;e:{var Rt=void 0;if(x)for(var rn=Se.length-1;0<=rn;rn--){var xn=Se[rn],Er=xn.instance,Ei=xn.currentTarget;if(xn=xn.listener,Er!==Rt&&We.isPropagationStopped())break e;nc(We,xn,Ei),Rt=Er}else for(rn=0;rn<Se.length;rn++){if(Er=(xn=Se[rn]).instance,Ei=xn.currentTarget,xn=xn.listener,Er!==Rt&&We.isPropagationStopped())break e;nc(We,xn,Ei),Rt=Er}}}if(rr)throw b=ri,rr=!1,ri=null,b}function ul(b,x){var G=Gc(x),Se=b+"__bubble";G.has(Se)||(Pe(x,b,2,!1),G.add(Se))}var zd="_reactListening"+Math.random().toString(36).slice(2);function Wd(b){b[zd]||(b[zd]=!0,e.forEach(function(x){jc.has(x)||Be(x,!1,b,null),Be(x,!0,b,null)}))}function Be(b,x,G,Se){var We=4<arguments.length&&void 0!==arguments[4]?arguments[4]:0,Rt=G;if("selectionchange"===b&&9!==G.nodeType&&(Rt=G.ownerDocument),null!==Se&&!x&&jc.has(b)){if("scroll"!==b)return;We|=2,Rt=Se}var rn=Gc(Rt),xn=b+"__"+(x?"capture":"bubble");rn.has(xn)||(x&&(We|=4),Pe(Rt,b,We,x),rn.add(xn))}function Pe(b,x,G,Se){var We=tt.get(x);switch(void 0===We?2:We){case 0:We=Zl;break;case 1:We=$s;break;default:We=dc}G=We.bind(null,x,G,b),We=void 0,!Si||"touchstart"!==x&&"touchmove"!==x&&"wheel"!==x||(We=!0),b.addEventListener(x,G,Se?void 0===We||{capture:!0,passive:We}:void 0!==We&&{passive:We})}function Ce(b,x,G,Se,We){var Rt=Se;if(0==(1&x)&&0==(2&x)&&null!==Se)e:for(;;){if(null===Se)return;var rn=Se.tag;if(3===rn||4===rn){var xn=Se.stateNode.containerInfo;if(xn===We||8===xn.nodeType&&xn.parentNode===We)break;if(4===rn)for(rn=Se.return;null!==rn;){var Er=rn.tag;if((3===Er||4===Er)&&((Er=rn.stateNode.containerInfo)===We||8===Er.nodeType&&Er.parentNode===We))return;rn=rn.return}for(;null!==xn;){if(null===(rn=Tc(xn)))return;if(5===(Er=rn.tag)||6===Er){Se=Rt=rn;continue e}xn=xn.parentNode}}Se=Se.return}!function(b,x,G){if(Vi)return b();Vi=!0;try{yo(b,x,G)}finally{Vi=!1,cs()}}(function(){var Ei=Rt,fs=Dr(G),Ua=[];e:{var mo=ro.get(b);if(void 0!==mo){var _o=Tt,La=b;switch(b){case"keypress":if(0===Nt(G))break e;case"keydown":case"keyup":_o=As;break;case"focusin":La="focus",_o=ec;break;case"focusout":La="blur",_o=ec;break;case"beforeblur":case"afterblur":_o=ec;break;case"click":if(2===G.button)break e;case"auxclick":case"dblclick":case"mousedown":case"mousemove":case"mouseup":case"mouseout":case"mouseover":case"contextmenu":_o=Ma;break;case"drag":case"dragend":case"dragenter":case"dragexit":case"dragleave":case"dragover":case"dragstart":case"drop":_o=Wa;break;case"touchcancel":case"touchend":case"touchmove":case"touchstart":_o=bu;break;case ks:case ms:case Co:_o=Ts;break;case kr:_o=Gs;break;case"scroll":_o=Qi;break;case"wheel":_o=Hu;break;case"copy":case"cut":case"paste":_o=Ec;break;case"gotpointercapture":case"lostpointercapture":case"pointercancel":case"pointerdown":case"pointermove":case"pointerout":case"pointerover":case"pointerup":_o=bl}var Sa=0!=(4&x),ti=!Sa&&"scroll"===b,Sr=Sa?null!==mo?mo+"Capture":null:mo;Sa=[];for(var Bi,Wr=Ei;null!==Wr;){var ao=(Bi=Wr).stateNode;if(5===Bi.tag&&null!==ao&&(Bi=ao,null!==Sr&&null!=(ao=So(Wr,Sr))&&Sa.push(it(Wr,ao,Bi))),ti)break;Wr=Wr.return}0<Sa.length&&(mo=new _o(mo,La,null,G,fs),Ua.push({event:mo,listeners:Sa}))}}if(0==(7&x)){if(_o="mouseout"===b||"pointerout"===b,(!(mo="mouseover"===b||"pointerover"===b)||0!=(16&x)||!(La=G.relatedTarget||G.fromElement)||!Tc(La)&&!La[Dd])&&(_o||mo)&&(mo=fs.window===fs?fs:(mo=fs.ownerDocument)?mo.defaultView||mo.parentWindow:window,_o?(_o=Ei,null!==(La=(La=G.relatedTarget||G.toElement)?Tc(La):null)&&(La!==(ti=xo(La))||5!==La.tag&&6!==La.tag)&&(La=null)):(_o=null,La=Ei),_o!==La)){if(Sa=Ma,ao="onMouseLeave",Sr="onMouseEnter",Wr="mouse",("pointerout"===b||"pointerover"===b)&&(Sa=bl,ao="onPointerLeave",Sr="onPointerEnter",Wr="pointer"),ti=null==_o?mo:Sc(_o),Bi=null==La?mo:Sc(La),(mo=new Sa(ao,Wr+"leave",_o,G,fs)).target=ti,mo.relatedTarget=Bi,ao=null,Tc(fs)===Ei&&((Sa=new Sa(Sr,Wr+"enter",La,G,fs)).target=Bi,Sa.relatedTarget=ti,ao=Sa),ti=ao,_o&&La)t:{for(Sr=La,Wr=0,Bi=Sa=_o;Bi;Bi=qt(Bi))Wr++;for(Bi=0,ao=Sr;ao;ao=qt(ao))Bi++;for(;0<Wr-Bi;)Sa=qt(Sa),Wr--;for(;0<Bi-Wr;)Sr=qt(Sr),Bi--;for(;Wr--;){if(Sa===Sr||null!==Sr&&Sa===Sr.alternate)break t;Sa=qt(Sa),Sr=qt(Sr)}Sa=null}else Sa=null;null!==_o&&Un(Ua,mo,_o,Sa,!1),null!==La&&null!==ti&&Un(Ua,ti,La,Sa,!0)}if("select"===(_o=(mo=Ei?Sc(Ei):window).nodeName&&mo.nodeName.toLowerCase())||"input"===_o&&"file"===mo.type)var ba=Vr;else if(ot(mo))if(_i)ba=Na;else{ba=co;var Os=gr}else(_o=mo.nodeName)&&"input"===_o.toLowerCase()&&("checkbox"===mo.type||"radio"===mo.type)&&(ba=Ss);switch(ba&&(ba=ba(b,Ei))?_t(Ua,ba,G,fs):(Os&&Os(b,mo,Ei),"focusout"===b&&(Os=mo._wrapperState)&&Os.controlled&&"number"===mo.type&&Wt(mo,"number",mo.value)),Os=Ei?Sc(Ei):window,b){case"focusin":(ot(Os)||"true"===Os.contentEditable)&&(Xs=Os,vd=Ei,vn=null);break;case"focusout":vn=vd=Xs=null;break;case"mousedown":Il=!0;break;case"contextmenu":case"mouseup":case"dragend":Il=!1,nd(Ua,G,fs);break;case"selectionchange":if(Ul)break;case"keydown":case"keyup":nd(Ua,G,fs)}var Xa;if(du)e:{switch(b){case"compositionstart":var Dl="onCompositionStart";break e;case"compositionend":Dl="onCompositionEnd";break e;case"compositionupdate":Dl="onCompositionUpdate";break e}Dl=void 0}else Vl?Ja(b,G)&&(Dl="onCompositionEnd"):"keydown"===b&&229===G.keyCode&&(Dl="onCompositionStart");Dl&&(_u&&"ko"!==G.locale&&(Vl||"onCompositionStart"!==Dl?"onCompositionEnd"===Dl&&Vl&&(Xa=rt()):(Cu="value"in(el=fs)?el.value:el.textContent,Vl=!0)),0<(Os=yt(Ei,Dl)).length&&(Dl=new Mu(Dl,b,null,G,fs),Ua.push({event:Dl,listeners:Os}),(Xa||null!==(Xa=hl(G)))&&(Dl.data=Xa))),(Xa=ha?function(b,x){switch(b){case"compositionend":return hl(x);case"keypress":return 32!==x.which?null:(Gl=!0,fa);case"textInput":return(b=x.data)===fa&&Gl?null:b;default:return null}}(b,G):function(b,x){if(Vl)return"compositionend"===b||!du&&Ja(b,x)?(b=rt(),jl=Cu=el=null,Vl=!1,b):null;switch(b){case"paste":return null;case"keypress":if(!(x.ctrlKey||x.altKey||x.metaKey)||x.ctrlKey&&x.altKey){if(x.char&&1<x.char.length)return x.char;if(x.which)return String.fromCharCode(x.which)}return null;case"compositionend":return _u&&"ko"!==x.locale?null:x.data;default:return null}}(b,G))&&0<(Ei=yt(Ei,"onBeforeInput")).length&&(fs=new Mu("onBeforeInput","beforeinput",null,G,fs),Ua.push({event:fs,listeners:Ei}),fs.data=Xa)}df(Ua,x)})}function it(b,x,G){return{instance:b,listener:x,currentTarget:G}}function yt(b,x){for(var G=x+"Capture",Se=[];null!==b;){var We=b,Rt=We.stateNode;5===We.tag&&null!==Rt&&(We=Rt,null!=(Rt=So(b,G))&&Se.unshift(it(b,Rt,We)),null!=(Rt=So(b,x))&&Se.push(it(b,Rt,We))),b=b.return}return Se}function qt(b){if(null===b)return null;do{b=b.return}while(b&&5!==b.tag);return b||null}function Un(b,x,G,Se,We){for(var Rt=x._reactName,rn=[];null!==G&&G!==Se;){var xn=G,Er=xn.alternate,Ei=xn.stateNode;if(null!==Er&&Er===Se)break;5===xn.tag&&null!==Ei&&(xn=Ei,We?null!=(Er=So(G,Rt))&&rn.unshift(it(G,Er,xn)):We||null!=(Er=So(G,Rt))&&rn.push(it(G,Er,xn))),G=G.return}0!==rn.length&&b.push({event:x,listeners:rn})}function qn(){}var yi=null,Go=null;function ka(b,x){switch(b){case"button":case"input":case"select":case"textarea":return!!x.autoFocus}return!1}function ss(b,x){return"textarea"===b||"option"===b||"noscript"===b||"string"==typeof x.children||"number"==typeof x.children||"object"==typeof x.dangerouslySetInnerHTML&&null!==x.dangerouslySetInnerHTML&&null!=x.dangerouslySetInnerHTML.__html}var Oa="function"==typeof setTimeout?setTimeout:void 0,Us="function"==typeof clearTimeout?clearTimeout:void 0;function fc(b){(1===b.nodeType||9===b.nodeType&&null!=(b=b.body))&&(b.textContent="")}function va(b){for(;null!=b;b=b.nextSibling){var x=b.nodeType;if(1===x||3===x)break}return b}function wl(b){b=b.previousSibling;for(var x=0;b;){if(8===b.nodeType){var G=b.data;if("$"===G||"$!"===G||"$?"===G){if(0===x)return b;x--}else"/$"===G&&x++}b=b.previousSibling}return null}var tl=0,Ha=Math.random().toString(36).slice(2),nl="__reactFiber$"+Ha,Of="__reactProps$"+Ha,Dd="__reactContainer$"+Ha,Jd="__reactEvents$"+Ha;function Tc(b){var x=b[nl];if(x)return x;for(var G=b.parentNode;G;){if(x=G[Dd]||G[nl]){if(G=x.alternate,null!==x.child||null!==G&&null!==G.child)for(b=wl(b);null!==b;){if(G=b[nl])return G;b=wl(b)}return x}G=(b=G).parentNode}return null}function Vu(b){return!(b=b[nl]||b[Dd])||5!==b.tag&&6!==b.tag&&13!==b.tag&&3!==b.tag?null:b}function Sc(b){if(5===b.tag||6===b.tag)return b.stateNode;throw Error(f(33))}function Qd(b){return b[Of]||null}function Gc(b){var x=b[Jd];return void 0===x&&(x=b[Jd]=new Set),x}var Ff=[],zu=-1;function Tl(b){return{current:b}}function xl(b){0>zu||(b.current=Ff[zu],Ff[zu]=null,zu--)}function kl(b,x){zu++,Ff[zu]=b.current,b.current=x}var Nu={},Qa=Tl(Nu),Wu=Tl(!1),tn=Nu;function Mc(b,x){var G=b.type.contextTypes;if(!G)return Nu;var Se=b.stateNode;if(Se&&Se.__reactInternalMemoizedUnmaskedChildContext===x)return Se.__reactInternalMemoizedMaskedChildContext;var Rt,We={};for(Rt in G)We[Rt]=x[Rt];return Se&&((b=b.stateNode).__reactInternalMemoizedUnmaskedChildContext=x,b.__reactInternalMemoizedMaskedChildContext=We),We}function Ou(b){return null!=b.childContextTypes}function Pu(){xl(Wu),xl(Qa)}function rl(b,x,G){if(Qa.current!==Nu)throw Error(f(168));kl(Qa,x),kl(Wu,G)}function ff(b,x,G){var Se=b.stateNode;if(b=x.childContextTypes,"function"!=typeof Se.getChildContext)return G;for(var We in Se=Se.getChildContext())if(!(We in b))throw Error(f(108,wr(x)||"Unknown",We));return u({},G,Se)}function Xl(b){return b=(b=b.stateNode)&&b.__reactInternalMemoizedMergedChildContext||Nu,tn=Qa.current,kl(Qa,b),kl(Wu,Wu.current),!0}function yd(b,x,G){var Se=b.stateNode;if(!Se)throw Error(f(169));G?(b=ff(b,x,tn),Se.__reactInternalMemoizedMergedChildContext=b,xl(Wu),xl(Qa),kl(Qa,b)):xl(Wu),kl(Wu,G)}var Ac=null,Vc=null,pf=p.unstable_runWithPriority,Oc=p.unstable_scheduleCallback,hf=p.unstable_cancelCallback,zc=p.unstable_shouldYield,su=p.unstable_requestPaint,bd=p.unstable_now,kp=p.unstable_getCurrentPriorityLevel,dp=p.unstable_ImmediatePriority,_f=p.unstable_UserBlockingPriority,Mh=p.unstable_NormalPriority,Kl=p.unstable_LowPriority,kf=p.unstable_IdlePriority,Uu={},Xf=void 0!==su?su:function(){},Rd=null,wc=null,ql=!1,Ji=bd(),cl=1e4>Ji?bd:function(){return bd()-Ji};function Ll(){switch(kp()){case dp:return 99;case _f:return 98;case Mh:return 97;case Kl:return 96;case kf:return 95;default:throw Error(f(332))}}function Nd(b){switch(b){case 99:return dp;case 98:return _f;case 97:return Mh;case 96:return Kl;case 95:return kf;default:throw Error(f(332))}}function il(b,x){return b=Nd(b),pf(b,x)}function Bu(b,x,G){return b=Nd(b),Oc(b,x,G)}function pc(){if(null!==wc){var b=wc;wc=null,hf(b)}Xd()}function Xd(){if(!ql&&null!==Rd){ql=!0;var b=0;try{var x=Rd;il(99,function(){for(;b<x.length;b++){var G=x[b];do{G=G(!0)}while(null!==G)}}),Rd=null}catch(G){throw null!==Rd&&(Rd=Rd.slice(b+1)),Oc(dp,pc),G}finally{ql=!1}}}var wf=he.ReactCurrentBatchConfig;function Wl(b,x){if(b&&b.defaultProps){for(var G in x=u({},x),b=b.defaultProps)void 0===x[G]&&(x[G]=b[G]);return x}return x}var Pd=Tl(null),rc=null,hc=null,gu=null;function Cc(){gu=hc=rc=null}function Fc(b){var x=Pd.current;xl(Pd),b.type._context._currentValue=x}function fu(b,x){for(;null!==b;){var G=b.alternate;if((b.childLanes&x)===x){if(null===G||(G.childLanes&x)===x)break;G.childLanes|=x}else b.childLanes|=x,null!==G&&(G.childLanes|=x);b=b.return}}function Id(b,x){rc=b,gu=hc=null,null!==(b=b.dependencies)&&null!==b.firstContext&&(0!=(b.lanes&x)&&(Kd=!0),b.firstContext=null)}function Sl(b,x){if(gu!==b&&!1!==x&&0!==x)if(("number"!=typeof x||1073741823===x)&&(gu=b,x=1073741823),x={context:b,observedBits:x,next:null},null===hc){if(null===rc)throw Error(f(308));hc=x,rc.dependencies={lanes:0,firstContext:x,responders:null}}else hc=hc.next=x;return b._currentValue}var kc=!1;function $c(b){b.updateQueue={baseState:b.memoizedState,firstBaseUpdate:null,lastBaseUpdate:null,shared:{pending:null},effects:null}}function h(b,x){x.updateQueue===(b=b.updateQueue)&&(x.updateQueue={baseState:b.baseState,firstBaseUpdate:b.firstBaseUpdate,lastBaseUpdate:b.lastBaseUpdate,shared:b.shared,effects:b.effects})}function E(b,x){return{eventTime:b,lane:x,tag:0,payload:null,callback:null,next:null}}function N(b,x){if(null!==(b=b.updateQueue)){var G=(b=b.shared).pending;null===G?x.next=x:(x.next=G.next,G.next=x),b.pending=x}}function k(b,x){var G=b.updateQueue,Se=b.alternate;if(null===Se||G!==(Se=Se.updateQueue))null===(b=G.lastBaseUpdate)?G.firstBaseUpdate=x:b.next=x,G.lastBaseUpdate=x;else{var We=null,Rt=null;if(null!==(G=G.firstBaseUpdate)){do{var rn={eventTime:G.eventTime,lane:G.lane,tag:G.tag,payload:G.payload,callback:G.callback,next:null};null===Rt?We=Rt=rn:Rt=Rt.next=rn,G=G.next}while(null!==G);null===Rt?We=Rt=x:Rt=Rt.next=x}else We=Rt=x;b.updateQueue=G={baseState:Se.baseState,firstBaseUpdate:We,lastBaseUpdate:Rt,shared:Se.shared,effects:Se.effects}}}function K(b,x,G,Se){var We=b.updateQueue;kc=!1;var Rt=We.firstBaseUpdate,rn=We.lastBaseUpdate,xn=We.shared.pending;if(null!==xn){We.shared.pending=null;var Er=xn,Ei=Er.next;Er.next=null,null===rn?Rt=Ei:rn.next=Ei,rn=Er;var fs=b.alternate;if(null!==fs){var Ua=(fs=fs.updateQueue).lastBaseUpdate;Ua!==rn&&(null===Ua?fs.firstBaseUpdate=Ei:Ua.next=Ei,fs.lastBaseUpdate=Er)}}if(null!==Rt){for(Ua=We.baseState,rn=0,fs=Ei=Er=null;;){var mo=Rt.eventTime;if((Se&(xn=Rt.lane))===xn){null!==fs&&(fs=fs.next={eventTime:mo,lane:0,tag:Rt.tag,payload:Rt.payload,callback:Rt.callback,next:null});e:{var _o=b,La=Rt;switch(xn=x,mo=G,La.tag){case 1:if("function"==typeof(_o=La.payload)){Ua=_o.call(mo,Ua,xn);break e}Ua=_o;break e;case 3:_o.flags=-4097&_o.flags|64;case 0:if(null==(xn="function"==typeof(_o=La.payload)?_o.call(mo,Ua,xn):_o))break e;Ua=u({},Ua,xn);break e;case 2:kc=!0}}null!==Rt.callback&&(b.flags|=32,null===(xn=We.effects)?We.effects=[Rt]:xn.push(Rt))}else mo={eventTime:mo,lane:xn,tag:Rt.tag,payload:Rt.payload,callback:Rt.callback,next:null},null===fs?(Ei=fs=mo,Er=Ua):fs=fs.next=mo,rn|=xn;if(null===(Rt=Rt.next)){if(null===(xn=We.shared.pending))break;Rt=xn.next,xn.next=null,We.lastBaseUpdate=xn,We.shared.pending=null}}null===fs&&(Er=Ua),We.baseState=Er,We.firstBaseUpdate=Ei,We.lastBaseUpdate=fs,Zf|=rn,b.lanes=rn,b.memoizedState=Ua}}function de(b,x,G){if(b=x.effects,x.effects=null,null!==b)for(x=0;x<b.length;x++){var Se=b[x],We=Se.callback;if(null!==We){if(Se.callback=null,Se=G,"function"!=typeof We)throw Error(f(191,We));We.call(Se)}}}var be=(new r.Component).refs;function Ue(b,x,G,Se){G=null==(G=G(Se,x=b.memoizedState))?x:u({},x,G),b.memoizedState=G,0===b.lanes&&(b.updateQueue.baseState=G)}var we={isMounted:function(b){return!!(b=b._reactInternals)&&xo(b)===b},enqueueSetState:function(b,x,G){b=b._reactInternals;var Se=fd(),We=bf(b),Rt=E(Se,We);Rt.payload=x,null!=G&&(Rt.callback=G),N(b,Rt),Gf(b,We,Se)},enqueueReplaceState:function(b,x,G){b=b._reactInternals;var Se=fd(),We=bf(b),Rt=E(Se,We);Rt.tag=1,Rt.payload=x,null!=G&&(Rt.callback=G),N(b,Rt),Gf(b,We,Se)},enqueueForceUpdate:function(b,x){b=b._reactInternals;var G=fd(),Se=bf(b),We=E(G,Se);We.tag=2,null!=x&&(We.callback=x),N(b,We),Gf(b,Se,G)}};function Xe(b,x,G,Se,We,Rt,rn){return"function"==typeof(b=b.stateNode).shouldComponentUpdate?b.shouldComponentUpdate(Se,Rt,rn):!(x.prototype&&x.prototype.isPureReactComponent&&Lc(G,Se)&&Lc(We,Rt))}function gt(b,x,G){var Se=!1,We=Nu,Rt=x.contextType;return"object"==typeof Rt&&null!==Rt?Rt=Sl(Rt):(We=Ou(x)?tn:Qa.current,Rt=(Se=null!=(Se=x.contextTypes))?Mc(b,We):Nu),x=new x(G,Rt),b.memoizedState=null!=x.state?x.state:null,x.updater=we,b.stateNode=x,x._reactInternals=b,Se&&((b=b.stateNode).__reactInternalMemoizedUnmaskedChildContext=We,b.__reactInternalMemoizedMaskedChildContext=Rt),x}function vt(b,x,G,Se){b=x.state,"function"==typeof x.componentWillReceiveProps&&x.componentWillReceiveProps(G,Se),"function"==typeof x.UNSAFE_componentWillReceiveProps&&x.UNSAFE_componentWillReceiveProps(G,Se),x.state!==b&&we.enqueueReplaceState(x,x.state,null)}function Jt(b,x,G,Se){var We=b.stateNode;We.props=G,We.state=b.memoizedState,We.refs=be,$c(b);var Rt=x.contextType;"object"==typeof Rt&&null!==Rt?We.context=Sl(Rt):(Rt=Ou(x)?tn:Qa.current,We.context=Mc(b,Rt)),K(b,G,We,Se),We.state=b.memoizedState,"function"==typeof(Rt=x.getDerivedStateFromProps)&&(Ue(b,x,Rt,G),We.state=b.memoizedState),"function"==typeof x.getDerivedStateFromProps||"function"==typeof We.getSnapshotBeforeUpdate||"function"!=typeof We.UNSAFE_componentWillMount&&"function"!=typeof We.componentWillMount||(x=We.state,"function"==typeof We.componentWillMount&&We.componentWillMount(),"function"==typeof We.UNSAFE_componentWillMount&&We.UNSAFE_componentWillMount(),x!==We.state&&we.enqueueReplaceState(We,We.state,null),K(b,G,We,Se),We.state=b.memoizedState),"function"==typeof We.componentDidMount&&(b.flags|=4)}var Pn=Array.isArray;function Rn(b,x,G){if(null!==(b=G.ref)&&"function"!=typeof b&&"object"!=typeof b){if(G._owner){if(G=G._owner){if(1!==G.tag)throw Error(f(309));var Se=G.stateNode}if(!Se)throw Error(f(147,b));var We=""+b;return null!==x&&null!==x.ref&&"function"==typeof x.ref&&x.ref._stringRef===We?x.ref:((x=function(Rt){var rn=Se.refs;rn===be&&(rn=Se.refs={}),null===Rt?delete rn[We]:rn[We]=Rt})._stringRef=We,x)}if("string"!=typeof b)throw Error(f(284));if(!G._owner)throw Error(f(290,b))}return b}function sr(b,x){if("textarea"!==b.type)throw Error(f(31,"[object Object]"===Object.prototype.toString.call(x)?"object with keys {"+Object.keys(x).join(", ")+"}":x))}function jr(b){function x(ti,Sr){if(b){var Wr=ti.lastEffect;null!==Wr?(Wr.nextEffect=Sr,ti.lastEffect=Sr):ti.firstEffect=ti.lastEffect=Sr,Sr.nextEffect=null,Sr.flags=8}}function G(ti,Sr){if(!b)return null;for(;null!==Sr;)x(ti,Sr),Sr=Sr.sibling;return null}function Se(ti,Sr){for(ti=new Map;null!==Sr;)ti.set(null!==Sr.key?Sr.key:Sr.index,Sr),Sr=Sr.sibling;return ti}function We(ti,Sr){return(ti=Tp(ti,Sr)).index=0,ti.sibling=null,ti}function Rt(ti,Sr,Wr){return ti.index=Wr,b?null!==(Wr=ti.alternate)?(Wr=Wr.index)<Sr?(ti.flags=2,Sr):Wr:(ti.flags=2,Sr):Sr}function rn(ti){return b&&null===ti.alternate&&(ti.flags=2),ti}function xn(ti,Sr,Wr,Bi){return null===Sr||6!==Sr.tag?((Sr=kh(Wr,ti.mode,Bi)).return=ti,Sr):((Sr=We(Sr,Wr)).return=ti,Sr)}function Er(ti,Sr,Wr,Bi){return null!==Sr&&Sr.elementType===Wr.type?((Bi=We(Sr,Wr.props)).ref=Rn(ti,Sr,Wr),Bi.return=ti,Bi):((Bi=f_(Wr.type,Wr.key,Wr.props,null,ti.mode,Bi)).ref=Rn(ti,Sr,Wr),Bi.return=ti,Bi)}function Ei(ti,Sr,Wr,Bi){return null===Sr||4!==Sr.tag||Sr.stateNode.containerInfo!==Wr.containerInfo||Sr.stateNode.implementation!==Wr.implementation?((Sr=$h(Wr,ti.mode,Bi)).return=ti,Sr):((Sr=We(Sr,Wr.children||[])).return=ti,Sr)}function fs(ti,Sr,Wr,Bi,ao){return null===Sr||7!==Sr.tag?((Sr=Qc(Wr,ti.mode,Bi,ao)).return=ti,Sr):((Sr=We(Sr,Wr)).return=ti,Sr)}function Ua(ti,Sr,Wr){if("string"==typeof Sr||"number"==typeof Sr)return(Sr=kh(""+Sr,ti.mode,Wr)).return=ti,Sr;if("object"==typeof Sr&&null!==Sr){switch(Sr.$$typeof){case me:return(Wr=f_(Sr.type,Sr.key,Sr.props,null,ti.mode,Wr)).ref=Rn(ti,null,Sr),Wr.return=ti,Wr;case Oe:return(Sr=$h(Sr,ti.mode,Wr)).return=ti,Sr}if(Pn(Sr)||Dt(Sr))return(Sr=Qc(Sr,ti.mode,Wr,null)).return=ti,Sr;sr(ti,Sr)}return null}function mo(ti,Sr,Wr,Bi){var ao=null!==Sr?Sr.key:null;if("string"==typeof Wr||"number"==typeof Wr)return null!==ao?null:xn(ti,Sr,""+Wr,Bi);if("object"==typeof Wr&&null!==Wr){switch(Wr.$$typeof){case me:return Wr.key===ao?Wr.type===ce?fs(ti,Sr,Wr.props.children,Bi,ao):Er(ti,Sr,Wr,Bi):null;case Oe:return Wr.key===ao?Ei(ti,Sr,Wr,Bi):null}if(Pn(Wr)||Dt(Wr))return null!==ao?null:fs(ti,Sr,Wr,Bi,null);sr(ti,Wr)}return null}function _o(ti,Sr,Wr,Bi,ao){if("string"==typeof Bi||"number"==typeof Bi)return xn(Sr,ti=ti.get(Wr)||null,""+Bi,ao);if("object"==typeof Bi&&null!==Bi){switch(Bi.$$typeof){case me:return ti=ti.get(null===Bi.key?Wr:Bi.key)||null,Bi.type===ce?fs(Sr,ti,Bi.props.children,ao,Bi.key):Er(Sr,ti,Bi,ao);case Oe:return Ei(Sr,ti=ti.get(null===Bi.key?Wr:Bi.key)||null,Bi,ao)}if(Pn(Bi)||Dt(Bi))return fs(Sr,ti=ti.get(Wr)||null,Bi,ao,null);sr(Sr,Bi)}return null}return function(ti,Sr,Wr,Bi){var ao="object"==typeof Wr&&null!==Wr&&Wr.type===ce&&null===Wr.key;ao&&(Wr=Wr.props.children);var ba="object"==typeof Wr&&null!==Wr;if(ba)switch(Wr.$$typeof){case me:e:{for(ba=Wr.key,ao=Sr;null!==ao;){if(ao.key===ba){switch(ao.tag){case 7:if(Wr.type===ce){G(ti,ao.sibling),(Sr=We(ao,Wr.props.children)).return=ti,ti=Sr;break e}break;default:if(ao.elementType===Wr.type){G(ti,ao.sibling),(Sr=We(ao,Wr.props)).ref=Rn(ti,ao,Wr),Sr.return=ti,ti=Sr;break e}}G(ti,ao);break}x(ti,ao),ao=ao.sibling}Wr.type===ce?((Sr=Qc(Wr.props.children,ti.mode,Bi,Wr.key)).return=ti,ti=Sr):((Bi=f_(Wr.type,Wr.key,Wr.props,null,ti.mode,Bi)).ref=Rn(ti,Sr,Wr),Bi.return=ti,ti=Bi)}return rn(ti);case Oe:e:{for(ao=Wr.key;null!==Sr;){if(Sr.key===ao){if(4===Sr.tag&&Sr.stateNode.containerInfo===Wr.containerInfo&&Sr.stateNode.implementation===Wr.implementation){G(ti,Sr.sibling),(Sr=We(Sr,Wr.children||[])).return=ti,ti=Sr;break e}G(ti,Sr);break}x(ti,Sr),Sr=Sr.sibling}(Sr=$h(Wr,ti.mode,Bi)).return=ti,ti=Sr}return rn(ti)}if("string"==typeof Wr||"number"==typeof Wr)return Wr=""+Wr,null!==Sr&&6===Sr.tag?(G(ti,Sr.sibling),(Sr=We(Sr,Wr)).return=ti,ti=Sr):(G(ti,Sr),(Sr=kh(Wr,ti.mode,Bi)).return=ti,ti=Sr),rn(ti);if(Pn(Wr))return function(ti,Sr,Wr,Bi){for(var ao=null,ba=null,Os=Sr,Xa=Sr=0,Dl=null;null!==Os&&Xa<Wr.length;Xa++){Os.index>Xa?(Dl=Os,Os=null):Dl=Os.sibling;var Cl=mo(ti,Os,Wr[Xa],Bi);if(null===Cl){null===Os&&(Os=Dl);break}b&&Os&&null===Cl.alternate&&x(ti,Os),Sr=Rt(Cl,Sr,Xa),null===ba?ao=Cl:ba.sibling=Cl,ba=Cl,Os=Dl}if(Xa===Wr.length)return G(ti,Os),ao;if(null===Os){for(;Xa<Wr.length;Xa++)null!==(Os=Ua(ti,Wr[Xa],Bi))&&(Sr=Rt(Os,Sr,Xa),null===ba?ao=Os:ba.sibling=Os,ba=Os);return ao}for(Os=Se(ti,Os);Xa<Wr.length;Xa++)null!==(Dl=_o(Os,ti,Xa,Wr[Xa],Bi))&&(b&&null!==Dl.alternate&&Os.delete(null===Dl.key?Xa:Dl.key),Sr=Rt(Dl,Sr,Xa),null===ba?ao=Dl:ba.sibling=Dl,ba=Dl);return b&&Os.forEach(function(jp){return x(ti,jp)}),ao}(ti,Sr,Wr,Bi);if(Dt(Wr))return function(ti,Sr,Wr,Bi){var ao=Dt(Wr);if("function"!=typeof ao)throw Error(f(150));if(null==(Wr=ao.call(Wr)))throw Error(f(151));for(var ba=ao=null,Os=Sr,Xa=Sr=0,Dl=null,Cl=Wr.next();null!==Os&&!Cl.done;Xa++,Cl=Wr.next()){Os.index>Xa?(Dl=Os,Os=null):Dl=Os.sibling;var jp=mo(ti,Os,Cl.value,Bi);if(null===jp){null===Os&&(Os=Dl);break}b&&Os&&null===jp.alternate&&x(ti,Os),Sr=Rt(jp,Sr,Xa),null===ba?ao=jp:ba.sibling=jp,ba=jp,Os=Dl}if(Cl.done)return G(ti,Os),ao;if(null===Os){for(;!Cl.done;Xa++,Cl=Wr.next())null!==(Cl=Ua(ti,Cl.value,Bi))&&(Sr=Rt(Cl,Sr,Xa),null===ba?ao=Cl:ba.sibling=Cl,ba=Cl);return ao}for(Os=Se(ti,Os);!Cl.done;Xa++,Cl=Wr.next())null!==(Cl=_o(Os,ti,Xa,Cl.value,Bi))&&(b&&null!==Cl.alternate&&Os.delete(null===Cl.key?Xa:Cl.key),Sr=Rt(Cl,Sr,Xa),null===ba?ao=Cl:ba.sibling=Cl,ba=Cl);return b&&Os.forEach(function(d1){return x(ti,d1)}),ao}(ti,Sr,Wr,Bi);if(ba&&sr(ti,Wr),void 0===Wr&&!ao)switch(ti.tag){case 1:case 22:case 0:case 11:case 15:throw Error(f(152,wr(ti.type)||"Component"))}return G(ti,Sr)}}var Ni=jr(!0),Vo=jr(!1),$o={},Vs=Tl($o),qs=Tl($o),dl=Tl($o);function ga(b){if(b===$o)throw Error(f(174));return b}function sa(b,x){switch(kl(dl,x),kl(qs,b),kl(Vs,$o),b=x.nodeType){case 9:case 11:x=(x=x.documentElement)?x.namespaceURI:gn(null,"");break;default:x=gn(x=(b=8===b?x.parentNode:x).namespaceURI||null,b=b.tagName)}xl(Vs),kl(Vs,x)}function Pa(){xl(Vs),xl(qs),xl(dl)}function ol(b){ga(dl.current);var x=ga(Vs.current),G=gn(x,b.type);x!==G&&(kl(qs,b),kl(Vs,G))}function Eu(b){qs.current===b&&(xl(Vs),xl(qs))}var wa=Tl(0);function au(b){for(var x=b;null!==x;){if(13===x.tag){var G=x.memoizedState;if(null!==G&&(null===(G=G.dehydrated)||"$?"===G.data||"$!"===G.data))return x}else if(19===x.tag&&void 0!==x.memoizedProps.revealOrder){if(0!=(64&x.flags))return x}else if(null!==x.child){x.child.return=x,x=x.child;continue}if(x===b)break;for(;null===x.sibling;){if(null===x.return||x.return===b)return null;x=x.return}x.sibling.return=x.return,x=x.sibling}return null}var mu=null,xc=null,ic=!1;function gf(b,x){var G=Yd(5,null,null,0);G.elementType="DELETED",G.type="DELETED",G.stateNode=x,G.return=b,G.flags=8,null!==b.lastEffect?(b.lastEffect.nextEffect=G,b.lastEffect=G):b.firstEffect=b.lastEffect=G}function Ga(b,x){switch(b.tag){case 5:return null!==(x=1!==x.nodeType||b.type.toLowerCase()!==x.nodeName.toLowerCase()?null:x)&&(b.stateNode=x,!0);case 6:return null!==(x=""===b.pendingProps||3!==x.nodeType?null:x)&&(b.stateNode=x,!0);case 13:default:return!1}}function X(b){if(ic){var x=xc;if(x){var G=x;if(!Ga(b,x)){if(!(x=va(G.nextSibling))||!Ga(b,x))return b.flags=-1025&b.flags|2,ic=!1,void(mu=b);gf(mu,G)}mu=b,xc=va(x.firstChild)}else b.flags=-1025&b.flags|2,ic=!1,mu=b}}function ye(b){for(b=b.return;null!==b&&5!==b.tag&&3!==b.tag&&13!==b.tag;)b=b.return;mu=b}function nt(b){if(b!==mu)return!1;if(!ic)return ye(b),ic=!0,!1;var x=b.type;if(5!==b.tag||"head"!==x&&"body"!==x&&!ss(x,b.memoizedProps))for(x=xc;x;)gf(b,x),x=va(x.nextSibling);if(ye(b),13===b.tag){if(!(b=null!==(b=b.memoizedState)?b.dehydrated:null))throw Error(f(317));e:{for(b=b.nextSibling,x=0;b;){if(8===b.nodeType){var G=b.data;if("/$"===G){if(0===x){xc=va(b.nextSibling);break e}x--}else"$"!==G&&"$!"!==G&&"$?"!==G||x++}b=b.nextSibling}xc=null}}else xc=mu?va(b.stateNode.nextSibling):null;return!0}function bt(){xc=mu=null,ic=!1}var Qt=[];function fr(){for(var b=0;b<Qt.length;b++)Qt[b]._workInProgressVersionPrimary=null;Qt.length=0}var vi=he.ReactCurrentDispatcher,ps=he.ReactCurrentBatchConfig,xa=0,ia=null,_l=null,Jl=null,Wc=!1,Kf=!1;function Ld(){throw Error(f(321))}function $p(b,x){if(null===x)return!1;for(var G=0;G<x.length&&G<b.length;G++)if(!Ks(b[G],x[G]))return!1;return!0}function Hp(b,x,G,Se,We,Rt){if(xa=Rt,ia=x,x.memoizedState=null,x.updateQueue=null,x.lanes=0,vi.current=null===b||null===b.memoizedState?Dh:$d,b=G(Se,We),Kf){Rt=0;do{if(Kf=!1,!(25>Rt))throw Error(f(301));Rt+=1,Jl=_l=null,x.updateQueue=null,vi.current=pp,b=G(Se,We)}while(Kf)}if(vi.current=vf,x=null!==_l&&null!==_l.next,xa=0,Jl=_l=ia=null,Wc=!1,x)throw Error(f(300));return b}function mf(){var b={memoizedState:null,baseState:null,baseQueue:null,queue:null,next:null};return null===Jl?ia.memoizedState=Jl=b:Jl=Jl.next=b,Jl}function $f(){if(null===_l){var b=ia.alternate;b=null!==b?b.memoizedState:null}else b=_l.next;var x=null===Jl?ia.memoizedState:Jl.next;if(null!==x)Jl=x,_l=b;else{if(null===b)throw Error(f(310));b={memoizedState:(_l=b).memoizedState,baseState:_l.baseState,baseQueue:_l.baseQueue,queue:_l.queue,next:null},null===Jl?ia.memoizedState=Jl=b:Jl=Jl.next=b}return Jl}function dd(b,x){return"function"==typeof x?x(b):x}function Fd(b){var x=$f(),G=x.queue;if(null===G)throw Error(f(311));G.lastRenderedReducer=b;var Se=_l,We=Se.baseQueue,Rt=G.pending;if(null!==Rt){if(null!==We){var rn=We.next;We.next=Rt.next,Rt.next=rn}Se.baseQueue=We=Rt,G.pending=null}if(null!==We){Se=Se.baseState;var xn=rn=Rt=null,Er=We=We.next;do{var Ei=Er.lane;if((xa&Ei)===Ei)null!==xn&&(xn=xn.next={lane:0,action:Er.action,eagerReducer:Er.eagerReducer,eagerState:Er.eagerState,next:null}),Se=Er.eagerReducer===b?Er.eagerState:b(Se,Er.action);else{var fs={lane:Ei,action:Er.action,eagerReducer:Er.eagerReducer,eagerState:Er.eagerState,next:null};null===xn?(rn=xn=fs,Rt=Se):xn=xn.next=fs,ia.lanes|=Ei,Zf|=Ei}Er=Er.next}while(null!==Er&&Er!==We);null===xn?Rt=Se:xn.next=rn,Ks(Se,x.memoizedState)||(Kd=!0),x.memoizedState=Se,x.baseState=Rt,x.baseQueue=xn,G.lastRenderedState=Se}return[x.memoizedState,G.dispatch]}function fp(b){var x=$f(),G=x.queue;if(null===G)throw Error(f(311));G.lastRenderedReducer=b;var Se=G.dispatch,We=G.pending,Rt=x.memoizedState;if(null!==We){G.pending=null;var rn=We=We.next;do{Rt=b(Rt,rn.action),rn=rn.next}while(rn!==We);Ks(Rt,x.memoizedState)||(Kd=!0),x.memoizedState=Rt,null===x.baseQueue&&(x.baseState=Rt),G.lastRenderedState=Rt}return[Rt,Se]}function fl(b,x,G){var Se=x._getVersion;Se=Se(x._source);var We=x._workInProgressVersionPrimary;if(null!==We?b=We===Se:(b=(xa&(b=b.mutableReadLanes))===b)&&(x._workInProgressVersionPrimary=Se,Qt.push(x)),b)return G(x._source);throw Qt.push(x),Error(f(350))}function Kh(b,x,G,Se){var We=Hc;if(null===We)throw Error(f(349));var Rt=x._getVersion,rn=Rt(x._source),xn=vi.current,Er=xn.useState(function(){return fl(We,x,G)}),Ei=Er[1],fs=Er[0];Er=Jl;var Ua=b.memoizedState,mo=Ua.refs,_o=mo.getSnapshot,La=Ua.source;Ua=Ua.subscribe;var Sa=ia;return b.memoizedState={refs:mo,source:x,subscribe:Se},xn.useEffect(function(){mo.getSnapshot=G,mo.setSnapshot=Ei;var ti=Rt(x._source);if(!Ks(rn,ti)){ti=G(x._source),Ks(fs,ti)||(Ei(ti),ti=bf(Sa),We.mutableReadLanes|=ti&We.pendingLanes),We.entangledLanes|=ti=We.mutableReadLanes;for(var Sr=We.entanglements,Wr=ti;0<Wr;){var Bi=31-al(Wr),ao=1<<Bi;Sr[Bi]|=ti,Wr&=~ao}}},[G,x,Se]),xn.useEffect(function(){return Se(x._source,function(){var ti=mo.getSnapshot,Sr=mo.setSnapshot;try{Sr(ti(x._source));var Wr=bf(Sa);We.mutableReadLanes|=Wr&We.pendingLanes}catch(Bi){Sr(function(){throw Bi})}})},[x,Se]),Ks(_o,G)&&Ks(La,x)&&Ks(Ua,Se)||((b={pending:null,dispatch:null,lastRenderedReducer:dd,lastRenderedState:fs}).dispatch=Ei=xh.bind(null,ia,b),Er.queue=b,Er.baseQueue=null,fs=fl(We,x,G),Er.memoizedState=Er.baseState=fs),fs}function F_(b,x,G){return Kh($f(),b,x,G)}function Hf(b){var x=mf();return"function"==typeof b&&(b=b()),x.memoizedState=x.baseState=b,b=(b=x.queue={pending:null,dispatch:null,lastRenderedReducer:dd,lastRenderedState:b}).dispatch=xh.bind(null,ia,b),[x.memoizedState,b]}function kd(b,x,G,Se){return b={tag:b,create:x,destroy:G,deps:Se,next:null},null===(x=ia.updateQueue)?(ia.updateQueue=x={lastEffect:null},x.lastEffect=b.next=b):null===(G=x.lastEffect)?x.lastEffect=b.next=b:(Se=G.next,G.next=b,b.next=Se,x.lastEffect=b),b}function Uf(b){return mf().memoizedState={current:b}}function Kp(){return $f().memoizedState}function Ed(b,x,G,Se){var We=mf();ia.flags|=b,We.memoizedState=kd(1|x,G,void 0,void 0===Se?null:Se)}function Ah(b,x,G,Se){var We=$f();Se=void 0===Se?null:Se;var Rt=void 0;if(null!==_l){var rn=_l.memoizedState;if(Rt=rn.destroy,null!==Se&&$p(Se,rn.deps))return void kd(x,G,Rt,Se)}ia.flags|=b,We.memoizedState=kd(1|x,G,Rt,Se)}function qp(b,x){return Ed(516,4,b,x)}function eh(b,x){return Ah(516,4,b,x)}function Oh(b,x){return Ah(4,2,b,x)}function th(b,x){return"function"==typeof x?(b=b(),x(b),function(){x(null)}):null!=x?(b=b(),x.current=b,function(){x.current=null}):void 0}function Td(b,x,G){return G=null!=G?G.concat([b]):null,Ah(4,2,th.bind(null,x,b),G)}function xf(){}function wh(b,x){var G=$f();x=void 0===x?null:x;var Se=G.memoizedState;return null!==Se&&null!==x&&$p(x,Se[1])?Se[0]:(G.memoizedState=[b,x],b)}function Up(b,x){var G=$f();x=void 0===x?null:x;var Se=G.memoizedState;return null!==Se&&null!==x&&$p(x,Se[1])?Se[0]:(b=b(),G.memoizedState=[b,x],b)}function nh(b,x){var G=Ll();il(98>G?98:G,function(){b(!0)}),il(97<G?97:G,function(){var Se=ps.transition;ps.transition=1;try{b(!1),x()}finally{ps.transition=Se}})}function xh(b,x,G){var Se=fd(),We=bf(b),Rt={lane:We,action:G,eagerReducer:null,eagerState:null,next:null},rn=x.pending;if(null===rn?Rt.next=Rt:(Rt.next=rn.next,rn.next=Rt),x.pending=Rt,rn=b.alternate,b===ia||null!==rn&&rn===ia)Kf=Wc=!0;else{if(0===b.lanes&&(null===rn||0===rn.lanes)&&null!==(rn=x.lastRenderedReducer))try{var xn=x.lastRenderedState,Er=rn(xn,G);if(Rt.eagerReducer=rn,Rt.eagerState=Er,Ks(Er,xn))return}catch(Ei){}Gf(b,We,Se)}}var vf={readContext:Sl,useCallback:Ld,useContext:Ld,useEffect:Ld,useImperativeHandle:Ld,useLayoutEffect:Ld,useMemo:Ld,useReducer:Ld,useRef:Ld,useState:Ld,useDebugValue:Ld,useDeferredValue:Ld,useTransition:Ld,useMutableSource:Ld,useOpaqueIdentifier:Ld,unstable_isNewReconciler:!1},Dh={readContext:Sl,useCallback:function(b,x){return mf().memoizedState=[b,void 0===x?null:x],b},useContext:Sl,useEffect:qp,useImperativeHandle:function(b,x,G){return G=null!=G?G.concat([b]):null,Ed(4,2,th.bind(null,x,b),G)},useLayoutEffect:function(b,x){return Ed(4,2,b,x)},useMemo:function(b,x){var G=mf();return x=void 0===x?null:x,b=b(),G.memoizedState=[b,x],b},useReducer:function(b,x,G){var Se=mf();return x=void 0!==G?G(x):x,Se.memoizedState=Se.baseState=x,b=(b=Se.queue={pending:null,dispatch:null,lastRenderedReducer:b,lastRenderedState:x}).dispatch=xh.bind(null,ia,b),[Se.memoizedState,b]},useRef:Uf,useState:Hf,useDebugValue:xf,useDeferredValue:function(b){var x=Hf(b),G=x[0],Se=x[1];return qp(function(){var We=ps.transition;ps.transition=1;try{Se(b)}finally{ps.transition=We}},[b]),G},useTransition:function(){var b=Hf(!1),x=b[0];return Uf(b=nh.bind(null,b[1])),[b,x]},useMutableSource:function(b,x,G){var Se=mf();return Se.memoizedState={refs:{getSnapshot:x,setSnapshot:null},source:b,subscribe:G},Kh(Se,b,x,G)},useOpaqueIdentifier:function(){if(ic){var b=!1,x=function(b){return{$$typeof:$t,toString:b,valueOf:b}}(function(){throw b||(b=!0,G("r:"+(tl++).toString(36))),Error(f(355))}),G=Hf(x)[1];return 0==(2&ia.mode)&&(ia.flags|=516,kd(5,function(){G("r:"+(tl++).toString(36))},void 0,null)),x}return Hf(x="r:"+(tl++).toString(36)),x},unstable_isNewReconciler:!1},$d={readContext:Sl,useCallback:wh,useContext:Sl,useEffect:eh,useImperativeHandle:Td,useLayoutEffect:Oh,useMemo:Up,useReducer:Fd,useRef:Kp,useState:function(){return Fd(dd)},useDebugValue:xf,useDeferredValue:function(b){var x=Fd(dd),G=x[0],Se=x[1];return eh(function(){var We=ps.transition;ps.transition=1;try{Se(b)}finally{ps.transition=We}},[b]),G},useTransition:function(){var b=Fd(dd)[0];return[Kp().current,b]},useMutableSource:F_,useOpaqueIdentifier:function(){return Fd(dd)[0]},unstable_isNewReconciler:!1},pp={readContext:Sl,useCallback:wh,useContext:Sl,useEffect:eh,useImperativeHandle:Td,useLayoutEffect:Oh,useMemo:Up,useReducer:fp,useRef:Kp,useState:function(){return fp(dd)},useDebugValue:xf,useDeferredValue:function(b){var x=fp(dd),G=x[0],Se=x[1];return eh(function(){var We=ps.transition;ps.transition=1;try{Se(b)}finally{ps.transition=We}},[b]),G},useTransition:function(){var b=fp(dd)[0];return[Kp().current,b]},useMutableSource:F_,useOpaqueIdentifier:function(){return fp(dd)[0]},unstable_isNewReconciler:!1},Bf=he.ReactCurrentOwner,Kd=!1;function oc(b,x,G,Se){x.child=null===b?Vo(x,null,G,Se):Ni(x,b.child,G,Se)}function rh(b,x,G,Se,We){G=G.render;var Rt=x.ref;return Id(x,We),Se=Hp(b,x,G,Se,Rt,We),null===b||Kd?(x.flags|=1,oc(b,x,Se,We),x.child):(x.updateQueue=b.updateQueue,x.flags&=-517,b.lanes&=~We,ya(b,x,We))}function k_(b,x,G,Se,We,Rt){if(null===b){var rn=G.type;return"function"!=typeof rn||Tg(rn)||void 0!==rn.defaultProps||null!==G.compare||void 0!==G.defaultProps?((b=f_(G.type,null,Se,x,x.mode,Rt)).ref=x.ref,b.return=x,x.child=b):(x.tag=15,x.type=rn,qh(b,x,rn,Se,We,Rt))}return rn=b.child,0==(We&Rt)&&(G=null!==(G=G.compare)?G:Lc)(We=rn.memoizedProps,Se)&&b.ref===x.ref?ya(b,x,Rt):(x.flags|=1,(b=Tp(rn,Se)).ref=x.ref,b.return=x,x.child=b)}function qh(b,x,G,Se,We,Rt){if(null!==b&&Lc(b.memoizedProps,Se)&&b.ref===x.ref){if(Kd=!1,0==(Rt&We))return x.lanes=b.lanes,ya(b,x,Rt);0!=(16384&b.flags)&&(Kd=!0)}return w(b,x,G,Se,Rt)}function Y(b,x,G){var Se=x.pendingProps,We=Se.children,Rt=null!==b?b.memoizedState:null;if("hidden"===Se.mode||"unstable-defer-without-hiding"===Se.mode)if(0==(4&x.mode))x.memoizedState={baseLanes:0},Uc(0,G);else{if(0==(1073741824&G))return b=null!==Rt?Rt.baseLanes|G:G,x.lanes=x.childLanes=1073741824,x.memoizedState={baseLanes:b},Uc(0,b),null;x.memoizedState={baseLanes:0},Uc(0,null!==Rt?Rt.baseLanes:G)}else null!==Rt?(Se=Rt.baseLanes|G,x.memoizedState=null):Se=G,Uc(0,Se);return oc(b,x,We,G),x.child}function fe(b,x){var G=x.ref;(null===b&&null!==G||null!==b&&b.ref!==G)&&(x.flags|=128)}function w(b,x,G,Se,We){var Rt=Ou(G)?tn:Qa.current;return Rt=Mc(x,Rt),Id(x,We),G=Hp(b,x,G,Se,Rt,We),null===b||Kd?(x.flags|=1,oc(b,x,G,We),x.child):(x.updateQueue=b.updateQueue,x.flags&=-517,b.lanes&=~We,ya(b,x,We))}function q(b,x,G,Se,We){if(Ou(G)){var Rt=!0;Xl(x)}else Rt=!1;if(Id(x,We),null===x.stateNode)null!==b&&(b.alternate=null,x.alternate=null,x.flags|=2),gt(x,G,Se),Jt(x,G,Se,We),Se=!0;else if(null===b){var rn=x.stateNode,xn=x.memoizedProps;rn.props=xn;var Er=rn.context,Ei=G.contextType;Ei="object"==typeof Ei&&null!==Ei?Sl(Ei):Mc(x,Ei=Ou(G)?tn:Qa.current);var fs=G.getDerivedStateFromProps,Ua="function"==typeof fs||"function"==typeof rn.getSnapshotBeforeUpdate;Ua||"function"!=typeof rn.UNSAFE_componentWillReceiveProps&&"function"!=typeof rn.componentWillReceiveProps||(xn!==Se||Er!==Ei)&&vt(x,rn,Se,Ei),kc=!1;var mo=x.memoizedState;rn.state=mo,K(x,Se,rn,We),Er=x.memoizedState,xn!==Se||mo!==Er||Wu.current||kc?("function"==typeof fs&&(Ue(x,G,fs,Se),Er=x.memoizedState),(xn=kc||Xe(x,G,xn,Se,mo,Er,Ei))?(Ua||"function"!=typeof rn.UNSAFE_componentWillMount&&"function"!=typeof rn.componentWillMount||("function"==typeof rn.componentWillMount&&rn.componentWillMount(),"function"==typeof rn.UNSAFE_componentWillMount&&rn.UNSAFE_componentWillMount()),"function"==typeof rn.componentDidMount&&(x.flags|=4)):("function"==typeof rn.componentDidMount&&(x.flags|=4),x.memoizedProps=Se,x.memoizedState=Er),rn.props=Se,rn.state=Er,rn.context=Ei,Se=xn):("function"==typeof rn.componentDidMount&&(x.flags|=4),Se=!1)}else{rn=x.stateNode,h(b,x),xn=x.memoizedProps,Ei=x.type===x.elementType?xn:Wl(x.type,xn),rn.props=Ei,Ua=x.pendingProps,mo=rn.context,Er="object"==typeof(Er=G.contextType)&&null!==Er?Sl(Er):Mc(x,Er=Ou(G)?tn:Qa.current);var _o=G.getDerivedStateFromProps;(fs="function"==typeof _o||"function"==typeof rn.getSnapshotBeforeUpdate)||"function"!=typeof rn.UNSAFE_componentWillReceiveProps&&"function"!=typeof rn.componentWillReceiveProps||(xn!==Ua||mo!==Er)&&vt(x,rn,Se,Er),kc=!1,rn.state=mo=x.memoizedState,K(x,Se,rn,We);var La=x.memoizedState;xn!==Ua||mo!==La||Wu.current||kc?("function"==typeof _o&&(Ue(x,G,_o,Se),La=x.memoizedState),(Ei=kc||Xe(x,G,Ei,Se,mo,La,Er))?(fs||"function"!=typeof rn.UNSAFE_componentWillUpdate&&"function"!=typeof rn.componentWillUpdate||("function"==typeof rn.componentWillUpdate&&rn.componentWillUpdate(Se,La,Er),"function"==typeof rn.UNSAFE_componentWillUpdate&&rn.UNSAFE_componentWillUpdate(Se,La,Er)),"function"==typeof rn.componentDidUpdate&&(x.flags|=4),"function"==typeof rn.getSnapshotBeforeUpdate&&(x.flags|=256)):("function"!=typeof rn.componentDidUpdate||xn===b.memoizedProps&&mo===b.memoizedState||(x.flags|=4),"function"!=typeof rn.getSnapshotBeforeUpdate||xn===b.memoizedProps&&mo===b.memoizedState||(x.flags|=256),x.memoizedProps=Se,x.memoizedState=La),rn.props=Se,rn.state=La,rn.context=Er,Se=Ei):("function"!=typeof rn.componentDidUpdate||xn===b.memoizedProps&&mo===b.memoizedState||(x.flags|=4),"function"!=typeof rn.getSnapshotBeforeUpdate||xn===b.memoizedProps&&mo===b.memoizedState||(x.flags|=256),Se=!1)}return Fe(b,x,G,Se,Rt,We)}function Fe(b,x,G,Se,We,Rt){fe(b,x);var rn=0!=(64&x.flags);if(!Se&&!rn)return We&&yd(x,G,!1),ya(b,x,Rt);Se=x.stateNode,Bf.current=x;var xn=rn&&"function"!=typeof G.getDerivedStateFromError?null:Se.render();return x.flags|=1,null!==b&&rn?(x.child=Ni(x,b.child,null,Rt),x.child=Ni(x,null,xn,Rt)):oc(b,x,xn,Rt),x.memoizedState=Se.state,We&&yd(x,G,!0),x.child}function ut(b){var x=b.stateNode;x.pendingContext?rl(0,x.pendingContext,x.pendingContext!==x.context):x.context&&rl(0,x.context,!1),sa(b,x.containerInfo)}var zs,rd,wu,Xn={dehydrated:null,retryLane:0};function Fr(b,x,G){var rn,Se=x.pendingProps,We=wa.current,Rt=!1;return(rn=0!=(64&x.flags))||(rn=(null===b||null!==b.memoizedState)&&0!=(2&We)),rn?(Rt=!0,x.flags&=-65):null!==b&&null===b.memoizedState||void 0===Se.fallback||!0===Se.unstable_avoidThisFallback||(We|=1),kl(wa,1&We),null===b?(void 0!==Se.fallback&&X(x),b=Se.children,We=Se.fallback,Rt?(b=gi(x,b,We,G),x.child.memoizedState={baseLanes:G},x.memoizedState=Xn,b):"number"==typeof Se.unstable_expectedLoadTime?(b=gi(x,b,We,G),x.child.memoizedState={baseLanes:G},x.memoizedState=Xn,x.lanes=33554432,b):((G=J_({mode:"visible",children:b},x.mode,G,null)).return=x,x.child=G)):Rt?(Se=function(b,x,G,Se,We){var Rt=x.mode,rn=b.child;b=rn.sibling;var xn={mode:"hidden",children:G};return 0==(2&Rt)&&x.child!==rn?((G=x.child).childLanes=0,G.pendingProps=xn,null!==(rn=G.lastEffect)?(x.firstEffect=G.firstEffect,x.lastEffect=rn,rn.nextEffect=null):x.firstEffect=x.lastEffect=null):G=Tp(rn,xn),null!==b?Se=Tp(b,Se):(Se=Qc(Se,Rt,We,null)).flags|=2,Se.return=x,G.return=x,G.sibling=Se,x.child=G,Se}(b,x,Se.children,Se.fallback,G),(Rt=x.child).memoizedState=null===(We=b.child.memoizedState)?{baseLanes:G}:{baseLanes:We.baseLanes|G},Rt.childLanes=b.childLanes&~G,x.memoizedState=Xn,Se):(G=function(b,x,G,Se){var We=b.child;return b=We.sibling,G=Tp(We,{mode:"visible",children:G}),0==(2&x.mode)&&(G.lanes=Se),G.return=x,G.sibling=null,null!==b&&(b.nextEffect=null,b.flags=8,x.firstEffect=x.lastEffect=b),x.child=G}(b,x,Se.children,G),x.memoizedState=null,G)}function gi(b,x,G,Se){var We=b.mode,Rt=b.child;return x={mode:"hidden",children:x},0==(2&We)&&null!==Rt?(Rt.childLanes=0,Rt.pendingProps=x):Rt=J_(x,We,0,null),G=Qc(G,We,Se,null),Rt.return=b,G.return=b,Rt.sibling=G,b.child=Rt,G}function Ns(b,x){b.lanes|=x;var G=b.alternate;null!==G&&(G.lanes|=x),fu(b.return,x)}function ts(b,x,G,Se,We,Rt){var rn=b.memoizedState;null===rn?b.memoizedState={isBackwards:x,rendering:null,renderingStartTime:0,last:Se,tail:G,tailMode:We,lastEffect:Rt}:(rn.isBackwards=x,rn.rendering=null,rn.renderingStartTime=0,rn.last=Se,rn.tail=G,rn.tailMode=We,rn.lastEffect=Rt)}function Is(b,x,G){var Se=x.pendingProps,We=Se.revealOrder,Rt=Se.tail;if(oc(b,x,Se.children,G),0!=(2&(Se=wa.current)))Se=1&Se|2,x.flags|=64;else{if(null!==b&&0!=(64&b.flags))e:for(b=x.child;null!==b;){if(13===b.tag)null!==b.memoizedState&&Ns(b,G);else if(19===b.tag)Ns(b,G);else if(null!==b.child){b.child.return=b,b=b.child;continue}if(b===x)break e;for(;null===b.sibling;){if(null===b.return||b.return===x)break e;b=b.return}b.sibling.return=b.return,b=b.sibling}Se&=1}if(kl(wa,Se),0==(2&x.mode))x.memoizedState=null;else switch(We){case"forwards":for(G=x.child,We=null;null!==G;)null!==(b=G.alternate)&&null===au(b)&&(We=G),G=G.sibling;null===(G=We)?(We=x.child,x.child=null):(We=G.sibling,G.sibling=null),ts(x,!1,We,G,Rt,x.lastEffect);break;case"backwards":for(G=null,We=x.child,x.child=null;null!==We;){if(null!==(b=We.alternate)&&null===au(b)){x.child=We;break}b=We.sibling,We.sibling=G,G=We,We=b}ts(x,!0,G,null,Rt,x.lastEffect);break;case"together":ts(x,!1,null,null,void 0,x.lastEffect);break;default:x.memoizedState=null}return x.child}function ya(b,x,G){if(null!==b&&(x.dependencies=b.dependencies),Zf|=x.lanes,0!=(G&x.childLanes)){if(null!==b&&x.child!==b.child)throw Error(f(153));if(null!==x.child){for(G=Tp(b=x.child,b.pendingProps),x.child=G,G.return=x;null!==b.sibling;)(G=G.sibling=Tp(b=b.sibling,b.pendingProps)).return=x;G.sibling=null}return x.child}return null}function Hd(b,x){if(!ic)switch(b.tailMode){case"hidden":x=b.tail;for(var G=null;null!==x;)null!==x.alternate&&(G=x),x=x.sibling;null===G?b.tail=null:G.sibling=null;break;case"collapsed":G=b.tail;for(var Se=null;null!==G;)null!==G.alternate&&(Se=G),G=G.sibling;null===Se?x||null===b.tail?b.tail=null:b.tail.sibling=null:Se.sibling=null}}function $_(b,x,G){var Se=x.pendingProps;switch(x.tag){case 2:case 16:case 15:case 0:case 11:case 7:case 8:case 12:case 9:case 14:return null;case 1:return Ou(x.type)&&Pu(),null;case 3:return Pa(),xl(Wu),xl(Qa),fr(),(Se=x.stateNode).pendingContext&&(Se.context=Se.pendingContext,Se.pendingContext=null),(null===b||null===b.child)&&(nt(x)?x.flags|=4:Se.hydrate||(x.flags|=256)),null;case 5:Eu(x);var We=ga(dl.current);if(G=x.type,null!==b&&null!=x.stateNode)rd(b,x,G,Se),b.ref!==x.ref&&(x.flags|=128);else{if(!Se){if(null===x.stateNode)throw Error(f(166));return null}if(b=ga(Vs.current),nt(x)){G=x.type;var Rt=x.memoizedProps;switch((Se=x.stateNode)[nl]=x,Se[Of]=Rt,G){case"dialog":ul("cancel",Se),ul("close",Se);break;case"iframe":case"object":case"embed":ul("load",Se);break;case"video":case"audio":for(b=0;b<ca.length;b++)ul(ca[b],Se);break;case"source":ul("error",Se);break;case"img":case"image":case"link":ul("error",Se),ul("load",Se);break;case"details":ul("toggle",Se);break;case"input":$i(Se,Rt),ul("invalid",Se);break;case"select":Se._wrapperState={wasMultiple:!!Rt.multiple},ul("invalid",Se);break;case"textarea":zr(Se,Rt),ul("invalid",Se)}for(var rn in so(G,Rt),b=null,Rt)Rt.hasOwnProperty(rn)&&(We=Rt[rn],"children"===rn?"string"==typeof We?Se.textContent!==We&&(b=["children",We]):"number"==typeof We&&Se.textContent!==""+We&&(b=["children",""+We]):_.hasOwnProperty(rn)&&null!=We&&"onScroll"===rn&&ul("scroll",Se));switch(G){case"input":Hn(Se),On(Se,Rt,!0);break;case"textarea":Hn(Se),Ai(Se);break;case"select":case"option":break;default:"function"==typeof Rt.onClick&&(Se.onclick=qn)}x.updateQueue=Se=b,null!==Se&&(x.flags|=4)}else{switch(rn=9===We.nodeType?We:We.ownerDocument,b===Tr_html&&(b=Nr(G)),b===Tr_html?"script"===G?((b=rn.createElement("div")).innerHTML="<script><\/script>",b=b.removeChild(b.firstChild)):"string"==typeof Se.is?b=rn.createElement(G,{is:Se.is}):(b=rn.createElement(G),"select"===G&&(rn=b,Se.multiple?rn.multiple=!0:Se.size&&(rn.size=Se.size))):b=rn.createElementNS(b,G),b[nl]=x,b[Of]=Se,zs(b,x),x.stateNode=b,rn=Ze(G,Se),G){case"dialog":ul("cancel",b),ul("close",b),We=Se;break;case"iframe":case"object":case"embed":ul("load",b),We=Se;break;case"video":case"audio":for(We=0;We<ca.length;We++)ul(ca[We],b);We=Se;break;case"source":ul("error",b),We=Se;break;case"img":case"image":case"link":ul("error",b),ul("load",b),We=Se;break;case"details":ul("toggle",b),We=Se;break;case"input":$i(b,Se),We=di(b,Se),ul("invalid",b);break;case"option":We=ir(b,Se);break;case"select":b._wrapperState={wasMultiple:!!Se.multiple},We=u({},Se,{value:void 0}),ul("invalid",b);break;case"textarea":zr(b,Se),We=Vn(b,Se),ul("invalid",b);break;default:We=Se}so(G,We);var xn=We;for(Rt in xn)if(xn.hasOwnProperty(Rt)){var Er=xn[Rt];"style"===Rt?Ii(b,Er):"dangerouslySetInnerHTML"===Rt?null!=(Er=Er?Er.__html:void 0)&&mr(b,Er):"children"===Rt?"string"==typeof Er?("textarea"!==G||""!==Er)&&Xt(b,Er):"number"==typeof Er&&Xt(b,""+Er):"suppressContentEditableWarning"!==Rt&&"suppressHydrationWarning"!==Rt&&"autoFocus"!==Rt&&(_.hasOwnProperty(Rt)?null!=Er&&"onScroll"===Rt&&ul("scroll",b):null!=Er&&oe(b,Rt,Er,rn))}switch(G){case"input":Hn(b),On(b,Se,!1);break;case"textarea":Hn(b),Ai(b);break;case"option":null!=Se.value&&b.setAttribute("value",""+Qr(Se.value));break;case"select":b.multiple=!!Se.multiple,null!=(Rt=Se.value)?Lr(b,!!Se.multiple,Rt,!1):null!=Se.defaultValue&&Lr(b,!!Se.multiple,Se.defaultValue,!0);break;default:"function"==typeof We.onClick&&(b.onclick=qn)}ka(G,Se)&&(x.flags|=4)}null!==x.ref&&(x.flags|=128)}return null;case 6:if(b&&null!=x.stateNode)wu(0,x,b.memoizedProps,Se);else{if("string"!=typeof Se&&null===x.stateNode)throw Error(f(166));G=ga(dl.current),ga(Vs.current),nt(x)?(G=x.memoizedProps,(Se=x.stateNode)[nl]=x,Se.nodeValue!==G&&(x.flags|=4)):((Se=(9===G.nodeType?G:G.ownerDocument).createTextNode(Se))[nl]=x,x.stateNode=Se)}return null;case 13:return xl(wa),Se=x.memoizedState,0!=(64&x.flags)?(x.lanes=G,x):(Se=null!==Se,G=!1,null===b?void 0!==x.memoizedProps.fallback&&nt(x):G=null!==b.memoizedState,Se&&!G&&0!=(2&x.mode)&&(null===b&&!0!==x.memoizedProps.unstable_avoidThisFallback||0!=(1&wa.current)?0===Yu&&(Yu=3):((0===Yu||3===Yu)&&(Yu=4),null===Hc||0==(134217727&Zf)&&0==(134217727&Dc)||Df(Hc,Ps))),(Se||G)&&(x.flags|=4),null);case 4:return Pa(),null===b&&Wd(x.stateNode.containerInfo),null;case 10:return Fc(x),null;case 17:return Ou(x.type)&&Pu(),null;case 19:if(xl(wa),null===(Se=x.memoizedState))return null;if(Rt=0!=(64&x.flags),null===(rn=Se.rendering))if(Rt)Hd(Se,!1);else{if(0!==Yu||null!==b&&0!=(64&b.flags))for(b=x.child;null!==b;){if(null!==(rn=au(b))){for(x.flags|=64,Hd(Se,!1),null!==(Rt=rn.updateQueue)&&(x.updateQueue=Rt,x.flags|=4),null===Se.lastEffect&&(x.firstEffect=null),x.lastEffect=Se.lastEffect,Se=G,G=x.child;null!==G;)b=Se,(Rt=G).flags&=2,Rt.nextEffect=null,Rt.firstEffect=null,Rt.lastEffect=null,null===(rn=Rt.alternate)?(Rt.childLanes=0,Rt.lanes=b,Rt.child=null,Rt.memoizedProps=null,Rt.memoizedState=null,Rt.updateQueue=null,Rt.dependencies=null,Rt.stateNode=null):(Rt.childLanes=rn.childLanes,Rt.lanes=rn.lanes,Rt.child=rn.child,Rt.memoizedProps=rn.memoizedProps,Rt.memoizedState=rn.memoizedState,Rt.updateQueue=rn.updateQueue,Rt.type=rn.type,Rt.dependencies=null===(b=rn.dependencies)?null:{lanes:b.lanes,firstContext:b.firstContext}),G=G.sibling;return kl(wa,1&wa.current|2),x.child}b=b.sibling}null!==Se.tail&&cl()>Nh&&(x.flags|=64,Rt=!0,Hd(Se,!1),x.lanes=33554432)}else{if(!Rt)if(null!==(b=au(rn))){if(x.flags|=64,Rt=!0,null!==(G=b.updateQueue)&&(x.updateQueue=G,x.flags|=4),Hd(Se,!0),null===Se.tail&&"hidden"===Se.tailMode&&!rn.alternate&&!ic)return null!==(x=x.lastEffect=Se.lastEffect)&&(x.nextEffect=null),null}else 2*cl()-Se.renderingStartTime>Nh&&1073741824!==G&&(x.flags|=64,Rt=!0,Hd(Se,!1),x.lanes=33554432);Se.isBackwards?(rn.sibling=x.child,x.child=rn):(null!==(G=Se.last)?G.sibling=rn:x.child=rn,Se.last=rn)}return null!==Se.tail?(Se.rendering=G=Se.tail,Se.tail=G.sibling,Se.lastEffect=x.lastEffect,Se.renderingStartTime=cl(),G.sibling=null,x=wa.current,kl(wa,Rt?1&x|2:1&x),G):null;case 23:case 24:return Rf(),null!==b&&null!==b.memoizedState!=(null!==x.memoizedState)&&"unstable-defer-without-hiding"!==Se.mode&&(x.flags|=4),null}throw Error(f(156,x.tag))}function ih(b){switch(b.tag){case 1:Ou(b.type)&&Pu();var x=b.flags;return 4096&x?(b.flags=-4097&x|64,b):null;case 3:if(Pa(),xl(Wu),xl(Qa),fr(),0!=(64&(x=b.flags)))throw Error(f(285));return b.flags=-4097&x|64,b;case 5:return Eu(b),null;case 13:return xl(wa),4096&(x=b.flags)?(b.flags=-4097&x|64,b):null;case 19:return xl(wa),null;case 4:return Pa(),null;case 10:return Fc(b),null;case 23:case 24:return Rf(),null;default:return null}}function oh(b,x){try{var G="",Se=x;do{G+=Ir(Se),Se=Se.return}while(Se);var We=G}catch(Rt){We="\nError generating stack: "+Rt.message+"\n"+Rt.stack}return{value:b,source:x,stack:We}}function hp(b,x){try{console.error(x.value)}catch(G){setTimeout(function(){throw G})}}zs=function(b,x){for(var G=x.child;null!==G;){if(5===G.tag||6===G.tag)b.appendChild(G.stateNode);else if(4!==G.tag&&null!==G.child){G.child.return=G,G=G.child;continue}if(G===x)break;for(;null===G.sibling;){if(null===G.return||G.return===x)return;G=G.return}G.sibling.return=G.return,G=G.sibling}},rd=function(b,x,G,Se){var We=b.memoizedProps;if(We!==Se){b=x.stateNode,ga(Vs.current);var rn,Rt=null;switch(G){case"input":We=di(b,We),Se=di(b,Se),Rt=[];break;case"option":We=ir(b,We),Se=ir(b,Se),Rt=[];break;case"select":We=u({},We,{value:void 0}),Se=u({},Se,{value:void 0}),Rt=[];break;case"textarea":We=Vn(b,We),Se=Vn(b,Se),Rt=[];break;default:"function"!=typeof We.onClick&&"function"==typeof Se.onClick&&(b.onclick=qn)}for(Ei in so(G,Se),G=null,We)if(!Se.hasOwnProperty(Ei)&&We.hasOwnProperty(Ei)&&null!=We[Ei])if("style"===Ei){var xn=We[Ei];for(rn in xn)xn.hasOwnProperty(rn)&&(G||(G={}),G[rn]="")}else"dangerouslySetInnerHTML"!==Ei&&"children"!==Ei&&"suppressContentEditableWarning"!==Ei&&"suppressHydrationWarning"!==Ei&&"autoFocus"!==Ei&&(_.hasOwnProperty(Ei)?Rt||(Rt=[]):(Rt=Rt||[]).push(Ei,null));for(Ei in Se){var Er=Se[Ei];if(xn=null!=We?We[Ei]:void 0,Se.hasOwnProperty(Ei)&&Er!==xn&&(null!=Er||null!=xn))if("style"===Ei)if(xn){for(rn in xn)!xn.hasOwnProperty(rn)||Er&&Er.hasOwnProperty(rn)||(G||(G={}),G[rn]="");for(rn in Er)Er.hasOwnProperty(rn)&&xn[rn]!==Er[rn]&&(G||(G={}),G[rn]=Er[rn])}else G||(Rt||(Rt=[]),Rt.push(Ei,G)),G=Er;else"dangerouslySetInnerHTML"===Ei?(xn=xn?xn.__html:void 0,null!=(Er=Er?Er.__html:void 0)&&xn!==Er&&(Rt=Rt||[]).push(Ei,Er)):"children"===Ei?"string"!=typeof Er&&"number"!=typeof Er||(Rt=Rt||[]).push(Ei,""+Er):"suppressContentEditableWarning"!==Ei&&"suppressHydrationWarning"!==Ei&&(_.hasOwnProperty(Ei)?(null!=Er&&"onScroll"===Ei&&ul("scroll",b),Rt||xn===Er||(Rt=[])):"object"==typeof Er&&null!==Er&&Er.$$typeof===$t?Er.toString():(Rt=Rt||[]).push(Ei,Er))}G&&(Rt=Rt||[]).push("style",G);var Ei=Rt;(x.updateQueue=Ei)&&(x.flags|=4)}},wu=function(b,x,G,Se){G!==Se&&(x.flags|=4)};var Yf="function"==typeof WeakMap?WeakMap:Map;function H_(b,x,G){(G=E(-1,G)).tag=3,G.payload={element:null};var Se=x.value;return G.callback=function(){s_||(s_=!0,G_=Se),hp(0,x)},G}function _g(b,x,G){(G=E(-1,G)).tag=3;var Se=b.type.getDerivedStateFromError;if("function"==typeof Se){var We=x.value;G.payload=function(){return hp(0,x),Se(We)}}var Rt=b.stateNode;return null!==Rt&&"function"==typeof Rt.componentDidCatch&&(G.callback=function(){"function"!=typeof Se&&(null===od?od=new Set([this]):od.add(this),hp(0,x));var rn=x.stack;this.componentDidCatch(x.value,{componentStack:null!==rn?rn:""})}),G}var _p="function"==typeof WeakSet?WeakSet:Set;function Sd(b){var x=b.ref;if(null!==x)if("function"==typeof x)try{x(null)}catch(G){Ep(b,G)}else x.current=null}function U_(b,x){switch(x.tag){case 0:case 11:case 15:case 22:return;case 1:if(256&x.flags&&null!==b){var G=b.memoizedProps,Se=b.memoizedState;x=(b=x.stateNode).getSnapshotBeforeUpdate(x.elementType===x.type?G:Wl(x.type,G),Se),b.__reactInternalSnapshotBeforeUpdate=x}return;case 3:return void(256&x.flags&&fc(x.stateNode.containerInfo));case 5:case 6:case 4:case 17:return}throw Error(f(163))}function e_(b,x,G){switch(G.tag){case 0:case 11:case 15:case 22:if(null!==(x=null!==(x=G.updateQueue)?x.lastEffect:null)){b=x=x.next;do{if(3==(3&b.tag)){var Se=b.create;b.destroy=Se()}b=b.next}while(b!==x)}if(null!==(x=null!==(x=G.updateQueue)?x.lastEffect:null)){b=x=x.next;do{var We=b;Se=We.next,0!=(4&(We=We.tag))&&0!=(1&We)&&(Eg(G,b),bg(G,b)),b=Se}while(b!==x)}return;case 1:return b=G.stateNode,4&G.flags&&(null===x?b.componentDidMount():(Se=G.elementType===G.type?x.memoizedProps:Wl(G.type,x.memoizedProps),b.componentDidUpdate(Se,x.memoizedState,b.__reactInternalSnapshotBeforeUpdate))),void(null!==(x=G.updateQueue)&&de(G,x,b));case 3:if(null!==(x=G.updateQueue)){if(b=null,null!==G.child)switch(G.child.tag){case 5:b=G.child.stateNode;break;case 1:b=G.child.stateNode}de(G,x,b)}return;case 5:return b=G.stateNode,void(null===x&&4&G.flags&&ka(G.type,G.memoizedProps)&&b.focus());case 6:case 4:case 12:return;case 13:return void(null===G.memoizedState&&(G=G.alternate,null!==G&&(G=G.memoizedState,null!==G&&(G=G.dehydrated,null!==G&&gs(G)))));case 19:case 17:case 20:case 21:case 23:case 24:return}throw Error(f(163))}function B_(b,x){for(var G=b;;){if(5===G.tag){var Se=G.stateNode;if(x)"function"==typeof(Se=Se.style).setProperty?Se.setProperty("display","none","important"):Se.display="none";else{Se=G.stateNode;var We=G.memoizedProps.style;We=null!=We&&We.hasOwnProperty("display")?We.display:null,Se.style.display=si("display",We)}}else if(6===G.tag)G.stateNode.nodeValue=x?"":G.memoizedProps;else if((23!==G.tag&&24!==G.tag||null===G.memoizedState||G===b)&&null!==G.child){G.child.return=G,G=G.child;continue}if(G===b)break;for(;null===G.sibling;){if(null===G.return||G.return===b)return;G=G.return}G.sibling.return=G.return,G=G.sibling}}function Jc(b,x){if(Vc&&"function"==typeof Vc.onCommitFiberUnmount)try{Vc.onCommitFiberUnmount(Ac,x)}catch(Rt){}switch(x.tag){case 0:case 11:case 14:case 15:case 22:if(null!==(b=x.updateQueue)&&null!==(b=b.lastEffect)){var G=b=b.next;do{var Se=G,We=Se.destroy;if(Se=Se.tag,void 0!==We)if(0!=(4&Se))Eg(x,G);else{Se=x;try{We()}catch(Rt){Ep(Se,Rt)}}G=G.next}while(G!==b)}break;case 1:if(Sd(x),"function"==typeof(b=x.stateNode).componentWillUnmount)try{b.props=x.memoizedProps,b.state=x.memoizedState,b.componentWillUnmount()}catch(Rt){Ep(x,Rt)}break;case 5:Sd(x);break;case 4:r_(b,x)}}function Rh(b){b.alternate=null,b.child=null,b.dependencies=null,b.firstEffect=null,b.lastEffect=null,b.memoizedProps=null,b.memoizedState=null,b.pendingProps=null,b.return=null,b.updateQueue=null}function t_(b){return 5===b.tag||3===b.tag||4===b.tag}function qf(b){e:{for(var x=b.return;null!==x;){if(t_(x))break e;x=x.return}throw Error(f(160))}var G=x;switch(x=G.stateNode,G.tag){case 5:var Se=!1;break;case 3:case 4:x=x.containerInfo,Se=!0;break;default:throw Error(f(161))}16&G.flags&&(Xt(x,""),G.flags&=-17);e:t:for(G=b;;){for(;null===G.sibling;){if(null===G.return||t_(G.return)){G=null;break e}G=G.return}for(G.sibling.return=G.return,G=G.sibling;5!==G.tag&&6!==G.tag&&18!==G.tag;){if(2&G.flags||null===G.child||4===G.tag)continue t;G.child.return=G,G=G.child}if(!(2&G.flags)){G=G.stateNode;break e}}Se?n_(b,G,x):sh(b,G,x)}function n_(b,x,G){var Se=b.tag,We=5===Se||6===Se;if(We)b=We?b.stateNode:b.stateNode.instance,x?8===G.nodeType?G.parentNode.insertBefore(b,x):G.insertBefore(b,x):(8===G.nodeType?(x=G.parentNode).insertBefore(b,G):(x=G).appendChild(b),null!=(G=G._reactRootContainer)||null!==x.onclick||(x.onclick=qn));else if(4!==Se&&null!==(b=b.child))for(n_(b,x,G),b=b.sibling;null!==b;)n_(b,x,G),b=b.sibling}function sh(b,x,G){var Se=b.tag,We=5===Se||6===Se;if(We)b=We?b.stateNode:b.stateNode.instance,x?G.insertBefore(b,x):G.appendChild(b);else if(4!==Se&&null!==(b=b.child))for(sh(b,x,G),b=b.sibling;null!==b;)sh(b,x,G),b=b.sibling}function r_(b,x){for(var We,Rt,G=x,Se=!1;;){if(!Se){Se=G.return;e:for(;;){if(null===Se)throw Error(f(160));switch(We=Se.stateNode,Se.tag){case 5:Rt=!1;break e;case 3:case 4:We=We.containerInfo,Rt=!0;break e}Se=Se.return}Se=!0}if(5===G.tag||6===G.tag){e:for(var rn=b,xn=G,Er=xn;;)if(Jc(rn,Er),null!==Er.child&&4!==Er.tag)Er.child.return=Er,Er=Er.child;else{if(Er===xn)break e;for(;null===Er.sibling;){if(null===Er.return||Er.return===xn)break e;Er=Er.return}Er.sibling.return=Er.return,Er=Er.sibling}Rt?(xn=G.stateNode,8===(rn=We).nodeType?rn.parentNode.removeChild(xn):rn.removeChild(xn)):We.removeChild(G.stateNode)}else if(4===G.tag){if(null!==G.child){We=G.stateNode.containerInfo,Rt=!0,G.child.return=G,G=G.child;continue}}else if(Jc(b,G),null!==G.child){G.child.return=G,G=G.child;continue}if(G===x)break;for(;null===G.sibling;){if(null===G.return||G.return===x)return;4===(G=G.return).tag&&(Se=!1)}G.sibling.return=G.return,G=G.sibling}}function id(b,x){switch(x.tag){case 0:case 11:case 14:case 15:case 22:var G=x.updateQueue;if(null!==(G=null!==G?G.lastEffect:null)){var Se=G=G.next;do{3==(3&Se.tag)&&(b=Se.destroy,Se.destroy=void 0,void 0!==b&&b()),Se=Se.next}while(Se!==G)}return;case 1:return;case 5:if(null!=(G=x.stateNode)){Se=x.memoizedProps;var We=null!==b?b.memoizedProps:Se;b=x.type;var Rt=x.updateQueue;if(x.updateQueue=null,null!==Rt){for(G[Of]=Se,"input"===b&&"radio"===Se.type&&null!=Se.name&&Hi(G,Se),Ze(b,We),x=Ze(b,Se),We=0;We<Rt.length;We+=2){var rn=Rt[We],xn=Rt[We+1];"style"===rn?Ii(G,xn):"dangerouslySetInnerHTML"===rn?mr(G,xn):"children"===rn?Xt(G,xn):oe(G,rn,xn,x)}switch(b){case"input":Br(G,Se);break;case"textarea":hi(G,Se);break;case"select":b=G._wrapperState.wasMultiple,G._wrapperState.wasMultiple=!!Se.multiple,null!=(Rt=Se.value)?Lr(G,!!Se.multiple,Rt,!1):b!==!!Se.multiple&&(null!=Se.defaultValue?Lr(G,!!Se.multiple,Se.defaultValue,!0):Lr(G,!!Se.multiple,Se.multiple?[]:"",!1))}}}return;case 6:if(null===x.stateNode)throw Error(f(162));return void(x.stateNode.nodeValue=x.memoizedProps);case 3:return void((G=x.stateNode).hydrate&&(G.hydrate=!1,gs(G.containerInfo)));case 12:return;case 13:return null!==x.memoizedState&&(j_=cl(),B_(x.child,!0)),void Ig(x);case 19:return void Ig(x);case 17:return;case 23:case 24:return void B_(x,null!==x.memoizedState)}throw Error(f(163))}function Ig(b){var x=b.updateQueue;if(null!==x){b.updateQueue=null;var G=b.stateNode;null===G&&(G=b.stateNode=new _p),x.forEach(function(Se){var We=$g.bind(null,b,Se);G.has(Se)||(G.add(Se),Se.then(We,We))})}}function Lg(b,x){return null!==b&&(null===(b=b.memoizedState)||null!==b.dehydrated)&&null!==(x=x.memoizedState)&&null===x.dehydrated}var gp=Math.ceil,i_=he.ReactCurrentDispatcher,o_=he.ReactCurrentOwner,Ta=0,Hc=null,Ju=null,Ps=0,mp=0,ah=Tl(0),Yu=0,Y_=null,Bp=0,Zf=0,Dc=0,gg=0,Z_=null,j_=0,Nh=1/0;function ep(){Nh=cl()+500}var W_,ns=null,s_=!1,G_=null,od=null,gc=!1,Ph=null,Ih=90,Lh=[],mg=[],jf=null,Ud=0,yf=null,a_=-1,vp=0,l_=0,yp=null,Bd=!1;function fd(){return 0!=(48&Ta)?cl():-1!==a_?a_:a_=cl()}function bf(b){if(0==(2&(b=b.mode)))return 1;if(0==(4&b))return 99===Ll()?1:2;if(0===vp&&(vp=Bp),0!==wf.transition){0!==l_&&(l_=null!==Z_?Z_.pendingLanes:0),b=vp;var x=4186112&~l_;return 0==(x&=-x)&&0==(x=(b=4186112&~b)&-b)&&(x=8192),x}return b=Ll(),b=Ro(0!=(4&Ta)&&98===b?12:b=function(b){switch(b){case 99:return 15;case 98:return 10;case 97:case 96:return 8;case 95:return 2;default:return 0}}(b),vp)}function Gf(b,x,G){if(50<Ud)throw Ud=0,yf=null,Error(f(185));if(null===(b=lh(b,x)))return null;Ea(b,x,G),b===Hc&&(Dc|=x,4===Yu&&Df(b,Ps));var Se=Ll();1===x?0!=(8&Ta)&&0==(48&Ta)?tp(b):(sd(b,G),0===Ta&&(ep(),pc())):(0==(4&Ta)||98!==Se&&99!==Se||(null===jf?jf=new Set([b]):jf.add(b)),sd(b,G)),Z_=b}function lh(b,x){b.lanes|=x;var G=b.alternate;for(null!==G&&(G.lanes|=x),G=b,b=b.return;null!==b;)b.childLanes|=x,null!==(G=b.alternate)&&(G.childLanes|=x),G=b,b=b.return;return 3===G.tag?G.stateNode:null}function sd(b,x){for(var G=b.callbackNode,Se=b.suspendedLanes,We=b.pingedLanes,Rt=b.expirationTimes,rn=b.pendingLanes;0<rn;){var xn=31-al(rn),Er=1<<xn,Ei=Rt[xn];-1===Ei?0!=(Er&Se)&&0==(Er&We)||(Ei=x,sn(Er),Rt[xn]=10<=Pt?Ei+250:6<=Pt?Ei+5e3:-1):Ei<=x&&(b.expiredLanes|=Er),rn&=~Er}if(Se=Oi(b,b===Hc?Ps:0),x=Pt,0===Se)null!==G&&(G!==Uu&&hf(G),b.callbackNode=null,b.callbackPriority=0);else{if(null!==G){if(b.callbackPriority===x)return;G!==Uu&&hf(G)}15===x?(G=tp.bind(null,b),null===Rd?(Rd=[G],wc=Oc(dp,Xd)):Rd.push(G),G=Uu):G=14===x?Bu(99,tp.bind(null,b)):Bu(G=function(b){switch(b){case 15:case 14:return 99;case 13:case 12:case 11:case 10:return 98;case 9:case 8:case 7:case 6:case 4:case 5:return 97;case 3:case 2:case 1:return 95;case 0:return 90;default:throw Error(f(358,b))}}(x),uh.bind(null,b)),b.callbackPriority=x,b.callbackNode=G}}function uh(b){if(a_=-1,l_=vp=0,0!=(48&Ta))throw Error(f(327));var x=b.callbackNode;if(bp()&&b.callbackNode!==x)return null;var G=Oi(b,b===Hc?Ps:0);if(0===G)return null;var Se=G,We=Ta;Ta|=16;var Rt=Fh();for((Hc!==b||Ps!==Se)&&(ep(),dh(b,Se));;)try{Mm();break}catch(xn){vg(b,xn)}if(Cc(),i_.current=Rt,Ta=We,null!==Ju?Se=0:(Hc=null,Ps=0,Se=Yu),0!=(Bp&Dc))dh(b,0);else if(0!==Se){if(2===Se&&(Ta|=64,b.hydrate&&(b.hydrate=!1,fc(b.containerInfo)),0!==(G=os(b))&&(Se=c_(b,G))),1===Se)throw x=Y_,dh(b,0),Df(b,G),sd(b,cl()),x;switch(b.finishedWork=b.current.alternate,b.finishedLanes=G,Se){case 0:case 1:throw Error(f(345));case 2:fh(b);break;case 3:if(Df(b,G),(62914560&G)===G&&10<(Se=j_+500-cl())){if(0!==Oi(b,0))break;if(((We=b.suspendedLanes)&G)!==G){fd(),b.pingedLanes|=b.suspendedLanes&We;break}b.timeoutHandle=Oa(fh.bind(null,b),Se);break}fh(b);break;case 4:if(Df(b,G),(4186112&G)===G)break;for(Se=b.eventTimes,We=-1;0<G;){var rn=31-al(G);Rt=1<<rn,(rn=Se[rn])>We&&(We=rn),G&=~Rt}if(G=We,10<(G=(120>(G=cl()-G)?120:480>G?480:1080>G?1080:1920>G?1920:3e3>G?3e3:4320>G?4320:1960*gp(G/1960))-G)){b.timeoutHandle=Oa(fh.bind(null,b),G);break}fh(b);break;case 5:fh(b);break;default:throw Error(f(329))}}return sd(b,cl()),b.callbackNode===x?uh.bind(null,b):null}function Df(b,x){for(x&=~gg,b.suspendedLanes|=x&=~Dc,b.pingedLanes&=~x,b=b.expirationTimes;0<x;){var G=31-al(x),Se=1<<G;b[G]=-1,x&=~Se}}function tp(b){if(0!=(48&Ta))throw Error(f(327));if(bp(),b===Hc&&0!=(b.expiredLanes&Ps)){var x=Ps,G=c_(b,x);0!=(Bp&Dc)&&(G=c_(b,x=Oi(b,x)))}else G=c_(b,x=Oi(b,0));if(0!==b.tag&&2===G&&(Ta|=64,b.hydrate&&(b.hydrate=!1,fc(b.containerInfo)),0!==(x=os(b))&&(G=c_(b,x))),1===G)throw G=Y_,dh(b,0),Df(b,x),sd(b,cl()),G;return b.finishedWork=b.current.alternate,b.finishedLanes=x,fh(b),sd(b,cl()),null}function ch(b,x){var G=Ta;Ta|=1;try{return b(x)}finally{0===(Ta=G)&&(ep(),pc())}}function u_(b,x){var G=Ta;Ta&=-2,Ta|=8;try{return b(x)}finally{0===(Ta=G)&&(ep(),pc())}}function Uc(b,x){kl(ah,mp),mp|=x,Bp|=x}function Rf(){mp=ah.current,xl(ah)}function dh(b,x){b.finishedWork=null,b.finishedLanes=0;var G=b.timeoutHandle;if(-1!==G&&(b.timeoutHandle=-1,Us(G)),null!==Ju)for(G=Ju.return;null!==G;){var Se=G;switch(Se.tag){case 1:null!=(Se=Se.type.childContextTypes)&&Pu();break;case 3:Pa(),xl(Wu),xl(Qa),fr();break;case 5:Eu(Se);break;case 4:Pa();break;case 13:case 19:xl(wa);break;case 10:Fc(Se);break;case 23:case 24:Rf()}G=G.return}Hc=b,Ju=Tp(b.current,null),Ps=mp=Bp=x,Yu=0,Y_=null,gg=Dc=Zf=0}function vg(b,x){for(;;){var G=Ju;try{if(Cc(),vi.current=vf,Wc){for(var Se=ia.memoizedState;null!==Se;){var We=Se.queue;null!==We&&(We.pending=null),Se=Se.next}Wc=!1}if(xa=0,Jl=_l=ia=null,Kf=!1,o_.current=null,null===G||null===G.return){Yu=1,Y_=x,Ju=null;break}e:{var Rt=b,rn=G.return,xn=G,Er=x;if(x=Ps,xn.flags|=2048,xn.firstEffect=xn.lastEffect=null,null!==Er&&"object"==typeof Er&&"function"==typeof Er.then){var Ei=Er;if(0==(2&xn.mode)){var fs=xn.alternate;fs?(xn.updateQueue=fs.updateQueue,xn.memoizedState=fs.memoizedState,xn.lanes=fs.lanes):(xn.updateQueue=null,xn.memoizedState=null)}var Ua=0!=(1&wa.current),mo=rn;do{var _o;if(_o=13===mo.tag){var La=mo.memoizedState;if(null!==La)_o=null!==La.dehydrated;else{var Sa=mo.memoizedProps;_o=void 0!==Sa.fallback&&(!0!==Sa.unstable_avoidThisFallback||!Ua)}}if(_o){var ti=mo.updateQueue;if(null===ti){var Sr=new Set;Sr.add(Ei),mo.updateQueue=Sr}else ti.add(Ei);if(0==(2&mo.mode)){if(mo.flags|=64,xn.flags|=16384,xn.flags&=-2981,1===xn.tag)if(null===xn.alternate)xn.tag=17;else{var Wr=E(-1,1);Wr.tag=2,N(xn,Wr)}xn.lanes|=1;break e}Er=void 0,xn=x;var Bi=Rt.pingCache;if(null===Bi?(Bi=Rt.pingCache=new Yf,Er=new Set,Bi.set(Ei,Er)):void 0===(Er=Bi.get(Ei))&&(Er=new Set,Bi.set(Ei,Er)),!Er.has(xn)){Er.add(xn);var ao=ph.bind(null,Rt,Ei,xn);Ei.then(ao,ao)}mo.flags|=4096,mo.lanes=x;break e}mo=mo.return}while(null!==mo);Er=Error((wr(xn.type)||"A React component")+" suspended while rendering, but no fallback UI was specified.\n\nAdd a <Suspense fallback=...> component higher in the tree to provide a loading indicator or placeholder to display.")}5!==Yu&&(Yu=2),Er=oh(Er,xn),mo=rn;do{switch(mo.tag){case 3:Rt=Er,mo.flags|=4096,mo.lanes|=x&=-x,k(mo,H_(0,Rt,x));break e;case 1:Rt=Er;var Xa=mo.stateNode;if(0==(64&mo.flags)&&("function"==typeof mo.type.getDerivedStateFromError||null!==Xa&&"function"==typeof Xa.componentDidCatch&&(null===od||!od.has(Xa)))){mo.flags|=4096,mo.lanes|=x&=-x,k(mo,_g(mo,Rt,x));break e}}mo=mo.return}while(null!==mo)}Yp(G)}catch(Cl){x=Cl,Ju===G&&null!==G&&(Ju=G=G.return);continue}break}}function Fh(){var b=i_.current;return i_.current=vf,null===b?vf:b}function c_(b,x){var G=Ta;Ta|=16;var Se=Fh();for(Hc===b&&Ps===x||dh(b,x);;)try{Cm();break}catch(We){vg(b,We)}if(Cc(),Ta=G,i_.current=Se,null!==Ju)throw Error(f(261));return Hc=null,Ps=0,Yu}function Cm(){for(;null!==Ju;)d_(Ju)}function Mm(){for(;null!==Ju&&!zc();)d_(Ju)}function d_(b){var x=W_(b.alternate,b,mp);b.memoizedProps=b.pendingProps,null===x?Yp(b):Ju=x,o_.current=null}function Yp(b){var x=b;do{var G=x.alternate;if(b=x.return,0==(2048&x.flags)){if(null!==(G=$_(G,x,mp)))return void(Ju=G);if(24!==(G=x).tag&&23!==G.tag||null===G.memoizedState||0!=(1073741824&mp)||0==(4&G.mode)){for(var Se=0,We=G.child;null!==We;)Se|=We.lanes|We.childLanes,We=We.sibling;G.childLanes=Se}null!==b&&0==(2048&b.flags)&&(null===b.firstEffect&&(b.firstEffect=x.firstEffect),null!==x.lastEffect&&(null!==b.lastEffect&&(b.lastEffect.nextEffect=x.firstEffect),b.lastEffect=x.lastEffect),1<x.flags&&(null!==b.lastEffect?b.lastEffect.nextEffect=x:b.firstEffect=x,b.lastEffect=x))}else{if(null!==(G=ih(x)))return G.flags&=2047,void(Ju=G);null!==b&&(b.firstEffect=b.lastEffect=null,b.flags|=2048)}if(null!==(x=x.sibling))return void(Ju=x);Ju=x=b}while(null!==x);0===Yu&&(Yu=5)}function fh(b){var x=Ll();return il(99,Fg.bind(null,b,x)),null}function Fg(b,x){do{bp()}while(null!==Ph);if(0!=(48&Ta))throw Error(f(327));var G=b.finishedWork;if(null===G)return null;if(b.finishedWork=null,b.finishedLanes=0,G===b.current)throw Error(f(177));b.callbackNode=null;var Se=G.lanes|G.childLanes,We=Se,Rt=b.pendingLanes&~We;b.pendingLanes=We,b.suspendedLanes=0,b.pingedLanes=0,b.expiredLanes&=We,b.mutableReadLanes&=We,b.entangledLanes&=We,We=b.entanglements;for(var rn=b.eventTimes,xn=b.expirationTimes;0<Rt;){var Er=31-al(Rt),Ei=1<<Er;We[Er]=0,rn[Er]=-1,xn[Er]=-1,Rt&=~Ei}if(null!==jf&&0==(24&Se)&&jf.has(b)&&jf.delete(b),b===Hc&&(Ju=Hc=null,Ps=0),1<G.flags?null!==G.lastEffect?(G.lastEffect.nextEffect=G,Se=G.firstEffect):Se=G:Se=G.firstEffect,null!==Se){if(We=Ta,Ta|=32,o_.current=null,yi=Hl,ll(rn=_a())){if("selectionStart"in rn)xn={start:rn.selectionStart,end:rn.selectionEnd};else if((Ei=(xn=(xn=rn.ownerDocument)&&xn.defaultView||window).getSelection&&xn.getSelection())&&0!==Ei.rangeCount){xn=Ei.anchorNode,Rt=Ei.anchorOffset,Er=Ei.focusNode,Ei=Ei.focusOffset;var fs=0,Ua=-1,mo=-1,_o=0,La=0,Sa=rn,ti=null;t:for(;;){for(var Sr;Sa!==xn||0!==Rt&&3!==Sa.nodeType||(Ua=fs+Rt),Sa!==Er||0!==Ei&&3!==Sa.nodeType||(mo=fs+Ei),3===Sa.nodeType&&(fs+=Sa.nodeValue.length),null!==(Sr=Sa.firstChild);)ti=Sa,Sa=Sr;for(;;){if(Sa===rn)break t;if(ti===xn&&++_o===Rt&&(Ua=fs),ti===Er&&++La===Ei&&(mo=fs),null!==(Sr=Sa.nextSibling))break;ti=(Sa=ti).parentNode}Sa=Sr}xn=-1===Ua||-1===mo?null:{start:Ua,end:mo}}else xn=null;xn=xn||{start:0,end:0}}else xn=null;Go={focusedElem:rn,selectionRange:xn},Hl=!1,yp=null,Bd=!1,ns=Se;do{try{yg()}catch(Cl){if(null===ns)throw Error(f(330));Ep(ns,Cl),ns=ns.nextEffect}}while(null!==ns);yp=null,ns=Se;do{try{for(rn=b;null!==ns;){var Wr=ns.flags;if(16&Wr&&Xt(ns.stateNode,""),128&Wr){var Bi=ns.alternate;if(null!==Bi){var ao=Bi.ref;null!==ao&&("function"==typeof ao?ao(null):ao.current=null)}}switch(1038&Wr){case 2:qf(ns),ns.flags&=-3;break;case 6:qf(ns),ns.flags&=-3,id(ns.alternate,ns);break;case 1024:ns.flags&=-1025;break;case 1028:ns.flags&=-1025,id(ns.alternate,ns);break;case 4:id(ns.alternate,ns);break;case 8:r_(rn,xn=ns);var ba=xn.alternate;Rh(xn),null!==ba&&Rh(ba)}ns=ns.nextEffect}}catch(Cl){if(null===ns)throw Error(f(330));Ep(ns,Cl),ns=ns.nextEffect}}while(null!==ns);if(ao=Go,Bi=_a(),rn=ao.selectionRange,Bi!==(Wr=ao.focusedElem)&&Wr&&Wr.ownerDocument&&No(Wr.ownerDocument.documentElement,Wr)){for((null!==rn&&ll(Wr)&&(Bi=rn.start,void 0===(ao=rn.end)&&(ao=Bi),"selectionStart"in Wr?(Wr.selectionStart=Bi,Wr.selectionEnd=Math.min(ao,Wr.value.length)):(ao=(Bi=Wr.ownerDocument||document)&&Bi.defaultView||window).getSelection&&(ao=ao.getSelection(),xn=Wr.textContent.length,ba=Math.min(rn.start,xn),rn=void 0===rn.end?ba:Math.min(rn.end,xn),!ao.extend&&ba>rn&&(xn=rn,rn=ba,ba=xn),xn=ki(Wr,ba),Rt=ki(Wr,rn),xn&&Rt&&(1!==ao.rangeCount||ao.anchorNode!==xn.node||ao.anchorOffset!==xn.offset||ao.focusNode!==Rt.node||ao.focusOffset!==Rt.offset)&&((Bi=Bi.createRange()).setStart(xn.node,xn.offset),ao.removeAllRanges(),ba>rn?(ao.addRange(Bi),ao.extend(Rt.node,Rt.offset)):(Bi.setEnd(Rt.node,Rt.offset),ao.addRange(Bi))))),Bi=[],ao=Wr);ao=ao.parentNode;)1===ao.nodeType&&Bi.push({element:ao,left:ao.scrollLeft,top:ao.scrollTop});for("function"==typeof Wr.focus&&Wr.focus(),Wr=0;Wr<Bi.length;Wr++)(ao=Bi[Wr]).element.scrollLeft=ao.left,ao.element.scrollTop=ao.top}Hl=!!yi,Go=yi=null,b.current=G,ns=Se;do{try{for(Wr=b;null!==ns;){var Os=ns.flags;if(36&Os&&e_(Wr,ns.alternate,ns),128&Os){Bi=void 0;var Xa=ns.ref;if(null!==Xa){var Dl=ns.stateNode;switch(ns.tag){case 5:Bi=Dl;break;default:Bi=Dl}"function"==typeof Xa?Xa(Bi):Xa.current=Bi}}ns=ns.nextEffect}}catch(Cl){if(null===ns)throw Error(f(330));Ep(ns,Cl),ns=ns.nextEffect}}while(null!==ns);ns=null,Xf(),Ta=We}else b.current=G;if(gc)gc=!1,Ph=b,Ih=x;else for(ns=Se;null!==ns;)x=ns.nextEffect,ns.nextEffect=null,8&ns.flags&&((Os=ns).sibling=null,Os.stateNode=null),ns=x;if(0===(Se=b.pendingLanes)&&(od=null),1===Se?b===yf?Ud++:(Ud=0,yf=b):Ud=0,G=G.stateNode,Vc&&"function"==typeof Vc.onCommitFiberRoot)try{Vc.onCommitFiberRoot(Ac,G,void 0,64==(64&G.current.flags))}catch(Cl){}if(sd(b,cl()),s_)throw s_=!1,b=G_,G_=null,b;return 0!=(8&Ta)||pc(),null}function yg(){for(;null!==ns;){var b=ns.alternate;Bd||null===yp||(0!=(8&ns.flags)?cn(ns,yp)&&(Bd=!0):13===ns.tag&&Lg(b,ns)&&cn(ns,yp)&&(Bd=!0));var x=ns.flags;0!=(256&x)&&U_(b,ns),0==(512&x)||gc||(gc=!0,Bu(97,function(){return bp(),null})),ns=ns.nextEffect}}function bp(){if(90!==Ih){var b=97<Ih?97:Ih;return Ih=90,il(b,kg)}return!1}function bg(b,x){Lh.push(x,b),gc||(gc=!0,Bu(97,function(){return bp(),null}))}function Eg(b,x){mg.push(x,b),gc||(gc=!0,Bu(97,function(){return bp(),null}))}function kg(){if(null===Ph)return!1;var b=Ph;if(Ph=null,0!=(48&Ta))throw Error(f(331));var x=Ta;Ta|=32;var G=mg;mg=[];for(var Se=0;Se<G.length;Se+=2){var We=G[Se],Rt=G[Se+1],rn=We.destroy;if(We.destroy=void 0,"function"==typeof rn)try{rn()}catch(Er){if(null===Rt)throw Error(f(330));Ep(Rt,Er)}}for(G=Lh,Lh=[],Se=0;Se<G.length;Se+=2){We=G[Se],Rt=G[Se+1];try{var xn=We.create;We.destroy=xn()}catch(Er){if(null===Rt)throw Error(f(330));Ep(Rt,Er)}}for(xn=b.current.firstEffect;null!==xn;)b=xn.nextEffect,xn.nextEffect=null,8&xn.flags&&(xn.sibling=null,xn.stateNode=null),xn=b;return Ta=x,pc(),!0}function z_(b,x,G){N(b,x=H_(0,x=oh(G,x),1)),x=fd(),null!==(b=lh(b,1))&&(Ea(b,1,x),sd(b,x))}function Ep(b,x){if(3===b.tag)z_(b,b,x);else for(var G=b.return;null!==G;){if(3===G.tag){z_(G,b,x);break}if(1===G.tag){var Se=G.stateNode;if("function"==typeof G.type.getDerivedStateFromError||"function"==typeof Se.componentDidCatch&&(null===od||!od.has(Se))){var We=_g(G,b=oh(x,b),1);if(N(G,We),We=fd(),null!==(G=lh(G,1)))Ea(G,1,We),sd(G,We);else if("function"==typeof Se.componentDidCatch&&(null===od||!od.has(Se)))try{Se.componentDidCatch(x,b)}catch(Rt){}break}}G=G.return}}function ph(b,x,G){var Se=b.pingCache;null!==Se&&Se.delete(x),x=fd(),b.pingedLanes|=b.suspendedLanes&G,Hc===b&&(Ps&G)===G&&(4===Yu||3===Yu&&(62914560&Ps)===Ps&&500>cl()-j_?dh(b,0):gg|=G),sd(b,x)}function $g(b,x){var G=b.stateNode;null!==G&&G.delete(x),0==(x=0)&&(0==(2&(x=b.mode))?x=1:0==(4&x)?x=99===Ll()?1:2:(0===vp&&(vp=Bp),0===(x=Uo(62914560&~vp))&&(x=4194304))),G=fd(),null!==(b=lh(b,x))&&(Ea(b,x,G),sd(b,G))}function Am(b,x,G,Se){this.tag=b,this.key=G,this.sibling=this.child=this.return=this.stateNode=this.type=this.elementType=null,this.index=0,this.ref=null,this.pendingProps=x,this.dependencies=this.memoizedState=this.updateQueue=this.memoizedProps=null,this.mode=Se,this.flags=0,this.lastEffect=this.firstEffect=this.nextEffect=null,this.childLanes=this.lanes=0,this.alternate=null}function Yd(b,x,G,Se){return new Am(b,x,G,Se)}function Tg(b){return!(!(b=b.prototype)||!b.isReactComponent)}function Tp(b,x){var G=b.alternate;return null===G?((G=Yd(b.tag,x,b.key,b.mode)).elementType=b.elementType,G.type=b.type,G.stateNode=b.stateNode,G.alternate=b,b.alternate=G):(G.pendingProps=x,G.type=b.type,G.flags=0,G.nextEffect=null,G.firstEffect=null,G.lastEffect=null),G.childLanes=b.childLanes,G.lanes=b.lanes,G.child=b.child,G.memoizedProps=b.memoizedProps,G.memoizedState=b.memoizedState,G.updateQueue=b.updateQueue,G.dependencies=null===(x=b.dependencies)?null:{lanes:x.lanes,firstContext:x.firstContext},G.sibling=b.sibling,G.index=b.index,G.ref=b.ref,G}function f_(b,x,G,Se,We,Rt){var rn=2;if(Se=b,"function"==typeof b)Tg(b)&&(rn=1);else if("string"==typeof b)rn=5;else e:switch(b){case ce:return Qc(G.children,We,Rt,x);case Gt:rn=8,We|=16;break;case dt:rn=8,We|=1;break;case ze:return(b=Yd(12,G,x,8|We)).elementType=ze,b.type=ze,b.lanes=Rt,b;case Ve:return(b=Yd(13,G,x,We)).type=Ve,b.elementType=Ve,b.lanes=Rt,b;case He:return(b=Yd(19,G,x,We)).elementType=He,b.lanes=Rt,b;case Ut:return J_(G,We,Rt,x);case Bt:return(b=Yd(24,G,x,We)).elementType=Bt,b.lanes=Rt,b;default:if("object"==typeof b&&null!==b)switch(b.$$typeof){case Ye:rn=10;break e;case je:rn=9;break e;case Ie:rn=11;break e;case Zt:rn=14;break e;case st:rn=16,Se=null;break e;case en:rn=22;break e}throw Error(f(130,null==b?b:typeof b,""))}return(x=Yd(rn,G,x,We)).elementType=b,x.type=Se,x.lanes=Rt,x}function Qc(b,x,G,Se){return(b=Yd(7,b,Se,x)).lanes=G,b}function J_(b,x,G,Se){return(b=Yd(23,b,Se,x)).elementType=Ut,b.lanes=G,b}function kh(b,x,G){return(b=Yd(6,b,null,x)).lanes=G,b}function $h(b,x,G){return(x=Yd(4,null!==b.children?b.children:[],b.key,x)).lanes=G,x.stateNode={containerInfo:b.containerInfo,pendingChildren:null,implementation:b.implementation},x}function Sg(b,x,G){this.tag=x,this.containerInfo=b,this.finishedWork=this.pingCache=this.current=this.pendingChildren=null,this.timeoutHandle=-1,this.pendingContext=this.context=null,this.hydrate=G,this.callbackNode=null,this.callbackPriority=0,this.eventTimes=To(0),this.expirationTimes=To(-1),this.entangledLanes=this.finishedLanes=this.mutableReadLanes=this.expiredLanes=this.pingedLanes=this.suspendedLanes=this.pendingLanes=0,this.entanglements=To(0),this.mutableSourceEagerHydrationData=null}function Cg(b,x,G){var Se=3<arguments.length&&void 0!==arguments[3]?arguments[3]:null;return{$$typeof:Oe,key:null==Se?null:""+Se,children:b,containerInfo:x,implementation:G}}function p_(b,x,G,Se){var We=x.current,Rt=fd(),rn=bf(We);e:if(G){t:{if(xo(G=G._reactInternals)!==G||1!==G.tag)throw Error(f(170));var xn=G;do{switch(xn.tag){case 3:xn=xn.stateNode.context;break t;case 1:if(Ou(xn.type)){xn=xn.stateNode.__reactInternalMemoizedMergedChildContext;break t}}xn=xn.return}while(null!==xn);throw Error(f(171))}if(1===G.tag){var Er=G.type;if(Ou(Er)){G=ff(G,Er,xn);break e}}G=xn}else G=Nu;return null===x.context?x.context=G:x.pendingContext=G,(x=E(Rt,rn)).payload={element:b},null!==(Se=void 0===Se?null:Se)&&(x.callback=Se),N(We,x),Gf(We,rn,Rt),rn}function h_(b){if(!(b=b.current).child)return null;switch(b.child.tag){case 5:default:return b.child.stateNode}}function Hh(b,x){if(null!==(b=b.memoizedState)&&null!==b.dehydrated){var G=b.retryLane;b.retryLane=0!==G&&G<x?G:x}}function __(b,x){Hh(b,x),(b=b.alternate)&&Hh(b,x)}function Mg(b,x,G){var Se=null!=G&&null!=G.hydrationOptions&&G.hydrationOptions.mutableSources||null;if(G=new Sg(b,x,null!=G&&!0===G.hydrate),x=Yd(3,null,null,2===x?7:1===x?3:0),G.current=x,x.stateNode=G,$c(x),b[Dd]=G.current,Wd(8===b.nodeType?b.parentNode:b),Se)for(b=0;b<Se.length;b++){var We=(x=Se[b])._getVersion;We=We(x._source),null==G.mutableSourceEagerHydrationData?G.mutableSourceEagerHydrationData=[x,We]:G.mutableSourceEagerHydrationData.push(x,We)}this._internalRoot=G}function g_(b){return!(!b||1!==b.nodeType&&9!==b.nodeType&&11!==b.nodeType&&(8!==b.nodeType||" react-mount-point-unstable "!==b.nodeValue))}function Uh(b,x,G,Se,We){var Rt=G._reactRootContainer;if(Rt){var rn=Rt._internalRoot;if("function"==typeof We){var xn=We;We=function(){var Ei=h_(rn);xn.call(Ei)}}p_(x,rn,b,We)}else{if(Rt=G._reactRootContainer=function(b,x){if(x||(x=!(!(x=b?9===b.nodeType?b.documentElement:b.firstChild:null)||1!==x.nodeType||!x.hasAttribute("data-reactroot"))),!x)for(var G;G=b.lastChild;)b.removeChild(G);return new Mg(b,0,x?{hydrate:!0}:void 0)}(G,Se),rn=Rt._internalRoot,"function"==typeof We){var Er=We;We=function(){var Ei=h_(rn);Er.call(Ei)}}u_(function(){p_(x,rn,b,We)})}return h_(rn)}function Ag(b,x){var G=2<arguments.length&&void 0!==arguments[2]?arguments[2]:null;if(!g_(x))throw Error(f(200));return Cg(b,x,null,G)}W_=function(b,x,G){var Se=x.lanes;if(null!==b)if(b.memoizedProps!==x.pendingProps||Wu.current)Kd=!0;else{if(0==(G&Se)){switch(Kd=!1,x.tag){case 3:ut(x),bt();break;case 5:ol(x);break;case 1:Ou(x.type)&&Xl(x);break;case 4:sa(x,x.stateNode.containerInfo);break;case 10:Se=x.memoizedProps.value;var We=x.type._context;kl(Pd,We._currentValue),We._currentValue=Se;break;case 13:if(null!==x.memoizedState)return 0!=(G&x.child.childLanes)?Fr(b,x,G):(kl(wa,1&wa.current),null!==(x=ya(b,x,G))?x.sibling:null);kl(wa,1&wa.current);break;case 19:if(Se=0!=(G&x.childLanes),0!=(64&b.flags)){if(Se)return Is(b,x,G);x.flags|=64}if(null!==(We=x.memoizedState)&&(We.rendering=null,We.tail=null,We.lastEffect=null),kl(wa,wa.current),Se)break;return null;case 23:case 24:return x.lanes=0,Y(b,x,G)}return ya(b,x,G)}Kd=0!=(16384&b.flags)}else Kd=!1;switch(x.lanes=0,x.tag){case 2:if(Se=x.type,null!==b&&(b.alternate=null,x.alternate=null,x.flags|=2),b=x.pendingProps,We=Mc(x,Qa.current),Id(x,G),We=Hp(null,x,Se,b,We,G),x.flags|=1,"object"==typeof We&&null!==We&&"function"==typeof We.render&&void 0===We.$$typeof){if(x.tag=1,x.memoizedState=null,x.updateQueue=null,Ou(Se)){var Rt=!0;Xl(x)}else Rt=!1;x.memoizedState=null!=We.state?We.state:null,$c(x);var rn=Se.getDerivedStateFromProps;"function"==typeof rn&&Ue(x,Se,rn,b),We.updater=we,x.stateNode=We,We._reactInternals=x,Jt(x,Se,b,G),x=Fe(null,x,Se,!0,Rt,G)}else x.tag=0,oc(null,x,We,G),x=x.child;return x;case 16:We=x.elementType;e:{switch(null!==b&&(b.alternate=null,x.alternate=null,x.flags|=2),b=x.pendingProps,We=(Rt=We._init)(We._payload),x.type=We,Rt=x.tag=function(b){if("function"==typeof b)return Tg(b)?1:0;if(null!=b){if((b=b.$$typeof)===Ie)return 11;if(b===Zt)return 14}return 2}(We),b=Wl(We,b),Rt){case 0:x=w(null,x,We,b,G);break e;case 1:x=q(null,x,We,b,G);break e;case 11:x=rh(null,x,We,b,G);break e;case 14:x=k_(null,x,We,Wl(We.type,b),Se,G);break e}throw Error(f(306,We,""))}return x;case 0:return We=x.pendingProps,w(b,x,Se=x.type,We=x.elementType===Se?We:Wl(Se,We),G);case 1:return We=x.pendingProps,q(b,x,Se=x.type,We=x.elementType===Se?We:Wl(Se,We),G);case 3:if(ut(x),Se=x.updateQueue,null===b||null===Se)throw Error(f(282));if(Se=x.pendingProps,We=null!==(We=x.memoizedState)?We.element:null,h(b,x),K(x,Se,null,G),(Se=x.memoizedState.element)===We)bt(),x=ya(b,x,G);else{if((Rt=(We=x.stateNode).hydrate)&&(xc=va(x.stateNode.containerInfo.firstChild),mu=x,Rt=ic=!0),Rt){if(null!=(b=We.mutableSourceEagerHydrationData))for(We=0;We<b.length;We+=2)(Rt=b[We])._workInProgressVersionPrimary=b[We+1],Qt.push(Rt);for(G=Vo(x,null,Se,G),x.child=G;G;)G.flags=-3&G.flags|1024,G=G.sibling}else oc(b,x,Se,G),bt();x=x.child}return x;case 5:return ol(x),null===b&&X(x),Rt=null!==b?b.memoizedProps:null,rn=(We=x.pendingProps).children,ss(Se=x.type,We)?rn=null:null!==Rt&&ss(Se,Rt)&&(x.flags|=16),fe(b,x),oc(b,x,rn,G),x.child;case 6:return null===b&&X(x),null;case 13:return Fr(b,x,G);case 4:return sa(x,x.stateNode.containerInfo),Se=x.pendingProps,null===b?x.child=Ni(x,null,Se,G):oc(b,x,Se,G),x.child;case 11:return We=x.pendingProps,rh(b,x,Se=x.type,We=x.elementType===Se?We:Wl(Se,We),G);case 7:return oc(b,x,x.pendingProps,G),x.child;case 8:case 12:return oc(b,x,x.pendingProps.children,G),x.child;case 10:e:{Se=x.type._context,rn=x.memoizedProps,Rt=(We=x.pendingProps).value;var xn=x.type._context;if(kl(Pd,xn._currentValue),xn._currentValue=Rt,null!==rn)if(0==(Rt=Ks(xn=rn.value,Rt)?0:0|("function"==typeof Se._calculateChangedBits?Se._calculateChangedBits(xn,Rt):1073741823))){if(rn.children===We.children&&!Wu.current){x=ya(b,x,G);break e}}else for(null!==(xn=x.child)&&(xn.return=x);null!==xn;){var Er=xn.dependencies;if(null!==Er){rn=xn.child;for(var Ei=Er.firstContext;null!==Ei;){if(Ei.context===Se&&0!=(Ei.observedBits&Rt)){1===xn.tag&&((Ei=E(-1,G&-G)).tag=2,N(xn,Ei)),xn.lanes|=G,null!==(Ei=xn.alternate)&&(Ei.lanes|=G),fu(xn.return,G),Er.lanes|=G;break}Ei=Ei.next}}else rn=10===xn.tag&&xn.type===x.type?null:xn.child;if(null!==rn)rn.return=xn;else for(rn=xn;null!==rn;){if(rn===x){rn=null;break}if(null!==(xn=rn.sibling)){xn.return=rn.return,rn=xn;break}rn=rn.return}xn=rn}oc(b,x,We.children,G),x=x.child}return x;case 9:return We=x.type,Se=(Rt=x.pendingProps).children,Id(x,G),Se=Se(We=Sl(We,Rt.unstable_observedBits)),x.flags|=1,oc(b,x,Se,G),x.child;case 14:return Rt=Wl(We=x.type,x.pendingProps),k_(b,x,We,Rt=Wl(We.type,Rt),Se,G);case 15:return qh(b,x,x.type,x.pendingProps,Se,G);case 17:return We=x.pendingProps,We=x.elementType===(Se=x.type)?We:Wl(Se,We),null!==b&&(b.alternate=null,x.alternate=null,x.flags|=2),x.tag=1,Ou(Se)?(b=!0,Xl(x)):b=!1,Id(x,G),gt(x,Se,We),Jt(x,Se,We,G),Fe(null,x,Se,!0,b,G);case 19:return Is(b,x,G);case 23:case 24:return Y(b,x,G)}throw Error(f(156,x.tag))},Mg.prototype.render=function(b){p_(b,this._internalRoot,null,null)},Mg.prototype.unmount=function(){var b=this._internalRoot,x=b.containerInfo;p_(null,b,null,function(){x[Dd]=null})},Ct=function(b){13===b.tag&&(Gf(b,4,fd()),__(b,4))},pr=function(b){13===b.tag&&(Gf(b,67108864,fd()),__(b,67108864))},nn=function(b){if(13===b.tag){var x=fd(),G=bf(b);Gf(b,G,x),__(b,G)}},Cn=function(b,x){return x()},jt=function(b,x,G){switch(x){case"input":if(Br(b,G),x=G.name,"radio"===G.type&&null!=x){for(G=b;G.parentNode;)G=G.parentNode;for(G=G.querySelectorAll("input[name="+JSON.stringify(""+x)+'][type="radio"]'),x=0;x<G.length;x++){var Se=G[x];if(Se!==b&&Se.form===b.form){var We=Qd(Se);if(!We)throw Error(f(90));Zr(Se),Br(Se,We)}}}break;case"textarea":hi(b,G);break;case"select":null!=(x=G.value)&&Lr(b,!!G.multiple,x,!1)}},nr=ch,Gi=function(b,x,G,Se,We){var Rt=Ta;Ta|=4;try{return il(98,b.bind(null,x,G,Se,We))}finally{0===(Ta=Rt)&&(ep(),pc())}},po=function(){0==(49&Ta)&&(function(){if(null!==jf){var b=jf;jf=null,b.forEach(function(x){x.expiredLanes|=24&x.pendingLanes,sd(x,cl())})}pc()}(),bp())},yo=function(b,x){var G=Ta;Ta|=2;try{return b(x)}finally{0===(Ta=G)&&(ep(),pc())}};var ov={Events:[Vu,Sc,Qd,kn,wn,bp,{current:!1}]},Bh={findFiberByHostInstance:Tc,bundleType:0,version:"17.0.2",rendererPackageName:"react-dom"},Om={bundleType:Bh.bundleType,version:Bh.version,rendererPackageName:Bh.rendererPackageName,rendererConfig:Bh.rendererConfig,overrideHookState:null,overrideHookStateDeletePath:null,overrideHookStateRenamePath:null,overrideProps:null,overridePropsDeletePath:null,overridePropsRenamePath:null,setSuspenseHandler:null,scheduleUpdate:null,currentDispatcherRef:he.ReactCurrentDispatcher,findHostInstanceByFiber:function(b){return null===(b=Ht(b))?null:b.stateNode},findFiberByHostInstance:Bh.findFiberByHostInstance||function(){return null},findHostInstancesForRefresh:null,scheduleRefresh:null,scheduleRoot:null,setRefreshHandler:null,getCurrentFiber:null};if("undefined"!=typeof __REACT_DEVTOOLS_GLOBAL_HOOK__){var m_=__REACT_DEVTOOLS_GLOBAL_HOOK__;if(!m_.isDisabled&&m_.supportsFiber)try{Ac=m_.inject(Om),Vc=m_}catch(b){}}S.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED=ov,S.createPortal=Ag,S.findDOMNode=function(b){if(null==b)return null;if(1===b.nodeType)return b;var x=b._reactInternals;if(void 0===x)throw"function"==typeof b.render?Error(f(188)):Error(f(268,Object.keys(b)));return null===(b=Ht(x))?null:b.stateNode},S.flushSync=function(b,x){var G=Ta;if(0!=(48&G))return b(x);Ta|=1;try{if(b)return il(99,b.bind(null,x))}finally{Ta=G,pc()}},S.hydrate=function(b,x,G){if(!g_(x))throw Error(f(200));return Uh(null,b,x,!0,G)},S.render=function(b,x,G){if(!g_(x))throw Error(f(200));return Uh(null,b,x,!1,G)},S.unmountComponentAtNode=function(b){if(!g_(b))throw Error(f(40));return!!b._reactRootContainer&&(u_(function(){Uh(null,null,b,!1,function(){b._reactRootContainer=null,b[Dd]=null})}),!0)},S.unstable_batchedUpdates=ch,S.unstable_createPortal=function(b,x){return Ag(b,x,2<arguments.length&&void 0!==arguments[2]?arguments[2]:null)},S.unstable_renderSubtreeIntoContainer=function(b,x,G,Se){if(!g_(G))throw Error(f(200));if(null==b||void 0===b._reactInternals)throw Error(f(38));return Uh(b,x,G,!1,Se)},S.version="17.0.2"},88768:(v,S,i)=>{"use strict";(function r(){if("undefined"!=typeof __REACT_DEVTOOLS_GLOBAL_HOOK__&&"function"==typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE)try{__REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE(r)}catch(u){console.error(u)}})(),v.exports=i(85503)},14395:(v,S,i)=>{"use strict";var p,r=i(16482),u="<<anonymous>>",f=function(){invariant(!1,"ImmutablePropTypes type checking code is stripped in production.")};f.isRequired=f;var e=function(){return f};function M(ce,dt){return function(ce,dt){return function(ce){function dt(Ye,je,Ie,Ve,He,Zt){for(var st=arguments.length,en=Array(st>6?st-6:0),$t=6;$t<st;$t++)en[$t-6]=arguments[$t];return Zt=Zt||Ie,Ve=Ve||u,null!=je[Ie]?ce.apply(void 0,[je,Ie,Ve,He,Zt].concat(en)):Ye?new Error("Required "+He+" `"+Zt+"` was not specified in `"+Ve+"`."):void 0}var ze=dt.bind(null,!1);return ze.isRequired=dt.bind(null,!0),ze}(function(Ye,je,Ie,Ve,He){var Zt=Ye[je];if(!dt(Zt)){var st=function(ce){var dt=typeof ce;return Array.isArray(ce)?"array":ce instanceof RegExp?"object":ce instanceof r.Iterable?"Immutable."+ce.toSource().split(" ")[0]:dt}(Zt);return new Error("Invalid "+Ve+" `"+He+"` of type `"+st+"` supplied to `"+Ie+"`, expected `"+ce+"`.")}return null})}("Iterable."+ce,function(ze){return r.Iterable.isIterable(ze)&&dt(ze)})}(p={listOf:e,mapOf:e,orderedMapOf:e,setOf:e,orderedSetOf:e,stackOf:e,iterableOf:e,recordOf:e,shape:e,contains:e,mapContains:e,orderedMapContains:e,list:f,map:f,orderedMap:f,set:f,orderedSet:f,stack:f,seq:f,record:f,iterable:f}).iterable.indexed=M("Indexed",r.Iterable.isIndexed),p.iterable.keyed=M("Keyed",r.Iterable.isKeyed),v.exports=p},6249:(v,S)=>{"use strict";var i="function"==typeof Symbol&&Symbol.for,r=i?Symbol.for("react.element"):60103,u=i?Symbol.for("react.portal"):60106,p=i?Symbol.for("react.fragment"):60107,f=i?Symbol.for("react.strict_mode"):60108,e=i?Symbol.for("react.profiler"):60114,_=i?Symbol.for("react.provider"):60109,y=i?Symbol.for("react.context"):60110,T=i?Symbol.for("react.async_mode"):60111,M=i?Symbol.for("react.concurrent_mode"):60111,R=i?Symbol.for("react.forward_ref"):60112,F=i?Symbol.for("react.suspense"):60113,Z=i?Symbol.for("react.suspense_list"):60120,J=i?Symbol.for("react.memo"):60115,Q=i?Symbol.for("react.lazy"):60116,ee=i?Symbol.for("react.block"):60121,ue=i?Symbol.for("react.fundamental"):60117,ae=i?Symbol.for("react.responder"):60118,$=i?Symbol.for("react.scope"):60119;function se(oe){if("object"==typeof oe&&null!==oe){var he=oe.$$typeof;switch(he){case r:switch(oe=oe.type){case T:case M:case p:case e:case f:case F:return oe;default:switch(oe=oe&&oe.$$typeof){case y:case R:case Q:case J:case _:return oe;default:return he}}case u:return he}}}function ve(oe){return se(oe)===M}S.AsyncMode=T,S.ConcurrentMode=M,S.ContextConsumer=y,S.ContextProvider=_,S.Element=r,S.ForwardRef=R,S.Fragment=p,S.Lazy=Q,S.Memo=J,S.Portal=u,S.Profiler=e,S.StrictMode=f,S.Suspense=F,S.isAsyncMode=function(oe){return ve(oe)||se(oe)===T},S.isConcurrentMode=ve,S.isContextConsumer=function(oe){return se(oe)===y},S.isContextProvider=function(oe){return se(oe)===_},S.isElement=function(oe){return"object"==typeof oe&&null!==oe&&oe.$$typeof===r},S.isForwardRef=function(oe){return se(oe)===R},S.isFragment=function(oe){return se(oe)===p},S.isLazy=function(oe){return se(oe)===Q},S.isMemo=function(oe){return se(oe)===J},S.isPortal=function(oe){return se(oe)===u},S.isProfiler=function(oe){return se(oe)===e},S.isStrictMode=function(oe){return se(oe)===f},S.isSuspense=function(oe){return se(oe)===F},S.isValidElementType=function(oe){return"string"==typeof oe||"function"==typeof oe||oe===p||oe===M||oe===e||oe===f||oe===F||oe===Z||"object"==typeof oe&&null!==oe&&(oe.$$typeof===Q||oe.$$typeof===J||oe.$$typeof===_||oe.$$typeof===y||oe.$$typeof===R||oe.$$typeof===ue||oe.$$typeof===ae||oe.$$typeof===$||oe.$$typeof===ee)},S.typeOf=se},38308:(v,S,i)=>{"use strict";v.exports=i(6249)},1422:(v,S)=>{"use strict";var r=60103,u=60106,p=60107,f=60108,e=60114,_=60109,y=60110,T=60112,M=60113,R=60120,F=60115,Z=60116;if("function"==typeof Symbol&&Symbol.for){var $=Symbol.for;r=$("react.element"),u=$("react.portal"),p=$("react.fragment"),f=$("react.strict_mode"),e=$("react.profiler"),_=$("react.provider"),y=$("react.context"),T=$("react.forward_ref"),M=$("react.suspense"),R=$("react.suspense_list"),F=$("react.memo"),Z=$("react.lazy"),$("react.block"),$("react.server.block"),$("react.fundamental"),$("react.debug_trace_mode"),$("react.legacy_hidden")}S.isContextConsumer=function(Ie){return function(Ie){if("object"==typeof Ie&&null!==Ie){var Ve=Ie.$$typeof;switch(Ve){case r:switch(Ie=Ie.type){case p:case e:case f:case M:case R:return Ie;default:switch(Ie=Ie&&Ie.$$typeof){case y:case T:case Z:case F:case _:return Ie;default:return Ve}}case u:return Ve}}}(Ie)===y}},56261:(v,S,i)=>{"use strict";v.exports=i(1422)},55429:(v,S,i)=>{"use strict";var r=i(18228),u=60103,p=60106;S.Fragment=60107,S.StrictMode=60108,S.Profiler=60114;var f=60109,e=60110,_=60112;S.Suspense=60113;var y=60115,T=60116;if("function"==typeof Symbol&&Symbol.for){var M=Symbol.for;u=M("react.element"),p=M("react.portal"),S.Fragment=M("react.fragment"),S.StrictMode=M("react.strict_mode"),S.Profiler=M("react.profiler"),f=M("react.provider"),e=M("react.context"),_=M("react.forward_ref"),S.Suspense=M("react.suspense"),y=M("react.memo"),T=M("react.lazy")}var R="function"==typeof Symbol&&Symbol.iterator;function Z(st){for(var en="https://reactjs.org/docs/error-decoder.html?invariant="+st,$t=1;$t<arguments.length;$t++)en+="&args[]="+encodeURIComponent(arguments[$t]);return"Minified React error #"+st+"; visit "+en+" for the full message or use the non-minified dev environment for full errors and additional helpful warnings."}var J={isMounted:function(){return!1},enqueueForceUpdate:function(){},enqueueReplaceState:function(){},enqueueSetState:function(){}},Q={};function ee(st,en,$t){this.props=st,this.context=en,this.refs=Q,this.updater=$t||J}function ue(){}function ae(st,en,$t){this.props=st,this.context=en,this.refs=Q,this.updater=$t||J}ee.prototype.isReactComponent={},ee.prototype.setState=function(st,en){if("object"!=typeof st&&"function"!=typeof st&&null!=st)throw Error(Z(85));this.updater.enqueueSetState(this,st,en,"setState")},ee.prototype.forceUpdate=function(st){this.updater.enqueueForceUpdate(this,st,"forceUpdate")},ue.prototype=ee.prototype;var $=ae.prototype=new ue;$.constructor=ae,r($,ee.prototype),$.isPureReactComponent=!0;var se={current:null},ve=Object.prototype.hasOwnProperty,oe={key:!0,ref:!0,__self:!0,__source:!0};function he(st,en,$t){var Gt,Ut={},Bt=null,mt=null;if(null!=en)for(Gt in void 0!==en.ref&&(mt=en.ref),void 0!==en.key&&(Bt=""+en.key),en)ve.call(en,Gt)&&!oe.hasOwnProperty(Gt)&&(Ut[Gt]=en[Gt]);var Yt=arguments.length-2;if(1===Yt)Ut.children=$t;else if(1<Yt){for(var Dt=Array(Yt),zt=0;zt<Yt;zt++)Dt[zt]=arguments[zt+2];Ut.children=Dt}if(st&&st.defaultProps)for(Gt in Yt=st.defaultProps)void 0===Ut[Gt]&&(Ut[Gt]=Yt[Gt]);return{$$typeof:u,type:st,key:Bt,ref:mt,props:Ut,_owner:se.current}}function Oe(st){return"object"==typeof st&&null!==st&&st.$$typeof===u}var dt=/\/+/g;function ze(st,en){return"object"==typeof st&&null!==st&&null!=st.key?function(st){var en={"=":"=0",":":"=2"};return"$"+st.replace(/[=:]/g,function($t){return en[$t]})}(""+st.key):en.toString(36)}function Ye(st,en,$t,Gt,Ut){var Bt=typeof st;("undefined"===Bt||"boolean"===Bt)&&(st=null);var mt=!1;if(null===st)mt=!0;else switch(Bt){case"string":case"number":mt=!0;break;case"object":switch(st.$$typeof){case u:case p:mt=!0}}if(mt)return Ut=Ut(mt=st),st=""===Gt?"."+ze(mt,0):Gt,Array.isArray(Ut)?($t="",null!=st&&($t=st.replace(dt,"$&/")+"/"),Ye(Ut,en,$t,"",function(zt){return zt})):null!=Ut&&(Oe(Ut)&&(Ut=function(st,en){return{$$typeof:u,type:st.type,key:en,ref:st.ref,props:st.props,_owner:st._owner}}(Ut,$t+(!Ut.key||mt&&mt.key===Ut.key?"":(""+Ut.key).replace(dt,"$&/")+"/")+st)),en.push(Ut)),1;if(mt=0,Gt=""===Gt?".":Gt+":",Array.isArray(st))for(var Yt=0;Yt<st.length;Yt++){var Dt=Gt+ze(Bt=st[Yt],Yt);mt+=Ye(Bt,en,$t,Dt,Ut)}else if("function"==typeof(Dt=function(st){return null===st||"object"!=typeof st?null:"function"==typeof(st=R&&st[R]||st["@@iterator"])?st:null}(st)))for(st=Dt.call(st),Yt=0;!(Bt=st.next()).done;)mt+=Ye(Bt=Bt.value,en,$t,Dt=Gt+ze(Bt,Yt++),Ut);else if("object"===Bt)throw en=""+st,Error(Z(31,"[object Object]"===en?"object with keys {"+Object.keys(st).join(", ")+"}":en));return mt}function je(st,en,$t){if(null==st)return st;var Gt=[],Ut=0;return Ye(st,Gt,"","",function(Bt){return en.call($t,Bt,Ut++)}),Gt}function Ie(st){if(-1===st._status){var en=st._result;en=en(),st._status=0,st._result=en,en.then(function($t){0===st._status&&($t=$t.default,st._status=1,st._result=$t)},function($t){0===st._status&&(st._status=2,st._result=$t)})}if(1===st._status)return st._result;throw st._result}var Ve={current:null};function He(){var st=Ve.current;if(null===st)throw Error(Z(321));return st}var Zt={ReactCurrentDispatcher:Ve,ReactCurrentBatchConfig:{transition:0},ReactCurrentOwner:se,IsSomeRendererActing:{current:!1},assign:r};S.Children={map:je,forEach:function(st,en,$t){je(st,function(){en.apply(this,arguments)},$t)},count:function(st){var en=0;return je(st,function(){en++}),en},toArray:function(st){return je(st,function(en){return en})||[]},only:function(st){if(!Oe(st))throw Error(Z(143));return st}},S.Component=ee,S.PureComponent=ae,S.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED=Zt,S.cloneElement=function(st,en,$t){if(null==st)throw Error(Z(267,st));var Gt=r({},st.props),Ut=st.key,Bt=st.ref,mt=st._owner;if(null!=en){if(void 0!==en.ref&&(Bt=en.ref,mt=se.current),void 0!==en.key&&(Ut=""+en.key),st.type&&st.type.defaultProps)var Yt=st.type.defaultProps;for(Dt in en)ve.call(en,Dt)&&!oe.hasOwnProperty(Dt)&&(Gt[Dt]=void 0===en[Dt]&&void 0!==Yt?Yt[Dt]:en[Dt])}var Dt=arguments.length-2;if(1===Dt)Gt.children=$t;else if(1<Dt){Yt=Array(Dt);for(var zt=0;zt<Dt;zt++)Yt[zt]=arguments[zt+2];Gt.children=Yt}return{$$typeof:u,type:st.type,key:Ut,ref:Bt,props:Gt,_owner:mt}},S.createContext=function(st,en){return void 0===en&&(en=null),(st={$$typeof:e,_calculateChangedBits:en,_currentValue:st,_currentValue2:st,_threadCount:0,Provider:null,Consumer:null}).Provider={$$typeof:f,_context:st},st.Consumer=st},S.createElement=he,S.createFactory=function(st){var en=he.bind(null,st);return en.type=st,en},S.createRef=function(){return{current:null}},S.forwardRef=function(st){return{$$typeof:_,render:st}},S.isValidElement=Oe,S.lazy=function(st){return{$$typeof:T,_payload:{_status:-1,_result:st},_init:Ie}},S.memo=function(st,en){return{$$typeof:y,type:st,compare:void 0===en?null:en}},S.useCallback=function(st,en){return He().useCallback(st,en)},S.useContext=function(st,en){return He().useContext(st,en)},S.useDebugValue=function(){},S.useEffect=function(st,en){return He().useEffect(st,en)},S.useImperativeHandle=function(st,en,$t){return He().useImperativeHandle(st,en,$t)},S.useLayoutEffect=function(st,en){return He().useLayoutEffect(st,en)},S.useMemo=function(st,en){return He().useMemo(st,en)},S.useReducer=function(st,en,$t){return He().useReducer(st,en,$t)},S.useRef=function(st){return He().useRef(st)},S.useState=function(st){return He().useState(st)},S.version="17.0.2"},78139:(v,S,i)=>{"use strict";v.exports=i(55429)},59882:(v,S,i)=>{"use strict";Object.defineProperty(S,"__esModule",{value:!0});var e,u=(e=i(16482))&&e.__esModule?e:{default:e},p=i(11715);S.default=function(e){var _=arguments.length>1&&void 0!==arguments[1]?arguments[1]:u.default.Map,y=Object.keys(e);return function(){var T=arguments.length>0&&void 0!==arguments[0]?arguments[0]:_(),M=arguments[1];return T.withMutations(function(F){y.forEach(function(Z){var ee=(0,e[Z])(F.get(Z),M);(0,p.validateNextState)(ee,Z,M),F.set(Z,ee)})})}},v.exports=S.default},31208:(v,S,i)=>{"use strict";S.U=void 0;var e,p=(e=i(59882))&&e.__esModule?e:{default:e};S.U=p.default},46944:(v,S)=>{"use strict";Object.defineProperty(S,"__esModule",{value:!0}),S.default=function(i){return i&&"@@redux/INIT"===i.type?"initialState argument passed to createStore":"previous state received by the reducer"},v.exports=S.default},99319:(v,S,i)=>{"use strict";Object.defineProperty(S,"__esModule",{value:!0});var u=e(i(16482)),f=e(i(46944));function e(_){return _&&_.__esModule?_:{default:_}}S.default=function(_,y,T){var M=Object.keys(y);if(!M.length)return"Store does not have a valid reducer. Make sure the argument passed to combineReducers is an object whose values are reducers.";var R=(0,f.default)(T);if(u.default.isImmutable?!u.default.isImmutable(_):!u.default.Iterable.isIterable(_))return"The "+R+' is of unexpected type. Expected argument to be an instance of Immutable.Collection or Immutable.Record with the following properties: "'+M.join('", "')+'".';var F=_.toSeq().keySeq().toArray().filter(function(Z){return!y.hasOwnProperty(Z)});return F.length>0?"Unexpected "+(1===F.length?"property":"properties")+' "'+F.join('", "')+'" found in '+R+'. Expected to find one of the known reducer property names instead: "'+M.join('", "')+'". Unexpected properties will be ignored.':null},v.exports=S.default},11715:(v,S,i)=>{"use strict";Object.defineProperty(S,"__esModule",{value:!0}),S.validateNextState=S.getUnexpectedInvocationParameterMessage=S.getStateName=void 0;var u=y(i(46944)),f=y(i(99319)),_=y(i(95159));function y(T){return T&&T.__esModule?T:{default:T}}S.getStateName=u.default,S.getUnexpectedInvocationParameterMessage=f.default,S.validateNextState=_.default},95159:(v,S)=>{"use strict";Object.defineProperty(S,"__esModule",{value:!0}),S.default=function(i,r,u){if(void 0===i)throw new Error('Reducer "'+r+'" returned undefined when handling "'+u.type+'" action. To ignore an action, you must explicitly return the previous state.')},v.exports=S.default},88280:v=>{"use strict";var i,S="";v.exports=function(u,p){if("string"!=typeof u)throw new TypeError("expected a string");if(1===p)return u;if(2===p)return u+u;var f=u.length*p;if(i!==u||void 0===i)i=u,S="";else if(S.length>=f)return S.substr(0,f);for(;f>S.length&&p>1;)1&p&&(S+=u),p>>=1,u+=u;return S=(S+=u).substr(0,f)}},90465:v=>{"use strict";v.exports=function(i,r){if(r=r.split(":")[0],!(i=+i))return!1;switch(r){case"http":case"ws":return 80!==i;case"https":case"wss":return 443!==i;case"ftp":return 21!==i;case"gopher":return 70!==i;case"file":return!1}return 0!==i}},66952:(v,S,i)=>{const r=i(18514),u=i(29394),p=i(87931),f=i(45899);v.exports=e=>{var y,T,_=0,M={type:u.ROOT,stack:[]},R=M,F=M.stack,Z=[],J=he=>{r.error(e,"Nothing to repeat at column "+(he-1))},Q=r.strToChars(e);for(y=Q.length;_<y;)switch(T=Q[_++],T){case"\\":switch(T=Q[_++]){case"b":F.push(f.wordBoundary());break;case"B":F.push(f.nonWordBoundary());break;case"w":F.push(p.words());break;case"W":F.push(p.notWords());break;case"d":F.push(p.ints());break;case"D":F.push(p.notInts());break;case"s":F.push(p.whitespace());break;case"S":F.push(p.notWhitespace());break;default:/\d/.test(T)?F.push({type:u.REFERENCE,value:parseInt(T,10)}):F.push({type:u.CHAR,value:T.charCodeAt(0)})}break;case"^":F.push(f.begin());break;case"$":F.push(f.end());break;case"[":var ee;"^"===Q[_]?(ee=!0,_++):ee=!1;var ue=r.tokenizeClass(Q.slice(_),e);_+=ue[1],F.push({type:u.SET,set:ue[0],not:ee});break;case".":F.push(p.anyChar());break;case"(":var ae={type:u.GROUP,stack:[],remember:!0};"?"===(T=Q[_])&&(T=Q[_+1],_+=2,"="===T?ae.followedBy=!0:"!"===T?ae.notFollowedBy=!0:":"!==T&&r.error(e,`Invalid group, character '${T}' after '?' at column ${_-1}`),ae.remember=!1),F.push(ae),Z.push(R),R=ae,F=ae.stack;break;case")":0===Z.length&&r.error(e,"Unmatched ) at column "+(_-1)),F=(R=Z.pop()).options?R.options[R.options.length-1]:R.stack;break;case"|":R.options||(R.options=[R.stack],delete R.stack);var $=[];R.options.push($),F=$;break;case"{":var ve,oe,se=/^(\d+)(,(\d+)?)?\}/.exec(Q.slice(_));null!==se?(0===F.length&&J(_),ve=parseInt(se[1],10),oe=se[2]?se[3]?parseInt(se[3],10):1/0:ve,_+=se[0].length,F.push({type:u.REPETITION,min:ve,max:oe,value:F.pop()})):F.push({type:u.CHAR,value:123});break;case"?":0===F.length&&J(_),F.push({type:u.REPETITION,min:0,max:1,value:F.pop()});break;case"+":0===F.length&&J(_),F.push({type:u.REPETITION,min:1,max:1/0,value:F.pop()});break;case"*":0===F.length&&J(_),F.push({type:u.REPETITION,min:0,max:1/0,value:F.pop()});break;default:F.push({type:u.CHAR,value:T.charCodeAt(0)})}return 0!==Z.length&&r.error(e,"Unterminated group"),M},v.exports.types=u},45899:(v,S,i)=>{const r=i(29394);S.wordBoundary=()=>({type:r.POSITION,value:"b"}),S.nonWordBoundary=()=>({type:r.POSITION,value:"B"}),S.begin=()=>({type:r.POSITION,value:"^"}),S.end=()=>({type:r.POSITION,value:"$"})},87931:(v,S,i)=>{const r=i(29394),u=()=>[{type:r.RANGE,from:48,to:57}],p=()=>[{type:r.CHAR,value:95},{type:r.RANGE,from:97,to:122},{type:r.RANGE,from:65,to:90}].concat(u()),f=()=>[{type:r.CHAR,value:9},{type:r.CHAR,value:10},{type:r.CHAR,value:11},{type:r.CHAR,value:12},{type:r.CHAR,value:13},{type:r.CHAR,value:32},{type:r.CHAR,value:160},{type:r.CHAR,value:5760},{type:r.RANGE,from:8192,to:8202},{type:r.CHAR,value:8232},{type:r.CHAR,value:8233},{type:r.CHAR,value:8239},{type:r.CHAR,value:8287},{type:r.CHAR,value:12288},{type:r.CHAR,value:65279}];S.words=()=>({type:r.SET,set:p(),not:!1}),S.notWords=()=>({type:r.SET,set:p(),not:!0}),S.ints=()=>({type:r.SET,set:u(),not:!1}),S.notInts=()=>({type:r.SET,set:u(),not:!0}),S.whitespace=()=>({type:r.SET,set:f(),not:!1}),S.notWhitespace=()=>({type:r.SET,set:f(),not:!0}),S.anyChar=()=>({type:r.SET,set:[{type:r.CHAR,value:10},{type:r.CHAR,value:13},{type:r.CHAR,value:8232},{type:r.CHAR,value:8233}],not:!0})},29394:v=>{v.exports={ROOT:0,GROUP:1,POSITION:2,SET:3,RANGE:4,REPETITION:5,REFERENCE:6,CHAR:7}},18514:(v,S,i)=>{const r=i(29394),u=i(87931),f={0:0,t:9,n:10,v:11,f:12,r:13};S.strToChars=function(e){return e.replace(/(\[\\b\])|(\\)?\\(?:u([A-F0-9]{4})|x([A-F0-9]{2})|(0?[0-7]{2})|c([@A-Z[\\\]^?])|([0tnvfr]))/g,function(y,T,M,R,F,Z,J,Q){if(M)return y;var ee=T?8:R?parseInt(R,16):F?parseInt(F,16):Z?parseInt(Z,8):J?"@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^ ?".indexOf(J):f[Q],ue=String.fromCharCode(ee);return/[[\]{}^$.|?*+()]/.test(ue)&&(ue="\\"+ue),ue})},S.tokenizeClass=(e,_)=>{for(var M,R,y=[],T=/\\(?:(w)|(d)|(s)|(W)|(D)|(S))|((?:(?:\\)(.)|([^\]\\]))-(?:\\)?([^\]]))|(\])|(?:\\)?([^])/g;null!=(M=T.exec(e));)if(M[1])y.push(u.words());else if(M[2])y.push(u.ints());else if(M[3])y.push(u.whitespace());else if(M[4])y.push(u.notWords());else if(M[5])y.push(u.notInts());else if(M[6])y.push(u.notWhitespace());else if(M[7])y.push({type:r.RANGE,from:(M[8]||M[9]).charCodeAt(0),to:M[10].charCodeAt(0)});else{if(!(R=M[12]))return[y,T.lastIndex];y.push({type:r.CHAR,value:R.charCodeAt(0)})}S.error(_,"Unterminated character class")},S.error=(e,_)=>{throw new SyntaxError("Invalid regular expression: /"+e+"/: "+_)}},26215:(v,S,i)=>{"use strict";i.d(S,{X:()=>p});var r=i(79765),u=i(77971);class p extends r.xQ{constructor(e){super(),this._value=e}get value(){return this.getValue()}_subscribe(e){const _=super._subscribe(e);return _&&!_.closed&&e.next(this._value),_}getValue(){if(this.hasError)throw this.thrownError;if(this.closed)throw new u.N;return this._value}next(e){super.next(this._value=e)}}},23098:(v,S,i)=>{"use strict";i.d(S,{P:()=>e});var r=i(59193),u=i(25917),p=i(40205);class e{constructor(y,T,M){this.kind=y,this.value=T,this.error=M,this.hasValue="N"===y}observe(y){switch(this.kind){case"N":return y.next&&y.next(this.value);case"E":return y.error&&y.error(this.error);case"C":return y.complete&&y.complete()}}do(y,T,M){switch(this.kind){case"N":return y&&y(this.value);case"E":return T&&T(this.error);case"C":return M&&M()}}accept(y,T,M){return y&&"function"==typeof y.next?this.observe(y):this.do(y,T,M)}toObservable(){switch(this.kind){case"N":return(0,u.of)(this.value);case"E":return(0,p._)(this.error);case"C":return(0,r.c)()}throw new Error("unexpected notification kind value")}static createNext(y){return void 0!==y?new e("N",y):e.undefinedValueNotification}static createError(y){return new e("E",void 0,y)}static createComplete(){return e.completeNotification}}e.completeNotification=new e("C"),e.undefinedValueNotification=new e("N",void 0)},18891:(v,S,i)=>{"use strict";i.d(S,{y:()=>M});var r=i(77393),p=i(29181),f=i(46490),_=i(16554),y=i(34022),T=i(82494);let M=(()=>{class F{constructor(J){this._isScalar=!1,J&&(this._subscribe=J)}lift(J){const Q=new F;return Q.source=this,Q.operator=J,Q}subscribe(J,Q,ee){const{operator:ue}=this,ae=function(F,Z,J){if(F){if(F instanceof r.L)return F;if(F[p.b])return F[p.b]()}return F||Z||J?new r.L(F,Z,J):new r.L(f.c)}(J,Q,ee);if(ae.add(ue?ue.call(ae,this.source):this.source||T.v.useDeprecatedSynchronousErrorHandling&&!ae.syncErrorThrowable?this._subscribe(ae):this._trySubscribe(ae)),T.v.useDeprecatedSynchronousErrorHandling&&ae.syncErrorThrowable&&(ae.syncErrorThrowable=!1,ae.syncErrorThrown))throw ae.syncErrorValue;return ae}_trySubscribe(J){try{return this._subscribe(J)}catch(Q){T.v.useDeprecatedSynchronousErrorHandling&&(J.syncErrorThrown=!0,J.syncErrorValue=Q),function(F){for(;F;){const{closed:Z,destination:J,isStopped:Q}=F;if(Z||Q)return!1;F=J&&J instanceof r.L?J:null}return!0}(J)?J.error(Q):console.warn(Q)}}forEach(J,Q){return new(Q=R(Q))((ee,ue)=>{let ae;ae=this.subscribe($=>{try{J($)}catch(se){ue(se),ae&&ae.unsubscribe()}},ue,ee)})}_subscribe(J){const{source:Q}=this;return Q&&Q.subscribe(J)}[_.L](){return this}pipe(...J){return 0===J.length?this:(0,y.U)(J)(this)}toPromise(J){return new(J=R(J))((Q,ee)=>{let ue;this.subscribe(ae=>ue=ae,ae=>ee(ae),()=>Q(ue))})}}return F.create=Z=>new F(Z),F})();function R(F){if(F||(F=T.v.Promise||Promise),!F)throw new Error("no Promise impl found");return F}},46490:(v,S,i)=>{"use strict";i.d(S,{c:()=>p});var r=i(82494),u=i(54449);const p={closed:!0,next(f){},error(f){if(r.v.useDeprecatedSynchronousErrorHandling)throw f;(0,u.z)(f)},complete(){}}},55197:(v,S,i)=>{"use strict";i.d(S,{L:()=>u});var r=i(77393);class u extends r.L{notifyNext(f,e,_,y,T){this.destination.next(e)}notifyError(f,e){this.destination.error(f)}notifyComplete(f){this.destination.complete()}}},80226:(v,S,i)=>{"use strict";i.d(S,{t:()=>Z});var r=i(79765),u=i(36465),f=i(16102);const y=new class extends f.v{}(class extends u.o{constructor(ee,ue){super(ee,ue),this.scheduler=ee,this.work=ue}schedule(ee,ue=0){return ue>0?super.schedule(ee,ue):(this.delay=ue,this.state=ee,this.scheduler.flush(this),this)}execute(ee,ue){return ue>0||this.closed?super.execute(ee,ue):this._execute(ee,ue)}requestAsyncId(ee,ue,ae=0){return null!==ae&&ae>0||null===ae&&this.delay>0?super.requestAsyncId(ee,ue,ae):ee.flush(this)}});var T=i(75319),M=i(59746),R=i(77971),F=i(78858);class Z extends r.xQ{constructor(ee=Number.POSITIVE_INFINITY,ue=Number.POSITIVE_INFINITY,ae){super(),this.scheduler=ae,this._events=[],this._infiniteTimeWindow=!1,this._bufferSize=ee<1?1:ee,this._windowTime=ue<1?1:ue,ue===Number.POSITIVE_INFINITY?(this._infiniteTimeWindow=!0,this.next=this.nextInfiniteTimeWindow):this.next=this.nextTimeWindow}nextInfiniteTimeWindow(ee){if(!this.isStopped){const ue=this._events;ue.push(ee),ue.length>this._bufferSize&&ue.shift()}super.next(ee)}nextTimeWindow(ee){this.isStopped||(this._events.push(new J(this._getNow(),ee)),this._trimBufferThenGetEvents()),super.next(ee)}_subscribe(ee){const ue=this._infiniteTimeWindow,ae=ue?this._events:this._trimBufferThenGetEvents(),$=this.scheduler,se=ae.length;let ve;if(this.closed)throw new R.N;if(this.isStopped||this.hasError?ve=T.w.EMPTY:(this.observers.push(ee),ve=new F.W(this,ee)),$&&ee.add(ee=new M.ht(ee,$)),ue)for(let oe=0;oe<se&&!ee.closed;oe++)ee.next(ae[oe]);else for(let oe=0;oe<se&&!ee.closed;oe++)ee.next(ae[oe].value);return this.hasError?ee.error(this.thrownError):this.isStopped&&ee.complete(),ve}_getNow(){return(this.scheduler||y).now()}_trimBufferThenGetEvents(){const ee=this._getNow(),ue=this._bufferSize,ae=this._windowTime,$=this._events,se=$.length;let ve=0;for(;ve<se&&!(ee-$[ve].time<ae);)ve++;return se>ue&&(ve=Math.max(ve,se-ue)),ve>0&&$.splice(0,ve),$}}class J{constructor(ee,ue){this.time=ee,this.value=ue}}},79765:(v,S,i)=>{"use strict";i.d(S,{Yc:()=>y,xQ:()=>T});var r=i(18891),u=i(77393),p=i(75319),f=i(77971),e=i(78858),_=i(29181);class y extends u.L{constructor(F){super(F),this.destination=F}}let T=(()=>{class R extends r.y{constructor(){super(),this.observers=[],this.closed=!1,this.isStopped=!1,this.hasError=!1,this.thrownError=null}[_.b](){return new y(this)}lift(Z){const J=new M(this,this);return J.operator=Z,J}next(Z){if(this.closed)throw new f.N;if(!this.isStopped){const{observers:J}=this,Q=J.length,ee=J.slice();for(let ue=0;ue<Q;ue++)ee[ue].next(Z)}}error(Z){if(this.closed)throw new f.N;this.hasError=!0,this.thrownError=Z,this.isStopped=!0;const{observers:J}=this,Q=J.length,ee=J.slice();for(let ue=0;ue<Q;ue++)ee[ue].error(Z);this.observers.length=0}complete(){if(this.closed)throw new f.N;this.isStopped=!0;const{observers:Z}=this,J=Z.length,Q=Z.slice();for(let ee=0;ee<J;ee++)Q[ee].complete();this.observers.length=0}unsubscribe(){this.isStopped=!0,this.closed=!0,this.observers=null}_trySubscribe(Z){if(this.closed)throw new f.N;return super._trySubscribe(Z)}_subscribe(Z){if(this.closed)throw new f.N;return this.hasError?(Z.error(this.thrownError),p.w.EMPTY):this.isStopped?(Z.complete(),p.w.EMPTY):(this.observers.push(Z),new e.W(this,Z))}asObservable(){const Z=new r.y;return Z.source=this,Z}}return R.create=(F,Z)=>new M(F,Z),R})();class M extends T{constructor(F,Z){super(),this.destination=F,this.source=Z}next(F){const{destination:Z}=this;Z&&Z.next&&Z.next(F)}error(F){const{destination:Z}=this;Z&&Z.error&&this.destination.error(F)}complete(){const{destination:F}=this;F&&F.complete&&this.destination.complete()}_subscribe(F){const{source:Z}=this;return Z?this.source.subscribe(F):p.w.EMPTY}}},78858:(v,S,i)=>{"use strict";i.d(S,{W:()=>u});var r=i(75319);class u extends r.w{constructor(f,e){super(),this.subject=f,this.subscriber=e,this.closed=!1}unsubscribe(){if(this.closed)return;this.closed=!0;const f=this.subject,e=f.observers;if(this.subject=null,!e||0===e.length||f.isStopped||f.closed)return;const _=e.indexOf(this.subscriber);-1!==_&&e.splice(_,1)}}},77393:(v,S,i)=>{"use strict";i.d(S,{L:()=>y});var r=i(69105),u=i(46490),p=i(75319),f=i(29181),e=i(82494),_=i(54449);class y extends p.w{constructor(R,F,Z){switch(super(),this.syncErrorValue=null,this.syncErrorThrown=!1,this.syncErrorThrowable=!1,this.isStopped=!1,arguments.length){case 0:this.destination=u.c;break;case 1:if(!R){this.destination=u.c;break}if("object"==typeof R){R instanceof y?(this.syncErrorThrowable=R.syncErrorThrowable,this.destination=R,R.add(this)):(this.syncErrorThrowable=!0,this.destination=new T(this,R));break}default:this.syncErrorThrowable=!0,this.destination=new T(this,R,F,Z)}}[f.b](){return this}static create(R,F,Z){const J=new y(R,F,Z);return J.syncErrorThrowable=!1,J}next(R){this.isStopped||this._next(R)}error(R){this.isStopped||(this.isStopped=!0,this._error(R))}complete(){this.isStopped||(this.isStopped=!0,this._complete())}unsubscribe(){this.closed||(this.isStopped=!0,super.unsubscribe())}_next(R){this.destination.next(R)}_error(R){this.destination.error(R),this.unsubscribe()}_complete(){this.destination.complete(),this.unsubscribe()}_unsubscribeAndRecycle(){const{_parentOrParents:R}=this;return this._parentOrParents=null,this.unsubscribe(),this.closed=!1,this.isStopped=!1,this._parentOrParents=R,this}}class T extends y{constructor(R,F,Z,J){super(),this._parentSubscriber=R;let Q,ee=this;(0,r.m)(F)?Q=F:F&&(Q=F.next,Z=F.error,J=F.complete,F!==u.c&&(ee=Object.create(F),(0,r.m)(ee.unsubscribe)&&this.add(ee.unsubscribe.bind(ee)),ee.unsubscribe=this.unsubscribe.bind(this))),this._context=ee,this._next=Q,this._error=Z,this._complete=J}next(R){if(!this.isStopped&&this._next){const{_parentSubscriber:F}=this;e.v.useDeprecatedSynchronousErrorHandling&&F.syncErrorThrowable?this.__tryOrSetError(F,this._next,R)&&this.unsubscribe():this.__tryOrUnsub(this._next,R)}}error(R){if(!this.isStopped){const{_parentSubscriber:F}=this,{useDeprecatedSynchronousErrorHandling:Z}=e.v;if(this._error)Z&&F.syncErrorThrowable?(this.__tryOrSetError(F,this._error,R),this.unsubscribe()):(this.__tryOrUnsub(this._error,R),this.unsubscribe());else if(F.syncErrorThrowable)Z?(F.syncErrorValue=R,F.syncErrorThrown=!0):(0,_.z)(R),this.unsubscribe();else{if(this.unsubscribe(),Z)throw R;(0,_.z)(R)}}}complete(){if(!this.isStopped){const{_parentSubscriber:R}=this;if(this._complete){const F=()=>this._complete.call(this._context);e.v.useDeprecatedSynchronousErrorHandling&&R.syncErrorThrowable?(this.__tryOrSetError(R,F),this.unsubscribe()):(this.__tryOrUnsub(F),this.unsubscribe())}else this.unsubscribe()}}__tryOrUnsub(R,F){try{R.call(this._context,F)}catch(Z){if(this.unsubscribe(),e.v.useDeprecatedSynchronousErrorHandling)throw Z;(0,_.z)(Z)}}__tryOrSetError(R,F,Z){if(!e.v.useDeprecatedSynchronousErrorHandling)throw new Error("bad call");try{F.call(this._context,Z)}catch(J){return e.v.useDeprecatedSynchronousErrorHandling?(R.syncErrorValue=J,R.syncErrorThrown=!0,!0):((0,_.z)(J),!0)}return!1}_unsubscribe(){const{_parentSubscriber:R}=this;this._context=null,this._parentSubscriber=null,R.unsubscribe()}}},75319:(v,S,i)=>{"use strict";i.d(S,{w:()=>_});var r=i(59796),u=i(81555),p=i(69105);const e=(()=>{function T(M){return Error.call(this),this.message=M?`${M.length} errors occurred during unsubscription:\n${M.map((R,F)=>`${F+1}) ${R.toString()}`).join("\n  ")}`:"",this.name="UnsubscriptionError",this.errors=M,this}return T.prototype=Object.create(Error.prototype),T})();class _{constructor(M){this.closed=!1,this._parentOrParents=null,this._subscriptions=null,M&&(this._ctorUnsubscribe=!0,this._unsubscribe=M)}unsubscribe(){let M;if(this.closed)return;let{_parentOrParents:R,_ctorUnsubscribe:F,_unsubscribe:Z,_subscriptions:J}=this;if(this.closed=!0,this._parentOrParents=null,this._subscriptions=null,R instanceof _)R.remove(this);else if(null!==R)for(let Q=0;Q<R.length;++Q)R[Q].remove(this);if((0,p.m)(Z)){F&&(this._unsubscribe=void 0);try{Z.call(this)}catch(Q){M=Q instanceof e?y(Q.errors):[Q]}}if((0,r.k)(J)){let Q=-1,ee=J.length;for(;++Q<ee;){const ue=J[Q];if((0,u.K)(ue))try{ue.unsubscribe()}catch(ae){M=M||[],ae instanceof e?M=M.concat(y(ae.errors)):M.push(ae)}}}if(M)throw new e(M)}add(M){let R=M;if(!M)return _.EMPTY;switch(typeof M){case"function":R=new _(M);case"object":if(R===this||R.closed||"function"!=typeof R.unsubscribe)return R;if(this.closed)return R.unsubscribe(),R;if(!(R instanceof _)){const J=R;R=new _,R._subscriptions=[J]}break;default:throw new Error("unrecognized teardown "+M+" added to Subscription.")}let{_parentOrParents:F}=R;if(null===F)R._parentOrParents=this;else if(F instanceof _){if(F===this)return R;R._parentOrParents=[F,this]}else{if(-1!==F.indexOf(this))return R;F.push(this)}const Z=this._subscriptions;return null===Z?this._subscriptions=[R]:Z.push(R),R}remove(M){const R=this._subscriptions;if(R){const F=R.indexOf(M);-1!==F&&R.splice(F,1)}}}var T;function y(T){return T.reduce((M,R)=>M.concat(R instanceof e?R.errors:R),[])}_.EMPTY=((T=new _).closed=!0,T)},82494:(v,S,i)=>{"use strict";i.d(S,{v:()=>u});let r=!1;const u={Promise:void 0,set useDeprecatedSynchronousErrorHandling(p){if(p){const f=new Error;console.warn("DEPRECATED! RxJS was set to use deprecated synchronous error handling behavior by code at: \n"+f.stack)}else r&&console.log("RxJS: Back to a better error behavior. Thank you. <3");r=p},get useDeprecatedSynchronousErrorHandling(){return r}}},85345:(v,S,i)=>{"use strict";i.d(S,{IY:()=>f,Ds:()=>_,ft:()=>T});var r=i(77393),u=i(18891),p=i(87444);class f extends r.L{constructor(R){super(),this.parent=R}_next(R){this.parent.notifyNext(R)}_error(R){this.parent.notifyError(R),this.unsubscribe()}_complete(){this.parent.notifyComplete(),this.unsubscribe()}}class _ extends r.L{notifyNext(R){this.destination.next(R)}notifyError(R){this.destination.error(R)}notifyComplete(){this.destination.complete()}}function T(M,R){if(!R.closed)return M instanceof u.y?M.subscribe(R):(0,p.s)(M)(R)}},52441:(v,S,i)=>{"use strict";i.d(S,{c:()=>e,N:()=>_});var r=i(79765),u=i(18891),p=i(75319),f=i(51307);class e extends u.y{constructor(F,Z){super(),this.source=F,this.subjectFactory=Z,this._refCount=0,this._isComplete=!1}_subscribe(F){return this.getSubject().subscribe(F)}getSubject(){const F=this._subject;return(!F||F.isStopped)&&(this._subject=this.subjectFactory()),this._subject}connect(){let F=this._connection;return F||(this._isComplete=!1,F=this._connection=new p.w,F.add(this.source.subscribe(new y(this.getSubject(),this))),F.closed&&(this._connection=null,F=p.w.EMPTY)),F}refCount(){return(0,f.x)()(this)}}const _=(()=>{const R=e.prototype;return{operator:{value:null},_refCount:{value:0,writable:!0},_subject:{value:null,writable:!0},_connection:{value:null,writable:!0},_subscribe:{value:R._subscribe},_isComplete:{value:R._isComplete,writable:!0},getSubject:{value:R.getSubject},connect:{value:R.connect},refCount:{value:R.refCount}}})();class y extends r.Yc{constructor(F,Z){super(F),this.connectable=Z}_error(F){this._unsubscribe(),super._error(F)}_complete(){this.connectable._isComplete=!0,this._unsubscribe(),super._complete()}_unsubscribe(){const F=this.connectable;if(F){this.connectable=null;const Z=F._connection;F._refCount=0,F._subject=null,F._connection=null,Z&&Z.unsubscribe()}}}},9112:(v,S,i)=>{"use strict";i.d(S,{aj:()=>y});var r=i(54869),u=i(59796),p=i(55197),f=i(20509),e=i(56693);const _={};function y(...R){let F,Z;return(0,r.K)(R[R.length-1])&&(Z=R.pop()),"function"==typeof R[R.length-1]&&(F=R.pop()),1===R.length&&(0,u.k)(R[0])&&(R=R[0]),(0,e.n)(R,Z).lift(new T(F))}class T{constructor(F){this.resultSelector=F}call(F,Z){return Z.subscribe(new M(F,this.resultSelector))}}class M extends p.L{constructor(F,Z){super(F),this.resultSelector=Z,this.active=0,this.values=[],this.observables=[]}_next(F){this.values.push(_),this.observables.push(F)}_complete(){const F=this.observables,Z=F.length;if(0===Z)this.destination.complete();else{this.active=Z,this.toRespond=Z;for(let J=0;J<Z;J++)this.add((0,f.D)(this,F[J],void 0,J))}}notifyComplete(F){0==(this.active-=1)&&this.destination.complete()}notifyNext(F,Z,J){const Q=this.values,ue=this.toRespond?Q[J]===_?--this.toRespond:this.toRespond:0;Q[J]=Z,0===ue&&(this.resultSelector?this._tryResultSelector(Q):this.destination.next(Q.slice()))}_tryResultSelector(F){let Z;try{Z=this.resultSelector.apply(this,F)}catch(J){return void this.destination.error(J)}this.destination.next(Z)}}},58071:(v,S,i)=>{"use strict";i.d(S,{z:()=>f});var r=i(25917),u=i(63282);function f(...e){return(0,u.J)(1)((0,r.of)(...e))}},59193:(v,S,i)=>{"use strict";i.d(S,{E:()=>u,c:()=>p});var r=i(18891);const u=new r.y(e=>e.complete());function p(e){return e?function(e){return new r.y(_=>e.schedule(()=>_.complete()))}(e):u}},35758:(v,S,i)=>{"use strict";i.d(S,{D:()=>_});var r=i(18891),u=i(59796),p=i(88002),f=i(81555),e=i(94402);function _(...T){if(1===T.length){const M=T[0];if((0,u.k)(M))return y(M,null);if((0,f.K)(M)&&Object.getPrototypeOf(M)===Object.prototype){const R=Object.keys(M);return y(R.map(F=>M[F]),R)}}if("function"==typeof T[T.length-1]){const M=T.pop();return y(T=1===T.length&&(0,u.k)(T[0])?T[0]:T,null).pipe((0,p.U)(R=>M(...R)))}return y(T,null)}function y(T,M){return new r.y(R=>{const F=T.length;if(0===F)return void R.complete();const Z=new Array(F);let J=0,Q=0;for(let ee=0;ee<F;ee++){const ue=(0,e.D)(T[ee]);let ae=!1;R.add(ue.subscribe({next:$=>{ae||(ae=!0,Q++),Z[ee]=$},error:$=>R.error($),complete:()=>{J++,(J===F||!ae)&&(Q===F&&R.next(M?M.reduce(($,se,ve)=>($[se]=Z[ve],$),{}):Z),R.complete())}}))}})}},94402:(v,S,i)=>{"use strict";i.d(S,{D:()=>ee});var r=i(18891),u=i(87444),p=i(75319),f=i(16554),y=i(94087),T=i(20377),F=i(44072),Z=i(69489);function ee(ue,ae){return ae?function(ue,ae){if(null!=ue){if(function(ue){return ue&&"function"==typeof ue[f.L]}(ue))return function(ue,ae){return new r.y($=>{const se=new p.w;return se.add(ae.schedule(()=>{const ve=ue[f.L]();se.add(ve.subscribe({next(oe){se.add(ae.schedule(()=>$.next(oe)))},error(oe){se.add(ae.schedule(()=>$.error(oe)))},complete(){se.add(ae.schedule(()=>$.complete()))}}))})),se})}(ue,ae);if((0,F.t)(ue))return function(ue,ae){return new r.y($=>{const se=new p.w;return se.add(ae.schedule(()=>ue.then(ve=>{se.add(ae.schedule(()=>{$.next(ve),se.add(ae.schedule(()=>$.complete()))}))},ve=>{se.add(ae.schedule(()=>$.error(ve)))}))),se})}(ue,ae);if((0,Z.z)(ue))return(0,y.r)(ue,ae);if(function(ue){return ue&&"function"==typeof ue[T.hZ]}(ue)||"string"==typeof ue)return function(ue,ae){if(!ue)throw new Error("Iterable cannot be null");return new r.y($=>{const se=new p.w;let ve;return se.add(()=>{ve&&"function"==typeof ve.return&&ve.return()}),se.add(ae.schedule(()=>{ve=ue[T.hZ](),se.add(ae.schedule(function(){if($.closed)return;let oe,he;try{const me=ve.next();oe=me.value,he=me.done}catch(me){return void $.error(me)}he?$.complete():($.next(oe),this.schedule())}))})),se})}(ue,ae)}throw new TypeError((null!==ue&&typeof ue||ue)+" is not observable")}(ue,ae):ue instanceof r.y?ue:new r.y((0,u.s)(ue))}},56693:(v,S,i)=>{"use strict";i.d(S,{n:()=>f});var r=i(18891),u=i(55015),p=i(94087);function f(e,_){return _?(0,p.r)(e,_):new r.y((0,u.V)(e))}},22759:(v,S,i)=>{"use strict";i.d(S,{R:()=>_});var r=i(18891),u=i(59796),p=i(69105),f=i(88002);function _(F,Z,J,Q){return(0,p.m)(J)&&(Q=J,J=void 0),Q?_(F,Z,J).pipe((0,f.U)(ee=>(0,u.k)(ee)?Q(...ee):Q(ee))):new r.y(ee=>{y(F,Z,function(ae){ee.next(arguments.length>1?Array.prototype.slice.call(arguments):ae)},ee,J)})}function y(F,Z,J,Q,ee){let ue;if(function(F){return F&&"function"==typeof F.addEventListener&&"function"==typeof F.removeEventListener}(F)){const ae=F;F.addEventListener(Z,J,ee),ue=()=>ae.removeEventListener(Z,J,ee)}else if(function(F){return F&&"function"==typeof F.on&&"function"==typeof F.off}(F)){const ae=F;F.on(Z,J),ue=()=>ae.off(Z,J)}else if(function(F){return F&&"function"==typeof F.addListener&&"function"==typeof F.removeListener}(F)){const ae=F;F.addListener(Z,J),ue=()=>ae.removeListener(Z,J)}else{if(!F||!F.length)throw new TypeError("Invalid event target");for(let ae=0,$=F.length;ae<$;ae++)y(F[ae],Z,J,Q,ee)}Q.add(ue)}},66682:(v,S,i)=>{"use strict";i.d(S,{T:()=>e});var r=i(18891),u=i(54869),p=i(63282),f=i(56693);function e(..._){let y=Number.POSITIVE_INFINITY,T=null,M=_[_.length-1];return(0,u.K)(M)?(T=_.pop(),_.length>1&&"number"==typeof _[_.length-1]&&(y=_.pop())):"number"==typeof M&&(y=_.pop()),null===T&&1===_.length&&_[0]instanceof r.y?_[0]:(0,p.J)(y)((0,f.n)(_,T))}},17757:(v,S,i)=>{"use strict";i.d(S,{C:()=>p});var r=i(18891),u=i(98640);const p=new r.y(u.Z)},25917:(v,S,i)=>{"use strict";i.d(S,{of:()=>f});var r=i(54869),u=i(56693),p=i(94087);function f(...e){let _=e[e.length-1];return(0,r.K)(_)?(e.pop(),(0,p.r)(e,_)):(0,u.n)(e)}},40205:(v,S,i)=>{"use strict";i.d(S,{_:()=>u});var r=i(18891);function u(f,e){return new r.y(e?_=>e.schedule(p,0,{error:f,subscriber:_}):_=>_.error(f))}function p({error:f,subscriber:e}){e.error(f)}},46797:(v,S,i)=>{"use strict";i.d(S,{H:()=>e});var r=i(18891),u=i(33637),p=i(26561),f=i(54869);function e(y=0,T,M){let R=-1;return(0,p.k)(T)?R=Number(T)<1?1:Number(T):(0,f.K)(T)&&(M=T),(0,f.K)(M)||(M=u.P),new r.y(F=>{const Z=(0,p.k)(y)?y:+y-M.now();return M.schedule(_,Z,{index:0,period:R,subscriber:F})})}function _(y){const{index:T,period:M,subscriber:R}=y;if(R.next(T),!R.closed){if(-1===M)return R.complete();y.index=T+1,this.schedule(y,M)}}},5304:(v,S,i)=>{"use strict";i.d(S,{K:()=>u});var r=i(85345);function u(e){return function(y){const T=new p(e),M=y.lift(T);return T.caught=M}}class p{constructor(_){this.selector=_}call(_,y){return y.subscribe(new f(_,this.selector,this.caught))}}class f extends r.Ds{constructor(_,y,T){super(_),this.selector=y,this.caught=T}error(_){if(!this.isStopped){let y;try{y=this.selector(_,this.caught)}catch(R){return void super.error(R)}this._unsubscribeAndRecycle();const T=new r.IY(this);this.add(T);const M=(0,r.ft)(y,T);M!==T&&this.add(M)}}}},94612:(v,S,i)=>{"use strict";i.d(S,{b:()=>u});var r=i(19773);function u(p,f){return(0,r.zg)(p,f,1)}},95242:(v,S,i)=>{"use strict";i.d(S,{d:()=>u});var r=i(77393);function u(e=null){return _=>_.lift(new p(e))}class p{constructor(_){this.defaultValue=_}call(_,y){return y.subscribe(new f(_,this.defaultValue))}}class f extends r.L{constructor(_,y){super(_),this.defaultValue=y,this.isEmpty=!0}_next(_){this.isEmpty=!1,this.destination.next(_)}_complete(){this.isEmpty&&this.destination.next(this.defaultValue),this.destination.complete()}}},71289:(v,S,i)=>{"use strict";i.d(S,{g:()=>e});var r=i(33637),p=i(77393),f=i(23098);function e(M,R=r.P){const Z=function(M){return M instanceof Date&&!isNaN(+M)}(M)?+M-R.now():Math.abs(M);return J=>J.lift(new _(Z,R))}class _{constructor(R,F){this.delay=R,this.scheduler=F}call(R,F){return F.subscribe(new y(R,this.delay,this.scheduler))}}class y extends p.L{constructor(R,F,Z){super(R),this.delay=F,this.scheduler=Z,this.queue=[],this.active=!1,this.errored=!1}static dispatch(R){const F=R.source,Z=F.queue,J=R.scheduler,Q=R.destination;for(;Z.length>0&&Z[0].time-J.now()<=0;)Z.shift().notification.observe(Q);if(Z.length>0){const ee=Math.max(0,Z[0].time-J.now());this.schedule(R,ee)}else this.unsubscribe(),F.active=!1}_schedule(R){this.active=!0,this.destination.add(R.schedule(y.dispatch,this.delay,{source:this,destination:this.destination,scheduler:R}))}scheduleNotification(R){if(!0===this.errored)return;const F=this.scheduler,Z=new T(F.now()+this.delay,R);this.queue.push(Z),!1===this.active&&this._schedule(F)}_next(R){this.scheduleNotification(f.P.createNext(R))}_error(R){this.errored=!0,this.queue=[],this.destination.error(R),this.unsubscribe()}_complete(){this.scheduleNotification(f.P.createComplete()),this.unsubscribe()}}class T{constructor(R,F){this.time=R,this.notification=F}}},87519:(v,S,i)=>{"use strict";i.d(S,{x:()=>u});var r=i(77393);function u(e,_){return y=>y.lift(new p(e,_))}class p{constructor(_,y){this.compare=_,this.keySelector=y}call(_,y){return y.subscribe(new f(_,this.compare,this.keySelector))}}class f extends r.L{constructor(_,y,T){super(_),this.keySelector=T,this.hasKey=!1,"function"==typeof y&&(this.compare=y)}compare(_,y){return _===y}_next(_){let y;try{const{keySelector:M}=this;y=M?M(_):_}catch(M){return this.destination.error(M)}let T=!1;if(this.hasKey)try{const{compare:M}=this;T=M(this.key,y)}catch(M){return this.destination.error(M)}else this.hasKey=!0;T||(this.key=y,this.destination.next(_))}}},45435:(v,S,i)=>{"use strict";i.d(S,{h:()=>u});var r=i(77393);function u(e,_){return function(T){return T.lift(new p(e,_))}}class p{constructor(_,y){this.predicate=_,this.thisArg=y}call(_,y){return y.subscribe(new f(_,this.predicate,this.thisArg))}}class f extends r.L{constructor(_,y,T){super(_),this.predicate=y,this.thisArg=T,this.count=0}_next(_){let y;try{y=this.predicate.call(this.thisArg,_,this.count++)}catch(T){return void this.destination.error(T)}y&&this.destination.next(_)}}},68939:(v,S,i)=>{"use strict";i.d(S,{x:()=>p});var r=i(77393),u=i(75319);function p(_){return y=>y.lift(new f(_))}class f{constructor(y){this.callback=y}call(y,T){return T.subscribe(new e(y,this.callback))}}class e extends r.L{constructor(y,T){super(y),this.add(new u.w(T))}}},28049:(v,S,i)=>{"use strict";i.d(S,{P:()=>y});var r=i(13410),u=i(45435),p=i(15257),f=i(95242),e=i(44635),_=i(54487);function y(T,M){const R=arguments.length>=2;return F=>F.pipe(T?(0,u.h)((Z,J)=>T(Z,J,F)):_.y,(0,p.q)(1),R?(0,f.d)(M):(0,e.T)(()=>new r.K))}},12627:(v,S,i)=>{"use strict";i.d(S,{Z:()=>y});var r=i(13410),u=i(45435),p=i(548),f=i(44635),e=i(95242),_=i(54487);function y(T,M){const R=arguments.length>=2;return F=>F.pipe(T?(0,u.h)((Z,J)=>T(Z,J,F)):_.y,(0,p.h)(1),R?(0,e.d)(M):(0,f.T)(()=>new r.K))}},88002:(v,S,i)=>{"use strict";i.d(S,{U:()=>u});var r=i(77393);function u(e,_){return function(T){if("function"!=typeof e)throw new TypeError("argument is not a function. Are you looking for `mapTo()`?");return T.lift(new p(e,_))}}class p{constructor(_,y){this.project=_,this.thisArg=y}call(_,y){return y.subscribe(new f(_,this.project,this.thisArg))}}class f extends r.L{constructor(_,y,T){super(_),this.project=y,this.count=0,this.thisArg=T||this}_next(_){let y;try{y=this.project.call(this.thisArg,_,this.count++)}catch(T){return void this.destination.error(T)}this.destination.next(y)}}},96736:(v,S,i)=>{"use strict";i.d(S,{h:()=>u});var r=i(77393);function u(e){return _=>_.lift(new p(e))}class p{constructor(_){this.value=_}call(_,y){return y.subscribe(new f(_,this.value))}}class f extends r.L{constructor(_,y){super(_),this.value=y}_next(_){this.destination.next(this.value)}}},63282:(v,S,i)=>{"use strict";i.d(S,{J:()=>p});var r=i(19773),u=i(54487);function p(f=Number.POSITIVE_INFINITY){return(0,r.zg)(u.y,f)}},19773:(v,S,i)=>{"use strict";i.d(S,{zg:()=>f});var r=i(88002),u=i(94402),p=i(85345);function f(T,M,R=Number.POSITIVE_INFINITY){return"function"==typeof M?F=>F.pipe(f((Z,J)=>(0,u.D)(T(Z,J)).pipe((0,r.U)((Q,ee)=>M(Z,Q,J,ee))),R)):("number"==typeof M&&(R=M),F=>F.lift(new e(T,R)))}class e{constructor(M,R=Number.POSITIVE_INFINITY){this.project=M,this.concurrent=R}call(M,R){return R.subscribe(new _(M,this.project,this.concurrent))}}class _ extends p.Ds{constructor(M,R,F=Number.POSITIVE_INFINITY){super(M),this.project=R,this.concurrent=F,this.hasCompleted=!1,this.buffer=[],this.active=0,this.index=0}_next(M){this.active<this.concurrent?this._tryNext(M):this.buffer.push(M)}_tryNext(M){let R;const F=this.index++;try{R=this.project(M,F)}catch(Z){return void this.destination.error(Z)}this.active++,this._innerSub(R)}_innerSub(M){const R=new p.IY(this),F=this.destination;F.add(R);const Z=(0,p.ft)(M,R);Z!==R&&F.add(Z)}_complete(){this.hasCompleted=!0,0===this.active&&0===this.buffer.length&&this.destination.complete(),this.unsubscribe()}notifyNext(M){this.destination.next(M)}notifyComplete(){const M=this.buffer;this.active--,M.length>0?this._next(M.shift()):0===this.active&&this.hasCompleted&&this.destination.complete()}}},59746:(v,S,i)=>{"use strict";i.d(S,{QV:()=>p,ht:()=>e});var r=i(77393),u=i(23098);function p(y,T=0){return function(R){return R.lift(new f(y,T))}}class f{constructor(T,M=0){this.scheduler=T,this.delay=M}call(T,M){return M.subscribe(new e(T,this.scheduler,this.delay))}}class e extends r.L{constructor(T,M,R=0){super(T),this.scheduler=M,this.delay=R}static dispatch(T){const{notification:M,destination:R}=T;M.observe(R),this.unsubscribe()}scheduleMessage(T){this.destination.add(this.scheduler.schedule(e.dispatch,this.delay,new _(T,this.destination)))}_next(T){this.scheduleMessage(u.P.createNext(T))}_error(T){this.scheduleMessage(u.P.createError(T)),this.unsubscribe()}_complete(){this.scheduleMessage(u.P.createComplete()),this.unsubscribe()}}class _{constructor(T,M){this.notification=T,this.destination=M}}},51307:(v,S,i)=>{"use strict";i.d(S,{x:()=>u});var r=i(77393);function u(){return function(_){return _.lift(new p(_))}}class p{constructor(_){this.connectable=_}call(_,y){const{connectable:T}=this;T._refCount++;const M=new f(_,T),R=y.subscribe(M);return M.closed||(M.connection=T.connect()),R}}class f extends r.L{constructor(_,y){super(_),this.connectable=y}_unsubscribe(){const{connectable:_}=this;if(!_)return void(this.connection=null);this.connectable=null;const y=_._refCount;if(y<=0)return void(this.connection=null);if(_._refCount=y-1,y>1)return void(this.connection=null);const{connection:T}=this,M=_._connection;this.connection=null,M&&(!T||M===T)&&M.unsubscribe()}}},42145:(v,S,i)=>{"use strict";i.d(S,{R:()=>u});var r=i(77393);function u(e,_){let y=!1;return arguments.length>=2&&(y=!0),function(M){return M.lift(new p(e,_,y))}}class p{constructor(_,y,T=!1){this.accumulator=_,this.seed=y,this.hasSeed=T}call(_,y){return y.subscribe(new f(_,this.accumulator,this.seed,this.hasSeed))}}class f extends r.L{constructor(_,y,T,M){super(_),this.accumulator=y,this._seed=T,this.hasSeed=M,this.index=0}get seed(){return this._seed}set seed(_){this.hasSeed=!0,this._seed=_}_next(_){if(this.hasSeed)return this._tryNext(_);this.seed=_,this.destination.next(_)}_tryNext(_){const y=this.index++;let T;try{T=this.accumulator(this.seed,_,y)}catch(M){this.destination.error(M)}this.seed=T,this.destination.next(T)}}},18819:(v,S,i)=>{"use strict";i.d(S,{B:()=>y});var r=i(52441);var f=i(51307),e=i(79765);function _(){return new e.xQ}function y(){return T=>(0,f.x)()(function(T,M){return function(F){let Z;Z="function"==typeof T?T:function(){return T};const J=Object.create(F,r.N);return J.source=F,J.subjectFactory=Z,J}}(_)(T))}},47349:(v,S,i)=>{"use strict";i.d(S,{d:()=>u});var r=i(80226);function u(f,e,_){let y;return y=f&&"object"==typeof f?f:{bufferSize:f,windowTime:e,refCount:!1,scheduler:_},T=>T.lift(function({bufferSize:f=Number.POSITIVE_INFINITY,windowTime:e=Number.POSITIVE_INFINITY,refCount:_,scheduler:y}){let T,R,M=0,F=!1,Z=!1;return function(Q){let ee;M++,!T||F?(F=!1,T=new r.t(f,e,y),ee=T.subscribe(this),R=Q.subscribe({next(ue){T.next(ue)},error(ue){F=!0,T.error(ue)},complete(){Z=!0,R=void 0,T.complete()}})):ee=T.subscribe(this),this.add(()=>{M--,ee.unsubscribe(),R&&!Z&&_&&0===M&&(R.unsubscribe(),R=void 0,T=void 0)})}}(y))}},39761:(v,S,i)=>{"use strict";i.d(S,{O:()=>p});var r=i(58071),u=i(54869);function p(...f){const e=f[f.length-1];return(0,u.K)(e)?(f.pop(),_=>(0,r.z)(f,_,e)):_=>(0,r.z)(f,_)}},43190:(v,S,i)=>{"use strict";i.d(S,{w:()=>f});var r=i(88002),u=i(94402),p=i(85345);function f(y,T){return"function"==typeof T?M=>M.pipe(f((R,F)=>(0,u.D)(y(R,F)).pipe((0,r.U)((Z,J)=>T(R,Z,F,J))))):M=>M.lift(new e(y))}class e{constructor(T){this.project=T}call(T,M){return M.subscribe(new _(T,this.project))}}class _ extends p.Ds{constructor(T,M){super(T),this.project=M,this.index=0}_next(T){let M;const R=this.index++;try{M=this.project(T,R)}catch(F){return void this.destination.error(F)}this._innerSub(M)}_innerSub(T){const M=this.innerSubscription;M&&M.unsubscribe();const R=new p.IY(this),F=this.destination;F.add(R),this.innerSubscription=(0,p.ft)(T,R),this.innerSubscription!==R&&F.add(this.innerSubscription)}_complete(){const{innerSubscription:T}=this;(!T||T.closed)&&super._complete(),this.unsubscribe()}_unsubscribe(){this.innerSubscription=void 0}notifyComplete(){this.innerSubscription=void 0,this.isStopped&&super._complete()}notifyNext(T){this.destination.next(T)}}},15257:(v,S,i)=>{"use strict";i.d(S,{q:()=>f});var r=i(77393),u=i(7108),p=i(59193);function f(y){return T=>0===y?(0,p.c)():T.lift(new e(y))}class e{constructor(T){if(this.total=T,this.total<0)throw new u.W}call(T,M){return M.subscribe(new _(T,this.total))}}class _ extends r.L{constructor(T,M){super(T),this.total=M,this.count=0}_next(T){const M=this.total,R=++this.count;R<=M&&(this.destination.next(T),R===M&&(this.destination.complete(),this.unsubscribe()))}}},548:(v,S,i)=>{"use strict";i.d(S,{h:()=>f});var r=i(77393),u=i(7108),p=i(59193);function f(y){return function(M){return 0===y?(0,p.c)():M.lift(new e(y))}}class e{constructor(T){if(this.total=T,this.total<0)throw new u.W}call(T,M){return M.subscribe(new _(T,this.total))}}class _ extends r.L{constructor(T,M){super(T),this.total=M,this.ring=new Array,this.count=0}_next(T){const M=this.ring,R=this.total,F=this.count++;M.length<R?M.push(T):M[F%R]=T}_complete(){const T=this.destination;let M=this.count;if(M>0){const R=this.count>=this.total?this.total:this.count,F=this.ring;for(let Z=0;Z<R;Z++){const J=M++%R;T.next(F[J])}}T.complete()}}},46782:(v,S,i)=>{"use strict";i.d(S,{R:()=>u});var r=i(85345);function u(e){return _=>_.lift(new p(e))}class p{constructor(_){this.notifier=_}call(_,y){const T=new f(_),M=(0,r.ft)(this.notifier,new r.IY(T));return M&&!T.seenValue?(T.add(M),y.subscribe(T)):T}}class f extends r.Ds{constructor(_){super(_),this.seenValue=!1}notifyNext(){this.seenValue=!0,this.complete()}notifyComplete(){}}},68307:(v,S,i)=>{"use strict";i.d(S,{b:()=>f});var r=i(77393),u=i(98640),p=i(69105);function f(y,T,M){return function(F){return F.lift(new e(y,T,M))}}class e{constructor(T,M,R){this.nextOrObserver=T,this.error=M,this.complete=R}call(T,M){return M.subscribe(new _(T,this.nextOrObserver,this.error,this.complete))}}class _ extends r.L{constructor(T,M,R,F){super(T),this._tapNext=u.Z,this._tapError=u.Z,this._tapComplete=u.Z,this._tapError=R||u.Z,this._tapComplete=F||u.Z,(0,p.m)(M)?(this._context=this,this._tapNext=M):M&&(this._context=M,this._tapNext=M.next||u.Z,this._tapError=M.error||u.Z,this._tapComplete=M.complete||u.Z)}_next(T){try{this._tapNext.call(this._context,T)}catch(M){return void this.destination.error(M)}this.destination.next(T)}_error(T){try{this._tapError.call(this._context,T)}catch(M){return void this.destination.error(M)}this.destination.error(T)}_complete(){try{this._tapComplete.call(this._context)}catch(T){return void this.destination.error(T)}return this.destination.complete()}}},44635:(v,S,i)=>{"use strict";i.d(S,{T:()=>p});var r=i(13410),u=i(77393);function p(y=_){return T=>T.lift(new f(y))}class f{constructor(T){this.errorFactory=T}call(T,M){return M.subscribe(new e(T,this.errorFactory))}}class e extends u.L{constructor(T,M){super(T),this.errorFactory=M,this.hasValue=!1}_next(T){this.hasValue=!0,this.destination.next(T)}_complete(){if(this.hasValue)return this.destination.complete();{let T;try{T=this.errorFactory()}catch(M){T=M}this.destination.error(T)}}}function _(){return new r.K}},94087:(v,S,i)=>{"use strict";i.d(S,{r:()=>p});var r=i(18891),u=i(75319);function p(f,e){return new r.y(_=>{const y=new u.w;let T=0;return y.add(e.schedule(function(){T!==f.length?(_.next(f[T++]),_.closed||y.add(this.schedule())):_.complete()})),y})}},36465:(v,S,i)=>{"use strict";i.d(S,{o:()=>p});var r=i(75319);class u extends r.w{constructor(e,_){super()}schedule(e,_=0){return this}}class p extends u{constructor(e,_){super(e,_),this.scheduler=e,this.work=_,this.pending=!1}schedule(e,_=0){if(this.closed)return this;this.state=e;const y=this.id,T=this.scheduler;return null!=y&&(this.id=this.recycleAsyncId(T,y,_)),this.pending=!0,this.delay=_,this.id=this.id||this.requestAsyncId(T,this.id,_),this}requestAsyncId(e,_,y=0){return setInterval(e.flush.bind(e,this),y)}recycleAsyncId(e,_,y=0){if(null!==y&&this.delay===y&&!1===this.pending)return _;clearInterval(_)}execute(e,_){if(this.closed)return new Error("executing a cancelled action");this.pending=!1;const y=this._execute(e,_);if(y)return y;!1===this.pending&&null!=this.id&&(this.id=this.recycleAsyncId(this.scheduler,this.id,null))}_execute(e,_){let T,y=!1;try{this.work(e)}catch(M){y=!0,T=!!M&&M||new Error(M)}if(y)return this.unsubscribe(),T}_unsubscribe(){const e=this.id,_=this.scheduler,y=_.actions,T=y.indexOf(this);this.work=null,this.state=null,this.pending=!1,this.scheduler=null,-1!==T&&y.splice(T,1),null!=e&&(this.id=this.recycleAsyncId(_,e,null)),this.delay=null}}},16102:(v,S,i)=>{"use strict";i.d(S,{v:()=>u});let r=(()=>{class p{constructor(e,_=p.now){this.SchedulerAction=e,this.now=_}schedule(e,_=0,y){return new this.SchedulerAction(this,e).schedule(y,_)}}return p.now=()=>Date.now(),p})();class u extends r{constructor(f,e=r.now){super(f,()=>u.delegate&&u.delegate!==this?u.delegate.now():e()),this.actions=[],this.active=!1,this.scheduled=void 0}schedule(f,e=0,_){return u.delegate&&u.delegate!==this?u.delegate.schedule(f,e,_):super.schedule(f,e,_)}flush(f){const{actions:e}=this;if(this.active)return void e.push(f);let _;this.active=!0;do{if(_=f.execute(f.state,f.delay))break}while(f=e.shift());if(this.active=!1,_){for(;f=e.shift();)f.unsubscribe();throw _}}}},33637:(v,S,i)=>{"use strict";i.d(S,{z:()=>p,P:()=>f});var r=i(36465);const p=new(i(16102).v)(r.o),f=p},20377:(v,S,i)=>{"use strict";i.d(S,{hZ:()=>u});const u="function"==typeof Symbol&&Symbol.iterator?Symbol.iterator:"@@iterator"},16554:(v,S,i)=>{"use strict";i.d(S,{L:()=>r});const r="function"==typeof Symbol&&Symbol.observable||"@@observable"},29181:(v,S,i)=>{"use strict";i.d(S,{b:()=>r});const r="function"==typeof Symbol?Symbol("rxSubscriber"):"@@rxSubscriber_"+Math.random()},7108:(v,S,i)=>{"use strict";i.d(S,{W:()=>u});const u=(()=>{function p(){return Error.call(this),this.message="argument out of range",this.name="ArgumentOutOfRangeError",this}return p.prototype=Object.create(Error.prototype),p})()},13410:(v,S,i)=>{"use strict";i.d(S,{K:()=>u});const u=(()=>{function p(){return Error.call(this),this.message="no elements in sequence",this.name="EmptyError",this}return p.prototype=Object.create(Error.prototype),p})()},77971:(v,S,i)=>{"use strict";i.d(S,{N:()=>u});const u=(()=>{function p(){return Error.call(this),this.message="object unsubscribed",this.name="ObjectUnsubscribedError",this}return p.prototype=Object.create(Error.prototype),p})()},54449:(v,S,i)=>{"use strict";function r(u){setTimeout(()=>{throw u},0)}i.d(S,{z:()=>r})},54487:(v,S,i)=>{"use strict";function r(u){return u}i.d(S,{y:()=>r})},59796:(v,S,i)=>{"use strict";i.d(S,{k:()=>r});const r=Array.isArray||(u=>u&&"number"==typeof u.length)},69489:(v,S,i)=>{"use strict";i.d(S,{z:()=>r});const r=u=>u&&"number"==typeof u.length&&"function"!=typeof u},69105:(v,S,i)=>{"use strict";function r(u){return"function"==typeof u}i.d(S,{m:()=>r})},26561:(v,S,i)=>{"use strict";i.d(S,{k:()=>u});var r=i(59796);function u(p){return!(0,r.k)(p)&&p-parseFloat(p)+1>=0}},81555:(v,S,i)=>{"use strict";function r(u){return null!==u&&"object"==typeof u}i.d(S,{K:()=>r})},44072:(v,S,i)=>{"use strict";function r(u){return!!u&&"function"!=typeof u.subscribe&&"function"==typeof u.then}i.d(S,{t:()=>r})},54869:(v,S,i)=>{"use strict";function r(u){return u&&"function"==typeof u.schedule}i.d(S,{K:()=>r})},98640:(v,S,i)=>{"use strict";function r(){}i.d(S,{Z:()=>r})},34022:(v,S,i)=>{"use strict";i.d(S,{z:()=>u,U:()=>p});var r=i(54487);function u(...f){return p(f)}function p(f){return 0===f.length?r.y:1===f.length?f[0]:function(_){return f.reduce((y,T)=>T(y),_)}}},87444:(v,S,i)=>{"use strict";i.d(S,{s:()=>F});var r=i(55015),u=i(54449),f=i(20377),_=i(16554),T=i(69489),M=i(44072),R=i(81555);const F=Z=>{if(Z&&"function"==typeof Z[_.L])return(Z=>J=>{const Q=Z[_.L]();if("function"!=typeof Q.subscribe)throw new TypeError("Provided object does not correctly implement Symbol.observable");return Q.subscribe(J)})(Z);if((0,T.z)(Z))return(0,r.V)(Z);if((0,M.t)(Z))return(Z=>J=>(Z.then(Q=>{J.closed||(J.next(Q),J.complete())},Q=>J.error(Q)).then(null,u.z),J))(Z);if(Z&&"function"==typeof Z[f.hZ])return(Z=>J=>{const Q=Z[f.hZ]();for(;;){let ee;try{ee=Q.next()}catch(ue){return J.error(ue),J}if(ee.done){J.complete();break}if(J.next(ee.value),J.closed)break}return"function"==typeof Q.return&&J.add(()=>{Q.return&&Q.return()}),J})(Z);{const Q=`You provided ${(0,R.K)(Z)?"an invalid object":`'${Z}'`} where a stream was expected. You can provide an Observable, Promise, Array, or Iterable.`;throw new TypeError(Q)}}},55015:(v,S,i)=>{"use strict";i.d(S,{V:()=>r});const r=u=>p=>{for(let f=0,e=u.length;f<e&&!p.closed;f++)p.next(u[f]);p.complete()}},20509:(v,S,i)=>{"use strict";i.d(S,{D:()=>e});var r=i(77393);class u extends r.L{constructor(y,T,M){super(),this.parent=y,this.outerValue=T,this.outerIndex=M,this.index=0}_next(y){this.parent.notifyNext(this.outerValue,y,this.outerIndex,this.index++,this)}_error(y){this.parent.notifyError(y,this),this.unsubscribe()}_complete(){this.parent.notifyComplete(this),this.unsubscribe()}}var p=i(87444),f=i(18891);function e(_,y,T,M,R=new u(_,T,M)){if(!R.closed)return y instanceof f.y?y.subscribe(R):(0,p.s)(y)(R)}},59771:(v,S)=>{"use strict";var i,r,u,p;if("object"==typeof performance&&"function"==typeof performance.now){var f=performance;S.unstable_now=function(){return f.now()}}else{var e=Date,_=e.now();S.unstable_now=function(){return e.now()-_}}if("undefined"==typeof window||"function"!=typeof MessageChannel){var y=null,T=null,M=function(){if(null!==y)try{var $t=S.unstable_now();y(!0,$t),y=null}catch(Gt){throw setTimeout(M,0),Gt}};i=function($t){null!==y?setTimeout(i,0,$t):(y=$t,setTimeout(M,0))},r=function($t,Gt){T=setTimeout($t,Gt)},u=function(){clearTimeout(T)},S.unstable_shouldYield=function(){return!1},p=S.unstable_forceFrameRate=function(){}}else{var R=window.setTimeout,F=window.clearTimeout;if("undefined"!=typeof console){var Z=window.cancelAnimationFrame;"function"!=typeof window.requestAnimationFrame&&console.error("This browser doesn't support requestAnimationFrame. Make sure that you load a polyfill in older browsers. https://reactjs.org/link/react-polyfills"),"function"!=typeof Z&&console.error("This browser doesn't support cancelAnimationFrame. Make sure that you load a polyfill in older browsers. https://reactjs.org/link/react-polyfills")}var J=!1,Q=null,ee=-1,ue=5,ae=0;S.unstable_shouldYield=function(){return S.unstable_now()>=ae},p=function(){},S.unstable_forceFrameRate=function($t){0>$t||125<$t?console.error("forceFrameRate takes a positive int between 0 and 125, forcing frame rates higher than 125 fps is not supported"):ue=0<$t?Math.floor(1e3/$t):5};var $=new MessageChannel,se=$.port2;$.port1.onmessage=function(){if(null!==Q){var $t=S.unstable_now();ae=$t+ue;try{Q(!0,$t)?se.postMessage(null):(J=!1,Q=null)}catch(Gt){throw se.postMessage(null),Gt}}else J=!1},i=function($t){Q=$t,J||(J=!0,se.postMessage(null))},r=function($t,Gt){ee=R(function(){$t(S.unstable_now())},Gt)},u=function(){F(ee),ee=-1}}function ve($t,Gt){var Ut=$t.length;$t.push(Gt);e:for(;;){var Bt=Ut-1>>>1,mt=$t[Bt];if(!(void 0!==mt&&0<me(mt,Gt)))break e;$t[Bt]=Gt,$t[Ut]=mt,Ut=Bt}}function oe($t){return void 0===($t=$t[0])?null:$t}function he($t){var Gt=$t[0];if(void 0!==Gt){var Ut=$t.pop();if(Ut!==Gt){$t[0]=Ut;e:for(var Bt=0,mt=$t.length;Bt<mt;){var Yt=2*(Bt+1)-1,Dt=$t[Yt],zt=Yt+1,Yn=$t[zt];if(void 0!==Dt&&0>me(Dt,Ut))void 0!==Yn&&0>me(Yn,Dt)?($t[Bt]=Yn,$t[zt]=Ut,Bt=zt):($t[Bt]=Dt,$t[Yt]=Ut,Bt=Yt);else{if(!(void 0!==Yn&&0>me(Yn,Ut)))break e;$t[Bt]=Yn,$t[zt]=Ut,Bt=zt}}}return Gt}return null}function me($t,Gt){var Ut=$t.sortIndex-Gt.sortIndex;return 0!==Ut?Ut:$t.id-Gt.id}var Oe=[],ce=[],dt=1,ze=null,Ye=3,je=!1,Ie=!1,Ve=!1;function He($t){for(var Gt=oe(ce);null!==Gt;){if(null===Gt.callback)he(ce);else{if(!(Gt.startTime<=$t))break;he(ce),Gt.sortIndex=Gt.expirationTime,ve(Oe,Gt)}Gt=oe(ce)}}function Zt($t){if(Ve=!1,He($t),!Ie)if(null!==oe(Oe))Ie=!0,i(st);else{var Gt=oe(ce);null!==Gt&&r(Zt,Gt.startTime-$t)}}function st($t,Gt){Ie=!1,Ve&&(Ve=!1,u()),je=!0;var Ut=Ye;try{for(He(Gt),ze=oe(Oe);null!==ze&&(!(ze.expirationTime>Gt)||$t&&!S.unstable_shouldYield());){var Bt=ze.callback;if("function"==typeof Bt){ze.callback=null,Ye=ze.priorityLevel;var mt=Bt(ze.expirationTime<=Gt);Gt=S.unstable_now(),"function"==typeof mt?ze.callback=mt:ze===oe(Oe)&&he(Oe),He(Gt)}else he(Oe);ze=oe(Oe)}if(null!==ze)var Yt=!0;else{var Dt=oe(ce);null!==Dt&&r(Zt,Dt.startTime-Gt),Yt=!1}return Yt}finally{ze=null,Ye=Ut,je=!1}}var en=p;S.unstable_IdlePriority=5,S.unstable_ImmediatePriority=1,S.unstable_LowPriority=4,S.unstable_NormalPriority=3,S.unstable_Profiling=null,S.unstable_UserBlockingPriority=2,S.unstable_cancelCallback=function($t){$t.callback=null},S.unstable_continueExecution=function(){Ie||je||(Ie=!0,i(st))},S.unstable_getCurrentPriorityLevel=function(){return Ye},S.unstable_getFirstCallbackNode=function(){return oe(Oe)},S.unstable_next=function($t){switch(Ye){case 1:case 2:case 3:var Gt=3;break;default:Gt=Ye}var Ut=Ye;Ye=Gt;try{return $t()}finally{Ye=Ut}},S.unstable_pauseExecution=function(){},S.unstable_requestPaint=en,S.unstable_runWithPriority=function($t,Gt){switch($t){case 1:case 2:case 3:case 4:case 5:break;default:$t=3}var Ut=Ye;Ye=$t;try{return Gt()}finally{Ye=Ut}},S.unstable_scheduleCallback=function($t,Gt,Ut){var Bt=S.unstable_now();switch(Ut="object"==typeof Ut&&null!==Ut&&"number"==typeof(Ut=Ut.delay)&&0<Ut?Bt+Ut:Bt,$t){case 1:var mt=-1;break;case 2:mt=250;break;case 5:mt=1073741823;break;case 4:mt=1e4;break;default:mt=5e3}return $t={id:dt++,callback:Gt,priorityLevel:$t,startTime:Ut,expirationTime:mt=Ut+mt,sortIndex:-1},Ut>Bt?($t.sortIndex=Ut,ve(ce,$t),null===oe(Oe)&&$t===oe(ce)&&(Ve?u():Ve=!0,r(Zt,Ut-Bt))):($t.sortIndex=mt,ve(Oe,$t),Ie||je||(Ie=!0,i(st))),$t},S.unstable_wrapCallback=function($t){var Gt=Ye;return function(){var Ut=Ye;Ye=Gt;try{return $t.apply(this,arguments)}finally{Ye=Ut}}}},88712:(v,S,i)=>{"use strict";v.exports=i(59771)},4043:v=>{"use strict";class S extends Error{constructor(y){super(S._prepareSuperMessage(y)),Object.defineProperty(this,"name",{value:"NonError",configurable:!0,writable:!0}),Error.captureStackTrace&&Error.captureStackTrace(this,S)}static _prepareSuperMessage(y){try{return JSON.stringify(y)}catch(T){return String(y)}}}const i=[{property:"name",enumerable:!1},{property:"message",enumerable:!1},{property:"stack",enumerable:!1},{property:"code",enumerable:!0}],r=Symbol(".toJSON called"),p=({from:_,seen:y,to_:T,forceEnumerable:M,maxDepth:R,depth:F})=>{const Z=T||(Array.isArray(_)?[]:{});if(y.push(_),F>=R)return Z;if("function"==typeof _.toJSON&&!0!==_[r])return(_=>{_[r]=!0;const y=_.toJSON();return delete _[r],y})(_);for(const[J,Q]of Object.entries(_))if("function"==typeof Buffer&&Buffer.isBuffer(Q))Z[J]="[object Buffer]";else if("function"!=typeof Q){if(!Q||"object"!=typeof Q){Z[J]=Q;continue}if(!y.includes(_[J])){F++,Z[J]=p({from:_[J],seen:y.slice(),forceEnumerable:M,maxDepth:R,depth:F});continue}Z[J]="[Circular]"}for(const{property:J,enumerable:Q}of i)"string"==typeof _[J]&&Object.defineProperty(Z,J,{value:_[J],enumerable:!!M||Q,configurable:!0,writable:!0});return Z};v.exports={serializeError:(_,y={})=>{const{maxDepth:T=Number.POSITIVE_INFINITY}=y;return"object"==typeof _&&null!==_?p({from:_,seen:[],forceEnumerable:!0,maxDepth:T,depth:0}):"function"==typeof _?`[Function: ${_.name||"anonymous"}]`:_},deserializeError:(_,y={})=>{const{maxDepth:T=Number.POSITIVE_INFINITY}=y;if(_ instanceof Error)return _;if("object"==typeof _&&null!==_&&!Array.isArray(_)){const M=new Error;return p({from:_,seen:[],to_:M,maxDepth:T,depth:0}),M}return new S(_)}}},11144:(v,S,i)=>{"use strict";var r=i(18540),u=i(19568),p=i(81380),f=r("%TypeError%"),e=r("%WeakMap%",!0),_=r("%Map%",!0),y=u("WeakMap.prototype.get",!0),T=u("WeakMap.prototype.set",!0),M=u("WeakMap.prototype.has",!0),R=u("Map.prototype.get",!0),F=u("Map.prototype.set",!0),Z=u("Map.prototype.has",!0),J=function(ae,$){for(var ve,se=ae;null!==(ve=se.next);se=ve)if(ve.key===$)return se.next=ve.next,ve.next=ae.next,ae.next=ve,ve};v.exports=function(){var $,se,ve,oe={assert:function(he){if(!oe.has(he))throw new f("Side channel does not contain "+p(he))},get:function(he){if(e&&he&&("object"==typeof he||"function"==typeof he)){if($)return y($,he)}else if(_){if(se)return R(se,he)}else if(ve)return function(ae,$){var se=J(ae,$);return se&&se.value}(ve,he)},has:function(he){if(e&&he&&("object"==typeof he||"function"==typeof he)){if($)return M($,he)}else if(_){if(se)return Z(se,he)}else if(ve)return function(ae,$){return!!J(ae,$)}(ve,he);return!1},set:function(he,me){e&&he&&("object"==typeof he||"function"==typeof he)?($||($=new e),T($,he,me)):_?(se||(se=new _),F(se,he,me)):(ve||(ve={key:{},next:null}),function(ae,$,se){var ve=J(ae,$);ve?ve.value=se:ae.next={key:$,next:ae.next,value:se}}(ve,he,me))}};return oe}},34863:(v,S,i)=>{"use strict";i.d(S,{M:()=>Dr,t:()=>jt}),i(21581),i(8868),i(85443),i(35704),i(66837),i(13744),i(63438),i(22603);var zt,M=i(6123),R=i.n(M),F=i(86906),Z=i.n(F),J=i(66941),Q=i.n(J),ee=[],$="ResizeObserver loop completed with undelivered notifications.",ve=(()=>{return(xt=ve||(ve={})).BORDER_BOX="border-box",xt.CONTENT_BOX="content-box",xt.DEVICE_PIXEL_CONTENT_BOX="device-pixel-content-box",ve;var xt})(),oe=function(xt){return Object.freeze(xt)},he=function(mn,Wn){this.inlineSize=mn,this.blockSize=Wn,oe(this)},me=function(){function xt(mn,Wn,kn,wn){return this.x=mn,this.y=Wn,this.width=kn,this.height=wn,this.top=this.y,this.left=this.x,this.bottom=this.top+this.height,this.right=this.left+this.width,oe(this)}return xt.prototype.toJSON=function(){var mn=this;return{x:mn.x,y:mn.y,top:mn.top,right:mn.right,bottom:mn.bottom,left:mn.left,width:mn.width,height:mn.height}},xt.fromRect=function(mn){return new xt(mn.x,mn.y,mn.width,mn.height)},xt}(),Oe=function(xt){return xt instanceof SVGElement&&"getBBox"in xt},ce=function(xt){if(Oe(xt)){var mn=xt.getBBox();return!mn.width&&!mn.height}return!(xt.offsetWidth||xt.offsetHeight||xt.getClientRects().length)},dt=function(xt){var mn;if(xt instanceof Element)return!0;var Wn=null===(mn=null==xt?void 0:xt.ownerDocument)||void 0===mn?void 0:mn.defaultView;return!!(Wn&&xt instanceof Wn.Element)},Ye="undefined"!=typeof window?window:{},je=new WeakMap,Ie=/auto|scroll/,Ve=/^tb|vertical/,He=/msie|trident/i.test(Ye.navigator&&Ye.navigator.userAgent),Zt=function(xt){return parseFloat(xt||"0")},st=function(xt,mn,Wn){return void 0===xt&&(xt=0),void 0===mn&&(mn=0),void 0===Wn&&(Wn=!1),new he((Wn?mn:xt)||0,(Wn?xt:mn)||0)},en=oe({devicePixelContentBoxSize:st(),borderBoxSize:st(),contentBoxSize:st(),contentRect:new me(0,0,0,0)}),$t=function(xt,mn){if(void 0===mn&&(mn=!1),je.has(xt)&&!mn)return je.get(xt);if(ce(xt))return je.set(xt,en),en;var Wn=getComputedStyle(xt),kn=Oe(xt)&&xt.ownerSVGElement&&xt.getBBox(),wn=!He&&"border-box"===Wn.boxSizing,nr=Ve.test(Wn.writingMode||""),Gi=!kn&&Ie.test(Wn.overflowY||""),po=!kn&&Ie.test(Wn.overflowX||""),yo=kn?0:Zt(Wn.paddingTop),Mo=kn?0:Zt(Wn.paddingRight),Vi=kn?0:Zt(Wn.paddingBottom),cs=kn?0:Zt(Wn.paddingLeft),zo=kn?0:Zt(Wn.borderTopWidth),So=kn?0:Zt(Wn.borderRightWidth),Si=kn?0:Zt(Wn.borderBottomWidth),Zn=cs+Mo,cr=yo+Vi,yr=(kn?0:Zt(Wn.borderLeftWidth))+So,rr=zo+Si,ri=po?xt.offsetHeight-rr-xt.clientHeight:0,ho=Gi?xt.offsetWidth-yr-xt.clientWidth:0,Ti=wn?Zn+yr:0,Bo=wn?cr+rr:0,xo=kn?kn.width:Zt(Wn.width)-Ti-ho,Li=kn?kn.height:Zt(Wn.height)-Bo-ri,ar=xo+Zn+ho+yr,ln=Li+cr+ri+rr,Ht=oe({devicePixelContentBoxSize:st(Math.round(xo*devicePixelRatio),Math.round(Li*devicePixelRatio),nr),borderBoxSize:st(ar,ln,nr),contentBoxSize:st(xo,Li,nr),contentRect:new me(cs,yo,xo,Li)});return je.set(xt,Ht),Ht},Gt=function(xt,mn,Wn){var kn=$t(xt,Wn),wn=kn.borderBoxSize,nr=kn.contentBoxSize,Gi=kn.devicePixelContentBoxSize;switch(mn){case ve.DEVICE_PIXEL_CONTENT_BOX:return Gi;case ve.BORDER_BOX:return wn;default:return nr}},Ut=function(mn){var Wn=$t(mn);this.target=mn,this.contentRect=Wn.contentRect,this.borderBoxSize=oe([Wn.borderBoxSize]),this.contentBoxSize=oe([Wn.contentBoxSize]),this.devicePixelContentBoxSize=oe([Wn.devicePixelContentBoxSize])},Bt=function(xt){if(ce(xt))return 1/0;for(var mn=0,Wn=xt.parentNode;Wn;)mn+=1,Wn=Wn.parentNode;return mn},mt=function(){var xt=1/0,mn=[];ee.forEach(function(Gi){if(0!==Gi.activeTargets.length){var po=[];Gi.activeTargets.forEach(function(Mo){var Vi=new Ut(Mo.target),cs=Bt(Mo.target);po.push(Vi),Mo.lastReportedSize=Gt(Mo.target,Mo.observedBox),cs<xt&&(xt=cs)}),mn.push(function(){Gi.callback.call(Gi.observer,po,Gi.observer)}),Gi.activeTargets.splice(0,Gi.activeTargets.length)}});for(var Wn=0,kn=mn;Wn<kn.length;Wn++)(0,kn[Wn])();return xt},Yt=function(xt){ee.forEach(function(Wn){Wn.activeTargets.splice(0,Wn.activeTargets.length),Wn.skippedTargets.splice(0,Wn.skippedTargets.length),Wn.observationTargets.forEach(function(wn){wn.isActive()&&(Bt(wn.target)>xt?Wn.activeTargets.push(wn):Wn.skippedTargets.push(wn))})})},Yn=[],wr=0,In={attributes:!0,characterData:!0,childList:!0,subtree:!0},Hn=["resize","load","transitionend","animationend","animationstart","animationiteration","keyup","keydown","mouseup","mousedown","mouseover","mouseout","blur","focus"],Zr=function(xt){return void 0===xt&&(xt=0),Date.now()+xt},Ur=!1,$i=new(function(){function xt(){var mn=this;this.stopped=!0,this.listener=function(){return mn.schedule()}}return xt.prototype.run=function(mn){var Wn=this;if(void 0===mn&&(mn=250),!Ur){Ur=!0;var kn=Zr(mn);!function(xt){!function(xt){if(!zt){var mn=0,Wn=document.createTextNode("");new MutationObserver(function(){return Yn.splice(0).forEach(function(xt){return xt()})}).observe(Wn,{characterData:!0}),zt=function(){Wn.textContent="".concat(mn?mn--:mn++)}}Yn.push(xt),zt()}(function(){requestAnimationFrame(xt)})}(function(){var wn=!1;try{wn=function(){var xt=0;for(Yt(xt);ee.some(function(xt){return xt.activeTargets.length>0});)xt=mt(),Yt(xt);return ee.some(function(xt){return xt.skippedTargets.length>0})&&function(){var xt;"function"==typeof ErrorEvent?xt=new ErrorEvent("error",{message:$}):((xt=document.createEvent("Event")).initEvent("error",!1,!1),xt.message=$),window.dispatchEvent(xt)}(),xt>0}()}finally{if(Ur=!1,mn=kn-Zr(),!wr)return;wn?Wn.run(1e3):mn>0?Wn.run(mn):Wn.start()}})}},xt.prototype.schedule=function(){this.stop(),this.run()},xt.prototype.observe=function(){var mn=this,Wn=function(){return mn.observer&&mn.observer.observe(document.body,In)};document.body?Wn():Ye.addEventListener("DOMContentLoaded",Wn)},xt.prototype.start=function(){var mn=this;this.stopped&&(this.stopped=!1,this.observer=new MutationObserver(this.listener),this.observe(),Hn.forEach(function(Wn){return Ye.addEventListener(Wn,mn.listener,!0)}))},xt.prototype.stop=function(){var mn=this;this.stopped||(this.observer&&this.observer.disconnect(),Hn.forEach(function(Wn){return Ye.removeEventListener(Wn,mn.listener,!0)}),this.stopped=!0)},xt}()),Hi=function(xt){!wr&&xt>0&&$i.start(),!(wr+=xt)&&$i.stop()},On=function(){function xt(mn,Wn){this.target=mn,this.observedBox=Wn||ve.CONTENT_BOX,this.lastReportedSize={inlineSize:0,blockSize:0}}return xt.prototype.isActive=function(){var mn=Gt(this.target,this.observedBox,!0);return function(xt){return!Oe(xt)&&!function(xt){switch(xt.tagName){case"INPUT":if("image"!==xt.type)break;case"VIDEO":case"AUDIO":case"EMBED":case"OBJECT":case"CANVAS":case"IFRAME":case"IMG":return!0}return!1}(xt)&&"inline"===getComputedStyle(xt).display}(this.target)&&(this.lastReportedSize=mn),this.lastReportedSize.inlineSize!==mn.inlineSize||this.lastReportedSize.blockSize!==mn.blockSize},xt}(),Wt=function(mn,Wn){this.activeTargets=[],this.skippedTargets=[],this.observationTargets=[],this.observer=mn,this.callback=Wn},Jn=new WeakMap,ir=function(xt,mn){for(var Wn=0;Wn<xt.length;Wn+=1)if(xt[Wn].target===mn)return Wn;return-1},Lr=function(){function xt(){}return xt.connect=function(mn,Wn){var kn=new Wt(mn,Wn);Jn.set(mn,kn)},xt.observe=function(mn,Wn,kn){var wn=Jn.get(mn),nr=0===wn.observationTargets.length;ir(wn.observationTargets,Wn)<0&&(nr&&ee.push(wn),wn.observationTargets.push(new On(Wn,kn&&kn.box)),Hi(1),$i.schedule())},xt.unobserve=function(mn,Wn){var kn=Jn.get(mn),wn=ir(kn.observationTargets,Wn);wn>=0&&(1===kn.observationTargets.length&&ee.splice(ee.indexOf(kn),1),kn.observationTargets.splice(wn,1),Hi(-1))},xt.disconnect=function(mn){var Wn=this,kn=Jn.get(mn);kn.observationTargets.slice().forEach(function(wn){return Wn.unobserve(mn,wn.target)}),kn.activeTargets.splice(0,kn.activeTargets.length)},xt}(),Vn=function(){function xt(mn){if(0===arguments.length)throw new TypeError("Failed to construct 'ResizeObserver': 1 argument required, but only 0 present.");if("function"!=typeof mn)throw new TypeError("Failed to construct 'ResizeObserver': The callback provided as parameter 1 is not a function.");Lr.connect(this,mn)}return xt.prototype.observe=function(mn,Wn){if(0===arguments.length)throw new TypeError("Failed to execute 'observe' on 'ResizeObserver': 1 argument required, but only 0 present.");if(!dt(mn))throw new TypeError("Failed to execute 'observe' on 'ResizeObserver': parameter 1 is not of type 'Element");Lr.observe(this,mn,Wn)},xt.prototype.unobserve=function(mn){if(0===arguments.length)throw new TypeError("Failed to execute 'unobserve' on 'ResizeObserver': 1 argument required, but only 0 present.");if(!dt(mn))throw new TypeError("Failed to execute 'unobserve' on 'ResizeObserver': parameter 1 is not of type 'Element");Lr.unobserve(this,mn)},xt.prototype.disconnect=function(){Lr.disconnect(this)},xt.toString=function(){return"function ResizeObserver () { [polyfill code] }"},xt}(),zr=i(72318),hi=i.n(zr);function mr(xt){return xt&&xt.ownerDocument&&xt.ownerDocument.defaultView?xt.ownerDocument.defaultView:window}function Xt(xt){return xt&&xt.ownerDocument?xt.ownerDocument:document}i(35319),i(69665),i(26954),i(80477),i(66262);var zn=null,vr=null;function si(xt){if(null===zn){var mn=Xt(xt);if(void 0===mn)return zn=0;var Wn=mn.body,kn=mn.createElement("div");kn.classList.add("simplebar-hide-scrollbar"),Wn.appendChild(kn);var wn=kn.getBoundingClientRect().right;Wn.removeChild(kn),zn=wn}return zn}hi()&&window.addEventListener("resize",function(){vr!==window.devicePixelRatio&&(vr=window.devicePixelRatio,zn=null)});var Ii=function(){function xt(Wn,kn){var wn=this;this.onScroll=function(){var nr=mr(wn.el);wn.scrollXTicking||(nr.requestAnimationFrame(wn.scrollX),wn.scrollXTicking=!0),wn.scrollYTicking||(nr.requestAnimationFrame(wn.scrollY),wn.scrollYTicking=!0)},this.scrollX=function(){wn.axis.x.isOverflowing&&(wn.showScrollbar("x"),wn.positionScrollbar("x")),wn.scrollXTicking=!1},this.scrollY=function(){wn.axis.y.isOverflowing&&(wn.showScrollbar("y"),wn.positionScrollbar("y")),wn.scrollYTicking=!1},this.onMouseEnter=function(){wn.showScrollbar("x"),wn.showScrollbar("y")},this.onMouseMove=function(nr){wn.mouseX=nr.clientX,wn.mouseY=nr.clientY,(wn.axis.x.isOverflowing||wn.axis.x.forceVisible)&&wn.onMouseMoveForAxis("x"),(wn.axis.y.isOverflowing||wn.axis.y.forceVisible)&&wn.onMouseMoveForAxis("y")},this.onMouseLeave=function(){wn.onMouseMove.cancel(),(wn.axis.x.isOverflowing||wn.axis.x.forceVisible)&&wn.onMouseLeaveForAxis("x"),(wn.axis.y.isOverflowing||wn.axis.y.forceVisible)&&wn.onMouseLeaveForAxis("y"),wn.mouseX=-1,wn.mouseY=-1},this.onWindowResize=function(){wn.scrollbarWidth=wn.getScrollbarWidth(),wn.hideNativeScrollbar()},this.hideScrollbars=function(){wn.axis.x.track.rect=wn.axis.x.track.el.getBoundingClientRect(),wn.axis.y.track.rect=wn.axis.y.track.el.getBoundingClientRect(),wn.isWithinBounds(wn.axis.y.track.rect)||(wn.axis.y.scrollbar.el.classList.remove(wn.classNames.visible),wn.axis.y.isVisible=!1),wn.isWithinBounds(wn.axis.x.track.rect)||(wn.axis.x.scrollbar.el.classList.remove(wn.classNames.visible),wn.axis.x.isVisible=!1)},this.onPointerEvent=function(nr){var Gi,po;wn.axis.x.track.rect=wn.axis.x.track.el.getBoundingClientRect(),wn.axis.y.track.rect=wn.axis.y.track.el.getBoundingClientRect(),(wn.axis.x.isOverflowing||wn.axis.x.forceVisible)&&(Gi=wn.isWithinBounds(wn.axis.x.track.rect)),(wn.axis.y.isOverflowing||wn.axis.y.forceVisible)&&(po=wn.isWithinBounds(wn.axis.y.track.rect)),(Gi||po)&&(nr.preventDefault(),nr.stopPropagation(),"mousedown"===nr.type&&(Gi&&(wn.axis.x.scrollbar.rect=wn.axis.x.scrollbar.el.getBoundingClientRect(),wn.isWithinBounds(wn.axis.x.scrollbar.rect)?wn.onDragStart(nr,"x"):wn.onTrackClick(nr,"x")),po&&(wn.axis.y.scrollbar.rect=wn.axis.y.scrollbar.el.getBoundingClientRect(),wn.isWithinBounds(wn.axis.y.scrollbar.rect)?wn.onDragStart(nr,"y"):wn.onTrackClick(nr,"y"))))},this.drag=function(nr){var po=wn.axis[wn.draggedAxis].track,yo=po.rect[wn.axis[wn.draggedAxis].sizeAttr],Mo=wn.axis[wn.draggedAxis].scrollbar,Vi=wn.contentWrapperEl[wn.axis[wn.draggedAxis].scrollSizeAttr],cs=parseInt(wn.elStyles[wn.axis[wn.draggedAxis].sizeAttr],10);nr.preventDefault(),nr.stopPropagation();var Si=(("y"===wn.draggedAxis?nr.pageY:nr.pageX)-po.rect[wn.axis[wn.draggedAxis].offsetAttr]-wn.axis[wn.draggedAxis].dragOffset)/(yo-Mo.size)*(Vi-cs);"x"===wn.draggedAxis&&(Si=wn.isRtl&&xt.getRtlHelpers().isRtlScrollbarInverted?Si-(yo+Mo.size):Si,Si=wn.isRtl&&xt.getRtlHelpers().isRtlScrollingInverted?-Si:Si),wn.contentWrapperEl[wn.axis[wn.draggedAxis].scrollOffsetAttr]=Si},this.onEndDrag=function(nr){var Gi=Xt(wn.el),po=mr(wn.el);nr.preventDefault(),nr.stopPropagation(),wn.el.classList.remove(wn.classNames.dragging),Gi.removeEventListener("mousemove",wn.drag,!0),Gi.removeEventListener("mouseup",wn.onEndDrag,!0),wn.removePreventClickId=po.setTimeout(function(){Gi.removeEventListener("click",wn.preventClick,!0),Gi.removeEventListener("dblclick",wn.preventClick,!0),wn.removePreventClickId=null})},this.preventClick=function(nr){nr.preventDefault(),nr.stopPropagation()},this.el=Wn,this.minScrollbarWidth=20,this.options=Object.assign({},xt.defaultOptions,kn),this.classNames=Object.assign({},xt.defaultOptions.classNames,this.options.classNames),this.axis={x:{scrollOffsetAttr:"scrollLeft",sizeAttr:"width",scrollSizeAttr:"scrollWidth",offsetSizeAttr:"offsetWidth",offsetAttr:"left",overflowAttr:"overflowX",dragOffset:0,isOverflowing:!0,isVisible:!1,forceVisible:!1,track:{},scrollbar:{}},y:{scrollOffsetAttr:"scrollTop",sizeAttr:"height",scrollSizeAttr:"scrollHeight",offsetSizeAttr:"offsetHeight",offsetAttr:"top",overflowAttr:"overflowY",dragOffset:0,isOverflowing:!0,isVisible:!1,forceVisible:!1,track:{},scrollbar:{}}},this.removePreventClickId=null,!xt.instances.has(this.el)&&(this.recalculate=R()(this.recalculate.bind(this),64),this.onMouseMove=R()(this.onMouseMove.bind(this),64),this.hideScrollbars=Z()(this.hideScrollbars.bind(this),this.options.timeout),this.onWindowResize=Z()(this.onWindowResize.bind(this),64,{leading:!0}),xt.getRtlHelpers=Q()(xt.getRtlHelpers),this.init())}xt.getRtlHelpers=function(){var kn=document.createElement("div");kn.innerHTML='<div class="hs-dummy-scrollbar-size"><div style="height: 200%; width: 200%; margin: 10px 0;"></div></div>';var wn=kn.firstElementChild;document.body.appendChild(wn);var nr=wn.firstElementChild;wn.scrollLeft=0;var Gi=xt.getOffset(wn),po=xt.getOffset(nr);wn.scrollLeft=999;var yo=xt.getOffset(nr);return{isRtlScrollingInverted:Gi.left!==po.left&&po.left-yo.left!=0,isRtlScrollbarInverted:Gi.left!==po.left}},xt.getOffset=function(kn){var wn=kn.getBoundingClientRect(),nr=Xt(kn),Gi=mr(kn);return{top:wn.top+(Gi.pageYOffset||nr.documentElement.scrollTop),left:wn.left+(Gi.pageXOffset||nr.documentElement.scrollLeft)}};var mn=xt.prototype;return mn.init=function(){xt.instances.set(this.el,this),hi()&&(this.initDOM(),this.setAccessibilityAttributes(),this.scrollbarWidth=this.getScrollbarWidth(),this.recalculate(),this.initListeners())},mn.initDOM=function(){var kn=this;if(Array.prototype.filter.call(this.el.children,function(Gi){return Gi.classList.contains(kn.classNames.wrapper)}).length)this.wrapperEl=this.el.querySelector("."+this.classNames.wrapper),this.contentWrapperEl=this.options.scrollableNode||this.el.querySelector("."+this.classNames.contentWrapper),this.contentEl=this.options.contentNode||this.el.querySelector("."+this.classNames.contentEl),this.offsetEl=this.el.querySelector("."+this.classNames.offset),this.maskEl=this.el.querySelector("."+this.classNames.mask),this.placeholderEl=this.findChild(this.wrapperEl,"."+this.classNames.placeholder),this.heightAutoObserverWrapperEl=this.el.querySelector("."+this.classNames.heightAutoObserverWrapperEl),this.heightAutoObserverEl=this.el.querySelector("."+this.classNames.heightAutoObserverEl),this.axis.x.track.el=this.findChild(this.el,"."+this.classNames.track+"."+this.classNames.horizontal),this.axis.y.track.el=this.findChild(this.el,"."+this.classNames.track+"."+this.classNames.vertical);else{for(this.wrapperEl=document.createElement("div"),this.contentWrapperEl=document.createElement("div"),this.offsetEl=document.createElement("div"),this.maskEl=document.createElement("div"),this.contentEl=document.createElement("div"),this.placeholderEl=document.createElement("div"),this.heightAutoObserverWrapperEl=document.createElement("div"),this.heightAutoObserverEl=document.createElement("div"),this.wrapperEl.classList.add(this.classNames.wrapper),this.contentWrapperEl.classList.add(this.classNames.contentWrapper),this.offsetEl.classList.add(this.classNames.offset),this.maskEl.classList.add(this.classNames.mask),this.contentEl.classList.add(this.classNames.contentEl),this.placeholderEl.classList.add(this.classNames.placeholder),this.heightAutoObserverWrapperEl.classList.add(this.classNames.heightAutoObserverWrapperEl),this.heightAutoObserverEl.classList.add(this.classNames.heightAutoObserverEl);this.el.firstChild;)this.contentEl.appendChild(this.el.firstChild);this.contentWrapperEl.appendChild(this.contentEl),this.offsetEl.appendChild(this.contentWrapperEl),this.maskEl.appendChild(this.offsetEl),this.heightAutoObserverWrapperEl.appendChild(this.heightAutoObserverEl),this.wrapperEl.appendChild(this.heightAutoObserverWrapperEl),this.wrapperEl.appendChild(this.maskEl),this.wrapperEl.appendChild(this.placeholderEl),this.el.appendChild(this.wrapperEl)}if(!this.axis.x.track.el||!this.axis.y.track.el){var wn=document.createElement("div"),nr=document.createElement("div");wn.classList.add(this.classNames.track),nr.classList.add(this.classNames.scrollbar),wn.appendChild(nr),this.axis.x.track.el=wn.cloneNode(!0),this.axis.x.track.el.classList.add(this.classNames.horizontal),this.axis.y.track.el=wn.cloneNode(!0),this.axis.y.track.el.classList.add(this.classNames.vertical),this.el.appendChild(this.axis.x.track.el),this.el.appendChild(this.axis.y.track.el)}this.axis.x.scrollbar.el=this.axis.x.track.el.querySelector("."+this.classNames.scrollbar),this.axis.y.scrollbar.el=this.axis.y.track.el.querySelector("."+this.classNames.scrollbar),this.options.autoHide||(this.axis.x.scrollbar.el.classList.add(this.classNames.visible),this.axis.y.scrollbar.el.classList.add(this.classNames.visible)),this.el.setAttribute("data-simplebar","init")},mn.setAccessibilityAttributes=function(){var kn=this.options.ariaLabel||"scrollable content";this.contentWrapperEl.setAttribute("tabindex","0"),this.contentWrapperEl.setAttribute("role","region"),this.contentWrapperEl.setAttribute("aria-label",kn)},mn.initListeners=function(){var kn=this,wn=mr(this.el);this.options.autoHide&&this.el.addEventListener("mouseenter",this.onMouseEnter),["mousedown","click","dblclick"].forEach(function(po){kn.el.addEventListener(po,kn.onPointerEvent,!0)}),["touchstart","touchend","touchmove"].forEach(function(po){kn.el.addEventListener(po,kn.onPointerEvent,{capture:!0,passive:!0})}),this.el.addEventListener("mousemove",this.onMouseMove),this.el.addEventListener("mouseleave",this.onMouseLeave),this.contentWrapperEl.addEventListener("scroll",this.onScroll),wn.addEventListener("resize",this.onWindowResize);var nr=!1;this.resizeObserver=new(wn.ResizeObserver||Vn)(function(){!nr||kn.recalculate()}),this.resizeObserver.observe(this.el),this.resizeObserver.observe(this.contentEl),wn.requestAnimationFrame(function(){nr=!0}),this.mutationObserver=new wn.MutationObserver(this.recalculate),this.mutationObserver.observe(this.contentEl,{childList:!0,subtree:!0,characterData:!0})},mn.recalculate=function(){var kn=mr(this.el);this.elStyles=kn.getComputedStyle(this.el),this.isRtl="rtl"===this.elStyles.direction;var wn=this.heightAutoObserverEl.offsetHeight<=1,nr=this.heightAutoObserverEl.offsetWidth<=1,Gi=this.contentEl.offsetWidth,po=this.contentWrapperEl.offsetWidth,yo=this.elStyles.overflowX,Mo=this.elStyles.overflowY;this.contentEl.style.padding=this.elStyles.paddingTop+" "+this.elStyles.paddingRight+" "+this.elStyles.paddingBottom+" "+this.elStyles.paddingLeft,this.wrapperEl.style.margin="-"+this.elStyles.paddingTop+" -"+this.elStyles.paddingRight+" -"+this.elStyles.paddingBottom+" -"+this.elStyles.paddingLeft;var Vi=this.contentEl.scrollHeight,cs=this.contentEl.scrollWidth;this.contentWrapperEl.style.height=wn?"auto":"100%",this.placeholderEl.style.width=nr?Gi+"px":"auto",this.placeholderEl.style.height=Vi+"px";var zo=this.contentWrapperEl.offsetHeight;this.axis.x.isOverflowing=cs>Gi,this.axis.y.isOverflowing=Vi>zo,this.axis.x.isOverflowing="hidden"!==yo&&this.axis.x.isOverflowing,this.axis.y.isOverflowing="hidden"!==Mo&&this.axis.y.isOverflowing,this.axis.x.forceVisible="x"===this.options.forceVisible||!0===this.options.forceVisible,this.axis.y.forceVisible="y"===this.options.forceVisible||!0===this.options.forceVisible,this.hideNativeScrollbar();var So=this.axis.x.isOverflowing?this.scrollbarWidth:0;this.axis.x.isOverflowing=this.axis.x.isOverflowing&&cs>po-(this.axis.y.isOverflowing?this.scrollbarWidth:0),this.axis.y.isOverflowing=this.axis.y.isOverflowing&&Vi>zo-So,this.axis.x.scrollbar.size=this.getScrollbarSize("x"),this.axis.y.scrollbar.size=this.getScrollbarSize("y"),this.axis.x.scrollbar.el.style.width=this.axis.x.scrollbar.size+"px",this.axis.y.scrollbar.el.style.height=this.axis.y.scrollbar.size+"px",this.positionScrollbar("x"),this.positionScrollbar("y"),this.toggleTrackVisibility("x"),this.toggleTrackVisibility("y")},mn.getScrollbarSize=function(kn){if(void 0===kn&&(kn="y"),!this.axis[kn].isOverflowing)return 0;var Gi,nr=this.axis[kn].track.el[this.axis[kn].offsetSizeAttr];return Gi=Math.max(~~(nr/this.contentEl[this.axis[kn].scrollSizeAttr]*nr),this.options.scrollbarMinSize),this.options.scrollbarMaxSize&&(Gi=Math.min(Gi,this.options.scrollbarMaxSize)),Gi},mn.positionScrollbar=function(kn){if(void 0===kn&&(kn="y"),this.axis[kn].isOverflowing){var wn=this.contentWrapperEl[this.axis[kn].scrollSizeAttr],nr=this.axis[kn].track.el[this.axis[kn].offsetSizeAttr],Gi=parseInt(this.elStyles[this.axis[kn].sizeAttr],10),po=this.axis[kn].scrollbar,yo=this.contentWrapperEl[this.axis[kn].scrollOffsetAttr],Vi=~~((yo="x"===kn&&this.isRtl&&xt.getRtlHelpers().isRtlScrollingInverted?-yo:yo)/(wn-Gi)*(nr-po.size));Vi="x"===kn&&this.isRtl&&xt.getRtlHelpers().isRtlScrollbarInverted?Vi+(nr-po.size):Vi,po.el.style.transform="x"===kn?"translate3d("+Vi+"px, 0, 0)":"translate3d(0, "+Vi+"px, 0)"}},mn.toggleTrackVisibility=function(kn){void 0===kn&&(kn="y");var wn=this.axis[kn].track.el,nr=this.axis[kn].scrollbar.el;this.axis[kn].isOverflowing||this.axis[kn].forceVisible?(wn.style.visibility="visible",this.contentWrapperEl.style[this.axis[kn].overflowAttr]="scroll"):(wn.style.visibility="hidden",this.contentWrapperEl.style[this.axis[kn].overflowAttr]="hidden"),nr.style.display=this.axis[kn].isOverflowing?"block":"none"},mn.hideNativeScrollbar=function(){this.offsetEl.style[this.isRtl?"left":"right"]=this.axis.y.isOverflowing||this.axis.y.forceVisible?"-"+this.scrollbarWidth+"px":0,this.offsetEl.style.bottom=this.axis.x.isOverflowing||this.axis.x.forceVisible?"-"+this.scrollbarWidth+"px":0},mn.onMouseMoveForAxis=function(kn){void 0===kn&&(kn="y"),this.axis[kn].track.rect=this.axis[kn].track.el.getBoundingClientRect(),this.axis[kn].scrollbar.rect=this.axis[kn].scrollbar.el.getBoundingClientRect(),this.isWithinBounds(this.axis[kn].scrollbar.rect)?this.axis[kn].scrollbar.el.classList.add(this.classNames.hover):this.axis[kn].scrollbar.el.classList.remove(this.classNames.hover),this.isWithinBounds(this.axis[kn].track.rect)?(this.showScrollbar(kn),this.axis[kn].track.el.classList.add(this.classNames.hover)):this.axis[kn].track.el.classList.remove(this.classNames.hover)},mn.onMouseLeaveForAxis=function(kn){void 0===kn&&(kn="y"),this.axis[kn].track.el.classList.remove(this.classNames.hover),this.axis[kn].scrollbar.el.classList.remove(this.classNames.hover)},mn.showScrollbar=function(kn){void 0===kn&&(kn="y"),this.axis[kn].isVisible||(this.axis[kn].scrollbar.el.classList.add(this.classNames.visible),this.axis[kn].isVisible=!0),this.options.autoHide&&this.hideScrollbars()},mn.onDragStart=function(kn,wn){void 0===wn&&(wn="y");var nr=Xt(this.el),Gi=mr(this.el);this.axis[wn].dragOffset=("y"===wn?kn.pageY:kn.pageX)-this.axis[wn].scrollbar.rect[this.axis[wn].offsetAttr],this.draggedAxis=wn,this.el.classList.add(this.classNames.dragging),nr.addEventListener("mousemove",this.drag,!0),nr.addEventListener("mouseup",this.onEndDrag,!0),null===this.removePreventClickId?(nr.addEventListener("click",this.preventClick,!0),nr.addEventListener("dblclick",this.preventClick,!0)):(Gi.clearTimeout(this.removePreventClickId),this.removePreventClickId=null)},mn.onTrackClick=function(kn,wn){var nr=this;if(void 0===wn&&(wn="y"),this.options.clickOnTrack){var Gi=mr(this.el);this.axis[wn].scrollbar.rect=this.axis[wn].scrollbar.el.getBoundingClientRect();var yo=this.axis[wn].scrollbar.rect[this.axis[wn].offsetAttr],Mo=parseInt(this.elStyles[this.axis[wn].sizeAttr],10),Vi=this.contentWrapperEl[this.axis[wn].scrollOffsetAttr],zo=("y"===wn?this.mouseY-yo:this.mouseX-yo)<0?-1:1,So=-1===zo?Vi-Mo:Vi+Mo;!function ai(){var Zn;if(-1===zo)Vi>So&&(nr.contentWrapperEl.scrollTo(((Zn={})[nr.axis[wn].offsetAttr]=Vi-=nr.options.clickOnTrackSpeed,Zn)),Gi.requestAnimationFrame(ai));else if(Vi<So){var cr;nr.contentWrapperEl.scrollTo(((cr={})[nr.axis[wn].offsetAttr]=Vi+=nr.options.clickOnTrackSpeed,cr)),Gi.requestAnimationFrame(ai)}}()}},mn.getContentElement=function(){return this.contentEl},mn.getScrollElement=function(){return this.contentWrapperEl},mn.getScrollbarWidth=function(){try{return"none"===getComputedStyle(this.contentWrapperEl,"::-webkit-scrollbar").display||"scrollbarWidth"in document.documentElement.style||"-ms-overflow-style"in document.documentElement.style?0:si(this.el)}catch(kn){return si(this.el)}},mn.removeListeners=function(){var kn=this,wn=mr(this.el);this.options.autoHide&&this.el.removeEventListener("mouseenter",this.onMouseEnter),["mousedown","click","dblclick"].forEach(function(nr){kn.el.removeEventListener(nr,kn.onPointerEvent,!0)}),["touchstart","touchend","touchmove"].forEach(function(nr){kn.el.removeEventListener(nr,kn.onPointerEvent,{capture:!0,passive:!0})}),this.el.removeEventListener("mousemove",this.onMouseMove),this.el.removeEventListener("mouseleave",this.onMouseLeave),this.contentWrapperEl&&this.contentWrapperEl.removeEventListener("scroll",this.onScroll),wn.removeEventListener("resize",this.onWindowResize),this.mutationObserver&&this.mutationObserver.disconnect(),this.resizeObserver&&this.resizeObserver.disconnect(),this.recalculate.cancel(),this.onMouseMove.cancel(),this.hideScrollbars.cancel(),this.onWindowResize.cancel()},mn.unMount=function(){this.removeListeners(),xt.instances.delete(this.el)},mn.isWithinBounds=function(kn){return this.mouseX>=kn.left&&this.mouseX<=kn.left+kn.width&&this.mouseY>=kn.top&&this.mouseY<=kn.top+kn.height},mn.findChild=function(kn,wn){var nr=kn.matches||kn.webkitMatchesSelector||kn.mozMatchesSelector||kn.msMatchesSelector;return Array.prototype.filter.call(kn.children,function(Gi){return nr.call(Gi,wn)})[0]},xt}();Ii.defaultOptions={autoHide:!0,forceVisible:!1,clickOnTrack:!0,clickOnTrackSpeed:40,classNames:{contentEl:"simplebar-content",contentWrapper:"simplebar-content-wrapper",offset:"simplebar-offset",mask:"simplebar-mask",wrapper:"simplebar-wrapper",placeholder:"simplebar-placeholder",scrollbar:"simplebar-scrollbar",track:"simplebar-track",heightAutoObserverWrapperEl:"simplebar-height-auto-observer-wrapper",heightAutoObserverEl:"simplebar-height-auto-observer",visible:"simplebar-visible",horizontal:"simplebar-horizontal",vertical:"simplebar-vertical",hover:"simplebar-hover",dragging:"simplebar-dragging"},scrollbarMinSize:25,scrollbarMaxSize:0,timeout:1e3},Ii.instances=new WeakMap;const no=Ii;var so=i(74788);const Ze=["*"];let Dr=(()=>{class xt{constructor(Wn){this.elRef=Wn}ngOnInit(){}ngAfterViewInit(){this.SimpleBar=new no(this.elRef.nativeElement,this.options||{})}ngOnDestroy(){this.SimpleBar.unMount(),this.SimpleBar=null}}return xt.\u0275fac=function(Wn){return new(Wn||xt)(so.Y36(so.SBq))},xt.\u0275cmp=so.Xpm({type:xt,selectors:[["ngx-simplebar"]],hostAttrs:["data-simplebar","init"],inputs:{options:"options"},ngContentSelectors:Ze,decls:13,vars:0,consts:[[1,"simplebar-wrapper"],[1,"simplebar-height-auto-observer-wrapper"],[1,"simplebar-height-auto-observer"],[1,"simplebar-mask"],[1,"simplebar-offset"],[1,"simplebar-content-wrapper"],[1,"simplebar-content"],[1,"simplebar-placeholder"],[1,"simplebar-track","simplebar-horizontal"],[1,"simplebar-scrollbar"],[1,"simplebar-track","simplebar-vertical"]],template:function(Wn,kn){1&Wn&&(so.F$t(),so.TgZ(0,"div",0),so.TgZ(1,"div",1),so._UZ(2,"div",2),so.qZA(),so.TgZ(3,"div",3),so.TgZ(4,"div",4),so.TgZ(5,"div",5),so.TgZ(6,"div",6),so.Hsn(7),so.qZA(),so.qZA(),so.qZA(),so.qZA(),so._UZ(8,"div",7),so.qZA(),so.TgZ(9,"div",8),so._UZ(10,"div",9),so.qZA(),so.TgZ(11,"div",10),so._UZ(12,"div",9),so.qZA())},styles:["[data-simplebar]{position:relative;-webkit-box-orient:vertical;-webkit-box-direction:normal;flex-direction:column;flex-wrap:wrap;-webkit-box-pack:start;justify-content:flex-start;align-content:flex-start;-webkit-box-align:start;align-items:flex-start}.simplebar-wrapper{overflow:hidden;width:inherit;height:inherit;max-width:inherit;max-height:inherit}.simplebar-mask{direction:inherit;position:absolute;overflow:hidden;padding:0;margin:0;left:0;top:0;bottom:0;right:0;width:auto!important;height:auto!important;z-index:0}.simplebar-offset{direction:inherit!important;box-sizing:inherit!important;resize:none!important;position:absolute;top:0;left:0;bottom:0;right:0;padding:0;margin:0;-webkit-overflow-scrolling:touch}.simplebar-content-wrapper{direction:inherit;box-sizing:border-box!important;position:relative;display:block;height:100%;width:auto;max-width:100%;max-height:100%;scrollbar-width:none;-ms-overflow-style:none}.simplebar-content-wrapper::-webkit-scrollbar,.simplebar-hide-scrollbar::-webkit-scrollbar{width:0;height:0}.simplebar-content:after,.simplebar-content:before{content:' ';display:table}.simplebar-placeholder{max-height:100%;max-width:100%;width:100%;pointer-events:none}.simplebar-height-auto-observer-wrapper{box-sizing:inherit!important;height:100%;width:100%;max-width:1px;position:relative;float:left;max-height:1px;overflow:hidden;z-index:-1;padding:0;margin:0;pointer-events:none;-webkit-box-flex:inherit;flex-grow:inherit;flex-shrink:0;flex-basis:0}.simplebar-height-auto-observer{box-sizing:inherit;display:block;opacity:0;position:absolute;top:0;left:0;height:1000%;width:1000%;min-height:1px;min-width:1px;overflow:hidden;pointer-events:none;z-index:-1}.simplebar-track{z-index:1;position:absolute;right:0;bottom:0;pointer-events:none;overflow:hidden}[data-simplebar].simplebar-dragging .simplebar-content{pointer-events:none;-moz-user-select:none;-ms-user-select:none;user-select:none;-webkit-user-select:none}[data-simplebar].simplebar-dragging .simplebar-track{pointer-events:all}.simplebar-scrollbar{position:absolute;left:0;right:0;min-height:10px}.simplebar-scrollbar:before{position:absolute;content:'';background:#000;border-radius:7px;left:2px;right:2px;opacity:0;-webkit-transition:opacity .2s linear;transition:opacity .2s linear}.simplebar-scrollbar.simplebar-visible:before{opacity:.5;-webkit-transition:opacity linear;transition:opacity linear}.simplebar-track.simplebar-vertical{top:0;width:11px}.simplebar-track.simplebar-vertical .simplebar-scrollbar:before{top:2px;bottom:2px}.simplebar-track.simplebar-horizontal{left:0;height:11px}.simplebar-track.simplebar-horizontal .simplebar-scrollbar:before{height:100%;left:2px;right:2px}.simplebar-track.simplebar-horizontal .simplebar-scrollbar{right:auto;left:0;top:2px;height:7px;min-height:0;min-width:10px;width:auto}[data-simplebar-direction=rtl] .simplebar-track.simplebar-vertical{right:auto;left:0}.hs-dummy-scrollbar-size{direction:rtl;position:fixed;opacity:0;visibility:hidden;height:500px;width:500px;overflow-y:hidden;overflow-x:scroll}.simplebar-hide-scrollbar{position:fixed;left:0;visibility:hidden;overflow-y:scroll;scrollbar-width:none;-ms-overflow-style:none}","ngx-simplebar{display:block}"],encapsulation:2}),xt})(),jt=(()=>{class xt{}return xt.\u0275fac=function(Wn){return new(Wn||xt)},xt.\u0275mod=so.oAB({type:xt}),xt.\u0275inj=so.cJS({imports:[[]]}),xt})()},35311:v=>{v.exports=function(){var S=document.getSelection();if(!S.rangeCount)return function(){};for(var i=document.activeElement,r=[],u=0;u<S.rangeCount;u++)r.push(S.getRangeAt(u));switch(i.tagName.toUpperCase()){case"INPUT":case"TEXTAREA":i.blur();break;default:i=null}return S.removeAllRanges(),function(){"Caret"===S.type&&S.removeAllRanges(),S.rangeCount||r.forEach(function(p){S.addRange(p)}),i&&i.focus()}}},18807:v=>{var S=v.exports=function(Q){return new i(Q)};function i(Q){this.value=Q}function r(Q,ee,ue){var ae=[],$=[],se=!0;return function ve(oe){var he=ue?u(oe):oe,me={},Oe=!0,ce={node:he,node_:oe,path:[].concat(ae),parent:$[$.length-1],parents:$,key:ae.slice(-1)[0],isRoot:0===ae.length,level:ae.length,circular:null,update:function(Ye,je){ce.isRoot||(ce.parent.node[ce.key]=Ye),ce.node=Ye,je&&(Oe=!1)},delete:function(Ye){delete ce.parent.node[ce.key],Ye&&(Oe=!1)},remove:function(Ye){F(ce.parent.node)?ce.parent.node.splice(ce.key,1):delete ce.parent.node[ce.key],Ye&&(Oe=!1)},keys:null,before:function(Ye){me.before=Ye},after:function(Ye){me.after=Ye},pre:function(Ye){me.pre=Ye},post:function(Ye){me.post=Ye},stop:function(){se=!1},block:function(){Oe=!1}};if(!se)return ce;function dt(){if("object"==typeof ce.node&&null!==ce.node){(!ce.keys||ce.node_!==ce.node)&&(ce.keys=p(ce.node)),ce.isLeaf=0==ce.keys.length;for(var Ye=0;Ye<$.length;Ye++)if($[Ye].node_===oe){ce.circular=$[Ye];break}}else ce.isLeaf=!0,ce.keys=null;ce.notLeaf=!ce.isLeaf,ce.notRoot=!ce.isRoot}dt();var ze=ee.call(ce,ce.node);return void 0!==ze&&ce.update&&ce.update(ze),me.before&&me.before.call(ce,ce.node),Oe&&("object"==typeof ce.node&&null!==ce.node&&!ce.circular&&($.push(ce),dt(),Z(ce.keys,function(Ye,je){ae.push(Ye),me.pre&&me.pre.call(ce,ce.node[Ye],Ye);var Ie=ve(ce.node[Ye]);ue&&J.call(ce.node,Ye)&&(ce.node[Ye]=Ie.node),Ie.isLast=je==ce.keys.length-1,Ie.isFirst=0==je,me.post&&me.post.call(ce,Ie),ae.pop()}),$.pop()),me.after&&me.after.call(ce,ce.node)),ce}(Q).node}function u(Q){if("object"==typeof Q&&null!==Q){var ee;if(F(Q))ee=[];else if(function(Q){return"[object Date]"===f(Q)}(Q))ee=new Date(Q.getTime?Q.getTime():Q);else if(function(Q){return"[object RegExp]"===f(Q)}(Q))ee=new RegExp(Q);else if(function(Q){return"[object Error]"===f(Q)}(Q))ee={message:Q.message};else if(function(Q){return"[object Boolean]"===f(Q)}(Q))ee=new Boolean(Q);else if(function(Q){return"[object Number]"===f(Q)}(Q))ee=new Number(Q);else if(function(Q){return"[object String]"===f(Q)}(Q))ee=new String(Q);else if(Object.create&&Object.getPrototypeOf)ee=Object.create(Object.getPrototypeOf(Q));else if(Q.constructor===Object)ee={};else{var ae=function(){};ae.prototype=Q.constructor&&Q.constructor.prototype||Q.__proto__||{},ee=new ae}return Z(p(Q),function($){ee[$]=Q[$]}),ee}return Q}i.prototype.get=function(Q){for(var ee=this.value,ue=0;ue<Q.length;ue++){var ae=Q[ue];if(!ee||!J.call(ee,ae)){ee=void 0;break}ee=ee[ae]}return ee},i.prototype.has=function(Q){for(var ee=this.value,ue=0;ue<Q.length;ue++){var ae=Q[ue];if(!ee||!J.call(ee,ae))return!1;ee=ee[ae]}return!0},i.prototype.set=function(Q,ee){for(var ue=this.value,ae=0;ae<Q.length-1;ae++){var $=Q[ae];J.call(ue,$)||(ue[$]={}),ue=ue[$]}return ue[Q[ae]]=ee,ee},i.prototype.map=function(Q){return r(this.value,Q,!0)},i.prototype.forEach=function(Q){return this.value=r(this.value,Q,!1),this.value},i.prototype.reduce=function(Q,ee){var ue=1===arguments.length,ae=ue?this.value:ee;return this.forEach(function($){(!this.isRoot||!ue)&&(ae=Q.call(this,ae,$))}),ae},i.prototype.paths=function(){var Q=[];return this.forEach(function(ee){Q.push(this.path)}),Q},i.prototype.nodes=function(){var Q=[];return this.forEach(function(ee){Q.push(this.node)}),Q},i.prototype.clone=function(){var Q=[],ee=[];return function ue(ae){for(var $=0;$<Q.length;$++)if(Q[$]===ae)return ee[$];if("object"==typeof ae&&null!==ae){var se=u(ae);return Q.push(ae),ee.push(se),Z(p(ae),function(ve){se[ve]=ue(ae[ve])}),Q.pop(),ee.pop(),se}return ae}(this.value)};var p=Object.keys||function(ee){var ue=[];for(var ae in ee)ue.push(ae);return ue};function f(Q){return Object.prototype.toString.call(Q)}var F=Array.isArray||function(ee){return"[object Array]"===Object.prototype.toString.call(ee)},Z=function(Q,ee){if(Q.forEach)return Q.forEach(ee);for(var ue=0;ue<Q.length;ue++)ee(Q[ue],ue,Q)};Z(p(i.prototype),function(Q){S[Q]=function(ee){var ue=[].slice.call(arguments,1),ae=new i(ee);return ae[Q].apply(ae,ue)}});var J=Object.hasOwnProperty||function(Q,ee){return ee in Q}},2135:(v,S,i)=>{"use strict";var r=i(90465),u=i(76959),p=/^[\x00-\x20\u00a0\u1680\u2000-\u200a\u2028\u2029\u202f\u205f\u3000\ufeff]+/,f=/[\n\r\t]/g,e=/^[A-Za-z][A-Za-z0-9+-.]*:\/\//,_=/:\d+$/,y=/^([a-z][a-z0-9.+-]*:)?(\/\/)?([\\/]+)?([\S\s]*)/i,T=/^[a-zA-Z]:/;function M(se){return(se||"").toString().replace(p,"")}var R=[["#","hash"],["?","query"],function(ve,oe){return J(oe.protocol)?ve.replace(/\\/g,"/"):ve},["/","pathname"],["@","auth",1],[NaN,"host",void 0,1,1],[/:(\d*)$/,"port",void 0,1],[NaN,"hostname",void 0,1,1]],F={hash:1,query:1};function Z(se){var ve;ve="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof self?self:{};var Oe,he={},me=typeof(se=se||ve.location||{});if("blob:"===se.protocol)he=new ue(unescape(se.pathname),{});else if("string"===me)for(Oe in he=new ue(se,{}),F)delete he[Oe];else if("object"===me){for(Oe in se)Oe in F||(he[Oe]=se[Oe]);void 0===he.slashes&&(he.slashes=e.test(se.href))}return he}function J(se){return"file:"===se||"ftp:"===se||"http:"===se||"https:"===se||"ws:"===se||"wss:"===se}function Q(se,ve){se=(se=M(se)).replace(f,""),ve=ve||{};var dt,oe=y.exec(se),he=oe[1]?oe[1].toLowerCase():"",me=!!oe[2],Oe=!!oe[3],ce=0;return me?Oe?(dt=oe[2]+oe[3]+oe[4],ce=oe[2].length+oe[3].length):(dt=oe[2]+oe[4],ce=oe[2].length):Oe?(dt=oe[3]+oe[4],ce=oe[3].length):dt=oe[4],"file:"===he?ce>=2&&(dt=dt.slice(2)):J(he)?dt=oe[4]:he?me&&(dt=dt.slice(2)):ce>=2&&J(ve.protocol)&&(dt=oe[4]),{protocol:he,slashes:me||J(he),slashesCount:ce,rest:dt}}function ue(se,ve,oe){if(se=(se=M(se)).replace(f,""),!(this instanceof ue))return new ue(se,ve,oe);var he,me,Oe,ce,dt,ze,Ye=R.slice(),je=typeof ve,Ie=this,Ve=0;for("object"!==je&&"string"!==je&&(oe=ve,ve=null),oe&&"function"!=typeof oe&&(oe=u.parse),he=!(me=Q(se||"",ve=Z(ve))).protocol&&!me.slashes,Ie.slashes=me.slashes||he&&ve.slashes,Ie.protocol=me.protocol||ve.protocol||"",se=me.rest,("file:"===me.protocol&&(2!==me.slashesCount||T.test(se))||!me.slashes&&(me.protocol||me.slashesCount<2||!J(Ie.protocol)))&&(Ye[3]=[/(.*)/,"pathname"]);Ve<Ye.length;Ve++)"function"!=typeof(ce=Ye[Ve])?(ze=ce[1],(Oe=ce[0])!=Oe?Ie[ze]=se:"string"==typeof Oe?~(dt="@"===Oe?se.lastIndexOf(Oe):se.indexOf(Oe))&&("number"==typeof ce[2]?(Ie[ze]=se.slice(0,dt),se=se.slice(dt+ce[2])):(Ie[ze]=se.slice(dt),se=se.slice(0,dt))):(dt=Oe.exec(se))&&(Ie[ze]=dt[1],se=se.slice(0,dt.index)),Ie[ze]=Ie[ze]||he&&ce[3]&&ve[ze]||"",ce[4]&&(Ie[ze]=Ie[ze].toLowerCase())):se=ce(se,Ie);oe&&(Ie.query=oe(Ie.query)),he&&ve.slashes&&"/"!==Ie.pathname.charAt(0)&&(""!==Ie.pathname||""!==ve.pathname)&&(Ie.pathname=function(se,ve){if(""===se)return ve;for(var oe=(ve||"/").split("/").slice(0,-1).concat(se.split("/")),he=oe.length,me=oe[he-1],Oe=!1,ce=0;he--;)"."===oe[he]?oe.splice(he,1):".."===oe[he]?(oe.splice(he,1),ce++):ce&&(0===he&&(Oe=!0),oe.splice(he,1),ce--);return Oe&&oe.unshift(""),("."===me||".."===me)&&oe.push(""),oe.join("/")}(Ie.pathname,ve.pathname)),"/"!==Ie.pathname.charAt(0)&&J(Ie.protocol)&&(Ie.pathname="/"+Ie.pathname),r(Ie.port,Ie.protocol)||(Ie.host=Ie.hostname,Ie.port=""),Ie.username=Ie.password="",Ie.auth&&(~(dt=Ie.auth.indexOf(":"))?(Ie.username=Ie.auth.slice(0,dt),Ie.username=encodeURIComponent(decodeURIComponent(Ie.username)),Ie.password=Ie.auth.slice(dt+1),Ie.password=encodeURIComponent(decodeURIComponent(Ie.password))):Ie.username=encodeURIComponent(decodeURIComponent(Ie.auth)),Ie.auth=Ie.password?Ie.username+":"+Ie.password:Ie.username),Ie.origin="file:"!==Ie.protocol&&J(Ie.protocol)&&Ie.host?Ie.protocol+"//"+Ie.host:"null",Ie.href=Ie.toString()}ue.prototype={set:function(se,ve,oe){var he=this;switch(se){case"query":"string"==typeof ve&&ve.length&&(ve=(oe||u.parse)(ve)),he[se]=ve;break;case"port":he[se]=ve,r(ve,he.protocol)?ve&&(he.host=he.hostname+":"+ve):(he.host=he.hostname,he[se]="");break;case"hostname":he[se]=ve,he.port&&(ve+=":"+he.port),he.host=ve;break;case"host":he[se]=ve,_.test(ve)?(ve=ve.split(":"),he.port=ve.pop(),he.hostname=ve.join(":")):(he.hostname=ve,he.port="");break;case"protocol":he.protocol=ve.toLowerCase(),he.slashes=!oe;break;case"pathname":case"hash":if(ve){var me="pathname"===se?"/":"#";he[se]=ve.charAt(0)!==me?me+ve:ve}else he[se]=ve;break;case"username":case"password":he[se]=encodeURIComponent(ve);break;case"auth":var Oe=ve.indexOf(":");~Oe?(he.username=ve.slice(0,Oe),he.username=encodeURIComponent(decodeURIComponent(he.username)),he.password=ve.slice(Oe+1),he.password=encodeURIComponent(decodeURIComponent(he.password))):he.username=encodeURIComponent(decodeURIComponent(ve))}for(var ce=0;ce<R.length;ce++){var dt=R[ce];dt[4]&&(he[dt[1]]=he[dt[1]].toLowerCase())}return he.auth=he.password?he.username+":"+he.password:he.username,he.origin="file:"!==he.protocol&&J(he.protocol)&&he.host?he.protocol+"//"+he.host:"null",he.href=he.toString(),he},toString:function(se){(!se||"function"!=typeof se)&&(se=u.stringify);var ve,oe=this,he=oe.host,me=oe.protocol;me&&":"!==me.charAt(me.length-1)&&(me+=":");var Oe=me+(oe.protocol&&oe.slashes||J(oe.protocol)?"//":"");return oe.username?(Oe+=oe.username,oe.password&&(Oe+=":"+oe.password),Oe+="@"):oe.password?(Oe+=":"+oe.password,Oe+="@"):"file:"!==oe.protocol&&J(oe.protocol)&&!he&&"/"!==oe.pathname&&(Oe+="@"),(":"===he[he.length-1]||_.test(oe.hostname)&&!oe.port)&&(he+=":"),Oe+=he+oe.pathname,(ve="object"==typeof oe.query?se(oe.query):oe.query)&&(Oe+="?"!==ve.charAt(0)?"?"+ve:ve),oe.hash&&(Oe+=oe.hash),Oe}},ue.extractProtocol=Q,ue.location=Z,ue.trimLeft=M,ue.qs=u,v.exports=ue},38505:(v,S,i)=>{"use strict";var r=i(87504),u=i(43745);function p(){this.protocol=null,this.slashes=null,this.auth=null,this.host=null,this.port=null,this.hostname=null,this.hash=null,this.search=null,this.query=null,this.pathname=null,this.path=null,this.href=null}S.parse=se,S.resolve=function(me,Oe){return se(me,!1,!0).resolve(Oe)},S.resolveObject=function(me,Oe){return me?se(me,!1,!0).resolveObject(Oe):Oe},S.format=function(me){return u.isString(me)&&(me=se(me)),me instanceof p?me.format():p.prototype.format.call(me)},S.Url=p;var f=/^([a-z0-9.+-]+:)/i,e=/:[0-9]*$/,_=/^(\/\/?(?!\/)[^\?\s]*)(\?[^\s]*)?$/,T=["{","}","|","\\","^","`"].concat(["<",">",'"',"`"," ","\r","\n","\t"]),M=["'"].concat(T),R=["%","/","?",";","#"].concat(M),F=["/","?","#"],J=/^[+a-z0-9A-Z_-]{0,63}$/,Q=/^([+a-z0-9A-Z_-]{0,63})(.*)$/,ee={javascript:!0,"javascript:":!0},ue={javascript:!0,"javascript:":!0},ae={http:!0,https:!0,ftp:!0,gopher:!0,file:!0,"http:":!0,"https:":!0,"ftp:":!0,"gopher:":!0,"file:":!0},$=i(36284);function se(me,Oe,ce){if(me&&u.isObject(me)&&me instanceof p)return me;var dt=new p;return dt.parse(me,Oe,ce),dt}p.prototype.parse=function(me,Oe,ce){if(!u.isString(me))throw new TypeError("Parameter 'url' must be a string, not "+typeof me);var dt=me.indexOf("?"),ze=-1!==dt&&dt<me.indexOf("#")?"?":"#",Ye=me.split(ze);Ye[0]=Ye[0].replace(/\\/g,"/");var Ie=me=Ye.join(ze);if(Ie=Ie.trim(),!ce&&1===me.split("#").length){var Ve=_.exec(Ie);if(Ve)return this.path=Ie,this.href=Ie,this.pathname=Ve[1],Ve[2]?(this.search=Ve[2],this.query=Oe?$.parse(this.search.substr(1)):this.search.substr(1)):Oe&&(this.search="",this.query={}),this}var He=f.exec(Ie);if(He){var Zt=(He=He[0]).toLowerCase();this.protocol=Zt,Ie=Ie.substr(He.length)}if(ce||He||Ie.match(/^\/\/[^@\/]+@[^@\/]+/)){var st="//"===Ie.substr(0,2);st&&(!He||!ue[He])&&(Ie=Ie.substr(2),this.slashes=!0)}if(!ue[He]&&(st||He&&!ae[He])){for(var en=-1,$t=0;$t<F.length;$t++)-1!==(Gt=Ie.indexOf(F[$t]))&&(-1===en||Gt<en)&&(en=Gt);var Ut,Bt;for(-1!==(Bt=-1===en?Ie.lastIndexOf("@"):Ie.lastIndexOf("@",en))&&(Ut=Ie.slice(0,Bt),Ie=Ie.slice(Bt+1),this.auth=decodeURIComponent(Ut)),en=-1,$t=0;$t<R.length;$t++){var Gt;-1!==(Gt=Ie.indexOf(R[$t]))&&(-1===en||Gt<en)&&(en=Gt)}-1===en&&(en=Ie.length),this.host=Ie.slice(0,en),Ie=Ie.slice(en),this.parseHost(),this.hostname=this.hostname||"";var mt="["===this.hostname[0]&&"]"===this.hostname[this.hostname.length-1];if(!mt)for(var Yt=this.hostname.split(/\./),Dt=($t=0,Yt.length);$t<Dt;$t++){var zt=Yt[$t];if(zt&&!zt.match(J)){for(var Yn="",Hr=0,ci=zt.length;Hr<ci;Hr++)zt.charCodeAt(Hr)>127?Yn+="x":Yn+=zt[Hr];if(!Yn.match(J)){var Ir=Yt.slice(0,$t),wr=Yt.slice($t+1),Qr=zt.match(Q);Qr&&(Ir.push(Qr[1]),wr.unshift(Qr[2])),wr.length&&(Ie="/"+wr.join(".")+Ie),this.hostname=Ir.join(".");break}}}this.hostname=this.hostname.length>255?"":this.hostname.toLowerCase(),mt||(this.hostname=r.toASCII(this.hostname)),this.host=(this.hostname||"")+(this.port?":"+this.port:""),this.href+=this.host,mt&&(this.hostname=this.hostname.substr(1,this.hostname.length-2),"/"!==Ie[0]&&(Ie="/"+Ie))}if(!ee[Zt])for($t=0,Dt=M.length;$t<Dt;$t++){var Hn=M[$t];if(-1!==Ie.indexOf(Hn)){var Zr=encodeURIComponent(Hn);Zr===Hn&&(Zr=escape(Hn)),Ie=Ie.split(Hn).join(Zr)}}var Ur=Ie.indexOf("#");-1!==Ur&&(this.hash=Ie.substr(Ur),Ie=Ie.slice(0,Ur));var di=Ie.indexOf("?");return-1!==di?(this.search=Ie.substr(di),this.query=Ie.substr(di+1),Oe&&(this.query=$.parse(this.query)),Ie=Ie.slice(0,di)):Oe&&(this.search="",this.query={}),Ie&&(this.pathname=Ie),ae[Zt]&&this.hostname&&!this.pathname&&(this.pathname="/"),(this.pathname||this.search)&&(this.path=(this.pathname||"")+(this.search||"")),this.href=this.format(),this},p.prototype.format=function(){var me=this.auth||"";me&&(me=(me=encodeURIComponent(me)).replace(/%3A/i,":"),me+="@");var Oe=this.protocol||"",ce=this.pathname||"",dt=this.hash||"",ze=!1,Ye="";this.host?ze=me+this.host:this.hostname&&(ze=me+(-1===this.hostname.indexOf(":")?this.hostname:"["+this.hostname+"]"),this.port&&(ze+=":"+this.port)),this.query&&u.isObject(this.query)&&Object.keys(this.query).length&&(Ye=$.stringify(this.query));var je=this.search||Ye&&"?"+Ye||"";return Oe&&":"!==Oe.substr(-1)&&(Oe+=":"),this.slashes||(!Oe||ae[Oe])&&!1!==ze?(ze="//"+(ze||""),ce&&"/"!==ce.charAt(0)&&(ce="/"+ce)):ze||(ze=""),dt&&"#"!==dt.charAt(0)&&(dt="#"+dt),je&&"?"!==je.charAt(0)&&(je="?"+je),Oe+ze+(ce=ce.replace(/[?#]/g,function(Ie){return encodeURIComponent(Ie)}))+(je=je.replace("#","%23"))+dt},p.prototype.resolve=function(me){return this.resolveObject(se(me,!1,!0)).format()},p.prototype.resolveObject=function(me){if(u.isString(me)){var Oe=new p;Oe.parse(me,!1,!0),me=Oe}for(var ce=new p,dt=Object.keys(this),ze=0;ze<dt.length;ze++){var Ye=dt[ze];ce[Ye]=this[Ye]}if(ce.hash=me.hash,""===me.href)return ce.href=ce.format(),ce;if(me.slashes&&!me.protocol){for(var je=Object.keys(me),Ie=0;Ie<je.length;Ie++){var Ve=je[Ie];"protocol"!==Ve&&(ce[Ve]=me[Ve])}return ae[ce.protocol]&&ce.hostname&&!ce.pathname&&(ce.path=ce.pathname="/"),ce.href=ce.format(),ce}if(me.protocol&&me.protocol!==ce.protocol){if(!ae[me.protocol]){for(var He=Object.keys(me),Zt=0;Zt<He.length;Zt++){var st=He[Zt];ce[st]=me[st]}return ce.href=ce.format(),ce}if(ce.protocol=me.protocol,me.host||ue[me.protocol])ce.pathname=me.pathname;else{for(var Dt=(me.pathname||"").split("/");Dt.length&&!(me.host=Dt.shift()););me.host||(me.host=""),me.hostname||(me.hostname=""),""!==Dt[0]&&Dt.unshift(""),Dt.length<2&&Dt.unshift(""),ce.pathname=Dt.join("/")}return ce.search=me.search,ce.query=me.query,ce.host=me.host||"",ce.auth=me.auth,ce.hostname=me.hostname||me.host,ce.port=me.port,(ce.pathname||ce.search)&&(ce.path=(ce.pathname||"")+(ce.search||"")),ce.slashes=ce.slashes||me.slashes,ce.href=ce.format(),ce}var Gt=ce.pathname&&"/"===ce.pathname.charAt(0),Ut=me.host||me.pathname&&"/"===me.pathname.charAt(0),Bt=Ut||Gt||ce.host&&me.pathname,mt=Bt,Yt=ce.pathname&&ce.pathname.split("/")||[],zt=(Dt=me.pathname&&me.pathname.split("/")||[],ce.protocol&&!ae[ce.protocol]);if(zt&&(ce.hostname="",ce.port=null,ce.host&&(""===Yt[0]?Yt[0]=ce.host:Yt.unshift(ce.host)),ce.host="",me.protocol&&(me.hostname=null,me.port=null,me.host&&(""===Dt[0]?Dt[0]=me.host:Dt.unshift(me.host)),me.host=null),Bt=Bt&&(""===Dt[0]||""===Yt[0])),Ut)ce.host=me.host||""===me.host?me.host:ce.host,ce.hostname=me.hostname||""===me.hostname?me.hostname:ce.hostname,ce.search=me.search,ce.query=me.query,Yt=Dt;else if(Dt.length)Yt||(Yt=[]),Yt.pop(),Yt=Yt.concat(Dt),ce.search=me.search,ce.query=me.query;else if(!u.isNullOrUndefined(me.search))return zt&&(ce.hostname=ce.host=Yt.shift(),(Yn=!!(ce.host&&ce.host.indexOf("@")>0)&&ce.host.split("@"))&&(ce.auth=Yn.shift(),ce.host=ce.hostname=Yn.shift())),ce.search=me.search,ce.query=me.query,(!u.isNull(ce.pathname)||!u.isNull(ce.search))&&(ce.path=(ce.pathname?ce.pathname:"")+(ce.search?ce.search:"")),ce.href=ce.format(),ce;if(!Yt.length)return ce.pathname=null,ce.path=ce.search?"/"+ce.search:null,ce.href=ce.format(),ce;for(var Hr=Yt.slice(-1)[0],ci=(ce.host||me.host||Yt.length>1)&&("."===Hr||".."===Hr)||""===Hr,Ir=0,wr=Yt.length;wr>=0;wr--)"."===(Hr=Yt[wr])?Yt.splice(wr,1):".."===Hr?(Yt.splice(wr,1),Ir++):Ir&&(Yt.splice(wr,1),Ir--);if(!Bt&&!mt)for(;Ir--;Ir)Yt.unshift("..");Bt&&""!==Yt[0]&&(!Yt[0]||"/"!==Yt[0].charAt(0))&&Yt.unshift(""),ci&&"/"!==Yt.join("/").substr(-1)&&Yt.push("");var Yn,Qr=""===Yt[0]||Yt[0]&&"/"===Yt[0].charAt(0);return zt&&(ce.hostname=ce.host=Qr?"":Yt.length?Yt.shift():"",(Yn=!!(ce.host&&ce.host.indexOf("@")>0)&&ce.host.split("@"))&&(ce.auth=Yn.shift(),ce.host=ce.hostname=Yn.shift())),(Bt=Bt||ce.host&&Yt.length)&&!Qr&&Yt.unshift(""),Yt.length?ce.pathname=Yt.join("/"):(ce.pathname=null,ce.path=null),(!u.isNull(ce.pathname)||!u.isNull(ce.search))&&(ce.path=(ce.pathname?ce.pathname:"")+(ce.search?ce.search:"")),ce.auth=me.auth||ce.auth,ce.slashes=ce.slashes||me.slashes,ce.href=ce.format(),ce},p.prototype.parseHost=function(){var me=this.host,Oe=e.exec(me);Oe&&(":"!==(Oe=Oe[0])&&(this.port=Oe.substr(1)),me=me.substr(0,me.length-Oe.length)),me&&(this.hostname=me)}},43745:v=>{"use strict";v.exports={isString:function(S){return"string"==typeof S},isObject:function(S){return"object"==typeof S&&null!==S},isNull:function(S){return null===S},isNullOrUndefined:function(S){return null==S}}},58734:(v,S,i)=>{"use strict";var r=i(88280),f=function(R){return/<\/+[^>]+>/.test(R)},e=function(R){return/<[^>]+\/>/.test(R)};function y(M){return(R=M,R.split(/(<\/?[^>]+>)/g).filter(function(F){return""!==F.trim()})).map(function(F){return{value:F,type:T(F)}});var R}function T(M){return f(M)?"ClosingTag":!function(R){return/<[^>!]+>/.test(R)}(R=M)||f(R)||e(R)?e(M)?"SelfClosingTag":"Text":"OpeningTag";var R}v.exports=function(M){var R=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},F=R.indentor,Z=R.textNodesOnSameLine,J=0,Q=[];F=F||"    ";var ee=y(M).map(function(ue,ae,$){var se=ue.value,ve=ue.type;"ClosingTag"===ve&&J--;var oe=r(F,J),he=oe+se;if("OpeningTag"===ve&&J++,Z){var me=$[ae-1],Oe=$[ae-2];"ClosingTag"===ve&&"Text"===me.type&&"OpeningTag"===Oe.type&&(he=""+oe+Oe.value+me.value+se,Q.push(ae-2,ae-1))}return he});return Q.forEach(function(ue){return ee[ue]=null}),ee.filter(function(ue){return!!ue}).join("\n")}},1653:function(v,S){var i,r,u;r=[],void 0!==(u="function"==typeof(i=function(){"use strict";var p=function(F){return F&&"getComputedStyle"in window&&"smooth"===window.getComputedStyle(F)["scroll-behavior"]};if("undefined"==typeof window||!("document"in window))return{};var f=function(F,Z,J){Z=Z||999,!J&&0!==J&&(J=9);var Q,ee=function(me){Q=me},ue=function(){clearTimeout(Q),ee(0)},ae=function(me){return Math.max(0,F.getTopOf(me)-J)},$=function(me,Oe,ce){if(ue(),0===Oe||Oe&&Oe<0||p(F.body))F.toY(me),ce&&ce();else{var dt=F.getY(),ze=Math.max(0,me)-dt,Ye=(new Date).getTime();Oe=Oe||Math.min(Math.abs(ze),Z),function je(){ee(setTimeout(function(){var Ie=Math.min(1,((new Date).getTime()-Ye)/Oe),Ve=Math.max(0,Math.floor(dt+ze*(Ie<.5?2*Ie*Ie:Ie*(4-2*Ie)-1)));F.toY(Ve),Ie<1&&F.getHeight()+Ve<F.body.scrollHeight?je():(setTimeout(ue,99),ce&&ce())},9))}()}},se=function(me,Oe,ce){$(ae(me),Oe,ce)};return{setup:function(me,Oe){return(0===me||me)&&(Z=me),(0===Oe||Oe)&&(J=Oe),{defaultDuration:Z,edgeOffset:J}},to:se,toY:$,intoView:function(me,Oe,ce){var dt=me.getBoundingClientRect().height,ze=F.getTopOf(me)+dt,Ye=F.getHeight(),je=F.getY(),Ie=je+Ye;ae(me)<je||dt+J>Ye?se(me,Oe,ce):ze+J>Ie?$(ze-Ye+J,Oe,ce):ce&&ce()},center:function(me,Oe,ce,dt){$(Math.max(0,F.getTopOf(me)-F.getHeight()/2+(ce||me.getBoundingClientRect().height/2)),Oe,dt)},stop:ue,moving:function(){return!!Q},getY:F.getY,getTopOf:F.getTopOf}},e=document.documentElement,_=function(){return window.scrollY||e.scrollTop},y=f({body:document.scrollingElement||document.body,toY:function(F){window.scrollTo(0,F)},getY:_,getHeight:function(){return window.innerHeight||e.clientHeight},getTopOf:function(F){return F.getBoundingClientRect().top+_()-e.offsetTop}});if(y.createScroller=function(F,Z,J){return f({body:F,toY:function(Q){F.scrollTop=Q},getY:function(){return F.scrollTop},getHeight:function(){return Math.min(F.clientHeight,window.innerHeight||e.clientHeight)},getTopOf:function(Q){return Q.offsetTop}},Z,J)},"addEventListener"in window&&!window.noZensmooth&&!p(document.body)){var T="history"in window&&"pushState"in history,M=T&&"scrollRestoration"in history;M&&(history.scrollRestoration="auto"),window.addEventListener("load",function(){M&&(setTimeout(function(){history.scrollRestoration="manual"},9),window.addEventListener("popstate",function(F){F.state&&"zenscrollY"in F.state&&y.toY(F.state.zenscrollY)},!1)),window.location.hash&&setTimeout(function(){var F=y.setup().edgeOffset;if(F){var Z=document.getElementById(window.location.href.split("#")[1]);if(Z){var J=Math.max(0,y.getTopOf(Z)-F),Q=y.getY()-J;0<=Q&&Q<9&&window.scrollTo(0,J)}}},9)},!1);var R=new RegExp("(^|\\s)noZensmooth(\\s|$)");window.addEventListener("click",function(F){for(var Z=F.target;Z&&"A"!==Z.tagName;)Z=Z.parentNode;if(!(!Z||1!==F.which||F.shiftKey||F.metaKey||F.ctrlKey||F.altKey)){if(M){var J=history.state&&"object"==typeof history.state?history.state:{};J.zenscrollY=y.getY();try{history.replaceState(J,"")}catch(se){}}var Q=Z.getAttribute("href")||"";if(0===Q.indexOf("#")&&!R.test(Z.className)){var ee=0,ue=document.getElementById(Q.substring(1));if("#"!==Q){if(!ue)return;ee=y.getTopOf(ue)}F.preventDefault();var ae=function(){window.location=Q},$=y.setup().edgeOffset;$&&(ee=Math.max(0,ee-$),T&&(ae=function(){history.pushState({},"",Q)})),y.toY(ee,null,ae)}}},!1)}return y}())?i.apply(S,r):i)&&(v.exports=u)},66265:(v,S,i)=>{"use strict";i.d(S,{B:()=>e});var r=i(12057),u=i(6283),p=i(44466),f=i(74788);let e=(()=>{class _{}return _.\u0275fac=function(T){return new(T||_)},_.\u0275mod=f.oAB({type:_}),_.\u0275inj=f.cJS({imports:[[r.ez,p.m,u.Bz]]}),_})()},98056:(v,S,i)=>{"use strict";i.d(S,{p:()=>ue});var r=i(64762),u=i(58497),p=i(25917),f=i(19773),e=i(93523),_=i(74788);let y=class{constructor($){this.http=$,this.url="api/perf_counters"}list(){return this.http.get(this.url)}get($,se){return this.http.get(`${this.url}/${$}/${se}`).pipe((0,f.zg)(ve=>(0,p.of)(ve.counters)))}};y.\u0275fac=function($){return new($||y)(_.LFG(u.eN))},y.\u0275prov=_.Yz7({token:y,factory:y.\u0275fac,providedIn:"root"}),y=(0,r.gn)([e.o,(0,r.w6)("design:paramtypes",[u.eN])],y);var T=i(12057),M=i(35905),R=i(34501),F=i(66369);const Z=["valueTpl"];function J(ae,$){if(1&ae&&(_._uU(0),_.ALo(1,"dimless")),2&ae){const se=$.row;_.AsE(" ",_.lcZ(1,2,se.value)," ",se.unit," ")}}function Q(ae,$){if(1&ae){const se=_.EpF();_.TgZ(0,"cd-table",2),_.NdJ("fetchData",function(oe){return _.CHM(se),_.oxw().getCounters(oe)}),_.YNc(1,J,2,4,"ng-template",null,3,_.W1O),_.qZA()}if(2&ae){const se=_.oxw();_.Q6J("data",se.counters)("columns",se.columns)("autoSave",!1)}}function ee(ae,$){1&ae&&(_.TgZ(0,"cd-alert-panel",4),_.SDv(1,5),_.qZA())}let ue=(()=>{class ae{constructor(se){this.performanceCounterService=se,this.columns=[],this.counters=[]}ngOnInit(){this.columns=[{name:"Name",prop:"name",flexGrow:1},{name:"Description",prop:"description",flexGrow:1},{name:"Value",prop:"value",cellTemplate:this.valueTpl,flexGrow:1}]}getCounters(se){this.performanceCounterService.get(this.serviceType,this.serviceId).subscribe(ve=>{this.counters=ve},ve=>{404===ve.status?(ve.preventDefault(),this.counters=null):se.error()})}}return ae.\u0275fac=function(se){return new(se||ae)(_.Y36(y))},ae.\u0275cmp=_.Xpm({type:ae,selectors:[["cd-table-performance-counter"]],viewQuery:function(se,ve){if(1&se&&_.Gf(Z,5),2&se){let oe;_.iGM(oe=_.CRH())&&(ve.valueTpl=oe.first)}},inputs:{serviceType:"serviceType",serviceId:"serviceId"},decls:3,vars:2,consts:function(){let $;return $="Performance counters not available",[["columnMode","flex",3,"data","columns","autoSave","fetchData",4,"ngIf","ngIfElse"],["warning",""],["columnMode","flex",3,"data","columns","autoSave","fetchData"],["valueTpl",""],["type","warning"],$]},template:function(se,ve){if(1&se&&(_.YNc(0,Q,3,3,"cd-table",0),_.YNc(1,ee,2,0,"ng-template",null,1,_.W1O)),2&se){const oe=_.MAs(2);_.Q6J("ngIf",ve.counters)("ngIfElse",oe)}},directives:[T.O5,M.a,R.G],pipes:[F.n],styles:[""]}),ae})()},370:(v,S,i)=>{"use strict";i.d(S,{t:()=>y});var r=i(12057),u=i(38549),p=i(37496),f=i(2149),e=i(44466),_=i(74788);let y=(()=>{class T{}return T.\u0275fac=function(R){return new(R||T)},T.\u0275mod=_.oAB({type:T}),T.\u0275inj=_.cJS({imports:[[r.ez,f.t,e.m,u.Oz,p.b]]}),T})()},49671:(v,S,i)=>{"use strict";i.d(S,{j:()=>_});var r=i(23815),u=i.n(r),p=i(370);class f{constructor(T){if(this.type=T,!this.isValidType())throw new Error("Wrong placement group category type");this.setTypeStates()}isValidType(){return f.VALID_CATEGORIES.includes(this.type)}setTypeStates(){switch(this.type){case f.CATEGORY_CLEAN:this.states=["active","clean"];break;case f.CATEGORY_WORKING:this.states=["activating","backfill_wait","backfilling","creating","deep","degraded","forced_backfill","forced_recovery","peering","peered","recovering","recovery_wait","repair","scrubbing","snaptrim","snaptrim_wait"];break;case f.CATEGORY_WARNING:this.states=["backfill_toofull","backfill_unfound","down","incomplete","inconsistent","recovery_toofull","recovery_unfound","remapped","snaptrim_error","stale","undersized"];break;default:this.states=[]}}}f.CATEGORY_CLEAN="clean",f.CATEGORY_WORKING="working",f.CATEGORY_WARNING="warning",f.CATEGORY_UNKNOWN="unknown",f.VALID_CATEGORIES=[f.CATEGORY_CLEAN,f.CATEGORY_WORKING,f.CATEGORY_WARNING,f.CATEGORY_UNKNOWN];var e=i(74788);let _=(()=>{class y{constructor(){this.categories=this.createCategories()}getAllTypes(){return f.VALID_CATEGORIES}getTypeByStates(M){const R=this.getPgStatesFromText(M);if(0===R.length)return f.CATEGORY_UNKNOWN;const F=u().zipObject(f.VALID_CATEGORIES,f.VALID_CATEGORIES.map(J=>u().intersection(this.categories[J].states,R).length));if(F[f.CATEGORY_WARNING]>0)return f.CATEGORY_WARNING;const Z=F[f.CATEGORY_WORKING];return R.length>F[f.CATEGORY_CLEAN]+Z?f.CATEGORY_UNKNOWN:Z?f.CATEGORY_WORKING:f.CATEGORY_CLEAN}createCategories(){return u().zipObject(f.VALID_CATEGORIES,f.VALID_CATEGORIES.map(M=>new f(M)))}getPgStatesFromText(M){const R=M.replace(/[^a-z_]+/g," ").trim().split(" ");return u().uniq(R)}}return y.\u0275fac=function(M){return new(M||y)},y.\u0275prov=e.Yz7({token:y,factory:y.\u0275fac,providedIn:p.t}),y})()},49552:(v,S,i)=>{"use strict";i.r(S),i.d(S,{AuthModule:()=>ln,RoutedAuthModule:()=>cn});var r=i(12057),u=i(24751),p=i(6283),f=i(38549),e=i(37496),_=i(79512),y=i(44466),T=i(23815),M=i.n(T),R=i(35758),F=i(18001),Z=i(93614),J=i(95463),Q=i(77205),ee=i(97161),ue=(()=>((ue||(ue={})).editing="editing",ue))();class ae{}var $=i(74788),se=i(25917),ve=i(19773),oe=i(58497);let he=(()=>{class Ct{constructor(nn){this.http=nn}list(){return this.http.get("api/role")}delete(nn){return this.http.delete(`api/role/${nn}`)}get(nn){return this.http.get(`api/role/${nn}`)}create(nn){return this.http.post("api/role",nn)}clone(nn,Cn){return this.http.post(`api/role/${nn}/clone`,{new_name:Cn})}update(nn){return this.http.put(`api/role/${nn.name}`,nn)}exists(nn){return this.list().pipe((0,ve.zg)(Cn=>{const br=Cn.some(zi=>zi.name===nn);return(0,se.of)(br)}))}}return Ct.\u0275fac=function(nn){return new(nn||Ct)($.LFG(oe.eN))},Ct.\u0275prov=$.Yz7({token:Ct,factory:Ct.\u0275fac,providedIn:"root"}),Ct})(),me=(()=>{class Ct{constructor(nn){this.http=nn}list(){return this.http.get("ui-api/scope")}}return Ct.\u0275fac=function(nn){return new(nn||Ct)($.LFG(oe.eN))},Ct.\u0275prov=$.Yz7({token:Ct,factory:Ct.\u0275fac,providedIn:"root"}),Ct})();var Oe=i(63622),ce=i(41582),dt=i(56310),ze=i(87925),Ye=i(94276),je=i(82945),Ie=i(35905),Ve=i(30839),He=i(10545);const Zt=["headerPermissionCheckboxTpl"],st=["cellScopeCheckboxTpl"],en=["cellPermissionCheckboxTpl"];function $t(Ct,pr){1&Ct&&($.TgZ(0,"span",25),$.SDv(1,26),$.qZA())}function Gt(Ct,pr){1&Ct&&($.TgZ(0,"span",25),$.SDv(1,27),$.qZA())}const Ut=function(Ct){return{required:Ct}};function Bt(Ct,pr){if(1&Ct){const nn=$.EpF();$.TgZ(0,"div",4),$.TgZ(1,"form",5,6),$.TgZ(3,"div",7),$.TgZ(4,"div",8),$.SDv(5,9),$.ALo(6,"titlecase"),$.ALo(7,"upperFirst"),$.qZA(),$.TgZ(8,"div",10),$.TgZ(9,"div",11),$.TgZ(10,"label",12),$.SDv(11,13),$.qZA(),$.TgZ(12,"div",14),$._UZ(13,"input",15),$.YNc(14,$t,2,0,"span",16),$.YNc(15,Gt,2,0,"span",16),$.qZA(),$.qZA(),$.TgZ(16,"div",11),$.TgZ(17,"label",17),$.SDv(18,18),$.qZA(),$.TgZ(19,"div",14),$._UZ(20,"input",19),$.qZA(),$.qZA(),$.TgZ(21,"div",11),$.TgZ(22,"label",20),$.SDv(23,21),$.qZA(),$.TgZ(24,"div",14),$._UZ(25,"cd-table",22),$.qZA(),$.qZA(),$.qZA(),$.TgZ(26,"div",23),$.TgZ(27,"cd-form-button-panel",24),$.NdJ("submitActionEvent",function(){return $.CHM(nn),$.oxw().submit()}),$.ALo(28,"titlecase"),$.ALo(29,"upperFirst"),$.qZA(),$.qZA(),$.qZA(),$.qZA(),$.qZA()}if(2&Ct){const nn=$.MAs(2),Cn=$.oxw();$.xp6(1),$.Q6J("formGroup",Cn.roleForm),$.xp6(6),$.pQV($.lcZ(6,15,Cn.action))($.lcZ(7,17,Cn.resource)),$.QtT(5),$.xp6(3),$.Q6J("ngClass",$.VKq(23,Ut,Cn.mode!==Cn.roleFormMode.editing)),$.xp6(4),$.Q6J("ngIf",Cn.roleForm.showError("name",nn,"required")),$.xp6(1),$.Q6J("ngIf",Cn.roleForm.showError("name",nn,"notUnique")),$.xp6(10),$.Q6J("data",Cn.scopes_permissions)("columns",Cn.columns)("toolHeader",!1)("autoReload",!1)("autoSave",!1)("footer",!1)("limit",0),$.xp6(2),$.Q6J("form",Cn.roleForm)("submitText",$.lcZ(28,19,Cn.action)+" "+$.lcZ(29,21,Cn.resource))}}function mt(Ct,pr){if(1&Ct){const nn=$.EpF();$.TgZ(0,"div",28),$.TgZ(1,"input",29),$.NdJ("change",function(br){const zi=$.CHM(nn),Wo=zi.row,Do=zi.column;return $.oxw().onClickCellCheckbox(Wo.scope,Do.prop,br)}),$.qZA(),$.TgZ(2,"label",30),$._uU(3),$.qZA(),$.qZA()}if(2&Ct){const nn=pr.row,Cn=pr.value,br=$.oxw();$.xp6(1),$.MGl("id","scope_",nn.scope,""),$.Q6J("checked",br.isRowChecked(nn.scope)),$.xp6(1),$.MGl("for","scope_",nn.scope,""),$.xp6(1),$.Oqu(Cn)}}function Yt(Ct,pr){if(1&Ct){const nn=$.EpF();$.TgZ(0,"div",28),$.TgZ(1,"input",31),$.NdJ("change",function(br){const zi=$.CHM(nn),Wo=zi.row,Do=zi.column;return $.oxw().onClickCellCheckbox(Wo.scope,Do.prop,br)}),$.qZA(),$._UZ(2,"label",32),$.qZA()}if(2&Ct){const nn=pr.column,Cn=pr.row,br=pr.value;$.xp6(1),$.Q6J("checked",br)("id",Cn.scope+"-"+nn.prop),$.xp6(1),$.Q6J("for",Cn.scope+"-"+nn.prop)}}function Dt(Ct,pr){if(1&Ct){const nn=$.EpF();$.TgZ(0,"div",28),$.TgZ(1,"input",29),$.NdJ("change",function(br){const Wo=$.CHM(nn).column;return $.oxw().onClickHeaderCheckbox(Wo.prop,br)}),$.qZA(),$.TgZ(2,"label",33),$._uU(3),$.qZA(),$.qZA()}if(2&Ct){const nn=pr.column,Cn=$.oxw();$.xp6(1),$.MGl("id","header_",nn.prop,""),$.Q6J("checked",Cn.isHeaderChecked(nn.prop)),$.xp6(1),$.MGl("for","header_",nn.prop,""),$.xp6(1),$.Oqu(nn.name)}}let zt=(()=>{class Ct extends Z.E{constructor(nn,Cn,br,zi,Wo,Do){super(),this.route=nn,this.router=Cn,this.roleService=br,this.scopeService=zi,this.notificationService=Wo,this.actionLabels=Do,this.scopes=[],this.scopes_permissions=[],this.roleFormMode=ue,this.resource="role",this.createForm(),this.listenToChanges()}createForm(){this.roleForm=new J.d({name:new u.NI("",{validators:[u.kI.required],asyncValidators:[Q.h.unique(this.roleService.exists,this.roleService)]}),description:new u.NI(""),scopes_permissions:new u.NI({})})}ngOnInit(){this.columns=[{prop:"scope",name:"All",flexGrow:2,cellTemplate:this.cellScopeCheckboxTpl,headerTemplate:this.headerPermissionCheckboxTpl},{prop:"read",name:"Read",flexGrow:1,cellClass:"text-center",cellTemplate:this.cellPermissionCheckboxTpl,headerTemplate:this.headerPermissionCheckboxTpl},{prop:"create",name:"Create",flexGrow:1,cellClass:"text-center",cellTemplate:this.cellPermissionCheckboxTpl,headerTemplate:this.headerPermissionCheckboxTpl},{prop:"update",name:"Update",flexGrow:1,cellClass:"text-center",cellTemplate:this.cellPermissionCheckboxTpl,headerTemplate:this.headerPermissionCheckboxTpl},{prop:"delete",name:"Delete",flexGrow:1,cellClass:"text-center",cellTemplate:this.cellPermissionCheckboxTpl,headerTemplate:this.headerPermissionCheckboxTpl}],this.router.url.startsWith("/user-management/roles/edit")?(this.mode=this.roleFormMode.editing,this.action=this.actionLabels.EDIT):this.action=this.actionLabels.CREATE,this.mode===this.roleFormMode.editing?this.initEdit():this.initCreate()}initCreate(){this.scopeService.list().subscribe(nn=>{this.scopes=nn,this.roleForm.get("scopes_permissions").setValue({}),this.loadingReady()})}initEdit(){this.roleForm.get("name").disable(),this.route.params.subscribe(nn=>{const Cn=[];Cn.push(this.scopeService.list()),Cn.push(this.roleService.get(nn.name)),(0,R.D)(Cn).subscribe(br=>{this.scopes=br[0],["name","description","scopes_permissions"].forEach(zi=>this.roleForm.get(zi).setValue(br[1][zi])),this.loadingReady()})})}listenToChanges(){this.roleForm.get("scopes_permissions").valueChanges.subscribe(nn=>{const Cn=[];M().each(this.scopes,br=>{const zi={read:!1,create:!1,update:!1,delete:!1};zi.scope=br,br in nn&&M().each(nn[br],Wo=>{zi[Wo]=!0}),Cn.push(zi)}),this.scopes_permissions=Cn})}isRowChecked(nn){const Cn=M().find(this.scopes_permissions,br=>br.scope===nn);return!M().isUndefined(Cn)&&Cn.read&&Cn.create&&Cn.update&&Cn.delete}isHeaderChecked(nn){let Cn=[nn];return"scope"===nn&&(Cn=["read","create","update","delete"]),Cn.every(br=>this.scopes_permissions.every(zi=>zi[br]))}onClickCellCheckbox(nn,Cn,br=null){const zi=M().cloneDeep(this.roleForm.getValue("scopes_permissions"));let Wo=[Cn];"scope"===Cn&&(Wo=["read","create","update","delete"]),nn in zi||(zi[nn]=[]),br&&br.target.checked||!M().isEqual(Wo.sort(),M().intersection(zi[nn],Wo).sort())?zi[nn]=M().union(zi[nn],Wo):(zi[nn]=M().difference(zi[nn],Wo),M().isEmpty(zi[nn])&&M().unset(zi,nn)),this.roleForm.get("scopes_permissions").setValue(zi)}onClickHeaderCheckbox(nn,Cn){const br=M().cloneDeep(this.roleForm.getValue("scopes_permissions"));let zi=[nn];"scope"===nn&&(zi=["read","create","update","delete"]),M().each(zi,Wo=>{M().each(this.scopes,Do=>{Cn.target.checked?br[Do]=M().union(br[Do],[Wo]):(br[Do]=M().difference(br[Do],[Wo]),M().isEmpty(br[Do])&&M().unset(br,Do))})}),this.roleForm.get("scopes_permissions").setValue(br)}getRequest(){const nn=new ae;return["name","description","scopes_permissions"].forEach(Cn=>nn[Cn]=this.roleForm.get(Cn).value),nn}createAction(){const nn=this.getRequest();this.roleService.create(nn).subscribe(()=>{this.notificationService.show(F.k.success,"Created role '" + nn.name + "'"),this.router.navigate(["/user-management/roles"])},()=>{this.roleForm.setErrors({cdSubmitButton:!0})})}editAction(){const nn=this.getRequest();this.roleService.update(nn).subscribe(()=>{this.notificationService.show(F.k.success,"Updated role '" + nn.name + "'"),this.router.navigate(["/user-management/roles"])},()=>{this.roleForm.setErrors({cdSubmitButton:!0})})}submit(){this.mode===this.roleFormMode.editing?this.editAction():this.createAction()}}return Ct.\u0275fac=function(nn){return new(nn||Ct)($.Y36(p.gz),$.Y36(p.F0),$.Y36(he),$.Y36(me),$.Y36(ee.g),$.Y36(_.p4))},Ct.\u0275cmp=$.Xpm({type:Ct,selectors:[["cd-role-form"]],viewQuery:function(nn,Cn){if(1&nn&&($.Gf(Zt,7),$.Gf(st,7),$.Gf(en,7)),2&nn){let br;$.iGM(br=$.CRH())&&(Cn.headerPermissionCheckboxTpl=br.first),$.iGM(br=$.CRH())&&(Cn.cellScopeCheckboxTpl=br.first),$.iGM(br=$.CRH())&&(Cn.cellPermissionCheckboxTpl=br.first)}},features:[$.qOj],decls:7,vars:1,consts:function(){let pr,nn,Cn,br,zi,Wo,Do,Js;return pr="" + "\ufffd0\ufffd" + " " + "\ufffd1\ufffd" + "",nn="Name",Cn="Name...",br="Description",zi="Description...",Wo="Permissions",Do="This field is required.",Js="The chosen name is already in use.",[["class","cd-col-form",4,"cdFormLoading"],["cellScopeCheckboxTpl",""],["cellPermissionCheckboxTpl",""],["headerPermissionCheckboxTpl",""],[1,"cd-col-form"],["name","roleForm","novalidate","",3,"formGroup"],["formDir","ngForm"],[1,"card"],[1,"card-header"],pr,[1,"card-body"],[1,"form-group","row"],["for","name",1,"cd-col-form-label",3,"ngClass"],nn,[1,"cd-col-form-input"],["type","text","placeholder",Cn,"id","name","name","name","formControlName","name","autofocus","",1,"form-control"],["class","invalid-feedback",4,"ngIf"],["for","description",1,"cd-col-form-label"],br,["type","text","placeholder",zi,"id","description","name","description","formControlName","description",1,"form-control"],[1,"cd-col-form-label"],Wo,["columnMode","flex",3,"data","columns","toolHeader","autoReload","autoSave","footer","limit"],[1,"card-footer"],["wrappingClass","text-right",3,"form","submitText","submitActionEvent"],[1,"invalid-feedback"],Do,Js,[1,"custom-control","custom-checkbox"],["type","checkbox",1,"custom-control-input",3,"id","checked","change"],[1,"datatable-permissions-scope-cell-label","custom-control-label",3,"for"],["type","checkbox",1,"custom-control-input",3,"checked","id","change"],[1,"custom-control-label",3,"for"],[1,"datatable-permissions-header-cell-label","custom-control-label",3,"for"]]},template:function(nn,Cn){1&nn&&($.YNc(0,Bt,30,25,"div",0),$.YNc(1,mt,4,4,"ng-template",null,1,$.W1O),$.YNc(3,Yt,3,3,"ng-template",null,2,$.W1O),$.YNc(5,Dt,4,4,"ng-template",null,3,$.W1O)),2&nn&&$.Q6J("cdFormLoading",Cn.loading)},directives:[Oe.y,u._Y,u.JL,u.sg,ce.V,dt.P,r.mk,ze.o,u.Fj,Ye.b,u.JJ,u.u,je.U,r.O5,Ie.a,Ve.p],pipes:[r.rS,He.m],styles:[".datatable-permissions-header-cell-label[_ngcontent-%COMP%], .datatable-permissions-scope-cell-label[_ngcontent-%COMP%]{font-weight:bold}"]}),Ct})();var Yn=i(68136),Hr=i(30982),ci=i(65683),Ir=i(99466),wr=i(65862),Qr=i(68774),Kr=i(41039),In=i(51847),Hn=i(74937),Zr=i(63285);let Ur=(()=>{class Ct{constructor(nn){this.router=nn}}return Ct.\u0275fac=function(nn){return new(nn||Ct)($.Y36(p.F0))},Ct.\u0275cmp=$.Xpm({type:Ct,selectors:[["cd-user-tabs"]],decls:8,vars:1,consts:function(){let pr,nn;return pr="Users",nn="Roles",[["ngbNav","",1,"nav-tabs",3,"activeId","navChange"],["nav","ngbNav"],["ngbNavItem","/user-management/users"],["ngbNavLink",""],pr,["ngbNavItem","/user-management/roles"],nn]},template:function(nn,Cn){1&nn&&($.TgZ(0,"ul",0,1),$.NdJ("navChange",function(zi){return Cn.router.navigate([zi.nextId])}),$.TgZ(2,"li",2),$.TgZ(3,"a",3),$.SDv(4,4),$.qZA(),$.qZA(),$.TgZ(5,"li",5),$.TgZ(6,"a",3),$.SDv(7,6),$.qZA(),$.qZA(),$.qZA()),2&nn&&$.Q6J("activeId",Cn.router.url)},directives:[f.Pz,f.nv,f.Vx],styles:[""]}),Ct})();var di=i(94928);function $i(Ct,pr){if(1&Ct&&($.ynx(0),$._UZ(1,"cd-table",1),$.BQk()),2&Ct){const nn=$.oxw();$.xp6(1),$.Q6J("data",nn.scopes_permissions)("columns",nn.columns)("toolHeader",!1)("autoReload",!1)("autoSave",!1)("footer",!1)("limit",0)}}let Hi=(()=>{class Ct{constructor(){this.scopes_permissions=[]}ngOnInit(){this.columns=[{prop:"scope",name:"Scope",flexGrow:2},{prop:"read",name:"Read",flexGrow:1,cellClass:"text-center",cellTransformation:Ir.e.checkIcon},{prop:"create",name:"Create",flexGrow:1,cellClass:"text-center",cellTransformation:Ir.e.checkIcon},{prop:"update",name:"Update",flexGrow:1,cellClass:"text-center",cellTransformation:Ir.e.checkIcon},{prop:"delete",name:"Delete",flexGrow:1,cellClass:"text-center",cellTransformation:Ir.e.checkIcon}]}ngOnChanges(){if(this.selection){this.selectedItem=this.selection;const nn=[];M().each(this.scopes,Cn=>{const br={read:!1,create:!1,update:!1,delete:!1};br.scope=Cn,Cn in this.selectedItem.scopes_permissions&&M().each(this.selectedItem.scopes_permissions[Cn],zi=>{br[zi]=!0}),nn.push(br)}),this.scopes_permissions=nn}}}return Ct.\u0275fac=function(nn){return new(nn||Ct)},Ct.\u0275cmp=$.Xpm({type:Ct,selectors:[["cd-role-details"]],inputs:{selection:"selection",scopes:"scopes"},features:[$.TTD],decls:1,vars:1,consts:[[4,"ngIf"],["columnMode","flex",3,"data","columns","toolHeader","autoReload","autoSave","footer","limit"]],template:function(nn,Cn){1&nn&&$.YNc(0,$i,2,7,"ng-container",0),2&nn&&$.Q6J("ngIf",Cn.selection)},directives:[r.O5,Ie.a],styles:[".fa[_ngcontent-%COMP%]{font-size:large}.fa.fa-square-o[_ngcontent-%COMP%]{color:#ced4da}"]}),Ct})(),On=(()=>{class Ct extends Yn.o{constructor(nn,Cn,br,zi,Wo,Do,Js,_s){super(),this.roleService=nn,this.scopeService=Cn,this.emptyPipe=br,this.authStorageService=zi,this.modalService=Wo,this.notificationService=Do,this.urlBuilder=Js,this.actionLabels=_s,this.selection=new Qr.r,this.permission=this.authStorageService.getPermissions().user,this.tableActions=[{permission:"create",icon:wr.P.add,routerLink:()=>this.urlBuilder.getCreate(),name:this.actionLabels.CREATE},{permission:"create",icon:wr.P.clone,name:this.actionLabels.CLONE,disable:()=>!this.selection.hasSingleSelection,click:()=>this.cloneRole()},{permission:"update",icon:wr.P.edit,disable:()=>!this.selection.hasSingleSelection||this.selection.first().system,routerLink:()=>this.selection.first()&&this.urlBuilder.getEdit(this.selection.first().name),name:this.actionLabels.EDIT},{permission:"delete",icon:wr.P.destroy,disable:()=>!this.selection.hasSingleSelection||this.selection.first().system,click:()=>this.deleteRoleModal(),name:this.actionLabels.DELETE}]}ngOnInit(){this.columns=[{name:"Name",prop:"name",flexGrow:3},{name:"Description",prop:"description",flexGrow:5,pipe:this.emptyPipe},{name:"System Role",prop:"system",cellClass:"text-center",flexGrow:1,cellTransformation:Ir.e.checkIcon}]}getRoles(){(0,R.D)([this.roleService.list(),this.scopeService.list()]).subscribe(nn=>{this.roles=nn[0],this.scopes=nn[1]})}updateSelection(nn){this.selection=nn}deleteRole(nn){this.roleService.delete(nn).subscribe(()=>{this.getRoles(),this.modalRef.close(),this.notificationService.show(F.k.success,"Deleted role '" + nn + "'")},()=>{this.modalRef.componentInstance.stopLoadingSpinner()})}deleteRoleModal(){const nn=this.selection.first().name;this.modalRef=this.modalService.show(Hr.M,{itemDescription:"Role",itemNames:[nn],submitAction:()=>this.deleteRole(nn)})}cloneRole(){const nn=this.selection.first().name;this.modalRef=this.modalService.show(ci.X,{fields:[{type:"text",name:"newName",value:`${nn}_clone`,label:"New name",required:!0}],titleText:"Clone Role",submitButtonText:"Clone Role",onSubmit:Cn=>{this.roleService.clone(nn,Cn.newName).subscribe(()=>{this.getRoles(),this.notificationService.show(F.k.success,"Cloned role '" + Cn.newName + "' from '" + nn + "'")})}})}}return Ct.\u0275fac=function(nn){return new(nn||Ct)($.Y36(he),$.Y36(me),$.Y36(Kr.W),$.Y36(Hn.j),$.Y36(Zr.Z),$.Y36(ee.g),$.Y36(In.F),$.Y36(_.p4))},Ct.\u0275cmp=$.Xpm({type:Ct,selectors:[["cd-role-list"]],features:[$._Bn([{provide:In.F,useValue:new In.F("user-management/roles")}]),$.qOj],decls:4,vars:8,consts:[["columnMode","flex","identifier","name","selectionType","single",3,"data","columns","hasDetails","setExpandedRow","fetchData","updateSelection"],[1,"table-actions",3,"permission","selection","tableActions"],["cdTableDetail","",3,"selection","scopes"]],template:function(nn,Cn){1&nn&&($._UZ(0,"cd-user-tabs"),$.TgZ(1,"cd-table",0),$.NdJ("setExpandedRow",function(zi){return Cn.setExpandedRow(zi)})("fetchData",function(){return Cn.getRoles()})("updateSelection",function(zi){return Cn.updateSelection(zi)}),$._UZ(2,"cd-table-actions",1),$._UZ(3,"cd-role-details",2),$.qZA()),2&nn&&($.xp6(1),$.Q6J("data",Cn.roles)("columns",Cn.columns)("hasDetails",!0),$.xp6(1),$.Q6J("permission",Cn.permission)("selection",Cn.selection)("tableActions",Cn.tableActions),$.xp6(1),$.Q6J("selection",Cn.expandedRow)("scopes",Cn.scopes))},directives:[Ur,Ie.a,di.K,Hi],styles:[""]}),Ct})();var Wt=i(16738),Jn=i.n(Wt),ir=i(39219),Lr=i(9837),Vn=i(36169),zr=i(7022),hi=i(51907),Ai=i(33888),Tr=(()=>((Tr||(Tr={})).editing="editing",Tr))();class Nr{}var gn=i(32057),En=i(62862),mr=i(4416),Xt=i(18372),zn=i(60192),vr=i(52266);const si=["removeSelfUserReadUpdatePermissionTpl"];function Ii(Ct,pr){1&Ct&&($.TgZ(0,"span",28),$.SDv(1,29),$.qZA())}function no(Ct,pr){1&Ct&&($.TgZ(0,"span",28),$.SDv(1,30),$.qZA())}function so(Ct,pr){if(1&Ct&&$._UZ(0,"cd-helper",40),2&Ct){const nn=$.oxw(3);$.s9C("html",nn.passwordPolicyHelpText)}}function Ze(Ct,pr){1&Ct&&($.TgZ(0,"span",28),$.SDv(1,41),$.qZA())}function Dr(Ct,pr){if(1&Ct&&($.TgZ(0,"span",28),$._uU(1),$.qZA()),2&Ct){const nn=$.oxw(3);$.xp6(1),$.hij(" ",nn.passwordValuation," ")}}function jt(Ct,pr){if(1&Ct&&($.TgZ(0,"div",10),$.TgZ(1,"label",31),$.ynx(2),$.SDv(3,32),$.BQk(),$.YNc(4,so,1,1,"cd-helper",33),$.qZA(),$.TgZ(5,"div",13),$.TgZ(6,"div",34),$._UZ(7,"input",35),$.TgZ(8,"span",36),$._UZ(9,"button",37),$.qZA(),$.qZA(),$.TgZ(10,"div",38),$._UZ(11,"div",39),$.qZA(),$.YNc(12,Ze,2,0,"span",15),$.YNc(13,Dr,2,1,"span",15),$.qZA(),$.qZA()),2&Ct){$.oxw();const nn=$.MAs(2),Cn=$.oxw();$.xp6(4),$.Q6J("ngIf",Cn.passwordPolicyHelpText.length>0),$.xp6(7),$.Tol(Cn.passwordStrengthLevelClass),$.s9C("title",Cn.passwordValuation),$.xp6(1),$.Q6J("ngIf",Cn.userForm.showError("password",nn,"required")),$.xp6(1),$.Q6J("ngIf",Cn.userForm.showError("password",nn,"passwordPolicy"))}}function xt(Ct,pr){1&Ct&&($.TgZ(0,"span",28),$.SDv(1,46),$.qZA())}function mn(Ct,pr){1&Ct&&($.TgZ(0,"span",28),$.SDv(1,47),$.qZA())}function Wn(Ct,pr){if(1&Ct&&($.TgZ(0,"div",10),$.TgZ(1,"label",42),$.SDv(2,43),$.qZA(),$.TgZ(3,"div",13),$.TgZ(4,"div",34),$._UZ(5,"input",44),$.TgZ(6,"span",36),$._UZ(7,"button",45),$.qZA(),$.YNc(8,xt,2,0,"span",15),$.qZA(),$.YNc(9,mn,2,0,"span",15),$.qZA(),$.qZA()),2&Ct){$.oxw();const nn=$.MAs(2),Cn=$.oxw();$.xp6(8),$.Q6J("ngIf",Cn.userForm.showError("confirmpassword",nn,"match")),$.xp6(1),$.Q6J("ngIf",Cn.userForm.showError("confirmpassword",nn,"required"))}}function kn(Ct,pr){1&Ct&&($.TgZ(0,"cd-helper",54),$.TgZ(1,"p"),$._uU(2," The Dashboard setting defining the expiration interval of passwords is currently set to "),$.TgZ(3,"strong"),$._uU(4,"0"),$.qZA(),$._uU(5,". This means if a date is set, the user password will only expire once. "),$.qZA(),$.TgZ(6,"p"),$._uU(7," Consider configuring the Dashboard setting "),$.TgZ(8,"a",55),$._uU(9,"USER_PWD_EXPIRATION_SPAN"),$.qZA(),$._uU(10," in order to let passwords expire periodically. "),$.qZA(),$.qZA())}function wn(Ct,pr){1&Ct&&($.TgZ(0,"span",28),$.SDv(1,56),$.qZA())}const nr=function(Ct){return{required:Ct}};function Gi(Ct,pr){if(1&Ct){const nn=$.EpF();$.TgZ(0,"div",10),$.TgZ(1,"label",48),$.ynx(2),$.SDv(3,49),$.BQk(),$.YNc(4,kn,11,0,"cd-helper",50),$.qZA(),$.TgZ(5,"div",13),$.TgZ(6,"div",34),$.TgZ(7,"input",51,52),$.NdJ("click",function(){return $.CHM(nn),$.MAs(8).open()})("keypress",function(){return $.CHM(nn),$.MAs(8).close()}),$.qZA(),$.TgZ(9,"span",36),$.TgZ(10,"button",53),$.NdJ("click",function(){return $.CHM(nn),$.oxw(2).clearExpirationDate()}),$._UZ(11,"i"),$.qZA(),$.qZA(),$.YNc(12,wn,2,0,"span",15),$.qZA(),$.qZA(),$.qZA()}if(2&Ct){$.oxw();const nn=$.MAs(2),Cn=$.oxw(),br=$.MAs(4);$.xp6(1),$.Q6J("ngClass",$.VKq(7,nr,Cn.pwdExpirationSettings.pwdExpirationSpan>0)),$.xp6(3),$.Q6J("ngIf",0==Cn.pwdExpirationSettings.pwdExpirationSpan),$.xp6(3),$.Q6J("ngbPopover",br),$.xp6(4),$.Gre("icon-prepend ",Cn.icons.destroy,""),$.xp6(1),$.Q6J("ngIf",Cn.userForm.showError("pwdExpirationDate",nn,"required"))}}function po(Ct,pr){1&Ct&&($.TgZ(0,"span",28),$.SDv(1,57),$.qZA())}function yo(Ct,pr){if(1&Ct&&($.TgZ(0,"span",58),$._UZ(1,"cd-select-badges",59),$.qZA()),2&Ct){const nn=$.oxw(2);$.xp6(1),$.Q6J("data",nn.userForm.controls.roles.value)("options",nn.allRoles)("messages",nn.messages)}}function Mo(Ct,pr){1&Ct&&($.TgZ(0,"div",10),$.TgZ(1,"div",60),$.TgZ(2,"div",61),$._UZ(3,"input",62),$.TgZ(4,"label",63),$.SDv(5,64),$.qZA(),$.qZA(),$.qZA(),$.qZA())}function Vi(Ct,pr){1&Ct&&($.TgZ(0,"div",10),$.TgZ(1,"div",60),$.TgZ(2,"div",61),$._UZ(3,"input",65),$.TgZ(4,"label",66),$.SDv(5,67),$.qZA(),$.qZA(),$.qZA(),$.qZA())}function cs(Ct,pr){if(1&Ct){const nn=$.EpF();$.TgZ(0,"div",3),$.TgZ(1,"form",4,5),$.TgZ(3,"div",6),$.TgZ(4,"div",7),$.SDv(5,8),$.ALo(6,"titlecase"),$.ALo(7,"upperFirst"),$.qZA(),$.TgZ(8,"div",9),$.TgZ(9,"div",10),$.TgZ(10,"label",11),$.SDv(11,12),$.qZA(),$.TgZ(12,"div",13),$._UZ(13,"input",14),$.YNc(14,Ii,2,0,"span",15),$.YNc(15,no,2,0,"span",15),$.qZA(),$.qZA(),$.YNc(16,jt,14,7,"div",16),$.YNc(17,Wn,10,2,"div",16),$.YNc(18,Gi,13,9,"div",16),$.TgZ(19,"div",10),$.TgZ(20,"label",17),$.SDv(21,18),$.qZA(),$.TgZ(22,"div",13),$._UZ(23,"input",19),$.qZA(),$.qZA(),$.TgZ(24,"div",10),$.TgZ(25,"label",20),$.SDv(26,21),$.qZA(),$.TgZ(27,"div",13),$._UZ(28,"input",22),$.YNc(29,po,2,0,"span",15),$.qZA(),$.qZA(),$.TgZ(30,"div",10),$.TgZ(31,"label",23),$.SDv(32,24),$.qZA(),$.TgZ(33,"div",13),$.YNc(34,yo,2,3,"span",25),$.qZA(),$.qZA(),$.YNc(35,Mo,6,0,"div",16),$.YNc(36,Vi,6,0,"div",16),$.qZA(),$.TgZ(37,"div",26),$.TgZ(38,"cd-form-button-panel",27),$.NdJ("submitActionEvent",function(){return $.CHM(nn),$.oxw().submit()}),$.ALo(39,"titlecase"),$.ALo(40,"upperFirst"),$.qZA(),$.qZA(),$.qZA(),$.qZA(),$.qZA()}if(2&Ct){const nn=$.MAs(2),Cn=$.oxw();$.xp6(1),$.Q6J("formGroup",Cn.userForm),$.xp6(6),$.pQV($.lcZ(6,15,Cn.action))($.lcZ(7,17,Cn.resource)),$.QtT(5),$.xp6(3),$.Q6J("ngClass",$.VKq(23,nr,Cn.mode!==Cn.userFormMode.editing)),$.xp6(4),$.Q6J("ngIf",Cn.userForm.showError("username",nn,"required")),$.xp6(1),$.Q6J("ngIf",Cn.userForm.showError("username",nn,"notUnique")),$.xp6(1),$.Q6J("ngIf",!Cn.authStorageService.isSSO()),$.xp6(1),$.Q6J("ngIf",!Cn.authStorageService.isSSO()),$.xp6(1),$.Q6J("ngIf",!Cn.authStorageService.isSSO()),$.xp6(11),$.Q6J("ngIf",Cn.userForm.showError("email",nn,"email")),$.xp6(5),$.Q6J("ngIf",Cn.allRoles),$.xp6(1),$.Q6J("ngIf",!Cn.isCurrentUser()),$.xp6(1),$.Q6J("ngIf",!Cn.isCurrentUser()&&!Cn.authStorageService.isSSO()),$.xp6(2),$.Q6J("form",Cn.userForm)("submitText",$.lcZ(39,19,Cn.action)+" "+$.lcZ(40,21,Cn.resource))}}function zo(Ct,pr){1&Ct&&($.TgZ(0,"p"),$.TgZ(1,"strong"),$.SDv(2,68),$.qZA(),$.qZA(),$._UZ(3,"br"),$.TgZ(4,"p"),$.SDv(5,69),$.qZA(),$.ynx(6),$.SDv(7,70),$.BQk())}function So(Ct,pr){if(1&Ct&&$._UZ(0,"cd-date-time-picker",71),2&Ct){const nn=$.oxw();$.Q6J("control",nn.userForm.get("pwdExpirationDate"))("hasTime",!1)}}let Si=(()=>{class Ct extends Z.E{constructor(nn,Cn,br,zi,Wo,Do,Js,_s,bs,qo,ra,Ia){super(),this.authService=nn,this.authStorageService=Cn,this.route=br,this.router=zi,this.modalService=Wo,this.roleService=Do,this.userService=Js,this.notificationService=_s,this.actionLabels=bs,this.passwordPolicyService=qo,this.formBuilder=ra,this.settingsService=Ia,this.userFormMode=Tr,this.messages=new zr.a({empty:"There are no roles."}),this.passwordPolicyHelpText="",this.icons=wr.P,this.pwdExpirationFormat="YYYY-MM-DD",this.resource="user",this.createForm(),this.messages=new zr.a({empty:"There are no roles."})}createForm(){this.passwordPolicyService.getHelpText().subscribe(nn=>{this.passwordPolicyHelpText=nn}),this.userForm=this.formBuilder.group({username:["",[u.kI.required],[Q.h.unique(this.userService.validateUserName,this.userService)]],name:[""],password:["",[],[Q.h.passwordPolicy(this.userService,()=>this.userForm.getValue("username"),(nn,Cn,br)=>{this.passwordStrengthLevelClass=this.passwordPolicyService.mapCreditsToCssClass(Cn),this.passwordValuation=M().defaultTo(br,"")})]],confirmpassword:[""],pwdExpirationDate:[void 0],email:["",[Q.h.email]],roles:[[]],enabled:[!0,[u.kI.required]],pwdUpdateRequired:[!0]},{validators:[Q.h.match("password","confirmpassword")]})}ngOnInit(){this.router.url.startsWith("/user-management/users/edit")?(this.mode=this.userFormMode.editing,this.action=this.actionLabels.EDIT):this.action=this.actionLabels.CREATE;const nn=[this.roleService.list(),this.settingsService.getStandardSettings()];(0,R.D)(nn).subscribe(Cn=>{if(this.allRoles=M().map(Cn[0],br=>(br.enabled=!0,br)),this.pwdExpirationSettings=new hi.G(Cn[1]),this.mode===this.userFormMode.editing)this.initEdit();else{if(this.pwdExpirationSettings.pwdExpirationSpan>0){const br=this.userForm.get("pwdExpirationDate"),zi=Jn()();zi.add(this.pwdExpirationSettings.pwdExpirationSpan,"day"),br.setValue(zi.format(this.pwdExpirationFormat)),br.setValidators([u.kI.required])}this.loadingReady()}})}initEdit(){this.disableForEdit(),this.route.params.subscribe(nn=>{this.userService.get(nn.username).subscribe(br=>{this.response=M().cloneDeep(br),this.setResponse(br),this.loadingReady()})})}disableForEdit(){this.userForm.get("username").disable()}setResponse(nn){["username","name","email","roles","enabled","pwdUpdateRequired"].forEach(br=>this.userForm.get(br).setValue(nn[br]));const Cn=nn.pwdExpirationDate;Cn&&this.userForm.get("pwdExpirationDate").setValue(Jn()(1e3*Cn).format(this.pwdExpirationFormat))}getRequest(){const nn=new Nr;["username","password","name","email","roles","enabled","pwdUpdateRequired"].forEach(br=>nn[br]=this.userForm.get(br).value);const Cn=this.userForm.get("pwdExpirationDate").value;if(Cn){const br=Jn()(Cn,this.pwdExpirationFormat);(this.mode!==this.userFormMode.editing||this.response.pwdExpirationDate!==br.unix())&&br.set({hour:23,minute:59,second:59}),nn.pwdExpirationDate=br.unix()}return nn}createAction(){const nn=this.getRequest();this.userService.create(nn).subscribe(()=>{this.notificationService.show(F.k.success,"Created user '" + nn.username + "'"),this.router.navigate(["/user-management/users"])},()=>{this.userForm.setErrors({cdSubmitButton:!0})})}editAction(){if(this.isUserRemovingNeededRolePermissions()){const nn={titleText:"Update user",buttonText:"Continue",bodyTpl:this.removeSelfUserReadUpdatePermissionTpl,onSubmit:()=>{this.modalRef.close(),this.doEditAction()},onCancel:()=>{this.userForm.setErrors({cdSubmitButton:!0}),this.userForm.get("roles").reset(this.userForm.get("roles").value)}};this.modalRef=this.modalService.show(Vn.Y,nn)}else this.doEditAction()}isCurrentUser(){return this.authStorageService.getUsername()===this.userForm.getValue("username")}isUserChangingRoles(){return this.isCurrentUser()&&this.response&&!M().isEqual(this.response.roles,this.userForm.getValue("roles"))}isUserRemovingNeededRolePermissions(){return this.isCurrentUser()&&!this.hasUserReadUpdatePermissions(this.userForm.getValue("roles"))}hasUserReadUpdatePermissions(nn=[]){for(const Cn of this.allRoles)if(-1!==nn.indexOf(Cn.name)&&Cn.scopes_permissions.user){const br=Cn.scopes_permissions.user;return["read","update"].every(zi=>-1!==br.indexOf(zi))}return!1}doEditAction(){const nn=this.getRequest();this.userService.update(nn).subscribe(()=>{this.isUserChangingRoles()?this.authService.logout(()=>{this.notificationService.show(F.k.info,"You were automatically logged out because your roles have been changed.")}):(this.notificationService.show(F.k.success,"Updated user '" + nn.username + "'"),this.router.navigate(["/user-management/users"]))},()=>{this.userForm.setErrors({cdSubmitButton:!0})})}clearExpirationDate(){this.userForm.get("pwdExpirationDate").setValue(void 0)}submit(){this.mode===this.userFormMode.editing?this.editAction():this.createAction()}}return Ct.\u0275fac=function(nn){return new(nn||Ct)($.Y36(ir.e),$.Y36(Hn.j),$.Y36(p.gz),$.Y36(p.F0),$.Y36(Zr.Z),$.Y36(he),$.Y36(gn.K),$.Y36(ee.g),$.Y36(_.p4),$.Y36(Ai.q),$.Y36(En.O),$.Y36(Lr.g))},Ct.\u0275cmp=$.Xpm({type:Ct,selectors:[["cd-user-form"]],viewQuery:function(nn,Cn){if(1&nn&&$.Gf(si,7),2&nn){let br;$.iGM(br=$.CRH())&&(Cn.removeSelfUserReadUpdatePermissionTpl=br.first)}},features:[$.qOj],decls:5,vars:1,consts:function(){let pr,nn,Cn,br,zi,Wo,Do,Js,_s,bs,qo,ra,Ia,pa,Bs,Yl,yl,fo,Da,Ao,ls;return pr="" + "\ufffd0\ufffd" + " " + "\ufffd1\ufffd" + "",nn="Username",Cn="Full name",br="Email",zi="Roles",Wo="This field is required.",Do="The username already exists.",Js="Password",_s="This field is required.",bs="Confirm password",qo="Password confirmation doesn't match the password.",ra="This field is required.",Ia="Password expiration date",pa="Password expiration date...",Bs="This field is required.",Yl="Invalid email.",yl="Enabled",fo="User must change password at next logon",Da="You are about to remove \"user read / update\" permissions from your own user.",Ao="If you continue, you will no longer be able to add or remove roles from any user.",ls="Are you sure you want to continue?",[["class","cd-col-form",4,"cdFormLoading"],["removeSelfUserReadUpdatePermissionTpl",""],["popContent",""],[1,"cd-col-form"],["name","userForm","novalidate","",3,"formGroup"],["formDir","ngForm"],[1,"card"],[1,"card-header"],pr,[1,"card-body"],[1,"form-group","row"],["for","username",1,"cd-col-form-label",3,"ngClass"],nn,[1,"cd-col-form-input"],["type","text","placeholder","Username...","id","username","name","username","formControlName","username","autocomplete","off","autofocus","",1,"form-control"],["class","invalid-feedback",4,"ngIf"],["class","form-group row",4,"ngIf"],["for","name",1,"cd-col-form-label"],Cn,["type","text","placeholder","Full name...","id","name","name","name","formControlName","name",1,"form-control"],["for","email",1,"cd-col-form-label"],br,["type","email","placeholder","Email...","id","email","name","email","formControlName","email",1,"form-control"],[1,"cd-col-form-label"],zi,["class","no-border full-height",4,"ngIf"],[1,"card-footer"],["wrappingClass","text-right",3,"form","submitText","submitActionEvent"],[1,"invalid-feedback"],Wo,Do,["for","password",1,"cd-col-form-label"],Js,["class","text-pre-wrap",3,"html",4,"ngIf"],[1,"input-group"],["type","password","placeholder","Password...","id","password","name","password","autocomplete","new-password","formControlName","password",1,"form-control"],[1,"input-group-append"],["type","button","cdPasswordButton","password",1,"btn","btn-light"],[1,"password-strength-level"],["data-toggle","tooltip",3,"title"],[1,"text-pre-wrap",3,"html"],_s,["for","confirmpassword",1,"cd-col-form-label"],bs,["type","password","placeholder","Confirm password...","id","confirmpassword","name","confirmpassword","autocomplete","new-password","formControlName","confirmpassword",1,"form-control"],["type","button","cdPasswordButton","confirmpassword",1,"btn","btn-light"],qo,ra,["for","pwdExpirationDate",1,"cd-col-form-label",3,"ngClass"],Ia,["class","text-pre-wrap",4,"ngIf"],["placeholder",pa,"id","pwdExpirationDate","name","pwdExpirationDate","formControlName","pwdExpirationDate","triggers","manual",1,"form-control",3,"ngbPopover","click","keypress"],["p","ngbPopover"],["type","button",1,"btn","btn-light",3,"click"],[1,"text-pre-wrap"],["routerLink","/mgr-modules/edit/dashboard",1,"alert-link"],Bs,Yl,[1,"no-border","full-height"],[3,"data","options","messages"],[1,"cd-col-form-offset"],[1,"custom-control","custom-checkbox"],["type","checkbox","id","enabled","name","enabled","formControlName","enabled",1,"custom-control-input"],["for","enabled",1,"custom-control-label"],yl,["type","checkbox","id","pwdUpdateRequired","name","pwdUpdateRequired","formControlName","pwdUpdateRequired",1,"custom-control-input"],["for","pwdUpdateRequired",1,"custom-control-label"],fo,Da,Ao,ls,[3,"control","hasTime"]]},template:function(nn,Cn){1&nn&&($.YNc(0,cs,41,25,"div",0),$.YNc(1,zo,8,0,"ng-template",null,1,$.W1O),$.YNc(3,So,1,2,"ng-template",null,2,$.W1O)),2&nn&&$.Q6J("cdFormLoading",Cn.loading)},directives:[Oe.y,u._Y,u.JL,u.sg,ce.V,dt.P,r.mk,ze.o,u.Fj,Ye.b,u.JJ,u.u,je.U,r.O5,Ve.p,mr.C,Xt.S,f.o8,p.yS,zn.m,u.Wl,vr.J],pipes:[r.rS,He.m],styles:[""]}),Ct})();var ai=i(96102),Zn=i(94088);const cr=["userRolesTpl"],yr=["warningTpl"],rr=["durationTpl"];function ri(Ct,pr){if(1&Ct&&($.TgZ(0,"span"),$._uU(1),$.qZA()),2&Ct){const nn=pr.$implicit,Cn=pr.last;$.xp6(1),$.AsE(" ",nn,"",Cn?"":", "," ")}}function ho(Ct,pr){1&Ct&&$.YNc(0,ri,2,2,"span",5),2&Ct&&$.Q6J("ngForOf",pr.value)}function Ti(Ct,pr){if(1&Ct&&($.TgZ(0,"div",6),$.TgZ(1,"div",7),$._uU(2),$.qZA(),$.qZA()),2&Ct){const nn=pr.value,Cn=pr.row,br=$.oxw();$.ekj("border-danger",Cn.remainingDays<br.expirationDangerAlert)("border-warning",Cn.remainingDays<br.expirationWarningAlert&&Cn.remainingDays>=br.expirationDangerAlert),$.xp6(2),$.hij(" ",nn," ")}}function Bo(Ct,pr){if(1&Ct&&$._UZ(0,"i",10),2&Ct){const nn=$.oxw().row,Cn=$.oxw();$.Tol(Cn.icons.warning),$.ekj("icon-danger-color",nn.remainingDays<Cn.expirationDangerAlert)("icon-warning-color",nn.remainingDays<Cn.expirationWarningAlert&&nn.remainingDays>=Cn.expirationDangerAlert)}}function xo(Ct,pr){if(1&Ct&&($.YNc(0,Bo,1,7,"i",8),$.TgZ(1,"span",9),$.ALo(2,"cdDate"),$._uU(3),$.ALo(4,"duration"),$.qZA()),2&Ct){const nn=pr.value,Cn=pr.row,br=$.oxw();$.Q6J("ngIf",Cn.remainingDays<br.expirationWarningAlert),$.xp6(1),$.s9C("title",$.lcZ(2,3,nn)),$.xp6(2),$.Oqu($.lcZ(4,5,Cn.remainingTimeWithoutSeconds/1e3))}}let ar=(()=>{class Ct{constructor(nn,Cn,br,zi,Wo,Do,Js,_s){this.userService=nn,this.emptyPipe=Cn,this.modalService=br,this.notificationService=zi,this.authStorageService=Wo,this.urlBuilder=Do,this.settingsService=Js,this.actionLabels=_s,this.selection=new Qr.r,this.icons=wr.P,this.permission=this.authStorageService.getPermissions().user,this.tableActions=[{permission:"create",icon:wr.P.add,routerLink:()=>this.urlBuilder.getCreate(),name:this.actionLabels.CREATE},{permission:"update",icon:wr.P.edit,routerLink:()=>this.selection.first()&&this.urlBuilder.getEdit(this.selection.first().username),name:this.actionLabels.EDIT},{permission:"delete",icon:wr.P.destroy,click:()=>this.deleteUserModal(),name:this.actionLabels.DELETE}]}ngOnInit(){this.columns=[{name:"Username",prop:"username",flexGrow:1,cellTemplate:this.warningTpl},{name:"Name",prop:"name",flexGrow:1,pipe:this.emptyPipe},{name:"Email",prop:"email",flexGrow:1,pipe:this.emptyPipe},{name:"Roles",prop:"roles",flexGrow:1,cellTemplate:this.userRolesTpl},{name:"Enabled",prop:"enabled",flexGrow:1,cellTransformation:Ir.e.checkIcon},{name:"Password expires",prop:"pwdExpirationDate",flexGrow:1,cellTemplate:this.durationTpl}],this.settingsService.getValues(["USER_PWD_EXPIRATION_WARNING_1","USER_PWD_EXPIRATION_WARNING_2"]).subscribe(Cn=>{this.expirationWarningAlert=Cn.USER_PWD_EXPIRATION_WARNING_1,this.expirationDangerAlert=Cn.USER_PWD_EXPIRATION_WARNING_2})}getUsers(){this.userService.list().subscribe(nn=>{nn.forEach(Cn=>{Cn.remainingTimeWithoutSeconds=0,Cn.pwdExpirationDate&&Cn.pwdExpirationDate>0&&(Cn.pwdExpirationDate=1e3*Cn.pwdExpirationDate,Cn.remainingTimeWithoutSeconds=this.getRemainingTimeWithoutSeconds(Cn.pwdExpirationDate),Cn.remainingDays=this.getRemainingDays(Cn.pwdExpirationDate))}),this.users=nn})}updateSelection(nn){this.selection=nn}deleteUser(nn){this.userService.delete(nn).subscribe(()=>{this.getUsers(),this.modalRef.close(),this.notificationService.show(F.k.success,"Deleted user '" + nn + "'")},()=>{this.modalRef.componentInstance.stopLoadingSpinner()})}deleteUserModal(){const nn=this.authStorageService.getUsername(),Cn=this.selection.first().username;nn!==Cn?this.modalRef=this.modalService.show(Hr.M,{itemDescription:"User",itemNames:[Cn],submitAction:()=>this.deleteUser(Cn)}):this.notificationService.show(F.k.error,"Failed to delete user '" + Cn + "'","You are currently logged in as '" + Cn + "'.")}getWarningIconClass(nn){return null===nn||this.expirationWarningAlert>10?"":this.getRemainingDays(nn)<=this.expirationDangerAlert?"icon-danger-color":"icon-warning-color"}getWarningClass(nn){return null===nn||this.expirationWarningAlert>10?"":this.getRemainingDays(nn)<=this.expirationDangerAlert?"border-danger":"border-warning"}getRemainingDays(nn){if(void 0!==nn&&null!=nn)return nn<0?0:Math.max(0,Math.floor(this.getRemainingTime(nn)/864e5))}getRemainingTimeWithoutSeconds(nn){const Cn=this.getRemainingTime(nn);return 60*Math.floor(Cn/6e4)*1e3}getRemainingTime(nn){return nn-Date.now()}}return Ct.\u0275fac=function(nn){return new(nn||Ct)($.Y36(gn.K),$.Y36(Kr.W),$.Y36(Zr.Z),$.Y36(ee.g),$.Y36(Hn.j),$.Y36(In.F),$.Y36(Lr.g),$.Y36(_.p4))},Ct.\u0275cmp=$.Xpm({type:Ct,selectors:[["cd-user-list"]],viewQuery:function(nn,Cn){if(1&nn&&($.Gf(cr,7),$.Gf(yr,7),$.Gf(rr,7)),2&nn){let br;$.iGM(br=$.CRH())&&(Cn.userRolesTpl=br.first),$.iGM(br=$.CRH())&&(Cn.warningTpl=br.first),$.iGM(br=$.CRH())&&(Cn.durationTpl=br.first)}},features:[$._Bn([{provide:In.F,useValue:new In.F("user-management/users")}])],decls:9,vars:5,consts:function(){let pr;return pr="User's password is about to expire",[["columnMode","flex","identifier","username","selectionType","single",3,"data","columns","fetchData","updateSelection"],[1,"table-actions",3,"permission","selection","tableActions"],["userRolesTpl",""],["warningTpl",""],["durationTpl",""],[4,"ngFor","ngForOf"],[1,"border-margin"],[1,"warning-content"],["title",pr,3,"icon-danger-color","icon-warning-color","class",4,"ngIf"],[3,"title"],["title",pr]]},template:function(nn,Cn){1&nn&&($._UZ(0,"cd-user-tabs"),$.TgZ(1,"cd-table",0),$.NdJ("fetchData",function(){return Cn.getUsers()})("updateSelection",function(zi){return Cn.updateSelection(zi)}),$._UZ(2,"cd-table-actions",1),$.qZA(),$.YNc(3,ho,1,1,"ng-template",null,2,$.W1O),$.YNc(5,Ti,3,5,"ng-template",null,3,$.W1O),$.YNc(7,xo,5,7,"ng-template",null,4,$.W1O)),2&nn&&($.xp6(1),$.Q6J("data",Cn.users)("columns",Cn.columns),$.xp6(1),$.Q6J("permission",Cn.permission)("selection",Cn.selection)("tableActions",Cn.tableActions))},directives:[Ur,Ie.a,di.K,r.sg,r.O5],pipes:[ai.N,Zn.u],styles:[".border-margin[_ngcontent-%COMP%]{border-left:3px solid transparent;height:calc(100% + 10px);margin-bottom:-5px;margin-left:-5px;margin-top:-5px}.warning-content[_ngcontent-%COMP%]{height:100%;padding-bottom:5px;padding-left:5px;padding-top:5px}"]}),Ct})(),ln=(()=>{class Ct{}return Ct.\u0275fac=function(nn){return new(nn||Ct)},Ct.\u0275mod=$.oAB({type:Ct}),Ct.\u0275inj=$.cJS({imports:[[r.ez,u.u5,u.UX,y.m,f.Oz,f.dT,e.b,p.Bz]]}),Ct})();const Ht=[{path:"",redirectTo:"users",pathMatch:"full"},{path:"users",data:{breadcrumbs:"Users"},children:[{path:"",component:ar},{path:_.MQ.CREATE,component:Si,data:{breadcrumbs:_.Qn.CREATE}},{path:`${_.MQ.EDIT}/:username`,component:Si,data:{breadcrumbs:_.Qn.EDIT}}]},{path:"roles",data:{breadcrumbs:"Roles"},children:[{path:"",component:On},{path:_.MQ.CREATE,component:zt,data:{breadcrumbs:_.Qn.CREATE}},{path:`${_.MQ.EDIT}/:name`,component:zt,data:{breadcrumbs:_.Qn.EDIT}}]}];let cn=(()=>{class Ct{}return Ct.\u0275fac=function(nn){return new(nn||Ct)},Ct.\u0275mod=$.oAB({type:Ct}),Ct.\u0275inj=$.cJS({imports:[[ln,p.Bz.forChild(Ht)]]}),Ct})()},26504:(v,S,i)=>{"use strict";i.d(S,{s9:()=>u,_2:()=>p,mM:()=>e});var r=i(65862);class u extends Error{}class p extends u{constructor(){super(...arguments),this.header="Page Not Found",this.message="Sorry, we couldn\u2019t find what you were looking for.\n  The page you requested may have been changed or moved.",this.icon=r.P.warning}}class e extends u{constructor(){super(...arguments),this.header="User Denied",this.message="Sorry, the user does not exist in Ceph.\n  You'll be logged out from the Identity Provider when you retry logging in.",this.icon=r.P.warning}}},76189:(v,S,i)=>{"use strict";i.d(S,{S:()=>r});class r{getVersionHeaderValue(p,f){return`application/vnd.ceph.api.v${p}.${f}+json`}}},39219:(v,S,i)=>{"use strict";i.d(S,{e:()=>T});var r=i(23815),p=i(68307),f=i(74788),e=i(74937),_=i(58497),y=i(6283);let T=(()=>{class M{constructor(F,Z,J,Q){this.authStorageService=F,this.http=Z,this.router=J,this.route=Q}check(F){return this.http.post("api/auth/check",{token:F})}login(F){return this.http.post("api/auth",F).pipe((0,p.b)(Z=>{this.authStorageService.set(Z.username,Z.permissions,Z.sso,Z.pwdExpirationDate,Z.pwdUpdateRequired)}))}logout(F=null){return this.http.post("api/auth/logout",null).subscribe(Z=>{this.authStorageService.remove();const J=r.get(this.route.snapshot.queryParams,"returnUrl","/login");this.router.navigate([J],{skipLocationChange:!0}),F&&F(),window.location.replace(Z.redirect_url)})}}return M.\u0275fac=function(F){return new(F||M)(f.LFG(e.j),f.LFG(_.eN),f.LFG(y.F0),f.LFG(y.gz))},M.\u0275prov=f.Yz7({token:M,factory:M.\u0275fac,providedIn:"root"}),M})()},64724:(v,S,i)=>{"use strict";i.d(S,{e:()=>p});var r=i(74788),u=i(58497);let p=(()=>{class f{constructor(_){this.http=_}findValue(_,y){if(_.value)return _.value.find(T=>T.section===y)}getValue(_,y){let T=this.findValue(_,y);if(!T){const M=y.indexOf(".");-1!==M&&(T=this.findValue(_,y.substring(0,M)))}return T||(T=this.findValue(_,"global")),T?T.value:_.default}getConfigData(){return this.http.get("api/cluster_conf/")}get(_){return this.http.get(`api/cluster_conf/${_}`)}filter(_){return this.http.get(`api/cluster_conf/filter?names=${_.join(",")}`)}create(_){return this.http.post("api/cluster_conf/",_)}delete(_,y){return this.http.delete(`api/cluster_conf/${_}?section=${y}`)}bulkCreate(_){return this.http.put("api/cluster_conf/",_)}}return f.\u0275fac=function(_){return new(_||f)(r.LFG(u.eN))},f.\u0275prov=r.Yz7({token:f,factory:f.\u0275fac,providedIn:"root"}),f})()},83608:(v,S,i)=>{"use strict";i.d(S,{H:()=>p});var r=i(74788),u=i(58497);let p=(()=>{class f{constructor(_){this.http=_,this.apiPath="api/crush_rule",this.formTooltips={root:"The name of the node under which data should be placed.",failure_domain:"The type of CRUSH nodes across which we should separate replicas.",device_class:"The device class data should be placed on."}}create(_){return this.http.post(this.apiPath,_,{observe:"response"})}delete(_){return this.http.delete(`${this.apiPath}/${_}`,{observe:"response"})}getInfo(){return this.http.get(`ui-${this.apiPath}/info`)}}return f.\u0275fac=function(_){return new(_||f)(r.LFG(u.eN))},f.\u0275prov=r.Yz7({token:f,factory:f.\u0275fac,providedIn:"root"}),f})()},7273:(v,S,i)=>{"use strict";i.d(S,{N:()=>p});var r=i(74788),u=i(58497);let p=(()=>{class f{constructor(_){this.http=_,this.url="api/mgr/module"}list(){return this.http.get(`${this.url}`)}getConfig(_){return this.http.get(`${this.url}/${_}`)}updateConfig(_,y){return this.http.put(`${this.url}/${_}`,{config:y})}enable(_){return this.http.post(`${this.url}/${_}/enable`,null)}disable(_){return this.http.post(`${this.url}/${_}/disable`,null)}getOptions(_){return this.http.get(`${this.url}/${_}/options`)}}return f.\u0275fac=function(_){return new(_||f)(r.LFG(u.eN))},f.\u0275prov=r.Yz7({token:f,factory:f.\u0275fac,providedIn:"root"}),f})()},80842:(v,S,i)=>{"use strict";i.d(S,{q:()=>y});var r=i(64762),u=i(58497),p=i(88002),f=i(93523),e=i(34089),_=i(74788);let y=class{constructor(M,R){this.http=M,this.rbdConfigurationService=R,this.apiPath="api/pool"}create(M){return this.http.post(this.apiPath,M,{observe:"response"})}update(M){let R;return M.hasOwnProperty("srcpool")?(R=M.srcpool,delete M.srcpool):(R=M.pool,delete M.pool),this.http.put(`${this.apiPath}/${encodeURIComponent(R)}`,M,{observe:"response"})}delete(M){return this.http.delete(`${this.apiPath}/${M}`,{observe:"response"})}get(M){return this.http.get(`${this.apiPath}/${M}`)}getList(){return this.http.get(`${this.apiPath}?stats=true`)}getConfiguration(M){return this.http.get(`${this.apiPath}/${M}/configuration`).pipe((0,p.U)(R=>R.map(F=>Object.assign(F,this.rbdConfigurationService.getOptionByName(F.name)))))}getInfo(){return this.http.get(`ui-${this.apiPath}/info`)}list(M=[]){const R=M.join(",");return this.http.get(`${this.apiPath}?attrs=${R}`).toPromise().then(F=>F)}};y.\u0275fac=function(M){return new(M||y)(_.LFG(u.eN),_.LFG(e.n))},y.\u0275prov=_.Yz7({token:y,factory:y.\u0275fac,providedIn:"root"}),y=(0,r.gn)([f.o,(0,r.w6)("design:paramtypes",[u.eN,e.n])],y)},95152:(v,S,i)=>{"use strict";i.d(S,{o:()=>Z});var r=i(64762),u=i(58497),p=i(23815),f=i.n(p),e=i(25917),_=i(96736),y=i(5304),T=i(76189),M=i(20523),R=i(93523),F=i(74788);let Z=class extends T.S{constructor(Q,ee){super(),this.http=Q,this.rgwDaemonService=ee,this.url="api/rgw/bucket"}list(Q=!1,ee=""){return this.rgwDaemonService.request(ue=>(ue=ue.append("stats",Q.toString()),ee&&(ue=ue.append("uid",ee)),this.http.get(this.url,{headers:{Accept:this.getVersionHeaderValue(1,1)},params:ue})))}get(Q){return this.rgwDaemonService.request(ee=>this.http.get(`${this.url}/${Q}`,{params:ee}))}create(Q,ee,ue,ae,$,se,ve){return this.rgwDaemonService.request(oe=>this.http.post(this.url,null,{params:new u.LE({fromObject:{bucket:Q,uid:ee,zonegroup:ue,placement_target:ae,lock_enabled:String($),lock_mode:se,lock_retention_period_days:ve,daemon_name:oe.get("daemon_name")}})}))}update(Q,ee,ue,ae,$,se,ve,oe,he){return this.rgwDaemonService.request(me=>(me=(me=(me=(me=(me=(me=(me=(me=me.append("bucket_id",ee)).append("uid",ue)).append("versioning_state",ae)).append("mfa_delete",$)).append("mfa_token_serial",se)).append("mfa_token_pin",ve)).append("lock_mode",oe)).append("lock_retention_period_days",he),this.http.put(`${this.url}/${Q}`,null,{params:me})))}delete(Q,ee=!0){return this.rgwDaemonService.request(ue=>(ue=ue.append("purge_objects",ee?"true":"false"),this.http.delete(`${this.url}/${Q}`,{params:ue})))}exists(Q){return this.get(Q).pipe((0,_.h)(!0),(0,y.K)(ee=>(f().isFunction(ee.preventDefault)&&ee.preventDefault(),(0,e.of)(!1))))}getLockDays(Q){return Q.lock_retention_period_years>0?Math.floor(365.242*Q.lock_retention_period_years):Q.lock_retention_period_days||0}};Z.\u0275fac=function(Q){return new(Q||Z)(F.LFG(u.eN),F.LFG(M.b))},Z.\u0275prov=F.Yz7({token:Z,factory:Z.\u0275fac,providedIn:"root"}),Z=(0,r.gn)([R.o,(0,r.w6)("design:paramtypes",[u.eN,M.b])],Z)},20523:(v,S,i)=>{"use strict";i.d(S,{b:()=>J});var r=i(64762),u=i(58497),p=i(23815),f=i.n(p),e=i(26215),_=i(40205),y=i(25917),T=i(68307),M=i(19773),R=i(15257),F=i(93523),Z=i(74788);let J=class{constructor(ee){this.http=ee,this.url="api/rgw/daemon",this.daemons=new e.X([]),this.daemons$=this.daemons.asObservable(),this.selectedDaemon=new e.X(null),this.selectedDaemon$=this.selectedDaemon.asObservable()}list(){return this.http.get(this.url).pipe((0,T.b)(ee=>{this.daemons.next(ee);const ue=this.selectedDaemon.getValue();(f().isEmpty(ue)||void 0===f().find(ee,{id:ue.id}))&&this.selectDefaultDaemon(ee)}))}get(ee){return this.http.get(`${this.url}/${ee}`)}selectDaemon(ee){this.selectedDaemon.next(ee)}selectDefaultDaemon(ee){if(0===ee.length)return null;for(const ue of ee)if(ue.default)return this.selectDaemon(ue),ue;return this.selectDaemon(ee[0]),ee[0]}request(ee){return this.selectedDaemon.pipe((0,M.zg)(ue=>f().isEmpty(ue)?this.list().pipe((0,M.zg)(ae=>f().isEmpty(ae)?(0,_._)("No RGW daemons found!"):this.selectedDaemon$)):(0,y.of)(ue)),(0,R.q)(1),(0,M.zg)(ue=>{let ae=new u.LE;return ae=ae.append("daemon_name",ue.id),ee(ae)}))}};J.\u0275fac=function(ee){return new(ee||J)(Z.LFG(u.eN))},J.\u0275prov=Z.Yz7({token:J,factory:J.\u0275fac,providedIn:"root"}),J=(0,r.gn)([F.o,(0,r.w6)("design:paramtypes",[u.eN])],J)},33394:(v,S,i)=>{"use strict";i.d(S,{I:()=>T});var r=i(64762),u=i(58497),p=i(19773),f=i(88002),e=i(20523),_=i(93523),y=i(74788);let T=class{constructor(R,F){this.http=R,this.rgwDaemonService=F,this.url="api/rgw/site"}get(R){return this.rgwDaemonService.request(F=>(R&&(F=F.append("query",R)),this.http.get(this.url,{params:F})))}isDefaultRealm(){return this.get("default-realm").pipe((0,p.zg)(R=>this.rgwDaemonService.selectedDaemon$.pipe((0,f.U)(F=>F.realm_name===R))))}};T.\u0275fac=function(R){return new(R||T)(y.LFG(u.eN),y.LFG(e.b))},T.\u0275prov=y.Yz7({token:T,factory:T.\u0275fac,providedIn:"root"}),T=(0,r.gn)([_.o,(0,r.w6)("design:paramtypes",[u.eN,e.b])],T)},9837:(v,S,i)=>{"use strict";i.d(S,{g:()=>y});var r=i(23815),u=i.n(r),p=i(88002),f=i(74788),e=i(58497);let y=(()=>{class T{constructor(R){this.http=R,this.settings={}}getValues(R){return u().isArray(R)&&(R=R.join(",")),this.http.get(`api/settings?names=${R}`).pipe((0,p.U)(F=>{const Z={};return u().forEach(F,J=>{u().set(Z,J.name,J.value)}),Z}))}ifSettingConfigured(R,F,Z){const J=this.settings[R];void 0===J?this.http.get(R).subscribe(Q=>{this.settings[R]=this.getSettingsValue(Q),this.ifSettingConfigured(R,F,Z)},Q=>{401!==Q.status&&(this.settings[R]="")}):""!==J?F(J):Z&&Z()}disableSetting(R){this.settings[R]=""}getSettingsValue(R){return R.value||R.instance||""}validateGrafanaDashboardUrl(R){return this.http.get(`api/grafana/validation/${R}`)}getStandardSettings(){return this.http.get("ui-api/standard_settings")}}return T.\u0275fac=function(R){return new(R||T)(f.LFG(e.eN))},T.\u0275prov=f.Yz7({token:T,factory:T.\u0275fac,providedIn:"root"}),T})()},32057:(v,S,i)=>{"use strict";i.d(S,{K:()=>_});var r=i(25917),u=i(96736),p=i(5304),f=i(74788),e=i(58497);let _=(()=>{class y{constructor(M){this.http=M}list(){return this.http.get("api/user")}delete(M){return this.http.delete(`api/user/${M}`)}get(M){return this.http.get(`api/user/${M}`)}create(M){return this.http.post("api/user",M)}update(M){return this.http.put(`api/user/${M.username}`,M)}changePassword(M,R,F){return this.http.post(`api/user/${M}/change_password`,{old_password:R,new_password:F})}validateUserName(M){return this.get(M).pipe((0,u.h)(!0),(0,p.K)(R=>(R.preventDefault(),(0,r.of)(!1))))}validatePassword(M,R=null,F=null){return this.http.post("api/user/validate_password",{password:M,username:R,old_password:F})}}return y.\u0275fac=function(M){return new(M||y)(f.LFG(e.eN))},y.\u0275prov=f.Yz7({token:y,factory:y.\u0275fac,providedIn:"root"}),y})()},51295:(v,S,i)=>{"use strict";i.d(S,{T:()=>p});var r=i(23815),u=i.n(r);class p{static updateChanged(e,_){let y=!1;return Object.keys(_).forEach(T=>{const M=_[T];u().isEqual(M,e[T])||(e[T]=M,y=!0)}),y}static cdVersionHeader(e,_){return`application/vnd.ceph.api.v${e}.${_}+json`}}},99475:(v,S,i)=>{"use strict";i.d(S,{P:()=>r});class r{propertyValue(p){return getComputedStyle(document.body).getPropertyValue(`--${p}`)}}},68136:(v,S,i)=>{"use strict";i.d(S,{o:()=>u});var r=i(71225);class u{constructor(f){this.ngZone=f}setExpandedRow(f){this.expandedRow=f}setTableRefreshTimeout(){clearTimeout(this.staleTimeout),this.ngZone.runOutsideAngular(()=>{this.staleTimeout=window.setTimeout(()=>{this.ngZone.run(()=>{this.tableStatus=new r.c("warning","The user list data might be stale. If needed, you can manually reload it.")})},1e4)})}}},69158:(v,S,i)=>{"use strict";i.d(S,{E:()=>p});var r=i(91801),u=i(71225);class p extends u.c{constructor(e=r.T.ValueOk,_=""){switch(super(),e){case r.T.ValueOk:this.type="light",this.msg="";break;case r.T.ValueNone:this.type="info",this.msg=(_?"Retrieving data for " + _ + ".":"Retrieving data.")+" "+"Please wait...";break;case r.T.ValueStale:this.type="warning",this.msg=_?"Displaying previously cached data for " + _ + ".":"Displaying previously cached data.";break;case r.T.ValueException:this.type="danger",this.msg=(_?"Could not load data for " + _ + ".":"Could not load data.")+" "+"Please check the cluster health."}}}},71225:(v,S,i)=>{"use strict";i.d(S,{c:()=>r});class r{constructor(p="light",f=""){this.type=p,this.msg=f}}},34501:(v,S,i)=>{"use strict";i.d(S,{G:()=>ue});var r=i(74788),u=i(65862),p=i(38549),f=i(12057);const e=function(ae){return[ae]};function _(ae,$){if(1&ae&&(r.TgZ(0,"td",8),r._UZ(1,"i",9),r.qZA()),2&ae){const se=r.oxw(2);r.xp6(1),r.MT6("alert-",se.bootstrapClass," ",se.typeIcon,""),r.Q6J("ngClass",r.VKq(5,e,se.icons.large3x))}}function y(ae,$){if(1&ae&&(r.TgZ(0,"td",10),r._uU(1),r.qZA()),2&ae){const se=r.oxw(2);r.xp6(1),r.Oqu(se.title)}}function T(ae,$){1&ae&&r.GkF(0)}function M(ae,$){if(1&ae&&(r.ynx(0),r.TgZ(1,"tr"),r.YNc(2,_,2,7,"td",4),r.YNc(3,y,2,1,"td",5),r.qZA(),r.TgZ(4,"tr"),r.TgZ(5,"td",6),r.YNc(6,T,1,0,"ng-container",7),r.qZA(),r.qZA(),r.BQk()),2&ae){const se=r.oxw(),ve=r.MAs(6);r.xp6(2),r.Q6J("ngIf",se.showIcon),r.xp6(1),r.Q6J("ngIf",se.showTitle),r.xp6(3),r.Q6J("ngTemplateOutlet",ve)}}function R(ae,$){if(1&ae&&(r.TgZ(0,"td",12),r._UZ(1,"i",13),r.qZA()),2&ae){const se=r.oxw(2);r.xp6(1),r.MT6("alert-",se.bootstrapClass," ",se.typeIcon,"")}}function F(ae,$){if(1&ae&&(r.TgZ(0,"td",10),r._uU(1),r.qZA()),2&ae){const se=r.oxw(2);r.xp6(1),r.Oqu(se.title)}}function Z(ae,$){1&ae&&r.GkF(0)}function J(ae,$){if(1&ae&&(r.TgZ(0,"tr"),r.YNc(1,R,2,4,"td",11),r.YNc(2,F,2,1,"td",5),r.TgZ(3,"td",6),r.YNc(4,Z,1,0,"ng-container",7),r.qZA(),r.qZA()),2&ae){const se=r.oxw(),ve=r.MAs(6);r.xp6(1),r.Q6J("ngIf",se.showIcon),r.xp6(1),r.Q6J("ngIf",se.showTitle),r.xp6(2),r.Q6J("ngTemplateOutlet",ve)}}function Q(ae,$){1&ae&&r.Hsn(0)}const ee=["*"];let ue=(()=>{class ae{constructor(){this.title="",this.bootstrapClass="",this.size="normal",this.showIcon=!0,this.showTitle=!0,this.dismissible=!1,this.dismissed=new r.vpe,this.icons=u.P}ngOnInit(){switch(this.type){case"warning":this.title=this.title||"Warning",this.typeIcon=this.typeIcon||u.P.warning,this.bootstrapClass=this.bootstrapClass||"warning";break;case"error":this.title=this.title||"Error",this.typeIcon=this.typeIcon||u.P.destroyCircle,this.bootstrapClass=this.bootstrapClass||"danger";break;case"info":this.title=this.title||"Information",this.typeIcon=this.typeIcon||u.P.infoCircle,this.bootstrapClass=this.bootstrapClass||"info";break;case"success":this.title=this.title||"Success",this.typeIcon=this.typeIcon||u.P.check,this.bootstrapClass=this.bootstrapClass||"success";break;case"danger":this.title=this.title||"Danger",this.typeIcon=this.typeIcon||u.P.warning,this.bootstrapClass=this.bootstrapClass||"danger"}}onClose(){this.dismissed.emit()}}return ae.\u0275fac=function(se){return new(se||ae)},ae.\u0275cmp=r.Xpm({type:ae,selectors:[["cd-alert-panel"]],inputs:{title:"title",bootstrapClass:"bootstrapClass",type:"type",typeIcon:"typeIcon",size:"size",showIcon:"showIcon",showTitle:"showTitle",dismissible:"dismissible"},outputs:{dismissed:"dismissed"},ngContentSelectors:ee,decls:7,vars:4,consts:[[3,"type","dismissible","closed"],[4,"ngIf","ngIfElse"],["slim",""],["content",""],["rowspan","2","class","alert-panel-icon",4,"ngIf"],["class","alert-panel-title",4,"ngIf"],[1,"alert-panel-text"],[4,"ngTemplateOutlet"],["rowspan","2",1,"alert-panel-icon"],["aria-hidden","true",3,"ngClass"],[1,"alert-panel-title"],["class","alert-panel-icon",4,"ngIf"],[1,"alert-panel-icon"],["aria-hidden","true"]],template:function(se,ve){if(1&se&&(r.F$t(),r.TgZ(0,"ngb-alert",0),r.NdJ("closed",function(){return ve.onClose()}),r.TgZ(1,"table"),r.YNc(2,M,7,3,"ng-container",1),r.YNc(3,J,5,3,"ng-template",null,2,r.W1O),r.qZA(),r.qZA(),r.YNc(5,Q,1,0,"ng-template",null,3,r.W1O)),2&se){const oe=r.MAs(4);r.s9C("type",ve.bootstrapClass),r.Q6J("dismissible",ve.dismissible),r.xp6(2),r.Q6J("ngIf","normal"===ve.size)("ngIfElse",oe)}},directives:[p.xm,f.O5,f.tP,f.mk],styles:[".alert-panel-icon[_ngcontent-%COMP%]{padding-right:.5em;vertical-align:top}.alert-panel-title[_ngcontent-%COMP%]{font-weight:bold}.alert[_ngcontent-%COMP%]{margin-bottom:0}"]}),ae})()},13472:(v,S,i)=>{"use strict";i.d(S,{W:()=>e});var r=i(74788),u=i(79512),p=i(12057),f=i(87925);let e=(()=>{class _{constructor(T,M){this.location=T,this.actionLabels=M,this.backAction=new r.vpe,this.name=this.actionLabels.CANCEL}back(){0===this.backAction.observers.length?this.location.back():this.backAction.emit()}}return _.\u0275fac=function(T){return new(T||_)(r.Y36(p.Ye),r.Y36(u.p4))},_.\u0275cmp=r.Xpm({type:_,selectors:[["cd-back-button"]],inputs:{name:"name"},outputs:{backAction:"backAction"},decls:2,vars:1,consts:[["type","button",1,"btn","btn-light","tc_backButton",3,"click"]],template:function(T,M){1&T&&(r.TgZ(0,"button",0),r.NdJ("click",function(){return M.back()}),r._uU(1),r.qZA()),2&T&&(r.xp6(1),r.hij(" ",M.name,"\n"))},directives:[f.o],styles:[""]}),_})()},15626:(v,S,i)=>{"use strict";i.d(S,{K:()=>F});var r=i(12057),u=i(24751),p=i(6283),f=i(38549),e=i(11971),_=i(7194),y=i(34863),T=i(35540),M=i(85953),R=i(74788);let F=(()=>{class Z{}return Z.\u0275fac=function(Q){return new(Q||Z)},Z.\u0275mod=R.oAB({type:Z}),Z.\u0275inj=R.cJS({providers:[],imports:[[r.ez,u.u5,u.UX,f._A,f.dT,f.ZQ,f.HK,_.m9,u.UX,M.D,T.o,f.XC,e.w,y.t,p.Bz,f.M,f.UL]]}),Z})()},36169:(v,S,i)=>{"use strict";i.d(S,{Y:()=>F});var r=i(24751),u=i(74788),p=i(38549),f=i(60312),e=i(12057),_=i(41582),y=i(30839);function T(Z,J){1&Z&&(u.TgZ(0,"span",11),u._UZ(1,"i",12),u.qZA())}function M(Z,J){1&Z&&u.GkF(0)}function R(Z,J){if(1&Z&&(u.TgZ(0,"p"),u._uU(1),u.qZA()),2&Z){const Q=u.oxw();u.xp6(1),u.hij(" ",Q.description," ")}}let F=(()=>{class Z{constructor(Q){this.activeModal=Q,this.warning=!1,this.showSubmit=!0,this.boundCancel=this.cancel.bind(this),this.canceled=!1,this.confirmationForm=new r.cw({})}ngOnInit(){if(this.bodyContext=this.bodyContext||{},this.bodyContext.$implicit=this.bodyData,!this.onSubmit)throw new Error("No submit action defined");if(!this.buttonText)throw new Error("No action name defined");if(!this.titleText)throw new Error("No title defined");if(!this.bodyTpl&&!this.description)throw new Error("No description defined")}ngOnDestroy(){this.onCancel&&this.canceled&&this.onCancel()}cancel(){this.canceled=!0,this.activeModal.close()}stopLoadingSpinner(){this.confirmationForm.setErrors({cdSubmitButton:!0})}}return Z.\u0275fac=function(Q){return new(Q||Z)(u.Y36(p.Kz))},Z.\u0275cmp=u.Xpm({type:Z,selectors:[["cd-confirmation-modal"]],decls:12,vars:9,consts:[[3,"hide"],[1,"modal-title"],["class","text-warning",4,"ngIf"],[1,"modal-content"],["name","confirmationForm","novalidate","",3,"formGroup"],["formDir","ngForm"],[1,"modal-body"],[4,"ngTemplateOutlet","ngTemplateOutletContext"],[4,"ngIf"],[1,"modal-footer"],[3,"form","submitText","showSubmit","submitActionEvent","backActionEvent"],[1,"text-warning"],[1,"fa","fa-exclamation-triangle","fa-1x"]],template:function(Q,ee){1&Q&&(u.TgZ(0,"cd-modal",0),u.NdJ("hide",function(){return ee.cancel()}),u.ynx(1,1),u.YNc(2,T,2,0,"span",2),u._uU(3),u.BQk(),u.ynx(4,3),u.TgZ(5,"form",4,5),u.TgZ(7,"div",6),u.YNc(8,M,1,0,"ng-container",7),u.YNc(9,R,2,1,"p",8),u.qZA(),u.TgZ(10,"div",9),u.TgZ(11,"cd-form-button-panel",10),u.NdJ("submitActionEvent",function(){return ee.onSubmit(ee.confirmationForm.value)})("backActionEvent",function(){return ee.boundCancel()}),u.qZA(),u.qZA(),u.qZA(),u.BQk(),u.qZA()),2&Q&&(u.xp6(2),u.Q6J("ngIf",ee.warning),u.xp6(1),u.Oqu(ee.titleText),u.xp6(2),u.Q6J("formGroup",ee.confirmationForm),u.xp6(3),u.Q6J("ngTemplateOutlet",ee.bodyTpl)("ngTemplateOutletContext",ee.bodyContext),u.xp6(1),u.Q6J("ngIf",ee.description),u.xp6(2),u.Q6J("form",ee.confirmationForm)("submitText",ee.buttonText)("showSubmit",ee.showSubmit))},directives:[f.z,e.O5,r._Y,r.JL,r.sg,_.V,e.tP,y.p],styles:[""]}),Z})()},58039:(v,S,i)=>{"use strict";i.d(S,{s:()=>T});var r=i(97057),u=i(65862),p=i(74788),f=i(91376),e=i(87925),_=i(12057);const y=function(M){return[M]};let T=(()=>{class M{constructor(F){this.toastr=F,this.byId=!0,this.icons=u.P}getText(){return document.getElementById(this.source).value}onClick(){try{const F=(0,r.qY)(),Z=this.byId?this.getText():this.source,J=()=>{this.toastr.success("Copied text to the clipboard successfully.")};["firefox","ie","ios","safari"].includes(F.name)?navigator.clipboard.writeText(Z).then(()=>J()):navigator.permissions.query({name:"clipboard-write"}).then(Q=>{("granted"===Q.state||"prompt"===Q.state)&&navigator.clipboard.writeText(Z).then(()=>J())})}catch(F){this.toastr.error("Failed to copy text to the clipboard.")}}}return M.\u0275fac=function(F){return new(F||M)(p.Y36(f._W))},M.\u0275cmp=p.Xpm({type:M,selectors:[["cd-copy-2-clipboard-button"]],hostBindings:function(F,Z){1&F&&p.NdJ("click",function(){return Z.onClick()})},inputs:{source:"source",byId:"byId"},decls:2,vars:3,consts:function(){let R;return R="Copy to Clipboard",[["type","button","title",R,1,"btn","btn-light",3,"click"],[3,"ngClass"]]},template:function(F,Z){1&F&&(p.TgZ(0,"button",0),p.NdJ("click",function(){return Z.onClick()}),p._UZ(1,"i",1),p.qZA()),2&F&&(p.xp6(1),p.Q6J("ngClass",p.VKq(1,y,Z.icons.clipboard)))},directives:[e.o,_.mk],styles:[""]}),M})()},30982:(v,S,i)=>{"use strict";i.d(S,{M:()=>Oe});var r=i(24751),u=i(95463),p=i(39749),f=i(74788),e=i(38549),_=i(60312),y=i(12057),T=i(41582),M=i(56310),R=i(87925),F=i(94276),Z=i(82945),J=i(30839);function Q(ce,dt){1&ce&&f.GkF(0)}function ee(ce,dt){1&ce&&f.GkF(0)}function ue(ce,dt){if(1&ce&&(f.TgZ(0,"p"),f.tHW(1,21),f.ALo(2,"lowercase"),f._UZ(3,"strong"),f.N_p(),f.qZA()),2&ce){const ze=f.oxw(2);f.xp6(3),f.pQV(f.lcZ(2,2,ze.actionDescription))(ze.itemNames[0]),f.QtT(1)}}function ae(ce,dt){if(1&ce&&(f.TgZ(0,"li"),f.TgZ(1,"strong"),f._uU(2),f.qZA(),f.qZA()),2&ce){const ze=dt.$implicit;f.xp6(2),f.Oqu(ze)}}function $(ce,dt){if(1&ce&&(f.TgZ(0,"p"),f.SDv(1,22),f.ALo(2,"lowercase"),f.qZA(),f.TgZ(3,"ul"),f.YNc(4,ae,3,1,"li",23),f.qZA()),2&ce){const ze=f.oxw(2);f.xp6(2),f.pQV(f.lcZ(2,2,ze.actionDescription)),f.QtT(1),f.xp6(2),f.Q6J("ngForOf",ze.itemNames)}}function se(ce,dt){if(1&ce&&(f.TgZ(0,"span"),f.YNc(1,ue,4,4,"p",10),f.YNc(2,$,5,4,"ng-template",null,20,f.W1O),f.qZA()),2&ce){const ze=f.MAs(3),Ye=f.oxw();f.xp6(1),f.Q6J("ngIf",1===Ye.itemNames.length)("ngIfElse",ze)}}function ve(ce,dt){if(1&ce&&(f.TgZ(0,"p"),f.SDv(1,24),f.ALo(2,"lowercase"),f.qZA()),2&ce){const ze=f.oxw();f.xp6(2),f.pQV(f.lcZ(2,2,ze.actionDescription))(ze.itemDescription),f.QtT(1)}}function oe(ce,dt){1&ce&&f.GkF(0)}function he(ce,dt){if(1&ce&&(f._uU(0),f.ALo(1,"titlecase")),2&ce){const ze=f.oxw();f.AsE(" ",f.lcZ(1,2,ze.actionDescription)," ",ze.itemDescription,"\n")}}const me=function(ce){return{form:ce}};let Oe=(()=>{class ce{constructor(ze){this.activeModal=ze,this.actionDescription="delete"}ngOnInit(){const ze={confirmation:new r.NI(!1,[r.kI.requiredTrue])};if(this.childFormGroup&&(ze.child=this.childFormGroup),this.deletionForm=new u.d(ze),!this.submitAction&&!this.submitActionObservable)throw new Error("No submit action defined")}callSubmitAction(){this.submitActionObservable?this.submitActionObservable().subscribe({error:this.stopLoadingSpinner.bind(this),complete:this.hideModal.bind(this)}):this.submitAction()}hideModal(){this.activeModal.close()}stopLoadingSpinner(){this.deletionForm.setErrors({cdSubmitButton:!0})}}return ce.\u0275fac=function(ze){return new(ze||ce)(f.Y36(e.Kz))},ce.\u0275cmp=f.Xpm({type:ce,selectors:[["cd-deletion-modal"]],viewQuery:function(ze,Ye){if(1&ze&&f.Gf(p.w,7),2&ze){let je;f.iGM(je=f.CRH())&&(Ye.submitButton=je.first)}},decls:24,vars:15,consts:function(){let dt,ze,Ye,je;return dt="Yes, I am sure.",ze="Are you sure that you want to " + "\ufffd0\ufffd" + " " + "\ufffd#3\ufffd" + "" + "\ufffd1\ufffd" + "" + "\ufffd/#3\ufffd" + "?",Ye="Are you sure that you want to " + "\ufffd0\ufffd" + " the selected items?",je="Are you sure that you want to " + "\ufffd0\ufffd" + " the selected " + "\ufffd1\ufffd" + "?",[[3,"modalRef"],["modal",""],[1,"modal-title"],[4,"ngTemplateOutlet"],[1,"modal-content"],["name","deletionForm","novalidate","",3,"formGroup"],["formDir","ngForm"],[1,"modal-body"],[4,"ngTemplateOutlet","ngTemplateOutletContext"],[1,"question"],[4,"ngIf","ngIfElse"],["noNames",""],[1,"form-group"],[1,"custom-control","custom-checkbox"],["type","checkbox","name","confirmation","id","confirmation","formControlName","confirmation","autofocus","",1,"custom-control-input"],["for","confirmation",1,"custom-control-label"],dt,[1,"modal-footer"],[3,"form","submitText","submitActionEvent"],["deletionHeading",""],["manyNames",""],ze,Ye,[4,"ngFor","ngForOf"],je]},template:function(ze,Ye){if(1&ze&&(f.TgZ(0,"cd-modal",0,1),f.ynx(2,2),f.YNc(3,Q,1,0,"ng-container",3),f.BQk(),f.ynx(4,4),f.TgZ(5,"form",5,6),f.TgZ(7,"div",7),f.YNc(8,ee,1,0,"ng-container",8),f.TgZ(9,"div",9),f.YNc(10,se,4,2,"span",10),f.YNc(11,ve,3,4,"ng-template",null,11,f.W1O),f.YNc(13,oe,1,0,"ng-container",8),f.TgZ(14,"div",12),f.TgZ(15,"div",13),f._UZ(16,"input",14),f.TgZ(17,"label",15),f.SDv(18,16),f.qZA(),f.qZA(),f.qZA(),f.qZA(),f.qZA(),f.TgZ(19,"div",17),f.TgZ(20,"cd-form-button-panel",18),f.NdJ("submitActionEvent",function(){return Ye.callSubmitAction()}),f.ALo(21,"titlecase"),f.qZA(),f.qZA(),f.qZA(),f.BQk(),f.qZA(),f.YNc(22,he,2,4,"ng-template",null,19,f.W1O)),2&ze){const je=f.MAs(12),Ie=f.MAs(23);f.Q6J("modalRef",Ye.activeModal),f.xp6(3),f.Q6J("ngTemplateOutlet",Ie),f.xp6(2),f.Q6J("formGroup",Ye.deletionForm),f.xp6(3),f.Q6J("ngTemplateOutlet",Ye.bodyTemplate)("ngTemplateOutletContext",Ye.bodyContext),f.xp6(2),f.Q6J("ngIf",Ye.itemNames)("ngIfElse",je),f.xp6(3),f.Q6J("ngTemplateOutlet",Ye.childFormGroupTemplate)("ngTemplateOutletContext",f.VKq(13,me,Ye.deletionForm)),f.xp6(7),f.Q6J("form",Ye.deletionForm)("submitText",f.lcZ(21,11,Ye.actionDescription)+" "+Ye.itemDescription)}},directives:[_.z,y.tP,r._Y,r.JL,r.sg,T.V,y.O5,M.P,R.o,r.Wl,F.b,r.JJ,r.u,Z.U,J.p,y.sg],pipes:[y.rS,y.i8],styles:[".modal-body[_ngcontent-%COMP%]   .question[_ngcontent-%COMP%]{margin-top:1em}.modal-body[_ngcontent-%COMP%]   label[_ngcontent-%COMP%]{font-weight:bold}.modal-body[_ngcontent-%COMP%]   .question[_ngcontent-%COMP%]   .form-check[_ngcontent-%COMP%]{padding-top:7px}"]}),ce})()},52266:(v,S,i)=>{"use strict";i.d(S,{J:()=>T});var r=i(16738),u=i.n(r),p=i(74788),f=i(38549),e=i(24751),_=i(12057);function y(M,R){if(1&M){const F=p.EpF();p.TgZ(0,"div",0),p.TgZ(1,"ngb-timepicker",4),p.NdJ("ngModelChange",function(J){return p.CHM(F),p.oxw().time=J})("ngModelChange",function(){return p.CHM(F),p.oxw().onModelChange()}),p.qZA(),p.qZA()}if(2&M){const F=p.oxw();p.xp6(1),p.Q6J("seconds",F.hasSeconds)("ngModel",F.time)}}let T=(()=>{class M{constructor(F){this.calendar=F,this.hasSeconds=!0,this.hasTime=!0}ngOnInit(){var F;this.minDate=this.calendar.getToday(),this.format=this.hasTime?this.hasSeconds?"YYYY-MM-DD HH:mm:ss":"YYYY-MM-DD HH:mm":"YYYY-MM-DD";let Z=u()(null===(F=this.control)||void 0===F?void 0:F.value,this.format);(!Z.isValid()||Z.isBefore(u()()))&&(Z=u()()),this.date={year:Z.year(),month:Z.month()+1,day:Z.date()},this.time={hour:Z.hour(),minute:Z.minute(),second:Z.second()},this.onModelChange()}onModelChange(){if(this.date){const F=Object.assign({},this.date,this.time);F.month--,setTimeout(()=>{this.control.setValue(u()(F).format(this.format))})}else setTimeout(()=>{this.control.setValue("")})}}return M.\u0275fac=function(F){return new(F||M)(p.Y36(f.vL))},M.\u0275cmp=p.Xpm({type:M,selectors:[["cd-date-time-picker"]],inputs:{control:"control",hasSeconds:"hasSeconds",hasTime:"hasTime"},decls:4,vars:3,consts:[[1,"d-flex","justify-content-center"],[3,"ngModel","minDate","ngModelChange"],["dp",""],["class","d-flex justify-content-center",4,"ngIf"],[3,"seconds","ngModel","ngModelChange"]],template:function(F,Z){1&F&&(p.TgZ(0,"div",0),p.TgZ(1,"ngb-datepicker",1,2),p.NdJ("ngModelChange",function(Q){return Z.date=Q})("ngModelChange",function(){return Z.onModelChange()}),p.qZA(),p.qZA(),p.YNc(3,y,2,2,"div",3)),2&F&&(p.xp6(1),p.Q6J("ngModel",Z.date)("minDate",Z.minDate),p.xp6(2),p.Q6J("ngIf",Z.hasTime))},directives:[f.VL,e.JJ,e.On,_.O5,f.Pm],styles:[""]}),M})()},30490:(v,S,i)=>{"use strict";i.d(S,{K:()=>p});var r=i(72625),u=i(74788);let p=(()=>{class f{constructor(_){this.docService=_,this.docText="documentation"}ngOnInit(){this.noSubscribe?this.docUrl=this.docService.urlGenerator(this.section):this.docService.subscribeOnce(this.section,_=>{this.docUrl=_})}}return f.\u0275fac=function(_){return new(_||f)(u.Y36(r.R))},f.\u0275cmp=u.Xpm({type:f,selectors:[["cd-doc"]],inputs:{section:"section",docText:"docText",noSubscribe:"noSubscribe"},decls:2,vars:2,consts:[["target","_blank",3,"href"]],template:function(_,y){1&_&&(u.TgZ(0,"a",0),u._uU(1),u.qZA()),2&_&&(u.s9C("href",y.docUrl,u.LSH),u.xp6(1),u.Oqu(y.docText))},styles:[""]}),f})()},30839:(v,S,i)=>{"use strict";i.d(S,{p:()=>T});var r=i(74788),u=i(79512),p=i(39749),f=i(12057),e=i(63285),_=i(13472);function y(M,R){if(1&M){const F=r.EpF();r.TgZ(0,"cd-submit-button",2),r.NdJ("submitAction",function(){return r.CHM(F),r.oxw().submitAction()}),r._uU(1),r.qZA()}if(2&M){const F=r.oxw();r.Q6J("disabled",F.disabled)("form",F.form)("ariaLabel",F.submitText),r.xp6(1),r.Oqu(F.submitText)}}let T=(()=>{class M{constructor(F,Z,J){this.location=F,this.actionLabels=Z,this.modalService=J,this.submitActionEvent=new r.vpe,this.backActionEvent=new r.vpe,this.showSubmit=!0,this.wrappingClass="",this.btnClass="",this.submitText=this.actionLabels.CREATE,this.cancelText=this.actionLabels.CANCEL,this.disabled=!1}submitAction(){this.submitActionEvent.emit()}backAction(){0===this.backActionEvent.observers.length?this.modalService.hasOpenModals()?this.modalService.dismissAll():this.location.back():this.backActionEvent.emit()}}return M.\u0275fac=function(F){return new(F||M)(r.Y36(f.Ye),r.Y36(u.p4),r.Y36(e.Z))},M.\u0275cmp=r.Xpm({type:M,selectors:[["cd-form-button-panel"]],viewQuery:function(F,Z){if(1&F&&r.Gf(p.w,5),2&F){let J;r.iGM(J=r.CRH())&&(Z.submitButton=J.first)}},inputs:{form:"form",showSubmit:"showSubmit",wrappingClass:"wrappingClass",btnClass:"btnClass",submitText:"submitText",cancelText:"cancelText",disabled:"disabled"},outputs:{submitActionEvent:"submitActionEvent",backActionEvent:"backActionEvent"},decls:3,vars:4,consts:[[1,"m-2",3,"name","backAction"],["data-cy","submitBtn",3,"disabled","form","ariaLabel","submitAction",4,"ngIf"],["data-cy","submitBtn",3,"disabled","form","ariaLabel","submitAction"]],template:function(F,Z){1&F&&(r.TgZ(0,"div"),r.TgZ(1,"cd-back-button",0),r.NdJ("backAction",function(){return Z.backAction()}),r.qZA(),r.YNc(2,y,2,4,"cd-submit-button",1),r.qZA()),2&F&&(r.Tol(Z.wrappingClass),r.xp6(1),r.Q6J("name",Z.cancelText),r.xp6(1),r.Q6J("ngIf",Z.showSubmit))},directives:[_.W,f.O5,p.w],styles:[""]}),M})()},65683:(v,S,i)=>{"use strict";i.d(S,{X:()=>Ve});var r=i(24751),u=i(23815),p=i.n(u),f=i(47557),e=i(28211),_=i(74788),y=i(38549),T=i(62862),M=i(60312),R=i(12057),F=i(41582),Z=i(30839),J=i(87925),Q=i(94276),ee=i(17932),ue=i(60192);function ae(He,Zt){if(1&He&&(_.ynx(0,10),_._uU(1),_.BQk()),2&He){const st=_.oxw();_.xp6(1),_.hij(" ",st.titleText," ")}}function $(He,Zt){if(1&He&&(_.TgZ(0,"p"),_._uU(1),_.qZA()),2&He){const st=_.oxw();_.xp6(1),_.Oqu(st.message)}}const se=function(He){return{required:He}};function ve(He,Zt){if(1&He&&(_.TgZ(0,"label",18),_._uU(1),_.qZA()),2&He){const st=_.oxw().$implicit;_.Q6J("ngClass",_.VKq(3,se,!0===(null==st?null:st.required)))("for",st.name),_.xp6(1),_.hij(" ",st.label," ")}}function oe(He,Zt){if(1&He&&_._UZ(0,"input",19),2&He){const st=_.oxw().$implicit;_.Q6J("type",st.type)("id",st.name)("name",st.name)("formControlName",st.name)}}function he(He,Zt){if(1&He&&_._UZ(0,"input",20),2&He){const st=_.oxw().$implicit;_.Q6J("id",st.name)("name",st.name)("formControlName",st.name)}}function me(He,Zt){if(1&He&&(_.TgZ(0,"option",24),_._uU(1),_.qZA()),2&He){const st=_.oxw(2).$implicit;_.Q6J("ngValue",null),_.xp6(1),_.hij(" ",null==st||null==st.typeConfig?null:st.typeConfig.placeholder," ")}}function Oe(He,Zt){if(1&He&&(_.TgZ(0,"option",25),_._uU(1),_.qZA()),2&He){const st=Zt.$implicit;_.Q6J("value",st.value),_.xp6(1),_.hij(" ",st.text," ")}}function ce(He,Zt){if(1&He&&(_.TgZ(0,"select",21),_.YNc(1,me,2,2,"option",22),_.YNc(2,Oe,2,2,"option",23),_.qZA()),2&He){const st=_.oxw().$implicit;_.Q6J("id",st.name)("formControlName",st.name),_.xp6(1),_.Q6J("ngIf",null==st||null==st.typeConfig?null:st.typeConfig.placeholder),_.xp6(1),_.Q6J("ngForOf",null==st||null==st.typeConfig?null:st.typeConfig.options)}}function dt(He,Zt){if(1&He&&_._UZ(0,"cd-select-badges",26),2&He){const st=_.oxw().$implicit;_.Q6J("id",st.name)("data",st.value)("customBadges",null==st||null==st.typeConfig?null:st.typeConfig.customBadges)("options",null==st||null==st.typeConfig?null:st.typeConfig.options)("messages",null==st||null==st.typeConfig?null:st.typeConfig.messages)}}function ze(He,Zt){if(1&He&&(_.TgZ(0,"span",27),_._uU(1),_.qZA()),2&He){const st=_.oxw().$implicit,en=_.oxw();_.xp6(1),_.hij(" ",en.getError(st)," ")}}const Ye=function(He,Zt){return{"cd-col-form-input":He,"col-sm-12":Zt}},je=function(){return["text","number"]};function Ie(He,Zt){if(1&He&&(_.ynx(0),_.TgZ(1,"div"),_.YNc(2,ve,2,5,"label",11),_.TgZ(3,"div",12),_.YNc(4,oe,1,4,"input",13),_.YNc(5,he,1,3,"input",14),_.YNc(6,ce,3,4,"select",15),_.YNc(7,dt,1,5,"cd-select-badges",16),_.YNc(8,ze,2,1,"span",17),_.qZA(),_.qZA(),_.BQk()),2&He){const st=Zt.$implicit,en=_.oxw(),$t=_.MAs(4);_.xp6(1),_.Gre("form-group row cd-",st.name,"-form-group"),_.xp6(1),_.Q6J("ngIf",st.label),_.xp6(1),_.Q6J("ngClass",_.WLB(10,Ye,st.label,!st.label)),_.xp6(1),_.Q6J("ngIf",_.DdM(13,je).includes(st.type)),_.xp6(1),_.Q6J("ngIf","binary"===st.type),_.xp6(1),_.Q6J("ngIf","select"===st.type),_.xp6(1),_.Q6J("ngIf","select-badges"===st.type),_.xp6(1),_.Q6J("ngIf",en.formGroup.showError(st.name,$t))}}let Ve=(()=>{class He{constructor(st,en,$t,Gt){this.activeModal=st,this.formBuilder=en,this.formatter=$t,this.dimlessBinaryPipe=Gt}ngOnInit(){this.createForm()}createForm(){const st={};this.fields.forEach(en=>{st[en.name]=this.createFormControl(en)}),this.formGroup=this.formBuilder.group(st)}createFormControl(st){let en=[];return p().isBoolean(st.required)&&st.required&&en.push(r.kI.required),st.validators&&(en=en.concat(st.validators)),new r.NI(p().defaultTo("binary"===st.type?this.dimlessBinaryPipe.transform(st.value):st.value,null),{validators:en})}getError(st){const en=this.formGroup.get(st.name).errors;return Object.keys(en).map(Gt=>this.getErrorMessage(Gt,en[Gt],st.errors)).join("<br>")}getErrorMessage(st,en,$t){if($t){const Gt=$t[st];if(Gt)return Gt}return["binaryMin","binaryMax"].includes(st)?en():"required"===st?"This field is required.":"An error occurred."}onSubmitForm(st){this.fields.filter($t=>"binary"===$t.type).map($t=>$t.name).forEach($t=>{const Gt=st[$t];Gt&&(st[$t]=this.formatter.toBytes(Gt))}),this.activeModal.close(),p().isFunction(this.onSubmit)&&this.onSubmit(st)}}return He.\u0275fac=function(st){return new(st||He)(_.Y36(y.Kz),_.Y36(T.O),_.Y36(e.H),_.Y36(f.$))},He.\u0275cmp=_.Xpm({type:He,selectors:[["cd-form-modal"]],decls:10,vars:7,consts:[[3,"modalRef"],["class","modal-title",4,"ngIf"],[1,"modal-content"],["novalidate","",3,"formGroup"],["formDir","ngForm"],[1,"modal-body"],[4,"ngIf"],[4,"ngFor","ngForOf"],[1,"modal-footer"],[3,"form","submitText","submitActionEvent"],[1,"modal-title"],["class","cd-col-form-label",3,"ngClass","for",4,"ngIf"],[3,"ngClass"],["class","form-control",3,"type","id","name","formControlName",4,"ngIf"],["type","text","class","form-control","cdDimlessBinary","",3,"id","name","formControlName",4,"ngIf"],["class","form-control",3,"id","formControlName",4,"ngIf"],[3,"id","data","customBadges","options","messages",4,"ngIf"],["class","invalid-feedback",4,"ngIf"],[1,"cd-col-form-label",3,"ngClass","for"],[1,"form-control",3,"type","id","name","formControlName"],["type","text","cdDimlessBinary","",1,"form-control",3,"id","name","formControlName"],[1,"form-control",3,"id","formControlName"],[3,"ngValue",4,"ngIf"],[3,"value",4,"ngFor","ngForOf"],[3,"ngValue"],[3,"value"],[3,"id","data","customBadges","options","messages"],[1,"invalid-feedback"]],template:function(st,en){1&st&&(_.TgZ(0,"cd-modal",0),_.YNc(1,ae,2,1,"ng-container",1),_.ynx(2,2),_.TgZ(3,"form",3,4),_.TgZ(5,"div",5),_.YNc(6,$,2,1,"p",6),_.YNc(7,Ie,9,14,"ng-container",7),_.qZA(),_.TgZ(8,"div",8),_.TgZ(9,"cd-form-button-panel",9),_.NdJ("submitActionEvent",function(){return en.onSubmitForm(en.formGroup.value)}),_.qZA(),_.qZA(),_.qZA(),_.BQk(),_.qZA()),2&st&&(_.Q6J("modalRef",en.activeModal),_.xp6(1),_.Q6J("ngIf",en.titleText),_.xp6(2),_.Q6J("formGroup",en.formGroup),_.xp6(3),_.Q6J("ngIf",en.message),_.xp6(1),_.Q6J("ngForOf",en.fields),_.xp6(2),_.Q6J("form",en.formGroup)("submitText",en.submitButtonText))},directives:[M.z,R.O5,r._Y,r.JL,r.sg,F.V,R.sg,Z.p,R.mk,J.o,r.Fj,Q.b,r.JJ,r.u,ee.Q,r.EJ,r.YN,r.Kr,ue.m],styles:[""]}),He})()},76317:(v,S,i)=>{"use strict";i.d(S,{F:()=>ve});var r=i(9837),u=i(65862),p=i(74788),f=i(91211),e=i(12057),_=i(8958),y=i(34501),T=i(30490),M=i(87925),R=i(24751);function F(oe,he){1&oe&&(p.TgZ(0,"cd-loading-panel"),p.SDv(1,2),p.qZA())}function Z(oe,he){1&oe&&(p.TgZ(0,"cd-alert-panel",3),p.tHW(1,4),p._UZ(2,"cd-doc",5),p.N_p(),p.qZA())}function J(oe,he){1&oe&&(p.TgZ(0,"cd-alert-panel",3),p.tHW(1,6),p._UZ(2,"cd-doc",5),p.N_p(),p.qZA())}function Q(oe,he){if(1&oe&&(p.TgZ(0,"option",21),p._uU(1),p.qZA()),2&oe){const me=he.$implicit;p.Q6J("ngValue",me.value),p.xp6(1),p.hij("",me.name," ")}}function ee(oe,he){if(1&oe){const me=p.EpF();p.TgZ(0,"cd-alert-panel",24),p.NdJ("dismissed",function(){return p.CHM(me),p.oxw(3).showMessage=!1}),p.tHW(1,25),p._UZ(2,"a",26),p.N_p(),p.qZA()}if(2&oe){const me=p.oxw(3);p.xp6(2),p.Q6J("href",me.grafanaSrc,p.LSH)}}function ue(oe,he){if(1&oe&&(p.TgZ(0,"div",22),p.YNc(1,ee,3,1,"cd-alert-panel",23),p.qZA()),2&oe){const me=p.oxw(2);p.xp6(1),p.Q6J("ngIf",me.showMessage)}}const ae=function(oe){return[oe]},$=function(oe,he){return[oe,he]};function se(oe,he){if(1&oe){const me=p.EpF();p.ynx(0),p.TgZ(1,"div",7),p.TgZ(2,"div",8),p.TgZ(3,"div",9),p.TgZ(4,"label",10),p.SDv(5,11),p.qZA(),p.TgZ(6,"select",12),p.NdJ("ngModelChange",function(ce){return p.CHM(me),p.oxw().time=ce})("ngModelChange",function(ce){return p.CHM(me),p.oxw().onTimepickerChange(ce)}),p.YNc(7,Q,2,2,"option",13),p.qZA(),p.TgZ(8,"button",14),p.NdJ("click",function(){return p.CHM(me),p.oxw().reset()}),p._UZ(9,"i",15),p.qZA(),p.TgZ(10,"button",16),p.NdJ("click",function(){p.CHM(me);const ce=p.oxw();return ce.showMessage=!ce.showMessage}),p._UZ(11,"i",15),p.qZA(),p.qZA(),p.qZA(),p.qZA(),p.TgZ(12,"div",7),p.YNc(13,ue,2,1,"div",17),p.qZA(),p.TgZ(14,"div",7),p.TgZ(15,"div",8),p.TgZ(16,"div",18),p._UZ(17,"iframe",19,20),p.qZA(),p.qZA(),p.qZA(),p.BQk()}if(2&oe){const me=p.oxw();p.xp6(6),p.Q6J("ngModel",me.time),p.xp6(1),p.Q6J("ngForOf",me.grafanaTimes),p.xp6(2),p.Q6J("ngClass",p.VKq(7,ae,me.icons.undo)),p.xp6(2),p.Q6J("ngClass",p.WLB(9,$,me.icons.infoCircle,me.icons.large)),p.xp6(2),p.Q6J("ngIf",me.showMessage),p.xp6(4),p.Q6J("src",me.grafanaSrc,p.uOi)("ngClass",me.panelStyle)}}let ve=(()=>{class oe{constructor(me,Oe){this.sanitizer=me,this.settingsService=Oe,this.grafanaExist=!1,this.mode="&kiosk",this.loading=!0,this.styles={},this.dashboardExist=!0,this.showMessage=!1,this.icons=u.P,this.DEFAULT_TIME="from=now-1h&to=now",this.grafanaTimes=[{name:"Last 5 minutes",value:"from=now-5m&to=now"},{name:"Last 15 minutes",value:"from=now-15m&to=now"},{name:"Last 30 minutes",value:"from=now-30m&to=now"},{name:"Last 1 hour (Default)",value:"from=now-1h&to=now"},{name:"Last 3 hours",value:"from=now-3h&to=now"},{name:"Last 6 hours",value:"from=now-6h&to=now"},{name:"Last 12 hours",value:"from=now-12h&to=now"},{name:"Last 24 hours",value:"from=now-24h&to=now"},{name:"Yesterday",value:"from=now-1d%2Fd&to=now-1d%2Fd"},{name:"Today so far",value:"from=now%2Fd&to=now"},{name:"Day before yesterday",value:"from=now-2d%2Fd&to=now-2d%2Fd"},{name:"Last 2 days",value:"from=now-2d&to=now"},{name:"This day last week",value:"from=now-7d%2Fd&to=now-7d%2Fd"},{name:"Previous week",value:"from=now-1w%2Fw&to=now-1w%2Fw"},{name:"This week so far",value:"from=now%2Fw&to=now"},{name:"Last 7 days",value:"from=now-7d&to=now"},{name:"Previous month",value:"from=now-1M%2FM&to=now-1M%2FM"},{name:"This month so far",value:"from=now%2FM&to=now"},{name:"Last 30 days",value:"from=now-30d&to=now"},{name:"Last 90 days",value:"from=now-90d&to=now"},{name:"Last 6 months",value:"from=now-6M&to=now"},{name:"Last 1 year",value:"from=now-1y&to=now"},{name:"Previous year",value:"from=now-1y%2Fy&to=now-1y%2Fy"},{name:"This year so far",value:"from=now%2Fy&to=now"},{name:"Last 2 years",value:"from=now-2y&to=now"},{name:"Last 5 years",value:"from=now-5y&to=now"}]}ngOnInit(){this.time=this.DEFAULT_TIME,this.styles={one:"grafana_one",two:"grafana_two",three:"grafana_three",four:"grafana_four"},this.datasource="metrics"===this.type?"Dashboard1":"Loki",this.settingsService.ifSettingConfigured("api/grafana/url",me=>{this.grafanaExist=!0,this.loading=!1,this.baseUrl=me+"/d/",this.getFrame()}),this.panelStyle=this.styles[this.grafanaStyle]}getFrame(){this.settingsService.validateGrafanaDashboardUrl(this.uid).subscribe(me=>this.dashboardExist=200===me),this.url="metrics"===this.type?`${this.baseUrl}${this.uid}/${this.grafanaPath}&refresh=2s&var-datasource=${this.datasource}${this.mode}&${this.time}`:`${this.baseUrl.slice(0,-2)}${this.grafanaPath}orgId=1&left=["now-1h","now","${this.datasource}",{"refId":"A"}]${this.mode}`,this.grafanaSrc=this.sanitizer.bypassSecurityTrustResourceUrl(this.url)}onTimepickerChange(){this.grafanaExist&&this.getFrame()}reset(){this.time=this.DEFAULT_TIME,this.grafanaExist&&this.getFrame()}ngOnChanges(){this.grafanaExist&&this.getFrame()}}return oe.\u0275fac=function(me){return new(me||oe)(p.Y36(f.H7),p.Y36(r.g))},oe.\u0275cmp=p.Xpm({type:oe,selectors:[["cd-grafana"]],inputs:{type:"type",grafanaPath:"grafanaPath",grafanaStyle:"grafanaStyle",uid:"uid"},features:[p.TTD],decls:4,vars:4,consts:function(){let he,me,Oe,ce,dt,ze,Ye;return he="Loading panel data...",me="Please consult the " + "\ufffd#2\ufffd" + "" + "\ufffd/#2\ufffd" + " on how to configure and enable the monitoring functionality.",Oe="Grafana Dashboard doesn't exist. Please refer to " + "\ufffd#2\ufffd" + "" + "\ufffd/#2\ufffd" + " on how to add dashboards to Grafana.",ce="Grafana Time Picker",dt="Reset Settings",ze="Show hidden information",Ye="If no embedded Grafana Dashboard appeared below, please follow " + "\ufffd#2\ufffd" + "this link " + "\ufffd/#2\ufffd" + " to check if Grafana is reachable and there are no HTTPS certificate issues. You may need to reload this page after accepting any Browser certificate exceptions",[[4,"ngIf"],["type","info",4,"ngIf"],he,["type","info"],me,["section","grafana"],Oe,[1,"row"],[1,"col"],[1,"form-inline","timepicker"],["for","timepicker",1,"ml-1","my-1"],ce,["id","timepicker","name","timepicker",1,"custom-select","my-1","mx-3",3,"ngModel","ngModelChange"],[3,"ngValue",4,"ngFor","ngForOf"],["title",dt,1,"btn","btn-light","my-1",3,"click"],[3,"ngClass"],["title",ze,1,"btn","btn-light","my-1","ml-3",3,"click"],["class","col my-3",4,"ngIf"],[1,"grafana-container"],["id","iframe","frameborder","0","scrolling","no",1,"grafana",3,"src","ngClass"],["iframe",""],[3,"ngValue"],[1,"col","my-3"],["type","info","class","mb-3","dismissible","true",3,"dismissed",4,"ngIf"],["type","info","dismissible","true",1,"mb-3",3,"dismissed"],Ye,["target","_blank","noopener","","noreferrer","",3,"href"]]},template:function(me,Oe){1&me&&(p.YNc(0,F,2,0,"cd-loading-panel",0),p.YNc(1,Z,3,0,"cd-alert-panel",1),p.YNc(2,J,3,0,"cd-alert-panel",1),p.YNc(3,se,19,12,"ng-container",0)),2&me&&(p.Q6J("ngIf",Oe.loading&&Oe.grafanaExist),p.xp6(1),p.Q6J("ngIf",!Oe.grafanaExist),p.xp6(1),p.Q6J("ngIf",!Oe.dashboardExist),p.xp6(1),p.Q6J("ngIf",Oe.grafanaExist&&Oe.dashboardExist))},directives:[e.O5,_.b,y.G,T.K,M.o,R.EJ,R.JJ,R.On,e.sg,e.mk,R.YN,R.Kr],styles:[".grafana[_ngcontent-%COMP%]{height:600px;width:100%;z-index:0}.grafana_one[_ngcontent-%COMP%]{height:400px}.grafana_two[_ngcontent-%COMP%]{height:750px}.grafana_three[_ngcontent-%COMP%]{height:900px}.grafana_four[_ngcontent-%COMP%]{height:1160px}.timepicker[_ngcontent-%COMP%]   label[_ngcontent-%COMP%]{font-weight:700}.dropdown-menu[_ngcontent-%COMP%]{left:auto;right:20px;top:20px}"]}),oe})()},18372:(v,S,i)=>{"use strict";i.d(S,{S:()=>T});var r=i(65862),u=i(74788),p=i(12057),f=i(38549);function e(M,R){if(1&M&&(u._UZ(0,"div",2),u.Hsn(1)),2&M){const F=u.oxw();u.Tol(F.class),u.Q6J("innerHtml",F.html,u.oJD)}}const _=function(M){return[M]},y=["*"];let T=(()=>{class M{constructor(){this.icons=r.P}}return M.\u0275fac=function(F){return new(F||M)},M.\u0275cmp=u.Xpm({type:M,selectors:[["cd-helper"]],inputs:{class:"class",html:"html"},ngContentSelectors:y,decls:3,vars:4,consts:[["popoverTpl",""],["aria-hidden","true",3,"ngClass","ngbPopover","click"],[3,"innerHtml"]],template:function(F,Z){if(1&F&&(u.F$t(),u.YNc(0,e,2,3,"ng-template",null,0,u.W1O),u.TgZ(2,"i",1),u.NdJ("click",function(Q){return Q.preventDefault()}),u.qZA()),2&F){const J=u.MAs(1);u.xp6(2),u.Q6J("ngClass",u.VKq(2,_,Z.icons.questionCircle))("ngbPopover",J)}},directives:[p.mk,f.o8],styles:["i[_ngcontent-%COMP%]{color:#2b99a8;cursor:pointer;padding-left:4px}"]}),M})()},8958:(v,S,i)=>{"use strict";i.d(S,{b:()=>y});var r=i(65862),u=i(74788),p=i(38549),f=i(12057);const e=function(T,M){return[T,M]},_=["*"];let y=(()=>{class T{constructor(){this.icons=r.P}}return T.\u0275fac=function(R){return new(R||T)},T.\u0275cmp=u.Xpm({type:T,selectors:[["cd-loading-panel"]],ngContentSelectors:_,decls:4,vars:5,consts:[["type","info",3,"dismissible"],["aria-hidden","true",1,"mr-2",3,"ngClass"]],template:function(R,F){1&R&&(u.F$t(),u.TgZ(0,"ngb-alert",0),u.TgZ(1,"strong"),u._UZ(2,"i",1),u.qZA(),u.Hsn(3),u.qZA()),2&R&&(u.Q6J("dismissible",!1),u.xp6(2),u.Q6J("ngClass",u.WLB(2,e,F.icons.spinner,F.icons.spin)))},directives:[p.xm,f.mk],styles:[""]}),T})()},60312:(v,S,i)=>{"use strict";i.d(S,{z:()=>y});var r=i(74788),u=i(6283),p=i(12057),f=i(87925);const e=[[["",8,"modal-title"]],[["",8,"modal-content"]]],_=[".modal-title",".modal-content"];let y=(()=>{class T{constructor(R){this.router=R,this.hide=new r.vpe}close(){var R;this.pageURL?this.router.navigate([this.pageURL,{outlets:{modal:null}}]):null===(R=this.modalRef)||void 0===R||R.close(),this.hide.emit()}}return T.\u0275fac=function(R){return new(R||T)(r.Y36(u.F0))},T.\u0275cmp=r.Xpm({type:T,selectors:[["cd-modal"]],inputs:{modalRef:"modalRef",pageURL:"pageURL"},outputs:{hide:"hide"},ngContentSelectors:_,decls:10,vars:2,consts:[[3,"ngClass"],[1,"modal-content"],[1,"modal-header"],[1,"modal-title","float-left"],["type","button","aria-label","Close",1,"close","float-right",3,"click"],["aria-hidden","true"]],template:function(R,F){1&R&&(r.F$t(e),r.TgZ(0,"div",0),r.TgZ(1,"div",0),r.TgZ(2,"div",1),r.TgZ(3,"div",2),r.TgZ(4,"h4",3),r.Hsn(5),r.qZA(),r.TgZ(6,"button",4),r.NdJ("click",function(){return F.close()}),r.TgZ(7,"span",5),r._uU(8,"\xd7"),r.qZA(),r.qZA(),r.qZA(),r.Hsn(9,1),r.qZA(),r.qZA(),r.qZA()),2&R&&(r.Q6J("ngClass",F.pageURL?"modal":""),r.xp6(1),r.Q6J("ngClass",F.pageURL?"modal-dialog":""))},directives:[p.mk,f.o],styles:[".modal-header[_ngcontent-%COMP%]{background-color:#e9ecef;border-bottom:1px solid #ced4da;border-radius:5px 5px 0 0}  cd-modal .modal-footer{background-color:#e9ecef;border-bottom:1px solid #ced4da;border-radius:0 0 5px 5px}  cd-modal .modal-body{max-height:70vh;overflow-x:hidden;overflow-y:auto}button.close[_ngcontent-%COMP%]{outline:none}"]}),T})()},60192:(v,S,i)=>{"use strict";i.d(S,{m:()=>M});var r=i(74788),u=i(65862),p=i(7022),f=i(39092),e=i(12057);const _=["cdSelect"],y=function(R){return[R]};function T(R,F){if(1&R){const Z=r.EpF();r.TgZ(0,"span"),r.TgZ(1,"span",4),r.TgZ(2,"span",5),r._uU(3),r.qZA(),r.TgZ(4,"a",6),r.NdJ("click",function(){const ee=r.CHM(Z).$implicit;return r.oxw(),r.MAs(1).removeItem(ee)}),r._UZ(5,"i",7),r.qZA(),r.qZA(),r.qZA()}if(2&R){const Z=F.$implicit,J=r.oxw();r.xp6(3),r.Oqu(Z),r.xp6(2),r.Q6J("ngClass",r.VKq(2,y,J.icons.destroy))}}let M=(()=>{class R{constructor(){this.data=[],this.options=[],this.messages=new p.a({}),this.customBadges=!1,this.customBadgeValidators=[],this.selection=new r.vpe,this.icons=u.P}}return R.\u0275fac=function(Z){return new(Z||R)},R.\u0275cmp=r.Xpm({type:R,selectors:[["cd-select-badges"]],viewQuery:function(Z,J){if(1&Z&&r.Gf(_,7),2&Z){let Q;r.iGM(Q=r.CRH())&&(J.cdSelect=Q.first)}},inputs:{data:"data",options:"options",messages:"messages",selectionLimit:"selectionLimit",customBadges:"customBadges",customBadgeValidators:"customBadgeValidators"},outputs:{selection:"selection"},decls:4,vars:10,consts:[["elemClass","mr-2 select-menu-edit",3,"data","options","messages","selectionLimit","customBadges","customBadgeValidators","selection"],["cdSelect",""],[3,"ngClass"],[4,"ngFor","ngForOf"],[1,"badge","badge-dark","mr-2"],[1,"mr-2"],[1,"badge-remove",3,"click"],["aria-hidden","true",3,"ngClass"]],template:function(Z,J){1&Z&&(r.TgZ(0,"cd-select",0,1),r.NdJ("selection",function(ee){return J.selection.emit(ee)}),r._UZ(2,"i",2),r.qZA(),r.YNc(3,T,6,4,"span",3)),2&Z&&(r.Q6J("data",J.data)("options",J.options)("messages",J.messages)("selectionLimit",J.selectionLimit)("customBadges",J.customBadges)("customBadgeValidators",J.customBadgeValidators),r.xp6(2),r.Q6J("ngClass",r.VKq(8,y,J.icons.edit)),r.xp6(1),r.Q6J("ngForOf",J.data))},directives:[f.H,e.mk,e.sg],styles:[".badge-remove[_ngcontent-%COMP%]{color:#fff}i.fa-pencil[_ngcontent-%COMP%]{font-size:1.1rem}"]}),R})()},7022:(v,S,i)=>{"use strict";i.d(S,{a:()=>p});var r=i(23815),u=i.n(r);class p{constructor(e){this.customValidations={},this.empty="No items selected.",this.selectionLimit={tooltip:"Deselect item to select again",text:"Selection limit reached"},this.filter="Filter tags",this.add="Add badge",this.noOptions="There are no items available.",u().merge(this,e)}}},14745:(v,S,i)=>{"use strict";i.d(S,{$:()=>r});class r{constructor(p,f,e,_=!0){this.selected=p,this.name=f,this.description=e,this.enabled=_}}},39092:(v,S,i)=>{"use strict";i.d(S,{H:()=>je});var r=i(74788),u=i(24751),p=i(23815),f=i.n(p),e=i(65862),_=i(95463),y=i(7022),T=i(14745),M=i(12057),R=i(41582),F=i(87925),Z=i(94276),J=i(38549);function Q(Ie,Ve){if(1&Ie&&(r.TgZ(0,"span",12),r._uU(1),r.qZA()),2&Ie){const He=r.oxw().$implicit,Zt=r.oxw(2);r.xp6(1),r.hij(" ",Zt.messages.customValidations[He]," ")}}function ee(Ie,Ve){if(1&Ie&&(r.ynx(0),r.YNc(1,Q,2,1,"span",11),r.BQk()),2&Ie){const He=Ve.$implicit;r.oxw();const Zt=r.MAs(1),st=r.oxw();r.xp6(1),r.Q6J("ngIf",st.form.showError("filter",Zt)&&st.filter.hasError(He))}}const ue=function(Ie){return[Ie]};function ae(Ie,Ve){if(1&Ie&&r._UZ(0,"i",18),2&Ie){const He=r.oxw(3);r.Q6J("ngClass",r.VKq(1,ue,He.icons.check))}}function $(Ie,Ve){if(1&Ie&&(r.ynx(0),r._UZ(1,"br"),r.TgZ(2,"small",19),r._uU(3),r.qZA(),r.BQk()),2&Ie){const He=r.oxw().$implicit;r.xp6(3),r.hij(" ",He.description,"\xa0 ")}}const se=function(Ie){return{"help-block disabled":Ie}};function ve(Ie,Ve){if(1&Ie){const He=r.EpF();r.TgZ(0,"div",13),r.NdJ("click",function(){const en=r.CHM(He).$implicit;return r.oxw(2).triggerSelection(en)}),r.TgZ(1,"div",14),r.YNc(2,ae,1,3,"i",15),r._uU(3," \xa0 "),r.qZA(),r.TgZ(4,"div",16),r._uU(5),r.YNc(6,$,4,1,"ng-container",17),r.qZA(),r.qZA()}if(2&Ie){const He=Ve.$implicit,Zt=r.oxw(2);r.Q6J("ngClass",r.VKq(4,se,!(Zt.data.length!==Zt.selectionLimit&&He.enabled||He.selected))),r.xp6(2),r.Q6J("ngIf",He.selected),r.xp6(3),r.hij(" ",He.name," "),r.xp6(1),r.Q6J("ngIf",He.description)}}function oe(Ie,Ve){if(1&Ie){const He=r.EpF();r.TgZ(0,"div",20),r.NdJ("click",function(){return r.CHM(He),r.oxw(2).addCustomOption()}),r.TgZ(1,"div",14),r._UZ(2,"i",18),r._uU(3," \xa0 "),r.qZA(),r.TgZ(4,"div",16),r._uU(5),r.qZA(),r.qZA()}if(2&Ie){const He=r.oxw(2);r.xp6(2),r.Q6J("ngClass",r.VKq(3,ue,He.icons.tag)),r.xp6(3),r.AsE(" ",He.messages.add," '",He.filter.value,"' ")}}function he(Ie,Ve){if(1&Ie&&(r.TgZ(0,"span",23),r._uU(1),r.qZA()),2&Ie){const He=r.oxw(3);r.Q6J("ngbTooltip",He.messages.selectionLimit.tooltip),r.xp6(1),r.hij(" ",He.messages.selectionLimit.text," ")}}function me(Ie,Ve){if(1&Ie&&(r.TgZ(0,"div",21),r.YNc(1,he,2,2,"span",22),r.qZA()),2&Ie){const He=r.oxw(2);r.xp6(1),r.Q6J("ngIf",He.data.length===He.selectionLimit)}}function Oe(Ie,Ve){if(1&Ie){const He=r.EpF();r.TgZ(0,"form",4,5),r.TgZ(2,"div"),r.TgZ(3,"input",6),r.NdJ("keyup",function(st){r.CHM(He);const en=r.oxw();return 13==st.keyCode?en.selectOption():en.updateFilter()}),r.qZA(),r.YNc(4,ee,2,1,"ng-container",7),r.qZA(),r.qZA(),r.YNc(5,ve,7,6,"div",8),r.YNc(6,oe,6,5,"div",9),r.YNc(7,me,2,1,"div",10)}if(2&Ie){const He=r.oxw();r.Q6J("formGroup",He.form),r.xp6(3),r.Q6J("placeholder",He.messages.filter),r.xp6(1),r.Q6J("ngForOf",He.Object.keys(He.messages.customValidations)),r.xp6(1),r.Q6J("ngForOf",He.filteredOptions),r.xp6(1),r.Q6J("ngIf",He.isCreatable()),r.xp6(1),r.Q6J("ngIf",He.data.length===He.selectionLimit)}}function ce(Ie,Ve){if(1&Ie&&(r.TgZ(0,"a",24),r.Hsn(1),r.qZA()),2&Ie){const He=r.oxw(),Zt=r.MAs(1);r.Q6J("ngClass",He.elemClass)("ngbPopover",Zt)}}function dt(Ie,Ve){if(1&Ie&&(r.TgZ(0,"span",25),r._uU(1),r.qZA()),2&Ie){const He=r.oxw();r.xp6(1),r.hij(" ",He.messages.empty,"\n")}}function ze(Ie,Ve){if(1&Ie&&(r.TgZ(0,"span",25),r._uU(1),r.qZA()),2&Ie){const He=r.oxw();r.xp6(1),r.hij(" ",He.messages.noOptions,"\n")}}const Ye=["*"];let je=(()=>{class Ie{constructor(){this.data=[],this.options=[],this.messages=new y.a({}),this.customBadges=!1,this.customBadgeValidators=[],this.selection=new r.vpe,this.Object=Object,this.filteredOptions=[],this.icons=e.P}ngOnInit(){this.initFilter(),this.data.length>0&&this.initMissingOptions(),this.options=f().sortBy(this.options,["name"]),this.updateOptions()}initFilter(){this.filter=new u.NI("",{validators:this.customBadgeValidators}),this.form=new _.d({filter:this.filter}),this.filteredOptions=[...this.options||[]]}initMissingOptions(){const He=this.options.map(st=>st.name);this.data.filter(st=>-1===He.indexOf(st)).forEach(st=>this.addOption(st)),this.forceOptionsToReflectData()}addOption(He){this.options.push(new T.$(!1,He,"")),this.options=f().sortBy(this.options,["name"]),this.triggerSelection(this.options.find(Zt=>Zt.name===He))}triggerSelection(He){!He||this.selectionLimit&&!He.selected&&this.data.length>=this.selectionLimit||(He.selected=!He.selected,this.updateOptions(),this.selection.emit({option:He}))}updateOptions(){this.data.splice(0,this.data.length),this.options.forEach(He=>{He.selected&&this.data.push(He.name)}),this.updateFilter()}updateFilter(){this.filteredOptions=this.options.filter(He=>He.name.includes(this.filter.value))}forceOptionsToReflectData(){this.options.forEach(He=>{-1!==this.data.indexOf(He.name)&&(He.selected=!0)})}ngOnChanges(){this.filter&&this.updateFilter(),this.options&&this.data&&0!==this.data.length&&this.forceOptionsToReflectData()}selectOption(){0===this.filteredOptions.length?this.addCustomOption():(this.triggerSelection(this.filteredOptions[0]),this.resetFilter())}addCustomOption(){!this.isCreatable()||(this.addOption(this.filter.value),this.resetFilter())}isCreatable(){return this.customBadges&&this.filter.valid&&this.filter.value.length>0&&this.filteredOptions.every(He=>He.name!==this.filter.value)}resetFilter(){this.filter.setValue(""),this.updateFilter()}removeItem(He){this.triggerSelection(this.options.find(Zt=>Zt.name===He&&Zt.selected))}}return Ie.\u0275fac=function(He){return new(He||Ie)},Ie.\u0275cmp=r.Xpm({type:Ie,selectors:[["cd-select"]],inputs:{elemClass:"elemClass",data:"data",options:"options",messages:"messages",selectionLimit:"selectionLimit",customBadges:"customBadges",customBadgeValidators:"customBadgeValidators"},outputs:{selection:"selection"},features:[r.TTD],ngContentSelectors:Ye,decls:5,vars:3,consts:[["popTemplate",""],["class","select-menu-edit float-left","data-testid","select-menu-edit",3,"ngClass","ngbPopover",4,"ngIf"],["class","form-text text-muted float-left",4,"ngIf"],["class","form-text text-muted  float-left",4,"ngIf"],["name","form","novalidate","",3,"formGroup"],["formDir","ngForm"],["type","text","formControlName","filter",1,"form-control","text-center",3,"placeholder","keyup"],[4,"ngFor","ngForOf"],["class","select-menu-item",3,"ngClass","click",4,"ngFor","ngForOf"],["class","select-menu-item",3,"click",4,"ngIf"],["class","is-invalid",4,"ngIf"],["class","invalid-feedback text-center d-block",4,"ngIf"],[1,"invalid-feedback","text-center","d-block"],[1,"select-menu-item",3,"ngClass","click"],[1,"select-menu-item-icon"],["aria-hidden","true",3,"ngClass",4,"ngIf"],[1,"select-menu-item-content"],[4,"ngIf"],["aria-hidden","true",3,"ngClass"],[1,"form-text","text-muted"],[1,"select-menu-item",3,"click"],[1,"is-invalid"],["class","form-text text-muted text-center text-warning",3,"ngbTooltip",4,"ngIf"],[1,"form-text","text-muted","text-center","text-warning",3,"ngbTooltip"],["data-testid","select-menu-edit",1,"select-menu-edit","float-left",3,"ngClass","ngbPopover"],[1,"form-text","text-muted","float-left"]],template:function(He,Zt){1&He&&(r.F$t(),r.YNc(0,Oe,8,6,"ng-template",null,0,r.W1O),r.YNc(2,ce,2,2,"a",1),r.YNc(3,dt,2,1,"span",2),r.YNc(4,ze,2,1,"span",3)),2&He&&(r.xp6(2),r.Q6J("ngIf",Zt.customBadges||Zt.options.length>0),r.xp6(1),r.Q6J("ngIf",0===Zt.data.length&&!(!Zt.customBadges&&0===Zt.options.length)),r.xp6(1),r.Q6J("ngIf",!Zt.customBadges&&0===Zt.options.length))},directives:[M.O5,u._Y,u.JL,u.sg,R.V,F.o,u.Fj,Z.b,u.JJ,u.u,M.sg,M.mk,J._L,J.o8],styles:[".select-menu-item[_ngcontent-%COMP%]{border-bottom:1px solid rgba(0,0,0,.09);cursor:pointer;display:block;font-size:1rem}.select-menu-item[_ngcontent-%COMP%]:hover{background-color:#e9ecef}.select-menu-item-icon[_ngcontent-%COMP%]{float:left;padding:.5em;width:3em}.select-menu-item-content[_ngcontent-%COMP%]{padding:.5em}.select-menu-item-content[_ngcontent-%COMP%]   .form-text[_ngcontent-%COMP%]{display:flex}"]}),Ie})()},76446:(v,S,i)=>{"use strict";i.d(S,{l:()=>T});var r=i(87311),u=i(47557),p=i(74788),f=i(12057),e=i(7194);const _=["sparkCanvas"],y=["sparkTooltip"];let T=(()=>{class M{constructor(F){this.dimlessBinaryPipe=F,this.style={height:"30px",width:"100px"},this.colors=[{backgroundColor:"rgba(40,140,234,0.2)",borderColor:"rgba(40,140,234,1)",pointBackgroundColor:"rgba(40,140,234,1)",pointBorderColor:"#fff",pointHoverBackgroundColor:"#fff",pointHoverBorderColor:"rgba(40,140,234,0.8)"}],this.options={animation:{duration:0},responsive:!0,maintainAspectRatio:!1,legend:{display:!1},elements:{line:{borderWidth:1}},tooltips:{enabled:!1,mode:"index",intersect:!1,custom:void 0,callbacks:{label:Z=>this.isBinary?this.dimlessBinaryPipe.transform(Z.yLabel):Z.yLabel,title:()=>""}},scales:{yAxes:[{display:!1}],xAxes:[{display:!1}]}},this.datasets=[{data:[]}],this.labels=[]}ngOnInit(){const J=new r.h(this.chartCanvasRef,this.chartTooltipRef,(Q,ee)=>ee+Q.caretX+"px",Q=>Q.caretY-Q.height-Q.yPadding-5+"px");J.customColors={backgroundColor:this.colors[0].pointBackgroundColor,borderColor:this.colors[0].pointBorderColor},this.options.tooltips.custom=Q=>{J.customTooltips(Q)}}ngOnChanges(F){this.datasets[0].data=F.data.currentValue,this.labels=[...Array(F.data.currentValue.length)]}}return M.\u0275fac=function(F){return new(F||M)(p.Y36(u.$))},M.\u0275cmp=p.Xpm({type:M,selectors:[["cd-sparkline"]],viewQuery:function(F,Z){if(1&F&&(p.Gf(_,7),p.Gf(y,7)),2&F){let J;p.iGM(J=p.CRH())&&(Z.chartCanvasRef=J.first),p.iGM(J=p.CRH())&&(Z.chartTooltipRef=J.first)}},inputs:{data:"data",style:"style",isBinary:"isBinary"},features:[p.TTD],decls:6,vars:6,consts:[[1,"chart-container",3,"ngStyle"],["baseChart","",3,"labels","datasets","options","colors","chartType"],["sparkCanvas",""],[1,"chartjs-tooltip"],["sparkTooltip",""]],template:function(F,Z){1&F&&(p.TgZ(0,"div",0),p._UZ(1,"canvas",1,2),p.TgZ(3,"div",3,4),p._UZ(5,"table"),p.qZA(),p.qZA()),2&F&&(p.Q6J("ngStyle",Z.style),p.xp6(1),p.Q6J("labels",Z.labels)("datasets",Z.datasets)("options",Z.options)("colors",Z.colors)("chartType","line"))},directives:[f.PC,e.jh],styles:['.chart-container[_ngcontent-%COMP%]{cursor:pointer;margin:auto;overflow:visible;position:absolute}canvas[_ngcontent-%COMP%]{user-select:none}.chartjs-tooltip[_ngcontent-%COMP%]{background:rgba(0,0,0,.7);border-radius:3px;color:#fff;font-family:"Helvetica Neue","Helvetica","Arial",sans-serif!important;opacity:0;pointer-events:none;position:absolute;transform:translate(-50%);transition:all .1s ease}.chartjs-tooltip.transform-left[_ngcontent-%COMP%]{transform:translate(-10%)}.chartjs-tooltip.transform-left[_ngcontent-%COMP%]:after{left:10%}.chartjs-tooltip.transform-right[_ngcontent-%COMP%]{transform:translate(-90%)}.chartjs-tooltip.transform-right[_ngcontent-%COMP%]:after{left:90%}.chartjs-tooltip[_ngcontent-%COMP%]:after{border-color:#000 transparent transparent transparent;border-style:solid;border-width:5px;content:" ";left:50%;margin-left:-5px;position:absolute;top:100%}  .chartjs-tooltip-key{display:inline-block;height:10px;margin-right:10px;width:10px}.chart-container[_ngcontent-%COMP%]{position:static!important}']}),M})()},39749:(v,S,i)=>{"use strict";i.d(S,{w:()=>F});var r=i(74788),u=i(24751),p=i(23815),f=i.n(p),e=i(65862),_=i(87925),y=i(12057);const T=function(Z,J){return[Z,J]};function M(Z,J){if(1&Z&&(r.TgZ(0,"span"),r._UZ(1,"i",2),r.qZA()),2&Z){const Q=r.oxw();r.xp6(1),r.Q6J("ngClass",r.WLB(1,T,Q.icons.spinner,Q.icons.spin))}}const R=["*"];let F=(()=>{class Z{constructor(Q){this.elRef=Q,this.type="submit",this.disabled=!1,this.submitAction=new r.vpe,this.loading=!1,this.icons=e.P}ngOnInit(){this.form.statusChanges.subscribe(()=>{f().has(this.form.errors,"cdSubmitButton")&&(this.loading=!1,f().unset(this.form.errors,"cdSubmitButton"),this.form instanceof u.TO&&this.form.updateValueAndValidity())})}submit(Q){this.focusButton(),this.form instanceof u.sg&&this.form.onSubmit(Q),this.form.invalid?this.focusInvalid():(this.loading=!0,this.submitAction.emit())}focusButton(){this.elRef.nativeElement.offsetParent.querySelector(`button[type="${this.type}"]`).focus()}focusInvalid(){const Q=this.elRef.nativeElement.offsetParent.querySelector("input.ng-invalid, select.ng-invalid");Q&&Q.focus()}}return Z.\u0275fac=function(Q){return new(Q||Z)(r.Y36(r.SBq))},Z.\u0275cmp=r.Xpm({type:Z,selectors:[["cd-submit-button"]],inputs:{form:"form",type:"type",disabled:"disabled",btnClass:"btnClass",ariaLabel:"ariaLabel"},outputs:{submitAction:"submitAction"},ngContentSelectors:R,decls:3,vars:5,consts:[[1,"btn","btn-accent","tc_submitButton",3,"type","ngClass","disabled","click"],[4,"ngIf"],[3,"ngClass"]],template:function(Q,ee){1&Q&&(r.F$t(),r.TgZ(0,"button",0),r.NdJ("click",function(ae){return ee.submit(ae)}),r.Hsn(1),r.YNc(2,M,2,4,"span",1),r.qZA()),2&Q&&(r.Q6J("type",ee.type)("ngClass",ee.btnClass)("disabled",ee.loading||ee.disabled),r.uIk("aria-label",ee.ariaLabel),r.xp6(2),r.Q6J("ngIf",ee.loading))},directives:[_.o,y.mk,y.O5],styles:[""]}),Z})()},60251:(v,S,i)=>{"use strict";i.d(S,{O:()=>M});var r=i(74788),u=i(38549),p=i(12057),f=i(47557),e=i(66369);function _(R,F){if(1&R&&(r.TgZ(0,"tr"),r.TgZ(1,"td",4),r._uU(2,"Free:\xa0"),r.qZA(),r.TgZ(3,"td",7),r.TgZ(4,"strong"),r._uU(5),r.ALo(6,"dimlessBinary"),r.ALo(7,"dimless"),r.qZA(),r.qZA(),r.qZA()),2&R){const Z=r.oxw(2);r.xp6(5),r.Oqu(Z.isBinary?r.lcZ(6,1,Z.total-Z.used):r.lcZ(7,3,Z.total-Z.used))}}function y(R,F){if(1&R&&(r.TgZ(0,"table"),r.TgZ(1,"tr"),r.TgZ(2,"td",4),r._uU(3,"Used:\xa0"),r.qZA(),r.TgZ(4,"td",5),r.TgZ(5,"strong"),r._uU(6),r.ALo(7,"dimlessBinary"),r.ALo(8,"dimless"),r.qZA(),r.qZA(),r.qZA(),r.YNc(9,_,8,5,"tr",6),r.qZA()),2&R){const Z=r.oxw();r.xp6(6),r.hij(" ",Z.isBinary?r.lcZ(7,2,Z.used):r.lcZ(8,4,Z.used),""),r.xp6(3),r.Q6J("ngIf",Z.calculatePerc)}}const T=function(R,F){return{"bg-warning":R,"bg-danger":F}};let M=(()=>{class R{constructor(){this.isBinary=!0,this.decimals=0,this.calculatePerc=!0}ngOnChanges(){this.calculatePerc?(this.usedPercentage=this.total>0?this.used/this.total*100:0,this.freePercentage=100-this.usedPercentage):this.used?(this.used=this.used.slice(0,-1),this.usedPercentage=Number(this.used),this.freePercentage=100-this.usedPercentage):this.usedPercentage=0}}return R.\u0275fac=function(Z){return new(Z||R)},R.\u0275cmp=r.Xpm({type:R,selectors:[["cd-usage-bar"]],inputs:{total:"total",used:"used",warningThreshold:"warningThreshold",errorThreshold:"errorThreshold",isBinary:"isBinary",decimals:"decimals",calculatePerc:"calculatePerc"},features:[r.TTD],decls:8,vars:13,consts:[["usageTooltipTpl",""],["data-placement","left",1,"progress",3,"ngbTooltip"],["role","progressbar",1,"progress-bar","bg-info",3,"ngClass"],["role","progressbar",1,"progress-bar","bg-freespace"],[1,"text-left"],[1,"text-right"],[4,"ngIf"],[1,"'text-right"]],template:function(Z,J){if(1&Z&&(r.YNc(0,y,10,6,"ng-template",null,0,r.W1O),r.TgZ(2,"div",1),r.TgZ(3,"div",2),r.TgZ(4,"span"),r._uU(5),r.ALo(6,"number"),r.qZA(),r.qZA(),r._UZ(7,"div",3),r.qZA()),2&Z){const Q=r.MAs(1);r.xp6(2),r.Q6J("ngbTooltip",Q),r.xp6(1),r.Udp("width",J.usedPercentage+"%"),r.Q6J("ngClass",r.WLB(10,T,J.usedPercentage/100>=J.warningThreshold,J.usedPercentage/100>=J.errorThreshold)),r.xp6(2),r.hij("",r.xi3(6,7,J.usedPercentage,"1.0-"+J.decimals),"%"),r.xp6(2),r.Udp("width",J.freePercentage+"%")}},directives:[u._L,p.mk,p.O5],pipes:[p.JJ,f.$,e.n],styles:[".bg-info[_ngcontent-%COMP%]{background-color:#2b99a8!important}.bg-warning[_ngcontent-%COMP%]{background-color:#ffc200!important}.bg-danger[_ngcontent-%COMP%]{background-color:#ef5c55!important}.bg-freespace[_ngcontent-%COMP%]{background-color:#ced4da!important}.progress[_ngcontent-%COMP%]{height:20px;margin-bottom:0;position:relative}.progress[_ngcontent-%COMP%]   div.progress-bar[_ngcontent-%COMP%]{position:static}.progress[_ngcontent-%COMP%]   span[_ngcontent-%COMP%]{color:#000;display:block;font-weight:normal;position:absolute;width:100%}"]}),R})()},79512:(v,S,i)=>{"use strict";i.d(S,{$x:()=>p,MQ:()=>f,Qn:()=>e,p4:()=>_,aX:()=>y});var r=i(92340),u=i(74788);class p{}p.organization="ceph",p.projectName="Ceph Dashboard",p.license="Free software (LGPL 2.1).",p.copyright="Copyright(c) "+r.N.year+" Ceph contributors.",p.cephLogo="assets/Ceph_Logo.svg";var f=(()=>{return(T=f||(f={})).CREATE="create",T.EDIT="edit",T.UPDATE="update",T.REMOVE="remove",T.DELETE="delete",T.ADD="add",T.COPY="copy",T.CLONE="clone",T.RECREATE="recreate",T.EXPIRE="expire",T.RESTART="Restart",f;var T})(),e=(()=>{return(T=e||(e={})).CREATE="Create",T.DELETE="Delete",T.ADD="Add",T.REMOVE="Remove",T.EDIT="Edit",T.CANCEL="Cancel",T.COPY="Copy",T.CLONE="Clone",T.UPDATE="Update",T.EVICT="Evict",T.SHOW="Show",T.RECREATE="Recreate",T.EXPIRE="Expire",T.START="Start",T.STOP="Stop",T.REDEPLOY="Redeploy",T.RESTART="Restart",e;var T})();let _=(()=>{class T{constructor(){this.CREATE="Create",this.DELETE="Delete",this.ADD="Add",this.SET="Set",this.SUBMIT="Submit",this.REMOVE="Remove",this.UNSET="Unset",this.EDIT="Edit",this.UPDATE="Update",this.CANCEL="Cancel",this.PREVIEW="Preview",this.MOVE="Move",this.NEXT="Next",this.BACK="Back",this.CLONE="Clone",this.COPY="Copy",this.DEEP_SCRUB="Deep Scrub",this.DESTROY="Destroy",this.EVICT="Evict",this.FLATTEN="Flatten",this.MARK_DOWN="Mark Down",this.MARK_IN="Mark In",this.MARK_LOST="Mark Lost",this.MARK_OUT="Mark Out",this.PROTECT="Protect",this.PURGE="Purge",this.RENAME="Rename",this.RESTORE="Restore",this.REWEIGHT="Reweight",this.ROLLBACK="Rollback",this.SCRUB="Scrub",this.SHOW="Show",this.TRASH="Move to Trash",this.UNPROTECT="Unprotect",this.CHANGE="Change",this.FLAGS="Flags",this.ENTER_MAINTENANCE="Enter Maintenance",this.EXIT_MAINTENANCE="Exit Maintenance",this.START_DRAIN="Start Drain",this.STOP_DRAIN="Stop Drain",this.RESYNC="Resync",this.RECREATE="Recreate",this.EXPIRE="Expire",this.START="Start",this.STOP="Stop",this.REDEPLOY="Redeploy",this.RESTART="Restart",this.REMOVE_SCHEDULING="Remove Scheduling",this.PROMOTE="Promote",this.DEMOTE="Demote"}}return T.\u0275fac=function(R){return new(R||T)},T.\u0275prov=u.Yz7({token:T,factory:T.\u0275fac,providedIn:"root"}),T})(),y=(()=>{class T{constructor(){this.CREATED="Created",this.DELETED="Deleted",this.ADDED="Added",this.REMOVED="Removed",this.EDITED="Edited",this.CANCELED="Canceled",this.PREVIEWED="Previewed",this.MOVED="Moved",this.CLONED="Cloned",this.COPIED="Copied",this.DEEP_SCRUBBED="Deep Scrubbed",this.DESTROYED="Destroyed",this.FLATTENED="Flattened",this.MARKED_DOWN="Marked Down",this.MARKED_IN="Marked In",this.MARKED_LOST="Marked Lost",this.MARKED_OUT="Marked Out",this.PROTECTED="Protected",this.PURGED="Purged",this.RENAMED="Renamed",this.RESTORED="Restored",this.REWEIGHTED="Reweighted",this.ROLLED_BACK="Rolled back",this.SCRUBBED="Scrubbed",this.SHOWED="Showed",this.TRASHED="Moved to Trash",this.UNPROTECTED="Unprotected",this.CHANGE="Change",this.RECREATED="Recreated",this.EXPIRED="Expired",this.START="Start",this.STOP="Stop",this.REDEPLOY="Redeploy",this.RESTART="Restart"}}return T.\u0275fac=function(R){return new(R||T)},T.\u0275prov=u.Yz7({token:T,factory:T.\u0275fac,providedIn:"root"}),T})()},2149:(v,S,i)=>{"use strict";i.d(S,{t:()=>R});var r=i(12057),u=i(24751),p=i(6283),f=i(38549),e=i(84051),_=i(37496),y=i(15626),T=i(85953),M=i(74788);let R=(()=>{class F{}return F.\u0275fac=function(J){return new(J||F)},F.\u0275mod=M.oAB({type:F}),F.\u0275inj=M.cJS({imports:[[r.ez,e.xD,_.b,u.u5,f.XC,f.HK,T.D,y.K,p.Bz],e.xD]}),F})()},94928:(v,S,i)=>{"use strict";i.d(S,{K:()=>ue});var r=i(23815),u=i.n(r),p=i(65862),f=i(74788),e=i(12057),_=i(6283),y=i(38549);const T=function(ae){return{disabled:ae}},M=function(ae){return[ae]};function R(ae,$){if(1&ae){const se=f.EpF();f.ynx(0),f.TgZ(1,"button",3),f.NdJ("click",function(){f.CHM(se);const oe=f.oxw();return oe.useClickAction(oe.currentAction)}),f._UZ(2,"i",4),f.TgZ(3,"span"),f._uU(4),f.qZA(),f.qZA(),f.BQk()}if(2&ae){const se=f.oxw();f.xp6(1),f.Gre("btn btn-",se.btnColor,""),f.s9C("title",se.useDisableDesc(se.currentAction)),f.Q6J("ngClass",f.VKq(10,T,se.disableSelectionAction(se.currentAction)))("routerLink",se.useRouterLink(se.currentAction))("preserveFragment",se.currentAction.preserveFragment?"":null),f.uIk("aria-label",se.currentAction.name),f.xp6(1),f.Q6J("ngClass",f.VKq(12,M,se.currentAction.icon)),f.xp6(2),f.Oqu(se.currentAction.name)}}function F(ae,$){if(1&ae&&(f.ynx(0),f._uU(1),f.BQk()),2&ae){const se=f.oxw(2);f.xp6(1),f.hij("",se.dropDownOnly," ")}}function Z(ae,$){1&ae&&f._UZ(0,"span",10)}const J=function(ae){return[ae,"action-icon"]};function Q(ae,$){if(1&ae){const se=f.EpF();f.ynx(0),f.TgZ(1,"button",11),f.NdJ("click",function(){const he=f.CHM(se).$implicit;return f.oxw(2).useClickAction(he)}),f._UZ(2,"i",4),f.TgZ(3,"span"),f._uU(4),f.qZA(),f.qZA(),f.BQk()}if(2&ae){const se=$.$implicit,ve=f.oxw(2);f.xp6(1),f.Tol(ve.toClassName(se)),f.s9C("title",ve.useDisableDesc(se)),f.Q6J("routerLink",ve.useRouterLink(se))("preserveFragment",se.preserveFragment?"":null)("disabled",ve.disableSelectionAction(se)),f.uIk("aria-label",se.name),f.xp6(1),f.Q6J("ngClass",f.VKq(10,J,se.icon)),f.xp6(2),f.Oqu(se.name)}}function ee(ae,$){if(1&ae&&(f.TgZ(0,"div",5),f.TgZ(1,"button",6),f.YNc(2,F,2,1,"ng-container",1),f.YNc(3,Z,1,0,"span",7),f.qZA(),f.TgZ(4,"div",8),f.YNc(5,Q,5,12,"ng-container",9),f.qZA(),f.qZA()),2&ae){const se=f.oxw();f.xp6(1),f.Gre("btn btn-",se.btnColor," dropdown-toggle-split"),f.xp6(1),f.Q6J("ngIf",se.dropDownOnly),f.xp6(1),f.Q6J("ngIf",!se.dropDownOnly),f.xp6(2),f.Q6J("ngForOf",se.dropDownActions)}}let ue=(()=>{class ae{constructor(){this.btnColor="accent",this.dropDownActions=[],this.icons=p.P}ngOnInit(){this.removeActionsWithNoPermissions(),this.onSelectionChange()}ngOnChanges(se){se.selection&&this.onSelectionChange()}onSelectionChange(){this.updateDropDownActions(),this.updateCurrentAction()}toClassName(se){return se.name.replace(/ /g,"-").replace(/[^a-z-]/gi,"").toLowerCase()}removeActionsWithNoPermissions(){if(!this.permission)return void(this.tableActions=[]);const se=Object.keys(this.permission).filter(ve=>this.permission[ve]);this.tableActions=this.tableActions.filter(ve=>se.includes(ve.permission))}updateDropDownActions(){this.dropDownActions=this.tableActions.filter(se=>se.visible?se.visible(this.selection):se)}updateCurrentAction(){if(this.dropDownOnly)return void(this.currentAction=void 0);let se=this.dropDownActions.find(ve=>this.showableAction(ve));!se&&this.dropDownActions.length>0&&(se=this.dropDownActions[0]),this.currentAction=se}showableAction(se){const ve=se.canBePrimary,oe=this.selection.hasSingleSelection,he="create"===se.permission?!oe:oe;return ve&&ve(this.selection)||!ve&&he}useRouterLink(se){if(se.routerLink&&!this.disableSelectionAction(se))return u().isString(se.routerLink)?se.routerLink:se.routerLink()}disableSelectionAction(se){const ve=se.disable;if(ve)return Boolean(ve(this.selection));const oe=se.permission,he=this.selection.hasSingleSelection&&this.selection.first();return Boolean(["update","delete"].includes(oe)&&(!he||he.cdExecuting))}useClickAction(se){return!this.disableSelectionAction(se)&&se.click&&se.click()}useDisableDesc(se){if(se.disable){const ve=se.disable(this.selection);return u().isString(ve)?ve:void 0}}}return ae.\u0275fac=function(se){return new(se||ae)},ae.\u0275cmp=f.Xpm({type:ae,selectors:[["cd-table-actions"]],inputs:{permission:"permission",selection:"selection",tableActions:"tableActions",btnColor:"btnColor",dropDownOnly:"dropDownOnly"},features:[f.TTD],decls:3,vars:2,consts:[[1,"btn-group"],[4,"ngIf"],["class","btn-group","ngbDropdown","","role","group","aria-label","Button group with nested dropdown",4,"ngIf"],["type","button",3,"title","ngClass","routerLink","preserveFragment","click"],[3,"ngClass"],["ngbDropdown","","role","group","aria-label","Button group with nested dropdown",1,"btn-group"],["ngbDropdownToggle",""],["class","sr-only",4,"ngIf"],["ngbDropdownMenu","",1,"dropdown-menu"],[4,"ngFor","ngForOf"],[1,"sr-only"],["ngbDropdownItem","",3,"title","routerLink","preserveFragment","disabled","click"]],template:function(se,ve){1&se&&(f.TgZ(0,"div",0),f.YNc(1,R,5,14,"ng-container",1),f.YNc(2,ee,6,6,"div",2),f.qZA()),2&se&&(f.xp6(1),f.Q6J("ngIf",ve.currentAction),f.xp6(1),f.Q6J("ngIf",ve.dropDownActions.length>1))},directives:[e.O5,e.mk,_.rH,y.jt,y.iD,y.Vi,e.sg,y.TH],styles:["button.disabled[_ngcontent-%COMP%]{cursor:default!important;pointer-events:auto}.action-icon[_ngcontent-%COMP%]{padding-right:1.5rem}"]}),ae})()},61350:(v,S,i)=>{"use strict";i.d(S,{b:()=>y});var r=i(74788),u=i(23815),p=i.n(u),f=i(99466),e=i(35905),_=i(96102);let y=(()=>{class T{constructor(R){this.datePipe=R,this.autoReload=5e3,this.renderObjects=!1,this.appendParentKey=!0,this.hideEmpty=!1,this.hideKeys=[],this.columns=[],this.fetchData=new r.vpe}ngOnInit(){this.columns=[{prop:"key",flexGrow:1,cellTransformation:f.e.bold},{prop:"value",flexGrow:3}],this.customCss&&(this.columns[1].cellTransformation=f.e.classAdding),this.fetchData.observers.length>0&&this.table.fetchData.subscribe(()=>{this.fetchData.emit()}),this.useData()}ngOnChanges(){this.useData()}useData(){if(!this.data)return;let R=this.makePairs(this.data);this.hideKeys&&(R=R.filter(F=>!this.hideKeys.includes(F.key))),this.tableData=R}makePairs(R){let F=[];if(R){if(p().isArray(R))F=this.makePairsFromArray(R);else{if(!p().isObject(R))throw new Error("Wrong data format");F=this.makePairsFromObject(R)}return F=F.map(Z=>(Z.value=this.convertValue(Z.value),Z)).filter(Z=>null!==Z.value),p().sortBy(this.renderObjects?this.insertFlattenObjects(F):F,"key")}}makePairsFromArray(R){let F=[];const Z=R[0];if(p().isArray(Z)){if(2!==Z.length)throw new Error(`Array contains too many elements (${Z.length}). Needs to be of type [string, any][]`);F=R.map(J=>({key:J[0],value:J[1]}))}else p().isObject(Z)&&(F=p().has(Z,"key")&&p().has(Z,"value")?[...R]:R.reduce((J,Q)=>J.concat(this.makePairsFromObject(Q)),F));return F}makePairsFromObject(R){return Object.keys(R).map(F=>({key:F,value:R[F]}))}insertFlattenObjects(R){return p().flattenDeep(R.map(F=>{const Z=F.value,J=p().isObject(Z);return!J||p().isEmpty(Z)?(J&&(F.value=""),F):this.splitItemIntoItems(F)}))}splitItemIntoItems(R){return this.makePairs(R.value).map(F=>(this.appendParentKey&&(F.key=R.key+" "+F.key),F))}convertValue(R){if(p().isArray(R)){if(p().isEmpty(R)&&this.hideEmpty)return null;R=R.map(F=>p().isObject(F)?JSON.stringify(F):F).join(", ")}else if(p().isObject(R)){if(this.hideEmpty&&p().isEmpty(R)||!this.renderObjects)return null}else if(p().isString(R)){if(""===R&&this.hideEmpty)return null;this.isDate(R)&&(R=this.datePipe.transform(R)||R)}return R}isDate(R){const F="[ -:.TZ]",Z="\\d{2}"+F;return R.match(new RegExp("^\\d{4}"+F+Z+Z+Z+Z+Z+"\\d*Z?$"))}}return T.\u0275fac=function(R){return new(R||T)(r.Y36(_.N))},T.\u0275cmp=r.Xpm({type:T,selectors:[["cd-table-key-value"]],viewQuery:function(R,F){if(1&R&&r.Gf(e.a,7),2&R){let Z;r.iGM(Z=r.CRH())&&(F.table=Z.first)}},inputs:{data:"data",autoReload:"autoReload",renderObjects:"renderObjects",appendParentKey:"appendParentKey",hideEmpty:"hideEmpty",hideKeys:"hideKeys",customCss:"customCss"},outputs:{fetchData:"fetchData"},features:[r.TTD],decls:2,vars:9,consts:[["columnMode","flex",3,"data","columns","toolHeader","autoReload","customCss","autoSave","header","footer","limit"],["table",""]],template:function(R,F){1&R&&r._UZ(0,"cd-table",0,1),2&R&&r.Q6J("data",F.tableData)("columns",F.columns)("toolHeader",!1)("autoReload",F.autoReload)("customCss",F.customCss)("autoSave",!1)("header",!1)("footer",!1)("limit",0)},directives:[e.a],styles:[""]}),T})()},35905:(v,S,i)=>{"use strict";i.d(S,{a:()=>so});var r=i(74788),u=i(84051),p=i(23815),f=i.n(p),e=i(25917),_=i(18891),y=i(71225),T=i(99466),M=i(65862),R=i(86919),F=i(68774),Z=i(46947),J=i(12057),Q=i(38549),ee=i(24751),ue=i(76446),ae=i(6283),$=i(70442),se=i(66369),ve=i(37496),oe=i(47187),he=i(78877),me=i(52821),Oe=i(96102),ce=i(90068);const dt=["tableCellBoldTpl"],ze=["sparklineTpl"],Ye=["routerLinkTpl"],je=["checkIconTpl"],Ie=["perSecondTpl"],Ve=["executingTpl"],He=["classAddingTpl"],Zt=["badgeTpl"],st=["mapTpl"],en=["truncateTpl"],$t=["timeAgoTpl"],Gt=["rowDetailsTpl"];function Ut(Ze,Dr){1&Ze&&(r.TgZ(0,"div",21),r.TgZ(1,"div",22),r.Hsn(2),r.qZA(),r.qZA())}function Bt(Ze,Dr){if(1&Ze){const jt=r.EpF();r.ynx(0),r.TgZ(1,"button",37),r.NdJ("click",function(){const Wn=r.CHM(jt).$implicit;return r.oxw(3).onSelectFilter(Wn),!1}),r._uU(2),r.qZA(),r.BQk()}if(2&Ze){const jt=Dr.$implicit;r.xp6(2),r.Oqu(jt.column.name)}}const mt=function(Ze){return[Ze]};function Yt(Ze,Dr){if(1&Ze&&r._UZ(0,"i",29),2&Ze){const jt=r.oxw(4);r.Q6J("ngClass",r.VKq(1,mt,jt.icons.check))}}function Dt(Ze,Dr){if(1&Ze){const jt=r.EpF();r.ynx(0),r.TgZ(1,"button",37),r.NdJ("click",function(){const Wn=r.CHM(jt).$implicit,kn=r.oxw(3);return kn.onChangeFilter(kn.selectedFilter,Wn),!1}),r._uU(2),r.YNc(3,Yt,1,3,"i",38),r.qZA(),r.BQk()}if(2&Ze){const jt=Dr.$implicit,xt=r.oxw(3);r.xp6(2),r.hij(" ",jt.formatted," "),r.xp6(1),r.Q6J("ngIf",void 0!==xt.selectedFilter.value&&xt.selectedFilter.value.raw===jt.raw)}}const zt=function(Ze,Dr){return[Ze,Dr]};function Yn(Ze,Dr){if(1&Ze&&(r.TgZ(0,"div",33),r.TgZ(1,"div",34),r.TgZ(2,"button",35),r._UZ(3,"i",29),r._uU(4),r.qZA(),r.TgZ(5,"div",30),r.YNc(6,Bt,3,1,"ng-container",31),r.qZA(),r.qZA(),r.TgZ(7,"div",36),r.TgZ(8,"button",35),r._uU(9),r.qZA(),r.TgZ(10,"div",30),r.YNc(11,Dt,4,2,"ng-container",31),r.qZA(),r.qZA(),r.qZA()),2&Ze){const jt=r.oxw(2);r.xp6(3),r.Q6J("ngClass",r.WLB(7,zt,jt.icons.large,jt.icons.filter)),r.xp6(1),r.hij(" ",jt.selectedFilter.column.name," "),r.xp6(2),r.Q6J("ngForOf",jt.columnFilters),r.xp6(2),r.ekj("disabled",0===jt.selectedFilter.options.length),r.xp6(1),r.hij(" ",jt.selectedFilter.value?jt.selectedFilter.value.formatted:"Any"," "),r.xp6(2),r.Q6J("ngForOf",jt.selectedFilter.options)}}function Hr(Ze,Dr){if(1&Ze){const jt=r.EpF();r.TgZ(0,"div",39),r.TgZ(1,"span",40),r.TgZ(2,"span",41),r._UZ(3,"i",29),r.qZA(),r.qZA(),r.TgZ(4,"input",42),r.NdJ("ngModelChange",function(mn){return r.CHM(jt),r.oxw(2).search=mn})("keyup",function(){return r.CHM(jt),r.oxw(2).updateFilter()}),r.qZA(),r.TgZ(5,"div",43),r.TgZ(6,"button",44),r.NdJ("click",function(){return r.CHM(jt),r.oxw(2).onClearSearch()}),r._UZ(7,"i"),r.qZA(),r.qZA(),r.qZA()}if(2&Ze){const jt=r.oxw(2);r.xp6(3),r.Q6J("ngClass",r.VKq(5,mt,jt.icons.search)),r.xp6(1),r.Q6J("ngModel",jt.search),r.xp6(3),r.Gre("icon-prepend ",jt.icons.destroy,"")}}function ci(Ze,Dr){if(1&Ze){const jt=r.EpF();r.TgZ(0,"div",45),r.TgZ(1,"input",46),r.NdJ("click",function(mn){return r.CHM(jt),r.oxw(2).setLimit(mn)})("keyup",function(mn){return r.CHM(jt),r.oxw(2).setLimit(mn)})("blur",function(mn){return r.CHM(jt),r.oxw(2).setLimit(mn)}),r.qZA(),r.qZA()}if(2&Ze){const jt=r.oxw(2);r.xp6(1),r.Q6J("value",jt.userConfig.limit)}}function Ir(Ze,Dr){if(1&Ze){const jt=r.EpF();r.TgZ(0,"button",37),r.NdJ("click",function(){r.CHM(jt);const mn=r.oxw().$implicit;return r.oxw(2).toggleColumn(mn),!1}),r.TgZ(1,"div",48),r._UZ(2,"input",49),r.TgZ(3,"label",50),r._uU(4),r.qZA(),r.qZA(),r.qZA()}if(2&Ze){const jt=r.oxw().$implicit;r.xp6(2),r.Q6J("name",jt.prop)("id",jt.prop)("checked",!jt.isHidden),r.xp6(1),r.Q6J("for",jt.prop),r.xp6(1),r.Oqu(jt.name)}}function wr(Ze,Dr){if(1&Ze&&(r.ynx(0),r.YNc(1,Ir,5,5,"button",47),r.BQk()),2&Ze){const jt=Dr.$implicit;r.xp6(1),r.Q6J("ngIf",""!==jt.name)}}function Qr(Ze,Dr){if(1&Ze){const jt=r.EpF();r.TgZ(0,"div",51),r.TgZ(1,"button",52),r.NdJ("click",function(){return r.CHM(jt),r.oxw(2).refreshBtn()}),r._UZ(2,"i",29),r.qZA(),r.qZA()}if(2&Ze){const jt=r.oxw(2);r.xp6(1),r.Tol("btn btn-"+jt.status.type),r.Q6J("ngbTooltip",jt.status.msg),r.xp6(1),r.ekj("fa-spin",jt.updating||jt.loadingIndicator),r.Q6J("ngClass",r.WLB(6,zt,jt.icons.large,jt.icons.refresh))}}function Kr(Ze,Dr){if(1&Ze&&(r.TgZ(0,"div",21),r.TgZ(1,"div",22),r.Hsn(2,1),r.qZA(),r.YNc(3,Yn,12,10,"div",23),r.YNc(4,Hr,8,7,"div",24),r.YNc(5,ci,2,1,"div",25),r.TgZ(6,"div",26),r.TgZ(7,"div",27),r.TgZ(8,"button",28),r._UZ(9,"i",29),r.qZA(),r.TgZ(10,"div",30),r.YNc(11,wr,2,1,"ng-container",31),r.qZA(),r.qZA(),r.qZA(),r.YNc(12,Qr,3,9,"div",32),r.qZA()),2&Ze){const jt=r.oxw();r.xp6(3),r.Q6J("ngIf",0!==jt.columnFilters.length),r.xp6(1),r.Q6J("ngIf",jt.searchField),r.xp6(1),r.Q6J("ngIf",jt.limit),r.xp6(4),r.Q6J("ngClass",r.WLB(6,zt,jt.icons.large,jt.icons.table)),r.xp6(2),r.Q6J("ngForOf",jt.columns),r.xp6(1),r.Q6J("ngIf",jt.fetchData.observers.length>0)}}function In(Ze,Dr){if(1&Ze){const jt=r.EpF();r.TgZ(0,"span",57),r.TgZ(1,"span",58),r._uU(2),r.qZA(),r.TgZ(3,"a",59),r.NdJ("click",function(){r.CHM(jt);const mn=r.oxw().$implicit;return r.oxw(2).onChangeFilter(mn),!1}),r._UZ(4,"i",60),r.qZA(),r.qZA()}if(2&Ze){const jt=r.oxw().$implicit,xt=r.oxw(2);r.xp6(2),r.AsE("",jt.column.name,": ",jt.value.formatted,""),r.xp6(2),r.Q6J("ngClass",r.VKq(3,mt,xt.icons.destroy))}}function Hn(Ze,Dr){if(1&Ze&&(r.TgZ(0,"span"),r.YNc(1,In,5,5,"span",56),r.qZA()),2&Ze){const jt=Dr.$implicit;r.xp6(1),r.Q6J("ngIf",jt.value)}}function Zr(Ze,Dr){if(1&Ze){const jt=r.EpF();r.TgZ(0,"div",21),r.TgZ(1,"div",53),r.YNc(2,Hn,2,1,"span",31),r.TgZ(3,"a",54),r.NdJ("click",function(){return r.CHM(jt),r.oxw().onClearFilters(),!1}),r.ynx(4),r.SDv(5,55),r.BQk(),r.qZA(),r.qZA(),r.qZA()}if(2&Ze){const jt=r.oxw();r.xp6(2),r.Q6J("ngForOf",jt.columnFilters)}}function Ur(Ze,Dr){1&Ze&&r.Hsn(0,2)}function di(Ze,Dr){if(1&Ze&&(r.TgZ(0,"span"),r._uU(1),r.ynx(2),r.SDv(3,66),r.BQk(),r._uU(4," / "),r.qZA()),2&Ze){const jt=r.oxw().selectedCount;r.xp6(1),r.hij(" ",jt," ")}}function $i(Ze,Dr){if(1&Ze&&(r.TgZ(0,"span"),r._uU(1),r.ynx(2),r.SDv(3,68),r.BQk(),r._uU(4," / "),r.qZA()),2&Ze){const jt=r.oxw(2).rowCount;r.xp6(1),r.hij(" ",jt," ")}}function Hi(Ze,Dr){if(1&Ze&&(r.TgZ(0,"span"),r.YNc(1,$i,5,1,"span",62),r._uU(2),r.ynx(3),r.SDv(4,67),r.BQk(),r.qZA()),2&Ze){const jt=r.oxw().rowCount,xt=r.oxw();r.xp6(1),r.Q6J("ngIf",jt!=(null==xt.data?null:xt.data.length)),r.xp6(1),r.hij(" ",(null==xt.data?null:xt.data.length)||0," ")}}function Br(Ze,Dr){if(1&Ze&&(r._uU(0),r.ynx(1),r.SDv(2,69),r.BQk(),r._uU(3),r.ynx(4),r.SDv(5,70),r.BQk()),2&Ze){const jt=r.oxw().rowCount,xt=r.oxw();r.hij(" ",(null==xt.data?null:xt.data.length)||0," "),r.xp6(3),r.hij(" / ",jt," ")}}function On(Ze,Dr){if(1&Ze){const jt=r.EpF();r.TgZ(0,"div",61),r.YNc(1,di,5,1,"span",62),r.YNc(2,Hi,5,2,"span",63),r.YNc(3,Br,6,2,"ng-template",null,64,r.W1O),r.qZA(),r.TgZ(5,"datatable-pager",65),r.NdJ("change",function(mn){return r.CHM(jt),r.oxw(),r.MAs(5).onFooterPage(mn)}),r.qZA()}if(2&Ze){const jt=Dr.rowCount,xt=Dr.pageSize,mn=Dr.curPage,Wn=r.MAs(4),kn=r.oxw();r.xp6(1),r.Q6J("ngIf",kn.selectionType),r.xp6(1),r.Q6J("ngIf",!kn.serverSide)("ngIfElse",Wn),r.xp6(3),r.Q6J("pagerLeftArrowIcon",kn.paginationClasses.pagerPrevious)("pagerRightArrowIcon",kn.paginationClasses.pagerNext)("pagerPreviousIcon",kn.paginationClasses.pagerLeftArrow)("pagerNextIcon",kn.paginationClasses.pagerRightArrow)("page",mn)("size",xt)("count",jt)("hidden",!(jt/xt>1))}}function Wt(Ze,Dr){if(1&Ze&&(r.TgZ(0,"strong"),r._uU(1),r.qZA()),2&Ze){const jt=Dr.value;r.xp6(1),r.Oqu(jt)}}function Jn(Ze,Dr){if(1&Ze&&r._UZ(0,"cd-sparkline",71),2&Ze){const jt=Dr.row;r.Q6J("data",Dr.value)("isBinary",jt.cdIsBinary)}}function ir(Ze,Dr){if(1&Ze&&(r.TgZ(0,"a",72),r._uU(1),r.qZA()),2&Ze){const jt=Dr.row,xt=Dr.value;r.Q6J("routerLink",r.VKq(3,mt,jt.cdLink))("queryParams",jt.cdParams),r.xp6(1),r.Oqu(xt)}}function Lr(Ze,Dr){if(1&Ze&&(r._UZ(0,"i",73),r.ALo(1,"boolean")),2&Ze){const jt=Dr.value,xt=r.oxw();r.Q6J("ngClass",r.VKq(4,mt,xt.icons.check))("hidden",!r.lcZ(1,2,jt))}}function Vn(Ze,Dr){1&Ze&&(r._uU(0),r.ALo(1,"dimless")),2&Ze&&r.hij(" ",r.lcZ(1,1,Dr.value)," /s\n")}function zr(Ze,Dr){if(1&Ze&&r._UZ(0,"i",29),2&Ze){const jt=r.oxw(2);r.Q6J("ngClass",r.WLB(1,zt,jt.icons.spinner,jt.icons.spin))}}function hi(Ze,Dr){if(1&Ze&&(r.TgZ(0,"span",29),r._uU(1),r.qZA()),2&Ze){const jt=r.oxw(),xt=jt.column,mn=jt.row;r.Q6J("ngClass",null!=xt&&null!=xt.customTemplateConfig&&xt.customTemplateConfig.executingClass?xt.customTemplateConfig.executingClass:"text-muted italic"),r.xp6(1),r.hij("(",mn.cdExecuting,")")}}function Ai(Ze,Dr){if(1&Ze&&(r.YNc(0,zr,1,4,"i",38),r.TgZ(1,"span",29),r._uU(2),r.qZA(),r.YNc(3,hi,2,2,"span",38)),2&Ze){const jt=Dr.column,xt=Dr.row,mn=Dr.value;r.Q6J("ngIf",xt.cdExecuting),r.xp6(1),r.Q6J("ngClass",null==jt||null==jt.customTemplateConfig?null:jt.customTemplateConfig.valueClass),r.xp6(1),r.hij(" ",mn," "),r.xp6(1),r.Q6J("ngIf",xt.cdExecuting)}}function Tr(Ze,Dr){if(1&Ze&&(r.TgZ(0,"span"),r.ALo(1,"pipeFunction"),r._uU(2),r.qZA()),2&Ze){const jt=Dr.value,xt=r.oxw();r.Tol(r.Dn7(1,4,jt,xt.useCustomClass,xt)),r.xp6(2),r.Oqu(jt)}}function Nr(Ze,Dr){if(1&Ze&&(r.TgZ(0,"span",75),r._uU(1),r.qZA()),2&Ze){const jt=r.oxw().$implicit,xt=r.oxw().column;r.Q6J("ngClass",null!=xt&&null!=xt.customTemplateConfig&&xt.customTemplateConfig.map&&null!=xt&&null!=xt.customTemplateConfig&&null!=xt.customTemplateConfig.map[jt]&&xt.customTemplateConfig.map[jt].class?xt.customTemplateConfig.map[jt].class:null!=xt&&null!=xt.customTemplateConfig&&xt.customTemplateConfig.class?xt.customTemplateConfig.class:"badge-primary"),r.xp6(1),r.hij(" ",null!=xt&&null!=xt.customTemplateConfig&&xt.customTemplateConfig.map&&null!=xt&&null!=xt.customTemplateConfig&&null!=xt.customTemplateConfig.map[jt]&&xt.customTemplateConfig.map[jt].value?xt.customTemplateConfig.map[jt].value:null!=xt&&null!=xt.customTemplateConfig&&xt.customTemplateConfig.prefix?xt.customTemplateConfig.prefix+jt:jt," ")}}function gn(Ze,Dr){1&Ze&&(r.TgZ(0,"span"),r._uU(1,"\xa0"),r.qZA())}function En(Ze,Dr){if(1&Ze&&(r.TgZ(0,"span"),r.YNc(1,Nr,2,2,"span",74),r.YNc(2,gn,2,0,"span",62),r.qZA()),2&Ze){const jt=Dr.$implicit,xt=Dr.last,mn=r.oxw().column;r.xp6(1),r.Q6J("ngIf",null!=mn&&null!=mn.customTemplateConfig&&mn.customTemplateConfig.map&&null!=mn&&null!=mn.customTemplateConfig&&null!=mn.customTemplateConfig.map[jt]&&mn.customTemplateConfig.map[jt].value?mn.customTemplateConfig.map[jt].value:null!=mn&&null!=mn.customTemplateConfig&&mn.customTemplateConfig.prefix?mn.customTemplateConfig.prefix+jt:jt),r.xp6(1),r.Q6J("ngIf",!xt)}}function mr(Ze,Dr){1&Ze&&(r.YNc(0,En,3,2,"span",31),r.ALo(1,"array")),2&Ze&&r.Q6J("ngForOf",r.lcZ(1,1,Dr.value))}function Xt(Ze,Dr){if(1&Ze&&(r.TgZ(0,"span"),r._uU(1),r.ALo(2,"map"),r.qZA()),2&Ze){const jt=Dr.column,xt=Dr.value;r.xp6(1),r.Oqu(r.xi3(2,1,xt,null==jt?null:jt.customTemplateConfig))}}function zn(Ze,Dr){if(1&Ze&&(r.TgZ(0,"span",76),r._uU(1),r.ALo(2,"truncate"),r.qZA()),2&Ze){const jt=Dr.column,xt=Dr.value;r.Q6J("title",xt),r.xp6(1),r.Oqu(r.Dn7(2,2,xt,null==jt||null==jt.customTemplateConfig?null:jt.customTemplateConfig.length,null==jt||null==jt.customTemplateConfig?null:jt.customTemplateConfig.omission))}}function vr(Ze,Dr){if(1&Ze){const jt=r.EpF();r.TgZ(0,"a",77),r.NdJ("click",function(mn){const Wn=r.CHM(jt),kn=Wn.row,wn=Wn.expanded;return r.oxw().toggleExpandRow(kn,wn,mn)}),r.qZA()}if(2&Ze){const jt=Dr.expanded;r.ekj("expand-collapse-icon-right",!jt)("expand-collapse-icon-down",jt)}}function si(Ze,Dr){if(1&Ze&&(r.TgZ(0,"span",76),r.ALo(1,"cdDate"),r._uU(2),r.ALo(3,"relativeDate"),r.qZA()),2&Ze){const jt=Dr.value;r.Q6J("title",r.lcZ(1,2,jt)),r.xp6(2),r.Oqu(r.lcZ(3,4,jt))}}const Ii=[[["",8,"only-table-actions"]],[["",8,"table-actions"]],[["","cdTableDetail",""]]],no=[".only-table-actions",".table-actions","[cdTableDetail]"];let so=(()=>{class Ze{constructor(jt,xt){this.cdRef=jt,this.timerService=xt,this.columnMode="flex",this.onlyActionHeader=!1,this.toolHeader=!0,this.searchField=!0,this.header=!0,this.footer=!0,this.limit=10,this.maxLimit=9999,this.hasDetails=!1,this.autoReload=5e3,this.identifier="id",this.forceIdentifier=!1,this.selectionType=void 0,this.updateSelectionOnRefresh="onChange",this.updateExpandedOnRefresh="onChange",this.autoSave=!0,this.searchableObjects=!1,this.extraFilterableColumns=[],this.status=new y.c,this.serverSide=!1,this.count=0,this.fetchData=new r.vpe,this.updateSelection=new r.vpe,this.setExpandedRow=new r.vpe,this.columnFiltersChanged=new r.vpe,this.selection=new F.r,this.expanded=void 0,this.icons=M.P,this.cellTemplates={},this.search="",this.rows=[],this.loadingIndicator=!0,this.paginationClasses={pagerLeftArrow:M.P.leftArrowDouble,pagerRightArrow:M.P.rightArrowDouble,pagerPrevious:M.P.leftArrow,pagerNext:M.P.rightArrow},this.userConfig={},this.localStorage=window.localStorage,this.updating=!1,this.columnFilters=[]}get columnFiltered(){return f().some(this.columnFilters,jt=>void 0!==jt.value)}static prepareSearch(jt){return(jt=jt.toLowerCase().replace(/,/g,"")).match(/['"][^'"]+['"]/)&&(jt=jt.replace(/['"][^'"]+['"]/g,xt=>xt.replace(/(['"])([^'"]+)(['"])/g,"$2").replace(/ /g,"+"))),jt.split(" ").filter(xt=>xt)}ngOnInit(){if(this.localColumns=f().clone(this.columns),this.serverSide&&(this.reloadData=f().debounce(this.reloadData,1e3)),this.table.element.addEventListener("mouseenter",jt=>jt.stopPropagation()),this._addTemplates(),!this.sorts){const jt=-1!==f().findIndex(this.localColumns,["prop",this.identifier]);this.sorts=this.createSortingDefinition(jt?this.identifier:this.localColumns[0].prop+""),!jt&&!this.forceIdentifier&&(this.identifier=this.localColumns[0].prop+"")}this.initUserConfig(),this.localColumns.forEach(jt=>{jt.cellTransformation&&(jt.cellTemplate=this.cellTemplates[jt.cellTransformation]),jt.flexGrow||(jt.flexGrow=jt.prop+""===this.identifier?1:2),jt.resizeable||(jt.resizeable=!1)}),this.initExpandCollapseColumn(),this.initCheckboxColumn(),this.filterHiddenColumns(),this.initColumnFilters(),this.updateColumnFilterOptions(),this.updateSelection.emit(new F.r),this.fetchData.observers.length>0&&(this.loadingIndicator=!0),f().isInteger(this.autoReload)&&this.autoReload>0?this.reloadSubscriber=this.timerService.get(()=>(0,e.of)(0),this.autoReload).subscribe(()=>{this.reloadData()}):this.autoReload?this.useData():this.reloadData(),"single"===this.selectionType&&(this.table.selectCheck=this.singleSelectCheck.bind(this))}initUserConfig(){this.autoSave&&(this.tableName=this._calculateUniqueTableName(this.localColumns),this._loadUserConfig(),this._initUserConfigAutoSave()),this.userConfig.limit||(this.userConfig.limit=this.limit),this.userConfig.offset>=0||(this.userConfig.offset=this.table.offset),this.userConfig.search||(this.userConfig.search=this.search),this.userConfig.sorts||(this.userConfig.sorts=this.sorts),this.userConfig.columns?this.userConfig.columns.forEach(jt=>{for(let xt=0;xt<this.localColumns.length;xt++)this.localColumns[xt].prop===jt.prop&&(this.localColumns[xt].isHidden=jt.isHidden)}):this.updateUserColumns()}_calculateUniqueTableName(jt){const xt=mn=>{if(!f().isString(mn))return 0;let Wn=0;for(let kn=0;kn<mn.length;kn++)Wn+=mn.charCodeAt(kn)*kn;return Wn};return jt.reduce((mn,Wn,kn)=>(xt(Wn.prop)+xt(Wn.name))*(kn+1)+mn,0).toString()}_loadUserConfig(){const jt=this.localStorage.getItem(this.tableName);jt&&(this.userConfig=JSON.parse(jt))}_initUserConfigAutoSave(){const jt=new _.y(this._initUserConfigProxy.bind(this));this.saveSubscriber=jt.subscribe(this._saveUserConfig.bind(this))}_initUserConfigProxy(jt){this.userConfig=new Proxy(this.userConfig,{set:(xt,mn,Wn)=>(xt[mn]=Wn,jt.next(xt),!0)})}_saveUserConfig(jt){this.localStorage.setItem(this.tableName,JSON.stringify(jt))}updateUserColumns(){this.userConfig.columns=this.localColumns.map(jt=>({prop:jt.prop,name:jt.name,isHidden:!!jt.isHidden}))}initCheckboxColumn(){"multiClick"===this.selectionType&&this.localColumns.unshift({prop:void 0,resizeable:!1,sortable:!1,draggable:!1,checkboxable:!0,canAutoResize:!1,cellClass:"cd-datatable-checkbox",width:30})}initExpandCollapseColumn(){this.hasDetails&&this.localColumns.unshift({prop:void 0,resizeable:!1,sortable:!1,draggable:!1,isHidden:!1,canAutoResize:!1,cellClass:"cd-datatable-expand-collapse",width:40,cellTemplate:this.rowDetailsTpl})}filterHiddenColumns(){this.tableColumns=this.localColumns.filter(jt=>!jt.isHidden)}initColumnFilters(){let jt=f().filter(this.localColumns,{filterable:!0});jt=[...jt,...this.extraFilterableColumns],this.columnFilters=jt.map(xt=>({column:xt,options:[],value:xt.filterInitValue?this.createColumnFilterOption(xt.filterInitValue,xt.pipe):void 0})),this.selectedFilter=f().first(this.columnFilters)}createColumnFilterOption(jt,xt){return{raw:f().toString(jt),formatted:xt?xt.transform(jt):f().toString(jt)}}updateColumnFilterOptions(){this.columnFilters.forEach(jt=>{let xt=[];if(f().isUndefined(jt.column.filterOptions)){const Wn=f().filter(f().map(this.data,jt.column.prop),kn=>f().isString(kn)&&""!==kn||f().isBoolean(kn)||f().isFinite(kn)||f().isDate(kn));xt=f().sortedUniq(Wn.sort())}else xt=jt.column.filterOptions;const mn=xt.map(Wn=>this.createColumnFilterOption(Wn,jt.column.pipe));jt.value&&f().isUndefined(f().find(mn,{raw:jt.value.raw}))&&(jt.value=void 0),jt.options=mn})}onSelectFilter(jt){this.selectedFilter=jt}onChangeFilter(jt,xt){jt.value=f().isEqual(jt.value,xt)?void 0:xt,this.updateFilter()}doColumnFiltering(){const jt=[];let xt=[...this.data],mn=[];return this.columnFilters.forEach(Wn=>{if(void 0===Wn.value)return;jt.push({name:Wn.column.name,prop:Wn.column.prop,value:Wn.value});const kn=f().partition(xt,wn=>{const Gi=(0,u.Hg)(Wn.column.prop)(wn,Wn.column.prop);return f().isUndefined(Wn.column.filterPredicate)?`${Gi}`===Wn.value.raw:Wn.column.filterPredicate(wn,Wn.value.raw)});xt=kn[0],mn=[...mn,...kn[1]]}),this.columnFiltersChanged.emit({filters:jt,data:xt,dataOut:mn}),f().forEach(this.selection.selected,Wn=>{void 0===f().find(xt,{[this.identifier]:Wn[this.identifier]})&&(this.selection=new F.r,this.onSelect(this.selection))}),xt}ngOnDestroy(){this.reloadSubscriber&&this.reloadSubscriber.unsubscribe(),this.saveSubscriber&&this.saveSubscriber.unsubscribe()}ngAfterContentChecked(){this.table&&this.table.element.clientWidth!==this.currentWidth&&(this.currentWidth=this.table.element.clientWidth,this.table.recalculate(),f().get(this.table,"cd").markForCheck())}_addTemplates(){this.cellTemplates.bold=this.tableCellBoldTpl,this.cellTemplates.checkIcon=this.checkIconTpl,this.cellTemplates.sparkline=this.sparklineTpl,this.cellTemplates.routerLink=this.routerLinkTpl,this.cellTemplates.perSecond=this.perSecondTpl,this.cellTemplates.executing=this.executingTpl,this.cellTemplates.classAdding=this.classAddingTpl,this.cellTemplates.badge=this.badgeTpl,this.cellTemplates.map=this.mapTpl,this.cellTemplates.truncate=this.truncateTpl,this.cellTemplates.timeAgo=this.timeAgoTpl}useCustomClass(jt){if(!this.customCss)throw new Error("Custom classes are not set!");const xt=Object.keys(this.customCss),mn=Object.values(this.customCss).map((Wn,kn)=>(f().isFunction(Wn)&&Wn(jt)||Wn===jt)&&xt[kn]).filter(Wn=>Wn).join(" ");return f().isEmpty(mn)?void 0:mn}ngOnChanges(jt){jt.data&&jt.data.currentValue&&this.useData()}setLimit(jt){const xt=Number(jt.target.value);xt>0&&(this.maxLimit&&xt>this.maxLimit?(this.userConfig.limit=this.maxLimit,jt.srcElement.value=this.maxLimit):this.userConfig.limit=xt),this.serverSide&&this.reloadData()}reloadData(){var jt;if(!this.updating){this.status=new y.c;const xt=new R.E(()=>{xt.errorConfig.displayError&&(this.status=new y.c("danger","Failed to load data.")),xt.errorConfig.resetData&&(this.data=[]),this.useData()});if(xt.pageInfo.offset=this.userConfig.offset,xt.pageInfo.limit=this.userConfig.limit,xt.search=this.userConfig.search,null===(jt=this.userConfig.sorts)||void 0===jt?void 0:jt.length){const mn=this.userConfig.sorts[0];xt.sort=`${"desc"===mn.dir?"-":"+"}${mn.prop}`}this.fetchData.emit(xt),this.updating=!0}}refreshBtn(){this.loadingIndicator=!0,this.reloadData()}changePage(jt){this.userConfig.offset=jt.offset,this.userConfig.limit=jt.limit,this.serverSide&&this.reloadData()}rowIdentity(){return jt=>{const xt=jt[this.identifier];if(f().isUndefined(xt))throw new Error(`Wrong identifier "${this.identifier}" -> "${xt}"`);return xt}}useData(){!this.data||(this.updateColumnFilterOptions(),this.updateFilter(),this.reset(),this.updateSelected(),this.updateExpanded())}reset(){this.loadingIndicator=!1,this.updating=!1}updateSelected(){if("never"===this.updateSelectionOnRefresh)return;const jt=new Set;this.selection.selected.forEach(mn=>{for(const Wn of this.data)mn[this.identifier]===Wn[this.identifier]&&jt.add(Wn)});const xt=Array.from(jt.values());"onChange"===this.updateSelectionOnRefresh&&f().isEqual(this.selection.selected,xt)||(this.selection.selected=xt,this.onSelect(this.selection))}updateExpanded(){if(f().isUndefined(this.expanded)||"never"===this.updateExpandedOnRefresh)return;const jt=this.expanded[this.identifier],xt=f().find(this.data,mn=>jt===mn[this.identifier]);"onChange"===this.updateExpandedOnRefresh&&f().isEqual(this.expanded,xt)||(this.expanded=xt,this.setExpandedRow.emit(xt))}onSelect(jt){f().has(jt,"selected")&&(this.selection.selected=jt.selected),this.updateSelection.emit(f().clone(this.selection))}singleSelectCheck(jt){return-1===this.selection.selected.indexOf(jt)}toggleColumn(jt){const xt=jt.prop,mn=!jt.isHidden;mn&&1===this.tableColumns.length?jt.isHidden=!0:(f().find(this.localColumns,Wn=>Wn.prop===xt).isHidden=mn,this.updateColumns())}updateColumns(){this.updateUserColumns(),this.filterHiddenColumns();const jt=this.userConfig.sorts[0].prop;f().find(this.tableColumns,xt=>xt.prop===jt)||(this.userConfig.sorts=this.createSortingDefinition(this.tableColumns[0].prop)),this.table.recalculate(),this.cdRef.detectChanges()}createSortingDefinition(jt){return[{prop:jt,dir:u.Sr.asc}]}changeSorting({sorts:jt}){this.userConfig.sorts=jt,this.serverSide&&(this.userConfig.offset=0,this.reloadData())}onClearSearch(){this.search="",this.updateFilter()}onClearFilters(){this.columnFilters.forEach(jt=>{jt.value=void 0}),this.selectedFilter=f().first(this.columnFilters),this.updateFilter()}updateFilter(){if(this.serverSide)this.userConfig.search!==this.search&&(this.userConfig.offset=0,this.userConfig.limit=this.limit,this.userConfig.search=this.search,this.updating=!1,this.reloadData()),this.rows=this.data;else{let jt=0!==this.columnFilters.length?this.doColumnFiltering():this.data;if(this.search.length>0&&jt){const xt=this.localColumns.filter(mn=>mn.cellTransformation!==T.e.sparkline);jt=this.subSearch(jt,Ze.prepareSearch(this.search),xt),this.table.offset=0}this.rows=jt}}subSearch(jt,xt,mn){if(0===xt.length||0===jt.length)return jt;const Wn=xt.pop().replace(/\+/g," ").split(":"),kn=[...mn];return 2===Wn.length&&(mn=kn.filter(wn=>-1!==wn.name.toLowerCase().indexOf(Wn[0]))),jt=this.basicDataSearch(f().last(Wn),jt,mn),this.subSearch(jt,xt,kn)}basicDataSearch(jt,xt,mn){return 0===jt.length?xt:xt.filter(Wn=>mn.filter(kn=>{let wn=f().get(Wn,kn.prop);if(f().isUndefined(kn.pipe)||(wn=kn.pipe.transform(wn)),f().isUndefined(wn)||f().isNull(wn))return!1;if(f().isArray(wn)?wn=wn.join(" "):(f().isNumber(wn)||f().isBoolean(wn))&&(wn=wn.toString()),f().isObjectLike(wn)){if(!this.searchableObjects)return!1;wn=JSON.stringify(wn)}return-1!==wn.toLowerCase().indexOf(jt)}).length>0)}getRowClass(){return()=>({clickable:!f().isUndefined(this.selectionType)})}toggleExpandRow(jt,xt,mn){mn.stopPropagation(),xt?(this.expanded=void 0,this.setExpandedRow.emit(void 0)):(this.expanded=jt,this.table.rowDetail.collapseAllRows(),this.setExpandedRow.emit(jt)),this.table.rowDetail.toggleExpandRow(jt)}}return Ze.\u0275fac=function(jt){return new(jt||Ze)(r.Y36(r.sBO),r.Y36(Z.f))},Ze.\u0275cmp=r.Xpm({type:Ze,selectors:[["cd-table"]],viewQuery:function(jt,xt){if(1&jt&&(r.Gf(u.nE,7),r.Gf(dt,7),r.Gf(ze,7),r.Gf(Ye,7),r.Gf(je,7),r.Gf(Ie,7),r.Gf(Ve,7),r.Gf(He,7),r.Gf(Zt,7),r.Gf(st,7),r.Gf(en,7),r.Gf($t,7),r.Gf(Gt,7)),2&jt){let mn;r.iGM(mn=r.CRH())&&(xt.table=mn.first),r.iGM(mn=r.CRH())&&(xt.tableCellBoldTpl=mn.first),r.iGM(mn=r.CRH())&&(xt.sparklineTpl=mn.first),r.iGM(mn=r.CRH())&&(xt.routerLinkTpl=mn.first),r.iGM(mn=r.CRH())&&(xt.checkIconTpl=mn.first),r.iGM(mn=r.CRH())&&(xt.perSecondTpl=mn.first),r.iGM(mn=r.CRH())&&(xt.executingTpl=mn.first),r.iGM(mn=r.CRH())&&(xt.classAddingTpl=mn.first),r.iGM(mn=r.CRH())&&(xt.badgeTpl=mn.first),r.iGM(mn=r.CRH())&&(xt.mapTpl=mn.first),r.iGM(mn=r.CRH())&&(xt.truncateTpl=mn.first),r.iGM(mn=r.CRH())&&(xt.timeAgoTpl=mn.first),r.iGM(mn=r.CRH())&&(xt.rowDetailsTpl=mn.first)}},inputs:{data:"data",columns:"columns",sorts:"sorts",columnMode:"columnMode",onlyActionHeader:"onlyActionHeader",toolHeader:"toolHeader",searchField:"searchField",header:"header",footer:"footer",limit:"limit",maxLimit:"maxLimit",hasDetails:"hasDetails",autoReload:"autoReload",identifier:"identifier",forceIdentifier:"forceIdentifier",selectionType:"selectionType",updateSelectionOnRefresh:"updateSelectionOnRefresh",updateExpandedOnRefresh:"updateExpandedOnRefresh",autoSave:"autoSave",searchableObjects:"searchableObjects",customCss:"customCss",extraFilterableColumns:"extraFilterableColumns",status:"status",serverSide:"serverSide",count:"count"},outputs:{fetchData:"fetchData",updateSelection:"updateSelection",setExpandedRow:"setExpandedRow",columnFiltersChanged:"columnFiltersChanged"},features:[r.TTD],ngContentSelectors:no,decls:35,vars:21,consts:function(){let Dr,jt,xt,mn,Wn,kn,wn;return Dr="Clear filters",jt="selected",xt="total",mn="found",Wn="found",kn="total",wn="Expand/Collapse Row",[[1,"dataTables_wrapper"],["class","dataTables_header clearfix",4,"ngIf"],[1,"bootstrap","cd-datatable",3,"cssClasses","selectionType","selected","sorts","columns","columnMode","rows","rowClass","headerHeight","footerHeight","count","externalPaging","externalSorting","limit","offset","loadingIndicator","rowIdentity","rowHeight","select","sort","page"],["table",""],["rowHeight","auto"],["detailRow",""],["ngx-datatable-row-detail-template",""],["ngx-datatable-footer-template",""],["tableCellBoldTpl",""],["sparklineTpl",""],["routerLinkTpl",""],["checkIconTpl",""],["perSecondTpl",""],["executingTpl",""],["classAddingTpl",""],["badgeTpl",""],["mapTpl",""],["truncateTpl",""],["ngx-datatable-cell-template",""],["rowDetailsTpl",""],["timeAgoTpl",""],[1,"dataTables_header","clearfix"],[1,"cd-datatable-actions"],["class","btn-group widget-toolbar",4,"ngIf"],["class","input-group search",4,"ngIf"],["class","input-group dataTables_paginate",4,"ngIf"],[1,"widget-toolbar"],["ngbDropdown","","autoClose","outside",1,"tc_menuitem"],["ngbDropdownToggle","",1,"btn","btn-light","tc_columnBtn"],[3,"ngClass"],["ngbDropdownMenu",""],[4,"ngFor","ngForOf"],["class","widget-toolbar tc_refreshBtn",4,"ngIf"],[1,"btn-group","widget-toolbar"],["ngbDropdown","","placement","bottom-right",1,"tc_filter_name"],["ngbDropdownToggle","",1,"btn","btn-light"],["ngbDropdown","","placement","bottom-right",1,"tc_filter_option"],["ngbDropdownItem","",3,"click"],[3,"ngClass",4,"ngIf"],[1,"input-group","search"],[1,"input-group-prepend"],[1,"input-group-text"],["type","text",1,"form-control",3,"ngModel","ngModelChange","keyup"],[1,"input-group-append"],["type","button",1,"btn","btn-light",3,"click"],[1,"input-group","dataTables_paginate"],["type","number","min","1","max","9999",1,"form-control",3,"value","click","keyup","blur"],["ngbDropdownItem","",3,"click",4,"ngIf"],[1,"custom-control","custom-checkbox","py-0"],["type","checkbox",1,"custom-control-input",3,"name","id","checked"],[1,"custom-control-label",3,"for"],[1,"widget-toolbar","tc_refreshBtn"],["type","button",3,"ngbTooltip","click"],[1,"filter-chips"],["href","",1,"tc_clearSelections",3,"click"],Dr,["class","badge badge-info mr-2",4,"ngIf"],[1,"badge","badge-info","mr-2"],[1,"mr-2"],[1,"badge-remove",3,"click"],["aria-hidden","true",3,"ngClass"],[1,"page-count"],[4,"ngIf"],[4,"ngIf","ngIfElse"],["serverSideTpl",""],[3,"pagerLeftArrowIcon","pagerRightArrowIcon","pagerPreviousIcon","pagerNextIcon","page","size","count","hidden","change"],jt,xt,mn,Wn,kn,[3,"data","isBinary"],[3,"routerLink","queryParams"],[3,"ngClass","hidden"],["class","badge",3,"ngClass",4,"ngIf"],[1,"badge",3,"ngClass"],["data-toggle","tooltip",3,"title"],["href","javascript:void(0)","title",wn,1,"expand-collapse-icon","tc_expand-collapse",3,"click"]]},template:function(jt,xt){1&jt&&(r.F$t(Ii),r.TgZ(0,"div",0),r.YNc(1,Ut,3,0,"div",1),r.YNc(2,Kr,13,9,"div",1),r.YNc(3,Zr,6,1,"div",1),r.TgZ(4,"ngx-datatable",2,3),r.NdJ("select",function(Wn){return xt.onSelect(Wn)})("sort",function(Wn){return xt.changeSorting(Wn)})("page",function(Wn){return xt.changePage(Wn)}),r.TgZ(6,"ngx-datatable-row-detail",4,5),r.YNc(8,Ur,1,0,"ng-template",6),r.qZA(),r.TgZ(9,"ngx-datatable-footer"),r.YNc(10,On,6,11,"ng-template",7),r.qZA(),r.qZA(),r.qZA(),r.YNc(11,Wt,2,1,"ng-template",null,8,r.W1O),r.YNc(13,Jn,1,2,"ng-template",null,9,r.W1O),r.YNc(15,ir,2,5,"ng-template",null,10,r.W1O),r.YNc(17,Lr,2,6,"ng-template",null,11,r.W1O),r.YNc(19,Vn,2,3,"ng-template",null,12,r.W1O),r.YNc(21,Ai,4,4,"ng-template",null,13,r.W1O),r.YNc(23,Tr,3,8,"ng-template",null,14,r.W1O),r.YNc(25,mr,2,3,"ng-template",null,15,r.W1O),r.YNc(27,Xt,3,4,"ng-template",null,16,r.W1O),r.YNc(29,zn,3,6,"ng-template",null,17,r.W1O),r.YNc(31,vr,1,4,"ng-template",18,19,r.W1O),r.YNc(33,si,4,6,"ng-template",null,20,r.W1O)),2&jt&&(r.xp6(1),r.Q6J("ngIf",xt.onlyActionHeader),r.xp6(1),r.Q6J("ngIf",xt.toolHeader),r.xp6(1),r.Q6J("ngIf",xt.toolHeader&&xt.columnFiltered),r.xp6(1),r.Q6J("cssClasses",xt.paginationClasses)("selectionType",xt.selectionType)("selected",xt.selection.selected)("sorts",xt.userConfig.sorts)("columns",xt.tableColumns)("columnMode",xt.columnMode)("rows",xt.rows)("rowClass",xt.getRowClass())("headerHeight",xt.header?"auto":0)("footerHeight",xt.footer?"auto":0)("count",xt.count)("externalPaging",xt.serverSide)("externalSorting",xt.serverSide)("limit",xt.userConfig.limit>0?xt.userConfig.limit:void 0)("offset",xt.userConfig.offset>=0?xt.userConfig.offset:0)("loadingIndicator",xt.loadingIndicator)("rowIdentity",xt.rowIdentity())("rowHeight","auto"))},directives:[J.O5,u.nE,u.$7,u.AR,u.dX,u.ii,u.vq,Q.jt,Q.iD,J.mk,Q.Vi,J.sg,Q.TH,ee.Fj,ee.JJ,ee.On,Q._L,u.Ke,ue.l,ae.yS],pipes:[$.i,se.n,ve.i,oe.I,he.b,me.W,Oe.N,ce.h],styles:['@charset "UTF-8";.dataTables_wrapper[_ngcontent-%COMP%]{margin-bottom:25px;max-width:99.9%}.dataTables_wrapper[_ngcontent-%COMP%]   .separator[_ngcontent-%COMP%]{border-left:1px solid rgba(0,0,0,.09);display:inline-block;height:30px;margin-left:5px;padding-left:5px;vertical-align:middle}.dataTables_wrapper[_ngcontent-%COMP%]   .widget-toolbar[_ngcontent-%COMP%]{border-left:1px solid rgba(0,0,0,.09);float:right;padding:0 8px}.dataTables_wrapper[_ngcontent-%COMP%]   .widget-toolbar[_ngcontent-%COMP%]   .form-check[_ngcontent-%COMP%]{padding-left:0}.dataTables_wrapper[_ngcontent-%COMP%]   .dataTables_length[_ngcontent-%COMP%] > input[_ngcontent-%COMP%]{line-height:25px;text-align:right}.dataTables_header[_ngcontent-%COMP%]{background-color:#f8f9fa;border:1px solid #ced4da;border-bottom:0;padding:5px;position:relative}.dataTables_header[_ngcontent-%COMP%]   .cd-datatable-actions[_ngcontent-%COMP%]{float:left}.dataTables_header[_ngcontent-%COMP%]   .form-group[_ngcontent-%COMP%]{padding-left:8px}.dataTables_header[_ngcontent-%COMP%]   .input-group[_ngcontent-%COMP%]{border-left:1px solid rgba(0,0,0,.09);float:right;max-width:250px;padding-left:8px;padding-right:8px;width:40%}.dataTables_header[_ngcontent-%COMP%]   .input-group[_ngcontent-%COMP%]   .form-control[_ngcontent-%COMP%]{height:30px}.dataTables_header[_ngcontent-%COMP%]   .input-group.dataTables_paginate[_ngcontent-%COMP%]{min-width:85px;padding-right:8px;width:8%}.dataTables_header[_ngcontent-%COMP%]   .filter-chips[_ngcontent-%COMP%]{float:right;padding:0 8px}.dataTables_header[_ngcontent-%COMP%]   .filter-chips[_ngcontent-%COMP%]   .badge-remove[_ngcontent-%COMP%]{color:#fff}  cd-table .cd-datatable{border:1px solid #ced4da;margin-bottom:0;max-width:none!important}  cd-table .cd-datatable .progress-linear{display:block;height:5px;margin:0;padding:0;position:relative;width:100%}  cd-table .cd-datatable .progress-linear .container{background-color:#2b99a8}  cd-table .cd-datatable .progress-linear .container .bar{background-color:#2b99a8;height:100%;left:0;overflow:hidden;position:absolute;width:100%}  cd-table .cd-datatable .progress-linear .container .bar:before{animation:progress-loading 3s linear infinite;background-color:#2b99a8;content:"";display:block;height:100%;left:-200px;position:absolute;width:200px}  cd-table .cd-datatable .datatable-header{background-clip:padding-box;background-color:#f8f9fa;background-image:linear-gradient(to bottom,#f8f9fa 0,#e9ecef 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr="#fffafafa",endColorstr="#ffededed",GradientType=0)}  cd-table .cd-datatable .datatable-header .sort-asc,   cd-table .cd-datatable .datatable-header .sort-desc{color:#2b99a8}  cd-table .cd-datatable .datatable-header .datatable-header-cell{border:0;border-bottom:1px solid #ced4da;border-left:1px solid #ced4da;padding:5px;font-weight:bold;text-align:left}  cd-table .cd-datatable .datatable-header .datatable-header-cell .datatable-header-cell-label:after{font-family:ForkAwesome;font-weight:400;height:9px;left:10px;line-height:12px;position:relative;vertical-align:baseline;width:12px}  cd-table .cd-datatable .datatable-header .datatable-header-cell.sortable .datatable-header-cell-label:after{content:" \\f0dc"}  cd-table .cd-datatable .datatable-header .datatable-header-cell.sortable.sort-active.sort-asc .datatable-header-cell-label:after{content:" \\f160"}  cd-table .cd-datatable .datatable-header .datatable-header-cell.sortable.sort-active.sort-desc .datatable-header-cell-label:after{content:" \\f161"}  cd-table .cd-datatable .datatable-header .datatable-header-cell:first-child{border-left:0}  cd-table .cd-datatable .datatable-body{margin-bottom:-6px}  cd-table .cd-datatable .datatable-body .empty-row{background-color:#c8ecf1;font-style:italic;font-weight:bold;padding-bottom:5px;padding-top:5px;text-align:center}  cd-table .cd-datatable .datatable-body .datatable-body-row.clickable:hover .datatable-row-group{background-color:#c8ecf1;transition-duration:.3s;transition-property:background;transition-timing-function:linear}  cd-table .cd-datatable .datatable-body .datatable-body-row.datatable-row-even{background-color:#fff}  cd-table .cd-datatable .datatable-body .datatable-body-row.datatable-row-odd{background-color:#f8f9fa}  cd-table .cd-datatable .datatable-body .datatable-body-row.active,   cd-table .cd-datatable .datatable-body .datatable-body-row.active:hover{background-color:#9fdee6}  cd-table .cd-datatable .datatable-body .datatable-body-row .datatable-body-cell{border:0;border-bottom:1px solid #ced4da;border-left:1px solid #ced4da;padding:5px}  cd-table .cd-datatable .datatable-body .datatable-body-row .datatable-body-cell:first-child{border-left:0}  cd-table .cd-datatable .datatable-body .datatable-body-row .datatable-body-cell .datatable-body-cell-label{display:block;height:100%}  cd-table .cd-datatable .datatable-body .datatable-row-detail{border-bottom:2px solid #ced4da;overflow-y:visible!important;padding:20px}  cd-table .cd-datatable .datatable-body .expand-collapse-icon{display:block;height:100%;text-align:center}  cd-table .cd-datatable .datatable-body .expand-collapse-icon:hover{text-decoration:none}  cd-table .cd-datatable .datatable-body .expand-collapse-icon-right:before{color:#212529;font-family:"ForkAwesome",sans-serif;font-size:1rem;line-height:1;content:"\\f105"}  cd-table .cd-datatable .datatable-body .expand-collapse-icon-down:before{color:#212529;font-family:"ForkAwesome",sans-serif;font-size:1rem;line-height:1;content:"\\f107"}  cd-table .cd-datatable .datatable-footer .selected-count,   cd-table .cd-datatable .datatable-footer .page-count{font-style:italic;min-height:2rem;padding-left:.3rem;padding-top:.3rem}  cd-table .cd-datatable .cd-datatable-checkbox{text-align:center}@keyframes progress-loading{0%{left:-200px;width:15%}50%{width:30%}70%{width:70%}80%{left:50%}95%{left:120%}to{left:100%}}'],changeDetection:0}),Ze})()},93523:(v,S,i)=>{"use strict";i.d(S,{o:()=>p,G:()=>f});var r=i(23815),u=i.n(r);function p(...y){switch(y.length){case 1:return e.apply(void 0,y);case 3:return _.apply(void 0,y);default:throw new Error}}function f(y,T,M){const R=`__ignore_${T}`;Array.isArray(y[R])?y[R].push(M):y[R]=[M]}function e(y){for(const T of Object.getOwnPropertyNames(y.prototype)){const M=Object.getOwnPropertyDescriptor(y.prototype,T);!(M.value instanceof Function)||"constructor"===T||(_(y.prototype,T,M),Object.defineProperty(y.prototype,T,M))}}function _(y,T,M){void 0===M&&(M=Object.getOwnPropertyDescriptor(y,T));const R=M.value;M.value=function(){const F=`__ignore_${T}`,Z=y[F]||[],J=[];for(let ee=0;ee<arguments.length;ee++)J[ee]=u().isString(arguments[ee])&&-1===Z.indexOf(ee)?encodeURIComponent(arguments[ee]):arguments[ee];return R.apply(this,J)}}},82945:(v,S,i)=>{"use strict";i.d(S,{U:()=>f});var r=i(23815),u=i.n(r),p=i(74788);let f=(()=>{class e{constructor(y){this.elementRef=y,this.focus=!0}ngAfterViewInit(){const y=this.elementRef.nativeElement;this.focus&&u().isFunction(y.focus)&&y.focus()}set autofocus(y){u().isBoolean(y)?this.focus=y:u().isFunction(y)&&(this.focus=y())}}return e.\u0275fac=function(y){return new(y||e)(p.Y36(p.SBq))},e.\u0275dir=p.lG2({type:e,selectors:[["","autofocus",""]],inputs:{autofocus:"autofocus"}}),e})()},17932:(v,S,i)=>{"use strict";i.d(S,{Q:()=>y});var r=i(74788),u=i(23815),p=i.n(u),f=i(47557),e=i(28211),_=i(24751);let y=(()=>{class T{constructor(R,F,Z,J){this.elementRef=R,this.control=F,this.dimlessBinaryPipe=Z,this.formatter=J,this.ngModelChange=new r.vpe,this.el=this.elementRef.nativeElement}ngOnInit(){this.setValue(this.el.value)}setValue(R){/^[\d.]+$/.test(R)&&(R+=this.defaultUnit||"m");const F=this.formatter.toBytes(R),Z=this.round(F);this.el.value=this.dimlessBinaryPipe.transform(Z),null!==F?(this.ngModelChange.emit(this.el.value),this.control.control.setValue(this.el.value)):(this.ngModelChange.emit(null),this.control.control.setValue(null))}round(R){if(null!==R&&0!==R){if(!p().isUndefined(this.minBytes)&&R<this.minBytes)return this.minBytes;if(!p().isUndefined(this.maxBytes)&&R>this.maxBytes)return this.maxBytes;if(!p().isUndefined(this.roundPower)){const F=Math.round(Math.log(R)/Math.log(this.roundPower));return Math.pow(this.roundPower,F)}}return R}onBlur(R){this.setValue(R)}}return T.\u0275fac=function(R){return new(R||T)(r.Y36(r.SBq),r.Y36(_.a5),r.Y36(f.$),r.Y36(e.H))},T.\u0275dir=r.lG2({type:T,selectors:[["","cdDimlessBinary",""]],hostBindings:function(R,F){1&R&&r.NdJ("blur",function(J){return F.onBlur(J.target.value)})},inputs:{minBytes:"minBytes",maxBytes:"maxBytes",roundPower:"roundPower",defaultUnit:"defaultUnit"},outputs:{ngModelChange:"ngModelChange"}}),T})()},35540:(v,S,i)=>{"use strict";i.d(S,{o:()=>u});var r=i(74788);let u=(()=>{class p{}return p.\u0275fac=function(e){return new(e||p)},p.\u0275mod=r.oAB({type:p}),p.\u0275inj=r.cJS({imports:[[]]}),p})()},87925:(v,S,i)=>{"use strict";i.d(S,{o:()=>f});var r=i(74788),u=i(84333),p=i(74937);let f=(()=>{class e{constructor(y,T,M){this.formScope=y,this.authStorageService=T,this.elementRef=M}ngAfterViewInit(){var y,T,M;this.permissions=this.authStorageService.getPermissions();const R=null===(y=this.formScope)||void 0===y?void 0:y.cdFormScope;R&&!(null===(M=null===(T=this.permissions)||void 0===T?void 0:T[R])||void 0===M?void 0:M.update)&&(this.elementRef.nativeElement.disabled=!0)}}return e.\u0275fac=function(y){return new(y||e)(r.Y36(u.T,8),r.Y36(p.j),r.Y36(r.SBq))},e.\u0275dir=r.lG2({type:e,selectors:[["input",3,"cdNoFormInputDisable",""],["select",3,"cdNoFormInputDisable",""],["button",3,"cdNoFormInputDisable",""],["","cdFormInputDisable",""]]}),e})()},63622:(v,S,i)=>{"use strict";i.d(S,{y:()=>e});var r=i(34501),u=i(8958),p=i(93614),f=i(74788);let e=(()=>{class _{constructor(T,M,R){this.templateRef=T,this.viewContainer=M,this.componentFactoryResolver=R}set cdFormLoading(T){let M,R;switch(this.viewContainer.clear(),T){case p.Q.Loading:M=this.componentFactoryResolver.resolveComponentFactory(u.b),R=this.resolveNgContent("Loading form data..."),this.viewContainer.createComponent(M,null,null,R);break;case p.Q.Ready:this.viewContainer.createEmbeddedView(this.templateRef);break;case p.Q.Error:M=this.componentFactoryResolver.resolveComponentFactory(r.G),R=this.resolveNgContent("Form data could not be loaded."),this.viewContainer.createComponent(M,null,null,R).instance.type="error"}}resolveNgContent(T){return[[document.createTextNode(T)]]}}return _.\u0275fac=function(T){return new(T||_)(f.Y36(f.Rgc),f.Y36(f.s_b),f.Y36(f._Vd))},_.\u0275dir=f.lG2({type:_,selectors:[["","cdFormLoading",""]],inputs:{cdFormLoading:"cdFormLoading"}}),_})()},84333:(v,S,i)=>{"use strict";i.d(S,{T:()=>u});var r=i(74788);let u=(()=>{class p{}return p.\u0275fac=function(e){return new(e||p)},p.\u0275dir=r.lG2({type:p,selectors:[["","cdFormScope",""]],inputs:{cdFormScope:"cdFormScope"}}),p})()},94276:(v,S,i)=>{"use strict";i.d(S,{b:()=>f});var r=i(74788),u=i(24751);let f=(()=>{class e{constructor(y){this.parent=y}get validClass(){return!!this.control&&this.control.valid&&(this.control.touched||this.control.dirty)}get invalidClass(){return!!this.control&&this.control.invalid&&this.control.touched&&this.control.dirty}get path(){return function(e,_){return[..._.path,e]}(this.formControlName,this.parent)}get control(){return this.formDirective&&this.formDirective.getControl(this)}get formDirective(){return this.parent?this.parent.formDirective:null}}return e.\u0275fac=function(y){return new(y||e)(r.Y36(u.gN,13))},e.\u0275dir=r.lG2({type:e,selectors:[["",8,"form-control"],["",8,"form-check-input"],["",8,"custom-control-input"]],hostVars:4,hostBindings:function(y,T){2&y&&r.ekj("is-valid",T.validClass)("is-invalid",T.invalidClass)},inputs:{formControlName:"formControlName",formControl:"formControl"}}),e})()},56310:(v,S,i)=>{"use strict";i.d(S,{P:()=>p});var r=i(24751),u=i(74788);let p=(()=>{class f{constructor(_){this.elRef=_,this.validationDisabled=!1}get hasErrors(){return this.formControlNames.some(_=>!_.valid&&_.dirty&&_.touched)&&!this.validationDisabled}get hasSuccess(){return!this.formControlNames.some(_=>!_.valid)&&this.formControlNames.some(_=>_.dirty&&_.touched)&&!this.validationDisabled}get label(){const _=this.elRef.nativeElement.querySelector("label");return _&&_.textContent?_.textContent.trim():"This field"}get isDirtyAndTouched(){return this.formControlNames.some(_=>_.dirty&&_.touched)}}return f.\u0275fac=function(_){return new(_||f)(u.Y36(u.SBq))},f.\u0275dir=u.lG2({type:f,selectors:[["",8,"form-group"]],contentQueries:function(_,y,T){if(1&_&&u.Suo(T,r.u,4),2&_){let M;u.iGM(M=u.CRH())&&(y.formControlNames=M)}},hostVars:4,hostBindings:function(_,y){2&_&&u.ekj("has-error",y.hasErrors)("has-success",y.hasSuccess)},inputs:{validationDisabled:"validationDisabled"}}),f})()},41582:(v,S,i)=>{"use strict";i.d(S,{V:()=>p});var r=i(74788),u=i(24751);let p=(()=>{class f{constructor(){this.validSubmit=new r.vpe}onSubmit(){this.markAsTouchedAndDirty(this.formGroup),this.formGroup.valid&&this.validSubmit.emit(this.formGroup.value)}markAsTouchedAndDirty(_){_ instanceof u.cw?Object.keys(_.controls).forEach(y=>this.markAsTouchedAndDirty(_.controls[y])):_ instanceof u.Oe?_.controls.forEach(y=>this.markAsTouchedAndDirty(y)):_ instanceof u.NI&&_.enabled&&(_.markAsDirty(),_.markAsTouched(),_.updateValueAndValidity())}}return f.\u0275fac=function(_){return new(_||f)},f.\u0275dir=r.lG2({type:f,selectors:[["","formGroup",""]],hostBindings:function(_,y){1&_&&r.NdJ("submit",function(){return y.onSubmit()})},inputs:{formGroup:"formGroup"},outputs:{validSubmit:"validSubmit"}}),f})()},4416:(v,S,i)=>{"use strict";i.d(S,{C:()=>u});var r=i(74788);let u=(()=>{class p{constructor(e,_){this.elementRef=e,this.renderer=_}ngOnInit(){this.renderer.setAttribute(this.elementRef.nativeElement,"tabindex","-1"),this.iElement=this.renderer.createElement("i"),this.renderer.addClass(this.iElement,"fa"),this.renderer.appendChild(this.elementRef.nativeElement,this.iElement),this.update()}getInputElement(){return document.getElementById(this.cdPasswordButton)}update(){const e=this.getInputElement();e&&"text"===e.type?(this.renderer.removeClass(this.iElement,"fa-eye"),this.renderer.addClass(this.iElement,"fa-eye-slash")):(this.renderer.removeClass(this.iElement,"fa-eye-slash"),this.renderer.addClass(this.iElement,"fa-eye"))}onClick(){const e=this.getInputElement();e.type="password"===e.type?"text":"password",this.update()}}return p.\u0275fac=function(e){return new(e||p)(r.Y36(r.SBq),r.Y36(r.Qsj))},p.\u0275dir=r.lG2({type:p,selectors:[["","cdPasswordButton",""]],hostBindings:function(e,_){1&e&&r.NdJ("click",function(){return _.onClick()})},inputs:{cdPasswordButton:"cdPasswordButton"}}),p})()},59376:(v,S,i)=>{"use strict";i.d(S,{m:()=>p});var r=i(74788),u=i(38549);let p=(()=>{class f{constructor(_){this.nav=_,this.localStorage=window.localStorage}ngOnInit(){const _=this.localStorage.getItem(`tabset_${this.cdStatefulTab}`);_&&this.nav.select(_)}onNavChange(_){this.cdStatefulTab&&_.nextId&&this.localStorage.setItem(`tabset_${this.cdStatefulTab}`,_.nextId)}}return f.\u0275fac=function(_){return new(_||f)(r.Y36(u.Pz,9))},f.\u0275dir=r.lG2({type:f,selectors:[["","cdStatefulTab",""]],hostBindings:function(_,y){1&_&&r.NdJ("navChange",function(M){return y.onNavChange(M)})},inputs:{cdStatefulTab:"cdStatefulTab"}}),f})()},99466:(v,S,i)=>{"use strict";i.d(S,{e:()=>r});var r=(()=>{return(u=r||(r={})).bold="bold",u.sparkline="sparkline",u.perSecond="perSecond",u.checkIcon="checkIcon",u.routerLink="routerLink",u.executing="executing",u.classAdding="classAdding",u.badge="badge",u.map="map",u.truncate="truncate",u.timeAgo="timeAgo",r;var u})()},65862:(v,S,i)=>{"use strict";i.d(S,{P:()=>r});var r=(()=>{return(u=r||(r={})).add="fa fa-plus",u.addCircle="fa fa-plus-circle",u.minusCircle="fa fa-minus-circle",u.edit="fa fa-pencil",u.destroy="fa fa-times",u.destroyCircle="fa fa-times-circle",u.exchange="fa fa-exchange",u.copy="fa fa-copy",u.clipboard="fa fa-clipboard",u.flatten="fa fa-chain-broken",u.trash="fa fa-trash-o",u.lock="fa fa-lock",u.unlock="fa fa-unlock",u.clone="fa fa-clone",u.undo="fa fa-undo",u.search="fa fa-search",u.start="fa fa-play",u.stop="fa fa-stop",u.analyse="fa fa-stethoscope",u.deepCheck="fa fa-cog",u.reweight="fa fa-balance-scale",u.left="fa fa-arrow-left",u.right="fa fa-arrow-right",u.down="fa fa-arrow-down",u.erase="fa fa-eraser",u.user="fa fa-user",u.users="fa fa-users",u.share="fa fa-share-alt",u.key="fa fa-key-modern",u.warning="fa fa-exclamation-triangle",u.info="fa fa-info",u.infoCircle="fa fa-info-circle",u.questionCircle="fa fa-question-circle-o",u.check="fa fa-check",u.show="fa fa-eye",u.paragraph="fa fa-paragraph",u.terminal="fa fa-terminal",u.magic="fa fa-magic",u.hourglass="fa fa-hourglass-o",u.filledHourglass="fa fa-hourglass",u.table="fa fa-table",u.spinner="fa fa-spinner",u.refresh="fa fa-refresh",u.bullseye="fa fa-bullseye",u.disk="fa fa-hdd-o",u.server="fa fa-server",u.filter="fa fa-filter",u.lineChart="fa fa-line-chart",u.signOut="fa fa-sign-out",u.health="fa fa-heartbeat",u.circle="fa fa-circle",u.bell="fa fa-bell",u.tag="fa fa-tag",u.leftArrow="fa fa-angle-left",u.rightArrow="fa fa-angle-right",u.leftArrowDouble="fa fa-angle-double-left",u.rightArrowDouble="fa fa-angle-double-right",u.flag="fa fa-flag",u.clearFilters="fa fa-window-close",u.download="fa fa-download",u.upload="fa fa-upload",u.close="fa fa-times",u.json="fa fa-file-code-o",u.text="fa fa-file-text",u.wrench="fa fa-wrench",u.enter="fa fa-sign-in",u.exit="fa fa-sign-out",u.restart="fa fa-history",u.deploy="fa fa-cube",u.large="fa fa-lg",u.large2x="fa fa-2x",u.large3x="fa fa-3x",u.stack="fa fa-stack",u.stack1x="fa fa-stack-1x",u.stack2x="fa fa-stack-2x",u.pulse="fa fa-pulse",u.spin="fa fa-spin",u.inverse="fa fa-inverse",r;var u})()},18001:(v,S,i)=>{"use strict";i.d(S,{k:()=>r});var r=(()=>{return(u=r||(r={}))[u.error=0]="error",u[u.info=1]="info",u[u.success=2]="success",r;var u})()},91801:(v,S,i)=>{"use strict";i.d(S,{T:()=>r});var r=(()=>{return(u=r||(r={}))[u.ValueOk=0]="ValueOk",u[u.ValueStale=1]="ValueStale",u[u.ValueNone=2]="ValueNone",u[u.ValueException=3]="ValueException",r;var u})()},62862:(v,S,i)=>{"use strict";i.d(S,{O:()=>f});var r=i(24751),u=i(95463),p=i(74788);let f=(()=>{class e extends r.qu{group(y,T=null){const M=super.group(y,T);return new u.d(M.controls,M.validator,M.asyncValidator)}}return e.\u0275fac=function(){let _;return function(T){return(_||(_=p.n5z(e)))(T||e)}}(),e.\u0275prov=p.Yz7({token:e,factory:e.\u0275fac,providedIn:"root"}),e})()},95463:(v,S,i)=>{"use strict";i.d(S,{d:()=>u});var r=i(24751);class u extends r.cw{constructor(f,e,_){super(f,e,_),this.controls=f}get(f){const e=this._get(f);if(!e)throw new Error(`Control '${f}' could not be found!`);return e}_get(f){return super.get(f)||Object.values(this.controls).filter(e=>e.get).map(e=>e instanceof u?e._get(f):e.get(f)).find(e=>Boolean(e))}getValue(f){return this.get(f).value}silentSet(f,e){this.get(f).setValue(e,{emitEvent:!1})}showError(f,e,_){const y=this.get(f);return(e.submitted||y.dirty)&&(_?y.hasError(_):y.invalid)}}},93614:(v,S,i)=>{"use strict";i.d(S,{Q:()=>r,E:()=>u});var r=(()=>{return(p=r||(r={}))[p.Loading=0]="Loading",p[p.Ready=1]="Ready",p[p.Error=2]="Error",p[p.None=3]="None",r;var p})();class u{constructor(){this.loading=r.Loading}loadingStart(){this.loading=r.Loading}loadingReady(){this.loading=r.Ready}loadingError(){this.loading=r.Error}loadingNone(){this.loading=r.None}}},77205:(v,S,i)=>{"use strict";i.d(S,{h:()=>J,P:()=>Z});var r=i(24751),u=i(23815),p=i.n(u),f=i(25917),e=i(46797),_=i(43190);function y(Q,ee){return ee?(0,_.w)(()=>Q,ee):(0,_.w)(()=>Q)}var T=i(88002),M=i(15257),R=i(47557),F=i(28211);function Z(Q){return null==Q||0===Q.length}class J{static email(ee){return Z(ee.value)?null:r.kI.email(ee)}static ip(ee=0){const ue=/^((25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$/i,ae=/^(?:[a-f0-9]{1,4}:){7}[a-f0-9]{1,4}$/i;return r.kI.pattern(4===ee?ue:6===ee?ae:new RegExp(ue.source+"|"+ae.source))}static number(ee=!0){return r.kI.pattern(ee?/^-?[0-9]+$/i:/^[0-9]+$/i)}static decimalNumber(ee=!0){return r.kI.pattern(ee?/^-?[0-9]+(.[0-9]+)?$/i:/^[0-9]+(.[0-9]+)?$/i)}static sslCert(){return r.kI.pattern(/^-----BEGIN CERTIFICATE-----(\n|\r|\f)((.+)?((\n|\r|\f).+)*)(\n|\r|\f)-----END CERTIFICATE-----[\n\r\f]*$/)}static sslPrivKey(){return r.kI.pattern(/^-----BEGIN RSA PRIVATE KEY-----(\n|\r|\f)((.+)?((\n|\r|\f).+)*)(\n|\r|\f)-----END RSA PRIVATE KEY-----[\n\r\f]*$/)}static pemCert(){return r.kI.pattern(/^-----BEGIN .+-----$.+^-----END .+-----$/ms)}static requiredIf(ee,ue){let ae=!1;return $=>(!ae&&$.parent&&(Object.keys(ee).forEach(ve=>{$.parent.get(ve).valueChanges.subscribe(()=>{$.updateValueAndValidity({emitEvent:!1})})}),ae=!0),Object.keys(ee).every(ve=>{if(!$.parent)return!1;const oe=$.parent.get(ve).value,he=ee[ve];if(p().isObjectLike(he)){let me=!1;switch(he.op){case"empty":me=p().isEmpty(oe);break;case"!empty":me=!p().isEmpty(oe);break;case"equal":me=oe===he.arg1;break;case"!equal":me=oe!==he.arg1;break;case"minLength":p().isString(oe)&&(me=oe.length>=he.arg1)}return me}return oe===he})&&(p().isFunction(ue)?ue.call(ue,$.value):Z($.value))?{required:!0}:null)}static composeIf(ee,ue){let ae=!1;return $=>(!ae&&$.parent&&(Object.keys(ee).forEach(se=>{$.parent.get(se).valueChanges.subscribe(()=>{$.updateValueAndValidity({emitEvent:!1})})}),ae=!0),Object.keys(ee).every(se=>$.parent&&$.parent.get(se).value===ee[se])?r.kI.compose(ue)($):null)}static custom(ee,ue){return ae=>{const $=ue.call(this,ae.value);return $?{[ee]:$}:null}}static validateIf(ee,ue,ae,$=[],se=[]){ae=ae.concat($),ee.setValidators(ve=>ue.call(this)?r.kI.compose(ae)(ve):$.length>0?r.kI.compose($)(ve):null),se.forEach(ve=>{ve.valueChanges.subscribe(()=>{ee.updateValueAndValidity({emitEvent:!1})})})}static match(ee,ue){return ae=>{const $=ae.get(ee),se=ae.get(ue);if(!$||!se)return null;if($.value!==se.value)se.setErrors({match:!0});else if(se.hasError("match")){const oe=se.errors;p().unset(oe,"match"),se.setErrors(p().isEmpty(p().keys(oe))?null:oe)}return null}}static unique(ee,ue=null,ae,$=!1){let se;return ve=>ve.pristine||Z(ve.value)?(0,f.of)(null):(se=ve.value,p().isFunction(ae)&&null!==ae()&&""!==ae()&&(se=$?`${ve.value}$${ae()}`:`${ae()}$${ve.value}`),(0,e.H)().pipe(y(ee.call(ue,se)),(0,T.U)(oe=>oe?{notUnique:!0}:null),(0,M.q)(1)))}static uuid(ee=!1){const ue=/^[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i;return ae=>ae.pristine&&ae.untouched||!ee&&!ae.value||ue.test(ae.value)?null:{invalidUuid:"This is not a valid UUID"}}static binaryMin(ee){return ue=>{const ae=new F.H,$=(new F.H).toBytes(ue.value);if(ee<=$)return null;const se=new R.$(ae).transform(ee);return{binaryMin:()=>"Size has to be at least " + se + " or more"}}}static binaryMax(ee){return ue=>{const ae=new F.H,$=ae.toBytes(ue.value);if(ee>=$)return null;const se=new R.$(ae).transform(ee);return{binaryMax:()=>"Size has to be at most " + se + " or less"}}}static passwordPolicy(ee,ue,ae){return $=>{if($.pristine||""===$.value)return p().isFunction(ae)&&ae(!0,0),(0,f.of)(null);let se;return p().isFunction(ue)&&(se=ue()),(0,e.H)(500).pipe(y(p().invoke(ee,"validatePassword",$.value,se)),(0,T.U)(ve=>(p().isFunction(ae)&&ae(ve.valid,ve.credits,ve.valuation),ve.valid?null:{passwordPolicy:!0})),(0,M.q)(1))}}static bucketName(){return ee=>{if(ee.pristine||!ee.value)return(0,f.of)({required:!0});const ue=[];let ae;return ue.push(()=>{const ve=ee.value;let oe=!0;return(/^((25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$/i.test(ve)||/^(?:[a-f0-9]{1,4}:){7}[a-f0-9]{1,4}$/i.test(ve))&&(ae="ipAddress",oe=!1),oe}),ue.push($=>p().inRange($.length,3,64)?!!/^[0-9a-z.-]+$/.test(ee.value)||(ae="bucketNameInvalid",!1):(ae="shouldBeInRange",!1)),ue.push($=>{const se=p().split($,".");return p().every(se,ve=>ve!==p().toLower(ve)||ve.includes("_")?(ae="containsUpperCase",!1):/^[0-9a-z-]+$/.test(ve)?p().every([0,ve.length-1],oe=>(ae="lowerCaseOrNumber",/[a-z]/.test(ve[oe])||p().isInteger(p().parseInt(ve[oe])))):(ae="onlyLowerCaseAndNumbers",!1))}),p().every(ue,$=>$(ee.value))?(0,f.of)(null):(0,f.of)((()=>{switch(ae){case"onlyLowerCaseAndNumbers":return{onlyLowerCaseAndNumbers:!0};case"shouldBeInRange":return{shouldBeInRange:!0};case"ipAddress":return{ipAddress:!0};case"containsUpperCase":return{containsUpperCase:!0};case"lowerCaseOrNumber":return{lowerCaseOrNumber:!0};default:return{bucketNameInvalid:!0}}})())}}static bucketExistence(ee,ue){return ae=>ae.pristine||!ae.value?(0,f.of)({required:!0}):ue.exists(ae.value).pipe((0,T.U)($=>$===ee?null:{bucketNameNotAllowed:!0}))}}},61355:(v,S,i)=>{"use strict";i.d(S,{T:()=>p,e:()=>f});var r=i(65862),u=i(18001);class p{constructor(_=u.k.info,y,T,M,R="Ceph"){this.type=_,this.title=y,this.message=T,this.options=M,this.application=R,this.isFinishedTask=!1,this.classes={Ceph:"ceph-icon",Prometheus:"prometheus-icon"},this.applicationClass=this.classes[this.application]}}class f extends p{constructor(_=new p){super(_.type,_.title,_.message,_.options,_.application),this.config=_,this.textClasses=["text-danger","text-info","text-success"],this.iconClasses=[r.P.warning,r.P.info,r.P.check],this.borderClasses=["border-danger","border-info","border-success"],delete this.config,this.timestamp=(new Date).toJSON(),this.iconClass=this.iconClasses[this.type],this.textClass=this.textClasses[this.type],this.borderClass=this.borderClasses[this.type],this.isFinishedTask=_.isFinishedTask}}},51907:(v,S,i)=>{"use strict";i.d(S,{G:()=>r});class r{constructor(p){this.pwdExpirationSpan=0,this.pwdExpirationSpan=p.user_pwd_expiration_span,this.pwdExpirationWarning1=p.user_pwd_expiration_warning_1,this.pwdExpirationWarning2=p.user_pwd_expiration_warning_2}}},86919:(v,S,i)=>{"use strict";i.d(S,{E:()=>f});var r=i(58497);class p{constructor(){this.offset=0,this.limit=10,this.pageSize=10}}class f{constructor(_){this.errorConfig={resetData:!0,displayError:!0},this.pageInfo=new p,this.search="",this.sort="+name",this.error=_}toParams(){return null===this.pageInfo.limit&&(this.pageInfo.limit=0),this.search||(this.search=""),(!this.sort||this.sort.length<2)&&(this.sort="+name"),new r.LE({fromObject:{offset:String(this.pageInfo.offset*this.pageInfo.limit),limit:String(this.pageInfo.limit),search:this.search,sort:this.sort}})}}},68774:(v,S,i)=>{"use strict";i.d(S,{r:()=>r});class r{constructor(p){this._selected=[],p&&(this._selected=p),this.update()}update(){this.hasSelection=this._selected.length>0,this.hasSingleSelection=1===this._selected.length,this.hasMultiSelection=this._selected.length>1}set selected(p){this._selected=p,this.update()}get selected(){return this._selected}add(p){this._selected.push(p),this.update()}first(){return this.hasSelection?this._selected[0]:null}}},87311:(v,S,i)=>{"use strict";i.d(S,{h:()=>r});class r{constructor(p,f,e,_){this.customColors={backgroundColor:void 0,borderColor:void 0},this.checkOffset=!1,this.chartEl=p.nativeElement,this.getStyleLeft=e,this.getStyleTop=_,this.tooltipEl=f.nativeElement}customTooltips(p){if(0===p.opacity)return void(this.tooltipEl.style.opacity=0);if(this.tooltipEl.classList.remove("above","below","no-transform"),this.tooltipEl.classList.add(p.yAlign?p.yAlign:"no-transform"),p.body){const _=p.title||[],y=p.body.map(R=>R.lines);let T="<thead>";_.forEach(R=>{T+="<tr><th>"+this.getTitle(R)+"</th></tr>"}),T+="</thead><tbody>",y.forEach((R,F)=>{const Z=p.labelColors[F];let J="background:"+(this.customColors.backgroundColor||Z.backgroundColor);J+="; border-color:"+(this.customColors.borderColor||Z.borderColor),J+="; border-width: 2px",T+='<tr><td nowrap><span class="chartjs-tooltip-key" style="'+J+'"></span>'+this.getBody(R)+"</td></tr>"}),T+="</tbody>",this.tooltipEl.querySelector("table").innerHTML=T}const f=this.chartEl.offsetTop,e=this.chartEl.offsetLeft;if(this.checkOffset){const _=p.width/2;this.tooltipEl.classList.remove("transform-left"),this.tooltipEl.classList.remove("transform-right"),p.caretX-_<0?this.tooltipEl.classList.add("transform-left"):p.caretX+_>this.chartEl.width&&this.tooltipEl.classList.add("transform-right")}this.tooltipEl.style.left=this.getStyleLeft(p,e),this.tooltipEl.style.top=this.getStyleTop(p,f),this.tooltipEl.style.opacity=1,this.tooltipEl.style.fontFamily=p._fontFamily,this.tooltipEl.style.fontSize=p.fontSize,this.tooltipEl.style.fontStyle=p._fontStyle,this.tooltipEl.style.padding=p.yPadding+"px "+p.xPadding+"px"}getBody(p){return p}getTitle(p){return p}}},30633:(v,S,i)=>{"use strict";i.d(S,{h:()=>r,r:()=>u});var r=(()=>{return(p=r||(r={}))[p.global=0]="global",p[p.pool=1]="pool",p[p.image=2]="image",r;var p})(),u=(()=>{return(p=u||(u={}))[p.bps=0]="bps",p[p.iops=1]="iops",p[p.milliseconds=2]="milliseconds",u;var p})()},60737:(v,S,i)=>{"use strict";i.d(S,{o:()=>u});var r=i(29075);class u extends r.i{}},76111:(v,S,i)=>{"use strict";i.d(S,{R:()=>u});var r=i(29075);class u extends r.i{}},19358:(v,S,i)=>{"use strict";i.d(S,{N:()=>r});class r{constructor(p,f,e){this.poolName=p,this.namespace=f,this.imageName=e}static fromString(p){const f=p.split("/");return new this(f[0],f.length>=3?f[1]:null,f.length>=3?f[2]:f[1])}getNameSpace(){return this.namespace?`${this.namespace}/`:""}toString(){return`${this.poolName}/${this.getNameSpace()}${this.imageName}`}toStringEncoded(){return encodeURIComponent(`${this.poolName}/${this.getNameSpace()}${this.imageName}`)}}},29075:(v,S,i)=>{"use strict";i.d(S,{i:()=>r});class r{constructor(p,f){this.name=p,this.metadata=f}}},47187:(v,S,i)=>{"use strict";i.d(S,{I:()=>f});var r=i(23815),u=i.n(r),p=i(74788);let f=(()=>{class e{transform(y,T=!1){let M=y;return(!u().isArray(y)||u().isArray(y)&&T)&&(M=[y]),M}}return e.\u0275fac=function(y){return new(y||e)},e.\u0275pipe=p.Yjl({name:"array",type:e,pure:!0}),e})()},68962:(v,S,i)=>{"use strict";i.d(S,{T:()=>u});var r=i(74788);let u=(()=>{class p{transform(e,_="Yes",y="No"){return Boolean(e)?_:y}}return p.\u0275fac=function(e){return new(e||p)},p.\u0275pipe=r.Yjl({name:"booleanText",type:p,pure:!0}),p})()},70442:(v,S,i)=>{"use strict";i.d(S,{i:()=>u});var r=i(74788);let u=(()=>{class p{transform(e){let _=!1;switch(e){case!0:case 1:case"y":case"yes":case"t":case"true":case"on":case"1":_=!0}return _}}return p.\u0275fac=function(e){return new(e||p)},p.\u0275pipe=r.Yjl({name:"boolean",type:p,pure:!0}),p})()},96102:(v,S,i)=>{"use strict";i.d(S,{N:()=>p});var r=i(74788),u=i(12057);let p=(()=>{class f{constructor(_){this.datePipe=_}transform(_){return null===_||""===_?"":this.datePipe.transform(_,"shortDate")+" "+this.datePipe.transform(_,"mediumTime")}}return f.\u0275fac=function(_){return new(_||f)(r.Y36(u.uU,16))},f.\u0275pipe=r.Yjl({name:"cdDate",type:f,pure:!0}),f})()},24310:(v,S,i)=>{"use strict";i.d(S,{t:()=>u});var r=i(74788);let u=(()=>{class p{transform(e){const _=/ceph version\s+[^ ]+\s+\(.+\)\s+(.+)\s+\((.+)\)/.exec(e);return _?"dev"===_[2]?"main":_[1]:e}}return p.\u0275fac=function(e){return new(e||p)},p.\u0275pipe=r.Yjl({name:"cephReleaseName",type:p,pure:!0}),p})()},58111:(v,S,i)=>{"use strict";i.d(S,{F:()=>u});var r=i(74788);let u=(()=>{class p{transform(e){const _=/ceph version\s+([^ ]+)\s+\(.+\)/.exec(e);return _?_[1]:e}}return p.\u0275fac=function(e){return new(e||p)},p.\u0275pipe=r.Yjl({name:"cephShortVersion",type:p,pure:!0}),p})()},20044:(v,S,i)=>{"use strict";i.d(S,{O:()=>p});var r=i(28211),u=i(74788);let p=(()=>{class f{constructor(_){this.formatter=_}transform(_){return this.formatter.format_number(_,1024,["B/s","kB/s","MB/s","GB/s","TB/s","PB/s","EB/s","ZB/s","YB/s"])}}return f.\u0275fac=function(_){return new(_||f)(u.Y36(r.H,16))},f.\u0275pipe=u.Yjl({name:"dimlessBinaryPerSecond",type:f,pure:!0}),f})()},47557:(v,S,i)=>{"use strict";i.d(S,{$:()=>p});var r=i(28211),u=i(74788);let p=(()=>{class f{constructor(_){this.formatter=_}transform(_){return this.formatter.format_number(_,1024,["B","KiB","MiB","GiB","TiB","PiB","EiB","ZiB","YiB"])}}return f.\u0275fac=function(_){return new(_||f)(u.Y36(r.H,16))},f.\u0275pipe=u.Yjl({name:"dimlessBinary",type:f,pure:!0}),f})()},66369:(v,S,i)=>{"use strict";i.d(S,{n:()=>p});var r=i(28211),u=i(74788);let p=(()=>{class f{constructor(_){this.formatter=_}transform(_){return this.formatter.format_number(_,1e3,["","k","M","G","T","P","E","Z","Y"])}}return f.\u0275fac=function(_){return new(_||f)(u.Y36(r.H,16))},f.\u0275pipe=u.Yjl({name:"dimless",type:f,pure:!0}),f})()},94088:(v,S,i)=>{"use strict";i.d(S,{u:()=>u});var r=i(74788);let u=(()=>{class p{transform(e){if(null===e||e<=0)return"";const _=[[`${Math.floor(e/31536e3)}`,"years"],[`${Math.floor(e%31536e3/86400)}`,"days"],[`${Math.floor(e%86400/3600)}`,"hours"],[`${Math.floor(e%3600/60)}`,"minutes"],[`${Math.floor(e%60)}`,"seconds"]];let y="";for(let T=0,M=_.length;T<M;T++)"0"!==_[T][0]&&(y+=" "+_[T][0]+" "+("1"===_[T][0]?_[T][1].substr(0,_[T][1].length-1):_[T][1]));return y.trim()||"1 second"}}return p.\u0275fac=function(e){return new(e||p)},p.\u0275pipe=r.Yjl({name:"duration",type:p,pure:!1}),p})()},41039:(v,S,i)=>{"use strict";i.d(S,{W:()=>f});var r=i(23815),u=i.n(r),p=i(74788);let f=(()=>{class e{transform(y){return u().isUndefined(y)||u().isNull(y)?"-":u().isNaN(y)?"N/A":y}}return e.\u0275fac=function(y){return new(y||e)},e.\u0275pipe=p.Yjl({name:"empty",type:e,pure:!0}),e})()},21766:(v,S,i)=>{"use strict";i.d(S,{A:()=>u});var r=i(74788);let u=(()=>{class p{transform(e){return`${e} IOPS`}}return p.\u0275fac=function(e){return new(e||p)},p.\u0275pipe=r.Yjl({name:"iops",type:p,pure:!0}),p})()},88820:(v,S,i)=>{"use strict";i.d(S,{V:()=>u});var r=i(74788);let u=(()=>{class p{transform(e){switch(e){case"user:rbd":return"user:rbd (tcmu-runner)";default:return e}}}return p.\u0275fac=function(e){return new(e||p)},p.\u0275pipe=r.Yjl({name:"iscsiBackstore",type:p,pure:!0}),p})()},86969:(v,S,i)=>{"use strict";i.d(S,{A:()=>u});var r=i(74788);let u=(()=>{class p{transform(e){return e.join(", ")}}return p.\u0275fac=function(e){return new(e||p)},p.\u0275pipe=r.Yjl({name:"join",type:p,pure:!0}),p})()},42746:(v,S,i)=>{"use strict";i.d(S,{e:()=>u});var r=i(74788);let u=(()=>{class p{transform(e){return"[DBG]"===e?"debug":"[INF]"===e?"info":"[WRN]"===e?"warn":"[ERR]"===e?"err":""}}return p.\u0275fac=function(e){return new(e||p)},p.\u0275pipe=r.Yjl({name:"logPriority",type:p,pure:!0}),p})()},78877:(v,S,i)=>{"use strict";i.d(S,{b:()=>f});var r=i(23815),u=i.n(r),p=i(74788);let f=(()=>{class e{transform(y,T){return u().isPlainObject(T)?u().get(T,y,y):y}}return e.\u0275fac=function(y){return new(y||e)},e.\u0275pipe=p.Yjl({name:"map",type:e,pure:!0}),e})()},48537:(v,S,i)=>{"use strict";i.d(S,{J:()=>u});var r=i(74788);let u=(()=>{class p{transform(e){return`${e} ms`}}return p.\u0275fac=function(e){return new(e||p)},p.\u0275pipe=r.Yjl({name:"milliseconds",type:p,pure:!0}),p})()},55657:(v,S,i)=>{"use strict";i.d(S,{g:()=>f});var r=i(23815),u=i.n(r),p=i(74788);let f=(()=>{class e{transform(y,T){return""===y?u().defaultTo(T,"n/a"):y}}return e.\u0275fac=function(y){return new(y||e)},e.\u0275pipe=p.Yjl({name:"notAvailable",type:e,pure:!0}),e})()},36569:(v,S,i)=>{"use strict";i.d(S,{f:()=>u});var r=i(74788);let u=(()=>{class p{transform(e){const _=parseInt(e,10);return isNaN(_)?e:e+(1===Math.floor(_/10)?"th":_%10==1?"st":_%10==2?"nd":_%10==3?"rd":"th")}}return p.\u0275fac=function(e){return new(e||p)},p.\u0275pipe=r.Yjl({name:"ordinal",type:p,pure:!0}),p})()},85953:(v,S,i)=>{"use strict";i.d(S,{D:()=>ze});var r=i(12057),u=i(47187),p=i(68962),f=i(70442),e=i(96102),_=i(24310),y=i(58111),T=i(20044),M=i(47557),R=i(66369),F=i(94088),Z=i(41039),J=i(74788);let Q=(()=>{class Ye{transform(Ie){return encodeURIComponent(Ie)}}return Ye.\u0275fac=function(Ie){return new(Ie||Ye)},Ye.\u0275pipe=J.Yjl({name:"encodeUri",type:Ye,pure:!0}),Ye})();var ee=i(21766),ue=i(88820),ae=i(86969),$=i(42746),se=i(78877),ve=i(48537),oe=i(55657),he=i(36569),me=i(90068),Oe=i(60793),ce=i(52821),dt=i(10545);let ze=(()=>{class Ye{}return Ye.\u0275fac=function(Ie){return new(Ie||Ye)},Ye.\u0275mod=J.oAB({type:Ye}),Ye.\u0275inj=J.cJS({providers:[u.I,f.i,p.T,r.uU,y.F,_.t,M.$,T.O,R.n,me.h,ue.V,ae.A,$.e,e.N,Z.W,Q,he.f,ee.A,ve.J,oe.g,dt.m,F.u,se.b,ce.W,Oe.A],imports:[[r.ez]]}),Ye})()},90068:(v,S,i)=>{"use strict";i.d(S,{h:()=>_});var r=i(23815),u=i.n(r),p=i(16738),f=i.n(p),e=i(74788);f().updateLocale("en",{relativeTime:{future:"in %s",past:"%s ago",s:"a few seconds",ss:"%d seconds",m:"a minute",mm:"%d minutes",h:"an hour",hh:"%d hours",d:"a day",dd:"%d days",w:"a week",ww:"%d weeks",M:"a month",MM:"%d months",y:"a year",yy:"%d years"}});let _=(()=>{class y{transform(M,R=!0){let F;if(F=u().isNumber(M)?f().unix(M):f()(M),!F.isValid())return"";let Z=F.fromNow();return R&&(Z=u().upperFirst(Z)),Z}}return y.\u0275fac=function(M){return new(M||y)},y.\u0275pipe=e.Yjl({name:"relativeDate",type:y,pure:!1}),y})()},60793:(v,S,i)=>{"use strict";i.d(S,{A:()=>p});var r=i(74788),u=i(91211);let p=(()=>{class f{constructor(_){this.domSanitizer=_}transform(_){return this.domSanitizer.sanitize(r.q3G.HTML,_)}}return f.\u0275fac=function(_){return new(_||f)(r.Y36(u.H7,16))},f.\u0275pipe=r.Yjl({name:"sanitizeHtml",type:f,pure:!0}),f})()},52821:(v,S,i)=>{"use strict";i.d(S,{W:()=>f});var r=i(23815),u=i.n(r),p=i(74788);let f=(()=>{class e{transform(y,T,M){return u().isString(y)?(M=u().defaultTo(M,""),u().truncate(y,{length:T,omission:M})):y}}return e.\u0275fac=function(y){return new(y||e)},e.\u0275pipe=p.Yjl({name:"truncate",type:e,pure:!0}),e})()},10545:(v,S,i)=>{"use strict";i.d(S,{m:()=>f});var r=i(23815),u=i.n(r),p=i(74788);let f=(()=>{class e{transform(y){return u().upperFirst(y)}}return e.\u0275fac=function(y){return new(y||e)},e.\u0275pipe=p.Yjl({name:"upperFirst",type:e,pure:!0}),e})()},49083:(v,S,i)=>{"use strict";function r(ee,ue){function ae(){return!ae.pred.apply(ae.thisArg,arguments)}return ae.pred=ee,ae.thisArg=ue,ae}i.d(S,{r:()=>Q});var u=i(87444),p=i(45435),f=i(18891),_=i(22759),y=i(79765),T=i(85345);class R{constructor(ue){this.notifier=ue}call(ue,ae){return ae.subscribe(new F(ue,this.notifier,ae))}}class F extends T.Ds{constructor(ue,ae,$){super(ue),this.notifier=ae,this.source=$,this.sourceIsBeingSubscribedTo=!0}notifyNext(){this.sourceIsBeingSubscribedTo=!0,this.source.subscribe(this)}notifyComplete(){if(!1===this.sourceIsBeingSubscribedTo)return super.complete()}complete(){if(this.sourceIsBeingSubscribedTo=!1,!this.isStopped){if(this.retries||this.subscribeToRetries(),!this.retriesSubscription||this.retriesSubscription.closed)return super.complete();this._unsubscribeAndRecycle(),this.notifications.next(void 0)}}_unsubscribe(){const{notifications:ue,retriesSubscription:ae}=this;ue&&(ue.unsubscribe(),this.notifications=void 0),ae&&(ae.unsubscribe(),this.retriesSubscription=void 0),this.retries=void 0}_unsubscribeAndRecycle(){const{_unsubscribe:ue}=this;return this._unsubscribe=null,super._unsubscribeAndRecycle(),this._unsubscribe=ue,this}subscribeToRetries(){let ue;this.notifications=new y.xQ;try{const{notifier:ae}=this;ue=ae(this.notifications)}catch(ae){return super.complete()}this.retries=ue,this.retriesSubscription=(0,T.ft)(ue,new T.IY(this))}}var Z=i(47349),J=i(46782);function Q(){const ee=(0,_.R)(document,"visibilitychange").pipe((0,Z.d)({refCount:!0,bufferSize:1})),[ue,ae]=function(ee,ue,ae){return[(0,p.h)(ue,undefined)(new f.y((0,u.s)(ee))),(0,p.h)(r(ue,undefined))(new f.y((0,u.s)(ee)))]}(ee,()=>"visible"===document.visibilityState);return function($){return $.pipe((0,J.R)(ae),function(ee){return ue=>ue.lift(new R(ee))}(()=>ue))}}},45510:(v,S,i)=>{"use strict";i.d(S,{P:()=>f});var r=i(74788),u=i(6283),p=i(74937);let f=(()=>{class e{constructor(y,T){this.router=y,this.authStorageService=T}canActivate(y,T){return!!this.authStorageService.isLoggedIn()||(this.router.navigate(["/login"],{queryParams:{returnUrl:T.url}}),!1)}canActivateChild(y,T){return this.canActivate(y,T)}}return e.\u0275fac=function(y){return new(y||e)(r.LFG(u.F0),r.LFG(p.j))},e.\u0275prov=r.Yz7({token:e,factory:e.\u0275fac,providedIn:"root"}),e})()},74937:(v,S,i)=>{"use strict";i.d(S,{j:()=>e});var r=i(26215);class u{constructor(y=[]){["read","create","update","delete"].forEach(T=>this[T]=y.includes(T))}}class p{constructor(y){this.hosts=new u(y.hosts),this.configOpt=new u(y["config-opt"]),this.pool=new u(y.pool),this.osd=new u(y.osd),this.monitor=new u(y.monitor),this.rbdImage=new u(y["rbd-image"]),this.iscsi=new u(y.iscsi),this.rbdMirroring=new u(y["rbd-mirroring"]),this.rgw=new u(y.rgw),this.cephfs=new u(y.cephfs),this.manager=new u(y.manager),this.log=new u(y.log),this.user=new u(y.user),this.grafana=new u(y.grafana),this.prometheus=new u(y.prometheus),this.nfs=new u(y["nfs-ganesha"])}}var f=i(74788);let e=(()=>{class _{constructor(){this.isPwdDisplayedSource=new r.X(!1),this.isPwdDisplayed$=this.isPwdDisplayedSource.asObservable()}set(T,M={},R=!1,F=null,Z=!1){localStorage.setItem("dashboard_username",T),localStorage.setItem("dashboard_permissions",JSON.stringify(new p(M))),localStorage.setItem("user_pwd_expiration_date",String(F)),localStorage.setItem("user_pwd_update_required",String(Z)),localStorage.setItem("sso",String(R))}remove(){localStorage.removeItem("dashboard_username"),localStorage.removeItem("user_pwd_expiration_data"),localStorage.removeItem("user_pwd_update_required")}isLoggedIn(){return null!==localStorage.getItem("dashboard_username")}getUsername(){return localStorage.getItem("dashboard_username")}getPermissions(){return JSON.parse(localStorage.getItem("dashboard_permissions")||JSON.stringify(new p({})))}getPwdExpirationDate(){return Number(localStorage.getItem("user_pwd_expiration_date"))}getPwdUpdateRequired(){return"true"===localStorage.getItem("user_pwd_update_required")}isSSO(){return"true"===localStorage.getItem("sso")}}return _.\u0275fac=function(T){return new(T||_)},_.\u0275prov=f.Yz7({token:_,factory:_.\u0275fac,providedIn:"root"}),_})()},72625:(v,S,i)=>{"use strict";i.d(S,{R:()=>T});var r=i(26215),u=i(45435),p=i(88002),f=i(28049),e=i(74255),_=i(74788),y=i(24310);let T=(()=>{class M{constructor(F,Z){this.summaryservice=F,this.cephReleaseNamePipe=Z,this.releaseDataSource=new r.X(null),this.releaseData$=this.releaseDataSource.asObservable(),this.summaryservice.subscribeOnce(J=>{const Q=this.cephReleaseNamePipe.transform(J.version);this.releaseDataSource.next(Q)})}urlGenerator(F,Z="master"){const Q=`https://docs.ceph.com/en/${"master"===Z?"latest":Z}/`,ee="https://ceph.io/";return{iscsi:`${Q}mgr/dashboard/#enabling-iscsi-management`,prometheus:`${Q}mgr/dashboard/#enabling-prometheus-alerting`,"nfs-ganesha":`${Q}mgr/dashboard/#configuring-nfs-ganesha-in-the-dashboard`,"rgw-nfs":`${Q}radosgw/nfs`,rgw:`${Q}mgr/dashboard/#enabling-the-object-gateway-management-frontend`,dashboard:`${Q}mgr/dashboard`,grafana:`${Q}mgr/dashboard/#enabling-the-embedding-of-grafana-dashboards`,orch:`${Q}mgr/orchestrator`,pgs:`${ee}pgcalc`,help:`${ee}help/`,security:`${ee}security/`,trademarks:`${ee}legal-page/trademarks/`,"dashboard-landing-page-status":`${Q}mgr/dashboard/#dashboard-landing-page-status`,"dashboard-landing-page-performance":`${Q}mgr/dashboard/#dashboard-landing-page-performance`,"dashboard-landing-page-capacity":`${Q}mgr/dashboard/#dashboard-landing-page-capacity`}[F]}subscribeOnce(F,Z,J){return this.releaseData$.pipe((0,u.h)(Q=>!!Q),(0,p.U)(Q=>this.urlGenerator(F,Q)),(0,f.P)()).subscribe(Z,J)}}return M.\u0275fac=function(F){return new(F||M)(_.LFG(e.J),_.LFG(y.t))},M.\u0275prov=_.Yz7({token:M,factory:M.\u0275fac,providedIn:"root"}),M})()},4222:(v,S,i)=>{"use strict";i.d(S,{T:()=>e});var r=i(88002),u=i(26504),p=i(74788),f=i(89154);let e=(()=>{class _{constructor(T){this.featureToggles=T}canActivate(T){return this.featureToggles.get().pipe((0,r.U)(M=>{if(!1===M[T.routeConfig.path])throw new u._2;return!0}))}canActivateChild(T){return this.canActivate(T.parent)}}return _.\u0275fac=function(T){return new(T||_)(p.LFG(f.l))},_.\u0275prov=p.Yz7({token:_,factory:_.\u0275fac,providedIn:"root"}),_})()},89154:(v,S,i)=>{"use strict";i.d(S,{l:()=>e});var r=i(74788),u=i(58497),p=i(46947);let e=(()=>{class _{constructor(T,M){this.http=T,this.timerService=M,this.API_URL="api/feature_toggles",this.REFRESH_INTERVAL=3e4,this.featureToggleMap$=this.timerService.get(()=>this.http.get(this.API_URL),this.REFRESH_INTERVAL)}get(){return this.featureToggleMap$}}return _.\u0275fac=function(T){return new(T||_)(r.LFG(u.eN),r.LFG(p.f))},_.\u0275prov=r.Yz7({token:_,factory:_.\u0275fac,providedIn:"root"}),_})()},28211:(v,S,i)=>{"use strict";i.d(S,{H:()=>f});var r=i(23815),u=i.n(r),p=i(74788);let f=(()=>{class e{format_number(y,T,M,R=1){if(u().isString(y)&&(y=Number(y)),!u().isNumber(y))return"-";let F=y<1?0:Math.floor(Math.log(y)/Math.log(T));F=F>=M.length?M.length-1:F;let Z=u().round(y/Math.pow(T,F),R).toString();return""===Z?"-":(""!==M[F]&&(Z=`${Z} ${M[F]}`),Z)}toBytes(y,T=null){const R=["b","k","m","g","t","p","e","z","y"],F=RegExp("^(\\d+(.\\d+)?) ?(["+R.join("")+"]?(b|ib|B/s)?)?$","i").exec(y);if(null===F)return T;let Z=parseFloat(F[1]);return u().isString(F[3])&&(Z*=Math.pow(1024,R.indexOf(F[3].toLowerCase()[0]))),Math.round(Z)}toMilliseconds(y){const M=/^\s*(\d+)\s*(ms)?\s*$/i.exec(y);return null!==M?+M[1]:0}toIops(y){const M=/^\s*(\d+)\s*(IOPS)?\s*$/i.exec(y);return null!==M?+M[1]:0}}return e.\u0275fac=function(y){return new(y||e)},e.\u0275prov=p.Yz7({token:e,factory:e.\u0275fac,providedIn:"root"}),e})()},63285:(v,S,i)=>{"use strict";i.d(S,{Z:()=>p});var r=i(74788),u=i(38549);let p=(()=>{class f{constructor(_){this.modal=_}show(_,y,T){const M=this.modal.open(_,T);return y&&Object.assign(M.componentInstance,y),M}dismissAll(){this.modal.dismissAll()}hasOpenModals(){return this.modal.hasOpenModals()}}return f.\u0275fac=function(_){return new(_||f)(r.LFG(u.FF))},f.\u0275prov=r.Yz7({token:f,factory:f.\u0275fac,providedIn:"root"}),f})()},54462:(v,S,i)=>{"use strict";i.d(S,{P:()=>M});var r=i(25917),u=i(88002),p=i(5304),f=i(65862),e=i(74788),_=i(58497),y=i(6283),T=i(7273);let M=(()=>{class R{constructor(Z,J,Q){this.http=Z,this.router=J,this.mgrModuleService=Q}canActivate(Z){return this.doCheck(Z)}canActivateChild(Z){return this.doCheck(Z)}doCheck(Z){if(Z.url.length>0&&R.ALLOWLIST.includes(Z.url[0].path))return(0,r.of)(!0);const J=Z.data.moduleStatusGuardConfig;let Q=!1;return J.backend&&this.mgrModuleService.getConfig("orchestrator").subscribe(ee=>{Q=J.backend===ee.orchestrator},()=>(this.router.navigate([J.redirectTo]),(0,r.of)(!1))),this.http.get(`ui-api/${J.uiApiPath}/status`).pipe((0,u.U)(ee=>(!ee.available&&!Q&&this.router.navigate([J.redirectTo||""],{state:{header:J.header,message:ee.message,section:J.section,section_info:J.section_info,button_name:J.button_name,button_route:J.button_route,button_title:J.button_title,uiConfig:J.uiConfig,uiApiPath:J.uiApiPath,icon:f.P.wrench,component:J.component}}),ee.available)),(0,p.K)(()=>(this.router.navigate([J.redirectTo]),(0,r.of)(!1))))}}return R.ALLOWLIST=["501"],R.\u0275fac=function(Z){return new(Z||R)(e.LFG(_.eN),e.LFG(y.F0),e.LFG(T.N))},R.\u0275prov=e.Yz7({token:R,factory:R.\u0275fac,providedIn:"root"}),R})()},97161:(v,S,i)=>{"use strict";i.d(S,{g:()=>F});var r=i(23815),u=i.n(r),p=i(26215),f=i(79765),e=i(18001),_=i(61355),y=i(74788),T=i(91376),M=i(68879),R=i(96102);let F=(()=>{class Z{constructor(Q,ee,ue){this.toastr=Q,this.taskMessageService=ee,this.cdDatePipe=ue,this.hideToasties=!1,this.dataSource=new p.X([]),this.data$=this.dataSource.asObservable(),this.sidebarSubject=new f.xQ,this.queued=[],this.KEY="cdNotifications";const ae=localStorage.getItem(this.KEY);let $=[];u().isString(ae)&&($=JSON.parse(ae,(se,ve)=>u().isPlainObject(ve)?u().assign(new _.e,ve):ve)),this.dataSource.next($)}removeAll(){localStorage.removeItem(this.KEY),this.dataSource.next([])}remove(Q){const ee=this.dataSource.getValue();ee.splice(Q,1),this.dataSource.next(ee),localStorage.setItem(this.KEY,JSON.stringify(ee))}save(Q){const ee=this.dataSource.getValue();for(ee.push(Q),ee.sort((ue,ae)=>ue.timestamp>ae.timestamp?-1:1);ee.length>10;)ee.pop();this.dataSource.next(ee),localStorage.setItem(this.KEY,JSON.stringify(ee))}show(Q,ee,ue,ae,$){return window.setTimeout(()=>{let se;se=u().isFunction(Q)?Q():u().isObject(Q)?Q:new _.T(Q,ee,ue,ae,$),this.queueToShow(se)},10)}queueToShow(Q){this.cancel(this.queuedTimeoutId),this.queued.find(ee=>u().isEqual(ee,Q))||this.queued.push(Q),this.queuedTimeoutId=window.setTimeout(()=>{this.showQueued()},500)}showQueued(){this.getUnifiedTitleQueue().forEach(Q=>{const ee=new _.e(Q);ee.isFinishedTask||this.save(ee),this.showToasty(ee)})}getUnifiedTitleQueue(){return Object.values(this.queueShiftByTitle()).map(Q=>{const ee=Q[0];return Q.length>1&&(ee.message="<ul>"+Q.map(ue=>`<li>${ue.message}</li>`).join("")+"</ul>"),ee})}queueShiftByTitle(){const Q={};let ee;for(;ee=this.queued.shift();)Q[ee.title]||(Q[ee.title]=[]),Q[ee.title].push(ee);return Q}showToasty(Q){this.hideToasties||this.toastr[["error","info","success"][Q.type]]((Q.message?Q.message+"<br>":"")+this.renderTimeAndApplicationHtml(Q),Q.title,Q.options)}renderTimeAndApplicationHtml(Q){return`<small class="date">${this.cdDatePipe.transform(Q.timestamp)}</small><i class="float-right custom-icon ${Q.applicationClass}" title="${Q.application}"></i>`}notifyTask(Q,ee=!0){const ue=this.finishedTaskToNotification(Q,ee);return ue.isFinishedTask=!0,this.show(ue)}finishedTaskToNotification(Q,ee=!0){let ue;return ue=Q.success&&ee?new _.T(e.k.success,this.taskMessageService.getSuccessTitle(Q)):new _.T(e.k.error,this.taskMessageService.getErrorTitle(Q),this.taskMessageService.getErrorMessage(Q)),ue.isFinishedTask=!0,ue}cancel(Q){window.clearTimeout(Q)}suspendToasties(Q){this.hideToasties=Q}toggleSidebar(Q=!1){this.sidebarSubject.next(Q)}}return Z.\u0275fac=function(Q){return new(Q||Z)(y.LFG(T._W),y.LFG(M.p),y.LFG(R.N))},Z.\u0275prov=y.Yz7({token:Z,factory:Z.\u0275fac,providedIn:"root"}),Z})()},33888:(v,S,i)=>{"use strict";i.d(S,{q:()=>y});var r=i(23815),u=i.n(r),p=i(88002),f=i(9837);class e{constructor(M){this.pwdPolicyEnabled=M.pwd_policy_enabled,this.pwdPolicyMinLength=M.pwd_policy_min_length,this.pwdPolicyCheckLengthEnabled=M.pwd_policy_check_length_enabled,this.pwdPolicyCheckOldpwdEnabled=M.pwd_policy_check_oldpwd_enabled,this.pwdPolicyCheckUsernameEnabled=M.pwd_policy_check_username_enabled,this.pwdPolicyCheckExclusionListEnabled=M.pwd_policy_check_exclusion_list_enabled,this.pwdPolicyCheckRepetitiveCharsEnabled=M.pwd_policy_check_repetitive_chars_enabled,this.pwdPolicyCheckSequentialCharsEnabled=M.pwd_policy_check_sequential_chars_enabled,this.pwdPolicyCheckComplexityEnabled=M.pwd_policy_check_complexity_enabled}}var _=i(74788);let y=(()=>{class T{constructor(R){this.settingsService=R}getHelpText(){return this.settingsService.getStandardSettings().pipe((0,p.U)(R=>{const F=new e(R);let Z=[];if(F.pwdPolicyEnabled){Z.push("Required rules for passwords:");const J={pwdPolicyCheckLengthEnabled:"Must contain at least " + F.pwdPolicyMinLength + " characters",pwdPolicyCheckOldpwdEnabled:"Must not be the same as the previous one",pwdPolicyCheckUsernameEnabled:"Cannot contain the username",pwdPolicyCheckExclusionListEnabled:"Cannot contain any configured keyword",pwdPolicyCheckRepetitiveCharsEnabled:"Cannot contain any repetitive characters e.g. \"aaa\"",pwdPolicyCheckSequentialCharsEnabled:"Cannot contain any sequential characters e.g. \"abc\"",pwdPolicyCheckComplexityEnabled:"Must consist of characters from the following groups:\n  * Alphabetic a-z, A-Z\n  * Numbers 0-9\n  * Special chars: !\"#$%& '()*+,-./:;<=>?@[\\]^_`{{|}}~\n  * Any other characters (signs)"};Z=Z.concat(u().keys(J).filter(Q=>u().get(F,Q)).map(Q=>"- "+u().get(J,Q)))}return Z.join("\n")}))}mapCreditsToCssClass(R){let F="very-strong";return R<10?F="too-weak":R<15?F="weak":R<20?F="ok":R<25&&(F="strong"),F}}return T.\u0275fac=function(R){return new(R||T)(_.LFG(f.g))},T.\u0275prov=_.Yz7({token:T,factory:T.\u0275fac,providedIn:"root"}),T})()},34089:(v,S,i)=>{"use strict";i.d(S,{n:()=>p});var r=i(30633),u=i(74788);let p=(()=>{class f{constructor(){this.sections=[{heading:"Quality of Service",class:"quality-of-service",options:[{name:"rbd_qos_bps_limit",displayName:"BPS Limit",description:"The desired limit of IO bytes per second.",type:r.r.bps},{name:"rbd_qos_iops_limit",displayName:"IOPS Limit",description:"The desired limit of IO operations per second.",type:r.r.iops},{name:"rbd_qos_read_bps_limit",displayName:"Read BPS Limit",description:"The desired limit of read bytes per second.",type:r.r.bps},{name:"rbd_qos_read_iops_limit",displayName:"Read IOPS Limit",description:"The desired limit of read operations per second.",type:r.r.iops},{name:"rbd_qos_write_bps_limit",displayName:"Write BPS Limit",description:"The desired limit of write bytes per second.",type:r.r.bps},{name:"rbd_qos_write_iops_limit",displayName:"Write IOPS Limit",description:"The desired limit of write operations per second.",type:r.r.iops},{name:"rbd_qos_bps_burst",displayName:"BPS Burst",description:"The desired burst limit of IO bytes.",type:r.r.bps},{name:"rbd_qos_iops_burst",displayName:"IOPS Burst",description:"The desired burst limit of IO operations.",type:r.r.iops},{name:"rbd_qos_read_bps_burst",displayName:"Read BPS Burst",description:"The desired burst limit of read bytes.",type:r.r.bps},{name:"rbd_qos_read_iops_burst",displayName:"Read IOPS Burst",description:"The desired burst limit of read operations.",type:r.r.iops},{name:"rbd_qos_write_bps_burst",displayName:"Write BPS Burst",description:"The desired burst limit of write bytes.",type:r.r.bps},{name:"rbd_qos_write_iops_burst",displayName:"Write IOPS Burst",description:"The desired burst limit of write operations.",type:r.r.iops}]}]}static getOptionsFromSections(_){return _.map(y=>y.options).reduce((y,T)=>y.concat(T))}filterConfigOptionsByName(_){return f.getOptionsFromSections(this.sections).filter(y=>y.name===_)}getOptionValueByName(_,y,T=""){const M=this.filterConfigOptionsByName(_);return 1===M.length?M.pop()[y]:T}getWritableSections(){return this.sections.map(_=>(_.options=_.options.filter(y=>!y.readOnly),_))}getOptionFields(){return f.getOptionsFromSections(this.sections)}getWritableOptionFields(){return f.getOptionsFromSections(this.getWritableSections())}getOptionByName(_){return this.filterConfigOptionsByName(_).pop()}getDisplayName(_){return this.getOptionValueByName(_,"displayName")}getDescription(_){return this.getOptionValueByName(_,"description")}}return f.\u0275fac=function(_){return new(_||f)},f.\u0275prov=u.Yz7({token:f,factory:f.\u0275fac,providedIn:"root"}),f})()},74255:(v,S,i)=>{"use strict";i.d(S,{J:()=>M});var r=i(23815),u=i.n(r),p=i(26215),f=i(45435),e=i(28049),_=i(74788),y=i(58497),T=i(46947);let M=(()=>{class R{constructor(Z,J){this.http=Z,this.timerService=J,this.REFRESH_INTERVAL=5e3,this.summaryDataSource=new p.X(null),this.summaryData$=this.summaryDataSource.asObservable()}startPolling(){return this.timerService.get(()=>this.retrieveSummaryObservable(),this.REFRESH_INTERVAL).subscribe(this.retrieveSummaryObserver())}refresh(){return this.retrieveSummaryObservable().subscribe(this.retrieveSummaryObserver())}retrieveSummaryObservable(){return this.http.get("api/summary")}retrieveSummaryObserver(){return Z=>{this.summaryDataSource.next(Z)}}subscribeOnce(Z,J){return this.summaryData$.pipe((0,f.h)(Q=>!!Q),(0,e.P)()).subscribe(Z,J)}subscribe(Z,J){return this.summaryData$.pipe((0,f.h)(Q=>!!Q)).subscribe(Z,J)}addRunningTask(Z){const J=this.summaryDataSource.getValue();!J||(u().isArray(J.executing_tasks)?J.executing_tasks.find(ee=>ee.name===Z.name&&u().isEqual(ee.metadata,Z.metadata))||J.executing_tasks.push(Z):J.executing_tasks=[Z],this.summaryDataSource.next(J))}}return R.\u0275fac=function(Z){return new(Z||R)(_.LFG(y.eN),_.LFG(T.f))},R.\u0275prov=_.Yz7({token:R,factory:R.\u0275fac,providedIn:"root"}),R})()},38047:(v,S,i)=>{"use strict";i.d(S,{j:()=>f});var r=i(74255),u=i(74788),p=i(68879);let f=(()=>{class e{constructor(y,T){this.taskMessageService=y,this.summaryService=T}init(y,T,M,R,F,Z,J){this.getUpdate=y,this.preProcessing=T,this.setList=M,this.onFetchError=R,this.taskFilter=F,this.itemFilter=Z,this.builders=J||{},this.summaryDataSubscription=this.summaryService.subscribe(Q=>{this.summary=Q,this.fetch()},this.onFetchError)}fetch(y=null){this.getUpdate(y).subscribe(T=>{var M;this.updateData(T,null===(M=this.summary)||void 0===M?void 0:M.executing_tasks.filter(this.taskFilter))},this.onFetchError)}updateData(y,T){const M=this.preProcessing?this.preProcessing(y):y;this.addMissing(M,T),M.forEach(R=>{const F=T.filter(Z=>this.itemFilter(R,Z));R.cdExecuting=this.getTaskAction(F)}),this.setList(M)}addMissing(y,T){const M=this.builders.default;null==T||T.forEach(R=>{const F=y.find(J=>this.itemFilter(J,R)),Z=this.builders[R.name];!F&&(Z||M)&&y.push(Z?Z(R.metadata):M(R.metadata))})}getTaskAction(y){if(0!==y.length)return y.map(T=>{const M=T.progress?` ${T.progress}%`:"";return this.taskMessageService.getRunningText(T)+"..."+M}).join(", ")}ngOnDestroy(){this.summaryDataSubscription&&this.summaryDataSubscription.unsubscribe()}}return e.\u0275fac=function(y){return new(y||e)(u.LFG(p.p),u.LFG(r.J))},e.\u0275prov=u.Yz7({token:e,factory:e.\u0275fac}),e})()},71099:(v,S,i)=>{"use strict";i.d(S,{k:()=>e});var r=i(23815),u=i.n(r),p=i(74788);class f{constructor(y,T,M){this.name=y,this.metadata=T,this.onTaskFinished=M}}let e=(()=>{class _{constructor(){this.subscriptions=[]}init(T){return T.subscribe(M=>{const R=M.executing_tasks,F=M.finished_tasks,Z=[];for(const J of this.subscriptions){const Q=this._getTask(J,F),ee=this._getTask(J,R);null!==Q&&null===ee&&J.onTaskFinished(Q),null!==ee&&Z.push(J),this.subscriptions=Z}})}subscribe(T,M,R){this.subscriptions.push(new f(T,M,R))}_getTask(T,M){for(const R of M)if(R.name===T.name&&u().isEqual(R.metadata,T.metadata))return R;return null}}return _.\u0275fac=function(T){return new(T||_)},_.\u0275prov=p.Yz7({token:_,factory:_.\u0275fac,providedIn:"root"}),_})()},68879:(v,S,i)=>{"use strict";i.d(S,{p:()=>_});var r=(()=>{return(y=r||(r={})).auth="Login",y.cephfs="CephFS",y.rbd="RBD",y.pool="Pool",y.osd="OSD",y.role="Role",y.user="User",r;var y})(),u=i(19358),p=i(74788);class f{constructor(T,M,R){this.running=T,this.failure=M,this.success=R}}class e{constructor(T,M,R){this.operation=T,this.involves=M,this.errors=R||(()=>({}))}failure(T){return "Failed to " + this.operation.failure + " " + this.involves(T) + ""}running(T){return`${this.operation.running} ${this.involves(T)}`}success(T){return`${this.operation.success} ${this.involves(T)}`}}let _=(()=>{class y{constructor(){this.defaultMessage=this.newTaskMessage(new f("Executing","execute","Executed"),M=>M&&(r[M.component]||M.component)||"unknown task",()=>({})),this.commonOperations={create:new f("Creating","create","Created"),update:new f("Updating","update","Updated"),delete:new f("Deleting","delete","Deleted"),add:new f("Adding","add","Added"),remove:new f("Removing","remove","Removed"),import:new f("Importing","import","Imported")},this.rbd={default:M=>"RBD '" + M.image_spec + "'",create:M=>{const R=new u.N(M.pool_name,M.namespace,M.image_name).toString();return "RBD '" + R + "'"},child:M=>{const R=new u.N(M.child_pool_name,M.child_namespace,M.child_image_name).toString();return "RBD '" + R + "'"},destination:M=>{const R=new u.N(M.dest_pool_name,M.dest_namespace,M.dest_image_name).toString();return "RBD '" + R + "'"},snapshot:M=>"RBD snapshot '" + M.image_spec + "@" + M.snapshot_name + "'"},this.rbd_mirroring={site_name:()=>"mirroring site name",bootstrap:()=>"bootstrap token",pool:M=>"mirror mode for pool '" + M.pool_name + "'",pool_peer:M=>"mirror peer for pool '" + M.pool_name + "'"},this.grafana={update_dashboards:()=>"all dashboards"},this.messages={"host/add":this.newTaskMessage(this.commonOperations.add,M=>this.host(M)),"host/remove":this.newTaskMessage(this.commonOperations.remove,M=>this.host(M)),"host/identify_device":this.newTaskMessage(new f("Identifying","identify","Identified"),M=>"device '" + M.device + "' on host '" + M.hostname + "'"),"osd/create":this.newTaskMessage(this.commonOperations.create,M=>"OSDs (DriveGroups: " + M.tracking_id + ")"),"osd/delete":this.newTaskMessage(this.commonOperations.delete,M=>this.osd(M)),"pool/create":this.newTaskMessage(this.commonOperations.create,M=>this.pool(M),M=>({17:"Name is already used by " + this.pool(M) + "."})),"pool/edit":this.newTaskMessage(this.commonOperations.update,M=>this.pool(M),M=>({17:"Name is already used by " + this.pool(M) + "."})),"pool/delete":this.newTaskMessage(this.commonOperations.delete,M=>this.pool(M)),"ecp/create":this.newTaskMessage(this.commonOperations.create,M=>this.ecp(M),M=>({17:"Name is already used by " + this.ecp(M) + "."})),"ecp/delete":this.newTaskMessage(this.commonOperations.delete,M=>this.ecp(M)),"crushRule/create":this.newTaskMessage(this.commonOperations.create,M=>this.crushRule(M),M=>({17:"Name is already used by " + this.crushRule(M) + "."})),"crushRule/delete":this.newTaskMessage(this.commonOperations.delete,M=>this.crushRule(M)),"rbd/create":this.newTaskMessage(this.commonOperations.create,this.rbd.create,M=>({17:"Name is already used by " + this.rbd.create(M) + "."})),"rbd/edit":this.newTaskMessage(this.commonOperations.update,this.rbd.default,M=>({17:"Name is already used by " + this.rbd.default(M) + "."})),"rbd/delete":this.newTaskMessage(this.commonOperations.delete,this.rbd.default,M=>({16:"" + this.rbd.default(M) + " is busy.",39:"" + this.rbd.default(M) + " contains snapshots."})),"rbd/clone":this.newTaskMessage(new f("Cloning","clone","Cloned"),this.rbd.child,M=>({17:"Name is already used by " + this.rbd.child(M) + ".",22:"Snapshot of " + this.rbd.child(M) + " must be protected."})),"rbd/copy":this.newTaskMessage(new f("Copying","copy","Copied"),this.rbd.destination,M=>({17:"Name is already used by " + this.rbd.destination(M) + "."})),"rbd/flatten":this.newTaskMessage(new f("Flattening","flatten","Flattened"),this.rbd.default),"rbd/snap/create":this.newTaskMessage(this.commonOperations.create,this.rbd.snapshot,M=>({17:"Name is already used by " + this.rbd.snapshot(M) + "."})),"rbd/snap/edit":this.newTaskMessage(this.commonOperations.update,this.rbd.snapshot,M=>({16:"Cannot unprotect " + this.rbd.snapshot(M) + " because it contains child images."})),"rbd/snap/delete":this.newTaskMessage(this.commonOperations.delete,this.rbd.snapshot,M=>({16:"Cannot delete " + this.rbd.snapshot(M) + " because it's protected."})),"rbd/snap/rollback":this.newTaskMessage(new f("Rolling back","rollback","Rolled back"),this.rbd.snapshot),"rbd/trash/move":this.newTaskMessage(new f("Moving","move","Moved"),M=>"image '" + M.image_spec + "' to trash",()=>({2:"Could not find image."})),"rbd/trash/restore":this.newTaskMessage(new f("Restoring","restore","Restored"),M=>"image '" + M.image_id_spec + "' into '" + M.new_image_name + "'",M=>({17:"Image name '" + M.new_image_name + "' is already in use."})),"rbd/trash/remove":this.newTaskMessage(new f("Deleting","delete","Deleted"),M=>"image '" + M.image_id_spec + "'"),"rbd/trash/purge":this.newTaskMessage(new f("Purging","purge","Purged"),M=>{let R="all pools";return M.pool_name&&(R=`'${M.pool_name}'`),"images from " + R + ""}),"rbd/mirroring/site_name/edit":this.newTaskMessage(this.commonOperations.update,this.rbd_mirroring.site_name,()=>({})),"rbd/mirroring/bootstrap/create":this.newTaskMessage(this.commonOperations.create,this.rbd_mirroring.bootstrap,()=>({})),"rbd/mirroring/bootstrap/import":this.newTaskMessage(this.commonOperations.import,this.rbd_mirroring.bootstrap,()=>({})),"rbd/mirroring/pool/edit":this.newTaskMessage(this.commonOperations.update,this.rbd_mirroring.pool,()=>({16:"Cannot disable mirroring because it contains a peer."})),"rbd/mirroring/peer/add":this.newTaskMessage(this.commonOperations.create,this.rbd_mirroring.pool_peer,()=>({})),"rbd/mirroring/peer/edit":this.newTaskMessage(this.commonOperations.update,this.rbd_mirroring.pool_peer,()=>({})),"rbd/mirroring/peer/delete":this.newTaskMessage(this.commonOperations.delete,this.rbd_mirroring.pool_peer,()=>({})),"iscsi/target/create":this.newTaskMessage(this.commonOperations.create,M=>this.iscsiTarget(M)),"iscsi/target/edit":this.newTaskMessage(this.commonOperations.update,M=>this.iscsiTarget(M)),"iscsi/target/delete":this.newTaskMessage(this.commonOperations.delete,M=>this.iscsiTarget(M)),"nfs/create":this.newTaskMessage(this.commonOperations.create,M=>this.nfs(M)),"nfs/edit":this.newTaskMessage(this.commonOperations.update,M=>this.nfs(M)),"nfs/delete":this.newTaskMessage(this.commonOperations.delete,M=>this.nfs(M)),"grafana/dashboards/update":this.newTaskMessage(this.commonOperations.update,this.grafana.update_dashboards,()=>({})),"service/create":this.newTaskMessage(this.commonOperations.create,M=>this.service(M)),"service/edit":this.newTaskMessage(this.commonOperations.update,M=>this.service(M)),"service/delete":this.newTaskMessage(this.commonOperations.delete,M=>this.service(M))}}newTaskMessage(M,R,F){return new e(M,R,F)}host(M){return "host '" + M.hostname + "'"}osd(M){return "OSD '" + M.svc_id + "'"}pool(M){return "pool '" + M.pool_name + "'"}ecp(M){return "erasure code profile '" + M.name + "'"}crushRule(M){return "crush rule '" + M.name + "'"}iscsiTarget(M){return "target '" + M.target_iqn + "'"}nfs(M){return "NFS '" + M.cluster_id + ":" + (M.export_id ? M.export_id : M.path) + "'"}service(M){return "Service '" + M.service_name + "'"}_getTaskTitle(M){return M.name&&M.name.startsWith("progress/")?this.newTaskMessage(new f(M.name.replace("progress/",""),"",M.name.replace("progress/","")),R=>""):this.messages[M.name]||this.defaultMessage}getSuccessTitle(M){return this._getTaskTitle(M).success(M.metadata)}getErrorMessage(M){return this._getTaskTitle(M).errors(M.metadata)[M.exception.code]||M.exception.detail}getErrorTitle(M){return this._getTaskTitle(M).failure(M.metadata)}getRunningTitle(M){return this._getTaskTitle(M).running(M.metadata)}getRunningText(M){return this._getTaskTitle(M).operation.running}}return y.\u0275fac=function(M){return new(M||y)},y.\u0275prov=p.Yz7({token:y,factory:y.\u0275fac,providedIn:"root"}),y})()},32337:(v,S,i)=>{"use strict";i.d(S,{P:()=>R});var r=i(18891),u=i(18001),p=i(61355),f=i(60737),e=i(97161),_=i(74255),y=i(71099),T=i(74788),M=i(68879);let R=(()=>{class F{constructor(J,Q,ee,ue){this.notificationService=J,this.summaryService=Q,this.taskMessageService=ee,this.taskManagerService=ue}wrapTaskAroundCall({task:J,call:Q}){return new r.y(ee=>{Q.subscribe(ue=>{202===ue.status?this._handleExecutingTasks(J):(this.summaryService.refresh(),J.success=!0,this.notificationService.notifyTask(J))},ue=>{J.success=!1,J.exception=ue.error,ee.error(ue)},()=>{ee.complete()})})}_handleExecutingTasks(J){const Q=new p.T(u.k.info,this.taskMessageService.getRunningTitle(J));Q.isFinishedTask=!0,this.notificationService.show(Q);const ee=new f.o(J.name,J.metadata);this.summaryService.addRunningTask(ee),this.taskManagerService.subscribe(ee.name,ee.metadata,ue=>{this.notificationService.notifyTask(ue)})}}return F.\u0275fac=function(J){return new(J||F)(T.LFG(e.g),T.LFG(_.J),T.LFG(M.p),T.LFG(y.k))},F.\u0275prov=T.Yz7({token:F,factory:F.\u0275fac,providedIn:"root"}),F})()},46947:(v,S,i)=>{"use strict";i.d(S,{f:()=>Z});var r=i(46797),u=i(59746),p=i(43190),f=i(47349),e=i(49083),_=i(74788),y=i(33637);class T{constructor(Q){this.zone=Q,this.scheduler=y.z}now(){return this.scheduler.now()}}let M=(()=>{class J extends T{constructor(ee){super(ee)}schedule(...ee){return this.zone.runOutsideAngular(()=>this.scheduler.schedule.apply(this.scheduler,ee))}}return J.\u0275fac=function(ee){return new(ee||J)(_.LFG(_.R0b))},J.\u0275prov=_.Yz7({token:J,factory:J.\u0275fac,providedIn:"root"}),J})(),R=(()=>{class J extends T{constructor(ee){super(ee)}schedule(...ee){return this.zone.run(()=>this.scheduler.schedule.apply(this.scheduler,ee))}}return J.\u0275fac=function(ee){return new(ee||J)(_.LFG(_.R0b))},J.\u0275prov=_.Yz7({token:J,factory:J.\u0275fac,providedIn:"root"}),J})(),F=(()=>{class J{constructor(ee,ue){this.leave=ee,this.enter=ue}}return J.\u0275fac=function(ee){return new(ee||J)(_.LFG(M),_.LFG(R))},J.\u0275prov=_.Yz7({token:J,factory:J.\u0275fac,providedIn:"root"}),J})(),Z=(()=>{class J{constructor(ee){this.ngZone=ee,this.DEFAULT_REFRESH_INTERVAL=5e3,this.DEFAULT_DUE_TIME=0}get(ee,ue=this.DEFAULT_REFRESH_INTERVAL,ae=this.DEFAULT_DUE_TIME){return(0,r.H)(ae,ue,this.ngZone.leave).pipe((0,u.QV)(this.ngZone.enter),(0,p.w)(ee),(0,f.d)({refCount:!0,bufferSize:1}),(0,e.r)())}}return J.\u0275fac=function(ee){return new(ee||J)(_.LFG(F))},J.\u0275prov=_.Yz7({token:J,factory:J.\u0275fac,providedIn:"root"}),J})()},51847:(v,S,i)=>{"use strict";i.d(S,{F:()=>p});var r=i(12057),u=i(79512);class p{constructor(e){this.base=e}static concatURLSegments(e){return e.reduce(r.Ye.joinWithSlash)}static buildURL(e,..._){return p.concatURLSegments([...e?["/"]:[],..._])}getURL(e,_=!0,...y){return p.buildURL(_,this.base,e,...y)}getCreate(e=!0){return this.getURL(u.MQ.CREATE,e)}getCreateFrom(e,_=!0){return this.getURL(u.MQ.CREATE,_,e)}getDelete(e=!0){return this.getURL(u.MQ.DELETE,e)}getEdit(e,_=!0){return this.getURL(u.MQ.EDIT,_,e)}getUpdate(e,_=!0){return this.getURL(u.MQ.UPDATE,_,e)}getAdd(e=!0){return this.getURL(u.MQ.ADD,e)}getRemove(e=!0){return this.getURL(u.MQ.REMOVE,e)}getRecreate(e,_=!0){return this.getURL(u.MQ.RECREATE,_,e)}}},44466:(v,S,i)=>{"use strict";i.d(S,{m:()=>F});var r=i(12057),u=i(99475),p=i(15626),f=i(2149),e=i(35540),_=i(85953),y=i(45510),T=i(74937),M=i(28211),R=i(74788);let F=(()=>{class Z{}return Z.\u0275fac=function(Q){return new(Q||Z)},Z.\u0275mod=R.oAB({type:Z}),Z.\u0275inj=R.cJS({providers:[T.j,y.P,M.H,u.P],imports:[[r.ez,_.D,p.K,f.t,e.o],p.K,_.D,f.t,e.o]}),Z})()},92340:(v,S,i)=>{"use strict";i.d(S,{N:()=>r});const r={default_lang:"en-US",production:!0,year:"2022"}},66492:(v,S,i)=>{"use strict";var r={};i.r(r),i.d(r,{JsonPatchError:()=>ac,_areEquals:()=>r1,applyOperation:()=>qm,applyPatch:()=>vm,applyReducer:()=>T3,deepClone:()=>M0,getValueByPointer:()=>fg,validate:()=>eS,validator:()=>A0});var u={};i.r(u),i.d(u,{compare:()=>xN,generate:()=>rS,observe:()=>M3,unobserve:()=>nS});var p={};i.r(p),i.d(p,{cookie:()=>b8,header:()=>y8,path:()=>g8,query:()=>m8});var f=i(91211),e=i(74788),_=i(12057),y=i(58497),T=i(56083);function M(){return"undefined"!=typeof window&&void 0!==window.document}function R(){return"undefined"!=typeof process&&"[object process]"==={}.toString.call(process)}function F(n){switch(n.length){case 0:return new T.ZN;case 1:return n[0];default:return new T.ZE(n)}}function Z(n,s,t,o,c={},g={}){const C=[],D=[];let P=-1,j=null;if(o.forEach(W=>{const re=W.offset,ie=re==P,ge=ie&&j||{};Object.keys(W).forEach(_e=>{let Le=_e,Re=W[_e];if("offset"!==_e)switch(Le=s.normalizePropertyName(Le,C),Re){case T.k1:Re=c[_e];break;case T.l3:Re=g[_e];break;default:Re=s.normalizeStyleValue(_e,Le,Re,C)}ge[Le]=Re}),ie||D.push(ge),j=ge,P=re}),C.length){const W="\n - ";throw new Error(`Unable to animate due to the following errors:${W}${C.join(W)}`)}return D}function J(n,s,t,o){switch(s){case"start":n.onStart(()=>o(t&&Q(t,"start",n)));break;case"done":n.onDone(()=>o(t&&Q(t,"done",n)));break;case"destroy":n.onDestroy(()=>o(t&&Q(t,"destroy",n)))}}function Q(n,s,t){const o=t.totalTime,g=ee(n.element,n.triggerName,n.fromState,n.toState,s||n.phaseName,null==o?n.totalTime:o,!!t.disabled),C=n._data;return null!=C&&(g._data=C),g}function ee(n,s,t,o,c="",g=0,C){return{element:n,triggerName:s,fromState:t,toState:o,phaseName:c,totalTime:g,disabled:!!C}}function ue(n,s,t){let o;return n instanceof Map?(o=n.get(s),o||n.set(s,o=t)):(o=n[s],o||(o=n[s]=t)),o}function ae(n){const s=n.indexOf(":");return[n.substring(1,s),n.substr(s+1)]}let $=(n,s)=>!1,ve=(n,s)=>!1,he=(n,s,t)=>[];const Oe=R();(Oe||"undefined"!=typeof Element)&&($=M()?(n,s)=>{for(;s&&s!==document.documentElement;){if(s===n)return!0;s=s.parentNode||s.host}return!1}:(n,s)=>n.contains(s),ve=(()=>{if(Oe||Element.prototype.matches)return(n,s)=>n.matches(s);{const n=Element.prototype,s=n.matchesSelector||n.mozMatchesSelector||n.msMatchesSelector||n.oMatchesSelector||n.webkitMatchesSelector;return s?(t,o)=>s.apply(t,[o]):ve}})(),he=(n,s,t)=>{let o=[];if(t){const c=n.querySelectorAll(s);for(let g=0;g<c.length;g++)o.push(c[g])}else{const c=n.querySelector(s);c&&o.push(c)}return o});let dt=null,ze=!1;function Ye(n){dt||(dt=("undefined"!=typeof document?document.body:null)||{},ze=!!dt.style&&"WebkitAppearance"in dt.style);let s=!0;return dt.style&&!function(n){return"ebkit"==n.substring(1,6)}(n)&&(s=n in dt.style,!s&&ze&&(s="Webkit"+n.charAt(0).toUpperCase()+n.substr(1)in dt.style)),s}const Ie=ve,Ve=$,He=he;function Zt(n){const s={};return Object.keys(n).forEach(t=>{const o=t.replace(/([a-z])([A-Z])/g,"$1-$2");s[o]=n[t]}),s}let st=(()=>{class n{validateStyleProperty(t){return Ye(t)}matchesElement(t,o){return Ie(t,o)}containsElement(t,o){return Ve(t,o)}query(t,o,c){return He(t,o,c)}computeStyle(t,o,c){return c||""}animate(t,o,c,g,C,D=[],P){return new T.ZN(c,g)}}return n.\u0275fac=function(t){return new(t||n)},n.\u0275prov=e.Yz7({token:n,factory:n.\u0275fac}),n})(),en=(()=>{class n{}return n.NOOP=new st,n})();const Bt="ng-enter",mt="ng-leave",zt="ng-trigger",Yn=".ng-trigger",Hr="ng-animating",ci=".ng-animating";function Ir(n){if("number"==typeof n)return n;const s=n.match(/^(-?[\.\d]+)(m?s)/);return!s||s.length<2?0:wr(parseFloat(s[1]),s[2])}function wr(n,s){switch(s){case"s":return 1e3*n;default:return n}}function Qr(n,s,t){return n.hasOwnProperty("duration")?n:function(n,s,t){let c,g=0,C="";if("string"==typeof n){const D=n.match(/^(-?[\.\d]+)(m?s)(?:\s+(-?[\.\d]+)(m?s))?(?:\s+([-a-z]+(?:\(.+?\))?))?$/i);if(null===D)return s.push(`The provided timing value "${n}" is invalid.`),{duration:0,delay:0,easing:""};c=wr(parseFloat(D[1]),D[2]);const P=D[3];null!=P&&(g=wr(parseFloat(P),D[4]));const j=D[5];j&&(C=j)}else c=n;if(!t){let D=!1,P=s.length;c<0&&(s.push("Duration values below 0 are not allowed for this animation step."),D=!0),g<0&&(s.push("Delay values below 0 are not allowed for this animation step."),D=!0),D&&s.splice(P,0,`The provided timing value "${n}" is invalid.`)}return{duration:c,delay:g,easing:C}}(n,s,t)}function In(n,s={}){return Object.keys(n).forEach(t=>{s[t]=n[t]}),s}function Zr(n,s,t={}){if(s)for(let o in n)t[o]=n[o];else In(n,t);return t}function Ur(n,s,t){return t?s+":"+t+";":""}function di(n){let s="";for(let t=0;t<n.style.length;t++){const o=n.style.item(t);s+=Ur(0,o,n.style.getPropertyValue(o))}for(const t in n.style)n.style.hasOwnProperty(t)&&!t.startsWith("_")&&(s+=Ur(0,hi(t),n.style[t]));n.setAttribute("style",s)}function $i(n,s,t){n.style&&(Object.keys(s).forEach(o=>{const c=zr(o);t&&!t.hasOwnProperty(o)&&(t[o]=n.style[c]),n.style[c]=s[o]}),R()&&di(n))}function Hi(n,s){n.style&&(Object.keys(s).forEach(t=>{const o=zr(t);n.style[o]=""}),R()&&di(n))}function Br(n){return Array.isArray(n)?1==n.length?n[0]:(0,T.vP)(n):n}const Wt=new RegExp("{{\\s*(.+?)\\s*}}","g");function Jn(n){let s=[];if("string"==typeof n){let t;for(;t=Wt.exec(n);)s.push(t[1]);Wt.lastIndex=0}return s}function ir(n,s,t){const o=n.toString(),c=o.replace(Wt,(g,C)=>{let D=s[C];return s.hasOwnProperty(C)||(t.push(`Please provide a value for the animation param ${C}`),D=""),D.toString()});return c==o?n:c}function Lr(n){const s=[];let t=n.next();for(;!t.done;)s.push(t.value),t=n.next();return s}const Vn=/-+([a-z0-9])/g;function zr(n){return n.replace(Vn,(...s)=>s[1].toUpperCase())}function hi(n){return n.replace(/([a-z])([A-Z])/g,"$1-$2").toLowerCase()}function Ai(n,s){return 0===n||0===s}function Tr(n,s,t){const o=Object.keys(t);if(o.length&&s.length){let g=s[0],C=[];if(o.forEach(D=>{g.hasOwnProperty(D)||C.push(D),g[D]=t[D]}),C.length)for(var c=1;c<s.length;c++){let D=s[c];C.forEach(function(P){D[P]=gn(n,P)})}}return s}function Nr(n,s,t){switch(s.type){case 7:return n.visitTrigger(s,t);case 0:return n.visitState(s,t);case 1:return n.visitTransition(s,t);case 2:return n.visitSequence(s,t);case 3:return n.visitGroup(s,t);case 4:return n.visitAnimate(s,t);case 5:return n.visitKeyframes(s,t);case 6:return n.visitStyle(s,t);case 8:return n.visitReference(s,t);case 9:return n.visitAnimateChild(s,t);case 10:return n.visitAnimateRef(s,t);case 11:return n.visitQuery(s,t);case 12:return n.visitStagger(s,t);default:throw new Error(`Unable to resolve animation metadata node #${s.type}`)}}function gn(n,s){return window.getComputedStyle(n)[s]}function mr(n,s){const t=[];return"string"==typeof n?n.split(/\s*,\s*/).forEach(o=>function(n,s,t){if(":"==n[0]){const P=function(n,s){switch(n){case":enter":return"void => *";case":leave":return"* => void";case":increment":return(t,o)=>parseFloat(o)>parseFloat(t);case":decrement":return(t,o)=>parseFloat(o)<parseFloat(t);default:return s.push(`The transition alias value "${n}" is not supported`),"* => *"}}(n,t);if("function"==typeof P)return void s.push(P);n=P}const o=n.match(/^(\*|[-\w]+)\s*(<?[=-]>)\s*(\*|[-\w]+)$/);if(null==o||o.length<4)return t.push(`The provided transition expression "${n}" is not supported`),s;const c=o[1],g=o[2],C=o[3];s.push(Ii(c,C));"<"==g[0]&&!("*"==c&&"*"==C)&&s.push(Ii(C,c))}(o,t,s)):t.push(n),t}const vr=new Set(["true","1"]),si=new Set(["false","0"]);function Ii(n,s){const t=vr.has(n)||si.has(n),o=vr.has(s)||si.has(s);return(c,g)=>{let C="*"==n||n==c,D="*"==s||s==g;return!C&&t&&"boolean"==typeof c&&(C=c?vr.has(n):si.has(n)),!D&&o&&"boolean"==typeof g&&(D=g?vr.has(s):si.has(s)),C&&D}}const so=new RegExp("s*:selfs*,?","g");function Ze(n,s,t){return new jt(n).build(s,t)}class jt{constructor(s){this._driver=s}build(s,t){const o=new Wn(t);return this._resetContextStyleTimingState(o),Nr(this,Br(s),o)}_resetContextStyleTimingState(s){s.currentQuerySelector="",s.collectedStyles={},s.collectedStyles[""]={},s.currentTime=0}visitTrigger(s,t){let o=t.queryCount=0,c=t.depCount=0;const g=[],C=[];return"@"==s.name.charAt(0)&&t.errors.push("animation triggers cannot be prefixed with an `@` sign (e.g. trigger('@foo', [...]))"),s.definitions.forEach(D=>{if(this._resetContextStyleTimingState(t),0==D.type){const P=D,j=P.name;j.toString().split(/\s*,\s*/).forEach(W=>{P.name=W,g.push(this.visitState(P,t))}),P.name=j}else if(1==D.type){const P=this.visitTransition(D,t);o+=P.queryCount,c+=P.depCount,C.push(P)}else t.errors.push("only state() and transition() definitions can sit inside of a trigger()")}),{type:7,name:s.name,states:g,transitions:C,queryCount:o,depCount:c,options:null}}visitState(s,t){const o=this.visitStyle(s.styles,t),c=s.options&&s.options.params||null;if(o.containsDynamicStyles){const g=new Set,C=c||{};if(o.styles.forEach(D=>{if(wn(D)){const P=D;Object.keys(P).forEach(j=>{Jn(P[j]).forEach(W=>{C.hasOwnProperty(W)||g.add(W)})})}}),g.size){const D=Lr(g.values());t.errors.push(`state("${s.name}", ...) must define default values for all the following style substitutions: ${D.join(", ")}`)}}return{type:0,name:s.name,style:o,options:c?{params:c}:null}}visitTransition(s,t){t.queryCount=0,t.depCount=0;const o=Nr(this,Br(s.animation),t);return{type:1,matchers:mr(s.expr,t.errors),animation:o,queryCount:t.queryCount,depCount:t.depCount,options:Gi(s.options)}}visitSequence(s,t){return{type:2,steps:s.steps.map(o=>Nr(this,o,t)),options:Gi(s.options)}}visitGroup(s,t){const o=t.currentTime;let c=0;const g=s.steps.map(C=>{t.currentTime=o;const D=Nr(this,C,t);return c=Math.max(c,t.currentTime),D});return t.currentTime=c,{type:3,steps:g,options:Gi(s.options)}}visitAnimate(s,t){const o=function(n,s){let t=null;if(n.hasOwnProperty("duration"))t=n;else if("number"==typeof n)return po(Qr(n,s).duration,0,"");const o=n;if(o.split(/\s+/).some(g=>"{"==g.charAt(0)&&"{"==g.charAt(1))){const g=po(0,0,"");return g.dynamic=!0,g.strValue=o,g}return t=t||Qr(o,s),po(t.duration,t.delay,t.easing)}(s.timings,t.errors);t.currentAnimateTimings=o;let c,g=s.styles?s.styles:(0,T.oB)({});if(5==g.type)c=this.visitKeyframes(g,t);else{let C=s.styles,D=!1;if(!C){D=!0;const j={};o.easing&&(j.easing=o.easing),C=(0,T.oB)(j)}t.currentTime+=o.duration+o.delay;const P=this.visitStyle(C,t);P.isEmptyStep=D,c=P}return t.currentAnimateTimings=null,{type:4,timings:o,style:c,options:null}}visitStyle(s,t){const o=this._makeStyleAst(s,t);return this._validateStyleAst(o,t),o}_makeStyleAst(s,t){const o=[];Array.isArray(s.styles)?s.styles.forEach(C=>{"string"==typeof C?C==T.l3?o.push(C):t.errors.push(`The provided style string value ${C} is not allowed.`):o.push(C)}):o.push(s.styles);let c=!1,g=null;return o.forEach(C=>{if(wn(C)){const D=C,P=D.easing;if(P&&(g=P,delete D.easing),!c)for(let j in D)if(D[j].toString().indexOf("{{")>=0){c=!0;break}}}),{type:6,styles:o,easing:g,offset:s.offset,containsDynamicStyles:c,options:null}}_validateStyleAst(s,t){const o=t.currentAnimateTimings;let c=t.currentTime,g=t.currentTime;o&&g>0&&(g-=o.duration+o.delay),s.styles.forEach(C=>{"string"!=typeof C&&Object.keys(C).forEach(D=>{if(!this._driver.validateStyleProperty(D))return void t.errors.push(`The provided animation property "${D}" is not a supported CSS property for animations`);const P=t.collectedStyles[t.currentQuerySelector],j=P[D];let W=!0;j&&(g!=c&&g>=j.startTime&&c<=j.endTime&&(t.errors.push(`The CSS property "${D}" that exists between the times of "${j.startTime}ms" and "${j.endTime}ms" is also being animated in a parallel animation between the times of "${g}ms" and "${c}ms"`),W=!1),g=j.startTime),W&&(P[D]={startTime:g,endTime:c}),t.options&&function(n,s,t){const o=s.params||{},c=Jn(n);c.length&&c.forEach(g=>{o.hasOwnProperty(g)||t.push(`Unable to resolve the local animation param ${g} in the given list of values`)})}(C[D],t.options,t.errors)})})}visitKeyframes(s,t){const o={type:5,styles:[],options:null};if(!t.currentAnimateTimings)return t.errors.push("keyframes() must be placed inside of a call to animate()"),o;let g=0;const C=[];let D=!1,P=!1,j=0;const W=s.steps.map(ke=>{const xe=this._makeStyleAst(ke,t);let U=null!=xe.offset?xe.offset:function(n){if("string"==typeof n)return null;let s=null;if(Array.isArray(n))n.forEach(t=>{if(wn(t)&&t.hasOwnProperty("offset")){const o=t;s=parseFloat(o.offset),delete o.offset}});else if(wn(n)&&n.hasOwnProperty("offset")){const t=n;s=parseFloat(t.offset),delete t.offset}return s}(xe.styles),pt=0;return null!=U&&(g++,pt=xe.offset=U),P=P||pt<0||pt>1,D=D||pt<j,j=pt,C.push(pt),xe});P&&t.errors.push("Please ensure that all keyframe offsets are between 0 and 1"),D&&t.errors.push("Please ensure that all keyframe offsets are in order");const re=s.steps.length;let ie=0;g>0&&g<re?t.errors.push("Not all style() steps within the declared keyframes() contain offsets"):0==g&&(ie=1/(re-1));const ge=re-1,_e=t.currentTime,Le=t.currentAnimateTimings,Re=Le.duration;return W.forEach((ke,xe)=>{const U=ie>0?xe==ge?1:ie*xe:C[xe],pt=U*Re;t.currentTime=_e+Le.delay+pt,Le.duration=pt,this._validateStyleAst(ke,t),ke.offset=U,o.styles.push(ke)}),o}visitReference(s,t){return{type:8,animation:Nr(this,Br(s.animation),t),options:Gi(s.options)}}visitAnimateChild(s,t){return t.depCount++,{type:9,options:Gi(s.options)}}visitAnimateRef(s,t){return{type:10,animation:this.visitReference(s.animation,t),options:Gi(s.options)}}visitQuery(s,t){const o=t.currentQuerySelector,c=s.options||{};t.queryCount++,t.currentQuery=s;const[g,C]=function(n){const s=!!n.split(/\s*,\s*/).find(t=>":self"==t);return s&&(n=n.replace(so,"")),[n=n.replace(/@\*/g,Yn).replace(/@\w+/g,t=>Yn+"-"+t.substr(1)).replace(/:animating/g,ci),s]}(s.selector);t.currentQuerySelector=o.length?o+" "+g:g,ue(t.collectedStyles,t.currentQuerySelector,{});const D=Nr(this,Br(s.animation),t);return t.currentQuery=null,t.currentQuerySelector=o,{type:11,selector:g,limit:c.limit||0,optional:!!c.optional,includeSelf:C,animation:D,originalSelector:s.selector,options:Gi(s.options)}}visitStagger(s,t){t.currentQuery||t.errors.push("stagger() can only be used inside of query()");const o="full"===s.timings?{duration:0,delay:0,easing:"full"}:Qr(s.timings,t.errors,!0);return{type:12,animation:Nr(this,Br(s.animation),t),timings:o,options:null}}}class Wn{constructor(s){this.errors=s,this.queryCount=0,this.depCount=0,this.currentTransition=null,this.currentQuery=null,this.currentQuerySelector=null,this.currentAnimateTimings=null,this.currentTime=0,this.collectedStyles={},this.options=null}}function wn(n){return!Array.isArray(n)&&"object"==typeof n}function Gi(n){return n?(n=In(n)).params&&(n.params=function(n){return n?In(n):null}(n.params)):n={},n}function po(n,s,t){return{duration:n,delay:s,easing:t}}function yo(n,s,t,o,c,g,C=null,D=!1){return{type:1,element:n,keyframes:s,preStyleProps:t,postStyleProps:o,duration:c,delay:g,totalTime:c+g,easing:C,subTimeline:D}}class Mo{constructor(){this._map=new Map}consume(s){let t=this._map.get(s);return t?this._map.delete(s):t=[],t}append(s,t){let o=this._map.get(s);o||this._map.set(s,o=[]),o.push(...t)}has(s){return this._map.has(s)}clear(){this._map.clear()}}const zo=new RegExp(":enter","g"),Si=new RegExp(":leave","g");function ai(n,s,t,o,c,g={},C={},D,P,j=[]){return(new Zn).buildKeyframes(n,s,t,o,c,g,C,D,P,j)}class Zn{buildKeyframes(s,t,o,c,g,C,D,P,j,W=[]){j=j||new Mo;const re=new yr(s,t,j,c,g,W,[]);re.options=P,re.currentTimeline.setStyles([C],null,re.errors,P),Nr(this,o,re);const ie=re.timelines.filter(ge=>ge.containsAnimation());if(ie.length&&Object.keys(D).length){const ge=ie[ie.length-1];ge.allowOnlyTimelineStyles()||ge.setStyles([D],null,re.errors,P)}return ie.length?ie.map(ge=>ge.buildKeyframes()):[yo(t,[],[],[],0,0,"",!1)]}visitTrigger(s,t){}visitState(s,t){}visitTransition(s,t){}visitAnimateChild(s,t){const o=t.subInstructions.consume(t.element);if(o){const c=t.createSubContext(s.options),g=t.currentTimeline.currentTime,C=this._visitSubInstructions(o,c,c.options);g!=C&&t.transformIntoNewTimeline(C)}t.previousNode=s}visitAnimateRef(s,t){const o=t.createSubContext(s.options);o.transformIntoNewTimeline(),this.visitReference(s.animation,o),t.transformIntoNewTimeline(o.currentTimeline.currentTime),t.previousNode=s}_visitSubInstructions(s,t,o){let g=t.currentTimeline.currentTime;const C=null!=o.duration?Ir(o.duration):null,D=null!=o.delay?Ir(o.delay):null;return 0!==C&&s.forEach(P=>{const j=t.appendInstructionToTimeline(P,C,D);g=Math.max(g,j.duration+j.delay)}),g}visitReference(s,t){t.updateOptions(s.options,!0),Nr(this,s.animation,t),t.previousNode=s}visitSequence(s,t){const o=t.subContextCount;let c=t;const g=s.options;if(g&&(g.params||g.delay)&&(c=t.createSubContext(g),c.transformIntoNewTimeline(),null!=g.delay)){6==c.previousNode.type&&(c.currentTimeline.snapshotCurrentStyles(),c.previousNode=cr);const C=Ir(g.delay);c.delayNextStep(C)}s.steps.length&&(s.steps.forEach(C=>Nr(this,C,c)),c.currentTimeline.applyStylesToKeyframe(),c.subContextCount>o&&c.transformIntoNewTimeline()),t.previousNode=s}visitGroup(s,t){const o=[];let c=t.currentTimeline.currentTime;const g=s.options&&s.options.delay?Ir(s.options.delay):0;s.steps.forEach(C=>{const D=t.createSubContext(s.options);g&&D.delayNextStep(g),Nr(this,C,D),c=Math.max(c,D.currentTimeline.currentTime),o.push(D.currentTimeline)}),o.forEach(C=>t.currentTimeline.mergeTimelineCollectedStyles(C)),t.transformIntoNewTimeline(c),t.previousNode=s}_visitTiming(s,t){if(s.dynamic){const o=s.strValue;return Qr(t.params?ir(o,t.params,t.errors):o,t.errors)}return{duration:s.duration,delay:s.delay,easing:s.easing}}visitAnimate(s,t){const o=t.currentAnimateTimings=this._visitTiming(s.timings,t),c=t.currentTimeline;o.delay&&(t.incrementTime(o.delay),c.snapshotCurrentStyles());const g=s.style;5==g.type?this.visitKeyframes(g,t):(t.incrementTime(o.duration),this.visitStyle(g,t),c.applyStylesToKeyframe()),t.currentAnimateTimings=null,t.previousNode=s}visitStyle(s,t){const o=t.currentTimeline,c=t.currentAnimateTimings;!c&&o.getCurrentStyleProperties().length&&o.forwardFrame();const g=c&&c.easing||s.easing;s.isEmptyStep?o.applyEmptyStep(g):o.setStyles(s.styles,g,t.errors,t.options),t.previousNode=s}visitKeyframes(s,t){const o=t.currentAnimateTimings,c=t.currentTimeline.duration,g=o.duration,D=t.createSubContext().currentTimeline;D.easing=o.easing,s.styles.forEach(P=>{D.forwardTime((P.offset||0)*g),D.setStyles(P.styles,P.easing,t.errors,t.options),D.applyStylesToKeyframe()}),t.currentTimeline.mergeTimelineCollectedStyles(D),t.transformIntoNewTimeline(c+g),t.previousNode=s}visitQuery(s,t){const o=t.currentTimeline.currentTime,c=s.options||{},g=c.delay?Ir(c.delay):0;g&&(6===t.previousNode.type||0==o&&t.currentTimeline.getCurrentStyleProperties().length)&&(t.currentTimeline.snapshotCurrentStyles(),t.previousNode=cr);let C=o;const D=t.invokeQuery(s.selector,s.originalSelector,s.limit,s.includeSelf,!!c.optional,t.errors);t.currentQueryTotal=D.length;let P=null;D.forEach((j,W)=>{t.currentQueryIndex=W;const re=t.createSubContext(s.options,j);g&&re.delayNextStep(g),j===t.element&&(P=re.currentTimeline),Nr(this,s.animation,re),re.currentTimeline.applyStylesToKeyframe(),C=Math.max(C,re.currentTimeline.currentTime)}),t.currentQueryIndex=0,t.currentQueryTotal=0,t.transformIntoNewTimeline(C),P&&(t.currentTimeline.mergeTimelineCollectedStyles(P),t.currentTimeline.snapshotCurrentStyles()),t.previousNode=s}visitStagger(s,t){const o=t.parentContext,c=t.currentTimeline,g=s.timings,C=Math.abs(g.duration),D=C*(t.currentQueryTotal-1);let P=C*t.currentQueryIndex;switch(g.duration<0?"reverse":g.easing){case"reverse":P=D-P;break;case"full":P=o.currentStaggerTime}const W=t.currentTimeline;P&&W.delayNextStep(P);const re=W.currentTime;Nr(this,s.animation,t),t.previousNode=s,o.currentStaggerTime=c.currentTime-re+(c.startTime-o.currentTimeline.startTime)}}const cr={};class yr{constructor(s,t,o,c,g,C,D,P){this._driver=s,this.element=t,this.subInstructions=o,this._enterClassName=c,this._leaveClassName=g,this.errors=C,this.timelines=D,this.parentContext=null,this.currentAnimateTimings=null,this.previousNode=cr,this.subContextCount=0,this.options={},this.currentQueryIndex=0,this.currentQueryTotal=0,this.currentStaggerTime=0,this.currentTimeline=P||new rr(this._driver,t,0),D.push(this.currentTimeline)}get params(){return this.options.params}updateOptions(s,t){if(!s)return;const o=s;let c=this.options;null!=o.duration&&(c.duration=Ir(o.duration)),null!=o.delay&&(c.delay=Ir(o.delay));const g=o.params;if(g){let C=c.params;C||(C=this.options.params={}),Object.keys(g).forEach(D=>{(!t||!C.hasOwnProperty(D))&&(C[D]=ir(g[D],C,this.errors))})}}_copyOptions(){const s={};if(this.options){const t=this.options.params;if(t){const o=s.params={};Object.keys(t).forEach(c=>{o[c]=t[c]})}}return s}createSubContext(s=null,t,o){const c=t||this.element,g=new yr(this._driver,c,this.subInstructions,this._enterClassName,this._leaveClassName,this.errors,this.timelines,this.currentTimeline.fork(c,o||0));return g.previousNode=this.previousNode,g.currentAnimateTimings=this.currentAnimateTimings,g.options=this._copyOptions(),g.updateOptions(s),g.currentQueryIndex=this.currentQueryIndex,g.currentQueryTotal=this.currentQueryTotal,g.parentContext=this,this.subContextCount++,g}transformIntoNewTimeline(s){return this.previousNode=cr,this.currentTimeline=this.currentTimeline.fork(this.element,s),this.timelines.push(this.currentTimeline),this.currentTimeline}appendInstructionToTimeline(s,t,o){const c={duration:null!=t?t:s.duration,delay:this.currentTimeline.currentTime+(null!=o?o:0)+s.delay,easing:""},g=new ri(this._driver,s.element,s.keyframes,s.preStyleProps,s.postStyleProps,c,s.stretchStartingKeyframe);return this.timelines.push(g),c}incrementTime(s){this.currentTimeline.forwardTime(this.currentTimeline.duration+s)}delayNextStep(s){s>0&&this.currentTimeline.delayNextStep(s)}invokeQuery(s,t,o,c,g,C){let D=[];if(c&&D.push(this.element),s.length>0){s=(s=s.replace(zo,"."+this._enterClassName)).replace(Si,"."+this._leaveClassName);let j=this._driver.query(this.element,s,1!=o);0!==o&&(j=o<0?j.slice(j.length+o,j.length):j.slice(0,o)),D.push(...j)}return!g&&0==D.length&&C.push(`\`query("${t}")\` returned zero elements. (Use \`query("${t}", { optional: true })\` if you wish to allow this.)`),D}}class rr{constructor(s,t,o,c){this._driver=s,this.element=t,this.startTime=o,this._elementTimelineStylesLookup=c,this.duration=0,this._previousKeyframe={},this._currentKeyframe={},this._keyframes=new Map,this._styleSummary={},this._pendingStyles={},this._backFill={},this._currentEmptyStepKeyframe=null,this._elementTimelineStylesLookup||(this._elementTimelineStylesLookup=new Map),this._localTimelineStyles=Object.create(this._backFill,{}),this._globalTimelineStyles=this._elementTimelineStylesLookup.get(t),this._globalTimelineStyles||(this._globalTimelineStyles=this._localTimelineStyles,this._elementTimelineStylesLookup.set(t,this._localTimelineStyles)),this._loadKeyframe()}containsAnimation(){switch(this._keyframes.size){case 0:return!1;case 1:return this.getCurrentStyleProperties().length>0;default:return!0}}getCurrentStyleProperties(){return Object.keys(this._currentKeyframe)}get currentTime(){return this.startTime+this.duration}delayNextStep(s){const t=1==this._keyframes.size&&Object.keys(this._pendingStyles).length;this.duration||t?(this.forwardTime(this.currentTime+s),t&&this.snapshotCurrentStyles()):this.startTime+=s}fork(s,t){return this.applyStylesToKeyframe(),new rr(this._driver,s,t||this.currentTime,this._elementTimelineStylesLookup)}_loadKeyframe(){this._currentKeyframe&&(this._previousKeyframe=this._currentKeyframe),this._currentKeyframe=this._keyframes.get(this.duration),this._currentKeyframe||(this._currentKeyframe=Object.create(this._backFill,{}),this._keyframes.set(this.duration,this._currentKeyframe))}forwardFrame(){this.duration+=1,this._loadKeyframe()}forwardTime(s){this.applyStylesToKeyframe(),this.duration=s,this._loadKeyframe()}_updateStyle(s,t){this._localTimelineStyles[s]=t,this._globalTimelineStyles[s]=t,this._styleSummary[s]={time:this.currentTime,value:t}}allowOnlyTimelineStyles(){return this._currentEmptyStepKeyframe!==this._currentKeyframe}applyEmptyStep(s){s&&(this._previousKeyframe.easing=s),Object.keys(this._globalTimelineStyles).forEach(t=>{this._backFill[t]=this._globalTimelineStyles[t]||T.l3,this._currentKeyframe[t]=T.l3}),this._currentEmptyStepKeyframe=this._currentKeyframe}setStyles(s,t,o,c){t&&(this._previousKeyframe.easing=t);const g=c&&c.params||{},C=function(n,s){const t={};let o;return n.forEach(c=>{"*"===c?(o=o||Object.keys(s),o.forEach(g=>{t[g]=T.l3})):Zr(c,!1,t)}),t}(s,this._globalTimelineStyles);Object.keys(C).forEach(D=>{const P=ir(C[D],g,o);this._pendingStyles[D]=P,this._localTimelineStyles.hasOwnProperty(D)||(this._backFill[D]=this._globalTimelineStyles.hasOwnProperty(D)?this._globalTimelineStyles[D]:T.l3),this._updateStyle(D,P)})}applyStylesToKeyframe(){const s=this._pendingStyles,t=Object.keys(s);0!=t.length&&(this._pendingStyles={},t.forEach(o=>{this._currentKeyframe[o]=s[o]}),Object.keys(this._localTimelineStyles).forEach(o=>{this._currentKeyframe.hasOwnProperty(o)||(this._currentKeyframe[o]=this._localTimelineStyles[o])}))}snapshotCurrentStyles(){Object.keys(this._localTimelineStyles).forEach(s=>{const t=this._localTimelineStyles[s];this._pendingStyles[s]=t,this._updateStyle(s,t)})}getFinalKeyframe(){return this._keyframes.get(this.duration)}get properties(){const s=[];for(let t in this._currentKeyframe)s.push(t);return s}mergeTimelineCollectedStyles(s){Object.keys(s._styleSummary).forEach(t=>{const o=this._styleSummary[t],c=s._styleSummary[t];(!o||c.time>o.time)&&this._updateStyle(t,c.value)})}buildKeyframes(){this.applyStylesToKeyframe();const s=new Set,t=new Set,o=1===this._keyframes.size&&0===this.duration;let c=[];this._keyframes.forEach((D,P)=>{const j=Zr(D,!0);Object.keys(j).forEach(W=>{const re=j[W];re==T.k1?s.add(W):re==T.l3&&t.add(W)}),o||(j.offset=P/this.duration),c.push(j)});const g=s.size?Lr(s.values()):[],C=t.size?Lr(t.values()):[];if(o){const D=c[0],P=In(D);D.offset=0,P.offset=1,c=[D,P]}return yo(this.element,c,g,C,this.duration,this.startTime,this.easing,!1)}}class ri extends rr{constructor(s,t,o,c,g,C,D=!1){super(s,t,C.delay),this.keyframes=o,this.preStyleProps=c,this.postStyleProps=g,this._stretchStartingKeyframe=D,this.timings={duration:C.duration,delay:C.delay,easing:C.easing}}containsAnimation(){return this.keyframes.length>1}buildKeyframes(){let s=this.keyframes,{delay:t,duration:o,easing:c}=this.timings;if(this._stretchStartingKeyframe&&t){const g=[],C=o+t,D=t/C,P=Zr(s[0],!1);P.offset=0,g.push(P);const j=Zr(s[0],!1);j.offset=ho(D),g.push(j);const W=s.length-1;for(let re=1;re<=W;re++){let ie=Zr(s[re],!1);ie.offset=ho((t+ie.offset*o)/C),g.push(ie)}o=C,t=0,c="",s=g}return yo(this.element,s,this.preStyleProps,this.postStyleProps,o,t,c,!0)}}function ho(n,s=3){const t=Math.pow(10,s-1);return Math.round(n*t)/t}class xo{}class ar extends xo{normalizePropertyName(s,t){return zr(s)}normalizeStyleValue(s,t,o,c){let g="";const C=o.toString().trim();if(Ht[t]&&0!==o&&"0"!==o)if("number"==typeof o)g="px";else{const D=o.match(/^[+-]?[\d\.]+([a-z]*)$/);D&&0==D[1].length&&c.push(`Please provide a CSS unit value for ${s}:${o}`)}return C+g}}const Ht=(()=>function(n){const s={};return n.forEach(t=>s[t]=!0),s}("width,height,minWidth,minHeight,maxWidth,maxHeight,left,top,bottom,right,fontSize,outlineWidth,outlineOffset,paddingTop,paddingLeft,paddingBottom,paddingRight,marginTop,marginLeft,marginBottom,marginRight,borderRadius,borderWidth,borderTopWidth,borderLeftWidth,borderRightWidth,borderBottomWidth,textIndent,perspective".split(",")))();function Ct(n,s,t,o,c,g,C,D,P,j,W,re,ie){return{type:0,element:n,triggerName:s,isRemovalTransition:c,fromState:t,fromStyles:g,toState:o,toStyles:C,timelines:D,queriedElements:P,preStyleProps:j,postStyleProps:W,totalTime:re,errors:ie}}const pr={};class nn{constructor(s,t,o){this._triggerName=s,this.ast=t,this._stateStyles=o}match(s,t,o,c){return function(n,s,t,o,c){return n.some(g=>g(s,t,o,c))}(this.ast.matchers,s,t,o,c)}buildStyles(s,t,o){const c=this._stateStyles["*"],g=this._stateStyles[s],C=c?c.buildStyles(t,o):{};return g?g.buildStyles(t,o):C}build(s,t,o,c,g,C,D,P,j,W){const re=[],ie=this.ast.options&&this.ast.options.params||pr,_e=this.buildStyles(o,D&&D.params||pr,re),Le=P&&P.params||pr,Re=this.buildStyles(c,Le,re),ke=new Set,xe=new Map,U=new Map,pt="void"===c,ht={params:Object.assign(Object.assign({},ie),Le)},wt=W?[]:ai(s,t,this.ast.animation,g,C,_e,Re,ht,j,re);let It=0;if(wt.forEach(Lt=>{It=Math.max(Lt.duration+Lt.delay,It)}),re.length)return Ct(t,this._triggerName,o,c,pt,_e,Re,[],[],xe,U,It,re);wt.forEach(Lt=>{const Dn=Lt.element,Mn=ue(xe,Dn,{});Lt.preStyleProps.forEach(ur=>Mn[ur]=!0);const $r=ue(U,Dn,{});Lt.postStyleProps.forEach(ur=>$r[ur]=!0),Dn!==t&&ke.add(Dn)});const dn=Lr(ke.values());return Ct(t,this._triggerName,o,c,pt,_e,Re,wt,dn,xe,U,It)}}class br{constructor(s,t,o){this.styles=s,this.defaultParams=t,this.normalizer=o}buildStyles(s,t){const o={},c=In(this.defaultParams);return Object.keys(s).forEach(g=>{const C=s[g];null!=C&&(c[g]=C)}),this.styles.styles.forEach(g=>{if("string"!=typeof g){const C=g;Object.keys(C).forEach(D=>{let P=C[D];P.length>1&&(P=ir(P,c,t));const j=this.normalizer.normalizePropertyName(D,t);P=this.normalizer.normalizeStyleValue(D,j,P,t),o[j]=P})}}),o}}class Wo{constructor(s,t,o){this.name=s,this.ast=t,this._normalizer=o,this.transitionFactories=[],this.states={},t.states.forEach(c=>{this.states[c.name]=new br(c.style,c.options&&c.options.params||{},o)}),Js(this.states,"true","1"),Js(this.states,"false","0"),t.transitions.forEach(c=>{this.transitionFactories.push(new nn(s,c,this.states))}),this.fallbackTransition=function(n,s,t){return new nn(n,{type:1,animation:{type:2,steps:[],options:null},matchers:[(C,D)=>!0],options:null,queryCount:0,depCount:0},s)}(s,this.states)}get containsQueries(){return this.ast.queryCount>0}matchTransition(s,t,o,c){return this.transitionFactories.find(C=>C.match(s,t,o,c))||null}matchStyles(s,t,o){return this.fallbackTransition.buildStyles(s,t,o)}}function Js(n,s,t){n.hasOwnProperty(s)?n.hasOwnProperty(t)||(n[t]=n[s]):n.hasOwnProperty(t)&&(n[s]=n[t])}const _s=new Mo;class bs{constructor(s,t,o){this.bodyNode=s,this._driver=t,this._normalizer=o,this._animations={},this._playersById={},this.players=[]}register(s,t){const o=[],c=Ze(this._driver,t,o);if(o.length)throw new Error(`Unable to build the animation due to the following errors: ${o.join("\n")}`);this._animations[s]=c}_buildPlayer(s,t,o){const c=s.element,g=Z(0,this._normalizer,0,s.keyframes,t,o);return this._driver.animate(c,g,s.duration,s.delay,s.easing,[],!0)}create(s,t,o={}){const c=[],g=this._animations[s];let C;const D=new Map;if(g?(C=ai(this._driver,t,g,Bt,mt,{},{},o,_s,c),C.forEach(W=>{const re=ue(D,W.element,{});W.postStyleProps.forEach(ie=>re[ie]=null)})):(c.push("The requested animation doesn't exist or has already been destroyed"),C=[]),c.length)throw new Error(`Unable to create the animation due to the following errors: ${c.join("\n")}`);D.forEach((W,re)=>{Object.keys(W).forEach(ie=>{W[ie]=this._driver.computeStyle(re,ie,T.l3)})});const j=F(C.map(W=>{const re=D.get(W.element);return this._buildPlayer(W,{},re)}));return this._playersById[s]=j,j.onDestroy(()=>this.destroy(s)),this.players.push(j),j}destroy(s){const t=this._getPlayer(s);t.destroy(),delete this._playersById[s];const o=this.players.indexOf(t);o>=0&&this.players.splice(o,1)}_getPlayer(s){const t=this._playersById[s];if(!t)throw new Error(`Unable to find the timeline player referenced by ${s}`);return t}listen(s,t,o,c){const g=ee(t,"","","");return J(this._getPlayer(s),o,g,c),()=>{}}command(s,t,o,c){if("register"==o)return void this.register(s,c[0]);if("create"==o)return void this.create(s,t,c[0]||{});const g=this._getPlayer(s);switch(o){case"play":g.play();break;case"pause":g.pause();break;case"reset":g.reset();break;case"restart":g.restart();break;case"finish":g.finish();break;case"init":g.init();break;case"setPosition":g.setPosition(parseFloat(c[0]));break;case"destroy":this.destroy(s)}}}const qo="ng-animate-queued",Ia="ng-animate-disabled",pa=".ng-animate-disabled",yl=[],fo={namespaceId:"",setForRemoval:!1,setForMove:!1,hasAnimation:!1,removedBeforeQueried:!1},Da={namespaceId:"",setForMove:!1,setForRemoval:!1,hasAnimation:!1,removedBeforeQueried:!0},Ao="__ng_removed";class ls{constructor(s,t=""){this.namespaceId=t;const o=s&&s.hasOwnProperty("value");if(this.value=null!=(n=o?s.value:s)?n:null,o){const g=In(s);delete g.value,this.options=g}else this.options={};var n;this.options.params||(this.options.params={})}get params(){return this.options.params}absorbOptions(s){const t=s.params;if(t){const o=this.options.params;Object.keys(t).forEach(c=>{null==o[c]&&(o[c]=t[c])})}}}const gs="void",Ra=new ls(gs);class pl{constructor(s,t,o){this.id=s,this.hostElement=t,this._engine=o,this.players=[],this._triggers={},this._queue=[],this._elementListeners=new Map,this._hostClassName="ng-tns-"+s,$e(t,this._hostClassName)}listen(s,t,o,c){if(!this._triggers.hasOwnProperty(t))throw new Error(`Unable to listen on the animation trigger event "${o}" because the animation trigger "${t}" doesn't exist!`);if(null==o||0==o.length)throw new Error(`Unable to listen on the animation trigger "${t}" because the provided event is undefined!`);if("start"!=(n=o)&&"done"!=n)throw new Error(`The provided animation trigger event "${o}" for the animation trigger "${t}" is not supported!`);var n;const g=ue(this._elementListeners,s,[]),C={name:t,phase:o,callback:c};g.push(C);const D=ue(this._engine.statesByElement,s,{});return D.hasOwnProperty(t)||($e(s,zt),$e(s,zt+"-"+t),D[t]=Ra),()=>{this._engine.afterFlush(()=>{const P=g.indexOf(C);P>=0&&g.splice(P,1),this._triggers[t]||delete D[t]})}}register(s,t){return!this._triggers[s]&&(this._triggers[s]=t,!0)}_getTrigger(s){const t=this._triggers[s];if(!t)throw new Error(`The provided animation trigger "${s}" has not been registered!`);return t}trigger(s,t,o,c=!0){const g=this._getTrigger(t),C=new Fo(this.id,t,s);let D=this._engine.statesByElement.get(s);D||($e(s,zt),$e(s,zt+"-"+t),this._engine.statesByElement.set(s,D={}));let P=D[t];const j=new ls(o,this.id);if(!(o&&o.hasOwnProperty("value"))&&P&&j.absorbOptions(P.options),D[t]=j,P||(P=Ra),j.value!==gs&&P.value===j.value){if(!function(n,s){const t=Object.keys(n),o=Object.keys(s);if(t.length!=o.length)return!1;for(let c=0;c<t.length;c++){const g=t[c];if(!s.hasOwnProperty(g)||n[g]!==s[g])return!1}return!0}(P.params,j.params)){const Le=[],Re=g.matchStyles(P.value,P.params,Le),ke=g.matchStyles(j.value,j.params,Le);Le.length?this._engine.reportError(Le):this._engine.afterFlush(()=>{Hi(s,Re),$i(s,ke)})}return}const ie=ue(this._engine.playersByElement,s,[]);ie.forEach(Le=>{Le.namespaceId==this.id&&Le.triggerName==t&&Le.queued&&Le.destroy()});let ge=g.matchTransition(P.value,j.value,s,j.params),_e=!1;if(!ge){if(!c)return;ge=g.fallbackTransition,_e=!0}return this._engine.totalQueuedPlayers++,this._queue.push({element:s,triggerName:t,transition:ge,fromState:P,toState:j,player:C,isFallbackTransition:_e}),_e||($e(s,qo),C.onStart(()=>{Pt(s,qo)})),C.onDone(()=>{let Le=this.players.indexOf(C);Le>=0&&this.players.splice(Le,1);const Re=this._engine.playersByElement.get(s);if(Re){let ke=Re.indexOf(C);ke>=0&&Re.splice(ke,1)}}),this.players.push(C),ie.push(C),C}deregister(s){delete this._triggers[s],this._engine.statesByElement.forEach((t,o)=>{delete t[s]}),this._elementListeners.forEach((t,o)=>{this._elementListeners.set(o,t.filter(c=>c.name!=s))})}clearElementCache(s){this._engine.statesByElement.delete(s),this._elementListeners.delete(s);const t=this._engine.playersByElement.get(s);t&&(t.forEach(o=>o.destroy()),this._engine.playersByElement.delete(s))}_signalRemovalForInnerTriggers(s,t){const o=this._engine.driver.query(s,Yn,!0);o.forEach(c=>{if(c[Ao])return;const g=this._engine.fetchNamespacesByElement(c);g.size?g.forEach(C=>C.triggerLeaveAnimation(c,t,!1,!0)):this.clearElementCache(c)}),this._engine.afterFlushAnimationsDone(()=>o.forEach(c=>this.clearElementCache(c)))}triggerLeaveAnimation(s,t,o,c){const g=this._engine.statesByElement.get(s);if(g){const C=[];if(Object.keys(g).forEach(D=>{if(this._triggers[D]){const P=this.trigger(s,D,gs,c);P&&C.push(P)}}),C.length)return this._engine.markElementAsRemoved(this.id,s,!0,t),o&&F(C).onDone(()=>this._engine.processLeaveNode(s)),!0}return!1}prepareLeaveAnimationListeners(s){const t=this._elementListeners.get(s),o=this._engine.statesByElement.get(s);if(t&&o){const c=new Set;t.forEach(g=>{const C=g.name;if(c.has(C))return;c.add(C);const P=this._triggers[C].fallbackTransition,j=o[C]||Ra,W=new ls(gs),re=new Fo(this.id,C,s);this._engine.totalQueuedPlayers++,this._queue.push({element:s,triggerName:C,transition:P,fromState:j,toState:W,player:re,isFallbackTransition:!0})})}}removeNode(s,t){const o=this._engine;if(s.childElementCount&&this._signalRemovalForInnerTriggers(s,t),this.triggerLeaveAnimation(s,t,!0))return;let c=!1;if(o.totalAnimations){const g=o.players.length?o.playersByQueriedElement.get(s):[];if(g&&g.length)c=!0;else{let C=s;for(;C=C.parentNode;)if(o.statesByElement.get(C)){c=!0;break}}}if(this.prepareLeaveAnimationListeners(s),c)o.markElementAsRemoved(this.id,s,!1,t);else{const g=s[Ao];(!g||g===fo)&&(o.afterFlush(()=>this.clearElementCache(s)),o.destroyInnerAnimations(s),o._onRemovalComplete(s,t))}}insertNode(s,t){$e(s,this._hostClassName)}drainQueuedTransitions(s){const t=[];return this._queue.forEach(o=>{const c=o.player;if(c.destroyed)return;const g=o.element,C=this._elementListeners.get(g);C&&C.forEach(D=>{if(D.name==o.triggerName){const P=ee(g,o.triggerName,o.fromState.value,o.toState.value);P._data=s,J(o.player,D.phase,P,D.callback)}}),c.markedForDestroy?this._engine.afterFlush(()=>{c.destroy()}):t.push(o)}),this._queue=[],t.sort((o,c)=>{const g=o.transition.ast.depCount,C=c.transition.ast.depCount;return 0==g||0==C?g-C:this._engine.driver.containsElement(o.element,c.element)?1:-1})}destroy(s){this.players.forEach(t=>t.destroy()),this._signalRemovalForInnerTriggers(this.hostElement,s)}elementContainsData(s){let t=!1;return this._elementListeners.has(s)&&(t=!0),t=!!this._queue.find(o=>o.element===s)||t,t}}class Qs{constructor(s,t,o){this.bodyNode=s,this.driver=t,this._normalizer=o,this.players=[],this.newHostElements=new Map,this.playersByElement=new Map,this.playersByQueriedElement=new Map,this.statesByElement=new Map,this.disabledNodes=new Set,this.totalAnimations=0,this.totalQueuedPlayers=0,this._namespaceLookup={},this._namespaceList=[],this._flushFns=[],this._whenQuietFns=[],this.namespacesByHostElement=new Map,this.collectedEnterElements=[],this.collectedLeaveElements=[],this.onRemovalComplete=(c,g)=>{}}_onRemovalComplete(s,t){this.onRemovalComplete(s,t)}get queuedPlayers(){const s=[];return this._namespaceList.forEach(t=>{t.players.forEach(o=>{o.queued&&s.push(o)})}),s}createNamespace(s,t){const o=new pl(s,t,this);return this.bodyNode&&this.driver.containsElement(this.bodyNode,t)?this._balanceNamespaceList(o,t):(this.newHostElements.set(t,o),this.collectEnterElement(t)),this._namespaceLookup[s]=o}_balanceNamespaceList(s,t){const o=this._namespaceList.length-1;if(o>=0){let c=!1;for(let g=o;g>=0;g--)if(this.driver.containsElement(this._namespaceList[g].hostElement,t)){this._namespaceList.splice(g+1,0,s),c=!0;break}c||this._namespaceList.splice(0,0,s)}else this._namespaceList.push(s);return this.namespacesByHostElement.set(t,s),s}register(s,t){let o=this._namespaceLookup[s];return o||(o=this.createNamespace(s,t)),o}registerTrigger(s,t,o){let c=this._namespaceLookup[s];c&&c.register(t,o)&&this.totalAnimations++}destroy(s,t){if(!s)return;const o=this._fetchNamespace(s);this.afterFlush(()=>{this.namespacesByHostElement.delete(o.hostElement),delete this._namespaceLookup[s];const c=this._namespaceList.indexOf(o);c>=0&&this._namespaceList.splice(c,1)}),this.afterFlushAnimationsDone(()=>o.destroy(t))}_fetchNamespace(s){return this._namespaceLookup[s]}fetchNamespacesByElement(s){const t=new Set,o=this.statesByElement.get(s);if(o){const c=Object.keys(o);for(let g=0;g<c.length;g++){const C=o[c[g]].namespaceId;if(C){const D=this._fetchNamespace(C);D&&t.add(D)}}}return t}trigger(s,t,o,c){if(ms(t)){const g=this._fetchNamespace(s);if(g)return g.trigger(t,o,c),!0}return!1}insertNode(s,t,o,c){if(!ms(t))return;const g=t[Ao];if(g&&g.setForRemoval){g.setForRemoval=!1,g.setForMove=!0;const C=this.collectedLeaveElements.indexOf(t);C>=0&&this.collectedLeaveElements.splice(C,1)}if(s){const C=this._fetchNamespace(s);C&&C.insertNode(t,o)}c&&this.collectEnterElement(t)}collectEnterElement(s){this.collectedEnterElements.push(s)}markElementAsDisabled(s,t){t?this.disabledNodes.has(s)||(this.disabledNodes.add(s),$e(s,Ia)):this.disabledNodes.has(s)&&(this.disabledNodes.delete(s),Pt(s,Ia))}removeNode(s,t,o,c){if(ms(t)){const g=s?this._fetchNamespace(s):null;if(g?g.removeNode(t,c):this.markElementAsRemoved(s,t,!1,c),o){const C=this.namespacesByHostElement.get(t);C&&C.id!==s&&C.removeNode(t,c)}}else this._onRemovalComplete(t,c)}markElementAsRemoved(s,t,o,c){this.collectedLeaveElements.push(t),t[Ao]={namespaceId:s,setForRemoval:c,hasAnimation:o,removedBeforeQueried:!1}}listen(s,t,o,c,g){return ms(t)?this._fetchNamespace(s).listen(t,o,c,g):()=>{}}_buildInstruction(s,t,o,c,g){return s.transition.build(this.driver,s.element,s.fromState.value,s.toState.value,o,c,s.fromState.options,s.toState.options,t,g)}destroyInnerAnimations(s){let t=this.driver.query(s,Yn,!0);t.forEach(o=>this.destroyActiveAnimationsForElement(o)),0!=this.playersByQueriedElement.size&&(t=this.driver.query(s,ci,!0),t.forEach(o=>this.finishActiveQueriedAnimationOnElement(o)))}destroyActiveAnimationsForElement(s){const t=this.playersByElement.get(s);t&&t.forEach(o=>{o.queued?o.markedForDestroy=!0:o.destroy()})}finishActiveQueriedAnimationOnElement(s){const t=this.playersByQueriedElement.get(s);t&&t.forEach(o=>o.finish())}whenRenderingDone(){return new Promise(s=>{if(this.players.length)return F(this.players).onDone(()=>s());s()})}processLeaveNode(s){const t=s[Ao];if(t&&t.setForRemoval){if(s[Ao]=fo,t.namespaceId){this.destroyInnerAnimations(s);const o=this._fetchNamespace(t.namespaceId);o&&o.clearElementCache(s)}this._onRemovalComplete(s,t.setForRemoval)}this.driver.matchesElement(s,pa)&&this.markElementAsDisabled(s,!1),this.driver.query(s,pa,!0).forEach(o=>{this.markElementAsDisabled(o,!1)})}flush(s=-1){let t=[];if(this.newHostElements.size&&(this.newHostElements.forEach((o,c)=>this._balanceNamespaceList(o,c)),this.newHostElements.clear()),this.totalAnimations&&this.collectedEnterElements.length)for(let o=0;o<this.collectedEnterElements.length;o++)$e(this.collectedEnterElements[o],"ng-star-inserted");if(this._namespaceList.length&&(this.totalQueuedPlayers||this.collectedLeaveElements.length)){const o=[];try{t=this._flushAnimations(o,s)}finally{for(let c=0;c<o.length;c++)o[c]()}}else for(let o=0;o<this.collectedLeaveElements.length;o++)this.processLeaveNode(this.collectedLeaveElements[o]);if(this.totalQueuedPlayers=0,this.collectedEnterElements.length=0,this.collectedLeaveElements.length=0,this._flushFns.forEach(o=>o()),this._flushFns=[],this._whenQuietFns.length){const o=this._whenQuietFns;this._whenQuietFns=[],t.length?F(t).onDone(()=>{o.forEach(c=>c())}):o.forEach(c=>c())}}reportError(s){throw new Error(`Unable to process animations due to the following failed trigger transitions\n ${s.join("\n")}`)}_flushAnimations(s,t){const o=new Mo,c=[],g=new Map,C=[],D=new Map,P=new Map,j=new Map,W=new Set;this.disabledNodes.forEach(fn=>{W.add(fn);const Nn=this.driver.query(fn,".ng-animate-queued",!0);for(let $n=0;$n<Nn.length;$n++)W.add(Nn[$n])});const re=this.bodyNode,ie=Array.from(this.statesByElement.keys()),ge=tt(ie,this.collectedEnterElements),_e=new Map;let Le=0;ge.forEach((fn,Nn)=>{const $n=Bt+Le++;_e.set(Nn,$n),fn.forEach(Qn=>$e(Qn,$n))});const Re=[],ke=new Set,xe=new Set;for(let fn=0;fn<this.collectedLeaveElements.length;fn++){const Nn=this.collectedLeaveElements[fn],$n=Nn[Ao];$n&&$n.setForRemoval&&(Re.push(Nn),ke.add(Nn),$n.hasAnimation?this.driver.query(Nn,".ng-star-inserted",!0).forEach(Qn=>ke.add(Qn)):xe.add(Nn))}const U=new Map,pt=tt(ie,Array.from(ke));pt.forEach((fn,Nn)=>{const $n=mt+Le++;U.set(Nn,$n),fn.forEach(Qn=>$e(Qn,$n))}),s.push(()=>{ge.forEach((fn,Nn)=>{const $n=_e.get(Nn);fn.forEach(Qn=>Pt(Qn,$n))}),pt.forEach((fn,Nn)=>{const $n=U.get(Nn);fn.forEach(Qn=>Pt(Qn,$n))}),Re.forEach(fn=>{this.processLeaveNode(fn)})});const ht=[],wt=[];for(let fn=this._namespaceList.length-1;fn>=0;fn--)this._namespaceList[fn].drainQueuedTransitions(t).forEach($n=>{const Qn=$n.player,Tn=$n.element;if(ht.push(Qn),this.collectedEnterElements.length){const An=Tn[Ao];if(An&&An.setForMove)return void Qn.destroy()}const Yr=!re||!this.driver.containsElement(re,Tn),ji=U.get(Tn),ii=_e.get(Tn),Ui=this._buildInstruction($n,o,ii,ji,Yr);if(Ui.errors&&Ui.errors.length)wt.push(Ui);else{if(Yr)return Qn.onStart(()=>Hi(Tn,Ui.fromStyles)),Qn.onDestroy(()=>$i(Tn,Ui.toStyles)),void c.push(Qn);if($n.isFallbackTransition)return Qn.onStart(()=>Hi(Tn,Ui.fromStyles)),Qn.onDestroy(()=>$i(Tn,Ui.toStyles)),void c.push(Qn);Ui.timelines.forEach(An=>An.stretchStartingKeyframe=!0),o.append(Tn,Ui.timelines),C.push({instruction:Ui,player:Qn,element:Tn}),Ui.queriedElements.forEach(An=>ue(D,An,[]).push(Qn)),Ui.preStyleProps.forEach((An,hn)=>{const qr=Object.keys(An);if(qr.length){let Ri=P.get(hn);Ri||P.set(hn,Ri=new Set),qr.forEach(qi=>Ri.add(qi))}}),Ui.postStyleProps.forEach((An,hn)=>{const qr=Object.keys(An);let Ri=j.get(hn);Ri||j.set(hn,Ri=new Set),qr.forEach(qi=>Ri.add(qi))})}});if(wt.length){const fn=[];wt.forEach(Nn=>{fn.push(`@${Nn.triggerName} has failed due to:\n`),Nn.errors.forEach($n=>fn.push(`- ${$n}\n`))}),ht.forEach(Nn=>Nn.destroy()),this.reportError(fn)}const It=new Map,dn=new Map;C.forEach(fn=>{const Nn=fn.element;o.has(Nn)&&(dn.set(Nn,Nn),this._beforeAnimationBuild(fn.player.namespaceId,fn.instruction,It))}),c.forEach(fn=>{const Nn=fn.element;this._getPreviousPlayers(Nn,!1,fn.namespaceId,fn.triggerName,null).forEach(Qn=>{ue(It,Nn,[]).push(Qn),Qn.destroy()})});const Lt=Re.filter(fn=>os(fn,P,j)),Dn=new Map;ro(Dn,this.driver,xe,j,T.l3).forEach(fn=>{os(fn,P,j)&&Lt.push(fn)});const $r=new Map;ge.forEach((fn,Nn)=>{ro($r,this.driver,new Set(fn),P,T.k1)}),Lt.forEach(fn=>{const Nn=Dn.get(fn),$n=$r.get(fn);Dn.set(fn,Object.assign(Object.assign({},Nn),$n))});const ur=[],Pr=[],xr={};C.forEach(fn=>{const{element:Nn,player:$n,instruction:Qn}=fn;if(o.has(Nn)){if(W.has(Nn))return $n.onDestroy(()=>$i(Nn,Qn.toStyles)),$n.disabled=!0,$n.overrideTotalTime(Qn.totalTime),void c.push($n);let Tn=xr;if(dn.size>1){let ji=Nn;const ii=[];for(;ji=ji.parentNode;){const Ui=dn.get(ji);if(Ui){Tn=Ui;break}ii.push(ji)}ii.forEach(Ui=>dn.set(Ui,Tn))}const Yr=this._buildAnimation($n.namespaceId,Qn,It,g,$r,Dn);if($n.setRealPlayer(Yr),Tn===xr)ur.push($n);else{const ji=this.playersByElement.get(Tn);ji&&ji.length&&($n.parentPlayer=F(ji)),c.push($n)}}else Hi(Nn,Qn.fromStyles),$n.onDestroy(()=>$i(Nn,Qn.toStyles)),Pr.push($n),W.has(Nn)&&c.push($n)}),Pr.forEach(fn=>{const Nn=g.get(fn.element);if(Nn&&Nn.length){const $n=F(Nn);fn.setRealPlayer($n)}}),c.forEach(fn=>{fn.parentPlayer?fn.syncPlayerEvents(fn.parentPlayer):fn.destroy()});for(let fn=0;fn<Re.length;fn++){const Nn=Re[fn],$n=Nn[Ao];if(Pt(Nn,mt),$n&&$n.hasAnimation)continue;let Qn=[];if(D.size){let Yr=D.get(Nn);Yr&&Yr.length&&Qn.push(...Yr);let ji=this.driver.query(Nn,ci,!0);for(let ii=0;ii<ji.length;ii++){let Ui=D.get(ji[ii]);Ui&&Ui.length&&Qn.push(...Ui)}}const Tn=Qn.filter(Yr=>!Yr.destroyed);Tn.length?sn(this,Nn,Tn):this.processLeaveNode(Nn)}return Re.length=0,ur.forEach(fn=>{this.players.push(fn),fn.onDone(()=>{fn.destroy();const Nn=this.players.indexOf(fn);this.players.splice(Nn,1)}),fn.play()}),ur}elementContainsData(s,t){let o=!1;const c=t[Ao];return c&&c.setForRemoval&&(o=!0),this.playersByElement.has(t)&&(o=!0),this.playersByQueriedElement.has(t)&&(o=!0),this.statesByElement.has(t)&&(o=!0),this._fetchNamespace(s).elementContainsData(t)||o}afterFlush(s){this._flushFns.push(s)}afterFlushAnimationsDone(s){this._whenQuietFns.push(s)}_getPreviousPlayers(s,t,o,c,g){let C=[];if(t){const D=this.playersByQueriedElement.get(s);D&&(C=D)}else{const D=this.playersByElement.get(s);if(D){const P=!g||g==gs;D.forEach(j=>{j.queued||!P&&j.triggerName!=c||C.push(j)})}}return(o||c)&&(C=C.filter(D=>!(o&&o!=D.namespaceId||c&&c!=D.triggerName))),C}_beforeAnimationBuild(s,t,o){const g=t.element,C=t.isRemovalTransition?void 0:s,D=t.isRemovalTransition?void 0:t.triggerName;for(const P of t.timelines){const j=P.element,W=j!==g,re=ue(o,j,[]);this._getPreviousPlayers(j,W,C,D,t.toState).forEach(ge=>{const _e=ge.getRealPlayer();_e.beforeDestroy&&_e.beforeDestroy(),ge.destroy(),re.push(ge)})}Hi(g,t.fromStyles)}_buildAnimation(s,t,o,c,g,C){const D=t.triggerName,P=t.element,j=[],W=new Set,re=new Set,ie=t.timelines.map(_e=>{const Le=_e.element;W.add(Le);const Re=Le[Ao];if(Re&&Re.removedBeforeQueried)return new T.ZN(_e.duration,_e.delay);const ke=Le!==P,xe=function(n){const s=[];return fi(n,s),s}((o.get(Le)||yl).map(It=>It.getRealPlayer())).filter(It=>!!It.element&&It.element===Le),U=g.get(Le),pt=C.get(Le),ht=Z(0,this._normalizer,0,_e.keyframes,U,pt),wt=this._buildPlayer(_e,ht,xe);if(_e.subTimeline&&c&&re.add(Le),ke){const It=new Fo(s,D,Le);It.setRealPlayer(wt),j.push(It)}return wt});j.forEach(_e=>{ue(this.playersByQueriedElement,_e.element,[]).push(_e),_e.onDone(()=>function(n,s,t){let o;if(n instanceof Map){if(o=n.get(s),o){if(o.length){const c=o.indexOf(t);o.splice(c,1)}0==o.length&&n.delete(s)}}else if(o=n[s],o){if(o.length){const c=o.indexOf(t);o.splice(c,1)}0==o.length&&delete n[s]}return o}(this.playersByQueriedElement,_e.element,_e))}),W.forEach(_e=>$e(_e,Hr));const ge=F(ie);return ge.onDestroy(()=>{W.forEach(_e=>Pt(_e,Hr)),$i(P,t.toStyles)}),re.forEach(_e=>{ue(c,_e,[]).push(ge)}),ge}_buildPlayer(s,t,o){return t.length>0?this.driver.animate(s.element,t,s.duration,s.delay,s.easing,o):new T.ZN(s.duration,s.delay)}}class Fo{constructor(s,t,o){this.namespaceId=s,this.triggerName=t,this.element=o,this._player=new T.ZN,this._containsRealPlayer=!1,this._queuedCallbacks={},this.destroyed=!1,this.markedForDestroy=!1,this.disabled=!1,this.queued=!0,this.totalTime=0}setRealPlayer(s){this._containsRealPlayer||(this._player=s,Object.keys(this._queuedCallbacks).forEach(t=>{this._queuedCallbacks[t].forEach(o=>J(s,t,void 0,o))}),this._queuedCallbacks={},this._containsRealPlayer=!0,this.overrideTotalTime(s.totalTime),this.queued=!1)}getRealPlayer(){return this._player}overrideTotalTime(s){this.totalTime=s}syncPlayerEvents(s){const t=this._player;t.triggerCallback&&s.onStart(()=>t.triggerCallback("start")),s.onDone(()=>this.finish()),s.onDestroy(()=>this.destroy())}_queueEvent(s,t){ue(this._queuedCallbacks,s,[]).push(t)}onDone(s){this.queued&&this._queueEvent("done",s),this._player.onDone(s)}onStart(s){this.queued&&this._queueEvent("start",s),this._player.onStart(s)}onDestroy(s){this.queued&&this._queueEvent("destroy",s),this._player.onDestroy(s)}init(){this._player.init()}hasStarted(){return!this.queued&&this._player.hasStarted()}play(){!this.queued&&this._player.play()}pause(){!this.queued&&this._player.pause()}restart(){!this.queued&&this._player.restart()}finish(){this._player.finish()}destroy(){this.destroyed=!0,this._player.destroy()}reset(){!this.queued&&this._player.reset()}setPosition(s){this.queued||this._player.setPosition(s)}getPosition(){return this.queued?0:this._player.getPosition()}triggerCallback(s){const t=this._player;t.triggerCallback&&t.triggerCallback(s)}}function ms(n){return n&&1===n.nodeType}function kr(n,s){const t=n.style.display;return n.style.display=null!=s?s:"none",t}function ro(n,s,t,o,c){const g=[];t.forEach(P=>g.push(kr(P)));const C=[];o.forEach((P,j)=>{const W={};P.forEach(re=>{const ie=W[re]=s.computeStyle(j,re,c);(!ie||0==ie.length)&&(j[Ao]=Da,C.push(j))}),n.set(j,W)});let D=0;return t.forEach(P=>kr(P,g[D++])),C}function tt(n,s){const t=new Map;if(n.forEach(D=>t.set(D,[])),0==s.length)return t;const c=new Set(s),g=new Map;function C(D){if(!D)return 1;let P=g.get(D);if(P)return P;const j=D.parentNode;return P=t.has(j)?j:c.has(j)?1:C(j),g.set(D,P),P}return s.forEach(D=>{const P=C(D);1!==P&&t.get(P).push(D)}),t}const on="$$classes";function $e(n,s){if(n.classList)n.classList.add(s);else{let t=n[on];t||(t=n[on]={}),t[s]=!0}}function Pt(n,s){if(n.classList)n.classList.remove(s);else{let t=n[on];t&&delete t[s]}}function sn(n,s,t){F(t).onDone(()=>n.processLeaveNode(s))}function fi(n,s){for(let t=0;t<n.length;t++){const o=n[t];o instanceof T.ZE?fi(o.players,s):s.push(o)}}function os(n,s,t){const o=t.get(n);if(!o)return!1;let c=s.get(n);return c?o.forEach(g=>c.add(g)):s.set(n,o),t.delete(n),!0}class Ro{constructor(s,t,o){this.bodyNode=s,this._driver=t,this._normalizer=o,this._triggerCache={},this.onRemovalComplete=(c,g)=>{},this._transitionEngine=new Qs(s,t,o),this._timelineEngine=new bs(s,t,o),this._transitionEngine.onRemovalComplete=(c,g)=>this.onRemovalComplete(c,g)}registerTrigger(s,t,o,c,g){const C=s+"-"+c;let D=this._triggerCache[C];if(!D){const P=[],j=Ze(this._driver,g,P);if(P.length)throw new Error(`The animation trigger "${c}" has failed to build due to the following errors:\n - ${P.join("\n - ")}`);D=function(n,s,t){return new Wo(n,s,t)}(c,j,this._normalizer),this._triggerCache[C]=D}this._transitionEngine.registerTrigger(t,c,D)}register(s,t){this._transitionEngine.register(s,t)}destroy(s,t){this._transitionEngine.destroy(s,t)}onInsert(s,t,o,c){this._transitionEngine.insertNode(s,t,o,c)}onRemove(s,t,o,c){this._transitionEngine.removeNode(s,t,c||!1,o)}disableAnimations(s,t){this._transitionEngine.markElementAsDisabled(s,t)}process(s,t,o,c){if("@"==o.charAt(0)){const[g,C]=ae(o);this._timelineEngine.command(g,t,C,c)}else this._transitionEngine.trigger(s,t,o,c)}listen(s,t,o,c,g){if("@"==o.charAt(0)){const[C,D]=ae(o);return this._timelineEngine.listen(C,t,D,g)}return this._transitionEngine.listen(s,t,o,c,g)}flush(s=-1){this._transitionEngine.flush(s)}get players(){return this._transitionEngine.players.concat(this._timelineEngine.players)}whenRenderingDone(){return this._transitionEngine.whenRenderingDone()}}function Uo(n,s){let t=null,o=null;return Array.isArray(s)&&s.length?(t=Ea(s[0]),s.length>1&&(o=Ea(s[s.length-1]))):s&&(t=Ea(s)),t||o?new To(n,t,o):null}let To=(()=>{class n{constructor(t,o,c){this._element=t,this._startStyles=o,this._endStyles=c,this._state=0;let g=n.initialStylesByElement.get(t);g||n.initialStylesByElement.set(t,g={}),this._initialStyles=g}start(){this._state<1&&(this._startStyles&&$i(this._element,this._startStyles,this._initialStyles),this._state=1)}finish(){this.start(),this._state<2&&($i(this._element,this._initialStyles),this._endStyles&&($i(this._element,this._endStyles),this._endStyles=null),this._state=1)}destroy(){this.finish(),this._state<3&&(n.initialStylesByElement.delete(this._element),this._startStyles&&(Hi(this._element,this._startStyles),this._endStyles=null),this._endStyles&&(Hi(this._element,this._endStyles),this._endStyles=null),$i(this._element,this._initialStyles),this._state=3)}}return n.initialStylesByElement=new WeakMap,n})();function Ea(n){let s=null;const t=Object.keys(n);for(let o=0;o<t.length;o++){const c=t[o];al(c)&&(s=s||{},s[c]=n[c])}return s}function al(n){return"display"===n||"position"===n}const Ru="animation",yc="animationend";class ed{constructor(s,t,o,c,g,C,D){this._element=s,this._name=t,this._duration=o,this._delay=c,this._easing=g,this._fillMode=C,this._onDoneFn=D,this._finished=!1,this._destroyed=!1,this._startTime=0,this._position=0,this._eventFn=P=>this._handleCallback(P)}apply(){(function(n,s){const t=jl(n,"").trim();let o=0;t.length&&(function(n,s){let t=0;for(let o=0;o<n.length;o++)","===n.charAt(o)&&t++;return t}(t)+1,s=`${t}, ${s}`),Cu(n,"",s)})(this._element,`${this._duration}ms ${this._easing} ${this._delay}ms 1 normal ${this._fillMode} ${this._name}`),el(this._element,this._eventFn,!1),this._startTime=Date.now()}pause(){Hl(this._element,this._name,"paused")}resume(){Hl(this._element,this._name,"running")}setPosition(s){const t=dc(this._element,this._name);this._position=s*this._duration,Cu(this._element,"Delay",`-${this._position}ms`,t)}getPosition(){return this._position}_handleCallback(s){const t=s._ngTestManualTimestamp||Date.now(),o=1e3*parseFloat(s.elapsedTime.toFixed(3));s.animationName==this._name&&Math.max(t-this._startTime,0)>=this._delay&&o>=this._duration&&this.finish()}finish(){this._finished||(this._finished=!0,this._onDoneFn(),el(this._element,this._eventFn,!0))}destroy(){this._destroyed||(this._destroyed=!0,this.finish(),function(n,s){const o=jl(n,"").split(","),c=ou(o,s);c>=0&&(o.splice(c,1),Cu(n,"",o.join(",")))}(this._element,this._name))}}function Hl(n,s,t){Cu(n,"PlayState",t,dc(n,s))}function dc(n,s){const t=jl(n,"");return t.indexOf(",")>0?ou(t.split(","),s):ou([t],s)}function ou(n,s){for(let t=0;t<n.length;t++)if(n[t].indexOf(s)>=0)return t;return-1}function el(n,s,t){t?n.removeEventListener(yc,s):n.addEventListener(yc,s)}function Cu(n,s,t,o){const c=Ru+s;if(null!=o){const g=n.style[c];if(g.length){const C=g.split(",");C[o]=t,t=C.join(",")}}n.style[c]=t}function jl(n,s){return n.style[Ru+s]||""}class Te{constructor(s,t,o,c,g,C,D,P){this.element=s,this.keyframes=t,this.animationName=o,this._duration=c,this._delay=g,this._finalStyles=D,this._specialStyles=P,this._onDoneFns=[],this._onStartFns=[],this._onDestroyFns=[],this.currentSnapshot={},this._state=0,this.easing=C||"linear",this.totalTime=c+g,this._buildStyler()}onStart(s){this._onStartFns.push(s)}onDone(s){this._onDoneFns.push(s)}onDestroy(s){this._onDestroyFns.push(s)}destroy(){this.init(),!(this._state>=4)&&(this._state=4,this._styler.destroy(),this._flushStartFns(),this._flushDoneFns(),this._specialStyles&&this._specialStyles.destroy(),this._onDestroyFns.forEach(s=>s()),this._onDestroyFns=[])}_flushDoneFns(){this._onDoneFns.forEach(s=>s()),this._onDoneFns=[]}_flushStartFns(){this._onStartFns.forEach(s=>s()),this._onStartFns=[]}finish(){this.init(),!(this._state>=3)&&(this._state=3,this._styler.finish(),this._flushStartFns(),this._specialStyles&&this._specialStyles.finish(),this._flushDoneFns())}setPosition(s){this._styler.setPosition(s)}getPosition(){return this._styler.getPosition()}hasStarted(){return this._state>=2}init(){this._state>=1||(this._state=1,this._styler.apply(),this._delay&&this._styler.pause())}play(){this.init(),this.hasStarted()||(this._flushStartFns(),this._state=2,this._specialStyles&&this._specialStyles.start()),this._styler.resume()}pause(){this.init(),this._styler.pause()}restart(){this.reset(),this.play()}reset(){this._state=0,this._styler.destroy(),this._buildStyler(),this._styler.apply()}_buildStyler(){this._styler=new ed(this.element,this.animationName,this._duration,this._delay,this.easing,"forwards",()=>this.finish())}triggerCallback(s){const t="start"==s?this._onStartFns:this._onDoneFns;t.forEach(o=>o()),t.length=0}beforeDestroy(){this.init();const s={};if(this.hasStarted()){const t=this._state>=3;Object.keys(this._finalStyles).forEach(o=>{"offset"!=o&&(s[o]=t?this._finalStyles[o]:gn(this.element,o))})}this.currentSnapshot=s}}class Me extends T.ZN{constructor(s,t){super(),this.element=s,this._startingStyles={},this.__initialized=!1,this._styles=Zt(t)}init(){this.__initialized||!this._startingStyles||(this.__initialized=!0,Object.keys(this._styles).forEach(s=>{this._startingStyles[s]=this.element.style[s]}),super.init())}play(){!this._startingStyles||(this.init(),Object.keys(this._styles).forEach(s=>this.element.style.setProperty(s,this._styles[s])),super.play())}destroy(){!this._startingStyles||(Object.keys(this._startingStyles).forEach(s=>{const t=this._startingStyles[s];t?this.element.style.setProperty(s,t):this.element.style.removeProperty(s)}),this._startingStyles=null,super.destroy())}}class dr{constructor(){this._count=0}validateStyleProperty(s){return Ye(s)}matchesElement(s,t){return Ie(s,t)}containsElement(s,t){return Ve(s,t)}query(s,t,o){return He(s,t,o)}computeStyle(s,t,o){return window.getComputedStyle(s)[t]}buildKeyframeElement(s,t,o){o=o.map(D=>Zt(D));let c=`@keyframes ${t} {\n`,g="";o.forEach(D=>{g=" ";const P=parseFloat(D.offset);c+=`${g}${100*P}% {\n`,g+=" ",Object.keys(D).forEach(j=>{const W=D[j];switch(j){case"offset":return;case"easing":return void(W&&(c+=`${g}animation-timing-function: ${W};\n`));default:return void(c+=`${g}${j}: ${W};\n`)}}),c+=`${g}}\n`}),c+="}\n";const C=document.createElement("style");return C.textContent=c,C}animate(s,t,o,c,g,C=[],D){const P=C.filter(Re=>Re instanceof Te),j={};Ai(o,c)&&P.forEach(Re=>{let ke=Re.currentSnapshot;Object.keys(ke).forEach(xe=>j[xe]=ke[xe])});const W=function(n){let s={};return n&&(Array.isArray(n)?n:[n]).forEach(o=>{Object.keys(o).forEach(c=>{"offset"==c||"easing"==c||(s[c]=o[c])})}),s}(t=Tr(s,t,j));if(0==o)return new Me(s,W);const re="gen_css_kf_"+this._count++,ie=this.buildKeyframeElement(s,re,t);(function(n){var s;const t=null===(s=n.getRootNode)||void 0===s?void 0:s.call(n);return"undefined"!=typeof ShadowRoot&&t instanceof ShadowRoot?t:document.head})(s).appendChild(ie);const _e=Uo(s,t),Le=new Te(s,t,re,o,c,g,W,_e);return Le.onDestroy(()=>{var n;(n=ie).parentNode.removeChild(n)}),Le}}class Ma{constructor(s,t,o,c){this.element=s,this.keyframes=t,this.options=o,this._specialStyles=c,this._onDoneFns=[],this._onStartFns=[],this._onDestroyFns=[],this._initialized=!1,this._finished=!1,this._started=!1,this._destroyed=!1,this.time=0,this.parentPlayer=null,this.currentSnapshot={},this._duration=o.duration,this._delay=o.delay||0,this.time=this._duration+this._delay}_onFinish(){this._finished||(this._finished=!0,this._onDoneFns.forEach(s=>s()),this._onDoneFns=[])}init(){this._buildPlayer(),this._preparePlayerBeforeStart()}_buildPlayer(){if(this._initialized)return;this._initialized=!0;const s=this.keyframes;this.domPlayer=this._triggerWebAnimation(this.element,s,this.options),this._finalKeyframe=s.length?s[s.length-1]:{},this.domPlayer.addEventListener("finish",()=>this._onFinish())}_preparePlayerBeforeStart(){this._delay?this._resetDomPlayerState():this.domPlayer.pause()}_triggerWebAnimation(s,t,o){return s.animate(t,o)}onStart(s){this._onStartFns.push(s)}onDone(s){this._onDoneFns.push(s)}onDestroy(s){this._onDestroyFns.push(s)}play(){this._buildPlayer(),this.hasStarted()||(this._onStartFns.forEach(s=>s()),this._onStartFns=[],this._started=!0,this._specialStyles&&this._specialStyles.start()),this.domPlayer.play()}pause(){this.init(),this.domPlayer.pause()}finish(){this.init(),this._specialStyles&&this._specialStyles.finish(),this._onFinish(),this.domPlayer.finish()}reset(){this._resetDomPlayerState(),this._destroyed=!1,this._finished=!1,this._started=!1}_resetDomPlayerState(){this.domPlayer&&this.domPlayer.cancel()}restart(){this.reset(),this.play()}hasStarted(){return this._started}destroy(){this._destroyed||(this._destroyed=!0,this._resetDomPlayerState(),this._onFinish(),this._specialStyles&&this._specialStyles.destroy(),this._onDestroyFns.forEach(s=>s()),this._onDestroyFns=[])}setPosition(s){void 0===this.domPlayer&&this.init(),this.domPlayer.currentTime=s*this.time}getPosition(){return this.domPlayer.currentTime/this.time}get totalTime(){return this._delay+this._duration}beforeDestroy(){const s={};this.hasStarted()&&Object.keys(this._finalKeyframe).forEach(t=>{"offset"!=t&&(s[t]=this._finished?this._finalKeyframe[t]:gn(this.element,t))}),this.currentSnapshot=s}triggerCallback(s){const t="start"==s?this._onStartFns:this._onDoneFns;t.forEach(o=>o()),t.length=0}}class uu{constructor(){this._isNativeImpl=/\{\s*\[native\s+code\]\s*\}/.test(Pl().toString()),this._cssKeyframesDriver=new dr}validateStyleProperty(s){return Ye(s)}matchesElement(s,t){return Ie(s,t)}containsElement(s,t){return Ve(s,t)}query(s,t,o){return He(s,t,o)}computeStyle(s,t,o){return window.getComputedStyle(s)[t]}overrideWebAnimationsSupport(s){this._isNativeImpl=s}animate(s,t,o,c,g,C=[],D){if(!D&&!this._isNativeImpl)return this._cssKeyframesDriver.animate(s,t,o,c,g,C);const W={duration:o,delay:c,fill:0==c?"both":"forwards"};g&&(W.easing=g);const re={},ie=C.filter(_e=>_e instanceof Ma);Ai(o,c)&&ie.forEach(_e=>{let Le=_e.currentSnapshot;Object.keys(Le).forEach(Re=>re[Re]=Le[Re])});const ge=Uo(s,t=Tr(s,t=t.map(_e=>Zr(_e,!1)),re));return new Ma(s,t,W,ge)}}function Pl(){return M()&&Element.prototype.animate||{}}let ec=(()=>{class n extends T._j{constructor(t,o){super(),this._nextAnimationId=0,this._renderer=t.createRenderer(o.body,{id:"0",encapsulation:e.ifc.None,styles:[],data:{animation:[]}})}build(t){const o=this._nextAnimationId.toString();this._nextAnimationId++;const c=Array.isArray(t)?(0,T.vP)(t):t;return Nc(this._renderer,null,o,"register",[c]),new Ol(o,this._renderer)}}return n.\u0275fac=function(t){return new(t||n)(e.LFG(e.FYo),e.LFG(_.K0))},n.\u0275prov=e.Yz7({token:n,factory:n.\u0275fac}),n})();class Ol extends T.LC{constructor(s,t){super(),this._id=s,this._renderer=t}create(s,t){return new Ts(this._id,s,t||{},this._renderer)}}class Ts{constructor(s,t,o,c){this.id=s,this.element=t,this._renderer=c,this.parentPlayer=null,this._started=!1,this.totalTime=0,this._command("create",o)}_listen(s,t){return this._renderer.listen(this.element,`@@${this.id}:${s}`,t)}_command(s,...t){return Nc(this._renderer,this.element,this.id,s,t)}onDone(s){this._listen("done",s)}onStart(s){this._listen("start",s)}onDestroy(s){this._listen("destroy",s)}init(){this._command("init")}hasStarted(){return this._started}play(){this._command("play"),this._started=!0}pause(){this._command("pause")}restart(){this._command("restart")}finish(){this._command("finish")}destroy(){this._command("destroy")}reset(){this._command("reset"),this._started=!1}setPosition(s){this._command("setPosition",s)}getPosition(){var s,t;return null!==(t=null===(s=this._renderer.engine.players[+this.id])||void 0===s?void 0:s.getPosition())&&void 0!==t?t:0}}function Nc(n,s,t,o,c){return n.setProperty(s,`@@${t}:${o}`,c)}const Pc="@.disabled";let Mu=(()=>{class n{constructor(t,o,c){this.delegate=t,this.engine=o,this._zone=c,this._currentId=0,this._microtaskId=1,this._animationCallbacksBuffer=[],this._rendererCache=new Map,this._cdRecurDepth=0,this.promise=Promise.resolve(0),o.onRemovalComplete=(g,C)=>{C&&C.parentNode(g)&&C.removeChild(g.parentNode,g)}}createRenderer(t,o){const g=this.delegate.createRenderer(t,o);if(!(t&&o&&o.data&&o.data.animation)){let W=this._rendererCache.get(g);return W||(W=new Ic("",g,this.engine),this._rendererCache.set(g,W)),W}const C=o.id,D=o.id+"-"+this._currentId;this._currentId++,this.engine.register(D,t);const P=W=>{Array.isArray(W)?W.forEach(P):this.engine.registerTrigger(C,D,t,W.name,W)};return o.data.animation.forEach(P),new md(this,D,g,this.engine)}begin(){this._cdRecurDepth++,this.delegate.begin&&this.delegate.begin()}_scheduleCountTask(){this.promise.then(()=>{this._microtaskId++})}scheduleListenerCallback(t,o,c){t>=0&&t<this._microtaskId?this._zone.run(()=>o(c)):(0==this._animationCallbacksBuffer.length&&Promise.resolve(null).then(()=>{this._zone.run(()=>{this._animationCallbacksBuffer.forEach(g=>{const[C,D]=g;C(D)}),this._animationCallbacksBuffer=[]})}),this._animationCallbacksBuffer.push([o,c]))}end(){this._cdRecurDepth--,0==this._cdRecurDepth&&this._zone.runOutsideAngular(()=>{this._scheduleCountTask(),this.engine.flush(this._microtaskId)}),this.delegate.end&&this.delegate.end()}whenRenderingDone(){return this.engine.whenRenderingDone()}}return n.\u0275fac=function(t){return new(t||n)(e.LFG(e.FYo),e.LFG(Ro),e.LFG(e.R0b))},n.\u0275prov=e.Yz7({token:n,factory:n.\u0275fac}),n})();class Ic{constructor(s,t,o){this.namespaceId=s,this.delegate=t,this.engine=o,this.destroyNode=this.delegate.destroyNode?c=>t.destroyNode(c):null}get data(){return this.delegate.data}destroy(){this.engine.destroy(this.namespaceId,this.delegate),this.delegate.destroy()}createElement(s,t){return this.delegate.createElement(s,t)}createComment(s){return this.delegate.createComment(s)}createText(s){return this.delegate.createText(s)}appendChild(s,t){this.delegate.appendChild(s,t),this.engine.onInsert(this.namespaceId,t,s,!1)}insertBefore(s,t,o,c=!0){this.delegate.insertBefore(s,t,o),this.engine.onInsert(this.namespaceId,t,s,c)}removeChild(s,t,o){this.engine.onRemove(this.namespaceId,t,this.delegate,o)}selectRootElement(s,t){return this.delegate.selectRootElement(s,t)}parentNode(s){return this.delegate.parentNode(s)}nextSibling(s){return this.delegate.nextSibling(s)}setAttribute(s,t,o,c){this.delegate.setAttribute(s,t,o,c)}removeAttribute(s,t,o){this.delegate.removeAttribute(s,t,o)}addClass(s,t){this.delegate.addClass(s,t)}removeClass(s,t){this.delegate.removeClass(s,t)}setStyle(s,t,o,c){this.delegate.setStyle(s,t,o,c)}removeStyle(s,t,o){this.delegate.removeStyle(s,t,o)}setProperty(s,t,o){"@"==t.charAt(0)&&t==Pc?this.disableAnimations(s,!!o):this.delegate.setProperty(s,t,o)}setValue(s,t){this.delegate.setValue(s,t)}listen(s,t,o){return this.delegate.listen(s,t,o)}disableAnimations(s,t){this.engine.disableAnimations(s,t)}}class md extends Ic{constructor(s,t,o,c){super(t,o,c),this.factory=s,this.namespaceId=t}setProperty(s,t,o){"@"==t.charAt(0)?"."==t.charAt(1)&&t==Pc?this.disableAnimations(s,o=void 0===o||!!o):this.engine.process(this.namespaceId,s,t.substr(1),o):this.delegate.setProperty(s,t,o)}listen(s,t,o){if("@"==t.charAt(0)){const c=function(n){switch(n){case"body":return document.body;case"document":return document;case"window":return window;default:return n}}(s);let g=t.substr(1),C="";return"@"!=g.charAt(0)&&([g,C]=function(n){const s=n.indexOf(".");return[n.substring(0,s),n.substr(s+1)]}(g)),this.engine.listen(this.namespaceId,c,g,C,D=>{this.factory.scheduleListenerCallback(D._data||-1,o,D)})}return this.delegate.listen(s,t,o)}}let ua=(()=>{class n extends Ro{constructor(t,o,c){super(t.body,o,c)}ngOnDestroy(){this.flush()}}return n.\u0275fac=function(t){return new(t||n)(e.LFG(_.K0),e.LFG(en),e.LFG(xo))},n.\u0275prov=e.Yz7({token:n,factory:n.\u0275fac}),n})();const bl=new e.OlP("AnimationModuleType"),Au=[{provide:T._j,useClass:ec},{provide:xo,useFactory:function(){return new ar}},{provide:Ro,useClass:ua},{provide:e.FYo,useFactory:function(n,s,t){return new Mu(n,s,t)},deps:[f.se,Ro,e.R0b]}],bu=[{provide:en,useFactory:function(){return"function"==typeof Pl()?new uu:new dr}},{provide:bl,useValue:"BrowserAnimations"},...Au],cu=[{provide:en,useClass:st},{provide:bl,useValue:"NoopAnimations"},...Au];let Gs=(()=>{class n{static withConfig(t){return{ngModule:n,providers:t.disableAnimations?cu:bu}}}return n.\u0275fac=function(t){return new(t||n)},n.\u0275mod=e.oAB({type:n}),n.\u0275inj=e.cJS({providers:bu,imports:[f.b2]}),n})();var Hu=i(91376),Yo=i(6283),du=i(23815),Ar=i.n(du),ha=i(64762),_u=i(93523);let fa=class{constructor(s){this.http=s,this.baseURL="api/cephfs",this.baseUiURL="ui-api/cephfs"}list(){return this.http.get(`${this.baseURL}`)}lsDir(s,t){let o=`${this.baseUiURL}/${s}/ls_dir?depth=2`;return t&&(o+=`&path=${encodeURIComponent(t)}`),this.http.get(o)}getCephfs(s){return this.http.get(`${this.baseURL}/${s}`)}getTabs(s){return this.http.get(`ui-api/cephfs/${s}/tabs`)}getClients(s){return this.http.get(`${this.baseURL}/${s}/clients`)}evictClient(s,t){return this.http.delete(`${this.baseURL}/${s}/client/${t}`)}getMdsCounters(s){return this.http.get(`${this.baseURL}/${s}/mds_counters`)}mkSnapshot(s,t,o){let c=new y.LE;return c=c.append("path",t),Ar().isUndefined(o)||(c=c.append("name",o)),this.http.post(`${this.baseURL}/${s}/snapshot`,null,{params:c})}rmSnapshot(s,t,o){let c=new y.LE;return c=c.append("path",t),c=c.append("name",o),this.http.delete(`${this.baseURL}/${s}/snapshot`,{params:c})}quota(s,t,o){let c=new y.LE;return c=c.append("path",t),this.http.put(`${this.baseURL}/${s}/quota`,o,{observe:"response",params:c})}};fa.\u0275fac=function(s){return new(s||fa)(e.LFG(y.eN))},fa.\u0275prov=e.Yz7({token:fa,factory:fa.\u0275fac,providedIn:"root"}),fa=(0,ha.gn)([_u.o,(0,ha.w6)("design:paramtypes",[y.eN])],fa);var Gl=i(68136),Ja=i(99466),hl=i(68774),Vl=i(96102),Hs=i(35905),V=i(46797),Ae=i(69158),ot=i(91801),_t=i(74937),lt=i(38549),un=i(59376),yn=i(47557),Or=i(66369),Vr=i(61350),_i=i(16738),oi=i.n(_i),ko=i(87311),Ho=i(7194);const Ln=["chartCanvas"],Mr=["chartTooltip"];let gr=(()=>{class n{constructor(){this.lhsCounter="mds_mem.ino",this.rhsCounter="mds_server.handle_client_request",this.chart={datasets:[{label:this.lhsCounter,yAxisID:"LHS",data:[],lineTension:.1},{label:this.rhsCounter,yAxisID:"RHS",data:[],lineTension:.1}],options:{title:{text:"",display:!0},responsive:!0,maintainAspectRatio:!1,legend:{position:"top"},scales:{xAxes:[{position:"top",type:"time",time:{displayFormats:{quarter:"MMM YYYY"}},ticks:{maxRotation:0}}],yAxes:[{id:"LHS",type:"linear",position:"left"},{id:"RHS",type:"linear",position:"right"}]},tooltips:{enabled:!1,mode:"index",intersect:!1,position:"nearest",callbacks:{title:(t,o)=>{let c=0;if(t.length>0){const g=t[0];c=o.datasets[g.datasetIndex].data[g.index].x}return c.toString()}}}},chartType:"line"}}ngOnInit(){Ar().isUndefined(this.mdsCounter)||(this.setChartTooltip(),this.updateChart())}ngOnChanges(){Ar().isUndefined(this.mdsCounter)||this.updateChart()}setChartTooltip(){const t=new ko.h(this.chartCanvas,this.chartTooltip,c=>c.caretX+"px",c=>c.caretY-c.height-23+"px");t.getTitle=c=>oi()(c,"x").format("LTS"),t.checkOffset=!0;const o={title:{text:this.mdsCounter.name},tooltips:{custom:c=>t.customTooltips(c)}};Ar().merge(this.chart,{options:o})}updateChart(){const t=[{data:this.convertTimeSeries(this.mdsCounter[this.lhsCounter])},{data:this.deltaTimeSeries(this.mdsCounter[this.rhsCounter])}];Ar().merge(this.chart,{datasets:t}),this.chart.datasets=[...this.chart.datasets]}convertTimeSeries(t){const o=[];return Ar().each(t,c=>{o.push({x:1e3*c[0],y:c[1]})}),o.shift(),o}deltaTimeSeries(t){let o,c=t[0];const g=[];for(o=1;o<t.length;o++){const C=t[o];g.push({x:1e3*C[0],y:C[1]-c[1]}),c=C}return g}}return n.\u0275fac=function(t){return new(t||n)},n.\u0275cmp=e.Xpm({type:n,selectors:[["cd-cephfs-chart"]],viewQuery:function(t,o){if(1&t&&(e.Gf(Ln,7),e.Gf(Mr,7)),2&t){let c;e.iGM(c=e.CRH())&&(o.chartCanvas=c.first),e.iGM(c=e.CRH())&&(o.chartTooltip=c.first)}},inputs:{mdsCounter:"mdsCounter"},features:[e.TTD],decls:6,vars:3,consts:[[1,"chart-container"],["baseChart","",3,"datasets","options","chartType"],["chartCanvas",""],[1,"chartjs-tooltip"],["chartTooltip",""]],template:function(t,o){1&t&&(e.TgZ(0,"div",0),e._UZ(1,"canvas",1,2),e.TgZ(3,"div",3,4),e._UZ(5,"table"),e.qZA(),e.qZA()),2&t&&(e.xp6(1),e.Q6J("datasets",o.chart.datasets)("options",o.chart.options)("chartType",o.chart.chartType))},directives:[Ho.jh],styles:['.chart-container[_ngcontent-%COMP%]{cursor:pointer;margin:auto;overflow:visible;position:absolute}canvas[_ngcontent-%COMP%]{user-select:none}.chartjs-tooltip[_ngcontent-%COMP%]{background:rgba(0,0,0,.7);border-radius:3px;color:#fff;font-family:"Helvetica Neue","Helvetica","Arial",sans-serif!important;opacity:0;pointer-events:none;position:absolute;transform:translate(-50%);transition:all .1s ease}.chartjs-tooltip.transform-left[_ngcontent-%COMP%]{transform:translate(-10%)}.chartjs-tooltip.transform-left[_ngcontent-%COMP%]:after{left:10%}.chartjs-tooltip.transform-right[_ngcontent-%COMP%]{transform:translate(-90%)}.chartjs-tooltip.transform-right[_ngcontent-%COMP%]:after{left:90%}.chartjs-tooltip[_ngcontent-%COMP%]:after{border-color:#000 transparent transparent transparent;border-style:solid;border-width:5px;content:" ";left:50%;margin-left:-5px;position:absolute;top:100%}  .chartjs-tooltip-key{display:inline-block;height:10px;margin-right:10px;width:10px}.chart-container[_ngcontent-%COMP%]{height:500px;margin-bottom:20px;position:relative;width:100%}']}),n})();var co=i(60251);const Ss=["poolUsageTpl"],Na=["activityTmpl"];function El(n,s){if(1&n&&(e.TgZ(0,"div",0),e.TgZ(1,"div",11),e._UZ(2,"cd-cephfs-chart",12),e.qZA(),e.qZA()),2&n){const t=s.$implicit;e.xp6(2),e.Q6J("mdsCounter",t)}}function Ks(n,s){if(1&n&&e._UZ(0,"cd-usage-bar",13),2&n){const t=s.row;e.Q6J("total",t.size)("used",t.used)}}function td(n,s){1&n&&(e._uU(0),e.ALo(1,"dimless")),2&n&&e.AsE(" ","standby-replay"===s.row.state?"Evts":"Reqs",": ",e.lcZ(1,2,s.value)," /s\n")}let Lc=(()=>{class n{constructor(t,o){this.dimlessBinary=t,this.dimless=o,this.standbys=[],this.objectValues=Object.values}ngOnChanges(){this.setStandbys()}setStandbys(){this.standbys=[{key:"Standby daemons",value:this.data.standbys}]}ngOnInit(){this.columns={ranks:[{prop:"rank",name:"Rank"},{prop:"state",name:"State"},{prop:"mds",name:"Daemon"},{prop:"activity",name:"Activity",cellTemplate:this.activityTmpl},{prop:"dns",name:"Dentries",pipe:this.dimless},{prop:"inos",name:"Inodes",pipe:this.dimless},{prop:"dirs",name:"Dirs",pipe:this.dimless},{prop:"caps",name:"Caps",pipe:this.dimless}],pools:[{prop:"pool",name:"Pool"},{prop:"type",name:"Type"},{prop:"size",name:"Size",pipe:this.dimlessBinary},{name:"Usage",cellTemplate:this.poolUsageTpl,comparator:(t,o,c,g)=>{const C=c.used/c.avail,D=g.used/g.avail;return C===D?0:C>D?1:-1}}]}}trackByFn(t,o){return o.name}}return n.\u0275fac=function(t){return new(t||n)(e.Y36(yn.$),e.Y36(Or.n))},n.\u0275cmp=e.Xpm({type:n,selectors:[["cd-cephfs-detail"]],viewQuery:function(t,o){if(1&t&&(e.Gf(Ss,7),e.Gf(Na,7)),2&t){let c;e.iGM(c=e.CRH())&&(o.poolUsageTpl=c.first),e.iGM(c=e.CRH())&&(o.activityTmpl=c.first)}},inputs:{data:"data"},features:[e.TTD],decls:19,vars:9,consts:function(){let s,t,o,c;return s="Ranks",t="Standbys",o="Pools",c="MDS performance counters",[[1,"row"],[1,"col-sm-6"],s,[3,"data","columns","toolHeader"],t,[3,"data"],o,c,["class","row",4,"ngFor","ngForOf","ngForTrackBy"],["poolUsageTpl",""],["activityTmpl",""],[1,"col-md-12"],[3,"mdsCounter"],[3,"total","used"]]},template:function(t,o){1&t&&(e.TgZ(0,"div",0),e.TgZ(1,"div",1),e.TgZ(2,"legend"),e.SDv(3,2),e.qZA(),e._UZ(4,"cd-table",3),e.TgZ(5,"legend"),e.SDv(6,4),e.qZA(),e._UZ(7,"cd-table-key-value",5),e.qZA(),e.TgZ(8,"div",1),e.TgZ(9,"legend"),e.SDv(10,6),e.qZA(),e._UZ(11,"cd-table",3),e.qZA(),e.qZA(),e.TgZ(12,"legend"),e.SDv(13,7),e.qZA(),e.YNc(14,El,3,1,"div",8),e.YNc(15,Ks,1,2,"ng-template",null,9,e.W1O),e.YNc(17,td,2,4,"ng-template",null,10,e.W1O)),2&t&&(e.xp6(4),e.Q6J("data",o.data.ranks)("columns",o.columns.ranks)("toolHeader",!1),e.xp6(3),e.Q6J("data",o.standbys),e.xp6(4),e.Q6J("data",o.data.pools)("columns",o.columns.pools)("toolHeader",!1),e.xp6(3),e.Q6J("ngForOf",o.objectValues(o.data.mdsCounters))("ngForTrackBy",o.trackByFn))},directives:[Hs.a,Vr.b,_.sg,gr,co.O],pipes:[Or.n],styles:[".progress[_ngcontent-%COMP%]{margin-bottom:0}"]}),n})();var zl=i(30982),ki=i(79512),No=i(65862),_a=i(18001),ll=i(97161),Ul=i(63285),Xs=i(94928);let vd=(()=>{class n{constructor(t,o,c,g,C){this.cephfsService=t,this.modalService=o,this.notificationService=c,this.authStorageService=g,this.actionLabels=C,this.triggerApiUpdate=new e.vpe,this.selection=new hl.r,this.permission=this.authStorageService.getPermissions().cephfs,this.tableActions=[{permission:"update",icon:No.P.signOut,click:()=>this.evictClientModal(),name:this.actionLabels.EVICT}]}ngOnInit(){this.columns=[{prop:"id",name:"id"},{prop:"type",name:"type"},{prop:"state",name:"state"},{prop:"version",name:"version"},{prop:"hostname",name:"Host"},{prop:"root",name:"root"}]}updateSelection(t){this.selection=t}evictClient(t){this.cephfsService.evictClient(this.id,t).subscribe(()=>{this.triggerApiUpdate.emit(),this.modalRef.close(),this.notificationService.show(_a.k.success,"Evicted client '" + t + "'")},()=>{this.modalRef.componentInstance.stopLoadingSpinner()})}evictClientModal(){const t=this.selection.first().id;this.modalRef=this.modalService.show(zl.M,{itemDescription:"client",itemNames:[t],actionDescription:"evict",submitAction:()=>this.evictClient(t)})}}return n.\u0275fac=function(t){return new(t||n)(e.Y36(fa),e.Y36(Ul.Z),e.Y36(ll.g),e.Y36(_t.j),e.Y36(ki.p4))},n.\u0275cmp=e.Xpm({type:n,selectors:[["cd-cephfs-clients"]],inputs:{id:"id",clients:"clients"},outputs:{triggerApiUpdate:"triggerApiUpdate"},decls:2,vars:7,consts:[["selectionType","single",3,"data","columns","status","autoReload","fetchData","updateSelection"],[1,"table-actions",3,"permission","selection","tableActions"]],template:function(t,o){1&t&&(e.TgZ(0,"cd-table",0),e.NdJ("fetchData",function(){return o.triggerApiUpdate.emit()})("updateSelection",function(g){return o.updateSelection(g)}),e._UZ(1,"cd-table-actions",1),e.qZA()),2&t&&(e.Q6J("data",o.clients.data)("columns",o.columns)("status",o.clients.status)("autoReload",-1),e.xp6(1),e.Q6J("permission",o.permission)("selection",o.selection)("tableActions",o.tableActions))},directives:[Hs.a,Xs.K],styles:[""]}),n})();var vn=i(24751),Il=i(19723),nd=i(36169),Vd=i(65683),ds=i(77205),ca=i(87925);const jc=["origin"],nc=function(n,s){return[n,s]};function df(n,s){if(1&n&&e._UZ(0,"i",5),2&n){const t=e.oxw(2);e.Q6J("ngClass",e.WLB(1,nc,t.icons.spinner,t.icons.spin))}}function ul(n,s){if(1&n&&(e.TgZ(0,"tree-root",10),e.YNc(1,df,1,4,"ng-template",null,11,e.W1O),e.qZA()),2&n){const t=e.oxw();e.Q6J("nodes",t.nodes)("options",t.treeOptions)}}function zd(n,s){if(1&n){const t=e.EpF();e.ynx(0),e.TgZ(1,"legend"),e.SDv(2,17),e.qZA(),e.TgZ(3,"cd-table",18),e.NdJ("updateSelection",function(c){return e.CHM(t),e.oxw(2).quota.updateSelection(c)}),e._UZ(4,"cd-table-actions",19),e.qZA(),e.BQk()}if(2&n){const t=e.oxw(2);e.xp6(3),e.Q6J("data",t.settings)("columns",t.quota.columns)("limit",0)("footer",!1)("onlyActionHeader",!0)("forceIdentifier",!0)("toolHeader",!1),e.xp6(1),e.Q6J("permission",t.permission)("selection",t.quota.selection)("tableActions",t.quota.tableActions)}}function Wd(n,s){if(1&n){const t=e.EpF();e.TgZ(0,"div",12),e.TgZ(1,"div",2),e.TgZ(2,"div",3),e._uU(3),e.qZA(),e.TgZ(4,"div",6),e.YNc(5,zd,5,10,"ng-container",13),e.TgZ(6,"legend"),e.SDv(7,14),e.qZA(),e.TgZ(8,"cd-table",15),e.NdJ("updateSelection",function(c){return e.CHM(t),e.oxw().snapshot.updateSelection(c)}),e._UZ(9,"cd-table-actions",16),e.qZA(),e.qZA(),e.qZA(),e.qZA()}if(2&n){const t=e.oxw();e.xp6(3),e.hij(" ",t.selectedDir.path," "),e.xp6(2),e.Q6J("ngIf","/"!==t.selectedDir.path),e.xp6(3),e.Q6J("data",t.selectedDir.snapshots)("columns",t.snapshot.columns),e.xp6(1),e.Q6J("permission",t.permission)("selection",t.snapshot.selection)("tableActions",t.snapshot.tableActions)}}function Be(n,s){if(1&n){const t=e.EpF();e.TgZ(0,"span",20),e.NdJ("click",function(){const g=e.CHM(t).value;return e.oxw().selectOrigin(g)}),e._uU(1),e.qZA()}if(2&n){const t=s.value;e.xp6(1),e.Oqu(t)}}let Ce=(()=>{class n{constructor(t,o,c,g,C,D,P){this.authStorageService=t,this.modalService=o,this.cephfsService=c,this.cdDatePipe=g,this.actionLabels=C,this.notificationService=D,this.dimlessBinaryPipe=P,this.icons=No.P,this.loadingIndicator=!1,this.loading={},this.treeOptions={useVirtualScroll:!0,getChildren:j=>this.updateDirectory(j.id),actionMapping:{mouse:{click:this.selectAndShowNode.bind(this),expanderClick:this.selectAndShowNode.bind(this)}}}}selectAndShowNode(t,o,c){Il.iM.TOGGLE_EXPANDED(t,o,c),this.selectNode(o)}selectNode(t){Il.iM.TOGGLE_ACTIVE(void 0,t,void 0),this.selectedDir=this.getDirectory(t),"/"!==t.id&&this.setSettings(t)}ngOnInit(){this.permission=this.authStorageService.getPermissions().cephfs,this.setUpQuotaTable(),this.setUpSnapshotTable()}setUpQuotaTable(){this.quota={columns:[{prop:"row.name",name:"Name",flexGrow:1},{prop:"row.value",name:"Value",sortable:!1,flexGrow:1},{prop:"row.originPath",name:"Origin",sortable:!1,cellTemplate:this.originTmpl,flexGrow:1}],selection:new hl.r,updateSelection:t=>{this.quota.selection=t},tableActions:[{name:this.actionLabels.SET,icon:No.P.edit,permission:"update",visible:t=>!t.hasSelection||t.first()&&0===t.first().dirValue,click:()=>this.updateQuotaModal()},{name:this.actionLabels.UPDATE,icon:No.P.edit,permission:"update",visible:t=>t.first()&&t.first().dirValue>0,click:()=>this.updateQuotaModal()},{name:this.actionLabels.UNSET,icon:No.P.destroy,permission:"update",disable:t=>!t.hasSelection||t.first()&&0===t.first().dirValue,click:()=>this.unsetQuotaModal()}]}}setUpSnapshotTable(){this.snapshot={columns:[{prop:"name",name:"Name",flexGrow:1},{prop:"path",name:"Path",isHidden:!0,flexGrow:2},{prop:"created",name:"Created",flexGrow:1,pipe:this.cdDatePipe}],selection:new hl.r,updateSelection:t=>{this.snapshot.selection=t},tableActions:[{name:this.actionLabels.CREATE,icon:No.P.add,permission:"create",canBePrimary:t=>!t.hasSelection,click:()=>this.createSnapshot(),disable:()=>this.disableCreateSnapshot()},{name:this.actionLabels.DELETE,icon:No.P.destroy,permission:"delete",click:()=>this.deleteSnapshotModal(),canBePrimary:t=>t.hasSelection,disable:t=>!t.hasSelection}]}}disableCreateSnapshot(){const t=this.selectedDir.path.split("/").slice(1);return t.length>=4&&"volumes"===t[0]&&"Cannot create snapshots for files/folders in the subvolume " + t[2] + ""}ngOnChanges(){this.selectedDir=void 0,this.dirs=[],this.requestedPaths=[],this.nodeIds={},this.id&&(this.setRootNode(),this.firstCall())}setRootNode(){this.nodes=[{name:"/",id:"/",isExpanded:!0}]}firstCall(){setTimeout(()=>{this.getNode("/").loadNodeChildren()},10)}updateDirectory(t){if(this.unsetLoadingIndicator(),this.requestedPaths.includes(t)){if(!0===this.loading[t])return}else this.requestedPaths.push(t);return new Promise(o=>{this.setLoadingIndicator(t,!0),this.cephfsService.lsDir(this.id,t).subscribe(c=>{this.updateTreeStructure(c),this.updateQuotaTable(),this.updateTree(),o(this.getChildren(t)),this.setLoadingIndicator(t,!1)})})}setLoadingIndicator(t,o){this.loading[t]=o,this.unsetLoadingIndicator()}getSubDirectories(t,o=this.dirs){return o.filter(c=>c.parent===t)}getChildren(t){const o=this.getSubTree(t);return Ar().sortBy(this.getSubDirectories(t),"path").map(c=>this.createNode(c,o))}createNode(t,o){return this.nodeIds[t.path]=t,o||this.getSubTree(t.parent),{name:t.name,id:t.path,hasChildren:this.getSubDirectories(t.path,o).length>0}}getSubTree(t){return this.dirs.filter(o=>o.parent&&o.parent.startsWith(t))}setSettings(t){const o=(c,g)=>c?g?g(c):c:"";this.settings=[this.getQuota(t,"max_files",o),this.getQuota(t,"max_bytes",c=>o(c,g=>this.dimlessBinaryPipe.transform(g)))]}getQuota(t,o,c){const g=t.id;t=this.getOrigin(t,o);const C=this.getDirectory(t),D=C.quotas[o];let P=D,j=C.path;if(t.id===g)if("/"===t.parent.id)P=0;else{const W=this.getDirectory(this.getOrigin(t.parent,o));P=W.quotas[o],j=W.path}return{row:{name:"max_bytes"===o?"Max size":"Max files",value:c(D),originPath:D?C.path:""},quotaKey:o,dirValue:this.nodeIds[g].quotas[o],nextTreeMaximum:{value:P,path:P?j:""}}}getOrigin(t,o){if(t.parent&&"/"!==t.parent.id){const c=this.getQuotaFromTree(t,o),g=this.getOrigin(t.parent,o),C=this.getQuotaFromTree(g,o);return 0===c||0!==C&&C<c?g:t}return t}getQuotaFromTree(t,o){return this.getDirectory(t).quotas[o]}getDirectory(t){return this.nodeIds[t.id]}selectOrigin(t){this.selectNode(this.getNode(t))}getNode(t){return this.treeComponent.treeModel.getNodeById(t)}updateQuotaModal(){const t=this.selectedDir.path,o=this.quota.selection.first(),c=o.nextTreeMaximum,g=o.quotaKey,C=o.dirValue;this.modalService.show(Vd.X,{titleText:this.getModalQuotaTitle(0===C?this.actionLabels.SET:this.actionLabels.UPDATE,t),message:c.value?"The inherited " + this.getQuotaValueFromPathMsg(c.value, c.path) + " is the maximum value to be used.":void 0,fields:[this.getQuotaFormField(o.row.name,g,C,c.value)],submitButtonText:"Save",onSubmit:D=>this.updateQuota(D)})}getModalQuotaTitle(t,o){return "" + t + " CephFS " + this.getQuotaName() + " quota for '" + o + "'"}getQuotaName(){return this.isBytesQuotaSelected()?"size":"files"}isBytesQuotaSelected(){return"max_bytes"===this.quota.selection.first().quotaKey}getQuotaValueFromPathMsg(t,o){return t=this.isBytesQuotaSelected()?this.dimlessBinaryPipe.transform(t):t,"" + this.getQuotaName() + " quota " + t + " from '" + o + "'"}getQuotaFormField(t,o,c,g){const C="max_bytes"===o,D=[C?ds.h.binaryMin(0):vn.kI.min(0)];g&&D.push(C?ds.h.binaryMax(g):vn.kI.max(g));const P={type:C?"binary":"number",label:t,name:o,value:c,validators:D,required:!0};return C||(P.errors={min:"Value has to be at least 0 or more",max:"Value has to be at most " + g + " or less"}),P}updateQuota(t,o){const c=this.selectedDir.path,g=this.quota.selection.first().quotaKey,C=0===this.selectedDir.quotas[g]?this.actionLabels.SET:0===t[g]?this.actionLabels.UNSET:"Updated";this.cephfsService.quota(this.id,c,t).subscribe(()=>{o&&o(),this.notificationService.show(_a.k.success,this.getModalQuotaTitle(C,c)),this.forceDirRefresh()})}unsetQuotaModal(){const t=this.selectedDir.path,o=this.quota.selection.first(),c=o.quotaKey,g=o.nextTreeMaximum,C=o.dirValue,D=this.getQuotaValueFromPathMsg(g.value,g.path),P=g.value>0?g.value>C?"in order to inherit " + D + "":"which isn't used because of the inheritance of " + D + "":"in order to have no quota on the directory";this.modalRef=this.modalService.show(nd.Y,{titleText:this.getModalQuotaTitle(this.actionLabels.UNSET,t),buttonText:this.actionLabels.UNSET,description:"" + this.actionLabels.UNSET + " " + this.getQuotaValueFromPathMsg(C, t) + " " + P + ".",onSubmit:()=>this.updateQuota({[c]:0},()=>this.modalRef.close())})}createSnapshot(){const t=this.selectedDir.path;this.modalService.show(Vd.X,{titleText:"Create Snapshot",message:"Please enter the name of the snapshot.",fields:[{type:"text",name:"name",value:`${oi()().toISOString(!0)}`,required:!0}],submitButtonText:"Create Snapshot",onSubmit:o=>{this.cephfsService.mkSnapshot(this.id,t,o.name).subscribe(c=>{this.notificationService.show(_a.k.success,"Created snapshot '" + c + "' for '" + t + "'"),this.forceDirRefresh()})}})}forceDirRefresh(t){if(!t){const c=this.selectedDir;if(!c)throw new Error("This function can only be called without path if an selection was made");t=c.parent?c.parent:c.path}this.getNode(t).loadNodeChildren()}updateTreeStructure(t){const o=(g,C)=>{const D=g.filter(j=>j.parent===C),P=D.map(j=>j.path);return{children:D,paths:P}};Ar().uniq(t.map(g=>g.parent).sort()).forEach(g=>{const C=o(t,g),D=o(this.dirs,g);D.children.forEach(P=>{C.paths.includes(P.path)||this.removeOldDirectory(P)}),C.children.forEach(P=>{D.paths.includes(P.path)?this.updateExistingDirectory(D.children,P):this.addNewDirectory(P)})})}removeOldDirectory(t){const o=t.path;Ar().remove(this.dirs,c=>c.path===o),delete this.nodeIds[o],this.updateDirectoriesParentNode(t)}updateDirectoriesParentNode(t){const o=t.parent;if(!o)return;const c=this.getNode(o);if(!c)return;const g=this.getChildren(o);c.data.children=g,c.data.hasChildren=g.length>0,this.treeComponent.treeModel.update()}addNewDirectory(t){this.dirs.push(t),this.nodeIds[t.path]=t,this.updateDirectoriesParentNode(t)}updateExistingDirectory(t,o){const c=t.find(g=>g.path===o.path);Object.assign(c,o)}updateQuotaTable(){const t=this.selectedDir?this.getNode(this.selectedDir.path):void 0;t&&"/"!==t.id&&this.setSettings(t)}updateTree(t=!1){this.loadingIndicator&&!t||(this.treeComponent.treeModel.update(),this.nodes=[...this.nodes],this.treeComponent.sizeChanged())}deleteSnapshotModal(){this.modalRef=this.modalService.show(zl.M,{itemDescription:"CephFs Snapshot",itemNames:this.snapshot.selection.selected.map(t=>t.name),submitAction:()=>this.deleteSnapshot()})}deleteSnapshot(){const t=this.selectedDir.path;this.snapshot.selection.selected.forEach(o=>{const c=o.name;this.cephfsService.rmSnapshot(this.id,t,c).subscribe(()=>{this.notificationService.show(_a.k.success,"Deleted snapshot '" + c + "' for '" + t + "'")})}),this.modalRef.close(),this.forceDirRefresh()}refreshAllDirectories(){this.loadingIndicator=!0,this.requestedPaths.map(o=>this.forceDirRefresh(o));const t=setInterval(()=>{this.updateTree(!0),this.loadingIndicator||clearInterval(t)},3e3)}unsetLoadingIndicator(){!this.loadingIndicator||(clearTimeout(this.loadingTimeout),this.loadingTimeout=setTimeout(()=>{if(Object.values(this.loading).some(o=>o))return this.unsetLoadingIndicator();this.loadingIndicator=!1,this.updateTree()},3e3))}}return n.\u0275fac=function(t){return new(t||n)(e.Y36(_t.j),e.Y36(Ul.Z),e.Y36(fa),e.Y36(Vl.N),e.Y36(ki.p4),e.Y36(ll.g),e.Y36(yn.$))},n.\u0275cmp=e.Xpm({type:n,selectors:[["cd-cephfs-directories"]],viewQuery:function(t,o){if(1&t&&(e.Gf(Il.qr,5),e.Gf(jc,7)),2&t){let c;e.iGM(c=e.CRH())&&(o.treeComponent=c.first),e.iGM(c=e.CRH())&&(o.originTmpl=c.first)}},inputs:{id:"id"},features:[e.TTD],decls:11,vars:10,consts:function(){let s,t;return s="Snapshots",t="Quotas",[[1,"row"],[1,"col-sm-4","pr-0"],[1,"card"],[1,"card-header"],["type","button",1,"btn","btn-light","pull-right",3,"click"],[3,"ngClass"],[1,"card-body"],[3,"nodes","options",4,"ngIf"],["class","col-sm-8 metadata",4,"ngIf"],["origin",""],[3,"nodes","options"],["loadingTemplate",""],[1,"col-sm-8","metadata"],[4,"ngIf"],s,["identifier","name","forceIdentifier","true","selectionType","multiClick",3,"data","columns","updateSelection"],[1,"table-actions",3,"permission","selection","tableActions"],t,["selectionType","single","identifier","quotaKey",3,"data","columns","limit","footer","onlyActionHeader","forceIdentifier","toolHeader","updateSelection"],[1,"only-table-actions",3,"permission","selection","tableActions"],[1,"quota-origin",3,"click"]]},template:function(t,o){1&t&&(e.TgZ(0,"div",0),e.TgZ(1,"div",1),e.TgZ(2,"div",2),e.TgZ(3,"div",3),e.TgZ(4,"button",4),e.NdJ("click",function(){return o.refreshAllDirectories()}),e._UZ(5,"i",5),e.qZA(),e.qZA(),e.TgZ(6,"div",6),e.YNc(7,ul,3,2,"tree-root",7),e.qZA(),e.qZA(),e.qZA(),e.YNc(8,Wd,10,7,"div",8),e.qZA(),e.YNc(9,Be,2,1,"ng-template",null,9,e.W1O)),2&t&&(e.xp6(4),e.ekj("disabled",o.loadingIndicator),e.xp6(1),e.ekj("fa-spin",o.loadingIndicator),e.Q6J("ngClass",e.WLB(7,nc,o.icons.large,o.icons.refresh)),e.xp6(2),e.Q6J("ngIf",o.nodes),e.xp6(1),e.Q6J("ngIf",o.selectedDir))},directives:[ca.o,_.mk,_.O5,Il.qr,Hs.a,Xs.K],styles:["cd-cephfs-directories tree-root .tree-children{overflow:inherit}.quota-origin[_ngcontent-%COMP%]{color:#2b99a8;cursor:pointer}.quota-origin[_ngcontent-%COMP%]:hover{color:#212529}"]}),n})();var it=i(76317);function yt(n,s){if(1&n&&e._UZ(0,"cd-cephfs-detail",15),2&n){const t=e.oxw(2);e.Q6J("data",t.details)}}function qt(n,s){if(1&n){const t=e.EpF();e.TgZ(0,"cd-cephfs-clients",16),e.NdJ("triggerApiUpdate",function(){return e.CHM(t),e.oxw(2).refresh()}),e.qZA()}if(2&n){const t=e.oxw(2);e.Q6J("id",t.id)("clients",t.clients)}}function Un(n,s){if(1&n&&e._UZ(0,"cd-cephfs-directories",17),2&n){const t=e.oxw(2);e.Q6J("id",t.id)}}function qn(n,s){if(1&n&&e._UZ(0,"cd-grafana",18),2&n){const t=e.oxw(2);e.Q6J("grafanaPath","mds-performance?var-mds_servers=mds."+t.grafanaId)("type","metrics")}}function yi(n,s){if(1&n){const t=e.EpF();e.ynx(0),e.TgZ(1,"ul",1,2),e.NdJ("navChange",function(){return e.CHM(t),e.oxw().softRefresh()}),e.TgZ(3,"li",3),e.TgZ(4,"a",4),e.SDv(5,5),e.qZA(),e.YNc(6,yt,1,1,"ng-template",6),e.qZA(),e.TgZ(7,"li",7),e.TgZ(8,"a",4),e.ynx(9),e.SDv(10,8),e.BQk(),e.TgZ(11,"span",9),e._uU(12),e.qZA(),e.qZA(),e.YNc(13,qt,1,2,"ng-template",6),e.qZA(),e.TgZ(14,"li",10),e.TgZ(15,"a",4),e.SDv(16,11),e.qZA(),e.YNc(17,Un,1,1,"ng-template",6),e.qZA(),e.TgZ(18,"li",12),e.TgZ(19,"a",4),e.SDv(20,13),e.qZA(),e.YNc(21,qn,1,2,"ng-template",6),e.qZA(),e.qZA(),e._UZ(22,"div",14),e.BQk()}if(2&n){const t=e.MAs(2),o=e.oxw();e.xp6(12),e.Oqu(o.clients.data.length),e.xp6(10),e.Q6J("ngbNavOutlet",t)}}let Go=(()=>{class n{constructor(t,o,c){this.ngZone=t,this.authStorageService=o,this.cephfsService=c,this.clients={data:[],status:new Ae.E(ot.T.ValueNone)},this.details={standbys:"",pools:[],ranks:[],mdsCounters:{},name:""},this.grafanaPermission=this.authStorageService.getPermissions().grafana}ngOnChanges(){this.selection?this.selection.id!==this.id&&this.setupSelected(this.selection.id,this.selection.mdsmap.info):this.unsubscribeInterval()}setupSelected(t,o){this.id=t;const c=Ar().first(Object.values(o));this.grafanaId=c&&c.name,this.details={standbys:"",pools:[],ranks:[],mdsCounters:{},name:""},this.clients={data:[],status:new Ae.E(ot.T.ValueNone)},this.updateInterval()}updateInterval(){this.unsubscribeInterval(),this.subscribeInterval()}unsubscribeInterval(){this.reloadSubscriber&&this.reloadSubscriber.unsubscribe()}subscribeInterval(){this.ngZone.runOutsideAngular(()=>this.reloadSubscriber=(0,V.H)(0,5e3).subscribe(()=>this.ngZone.run(()=>this.refresh())))}refresh(){this.cephfsService.getTabs(this.id).subscribe(t=>{this.data=t,this.softRefresh()},()=>{this.clients.status=new Ae.E(ot.T.ValueException)})}softRefresh(){const t=Ar().cloneDeep(this.data);this.clients=t.clients,this.clients.status=new Ae.E(this.clients.status),this.details={standbys:t.standbys,pools:t.pools,ranks:t.ranks,mdsCounters:t.mds_counters,name:t.name}}ngOnDestroy(){this.unsubscribeInterval()}}return n.\u0275fac=function(t){return new(t||n)(e.Y36(e.R0b),e.Y36(_t.j),e.Y36(fa))},n.\u0275cmp=e.Xpm({type:n,selectors:[["cd-cephfs-tabs"]],inputs:{selection:"selection"},features:[e.TTD],decls:1,vars:1,consts:function(){let s,t,o,c;return s="Details",t="Clients",o="Directories",c="Performance Details",[[4,"ngIf"],["ngbNav","","cdStatefulTab","cephfs-tabs",1,"nav-tabs",3,"navChange"],["nav","ngbNav"],["ngbNavItem","details"],["ngbNavLink",""],s,["ngbNavContent",""],["ngbNavItem","clients"],t,[1,"badge","badge-pill","badge-tab","ml-1"],["ngbNavItem","directories"],o,["ngbNavItem","performance-details"],c,[3,"ngbNavOutlet"],[3,"data"],[3,"id","clients","triggerApiUpdate"],[3,"id"],["uid","tbO9LAiZz","grafanaStyle","one",3,"grafanaPath","type"]]},template:function(t,o){1&t&&e.YNc(0,yi,23,2,"ng-container",0),2&t&&e.Q6J("ngIf",o.selection)},directives:[_.O5,lt.Pz,un.m,lt.nv,lt.Vx,lt.uN,lt.tO,Lc,vd,Ce,it.F],styles:[""]}),n})(),ka=(()=>{class n extends Gl.o{constructor(t,o){super(),this.cephfsService=t,this.cdDatePipe=o,this.filesystems=[],this.selection=new hl.r}ngOnInit(){this.columns=[{name:"Name",prop:"mdsmap.fs_name",flexGrow:2},{name:"Created",prop:"mdsmap.created",flexGrow:2,pipe:this.cdDatePipe},{name:"Enabled",prop:"mdsmap.enabled",flexGrow:1,cellTransformation:Ja.e.checkIcon}]}loadFilesystems(t){this.cephfsService.list().subscribe(o=>{this.filesystems=o},()=>{t.error()})}updateSelection(t){this.selection=t}}return n.\u0275fac=function(t){return new(t||n)(e.Y36(fa),e.Y36(Vl.N))},n.\u0275cmp=e.Xpm({type:n,selectors:[["cd-cephfs-list"]],features:[e.qOj],decls:2,vars:4,consts:[["columnMode","flex","identifier","id","forceIdentifier","true","selectionType","single",3,"data","columns","hasDetails","fetchData","setExpandedRow","updateSelection"],["cdTableDetail","",3,"selection"]],template:function(t,o){1&t&&(e.TgZ(0,"cd-table",0),e.NdJ("fetchData",function(g){return o.loadFilesystems(g)})("setExpandedRow",function(g){return o.setExpandedRow(g)})("updateSelection",function(g){return o.updateSelection(g)}),e._UZ(1,"cd-cephfs-tabs",1),e.qZA()),2&t&&(e.Q6J("data",o.filesystems)("columns",o.columns)("hasDetails",!0),e.xp6(1),e.Q6J("selection",o.expandedRow))},directives:[Hs.a,Go],styles:[""]}),n})(),ss=(()=>{class n{static getType(t){const o=Ar().find(this.knownTypes,c=>c.name===t);if(void 0!==o)return o;throw new Error('Found unknown type "'+t+'" for config option.')}static getTypeValidators(t){const o=n.getType(t.type);if("bool"===o.name||"str"===o.name)return;const c={validators:[],patternHelpText:o.patternHelpText};return o.isNumberType?(t.max&&""!==t.max&&(c.max=t.max,c.validators.push(vn.kI.max(t.max))),t.min&&""!==t.min?(c.min=t.min,c.validators.push(vn.kI.min(t.min))):"defaultMin"in o&&(c.min=o.defaultMin,c.validators.push(vn.kI.min(o.defaultMin))),c.validators.push("float"===t.type?ds.h.decimalNumber():ds.h.number(o.allowsNegative))):"addr"===t.type?c.validators=[ds.h.ip()]:"uuid"===t.type&&(c.validators=[ds.h.uuid()]),c}static getTypeStep(t,o){if(["uint","int","size","secs"].includes(t))return 1;if("float"===t){if(null!==o&&-1!==o.toString().indexOf(".")){const C=o.toString().split(".");return Math.pow(10,-C[1].length)}return.1}}}return n.knownTypes=[{name:"uint",inputType:"number",humanReadable:"Unsigned integer value",defaultMin:0,patternHelpText:"The entered value needs to be an unsigned number.",isNumberType:!0,allowsNegative:!1},{name:"int",inputType:"number",humanReadable:"Integer value",patternHelpText:"The entered value needs to be a number.",isNumberType:!0,allowsNegative:!0},{name:"size",inputType:"number",humanReadable:"Unsigned integer value (>=16bit)",defaultMin:0,patternHelpText:"The entered value needs to be a unsigned number.",isNumberType:!0,allowsNegative:!1},{name:"secs",inputType:"number",humanReadable:"Number of seconds",defaultMin:1,patternHelpText:"The entered value needs to be a number >= 1.",isNumberType:!0,allowsNegative:!1},{name:"float",inputType:"number",humanReadable:"Double value",patternHelpText:"The entered value needs to be a number or decimal.",isNumberType:!0,allowsNegative:!0},{name:"str",inputType:"text",humanReadable:"Text",isNumberType:!1},{name:"addr",inputType:"text",humanReadable:"IPv4 or IPv6 address",patternHelpText:"The entered value needs to be a valid IP address.",isNumberType:!1},{name:"uuid",inputType:"text",humanReadable:"UUID",patternHelpText:"The entered value is not a valid UUID, e.g.: 67dcac9f-2c03-4d6c-b7bd-1210b3a259a8",isNumberType:!1},{name:"bool",inputType:"checkbox",humanReadable:"Boolean value",isNumberType:!1}],n})();var Oa=i(93614),Us=i(95463);class fc{constructor(){this.value=[]}}var va=i(64724),wl=i(63622),tl=i(41582),$a=i(56310),Ha=i(94276),nl=i(30839);function Of(n,s){1&n&&(e.TgZ(0,"div",8),e.TgZ(1,"label",9),e.SDv(2,20),e.qZA(),e.TgZ(3,"div",11),e.TgZ(4,"textarea",21),e._uU(5,"            "),e.qZA(),e.qZA(),e.qZA())}function Dd(n,s){1&n&&(e.TgZ(0,"div",8),e.TgZ(1,"label",9),e.SDv(2,22),e.qZA(),e.TgZ(3,"div",11),e.TgZ(4,"textarea",23),e._uU(5,"            "),e.qZA(),e.qZA(),e.qZA())}function Jd(n,s){1&n&&(e.TgZ(0,"div",8),e.TgZ(1,"label",9),e.SDv(2,24),e.qZA(),e.TgZ(3,"div",11),e._UZ(4,"input",25),e.qZA(),e.qZA())}function Tc(n,s){1&n&&(e.TgZ(0,"div",8),e.TgZ(1,"label",9),e.SDv(2,26),e.qZA(),e.TgZ(3,"div",11),e._UZ(4,"input",27),e.qZA(),e.qZA())}function Vu(n,s){if(1&n&&(e.TgZ(0,"span",30),e.TgZ(1,"span",31),e._uU(2),e.qZA(),e.qZA()),2&n){const t=s.$implicit;e.xp6(2),e.Oqu(t)}}function Sc(n,s){if(1&n&&(e.TgZ(0,"div",8),e.TgZ(1,"label",9),e.SDv(2,28),e.qZA(),e.TgZ(3,"div",11),e.YNc(4,Vu,3,1,"span",29),e.qZA(),e.qZA()),2&n){const t=e.oxw(2);e.xp6(4),e.Q6J("ngForOf",t.configForm.getValue("services"))}}function Qd(n,s){if(1&n&&(e.TgZ(0,"div",8),e.TgZ(1,"label",32),e._uU(2),e.qZA(),e.TgZ(3,"div",11),e.TgZ(4,"select",33),e.TgZ(5,"option",34),e.SDv(6,35),e.qZA(),e.TgZ(7,"option",34),e.SDv(8,36),e.qZA(),e.TgZ(9,"option",34),e.SDv(10,37),e.qZA(),e.qZA(),e.qZA(),e.qZA()),2&n){const t=e.oxw().$implicit;e.xp6(1),e.Q6J("for",t),e.xp6(1),e.hij("",t," "),e.xp6(2),e.Q6J("formControlName",t),e.xp6(1),e.Q6J("ngValue",null),e.xp6(2),e.Q6J("ngValue",!0),e.xp6(2),e.Q6J("ngValue",!1)}}function Gc(n,s){if(1&n&&(e.TgZ(0,"span",40),e._uU(1),e.qZA()),2&n){const t=e.oxw(4);e.xp6(1),e.hij(" ",t.patternHelpText," ")}}function Ff(n,s){if(1&n&&(e.TgZ(0,"span",40),e._uU(1),e.qZA()),2&n){const t=e.oxw(4);e.xp6(1),e.hij(" ",t.patternHelpText," ")}}function zu(n,s){if(1&n&&(e.TgZ(0,"span",40),e.SDv(1,41),e.qZA()),2&n){const t=e.oxw(4);e.xp6(1),e.pQV(t.maxValue),e.QtT(1)}}function Tl(n,s){if(1&n&&(e.TgZ(0,"span",40),e.SDv(1,42),e.qZA()),2&n){const t=e.oxw(4);e.xp6(1),e.pQV(t.minValue),e.QtT(1)}}function xl(n,s){if(1&n&&(e.TgZ(0,"div",8),e.TgZ(1,"label",32),e._uU(2),e.qZA(),e.TgZ(3,"div",11),e._UZ(4,"input",38),e.YNc(5,Gc,2,1,"span",39),e.YNc(6,Ff,2,1,"span",39),e.YNc(7,zu,2,1,"span",39),e.YNc(8,Tl,2,1,"span",39),e.qZA(),e.qZA()),2&n){const t=e.oxw().$implicit;e.oxw();const o=e.MAs(2),c=e.oxw();e.xp6(1),e.Q6J("for",t),e.xp6(1),e.hij("",t," "),e.xp6(2),e.Q6J("type",c.inputType)("id",t)("placeholder",c.humanReadableType)("formControlName",t)("step",c.getStep(c.type,c.configForm.getValue(t))),e.xp6(1),e.Q6J("ngIf",c.configForm.showError(t,o,"pattern")),e.xp6(1),e.Q6J("ngIf",c.configForm.showError(t,o,"invalidUuid")),e.xp6(1),e.Q6J("ngIf",c.configForm.showError(t,o,"max")),e.xp6(1),e.Q6J("ngIf",c.configForm.showError(t,o,"min"))}}function kl(n,s){if(1&n&&(e.ynx(0),e.YNc(1,Qd,11,6,"div",13),e.YNc(2,xl,9,11,"div",13),e.BQk()),2&n){const t=e.oxw(2);e.xp6(1),e.Q6J("ngIf","bool"===t.type),e.xp6(1),e.Q6J("ngIf","bool"!==t.type)}}function Nu(n,s){if(1&n){const t=e.EpF();e.TgZ(0,"div",1),e.TgZ(1,"form",2,3),e.TgZ(3,"div",4),e.TgZ(4,"div",5),e.ynx(5,6),e._uU(6,"Edit"),e.BQk(),e._uU(7),e.qZA(),e.TgZ(8,"div",7),e.TgZ(9,"div",8),e.TgZ(10,"label",9),e.SDv(11,10),e.qZA(),e.TgZ(12,"div",11),e._UZ(13,"input",12),e.qZA(),e.qZA(),e.YNc(14,Of,6,0,"div",13),e.YNc(15,Dd,6,0,"div",13),e.YNc(16,Jd,5,0,"div",13),e.YNc(17,Tc,5,0,"div",13),e.YNc(18,Sc,5,1,"div",13),e.TgZ(19,"div",14),e.TgZ(20,"h3",15),e.SDv(21,16),e.qZA(),e.YNc(22,kl,3,2,"ng-container",17),e.qZA(),e.qZA(),e.TgZ(23,"div",18),e.TgZ(24,"cd-form-button-panel",19),e.NdJ("submitActionEvent",function(){return e.CHM(t),e.oxw().submit()}),e.qZA(),e.qZA(),e.qZA(),e.qZA(),e.qZA()}if(2&n){const t=e.oxw();e.xp6(1),e.Q6J("formGroup",t.configForm),e.xp6(6),e.hij(" ",t.configForm.getValue("name")," "),e.xp6(7),e.Q6J("ngIf",t.configForm.getValue("desc")),e.xp6(1),e.Q6J("ngIf",t.configForm.getValue("long_desc")),e.xp6(1),e.Q6J("ngIf",""!==t.configForm.getValue("default")),e.xp6(1),e.Q6J("ngIf",""!==t.configForm.getValue("daemon_default")),e.xp6(1),e.Q6J("ngIf",t.configForm.getValue("services").length>0),e.xp6(4),e.Q6J("ngForOf",t.availSections),e.xp6(2),e.Q6J("form",t.configForm)("submitText",t.actionLabels.UPDATE)}}let Qa=(()=>{class n extends Oa.E{constructor(t,o,c,g,C){super(),this.actionLabels=t,this.route=o,this.router=c,this.configService=g,this.notificationService=C,this.availSections=["global","mon","mgr","osd","mds","client"],this.createForm()}createForm(){const t={name:new vn.NI({value:null}),desc:new vn.NI({value:null}),long_desc:new vn.NI({value:null}),values:new vn.cw({}),default:new vn.NI({value:null}),daemon_default:new vn.NI({value:null}),services:new vn.NI([])};this.availSections.forEach(o=>{t.values.addControl(o,new vn.NI(null))}),this.configForm=new Us.d(t)}ngOnInit(){this.route.params.subscribe(t=>{this.configService.get(t.name).subscribe(c=>{this.setResponse(c),this.loadingReady()})})}getValidators(t){const o=ss.getTypeValidators(t);if(o)return this.patternHelpText=o.patternHelpText,"max"in o&&""!==o.max&&(this.maxValue=o.max),"min"in o&&""!==o.min&&(this.minValue=o.min),o.validators}getStep(t,o){return ss.getTypeStep(t,o)}setResponse(t){this.response=t;const o=this.getValidators(t);this.configForm.get("name").setValue(t.name),this.configForm.get("desc").setValue(t.desc),this.configForm.get("long_desc").setValue(t.long_desc),this.configForm.get("default").setValue(t.default),this.configForm.get("daemon_default").setValue(t.daemon_default),this.configForm.get("services").setValue(t.services),this.response.value&&this.response.value.forEach(g=>{let C=null;C="true"===g.value||"false"!==g.value&&g.value,this.configForm.get("values").get(g.section).setValue(C)}),this.availSections.forEach(g=>{this.configForm.get("values").get(g).setValidators(o)});const c=ss.getType(t.type);this.type=c.name,this.inputType=c.inputType,this.humanReadableType=c.humanReadable}createRequest(){const t=[];if(this.availSections.forEach(o=>{const c=this.configForm.getValue(o);null!==c&&""!==c&&t.push({section:o,value:c})}),!Ar().isEqual(this.response.value,t)){const o=new fc;return o.name=this.configForm.getValue("name"),o.value=t,o}return null}submit(){const t=this.createRequest();t&&this.configService.create(t).subscribe(()=>{this.notificationService.show(_a.k.success,"Updated config option " + t.name + ""),this.router.navigate(["/configuration"])},()=>{this.configForm.setErrors({cdSubmitButton:!0})}),this.router.navigate(["/configuration"])}}return n.\u0275fac=function(t){return new(t||n)(e.Y36(ki.p4),e.Y36(Yo.gz),e.Y36(Yo.F0),e.Y36(va.e),e.Y36(ll.g))},n.\u0275cmp=e.Xpm({type:n,selectors:[["cd-configuration-form"]],features:[e.qOj],decls:1,vars:1,consts:function(){let s,t,o,c,g,C,D,P,j,W,re,ie;return s="Name",t="Values",o="Description",c="Long description",g="Default",C="Daemon default",D="Services",P="-- Default --",j="true",W="false",re="The entered value is too high! It must not be greater than " + "\ufffd0\ufffd" + ".",ie="The entered value is too low! It must not be lower than " + "\ufffd0\ufffd" + ".",[["class","cd-col-form",4,"cdFormLoading"],[1,"cd-col-form"],["name","configForm","novalidate","",3,"formGroup"],["formDir","ngForm"],[1,"card"],[1,"card-header"],["i18",""],[1,"card-body"],[1,"form-group","row"],[1,"cd-col-form-label"],s,[1,"cd-col-form-input"],["type","text","id","name","formControlName","name","readonly","",1,"form-control"],["class","form-group row",4,"ngIf"],["formGroupName","values"],[1,"cd-header"],t,[4,"ngFor","ngForOf"],[1,"card-footer"],["wrappingClass","text-right",3,"form","submitText","submitActionEvent"],o,["id","desc","formControlName","desc","readonly","",1,"form-control","resize-vertical"],c,["id","long_desc","formControlName","long_desc","readonly","",1,"form-control","resize-vertical"],g,["type","text","id","default","formControlName","default","readonly","",1,"form-control"],C,["type","text","id","daemon_default","formControlName","daemon_default","readonly","",1,"form-control"],D,["class","form-component-badge",4,"ngFor","ngForOf"],[1,"form-component-badge"],[1,"badge","badge-dark"],[1,"cd-col-form-label",3,"for"],["id","pool","name","pool",1,"form-control",3,"formControlName"],[3,"ngValue"],P,j,W,[1,"form-control",3,"type","id","placeholder","formControlName","step"],["class","invalid-feedback",4,"ngIf"],[1,"invalid-feedback"],re,ie]},template:function(t,o){1&t&&e.YNc(0,Nu,25,10,"div",0),2&t&&e.Q6J("cdFormLoading",o.loading)},directives:[wl.y,vn._Y,vn.JL,tl.V,vn.sg,$a.P,ca.o,vn.Fj,Ha.b,vn.JJ,vn.u,_.O5,vn.x0,_.sg,nl.p,vn.EJ,vn.YN,vn.Kr],styles:[".form-component-badge[_ngcontent-%COMP%]{display:block;height:34px}.form-component-badge[_ngcontent-%COMP%]   span[_ngcontent-%COMP%]{margin-top:7px}.resize-vertical[_ngcontent-%COMP%]{resize:vertical}"]}),n})();var Wu=i(68962);function tn(n,s){if(1&n&&(e.TgZ(0,"span"),e._uU(1),e._UZ(2,"br"),e.qZA()),2&n){const t=s.$implicit,o=s.last;e.xp6(1),e.lnq(" ",t.section,": ",t.value,"",o?"":",","")}}function Mc(n,s){if(1&n&&(e.TgZ(0,"span"),e.TgZ(1,"span",23),e.TgZ(2,"span",24),e._uU(3),e.ALo(4,"uppercase"),e.qZA(),e.qZA(),e.qZA()),2&n){const t=s.$implicit,o=e.oxw(2);e.xp6(1),e.s9C("title",o.flags[t]),e.xp6(2),e.Oqu(e.lcZ(4,2,t))}}function Ou(n,s){if(1&n&&(e.TgZ(0,"span"),e.TgZ(1,"span",24),e._uU(2),e.qZA(),e.qZA()),2&n){const t=s.$implicit;e.xp6(2),e.Oqu(t)}}function Pu(n,s){if(1&n&&(e.ynx(0),e.TgZ(1,"table",1),e.TgZ(2,"tbody"),e.TgZ(3,"tr"),e.TgZ(4,"td",2),e.SDv(5,3),e.qZA(),e.TgZ(6,"td",4),e._uU(7),e.qZA(),e.qZA(),e.TgZ(8,"tr"),e.TgZ(9,"td",5),e.SDv(10,6),e.qZA(),e.TgZ(11,"td"),e._uU(12),e.qZA(),e.qZA(),e.TgZ(13,"tr"),e.TgZ(14,"td",5),e.SDv(15,7),e.qZA(),e.TgZ(16,"td"),e._uU(17),e.qZA(),e.qZA(),e.TgZ(18,"tr"),e.TgZ(19,"td",5),e.SDv(20,8),e.qZA(),e.TgZ(21,"td"),e.YNc(22,tn,3,3,"span",9),e.qZA(),e.qZA(),e.TgZ(23,"tr"),e.TgZ(24,"td",5),e.SDv(25,10),e.qZA(),e.TgZ(26,"td"),e._uU(27),e.qZA(),e.qZA(),e.TgZ(28,"tr"),e.TgZ(29,"td",5),e.SDv(30,11),e.qZA(),e.TgZ(31,"td"),e._uU(32),e.qZA(),e.qZA(),e.TgZ(33,"tr"),e.TgZ(34,"td",5),e.SDv(35,12),e.qZA(),e.TgZ(36,"td"),e._uU(37),e.qZA(),e.qZA(),e.TgZ(38,"tr"),e.TgZ(39,"td",5),e.SDv(40,13),e.qZA(),e.TgZ(41,"td"),e._uU(42),e.qZA(),e.qZA(),e.TgZ(43,"tr"),e.TgZ(44,"td",5),e.SDv(45,14),e.qZA(),e.TgZ(46,"td"),e._uU(47),e.qZA(),e.qZA(),e.TgZ(48,"tr"),e.TgZ(49,"td",5),e.SDv(50,15),e.qZA(),e.TgZ(51,"td"),e.YNc(52,Mc,5,4,"span",9),e.qZA(),e.qZA(),e.TgZ(53,"tr"),e.TgZ(54,"td",5),e.SDv(55,16),e.qZA(),e.TgZ(56,"td"),e.YNc(57,Ou,3,1,"span",9),e.qZA(),e.qZA(),e.TgZ(58,"tr"),e.TgZ(59,"td",5),e.SDv(60,17),e.qZA(),e.TgZ(61,"td"),e._uU(62),e.qZA(),e.qZA(),e.TgZ(63,"tr"),e.TgZ(64,"td",5),e.SDv(65,18),e.qZA(),e.TgZ(66,"td"),e._uU(67),e.qZA(),e.qZA(),e.TgZ(68,"tr"),e.TgZ(69,"td",5),e.SDv(70,19),e.qZA(),e.TgZ(71,"td"),e._uU(72),e.ALo(73,"booleanText"),e.qZA(),e.qZA(),e.TgZ(74,"tr"),e.TgZ(75,"td",5),e.SDv(76,20),e.qZA(),e.TgZ(77,"td"),e._uU(78),e.qZA(),e.qZA(),e.TgZ(79,"tr"),e.TgZ(80,"td",5),e.SDv(81,21),e.qZA(),e.TgZ(82,"td"),e._uU(83),e.qZA(),e.qZA(),e.TgZ(84,"tr"),e.TgZ(85,"td",5),e.SDv(86,22),e.qZA(),e.TgZ(87,"td"),e._uU(88),e.qZA(),e.qZA(),e.qZA(),e.qZA(),e.BQk()),2&n){const t=e.oxw();e.xp6(7),e.Oqu(t.selection.name),e.xp6(5),e.Oqu(t.selection.desc),e.xp6(5),e.Oqu(t.selection.long_desc),e.xp6(5),e.Q6J("ngForOf",t.selection.value),e.xp6(5),e.Oqu(t.selection.default),e.xp6(5),e.Oqu(t.selection.daemon_default),e.xp6(5),e.Oqu(t.selection.type),e.xp6(5),e.Oqu(t.selection.min),e.xp6(5),e.Oqu(t.selection.max),e.xp6(5),e.Q6J("ngForOf",t.selection.flags),e.xp6(5),e.Q6J("ngForOf",t.selection.services),e.xp6(5),e.Oqu(t.selection.source),e.xp6(5),e.Oqu(t.selection.level),e.xp6(5),e.Oqu(e.lcZ(73,17,t.selection.can_update_at_runtime)),e.xp6(6),e.Oqu(t.selection.tags),e.xp6(5),e.Oqu(t.selection.enum_values),e.xp6(5),e.Oqu(t.selection.see_also)}}let rl=(()=>{class n{constructor(){this.flags={runtime:"The value can be updated at runtime.",no_mon_update:"Daemons/clients do not pull this value from the\n      monitor config database. We disallow setting this option via 'ceph config\n      set ...'. This option should be configured via ceph.conf or via the\n      command line.",startup:"Option takes effect only during daemon startup.",cluster_create:"Option only affects cluster creation.",create:"Option only affects daemon creation."}}ngOnChanges(){this.selection&&(this.selection.services=Ar().split(this.selection.services,","))}}return n.\u0275fac=function(t){return new(t||n)},n.\u0275cmp=e.Xpm({type:n,selectors:[["cd-configuration-details"]],inputs:{selection:"selection"},features:[e.TTD],decls:1,vars:1,consts:function(){let s,t,o,c,g,C,D,P,j,W,re,ie,ge,_e,Le,Re,ke;return s="Name",t="Description",o="Long description",c="Current values",g="Default",C="Daemon default",D="Type",P="Min",j="Max",W="Flags",re="Services",ie="Source",ge="Level",_e="Can be updated at runtime (editable)",Le="Tags",Re="Enum values",ke="See also",[[4,"ngIf"],[1,"table","table-striped","table-bordered"],[1,"bold","w-25"],s,[1,"w-75"],[1,"bold"],t,o,c,[4,"ngFor","ngForOf"],g,C,D,P,j,W,re,ie,ge,_e,Le,Re,ke,[3,"title"],[1,"badge","badge-dark","mr-2"]]},template:function(t,o){1&t&&e.YNc(0,Pu,89,19,"ng-container",0),2&t&&e.Q6J("ngIf",o.selection)},directives:[_.O5,_.sg],pipes:[Wu.T,_.gd],styles:[""]}),n})();const ff=["confValTpl"],Xl=["confFlagTpl"];function yd(n,s){if(1&n&&(e.TgZ(0,"span"),e._uU(1),e._UZ(2,"br"),e.qZA()),2&n){const t=s.$implicit,o=s.last;e.xp6(1),e.lnq(" ",t.section,": ",t.value,"",o?"":",","")}}function Ac(n,s){if(1&n&&(e.TgZ(0,"span"),e.YNc(1,yd,3,3,"span",5),e.qZA()),2&n){const t=e.oxw().value;e.xp6(1),e.Q6J("ngForOf",t)}}function Vc(n,s){1&n&&e.YNc(0,Ac,2,1,"span",4),2&n&&e.Q6J("ngIf",s.value)}let pf=(()=>{class n extends Gl.o{constructor(t,o,c){super(),this.authStorageService=t,this.configurationService=o,this.actionLabels=c,this.data=[],this.icons=No.P,this.selection=new hl.r,this.filters=[{name:"Level",prop:"level",filterOptions:["basic","advanced","dev"],filterInitValue:"basic",filterPredicate:(D,P)=>{let j;var re;return(re=j||(j={}))[re.basic=0]="basic",re[re.advanced=1]="advanced",re[re.dev=2]="dev",j[D.level]<=j[P]}},{name:"Service",prop:"services",filterOptions:["mon","mgr","osd","mds","common","mds_client","rgw"],filterPredicate:(D,P)=>D.services.includes(P)},{name:"Source",prop:"source",filterOptions:["mon"],filterPredicate:(D,P)=>!!D.hasOwnProperty("source")&&D.source.includes(P)},{name:"Modified",prop:"modified",filterOptions:["yes","no"],filterPredicate:(D,P)=>!!("yes"===P&&D.hasOwnProperty("value")||"no"===P&&!D.hasOwnProperty("value"))}],this.permission=this.authStorageService.getPermissions().configOpt;const g=()=>this.selection.first()&&`${encodeURIComponent(this.selection.first().name)}`;this.tableActions=[{permission:"update",icon:No.P.edit,routerLink:()=>`/configuration/edit/${g()}`,name:this.actionLabels.EDIT,disable:()=>!this.isEditable(this.selection)}]}ngOnInit(){this.columns=[{canAutoResize:!0,prop:"name",name:"Name"},{prop:"desc",name:"Description",cellClass:"wrap"},{prop:"value",name:"Current value",cellClass:"wrap",cellTemplate:this.confValTpl},{prop:"default",name:"Default",cellClass:"wrap"},{prop:"can_update_at_runtime",name:"Editable",cellTransformation:Ja.e.checkIcon,flexGrow:.4,cellClass:"text-center"}]}updateSelection(t){this.selection=t}getConfigurationList(t){this.configurationService.getConfigData().subscribe(o=>{this.data=o},()=>{t.error()})}isEditable(t){return 1===t.selected.length&&t.selected[0].can_update_at_runtime}}return n.\u0275fac=function(t){return new(t||n)(e.Y36(_t.j),e.Y36(va.e),e.Y36(ki.p4))},n.\u0275cmp=e.Xpm({type:n,selectors:[["cd-configuration"]],viewQuery:function(t,o){if(1&t&&(e.Gf(ff,7),e.Gf(Xl,5)),2&t){let c;e.iGM(c=e.CRH())&&(o.confValTpl=c.first),e.iGM(c=e.CRH())&&(o.confFlagTpl=c.first)}},features:[e.qOj],decls:5,vars:8,consts:[["selectionType","single",3,"data","columns","extraFilterableColumns","hasDetails","fetchData","setExpandedRow","updateSelection"],[1,"table-actions",3,"permission","selection","tableActions"],["cdTableDetail","",3,"selection"],["confValTpl",""],[4,"ngIf"],[4,"ngFor","ngForOf"]],template:function(t,o){1&t&&(e.TgZ(0,"cd-table",0),e.NdJ("fetchData",function(g){return o.getConfigurationList(g)})("setExpandedRow",function(g){return o.setExpandedRow(g)})("updateSelection",function(g){return o.updateSelection(g)}),e._UZ(1,"cd-table-actions",1),e._UZ(2,"cd-configuration-details",2),e.qZA(),e.YNc(3,Vc,1,1,"ng-template",null,3,e.W1O)),2&t&&(e.Q6J("data",o.data)("columns",o.columns)("extraFilterableColumns",o.filters)("hasDetails",!0),e.xp6(1),e.Q6J("permission",o.permission)("selection",o.selection)("tableActions",o.tableActions),e.xp6(1),e.Q6J("selection",o.expandedRow))},directives:[Hs.a,Xs.K,rl,_.O5,_.sg],styles:[".filter[_ngcontent-%COMP%]{padding-right:8px}.fa-stack[_ngcontent-%COMP%]{font-size:.79rem}.fa-stack[_ngcontent-%COMP%]   .fa-stack-1x[_ngcontent-%COMP%]{margin-left:8px;margin-top:5px}  cd-configuration datatable-body-cell.wrap{word-break:break-all}"]}),n})();var Oc=i(35758),hf=i(68939),zc=i(25917),su=i(88002),bd=i(42145),kp=i(548),dp=i(95242),_f=i(34022);function Kl(n,s,t){return 0===t?[s]:(n.push(s),n)}function kf(){return function(n,s){return arguments.length>=2?function(o){return(0,_f.z)((0,bd.R)(n,s),(0,kp.h)(1),(0,dp.d)(s))(o)}:function(o){return(0,_f.z)((0,bd.R)((c,g,C)=>n(c,g,C+1)),(0,kp.h)(1))(o)}}(Kl,[])}var Uu=i(19773),Xf=i(76189),Rd=i(51295);let wc=(()=>{class n{calculateAdditionalData(t){if(!t.life_expectancy_min||!t.life_expectancy_max)return t.state="unknown",t;const o=P=>!!Number.parseFloat(P),c=(P,j)=>P&&j&&o(P)&&o(j)?oi().duration(oi()(P).diff(oi()(j))).asWeeks():null,g=oi().duration(oi()(oi().now()).diff(oi()(t.life_expectancy_stamp))).asWeeks(),C=c(t.life_expectancy_max,t.life_expectancy_stamp),D=c(t.life_expectancy_min,t.life_expectancy_stamp);return t.state=g>1?"stale":null!==C&&C<=2?"bad":null!==D&&D<=4?"warning":"good",t.life_expectancy_weeks={max:null!==C?Math.round(C):null,min:null!==D?Math.round(D):null},t}readable(t){return t.readableDaemons=t.daemons.join(" "),t}prepareDevice(t){return this.readable(this.calculateAdditionalData(t))}}return n.\u0275fac=function(t){return new(t||n)},n.\u0275prov=e.Yz7({token:n,factory:n.\u0275fac,providedIn:"root"}),n})(),ql=(()=>{class n extends Xf.S{constructor(t,o){super(),this.http=t,this.deviceService=o,this.baseURL="api/host",this.baseUIURL="ui-api/host",this.predefinedLabels=["mon","mgr","osd","mds","rgw","nfs","iscsi","rbd","grafana"]}list(t){return this.http.get(this.baseURL,{headers:{Accept:"application/vnd.ceph.api.v1.1+json"},params:{facts:t}})}create(t,o,c,g){return this.http.post(this.baseURL,{hostname:t,addr:o,labels:c,status:g},{observe:"response",headers:{Accept:Rd.T.cdVersionHeader("0","1")}})}delete(t){return this.http.delete(`${this.baseURL}/${t}`,{observe:"response"})}getDevices(t){return this.http.get(`${this.baseURL}/${t}/devices`).pipe((0,su.U)(o=>o.map(c=>this.deviceService.prepareDevice(c))))}getSmartData(t){return this.http.get(`${this.baseURL}/${t}/smart`)}getDaemons(t){return this.http.get(`${this.baseURL}/${t}/daemons`)}getLabels(){return this.http.get(`${this.baseUIURL}/labels`)}update(t,o=!1,c=[],g=!1,C=!1,D=!1){return this.http.put(`${this.baseURL}/${t}`,{update_labels:o,labels:c,maintenance:g,force:C,drain:D},{headers:{Accept:this.getVersionHeaderValue(0,1)}})}identifyDevice(t,o,c){return this.http.post(`${this.baseURL}/${t}/identify_device`,{device:o,duration:c})}getInventoryParams(t){let o=new y.LE;return t&&(o=o.append("refresh",Ar().toString(t))),o}getInventory(t,o){const c=this.getInventoryParams(o);return this.http.get(`${this.baseURL}/${t}/inventory`,{params:c})}inventoryList(t){const o=this.getInventoryParams(t);return this.http.get(`${this.baseUIURL}/inventory`,{params:o})}inventoryDeviceList(t,o){let c;return c=t?this.getInventory(t,o).pipe(kf()):this.inventoryList(o),c.pipe((0,Uu.zg)(g=>{const C=Ar().flatMap(g,D=>D.devices.map(P=>(P.hostname=D.name,P.uid=P.device_id?`${P.device_id}-${P.hostname}-${P.path}`:`${P.hostname}-${P.path}`,P)));return(0,zc.of)(C)}))}}return n.\u0275fac=function(t){return new(t||n)(e.LFG(y.eN),e.LFG(wc))},n.\u0275prov=e.Yz7({token:n,factory:n.\u0275fac,providedIn:"root"}),n})(),Ji=(()=>{class n{constructor(t,o){this.http=t,this.deviceService=o,this.path="api/osd",this.uiPath="ui-api/osd",this.osdDevices=[],this.osdRecvSpeedModalPriorities={KNOWN_PRIORITIES:[{name:null,text:"-- Select the priority --",values:{osd_max_backfills:null,osd_recovery_max_active:null,osd_recovery_max_single_start:null,osd_recovery_sleep:null}},{name:"low",text:"Low",values:{osd_max_backfills:1,osd_recovery_max_active:1,osd_recovery_max_single_start:1,osd_recovery_sleep:.5}},{name:"default",text:"Default",values:{osd_max_backfills:1,osd_recovery_max_active:3,osd_recovery_max_single_start:1,osd_recovery_sleep:0}},{name:"high",text:"High",values:{osd_max_backfills:4,osd_recovery_max_active:4,osd_recovery_max_single_start:4,osd_recovery_sleep:0}}]}}create(t,o,c="drive_groups"){return this.http.post(this.path,{method:c,data:t,tracking_id:o},{observe:"response"})}getList(){return this.http.get(`${this.path}`)}getOsdSettings(){return this.http.get(`${this.path}/settings`,{headers:{Accept:"application/vnd.ceph.api.v0.1+json"}})}getDetails(t){return this.http.get(`${this.path}/${t}`)}getSmartData(t){return this.http.get(`${this.path}/${t}/smart`)}scrub(t,o){return this.http.post(`${this.path}/${t}/scrub?deep=${o}`,null)}getDeploymentOptions(){return this.http.get(`${this.uiPath}/deployment_options`)}getFlags(){return this.http.get(`${this.path}/flags`)}updateFlags(t){return this.http.put(`${this.path}/flags`,{flags:t})}updateIndividualFlags(t,o){return this.http.put(`${this.path}/flags/individual`,{flags:t,ids:o})}markOut(t){return this.http.put(`${this.path}/${t}/mark`,{action:"out"})}markIn(t){return this.http.put(`${this.path}/${t}/mark`,{action:"in"})}markDown(t){return this.http.put(`${this.path}/${t}/mark`,{action:"down"})}reweight(t,o){return this.http.post(`${this.path}/${t}/reweight`,{weight:o})}update(t,o){return this.http.put(`${this.path}/${t}`,{device_class:o})}markLost(t){return this.http.put(`${this.path}/${t}/mark`,{action:"lost"})}purge(t){return this.http.post(`${this.path}/${t}/purge`,null)}destroy(t){return this.http.post(`${this.path}/${t}/destroy`,null)}delete(t,o,c){return this.http.delete(`${this.path}/${t}`,{observe:"response",params:{preserve_id:o?"true":"false",force:c?"true":"false"}})}safeToDestroy(t){return this.http.get(`${this.path}/safe_to_destroy?ids=${t}`)}safeToDelete(t){return this.http.get(`${this.path}/safe_to_delete?svc_ids=${t}`)}getDevices(t){return this.http.get(`${this.path}/${t}/devices`).pipe((0,su.U)(o=>o.map(c=>this.deviceService.prepareDevice(c))))}}return n.\u0275fac=function(t){return new(t||n)(e.LFG(y.eN),e.LFG(wc))},n.\u0275prov=e.Yz7({token:n,factory:n.\u0275fac,providedIn:"root"}),n})();var cl=i(76111),Ll=i(32337),Nd=i(26215);const il=[{stepIndex:1,isComplete:!1}];let Bu=(()=>{class n{constructor(){this.currentStep$=new Nd.X(null),this.steps$=new Nd.X(il),this.currentStep$.next(this.steps$.value[0])}setTotalSteps(t){const o=[];for(let c=1;c<=t;c++)o.push({stepIndex:c,isComplete:!1});this.steps$=new Nd.X(o)}setCurrentStep(t){this.currentStep$.next(t)}getCurrentStep(){return this.currentStep$.asObservable()}getSteps(){return this.steps$.asObservable()}moveToNextStep(){this.currentStep$.next(this.steps$.value[this.currentStep$.value.stepIndex])}moveToPreviousStep(){this.currentStep$.next(this.steps$.value[this.currentStep$.value.stepIndex-1-1])}isLastStep(){return this.currentStep$.value.stepIndex===this.steps$.value.length}isFirstStep(){var t;return(null===(t=this.currentStep$.value)||void 0===t?void 0:t.stepIndex)-1==0}}return n.\u0275fac=function(t){return new(t||n)},n.\u0275prov=e.Yz7({token:n,factory:n.\u0275fac,providedIn:"root"}),n})();var pc=i(28211);class Xd{constructor(){this.reset(),this.formatterService=new pc.H,this.deviceSelectionAttrs={"sys_api.vendor":{name:"vendor"},"sys_api.model":{name:"model"},device_id:{name:"device_id"},human_readable_type:{name:"rotational",formatter:s=>"hdd"===s.toLowerCase()},"sys_api.size":{name:"size",formatter:s=>this.formatterService.format_number(s,1024,["B","KB","MB","GB","TB","PB"]).replace(" ","")}}}reset(){this.spec={service_type:"osd",service_id:`dashboard-${Ar().now()}`}}setName(s){this.spec.service_id=s}setHostPattern(s){this.spec.host_pattern=s}setDeviceSelection(s,t){const o=`${s}_devices`;this.spec[o]={},t.forEach(c=>{const g=this.deviceSelectionAttrs[c.prop];g&&(this.spec[o][g.name]=g.formatter?g.formatter(c.value.raw):c.value.raw)})}clearDeviceSelection(s){delete this.spec[`${s}_devices`]}setSlots(s,t){const o=`${s}_slots`;0===t?delete this.spec[o]:this.spec[o]=t}setFeature(s,t){t?this.spec[s]=!0:delete this.spec[s]}}let wf=(()=>{class n{constructor(t){this.http=t,this.baseURL="api/cluster"}getStatus(){return this.http.get(`${this.baseURL}`,{headers:{Accept:"application/vnd.ceph.api.v0.1+json"}})}updateStatus(t){return this.http.put(`${this.baseURL}`,{status:t},{headers:{Accept:"application/vnd.ceph.api.v0.1+json"}})}}return n.\u0275fac=function(t){return new(t||n)(e.LFG(y.eN))},n.\u0275prov=e.Yz7({token:n,factory:n.\u0275fac,providedIn:"root"}),n})();const Wl=function(n){return{active:n}};function Pd(n,s){if(1&n){const t=e.EpF();e.TgZ(0,"ul",4),e.TgZ(1,"li",5),e.TgZ(2,"a",6),e.NdJ("click",function(){const g=e.CHM(t).$implicit;return e.oxw().onStepClick(g)}),e.TgZ(3,"span",7),e.SDv(4,8),e.qZA(),e.TgZ(5,"span"),e.SDv(6,9),e.qZA(),e.qZA(),e.qZA(),e.qZA()}if(2&n){const t=s.$implicit,o=s.index,c=e.oxw();e.xp6(2),e.Q6J("ngClass",e.VKq(4,Wl,c.currentStep.stepIndex===t.stepIndex)),e.xp6(1),e.Q6J("ngClass",e.VKq(6,Wl,c.currentStep.stepIndex===t.stepIndex)),e.xp6(1),e.pQV(t.stepIndex),e.QtT(4),e.xp6(2),e.pQV(c.stepsTitle[o]),e.QtT(6)}}let rc=(()=>{class n{constructor(t){this.stepsService=t}ngOnInit(){this.stepsService.setTotalSteps(this.stepsTitle.length),this.steps=this.stepsService.getSteps(),this.currentStepSub=this.stepsService.getCurrentStep().subscribe(t=>{this.currentStep=t})}onStepClick(t){this.stepsService.setCurrentStep(t)}ngOnDestroy(){this.currentStepSub.unsubscribe()}}return n.\u0275fac=function(t){return new(t||n)(e.Y36(Bu))},n.\u0275cmp=e.Xpm({type:n,selectors:[["cd-wizard"]],inputs:{stepsTitle:"stepsTitle"},decls:5,vars:3,consts:function(){let s,t;return s="" + "\ufffd0\ufffd" + "",t="" + "\ufffd0\ufffd" + "",[[1,"card-body"],[1,"row","m-7"],[1,"col"],["class","nav nav-pills flex-column",4,"ngFor","ngForOf"],[1,"nav","nav-pills","flex-column"],[1,"nav-item"],[1,"nav-link",3,"ngClass","click"],[1,"circle-step",3,"ngClass"],s,t]},template:function(t,o){1&t&&(e.TgZ(0,"div",0),e.TgZ(1,"div",1),e.TgZ(2,"nav",2),e.YNc(3,Pd,7,8,"ul",3),e.ALo(4,"async"),e.qZA(),e.qZA(),e.qZA()),2&t&&(e.xp6(3),e.Q6J("ngForOf",e.lcZ(4,1,o.steps)))},directives:[_.sg,_.mk],pipes:[_.Ov],styles:["cd-wizard{width:15%}.card-body[_ngcontent-%COMP%]{padding-left:0}span.circle-step[_ngcontent-%COMP%]{background:#adb5bd;border-radius:.8em;color:#fff;display:inline-block;font-weight:bold;line-height:1.6em;margin-right:5px;text-align:center;width:1.6em}span.circle-step.active[_ngcontent-%COMP%]{background-color:#2b99a8}.nav-pills[_ngcontent-%COMP%]   .nav-link[_ngcontent-%COMP%]{background-color:#fff;color:#343a40}.nav-pills[_ngcontent-%COMP%]   .nav-link.active[_ngcontent-%COMP%]{color:#2b99a8}"]}),n})();var hc=i(13472),gu=i(75319);let Cc=(()=>{class n{constructor(t){this.http=t,this.url="ui-api/orchestrator",this.disableMessages={noOrchestrator:"The feature is disabled because Orchestrator is not available.",missingFeature:"The Orchestrator backend doesn't support this feature."}}status(){return this.http.get(`${this.url}/status`)}hasFeature(t,o){return Ar().every(o,c=>Ar().get(t.features,`${c}.available`))}getTableActionDisableDesc(t,o){return!!t&&(t.available?!this.hasFeature(t,o)&&this.disableMessages.missingFeature:this.disableMessages.noOrchestrator)}}return n.\u0275fac=function(t){return new(t||n)(e.LFG(y.eN))},n.\u0275prov=e.Yz7({token:n,factory:n.\u0275fac,providedIn:"root"}),n})();var Fc=i(7022),fu=(()=>{return(n=fu||(fu={})).HOST_LIST="get_hosts",n.HOST_ADD="add_host",n.HOST_REMOVE="remove_host",n.HOST_LABEL_ADD="add_host_label",n.HOST_LABEL_REMOVE="remove_host_label",n.HOST_MAINTENANCE_ENTER="enter_host_maintenance",n.HOST_MAINTENANCE_EXIT="exit_host_maintenance",n.HOST_FACTS="get_facts",n.HOST_DRAIN="drain_host",n.SERVICE_LIST="describe_service",n.SERVICE_CREATE="apply",n.SERVICE_EDIT="apply",n.SERVICE_DELETE="remove_service",n.SERVICE_RELOAD="service_action",n.DAEMON_LIST="list_daemons",n.OSD_GET_REMOVE_STATUS="remove_osds_status",n.OSD_CREATE="apply_drivegroups",n.OSD_DELETE="remove_osds",n.DEVICE_LIST="get_inventory",n.DEVICE_BLINK_LIGHT="blink_device_light",fu;var n})(),Id=i(41039),Sl=i(51847),kc=i(33512),$c=i.n(kc),h=i(60312),E=i(18372),N=i(82945),k=i(60192),K=i(10545);function de(n,s){1&n&&(e.TgZ(0,"span",24),e.SDv(1,25),e.qZA())}function be(n,s){1&n&&(e.TgZ(0,"span",24),e.SDv(1,26),e.qZA())}function Ue(n,s){1&n&&(e.TgZ(0,"span",24),e.SDv(1,30),e.qZA())}function we(n,s){if(1&n&&(e.TgZ(0,"div",8),e.TgZ(1,"label",27),e.SDv(2,28),e.qZA(),e.TgZ(3,"div",15),e._UZ(4,"input",29),e.YNc(5,Ue,2,0,"span",17),e.qZA(),e.qZA()),2&n){e.oxw();const t=e.MAs(2),o=e.oxw();e.xp6(5),e.Q6J("ngIf",o.hostForm.showError("addr",t,"pattern"))}}function Xe(n,s){1&n&&(e.TgZ(0,"div",8),e.TgZ(1,"div",31),e.TgZ(2,"div",32),e._UZ(3,"input",33),e.TgZ(4,"label",34),e.SDv(5,35),e.qZA(),e.qZA(),e.qZA(),e.qZA())}function gt(n,s){if(1&n){const t=e.EpF();e.TgZ(0,"div"),e.TgZ(1,"form",5,6),e.TgZ(3,"div",7),e.TgZ(4,"div",8),e.TgZ(5,"label",9),e.ynx(6),e.SDv(7,10),e.BQk(),e.TgZ(8,"cd-helper"),e.TgZ(9,"p"),e.SDv(10,11),e.qZA(),e.TgZ(11,"ul"),e.TgZ(12,"li"),e.tHW(13,12),e._UZ(14,"samp"),e.N_p(),e.qZA(),e.TgZ(15,"li"),e.tHW(16,13),e._UZ(17,"samp"),e.N_p(),e.qZA(),e.TgZ(18,"li"),e.tHW(19,14),e._UZ(20,"samp"),e.N_p(),e.qZA(),e.qZA(),e.qZA(),e.qZA(),e.TgZ(21,"div",15),e.TgZ(22,"input",16),e.NdJ("keyup",function(){return e.CHM(t),e.oxw().checkHostNameValue()}),e.qZA(),e.YNc(23,de,2,0,"span",17),e.YNc(24,be,2,0,"span",17),e.qZA(),e.qZA(),e.YNc(25,we,6,1,"div",18),e.TgZ(26,"div",8),e.TgZ(27,"label",19),e.SDv(28,20),e.qZA(),e.TgZ(29,"div",15),e._UZ(30,"cd-select-badges",21),e.qZA(),e.qZA(),e.YNc(31,Xe,6,0,"div",18),e.qZA(),e.TgZ(32,"div",22),e.TgZ(33,"cd-form-button-panel",23),e.NdJ("submitActionEvent",function(){return e.CHM(t),e.oxw().submit()}),e.ALo(34,"titlecase"),e.ALo(35,"upperFirst"),e.qZA(),e.qZA(),e.qZA(),e.qZA()}if(2&n){const t=e.MAs(2),o=e.oxw();e.xp6(1),e.Q6J("formGroup",o.hostForm),e.xp6(22),e.Q6J("ngIf",o.hostForm.showError("hostname",t,"required")),e.xp6(1),e.Q6J("ngIf",o.hostForm.showError("hostname",t,"uniqueName")),e.xp6(1),e.Q6J("ngIf",!o.hostPattern),e.xp6(5),e.Q6J("data",o.hostForm.controls.labels.value)("options",o.labelsOption)("customBadges",!0)("messages",o.messages),e.xp6(1),e.Q6J("ngIf",!o.hideMaintenance),e.xp6(2),e.Q6J("form",o.hostForm)("submitText",e.lcZ(34,11,o.action)+" "+e.lcZ(35,13,o.resource))}}let vt=(()=>{class n extends Oa.E{constructor(t,o,c,g,C){super(),this.router=t,this.actionLabels=o,this.hostService=c,this.taskWrapper=g,this.activeModal=C,this.hostnameArray=[],this.hostPattern=!1,this.labelsOption=[],this.messages=new Fc.a({empty:"There are no labels.",filter:"Filter or add labels",add:"Add label"}),this.resource="host",this.action=this.actionLabels.ADD}ngOnInit(){this.router.url.includes("hosts")&&(this.pageURL="hosts"),this.createForm(),this.hostService.list("false").subscribe(t=>{this.hostnames=t.map(o=>o.hostname),this.loadingReady()}),this.hostService.getLabels().subscribe(t=>{const o=new Set(t.concat(this.hostService.predefinedLabels));this.labelsOption=Array.from(o).map(c=>({enabled:!0,name:c,selected:!1,description:null}))})}checkHostNameValue(){this.hostPattern=!!this.hostForm.get("hostname").value.match(/[()\[\]{},]/g)}createForm(){this.hostForm=new Us.d({hostname:new vn.NI("",{validators:[vn.kI.required,ds.h.custom("uniqueName",t=>this.hostnames&&-1!==this.hostnames.indexOf(t))]}),addr:new vn.NI("",{validators:[ds.h.ip()]}),labels:new vn.NI([]),maintenance:new vn.NI(!1)})}isCommaSeparatedPattern(t){return t.includes(",")}isRangeTypePattern(t){return t.includes("[")&&t.includes("]")&&!t.match(/(?![^(]*\)),/g)}replaceBraces(t){return t.replace(/(\d)\s*-\s*(\d)/g,"$1..$2").replace(/\(/g,"{").replace(/\)/g,"}").replace(/\[/g,"{").replace(/]/g,"}")}checkHostNamePattern(t){if(this.isRangeTypePattern(t)){const o=this.replaceBraces(t);this.hostnameArray=$c()(o)}else if(this.isCommaSeparatedPattern(t)){let o=[];o=t.split(","),o.forEach(c=>{if(this.isRangeTypePattern(c)){const g=this.replaceBraces(c);this.hostnameArray=this.hostnameArray.concat($c()(g))}else this.hostnameArray.push(c)})}else this.hostnameArray.push(t)}submit(){const t=this.hostForm.get("hostname").value;this.checkHostNamePattern(t),this.addr=this.hostForm.get("addr").value,this.status=this.hostForm.get("maintenance").value?"maintenance":"",this.allLabels=this.hostForm.get("labels").value,"hosts"!==this.pageURL&&!this.allLabels.includes("_no_schedule")&&this.allLabels.push("_no_schedule"),this.hostnameArray.forEach(o=>{this.taskWrapper.wrapTaskAroundCall({task:new cl.R("host/"+ki.MQ.ADD,{hostname:o}),call:this.hostService.create(o,this.addr,this.allLabels,this.status)}).subscribe({error:()=>{this.hostForm.setErrors({cdSubmitButton:!0})},complete:()=>{"hosts"===this.pageURL?this.router.navigate([this.pageURL,{outlets:{modal:null}}]):this.activeModal.close()}})})}}return n.\u0275fac=function(t){return new(t||n)(e.Y36(Yo.F0),e.Y36(ki.p4),e.Y36(ql),e.Y36(Ll.P),e.Y36(lt.Kz))},n.\u0275cmp=e.Xpm({type:n,selectors:[["cd-host-form"]],features:[e.qOj],decls:7,vars:9,consts:function(){let s,t,o,c,g,C,D,P,j,W,re,ie;return s="" + "\ufffd0\ufffd" + " " + "\ufffd1\ufffd" + "",t="Hostname",o="To add multiple hosts at once, you can enter:",c="a comma-separated list of hostnames " + "\ufffd#14\ufffd" + "(e.g.: example-01,example-02,example-03)" + "\ufffd/#14\ufffd" + ",",g="a range expression " + "\ufffd#17\ufffd" + "(e.g.: example-[01-03].ceph)" + "\ufffd/#17\ufffd" + ",",C="a comma separated range expression " + "\ufffd#20\ufffd" + "(e.g.: example-[01-05].lab.com,example2-[1-4].lab.com,example3-[001-006].lab.com)" + "\ufffd/#20\ufffd" + "",D="Labels",P="This field is required.",j="The chosen hostname is already in use.",W="Network address",re="The value is not a valid IP address.",ie="Maintenance Mode",[[3,"pageURL","modalRef"],[1,"modal-title"],s,[1,"modal-content"],[4,"cdFormLoading"],["name","hostForm","novalidate","",3,"formGroup"],["formDir","ngForm"],[1,"modal-body"],[1,"form-group","row"],["for","hostname",1,"cd-col-form-label","required"],t,o,c,g,C,[1,"cd-col-form-input"],["type","text","placeholder","mon-123","id","hostname","name","hostname","formControlName","hostname","autofocus","",1,"form-control",3,"keyup"],["class","invalid-feedback",4,"ngIf"],["class","form-group row",4,"ngIf"],["for","labels",1,"cd-col-form-label"],D,["id","labels",3,"data","options","customBadges","messages"],[1,"modal-footer"],["wrappingClass","text-right",3,"form","submitText","submitActionEvent"],[1,"invalid-feedback"],P,j,["for","addr",1,"cd-col-form-label"],W,["type","text","placeholder","192.168.0.1","id","addr","name","addr","formControlName","addr",1,"form-control"],re,[1,"cd-col-form-offset"],[1,"custom-control","custom-checkbox"],["id","maintenance","type","checkbox","formControlName","maintenance",1,"custom-control-input"],["for","maintenance",1,"custom-control-label"],ie]},template:function(t,o){1&t&&(e.TgZ(0,"cd-modal",0),e.TgZ(1,"span",1),e.SDv(2,2),e.ALo(3,"titlecase"),e.ALo(4,"upperFirst"),e.qZA(),e.ynx(5,3),e.YNc(6,gt,36,15,"div",4),e.BQk(),e.qZA()),2&t&&(e.Q6J("pageURL",o.pageURL)("modalRef",o.activeModal),e.xp6(4),e.pQV(e.lcZ(3,5,o.action))(e.lcZ(4,7,o.resource)),e.QtT(2),e.xp6(2),e.Q6J("cdFormLoading",o.loading))},directives:[h.z,wl.y,vn._Y,vn.JL,tl.V,vn.sg,$a.P,E.S,ca.o,vn.Fj,Ha.b,vn.JJ,vn.u,N.U,_.O5,k.m,nl.p,vn.Wl],pipes:[_.rS,K.m],styles:[""]}),n})();var Jt=i(34501);const Pn=["deviceLocation"],Rn=["lifeExpectancy"],sr=["lifeExpectancyTimestamp"];function jr(n,s){if(1&n&&e._UZ(0,"cd-table",5),2&n){const t=e.oxw();e.Q6J("data",t.devices)("columns",t.columns)}}function Ni(n,s){1&n&&(e.TgZ(0,"cd-alert-panel",6),e.SDv(1,7),e.qZA())}function Vo(n,s){if(1&n&&(e.TgZ(0,"span"),e._uU(1),e.qZA()),2&n){const t=s.$implicit;e.xp6(1),e.Oqu(t.dev)}}function $o(n,s){1&n&&e.YNc(0,Vo,2,1,"span",8),2&n&&e.Q6J("ngForOf",s.value)}function Vs(n,s){if(1&n&&(e.TgZ(0,"span"),e._uU(1),e.ALo(2,"i18nPlural"),e.qZA()),2&n){const t=e.oxw().value,o=e.oxw();e.xp6(1),e.hij("> ",e.xi3(2,1,t.min,o.translationMapping),"")}}function qs(n,s){if(1&n&&(e.TgZ(0,"span"),e._uU(1),e.ALo(2,"i18nPlural"),e.qZA()),2&n){const t=e.oxw().value,o=e.oxw();e.xp6(1),e.hij("< ",e.xi3(2,1,t.max,o.translationMapping),"")}}function dl(n,s){if(1&n&&(e.TgZ(0,"span"),e._uU(1),e.ALo(2,"i18nPlural"),e.qZA()),2&n){const t=e.oxw().value,o=e.oxw();e.xp6(1),e.AsE("",t.min," to ",e.xi3(2,2,t.max,o.translationMapping),"")}}function ga(n,s){if(1&n&&(e.YNc(0,Vs,3,4,"span",9),e.YNc(1,qs,3,4,"span",9),e.YNc(2,dl,3,5,"span",9)),2&n){const t=s.value;e.Q6J("ngIf",t.min&&!t.max),e.xp6(1),e.Q6J("ngIf",t.max&&!t.min),e.xp6(1),e.Q6J("ngIf",t.max&&t.min)}}function sa(n,s){1&n&&e._uU(0),2&n&&e.hij(" ",s.value,"\n")}let Pa=(()=>{class n{constructor(t,o,c){this.hostService=t,this.datePipe=o,this.osdService=c,this.hostname="",this.osdId=null,this.devices=null,this.columns=[],this.translationMapping={"=1":"# week",other:"# weeks"}}ngOnInit(){this.columns=[{prop:"devid",name:"Device ID",minWidth:200},{prop:"state",name:"State of Health",flexGrow:1,cellTransformation:Ja.e.badge,customTemplateConfig:{map:{good:{value:"Good",class:"badge-success"},warning:{value:"Warning",class:"badge-warning"},bad:{value:"Bad",class:"badge-danger"},stale:{value:"Stale",class:"badge-info"},unknown:{value:"Unknown",class:"badge-dark"}}}},{prop:"life_expectancy_weeks",name:"Life Expectancy",cellTemplate:this.lifeExpectancyTemplate},{prop:"life_expectancy_stamp",name:"Prediction Creation Date",cellTemplate:this.lifeExpectancyTimestampTemplate,pipe:this.datePipe,isHidden:!0},{prop:"location",name:"Device Name",cellTemplate:this.locationTemplate},{prop:"readableDaemons",name:"Daemons"}]}ngOnChanges(){const t=o=>this.devices=o;this.hostname?this.hostService.getDevices(this.hostname).subscribe(t):null!==this.osdId&&this.osdService.getDevices(this.osdId).subscribe(t)}}return n.\u0275fac=function(t){return new(t||n)(e.Y36(ql),e.Y36(_.uU),e.Y36(Ji))},n.\u0275cmp=e.Xpm({type:n,selectors:[["cd-device-list"]],viewQuery:function(t,o){if(1&t&&(e.Gf(Pn,7),e.Gf(Rn,7),e.Gf(sr,7)),2&t){let c;e.iGM(c=e.CRH())&&(o.locationTemplate=c.first),e.iGM(c=e.CRH())&&(o.lifeExpectancyTemplate=c.first),e.iGM(c=e.CRH())&&(o.lifeExpectancyTimestampTemplate=c.first)}},inputs:{hostname:"hostname",osdId:"osdId"},features:[e.TTD],decls:8,vars:2,consts:function(){let s;return s="Neither hostname nor OSD ID given",[[3,"data","columns",4,"ngIf"],["type","warning",4,"ngIf"],["deviceLocation",""],["lifeExpectancy",""],["lifeExpectancyTimestamp",""],[3,"data","columns"],["type","warning"],s,[4,"ngFor","ngForOf"],[4,"ngIf"]]},template:function(t,o){1&t&&(e.YNc(0,jr,1,2,"cd-table",0),e.YNc(1,Ni,2,0,"cd-alert-panel",1),e.YNc(2,$o,1,1,"ng-template",null,2,e.W1O),e.YNc(4,ga,3,3,"ng-template",null,3,e.W1O),e.YNc(6,sa,1,1,"ng-template",null,4,e.W1O)),2&t&&(e.Q6J("ngIf",o.hostname||null!==o.osdId),e.xp6(1),e.Q6J("ngIf",""===o.hostname&&null===o.osdId))},directives:[_.O5,Hs.a,Jt.G,_.sg],pipes:[_.Gx],styles:[""]}),n})();var ol=i(30490);function Eu(n,s){1&n&&(e.TgZ(0,"cd-alert-panel",2),e.SDv(1,3),e.qZA())}function wa(n,s){1&n&&(e.TgZ(0,"cd-alert-panel",2),e.tHW(1,4),e._UZ(2,"cd-doc",5),e.N_p(),e.qZA())}let au=(()=>{class n{}return n.\u0275fac=function(t){return new(t||n)},n.\u0275cmp=e.Xpm({type:n,selectors:[["cd-orchestrator-doc-panel"]],inputs:{missingFeatures:"missingFeatures"},decls:3,vars:2,consts:function(){let s,t;return s="The feature is not supported in the current Orchestrator.",t="Orchestrator is not available. Please consult the " + "\ufffd#2\ufffd" + "" + "\ufffd/#2\ufffd" + " on how to configure and enable the functionality.",[["type","info",4,"ngIf","ngIfElse"],["elseBlock",""],["type","info"],s,t,["section","orch"]]},template:function(t,o){if(1&t&&(e.YNc(0,Eu,2,0,"cd-alert-panel",0),e.YNc(1,wa,3,0,"ng-template",null,1,e.W1O)),2&t){const c=e.MAs(2);e.Q6J("ngIf",o.missingFeatures)("ngIfElse",c)}},directives:[_.O5,Jt.G,ol.K],styles:[""]}),n})(),mu=(()=>{class n{constructor(t,o,c,g,C,D){this.authStorageService=t,this.dimlessBinary=o,this.modalService=c,this.notificationService=g,this.orchService=C,this.hostService=D,this.devices=[],this.showAvailDeviceOnly=!1,this.hiddenColumns=[],this.filterColumns=["hostname","human_readable_type","available","sys_api.vendor","sys_api.model","sys_api.size"],this.selectionType=void 0,this.filterChange=new e.vpe,this.fetchInventory=new e.vpe,this.icons=No.P,this.columns=[],this.selection=new hl.r,this.orchStatus=void 0,this.actionOrchFeatures={identify:[fu.DEVICE_BLINK_LIGHT]}}ngOnInit(){this.permission=this.authStorageService.getPermissions().osd,this.tableActions=[{permission:"update",icon:No.P.show,click:()=>this.identifyDevice(),name:"Identify",disable:o=>this.getDisable("identify",o),canBePrimary:o=>!o.hasSingleSelection,visible:()=>Ar().isString(this.selectionType)}];const t=[{name:"Hostname",prop:"hostname",flexGrow:1},{name:"Device path",prop:"path",flexGrow:1},{name:"Type",prop:"human_readable_type",flexGrow:1,cellTransformation:Ja.e.badge,customTemplateConfig:{map:{hdd:{value:"HDD",class:"badge-hdd"},ssd:{value:"SSD",class:"badge-ssd"}}}},{name:"Available",prop:"available",flexGrow:1,cellClass:"text-center",cellTransformation:Ja.e.checkIcon},{name:"Vendor",prop:"sys_api.vendor",flexGrow:1},{name:"Model",prop:"sys_api.model",flexGrow:1},{name:"Size",prop:"sys_api.size",flexGrow:1,pipe:this.dimlessBinary},{name:"OSDs",prop:"osd_ids",flexGrow:1,cellTransformation:Ja.e.badge,customTemplateConfig:{class:"badge-dark",prefix:"osd."}}];this.columns=t.filter(o=>!this.hiddenColumns.includes(o.prop)),Ar().forEach(this.filterColumns,o=>{const c=Ar().find(this.columns,{prop:o});c&&(c.filterable=!0)}),this.fetchInventory.observers.length>0&&(this.fetchInventorySub=this.table.fetchData.subscribe(()=>{this.fetchInventory.emit()}))}getDevices(){this.showAvailDeviceOnly?this.hostService.inventoryDeviceList().subscribe(t=>{this.devices=Ar().filter(t,"available"),this.devices=[...this.devices]},()=>{this.devices=[]}):this.devices=[...this.devices]}ngOnDestroy(){this.fetchInventorySub&&this.fetchInventorySub.unsubscribe()}onColumnFiltersChanged(t){this.filterChange.emit(t)}getDisable(t,o){return!o.hasSingleSelection||this.orchService.getTableActionDisableDesc(this.orchStatus,this.actionOrchFeatures[t])}updateSelection(t){this.selection=t}identifyDevice(){const t=this.selection.first(),o=t.hostname,c=t.path||t.device_id;this.modalService.show(Vd.X,{titleText:"Identify device " + c + "",message:"Please enter the duration how long to blink the LED.",fields:[{type:"select",name:"duration",value:300,required:!0,typeConfig:{options:[{text:"1 minute",value:60},{text:"2 minutes",value:120},{text:"5 minutes",value:300},{text:"10 minutes",value:600},{text:"15 minutes",value:900}]}}],submitButtonText:"Execute",onSubmit:g=>{this.hostService.identifyDevice(o,c,g.duration).subscribe(()=>{this.notificationService.show(_a.k.success,"Identifying '" + c + "' started on host '" + o + "'")})}})}}return n.\u0275fac=function(t){return new(t||n)(e.Y36(_t.j),e.Y36(yn.$),e.Y36(Ul.Z),e.Y36(ll.g),e.Y36(Cc),e.Y36(ql))},n.\u0275cmp=e.Xpm({type:n,selectors:[["cd-inventory-devices"]],viewQuery:function(t,o){if(1&t&&e.Gf(Hs.a,7),2&t){let c;e.iGM(c=e.CRH())&&(o.table=c.first)}},inputs:{devices:"devices",showAvailDeviceOnly:"showAvailDeviceOnly",hiddenColumns:"hiddenColumns",filterColumns:"filterColumns",selectionType:"selectionType",orchStatus:"orchStatus"},outputs:{filterChange:"filterChange",fetchInventory:"fetchInventory"},decls:2,vars:8,consts:[["identifier","uid","columnMode","flex",3,"data","columns","forceIdentifier","selectionType","searchField","fetchData","updateSelection","columnFiltersChanged"],[1,"table-actions",3,"permission","selection","tableActions"]],template:function(t,o){1&t&&(e.TgZ(0,"cd-table",0),e.NdJ("fetchData",function(){return o.getDevices()})("updateSelection",function(g){return o.updateSelection(g)})("columnFiltersChanged",function(g){return o.onColumnFiltersChanged(g)}),e._UZ(1,"cd-table-actions",1),e.qZA()),2&t&&(e.Q6J("data",o.devices)("columns",o.columns)("forceIdentifier",!0)("selectionType",o.selectionType)("searchField",!1),e.xp6(1),e.Q6J("permission",o.permission)("selection",o.selection)("tableActions",o.tableActions))},directives:[Hs.a,Xs.K],styles:[".filter[_ngcontent-%COMP%]{padding-right:8px}.fa-stack[_ngcontent-%COMP%]{font-size:.79rem}.fa-stack[_ngcontent-%COMP%]   .fa-stack-1x[_ngcontent-%COMP%]{margin-left:8px;margin-top:5px}"]}),n})();function xc(n,s){1&n&&e._UZ(0,"cd-orchestrator-doc-panel")}const ic=function(){return[]},gf=function(){return["hostname"]};function Ga(n,s){if(1&n){const t=e.EpF();e.ynx(0),e.TgZ(1,"legend"),e.SDv(2,1),e.qZA(),e.TgZ(3,"div",2),e.TgZ(4,"div",3),e.TgZ(5,"cd-inventory-devices",4),e.NdJ("fetchInventory",function(){return e.CHM(t),e.oxw().refresh()}),e.qZA(),e.qZA(),e.qZA(),e.BQk()}if(2&n){const t=e.oxw();e.xp6(5),e.Q6J("devices",t.devices)("hiddenColumns",void 0===t.hostname?e.DdM(3,ic):e.DdM(4,gf))("orchStatus",t.orchStatus)}}let X=(()=>{class n{constructor(t,o,c){this.orchService=t,this.hostService=o,this.ngZone=c,this.reloadInterval=5e3,this.firstRefresh=!0,this.icons=No.P,this.showDocPanel=!1,this.devices=[]}ngOnInit(){this.orchService.status().subscribe(t=>{this.orchStatus=t,this.showDocPanel=!t.available,t.available&&this.ngZone.runOutsideAngular(()=>{this.reloadSubscriber=(0,V.H)(this.reloadInterval,this.reloadInterval).subscribe(()=>{this.ngZone.run(()=>{this.getInventory(!1)})})})})}ngOnDestroy(){var t;null===(t=this.reloadSubscriber)||void 0===t||t.unsubscribe()}ngOnChanges(){var t;(null===(t=this.orchStatus)||void 0===t?void 0:t.available)&&(this.devices=[],this.getInventory(!1))}getInventory(t){""!==this.hostname&&this.hostService.inventoryDeviceList(this.hostname,t).subscribe(o=>{this.devices=o},()=>{this.devices=[]})}refresh(){this.getInventory(!this.firstRefresh),this.firstRefresh=!1}}return n.\u0275fac=function(t){return new(t||n)(e.Y36(Cc),e.Y36(ql),e.Y36(e.R0b))},n.\u0275cmp=e.Xpm({type:n,selectors:[["cd-inventory"]],inputs:{hostname:"hostname"},features:[e.TTD],decls:2,vars:2,consts:function(){let s;return s="Physical Disks",[[4,"ngIf"],s,[1,"row"],[1,"col-md-12"],["selectionType","single",3,"devices","hiddenColumns","orchStatus","fetchInventory"]]},template:function(t,o){1&t&&(e.YNc(0,xc,1,0,"cd-orchestrator-doc-panel",0),e.YNc(1,Ga,6,5,"ng-container",0)),2&t&&(e.Q6J("ngIf",o.showDocPanel),e.xp6(1),e.Q6J("ngIf",null==o.orchStatus?null:o.orchStatus.available))},directives:[_.O5,au,mu],styles:[""]}),n})();var ye=i(15257);let nt=class{constructor(s){this.http=s,this.url="api/daemon"}action(s,t){return this.http.put(`${this.url}/${s}`,{action:t,container_image:null},{headers:{Accept:"application/vnd.ceph.api.v0.1+json"},observe:"response"})}};nt.\u0275fac=function(s){return new(s||nt)(e.LFG(y.eN))},nt.\u0275prov=e.Yz7({token:nt,factory:nt.\u0275fac,providedIn:"root"}),nt=(0,ha.gn)([_u.o,(0,ha.w6)("design:paramtypes",[y.eN])],nt);var bt=i(90068);let Qt=(()=>{class n{constructor(t){this.http=t,this.url="api/service"}list(t){const o=t?{params:(new y.LE).set("service_name",t)}:{};return this.http.get(this.url,o)}getDaemons(t){return this.http.get(`${this.url}/${t}/daemons`)}create(t){return this.http.post(this.url,{service_name:t.service_id?`${t.service_type}.${t.service_id}`:t.service_type,service_spec:t},{observe:"response"})}update(t){const o=t.service_id?`${t.service_type}.${t.service_id}`:t.service_type;return this.http.put(`${this.url}/${o}`,{service_name:o,service_spec:t},{observe:"response"})}delete(t){return this.http.delete(`${this.url}/${t}`,{observe:"response"})}getKnownTypes(){return this.http.get(`${this.url}/known_types`)}}return n.\u0275fac=function(t){return new(t||n)(e.LFG(y.eN))},n.\u0275prov=e.Yz7({token:n,factory:n.\u0275fac,providedIn:"root"}),n})();var fr=i(37496);const vi=["statusTpl"],ps=["listTpl"],xa=["cpuTpl"],ia=["daemonsTable"];function _l(n,s){1&n&&e._UZ(0,"cd-orchestrator-doc-panel")}function Jl(n,s){1&n&&e.GkF(0)}function Wc(n,s){if(1&n&&(e.TgZ(0,"div"),e.YNc(1,Jl,1,0,"ng-container",7),e.qZA()),2&n){e.oxw();const t=e.MAs(9);e.xp6(1),e.Q6J("ngTemplateOutlet",t)}}function Kf(n,s){1&n&&e.GkF(0)}function Ld(n,s){if(1&n&&e.YNc(0,Kf,1,0,"ng-container",7),2&n){e.oxw(2);const t=e.MAs(9);e.Q6J("ngTemplateOutlet",t)}}function $p(n,s){if(1&n){const t=e.EpF();e.TgZ(0,"cd-table",18,19),e.NdJ("fetchData",function(c){return e.CHM(t),e.oxw(3).getServices(c)}),e.qZA()}if(2&n){const t=e.oxw(3);e.Q6J("data",t.services)("columns",t.serviceColumns)}}function Hp(n,s){if(1&n&&e.YNc(0,$p,2,2,"cd-table",17),2&n){const t=e.oxw(2);e.Q6J("ngIf",t.hasOrchestrator)}}function mf(n,s){if(1&n&&(e.ynx(0),e.TgZ(1,"ul",8,9),e.TgZ(3,"li",10),e.TgZ(4,"a",11),e.SDv(5,12),e.qZA(),e.YNc(6,Ld,1,1,"ng-template",13),e.qZA(),e.TgZ(7,"li",14),e.TgZ(8,"a",11),e.SDv(9,15),e.qZA(),e.YNc(10,Hp,1,1,"ng-template",13),e.qZA(),e.qZA(),e._UZ(11,"div",16),e.BQk()),2&n){const t=e.MAs(2);e.xp6(11),e.Q6J("ngbNavOutlet",t)}}function $f(n,s){if(1&n&&(e.TgZ(0,"span",20),e.ALo(1,"pipeFunction"),e._uU(2),e.qZA()),2&n){const t=s.row,o=e.oxw();e.Q6J("ngClass",e.xi3(1,2,t,o.getStatusClass)),e.xp6(2),e.hij(" ",t.status_desc," ")}}const dd=function(n){return[n]};function Fd(n,s){if(1&n&&(e.TgZ(0,"span"),e._UZ(1,"i",27),e.qZA()),2&n){const t=e.oxw(4);e.xp6(1),e.Q6J("ngClass",e.VKq(1,dd,t.icons.infoCircle))}}function fp(n,s){if(1&n&&(e.TgZ(0,"span"),e._UZ(1,"i",27),e.qZA()),2&n){const t=e.oxw(4);e.xp6(1),e.Q6J("ngClass",e.VKq(1,dd,t.icons.warning))}}function fl(n,s){if(1&n&&(e.TgZ(0,"li",25),e.TgZ(1,"b"),e._uU(2),e.ALo(3,"relativeDate"),e.qZA(),e.TgZ(4,"span",26),e._uU(5),e.qZA(),e._UZ(6,"br"),e.YNc(7,Fd,2,3,"span",0),e.YNc(8,fp,2,3,"span",0),e._uU(9),e.qZA()),2&n){const t=s.$implicit;e.xp6(2),e.hij("",e.lcZ(3,5,t.created)," - "),e.xp6(3),e.Oqu(t.subject),e.xp6(2),e.Q6J("ngIf","INFO"===t.level),e.xp6(1),e.Q6J("ngIf","ERROR"===t.level),e.xp6(1),e.hij(" ",t.message," ")}}function Kh(n,s){if(1&n&&(e.TgZ(0,"ul",23),e.YNc(1,fl,10,7,"li",24),e.qZA()),2&n){const t=e.oxw().value,o=e.oxw();e.xp6(1),e.Q6J("ngForOf",t)("ngForTrackBy",o.trackByFn)}}function F_(n,s){1&n&&(e.TgZ(0,"div",25),e.TgZ(1,"span"),e._uU(2,"No data available"),e.qZA(),e.qZA())}function Hf(n,s){if(1&n&&e.YNc(0,F_,3,0,"div",28),2&n){const t=e.oxw().value;e.Q6J("ngIf",0===(null==t?null:t.length))}}function kd(n,s){if(1&n&&(e.YNc(0,Kh,2,2,"ul",21),e.YNc(1,Hf,1,1,"ng-template",null,22,e.W1O)),2&n){const t=s.value,o=e.MAs(2);e.Q6J("ngIf",null==t?null:t.length)("ngIfElse",o)}}function Uf(n,s){if(1&n){const t=e.EpF();e.TgZ(0,"cd-table",30,31),e.NdJ("fetchData",function(c){return e.CHM(t),e.oxw(2).getDaemons(c)})("updateSelection",function(c){return e.CHM(t),e.oxw(2).updateSelection(c)}),e._UZ(2,"cd-table-actions",32),e.qZA()}if(2&n){const t=e.oxw(2);e.Q6J("data",t.daemons)("columns",t.columns),e.xp6(2),e.Q6J("selection",t.selection)("permission",t.permissions.hosts)("tableActions",t.tableActions)}}function Kp(n,s){if(1&n&&e.YNc(0,Uf,3,5,"cd-table",29),2&n){const t=e.oxw();e.Q6J("ngIf",t.hasOrchestrator)}}function Ed(n,s){if(1&n&&e._UZ(0,"cd-usage-bar",33),2&n){const t=s.row,o=e.oxw();e.Q6J("total",o.total)("calculatePerc",!1)("used",t.cpu_percentage)("isBinary",!1)("warningThreshold",o.warningThreshold)("errorThreshold",o.errorThreshold)}}let Ah=(()=>{class n{constructor(t,o,c,g,C,D,P,j,W){this.hostService=t,this.cephServiceService=o,this.orchService=c,this.relativeDatePipe=g,this.dimlessBinary=C,this.actionLabels=D,this.authStorageService=P,this.daemonService=j,this.notificationService=W,this.hiddenColumns=[],this.total=100,this.warningThreshold=.8,this.errorThreshold=.9,this.icons=No.P,this.daemons=[],this.services=[],this.columns=[],this.serviceColumns=[],this.selection=new hl.r,this.hasOrchestrator=!1,this.showDocPanel=!1}ngOnInit(){this.permissions=this.authStorageService.getPermissions(),this.tableActions=[{permission:"update",icon:No.P.start,click:()=>this.daemonAction("start"),name:this.actionLabels.START,disable:()=>this.actionDisabled("start")},{permission:"update",icon:No.P.stop,click:()=>this.daemonAction("stop"),name:this.actionLabels.STOP,disable:()=>this.actionDisabled("stop")},{permission:"update",icon:No.P.restart,click:()=>this.daemonAction("restart"),name:this.actionLabels.RESTART,disable:()=>this.actionDisabled("restart")},{permission:"update",icon:No.P.deploy,click:()=>this.daemonAction("redeploy"),name:this.actionLabels.REDEPLOY,disable:()=>this.actionDisabled("redeploy")}],this.columns=[{name:"Hostname",prop:"hostname",flexGrow:2,filterable:!0},{name:"Daemon name",prop:"daemon_name",flexGrow:1,filterable:!0},{name:"Version",prop:"version",flexGrow:1,filterable:!0},{name:"Status",prop:"status_desc",flexGrow:1,filterable:!0,cellTemplate:this.statusTpl},{name:"Last Refreshed",prop:"last_refresh",pipe:this.relativeDatePipe,flexGrow:1},{name:"CPU Usage",prop:"cpu_percentage",flexGrow:1,cellTemplate:this.cpuTpl},{name:"Memory Usage",prop:"memory_usage",flexGrow:1,pipe:this.dimlessBinary,cellClass:"text-right"},{name:"Daemon Events",prop:"events",flexGrow:2,cellTemplate:this.listTpl}],this.serviceColumns=[{name:"Service Name",prop:"service_name",flexGrow:2,filterable:!0},{name:"Service Type",prop:"service_type",flexGrow:1,filterable:!0},{name:"Service Events",prop:"events",flexGrow:5,cellTemplate:this.listTpl}],this.orchService.status().subscribe(t=>{this.hasOrchestrator=t.available,this.showDocPanel=!t.available}),this.columns=this.columns.filter(t=>!this.hiddenColumns.includes(t.prop))}ngOnChanges(){Ar().isUndefined(this.daemonsTable)||this.daemonsTable.reloadData()}ngAfterViewInit(){this.daemonsTableTplsSub=this.daemonsTableTpls.changes.subscribe(t=>{this.daemonsTable=t.first})}ngOnDestroy(){this.daemonsTableTplsSub&&this.daemonsTableTplsSub.unsubscribe(),this.serviceSub&&this.serviceSub.unsubscribe()}getStatusClass(t){return Ar().get({"-1":"badge-danger",0:"badge-warning",1:"badge-success"},t.status,"badge-dark")}getDaemons(t){let o;if(this.hostname)o=this.hostService.getDaemons(this.hostname);else{if(!this.serviceName)return void(this.daemons=[]);o=this.cephServiceService.getDaemons(this.serviceName)}o.subscribe(c=>{this.daemons=c,this.sortDaemonEvents()},()=>{this.daemons=[],t.error()})}sortDaemonEvents(){this.daemons.forEach(t=>{var o;null===(o=t.events)||void 0===o||o.sort((c,g)=>new Date(g.created).getTime()-new Date(c.created).getTime())})}getServices(t){this.serviceSub=this.cephServiceService.list(this.serviceName).subscribe(o=>{this.services=o},()=>{this.services=[],t.error()})}trackByFn(t,o){return o.created}updateSelection(t){this.selection=t}daemonAction(t){var o;this.daemonService.action(null===(o=this.selection.first())||void 0===o?void 0:o.daemon_name,t).pipe((0,ye.q)(1)).subscribe({next:c=>{this.notificationService.show(_a.k.success,`Daemon ${t} scheduled`,c.body.toString())},error:c=>{this.notificationService.show(_a.k.error,"Daemon action failed",c.body.toString())}})}actionDisabled(t){var o;if(null===(o=this.selection)||void 0===o?void 0:o.hasSelection){const c=this.selection.selected[0];if("mon"===c.daemon_type||"mgr"===c.daemon_type)return!0;switch(t){case"start":if("running"===c.status_desc)return!0;break;case"stop":if("stopped"===c.status_desc)return!0}return!1}return!0}}return n.\u0275fac=function(t){return new(t||n)(e.Y36(ql),e.Y36(Qt),e.Y36(Cc),e.Y36(bt.h),e.Y36(yn.$),e.Y36(ki.p4),e.Y36(_t.j),e.Y36(nt),e.Y36(ll.g))},n.\u0275cmp=e.Xpm({type:n,selectors:[["cd-service-daemon-list"]],viewQuery:function(t,o){if(1&t&&(e.Gf(vi,7),e.Gf(ps,7),e.Gf(xa,7),e.Gf(ia,5)),2&t){let c;e.iGM(c=e.CRH())&&(o.statusTpl=c.first),e.iGM(c=e.CRH())&&(o.listTpl=c.first),e.iGM(c=e.CRH())&&(o.cpuTpl=c.first),e.iGM(c=e.CRH())&&(o.daemonsTableTpls=c)}},inputs:{serviceName:"serviceName",hostname:"hostname",hiddenColumns:"hiddenColumns",flag:"flag"},features:[e.TTD],decls:12,vars:3,consts:function(){let s,t;return s="Details",t="Service Events",[[4,"ngIf"],[4,"ngIf","ngIfElse"],["serviceDetailsTpl",""],["statusTpl",""],["listTpl",""],["serviceDaemonDetailsTpl",""],["cpuTpl",""],[4,"ngTemplateOutlet"],["ngbNav","","cdStatefulTab","service-details",1,"nav-tabs"],["nav","ngbNav"],["ngbNavItem","details"],["ngbNavLink",""],s,["ngbNavContent",""],["ngbNavItem","service_events"],t,[3,"ngbNavOutlet"],["columnMode","flex",3,"data","columns","fetchData",4,"ngIf"],["columnMode","flex",3,"data","columns","fetchData"],["serviceTable",""],[1,"badge",3,"ngClass"],["class","list-group list-group-flush",4,"ngIf","ngIfElse"],["noEventsAvailable",""],[1,"list-group","list-group-flush"],["class","list-group-item",4,"ngFor","ngForOf","ngForTrackBy"],[1,"list-group-item"],[1,"badge","badge-info"],["aria-hidden","true",3,"ngClass"],["class","list-group-item",4,"ngIf"],["selectionType","single","columnMode","flex","identifier","daemon_name",3,"data","columns","fetchData","updateSelection",4,"ngIf"],["selectionType","single","columnMode","flex","identifier","daemon_name",3,"data","columns","fetchData","updateSelection"],["daemonsTable",""],["id","service-daemon-list-actions",1,"table-actions",3,"selection","permission","tableActions"],[3,"total","calculatePerc","used","isBinary","warningThreshold","errorThreshold"]]},template:function(t,o){if(1&t&&(e.YNc(0,_l,1,0,"cd-orchestrator-doc-panel",0),e.YNc(1,Wc,2,1,"div",1),e.YNc(2,mf,12,1,"ng-template",null,2,e.W1O),e.YNc(4,$f,3,5,"ng-template",null,3,e.W1O),e.YNc(6,kd,3,2,"ng-template",null,4,e.W1O),e.YNc(8,Kp,1,1,"ng-template",null,5,e.W1O),e.YNc(10,Ed,1,6,"ng-template",null,6,e.W1O)),2&t){const c=e.MAs(3);e.Q6J("ngIf",o.showDocPanel),e.xp6(1),e.Q6J("ngIf","hostDetails"===o.flag)("ngIfElse",c)}},directives:[_.O5,au,_.tP,lt.Pz,un.m,lt.nv,lt.Vx,lt.uN,lt.tO,Hs.a,_.mk,_.sg,Xs.K,co.O],pipes:[fr.i,bt.h],styles:[".fa-info-circle[_ngcontent-%COMP%]{color:#2b99a8}.fa-exclamation-triangle[_ngcontent-%COMP%]{color:#ef5c55}.list-group-item[_ngcontent-%COMP%]{background-color:transparent;border-width:0}"]}),n})();var qp=i(8958);const eh=["innerNav"];function Oh(n,s){1&n&&(e.TgZ(0,"cd-alert-panel",5),e.SDv(1,6),e.qZA())}function th(n,s){1&n&&(e.TgZ(0,"cd-alert-panel",7),e.SDv(1,8),e.qZA())}function Td(n,s){1&n&&(e.TgZ(0,"cd-alert-panel",10),e.SDv(1,11),e.qZA())}function xf(n,s){if(1&n&&(e.ynx(0),e.TgZ(1,"cd-alert-panel",20),e._uU(2),e.qZA(),e.BQk()),2&n){const t=e.oxw(2).$implicit;e.xp6(2),e.Oqu(t.value.userMessage)}}function wh(n,s){1&n&&(e.TgZ(0,"cd-alert-panel",23),e.SDv(1,24),e.qZA())}function Up(n,s){1&n&&(e.ynx(0),e.TgZ(1,"cd-alert-panel",26),e.SDv(2,27),e.qZA(),e.BQk())}function nh(n,s){1&n&&(e.TgZ(0,"cd-alert-panel",28),e.SDv(1,29),e.qZA())}function xh(n,s){if(1&n&&(e.YNc(0,Up,3,0,"ng-container",0),e.YNc(1,nh,2,0,"ng-template",null,25,e.W1O)),2&n){const t=e.MAs(2),o=e.oxw(3).$implicit;e.Q6J("ngIf",o.value.info.smart_status.passed)("ngIfElse",t)}}function vf(n,s){if(1&n&&(e.YNc(0,wh,2,0,"cd-alert-panel",21),e.ALo(1,"pipeFunction"),e.YNc(2,xh,3,2,"ng-template",null,22,e.W1O)),2&n){const t=e.MAs(3),o=e.oxw(2).$implicit,c=e.oxw(4);e.Q6J("ngIf",e.xi3(1,2,null==o.value.info?null:o.value.info.smart_status,c.isEmpty))("ngIfElse",t)}}function Dh(n,s){if(1&n&&e._UZ(0,"cd-table-key-value",36),2&n){const t=e.oxw(4).$implicit;e.Q6J("renderObjects",!0)("data",t.value.info)}}function $d(n,s){1&n&&(e.TgZ(0,"cd-alert-panel",37),e.SDv(1,38),e.qZA())}function pp(n,s){if(1&n&&(e.YNc(0,Dh,1,2,"cd-table-key-value",34),e.ALo(1,"pipeFunction"),e.YNc(2,$d,2,0,"cd-alert-panel",35),e.ALo(3,"pipeFunction")),2&n){const t=e.oxw(3).$implicit,o=e.oxw(4);e.Q6J("ngIf",!e.xi3(1,2,t.value.info,o.isEmpty)),e.xp6(2),e.Q6J("ngIf",e.xi3(3,5,t.value.info,o.isEmpty))}}function Bf(n,s){if(1&n&&e._UZ(0,"cd-table",42),2&n){const t=e.oxw(4).$implicit,o=e.oxw(4);e.Q6J("data",t.value.smart.attributes.table)("columns",o.smartDataColumns)}}function Kd(n,s){if(1&n&&e._UZ(0,"cd-table-key-value",43),2&n){const t=e.oxw(4).$implicit;e.Q6J("renderObjects",!0)("data",t.value.smart)}}function oc(n,s){if(1&n&&e._UZ(0,"cd-table-key-value",43),2&n){const t=e.oxw(4).$implicit;e.Q6J("renderObjects",!0)("data",t.value.smart.nvmeData)}}function rh(n,s){1&n&&(e.TgZ(0,"cd-alert-panel",44),e.SDv(1,45),e.qZA())}function k_(n,s){if(1&n&&(e.YNc(0,Bf,1,2,"cd-table",39),e.YNc(1,Kd,1,2,"cd-table-key-value",40),e.YNc(2,oc,1,2,"cd-table-key-value",40),e.YNc(3,rh,2,0,"cd-alert-panel",41)),2&n){const t=e.oxw(3).$implicit;e.Q6J("ngIf",null==t.value.smart?null:t.value.smart.attributes),e.xp6(1),e.Q6J("ngIf",null==t.value.smart?null:t.value.smart.scsi_error_counter_log),e.xp6(1),e.Q6J("ngIf",null==t.value.smart?null:t.value.smart.nvmeData),e.xp6(1),e.Q6J("ngIf",!(null!=t.value.smart&&t.value.smart.attributes||null!=t.value.smart&&t.value.smart.nvmeData||null!=t.value.smart&&t.value.smart.scsi_error_counter_log))}}function qh(n,s){if(1&n&&(e.ynx(0),e.TgZ(1,"ul",12,30),e.TgZ(3,"li",31),e.TgZ(4,"a",17),e.SDv(5,32),e.qZA(),e.YNc(6,pp,4,8,"ng-template",18),e.qZA(),e.TgZ(7,"li",31),e.TgZ(8,"a",17),e.SDv(9,33),e.qZA(),e.YNc(10,k_,4,4,"ng-template",18),e.qZA(),e.qZA(),e._UZ(11,"div",15),e.BQk()),2&n){const t=e.MAs(2);e.xp6(3),e.Q6J("ngbNavItem",1),e.xp6(4),e.Q6J("ngbNavItem",2),e.xp6(4),e.Q6J("ngbNavOutlet",t)}}function Y(n,s){if(1&n&&(e.YNc(0,xf,3,1,"ng-container",0),e.YNc(1,vf,4,5,"ng-template",null,19,e.W1O),e.YNc(3,qh,12,3,"ng-container",4),e.ALo(4,"pipeFunction"),e.ALo(5,"pipeFunction")),2&n){const t=e.MAs(2),o=e.oxw().$implicit,c=e.oxw(4);e.Q6J("ngIf",o.value.error)("ngIfElse",t),e.xp6(3),e.Q6J("ngIf",!e.xi3(4,3,o.value.info,c.isEmpty)||!e.xi3(5,6,o.value.smart,c.isEmpty))}}function fe(n,s){if(1&n&&(e.TgZ(0,"li",16),e.TgZ(1,"a",17),e._uU(2),e.qZA(),e.YNc(3,Y,6,9,"ng-template",18),e.qZA()),2&n){const t=s.$implicit;e.xp6(2),e.AsE("",t.value.device," (",t.value.identifier,")")}}function w(n,s){if(1&n&&(e.ynx(0),e.TgZ(1,"ul",12,13),e.YNc(3,fe,4,2,"li",14),e.ALo(4,"keyvalue"),e.qZA(),e._UZ(5,"div",15),e.BQk()),2&n){const t=e.MAs(2),o=e.oxw(3);e.xp6(3),e.Q6J("ngForOf",e.lcZ(4,2,o.data)),e.xp6(2),e.Q6J("ngbNavOutlet",t)}}function q(n,s){if(1&n&&(e.ynx(0),e.YNc(1,Td,2,0,"cd-alert-panel",9),e.ALo(2,"pipeFunction"),e.YNc(3,w,6,4,"ng-container",4),e.ALo(4,"pipeFunction"),e.BQk()),2&n){const t=e.oxw(2);e.xp6(1),e.Q6J("ngIf",e.xi3(2,2,t.data,t.isEmpty)),e.xp6(2),e.Q6J("ngIf",!e.xi3(4,5,t.data,t.isEmpty))}}function Fe(n,s){if(1&n&&(e.ynx(0),e.YNc(1,Oh,2,0,"cd-alert-panel",2),e.YNc(2,th,2,0,"cd-alert-panel",3),e.YNc(3,q,5,8,"ng-container",4),e.BQk()),2&n){const t=e.oxw();e.xp6(1),e.Q6J("ngIf",t.error),e.xp6(1),e.Q6J("ngIf",t.incompatible),e.xp6(1),e.Q6J("ngIf",!t.error&&!t.incompatible)}}function ut(n,s){1&n&&(e.TgZ(0,"cd-loading-panel"),e.SDv(1,46),e.qZA())}let Xn=(()=>{class n{constructor(t,o){this.osdService=t,this.hostService=o,this.osdId=null,this.hostname=null,this.loading=!1,this.incompatible=!1,this.error=!1,this.data={},this.isEmpty=Ar().isEmpty}isSmartError(t){return void 0!==Ar().get(t,"error")}isNvmeSmartData(t){return"nvme"===Ar().get(t,"device.protocol","").toLowerCase()}isAtaSmartData(t){return"ata"===Ar().get(t,"device.protocol","").toLowerCase()}isIscsiSmartData(t){return"scsi"===Ar().get(t,"device.protocol","").toLowerCase()}fetchData(t){const o={};Ar().each(t,(c,g)=>{if(this.isSmartError(c)){let C="";C=-22===c.smartctl_error_code?"Smartctl has received an unknown argument (error code " + c.smartctl_error_code + "). You may be using an incompatible version of smartmontools. Version >= 7.0 of smartmontools is required to successfully retrieve data.":"An error with error code " + c.smartctl_error_code + " occurred.",o[g]={error:c.error,smartctl_error_code:c.smartctl_error_code,smartctl_output:c.smartctl_output,userMessage:C,device:c.dev,identifier:c.nvme_vendor}}else 1!==c.json_format_version[0]?this.incompatible=!0:this.isAtaSmartData(c)?o[g]=this.extractAtaData(c):this.isIscsiSmartData(c)?o[g]=this.extractIscsiData(c):this.isNvmeSmartData(c)&&(o[g]=this.extractNvmeData(c))}),this.data=o,this.loading=!1}extractNvmeData(t){return{info:Ar().omitBy(t,(c,g)=>["nvme_smart_health_information_log"].includes(g)),smart:{nvmeData:t.nvme_smart_health_information_log},device:t.device.name,identifier:t.serial_number}}extractIscsiData(t){const o=Ar().omitBy(t,(c,g)=>["scsi_error_counter_log","scsi_grown_defect_list"].includes(g));return{info:o,smart:{scsi_error_counter_log:t.scsi_error_counter_log,scsi_grown_defect_list:t.scsi_grown_defect_list},device:o.device.name,identifier:o.serial_number}}extractAtaData(t){const o=Ar().omitBy(t,(c,g)=>["ata_smart_attributes","ata_smart_selective_self_test_log","ata_smart_data"].includes(g));return{info:o,smart:{attributes:t.ata_smart_attributes,data:t.ata_smart_data},device:o.device.name,identifier:o.serial_number}}updateData(){this.loading=!0,null!==this.osdId?this.osdService.getSmartData(this.osdId).subscribe({next:this.fetchData.bind(this),error:t=>{t.preventDefault(),this.error=t,this.loading=!1}}):null!==this.hostname&&this.hostService.getSmartData(this.hostname).subscribe({next:this.fetchData.bind(this),error:t=>{t.preventDefault(),this.error=t,this.loading=!1}})}ngOnInit(){this.smartDataColumns=[{prop:"id",name:"ID"},{prop:"name",name:"Name"},{prop:"raw.value",name:"Raw"},{prop:"thresh",name:"Threshold"},{prop:"value",name:"Value"},{prop:"when_failed",name:"When Failed"},{prop:"worst",name:"Worst"}],this.scsiSmartDataColumns=[{prop:"correction_algorithm_invocations",name:"Correction Algorithm Invocations"},{prop:"errors_corrected_by_eccdelayed",name:"Errors Corrected by ECC (Delayed)"},{prop:"errors_corrected_by_eccfast",name:"Errors Corrected by ECC (Fast)"},{prop:"errors_corrected_by_rereads_rewrites",name:"Errors Corrected by Rereads/Rewrites"},{prop:"gigabytes_processed",name:"Gigabyes Processed"},{prop:"total_errors_corrected",name:"Total Errors Corrected"},{prop:"total_uncorrected_errors",name:"Total Errors Uncorrected"}]}ngOnChanges(t){this.data={},t.osdId?this.osdId=t.osdId.currentValue:t.hostname&&(this.hostname=t.hostname.currentValue),this.updateData()}}return n.\u0275fac=function(t){return new(t||n)(e.Y36(Ji),e.Y36(ql))},n.\u0275cmp=e.Xpm({type:n,selectors:[["cd-smart-list"]],viewQuery:function(t,o){if(1&t&&e.Gf(eh,5),2&t){let c;e.iGM(c=e.CRH())&&(o.nav=c.first)}},inputs:{osdId:"osdId",hostname:"hostname"},features:[e.TTD],decls:3,vars:2,consts:function(){let s,t,o,c,g,C,D,P,j,W,re,ie,ge,_e;return s="Failed to retrieve SMART data.",t="The data received has the JSON format version 2.x and is currently incompatible with the dashboard.",o="No SMART data available.",c="SMART overall-health self-assessment test result",g="unknown",C="SMART overall-health self-assessment test result",D="passed",P="SMART overall-health self-assessment test result",j="failed",W="Device Information",re="SMART",ie="No device information available for this device.",ge="No SMART data available for this device.",_e="SMART data is loading.",[[4,"ngIf","ngIfElse"],["isLoading",""],["type","error",4,"ngIf"],["type","warning",4,"ngIf"],[4,"ngIf"],["type","error"],s,["type","warning"],t,["type","info",4,"ngIf"],["type","info"],o,["ngbNav","",1,"nav-tabs"],["nav","ngbNav"],["ngbNavItem","",4,"ngFor","ngForOf"],[3,"ngbNavOutlet"],["ngbNavItem",""],["ngbNavLink",""],["ngbNavContent",""],["noError",""],["id","alert-error","type","warning"],["id","alert-self-test-unknown","size","slim","type","warning","title",c,4,"ngIf","ngIfElse"],["hasSmartStatus",""],["id","alert-self-test-unknown","size","slim","type","warning","title",c],g,["selfTestFailed",""],["id","alert-self-test-passed","size","slim","type","info","title",C],D,["id","alert-self-test-failed","size","slim","type","warning","title",P],j,["innerNav","ngbNav"],[3,"ngbNavItem"],W,re,[3,"renderObjects","data",4,"ngIf"],["id","alert-device-info-unavailable","type","info",4,"ngIf"],[3,"renderObjects","data"],["id","alert-device-info-unavailable","type","info"],ie,["updateSelectionOnRefresh","never",3,"data","columns",4,"ngIf"],["updateSelectionOnRefresh","never",3,"renderObjects","data",4,"ngIf"],["id","alert-device-smart-data-unavailable","type","info",4,"ngIf"],["updateSelectionOnRefresh","never",3,"data","columns"],["updateSelectionOnRefresh","never",3,"renderObjects","data"],["id","alert-device-smart-data-unavailable","type","info"],ge,_e]},template:function(t,o){if(1&t&&(e.YNc(0,Fe,4,3,"ng-container",0),e.YNc(1,ut,2,0,"ng-template",null,1,e.W1O)),2&t){const c=e.MAs(2);e.Q6J("ngIf",!o.loading)("ngIfElse",c)}},directives:[_.O5,Jt.G,lt.Pz,_.sg,lt.tO,lt.nv,lt.Vx,lt.uN,Vr.b,Hs.a,qp.b],pipes:[fr.i,_.Nd],styles:[""]}),n})();function Fr(n,s){if(1&n&&e._UZ(0,"cd-device-list",14),2&n){const t=e.oxw(2);e.Q6J("hostname",t.selection.hostname)}}function gi(n,s){if(1&n&&e._UZ(0,"cd-inventory",14),2&n){const t=e.oxw(3);e.Q6J("hostname",t.selectedHostname)}}function Wi(n,s){1&n&&(e.TgZ(0,"li",15),e.TgZ(1,"a",5),e.SDv(2,16),e.qZA(),e.YNc(3,gi,1,1,"ng-template",7),e.qZA())}const Po=function(){return["hostname"]};function Ns(n,s){if(1&n&&e._UZ(0,"cd-service-daemon-list",19),2&n){const t=e.oxw(3);e.Q6J("hostname",t.selectedHostname)("hiddenColumns",e.DdM(2,Po))}}function ts(n,s){1&n&&(e.TgZ(0,"li",17),e.TgZ(1,"a",5),e.SDv(2,18),e.qZA(),e.YNc(3,Ns,1,3,"ng-template",7),e.qZA())}function Is(n,s){if(1&n&&e._UZ(0,"cd-grafana",22),2&n){const t=e.oxw(3);e.Q6J("grafanaPath","host-details?var-ceph_hosts="+t.selectedHostname)("type","metrics")}}function ya(n,s){1&n&&(e.TgZ(0,"li",20),e.TgZ(1,"a",5),e.SDv(2,21),e.qZA(),e.YNc(3,Is,1,2,"ng-template",7),e.qZA())}function zs(n,s){if(1&n&&e._UZ(0,"cd-smart-list",14),2&n){const t=e.oxw(3);e.Q6J("hostname",t.selectedHostname)}}function _c(n,s){if(1&n&&e.YNc(0,zs,1,1,"cd-smart-list",23),2&n){const t=e.oxw(2),o=e.MAs(2);e.Q6J("ngIf",t.selectedHostname)("ngIfElse",o)}}function rd(n,s){if(1&n&&(e.ynx(0),e.TgZ(1,"ul",2,3),e.TgZ(3,"li",4),e.TgZ(4,"a",5),e.SDv(5,6),e.qZA(),e.YNc(6,Fr,1,1,"ng-template",7),e.qZA(),e.YNc(7,Wi,4,0,"li",8),e.YNc(8,ts,4,0,"li",9),e.YNc(9,ya,4,0,"li",10),e.TgZ(10,"li",11),e.TgZ(11,"a",5),e.SDv(12,12),e.qZA(),e.YNc(13,_c,1,2,"ng-template",7),e.qZA(),e.qZA(),e._UZ(14,"div",13),e.BQk()),2&n){const t=e.MAs(2),o=e.oxw();e.xp6(7),e.Q6J("ngIf",o.permissions.hosts.read),e.xp6(1),e.Q6J("ngIf",o.permissions.hosts.read),e.xp6(1),e.Q6J("ngIf",o.permissions.grafana.read),e.xp6(5),e.Q6J("ngbNavOutlet",t)}}function wu(n,s){1&n&&(e.TgZ(0,"cd-alert-panel",24),e.SDv(1,25),e.qZA())}let Hd=(()=>{class n{get selectedHostname(){return void 0!==this.selection?this.selection.hostname:null}}return n.\u0275fac=function(t){return new(t||n)},n.\u0275cmp=e.Xpm({type:n,selectors:[["cd-host-details"]],inputs:{permissions:"permissions",selection:"selection"},decls:3,vars:1,consts:function(){let s,t,o,c,g,C;return s="Devices",t="Device health",o="Physical Disks",c="Daemons",g="Performance Details",C="No hostname found.",[[4,"ngIf"],["noHostname",""],["ngbNav","","cdStatefulTab","host-details",1,"nav-tabs"],["nav","ngbNav"],["ngbNavItem","devices"],["ngbNavLink",""],s,["ngbNavContent",""],["ngbNavItem","inventory",4,"ngIf"],["ngbNavItem","daemons",4,"ngIf"],["ngbNavItem","performance-details",4,"ngIf"],["ngbNavItem","device-health"],t,[3,"ngbNavOutlet"],[3,"hostname"],["ngbNavItem","inventory"],o,["ngbNavItem","daemons"],c,["flag","hostDetails",3,"hostname","hiddenColumns"],["ngbNavItem","performance-details"],g,["uid","rtOg0AiWz","grafanaStyle","four",3,"grafanaPath","type"],[3,"hostname",4,"ngIf","ngIfElse"],["type","error"],C]},template:function(t,o){1&t&&(e.YNc(0,rd,15,4,"ng-container",0),e.YNc(1,wu,2,0,"ng-template",null,1,e.W1O)),2&t&&e.Q6J("ngIf",o.selection)},directives:[_.O5,lt.Pz,un.m,lt.nv,lt.Vx,lt.uN,lt.tO,Pa,X,Ah,it.F,Xn,Jt.G],styles:[""]}),n})();const $_=["servicesTpl"],ih=["maintenanceConfirmTpl"],oh=["orchTmpl"],hp=["flashTmpl"];function Yf(n,s){if(1&n){const t=e.EpF();e.TgZ(0,"cd-table",13,14),e.NdJ("fetchData",function(c){return e.CHM(t),e.oxw().getHosts(c)})("setExpandedRow",function(c){return e.CHM(t),e.oxw().setExpandedRow(c)})("updateSelection",function(c){return e.CHM(t),e.oxw().updateSelection(c)}),e.TgZ(2,"div",15),e._UZ(3,"cd-table-actions",16),e.qZA(),e._UZ(4,"cd-host-details",17),e.qZA()}if(2&n){const t=e.oxw();e.Q6J("data",t.hosts)("columns",t.columns)("hasDetails",t.hasTableDetails)("toolHeader",!t.hideToolHeader),e.xp6(3),e.Q6J("permission",t.permissions.hosts)("selection",t.selection)("tableActions",t.tableActions),e.xp6(1),e.Q6J("permissions",t.permissions)("selection",t.expandedRow)}}function H_(n,s){1&n&&e._UZ(0,"cd-grafana",19),2&n&&e.Q6J("grafanaPath","host-overview?")("type","metrics")}function _g(n,s){1&n&&(e.TgZ(0,"li",2),e.TgZ(1,"a",3),e.SDv(2,18),e.qZA(),e.YNc(3,H_,1,2,"ng-template",5),e.qZA())}function _p(n,s){1&n&&(e.ynx(0),e._uU(1,"\xa0"),e.BQk())}function Sd(n,s){if(1&n&&(e.TgZ(0,"span"),e.TgZ(1,"span",21),e._uU(2),e.qZA(),e.YNc(3,_p,2,0,"ng-container",22),e.qZA()),2&n){const t=s.$implicit,o=s.last;e.xp6(2),e.Oqu(t),e.xp6(1),e.Q6J("ngIf",!o)}}function U_(n,s){1&n&&e.YNc(0,Sd,4,2,"span",20),2&n&&e.Q6J("ngForOf",s.value)}function e_(n,s){if(1&n&&(e.TgZ(0,"ul"),e.TgZ(1,"li"),e.SDv(2,23),e.qZA(),e.qZA()),2&n){const t=e.oxw().$implicit;e.xp6(2),e.pQV(t),e.QtT(2)}}function B_(n,s){if(1&n&&(e.TgZ(0,"div"),e.YNc(1,e_,3,1,"ul",22),e.qZA()),2&n){const t=s.last,o=e.oxw(2);e.xp6(1),e.Q6J("ngIf",!t||"1"==o.errorMessage.length)}}function Jc(n,s){1&n&&(e.ynx(0),e.SDv(1,24),e.BQk())}function Rh(n,s){if(1&n&&(e.YNc(0,B_,2,1,"div",20),e.YNc(1,Jc,2,0,"ng-container",22)),2&n){const t=e.oxw();e.Q6J("ngForOf",t.errorMessage),e.xp6(1),e.Q6J("ngIf",t.showSubmit)}}function t_(n,s){1&n&&(e.TgZ(0,"span",25),e.SDv(1,26),e.qZA())}function qf(n,s){1&n&&(e.TgZ(0,"span",27),e.SDv(1,28),e.qZA())}let sh=(()=>{class n extends Gl.o{constructor(t,o,c,g,C,D,P,j,W,re){super(),this.authStorageService=t,this.dimlessBinary=o,this.emptyPipe=c,this.hostService=g,this.actionLabels=C,this.modalService=D,this.taskWrapper=P,this.router=j,this.notificationService=W,this.orchService=re,this.sub=new gu.w,this.hiddenColumns=[],this.hideMaintenance=!1,this.hasTableDetails=!0,this.hideToolHeader=!1,this.showGeneralActionsOnly=!1,this.columns=[],this.hosts=[],this.isLoadingHosts=!1,this.cdParams={fromLink:"/hosts"},this.selection=new hl.r,this.isExecuting=!1,this.icons=No.P,this.messages={nonOrchHost:"The feature is disabled because the selected host is not managed by Orchestrator."},this.actionOrchFeatures={add:[fu.HOST_ADD],edit:[fu.HOST_LABEL_ADD,fu.HOST_LABEL_REMOVE],remove:[fu.HOST_REMOVE],maintenance:[fu.HOST_MAINTENANCE_ENTER,fu.HOST_MAINTENANCE_EXIT],drain:[fu.HOST_DRAIN]},this.permissions=this.authStorageService.getPermissions(),this.tableActions=[{name:this.actionLabels.ADD,permission:"create",icon:No.P.add,click:()=>this.router.url.includes("/hosts")?this.router.navigate(["hosts",{outlets:{modal:[ki.MQ.ADD]}}]):this.bsModalRef=this.modalService.show(vt,{hideMaintenance:this.hideMaintenance}),disable:ie=>this.getDisable("add",ie)},{name:this.actionLabels.EDIT,permission:"update",icon:No.P.edit,click:()=>this.editAction(),disable:ie=>this.getDisable("edit",ie)},{name:this.actionLabels.START_DRAIN,permission:"update",icon:No.P.exit,click:()=>this.hostDrain(),disable:ie=>this.getDisable("drain",ie)||!this.enableDrainBtn,visible:()=>!this.showGeneralActionsOnly&&this.enableDrainBtn},{name:this.actionLabels.STOP_DRAIN,permission:"update",icon:No.P.exit,click:()=>this.hostDrain(!0),disable:ie=>this.getDisable("drain",ie)||this.enableDrainBtn,visible:()=>!this.showGeneralActionsOnly&&!this.enableDrainBtn},{name:this.actionLabels.REMOVE,permission:"delete",icon:No.P.destroy,click:()=>this.deleteAction(),disable:ie=>this.getDisable("remove",ie)},{name:this.actionLabels.ENTER_MAINTENANCE,permission:"update",icon:No.P.enter,click:()=>this.hostMaintenance(),disable:ie=>this.getDisable("maintenance",ie)||this.isExecuting||this.enableMaintenanceBtn,visible:()=>!this.showGeneralActionsOnly&&!this.enableMaintenanceBtn},{name:this.actionLabels.EXIT_MAINTENANCE,permission:"update",icon:No.P.exit,click:()=>this.hostMaintenance(),disable:ie=>this.getDisable("maintenance",ie)||this.isExecuting||!this.enableMaintenanceBtn,visible:()=>!this.showGeneralActionsOnly&&this.enableMaintenanceBtn}]}ngOnInit(){this.columns=[{name:"Hostname",prop:"hostname",flexGrow:1},{name:"Service Instances",prop:"service_instances",flexGrow:1,cellTemplate:this.servicesTpl},{name:"Labels",prop:"labels",flexGrow:1,cellTransformation:Ja.e.badge,customTemplateConfig:{class:"badge-dark"}},{name:"Status",prop:"status",flexGrow:1,cellTransformation:Ja.e.badge,customTemplateConfig:{map:{maintenance:{class:"badge-warning"}}}},{name:"Model",prop:"model",flexGrow:1},{name:"CPUs",prop:"cpu_count",flexGrow:.3},{name:"Cores",prop:"cpu_cores",flexGrow:.3},{name:"Total Memory",prop:"memory_total_bytes",pipe:this.dimlessBinary,flexGrow:.4},{name:"Raw Capacity",prop:"raw_capacity",pipe:this.dimlessBinary,flexGrow:.5},{name:"HDDs",prop:"hdd_count",flexGrow:.3},{name:"Flash",prop:"flash_count",headerTemplate:this.flashTmpl,flexGrow:.3},{name:"NICs",prop:"nic_count",flexGrow:.3}],this.columns=this.columns.filter(t=>!this.hiddenColumns.includes(t.prop))}ngOnDestroy(){this.sub.unsubscribe()}updateSelection(t){this.selection=t,this.enableMaintenanceBtn=!1,this.enableDrainBtn=!1,this.selection.hasSelection&&("maintenance"===this.selection.first().status&&(this.enableMaintenanceBtn=!0),this.selection.first().labels.includes("_no_schedule")||(this.enableDrainBtn=!0))}editAction(){this.hostService.getLabels().subscribe(t=>{const o=this.selection.first(),c=new Set(t.concat(this.hostService.predefinedLabels)),g=Array.from(c).map(C=>({enabled:!0,name:C}));this.modalService.show(Vd.X,{titleText:"Edit Host: " + o.hostname + "",fields:[{type:"select-badges",name:"labels",value:o.labels,label:"Labels",typeConfig:{customBadges:!0,options:g,messages:new Fc.a({empty:"There are no labels.",filter:"Filter or add labels",add:"Add label"})}}],submitButtonText:"Edit Host",onSubmit:C=>{this.hostService.update(o.hostname,!0,C.labels).subscribe(()=>{this.notificationService.show(_a.k.success,"Updated Host \"" + o.hostname + "\""),this.table.refreshBtn()})}})})}hostMaintenance(){this.isExecuting=!0;const t=this.selection.first();"maintenance"!==t.status?this.hostService.update(t.hostname,!1,[],!0).subscribe(()=>{this.isExecuting=!1,this.notificationService.show(_a.k.success,"\"" + t.hostname + "\" moved to maintenance"),this.table.refreshBtn()},o=>{if(this.isExecuting=!1,this.errorMessage=o.error.detail.split(/\n/),o.preventDefault(),!o.error.detail.includes("WARNING")||o.error.detail.includes("It is NOT safe to stop")||o.error.detail.includes("ALERT")||o.error.detail.includes("unsafe to stop"))this.notificationService.show(_a.k.error,"\"" + t.hostname + "\" cannot be put into maintenance","" + o.error.detail + "");else{const c={titleText:"Warning",buttonText:"Continue",warning:!0,bodyTpl:this.maintenanceConfirmTpl,showSubmit:!0,onSubmit:()=>{this.hostService.update(t.hostname,!1,[],!0,!0).subscribe(()=>{this.modalRef.close()},()=>this.modalRef.close())}};this.modalRef=this.modalService.show(nd.Y,c)}}):this.hostService.update(t.hostname,!1,[],!0).subscribe(()=>{this.isExecuting=!1,this.notificationService.show(_a.k.success,"\"" + t.hostname + "\" has exited maintenance"),this.table.refreshBtn()})}hostDrain(t=!1){const o=this.selection.first();if(t){const c=o.labels.indexOf("_no_schedule",0);o.labels.splice(c,1),this.hostService.update(o.hostname,!0,o.labels).subscribe(()=>{this.notificationService.show(_a.k.info,"\"" + o.hostname + "\" stopped draining"),this.table.refreshBtn()})}else this.hostService.update(o.hostname,!1,[],!1,!1,!0).subscribe(()=>{this.notificationService.show(_a.k.info,"\"" + o.hostname + "\" started draining"),this.table.refreshBtn()})}getDisable(t,o){if("remove"===t||"edit"===t||"maintenance"===t||"drain"===t){if(!(null==o?void 0:o.hasSingleSelection))return!0;if(!Ar().every(o.selected,"sources.orchestrator"))return this.messages.nonOrchHost}return this.orchService.getTableActionDisableDesc(this.orchStatus,this.actionOrchFeatures[t])}deleteAction(){const t=this.selection.first().hostname;this.modalRef=this.modalService.show(zl.M,{itemDescription:"Host",itemNames:[t],actionDescription:"remove",submitActionObservable:()=>this.taskWrapper.wrapTaskAroundCall({task:new cl.R("host/remove",{hostname:t}),call:this.hostService.delete(t)})})}checkHostsFactsAvailable(){const t=this.orchStatus.features;return!Ar().isEmpty(t)&&!!t.get_facts.available}transformHostsData(){if(this.checkHostsFactsAvailable())Ar().forEach(this.hosts,t=>{t.memory_total_bytes=this.emptyPipe.transform(1024*t.memory_total_kb),t.raw_capacity=this.emptyPipe.transform(t.hdd_capacity_bytes+t.flash_capacity_bytes)});else for(let t=4;t<this.columns.length;t++)this.columns[t].cellTemplate=this.orchTmpl}getHosts(t){this.isLoadingHosts||(this.isLoadingHosts=!0,this.sub=this.orchService.status().pipe((0,Uu.zg)(o=>{this.orchStatus=o;const c=this.checkHostsFactsAvailable();return this.hostService.list(`${c}`)}),(0,su.U)(o=>o.map(c=>{var g;const C={};if(c.service_instances=new Set,null===(g=this.orchStatus)||void 0===g?void 0:g.available){let P,D=[];P=this.hostService.getDaemons(c.hostname),P.subscribe(j=>{D=j,D.forEach(W=>{C[W.daemon_type]=(C[W.daemon_type]||0)+1}),D.map(W=>{c.service_instances.add(`${W.daemon_type}: ${C[W.daemon_type]}`)})})}else c.services.forEach(D=>{C[D.type]=(C[D.type]||0)+1}),c.services.map(D=>{c.service_instances.add(`${D.type}: ${C[D.type]}`)});return c}))).subscribe(o=>{this.hosts=o,this.transformHostsData(),this.isLoadingHosts=!1},()=>{this.isLoadingHosts=!1,t.error()}))}}return n.\u0275fac=function(t){return new(t||n)(e.Y36(_t.j),e.Y36(yn.$),e.Y36(Id.W),e.Y36(ql),e.Y36(ki.p4),e.Y36(Ul.Z),e.Y36(Ll.P),e.Y36(Yo.F0),e.Y36(ll.g),e.Y36(Cc))},n.\u0275cmp=e.Xpm({type:n,selectors:[["cd-hosts"]],viewQuery:function(t,o){if(1&t&&(e.Gf(Hs.a,5),e.Gf($_,7),e.Gf(ih,7),e.Gf(oh,7),e.Gf(hp,7)),2&t){let c;e.iGM(c=e.CRH())&&(o.table=c.first),e.iGM(c=e.CRH())&&(o.servicesTpl=c.first),e.iGM(c=e.CRH())&&(o.maintenanceConfirmTpl=c.first),e.iGM(c=e.CRH())&&(o.orchTmpl=c.first),e.iGM(c=e.CRH())&&(o.flashTmpl=c.first)}},inputs:{hiddenColumns:"hiddenColumns",hideMaintenance:"hideMaintenance",hasTableDetails:"hasTableDetails",hideToolHeader:"hideToolHeader",showGeneralActionsOnly:"showGeneralActionsOnly"},features:[e._Bn([{provide:Sl.F,useValue:new Sl.F("hosts")}]),e.qOj],decls:17,vars:2,consts:function(){let s,t,o,c,g,C,D,P;return s="Hosts List",t="Overall Performance",o="" + "\ufffd0\ufffd" + "",c="Are you sure you want to continue?",g="Data will be available only if Orchestrator is available.",C="N/A",D="SSD, NVMEs",P="Flash",[["ngbNav","",1,"nav-tabs"],["nav","ngbNav"],["ngbNavItem",""],["ngbNavLink",""],s,["ngbNavContent",""],["ngbNavItem","",4,"ngIf"],[3,"ngbNavOutlet"],["servicesTpl",""],["maintenanceConfirmTpl",""],["orchTmpl",""],["flashTmpl",""],["name","modal"],["columnMode","flex","selectionType","single",3,"data","columns","hasDetails","toolHeader","fetchData","setExpandedRow","updateSelection"],["table",""],[1,"table-actions","btn-toolbar"],["id","host-actions",1,"btn-group",3,"permission","selection","tableActions"],["cdTableDetail","",3,"permissions","selection"],t,["uid","y0KGL0iZz","grafanaStyle","two",3,"grafanaPath","type"],[4,"ngFor","ngForOf"],[1,"badge","badge-background-primary"],[4,"ngIf"],o,c,["ngbTooltip",g],C,["ngbTooltip",D],P]},template:function(t,o){if(1&t&&(e.TgZ(0,"ul",0,1),e.TgZ(2,"li",2),e.TgZ(3,"a",3),e.SDv(4,4),e.qZA(),e.YNc(5,Yf,5,9,"ng-template",5),e.qZA(),e.YNc(6,_g,4,0,"li",6),e.qZA(),e._UZ(7,"div",7),e.YNc(8,U_,1,1,"ng-template",null,8,e.W1O),e.YNc(10,Rh,2,2,"ng-template",null,9,e.W1O),e.YNc(12,t_,2,0,"ng-template",null,10,e.W1O),e.YNc(14,qf,2,0,"ng-template",null,11,e.W1O),e._UZ(16,"router-outlet",12)),2&t){const c=e.MAs(1);e.xp6(6),e.Q6J("ngIf",o.permissions.grafana.read),e.xp6(1),e.Q6J("ngbNavOutlet",c)}},directives:[lt.Pz,lt.nv,lt.Vx,lt.uN,_.O5,lt.tO,Yo.lC,Hs.a,Xs.K,Hd,it.F,_.sg,lt._L],styles:[""]}),n})();var r_=(()=>{return(n=r_||(r_={})).COST_CAPACITY="cost_capacity",n.THROUGHPUT="throughput_optimized",n.IOPS="iops_optimized",r_;var n})(),id=i(62862);let Ig=(()=>{class n{constructor(t,o,c,g,C){this.activeModal=t,this.actionLabels=o,this.formBuilder=c,this.osdService=g,this.taskWrapper=C,this.driveGroups=[],this.submitAction=new e.vpe,this.action=o.CREATE,this.createForm()}createForm(){this.formGroup=this.formBuilder.group({})}onSubmit(){const t=Ar().join(Ar().map(this.driveGroups,"service_id"),", ");this.taskWrapper.wrapTaskAroundCall({task:new cl.R("osd/"+ki.MQ.CREATE,{tracking_id:t}),call:this.osdService.create(this.driveGroups,t)}).subscribe({error:()=>{this.formGroup.setErrors({cdSubmitButton:!0})},complete:()=>{this.submitAction.emit(),this.activeModal.close()}})}}return n.\u0275fac=function(t){return new(t||n)(e.Y36(lt.Kz),e.Y36(ki.p4),e.Y36(id.O),e.Y36(Ji),e.Y36(Ll.P))},n.\u0275cmp=e.Xpm({type:n,selectors:[["cd-osd-creation-preview-modal"]],inputs:{driveGroups:"driveGroups"},outputs:{submitAction:"submitAction"},decls:15,vars:9,consts:function(){let s,t;return s="OSD creation preview",t="DriveGroups",[[3,"modalRef"],[1,"modal-title"],s,[1,"modal-content"],["novalidate","",3,"formGroup"],["frm","ngForm"],[1,"modal-body"],t,[1,"modal-footer"],[3,"form","submitText","submitActionEvent"]]},template:function(t,o){1&t&&(e.TgZ(0,"cd-modal",0),e.ynx(1,1),e.SDv(2,2),e.BQk(),e.ynx(3,3),e.TgZ(4,"form",4,5),e.TgZ(6,"div",6),e.TgZ(7,"h4"),e.SDv(8,7),e.qZA(),e.TgZ(9,"pre"),e._uU(10),e.ALo(11,"json"),e.qZA(),e.qZA(),e.TgZ(12,"div",8),e.TgZ(13,"cd-form-button-panel",9),e.NdJ("submitActionEvent",function(){return o.onSubmit()}),e.ALo(14,"titlecase"),e.qZA(),e.qZA(),e.qZA(),e.BQk(),e.qZA()),2&t&&(e.Q6J("modalRef",o.activeModal),e.xp6(4),e.Q6J("formGroup",o.formGroup),e.xp6(6),e.Oqu(e.lcZ(11,5,o.driveGroups)),e.xp6(3),e.Q6J("form",o.formGroup)("submitText",e.lcZ(14,7,o.action)))},directives:[h.z,vn._Y,vn.JL,tl.V,vn.sg,nl.p],pipes:[_.Ts,_.rS],styles:[""]}),n})();const Lg=["inventoryDevices"];function gp(n,s){if(1&n&&(e.TgZ(0,"span",16),e._uU(1),e.qZA()),2&n){const t=s.$implicit;e.xp6(1),e.hij(" ",t," ")}}function i_(n,s){if(1&n&&(e.TgZ(0,"cd-alert-panel",13),e.ynx(1),e.SDv(2,14),e.BQk(),e.YNc(3,gp,2,1,"span",15),e.qZA()),2&n){const t=e.oxw();e.Q6J("showTitle",!1),e.xp6(3),e.Q6J("ngForOf",t.requiredFilters)}}function o_(n,s){if(1&n&&(e.TgZ(0,"div"),e.TgZ(1,"p",17),e.TgZ(2,"span"),e.SDv(3,18),e.ALo(4,"dimlessBinary"),e.qZA(),e.qZA(),e.qZA()),2&n){const t=e.oxw();e.xp6(4),e.pQV(t.filteredDevices.length)(e.lcZ(4,2,t.capacity)),e.QtT(3)}}const Ta=function(){return["available","osd_ids"]};let Hc=(()=>{class n{constructor(t,o,c,g){this.formBuilder=t,this.activeModal=o,this.actionLabels=c,this.wizardStepService=g,this.submitAction=new e.vpe,this.icons=No.P,this.filterColumns=[],this.devices=[],this.filteredDevices=[],this.capacity=0,this.canSubmit=!1,this.requiredFilters=[],this.action=c.ADD,this.createForm()}ngAfterViewInit(){const t=Ar().filter(this.inventoryDevices.columns,o=>this.filterColumns.includes(o.prop)&&"hostname"!==o.prop);setTimeout(()=>{this.requiredFilters=Ar().map(t,"name")},0)}createForm(){this.formGroup=this.formBuilder.group({})}onFilterChange(t){if(this.capacity=0,this.canSubmit=!1,Ar().isEmpty(t.filters))this.filteredDevices=[],this.event=void 0;else{const o=t.filters.filter(c=>"hostname"!==c.prop);this.canSubmit=!Ar().isEmpty(o),this.filteredDevices=t.data,this.capacity=Ar().sumBy(this.filteredDevices,"sys_api.size"),this.event=t}}onSubmit(){this.submitAction.emit(this.event),this.activeModal.close()}}return n.\u0275fac=function(t){return new(t||n)(e.Y36(id.O),e.Y36(lt.Kz),e.Y36(ki.p4),e.Y36(Bu))},n.\u0275cmp=e.Xpm({type:n,selectors:[["cd-osd-devices-selection-modal"]],viewQuery:function(t,o){if(1&t&&e.Gf(Lg,5),2&t){let c;e.iGM(c=e.CRH())&&(o.inventoryDevices=c.first)}},outputs:{submitAction:"submitAction"},decls:14,vars:15,consts:function(){let s,t,o;return s="" + "\ufffd0\ufffd" + " devices",t="At least one of these filters must be applied in order to proceed:",o="Number of devices: " + "\ufffd0\ufffd" + ". Raw capacity: " + "\ufffd1\ufffd" + ".",[[3,"modalRef"],[1,"modal-title"],s,[1,"modal-content"],["novalidate","",3,"formGroup"],["frm","ngForm"],[1,"modal-body"],["type","warning","size","slim",3,"showTitle",4,"ngIf"],[3,"devices","filterColumns","showAvailDeviceOnly","hiddenColumns","filterChange"],["inventoryDevices",""],[4,"ngIf"],[1,"modal-footer"],[3,"form","disabled","submitText","submitActionEvent"],["type","warning","size","slim",3,"showTitle"],t,["class","badge badge-dark ml-2",4,"ngFor","ngForOf"],[1,"badge","badge-dark","ml-2"],[1,"text-center"],o]},template:function(t,o){1&t&&(e.TgZ(0,"cd-modal",0),e.ynx(1,1),e.SDv(2,2),e.BQk(),e.ynx(3,3),e.TgZ(4,"form",4,5),e.TgZ(6,"div",6),e.YNc(7,i_,4,2,"cd-alert-panel",7),e.TgZ(8,"cd-inventory-devices",8,9),e.NdJ("filterChange",function(g){return o.onFilterChange(g)}),e.qZA(),e.YNc(10,o_,5,4,"div",10),e.qZA(),e.TgZ(11,"div",11),e.TgZ(12,"cd-form-button-panel",12),e.NdJ("submitActionEvent",function(){return o.onSubmit()}),e.ALo(13,"titlecase"),e.qZA(),e.qZA(),e.qZA(),e.BQk(),e.qZA()),2&t&&(e.Q6J("modalRef",o.activeModal),e.xp6(2),e.pQV(o.deviceType),e.QtT(2),e.xp6(2),e.Q6J("formGroup",o.formGroup),e.xp6(3),e.Q6J("ngIf",!o.canSubmit),e.xp6(1),e.Q6J("devices",o.devices)("filterColumns",o.filterColumns)("showAvailDeviceOnly",!0)("hiddenColumns",e.DdM(14,Ta)),e.xp6(2),e.Q6J("ngIf",o.canSubmit),e.xp6(2),e.Q6J("form",o.formGroup)("disabled",!o.canSubmit||0===o.filteredDevices.length)("submitText",e.lcZ(13,12,o.action)))},directives:[h.z,vn._Y,vn.JL,tl.V,vn.sg,_.O5,mu,nl.p,Jt.G,_.sg],pipes:[_.rS,yn.$],styles:[""]}),n})();function Ju(n,s){1&n&&(e.TgZ(0,"span"),e.SDv(1,7),e.qZA())}function Ps(n,s){1&n&&(e.TgZ(0,"span"),e.SDv(1,8),e.qZA())}function mp(n,s){1&n&&(e.TgZ(0,"span"),e.SDv(1,9),e.qZA())}const ah=function(n){return[n]};function Yu(n,s){if(1&n){const t=e.EpF();e.ynx(0),e.TgZ(1,"button",10),e.NdJ("click",function(){return e.CHM(t),e.oxw().showSelectionModal()}),e._UZ(2,"i",11),e.ynx(3),e.SDv(4,12),e.BQk(),e.qZA(),e.BQk()}if(2&n){const t=e.oxw();e.xp6(1),e.Q6J("title",t.addButtonTooltip)("disabled",0===t.availDevices.length||!t.canSelect||t.expansionCanSelect),e.xp6(1),e.Q6J("ngClass",e.VKq(3,ah,t.icons.add))}}function Y_(n,s){if(1&n&&(e.TgZ(0,"span"),e.TgZ(1,"span",19),e._uU(2),e.qZA(),e.qZA()),2&n){const t=s.$implicit;e.xp6(2),e.AsE("",t.name,": ",t.value.formatted,"")}}function Bp(n,s){if(1&n&&(e.TgZ(0,"div",20),e.TgZ(1,"span"),e.SDv(2,21),e.ALo(3,"dimlessBinary"),e.qZA(),e.qZA()),2&n){const t=e.oxw(2);e.xp6(3),e.pQV(e.lcZ(3,1,t.capacity)),e.QtT(2)}}const Zf=function(){return["available","osd_ids"]},Dc=function(){return[]};function gg(n,s){if(1&n){const t=e.EpF();e.TgZ(0,"div",13),e.YNc(1,Y_,3,2,"span",14),e.TgZ(2,"a",15),e.NdJ("click",function(){return e.CHM(t),e.oxw().clearDevices(),!1}),e._UZ(3,"i",11),e.ynx(4),e.SDv(5,16),e.BQk(),e.qZA(),e.qZA(),e.TgZ(6,"div"),e._UZ(7,"cd-inventory-devices",17),e.qZA(),e.YNc(8,Bp,4,3,"div",18)}if(2&n){const t=e.oxw();e.xp6(1),e.Q6J("ngForOf",t.appliedFilters),e.xp6(2),e.Q6J("ngClass",e.VKq(6,ah,t.icons.clearFilters)),e.xp6(4),e.Q6J("devices",t.devices)("hiddenColumns",e.DdM(8,Zf))("filterColumns",e.DdM(9,Dc)),e.xp6(1),e.Q6J("ngIf","data"===t.type)}}let Z_=(()=>{class n{constructor(t,o,c){this.modalService=t,this.osdService=o,this.router=c,this.selected=new e.vpe,this.cleared=new e.vpe,this.icons=No.P,this.devices=[],this.capacity=0,this.appliedFilters=new Array,this.expansionCanSelect=!1,this.tooltips={noAvailDevices:"No available devices",addPrimaryFirst:"Please add primary devices first",addByFilters:"Add devices by using filters"},this.isOsdPage=this.router.url.includes("/osd")}ngOnInit(){var t,o,c;this.isOsdPage||(this.devices=(null===(t=this.osdService)||void 0===t?void 0:t.osdDevices[this.type])?this.osdService.osdDevices[this.type]:[],this.capacity=Ar().sumBy(this.devices,"sys_api.size"),this.expansionCanSelect=!!(null===(o=this.osdService)||void 0===o?void 0:o.osdDevices)&&(null===(c=this.osdService)||void 0===c?void 0:c.osdDevices.disableSelect)),this.updateAddButtonTooltip()}ngOnChanges(){this.updateAddButtonTooltip()}showSelectionModal(){let t=["human_readable_type","sys_api.vendor","sys_api.model","sys_api.size"];"data"===this.type&&(t=["hostname",...t]),this.modalService.show(Hc,{hostname:this.hostname,deviceType:this.name,devices:this.availDevices,filterColumns:t},{size:"xl"}).componentInstance.submitAction.subscribe(g=>{this.devices=g.data,this.capacity=Ar().sumBy(this.devices,"sys_api.size"),this.appliedFilters=g.filters;const C=Ar().assign({type:this.type},g);this.isOsdPage||(this.osdService.osdDevices[this.type]=this.devices,this.osdService.osdDevices.disableSelect=this.canSelect||this.devices.length===this.availDevices.length,this.osdService.osdDevices[this.type].capacity=this.capacity),this.selected.emit(C)})}updateAddButtonTooltip(){this.addButtonTooltip="data"===this.type&&0===this.availDevices.length?this.tooltips.noAvailDevices:this.canSelect?0===this.availDevices.length?this.tooltips.noAvailDevices:this.tooltips.addByFilters:this.tooltips.addPrimaryFirst}clearDevices(){this.isOsdPage||(this.expansionCanSelect=!1,this.osdService.osdDevices.disableSelect=!1,this.osdService.osdDevices=[]);const t={type:this.type,clearedDevices:[...this.devices]};this.devices=[],this.cleared.emit(t)}}return n.\u0275fac=function(t){return new(t||n)(e.Y36(Ul.Z),e.Y36(Ji),e.Y36(Yo.F0))},n.\u0275cmp=e.Xpm({type:n,selectors:[["cd-osd-devices-selection-groups"]],inputs:{type:"type",name:"name",hostname:"hostname",availDevices:"availDevices",canSelect:"canSelect"},outputs:{selected:"selected",cleared:"cleared"},features:[e.TTD],decls:12,vars:6,consts:function(){let s,t,o,c,g,C,D;return s="" + "\ufffd0\ufffd" + " devices",t="The primary storage devices. These devices contain all OSD data.",o="Write-Ahead-Log devices. These devices are used for BlueStore\u2019s internal journal. It is only useful to use a WAL device if the device is faster than the primary device (e.g. NVME devices or SSDs). If there is only a small amount of fast storage available (e.g., less than a gigabyte), we recommend using it as a WAL device.",c="DB devices can be used for storing BlueStore\u2019s internal metadata. It is only helpful to provision a DB device if it is faster than the primary device (e.g. NVME devices or SSD).",g="Add",C="Clear",D="Raw capacity: " + "\ufffd0\ufffd" + "",[[1,"form-group","row"],["for","createDeleteButton",1,"cd-col-form-label"],s,[4,"ngIf"],[1,"cd-col-form-input"],[4,"ngIf","ngIfElse"],["blockClearDevices",""],t,o,c,["type","button","data-toggle","tooltip",1,"btn","btn-light",3,"title","disabled","click"],[3,"ngClass"],g,[1,"pb-2","my-2","border-bottom"],[4,"ngFor","ngForOf"],["href","",1,"tc_clearSelections",3,"click"],C,[3,"devices","hiddenColumns","filterColumns"],["class","float-right",4,"ngIf"],[1,"badge","badge-dark","mr-2"],[1,"float-right"],D]},template:function(t,o){if(1&t&&(e.TgZ(0,"div",0),e.TgZ(1,"label",1),e.ynx(2),e.SDv(3,2),e.BQk(),e.TgZ(4,"cd-helper"),e.YNc(5,Ju,2,0,"span",3),e.YNc(6,Ps,2,0,"span",3),e.YNc(7,mp,2,0,"span",3),e.qZA(),e.qZA(),e.TgZ(8,"div",4),e.YNc(9,Yu,5,5,"ng-container",5),e.YNc(10,gg,9,10,"ng-template",null,6,e.W1O),e.qZA(),e.qZA()),2&t){const c=e.MAs(11);e.xp6(3),e.pQV(o.name),e.QtT(3),e.xp6(2),e.Q6J("ngIf","data"===o.type),e.xp6(1),e.Q6J("ngIf","wal"===o.type),e.xp6(1),e.Q6J("ngIf","db"===o.type),e.xp6(2),e.Q6J("ngIf",0===o.devices.length)("ngIfElse",c)}},directives:[$a.P,E.S,_.O5,ca.o,_.mk,_.sg,mu],pipes:[yn.$],styles:[".tc_clearSelections[_ngcontent-%COMP%]{text-decoration:none}"]}),n})();const j_=["dataDeviceSelectionGroups"],Nh=["walDeviceSelectionGroups"],ep=["dbDeviceSelectionGroups"],ns=["previewButtonPanel"];function s_(n,s){1&n&&e._UZ(0,"cd-orchestrator-doc-panel")}function G_(n,s){if(1&n&&(e.TgZ(0,"div",8),e.SDv(1,32),e.ALo(2,"titlecase"),e.ALo(3,"upperFirst"),e.qZA()),2&n){const t=e.oxw(2);e.xp6(3),e.pQV(e.lcZ(2,2,t.action))(e.lcZ(3,4,t.resource)),e.QtT(1)}}function od(n,s){if(1&n){const t=e.EpF();e.TgZ(0,"div",33),e.TgZ(1,"div",34),e.TgZ(2,"input",35),e.NdJ("change",function(){return e.CHM(t),e.oxw(2).emitDeploymentSelection()}),e.qZA(),e.TgZ(3,"label",36),e.tHW(4,37),e.TgZ(5,"cd-helper"),e._UZ(6,"span"),e.qZA(),e.N_p(),e.qZA(),e.qZA(),e.qZA()}if(2&n){const t=s.$implicit,o=e.oxw(2);e.xp6(2),e.Q6J("id",t)("value",t),e.uIk("disabled",null==o.deploymentOptions||!o.deploymentOptions.options[t].available||null),e.xp6(1),e.Q6J("id","label_"+t)("for",t),e.xp6(3),e.pQV(null==o.deploymentOptions?null:o.deploymentOptions.options[t].title)(o.deploymentOptions.recommended_option===t?"(Recommended)":"")(null==o.deploymentOptions?null:o.deploymentOptions.options[t].desc),e.QtT(4)}}function gc(n,s){1&n&&(e.TgZ(0,"span",46),e.SDv(1,47),e.qZA())}function Ph(n,s){if(1&n&&(e.TgZ(0,"div",38),e.TgZ(1,"label",39),e.ynx(2),e.SDv(3,40),e.BQk(),e.TgZ(4,"cd-helper"),e.TgZ(5,"span"),e.SDv(6,41),e.qZA(),e._UZ(7,"br"),e.TgZ(8,"span"),e.SDv(9,42),e.qZA(),e.qZA(),e.qZA(),e.TgZ(10,"div",43),e._UZ(11,"input",44),e.YNc(12,gc,2,0,"span",45),e.qZA(),e.qZA()),2&n){e.oxw();const t=e.MAs(4),o=e.oxw();e.xp6(12),e.Q6J("ngIf",o.form.showError("walSlots",t,"min"))}}function Ih(n,s){1&n&&(e.TgZ(0,"span",46),e.SDv(1,53),e.qZA())}function Lh(n,s){if(1&n&&(e.TgZ(0,"div",38),e.TgZ(1,"label",48),e.ynx(2),e.SDv(3,49),e.BQk(),e.TgZ(4,"cd-helper"),e.TgZ(5,"span"),e.SDv(6,50),e.qZA(),e._UZ(7,"br"),e.TgZ(8,"span"),e.SDv(9,51),e.qZA(),e.qZA(),e.qZA(),e.TgZ(10,"div",43),e._UZ(11,"input",52),e.YNc(12,Ih,2,0,"span",45),e.qZA(),e.qZA()),2&n){e.oxw();const t=e.MAs(4),o=e.oxw();e.xp6(12),e.Q6J("ngIf",o.form.showError("dbSlots",t,"min"))}}function mg(n,s){if(1&n){const t=e.EpF();e.TgZ(0,"div",54),e.TgZ(1,"input",55),e.NdJ("change",function(){return e.CHM(t),e.oxw(2).emitDeploymentSelection()}),e.qZA(),e.TgZ(2,"label",56),e._uU(3),e.qZA(),e.qZA()}if(2&n){const t=s.$implicit;e.xp6(1),e.s9C("id",t.key),e.s9C("name",t.key),e.s9C("formControlName",t.key),e.xp6(1),e.s9C("for",t.key),e.xp6(1),e.Oqu(t.desc)}}function jf(n,s){if(1&n){const t=e.EpF();e.TgZ(0,"div",57),e.TgZ(1,"cd-form-button-panel",58,59),e.NdJ("submitActionEvent",function(){return e.CHM(t),e.oxw(2).submit()}),e.qZA(),e.qZA()}if(2&n){e.oxw();const t=e.MAs(24),o=e.oxw();e.xp6(1),e.Q6J("form",o.form)("disabled",0===t.devices.length&&!o.simpleDeployment)("submitText",o.simpleDeployment?"Create OSDs":o.actionLabels.PREVIEW)}}const Ud=function(n){return{show:n}};function yf(n,s){if(1&n){const t=e.EpF();e.TgZ(0,"div",2),e.YNc(1,G_,4,6,"div",3),e.TgZ(2,"div",4),e.TgZ(3,"form",5,6),e.TgZ(5,"div",7),e.TgZ(6,"div",2),e.TgZ(7,"div",8),e.TgZ(8,"h2",9),e.TgZ(9,"button",10),e.NdJ("click",function(){return e.CHM(t),e.oxw().emitDeploymentMode()}),e.SDv(10,11),e.qZA(),e.qZA(),e.qZA(),e.qZA(),e.TgZ(11,"div",12),e.TgZ(12,"div",13),e.YNc(13,od,7,8,"div",14),e.qZA(),e.qZA(),e.TgZ(14,"div",2),e.TgZ(15,"div",8),e.TgZ(16,"h2",9),e.TgZ(17,"button",15),e.NdJ("click",function(){return e.CHM(t),e.oxw().emitDeploymentMode()}),e.SDv(18,16),e.qZA(),e.qZA(),e.qZA(),e.qZA(),e.TgZ(19,"div",12),e.TgZ(20,"div",17),e.TgZ(21,"div",17),e.TgZ(22,"fieldset"),e.TgZ(23,"cd-osd-devices-selection-groups",18,19),e.NdJ("selected",function(c){return e.CHM(t),e.oxw().onDevicesSelected(c)})("cleared",function(c){return e.CHM(t),e.oxw().onDevicesCleared(c)}),e.qZA(),e.qZA(),e.TgZ(25,"fieldset"),e.TgZ(26,"legend"),e.SDv(27,20),e.qZA(),e.TgZ(28,"cd-osd-devices-selection-groups",21,22),e.NdJ("selected",function(c){return e.CHM(t),e.oxw().onDevicesSelected(c)})("cleared",function(c){return e.CHM(t),e.oxw().onDevicesCleared(c)}),e.qZA(),e.YNc(30,Ph,13,1,"div",23),e.TgZ(31,"cd-osd-devices-selection-groups",24,25),e.NdJ("selected",function(c){return e.CHM(t),e.oxw().onDevicesSelected(c)})("cleared",function(c){return e.CHM(t),e.oxw().onDevicesCleared(c)}),e.qZA(),e.YNc(33,Lh,13,1,"div",23),e.qZA(),e.qZA(),e.qZA(),e.qZA(),e.TgZ(34,"div",2),e.TgZ(35,"div",8),e.TgZ(36,"h2",9),e.TgZ(37,"button",26),e.SDv(38,27),e.qZA(),e.qZA(),e.qZA(),e.qZA(),e.TgZ(39,"div",28),e.TgZ(40,"div",13),e.TgZ(41,"div",29),e.YNc(42,mg,4,5,"div",30),e.qZA(),e.qZA(),e.qZA(),e.qZA(),e.qZA(),e.qZA(),e.YNc(43,jf,3,3,"div",31),e.qZA()}if(2&n){const t=e.MAs(24),o=e.MAs(29),c=e.MAs(32),g=e.oxw();e.xp6(1),e.Q6J("ngIf",!g.hideTitle),e.xp6(2),e.Q6J("formGroup",g.form),e.xp6(6),e.uIk("aria-expanded",g.simpleDeployment),e.xp6(2),e.Q6J("ngClass",e.VKq(17,Ud,g.simpleDeployment)),e.xp6(2),e.Q6J("ngForOf",g.optionNames),e.xp6(4),e.uIk("aria-expanded",!g.simpleDeployment),e.xp6(2),e.Q6J("ngClass",e.VKq(19,Ud,!g.simpleDeployment)),e.xp6(4),e.Q6J("availDevices",g.availDevices)("canSelect",0!==g.availDevices.length),e.xp6(5),e.Q6J("availDevices",g.availDevices)("canSelect",0!==t.devices.length),e.xp6(2),e.Q6J("ngIf",0!==o.devices.length),e.xp6(1),e.Q6J("availDevices",g.availDevices)("canSelect",0!==t.devices.length),e.xp6(2),e.Q6J("ngIf",0!==c.devices.length),e.xp6(9),e.Q6J("ngForOf",g.featureList),e.xp6(1),e.Q6J("ngIf",!g.hideSubmitBtn)}}let a_=(()=>{class n extends Oa.E{constructor(t,o,c,g,C,D,P,j){super(),this.actionLabels=t,this.authStorageService=o,this.orchService=c,this.hostService=g,this.router=C,this.modalService=D,this.osdService=P,this.taskWrapper=j,this.hideTitle=!1,this.hideSubmitBtn=!1,this.emitDriveGroup=new e.vpe,this.emitDeploymentOption=new e.vpe,this.emitMode=new e.vpe,this.icons=No.P,this.columns=[],this.allDevices=[],this.availDevices=[],this.dataDeviceFilters=[],this.dbDeviceFilters=[],this.walDeviceFilters=[],this.hostname="",this.driveGroup=new Xd,this.featureList=[],this.hasOrchestrator=!0,this.simpleDeployment=!0,this.optionNames=Object.values(r_),this.resource="OSDs",this.action=this.actionLabels.CREATE,this.features={encrypted:{key:"encrypted",desc:"Encryption"}},this.featureList=Ar().map(this.features,(W,re)=>Object.assign(W,{key:re})),this.createForm()}ngOnInit(){this.orchService.status().subscribe(t=>{this.hasOrchestrator=t.available,t.available?this.getDataDevices():this.loadingNone()}),this.osdService.getDeploymentOptions().subscribe(t=>{var o,c;this.deploymentOptions=t,this.form.get("deploymentOption").setValue(null===(o=this.deploymentOptions)||void 0===o?void 0:o.recommended_option),(null===(c=this.deploymentOptions)||void 0===c?void 0:c.recommended_option)&&this.enableFeatures()}),this.form.get("walSlots").valueChanges.subscribe(t=>this.setSlots("wal",t)),this.form.get("dbSlots").valueChanges.subscribe(t=>this.setSlots("db",t)),Ar().each(this.features,t=>{this.form.get("features").get(t.key).valueChanges.subscribe(o=>this.featureFormUpdate(t.key,o))})}createForm(){this.form=new Us.d({walSlots:new vn.NI(0),dbSlots:new vn.NI(0),features:new Us.d(this.featureList.reduce((t,o)=>(t[o.key]=new vn.NI({value:!1,disabled:!0}),t),{})),deploymentOption:new vn.NI(0)})}getDataDevices(){this.hostService.inventoryDeviceList().subscribe(t=>{this.allDevices=Ar().filter(t,"available"),this.availDevices=[...this.allDevices],this.loadingReady()},()=>{this.allDevices=[],this.availDevices=[],this.loadingError()})}setSlots(t,o){"number"==typeof o&&o>=0&&this.driveGroup.setSlots(t,o)}featureFormUpdate(t,o){this.driveGroup.setFeature(t,o)}enableFeatures(){this.featureList.forEach(t=>{this.form.get(t.key).enable({emitEvent:!1})})}disableFeatures(){this.featureList.forEach(t=>{const o=this.form.get(t.key);o.disable({emitEvent:!1}),o.setValue(!1,{emitEvent:!1})})}onDevicesSelected(t){if(this.availDevices=t.dataOut,"data"===t.type){const o=Ar().find(t.filters,{prop:"hostname"});o?(this.hostname=o.value.raw,this.availDevices=t.dataOut.filter(c=>c.hostname===this.hostname),this.driveGroup.setHostPattern(this.hostname)):this.driveGroup.setHostPattern("*"),this.enableFeatures()}this.driveGroup.setDeviceSelection(t.type,t.filters),this.emitDriveGroup.emit(this.driveGroup)}onDevicesCleared(t){"data"===t.type?(this.availDevices=[...this.allDevices],this.walDeviceSelectionGroups.devices=[],this.dbDeviceSelectionGroups.devices=[],this.disableFeatures(),this.driveGroup.reset(),this.form.get("walSlots").setValue(0,{emitEvent:!1}),this.form.get("dbSlots").setValue(0,{emitEvent:!1})):(this.availDevices=[...this.availDevices,...t.clearedDevices],this.driveGroup.clearDeviceSelection(t.type),this.form.get(`${t.type}Slots`).setValue(0,{emitEvent:!1}))}emitDeploymentSelection(){const t=this.form.get("deploymentOption").value,o=this.form.get("encrypted").value;this.emitDeploymentOption.emit({option:t,encrypted:o})}emitDeploymentMode(){this.simpleDeployment=!this.simpleDeployment,this.simpleDeployment||0!==this.dataDeviceSelectionGroups.devices.length?this.enableFeatures():this.disableFeatures(),this.emitMode.emit(this.simpleDeployment)}submit(){if(this.simpleDeployment){const c={option:this.form.get("deploymentOption").value,encrypted:this.form.get("encrypted").value},C=`${this.deploymentOptions.options[c.option].title} deployment`;this.taskWrapper.wrapTaskAroundCall({task:new cl.R("osd/"+ki.MQ.CREATE,{tracking_id:C}),call:this.osdService.create([c],C,"predefined")}).subscribe({complete:()=>{this.router.navigate(["/osd"])}})}else{const t=this.authStorageService.getUsername();this.driveGroup.setName(`dashboard-${t}-${Ar().now()}`),this.modalService.show(Ig,{driveGroups:[this.driveGroup.spec]}).componentInstance.submitAction.subscribe(()=>{this.router.navigate(["/osd"])}),this.previewButtonPanel.submitButton.loading=!1}}}return n.\u0275fac=function(t){return new(t||n)(e.Y36(ki.p4),e.Y36(_t.j),e.Y36(Cc),e.Y36(ql),e.Y36(Yo.F0),e.Y36(Ul.Z),e.Y36(Ji),e.Y36(Ll.P))},n.\u0275cmp=e.Xpm({type:n,selectors:[["cd-osd-form"]],viewQuery:function(t,o){if(1&t&&(e.Gf(j_,5),e.Gf(Nh,5),e.Gf(ep,5),e.Gf(ns,5)),2&t){let c;e.iGM(c=e.CRH())&&(o.dataDeviceSelectionGroups=c.first),e.iGM(c=e.CRH())&&(o.walDeviceSelectionGroups=c.first),e.iGM(c=e.CRH())&&(o.dbDeviceSelectionGroups=c.first),e.iGM(c=e.CRH())&&(o.previewButtonPanel=c.first)}},inputs:{hideTitle:"hideTitle",hideSubmitBtn:"hideSubmitBtn"},outputs:{emitDriveGroup:"emitDriveGroup",emitDeploymentOption:"emitDeploymentOption",emitMode:"emitMode"},features:[e.qOj],decls:2,vars:2,consts:function(){let s,t,o,c,g,C,D,P,j,W,re,ie,ge,_e;return s="Deployment Options",t="Advanced Mode",o="Shared devices",c="Features",g="" + "\ufffd0\ufffd" + " " + "\ufffd1\ufffd" + "",C="" + "\ufffd0\ufffd" + " " + "\ufffd1\ufffd" + " " + "\ufffd#5\ufffd" + "" + "\ufffd#6\ufffd" + "" + "\ufffd2\ufffd" + "" + "\ufffd/#6\ufffd" + "" + "\ufffd/#5\ufffd" + "",D="WAL slots",P="How many OSDs per WAL device.",j="Specify 0 to let Orchestrator backend decide it.",W="Value should be greater than or equal to 0",re="DB slots",ie="How many OSDs per DB device.",ge="Specify 0 to let Orchestrator backend decide it.",_e="Value should be greater than or equal to 0",[[4,"ngIf"],["class","card",4,"cdFormLoading"],[1,"card"],["class","card-header",4,"ngIf"],[1,"card-body","ml-2"],["name","form","novalidate","",3,"formGroup"],["formDir","ngForm"],[1,"accordion"],[1,"card-header"],[1,"mb-0"],["data-toggle","collapse","aria-label","toggle deployment options",1,"btn","btn-link","btn-block","text-left","dropdown-toggle",3,"click"],s,[1,"collapse",3,"ngClass"],[1,"card-body","d-flex","flex-column"],["class","pt-3 pb-3",4,"ngFor","ngForOf"],["data-toggle","collapse","aria-label","toggle advanced mode",1,"btn","btn-link","btn-block","text-left","dropdown-toggle",3,"click"],t,[1,"card-body"],["name","Primary","type","data",3,"availDevices","canSelect","selected","cleared"],["dataDeviceSelectionGroups",""],o,["name","WAL","type","wal",3,"availDevices","canSelect","selected","cleared"],["walDeviceSelectionGroups",""],["class","form-group row",4,"ngIf"],["name","DB","type","db",3,"availDevices","canSelect","selected","cleared"],["dbDeviceSelectionGroups",""],["data-toggle","collapse","aria-label","features","aria-expanded","true",1,"btn","btn-link","btn-block","text-left","dropdown-toggle"],c,[1,"collapse","show"],["formGroupName","features",1,"pt-3","pb-3"],["class","custom-control custom-checkbox",4,"ngFor","ngForOf"],["class","card-footer",4,"ngIf"],g,[1,"pt-3","pb-3"],[1,"custom-control","custom-radio","custom-control-inline"],["type","radio","name","deploymentOption","formControlName","deploymentOption",1,"custom-control-input",3,"id","value","change"],[1,"custom-control-label",3,"id","for"],C,[1,"form-group","row"],["for","walSlots",1,"cd-col-form-label"],D,P,j,[1,"cd-col-form-input"],["id","walSlots","name","walSlots","type","number","min","0","formControlName","walSlots",1,"form-control"],["class","invalid-feedback",4,"ngIf"],[1,"invalid-feedback"],W,["for","dbSlots",1,"cd-col-form-label"],re,ie,ge,["id","dbSlots","name","dbSlots","type","number","min","0","formControlName","dbSlots",1,"form-control"],_e,[1,"custom-control","custom-checkbox"],["type","checkbox",1,"custom-control-input",3,"id","name","formControlName","change"],[1,"custom-control-label",3,"for"],[1,"card-footer"],["wrappingClass","text-right",3,"form","disabled","submitText","submitActionEvent"],["previewButtonPanel",""]]},template:function(t,o){1&t&&(e.YNc(0,s_,1,0,"cd-orchestrator-doc-panel",0),e.YNc(1,yf,44,21,"div",1)),2&t&&(e.Q6J("ngIf",!o.hasOrchestrator),e.xp6(1),e.Q6J("cdFormLoading",o.loading))},directives:[_.O5,wl.y,au,vn._Y,vn.JL,tl.V,vn.sg,ca.o,_.mk,_.sg,Z_,vn.x0,vn._,vn.Fj,Ha.b,vn.JJ,vn.u,E.S,$a.P,vn.qQ,vn.wV,vn.Wl,nl.p],pipes:[_.rS,K.m],styles:[""]}),n})();var vp=i(71289);let l_=(()=>{class n{transform(t){if(Ar().isUndefined(t))return "no spec";if(Ar().get(t,"unmanaged",!1))return "unmanaged";const o=[],c=Ar().get(t,"placement.hosts"),g=Ar().get(t,"placement.count"),C=Ar().get(t,"placement.label"),D=Ar().get(t,"placement.host_pattern");return Ar().isArray(c)&&o.push(...c),Ar().isNumber(g)&&o.push("count:" + g + ""),Ar().isString(C)&&o.push("label:" + C + ""),Ar().isString(D)&&o.push(D),o.join(";")}}return n.\u0275fac=function(t){return new(t||n)},n.\u0275pipe=e.Yjl({name:"placement",type:n,pure:!0}),n})();var yp=i(79765),Bd=i(66682),fd=i(77393),bf=i(33637);function Gf(n,s=bf.P){return t=>t.lift(new lh(n,s))}class lh{constructor(s,t){this.dueTime=s,this.scheduler=t}call(s,t){return t.subscribe(new sd(s,this.dueTime,this.scheduler))}}class sd extends fd.L{constructor(s,t,o){super(s),this.dueTime=t,this.scheduler=o,this.debouncedSubscription=null,this.lastValue=null,this.hasValue=!1}_next(s){this.clearDebounce(),this.lastValue=s,this.hasValue=!0,this.add(this.debouncedSubscription=this.scheduler.schedule(uh,this.dueTime,this))}_complete(){this.debouncedNext(),this.destination.complete()}debouncedNext(){if(this.clearDebounce(),this.hasValue){const{lastValue:s}=this;this.lastValue=null,this.hasValue=!1,this.destination.next(s)}}clearDebounce(){const s=this.debouncedSubscription;null!==s&&(this.remove(s),s.unsubscribe(),this.debouncedSubscription=null)}}function uh(n){n.debouncedNext()}var Df=i(87519),tp=i(45435),V_=i(80842),ch=i(14745),u_=i(4416),Uc=i(58039);function Rf(n,s){if(1&n&&(e.TgZ(0,"option",26),e._uU(1),e.qZA()),2&n){const t=s.$implicit;e.Q6J("value",t),e.xp6(1),e.hij(" ",t," ")}}function dh(n,s){1&n&&(e.TgZ(0,"span",27),e.SDv(1,28),e.qZA())}function vg(n,s){1&n&&(e.TgZ(0,"option",12),e.SDv(1,33),e.qZA()),2&n&&e.Q6J("ngValue",null)}function Fh(n,s){1&n&&(e.TgZ(0,"option",12),e.SDv(1,34),e.qZA()),2&n&&e.Q6J("ngValue",null)}function c_(n,s){1&n&&(e.TgZ(0,"option",12),e.SDv(1,35),e.qZA()),2&n&&e.Q6J("ngValue",null)}function Cm(n,s){if(1&n&&(e.TgZ(0,"option",26),e._uU(1),e.qZA()),2&n){const t=s.$implicit;e.Q6J("value",t.service_name),e.xp6(1),e.Oqu(t.service_name)}}function Mm(n,s){1&n&&(e.TgZ(0,"span",27),e.SDv(1,36),e.qZA())}const d_=function(){return["ingress"]},Yp=function(n){return{required:n}};function fh(n,s){if(1&n){const t=e.EpF();e.TgZ(0,"div",7),e.TgZ(1,"label",29),e.SDv(2,30),e.qZA(),e.TgZ(3,"div",10),e.TgZ(4,"select",31),e.NdJ("change",function(){return e.CHM(t),e.oxw().prePopulateId()}),e.YNc(5,vg,2,1,"option",32),e.YNc(6,Fh,2,1,"option",32),e.YNc(7,c_,2,1,"option",32),e.YNc(8,Cm,2,2,"option",14),e.qZA(),e.YNc(9,Mm,2,0,"span",15),e.qZA(),e.qZA()}if(2&n){const t=e.oxw(),o=e.MAs(7);e.xp6(1),e.Q6J("ngClass",e.VKq(7,Yp,e.DdM(6,d_).includes(t.serviceForm.controls.service_type.value))),e.xp6(4),e.Q6J("ngIf",null===t.services),e.xp6(1),e.Q6J("ngIf",null!==t.services&&0===t.services.length),e.xp6(1),e.Q6J("ngIf",null!==t.services&&t.services.length>0),e.xp6(1),e.Q6J("ngForOf",t.services),e.xp6(1),e.Q6J("ngIf",t.serviceForm.showError("backend_service",o,"required"))}}function Fg(n,s){1&n&&(e.TgZ(0,"span",27),e.SDv(1,40),e.qZA())}function yg(n,s){1&n&&(e.TgZ(0,"span",27),e.SDv(1,41),e.qZA())}function bp(n,s){1&n&&(e.TgZ(0,"span",27),e.tHW(1,42),e._UZ(2,"strong"),e.N_p(),e.qZA())}const bg=function(){return["mds","rgw","nfs","iscsi","ingress"]};function Eg(n,s){if(1&n&&(e.TgZ(0,"div",7),e.TgZ(1,"label",37),e.SDv(2,38),e.qZA(),e.TgZ(3,"div",10),e._UZ(4,"input",39),e.YNc(5,Fg,2,0,"span",15),e.YNc(6,yg,2,0,"span",15),e.YNc(7,bp,3,0,"span",15),e.qZA(),e.qZA()),2&n){const t=e.oxw(),o=e.MAs(7);e.xp6(1),e.Q6J("ngClass",e.VKq(5,Yp,e.DdM(4,bg).includes(t.serviceForm.controls.service_type.value))),e.xp6(4),e.Q6J("ngIf",t.serviceForm.showError("service_id",o,"required")),e.xp6(1),e.Q6J("ngIf",t.serviceForm.showError("service_id",o,"uniqueName")),e.xp6(1),e.Q6J("ngIf",t.serviceForm.showError("service_id",o,"rgwPattern"))}}function kg(n,s){1&n&&(e.TgZ(0,"div",7),e.TgZ(1,"label",43),e.SDv(2,44),e.qZA(),e.TgZ(3,"div",10),e.TgZ(4,"select",45),e.TgZ(5,"option",46),e.SDv(6,47),e.qZA(),e.TgZ(7,"option",48),e.SDv(8,49),e.qZA(),e.qZA(),e.qZA(),e.qZA())}function z_(n,s){1&n&&(e.TgZ(0,"span",27),e.SDv(1,53),e.qZA())}function Ep(n,s){if(1&n){const t=e.EpF();e.TgZ(0,"div",7),e.TgZ(1,"label",50),e.SDv(2,51),e.qZA(),e.TgZ(3,"div",10),e.TgZ(4,"input",52),e.NdJ("focus",function(c){return e.CHM(t),e.oxw().labelFocus.next(c.target.value)})("click",function(c){return e.CHM(t),e.oxw().labelClick.next(c.target.value)}),e.qZA(),e.YNc(5,z_,2,0,"span",15),e.qZA(),e.qZA()}if(2&n){const t=e.oxw(),o=e.MAs(7);e.xp6(4),e.Q6J("ngbTypeahead",t.searchLabels),e.xp6(1),e.Q6J("ngIf",t.serviceForm.showError("label",o,"required"))}}function ph(n,s){if(1&n&&(e.TgZ(0,"div",7),e.TgZ(1,"label",54),e.SDv(2,55),e.qZA(),e.TgZ(3,"div",10),e._UZ(4,"cd-select-badges",56),e.qZA(),e.qZA()),2&n){const t=e.oxw();e.xp6(4),e.Q6J("data",t.serviceForm.controls.hosts.value)("options",t.hosts.options)("messages",t.hosts.messages)}}function $g(n,s){1&n&&(e.TgZ(0,"span",27),e.SDv(1,61),e.qZA())}function W_(n,s){1&n&&(e.TgZ(0,"span",27),e.SDv(1,62),e.qZA())}function Am(n,s){if(1&n&&(e.TgZ(0,"div",7),e.TgZ(1,"label",57),e.TgZ(2,"span"),e.SDv(3,58),e.qZA(),e.TgZ(4,"cd-helper"),e.SDv(5,59),e.qZA(),e.qZA(),e.TgZ(6,"div",10),e._UZ(7,"input",60),e.YNc(8,$g,2,0,"span",15),e.YNc(9,W_,2,0,"span",15),e.qZA(),e.qZA()),2&n){const t=e.oxw(),o=e.MAs(7);e.xp6(8),e.Q6J("ngIf",t.serviceForm.showError("count",o,"min")),e.xp6(1),e.Q6J("ngIf",t.serviceForm.showError("count",o,"pattern"))}}function Yd(n,s){1&n&&(e.TgZ(0,"span",27),e.SDv(1,66),e.qZA())}function Tg(n,s){1&n&&(e.TgZ(0,"span",27),e.SDv(1,67),e.qZA())}function Hg(n,s){1&n&&(e.TgZ(0,"span",27),e.SDv(1,68),e.qZA())}function Tp(n,s){if(1&n&&(e.ynx(0),e.TgZ(1,"div",7),e.TgZ(2,"label",63),e.SDv(3,64),e.qZA(),e.TgZ(4,"div",10),e._UZ(5,"input",65),e.YNc(6,Yd,2,0,"span",15),e.YNc(7,Tg,2,0,"span",15),e.YNc(8,Hg,2,0,"span",15),e.qZA(),e.qZA(),e.BQk()),2&n){const t=e.oxw(),o=e.MAs(7);e.xp6(6),e.Q6J("ngIf",t.serviceForm.showError("rgw_frontend_port",o,"pattern")),e.xp6(1),e.Q6J("ngIf",t.serviceForm.showError("rgw_frontend_port",o,"min")),e.xp6(1),e.Q6J("ngIf",t.serviceForm.showError("rgw_frontend_port",o,"max"))}}function f_(n,s){1&n&&(e.TgZ(0,"option",12),e.SDv(1,72),e.qZA()),2&n&&e.Q6J("ngValue",null)}function Qc(n,s){1&n&&(e.TgZ(0,"option",12),e.SDv(1,73),e.qZA()),2&n&&e.Q6J("ngValue",null)}function J_(n,s){1&n&&(e.TgZ(0,"option",12),e.SDv(1,74),e.qZA()),2&n&&e.Q6J("ngValue",null)}function kh(n,s){if(1&n&&(e.TgZ(0,"option",26),e._uU(1),e.qZA()),2&n){const t=s.$implicit;e.Q6J("value",t.pool_name),e.xp6(1),e.Oqu(t.pool_name)}}function $h(n,s){1&n&&(e.TgZ(0,"span",27),e.SDv(1,75),e.qZA())}function Sg(n,s){if(1&n&&(e.TgZ(0,"div",7),e.TgZ(1,"label",69),e.SDv(2,70),e.qZA(),e.TgZ(3,"div",10),e.TgZ(4,"select",71),e.YNc(5,f_,2,1,"option",32),e.YNc(6,Qc,2,1,"option",32),e.YNc(7,J_,2,1,"option",32),e.YNc(8,kh,2,2,"option",14),e.qZA(),e.YNc(9,$h,2,0,"span",15),e.qZA(),e.qZA()),2&n){const t=e.oxw(),o=e.MAs(7);e.xp6(5),e.Q6J("ngIf",null===t.pools),e.xp6(1),e.Q6J("ngIf",t.pools&&0===t.pools.length),e.xp6(1),e.Q6J("ngIf",t.pools&&t.pools.length>0),e.xp6(1),e.Q6J("ngForOf",t.pools),e.xp6(1),e.Q6J("ngIf",t.serviceForm.showError("pool",o,"required"))}}function Cg(n,s){1&n&&(e.TgZ(0,"span",27),e.SDv(1,94),e.qZA())}function p_(n,s){1&n&&(e.TgZ(0,"span",27),e.SDv(1,95),e.qZA())}function h_(n,s){1&n&&(e.TgZ(0,"span",27),e.SDv(1,96),e.qZA())}function Hh(n,s){1&n&&(e.TgZ(0,"span",27),e.SDv(1,97),e.qZA())}function __(n,s){1&n&&(e.TgZ(0,"span",27),e.SDv(1,98),e.qZA())}const Zp=function(){return["iscsi"]};function Mg(n,s){if(1&n&&(e.ynx(0),e.TgZ(1,"div",7),e.TgZ(2,"label",76),e.TgZ(3,"span"),e.SDv(4,77),e.qZA(),e.TgZ(5,"cd-helper"),e.TgZ(6,"span"),e.SDv(7,78),e.qZA(),e._UZ(8,"br"),e.TgZ(9,"span"),e.tHW(10,79),e._UZ(11,"b"),e.N_p(),e.qZA(),e.qZA(),e.qZA(),e.TgZ(12,"div",10),e._UZ(13,"input",80),e.qZA(),e.qZA(),e.TgZ(14,"div",7),e.TgZ(15,"label",81),e.SDv(16,82),e.qZA(),e.TgZ(17,"div",10),e._UZ(18,"input",83),e.YNc(19,Cg,2,0,"span",15),e.YNc(20,p_,2,0,"span",15),e.YNc(21,h_,2,0,"span",15),e.qZA(),e.qZA(),e.TgZ(22,"div",7),e.TgZ(23,"label",84),e.SDv(24,85),e.qZA(),e.TgZ(25,"div",10),e._UZ(26,"input",86),e.YNc(27,Hh,2,0,"span",15),e.qZA(),e.qZA(),e.TgZ(28,"div",7),e.TgZ(29,"label",87),e.SDv(30,88),e.qZA(),e.TgZ(31,"div",10),e.TgZ(32,"div",89),e._UZ(33,"input",90),e.TgZ(34,"span",91),e._UZ(35,"button",92),e._UZ(36,"cd-copy-2-clipboard-button",93),e.qZA(),e.YNc(37,__,2,0,"span",15),e.qZA(),e.qZA(),e.qZA(),e.BQk()),2&n){const t=e.oxw(),o=e.MAs(7);e.xp6(19),e.Q6J("ngIf",t.serviceForm.showError("api_port",o,"pattern")),e.xp6(1),e.Q6J("ngIf",t.serviceForm.showError("api_port",o,"min")),e.xp6(1),e.Q6J("ngIf",t.serviceForm.showError("api_port",o,"max")),e.xp6(2),e.Q6J("ngClass",e.VKq(8,Yp,e.DdM(7,Zp).includes(t.serviceForm.controls.service_type.value))),e.xp6(4),e.Q6J("ngIf",t.serviceForm.showError("api_user",o,"required")),e.xp6(2),e.Q6J("ngClass",e.VKq(11,Yp,e.DdM(10,Zp).includes(t.serviceForm.controls.service_type.value))),e.xp6(8),e.Q6J("ngIf",t.serviceForm.showError("api_password",o,"required"))}}function g_(n,s){1&n&&(e.TgZ(0,"span",27),e.SDv(1,111),e.qZA())}function Ug(n,s){1&n&&(e.TgZ(0,"span",27),e.SDv(1,112),e.qZA())}function Uh(n,s){1&n&&(e.TgZ(0,"span",27),e.SDv(1,113),e.qZA())}function Ag(n,s){1&n&&(e.TgZ(0,"span",27),e.SDv(1,114),e.qZA())}function ov(n,s){1&n&&(e.TgZ(0,"span",27),e.SDv(1,115),e.qZA())}function Bh(n,s){1&n&&(e.TgZ(0,"span",27),e.SDv(1,116),e.qZA())}function Om(n,s){1&n&&(e.TgZ(0,"span",27),e.SDv(1,117),e.qZA())}function m_(n,s){1&n&&(e.TgZ(0,"span",27),e.SDv(1,118),e.qZA())}function b(n,s){1&n&&(e.TgZ(0,"span",27),e.SDv(1,119),e.qZA())}function x(n,s){1&n&&(e.TgZ(0,"div",7),e.TgZ(1,"label",120),e.TgZ(2,"span"),e.SDv(3,121),e.qZA(),e.TgZ(4,"cd-helper"),e.TgZ(5,"span"),e.SDv(6,122),e.qZA(),e.qZA(),e.qZA(),e.TgZ(7,"div",10),e._UZ(8,"input",123),e.qZA(),e.qZA())}function G(n,s){if(1&n&&(e.ynx(0),e.TgZ(1,"div",7),e.TgZ(2,"label",99),e.TgZ(3,"span"),e.SDv(4,100),e.qZA(),e.TgZ(5,"cd-helper"),e.TgZ(6,"span"),e.SDv(7,101),e.qZA(),e.qZA(),e.qZA(),e.TgZ(8,"div",10),e._UZ(9,"input",102),e.YNc(10,g_,2,0,"span",15),e.qZA(),e.qZA(),e.TgZ(11,"div",7),e.TgZ(12,"label",103),e.TgZ(13,"span"),e.SDv(14,104),e.qZA(),e.TgZ(15,"cd-helper"),e.TgZ(16,"span"),e.SDv(17,105),e.qZA(),e.qZA(),e.qZA(),e.TgZ(18,"div",10),e._UZ(19,"input",106),e.YNc(20,Ug,2,0,"span",15),e.YNc(21,Uh,2,0,"span",15),e.YNc(22,Ag,2,0,"span",15),e.YNc(23,ov,2,0,"span",15),e.qZA(),e.qZA(),e.TgZ(24,"div",7),e.TgZ(25,"label",107),e.TgZ(26,"span"),e.SDv(27,108),e.qZA(),e.TgZ(28,"cd-helper"),e.TgZ(29,"span"),e.SDv(30,109),e.qZA(),e.qZA(),e.qZA(),e.TgZ(31,"div",10),e._UZ(32,"input",110),e.YNc(33,Bh,2,0,"span",15),e.YNc(34,Om,2,0,"span",15),e.YNc(35,m_,2,0,"span",15),e.YNc(36,b,2,0,"span",15),e.qZA(),e.qZA(),e.YNc(37,x,9,0,"div",16),e.BQk()),2&n){const t=e.oxw(),o=e.MAs(7);e.xp6(2),e.Q6J("ngClass",e.VKq(14,Yp,e.DdM(13,d_).includes(t.serviceForm.controls.service_type.value))),e.xp6(8),e.Q6J("ngIf",t.serviceForm.showError("virtual_ip",o,"required")),e.xp6(2),e.Q6J("ngClass",e.VKq(17,Yp,e.DdM(16,d_).includes(t.serviceForm.controls.service_type.value))),e.xp6(8),e.Q6J("ngIf",t.serviceForm.showError("frontend_port",o,"pattern")),e.xp6(1),e.Q6J("ngIf",t.serviceForm.showError("frontend_port",o,"min")),e.xp6(1),e.Q6J("ngIf",t.serviceForm.showError("frontend_port",o,"max")),e.xp6(1),e.Q6J("ngIf",t.serviceForm.showError("frontend_port",o,"required")),e.xp6(2),e.Q6J("ngClass",e.VKq(20,Yp,e.DdM(19,d_).includes(t.serviceForm.controls.service_type.value))),e.xp6(8),e.Q6J("ngIf",t.serviceForm.showError("monitor_port",o,"pattern")),e.xp6(1),e.Q6J("ngIf",t.serviceForm.showError("monitor_port",o,"min")),e.xp6(1),e.Q6J("ngIf",t.serviceForm.showError("monitor_port",o,"max")),e.xp6(1),e.Q6J("ngIf",t.serviceForm.showError("monitor_port",o,"required")),e.xp6(1),e.Q6J("ngIf",!t.serviceForm.controls.unmanaged.value)}}function Se(n,s){if(1&n&&(e.TgZ(0,"option",26),e._uU(1),e.qZA()),2&n){const t=s.$implicit;e.Q6J("value",t),e.xp6(1),e.Oqu(t)}}function We(n,s){1&n&&(e.TgZ(0,"span",27),e.SDv(1,133),e.qZA())}function Rt(n,s){1&n&&(e.TgZ(0,"span",27),e.SDv(1,134),e.qZA())}function rn(n,s){1&n&&(e.TgZ(0,"span",27),e.tHW(1,135),e._UZ(2,"strong"),e.N_p(),e.qZA())}function xn(n,s){1&n&&(e.TgZ(0,"span",27),e.SDv(1,140),e.qZA())}function Er(n,s){1&n&&(e.TgZ(0,"span",27),e.tHW(1,141),e._UZ(2,"strong"),e.N_p(),e.qZA())}function Ei(n,s){if(1&n&&(e.TgZ(0,"div",7),e.TgZ(1,"label",136),e.TgZ(2,"span"),e.SDv(3,137),e.qZA(),e.TgZ(4,"cd-helper"),e.TgZ(5,"span"),e.SDv(6,138),e.qZA(),e.qZA(),e.qZA(),e.TgZ(7,"div",10),e._UZ(8,"input",139),e.YNc(9,xn,2,0,"span",15),e.YNc(10,Er,3,0,"span",15),e.qZA(),e.qZA()),2&n){const t=e.oxw(2),o=e.MAs(7);e.xp6(9),e.Q6J("ngIf",t.serviceForm.showError("engine_id",o,"required")),e.xp6(1),e.Q6J("ngIf",t.serviceForm.showError("engine_id",o,"snmpEngineIdPattern"))}}function fs(n,s){if(1&n&&(e.TgZ(0,"option",26),e._uU(1),e.qZA()),2&n){const t=s.$implicit;e.Q6J("value",t),e.xp6(1),e.hij(" ",t," ")}}function Ua(n,s){1&n&&(e.TgZ(0,"span",27),e.SDv(1,146),e.qZA())}const mo=function(){return["SHA","MD5"]};function _o(n,s){if(1&n&&(e.TgZ(0,"div",7),e.TgZ(1,"label",142),e.SDv(2,143),e.qZA(),e.TgZ(3,"div",10),e.TgZ(4,"select",144),e.TgZ(5,"option",12),e.SDv(6,145),e.qZA(),e.YNc(7,fs,2,2,"option",14),e.qZA(),e.YNc(8,Ua,2,0,"span",15),e.qZA(),e.qZA()),2&n){const t=e.oxw(2),o=e.MAs(7);e.xp6(5),e.Q6J("ngValue",null),e.xp6(2),e.Q6J("ngForOf",e.DdM(3,mo)),e.xp6(1),e.Q6J("ngIf",t.serviceForm.showError("auth_protocol",o,"required"))}}function La(n,s){if(1&n&&(e.TgZ(0,"option",26),e._uU(1),e.qZA()),2&n){const t=s.$implicit;e.Q6J("value",t),e.xp6(1),e.hij(" ",t," ")}}const Sa=function(){return["DES","AES"]};function ti(n,s){1&n&&(e.TgZ(0,"div",7),e.TgZ(1,"label",147),e.SDv(2,148),e.qZA(),e.TgZ(3,"div",10),e.TgZ(4,"select",149),e.TgZ(5,"option",12),e.SDv(6,150),e.qZA(),e.YNc(7,La,2,2,"option",14),e.qZA(),e.qZA(),e.qZA()),2&n&&(e.xp6(5),e.Q6J("ngValue",null),e.xp6(2),e.Q6J("ngForOf",e.DdM(2,Sa)))}function Sr(n,s){1&n&&(e.TgZ(0,"span",27),e.SDv(1,154),e.qZA())}function Wr(n,s){if(1&n&&(e.TgZ(0,"div",7),e.TgZ(1,"label",151),e.TgZ(2,"span"),e.SDv(3,152),e.qZA(),e.qZA(),e.TgZ(4,"div",10),e._UZ(5,"input",153),e.YNc(6,Sr,2,0,"span",15),e.qZA(),e.qZA()),2&n){const t=e.oxw(2),o=e.MAs(7);e.xp6(6),e.Q6J("ngIf",t.serviceForm.showError("snmp_community",o,"required"))}}function Bi(n,s){1&n&&(e.TgZ(0,"span",27),e.SDv(1,158),e.qZA())}function ao(n,s){if(1&n&&(e.TgZ(0,"div",7),e.TgZ(1,"label",155),e.TgZ(2,"span"),e.SDv(3,156),e.qZA(),e.qZA(),e.TgZ(4,"div",10),e._UZ(5,"input",157),e.YNc(6,Bi,2,0,"span",15),e.qZA(),e.qZA()),2&n){const t=e.oxw(2),o=e.MAs(7);e.xp6(6),e.Q6J("ngIf",t.serviceForm.showError("snmp_v3_auth_username",o,"required"))}}function ba(n,s){1&n&&(e.TgZ(0,"span",27),e.SDv(1,162),e.qZA())}function Os(n,s){if(1&n&&(e.TgZ(0,"div",7),e.TgZ(1,"label",159),e.TgZ(2,"span"),e.SDv(3,160),e.qZA(),e.qZA(),e.TgZ(4,"div",10),e._UZ(5,"input",161),e.YNc(6,ba,2,0,"span",15),e.qZA(),e.qZA()),2&n){const t=e.oxw(2),o=e.MAs(7);e.xp6(6),e.Q6J("ngIf",t.serviceForm.showError("snmp_v3_auth_password",o,"required"))}}function Xa(n,s){1&n&&(e.TgZ(0,"span",27),e.SDv(1,166),e.qZA())}function Dl(n,s){if(1&n&&(e.TgZ(0,"div",7),e.TgZ(1,"label",163),e.TgZ(2,"span"),e.SDv(3,164),e.qZA(),e.qZA(),e.TgZ(4,"div",10),e._UZ(5,"input",165),e.YNc(6,Xa,2,0,"span",15),e.qZA(),e.qZA()),2&n){const t=e.oxw(2),o=e.MAs(7);e.xp6(6),e.Q6J("ngIf",t.serviceForm.showError("snmp_v3_priv_password",o,"required"))}}const Cl=function(){return["V2c","V3"]};function jp(n,s){if(1&n){const t=e.EpF();e.ynx(0),e.TgZ(1,"div",7),e.TgZ(2,"label",124),e.SDv(3,125),e.qZA(),e.TgZ(4,"div",10),e.TgZ(5,"select",126),e.NdJ("change",function(){return e.CHM(t),e.oxw().clearValidations()}),e.TgZ(6,"option",12),e.SDv(7,127),e.qZA(),e.YNc(8,Se,2,2,"option",14),e.qZA(),e.YNc(9,We,2,0,"span",15),e.qZA(),e.qZA(),e.TgZ(10,"div",7),e.TgZ(11,"label",128),e.TgZ(12,"span"),e.SDv(13,129),e.qZA(),e.TgZ(14,"cd-helper"),e.TgZ(15,"span"),e.SDv(16,130),e.qZA(),e.qZA(),e.qZA(),e.TgZ(17,"div",10),e._UZ(18,"input",131),e.YNc(19,Rt,2,0,"span",15),e.YNc(20,rn,3,0,"span",15),e.qZA(),e.qZA(),e.YNc(21,Ei,11,2,"div",16),e.YNc(22,_o,9,4,"div",16),e.YNc(23,ti,8,3,"div",16),e.TgZ(24,"fieldset"),e.TgZ(25,"legend"),e.SDv(26,132),e.qZA(),e.YNc(27,Wr,7,1,"div",16),e.YNc(28,ao,7,1,"div",16),e.YNc(29,Os,7,1,"div",16),e.YNc(30,Dl,7,1,"div",16),e.qZA(),e.BQk()}if(2&n){const t=e.oxw(),o=e.MAs(7);e.xp6(6),e.Q6J("ngValue",null),e.xp6(2),e.Q6J("ngForOf",e.DdM(12,Cl)),e.xp6(1),e.Q6J("ngIf",t.serviceForm.showError("snmp_version",o,"required")),e.xp6(10),e.Q6J("ngIf",t.serviceForm.showError("snmp_destination",o,"required")),e.xp6(1),e.Q6J("ngIf",t.serviceForm.showError("snmp_destination",o,"snmpDestinationPattern")),e.xp6(1),e.Q6J("ngIf","V3"===t.serviceForm.controls.snmp_version.value),e.xp6(1),e.Q6J("ngIf","V3"===t.serviceForm.controls.snmp_version.value),e.xp6(1),e.Q6J("ngIf","V3"===t.serviceForm.controls.snmp_version.value),e.xp6(4),e.Q6J("ngIf","V2c"===t.serviceForm.controls.snmp_version.value),e.xp6(1),e.Q6J("ngIf","V3"===t.serviceForm.controls.snmp_version.value),e.xp6(1),e.Q6J("ngIf","V3"===t.serviceForm.controls.snmp_version.value),e.xp6(1),e.Q6J("ngIf","V3"===t.serviceForm.controls.snmp_version.value&&null!=t.serviceForm.controls.privacy_protocol.value)}}function d1(n,s){1&n&&(e.TgZ(0,"span",27),e.SDv(1,175),e.qZA())}function Yh(n,s){1&n&&(e.TgZ(0,"span",27),e.SDv(1,176),e.qZA())}function wm(n,s){if(1&n){const t=e.EpF();e.TgZ(0,"div",7),e.TgZ(1,"label",170),e.TgZ(2,"span"),e.SDv(3,171),e.qZA(),e.TgZ(4,"cd-helper"),e.SDv(5,172),e.qZA(),e.qZA(),e.TgZ(6,"div",10),e.TgZ(7,"textarea",173),e._uU(8,"              "),e.qZA(),e.TgZ(9,"input",174),e.NdJ("change",function(c){return e.CHM(t),e.oxw(2).fileUpload(c.target.files,"ssl_cert")}),e.qZA(),e.YNc(10,d1,2,0,"span",15),e.YNc(11,Yh,2,0,"span",15),e.qZA(),e.qZA()}if(2&n){const t=e.oxw(2),o=e.MAs(7);e.xp6(10),e.Q6J("ngIf",t.serviceForm.showError("ssl_cert",o,"required")),e.xp6(1),e.Q6J("ngIf",t.serviceForm.showError("ssl_cert",o,"pattern"))}}function xm(n,s){1&n&&(e.TgZ(0,"span",27),e.SDv(1,181),e.qZA())}function sv(n,s){1&n&&(e.TgZ(0,"span",27),e.SDv(1,182),e.qZA())}function Cb(n,s){if(1&n){const t=e.EpF();e.TgZ(0,"div",7),e.TgZ(1,"label",177),e.TgZ(2,"span"),e.SDv(3,178),e.qZA(),e.TgZ(4,"cd-helper"),e.SDv(5,179),e.qZA(),e.qZA(),e.TgZ(6,"div",10),e.TgZ(7,"textarea",180),e._uU(8,"              "),e.qZA(),e.TgZ(9,"input",174),e.NdJ("change",function(c){return e.CHM(t),e.oxw(2).fileUpload(c.target.files,"ssl_key")}),e.qZA(),e.YNc(10,xm,2,0,"span",15),e.YNc(11,sv,2,0,"span",15),e.qZA(),e.qZA()}if(2&n){const t=e.oxw(2),o=e.MAs(7);e.xp6(10),e.Q6J("ngIf",t.serviceForm.showError("ssl_key",o,"required")),e.xp6(1),e.Q6J("ngIf",t.serviceForm.showError("ssl_key",o,"pattern"))}}const I0=function(){return["rgw","ingress"]};function f1(n,s){if(1&n&&(e.ynx(0),e.TgZ(1,"div",7),e.TgZ(2,"div",17),e.TgZ(3,"div",18),e._UZ(4,"input",167),e.TgZ(5,"label",168),e.SDv(6,169),e.qZA(),e.qZA(),e.qZA(),e.qZA(),e.YNc(7,wm,12,2,"div",16),e.YNc(8,Cb,12,2,"div",16),e.BQk()),2&n){const t=e.oxw();e.xp6(7),e.Q6J("ngIf",t.serviceForm.controls.ssl.value),e.xp6(1),e.Q6J("ngIf",t.serviceForm.controls.ssl.value&&!e.DdM(2,I0).includes(t.serviceForm.controls.service_type.value))}}const Mb=function(){return["rgw","iscsi","ingress"]};let av=(()=>{class n extends Oa.E{constructor(t,o,c,g,C,D,P,j,W){super(),this.actionLabels=t,this.cephServiceService=o,this.formBuilder=c,this.hostService=g,this.poolService=C,this.router=D,this.taskWrapperService=P,this.route=j,this.activeModal=W,this.RGW_SVC_ID_PATTERN=/^([^.]+)(\.([^.]+)\.([^.]+))?$/,this.SNMP_DESTINATION_PATTERN=/^[^\:]+:[0-9]/,this.SNMP_ENGINE_ID_PATTERN=/^[0-9A-Fa-f]{10,64}/g,this.INGRESS_SUPPORTED_SERVICE_TYPES=["rgw","nfs"],this.hiddenServices=[],this.editing=!1,this.serviceTypes=[],this.serviceIds=[],this.labelClick=new yp.xQ,this.labelFocus=new yp.xQ,this.services=[],this.searchLabels=re=>(0,Bd.T)(re.pipe(Gf(200),(0,Df.x)()),this.labelFocus,this.labelClick.pipe((0,tp.h)(()=>!this.typeahead.isPopupOpen()))).pipe((0,su.U)(ie=>this.labels.filter(ge=>ge.toLowerCase().indexOf(ie.toLowerCase())>-1).slice(0,10))),this.resource="service",this.hosts={options:[],messages:new Fc.a({empty:"There are no hosts.",filter:"Filter hosts"})},this.createForm()}createForm(){this.serviceForm=this.formBuilder.group({service_type:[null,[vn.kI.required]],service_id:[null,[ds.h.requiredIf({service_type:"mds"}),ds.h.requiredIf({service_type:"nfs"}),ds.h.requiredIf({service_type:"iscsi"}),ds.h.requiredIf({service_type:"ingress"}),ds.h.composeIf({service_type:"rgw"},[vn.kI.required,ds.h.custom("rgwPattern",t=>!Ar().isEmpty(t)&&!this.RGW_SVC_ID_PATTERN.test(t))]),ds.h.custom("uniqueName",t=>this.serviceIds&&this.serviceIds.includes(t))]],placement:["hosts"],label:[null,[ds.h.requiredIf({placement:"label",unmanaged:!1})]],hosts:[[]],count:[null,[ds.h.number(!1)]],unmanaged:[!1],pool:[null,[ds.h.requiredIf({service_type:"iscsi"})]],rgw_frontend_port:[null,[ds.h.number(!1)]],trusted_ip_list:[null],api_port:[null,[ds.h.number(!1)]],api_user:[null,[ds.h.requiredIf({service_type:"iscsi",unmanaged:!1})]],api_password:[null,[ds.h.requiredIf({service_type:"iscsi",unmanaged:!1})]],backend_service:[null,[ds.h.requiredIf({service_type:"ingress"})]],virtual_ip:[null,[ds.h.requiredIf({service_type:"ingress"})]],frontend_port:[null,[ds.h.number(!1),ds.h.requiredIf({service_type:"ingress"})]],monitor_port:[null,[ds.h.number(!1),ds.h.requiredIf({service_type:"ingress"})]],virtual_interface_networks:[null],ssl:[!1],ssl_cert:["",[ds.h.composeIf({service_type:"rgw",unmanaged:!1,ssl:!0},[vn.kI.required,ds.h.pemCert()]),ds.h.composeIf({service_type:"iscsi",unmanaged:!1,ssl:!0},[vn.kI.required,ds.h.sslCert()]),ds.h.composeIf({service_type:"ingress",unmanaged:!1,ssl:!0},[vn.kI.required,ds.h.pemCert()])]],ssl_key:["",[ds.h.composeIf({service_type:"iscsi",unmanaged:!1,ssl:!0},[vn.kI.required,ds.h.sslPrivKey()])]],snmp_version:[null,[ds.h.requiredIf({service_type:"snmp-gateway"})]],snmp_destination:[null,{validators:[ds.h.requiredIf({service_type:"snmp-gateway"}),ds.h.custom("snmpDestinationPattern",t=>!Ar().isEmpty(t)&&!this.SNMP_DESTINATION_PATTERN.test(t))]}],engine_id:[null,[ds.h.requiredIf({service_type:"snmp-gateway"}),ds.h.custom("snmpEngineIdPattern",t=>!Ar().isEmpty(t)&&!this.SNMP_ENGINE_ID_PATTERN.test(t))]],auth_protocol:["SHA",[ds.h.requiredIf({service_type:"snmp-gateway"})]],privacy_protocol:[null],snmp_community:[null,[ds.h.requiredIf({snmp_version:"V2c"})]],snmp_v3_auth_username:[null,[ds.h.requiredIf({service_type:"snmp-gateway"})]],snmp_v3_auth_password:[null,[ds.h.requiredIf({service_type:"snmp-gateway"})]],snmp_v3_priv_password:[null,[ds.h.requiredIf({privacy_protocol:{op:"!empty"}})]]})}ngOnInit(){this.action=this.actionLabels.CREATE,this.router.url.includes("services/(modal:create")?this.pageURL="services":this.router.url.includes("services/(modal:edit")&&(this.editing=!0,this.pageURL="services",this.route.params.subscribe(t=>{this.serviceName=t.name,this.serviceType=t.type})),this.cephServiceService.list().subscribe(t=>{this.serviceList=t,this.services=t.filter(o=>this.INGRESS_SUPPORTED_SERVICE_TYPES.includes(o.service_type))}),this.cephServiceService.getKnownTypes().subscribe(t=>{this.hiddenServices.push("osd","container"),this.serviceTypes=Ar().difference(t,this.hiddenServices).sort()}),this.hostService.list("false").subscribe(t=>{const o=[];Ar().forEach(t,c=>{if(Ar().get(c,"sources.orchestrator",!1)){const g=new ch.$(!1,Ar().get(c,"hostname"),"");o.push(g)}}),this.hosts.options=[...o]}),this.hostService.getLabels().subscribe(t=>{this.labels=t}),this.poolService.getList().subscribe(t=>{this.pools=t}),this.editing&&(this.action=this.actionLabels.EDIT,this.disableForEditing(this.serviceType),this.cephServiceService.list(this.serviceName).subscribe(t=>{var o,c,g,C,D,P,j,W,re,ie,ge,_e,Le;if(["service_type","service_id","unmanaged"].forEach(ke=>{this.serviceForm.get(ke).setValue(t[0][ke])}),!t[0].unmanaged){const ke=Object.keys(t[0].placement)[0];let xe;xe=["hosts","label"].indexOf(ke)>=0?ke:"hosts",this.serviceForm.get("placement").setValue(xe),this.serviceForm.get("count").setValue(t[0].placement.count),(null===(o=t[0])||void 0===o?void 0:o.placement[xe])&&this.serviceForm.get(xe).setValue(null===(c=t[0])||void 0===c?void 0:c.placement[xe])}switch(this.serviceType){case"iscsi":["pool","api_password","api_user","trusted_ip_list","api_port"].forEach(pt=>{this.serviceForm.get(pt).setValue(t[0].spec[pt])}),this.serviceForm.get("ssl").setValue(null===(g=t[0].spec)||void 0===g?void 0:g.api_secure),(null===(C=t[0].spec)||void 0===C?void 0:C.api_secure)&&(this.serviceForm.get("ssl_cert").setValue(null===(D=t[0].spec)||void 0===D?void 0:D.ssl_cert),this.serviceForm.get("ssl_key").setValue(null===(P=t[0].spec)||void 0===P?void 0:P.ssl_key));break;case"rgw":this.serviceForm.get("rgw_frontend_port").setValue(null===(j=t[0].spec)||void 0===j?void 0:j.rgw_frontend_port),this.serviceForm.get("ssl").setValue(null===(W=t[0].spec)||void 0===W?void 0:W.ssl),(null===(re=t[0].spec)||void 0===re?void 0:re.ssl)&&this.serviceForm.get("ssl_cert").setValue(null===(ie=t[0].spec)||void 0===ie?void 0:ie.rgw_frontend_ssl_certificate);break;case"ingress":["backend_service","virtual_ip","frontend_port","monitor_port","virtual_interface_networks","ssl"].forEach(pt=>{this.serviceForm.get(pt).setValue(t[0].spec[pt])}),(null===(ge=t[0].spec)||void 0===ge?void 0:ge.ssl)&&(this.serviceForm.get("ssl_cert").setValue(null===(_e=t[0].spec)||void 0===_e?void 0:_e.ssl_cert),this.serviceForm.get("ssl_key").setValue(null===(Le=t[0].spec)||void 0===Le?void 0:Le.ssl_key));break;case"snmp-gateway":["snmp_version","snmp_destination"].forEach(pt=>{this.serviceForm.get(pt).setValue(t[0].spec[pt])}),"V3"===this.serviceForm.getValue("snmp_version")?["engine_id","auth_protocol","privacy_protocol","snmp_v3_auth_username","snmp_v3_auth_password","snmp_v3_priv_password"].forEach(ht=>{null!==ht&&("snmp_v3_auth_username"===ht||"snmp_v3_auth_password"===ht||"snmp_v3_priv_password"===ht?this.serviceForm.get(ht).setValue(t[0].spec.credentials[ht]):this.serviceForm.get(ht).setValue(t[0].spec[ht]))}):this.serviceForm.get("snmp_community").setValue(t[0].spec.credentials.snmp_community)}}))}getServiceIds(t){this.serviceIds=this.serviceList.filter(o=>o.service_type===t).map(o=>o.service_id)}disableForEditing(t){switch(["service_type","service_id"].forEach(c=>{this.serviceForm.get(c).disable()}),t){case"ingress":this.serviceForm.get("backend_service").disable()}}fileUpload(t,o){const c=t[0],g=new FileReader;g.addEventListener("load",C=>{const D=this.serviceForm.get(o);D.setValue(C.target.result),D.markAsDirty(),D.markAsTouched(),D.updateValueAndValidity()}),g.readAsText(c,"utf8")}prePopulateId(){const t=this.serviceForm.get("service_id"),o=this.serviceForm.getValue("backend_service");t.reset({value:o,disabled:!0})}onSubmit(){var t,o,c,g,C;const D=this,P=this.serviceForm.getRawValue(),j=P.service_type;let W=`service/${ki.MQ.CREATE}`;this.editing&&(W=`service/${ki.MQ.EDIT}`);const re={service_type:j,placement:{},unmanaged:P.unmanaged};let ie;if("rgw"===j){const Le=P.service_id.match(this.RGW_SVC_ID_PATTERN);ie=Le[1],Le[3]&&(re.rgw_realm=Le[3],re.rgw_zone=Le[4])}else ie=P.service_id;const ge=ie;let _e=j;switch(Ar().isString(ge)&&!Ar().isEmpty(ge)&&(_e=`${j}.${ge}`,re.service_id=ge),j){case"ingress":re.backend_service=P.backend_service,re.service_id=P.backend_service,Ar().isNumber(P.frontend_port)&&P.frontend_port>0&&(re.frontend_port=P.frontend_port),Ar().isString(P.virtual_ip)&&!Ar().isEmpty(P.virtual_ip)&&(re.virtual_ip=P.virtual_ip.trim()),Ar().isNumber(P.monitor_port)&&P.monitor_port>0&&(re.monitor_port=P.monitor_port);break;case"iscsi":re.pool=P.pool;break;case"snmp-gateway":re.credentials={},re.snmp_version=P.snmp_version,re.snmp_destination=P.snmp_destination,"V3"===P.snmp_version?(re.engine_id=P.engine_id,re.auth_protocol=P.auth_protocol,re.credentials.snmp_v3_auth_username=P.snmp_v3_auth_username,re.credentials.snmp_v3_auth_password=P.snmp_v3_auth_password,null!==P.privacy_protocol&&(re.privacy_protocol=P.privacy_protocol,re.credentials.snmp_v3_priv_password=P.snmp_v3_priv_password)):re.credentials.snmp_community=P.snmp_community}if(!P.unmanaged){switch(P.placement){case"hosts":P.hosts.length>0&&(re.placement.hosts=P.hosts);break;case"label":re.placement.label=P.label}switch(Ar().isNumber(P.count)&&P.count>0&&(re.placement.count=P.count),j){case"rgw":Ar().isNumber(P.rgw_frontend_port)&&P.rgw_frontend_port>0&&(re.rgw_frontend_port=P.rgw_frontend_port),re.ssl=P.ssl,P.ssl&&(re.rgw_frontend_ssl_certificate=null===(t=P.ssl_cert)||void 0===t?void 0:t.trim());break;case"iscsi":Ar().isString(P.trusted_ip_list)&&!Ar().isEmpty(P.trusted_ip_list)&&(re.trusted_ip_list=P.trusted_ip_list.trim()),Ar().isNumber(P.api_port)&&P.api_port>0&&(re.api_port=P.api_port),re.api_user=P.api_user,re.api_password=P.api_password,re.api_secure=P.ssl,P.ssl&&(re.ssl_cert=null===(o=P.ssl_cert)||void 0===o?void 0:o.trim(),re.ssl_key=null===(c=P.ssl_key)||void 0===c?void 0:c.trim());break;case"ingress":re.ssl=P.ssl,P.ssl&&(re.ssl_cert=null===(g=P.ssl_cert)||void 0===g?void 0:g.trim(),re.ssl_key=null===(C=P.ssl_key)||void 0===C?void 0:C.trim()),re.virtual_interface_networks=P.virtual_interface_networks}}this.taskWrapperService.wrapTaskAroundCall({task:new cl.R(W,{service_name:_e}),call:this.editing?this.cephServiceService.update(re):this.cephServiceService.create(re)}).subscribe({error(){D.serviceForm.setErrors({cdSubmitButton:!0})},complete:()=>{"services"===this.pageURL?this.router.navigate([this.pageURL,{outlets:{modal:null}}]):this.activeModal.close()}})}clearValidations(){const t=this.serviceForm.getValue("snmp_version"),o=this.serviceForm.getValue("privacy_protocol");"V3"===t?this.serviceForm.get("snmp_community").clearValidators():(this.serviceForm.get("engine_id").clearValidators(),this.serviceForm.get("auth_protocol").clearValidators(),this.serviceForm.get("privacy_protocol").clearValidators(),this.serviceForm.get("snmp_v3_auth_username").clearValidators(),this.serviceForm.get("snmp_v3_auth_password").clearValidators()),null===o&&this.serviceForm.get("snmp_v3_priv_password").clearValidators()}}return n.\u0275fac=function(t){return new(t||n)(e.Y36(ki.p4),e.Y36(Qt),e.Y36(id.O),e.Y36(ql),e.Y36(V_.q),e.Y36(Yo.F0),e.Y36(Ll.P),e.Y36(Yo.gz),e.Y36(lt.Kz))},n.\u0275cmp=e.Xpm({type:n,selectors:[["cd-service-form"]],viewQuery:function(t,o){if(1&t&&e.Gf(lt.dR,5),2&t){let c;e.iGM(c=e.CRH())&&(o.typeahead=c.first)}},inputs:{hiddenServices:"hiddenServices",editing:"editing",serviceName:"serviceName",serviceType:"serviceType"},features:[e.qOj],decls:41,vars:31,consts:function(){let s,t,o,c,g,C,D,P,j,W,re,ie,ge,_e,Le,Re,ke,xe,U,pt,ht,wt,It,dn,Lt,Dn,Mn,$r,ur,Pr,xr,fn,Nn,$n,Qn,Tn,Yr,ji,ii,Ui,Jr,An,hn,qr,Ri,qi,Zo,bo,Ys,Ws,wi,lo,go,Ge,St,Et,Bn,_r,Gr,xi,Zs,jo,sl,ml,nu,Xu,Pf,Fl,qc,up,Eh,Wp,Th,ru,Zc,Ip,Yi,lr,mi,eo,Lo,Xo,rs,us,ma,Ka,xu,Kn,Pi,as,Zi,xs,is,hu,Al;return s="" + "\ufffd0\ufffd" + " " + "\ufffd1\ufffd" + "",t="Type",o="-- Select a service type --",c="Unmanaged",g="This field is required.",C="Backend Service",D="Loading...",P="-- No service available --",j="-- Select an existing service --",W="This field is required.",re="Id",ie="This field is required.",ge="This service id is already in use.",_e="The value does not match the pattern " + "\ufffd#2\ufffd" + "<service_id>[.<realm_name>.<zone_name>]" + "\ufffd/#2\ufffd" + ".",Le="Placement",Re="Hosts",ke="Label",xe="Label",U="This field is required.",pt="Hosts",ht="Count",wt="Only that number of daemons will be created.",It="The value must be at least 1.",dn="The entered value needs to be a number.",Lt="Port",Dn="The entered value needs to be a number.",Mn="The value must be at least 1.",$r="The value cannot exceed 65535.",ur="Pool",Pr="Loading...",xr="-- No pools available --",fn="-- Select a pool --",Nn="This field is required.",$n="Trusted IPs",Qn="Comma separated list of IP addresses.",Tn="Please add the " + "\ufffd#11\ufffd" + "Ceph Manager" + "\ufffd/#11\ufffd" + " IP addresses here, otherwise the iSCSI gateways can't be reached.",Yr="Port",ji="User",ii="Password",Ui="The entered value needs to be a number.",Jr="The value must be at least 1.",An="The value cannot exceed 65535.",hn="This field is required.",qr="This field is required.",Ri="Virtual IP",qi="The virtual IP address and subnet (in CIDR notation) where the ingress service will be available.",Zo="Frontend Port",bo="The port used to access the ingress service.",Ys="Monitor Port",Ws="The port used by haproxy for load balancer status.",wi="This field is required.",lo="The entered value needs to be a number.",go="The value must be at least 1.",Ge="The value cannot exceed 65535.",St="This field is required.",Et="The entered value needs to be a number.",Bn="The value must be at least 1.",_r="The value cannot exceed 65535.",Gr="This field is required.",xi="CIDR Networks",Zs="A list of networks to identify which network interface to use for the virtual IP address.",jo="Version",sl="-- Select SNMP version --",ml="Destination",nu="Must be of the format hostname:port.",Xu="Credentials",Pf="This field is required.",Fl="This field is required.",qc="The value does not match the pattern: " + "\ufffd#2\ufffd" + "hostname:port" + "\ufffd/#2\ufffd" + "",up="Engine Id",Eh="Unique identifier for the device (in hex).",Wp="This field is required.",Th="The value does not match the pattern: " + "\ufffd#2\ufffd" + "Must be in hexadecimal and length must be multiple of 2 with min value = 10 amd max value = 64." + "\ufffd/#2\ufffd" + "",ru="Auth Protocol",Zc="-- Select auth protocol --",Ip="This field is required.",Yi="Privacy Protocol",lr="-- Select privacy protocol --",mi="SNMP Community",eo="This field is required.",Lo="Username",Xo="This field is required.",rs="Password",us="This field is required.",ma="Encryption",Ka="This field is required.",xu="SSL",Kn="Certificate",Pi="The SSL certificate in PEM format.",as="This field is required.",Zi="Invalid SSL certificate.",xs="Private key",is="The SSL private key in PEM format.",hu="This field is required.",Al="Invalid SSL private key.",[[3,"pageURL","modalRef"],[1,"modal-title"],s,[1,"modal-content"],["novalidate","",3,"formGroup"],["frm","ngForm"],[1,"modal-body"],[1,"form-group","row"],["for","service_type",1,"cd-col-form-label","required"],t,[1,"cd-col-form-input"],["id","service_type","name","service_type","formControlName","service_type",1,"form-control",3,"change"],[3,"ngValue"],o,[3,"value",4,"ngFor","ngForOf"],["class","invalid-feedback",4,"ngIf"],["class","form-group row",4,"ngIf"],[1,"cd-col-form-offset"],[1,"custom-control","custom-checkbox"],["id","unmanaged","type","checkbox","formControlName","unmanaged",1,"custom-control-input"],["for","unmanaged",1,"custom-control-label"],c,[4,"ngIf"],[1,"modal-footer"],[1,"text-right"],[3,"form","submitText","submitActionEvent"],[3,"value"],[1,"invalid-feedback"],g,["for","backend_service",1,"cd-col-form-label",3,"ngClass"],C,["id","backend_service","name","backend_service","formControlName","backend_service",1,"form-control",3,"change"],[3,"ngValue",4,"ngIf"],D,P,j,W,["for","service_id",1,"cd-col-form-label",3,"ngClass"],re,["id","service_id","type","text","formControlName","service_id",1,"form-control"],ie,ge,_e,["for","placement",1,"cd-col-form-label"],Le,["id","placement","formControlName","placement",1,"form-control"],["value","hosts"],Re,["value","label"],ke,["for","label",1,"cd-col-form-label"],xe,["id","label","type","text","formControlName","label",1,"form-control",3,"ngbTypeahead","focus","click"],U,["for","hosts",1,"cd-col-form-label"],pt,["id","hosts",3,"data","options","messages"],["for","count",1,"cd-col-form-label"],ht,wt,["id","count","type","number","formControlName","count","min","1",1,"form-control"],It,dn,["for","rgw_frontend_port",1,"cd-col-form-label"],Lt,["id","rgw_frontend_port","type","number","formControlName","rgw_frontend_port","min","1","max","65535",1,"form-control"],Dn,Mn,$r,["for","pool",1,"cd-col-form-label","required"],ur,["id","pool","name","pool","formControlName","pool",1,"form-control"],Pr,xr,fn,Nn,["for","trusted_ip_list",1,"cd-col-form-label"],$n,Qn,Tn,["id","trusted_ip_list","type","text","formControlName","trusted_ip_list",1,"form-control"],["for","api_port",1,"cd-col-form-label"],Yr,["id","api_port","type","number","formControlName","api_port","min","1","max","65535",1,"form-control"],["for","api_user",1,"cd-col-form-label",3,"ngClass"],ji,["id","api_user","type","text","formControlName","api_user",1,"form-control"],["for","api_password",1,"cd-col-form-label",3,"ngClass"],ii,[1,"input-group"],["id","api_password","type","password","autocomplete","new-password","formControlName","api_password",1,"form-control"],[1,"input-group-append"],["type","button","cdPasswordButton","api_password",1,"btn","btn-light"],["source","api_password"],Ui,Jr,An,hn,qr,["for","virtual_ip",1,"cd-col-form-label",3,"ngClass"],Ri,qi,["id","virtual_ip","type","text","formControlName","virtual_ip",1,"form-control"],["for","frontend_port",1,"cd-col-form-label",3,"ngClass"],Zo,bo,["id","frontend_port","type","number","formControlName","frontend_port","min","1","max","65535",1,"form-control"],["for","monitor_port",1,"cd-col-form-label",3,"ngClass"],Ys,Ws,["id","monitor_port","type","number","formControlName","monitor_port","min","1","max","65535",1,"form-control"],wi,lo,go,Ge,St,Et,Bn,_r,Gr,["for","virtual_interface_networks",1,"cd-col-form-label"],xi,Zs,["id","virtual_interface_networks","type","text","formControlName","virtual_interface_networks",1,"form-control"],["for","snmp_version",1,"cd-col-form-label","required"],jo,["id","snmp_version","name","snmp_version","formControlName","snmp_version",1,"form-control",3,"change"],sl,["for","snmp_destination",1,"cd-col-form-label","required"],ml,nu,["id","snmp_destination","type","text","formControlName","snmp_destination",1,"form-control"],Xu,Pf,Fl,qc,["for","engine_id",1,"cd-col-form-label","required"],up,Eh,["id","engine_id","type","text","formControlName","engine_id",1,"form-control"],Wp,Th,["for","auth_protocol",1,"cd-col-form-label","required"],ru,["id","auth_protocol","name","auth_protocol","formControlName","auth_protocol",1,"form-control"],Zc,Ip,["for","privacy_protocol",1,"cd-col-form-label"],Yi,["id","privacy_protocol","name","privacy_protocol","formControlName","privacy_protocol",1,"form-control"],lr,["for","snmp_community",1,"cd-col-form-label","required"],mi,["id","snmp_community","type","text","formControlName","snmp_community",1,"form-control"],eo,["for","snmp_v3_auth_username",1,"cd-col-form-label","required"],Lo,["id","snmp_v3_auth_username","type","text","formControlName","snmp_v3_auth_username",1,"form-control"],Xo,["for","snmp_v3_auth_password",1,"cd-col-form-label","required"],rs,["id","snmp_v3_auth_password","type","password","formControlName","snmp_v3_auth_password",1,"form-control"],us,["for","snmp_v3_priv_password",1,"cd-col-form-label","required"],ma,["id","snmp_v3_priv_password","type","password","formControlName","snmp_v3_priv_password",1,"form-control"],Ka,["id","ssl","type","checkbox","formControlName","ssl",1,"custom-control-input"],["for","ssl",1,"custom-control-label"],xu,["for","ssl_cert",1,"cd-col-form-label"],Kn,Pi,["id","ssl_cert","formControlName","ssl_cert","rows","5",1,"form-control","resize-vertical","text-monospace","text-pre"],["type","file",3,"change"],as,Zi,["for","ssl_key",1,"cd-col-form-label"],xs,is,["id","ssl_key","formControlName","ssl_key","rows","5",1,"form-control","resize-vertical","text-monospace","text-pre"],hu,Al]},template:function(t,o){if(1&t&&(e.TgZ(0,"cd-modal",0),e.TgZ(1,"span",1),e.SDv(2,2),e.ALo(3,"titlecase"),e.ALo(4,"upperFirst"),e.qZA(),e.ynx(5,3),e.TgZ(6,"form",4,5),e.TgZ(8,"div",6),e.TgZ(9,"div",7),e.TgZ(10,"label",8),e.SDv(11,9),e.qZA(),e.TgZ(12,"div",10),e.TgZ(13,"select",11),e.NdJ("change",function(g){return o.getServiceIds(g.target.value)}),e.TgZ(14,"option",12),e.SDv(15,13),e.qZA(),e.YNc(16,Rf,2,2,"option",14),e.qZA(),e.YNc(17,dh,2,0,"span",15),e.qZA(),e.qZA(),e.YNc(18,fh,10,9,"div",16),e.YNc(19,Eg,8,7,"div",16),e.TgZ(20,"div",7),e.TgZ(21,"div",17),e.TgZ(22,"div",18),e._UZ(23,"input",19),e.TgZ(24,"label",20),e.SDv(25,21),e.qZA(),e.qZA(),e.qZA(),e.qZA(),e.YNc(26,kg,9,0,"div",16),e.YNc(27,Ep,6,2,"div",16),e.YNc(28,ph,5,3,"div",16),e.YNc(29,Am,10,2,"div",16),e.YNc(30,Tp,9,3,"ng-container",22),e.YNc(31,Sg,10,5,"div",16),e.YNc(32,Mg,38,13,"ng-container",22),e.YNc(33,G,38,22,"ng-container",22),e.YNc(34,jp,31,13,"ng-container",22),e.YNc(35,f1,9,3,"ng-container",22),e.qZA(),e.TgZ(36,"div",23),e.TgZ(37,"div",24),e.TgZ(38,"cd-form-button-panel",25),e.NdJ("submitActionEvent",function(){return o.onSubmit()}),e.ALo(39,"titlecase"),e.ALo(40,"upperFirst"),e.qZA(),e.qZA(),e.qZA(),e.qZA(),e.BQk(),e.qZA()),2&t){const c=e.MAs(7);e.Q6J("pageURL",o.pageURL)("modalRef",o.activeModal),e.xp6(4),e.pQV(e.lcZ(3,22,o.action))(e.lcZ(4,24,o.resource)),e.QtT(2),e.xp6(2),e.Q6J("formGroup",o.serviceForm),e.xp6(8),e.Q6J("ngValue",null),e.xp6(2),e.Q6J("ngForOf",o.serviceTypes),e.xp6(1),e.Q6J("ngIf",o.serviceForm.showError("service_type",c,"required")),e.xp6(1),e.Q6J("ngIf","ingress"===o.serviceForm.controls.service_type.value),e.xp6(1),e.Q6J("ngIf","snmp-gateway"!==o.serviceForm.controls.service_type.value),e.xp6(7),e.Q6J("ngIf",!o.serviceForm.controls.unmanaged.value),e.xp6(1),e.Q6J("ngIf",!o.serviceForm.controls.unmanaged.value&&"label"===o.serviceForm.controls.placement.value),e.xp6(1),e.Q6J("ngIf",!o.serviceForm.controls.unmanaged.value&&"hosts"===o.serviceForm.controls.placement.value),e.xp6(1),e.Q6J("ngIf",!o.serviceForm.controls.unmanaged.value),e.xp6(1),e.Q6J("ngIf",!o.serviceForm.controls.unmanaged.value&&"rgw"===o.serviceForm.controls.service_type.value),e.xp6(1),e.Q6J("ngIf","iscsi"===o.serviceForm.controls.service_type.value),e.xp6(1),e.Q6J("ngIf",!o.serviceForm.controls.unmanaged.value&&"iscsi"===o.serviceForm.controls.service_type.value),e.xp6(1),e.Q6J("ngIf","ingress"===o.serviceForm.controls.service_type.value),e.xp6(1),e.Q6J("ngIf","snmp-gateway"===o.serviceForm.controls.service_type.value),e.xp6(1),e.Q6J("ngIf",!o.serviceForm.controls.unmanaged.value&&e.DdM(30,Mb).includes(o.serviceForm.controls.service_type.value)),e.xp6(3),e.Q6J("form",o.serviceForm)("submitText",e.lcZ(39,26,o.action)+" "+e.lcZ(40,28,o.resource))}},directives:[h.z,vn._Y,vn.JL,tl.V,vn.sg,$a.P,ca.o,vn.EJ,Ha.b,vn.JJ,vn.u,vn.YN,vn.Kr,_.sg,_.O5,vn.Wl,nl.p,_.mk,vn.Fj,lt.dR,k.m,E.S,vn.wV,vn.qQ,vn.Fd,u_.C,Uc.s],pipes:[_.rS,K.m],styles:[""]}),n})();function np(n,s){if(1&n&&(e.ynx(0),e._UZ(1,"cd-service-daemon-list",1),e.BQk()),2&n){const t=e.oxw();e.xp6(1),e.Q6J("serviceName",t.selection.service_name)}}let lv=(()=>{class n{}return n.\u0275fac=function(t){return new(t||n)},n.\u0275cmp=e.Xpm({type:n,selectors:[["cd-service-details"]],inputs:{permissions:"permissions",selection:"selection"},decls:1,vars:1,consts:[[4,"ngIf"],[3,"serviceName"]],template:function(t,o){1&t&&e.YNc(0,np,2,1,"ng-container",0),2&t&&e.Q6J("ngIf",o.selection)},directives:[_.O5,Ah],styles:[""]}),n})();function uv(n,s){1&n&&e._UZ(0,"cd-orchestrator-doc-panel")}function Dm(n,s){if(1&n){const t=e.EpF();e.ynx(0),e.TgZ(1,"cd-table",2),e.NdJ("fetchData",function(c){return e.CHM(t),e.oxw().getServices(c)})("setExpandedRow",function(c){return e.CHM(t),e.oxw().setExpandedRow(c)})("updateSelection",function(c){return e.CHM(t),e.oxw().updateSelection(c)}),e._UZ(2,"cd-table-actions",3),e._UZ(3,"cd-service-details",4),e.qZA(),e.BQk()}if(2&n){const t=e.oxw();e.xp6(1),e.Q6J("data",t.services)("columns",t.columns)("autoReload",5e3)("hasDetails",t.hasDetails),e.xp6(1),e.Q6J("permission",t.permissions.hosts)("selection",t.selection)("tableActions",t.tableActions),e.xp6(1),e.Q6J("permissions",t.permissions)("selection",t.expandedRow)}}const mc="services";let qd=(()=>{class n extends Gl.o{constructor(t,o,c,g,C,D,P,j){super(),this.actionLabels=t,this.authStorageService=o,this.modalService=c,this.orchService=g,this.cephServiceService=C,this.relativeDatePipe=D,this.taskWrapperService=P,this.router=j,this.hiddenColumns=[],this.hiddenServices=[],this.hasDetails=!0,this.routedModal=!0,this.showDocPanel=!1,this.actionOrchFeatures={create:[fu.SERVICE_CREATE],update:[fu.SERVICE_EDIT],delete:[fu.SERVICE_DELETE]},this.columns=[],this.services=[],this.isLoadingServices=!1,this.selection=new hl.r,this.permissions=this.authStorageService.getPermissions(),this.tableActions=[{permission:"create",icon:No.P.add,click:()=>this.openModal(),name:this.actionLabels.CREATE,canBePrimary:W=>!W.hasSelection,disable:W=>this.getDisable("create",W)},{permission:"update",icon:No.P.edit,click:()=>this.openModal(!0),name:this.actionLabels.EDIT,disable:W=>this.getDisable("update",W)},{permission:"delete",icon:No.P.destroy,click:()=>this.deleteAction(),name:this.actionLabels.DELETE,disable:W=>this.getDisable("delete",W)}]}openModal(t=!1){var o,c,g;if(this.routedModal)this.router.navigate(t?[mc,{outlets:{modal:[ki.MQ.EDIT,this.selection.first().service_type,this.selection.first().service_name]}}]:[mc,{outlets:{modal:[ki.MQ.CREATE]}}]);else{let C={};C=t?{serviceName:null===(o=this.selection.first())||void 0===o?void 0:o.service_name,serviceType:null===(g=null===(c=this.selection)||void 0===c?void 0:c.first())||void 0===g?void 0:g.service_type,hiddenServices:this.hiddenServices,editing:t}:{hiddenServices:this.hiddenServices,editing:t},this.bsModalRef=this.modalService.show(av,C,{size:"lg"})}}ngOnInit(){const t=[{name:"Service",prop:"service_name",flexGrow:1},{name:"Placement",prop:"",pipe:new l_,flexGrow:2},{name:"Running",prop:"status.running",flexGrow:1},{name:"Size",prop:"status.size",flexGrow:1},{name:"Last Refreshed",prop:"status.last_refresh",pipe:this.relativeDatePipe,flexGrow:1}];this.columns=t.filter(o=>!this.hiddenColumns.includes(o.prop)),this.orchService.status().subscribe(o=>{this.orchStatus=o,this.showDocPanel=!o.available})}ngOnChanges(){var t;(null===(t=this.orchStatus)||void 0===t?void 0:t.available)&&(this.services=[],this.table.reloadData())}getDisable(t,o){var c;return"delete"===t&&!(null==o?void 0:o.hasSingleSelection)||"update"===t&&["osd","container"].indexOf(null===(c=this.selection.first())||void 0===c?void 0:c.service_type)>=0||this.orchService.getTableActionDisableDesc(this.orchStatus,this.actionOrchFeatures[t])}getServices(t){this.isLoadingServices||(this.isLoadingServices=!0,this.cephServiceService.list().subscribe(o=>{this.services=o,this.services=this.services.filter(c=>!this.hiddenServices.includes(c.service_name)),this.isLoadingServices=!1},()=>{this.isLoadingServices=!1,this.services=[],t.error()}))}updateSelection(t){this.selection=t}deleteAction(){const t=this.selection.first();this.modalService.show(zl.M,{itemDescription:"Service",itemNames:[t.service_name],actionDescription:"delete",submitActionObservable:()=>this.taskWrapperService.wrapTaskAroundCall({task:new cl.R(`service/${ki.MQ.DELETE}`,{service_name:t.service_name}),call:this.cephServiceService.delete(t.service_name)}).pipe((0,vp.g)(5e3))})}}return n.\u0275fac=function(t){return new(t||n)(e.Y36(ki.p4),e.Y36(_t.j),e.Y36(Ul.Z),e.Y36(Cc),e.Y36(Qt),e.Y36(bt.h),e.Y36(Ll.P),e.Y36(Yo.F0))},n.\u0275cmp=e.Xpm({type:n,selectors:[["cd-services"]],viewQuery:function(t,o){if(1&t&&e.Gf(Hs.a,7),2&t){let c;e.iGM(c=e.CRH())&&(o.table=c.first)}},inputs:{hostname:"hostname",hiddenColumns:"hiddenColumns",hiddenServices:"hiddenServices",hasDetails:"hasDetails",routedModal:"routedModal"},features:[e._Bn([{provide:Sl.F,useValue:new Sl.F(mc)}]),e.qOj,e.TTD],decls:3,vars:2,consts:[[4,"ngIf"],["name","modal"],["identifier","service_name","forceIdentifier","true","columnMode","flex","selectionType","single",3,"data","columns","autoReload","hasDetails","fetchData","setExpandedRow","updateSelection"],[1,"table-actions",3,"permission","selection","tableActions"],["cdTableDetail","",3,"permissions","selection"]],template:function(t,o){1&t&&(e.YNc(0,uv,1,0,"cd-orchestrator-doc-panel",0),e.YNc(1,Dm,4,9,"ng-container",0),e._UZ(2,"router-outlet",1)),2&t&&(e.Q6J("ngIf",o.showDocPanel),e.xp6(1),e.Q6J("ngIf",null==o.orchStatus?null:o.orchStatus.available))},directives:[_.O5,Yo.lC,au,Hs.a,Xs.K,lv],styles:[""]}),n})();const Iu=function(){return["services","status"]};let p1=(()=>{class n{constructor(t,o,c,g,C){this.wizardStepsService=t,this.cephServiceService=o,this.dimlessBinary=c,this.hostService=g,this.osdService=C,this.hosts=[],this.totalCapacity=0,this.services=[],this.totalCPUs=0,this.totalMemory=0}ngOnInit(){var t,o,c;let g=0,C=0,D=0,P=0,j=0,W=0;this.hostService.list("true").subscribe(re=>{this.hosts=re,this.hostsCount=this.hosts.length,Ar().forEach(this.hosts,ie=>{this.totalCPUs=this.totalCPUs+ie.cpu_count,this.totalMemory=this.totalMemory+1024*ie.memory_total_kb}),this.totalMemory=this.dimlessBinary.transform(this.totalMemory)}),this.osdService.osdDevices.data&&(g=null===(t=this.osdService.osdDevices.data)||void 0===t?void 0:t.length,C=this.osdService.osdDevices.data.capacity),this.osdService.osdDevices.wal&&(D=null===(o=this.osdService.osdDevices.wal)||void 0===o?void 0:o.length,P=this.osdService.osdDevices.wal.capacity),this.osdService.osdDevices.db&&(j=null===(c=this.osdService.osdDevices.db)||void 0===c?void 0:c.length,W=this.osdService.osdDevices.db.capacity),this.totalDevices=g+D+j,this.osdService.osdDevices.totalDevices=this.totalDevices,this.totalCapacity=C+P+W}}return n.\u0275fac=function(t){return new(t||n)(e.Y36(Bu),e.Y36(Qt),e.Y36(yn.$),e.Y36(ql),e.Y36(Ji))},n.\u0275cmp=e.Xpm({type:n,selectors:[["cd-create-cluster-review"]],decls:43,vars:12,consts:function(){let s,t,o,c,g,C,D,P;return s="Cluster Resources",t="Hosts",o="Storage Capacity",c="Number of devices",g="Raw capacity",C="CPUs",D="Memory",P="Host Details",[[1,"row"],[1,"col-lg-3"],[1,"cd-header"],s,[1,"table","table-striped"],[1,"bold"],t,o,c,g,[1,"pt-5"],C,D,[1,"col-lg-9"],P,[3,"hiddenColumns","hideToolHeader","hasTableDetails","showGeneralActionsOnly"]]},template:function(t,o){1&t&&(e.TgZ(0,"div",0),e.TgZ(1,"div",1),e.TgZ(2,"fieldset"),e.TgZ(3,"legend",2),e.SDv(4,3),e.qZA(),e.TgZ(5,"table",4),e.TgZ(6,"tr"),e.TgZ(7,"td",5),e.SDv(8,6),e.qZA(),e.TgZ(9,"td"),e._uU(10),e.qZA(),e.qZA(),e.TgZ(11,"tr"),e.TgZ(12,"td"),e.TgZ(13,"dl"),e.TgZ(14,"dt"),e.TgZ(15,"p"),e.SDv(16,7),e.qZA(),e.qZA(),e.TgZ(17,"dd"),e.TgZ(18,"p"),e.SDv(19,8),e.qZA(),e.qZA(),e.TgZ(20,"dd"),e.TgZ(21,"p"),e.SDv(22,9),e.qZA(),e.qZA(),e.qZA(),e.qZA(),e.TgZ(23,"td",10),e.TgZ(24,"p"),e._uU(25),e.qZA(),e.TgZ(26,"p"),e._uU(27),e.ALo(28,"dimlessBinary"),e.qZA(),e.qZA(),e.qZA(),e.TgZ(29,"tr"),e.TgZ(30,"td",5),e.SDv(31,11),e.qZA(),e.TgZ(32,"td"),e._uU(33),e.qZA(),e.qZA(),e.TgZ(34,"tr"),e.TgZ(35,"td",5),e.SDv(36,12),e.qZA(),e.TgZ(37,"td"),e._uU(38),e.qZA(),e.qZA(),e.qZA(),e.qZA(),e.qZA(),e.TgZ(39,"div",13),e.TgZ(40,"legend",2),e.SDv(41,14),e.qZA(),e._UZ(42,"cd-hosts",15),e.qZA(),e.qZA()),2&t&&(e.xp6(10),e.Oqu(o.hostsCount),e.xp6(15),e.Oqu(o.totalDevices),e.xp6(2),e.hij(" ",e.lcZ(28,9,o.totalCapacity),""),e.xp6(6),e.Oqu(o.totalCPUs),e.xp6(5),e.Oqu(o.totalMemory),e.xp6(4),e.Q6J("hiddenColumns",e.DdM(11,Iu))("hideToolHeader",!0)("hasTableDetails",!1)("showGeneralActionsOnly",!0))},directives:[sh],pipes:[yn.$],styles:["cd-hosts[_ngcontent-%COMP%]     .nav{display:none}"]}),n})();const Rm=["skipConfirmTpl"];function vu(n,s){if(1&n){const t=e.EpF();e.TgZ(0,"div",3),e.TgZ(1,"div",4),e.TgZ(2,"div",5),e._UZ(3,"img",6),e.TgZ(4,"h3",7),e.SDv(5,8),e.qZA(),e.TgZ(6,"div",9),e.TgZ(7,"h4",10),e.SDv(8,11),e.qZA(),e.TgZ(9,"div",12),e.TgZ(10,"button",13),e.NdJ("click",function(){return e.CHM(t),e.oxw().createCluster()}),e.SDv(11,14),e.qZA(),e.TgZ(12,"button",15),e.NdJ("click",function(){return e.CHM(t),e.oxw().skipClusterCreation()}),e.SDv(13,16),e.qZA(),e.qZA(),e.qZA(),e.qZA(),e.qZA(),e.qZA()}if(2&n){const t=e.oxw();e.xp6(3),e.Q6J("src",t.projectConstants.cephLogo,e.LSH),e.xp6(2),e.pQV(t.projectConstants.projectName),e.QtT(5)}}const es=function(){return["services"]};function eu(n,s){1&n&&(e.TgZ(0,"div",29),e.TgZ(1,"h4",30),e.SDv(2,31),e.qZA(),e._UZ(3,"br"),e._UZ(4,"cd-hosts",32),e.qZA()),2&n&&(e.xp6(4),e.Q6J("hiddenColumns",e.DdM(4,es))("hideMaintenance",!0)("hasTableDetails",!1)("showGeneralActionsOnly",!0))}function cv(n,s){if(1&n){const t=e.EpF();e.TgZ(0,"div",29),e.TgZ(1,"h4",30),e.SDv(2,33),e.qZA(),e.TgZ(3,"div",34),e.TgZ(4,"cd-osd-form",35),e.NdJ("emitDriveGroup",function(c){return e.CHM(t),e.oxw(2).setDriveGroup(c)})("emitDeploymentOption",function(c){return e.CHM(t),e.oxw(2).setDeploymentOptions(c)})("emitMode",function(c){return e.CHM(t),e.oxw(2).setDeploymentMode(c)}),e.qZA(),e.qZA(),e.qZA()}2&n&&(e.xp6(4),e.Q6J("hideTitle",!0)("hideSubmitBtn",!0))}const Zh=function(){return["mon","mgr","crash","agent"]},Cd=function(){return["status.running","status.size","status.last_refresh"]};function dv(n,s){1&n&&(e.TgZ(0,"div",29),e.TgZ(1,"h4",30),e.SDv(2,36),e.qZA(),e._UZ(3,"br"),e._UZ(4,"cd-services",37),e.qZA()),2&n&&(e.xp6(4),e.Q6J("hasDetails",!1)("hiddenServices",e.DdM(4,Zh))("hiddenColumns",e.DdM(5,Cd))("routedModal",!1))}function Sp(n,s){1&n&&(e.TgZ(0,"div",29),e._UZ(1,"cd-create-cluster-review"),e.qZA())}function Vf(n,s){if(1&n){const t=e.EpF();e.TgZ(0,"div",17),e.TgZ(1,"div",18),e.SDv(2,19),e.qZA(),e.TgZ(3,"div",20),e._UZ(4,"cd-wizard",21),e.TgZ(5,"div",22),e.ynx(6,23),e.YNc(7,eu,5,5,"div",24),e.YNc(8,cv,5,2,"div",24),e.YNc(9,dv,5,6,"div",24),e.YNc(10,Sp,2,0,"div",24),e.BQk(),e.qZA(),e.qZA(),e.TgZ(11,"div",25),e.TgZ(12,"button",26),e.NdJ("click",function(){return e.CHM(t),e.oxw().onNextStep()}),e.SDv(13,27),e.qZA(),e.TgZ(14,"cd-back-button",28),e.NdJ("backAction",function(){return e.CHM(t),e.oxw().onPreviousStep()}),e.qZA(),e.qZA(),e.qZA()}if(2&n){const t=e.oxw();e.xp6(4),e.Q6J("stepsTitle",t.stepTitles),e.xp6(2),e.Q6J("ngSwitch",null==t.currentStep?null:t.currentStep.stepIndex),e.xp6(1),e.Q6J("ngSwitchCase","1"),e.xp6(1),e.Q6J("ngSwitchCase","2"),e.xp6(1),e.Q6J("ngSwitchCase","3"),e.xp6(1),e.Q6J("ngSwitchCase","4"),e.xp6(3),e.pQV(t.showSubmitButtonLabel()),e.QtT(13),e.xp6(1),e.Q6J("name",t.showCancelButtonLabel())}}function fv(n,s){1&n&&(e.TgZ(0,"span"),e.tHW(1,38),e._UZ(2,"strong"),e.N_p(),e.qZA(),e.TgZ(3,"div",39),e.SDv(4,40),e.qZA())}let pv=(()=>{class n{constructor(t,o,c,g,C,D,P,j,W,re){this.authStorageService=t,this.wizardStepsService=o,this.router=c,this.hostService=g,this.notificationService=C,this.actionLabels=D,this.clusterService=P,this.modalService=j,this.taskWrapper=W,this.osdService=re,this.projectConstants=ki.$x,this.stepTitles=["Add Hosts","Create OSDs","Create Services","Review"],this.startClusterCreation=!1,this.observables=[],this.driveGroup=new Xd,this.driveGroups=[],this.selectedOption={},this.simpleDeployment=!0,this.submitAction=new e.vpe,this.permissions=this.authStorageService.getPermissions(),this.currentStepSub=this.wizardStepsService.getCurrentStep().subscribe(ie=>{this.currentStep=ie}),this.currentStep.stepIndex=1}ngOnInit(){this.osdService.getDeploymentOptions().subscribe(t=>{this.deploymentOption=t,this.selectedOption={option:t.recommended_option}})}createCluster(){this.startClusterCreation=!0}skipClusterCreation(){const t={titleText:"Warning",buttonText:"Continue",warning:!0,bodyTpl:this.skipConfirmTpl,showSubmit:!0,onSubmit:()=>{this.clusterService.updateStatus("POST_INSTALLED").subscribe({error:()=>this.modalRef.close(),complete:()=>{this.notificationService.show(_a.k.info,"Cluster expansion skipped by user"),this.router.navigate(["/dashboard"]),this.modalRef.close()}})}};this.modalRef=this.modalService.show(nd.Y,t)}onSubmit(){var t;if(this.hostService.list("false").subscribe(o=>{o.forEach(c=>{const g=c.labels.indexOf("_no_schedule",0);g>-1&&(c.labels.splice(g,1),this.observables.push(this.hostService.update(c.hostname,!0,c.labels)))}),(0,Oc.D)(this.observables).pipe((0,hf.x)(()=>this.clusterService.updateStatus("POST_INSTALLED").subscribe(()=>{this.notificationService.show(_a.k.success,"Cluster expansion was successful"),this.router.navigate(["/dashboard"])}))).subscribe({error:c=>c.preventDefault()})}),this.driveGroup){const o=this.authStorageService.getUsername();this.driveGroup.setName(`dashboard-${o}-${Ar().now()}`),this.driveGroups.push(this.driveGroup.spec)}if(this.simpleDeployment){const o=null===(t=this.deploymentOption)||void 0===t?void 0:t.options[this.selectedOption.option].title,c="" + o + " deployment";this.taskWrapper.wrapTaskAroundCall({task:new cl.R("osd/"+ki.MQ.CREATE,{tracking_id:c}),call:this.osdService.create([this.selectedOption],c,"predefined")}).subscribe({error:g=>g.preventDefault(),complete:()=>{this.submitAction.emit()}})}else if(this.osdService.osdDevices.totalDevices>0){this.driveGroup.setFeature("encrypted",this.selectedOption.encrypted);const o=Ar().join(Ar().map(this.driveGroups,"service_id"),", ");this.taskWrapper.wrapTaskAroundCall({task:new cl.R("osd/"+ki.MQ.CREATE,{tracking_id:o}),call:this.osdService.create(this.driveGroups,o)}).subscribe({error:c=>c.preventDefault(),complete:()=>{this.submitAction.emit(),this.osdService.osdDevices=[]}})}}setDriveGroup(t){this.driveGroup=t}setDeploymentOptions(t){this.selectedOption=t}setDeploymentMode(t){this.simpleDeployment=t}onNextStep(){this.wizardStepsService.isLastStep()?this.onSubmit():(this.wizardStepsService.getCurrentStep().subscribe(t=>{this.currentStep=t}),this.wizardStepsService.moveToNextStep())}onPreviousStep(){this.wizardStepsService.isFirstStep()?this.router.navigate(["/dashboard"]):this.wizardStepsService.moveToPreviousStep()}showSubmitButtonLabel(){return this.wizardStepsService.isLastStep()?"Expand Cluster":this.actionLabels.NEXT}showCancelButtonLabel(){return this.wizardStepsService.isFirstStep()?this.actionLabels.CANCEL:this.actionLabels.BACK}ngOnDestroy(){this.currentStepSub.unsubscribe()}}return n.\u0275fac=function(t){return new(t||n)(e.Y36(_t.j),e.Y36(Bu),e.Y36(Yo.F0),e.Y36(ql),e.Y36(ll.g),e.Y36(ki.p4),e.Y36(wf),e.Y36(Ul.Z),e.Y36(Ll.P),e.Y36(Ji))},n.\u0275cmp=e.Xpm({type:n,selectors:[["cd-create-cluster"]],viewQuery:function(t,o){if(1&t&&e.Gf(Rm,7),2&t){let c;e.iGM(c=e.CRH())&&(o.skipConfirmTpl=c.first)}},outputs:{submitAction:"submitAction"},decls:4,vars:2,consts:function(){let s,t,o,c,g,C,D,P,j,W,re;return s="Welcome to " + "\ufffd0\ufffd" + "",t="Please expand your cluster first",o="Expand Cluster",c="Skip",g="Expand Cluster",C="" + "\ufffd0\ufffd" + "",D="Add Hosts",P="Create OSDs",j="Create Services",W="You are about to skip the cluster expansion process. You\u2019ll need to " + "\ufffd#2\ufffd" + "navigate through the menu to add hosts and services." + "\ufffd/#2\ufffd" + "",re="Are you sure you want to continue?",[["class","container h-75",4,"ngIf"],["class","card",4,"ngIf"],["skipConfirmTpl",""],[1,"container","h-75"],[1,"row","h-100","justify-content-center","align-items-center"],[1,"blank-page"],["alt","Ceph",1,"img-fluid","mx-auto","d-block",3,"src"],[1,"text-center","m-2"],s,[1,"m-4"],[1,"text-center"],t,[1,"offset-md-2"],["name","expand-cluster","aria-label","Expand Cluster",1,"btn","btn-accent","m-2",3,"click"],o,["name","skip-cluster-creation","aria-label","Skip",1,"btn","btn-light",3,"click"],c,[1,"card"],[1,"card-header"],g,[1,"container-fluid"],[3,"stepsTitle"],[1,"card-body","vertical-line"],[3,"ngSwitch"],["class","ml-5",4,"ngSwitchCase"],[1,"card-footer"],["aria-label","Next",1,"btn","btn-accent","m-2","float-right",3,"click"],C,["aria-label","Close",1,"m-2","float-right",3,"name","backAction"],[1,"ml-5"],[1,"title"],D,[3,"hiddenColumns","hideMaintenance","hasTableDetails","showGeneralActionsOnly"],P,[1,"alignForm"],[3,"hideTitle","hideSubmitBtn","emitDriveGroup","emitDeploymentOption","emitMode"],j,[3,"hasDetails","hiddenServices","hiddenColumns","routedModal"],W,[1,"mt-4"],re]},template:function(t,o){1&t&&(e.YNc(0,vu,14,2,"div",0),e.YNc(1,Vf,15,8,"div",1),e.YNc(2,fv,5,0,"ng-template",null,2,e.W1O)),2&t&&(e.Q6J("ngIf",!o.startClusterCreation),e.xp6(1),e.Q6J("ngIf",o.startClusterCreation))},directives:[_.O5,ca.o,rc,_.RF,_.n9,hc.W,sh,a_,qd,p1],styles:[".container-fluid[_ngcontent-%COMP%]{align-items:flex-start;display:flex;padding-left:0;width:100%}cd-hosts[_ngcontent-%COMP%]     .nav{display:none}cd-osd-form[_ngcontent-%COMP%]     .card{border:0}cd-osd-form[_ngcontent-%COMP%]     .accordion{margin-left:-1.5rem}"]}),n})();var Q_=i(83608),Nm=i(46947);const Bg=["tree"],hv=function(n,s,t){return[n,s,t]};function Cp(n,s){if(1&n&&e._UZ(0,"i",12),2&n){const t=e.oxw();e.Q6J("ngClass",e.kEZ(1,hv,t.icons.large,t.icons.spinner,t.icons.spin))}}const Pm=function(){return["in","up"]},_v=function(){return["down","out","destroyed"]},h1=function(n,s){return{"badge-success":n,"badge-danger":s}};function Yg(n,s){if(1&n&&(e.TgZ(0,"span",15),e._uU(1),e.qZA()),2&n){const t=e.oxw().$implicit;e.Q6J("ngClass",e.WLB(4,h1,e.DdM(2,Pm).includes(t.data.status),e.DdM(3,_v).includes(t.data.status))),e.xp6(1),e.hij(" ",t.data.status," ")}}const _1=function(n){return{"type-osd":n}};function gv(n,s){if(1&n&&(e.YNc(0,Yg,2,7,"span",13),e.TgZ(1,"span"),e._uU(2,"\xa0"),e.qZA(),e._UZ(3,"span",14)),2&n){const t=s.$implicit;e.Q6J("ngIf",t.data.status),e.xp6(3),e.Q6J("ngClass",e.VKq(3,_1,"osd"===t.data.type))("innerHTML",t.data.name,e.oJD)}}function g1(n,s){if(1&n&&(e.TgZ(0,"div",16),e.TgZ(1,"legend"),e._uU(2),e.qZA(),e._UZ(3,"cd-table-key-value",17),e.qZA()),2&n){const t=e.oxw();e.xp6(2),e.Oqu(t.metadataTitle),e.xp6(1),e.Q6J("data",t.metadata)}}let Og=(()=>{class n{constructor(t,o){this.crushRuleService=t,this.timerService=o,this.sub=new gu.w,this.icons=No.P,this.loadingIndicator=!0,this.nodes=[],this.treeOptions={useVirtualScroll:!0,nodeHeight:22,actionMapping:{mouse:{click:this.onNodeSelected.bind(this)}}},this.metadataKeyMap={}}ngOnInit(){this.sub=this.timerService.get(()=>this.crushRuleService.getInfo(),5e3).subscribe(t=>{this.loadingIndicator=!1,this.nodes=this.abstractTreeData(t)})}ngOnDestroy(){this.sub.unsubscribe()}abstractTreeData(t){const o=t.nodes||[],c=t.roots||[],g={};if(0===o.length)return[{name:"No nodes!"}];const C=[];return o.reverse().forEach(P=>{c.includes(P.id)&&C.push(P.id),g[P.id]=this.generateTreeLeaf(P,g)}),C.map(P=>g[P])}generateTreeLeaf(t,o){const c=t.id;this.metadataKeyMap[c]=t;const D=[],P={name:t.name+" ("+t.type+")",status:t.status,cdId:c,type:t.type};return t.children&&(t.children.sort().forEach(j=>{D.push(o[j])}),P.children=D),P}onNodeSelected(t,o){if(Il.iM.ACTIVATE(t,o,!0),void 0!==o.data.cdId){const c=this.metadataKeyMap[o.data.cdId],{name:g,type:C}=c,P=(0,ha._T)(c,["name","type","status"]);this.metadata=P,this.metadataTitle=g+" ("+C+")"}else delete this.metadata,delete this.metadataTitle}onUpdateData(){this.tree.treeModel.expandAll()}}return n.\u0275fac=function(t){return new(t||n)(e.Y36(Q_.H),e.Y36(Nm.f))},n.\u0275cmp=e.Xpm({type:n,selectors:[["cd-crushmap"]],viewQuery:function(t,o){if(1&t&&e.Gf(Bg,5),2&t){let c;e.iGM(c=e.CRH())&&(o.tree=c.first)}},decls:14,vars:4,consts:function(){let s;return s="CRUSH map viewer",[[1,"row"],[1,"col-sm-12","col-lg-12"],[1,"card"],[1,"card-header"],s,[1,"card-body"],[1,"col-sm-6","col-lg-6","tree-container"],[3,"ngClass",4,"ngIf"],[3,"nodes","options","updateData"],["tree",""],["treeNodeTemplate",""],["class","col-sm-6 col-lg-6 metadata",4,"ngIf"],[3,"ngClass"],["class","badge",3,"ngClass",4,"ngIf"],[1,"node-name",3,"ngClass","innerHTML"],[1,"badge",3,"ngClass"],[1,"col-sm-6","col-lg-6","metadata"],[3,"data"]]},template:function(t,o){1&t&&(e.TgZ(0,"div",0),e.TgZ(1,"div",1),e.TgZ(2,"div",2),e.TgZ(3,"div",3),e.SDv(4,4),e.qZA(),e.TgZ(5,"div",5),e.TgZ(6,"div",0),e.TgZ(7,"div",6),e.YNc(8,Cp,1,5,"i",7),e.TgZ(9,"tree-root",8,9),e.NdJ("updateData",function(){return o.onUpdateData()}),e.YNc(11,gv,4,5,"ng-template",null,10,e.W1O),e.qZA(),e.qZA(),e.YNc(13,g1,4,2,"div",11),e.qZA(),e.qZA(),e.qZA(),e.qZA(),e.qZA()),2&t&&(e.xp6(8),e.Q6J("ngIf",o.loadingIndicator),e.xp6(1),e.Q6J("nodes",o.nodes)("options",o.treeOptions),e.xp6(4),e.Q6J("ngIf",o.metadata))},directives:[_.O5,Il.qr,_.mk,Vr.b],styles:[".tree-container[_ngcontent-%COMP%]{height:calc(100vh - 200px)}"]}),n})(),Mp=(()=>{class n{constructor(t){this.http=t}getLogs(){return this.http.get("api/logs/all")}validateDashboardUrl(t){return this.http.get(`api/grafana/validation/${t}`)}}return n.\u0275fac=function(t){return new(t||n)(e.LFG(y.eN))},n.\u0275prov=e.Yz7({token:n,factory:n.\u0275fac,providedIn:"root"}),n})();var rp=i(49457);let jh=(()=>{class n{download(t,o){(0,rp.saveAs)(new Blob([t]),o)}}return n.\u0275fac=function(t){return new(t||n)},n.\u0275prov=e.Yz7({token:n,factory:n.\u0275fac,providedIn:"root"}),n})();const Gp=function(n){return[n]};function X_(n,s){if(1&n){const t=e.EpF();e.TgZ(0,"button",5),e.NdJ("click",function(){return e.CHM(t),e.oxw().download("json")}),e._UZ(1,"i",2),e.TgZ(2,"span"),e._uU(3,"JSON"),e.qZA(),e.qZA()}if(2&n){const t=e.oxw();e.xp6(1),e.Q6J("ngClass",e.VKq(1,Gp,t.icons.json))}}function v_(n,s){if(1&n){const t=e.EpF();e.TgZ(0,"button",5),e.NdJ("click",function(){return e.CHM(t),e.oxw().download()}),e._UZ(1,"i",2),e.TgZ(2,"span"),e._uU(3,"Text"),e.qZA(),e.qZA()}if(2&n){const t=e.oxw();e.xp6(1),e.Q6J("ngClass",e.VKq(1,Gp,t.icons.text))}}let Im=(()=>{class n{constructor(t){this.textToDownloadService=t,this.title="Download",this.icons=No.P}download(t){this.fileName=`${this.fileName}_${(new Date).toLocaleDateString()}`,"json"===t?this.textToDownloadService.download(JSON.stringify(this.objectItem,null,2),`${this.fileName}.json`):this.textToDownloadService.download(this.textItem,`${this.fileName}.txt`)}}return n.\u0275fac=function(t){return new(t||n)(e.Y36(jh))},n.\u0275cmp=e.Xpm({type:n,selectors:[["cd-download-button"]],inputs:{objectItem:"objectItem",textItem:"textItem",fileName:"fileName",title:"title"},decls:6,vars:6,consts:[["ngbDropdown","","placement","bottom-right"],["type","button","ngbDropdownToggle","",1,"btn","btn-light","dropdown-toggle-split",3,"title"],[3,"ngClass"],["ngbDropdownMenu",""],["ngbDropdownItem","",3,"click",4,"ngIf"],["ngbDropdownItem","",3,"click"]],template:function(t,o){1&t&&(e.TgZ(0,"div",0),e.TgZ(1,"button",1),e._UZ(2,"i",2),e.qZA(),e.TgZ(3,"div",3),e.YNc(4,X_,4,3,"button",4),e.YNc(5,v_,4,3,"button",4),e.qZA(),e.qZA()),2&t&&(e.xp6(1),e.Q6J("title",o.title),e.xp6(1),e.Q6J("ngClass",e.VKq(4,Gp,o.icons.download)),e.xp6(2),e.Q6J("ngIf",o.objectItem),e.xp6(1),e.Q6J("ngIf",o.textItem))},directives:[lt.jt,ca.o,lt.iD,_.mk,lt.Vi,_.O5,lt.TH],styles:[""]}),n})();var Lm=i(42746);let m1=(()=>{class n{transform(t,o){if(!o)return t;o=this.escapeRegExp(o);const c=new RegExp(o,"gi");return t.match(c)?t.replace(c,"<mark>$&</mark>"):t}escapeRegExp(t){return t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}}return n.\u0275fac=function(t){return new(t||n)},n.\u0275pipe=e.Yjl({name:"searchHighlight",type:n,pure:!0}),n})();function Fm(n,s){1&n&&e.GkF(0)}function Zg(n,s){if(1&n&&(e.TgZ(0,"div",22),e._UZ(1,"cd-download-button",23),e._UZ(2,"cd-copy-2-clipboard-button",24),e.qZA()),2&n){const t=e.oxw(4);e.xp6(1),e.Q6J("objectItem",t.clog)("textItem",t.clogText),e.xp6(1),e.Q6J("source",t.clogText)("byId",!1)}}function mv(n,s){if(1&n&&(e.TgZ(0,"p"),e.TgZ(1,"span",25),e._uU(2),e.ALo(3,"cdDate"),e.qZA(),e.TgZ(4,"span"),e.ALo(5,"logPriority"),e._uU(6),e.qZA(),e._UZ(7,"span",26),e.ALo(8,"searchHighlight"),e.qZA()),2&n){const t=s.$implicit,o=e.oxw(4);e.xp6(2),e.Oqu(e.lcZ(3,6,t.stamp)),e.xp6(2),e.Gre("priority ",e.lcZ(5,8,t.priority),""),e.xp6(2),e.Oqu(t.priority),e.xp6(1),e.Q6J("innerHTML",e.xi3(8,10,t.message,o.search),e.oJD)}}function jg(n,s){1&n&&e.GkF(0)}function I(n,s){if(1&n&&(e.TgZ(0,"div",17),e.YNc(1,Zg,3,4,"div",18),e.TgZ(2,"div",19),e.YNc(3,mv,9,13,"p",20),e.YNc(4,jg,1,0,"ng-container",21),e.qZA(),e.qZA()),2&n){const t=e.oxw(3),o=e.MAs(4);e.xp6(1),e.Q6J("ngIf",t.clog.length),e.xp6(2),e.Q6J("ngForOf",t.clog),e.xp6(1),e.Q6J("ngIf",0!=t.clog.length)("ngIfElse",o)}}function z(n,s){if(1&n&&e.YNc(0,I,5,4,"div",16),2&n){const t=e.oxw(2);e.Q6J("ngIf",t.clog)}}function B(n,s){if(1&n&&(e.TgZ(0,"div",22),e._UZ(1,"cd-download-button",27),e._UZ(2,"cd-copy-2-clipboard-button",24),e.qZA()),2&n){const t=e.oxw(4);e.xp6(1),e.Q6J("objectItem",t.audit_log)("textItem",t.auditLogText),e.xp6(1),e.Q6J("source",t.auditLogText)("byId",!1)}}function Ee(n,s){if(1&n&&(e.TgZ(0,"p"),e.TgZ(1,"span",25),e._uU(2),e.ALo(3,"cdDate"),e.qZA(),e.TgZ(4,"span"),e.ALo(5,"logPriority"),e._uU(6),e.qZA(),e._UZ(7,"span",26),e.ALo(8,"searchHighlight"),e.qZA()),2&n){const t=s.$implicit,o=e.oxw(4);e.xp6(2),e.Oqu(e.lcZ(3,6,t.stamp)),e.xp6(2),e.Gre("priority ",e.lcZ(5,8,t.priority),""),e.xp6(2),e.Oqu(t.priority),e.xp6(1),e.Q6J("innerHTML",e.xi3(8,10,t.message,o.search),e.oJD)}}function at(n,s){1&n&&e.GkF(0)}function Ft(n,s){if(1&n&&(e.TgZ(0,"div",17),e.YNc(1,B,3,4,"div",18),e.TgZ(2,"div",19),e.YNc(3,Ee,9,13,"p",20),e.YNc(4,at,1,0,"ng-container",21),e.qZA(),e.qZA()),2&n){const t=e.oxw(3),o=e.MAs(4);e.xp6(1),e.Q6J("ngIf",t.audit_log.length),e.xp6(2),e.Q6J("ngForOf",t.audit_log),e.xp6(1),e.Q6J("ngIf",0!=t.audit_log.length)("ngIfElse",o)}}function Gn(n,s){if(1&n&&e.YNc(0,Ft,5,4,"div",16),2&n){const t=e.oxw(2);e.Q6J("ngIf",t.audit_log)}}function hr(n,s){1&n&&(e.TgZ(0,"div"),e._UZ(1,"cd-grafana",28),e.qZA()),2&n&&(e.xp6(1),e.Q6J("grafanaPath","explore?")("type","logs"))}function li(n,s){if(1&n&&(e.ynx(0),e.YNc(1,hr,2,2,"div",21),e.ALo(2,"async"),e.BQk()),2&n){const t=e.oxw(3),o=e.MAs(6);e.xp6(1),e.Q6J("ngIf",e.lcZ(2,2,t.promtailServiceStatus$))("ngIfElse",o)}}function Io(n,s){if(1&n&&(e.YNc(0,li,3,4,"ng-container",21),e.ALo(1,"async")),2&n){const t=e.oxw(2),o=e.MAs(6);e.Q6J("ngIf",e.lcZ(1,2,t.lokiServiceStatus$))("ngIfElse",o)}}function Qo(n,s){if(1&n&&(e.TgZ(0,"div"),e.YNc(1,Fm,1,0,"ng-container",4),e.TgZ(2,"ul",5,6),e.TgZ(4,"li",7),e.TgZ(5,"a",8),e.SDv(6,9),e.qZA(),e.YNc(7,z,1,1,"ng-template",10),e.qZA(),e.TgZ(8,"li",11),e.TgZ(9,"a",8),e.SDv(10,12),e.qZA(),e.YNc(11,Gn,1,1,"ng-template",10),e.qZA(),e.TgZ(12,"li",13),e.TgZ(13,"a",8),e.SDv(14,14),e.qZA(),e.YNc(15,Io,2,4,"ng-template",10),e.qZA(),e.qZA(),e._UZ(16,"div",15),e.qZA()),2&n){const t=e.MAs(3);e.oxw();const o=e.MAs(2);e.xp6(1),e.Q6J("ngTemplateOutlet",o),e.xp6(15),e.Q6J("ngbNavOutlet",t)}}function ws(n,s){if(1&n&&(e.TgZ(0,"option",50),e._uU(1),e.qZA()),2&n){const t=s.$implicit;e.Q6J("value",t.value),e.xp6(1),e.Oqu(t.name)}}const Rl=function(n){return[n]};function Tu(n,s){if(1&n){const t=e.EpF();e.TgZ(0,"div",29),e.TgZ(1,"div",30),e.TgZ(2,"label",31),e.SDv(3,32),e.qZA(),e.TgZ(4,"select",33),e.NdJ("ngModelChange",function(c){return e.CHM(t),e.oxw().priority=c})("ngModelChange",function(){return e.CHM(t),e.oxw().filterLogs()}),e.YNc(5,ws,2,2,"option",34),e.qZA(),e.qZA(),e.TgZ(6,"div",30),e.TgZ(7,"label",35),e.SDv(8,36),e.qZA(),e.TgZ(9,"div",37),e.TgZ(10,"div",38),e.TgZ(11,"span",39),e._UZ(12,"i",40),e.qZA(),e.qZA(),e.TgZ(13,"input",41),e.NdJ("ngModelChange",function(c){return e.CHM(t),e.oxw().search=c})("keyup",function(){return e.CHM(t),e.oxw().filterLogs()}),e.qZA(),e.TgZ(14,"div",42),e.TgZ(15,"button",43),e.NdJ("click",function(){return e.CHM(t),e.oxw().clearSearchKey()}),e._UZ(16,"i"),e.qZA(),e.qZA(),e.qZA(),e.qZA(),e.TgZ(17,"div",30),e.TgZ(18,"label",44),e.SDv(19,45),e.qZA(),e.TgZ(20,"div",37),e.TgZ(21,"input",46,47),e.NdJ("click",function(){return e.CHM(t),e.MAs(22).open()})("ngModelChange",function(c){return e.CHM(t),e.oxw().selectedDate=c})("ngModelChange",function(){return e.CHM(t),e.oxw().filterLogs()}),e.qZA(),e.TgZ(23,"span",42),e.TgZ(24,"button",43),e.NdJ("click",function(){return e.CHM(t),e.oxw().clearDate()}),e._UZ(25,"i"),e.qZA(),e.qZA(),e.qZA(),e.qZA(),e.TgZ(26,"div",30),e.TgZ(27,"label"),e.SDv(28,48),e.qZA(),e.TgZ(29,"ngb-timepicker",49),e.NdJ("ngModelChange",function(c){return e.CHM(t),e.oxw().startTime=c})("ngModelChange",function(){return e.CHM(t),e.oxw().filterLogs()}),e.qZA(),e.TgZ(30,"span"),e._uU(31,"\xa0\u2014\xa0"),e.qZA(),e.TgZ(32,"ngb-timepicker",49),e.NdJ("ngModelChange",function(c){return e.CHM(t),e.oxw().endTime=c})("ngModelChange",function(){return e.CHM(t),e.oxw().filterLogs()}),e.qZA(),e.qZA(),e.qZA()}if(2&n){const t=e.oxw();e.xp6(4),e.Q6J("ngModel",t.priority),e.xp6(1),e.Q6J("ngForOf",t.priorities),e.xp6(7),e.Q6J("ngClass",e.VKq(16,Rl,t.icons.search)),e.xp6(1),e.Q6J("ngModel",t.search),e.xp6(3),e.Gre("icon-prepend ",t.icons.destroy,""),e.xp6(5),e.Q6J("maxDate",t.maxDate)("ngModel",t.selectedDate),e.xp6(4),e.Gre("icon-prepend ",t.icons.destroy,""),e.xp6(4),e.Q6J("spinners",!1)("ngModel",t.startTime),e.xp6(3),e.Q6J("spinners",!1)("ngModel",t.endTime)}}function tu(n,s){if(1&n){const t=e.EpF();e.TgZ(0,"span"),e.SDv(1,51),e.qZA(),e.TgZ(2,"span"),e._uU(3,"\xa0"),e.qZA(),e.TgZ(4,"a",52),e.NdJ("click",function(){return e.CHM(t),e.oxw().resetFilter()}),e.SDv(5,53),e.qZA()}}function Qu(n,s){1&n&&(e.TgZ(0,"cd-alert-panel",54),e.ynx(1),e.SDv(2,55),e.BQk(),e.qZA())}let Zd=(()=>{class n{constructor(t,o,c,g){this.logsService=t,this.cephService=o,this.datePipe=c,this.ngZone=g,this.icons=No.P,this.priorities=[{name:"Debug",value:"[DBG]"},{name:"Info",value:"[INF]"},{name:"Warning",value:"[WRN]"},{name:"Error",value:"[ERR]"},{name:"All",value:"All"}],this.priority="All",this.search="",this.startTime={hour:0,minute:0},this.endTime={hour:23,minute:59},this.maxDate={year:(new Date).getFullYear(),month:(new Date).getMonth()+1,day:(new Date).getDate()}}ngOnInit(){this.getInfo(),this.ngZone.runOutsideAngular(()=>{this.getDaemonDetails(),this.interval=window.setInterval(()=>{this.ngZone.run(()=>{this.getInfo()})},5e3)})}ngOnDestroy(){clearInterval(this.interval)}getDaemonDetails(){this.lokiServiceStatus$=this.cephService.getDaemons("loki").pipe((0,su.U)(t=>t.length>0&&1===t[0].status)),this.promtailServiceStatus$=this.cephService.getDaemons("promtail").pipe((0,su.U)(t=>t.length>0&&1===t[0].status))}getInfo(){this.logsService.getLogs().subscribe(t=>{this.contentData=t,this.clogText=this.logToText(this.contentData.clog),this.auditLogText=this.logToText(this.contentData.audit_log),this.filterLogs()})}abstractFilters(){var t,o,c,g,C,D,P,j;const W=this.priority,re=this.search.toLowerCase();let ie;if(this.selectedDate){const U=this.selectedDate.month,pt=this.selectedDate.day;ie=`${this.selectedDate.year}-${U<=9?`0${U}`:`${U}`}-${pt<=9?`0${pt}`:`${pt}`}`}else ie="";return{priority:W,key:re,yearMonthDay:ie,sTime:60*(null!==(o=null===(t=this.startTime)||void 0===t?void 0:t.hour)&&void 0!==o?o:0)+(null!==(g=null===(c=this.startTime)||void 0===c?void 0:c.minute)&&void 0!==g?g:0),eTime:60*(null!==(D=null===(C=this.endTime)||void 0===C?void 0:C.hour)&&void 0!==D?D:23)+(null!==(j=null===(P=this.endTime)||void 0===P?void 0:P.minute)&&void 0!==j?j:59)}}filterExecutor(t,o){return t.filter(c=>{const g=this.datePipe.transform(c.stamp,"mediumTime"),C=parseInt(g.split(":")[0],10),D=parseInt(g.split(":")[1],10);let P,j,W;return P="All"===o.priority?c.priority:o.priority,j=o.yearMonthDay?o.yearMonthDay:c.stamp,W=60*C+D,c.priority===P&&-1!==c.message.toLowerCase().indexOf(o.key)&&-1!==c.stamp.indexOf(j)&&W>=o.sTime&&W<=o.eTime})}filterLogs(){const t=this.abstractFilters();this.clog=this.filterExecutor(this.contentData.clog,t),this.audit_log=this.filterExecutor(this.contentData.audit_log,t)}clearSearchKey(){this.search="",this.filterLogs()}clearDate(){this.selectedDate=null,this.filterLogs()}resetFilter(){return this.priority="All",this.search="",this.selectedDate=null,this.startTime={hour:0,minute:0},this.endTime={hour:23,minute:59},this.filterLogs(),!1}logToText(t){let o="";for(const c of Object.keys(t))o=o+this.datePipe.transform(t[c].stamp,"medium")+"\t"+t[c].priority+"\t"+t[c].message+"\n";return o}}return n.\u0275fac=function(t){return new(t||n)(e.Y36(Mp),e.Y36(Qt),e.Y36(_.uU),e.Y36(e.R0b))},n.\u0275cmp=e.Xpm({type:n,selectors:[["cd-logs"]],decls:7,vars:1,consts:function(){let s,t,o,c,g,C,D,P,j,W,re;return s="Cluster Logs",t="Audit Logs",o="Daemon Logs",c="Priority:",g="Keyword:",C="Date:",D="Time range:",P="No log entries found. Please try to select different filter options.",j="Reset filter.",W="Loki/Promtail service not running",re="Please start the loki and promtail service to see these logs.",[[4,"ngIf"],["logFiltersTpl",""],["noEntriesTpl",""],["daemonLogsTpl",""],[4,"ngTemplateOutlet"],["ngbNav","","cdStatefulTab","logs",1,"nav-tabs"],["nav","ngbNav"],["ngbNavItem","cluster-logs"],["ngbNavLink",""],s,["ngbNavContent",""],["ngbNavItem","audit-logs"],t,["ngbNavItem","daemon-logs"],o,[3,"ngbNavOutlet"],["class","card bg-light mb-3",4,"ngIf"],[1,"card","bg-light","mb-3"],["class","btn-group","role","group",4,"ngIf"],[1,"card-body"],[4,"ngFor","ngForOf"],[4,"ngIf","ngIfElse"],["role","group",1,"btn-group"],["fileName","cluster_log",3,"objectItem","textItem"],[3,"source","byId"],[1,"timestamp"],[1,"message",3,"innerHTML"],["fileName","audit_log",3,"objectItem","textItem"],["uid","CrAHE0iZz","grafanaStyle","two",3,"grafanaPath","type"],[1,"form-inline"],[1,"form-group"],["for","logs-priority"],c,["id","logs-priority",1,"form-control",3,"ngModel","ngModelChange"],[3,"value",4,"ngFor","ngForOf"],["for","logs-keyword"],g,[1,"input-group"],[1,"input-group-prepend"],[1,"input-group-text"],[3,"ngClass"],["id","logs-keyword","type","text",1,"form-control",3,"ngModel","ngModelChange","keyup"],[1,"input-group-append"],["type","button",1,"btn","btn-light",3,"click"],["for","logs-date"],C,["id","logs-date","placeholder","YYYY-MM-DD","ngbDatepicker","",1,"form-control",3,"maxDate","ngModel","click","ngModelChange"],["d","ngbDatepicker"],D,[3,"spinners","ngModel","ngModelChange"],[3,"value"],P,["href","#",3,"click"],j,["type","info","title",W],re]},template:function(t,o){1&t&&(e.YNc(0,Qo,17,2,"div",0),e.YNc(1,Tu,33,18,"ng-template",null,1,e.W1O),e.YNc(3,tu,6,0,"ng-template",null,2,e.W1O),e.YNc(5,Qu,3,0,"ng-template",null,3,e.W1O)),2&t&&e.Q6J("ngIf",o.contentData)},directives:[_.O5,_.tP,lt.Pz,un.m,lt.nv,lt.Vx,lt.uN,lt.tO,_.sg,Im,Uc.s,it.F,$a.P,ca.o,vn.EJ,Ha.b,vn.JJ,vn.On,_.mk,vn.Fj,lt.J4,lt.Pm,vn.YN,vn.Kr,Jt.G],pipes:[Vl.N,Lm.e,m1,_.Ov],styles:["p[_ngcontent-%COMP%]{font-family:monospace}.card[_ngcontent-%COMP%]   .btn-group[_ngcontent-%COMP%]{margin-top:-45px;position:absolute;right:0}.card[_ngcontent-%COMP%]   div[_ngcontent-%COMP%]   p[_ngcontent-%COMP%]{display:flex}.card[_ngcontent-%COMP%]   div[_ngcontent-%COMP%]   p[_ngcontent-%COMP%]:last-child{margin-bottom:0}.card[_ngcontent-%COMP%]   .timestamp[_ngcontent-%COMP%]{flex-shrink:0;font-weight:bold}.card[_ngcontent-%COMP%]   .priority[_ngcontent-%COMP%]{margin-left:.5rem}.card[_ngcontent-%COMP%]   .message[_ngcontent-%COMP%]{margin-left:1rem}.card[_ngcontent-%COMP%]   .err[_ngcontent-%COMP%]{color:#ef5c55}.card[_ngcontent-%COMP%]   .warn[_ngcontent-%COMP%]{color:#ffc200}.card[_ngcontent-%COMP%]   .info[_ngcontent-%COMP%]{color:#2b99a8}.card[_ngcontent-%COMP%]   .debug[_ngcontent-%COMP%]{color:#495057}  cd-logs ngb-timepicker input.ngb-tp-input{width:3.5rem!important}"]}),n})();var Bc=i(7273);function Ap(n,s){if(1&n&&(e.TgZ(0,"cd-helper"),e._uU(1),e.ALo(2,"upperFirst"),e.qZA()),2&n){const t=e.oxw().$implicit;e.xp6(1),e.hij(" ",e.lcZ(2,1,t.value.long_desc||t.value.desc)," ")}}function K_(n,s){if(1&n&&(e.TgZ(0,"div",15),e.TgZ(1,"div",16),e._UZ(2,"input",17),e._UZ(3,"label",18),e.qZA(),e.qZA()),2&n){const t=e.oxw().$implicit;e.xp6(2),e.s9C("id",t.value.name),e.s9C("formControlName",t.value.name),e.xp6(1),e.s9C("for",t.value.name)}}function q_(n,s){if(1&n&&e._UZ(0,"input",22),2&n){const t=e.oxw(2).$implicit;e.s9C("id",t.value.name),e.s9C("formControlName",t.value.name)}}function ef(n,s){if(1&n&&(e.TgZ(0,"option",25),e._uU(1),e.qZA()),2&n){const t=s.$implicit;e.Q6J("ngValue",t),e.xp6(1),e.hij(" ",t," ")}}function Xc(n,s){if(1&n&&(e.TgZ(0,"select",23),e.YNc(1,ef,2,2,"option",24),e.qZA()),2&n){const t=e.oxw(2).$implicit;e.s9C("id",t.value.name),e.s9C("formControlName",t.value.name),e.xp6(1),e.Q6J("ngForOf",t.value.enum_allowed)}}function Op(n,s){1&n&&(e.TgZ(0,"span",26),e.SDv(1,27),e.qZA())}function Zu(n,s){1&n&&(e.TgZ(0,"span",26),e.SDv(1,28),e.qZA())}function Rc(n,s){if(1&n&&(e.TgZ(0,"div",15),e.YNc(1,q_,1,2,"input",19),e.YNc(2,Xc,2,3,"select",20),e.YNc(3,Op,2,0,"span",21),e.YNc(4,Zu,2,0,"span",21),e.qZA()),2&n){const t=e.oxw().$implicit;e.oxw();const o=e.MAs(2),c=e.oxw();e.xp6(1),e.Q6J("ngIf",0===t.value.enum_allowed.length),e.xp6(1),e.Q6J("ngIf",t.value.enum_allowed.length>0),e.xp6(1),e.Q6J("ngIf",c.mgrModuleForm.showError(t.value.name,o,"invalidUuid")),e.xp6(1),e.Q6J("ngIf",c.mgrModuleForm.showError(t.value.name,o,"pattern"))}}function L0(n,s){1&n&&(e.TgZ(0,"span",26),e.SDv(1,30),e.qZA())}function F0(n,s){if(1&n&&(e.TgZ(0,"span",26),e.SDv(1,31),e.qZA()),2&n){const t=e.oxw(2).$implicit;e.xp6(1),e.pQV(t.value.max),e.QtT(1)}}function k0(n,s){if(1&n&&(e.TgZ(0,"span",26),e.SDv(1,32),e.qZA()),2&n){const t=e.oxw(2).$implicit;e.xp6(1),e.pQV(t.value.min),e.QtT(1)}}function Ab(n,s){1&n&&(e.TgZ(0,"span",26),e.SDv(1,33),e.qZA())}function Gh(n,s){if(1&n&&(e.TgZ(0,"div",15),e._UZ(1,"input",29),e.YNc(2,L0,2,0,"span",21),e.YNc(3,F0,2,1,"span",21),e.YNc(4,k0,2,1,"span",21),e.YNc(5,Ab,2,0,"span",21),e.qZA()),2&n){const t=e.oxw().$implicit;e.oxw();const o=e.MAs(2),c=e.oxw();e.xp6(1),e.s9C("id",t.value.name),e.s9C("formControlName",t.value.name),e.s9C("min",t.value.min),e.s9C("max",t.value.max),e.xp6(1),e.Q6J("ngIf",c.mgrModuleForm.showError(t.value.name,o,"required")),e.xp6(1),e.Q6J("ngIf",c.mgrModuleForm.showError(t.value.name,o,"max")),e.xp6(1),e.Q6J("ngIf",c.mgrModuleForm.showError(t.value.name,o,"min")),e.xp6(1),e.Q6J("ngIf",c.mgrModuleForm.showError(t.value.name,o,"pattern"))}}function v1(n,s){1&n&&(e.TgZ(0,"span",26),e.SDv(1,35),e.qZA())}function Ob(n,s){1&n&&(e.TgZ(0,"span",26),e.SDv(1,36),e.qZA())}function $0(n,s){if(1&n&&(e.TgZ(0,"div",15),e._UZ(1,"input",34),e.YNc(2,v1,2,0,"span",21),e.YNc(3,Ob,2,0,"span",21),e.qZA()),2&n){const t=e.oxw().$implicit;e.oxw();const o=e.MAs(2),c=e.oxw();e.xp6(1),e.s9C("id",t.value.name),e.s9C("formControlName",t.value.name),e.xp6(1),e.Q6J("ngIf",c.mgrModuleForm.showError(t.value.name,o,"required")),e.xp6(1),e.Q6J("ngIf",c.mgrModuleForm.showError(t.value.name,o,"pattern"))}}const vv=function(){return["addr","str","uuid"]},yv=function(){return["uint","int","size","secs"]};function wb(n,s){if(1&n&&(e.TgZ(0,"div",11),e.TgZ(1,"label",12),e._uU(2),e.YNc(3,Ap,3,3,"cd-helper",13),e.qZA(),e.YNc(4,K_,4,3,"div",14),e.YNc(5,Rc,5,4,"div",14),e.YNc(6,Gh,6,8,"div",14),e.YNc(7,$0,4,4,"div",14),e.qZA()),2&n){const t=s.$implicit;e.xp6(1),e.s9C("for",t.value.name),e.xp6(1),e.hij(" ",t.value.name," "),e.xp6(1),e.Q6J("ngIf",t.value.long_desc||t.value.desc),e.xp6(1),e.Q6J("ngIf","bool"===t.value.type),e.xp6(1),e.Q6J("ngIf",e.DdM(7,vv).includes(t.value.type)),e.xp6(1),e.Q6J("ngIf",e.DdM(8,yv).includes(t.value.type)),e.xp6(1),e.Q6J("ngIf","float"===t.value.type)}}function H0(n,s){if(1&n){const t=e.EpF();e.TgZ(0,"div",1),e.TgZ(1,"form",2,3),e.TgZ(3,"div",4),e.TgZ(4,"div",5),e.SDv(5,6),e.qZA(),e.TgZ(6,"div",7),e.YNc(7,wb,8,9,"div",8),e.ALo(8,"keyvalue"),e.qZA(),e.TgZ(9,"div",9),e.TgZ(10,"cd-form-button-panel",10),e.NdJ("submitActionEvent",function(){return e.CHM(t),e.oxw().onSubmit()}),e.qZA(),e.qZA(),e.qZA(),e.qZA(),e.qZA()}if(2&n){const t=e.oxw();e.xp6(1),e.Q6J("formGroup",t.mgrModuleForm),e.xp6(6),e.Q6J("ngForOf",e.lcZ(8,4,t.moduleOptions)),e.xp6(3),e.Q6J("form",t.mgrModuleForm)("submitText",t.actionLabels.UPDATE)}}let bv=(()=>{class n extends Oa.E{constructor(t,o,c,g,C,D){super(),this.actionLabels=t,this.route=o,this.router=c,this.formBuilder=g,this.mgrModuleService=C,this.notificationService=D,this.moduleName="",this.moduleOptions=[]}ngOnInit(){this.route.params.subscribe(t=>{this.moduleName=decodeURIComponent(t.name);const o=[this.mgrModuleService.getOptions(this.moduleName),this.mgrModuleService.getConfig(this.moduleName)];(0,Oc.D)(o).subscribe(c=>{this.moduleOptions=c[0],this.createForm(),this.mgrModuleForm.setValue(c[1]),this.loadingReady()},c=>{this.loadingError()})})}getValidators(t){const o=[];switch(t.type){case"addr":o.push(ds.h.ip());break;case"uint":case"int":case"size":case"secs":o.push(vn.kI.required);break;case"str":Ar().isNumber(t.min)&&o.push(vn.kI.minLength(t.min)),Ar().isNumber(t.max)&&o.push(vn.kI.maxLength(t.max));break;case"float":o.push(vn.kI.required),o.push(ds.h.decimalNumber());break;case"uuid":o.push(ds.h.uuid())}return o}createForm(){const t={};Ar().forEach(this.moduleOptions,o=>{t[o.name]=[o.default_value,this.getValidators(o)]}),this.mgrModuleForm=this.formBuilder.group(t)}goToListView(){this.router.navigate(["/mgr-modules"])}onSubmit(){if(this.mgrModuleForm.pristine)return void this.goToListView();const t={};Ar().forEach(this.moduleOptions,o=>{const c=this.mgrModuleForm.get(o.name);c.dirty&&c.valid&&(t[o.name]=c.value)}),this.mgrModuleService.updateConfig(this.moduleName,t).subscribe(()=>{this.notificationService.show(_a.k.success,"Updated options for module '" + this.moduleName + "'."),this.goToListView()},()=>{this.mgrModuleForm.setErrors({cdSubmitButton:!0})})}}return n.\u0275fac=function(t){return new(t||n)(e.Y36(ki.p4),e.Y36(Yo.gz),e.Y36(Yo.F0),e.Y36(id.O),e.Y36(Bc.N),e.Y36(ll.g))},n.\u0275cmp=e.Xpm({type:n,selectors:[["cd-mgr-module-form"]],features:[e.qOj],decls:1,vars:1,consts:function(){let s,t,o,c,g,C,D,P,j;return s="Edit Manager module",t="The entered value is not a valid UUID, e.g.: 67dcac9f-2c03-4d6c-b7bd-1210b3a259a8",o="The entered value needs to be a valid IP address.",c="This field is required.",g="The entered value is too high! It must be lower or equal to " + "\ufffd0\ufffd" + ".",C="The entered value is too low! It must be greater or equal to " + "\ufffd0\ufffd" + ".",D="The entered value needs to be a number.",P="This field is required.",j="The entered value needs to be a number or decimal.",[["class","cd-col-form",4,"cdFormLoading"],[1,"cd-col-form"],["name","mgrModuleForm","novalidate","",3,"formGroup"],["frm","ngForm"],[1,"card"],[1,"card-header"],s,[1,"card-body"],["class","form-group row",4,"ngFor","ngForOf"],[1,"card-footer"],["wrappingClass","text-right",3,"form","submitText","submitActionEvent"],[1,"form-group","row"],[1,"cd-col-form-label",3,"for"],[4,"ngIf"],["class","cd-col-form-input",4,"ngIf"],[1,"cd-col-form-input"],[1,"custom-control","custom-checkbox"],["type","checkbox",1,"custom-control-input",3,"id","formControlName"],[1,"custom-control-label",3,"for"],["class","form-control","type","text",3,"id","formControlName",4,"ngIf"],["class","form-control",3,"id","formControlName",4,"ngIf"],["class","invalid-feedback",4,"ngIf"],["type","text",1,"form-control",3,"id","formControlName"],[1,"form-control",3,"id","formControlName"],[3,"ngValue",4,"ngFor","ngForOf"],[3,"ngValue"],[1,"invalid-feedback"],t,o,["type","number",1,"form-control",3,"id","formControlName","min","max"],c,g,C,D,["type","number",1,"form-control",3,"id","formControlName"],P,j]},template:function(t,o){1&t&&e.YNc(0,H0,11,6,"div",0),2&t&&e.Q6J("cdFormLoading",o.loading)},directives:[wl.y,vn._Y,vn.JL,vn.sg,tl.V,_.sg,nl.p,$a.P,_.O5,E.S,ca.o,vn.Wl,Ha.b,vn.JJ,vn.u,vn.Fj,vn.EJ,vn.YN,vn.Kr,vn.wV,vn.qQ,vn.Fd],pipes:[_.Nd,K.m],styles:[""]}),n})();function tf(n,s,t,o){var C,c=arguments.length,g=c<3?s:null===o?o=Object.getOwnPropertyDescriptor(s,t):o;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)g=Reflect.decorate(n,s,t,o);else for(var D=n.length-1;D>=0;D--)(C=n[D])&&(g=(c<3?C(g):c>3?C(s,t,g):C(s,t))||g);return c>3&&g&&Object.defineProperty(s,t,g),g}var Gg=i(80226);const Z0=["*"],Hm=["templateOutlet"];function Um(n,s){if(1&n&&(e.TgZ(0,"div",6),e._uU(1),e.qZA()),2&n){const t=e.oxw(2);e.xp6(1),e.hij(" ",t.message||t.defaultMessage," ")}}function Nb(n,s){if(1&n&&(e.TgZ(0,"div",3),e._UZ(1,"div",4),e.YNc(2,Um,2,1,"div",5),e.qZA()),2&n){const t=e.oxw();e.xp6(2),e.Q6J("ngIf",t.message||t.defaultMessage)}}function T1(n,s){}function j0(n,s){1&n&&e.YNc(0,T1,0,0,"ng-template",null,7,e.W1O)}const S1=function(n){return{active:n}};let ad=(()=>{class n{}return n.START="start",n.STOP="stop",n.UPDATE="update",n.RESET="reset",n.RESET_GLOBAL="reset_global",n.UNSUBSCRIBE="unsubscribe",n})();const wg="block-ui-main";let tg=(()=>{let n=class{constructor(){this.blockUISettings={},this.blockUIInstances={},this.blockUISubject=new Gg.t(1),this.blockUIObservable=this.blockUISubject.asObservable(),this.blockUIObservable.subscribe(this.blockUIMiddleware.bind(this))}getSettings(){return this.blockUISettings}updateSettings(t={}){this.blockUISettings=Object.assign(Object.assign({},this.blockUISettings),t)}decorate(t=wg){const o={name:t,isActive:!1,blockCount:0,start:this.dispatch(this.blockUISubject,ad.START,t),update:this.dispatch(this.blockUISubject,ad.UPDATE,t),stop:this.dispatch(this.blockUISubject,ad.STOP,t),reset:this.dispatch(this.blockUISubject,ad.RESET,t),resetGlobal:this.dispatch(this.blockUISubject,ad.RESET_GLOBAL,t),unsubscribe:this.dispatch(this.blockUISubject,ad.UNSUBSCRIBE,t)};return this.blockUIInstances[t]=this.blockUIInstances[t]||o,o}observe(){return this.blockUIObservable}clearInstance(t){this.dispatch(this.blockUISubject,ad.RESET,t)}blockUIMiddleware({action:t,name:o}){let c=null;switch(t){case ad.START:c=!0;break;case ad.STOP:case ad.RESET:c=!1}null!==c&&(this.blockUIInstances[o].isActive=c)}dispatch(t,o,c=wg){return g=>{t.next({name:c,action:o,message:g})}}};return n.\u0275fac=function(t){return new(t||n)},n.\u0275prov=e.Yz7({token:n,factory:function(s){return n.\u0275fac(s)}}),n})(),Pb=(()=>{let n=class{constructor(t){this.blockUI=t}ngOnInit(){this.name=this.name||wg,this.template=this.template||this.blockUI.blockUISettings.template}};return n.\u0275fac=function(t){return new(t||n)(e.Y36(tg))},n.\u0275cmp=e.Xpm({type:n,selectors:[["block-ui"]],inputs:{name:"name",template:"template",message:"message",delayStart:"delayStart",delayStop:"delayStop"},ngContentSelectors:Z0,decls:2,vars:5,consts:[[3,"name","message","template","delayStart","delayStop"]],template:function(t,o){1&t&&(e.F$t(),e.Hsn(0),e._UZ(1,"block-ui-content",0)),2&t&&(e.xp6(1),e.Q6J("name",o.name)("message",o.message)("template",o.template)("delayStart",o.delayStart)("delayStop",o.delayStop))},directives:function(){return[Md]},encapsulation:2}),tf([(0,e.IIB)()],n.prototype,"name",void 0),tf([(0,e.IIB)()],n.prototype,"message",void 0),tf([(0,e.IIB)()],n.prototype,"delayStart",void 0),tf([(0,e.IIB)()],n.prototype,"delayStop",void 0),tf([(0,e.IIB)()],n.prototype,"template",void 0),n})(),Md=(()=>{let n=class{constructor(t,o,c){this.blockUI=t,this.resolver=o,this.changeDetectionRef=c,this.name=wg,this.defaultBlockState={startTimeouts:[],stopTimeouts:[],updateTimeouts:[],blockCount:0,startCallCount:0,stopCallCount:0},this.state=Object.assign({},this.defaultBlockState)}ngOnInit(){this.settings=this.blockUI.getSettings(),this.blockUISubscription=this.subscribeToBlockUI(this.blockUI.observe())}ngAfterViewInit(){try{if(!this.templateCmp)return!1;if(this.templateCmp instanceof e.Rgc)this.templateOutlet.createEmbeddedView(this.templateCmp);else{const t=this.resolver.resolveComponentFactory(this.templateCmp);this.templateCompRef=this.templateOutlet.createComponent(t),this.updateBlockTemplate(this.message)}}catch(t){console.error("ng-block-ui:",t)}}ngAfterViewChecked(){this.detectChanges()}subscribeToBlockUI(t){return t.subscribe(o=>this.onDispatchedEvent(o))}onDispatchedEvent(t){switch(t.action){case ad.START:this.onStart(t);break;case ad.STOP:this.onStop(t);break;case ad.UPDATE:this.onUpdate(t);break;case ad.RESET:this.onReset(t);break;case ad.RESET_GLOBAL:this.resetState();break;case ad.UNSUBSCRIBE:this.onStop(t),this.onUnsubscribe(t.name)}}onStart({name:t,message:o}){if(t===this.name){const c=this.delayStart||this.settings.delayStart||0;this.state.startCallCount+=1;const g=setTimeout(()=>{this.state.blockCount+=1,this.showBlock(o),this.updateInstanceBlockCount()},c);this.state.startTimeouts.push(g)}}onStop({name:t}){if(t===this.name){const o=this.state.stopCallCount+1;if(this.state.startCallCount-o>=0){const c=this.delayStop||this.settings.delayStop||0;this.state.stopCallCount=o;const g=setTimeout(()=>{this.state.blockCount-=1,this.updateInstanceBlockCount(),this.detectChanges()},c);this.state.stopTimeouts.push(g)}}}onUpdate({name:t,message:o}){if(t===this.name){const c=this.delayStart||this.settings.delayStart||0;clearTimeout(this.state.updateTimeouts[0]);const g=setTimeout(()=>{this.updateMessage(o)},c);this.state.updateTimeouts.push(g)}}onReset({name:t}){t===this.name&&this.resetState()}updateMessage(t){this.showBlock(t)}showBlock(t){this.message=t||this.defaultMessage||this.settings.message,this.updateBlockTemplate(this.message),this.detectChanges()}updateBlockTemplate(t){this.templateCompRef&&this.templateCompRef instanceof e.UuU&&(this.templateCompRef.instance.message=t)}resetState(){[...this.state.startTimeouts,...this.state.stopTimeouts,...this.state.updateTimeouts].forEach(clearTimeout),this.state=Object.assign({},this.defaultBlockState),this.updateInstanceBlockCount(),this.detectChanges()}onUnsubscribe(t){this.blockUISubscription&&t===this.name&&this.blockUISubscription.unsubscribe()}updateInstanceBlockCount(){if(this.blockUI.blockUIInstances[this.name]){const{blockCount:t}=this.state;this.blockUI.blockUIInstances[this.name].blockCount=t}}detectChanges(){this.changeDetectionRef.destroyed||this.changeDetectionRef.detectChanges()}ngOnDestroy(){this.resetState(),this.onUnsubscribe(this.name),this.blockUI.clearInstance(this.name)}};return n.\u0275fac=function(t){return new(t||n)(e.Y36(tg),e.Y36(e._Vd),e.Y36(e.sBO))},n.\u0275cmp=e.Xpm({type:n,selectors:[["block-ui-content"]],viewQuery:function(t,o){if(1&t&&e.Gf(Hm,5,e.s_b),2&t){let c;e.iGM(c=e.CRH())&&(o.templateOutlet=c.first)}},inputs:{name:"name",delayStart:"delayStart",delayStop:"delayStop",defaultMessage:["message","defaultMessage"],templateCmp:["template","templateCmp"]},decls:3,vars:9,consts:[[3,"ngClass"],["class","block-ui-spinner",4,"ngIf"],[4,"ngIf"],[1,"block-ui-spinner"],[1,"loader"],["class","message",4,"ngIf"],[1,"message"],["templateOutlet",""]],template:function(t,o){1&t&&(e.TgZ(0,"div",0),e.YNc(1,Nb,3,1,"div",1),e.YNc(2,j0,2,0,void 0,2),e.qZA()),2&t&&(e.MT6("block-ui-wrapper ",o.name," ",o.className,""),e.Q6J("ngClass",e.VKq(7,S1,o.state.blockCount>0)),e.xp6(1),e.Q6J("ngIf",!o.templateCmp),e.xp6(1),e.Q6J("ngIf",o.templateCmp))},directives:[_.mk,_.O5],styles:["\n.block-ui-wrapper {\n  display: none;\n  position: fixed;\n  height: 100%;\n  width: 100%;\n  top: 0;\n  left: 0;\n  background: rgba(0, 0, 0, 0.70);\n  z-index: 30000;\n  cursor: wait;\n}\n\n.block-ui-wrapper.block-ui-wrapper--element {\n  position: absolute;\n}\n\n.block-ui-wrapper.active {\n  display: block;\n}\n\n.block-ui-wrapper.block-ui-main {\n  position: fixed;\n}\n\n.block-ui-spinner,\n.block-ui-template {\n  position: absolute;\n  top: 40%;\n  margin: 0 auto;\n  left: 0;\n  right: 0;\n  transform: translateY(-50%);\n}\n\n.block-ui-spinner > .message {\n  font-size: 1.3em;\n  text-align: center;\n  color: #fff;\n}\n\n.block-ui__element {\n  position: relative;\n}\n\n.loader,\n.loader:after {\n  border-radius: 50%;\n  width: 10em;\n  height: 10em;\n}\n.loader {\n  margin: 7px auto;\n  font-size: 5px;\n  position: relative;\n  text-indent: -9999em;\n  border-top: 1.1em solid rgba(255, 255, 255, 0.2);\n  border-right: 1.1em solid rgba(255, 255, 255, 0.2);\n  border-bottom: 1.1em solid rgba(255, 255, 255, 0.2);\n  border-left: 1.1em solid #ffffff;\n  -webkit-transform: translateZ(0);\n  -ms-transform: translateZ(0);\n  transform: translateZ(0);\n  -webkit-animation: load8 1.1s infinite linear;\n  animation: load8 1.1s infinite linear;\n}\n\n@-webkit-keyframes load8 {\n  0% {\n    -webkit-transform: rotate(0deg);\n    transform: rotate(0deg);\n  }\n  100% {\n    -webkit-transform: rotate(360deg);\n    transform: rotate(360deg);\n  }\n}\n\n@keyframes load8 {\n  0% {\n    -webkit-transform: rotate(0deg);\n    transform: rotate(0deg);\n  }\n  100% {\n    -webkit-transform: rotate(360deg);\n    transform: rotate(360deg);\n  }\n}\n"],encapsulation:2}),tf([(0,e.IIB)()],n.prototype,"name",void 0),tf([(0,e.IIB)()],n.prototype,"delayStart",void 0),tf([(0,e.IIB)()],n.prototype,"delayStop",void 0),tf([(0,e.IIB)("message")],n.prototype,"defaultMessage",void 0),tf([(0,e.IIB)("template")],n.prototype,"templateCmp",void 0),tf([(0,e.i9L)("templateOutlet",{read:e.s_b})],n.prototype,"templateOutlet",void 0),n})(),C1=(()=>{let n=class{constructor(t){this.blockUIInstance=t,this.globalDispatch=this.blockUIInstance.decorate()}start(t,o){this.dispatch(t,ad.START,o)}stop(t){this.dispatch(t,ad.STOP)}reset(t){this.dispatch(t,ad.RESET)}resetGlobal(){this.globalDispatch.resetGlobal()}update(t,o){this.dispatch(t,ad.UPDATE,o)}unsubscribe(t){this.dispatch(t,ad.UNSUBSCRIBE)}isActive(t=null){const o=t?this.toArray(t):null,c=this.blockUIInstance.blockUIInstances;return Object.keys(c).some(g=>o?o.indexOf(c[g].name)>=0&&c[g].isActive:c[g].isActive)}dispatch(t=[],o,c){this.toArray(t).forEach(C=>this.blockUIInstance.decorate(C)[o](c))}toArray(t=[]){return"string"==typeof t?[t]:t}};return n.\u0275fac=function(t){return new(t||n)(e.LFG(tg))},n.\u0275prov=e.Yz7({token:n,factory:function(s){return n.\u0275fac(s)}}),n})();var G0;const Vh=new tg,V0=new e.OlP("BlockUIModuleSettings");function Ib(n){return Vh.updateSettings(n),Vh}let Vg=G0=class{static forRoot(s={}){return{ngModule:G0,providers:[{provide:V0,useValue:s},{provide:tg,useFactory:Ib,deps:[V0]},C1]}}};Vg.\u0275fac=function(s){return new(s||Vg)},Vg.\u0275mod=e.oAB({type:Vg}),Vg.\u0275inj=e.cJS({imports:[[_.ez]]});let z0=1;function Lb(n,s){if(1&n&&(e.ynx(0),e._UZ(1,"cd-table-key-value",1),e.BQk()),2&n){const t=e.oxw();e.xp6(1),e.Q6J("data",t.module_config)}}let W0=(()=>{class n{constructor(t){this.mgrModuleService=t}ngOnChanges(){this.selection&&this.mgrModuleService.getConfig(this.selection.name).subscribe(t=>{this.module_config=t})}}return n.\u0275fac=function(t){return new(t||n)(e.Y36(Bc.N))},n.\u0275cmp=e.Xpm({type:n,selectors:[["cd-mgr-module-details"]],inputs:{selection:"selection"},features:[e.TTD],decls:1,vars:1,consts:[[4,"ngIf"],[3,"data"]],template:function(t,o){1&t&&e.YNc(0,Lb,2,1,"ng-container",0),2&t&&e.Q6J("ngIf",o.selection)},directives:[_.O5,Vr.b],styles:[""]}),n})();class Gu extends Gl.o{constructor(s,t,o){super(),this.authStorageService=s,this.mgrModuleService=t,this.notificationService=o,this.columns=[],this.modules=[],this.selection=new hl.r,this.permission=this.authStorageService.getPermissions().configOpt,this.columns=[{name:"Name",prop:"name",flexGrow:1},{name:"Enabled",prop:"enabled",flexGrow:1,cellClass:"text-center",cellTransformation:Ja.e.checkIcon},{name:"Always-On",prop:"always_on",flexGrow:1,cellClass:"text-center",cellTransformation:Ja.e.checkIcon}];const c=()=>this.selection.first()&&encodeURIComponent(this.selection.first().name);this.tableActions=[{name:"Edit",permission:"update",disable:()=>!this.selection.hasSelection||0===Object.values(this.selection.first().options).length,routerLink:()=>`/mgr-modules/edit/${c()}`,icon:No.P.edit},{name:"Enable",permission:"update",click:()=>this.updateModuleState(),disable:()=>this.isTableActionDisabled("enabled"),icon:No.P.start},{name:"Disable",permission:"update",click:()=>this.updateModuleState(),disable:()=>this.getTableActionDisabledDesc(),icon:No.P.stop}]}getModuleList(s){this.mgrModuleService.list().subscribe(t=>{this.modules=t},()=>{s.error()})}updateSelection(s){this.selection=s}isTableActionDisabled(s){if(!this.selection.hasSelection)return!0;const t=this.selection.first();if("dashboard"===t.name||t.always_on)return!0;switch(s){case"enabled":return t.enabled;case"disabled":return!t.enabled}}getTableActionDisabledDesc(){var s;return(null===(s=this.selection.first())||void 0===s?void 0:s.always_on)?"This Manager module is always on.":this.isTableActionDisabled("disabled")}updateModuleState(){if(!this.selection.hasSelection)return;let s;const t=()=>{(0,V.H)(2e3).subscribe(()=>{this.mgrModuleService.list().subscribe(()=>{this.notificationService.suspendToasties(!1),this.blockUI.stop(),this.table.refreshBtn()},()=>{t()})})},o=this.selection.first();s=o.enabled?this.mgrModuleService.disable(o.name):this.mgrModuleService.enable(o.name),s.subscribe(()=>{},()=>{this.notificationService.suspendToasties(!0),this.blockUI.start("Reconnecting, please wait ..."),t()})}}Gu.\u0275fac=function(s){return new(s||Gu)(e.Y36(_t.j),e.Y36(Bc.N),e.Y36(ll.g))},Gu.\u0275cmp=e.Xpm({type:Gu,selectors:[["cd-mgr-module-list"]],viewQuery:function(s,t){if(1&s&&e.Gf(Hs.a,7),2&s){let o;e.iGM(o=e.CRH())&&(t.table=o.first)}},features:[e.qOj],decls:4,vars:8,consts:[["columnMode","flex","selectionType","single","identifier","module",3,"autoReload","data","columns","hasDetails","setExpandedRow","updateSelection","fetchData"],["table",""],[1,"table-actions",3,"permission","selection","tableActions"],["cdTableDetail","",3,"selection"]],template:function(s,t){1&s&&(e.TgZ(0,"cd-table",0,1),e.NdJ("setExpandedRow",function(c){return t.setExpandedRow(c)})("updateSelection",function(c){return t.updateSelection(c)})("fetchData",function(c){return t.getModuleList(c)}),e._UZ(2,"cd-table-actions",2),e._UZ(3,"cd-mgr-module-details",3),e.qZA()),2&s&&(e.Q6J("autoReload",!1)("data",t.modules)("columns",t.columns)("hasDetails",!0),e.xp6(2),e.Q6J("permission",t.permission)("selection",t.selection)("tableActions",t.tableActions),e.xp6(1),e.Q6J("selection",t.expandedRow))},directives:[Hs.a,Xs.K,W0],styles:[""]}),(0,ha.gn)([function(n,s={}){return s.scopeToInstance?function(t,o){const c=`_${o}-block-ui`;Object.defineProperty(t,o,{get:function(){if(this[c])return this[c];const g=`${n}-${z0++}`;return this[c]=Vh.decorate(g),this[c]},set:function(g){this[c]=g}})}:function(t,o){t[o]=Vh.decorate(n)}}(),(0,ha.w6)("design:type",Object)],Gu.prototype,"blockUI",void 0);let Tv=(()=>{class n{constructor(t){this.http=t}getMonitor(){return this.http.get("api/monitor")}}return n.\u0275fac=function(t){return new(t||n)(e.LFG(y.eN))},n.\u0275prov=e.Yz7({token:n,factory:n.\u0275fac,providedIn:"root"}),n})();function AS(n,s){if(1&n&&(e.TgZ(0,"table",11),e.TgZ(1,"tr"),e.TgZ(2,"td",12),e.SDv(3,13),e.qZA(),e.TgZ(4,"td"),e._uU(5),e.qZA(),e.qZA(),e.TgZ(6,"tr"),e.TgZ(7,"td",12),e.SDv(8,14),e.qZA(),e.TgZ(9,"td"),e._uU(10),e.ALo(11,"relativeDate"),e.qZA(),e.qZA(),e.TgZ(12,"tr"),e.TgZ(13,"td",12),e.SDv(14,15),e.qZA(),e.TgZ(15,"td"),e._uU(16),e.qZA(),e.qZA(),e.TgZ(17,"tr"),e.TgZ(18,"td",12),e.SDv(19,16),e.qZA(),e.TgZ(20,"td"),e._uU(21),e.qZA(),e.qZA(),e.TgZ(22,"tr"),e.TgZ(23,"td",12),e.SDv(24,17),e.qZA(),e.TgZ(25,"td"),e._uU(26),e.qZA(),e.qZA(),e.TgZ(27,"tr"),e.TgZ(28,"td",12),e.SDv(29,18),e.qZA(),e.TgZ(30,"td"),e._uU(31),e.qZA(),e.qZA(),e.TgZ(32,"tr"),e.TgZ(33,"td",12),e.SDv(34,19),e.qZA(),e.TgZ(35,"td"),e._uU(36),e.qZA(),e.qZA(),e.qZA()),2&n){const t=e.oxw();e.xp6(5),e.Oqu(t.mon_status.monmap.fsid),e.xp6(5),e.Oqu(e.lcZ(11,7,t.mon_status.monmap.modified)),e.xp6(6),e.Oqu(t.mon_status.monmap.epoch),e.xp6(5),e.Oqu(t.mon_status.features.quorum_con),e.xp6(5),e.Oqu(t.mon_status.features.quorum_mon),e.xp6(5),e.Oqu(t.mon_status.features.required_con),e.xp6(5),e.Oqu(t.mon_status.features.required_mon)}}let b_=(()=>{class n{constructor(t){this.monitorService=t,this.inQuorum={columns:[{prop:"name",name:"Name",cellTransformation:Ja.e.routerLink},{prop:"rank",name:"Rank"},{prop:"public_addr",name:"Public Address"},{prop:"cdOpenSessions",name:"Open Sessions",cellTransformation:Ja.e.sparkline,comparator:(o,c)=>{const g=Ar().last(o),C=Ar().last(c);return g&&C&&g!==C?g>C?1:-1:0}}]},this.notInQuorum={columns:[{prop:"name",name:"Name",cellTransformation:Ja.e.routerLink},{prop:"rank",name:"Rank"},{prop:"public_addr",name:"Public Address"}]}}refresh(){this.monitorService.getMonitor().subscribe(t=>{t.in_quorum.map(o=>(o.cdOpenSessions=o.stats.num_sessions.map(c=>c[1]),o.cdLink="/perf_counters/mon/"+o.name,o.cdParams={fromLink:"/monitor"},o)),t.out_quorum.map(o=>(o.cdLink="/perf_counters/mon/"+o.name,o.cdParams={fromLink:"/monitor"},o)),this.inQuorum.data=[...t.in_quorum],this.notInQuorum.data=[...t.out_quorum],this.mon_status=t.mon_status})}}return n.\u0275fac=function(t){return new(t||n)(e.Y36(Tv))},n.\u0275cmp=e.Xpm({type:n,selectors:[["cd-monitor"]],decls:13,vars:5,consts:function(){let s,t,o,c,g,C,D,P,j,W;return s="Status",t="In Quorum",o="Not In Quorum",c="Cluster ID",g="monmap modified",C="monmap epoch",D="quorum con",P="quorum mon",j="required con",W="required mon",[[1,"row"],[1,"col-lg-4"],[1,"cd-header"],s,["class","table table-striped",4,"ngIf"],[1,"col-lg-8"],[1,"in-quorum","cd-header"],t,[3,"data","columns"],o,[3,"data","columns","fetchData"],[1,"table","table-striped"],[1,"bold"],c,g,C,D,P,j,W]},template:function(t,o){1&t&&(e.TgZ(0,"div",0),e.TgZ(1,"div",1),e.TgZ(2,"fieldset"),e.TgZ(3,"legend",2),e.SDv(4,3),e.qZA(),e.YNc(5,AS,37,9,"table",4),e.qZA(),e.qZA(),e.TgZ(6,"div",5),e.TgZ(7,"legend",6),e.SDv(8,7),e.qZA(),e._UZ(9,"cd-table",8),e.TgZ(10,"legend",6),e.SDv(11,9),e.qZA(),e.TgZ(12,"cd-table",10),e.NdJ("fetchData",function(){return o.refresh()}),e.qZA(),e.qZA(),e.qZA()),2&t&&(e.xp6(5),e.Q6J("ngIf",o.mon_status),e.xp6(4),e.Q6J("data",o.inQuorum.data)("columns",o.inQuorum.columns),e.xp6(3),e.Q6J("data",o.notInQuorum.data)("columns",o.notInQuorum.columns))},directives:[_.O5,Hs.a],pipes:[bt.h],styles:[""]}),n})();class Sv{}function M1(n,s){if(1&n&&(e.TgZ(0,"span",18),e.SDv(1,19),e.qZA()),2&n){const t=e.oxw(2);e.Q6J("ngbTooltip",t.clusterWideTooltip)}}function Bm(n,s){1&n&&e._UZ(0,"hr",20)}function Fb(n,s){if(1&n){const t=e.EpF();e.TgZ(0,"div",12),e.TgZ(1,"input",13),e.NdJ("change",function(){const g=e.CHM(t).$implicit;return e.oxw().changeValue(g)}),e.qZA(),e.TgZ(2,"label",14),e.TgZ(3,"strong"),e._uU(4),e.qZA(),e.YNc(5,M1,2,1,"span",15),e._UZ(6,"br"),e.TgZ(7,"span",16),e._uU(8),e.qZA(),e.qZA(),e.YNc(9,Bm,1,0,"hr",17),e.qZA()}if(2&n){const t=s.$implicit,o=s.last;e.xp6(1),e.Q6J("checked",t.value)("indeterminate",t.indeterminate)("name",t.code)("id",t.code),e.xp6(1),e.Q6J("for",t.code),e.xp6(2),e.Oqu(t.name),e.xp6(1),e.Q6J("ngIf",t.clusterWide),e.xp6(3),e.Oqu(t.description),e.xp6(1),e.Q6J("ngIf",!o)}}let kb=(()=>{class n{constructor(t,o,c,g,C){this.activeModal=t,this.actionLabels=o,this.authStorageService=c,this.osdService=g,this.notificationService=C,this.initialSelection=[],this.osdFlagsForm=new vn.cw({}),this.flags=[{code:"noup",name:"No Up",description:"OSDs are not allowed to start",value:!1,clusterWide:!1,indeterminate:!1},{code:"nodown",name:"No Down",description:"OSD failure reports are being ignored, such that the monitors will not mark OSDs down",value:!1,clusterWide:!1,indeterminate:!1},{code:"noin",name:"No In",description:"OSDs that were previously marked out will not be marked back in when they start",value:!1,clusterWide:!1,indeterminate:!1},{code:"noout",name:"No Out",description:"OSDs will not automatically be marked out after the configured interval",value:!1,clusterWide:!1,indeterminate:!1}],this.clusterWideTooltip="The flag has been enabled for the entire cluster.",this.permissions=this.authStorageService.getPermissions()}ngOnInit(){const t=this.selected.length;this.osdService.getFlags().subscribe(o=>{const c=this.getActivatedIndivFlags();this.flags.forEach(g=>{const C=c[g.code];o.includes(g.code)&&(g.clusterWide=!0),C===t?g.value=!0:C>0&&(g.indeterminate=!0)}),this.initialSelection=Ar().cloneDeep(this.flags)})}getActivatedIndivFlags(){const t={};return this.flags.forEach(o=>{t[o.code]=0}),[].concat(...this.selected.map(o=>o.state)).map(o=>{Object.keys(t).includes(o)&&(t[o]=t[o]+1)}),t}changeValue(t){t.value=!t.value,t.indeterminate=!1}resetSelection(){this.flags=Ar().cloneDeep(this.initialSelection)}submitAction(){const t={};this.flags.forEach(c=>{t[c.code]=c.indeterminate?null:c.value});const o=this.selected.map(c=>c.osd);this.osdService.updateIndividualFlags(t,o).subscribe(()=>{this.notificationService.show(_a.k.success,"Updated OSD Flags"),this.activeModal.close()},()=>{this.activeModal.close()})}}return n.\u0275fac=function(t){return new(t||n)(e.Y36(lt.Kz),e.Y36(ki.p4),e.Y36(_t.j),e.Y36(Ji),e.Y36(ll.g))},n.\u0275cmp=e.Xpm({type:n,selectors:[["cd-osd-flags-indiv-modal"]],decls:12,vars:6,consts:function(){let s,t,o;return s="Individual OSD Flags",t="Restore previous selection",o="Cluster-wide",[[3,"modalRef"],[1,"modal-title"],s,[1,"modal-content"],["name","osdFlagsForm","novalidate","",3,"formGroup"],["formDir","ngForm"],[1,"modal-body","osd-modal"],["class","custom-control custom-checkbox",4,"ngFor","ngForOf"],[1,"modal-footer"],["type","button",1,"btn","btn-light",3,"click"],t,[3,"form","showSubmit","submitText","submitActionEvent"],[1,"custom-control","custom-checkbox"],["type","checkbox",1,"custom-control-input",3,"checked","indeterminate","name","id","change"],["ng-class","['tc_' + key]",1,"custom-control-label",3,"for"],["class","badge badge-hdd ml-2",3,"ngbTooltip",4,"ngIf"],[1,"form-text","text-muted"],["class","m-1",4,"ngIf"],[1,"badge","badge-hdd","ml-2",3,"ngbTooltip"],o,[1,"m-1"]]},template:function(t,o){1&t&&(e.TgZ(0,"cd-modal",0),e.ynx(1,1),e.SDv(2,2),e.BQk(),e.ynx(3,3),e.TgZ(4,"form",4,5),e.TgZ(6,"div",6),e.YNc(7,Fb,10,9,"div",7),e.qZA(),e.TgZ(8,"div",8),e.TgZ(9,"button",9),e.NdJ("click",function(){return o.resetSelection()}),e.SDv(10,10),e.qZA(),e.TgZ(11,"cd-form-button-panel",11),e.NdJ("submitActionEvent",function(){return o.submitAction()}),e.qZA(),e.qZA(),e.qZA(),e.BQk(),e.qZA()),2&t&&(e.Q6J("modalRef",o.activeModal),e.xp6(4),e.Q6J("formGroup",o.osdFlagsForm),e.xp6(3),e.Q6J("ngForOf",o.flags),e.xp6(4),e.Q6J("form",o.osdFlagsForm)("showSubmit",o.permissions.osd.update)("submitText",o.actionLabels.UPDATE))},directives:[h.z,vn._Y,vn.JL,tl.V,vn.sg,_.sg,ca.o,nl.p,Ha.b,_.O5,lt._L],styles:[""]}),n})();var Cv=i(84333);function J0(n,s){1&n&&e._UZ(0,"hr",15)}function Q0(n,s){if(1&n){const t=e.EpF();e.TgZ(0,"div",10),e.TgZ(1,"input",11),e.NdJ("change",function(){const g=e.CHM(t).$implicit;return g.value=!g.value}),e.qZA(),e.TgZ(2,"label",12),e.TgZ(3,"strong"),e._uU(4),e.qZA(),e._UZ(5,"br"),e.TgZ(6,"span",13),e._uU(7),e.qZA(),e.qZA(),e.YNc(8,J0,1,0,"hr",14),e.qZA()}if(2&n){const t=s.$implicit,o=s.last;e.xp6(1),e.Q6J("checked",t.value)("name",t.code)("id",t.code)("disabled",t.disabled),e.xp6(1),e.Q6J("for",t.code),e.xp6(2),e.Oqu(t.name),e.xp6(3),e.Oqu(t.description),e.xp6(1),e.Q6J("ngIf",!o)}}let A1=(()=>{class n{constructor(t,o,c,g,C){this.activeModal=t,this.actionLabels=o,this.authStorageService=c,this.osdService=g,this.notificationService=C,this.osdFlagsForm=new vn.cw({}),this.allFlags={noin:{code:"noin",name:"No In",value:!1,description:"OSDs that were previously marked out will not be marked back in when they start"},noout:{code:"noout",name:"No Out",value:!1,description:"OSDs will not automatically be marked out after the configured interval"},noup:{code:"noup",name:"No Up",value:!1,description:"OSDs are not allowed to start"},nodown:{code:"nodown",name:"No Down",value:!1,description:"OSD failure reports are being ignored, such that the monitors will not mark OSDs down"},pause:{code:"pause",name:"Pause",value:!1,description:"Pauses reads and writes"},noscrub:{code:"noscrub",name:"No Scrub",value:!1,description:"Scrubbing is disabled"},"nodeep-scrub":{code:"nodeep-scrub",name:"No Deep Scrub",value:!1,description:"Deep Scrubbing is disabled"},nobackfill:{code:"nobackfill",name:"No Backfill",value:!1,description:"Backfilling of PGs is suspended"},norebalance:{code:"norebalance",name:"No Rebalance",value:!1,description:"OSD will choose not to backfill unless PG is also degraded"},norecover:{code:"norecover",name:"No Recover",value:!1,description:"Recovery of PGs is suspended"},sortbitwise:{code:"sortbitwise",name:"Bitwise Sort",value:!1,description:"Use bitwise sort",disabled:!0},purged_snapdirs:{code:"purged_snapdirs",name:"Purged Snapdirs",value:!1,description:"OSDs have converted snapsets",disabled:!0},recovery_deletes:{code:"recovery_deletes",name:"Recovery Deletes",value:!1,description:"Deletes performed during recovery instead of peering",disabled:!0},pglog_hardlimit:{code:"pglog_hardlimit",name:"PG Log Hard Limit",value:!1,description:"Puts a hard limit on pg log length",disabled:!0}},this.unknownFlags=[],this.permissions=this.authStorageService.getPermissions()}ngOnInit(){this.osdService.getFlags().subscribe(t=>{t.forEach(o=>{this.allFlags[o]?this.allFlags[o].value=!0:this.unknownFlags.push(o)}),this.flags=Ar().toArray(this.allFlags)})}submitAction(){const t=this.flags.filter(o=>o.value).map(o=>o.code).concat(this.unknownFlags);this.osdService.updateFlags(t).subscribe(()=>{this.notificationService.show(_a.k.success,"Updated OSD Flags"),this.activeModal.close()},()=>{this.activeModal.close()})}}return n.\u0275fac=function(t){return new(t||n)(e.Y36(lt.Kz),e.Y36(ki.p4),e.Y36(_t.j),e.Y36(Ji),e.Y36(ll.g))},n.\u0275cmp=e.Xpm({type:n,selectors:[["cd-osd-flags-modal"]],decls:10,vars:6,consts:function(){let s;return s="Cluster-wide OSD Flags",[[3,"modalRef"],[1,"modal-title"],s,[1,"modal-content"],["name","osdFlagsForm","novalidate","","cdFormScope","osd",3,"formGroup"],["formDir","ngForm"],[1,"modal-body","osd-modal"],["class","custom-control custom-checkbox",4,"ngFor","ngForOf"],[1,"modal-footer"],[3,"form","showSubmit","submitText","submitActionEvent"],[1,"custom-control","custom-checkbox"],["type","checkbox",1,"custom-control-input",3,"checked","name","id","disabled","change"],["ng-class","['tc_' + key]",1,"custom-control-label",3,"for"],[1,"form-text","text-muted"],["class","m-1",4,"ngIf"],[1,"m-1"]]},template:function(t,o){1&t&&(e.TgZ(0,"cd-modal",0),e.ynx(1,1),e.SDv(2,2),e.BQk(),e.ynx(3,3),e.TgZ(4,"form",4,5),e.TgZ(6,"div",6),e.YNc(7,Q0,9,8,"div",7),e.qZA(),e.TgZ(8,"div",8),e.TgZ(9,"cd-form-button-panel",9),e.NdJ("submitActionEvent",function(){return o.submitAction()}),e.qZA(),e.qZA(),e.qZA(),e.BQk(),e.qZA()),2&t&&(e.Q6J("modalRef",o.activeModal),e.xp6(4),e.Q6J("formGroup",o.osdFlagsForm),e.xp6(3),e.Q6J("ngForOf",o.flags),e.xp6(2),e.Q6J("form",o.osdFlagsForm)("showSubmit",o.permissions.osd.update)("submitText",o.actionLabels.UPDATE))},directives:[h.z,vn._Y,vn.JL,Cv.T,tl.V,vn.sg,_.sg,nl.p,ca.o,Ha.b,_.O5],styles:[""]}),n})();function X0(n,s){if(1&n&&(e.TgZ(0,"cd-helper"),e._uU(1),e.qZA()),2&n){const t=e.oxw(2).$implicit;e.xp6(1),e.hij(" ",t.long_desc,"")}}function $b(n,s){if(1&n&&(e.TgZ(0,"div",4),e.TgZ(1,"label",5),e.TgZ(2,"b"),e._uU(3),e.qZA(),e._UZ(4,"br"),e.TgZ(5,"span",6),e._uU(6),e.YNc(7,X0,2,1,"cd-helper",7),e.qZA(),e.qZA(),e.TgZ(8,"div",8),e.TgZ(9,"div",9),e._UZ(10,"input",10),e._UZ(11,"label",11),e.qZA(),e.qZA(),e.qZA()),2&n){const t=e.oxw().$implicit;e.xp6(1),e.Q6J("for",t.name),e.xp6(2),e.Oqu(t.text),e.xp6(3),e.hij(" ",t.desc," "),e.xp6(1),e.Q6J("ngIf",t.long_desc),e.xp6(3),e.Q6J("id",t.name)("formControlName",t.name),e.xp6(1),e.Q6J("for",t.name)}}function Ym(n,s){if(1&n&&(e.TgZ(0,"cd-helper"),e._uU(1),e.qZA()),2&n){const t=e.oxw(2).$implicit;e.xp6(1),e.hij(" ",t.long_desc,"")}}const O1=function(n){return[n]};function K0(n,s){if(1&n){const t=e.EpF();e.TgZ(0,"div",16),e.TgZ(1,"button",17),e.NdJ("click",function(){e.CHM(t);const c=e.oxw(2).$implicit;return e.oxw().resetValue(c.name)}),e._UZ(2,"i",18),e.qZA(),e.qZA()}if(2&n){const t=e.oxw(3);e.xp6(2),e.Q6J("ngClass",e.VKq(1,O1,t.icons.erase))}}function q0(n,s){if(1&n&&(e.TgZ(0,"span",19),e._uU(1),e.qZA()),2&n){const t=e.oxw(2).$implicit;e.xp6(1),e.hij(" ",t.additionalTypeInfo.patternHelpText,"")}}function ey(n,s){if(1&n&&(e.TgZ(0,"span",19),e._uU(1),e.qZA()),2&n){const t=e.oxw(2).$implicit;e.xp6(1),e.hij(" ",t.additionalTypeInfo.patternHelpText,"")}}function ty(n,s){if(1&n&&(e.TgZ(0,"span",19),e.SDv(1,20),e.qZA()),2&n){const t=e.oxw(2).$implicit;e.xp6(1),e.pQV(t.maxValue),e.QtT(1)}}function Hb(n,s){if(1&n&&(e.TgZ(0,"span",19),e.SDv(1,21),e.qZA()),2&n){const t=e.oxw(2).$implicit;e.xp6(1),e.pQV(t.minValue),e.QtT(1)}}function Ub(n,s){if(1&n&&(e.TgZ(0,"div",4),e.TgZ(1,"label",5),e._uU(2),e._UZ(3,"br"),e.TgZ(4,"span",6),e._uU(5),e.YNc(6,Ym,2,1,"cd-helper",7),e.qZA(),e.qZA(),e.TgZ(7,"div",8),e.TgZ(8,"div",12),e._UZ(9,"input",13),e.YNc(10,K0,3,3,"div",14),e.qZA(),e.YNc(11,q0,2,1,"span",15),e.YNc(12,ey,2,1,"span",15),e.YNc(13,ty,2,1,"span",15),e.YNc(14,Hb,2,1,"span",15),e.qZA(),e.qZA()),2&n){const t=e.oxw().$implicit,o=e.oxw();e.xp6(1),e.Q6J("for",t.name),e.xp6(1),e.hij("",t.text," "),e.xp6(3),e.hij(" ",t.desc," "),e.xp6(1),e.Q6J("ngIf",t.long_desc),e.xp6(3),e.Q6J("type",t.additionalTypeInfo.inputType)("id",t.name)("placeholder",t.additionalTypeInfo.humanReadable)("formControlName",t.name)("step",o.getStep(t.type,o.optionsForm.getValue(t.name))),e.xp6(1),e.Q6J("ngIf",o.optionsFormShowReset),e.xp6(1),e.Q6J("ngIf",o.optionsForm.showError(t.name,o.optionsFormDir,"pattern")),e.xp6(1),e.Q6J("ngIf",o.optionsForm.showError(t.name,o.optionsFormDir,"invalidUuid")),e.xp6(1),e.Q6J("ngIf",o.optionsForm.showError(t.name,o.optionsFormDir,"max")),e.xp6(1),e.Q6J("ngIf",o.optionsForm.showError(t.name,o.optionsFormDir,"min"))}}function Bb(n,s){1&n&&e._UZ(0,"hr",22)}function Yb(n,s){if(1&n&&(e.TgZ(0,"div"),e.YNc(1,$b,12,7,"div",2),e.YNc(2,Ub,15,14,"div",2),e.YNc(3,Bb,1,0,"hr",3),e.qZA()),2&n){const t=s.$implicit,o=s.last;e.xp6(1),e.Q6J("ngIf","bool"===t.type),e.xp6(1),e.Q6J("ngIf","bool"!==t.type),e.xp6(1),e.Q6J("ngIf",!o)}}let ny=(()=>{class n{constructor(t){this.configService=t,this.optionNames=[],this.optionsForm=new Us.d({}),this.optionsFormDir=new vn.F([],[]),this.optionsFormGroupName="",this.optionsFormShowReset=!0,this.icons=No.P,this.options=[],this.optionsFormGroup=new Us.d({})}static optionNameToText(t){const o=["mon","mgr","osd","mds","client"];return t.split("_").filter((c,g)=>0!==g||!o.includes(c)).map(c=>c.charAt(0).toUpperCase()+c.substring(1)).join(" ")}ngOnInit(){this.createForm(),this.loadStoredData()}createForm(){this.optionsForm.addControl(this.optionsFormGroupName,this.optionsFormGroup),this.optionNames.forEach(t=>{this.optionsFormGroup.addControl(t,new vn.NI(null))})}getStep(t,o){return ss.getTypeStep(t,o)}loadStoredData(){this.configService.filter(this.optionNames).subscribe(t=>{this.options=t.map(o=>{const c=this.optionsForm.get(o.name),g=ss.getTypeValidators(o);return o.additionalTypeInfo=ss.getType(o.type),o.text=n.optionNameToText(o.name),o.value=Ar().find(o.value,C=>"osd"===C.section),o.value&&c.setValue("bool"===o.additionalTypeInfo.name?"true"===o.value.value:o.value.value),g&&(o.patternHelpText=g.patternHelpText,"max"in g&&""!==g.max&&(o.maxValue=g.max),"min"in g&&""!==g.min&&(o.minValue=g.min),c.setValidators(g.validators)),o})})}saveValues(){const t={};return this.optionNames.forEach(o=>{const c=this.optionsForm.getValue(o);null!==c&&""!==c&&(t[o]={section:"osd",value:c})}),this.configService.bulkCreate({options:t})}resetValue(t){this.configService.delete(t,"osd").subscribe(()=>{this.optionsForm.get(t).reset()})}}return n.\u0275fac=function(t){return new(t||n)(e.Y36(va.e))},n.\u0275cmp=e.Xpm({type:n,selectors:[["cd-config-option"]],inputs:{optionNames:"optionNames",optionsForm:"optionsForm",optionsFormDir:"optionsFormDir",optionsFormGroupName:"optionsFormGroupName",optionsFormShowReset:"optionsFormShowReset"},decls:2,vars:2,consts:function(){let s,t,o;return s="Remove the custom configuration value. The default configuration will be inherited and used instead.",t="The entered value is too high! It must not be greater than " + "\ufffd0\ufffd" + ".",o="The entered value is too low! It must not be lower than " + "\ufffd0\ufffd" + ".",[[3,"formGroup"],[4,"ngFor","ngForOf"],["class","form-group row pt-2",4,"ngIf"],["class","my-2",4,"ngIf"],[1,"form-group","row","pt-2"],[1,"cd-col-form-label",3,"for"],[1,"text-muted"],[4,"ngIf"],[1,"cd-col-form-input"],[1,"custom-control","custom-checkbox"],["type","checkbox",1,"custom-control-input",3,"id","formControlName"],[1,"custom-control-label",3,"for"],[1,"input-group"],[1,"form-control",3,"type","id","placeholder","formControlName","step"],["class","input-group-append",4,"ngIf"],["class","invalid-feedback",4,"ngIf"],[1,"input-group-append"],["type","button","data-toggle","button","title",s,1,"btn","btn-light",3,"click"],["aria-hidden","true",3,"ngClass"],[1,"invalid-feedback"],t,o,[1,"my-2"]]},template:function(t,o){1&t&&(e.TgZ(0,"div",0),e.YNc(1,Yb,4,3,"div",1),e.qZA()),2&t&&(e.Q6J("formGroup",o.optionsFormGroup),e.xp6(1),e.Q6J("ngForOf",o.options))},directives:[vn.JL,vn.sg,tl.V,_.sg,_.O5,$a.P,ca.o,vn.Wl,Ha.b,vn.JJ,vn.u,E.S,vn.Fj,_.mk],styles:[".custom-checkbox[_ngcontent-%COMP%]   label[_ngcontent-%COMP%], .custom-checkbox[_ngcontent-%COMP%]   input[_ngcontent-%COMP%]{cursor:pointer}.col-form-label[_ngcontent-%COMP%]{text-align:left}"]}),n})(),Zb=(()=>{class n{}return n.basicOptions=["osd_scrub_during_recovery","osd_scrub_begin_hour","osd_scrub_end_hour","osd_scrub_begin_week_day","osd_scrub_end_week_day","osd_scrub_min_interval","osd_scrub_max_interval","osd_deep_scrub_interval","osd_scrub_auto_repair","osd_max_scrubs","osd_scrub_priority","osd_scrub_sleep"],n.advancedOptions=["osd_scrub_auto_repair_num_errors","osd_debug_deep_scrub_sleep","osd_deep_scrub_keys","osd_deep_scrub_large_omap_object_key_threshold","osd_deep_scrub_large_omap_object_value_sum_threshold","osd_deep_scrub_randomize_ratio","osd_deep_scrub_stride","osd_deep_scrub_update_digest_min_age","osd_requested_scrub_priority","osd_scrub_backoff_ratio","osd_scrub_chunk_max","osd_scrub_chunk_min","osd_scrub_cost","osd_scrub_interval_randomize_ratio","osd_scrub_invalid_stats","osd_scrub_load_threshold","osd_scrub_max_preemptions"],n})();const ry=["basicOptionsValues"],jb=["advancedOptionsValues"];function Gb(n,s){if(1&n){const t=e.EpF();e.TgZ(0,"a",15),e.NdJ("click",function(){return e.CHM(t),e.oxw().advancedEnabled=!0}),e.SDv(1,16),e.qZA()}}function OS(n,s){if(1&n&&(e.TgZ(0,"div"),e.TgZ(1,"h3",17),e.SDv(2,18),e.qZA(),e._UZ(3,"cd-config-option",7,19),e.qZA()),2&n){const t=e.oxw(),o=e.MAs(7);e.xp6(3),e.Q6J("optionNames",t.advancedOptions)("optionsForm",t.osdPgScrubForm)("optionsFormDir",o)("optionsFormGroupName","advancedFormGroup")}}let wS=(()=>{class n{constructor(t,o,c,g){this.activeModal=t,this.authStorageService=o,this.notificationService=c,this.actionLabels=g,this.basicOptions=Zb.basicOptions,this.advancedOptions=Zb.advancedOptions,this.advancedEnabled=!1,this.osdPgScrubForm=new Us.d({}),this.resource="PG scrub options",this.action=this.actionLabels.EDIT,this.permissions=this.authStorageService.getPermissions()}submitAction(){const t=[this.basicOptionsValues.saveValues()];this.advancedOptionsValues&&t.push(this.advancedOptionsValues.saveValues()),(0,Oc.D)(t).subscribe(()=>{this.notificationService.show(_a.k.success,"Updated PG scrub options"),this.activeModal.close()},()=>{this.activeModal.close()})}}return n.\u0275fac=function(t){return new(t||n)(e.Y36(lt.Kz),e.Y36(_t.j),e.Y36(ll.g),e.Y36(ki.p4))},n.\u0275cmp=e.Xpm({type:n,selectors:[["cd-osd-pg-scrub-modal"]],viewQuery:function(t,o){if(1&t&&(e.Gf(ry,7),e.Gf(jb,5)),2&t){let c;e.iGM(c=e.CRH())&&(o.basicOptionsValues=c.first),e.iGM(c=e.CRH())&&(o.advancedOptionsValues=c.first)}},decls:19,vars:21,consts:function(){let s,t,o;return s="" + "\ufffd0\ufffd" + " " + "\ufffd1\ufffd" + "",t="Advanced...",o="Advanced configuration options",[[3,"modalRef"],[1,"modal-title"],s,[1,"modal-content"],["novalidate","","cdFormScope","osd",3,"formGroup"],["formDir","ngForm"],[1,"modal-body","osd-modal"],[3,"optionNames","optionsForm","optionsFormDir","optionsFormGroupName"],["basicOptionsValues",""],[1,"row"],[1,"col-sm-12"],["class","pull-right margin-right-md",3,"click",4,"ngIf"],[4,"ngIf"],[1,"modal-footer"],[3,"form","showSubmit","submitText","submitActionEvent"],[1,"pull-right","margin-right-md",3,"click"],t,[1,"page-header"],o,["advancedOptionsValues",""]]},template:function(t,o){if(1&t&&(e.TgZ(0,"cd-modal",0),e.ynx(1,1),e.SDv(2,2),e.ALo(3,"titlecase"),e.ALo(4,"upperFirst"),e.BQk(),e.ynx(5,3),e.TgZ(6,"form",4,5),e.TgZ(8,"div",6),e._UZ(9,"cd-config-option",7,8),e.TgZ(11,"div",9),e.TgZ(12,"div",10),e.YNc(13,Gb,2,0,"a",11),e.qZA(),e.qZA(),e.YNc(14,OS,5,4,"div",12),e.qZA(),e.TgZ(15,"div",13),e.TgZ(16,"cd-form-button-panel",14),e.NdJ("submitActionEvent",function(){return o.submitAction()}),e.ALo(17,"titlecase"),e.ALo(18,"upperFirst"),e.qZA(),e.qZA(),e.qZA(),e.BQk(),e.qZA()),2&t){const c=e.MAs(7);e.Q6J("modalRef",o.activeModal),e.xp6(4),e.pQV(e.lcZ(3,13,o.action))(e.lcZ(4,15,o.resource)),e.QtT(2),e.xp6(2),e.Q6J("formGroup",o.osdPgScrubForm),e.xp6(3),e.Q6J("optionNames",o.basicOptions)("optionsForm",o.osdPgScrubForm)("optionsFormDir",c)("optionsFormGroupName","basicFormGroup"),e.xp6(4),e.Q6J("ngIf",!o.advancedEnabled),e.xp6(1),e.Q6J("ngIf",o.advancedEnabled),e.xp6(2),e.Q6J("form",o.osdPgScrubForm)("showSubmit",o.permissions.configOpt.update)("submitText",e.lcZ(17,17,o.action)+" "+e.lcZ(18,19,o.resource))}},directives:[h.z,vn._Y,vn.JL,Cv.T,tl.V,vn.sg,ny,_.O5,nl.p],pipes:[_.rS,K.m],styles:[""]}),n})();function w1(n,s){if(1&n&&(e.TgZ(0,"option",22),e._uU(1),e.qZA()),2&n){const t=s.$implicit;e.Q6J("value",t.name),e.xp6(1),e.hij(" ",t.text," ")}}function Vb(n,s){1&n&&(e.TgZ(0,"span",23),e.SDv(1,24),e.qZA())}function iy(n,s){if(1&n&&(e.TgZ(0,"cd-helper"),e._uU(1),e.qZA()),2&n){const t=e.oxw().$implicit;e.xp6(1),e.Oqu(t.value.desc)}}function oy(n,s){1&n&&(e.TgZ(0,"span",23),e.SDv(1,29),e.qZA())}function xS(n,s){if(1&n&&(e.TgZ(0,"span",23),e.SDv(1,30),e.qZA()),2&n){const t=e.oxw().$implicit;e.xp6(1),e.pQV(t.value.patternHelpText),e.QtT(1)}}function hh(n,s){if(1&n&&(e.TgZ(0,"span",23),e.SDv(1,31),e.qZA()),2&n){const t=e.oxw().$implicit;e.xp6(1),e.pQV(t.value.maxValue),e.QtT(1)}}function DS(n,s){if(1&n&&(e.TgZ(0,"span",23),e.SDv(1,32),e.qZA()),2&n){const t=e.oxw().$implicit;e.xp6(1),e.pQV(t.value.minValue),e.QtT(1)}}const sy=function(n){return{required:n}};function zb(n,s){if(1&n&&(e.TgZ(0,"div",7),e.TgZ(1,"label",25),e.TgZ(2,"span",26),e._uU(3),e.qZA(),e.YNc(4,iy,2,1,"cd-helper",27),e.qZA(),e.TgZ(5,"div",10),e._UZ(6,"input",28),e.YNc(7,oy,2,0,"span",13),e.YNc(8,xS,2,1,"span",13),e.YNc(9,hh,2,1,"span",13),e.YNc(10,DS,2,1,"span",13),e.qZA(),e.qZA()),2&n){const t=s.$implicit,o=e.oxw(),c=e.MAs(5);e.xp6(1),e.Q6J("for",t.key),e.xp6(1),e.Q6J("ngClass",e.VKq(11,sy,o.osdRecvSpeedForm.getValue("customizePriority"))),e.xp6(1),e.hij(" ",t.value.text," "),e.xp6(1),e.Q6J("ngIf",t.value.desc),e.xp6(2),e.Q6J("id",t.key)("formControlName",t.key)("readonly",!o.osdRecvSpeedForm.getValue("customizePriority")),e.xp6(1),e.Q6J("ngIf",o.osdRecvSpeedForm.getValue("customizePriority")&&o.osdRecvSpeedForm.showError(t.key,c,"required")),e.xp6(1),e.Q6J("ngIf",o.osdRecvSpeedForm.getValue("customizePriority")&&o.osdRecvSpeedForm.showError(t.key,c,"pattern")),e.xp6(1),e.Q6J("ngIf",o.osdRecvSpeedForm.getValue("customizePriority")&&o.osdRecvSpeedForm.showError(t.key,c,"max")),e.xp6(1),e.Q6J("ngIf",o.osdRecvSpeedForm.getValue("customizePriority")&&o.osdRecvSpeedForm.showError(t.key,c,"min"))}}let x1=(()=>{class n{constructor(t,o,c,g,C,D){this.activeModal=t,this.actionLabels=o,this.authStorageService=c,this.configService=g,this.notificationService=C,this.osdService=D,this.priorities=[],this.priorityAttrs={},this.permissions=this.authStorageService.getPermissions(),this.priorities=this.osdService.osdRecvSpeedModalPriorities.KNOWN_PRIORITIES,this.osdRecvSpeedForm=new Us.d({priority:new vn.NI(null,{validators:[vn.kI.required]}),customizePriority:new vn.NI(!1)}),this.priorityAttrs={osd_max_backfills:{text:"Max Backfills",desc:"",patternHelpText:"",maxValue:void 0,minValue:void 0},osd_recovery_max_active:{text:"Recovery Max Active",desc:"",patternHelpText:"",maxValue:void 0,minValue:void 0},osd_recovery_max_single_start:{text:"Recovery Max Single Start",desc:"",patternHelpText:"",maxValue:void 0,minValue:void 0},osd_recovery_sleep:{text:"Recovery Sleep",desc:"",patternHelpText:"",maxValue:void 0,minValue:void 0}},Object.keys(this.priorityAttrs).forEach(P=>{this.osdRecvSpeedForm.addControl(P,new vn.NI(null,{validators:[vn.kI.required]}))})}ngOnInit(){this.configService.filter(Object.keys(this.priorityAttrs)).subscribe(t=>{const o=this.getCurrentValues(t);this.detectPriority(o.values,c=>{this.setPriority(c)}),this.setDescription(o.configOptions),this.setValidators(o.configOptions)})}detectPriority(t,o){const c=Ar().find(this.priorities,g=>Ar().isEqual(g.values,t));return this.osdRecvSpeedForm.controls.customizePriority.setValue(!1),c?o(c):4===Object.entries(t).length?(this.osdRecvSpeedForm.controls.customizePriority.setValue(!0),o(Object({name:"custom",text:"Custom",values:t}))):o(this.priorities[0])}getCurrentValues(t){const o={values:{},configOptions:[]};return t.forEach(c=>{o.configOptions.push(c),"value"in c?c.value.forEach(g=>{"osd"===g.section&&(o.values[c.name]=Number(g.value))}):"default"in c&&null!==c.default&&(o.values[c.name]=Number(c.default))}),o}setDescription(t){t.forEach(o=>{""!==o.desc&&(this.priorityAttrs[o.name].desc=o.desc)})}setPriority(t){const o=Ar().find(this.priorities,c=>"custom"===c.name);"custom"===t.name?o||this.priorities.push(t):o&&this.priorities.splice(this.priorities.indexOf(o),1),this.osdRecvSpeedForm.controls.priority.setValue(t.name),Object.entries(t.values).forEach(([c,g])=>{this.osdRecvSpeedForm.controls[c].setValue(g)})}setValidators(t){t.forEach(o=>{const c=ss.getTypeValidators(o);c?(c.validators.push(vn.kI.required),"max"in c&&""!==c.max&&(this.priorityAttrs[o.name].maxValue=c.max),"min"in c&&""!==c.min&&(this.priorityAttrs[o.name].minValue=c.min),this.priorityAttrs[o.name].patternHelpText=c.patternHelpText,this.osdRecvSpeedForm.controls[o.name].setValidators(c.validators)):this.osdRecvSpeedForm.controls[o.name].setValidators(vn.kI.required)})}onCustomizePriorityChange(){const t={};if(Object.keys(this.priorityAttrs).forEach(o=>{t[o]=this.osdRecvSpeedForm.getValue(o)}),this.osdRecvSpeedForm.getValue("customizePriority")){const o={name:"custom",text:"Custom",values:t};this.setPriority(o)}else this.detectPriority(t,o=>{this.setPriority(o)})}onPriorityChange(t){const o=Ar().find(this.priorities,c=>c.name===t)||this.priorities[0];this.osdRecvSpeedForm.get("customizePriority").setValue(!1),this.setPriority(o)}submitAction(){const t={};Object.keys(this.priorityAttrs).forEach(o=>{t[o]={section:"osd",value:this.osdRecvSpeedForm.getValue(o)}}),this.configService.bulkCreate({options:t}).subscribe(()=>{this.notificationService.show(_a.k.success,"Updated OSD recovery speed priority '" + this.osdRecvSpeedForm.getValue("priority") + "'"),this.activeModal.close()},()=>{this.activeModal.close()})}}return n.\u0275fac=function(t){return new(t||n)(e.Y36(lt.Kz),e.Y36(ki.p4),e.Y36(_t.j),e.Y36(va.e),e.Y36(ll.g),e.Y36(Ji))},n.\u0275cmp=e.Xpm({type:n,selectors:[["cd-osd-recv-speed-modal"]],decls:24,vars:10,consts:function(){let s,t,o,c,g,C,D,P;return s="OSD Recovery Priority",t="Priority",o="Customize priority values",c="This field is required.",g="This field is required!",C="" + "\ufffd0\ufffd" + "",D="The entered value is too high! It must not be greater than " + "\ufffd0\ufffd" + ".",P="The entered value is too low! It must not be lower than " + "\ufffd0\ufffd" + ".",[[3,"modalRef"],[1,"modal-title"],s,[1,"modal-content"],["novalidate","","cdFormScope","osd",3,"formGroup"],["formDir","ngForm"],[1,"modal-body"],[1,"form-group","row"],["for","priority",1,"cd-col-form-label","required"],t,[1,"cd-col-form-input"],["formControlName","priority","id","priority",1,"form-control",3,"change"],[3,"value",4,"ngFor","ngForOf"],["class","invalid-feedback",4,"ngIf"],[1,"cd-col-form-offset"],[1,"custom-control","custom-checkbox"],["formControlName","customizePriority","id","customizePriority","name","customizePriority","type","checkbox",1,"custom-control-input",3,"change"],["for","customizePriority",1,"custom-control-label"],o,["class","form-group row",4,"ngFor","ngForOf"],[1,"modal-footer"],[3,"form","submitText","showSubmit","submitActionEvent"],[3,"value"],[1,"invalid-feedback"],c,[1,"cd-col-form-label",3,"for"],[3,"ngClass"],[4,"ngIf"],["type","number",1,"form-control",3,"id","formControlName","readonly"],g,C,D,P]},template:function(t,o){if(1&t&&(e.TgZ(0,"cd-modal",0),e.ynx(1,1),e.SDv(2,2),e.BQk(),e.ynx(3,3),e.TgZ(4,"form",4,5),e.TgZ(6,"div",6),e.TgZ(7,"div",7),e.TgZ(8,"label",8),e.SDv(9,9),e.qZA(),e.TgZ(10,"div",10),e.TgZ(11,"select",11),e.NdJ("change",function(g){return o.onPriorityChange(g.target.value)}),e.YNc(12,w1,2,2,"option",12),e.qZA(),e.YNc(13,Vb,2,0,"span",13),e.qZA(),e.qZA(),e.TgZ(14,"div",7),e.TgZ(15,"div",14),e.TgZ(16,"div",15),e.TgZ(17,"input",16),e.NdJ("change",function(){return o.onCustomizePriorityChange()}),e.qZA(),e.TgZ(18,"label",17),e.SDv(19,18),e.qZA(),e.qZA(),e.qZA(),e.qZA(),e.YNc(20,zb,11,13,"div",19),e.ALo(21,"keyvalue"),e.qZA(),e.TgZ(22,"div",20),e.TgZ(23,"cd-form-button-panel",21),e.NdJ("submitActionEvent",function(){return o.submitAction()}),e.qZA(),e.qZA(),e.qZA(),e.BQk(),e.qZA()),2&t){const c=e.MAs(5);e.Q6J("modalRef",o.activeModal),e.xp6(4),e.Q6J("formGroup",o.osdRecvSpeedForm),e.xp6(8),e.Q6J("ngForOf",o.priorities),e.xp6(1),e.Q6J("ngIf",o.osdRecvSpeedForm.showError("priority",c,"required")),e.xp6(7),e.Q6J("ngForOf",e.lcZ(21,8,o.priorityAttrs)),e.xp6(3),e.Q6J("form",o.osdRecvSpeedForm)("submitText",o.actionLabels.UPDATE)("showSubmit",o.permissions.configOpt.update)}},directives:[h.z,vn._Y,vn.JL,Cv.T,tl.V,vn.sg,$a.P,ca.o,vn.EJ,Ha.b,vn.JJ,vn.u,_.sg,_.O5,vn.Wl,nl.p,vn.YN,vn.Kr,_.mk,vn.wV,vn.Fj,E.S],pipes:[_.Nd],styles:[""]}),n})();function ay(n,s){1&n&&(e.TgZ(0,"span"),e.SDv(1,15),e.qZA())}function ly(n,s){1&n&&(e.TgZ(0,"span"),e.SDv(1,16),e.qZA())}function Wb(n,s){if(1&n&&(e.TgZ(0,"span",13),e.YNc(1,ay,2,0,"span",14),e.YNc(2,ly,2,0,"span",14),e.qZA()),2&n){const t=e.oxw();e.xp6(1),e.Q6J("ngIf",null==t.weight.errors?null:t.weight.errors.required),e.xp6(1),e.Q6J("ngIf",(null==t.weight.errors?null:t.weight.errors.max)||(null==t.weight.errors?null:t.weight.errors.min))}}let uy=(()=>{class n{constructor(t,o,c,g){this.actionLabels=t,this.activeModal=o,this.osdService=c,this.fb=g,this.currentWeight=1}get weight(){return this.reweightForm.get("weight")}ngOnInit(){this.reweightForm=this.fb.group({weight:this.fb.control(this.currentWeight,[vn.kI.required])})}reweight(){this.osdService.reweight(this.osdId,this.reweightForm.value.weight).subscribe(()=>this.activeModal.close())}}return n.\u0275fac=function(t){return new(t||n)(e.Y36(ki.p4),e.Y36(lt.Kz),e.Y36(Ji),e.Y36(id.O))},n.\u0275cmp=e.Xpm({type:n,selectors:[["cd-osd-reweight-modal"]],decls:14,vars:7,consts:function(){let s,t,o;return s="Reweight OSD: " + "\ufffd0\ufffd" + "",t="This field is required.",o="The value needs to be between 0 and 1.",[[3,"modalRef"],[1,"modal-title"],s,[1,"modal-content"],[3,"formGroup"],[1,"modal-body"],[1,"row"],["for","weight",1,"cd-col-form-label"],[1,"cd-col-form-input"],["id","weight","type","number","step","0.1","formControlName","weight","min","0","max","1",1,"form-control",3,"value"],["class","invalid-feedback",4,"ngIf"],[1,"modal-footer"],[3,"form","submitText","submitActionEvent"],[1,"invalid-feedback"],[4,"ngIf"],t,o]},template:function(t,o){1&t&&(e.TgZ(0,"cd-modal",0),e.ynx(1,1),e.SDv(2,2),e.BQk(),e.ynx(3,3),e.TgZ(4,"form",4),e.TgZ(5,"div",5),e.TgZ(6,"div",6),e.TgZ(7,"label",7),e._uU(8,"Weight"),e.qZA(),e.TgZ(9,"div",8),e._UZ(10,"input",9),e.YNc(11,Wb,3,2,"span",10),e.qZA(),e.qZA(),e.qZA(),e.TgZ(12,"div",11),e.TgZ(13,"cd-form-button-panel",12),e.NdJ("submitActionEvent",function(){return o.reweight()}),e.qZA(),e.qZA(),e.qZA(),e.BQk(),e.qZA()),2&t&&(e.Q6J("modalRef",o.activeModal),e.xp6(2),e.pQV(o.osdId),e.QtT(2),e.xp6(2),e.Q6J("formGroup",o.reweightForm),e.xp6(6),e.Q6J("value",o.currentWeight),e.xp6(1),e.Q6J("ngIf",o.weight.errors),e.xp6(2),e.Q6J("form",o.reweightForm)("submitText",o.actionLabels.REWEIGHT))},directives:[h.z,vn._Y,vn.JL,tl.V,vn.sg,ca.o,vn.wV,vn.qQ,vn.Fd,vn.Fj,Ha.b,vn.JJ,vn.u,_.O5,nl.p],styles:[""]}),n})();var Mv=i(86969);let D1=(()=>{class n{constructor(t,o,c,g,C){this.activeModal=t,this.actionLabels=o,this.osdService=c,this.notificationService=g,this.joinPipe=C,this.selected=[]}ngOnInit(){this.scrubForm=new vn.cw({})}scrub(){(0,Oc.D)(this.selected.map(t=>this.osdService.scrub(t,this.deep))).subscribe(()=>{this.notificationService.show(_a.k.success,"" + (this.deep ? "Deep scrub" : "Scrub") + " was initialized in the following OSD(s): " + this.joinPipe.transform(this.selected) + ""),this.activeModal.close()},()=>this.activeModal.close())}}return n.\u0275fac=function(t){return new(t||n)(e.Y36(lt.Kz),e.Y36(ki.p4),e.Y36(Ji),e.Y36(ll.g),e.Y36(Mv.A))},n.\u0275cmp=e.Xpm({type:n,selectors:[["cd-osd-scrub-modal"]],decls:13,vars:9,consts:function(){let s,t,o,c;return s="{VAR_SELECT, select, true {Deep } other {}}",s=e.Zx4(s,{VAR_SELECT:"\ufffd0\ufffd"}),t="OSDs " + s + "Scrub",o="{VAR_SELECT, select, true {deep } other {}}",o=e.Zx4(o,{VAR_SELECT:"\ufffd0\ufffd"}),c="You are about to apply a " + o + "scrub to the OSD(s): " + "\ufffd#9\ufffd" + "" + "\ufffd1\ufffd" + "" + "\ufffd/#9\ufffd" + ".",[[3,"modalRef"],[1,"modal-title"],t,[1,"modal-content"],["name","scrubForm","novalidate","",3,"formGroup"],["formDir","ngForm"],[1,"modal-body"],c,[1,"modal-footer"],[3,"form","submitText","submitActionEvent"]]},template:function(t,o){1&t&&(e.TgZ(0,"cd-modal",0),e.TgZ(1,"span",1),e.SDv(2,2),e.qZA(),e.ynx(3,3),e.TgZ(4,"form",4,5),e.TgZ(6,"div",6),e.TgZ(7,"p"),e.tHW(8,7),e._UZ(9,"strong"),e.ALo(10,"join"),e.N_p(),e.qZA(),e.qZA(),e.TgZ(11,"div",8),e.TgZ(12,"cd-form-button-panel",9),e.NdJ("submitActionEvent",function(){return o.scrub()}),e.qZA(),e.qZA(),e.qZA(),e.BQk(),e.qZA()),2&t&&(e.Q6J("modalRef",o.activeModal),e.xp6(2),e.pQV(o.deep),e.QtT(2),e.xp6(2),e.Q6J("formGroup",o.scrubForm),e.xp6(6),e.pQV(o.deep)(e.lcZ(10,7,o.selected)),e.QtT(8),e.xp6(2),e.Q6J("form",o.scrubForm)("submitText",o.actionLabels.UPDATE))},directives:[h.z,vn._Y,vn.JL,tl.V,vn.sg,nl.p],pipes:[Mv.A],styles:[""]}),n})();var cy=i(98056);function Nf(n,s){if(1&n&&e._UZ(0,"cd-device-list",17),2&n){const t=e.oxw(2);e.Q6J("osdId",null==t.osd?null:t.osd.id)}}function R1(n,s){if(1&n&&e._UZ(0,"cd-table-key-value",18),2&n){const t=e.oxw(2);e.Q6J("data",null==t.osd||null==t.osd.details?null:t.osd.details.osd_map)}}function Jb(n,s){if(1&n){const t=e.EpF();e.TgZ(0,"cd-table-key-value",21),e.NdJ("fetchData",function(){return e.CHM(t),e.oxw(3).refresh()}),e.qZA()}if(2&n){const t=e.oxw(3);e.Q6J("data",null==t.osd||null==t.osd.details?null:t.osd.details.osd_metadata)}}function Qb(n,s){1&n&&(e.TgZ(0,"cd-alert-panel",22),e.SDv(1,23),e.qZA())}function Xb(n,s){if(1&n&&(e.YNc(0,Jb,1,1,"cd-table-key-value",19),e.YNc(1,Qb,2,0,"ng-template",null,20,e.W1O)),2&n){const t=e.MAs(2),o=e.oxw(2);e.Q6J("ngIf",null==o.osd||null==o.osd.details?null:o.osd.details.osd_metadata)("ngIfElse",t)}}function Kb(n,s){if(1&n&&e._UZ(0,"cd-smart-list",17),2&n){const t=e.oxw(2);e.Q6J("osdId",null==t.osd?null:t.osd.id)}}function N1(n,s){if(1&n&&e._UZ(0,"cd-table-performance-counter",25),2&n){const t=e.oxw(3);e.Q6J("serviceId",null==t.osd?null:t.osd.id)}}function Av(n,s){if(1&n&&e.YNc(0,N1,1,1,"cd-table-performance-counter",24),2&n){const t=e.oxw(2);e.Q6J("ngIf",null==t.osd?null:t.osd.details)}}function ng(n,s){if(1&n&&e._UZ(0,"cd-grafana",28),2&n){const t=e.oxw(3);e.Q6J("grafanaPath","osd-device-details?var-osd=osd."+t.osd.id)("type","metrics")}}function dy(n,s){1&n&&(e.TgZ(0,"li",26),e.TgZ(1,"a",4),e.SDv(2,27),e.qZA(),e.YNc(3,ng,1,2,"ng-template",6),e.qZA())}function _h(n,s){if(1&n&&(e.ynx(0),e.TgZ(1,"ul",1,2),e.TgZ(3,"li",3),e.TgZ(4,"a",4),e.SDv(5,5),e.qZA(),e.YNc(6,Nf,1,1,"ng-template",6),e.qZA(),e.TgZ(7,"li",7),e.TgZ(8,"a",4),e.SDv(9,8),e.qZA(),e.YNc(10,R1,1,1,"ng-template",6),e.qZA(),e.TgZ(11,"li",9),e.TgZ(12,"a",4),e.SDv(13,10),e.qZA(),e.YNc(14,Xb,3,2,"ng-template",6),e.qZA(),e.TgZ(15,"li",11),e.TgZ(16,"a",4),e.SDv(17,12),e.qZA(),e.YNc(18,Kb,1,1,"ng-template",6),e.qZA(),e.TgZ(19,"li",13),e.TgZ(20,"a",4),e.SDv(21,14),e.qZA(),e.YNc(22,Av,1,1,"ng-template",6),e.qZA(),e.YNc(23,dy,4,0,"li",15),e.qZA(),e._UZ(24,"div",16),e.BQk()),2&n){const t=e.MAs(2),o=e.oxw();e.xp6(23),e.Q6J("ngIf",o.grafanaPermission.read),e.xp6(1),e.Q6J("ngbNavOutlet",t)}}let Zm=(()=>{class n{constructor(t,o){this.osdService=t,this.authStorageService=o,this.grafanaPermission=this.authStorageService.getPermissions().grafana}ngOnChanges(){var t,o,c;(null===(t=this.osd)||void 0===t?void 0:t.id)!==(null===(o=this.selection)||void 0===o?void 0:o.id)&&(this.osd=this.selection),Ar().isNumber(null===(c=this.osd)||void 0===c?void 0:c.id)&&this.refresh()}refresh(){this.osdService.getDetails(this.osd.id).subscribe(t=>{this.osd.details=t})}}return n.\u0275fac=function(t){return new(t||n)(e.Y36(Ji),e.Y36(_t.j))},n.\u0275cmp=e.Xpm({type:n,selectors:[["cd-osd-details"]],inputs:{selection:"selection"},features:[e.TTD],decls:1,vars:1,consts:function(){let s,t,o,c,g,C,D;return s="Devices",t="Attributes (OSD map)",o="Metadata",c="Device health",g="Performance counter",C="Metadata not available",D="Performance Details",[[4,"ngIf"],["ngbNav","","id","tabset-osd-details","cdStatefulTab","osd-details",1,"nav-tabs"],["nav","ngbNav"],["ngbNavItem","devices"],["ngbNavLink",""],s,["ngbNavContent",""],["ngbNavItem","attributes"],t,["ngbNavItem","metadata"],o,["ngbNavItem","device-health"],c,["ngbNavItem","performance-counter"],g,["ngbNavItem","performance-details",4,"ngIf"],[3,"ngbNavOutlet"],[3,"osdId"],[3,"data"],[3,"data","fetchData",4,"ngIf","ngIfElse"],["noMetaData",""],[3,"data","fetchData"],["type","warning"],C,["serviceType","osd",3,"serviceId",4,"ngIf"],["serviceType","osd",3,"serviceId"],["ngbNavItem","performance-details"],D,["uid","CrAHE0iZz","grafanaStyle","three",3,"grafanaPath","type"]]},template:function(t,o){1&t&&e.YNc(0,_h,25,2,"ng-container",0),2&t&&e.Q6J("ngIf",o.selection)},directives:[_.O5,lt.Pz,un.m,lt.nv,lt.Vx,lt.uN,lt.tO,Pa,Vr.b,Jt.G,Xn,cy.p,it.F],styles:[""]}),n})();const qb=["osdUsageTpl"],fy=["markOsdConfirmationTpl"],P1=["criticalConfirmationTpl"],zh=["reweightBodyTpl"],jm=["safeToDestroyBodyTpl"],rf=["deleteOsdExtraTpl"],E_=["flagsTpl"],Ov=function(){return{read:!0}};function Vp(n,s){if(1&n){const t=e.EpF();e.TgZ(0,"cd-table",13),e.NdJ("fetchData",function(){return e.CHM(t),e.oxw().getOsdList()})("setExpandedRow",function(c){return e.CHM(t),e.oxw().setExpandedRow(c)})("updateSelection",function(c){return e.CHM(t),e.oxw().updateSelection(c)}),e.TgZ(1,"div",14),e._UZ(2,"cd-table-actions",15),e._UZ(3,"cd-table-actions",16),e.qZA(),e._UZ(4,"cd-osd-details",17),e.qZA()}if(2&n){const t=e.oxw();e.Q6J("data",t.osds)("columns",t.columns)("hasDetails",!0)("updateSelectionOnRefresh","never"),e.xp6(2),e.Q6J("permission",t.permissions.osd)("selection",t.selection)("tableActions",t.tableActions),e.xp6(1),e.Q6J("permission",e.DdM(11,Ov))("selection",t.selection)("tableActions",t.clusterWideActions),e.xp6(1),e.Q6J("selection",t.expandedRow)}}function I1(n,s){1&n&&e._UZ(0,"cd-grafana",19),2&n&&e.Q6J("grafanaPath","osd-overview?")("type","metrics")}function zg(n,s){1&n&&(e.TgZ(0,"li",2),e.TgZ(1,"a",3),e.SDv(2,18),e.qZA(),e.YNc(3,I1,1,2,"ng-template",5),e.qZA())}function Wg(n,s){if(1&n&&(e.ynx(0),e.tHW(1,20),e._UZ(2,"strong"),e.ALo(3,"join"),e._UZ(4,"strong"),e.N_p(),e.BQk()),2&n){const t=s.markActionDescription,o=s.osdIds;e.xp6(4),e.pQV(e.lcZ(3,2,o))(t),e.QtT(1)}}function Jg(n,s){if(1&n&&(e.TgZ(0,"div",23),e.TgZ(1,"cd-alert-panel",24),e.SDv(2,25),e.qZA(),e.qZA()),2&n){const t=e.oxw(),o=t.actionDescription,c=t.message,g=e.oxw();e.xp6(2),e.pQV(g.selection.hasSingleSelection)(o)(c),e.QtT(2)}}function Qg(n,s){if(1&n&&(e.YNc(0,Jg,3,3,"div",21),e.ynx(1),e.tHW(2,22),e._UZ(3,"strong"),e.ALo(4,"join"),e._UZ(5,"strong"),e.N_p(),e.BQk()),2&n){const o=s.actionDescription,c=s.osdIds;e.Q6J("ngIf",!s.safeToPerform),e.xp6(5),e.pQV(e.lcZ(4,3,c))(o),e.QtT(2)}}function Xg(n,s){if(1&n&&(e.TgZ(0,"span",28),e._uU(1),e.qZA()),2&n){const t=s.$implicit;e.xp6(1),e.Oqu(t)}}function Kg(n,s){if(1&n&&(e.TgZ(0,"span",29),e._uU(1),e.qZA()),2&n){const t=s.$implicit;e.xp6(1),e.Oqu(t)}}function qg(n,s){if(1&n&&(e.YNc(0,Xg,2,1,"span",26),e.YNc(1,Kg,2,1,"span",27)),2&n){const t=s.row;e.Q6J("ngForOf",t.cdClusterFlags),e.xp6(1),e.Q6J("ngForOf",t.cdIndivFlags)}}function em(n,s){if(1&n&&e._UZ(0,"cd-usage-bar",30),2&n){const t=s.row,o=e.oxw();e.Q6J("total",t.stats.stat_bytes)("used",t.stats.stat_bytes_used)("warningThreshold",o.osdSettings.nearfull_ratio)("errorThreshold",o.osdSettings.full_ratio)}}function tm(n,s){1&n&&(e.ynx(0,31),e.ynx(1,32),e.TgZ(2,"div",33),e.TgZ(3,"div",34),e._UZ(4,"input",35),e.TgZ(5,"label",36),e.SDv(6,37),e.qZA(),e.qZA(),e.qZA(),e.BQk(),e.BQk()),2&n&&e.Q6J("formGroup",s.form)}let hy=(()=>{class n extends Gl.o{constructor(t,o,c,g,C,D,P,j,W,re){super(),this.authStorageService=t,this.osdService=o,this.dimlessBinaryPipe=c,this.modalService=g,this.urlBuilder=C,this.router=D,this.taskWrapper=P,this.actionLabels=j,this.notificationService=W,this.orchService=re,this.icons=No.P,this.osdSettings=new Sv,this.selection=new hl.r,this.osds=[],this.disabledFlags=["sortbitwise","purged_snapdirs","recovery_deletes","pglog_hardlimit"],this.indivFlagNames=["noup","nodown","noin","noout"],this.actionOrchFeatures={create:[fu.OSD_CREATE],delete:[fu.OSD_DELETE]},this.permissions=this.authStorageService.getPermissions(),this.tableActions=[{name:this.actionLabels.CREATE,permission:"create",icon:No.P.add,click:()=>this.router.navigate([this.urlBuilder.getCreate()]),disable:ie=>this.getDisable("create",ie),canBePrimary:ie=>!ie.hasSelection},{name:this.actionLabels.EDIT,permission:"update",icon:No.P.edit,click:()=>this.editAction()},{name:this.actionLabels.FLAGS,permission:"update",icon:No.P.flag,click:()=>this.configureFlagsIndivAction(),disable:()=>!this.hasOsdSelected},{name:this.actionLabels.SCRUB,permission:"update",icon:No.P.analyse,click:()=>this.scrubAction(!1),disable:()=>!this.hasOsdSelected,canBePrimary:ie=>ie.hasSelection},{name:this.actionLabels.DEEP_SCRUB,permission:"update",icon:No.P.deepCheck,click:()=>this.scrubAction(!0),disable:()=>!this.hasOsdSelected},{name:this.actionLabels.REWEIGHT,permission:"update",click:()=>this.reweight(),disable:()=>!this.hasOsdSelected||!this.selection.hasSingleSelection,icon:No.P.reweight},{name:this.actionLabels.MARK_OUT,permission:"update",click:()=>this.showConfirmationModal("out",this.osdService.markOut),disable:()=>this.isNotSelectedOrInState("out"),icon:No.P.left},{name:this.actionLabels.MARK_IN,permission:"update",click:()=>this.showConfirmationModal("in",this.osdService.markIn),disable:()=>this.isNotSelectedOrInState("in"),icon:No.P.right},{name:this.actionLabels.MARK_DOWN,permission:"update",click:()=>this.showConfirmationModal("down",this.osdService.markDown),disable:()=>this.isNotSelectedOrInState("down"),icon:No.P.down},{name:this.actionLabels.MARK_LOST,permission:"delete",click:()=>this.showCriticalConfirmationModal("Mark","OSD lost","marked lost",ie=>this.osdService.safeToDestroy(JSON.stringify(ie)),"is_safe_to_destroy",this.osdService.markLost),disable:()=>this.isNotSelectedOrInState("up"),icon:No.P.flatten},{name:this.actionLabels.PURGE,permission:"delete",click:()=>this.showCriticalConfirmationModal("Purge","OSD","purged",ie=>this.osdService.safeToDestroy(JSON.stringify(ie)),"is_safe_to_destroy",ie=>(this.selection=new hl.r,this.osdService.purge(ie))),disable:()=>this.isNotSelectedOrInState("up"),icon:No.P.erase},{name:this.actionLabels.DESTROY,permission:"delete",click:()=>this.showCriticalConfirmationModal("destroy","OSD","destroyed",ie=>this.osdService.safeToDestroy(JSON.stringify(ie)),"is_safe_to_destroy",ie=>(this.selection=new hl.r,this.osdService.destroy(ie))),disable:()=>this.isNotSelectedOrInState("up"),icon:No.P.destroyCircle},{name:this.actionLabels.DELETE,permission:"delete",click:()=>this.delete(),disable:ie=>this.getDisable("delete",ie),icon:No.P.destroy}]}static collectStates(t){const o=[t.in?"in":"out"];return t.up?o.push("up"):t.state.includes("destroyed")?o.push("destroyed"):o.push("down"),o}ngOnInit(){this.clusterWideActions=[{name:"Flags",icon:No.P.flag,click:()=>this.configureFlagsAction(),permission:"read",visible:()=>this.permissions.osd.read},{name:"Recovery Priority",icon:No.P.deepCheck,click:()=>this.configureQosParamsAction(),permission:"read",visible:()=>this.permissions.configOpt.read},{name:"PG scrub",icon:No.P.analyse,click:()=>this.configurePgScrubAction(),permission:"read",visible:()=>this.permissions.configOpt.read}],this.columns=[{prop:"id",name:"ID",flexGrow:1,cellTransformation:Ja.e.executing,customTemplateConfig:{valueClass:"bold"}},{prop:"host.name",name:"Host"},{prop:"collectedStates",name:"Status",flexGrow:1,cellTransformation:Ja.e.badge,customTemplateConfig:{map:{in:{class:"badge-success"},up:{class:"badge-success"},down:{class:"badge-danger"},out:{class:"badge-danger"},destroyed:{class:"badge-danger"}}}},{prop:"tree.device_class",name:"Device class",flexGrow:1.2,cellTransformation:Ja.e.badge,customTemplateConfig:{map:{hdd:{class:"badge-hdd"},ssd:{class:"badge-ssd"}}}},{prop:"stats.numpg",name:"PGs",flexGrow:1},{prop:"stats.stat_bytes",name:"Size",flexGrow:1,pipe:this.dimlessBinaryPipe},{prop:"state",name:"Flags",cellTemplate:this.flagsTpl},{prop:"stats.usage",name:"Usage",cellTemplate:this.osdUsageTpl},{prop:"stats_history.out_bytes",name:"Read bytes",cellTransformation:Ja.e.sparkline},{prop:"stats_history.in_bytes",name:"Write bytes",cellTransformation:Ja.e.sparkline},{prop:"stats.op_r",name:"Read ops",cellTransformation:Ja.e.perSecond},{prop:"stats.op_w",name:"Write ops",cellTransformation:Ja.e.perSecond}],this.orchService.status().subscribe(t=>this.orchStatus=t),this.osdService.getOsdSettings().pipe((0,ye.q)(1)).subscribe(t=>{this.osdSettings=t})}getDisable(t,o){if("delete"===t){if(!o.hasSelection)return!0;if(Ar().some(this.getSelectedOsds(),g=>{const C=Ar().get(g,"operational_status");return"deleting"===C||"unmanaged"===C}))return!0}return this.orchService.getTableActionDisableDesc(this.orchStatus,this.actionOrchFeatures[t])}getSelectedOsdIds(){const t=this.osds.map(o=>o.id);return this.selection.selected.map(o=>o.id).filter(o=>t.includes(o)).sort()}getSelectedOsds(){return this.osds.filter(t=>!Ar().isUndefined(t)&&this.getSelectedOsdIds().includes(t.id))}get hasOsdSelected(){return this.getSelectedOsdIds().length>0}updateSelection(t){this.selection=t}isNotSelectedOrInState(t){const o=this.getSelectedOsds();if(0===o.length)return!0;switch(t){case"in":return o.some(c=>1===c.in);case"out":return o.some(c=>1!==c.in);case"down":return o.some(c=>1!==c.up);case"up":return o.some(c=>1===c.up)}}getOsdList(){const t=[this.osdService.getList(),this.osdService.getFlags()];(0,Oc.D)(t).subscribe(o=>{this.osds=o[0].map(c=>{c.collectedStates=n.collectStates(c),c.stats_history.out_bytes=c.stats_history.op_out_bytes.map(C=>C[1]),c.stats_history.in_bytes=c.stats_history.op_in_bytes.map(C=>C[1]),c.stats.usage=c.stats.stat_bytes_used/c.stats.stat_bytes,c.cdIsBinary=!0,c.cdIndivFlags=c.state.filter(C=>this.indivFlagNames.includes(C)),c.cdClusterFlags=o[1].filter(C=>!this.disabledFlags.includes(C));const g=Ar().get(c,"operational_status","unmanaged");return"unmanaged"!==g&&"working"!==g&&(c.cdExecuting=g),c})})}editAction(){const t=Ar().filter(this.osds,["id",this.selection.first().id]).pop();this.modalService.show(Vd.X,{titleText:"Edit OSD: " + t.id + "",fields:[{type:"text",name:"deviceClass",value:t.tree.device_class,label:"Device class",required:!0}],submitButtonText:"Edit OSD",onSubmit:o=>{this.osdService.update(t.id,o.deviceClass).subscribe(()=>{this.notificationService.show(_a.k.success,"Updated OSD '" + t.id + "'"),this.getOsdList()})}})}scrubAction(t){if(!this.hasOsdSelected)return;const o={selected:this.getSelectedOsdIds(),deep:t};this.bsModalRef=this.modalService.show(D1,o)}configureFlagsAction(){this.bsModalRef=this.modalService.show(A1)}configureFlagsIndivAction(){const t={selected:this.getSelectedOsds()};this.bsModalRef=this.modalService.show(kb,t)}showConfirmationModal(t,o){const c=this.getSelectedOsdIds();this.bsModalRef=this.modalService.show(nd.Y,{titleText:"Mark OSD " + t + "",buttonText:"Mark " + t + "",bodyTpl:this.markOsdConfirmationTpl,bodyContext:{markActionDescription:t,osdIds:c},onSubmit:()=>{(0,Oc.D)(this.getSelectedOsdIds().map(g=>o.call(this.osdService,g))).subscribe(()=>this.bsModalRef.close())}})}reweight(){const t=this.osds.filter(o=>o.id===this.selection.first().id).pop();this.bsModalRef=this.modalService.show(uy,{currentWeight:t.weight,osdId:t.id})}delete(){const t=new Us.d({preserve:new vn.NI(!1)});this.showCriticalConfirmationModal("delete","OSD","deleted",o=>this.osdService.safeToDelete(JSON.stringify(o)),"is_safe_to_delete",o=>(this.selection=new hl.r,this.taskWrapper.wrapTaskAroundCall({task:new cl.R("osd/"+ki.MQ.DELETE,{svc_id:o}),call:this.osdService.delete(o,t.value.preserve,!0)})),!0,t,this.deleteOsdExtraTpl)}showCriticalConfirmationModal(t,o,c,g,C,D,P=!1,j,W){g(this.getSelectedOsdIds()).subscribe(re=>{const ie=this.modalService.show(zl.M,{actionDescription:t,itemDescription:o,bodyTemplate:this.criticalConfirmationTpl,bodyContext:{safeToPerform:re[C],message:re.message,actionDescription:c,osdIds:this.getSelectedOsdIds()},childFormGroup:j,childFormGroupTemplate:W,submitAction:()=>{const ge=(0,Oc.D)(this.getSelectedOsdIds().map(_e=>D.call(this.osdService,_e)));P?ge.subscribe({error:()=>{this.getOsdList(),ie.close()},complete:()=>ie.close()}):ge.subscribe(()=>{this.getOsdList(),ie.close()},()=>ie.close())}})})}configureQosParamsAction(){this.bsModalRef=this.modalService.show(x1)}configurePgScrubAction(){this.bsModalRef=this.modalService.show(wS,void 0,{size:"lg"})}}return n.\u0275fac=function(t){return new(t||n)(e.Y36(_t.j),e.Y36(Ji),e.Y36(yn.$),e.Y36(Ul.Z),e.Y36(Sl.F),e.Y36(Yo.F0),e.Y36(Ll.P),e.Y36(ki.p4),e.Y36(ll.g),e.Y36(Cc))},n.\u0275cmp=e.Xpm({type:n,selectors:[["cd-osd-list"]],viewQuery:function(t,o){if(1&t&&(e.Gf(qb,7),e.Gf(fy,7),e.Gf(P1,7),e.Gf(zh,5),e.Gf(jm,5),e.Gf(rf,5),e.Gf(E_,7)),2&t){let c;e.iGM(c=e.CRH())&&(o.osdUsageTpl=c.first),e.iGM(c=e.CRH())&&(o.markOsdConfirmationTpl=c.first),e.iGM(c=e.CRH())&&(o.criticalConfirmationTpl=c.first),e.iGM(c=e.CRH())&&(o.reweightBodyTpl=c.first),e.iGM(c=e.CRH())&&(o.safeToDestroyBodyTpl=c.first),e.iGM(c=e.CRH())&&(o.deleteOsdExtraTpl=c.first),e.iGM(c=e.CRH())&&(o.flagsTpl=c.first)}},features:[e._Bn([{provide:Sl.F,useValue:new Sl.F("osd")}]),e.qOj],decls:18,vars:2,consts:function(){let s,t,o,c,g,C,D;return s="OSDs List",t="Overall Performance",o="" + "[\ufffd#2\ufffd|\ufffd#4\ufffd]" + "OSD(s) " + "\ufffd0\ufffd" + "" + "[\ufffd/#2\ufffd|\ufffd/#4\ufffd]" + " will be marked " + "[\ufffd#2\ufffd|\ufffd#4\ufffd]" + "" + "\ufffd1\ufffd" + "" + "[\ufffd/#2\ufffd|\ufffd/#4\ufffd]" + " if you proceed.",o=e.Zx4(o),c="" + "[\ufffd#3\ufffd|\ufffd#5\ufffd]" + "OSD " + "\ufffd0\ufffd" + "" + "[\ufffd/#3\ufffd|\ufffd/#5\ufffd]" + " will be " + "[\ufffd#3\ufffd|\ufffd#5\ufffd]" + "" + "\ufffd1\ufffd" + "" + "[\ufffd/#3\ufffd|\ufffd/#5\ufffd]" + " if you proceed.",c=e.Zx4(c),g="{VAR_SELECT, select, true {OSD is} other {OSDs are}}",g=e.Zx4(g,{VAR_SELECT:"\ufffd0\ufffd"}),C="The " + g + " not safe to be " + "\ufffd1\ufffd" + "! " + "\ufffd2\ufffd" + "",D="Preserve OSD ID(s) for replacement.",[["ngbNav","",1,"nav-tabs"],["nav","ngbNav"],["ngbNavItem",""],["ngbNavLink",""],s,["ngbNavContent",""],["ngbNavItem","",4,"ngIf"],[3,"ngbNavOutlet"],["markOsdConfirmationTpl",""],["criticalConfirmationTpl",""],["flagsTpl",""],["osdUsageTpl",""],["deleteOsdExtraTpl",""],["selectionType","multiClick",3,"data","columns","hasDetails","updateSelectionOnRefresh","fetchData","setExpandedRow","updateSelection"],[1,"table-actions","btn-toolbar"],["id","osd-actions",1,"btn-group",3,"permission","selection","tableActions"],["dropDownOnly","Cluster-wide configuration","btnColor","light","id","cluster-wide-actions",1,"btn-group",3,"permission","selection","tableActions"],["cdTableDetail","",3,"selection"],t,["uid","lo02I1Aiz","grafanaStyle","four",3,"grafanaPath","type"],o,["class","danger",4,"ngIf"],c,[1,"danger"],["type","warning"],C,["class","badge badge-hdd mr-1",4,"ngFor","ngForOf"],["class","badge badge-info mr-1",4,"ngFor","ngForOf"],[1,"badge","badge-hdd","mr-1"],[1,"badge","badge-info","mr-1"],[3,"total","used","warningThreshold","errorThreshold"],[3,"formGroup"],["formGroupName","child"],[1,"form-group"],[1,"custom-control","custom-checkbox"],["type","checkbox","name","preserve","id","preserve","formControlName","preserve",1,"custom-control-input"],["for","preserve",1,"custom-control-label"],D]},template:function(t,o){if(1&t&&(e.TgZ(0,"ul",0,1),e.TgZ(2,"li",2),e.TgZ(3,"a",3),e.SDv(4,4),e.qZA(),e.YNc(5,Vp,5,12,"ng-template",5),e.qZA(),e.YNc(6,zg,4,0,"li",6),e.qZA(),e._UZ(7,"div",7),e.YNc(8,Wg,5,4,"ng-template",null,8,e.W1O),e.YNc(10,Qg,6,5,"ng-template",null,9,e.W1O),e.YNc(12,qg,2,2,"ng-template",null,10,e.W1O),e.YNc(14,em,1,4,"ng-template",null,11,e.W1O),e.YNc(16,tm,7,1,"ng-template",null,12,e.W1O)),2&t){const c=e.MAs(1);e.xp6(6),e.Q6J("ngIf",o.permissions.grafana.read),e.xp6(1),e.Q6J("ngbNavOutlet",c)}},directives:[lt.Pz,lt.nv,lt.Vx,lt.uN,_.O5,lt.tO,Hs.a,Xs.K,Zm,it.F,Jt.G,_.sg,co.O,tl.V,vn.JL,vn.sg,vn.x0,$a.P,ca.o,vn.Wl,Ha.b,vn.JJ,vn.u],pipes:[Mv.A],styles:[""]}),n})();var L1=i(9837);let rg=(()=>{class n{constructor(t,o){this.http=t,this.settingsService=o,this.baseURL="api/prometheus",this.settingsKey={alertmanager:"api/settings/alertmanager-api-host",prometheus:"api/settings/prometheus-api-host"}}ifAlertmanagerConfigured(t,o){this.settingsService.ifSettingConfigured(this.settingsKey.alertmanager,t,o)}disableAlertmanagerConfig(){this.settingsService.disableSetting(this.settingsKey.alertmanager)}ifPrometheusConfigured(t,o){this.settingsService.ifSettingConfigured(this.settingsKey.prometheus,t,o)}disablePrometheusConfig(){this.settingsService.disableSetting(this.settingsKey.prometheus)}getAlerts(t={}){return this.http.get(this.baseURL,{params:t})}getSilences(t={}){return this.http.get(`${this.baseURL}/silences`,{params:t})}getRules(t="all"){return this.http.get(`${this.baseURL}/rules`).pipe((0,su.U)(o=>(["alerting","rewrites"].includes(t)&&o.groups.map(c=>{c.rules=c.rules.filter(g=>g.type===t)}),o)))}setSilence(t){return this.http.post(`${this.baseURL}/silence`,t,{observe:"response"})}expireSilence(t){return this.http.delete(`${this.baseURL}/silence/${t}`,{observe:"response"})}getNotifications(t){return this.http.get(`${this.baseURL}/notifications?from=${t&&t.id?t.id:"last"}`)}}return n.\u0275fac=function(t){return new(t||n)(e.LFG(y.eN),e.LFG(L1.g))},n.\u0275prov=e.Yz7({token:n,factory:n.\u0275fac,providedIn:"root"}),n})();var wv=i(61355);let F1=(()=>{class n{constructor(t){this.notificationService=t}sendNotifications(t){t.forEach(o=>this.notificationService.show(o))}convertToCustomAlerts(t){return Ar().uniqWith(t.map(o=>({status:Ar().isObject(o.status)?o.status.state:this.getPrometheusNotificationStatus(o),name:o.labels.alertname,url:o.generatorURL,description:o.annotations.description,fingerprint:Ar().isObject(o.status)&&o.fingerprint})),Ar().isEqual)}getPrometheusNotificationStatus(t){const o=t.status;return"firing"===o?"active":o}convertAlertToNotification(t){return new wv.T(this.formatType(t.status),`${t.name} (${t.status})`,this.appendSourceLink(t,t.description),void 0,"Prometheus")}formatType(t){return _a.k[Ar().findKey({error:["firing","active"],info:["suppressed","unprocessed"],success:["resolved"]},c=>c.includes(t))]}appendSourceLink(t,o){return`${o} <a href="${t.url}" target="_blank"><i class="${No.P.lineChart}"></i></a>`}}return n.\u0275fac=function(t){return new(t||n)(e.LFG(ll.g))},n.\u0275prov=e.Yz7({token:n,factory:n.\u0275fac,providedIn:"root"}),n})(),nm=(()=>{class n{constructor(t,o){this.alertFormatter=t,this.prometheusService=o,this.canAlertsBeNotified=!1,this.alerts=[],this.rules=[]}getAlerts(){this.prometheusService.ifAlertmanagerConfigured(()=>{this.prometheusService.getAlerts().subscribe(t=>this.handleAlerts(t),t=>{[404,504].includes(t.status)&&this.prometheusService.disableAlertmanagerConfig()})})}getRules(){this.prometheusService.ifPrometheusConfigured(()=>{this.prometheusService.getRules("alerting").subscribe(t=>{this.rules=t.groups.reduce((o,c)=>o.concat(c.rules.map(g=>(g.group=c.name,g))),[])})})}refresh(){this.getAlerts(),this.getRules()}handleAlerts(t){this.canAlertsBeNotified&&this.notifyOnAlertChanges(t,this.alerts),this.activeAlerts=Ar().reduce(this.alerts,(o,c)=>"active"===c.status.state?++o:o,0),this.activeCriticalAlerts=Ar().reduce(this.alerts,(o,c)=>"active"===c.status.state&&"critical"===c.labels.severity?++o:o,0),this.activeWarningAlerts=Ar().reduce(this.alerts,(o,c)=>"active"===c.status.state&&"warning"===c.labels.severity?++o:o,0),this.alerts=t,this.canAlertsBeNotified=!0}notifyOnAlertChanges(t,o){const c=this.getChangedAlerts(this.alertFormatter.convertToCustomAlerts(t),this.alertFormatter.convertToCustomAlerts(o)),C=Ar().filter(c,D=>"suppressed"!==D.status).map(D=>this.alertFormatter.convertAlertToNotification(D));this.alertFormatter.sendNotifications(C)}getChangedAlerts(t,o){return Ar().differenceWith(t,o,Ar().isEqual).concat(this.getVanishedAlerts(t,o))}getVanishedAlerts(t,o){return Ar().differenceWith(o,t,(c,g)=>c.fingerprint===g.fingerprint).map(c=>(c.status="resolved",c))}}return n.\u0275fac=function(t){return new(t||n)(e.LFG(F1),e.LFG(rg))},n.\u0275prov=e.Yz7({token:n,factory:n.\u0275fac,providedIn:"root"}),n})(),xv=(()=>{class n extends Gl.o{constructor(t){super(),this.prometheusService=t,this.isPrometheusConfigured=!1,this.isAlertmanagerConfigured=!1}ngOnInit(){this.prometheusService.ifAlertmanagerConfigured(()=>{this.isAlertmanagerConfigured=!0}),this.prometheusService.ifPrometheusConfigured(()=>{this.isPrometheusConfigured=!0})}}return n.\u0275fac=function(t){return new(t||n)(e.Y36(rg))},n.\u0275dir=e.lG2({type:n,features:[e.qOj]}),n})();function _y(n,s){if(1&n&&(e.tHW(0,4,1),e._UZ(1,"small",11),e.N_p()),2&n){const t=e.oxw();e.xp6(1),e.pQV(t.prometheusAlertService.activeCriticalAlerts),e.QtT(0)}}function O(n,s){if(1&n&&(e.tHW(0,4,2),e._UZ(1,"small",12),e.N_p()),2&n){const t=e.oxw();e.xp6(1),e.pQV(t.prometheusAlertService.activeWarningAlerts),e.QtT(0)}}let H=(()=>{class n{constructor(t,o){this.router=t,this.prometheusAlertService=o}}return n.\u0275fac=function(t){return new(t||n)(e.Y36(Yo.F0),e.Y36(nm))},n.\u0275cmp=e.Xpm({type:n,selectors:[["cd-prometheus-tabs"]],decls:13,vars:3,consts:function(){let s,t,o;return s="Alerts",t="Silences",o="Active Alerts " + "\ufffd*5:1\ufffd\ufffd#1:1\ufffd" + "" + "\ufffd0:1\ufffd" + "" + "[\ufffd/#1:1\ufffd\ufffd/*5:1\ufffd|\ufffd/#1:2\ufffd\ufffd/*6:2\ufffd]" + "" + "\ufffd*6:2\ufffd\ufffd#1:2\ufffd" + "" + "\ufffd0:2\ufffd" + "" + "[\ufffd/#1:1\ufffd\ufffd/*5:1\ufffd|\ufffd/#1:2\ufffd\ufffd/*6:2\ufffd]" + "",o=e.Zx4(o),[["ngbNav","",1,"nav-tabs",3,"activeId","navChange"],["nav","ngbNav"],["ngbNavItem","/monitoring/active-alerts"],["ngbNavLink",""],o,["class","badge badge-danger ml-1",4,"ngIf"],["class","badge badge-warning ml-1",4,"ngIf"],["ngbNavItem","/monitoring/alerts"],s,["ngbNavItem","/monitoring/silences"],t,[1,"badge","badge-danger","ml-1"],[1,"badge","badge-warning","ml-1"]]},template:function(t,o){1&t&&(e.TgZ(0,"ul",0,1),e.NdJ("navChange",function(g){return o.router.navigate([g.nextId])}),e.TgZ(2,"li",2),e.TgZ(3,"a",3),e.tHW(4,4),e.YNc(5,_y,2,1,"small",5),e.YNc(6,O,2,1,"small",6),e.N_p(),e.qZA(),e.qZA(),e.TgZ(7,"li",7),e.TgZ(8,"a",3),e.SDv(9,8),e.qZA(),e.qZA(),e.TgZ(10,"li",9),e.TgZ(11,"a",3),e.SDv(12,10),e.qZA(),e.qZA(),e.qZA()),2&t&&(e.Q6J("activeId",o.router.url),e.xp6(5),e.Q6J("ngIf",o.prometheusAlertService.activeCriticalAlerts>0),e.xp6(1),e.Q6J("ngIf",o.prometheusAlertService.activeWarningAlerts>0))},directives:[lt.Pz,lt.nv,lt.Vx,_.O5],styles:[""]}),n})();const pe=["externalLinkTpl"];function Ke(n,s){1&n&&(e.TgZ(0,"cd-alert-panel",3),e.tHW(1,4),e._UZ(2,"cd-doc",5),e.N_p(),e.qZA())}function kt(n,s){if(1&n&&e._UZ(0,"cd-table-key-value",9),2&n){const t=e.oxw(2);e.Q6J("renderObjects",!0)("hideEmpty",!0)("appendParentKey",!1)("data",t.expandedRow)("customCss",t.customCss)("autoReload",!1)}}function pn(n,s){if(1&n){const t=e.EpF();e.TgZ(0,"cd-table",6),e.NdJ("setExpandedRow",function(c){return e.CHM(t),e.oxw().setExpandedRow(c)})("updateSelection",function(c){return e.CHM(t),e.oxw().updateSelection(c)}),e._UZ(1,"cd-table-actions",7),e.YNc(2,kt,1,6,"cd-table-key-value",8),e.qZA()}if(2&n){const t=e.oxw();e.Q6J("data",t.prometheusAlertService.alerts)("columns",t.columns)("forceIdentifier",!0)("customCss",t.customCss)("hasDetails",!0),e.xp6(1),e.Q6J("permission",t.permission)("selection",t.selection)("tableActions",t.tableActions),e.xp6(1),e.Q6J("ngIf",t.expandedRow)}}const er=function(n){return[n]};function Cr(n,s){if(1&n&&(e.TgZ(0,"a",10),e._UZ(1,"i",11),e._uU(2," Source"),e.qZA()),2&n){const t=s.value,o=e.oxw();e.Q6J("href",t,e.LSH),e.xp6(1),e.Q6J("ngClass",e.VKq(2,er,o.icons.lineChart))}}let oo=(()=>{class n extends xv{constructor(t,o,c,g){super(g),this.authStorageService=t,this.prometheusAlertService=o,this.urlBuilder=c,this.selection=new hl.r,this.icons=No.P,this.permission=this.authStorageService.getPermissions().prometheus,this.tableActions=[{permission:"create",canBePrimary:C=>C.hasSingleSelection,disable:C=>!C.hasSingleSelection||C.first().cdExecuting,icon:No.P.add,routerLink:()=>"/monitoring"+this.urlBuilder.getCreateFrom(this.selection.first().fingerprint),name:"Create Silence"}]}ngOnInit(){super.ngOnInit(),this.columns=[{name:"Name",prop:"labels.alertname",cellClass:"font-weight-bold",flexGrow:2},{name:"Summary",prop:"annotations.summary",flexGrow:3},{name:"Severity",prop:"labels.severity",flexGrow:1,cellTransformation:Ja.e.badge,customTemplateConfig:{map:{critical:{class:"badge-danger"},warning:{class:"badge-warning"}}}},{name:"State",prop:"status.state",flexGrow:1,cellTransformation:Ja.e.badge,customTemplateConfig:{map:{active:{class:"badge-info"},unprocessed:{class:"badge-warning"},suppressed:{class:"badge-dark"}}}},{name:"Started",prop:"startsAt",cellTransformation:Ja.e.timeAgo,flexGrow:1},{name:"URL",prop:"generatorURL",flexGrow:1,sortable:!1,cellTemplate:this.externalLinkTpl}]}updateSelection(t){this.selection=t}}return n.\u0275fac=function(t){return new(t||n)(e.Y36(_t.j),e.Y36(nm),e.Y36(Sl.F),e.Y36(rg))},n.\u0275cmp=e.Xpm({type:n,selectors:[["cd-active-alert-list"]],viewQuery:function(t,o){if(1&t&&e.Gf(pe,7),2&t){let c;e.iGM(c=e.CRH())&&(o.externalLinkTpl=c.first)}},features:[e._Bn([{provide:Sl.F,useValue:new Sl.F("silences")}]),e.qOj],decls:5,vars:2,consts:function(){let s;return s="To see all active Prometheus alerts, please provide the URL to the API of Prometheus' Alertmanager as described in the " + "\ufffd#2\ufffd" + "" + "\ufffd/#2\ufffd" + ".",[["type","info",4,"ngIf"],["identifier","fingerprint","selectionType","single",3,"data","columns","forceIdentifier","customCss","hasDetails","setExpandedRow","updateSelection",4,"ngIf"],["externalLinkTpl",""],["type","info"],s,["section","prometheus"],["identifier","fingerprint","selectionType","single",3,"data","columns","forceIdentifier","customCss","hasDetails","setExpandedRow","updateSelection"],[1,"table-actions",3,"permission","selection","tableActions"],["cdTableDetail","",3,"renderObjects","hideEmpty","appendParentKey","data","customCss","autoReload",4,"ngIf"],["cdTableDetail","",3,"renderObjects","hideEmpty","appendParentKey","data","customCss","autoReload"],["target","_blank",3,"href"],[3,"ngClass"]]},template:function(t,o){1&t&&(e._UZ(0,"cd-prometheus-tabs"),e.YNc(1,Ke,3,0,"cd-alert-panel",0),e.YNc(2,pn,3,9,"cd-table",1),e.YNc(3,Cr,3,4,"ng-template",null,2,e.W1O)),2&t&&(e.xp6(1),e.Q6J("ngIf",!o.isAlertmanagerConfigured),e.xp6(1),e.Q6J("ngIf",o.isAlertmanagerConfigured))},directives:[H,_.O5,Jt.G,ol.K,Hs.a,Xs.K,Vr.b,_.mk],styles:[""]}),n})();var io=i(94088);function vo(n,s){1&n&&(e.TgZ(0,"cd-alert-panel",2),e.tHW(1,3),e._UZ(2,"cd-doc",4),e.N_p(),e.qZA())}function hs(n,s){if(1&n&&e._UZ(0,"cd-table-key-value",7),2&n){const t=e.oxw(2);e.Q6J("data",t.expandedRow)("renderObjects",!0)("hideKeys",t.hideKeys)}}function aa(n,s){if(1&n){const t=e.EpF();e.TgZ(0,"cd-table",5),e.NdJ("setExpandedRow",function(c){return e.CHM(t),e.oxw().setExpandedRow(c)})("updateSelection",function(c){return e.CHM(t),e.oxw().updateSelection(c)}),e.YNc(1,hs,1,3,"cd-table-key-value",6),e.qZA()}if(2&n){const t=e.oxw();e.Q6J("data",t.prometheusAlertService.rules)("columns",t.columns)("selectionType","single")("hasDetails",!0),e.xp6(1),e.Q6J("ngIf",t.expandedRow)}}let Ba=(()=>{class n extends xv{constructor(t,o){super(o),this.prometheusAlertService=t,this.selection=new hl.r,this.hideKeys=["alerts","type"]}ngOnInit(){super.ngOnInit(),this.columns=[{prop:"name",name:"Name",cellClass:"font-weight-bold",flexGrow:2},{prop:"labels.severity",name:"Severity",flexGrow:1,cellTransformation:Ja.e.badge,customTemplateConfig:{map:{critical:{class:"badge-danger"},warning:{class:"badge-warning"}}}},{prop:"group",name:"Group",flexGrow:1,cellTransformation:Ja.e.badge},{prop:"duration",name:"Duration",pipe:new io.u,flexGrow:1},{prop:"query",name:"Query",isHidden:!0,flexGrow:1},{prop:"annotations.summary",name:"Summary",flexGrow:3}]}updateSelection(t){this.selection=t}}return n.\u0275fac=function(t){return new(t||n)(e.Y36(nm),e.Y36(rg))},n.\u0275cmp=e.Xpm({type:n,selectors:[["cd-rules-list"]],features:[e.qOj],decls:3,vars:2,consts:function(){let s;return s="To see all configured Prometheus alerts, please provide the URL to the API of Prometheus as described in the " + "\ufffd#2\ufffd" + "" + "\ufffd/#2\ufffd" + ".",[["type","info",4,"ngIf"],[3,"data","columns","selectionType","hasDetails","setExpandedRow","updateSelection",4,"ngIf"],["type","info"],s,["section","prometheus"],[3,"data","columns","selectionType","hasDetails","setExpandedRow","updateSelection"],["cdTableDetail","",3,"data","renderObjects","hideKeys",4,"ngIf"],["cdTableDetail","",3,"data","renderObjects","hideKeys"]]},template:function(t,o){1&t&&(e._UZ(0,"cd-prometheus-tabs"),e.YNc(1,vo,3,0,"cd-alert-panel",0),e.YNc(2,aa,2,5,"cd-table",1)),2&t&&(e.xp6(1),e.Q6J("ngIf",!o.isPrometheusConfigured),e.xp6(1),e.Q6J("ngIf",o.isPrometheusConfigured))},directives:[H,_.O5,Jt.G,ol.K,Hs.a,Vr.b],styles:[""]}),n})();var Nl=i(26504);let Ya=(()=>{class n{constructor(){this.valueAttributePath={alertname:"name",instance:"alerts.0.labels.instance",job:"alerts.0.labels.job",severity:"labels.severity"}}singleMatch(t,o){return this.multiMatch([t],o)}multiMatch(t,o){if(!t.some(c=>c.isRegex))return t.forEach(c=>{o=this.getMatchedRules(c,o)}),this.describeMatch(o)}getMatchedRules(t,o){const c=this.getAttributePath(t.name);return o.filter(g=>Ar().get(g,c)===t.value)}describeMatch(t){let o=0;return t.forEach(c=>o+=c.alerts.length),{status:this.getMatchText(t.length,o),cssClass:o?"has-success":"has-warning"}}getAttributePath(t){return this.valueAttributePath[t]}getMatchText(t,o){const c={noRule:"Your matcher seems to match no currently defined rule or active alert.",noAlerts:"no active alerts",alert:"1 active alert",alerts:"" + o + " active alerts",rule:"Matches 1 rule",rules:"Matches " + t + " rules"};return t?"" + (t > 1 ? c.rules : c.rule) + " with " + (o ? o > 1 ? c.alerts : c.alert : c.noAlerts) + ".":c.noRule}}return n.\u0275fac=function(t){return new(t||n)},n.\u0275prov=e.Yz7({token:n,factory:n.\u0275fac,providedIn:"root"}),n})(),lu=(()=>{class n{calculateDuration(t,o){const c=+t,g=+o,C=this.getDuration(Math.abs(c-g));return c>g?"-"+C:C}getDuration(t){const o=new Date(t),c=o.getUTCHours(),g=o.getUTCMinutes(),D=(P,j)=>P&&P+j;return[D(Math.floor(t/864e5),"d"),D(c,"h"),D(g,"m")].filter(P=>P).join(" ")}calculateDate(t,o,c){const g=+t;if(Ar().isNaN(g))return;const C=this.getDurationMs(o)*(c?-1:1);return new Date(g+C)}getDurationMs(t){return 6e4*(60*(24*this.getNumbersFromString(t,"d")+this.getNumbersFromString(t,"h"))+this.getNumbersFromString(t,"m"))}getNumbersFromString(t,o){const c=t.match(new RegExp(`[0-9 ]+${o}`,"i"));return c?parseInt(c[0],10):0}}return n.\u0275fac=function(t){return new(t||n)},n.\u0275prov=e.Yz7({token:n,factory:n.\u0275fac,providedIn:"root"}),n})();function yu(n,s){if(1&n&&(e.TgZ(0,"option",27),e._uU(1),e.qZA()),2&n){const t=s.$implicit;e.Q6J("value",t),e.xp6(1),e.hij(" ",t," ")}}function wp(n,s){1&n&&(e.TgZ(0,"span",28),e.SDv(1,29),e.qZA())}function ip(n,s){1&n&&(e.TgZ(0,"span",28),e.SDv(1,30),e.qZA())}function xp(n,s){if(1&n&&(e.TgZ(0,"div",31),e.TgZ(1,"span"),e._uU(2),e.qZA(),e.qZA()),2&n){const t=e.oxw();e.Gre("cd-col-form-offset ",t.matcherMatch.cssClass,""),e.xp6(1),e.Gre("text-muted ",t.matcherMatch.cssClass,""),e.xp6(1),e.hij(" ",t.matcherMatch.status," ")}}let pd=(()=>{class n{constructor(t,o,c,g){this.formBuilder=t,this.silenceMatcher=o,this.activeModal=c,this.actionLabels=g,this.submitAction=new e.vpe,this.editMode=!1,this.nameAttributes=["alertname","instance","job","severity"],this.possibleValues=[],this.matcherMatch=void 0,this.valueClick=new yp.xQ,this.valueFocus=new yp.xQ,this.search=C=>(0,Bd.T)(C.pipe(Gf(200),(0,Df.x)()),this.valueFocus,this.valueClick.pipe((0,tp.h)(()=>!this.typeahead.isPopupOpen()))).pipe((0,su.U)(D=>(""===D?this.possibleValues:this.possibleValues.filter(P=>P.toLowerCase().indexOf(D.toLowerCase())>-1)).slice(0,10))),this.createForm(),this.subscribeToChanges()}createForm(){this.form=this.formBuilder.group({name:[null,[vn.kI.required]],value:[{value:"",disabled:!0},[vn.kI.required]],isRegex:new vn.NI(!1)})}subscribeToChanges(){this.form.get("name").valueChanges.subscribe(t=>{null!==t?(this.setPossibleValues(t),this.form.get("value").enable()):this.form.get("value").disable()}),this.form.get("value").valueChanges.subscribe(t=>{const o=this.form.value;o.value=t,this.matcherMatch=this.silenceMatcher.singleMatch(o,this.rules)})}setPossibleValues(t){this.possibleValues=Ar().sortedUniq(this.rules.map(o=>Ar().get(o,this.silenceMatcher.getAttributePath(t))).filter(o=>o))}getMode(){return this.editMode?this.actionLabels.EDIT:this.actionLabels.ADD}preFillControls(t){this.form.setValue(t)}onSubmit(){this.submitAction.emit(this.form.value),this.activeModal.close()}}return n.\u0275fac=function(t){return new(t||n)(e.Y36(id.O),e.Y36(Ya),e.Y36(lt.Kz),e.Y36(ki.p4))},n.\u0275cmp=e.Xpm({type:n,selectors:[["cd-silence-matcher-modal"]],viewQuery:function(t,o){if(1&t&&e.Gf(lt.dR,7),2&t){let c;e.iGM(c=e.CRH())&&(o.typeahead=c.first)}},outputs:{submitAction:"submitAction"},decls:31,vars:11,consts:function(){let s,t,o,c,g,C,D,P;return s="{VAR_SELECT, select, true {Edit} other {Add}}",s=e.Zx4(s,{VAR_SELECT:"\ufffd0\ufffd"}),t="" + s + " Matcher",o="Name",c="-- Select an attribute to match against --",g="Value",C="Use regular expression",D="This field is required!",P="This field is required!",[[3,"modalRef"],[1,"modal-title"],t,[1,"modal-content"],["novalidate","",1,"form",3,"formGroup"],["formDir","ngForm"],[1,"modal-body"],[1,"form-group","row"],["for","name",1,"cd-col-form-label","required"],o,[1,"cd-col-form-input"],["id","name","formControlName","name","name","name",1,"form-control"],[3,"ngValue"],c,[3,"value",4,"ngFor","ngForOf"],["class","help-block",4,"ngIf"],["for","value",1,"cd-col-form-label","required"],g,["id","value","container","body","type","text","formControlName","value",1,"form-control",3,"ngbTypeahead","focus","click"],["id","match-state",3,"class",4,"ngIf"],[1,"cd-col-form-offset"],[1,"custom-control","custom-checkbox"],["type","checkbox","formControlName","isRegex","name","is-regex","id","is-regex",1,"custom-control-input"],["for","is-regex",1,"custom-control-label"],C,[1,"modal-footer"],[3,"form","submitText","submitActionEvent"],[3,"value"],[1,"help-block"],D,P,["id","match-state"]]},template:function(t,o){if(1&t&&(e.TgZ(0,"cd-modal",0),e.TgZ(1,"span",1),e.SDv(2,2),e.qZA(),e.ynx(3,3),e.TgZ(4,"form",4,5),e.TgZ(6,"div",6),e.TgZ(7,"div",7),e.TgZ(8,"label",8),e.SDv(9,9),e.qZA(),e.TgZ(10,"div",10),e.TgZ(11,"select",11),e.TgZ(12,"option",12),e.SDv(13,13),e.qZA(),e.YNc(14,yu,2,2,"option",14),e.qZA(),e.YNc(15,wp,2,0,"span",15),e.qZA(),e.qZA(),e.TgZ(16,"div",7),e.TgZ(17,"label",16),e.SDv(18,17),e.qZA(),e.TgZ(19,"div",10),e.TgZ(20,"input",18),e.NdJ("focus",function(g){return o.valueFocus.next(g.target.value)})("click",function(g){return o.valueClick.next(g.target.value)}),e.qZA(),e.YNc(21,ip,2,0,"span",15),e.qZA(),e.YNc(22,xp,3,7,"div",19),e.qZA(),e.TgZ(23,"div",7),e.TgZ(24,"div",20),e.TgZ(25,"div",21),e._UZ(26,"input",22),e.TgZ(27,"label",23),e.SDv(28,24),e.qZA(),e.qZA(),e.qZA(),e.qZA(),e.qZA(),e.TgZ(29,"div",25),e.TgZ(30,"cd-form-button-panel",26),e.NdJ("submitActionEvent",function(){return o.onSubmit()}),e.qZA(),e.qZA(),e.qZA(),e.BQk(),e.qZA()),2&t){const c=e.MAs(5);e.Q6J("modalRef",o.activeModal),e.xp6(2),e.pQV(o.editMode),e.QtT(2),e.xp6(2),e.Q6J("formGroup",o.form),e.xp6(8),e.Q6J("ngValue",null),e.xp6(2),e.Q6J("ngForOf",o.nameAttributes),e.xp6(1),e.Q6J("ngIf",o.form.showError("name",c,"required")),e.xp6(5),e.Q6J("ngbTypeahead",o.search),e.xp6(1),e.Q6J("ngIf",o.form.showError("value",c,"required")),e.xp6(1),e.Q6J("ngIf",o.form.getValue("value")&&!o.form.getValue("isRegex")&&o.matcherMatch),e.xp6(8),e.Q6J("form",o.form)("submitText",o.getMode())}},directives:[h.z,vn._Y,vn.JL,tl.V,vn.sg,$a.P,ca.o,vn.EJ,Ha.b,vn.JJ,vn.u,vn.YN,vn.Kr,_.sg,_.O5,vn.Fj,lt.dR,vn.Wl,nl.p],styles:[""]}),n})();var Dp=i(52266);function gh(n,s){if(1&n&&(e.ynx(0),e._UZ(1,"input",53),e.BQk()),2&n){const t=e.oxw().$implicit,o=e.oxw(),c=o.index,g=o.matcher;e.xp6(1),e.hYB("id","matcher-",t.attribute,"-",c,""),e.Q6J("value",g[t.attribute])}}function gy(n,s){if(1&n&&(e.ynx(0),e.TgZ(1,"div",47),e.TgZ(2,"div",54),e._UZ(3,"input",55),e.qZA(),e.qZA(),e.BQk()),2&n){const t=e.oxw().$implicit,o=e.oxw(),c=o.index,g=o.matcher;e.xp6(3),e.hYB("id","matcher-",t.attribute,"-",c,""),e.Q6J("checked",g[t.attribute])}}const eE=function(n){return[n]};function fR(n,s){if(1&n&&(e.ynx(0),e.TgZ(1,"div",51),e.TgZ(2,"span",52),e._UZ(3,"i",38),e.qZA(),e.qZA(),e.YNc(4,gh,2,3,"ng-container",7),e.YNc(5,gy,4,3,"ng-container",7),e.BQk()),2&n){const t=s.$implicit;e.xp6(2),e.Q6J("ngbTooltip",t.tooltip),e.xp6(1),e.Q6J("ngClass",e.VKq(4,eE,t.icon)),e.xp6(1),e.Q6J("ngIf","isRegex"!==t.attribute),e.xp6(1),e.Q6J("ngIf","isRegex"===t.attribute)}}function pR(n,s){if(1&n){const t=e.EpF();e.TgZ(0,"div",46),e.YNc(1,fR,6,6,"ng-container",34),e.TgZ(2,"span",47),e.TgZ(3,"button",48),e.NdJ("click",function(){const g=e.CHM(t).index;return e.oxw().showMatcherModal(g)}),e._UZ(4,"i",38),e.qZA(),e.TgZ(5,"button",49),e.NdJ("click",function(){const g=e.CHM(t).index;return e.oxw().deleteMatcher(g)}),e._UZ(6,"i",38),e.qZA(),e.qZA(),e.qZA(),e._UZ(7,"span",50)}if(2&n){const t=s.index,o=e.oxw();e.xp6(1),e.Q6J("ngForOf",o.matcherConfig),e.xp6(2),e.MGl("id","matcher-edit-",t,""),e.xp6(1),e.Q6J("ngClass",e.VKq(5,eE,o.icons.edit)),e.xp6(1),e.MGl("id","matcher-delete-",t,""),e.xp6(1),e.Q6J("ngClass",e.VKq(7,eE,o.icons.trash))}}function BA(n,s){1&n&&(e.TgZ(0,"cd-helper"),e.SDv(1,56),e.qZA())}function RS(n,s){1&n&&(e.TgZ(0,"span",57),e.SDv(1,58),e.qZA())}function hR(n,s){1&n&&(e.TgZ(0,"span",57),e.SDv(1,59),e.qZA())}function YA(n,s){1&n&&(e.TgZ(0,"span",57),e.SDv(1,60),e.qZA())}function Dv(n,s){1&n&&(e.TgZ(0,"span",57),e.SDv(1,61),e.qZA())}function ZA(n,s){1&n&&(e.TgZ(0,"span",57),e.SDv(1,62),e.qZA())}const NS=function(n,s){return{"text-warning":n,"text-danger":s}};function jA(n,s){if(1&n&&(e.TgZ(0,"h5",38),e.TgZ(1,"strong"),e.SDv(2,63),e.qZA(),e.qZA()),2&n){e.oxw();const t=e.MAs(4);e.Q6J("ngClass",e.WLB(1,NS,!t.submitted,t.submitted))}}function PS(n,s){1&n&&e.GkF(0)}const my=function(n,s){return{index:n,matcher:s}};function GA(n,s){if(1&n&&(e.TgZ(0,"span"),e.YNc(1,PS,1,0,"ng-container",64),e.qZA()),2&n){const t=s.$implicit,o=s.index;e.oxw();const c=e.MAs(1);e.xp6(1),e.Q6J("ngTemplateOutlet",c)("ngTemplateOutletContext",e.WLB(2,my,o,t))}}function IS(n,s){if(1&n&&(e.TgZ(0,"div",65),e.TgZ(1,"span"),e._uU(2),e.qZA(),e.qZA()),2&n){const t=e.oxw();e.Gre("cd-col-form-offset ",t.matcherMatch.cssClass,""),e.xp6(1),e.Gre("text-muted ",t.matcherMatch.cssClass,""),e.xp6(1),e.hij(" ",t.matcherMatch.status," ")}}function VA(n,s){if(1&n&&e._UZ(0,"cd-date-time-picker",66),2&n){const t=e.oxw();e.Q6J("control",t.form.get("startsAt"))("hasSeconds",!1)}}function zA(n,s){if(1&n&&e._UZ(0,"cd-date-time-picker",66),2&n){const t=e.oxw();e.Q6J("control",t.form.get("endsAt"))("hasSeconds",!1)}}const WA=function(n){return{"btn-warning":n}};let vy=(()=>{class n{constructor(t,o,c,g,C,D,P,j,W,re,ie){this.router=t,this.authStorageService=o,this.formBuilder=c,this.prometheusService=g,this.notificationService=C,this.route=D,this.timeDiff=P,this.modalService=j,this.silenceMatcher=W,this.actionLabels=re,this.succeededLabels=ie,this.icons=No.P,this.recreate=!1,this.edit=!1,this.resource="silence",this.matchers=[],this.matcherMatch=void 0,this.matcherConfig=[{tooltip:"Attribute name",icon:this.icons.paragraph,attribute:"name"},{tooltip:"Value",icon:this.icons.terminal,attribute:"value"},{tooltip:"Regular expression",icon:this.icons.magic,attribute:"isRegex"}],this.datetimeFormat="YYYY-MM-DD HH:mm",this.init()}init(){this.chooseMode(),this.authenticate(),this.createForm(),this.setupDates(),this.getData()}chooseMode(){this.edit=this.router.url.startsWith("/monitoring/silences/edit"),this.recreate=this.router.url.startsWith("/monitoring/silences/recreate"),this.action=this.edit?this.actionLabels.EDIT:this.recreate?this.actionLabels.RECREATE:this.actionLabels.CREATE}authenticate(){if(this.permission=this.authStorageService.getPermissions().prometheus,!this.permission.read||!(this.edit?this.permission.update:this.permission.create))throw new Nl._2}createForm(){const t=ds.h.custom("format",o=>!(""===o||oi()(o,this.datetimeFormat).isValid()));this.form=this.formBuilder.group({startsAt:["",[vn.kI.required,t]],duration:["2h",[vn.kI.min(1)]],endsAt:["",[vn.kI.required,t]],createdBy:[this.authStorageService.getUsername(),[vn.kI.required]],comment:[null,[vn.kI.required]]},{validators:ds.h.custom("matcherRequired",()=>0===this.matchers.length)})}setupDates(){const t=oi()().format(this.datetimeFormat);this.form.silentSet("startsAt",t),this.updateDate(),this.subscribeDateChanges()}updateDate(t){const o=oi()(this.form.getValue(t?"endsAt":"startsAt"),this.datetimeFormat).toDate(),c=this.timeDiff.calculateDate(o,this.form.getValue("duration"),t);if(c){const g=oi()(c).format(this.datetimeFormat);this.form.silentSet(t?"startsAt":"endsAt",g)}}subscribeDateChanges(){this.form.get("startsAt").valueChanges.subscribe(()=>{this.onDateChange()}),this.form.get("duration").valueChanges.subscribe(()=>{this.updateDate()}),this.form.get("endsAt").valueChanges.subscribe(()=>{this.onDateChange(!0)})}onDateChange(t){const o=oi()(this.form.getValue("startsAt"),this.datetimeFormat),c=oi()(this.form.getValue("endsAt"),this.datetimeFormat);o.isBefore(c)?this.updateDuration():this.updateDate(t)}updateDuration(){const t=oi()(this.form.getValue("startsAt"),this.datetimeFormat).toDate(),o=oi()(this.form.getValue("endsAt"),this.datetimeFormat).toDate();this.form.silentSet("duration",this.timeDiff.calculateDuration(t,o))}getData(){this.getRules(),this.getModeSpecificData()}getRules(){this.prometheusService.ifPrometheusConfigured(()=>this.prometheusService.getRules().subscribe(t=>{this.rules=t.groups.reduce((o,c)=>Ar().concat(o,c.rules),[])},()=>{this.prometheusService.disablePrometheusConfig(),this.rules=[]}),()=>{this.rules=[],this.notificationService.show(_a.k.info,"Please add your Prometheus host to the dashboard configuration and refresh the page",void 0,void 0,"Prometheus")})}getModeSpecificData(){this.route.params.subscribe(t=>{!t.id||(this.edit||this.recreate?this.prometheusService.getSilences().subscribe(o=>{const c=Ar().find(o,["id",t.id]);Ar().isUndefined(c)||this.fillFormWithSilence(c)}):this.prometheusService.getAlerts().subscribe(o=>{const c=Ar().find(o,["fingerprint",t.id]);Ar().isUndefined(c)||this.fillFormByAlert(c)}))})}fillFormWithSilence(t){this.id=t.id,this.edit&&(["startsAt","endsAt"].forEach(o=>this.form.silentSet(o,oi()(t[o]).format(this.datetimeFormat))),this.updateDuration()),["createdBy","comment"].forEach(o=>this.form.silentSet(o,t[o])),this.matchers=t.matchers,this.validateMatchers()}validateMatchers(){this.rules?(this.matcherMatch=this.silenceMatcher.multiMatch(this.matchers,this.rules),this.form.markAsDirty(),this.form.updateValueAndValidity()):window.setTimeout(()=>this.validateMatchers(),100)}fillFormByAlert(t){const o=t.labels;Object.keys(o).forEach(c=>this.setMatcher({name:c,value:o[c],isRegex:!1}))}setMatcher(t,o){Ar().isNumber(o)?this.matchers[o]=t:this.matchers.push(t),this.validateMatchers()}showMatcherModal(t){const c=this.modalService.show(pd).componentInstance;c.rules=this.rules,Ar().isNumber(t)&&(c.editMode=!0,c.preFillControls(this.matchers[t])),c.submitAction.subscribe(g=>{this.setMatcher(g,t)})}deleteMatcher(t){this.matchers.splice(t,1),this.validateMatchers()}submit(){this.form.invalid||this.prometheusService.setSilence(this.getSubmitData()).subscribe(t=>{this.router.navigate(["/monitoring/silences"]),this.notificationService.show(_a.k.success,this.getNotificationTile(t.body.silenceId),void 0,void 0,"Prometheus")},()=>this.form.setErrors({cdSubmitButton:!0}))}getSubmitData(){const t=this.form.value;return delete t.duration,t.startsAt=oi()(t.startsAt,this.datetimeFormat).toISOString(),t.endsAt=oi()(t.endsAt,this.datetimeFormat).toISOString(),t.matchers=this.matchers,this.edit&&(t.id=this.id),t}getNotificationTile(t){let o;return o=this.edit?this.succeededLabels.EDITED:this.recreate?this.succeededLabels.RECREATED:this.succeededLabels.CREATED,`${o} ${this.resource} ${t}`}}return n.\u0275fac=function(t){return new(t||n)(e.Y36(Yo.F0),e.Y36(_t.j),e.Y36(id.O),e.Y36(rg),e.Y36(ll.g),e.Y36(Yo.gz),e.Y36(lu),e.Y36(Ul.Z),e.Y36(Ya),e.Y36(ki.p4),e.Y36(ki.aX))},n.\u0275cmp=e.Xpm({type:n,selectors:[["cd-prometheus-form"]],decls:71,vars:30,consts:function(){let s,t,o,c,g,C,D,P,j,W,re,ie,ge,_e,Le,Re,ke,xe;return s="" + "\ufffd0\ufffd" + " " + "\ufffd1\ufffd" + "",t="Creator",o="Comment",c="Start time",g="If the start time lies in the past the creation time will be used",C="Duration",D="End time",P="Matchers",j="Add matcher",W="Edit",re="Delete",ie="Editing a silence will expire the old silence and recreate it as a new silence",ge="This field is required!",_e="This field is required!",Le="This field is required!",Re="This field is required!",ke="This field is required!",xe="A silence requires at least one matcher",[["matcherTpl",""],[1,"cd-col-form"],["name","form","novalidate","",1,"form",3,"formGroup"],["formDir","ngForm"],[1,"card"],[1,"card-header"],s,[4,"ngIf"],[1,"card-body"],[1,"form-group","row"],["for","created-by",1,"cd-col-form-label","required"],t,[1,"cd-col-form-input"],["formControlName","createdBy","id","created-by","name","created-by","type","text",1,"form-control"],["class","invalid-feedback",4,"ngIf"],["for","comment",1,"cd-col-form-label","required"],o,["formControlName","comment","id","comment","name","comment","type","text",1,"form-control"],["for","starts-at",1,"cd-col-form-label"],[1,"required"],c,g,["formControlName","startsAt","triggers","manual",1,"form-control",3,"ngbPopover","click","keypress"],["ps","ngbPopover"],["for","duration",1,"cd-col-form-label","required"],C,["formControlName","duration","id","duration","name","duration","type","text",1,"form-control"],["for","ends-at",1,"cd-col-form-label","required"],D,["formControlName","endsAt","triggers","manual",1,"form-control",3,"ngbPopover","click","keypress"],["pe","ngbPopover"],P,[1,"cd-col-form-offset"],[3,"ngClass",4,"ngIf"],[4,"ngFor","ngForOf"],[1,"row"],[1,"col-12"],["type","button","id","add-matcher",1,"btn","btn-light","float-right","my-3",3,"ngClass","click"],[3,"ngClass"],j,["id","match-state",3,"class",4,"ngIf"],[1,"card-footer"],[1,"text-right"],[3,"form","submitText","submitActionEvent"],["popStart",""],["popEnd",""],[1,"input-group","my-2"],[1,"input-group-append"],["type","button","ngbTooltip",W,1,"btn","btn-light",3,"id","click"],["type","button","ngbTooltip",re,1,"btn","btn-light",3,"id","click"],[1,"help-block"],[1,"input-group-prepend"],[1,"input-group-text",3,"ngbTooltip"],["type","text","disabled","","readonly","",1,"form-control",3,"id","value"],[1,"input-group-text"],["type","checkbox","disabled","","readonly","",3,"id","checked"],ie,[1,"invalid-feedback"],ge,_e,Le,Re,ke,xe,[4,"ngTemplateOutlet","ngTemplateOutletContext"],["id","match-state"],[3,"control","hasSeconds"]]},template:function(t,o){if(1&t){const c=e.EpF();e.YNc(0,pR,8,9,"ng-template",null,0,e.W1O),e.TgZ(2,"div",1),e.TgZ(3,"form",2,3),e.TgZ(5,"div",4),e.TgZ(6,"div",5),e.TgZ(7,"span"),e.SDv(8,6),e.ALo(9,"titlecase"),e.ALo(10,"upperFirst"),e.qZA(),e.YNc(11,BA,2,0,"cd-helper",7),e.qZA(),e.TgZ(12,"div",8),e.TgZ(13,"div",9),e.TgZ(14,"label",10),e.SDv(15,11),e.qZA(),e.TgZ(16,"div",12),e._UZ(17,"input",13),e.YNc(18,RS,2,0,"span",14),e.qZA(),e.qZA(),e.TgZ(19,"div",9),e.TgZ(20,"label",15),e.SDv(21,16),e.qZA(),e.TgZ(22,"div",12),e.TgZ(23,"textarea",17),e._uU(24,"            "),e.qZA(),e.YNc(25,hR,2,0,"span",14),e.qZA(),e.qZA(),e.TgZ(26,"div",9),e.TgZ(27,"label",18),e.TgZ(28,"span",19),e.SDv(29,20),e.qZA(),e.TgZ(30,"cd-helper"),e.SDv(31,21),e.qZA(),e.qZA(),e.TgZ(32,"div",12),e.TgZ(33,"input",22,23),e.NdJ("click",function(){return e.CHM(c),e.MAs(34).open()})("keypress",function(){return e.CHM(c),e.MAs(34).close()}),e.qZA(),e.YNc(35,YA,2,0,"span",14),e.qZA(),e.qZA(),e.TgZ(36,"div",9),e.TgZ(37,"label",24),e.SDv(38,25),e.qZA(),e.TgZ(39,"div",12),e._UZ(40,"input",26),e.YNc(41,Dv,2,0,"span",14),e.qZA(),e.qZA(),e.TgZ(42,"div",9),e.TgZ(43,"label",27),e.SDv(44,28),e.qZA(),e.TgZ(45,"div",12),e.TgZ(46,"input",29,30),e.NdJ("click",function(){return e.CHM(c),e.MAs(47).open()})("keypress",function(){return e.CHM(c),e.MAs(47).close()}),e.qZA(),e.YNc(48,ZA,2,0,"span",14),e.qZA(),e.qZA(),e.TgZ(49,"fieldset"),e.TgZ(50,"legend",19),e.SDv(51,31),e.qZA(),e.TgZ(52,"div",32),e.YNc(53,jA,3,4,"h5",33),e.YNc(54,GA,2,5,"span",34),e.TgZ(55,"div",35),e.TgZ(56,"div",36),e.TgZ(57,"button",37),e.NdJ("click",function(){return o.showMatcherModal()}),e._UZ(58,"i",38),e.ynx(59),e.SDv(60,39),e.BQk(),e.qZA(),e.qZA(),e.qZA(),e.qZA(),e.YNc(61,IS,3,7,"div",40),e.qZA(),e.qZA(),e.TgZ(62,"div",41),e.TgZ(63,"div",42),e.TgZ(64,"cd-form-button-panel",43),e.NdJ("submitActionEvent",function(){return o.submit()}),e.ALo(65,"titlecase"),e.ALo(66,"upperFirst"),e.qZA(),e.qZA(),e.qZA(),e.qZA(),e.qZA(),e.qZA(),e.YNc(67,VA,1,2,"ng-template",null,44,e.W1O),e.YNc(69,zA,1,2,"ng-template",null,45,e.W1O)}if(2&t){const c=e.MAs(4),g=e.MAs(68),C=e.MAs(70);e.xp6(3),e.Q6J("formGroup",o.form),e.xp6(7),e.pQV(e.lcZ(9,18,o.action))(e.lcZ(10,20,o.resource)),e.QtT(8),e.xp6(1),e.Q6J("ngIf",o.edit),e.xp6(7),e.Q6J("ngIf",o.form.showError("createdBy",c,"required")),e.xp6(7),e.Q6J("ngIf",o.form.showError("comment",c,"required")),e.xp6(8),e.Q6J("ngbPopover",g),e.xp6(2),e.Q6J("ngIf",o.form.showError("startsAt",c,"required")),e.xp6(6),e.Q6J("ngIf",o.form.showError("duration",c,"required")),e.xp6(5),e.Q6J("ngbPopover",C),e.xp6(2),e.Q6J("ngIf",o.form.showError("endsAt",c,"required")),e.xp6(5),e.Q6J("ngIf",0===o.matchers.length),e.xp6(1),e.Q6J("ngForOf",o.matchers),e.xp6(3),e.Q6J("ngClass",e.VKq(26,WA,c.submitted&&0===o.matchers.length)),e.xp6(1),e.Q6J("ngClass",e.VKq(28,eE,o.icons.add)),e.xp6(3),e.Q6J("ngIf",o.matchers.length&&o.matcherMatch),e.xp6(3),e.Q6J("form",o.form)("submitText",e.lcZ(65,22,o.action)+" "+e.lcZ(66,24,o.resource))}},directives:[vn._Y,vn.JL,tl.V,vn.sg,_.O5,$a.P,ca.o,vn.Fj,Ha.b,vn.JJ,vn.u,E.S,lt.o8,_.sg,_.mk,nl.p,lt._L,_.tP,Dp.J],pipes:[_.rS,K.m],styles:["textarea[_ngcontent-%COMP%]{resize:vertical}"]}),n})();var JA=i(84051),yy=i(18891);function QA(n,s){1&n&&(e.TgZ(0,"cd-alert-panel",2),e.tHW(1,3),e._UZ(2,"cd-doc",4),e.N_p(),e.qZA())}function LS(n,s){if(1&n&&e._UZ(0,"cd-table-key-value",8),2&n){const t=e.oxw(2);e.Q6J("renderObjects",!0)("hideEmpty",!0)("appendParentKey",!1)("data",t.expandedRow)("customCss",t.customCss)("autoReload",!1)}}function FS(n,s){if(1&n){const t=e.EpF();e.TgZ(0,"cd-table",5),e.NdJ("setExpandedRow",function(c){return e.CHM(t),e.oxw().setExpandedRow(c)})("fetchData",function(){return e.CHM(t),e.oxw().refresh()})("updateSelection",function(c){return e.CHM(t),e.oxw().updateSelection(c)}),e._UZ(1,"cd-table-actions",6),e.YNc(2,LS,1,6,"cd-table-key-value",7),e.qZA()}if(2&n){const t=e.oxw();e.Q6J("data",t.silences)("columns",t.columns)("forceIdentifier",!0)("customCss",t.customCss)("sorts",t.sorts)("hasDetails",!0),e.xp6(1),e.Q6J("permission",t.permission)("selection",t.selection)("tableActions",t.tableActions),e.xp6(1),e.Q6J("ngIf",t.expandedRow)}}let _R=(()=>{class n extends xv{constructor(t,o,c,g,C,D,P,j){super(j),this.authStorageService=t,this.cdDatePipe=o,this.modalService=c,this.notificationService=g,this.urlBuilder=C,this.actionLabels=D,this.succeededLabels=P,this.silences=[],this.selection=new hl.r,this.customCss={"badge badge-danger":"active","badge badge-warning":"pending","badge badge-default":"expired"},this.sorts=[{prop:"endsAt",dir:JA.Sr.desc}],this.permission=this.authStorageService.getPermissions().prometheus;const W=re=>re.first()&&re.first().status&&"expired"===re.first().status.state;this.tableActions=[{permission:"create",icon:No.P.add,routerLink:()=>this.urlBuilder.getCreate(),canBePrimary:re=>!re.hasSingleSelection,name:this.actionLabels.CREATE},{permission:"create",canBePrimary:re=>re.hasSingleSelection&&W(re),disable:re=>!re.hasSingleSelection||re.first().cdExecuting||re.first().cdExecuting&&W(re)||!W(re),icon:No.P.copy,routerLink:()=>this.urlBuilder.getRecreate(this.selection.first().id),name:this.actionLabels.RECREATE},{permission:"update",icon:No.P.edit,canBePrimary:re=>re.hasSingleSelection&&!W(re),disable:re=>!re.hasSingleSelection||re.first().cdExecuting||re.first().cdExecuting&&!W(re)||W(re),routerLink:()=>this.urlBuilder.getEdit(this.selection.first().id),name:this.actionLabels.EDIT},{permission:"delete",icon:No.P.trash,canBePrimary:re=>re.hasSingleSelection&&!W(re),disable:re=>!re.hasSingleSelection||re.first().cdExecuting||W(re),click:()=>this.expireSilence(),name:this.actionLabels.EXPIRE}],this.columns=[{name:"ID",prop:"id",flexGrow:3},{name:"Created by",prop:"createdBy",flexGrow:2},{name:"Started",prop:"startsAt",pipe:this.cdDatePipe},{name:"Updated",prop:"updatedAt",pipe:this.cdDatePipe},{name:"Ends",prop:"endsAt",pipe:this.cdDatePipe},{name:"Status",prop:"status.state",cellTransformation:Ja.e.classAdding}]}refresh(){this.prometheusService.ifAlertmanagerConfigured(()=>{this.prometheusService.getSilences().subscribe(t=>{this.silences=t},()=>{this.prometheusService.disableAlertmanagerConfig()})})}updateSelection(t){this.selection=t}expireSilence(){const t=this.selection.first().id,o="Silence",c="Prometheus";this.modalRef=this.modalService.show(zl.M,{itemDescription:o,itemNames:[t],actionDescription:this.actionLabels.EXPIRE,submitActionObservable:()=>new yy.y(g=>{this.prometheusService.expireSilence(t).subscribe(()=>{this.notificationService.show(_a.k.success,`${this.succeededLabels.EXPIRED} ${o} ${t}`,void 0,void 0,c)},C=>{C.application=c,g.error(C)},()=>{g.complete(),this.refresh()})})})}}return n.\u0275fac=function(t){return new(t||n)(e.Y36(_t.j),e.Y36(Vl.N),e.Y36(Ul.Z),e.Y36(ll.g),e.Y36(Sl.F),e.Y36(ki.p4),e.Y36(ki.aX),e.Y36(rg))},n.\u0275cmp=e.Xpm({type:n,selectors:[["cd-silences-list"]],features:[e._Bn([{provide:Sl.F,useValue:new Sl.F("monitoring/silences")}]),e.qOj],decls:3,vars:2,consts:function(){let s;return s="To enable Silences, please provide the URL to the API of the Prometheus' Alertmanager as described in the " + "\ufffd#2\ufffd" + "" + "\ufffd/#2\ufffd" + ".",[["type","info",4,"ngIf"],["selectionType","single",3,"data","columns","forceIdentifier","customCss","sorts","hasDetails","setExpandedRow","fetchData","updateSelection",4,"ngIf"],["type","info"],s,["section","prometheus"],["selectionType","single",3,"data","columns","forceIdentifier","customCss","sorts","hasDetails","setExpandedRow","fetchData","updateSelection"],[1,"table-actions",3,"permission","selection","tableActions"],["cdTableDetail","",3,"renderObjects","hideEmpty","appendParentKey","data","customCss","autoReload",4,"ngIf"],["cdTableDetail","",3,"renderObjects","hideEmpty","appendParentKey","data","customCss","autoReload"]]},template:function(t,o){1&t&&(e._UZ(0,"cd-prometheus-tabs"),e.YNc(1,QA,3,0,"cd-alert-panel",0),e.YNc(2,FS,3,10,"cd-table",1)),2&t&&(e.xp6(1),e.Q6J("ngIf",!o.isAlertmanagerConfigured),e.xp6(1),e.Q6J("ngIf",o.isAlertmanagerConfigured))},directives:[H,_.O5,Jt.G,ol.K,Hs.a,Xs.K,Vr.b],styles:[""]}),n})(),nE=(()=>{class n{constructor(t){this.http=t,this.url="api/telemetry"}getReport(){return this.http.get(`${this.url}/report`)}enable(t=!0){const o={enable:t};return t&&(o.license_name="sharing-1-0"),this.http.put(`${this.url}`,o)}}return n.\u0275fac=function(t){return new(t||n)(e.LFG(y.eN))},n.\u0275prov=e.Yz7({token:n,factory:n.\u0275fac,providedIn:"root"}),n})(),rE=(()=>{class n{constructor(){this.visible=!1,this.update=new e.vpe}setVisibility(t){this.visible=t,this.update.emit(t)}}return n.\u0275fac=function(t){return new(t||n)},n.\u0275prov=e.Yz7({token:n,factory:n.\u0275fac,providedIn:"root"}),n})();function gR(n,s){if(1&n){const t=e.EpF();e.TgZ(0,"div"),e._uU(1," The plugin is already "),e.TgZ(2,"b"),e._uU(3,"enabled"),e.qZA(),e._uU(4,". Click "),e.TgZ(5,"b"),e._uU(6,"Deactivate"),e.qZA(),e._uU(7," to disable it.\xa0 "),e.TgZ(8,"button",66),e.NdJ("click",function(){return e.CHM(t),e.oxw(3).disableModule("The Telemetry module has been disabled successfully.")}),e.SDv(9,67),e.qZA(),e.qZA()}}function k1(n,s){1&n&&(e.ynx(0),e.TgZ(1,"legend"),e.ynx(2),e.SDv(3,68),e.BQk(),e.TgZ(4,"cd-helper"),e.SDv(5,69),e.qZA(),e.qZA(),e.TgZ(6,"div",15),e.TgZ(7,"label",70),e.SDv(8,71),e.qZA(),e.TgZ(9,"div",24),e._UZ(10,"input",72),e.qZA(),e.qZA(),e.TgZ(11,"div",15),e.TgZ(12,"label",73),e.SDv(13,74),e.qZA(),e.TgZ(14,"div",24),e._UZ(15,"input",75),e.qZA(),e.qZA(),e.TgZ(16,"div",15),e.TgZ(17,"label",76),e.SDv(18,77),e.qZA(),e.TgZ(19,"div",24),e._UZ(20,"input",78),e.qZA(),e.qZA(),e.BQk())}function XA(n,s){1&n&&(e.TgZ(0,"span",79),e.SDv(1,80),e.qZA())}function iE(n,s){if(1&n){const t=e.EpF();e.TgZ(0,"div"),e.TgZ(1,"form",4,5),e.TgZ(3,"div",6),e.TgZ(4,"div",7),e.SDv(5,8),e.qZA(),e.TgZ(6,"div",9),e.TgZ(7,"p"),e.tHW(8,10),e._UZ(9,"br"),e._UZ(10,"a",11),e._UZ(11,"br"),e._UZ(12,"br"),e._UZ(13,"b"),e.N_p(),e.qZA(),e.YNc(14,gR,10,0,"div",12),e.TgZ(15,"legend"),e.SDv(16,13),e.qZA(),e.TgZ(17,"p"),e.SDv(18,14),e.qZA(),e.TgZ(19,"div",15),e.TgZ(20,"label",16),e.ynx(21),e.SDv(22,17),e.BQk(),e.TgZ(23,"cd-helper"),e.ynx(24),e.SDv(25,18),e.BQk(),e.TgZ(26,"ul"),e.TgZ(27,"li"),e.SDv(28,19),e.qZA(),e.TgZ(29,"li"),e.SDv(30,20),e.qZA(),e.TgZ(31,"li"),e.SDv(32,21),e.qZA(),e.TgZ(33,"li"),e.SDv(34,22),e.qZA(),e.TgZ(35,"li"),e.SDv(36,23),e.qZA(),e.qZA(),e.qZA(),e.qZA(),e.TgZ(37,"div",24),e.TgZ(38,"div",25),e._UZ(39,"input",26),e._UZ(40,"label",27),e.qZA(),e.qZA(),e.qZA(),e.TgZ(41,"div",15),e.TgZ(42,"label",28),e.ynx(43),e.SDv(44,29),e.BQk(),e.TgZ(45,"cd-helper"),e.ynx(46),e.SDv(47,30),e.BQk(),e.TgZ(48,"ul"),e.TgZ(49,"li"),e.SDv(50,31),e.qZA(),e.TgZ(51,"li"),e.SDv(52,32),e.qZA(),e.TgZ(53,"li"),e.SDv(54,33),e.qZA(),e.TgZ(55,"li"),e.SDv(56,34),e.qZA(),e.qZA(),e.qZA(),e.qZA(),e.TgZ(57,"div",24),e.TgZ(58,"div",25),e._UZ(59,"input",35),e._UZ(60,"label",36),e.qZA(),e.qZA(),e.qZA(),e.TgZ(61,"div",15),e.TgZ(62,"label",37),e.ynx(63),e.SDv(64,38),e.BQk(),e._UZ(65,"cd-helper",39),e.qZA(),e.TgZ(66,"div",24),e.TgZ(67,"div",25),e._UZ(68,"input",40),e._UZ(69,"label",41),e.qZA(),e.qZA(),e.qZA(),e.TgZ(70,"div",15),e.TgZ(71,"label",42),e.ynx(72),e.SDv(73,43),e.BQk(),e.TgZ(74,"cd-helper"),e.ynx(75),e.SDv(76,44),e.BQk(),e.TgZ(77,"ul"),e.TgZ(78,"li"),e._uU(79,"Cluster description"),e.qZA(),e.TgZ(80,"li"),e._uU(81,"Contact email address"),e.qZA(),e.qZA(),e.qZA(),e.qZA(),e.TgZ(82,"div",24),e.TgZ(83,"div",25),e.TgZ(84,"input",45),e.NdJ("click",function(){return e.CHM(t),e.oxw(2).toggleIdent()}),e.qZA(),e._UZ(85,"label",46),e.qZA(),e.qZA(),e.qZA(),e.TgZ(86,"div",15),e.TgZ(87,"label",47),e.ynx(88),e.SDv(89,48),e.BQk(),e.TgZ(90,"cd-helper"),e.ynx(91),e.SDv(92,49),e.BQk(),e.qZA(),e.qZA(),e.TgZ(93,"div",24),e.TgZ(94,"div",25),e._UZ(95,"input",50),e._UZ(96,"label",51),e.qZA(),e.qZA(),e.qZA(),e.YNc(97,k1,21,0,"ng-container",12),e.TgZ(98,"legend"),e.SDv(99,52),e.qZA(),e.TgZ(100,"div",15),e.TgZ(101,"label",53),e.ynx(102),e.SDv(103,54),e.BQk(),e.TgZ(104,"cd-helper"),e.SDv(105,55),e.qZA(),e.qZA(),e.TgZ(106,"div",24),e._UZ(107,"input",56),e.YNc(108,XA,2,0,"span",57),e.qZA(),e.qZA(),e.TgZ(109,"div",15),e.TgZ(110,"label",58),e.ynx(111),e.SDv(112,59),e.BQk(),e.TgZ(113,"cd-helper"),e.TgZ(114,"p"),e.SDv(115,60),e.qZA(),e.TgZ(116,"p"),e.SDv(117,61),e.qZA(),e.qZA(),e.qZA(),e.TgZ(118,"div",24),e._UZ(119,"input",62),e.qZA(),e.qZA(),e._UZ(120,"br"),e.TgZ(121,"p"),e.tHW(122,63),e._UZ(123,"b"),e.N_p(),e.qZA(),e.qZA(),e.TgZ(124,"div",64),e.TgZ(125,"div",65),e.TgZ(126,"button",66),e.NdJ("click",function(){return e.CHM(t),e.oxw(2).next()}),e.ynx(127),e._uU(128),e.BQk(),e.qZA(),e.qZA(),e.qZA(),e.qZA(),e.qZA(),e.qZA()}if(2&n){const t=e.MAs(2),o=e.oxw(2);e.xp6(1),e.Q6J("formGroup",o.configForm),e.xp6(4),e.pQV(o.step),e.QtT(5),e.xp6(8),e.pQV(o.sendToUrl)(o.sendToDeviceUrl),e.QtT(8),e.xp6(1),e.Q6J("ngIf",o.moduleEnabled),e.xp6(83),e.Q6J("ngIf",o.showContactInfo),e.xp6(11),e.Q6J("ngIf",o.configForm.showError("interval",t,"min")),e.xp6(20),e.Oqu(o.actionLabels.NEXT)}}function oE(n,s){if(1&n){const t=e.EpF();e.TgZ(0,"div"),e.TgZ(1,"form",81,82),e.TgZ(3,"div",6),e.TgZ(4,"div",7),e.SDv(5,83),e.qZA(),e.TgZ(6,"div",9),e.TgZ(7,"div",15),e.TgZ(8,"label",84),e.tHW(9,85),e._UZ(10,"cd-helper",86),e.N_p(),e.qZA(),e.TgZ(11,"div",24),e._UZ(12,"input",87),e.qZA(),e.qZA(),e.TgZ(13,"div",15),e.TgZ(14,"label",88),e.tHW(15,89),e.TgZ(16,"cd-helper",90),e._UZ(17,"em"),e.qZA(),e.N_p(),e.qZA(),e.TgZ(18,"div",24),e._UZ(19,"textarea",91),e.qZA(),e.qZA(),e.TgZ(20,"div",15),e.TgZ(21,"div",92),e.TgZ(22,"div",93),e._UZ(23,"cd-download-button",94),e._UZ(24,"cd-copy-2-clipboard-button",95),e.qZA(),e.qZA(),e.qZA(),e.TgZ(25,"div",15),e.TgZ(26,"div",92),e.TgZ(27,"div",25),e._UZ(28,"input",96),e.TgZ(29,"label",97),e.tHW(30,98),e._UZ(31,"a",99),e.N_p(),e.qZA(),e.qZA(),e.qZA(),e.qZA(),e.qZA(),e.TgZ(32,"div",64),e.TgZ(33,"div",65),e.TgZ(34,"cd-form-button-panel",100),e.NdJ("submitActionEvent",function(){return e.CHM(t),e.oxw(2).onSubmit()})("backActionEvent",function(){return e.CHM(t),e.oxw(2).back()}),e.qZA(),e.qZA(),e.qZA(),e.qZA(),e.qZA(),e.qZA()}if(2&n){const t=e.oxw(2);e.xp6(1),e.Q6J("formGroup",t.previewForm),e.xp6(4),e.pQV(t.step),e.QtT(5),e.xp6(18),e.Q6J("objectItem",t.report),e.xp6(11),e.Q6J("form",t.previewForm)("submitText",t.actionLabels.UPDATE)("cancelText",t.actionLabels.BACK)}}function KA(n,s){if(1&n&&(e.TgZ(0,"div",1),e.ynx(1,2),e.YNc(2,iE,129,8,"div",3),e.YNc(3,oE,35,6,"div",3),e.BQk(),e.qZA()),2&n){const t=e.oxw();e.xp6(1),e.Q6J("ngSwitch",t.step),e.xp6(1),e.Q6J("ngSwitchCase",1),e.xp6(1),e.Q6J("ngSwitchCase",2)}}let sE=(()=>{class n extends Oa.E{constructor(t,o,c,g,C,D,P){super(),this.actionLabels=t,this.formBuilder=o,this.mgrModuleService=c,this.notificationService=g,this.router=C,this.telemetryService=D,this.telemetryNotificationService=P,this.licenseAgrmt=!1,this.options={},this.newConfig={},this.configResp={},this.requiredFields=["channel_basic","channel_crash","channel_device","channel_ident","channel_perf","interval","proxy","contact","description","organization"],this.contactInfofields=["contact","description","organization"],this.report=void 0,this.reportId=void 0,this.sendToUrl="",this.sendToDeviceUrl="",this.step=1}ngOnInit(){const t=[this.mgrModuleService.getOptions("telemetry"),this.mgrModuleService.getConfig("telemetry")];(0,Oc.D)(t).subscribe(o=>{const c=o[1];this.moduleEnabled=c.enabled,this.sendToUrl=c.url,this.sendToDeviceUrl=c.device_url,this.showContactInfo=c.channel_ident,this.options=Ar().pick(o[0],this.requiredFields),this.configResp=Ar().pick(c,this.requiredFields),this.createConfigForm(),this.configForm.setValue(this.configResp),this.loadingReady()},o=>{this.loadingError()})}createConfigForm(){const t={};Ar().forEach(Object.values(this.options),o=>{t[o.name]=[o.default_value,this.getValidators(o)]}),this.configForm=this.formBuilder.group(t)}replacer(t,o){if(("ranges"===t||"values"===t)&&Array.isArray(o)){const c=[];for(let g=0;g<o.length;g++)c.push(JSON.stringify(o[g]));return c}return o}replacerTest(t){return JSON.stringify(t,this.replacer,2)}formatReport(){let t={};t=JSON.parse(JSON.stringify(this.report));const o=["perf_counters","stats_per_pool","stats_per_pg","io_rate","osd_perf_histograms","mempool","heap_stats","rocksdb_stats"];for(let c=0;c<o.length;c++){const g=o[c];g in t.report&&delete t.report[g]}return JSON.stringify(t,null,2)}formatReportTest(t){let o={};o=JSON.parse(JSON.stringify(t));const c=["perf_counters","stats_per_pool","stats_per_pg","io_rate","osd_perf_histograms","mempool","heap_stats","rocksdb_stats"];for(let g=0;g<c.length;g++){const C=c[g];C in o&&delete o[C]}return JSON.stringify(o,null,2)}createPreviewForm(){const t={report:this.formatReport(),reportId:this.reportId,licenseAgrmt:[this.licenseAgrmt,vn.kI.requiredTrue]};this.previewForm=this.formBuilder.group(t)}getValidators(t){const o=[];switch(t.type){case"int":o.push(vn.kI.required);break;case"str":Ar().isNumber(t.min)&&o.push(vn.kI.minLength(t.min)),Ar().isNumber(t.max)&&o.push(vn.kI.maxLength(t.max))}return o}updateReportFromConfig(t={}){const o=this.report.report.channels_available,c=[];for(const g of o)t[`channel_${g}`]&&c.push(g);this.report.report.channels=c;for(const g of this.contactInfofields)this.report.report[g]=t[g]}getReport(){this.loadingStart(),this.telemetryService.getReport().subscribe(t=>{this.report=t,this.reportId=t.report.report_id,this.updateReportFromConfig(this.newConfig),this.createPreviewForm(),this.loadingReady(),this.step++},t=>{this.loadingError()})}toggleIdent(){this.showContactInfo=!this.showContactInfo}buildReport(){this.newConfig={};for(const t of Object.values(this.options)){const o=this.configForm.get(t.name);if(!o.valid)return void this.configForm.setErrors({cdSubmitButton:!0});this.newConfig[t.name]=o.value}if(!this.newConfig.channel_ident)for(const t of this.contactInfofields)this.newConfig[t]="";this.getReport()}disableModule(t=null,o=null){this.telemetryService.enable(!1).subscribe(()=>{this.telemetryNotificationService.setVisibility(!0),t&&this.notificationService.show(_a.k.success,t),o?o():this.router.navigate([""])})}next(){this.buildReport()}back(){this.step--}getChangedConfig(){const t={};return Ar().forEach(this.requiredFields,o=>{Ar().isEqual(this.configResp[o],this.newConfig[o])||(t[o]=this.newConfig[o])}),t}onSubmit(){const t=this.getChangedConfig(),o=[this.telemetryService.enable(),this.mgrModuleService.updateConfig("telemetry",t)];(0,Oc.D)(o).subscribe(()=>{this.telemetryNotificationService.setVisibility(!1),this.notificationService.show(_a.k.success,"The Telemetry module has been configured and activated successfully.")},()=>{this.telemetryNotificationService.setVisibility(!1),this.notificationService.show(_a.k.error,"An Error occurred while updating the Telemetry module configuration.             Please Try again"),this.previewForm.setErrors({cdSubmitButton:!0})},()=>{this.newConfig={},this.router.navigate([""])})}}return n.\u0275fac=function(t){return new(t||n)(e.Y36(ki.p4),e.Y36(id.O),e.Y36(Bc.N),e.Y36(ll.g),e.Y36(Yo.F0),e.Y36(nE),e.Y36(rE))},n.\u0275cmp=e.Xpm({type:n,selectors:[["cd-telemetry"]],features:[e.qOj],decls:1,vars:1,consts:function(){let s,t,o,c,g,C,D,P,j,W,re,ie,ge,_e,Le,Re,ke,xe,U,pt,ht,wt,It,dn,Lt,Dn,Mn,$r,ur,Pr,xr,fn,Nn,$n,Qn,Tn,Yr,ji,ii,Ui,Jr,An,hn,qr,Ri;return s="Step " + "\ufffd0\ufffd" + " of 2: Telemetry report configuration",t="The telemetry module sends anonymous data about this Ceph cluster back to the Ceph developers to help understand how Ceph is used and what problems users may be experiencing." + "[\ufffd#9\ufffd\ufffd/#9\ufffd|\ufffd#11\ufffd\ufffd/#11\ufffd|\ufffd#12\ufffd\ufffd/#12\ufffd]" + " This data is visualized on " + "\ufffd#10\ufffd" + "public dashboards" + "\ufffd/#10\ufffd" + " that allow the community to quickly see summary statistics on how many clusters are reporting, their total capacity and OSD count, and version distribution trends." + "[\ufffd#9\ufffd\ufffd/#9\ufffd|\ufffd#11\ufffd\ufffd/#11\ufffd|\ufffd#12\ufffd\ufffd/#12\ufffd]" + "" + "[\ufffd#9\ufffd\ufffd/#9\ufffd|\ufffd#11\ufffd\ufffd/#11\ufffd|\ufffd#12\ufffd\ufffd/#12\ufffd]" + " The data being reported does " + "\ufffd#13\ufffd" + "not" + "\ufffd/#13\ufffd" + " contain any sensitive data like pool names, object names, object contents, hostnames, or device serial numbers. It contains counters and statistics on how the cluster has been deployed, the version of Ceph, the distribution of the hosts and other parameters which help the project to gain a better understanding of the way Ceph is used. The data is sent secured to " + "\ufffd0\ufffd" + " and " + "\ufffd1\ufffd" + " (device report).",t=e.Zx4(t),o="Channels",c="The telemetry report is broken down into several \"channels\", each with a different type of information that can be configured below.",g="Basic",C="Includes basic information about the cluster:",D="Capacity of the cluster",P="Number of monitors, managers, OSDs, MDSs, object gateways, or other daemons",j="Software version currently being used",W="Number and types of RADOS pools and CephFS file systems",re="Names of configuration options that have been changed from their default (but not their values)",ie="Crash",ge="Includes information about daemon crashes:",_e="Type of daemon",Le="Version of the daemon",Re="Operating system (OS distribution, kernel version)",ke="Stack trace identifying where in the Ceph code the crash occurred",xe="Device",U="Includes information about device metrics like anonymized SMART metrics.",pt="Ident",ht="Includes user-provided identifying information about the cluster:",wt="Perf",It="Includes various performance metrics of a cluster.",dn="Advanced Settings",Lt="Interval",Dn="The module compiles and sends a new report every 24 hours by default. You can adjust this interval by setting a different number of hours.",Mn="Proxy",$r="If the cluster cannot directly connect to the configured telemetry endpoint (default telemetry.ceph.com), you can configure a HTTP/HTTPS proxy server by e.g. adding https://10.0.0.1:8080",ur="You can also include a user:pass if needed e.g. https://ceph:telemetry@10.0.0.1:8080",Pr="" + "\ufffd#123\ufffd" + "Note:" + "\ufffd/#123\ufffd" + " By clicking 'Next' you will first see a preview of the report content before you can activate the automatic submission of your data.",xr="Deactivate",fn="Contact Information",Nn="Submitting any contact information is completely optional and disabled by default.",$n="Contact",Qn="Description",Tn="My first Ceph cluster",Yr="Organization",ji="Organization name",ii="The entered value is too low! It must be greater or equal to 8.",Ui="Step " + "\ufffd0\ufffd" + " of 2: Telemetry report preview",Jr="A randomized UUID to identify a particular cluster over the course of several telemetry reports.",An="Report ID " + "\ufffd#10\ufffd" + "" + "\ufffd/#10\ufffd" + "",hn="The actual telemetry data that will be submitted.",qr="Report preview " + "\ufffd#16\ufffd" + "" + "\ufffd#17\ufffd" + "Note: Please select 'Download' to view the full report, including metrics from the perf channel." + "\ufffd/#17\ufffd" + "" + "\ufffd/#16\ufffd" + "",Ri="I agree to my telemetry data being submitted under the " + "\ufffd#31\ufffd" + "Community Data License Agreement - Sharing - Version 1.0" + "\ufffd/#31\ufffd" + "",[["class","cd-col-form",4,"cdFormLoading"],[1,"cd-col-form"],[3,"ngSwitch"],[4,"ngSwitchCase"],["name","form","novalidate","",3,"formGroup"],["formDir","ngForm"],[1,"card"],[1,"card-header"],s,[1,"card-body"],t,["href","https://telemetry-public.ceph.com/"],[4,"ngIf"],o,c,[1,"form-group","row"],["for","channel_basic",1,"cd-col-form-label"],g,C,D,P,j,W,re,[1,"cd-col-form-input"],[1,"custom-control","custom-checkbox"],["type","checkbox","id","channel_basic","formControlName","channel_basic",1,"custom-control-input"],["for","channel_basic",1,"custom-control-label"],["for","channel_crash",1,"cd-col-form-label"],ie,ge,_e,Le,Re,ke,["type","checkbox","id","channel_crash","formControlName","channel_crash",1,"custom-control-input"],["for","channel_crash",1,"custom-control-label"],["for","channel_device",1,"cd-col-form-label"],xe,["html",U],["type","checkbox","id","channel_device","formControlName","channel_device",1,"custom-control-input"],["for","channel_device",1,"custom-control-label"],["for","channel_ident",1,"cd-col-form-label"],pt,ht,["type","checkbox","id","channel_ident","formControlName","channel_ident",1,"custom-control-input",3,"click"],["for","channel_ident",1,"custom-control-label"],["for","channel_perf",1,"cd-col-form-label"],wt,It,["type","checkbox","id","channel_perf","formControlName","channel_perf",1,"custom-control-input"],["for","channel_perf",1,"custom-control-label"],dn,["for","interval",1,"cd-col-form-label"],Lt,Dn,["id","interval","type","number","formControlName","interval","min","8",1,"form-control"],["class","invalid-feedback",4,"ngIf"],["for","proxy",1,"cd-col-form-label"],Mn,$r,ur,["id","proxy","type","text","formControlName","proxy","placeholder","https://10.0.0.1:8080",1,"form-control"],Pr,[1,"card-footer"],[1,"button-group","text-right"],["type","button",1,"btn","btn-light",3,"click"],xr,fn,Nn,["for","contact",1,"cd-col-form-label"],$n,["id","contact","type","text","formControlName","contact","placeholder","Example User <user@example.com>",1,"form-control"],["for","description",1,"cd-col-form-label"],Qn,["id","description","type","text","formControlName","description","placeholder",Tn,1,"form-control"],["for","organization",1,"cd-col-form-label"],Yr,["id","organization","type","text","formControlName","organization","placeholder",ji,1,"form-control"],[1,"invalid-feedback"],ii,["name","previewForm","novalidate","",3,"formGroup"],["frm","ngForm"],Ui,["for","reportId",1,"cd-col-form-label"],An,["html",Jr],["type","text","id","reportId","formControlName","reportId","readonly","",1,"form-control"],["for","report",1,"cd-col-form-label"],qr,["html",hn],["id","report","formControlName","report","rows","15","readonly","",1,"form-control"],[1,"cd-col-form-offset"],["role","group",1,"btn-group"],["fileName","telemetry_report",3,"objectItem"],["source","report"],["type","checkbox","id","licenseAgrmt","name","licenseAgrmt","formControlName","licenseAgrmt",1,"custom-control-input"],["for","licenseAgrmt",1,"custom-control-label"],Ri,["href","https://cdla.io/sharing-1-0/"],[3,"form","submitText","cancelText","submitActionEvent","backActionEvent"]]},template:function(t,o){1&t&&e.YNc(0,KA,4,3,"div",0),2&t&&e.Q6J("cdFormLoading",o.loading)},directives:[wl.y,_.RF,_.n9,vn._Y,vn.JL,tl.V,vn.sg,_.O5,$a.P,E.S,ca.o,vn.Wl,Ha.b,vn.JJ,vn.u,vn.wV,vn.qQ,vn.Fj,Im,Uc.s,nl.p],styles:[""]}),n})();var aE=i(26561);function mR(n){const{subscriber:s,counter:t,period:o}=n;s.next(t),this.schedule({subscriber:s,counter:t+1,period:o},o)}let $S=(()=>{class n{constructor(t){this.ngZone=t,this.intervalDataSource=new Nd.X(null),this.intervalData$=this.intervalDataSource.asObservable();const o=parseInt(sessionStorage.getItem("dashboard_interval"),10)||5e3;this.setRefreshInterval(o)}setRefreshInterval(t){this.intervalTime=t,sessionStorage.setItem("dashboard_interval",t.toString()),this.intervalSubscription&&this.intervalSubscription.unsubscribe(),this.ngZone.runOutsideAngular(()=>{this.intervalSubscription=function(n=0,s=bf.P){return(!(0,aE.k)(n)||n<0)&&(n=0),(!s||"function"!=typeof s.schedule)&&(s=bf.P),new yy.y(t=>(t.add(s.schedule(mR,n,{subscriber:t,counter:0,period:n})),t))}(this.intervalTime).subscribe(()=>this.ngZone.run(()=>{this.intervalDataSource.next(this.intervalTime)}))})}getRefreshInterval(){return this.intervalTime}ngOnDestroy(){this.intervalSubscription&&this.intervalSubscription.unsubscribe()}}return n.\u0275fac=function(t){return new(t||n)(e.LFG(e.R0b))},n.\u0275prov=e.Yz7({token:n,factory:n.\u0275fac,providedIn:"root"}),n})();function lE(n,s){if(1&n&&(e.TgZ(0,"option",8),e._uU(1),e.qZA()),2&n){const t=s.$implicit,o=e.oxw();e.Q6J("value",o.intervalList[t]),e.xp6(1),e.Oqu(t)}}let uE=(()=>{class n{constructor(t){this.refreshIntervalService=t,this.intervalList={"5 s":5e3,"10 s":1e4,"15 s":15e3,"30 s":3e4,"1 min":6e4,"3 min":18e4,"5 min":3e5},this.intervalKeys=Object.keys(this.intervalList)}ngOnInit(){this.selectedInterval=this.refreshIntervalService.getRefreshInterval()||5e3}changeRefreshInterval(t){this.refreshIntervalService.setRefreshInterval(t)}}return n.\u0275fac=function(t){return new(t||n)(e.Y36($S))},n.\u0275cmp=e.Xpm({type:n,selectors:[["cd-refresh-selector"]],decls:8,vars:2,consts:function(){let s;return s="Refresh",[[1,"container-fluid"],[1,"row"],[1,"col","d-flex","justify-content-end"],[1,"form-inline"],["for","refreshInterval",1,"col-form-label","my-0","mx-2"],s,["id","refreshInterval","name","refreshInterval",1,"form-control",3,"ngModel","change","ngModelChange"],[3,"value",4,"ngFor","ngForOf"],[3,"value"]]},template:function(t,o){1&t&&(e.TgZ(0,"div",0),e.TgZ(1,"div",1),e.TgZ(2,"div",2),e.TgZ(3,"form",3),e.TgZ(4,"label",4),e.SDv(5,5),e.qZA(),e.TgZ(6,"select",6),e.NdJ("change",function(g){return o.changeRefreshInterval(g.target.value)})("ngModelChange",function(g){return o.selectedInterval=g}),e.YNc(7,lE,2,2,"option",7),e.qZA(),e.qZA(),e.qZA(),e.qZA(),e.qZA()),2&t&&(e.xp6(6),e.Q6J("ngModel",o.selectedInterval),e.xp6(1),e.Q6J("ngForOf",o.intervalKeys))},directives:[vn._Y,vn.JL,vn.F,ca.o,vn.EJ,Ha.b,vn.JJ,vn.On,_.sg,vn.YN,vn.Kr],styles:[""]}),n})();var HS=i(49671);let US=(()=>{class n{constructor(t){this.http=t}getFullHealth(){return this.http.get("api/health/full")}getMinimalHealth(){return this.http.get("api/health/minimal")}}return n.\u0275fac=function(t){return new(t||n)(e.LFG(y.eN))},n.\u0275prov=e.Yz7({token:n,factory:n.\u0275fac,providedIn:"root"}),n})();var $1=i(89154),Rv=i(99475);function cE(n,s){if(1&n&&(e.TgZ(0,"div",6),e.tHW(1,7),e.ALo(2,"lowercase"),e._UZ(3,"cd-doc",8),e.ALo(4,"lowercase"),e.N_p(),e.qZA()),2&n){const t=e.oxw();e.xp6(3),e.MGl("section","dashboard-landing-page-",e.lcZ(4,4,t.groupTitle),""),e.xp6(1),e.pQV(e.lcZ(2,2,t.groupTitle)),e.QtT(1)}}const dE=function(n,s){return[n,s]},BS=["*"];let qA=(()=>{class n{constructor(){this.icons=No.P}}return n.\u0275fac=function(t){return new(t||n)},n.\u0275cmp=e.Xpm({type:n,selectors:[["cd-info-group"]],inputs:{groupTitle:"groupTitle"},ngContentSelectors:BS,decls:11,vars:6,consts:function(){let s,t;return s="here",t="For an overview of " + "\ufffd0\ufffd" + " widgets click " + "\ufffd#3\ufffd" + "" + "\ufffd/#3\ufffd" + "",[[1,"row"],["triggers","",1,"info-group-title",3,"ngbPopover"],["popInfo","ngbPopover"],["type","button",1,"popover-icon","btn","btn-link","p-0",3,"click"],[3,"ngClass"],["popInfoTemplate",""],[1,"text-center"],t,["docText",s,3,"section"]]},template:function(t,o){if(1&t){const c=e.EpF();e.F$t(),e.TgZ(0,"div",0),e.TgZ(1,"div",1,2),e.TgZ(3,"span"),e._uU(4),e.qZA(),e.TgZ(5,"button",3),e.NdJ("click",function(){return e.CHM(c),e.MAs(2).toggle()}),e._UZ(6,"i",4),e.qZA(),e.qZA(),e.qZA(),e.TgZ(7,"div",0),e.Hsn(8),e.qZA(),e.YNc(9,cE,5,6,"ng-template",null,5,e.W1O)}if(2&t){const c=e.MAs(10);e.xp6(1),e.Q6J("ngbPopover",c),e.xp6(3),e.Oqu(o.groupTitle),e.xp6(2),e.Q6J("ngClass",e.WLB(3,dE,o.icons.infoCircle,o.icons.large))}},directives:[lt.o8,ca.o,_.mk,ol.K],pipes:[_.i8],styles:[".info-group-title[_ngcontent-%COMP%]{font-size:1.75rem;margin:0 0 .5vw .5vw}.popover-icon[_ngcontent-%COMP%]:focus{box-shadow:none}"]}),n})();function YS(n,s){if(1&n&&(e.TgZ(0,"a",6),e._uU(1),e.qZA()),2&n){const t=e.oxw();e.Q6J("routerLink",t.link),e.xp6(1),e.Oqu(t.cardTitle)}}function ZS(n,s){if(1&n&&e._uU(0),2&n){const t=e.oxw();e.hij(" ",t.cardTitle," ")}}const fE=["*"];let jS=(()=>{class n{constructor(){this.cardClass=""}}return n.\u0275fac=function(t){return new(t||n)},n.\u0275cmp=e.Xpm({type:n,selectors:[["cd-info-card"]],inputs:{cardTitle:"cardTitle",link:"link",cardClass:"cardClass",contentClass:"contentClass"},ngContentSelectors:fE,decls:8,vars:4,consts:[[1,"card","shadow-sm",3,"ngClass"],[1,"card-body","d-flex","align-items-center","justify-content-center"],[1,"card-title","m-4"],[3,"routerLink",4,"ngIf","ngIfElse"],["noLinkTitle",""],[1,"card-text","text-center",3,"ngClass"],[3,"routerLink"]],template:function(t,o){if(1&t&&(e.F$t(),e.TgZ(0,"div",0),e.TgZ(1,"div",1),e.TgZ(2,"h4",2),e.YNc(3,YS,2,2,"a",3),e.YNc(4,ZS,1,1,"ng-template",null,4,e.W1O),e.qZA(),e.TgZ(6,"div",5),e.Hsn(7),e.qZA(),e.qZA(),e.qZA()),2&t){const c=e.MAs(5);e.Q6J("ngClass",o.cardClass),e.xp6(3),e.Q6J("ngIf",o.link)("ngIfElse",c),e.xp6(3),e.Q6J("ngClass",o.contentClass)}},directives:[_.mk,_.O5,Yo.yS],styles:[".card[_ngcontent-%COMP%]{font-size:12px;border:.5px solid #dee2e6;border-radius:3px;height:100%}@media screen and (min-width: 320px){.card[_ngcontent-%COMP%]{font-size:calc(12px + 9 * ((100vw - 320px) / 1728))}}@media screen and (min-width: 2048px){.card[_ngcontent-%COMP%]{font-size:21px}}.card[_ngcontent-%COMP%]   .card-body[_ngcontent-%COMP%]{padding-top:40px!important}.card[_ngcontent-%COMP%]   .card-body[_ngcontent-%COMP%]   .card-title[_ngcontent-%COMP%]{left:-.6rem;position:absolute;top:-.3rem}.no-center[_ngcontent-%COMP%]{left:unset;position:unset;top:unset;transform:unset}.content-highlight[_ngcontent-%COMP%]{font-weight:bold}"]}),n})();var eO=i(6823);const GS=["chartCanvas"],VS=["chartTooltip"];let pE=(()=>{class n{constructor(t,o,c){this.dimlessBinary=t,this.dimless=o,this.cssHelper=c,this.config={},this.isBytesData=!1,this.showLabelAsTooltip=!1,this.prepareFn=new e.vpe,this.chartConfig={chartType:"doughnut",dataset:[{label:null,borderWidth:0}],colors:[{backgroundColor:[this.cssHelper.propertyValue("chart-color-green"),this.cssHelper.propertyValue("chart-color-yellow"),this.cssHelper.propertyValue("chart-color-orange"),this.cssHelper.propertyValue("chart-color-red"),this.cssHelper.propertyValue("chart-color-blue")]}],options:{cutoutPercentage:90,events:["click","mouseout","touchstart"],legend:{display:!0,position:"right",labels:{boxWidth:10,usePointStyle:!1}},plugins:{center_text:!0},tooltips:{enabled:!0,displayColors:!1,backgroundColor:this.cssHelper.propertyValue("chart-color-tooltip-background"),cornerRadius:0,bodyFontSize:14,bodyFontStyle:"600",position:"nearest",xPadding:12,yPadding:12,callbacks:{label:(g,C)=>{let D=C.labels[g.index];return D.includes("%")||(D=`${D} (${C.datasets[g.datasetIndex].data[g.index]}%)`),D}}},title:{display:!1}}},this.doughnutChartPlugins=[{id:"center_text",beforeDraw(g){const C=new Rv.P,D="Helvetica Neue, Helvetica, Arial, sans-serif";eO.defaults.global.defaultFontFamily=D;const P=g.ctx;if(!g.options.plugins.center_text||!g.data.datasets[0].label)return;P.save();const j=g.data.datasets[0].label.split("\n"),W=(g.chartArea.left+g.chartArea.right)/2,re=(g.chartArea.top+g.chartArea.bottom)/2;P.textAlign="center",P.textBaseline="middle",P.font=`24px ${D}`,P.fillStyle=C.propertyValue("chart-color-center-text"),P.fillText(j[0],W,re-10),j.length>1&&(P.font=`14px ${D}`,P.fillStyle=C.propertyValue("chart-color-center-text-description"),P.fillText(j[1],W,re+10)),P.restore()}}]}ngOnInit(){new ko.h(this.chartCanvasRef,this.chartTooltipRef,(g,C)=>C+g.caretX+"px",(g,C)=>C+g.caretY-g.height-10+"px").getBody=g=>this.getChartTooltipBody(g),Ar().merge(this.chartConfig,this.config),this.prepareFn.emit([this.chartConfig,this.data])}ngOnChanges(){this.prepareFn.emit([this.chartConfig,this.data]),this.setChartSliceBorderWidth()}getChartTooltipBody(t){const o=t[0].split(": ");return this.showLabelAsTooltip?o[0]:(o[1]=this.isBytesData?this.dimlessBinary.transform(o[1]):this.dimless.transform(o[1]),o.join(": "))}setChartSliceBorderWidth(){let t=0;Ar().forEach(this.chartConfig.dataset[0].data,function(o){o>0&&(t+=1)}),this.chartConfig.dataset[0].borderWidth=t>1?1:0}}return n.\u0275fac=function(t){return new(t||n)(e.Y36(yn.$),e.Y36(Or.n),e.Y36(Rv.P))},n.\u0275cmp=e.Xpm({type:n,selectors:[["cd-health-pie"]],viewQuery:function(t,o){if(1&t&&(e.Gf(GS,7),e.Gf(VS,7)),2&t){let c;e.iGM(c=e.CRH())&&(o.chartCanvasRef=c.first),e.iGM(c=e.CRH())&&(o.chartTooltipRef=c.first)}},inputs:{data:"data",config:"config",isBytesData:"isBytesData",tooltipFn:"tooltipFn",showLabelAsTooltip:"showLabelAsTooltip"},outputs:{prepareFn:"prepareFn"},features:[e.TTD],decls:6,vars:6,consts:[[1,"chart-container"],["baseChart","",1,"chart-canvas",3,"datasets","chartType","options","labels","colors","plugins"],["chartCanvas",""],[1,"chartjs-tooltip"],["chartTooltip",""]],template:function(t,o){1&t&&(e.TgZ(0,"div",0),e._UZ(1,"canvas",1,2),e.TgZ(3,"div",3,4),e._UZ(5,"table"),e.qZA(),e.qZA()),2&t&&(e.xp6(1),e.Q6J("datasets",o.chartConfig.dataset)("chartType",o.chartConfig.chartType)("options",o.chartConfig.options)("labels",o.chartConfig.labels)("colors",o.chartConfig.colors)("plugins",o.doughnutChartPlugins))},directives:[Ho.jh],styles:['.chart-container[_ngcontent-%COMP%]{cursor:pointer;margin:auto;overflow:visible;position:absolute}canvas[_ngcontent-%COMP%]{user-select:none}.chartjs-tooltip[_ngcontent-%COMP%]{background:rgba(0,0,0,.7);border-radius:3px;color:#fff;font-family:"Helvetica Neue","Helvetica","Arial",sans-serif!important;opacity:0;pointer-events:none;position:absolute;transform:translate(-50%);transition:all .1s ease}.chartjs-tooltip.transform-left[_ngcontent-%COMP%]{transform:translate(-10%)}.chartjs-tooltip.transform-left[_ngcontent-%COMP%]:after{left:10%}.chartjs-tooltip.transform-right[_ngcontent-%COMP%]{transform:translate(-90%)}.chartjs-tooltip.transform-right[_ngcontent-%COMP%]:after{left:90%}.chartjs-tooltip[_ngcontent-%COMP%]:after{border-color:#000 transparent transparent transparent;border-style:solid;border-width:5px;content:" ";left:50%;margin-left:-5px;position:absolute;top:100%}  .chartjs-tooltip-key{display:inline-block;height:10px;margin-right:10px;width:10px}.chart-container[_ngcontent-%COMP%]{height:100%;margin-left:auto;margin-right:auto;position:unset;width:100%}.chart-canvas[_ngcontent-%COMP%]{height:100%;margin-left:auto;margin-right:auto;max-height:100%;max-width:100%;position:unset;width:100%}']}),n})(),by=(()=>{class n{transform(t){if(!t)return"";let o=0,c=0,g=0,C=0;Ar().each(t.osds,W=>{W.in&&o++,W.up&&c++,W.state.includes("nearfull")&&g++,W.state.includes("full")&&C++});const D=[{content:`${t.osds.length} ${"total"}`,class:""}];D.push({content:"",class:"card-text-line-break"}),D.push({content:`${c} ${"up"}, ${o} ${"in"}`,class:""});const P=t.osds.length-c,j=t.osds.length-o;if(P>0||j>0){D.push({content:"",class:"card-text-line-break"});const W=P>0?`${P} ${"down"}`:"",ie=j>0?`${j} ${"out"}`:"";D.push({content:`${W}${P>0&&j>0?", ":""}${ie}`,class:"card-text-error"})}return g>0&&D.push({content:"",class:"card-text-line-break"},{content:`${g} ${"near full"}`,class:"card-text-error"},{content:"",class:"card-text-line-break"}),C>0&&D.push({content:`${C} ${"full"}`,class:"card-text-error"}),D}}return n.\u0275fac=function(t){return new(t||n)},n.\u0275pipe=e.Yjl({name:"osdSummary",type:n,pure:!0}),n})(),hE=(()=>{class n{transform(t){if(!t)return"";let o="",c="",g=0,C=0,D=0;Ar().each(t.standbys,()=>{g+=1}),t.standbys&&!t.filesystems?(o=`${g} ${"up"}`,c="no filesystems"):0===t.filesystems.length?o="no filesystems":(Ar().each(t.filesystems,Le=>{Ar().each(Le.mdsmap.info,Re=>{"up:standby-replay"===Re.state?D+=1:C+=1})}),o=`${C} ${"active"}`,c=`${g+D} ${"standby"}`);const P=t.standbys.map(Le=>Le.name).join(", "),j=P?`${"standby daemons"}: ${P}`:"",W=t.filesystems?t.filesystems.length:0,ie=Object.values(W>0?t.filesystems[0].mdsmap.info:{}).map(Le=>Le.name).join(", ");let ge=ie?`${"active daemon"}: ${ie}`:"";!C&&W>0&&(ge=`${D} ${"standbyReplay"}`);const _e=[{content:o,class:"popover-info",titleText:ge}];return c&&(_e.push({content:"",class:"card-text-line-break",titleText:""}),_e.push({content:c,class:"popover-info",titleText:j})),_e}}return n.\u0275fac=function(t){return new(t||n)},n.\u0275pipe=e.Yjl({name:"mdsSummary",type:n,pure:!0}),n})();var rm=(()=>{return(n=rm||(rm={})).HEALTH_ERR="health-color-error",n.HEALTH_WARN="health-color-warning",n.HEALTH_OK="health-color-healthy",rm;var n})();let _E=(()=>{class n{constructor(t){this.cssHelper=t}transform(t){return Object.keys(rm).includes(t)?{color:this.cssHelper.propertyValue(rm[t])}:null}}return n.\u0275fac=function(t){return new(t||n)(e.Y36(Rv.P,16))},n.\u0275pipe=e.Yjl({name:"healthColor",type:n,pure:!0}),n})(),zS=(()=>{class n{transform(t){return t?"" + t.monmap.mons.length.toString() + " (quorum " + t.quorum.join(", ") + ")":""}}return n.\u0275fac=function(t){return new(t||n)},n.\u0275pipe=e.Yjl({name:"monSummary",type:n,pure:!0}),n})(),WS=(()=>{class n{transform(t){if(!t)return"";let o="n/a";const c=Ar().isUndefined(t.active_name)?"":`${"active daemon"}: ${t.active_name}`;c.length>0&&(o="1");const g=t.standbys.map(j=>j.name).join(", "),C=g?`${"standby daemons"}: ${g}`:"",D=t.standbys.length,P=[{content:`${o} ${"active"}`,class:"popover-info",titleText:c}];return P.push({content:"",class:"card-text-line-break",titleText:""}),P.push({content:`${D} ${"standby"}`,class:"popover-info",titleText:C}),P}}return n.\u0275fac=function(t){return new(t||n)},n.\u0275pipe=e.Yjl({name:"mgrSummary",type:n,pure:!0}),n})();function JS(n,s){1&n&&e.GkF(0)}function QS(n,s){if(1&n&&(e.TgZ(0,"li"),e.TgZ(1,"span",22),e.ALo(2,"healthColor"),e._uU(3),e.qZA(),e._uU(4),e.qZA()),2&n){const t=s.$implicit;e.xp6(1),e.Q6J("ngStyle",e.lcZ(2,3,t.severity)),e.xp6(2),e.Oqu(t.type),e.xp6(1),e.hij(": ",t.summary.message," ")}}function XS(n,s){if(1&n&&(e.YNc(0,JS,1,0,"ng-container",20),e.TgZ(1,"ul"),e.YNc(2,QS,5,5,"li",21),e.qZA()),2&n){e.oxw(4);const t=e.MAs(5),o=e.oxw();e.Q6J("ngTemplateOutlet",t),e.xp6(2),e.Q6J("ngForOf",o.healthData.health.checks)}}function vR(n,s){1&n&&e._UZ(0,"i",23)}function tO(n,s){if(1&n&&(e.ynx(0),e.YNc(1,XS,3,2,"ng-template",null,17,e.W1O),e.TgZ(3,"div",18),e.ALo(4,"healthColor"),e._uU(5),e.YNc(6,vR,1,0,"i",19),e.qZA(),e.BQk()),2&n){const t=e.MAs(2),o=e.oxw(4);e.xp6(3),e.Q6J("ngStyle",e.lcZ(4,4,o.healthData.health.status))("ngbPopover",t),e.xp6(2),e.hij(" ",o.healthData.health.status," "),e.xp6(1),e.Q6J("ngIf","HEALTH_OK"!=(null==o.healthData.health?null:o.healthData.health.status))}}function nO(n,s){if(1&n&&(e.ynx(0),e.TgZ(1,"div",22),e.ALo(2,"healthColor"),e._uU(3),e.qZA(),e.BQk()),2&n){const t=e.oxw(4);e.xp6(1),e.Q6J("ngStyle",e.lcZ(2,2,t.healthData.health.status)),e.xp6(2),e.hij(" ",t.healthData.health.status," ")}}function KS(n,s){if(1&n&&(e.TgZ(0,"cd-info-card",15),e.YNc(1,tO,7,6,"ng-container",16),e.YNc(2,nO,4,4,"ng-container",16),e.qZA()),2&n){const t=e.oxw(3);e.xp6(1),e.Q6J("ngIf",(null==t.healthData.health||null==t.healthData.health.checks?null:t.healthData.health.checks.length)>0),e.xp6(1),e.Q6J("ngIf",!(null!=t.healthData.health&&null!=t.healthData.health.checks&&t.healthData.health.checks.length))}}function rO(n,s){if(1&n&&(e.TgZ(0,"cd-info-card",24),e._uU(1),e.qZA()),2&n){const t=e.oxw(3);e.xp6(1),e.hij(" ",t.healthData.hosts," total ")}}function Tf(n,s){if(1&n&&(e.TgZ(0,"cd-info-card",25),e._uU(1),e.ALo(2,"monSummary"),e.qZA()),2&n){const t=e.oxw(3);e.xp6(1),e.hij(" ",e.lcZ(2,1,t.healthData.mon_status)," ")}}function qS(n,s){if(1&n&&(e.TgZ(0,"span",28),e._uU(1),e.qZA()),2&n){const t=s.$implicit;e.Q6J("ngClass",t.class),e.xp6(1),e.hij(" ",t.content," ")}}function iO(n,s){if(1&n&&(e.TgZ(0,"cd-info-card",26),e.YNc(1,qS,2,2,"span",27),e.qZA()),2&n){const t=s.ngIf;e.xp6(1),e.Q6J("ngForOf",t)}}function oO(n,s){if(1&n&&(e.TgZ(0,"span",31),e._uU(1),e.qZA()),2&n){const t=s.$implicit;e.Q6J("ngClass",t.class)("title",null!=t.titleText?t.titleText:""),e.xp6(1),e.hij(" ",t.content," ")}}function eC(n,s){if(1&n&&(e.TgZ(0,"cd-info-card",29),e.YNc(1,oO,2,3,"span",30),e.ALo(2,"mgrSummary"),e.qZA()),2&n){const t=e.oxw(3);e.xp6(1),e.Q6J("ngForOf",e.lcZ(2,1,t.healthData.mgr_map))}}function sO(n,s){if(1&n&&(e.TgZ(0,"cd-info-card",32),e._uU(1),e.qZA()),2&n){const t=e.oxw(3);e.xp6(1),e.hij(" ",t.healthData.rgw," total ")}}function tC(n,s){if(1&n&&(e.TgZ(0,"span",31),e._uU(1),e.qZA()),2&n){const t=s.$implicit;e.Q6J("ngClass",t.class)("title",null!=t.titleText?t.titleText:""),e.xp6(1),e.hij(" ",t.content," ")}}function nC(n,s){if(1&n&&(e.TgZ(0,"cd-info-card",33),e.YNc(1,tC,2,3,"span",30),e.qZA()),2&n){const t=s.ngIf;e.Q6J("contentClass",(t.length>1?"text-area-size-2":"")+" content-highlight"),e.xp6(1),e.Q6J("ngForOf",t)}}const Nv=function(n){return{"card-text-error":n}};function aO(n,s){if(1&n&&(e.TgZ(0,"cd-info-card",34),e._uU(1),e._UZ(2,"span",35),e._uU(3),e.TgZ(4,"span",28),e._uU(5),e.qZA(),e.qZA()),2&n){const t=e.oxw(3);e.xp6(1),e.hij(" ",t.healthData.iscsi_daemons.up+t.healthData.iscsi_daemons.down," total "),e.xp6(2),e.hij(" ",t.healthData.iscsi_daemons.up," up, "),e.xp6(1),e.Q6J("ngClass",e.VKq(4,Nv,t.healthData.iscsi_daemons.down>0)),e.xp6(1),e.hij("",t.healthData.iscsi_daemons.down," down")}}function lO(n,s){if(1&n&&(e.TgZ(0,"cd-info-group",6),e.YNc(1,KS,3,2,"cd-info-card",7),e.YNc(2,rO,2,1,"cd-info-card",8),e.YNc(3,Tf,3,3,"cd-info-card",9),e.YNc(4,iO,2,1,"cd-info-card",10),e.ALo(5,"osdSummary"),e.YNc(6,eC,3,3,"cd-info-card",11),e.YNc(7,sO,2,1,"cd-info-card",12),e.YNc(8,nC,2,2,"cd-info-card",13),e.ALo(9,"mdsSummary"),e.YNc(10,aO,6,6,"cd-info-card",14),e.qZA()),2&n){const t=e.oxw().ngIf,o=e.oxw();e.xp6(1),e.Q6J("ngIf",null==o.healthData.health?null:o.healthData.health.status),e.xp6(1),e.Q6J("ngIf",null!=o.healthData.hosts),e.xp6(1),e.Q6J("ngIf",o.healthData.mon_status),e.xp6(1),e.Q6J("ngIf",e.lcZ(5,8,o.healthData.osd_map)),e.xp6(2),e.Q6J("ngIf",o.healthData.mgr_map),e.xp6(1),e.Q6J("ngIf",t.rgw&&null!=o.healthData.rgw),e.xp6(1),e.Q6J("ngIf",e.lcZ(9,10,t.cephfs&&o.healthData.fs_map)),e.xp6(2),e.Q6J("ngIf",t.iscsi&&null!=o.healthData.iscsi_daemons)}}function rC(n,s){if(1&n){const t=e.EpF();e.TgZ(0,"cd-info-card",42),e.TgZ(1,"cd-health-pie",43),e.NdJ("prepareFn",function(c){return e.CHM(t),e.oxw(3).prepareRawUsage(c[0],c[1])}),e.qZA(),e.qZA()}if(2&n){const t=e.oxw(3);e.xp6(1),e.Q6J("data",t.healthData)("config",t.rawCapacityChartConfig)("isBytesData",!0)}}function uO(n,s){if(1&n){const t=e.EpF();e.TgZ(0,"cd-info-card",44),e.TgZ(1,"cd-health-pie",45),e.NdJ("prepareFn",function(c){return e.CHM(t),e.oxw(3).prepareObjects(c[0],c[1])}),e.qZA(),e.qZA()}if(2&n){const t=e.oxw(3);e.xp6(1),e.Q6J("data",t.healthData)}}function iC(n,s){1&n&&e.GkF(0)}function yR(n,s){if(1&n&&(e.TgZ(0,"li"),e._uU(1),e.qZA()),2&n){const t=s.$implicit;e.xp6(1),e.AsE(" ",t.key,": ",t.value," ")}}function gE(n,s){if(1&n&&(e.YNc(0,iC,1,0,"ng-container",20),e.TgZ(1,"ul"),e.YNc(2,yR,2,2,"li",21),e.ALo(3,"keyvalue"),e.qZA()),2&n){e.oxw(3);const t=e.MAs(5),o=e.oxw();e.Q6J("ngTemplateOutlet",t),e.xp6(2),e.Q6J("ngForOf",e.lcZ(3,2,o.healthData.pg_info.statuses))}}function mE(n,s){if(1&n){const t=e.EpF();e.TgZ(0,"cd-info-card",46),e.YNc(1,gE,4,4,"ng-template",null,47,e.W1O),e.TgZ(3,"div",48),e.TgZ(4,"div",49),e.TgZ(5,"cd-health-pie",50),e.NdJ("prepareFn",function(c){return e.CHM(t),e.oxw(3).preparePgStatus(c[0],c[1])}),e.qZA(),e.qZA(),e.qZA(),e.qZA()}if(2&n){const t=e.MAs(2),o=e.oxw(3);e.xp6(4),e.Q6J("ngbPopover",t),e.xp6(1),e.Q6J("data",o.healthData)("config",o.pgStatusChartConfig)}}function ig(n,s){if(1&n&&(e.TgZ(0,"cd-info-card",51),e._uU(1),e.qZA()),2&n){const t=e.oxw(3);e.xp6(1),e.hij(" ",t.healthData.pools.length," ")}}function cO(n,s){if(1&n&&(e.TgZ(0,"cd-info-card",52),e._uU(1),e.ALo(2,"dimless"),e.qZA()),2&n){const t=e.oxw(3);e.xp6(1),e.hij(" ",e.lcZ(2,1,t.healthData.pg_info.pgs_per_osd)," ")}}function oC(n,s){if(1&n&&(e.TgZ(0,"cd-info-group",36),e.YNc(1,rC,2,3,"cd-info-card",37),e.YNc(2,uO,2,1,"cd-info-card",38),e.YNc(3,mE,6,3,"cd-info-card",39),e.YNc(4,ig,2,1,"cd-info-card",40),e.YNc(5,cO,3,3,"cd-info-card",41),e.qZA()),2&n){const t=e.oxw(2);e.xp6(1),e.Q6J("ngIf",t.healthData.df),e.xp6(1),e.Q6J("ngIf",null!=(null==t.healthData.pg_info||null==t.healthData.pg_info.object_stats?null:t.healthData.pg_info.object_stats.num_objects)),e.xp6(1),e.Q6J("ngIf",t.healthData.pg_info),e.xp6(1),e.Q6J("ngIf",t.healthData.pools),e.xp6(1),e.Q6J("ngIf",t.healthData.pg_info)}}function og(n,s){if(1&n){const t=e.EpF();e.TgZ(0,"cd-info-card",58),e.TgZ(1,"cd-health-pie",50),e.NdJ("prepareFn",function(c){return e.CHM(t),e.oxw(3).prepareReadWriteRatio(c[0],c[1])}),e.qZA(),e.qZA()}if(2&n){const t=e.oxw(3);e.xp6(1),e.Q6J("data",t.healthData)("config",t.clientStatsConfig)}}function T_(n,s){if(1&n){const t=e.EpF();e.TgZ(0,"cd-info-card",59),e.TgZ(1,"cd-health-pie",50),e.NdJ("prepareFn",function(c){return e.CHM(t),e.oxw(3).prepareClientThroughput(c[0],c[1])}),e.qZA(),e.qZA()}if(2&n){const t=e.oxw(3);e.xp6(1),e.Q6J("data",t.healthData)("config",t.clientStatsConfig)}}function S_(n,s){if(1&n&&(e.TgZ(0,"cd-info-card",60),e._uU(1),e.ALo(2,"dimlessBinary"),e.qZA()),2&n){const t=e.oxw(3);e.xp6(1),e.hij(" ",e.lcZ(2,1,t.healthData.client_perf.recovering_bytes_per_sec)+"/s"," ")}}function sC(n,s){if(1&n&&(e.TgZ(0,"cd-info-card",61),e._uU(1),e.qZA()),2&n){const t=e.oxw(3);e.xp6(1),e.hij(" ",t.healthData.scrub_status," ")}}function aC(n,s){if(1&n&&(e.TgZ(0,"cd-info-group",53),e.YNc(1,og,2,2,"cd-info-card",54),e.YNc(2,T_,2,2,"cd-info-card",55),e.YNc(3,S_,3,3,"cd-info-card",56),e.YNc(4,sC,2,1,"cd-info-card",57),e.qZA()),2&n){const t=e.oxw(2);e.xp6(1),e.Q6J("ngIf",t.healthData.client_perf),e.xp6(1),e.Q6J("ngIf",t.healthData.client_perf),e.xp6(1),e.Q6J("ngIf",t.healthData.client_perf),e.xp6(1),e.Q6J("ngIf",t.healthData.scrub_status)}}const dO=function(n){return[n]};function fO(n,s){if(1&n&&(e.ynx(0),e.TgZ(1,"p",62),e.tHW(2,63),e._UZ(3,"i",28),e._UZ(4,"a",64),e.N_p(),e.qZA(),e.BQk()),2&n){const t=e.oxw(3);e.xp6(3),e.Q6J("ngClass",e.VKq(1,dO,t.icons.infoCircle))}}function pO(n,s){if(1&n&&e.YNc(0,fO,5,3,"ng-container",16),2&n){const t=e.oxw(2);e.Q6J("ngIf",t.permissions.log.read)}}function hO(n,s){if(1&n&&(e.TgZ(0,"div",1),e.YNc(1,lO,11,12,"cd-info-group",2),e.YNc(2,oC,6,5,"cd-info-group",3),e.YNc(3,aC,5,4,"cd-info-group",4),e.YNc(4,pO,1,1,"ng-template",null,5,e.W1O),e.qZA()),2&n){const t=e.oxw();e.xp6(1),e.Q6J("ngIf",(null==t.healthData.health?null:t.healthData.health.status)||t.healthData.mon_status||t.healthData.osd_map||t.healthData.mgr_map||null!=t.healthData.hosts||null!=t.healthData.rgw||t.healthData.fs_map||null!=t.healthData.iscsi_daemons),e.xp6(1),e.Q6J("ngIf",t.healthData.pools||t.healthData.df||t.healthData.pg_info),e.xp6(1),e.Q6J("ngIf",t.healthData.client_perf||t.healthData.scrub_status)}}let vE=(()=>{class n{constructor(t,o,c,g,C,D,P,j,W){this.healthService=t,this.osdService=o,this.authStorageService=c,this.pgCategoryService=g,this.featureToggles=C,this.refreshIntervalService=D,this.dimlessBinary=P,this.dimless=j,this.cssHelper=W,this.osdSettings=new Sv,this.interval=new gu.w,this.icons=No.P,this.clientStatsConfig={colors:[{backgroundColor:[this.cssHelper.propertyValue("chart-color-cyan"),this.cssHelper.propertyValue("chart-color-purple")]}]},this.rawCapacityChartConfig={colors:[{backgroundColor:[this.cssHelper.propertyValue("chart-color-blue"),this.cssHelper.propertyValue("chart-color-gray")]}]},this.pgStatusChartConfig={options:{events:[""]}},this.permissions=this.authStorageService.getPermissions(),this.enabledFeature$=this.featureToggles.get()}ngOnInit(){this.interval=this.refreshIntervalService.intervalData$.subscribe(()=>{this.getHealth()}),this.osdService.getOsdSettings().pipe((0,ye.q)(1)).subscribe(t=>{this.osdSettings=t})}ngOnDestroy(){this.interval.unsubscribe()}getHealth(){this.healthService.getMinimalHealth().subscribe(t=>{this.healthData=t})}prepareReadWriteRatio(t){const o=[],c=[],g=this.healthData.client_perf.write_op_per_sec+this.healthData.client_perf.read_op_per_sec;o.push(`${"Reads"}: ${this.dimless.transform(this.healthData.client_perf.read_op_per_sec)} ${"/s"}`),c.push(this.calcPercentage(this.healthData.client_perf.read_op_per_sec,g)),o.push(`${"Writes"}: ${this.dimless.transform(this.healthData.client_perf.write_op_per_sec)} ${"/s"}`),c.push(this.calcPercentage(this.healthData.client_perf.write_op_per_sec,g)),t.labels=o,t.dataset[0].data=c,t.dataset[0].label=`${this.dimless.transform(g)}\n${"IOPS"}`}prepareClientThroughput(t){const o=[],c=[],g=this.healthData.client_perf.read_bytes_sec+this.healthData.client_perf.write_bytes_sec;o.push(`${"Reads"}: ${this.dimlessBinary.transform(this.healthData.client_perf.read_bytes_sec)}${"/s"}`),c.push(this.calcPercentage(this.healthData.client_perf.read_bytes_sec,g)),o.push(`${"Writes"}: ${this.dimlessBinary.transform(this.healthData.client_perf.write_bytes_sec)}${"/s"}`),c.push(this.calcPercentage(this.healthData.client_perf.write_bytes_sec,g)),t.labels=o,t.dataset[0].data=c,t.dataset[0].label=`${this.dimlessBinary.transform(g).replace(" ","\n")}${"/s"}`}prepareRawUsage(t,o){const c=this.calcPercentage(o.df.stats.total_bytes-o.df.stats.total_used_raw_bytes,o.df.stats.total_bytes),g=this.calcPercentage(o.df.stats.total_used_raw_bytes,o.df.stats.total_bytes);this.color=g/100>=this.osdSettings.nearfull_ratio?"chart-color-red":g/100>=this.osdSettings.full_ratio?"chart-color-yellow":"chart-color-blue",this.rawCapacityChartConfig.colors[0].backgroundColor[0]=this.cssHelper.propertyValue(this.color),t.dataset[0].data=[g,c],t.labels=[`${"Used"}: ${this.dimlessBinary.transform(o.df.stats.total_used_raw_bytes)}`,`${"Avail."}: ${this.dimlessBinary.transform(o.df.stats.total_bytes-o.df.stats.total_used_raw_bytes)}`],t.dataset[0].label=`${g}%\nof ${this.dimlessBinary.transform(o.df.stats.total_bytes)}`}preparePgStatus(t,o){const c={};let g=0;Ar().forEach(o.pg_info.statuses,(C,D)=>{const P=this.pgCategoryService.getTypeByStates(D);Ar().isUndefined(c[P])&&(c[P]=0),c[P]+=C,g+=C});for(const C of this.pgCategoryService.getAllTypes())Ar().isUndefined(c[C])&&(c[C]=0);t.dataset[0].data=this.pgCategoryService.getAllTypes().map(C=>this.calcPercentage(c[C],g)),t.labels=[`${"Clean"}: ${this.dimless.transform(c.clean)}`,`${"Working"}: ${this.dimless.transform(c.working)}`,`${"Warning"}: ${this.dimless.transform(c.warning)}`,`${"Unknown"}: ${this.dimless.transform(c.unknown)}`],t.dataset[0].label=`${g}\n${"PGs"}`}prepareObjects(t,o){const c=o.pg_info.object_stats.num_object_copies,C=this.calcPercentage(c-o.pg_info.object_stats.num_objects_misplaced-o.pg_info.object_stats.num_objects_degraded-o.pg_info.object_stats.num_objects_unfound,c),D=this.calcPercentage(o.pg_info.object_stats.num_objects_misplaced,c),P=this.calcPercentage(o.pg_info.object_stats.num_objects_degraded,c),j=this.calcPercentage(o.pg_info.object_stats.num_objects_unfound,c);t.labels=[`${"Healthy"}: ${C}%`,`${"Misplaced"}: ${D}%`,`${"Degraded"}: ${P}%`,`${"Unfound"}: ${j}%`],t.dataset[0].data=[C,D,P,j],t.dataset[0].label=`${this.dimless.transform(o.pg_info.object_stats.num_objects)}\n${"objects"}`}isClientReadWriteChartShowable(){return(this.healthData.client_perf.read_op_per_sec||0)+(this.healthData.client_perf.write_op_per_sec||0)>0}calcPercentage(t,o){return Ar().isNumber(t)&&Ar().isNumber(o)&&0!==o?Math.ceil(t/o*100*100)/100:0}}return n.\u0275fac=function(t){return new(t||n)(e.Y36(US),e.Y36(Ji),e.Y36(_t.j),e.Y36(HS.j),e.Y36($1.l),e.Y36($S),e.Y36(yn.$),e.Y36(Or.n),e.Y36(Rv.P))},n.\u0275cmp=e.Xpm({type:n,selectors:[["cd-health"]],decls:2,vars:3,consts:function(){let s,t,o,c,g,C,D,P,j,W,re,ie,ge,_e,Le,Re,ke,xe,U,pt,ht;return s="Status",t="Capacity",o="Performance",c="Cluster Status",g="Hosts",C="Monitors",D="OSDs",P="Managers",j="Object Gateways",W="Metadata Servers",re="iSCSI Gateways",ie="Raw Capacity",ge="Objects",_e="PG Status",Le="Pools",Re="PGs per OSD",ke="Client Read/Write",xe="Client Throughput",U="Recovery Throughput",pt="Scrubbing",ht="" + "\ufffd#3\ufffd" + "" + "\ufffd/#3\ufffd" + " See " + "\ufffd#4\ufffd" + "Logs" + "\ufffd/#4\ufffd" + " for more details.",[["class","container-fluid",4,"ngIf"],[1,"container-fluid"],["groupTitle",s,4,"ngIf"],["groupTitle",t,4,"ngIf"],["groupTitle",o,4,"ngIf"],["logsLink",""],["groupTitle",s],["cardTitle",c,"class","cd-status-card","contentClass","content-highlight",4,"ngIf"],["cardTitle",g,"link","/hosts","class","cd-status-card","contentClass","content-highlight",4,"ngIf"],["cardTitle",C,"link","/monitor","class","cd-status-card","contentClass","content-highlight",4,"ngIf"],["cardTitle",D,"link","/osd","class","cd-status-card","contentClass","content-highlight",4,"ngIf"],["cardTitle",P,"class","cd-status-card","contentClass","content-highlight",4,"ngIf"],["cardTitle",j,"link","/rgw/daemon","class","cd-status-card","contentClass","content-highlight",4,"ngIf"],["cardTitle",W,"class","cd-status-card",3,"contentClass",4,"ngIf"],["cardTitle",re,"link","/block/iscsi","class","cd-status-card","contentClass","content-highlight",4,"ngIf"],["cardTitle",c,"contentClass","content-highlight",1,"cd-status-card"],[4,"ngIf"],["healthChecks",""],["popoverClass","info-card-popover-cluster-status",1,"info-card-content-clickable",3,"ngStyle","ngbPopover"],["class","fa fa-exclamation-triangle",4,"ngIf"],[4,"ngTemplateOutlet"],[4,"ngFor","ngForOf"],[3,"ngStyle"],[1,"fa","fa-exclamation-triangle"],["cardTitle",g,"link","/hosts","contentClass","content-highlight",1,"cd-status-card"],["cardTitle",C,"link","/monitor","contentClass","content-highlight",1,"cd-status-card"],["cardTitle",D,"link","/osd","contentClass","content-highlight",1,"cd-status-card"],[3,"ngClass",4,"ngFor","ngForOf"],[3,"ngClass"],["cardTitle",P,"contentClass","content-highlight",1,"cd-status-card"],[3,"ngClass","title",4,"ngFor","ngForOf"],[3,"ngClass","title"],["cardTitle",j,"link","/rgw/daemon","contentClass","content-highlight",1,"cd-status-card"],["cardTitle",W,1,"cd-status-card",3,"contentClass"],["cardTitle",re,"link","/block/iscsi","contentClass","content-highlight",1,"cd-status-card"],[1,"card-text-line-break"],["groupTitle",t],["cardTitle",ie,"class","cd-capacity-card cd-chart-card","contentClass","content-chart",4,"ngIf"],["cardTitle",ge,"class","cd-capacity-card cd-chart-card","contentClass","content-chart",4,"ngIf"],["cardTitle",_e,"class","cd-capacity-card cd-chart-card","contentClass","content-chart",4,"ngIf"],["cardTitle",Le,"link","/pool","class","cd-capacity-card","contentClass","content-highlight",4,"ngIf"],["cardTitle",Re,"class","cd-capacity-card","contentClass","content-highlight",4,"ngIf"],["cardTitle",ie,"contentClass","content-chart",1,"cd-capacity-card","cd-chart-card"],[3,"data","config","isBytesData","prepareFn"],["cardTitle",ge,"contentClass","content-chart",1,"cd-capacity-card","cd-chart-card"],[3,"data","prepareFn"],["cardTitle",_e,"contentClass","content-chart",1,"cd-capacity-card","cd-chart-card"],["pgStatus",""],[1,"pg-status-popover-wrapper"],[3,"ngbPopover"],[3,"data","config","prepareFn"],["cardTitle",Le,"link","/pool","contentClass","content-highlight",1,"cd-capacity-card"],["cardTitle",Re,"contentClass","content-highlight",1,"cd-capacity-card"],["groupTitle",o],["cardTitle",ke,"class","cd-performance-card cd-chart-card","contentClass","content-chart",4,"ngIf"],["cardTitle",xe,"class","cd-performance-card cd-chart-card","contentClass","content-chart",4,"ngIf"],["cardTitle",U,"class","cd-performance-card","contentClass","content-highlight",4,"ngIf"],["cardTitle",pt,"class","cd-performance-card","contentClass","content-highlight",4,"ngIf"],["cardTitle",ke,"contentClass","content-chart",1,"cd-performance-card","cd-chart-card"],["cardTitle",xe,"contentClass","content-chart",1,"cd-performance-card","cd-chart-card"],["cardTitle",U,"contentClass","content-highlight",1,"cd-performance-card"],["cardTitle",pt,"contentClass","content-highlight",1,"cd-performance-card"],[1,"logs-link"],ht,["routerLink","/logs"]]},template:function(t,o){1&t&&(e.YNc(0,hO,6,3,"div",0),e.ALo(1,"async")),2&t&&e.Q6J("ngIf",e.lcZ(1,1,o.healthData&&o.enabledFeature$))},directives:[_.O5,qA,jS,_.PC,lt.o8,_.tP,_.sg,_.mk,pE,Yo.yS],pipes:[_.Ov,by,hE,_E,zS,WS,_.Nd,Or.n,yn.$],styles:['cd-info-card[_ngcontent-%COMP%]{padding:0 .5vw}  cd-health .pg-status-popover-wrapper{position:relative}  cd-health .pg-status-popover-wrapper .popover{max-height:20vh;max-width:unset!important;min-width:unset!important;position:absolute;width:116%}  cd-health .pg-status-popover-wrapper .popover .popover-body{font-size:1rem;max-height:19vh;max-width:100%}.logs-link[_ngcontent-%COMP%]{text-align:center}.card-text-error[_ngcontent-%COMP%]{color:#c9190b;display:inline}.card-text-line-break[_ngcontent-%COMP%]:after{content:"\\a";white-space:pre}.popover-info[_ngcontent-%COMP%]:hover{cursor:pointer}']}),n})();function H1(n,s){1&n&&e._UZ(0,"cd-health")}function _O(n,s){}function lC(n,s){if(1&n&&(e.ynx(0),e.TgZ(1,"ul",1,2),e.TgZ(3,"li",3),e.TgZ(4,"a",4),e.SDv(5,5),e.qZA(),e.YNc(6,H1,1,0,"ng-template",6),e.qZA(),e.TgZ(7,"li",3),e.TgZ(8,"a",4),e.SDv(9,7),e.qZA(),e.YNc(10,_O,0,0,"ng-template",6),e.qZA(),e.qZA(),e._UZ(11,"div",8),e.BQk()),2&n){const t=e.MAs(2);e.xp6(11),e.Q6J("ngbNavOutlet",t)}}function gO(n,s){1&n&&e._UZ(0,"cd-health")}let uC=(()=>{class n{constructor(){this.hasGrafana=!1}}return n.\u0275fac=function(t){return new(t||n)},n.\u0275cmp=e.Xpm({type:n,selectors:[["cd-dashboard"]],decls:4,vars:2,consts:function(){let s,t;return s="Health",t="Statistics",[[4,"ngIf"],["ngbNav","",1,"nav-tabs"],["nav","ngbNav"],["ngbNavItem",""],["ngbNavLink",""],s,["ngbNavContent",""],t,[3,"ngbNavOutlet"]]},template:function(t,o){1&t&&(e.TgZ(0,"div"),e._UZ(1,"cd-refresh-selector"),e.YNc(2,lC,12,1,"ng-container",0),e.YNc(3,gO,1,0,"cd-health",0),e.qZA()),2&t&&(e.xp6(2),e.Q6J("ngIf",o.hasGrafana),e.xp6(1),e.Q6J("ngIf",!o.hasGrafana))},directives:[uE,_.O5,lt.Pz,lt.nv,lt.Vx,lt.uN,lt.tO,vE],styles:["div[_ngcontent-%COMP%]{padding-top:20px}"]}),n})();var Pv=i(5304),Ey=i(95152),mO=i(33394),yE=i(40205);let Ty=(()=>{class n extends Xf.S{constructor(t){super(),this.http=t,this.apiPath="api/nfs-ganesha",this.uiApiPath="ui-api/nfs-ganesha",this.nfsAccessType=[{value:"RW",help:"Allows all operations"},{value:"RO",help:"Allows only operations that do not modify the server"},{value:"NONE",help:"Allows no access at all"}],this.nfsFsal=[{value:"CEPH",descr:"CephFS",disabled:!1},{value:"RGW",descr:"Object Gateway",disabled:!1}],this.nfsSquash={no_root_squash:["no_root_squash","noidsquash","none"],root_id_squash:["root_id_squash","rootidsquash","rootid"],root_squash:["root_squash","rootsquash","root"],all_squash:["all_squash","allsquash","all","allanonymous","all_anonymous"]}}list(){return this.http.get(`${this.apiPath}/export`)}get(t,o){return this.http.get(`${this.apiPath}/export/${t}/${o}`)}create(t){return this.http.post(`${this.apiPath}/export`,t,{headers:{Accept:this.getVersionHeaderValue(2,0)},observe:"response"})}update(t,o,c){return this.http.put(`${this.apiPath}/export/${t}/${o}`,c,{headers:{Accept:this.getVersionHeaderValue(2,0)},observe:"response"})}delete(t,o){return this.http.delete(`${this.apiPath}/export/${t}/${o}`,{headers:{Accept:this.getVersionHeaderValue(2,0)},observe:"response"})}listClusters(){return this.http.get(`${this.apiPath}/cluster`,{headers:{Accept:this.getVersionHeaderValue(0,1)}})}lsDir(t,o){return t?this.http.get(`${this.uiApiPath}/lsdir/${t}?root_dir=${o}`):(0,yE._)("Please specify a filesystem volume.")}fsals(){return this.http.get(`${this.uiApiPath}/fsals`)}filesystems(){return this.http.get(`${this.uiApiPath}/cephfs/filesystems`)}}return n.\u0275fac=function(t){return new(t||n)(e.LFG(y.eN))},n.\u0275prov=e.Yz7({token:n,factory:n.\u0275fac,providedIn:"root"}),n})();var bE=i(36569);const Sy=["squashHelper"];function EE(n,s){1&n&&(e.TgZ(0,"span",14),e.TgZ(1,"span",15),e.SDv(2,16),e.qZA(),e.qZA())}function TE(n,s){1&n&&(e.TgZ(0,"span"),e.SDv(1,37),e.qZA())}function cC(n,s){1&n&&(e.TgZ(0,"span"),e.ynx(1),e.SDv(2,38),e.BQk(),e._UZ(3,"br"),e.ynx(4),e.SDv(5,39),e.BQk(),e._uU(6," 192.168.0.10, 192.168.1.0/8 "),e.qZA())}function dC(n,s){if(1&n&&(e.TgZ(0,"option",40),e._uU(1),e.qZA()),2&n){const t=s.$implicit;e.Q6J("value",t.value),e.xp6(1),e.Oqu(t.value)}}function fC(n,s){if(1&n&&(e.TgZ(0,"span",15),e._uU(1),e.qZA()),2&n){const t=e.oxw().index,o=e.oxw();e.xp6(1),e.hij(" ",o.getAccessTypeHelp(t)," ")}}function pC(n,s){1&n&&e.GkF(0)}function hC(n,s){if(1&n&&(e.TgZ(0,"option",40),e._uU(1),e.qZA()),2&n){const t=s.$implicit;e.Q6J("value",t),e.xp6(1),e.Oqu(t)}}function _C(n,s){if(1&n){const t=e.EpF();e.TgZ(0,"div"),e.TgZ(1,"div",17),e.TgZ(2,"div",18),e._uU(3),e.ALo(4,"ordinal"),e.TgZ(5,"span",19),e.NdJ("click",function(){const g=e.CHM(t).index;return e.oxw().removeClient(g)}),e._uU(6,"\xd7"),e.qZA(),e.qZA(),e.TgZ(7,"div",20),e.TgZ(8,"div",0),e.TgZ(9,"label",21),e.SDv(10,22),e.qZA(),e.TgZ(11,"div",23),e._UZ(12,"input",24),e.TgZ(13,"span",25),e.YNc(14,TE,2,0,"span",26),e.YNc(15,cC,7,0,"span",26),e.qZA(),e.qZA(),e.qZA(),e.TgZ(16,"div",0),e.TgZ(17,"label",27),e.SDv(18,28),e.qZA(),e.TgZ(19,"div",23),e.TgZ(20,"select",29),e.TgZ(21,"option",30),e._uU(22),e.qZA(),e.YNc(23,dC,2,2,"option",31),e.qZA(),e.YNc(24,fC,2,1,"span",32),e.qZA(),e.qZA(),e.TgZ(25,"div",0),e.TgZ(26,"label",33),e.TgZ(27,"span"),e.SDv(28,34),e.qZA(),e.YNc(29,pC,1,0,"ng-container",35),e.qZA(),e.TgZ(30,"div",23),e.TgZ(31,"select",36),e.TgZ(32,"option",30),e._uU(33),e.qZA(),e.YNc(34,hC,2,2,"option",31),e.qZA(),e.qZA(),e.qZA(),e.qZA(),e.qZA(),e.qZA()}if(2&n){const t=s.$implicit,o=s.index,c=e.oxw(),g=e.MAs(4);e.xp6(1),e.Q6J("formGroup",t),e.xp6(2),e.hij(" ",e.lcZ(4,10,o+1)," "),e.xp6(11),e.Q6J("ngIf",c.showError(o,"addresses",g,"required")),e.xp6(1),e.Q6J("ngIf",c.showError(o,"addresses",g,"pattern")),e.xp6(7),e.Oqu(c.getNoAccessTypeDescr()),e.xp6(1),e.Q6J("ngForOf",c.nfsAccessType),e.xp6(1),e.Q6J("ngIf",c.getValue(o,"access_type")),e.xp6(5),e.Q6J("ngTemplateOutlet",c.squashHelperTpl),e.xp6(4),e.Oqu(c.getNoSquashDescr()),e.xp6(1),e.Q6J("ngForOf",c.nfsSquash)}}const gC=function(n){return[n]};let mC=(()=>{class n{constructor(t){this.nfsService=t,this.nfsSquash=Object.keys(this.nfsService.nfsSquash),this.nfsAccessType=this.nfsService.nfsAccessType,this.icons=No.P}ngOnInit(){Ar().forEach(this.clients,t=>{this.addClient().patchValue(t)}),this.clientsFormArray=this.form.get("clients")}getNoAccessTypeDescr(){return this.form.getValue("access_type")?`${this.form.getValue("access_type")} ${"(inherited from global config)"}`:"-- Select the access type --"}getAccessTypeHelp(t){const o=this.nfsAccessType.find(c=>this.getValue(t,"access_type")===c.value);return Ar().isObjectLike(o)?o.help:""}getNoSquashDescr(){return this.form.getValue("squash")?`${this.form.getValue("squash")} (${"inherited from global config"})`:"-- Select what kind of user id squashing is performed --"}addClient(){this.clientsFormArray=this.form.get("clients");const t="(([0-9]{1,3})\\.([0-9]{1,3})\\.([0-9]{1,3}).([0-9]{1,3})([/](\\d|[1-2]\\d|3[0-2]))?)",c=new Us.d({addresses:new vn.NI("",{validators:[vn.kI.required,vn.kI.pattern(`${t}([ ,]{1,2}${t})*`)]}),access_type:new vn.NI(""),squash:new vn.NI("")});return this.clientsFormArray.push(c),c}removeClient(t){this.clientsFormArray=this.form.get("clients"),this.clientsFormArray.removeAt(t)}showError(t,o,c,g){return this.form.controls.clients.controls[t].showError(o,c,g)}getValue(t,o){return this.clientsFormArray=this.form.get("clients"),this.clientsFormArray.at(t).getValue(o)}trackByFn(t){return t}}return n.\u0275fac=function(t){return new(t||n)(e.Y36(Ty))},n.\u0275cmp=e.Xpm({type:n,selectors:[["cd-nfs-form-client"]],contentQueries:function(t,o,c){if(1&t&&e.Suo(c,Sy,7),2&t){let g;e.iGM(g=e.CRH())&&(o.squashHelperTpl=g.first)}},inputs:{form:"form",clients:"clients"},decls:15,vars:7,consts:function(){let s,t,o,c,g,C,D,P,j;return s="Clients",t="Add clients",o="Any client can access",c="Addresses",g="Access Type",C="Squash",D="This field is required.",P="Must contain one or more comma-separated values",j="For example:",[[1,"form-group","row"],[1,"cd-col-form-label"],s,[1,"cd-col-form-input",3,"formGroup"],["formDir","ngForm"],["class","no-border text-muted",4,"ngIf"],["formArrayName","clients"],[4,"ngFor","ngForOf","ngForTrackBy"],[1,"row"],[1,"col-12"],[1,"float-right"],["name","add_client",1,"btn","btn-light",3,"click"],[3,"ngClass"],t,[1,"no-border","text-muted"],[1,"form-text","text-muted"],o,[1,"card",3,"formGroup"],[1,"card-header"],["name","remove_client","ngbTooltip","Remove",1,"float-right","clickable",3,"click"],[1,"card-body"],["for","addresses",1,"cd-col-form-label","required"],c,[1,"cd-col-form-input"],["type","text","name","addresses","id","addresses","formControlName","addresses","placeholder","192.168.0.10, 192.168.1.0/8",1,"form-control"],[1,"invalid-feedback"],[4,"ngIf"],["for","access_type",1,"cd-col-form-label"],g,["name","access_type","id","access_type","formControlName","access_type",1,"form-control"],["value",""],[3,"value",4,"ngFor","ngForOf"],["class","form-text text-muted",4,"ngIf"],["for","squash",1,"cd-col-form-label"],C,[4,"ngTemplateOutlet"],["name","squash","id","squash","formControlName","squash",1,"form-control"],D,P,j,[3,"value"]]},template:function(t,o){1&t&&(e.TgZ(0,"div",0),e.TgZ(1,"label",1),e.SDv(2,2),e.qZA(),e.TgZ(3,"div",3,4),e.YNc(5,EE,3,0,"span",5),e.ynx(6,6),e.YNc(7,_C,35,12,"div",7),e.BQk(),e.TgZ(8,"div",8),e.TgZ(9,"div",9),e.TgZ(10,"div",10),e.TgZ(11,"button",11),e.NdJ("click",function(){return o.addClient()}),e._UZ(12,"i",12),e.ynx(13),e.SDv(14,13),e.BQk(),e.qZA(),e.qZA(),e.qZA(),e.qZA(),e.qZA(),e.qZA()),2&t&&(e.xp6(3),e.Q6J("formGroup",o.form),e.xp6(2),e.Q6J("ngIf",0===o.form.get("clients").value.length),e.xp6(2),e.Q6J("ngForOf",o.clientsFormArray.controls)("ngForTrackBy",o.trackByFn),e.xp6(5),e.Q6J("ngClass",e.VKq(5,gC,o.icons.add)))},directives:[$a.P,vn.JL,vn.sg,tl.V,_.O5,vn.CE,_.sg,ca.o,_.mk,lt._L,vn.Fj,Ha.b,vn.JJ,vn.u,vn.EJ,vn.YN,vn.Kr,_.tP],pipes:[bE.f],styles:[""]}),n})();const vO=["nfsClients"];function vC(n,s){1&n&&(e.TgZ(0,"option",52),e.SDv(1,53),e.qZA())}function yO(n,s){1&n&&(e.TgZ(0,"option",52),e.SDv(1,54),e.qZA())}function bO(n,s){1&n&&(e.TgZ(0,"option",52),e.SDv(1,55),e.qZA())}function EO(n,s){if(1&n&&(e.TgZ(0,"option",56),e._uU(1),e.qZA()),2&n){const t=s.$implicit;e.Q6J("value",t.cluster_id),e.xp6(1),e.Oqu(t.cluster_id)}}const TO=function(){return["create"]},SO=function(n){return{modal:n}},CO=function(n){return{outlets:n}},MO=function(n){return["/services",n]};function AO(n,s){1&n&&(e.TgZ(0,"span",57),e.tHW(1,58),e._UZ(2,"a",59),e.N_p(),e.qZA()),2&n&&(e.xp6(2),e.Q6J("routerLink",e.VKq(6,MO,e.VKq(4,CO,e.VKq(2,SO,e.DdM(1,TO))))))}function OO(n,s){1&n&&(e.TgZ(0,"option",52),e.SDv(1,60),e.qZA())}function wO(n,s){1&n&&(e.TgZ(0,"option",52),e.SDv(1,61),e.qZA())}function xO(n,s){1&n&&(e.TgZ(0,"option",52),e.SDv(1,62),e.qZA())}function DO(n,s){if(1&n&&(e.TgZ(0,"option",63),e._uU(1),e.qZA()),2&n){const t=s.$implicit;e.Q6J("value",t.value)("disabled",t.disabled),e.xp6(1),e.Oqu(t.descr)}}function RO(n,s){1&n&&(e.TgZ(0,"span",57),e.SDv(1,64),e.qZA())}function NO(n,s){if(1&n&&(e.TgZ(0,"span",57),e.SDv(1,65),e.qZA()),2&n){const t=e.oxw(2);e.xp6(1),e.pQV(t.fsalAvailabilityError),e.QtT(1)}}function yC(n,s){1&n&&(e.TgZ(0,"option",52),e.SDv(1,69),e.qZA())}function bC(n,s){1&n&&(e.TgZ(0,"option",52),e.SDv(1,70),e.qZA())}function EC(n,s){1&n&&(e.TgZ(0,"option",52),e.SDv(1,71),e.qZA())}function TC(n,s){if(1&n&&(e.TgZ(0,"option",56),e._uU(1),e.qZA()),2&n){const t=s.$implicit;e.Q6J("value",t.name),e.xp6(1),e.Oqu(t.name)}}function SC(n,s){1&n&&(e.TgZ(0,"span",57),e.SDv(1,72),e.qZA())}function CC(n,s){if(1&n){const t=e.EpF();e.TgZ(0,"div",8),e.TgZ(1,"label",66),e.SDv(2,67),e.qZA(),e.TgZ(3,"div",13),e.TgZ(4,"select",68),e.NdJ("change",function(){return e.CHM(t),e.oxw(2).pathChangeHandler()}),e.YNc(5,yC,2,0,"option",15),e.YNc(6,bC,2,0,"option",15),e.YNc(7,EC,2,0,"option",15),e.YNc(8,TC,2,2,"option",16),e.qZA(),e.YNc(9,SC,2,0,"span",17),e.qZA(),e.qZA()}if(2&n){e.oxw();const t=e.MAs(2),o=e.oxw();e.xp6(5),e.Q6J("ngIf",null===o.allFsNames),e.xp6(1),e.Q6J("ngIf",null!==o.allFsNames&&0===o.allFsNames.length),e.xp6(1),e.Q6J("ngIf",null!==o.allFsNames&&o.allFsNames.length>0),e.xp6(1),e.Q6J("ngForOf",o.allFsNames),e.xp6(1),e.Q6J("ngIf",o.nfsForm.showError("fs_name",t,"required"))}}function MC(n,s){1&n&&e._UZ(0,"input",79)}function AC(n,s){1&n&&(e.TgZ(0,"span",57),e.SDv(1,80),e.qZA())}const OC=function(n){return{required:n}};function SE(n,s){if(1&n&&(e.TgZ(0,"div",8),e.TgZ(1,"label",73),e.SDv(2,74),e.qZA(),e.TgZ(3,"div",13),e.TgZ(4,"div",26),e._UZ(5,"input",75),e.TgZ(6,"label",76),e.SDv(7,77),e.qZA(),e.qZA(),e._UZ(8,"br"),e.YNc(9,MC,1,0,"input",78),e.YNc(10,AC,2,0,"span",17),e.qZA(),e.qZA()),2&n){e.oxw();const t=e.MAs(2),o=e.oxw();e.xp6(1),e.Q6J("ngClass",e.VKq(3,OC,o.nfsForm.getValue("security_label"))),e.xp6(8),e.Q6J("ngIf",o.nfsForm.getValue("security_label")),e.xp6(1),e.Q6J("ngIf",o.nfsForm.showError("sec_label_xattr",t,"required"))}}function CE(n,s){1&n&&(e.TgZ(0,"span",57),e.SDv(1,85),e.qZA())}function Gm(n,s){1&n&&(e.TgZ(0,"span",57),e.SDv(1,86),e.qZA())}function PO(n,s){1&n&&(e.TgZ(0,"span",57),e.SDv(1,87),e.qZA())}function IO(n,s){if(1&n){const t=e.EpF();e.TgZ(0,"div",8),e.TgZ(1,"label",81),e.TgZ(2,"span",10),e.SDv(3,82),e.qZA(),e.TgZ(4,"cd-helper"),e.TgZ(5,"p"),e.SDv(6,83),e.qZA(),e.qZA(),e.qZA(),e.TgZ(7,"div",13),e.TgZ(8,"input",84),e.NdJ("selectItem",function(){return e.CHM(t),e.oxw(2).pathChangeHandler()})("blur",function(){return e.CHM(t),e.oxw(2).pathChangeHandler()}),e.qZA(),e.YNc(9,CE,2,0,"span",17),e.YNc(10,Gm,2,0,"span",17),e.YNc(11,PO,2,0,"span",17),e.qZA(),e.qZA()}if(2&n){e.oxw();const t=e.MAs(2),o=e.oxw();e.xp6(8),e.Q6J("ngbTypeahead",o.pathDataSource),e.xp6(1),e.Q6J("ngIf",o.nfsForm.showError("path",t,"required")),e.xp6(1),e.Q6J("ngIf",o.nfsForm.showError("path",t,"pattern")),e.xp6(1),e.Q6J("ngIf",o.nfsForm.showError("path",t,"pathNameNotAllowed"))}}function Iv(n,s){1&n&&(e.TgZ(0,"span",57),e.SDv(1,90),e.qZA())}function bR(n,s){1&n&&(e.TgZ(0,"span",57),e.tHW(1,91),e._UZ(2,"a",92),e.N_p(),e.qZA())}function ME(n,s){if(1&n&&(e.TgZ(0,"div",8),e.TgZ(1,"label",81),e.TgZ(2,"span",10),e.SDv(3,88),e.qZA(),e.qZA(),e.TgZ(4,"div",13),e._UZ(5,"input",89),e.YNc(6,Iv,2,0,"span",17),e.YNc(7,bR,3,0,"span",17),e.qZA(),e.qZA()),2&n){e.oxw();const t=e.MAs(2),o=e.oxw();e.xp6(5),e.Q6J("ngbTypeahead",o.bucketDataSource),e.xp6(1),e.Q6J("ngIf",o.nfsForm.showError("path",t,"required")),e.xp6(1),e.Q6J("ngIf",o.nfsForm.showError("path",t,"bucketNameNotAllowed"))}}function ER(n,s){1&n&&(e.TgZ(0,"span",57),e.SDv(1,93),e.qZA())}function wC(n,s){1&n&&(e.TgZ(0,"span",57),e.SDv(1,99),e.qZA())}function xC(n,s){1&n&&(e.TgZ(0,"span",57),e.SDv(1,100),e.qZA())}function TR(n,s){1&n&&(e.TgZ(0,"span",57),e.SDv(1,101),e.qZA())}function Za(n,s){if(1&n&&(e.TgZ(0,"div",8),e.TgZ(1,"label",94),e.TgZ(2,"span",10),e.SDv(3,95),e.qZA(),e.TgZ(4,"cd-helper"),e.TgZ(5,"p"),e.tHW(6,96),e._UZ(7,"strong"),e._UZ(8,"strong"),e.N_p(),e.qZA(),e.TgZ(9,"p"),e.SDv(10,97),e.qZA(),e.qZA(),e.qZA(),e.TgZ(11,"div",13),e._UZ(12,"input",98),e.YNc(13,wC,2,0,"span",17),e.YNc(14,xC,2,0,"span",17),e.YNc(15,TR,2,0,"span",17),e.qZA(),e.qZA()),2&n){e.oxw();const t=e.MAs(2),o=e.oxw();e.xp6(13),e.Q6J("ngIf",o.nfsForm.showError("pseudo",t,"required")),e.xp6(1),e.Q6J("ngIf",o.nfsForm.showError("pseudo",t,"pseudoAlreadyExists")),e.xp6(1),e.Q6J("ngIf",o.nfsForm.showError("pseudo",t,"pattern"))}}function LO(n,s){1&n&&(e.TgZ(0,"option",52),e.SDv(1,102),e.qZA())}function FO(n,s){1&n&&(e.TgZ(0,"option",52),e.SDv(1,103),e.qZA())}function kO(n,s){if(1&n&&(e.TgZ(0,"option",56),e._uU(1),e.qZA()),2&n){const t=s.$implicit;e.Q6J("value",t.value),e.xp6(1),e.Oqu(t.value)}}function Cy(n,s){if(1&n&&(e.TgZ(0,"span",104),e._uU(1),e.qZA()),2&n){const t=e.oxw(2);e.xp6(1),e.hij(" ",t.getAccessTypeHelp(t.nfsForm.getValue("access_type"))," ")}}function $O(n,s){1&n&&(e.TgZ(0,"span",105),e.tHW(1,106),e._UZ(2,"cd-doc",107),e.N_p(),e.qZA())}function My(n,s){1&n&&(e.TgZ(0,"span",57),e.SDv(1,108),e.qZA())}function Ay(n,s){1&n&&e.GkF(0)}function Ad(n,s){1&n&&(e.TgZ(0,"option",52),e.SDv(1,109),e.qZA())}function SR(n,s){1&n&&(e.TgZ(0,"option",52),e.SDv(1,110),e.qZA())}function DC(n,s){if(1&n&&(e.TgZ(0,"option",56),e._uU(1),e.qZA()),2&n){const t=s.$implicit;e.Q6J("value",t),e.xp6(1),e.Oqu(t)}}function AE(n,s){1&n&&(e.TgZ(0,"span",57),e.SDv(1,111),e.qZA())}function HO(n,s){1&n&&(e.TgZ(0,"span",57),e.SDv(1,112),e.qZA())}function RC(n,s){1&n&&(e.TgZ(0,"cd-helper"),e.TgZ(1,"ul",113),e.TgZ(2,"li"),e.TgZ(3,"span",114),e._uU(4,"no_root_squash: "),e.qZA(),e.TgZ(5,"span"),e.SDv(6,115),e.qZA(),e.qZA(),e.TgZ(7,"li"),e.TgZ(8,"span",114),e._uU(9,"root_id_squash: "),e.qZA(),e.TgZ(10,"span"),e.SDv(11,116),e.qZA(),e.qZA(),e.TgZ(12,"li"),e.TgZ(13,"span",114),e._uU(14,"root_squash: "),e.qZA(),e.TgZ(15,"span"),e.SDv(16,117),e.qZA(),e.qZA(),e.TgZ(17,"li"),e.TgZ(18,"span",114),e._uU(19,"all_squash: "),e.qZA(),e.TgZ(20,"span"),e.SDv(21,118),e.qZA(),e.qZA(),e.qZA(),e.qZA())}function NC(n,s){if(1&n){const t=e.EpF();e.TgZ(0,"div",1),e.TgZ(1,"form",2,3),e.TgZ(3,"div",4),e.TgZ(4,"div",5),e.SDv(5,6),e.ALo(6,"titlecase"),e.ALo(7,"upperFirst"),e.qZA(),e.TgZ(8,"div",7),e.TgZ(9,"div",8),e.TgZ(10,"label",9),e.TgZ(11,"span",10),e.SDv(12,11),e.qZA(),e.TgZ(13,"cd-helper"),e.TgZ(14,"p"),e.SDv(15,12),e.qZA(),e.qZA(),e.qZA(),e.TgZ(16,"div",13),e.TgZ(17,"select",14),e.YNc(18,vC,2,0,"option",15),e.YNc(19,yO,2,0,"option",15),e.YNc(20,bO,2,0,"option",15),e.YNc(21,EO,2,2,"option",16),e.qZA(),e.YNc(22,AO,3,8,"span",17),e.qZA(),e.qZA(),e.TgZ(23,"div",18),e.TgZ(24,"div",8),e.TgZ(25,"label",19),e.SDv(26,20),e.qZA(),e.TgZ(27,"div",13),e.TgZ(28,"select",21),e.NdJ("change",function(){return e.CHM(t),e.oxw().fsalChangeHandler()}),e.YNc(29,OO,2,0,"option",15),e.YNc(30,wO,2,0,"option",15),e.YNc(31,xO,2,0,"option",15),e.YNc(32,DO,2,3,"option",22),e.qZA(),e.YNc(33,RO,2,0,"span",17),e.YNc(34,NO,2,1,"span",17),e.qZA(),e.qZA(),e.YNc(35,CC,10,5,"div",23),e.qZA(),e.YNc(36,SE,11,5,"div",23),e.YNc(37,IO,12,4,"div",23),e.YNc(38,ME,8,3,"div",23),e.TgZ(39,"div",8),e.TgZ(40,"label",24),e.SDv(41,25),e.qZA(),e.TgZ(42,"div",13),e.TgZ(43,"div",26),e._UZ(44,"input",27),e.TgZ(45,"label",28),e.SDv(46,29),e.qZA(),e.qZA(),e.YNc(47,ER,2,0,"span",17),e.qZA(),e.qZA(),e.YNc(48,Za,16,3,"div",23),e.TgZ(49,"div",8),e.TgZ(50,"label",30),e.SDv(51,31),e.qZA(),e.TgZ(52,"div",13),e.TgZ(53,"select",32),e.NdJ("change",function(){return e.CHM(t),e.oxw().accessTypeChangeHandler()}),e.YNc(54,LO,2,0,"option",15),e.YNc(55,FO,2,0,"option",15),e.YNc(56,kO,2,2,"option",16),e.qZA(),e.YNc(57,Cy,2,1,"span",33),e.YNc(58,$O,3,0,"span",34),e.YNc(59,My,2,0,"span",17),e.qZA(),e.qZA(),e.TgZ(60,"div",8),e.TgZ(61,"label",35),e.TgZ(62,"span"),e.SDv(63,36),e.qZA(),e.YNc(64,Ay,1,0,"ng-container",37),e.qZA(),e.TgZ(65,"div",13),e.TgZ(66,"select",38),e.YNc(67,Ad,2,0,"option",15),e.YNc(68,SR,2,0,"option",15),e.YNc(69,DC,2,2,"option",16),e.qZA(),e.YNc(70,AE,2,0,"span",17),e.qZA(),e.qZA(),e.TgZ(71,"div",8),e.TgZ(72,"label",39),e.SDv(73,40),e.qZA(),e.TgZ(74,"div",13),e.TgZ(75,"div",26),e._UZ(76,"input",41),e.TgZ(77,"label",42),e.SDv(78,43),e.qZA(),e.qZA(),e.TgZ(79,"div",26),e._UZ(80,"input",44),e.TgZ(81,"label",45),e.SDv(82,46),e.qZA(),e.qZA(),e.YNc(83,HO,2,0,"span",17),e._UZ(84,"hr"),e.qZA(),e.qZA(),e.TgZ(85,"cd-nfs-form-client",47,48),e.YNc(87,RC,22,0,"ng-template",null,49,e.W1O),e.qZA(),e.qZA(),e.TgZ(89,"div",50),e.TgZ(90,"cd-form-button-panel",51),e.NdJ("submitActionEvent",function(){return e.CHM(t),e.oxw().submitAction()}),e.ALo(91,"titlecase"),e.ALo(92,"upperFirst"),e.qZA(),e.qZA(),e.qZA(),e.qZA(),e.qZA()}if(2&n){const t=e.MAs(2),o=e.MAs(88),c=e.oxw();e.xp6(1),e.Q6J("formGroup",c.nfsForm),e.xp6(6),e.pQV(e.lcZ(6,36,c.action))(e.lcZ(7,38,c.resource)),e.QtT(5),e.xp6(11),e.Q6J("ngIf",null===c.allClusters),e.xp6(1),e.Q6J("ngIf",null!==c.allClusters&&0===c.allClusters.length),e.xp6(1),e.Q6J("ngIf",null!==c.allClusters&&c.allClusters.length>0),e.xp6(1),e.Q6J("ngForOf",c.allClusters),e.xp6(1),e.Q6J("ngIf",c.nfsForm.showError("cluster_id",t,"required")||0===(null==c.allClusters?null:c.allClusters.length)),e.xp6(7),e.Q6J("ngIf",null===c.allFsals),e.xp6(1),e.Q6J("ngIf",null!==c.allFsals&&0===c.allFsals.length),e.xp6(1),e.Q6J("ngIf",null!==c.allFsals&&c.allFsals.length>0),e.xp6(1),e.Q6J("ngForOf",c.allFsals),e.xp6(1),e.Q6J("ngIf",c.nfsForm.showError("name",t,"required")),e.xp6(1),e.Q6J("ngIf",c.fsalAvailabilityError),e.xp6(1),e.Q6J("ngIf","CEPH"===c.nfsForm.getValue("name")),e.xp6(1),e.Q6J("ngIf","CEPH"===c.nfsForm.getValue("name")),e.xp6(1),e.Q6J("ngIf","CEPH"===c.nfsForm.getValue("name")),e.xp6(1),e.Q6J("ngIf","RGW"===c.nfsForm.getValue("name")),e.xp6(9),e.Q6J("ngIf",c.nfsForm.showError("protocolNfsv4",t,"required")),e.xp6(1),e.Q6J("ngIf",c.nfsForm.getValue("protocolNfsv4")),e.xp6(6),e.Q6J("ngIf",null===c.nfsAccessType),e.xp6(1),e.Q6J("ngIf",null!==c.nfsAccessType&&0===c.nfsAccessType.length),e.xp6(1),e.Q6J("ngForOf",c.nfsAccessType),e.xp6(1),e.Q6J("ngIf",c.nfsForm.getValue("access_type")),e.xp6(1),e.Q6J("ngIf","RW"===c.nfsForm.getValue("access_type")&&"RGW"===c.nfsForm.getValue("name")),e.xp6(1),e.Q6J("ngIf",c.nfsForm.showError("access_type",t,"required")),e.xp6(5),e.Q6J("ngTemplateOutlet",o),e.xp6(3),e.Q6J("ngIf",null===c.nfsSquash),e.xp6(1),e.Q6J("ngIf",null!==c.nfsSquash&&0===c.nfsSquash.length),e.xp6(1),e.Q6J("ngForOf",c.nfsSquash),e.xp6(1),e.Q6J("ngIf",c.nfsForm.showError("squash",t,"required")),e.xp6(13),e.Q6J("ngIf",c.nfsForm.showError("transportUDP",t,"required")||c.nfsForm.showError("transportTCP",t,"required")),e.xp6(2),e.Q6J("form",c.nfsForm)("clients",c.clients),e.xp6(5),e.Q6J("form",c.nfsForm)("submitText",e.lcZ(91,40,c.action)+" "+e.lcZ(92,42,c.resource))}}let OE=(()=>{class n extends Oa.E{constructor(t,o,c,g,C,D,P,j,W,re){super(),this.authStorageService=t,this.nfsService=o,this.route=c,this.router=g,this.rgwBucketService=C,this.rgwSiteService=D,this.formBuilder=P,this.taskWrapper=j,this.cdRef=W,this.actionLabels=re,this.clients=[],this.isEdit=!1,this.cluster_id=null,this.export_id=null,this.allClusters=null,this.icons=No.P,this.allFsals=[],this.allFsNames=null,this.fsalAvailabilityError=null,this.defaultAccessType={RGW:"RO"},this.nfsAccessType=this.nfsService.nfsAccessType,this.nfsSquash=Object.keys(this.nfsService.nfsSquash),this.pathDataSource=ie=>ie.pipe(Gf(200),(0,Df.x)(),(0,Uu.zg)(ge=>this.getPathTypeahead(ge)),(0,su.U)(ge=>ge)),this.bucketDataSource=ie=>ie.pipe(Gf(200),(0,Df.x)(),(0,Uu.zg)(ge=>this.getBucketTypeahead(ge))),this.permission=this.authStorageService.getPermissions().pool,this.resource="NFS export",this.createForm()}ngOnInit(){const t=[this.nfsService.listClusters(),this.nfsService.fsals(),this.nfsService.filesystems()];this.router.url.startsWith("/nfs/edit")&&(this.isEdit=!0),this.isEdit?(this.action=this.actionLabels.EDIT,this.route.params.subscribe(o=>{this.cluster_id=decodeURIComponent(o.cluster_id),this.export_id=decodeURIComponent(o.export_id),t.push(this.nfsService.get(this.cluster_id,this.export_id)),this.getData(t)}),this.nfsForm.get("cluster_id").disable()):(this.action=this.actionLabels.CREATE,this.getData(t))}getData(t){(0,Oc.D)(t).subscribe(o=>{this.resolveClusters(o[0]),this.resolveFsals(o[1]),this.resolveFilesystems(o[2]),o[3]&&this.resolveModel(o[3]),this.loadingReady()})}createForm(){this.nfsForm=new Us.d({cluster_id:new vn.NI("",{validators:[vn.kI.required]}),fsal:new Us.d({name:new vn.NI("",{validators:[vn.kI.required]}),fs_name:new vn.NI("",{validators:[ds.h.requiredIf({name:"CEPH"})]})}),path:new vn.NI("/"),protocolNfsv4:new vn.NI(!0),pseudo:new vn.NI("",{validators:[ds.h.requiredIf({protocolNfsv4:!0}),vn.kI.pattern("^/[^><|&()]*$")]}),access_type:new vn.NI("RW"),squash:new vn.NI(this.nfsSquash[0]),transportUDP:new vn.NI(!0,{validators:[ds.h.requiredIf({transportTCP:!1},t=>!t)]}),transportTCP:new vn.NI(!0,{validators:[ds.h.requiredIf({transportUDP:!1},t=>!t)]}),clients:this.formBuilder.array([]),security_label:new vn.NI(!1),sec_label_xattr:new vn.NI("security.selinux",ds.h.requiredIf({security_label:!0,"fsal.name":"CEPH"}))})}resolveModel(t){"CEPH"===t.fsal.name&&(t.sec_label_xattr=t.fsal.sec_label_xattr),t.protocolNfsv4=-1!==t.protocols.indexOf(4),delete t.protocols,t.transportTCP=-1!==t.transports.indexOf("TCP"),t.transportUDP=-1!==t.transports.indexOf("UDP"),delete t.transports,Object.entries(this.nfsService.nfsSquash).forEach(([o,c])=>{c.includes(t.squash)&&(t.squash=o)}),t.clients.forEach(o=>{let c="";o.addresses.forEach(g=>{c+=g+", "}),c.length>=2&&(c=c.substring(0,c.length-2)),o.addresses=c}),this.nfsForm.patchValue(t),this.setPathValidation(),this.clients=t.clients}resolveClusters(t){this.allClusters=[];for(const o of t)this.allClusters.push({cluster_id:o});!this.isEdit&&this.allClusters.length>0&&this.nfsForm.get("cluster_id").setValue(this.allClusters[0].cluster_id)}resolveFsals(t){t.forEach(o=>{const c=this.nfsService.nfsFsal.find(g=>o===g.value);Ar().isObjectLike(c)&&this.allFsals.push(c)}),!this.isEdit&&this.allFsals.length>0&&this.nfsForm.patchValue({fsal:{name:this.allFsals[0].value}})}resolveFilesystems(t){this.allFsNames=t,!this.isEdit&&t.length>0&&this.nfsForm.patchValue({fsal:{fs_name:t[0].name}})}fsalChangeHandler(){this.setPathValidation();const t=this.nfsForm.getValue("name");("RGW"===t?this.rgwSiteService.get("realms").pipe((0,Uu.zg)(c=>0===c.length?(0,zc.of)(!0):this.rgwSiteService.isDefaultRealm().pipe((0,Uu.zg)(g=>{if(!g)throw new Error("Selected realm is not the default.");return(0,zc.of)(!0)})))):this.nfsService.filesystems()).subscribe({next:()=>{this.setFsalAvailability(t,!0),this.isEdit||this.nfsForm.patchValue({path:"RGW"===t?"":"/",pseudo:this.generatePseudo(),access_type:this.updateAccessType()}),this.cdRef.detectChanges()},error:c=>{this.setFsalAvailability(t,!1,c),this.nfsForm.get("name").setValue("")}})}setFsalAvailability(t,o,c=""){this.allFsals=this.allFsals.map(g=>(g.value===t&&(g.disabled=!o,this.fsalAvailabilityError=g.disabled?"" + g.descr + " backend is not available. " + c + "":null),g))}accessTypeChangeHandler(){const t=this.nfsForm.getValue("name"),o=this.nfsForm.getValue("access_type");this.defaultAccessType[t]=o}setPathValidation(){const t=this.nfsForm.get("path");t.setValidators([vn.kI.required]),"RGW"===this.nfsForm.getValue("name")?t.setAsyncValidators([ds.h.bucketExistence(!0,this.rgwBucketService)]):t.setAsyncValidators([this.pathExistence(!0)]),this.isEdit&&t.markAsDirty()}getAccessTypeHelp(t){const o=this.nfsAccessType.find(c=>{if(t===c.value)return c});return Ar().isObjectLike(o)?o.help:""}getId(){return Ar().isString(this.nfsForm.getValue("cluster_id"))&&Ar().isString(this.nfsForm.getValue("path"))?this.nfsForm.getValue("cluster_id")+":"+this.nfsForm.getValue("path"):""}getPathTypeahead(t){if(!Ar().isString(t)||"/"===t)return(0,zc.of)([]);const o=this.nfsForm.getValue("fsal").fs_name;return this.nfsService.lsDir(o,t).pipe((0,su.U)(c=>c.paths.filter(g=>g.toLowerCase().includes(t)).slice(0,15)),(0,Pv.K)(()=>(0,zc.of)(["Error while retrieving paths."])))}pathChangeHandler(){this.isEdit||this.nfsForm.patchValue({pseudo:this.generatePseudo()})}getBucketTypeahead(t){return Ar().isString(t)&&"/"!==t&&""!==t?this.rgwBucketService.list().pipe((0,su.U)(o=>o.filter(c=>c.toLowerCase().includes(t)).slice(0,15)),(0,Pv.K)(()=>(0,zc.of)(["Error while retrieving bucket names."]))):(0,zc.of)([])}generatePseudo(){let t=this.nfsForm.getValue("pseudo");return this.nfsForm.get("pseudo")&&!this.nfsForm.get("pseudo").dirty&&(t=void 0,"CEPH"===this.nfsForm.getValue("fsal")&&(t="/cephfs",Ar().isString(this.nfsForm.getValue("path"))&&(t+=this.nfsForm.getValue("path")))),t}updateAccessType(){const t=this.nfsForm.getValue("name");let o=this.defaultAccessType[t];return o||(o="RW"),o}submitAction(){let t;const o=this.buildRequest();t=this.taskWrapper.wrapTaskAroundCall(this.isEdit?{task:new cl.R("nfs/edit",{cluster_id:this.cluster_id,export_id:Ar().parseInt(this.export_id)}),call:this.nfsService.update(this.cluster_id,Ar().parseInt(this.export_id),o)}:{task:new cl.R("nfs/create",{path:o.path,fsal:o.fsal,cluster_id:o.cluster_id}),call:this.nfsService.create(o)}),t.subscribe({error:c=>this.setFormErrors(c),complete:()=>this.router.navigate(["/nfs"])})}setFormErrors(t){t.error.detail&&t.error.detail.toString().includes(`Pseudo ${this.nfsForm.getValue("pseudo")} is already in use`)&&this.nfsForm.get("pseudo").setErrors({pseudoAlreadyExists:!0}),this.nfsForm.setErrors({cdSubmitButton:!0})}buildRequest(){const t=Ar().cloneDeep(this.nfsForm.value);return this.isEdit&&(t.export_id=Ar().parseInt(this.export_id)),"RGW"===t.fsal.name&&delete t.fsal.fs_name,t.protocols=[],t.protocolNfsv4?t.protocols.push(4):t.pseudo=null,delete t.protocolNfsv4,t.transports=[],t.transportTCP&&t.transports.push("TCP"),delete t.transportTCP,t.transportUDP&&t.transports.push("UDP"),delete t.transportUDP,t.clients.forEach(o=>{o.addresses=Ar().isString(o.addresses)?Ar()(o.addresses).split(/[ ,]+/).uniq().filter(c=>""!==c).value():[],o.squash||(o.squash=t.squash),o.access_type||(o.access_type=t.access_type)}),t.fsal.sec_label_xattr=!1===t.security_label||"RGW"===t.fsal.name?null:t.sec_label_xattr,delete t.sec_label_xattr,t}pathExistence(t){return o=>{if(o.pristine||!o.value)return(0,zc.of)({required:!0});const c=this.nfsForm.getValue("fsal").fs_name;return this.nfsService.lsDir(c,o.value).pipe((0,su.U)(g=>g.paths.includes(o.value)===t?null:{pathNameNotAllowed:!0}),(0,Pv.K)(()=>(0,zc.of)({pathNameNotAllowed:!0})))}}}return n.\u0275fac=function(t){return new(t||n)(e.Y36(_t.j),e.Y36(Ty),e.Y36(Yo.gz),e.Y36(Yo.F0),e.Y36(Ey.o),e.Y36(mO.I),e.Y36(id.O),e.Y36(Ll.P),e.Y36(e.sBO),e.Y36(ki.p4))},n.\u0275cmp=e.Xpm({type:n,selectors:[["cd-nfs-form"]],viewQuery:function(t,o){if(1&t&&e.Gf(vO,7),2&t){let c;e.iGM(c=e.CRH())&&(o.nfsClients=c.first)}},features:[e.qOj],decls:1,vars:1,consts:function(){let s,t,o,c,g,C,D,P,j,W,re,ie,ge,_e,Le,Re,ke,xe,U,pt,ht,wt,It,dn,Lt,Dn,Mn,$r,ur,Pr,xr,fn,Nn,$n,Qn,Tn,Yr,ji,ii,Ui,Jr,An,hn,qr,Ri,qi,Zo,bo,Ys,Ws,wi,lo,go,Ge,St;return s="" + "\ufffd0\ufffd" + " " + "\ufffd1\ufffd" + "",t="Cluster",o="This is the ID of an NFS Service.",c="Storage Backend",g="NFS Protocol",C="NFSv4",D="Access Type",P="Squash",j="Transport Protocol",W="UDP",re="TCP",ie="Loading...",ge="-- No cluster available --",_e="-- Select the cluster --",Le="This field is required. To create a new NFS cluster, " + "\ufffd#2\ufffd" + "add a new NFS Service" + "\ufffd/#2\ufffd" + ".",Re="Loading...",ke="-- No data pools available --",xe="-- Select the storage backend --",U="This field is required.",pt="" + "\ufffd0\ufffd" + "",ht="Volume",wt="Loading...",It="-- No CephFS filesystem available --",dn="-- Select the CephFS filesystem --",Lt="This field is required.",Dn="Security Label",Mn="Enable security label",$r="This field is required.",ur="CephFS Path",Pr="A path in a CephFS file system.",xr="This field is required.",fn="Path need to start with a '/' and can be followed by a word",Nn="The path does not exist in the selected volume.",$n="Bucket",Qn="This field is required.",Tn="The bucket does not exist or is not in the default realm (if multiple realms are configured). To continue, " + "\ufffd#2\ufffd" + "create a new bucket" + "\ufffd/#2\ufffd" + ".",Yr="This field is required.",ji="Pseudo",ii="The position that this " + "[\ufffd#7\ufffd|\ufffd#8\ufffd]" + "NFS v4" + "[\ufffd/#7\ufffd|\ufffd/#8\ufffd]" + " export occupies in the " + "[\ufffd#7\ufffd|\ufffd#8\ufffd]" + "Pseudo FS" + "[\ufffd/#7\ufffd|\ufffd/#8\ufffd]" + " (it must be unique).",ii=e.Zx4(ii),Ui="By using different Pseudo options, the same Path may be exported multiple times.",Jr="This field is required.",An="The pseudo is already in use by another export.",hn="Pseudo needs to start with a '/' and can't contain any of the following: >, <, |, &, ( or ).",qr="Loading...",Ri="-- No access type available --",qi="The Object Gateway NFS backend has a number of limitations which will seriously affect applications writing to the share. Please consult the " + "\ufffd#2\ufffd" + "" + "\ufffd/#2\ufffd" + " for details before enabling write access.",Zo="This field is required.",bo="Loading...",Ys="-- No squash available --",Ws="This field is required.",wi="This field is required.",lo="No user id squashing is performed.",go="uid 0 and gid 0 are squashed to the Anonymous_Uid and Anonymous_Gid gid 0 in alt_groups lists is also squashed.",Ge="uid 0 and gid of any value are squashed to the Anonymous_Uid and Anonymous_Gid alt_groups lists is discarded.",St="All users are squashed.",[["class","cd-col-form",4,"cdFormLoading"],[1,"cd-col-form"],["name","nfsForm","novalidate","",3,"formGroup"],["formDir","ngForm"],[1,"card"],[1,"card-header"],s,[1,"card-body"],[1,"form-group","row"],["for","cluster_id",1,"cd-col-form-label"],[1,"required"],t,o,[1,"cd-col-form-input"],["formControlName","cluster_id","name","cluster_id","id","cluster_id",1,"form-control"],["value","",4,"ngIf"],[3,"value",4,"ngFor","ngForOf"],["class","invalid-feedback",4,"ngIf"],["formGroupName","fsal"],["for","name",1,"cd-col-form-label","required"],c,["formControlName","name","name","name","id","name",1,"form-control",3,"change"],[3,"value","disabled",4,"ngFor","ngForOf"],["class","form-group row",4,"ngIf"],["for","protocols",1,"cd-col-form-label","required"],g,[1,"custom-control","custom-checkbox"],["type","checkbox","formControlName","protocolNfsv4","name","protocolNfsv4","id","protocolNfsv4","disabled","",1,"custom-control-input"],["for","protocolNfsv4",1,"custom-control-label"],C,["for","access_type",1,"cd-col-form-label","required"],D,["formControlName","access_type","name","access_type","id","access_type",1,"form-control",3,"change"],["class","form-text text-muted",4,"ngIf"],["class","form-text text-warning",4,"ngIf"],["for","squash",1,"cd-col-form-label"],P,[4,"ngTemplateOutlet"],["name","squash","formControlName","squash","id","squash",1,"form-control"],["for","transports",1,"cd-col-form-label","required"],j,["type","checkbox","formControlName","transportUDP","name","transportUDP","id","transportUDP",1,"custom-control-input"],["for","transportUDP",1,"custom-control-label"],W,["type","checkbox","formControlName","transportTCP","name","transportTCP","id","transportTCP",1,"custom-control-input"],["for","transportTCP",1,"custom-control-label"],re,[3,"form","clients"],["nfsClients",""],["squashHelper",""],[1,"card-footer"],["wrappingClass","text-right",3,"form","submitText","submitActionEvent"],["value",""],ie,ge,_e,[3,"value"],[1,"invalid-feedback"],Le,[1,"btn-link",3,"routerLink"],Re,ke,xe,[3,"value","disabled"],U,pt,["for","fs_name",1,"cd-col-form-label","required"],ht,["formControlName","fs_name","name","fs_name","id","fs_name",1,"form-control",3,"change"],wt,It,dn,Lt,["for","security_label",1,"cd-col-form-label",3,"ngClass"],Dn,["type","checkbox","formControlName","security_label","name","security_label","id","security_label",1,"custom-control-input"],["for","security_label",1,"custom-control-label"],Mn,["type","text","class","form-control","name","sec_label_xattr","id","sec_label_xattr","formControlName","sec_label_xattr",4,"ngIf"],["type","text","name","sec_label_xattr","id","sec_label_xattr","formControlName","sec_label_xattr",1,"form-control"],$r,["for","path",1,"cd-col-form-label"],ur,Pr,["type","text","name","path","id","path","data-testid","fs_path","formControlName","path",1,"form-control",3,"ngbTypeahead","selectItem","blur"],xr,fn,Nn,$n,["type","text","name","path","id","path","data-testid","rgw_path","formControlName","path",1,"form-control",3,"ngbTypeahead"],Qn,Tn,["routerLink","/rgw/bucket/create",1,"btn-link"],Yr,["for","pseudo",1,"cd-col-form-label"],ji,ii,Ui,["type","text","name","pseudo","id","pseudo","formControlName","pseudo",1,"form-control"],Jr,An,hn,qr,Ri,[1,"form-text","text-muted"],[1,"form-text","text-warning"],qi,["section","rgw-nfs"],Zo,bo,Ys,Ws,wi,[1,"squash-helper"],[1,"squash-helper-item-value"],lo,go,Ge,St]},template:function(t,o){1&t&&e.YNc(0,NC,93,44,"div",0),2&t&&e.Q6J("cdFormLoading",o.loading)},directives:[wl.y,vn._Y,vn.JL,vn.sg,tl.V,$a.P,E.S,ca.o,vn.EJ,Ha.b,vn.JJ,vn.u,_.O5,_.sg,vn.x0,vn.Wl,_.tP,mC,nl.p,vn.YN,vn.Kr,Yo.yS,_.mk,vn.Fj,lt.dR,ol.K],pipes:[_.rS,K.m],styles:[".cd-mb[_ngcontent-%COMP%]{margin-bottom:10px}.squash-helper[_ngcontent-%COMP%]{padding-left:1rem}.squash-helper-item-value[_ngcontent-%COMP%]{font-weight:bold}"]}),n})();var wE=i(38047);function UO(n,s){if(1&n&&e._UZ(0,"cd-table-key-value",10),2&n){const t=e.oxw(2);e.Q6J("data",t.data)}}function BO(n,s){if(1&n&&e._UZ(0,"cd-table",11,12),2&n){const t=e.oxw(2);e.Q6J("data",t.clients)("columns",t.clientsColumns)}}function YO(n,s){if(1&n&&(e.ynx(0),e.TgZ(1,"ul",1,2),e.TgZ(3,"li",3),e.TgZ(4,"a",4),e.SDv(5,5),e.qZA(),e.YNc(6,UO,1,1,"ng-template",6),e.qZA(),e.TgZ(7,"li",7),e.TgZ(8,"a",4),e.SDv(9,8),e.qZA(),e.YNc(10,BO,2,2,"ng-template",6),e.qZA(),e.qZA(),e._UZ(11,"div",9),e.BQk()),2&n){const t=e.MAs(2),o=e.oxw();e.xp6(9),e.pQV(o.clients.length),e.QtT(9),e.xp6(2),e.Q6J("ngbNavOutlet",t)}}let U1=(()=>{class n{constructor(){this.clients=[],this.clientsColumns=[{name:"Addresses",prop:"addresses",flexGrow:2},{name:"Access Type",prop:"access_type",flexGrow:1},{name:"Squash",prop:"squash",flexGrow:1}]}ngOnChanges(){this.selection&&(this.selectedItem=this.selection,this.clients=this.selectedItem.clients,this.data={},this.data["Cluster"]=this.selectedItem.cluster_id,this.data["NFS Protocol"]=this.selectedItem.protocols.map(t=>"NFSv"+t),this.data["Pseudo"]=this.selectedItem.pseudo,this.data["Access Type"]=this.selectedItem.access_type,this.data["Squash"]=this.selectedItem.squash,this.data["Transport"]=this.selectedItem.transports,this.data["Path"]=this.selectedItem.path,"CEPH"===this.selectedItem.fsal.name?(this.data["Storage Backend"]="CephFS",this.data["CephFS User"]=this.selectedItem.fsal.user_id,this.data["CephFS Filesystem"]=this.selectedItem.fsal.fs_name,this.data["Security Label"]=this.selectedItem.fsal.sec_label_xattr):(this.data["Storage Backend"]="Object Gateway",this.data["Object Gateway User"]=this.selectedItem.fsal.user_id))}}return n.\u0275fac=function(t){return new(t||n)},n.\u0275cmp=e.Xpm({type:n,selectors:[["cd-nfs-details"]],inputs:{selection:"selection"},features:[e.TTD],decls:1,vars:1,consts:function(){let s,t;return s="Details",t="Clients (" + "\ufffd0\ufffd" + ")",[[4,"ngIf"],["ngbNav","","cdStatefulTab","nfs-details",1,"nav-tabs"],["nav","ngbNav"],["ngbNavItem","details"],["ngbNavLink",""],s,["ngbNavContent",""],["ngbNavItem","clients"],t,[3,"ngbNavOutlet"],[3,"data"],["columnMode","flex","identifier","addresses","forceIdentifier","true","selectionType","",3,"data","columns"],["table",""]]},template:function(t,o){1&t&&e.YNc(0,YO,12,2,"ng-container",0),2&t&&e.Q6J("ngIf",o.selection)},directives:[_.O5,lt.Pz,un.m,lt.nv,lt.Vx,lt.uN,lt.tO,Vr.b,Hs.a],styles:[""]}),n})();const ZO=["nfsState"],jO=["nfsFsal"],GO=["table"];function Oy(n,s){1&n&&(e.ynx(0),e.SDv(1,7),e.BQk())}function PC(n,s){1&n&&(e.ynx(0),e.SDv(1,8),e.BQk())}function IC(n,s){if(1&n&&(e.YNc(0,Oy,2,0,"ng-container",6),e.YNc(1,PC,2,0,"ng-container",6)),2&n){const t=s.value;e.Q6J("ngIf","CEPH"===t.name),e.xp6(1),e.Q6J("ngIf","RGW"===t.name)}}let LC=(()=>{class n extends Gl.o{constructor(t,o,c,g,C,D){super(),this.authStorageService=t,this.modalService=o,this.nfsService=c,this.taskListService=g,this.taskWrapper=C,this.actionLabels=D,this.selection=new hl.r,this.isDefaultCluster=!1,this.builders={"nfs/create":ie=>({path:ie.path,cluster_id:ie.cluster_id,fsal:ie.fsal})},this.permission=this.authStorageService.getPermissions().nfs;const P=()=>this.selection.first()&&`${encodeURI(this.selection.first().cluster_id)}/${encodeURI(this.selection.first().export_id)}`;this.tableActions=[{permission:"create",icon:No.P.add,routerLink:()=>"/nfs/create",canBePrimary:ie=>!ie.hasSingleSelection,name:this.actionLabels.CREATE},{permission:"update",icon:No.P.edit,routerLink:()=>`/nfs/edit/${P()}`,name:this.actionLabels.EDIT},{permission:"delete",icon:No.P.destroy,click:()=>this.deleteNfsModal(),name:this.actionLabels.DELETE}]}ngOnInit(){this.columns=[{name:"Path",prop:"path",flexGrow:2,cellTransformation:Ja.e.executing},{name:"Pseudo",prop:"pseudo",flexGrow:2},{name:"Cluster",prop:"cluster_id",flexGrow:2},{name:"Storage Backend",prop:"fsal",flexGrow:2,cellTemplate:this.nfsFsal},{name:"Access Type",prop:"access_type",flexGrow:2}],this.taskListService.init(()=>this.nfsService.list(),t=>this.prepareResponse(t),t=>this.exports=t,()=>this.onFetchError(),this.taskFilter,this.itemFilter,this.builders)}ngOnDestroy(){this.summaryDataSubscription&&this.summaryDataSubscription.unsubscribe()}prepareResponse(t){let o=[];return t.forEach(c=>{c.id=`${c.cluster_id}:${c.export_id}`,c.state="LOADING",o=o.concat(c)}),o}onFetchError(){this.table.reset(),this.viewCacheStatus={status:ot.T.ValueException}}itemFilter(t,o){return t.cluster_id===o.metadata.cluster_id&&t.export_id===o.metadata.export_id}taskFilter(t){return["nfs/create","nfs/delete","nfs/edit"].includes(t.name)}updateSelection(t){this.selection=t}deleteNfsModal(){const t=this.selection.first().cluster_id,o=this.selection.first().export_id;this.modalRef=this.modalService.show(zl.M,{itemDescription:"NFS export",itemNames:[`${t}:${o}`],submitActionObservable:()=>this.taskWrapper.wrapTaskAroundCall({task:new cl.R("nfs/delete",{cluster_id:t,export_id:o}),call:this.nfsService.delete(t,o)})})}}return n.\u0275fac=function(t){return new(t||n)(e.Y36(_t.j),e.Y36(Ul.Z),e.Y36(Ty),e.Y36(wE.j),e.Y36(Ll.P),e.Y36(ki.p4))},n.\u0275cmp=e.Xpm({type:n,selectors:[["cd-nfs-list"]],viewQuery:function(t,o){if(1&t&&(e.Gf(ZO,5),e.Gf(jO,7),e.Gf(GO,7)),2&t){let c;e.iGM(c=e.CRH())&&(o.nfsState=c.first),e.iGM(c=e.CRH())&&(o.nfsFsal=c.first),e.iGM(c=e.CRH())&&(o.table=c.first)}},features:[e._Bn([wE.j]),e.qOj],decls:7,vars:7,consts:function(){let s,t;return s="CephFS",t="Object Gateway",[["columnMode","flex","identifier","id","forceIdentifier","true","selectionType","single",3,"data","columns","hasDetails","setExpandedRow","updateSelection"],["table",""],[1,"table-actions","btn-toolbar"],[1,"btn-group",3,"permission","selection","tableActions"],["cdTableDetail","",3,"selection"],["nfsFsal",""],[4,"ngIf"],s,t]},template:function(t,o){1&t&&(e.TgZ(0,"cd-table",0,1),e.NdJ("setExpandedRow",function(g){return o.setExpandedRow(g)})("updateSelection",function(g){return o.updateSelection(g)}),e.TgZ(2,"div",2),e._UZ(3,"cd-table-actions",3),e.qZA(),e._UZ(4,"cd-nfs-details",4),e.qZA(),e.YNc(5,IC,2,2,"ng-template",null,5,e.W1O)),2&t&&(e.Q6J("data",o.exports)("columns",o.columns)("hasDetails",!0),e.xp6(3),e.Q6J("permission",o.permission)("selection",o.selection)("tableActions",o.tableActions),e.xp6(1),e.Q6J("selection",o.expandedRow))},directives:[Hs.a,Xs.K,U1,_.O5],styles:[""]}),n})(),VO=(()=>{class n{constructor(t){this.route=t,this.route.queryParams.subscribe(o=>{this.fromLink=o.fromLink||n.defaultFromLink}),this.route.params.subscribe(o=>{this.serviceId=decodeURIComponent(o.id),this.serviceType=o.type})}}return n.defaultFromLink="/hosts",n.\u0275fac=function(t){return new(t||n)(e.Y36(Yo.gz))},n.\u0275cmp=e.Xpm({type:n,selectors:[["cd-performance-counter"]],decls:3,vars:4,consts:[[3,"serviceType","serviceId"]],template:function(t,o){1&t&&(e.TgZ(0,"legend"),e._uU(1),e.qZA(),e._UZ(2,"cd-table-performance-counter",0)),2&t&&(e.xp6(1),e.AsE("",o.serviceType,".",o.serviceId,""),e.xp6(1),e.Q6J("serviceType",o.serviceType)("serviceId",o.serviceId))},directives:[cy.p],styles:[""]}),n})();var Vm=i(39219),Lv=i(33888),xE=i(32057);function zO(n,s){1&n&&(e.TgZ(0,"span",30),e.SDv(1,31),e.qZA())}function WO(n,s){1&n&&(e.TgZ(0,"span",30),e.SDv(1,32),e.qZA())}function FC(n,s){if(1&n&&e._UZ(0,"cd-helper",33),2&n){const t=e.oxw();e.s9C("html",t.passwordPolicyHelpText)}}function kC(n,s){1&n&&(e.TgZ(0,"span",30),e.SDv(1,34),e.qZA())}function $C(n,s){1&n&&(e.TgZ(0,"span",30),e.SDv(1,35),e.qZA())}function JO(n,s){if(1&n&&(e.TgZ(0,"span",30),e._uU(1),e.qZA()),2&n){const t=e.oxw();e.xp6(1),e.hij(" ",t.passwordValuation," ")}}function HC(n,s){1&n&&(e.TgZ(0,"span",30),e.SDv(1,36),e.qZA())}function QO(n,s){1&n&&(e.TgZ(0,"span",30),e.SDv(1,37),e.qZA())}let UC=(()=>{class n{constructor(t,o,c,g,C,D,P){this.actionLabels=t,this.notificationService=o,this.userService=c,this.authStorageService=g,this.formBuilder=C,this.router=D,this.passwordPolicyService=P,this.passwordPolicyHelpText="",this.icons=No.P,this.action=this.actionLabels.CHANGE,this.resource="password",this.createForm()}createForm(){this.passwordPolicyService.getHelpText().subscribe(t=>{this.passwordPolicyHelpText=t}),this.userForm=this.formBuilder.group({oldpassword:[null,[vn.kI.required,ds.h.custom("notmatch",()=>this.userForm&&this.userForm.getValue("newpassword")===this.userForm.getValue("oldpassword"))]],newpassword:[null,[vn.kI.required,ds.h.custom("notmatch",()=>this.userForm&&this.userForm.getValue("oldpassword")===this.userForm.getValue("newpassword"))],[ds.h.passwordPolicy(this.userService,()=>this.authStorageService.getUsername(),(t,o,c)=>{this.passwordStrengthLevelClass=this.passwordPolicyService.mapCreditsToCssClass(o),this.passwordValuation=Ar().defaultTo(c,"")})]],confirmnewpassword:[null,[vn.kI.required]]},{validators:[ds.h.match("newpassword","confirmnewpassword")]})}onSubmit(){if(this.userForm.pristine)return;const t=this.authStorageService.getUsername(),o=this.userForm.getValue("oldpassword"),c=this.userForm.getValue("newpassword");this.userService.changePassword(t,o,c).subscribe(()=>this.onPasswordChange(),()=>{this.userForm.setErrors({cdSubmitButton:!0})})}onPasswordChange(){this.notificationService.show(_a.k.success,"Updated user password\""),this.router.navigate(["/login"])}}return n.\u0275fac=function(t){return new(t||n)(e.Y36(ki.p4),e.Y36(ll.g),e.Y36(xE.K),e.Y36(_t.j),e.Y36(id.O),e.Y36(Yo.F0),e.Y36(Lv.q))},n.\u0275cmp=e.Xpm({type:n,selectors:[["cd-user-password-form"]],decls:48,vars:25,consts:function(){let s,t,o,c,g,C,D,P,j,W;return s="" + "\ufffd0\ufffd" + " " + "\ufffd1\ufffd" + "",t="Old password",o="New password",c="Confirm new password",g="This field is required.",C="The old and new passwords must be different.",D="This field is required.",P="The old and new passwords must be different.",j="This field is required.",W="Password confirmation doesn't match the new password.",[[1,"cd-col-form"],["novalidate","",3,"formGroup"],["frm","ngForm"],[1,"card"],[1,"card-header"],s,[1,"card-body"],[1,"form-group","row"],["for","oldpassword",1,"cd-col-form-label","required"],t,[1,"cd-col-form-input"],[1,"input-group"],["type","password","placeholder","Old password...","id","oldpassword","formControlName","oldpassword","autocomplete","new-password","autofocus","",1,"form-control"],[1,"input-group-append"],["cdPasswordButton","oldpassword",1,"btn","btn-light"],["class","invalid-feedback",4,"ngIf"],["for","newpassword",1,"cd-col-form-label"],[1,"required"],o,["class","text-pre-wrap",3,"html",4,"ngIf"],["type","password","placeholder","Password...","id","newpassword","autocomplete","new-password","formControlName","newpassword",1,"form-control"],["type","button","cdPasswordButton","newpassword",1,"btn","btn-light"],[1,"password-strength-level"],["data-toggle","tooltip",3,"title"],["for","confirmnewpassword",1,"cd-col-form-label","required"],c,["type","password","autocomplete","new-password","placeholder","Confirm new password...","id","confirmnewpassword","formControlName","confirmnewpassword",1,"form-control"],["cdPasswordButton","confirmnewpassword",1,"btn","btn-light"],[1,"card-footer"],["wrappingClass","text-right",3,"form","submitText","submitActionEvent"],[1,"invalid-feedback"],g,C,[1,"text-pre-wrap",3,"html"],D,P,j,W]},template:function(t,o){if(1&t&&(e.TgZ(0,"div",0),e.TgZ(1,"form",1,2),e.TgZ(3,"div",3),e.TgZ(4,"div",4),e.SDv(5,5),e.ALo(6,"titlecase"),e.ALo(7,"upperFirst"),e.qZA(),e.TgZ(8,"div",6),e.TgZ(9,"div",7),e.TgZ(10,"label",8),e.SDv(11,9),e.qZA(),e.TgZ(12,"div",10),e.TgZ(13,"div",11),e._UZ(14,"input",12),e.TgZ(15,"span",13),e._UZ(16,"button",14),e.qZA(),e.qZA(),e.YNc(17,zO,2,0,"span",15),e.YNc(18,WO,2,0,"span",15),e.qZA(),e.qZA(),e.TgZ(19,"div",7),e.TgZ(20,"label",16),e.TgZ(21,"span",17),e.SDv(22,18),e.qZA(),e.YNc(23,FC,1,1,"cd-helper",19),e.qZA(),e.TgZ(24,"div",10),e.TgZ(25,"div",11),e._UZ(26,"input",20),e.TgZ(27,"span",13),e._UZ(28,"button",21),e.qZA(),e.qZA(),e.TgZ(29,"div",22),e._UZ(30,"div",23),e.qZA(),e.YNc(31,kC,2,0,"span",15),e.YNc(32,$C,2,0,"span",15),e.YNc(33,JO,2,1,"span",15),e.qZA(),e.qZA(),e.TgZ(34,"div",7),e.TgZ(35,"label",24),e.SDv(36,25),e.qZA(),e.TgZ(37,"div",10),e.TgZ(38,"div",11),e._UZ(39,"input",26),e.TgZ(40,"span",13),e._UZ(41,"button",27),e.qZA(),e.qZA(),e.YNc(42,HC,2,0,"span",15),e.YNc(43,QO,2,0,"span",15),e.qZA(),e.qZA(),e.qZA(),e.TgZ(44,"div",28),e.TgZ(45,"cd-form-button-panel",29),e.NdJ("submitActionEvent",function(){return o.onSubmit()}),e.ALo(46,"titlecase"),e.ALo(47,"upperFirst"),e.qZA(),e.qZA(),e.qZA(),e.qZA(),e.qZA()),2&t){const c=e.MAs(2);e.xp6(1),e.Q6J("formGroup",o.userForm),e.xp6(6),e.pQV(e.lcZ(6,17,o.action))(e.lcZ(7,19,o.resource)),e.QtT(5),e.xp6(10),e.Q6J("ngIf",o.userForm.showError("oldpassword",c,"required")),e.xp6(1),e.Q6J("ngIf",o.userForm.showError("oldpassword",c,"notmatch")),e.xp6(5),e.Q6J("ngIf",o.passwordPolicyHelpText.length>0),e.xp6(7),e.Tol(o.passwordStrengthLevelClass),e.s9C("title",o.passwordValuation),e.xp6(1),e.Q6J("ngIf",o.userForm.showError("newpassword",c,"required")),e.xp6(1),e.Q6J("ngIf",o.userForm.showError("newpassword",c,"notmatch")),e.xp6(1),e.Q6J("ngIf",o.userForm.showError("newpassword",c,"passwordPolicy")),e.xp6(9),e.Q6J("ngIf",o.userForm.showError("confirmnewpassword",c,"required")),e.xp6(1),e.Q6J("ngIf",o.userForm.showError("confirmnewpassword",c,"match")),e.xp6(2),e.Q6J("form",o.userForm)("submitText",e.lcZ(46,21,o.action)+" "+e.lcZ(47,23,o.resource))}},directives:[vn._Y,vn.JL,vn.sg,tl.V,$a.P,ca.o,vn.Fj,Ha.b,vn.JJ,vn.u,N.U,u_.C,_.O5,nl.p,E.S],pipes:[_.rS,K.m],styles:[""]}),n})();function CR(n,s){1&n&&(e.TgZ(0,"span",17),e.SDv(1,18),e.qZA())}function MR(n,s){1&n&&(e.TgZ(0,"span",17),e.SDv(1,19),e.qZA())}function AR(n,s){1&n&&(e.TgZ(0,"span",17),e.SDv(1,20),e.qZA())}function OR(n,s){1&n&&(e.TgZ(0,"span",17),e.SDv(1,21),e.qZA())}function BC(n,s){if(1&n&&(e.TgZ(0,"span",17),e._uU(1),e.qZA()),2&n){const t=e.oxw();e.xp6(1),e.hij(" ",t.passwordValuation," ")}}function wy(n,s){1&n&&(e.TgZ(0,"span",17),e.SDv(1,22),e.qZA())}function XO(n,s){1&n&&(e.TgZ(0,"span",17),e.SDv(1,23),e.qZA())}let KO=(()=>{class n extends UC{constructor(t,o,c,g,C,D,P,j){super(t,o,c,g,C,D,P),this.actionLabels=t,this.notificationService=o,this.userService=c,this.authStorageService=g,this.formBuilder=C,this.router=D,this.passwordPolicyService=P,this.authService=j}onPasswordChange(){this.authService.logout()}onCancel(){this.authService.logout()}}return n.\u0275fac=function(t){return new(t||n)(e.Y36(ki.p4),e.Y36(ll.g),e.Y36(xE.K),e.Y36(_t.j),e.Y36(id.O),e.Y36(Yo.F0),e.Y36(Lv.q),e.Y36(Vm.e))},n.\u0275cmp=e.Xpm({type:n,selectors:[["cd-login-password-form"]],features:[e.qOj],decls:34,vars:19,consts:function(){let s,t,o,c,g,C,D,P;return s="Please set a new password.",t="You will be redirected to the login page afterwards.",o="This field is required.",c="The old and new passwords must be different.",g="This field is required.",C="The old and new passwords must be different.",D="This field is required.",P="Password confirmation doesn't match the new password.",[s,t,["novalidate","",3,"formGroup"],["frm","ngForm"],[1,"form-group","has-feedback"],[1,"input-group"],["type","password","placeholder","Old password...","id","oldpassword","formControlName","oldpassword","autocomplete","new-password","autofocus","",1,"form-control"],[1,"input-group-append"],["cdPasswordButton","oldpassword",1,"btn","btn-outline-light","btn-password"],["class","invalid-feedback",4,"ngIf"],["type","password","placeholder","New password...","id","newpassword","autocomplete","new-password","formControlName","newpassword",1,"form-control"],["type","button","cdPasswordButton","newpassword",1,"btn","btn-outline-light","btn-password"],[1,"password-strength-level"],["data-toggle","tooltip",3,"title"],["type","password","autocomplete","new-password","placeholder","Confirm new password...","id","confirmnewpassword","formControlName","confirmnewpassword",1,"form-control"],["cdPasswordButton","confirmnewpassword",1,"btn","btn-outline-light","btn-password"],["wrappingClass","text-right",3,"form","disabled","submitText","submitActionEvent","backActionEvent"],[1,"invalid-feedback"],o,c,g,C,D,P]},template:function(t,o){if(1&t&&(e.TgZ(0,"div"),e.TgZ(1,"h2"),e.SDv(2,0),e.qZA(),e.TgZ(3,"h4"),e.SDv(4,1),e.qZA(),e.TgZ(5,"form",2,3),e.TgZ(7,"div",4),e.TgZ(8,"div",5),e._UZ(9,"input",6),e.TgZ(10,"span",7),e._UZ(11,"button",8),e.qZA(),e.qZA(),e.YNc(12,CR,2,0,"span",9),e.YNc(13,MR,2,0,"span",9),e.qZA(),e.TgZ(14,"div",4),e.TgZ(15,"div",5),e._UZ(16,"input",10),e.TgZ(17,"span",7),e._UZ(18,"button",11),e.qZA(),e.qZA(),e.TgZ(19,"div",12),e._UZ(20,"div",13),e.qZA(),e.YNc(21,AR,2,0,"span",9),e.YNc(22,OR,2,0,"span",9),e.YNc(23,BC,2,1,"span",9),e.qZA(),e.TgZ(24,"div",4),e.TgZ(25,"div",5),e._UZ(26,"input",14),e.TgZ(27,"span",7),e._UZ(28,"button",15),e.qZA(),e.qZA(),e.YNc(29,wy,2,0,"span",9),e.YNc(30,XO,2,0,"span",9),e.qZA(),e.TgZ(31,"cd-form-button-panel",16),e.NdJ("submitActionEvent",function(){return o.onSubmit()})("backActionEvent",function(){return o.onCancel()}),e.ALo(32,"titlecase"),e.ALo(33,"upperFirst"),e.qZA(),e.qZA(),e.qZA()),2&t){const c=e.MAs(6);e.xp6(5),e.Q6J("formGroup",o.userForm),e.xp6(7),e.Q6J("ngIf",o.userForm.showError("oldpassword",c,"required")),e.xp6(1),e.Q6J("ngIf",o.userForm.showError("oldpassword",c,"notmatch")),e.xp6(7),e.Tol(o.passwordStrengthLevelClass),e.s9C("title",o.passwordValuation),e.xp6(1),e.Q6J("ngIf",o.userForm.showError("newpassword",c,"required")),e.xp6(1),e.Q6J("ngIf",o.userForm.showError("newpassword",c,"notmatch")),e.xp6(1),e.Q6J("ngIf",o.userForm.showError("newpassword",c,"passwordPolicy")),e.xp6(6),e.Q6J("ngIf",o.userForm.showError("confirmnewpassword",c,"required")),e.xp6(1),e.Q6J("ngIf",o.userForm.showError("confirmnewpassword",c,"match")),e.xp6(1),e.Q6J("form",o.userForm)("disabled",o.userForm.invalid)("submitText",e.lcZ(32,15,o.action)+" "+e.lcZ(33,17,o.resource))}},directives:[vn._Y,vn.JL,vn.sg,tl.V,$a.P,ca.o,vn.Fj,Ha.b,vn.JJ,vn.u,N.U,u_.C,_.O5,nl.p],pipes:[_.rS,K.m],styles:["cd-login-password-form h4{margin:0 0 30px}  cd-login-password-form .form-group{background-color:#2e373d;border-left:4px solid #fff}  cd-login-password-form .form-group:focus-within{border-left:4px solid #ef5c55}  cd-login-password-form .btn-password,   cd-login-password-form .btn-password:focus,   cd-login-password-form .form-control,   cd-login-password-form .form-control:focus{background-color:#2e373d;border:0;box-shadow:none;color:#f8f9fa;filter:none;outline:none}  cd-login-password-form .form-control::placeholder{color:#6c757d}  cd-login-password-form .btn-password:focus{outline-color:#2b99a8}  cd-login-password-form button.btn:not(:first-child){margin-left:5px}@keyframes autofill{to{background-color:#2e373d;color:#f8f9fa}}input[_ngcontent-%COMP%]:-webkit-autofill{animation-fill-mode:both;animation-name:autofill;border-radius:0;box-shadow:0 0 0 1000px #2e373d inset;-webkit-text-fill-color:#f8f9fa;-webkit-transition-property:none;transition-property:none}.invalid-feedback[_ngcontent-%COMP%]{padding-left:9px}.is-invalid.cd-form-control[_ngcontent-%COMP%]{border-color:transparent}"]}),n})();class YC{}function B1(n,s){1&n&&(e.TgZ(0,"div",20),e.SDv(1,21),e.qZA())}function qO(n,s){1&n&&(e.TgZ(0,"div",20),e.SDv(1,22),e.qZA())}function ew(n,s){if(1&n){const t=e.EpF();e.TgZ(0,"div",1),e.TgZ(1,"form",2,3),e.NdJ("ngSubmit",function(){return e.CHM(t),e.oxw().login()}),e.TgZ(3,"div",4),e.TgZ(4,"label",5),e.SDv(5,6),e.qZA(),e.TgZ(6,"input",7,8),e.NdJ("ngModelChange",function(c){return e.CHM(t),e.oxw().model.username=c}),e.qZA(),e.YNc(8,B1,2,0,"div",9),e.qZA(),e.TgZ(9,"div",10),e.TgZ(10,"div",11),e.TgZ(11,"div",12),e.TgZ(12,"label",13),e.SDv(13,14),e.qZA(),e.TgZ(14,"input",15,16),e.NdJ("ngModelChange",function(c){return e.CHM(t),e.oxw().model.password=c}),e.qZA(),e.YNc(16,qO,2,0,"div",9),e.qZA(),e.TgZ(17,"span",17),e._UZ(18,"button",18),e.qZA(),e.qZA(),e.qZA(),e._UZ(19,"input",19),e.qZA(),e.qZA()}if(2&n){const t=e.MAs(2),o=e.MAs(7),c=e.MAs(15),g=e.oxw();e.xp6(6),e.Q6J("ngModel",g.model.username),e.uIk("aria-invalid",o.invalid),e.xp6(2),e.Q6J("ngIf",(t.submitted||o.dirty)&&o.invalid),e.xp6(6),e.Q6J("ngModel",g.model.password),e.uIk("aria-invalid",c.invalid),e.xp6(2),e.Q6J("ngIf",(t.submitted||c.dirty)&&c.invalid),e.xp6(3),e.Q6J("disabled",t.invalid)}}let tw=(()=>{class n{constructor(t,o,c,g,C){this.authService=t,this.authStorageService=o,this.modalService=c,this.route=g,this.router=C,this.model=new YC,this.isLoginActive=!1,this.postInstalled=!1}ngOnInit(){if(this.authStorageService.isLoggedIn())this.router.navigate([""]);else{this.modalService.dismissAll();let t=null;if(-1!==window.location.hash.indexOf("access_token=")){t=window.location.hash.split("access_token=")[1];const o=window.location.toString();window.history.replaceState({},document.title,o.split("?")[0])}this.authService.check(t).subscribe(o=>{o.login_url?(this.postInstalled="POST_INSTALLED"===o.cluster_status,"#/login"===o.login_url?this.isLoginActive=!0:window.location.replace(o.login_url)):(this.authStorageService.set(o.username,o.permissions,o.sso,o.pwdExpirationDate),this.router.navigate([""]))})}}login(){this.authService.login(this.model).subscribe(()=>{const t=this.postInstalled?"/":"/expand-cluster";let o=Ar().get(this.route.snapshot.queryParams,"returnUrl",t);!this.postInstalled&&"/dashboard"===this.route.snapshot.queryParams.returnUrl&&(o="/expand-cluster"),this.router.navigate([o])})}}return n.\u0275fac=function(t){return new(t||n)(e.Y36(Vm.e),e.Y36(_t.j),e.Y36(Ul.Z),e.Y36(Yo.gz),e.Y36(Yo.F0))},n.\u0275cmp=e.Xpm({type:n,selectors:[["cd-login"]],decls:1,vars:1,consts:function(){let s,t,o,c,g;return s="Username",t="Password",o="Log in",c="Username is required",g="Password is required",[["class","container",4,"ngIf"],[1,"container"],["name","loginForm","novalidate","",3,"ngSubmit"],["loginForm","ngForm"],[1,"form-group","has-feedback","d-flex","flex-column","py-3"],["for","username",1,"placeholder","pl-4"],s,["id","username","name","username","type","text","aria-labelledby","username","required","","autofocus","",1,"form-control","pl-4",3,"ngModel","ngModelChange"],["username","ngModel"],["class","invalid-feedback pl-4",4,"ngIf"],["id","password-div",1,"form-group","has-feedback"],[1,"input-group","d-flex","flex-nowrap"],[1,"d-flex","flex-column","flex-grow-1","py-3"],["for","password",1,"placeholder","pl-4"],t,["id","password","name","password","type","password","aria-labelledby","password","required","",1,"form-control","pl-4",3,"ngModel","ngModelChange"],["password","ngModel"],[1,"form-group-append"],["type","button","cdPasswordButton","password",1,"btn","btn-outline-light","btn-password","h-100","px-4"],["type","submit","value",o,1,"btn","btn-accent","px-5","py-2",3,"disabled"],[1,"invalid-feedback","pl-4"],c,g]},template:function(t,o){1&t&&e.YNc(0,ew,20,7,"div",0),2&t&&e.Q6J("ngIf",o.isLoginActive)},directives:[_.O5,vn._Y,vn.JL,vn.F,$a.P,ca.o,vn.Fj,Ha.b,vn.Q7,N.U,vn.JJ,vn.On,u_.C],styles:["cd-login .form-group{background-color:#2e373d;border-left:4px solid #fff;height:auto;margin-bottom:2rem}  cd-login .form-group:focus-within{border-left:4px solid #ef5c55}  cd-login .btn-password,   cd-login .btn-password:focus,   cd-login .form-control,   cd-login .form-control:focus{background-color:#2e373d;border:0;box-shadow:none;color:#f8f9fa;filter:none;outline:none}  cd-login .placeholder{color:#6c757d}  cd-login .btn-password:focus{outline-color:#2b99a8}@keyframes autofill{to{background-color:#2e373d;color:#f8f9fa}}input[_ngcontent-%COMP%]:-webkit-autofill{animation-fill-mode:both;animation-name:autofill;border-radius:0;box-shadow:0 0 0 1000px #2e373d inset;-webkit-text-fill-color:#f8f9fa;-webkit-transition-property:none;transition-property:none}"]}),n})();var ZC=i(72625);function nw(n,s){if(1&n&&(e.TgZ(0,"h4",14),e._uU(1),e.qZA()),2&n){const t=e.oxw(2);e.xp6(1),e.Oqu(t.message)}}function jC(n,s){if(1&n&&(e.TgZ(0,"h4"),e.tHW(1,15),e._UZ(2,"a",16),e.N_p(),e.qZA()),2&n){const t=e.oxw(2);e.xp6(2),e.s9C("href",t.docUrl,e.LSH),e.pQV(t.sectionInfo),e.QtT(1)}}function rw(n,s){if(1&n&&(e.TgZ(0,"div"),e._UZ(1,"i",10),e.TgZ(2,"div",11),e.TgZ(3,"h3"),e.TgZ(4,"b"),e._uU(5),e.qZA(),e.qZA(),e.YNc(6,nw,2,1,"h4",12),e.YNc(7,jC,3,2,"h4",13),e.qZA(),e.qZA()),2&n){const t=e.oxw();e.xp6(1),e.Q6J("ngClass",t.icon),e.xp6(4),e.Oqu(t.header),e.xp6(1),e.Q6J("ngIf",t.header!==t.message),e.xp6(1),e.Q6J("ngIf",t.section)}}function iw(n,s){if(1&n&&(e.TgZ(0,"button",19),e.SDv(1,20),e.qZA()),2&n){const t=e.oxw(2);e.Q6J("routerLink",t.buttonRoute),e.xp6(1),e.pQV(t.buttonName),e.QtT(1)}}function Fv(n,s){if(1&n&&(e.TgZ(0,"div",17),e.YNc(1,iw,2,2,"button",18),e.qZA()),2&n){const t=e.oxw(),o=e.MAs(11);e.xp6(1),e.Q6J("ngIf",!t.uiConfig)("ngIfElse",o)}}function ow(n,s){if(1&n){const t=e.EpF();e.TgZ(0,"button",22),e.NdJ("click",function(){return e.CHM(t),e.oxw(2).doConfigure()}),e.SDv(1,23),e.qZA()}if(2&n){const t=e.oxw(2);e.uIk("title",t.buttonTitle),e.xp6(1),e.pQV(t.buttonName),e.QtT(1)}}function GC(n,s){if(1&n&&e.YNc(0,ow,2,2,"button",21),2&n){const t=e.oxw();e.Q6J("ngIf",t.uiConfig)}}function sw(n,s){1&n&&(e._UZ(0,"i",24),e.TgZ(1,"div",11),e.TgZ(2,"h3"),e.tHW(3,25),e._UZ(4,"b"),e.N_p(),e.qZA(),e.TgZ(5,"h4",5),e.SDv(6,26),e.qZA(),e.qZA())}function VC(n,s){1&n&&(e.TgZ(0,"div",11),e.TgZ(1,"button",19),e.SDv(2,27),e.qZA(),e.qZA()),2&n&&(e.xp6(1),e.Q6J("routerLink","/dashboard"))}let aw=(()=>{class n{constructor(t,o,c,g){this.router=t,this.docService=o,this.http=c,this.notificationService=g}ngOnInit(){this.fetchData(),this.routerSubscription=this.router.events.pipe((0,tp.h)(t=>t instanceof Yo.m2)).subscribe(()=>{this.fetchData()})}doConfigure(){this.http.post(`ui-api/${this.uiApiPath}/configure`,{}).subscribe({next:()=>{this.notificationService.show(_a.k.info,`Configuring ${this.component}`)},error:t=>{this.notificationService.show(_a.k.error,t)},complete:()=>{setTimeout(()=>{this.router.navigate([this.uiApiPath]),this.notificationService.show(_a.k.success,`Configured ${this.component}`)},3e3)}})}unloadHandler(t){t.returnValue=!1}fetchData(){try{this.router.onSameUrlNavigation="reload",this.message=history.state.message,this.header=history.state.header,this.section=history.state.section,this.section_info=history.state.section_info,this.button_name=history.state.button_name,this.button_route=history.state.button_route,this.icon=history.state.icon,this.source=history.state.source,this.uiConfig=history.state.uiConfig,this.uiApiPath=history.state.uiApiPath,this.buttonRoute=history.state.button_route,this.buttonName=history.state.button_name,this.buttonTitle=history.state.button_title,this.component=history.state.component,this.docUrl=this.docService.urlGenerator(this.section)}catch(t){this.router.navigate(["/error"])}}ngOnDestroy(){this.routerSubscription&&this.routerSubscription.unsubscribe()}}return n.\u0275fac=function(t){return new(t||n)(e.Y36(Yo.F0),e.Y36(ZC.R),e.Y36(y.eN),e.Y36(ll.g))},n.\u0275cmp=e.Xpm({type:n,selectors:[["cd-error"]],hostBindings:function(t,o){1&t&&e.NdJ("beforeunload",function(g){return o.unloadHandler(g)},!1,e.Jf7)},decls:16,vars:4,consts:function(){let s,t,o,c,g,C;return s="Please consult the " + "\ufffd#2\ufffd" + "documentation" + "\ufffd/#2\ufffd" + " on how to configure and enable the " + "\ufffd0\ufffd" + " management functionality. ",t="" + "\ufffd0\ufffd" + "",o="" + "\ufffd0\ufffd" + "",c="" + "\ufffd#4\ufffd" + "Page not Found" + "\ufffd/#4\ufffd" + "",g="Sorry, we couldn\u2019t find what you were looking for. The page you requested may have been changed or moved.",C="Go To Dashboard",[["target","_blank"],[1,"container","h-75"],[1,"row","h-100","justify-content-center","align-items-center"],[1,"blank-page"],[4,"ngIf","ngIfElse"],[1,"mt-4"],["class","text-center",4,"ngIf","ngIfElse"],["configureButtonTpl",""],["elseBlock",""],["dashboardButton",""],[1,"mx-auto","d-block",3,"ngClass"],[1,"mt-4","text-center"],["class","mt-3",4,"ngIf"],[4,"ngIf"],[1,"mt-3"],s,[3,"href"],[1,"text-center"],["class","btn btn-primary",3,"routerLink",4,"ngIf","ngIfElse"],[1,"btn","btn-primary",3,"routerLink"],t,["class","btn btn-primary",3,"click",4,"ngIf"],[1,"btn","btn-primary",3,"click"],o,[1,"fa","fa-exclamation-triangle","mx-auto","d-block","text-danger"],c,g,C]},template:function(t,o){if(1&t&&(e.TgZ(0,"head"),e.TgZ(1,"title"),e._uU(2,"Error Page"),e.qZA(),e._UZ(3,"base",0),e.qZA(),e.TgZ(4,"div",1),e.TgZ(5,"div",2),e.TgZ(6,"div",3),e.YNc(7,rw,8,4,"div",4),e.TgZ(8,"div",5),e.YNc(9,Fv,2,2,"div",6),e.qZA(),e.qZA(),e.qZA(),e.qZA(),e.YNc(10,GC,1,1,"ng-template",null,7,e.W1O),e.YNc(12,sw,7,0,"ng-template",null,8,e.W1O),e.YNc(14,VC,3,1,"ng-template",null,9,e.W1O)),2&t){const c=e.MAs(13),g=e.MAs(15);e.xp6(7),e.Q6J("ngIf",o.header&&o.message)("ngIfElse",c),e.xp6(2),e.Q6J("ngIf",o.buttonName&&o.buttonRoute||o.uiConfig)("ngIfElse",g)}},directives:[_.O5,_.mk,ca.o,Yo.rH],styles:["h4[_ngcontent-%COMP%]{color:#495057}i[_ngcontent-%COMP%]{font-size:6em;margin-top:120px}.fa-lock[_ngcontent-%COMP%]{color:#ef5c55}.fa-wrench[_ngcontent-%COMP%]{color:#2b99a8}"]}),n})(),zC=(()=>{class n{}return n.\u0275fac=function(t){return new(t||n)},n.\u0275cmp=e.Xpm({type:n,selectors:[["cd-blank-layout"]],decls:1,vars:0,template:function(t,o){1&t&&e._UZ(0,"router-outlet")},directives:[Yo.lC],styles:[""]}),n})();var WC=i(92340);let DE=(()=>{class n{constructor(t,o){this.http=t,this.localeId=o}getLocale(){return this.localeId||WC.N.default_lang}setLocale(t){document.cookie=`cd-lang=${t}`}getLanguages(){return this.http.get("ui-api/langs")}}return n.\u0275fac=function(t){return new(t||n)(e.LFG(y.eN),e.LFG(e.soG))},n.\u0275prov=e.Yz7({token:n,factory:n.\u0275fac,providedIn:"root"}),n})();var Y1=(()=>{return(n=Y1||(Y1={})).cs="\u010ce\u0161tina",n.de="Deutsch",n["en-US"]="English",n.es="Espa\xf1ol",n.fr="Fran\xe7ais",n.id="Bahasa Indonesia",n.it="Italiano",n.ja="\u65e5\u672c\u8a9e",n.ko="\ud55c\uad6d\uc5b4",n.pl="Polski",n.pt="Portugu\xeas (brasileiro)",n["zh-Hans"]="\u4e2d\u6587 (\u7b80\u4f53)",n["zh-Hant"]="\u4e2d\u6587 (\u7e41\u9ad4\uff09",Y1;var n})();function JC(n,s){if(1&n){const t=e.EpF();e.ynx(0),e.TgZ(1,"button",4),e.NdJ("click",function(){const g=e.CHM(t).$implicit;return e.oxw().changeLanguage(g.key)}),e._uU(2),e.qZA(),e.BQk()}if(2&n){const t=s.$implicit;e.xp6(2),e.hij(" ",t.value," ")}}let RE=(()=>{class n{constructor(t){this.languageService=t,this.allLanguages=Y1,this.supportedLanguages={}}ngOnInit(){this.selectedLanguage=this.languageService.getLocale(),this.languageService.getLanguages().subscribe(t=>{this.supportedLanguages=Ar().pick(Y1,t)})}reloadWindow(){window.location.reload()}changeLanguage(t){this.languageService.setLocale(t),this.reloadWindow()}}return n.\u0275fac=function(t){return new(t||n)(e.Y36(DE))},n.\u0275cmp=e.Xpm({type:n,selectors:[["cd-language-selector"]],decls:6,vars:4,consts:function(){let s;return s="Select a Language",[["ngbDropdown","","display","dynamic","placement","bottom-right"],["ngbDropdownToggle","","title",s],["ngbDropdownMenu",""],[4,"ngFor","ngForOf"],["ngbDropdownItem","",3,"click"]]},template:function(t,o){1&t&&(e.TgZ(0,"div",0),e.TgZ(1,"a",1),e._uU(2),e.qZA(),e.TgZ(3,"div",2),e.YNc(4,JC,3,1,"ng-container",3),e.ALo(5,"keyvalue"),e.qZA(),e.qZA()),2&t&&(e.xp6(2),e.hij(" ",o.allLanguages[o.selectedLanguage]," "),e.xp6(2),e.Q6J("ngForOf",e.lcZ(5,2,o.supportedLanguages)))},directives:[lt.jt,lt.iD,lt.Vi,_.sg,ca.o,lt.TH],pipes:[_.Nd],styles:[""]}),n})(),lw=(()=>{class n{constructor(t){this.http=t,this.baseUiURL="ui-api/login/custom_banner"}getBannerText(){return this.http.get(this.baseUiURL)}}return n.\u0275fac=function(t){return new(t||n)(e.LFG(y.eN))},n.\u0275prov=e.Yz7({token:n,factory:n.\u0275fac,providedIn:"root"}),n})();function uw(n,s){if(1&n&&(e.TgZ(0,"p",1),e._uU(1),e.qZA()),2&n){const t=s.ngIf;e.xp6(1),e.Oqu(t)}}let cw=(()=>{class n{constructor(t){this.customLoginBannerService=t}ngOnInit(){this.bannerText$=this.customLoginBannerService.getBannerText()}}return n.\u0275fac=function(t){return new(t||n)(e.Y36(lw))},n.\u0275cmp=e.Xpm({type:n,selectors:[["cd-custom-login-banner"]],decls:2,vars:3,consts:[["class","login-text",4,"ngIf"],[1,"login-text"]],template:function(t,o){1&t&&(e.YNc(0,uw,2,1,"p",0),e.ALo(1,"async")),2&t&&e.Q6J("ngIf",e.lcZ(1,1,o.bannerText$))},directives:[_.O5],pipes:[_.Ov],styles:[".login-text[_ngcontent-%COMP%]{font-weight:bold;margin:0;padding:12px 20% 12px 12px}"]}),n})();function NE(n,s){if(1&n&&(e.TgZ(0,"li",11),e.TgZ(1,"cd-doc",12),e.DtL(2,13),e.qZA(),e.qZA()),2&n){const t=s.$implicit;e.xp6(1),e.pQV(t.text),e.QtT(2),e.s9C("section",t.section)}}let dw=(()=>{class n{constructor(){this.docItems=[{section:"help",text:"Help"},{section:"security",text:"Security"},{section:"trademarks",text:"Trademarks"}]}}return n.\u0275fac=function(t){return new(t||n)},n.\u0275cmp=e.Xpm({type:n,selectors:[["cd-login-layout"]],decls:16,vars:1,consts:function(){let s;return s="" + "\ufffd0\ufffd" + "",[[1,"login","full-height"],[1,"navbar","p-4"],[1,"navbar-brand"],[1,"form-inline"],[1,"container"],[1,"row","full-height"],[1,"col-sm-12","col-md-6","d-sm-block","login-form"],[1,"col-sm-12","col-md-6","d-sm-block","branding-info"],["src","assets/Ceph_Ceph_Logo_with_text_white.svg","alt","Ceph",1,"img-fluid","pb-3"],[1,"list-inline"],["class","list-inline-item p-3",4,"ngFor","ngForOf"],[1,"list-inline-item","p-3"],["noSubscribe","true",3,"section",6,"docText"],["docText",s]]},template:function(t,o){1&t&&(e.TgZ(0,"main",0),e.TgZ(1,"header"),e.TgZ(2,"nav",1),e._UZ(3,"a",2),e.TgZ(4,"div",3),e._UZ(5,"cd-language-selector"),e.qZA(),e.qZA(),e.qZA(),e.TgZ(6,"section"),e.TgZ(7,"div",4),e.TgZ(8,"div",5),e.TgZ(9,"div",6),e._UZ(10,"router-outlet"),e.qZA(),e.TgZ(11,"div",7),e._UZ(12,"img",8),e.TgZ(13,"ul",9),e.YNc(14,NE,3,2,"li",10),e.qZA(),e._UZ(15,"cd-custom-login-banner"),e.qZA(),e.qZA(),e.qZA(),e.qZA(),e.qZA()),2&t&&(e.xp6(14),e.Q6J("ngForOf",o.docItems))},directives:[lt.M2,RE,Yo.lC,_.sg,cw,ol.K],styles:["cd-login-layout .login{background-color:#374249;background-image:url(ceph_background.e82dd79127290ddbe8cb.gif);background-position:right bottom;background-repeat:no-repeat;color:#f8f9fa}  cd-login-layout .login header{position:absolute;width:100vw}  cd-login-layout .login header .navbar .dropdown-menu{margin-top:.2rem}  cd-login-layout .login header .navbar .dropdown-menu li a:hover{background-color:#2b99a8}  cd-login-layout .login section{display:inline-flex;min-height:100vh;width:100vw}  cd-login-layout .login .list-inline{margin-bottom:0;margin-left:20%}  cd-login-layout .login a{color:#fff}  cd-login-layout .login a:hover{color:#adb5bd}@media screen and (min-width: 576px){  cd-login-layout .login .login-form,   cd-login-layout .login .branding-info{padding-top:30vh}}@media screen and (max-width: calc(768px - 1px)){  cd-login-layout .login .login-form{padding-top:10vh}  cd-login-layout .login .branding-info{padding-top:0}}"]}),n})();var zm=i(74255);let QC=(()=>{class n{constructor(t,o,c){this.document=t,this.summaryService=o,this.cssHelper=c}init(){var t;this.url=null===(t=this.document.getElementById("cdFavicon"))||void 0===t?void 0:t.getAttribute("href"),this.sub=this.summaryService.subscribe(o=>{this.changeIcon(o.health_status)})}changeIcon(t){if(t===this.oldStatus)return;this.oldStatus=t;const o=this.document.getElementById("cdFavicon"),C=this.document.createElement("canvas");C.width=16,C.height=16;const D=C.getContext("2d"),P=this.document.createElement("img");P.src=this.url,P.onload=()=>{D.drawImage(P,0,0,16,16),Object.keys(rm).includes(t)&&(D.save(),D.globalCompositeOperation="destination-out",D.beginPath(),D.arc(C.width-4,4,6,0,2*Math.PI),D.fill(),D.restore(),D.beginPath(),D.arc(C.width-4,4,4,0,2*Math.PI),D.fillStyle=this.cssHelper.propertyValue(rm[t]),D.fill()),o.setAttribute("href",C.toDataURL("image/png"))}}ngOnDestroy(){var t;this.changeIcon(),null===(t=this.sub)||void 0===t||t.unsubscribe()}}return n.\u0275fac=function(t){return new(t||n)(e.LFG(_.K0),e.LFG(zm.J),e.LFG(Rv.P))},n.\u0275prov=e.Yz7({token:n,factory:n.\u0275fac}),n})();var fw=i(71099),XC=i(59193),pw=i(68307);class KC{constructor(s,t){this.count=s,this.source=t}call(s,t){return t.subscribe(new _w(s,this.count,this.source))}}class _w extends fd.L{constructor(s,t,o){super(s),this.count=t,this.source=o}complete(){if(!this.isStopped){const{source:s,count:t}=this;if(0===t)return super.complete();t>-1&&(this.count=t-1),s.subscribe(this._unsubscribeAndRecycle())}}}var gw=i(49083);let PE=(()=>{class n{constructor(t){this.http=t,this.url="ui-api/motd"}get(){return this.http.get(this.url)}}return n.\u0275fac=function(t){return new(t||n)(e.LFG(y.eN))},n.\u0275prov=e.Yz7({token:n,factory:n.\u0275fac,providedIn:"root"}),n})(),xy=(()=>{class n{constructor(t){this.motdService=t,this.motdSource=new Nd.X(null),this.localStorageKey="dashboard_motd_hidden",this.motd$=this.motdSource.asObservable(),this.subscription=(0,zc.of)(!0).pipe((0,Uu.zg)(()=>this.motdService.get()),(0,Pv.K)(o=>(du.isFunction(o.preventDefault)&&o.preventDefault(),XC.E)),(0,pw.b)(o=>this.processResponse(o)),(0,vp.g)(6e4),function(n=-1){return s=>0===n?(0,XC.c)():s.lift(new KC(n<0?-1:n-1,s))}(),(0,gw.r)()).subscribe()}ngOnDestroy(){this.subscription.unsubscribe()}hide(){const t=this.motdSource.getValue();if(t){const o=`${t.severity}:${t.md5}`;switch(t.severity){case"info":localStorage.setItem(this.localStorageKey,o),sessionStorage.removeItem(this.localStorageKey);break;case"warning":sessionStorage.setItem(this.localStorageKey,o),localStorage.removeItem(this.localStorageKey)}}this.motdSource.next(null)}processResponse(t){const o=sessionStorage.getItem(this.localStorageKey)||localStorage.getItem(this.localStorageKey);let c=du.isNull(o);if(!c&&t){const[g,C]=o.split(":");(g!==t.severity||C!==t.md5)&&(c=!0,sessionStorage.removeItem(this.localStorageKey),localStorage.removeItem(this.localStorageKey))}c&&this.motdSource.next(t)}}return n.\u0275fac=function(t){return new(t||n)(e.LFG(PE))},n.\u0275prov=e.Yz7({token:n,factory:n.\u0275fac,providedIn:"root"}),n})();var qC=i(51907);function eM(n,s){1&n&&(e.TgZ(0,"div"),e.tHW(1,3),e._UZ(2,"strong"),e._UZ(3,"a",4),e.N_p(),e.qZA())}function IE(n,s){if(1&n&&(e.TgZ(0,"div"),e.tHW(1,5),e._UZ(2,"strong"),e._UZ(3,"a",4),e.N_p(),e.qZA()),2&n){const t=e.oxw(2);e.xp6(3),e.pQV(t.expirationDays),e.QtT(1)}}function tM(n,s){if(1&n){const t=e.EpF();e.TgZ(0,"cd-alert-panel",1),e.NdJ("dismissed",function(){return e.CHM(t),e.oxw().onDismissed()}),e.YNc(1,eM,4,0,"div",2),e.YNc(2,IE,4,1,"div",2),e.qZA()}if(2&n){const t=e.oxw();e.Q6J("type",t.alertType)("showTitle",!1)("dismissible","danger"!==t.alertType),e.xp6(1),e.Q6J("ngIf",0===t.expirationDays),e.xp6(1),e.Q6J("ngIf",t.expirationDays>0)}}let nM=(()=>{class n{constructor(t,o){this.settingsService=t,this.authStorageService=o,this.displayNotification=!1}ngOnInit(){this.settingsService.getStandardSettings().subscribe(t=>{this.pwdExpirationSettings=new qC.G(t);const o=this.authStorageService.getPwdExpirationDate();o&&(this.expirationDays=this.getExpirationDays(o),this.alertType=this.expirationDays<=this.pwdExpirationSettings.pwdExpirationWarning2?"danger":"warning",this.displayNotification=this.expirationDays<=this.pwdExpirationSettings.pwdExpirationWarning1,this.authStorageService.isPwdDisplayedSource.next(this.displayNotification))})}ngOnDestroy(){this.authStorageService.isPwdDisplayedSource.next(!1)}getExpirationDays(t){const o=new Date,c=new Date(1e3*t);return Math.floor((c.valueOf()-o.valueOf())/864e5)}onDismissed(){this.authStorageService.isPwdDisplayedSource.next(!1),this.displayNotification=!1}}return n.\u0275fac=function(t){return new(t||n)(e.Y36(L1.g),e.Y36(_t.j))},n.\u0275cmp=e.Xpm({type:n,selectors:[["cd-pwd-expiration-notification"]],decls:1,vars:1,consts:function(){let s,t;return s="Your password will expire in " + "\ufffd#2\ufffd" + "less than 1" + "\ufffd/#2\ufffd" + " day. Click " + "\ufffd#3\ufffd" + "here" + "\ufffd/#3\ufffd" + " to change it now.",t="Your password will expire in " + "\ufffd#2\ufffd" + "" + "\ufffd0\ufffd" + "" + "\ufffd/#2\ufffd" + " day(s). Click " + "\ufffd#3\ufffd" + "here" + "\ufffd/#3\ufffd" + " to change it now.",[["class","no-margin-bottom","size","slim",3,"type","showTitle","dismissible","dismissed",4,"ngIf"],["size","slim",1,"no-margin-bottom",3,"type","showTitle","dismissible","dismissed"],[4,"ngIf"],s,["routerLink","/user-profile/edit",1,"alert-link"],t]},template:function(t,o){1&t&&e.YNc(0,tM,3,5,"cd-alert-panel",0),2&t&&e.Q6J("ngIf",o.displayNotification)},directives:[_.O5,Jt.G,Yo.yS],styles:[".no-margin-bottom[_ngcontent-%COMP%]{margin-bottom:0}"]}),n})();function mw(n,s){if(1&n){const t=e.EpF();e.TgZ(0,"cd-alert-panel",1),e.NdJ("dismissed",function(){return e.CHM(t),e.oxw().onDismissed()}),e.TgZ(1,"div"),e.tHW(2,2),e._UZ(3,"a",3),e._UZ(4,"a",4),e.N_p(),e.qZA(),e.qZA()}if(2&n){const t=e.oxw();e.Q6J("showTitle",!1)("type",t.notificationSeverity)("dismissible","danger"!==t.notificationSeverity)}}let LE=(()=>{class n{constructor(t,o,c,g){this.mgrModuleService=t,this.authStorageService=o,this.notificationService=c,this.telemetryNotificationService=g,this.displayNotification=!1,this.notificationSeverity="warning"}ngOnInit(){if(this.telemetryNotificationService.update.subscribe(t=>{this.displayNotification=t}),!this.isNotificationHidden()){const t=this.authStorageService.getPermissions().configOpt;Ar().every(Object.values(t))&&this.mgrModuleService.getConfig("telemetry").subscribe(o=>{o.enabled||this.telemetryNotificationService.setVisibility(!0)})}}ngOnDestroy(){this.telemetryNotificationService.setVisibility(!1)}isNotificationHidden(){return"true"===localStorage.getItem("telemetry_notification_hidden")}onDismissed(){this.telemetryNotificationService.setVisibility(!1),localStorage.setItem("telemetry_notification_hidden","true"),this.notificationService.show(_a.k.success,"Telemetry activation reminder muted","You can activate the module on the Telemetry configuration page (<b>Dashboard Settings</b> -> <b>Telemetry configuration</b>) at any time.")}}return n.\u0275fac=function(t){return new(t||n)(e.Y36(Bc.N),e.Y36(_t.j),e.Y36(ll.g),e.Y36(rE))},n.\u0275cmp=e.Xpm({type:n,selectors:[["cd-telemetry-notification"]],decls:1,vars:1,consts:function(){let s;return s="The Ceph community needs your help to continue improving: please " + "\ufffd#3\ufffd" + "Activate" + "[\ufffd/#3\ufffd|\ufffd/#4\ufffd]" + " the " + "\ufffd#4\ufffd" + "Telemetry" + "[\ufffd/#3\ufffd|\ufffd/#4\ufffd]" + " module.",s=e.Zx4(s),[["class","no-margin-bottom","size","slim",3,"showTitle","type","dismissible","dismissed",4,"ngIf"],["size","slim",1,"no-margin-bottom",3,"showTitle","type","dismissible","dismissed"],s,["routerLink","/telemetry",1,"btn","activate-button","alert-link","activate-text"],["href","https://docs.ceph.com/en/latest/mgr/telemetry/"]]},template:function(t,o){1&t&&e.YNc(0,mw,5,3,"cd-alert-panel",0),2&t&&e.Q6J("ngIf",o.displayNotification)},directives:[_.O5,Jt.G,Yo.yS],styles:[".no-margin-bottom[_ngcontent-%COMP%]{margin-bottom:0}.activate-button[_ngcontent-%COMP%]{background-color:#fcecba;border:#495057 solid .5px;border-radius:10%;padding:.1rem .4rem}.activate-text[_ngcontent-%COMP%]{color:#495057;font-weight:bold}"]}),n})();var FE=i(60793);function rM(n,s){if(1&n){const t=e.EpF();e.TgZ(0,"cd-alert-panel",1),e.NdJ("dismissed",function(){return e.CHM(t),e.oxw().onDismissed()}),e._UZ(1,"span",2),e.ALo(2,"sanitizeHtml"),e.qZA()}if(2&n){const t=e.oxw();e.Q6J("showTitle",!1)("type",t.motd.severity)("dismissible","danger"!==t.motd.severity),e.xp6(1),e.Q6J("innerHTML",e.lcZ(2,4,t.motd.message),e.oJD)}}let kE=(()=>{class n{constructor(t){this.motdNotificationService=t,this.motd=void 0}ngOnInit(){this.subscription=this.motdNotificationService.motd$.subscribe(t=>{this.motd=t})}ngOnDestroy(){this.subscription.unsubscribe()}onDismissed(){this.motdNotificationService.hide()}}return n.\u0275fac=function(t){return new(t||n)(e.Y36(xy))},n.\u0275cmp=e.Xpm({type:n,selectors:[["cd-motd"]],decls:1,vars:1,consts:[["size","slim",3,"showTitle","type","dismissible","dismissed",4,"ngIf"],["size","slim",3,"showTitle","type","dismissible","dismissed"],[3,"innerHTML"]],template:function(t,o){1&t&&e.YNc(0,rM,3,6,"cd-alert-panel",0),2&t&&e.Q6J("ngIf",o.motd)},directives:[_.O5,Jt.G],pipes:[FE.A],styles:[""]}),n})();class yw{constructor(s){if(this._maxConcurrency=s,this._queue=[],s<=0)throw new Error("semaphore must be initialized to a positive value");this._value=s}acquire(){const s=this.isLocked(),t=new Promise(o=>this._queue.push(o));return s||this._dispatch(),t}runExclusive(s){return function(n,s,t,o){return new(t||(t=Promise))(function(g,C){function D(W){try{j(o.next(W))}catch(re){C(re)}}function P(W){try{j(o.throw(W))}catch(re){C(re)}}function j(W){W.done?g(W.value):function(g){return g instanceof t?g:new t(function(C){C(g)})}(W.value).then(D,P)}j((o=o.apply(n,s||[])).next())})}(this,void 0,void 0,function*(){const[t,o]=yield this.acquire();try{return yield s(t)}finally{o()}})}isLocked(){return this._value<=0}release(){if(this._maxConcurrency>1)throw new Error("this method is unavailabel on semaphores with concurrency > 1; use the scoped release returned by acquire instead");this._currentReleaser&&(this._currentReleaser(),this._currentReleaser=void 0)}_dispatch(){const s=this._queue.shift();if(!s)return;let t=!1;this._currentReleaser=()=>{t||(t=!0,this._value++,this._dispatch())},s([this._value--,this._currentReleaser])}}class bw{constructor(){this._semaphore=new yw(1)}acquire(){return function(n,s,t,o){return new(t||(t=Promise))(function(g,C){function D(W){try{j(o.next(W))}catch(re){C(re)}}function P(W){try{j(o.throw(W))}catch(re){C(re)}}function j(W){W.done?g(W.value):function(g){return g instanceof t?g:new t(function(C){C(g)})}(W.value).then(D,P)}j((o=o.apply(n,s||[])).next())})}(this,void 0,void 0,function*(){const[,s]=yield this._semaphore.acquire();return s})}runExclusive(s){return this._semaphore.runExclusive(()=>s())}isLocked(){return this._semaphore.isLocked()}release(){this._semaphore.release()}}let iM=(()=>{class n{constructor(t,o){this.alertFormatter=t,this.prometheusService=o,this.backendFailure=!1,this.notifications=[]}refresh(){this.backendFailure||this.prometheusService.getNotifications(Ar().last(this.notifications)).subscribe(t=>this.handleNotifications(t),()=>this.backendFailure=!0)}handleNotifications(t){0!==t.length&&(this.notifications.length>0&&this.alertFormatter.sendNotifications(Ar().flatten(t.map(o=>this.formatNotification(o)))),this.notifications=this.notifications.concat(t))}formatNotification(t){return this.alertFormatter.convertToCustomAlerts(t.alerts).map(o=>this.alertFormatter.convertAlertToNotification(o))}}return n.\u0275fac=function(t){return new(t||n)(e.LFG(F1),e.LFG(rg))},n.\u0275prov=e.Yz7({token:n,factory:n.\u0275fac,providedIn:"root"}),n})();var oM=i(68879),sM=i(11971),aM=i(34863);const UE=function(n,s){return[n,s]},kv=function(n,s,t,o){return[n,s,t,o]};function wR(n,s){if(1&n&&(e.TgZ(0,"div"),e.TgZ(1,"div",12),e.TgZ(2,"div",13),e.TgZ(3,"div",14),e.TgZ(4,"span",15),e._UZ(5,"i",7),e._UZ(6,"i",7),e.qZA(),e.qZA(),e.TgZ(7,"div",16),e.TgZ(8,"div",17),e.TgZ(9,"h6",18),e._uU(10),e.qZA(),e.TgZ(11,"div",19),e._UZ(12,"ngb-progressbar",20),e.qZA(),e.TgZ(13,"p",21),e.TgZ(14,"small",22),e._uU(15),e.ALo(16,"cdDate"),e.qZA(),e.TgZ(17,"span",23),e._uU(18),e.qZA(),e.qZA(),e.qZA(),e.qZA(),e.qZA(),e.qZA(),e._UZ(19,"hr"),e.qZA()),2&n){const t=s.$implicit,o=e.oxw(2);e.xp6(4),e.Q6J("ngClass",e.WLB(11,UE,o.icons.stack,o.icons.large2x)),e.xp6(1),e.Q6J("ngClass",e.WLB(14,UE,o.icons.stack2x,o.icons.circle)),e.xp6(1),e.Q6J("ngClass",e.l5B(17,kv,o.icons.stack1x,o.icons.spinner,o.icons.spin,o.icons.inverse)),e.xp6(4),e.Oqu(t.description),e.xp6(2),e.Q6J("value",null==t?null:t.progress)("striped",!0)("animated",!0),e.xp6(3),e.hij(" ",e.lcZ(16,9,t.begin_time)," "),e.xp6(3),e.hij(" ",t.progress||0," % ")}}function BE(n,s){if(1&n&&e.YNc(0,wR,20,22,"div",11),2&n){const t=e.oxw();e.Q6J("ngForOf",t.executingTasks)("ngForTrackBy",t.trackByFn)}}function Dy(n,s){if(1&n&&(e.ynx(0),e.TgZ(1,"small"),e.ynx(2),e.SDv(3,35),e.BQk(),e._uU(4),e.ALo(5,"duration"),e.qZA(),e._UZ(6,"br"),e.BQk()),2&n){const t=e.oxw().$implicit;e.xp6(4),e.hij(" ",e.lcZ(5,1,t.duration)," ")}}const lM=function(n,s,t){return[n,s,t]},im=function(n){return[n]};function Tw(n,s){if(1&n){const t=e.EpF();e.TgZ(0,"div",7),e.TgZ(1,"div",29),e.TgZ(2,"div",13),e.TgZ(3,"div",14),e.TgZ(4,"span",7),e._UZ(5,"i",7),e._UZ(6,"i",7),e.qZA(),e.qZA(),e.TgZ(7,"div",30),e.TgZ(8,"div",17),e.TgZ(9,"button",31),e.NdJ("click",function(c){const C=e.CHM(t).index;return e.oxw(3).remove(C),c.stopPropagation()}),e._UZ(10,"i",7),e.qZA(),e.TgZ(11,"h6",18),e._uU(12),e.qZA(),e._UZ(13,"p",32),e.TgZ(14,"p",21),e.YNc(15,Dy,7,3,"ng-container",24),e.TgZ(16,"small",33),e.ALo(17,"cdDate"),e._uU(18),e.ALo(19,"relativeDate"),e.qZA(),e._UZ(20,"i",34),e.qZA(),e.qZA(),e.qZA(),e.qZA(),e.qZA(),e._UZ(21,"hr"),e.qZA()}if(2&n){const t=s.$implicit,o=e.oxw(3);e.Q6J("ngClass",t.borderClass),e.xp6(4),e.Q6J("ngClass",e.kEZ(16,lM,o.icons.stack,o.icons.large2x,t.textClass)),e.xp6(1),e.Q6J("ngClass",e.WLB(20,UE,o.icons.circle,o.icons.stack2x)),e.xp6(1),e.Q6J("ngClass",e.kEZ(23,lM,o.icons.stack1x,o.icons.inverse,t.iconClass)),e.xp6(4),e.Q6J("ngClass",e.VKq(27,im,o.icons.trash)),e.xp6(2),e.Oqu(t.title),e.xp6(1),e.Q6J("innerHtml",t.message,e.oJD),e.xp6(2),e.Q6J("ngIf",t.duration),e.xp6(1),e.Q6J("title",e.lcZ(17,12,t.timestamp)),e.xp6(2),e.Oqu(e.lcZ(19,14,t.timestamp)),e.xp6(2),e.Q6J("ngClass",e.VKq(29,im,t.applicationClass))("title",t.application)}}function xR(n,s){if(1&n){const t=e.EpF();e.ynx(0),e.TgZ(1,"button",25),e.NdJ("click",function(c){return e.CHM(t),e.oxw(2).removeAll(),c.stopPropagation()}),e._UZ(2,"i",26),e._uU(3," \xa0 "),e.ynx(4),e.SDv(5,27),e.BQk(),e.qZA(),e._UZ(6,"hr"),e.YNc(7,Tw,22,31,"div",28),e.BQk()}if(2&n){const t=e.oxw(2);e.xp6(2),e.Q6J("ngClass",e.VKq(2,im,t.icons.trash)),e.xp6(5),e.Q6J("ngForOf",t.notifications)}}function Sw(n,s){if(1&n&&e.YNc(0,xR,8,4,"ng-container",24),2&n){const t=e.oxw();e.Q6J("ngIf",t.notifications.length>0)}}function sg(n,s){1&n&&(e.TgZ(0,"div"),e.TgZ(1,"div",36),e.SDv(2,37),e.qZA(),e.qZA())}function uM(n,s){if(1&n&&e.YNc(0,sg,3,0,"div",24),2&n){const t=e.oxw();e.Q6J("ngIf",0===t.notifications.length&&0===t.executingTasks.length)}}function DR(n,s){1&n&&e.GkF(0)}function Ry(n,s){1&n&&e.GkF(0)}function Cw(n,s){1&n&&e.GkF(0)}let Mw=(()=>{class n{constructor(t,o,c,g,C,D,P,j){this.notificationService=t,this.summaryService=o,this.taskMessageService=c,this.prometheusNotificationService=g,this.authStorageService=C,this.prometheusAlertService=D,this.ngZone=P,this.cdRef=j,this.isSidebarOpened=!1,this.executingTasks=[],this.subs=new gu.w,this.icons=No.P,this.last_task="",this.mutex=new bw,this.simplebar={autoHide:!1},this.notifications=[]}ngOnDestroy(){window.clearInterval(this.interval),window.clearTimeout(this.timeout),this.subs.unsubscribe()}ngOnInit(){this.last_task=window.localStorage.getItem("last_task");const t=this.authStorageService.getPermissions();t.prometheus.read&&t.configOpt.read&&(this.triggerPrometheusAlerts(),this.ngZone.runOutsideAngular(()=>{this.interval=window.setInterval(()=>{this.ngZone.run(()=>{this.triggerPrometheusAlerts()})},5e3)})),this.subs.add(this.notificationService.data$.subscribe(o=>{this.notifications=Ar().orderBy(o,["timestamp"],["desc"]),this.cdRef.detectChanges()})),this.subs.add(this.notificationService.sidebarSubject.subscribe(o=>{this.isSidebarOpened=!o&&!this.isSidebarOpened,window.clearTimeout(this.timeout),this.timeout=window.setTimeout(()=>{this.cdRef.detectChanges()},0)})),this.subs.add(this.summaryService.subscribe(o=>{this._handleTasks(o.executing_tasks),this.mutex.acquire().then(c=>{Ar().filter(o.finished_tasks,g=>!this.last_task||oi()(g.end_time).isAfter(this.last_task)).forEach(g=>{const C=this.notificationService.finishedTaskToNotification(g,g.success),D=new wv.e(C);D.timestamp=g.end_time,D.duration=g.duration,(!this.last_task||oi()(g.end_time).isAfter(this.last_task))&&(this.last_task=g.end_time,window.localStorage.setItem("last_task",this.last_task)),this.notificationService.save(D)}),this.cdRef.detectChanges(),c()})}))}_handleTasks(t){for(const o of t)o.description=this.taskMessageService.getRunningTitle(o);this.executingTasks=t}triggerPrometheusAlerts(){this.prometheusAlertService.refresh(),this.prometheusNotificationService.refresh()}removeAll(){this.notificationService.removeAll()}remove(t){this.notificationService.remove(t)}closeSidebar(){this.isSidebarOpened=!1}trackByFn(t){return t}}return n.\u0275fac=function(t){return new(t||n)(e.Y36(ll.g),e.Y36(zm.J),e.Y36(oM.p),e.Y36(iM),e.Y36(_t.j),e.Y36(nm),e.Y36(e.R0b),e.Y36(e.sBO))},n.\u0275cmp=e.Xpm({type:n,selectors:[["cd-notifications-sidebar"]],hostVars:2,hostBindings:function(t,o){2&t&&e.ekj("active",o.isSidebarOpened)},decls:18,vars:6,consts:function(){let s,t,o,c,g;return s="Tasks and Notifications",t="Clear notifications",o="Remove notification",c="Duration:",g="There are no notifications.",[["tasksTpl",""],["notificationsTpl",""],["emptyTpl",""],[1,"card",3,"clickOutsideEnabled","clickOutside"],[1,"card-header"],s,["tabindex","-1","type","button",1,"close","float-right",3,"click"],[3,"ngClass"],[3,"options"],[1,"card-body"],[4,"ngTemplateOutlet"],[4,"ngFor","ngForOf","ngForTrackBy"],[1,"card","tc_task","border-0"],[1,"row","no-gutters"],[1,"col-md-2","text-center"],[1,"text-info",3,"ngClass"],[1,"col-md-9"],[1,"card-body","p-1"],[1,"card-title","bold"],[1,"mb-1"],["type","info",3,"value","striped","animated"],[1,"card-text","text-muted"],[1,"date","float-left"],[1,"float-right"],[4,"ngIf"],["type","button",1,"btn","btn-light","btn-block",3,"click"],["aria-hidden","true",3,"ngClass"],t,[3,"ngClass",4,"ngFor","ngForOf"],[1,"card","tc_notification","border-0"],[1,"col-md-10"],["title",o,1,"btn","btn-link","float-right","mt-0","pt-0",3,"click"],[1,"card-text",3,"innerHtml"],[1,"date",3,"title"],[1,"float-right","custom-icon",3,"ngClass","title"],c,[1,"message","text-center"],g]},template:function(t,o){if(1&t&&(e.YNc(0,BE,1,2,"ng-template",null,0,e.W1O),e.YNc(2,Sw,1,1,"ng-template",null,1,e.W1O),e.YNc(4,uM,1,1,"ng-template",null,2,e.W1O),e.TgZ(6,"div",3),e.NdJ("clickOutside",function(){return o.closeSidebar()}),e.TgZ(7,"div",4),e.ynx(8),e.SDv(9,5),e.BQk(),e.TgZ(10,"button",6),e.NdJ("click",function(){return o.closeSidebar()}),e.TgZ(11,"span"),e._UZ(12,"i",7),e.qZA(),e.qZA(),e.qZA(),e.TgZ(13,"ngx-simplebar",8),e.TgZ(14,"div",9),e.YNc(15,DR,1,0,"ng-container",10),e.YNc(16,Ry,1,0,"ng-container",10),e.YNc(17,Cw,1,0,"ng-container",10),e.qZA(),e.qZA(),e.qZA()),2&t){const c=e.MAs(1),g=e.MAs(3),C=e.MAs(5);e.xp6(6),e.Q6J("clickOutsideEnabled",o.isSidebarOpened),e.xp6(6),e.Q6J("ngClass",o.icons.close),e.xp6(1),e.Q6J("options",o.simplebar),e.xp6(2),e.Q6J("ngTemplateOutlet",c),e.xp6(1),e.Q6J("ngTemplateOutlet",g),e.xp6(1),e.Q6J("ngTemplateOutlet",C)}},directives:[sM._,ca.o,_.mk,aM.M,_.tP,_.sg,lt.Ly,_.O5],pipes:[Vl.N,bt.h,io.u],styles:["[_nghost-%COMP%]{bottom:10px;max-width:90vw;position:fixed;right:-350px;top:53px;transition:all .6s;width:350px;z-index:9}.active[_nghost-%COMP%]{right:20px}.card[_ngcontent-%COMP%]{height:100%}.card-body[_ngcontent-%COMP%]{padding-left:0;padding-right:5px;padding-top:3px}ngx-simplebar[_ngcontent-%COMP%]{height:calc(100% - 42.2px)}.separator[_ngcontent-%COMP%]{background-color:#e9ecef;color:#6c757d;font-size:1rem;padding:5px 12px}.btn-block[_ngcontent-%COMP%]{width:98%}.btn-link[_ngcontent-%COMP%]   .fa-trash-o[_ngcontent-%COMP%]{color:#000}table[_ngcontent-%COMP%]{width:100%}.row[_ngcontent-%COMP%]{margin-left:0;margin-right:0;padding-bottom:1rem;padding-top:1rem}hr[_ngcontent-%COMP%]{margin-bottom:2px;margin-top:2px}.card-text[_ngcontent-%COMP%]{margin-right:15px}"],changeDetection:0}),n})();function RR(n,s){1&n&&e._UZ(0,"span",5)}const Aw=function(n){return{running:n}},Ow=function(n){return[n]};let ww=(()=>{class n{constructor(t,o){this.notificationService=t,this.summaryService=o,this.icons=No.P,this.hasRunningTasks=!1,this.hasNotifications=!1,this.subs=new gu.w}ngOnInit(){this.subs.add(this.summaryService.subscribe(t=>{this.hasRunningTasks=t.executing_tasks.length>0})),this.subs.add(this.notificationService.data$.subscribe(t=>{this.hasNotifications=t.length>0}))}ngOnDestroy(){this.subs.unsubscribe()}toggleSidebar(){this.notificationService.toggleSidebar()}}return n.\u0275fac=function(t){return new(t||n)(e.Y36(ll.g),e.Y36(zm.J))},n.\u0275cmp=e.Xpm({type:n,selectors:[["cd-notifications"]],decls:5,vars:7,consts:function(){let s,t;return s="Tasks and Notifications",t="Tasks and Notifications",[["title",s,3,"ngClass","click"],[3,"ngClass"],["class","dot",4,"ngIf"],[1,"d-md-none"],t,[1,"dot"]]},template:function(t,o){1&t&&(e.TgZ(0,"a",0),e.NdJ("click",function(){return o.toggleSidebar()}),e._UZ(1,"i",1),e.YNc(2,RR,1,0,"span",2),e.TgZ(3,"span",3),e.SDv(4,4),e.qZA(),e.qZA()),2&t&&(e.Q6J("ngClass",e.VKq(3,Aw,o.hasRunningTasks)),e.xp6(1),e.Q6J("ngClass",e.VKq(5,Ow,o.icons.bell)),e.xp6(1),e.Q6J("ngIf",o.hasNotifications))},directives:[_.mk,_.O5],styles:[".running[_ngcontent-%COMP%]   i[_ngcontent-%COMP%]{color:#2b99a8}.running[_ngcontent-%COMP%]:hover   i[_ngcontent-%COMP%]{color:#fff}a[_ngcontent-%COMP%]   .dot[_ngcontent-%COMP%]{background-color:#2b99a8;border:2px solid #374249;border-radius:50%;height:11px;position:absolute;right:17px;top:10px;width:10px}a[_ngcontent-%COMP%]:hover   .dot[_ngcontent-%COMP%]{background-color:#fff;border-color:#2b99a8}"]}),n})(),YE=(()=>{class n{constructor(t){this.http=t,this.baseUIURL="api/feedback"}isKeyExist(){return this.http.get("ui-api/feedback/api_key/exist")}createIssue(t,o,c,g,C){return this.http.post("api/feedback",{project:t,tracker:o,subject:c,description:g,api_key:C},{headers:{Accept:"application/vnd.ceph.api.v0.1+json"}})}}return n.\u0275fac=function(t){return new(t||n)(e.LFG(y.eN))},n.\u0275prov=e.Yz7({token:n,factory:n.\u0275fac,providedIn:"root"}),n})();function cM(n,s){if(1&n){const t=e.EpF();e.TgZ(0,"cd-alert-panel",30),e.tHW(1,31),e.TgZ(2,"a",32),e.NdJ("click",function(){return e.CHM(t),e.oxw().redirect()}),e.qZA(),e.N_p(),e.qZA()}}function dM(n,s){1&n&&(e.TgZ(0,"span",36),e.SDv(1,37),e.qZA())}function fM(n,s){1&n&&(e.TgZ(0,"span",36),e.SDv(1,38),e.qZA())}function xw(n,s){if(1&n&&(e.TgZ(0,"div",9),e.TgZ(1,"label",33),e.SDv(2,34),e.qZA(),e.TgZ(3,"div",12),e._UZ(4,"input",35),e.YNc(5,dM,2,0,"span",17),e.YNc(6,fM,2,0,"span",17),e.qZA(),e.qZA()),2&n){const t=e.oxw(),o=e.MAs(5);e.xp6(5),e.Q6J("ngIf",t.feedbackForm.showError("api_key",o,"required")),e.xp6(1),e.Q6J("ngIf",t.feedbackForm.showError("api_key",o,"invalidApiKey"))}}function NR(n,s){if(1&n&&(e.TgZ(0,"option",39),e._uU(1),e.qZA()),2&n){const t=s.$implicit;e.Q6J("value",t),e.xp6(1),e.Oqu(t)}}function Dw(n,s){1&n&&(e.TgZ(0,"span",36),e.SDv(1,40),e.qZA())}function Rw(n,s){if(1&n&&(e.TgZ(0,"option",39),e._uU(1),e.qZA()),2&n){const t=s.$implicit;e.Q6J("value",t),e.xp6(1),e.Oqu(t)}}function Nw(n,s){1&n&&(e.TgZ(0,"span",36),e.SDv(1,41),e.qZA())}function pM(n,s){1&n&&(e.TgZ(0,"span",36),e.SDv(1,42),e.qZA())}function hM(n,s){1&n&&(e.TgZ(0,"span",36),e.SDv(1,43),e.qZA())}let _M=(()=>{class n{constructor(t,o,c,g,C,D){this.feedbackService=t,this.activeModal=o,this.actionLabels=c,this.secondaryModal=g,this.notificationService=C,this.router=D,this.title="Feedback",this.project=["dashboard","block","objects","file_system","ceph_manager","orchestrator","ceph_volume","core_ceph"],this.tracker=["bug","feature"],this.isAPIKeySet=!1,this.isFeedbackEnabled=!0}ngOnInit(){this.createForm(),this.keySub=this.feedbackService.isKeyExist().subscribe({next:t=>{this.isAPIKeySet=t,this.isAPIKeySet&&this.feedbackForm.get("api_key").clearValidators()},error:()=>{this.isFeedbackEnabled=!1,this.feedbackForm.disable()}})}createForm(){this.feedbackForm=new Us.d({project:new vn.NI("",vn.kI.required),tracker:new vn.NI("",vn.kI.required),subject:new vn.NI("",vn.kI.required),description:new vn.NI("",vn.kI.required),api_key:new vn.NI("",vn.kI.required)})}ngOnDestroy(){this.keySub.unsubscribe()}onSubmit(){this.feedbackService.createIssue(this.feedbackForm.controls.project.value,this.feedbackForm.controls.tracker.value,this.feedbackForm.controls.subject.value,this.feedbackForm.controls.description.value,this.feedbackForm.controls.api_key.value).subscribe({next:t=>{this.notificationService.show(_a.k.success,"Issue successfully created on Ceph Issue tracker",`Go to the tracker: <a href="https://tracker.ceph.com/issues/${t.message.issue.id}" target="_blank"> ${t.message.issue.id} </a>`)},error:()=>{this.feedbackForm.get("api_key").setErrors({invalidApiKey:!0}),this.feedbackForm.setErrors({cdSubmitButton:!0})},complete:()=>{this.activeModal.close()}})}redirect(){this.activeModal.close(),this.router.navigate(["/mgr-modules"])}}return n.\u0275fac=function(t){return new(t||n)(e.Y36(YE),e.Y36(lt.Kz),e.Y36(ki.p4),e.Y36(lt.FF),e.Y36(ll.g),e.Y36(Yo.F0))},n.\u0275cmp=e.Xpm({type:n,selectors:[["cd-feedback"]],decls:42,vars:12,consts:function(){let s,t,o,c,g,C,D,P,j,W,re,ie,ge,_e,Le;return s="Report an issue",t="Project name",o="-- Select a project --",c="Tracker",g="-- Select a tracker --",C="Subject",D="Description",P="Feedback module is not enabled. Please enable it from " + "\ufffd#2\ufffd" + "Cluster-> Manager Modules." + "\ufffd/#2\ufffd" + "",j="Ceph Tracker API Key",W="Ceph Tracker API key is required.",re="Ceph Tracker API key is invalid.",ie="Project name is required.",ge="Tracker name is required.",_e="Subject is required.",Le="Description is required.",[[3,"modalRef"],[1,"modal-title"],s,[1,"modal-content"],["name","feedbackForm",3,"formGroup"],["formDir","ngForm"],[1,"modal-body"],["type","error",4,"ngIf"],["class","form-group row",4,"ngIf"],[1,"form-group","row"],["for","project",1,"cd-col-form-label","required"],t,[1,"cd-col-form-input"],["id","project","formControlName","project",1,"form-control"],["ngValue",""],o,[3,"value",4,"ngFor","ngForOf"],["class","invalid-feedback",4,"ngIf"],["for","tracker",1,"cd-col-form-label","required"],c,["id","tracker","formControlName","tracker",1,"form-control"],g,["for","subject",1,"cd-col-form-label","required"],C,["id","subject","type","text","formControlName","subject","placeholder","Add issue title",1,"form-control"],["for","description",1,"cd-col-form-label","required"],D,["id","description","type","text","formControlName","description","placeholder","Add issue description",1,"form-control"],[1,"modal-footer"],["wrappingClass","text-right",3,"form","submitText","submitActionEvent"],["type","error"],P,[3,"click"],["for","api_key",1,"cd-col-form-label","required"],j,["id","api_key","type","password","formControlName","api_key","placeholder","Add Ceph tracker API key",1,"form-control"],[1,"invalid-feedback"],W,re,[3,"value"],ie,ge,_e,Le]},template:function(t,o){if(1&t&&(e.TgZ(0,"cd-modal",0),e.TgZ(1,"div",1),e.SDv(2,2),e.qZA(),e.TgZ(3,"div",3),e.TgZ(4,"form",4,5),e.TgZ(6,"div",6),e.YNc(7,cM,3,0,"cd-alert-panel",7),e.YNc(8,xw,7,2,"div",8),e.TgZ(9,"div",9),e.TgZ(10,"label",10),e.SDv(11,11),e.qZA(),e.TgZ(12,"div",12),e.TgZ(13,"select",13),e.TgZ(14,"option",14),e.SDv(15,15),e.qZA(),e.YNc(16,NR,2,2,"option",16),e.qZA(),e.YNc(17,Dw,2,0,"span",17),e.qZA(),e.qZA(),e.TgZ(18,"div",9),e.TgZ(19,"label",18),e.SDv(20,19),e.qZA(),e.TgZ(21,"div",12),e.TgZ(22,"select",20),e.TgZ(23,"option",14),e.SDv(24,21),e.qZA(),e.YNc(25,Rw,2,2,"option",16),e.qZA(),e.YNc(26,Nw,2,0,"span",17),e.qZA(),e.qZA(),e.TgZ(27,"div",9),e.TgZ(28,"label",22),e.SDv(29,23),e.qZA(),e.TgZ(30,"div",12),e._UZ(31,"input",24),e.YNc(32,pM,2,0,"span",17),e.qZA(),e.qZA(),e.TgZ(33,"div",9),e.TgZ(34,"label",25),e.SDv(35,26),e.qZA(),e.TgZ(36,"div",12),e.TgZ(37,"textarea",27),e._uU(38,"            "),e.qZA(),e.YNc(39,hM,2,0,"span",17),e.qZA(),e.qZA(),e.qZA(),e.TgZ(40,"div",28),e.TgZ(41,"cd-form-button-panel",29),e.NdJ("submitActionEvent",function(){return o.onSubmit()}),e.qZA(),e.qZA(),e.qZA(),e.qZA(),e.qZA()),2&t){const c=e.MAs(5);e.Q6J("modalRef",o.activeModal),e.xp6(4),e.Q6J("formGroup",o.feedbackForm),e.xp6(3),e.Q6J("ngIf",!o.isFeedbackEnabled),e.xp6(1),e.Q6J("ngIf",!o.isAPIKeySet),e.xp6(8),e.Q6J("ngForOf",o.project),e.xp6(1),e.Q6J("ngIf",o.feedbackForm.showError("project",c,"required")),e.xp6(8),e.Q6J("ngForOf",o.tracker),e.xp6(1),e.Q6J("ngIf",o.feedbackForm.showError("tracker",c,"required")),e.xp6(6),e.Q6J("ngIf",o.feedbackForm.showError("subject",c,"required")),e.xp6(7),e.Q6J("ngIf",o.feedbackForm.showError("description",c,"required")),e.xp6(2),e.Q6J("form",o.feedbackForm)("submitText",o.actionLabels.SUBMIT)}},directives:[h.z,vn._Y,vn.JL,tl.V,vn.sg,_.O5,$a.P,ca.o,vn.EJ,Ha.b,vn.JJ,vn.u,vn.YN,vn.Kr,_.sg,vn.Fj,nl.p,Jt.G],styles:[""]}),n})();var Pw=i(97057);let Iw=(()=>{class n{constructor(t,o,c,g){this.activeModal=t,this.summaryService=o,this.userService=c,this.authStorageService=g,this.userPermission=this.authStorageService.getPermissions().user}ngOnInit(){this.projectConstants=ki.$x,this.hostAddr=window.location.hostname,this.modalVariables=this.setVariables(),this.subs=this.summaryService.subscribe(t=>{const o=t.version.replace("ceph version ","").split(" ");this.hostAddr=t.mgr_host.replace(/(^\w+:|^)\/\//,"").replace(/\/$/,""),this.versionNumber=o[0],this.versionHash=o[1],this.versionName=o.slice(2,o.length).join(" ")})}ngOnDestroy(){this.subs.unsubscribe()}setVariables(){const t={};t.user=localStorage.getItem("dashboard_username"),t.role="user",this.userPermission.read&&this.userService.get(t.user).subscribe(c=>{t.role=c.roles});const o=(0,Pw.qY)();return t.browserName=o&&o.name?o.name:"Not detected",t.browserVersion=o&&o.version?o.version:"Not detected",t.browserOS=o&&o.os?o.os:"Not detected",t}}return n.\u0275fac=function(t){return new(t||n)(e.Y36(lt.Kz),e.Y36(zm.J),e.Y36(xE.K),e.Y36(_t.j))},n.\u0275cmp=e.Xpm({type:n,selectors:[["cd-about"]],decls:46,vars:13,consts:[[1,"about-container"],[1,"modal-header"],["type","button","aria-label","Close",1,"close","float-right",3,"click"],["aria-hidden","true"],[1,"modal-body"],["src","assets/Ceph_Ceph_Logo_with_text_red_white.svg",1,"ceph-logo",3,"alt"],[1,"product-versions"],[1,"modal-footer"],[1,"text-left"]],template:function(t,o){1&t&&(e.TgZ(0,"div",0),e.TgZ(1,"div",1),e.TgZ(2,"button",2),e.NdJ("click",function(){return o.activeModal.close()}),e.TgZ(3,"span",3),e._uU(4,"\xd7"),e.qZA(),e.qZA(),e.qZA(),e.TgZ(5,"div",4),e._UZ(6,"img",5),e.TgZ(7,"h3"),e.TgZ(8,"strong"),e._uU(9),e.qZA(),e.qZA(),e.TgZ(10,"div",6),e.TgZ(11,"strong"),e._uU(12,"Version"),e.qZA(),e._UZ(13,"br"),e._uU(14),e._UZ(15,"br"),e._uU(16),e.qZA(),e._UZ(17,"br"),e.TgZ(18,"dl"),e.TgZ(19,"dt"),e._uU(20,"Ceph Manager"),e.qZA(),e.TgZ(21,"dd"),e._uU(22),e.qZA(),e.TgZ(23,"dt"),e._uU(24,"User"),e.qZA(),e.TgZ(25,"dd"),e._uU(26),e.qZA(),e.TgZ(27,"dt"),e._uU(28,"User Role"),e.qZA(),e.TgZ(29,"dd"),e._uU(30),e.qZA(),e.TgZ(31,"dt"),e._uU(32,"Browser"),e.qZA(),e.TgZ(33,"dd"),e._uU(34),e.qZA(),e.TgZ(35,"dt"),e._uU(36,"Browser Version"),e.qZA(),e.TgZ(37,"dd"),e._uU(38),e.qZA(),e.TgZ(39,"dt"),e._uU(40,"Browser OS"),e.qZA(),e.TgZ(41,"dd"),e._uU(42),e.qZA(),e.qZA(),e.qZA(),e.TgZ(43,"div",7),e.TgZ(44,"div",8),e._uU(45),e.qZA(),e.qZA(),e.qZA()),2&t&&(e.xp6(6),e.s9C("alt",o.projectConstants.organization),e.xp6(3),e.Oqu(o.projectConstants.projectName),e.xp6(5),e.AsE(" ",o.versionNumber," ",o.versionHash," "),e.xp6(2),e.hij(" ",o.versionName," "),e.xp6(6),e.Oqu(o.hostAddr),e.xp6(4),e.Oqu(o.modalVariables.user),e.xp6(4),e.Oqu(o.modalVariables.role),e.xp6(4),e.Oqu(o.modalVariables.browserName),e.xp6(4),e.Oqu(o.modalVariables.browserVersion),e.xp6(4),e.Oqu(o.modalVariables.browserOS),e.xp6(3),e.AsE(" ",o.projectConstants.copyright," ",o.projectConstants.license," "))},directives:[ca.o],styles:[".about-container[_ngcontent-%COMP%]{background-color:#374249;background-image:url(ceph_background.e82dd79127290ddbe8cb.gif);background-position:right bottom;background-repeat:no-repeat;color:#fff;text-shadow:1px 1px #374249}.product-versions[_ngcontent-%COMP%]{margin-top:30px}.product-versions[_ngcontent-%COMP%]   strong[_ngcontent-%COMP%]{margin-right:10px}.modal-header[_ngcontent-%COMP%]{border-bottom:0}.modal-header[_ngcontent-%COMP%]   .close[_ngcontent-%COMP%]{color:#fff;font-size:2em}.modal-body[_ngcontent-%COMP%]{padding-left:80px;padding-right:80px}.ceph-logo[_ngcontent-%COMP%]{margin-bottom:30px;width:25%}.modal-footer[_ngcontent-%COMP%]{border-top:0;display:block;padding:15px 80px 35px}"]}),n})();const gM=function(n){return[n]},Ny=function(n){return{disabled:n}};let Lw=(()=>{class n{constructor(t,o){this.modalService=t,this.docService=o,this.icons=No.P}ngOnInit(){this.docService.subscribeOnce("dashboard",t=>{this.docsUrl=t})}openAboutModal(){this.modalRef=this.modalService.show(Iw,null,{size:"lg"})}openFeedbackModal(){this.bsModalRef=this.modalService.show(_M,null,{size:"lg"})}}return n.\u0275fac=function(t){return new(t||n)(e.Y36(Ul.Z),e.Y36(ZC.R))},n.\u0275cmp=e.Xpm({type:n,selectors:[["cd-dashboard-help"]],decls:14,vars:7,consts:function(){let s,t,o,c,g,C;return s="Help",t="Help",o="documentation",c="API",g="About",C="Report an issue...",[["ngbDropdown","","placement","bottom-right"],["ngbDropdownToggle","","title",s],[3,"ngClass"],[1,"d-md-none"],t,["ngbDropdownMenu",""],["ngbDropdownItem","","target","_blank",1,"text-capitalize",3,"ngClass","href"],o,["ngbDropdownItem","","routerLink","/api-docs","target","_blank"],c,["ngbDropdownItem","",3,"click"],g,C]},template:function(t,o){1&t&&(e.TgZ(0,"div",0),e.TgZ(1,"a",1),e._UZ(2,"i",2),e.TgZ(3,"span",3),e.SDv(4,4),e.qZA(),e.qZA(),e.TgZ(5,"div",5),e.TgZ(6,"a",6),e.SDv(7,7),e.qZA(),e.TgZ(8,"a",8),e.SDv(9,9),e.qZA(),e.TgZ(10,"button",10),e.NdJ("click",function(){return o.openAboutModal()}),e.SDv(11,11),e.qZA(),e.TgZ(12,"button",10),e.NdJ("click",function(){return o.openFeedbackModal()}),e.SDv(13,12),e.qZA(),e.qZA(),e.qZA()),2&t&&(e.xp6(2),e.Q6J("ngClass",e.VKq(3,gM,o.icons.questionCircle)),e.xp6(4),e.s9C("href",o.docsUrl,e.LSH),e.Q6J("ngClass",e.VKq(5,Ny,!o.docsUrl)))},directives:[lt.jt,lt.iD,_.mk,lt.Vi,lt.TH,Yo.yS,ca.o],styles:[""]}),n})();function mM(n,s){1&n&&(e.TgZ(0,"button",9),e.SDv(1,10),e.qZA())}function Py(n,s){1&n&&(e.TgZ(0,"button",11),e.SDv(1,12),e.qZA())}const Iy=function(n){return[n]};function Z1(n,s){if(1&n&&(e.TgZ(0,"div",1),e.TgZ(1,"a",2),e._UZ(2,"i",3),e.TgZ(3,"span",4),e.SDv(4,5),e.qZA(),e.qZA(),e.TgZ(5,"div",6),e.YNc(6,mM,2,0,"button",7),e.YNc(7,Py,2,0,"button",8),e.qZA(),e.qZA()),2&n){const t=e.oxw();e.xp6(2),e.Q6J("ngClass",e.VKq(3,Iy,t.icons.deepCheck)),e.xp6(4),e.Q6J("ngIf",t.userPermission.read),e.xp6(1),e.Q6J("ngIf",t.configOptPermission.read)}}let Fw=(()=>{class n{constructor(t){this.authStorageService=t,this.icons=No.P;const o=this.authStorageService.getPermissions();this.userPermission=o.user,this.configOptPermission=o.configOpt}}return n.\u0275fac=function(t){return new(t||n)(e.Y36(_t.j))},n.\u0275cmp=e.Xpm({type:n,selectors:[["cd-administration"]],decls:1,vars:1,consts:function(){let s,t,o,c;return s="Dashboard Settings",t="Dashboard Settings",o="User management",c="Telemetry configuration",[["ngbDropdown","","placement","bottom-right",4,"ngIf"],["ngbDropdown","","placement","bottom-right"],["ngbDropdownToggle","","title",s,1,"dropdown-toggle"],[3,"ngClass"],[1,"d-md-none"],t,["ngbDropdownMenu",""],["ngbDropdownItem","","routerLink","/user-management",4,"ngIf"],["ngbDropdownItem","","routerLink","/telemetry",4,"ngIf"],["ngbDropdownItem","","routerLink","/user-management"],o,["ngbDropdownItem","","routerLink","/telemetry"],c]},template:function(t,o){1&t&&e.YNc(0,Z1,8,5,"div",0),2&t&&e.Q6J("ngIf",o.userPermission.read)},directives:[_.O5,lt.jt,lt.iD,_.mk,lt.Vi,ca.o,lt.TH,Yo.rH],styles:[""]}),n})();const ZE=function(n){return[n]};function PR(n,s){if(1&n&&(e.TgZ(0,"button",12),e._UZ(1,"i",2),e.TgZ(2,"span"),e.SDv(3,13),e.qZA(),e.qZA()),2&n){const t=e.oxw();e.xp6(1),e.Q6J("ngClass",e.VKq(1,ZE,t.icons.lock))}}let kw=(()=>{class n{constructor(t,o){this.authStorageService=t,this.authService=o,this.icons=No.P}ngOnInit(){this.username=this.authStorageService.getUsername(),this.sso=this.authStorageService.isSSO()}logout(){this.authService.logout()}}return n.\u0275fac=function(t){return new(t||n)(e.Y36(_t.j),e.Y36(Vm.e))},n.\u0275cmp=e.Xpm({type:n,selectors:[["cd-identity"]],decls:15,vars:8,consts:function(){let s,t,o,c,g;return s="Logged in user",t="Logged in user",o="Signed in as " + "\ufffd#8\ufffd" + "" + "\ufffd0\ufffd" + "" + "\ufffd/#8\ufffd" + "",c="Sign out",g="Change password",[["ngbDropdown","","placement","bottom-right"],["ngbDropdownToggle","","title",s],[3,"ngClass"],[1,"d-md-none"],t,["ngbDropdownMenu",""],["ngbDropdownItem","","disabled",""],o,[1,"dropdown-divider"],["ngbDropdownItem","","routerLink","/user-profile/edit",4,"ngIf"],["ngbDropdownItem","",3,"click"],c,["ngbDropdownItem","","routerLink","/user-profile/edit"],g]},template:function(t,o){1&t&&(e.TgZ(0,"div",0),e.TgZ(1,"a",1),e._UZ(2,"i",2),e.TgZ(3,"span",3),e.SDv(4,4),e.qZA(),e.qZA(),e.TgZ(5,"div",5),e.TgZ(6,"button",6),e.tHW(7,7),e._UZ(8,"strong"),e.N_p(),e.qZA(),e._UZ(9,"li",8),e.YNc(10,PR,4,3,"button",9),e.TgZ(11,"button",10),e.NdJ("click",function(){return o.logout()}),e._UZ(12,"i",2),e.TgZ(13,"span"),e.SDv(14,11),e.qZA(),e.qZA(),e.qZA(),e.qZA()),2&t&&(e.xp6(2),e.Q6J("ngClass",e.VKq(4,ZE,o.icons.user)),e.xp6(6),e.pQV(o.username),e.QtT(7),e.xp6(2),e.Q6J("ngIf",!o.sso),e.xp6(2),e.Q6J("ngClass",e.VKq(6,ZE,o.icons.signOut)))},directives:[lt.jt,lt.iD,_.mk,lt.Vi,ca.o,lt.TH,_.O5,Yo.rH],styles:[""]}),n})();function $w(n,s){1&n&&e.GkF(0)}function Hw(n,s){1&n&&e.GkF(0)}function Uw(n,s){if(1&n){const t=e.EpF();e.TgZ(0,"li",22),e._UZ(1,"cd-language-selector",23),e.qZA(),e.TgZ(2,"li",22),e.TgZ(3,"cd-notifications",24),e.NdJ("click",function(){return e.CHM(t),e.oxw().toggleRightSidebar()}),e.qZA(),e.qZA(),e.TgZ(4,"li",22),e._UZ(5,"cd-dashboard-help",23),e.qZA(),e.TgZ(6,"li",22),e._UZ(7,"cd-administration",23),e.qZA(),e.TgZ(8,"li",22),e._UZ(9,"cd-identity",23),e.qZA()}}function Bw(n,s){1&n&&(e.TgZ(0,"li",50),e.TgZ(1,"a",51),e.SDv(2,52),e.qZA(),e.qZA())}function Yw(n,s){1&n&&(e.TgZ(0,"li",53),e.TgZ(1,"a",54),e.SDv(2,55),e.qZA(),e.qZA())}function Zw(n,s){1&n&&(e.TgZ(0,"li",56),e.TgZ(1,"a",57),e.SDv(2,58),e.qZA(),e.qZA())}function jw(n,s){1&n&&(e.TgZ(0,"li",59),e.TgZ(1,"a",60),e.SDv(2,61),e.qZA(),e.qZA())}function Gw(n,s){1&n&&(e.TgZ(0,"li",62),e.TgZ(1,"a",63),e.SDv(2,64),e.qZA(),e.qZA())}function IR(n,s){1&n&&(e.TgZ(0,"li",65),e.TgZ(1,"a",66),e.SDv(2,67),e.qZA(),e.qZA())}function Vw(n,s){1&n&&(e.TgZ(0,"li",68),e.TgZ(1,"a",69),e.SDv(2,70),e.qZA(),e.qZA())}function j1(n,s){1&n&&(e.TgZ(0,"li",71),e.TgZ(1,"a",72),e.SDv(2,73),e.qZA(),e.qZA())}function zw(n,s){1&n&&(e.TgZ(0,"li",74),e.TgZ(1,"a",75),e.SDv(2,76),e.qZA(),e.qZA())}function Ww(n,s){if(1&n&&(e.TgZ(0,"small",82),e._uU(1),e.qZA()),2&n){const t=e.oxw(5);e.xp6(1),e.Oqu(t.prometheusAlertService.activeCriticalAlerts)}}function Jw(n,s){if(1&n&&(e.TgZ(0,"small",83),e._uU(1),e.qZA()),2&n){const t=e.oxw(5);e.xp6(1),e.Oqu(t.prometheusAlertService.activeWarningAlerts)}}function Ly(n,s){if(1&n&&(e.TgZ(0,"li",77),e.TgZ(1,"a",78),e.ynx(2),e.SDv(3,79),e.BQk(),e.YNc(4,Ww,2,1,"small",80),e.YNc(5,Jw,2,1,"small",81),e.qZA(),e.qZA()),2&n){const t=e.oxw(4);e.xp6(4),e.Q6J("ngIf",t.prometheusAlertService.activeCriticalAlerts>0),e.xp6(1),e.Q6J("ngIf",t.prometheusAlertService.activeWarningAlerts>0)}}function Wm(n,s){if(1&n){const t=e.EpF();e.TgZ(0,"li",36),e.TgZ(1,"a",37),e.NdJ("click",function(){return e.CHM(t),e.oxw(3).toggleSubMenu("cluster")}),e.ynx(2),e.SDv(3,38),e.BQk(),e.qZA(),e.TgZ(4,"ul",39),e.YNc(5,Bw,3,0,"li",40),e.YNc(6,Yw,3,0,"li",41),e.YNc(7,Zw,3,0,"li",42),e.YNc(8,jw,3,0,"li",43),e.YNc(9,Gw,3,0,"li",44),e.YNc(10,IR,3,0,"li",45),e.YNc(11,Vw,3,0,"li",46),e.YNc(12,j1,3,0,"li",47),e.YNc(13,zw,3,0,"li",48),e.YNc(14,Ly,6,2,"li",49),e.qZA(),e.qZA()}if(2&n){const t=e.oxw(3);e.xp6(1),e.uIk("aria-expanded","cluster"==t.displayedSubMenu),e.xp6(3),e.Q6J("ngbCollapse","cluster"!==t.displayedSubMenu),e.xp6(1),e.Q6J("ngIf",t.permissions.hosts.read),e.xp6(1),e.Q6J("ngIf",t.permissions.hosts.read),e.xp6(1),e.Q6J("ngIf",t.permissions.monitor.read),e.xp6(1),e.Q6J("ngIf",t.permissions.hosts.read),e.xp6(1),e.Q6J("ngIf",t.permissions.osd.read),e.xp6(1),e.Q6J("ngIf",t.permissions.configOpt.read),e.xp6(1),e.Q6J("ngIf",t.permissions.osd.read),e.xp6(1),e.Q6J("ngIf",t.permissions.configOpt.read),e.xp6(1),e.Q6J("ngIf",t.permissions.log.read),e.xp6(1),e.Q6J("ngIf",t.permissions.prometheus.read)}}function vM(n,s){1&n&&(e.TgZ(0,"li",84),e.TgZ(1,"a",85),e.SDv(2,86),e.qZA(),e.qZA())}function Qw(n,s){1&n&&(e.TgZ(0,"li",93),e.TgZ(1,"a",94),e.SDv(2,95),e.qZA(),e.qZA())}function LR(n,s){if(1&n&&(e.TgZ(0,"small",101),e._uU(1),e.qZA()),2&n){const t=e.oxw(5);e.xp6(1),e.Oqu(null==t.summaryData||null==t.summaryData.rbd_mirroring?null:t.summaryData.rbd_mirroring.warnings)}}function Xw(n,s){if(1&n&&(e.TgZ(0,"small",102),e._uU(1),e.qZA()),2&n){const t=e.oxw(5);e.xp6(1),e.Oqu(null==t.summaryData||null==t.summaryData.rbd_mirroring?null:t.summaryData.rbd_mirroring.errors)}}function Fy(n,s){if(1&n&&(e.TgZ(0,"li",96),e.TgZ(1,"a",97),e.ynx(2),e.SDv(3,98),e.BQk(),e.YNc(4,LR,2,1,"small",99),e.YNc(5,Xw,2,1,"small",100),e.qZA(),e.qZA()),2&n){const t=e.oxw(4);e.xp6(4),e.Q6J("ngIf",0!==(null==t.summaryData||null==t.summaryData.rbd_mirroring?null:t.summaryData.rbd_mirroring.warnings)),e.xp6(1),e.Q6J("ngIf",0!==(null==t.summaryData||null==t.summaryData.rbd_mirroring?null:t.summaryData.rbd_mirroring.errors))}}function Kw(n,s){1&n&&(e.TgZ(0,"li",103),e.TgZ(1,"a",104),e.SDv(2,105),e.qZA(),e.qZA())}function qw(n,s){if(1&n){const t=e.EpF();e.TgZ(0,"li",87),e.TgZ(1,"a",88),e.NdJ("click",function(){return e.CHM(t),e.oxw(3).toggleSubMenu("block")}),e.ynx(2),e.SDv(3,89),e.BQk(),e.qZA(),e.TgZ(4,"ul",39),e.YNc(5,Qw,3,0,"li",90),e.YNc(6,Fy,6,2,"li",91),e.YNc(7,Kw,3,0,"li",92),e.qZA(),e.qZA()}if(2&n){const t=e.oxw().ngIf,o=e.oxw(2);e.xp6(1),e.Q6J("ngStyle",o.blockHealthColor()),e.uIk("aria-expanded","block"==o.displayedSubMenu),e.xp6(3),e.Q6J("ngbCollapse","block"!==o.displayedSubMenu),e.xp6(1),e.Q6J("ngIf",o.permissions.rbdImage.read&&t.rbd),e.xp6(1),e.Q6J("ngIf",o.permissions.rbdMirroring.read&&t.mirroring),e.xp6(1),e.Q6J("ngIf",o.permissions.iscsi.read&&t.iscsi)}}function yM(n,s){1&n&&(e.TgZ(0,"li",106),e.TgZ(1,"a",107),e.SDv(2,108),e.qZA(),e.qZA())}function bM(n,s){1&n&&(e.TgZ(0,"li",109),e.TgZ(1,"a",110),e.SDv(2,111),e.qZA(),e.qZA())}function jE(n,s){if(1&n){const t=e.EpF();e.TgZ(0,"li",112),e.TgZ(1,"a",37),e.NdJ("click",function(){return e.CHM(t),e.oxw(3).toggleSubMenu("rgw")}),e.ynx(2),e.SDv(3,113),e.BQk(),e.qZA(),e.TgZ(4,"ul",39),e.TgZ(5,"li",114),e.TgZ(6,"a",115),e.SDv(7,116),e.qZA(),e.qZA(),e.TgZ(8,"li",117),e.TgZ(9,"a",118),e.SDv(10,119),e.qZA(),e.qZA(),e.TgZ(11,"li",120),e.TgZ(12,"a",121),e.SDv(13,122),e.qZA(),e.qZA(),e.qZA(),e.qZA()}if(2&n){const t=e.oxw(3);e.xp6(1),e.uIk("aria-expanded","rgw"==t.displayedSubMenu),e.xp6(3),e.Q6J("ngbCollapse","rgw"!==t.displayedSubMenu)}}const EM=function(n){return[n]};function TM(n,s){if(1&n&&(e.ynx(0),e.TgZ(1,"li",26),e.TgZ(2,"a",27),e.TgZ(3,"span"),e.SDv(4,28),e.qZA(),e._uU(5,"\xa0 "),e._UZ(6,"i",29),e.ALo(7,"healthColor"),e.qZA(),e.qZA(),e.YNc(8,Wm,15,12,"li",30),e.YNc(9,vM,3,0,"li",31),e.YNc(10,qw,8,6,"li",32),e.YNc(11,yM,3,0,"li",33),e.YNc(12,bM,3,0,"li",34),e.YNc(13,jE,14,2,"li",35),e.BQk()),2&n){const t=s.ngIf,o=e.oxw(2);e.xp6(6),e.Q6J("ngClass",e.VKq(10,EM,o.icons.health))("ngStyle",e.lcZ(7,8,null==o.summaryData?null:o.summaryData.health_status)),e.xp6(2),e.Q6J("ngIf",o.permissions.hosts.read||o.permissions.monitor.read||o.permissions.osd.read||o.permissions.configOpt.read||o.permissions.log.read||o.permissions.prometheus.read),e.xp6(1),e.Q6J("ngIf",o.permissions.pool.read),e.xp6(1),e.Q6J("ngIf",(o.permissions.rbdImage.read||o.permissions.rbdMirroring.read||o.permissions.iscsi.read)&&(t.rbd||t.mirroring||t.iscsi)),e.xp6(1),e.Q6J("ngIf",o.permissions.nfs.read&&t.nfs),e.xp6(1),e.Q6J("ngIf",o.permissions.cephfs.read&&t.cephfs),e.xp6(1),e.Q6J("ngIf",o.permissions.rgw.read&&t.rgw)}}function ex(n,s){if(1&n&&(e.YNc(0,TM,14,12,"ng-container",25),e.ALo(1,"async")),2&n){const t=e.oxw();e.Q6J("ngIf",e.lcZ(1,1,t.enabledFeature$))}}const tx=function(n){return{show:n}},GE=function(n){return{active:n}},nx=["*"];let SM=(()=>{class n{constructor(t,o,c,g,C,D){this.authStorageService=t,this.summaryService=o,this.featureToggles=c,this.telemetryNotificationService=g,this.prometheusAlertService=C,this.motdNotificationService=D,this.notifications=[],this.icons=No.P,this.rightSidebarOpen=!1,this.showMenuSidebar=!0,this.displayedSubMenu="",this.simplebar={autoHide:!1},this.subs=new gu.w,this.permissions=this.authStorageService.getPermissions(),this.enabledFeature$=this.featureToggles.get()}get class(){return"top-notification-"+this.notifications.length}ngOnInit(){this.subs.add(this.summaryService.subscribe(t=>{this.summaryData=t})),this.subs.add(this.authStorageService.isPwdDisplayed$.subscribe(t=>{this.showTopNotification("isPwdDisplayed",t)})),this.subs.add(this.telemetryNotificationService.update.subscribe(t=>{this.showTopNotification("telemetryNotificationEnabled",t)})),this.subs.add(this.motdNotificationService.motd$.subscribe(t=>{this.showTopNotification("motdNotificationEnabled",du.isPlainObject(t))}))}ngOnDestroy(){this.subs.unsubscribe()}blockHealthColor(){if(this.summaryData&&this.summaryData.rbd_mirroring){if(this.summaryData.rbd_mirroring.errors>0)return{color:"#d9534f"};if(this.summaryData.rbd_mirroring.warnings>0)return{color:"#f0ad4e"}}}toggleSubMenu(t){this.displayedSubMenu=this.displayedSubMenu===t?"":t}toggleRightSidebar(){this.rightSidebarOpen=!this.rightSidebarOpen}showTopNotification(t,o){if(o)this.notifications.includes(t)||this.notifications.push(t);else{const c=this.notifications.indexOf(t);c>=0&&this.notifications.splice(c,1)}}}return n.\u0275fac=function(t){return new(t||n)(e.Y36(_t.j),e.Y36(zm.J),e.Y36($1.l),e.Y36(rE),e.Y36(nm),e.Y36(xy))},n.\u0275cmp=e.Xpm({type:n,selectors:[["cd-navigation"]],hostVars:2,hostBindings:function(t,o){2&t&&e.Tol(o.class)},ngContentSelectors:nx,decls:30,vars:12,consts:function(){let s,t,o,c,g,C,D,P,j,W,re,ie,ge,_e,Le,Re,ke,xe,U,pt,ht,wt,It,dn;return s="Toggle navigation",t="Dashboard",o="Cluster",c="Hosts",g="Physical Disks",C="Monitors",D="Services",P="OSDs",j="Configuration",W="CRUSH map",re="Manager Modules",ie="Logs",ge="Monitoring",_e="Pools",Le="Block",Re="Images",ke="Mirroring",xe="iSCSI",U="NFS",pt="File Systems",ht="Object Gateway",wt="Daemons",It="Users",dn="Buckets",[[1,"cd-navbar-main"],[1,"cd-navbar-top"],[1,"navbar","navbar-expand-md","navbar-dark","cd-navbar-brand"],["aria-label","toggle sidebar visibility",1,"btn","btn-link","py-0",3,"click"],["aria-hidden","true",1,"fa","fa-bars","fa-2x"],["href","#",1,"navbar-brand","ml-2"],["src","assets/Ceph_Ceph_Logo_with_text_white.svg","alt","Ceph"],["type","button",1,"navbar-toggler",3,"click"],[1,"sr-only"],s,[1,""],[1,"fa","fa-navicon","fa-lg"],[1,"collapse","navbar-collapse",3,"ngClass"],[1,"nav","navbar-nav","cd-navbar-utility","my-2","my-md-0"],[4,"ngTemplateOutlet"],[1,"wrapper"],["id","sidebar",3,"ngClass"],[3,"options"],[1,"list-unstyled","components","cd-navbar-primary"],["id","content",3,"ngClass"],["cd_utilities",""],["cd_menu",""],[1,"nav-item"],[1,"cd-navbar"],[1,"cd-navbar",3,"click"],[4,"ngIf"],["routerLinkActive","active",1,"nav-item","tc_menuitem_dashboard"],["routerLink","/dashboard",1,"nav-link"],t,[3,"ngClass","ngStyle"],["routerLinkActive","active","class","nav-item tc_menuitem_cluster",4,"ngIf"],["routerLinkActive","active","class","nav-item tc_menuitem_pool",4,"ngIf"],["routerLinkActive","active","class","nav-item tc_menuitem_block",4,"ngIf"],["routerLinkActive","active","class","nav-item tc_menuitem_nfs",4,"ngIf"],["routerLinkActive","active","class","nav-item tc_menuitem_cephfs",4,"ngIf"],["routerLinkActive","active","class","nav-item tc_menuitem_rgw",4,"ngIf"],["routerLinkActive","active",1,"nav-item","tc_menuitem_cluster"],["aria-controls","collapseBasic",1,"nav-link","dropdown-toggle",3,"click"],o,[1,"list-unstyled",3,"ngbCollapse"],["routerLinkActive","active","class","tc_submenuitem tc_submenuitem_hosts",4,"ngIf"],["routerLinkActive","active","class","tc_submenuitem tc_submenuitem_cluster_inventory",4,"ngIf"],["routerLinkActive","active","class","tc_submenuitem tc_submenuitem_cluster_monitor",4,"ngIf"],["routerLinkActive","active","class","tc_submenuitem tc_submenuitem_cluster_services",4,"ngIf"],["routerLinkActive","active","class","tc_submenuitem tc_submenuitem_osds",4,"ngIf"],["routerLinkActive","active","class","tc_submenuitem tc_submenuitem_configuration",4,"ngIf"],["routerLinkActive","active","class","tc_submenuitem tc_submenuitem_crush",4,"ngIf"],["routerLinkActive","active","class","tc_submenuitem tc_submenuitem_modules",4,"ngIf"],["routerLinkActive","active","class","tc_submenuitem tc_submenuitem_log",4,"ngIf"],["routerLinkActive","active","class","tc_submenuitem tc_submenuitem_monitoring",4,"ngIf"],["routerLinkActive","active",1,"tc_submenuitem","tc_submenuitem_hosts"],["routerLink","/hosts"],c,["routerLinkActive","active",1,"tc_submenuitem","tc_submenuitem_cluster_inventory"],["routerLink","/inventory"],g,["routerLinkActive","active",1,"tc_submenuitem","tc_submenuitem_cluster_monitor"],["routerLink","/monitor/"],C,["routerLinkActive","active",1,"tc_submenuitem","tc_submenuitem_cluster_services"],["routerLink","/services/"],D,["routerLinkActive","active",1,"tc_submenuitem","tc_submenuitem_osds"],["routerLink","/osd"],P,["routerLinkActive","active",1,"tc_submenuitem","tc_submenuitem_configuration"],["routerLink","/configuration"],j,["routerLinkActive","active",1,"tc_submenuitem","tc_submenuitem_crush"],["routerLink","/crush-map"],W,["routerLinkActive","active",1,"tc_submenuitem","tc_submenuitem_modules"],["routerLink","/mgr-modules"],re,["routerLinkActive","active",1,"tc_submenuitem","tc_submenuitem_log"],["routerLink","/logs"],ie,["routerLinkActive","active",1,"tc_submenuitem","tc_submenuitem_monitoring"],["routerLink","/monitoring"],ge,["class","badge badge-danger ml-1",4,"ngIf"],["class","badge badge-warning ml-1",4,"ngIf"],[1,"badge","badge-danger","ml-1"],[1,"badge","badge-warning","ml-1"],["routerLinkActive","active",1,"nav-item","tc_menuitem_pool"],["routerLink","/pool",1,"nav-link"],_e,["routerLinkActive","active",1,"nav-item","tc_menuitem_block"],["aria-controls","collapseBasic",1,"nav-link","dropdown-toggle",3,"ngStyle","click"],Le,["routerLinkActive","active","class","tc_submenuitem tc_submenuitem_block_images",4,"ngIf"],["routerLinkActive","active","class","tc_submenuitem tc_submenuitem_block_mirroring",4,"ngIf"],["routerLinkActive","active","class","tc_submenuitem tc_submenuitem_block_iscsi",4,"ngIf"],["routerLinkActive","active",1,"tc_submenuitem","tc_submenuitem_block_images"],["routerLink","/block/rbd"],Re,["routerLinkActive","active",1,"tc_submenuitem","tc_submenuitem_block_mirroring"],["routerLink","/block/mirroring"],ke,["class","badge badge-warning",4,"ngIf"],["class","badge badge-danger",4,"ngIf"],[1,"badge","badge-warning"],[1,"badge","badge-danger"],["routerLinkActive","active",1,"tc_submenuitem","tc_submenuitem_block_iscsi"],["routerLink","/block/iscsi"],xe,["routerLinkActive","active",1,"nav-item","tc_menuitem_nfs"],["routerLink","/nfs",1,"nav-link"],U,["routerLinkActive","active",1,"nav-item","tc_menuitem_cephfs"],["routerLink","/cephfs",1,"nav-link"],pt,["routerLinkActive","active",1,"nav-item","tc_menuitem_rgw"],ht,["routerLinkActive","active",1,"tc_submenuitem","tc_submenuitem_rgw_daemons"],["routerLink","/rgw/daemon"],wt,["routerLinkActive","active",1,"tc_submenuitem","tc_submenuitem_rgw_users"],["routerLink","/rgw/user"],It,["routerLinkActive","active",1,"tc_submenuitem","tc_submenuitem_rgw_buckets"],["routerLink","/rgw/bucket"],dn]},template:function(t,o){if(1&t&&(e.F$t(),e.TgZ(0,"div",0),e._UZ(1,"cd-pwd-expiration-notification"),e._UZ(2,"cd-telemetry-notification"),e._UZ(3,"cd-motd"),e._UZ(4,"cd-notifications-sidebar"),e.TgZ(5,"div",1),e.TgZ(6,"nav",2),e.TgZ(7,"button",3),e.NdJ("click",function(){return o.showMenuSidebar=!o.showMenuSidebar}),e._UZ(8,"i",4),e.qZA(),e.TgZ(9,"a",5),e._UZ(10,"img",6),e.qZA(),e.TgZ(11,"button",7),e.NdJ("click",function(){return o.toggleRightSidebar()}),e.TgZ(12,"span",8),e.SDv(13,9),e.qZA(),e.TgZ(14,"span",10),e._UZ(15,"i",11),e.qZA(),e.qZA(),e.TgZ(16,"div",12),e.TgZ(17,"ul",13),e.YNc(18,$w,1,0,"ng-container",14),e.qZA(),e.qZA(),e.qZA(),e.qZA(),e.TgZ(19,"div",15),e.TgZ(20,"nav",16),e.TgZ(21,"ngx-simplebar",17),e.TgZ(22,"ul",18),e.YNc(23,Hw,1,0,"ng-container",14),e.qZA(),e.qZA(),e.qZA(),e.TgZ(24,"div",19),e.Hsn(25),e.qZA(),e.qZA(),e.YNc(26,Uw,10,0,"ng-template",null,20,e.W1O),e.YNc(28,ex,2,3,"ng-template",null,21,e.W1O),e.qZA()),2&t){const c=e.MAs(27),g=e.MAs(29);e.xp6(16),e.Q6J("ngClass",e.VKq(6,tx,o.rightSidebarOpen)),e.xp6(2),e.Q6J("ngTemplateOutlet",c),e.xp6(2),e.Q6J("ngClass",e.VKq(8,GE,!o.showMenuSidebar)),e.xp6(1),e.Q6J("options",o.simplebar),e.xp6(2),e.Q6J("ngTemplateOutlet",g),e.xp6(1),e.Q6J("ngClass",e.VKq(10,GE,!o.showMenuSidebar))}},directives:[nM,LE,kE,Mw,lt.M2,ca.o,_.mk,_.tP,aM.M,RE,ww,Lw,Fw,kw,_.O5,Yo.Od,Yo.yS,_.PC,lt._D],pipes:[_.Ov,_E],styles:['@charset "UTF-8";.cd-navbar-main[_ngcontent-%COMP%]{display:flex;flex:1;flex-direction:column;height:100%}  cd-navigation .cd-navbar-top .cd-navbar-brand{background:#374249;border-top:4px solid #2b99a8}  cd-navigation .cd-navbar-top .cd-navbar-brand .navbar-brand,   cd-navigation .cd-navbar-top .cd-navbar-brand .navbar-brand:hover{color:#e9ecef;height:auto;padding:0}  cd-navigation .cd-navbar-top .cd-navbar-brand .navbar-brand>img{height:25px}  cd-navigation .cd-navbar-top .cd-navbar-brand .navbar-toggler{border:0}  cd-navigation .cd-navbar-top .cd-navbar-brand .navbar-toggler:focus,   cd-navigation .cd-navbar-top .cd-navbar-brand .navbar-toggler:hover{outline:0}  cd-navigation .cd-navbar-top .cd-navbar-brand .navbar-toggler .fa-navicon{color:#e9ecef}  cd-navigation .cd-navbar-top .cd-navbar-brand .navbar-collapse{padding:0}  cd-navigation .cd-navbar-top .cd-navbar-brand .cd-navbar-utility>.active>a{background-color:#2b99a8;color:#e9ecef}  cd-navigation .cd-navbar-top .cd-navbar-brand .cd-navbar-utility>li>.open>a,   cd-navigation .cd-navbar-top .cd-navbar-brand .cd-navbar-utility>li>.open>a:focus,   cd-navigation .cd-navbar-top .cd-navbar-brand .cd-navbar-utility>li>.open>a:hover{background-color:transparent;border-color:transparent;color:#e9ecef}  cd-navigation .cd-navbar-top .navbar-nav>li>.cd-navbar>[ngbDropdown]>a,   cd-navigation .cd-navbar-top .navbar-nav>li>.cd-navbar>a,   cd-navigation .cd-navbar-top .navbar-nav>li>a{color:#e9ecef;display:block;line-height:1;padding:13.5px 18px!important;position:relative;text-decoration:none}  cd-navigation .cd-navbar-top .navbar-nav .nav-link,   cd-navigation .cd-navbar-top .navbar-nav .nav-link:hover{color:#e9ecef}  cd-navigation .cd-navbar-top .navbar-nav>li>.cd-navbar>[ngbDropdown]>a:hover,   cd-navigation .cd-navbar-top .navbar-nav>li>.cd-navbar>[ngbDropdown].open>a,   cd-navigation .cd-navbar-top .navbar-nav>li>.cd-navbar>a:hover,   cd-navigation .cd-navbar-top .navbar-nav>li>a:hover,   cd-navigation .cd-navbar-top .navbar-nav>li:hover{background-color:#2b99a8}  cd-navigation .cd-navbar-top .navbar-nav>.open>.cd-navbar>[ngbDropdown]>a,   cd-navigation .cd-navbar-top .navbar-nav>.open>.cd-navbar>[ngbDropdown]>a:hover,   cd-navigation .cd-navbar-top .navbar-nav>.open>.cd-navbar>a,   cd-navigation .cd-navbar-top .navbar-nav>.open>.cd-navbar>a:focus,   cd-navigation .cd-navbar-top .navbar-nav>.open>.cd-navbar>a:hover,   cd-navigation .cd-navbar-top .navbar-nav>.open>.cd-navbar>li>a:focus,   cd-navigation .cd-navbar-top .navbar-nav>.open>a,   cd-navigation .cd-navbar-top .navbar-nav>.open>a:focus,   cd-navigation .cd-navbar-top .navbar-nav>.open>a:hover{background-color:transparent;border-color:transparent;color:#e9ecef}@media (min-width: 768px){  cd-navigation .cd-navbar-top .cd-navbar-utility{border-bottom:0;font-size:1.1rem;position:absolute;right:0;top:0}}@media (max-width: calc(768px - 1px)){  cd-navigation .cd-navbar-top .navbar-nav{margin:0}  cd-navigation .cd-navbar-top .navbar-nav .fa{margin-right:.5em}  cd-navigation .cd-navbar-top .navbar-nav .open .dropdown-menu{background-color:#2b99a8;border:0;padding-bottom:0;padding-top:0}  cd-navigation .cd-navbar-top .navbar-nav .open .dropdown-menu>li>a{color:#e9ecef;padding:5px 15px 5px 35px}  cd-navigation .cd-navbar-top .navbar-nav .open .dropdown-menu>.active>a{background-color:#2b99a8}  cd-navigation .cd-navbar-top .navbar-nav>li>a:hover{background-color:#2b99a8}}.cd-navbar-primary[_ngcontent-%COMP%]   .active[_ngcontent-%COMP%] > a[_ngcontent-%COMP%], .cd-navbar-primary[_ngcontent-%COMP%] > .active[_ngcontent-%COMP%] > a[_ngcontent-%COMP%]:focus, .cd-navbar-primary[_ngcontent-%COMP%] > .active[_ngcontent-%COMP%] > a[_ngcontent-%COMP%]:hover{background-color:#2b99a8!important;border:0!important;color:#e9ecef!important}.wrapper[_ngcontent-%COMP%]{display:flex;height:100%;width:100%}.wrapper[_ngcontent-%COMP%]   #sidebar[_ngcontent-%COMP%]{background:#374249;bottom:0;color:#fff;height:auto;left:0;overflow-y:auto;position:relative;transition:all .3s;width:200px;z-index:999}.wrapper[_ngcontent-%COMP%]   #sidebar.active[_ngcontent-%COMP%]{margin-left:-200px}.wrapper[_ngcontent-%COMP%]   #sidebar[_ngcontent-%COMP%]   ul.component[_ngcontent-%COMP%]{margin:0;padding:20px 0}.wrapper[_ngcontent-%COMP%]   #sidebar[_ngcontent-%COMP%]   ul[_ngcontent-%COMP%]   p[_ngcontent-%COMP%]{color:#fff;padding:10px}.wrapper[_ngcontent-%COMP%]   #sidebar[_ngcontent-%COMP%]   ul[_ngcontent-%COMP%]   li[_ngcontent-%COMP%]   a[_ngcontent-%COMP%]{color:#fff;display:block;font-size:1.1em;padding:10px 10px 10px 27px;text-decoration:none}.wrapper[_ngcontent-%COMP%]   #sidebar[_ngcontent-%COMP%]   ul[_ngcontent-%COMP%]   li[_ngcontent-%COMP%]   a[_ngcontent-%COMP%]:hover{background:#2b99a8;color:#fff}.wrapper[_ngcontent-%COMP%]   #sidebar[_ngcontent-%COMP%]   ul[_ngcontent-%COMP%]   li[_ngcontent-%COMP%]   a[_ngcontent-%COMP%] > .badge[_ngcontent-%COMP%]{margin-left:5px}.wrapper[_ngcontent-%COMP%]   #sidebar[_ngcontent-%COMP%]   ul[_ngcontent-%COMP%]   li.active[_ngcontent-%COMP%] > a[_ngcontent-%COMP%], .wrapper[_ngcontent-%COMP%]   #sidebar[_ngcontent-%COMP%]   ul[_ngcontent-%COMP%]   li[_ngcontent-%COMP%] > a[_ngcontent-%COMP%]   a[aria-expanded=true][_ngcontent-%COMP%]{color:#fff}.wrapper[_ngcontent-%COMP%]   a.dropdown-toggle[_ngcontent-%COMP%]{position:relative}.wrapper[_ngcontent-%COMP%]   a.dropdown-toggle[_ngcontent-%COMP%]:after{border:0;content:"\\f054";font-family:"ForkAwesome";font-size:1rem;position:absolute;right:20px;transition:transform .3s ease-in-out}.wrapper[_ngcontent-%COMP%]   a.dropdown-toggle[aria-expanded=true][_ngcontent-%COMP%]:after{transform:rotate(90deg)}.wrapper[_ngcontent-%COMP%]   ul[_ngcontent-%COMP%]   ul[_ngcontent-%COMP%]   a[_ngcontent-%COMP%]{background:#4d5c66;font-size:.9em!important;padding-left:40px!important}.wrapper[_ngcontent-%COMP%]   .cd-navbar-primary[_ngcontent-%COMP%]   a[_ngcontent-%COMP%]:focus{outline:none}.wrapper[_ngcontent-%COMP%]   ngx-simplebar[_ngcontent-%COMP%]{height:100%}#content[_ngcontent-%COMP%]{bottom:0;position:relative;right:0;transition:all .3s;width:calc(100% - 200px)}#content.active[_ngcontent-%COMP%]{width:100vw}']}),n})();var ky=i(17757),$y=i(20523);function FR(n,s){if(1&n){const t=e.EpF();e.ynx(0),e.TgZ(1,"button",8),e.NdJ("click",function(){const g=e.CHM(t).$implicit;return e.oxw(3).onDaemonSelection(g)}),e._uU(2),e.qZA(),e.BQk()}if(2&n){const t=s.$implicit;e.xp6(2),e.AsE(" ",t.id," ( ",t.zonegroup_name," ) ")}}function G1(n,s){if(1&n&&(e.ynx(0),e.TgZ(1,"div",1),e.TgZ(2,"span",2),e.SDv(3,3),e.qZA(),e.TgZ(4,"div",4),e.TgZ(5,"button",5),e._uU(6),e.qZA(),e.TgZ(7,"div",6),e.YNc(8,FR,3,2,"ng-container",7),e.qZA(),e.qZA(),e.qZA(),e.BQk()),2&n){const t=e.oxw().ngIf;e.xp6(6),e.AsE(" ",t.selectedDaemon.id," ( ",t.selectedDaemon.zonegroup_name," ) "),e.xp6(2),e.Q6J("ngForOf",t.daemons)}}function sc(n,s){if(1&n&&(e.ynx(0),e.YNc(1,G1,9,3,"ng-container",0),e.BQk()),2&n){const t=s.ngIf,o=e.oxw();e.xp6(1),e.Q6J("ngIf",t.ftMap&&t.ftMap.rgw&&o.permissions.rgw.read&&o.isRgwRoute&&t.daemons.length>1)}}const om=function(n,s,t){return{ftMap:n,daemons:s,selectedDaemon:t}};let $v=(()=>{class n{constructor(t,o,c,g,C){this.authStorageService=t,this.featureToggles=o,this.router=c,this.timerService=g,this.rgwDaemonService=C,this.REFRESH_INTERVAL=5e3,this.subs=new gu.w,this.rgwUrlPrefix="/rgw",this.isRgwRoute=document.location.href.includes(this.rgwUrlPrefix)}ngOnInit(){this.permissions=this.authStorageService.getPermissions(),this.featureToggleMap$=this.featureToggles.get(),this.subs.add(this.router.events.pipe((0,tp.h)(t=>t instanceof Yo.m2)).subscribe(()=>this.isRgwRoute=this.router.url.startsWith(this.rgwUrlPrefix))),this.subs.add(this.timerService.get(()=>this.isRgwRoute?this.rgwDaemonService.list():ky.C,this.REFRESH_INTERVAL).subscribe())}ngOnDestroy(){this.subs.unsubscribe()}onDaemonSelection(t){this.rgwDaemonService.selectDaemon(t),this.reloadData()}reloadData(){const t=this.router.url;this.router.navigateByUrl(this.rgwUrlPrefix,{skipLocationChange:!0}).finally(()=>{this.router.navigate([t])})}}return n.\u0275fac=function(t){return new(t||n)(e.Y36(_t.j),e.Y36($1.l),e.Y36(Yo.F0),e.Y36(Nm.f),e.Y36($y.b))},n.\u0275cmp=e.Xpm({type:n,selectors:[["cd-context"]],decls:4,vars:11,consts:function(){let s,t;return s="Selected Object Gateway:",t="Select Object Gateway",[[4,"ngIf"],[1,"cd-context-bar","pt-3","pb-3"],[1,"mr-1"],s,["ngbDropdown","","placement","bottom-left",1,"d-inline-block","ml-2"],["ngbDropdownToggle","","title",t,1,"btn","btn-outline-info","ctx-bar-selected-rgw-daemon"],["ngbDropdownMenu",""],[4,"ngFor","ngForOf"],["ngbDropdownItem","",1,"ctx-bar-available-rgw-daemon",3,"click"]]},template:function(t,o){1&t&&(e.YNc(0,sc,2,1,"ng-container",0),e.ALo(1,"async"),e.ALo(2,"async"),e.ALo(3,"async")),2&t&&e.Q6J("ngIf",e.kEZ(7,om,e.lcZ(1,1,o.featureToggleMap$),e.lcZ(2,3,o.rgwDaemonService.daemons$),e.lcZ(3,5,o.rgwDaemonService.selectedDaemon$)))},directives:[_.O5,lt.jt,ca.o,lt.iD,lt.Vi,_.sg,lt.TH],pipes:[_.Ov],styles:[".cd-context-bar[_ngcontent-%COMP%]{border-bottom:1px solid #dee2e6}"]}),n})();var V1=i(58071),kR=i(94402),gl=i(85345);class VE{constructor(s,t){this.keySelector=s,this.flushes=t}call(s,t){return t.subscribe(new Jm(s,this.keySelector,this.flushes))}}class Jm extends gl.Ds{constructor(s,t,o){super(s),this.keySelector=t,this.values=new Set,o&&this.add((0,gl.ft)(o,new gl.IY(this)))}notifyNext(){this.values.clear()}notifyError(s){this._error(s)}_next(s){this.keySelector?this._useKeySelector(s):this._finalizeNext(s,s)}_useKeySelector(s){let t;const{destination:o}=this;try{t=this.keySelector(s)}catch(c){return void o.error(c)}this._finalizeNext(t,s)}_finalizeNext(s,t){const{values:o}=this;o.has(s)||(o.add(s),this.destination.next(t))}}var rx=i(28049);class z1{resolve(s){const t=s.routeConfig.data,o=null===t.path?null:this.getFullPath(s);return(0,zc.of)([{text:"string"==typeof t.breadcrumbs?t.breadcrumbs:t.breadcrumbs.text||t.text||o,path:o}])}getFullPath(s){return s.pathFromRoot.reduce((g,C)=>g+C.url.reduce((g,C)=>g+"/"+C.path,""),"")}}function CM(n,s){if(1&n&&(e.TgZ(0,"a",6),e._uU(1),e.qZA()),2&n){const t=e.oxw().$implicit;e.Q6J("routerLink",t.path),e.xp6(1),e.Oqu(t.text)}}function $R(n,s){if(1&n&&(e.TgZ(0,"span"),e._uU(1),e.qZA()),2&n){const t=e.oxw().$implicit;e.xp6(1),e.Oqu(t.text)}}const ix=function(n){return{active:n}};function ox(n,s){if(1&n&&(e.TgZ(0,"li",3),e.YNc(1,CM,2,2,"a",4),e.YNc(2,$R,2,1,"span",5),e.qZA()),2&n){const t=s.$implicit,o=s.last,c=e.oxw(2);e.Q6J("ngClass",e.VKq(3,ix,o&&c.finished)),e.xp6(1),e.Q6J("ngIf",!o&&null!==t.path),e.xp6(1),e.Q6J("ngIf",o||null===t.path)}}function Jh(n,s){if(1&n&&(e.TgZ(0,"ol",1),e.YNc(1,ox,3,5,"li",2),e.qZA()),2&n){const t=e.oxw();e.xp6(1),e.Q6J("ngForOf",t.crumbs)}}let hd=(()=>{class n{constructor(t,o){this.router=t,this.injector=o,this.crumbs=[],this.finished=!1,this.defaultResolver=new z1,this.subscription=this.router.events.pipe((0,tp.h)(c=>c instanceof Yo.OD)).subscribe(()=>{this.finished=!1}),this.subscription=this.router.events.pipe((0,tp.h)(c=>c instanceof Yo.m2)).subscribe(()=>{this._resolveCrumbs(t.routerState.snapshot.root).pipe((0,Uu.zg)(g=>g),function(n,s){return t=>t.lift(new VE(n,undefined))}(g=>g.text),kf(),(0,Uu.zg)(g=>{const C=this.postProcess(g);return this.wrapIntoObservable(C).pipe((0,rx.P)())})).subscribe(g=>{this.finished=!0,this.crumbs=g})})}ngOnDestroy(){this.subscription.unsubscribe()}_resolveCrumbs(t){let o;const c=t.routeConfig&&t.routeConfig.data;if(c&&c.breadcrumbs){let g;g=c.breadcrumbs.prototype instanceof z1?this.injector.get(c.breadcrumbs):this.defaultResolver;const C=g.resolve(t);o=this.wrapIntoObservable(C).pipe((0,rx.P)())}else o=(0,zc.of)([]);return t.firstChild&&(o=(0,V1.z)(o,this._resolveCrumbs(t.firstChild))),o}postProcess(t){const o=[];return t.forEach(c=>{const g=c.text.split("/");if(g.length>1){c.text=g[g.length-1];for(let C=0;C<g.length-1;C++)o.push({text:g[C],path:null})}o.push(c)}),o}isPromise(t){return t&&"function"==typeof t.then}wrapIntoObservable(t){return t instanceof yy.y?t:this.isPromise(t)?(0,kR.D)(Promise.resolve(t)):(0,zc.of)(t)}}return n.\u0275fac=function(t){return new(t||n)(e.Y36(Yo.F0),e.Y36(e.zs3))},n.\u0275cmp=e.Xpm({type:n,selectors:[["cd-breadcrumbs"]],decls:1,vars:1,consts:[["class","breadcrumb",4,"ngIf"],[1,"breadcrumb"],["class","breadcrumb-item",3,"ngClass",4,"ngFor","ngForOf"],[1,"breadcrumb-item",3,"ngClass"],["preserveFragment","",3,"routerLink",4,"ngIf"],[4,"ngIf"],["preserveFragment","",3,"routerLink"]],template:function(t,o){1&t&&e.YNc(0,Jh,2,1,"ol",0),2&t&&e.Q6J("ngIf",o.crumbs.length)},directives:[_.O5,_.sg,_.mk,Yo.yS],styles:['@charset "UTF-8";.breadcrumb[_ngcontent-%COMP%]{background-color:transparent;border-radius:0;margin-top:8px;padding:8px 0}.breadcrumb[_ngcontent-%COMP%] > li[_ngcontent-%COMP%] + li[_ngcontent-%COMP%]:before{content:"\\f101";font-family:"ForkAwesome";padding:0 5px 0 7px}']}),n})();const C_=function(n){return{dashboard:n}};let MM=(()=>{class n{constructor(t,o,c,g){this.router=t,this.summaryService=o,this.taskManagerService=c,this.faviconService=g,this.subs=new gu.w}ngOnInit(){this.subs.add(this.summaryService.startPolling()),this.subs.add(this.taskManagerService.init(this.summaryService)),this.faviconService.init()}ngOnDestroy(){this.subs.unsubscribe()}isDashboardPage(){return"/dashboard"===this.router.url}}return n.\u0275fac=function(t){return new(t||n)(e.Y36(Yo.F0),e.Y36(zm.J),e.Y36(fw.k),e.Y36(QC))},n.\u0275cmp=e.Xpm({type:n,selectors:[["cd-workbench-layout"]],features:[e._Bn([QC])],decls:6,vars:3,consts:[[1,"container-fluid","h-100",3,"ngClass"]],template:function(t,o){1&t&&(e.TgZ(0,"block-ui"),e.TgZ(1,"cd-navigation"),e.TgZ(2,"div",0),e._UZ(3,"cd-context"),e._UZ(4,"cd-breadcrumbs"),e._UZ(5,"router-outlet"),e.qZA(),e.qZA(),e.qZA()),2&t&&(e.xp6(2),e.Q6J("ngClass",e.VKq(1,C_,o.isDashboardPage())))},directives:[Pb,SM,_.mk,$v,hd,Yo.lC],styles:[".dashboard[_ngcontent-%COMP%]{background-color:#e9ecef;margin:0;padding:0}.container-fluid[_ngcontent-%COMP%]{overflow:auto;position:absolute}"]}),n})();var Bl=i(78139),ag=i(16482),zE=i.n(ag);function xg(n){return(xg="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(s){return typeof s}:function(s){return s&&"function"==typeof Symbol&&s.constructor===Symbol&&s!==Symbol.prototype?"symbol":typeof s})(n)}function W1(n,s){if(!(n instanceof s))throw new TypeError("Cannot call a class as a function")}function AM(n,s){for(var t=0;t<s.length;t++){var o=s[t];o.enumerable=o.enumerable||!1,o.configurable=!0,"value"in o&&(o.writable=!0),Object.defineProperty(n,o.key,o)}}function sx(n,s,t){return s in n?Object.defineProperty(n,s,{value:t,enumerable:!0,configurable:!0,writable:!0}):n[s]=t,n}function WE(n,s){var t=Object.keys(n);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(n);s&&(o=o.filter(function(c){return Object.getOwnPropertyDescriptor(n,c).enumerable})),t.push.apply(t,o)}return t}function JE(n){for(var s=1;s<arguments.length;s++){var t=null!=arguments[s]?arguments[s]:{};s%2?WE(t,!0).forEach(function(o){sx(n,o,t[o])}):Object.getOwnPropertyDescriptors?Object.defineProperties(n,Object.getOwnPropertyDescriptors(t)):WE(t).forEach(function(o){Object.defineProperty(n,o,Object.getOwnPropertyDescriptor(t,o))})}return n}function Q1(n){return(Q1=Object.setPrototypeOf?Object.getPrototypeOf:function(t){return t.__proto__||Object.getPrototypeOf(t)})(n)}function Hy(n,s){return(Hy=Object.setPrototypeOf||function(o,c){return o.__proto__=c,o})(n,s)}function ax(n,s){return!s||"object"!=typeof s&&"function"!=typeof s?function(n){if(void 0===n)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return n}(n):s}var X1={};function xM(n,s,t){return function(n){return null==n}(n)?t:function(n){return null!==n&&"object"===xg(n)&&"function"==typeof n.get&&"function"==typeof n.has}(n)?n.has(s)?n.get(s):t:hasOwnProperty.call(n,s)?n[s]:t}function K1(n,s,t){for(var o=0;o!==s.length;)if((n=xM(n,s[o++],X1))===X1)return t;return n}function QE(n){var s=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},t=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{},o=XE(s,t),c=n||Object.keys(JE({},t,{},s));return c.every(o)}function XE(n,s){return function(t){if("string"==typeof t)return(0,ag.is)(s[t],n[t]);if(Array.isArray(t))return(0,ag.is)(K1(s,t),K1(n,t));throw new TypeError("Invalid key: expected Array or string: "+t)}}const HR=function(n){function s(){return W1(this,s),ax(this,Q1(s).apply(this,arguments))}return function(n,s){if("function"!=typeof s&&null!==s)throw new TypeError("Super expression must either be null or a function");n.prototype=Object.create(s&&s.prototype,{constructor:{value:n,writable:!0,configurable:!0}}),s&&Hy(n,s)}(s,n),function(n,s,t){s&&AM(n.prototype,s)}(s,[{key:"shouldComponentUpdate",value:function(o){var c=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};return!QE(this.updateOnProps,this.props,o,"updateOnProps")||!QE(this.updateOnStates,this.state,c,"updateOnStates")}}]),s}(Bl.Component);function DM(n,s){if(Array.prototype.indexOf)return n.indexOf(s);for(var t=0,o=n.length;t<o;t++)if(n[t]===s)return t;return-1}function Xm(n,s){for(var t=n.length-1;t>=0;t--)!0===s(n[t])&&n.splice(t,1)}function ux(n){throw new Error("Unhandled case for value: '".concat(n,"'"))}var t,RM=function(){function n(s){void 0===s&&(s={}),this.tagName="",this.attrs={},this.innerHTML="",this.whitespaceRegex=/\s+/,this.tagName=s.tagName||"",this.attrs=s.attrs||{},this.innerHTML=s.innerHtml||s.innerHTML||""}return n.prototype.setTagName=function(s){return this.tagName=s,this},n.prototype.getTagName=function(){return this.tagName||""},n.prototype.setAttr=function(s,t){return this.getAttrs()[s]=t,this},n.prototype.getAttr=function(s){return this.getAttrs()[s]},n.prototype.setAttrs=function(s){return Object.assign(this.getAttrs(),s),this},n.prototype.getAttrs=function(){return this.attrs||(this.attrs={})},n.prototype.setClass=function(s){return this.setAttr("class",s)},n.prototype.addClass=function(s){for(var C,t=this.getClass(),o=this.whitespaceRegex,c=t?t.split(o):[],g=s.split(o);C=g.shift();)-1===DM(c,C)&&c.push(C);return this.getAttrs().class=c.join(" "),this},n.prototype.removeClass=function(s){for(var C,t=this.getClass(),o=this.whitespaceRegex,c=t?t.split(o):[],g=s.split(o);c.length&&(C=g.shift());){var D=DM(c,C);-1!==D&&c.splice(D,1)}return this.getAttrs().class=c.join(" "),this},n.prototype.getClass=function(){return this.getAttrs().class||""},n.prototype.hasClass=function(s){return-1!==(" "+this.getClass()+" ").indexOf(" "+s+" ")},n.prototype.setInnerHTML=function(s){return this.innerHTML=s,this},n.prototype.setInnerHtml=function(s){return this.setInnerHTML(s)},n.prototype.getInnerHTML=function(){return this.innerHTML||""},n.prototype.getInnerHtml=function(){return this.getInnerHTML()},n.prototype.toAnchorString=function(){var s=this.getTagName(),t=this.buildAttrsStr();return["<",s,t=t?" "+t:"",">",this.getInnerHtml(),"</",s,">"].join("")},n.prototype.buildAttrsStr=function(){if(!this.attrs)return"";var s=this.getAttrs(),t=[];for(var o in s)s.hasOwnProperty(o)&&t.push(o+'="'+s[o]+'"');return t.join(" ")},n}(),NM=function(){function n(s){void 0===s&&(s={}),this.newWindow=!1,this.truncate={},this.className="",this.newWindow=s.newWindow||!1,this.truncate=s.truncate||{},this.className=s.className||""}return n.prototype.build=function(s){return new RM({tagName:"a",attrs:this.createAttrs(s),innerHtml:this.processAnchorText(s.getAnchorText())})},n.prototype.createAttrs=function(s){var t={href:s.getAnchorHref()},o=this.createCssClass(s);return o&&(t.class=o),this.newWindow&&(t.target="_blank",t.rel="noopener noreferrer"),this.truncate&&this.truncate.length&&this.truncate.length<s.getAnchorText().length&&(t.title=s.getAnchorHref()),t},n.prototype.createCssClass=function(s){var t=this.className;if(t){for(var o=[t],c=s.getCssClassSuffixes(),g=0,C=c.length;g<C;g++)o.push(t+"-"+c[g]);return o.join(" ")}return""},n.prototype.processAnchorText=function(s){return this.doTruncate(s)},n.prototype.doTruncate=function(s){var t=this.truncate;if(!t||!t.length)return s;var o=t.length,c=t.location;return"smart"===c?function(n,s,t){var o,c;null==t?(t="&hellip;",c=3,o=8):(c=t.length,o=t.length);var C=function(xe){var U="";return xe.scheme&&xe.host&&(U+=xe.scheme+"://"),xe.host&&(U+=xe.host),xe.path&&(U+="/"+xe.path),xe.query&&(U+="?"+xe.query),xe.fragment&&(U+="#"+xe.fragment),U},D=function(xe,U){var pt=U/2,ht=Math.ceil(pt),wt=-1*Math.floor(pt),It="";return wt<0&&(It=xe.substr(wt)),xe.substr(0,ht)+t+It};if(n.length<=s)return n;var U,pt,ht,P=s-c,j=(U={},(ht=(pt=n).match(/^([a-z]+):\/\//i))&&(U.scheme=ht[1],pt=pt.substr(ht[0].length)),(ht=pt.match(/^(.*?)(?=(\?|#|\/|$))/i))&&(U.host=ht[1],pt=pt.substr(ht[0].length)),(ht=pt.match(/^\/(.*?)(?=(\?|#|$))/i))&&(U.path=ht[1],pt=pt.substr(ht[0].length)),(ht=pt.match(/^\?(.*?)(?=(#|$))/i))&&(U.query=ht[1],pt=pt.substr(ht[0].length)),(ht=pt.match(/^#(.*?)$/i))&&(U.fragment=ht[1]),U);if(j.query){var W=j.query.match(/^(.*?)(?=(\?|\#))(.*?)$/i);W&&(j.query=j.query.substr(0,W[1].length),n=C(j))}if(n.length<=s||(j.host&&(j.host=j.host.replace(/^www\./,""),n=C(j)),n.length<=s))return n;var re="";if(j.host&&(re+=j.host),re.length>=P)return j.host.length==s?(j.host.substr(0,s-c)+t).substr(0,P+o):D(re,P).substr(0,P+o);var ie="";if(j.path&&(ie+="/"+j.path),j.query&&(ie+="?"+j.query),ie){if((re+ie).length>=P)return(re+ie).length==s?(re+ie).substr(0,s):(re+D(ie,P-re.length)).substr(0,P+o);re+=ie}if(j.fragment){var _e="#"+j.fragment;if((re+_e).length>=P)return(re+_e).length==s?(re+_e).substr(0,s):(re+D(_e,P-re.length)).substr(0,P+o);re+=_e}if(j.scheme&&j.host){var Re=j.scheme+"://";if((re+Re).length<P)return(Re+re).substr(0,s)}if(re.length<=s)return re;var ke="";return P>0&&(ke=re.substr(-1*Math.floor(P/2))),(re.substr(0,Math.ceil(P/2))+t+ke).substr(0,P+o)}(s,o):"middle"===c?function(n,s,t){if(n.length<=s)return n;var o,c;null==t?(t="&hellip;",o=8,c=3):(o=t.length,c=t.length);var g=s-c,C="";return g>0&&(C=n.substr(-1*Math.floor(g/2))),(n.substr(0,Math.ceil(g/2))+t+C).substr(0,g+o)}(s,o):function(n,s,t){return function(n,s,t){var o;return n.length>s&&(null==t?(t="&hellip;",o=3):o=t.length,n=n.substring(0,s-o)+t),n}(n,s,void 0)}(s,o)},n}(),sm=function(){function n(s){this.__jsduckDummyDocProp=null,this.matchedText="",this.offset=0,this.tagBuilder=s.tagBuilder,this.matchedText=s.matchedText,this.offset=s.offset}return n.prototype.getMatchedText=function(){return this.matchedText},n.prototype.setOffset=function(s){this.offset=s},n.prototype.getOffset=function(){return this.offset},n.prototype.getCssClassSuffixes=function(){return[this.getType()]},n.prototype.buildTag=function(){return this.tagBuilder.build(this)},n}(),PM=function(n){function s(t){var o=n.call(this,t)||this;return o.email="",o.email=t.email,o}return(0,ha.ZT)(s,n),s.prototype.getType=function(){return"email"},s.prototype.getEmail=function(){return this.email},s.prototype.getAnchorHref=function(){return"mailto:"+this.email},s.prototype.getAnchorText=function(){return this.email},s}(sm),IM=function(n){function s(t){var o=n.call(this,t)||this;return o.serviceName="",o.hashtag="",o.serviceName=t.serviceName,o.hashtag=t.hashtag,o}return(0,ha.ZT)(s,n),s.prototype.getType=function(){return"hashtag"},s.prototype.getServiceName=function(){return this.serviceName},s.prototype.getHashtag=function(){return this.hashtag},s.prototype.getAnchorHref=function(){var t=this.serviceName,o=this.hashtag;switch(t){case"twitter":return"https://twitter.com/hashtag/"+o;case"facebook":return"https://www.facebook.com/hashtag/"+o;case"instagram":return"https://instagram.com/explore/tags/"+o;case"tiktok":return"https://www.tiktok.com/tag/"+o;default:throw new Error("Unknown service name to point hashtag to: "+t)}},s.prototype.getAnchorText=function(){return"#"+this.hashtag},s}(sm),LM=function(n){function s(t){var o=n.call(this,t)||this;return o.serviceName="twitter",o.mention="",o.mention=t.mention,o.serviceName=t.serviceName,o}return(0,ha.ZT)(s,n),s.prototype.getType=function(){return"mention"},s.prototype.getMention=function(){return this.mention},s.prototype.getServiceName=function(){return this.serviceName},s.prototype.getAnchorHref=function(){switch(this.serviceName){case"twitter":return"https://twitter.com/"+this.mention;case"instagram":return"https://instagram.com/"+this.mention;case"soundcloud":return"https://soundcloud.com/"+this.mention;case"tiktok":return"https://www.tiktok.com/@"+this.mention;default:throw new Error("Unknown service name to point mention to: "+this.serviceName)}},s.prototype.getAnchorText=function(){return"@"+this.mention},s.prototype.getCssClassSuffixes=function(){var t=n.prototype.getCssClassSuffixes.call(this),o=this.getServiceName();return o&&t.push(o),t},s}(sm),FM=function(n){function s(t){var o=n.call(this,t)||this;return o.number="",o.plusSign=!1,o.number=t.number,o.plusSign=t.plusSign,o}return(0,ha.ZT)(s,n),s.prototype.getType=function(){return"phone"},s.prototype.getPhoneNumber=function(){return this.number},s.prototype.getNumber=function(){return this.getPhoneNumber()},s.prototype.getAnchorHref=function(){return"tel:"+(this.plusSign?"+":"")+this.number},s.prototype.getAnchorText=function(){return this.matchedText},s}(sm),kM=function(n){function s(t){var o=n.call(this,t)||this;return o.url="",o.urlMatchType="scheme",o.protocolUrlMatch=!1,o.protocolRelativeMatch=!1,o.stripPrefix={scheme:!0,www:!0},o.stripTrailingSlash=!0,o.decodePercentEncoding=!0,o.schemePrefixRegex=/^(https?:\/\/)?/i,o.wwwPrefixRegex=/^(https?:\/\/)?(www\.)?/i,o.protocolRelativeRegex=/^\/\//,o.protocolPrepended=!1,o.urlMatchType=t.urlMatchType,o.url=t.url,o.protocolUrlMatch=t.protocolUrlMatch,o.protocolRelativeMatch=t.protocolRelativeMatch,o.stripPrefix=t.stripPrefix,o.stripTrailingSlash=t.stripTrailingSlash,o.decodePercentEncoding=t.decodePercentEncoding,o}return(0,ha.ZT)(s,n),s.prototype.getType=function(){return"url"},s.prototype.getUrlMatchType=function(){return this.urlMatchType},s.prototype.getUrl=function(){var t=this.url;return!this.protocolRelativeMatch&&!this.protocolUrlMatch&&!this.protocolPrepended&&(t=this.url="http://"+t,this.protocolPrepended=!0),t},s.prototype.getAnchorHref=function(){return this.getUrl().replace(/&amp;/g,"&")},s.prototype.getAnchorText=function(){var t=this.getMatchedText();return this.protocolRelativeMatch&&(t=this.stripProtocolRelativePrefix(t)),this.stripPrefix.scheme&&(t=this.stripSchemePrefix(t)),this.stripPrefix.www&&(t=this.stripWwwPrefix(t)),this.stripTrailingSlash&&(t=this.removeTrailingSlash(t)),this.decodePercentEncoding&&(t=this.removePercentEncoding(t)),t},s.prototype.stripSchemePrefix=function(t){return t.replace(this.schemePrefixRegex,"")},s.prototype.stripWwwPrefix=function(t){return t.replace(this.wwwPrefixRegex,"$1")},s.prototype.stripProtocolRelativePrefix=function(t){return t.replace(this.protocolRelativeRegex,"")},s.prototype.removeTrailingSlash=function(t){return"/"===t.charAt(t.length-1)&&(t=t.slice(0,-1)),t},s.prototype.removePercentEncoding=function(t){var o=t.replace(/%22/gi,"&quot;").replace(/%26/gi,"&amp;").replace(/%27/gi,"&#39;").replace(/%3C/gi,"&lt;").replace(/%3E/gi,"&gt;");try{return decodeURIComponent(o)}catch(c){return o}},s}(sm),Uv=function(s){this.__jsduckDummyDocProp=null,this.tagBuilder=s.tagBuilder},e0=/[A-Za-z]/,fx=/[\d]/,px=/[\D]/,am=/\s/,t0=/['"]/,hx=/[\x00-\x1F\x7F]/,_x=/A-Za-z\xAA\xB5\xBA\xC0-\xD6\xD8-\xF6\xF8-\u02C1\u02C6-\u02D1\u02E0-\u02E4\u02EC\u02EE\u0370-\u0374\u0376\u0377\u037A-\u037D\u037F\u0386\u0388-\u038A\u038C\u038E-\u03A1\u03A3-\u03F5\u03F7-\u0481\u048A-\u052F\u0531-\u0556\u0559\u0561-\u0587\u05D0-\u05EA\u05F0-\u05F2\u0620-\u064A\u066E\u066F\u0671-\u06D3\u06D5\u06E5\u06E6\u06EE\u06EF\u06FA-\u06FC\u06FF\u0710\u0712-\u072F\u074D-\u07A5\u07B1\u07CA-\u07EA\u07F4\u07F5\u07FA\u0800-\u0815\u081A\u0824\u0828\u0840-\u0858\u08A0-\u08B4\u08B6-\u08BD\u0904-\u0939\u093D\u0950\u0958-\u0961\u0971-\u0980\u0985-\u098C\u098F\u0990\u0993-\u09A8\u09AA-\u09B0\u09B2\u09B6-\u09B9\u09BD\u09CE\u09DC\u09DD\u09DF-\u09E1\u09F0\u09F1\u0A05-\u0A0A\u0A0F\u0A10\u0A13-\u0A28\u0A2A-\u0A30\u0A32\u0A33\u0A35\u0A36\u0A38\u0A39\u0A59-\u0A5C\u0A5E\u0A72-\u0A74\u0A85-\u0A8D\u0A8F-\u0A91\u0A93-\u0AA8\u0AAA-\u0AB0\u0AB2\u0AB3\u0AB5-\u0AB9\u0ABD\u0AD0\u0AE0\u0AE1\u0AF9\u0B05-\u0B0C\u0B0F\u0B10\u0B13-\u0B28\u0B2A-\u0B30\u0B32\u0B33\u0B35-\u0B39\u0B3D\u0B5C\u0B5D\u0B5F-\u0B61\u0B71\u0B83\u0B85-\u0B8A\u0B8E-\u0B90\u0B92-\u0B95\u0B99\u0B9A\u0B9C\u0B9E\u0B9F\u0BA3\u0BA4\u0BA8-\u0BAA\u0BAE-\u0BB9\u0BD0\u0C05-\u0C0C\u0C0E-\u0C10\u0C12-\u0C28\u0C2A-\u0C39\u0C3D\u0C58-\u0C5A\u0C60\u0C61\u0C80\u0C85-\u0C8C\u0C8E-\u0C90\u0C92-\u0CA8\u0CAA-\u0CB3\u0CB5-\u0CB9\u0CBD\u0CDE\u0CE0\u0CE1\u0CF1\u0CF2\u0D05-\u0D0C\u0D0E-\u0D10\u0D12-\u0D3A\u0D3D\u0D4E\u0D54-\u0D56\u0D5F-\u0D61\u0D7A-\u0D7F\u0D85-\u0D96\u0D9A-\u0DB1\u0DB3-\u0DBB\u0DBD\u0DC0-\u0DC6\u0E01-\u0E30\u0E32\u0E33\u0E40-\u0E46\u0E81\u0E82\u0E84\u0E87\u0E88\u0E8A\u0E8D\u0E94-\u0E97\u0E99-\u0E9F\u0EA1-\u0EA3\u0EA5\u0EA7\u0EAA\u0EAB\u0EAD-\u0EB0\u0EB2\u0EB3\u0EBD\u0EC0-\u0EC4\u0EC6\u0EDC-\u0EDF\u0F00\u0F40-\u0F47\u0F49-\u0F6C\u0F88-\u0F8C\u1000-\u102A\u103F\u1050-\u1055\u105A-\u105D\u1061\u1065\u1066\u106E-\u1070\u1075-\u1081\u108E\u10A0-\u10C5\u10C7\u10CD\u10D0-\u10FA\u10FC-\u1248\u124A-\u124D\u1250-\u1256\u1258\u125A-\u125D\u1260-\u1288\u128A-\u128D\u1290-\u12B0\u12B2-\u12B5\u12B8-\u12BE\u12C0\u12C2-\u12C5\u12C8-\u12D6\u12D8-\u1310\u1312-\u1315\u1318-\u135A\u1380-\u138F\u13A0-\u13F5\u13F8-\u13FD\u1401-\u166C\u166F-\u167F\u1681-\u169A\u16A0-\u16EA\u16F1-\u16F8\u1700-\u170C\u170E-\u1711\u1720-\u1731\u1740-\u1751\u1760-\u176C\u176E-\u1770\u1780-\u17B3\u17D7\u17DC\u1820-\u1877\u1880-\u1884\u1887-\u18A8\u18AA\u18B0-\u18F5\u1900-\u191E\u1950-\u196D\u1970-\u1974\u1980-\u19AB\u19B0-\u19C9\u1A00-\u1A16\u1A20-\u1A54\u1AA7\u1B05-\u1B33\u1B45-\u1B4B\u1B83-\u1BA0\u1BAE\u1BAF\u1BBA-\u1BE5\u1C00-\u1C23\u1C4D-\u1C4F\u1C5A-\u1C7D\u1C80-\u1C88\u1CE9-\u1CEC\u1CEE-\u1CF1\u1CF5\u1CF6\u1D00-\u1DBF\u1E00-\u1F15\u1F18-\u1F1D\u1F20-\u1F45\u1F48-\u1F4D\u1F50-\u1F57\u1F59\u1F5B\u1F5D\u1F5F-\u1F7D\u1F80-\u1FB4\u1FB6-\u1FBC\u1FBE\u1FC2-\u1FC4\u1FC6-\u1FCC\u1FD0-\u1FD3\u1FD6-\u1FDB\u1FE0-\u1FEC\u1FF2-\u1FF4\u1FF6-\u1FFC\u2071\u207F\u2090-\u209C\u2102\u2107\u210A-\u2113\u2115\u2119-\u211D\u2124\u2126\u2128\u212A-\u212D\u212F-\u2139\u213C-\u213F\u2145-\u2149\u214E\u2183\u2184\u2C00-\u2C2E\u2C30-\u2C5E\u2C60-\u2CE4\u2CEB-\u2CEE\u2CF2\u2CF3\u2D00-\u2D25\u2D27\u2D2D\u2D30-\u2D67\u2D6F\u2D80-\u2D96\u2DA0-\u2DA6\u2DA8-\u2DAE\u2DB0-\u2DB6\u2DB8-\u2DBE\u2DC0-\u2DC6\u2DC8-\u2DCE\u2DD0-\u2DD6\u2DD8-\u2DDE\u2E2F\u3005\u3006\u3031-\u3035\u303B\u303C\u3041-\u3096\u309D-\u309F\u30A1-\u30FA\u30FC-\u30FF\u3105-\u312D\u3131-\u318E\u31A0-\u31BA\u31F0-\u31FF\u3400-\u4DB5\u4E00-\u9FD5\uA000-\uA48C\uA4D0-\uA4FD\uA500-\uA60C\uA610-\uA61F\uA62A\uA62B\uA640-\uA66E\uA67F-\uA69D\uA6A0-\uA6E5\uA717-\uA71F\uA722-\uA788\uA78B-\uA7AE\uA7B0-\uA7B7\uA7F7-\uA801\uA803-\uA805\uA807-\uA80A\uA80C-\uA822\uA840-\uA873\uA882-\uA8B3\uA8F2-\uA8F7\uA8FB\uA8FD\uA90A-\uA925\uA930-\uA946\uA960-\uA97C\uA984-\uA9B2\uA9CF\uA9E0-\uA9E4\uA9E6-\uA9EF\uA9FA-\uA9FE\uAA00-\uAA28\uAA40-\uAA42\uAA44-\uAA4B\uAA60-\uAA76\uAA7A\uAA7E-\uAAAF\uAAB1\uAAB5\uAAB6\uAAB9-\uAABD\uAAC0\uAAC2\uAADB-\uAADD\uAAE0-\uAAEA\uAAF2-\uAAF4\uAB01-\uAB06\uAB09-\uAB0E\uAB11-\uAB16\uAB20-\uAB26\uAB28-\uAB2E\uAB30-\uAB5A\uAB5C-\uAB65\uAB70-\uABE2\uAC00-\uD7A3\uD7B0-\uD7C6\uD7CB-\uD7FB\uF900-\uFA6D\uFA70-\uFAD9\uFB00-\uFB06\uFB13-\uFB17\uFB1D\uFB1F-\uFB28\uFB2A-\uFB36\uFB38-\uFB3C\uFB3E\uFB40\uFB41\uFB43\uFB44\uFB46-\uFBB1\uFBD3-\uFD3D\uFD50-\uFD8F\uFD92-\uFDC7\uFDF0-\uFDFB\uFE70-\uFE74\uFE76-\uFEFC\uFF21-\uFF3A\uFF41-\uFF5A\uFF66-\uFFBE\uFFC2-\uFFC7\uFFCA-\uFFCF\uFFD2-\uFFD7\uFFDA-\uFFDC/.source,$M=_x+/\u2700-\u27bf\udde6-\uddff\ud800-\udbff\udc00-\udfff\ufe0e\ufe0f\u0300-\u036f\ufe20-\ufe23\u20d0-\u20f0\ud83c\udffb-\udfff\u200d\u3299\u3297\u303d\u3030\u24c2\ud83c\udd70-\udd71\udd7e-\udd7f\udd8e\udd91-\udd9a\udde6-\uddff\ude01-\ude02\ude1a\ude2f\ude32-\ude3a\ude50-\ude51\u203c\u2049\u25aa-\u25ab\u25b6\u25c0\u25fb-\u25fe\u00a9\u00ae\u2122\u2139\udc04\u2600-\u26FF\u2b05\u2b06\u2b07\u2b1b\u2b1c\u2b50\u2b55\u231a\u231b\u2328\u23cf\u23e9-\u23f3\u23f8-\u23fa\udccf\u2935\u2934\u2190-\u21ff/.source+/\u0300-\u036F\u0483-\u0489\u0591-\u05BD\u05BF\u05C1\u05C2\u05C4\u05C5\u05C7\u0610-\u061A\u064B-\u065F\u0670\u06D6-\u06DC\u06DF-\u06E4\u06E7\u06E8\u06EA-\u06ED\u0711\u0730-\u074A\u07A6-\u07B0\u07EB-\u07F3\u0816-\u0819\u081B-\u0823\u0825-\u0827\u0829-\u082D\u0859-\u085B\u08D4-\u08E1\u08E3-\u0903\u093A-\u093C\u093E-\u094F\u0951-\u0957\u0962\u0963\u0981-\u0983\u09BC\u09BE-\u09C4\u09C7\u09C8\u09CB-\u09CD\u09D7\u09E2\u09E3\u0A01-\u0A03\u0A3C\u0A3E-\u0A42\u0A47\u0A48\u0A4B-\u0A4D\u0A51\u0A70\u0A71\u0A75\u0A81-\u0A83\u0ABC\u0ABE-\u0AC5\u0AC7-\u0AC9\u0ACB-\u0ACD\u0AE2\u0AE3\u0B01-\u0B03\u0B3C\u0B3E-\u0B44\u0B47\u0B48\u0B4B-\u0B4D\u0B56\u0B57\u0B62\u0B63\u0B82\u0BBE-\u0BC2\u0BC6-\u0BC8\u0BCA-\u0BCD\u0BD7\u0C00-\u0C03\u0C3E-\u0C44\u0C46-\u0C48\u0C4A-\u0C4D\u0C55\u0C56\u0C62\u0C63\u0C81-\u0C83\u0CBC\u0CBE-\u0CC4\u0CC6-\u0CC8\u0CCA-\u0CCD\u0CD5\u0CD6\u0CE2\u0CE3\u0D01-\u0D03\u0D3E-\u0D44\u0D46-\u0D48\u0D4A-\u0D4D\u0D57\u0D62\u0D63\u0D82\u0D83\u0DCA\u0DCF-\u0DD4\u0DD6\u0DD8-\u0DDF\u0DF2\u0DF3\u0E31\u0E34-\u0E3A\u0E47-\u0E4E\u0EB1\u0EB4-\u0EB9\u0EBB\u0EBC\u0EC8-\u0ECD\u0F18\u0F19\u0F35\u0F37\u0F39\u0F3E\u0F3F\u0F71-\u0F84\u0F86\u0F87\u0F8D-\u0F97\u0F99-\u0FBC\u0FC6\u102B-\u103E\u1056-\u1059\u105E-\u1060\u1062-\u1064\u1067-\u106D\u1071-\u1074\u1082-\u108D\u108F\u109A-\u109D\u135D-\u135F\u1712-\u1714\u1732-\u1734\u1752\u1753\u1772\u1773\u17B4-\u17D3\u17DD\u180B-\u180D\u1885\u1886\u18A9\u1920-\u192B\u1930-\u193B\u1A17-\u1A1B\u1A55-\u1A5E\u1A60-\u1A7C\u1A7F\u1AB0-\u1ABE\u1B00-\u1B04\u1B34-\u1B44\u1B6B-\u1B73\u1B80-\u1B82\u1BA1-\u1BAD\u1BE6-\u1BF3\u1C24-\u1C37\u1CD0-\u1CD2\u1CD4-\u1CE8\u1CED\u1CF2-\u1CF4\u1CF8\u1CF9\u1DC0-\u1DF5\u1DFB-\u1DFF\u20D0-\u20F0\u2CEF-\u2CF1\u2D7F\u2DE0-\u2DFF\u302A-\u302F\u3099\u309A\uA66F-\uA672\uA674-\uA67D\uA69E\uA69F\uA6F0\uA6F1\uA802\uA806\uA80B\uA823-\uA827\uA880\uA881\uA8B4-\uA8C5\uA8E0-\uA8F1\uA926-\uA92D\uA947-\uA953\uA980-\uA983\uA9B3-\uA9C0\uA9E5\uAA29-\uAA36\uAA43\uAA4C\uAA4D\uAA7B-\uAA7D\uAAB0\uAAB2-\uAAB4\uAAB7\uAAB8\uAABE\uAABF\uAAC1\uAAEB-\uAAEF\uAAF5\uAAF6\uABE3-\uABEA\uABEC\uABED\uFB1E\uFE00-\uFE0F\uFE20-\uFE2F/.source,Uy=/0-9\u0660-\u0669\u06F0-\u06F9\u07C0-\u07C9\u0966-\u096F\u09E6-\u09EF\u0A66-\u0A6F\u0AE6-\u0AEF\u0B66-\u0B6F\u0BE6-\u0BEF\u0C66-\u0C6F\u0CE6-\u0CEF\u0D66-\u0D6F\u0DE6-\u0DEF\u0E50-\u0E59\u0ED0-\u0ED9\u0F20-\u0F29\u1040-\u1049\u1090-\u1099\u17E0-\u17E9\u1810-\u1819\u1946-\u194F\u19D0-\u19D9\u1A80-\u1A89\u1A90-\u1A99\u1B50-\u1B59\u1BB0-\u1BB9\u1C40-\u1C49\u1C50-\u1C59\uA620-\uA629\uA8D0-\uA8D9\uA900-\uA909\uA9D0-\uA9D9\uA9F0-\uA9F9\uAA50-\uAA59\uABF0-\uABF9\uFF10-\uFF19/.source,vx=$M+Uy,Yc=$M+Uy,n0="(?:["+Uy+"]{1,3}\\.){3}["+Uy+"]{1,3}",yx="["+Yc+"](?:["+Yc+"\\-_]{0,61}["+Yc+"])?",HM=function(n){return"(?=("+yx+"))\\"+n},By=function(n){return"(?:"+HM(n)+"(?:\\."+HM(n+1)+"){0,126}|"+n0+")"},qE=(new RegExp("["+Yc+".\\-]*["+Yc+"\\-]"),new RegExp("[".concat(Yc,"]"))),eT=/(?:xn--vermgensberatung-pwb|xn--vermgensberater-ctb|xn--clchc0ea0b2g2a9gcd|xn--w4r85el8fhu5dnra|northwesternmutual|travelersinsurance|verm\xf6gensberatung|xn--5su34j936bgsg|xn--bck1b9a5dre4c|xn--mgbah1a3hjkrd|xn--mgbai9azgqp6j|xn--mgberp4a5d4ar|xn--xkc2dl3a5ee0h|verm\xf6gensberater|xn--fzys8d69uvgm|xn--mgba7c0bbn0a|xn--mgbcpq6gpa1a|xn--xkc2al3hye2a|americanexpress|kerryproperties|sandvikcoromant|xn--i1b6b1a6a2e|xn--kcrx77d1x4a|xn--lgbbat1ad8j|xn--mgba3a4f16a|xn--mgbaakc7dvf|xn--mgbc0a9azcg|xn--nqv7fs00ema|americanfamily|bananarepublic|cancerresearch|cookingchannel|kerrylogistics|weatherchannel|xn--54b7fta0cc|xn--6qq986b3xl|xn--80aqecdr1a|xn--b4w605ferd|xn--fiq228c5hs|xn--h2breg3eve|xn--jlq480n2rg|xn--jlq61u9w7b|xn--mgba3a3ejt|xn--mgbaam7a8h|xn--mgbayh7gpa|xn--mgbbh1a71e|xn--mgbca7dzdo|xn--mgbi4ecexp|xn--mgbx4cd0ab|xn--rvc1e0am3e|international|lifeinsurance|travelchannel|wolterskluwer|xn--cckwcxetd|xn--eckvdtc9d|xn--fpcrj9c3d|xn--fzc2c9e2c|xn--h2brj9c8c|xn--tiq49xqyj|xn--yfro4i67o|xn--ygbi2ammx|construction|lplfinancial|scholarships|versicherung|xn--3e0b707e|xn--45br5cyl|xn--4dbrk0ce|xn--80adxhks|xn--80asehdb|xn--8y0a063a|xn--gckr3f0f|xn--mgb9awbf|xn--mgbab2bd|xn--mgbgu82a|xn--mgbpl2fh|xn--mgbt3dhd|xn--mk1bu44c|xn--ngbc5azd|xn--ngbe9e0a|xn--ogbpf8fl|xn--qcka1pmc|accountants|barclaycard|blackfriday|blockbuster|bridgestone|calvinklein|contractors|creditunion|engineering|enterprises|foodnetwork|investments|kerryhotels|lamborghini|motorcycles|olayangroup|photography|playstation|productions|progressive|redumbrella|williamhill|xn--11b4c3d|xn--1ck2e1b|xn--1qqw23a|xn--2scrj9c|xn--3bst00m|xn--3ds443g|xn--3hcrj9c|xn--42c2d9a|xn--45brj9c|xn--55qw42g|xn--6frz82g|xn--80ao21a|xn--9krt00a|xn--cck2b3b|xn--czr694b|xn--d1acj3b|xn--efvy88h|xn--fct429k|xn--fjq720a|xn--flw351e|xn--g2xx48c|xn--gecrj9c|xn--gk3at1e|xn--h2brj9c|xn--hxt814e|xn--imr513n|xn--j6w193g|xn--jvr189m|xn--kprw13d|xn--kpry57d|xn--mgbbh1a|xn--mgbtx2b|xn--mix891f|xn--nyqy26a|xn--otu796d|xn--pgbs0dh|xn--q9jyb4c|xn--rhqv96g|xn--rovu88b|xn--s9brj9c|xn--ses554g|xn--t60b56a|xn--vuq861b|xn--w4rs40l|xn--xhq521b|xn--zfr164b|\u0b9a\u0bbf\u0b99\u0bcd\u0b95\u0baa\u0bcd\u0baa\u0bc2\u0bb0\u0bcd|accountant|apartments|associates|basketball|bnpparibas|boehringer|capitalone|consulting|creditcard|cuisinella|eurovision|extraspace|foundation|healthcare|immobilien|industries|management|mitsubishi|nextdirect|properties|protection|prudential|realestate|republican|restaurant|schaeffler|tatamotors|technology|university|vlaanderen|volkswagen|xn--30rr7y|xn--3pxu8k|xn--45q11c|xn--4gbrim|xn--55qx5d|xn--5tzm5g|xn--80aswg|xn--90a3ac|xn--9dbq2a|xn--9et52u|xn--c2br7g|xn--cg4bki|xn--czrs0t|xn--czru2d|xn--fiq64b|xn--fiqs8s|xn--fiqz9s|xn--io0a7i|xn--kput3i|xn--mxtq1m|xn--o3cw4h|xn--pssy2u|xn--q7ce6a|xn--unup4y|xn--wgbh1c|xn--wgbl6a|xn--y9a3aq|accenture|alfaromeo|allfinanz|amsterdam|analytics|aquarelle|barcelona|bloomberg|christmas|community|directory|education|equipment|fairwinds|financial|firestone|fresenius|frontdoor|furniture|goldpoint|hisamitsu|homedepot|homegoods|homesense|institute|insurance|kuokgroup|lancaster|landrover|lifestyle|marketing|marshalls|melbourne|microsoft|panasonic|passagens|pramerica|richardli|shangrila|solutions|statebank|statefarm|stockholm|travelers|vacations|xn--90ais|xn--c1avg|xn--d1alf|xn--e1a4c|xn--fhbei|xn--j1aef|xn--j1amh|xn--l1acc|xn--ngbrx|xn--nqv7f|xn--p1acf|xn--qxa6a|xn--tckwe|xn--vhquv|yodobashi|\u0645\u0648\u0631\u064a\u062a\u0627\u0646\u064a\u0627|abudhabi|airforce|allstate|attorney|barclays|barefoot|bargains|baseball|boutique|bradesco|broadway|brussels|builders|business|capetown|catering|catholic|cipriani|cityeats|cleaning|clinique|clothing|commbank|computer|delivery|deloitte|democrat|diamonds|discount|discover|download|engineer|ericsson|etisalat|exchange|feedback|fidelity|firmdale|football|frontier|goodyear|grainger|graphics|guardian|hdfcbank|helsinki|holdings|hospital|infiniti|ipiranga|istanbul|jpmorgan|lighting|lundbeck|marriott|maserati|mckinsey|memorial|merckmsd|mortgage|observer|partners|pharmacy|pictures|plumbing|property|redstone|reliance|saarland|samsclub|security|services|shopping|showtime|softbank|software|stcgroup|supplies|training|vanguard|ventures|verisign|woodside|xn--90ae|xn--node|xn--p1ai|xn--qxam|yokohama|\u0627\u0644\u0633\u0639\u0648\u062f\u064a\u0629|abogado|academy|agakhan|alibaba|android|athleta|auction|audible|auspost|avianca|banamex|bauhaus|bentley|bestbuy|booking|brother|bugatti|capital|caravan|careers|channel|charity|chintai|citadel|clubmed|college|cologne|comcast|company|compare|contact|cooking|corsica|country|coupons|courses|cricket|cruises|dentist|digital|domains|exposed|express|farmers|fashion|ferrari|ferrero|finance|fishing|fitness|flights|florist|flowers|forsale|frogans|fujitsu|gallery|genting|godaddy|grocery|guitars|hamburg|hangout|hitachi|holiday|hosting|hoteles|hotmail|hyundai|ismaili|jewelry|juniper|kitchen|komatsu|lacaixa|lanxess|lasalle|latrobe|leclerc|limited|lincoln|markets|monster|netbank|netflix|network|neustar|okinawa|oldnavy|organic|origins|philips|pioneer|politie|realtor|recipes|rentals|reviews|rexroth|samsung|sandvik|schmidt|schwarz|science|shiksha|singles|staples|storage|support|surgery|systems|temasek|theater|theatre|tickets|tiffany|toshiba|trading|walmart|wanggou|watches|weather|website|wedding|whoswho|windows|winners|xfinity|yamaxun|youtube|zuerich|\u043a\u0430\u0442\u043e\u043b\u0438\u043a|\u0627\u062a\u0635\u0627\u0644\u0627\u062a|\u0627\u0644\u0628\u062d\u0631\u064a\u0646|\u0627\u0644\u062c\u0632\u0627\u0626\u0631|\u0627\u0644\u0639\u0644\u064a\u0627\u0646|\u067e\u0627\u06a9\u0633\u062a\u0627\u0646|\u0643\u0627\u062b\u0648\u0644\u064a\u0643|\u0b87\u0ba8\u0bcd\u0ba4\u0bbf\u0baf\u0bbe|abarth|abbott|abbvie|africa|agency|airbus|airtel|alipay|alsace|alstom|amazon|anquan|aramco|author|bayern|beauty|berlin|bharti|bostik|boston|broker|camera|career|casino|center|chanel|chrome|church|circle|claims|clinic|coffee|comsec|condos|coupon|credit|cruise|dating|datsun|dealer|degree|dental|design|direct|doctor|dunlop|dupont|durban|emerck|energy|estate|events|expert|family|flickr|futbol|gallup|garden|george|giving|global|google|gratis|health|hermes|hiphop|hockey|hotels|hughes|imamat|insure|intuit|jaguar|joburg|juegos|kaufen|kinder|kindle|kosher|lancia|latino|lawyer|lefrak|living|locker|london|luxury|madrid|maison|makeup|market|mattel|mobile|monash|mormon|moscow|museum|mutual|nagoya|natura|nissan|nissay|norton|nowruz|office|olayan|online|oracle|orange|otsuka|pfizer|photos|physio|pictet|quebec|racing|realty|reisen|repair|report|review|rocher|rogers|ryukyu|safety|sakura|sanofi|school|schule|search|secure|select|shouji|soccer|social|stream|studio|supply|suzuki|swatch|sydney|taipei|taobao|target|tattoo|tennis|tienda|tjmaxx|tkmaxx|toyota|travel|unicom|viajes|viking|villas|virgin|vision|voting|voyage|vuelos|walter|webcam|xihuan|yachts|yandex|zappos|\u043c\u043e\u0441\u043a\u0432\u0430|\u043e\u043d\u043b\u0430\u0439\u043d|\u0627\u0628\u0648\u0638\u0628\u064a|\u0627\u0631\u0627\u0645\u0643\u0648|\u0627\u0644\u0627\u0631\u062f\u0646|\u0627\u0644\u0645\u063a\u0631\u0628|\u0627\u0645\u0627\u0631\u0627\u062a|\u0641\u0644\u0633\u0637\u064a\u0646|\u0645\u0644\u064a\u0633\u064a\u0627|\u092d\u093e\u0930\u0924\u092e\u094d|\u0b87\u0bb2\u0b99\u0bcd\u0b95\u0bc8|\u30d5\u30a1\u30c3\u30b7\u30e7\u30f3|actor|adult|aetna|amfam|amica|apple|archi|audio|autos|azure|baidu|beats|bible|bingo|black|boats|bosch|build|canon|cards|chase|cheap|cisco|citic|click|cloud|coach|codes|crown|cymru|dabur|dance|deals|delta|drive|dubai|earth|edeka|email|epson|faith|fedex|final|forex|forum|gallo|games|gifts|gives|glass|globo|gmail|green|gripe|group|gucci|guide|homes|honda|horse|house|hyatt|ikano|irish|jetzt|koeln|kyoto|lamer|lease|legal|lexus|lilly|linde|lipsy|loans|locus|lotte|lotto|macys|mango|media|miami|money|movie|music|nexus|nikon|ninja|nokia|nowtv|omega|osaka|paris|parts|party|phone|photo|pizza|place|poker|praxi|press|prime|promo|quest|radio|rehab|reise|ricoh|rocks|rodeo|rugby|salon|sener|seven|sharp|shell|shoes|skype|sling|smart|smile|solar|space|sport|stada|store|study|style|sucks|swiss|tatar|tires|tirol|tmall|today|tokyo|tools|toray|total|tours|trade|trust|tunes|tushu|ubank|vegas|video|vodka|volvo|wales|watch|weber|weibo|works|world|xerox|yahoo|\u05d9\u05e9\u05e8\u05d0\u05dc|\u0627\u06cc\u0631\u0627\u0646|\u0628\u0627\u0632\u0627\u0631|\u0628\u06be\u0627\u0631\u062a|\u0633\u0648\u062f\u0627\u0646|\u0633\u0648\u0631\u064a\u0629|\u0647\u0645\u0631\u0627\u0647|\u092d\u093e\u0930\u094b\u0924|\u0938\u0902\u0917\u0920\u0928|\u09ac\u09be\u0982\u09b2\u09be|\u0c2d\u0c3e\u0c30\u0c24\u0c4d|\u0d2d\u0d3e\u0d30\u0d24\u0d02|\u5609\u91cc\u5927\u9152\u5e97|aarp|able|adac|aero|akdn|ally|amex|arab|army|arpa|arte|asda|asia|audi|auto|baby|band|bank|bbva|beer|best|bike|bing|blog|blue|bofa|bond|book|buzz|cafe|call|camp|care|cars|casa|case|cash|cbre|cern|chat|citi|city|club|cool|coop|cyou|data|date|dclk|deal|dell|desi|diet|dish|docs|dvag|erni|fage|fail|fans|farm|fast|fiat|fido|film|fire|fish|flir|food|ford|free|fund|game|gbiz|gent|ggee|gift|gmbh|gold|golf|goog|guge|guru|hair|haus|hdfc|help|here|hgtv|host|hsbc|icbc|ieee|imdb|immo|info|itau|java|jeep|jobs|jprs|kddi|kids|kiwi|kpmg|kred|land|lego|lgbt|lidl|life|like|limo|link|live|loan|loft|love|ltda|luxe|maif|meet|meme|menu|mini|mint|mobi|moda|moto|name|navy|news|next|nico|nike|ollo|open|page|pars|pccw|pics|ping|pink|play|plus|pohl|porn|post|prod|prof|qpon|read|reit|rent|rest|rich|room|rsvp|ruhr|safe|sale|sarl|save|saxo|scot|seat|seek|sexy|shaw|shia|shop|show|silk|sina|site|skin|sncf|sohu|song|sony|spot|star|surf|talk|taxi|team|tech|teva|tiaa|tips|town|toys|tube|vana|visa|viva|vivo|vote|voto|wang|weir|wien|wiki|wine|work|xbox|yoga|zara|zero|zone|\u0434\u0435\u0442\u0438|\u0441\u0430\u0439\u0442|\u0628\u0627\u0631\u062a|\u0628\u064a\u062a\u0643|\u0680\u0627\u0631\u062a|\u062a\u0648\u0646\u0633|\u0634\u0628\u0643\u0629|\u0639\u0631\u0627\u0642|\u0639\u0645\u0627\u0646|\u0645\u0648\u0642\u0639|\u092d\u093e\u0930\u0924|\u09ad\u09be\u09b0\u09a4|\u09ad\u09be\u09f0\u09a4|\u0a2d\u0a3e\u0a30\u0a24|\u0aad\u0abe\u0ab0\u0aa4|\u0b2d\u0b3e\u0b30\u0b24|\u0cad\u0cbe\u0cb0\u0ca4|\u0dbd\u0d82\u0d9a\u0dcf|\u30a2\u30de\u30be\u30f3|\u30b0\u30fc\u30b0\u30eb|\u30af\u30e9\u30a6\u30c9|\u30dd\u30a4\u30f3\u30c8|\u7ec4\u7ec7\u673a\u6784|\u96fb\u8a0a\u76c8\u79d1|\u9999\u683c\u91cc\u62c9|aaa|abb|abc|aco|ads|aeg|afl|aig|anz|aol|app|art|aws|axa|bar|bbc|bbt|bcg|bcn|bet|bid|bio|biz|bms|bmw|bom|boo|bot|box|buy|bzh|cab|cal|cam|car|cat|cba|cbn|cbs|ceo|cfa|cfd|com|cpa|crs|dad|day|dds|dev|dhl|diy|dnp|dog|dot|dtv|dvr|eat|eco|edu|esq|eus|fan|fit|fly|foo|fox|frl|ftr|fun|fyi|gal|gap|gay|gdn|gea|gle|gmo|gmx|goo|gop|got|gov|hbo|hiv|hkt|hot|how|ibm|ice|icu|ifm|inc|ing|ink|int|ist|itv|jcb|jio|jll|jmp|jnj|jot|joy|kfh|kia|kim|kpn|krd|lat|law|lds|llc|llp|lol|lpl|ltd|man|map|mba|med|men|mil|mit|mlb|mls|mma|moe|moi|mom|mov|msd|mtn|mtr|nab|nba|nec|net|new|nfl|ngo|nhk|now|nra|nrw|ntt|nyc|obi|one|ong|onl|ooo|org|ott|ovh|pay|pet|phd|pid|pin|pnc|pro|pru|pub|pwc|red|ren|ril|rio|rip|run|rwe|sap|sas|sbi|sbs|sca|scb|ses|sew|sex|sfr|ski|sky|soy|spa|srl|stc|tab|tax|tci|tdk|tel|thd|tjx|top|trv|tui|tvs|ubs|uno|uol|ups|vet|vig|vin|vip|wed|win|wme|wow|wtc|wtf|xin|xxx|xyz|you|yun|zip|\u0431\u0435\u043b|\u043a\u043e\u043c|\u049b\u0430\u0437|\u043c\u043a\u0434|\u043c\u043e\u043d|\u043e\u0440\u0433|\u0440\u0443\u0441|\u0441\u0440\u0431|\u0443\u043a\u0440|\u0570\u0561\u0575|\u05e7\u05d5\u05dd|\u0639\u0631\u0628|\u0642\u0637\u0631|\u0643\u0648\u0645|\u0645\u0635\u0631|\u0915\u0949\u092e|\u0928\u0947\u091f|\u0e04\u0e2d\u0e21|\u0e44\u0e17\u0e22|\u0ea5\u0eb2\u0ea7|\u30b9\u30c8\u30a2|\u30bb\u30fc\u30eb|\u307f\u3093\u306a|\u4e2d\u6587\u7f51|\u4e9a\u9a6c\u900a|\u5929\u4e3b\u6559|\u6211\u7231\u4f60|\u65b0\u52a0\u5761|\u6de1\u9a6c\u9521|\u8bfa\u57fa\u4e9a|\u98de\u5229\u6d66|ac|ad|ae|af|ag|ai|al|am|ao|aq|ar|as|at|au|aw|ax|az|ba|bb|bd|be|bf|bg|bh|bi|bj|bm|bn|bo|br|bs|bt|bv|bw|by|bz|ca|cc|cd|cf|cg|ch|ci|ck|cl|cm|cn|co|cr|cu|cv|cw|cx|cy|cz|de|dj|dk|dm|do|dz|ec|ee|eg|er|es|et|eu|fi|fj|fk|fm|fo|fr|ga|gb|gd|ge|gf|gg|gh|gi|gl|gm|gn|gp|gq|gr|gs|gt|gu|gw|gy|hk|hm|hn|hr|ht|hu|id|ie|il|im|in|io|iq|ir|is|it|je|jm|jo|jp|ke|kg|kh|ki|km|kn|kp|kr|kw|ky|kz|la|lb|lc|li|lk|lr|ls|lt|lu|lv|ly|ma|mc|md|me|mg|mh|mk|ml|mm|mn|mo|mp|mq|mr|ms|mt|mu|mv|mw|mx|my|mz|na|nc|ne|nf|ng|ni|nl|no|np|nr|nu|nz|om|pa|pe|pf|pg|ph|pk|pl|pm|pn|pr|ps|pt|pw|py|qa|re|ro|rs|ru|rw|sa|sb|sc|sd|se|sg|sh|si|sj|sk|sl|sm|sn|so|sr|ss|st|su|sv|sx|sy|sz|tc|td|tf|tg|th|tj|tk|tl|tm|tn|to|tr|tt|tv|tw|tz|ua|ug|uk|us|uy|uz|va|vc|ve|vg|vi|vn|vu|wf|ws|ye|yt|za|zm|zw|\u03b5\u03bb|\u03b5\u03c5|\u0431\u0433|\u0435\u044e|\u0440\u0444|\u10d2\u10d4|\ub2f7\ub137|\ub2f7\ucef4|\uc0bc\uc131|\ud55c\uad6d|\u30b3\u30e0|\u4e16\u754c|\u4e2d\u4fe1|\u4e2d\u56fd|\u4e2d\u570b|\u4f01\u4e1a|\u4f5b\u5c71|\u4fe1\u606f|\u5065\u5eb7|\u516b\u5366|\u516c\u53f8|\u516c\u76ca|\u53f0\u6e7e|\u53f0\u7063|\u5546\u57ce|\u5546\u5e97|\u5546\u6807|\u5609\u91cc|\u5728\u7ebf|\u5927\u62ff|\u5a31\u4e50|\u5bb6\u96fb|\u5e7f\u4e1c|\u5fae\u535a|\u6148\u5584|\u624b\u673a|\u62db\u8058|\u653f\u52a1|\u653f\u5e9c|\u65b0\u95fb|\u65f6\u5c1a|\u66f8\u7c4d|\u673a\u6784|\u6e38\u620f|\u6fb3\u9580|\u70b9\u770b|\u79fb\u52a8|\u7f51\u5740|\u7f51\u5e97|\u7f51\u7ad9|\u7f51\u7edc|\u8054\u901a|\u8c37\u6b4c|\u8d2d\u7269|\u901a\u8ca9|\u96c6\u56e2|\u98df\u54c1|\u9910\u5385|\u9999\u6e2f)/,bx=new RegExp("[".concat(Yc,"!#$%&'*+/=?^_`{|}~-]")),Ex=new RegExp("^".concat(eT.source,"$")),UM=function(n){function s(){var t=null!==n&&n.apply(this,arguments)||this;return t.localPartCharRegex=bx,t.strictTldRegex=Ex,t}return(0,ha.ZT)(s,n),s.prototype.parseMatches=function(t){for(var o=this.tagBuilder,c=this.localPartCharRegex,g=this.strictTldRegex,C=[],D=t.length,P=new Zy,j={m:"a",a:"i",i:"l",l:"t",t:"o",o:":"},W=0,re=0,ie=P;W<D;){var ge=t.charAt(W);switch(re){case 0:"m"===(Lt=ge)?wt(1):c.test(Lt)&&wt();break;case 1:Le(t.charAt(W-1),ge);break;case 2:Re(ge);break;case 3:ke(ge);break;case 4:xe(ge);break;case 5:U(ge);break;case 6:pt(ge);break;case 7:ht(ge);break;default:ux(re)}W++}var Lt;return dn(),C;function Le(Lt,Dn){":"===Lt?c.test(Dn)?(re=2,ie=new Zy((0,ha.pi)((0,ha.pi)({},ie),{hasMailtoPrefix:!0}))):It():j[Lt]===Dn||(c.test(Dn)?re=2:"."===Dn?re=3:"@"===Dn?re=4:It())}function Re(Lt){"."===Lt?re=3:"@"===Lt?re=4:c.test(Lt)||It()}function ke(Lt){"."===Lt||"@"===Lt?It():c.test(Lt)?re=2:It()}function xe(Lt){qE.test(Lt)?re=5:It()}function U(Lt){"."===Lt?re=7:"-"===Lt?re=6:qE.test(Lt)||dn()}function pt(Lt){"-"===Lt||"."===Lt?dn():qE.test(Lt)?re=5:dn()}function ht(Lt){"."===Lt||"-"===Lt?dn():qE.test(Lt)?(re=5,ie=new Zy((0,ha.pi)((0,ha.pi)({},ie),{hasDomainDot:!0}))):dn()}function wt(Lt){void 0===Lt&&(Lt=2),re=Lt,ie=new Zy({idx:W})}function It(){re=0,ie=P}function dn(){if(ie.hasDomainDot){var Lt=t.slice(ie.idx,W);/[-.]$/.test(Lt)&&(Lt=Lt.slice(0,-1));var Dn=ie.hasMailtoPrefix?Lt.slice("mailto:".length):Lt;Pr=(Dn.split(".").pop()||"").toLowerCase(),g.test(Pr)&&C.push(new PM({tagBuilder:o,matchedText:Lt,offset:ie.idx,email:Dn}))}var Pr;It()}},s}(Uv),Zy=function(s){void 0===s&&(s={}),this.idx=void 0!==s.idx?s.idx:-1,this.hasMailtoPrefix=!!s.hasMailtoPrefix,this.hasDomainDot=!!s.hasDomainDot},Tx=function(){function n(){}return n.isValid=function(s,t){return!(t&&!this.isValidUriScheme(t)||this.urlMatchDoesNotHaveProtocolOrDot(s,t)||this.urlMatchDoesNotHaveAtLeastOneWordChar(s,t)&&!this.isValidIpAddress(s)||this.containsMultipleDots(s))},n.isValidIpAddress=function(s){var t=new RegExp(this.hasFullProtocolRegex.source+this.ipRegex.source);return null!==s.match(t)},n.containsMultipleDots=function(s){var t=s;return this.hasFullProtocolRegex.test(s)&&(t=s.split("://")[1]),t.split("/")[0].indexOf("..")>-1},n.isValidUriScheme=function(s){var t=s.match(this.uriSchemeRegex),o=t&&t[0].toLowerCase();return"javascript:"!==o&&"vbscript:"!==o},n.urlMatchDoesNotHaveProtocolOrDot=function(s,t){return!(!s||t&&this.hasFullProtocolRegex.test(t)||-1!==s.indexOf("."))},n.urlMatchDoesNotHaveAtLeastOneWordChar=function(s,t){return!(!s||!t||this.hasFullProtocolRegex.test(t)||this.hasWordCharAfterProtocolRegex.test(s))},n.hasFullProtocolRegex=/^[A-Za-z][-.+A-Za-z0-9]*:\/\//,n.uriSchemeRegex=/^[A-Za-z][-.+A-Za-z0-9]*:/,n.hasWordCharAfterProtocolRegex=new RegExp(":[^\\s]*?["+_x+"]"),n.ipRegex=/[0-9][0-9]?[0-9]?\.[0-9][0-9]?[0-9]?\.[0-9][0-9]?[0-9]?\.[0-9][0-9]?[0-9]?(:[0-9]*)?\/?$/,n}(),BM=(t=new RegExp("[/?#](?:["+Yc+"\\-+&@#/%=~_()|'$*\\[\\]{}?!:,.;^\u2713]*["+Yc+"\\-+&@#/%=~_()|'$*\\[\\]{}\u2713])?"),new RegExp(["(?:","(",/(?:[A-Za-z][-.+A-Za-z0-9]{0,63}:(?![A-Za-z][-.+A-Za-z0-9]{0,63}:\/\/)(?!\d+\/?)(?:\/\/)?)/.source,By(2),")","|","(","(//)?",/(?:www\.)/.source,By(6),")","|","(","(//)?",By(10)+"\\.",eT.source,"(?![-"+vx+"])",")",")","(?::[0-9]+)?","(?:"+t.source+")?"].join(""),"gi")),Sx=new RegExp("["+Yc+"]"),YM=function(n){function s(t){var o=n.call(this,t)||this;return o.stripPrefix={scheme:!0,www:!0},o.stripTrailingSlash=!0,o.decodePercentEncoding=!0,o.matcherRegex=BM,o.wordCharRegExp=Sx,o.stripPrefix=t.stripPrefix,o.stripTrailingSlash=t.stripTrailingSlash,o.decodePercentEncoding=t.decodePercentEncoding,o}return(0,ha.ZT)(s,n),s.prototype.parseMatches=function(t){for(var j,o=this.matcherRegex,c=this.stripPrefix,g=this.stripTrailingSlash,C=this.decodePercentEncoding,D=this.tagBuilder,P=[],W=function(){var ie=j[0],ge=j[1],_e=j[4],ke=j.index,xe=j[5]||j[9],U=t.charAt(ke-1);if(!Tx.isValid(ie,ge)||ke>0&&"@"===U||ke>0&&xe&&re.wordCharRegExp.test(U))return"continue";if(/\?$/.test(ie)&&(ie=ie.substr(0,ie.length-1)),re.matchHasUnbalancedClosingParen(ie))ie=ie.substr(0,ie.length-1);else{var pt=re.matchHasInvalidCharAfterTld(ie,ge);pt>-1&&(ie=ie.substr(0,pt))}var ht=["http://","https://"].find(function(Lt){return!!ge&&-1!==ge.indexOf(Lt)});if(ht){var wt=ie.indexOf(ht);ie=ie.substr(wt),ge=ge.substr(wt),ke+=wt}P.push(new kM({tagBuilder:D,matchedText:ie,offset:ke,urlMatchType:ge?"scheme":_e?"www":"tld",url:ie,protocolUrlMatch:!!ge,protocolRelativeMatch:!!xe,stripPrefix:c,stripTrailingSlash:g,decodePercentEncoding:C}))},re=this;null!==(j=o.exec(t));)W();return P},s.prototype.matchHasUnbalancedClosingParen=function(t){var c,o=t.charAt(t.length-1);if(")"===o)c="(";else if("]"===o)c="[";else{if("}"!==o)return!1;c="{"}for(var g=0,C=0,D=t.length-1;C<D;C++){var P=t.charAt(C);P===c?g++:P===o&&(g=Math.max(g-1,0))}return 0===g},s.prototype.matchHasInvalidCharAfterTld=function(t,o){if(!t)return-1;var c=0;o&&(c=t.indexOf(":"),t=t.slice(c));var C=new RegExp("^((.?//)?[-."+Yc+"]*[-"+Yc+"]\\.[-"+Yc+"]+)").exec(t);return null===C?-1:(c+=C[1].length,t=t.slice(C[1].length),/^[^-.A-Za-z0-9:\/?#]/.test(t)?c:-1)},s}(Uv),BR=new RegExp("#[_".concat(Yc,"]{1,139}(?![_").concat(Yc,"])"),"g"),YR=new RegExp("[^"+Yc+"]"),Cx=function(n){function s(t){var o=n.call(this,t)||this;return o.serviceName="twitter",o.matcherRegex=BR,o.nonWordCharRegex=YR,o.serviceName=t.serviceName,o}return(0,ha.ZT)(s,n),s.prototype.parseMatches=function(t){for(var P,o=this.matcherRegex,c=this.nonWordCharRegex,g=this.serviceName,C=this.tagBuilder,D=[];null!==(P=o.exec(t));){var j=P.index,W=t.charAt(j-1);if(0===j||c.test(W)){var re=P[0],ie=P[0].slice(1);D.push(new IM({tagBuilder:C,matchedText:re,offset:j,serviceName:g,hashtag:ie}))}}return D},s}(Uv),Ax=new RegExp("".concat(/(?:(?:(?:(\+)?\d{1,3}[-\040.]?)?\(?\d{3}\)?[-\040.]?\d{3}[-\040.]?\d{4})|(?:(\+)(?:9[976]\d|8[987530]\d|6[987]\d|5[90]\d|42\d|3[875]\d|2[98654321]\d|9[8543210]|8[6421]|6[6543210]|5[87654321]|4[987654310]|3[9643210]|2[70]|7|1)[-\040.]?(?:\d[-\040.]?){6,12}\d+))([,;]+[0-9]+#?)*/.source,"|").concat(/(0([1-9]{1}-?[1-9]\d{3}|[1-9]{2}-?\d{3}|[1-9]{2}\d{1}-?\d{2}|[1-9]{2}\d{2}-?\d{1})-?\d{4}|0[789]0-?\d{4}-?\d{4}|050-?\d{4}-?\d{4})/.source),"g"),ZM=function(n){function s(){var t=null!==n&&n.apply(this,arguments)||this;return t.matcherRegex=Ax,t}return(0,ha.ZT)(s,n),s.prototype.parseMatches=function(t){for(var C,o=this.matcherRegex,c=this.tagBuilder,g=[];null!==(C=o.exec(t));){var D=C[0],P=D.replace(/[^0-9,;#]/g,""),j=!(!C[1]&&!C[2]),W=0==C.index?"":t.substr(C.index-1,1),re=t.substr(C.index+D.length,1),ie=!W.match(/\d/)&&!re.match(/\d/);this.testMatch(C[3])&&this.testMatch(D)&&ie&&g.push(new FM({tagBuilder:c,matchedText:D,offset:C.index,number:P,plusSign:j}))}return g},s.prototype.testMatch=function(t){return px.test(t)},s}(Uv),Ox=new RegExp("@[_".concat(Yc,"]{1,50}(?![_").concat(Yc,"])"),"g"),wx=new RegExp("@[_.".concat(Yc,"]{1,30}(?![_").concat(Yc,"])"),"g"),xx=new RegExp("@[-_.".concat(Yc,"]{1,50}(?![-_").concat(Yc,"])"),"g"),jM=new RegExp("@[_.".concat(Yc,"]{1,23}[_").concat(Yc,"](?![_").concat(Yc,"])"),"g"),nT=new RegExp("[^"+Yc+"]"),GM=function(n){function s(t){var o=n.call(this,t)||this;return o.serviceName="twitter",o.matcherRegexes={twitter:Ox,instagram:wx,soundcloud:xx,tiktok:jM},o.nonWordCharRegex=nT,o.serviceName=t.serviceName,o}return(0,ha.ZT)(s,n),s.prototype.parseMatches=function(t){var P,o=this.serviceName,c=this.matcherRegexes[this.serviceName],g=this.nonWordCharRegex,C=this.tagBuilder,D=[];if(!c)return D;for(;null!==(P=c.exec(t));){var j=P.index,W=t.charAt(j-1);if(0===j||g.test(W)){var re=P[0].replace(/\.+$/g,""),ie=re.slice(1);D.push(new LM({tagBuilder:C,matchedText:re,offset:j,serviceName:o,mention:ie}))}}return D},s}(Uv);var Kc=function(s){void 0===s&&(s={}),this.idx=void 0!==s.idx?s.idx:-1,this.type=s.type||"tag",this.name=s.name||"",this.isOpening=!!s.isOpening,this.isClosing=!!s.isClosing};const rT=function(){function n(s){void 0===s&&(s={}),this.version=n.version,this.urls={},this.email=!0,this.phone=!0,this.hashtag=!1,this.mention=!1,this.newWindow=!0,this.stripPrefix={scheme:!0,www:!0},this.stripTrailingSlash=!0,this.decodePercentEncoding=!0,this.truncate={length:0,location:"end"},this.className="",this.replaceFn=null,this.context=void 0,this.sanitizeHtml=!1,this.matchers=null,this.tagBuilder=null,this.urls=this.normalizeUrlsCfg(s.urls),this.email="boolean"==typeof s.email?s.email:this.email,this.phone="boolean"==typeof s.phone?s.phone:this.phone,this.hashtag=s.hashtag||this.hashtag,this.mention=s.mention||this.mention,this.newWindow="boolean"==typeof s.newWindow?s.newWindow:this.newWindow,this.stripPrefix=this.normalizeStripPrefixCfg(s.stripPrefix),this.stripTrailingSlash="boolean"==typeof s.stripTrailingSlash?s.stripTrailingSlash:this.stripTrailingSlash,this.decodePercentEncoding="boolean"==typeof s.decodePercentEncoding?s.decodePercentEncoding:this.decodePercentEncoding,this.sanitizeHtml=s.sanitizeHtml||!1;var t=this.mention;if(!1!==t&&-1===["twitter","instagram","soundcloud","tiktok"].indexOf(t))throw new Error("invalid `mention` cfg '".concat(t,"' - see docs"));var o=this.hashtag;if(!1!==o&&-1===["twitter","facebook","instagram","tiktok"].indexOf(o))throw new Error("invalid `hashtag` cfg '".concat(o,"' - see docs"));this.truncate=this.normalizeTruncateCfg(s.truncate),this.className=s.className||this.className,this.replaceFn=s.replaceFn||this.replaceFn,this.context=s.context||this}return n.link=function(s,t){return new n(t).link(s)},n.parse=function(s,t){return new n(t).parse(s)},n.prototype.normalizeUrlsCfg=function(s){return null==s&&(s=!0),"boolean"==typeof s?{schemeMatches:s,wwwMatches:s,tldMatches:s}:{schemeMatches:"boolean"!=typeof s.schemeMatches||s.schemeMatches,wwwMatches:"boolean"!=typeof s.wwwMatches||s.wwwMatches,tldMatches:"boolean"!=typeof s.tldMatches||s.tldMatches}},n.prototype.normalizeStripPrefixCfg=function(s){return null==s&&(s=!0),"boolean"==typeof s?{scheme:s,www:s}:{scheme:"boolean"!=typeof s.scheme||s.scheme,www:"boolean"!=typeof s.www||s.www}},n.prototype.normalizeTruncateCfg=function(s){return"number"==typeof s?{length:s,location:"end"}:function(n,s){for(var t in s)s.hasOwnProperty(t)&&void 0===n[t]&&(n[t]=s[t]);return n}(s||{},{length:Number.POSITIVE_INFINITY,location:"end"})},n.prototype.parse=function(s){var t=this,o=["a","style","script"],c=0,g=[];return function(n,s){for(var t=s.onOpenTag,o=s.onCloseTag,c=s.onText,g=s.onComment,C=s.onDoctype,D=new Kc,P=0,j=n.length,W=0,re=0,ie=D;P<j;){var ge=n.charAt(P);switch(W){case 0:"<"===ge&&Tn();break;case 1:"!"===(Jr=ge)?W=13:"/"===Jr?(W=2,ie=new Kc((0,ha.pi)((0,ha.pi)({},ie),{isClosing:!0}))):"<"===Jr?Tn():e0.test(Jr)?(W=3,ie=new Kc((0,ha.pi)((0,ha.pi)({},ie),{isOpening:!0}))):(W=0,ie=D);break;case 2:ke(ge);break;case 3:Re(ge);break;case 4:xe(ge);break;case 5:U(ge);break;case 6:pt(ge);break;case 7:ht(ge);break;case 8:wt(ge);break;case 9:It(ge);break;case 10:dn(ge);break;case 11:Lt(ge);break;case 12:Dn(ge);break;case 13:"--"===n.substr(P,2)?(P+=2,ie=new Kc((0,ha.pi)((0,ha.pi)({},ie),{type:"comment"})),W=14):"DOCTYPE"===n.substr(P,7).toUpperCase()?(P+=7,ie=new Kc((0,ha.pi)((0,ha.pi)({},ie),{type:"doctype"})),W=20):Qn();break;case 14:$r(ge);break;case 15:ur(ge);break;case 16:Pr(ge);break;case 17:xr(ge);break;case 18:fn(ge);break;case 19:Nn(ge);break;case 20:$n(ge);break;default:ux(W)}P++}var Jr;function Re(Jr){am.test(Jr)?(ie=new Kc((0,ha.pi)((0,ha.pi)({},ie),{name:ii()})),W=4):"<"===Jr?Tn():"/"===Jr?(ie=new Kc((0,ha.pi)((0,ha.pi)({},ie),{name:ii()})),W=12):">"===Jr?(ie=new Kc((0,ha.pi)((0,ha.pi)({},ie),{name:ii()})),Yr()):!e0.test(Jr)&&!fx.test(Jr)&&":"!==Jr&&Qn()}function ke(Jr){">"===Jr?Qn():e0.test(Jr)?W=3:Qn()}function xe(Jr){am.test(Jr)||("/"===Jr?W=12:">"===Jr?Yr():"<"===Jr?Tn():"="===Jr||t0.test(Jr)||hx.test(Jr)?Qn():W=5)}function U(Jr){am.test(Jr)?W=6:"/"===Jr?W=12:"="===Jr?W=7:">"===Jr?Yr():"<"===Jr?Tn():t0.test(Jr)&&Qn()}function pt(Jr){am.test(Jr)||("/"===Jr?W=12:"="===Jr?W=7:">"===Jr?Yr():"<"===Jr?Tn():t0.test(Jr)?Qn():W=5)}function ht(Jr){am.test(Jr)||('"'===Jr?W=8:"'"===Jr?W=9:/[>=`]/.test(Jr)?Qn():"<"===Jr?Tn():W=10)}function wt(Jr){'"'===Jr&&(W=11)}function It(Jr){"'"===Jr&&(W=11)}function dn(Jr){am.test(Jr)?W=4:">"===Jr?Yr():"<"===Jr&&Tn()}function Lt(Jr){am.test(Jr)?W=4:"/"===Jr?W=12:">"===Jr?Yr():"<"===Jr?Tn():(W=4,P--)}function Dn(Jr){">"===Jr?(ie=new Kc((0,ha.pi)((0,ha.pi)({},ie),{isClosing:!0})),Yr()):W=4}function $r(Jr){"-"===Jr?W=15:">"===Jr?Qn():W=16}function ur(Jr){"-"===Jr?W=18:">"===Jr?Qn():W=16}function Pr(Jr){"-"===Jr&&(W=17)}function xr(Jr){W="-"===Jr?18:16}function fn(Jr){">"===Jr?Yr():"!"===Jr?W=19:"-"===Jr||(W=16)}function Nn(Jr){"-"===Jr?W=17:">"===Jr?Yr():W=16}function $n(Jr){">"===Jr?Yr():"<"===Jr&&Tn()}function Qn(){W=0,ie=D}function Tn(){W=1,ie=new Kc({idx:P})}function Yr(){var Jr=n.slice(re,ie.idx);Jr&&c(Jr,re),"comment"===ie.type?g(ie.idx):"doctype"===ie.type?C(ie.idx):(ie.isOpening&&t(ie.name,ie.idx),ie.isClosing&&o(ie.name,ie.idx)),Qn(),re=P+1}function ii(){return n.slice(ie.idx+(ie.isClosing?2:1),P).toLowerCase()}re<P&&function(){var Jr=n.slice(re,P);c(Jr,re),re=P+1}()}(s,{onOpenTag:function(C){o.indexOf(C)>=0&&c++},onText:function(C,D){if(0===c){var j=function(n,s){if(!s.global)throw new Error("`splitRegex` must have the 'g' flag set");for(var c,t=[],o=0;c=s.exec(n);)t.push(n.substring(o,c.index)),t.push(c[0]),o=c.index+c[0].length;return t.push(n.substring(o)),t}(C,/(&nbsp;|&#160;|&lt;|&#60;|&gt;|&#62;|&quot;|&#34;|&#39;)/gi),W=D;j.forEach(function(re,ie){if(ie%2==0){var ge=t.parseText(re,W);g.push.apply(g,ge)}W+=re.length})}},onCloseTag:function(C){o.indexOf(C)>=0&&(c=Math.max(c-1,0))},onComment:function(C){},onDoctype:function(C){}}),g=this.compactMatches(g),g=this.removeUnwantedMatches(g)},n.prototype.compactMatches=function(s){s.sort(function(P,j){return P.getOffset()-j.getOffset()});for(var t=0;t<s.length-1;){var o=s[t],c=o.getOffset(),g=o.getMatchedText().length,C=c+g;if(t+1<s.length){if(s[t+1].getOffset()===c){var D=s[t+1].getMatchedText().length>g?t:t+1;s.splice(D,1);continue}if(s[t+1].getOffset()<C){s.splice(t+1,1);continue}}t++}return s},n.prototype.removeUnwantedMatches=function(s){return this.hashtag||Xm(s,function(t){return"hashtag"===t.getType()}),this.email||Xm(s,function(t){return"email"===t.getType()}),this.phone||Xm(s,function(t){return"phone"===t.getType()}),this.mention||Xm(s,function(t){return"mention"===t.getType()}),this.urls.schemeMatches||Xm(s,function(t){return"url"===t.getType()&&"scheme"===t.getUrlMatchType()}),this.urls.wwwMatches||Xm(s,function(t){return"url"===t.getType()&&"www"===t.getUrlMatchType()}),this.urls.tldMatches||Xm(s,function(t){return"url"===t.getType()&&"tld"===t.getUrlMatchType()}),s},n.prototype.parseText=function(s,t){void 0===t&&(t=0),t=t||0;for(var o=this.getMatchers(),c=[],g=0,C=o.length;g<C;g++){for(var D=o[g].parseMatches(s),P=0,j=D.length;P<j;P++)D[P].setOffset(t+D[P].getOffset());c.push.apply(c,D)}return c},n.prototype.link=function(s){if(!s)return"";this.sanitizeHtml&&(s=s.replace(/</g,"&lt;").replace(/>/g,"&gt;"));for(var t=this.parse(s),o=[],c=0,g=0,C=t.length;g<C;g++){var D=t[g];o.push(s.substring(c,D.getOffset())),o.push(this.createMatchReturnVal(D)),c=D.getOffset()+D.getMatchedText().length}return o.push(s.substring(c)),o.join("")},n.prototype.createMatchReturnVal=function(s){var t;return this.replaceFn&&(t=this.replaceFn.call(this.context,s)),"string"==typeof t?t:!1===t?s.getMatchedText():t instanceof RM?t.toAnchorString():s.buildTag().toAnchorString()},n.prototype.getMatchers=function(){if(this.matchers)return this.matchers;var s=this.getTagBuilder(),t=[new Cx({tagBuilder:s,serviceName:this.hashtag}),new UM({tagBuilder:s}),new ZM({tagBuilder:s}),new GM({tagBuilder:s,serviceName:this.mention}),new YM({tagBuilder:s,stripPrefix:this.stripPrefix,stripTrailingSlash:this.stripTrailingSlash,decodePercentEncoding:this.decodePercentEncoding})];return this.matchers=t},n.prototype.getTagBuilder=function(){var s=this.tagBuilder;return s||(s=this.tagBuilder=new NM({newWindow:this.newWindow,truncate:this.truncate,className:this.className})),s},n.version="3.16.0",n.AnchorTagBuilder=NM,n.HtmlTag=RM,n.matcher={Email:UM,Hashtag:Cx,Matcher:Uv,Mention:GM,Phone:ZM,Url:YM},n.match={Email:PM,Hashtag:IM,Match:sm,Mention:LM,Phone:FM,Url:kM},n}();var Dx=/www|@|\:\/\//;function zM(n){return/^<a[>\s]/i.test(n)}function WM(n){return/^<\/a\s*>/i.test(n)}function JM(){var n=[],s=new rT({stripPrefix:!1,url:!0,email:!0,replaceFn:function(t){switch(t.getType()){case"url":n.push({text:t.matchedText,url:t.getUrl()});break;case"email":n.push({text:t.matchedText,url:"mailto:"+t.getEmail().replace(/^mailto:/i,"")})}return!1}});return{links:n,autolinker:s}}function Rx(n){var s,t,o,c,g,C,D,P,j,W,re,_e,Le,ie=n.tokens,ge=null;for(t=0,o=ie.length;t<o;t++)if("inline"===ie[t].type)for(re=0,s=(c=ie[t].children).length-1;s>=0;s--)if("link_close"!==(g=c[s]).type){if("htmltag"===g.type&&(zM(g.content)&&re>0&&re--,WM(g.content)&&re++),!(re>0)&&"text"===g.type&&Dx.test(g.content)){if(ge||(_e=(ge=JM()).links,Le=ge.autolinker),C=g.content,_e.length=0,Le.link(C),!_e.length)continue;for(D=[],W=g.level,P=0;P<_e.length;P++)!n.inline.validateLink(_e[P].url)||((j=C.indexOf(_e[P].text))&&D.push({type:"text",content:C.slice(0,j),level:W}),D.push({type:"link_open",href:_e[P].url,title:"",level:W++}),D.push({type:"text",content:_e[P].text,level:W}),D.push({type:"link_close",level:--W}),C=C.slice(j+_e[P].text.length));C.length&&D.push({type:"text",content:C,level:W}),ie[t].children=c=[].concat(c.slice(0,s),D,c.slice(s+1))}}else for(s--;c[s].level!==g.level&&"link_open"!==c[s].type;)s--}function Nx(n){n.core.ruler.push("linkify",Rx)}var Px=i(23358),QM=i.n(Px),Ix=i(1653),ZR=i.n(Ix),Lx=i(86101),Fx=i.n(Lx),lm=i(64975);function kx(n){if(lm(n))return n}var um=i(63380),iT=i(66627),$x=i(8225);function oT(n){if(void 0!==um&&null!=iT(n)||null!=n["@@iterator"])return $x(n)}var Hx=i(19621);function r0(n,s){(null==s||s>n.length)&&(s=n.length);for(var t=0,o=new Array(s);t<s;t++)o[t]=n[t];return o}function i0(n,s){var t;if(n){if("string"==typeof n)return r0(n,s);var o=Hx(t=Object.prototype.toString.call(n)).call(t,8,-1);if("Object"===o&&n.constructor&&(o=n.constructor.name),"Map"===o||"Set"===o)return $x(n);if("Arguments"===o||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(o))return r0(n,s)}}function sT(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}function XM(n){return kx(n)||oT(n)||i0(n)||sT()}var KM=i(53757),qM=i.n(KM),e2=i(48129),Ux=i.n(e2),Bx=i(31507),Yx=i.n(Bx),Zx=i(17346),o0=i.n(Zx),t2=i(12232),n2=i.n(t2),aT=i(69138);function lT(n,s,t,o,c,g,C){try{var D=n[g](C),P=D.value}catch(j){return void t(j)}D.done?s(P):aT.resolve(P).then(o,c)}function s0(n){return function(){var s=this,t=arguments;return new aT(function(o,c){var g=n.apply(s,t);function C(P){lT(g,o,c,C,D,"next",P)}function D(P){lT(g,o,c,C,D,"throw",P)}C(void 0)})}}var r2=i(33950),M_=i.n(r2),i2=i(86413),Dg=i.n(i2),o2=i(14226),jx=i.n(o2),Gx=i(64871),a0=i.n(Gx),l0=i(41776),Vx=i.n(l0),uT=i(12666),ug=i.n(uT);function cm(n,s){var t=void 0!==um&&iT(n)||n["@@iterator"];if(!t){if(lm(n)||(t=i0(n))||s&&n&&"number"==typeof n.length){t&&(n=t);var o=0,c=function(){};return{s:c,n:function(){return o>=n.length?{done:!0}:{done:!1,value:n[o++]}},e:function(j){throw j},f:c}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}var D,g=!0,C=!1;return{s:function(){t=t.call(n)},n:function(){var j=t.next();return g=j.done,j},e:function(j){C=!0,D=j},f:function(){try{!g&&null!=t.return&&t.return()}finally{if(C)throw D}}}}var jy=i(66342);function vc(n){return(vc="function"==typeof um&&"symbol"==typeof jy?function(s){return typeof s}:function(s){return s&&"function"==typeof um&&s.constructor===um&&s!==um.prototype?"symbol":typeof s})(n)}function A_(n,s){return kx(n)||function(n,s){var t=null==n?null:void 0!==um&&iT(n)||n["@@iterator"];if(null!=t){var C,D,o=[],c=!0,g=!1;try{for(t=t.call(n);!(c=(C=t.next()).done)&&(o.push(C.value),!s||o.length!==s);c=!0);}catch(P){g=!0,D=P}finally{try{!c&&null!=t.return&&t.return()}finally{if(g)throw D}}return o}}(n,s)||i0(n,s)||sT()}var cT=i(35524),dm=i.n(cT),s2=i(28086),u0=i.n(s2),dT=i(30071),fT=i.n(dT),Wx=i(44859),c0=i.n(Wx),Jx=i(37940),Lu=i.n(Jx),pT=i(46245),Su=i.n(pT),a2=i(34377),la=i.n(a2),l2=i(15865),u2=i.n(l2),c2=i(10068),zp=i.n(c2),d2=(i(71577),i(59009)),Gy=i.n(d2);function Qx(n){return null==n}var Sf={isNothing:Qx,isObject:function(n){return"object"==typeof n&&null!==n},toArray:function(n){return Array.isArray(n)?n:Qx(n)?[]:[n]},repeat:function(n,s){var o,t="";for(o=0;o<s;o+=1)t+=n;return t},isNegativeZero:function(n){return 0===n&&Number.NEGATIVE_INFINITY===1/n},extend:function(n,s){var t,o,c,g;if(s)for(t=0,o=(g=Object.keys(s)).length;t<o;t+=1)n[c=g[t]]=s[c];return n}};function Vy(n,s){var t="",o=n.reason||"(unknown reason)";return n.mark?(n.mark.name&&(t+='in "'+n.mark.name+'" '),t+="("+(n.mark.line+1)+":"+(n.mark.column+1)+")",!s&&n.mark.snippet&&(t+="\n\n"+n.mark.snippet),o+" "+t):o}function Zv(n,s){Error.call(this),this.name="YAMLException",this.reason=n,this.mark=s,this.message=Vy(this,!1),Error.captureStackTrace?Error.captureStackTrace(this,this.constructor):this.stack=(new Error).stack||""}(Zv.prototype=Object.create(Error.prototype)).constructor=Zv,Zv.prototype.toString=function(s){return this.name+": "+Vy(this,s)};var sp=Zv;function jv(n,s,t,o,c){var g="",C="",D=Math.floor(c/2)-1;return o-s>D&&(s=o-D+(g=" ... ").length),t-o>D&&(t=o+D-(C=" ...").length),{str:g+n.slice(s,t).replace(/\t/g,"\u2192")+C,pos:o-s+g.length}}function f0(n,s){return Sf.repeat(" ",s-n.length)+n}var nD=["kind","multi","resolve","construct","instanceOf","predicate","represent","representName","defaultStyle","styleAliases"],h2=["scalar","sequence","mapping"],Wf=function(n,s){if(s=s||{},Object.keys(s).forEach(function(t){if(-1===nD.indexOf(t))throw new sp('Unknown option "'+t+'" is met in definition of "'+n+'" YAML type.')}),this.options=s,this.tag=n,this.kind=s.kind||null,this.resolve=s.resolve||function(){return!0},this.construct=s.construct||function(t){return t},this.instanceOf=s.instanceOf||null,this.predicate=s.predicate||null,this.represent=s.represent||null,this.representName=s.representName||null,this.defaultStyle=s.defaultStyle||null,this.multi=s.multi||!1,this.styleAliases=function(n){var s={};return null!==n&&Object.keys(n).forEach(function(t){n[t].forEach(function(o){s[String(o)]=t})}),s}(s.styleAliases||null),-1===h2.indexOf(this.kind))throw new sp('Unknown kind "'+this.kind+'" is specified for "'+n+'" YAML type.')};function Wy(n,s){var t=[];return n[s].forEach(function(o){var c=t.length;t.forEach(function(g,C){g.tag===o.tag&&g.kind===o.kind&&g.multi===o.multi&&(c=C)}),t[c]=o}),t}function gT(n){return this.extend(n)}gT.prototype.extend=function(s){var t=[],o=[];if(s instanceof Wf)o.push(s);else if(Array.isArray(s))o=o.concat(s);else{if(!s||!Array.isArray(s.implicit)&&!Array.isArray(s.explicit))throw new sp("Schema.extend argument should be a Type, [ Type ], or a schema definition ({ implicit: [...], explicit: [...] })");s.implicit&&(t=t.concat(s.implicit)),s.explicit&&(o=o.concat(s.explicit))}t.forEach(function(g){if(!(g instanceof Wf))throw new sp("Specified list of YAML types (or a single Type object) contains a non-Type object.");if(g.loadKind&&"scalar"!==g.loadKind)throw new sp("There is a non-scalar type in the implicit list of a schema. Implicit resolving of such types is not supported.");if(g.multi)throw new sp("There is a multi type in the implicit list of a schema. Multi tags can only be listed as explicit.")}),o.forEach(function(g){if(!(g instanceof Wf))throw new sp("Specified list of YAML types (or a single Type object) contains a non-Type object.")});var c=Object.create(gT.prototype);return c.implicit=(this.implicit||[]).concat(t),c.explicit=(this.explicit||[]).concat(o),c.compiledImplicit=Wy(c,"implicit"),c.compiledExplicit=Wy(c,"explicit"),c.compiledTypeMap=function(){var s,t,n={scalar:{},sequence:{},mapping:{},fallback:{},multi:{scalar:[],sequence:[],mapping:[],fallback:[]}};function o(c){c.multi?(n.multi[c.kind].push(c),n.multi.fallback.push(c)):n[c.kind][c.tag]=n.fallback[c.tag]=c}for(s=0,t=arguments.length;s<t;s+=1)arguments[s].forEach(o);return n}(c.compiledImplicit,c.compiledExplicit),c};var g2=gT,mT=new Wf("tag:yaml.org,2002:str",{kind:"scalar",construct:function(n){return null!==n?n:""}}),vT=new Wf("tag:yaml.org,2002:seq",{kind:"sequence",construct:function(n){return null!==n?n:[]}}),yT=new Wf("tag:yaml.org,2002:map",{kind:"mapping",construct:function(n){return null!==n?n:{}}}),m2=new g2({explicit:[mT,vT,yT]}),b2=new Wf("tag:yaml.org,2002:null",{kind:"scalar",resolve:function(n){if(null===n)return!0;var s=n.length;return 1===s&&"~"===n||4===s&&("null"===n||"Null"===n||"NULL"===n)},construct:function(){return null},predicate:function(n){return null===n},represent:{canonical:function(){return"~"},lowercase:function(){return"null"},uppercase:function(){return"NULL"},camelcase:function(){return"Null"},empty:function(){return""}},defaultStyle:"lowercase"}),bT=new Wf("tag:yaml.org,2002:bool",{kind:"scalar",resolve:function(n){if(null===n)return!1;var s=n.length;return 4===s&&("true"===n||"True"===n||"TRUE"===n)||5===s&&("false"===n||"False"===n||"FALSE"===n)},construct:function(n){return"true"===n||"True"===n||"TRUE"===n},predicate:function(n){return"[object Boolean]"===Object.prototype.toString.call(n)},represent:{lowercase:function(n){return n?"true":"false"},uppercase:function(n){return n?"TRUE":"FALSE"},camelcase:function(n){return n?"True":"False"}},defaultStyle:"lowercase"});function S2(n){return 48<=n&&n<=57||65<=n&&n<=70||97<=n&&n<=102}function C2(n){return 48<=n&&n<=55}function oD(n){return 48<=n&&n<=57}var lD=new Wf("tag:yaml.org,2002:int",{kind:"scalar",resolve:function(n){if(null===n)return!1;var c,s=n.length,t=0,o=!1;if(!s)return!1;if(("-"===(c=n[t])||"+"===c)&&(c=n[++t]),"0"===c){if(t+1===s)return!0;if("b"===(c=n[++t])){for(t++;t<s;t++)if("_"!==(c=n[t])){if("0"!==c&&"1"!==c)return!1;o=!0}return o&&"_"!==c}if("x"===c){for(t++;t<s;t++)if("_"!==(c=n[t])){if(!S2(n.charCodeAt(t)))return!1;o=!0}return o&&"_"!==c}if("o"===c){for(t++;t<s;t++)if("_"!==(c=n[t])){if(!C2(n.charCodeAt(t)))return!1;o=!0}return o&&"_"!==c}}if("_"===c)return!1;for(;t<s;t++)if("_"!==(c=n[t])){if(!oD(n.charCodeAt(t)))return!1;o=!0}return!(!o||"_"===c)},construct:function(n){var o,s=n,t=1;if(-1!==s.indexOf("_")&&(s=s.replace(/_/g,"")),("-"===(o=s[0])||"+"===o)&&("-"===o&&(t=-1),o=(s=s.slice(1))[0]),"0"===s)return 0;if("0"===o){if("b"===s[1])return t*parseInt(s.slice(2),2);if("x"===s[1])return t*parseInt(s.slice(2),16);if("o"===s[1])return t*parseInt(s.slice(2),8)}return t*parseInt(s,10)},predicate:function(n){return"[object Number]"===Object.prototype.toString.call(n)&&n%1==0&&!Sf.isNegativeZero(n)},represent:{binary:function(n){return n>=0?"0b"+n.toString(2):"-0b"+n.toString(2).slice(1)},octal:function(n){return n>=0?"0o"+n.toString(8):"-0o"+n.toString(8).slice(1)},decimal:function(n){return n.toString(10)},hexadecimal:function(n){return n>=0?"0x"+n.toString(16).toUpperCase():"-0x"+n.toString(16).toUpperCase().slice(1)}},defaultStyle:"decimal",styleAliases:{binary:[2,"bin"],octal:[8,"oct"],decimal:[10,"dec"],hexadecimal:[16,"hex"]}}),zR=new RegExp("^(?:[-+]?(?:[0-9][0-9_]*)(?:\\.[0-9_]*)?(?:[eE][-+]?[0-9]+)?|\\.[0-9_]+(?:[eE][-+]?[0-9]+)?|[-+]?\\.(?:inf|Inf|INF)|\\.(?:nan|NaN|NAN))$"),QR=/^[-+]?[0-9]+e/,uD=new Wf("tag:yaml.org,2002:float",{kind:"scalar",resolve:function(n){return!(null===n||!zR.test(n)||"_"===n[n.length-1])},construct:function(n){var s,t;return t="-"===(s=n.replace(/_/g,"").toLowerCase())[0]?-1:1,"+-".indexOf(s[0])>=0&&(s=s.slice(1)),".inf"===s?1===t?Number.POSITIVE_INFINITY:Number.NEGATIVE_INFINITY:".nan"===s?NaN:t*parseFloat(s,10)},predicate:function(n){return"[object Number]"===Object.prototype.toString.call(n)&&(n%1!=0||Sf.isNegativeZero(n))},represent:function(n,s){var t;if(isNaN(n))switch(s){case"lowercase":return".nan";case"uppercase":return".NAN";case"camelcase":return".NaN"}else if(Number.POSITIVE_INFINITY===n)switch(s){case"lowercase":return".inf";case"uppercase":return".INF";case"camelcase":return".Inf"}else if(Number.NEGATIVE_INFINITY===n)switch(s){case"lowercase":return"-.inf";case"uppercase":return"-.INF";case"camelcase":return"-.Inf"}else if(Sf.isNegativeZero(n))return"-0.0";return t=n.toString(10),QR.test(t)?t.replace("e",".e"):t},defaultStyle:"lowercase"}),cD=m2.extend({implicit:[b2,bT,lD,uD]}),dD=cD,A2=new RegExp("^([0-9][0-9][0-9][0-9])-([0-9][0-9])-([0-9][0-9])$"),fD=new RegExp("^([0-9][0-9][0-9][0-9])-([0-9][0-9]?)-([0-9][0-9]?)(?:[Tt]|[ \\t]+)([0-9][0-9]?):([0-9][0-9]):([0-9][0-9])(?:\\.([0-9]*))?(?:[ \\t]*(Z|([-+])([0-9][0-9]?)(?::([0-9][0-9]))?))?$"),hD=new Wf("tag:yaml.org,2002:timestamp",{kind:"scalar",resolve:function(n){return null!==n&&(null!==A2.exec(n)||null!==fD.exec(n))},construct:function(n){var s,t,o,c,g,C,D,ie,P=0,j=null;if(null===(s=A2.exec(n))&&(s=fD.exec(n)),null===s)throw new Error("Date resolve error");if(t=+s[1],o=+s[2]-1,c=+s[3],!s[4])return new Date(Date.UTC(t,o,c));if(g=+s[4],C=+s[5],D=+s[6],s[7]){for(P=s[7].slice(0,3);P.length<3;)P+="0";P=+P}return s[9]&&(j=6e4*(60*+s[10]+ +(s[11]||0)),"-"===s[9]&&(j=-j)),ie=new Date(Date.UTC(t,o,c,g,C,D,P)),j&&ie.setTime(ie.getTime()-j),ie},instanceOf:Date,represent:function(n){return n.toISOString()}}),O2=new Wf("tag:yaml.org,2002:merge",{kind:"scalar",resolve:function(n){return"<<"===n||null===n}}),ET="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=\n\r",w2=new Wf("tag:yaml.org,2002:binary",{kind:"scalar",resolve:function(n){if(null===n)return!1;var s,t,o=0,c=n.length,g=ET;for(t=0;t<c;t++)if(!((s=g.indexOf(n.charAt(t)))>64)){if(s<0)return!1;o+=6}return o%8==0},construct:function(n){var s,t,o=n.replace(/[\r\n=]/g,""),c=o.length,g=ET,C=0,D=[];for(s=0;s<c;s++)s%4==0&&s&&(D.push(C>>16&255),D.push(C>>8&255),D.push(255&C)),C=C<<6|g.indexOf(o.charAt(s));return 0==(t=c%4*6)?(D.push(C>>16&255),D.push(C>>8&255),D.push(255&C)):18===t?(D.push(C>>10&255),D.push(C>>2&255)):12===t&&D.push(C>>4&255),new Uint8Array(D)},predicate:function(n){return"[object Uint8Array]"===Object.prototype.toString.call(n)},represent:function(n){var o,c,s="",t=0,g=n.length,C=ET;for(o=0;o<g;o++)o%3==0&&o&&(s+=C[t>>18&63],s+=C[t>>12&63],s+=C[t>>6&63],s+=C[63&t]),t=(t<<8)+n[o];return 0==(c=g%3)?(s+=C[t>>18&63],s+=C[t>>12&63],s+=C[t>>6&63],s+=C[63&t]):2===c?(s+=C[t>>10&63],s+=C[t>>4&63],s+=C[t<<2&63],s+=C[64]):1===c&&(s+=C[t>>2&63],s+=C[t<<4&63],s+=C[64],s+=C[64]),s}}),gD=Object.prototype.hasOwnProperty,mD=Object.prototype.toString,vD=new Wf("tag:yaml.org,2002:omap",{kind:"sequence",resolve:function(n){if(null===n)return!0;var t,o,c,g,C,s=[],D=n;for(t=0,o=D.length;t<o;t+=1){if(C=!1,"[object Object]"!==mD.call(c=D[t]))return!1;for(g in c)if(gD.call(c,g)){if(C)return!1;C=!0}if(!C)return!1;if(-1!==s.indexOf(g))return!1;s.push(g)}return!0},construct:function(n){return null!==n?n:[]}}),aN=Object.prototype.toString,x2=new Wf("tag:yaml.org,2002:pairs",{kind:"sequence",resolve:function(n){if(null===n)return!0;var s,t,o,c,g,C=n;for(g=new Array(C.length),s=0,t=C.length;s<t;s+=1){if("[object Object]"!==aN.call(o=C[s])||1!==(c=Object.keys(o)).length)return!1;g[s]=[c[0],o[c[0]]]}return!0},construct:function(n){if(null===n)return[];var s,t,o,c,g,C=n;for(g=new Array(C.length),s=0,t=C.length;s<t;s+=1)o=C[s],c=Object.keys(o),g[s]=[c[0],o[c[0]]];return g}}),TT=Object.prototype.hasOwnProperty,R2=new Wf("tag:yaml.org,2002:set",{kind:"mapping",resolve:function(n){if(null===n)return!0;var s,t=n;for(s in t)if(TT.call(t,s)&&null!==t[s])return!1;return!0},construct:function(n){return null!==n?n:{}}}),ST=dD.extend({implicit:[hD,O2],explicit:[w2,vD,x2,R2]}),cg=Object.prototype.hasOwnProperty,uN=/[\x00-\x08\x0B\x0C\x0E-\x1F\x7F-\x84\x86-\x9F\uFFFE\uFFFF]|[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?:[^\uD800-\uDBFF]|^)[\uDC00-\uDFFF]/,cN=/[\x85\u2028\u2029]/,dN=/[,\[\]\{\}]/,N2=/^(?:!|!!|![a-z\-]+!)$/i,bD=/^(?:!|[^,\[\]\{\}])(?:%[0-9a-f]{2}|[0-9a-z\-#;\/\?:@&=\+\$,_\.!~\*'\(\)\[\]])*$/i;function h0(n){return Object.prototype.toString.call(n)}function dg(n){return 10===n||13===n}function Vv(n){return 9===n||32===n}function mh(n){return 9===n||32===n||10===n||13===n}function fm(n){return 44===n||91===n||93===n||123===n||125===n}function ED(n){var s;return 48<=n&&n<=57?n-48:97<=(s=32|n)&&s<=102?s-97+10:-1}function fN(n){return 120===n?2:117===n?4:85===n?8:0}function pN(n){return 48<=n&&n<=57?n-48:-1}function P2(n){return 48===n?"\0":97===n?"\x07":98===n?"\b":116===n||9===n?"\t":110===n?"\n":118===n?"\v":102===n?"\f":114===n?"\r":101===n?"\x1b":32===n?" ":34===n?'"':47===n?"/":92===n?"\\":78===n?"\x85":95===n?"\xa0":76===n?"\u2028":80===n?"\u2029":""}function hN(n){return n<=65535?String.fromCharCode(n):String.fromCharCode(55296+(n-65536>>10),56320+(n-65536&1023))}for(var wT=new Array(256),I2=new Array(256),_0=0;_0<256;_0++)wT[_0]=P2(_0)?1:0,I2[_0]=P2(_0);function _N(n,s){this.input=n,this.filename=s.filename||null,this.schema=s.schema||ST,this.onWarning=s.onWarning||null,this.legacy=s.legacy||!1,this.json=s.json||!1,this.listener=s.listener||null,this.implicitTypes=this.schema.compiledImplicit,this.typeMap=this.schema.compiledTypeMap,this.length=n.length,this.position=0,this.line=0,this.lineStart=0,this.lineIndent=0,this.firstTabInLine=-1,this.documents=[]}function L2(n,s){var t={name:n.filename,buffer:n.input.slice(0,-1),position:n.position,line:n.line,column:n.position-n.lineStart};return t.snippet=function(n,s){if(s=Object.create(s||null),!n.buffer)return null;s.maxLength||(s.maxLength=79),"number"!=typeof s.indent&&(s.indent=1),"number"!=typeof s.linesBefore&&(s.linesBefore=3),"number"!=typeof s.linesAfter&&(s.linesAfter=2);for(var g,t=/\r?\n|\r|\0/g,o=[0],c=[],C=-1;g=t.exec(n.buffer);)c.push(g.index),o.push(g.index+g[0].length),n.position<=g.index&&C<0&&(C=o.length-2);C<0&&(C=o.length-1);var P,j,D="",W=Math.min(n.line+s.linesAfter,c.length).toString().length,re=s.maxLength-(s.indent+W+3);for(P=1;P<=s.linesBefore&&!(C-P<0);P++)j=jv(n.buffer,o[C-P],c[C-P],n.position-(o[C]-o[C-P]),re),D=Sf.repeat(" ",s.indent)+f0((n.line-P+1).toString(),W)+" | "+j.str+"\n"+D;for(j=jv(n.buffer,o[C],c[C],n.position,re),D+=Sf.repeat(" ",s.indent)+f0((n.line+1).toString(),W)+" | "+j.str+"\n",D+=Sf.repeat("-",s.indent+W+3+j.pos)+"^\n",P=1;P<=s.linesAfter&&!(C+P>=c.length);P++)j=jv(n.buffer,o[C+P],c[C+P],n.position-(o[C]-o[C+P]),re),D+=Sf.repeat(" ",s.indent)+f0((n.line+P+1).toString(),W)+" | "+j.str+"\n";return D.replace(/\n$/,"")}(t),new sp(s,t)}function da(n,s){throw L2(n,s)}function Xy(n,s){n.onWarning&&n.onWarning.call(null,L2(n,s))}var F2={YAML:function(s,t,o){var c,g,C;null!==s.version&&da(s,"duplication of %YAML directive"),1!==o.length&&da(s,"YAML directive accepts exactly one argument"),null===(c=/^([0-9]+)\.([0-9]+)$/.exec(o[0]))&&da(s,"ill-formed argument of the YAML directive"),g=parseInt(c[1],10),C=parseInt(c[2],10),1!==g&&da(s,"unacceptable YAML version of the document"),s.version=o[0],s.checkLineBreaks=C<2,1!==C&&2!==C&&Xy(s,"unsupported YAML version of the document")},TAG:function(s,t,o){var c,g;2!==o.length&&da(s,"TAG directive accepts exactly two arguments"),g=o[1],N2.test(c=o[0])||da(s,"ill-formed tag handle (first argument) of the TAG directive"),cg.call(s.tagMap,c)&&da(s,'there is a previously declared suffix for "'+c+'" tag handle'),bD.test(g)||da(s,"ill-formed tag prefix (second argument) of the TAG directive");try{g=decodeURIComponent(g)}catch(C){da(s,"tag prefix is malformed: "+g)}s.tagMap[c]=g}};function pm(n,s,t,o){var c,g,C,D;if(s<t){if(D=n.input.slice(s,t),o)for(c=0,g=D.length;c<g;c+=1)9===(C=D.charCodeAt(c))||32<=C&&C<=1114111||da(n,"expected valid JSON character");else uN.test(D)&&da(n,"the stream contains non-printable characters");n.result+=D}}function Ky(n,s,t,o){var c,g,C,D;for(Sf.isObject(t)||da(n,"cannot merge mappings; the provided source object is unacceptable"),C=0,D=(c=Object.keys(t)).length;C<D;C+=1)cg.call(s,g=c[C])||(s[g]=t[g],o[g]=!0)}function zv(n,s,t,o,c,g,C,D,P){var j,W;if(Array.isArray(c))for(j=0,W=(c=Array.prototype.slice.call(c)).length;j<W;j+=1)Array.isArray(c[j])&&da(n,"nested arrays are not supported inside keys"),"object"==typeof c&&"[object Object]"===h0(c[j])&&(c[j]="[object Object]");if("object"==typeof c&&"[object Object]"===h0(c)&&(c="[object Object]"),c=String(c),null===s&&(s={}),"tag:yaml.org,2002:merge"===o)if(Array.isArray(g))for(j=0,W=g.length;j<W;j+=1)Ky(n,s,g[j],t);else Ky(n,s,g,t);else!n.json&&!cg.call(t,c)&&cg.call(s,c)&&(n.line=C||n.line,n.lineStart=D||n.lineStart,n.position=P||n.position,da(n,"duplicated mapping key")),"__proto__"===c?Object.defineProperty(s,c,{configurable:!0,enumerable:!0,writable:!0,value:g}):s[c]=g,delete t[c];return s}function Np(n){var s;10===(s=n.input.charCodeAt(n.position))?n.position++:13===s?(n.position++,10===n.input.charCodeAt(n.position)&&n.position++):da(n,"a line break is expected"),n.line+=1,n.lineStart=n.position,n.firstTabInLine=-1}function of(n,s,t){for(var o=0,c=n.input.charCodeAt(n.position);0!==c;){for(;Vv(c);)9===c&&-1===n.firstTabInLine&&(n.firstTabInLine=n.position),c=n.input.charCodeAt(++n.position);if(s&&35===c)do{c=n.input.charCodeAt(++n.position)}while(10!==c&&13!==c&&0!==c);if(!dg(c))break;for(Np(n),c=n.input.charCodeAt(n.position),o++,n.lineIndent=0;32===c;)n.lineIndent++,c=n.input.charCodeAt(++n.position)}return-1!==t&&0!==o&&n.lineIndent<t&&Xy(n,"deficient indentation"),o}function Wv(n){var t,s=n.position;return!(45!==(t=n.input.charCodeAt(s))&&46!==t||t!==n.input.charCodeAt(s+1)||t!==n.input.charCodeAt(s+2)||(s+=3,t=n.input.charCodeAt(s),0!==t&&!mh(t)))}function xT(n,s){1===s?n.result+=" ":s>1&&(n.result+=Sf.repeat("\n",s-1))}function RT(n,s){var t,P,o=n.tag,c=n.anchor,g=[],D=!1;if(-1!==n.firstTabInLine)return!1;for(null!==n.anchor&&(n.anchorMap[n.anchor]=g),P=n.input.charCodeAt(n.position);0!==P&&(-1!==n.firstTabInLine&&(n.position=n.firstTabInLine,da(n,"tab characters must not be used in indentation")),45===P&&mh(n.input.charCodeAt(n.position+1)));)if(D=!0,n.position++,of(n,!0,-1)&&n.lineIndent<=s)g.push(null),P=n.input.charCodeAt(n.position);else if(t=n.line,Km(n,s,3,!1,!0),g.push(n.result),of(n,!0,-1),P=n.input.charCodeAt(n.position),(n.line===t||n.lineIndent>s)&&0!==P)da(n,"bad indentation of a sequence entry");else if(n.lineIndent<s)break;return!!D&&(n.tag=o,n.anchor=c,n.kind="sequence",n.result=g,!0)}function CD(n){var s,c,g,C,t=!1,o=!1;if(33!==(C=n.input.charCodeAt(n.position)))return!1;if(null!==n.tag&&da(n,"duplication of a tag property"),60===(C=n.input.charCodeAt(++n.position))?(t=!0,C=n.input.charCodeAt(++n.position)):33===C?(o=!0,c="!!",C=n.input.charCodeAt(++n.position)):c="!",s=n.position,t){do{C=n.input.charCodeAt(++n.position)}while(0!==C&&62!==C);n.position<n.length?(g=n.input.slice(s,n.position),C=n.input.charCodeAt(++n.position)):da(n,"unexpected end of the stream within a verbatim tag")}else{for(;0!==C&&!mh(C);)33===C&&(o?da(n,"tag suffix cannot contain exclamation marks"):(c=n.input.slice(s-1,n.position+1),N2.test(c)||da(n,"named tag handle cannot contain such characters"),o=!0,s=n.position+1)),C=n.input.charCodeAt(++n.position);g=n.input.slice(s,n.position),dN.test(g)&&da(n,"tag suffix cannot contain flow indicator characters")}g&&!bD.test(g)&&da(n,"tag name cannot contain such characters: "+g);try{g=decodeURIComponent(g)}catch(D){da(n,"tag name is malformed: "+g)}return t?n.tag=g:cg.call(n.tagMap,c)?n.tag=n.tagMap[c]+g:"!"===c?n.tag="!"+g:"!!"===c?n.tag="tag:yaml.org,2002:"+g:da(n,'undeclared tag handle "'+c+'"'),!0}function MD(n){var s,t;if(38!==(t=n.input.charCodeAt(n.position)))return!1;for(null!==n.anchor&&da(n,"duplication of an anchor property"),t=n.input.charCodeAt(++n.position),s=n.position;0!==t&&!mh(t)&&!fm(t);)t=n.input.charCodeAt(++n.position);return n.position===s&&da(n,"name of an anchor node must contain at least one character"),n.anchor=n.input.slice(s,n.position),!0}function Km(n,s,t,o,c){var g,C,D,re,ie,ge,_e,Le,Re,P=1,j=!1,W=!1;if(null!==n.listener&&n.listener("open",n),n.tag=null,n.anchor=null,n.kind=null,n.result=null,g=C=D=4===t||3===t,o&&of(n,!0,-1)&&(j=!0,n.lineIndent>s?P=1:n.lineIndent===s?P=0:n.lineIndent<s&&(P=-1)),1===P)for(;CD(n)||MD(n);)of(n,!0,-1)?(j=!0,D=g,n.lineIndent>s?P=1:n.lineIndent===s?P=0:n.lineIndent<s&&(P=-1)):D=!1;if(D&&(D=j||c),(1===P||4===t)&&(Le=1===t||2===t?s:s+1,Re=n.position-n.lineStart,1===P?D&&(RT(n,Re)||function(n,s,t){var o,c,g,C,D,P,xe,j=n.tag,W=n.anchor,re={},ie=Object.create(null),ge=null,_e=null,Le=null,Re=!1,ke=!1;if(-1!==n.firstTabInLine)return!1;for(null!==n.anchor&&(n.anchorMap[n.anchor]=re),xe=n.input.charCodeAt(n.position);0!==xe;){if(!Re&&-1!==n.firstTabInLine&&(n.position=n.firstTabInLine,da(n,"tab characters must not be used in indentation")),o=n.input.charCodeAt(n.position+1),g=n.line,63!==xe&&58!==xe||!mh(o)){if(C=n.line,D=n.lineStart,P=n.position,!Km(n,t,2,!1,!0))break;if(n.line===g){for(xe=n.input.charCodeAt(n.position);Vv(xe);)xe=n.input.charCodeAt(++n.position);if(58===xe)mh(xe=n.input.charCodeAt(++n.position))||da(n,"a whitespace character is expected after the key-value separator within a block mapping"),Re&&(zv(n,re,ie,ge,_e,null,C,D,P),ge=_e=Le=null),ke=!0,Re=!1,c=!1,ge=n.tag,_e=n.result;else{if(!ke)return n.tag=j,n.anchor=W,!0;da(n,"can not read an implicit mapping pair; a colon is missed")}}else{if(!ke)return n.tag=j,n.anchor=W,!0;da(n,"can not read a block mapping entry; a multiline key may not be an implicit key")}}else 63===xe?(Re&&(zv(n,re,ie,ge,_e,null,C,D,P),ge=_e=Le=null),ke=!0,Re=!0,c=!0):Re?(Re=!1,c=!0):da(n,"incomplete explicit mapping pair; a key node is missed; or followed by a non-tabulated empty line"),n.position+=1,xe=o;if((n.line===g||n.lineIndent>s)&&(Re&&(C=n.line,D=n.lineStart,P=n.position),Km(n,s,4,!0,c)&&(Re?_e=n.result:Le=n.result),Re||(zv(n,re,ie,ge,_e,Le,C,D,P),ge=_e=Le=null),of(n,!0,-1),xe=n.input.charCodeAt(n.position)),(n.line===g||n.lineIndent>s)&&0!==xe)da(n,"bad indentation of a mapping entry");else if(n.lineIndent<s)break}return Re&&zv(n,re,ie,ge,_e,null,C,D,P),ke&&(n.tag=j,n.anchor=W,n.kind="mapping",n.result=re),ke}(n,Re,Le))||function(n,s){var o,c,g,D,W,re,ie,ge,Le,Re,ke,xe,t=!0,C=n.tag,P=n.anchor,_e=Object.create(null);if(91===(xe=n.input.charCodeAt(n.position)))W=93,ge=!1,D=[];else{if(123!==xe)return!1;W=125,ge=!0,D={}}for(null!==n.anchor&&(n.anchorMap[n.anchor]=D),xe=n.input.charCodeAt(++n.position);0!==xe;){if(of(n,!0,s),(xe=n.input.charCodeAt(n.position))===W)return n.position++,n.tag=C,n.anchor=P,n.kind=ge?"mapping":"sequence",n.result=D,!0;t?44===xe&&da(n,"expected the node content, but found ','"):da(n,"missed comma between flow collection entries"),ke=null,re=ie=!1,63===xe&&mh(n.input.charCodeAt(n.position+1))&&(re=ie=!0,n.position++,of(n,!0,s)),o=n.line,c=n.lineStart,g=n.position,Km(n,s,1,!1,!0),Re=n.tag,Le=n.result,of(n,!0,s),xe=n.input.charCodeAt(n.position),(ie||n.line===o)&&58===xe&&(re=!0,xe=n.input.charCodeAt(++n.position),of(n,!0,s),Km(n,s,1,!1,!0),ke=n.result),ge?zv(n,D,_e,Re,Le,ke,o,c,g):D.push(re?zv(n,null,_e,Re,Le,ke,o,c,g):Le),of(n,!0,s),44===(xe=n.input.charCodeAt(n.position))?(t=!0,xe=n.input.charCodeAt(++n.position)):t=!1}da(n,"unexpected end of the stream within a flow collection")}(n,Le)?W=!0:(C&&function(n,s){var t,o,W,re,c=1,g=!1,C=!1,D=s,P=0,j=!1;if(124===(re=n.input.charCodeAt(n.position)))o=!1;else{if(62!==re)return!1;o=!0}for(n.kind="scalar",n.result="";0!==re;)if(43===(re=n.input.charCodeAt(++n.position))||45===re)1===c?c=43===re?3:2:da(n,"repeat of a chomping mode identifier");else{if(!((W=pN(re))>=0))break;0===W?da(n,"bad explicit indentation width of a block scalar; it cannot be less than one"):C?da(n,"repeat of an indentation width identifier"):(D=s+W-1,C=!0)}if(Vv(re)){do{re=n.input.charCodeAt(++n.position)}while(Vv(re));if(35===re)do{re=n.input.charCodeAt(++n.position)}while(!dg(re)&&0!==re)}for(;0!==re;){for(Np(n),n.lineIndent=0,re=n.input.charCodeAt(n.position);(!C||n.lineIndent<D)&&32===re;)n.lineIndent++,re=n.input.charCodeAt(++n.position);if(!C&&n.lineIndent>D&&(D=n.lineIndent),dg(re))P++;else{if(n.lineIndent<D){3===c?n.result+=Sf.repeat("\n",g?1+P:P):1===c&&g&&(n.result+="\n");break}for(o?Vv(re)?(j=!0,n.result+=Sf.repeat("\n",g?1+P:P)):j?(j=!1,n.result+=Sf.repeat("\n",P+1)):0===P?g&&(n.result+=" "):n.result+=Sf.repeat("\n",P):n.result+=Sf.repeat("\n",g?1+P:P),g=!0,C=!0,P=0,t=n.position;!dg(re)&&0!==re;)re=n.input.charCodeAt(++n.position);pm(n,t,n.position,!1)}}return!0}(n,Le)||function(n,s){var t,o,c;if(39!==(t=n.input.charCodeAt(n.position)))return!1;for(n.kind="scalar",n.result="",n.position++,o=c=n.position;0!==(t=n.input.charCodeAt(n.position));)if(39===t){if(pm(n,o,n.position,!0),39!==(t=n.input.charCodeAt(++n.position)))return!0;o=n.position,n.position++,c=n.position}else dg(t)?(pm(n,o,c,!0),xT(n,of(n,!1,s)),o=c=n.position):n.position===n.lineStart&&Wv(n)?da(n,"unexpected end of the document within a single quoted scalar"):(n.position++,c=n.position);da(n,"unexpected end of the stream within a single quoted scalar")}(n,Le)||function(n,s){var t,o,c,g,C,D;if(34!==(D=n.input.charCodeAt(n.position)))return!1;for(n.kind="scalar",n.result="",n.position++,t=o=n.position;0!==(D=n.input.charCodeAt(n.position));){if(34===D)return pm(n,t,n.position,!0),n.position++,!0;if(92===D){if(pm(n,t,n.position,!0),dg(D=n.input.charCodeAt(++n.position)))of(n,!1,s);else if(D<256&&wT[D])n.result+=I2[D],n.position++;else if((C=fN(D))>0){for(c=C,g=0;c>0;c--)(C=ED(D=n.input.charCodeAt(++n.position)))>=0?g=(g<<4)+C:da(n,"expected hexadecimal character");n.result+=hN(g),n.position++}else da(n,"unknown escape sequence");t=o=n.position}else dg(D)?(pm(n,t,o,!0),xT(n,of(n,!1,s)),t=o=n.position):n.position===n.lineStart&&Wv(n)?da(n,"unexpected end of the document within a double quoted scalar"):(n.position++,o=n.position)}da(n,"unexpected end of the stream within a double quoted scalar")}(n,Le)?W=!0:function(n){var s,t,o;if(42!==(o=n.input.charCodeAt(n.position)))return!1;for(o=n.input.charCodeAt(++n.position),s=n.position;0!==o&&!mh(o)&&!fm(o);)o=n.input.charCodeAt(++n.position);return n.position===s&&da(n,"name of an alias node must contain at least one character"),t=n.input.slice(s,n.position),cg.call(n.anchorMap,t)||da(n,'unidentified alias "'+t+'"'),n.result=n.anchorMap[t],of(n,!0,-1),!0}(n)?(W=!0,(null!==n.tag||null!==n.anchor)&&da(n,"alias node should not have any properties")):function(n,s,t){var c,g,C,D,P,j,W,ge,re=n.kind,ie=n.result;if(mh(ge=n.input.charCodeAt(n.position))||fm(ge)||35===ge||38===ge||42===ge||33===ge||124===ge||62===ge||39===ge||34===ge||37===ge||64===ge||96===ge||(63===ge||45===ge)&&(mh(c=n.input.charCodeAt(n.position+1))||t&&fm(c)))return!1;for(n.kind="scalar",n.result="",g=C=n.position,D=!1;0!==ge;){if(58===ge){if(mh(c=n.input.charCodeAt(n.position+1))||t&&fm(c))break}else if(35===ge){if(mh(n.input.charCodeAt(n.position-1)))break}else{if(n.position===n.lineStart&&Wv(n)||t&&fm(ge))break;if(dg(ge)){if(P=n.line,j=n.lineStart,W=n.lineIndent,of(n,!1,-1),n.lineIndent>=s){D=!0,ge=n.input.charCodeAt(n.position);continue}n.position=C,n.line=P,n.lineStart=j,n.lineIndent=W;break}}D&&(pm(n,g,C,!1),xT(n,n.line-P),g=C=n.position,D=!1),Vv(ge)||(C=n.position+1),ge=n.input.charCodeAt(++n.position)}return pm(n,g,C,!1),!!n.result||(n.kind=re,n.result=ie,!1)}(n,Le,1===t)&&(W=!0,null===n.tag&&(n.tag="?")),null!==n.anchor&&(n.anchorMap[n.anchor]=n.result)):0===P&&(W=D&&RT(n,Re))),null===n.tag)null!==n.anchor&&(n.anchorMap[n.anchor]=n.result);else if("?"===n.tag){for(null!==n.result&&"scalar"!==n.kind&&da(n,'unacceptable node kind for !<?> tag; it should be "scalar", not "'+n.kind+'"'),re=0,ie=n.implicitTypes.length;re<ie;re+=1)if((_e=n.implicitTypes[re]).resolve(n.result)){n.result=_e.construct(n.result),n.tag=_e.tag,null!==n.anchor&&(n.anchorMap[n.anchor]=n.result);break}}else if("!"!==n.tag){if(cg.call(n.typeMap[n.kind||"fallback"],n.tag))_e=n.typeMap[n.kind||"fallback"][n.tag];else for(_e=null,re=0,ie=(ge=n.typeMap.multi[n.kind||"fallback"]).length;re<ie;re+=1)if(n.tag.slice(0,ge[re].tag.length)===ge[re].tag){_e=ge[re];break}_e||da(n,"unknown tag !<"+n.tag+">"),null!==n.result&&_e.kind!==n.kind&&da(n,"unacceptable node kind for !<"+n.tag+'> tag; it should be "'+_e.kind+'", not "'+n.kind+'"'),_e.resolve(n.result,n.tag)?(n.result=_e.construct(n.result,n.tag),null!==n.anchor&&(n.anchorMap[n.anchor]=n.result)):da(n,"cannot resolve a node with !<"+n.tag+"> explicit tag")}return null!==n.listener&&n.listener("close",n),null!==n.tag||null!==n.anchor||W}function U2(n){var t,o,c,C,s=n.position,g=!1;for(n.version=null,n.checkLineBreaks=n.legacy,n.tagMap=Object.create(null),n.anchorMap=Object.create(null);0!==(C=n.input.charCodeAt(n.position))&&(of(n,!0,-1),C=n.input.charCodeAt(n.position),!(n.lineIndent>0||37!==C));){for(g=!0,C=n.input.charCodeAt(++n.position),t=n.position;0!==C&&!mh(C);)C=n.input.charCodeAt(++n.position);for(c=[],(o=n.input.slice(t,n.position)).length<1&&da(n,"directive name must not be less than one character in length");0!==C;){for(;Vv(C);)C=n.input.charCodeAt(++n.position);if(35===C){do{C=n.input.charCodeAt(++n.position)}while(0!==C&&!dg(C));break}if(dg(C))break;for(t=n.position;0!==C&&!mh(C);)C=n.input.charCodeAt(++n.position);c.push(n.input.slice(t,n.position))}0!==C&&Np(n),cg.call(F2,o)?F2[o](n,o,c):Xy(n,'unknown document directive "'+o+'"')}of(n,!0,-1),0===n.lineIndent&&45===n.input.charCodeAt(n.position)&&45===n.input.charCodeAt(n.position+1)&&45===n.input.charCodeAt(n.position+2)?(n.position+=3,of(n,!0,-1)):g&&da(n,"directives end mark is expected"),Km(n,n.lineIndent-1,4,!1,!0),of(n,!0,-1),n.checkLineBreaks&&cN.test(n.input.slice(s,n.position))&&Xy(n,"non-ASCII line breaks are interpreted as content"),n.documents.push(n.result),n.position===n.lineStart&&Wv(n)?46===n.input.charCodeAt(n.position)&&(n.position+=3,of(n,!0,-1)):n.position<n.length-1&&da(n,"end of the stream or a document separator is expected")}function qy(n,s){s=s||{},0!==(n=String(n)).length&&(10!==n.charCodeAt(n.length-1)&&13!==n.charCodeAt(n.length-1)&&(n+="\n"),65279===n.charCodeAt(0)&&(n=n.slice(1)));var t=new _N(n,s),o=n.indexOf("\0");for(-1!==o&&(t.position=o,da(t,"null byte is not allowed in input")),t.input+="\0";32===t.input.charCodeAt(t.position);)t.lineIndent+=1,t.position+=1;for(;t.position<t.length-1;)U2(t);return t.documents}var wD=Object.prototype.toString,Y2=Object.prototype.hasOwnProperty,ap={0:"\\0",7:"\\a",8:"\\b",9:"\\t",10:"\\n",11:"\\v",12:"\\f",13:"\\r",27:"\\e",34:'\\"',92:"\\\\",133:"\\N",160:"\\_",8232:"\\L",8233:"\\P"},$D=["y","Y","yes","Yes","YES","on","On","ON","n","N","no","No","NO","off","Off","OFF"],HD=/^[-+]?[0-9_]+(?::[0-9_]+)+(?:\.[0-9_]*)?$/;function Q2(n){var s,t,o;if(s=n.toString(16).toUpperCase(),n<=255)t="x",o=2;else if(n<=65535)t="u",o=4;else{if(!(n<=4294967295))throw new sp("code point within a string may not be greater than 0xFFFFFFFF");t="U",o=8}return"\\"+t+Sf.repeat("0",o-s.length)+s}function BD(n){this.schema=n.schema||ST,this.indent=Math.max(1,n.indent||2),this.noArrayIndent=n.noArrayIndent||!1,this.skipInvalid=n.skipInvalid||!1,this.flowLevel=Sf.isNothing(n.flowLevel)?-1:n.flowLevel,this.styleMap=function(n,s){var t,o,c,g,C,D,P;if(null===s)return{};for(t={},c=0,g=(o=Object.keys(s)).length;c<g;c+=1)C=o[c],D=String(s[C]),"!!"===C.slice(0,2)&&(C="tag:yaml.org,2002:"+C.slice(2)),(P=n.compiledTypeMap.fallback[C])&&Y2.call(P.styleAliases,D)&&(D=P.styleAliases[D]),t[C]=D;return t}(this.schema,n.styles||null),this.sortKeys=n.sortKeys||!1,this.lineWidth=n.lineWidth||80,this.noRefs=n.noRefs||!1,this.noCompatMode=n.noCompatMode||!1,this.condenseFlow=n.condenseFlow||!1,this.quotingType='"'===n.quotingType?2:1,this.forceQuotes=n.forceQuotes||!1,this.replacer="function"==typeof n.replacer?n.replacer:null,this.implicitTypes=this.schema.compiledImplicit,this.explicitTypes=this.schema.compiledExplicit,this.tag=null,this.result="",this.duplicates=[],this.usedDuplicates=null}function rb(n,s){for(var C,t=Sf.repeat(" ",s),o=0,c=-1,g="",D=n.length;o<D;)-1===(c=n.indexOf("\n",o))?(C=n.slice(o),o=D):(C=n.slice(o,c+1),o=c+1),C.length&&"\n"!==C&&(g+=t),g+=C;return g}function sf(n,s){return"\n"+Sf.repeat(" ",n.indent*s)}function v0(n){return 32===n||9===n}function Jv(n){return 32<=n&&n<=126||161<=n&&n<=55295&&8232!==n&&8233!==n||57344<=n&&n<=65533&&65279!==n||65536<=n&&n<=1114111}function X2(n){return Jv(n)&&65279!==n&&13!==n&&10!==n}function y0(n,s,t){var o=X2(n),c=o&&!v0(n);return(t?o:o&&44!==n&&91!==n&&93!==n&&123!==n&&125!==n)&&35!==n&&!(58===s&&!c)||X2(s)&&!v0(s)&&35===n||58===s&&c}function Qv(n,s){var o,t=n.charCodeAt(s);return t>=55296&&t<=56319&&s+1<n.length&&(o=n.charCodeAt(s+1))>=56320&&o<=57343?1024*(t-55296)+o-56320+65536:t}function hm(n){return/^\n* /.test(n)}function kT(n,s,t,o,c){n.dump=function(){if(0===s.length)return 2===n.quotingType?'""':"''";if(!n.noCompatMode&&(-1!==$D.indexOf(s)||HD.test(s)))return 2===n.quotingType?'"'+s+'"':"'"+s+"'";var g=n.indent*Math.max(1,t),C=-1===n.lineWidth?-1:Math.max(Math.min(n.lineWidth,40),n.lineWidth-g);switch(function(n,s,t,o,c,g,C,D){var P,j=0,W=null,re=!1,ie=!1,ge=-1!==o,_e=-1,Le=function(n){return Jv(n)&&65279!==n&&!v0(n)&&45!==n&&63!==n&&58!==n&&44!==n&&91!==n&&93!==n&&123!==n&&125!==n&&35!==n&&38!==n&&42!==n&&33!==n&&124!==n&&61!==n&&62!==n&&39!==n&&34!==n&&37!==n&&64!==n&&96!==n}(Qv(n,0))&&function(n){return!v0(n)&&58!==n}(Qv(n,n.length-1));if(s||C)for(P=0;P<n.length;j>=65536?P+=2:P++){if(!Jv(j=Qv(n,P)))return 5;Le=Le&&y0(j,W,D),W=j}else{for(P=0;P<n.length;j>=65536?P+=2:P++){if(10===(j=Qv(n,P)))re=!0,ge&&(ie=ie||P-_e-1>o&&" "!==n[_e+1],_e=P);else if(!Jv(j))return 5;Le=Le&&y0(j,W,D),W=j}ie=ie||ge&&P-_e-1>o&&" "!==n[_e+1]}return re||ie?t>9&&hm(n)?5:C?2===g?5:2:ie?4:3:!Le||C||c(n)?2===g?5:2:1}(s,o||n.flowLevel>-1&&t>=n.flowLevel,n.indent,C,function(j){return function(n,s){var t,o;for(t=0,o=n.implicitTypes.length;t<o;t+=1)if(n.implicitTypes[t].resolve(s))return!0;return!1}(n,j)},n.quotingType,n.forceQuotes&&!o,c)){case 1:return s;case 2:return"'"+s.replace(/'/g,"''")+"'";case 3:return"|"+$T(s,n.indent)+Cf(rb(s,g));case 4:return">"+$T(s,n.indent)+Cf(rb(function(n,s){for(var g,C,t=/(\n+)([^\n]*)/g,o=(j=void 0,j=n.indexOf("\n"),t.lastIndex=j=-1!==j?j:n.length,q2(n.slice(0,j),s)),c="\n"===n[0]||" "===n[0];C=t.exec(n);){var P=C[2];g=" "===P[0],o+=C[1]+(c||g||""===P?"":"\n")+q2(P,s),c=g}var j;return o}(s,C),g));case 5:return'"'+function(n){for(var o,s="",t=0,c=0;c<n.length;t>=65536?c+=2:c++)t=Qv(n,c),!(o=ap[t])&&Jv(t)?(s+=n[c],t>=65536&&(s+=n[c+1])):s+=o||Q2(t);return s}(s)+'"';default:throw new sp("impossible error: invalid scalar style")}}()}function $T(n,s){var t=hm(n)?String(s):"",o="\n"===n[n.length-1];return t+(!o||"\n"!==n[n.length-2]&&"\n"!==n?o?"":"-":"+")+"\n"}function Cf(n){return"\n"===n[n.length-1]?n.slice(0,-1):n}function q2(n,s){if(""===n||" "===n[0])return n;for(var o,g,t=/ [^ ]/g,c=0,C=0,D=0,P="";o=t.exec(n);)(D=o.index)-c>s&&(P+="\n"+n.slice(c,g=C>c?C:D),c=g+1),C=D;return P+="\n",(P+=n.length-c>s&&C>c?n.slice(c,C)+"\n"+n.slice(C+1):n.slice(c)).slice(1)}function zD(n,s,t){var o,c,g,C,D,P;for(g=0,C=(c=t?n.explicitTypes:n.implicitTypes).length;g<C;g+=1)if(((D=c[g]).instanceOf||D.predicate)&&(!D.instanceOf||"object"==typeof s&&s instanceof D.instanceOf)&&(!D.predicate||D.predicate(s))){if(n.tag=t?D.multi&&D.representName?D.representName(s):D.tag:"?",D.represent){if(P=n.styleMap[D.tag]||D.defaultStyle,"[object Function]"===wD.call(D.represent))o=D.represent(s,P);else{if(!Y2.call(D.represent,P))throw new sp("!<"+D.tag+'> tag resolver accepts not "'+P+'" style');o=D.represent[P](s,P)}n.dump=o}return!0}return!1}function _m(n,s,t,o,c,g,C){n.tag=null,n.dump=t,zD(n,t,!1)||zD(n,t,!0);var j,D=wD.call(n.dump),P=o;o&&(o=n.flowLevel<0||n.flowLevel>s);var re,ie,W="[object Object]"===D||"[object Array]"===D;if(W&&(ie=-1!==(re=n.duplicates.indexOf(t))),(null!==n.tag&&"?"!==n.tag||ie||2!==n.indent&&s>0)&&(c=!1),ie&&n.usedDuplicates[re])n.dump="*ref_"+re;else{if(W&&ie&&!n.usedDuplicates[re]&&(n.usedDuplicates[re]=!0),"[object Object]"===D)o&&0!==Object.keys(n.dump).length?(function(n,s,t,o){var D,P,j,W,re,ie,c="",g=n.tag,C=Object.keys(t);if(!0===n.sortKeys)C.sort();else if("function"==typeof n.sortKeys)C.sort(n.sortKeys);else if(n.sortKeys)throw new sp("sortKeys must be a boolean or a function");for(D=0,P=C.length;D<P;D+=1)ie="",(!o||""!==c)&&(ie+=sf(n,s)),W=t[j=C[D]],n.replacer&&(W=n.replacer.call(t,j,W)),_m(n,s+1,j,!0,!0,!0)&&((re=null!==n.tag&&"?"!==n.tag||n.dump&&n.dump.length>1024)&&(n.dump&&10===n.dump.charCodeAt(0)?ie+="?":ie+="? "),ie+=n.dump,re&&(ie+=sf(n,s)),_m(n,s+1,W,!0,re)&&(n.dump&&10===n.dump.charCodeAt(0)?ie+=":":ie+=": ",c+=ie+=n.dump));n.tag=g,n.dump=c||"{}"}(n,s,n.dump,c),ie&&(n.dump="&ref_"+re+n.dump)):(function(n,s,t){var C,D,P,j,W,o="",c=n.tag,g=Object.keys(t);for(C=0,D=g.length;C<D;C+=1)W="",""!==o&&(W+=", "),n.condenseFlow&&(W+='"'),j=t[P=g[C]],n.replacer&&(j=n.replacer.call(t,P,j)),_m(n,s,P,!1,!1)&&(n.dump.length>1024&&(W+="? "),W+=n.dump+(n.condenseFlow?'"':"")+":"+(n.condenseFlow?"":" "),_m(n,s,j,!1,!1)&&(o+=W+=n.dump));n.tag=c,n.dump="{"+o+"}"}(n,s,n.dump),ie&&(n.dump="&ref_"+re+" "+n.dump));else if("[object Array]"===D)o&&0!==n.dump.length?(function(n,s,t,o){var C,D,P,c="",g=n.tag;for(C=0,D=t.length;C<D;C+=1)P=t[C],n.replacer&&(P=n.replacer.call(t,String(C),P)),(_m(n,s+1,P,!0,!0,!1,!0)||void 0===P&&_m(n,s+1,null,!0,!0,!1,!0))&&((!o||""!==c)&&(c+=sf(n,s)),n.dump&&10===n.dump.charCodeAt(0)?c+="-":c+="- ",c+=n.dump);n.tag=g,n.dump=c||"[]"}(n,n.noArrayIndent&&!C&&s>0?s-1:s,n.dump,c),ie&&(n.dump="&ref_"+re+n.dump)):(function(n,s,t){var g,C,D,o="",c=n.tag;for(g=0,C=t.length;g<C;g+=1)D=t[g],n.replacer&&(D=n.replacer.call(t,String(g),D)),(_m(n,s,D,!1,!1)||void 0===D&&_m(n,s,null,!1,!1))&&(""!==o&&(o+=","+(n.condenseFlow?"":" ")),o+=n.dump);n.tag=c,n.dump="["+o+"]"}(n,s,n.dump),ie&&(n.dump="&ref_"+re+" "+n.dump));else{if("[object String]"!==D){if("[object Undefined]"===D)return!1;if(n.skipInvalid)return!1;throw new sp("unacceptable kind of an object to dump "+D)}"?"!==n.tag&&kT(n,n.dump,s,g,P)}null!==n.tag&&"?"!==n.tag&&(j=encodeURI("!"===n.tag[0]?n.tag.slice(1):n.tag).replace(/!/g,"%21"),j="!"===n.tag[0]?"!"+j:"tag:yaml.org,2002:"===j.slice(0,18)?"!!"+j.slice(18):"!<"+j+">",n.dump=j+" "+n.dump)}return!0}function WD(n,s){var c,g,t=[],o=[];for(HT(n,t,o),c=0,g=o.length;c<g;c+=1)s.duplicates.push(t[o[c]]);s.usedDuplicates=new Array(g)}function HT(n,s,t){var o,c,g;if(null!==n&&"object"==typeof n)if(-1!==(c=s.indexOf(n)))-1===t.indexOf(c)&&t.push(c);else if(s.push(n),Array.isArray(n))for(c=0,g=n.length;c<g;c+=1)HT(n[c],s,t);else for(c=0,g=(o=Object.keys(n)).length;c<g;c+=1)HT(n[o[c]],s,t)}function eA(n,s){return function(){throw new Error("Function yaml."+n+" is removed in js-yaml 4. Use yaml."+s+" instead, which is now safe by default.")}}var KD=Wf,qD=g2,e3=m2,t3=cD,CN=dD,n3=ST,r3=function(n,s){var t=qy(n,s);if(0!==t.length){if(1===t.length)return t[0];throw new sp("expected a single document in the stream, but found more")}},i3=function(n,s,t){null!==s&&"object"==typeof s&&void 0===t&&(t=s,s=null);var o=qy(n,t);if("function"!=typeof s)return o;for(var c=0,g=o.length;c<g;c+=1)s(o[c])},o3=function(n,s){var t=new BD(s=s||{});t.noRefs||WD(n,t);var o=n;return t.replacer&&(o=t.replacer.call({"":o},"",o)),_m(t,0,o,!0,!0)?t.dump+"\n":""},s3=sp,w_={binary:w2,float:uD,map:yT,null:b2,pairs:x2,set:R2,timestamp:hD,bool:bT,int:lD,merge:O2,omap:vD,seq:vT,str:mT},a3=eA("safeLoad","load"),l3=eA("safeLoadAll","loadAll"),u3=eA("safeDump","dump");const tA={Type:KD,Schema:qD,FAILSAFE_SCHEMA:e3,JSON_SCHEMA:t3,CORE_SCHEMA:CN,DEFAULT_SCHEMA:n3,load:r3,loadAll:i3,dump:o3,YAMLException:s3,types:w_,safeLoad:a3,safeLoadAll:l3,safeDump:u3},d3="undefined"!=typeof globalThis?globalThis:"undefined"!=typeof self?self:window,{FormData:nA,Blob:ob,File:Xv}=d3;function gm(n){return function(n){if(lm(n))return r0(n)}(n)||oT(n)||i0(n)||function(){throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}var AN=i(46558),x_=i.n(AN),ON=function(s){return":/?#[]@!$&'()*+,;=".indexOf(s)>-1},UT=function(s){return/^[a-z0-9\-._~]+$/i.test(s)};function Kv(n){var s,t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},o=t.escape,c=arguments.length>2?arguments[2]:void 0;return"number"==typeof n&&(n=n.toString()),"string"==typeof n&&n.length&&o?c?JSON.parse(n):Lu()(s=gm(n)).call(s,function(g){var C,D;if(UT(g)||ON(g)&&"unsafe"===o)return g;var P=new TextEncoder;return Lu()(C=Lu()(D=fT()(P.encode(g))).call(D,function(W){var re;return x_()(re="0".concat(W.toString(16).toUpperCase())).call(re,-2)})).call(C,function(W){return"%".concat(W)}).join("")}).join(""):n}function BT(n){var s=n.value;return Array.isArray(s)?function(n){var s=n.key,t=n.value,o=n.style,c=n.explode,g=n.escape,C=function(re){return Kv(re,{escape:g})};if("simple"===o)return Lu()(t).call(t,function(W){return C(W)}).join(",");if("label"===o)return".".concat(Lu()(t).call(t,function(W){return C(W)}).join("."));if("matrix"===o)return Lu()(t).call(t,function(W){return C(W)}).reduce(function(W,re){var ie,ge,_e;return!W||c?la()(ge=la()(_e="".concat(W||"",";")).call(_e,s,"=")).call(ge,re):la()(ie="".concat(W,",")).call(ie,re)},"");if("form"===o){var D=c?"&".concat(s,"="):",";return Lu()(t).call(t,function(W){return C(W)}).join(D)}if("spaceDelimited"===o){var P=c?"".concat(s,"="):"";return Lu()(t).call(t,function(W){return C(W)}).join(" ".concat(P))}if("pipeDelimited"===o){var j=c?"".concat(s,"="):"";return Lu()(t).call(t,function(W){return C(W)}).join("|".concat(j))}}(n):"object"===vc(s)?function(n){var s=n.key,t=n.value,o=n.style,c=n.explode,g=n.escape,C=function(j){return Kv(j,{escape:g})},D=Su()(t);return"simple"===o?D.reduce(function(P,j){var W,re,ie,ge=C(t[j]),_e=c?"=":",",Le=P?"".concat(P,","):"";return la()(W=la()(re=la()(ie="".concat(Le)).call(ie,j)).call(re,_e)).call(W,ge)},""):"label"===o?D.reduce(function(P,j){var W,re,ie,ge=C(t[j]),_e=c?"=":".",Le=P?"".concat(P,"."):".";return la()(W=la()(re=la()(ie="".concat(Le)).call(ie,j)).call(re,_e)).call(W,ge)},""):"matrix"===o&&c?D.reduce(function(P,j){var W,re,ie=C(t[j]),ge=P?"".concat(P,";"):";";return la()(W=la()(re="".concat(ge)).call(re,j,"=")).call(W,ie)},""):"matrix"===o?D.reduce(function(P,j){var W,re,ie=C(t[j]),ge=P?"".concat(P,","):";".concat(s,"=");return la()(W=la()(re="".concat(ge)).call(re,j,",")).call(W,ie)},""):"form"===o?D.reduce(function(P,j){var W,re,ie,ge,_e=C(t[j]),Le=P?la()(W="".concat(P)).call(W,c?"&":","):"",Re=c?"=":",";return la()(re=la()(ie=la()(ge="".concat(Le)).call(ge,j)).call(ie,Re)).call(re,_e)},""):void 0}(n):function(n){var C,s=n.key,t=n.value,o=n.style,c=n.escape,g=function(P){return Kv(P,{escape:c})};return"simple"===o?g(t):"label"===o?".".concat(g(t)):"matrix"===o?la()(C=";".concat(s,"=")).call(C,g(t)):"form"===o||"deepObject"===o?g(t):void 0}(n)}const _3=function(s,t){t.body=s};var vh={serializeRes:YT,mergeInQueryOrForm:VT};function iA(n){return sb.apply(this,arguments)}function sb(){return(sb=s0(M_().mark(function n(s){var t,c,g,C,D=arguments;return M_().wrap(function(j){for(;;)switch(j.prev=j.next){case 0:if(t=D.length>1&&void 0!==D[1]?D[1]:{},"object"===vc(s)&&(s=(t=s).url),t.headers=t.headers||{},vh.mergeInQueryOrForm(t),t.headers&&Su()(t.headers).forEach(function(W){var re=t.headers[W];"string"==typeof re&&(t.headers[W]=re.replace(/\n+/g," "))}),!t.requestInterceptor){j.next=12;break}return j.next=8,t.requestInterceptor(t);case 8:if(j.t0=j.sent,j.t0){j.next=11;break}j.t0=t;case 11:t=j.t0;case 12:return/multipart\/form-data/i.test(t.headers["content-type"]||t.headers["Content-Type"])&&t.body instanceof nA&&(delete t.headers["content-type"],delete t.headers["Content-Type"]),j.prev=14,j.next=17,(t.userFetch||fetch)(t.url,t);case 17:return c=j.sent,j.next=20,vh.serializeRes(c,s,t);case 20:if(c=j.sent,!t.responseInterceptor){j.next=28;break}return j.next=24,t.responseInterceptor(c);case 24:if(j.t1=j.sent,j.t1){j.next=27;break}j.t1=c;case 27:c=j.t1;case 28:j.next=39;break;case 30:if(j.prev=30,j.t2=j.catch(14),c){j.next=34;break}throw j.t2;case 34:throw(g=new Error(c.statusText||"response status is ".concat(c.status))).status=c.status,g.statusCode=c.status,g.responseError=j.t2,g;case 39:if(c.ok){j.next=45;break}throw(C=new Error(c.statusText||"response status is ".concat(c.status))).status=c.status,C.statusCode=c.status,C.response=c,C;case 45:return j.abrupt("return",c);case 46:case"end":return j.stop()}},n,null,[[14,30]])}))).apply(this,arguments)}var g3=function(){var s=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"";return/(json|xml|yaml|text)\b/.test(s)};function oA(n,s){return s&&(0===s.indexOf("application/json")||s.indexOf("+json")>0)?JSON.parse(n):tA.load(n)}function YT(n,s){var t=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{},o=t.loadSpec,c=void 0!==o&&o,g={ok:n.ok,url:n.url||s,status:n.status,statusText:n.statusText,headers:ZT(n.headers)},C=g.headers["content-type"],D=c||g3(C),P=D?n.text:n.blob||n.buffer;return P.call(n).then(function(j){if(g.text=j,g.data=j,D)try{var W=oA(j,C);g.body=W,g.obj=W}catch(re){g.parseError=re}return g})}function sA(n){return dm()(n).call(n,", ")?n.split(", "):n}function ZT(){var n=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};return"function"!=typeof u0()(n)?{}:fT()(u0()(n).call(n)).reduce(function(s,t){var o=A_(t,2);return s[o[0]]=sA(o[1]),s},{})}function T0(n,s){return!s&&"undefined"!=typeof navigator&&(s=navigator),s&&"ReactNative"===s.product?!(!n||"object"!==vc(n)||"string"!=typeof n.uri):!!(void 0!==Xv&&n instanceof Xv||void 0!==ob&&n instanceof ob||ArrayBuffer.isView(n))||null!==n&&"object"===vc(n)&&"function"==typeof n.pipe}function ab(n,s){return Array.isArray(n)&&n.some(function(t){return T0(t,s)})}var lb={form:",",spaceDelimited:"%20",pipeDelimited:"|"},ub={csv:",",ssv:"%20",tsv:"%09",pipes:"|"};function jT(n,s){var t=arguments.length>2&&void 0!==arguments[2]&&arguments[2],o=s.collectionFormat,c=s.allowEmptyValue,g=s.serializationOption,C=s.encoding,D="object"!==vc(s)||Array.isArray(s)?s:s.value,P=t?function(_e){return _e.toString()}:function(_e){return encodeURIComponent(_e)},j=P(n);if(void 0===D&&c)return[[j,""]];if(T0(D)||ab(D))return[[j,D]];if(g)return GT(n,D,t,g);if(C){if([vc(C.style),vc(C.explode),vc(C.allowReserved)].some(function(_e){return"undefined"!==_e})){var W=C.style,re=C.explode,ie=C.allowReserved;return GT(n,D,t,{style:W,explode:re,allowReserved:ie})}if(C.contentType){if("application/json"===C.contentType){var ge="string"==typeof D?D:c0()(D);return[[j,P(ge)]]}return[[j,P(D.toString())]]}return"object"!==vc(D)?[[j,P(D)]]:Array.isArray(D)&&D.every(function(_e){return"object"!==vc(_e)})?[[j,Lu()(D).call(D,P).join(",")]]:[[j,P(c0()(D))]]}return"object"!==vc(D)?[[j,P(D)]]:Array.isArray(D)?"multi"===o?[[j,Lu()(D).call(D,P)]]:[[j,Lu()(D).call(D,P).join(ub[o||"csv"])]]:[[j,""]]}function GT(n,s,t,o){var c,W,re,g=o.style||"form",C=void 0===o.explode?"form"===g:o.explode,D=!t&&(o&&o.allowReserved?"unsafe":"reserved"),P=function(ge){return Kv(ge,{escape:D})},j=t?function(ie){return ie}:function(ie){return Kv(ie,{escape:D})};return"object"!==vc(s)?[[j(n),P(s)]]:Array.isArray(s)?C?[[j(n),Lu()(s).call(s,P)]]:[[j(n),Lu()(s).call(s,P).join(lb[g])]]:"deepObject"===g?Lu()(W=Su()(s)).call(W,function(ie){var ge;return[j(la()(ge="".concat(n,"[")).call(ge,ie,"]")),P(s[ie])]}):C?Lu()(re=Su()(s)).call(re,function(ie){return[j(ie),P(s[ie])]}):[[j(n),Lu()(c=Su()(s)).call(c,function(ie){var ge;return[la()(ge="".concat(j(ie),",")).call(ge,P(s[ie]))]}).join(",")]]}function m3(n){return u2()(n).reduce(function(s,t){var D,o=A_(t,2),C=cm(jT(o[0],o[1],!0));try{for(C.s();!(D=C.n()).done;){var P=A_(D.value,2),j=P[0],W=P[1];if(Array.isArray(W)){var ie,re=cm(W);try{for(re.s();!(ie=re.n()).done;){var ge=ie.value;if(ArrayBuffer.isView(ge)){var _e=new ob([ge]);s.append(j,_e)}else s.append(j,ge)}}catch(Re){re.e(Re)}finally{re.f()}}else if(ArrayBuffer.isView(W)){var Le=new ob([W]);s.append(j,Le)}else s.append(j,W)}}catch(Re){C.e(Re)}finally{C.f()}return s},new nA)}function aA(n){var s=Su()(n).reduce(function(t,o){var g,c=cm(jT(o,n[o]));try{for(c.s();!(g=c.n()).done;){var C=A_(g.value,2);t[C[0]]=C[1]}}catch(j){c.e(j)}finally{c.f()}return t},{});return Gy().stringify(s,{encode:!1,indices:!1})||""}function VT(){var n=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},s=n.url,t=void 0===s?"":s,o=n.query,c=n.form,g=function(){for(var xe=arguments.length,U=new Array(xe),pt=0;pt<xe;pt++)U[pt]=arguments[pt];var ht=zp()(U).call(U,function(wt){return wt}).join("&");return ht?"?".concat(ht):""};if(c){var C=Su()(c).some(function(ke){var xe=c[ke].value;return T0(xe)||ab(xe)}),D=n.headers["content-type"]||n.headers["Content-Type"];if(C||/multipart\/form-data/i.test(D)){var P=m3(n.form);_3(P,n)}else n.body=aA(c);delete n.form}if(o){var j=t.split("?"),W=A_(j,2),re=W[0],ie=W[1],ge="";if(ie){var _e=Gy().parse(ie),Le=Su()(o);Le.forEach(function(ke){return delete _e[ke]}),ge=Gy().stringify(_e,{encode:!0})}var Re=g(ge,aA(o));n.url=re+Re,delete n.query}return n}function v3(n,s,t){return t=t||function(o){return o},s=s||function(o){return o},function(o){return"string"==typeof o&&(o={url:o}),vh.mergeInQueryOrForm(o),o=s(o),t(n(o))}}var lA=i(22714),cb=i(23591),zT=i(14306),WT=i(45862),lp=i(6379),qv=i(51134),db=i(70891),e1=i(77576);function S0(n,s,t){return s in n?e1(n,s,{value:t,enumerable:!0,configurable:!0,writable:!0}):n[s]=t,n}function fb(n,s){var t=lA(n);if(cb){var o=cb(n);s&&(o=zT(o).call(o,function(c){return WT(n,c).enumerable})),t.push.apply(t,o)}return t}function _d(n){for(var s=1;s<arguments.length;s++){var t,o,c=null!=arguments[s]?arguments[s]:{};s%2?lp(t=fb(Object(c),!0)).call(t,function(g){S0(n,g,c[g])}):qv?db(n,qv(c)):lp(o=fb(Object(c))).call(o,function(g){e1(n,g,WT(c,g))})}return n}function t1(n,s){if(!(n instanceof s))throw new TypeError("Cannot call a class as a function")}function uA(n,s){for(var t=0;t<s.length;t++){var o=s[t];o.enumerable=o.enumerable||!1,o.configurable=!0,"value"in o&&(o.writable=!0),e1(n,o.key,o)}}function JT(n,s,t){return s&&uA(n.prototype,s),t&&uA(n,t),e1(n,"prototype",{writable:!1}),n}var n,y3=i(30508),D_=i.n(y3),cA=i(45819),dA=i.n(cA),b3=i(33814),fA=i.n(b3),mm=(n=function(s,t){return(n=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(o,c){o.__proto__=c}||function(o,c){for(var g in c)c.hasOwnProperty(g)&&(o[g]=c[g])})(s,t)},function(s,t){function o(){this.constructor=s}n(s,t),s.prototype=null===t?Object.create(t):(o.prototype=t.prototype,new o)}),C0=Object.prototype.hasOwnProperty;function n1(n,s){return C0.call(n,s)}function QT(n){if(Array.isArray(n)){for(var s=new Array(n.length),t=0;t<s.length;t++)s[t]=""+t;return s}if(Object.keys)return Object.keys(n);var o=[];for(var c in n)n1(n,c)&&o.push(c);return o}function yh(n){switch(typeof n){case"object":return JSON.parse(JSON.stringify(n));case"undefined":return null;default:return n}}function XT(n){for(var o,s=0,t=n.length;s<t;){if(!((o=n.charCodeAt(s))>=48&&o<=57))return!1;s++}return!0}function R_(n){return-1===n.indexOf("/")&&-1===n.indexOf("~")?n:n.replace(/~/g,"~0").replace(/\//g,"~1")}function pA(n){return n.replace(/~1/g,"/").replace(/~0/g,"~")}function qT(n){if(void 0===n)return!0;if(n)if(Array.isArray(n)){for(var s=0,t=n.length;s<t;s++)if(qT(n[s]))return!0}else if("object"==typeof n)for(var o=QT(n),c=o.length,g=0;g<c;g++)if(qT(n[o[g]]))return!0;return!1}function hA(n,s){var t=[n];for(var o in s){var c="object"==typeof s[o]?JSON.stringify(s[o],null,2):s[o];void 0!==c&&t.push(o+": "+c)}return t.join("\n")}var _A=function(n){function s(t,o,c,g,C){var D=this.constructor,P=n.call(this,hA(t,{name:o,index:c,operation:g,tree:C}))||this;return P.name=o,P.index=c,P.operation=g,P.tree=C,Object.setPrototypeOf(P,D.prototype),P.message=hA(t,{name:o,index:c,operation:g,tree:C}),P}return mm(s,n),s}(Error),ac=_A,M0=yh,N_={add:function(n,s,t){return n[s]=this.value,{newDocument:t}},remove:function(n,s,t){var o=n[s];return delete n[s],{newDocument:t,removed:o}},replace:function(n,s,t){var o=n[s];return n[s]=this.value,{newDocument:t,removed:o}},move:function(n,s,t){var o=fg(t,this.path);o&&(o=yh(o));var c=qm(t,{op:"remove",path:this.from}).removed;return qm(t,{op:"add",path:this.path,value:c}),{newDocument:t,removed:o}},copy:function(n,s,t){var o=fg(t,this.from);return qm(t,{op:"add",path:this.path,value:yh(o)}),{newDocument:t}},test:function(n,s,t){return{newDocument:t,test:r1(n[s],this.value)}},_get:function(n,s,t){return this.value=n[s],{newDocument:t}}},pb={add:function(n,s,t){return XT(s)?n.splice(s,0,this.value):n[s]=this.value,{newDocument:t,index:s}},remove:function(n,s,t){return{newDocument:t,removed:n.splice(s,1)[0]}},replace:function(n,s,t){var o=n[s];return n[s]=this.value,{newDocument:t,removed:o}},move:N_.move,copy:N_.copy,test:N_.test,_get:N_._get};function fg(n,s){if(""==s)return n;var t={op:"_get",path:s};return qm(n,t),t.value}function qm(n,s,t,o,c,g){if(void 0===t&&(t=!1),void 0===o&&(o=!0),void 0===c&&(c=!0),void 0===g&&(g=0),t&&("function"==typeof t?t(s,0,n,s.path):A0(s,0)),""===s.path){var C={newDocument:n};if("add"===s.op)return C.newDocument=s.value,C;if("replace"===s.op)return C.newDocument=s.value,C.removed=n,C;if("move"===s.op||"copy"===s.op)return C.newDocument=fg(n,s.from),"move"===s.op&&(C.removed=n),C;if("test"===s.op){if(C.test=r1(n,s.value),!1===C.test)throw new ac("Test operation failed","TEST_OPERATION_FAILED",g,s,n);return C.newDocument=n,C}if("remove"===s.op)return C.removed=n,C.newDocument=null,C;if("_get"===s.op)return s.value=n,C;if(t)throw new ac("Operation `op` property is not one of operations defined in RFC-6902","OPERATION_OP_INVALID",g,s,n);return C}o||(n=yh(n));var P=(s.path||"").split("/"),j=n,W=1,re=P.length,ie=void 0,ge=void 0,_e=void 0;for(_e="function"==typeof t?t:A0;;){if((ge=P[W])&&-1!=ge.indexOf("~")&&(ge=pA(ge)),c&&("__proto__"==ge||"prototype"==ge&&W>0&&"constructor"==P[W-1]))throw new TypeError("JSON-Patch: modifying `__proto__` or `constructor/prototype` prop is banned for security reasons, if this was on purpose, please set `banPrototypeModifications` flag false and pass it to this function. More info in fast-json-patch README");if(t&&void 0===ie&&(void 0===j[ge]?ie=P.slice(0,W).join("/"):W==re-1&&(ie=s.path),void 0!==ie&&_e(s,0,n,ie)),W++,Array.isArray(j)){if("-"===ge)ge=j.length;else{if(t&&!XT(ge))throw new ac("Expected an unsigned base-10 integer value, making the new referenced value the array element with the zero-based index","OPERATION_PATH_ILLEGAL_ARRAY_INDEX",g,s,n);XT(ge)&&(ge=~~ge)}if(W>=re){if(t&&"add"===s.op&&ge>j.length)throw new ac("The specified index MUST NOT be greater than the number of elements in the array","OPERATION_VALUE_OUT_OF_BOUNDS",g,s,n);if(!1===(C=pb[s.op].call(s,j,ge,n)).test)throw new ac("Test operation failed","TEST_OPERATION_FAILED",g,s,n);return C}}else if(W>=re){if(!1===(C=N_[s.op].call(s,j,ge,n)).test)throw new ac("Test operation failed","TEST_OPERATION_FAILED",g,s,n);return C}if(j=j[ge],t&&W<re&&(!j||"object"!=typeof j))throw new ac("Cannot perform operation at the desired path","OPERATION_PATH_UNRESOLVABLE",g,s,n)}}function vm(n,s,t,o,c){if(void 0===o&&(o=!0),void 0===c&&(c=!0),t&&!Array.isArray(s))throw new ac("Patch sequence must be an array","SEQUENCE_NOT_AN_ARRAY");o||(n=yh(n));for(var g=new Array(s.length),C=0,D=s.length;C<D;C++)g[C]=qm(n,s[C],t,!0,c,C),n=g[C].newDocument;return g.newDocument=n,g}function T3(n,s,t){var o=qm(n,s);if(!1===o.test)throw new ac("Test operation failed","TEST_OPERATION_FAILED",t,s,n);return o.newDocument}function A0(n,s,t,o){if("object"!=typeof n||null===n||Array.isArray(n))throw new ac("Operation is not an object","OPERATION_NOT_AN_OBJECT",s,n,t);if(!N_[n.op])throw new ac("Operation `op` property is not one of operations defined in RFC-6902","OPERATION_OP_INVALID",s,n,t);if("string"!=typeof n.path)throw new ac("Operation `path` property is not a string","OPERATION_PATH_INVALID",s,n,t);if(0!==n.path.indexOf("/")&&n.path.length>0)throw new ac('Operation `path` property must start with "/"',"OPERATION_PATH_INVALID",s,n,t);if(("move"===n.op||"copy"===n.op)&&"string"!=typeof n.from)throw new ac("Operation `from` property is not present (applicable in `move` and `copy` operations)","OPERATION_FROM_REQUIRED",s,n,t);if(("add"===n.op||"replace"===n.op||"test"===n.op)&&void 0===n.value)throw new ac("Operation `value` property is not present (applicable in `add`, `replace` and `test` operations)","OPERATION_VALUE_REQUIRED",s,n,t);if(("add"===n.op||"replace"===n.op||"test"===n.op)&&qT(n.value))throw new ac("Operation `value` property is not present (applicable in `add`, `replace` and `test` operations)","OPERATION_VALUE_CANNOT_CONTAIN_UNDEFINED",s,n,t);if(t)if("add"==n.op){var c=n.path.split("/").length,g=o.split("/").length;if(c!==g+1&&c!==g)throw new ac("Cannot perform an `add` operation at the desired path","OPERATION_PATH_CANNOT_ADD",s,n,t)}else if("replace"===n.op||"remove"===n.op||"_get"===n.op){if(n.path!==o)throw new ac("Cannot perform the operation at a path that does not exist","OPERATION_PATH_UNRESOLVABLE",s,n,t)}else if("move"===n.op||"copy"===n.op){var D=eS([{op:"_get",path:n.from,value:void 0}],t);if(D&&"OPERATION_PATH_UNRESOLVABLE"===D.name)throw new ac("Cannot perform the operation from a path that does not exist","OPERATION_FROM_UNRESOLVABLE",s,n,t)}}function eS(n,s,t){try{if(!Array.isArray(n))throw new ac("Patch sequence must be an array","SEQUENCE_NOT_AN_ARRAY");if(s)vm(yh(s),yh(n),t||!0);else{t=t||A0;for(var o=0;o<n.length;o++)t(n[o],o,s,void 0)}}catch(c){if(c instanceof ac)return c;throw c}}function r1(n,s){if(n===s)return!0;if(n&&s&&"object"==typeof n&&"object"==typeof s){var c,g,C,t=Array.isArray(n),o=Array.isArray(s);if(t&&o){if((g=n.length)!=s.length)return!1;for(c=g;0!=c--;)if(!r1(n[c],s[c]))return!1;return!0}if(t!=o)return!1;var D=Object.keys(n);if((g=D.length)!==Object.keys(s).length)return!1;for(c=g;0!=c--;)if(!s.hasOwnProperty(D[c]))return!1;for(c=g;0!=c--;)if(!r1(n[C=D[c]],s[C]))return!1;return!0}return n!=n&&s!=s}var hb=new WeakMap,tS=function(s){this.observers=new Map,this.obj=s},S3=function(s,t){this.callback=s,this.observer=t};function nS(n,s){s.unobserve()}function M3(n,s){var o,c=function(n){return hb.get(n)}(n);if(c){var g=function(n,s){return n.observers.get(s)}(c,s);o=g&&g.observer}else c=new tS(n),hb.set(n,c);if(o)return o;if(o={},c.value=yh(n),s){o.callback=s,o.next=null;var C=function(){rS(o)},D=function(){clearTimeout(o.next),o.next=setTimeout(C)};"undefined"!=typeof window&&(window.addEventListener("mouseup",D),window.addEventListener("keyup",D),window.addEventListener("mousedown",D),window.addEventListener("keydown",D),window.addEventListener("change",D))}return o.patches=[],o.object=n,o.unobserve=function(){rS(o),clearTimeout(o.next),function(n,s){n.observers.delete(s.callback)}(c,o),"undefined"!=typeof window&&(window.removeEventListener("mouseup",D),window.removeEventListener("keyup",D),window.removeEventListener("mousedown",D),window.removeEventListener("keydown",D),window.removeEventListener("change",D))},c.observers.set(s,new S3(s,o)),o}function rS(n,s){void 0===s&&(s=!1);var t=hb.get(n.object);mA(t.value,n.object,n.patches,"",s),n.patches.length&&vm(t.value,n.patches);var o=n.patches;return o.length>0&&(n.patches=[],n.callback&&n.callback(o)),o}function mA(n,s,t,o,c){if(s!==n){"function"==typeof s.toJSON&&(s=s.toJSON());for(var g=QT(s),C=QT(n),P=!1,j=C.length-1;j>=0;j--){var re=n[W=C[j]];if(!n1(s,W)||void 0===s[W]&&void 0!==re&&!1===Array.isArray(s))Array.isArray(n)===Array.isArray(s)?(c&&t.push({op:"test",path:o+"/"+R_(W),value:yh(re)}),t.push({op:"remove",path:o+"/"+R_(W)}),P=!0):(c&&t.push({op:"test",path:o,value:n}),t.push({op:"replace",path:o,value:s}));else{var ie=s[W];"object"==typeof re&&null!=re&&"object"==typeof ie&&null!=ie&&Array.isArray(re)===Array.isArray(ie)?mA(re,ie,t,o+"/"+R_(W),c):re!==ie&&(c&&t.push({op:"test",path:o+"/"+R_(W),value:yh(re)}),t.push({op:"replace",path:o+"/"+R_(W),value:yh(ie)}))}}if(P||g.length!=C.length)for(j=0;j<g.length;j++){var W;!n1(n,W=g[j])&&void 0!==s[W]&&t.push({op:"add",path:o+"/"+R_(W),value:yh(s[W])})}}}function xN(n,s,t){void 0===t&&(t=!1);var o=[];return mA(n,s,o,"",t),o}Object.assign({},r,u,{JsonPatchError:_A,deepClone:yh,escapePathComponent:R_,unescapePathComponent:pA});var DN=i(89225),A3=i.n(DN);const lc={add:function(n,s){return{op:"add",path:n,value:s}},replace:iS,remove:function(n){return{op:"remove",path:n}},merge:function(n,s){return{type:"mutation",op:"merge",path:n,value:s}},mergeDeep:function(n,s){return{type:"mutation",op:"mergeDeep",path:n,value:s}},context:function(n,s){return{type:"context",path:n,value:s}},getIn:function(n,s){return s.reduce(function(t,o){return void 0!==o&&t?t[o]:t},n)},applyPatch:function(n,s,t){if(t=t||{},"merge"===(s=_d(_d({},s),{},{path:s.path&&O3(s.path)})).op){var o=Va(n,s.path);D_()(o,s.value),vm(n,[iS(s.path,o)])}else if("mergeDeep"===s.op){var c=Va(n,s.path),g=A3()(c,s.value);n=vm(n,[iS(s.path,g)]).newDocument}else if("add"===s.op&&""===s.path&&Mt(s.value)){vm(n,Su()(s.value).reduce(function(re,ie){return re.push({op:"add",path:"/".concat(O3(ie)),value:s.value[ie]}),re},[]))}else if("replace"===s.op&&""===s.path){var P=s.value;t.allowMetaPatches&&s.meta&&Oo(s)&&(Array.isArray(s.value)||Mt(s.value))&&(P=_d(_d({},P),s.meta)),n=P}else if(vm(n,[s]),t.allowMetaPatches&&s.meta&&Oo(s)&&(Array.isArray(s.value)||Mt(s.value))){var W=_d(_d({},Va(n,s.path)),s.meta);vm(n,[iS(s.path,W)])}return n},parentPathMatch:function(n,s){if(!Array.isArray(s))return!1;for(var t=0,o=s.length;t<o;t+=1)if(s[t]!==n[t])return!1;return!0},flatten:Ne,fullyNormalizeArray:function(n){return qe(Ne(le(n)))},normalizeArray:le,isPromise:function(n){return Mt(n)&&_n(n.then)},forEachNew:function(n,s){try{return l(n,m,s)}catch(t){return t}},forEachNewPrimitive:function(n,s){try{return l(n,d,s)}catch(t){return t}},isJsonPatch:Rr,isContextPatch:function(n){return oa(n)&&"context"===n.type},isPatch:oa,isMutation:ni,isAdditiveMutation:Oo,isGenerator:function(n){return"[object GeneratorFunction]"===Object.prototype.toString.call(n)},isFunction:_n,isObject:Mt,isError:function(n){return n instanceof Error}};function O3(n){return Array.isArray(n)?n.length<1?"":"/".concat(Lu()(n).call(n,function(s){return(s+"").replace(/~/g,"~0").replace(/\//g,"~1")}).join("/")):n}function iS(n,s,t){return{op:"replace",path:n,value:s,meta:t}}function l(n,s,t){var o;return qe(Ne(Lu()(o=zp()(n).call(n,Oo)).call(o,function(D){return s(D.value,t,D.path)})||[]))}function d(n,s,t){return t=t||[],Array.isArray(n)?Lu()(n).call(n,function(c,g){return d(c,s,la()(t).call(t,g))}):Mt(n)?Lu()(o=Su()(n)).call(o,function(c){return d(n[c],s,la()(t).call(t,c))}):s(n,t[t.length-1],t);var o}function m(n,s,t){var o=[];if((t=t||[]).length>0){var c=s(n,t[t.length-1],t);c&&(o=la()(o).call(o,c))}if(Array.isArray(n)){var g=Lu()(n).call(n,function(P,j){return m(P,s,la()(t).call(t,j))});g&&(o=la()(o).call(o,g))}else if(Mt(n)){var C,D=Lu()(C=Su()(n)).call(C,function(P){return m(n[P],s,la()(t).call(t,P))});D&&(o=la()(o).call(o,D))}return Ne(o)}function le(n){return Array.isArray(n)?n:[n]}function Ne(n){var s;return la()(s=[]).apply(s,gm(Lu()(n).call(n,function(t){return Array.isArray(t)?Ne(t):t})))}function qe(n){return zp()(n).call(n,function(s){return void 0!==s})}function Mt(n){return n&&"object"===vc(n)}function _n(n){return n&&"function"==typeof n}function Rr(n){if(oa(n)){var s=n.op;return"add"===s||"remove"===s||"replace"===s}return!1}function ni(n){return Rr(n)||oa(n)&&"mutation"===n.type}function Oo(n){return ni(n)&&("add"===n.op||"replace"===n.op||"merge"===n.op||"mergeDeep"===n.op)}function oa(n){return n&&"object"===vc(n)}function Va(n,s){try{return fg(n,s)}catch(t){return console.error(t),{}}}var pu=i(17015),Mf=i.n(pu),Qh=i(71455),i1=i.n(Qh),Xh=i(38505);function tv(n,s){function t(){Error.captureStackTrace?Error.captureStackTrace(this,this.constructor):this.stack=(new Error).stack;for(var o=arguments.length,c=new Array(o),g=0;g<o;g++)c[g]=arguments[g];this.message=c[0],s&&s.apply(this,c)}return(t.prototype=new Error).name=n,t.prototype.constructor=t,t}var o1=i(18807),oS=i.n(o1),sS=["properties"],aS=["properties"],lS=["definitions","parameters","responses","securityDefinitions","components/schemas","components/responses","components/parameters","components/securitySchemes"],uS=["schema/example","items/example"];function kN(n){var s=n[n.length-1],t=n[n.length-2],o=n.join("/");return sS.indexOf(s)>-1&&-1===aS.indexOf(t)||lS.indexOf(o)>-1||uS.some(function(c){return o.indexOf(c)>-1})}function x3(n,s){var t,c=A_(n.split("#"),2),C=c[1],D=Xh.resolve(c[0]||"",s||"");return C?la()(t="".concat(D,"#")).call(t,C):D}var $N="application/json, application/yaml",HP=/^([a-z]+:\/\/|\/\/)/i,_b=tv("JSONRefError",function(s,t,o){this.originalError=o,D_()(this,t||{})}),nv={},HN=new(Mf()),UP=[function(n){return"paths"===n[0]&&"responses"===n[3]&&"examples"===n[5]},function(n){return"paths"===n[0]&&"responses"===n[3]&&"content"===n[5]&&"example"===n[7]},function(n){return"paths"===n[0]&&"responses"===n[3]&&"content"===n[5]&&"examples"===n[7]&&"value"===n[9]},function(n){return"paths"===n[0]&&"requestBody"===n[3]&&"content"===n[4]&&"example"===n[6]},function(n){return"paths"===n[0]&&"requestBody"===n[3]&&"content"===n[4]&&"examples"===n[6]&&"value"===n[8]},function(n){return"paths"===n[0]&&"parameters"===n[2]&&"example"===n[4]},function(n){return"paths"===n[0]&&"parameters"===n[3]&&"example"===n[5]},function(n){return"paths"===n[0]&&"parameters"===n[2]&&"examples"===n[4]&&"value"===n[6]},function(n){return"paths"===n[0]&&"parameters"===n[3]&&"examples"===n[5]&&"value"===n[7]},function(n){return"paths"===n[0]&&"parameters"===n[2]&&"content"===n[4]&&"example"===n[6]},function(n){return"paths"===n[0]&&"parameters"===n[2]&&"content"===n[4]&&"examples"===n[6]&&"value"===n[8]},function(n){return"paths"===n[0]&&"parameters"===n[3]&&"content"===n[4]&&"example"===n[7]},function(n){return"paths"===n[0]&&"parameters"===n[3]&&"content"===n[5]&&"examples"===n[7]&&"value"===n[9]}],YP={key:"$ref",plugin:function(s,t,o,c){var g=c.getInstance(),C=x_()(o).call(o,0,-1);if(!kN(C)&&!function(s){return UP.some(function(t){return t(s)})}(C)){var P=c.getContext(o).baseDoc;if("string"!=typeof s)return new _b("$ref: must be a string (JSON-Ref)",{$ref:s,baseDoc:P,fullPath:o});var ie,ge,_e,j=YN(s),W=j[0],re=j[1]||"";try{ie=P||W?BN(W,P):null}catch(xe){return D3(xe,{pointer:re,$ref:s,basePath:ie,fullPath:o})}if(function(n,s,t,o){var c,g,C=HN.get(o);C||HN.set(o,C={});var D=function(n){return 0===n.length?"":"/".concat(Lu()(n).call(n,VN).join("/"))}(t),P=la()(c="".concat(s||"<specmap-base>","#")).call(c,n),j=D.replace(/allOf\/\d+\/?/g,"");if(s===o.contextTree.get([]).baseDoc&&P3(j,n))return!0;var re="";if(t.some(function(ge){var _e;return re=la()(_e="".concat(re,"/")).call(_e,VN(ge)),C[re]&&C[re].some(function(Le){return P3(Le,P)||P3(P,Le)})}))return!0;C[j]=la()(g=C[j]||[]).call(g,P)}(re,ie,C,c)&&!g.useCircularStructures){var Le=x3(s,ie);return s===Le?null:lc.replace(o,Le)}if(null==ie?(_e=N3(re),void 0===(ge=c.get(_e))&&(ge=new _b("Could not resolve reference: ".concat(s),{pointer:re,$ref:s,baseDoc:P,fullPath:o}))):ge=null!=(ge=ZN(ie,re)).__value?ge.__value:ge.catch(function(xe){throw D3(xe,{pointer:re,$ref:s,baseDoc:P,fullPath:o})}),ge instanceof Error)return[lc.remove(o),ge];var Re=x3(s,ie),ke=lc.replace(C,ge,{$$ref:Re});if(ie&&ie!==P)return[ke,lc.context(C,{baseDoc:ie})];try{if(!function(n,s){var t=[n];return s.path.reduce(function(c,g){return t.push(c[g]),c[g]},n),function o(c){return lc.isObject(c)&&(t.indexOf(c)>=0||Su()(c).some(function(g){return o(c[g])}))}(s.value)}(c.state,ke)||g.useCircularStructures)return ke}catch(xe){return null}}}},UN=D_()(YP,{docCache:nv,absoluteify:BN,clearCache:function(n){void 0!==n?delete nv[n]:Su()(nv).forEach(function(s){delete nv[s]})},JSONRefError:_b,wrapError:D3,getDoc:jN,split:YN,extractFromDoc:ZN,fetchJSON:function(n){return fetch(n,{headers:{Accept:$N},loadSpec:!0}).then(function(s){return s.text()}).then(function(s){return tA.load(s)})},extract:R3,jsonPointerToArray:N3,unescapeJsonPointerToken:GN});const ZP=UN;function BN(n,s){if(!HP.test(n)){var t;if(!s)throw new _b(la()(t="Tried to resolve a relative URL, without having a basePath. path: '".concat(n,"' basePath: '")).call(t,s,"'"));return Xh.resolve(s,n)}return n}function D3(n,s){var t,o;return t=n&&n.response&&n.response.body?la()(o="".concat(n.response.body.code," ")).call(o,n.response.body.message):n.message,new _b("Could not resolve reference: ".concat(t),s,n)}function YN(n){return(n+"").split("#")}function ZN(n,s){var t=nv[n];if(t&&!lc.isPromise(t))try{var o=R3(s,t);return D_()(Dg().resolve(o),{__value:o})}catch(c){return Dg().reject(c)}return jN(n).then(function(c){return R3(s,c)})}function jN(n){var s=nv[n];return s?lc.isPromise(s)?s:Dg().resolve(s):(nv[n]=UN.fetchJSON(n).then(function(t){return nv[n]=t,t}),nv[n])}function R3(n,s){var t=N3(n);if(t.length<1)return s;var o=lc.getIn(s,t);if(void 0===o)throw new _b("Could not resolve pointer: ".concat(n," does not exist in document"),{pointer:n});return o}function N3(n){var s;if("string"!=typeof n)throw new TypeError("Expected a string, got a ".concat(vc(n)));return"/"===n[0]&&(n=n.substr(1)),""===n?[]:Lu()(s=n.split("/")).call(s,GN)}function GN(n){return"string"!=typeof n?n:new(i1())("=".concat(n.replace(/~1/g,"/").replace(/~0/g,"~"))).get("")}function VN(n){var s,t=new(i1())([["",n.replace(/~/g,"~0").replace(/\//g,"~1")]]);return x_()(s=t.toString()).call(s,1)}function P3(n,s){if(function(s){return!s||"/"===s||"#"===s}(s))return!0;var t=n.charAt(s.length),o=x_()(s).call(s,-1);return 0===n.indexOf(s)&&(!t||"/"===t||"#"===t)&&"#"!==o}const QP={key:"allOf",plugin:function(s,t,o,c,g){if(!g.meta||!g.meta.$$ref){var C=x_()(o).call(o,0,-1);if(!kN(C)){if(!Array.isArray(s)){var D=new TypeError("allOf must be an array");return D.fullPath=o,D}var P=!1,j=g.value;if(C.forEach(function(ge){!j||(j=j[ge])}),j=_d({},j),0!==Su()(j).length){delete j.allOf;var re,ie,W=[];return W.push(c.replace(C,{})),s.forEach(function(ge,_e){if(!c.isObject(ge)){if(P)return null;P=!0;var Le=new TypeError("Elements in allOf must be objects");return Le.fullPath=o,W.push(Le)}W.push(c.mergeDeep(C,ge));var ke=function(n,s){var t=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{},o=t.specmap,c=t.getBaseUrlForNodePath,g=void 0===c?function(j){var W;return o.getContext(la()(W=[]).call(W,gm(s),gm(j))).baseDoc}:c,C=t.targetKeys,D=void 0===C?["$ref","$$ref"]:C,P=[];return oS()(n).forEach(function(){if(dm()(D).call(D,this.key)&&"string"==typeof this.node){var W=this.path,re=la()(s).call(s,this.path),ie=x3(this.node,g(W));P.push(o.replace(re,ie))}}),P}(ge,x_()(o).call(o,0,-1),{getBaseUrlForNodePath:function(U){var pt;return c.getContext(la()(pt=[]).call(pt,gm(o),[_e],gm(U))).baseDoc},specmap:c});W.push.apply(W,gm(ke))}),j.example&&W.push(c.remove(la()(re=[]).call(re,C,"example"))),W.push(c.mergeDeep(C,j)),j.$$ref||W.push(c.remove(la()(ie=[]).call(ie,C,"$$ref"))),W}}}}},XP={key:"parameters",plugin:function(s,t,o,c){if(Array.isArray(s)&&s.length){var g=D_()([],s),C=x_()(o).call(o,0,-1),D=_d({},lc.getIn(c.spec,C));return s.forEach(function(P,j){try{g[j].default=c.parameterMacro(D,P)}catch(re){var W=new Error(re);return W.fullPath=o,W}}),lc.replace(o,g)}return lc.replace(o,s)}},KP={key:"properties",plugin:function(s,t,o,c){var g=_d({},s);for(var C in s)try{g[C].default=c.modelPropertyMacro(g[C])}catch(j){var D=new Error(j);return D.fullPath=o,D}return lc.replace(o,g)}};var qP=function(){function n(s){t1(this,n),this.root=I3(s||{})}return JT(n,[{key:"set",value:function(t,o){var c=this.getParent(t,!0);if(c){var g=t[t.length-1],C=c.children;C[g]?vA(C[g],o,c):C[g]=I3(o,c)}else vA(this.root,o,null)}},{key:"get",value:function(t){if((t=t||[]).length<1)return this.root.value;for(var c,g,o=this.root,C=0;C<t.length&&(c=o.children)[g=t[C]];C+=1)o=c[g];return o&&o.protoValue}},{key:"getParent",value:function(t,o){return!t||t.length<1?null:t.length<2?this.root:x_()(t).call(t,0,-1).reduce(function(c,g){if(!c)return c;var C=c.children;return!C[g]&&o&&(C[g]=I3(null,c)),C[g]},this.root)}}]),n}();function I3(n,s){return vA({children:{}},n,s)}function vA(n,s,t){return n.value=s||{},n.protoValue=t?_d(_d({},t.protoValue),n.value):n.value,Su()(n.children).forEach(function(o){var c=n.children[o];n.children[o]=vA(c,c.value,n)}),n}var WN=function(){},e8=function(){function n(s){var o,c,t=this;t1(this,n),D_()(this,{spec:"",debugLevel:"info",plugins:[],pluginHistory:{},errors:[],mutations:[],promisedPatches:[],state:{},patches:[],context:{},contextTree:new qP,showDebug:!1,allPatches:[],pluginProp:"specMap",libMethods:D_()(Object.create(this),lc,{getInstance:function(){return t}}),allowMetaPatches:!1},s),this.get=this._get.bind(this),this.getContext=this._getContext.bind(this),this.hasRun=this._hasRun.bind(this),this.wrappedPlugins=zp()(o=Lu()(c=this.plugins).call(c,this.wrapPlugin.bind(this))).call(o,lc.isFunction),this.patches.push(lc.add([],this.spec)),this.patches.push(lc.context([],this.context)),this.updatePatches(this.patches)}return JT(n,[{key:"debug",value:function(t){if(this.debugLevel===t){for(var o,c=arguments.length,g=new Array(c>1?c-1:0),C=1;C<c;C++)g[C-1]=arguments[C];(o=console).log.apply(o,g)}}},{key:"verbose",value:function(t){if("verbose"===this.debugLevel){for(var o,c,g=arguments.length,C=new Array(g>1?g-1:0),D=1;D<g;D++)C[D-1]=arguments[D];(o=console).log.apply(o,la()(c=["[".concat(t,"]   ")]).call(c,C))}}},{key:"wrapPlugin",value:function(t,o){var C,P,j,c=this.pathDiscriminator,g=null;return t[this.pluginProp]?(g=t,C=t[this.pluginProp]):lc.isFunction(t)?C=t:lc.isObject(t)&&(P=t,j=function(re,ie){return!Array.isArray(re)||re.every(function(ge,_e){return ge===ie[_e]})},C=M_().mark(function W(re,ie){var ge,_e,Le,Re,ke,xe;return M_().wrap(function(pt){for(;;)switch(pt.prev=pt.next){case 0:xe=function(wt,It,dn){var Lt,Dn,Mn,$r,ur,Pr,xr,fn,Nn,$n,Qn,Tn,Yr;return M_().wrap(function(ii){for(;;)switch(ii.prev=ii.next){case 0:if(lc.isObject(wt)){ii.next=6;break}if(P.key!==It[It.length-1]){ii.next=4;break}return ii.next=4,P.plugin(wt,P.key,It,ie);case 4:ii.next=30;break;case 6:Dn=It[Lt=It.length-1],Mn=It.indexOf("properties"),$r="properties"===Dn&&Lt===Mn,ur=ie.allowMetaPatches&&_e[wt.$$ref],Pr=0,xr=Su()(wt);case 12:if(!(Pr<xr.length)){ii.next=30;break}if(Nn=wt[fn=xr[Pr]],$n=la()(It).call(It,fn),Qn=lc.isObject(Nn),Tn=wt.$$ref,ur){ii.next=22;break}if(!Qn){ii.next=22;break}return ie.allowMetaPatches&&Tn&&(_e[Tn]=!0),ii.delegateYield(xe(Nn,$n,dn),"t0",22);case 22:if($r||fn!==P.key){ii.next=27;break}if(Yr=j(c,It),c&&!Yr){ii.next=27;break}return ii.next=27,P.plugin(Nn,fn,$n,ie,dn);case 27:Pr++,ii.next=12;break;case 30:case"end":return ii.stop()}},ge)},ge=M_().mark(xe),_e={},Le=cm(zp()(re).call(re,lc.isAdditiveMutation)),pt.prev=4,Le.s();case 6:if((Re=Le.n()).done){pt.next=11;break}return pt.delegateYield(xe((ke=Re.value).value,ke.path,ke),"t0",9);case 9:pt.next=6;break;case 11:pt.next=16;break;case 13:pt.prev=13,pt.t1=pt.catch(4),Le.e(pt.t1);case 16:return pt.prev=16,Le.f(),pt.finish(16);case 19:case"end":return pt.stop()}},W,null,[[4,13,16,19]])})),D_()(C.bind(g),{pluginName:t.name||o,isGenerator:lc.isGenerator(C)})}},{key:"nextPlugin",value:function(){var t,o=this;return dA()(t=this.wrappedPlugins).call(t,function(c){return o.getMutationsForPlugin(c).length>0})}},{key:"nextPromisedPatch",value:function(){var t;if(this.promisedPatches.length>0)return Dg().race(Lu()(t=this.promisedPatches).call(t,function(o){return o.value}))}},{key:"getPluginHistory",value:function(t){var o=this.constructor.getPluginName(t);return this.pluginHistory[o]||[]}},{key:"getPluginRunCount",value:function(t){return this.getPluginHistory(t).length}},{key:"getPluginHistoryTip",value:function(t){var o=this.getPluginHistory(t);return o&&o[o.length-1]||{}}},{key:"getPluginMutationIndex",value:function(t){var o=this.getPluginHistoryTip(t).mutationIndex;return"number"!=typeof o?-1:o}},{key:"updatePluginHistory",value:function(t,o){var c=this.constructor.getPluginName(t);this.pluginHistory[c]=this.pluginHistory[c]||[],this.pluginHistory[c].push(o)}},{key:"updatePatches",value:function(t){var o=this;lc.normalizeArray(t).forEach(function(c){if(c instanceof Error)o.errors.push(c);else try{if(!lc.isObject(c))return void o.debug("updatePatches","Got a non-object patch",c);if(o.showDebug&&o.allPatches.push(c),lc.isPromise(c.value))return o.promisedPatches.push(c),void o.promisedPatchThen(c);if(lc.isContextPatch(c))return void o.setContext(c.path,c.value);if(lc.isMutation(c))return void o.updateMutations(c)}catch(g){console.error(g),o.errors.push(g)}})}},{key:"updateMutations",value:function(t){"object"===vc(t.value)&&!Array.isArray(t.value)&&this.allowMetaPatches&&(t.value=_d({},t.value));var o=lc.applyPatch(this.state,t,{allowMetaPatches:this.allowMetaPatches});o&&(this.mutations.push(t),this.state=o)}},{key:"removePromisedPatch",value:function(t){var o,c=this.promisedPatches.indexOf(t);c<0?this.debug("Tried to remove a promisedPatch that isn't there!"):fA()(o=this.promisedPatches).call(o,c,1)}},{key:"promisedPatchThen",value:function(t){var o=this;return t.value=t.value.then(function(c){var g=_d(_d({},t),{},{value:c});o.removePromisedPatch(t),o.updatePatches(g)}).catch(function(c){o.removePromisedPatch(t),o.updatePatches(c)}),t.value}},{key:"getMutations",value:function(t,o){var c;return t=t||0,"number"!=typeof o&&(o=this.mutations.length),x_()(c=this.mutations).call(c,t,o)}},{key:"getCurrentMutations",value:function(){return this.getMutationsForPlugin(this.getCurrentPlugin())}},{key:"getMutationsForPlugin",value:function(t){var o=this.getPluginMutationIndex(t);return this.getMutations(o+1)}},{key:"getCurrentPlugin",value:function(){return this.currentPlugin}},{key:"getLib",value:function(){return this.libMethods}},{key:"_get",value:function(t){return lc.getIn(this.state,t)}},{key:"_getContext",value:function(t){return this.contextTree.get(t)}},{key:"setContext",value:function(t,o){return this.contextTree.set(t,o)}},{key:"_hasRun",value:function(t){return this.getPluginRunCount(this.getCurrentPlugin())>(t||0)}},{key:"dispatch",value:function(){var D,t=this,o=this,c=this.nextPlugin();if(!c){var g=this.nextPromisedPatch();if(g)return g.then(function(){return t.dispatch()}).catch(function(){return t.dispatch()});var C={spec:this.state,errors:this.errors};return this.showDebug&&(C.patches=this.allPatches),Dg().resolve(C)}if(o.pluginCount=o.pluginCount||{},o.pluginCount[c]=(o.pluginCount[c]||0)+1,o.pluginCount[c]>100)return Dg().resolve({spec:o.state,errors:la()(D=o.errors).call(D,new Error("We've reached a hard limit of ".concat(100," plugin runs")))});if(c!==this.currentPlugin&&this.promisedPatches.length){var P,j=Lu()(P=this.promisedPatches).call(P,function(ie){return ie.value});return Dg().all(Lu()(j).call(j,function(ie){return ie.then(WN,WN)})).then(function(){return t.dispatch()})}return function(){o.currentPlugin=c;var ie=o.getCurrentMutations(),ge=o.mutations.length-1;try{if(c.isGenerator){var Le,_e=cm(c(ie,o.getLib()));try{for(_e.s();!(Le=_e.n()).done;)re(Le.value)}catch(xe){_e.e(xe)}finally{_e.f()}}else re(c(ie,o.getLib()))}catch(xe){console.error(xe),re([D_()(Object.create(xe),{plugin:c})])}finally{o.updatePluginHistory(c,{mutationIndex:ge})}return o.dispatch()}();function re(ie){ie&&(ie=lc.fullyNormalizeArray(ie),o.updatePatches(ie,c))}}}],[{key:"getPluginName",value:function(t){return t.pluginName}},{key:"getPatchesOfType",value:function(t,o){return zp()(t).call(t,o)}}]),n}(),gb={refs:ZP,allOf:QP,parameters:XP,properties:KP},n8=i(84220),JN=i.n(n8),QN=function(s){return String.prototype.toLowerCase.call(s)},XN=function(s){return s.replace(/[^\w]/gi,"_")};function KN(n){var s=n.openapi;return!!s&&JN()(s).call(s,"3")}function L3(n,s){var t=arguments.length>2&&void 0!==arguments[2]?arguments[2]:"",o=arguments.length>3&&void 0!==arguments[3]?arguments[3]:{},c=o.v2OperationIdCompatibilityMode;if(!n||"object"!==vc(n))return null;var g=(n.operationId||"").replace(/\s/g,"");return g.length?XN(n.operationId):r8(s,t,{v2OperationIdCompatibilityMode:c})}function r8(n,s){var t,o=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{},c=o.v2OperationIdCompatibilityMode;if(c){var g,C,D=la()(g="".concat(s.toLowerCase(),"_")).call(g,n).replace(/[\s!@#$%^&*()_+=[{\]};:<>|./?,\\'""-]/g,"_");return(D=D||la()(C="".concat(n.substring(1),"_")).call(C,s)).replace(/((_){2,})/g,"_").replace(/^(_)*/g,"").replace(/([_])*$/g,"")}return la()(t="".concat(QN(s))).call(t,XN(n))}function qN(n,s){var t;return la()(t="".concat(QN(s),"-")).call(t,n)}function e6(n){var s=n.spec,t=s.paths,o={};if(!t||s.$$normalized)return n;for(var c in t){var g,C=t[c];if(null!=C&&dm()(g=["object","function"]).call(g,vc(C))){var D=C.parameters,P=function(ie){var ge,_e=C[ie];if(null==_e||!dm()(ge=["object","function"]).call(ge,vc(_e)))return"continue";var Le=L3(_e,c,ie);if(Le){o[Le]?o[Le].push(_e):o[Le]=[_e];var Re=o[Le];if(Re.length>1)Re.forEach(function($r,ur){var Pr;$r.__originalOperationId=$r.__originalOperationId||$r.operationId,$r.operationId=la()(Pr="".concat(Le)).call(Pr,ur+1)});else if(void 0!==_e.operationId){var ke=Re[0];ke.__originalOperationId=ke.__originalOperationId||_e.operationId,ke.operationId=Le}}if("parameters"!==ie){var xe=[],U={};for(var pt in s)("produces"===pt||"consumes"===pt||"security"===pt)&&(U[pt]=s[pt],xe.push(U));if(D&&(U.parameters=D,xe.push(U)),xe.length){var wt,ht=cm(xe);try{for(ht.s();!(wt=ht.n()).done;){var It=wt.value;for(var dn in It)if(_e[dn]){if("parameters"===dn){var Dn,Lt=cm(It[dn]);try{var Mn=function(){var ur=Dn.value;_e[dn].some(function(xr){return xr.name&&xr.name===ur.name||xr.$ref&&xr.$ref===ur.$ref||xr.$$ref&&xr.$$ref===ur.$$ref||xr===ur})||_e[dn].push(ur)};for(Lt.s();!(Dn=Lt.n()).done;)Mn()}catch($r){Lt.e($r)}finally{Lt.f()}}}else _e[dn]=It[dn]}}catch($r){ht.e($r)}finally{ht.f()}}}};for(var j in C)P(j)}}return s.$$normalized=!0,n}function t6(n){var s=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},t=s.requestInterceptor,o=s.responseInterceptor,c=n.withCredentials?"include":"same-origin";return function(g){return n({url:g,loadSpec:!0,requestInterceptor:t,responseInterceptor:o,headers:{Accept:$N},credentials:c}).then(function(C){return C.body})}}function n6(n){var t=n.spec,c=n.mode,g=n.allowMetaPatches,C=void 0===g||g,D=n.pathDiscriminator,P=n.modelPropertyMacro,j=n.parameterMacro,W=n.requestInterceptor,re=n.responseInterceptor,ie=n.skipNormalization,ge=n.useCircularStructures,_e=n.http,Le=n.baseDoc;return Le=Le||n.url,_e=n.fetch||_e||iA,t?Re(t):t6(_e,{requestInterceptor:W,responseInterceptor:re})(Le).then(Re);function Re(ke){Le&&(gb.refs.docCache[Le]=ke),gb.refs.fetchJSON=t6(_e,{requestInterceptor:W,responseInterceptor:re});var xe=[gb.refs];return"function"==typeof j&&xe.push(gb.parameters),"function"==typeof P&&xe.push(gb.properties),"strict"!==c&&xe.push(gb.allOf),function(n){return new e8(n).dispatch()}({spec:ke,context:{baseDoc:Le},plugins:xe,allowMetaPatches:C,pathDiscriminator:D,parameterMacro:j,modelPropertyMacro:P,useCircularStructures:ge}).then(ie?function(){var U=s0(M_().mark(function pt(ht){return M_().wrap(function(It){for(;;)switch(It.prev=It.next){case 0:return It.abrupt("return",ht);case 1:case"end":return It.stop()}},pt)}));return function(pt){return U.apply(this,arguments)}}():e6)}}var F3=i(72632);function r6(n,s){if(null==n)return{};var o,c,t=function(n,s){if(null==n)return{};var c,g,t={},o=lA(n);for(g=0;g<o.length;g++)c=o[g],!(F3(s).call(s,c)>=0)&&(t[c]=n[c]);return t}(n,s);if(cb){var g=cb(n);for(c=0;c<g.length;c++)o=g[c],!(F3(s).call(s,o)>=0)&&(!Object.prototype.propertyIsEnumerable.call(n,o)||(t[o]=n[o]))}return t}var l8=i(58102),mb=i.n(l8),u8=i(7281);function i6(n){return"[object Object]"===Object.prototype.toString.call(n)}function o6(n){var s,t;return!1!==i6(n)&&(void 0===(s=n.constructor)||!(!1===i6(t=s.prototype)||!1===t.hasOwnProperty("isPrototypeOf")))}const c8={body:function(n){n.req.body=n.value},header:function(n){var s=n.req,t=n.parameter,o=n.value;s.headers=s.headers||{},void 0!==o&&(s.headers[t.name]=o)},query:function(n){var s=n.req,t=n.value,o=n.parameter;if(s.query=s.query||{},!1===t&&"boolean"===o.type&&(t="false"),0===t&&["number","integer"].indexOf(o.type)>-1&&(t="0"),t)s.query[o.name]={collectionFormat:o.collectionFormat,value:t};else if(o.allowEmptyValue&&void 0!==t){var c=o.name;s.query[c]=s.query[c]||{},s.query[c].allowEmptyValue=!0}},path:function(n){var s=n.req,t=n.value;s.url=s.url.split("{".concat(n.parameter.name,"}")).join(encodeURIComponent(t))},formData:function(n){var s=n.req,t=n.value,o=n.parameter;(t||o.allowEmptyValue)&&(s.form=s.form||{},s.form[o.name]={value:t,allowEmptyValue:o.allowEmptyValue,collectionFormat:o.collectionFormat})}};function yA(n,s){return dm()(s).call(s,"application/json")?"string"==typeof n?n:c0()(n):n.toString()}function g8(n){var s=n.req,t=n.value,o=n.parameter,c=o.name,g=o.style,C=o.explode,D=o.content;if(D){var P=Su()(D)[0];s.url=s.url.split("{".concat(c,"}")).join(Kv(yA(t,P),{escape:!0}))}else{var j=BT({key:o.name,value:t,style:g||"simple",explode:C||!1,escape:!0});s.url=s.url.split("{".concat(c,"}")).join(j)}}function m8(n){var s=n.req,t=n.value,o=n.parameter;if(s.query=s.query||{},o.content){var c=Su()(o.content)[0];s.query[o.name]=yA(t,c)}else if(!1===t&&(t="false"),0===t&&(t="0"),t)s.query[o.name]={value:t,serializationOption:{style:o.style,explode:o.explode,allowReserved:o.allowReserved}};else if(o.allowEmptyValue&&void 0!==t){var P=o.name;s.query[P]=s.query[P]||{},s.query[P].allowEmptyValue=!0}}var v8=["accept","authorization","content-type"];function y8(n){var s=n.req,t=n.parameter,o=n.value;if(s.headers=s.headers||{},!(v8.indexOf(t.name.toLowerCase())>-1)){if(t.content){var c=Su()(t.content)[0];return void(s.headers[t.name]=yA(o,c))}void 0!==o&&(s.headers[t.name]=BT({key:t.name,value:o,style:t.style||"simple",explode:void 0!==t.explode&&t.explode,escape:!1}))}}function b8(n){var s=n.req,t=n.parameter,o=n.value;s.headers=s.headers||{};var c=vc(o);if(t.content){var g,C=Su()(t.content)[0];s.headers.Cookie=la()(g="".concat(t.name,"=")).call(g,yA(o,C))}else if("undefined"!==c){var D="object"===c&&!Array.isArray(o)&&t.explode?"":"".concat(t.name,"=");s.headers.Cookie=D+BT({key:t.name,value:o,escape:!1,style:t.style||"form",explode:void 0!==t.explode&&t.explode})}}var E8=i(24677),s6=i.n(E8);const a6=(void 0!==s6()?s6():"undefined"!=typeof self?self:window).btoa;var w8=["http","fetch","spec","operationId","pathName","method","parameters","securities"],l6=function(s){return Array.isArray(s)?s:[]},x8=tv("OperationNotFoundError",function(s,t,o){this.originalError=o,D_()(this,t||{})}),N8={buildRequest:u6};function P8(n){var s=n.http,t=n.fetch,o=n.spec,c=n.operationId,g=n.pathName,C=n.method,D=n.parameters,P=n.securities,j=r6(n,w8),W=s||t||iA;g&&C&&!c&&(c=qN(g,C));var re=N8.buildRequest(_d({spec:o,operationId:c,parameters:D,securities:P,http:W},j));return re.body&&(o6(re.body)||Array.isArray(re.body))&&(re.body=c0()(re.body)),W(re)}function u6(n){var s,t,o=n.spec,c=n.operationId,g=n.responseContentType,C=n.scheme,D=n.requestInterceptor,P=n.responseInterceptor,j=n.contextUrl,W=n.userFetch,re=n.server,ie=n.serverVariables,ge=n.http,_e=n.signal,Le=n.parameters,Re=n.parameterBuilders,ke=KN(o);Re||(Re=ke?p:c8);var U={url:"",credentials:ge&&ge.withCredentials?"include":"same-origin",headers:{},cookies:{}};_e&&(U.signal=_e),D&&(U.requestInterceptor=D),P&&(U.responseInterceptor=P),W&&(U.userFetch=W);var pt=function(n,s){return n&&n.paths?function(n,s){return function(n,s,t){if(!n||"object"!==vc(n)||!n.paths||"object"!==vc(n.paths))return null;var o=n.paths;for(var c in o)for(var g in o[c])if("PARAMETERS"!==g.toUpperCase()){var C=o[c][g];if(C&&"object"===vc(C)){var D={spec:n,pathName:c,method:g.toUpperCase(),operation:C};if(s(D))return D}}}(n,s)||null}(n,function(t){var o=t.pathName,c=t.method,g=t.operation;if(!g||"object"!==vc(g))return!1;var C=g.operationId;return[L3(g,o,c),qN(o,c),C].some(function(j){return j&&j===s})}):null}(o,c);if(!pt)throw new x8("Operation ".concat(c," not found"));var ht=pt.operation,wt=void 0===ht?{}:ht,It=pt.method,dn=pt.pathName;if(U.url+=function(n){return KN(n.spec)?function(n){var s=n.spec,t=n.pathName,o=n.method,c=n.server,g=n.contextUrl,C=n.serverVariables,D=void 0===C?{}:C,P=mb()(s,["paths",t,(o||"").toLowerCase(),"servers"])||mb()(s,["paths",t,"servers"])||mb()(s,["servers"]),j="",W=null;if(c&&P&&P.length){var re=Lu()(P).call(P,function(_e){return _e.url});re.indexOf(c)>-1&&(j=c,W=P[re.indexOf(c)])}if(!j&&P&&P.length){j=P[0].url;var ie=A_(P,1);W=ie[0]}return j.indexOf("{")>-1&&function(n){for(var o,s=[],t=/{([^}]+)}/g;o=t.exec(n);)s.push(o[1]);return s}(j).forEach(function(_e){if(W.variables&&W.variables[_e]){var Re=D[_e]||W.variables[_e].default,ke=new RegExp("{".concat(_e,"}"),"g");j=j.replace(ke,Re)}}),function(){var D,P,n=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"",s=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"",t=Xh.parse(n&&s?Xh.resolve(s,n):n),o=Xh.parse(s),c=k3(t.protocol)||k3(o.protocol)||"",g=t.host||o.host,C=t.pathname||"";return"/"===(D=c&&g?la()(P="".concat(c,"://")).call(P,g+C):C)[D.length-1]?x_()(D).call(D,0,-1):D}(j,g)}(n):function(n){var W,re,s=n.spec,t=n.scheme,o=n.contextUrl,g=Xh.parse(void 0===o?"":o),C=Array.isArray(s.schemes)?s.schemes[0]:null,D=t||C||k3(g.protocol)||"http",P=s.host||g.host||"",j=s.basePath||"";return"/"===(W=D&&P?la()(re="".concat(D,"://")).call(re,P+j):j)[W.length-1]?x_()(W).call(W,0,-1):W}(n)}({spec:o,scheme:C,contextUrl:j,server:re,serverVariables:ie,pathName:dn,method:It}),!c)return delete U.cookies,U;U.url+=dn,U.method="".concat(It).toUpperCase(),Le=Le||{};var Lt=o.paths[dn]||{};g&&(U.headers.accept=g);var Dn=function(s){var t={};s.forEach(function(c){t[c.in]||(t[c.in]={}),t[c.in][c.name]=c});var o=[];return Su()(t).forEach(function(c){Su()(t[c]).forEach(function(g){o.push(t[c][g])})}),o}(la()(s=la()(t=[]).call(t,l6(wt.parameters))).call(s,l6(Lt.parameters)));Dn.forEach(function(ur){var xr,fn,Pr=Re[ur.in];if("body"===ur.in&&ur.schema&&ur.schema.properties&&(xr=Le),void 0===(xr=ur&&ur.name&&Le[ur.name]))xr=ur&&ur.name&&Le[la()(fn="".concat(ur.in,".")).call(fn,ur.name)];else if(function(s,t){return zp()(t).call(t,function(o){return o.name===s})}(ur.name,Dn).length>1){var Nn;console.warn(la()(Nn="Parameter '".concat(ur.name,"' is ambiguous because the defined spec has more than one parameter with the name: '")).call(Nn,ur.name,"' and the passed-in parameter values did not define an 'in' value."))}if(null!==xr){if(void 0!==ur.default&&void 0===xr&&(xr=ur.default),void 0===xr&&ur.required&&!ur.allowEmptyValue)throw new Error("Required parameter ".concat(ur.name," is not provided"));if(ke&&ur.schema&&"object"===ur.schema.type&&"string"==typeof xr)try{xr=JSON.parse(xr)}catch($n){throw new Error("Could not parse object parameter value string as JSON")}Pr&&Pr({req:U,parameter:ur,value:xr,operation:wt,spec:o})}});var Mn=_d(_d({},n),{},{operation:wt});if((U=ke?function(n,s){var t=n.operation,o=n.requestBody,C=n.attachContentTypeForEmptyPayload,D=n.requestContentType;s=function(n){var s=n.request,t=n.securities,o=void 0===t?{}:t,c=n.operation,g=void 0===c?{}:c,C=n.spec,D=_d({},s),P=o.authorized,j=void 0===P?{}:P,W=g.security||C.security||[],re=j&&!!Su()(j).length,ie=mb()(C,["components","securitySchemes"])||{};return D.headers=D.headers||{},D.query=D.query||{},Su()(o).length&&re&&W&&(!Array.isArray(g.security)||g.security.length)?(W.forEach(function(ge){Su()(ge).forEach(function(_e){var Le=j[_e],Re=ie[_e];if(Le){var ke=Le.value||Le,xe=Re.type;if(Le)if("apiKey"===xe)"query"===Re.in&&(D.query[Re.name]=ke),"header"===Re.in&&(D.headers[Re.name]=ke),"cookie"===Re.in&&(D.cookies[Re.name]=ke);else if("http"===xe){if(/^basic$/i.test(Re.scheme)){var U,pt=ke.username||"",ht=ke.password||"",wt=a6(la()(U="".concat(pt,":")).call(U,ht));D.headers.Authorization="Basic ".concat(wt)}/^bearer$/i.test(Re.scheme)&&(D.headers.Authorization="Bearer ".concat(ke))}else if("oauth2"===xe||"openIdConnect"===xe){var It,dn=Le.token||{},Dn=dn[Re["x-tokenName"]||"access_token"],Mn=dn.token_type;(!Mn||"bearer"===Mn.toLowerCase())&&(Mn="Bearer"),D.headers.Authorization=la()(It="".concat(Mn," ")).call(It,Dn)}}})}),D):s}({request:s,securities:n.securities,operation:t,spec:n.spec});var P=t.requestBody||{},j=Su()(P.content||{}),W=D&&j.indexOf(D)>-1;if(o||C){if(D&&W)s.headers["Content-Type"]=D;else if(!D){var re=j[0];re&&(s.headers["Content-Type"]=re,D=re)}}else D&&W&&(s.headers["Content-Type"]=D);if(!n.responseContentType&&t.responses){var ie,ge=zp()(ie=u2()(t.responses)).call(ie,function(Le){var Re=A_(Le,2),xe=Re[1],U=parseInt(Re[0],10);return U>=200&&U<300&&o6(xe.content)}).reduce(function(Le,Re){var xe=A_(Re,2)[1];return la()(Le).call(Le,Su()(xe.content))},[]);ge.length>0&&(s.headers.accept=ge.join(", "))}if(o)if(D){if(j.indexOf(D)>-1)if("application/x-www-form-urlencoded"===D||"multipart/form-data"===D)if("object"===vc(o)){var _e=(P.content[D]||{}).encoding||{};s.form={},Su()(o).forEach(function(Le){s.form[Le]={value:o[Le],encoding:_e[Le]||{}}})}else s.form=o;else s.body=o}else s.body=o;return s}(Mn,U):function(n,s){var P,j,t=n.spec,o=n.operation,g=n.requestContentType,C=n.responseContentType,D=n.attachContentTypeForEmptyPayload;if((s=function(n){var s=n.request,t=n.securities,o=void 0===t?{}:t,c=n.operation,g=void 0===c?{}:c,C=n.spec,D=_d({},s),P=o.authorized,j=void 0===P?{}:P,W=o.specSecurity,ie=g.security||(void 0===W?[]:W),ge=j&&!!Su()(j).length,_e=C.securityDefinitions;return D.headers=D.headers||{},D.query=D.query||{},Su()(o).length&&ge&&ie&&(!Array.isArray(g.security)||g.security.length)?(ie.forEach(function(Le){Su()(Le).forEach(function(Re){var ke=j[Re];if(ke){var xe=ke.token,U=ke.value||ke,pt=_e[Re],ht=pt.type,It=xe&&xe[pt["x-tokenName"]||"access_token"],dn=xe&&xe.token_type;if(ke)if("apiKey"===ht){var Lt="query"===pt.in?"query":"headers";D[Lt]=D[Lt]||{},D[Lt][pt.name]=U}else if("basic"===ht)if(U.header)D.headers.authorization=U.header;else{var Dn,Mn=U.username||"",$r=U.password||"";U.base64=a6(la()(Dn="".concat(Mn,":")).call(Dn,$r)),D.headers.authorization="Basic ".concat(U.base64)}else if("oauth2"===ht&&It){var ur;dn=dn&&"bearer"!==dn.toLowerCase()?dn:"Bearer",D.headers.authorization=la()(ur="".concat(dn," ")).call(ur,It)}}})}),D):s}({request:s,securities:n.securities,operation:o,spec:t})).body||s.form||D)if(g)s.headers["Content-Type"]=g;else if(Array.isArray(o.consumes)){var W=A_(o.consumes,1);s.headers["Content-Type"]=W[0]}else if(Array.isArray(t.consumes)){var re=A_(t.consumes,1);s.headers["Content-Type"]=re[0]}else o.parameters&&zp()(P=o.parameters).call(P,function(Re){return"file"===Re.type}).length?s.headers["Content-Type"]="multipart/form-data":o.parameters&&zp()(j=o.parameters).call(j,function(Re){return"formData"===Re.in}).length&&(s.headers["Content-Type"]="application/x-www-form-urlencoded");else if(g){var ie,ge,_e=o.parameters&&zp()(ie=o.parameters).call(ie,function(Re){return"body"===Re.in}).length>0,Le=o.parameters&&zp()(ge=o.parameters).call(ge,function(Re){return"formData"===Re.in}).length>0;(_e||Le)&&(s.headers["Content-Type"]=g)}return!C&&Array.isArray(o.produces)&&o.produces.length>0&&(s.headers.accept=o.produces.join(", ")),s}(Mn,U)).cookies&&Su()(U.cookies).length){var $r=Su()(U.cookies).reduce(function(ur,Pr){return ur+(ur?"&":"")+u8.serialize(Pr,U.cookies[Pr])},"");U.headers.Cookie=$r}return U.cookies&&delete U.cookies,VT(U),U}var k3=function(s){return s?s.replace(/\W/g,""):null};function H8(n,s){return $3.apply(this,arguments)}function $3(){return($3=s0(M_().mark(function n(s,t){var o,c,re,ie,ge,_e,Le=arguments;return M_().wrap(function(ke){for(;;)switch(ke.prev=ke.next){case 0:return c=(o=Le.length>2&&void 0!==Le[2]?Le[2]:{}).returnEntireTree,re={pathDiscriminator:t,baseDoc:o.baseDoc,requestInterceptor:o.requestInterceptor,responseInterceptor:o.responseInterceptor,parameterMacro:o.parameterMacro,modelPropertyMacro:o.modelPropertyMacro,useCircularStructures:o.useCircularStructures},ie=e6({spec:s}),ge=ie.spec,ke.next=6,n6(_d(_d({},re),{},{spec:ge,allowMetaPatches:!0,skipNormalization:!0}));case 6:return _e=ke.sent,!c&&Array.isArray(t)&&t.length&&(_e.spec=mb()(_e.spec,t)||null),ke.abrupt("return",_e);case 9:case"end":return ke.stop()}},n)}))).apply(this,arguments)}var c6=i(88768),d6=Bl.createContext(null),f6=function(n){n()};var p6={notify:function(){},get:function(){return[]}};function h6(n,s){var t,o=p6;function C(){W.onStateChange&&W.onStateChange()}function P(){t||(t=s?s.addNestedSub(C):n.subscribe(C),o=function(){var n=f6,s=null,t=null;return{clear:function(){s=null,t=null},notify:function(){n(function(){for(var c=s;c;)c.callback(),c=c.next})},get:function(){for(var c=[],g=s;g;)c.push(g),g=g.next;return c},subscribe:function(c){var g=!0,C=t={callback:c,next:null,prev:t};return C.prev?C.prev.next=C:s=C,function(){!g||null===s||(g=!1,C.next?C.next.prev=C.prev:t=C.prev,C.prev?C.prev.next=C.next:s=C.next)}}}}())}var W={addNestedSub:function(re){return P(),o.subscribe(re)},notifyNestedSubs:function(){o.notify()},handleChangeWrapper:C,isSubscribed:function(){return Boolean(t)},trySubscribe:P,tryUnsubscribe:function(){t&&(t(),t=void 0,o.clear(),o=p6)},getListeners:function(){return o}};return W}var _6="undefined"!=typeof window&&void 0!==window.document&&void 0!==window.document.createElement?Bl.useLayoutEffect:Bl.useEffect;const G8=function(n){var s=n.store,t=n.context,o=n.children,c=(0,Bl.useMemo)(function(){var D=h6(s);return{store:s,subscription:D}},[s]),g=(0,Bl.useMemo)(function(){return s.getState()},[s]);return _6(function(){var D=c.subscription;return D.onStateChange=D.notifyNestedSubs,D.trySubscribe(),g!==s.getState()&&D.notifyNestedSubs(),function(){D.tryUnsubscribe(),D.onStateChange=null}},[c,g]),Bl.createElement((t||d6).Provider,{value:c},o)};function rv(){return(rv=Object.assign?Object.assign.bind():function(n){for(var s=1;s<arguments.length;s++){var t=arguments[s];for(var o in t)Object.prototype.hasOwnProperty.call(t,o)&&(n[o]=t[o])}return n}).apply(this,arguments)}function cS(n,s){if(null==n)return{};var c,g,t={},o=Object.keys(n);for(g=0;g<o.length;g++)!(s.indexOf(c=o[g])>=0)&&(t[c]=n[c]);return t}var V8=i(62568),g6=i.n(V8),z8=i(56261),W8=["getDisplayName","methodName","renderCountProp","shouldHandleStateChanges","storeKey","withRef","forwardRef","context"],J8=["reactReduxForwardedRef"],Q8=[],X8=[null,null];function K8(n,s){return[s.payload,n[1]+1]}function m6(n,s,t){_6(function(){return n.apply(void 0,s)},t)}function q8(n,s,t,o,c,g,C){n.current=o,s.current=c,t.current=!1,g.current&&(g.current=null,C())}function eI(n,s,t,o,c,g,C,D,P,j){if(n){var W=!1,re=null,ie=function(){if(!W){var Re,ke,Le=s.getState();try{Re=o(Le,c.current)}catch(xe){ke=xe,re=xe}ke||(re=null),Re===g.current?C.current||P():(g.current=Re,D.current=Re,C.current=!0,j({type:"STORE_UPDATED",payload:{error:ke}}))}};return t.onStateChange=ie,t.trySubscribe(),ie(),function(){if(W=!0,t.tryUnsubscribe(),t.onStateChange=null,re)throw re}}}var tI=function(){return[null,0]};function nI(n,s){void 0===s&&(s={});var o=s.getDisplayName,c=void 0===o?function(wt){return"ConnectAdvanced("+wt+")"}:o,g=s.methodName,C=void 0===g?"connectAdvanced":g,D=s.renderCountProp,P=void 0===D?void 0:D,j=s.shouldHandleStateChanges,W=void 0===j||j,re=s.storeKey,ie=void 0===re?"store":re,Le=s.forwardRef,Re=void 0!==Le&&Le,ke=s.context,xe=void 0===ke?d6:ke,U=cS(s,W8),ht=xe;return function(It){var dn=It.displayName||It.name||"Component",Lt=c(dn),Dn=rv({},U,{getDisplayName:c,methodName:C,renderCountProp:P,shouldHandleStateChanges:W,storeKey:ie,displayName:Lt,wrappedComponentName:dn,WrappedComponent:It}),Mn=U.pure,ur=Mn?Bl.useMemo:function(Nn){return Nn()};function Pr(Nn){var $n=(0,Bl.useMemo)(function(){var Gr=Nn.reactReduxForwardedRef,xi=cS(Nn,J8);return[Nn.context,Gr,xi]},[Nn]),Qn=$n[0],Tn=$n[1],Yr=$n[2],ji=(0,Bl.useMemo)(function(){return Qn&&Qn.Consumer&&(0,z8.isContextConsumer)(Bl.createElement(Qn.Consumer,null))?Qn:ht},[Qn,ht]),ii=(0,Bl.useContext)(ji),Ui=Boolean(Nn.store)&&Boolean(Nn.store.getState)&&Boolean(Nn.store.dispatch),An=(Boolean(ii)&&Boolean(ii.store),Ui?Nn.store:ii.store),hn=(0,Bl.useMemo)(function(){return function(Nn){return n(Nn.dispatch,Dn)}(An)},[An]),qr=(0,Bl.useMemo)(function(){if(!W)return X8;var Gr=h6(An,Ui?null:ii.subscription),xi=Gr.notifyNestedSubs.bind(Gr);return[Gr,xi]},[An,Ui,ii]),Ri=qr[0],qi=qr[1],Zo=(0,Bl.useMemo)(function(){return Ui?ii:rv({},ii,{subscription:Ri})},[Ui,ii,Ri]),bo=(0,Bl.useReducer)(K8,Q8,tI),Ws=bo[0][0],wi=bo[1];if(Ws&&Ws.error)throw Ws.error;var lo=(0,Bl.useRef)(),go=(0,Bl.useRef)(Yr),Ge=(0,Bl.useRef)(),St=(0,Bl.useRef)(!1),Et=ur(function(){return Ge.current&&Yr===go.current?Ge.current:hn(An.getState(),Yr)},[An,Ws,Yr]);m6(q8,[go,lo,St,Yr,Et,Ge,qi]),m6(eI,[W,An,Ri,hn,go,lo,St,Ge,qi,wi],[An,Ri,hn]);var Bn=(0,Bl.useMemo)(function(){return Bl.createElement(It,rv({},Et,{ref:Tn}))},[Tn,It,Et]);return(0,Bl.useMemo)(function(){return W?Bl.createElement(ji.Provider,{value:Zo},Bn):Bn},[ji,Bn,Zo])}var xr=Mn?Bl.memo(Pr):Pr;if(xr.WrappedComponent=It,xr.displayName=Pr.displayName=Lt,Re){var fn=Bl.forwardRef(function($n,Qn){return Bl.createElement(xr,rv({},$n,{reactReduxForwardedRef:Qn}))});return fn.displayName=Lt,fn.WrappedComponent=It,g6()(fn,It)}return g6()(xr,It)}}function v6(n,s){return n===s?0!==n||0!==s||1/n==1/s:n!=n&&s!=s}function H3(n,s){if(v6(n,s))return!0;if("object"!=typeof n||null===n||"object"!=typeof s||null===s)return!1;var t=Object.keys(n),o=Object.keys(s);if(t.length!==o.length)return!1;for(var c=0;c<t.length;c++)if(!Object.prototype.hasOwnProperty.call(s,t[c])||!v6(n[t[c]],s[t[c]]))return!1;return!0}function U3(n){return function(t,o){var c=n(t,o);function g(){return c}return g.dependsOnOwnProps=!1,g}}function y6(n){return null!=n.dependsOnOwnProps?Boolean(n.dependsOnOwnProps):1!==n.length}function b6(n,s){return function(o,c){var C=function(P,j){return C.dependsOnOwnProps?C.mapToProps(P,j):C.mapToProps(P)};return C.dependsOnOwnProps=!0,C.mapToProps=function(P,j){C.mapToProps=n,C.dependsOnOwnProps=y6(n);var W=C(P,j);return"function"==typeof W&&(C.mapToProps=W,C.dependsOnOwnProps=y6(W),W=C(P,j)),W},C}}const aI=[function(n){return"function"==typeof n?b6(n):void 0},function(n){return n?void 0:U3(function(s){return{dispatch:s}})},function(n){return n&&"object"==typeof n?U3(function(s){return function(n,s){var t={},o=function(C){var D=n[C];"function"==typeof D&&(t[C]=function(){return s(D.apply(void 0,arguments))})};for(var c in n)o(c);return t}(n,s)}):void 0}],cI=[function(n){return"function"==typeof n?b6(n):void 0},function(n){return n?void 0:U3(function(){return{}})}];function dI(n,s,t){return rv({},t,n,s)}const _I=[function(n){return"function"==typeof n?function(n){return function(t,o){var P,g=o.pure,C=o.areMergedPropsEqual,D=!1;return function(W,re,ie){var ge=n(W,re,ie);return D?(!g||!C(ge,P))&&(P=ge):(D=!0,P=ge),P}}}(n):void 0},function(n){return n?void 0:function(){return dI}}];var gI=["initMapStateToProps","initMapDispatchToProps","initMergeProps"];function mI(n,s,t,o){return function(g,C){return t(n(g,C),s(o,C),C)}}function vI(n,s,t,o,c){var j,W,re,ie,ge,g=c.areStatesEqual,C=c.areOwnPropsEqual,D=c.areStatePropsEqual,P=!1;return function(pt,ht){return P?function(U,pt){var ht=!C(pt,W),wt=!g(U,j);return j=U,W=pt,ht&&wt?(re=n(j,W),s.dependsOnOwnProps&&(ie=s(o,W)),ge=t(re,ie,W)):ht?(n.dependsOnOwnProps&&(re=n(j,W)),s.dependsOnOwnProps&&(ie=s(o,W)),ge=t(re,ie,W)):wt?function(){var U=n(j,W),pt=!D(U,re);return re=U,pt&&(ge=t(re,ie,W)),ge}():ge}(pt,ht):function(U,pt){return re=n(j=U,W=pt),ie=s(o,W),ge=t(re,ie,W),P=!0,ge}(pt,ht)}}function yI(n,s){var t=s.initMapStateToProps,o=s.initMapDispatchToProps,c=s.initMergeProps,g=cS(s,gI),C=t(n,g),D=o(n,g),P=c(n,g);return(g.pure?vI:mI)(C,D,P,n,g)}var bI=["pure","areStatesEqual","areOwnPropsEqual","areStatePropsEqual","areMergedPropsEqual"];function B3(n,s,t){for(var o=s.length-1;o>=0;o--){var c=s[o](n);if(c)return c}return function(g,C){throw new Error("Invalid value of type "+typeof n+" for "+t+" argument when connecting component "+C.wrappedComponentName+".")}}function EI(n,s){return n===s}function TI(n){var s=void 0===n?{}:n,t=s.connectHOC,o=void 0===t?nI:t,c=s.mapStateToPropsFactories,g=void 0===c?cI:c,C=s.mapDispatchToPropsFactories,D=void 0===C?aI:C,P=s.mergePropsFactories,j=void 0===P?_I:P,W=s.selectorFactory,re=void 0===W?yI:W;return function(ge,_e,Le,Re){void 0===Re&&(Re={});var xe=Re.pure,U=void 0===xe||xe,pt=Re.areStatesEqual,ht=void 0===pt?EI:pt,wt=Re.areOwnPropsEqual,It=void 0===wt?H3:wt,dn=Re.areStatePropsEqual,Lt=void 0===dn?H3:dn,Dn=Re.areMergedPropsEqual,Mn=void 0===Dn?H3:Dn,$r=cS(Re,bI),ur=B3(ge,g,"mapStateToProps"),Pr=B3(_e,D,"mapDispatchToProps"),xr=B3(Le,j,"mergeProps");return o(re,rv({methodName:"connect",getDisplayName:function(Nn){return"Connect("+Nn+")"},shouldHandleStateChanges:Boolean(ge),initMapStateToProps:ur,initMapDispatchToProps:Pr,initMergeProps:xr,pure:U,areStatesEqual:ht,areOwnPropsEqual:It,areStatePropsEqual:Lt,areMergedPropsEqual:Mn},$r))}}const SI=TI();f6=c6.unstable_batchedUpdates;var AI=i(12482),OI=i.n(AI),wI=i(80290),xI=i.n(wI);function Y3(n,s){(null==s||s>n.length)&&(s=n.length);for(var t=0,o=new Array(s);t<s;t++)o[t]=n[t];return o}function LI(n){return function(n){if(Array.isArray(n))return Y3(n)}(n)||function(n){if("undefined"!=typeof Symbol&&null!=n[Symbol.iterator]||null!=n["@@iterator"])return Array.from(n)}(n)||function(n,s){if(n){if("string"==typeof n)return Y3(n,s);var t=Object.prototype.toString.call(n).slice(8,-1);if("Object"===t&&n.constructor&&(t=n.constructor.name),"Map"===t||"Set"===t)return Array.from(n);if("Arguments"===t||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t))return Y3(n,s)}}(n)||function(){throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}function Z3(n,s,t){return s in n?Object.defineProperty(n,s,{value:t,enumerable:!0,configurable:!0,writable:!0}):n[s]=t,n}function E6(n,s){var t=Object.keys(n);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(n);s&&(o=o.filter(function(c){return Object.getOwnPropertyDescriptor(n,c).enumerable})),t.push.apply(t,o)}return t}function vb(n){for(var s=1;s<arguments.length;s++){var t=null!=arguments[s]?arguments[s]:{};s%2?E6(Object(t),!0).forEach(function(o){Z3(n,o,t[o])}):Object.getOwnPropertyDescriptors?Object.defineProperties(n,Object.getOwnPropertyDescriptors(t)):E6(Object(t)).forEach(function(o){Object.defineProperty(n,o,Object.getOwnPropertyDescriptor(t,o))})}return n}var j3={};function kI(n){if(0===n.length||1===n.length)return n;var s=n.join(".");return j3[s]||(j3[s]=function(n){var s=n.length;return 0===s||1===s?n:2===s?[n[0],n[1],"".concat(n[0],".").concat(n[1]),"".concat(n[1],".").concat(n[0])]:3===s?[n[0],n[1],n[2],"".concat(n[0],".").concat(n[1]),"".concat(n[0],".").concat(n[2]),"".concat(n[1],".").concat(n[0]),"".concat(n[1],".").concat(n[2]),"".concat(n[2],".").concat(n[0]),"".concat(n[2],".").concat(n[1]),"".concat(n[0],".").concat(n[1],".").concat(n[2]),"".concat(n[0],".").concat(n[2],".").concat(n[1]),"".concat(n[1],".").concat(n[0],".").concat(n[2]),"".concat(n[1],".").concat(n[2],".").concat(n[0]),"".concat(n[2],".").concat(n[0],".").concat(n[1]),"".concat(n[2],".").concat(n[1],".").concat(n[0])]:s>=4?[n[0],n[1],n[2],n[3],"".concat(n[0],".").concat(n[1]),"".concat(n[0],".").concat(n[2]),"".concat(n[0],".").concat(n[3]),"".concat(n[1],".").concat(n[0]),"".concat(n[1],".").concat(n[2]),"".concat(n[1],".").concat(n[3]),"".concat(n[2],".").concat(n[0]),"".concat(n[2],".").concat(n[1]),"".concat(n[2],".").concat(n[3]),"".concat(n[3],".").concat(n[0]),"".concat(n[3],".").concat(n[1]),"".concat(n[3],".").concat(n[2]),"".concat(n[0],".").concat(n[1],".").concat(n[2]),"".concat(n[0],".").concat(n[1],".").concat(n[3]),"".concat(n[0],".").concat(n[2],".").concat(n[1]),"".concat(n[0],".").concat(n[2],".").concat(n[3]),"".concat(n[0],".").concat(n[3],".").concat(n[1]),"".concat(n[0],".").concat(n[3],".").concat(n[2]),"".concat(n[1],".").concat(n[0],".").concat(n[2]),"".concat(n[1],".").concat(n[0],".").concat(n[3]),"".concat(n[1],".").concat(n[2],".").concat(n[0]),"".concat(n[1],".").concat(n[2],".").concat(n[3]),"".concat(n[1],".").concat(n[3],".").concat(n[0]),"".concat(n[1],".").concat(n[3],".").concat(n[2]),"".concat(n[2],".").concat(n[0],".").concat(n[1]),"".concat(n[2],".").concat(n[0],".").concat(n[3]),"".concat(n[2],".").concat(n[1],".").concat(n[0]),"".concat(n[2],".").concat(n[1],".").concat(n[3]),"".concat(n[2],".").concat(n[3],".").concat(n[0]),"".concat(n[2],".").concat(n[3],".").concat(n[1]),"".concat(n[3],".").concat(n[0],".").concat(n[1]),"".concat(n[3],".").concat(n[0],".").concat(n[2]),"".concat(n[3],".").concat(n[1],".").concat(n[0]),"".concat(n[3],".").concat(n[1],".").concat(n[2]),"".concat(n[3],".").concat(n[2],".").concat(n[0]),"".concat(n[3],".").concat(n[2],".").concat(n[1]),"".concat(n[0],".").concat(n[1],".").concat(n[2],".").concat(n[3]),"".concat(n[0],".").concat(n[1],".").concat(n[3],".").concat(n[2]),"".concat(n[0],".").concat(n[2],".").concat(n[1],".").concat(n[3]),"".concat(n[0],".").concat(n[2],".").concat(n[3],".").concat(n[1]),"".concat(n[0],".").concat(n[3],".").concat(n[1],".").concat(n[2]),"".concat(n[0],".").concat(n[3],".").concat(n[2],".").concat(n[1]),"".concat(n[1],".").concat(n[0],".").concat(n[2],".").concat(n[3]),"".concat(n[1],".").concat(n[0],".").concat(n[3],".").concat(n[2]),"".concat(n[1],".").concat(n[2],".").concat(n[0],".").concat(n[3]),"".concat(n[1],".").concat(n[2],".").concat(n[3],".").concat(n[0]),"".concat(n[1],".").concat(n[3],".").concat(n[0],".").concat(n[2]),"".concat(n[1],".").concat(n[3],".").concat(n[2],".").concat(n[0]),"".concat(n[2],".").concat(n[0],".").concat(n[1],".").concat(n[3]),"".concat(n[2],".").concat(n[0],".").concat(n[3],".").concat(n[1]),"".concat(n[2],".").concat(n[1],".").concat(n[0],".").concat(n[3]),"".concat(n[2],".").concat(n[1],".").concat(n[3],".").concat(n[0]),"".concat(n[2],".").concat(n[3],".").concat(n[0],".").concat(n[1]),"".concat(n[2],".").concat(n[3],".").concat(n[1],".").concat(n[0]),"".concat(n[3],".").concat(n[0],".").concat(n[1],".").concat(n[2]),"".concat(n[3],".").concat(n[0],".").concat(n[2],".").concat(n[1]),"".concat(n[3],".").concat(n[1],".").concat(n[0],".").concat(n[2]),"".concat(n[3],".").concat(n[1],".").concat(n[2],".").concat(n[0]),"".concat(n[3],".").concat(n[2],".").concat(n[0],".").concat(n[1]),"".concat(n[3],".").concat(n[2],".").concat(n[1],".").concat(n[0])]:void 0}(n)),j3[s]}function $I(n){var s=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},t=arguments.length>2?arguments[2]:void 0,o=n.filter(function(g){return"token"!==g}),c=kI(o);return c.reduce(function(g,C){return vb(vb({},g),t[C])},s)}function T6(n){return n.join(" ")}function S6(n){var s=n.node,t=n.stylesheet,o=n.style,c=void 0===o?{}:o,g=n.useInlineStyles,C=n.key,D=s.properties,j=s.tagName;if("text"===s.type)return s.value;if(j){var ie,re=function(n,s){var t=0;return function(o){return t+=1,o.map(function(c,g){return S6({node:c,stylesheet:n,useInlineStyles:s,key:"code-segment-".concat(t,"-").concat(g)})})}}(t,g);if(g){var ge=Object.keys(t).reduce(function(ke,xe){return xe.split(".").forEach(function(U){ke.includes(U)||ke.push(U)}),ke},[]),_e=D.className&&D.className.includes("token")?["token"]:[],Le=D.className&&_e.concat(D.className.filter(function(ke){return!ge.includes(ke)}));ie=vb(vb({},D),{},{className:T6(Le)||void 0,style:$I(D.className,Object.assign({},D.style,c),t)})}else ie=vb(vb({},D),{},{className:T6(D.className)});var Re=re(s.children);return Bl.createElement(j,rv({key:C},ie),Re)}}var BI=["language","children","style","customStyle","codeTagProps","useInlineStyles","showLineNumbers","showInlineLineNumbers","startingLineNumber","lineNumberContainerStyle","lineNumberStyle","wrapLines","wrapLongLines","lineProps","renderer","PreTag","CodeTag","code","astGenerator"];function C6(n,s){var t=Object.keys(n);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(n);s&&(o=o.filter(function(c){return Object.getOwnPropertyDescriptor(n,c).enumerable})),t.push.apply(t,o)}return t}function ym(n){for(var s=1;s<arguments.length;s++){var t=null!=arguments[s]?arguments[s]:{};s%2?C6(Object(t),!0).forEach(function(o){Z3(n,o,t[o])}):Object.getOwnPropertyDescriptors?Object.defineProperties(n,Object.getOwnPropertyDescriptors(t)):C6(Object(t)).forEach(function(o){Object.defineProperty(n,o,Object.getOwnPropertyDescriptor(t,o))})}return n}var YI=/\n/g;function GI(n){var s=n.codeString,o=n.containerStyle,g=n.numberStyle,C=void 0===g?{}:g,D=n.startingLineNumber;return Bl.createElement("code",{style:Object.assign({},n.codeStyle,void 0===o?{float:"left",paddingRight:"10px"}:o)},function(n){var t=n.startingLineNumber,o=n.style;return n.lines.map(function(c,g){var C=g+t;return Bl.createElement("span",{key:"line-".concat(g),className:"react-syntax-highlighter-line-number",style:"function"==typeof o?o(C):o},"".concat(C,"\n"))})}({lines:s.replace(/\n$/,"").split("\n"),style:C,startingLineNumber:D}))}function VI(n){return"".concat(n.toString().length,".25em")}function M6(n,s){return{type:"element",tagName:"span",properties:{key:"line-number--".concat(n),className:["comment","linenumber","react-syntax-highlighter-line-number"],style:s},children:[{type:"text",value:n}]}}function A6(n,s,t){var o={display:"inline-block",minWidth:VI(t),paddingRight:"1em",textAlign:"right",userSelect:"none"},c="function"==typeof n?n(s):n;return ym(ym({},o),c)}function bA(n){var s=n.children,t=n.lineNumber,o=n.lineNumberStyle,c=n.largestLineNumber,g=n.showInlineLineNumbers,C=n.lineProps,D=void 0===C?{}:C,P=n.className,j=void 0===P?[]:P,W=n.showLineNumbers,re=n.wrapLongLines,ie="function"==typeof D?D(t):D;if(ie.className=j,t&&g){var ge=A6(o,t,c);s.unshift(M6(t,ge))}return re&W&&(ie.style=ym(ym({},ie.style),{},{display:"flex"})),{type:"element",tagName:"span",properties:ie,children:s}}function O6(n){for(var s=arguments.length>1&&void 0!==arguments[1]?arguments[1]:[],t=arguments.length>2&&void 0!==arguments[2]?arguments[2]:[],o=0;o<n.length;o++){var c=n[o];if("text"===c.type)t.push(bA({children:[c],className:LI(new Set(s))}));else if(c.children){var g=s.concat(c.properties.className);O6(c.children,g).forEach(function(C){return t.push(C)})}}return t}function zI(n,s,t,o,c,g,C,D,P){var j,W=O6(n.value),re=[],ie=-1,ge=0;function _e(ht,wt){var It=arguments.length>2&&void 0!==arguments[2]?arguments[2]:[];return bA({children:ht,lineNumber:wt,lineNumberStyle:D,largestLineNumber:C,showInlineLineNumbers:c,lineProps:t,className:It,showLineNumbers:o,wrapLongLines:P})}function Le(ht,wt){if(o&&wt&&c){var It=A6(D,wt,C);ht.unshift(M6(wt,It))}return ht}function Re(ht,wt){var It=arguments.length>2&&void 0!==arguments[2]?arguments[2]:[];return s||It.length>0?_e(ht,wt,It):Le(ht,wt)}for(var ke=function(){var wt=W[ge],It=wt.children[0].value;if(function(n){return n.match(YI)}(It)){var Lt=It.split("\n");Lt.forEach(function(Dn,Mn){var $r=o&&re.length+g,ur={type:"text",value:"".concat(Dn,"\n")};if(0===Mn){var xr=Re(W.slice(ie+1,ge).concat(bA({children:[ur],className:wt.properties.className})),$r);re.push(xr)}else if(Mn===Lt.length-1){var fn=W[ge+1]&&W[ge+1].children&&W[ge+1].children[0],Nn={type:"text",value:"".concat(Dn)};if(fn){var $n=bA({children:[Nn],className:wt.properties.className});W.splice(ge+1,0,$n)}else{var Tn=Re([Nn],$r,wt.properties.className);re.push(Tn)}}else{var ji=Re([ur],$r,wt.properties.className);re.push(ji)}}),ie=ge}ge++};ge<W.length;)ke();if(ie!==W.length-1){var xe=W.slice(ie+1,W.length);if(xe&&xe.length){var pt=Re(xe,o&&re.length+g);re.push(pt)}}return s?re:(j=[]).concat.apply(j,re)}function WI(n){var t=n.stylesheet,o=n.useInlineStyles;return n.rows.map(function(c,g){return S6({node:c,stylesheet:t,useInlineStyles:o,key:"code-segement".concat(g)})})}function w6(n){return n&&void 0!==n.highlightAuto}var x6=i(74538),D6=function(n,s){return function(o){var c=o.language,g=o.children,C=o.style,D=void 0===C?s:C,P=o.customStyle,j=void 0===P?{}:P,W=o.codeTagProps,re=void 0===W?{className:c?"language-".concat(c):void 0,style:ym(ym({},D['code[class*="language-"]']),D['code[class*="language-'.concat(c,'"]')])}:W,ie=o.useInlineStyles,ge=void 0===ie||ie,_e=o.showLineNumbers,Le=void 0!==_e&&_e,Re=o.showInlineLineNumbers,ke=void 0===Re||Re,xe=o.startingLineNumber,U=void 0===xe?1:xe,pt=o.lineNumberContainerStyle,ht=o.lineNumberStyle,wt=void 0===ht?{}:ht,It=o.wrapLines,dn=o.wrapLongLines,Lt=void 0!==dn&&dn,Dn=o.lineProps,Mn=void 0===Dn?{}:Dn,$r=o.renderer,ur=o.PreTag,Pr=void 0===ur?"pre":ur,xr=o.CodeTag,fn=void 0===xr?"code":xr,Nn=o.code,$n=void 0===Nn?(Array.isArray(g)?g[0]:g)||"":Nn,Qn=o.astGenerator,Tn=function(n,s){if(null==n)return{};var o,c,t=cS(n,s);if(Object.getOwnPropertySymbols){var g=Object.getOwnPropertySymbols(n);for(c=0;c<g.length;c++)!(s.indexOf(o=g[c])>=0)&&(!Object.prototype.propertyIsEnumerable.call(n,o)||(t[o]=n[o]))}return t}(o,BI);Qn=Qn||n;var Yr=Le?Bl.createElement(GI,{containerStyle:pt,codeStyle:re.style||{},numberStyle:wt,startingLineNumber:U,codeString:$n}):null,ji=D.hljs||D['pre[class*="language-"]']||{backgroundColor:"#fff"},ii=w6(Qn)?"hljs":"prismjs",Ui=Object.assign({},Tn,ge?{style:Object.assign({},ji,j)}:{className:Tn.className?"".concat(ii," ").concat(Tn.className):ii,style:Object.assign({},j)});if(re.style=ym(ym({},re.style),{},Lt?{whiteSpace:"pre-wrap"}:{whiteSpace:"pre"}),!Qn)return Bl.createElement(Pr,Ui,Yr,Bl.createElement(fn,re,$n));(void 0===It&&$r||Lt)&&(It=!0),$r=$r||WI;var Jr=[{type:"text",value:$n}],An=function(n){var s=n.astGenerator,t=n.language,o=n.code,c=n.defaultCodeValue;if(w6(s)){var g=function(n,s){return-1!==n.listLanguages().indexOf(s)}(s,t);return"text"===t?{value:c,language:"text"}:g?s.highlight(t,o):s.highlightAuto(o)}try{return t&&"text"!==t?{value:s.highlight(o,t)}:{value:c}}catch(C){return{value:c}}}({astGenerator:Qn,language:c,code:$n,defaultCodeValue:Jr});null===An.language&&(An.value=Jr);var qr=zI(An,It,Mn,Le,ke,U,An.value.length+U,wt,Lt);return Bl.createElement(Pr,Ui,Bl.createElement(fn,re,!ke&&Yr,$r({rows:qr,stylesheet:D,useInlineStyles:ge})))}}(x6,{});D6.registerLanguage=x6.registerLanguage;const XI=D6;var KI=i(36147);const e4=i.n(KI)();var t4=i(92229);const r4=i.n(t4)();var i4=i(13546);const s4=i.n(i4)();var a4=i(4357);const u4=i.n(a4)();var c4=i(44776);const f4=i.n(c4)();var p4=i(28390);const _4=i.n(p4)();var g4=i(78932);const v4=i.n(g4)(),y4={hljs:{display:"block",overflowX:"auto",padding:"0.5em",background:"#333",color:"white"},"hljs-name":{fontWeight:"bold"},"hljs-strong":{fontWeight:"bold"},"hljs-code":{fontStyle:"italic",color:"#888"},"hljs-emphasis":{fontStyle:"italic"},"hljs-tag":{color:"#62c8f3"},"hljs-variable":{color:"#ade5fc"},"hljs-template-variable":{color:"#ade5fc"},"hljs-selector-id":{color:"#ade5fc"},"hljs-selector-class":{color:"#ade5fc"},"hljs-string":{color:"#a2fca2"},"hljs-bullet":{color:"#d36363"},"hljs-type":{color:"#ffa"},"hljs-title":{color:"#ffa"},"hljs-section":{color:"#ffa"},"hljs-attribute":{color:"#ffa"},"hljs-quote":{color:"#ffa"},"hljs-built_in":{color:"#ffa"},"hljs-builtin-name":{color:"#ffa"},"hljs-number":{color:"#d36363"},"hljs-symbol":{color:"#d36363"},"hljs-keyword":{color:"#fcc28c"},"hljs-selector-tag":{color:"#fcc28c"},"hljs-literal":{color:"#fcc28c"},"hljs-comment":{color:"#888"},"hljs-deletion":{color:"#333",backgroundColor:"#fc9b9b"},"hljs-regexp":{color:"#c6b4f0"},"hljs-link":{color:"#c6b4f0"},"hljs-meta":{color:"#fc9b9b"},"hljs-addition":{backgroundColor:"#a2fca2",color:"#333"}},b4={hljs:{display:"block",overflowX:"auto",padding:"0.5em",background:"#222",color:"#aaa"},"hljs-subst":{color:"#aaa"},"hljs-section":{color:"#fff",fontWeight:"bold"},"hljs-comment":{color:"#444"},"hljs-quote":{color:"#444"},"hljs-meta":{color:"#444"},"hljs-string":{color:"#ffcc33"},"hljs-symbol":{color:"#ffcc33"},"hljs-bullet":{color:"#ffcc33"},"hljs-regexp":{color:"#ffcc33"},"hljs-number":{color:"#00cc66"},"hljs-addition":{color:"#00cc66"},"hljs-built_in":{color:"#32aaee"},"hljs-builtin-name":{color:"#32aaee"},"hljs-literal":{color:"#32aaee"},"hljs-type":{color:"#32aaee"},"hljs-template-variable":{color:"#32aaee"},"hljs-attribute":{color:"#32aaee"},"hljs-link":{color:"#32aaee"},"hljs-keyword":{color:"#6644aa"},"hljs-selector-tag":{color:"#6644aa"},"hljs-name":{color:"#6644aa"},"hljs-selector-id":{color:"#6644aa"},"hljs-selector-class":{color:"#6644aa"},"hljs-title":{color:"#bb1166"},"hljs-variable":{color:"#bb1166"},"hljs-deletion":{color:"#bb1166"},"hljs-template-tag":{color:"#bb1166"},"hljs-doctag":{fontWeight:"bold"},"hljs-strong":{fontWeight:"bold"},"hljs-emphasis":{fontStyle:"italic"}},E4={hljs:{display:"block",overflowX:"auto",padding:"0.5em",background:"#272822",color:"#ddd"},"hljs-tag":{color:"#f92672"},"hljs-keyword":{color:"#f92672",fontWeight:"bold"},"hljs-selector-tag":{color:"#f92672",fontWeight:"bold"},"hljs-literal":{color:"#f92672",fontWeight:"bold"},"hljs-strong":{color:"#f92672"},"hljs-name":{color:"#f92672"},"hljs-code":{color:"#66d9ef"},"hljs-class .hljs-title":{color:"white"},"hljs-attribute":{color:"#bf79db"},"hljs-symbol":{color:"#bf79db"},"hljs-regexp":{color:"#bf79db"},"hljs-link":{color:"#bf79db"},"hljs-string":{color:"#a6e22e"},"hljs-bullet":{color:"#a6e22e"},"hljs-subst":{color:"#a6e22e"},"hljs-title":{color:"#a6e22e",fontWeight:"bold"},"hljs-section":{color:"#a6e22e",fontWeight:"bold"},"hljs-emphasis":{color:"#a6e22e"},"hljs-type":{color:"#a6e22e",fontWeight:"bold"},"hljs-built_in":{color:"#a6e22e"},"hljs-builtin-name":{color:"#a6e22e"},"hljs-selector-attr":{color:"#a6e22e"},"hljs-selector-pseudo":{color:"#a6e22e"},"hljs-addition":{color:"#a6e22e"},"hljs-variable":{color:"#a6e22e"},"hljs-template-tag":{color:"#a6e22e"},"hljs-template-variable":{color:"#a6e22e"},"hljs-comment":{color:"#75715e"},"hljs-quote":{color:"#75715e"},"hljs-deletion":{color:"#75715e"},"hljs-meta":{color:"#75715e"},"hljs-doctag":{fontWeight:"bold"},"hljs-selector-id":{fontWeight:"bold"}},T4={hljs:{display:"block",overflowX:"auto",padding:"0.5em",background:"#2E3440",color:"#D8DEE9"},"hljs-subst":{color:"#D8DEE9"},"hljs-selector-tag":{color:"#81A1C1"},"hljs-selector-id":{color:"#8FBCBB",fontWeight:"bold"},"hljs-selector-class":{color:"#8FBCBB"},"hljs-selector-attr":{color:"#8FBCBB"},"hljs-selector-pseudo":{color:"#88C0D0"},"hljs-addition":{backgroundColor:"rgba(163, 190, 140, 0.5)"},"hljs-deletion":{backgroundColor:"rgba(191, 97, 106, 0.5)"},"hljs-built_in":{color:"#8FBCBB"},"hljs-type":{color:"#8FBCBB"},"hljs-class":{color:"#8FBCBB"},"hljs-function":{color:"#88C0D0"},"hljs-function > .hljs-title":{color:"#88C0D0"},"hljs-keyword":{color:"#81A1C1"},"hljs-literal":{color:"#81A1C1"},"hljs-symbol":{color:"#81A1C1"},"hljs-number":{color:"#B48EAD"},"hljs-regexp":{color:"#EBCB8B"},"hljs-string":{color:"#A3BE8C"},"hljs-title":{color:"#8FBCBB"},"hljs-params":{color:"#D8DEE9"},"hljs-bullet":{color:"#81A1C1"},"hljs-code":{color:"#8FBCBB"},"hljs-emphasis":{fontStyle:"italic"},"hljs-formula":{color:"#8FBCBB"},"hljs-strong":{fontWeight:"bold"},"hljs-link:hover":{textDecoration:"underline"},"hljs-quote":{color:"#4C566A"},"hljs-comment":{color:"#4C566A"},"hljs-doctag":{color:"#8FBCBB"},"hljs-meta":{color:"#5E81AC"},"hljs-meta-keyword":{color:"#5E81AC"},"hljs-meta-string":{color:"#A3BE8C"},"hljs-attr":{color:"#8FBCBB"},"hljs-attribute":{color:"#D8DEE9"},"hljs-builtin-name":{color:"#81A1C1"},"hljs-name":{color:"#81A1C1"},"hljs-section":{color:"#88C0D0"},"hljs-tag":{color:"#81A1C1"},"hljs-variable":{color:"#D8DEE9"},"hljs-template-variable":{color:"#D8DEE9"},"hljs-template-tag":{color:"#5E81AC"},"abnf .hljs-attribute":{color:"#88C0D0"},"abnf .hljs-symbol":{color:"#EBCB8B"},"apache .hljs-attribute":{color:"#88C0D0"},"apache .hljs-section":{color:"#81A1C1"},"arduino .hljs-built_in":{color:"#88C0D0"},"aspectj .hljs-meta":{color:"#D08770"},"aspectj > .hljs-title":{color:"#88C0D0"},"bnf .hljs-attribute":{color:"#8FBCBB"},"clojure .hljs-name":{color:"#88C0D0"},"clojure .hljs-symbol":{color:"#EBCB8B"},"coq .hljs-built_in":{color:"#88C0D0"},"cpp .hljs-meta-string":{color:"#8FBCBB"},"css .hljs-built_in":{color:"#88C0D0"},"css .hljs-keyword":{color:"#D08770"},"diff .hljs-meta":{color:"#8FBCBB"},"ebnf .hljs-attribute":{color:"#8FBCBB"},"glsl .hljs-built_in":{color:"#88C0D0"},"groovy .hljs-meta:not(:first-child)":{color:"#D08770"},"haxe .hljs-meta":{color:"#D08770"},"java .hljs-meta":{color:"#D08770"},"ldif .hljs-attribute":{color:"#8FBCBB"},"lisp .hljs-name":{color:"#88C0D0"},"lua .hljs-built_in":{color:"#88C0D0"},"moonscript .hljs-built_in":{color:"#88C0D0"},"nginx .hljs-attribute":{color:"#88C0D0"},"nginx .hljs-section":{color:"#5E81AC"},"pf .hljs-built_in":{color:"#88C0D0"},"processing .hljs-built_in":{color:"#88C0D0"},"scss .hljs-keyword":{color:"#81A1C1"},"stylus .hljs-keyword":{color:"#81A1C1"},"swift .hljs-meta":{color:"#D08770"},"vim .hljs-built_in":{color:"#88C0D0",fontStyle:"italic"},"yaml .hljs-meta":{color:"#D08770"}},S4={hljs:{display:"block",overflowX:"auto",padding:"0.5em",background:"#282b2e",color:"#e0e2e4"},"hljs-keyword":{color:"#93c763",fontWeight:"bold"},"hljs-selector-tag":{color:"#93c763",fontWeight:"bold"},"hljs-literal":{color:"#93c763",fontWeight:"bold"},"hljs-selector-id":{color:"#93c763"},"hljs-number":{color:"#ffcd22"},"hljs-attribute":{color:"#668bb0"},"hljs-code":{color:"white"},"hljs-class .hljs-title":{color:"white"},"hljs-section":{color:"white",fontWeight:"bold"},"hljs-regexp":{color:"#d39745"},"hljs-link":{color:"#d39745"},"hljs-meta":{color:"#557182"},"hljs-tag":{color:"#8cbbad"},"hljs-name":{color:"#8cbbad",fontWeight:"bold"},"hljs-bullet":{color:"#8cbbad"},"hljs-subst":{color:"#8cbbad"},"hljs-emphasis":{color:"#8cbbad"},"hljs-type":{color:"#8cbbad",fontWeight:"bold"},"hljs-built_in":{color:"#8cbbad"},"hljs-selector-attr":{color:"#8cbbad"},"hljs-selector-pseudo":{color:"#8cbbad"},"hljs-addition":{color:"#8cbbad"},"hljs-variable":{color:"#8cbbad"},"hljs-template-tag":{color:"#8cbbad"},"hljs-template-variable":{color:"#8cbbad"},"hljs-string":{color:"#ec7600"},"hljs-symbol":{color:"#ec7600"},"hljs-comment":{color:"#818e96"},"hljs-quote":{color:"#818e96"},"hljs-deletion":{color:"#818e96"},"hljs-selector-class":{color:"#A082BD"},"hljs-doctag":{fontWeight:"bold"},"hljs-title":{fontWeight:"bold"},"hljs-strong":{fontWeight:"bold"}},C4={"hljs-comment":{color:"#969896"},"hljs-quote":{color:"#969896"},"hljs-variable":{color:"#cc6666"},"hljs-template-variable":{color:"#cc6666"},"hljs-tag":{color:"#cc6666"},"hljs-name":{color:"#cc6666"},"hljs-selector-id":{color:"#cc6666"},"hljs-selector-class":{color:"#cc6666"},"hljs-regexp":{color:"#cc6666"},"hljs-deletion":{color:"#cc6666"},"hljs-number":{color:"#de935f"},"hljs-built_in":{color:"#de935f"},"hljs-builtin-name":{color:"#de935f"},"hljs-literal":{color:"#de935f"},"hljs-type":{color:"#de935f"},"hljs-params":{color:"#de935f"},"hljs-meta":{color:"#de935f"},"hljs-link":{color:"#de935f"},"hljs-attribute":{color:"#f0c674"},"hljs-string":{color:"#b5bd68"},"hljs-symbol":{color:"#b5bd68"},"hljs-bullet":{color:"#b5bd68"},"hljs-addition":{color:"#b5bd68"},"hljs-title":{color:"#81a2be"},"hljs-section":{color:"#81a2be"},"hljs-keyword":{color:"#b294bb"},"hljs-selector-tag":{color:"#b294bb"},hljs:{display:"block",overflowX:"auto",background:"#1d1f21",color:"#c5c8c6",padding:"0.5em"},"hljs-emphasis":{fontStyle:"italic"},"hljs-strong":{fontWeight:"bold"}};var M4=i(43155),A4=i(35037),O4=i.n(A4),w4=i(93890),x4=i.n(w4),D4=i(98990),R4=i.n(D4),N4=i(52190),P4=i.n(N4),I4=i(71166),L4=i.n(I4),F4=i(52243),k4=i.n(F4),R6=i(15805),yb=i(68645),G3=i(62734),N6=i(76593);function O0(n){var s;return(O0=G3?yb(s=N6).call(s):function(o){return o.__proto__||N6(o)})(n)}function $4(n,s){for(;!Object.prototype.hasOwnProperty.call(n,s)&&null!==(n=O0(n)););return n}function EA(){var n;return(EA="undefined"!=typeof Reflect&&R6?yb(n=R6).call(n):function(t,o,c){var g=$4(t,o);if(g){var C=WT(g,o);return C.get?C.get.call(arguments.length<3?t:c):C.value}}).apply(this,arguments)}var P6=i(54839),I6=i(73921);function dS(n,s){var t;return(dS=G3?yb(t=G3).call(t):function(c,g){return c.__proto__=g,c})(n,s)}var fS=i(69244);function L6(){if("undefined"==typeof Reflect||!fS||fS.sham)return!1;if("function"==typeof Proxy)return!0;try{return Boolean.prototype.valueOf.call(fS(Boolean,[],function(){})),!0}catch(n){return!1}}function TA(n,s,t){var o;return(TA=L6()?yb(o=fS).call(o):function(g,C,D){var P=[null];P.push.apply(P,C);var W=new(yb(Function).apply(g,P));return D&&dS(W,D.prototype),W}).apply(null,arguments)}function V3(n){var s="function"==typeof P6?new P6:void 0;return(V3=function(o){if(null===o||!function(n){var s;return-1!==F3(s=Function.toString.call(n)).call(s,"[native code]")}(o))return o;if("function"!=typeof o)throw new TypeError("Super expression must either be null or a function");if(void 0!==s){if(s.has(o))return s.get(o);s.set(o,c)}function c(){return TA(o,arguments,O0(this).constructor)}return c.prototype=I6(o.prototype,{constructor:{value:c,enumerable:!1,writable:!0,configurable:!0}}),dS(c,o)})(n)}var U4=i(45163),B4=i.n(U4),Y4=i(58711),Z4=i.n(Y4),j4=i(15886),G4=i.n(j4),V4=i(56166),z4=i.n(V4),W4=i(84901),J4=i.n(W4),Q4=i(71851),X4=i.n(Q4),K4=i(91465),q4=i.n(K4),e5=i(35431),t5=i.n(e5),n5=i(53625),r5=i.n(n5),i5=i(31978),o5=i.n(i5),s5=i(40984),a5=i.n(s5),l5=i(54082),u5=i.n(l5),c5=i(69605),d5=i.n(c5),f5=i(87513),p5=i.n(f5),h5=i(69253),_5=i.n(h5);function F6(n){if(void 0===n)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return n}function g5(n,s){if(s&&("object"===vc(s)||"function"==typeof s))return s;if(void 0!==s)throw new TypeError("Derived constructors may only return object or undefined");return F6(n)}function m5(n){var s=L6();return function(){var c,o=O0(n);if(s){var g=O0(this).constructor;c=fS(o,arguments,g)}else c=o.apply(this,arguments);return g5(this,c)}}var k6=i(95343);function z3(){var n;return(z3=k6?yb(n=k6).call(n):function(s){for(var t=1;t<arguments.length;t++){var o=arguments[t];for(var c in o)Object.prototype.hasOwnProperty.call(o,c)&&(s[c]=o[c])}return s}).apply(this,arguments)}function v5(n,s){if("function"!=typeof s&&null!==s)throw new TypeError("Super expression must either be null or a function");n.prototype=I6(s&&s.prototype,{constructor:{value:n,writable:!0,configurable:!0}}),e1(n,"prototype",{writable:!1}),s&&dS(n,s)}var y5=i(96434),b5=i.t(y5,2),E5=i(82885),T5=i.n(E5),S5=i(12658),C5=i.t(S5,2),M5=i(55836),A5=i.n(M5),O5=i(97425),w5=i.n(O5),x5=i(76874),D5=i.n(x5),R5=i(43409),N5=i(14395),P5=i.n(N5);function $6(n,s){var t=Object.keys(n);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(n);s&&(o=o.filter(function(c){return Object.getOwnPropertyDescriptor(n,c).enumerable})),t.push.apply(t,o)}return t}function H6(n){for(var s=1;s<arguments.length;s++){var t=null!=arguments[s]?arguments[s]:{};s%2?$6(Object(t),!0).forEach(function(o){Z3(n,o,t[o])}):Object.getOwnPropertyDescriptors?Object.defineProperties(n,Object.getOwnPropertyDescriptors(t)):$6(Object(t)).forEach(function(o){Object.defineProperty(n,o,Object.getOwnPropertyDescriptor(t,o))})}return n}function Pp(n){return"Minified Redux error #"+n+"; visit https://redux.js.org/Errors?code="+n+" for the full message or use the non-minified dev environment for full errors. "}var SA,U6="function"==typeof Symbol&&Symbol.observable||"@@observable",W3=function(){return Math.random().toString(36).substring(7).split("").join(".")},bb={INIT:"@@redux/INIT"+W3(),REPLACE:"@@redux/REPLACE"+W3(),PROBE_UNKNOWN_ACTION:function(){return"@@redux/PROBE_UNKNOWN_ACTION"+W3()}};function B6(n){if("object"!=typeof n||null===n)return!1;for(var s=n;null!==Object.getPrototypeOf(s);)s=Object.getPrototypeOf(s);return Object.getPrototypeOf(n)===s}function Y6(n,s,t){var o;if("function"==typeof s&&"function"==typeof t||"function"==typeof t&&"function"==typeof arguments[3])throw new Error(Pp(0));if("function"==typeof s&&void 0===t&&(t=s,s=void 0),void 0!==t){if("function"!=typeof t)throw new Error(Pp(1));return t(Y6)(n,s)}if("function"!=typeof n)throw new Error(Pp(2));var c=n,g=s,C=[],D=C,P=!1;function j(){D===C&&(D=C.slice())}function W(){if(P)throw new Error(Pp(3));return g}function re(Le){if("function"!=typeof Le)throw new Error(Pp(4));if(P)throw new Error(Pp(5));var Re=!0;return j(),D.push(Le),function(){if(Re){if(P)throw new Error(Pp(6));Re=!1,j();var xe=D.indexOf(Le);D.splice(xe,1),C=null}}}function ie(Le){if(!B6(Le))throw new Error(Pp(7));if(void 0===Le.type)throw new Error(Pp(8));if(P)throw new Error(Pp(9));try{P=!0,g=c(g,Le)}finally{P=!1}for(var Re=C=D,ke=0;ke<Re.length;ke++)(0,Re[ke])();return Le}function ge(Le){if("function"!=typeof Le)throw new Error(Pp(10));c=Le,ie({type:bb.REPLACE})}function _e(){var Le,Re=re;return(Le={subscribe:function(xe){if("object"!=typeof xe||null===xe)throw new Error(Pp(11));function U(){xe.next&&xe.next(W())}return U(),{unsubscribe:Re(U)}}})[U6]=function(){return this},Le}return ie({type:bb.INIT}),(o={dispatch:ie,subscribe:re,getState:W,replaceReducer:ge})[U6]=_e,o}function Z6(n,s){return function(){return s(n.apply(this,arguments))}}function H5(n,s){if("function"==typeof n)return Z6(n,s);if("object"!=typeof n||null===n)throw new Error(Pp(16));var t={};for(var o in n){var c=n[o];"function"==typeof c&&(t[o]=Z6(c,s))}return t}function j6(){for(var n=arguments.length,s=new Array(n),t=0;t<n;t++)s[t]=arguments[t];return 0===s.length?function(o){return o}:1===s.length?s[0]:s.reduce(function(o,c){return function(){return o(c.apply(void 0,arguments))}})}function U5(){for(var n=arguments.length,s=new Array(n),t=0;t<n;t++)s[t]=arguments[t];return function(o){return function(){var c=o.apply(void 0,arguments),g=function(){throw new Error(Pp(15))},C={getState:c.getState,dispatch:function(){return g.apply(void 0,arguments)}},D=s.map(function(P){return P(C)});return g=j6.apply(void 0,D)(c.dispatch),H6(H6({},c),{},{dispatch:g})}}}function G6(n){return(SA=SA||document.createElement("textarea")).innerHTML="&"+n+";",SA.value}var Z5=Object.prototype.hasOwnProperty;function J3(n){var s=[].slice.call(arguments,1);return s.forEach(function(t){if(t){if("object"!=typeof t)throw new TypeError(t+"must be object");Object.keys(t).forEach(function(o){n[o]=t[o]})}}),n}var j5=/\\([\\!"#$%&'()*+,.\/:;<=>?@[\]^_`{|}~-])/g;function Eb(n){return n.indexOf("\\")<0?n:n.replace(j5,"$1")}function Q3(n){return!(n>=55296&&n<=57343||n>=64976&&n<=65007||65535==(65535&n)||65534==(65535&n)||n>=0&&n<=8||11===n||n>=14&&n<=31||n>=127&&n<=159||n>1114111)}function CA(n){return n>65535?(n-=65536,String.fromCharCode(55296+(n>>10),56320+(1023&n))):String.fromCharCode(n)}var G5=/&([a-z#][a-z0-9]{1,31});/gi,V5=/^#((?:x[a-f0-9]{1,8}|[0-9]{1,8}))/i;function z5(n,s){var t=0,o=G6(s);return s!==o?o:35===s.charCodeAt(0)&&V5.test(s)&&Q3(t="x"===s[1].toLowerCase()?parseInt(s.slice(2),16):parseInt(s.slice(1),10))?CA(t):n}function s1(n){return n.indexOf("&")<0?n:n.replace(G5,z5)}var W5=/[&<>"]/,J5=/[&<>"]/g,Q5={"&":"&amp;","<":"&lt;",">":"&gt;",'"':"&quot;"};function X5(n){return Q5[n]}function bh(n){return W5.test(n)?n.replace(J5,X5):n}var ea={};function z6(n,s){return++s>=n.length-2?s:"paragraph_open"===n[s].type&&n[s].tight&&"inline"===n[s+1].type&&0===n[s+1].content.length&&"paragraph_close"===n[s+2].type&&n[s+2].tight?z6(n,s+2):s}ea.blockquote_open=function(){return"<blockquote>\n"},ea.blockquote_close=function(n,s){return"</blockquote>"+w0(n,s)},ea.code=function(n,s){return n[s].block?"<pre><code>"+bh(n[s].content)+"</code></pre>"+w0(n,s):"<code>"+bh(n[s].content)+"</code>"},ea.fence=function(n,s,t,o,c){var j,W,g=n[s],C="",D=t.langPrefix;if(g.params){if(W=(j=g.params.split(/\s+/g)).join(" "),function(n,s){return!!n&&Z5.call(n,s)}(c.rules.fence_custom,j[0]))return c.rules.fence_custom[j[0]](n,s,t,o,c);C=' class="'+D+bh(s1(Eb(W)))+'"'}return"<pre><code"+C+">"+(t.highlight&&t.highlight.apply(t.highlight,[g.content].concat(j))||bh(g.content))+"</code></pre>"+w0(n,s)},ea.fence_custom={},ea.heading_open=function(n,s){return"<h"+n[s].hLevel+">"},ea.heading_close=function(n,s){return"</h"+n[s].hLevel+">\n"},ea.hr=function(n,s,t){return(t.xhtmlOut?"<hr />":"<hr>")+w0(n,s)},ea.bullet_list_open=function(){return"<ul>\n"},ea.bullet_list_close=function(n,s){return"</ul>"+w0(n,s)},ea.list_item_open=function(){return"<li>"},ea.list_item_close=function(){return"</li>\n"},ea.ordered_list_open=function(n,s){var t=n[s];return"<ol"+(t.order>1?' start="'+t.order+'"':"")+">\n"},ea.ordered_list_close=function(n,s){return"</ol>"+w0(n,s)},ea.paragraph_open=function(n,s){return n[s].tight?"":"<p>"},ea.paragraph_close=function(n,s){return(n[s].tight?"":"</p>")+(n[s].tight&&s&&"inline"===n[s-1].type&&!n[s-1].content?"":w0(n,s))},ea.link_open=function(n,s,t){var o=n[s].title?' title="'+bh(s1(n[s].title))+'"':"",c=t.linkTarget?' target="'+t.linkTarget+'"':"";return'<a href="'+bh(n[s].href)+'"'+o+c+">"},ea.link_close=function(){return"</a>"},ea.image=function(n,s,t){var o=' src="'+bh(n[s].src)+'"',c=n[s].title?' title="'+bh(s1(n[s].title))+'"':"";return"<img"+o+' alt="'+(n[s].alt?bh(s1(Eb(n[s].alt))):"")+'"'+c+(t.xhtmlOut?" /":"")+">"},ea.table_open=function(){return"<table>\n"},ea.table_close=function(){return"</table>\n"},ea.thead_open=function(){return"<thead>\n"},ea.thead_close=function(){return"</thead>\n"},ea.tbody_open=function(){return"<tbody>\n"},ea.tbody_close=function(){return"</tbody>\n"},ea.tr_open=function(){return"<tr>"},ea.tr_close=function(){return"</tr>\n"},ea.th_open=function(n,s){var t=n[s];return"<th"+(t.align?' style="text-align:'+t.align+'"':"")+">"},ea.th_close=function(){return"</th>"},ea.td_open=function(n,s){var t=n[s];return"<td"+(t.align?' style="text-align:'+t.align+'"':"")+">"},ea.td_close=function(){return"</td>"},ea.strong_open=function(){return"<strong>"},ea.strong_close=function(){return"</strong>"},ea.em_open=function(){return"<em>"},ea.em_close=function(){return"</em>"},ea.del_open=function(){return"<del>"},ea.del_close=function(){return"</del>"},ea.ins_open=function(){return"<ins>"},ea.ins_close=function(){return"</ins>"},ea.mark_open=function(){return"<mark>"},ea.mark_close=function(){return"</mark>"},ea.sub=function(n,s){return"<sub>"+bh(n[s].content)+"</sub>"},ea.sup=function(n,s){return"<sup>"+bh(n[s].content)+"</sup>"},ea.hardbreak=function(n,s,t){return t.xhtmlOut?"<br />\n":"<br>\n"},ea.softbreak=function(n,s,t){return t.breaks?t.xhtmlOut?"<br />\n":"<br>\n":"\n"},ea.text=function(n,s){return bh(n[s].content)},ea.htmlblock=function(n,s){return n[s].content},ea.htmltag=function(n,s){return n[s].content},ea.abbr_open=function(n,s){return'<abbr title="'+bh(s1(n[s].title))+'">'},ea.abbr_close=function(){return"</abbr>"},ea.footnote_ref=function(n,s){var t=Number(n[s].id+1).toString(),o="fnref"+t;return n[s].subId>0&&(o+=":"+n[s].subId),'<sup class="footnote-ref"><a href="#fn'+t+'" id="'+o+'">['+t+"]</a></sup>"},ea.footnote_block_open=function(n,s,t){return(t.xhtmlOut?'<hr class="footnotes-sep" />\n':'<hr class="footnotes-sep">\n')+'<section class="footnotes">\n<ol class="footnotes-list">\n'},ea.footnote_block_close=function(){return"</ol>\n</section>\n"},ea.footnote_open=function(n,s){return'<li id="fn'+Number(n[s].id+1).toString()+'"  class="footnote-item">'},ea.footnote_close=function(){return"</li>\n"},ea.footnote_anchor=function(n,s){var o="fnref"+Number(n[s].id+1).toString();return n[s].subId>0&&(o+=":"+n[s].subId),' <a href="#'+o+'" class="footnote-backref">\u21a9</a>'},ea.dl_open=function(){return"<dl>\n"},ea.dt_open=function(){return"<dt>"},ea.dd_open=function(){return"<dd>"},ea.dl_close=function(){return"</dl>\n"},ea.dt_close=function(){return"</dt>\n"},ea.dd_close=function(){return"</dd>\n"};var w0=ea.getBreak=function(s,t){return(t=z6(s,t))<s.length&&"list_item_close"===s[t].type?"":"\n"};function X3(){this.rules=J3({},ea),this.getBreak=ea.getBreak}function P_(){this.__rules__=[],this.__cache__=null}function x0(n,s,t,o,c){this.src=n,this.env=o,this.options=t,this.parser=s,this.tokens=c,this.pos=0,this.posMax=this.src.length,this.level=0,this.pending="",this.pendingLevel=0,this.cache=[],this.isInLabel=!1,this.linkLevel=0,this.linkContent="",this.labelUnmatchedScopes=0}function pS(n,s){var t,o,c,g=-1,C=n.posMax,D=n.pos,P=n.isInLabel;if(n.isInLabel)return-1;if(n.labelUnmatchedScopes)return n.labelUnmatchedScopes--,-1;for(n.pos=s+1,n.isInLabel=!0,t=1;n.pos<C;){if(91===(c=n.src.charCodeAt(n.pos)))t++;else if(93===c&&0==--t){o=!0;break}n.parser.skipToken(n)}return o?(g=n.pos,n.labelUnmatchedScopes=0):n.labelUnmatchedScopes=t-1,n.pos=D,n.isInLabel=P,g}function q5(n,s,t,o){var c,g,C,D,P,j;if(42!==n.charCodeAt(0)||91!==n.charCodeAt(1)||-1===n.indexOf("]:")||(g=pS(c=new x0(n,s,t,o,[]),1))<0||58!==n.charCodeAt(g+1))return-1;for(D=c.posMax,C=g+2;C<D&&10!==c.src.charCodeAt(C);C++);return P=n.slice(2,g),0===(j=n.slice(g+2,C).trim()).length?-1:(o.abbreviations||(o.abbreviations={}),void 0===o.abbreviations[":"+P]&&(o.abbreviations[":"+P]=j),C)}function K3(n){var s=s1(n);try{s=decodeURI(s)}catch(t){}return encodeURI(s)}function W6(n,s){var t,o,c,g=s,C=n.posMax;if(60===n.src.charCodeAt(s)){for(s++;s<C;){if(10===(t=n.src.charCodeAt(s)))return!1;if(62===t)return c=K3(Eb(n.src.slice(g+1,s))),!!n.parser.validateLink(c)&&(n.pos=s+1,n.linkContent=c,!0);92===t&&s+1<C?s+=2:s++}return!1}for(o=0;s<C&&!(32===(t=n.src.charCodeAt(s))||t<32||127===t);)if(92===t&&s+1<C)s+=2;else{if(40===t&&++o>1||41===t&&--o<0)break;s++}return!(g===s||(c=Eb(n.src.slice(g,s)),!n.parser.validateLink(c))||(n.linkContent=c,n.pos=s,0))}function J6(n,s){var t,o=s,c=n.posMax,g=n.src.charCodeAt(s);if(34!==g&&39!==g&&40!==g)return!1;for(s++,40===g&&(g=41);s<c;){if((t=n.src.charCodeAt(s))===g)return n.pos=s+1,n.linkContent=Eb(n.src.slice(o+1,s)),!0;92===t&&s+1<c?s+=2:s++}return!1}function Q6(n){return n.trim().replace(/\s+/g," ").toUpperCase()}function tL(n,s,t,o){var c,g,C,D,P,j,W,re,ie;if(91!==n.charCodeAt(0)||-1===n.indexOf("]:")||(g=pS(c=new x0(n,s,t,o,[]),0))<0||58!==n.charCodeAt(g+1))return-1;for(D=c.posMax,C=g+2;C<D&&(32===(P=c.src.charCodeAt(C))||10===P);C++);if(!W6(c,C))return-1;for(W=c.linkContent,j=C=c.pos,C+=1;C<D&&(32===(P=c.src.charCodeAt(C))||10===P);C++);for(C<D&&j!==C&&J6(c,C)?(re=c.linkContent,C=c.pos):(re="",C=j);C<D&&32===c.src.charCodeAt(C);)C++;return C<D&&10!==c.src.charCodeAt(C)?-1:(ie=Q6(n.slice(1,g)),void 0===o.references[ie]&&(o.references[ie]={title:re,href:W}),C)}X3.prototype.renderInline=function(n,s,t){for(var o=this.rules,c=n.length,g=0,C="";c--;)C+=o[n[g].type](n,g++,s,t,this);return C},X3.prototype.render=function(n,s,t){for(var o=this.rules,c=n.length,g=-1,C="";++g<c;)C+="inline"===n[g].type?this.renderInline(n[g].children,s,t):o[n[g].type](n,g,s,t,this);return C},P_.prototype.__find__=function(n){for(var s=this.__rules__.length,t=-1;s--;)if(this.__rules__[++t].name===n)return t;return-1},P_.prototype.__compile__=function(){var n=this,s=[""];n.__rules__.forEach(function(t){!t.enabled||t.alt.forEach(function(o){s.indexOf(o)<0&&s.push(o)})}),n.__cache__={},s.forEach(function(t){n.__cache__[t]=[],n.__rules__.forEach(function(o){!o.enabled||t&&o.alt.indexOf(t)<0||n.__cache__[t].push(o.fn)})})},P_.prototype.at=function(n,s,t){var o=this.__find__(n),c=t||{};if(-1===o)throw new Error("Parser rule not found: "+n);this.__rules__[o].fn=s,this.__rules__[o].alt=c.alt||[],this.__cache__=null},P_.prototype.before=function(n,s,t,o){var c=this.__find__(n),g=o||{};if(-1===c)throw new Error("Parser rule not found: "+n);this.__rules__.splice(c,0,{name:s,enabled:!0,fn:t,alt:g.alt||[]}),this.__cache__=null},P_.prototype.after=function(n,s,t,o){var c=this.__find__(n),g=o||{};if(-1===c)throw new Error("Parser rule not found: "+n);this.__rules__.splice(c+1,0,{name:s,enabled:!0,fn:t,alt:g.alt||[]}),this.__cache__=null},P_.prototype.push=function(n,s,t){this.__rules__.push({name:n,enabled:!0,fn:s,alt:(t||{}).alt||[]}),this.__cache__=null},P_.prototype.enable=function(n,s){n=Array.isArray(n)?n:[n],s&&this.__rules__.forEach(function(t){t.enabled=!1}),n.forEach(function(t){var o=this.__find__(t);if(o<0)throw new Error("Rules manager: invalid rule name "+t);this.__rules__[o].enabled=!0},this),this.__cache__=null},P_.prototype.disable=function(n){(n=Array.isArray(n)?n:[n]).forEach(function(s){var t=this.__find__(s);if(t<0)throw new Error("Rules manager: invalid rule name "+s);this.__rules__[t].enabled=!1},this),this.__cache__=null},P_.prototype.getRules=function(n){return null===this.__cache__&&this.__compile__(),this.__cache__[n]||[]},x0.prototype.pushPending=function(){this.tokens.push({type:"text",content:this.pending,level:this.pendingLevel}),this.pending=""},x0.prototype.push=function(n){this.pending&&this.pushPending(),this.tokens.push(n),this.pendingLevel=this.level},x0.prototype.cacheSet=function(n,s){for(var t=this.cache.length;t<=n;t++)this.cache.push(0);this.cache[n]=s},x0.prototype.cacheGet=function(n){return n<this.cache.length?this.cache[n]:0};var X6=" \n()[]'\".,!?-";function q3(n){return n.replace(/([-()\[\]{}+?*.$\^|,:#<!\\])/g,"\\$1")}var sL=/\+-|\.\.|\?\?\?\?|!!!!|,,|--/,aL=/\((c|tm|r|p)\)/gi,lL={c:"\xa9",r:"\xae",p:"\xa7",tm:"\u2122"};function uL(n){return n.indexOf("(")<0?n:n.replace(aL,function(s,t){return lL[t.toLowerCase()]})}var dL=/['"]/,K6=/['"]/g,fL=/[-\s()\[\]]/;function eP(n,s){return!(s<0||s>=n.length||fL.test(n[s]))}function Tb(n,s,t){return n.substr(0,s)+t+n.substr(s+1)}var eR=[["block",function(n){n.inlineMode?n.tokens.push({type:"inline",content:n.src.replace(/\n/g," ").trim(),level:0,lines:[0,1],children:[]}):n.block.parse(n.src,n.options,n.env,n.tokens)}],["abbr",function(n){var t,o,c,g,s=n.tokens;if(!n.inlineMode)for(t=1,o=s.length-1;t<o;t++)if("paragraph_open"===s[t-1].type&&"inline"===s[t].type&&"paragraph_close"===s[t+1].type){for(c=s[t].content;c.length&&!((g=q5(c,n.inline,n.options,n.env))<0);)c=c.slice(g).trim();s[t].content=c,c.length||(s[t-1].tight=!0,s[t+1].tight=!0)}}],["references",function(n){var t,o,c,g,s=n.tokens;if(n.env.references=n.env.references||{},!n.inlineMode)for(t=1,o=s.length-1;t<o;t++)if("inline"===s[t].type&&"paragraph_open"===s[t-1].type&&"paragraph_close"===s[t+1].type){for(c=s[t].content;c.length&&!((g=tL(c,n.inline,n.options,n.env))<0);)c=c.slice(g).trim();s[t].content=c,c.length||(s[t-1].tight=!0,s[t+1].tight=!0)}}],["inline",function(n){var t,o,c,s=n.tokens;for(o=0,c=s.length;o<c;o++)"inline"===(t=s[o]).type&&n.inline.parse(t.content,n.options,n.env,t.children)}],["footnote_tail",function(n){var s,t,o,c,g,C,D,P,j,W=0,re=!1,ie={};if(n.env.footnotes&&(n.tokens=n.tokens.filter(function(ge){return"footnote_reference_open"===ge.type?(re=!0,P=[],j=ge.label,!1):"footnote_reference_close"===ge.type?(re=!1,ie[":"+j]=P,!1):(re&&P.push(ge),!re)}),n.env.footnotes.list)){for(C=n.env.footnotes.list,n.tokens.push({type:"footnote_block_open",level:W++}),s=0,t=C.length;s<t;s++){for(n.tokens.push({type:"footnote_open",id:s,level:W++}),C[s].tokens?((D=[]).push({type:"paragraph_open",tight:!1,level:W++}),D.push({type:"inline",content:"",level:W,children:C[s].tokens}),D.push({type:"paragraph_close",tight:!1,level:--W})):C[s].label&&(D=ie[":"+C[s].label]),n.tokens=n.tokens.concat(D),g="paragraph_close"===n.tokens[n.tokens.length-1].type?n.tokens.pop():null,c=C[s].count>0?C[s].count:1,o=0;o<c;o++)n.tokens.push({type:"footnote_anchor",id:s,subId:o,level:W});g&&n.tokens.push(g),n.tokens.push({type:"footnote_close",level:--W})}n.tokens.push({type:"footnote_block_close",level:--W})}}],["abbr2",function(n){var s,t,o,c,g,C,D,P,j,W,re,ie,ge=n.tokens;if(n.env.abbreviations)for(n.env.abbrRegExp||(ie="(^|["+X6.split("").map(q3).join("")+"])("+Object.keys(n.env.abbreviations).map(function(_e){return _e.substr(1)}).sort(function(_e,Le){return Le.length-_e.length}).map(q3).join("|")+")($|["+X6.split("").map(q3).join("")+"])",n.env.abbrRegExp=new RegExp(ie,"g")),W=n.env.abbrRegExp,t=0,o=ge.length;t<o;t++)if("inline"===ge[t].type)for(s=(c=ge[t].children).length-1;s>=0;s--)if("text"===(g=c[s]).type){for(P=0,C=g.content,W.lastIndex=0,j=g.level,D=[];re=W.exec(C);)W.lastIndex>P&&D.push({type:"text",content:C.slice(P,re.index+re[1].length),level:j}),D.push({type:"abbr_open",title:n.env.abbreviations[":"+re[2]],level:j++}),D.push({type:"text",content:re[2],level:j}),D.push({type:"abbr_close",level:--j}),P=W.lastIndex-re[3].length;!D.length||(P<C.length&&D.push({type:"text",content:C.slice(P),level:j}),ge[t].children=c=[].concat(c.slice(0,s),D,c.slice(s+1)))}}],["replacements",function(n){var s,t,o,c,g;if(n.options.typographer)for(g=n.tokens.length-1;g>=0;g--)if("inline"===n.tokens[g].type)for(s=(c=n.tokens[g].children).length-1;s>=0;s--)"text"===(t=c[s]).type&&(o=uL(o=t.content),sL.test(o)&&(o=o.replace(/\+-/g,"\xb1").replace(/\.{2,}/g,"\u2026").replace(/([?!])\u2026/g,"$1..").replace(/([?!]){4,}/g,"$1$1$1").replace(/,{2,}/g,",").replace(/(^|[^-])---([^-]|$)/gm,"$1\u2014$2").replace(/(^|\s)--(\s|$)/gm,"$1\u2013$2").replace(/(^|[^-\s])--([^-\s]|$)/gm,"$1\u2013$2")),t.content=o)}],["smartquotes",function(n){var s,t,o,c,g,C,D,P,j,W,re,ie,ge,_e,Le,Re,ke;if(n.options.typographer)for(ke=[],Le=n.tokens.length-1;Le>=0;Le--)if("inline"===n.tokens[Le].type)for(Re=n.tokens[Le].children,ke.length=0,s=0;s<Re.length;s++)if("text"===(t=Re[s]).type&&!dL.test(t.text)){for(D=Re[s].level,ge=ke.length-1;ge>=0&&!(ke[ge].level<=D);ge--);ke.length=ge+1,g=0,C=(o=t.content).length;e:for(;g<C&&(K6.lastIndex=g,c=K6.exec(o),c);)if(P=!eP(o,c.index-1),_e="'"===c[0],(j=!eP(o,g=c.index+1))||P){if(re=!j,ie=!P)for(ge=ke.length-1;ge>=0&&(W=ke[ge],!(ke[ge].level<D));ge--)if(W.single===_e&&ke[ge].level===D){W=ke[ge],_e?(Re[W.token].content=Tb(Re[W.token].content,W.pos,n.options.quotes[2]),t.content=Tb(t.content,c.index,n.options.quotes[3])):(Re[W.token].content=Tb(Re[W.token].content,W.pos,n.options.quotes[0]),t.content=Tb(t.content,c.index,n.options.quotes[1])),ke.length=ge;continue e}re?ke.push({token:s,pos:c.index,single:_e,level:D}):ie&&_e&&(t.content=Tb(t.content,c.index,"\u2019"))}else _e&&(t.content=Tb(t.content,c.index,"\u2019"))}}]];function tP(){this.options={},this.ruler=new P_;for(var n=0;n<eR.length;n++)this.ruler.push(eR[n][0],eR[n][1])}function D0(n,s,t,o,c){var g,C,D,P,j,W,re;for(this.src=n,this.parser=s,this.options=t,this.env=o,this.tokens=c,this.bMarks=[],this.eMarks=[],this.tShift=[],this.blkIndent=0,this.line=0,this.lineMax=0,this.tight=!1,this.parentType="root",this.ddIndent=-1,this.level=0,this.result="",W=0,re=!1,D=P=W=0,j=(C=this.src).length;P<j;P++){if(g=C.charCodeAt(P),!re){if(32===g){W++;continue}re=!0}(10===g||P===j-1)&&(10!==g&&P++,this.bMarks.push(D),this.eMarks.push(P),this.tShift.push(W),re=!1,W=0,D=P+1)}this.bMarks.push(C.length),this.eMarks.push(C.length),this.tShift.push(0),this.lineMax=this.bMarks.length-1}function nP(n,s){var t,o,c;return(o=n.bMarks[s]+n.tShift[s])>=(c=n.eMarks[s])||42!==(t=n.src.charCodeAt(o++))&&45!==t&&43!==t||o<c&&32!==n.src.charCodeAt(o)?-1:o}function rP(n,s){var t,o=n.bMarks[s]+n.tShift[s],c=n.eMarks[s];if(o+1>=c||(t=n.src.charCodeAt(o++))<48||t>57)return-1;for(;;){if(o>=c)return-1;if(!((t=n.src.charCodeAt(o++))>=48&&t<=57)){if(41===t||46===t)break;return-1}}return o<c&&32!==n.src.charCodeAt(o)?-1:o}tP.prototype.process=function(n){var s,t,o;for(s=0,t=(o=this.ruler.getRules("")).length;s<t;s++)o[s](n)},D0.prototype.isEmpty=function(s){return this.bMarks[s]+this.tShift[s]>=this.eMarks[s]},D0.prototype.skipEmptyLines=function(s){for(var t=this.lineMax;s<t&&!(this.bMarks[s]+this.tShift[s]<this.eMarks[s]);s++);return s},D0.prototype.skipSpaces=function(s){for(var t=this.src.length;s<t&&32===this.src.charCodeAt(s);s++);return s},D0.prototype.skipChars=function(s,t){for(var o=this.src.length;s<o&&this.src.charCodeAt(s)===t;s++);return s},D0.prototype.skipCharsBack=function(s,t,o){if(s<=o)return s;for(;s>o;)if(t!==this.src.charCodeAt(--s))return s+1;return s},D0.prototype.getLines=function(s,t,o,c){var g,C,P,j,W=s;if(s>=t)return"";if(W+1===t)return C=this.bMarks[W]+Math.min(this.tShift[W],o),this.src.slice(C,c?this.eMarks[W]+1:this.eMarks[W]);for(P=new Array(t-s),g=0;W<t;W++,g++)(j=this.tShift[W])>o&&(j=o),j<0&&(j=0),P[g]=this.src.slice(C=this.bMarks[W]+j,W+1<t||c?this.eMarks[W]+1:this.eMarks[W]);return P.join("")};var iP={};["article","aside","button","blockquote","body","canvas","caption","col","colgroup","dd","div","dl","dt","embed","fieldset","figcaption","figure","footer","form","h1","h2","h3","h4","h5","h6","header","hgroup","hr","iframe","li","map","object","ol","output","p","pre","progress","script","section","style","table","tbody","td","textarea","tfoot","th","tr","thead","ul","video"].forEach(function(n){iP[n]=!0});var SL=/^<([a-zA-Z]{1,15})[\s\/>]/,CL=/^<\/([a-zA-Z]{1,15})[\s>]/;function tR(n,s){var t=n.bMarks[s]+n.blkIndent;return n.src.substr(t,n.eMarks[s]-t)}function MA(n,s){var t,o,c=n.bMarks[s]+n.tShift[s],g=n.eMarks[s];return c>=g||126!==(o=n.src.charCodeAt(c++))&&58!==o||c===(t=n.skipSpaces(c))||t>=g?-1:t}var AA=[["code",function(n,s,t){var o,c;if(n.tShift[s]-n.blkIndent<4)return!1;for(c=o=s+1;o<t;)if(n.isEmpty(o))o++;else{if(!(n.tShift[o]-n.blkIndent>=4))break;c=++o}return n.line=o,n.tokens.push({type:"code",content:n.getLines(s,c,4+n.blkIndent,!0),block:!0,lines:[s,n.line],level:n.level}),!0}],["fences",function(n,s,t,o){var c,g,C,D,P,j=!1,W=n.bMarks[s]+n.tShift[s],re=n.eMarks[s];if(W+3>re||126!==(c=n.src.charCodeAt(W))&&96!==c||(P=W,(g=(W=n.skipChars(W,c))-P)<3)||(C=n.src.slice(W,re).trim()).indexOf("`")>=0)return!1;if(o)return!0;for(D=s;!(++D>=t||(W=P=n.bMarks[D]+n.tShift[D],re=n.eMarks[D],W<re&&n.tShift[D]<n.blkIndent));)if(!(n.src.charCodeAt(W)!==c||n.tShift[D]-n.blkIndent>=4||(W=n.skipChars(W,c),W-P<g||(W=n.skipSpaces(W),W<re)))){j=!0;break}return g=n.tShift[s],n.line=D+(j?1:0),n.tokens.push({type:"fence",params:C,content:n.getLines(s+1,D,g,!0),lines:[s,n.line],level:n.level}),!0},["paragraph","blockquote","list"]],["blockquote",function(n,s,t,o){var c,g,C,D,P,j,W,re,ie,ge,_e,Le=n.bMarks[s]+n.tShift[s],Re=n.eMarks[s];if(Le>Re||62!==n.src.charCodeAt(Le++)||n.level>=n.options.maxNesting)return!1;if(o)return!0;for(32===n.src.charCodeAt(Le)&&Le++,P=n.blkIndent,n.blkIndent=0,D=[n.bMarks[s]],n.bMarks[s]=Le,g=(Le=Le<Re?n.skipSpaces(Le):Le)>=Re,C=[n.tShift[s]],n.tShift[s]=Le-n.bMarks[s],re=n.parser.ruler.getRules("blockquote"),c=s+1;c<t&&!((Le=n.bMarks[c]+n.tShift[c])>=(Re=n.eMarks[c]));c++)if(62!==n.src.charCodeAt(Le++)){if(g)break;for(_e=!1,ie=0,ge=re.length;ie<ge;ie++)if(re[ie](n,c,t,!0)){_e=!0;break}if(_e)break;D.push(n.bMarks[c]),C.push(n.tShift[c]),n.tShift[c]=-1337}else 32===n.src.charCodeAt(Le)&&Le++,D.push(n.bMarks[c]),n.bMarks[c]=Le,g=(Le=Le<Re?n.skipSpaces(Le):Le)>=Re,C.push(n.tShift[c]),n.tShift[c]=Le-n.bMarks[c];for(j=n.parentType,n.parentType="blockquote",n.tokens.push({type:"blockquote_open",lines:W=[s,0],level:n.level++}),n.parser.tokenize(n,s,c),n.tokens.push({type:"blockquote_close",level:--n.level}),n.parentType=j,W[1]=n.line,ie=0;ie<C.length;ie++)n.bMarks[ie+s]=D[ie],n.tShift[ie+s]=C[ie];return n.blkIndent=P,!0},["paragraph","blockquote","list"]],["hr",function(n,s,t,o){var c,g,C,D=n.bMarks[s],P=n.eMarks[s];if((D+=n.tShift[s])>P||42!==(c=n.src.charCodeAt(D++))&&45!==c&&95!==c)return!1;for(g=1;D<P;){if((C=n.src.charCodeAt(D++))!==c&&32!==C)return!1;C===c&&g++}return!(g<3||(o||(n.line=s+1,n.tokens.push({type:"hr",lines:[s,n.line],level:n.level})),0))},["paragraph","blockquote","list"]],["list",function(n,s,t,o){var c,g,C,D,P,j,W,re,ge,_e,Le,Re,ke,xe,U,pt,ht,It,dn,Lt,Dn,wt=!0;if((re=rP(n,s))>=0)Re=!0;else{if(!((re=nP(n,s))>=0))return!1;Re=!1}if(n.level>=n.options.maxNesting)return!1;if(Le=n.src.charCodeAt(re-1),o)return!0;for(xe=n.tokens.length,Re?(W=n.bMarks[s]+n.tShift[s],_e=Number(n.src.substr(W,re-W-1)),n.tokens.push({type:"ordered_list_open",order:_e,lines:pt=[s,0],level:n.level++})):n.tokens.push({type:"bullet_list_open",lines:pt=[s,0],level:n.level++}),c=s,U=!1,It=n.parser.ruler.getRules("list");c<t&&((ge=(ke=n.skipSpaces(re))>=n.eMarks[c]?1:ke-re)>4&&(ge=1),ge<1&&(ge=1),g=re-n.bMarks[c]+ge,n.tokens.push({type:"list_item_open",lines:ht=[s,0],level:n.level++}),D=n.blkIndent,P=n.tight,C=n.tShift[s],j=n.parentType,n.tShift[s]=ke-n.bMarks[s],n.blkIndent=g,n.tight=!0,n.parentType="list",n.parser.tokenize(n,s,t,!0),(!n.tight||U)&&(wt=!1),U=n.line-s>1&&n.isEmpty(n.line-1),n.blkIndent=D,n.tShift[s]=C,n.tight=P,n.parentType=j,n.tokens.push({type:"list_item_close",level:--n.level}),c=s=n.line,ht[1]=c,ke=n.bMarks[s],!(c>=t||n.isEmpty(c)||n.tShift[c]<n.blkIndent));){for(Dn=!1,dn=0,Lt=It.length;dn<Lt;dn++)if(It[dn](n,c,t,!0)){Dn=!0;break}if(Dn)break;if(Re){if((re=rP(n,c))<0)break}else if((re=nP(n,c))<0)break;if(Le!==n.src.charCodeAt(re-1))break}return n.tokens.push({type:Re?"ordered_list_close":"bullet_list_close",level:--n.level}),pt[1]=c,n.line=c,wt&&function(n,s){var t,o,c=n.level+2;for(t=s+2,o=n.tokens.length-2;t<o;t++)n.tokens[t].level===c&&"paragraph_open"===n.tokens[t].type&&(n.tokens[t+2].tight=!0,n.tokens[t].tight=!0,t+=2)}(n,xe),!0},["paragraph","blockquote"]],["footnote",function(n,s,t,o){var c,g,C,D,P,j=n.bMarks[s]+n.tShift[s],W=n.eMarks[s];if(j+4>W||91!==n.src.charCodeAt(j)||94!==n.src.charCodeAt(j+1)||n.level>=n.options.maxNesting)return!1;for(D=j+2;D<W;D++){if(32===n.src.charCodeAt(D))return!1;if(93===n.src.charCodeAt(D))break}return!(D===j+2||D+1>=W||58!==n.src.charCodeAt(++D)||(o||(D++,n.env.footnotes||(n.env.footnotes={}),n.env.footnotes.refs||(n.env.footnotes.refs={}),P=n.src.slice(j+2,D-2),n.env.footnotes.refs[":"+P]=-1,n.tokens.push({type:"footnote_reference_open",label:P,level:n.level++}),c=n.bMarks[s],g=n.tShift[s],C=n.parentType,n.tShift[s]=n.skipSpaces(D)-D,n.bMarks[s]=D,n.blkIndent+=4,n.parentType="footnote",n.tShift[s]<n.blkIndent&&(n.tShift[s]+=n.blkIndent,n.bMarks[s]-=n.blkIndent),n.parser.tokenize(n,s,t,!0),n.parentType=C,n.blkIndent-=4,n.tShift[s]=g,n.bMarks[s]=c,n.tokens.push({type:"footnote_reference_close",level:--n.level})),0))},["paragraph"]],["heading",function(n,s,t,o){var c,g,C,D=n.bMarks[s]+n.tShift[s],P=n.eMarks[s];if(D>=P||35!==(c=n.src.charCodeAt(D))||D>=P)return!1;for(g=1,c=n.src.charCodeAt(++D);35===c&&D<P&&g<=6;)g++,c=n.src.charCodeAt(++D);return!(g>6||D<P&&32!==c||(o||(P=n.skipCharsBack(P,32,D),(C=n.skipCharsBack(P,35,D))>D&&32===n.src.charCodeAt(C-1)&&(P=C),n.line=s+1,n.tokens.push({type:"heading_open",hLevel:g,lines:[s,n.line],level:n.level}),D<P&&n.tokens.push({type:"inline",content:n.src.slice(D,P).trim(),level:n.level+1,lines:[s,n.line],children:[]}),n.tokens.push({type:"heading_close",hLevel:g,level:n.level})),0))},["paragraph","blockquote"]],["lheading",function(n,s,t){var o,c,g,C=s+1;return!(C>=t||n.tShift[C]<n.blkIndent||n.tShift[C]-n.blkIndent>3||(c=n.bMarks[C]+n.tShift[C],g=n.eMarks[C],c>=g)||(o=n.src.charCodeAt(c),45!==o&&61!==o)||(c=n.skipChars(c,o),c=n.skipSpaces(c),c<g)||(c=n.bMarks[s]+n.tShift[s],n.line=C+1,n.tokens.push({type:"heading_open",hLevel:61===o?1:2,lines:[s,n.line],level:n.level}),n.tokens.push({type:"inline",content:n.src.slice(c,n.eMarks[s]).trim(),level:n.level+1,lines:[s,n.line-1],children:[]}),n.tokens.push({type:"heading_close",hLevel:61===o?1:2,level:n.level}),0))}],["htmlblock",function(n,s,t,o){var c,g,C,D=n.bMarks[s],P=n.eMarks[s],j=n.tShift[s];if(D+=j,!n.options.html||j>3||D+2>=P||60!==n.src.charCodeAt(D))return!1;if(33===(c=n.src.charCodeAt(D+1))||63===c){if(o)return!0}else{if(47!==c&&!function(n){var s=32|n;return s>=97&&s<=122}(c))return!1;if(47===c){if(!(g=n.src.slice(D,P).match(CL)))return!1}else if(!(g=n.src.slice(D,P).match(SL)))return!1;if(!0!==iP[g[1].toLowerCase()])return!1;if(o)return!0}for(C=s+1;C<n.lineMax&&!n.isEmpty(C);)C++;return n.line=C,n.tokens.push({type:"htmlblock",level:n.level,lines:[s,n.line],content:n.getLines(s,C,0,!0)}),!0},["paragraph","blockquote"]],["table",function(n,s,t,o){var c,g,C,D,P,j,W,re,ie,ge,_e;if(s+2>t||n.tShift[P=s+1]<n.blkIndent||(C=n.bMarks[P]+n.tShift[P])>=n.eMarks[P]||124!==(c=n.src.charCodeAt(C))&&45!==c&&58!==c||(g=tR(n,s+1),!/^[-:| ]+$/.test(g))||(j=g.split("|"))<=2)return!1;for(re=[],D=0;D<j.length;D++){if(!(ie=j[D].trim())){if(0===D||D===j.length-1)continue;return!1}if(!/^:?-+:?$/.test(ie))return!1;58===ie.charCodeAt(ie.length-1)?re.push(58===ie.charCodeAt(0)?"center":"right"):58===ie.charCodeAt(0)?re.push("left"):re.push("")}if(-1===(g=tR(n,s).trim()).indexOf("|")||(j=g.replace(/^\||\|$/g,"").split("|"),re.length!==j.length))return!1;if(o)return!0;for(n.tokens.push({type:"table_open",lines:ge=[s,0],level:n.level++}),n.tokens.push({type:"thead_open",lines:[s,s+1],level:n.level++}),n.tokens.push({type:"tr_open",lines:[s,s+1],level:n.level++}),D=0;D<j.length;D++)n.tokens.push({type:"th_open",align:re[D],lines:[s,s+1],level:n.level++}),n.tokens.push({type:"inline",content:j[D].trim(),lines:[s,s+1],level:n.level,children:[]}),n.tokens.push({type:"th_close",level:--n.level});for(n.tokens.push({type:"tr_close",level:--n.level}),n.tokens.push({type:"thead_close",level:--n.level}),n.tokens.push({type:"tbody_open",lines:_e=[s+2,0],level:n.level++}),P=s+2;P<t&&!(n.tShift[P]<n.blkIndent||(g=tR(n,P).trim(),-1===g.indexOf("|")));P++){for(j=g.replace(/^\||\|$/g,"").split("|"),n.tokens.push({type:"tr_open",level:n.level++}),D=0;D<j.length;D++)n.tokens.push({type:"td_open",align:re[D],level:n.level++}),W=j[D].substring(124===j[D].charCodeAt(0)?1:0,124===j[D].charCodeAt(j[D].length-1)?j[D].length-1:j[D].length).trim(),n.tokens.push({type:"inline",content:W,level:n.level,children:[]}),n.tokens.push({type:"td_close",level:--n.level});n.tokens.push({type:"tr_close",level:--n.level})}return n.tokens.push({type:"tbody_close",level:--n.level}),n.tokens.push({type:"table_close",level:--n.level}),ge[1]=_e[1]=P,n.line=P,!0},["paragraph"]],["deflist",function(n,s,t,o){var c,g,C,D,P,j,W,re,ie,ge,_e,Le,Re,ke;if(o)return!(n.ddIndent<0)&&MA(n,s)>=0;if(n.isEmpty(W=s+1)&&++W>t||n.tShift[W]<n.blkIndent||(c=MA(n,W))<0||n.level>=n.options.maxNesting)return!1;j=n.tokens.length,n.tokens.push({type:"dl_open",lines:P=[s,0],level:n.level++}),C=s,g=W;e:for(;;){for(ke=!0,Re=!1,n.tokens.push({type:"dt_open",lines:[C,C],level:n.level++}),n.tokens.push({type:"inline",content:n.getLines(C,C+1,n.blkIndent,!1).trim(),level:n.level+1,lines:[C,C],children:[]}),n.tokens.push({type:"dt_close",level:--n.level});;){if(n.tokens.push({type:"dd_open",lines:D=[W,0],level:n.level++}),Le=n.tight,ie=n.ddIndent,re=n.blkIndent,_e=n.tShift[g],ge=n.parentType,n.blkIndent=n.ddIndent=n.tShift[g]+2,n.tShift[g]=c-n.bMarks[g],n.tight=!0,n.parentType="deflist",n.parser.tokenize(n,g,t,!0),(!n.tight||Re)&&(ke=!1),Re=n.line-g>1&&n.isEmpty(n.line-1),n.tShift[g]=_e,n.tight=Le,n.parentType=ge,n.blkIndent=re,n.ddIndent=ie,n.tokens.push({type:"dd_close",level:--n.level}),D[1]=W=n.line,W>=t||n.tShift[W]<n.blkIndent)break e;if((c=MA(n,W))<0)break;g=W}if(W>=t||n.isEmpty(C=W)||n.tShift[C]<n.blkIndent||(g=C+1)>=t||(n.isEmpty(g)&&g++,g>=t)||n.tShift[g]<n.blkIndent||(c=MA(n,g))<0)break}return n.tokens.push({type:"dl_close",level:--n.level}),P[1]=W,n.line=W,ke&&function(n,s){var t,o,c=n.level+2;for(t=s+2,o=n.tokens.length-2;t<o;t++)n.tokens[t].level===c&&"paragraph_open"===n.tokens[t].type&&(n.tokens[t+2].tight=!0,n.tokens[t].tight=!0,t+=2)}(n,j),!0},["paragraph"]],["paragraph",function(n,s){var t,o,c,g,C,P,D=s+1;if(D<(t=n.lineMax)&&!n.isEmpty(D))for(P=n.parser.ruler.getRules("paragraph");D<t&&!n.isEmpty(D);D++)if(!(n.tShift[D]-n.blkIndent>3)){for(c=!1,g=0,C=P.length;g<C;g++)if(P[g](n,D,t,!0)){c=!0;break}if(c)break}return o=n.getLines(s,D,n.blkIndent,!1).trim(),n.line=D,o.length&&(n.tokens.push({type:"paragraph_open",tight:!1,lines:[s,n.line],level:n.level}),n.tokens.push({type:"inline",content:o,level:n.level+1,lines:[s,n.line],children:[]}),n.tokens.push({type:"paragraph_close",tight:!1,level:n.level})),!0}]];function nR(){this.ruler=new P_;for(var n=0;n<AA.length;n++)this.ruler.push(AA[n][0],AA[n][1],{alt:(AA[n][2]||[]).slice()})}nR.prototype.tokenize=function(n,s,t){for(var P,o=this.ruler.getRules(""),c=o.length,g=s,C=!1;g<t&&(n.line=g=n.skipEmptyLines(g),!(g>=t||n.tShift[g]<n.blkIndent));){for(P=0;P<c&&!o[P](n,g,t,!1);P++);if(n.tight=!C,n.isEmpty(n.line-1)&&(C=!0),(g=n.line)<t&&n.isEmpty(g)){if(C=!0,++g<t&&"list"===n.parentType&&n.isEmpty(g))break;n.line=g}}};var RL=/[\n\t]/g,NL=/\r[\n\u0085]|[\u2424\u2028\u0085]/g,PL=/\u00a0/g;function IL(n){switch(n){case 10:case 92:case 96:case 42:case 95:case 94:case 91:case 93:case 33:case 38:case 60:case 62:case 123:case 125:case 36:case 37:case 64:case 126:case 43:case 61:case 58:return!0;default:return!1}}nR.prototype.parse=function(n,s,t,o){var c,g=0,C=0;if(!n)return[];(n=(n=n.replace(PL," ")).replace(NL,"\n")).indexOf("\t")>=0&&(n=n.replace(RL,function(D,P){var j;return 10===n.charCodeAt(P)?(g=P+1,C=0,D):(j="    ".slice((P-g-C)%4),C=P-g+1,j)})),c=new D0(n,this,s,t,o),this.tokenize(c,c.line,c.lineMax)};for(var rR=[],oP=0;oP<256;oP++)rR.push(0);function sP(n){return n>=48&&n<=57||n>=65&&n<=90||n>=97&&n<=122}function aP(n,s){var o,c,g,t=s,C=!0,D=!0,P=n.posMax,j=n.src.charCodeAt(s);for(o=s>0?n.src.charCodeAt(s-1):-1;t<P&&n.src.charCodeAt(t)===j;)t++;return t>=P&&(C=!1),(g=t-s)>=4?C=D=!1:((32===(c=t<P?n.src.charCodeAt(t):-1)||10===c)&&(C=!1),(32===o||10===o)&&(D=!1),95===j&&(sP(o)&&(C=!1),sP(c)&&(D=!1))),{can_open:C,can_close:D,delims:g}}"\\!\"#$%&'()*+,./:;<=>?@[]^_`{|}~-".split("").forEach(function(n){rR[n.charCodeAt(0)]=1});var ZL=/\\([ \\!"#$%&'()*+,.\/:;<=>?@[\]^_`{|}~-])/g,GL=/\\([ \\!"#$%&'()*+,.\/:;<=>?@[\]^_`{|}~-])/g,QL=["coap","doi","javascript","aaa","aaas","about","acap","cap","cid","crid","data","dav","dict","dns","file","ftp","geo","go","gopher","h323","http","https","iax","icap","im","imap","info","ipp","iris","iris.beep","iris.xpc","iris.xpcs","iris.lwz","ldap","mailto","mid","msrp","msrps","mtqp","mupdate","news","nfs","ni","nih","nntp","opaquelocktoken","pop","pres","rtsp","service","session","shttp","sieve","sip","sips","sms","snmp","soap.beep","soap.beeps","tag","tel","telnet","tftp","thismessage","tn3270","tip","tv","urn","vemmi","ws","wss","xcon","xcon-userid","xmlrpc.beep","xmlrpc.beeps","xmpp","z39.50r","z39.50s","adiumxtra","afp","afs","aim","apt","attachment","aw","beshare","bitcoin","bolo","callto","chrome","chrome-extension","com-eventbrite-attendee","content","cvs","dlna-playsingle","dlna-playcontainer","dtn","dvb","ed2k","facetime","feed","finger","fish","gg","git","gizmoproject","gtalk","hcp","icon","ipn","irc","irc6","ircs","itms","jar","jms","keyparc","lastfm","ldaps","magnet","maps","market","message","mms","ms-help","msnim","mumble","mvn","notes","oid","palm","paparazzi","platform","proxy","psyc","query","res","resource","rmi","rsync","rtmp","secondlife","sftp","sgn","skype","smb","soldat","spotify","ssh","steam","svn","teamspeak","things","udp","unreal","ut2004","ventrilo","view-source","webcal","wtai","wyciwyg","xfire","xri","ymsgr"],XL=/^<([a-zA-Z0-9.!#$%&'*+\/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*)>/,KL=/^<([a-zA-Z.\-]{1,25}):([^<>\x00-\x20]*)>/;function OA(n,s){return n=n.source,s=s||"",function t(o,c){return o?(n=n.replace(o,c=c.source||c),t):new RegExp(n,s)}}var iF=OA(/(?:unquoted|single_quoted|double_quoted)/)("unquoted",/[^"'=<>`\x00-\x20]+/)("single_quoted",/'[^']*'/)("double_quoted",/"[^"]*"/)(),oF=OA(/(?:\s+attr_name(?:\s*=\s*attr_value)?)/)("attr_name",/[a-zA-Z_:][a-zA-Z0-9:._-]*/)("attr_value",iF)(),sF=OA(/<[A-Za-z][A-Za-z0-9]*attribute*\s*\/?>/)("attribute",oF)(),fF=OA(/^(?:open_tag|close_tag|comment|processing|declaration|cdata)/)("open_tag",sF)("close_tag",/<\/[A-Za-z][A-Za-z0-9]*\s*>/)("comment",/<!---->|<!--(?:-?[^>-])(?:-?[^-])*-->/)("processing",/<[?].*?[?]>/)("declaration",/<![A-Z]+\s+[^>]*>/)("cdata",/<!\[CDATA\[[\s\S]*?\]\]>/)(),_F=/^&#((?:x[a-f0-9]{1,8}|[0-9]{1,8}));/i,gF=/^&([a-z][a-z0-9]{1,31});/i,iR=[["text",function(n,s){for(var t=n.pos;t<n.posMax&&!IL(n.src.charCodeAt(t));)t++;return t!==n.pos&&(s||(n.pending+=n.src.slice(n.pos,t)),n.pos=t,!0)}],["newline",function(n,s){var t,o,c=n.pos;if(10!==n.src.charCodeAt(c))return!1;if(t=n.pending.length-1,o=n.posMax,!s)if(t>=0&&32===n.pending.charCodeAt(t))if(t>=1&&32===n.pending.charCodeAt(t-1)){for(var g=t-2;g>=0;g--)if(32!==n.pending.charCodeAt(g)){n.pending=n.pending.substring(0,g+1);break}n.push({type:"hardbreak",level:n.level})}else n.pending=n.pending.slice(0,-1),n.push({type:"softbreak",level:n.level});else n.push({type:"softbreak",level:n.level});for(c++;c<o&&32===n.src.charCodeAt(c);)c++;return n.pos=c,!0}],["escape",function(n,s){var t,o=n.pos,c=n.posMax;if(92!==n.src.charCodeAt(o))return!1;if(++o<c){if((t=n.src.charCodeAt(o))<256&&0!==rR[t])return s||(n.pending+=n.src[o]),n.pos+=2,!0;if(10===t){for(s||n.push({type:"hardbreak",level:n.level}),o++;o<c&&32===n.src.charCodeAt(o);)o++;return n.pos=o,!0}}return s||(n.pending+="\\"),n.pos++,!0}],["backticks",function(n,s){var t,o,c,g,C,D=n.pos;if(96!==n.src.charCodeAt(D))return!1;for(t=D,D++,o=n.posMax;D<o&&96===n.src.charCodeAt(D);)D++;for(c=n.src.slice(t,D),g=C=D;-1!==(g=n.src.indexOf("`",C));){for(C=g+1;C<o&&96===n.src.charCodeAt(C);)C++;if(C-g===c.length)return s||n.push({type:"code",content:n.src.slice(D,g).replace(/[ \n]+/g," ").trim(),block:!1,level:n.level}),n.pos=C,!0}return s||(n.pending+=c),n.pos+=c.length,!0}],["del",function(n,s){var t,o,c,D,P,g=n.posMax,C=n.pos;if(126!==n.src.charCodeAt(C)||s||C+4>=g||126!==n.src.charCodeAt(C+1)||n.level>=n.options.maxNesting||(D=C>0?n.src.charCodeAt(C-1):-1,P=n.src.charCodeAt(C+2),126===D)||126===P||32===P||10===P)return!1;for(o=C+2;o<g&&126===n.src.charCodeAt(o);)o++;if(o>C+3)return n.pos+=o-C,s||(n.pending+=n.src.slice(C,o)),!0;for(n.pos=C+2,c=1;n.pos+1<g;){if(126===n.src.charCodeAt(n.pos)&&126===n.src.charCodeAt(n.pos+1)&&(D=n.src.charCodeAt(n.pos-1),126!==(P=n.pos+2<g?n.src.charCodeAt(n.pos+2):-1)&&126!==D&&(32!==D&&10!==D?c--:32!==P&&10!==P&&c++,c<=0))){t=!0;break}n.parser.skipToken(n)}return t?(n.posMax=n.pos,n.pos=C+2,s||(n.push({type:"del_open",level:n.level++}),n.parser.tokenize(n),n.push({type:"del_close",level:--n.level})),n.pos=n.posMax+2,n.posMax=g,!0):(n.pos=C,!1)}],["ins",function(n,s){var t,o,c,D,P,g=n.posMax,C=n.pos;if(43!==n.src.charCodeAt(C)||s||C+4>=g||43!==n.src.charCodeAt(C+1)||n.level>=n.options.maxNesting||(D=C>0?n.src.charCodeAt(C-1):-1,P=n.src.charCodeAt(C+2),43===D)||43===P||32===P||10===P)return!1;for(o=C+2;o<g&&43===n.src.charCodeAt(o);)o++;if(o!==C+2)return n.pos+=o-C,s||(n.pending+=n.src.slice(C,o)),!0;for(n.pos=C+2,c=1;n.pos+1<g;){if(43===n.src.charCodeAt(n.pos)&&43===n.src.charCodeAt(n.pos+1)&&(D=n.src.charCodeAt(n.pos-1),43!==(P=n.pos+2<g?n.src.charCodeAt(n.pos+2):-1)&&43!==D&&(32!==D&&10!==D?c--:32!==P&&10!==P&&c++,c<=0))){t=!0;break}n.parser.skipToken(n)}return t?(n.posMax=n.pos,n.pos=C+2,s||(n.push({type:"ins_open",level:n.level++}),n.parser.tokenize(n),n.push({type:"ins_close",level:--n.level})),n.pos=n.posMax+2,n.posMax=g,!0):(n.pos=C,!1)}],["mark",function(n,s){var t,o,c,D,P,g=n.posMax,C=n.pos;if(61!==n.src.charCodeAt(C)||s||C+4>=g||61!==n.src.charCodeAt(C+1)||n.level>=n.options.maxNesting||(D=C>0?n.src.charCodeAt(C-1):-1,P=n.src.charCodeAt(C+2),61===D)||61===P||32===P||10===P)return!1;for(o=C+2;o<g&&61===n.src.charCodeAt(o);)o++;if(o!==C+2)return n.pos+=o-C,s||(n.pending+=n.src.slice(C,o)),!0;for(n.pos=C+2,c=1;n.pos+1<g;){if(61===n.src.charCodeAt(n.pos)&&61===n.src.charCodeAt(n.pos+1)&&(D=n.src.charCodeAt(n.pos-1),61!==(P=n.pos+2<g?n.src.charCodeAt(n.pos+2):-1)&&61!==D&&(32!==D&&10!==D?c--:32!==P&&10!==P&&c++,c<=0))){t=!0;break}n.parser.skipToken(n)}return t?(n.posMax=n.pos,n.pos=C+2,s||(n.push({type:"mark_open",level:n.level++}),n.parser.tokenize(n),n.push({type:"mark_close",level:--n.level})),n.pos=n.posMax+2,n.posMax=g,!0):(n.pos=C,!1)}],["emphasis",function(n,s){var t,o,c,g,C,D,P,j=n.posMax,W=n.pos,re=n.src.charCodeAt(W);if(95!==re&&42!==re||s)return!1;if(t=(P=aP(n,W)).delims,!P.can_open)return n.pos+=t,s||(n.pending+=n.src.slice(W,n.pos)),!0;if(n.level>=n.options.maxNesting)return!1;for(n.pos=W+t,D=[t];n.pos<j;)if(n.src.charCodeAt(n.pos)!==re)n.parser.skipToken(n);else{if(o=(P=aP(n,n.pos)).delims,P.can_close){for(g=D.pop(),C=o;g!==C;){if(C<g){D.push(g-C);break}if(C-=g,0===D.length)break;n.pos+=g,g=D.pop()}if(0===D.length){t=g,c=!0;break}n.pos+=o;continue}P.can_open&&D.push(o),n.pos+=o}return c?(n.posMax=n.pos,n.pos=W+t,s||((2===t||3===t)&&n.push({type:"strong_open",level:n.level++}),(1===t||3===t)&&n.push({type:"em_open",level:n.level++}),n.parser.tokenize(n),(1===t||3===t)&&n.push({type:"em_close",level:--n.level}),(2===t||3===t)&&n.push({type:"strong_close",level:--n.level})),n.pos=n.posMax+t,n.posMax=j,!0):(n.pos=W,!1)}],["sub",function(n,s){var t,o,c=n.posMax,g=n.pos;if(126!==n.src.charCodeAt(g)||s||g+2>=c||n.level>=n.options.maxNesting)return!1;for(n.pos=g+1;n.pos<c;){if(126===n.src.charCodeAt(n.pos)){t=!0;break}n.parser.skipToken(n)}return!t||g+1===n.pos||(o=n.src.slice(g+1,n.pos)).match(/(^|[^\\])(\\\\)*\s/)?(n.pos=g,!1):(n.posMax=n.pos,n.pos=g+1,s||n.push({type:"sub",level:n.level,content:o.replace(ZL,"$1")}),n.pos=n.posMax+1,n.posMax=c,!0)}],["sup",function(n,s){var t,o,c=n.posMax,g=n.pos;if(94!==n.src.charCodeAt(g)||s||g+2>=c||n.level>=n.options.maxNesting)return!1;for(n.pos=g+1;n.pos<c;){if(94===n.src.charCodeAt(n.pos)){t=!0;break}n.parser.skipToken(n)}return!t||g+1===n.pos||(o=n.src.slice(g+1,n.pos)).match(/(^|[^\\])(\\\\)*\s/)?(n.pos=g,!1):(n.posMax=n.pos,n.pos=g+1,s||n.push({type:"sup",level:n.level,content:o.replace(GL,"$1")}),n.pos=n.posMax+1,n.posMax=c,!0)}],["links",function(n,s){var t,o,c,g,C,D,P,j,W=!1,re=n.pos,ie=n.posMax,ge=n.pos,_e=n.src.charCodeAt(ge);if(33===_e&&(W=!0,_e=n.src.charCodeAt(++ge)),91!==_e||n.level>=n.options.maxNesting||(t=ge+1,(o=pS(n,ge))<0))return!1;if((D=o+1)<ie&&40===n.src.charCodeAt(D)){for(D++;D<ie&&(32===(j=n.src.charCodeAt(D))||10===j);D++);if(D>=ie)return!1;for(ge=D,W6(n,D)?(g=n.linkContent,D=n.pos):g="",ge=D;D<ie&&(32===(j=n.src.charCodeAt(D))||10===j);D++);if(D<ie&&ge!==D&&J6(n,D))for(C=n.linkContent,D=n.pos;D<ie&&(32===(j=n.src.charCodeAt(D))||10===j);D++);else C="";if(D>=ie||41!==n.src.charCodeAt(D))return n.pos=re,!1;D++}else{if(n.linkLevel>0)return!1;for(;D<ie&&(32===(j=n.src.charCodeAt(D))||10===j);D++);if(D<ie&&91===n.src.charCodeAt(D)&&(ge=D+1,(D=pS(n,D))>=0?c=n.src.slice(ge,D++):D=ge-1),c||(void 0===c&&(D=o+1),c=n.src.slice(t,o)),!(P=n.env.references[Q6(c)]))return n.pos=re,!1;g=P.href,C=P.title}return s||(n.pos=t,n.posMax=o,W?n.push({type:"image",src:g,title:C,alt:n.src.substr(t,o-t),level:n.level}):(n.push({type:"link_open",href:g,title:C,level:n.level++}),n.linkLevel++,n.parser.tokenize(n),n.linkLevel--,n.push({type:"link_close",level:--n.level}))),n.pos=D,n.posMax=ie,!0}],["footnote_inline",function(n,s){var t,o,c,g,C=n.posMax,D=n.pos;return!(D+2>=C||94!==n.src.charCodeAt(D)||91!==n.src.charCodeAt(D+1)||n.level>=n.options.maxNesting||(t=D+2,o=pS(n,D+1),o<0)||(s||(n.env.footnotes||(n.env.footnotes={}),n.env.footnotes.list||(n.env.footnotes.list=[]),c=n.env.footnotes.list.length,n.pos=t,n.posMax=o,n.push({type:"footnote_ref",id:c,level:n.level}),n.linkLevel++,g=n.tokens.length,n.parser.tokenize(n),n.env.footnotes.list[c]={tokens:n.tokens.splice(g)},n.linkLevel--),n.pos=o+1,n.posMax=C,0))}],["footnote_ref",function(n,s){var t,o,c,g,C=n.posMax,D=n.pos;if(D+3>C||!n.env.footnotes||!n.env.footnotes.refs||91!==n.src.charCodeAt(D)||94!==n.src.charCodeAt(D+1)||n.level>=n.options.maxNesting)return!1;for(o=D+2;o<C;o++){if(32===n.src.charCodeAt(o)||10===n.src.charCodeAt(o))return!1;if(93===n.src.charCodeAt(o))break}return!(o===D+2||o>=C||(o++,t=n.src.slice(D+2,o-1),void 0===n.env.footnotes.refs[":"+t])||(s||(n.env.footnotes.list||(n.env.footnotes.list=[]),n.env.footnotes.refs[":"+t]<0?(n.env.footnotes.list[c=n.env.footnotes.list.length]={label:t,count:0},n.env.footnotes.refs[":"+t]=c):c=n.env.footnotes.refs[":"+t],g=n.env.footnotes.list[c].count,n.env.footnotes.list[c].count++,n.push({type:"footnote_ref",id:c,subId:g,level:n.level})),n.pos=o,n.posMax=C,0))}],["autolink",function(n,s){var t,o,c,g,C,D=n.pos;return!(60!==n.src.charCodeAt(D)||(t=n.src.slice(D),t.indexOf(">")<0)||((o=t.match(KL))?QL.indexOf(o[1].toLowerCase())<0||(g=o[0].slice(1,-1),C=K3(g),!n.parser.validateLink(g))||(s||(n.push({type:"link_open",href:C,level:n.level}),n.push({type:"text",content:g,level:n.level+1}),n.push({type:"link_close",level:n.level})),n.pos+=o[0].length,0):!(c=t.match(XL))||(C=K3("mailto:"+(g=c[0].slice(1,-1))),!n.parser.validateLink(C)||(s||(n.push({type:"link_open",href:C,level:n.level}),n.push({type:"text",content:g,level:n.level+1}),n.push({type:"link_close",level:n.level})),n.pos+=c[0].length,0))))}],["htmltag",function(n,s){var t,o,c,g=n.pos;return!(!n.options.html||(c=n.posMax,60!==n.src.charCodeAt(g)||g+2>=c)||(t=n.src.charCodeAt(g+1),33!==t&&63!==t&&47!==t&&!function(n){var s=32|n;return s>=97&&s<=122}(t))||(o=n.src.slice(g).match(fF),!o)||(s||n.push({type:"htmltag",content:n.src.slice(g,g+o[0].length),level:n.level}),n.pos+=o[0].length,0))}],["entity",function(n,s){var o,c,g=n.pos,C=n.posMax;if(38!==n.src.charCodeAt(g))return!1;if(g+1<C)if(35===n.src.charCodeAt(g+1)){if(c=n.src.slice(g).match(_F))return s||(o="x"===c[1][0].toLowerCase()?parseInt(c[1].slice(1),16):parseInt(c[1],10),n.pending+=Q3(o)?CA(o):CA(65533)),n.pos+=c[0].length,!0}else if(c=n.src.slice(g).match(gF)){var D=G6(c[1]);if(c[1]!==D)return s||(n.pending+=D),n.pos+=c[0].length,!0}return s||(n.pending+="&"),n.pos++,!0}]];function wA(){this.ruler=new P_;for(var n=0;n<iR.length;n++)this.ruler.push(iR[n][0],iR[n][1]);this.validateLink=vF}function vF(n){var t=n.trim().toLowerCase();return!(-1!==(t=s1(t)).indexOf(":")&&-1!==["vbscript","javascript","file","data"].indexOf(t.split(":")[0]))}wA.prototype.skipToken=function(n){var c,g,s=this.ruler.getRules(""),t=s.length,o=n.pos;if((g=n.cacheGet(o))>0)n.pos=g;else{for(c=0;c<t;c++)if(s[c](n,!0))return void n.cacheSet(o,n.pos);n.pos++,n.cacheSet(o,n.pos)}},wA.prototype.tokenize=function(n){for(var c,g,s=this.ruler.getRules(""),t=s.length,o=n.posMax;n.pos<o;){for(g=0;g<t&&!(c=s[g](n,!1));g++);if(c){if(n.pos>=o)break}else n.pending+=n.src[n.pos++]}n.pending&&n.pushPending()},wA.prototype.parse=function(n,s,t,o){var c=new x0(n,this,s,t,o);this.tokenize(c)};var TF={default:{options:{html:!1,xhtmlOut:!1,breaks:!1,langPrefix:"language-",linkTarget:"",typographer:!1,quotes:"\u201c\u201d\u2018\u2019",highlight:null,maxNesting:20},components:{core:{rules:["block","inline","references","replacements","smartquotes","references","abbr2","footnote_tail"]},block:{rules:["blockquote","code","fences","footnote","heading","hr","htmlblock","lheading","list","paragraph","table"]},inline:{rules:["autolink","backticks","del","emphasis","entity","escape","footnote_ref","htmltag","links","newline","text"]}}},full:{options:{html:!1,xhtmlOut:!1,breaks:!1,langPrefix:"language-",linkTarget:"",typographer:!1,quotes:"\u201c\u201d\u2018\u2019",highlight:null,maxNesting:20},components:{core:{},block:{},inline:{}}},commonmark:{options:{html:!0,xhtmlOut:!0,breaks:!1,langPrefix:"language-",linkTarget:"",typographer:!1,quotes:"\u201c\u201d\u2018\u2019",highlight:null,maxNesting:20},components:{core:{rules:["block","inline","references","abbr2"]},block:{rules:["blockquote","code","fences","heading","hr","htmlblock","lheading","list","paragraph"]},inline:{rules:["autolink","backticks","emphasis","entity","escape","htmltag","links","newline","text"]}}}};function lP(n,s,t){this.src=s,this.env=t,this.options=n.options,this.tokens=[],this.inlineMode=!1,this.inline=n.inline,this.block=n.block,this.renderer=n.renderer,this.typographer=n.typographer}function a1(n,s){"string"!=typeof n&&(s=n,n="default"),s&&null!=s.linkify&&console.warn("linkify option is removed. Use linkify plugin instead:\n\nimport Remarkable from 'remarkable';\nimport linkify from 'remarkable/linkify';\nnew Remarkable().use(linkify)\n"),this.inline=new wA,this.block=new nR,this.core=new tP,this.renderer=new X3,this.ruler=new P_,this.options={},this.configure(TF[n]),this.set(s||{})}a1.prototype.set=function(n){J3(this.options,n)},a1.prototype.configure=function(n){var s=this;if(!n)throw new Error("Wrong `remarkable` preset, check name/content");n.options&&s.set(n.options),n.components&&Object.keys(n.components).forEach(function(t){n.components[t].rules&&s[t].ruler.enable(n.components[t].rules,!0)})},a1.prototype.use=function(n,s){return n(this,s),this},a1.prototype.parse=function(n,s){var t=new lP(this,n,s);return this.core.process(t),t.tokens},a1.prototype.render=function(n,s){return this.renderer.render(this.parse(n,s=s||{}),this.options,s)},a1.prototype.parseInline=function(n,s){var t=new lP(this,n,s);return t.inlineMode=!0,this.core.process(t),t.tokens},a1.prototype.renderInline=function(n,s){return this.renderer.render(this.parseInline(n,s=s||{}),this.options,s)};var xA="NOT_FOUND",MF=function(s,t){return s===t};function OF(n,s){var t="object"==typeof s?s:{equalityCheck:s},o=t.equalityCheck,g=t.maxSize,C=void 0===g?1:g,D=t.resultEqualityCheck,P=function(n){return function(t,o){if(null===t||null===o||t.length!==o.length)return!1;for(var c=t.length,g=0;g<c;g++)if(!n(t[g],o[g]))return!1;return!0}}(void 0===o?MF:o),j=1===C?function(n){var s;return{get:function(o){return s&&n(s.key,o)?s.value:xA},put:function(o,c){s={key:o,value:c}},getEntries:function(){return s?[s]:[]},clear:function(){s=void 0}}}(P):function(n,s){var t=[];function o(D){var P=t.findIndex(function(W){return s(D,W.key)});if(P>-1){var j=t[P];return P>0&&(t.splice(P,1),t.unshift(j)),j.value}return xA}return{get:o,put:function(D,P){o(D)===xA&&(t.unshift({key:D,value:P}),t.length>n&&t.pop())},getEntries:function(){return t},clear:function(){t=[]}}}(C,P);function W(){var re=j.get(arguments);if(re===xA){if(re=n.apply(null,arguments),D){var ie=j.getEntries(),ge=ie.find(function(_e){return D(_e.value,re)});ge&&(re=ge.value)}j.put(arguments,re)}return re}return W.clearCache=function(){return j.clear()},W}function wF(n){var s=Array.isArray(n[0])?n[0]:n;if(!s.every(function(o){return"function"==typeof o})){var t=s.map(function(o){return"function"==typeof o?"function "+(o.name||"unnamed")+"()":typeof o}).join(", ");throw new Error("createSelector expects all input-selectors to be functions, but received the following types: ["+t+"]")}return s}function xF(n){for(var s=arguments.length,t=new Array(s>1?s-1:0),o=1;o<s;o++)t[o-1]=arguments[o];var c=function(){for(var C=arguments.length,D=new Array(C),P=0;P<C;P++)D[P]=arguments[P];var W,j=0,re={memoizeOptions:void 0},ie=D.pop();if("object"==typeof ie&&(re=ie,ie=D.pop()),"function"!=typeof ie)throw new Error("createSelector expects an output function after the inputs, but received: ["+typeof ie+"]");var ge=re,_e=ge.memoizeOptions,Le=void 0===_e?t:_e,Re=Array.isArray(Le)?Le:[Le],ke=wF(D),xe=n.apply(void 0,[function(){return j++,ie.apply(null,arguments)}].concat(Re)),U=n(function(){for(var ht=[],wt=ke.length,It=0;It<wt;It++)ht.push(ke[It].apply(null,arguments));return W=xe.apply(null,ht)});return Object.assign(U,{resultFunc:ie,memoizedResultFunc:xe,dependencies:ke,lastResult:function(){return W},recomputations:function(){return j},resetRecomputations:function(){return j=0}}),U};return c}var uP=xF(OF),DF=i(4043),RF=i(2135),NF=i.n(RF),PF=i(95327),IF=i.n(PF),LF=i(31208),FF=i(3912),kF=i.n(FF),$F=i(41233),HF=i.n($F),UF=i(74299),BF=i.n(UF),YF=i(32322),ZF=i.n(YF),jF=i(58734),GF=i.n(jF),VF=i(69883),zF=i.n(VF),WF=i(41205),JF=i.n(WF),QF={3978:(n,s,t)=>{n.exports=t(1910)},1543:(n,s,t)=>{t.d(s,{Z:()=>ke});var o=t(863),c=t(7344),g=t(8656),C=t(6340),D=t(9972),P=t(5416),j=t(775),W=t(5171),re=t(8818),ie=t(2565),ge=t(810);const _e=(t.d(U={},{default:()=>HR}),U);var U,Le=t(9569),Re=t(5053),ke=function(xe){(0,D.default)(pt,xe);var U=(0,P.default)(pt);function pt(){var ht,wt;(0,c.default)(this,pt);for(var It=arguments.length,dn=new Array(It),Lt=0;Lt<It;Lt++)dn[Lt]=arguments[Lt];return wt=U.call.apply(U,(0,W.default)(ht=[this]).call(ht,dn)),(0,j.default)((0,C.default)(wt),"getModelName",function(Dn){return-1!==(0,re.default)(Dn).call(Dn,"#/definitions/")?Dn.replace(/^.*#\/definitions\//,""):-1!==(0,re.default)(Dn).call(Dn,"#/components/schemas/")?Dn.replace(/^.*#\/components\/schemas\//,""):void 0}),(0,j.default)((0,C.default)(wt),"getRefSchema",function(Dn){return wt.props.specSelectors.findDefinition(Dn)}),wt}return(0,g.default)(pt,[{key:"render",value:function(){var ht=this.props,wt=ht.getComponent,It=ht.getConfigs,dn=ht.specSelectors,Lt=ht.schema,Dn=ht.required,Mn=ht.name,$r=ht.isRef,ur=ht.specPath,Pr=ht.displayName,xr=ht.includeReadOnly,fn=ht.includeWriteOnly,Nn=wt("ObjectModel"),$n=wt("ArrayModel"),Qn=wt("PrimitiveModel"),Tn="object",Yr=Lt&&Lt.get("$$ref");if(!Mn&&Yr&&(Mn=this.getModelName(Yr)),!Lt&&Yr&&(Lt=this.getRefSchema(Mn)),!Lt)return ge.default.createElement("span",{className:"model model-title"},ge.default.createElement("span",{className:"model-title__text"},Pr||Mn),ge.default.createElement("img",{src:t(2517),height:"20px",width:"20px"}));var ji=dn.isOAS3()&&Lt.get("deprecated");switch($r=void 0!==$r?$r:!!Yr,Tn=Lt&&Lt.get("type")||Tn){case"object":return ge.default.createElement(Nn,(0,o.default)({className:"object"},this.props,{specPath:ur,getConfigs:It,schema:Lt,name:Mn,deprecated:ji,isRef:$r,includeReadOnly:xr,includeWriteOnly:fn}));case"array":return ge.default.createElement($n,(0,o.default)({className:"array"},this.props,{getConfigs:It,schema:Lt,name:Mn,deprecated:ji,required:Dn,includeReadOnly:xr,includeWriteOnly:fn}));default:return ge.default.createElement(Qn,(0,o.default)({},this.props,{getComponent:wt,getConfigs:It,schema:Lt,name:Mn,deprecated:ji,required:Dn}))}}}]),pt}(_e.default);(0,j.default)(ke,"propTypes",{schema:(0,ie.default)(Le.default).isRequired,getComponent:Re.default.func.isRequired,getConfigs:Re.default.func.isRequired,specSelectors:Re.default.object.isRequired,name:Re.default.string,displayName:Re.default.string,isRef:Re.default.bool,required:Re.default.bool,expandDepth:Re.default.number,depth:Re.default.number,specPath:Le.default.list.isRequired,includeReadOnly:Re.default.bool,includeWriteOnly:Re.default.bool})},5623:(n,s,t)=>{t.d(s,{Z:()=>Re});var o=t(1581),c=t(7344),g=t(8656),C=t(6340),D=t(9972),P=t(5416),j=t(775),W=t(2740),re=t(5171),ie=t(810),ge=t(8900),_e=(t(5053),t(6298)),Le=t(7504),Re=function(xe){(0,D.default)(pt,xe);var U=(0,P.default)(pt);function pt(ht,wt){var It;(0,c.default)(this,pt),It=U.call(this,ht,wt),(0,j.default)((0,C.default)(It),"getDefinitionUrl",function(){return new ge.default(It.props.specSelectors.url(),Le.Z.location).toString()});var dn=(0,ht.getConfigs)().validatorUrl;return It.state={url:It.getDefinitionUrl(),validatorUrl:void 0===dn?"https://validator.swagger.io/validator":dn},It}return(0,g.default)(pt,[{key:"UNSAFE_componentWillReceiveProps",value:function(ht){var wt=(0,ht.getConfigs)().validatorUrl;this.setState({url:this.getDefinitionUrl(),validatorUrl:void 0===wt?"https://validator.swagger.io/validator":wt})}},{key:"render",value:function(){var ht,wt,It=(0,this.props.getConfigs)().spec,dn=(0,_e.Nm)(this.state.validatorUrl);return"object"===(0,o.default)(It)&&(0,W.default)(It).length?null:this.state.url&&(0,_e.hW)(this.state.validatorUrl)&&(0,_e.hW)(this.state.url)?ie.default.createElement("span",{className:"float-right"},ie.default.createElement("a",{target:"_blank",rel:"noopener noreferrer",href:(0,re.default)(ht="".concat(dn,"/debug?url=")).call(ht,encodeURIComponent(this.state.url))},ie.default.createElement(ke,{src:(0,re.default)(wt="".concat(dn,"?url=")).call(wt,encodeURIComponent(this.state.url)),alt:"Online validator badge"}))):null}}]),pt}(ie.default.Component),ke=function(xe){(0,D.default)(pt,xe);var U=(0,P.default)(pt);function pt(ht){var wt;return(0,c.default)(this,pt),(wt=U.call(this,ht)).state={loaded:!1,error:!1},wt}return(0,g.default)(pt,[{key:"componentDidMount",value:function(){var ht=this,wt=new Image;wt.onload=function(){ht.setState({loaded:!0})},wt.onerror=function(){ht.setState({error:!0})},wt.src=this.props.src}},{key:"UNSAFE_componentWillReceiveProps",value:function(ht){var wt=this;if(ht.src!==this.props.src){var It=new Image;It.onload=function(){wt.setState({loaded:!0})},It.onerror=function(){wt.setState({error:!0})},It.src=ht.src}}},{key:"render",value:function(){return this.state.error?ie.default.createElement("img",{alt:"Error"}):this.state.loaded?ie.default.createElement("img",{src:this.props.src,alt:this.props.alt}):null}}]),pt}(ie.default.Component)},5466:(n,s,t)=>{t.d(s,{Z:()=>j,s:()=>W});var o=t(810),c=(t(5053),t(3952));const g=(t.d(ie={},{linkify:()=>Nx}),ie),C=(re=>{var ie={};return t.d(ie,re),ie})({default:()=>QM()});var ie,D=t(8096);function P(re){var ie=re.source,ge=re.className,_e=void 0===ge?"":ge,Le=re.getConfigs;if("string"!=typeof ie)return null;var Re=new c.Remarkable({html:!0,typographer:!0,breaks:!0,linkTarget:"_blank"}).use(g.linkify);Re.core.ruler.disable(["replacements","smartquotes"]);var ke=Le().useUnsafeMarkdown,xe=Re.render(ie),U=W(xe,{useUnsafeMarkdown:ke});return ie&&xe&&U?o.default.createElement("div",{className:(0,D.default)(_e,"markdown"),dangerouslySetInnerHTML:{__html:U}}):null}C.default.addHook&&C.default.addHook("beforeSanitizeElements",function(re){return re.href&&re.setAttribute("rel","noopener noreferrer"),re}),P.defaultProps={getConfigs:function(){return{useUnsafeMarkdown:!1}}};const j=P;function W(re){var ie=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},ge=ie.useUnsafeMarkdown,_e=void 0!==ge&&ge,Le=_e,Re=_e?[]:["style","class"];return _e&&!W.hasWarnedAboutDeprecation&&(console.warn("useUnsafeMarkdown display configuration parameter is deprecated since >3.26.0 and will be removed in v4.0.0."),W.hasWarnedAboutDeprecation=!0),C.default.sanitize(re,{ADD_ATTR:["target"],FORBID_TAGS:["style","form"],ALLOW_DATA_ATTR:Le,FORBID_ATTR:Re})}W.hasWarnedAboutDeprecation=!1},5308:(n,s,t)=>{t.r(s),t.d(s,{default:()=>W});var o,c=t(29),g=t(5487),C=t(6298),D=t(8102),P=t(5102),j={};const W=j;(0,c.default)(o=(0,g.default)(P).call(P)).call(o,function(re){if("./index.js"!==re){var ie=P(re);j[(0,C.Zl)(re)]=ie.default?ie.default:ie}}),j.SafeRender=D.default},5812:(n,s,t)=>{t.r(s),t.d(s,{SHOW_AUTH_POPUP:()=>j,AUTHORIZE:()=>W,LOGOUT:()=>re,PRE_AUTHORIZE_OAUTH2:()=>ie,AUTHORIZE_OAUTH2:()=>ge,VALIDATE:()=>_e,CONFIGURE_AUTH:()=>Le,RESTORE_AUTHORIZATION:()=>Re,showDefinitions:()=>ke,authorize:()=>xe,authorizeWithPersistOption:()=>U,logout:()=>pt,logoutWithPersistOption:()=>ht,preAuthorizeImplicit:()=>wt,authorizeOauth2:()=>It,authorizeOauth2WithPersistOption:()=>dn,authorizePassword:()=>Lt,authorizeApplication:()=>Dn,authorizeAccessCodeWithFormParams:()=>Mn,authorizeAccessCodeWithBasicAuthentication:()=>$r,authorizeRequest:()=>ur,configureAuth:()=>Pr,restoreAuthorization:()=>xr,persistAuthorizationIfNeeded:()=>fn,authPopup:()=>Nn});var o=t(1581),c=t(313),g=t(7512),C=t(8900),D=t(7504),P=t(6298),j="show_popup",W="authorize",re="logout",ie="pre_authorize_oauth2",ge="authorize_oauth2",_e="validate",Le="configure_auth",Re="restore_authorization";function ke($n){return{type:j,payload:$n}}function xe($n){return{type:W,payload:$n}}var U=function($n){return function(Qn){var Tn=Qn.authActions;Tn.authorize($n),Tn.persistAuthorizationIfNeeded()}};function pt($n){return{type:re,payload:$n}}var ht=function($n){return function(Qn){var Tn=Qn.authActions;Tn.logout($n),Tn.persistAuthorizationIfNeeded()}},wt=function($n){return function(Qn){var Tn=Qn.authActions,Yr=Qn.errActions,ji=$n.auth,ii=$n.token,Ui=$n.isValid,An=ji.name,hn=ji.schema.get("flow");delete D.Z.swaggerUIRedirectOauth2,"accessCode"===hn||Ui||Yr.newAuthErr({authId:An,source:"auth",level:"warning",message:"Authorization may be unsafe, passed state was changed in server Passed state wasn't returned from auth server"}),ii.error?Yr.newAuthErr({authId:An,source:"auth",level:"error",message:(0,c.default)(ii)}):Tn.authorizeOauth2WithPersistOption({auth:ji,token:ii})}};function It($n){return{type:ge,payload:$n}}var dn=function($n){return function(Qn){var Tn=Qn.authActions;Tn.authorizeOauth2($n),Tn.persistAuthorizationIfNeeded()}},Lt=function($n){return function(Qn){var qi,Zo,bo,Tn=Qn.authActions,Yr=$n.schema,ji=$n.name,ii=$n.username,Ui=$n.password,Jr=$n.passwordType,An=$n.clientId,hn=$n.clientSecret,qr={grant_type:"password",scope:$n.scopes.join(" "),username:ii,password:Ui},Ri={};switch(Jr){case"request-body":qi=qr,bo=hn,(Zo=An)&&(0,g.default)(qi,{client_id:Zo}),bo&&(0,g.default)(qi,{client_secret:bo});break;case"basic":Ri.Authorization="Basic "+(0,P.r3)(An+":"+hn);break;default:console.warn("Warning: invalid passwordType ".concat(Jr," was passed, not including client id and secret"))}return Tn.authorizeRequest({body:(0,P.GZ)(qr),url:Yr.get("tokenUrl"),name:ji,headers:Ri,query:{},auth:$n})}},Dn=function($n){return function(Qn){var Tn=Qn.authActions,Yr=$n.schema,ji=$n.scopes,ii=$n.name,An={Authorization:"Basic "+(0,P.r3)($n.clientId+":"+$n.clientSecret)},hn={grant_type:"client_credentials",scope:ji.join(" ")};return Tn.authorizeRequest({body:(0,P.GZ)(hn),name:ii,url:Yr.get("tokenUrl"),auth:$n,headers:An})}},Mn=function($n){var Qn=$n.auth,Tn=$n.redirectUrl;return function(Yr){var ii=Qn.schema,Ui=Qn.name;return Yr.authActions.authorizeRequest({body:(0,P.GZ)({grant_type:"authorization_code",code:Qn.code,client_id:Qn.clientId,client_secret:Qn.clientSecret,redirect_uri:Tn,code_verifier:Qn.codeVerifier}),name:Ui,url:ii.get("tokenUrl"),auth:Qn})}},$r=function($n){var Qn=$n.auth,Tn=$n.redirectUrl;return function(Yr){var ji=Yr.authActions,ii=Qn.schema,Ui=Qn.name,Jr=Qn.clientId,hn=Qn.codeVerifier,qr={Authorization:"Basic "+(0,P.r3)(Jr+":"+Qn.clientSecret)};return ji.authorizeRequest({body:(0,P.GZ)({grant_type:"authorization_code",code:Qn.code,client_id:Jr,redirect_uri:Tn,code_verifier:hn}),name:Ui,url:ii.get("tokenUrl"),auth:Qn,headers:qr})}},ur=function($n){return function(Qn){var Tn,Yr=Qn.fn,ji=Qn.getConfigs,ii=Qn.authActions,Ui=Qn.errActions,Jr=Qn.oas3Selectors,An=Qn.specSelectors,qr=$n.body,Ri=$n.query,qi=void 0===Ri?{}:Ri,Zo=$n.headers,bo=void 0===Zo?{}:Zo,Ys=$n.name,Ws=$n.url,wi=$n.auth,lo=(Qn.authSelectors.getConfigs()||{}).additionalQueryStringParams;if(An.isOAS3()){var go=Jr.serverEffectiveValue(Jr.selectedServer());Tn=(0,C.default)(Ws,go,!0)}else Tn=(0,C.default)(Ws,An.url(),!0);"object"===(0,o.default)(lo)&&(Tn.query=(0,g.default)({},Tn.query,lo));var Ge=Tn.toString(),St=(0,g.default)({Accept:"application/json, text/plain, */*","Content-Type":"application/x-www-form-urlencoded","X-Requested-With":"XMLHttpRequest"},bo);Yr.fetch({url:Ge,method:"post",headers:St,query:qi,body:qr,requestInterceptor:ji().requestInterceptor,responseInterceptor:ji().responseInterceptor}).then(function(Et){var Bn=JSON.parse(Et.data);Et.ok?Bn&&Bn.error||Bn&&Bn.parseError?Ui.newAuthErr({authId:Ys,level:"error",source:"auth",message:(0,c.default)(Bn)}):ii.authorizeOauth2WithPersistOption({auth:wi,token:Bn}):Ui.newAuthErr({authId:Ys,level:"error",source:"auth",message:Et.statusText})}).catch(function(Et){var Bn=new Error(Et).message;if(Et.response&&Et.response.data){var _r=Et.response.data;try{var Gr="string"==typeof _r?JSON.parse(_r):_r;Gr.error&&(Bn+=", error: ".concat(Gr.error)),Gr.error_description&&(Bn+=", description: ".concat(Gr.error_description))}catch(xi){}}Ui.newAuthErr({authId:Ys,level:"error",source:"auth",message:Bn})})}};function Pr($n){return{type:Le,payload:$n}}function xr($n){return{type:Re,payload:$n}}var fn=function(){return function($n){var Qn=$n.authSelectors;if((0,$n.getConfigs)().persistAuthorization){var Tn=Qn.authorized();localStorage.setItem("authorized",(0,c.default)(Tn.toJS()))}}},Nn=function($n,Qn){return function(){D.Z.swaggerUIRedirectOauth2=Qn,D.Z.open($n)}}},3705:(n,s,t)=>{t.r(s),t.d(s,{default:()=>W,preauthorizeBasic:()=>re,preauthorizeApiKey:()=>ie});var o=t(775),c=t(5527),g=t(5171),C=t(3962),D=t(5812),P=t(35),j=t(8302);function W(){return{afterLoad:function(ge){this.rootInjects=this.rootInjects||{},this.rootInjects.initOAuth=ge.authActions.configureAuth,this.rootInjects.preauthorizeApiKey=(0,c.default)(ie).call(ie,null,ge),this.rootInjects.preauthorizeBasic=(0,c.default)(re).call(re,null,ge)},statePlugins:{auth:{reducers:C.default,actions:D,selectors:P},spec:{wrapActions:j}}}}function re(ge,_e,Le,Re){var ke,xe=ge.authActions.authorize,U=ge.specSelectors,pt=U.specJson,ht=(0,U.isOAS3)()?["components","securitySchemes"]:["securityDefinitions"],wt=pt().getIn((0,g.default)(ke=[]).call(ke,ht,[_e]));return wt?xe((0,o.default)({},_e,{value:{username:Le,password:Re},schema:wt.toJS()})):null}function ie(ge,_e,Le){var Re,ke=ge.authActions.authorize,xe=ge.specSelectors,U=xe.specJson,pt=(0,xe.isOAS3)()?["components","securitySchemes"]:["securityDefinitions"],ht=U().getIn((0,g.default)(Re=[]).call(Re,pt,[_e]));return ht?ke((0,o.default)({},_e,{value:Le,schema:ht.toJS()})):null}},3962:(n,s,t)=>{t.r(s),t.d(s,{default:()=>re});var o,c=t(775),g=t(9334),C=t(29),D=t(7512),P=t(9725),j=t(6298),W=t(5812);const re=((0,c.default)(o={},W.SHOW_AUTH_POPUP,function(ie,ge){return ie.set("showDefinitions",ge.payload)}),(0,c.default)(o,W.AUTHORIZE,function(ie,ge){var _e,Re=(0,P.fromJS)(ge.payload),ke=ie.get("authorized")||(0,P.Map)();return(0,C.default)(_e=Re.entrySeq()).call(_e,function(xe){var U=(0,g.default)(xe,2),pt=U[0],ht=U[1];if(!(0,j.Wl)(ht.getIn))return ie.set("authorized",ke);var wt=ht.getIn(["schema","type"]);if("apiKey"===wt||"http"===wt)ke=ke.set(pt,ht);else if("basic"===wt){var It=ht.getIn(["value","username"]),dn=ht.getIn(["value","password"]);ke=(ke=ke.setIn([pt,"value"],{username:It,header:"Basic "+(0,j.r3)(It+":"+dn)})).setIn([pt,"schema"],ht.get("schema"))}}),ie.set("authorized",ke)}),(0,c.default)(o,W.AUTHORIZE_OAUTH2,function(ie,ge){var _e,Le=ge.payload,Re=Le.auth;Re.token=(0,D.default)({},Le.token),_e=(0,P.fromJS)(Re);var xe=ie.get("authorized")||(0,P.Map)();return xe=xe.set(_e.get("name"),_e),ie.set("authorized",xe)}),(0,c.default)(o,W.LOGOUT,function(ie,ge){var _e=ge.payload,Le=ie.get("authorized").withMutations(function(Re){(0,C.default)(_e).call(_e,function(ke){Re.delete(ke)})});return ie.set("authorized",Le)}),(0,c.default)(o,W.CONFIGURE_AUTH,function(ie,ge){return ie.set("configs",ge.payload)}),(0,c.default)(o,W.RESTORE_AUTHORIZATION,function(ie,ge){return ie.set("authorized",(0,P.fromJS)(ge.payload.authorized))}),o)},35:(n,s,t)=>{t.r(s),t.d(s,{shownDefinitions:()=>ge,definitionsToAuthorize:()=>_e,getDefinitionsByNames:()=>Le,definitionsForRequirements:()=>Re,authorized:()=>ke,isAuthorized:()=>xe,getConfigs:()=>U});var o=t(9334),c=t(29),g=t(6145),C=t(9963),D=t(8818),P=t(2565),j=t(2740),W=t(8639),re=t(9725),ie=function(pt){return pt},ge=(0,W.createSelector)(ie,function(pt){return pt.get("showDefinitions")}),_e=(0,W.createSelector)(ie,function(){return function(pt){var ht,wt=pt.specSelectors.securityDefinitions()||(0,re.Map)({}),It=(0,re.List)();return(0,c.default)(ht=wt.entrySeq()).call(ht,function(dn){var Lt=(0,o.default)(dn,2),Dn=Lt[0],Mn=Lt[1],$r=(0,re.Map)();$r=$r.set(Dn,Mn),It=It.push($r)}),It}}),Le=function(pt,ht){return function(wt){var It,dn=wt.specSelectors;console.warn("WARNING: getDefinitionsByNames is deprecated and will be removed in the next major version.");var Lt=dn.securityDefinitions(),Dn=(0,re.List)();return(0,c.default)(It=ht.valueSeq()).call(It,function(Mn){var $r,ur=(0,re.Map)();(0,c.default)($r=Mn.entrySeq()).call($r,function(Pr){var xr,fn,Nn=(0,o.default)(Pr,2),$n=Nn[0],Qn=Nn[1],Tn=Lt.get($n);"oauth2"===Tn.get("type")&&Qn.size&&(xr=Tn.get("scopes"),(0,c.default)(fn=xr.keySeq()).call(fn,function(Yr){Qn.contains(Yr)||(xr=xr.delete(Yr))}),Tn=Tn.set("allowedScopes",xr)),ur=ur.set($n,Tn)}),Dn=Dn.push(ur)}),Dn}},Re=function(pt){var ht=arguments.length>1&&void 0!==arguments[1]?arguments[1]:(0,re.List)();return function(wt){var It=wt.authSelectors.definitionsToAuthorize()||(0,re.List)();return(0,g.default)(It).call(It,function(dn){return(0,C.default)(ht).call(ht,function(Lt){return Lt.get(dn.keySeq().first())})})}},ke=(0,W.createSelector)(ie,function(pt){return pt.get("authorized")||(0,re.Map)()}),xe=function(pt,ht){return function(wt){var It,dn=wt.authSelectors.authorized();return re.List.isList(ht)?!!(0,g.default)(It=ht.toJS()).call(It,function(Lt){var Dn,Mn;return-1===(0,D.default)(Dn=(0,P.default)(Mn=(0,j.default)(Lt)).call(Mn,function($r){return!!dn.get($r)})).call(Dn,!1)}).length:null}},U=(0,W.createSelector)(ie,function(pt){return pt.get("configs")})},8302:(n,s,t)=>{t.r(s),t.d(s,{execute:()=>c});var o=t(1013),c=function(g,C){var D=C.authSelectors,P=C.specSelectors;return function(j){var W=j.path,re=j.method,ie=j.operation,ge=j.extras,_e={authorized:D.authorized()&&D.authorized().toJS(),definitions:P.securityDefinitions()&&P.securityDefinitions().toJS(),specSecurity:P.security()&&P.security().toJS()};return g((0,o.default)({path:W,method:re,operation:ie,securities:_e},ge))}}},714:(n,s,t)=>{t.r(s),t.d(s,{UPDATE_CONFIGS:()=>c,TOGGLE_CONFIGS:()=>g,update:()=>C,toggle:()=>D,loaded:()=>P});var o=t(775),c="configs_update",g="configs_toggle";function C(j,W){return{type:c,payload:(0,o.default)({},j,W)}}function D(j){return{type:g,payload:j}}var P=function(){return function(j){var re=j.authActions;if((0,j.getConfigs)().persistAuthorization){var ie=localStorage.getItem("authorized");ie&&re.restoreAuthorization({authorized:JSON.parse(ie)})}}}},2256:(n,s,t)=>{t.r(s),t.d(s,{parseYamlConfig:()=>c});var o=t(626),c=function(g,C){try{return o.default.load(g)}catch(D){return C&&C.errActions.newThrownErr(new Error(D)),{}}}},1661:(n,s,t)=>{t.r(s),t.d(s,{default:()=>W});var o=t(5163),c=t(2256),g=t(714),C=t(2698),D=t(9018),P=t(7743),j={getLocalConfig:function(){return(0,c.parseYamlConfig)(o)}};function W(){return{statePlugins:{spec:{actions:C,selectors:j},configs:{reducers:P.default,actions:g,selectors:D}}}}},7743:(n,s,t)=>{t.r(s),t.d(s,{default:()=>D});var o,c=t(775),g=t(9725),C=t(714);const D=((0,c.default)(o={},C.UPDATE_CONFIGS,function(P,j){return P.merge((0,g.fromJS)(j.payload))}),(0,c.default)(o,C.TOGGLE_CONFIGS,function(P,j){var W=j.payload,re=P.get(W);return P.set(W,!re)}),o)},9018:(n,s,t)=>{t.r(s),t.d(s,{get:()=>c});var o=t(4163),c=function(g,C){return g.getIn((0,o.default)(C)?C:[C])}},2698:(n,s,t)=>{t.r(s),t.d(s,{downloadConfig:()=>c,getConfigByUrl:()=>g});var o=t(2256),c=function(C){return function(D){return(0,D.fn.fetch)(C)}},g=function(C,D){return function(P){var j=P.specActions;if(C)return j.downloadConfig(C).then(W,W);function W(re){re instanceof Error||re.status>=400?(j.updateLoadingStatus("failedConfig"),j.updateLoadingStatus("failedConfig"),j.updateUrl(""),console.error(re.statusText+" "+C.url),D(null)):D((0,o.parseYamlConfig)(re.text))}}}},1970:(n,s,t)=>{t.r(s),t.d(s,{setHash:()=>o});var o=function(c){return c?history.pushState(null,null,"#".concat(c)):window.location.hash=""}},4980:(n,s,t)=>{t.r(s),t.d(s,{default:()=>C});var o=t(5858),c=t(877),g=t(4584);function C(){return[o.default,{statePlugins:{configs:{wrapActions:{loaded:function(D,P){return function(){D.apply(void 0,arguments);var j=decodeURIComponent(window.location.hash);P.layoutActions.parseDeepLinkHash(j)}}}}},wrapComponents:{operation:c.default,OperationTag:g.default}}]}},5858:(n,s,t)=>{t.r(s),t.d(s,{clearScrollTo:()=>wt,default:()=>It,parseDeepLinkHash:()=>U,readyToScroll:()=>pt,scrollTo:()=>xe,scrollToElement:()=>ht,show:()=>ke});var o=t(775),c=t(9334),g=t(4163),C=t(5171),D=t(8136),P=t(2565),j=t(8818),W=t(1970);const re=(t.d(Lt={},{default:()=>ZR()}),Lt);var Lt,ie,ge=t(6298),_e=t(9725),Le="layout_scroll_to",Re="layout_clear_scroll",ke=function(dn,Lt){var Dn=Lt.getConfigs,Mn=Lt.layoutSelectors;return function(){for(var $r=arguments.length,ur=new Array($r),Pr=0;Pr<$r;Pr++)ur[Pr]=arguments[Pr];if(dn.apply(void 0,ur),Dn().deepLinking)try{var xr=ur[0],fn=ur[1];xr=(0,g.default)(xr)?xr:[xr];var Nn=Mn.urlHashArrayFromIsShownKey(xr);if(!Nn.length)return;var $n,Qn=(0,c.default)(Nn,2),Tn=Qn[0],Yr=Qn[1];if(!fn)return(0,W.setHash)("/");2===Nn.length?(0,W.setHash)((0,ge.oJ)((0,C.default)($n="/".concat(encodeURIComponent(Tn),"/")).call($n,encodeURIComponent(Yr)))):1===Nn.length&&(0,W.setHash)((0,ge.oJ)("/".concat(encodeURIComponent(Tn))))}catch(ji){console.error(ji)}}},xe=function(dn){return{type:Le,payload:(0,g.default)(dn)?dn:[dn]}},U=function(dn){return function(Lt){var Dn=Lt.layoutActions,Mn=Lt.layoutSelectors;if((0,Lt.getConfigs)().deepLinking&&dn){var $r,ur=(0,D.default)(dn).call(dn,1);"!"===ur[0]&&(ur=(0,D.default)(ur).call(ur,1)),"/"===ur[0]&&(ur=(0,D.default)(ur).call(ur,1));var Pr=(0,P.default)($r=ur.split("/")).call($r,function(ii){return ii||""}),xr=Mn.isShownKeyFromUrlHashArray(Pr),fn=(0,c.default)(xr,3),$n=fn[1],Qn=void 0===$n?"":$n,Tn=fn[2],Yr=void 0===Tn?"":Tn;if("operations"===fn[0]){var ji=Mn.isShownKeyFromUrlHashArray([Qn]);(0,j.default)(Qn).call(Qn,"_")>-1&&(console.warn("Warning: escaping deep link whitespace with `_` will be unsupported in v4.0, use `%20` instead."),Dn.show((0,P.default)(ji).call(ji,function(ii){return ii.replace(/_/g," ")}),!0)),Dn.show(ji,!0)}((0,j.default)(Qn).call(Qn,"_")>-1||(0,j.default)(Yr).call(Yr,"_")>-1)&&(console.warn("Warning: escaping deep link whitespace with `_` will be unsupported in v4.0, use `%20` instead."),Dn.show((0,P.default)(xr).call(xr,function(ii){return ii.replace(/_/g," ")}),!0)),Dn.show(xr,!0),Dn.scrollTo(xr)}}},pt=function(dn,Lt){return function(Dn){var Mn=Dn.layoutSelectors.getScrollToKey();_e.default.is(Mn,(0,_e.fromJS)(dn))&&(Dn.layoutActions.scrollToElement(Lt),Dn.layoutActions.clearScrollTo())}},ht=function(dn,Lt){return function(Dn){try{Lt=Lt||Dn.fn.getScrollParent(dn),re.default.createScroller(Lt).to(dn)}catch(Mn){console.error(Mn)}}},wt=function(){return{type:Re}};const It={fn:{getScrollParent:function(dn,Lt){var Dn=document.documentElement,Mn=getComputedStyle(dn),$r="absolute"===Mn.position,ur=Lt?/(auto|scroll|hidden)/:/(auto|scroll)/;if("fixed"===Mn.position)return Dn;for(var Pr=dn;Pr=Pr.parentElement;)if(Mn=getComputedStyle(Pr),(!$r||"static"!==Mn.position)&&ur.test(Mn.overflow+Mn.overflowY+Mn.overflowX))return Pr;return Dn}},statePlugins:{layout:{actions:{scrollToElement:ht,scrollTo:xe,clearScrollTo:wt,readyToScroll:pt,parseDeepLinkHash:U},selectors:{getScrollToKey:function(dn){return dn.get("scrollToKey")},isShownKeyFromUrlHashArray:function(dn,Lt){var Dn=(0,c.default)(Lt,2),Mn=Dn[0],$r=Dn[1];return $r?["operations",Mn,$r]:Mn?["operations-tag",Mn]:[]},urlHashArrayFromIsShownKey:function(dn,Lt){var Dn=(0,c.default)(Lt,3),Mn=Dn[0],$r=Dn[1];return"operations"==Mn?[$r,Dn[2]]:"operations-tag"==Mn?[$r]:[]}},reducers:(ie={},(0,o.default)(ie,Le,function(dn,Lt){return dn.set("scrollToKey",_e.default.fromJS(Lt.payload))}),(0,o.default)(ie,Re,function(dn){return dn.delete("scrollToKey")}),ie),wrapActions:{show:ke}}}}},4584:(n,s,t)=>{t.r(s),t.d(s,{default:()=>re});var o=t(7344),c=t(8656),g=t(6340),C=t(9972),D=t(5416),P=t(775),j=t(5171),W=t(810);t(5053);const re=function(ie,ge){return function(_e){(0,C.default)(Re,_e);var Le=(0,D.default)(Re);function Re(){var ke,xe;(0,o.default)(this,Re);for(var U=arguments.length,pt=new Array(U),ht=0;ht<U;ht++)pt[ht]=arguments[ht];return xe=Le.call.apply(Le,(0,j.default)(ke=[this]).call(ke,pt)),(0,P.default)((0,g.default)(xe),"onLoad",function(wt){ge.layoutActions.readyToScroll(["operations-tag",xe.props.tag],wt)}),xe}return(0,c.default)(Re,[{key:"render",value:function(){return W.default.createElement("span",{ref:this.onLoad},W.default.createElement(ie,this.props))}}]),Re}(W.default.Component)}},877:(n,s,t)=>{t.r(s),t.d(s,{default:()=>re});var o=t(7344),c=t(8656),g=t(6340),C=t(9972),D=t(5416),P=t(775),j=t(5171),W=t(810);t(9569);const re=function(ie,ge){return function(_e){(0,C.default)(Re,_e);var Le=(0,D.default)(Re);function Re(){var ke,xe;(0,o.default)(this,Re);for(var U=arguments.length,pt=new Array(U),ht=0;ht<U;ht++)pt[ht]=arguments[ht];return xe=Le.call.apply(Le,(0,j.default)(ke=[this]).call(ke,pt)),(0,P.default)((0,g.default)(xe),"onLoad",function(wt){var It=xe.props.operation,dn=It.toObject(),Lt=dn.tag,Dn=dn.operationId,Mn=It.toObject().isShownKey;ge.layoutActions.readyToScroll(Mn=Mn||["operations",Lt,Dn],wt)}),xe}return(0,c.default)(Re,[{key:"render",value:function(){return W.default.createElement("span",{ref:this.onLoad},W.default.createElement(ie,this.props))}}]),Re}(W.default.Component)}},8011:(n,s,t)=>{t.r(s),t.d(s,{default:()=>re});var o=t(7512),c=t(3769),g=t(5171),C=t(8818),D=t(313),P=t(8639),j=t(9725),W=t(7504);function re(ie){var ge=ie.fn;return{statePlugins:{spec:{actions:{download:function(_e){return function(Le){var Re=Le.errActions,ke=Le.specSelectors,xe=Le.specActions,pt=ge.fetch,ht=(0,Le.getConfigs)();function wt(It){if(It instanceof Error||It.status>=400)return xe.updateLoadingStatus("failed"),Re.newThrownErr((0,o.default)(new Error((It.message||It.statusText)+" "+_e),{source:"fetch"})),void(!It.status&&It instanceof Error&&function(){try{var dn;if("URL"in W.Z?dn=new c.default(_e):(dn=document.createElement("a")).href=_e,"https:"!==dn.protocol&&"https:"===W.Z.location.protocol){var Lt=(0,o.default)(new Error("Possible mixed-content issue? The page was loaded over https:// but a ".concat(dn.protocol,"// URL was specified. Check that you are not attempting to load mixed content.")),{source:"fetch"});return void Re.newThrownErr(Lt)}if(dn.origin!==W.Z.location.origin){var Dn,Mn=(0,o.default)(new Error((0,g.default)(Dn="Possible cross-origin (CORS) issue? The URL origin (".concat(dn.origin,") does not match the page (")).call(Dn,W.Z.location.origin,"). Check the server returns the correct 'Access-Control-Allow-*' headers.")),{source:"fetch"});Re.newThrownErr(Mn)}}catch($r){return}}());xe.updateLoadingStatus("success"),xe.updateSpec(It.text),ke.url()!==_e&&xe.updateUrl(_e)}_e=_e||ke.url(),xe.updateLoadingStatus("loading"),Re.clear({source:"fetch"}),pt({url:_e,loadSpec:!0,requestInterceptor:ht.requestInterceptor||function(It){return It},responseInterceptor:ht.responseInterceptor||function(It){return It},credentials:"same-origin",headers:{Accept:"application/json,*/*"}}).then(wt,wt)}},updateLoadingStatus:function(_e){var Le,Re=[null,"loading","failed","success","failedConfig"];return-1===(0,C.default)(Re).call(Re,_e)&&console.error((0,g.default)(Le="Error: ".concat(_e," is not one of ")).call(Le,(0,D.default)(Re))),{type:"spec_update_loading_status",payload:_e}}},reducers:{spec_update_loading_status:function(_e,Le){return"string"==typeof Le.payload?_e.set("loadingStatus",Le.payload):_e}},selectors:{loadingStatus:(0,P.createSelector)(function(_e){return _e||(0,j.Map)()},function(_e){return _e.get("loadingStatus")||null})}}}}}},4966:(n,s,t)=>{t.r(s),t.d(s,{NEW_THROWN_ERR:()=>c,NEW_THROWN_ERR_BATCH:()=>g,NEW_SPEC_ERR:()=>C,NEW_SPEC_ERR_BATCH:()=>D,NEW_AUTH_ERR:()=>P,CLEAR:()=>j,CLEAR_BY:()=>W,newThrownErr:()=>re,newThrownErrBatch:()=>ie,newSpecErr:()=>ge,newSpecErrBatch:()=>_e,newAuthErr:()=>Le,clear:()=>Re,clearBy:()=>ke});var o=t(8518),c="err_new_thrown_err",g="err_new_thrown_err_batch",C="err_new_spec_err",D="err_new_spec_err_batch",P="err_new_auth_err",j="err_clear",W="err_clear_by";function re(xe){return{type:c,payload:(0,o.serializeError)(xe)}}function ie(xe){return{type:g,payload:xe}}function ge(xe){return{type:C,payload:xe}}function _e(xe){return{type:D,payload:xe}}function Le(xe){return{type:P,payload:xe}}function Re(){var xe=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};return{type:j,payload:xe}}function ke(){var xe=arguments.length>0&&void 0!==arguments[0]?arguments[0]:function(){return!0};return{type:W,payload:xe}}},6808:(n,s,t)=>{t.r(s),t.d(s,{default:()=>D});var o=t(6145),c=t(2565);const g=(t.d(j={},{default:()=>Fx()}),j);var j,C=[t(2392),t(1835)];function D(P){var j,W={jsSpec:{}},re=(0,g.default)(C,function(ie,ge){try{var _e=ge.transform(ie,W);return(0,o.default)(_e).call(_e,function(Le){return!!Le})}catch(Le){return console.error("Transformer error:",Le),ie}},P);return(0,c.default)(j=(0,o.default)(re).call(re,function(ie){return!!ie})).call(j,function(ie){return!ie.get("line")&&ie.get("path"),ie})}},2392:(n,s,t)=>{t.r(s),t.d(s,{transform:()=>D});var o=t(2565),c=t(8818),g=t(8136),C=t(6785);function D(P){return(0,o.default)(P).call(P,function(j){var W,Re,re="is not of a type(s)",ie=(0,c.default)(W=j.get("message")).call(W,re);if(ie>-1){var ge,_e,Le=(0,g.default)(ge=j.get("message")).call(ge,ie+re.length).split(",");return j.set("message",(0,g.default)(_e=j.get("message")).call(_e,0,ie)+(0,C.default)(Re=Le).call(Re,function(ke,xe,U,pt){return U===pt.length-1&&pt.length>1?ke+"or "+xe:pt[U+1]&&pt.length>2?ke+xe+", ":pt[U+1]?ke+xe+" ":ke+xe},"should be a"))}return j})}},1835:(n,s,t)=>{function o(c,g){return c}t.r(s),t.d(s,{transform:()=>o}),t(2565),t(8818),t(9908),t(9725)},7793:(n,s,t)=>{t.r(s),t.d(s,{default:()=>C});var o=t(3527),c=t(4966),g=t(7667);function C(D){return{statePlugins:{err:{reducers:(0,o.default)(D),actions:c,selectors:g}}}}},3527:(n,s,t)=>{t.r(s),t.d(s,{default:()=>ge});var o=t(775),c=t(7512),g=t(2565),C=t(5171),D=t(6145),P=t(7930),j=t(4966),W=t(9725),re=t(6808),ie={line:0,level:"error",message:"Unknown error"};function ge(){var _e;return(0,o.default)(_e={},j.NEW_THROWN_ERR,function(Le,Re){var xe=(0,c.default)(ie,Re.payload,{type:"thrown"});return Le.update("errors",function(U){return(U||(0,W.List)()).push((0,W.fromJS)(xe))}).update("errors",function(U){return(0,re.default)(U)})}),(0,o.default)(_e,j.NEW_THROWN_ERR_BATCH,function(Le,Re){var ke=Re.payload;return ke=(0,g.default)(ke).call(ke,function(xe){return(0,W.fromJS)((0,c.default)(ie,xe,{type:"thrown"}))}),Le.update("errors",function(xe){var U;return(0,C.default)(U=xe||(0,W.List)()).call(U,(0,W.fromJS)(ke))}).update("errors",function(xe){return(0,re.default)(xe)})}),(0,o.default)(_e,j.NEW_SPEC_ERR,function(Le,Re){var xe=(0,W.fromJS)(Re.payload);return xe=xe.set("type","spec"),Le.update("errors",function(U){return(U||(0,W.List)()).push((0,W.fromJS)(xe)).sortBy(function(pt){return pt.get("line")})}).update("errors",function(U){return(0,re.default)(U)})}),(0,o.default)(_e,j.NEW_SPEC_ERR_BATCH,function(Le,Re){var ke=Re.payload;return ke=(0,g.default)(ke).call(ke,function(xe){return(0,W.fromJS)((0,c.default)(ie,xe,{type:"spec"}))}),Le.update("errors",function(xe){var U;return(0,C.default)(U=xe||(0,W.List)()).call(U,(0,W.fromJS)(ke))}).update("errors",function(xe){return(0,re.default)(xe)})}),(0,o.default)(_e,j.NEW_AUTH_ERR,function(Le,Re){var xe=(0,W.fromJS)((0,c.default)({},Re.payload));return xe=xe.set("type","auth"),Le.update("errors",function(U){return(U||(0,W.List)()).push((0,W.fromJS)(xe))}).update("errors",function(U){return(0,re.default)(U)})}),(0,o.default)(_e,j.CLEAR,function(Le,Re){var ke,xe=Re.payload;if(!xe||!Le.get("errors"))return Le;var U=(0,D.default)(ke=Le.get("errors")).call(ke,function(pt){var ht;return(0,P.default)(ht=pt.keySeq()).call(ht,function(wt){var It=pt.get(wt),dn=xe[wt];return!dn||It!==dn})});return Le.merge({errors:U})}),(0,o.default)(_e,j.CLEAR_BY,function(Le,Re){var ke,xe=Re.payload;if(!xe||"function"!=typeof xe)return Le;var U=(0,D.default)(ke=Le.get("errors")).call(ke,function(pt){return xe(pt)});return Le.merge({errors:U})}),_e}},7667:(n,s,t)=>{t.r(s),t.d(s,{allErrors:()=>g,lastError:()=>C});var o=t(9725),c=t(8639),g=(0,c.createSelector)(function(D){return D},function(D){return D.get("errors",(0,o.List)())}),C=(0,c.createSelector)(g,function(D){return D.last()})},9978:(n,s,t)=>{t.r(s),t.d(s,{default:()=>c});var o=t(4309);function c(){return{fn:{opsFilter:o.default}}}},4309:(n,s,t)=>{t.r(s),t.d(s,{default:()=>g});var o=t(6145),c=t(8818);function g(C,D){return(0,o.default)(C).call(C,function(P,j){return-1!==(0,c.default)(j).call(j,D)})}},5474:(n,s,t)=>{t.r(s),t.d(s,{UPDATE_LAYOUT:()=>c,UPDATE_FILTER:()=>g,UPDATE_MODE:()=>C,SHOW:()=>D,updateLayout:()=>P,updateFilter:()=>j,show:()=>W,changeMode:()=>re});var o=t(6298),c="layout_update_layout",g="layout_update_filter",C="layout_update_mode",D="layout_show";function P(ie){return{type:c,payload:ie}}function j(ie){return{type:g,payload:ie}}function W(ie){var ge=!(arguments.length>1&&void 0!==arguments[1])||arguments[1];return ie=(0,o.AF)(ie),{type:D,payload:{thing:ie,shown:ge}}}function re(ie){var ge=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"";return ie=(0,o.AF)(ie),{type:C,payload:{thing:ie,mode:ge}}}},6821:(n,s,t)=>{t.r(s),t.d(s,{default:()=>D});var o=t(5672),c=t(5474),g=t(4400),C=t(8989);function D(){return{statePlugins:{layout:{reducers:o.default,actions:c,selectors:g},spec:{wrapSelectors:C}}}}},5672:(n,s,t)=>{t.r(s),t.d(s,{default:()=>P});var o,c=t(775),g=t(5171),C=t(9725),D=t(5474);const P=((0,c.default)(o={},D.UPDATE_LAYOUT,function(j,W){return j.set("layout",W.payload)}),(0,c.default)(o,D.UPDATE_FILTER,function(j,W){return j.set("filter",W.payload)}),(0,c.default)(o,D.SHOW,function(j,W){var re=W.payload.shown,ie=(0,C.fromJS)(W.payload.thing);return j.update("shown",(0,C.fromJS)({}),function(ge){return ge.set(ie,re)})}),(0,c.default)(o,D.UPDATE_MODE,function(j,W){var re,ie=W.payload.thing,ge=W.payload.mode;return j.setIn((0,g.default)(re=["modes"]).call(re,ie),(ge||"")+"")}),o)},4400:(n,s,t)=>{t.r(s),t.d(s,{current:()=>P,currentFilter:()=>j,isShown:()=>W,whatMode:()=>re,showSummary:()=>ie});var o=t(2691),c=t(5171),g=t(8639),C=t(6298),D=t(9725),P=function(ge){return ge.get("layout")},j=function(ge){return ge.get("filter")},W=function(ge,_e,Le){return _e=(0,C.AF)(_e),ge.get("shown",(0,D.fromJS)({})).get((0,D.fromJS)(_e),Le)},re=function(ge,_e){var Le,Re=arguments.length>2&&void 0!==arguments[2]?arguments[2]:"";return _e=(0,C.AF)(_e),ge.getIn((0,c.default)(Le=["modes"]).call(Le,(0,o.default)(_e)),Re)},ie=(0,g.createSelector)(function(ge){return ge},function(ge){return!W(ge,"editor")})},8989:(n,s,t)=>{t.r(s),t.d(s,{taggedOperations:()=>g});var o=t(5171),c=t(8136),g=function(C,D){return function(P){for(var j,W=arguments.length,re=new Array(W>1?W-1:0),ie=1;ie<W;ie++)re[ie-1]=arguments[ie];var ge=C.apply(void 0,(0,o.default)(j=[P]).call(j,re)),_e=D.getSystem(),Le=_e.fn,Re=_e.layoutSelectors,ke=_e.getConfigs,xe=ke(),U=xe.maxDisplayedTags,pt=Re.currentFilter();return pt&&!0!==pt&&"true"!==pt&&"false"!==pt&&(ge=Le.opsFilter(ge,pt)),U&&!isNaN(U)&&U>=0&&(ge=(0,c.default)(ge).call(ge,0,U)),ge}}},9150:(n,s,t)=>{t.r(s),t.d(s,{default:()=>c});var o=t(5527);function c(g){var D={debug:0,info:1,log:2,warn:3,error:4},P=function(ie){return D[ie]||-1},W=P(g.configs.logLevel);function re(ie){for(var ge,_e=arguments.length,Le=new Array(_e>1?_e-1:0),Re=1;Re<_e;Re++)Le[Re-1]=arguments[Re];P(ie)>=W&&(ge=console)[ie].apply(ge,Le)}return re.warn=(0,o.default)(re).call(re,null,"warn"),re.error=(0,o.default)(re).call(re,null,"error"),re.info=(0,o.default)(re).call(re,null,"info"),re.debug=(0,o.default)(re).call(re,null,"debug"),{rootInjects:{log:re}}}},7002:(n,s,t)=>{t.r(s),t.d(s,{UPDATE_SELECTED_SERVER:()=>o,UPDATE_REQUEST_BODY_VALUE:()=>c,UPDATE_REQUEST_BODY_VALUE_RETAIN_FLAG:()=>g,UPDATE_REQUEST_BODY_INCLUSION:()=>C,UPDATE_ACTIVE_EXAMPLES_MEMBER:()=>D,UPDATE_REQUEST_CONTENT_TYPE:()=>P,UPDATE_RESPONSE_CONTENT_TYPE:()=>j,UPDATE_SERVER_VARIABLE_VALUE:()=>W,SET_REQUEST_BODY_VALIDATE_ERROR:()=>re,CLEAR_REQUEST_BODY_VALIDATE_ERROR:()=>ie,CLEAR_REQUEST_BODY_VALUE:()=>ge,setSelectedServer:()=>_e,setRequestBodyValue:()=>Le,setRetainRequestBodyValueFlag:()=>Re,setRequestBodyInclusion:()=>ke,setActiveExamplesMember:()=>xe,setRequestContentType:()=>U,setResponseContentType:()=>pt,setServerVariableValue:()=>ht,setRequestBodyValidateError:()=>wt,clearRequestBodyValidateError:()=>It,initRequestBodyValidateError:()=>dn,clearRequestBodyValue:()=>Lt});var o="oas3_set_servers",c="oas3_set_request_body_value",g="oas3_set_request_body_retain_flag",C="oas3_set_request_body_inclusion",D="oas3_set_active_examples_member",P="oas3_set_request_content_type",j="oas3_set_response_content_type",W="oas3_set_server_variable_value",re="oas3_set_request_body_validate_error",ie="oas3_clear_request_body_validate_error",ge="oas3_clear_request_body_value";function _e(Dn,Mn){return{type:o,payload:{selectedServerUrl:Dn,namespace:Mn}}}function Le(Dn){return{type:c,payload:{value:Dn.value,pathMethod:Dn.pathMethod}}}var Re=function(Dn){return{type:g,payload:{value:Dn.value,pathMethod:Dn.pathMethod}}};function ke(Dn){return{type:C,payload:{value:Dn.value,pathMethod:Dn.pathMethod,name:Dn.name}}}function xe(Dn){return{type:D,payload:{name:Dn.name,pathMethod:Dn.pathMethod,contextType:Dn.contextType,contextName:Dn.contextName}}}function U(Dn){return{type:P,payload:{value:Dn.value,pathMethod:Dn.pathMethod}}}function pt(Dn){return{type:j,payload:{value:Dn.value,path:Dn.path,method:Dn.method}}}function ht(Dn){return{type:W,payload:{server:Dn.server,namespace:Dn.namespace,key:Dn.key,val:Dn.val}}}var wt=function(Dn){return{type:re,payload:{path:Dn.path,method:Dn.method,validationErrors:Dn.validationErrors}}},It=function(Dn){return{type:ie,payload:{path:Dn.path,method:Dn.method}}},dn=function(Dn){var Mn=Dn.pathMethod;return{type:ie,payload:{path:Mn[0],method:Mn[1]}}},Lt=function(Dn){return{type:ge,payload:{pathMethod:Dn.pathMethod}}}},3723:(n,s,t)=>{t.r(s),t.d(s,{definitionsToAuthorize:()=>ge});var ie,o=t(775),c=t(9334),g=t(5171),C=t(29),D=t(6145),P=t(6785),j=t(8639),W=t(9725),re=t(7779),ge=(ie=(0,j.createSelector)(function(_e){return _e},function(_e){return _e.specSelectors.securityDefinitions()},function(_e,Le){var Re,ke=(0,W.List)();return Le&&(0,C.default)(Re=Le.entrySeq()).call(Re,function(xe){var U,pt=(0,c.default)(xe,2),ht=pt[0],wt=pt[1],It=wt.get("type");if("oauth2"===It&&(0,C.default)(U=wt.get("flows").entrySeq()).call(U,function(Dn){var Mn=(0,c.default)(Dn,2),ur=Mn[1],Pr=(0,W.fromJS)({flow:Mn[0],authorizationUrl:ur.get("authorizationUrl"),tokenUrl:ur.get("tokenUrl"),scopes:ur.get("scopes"),type:wt.get("type"),description:wt.get("description")});ke=ke.push(new W.Map((0,o.default)({},ht,(0,D.default)(Pr).call(Pr,function(xr){return void 0!==xr}))))}),"http"!==It&&"apiKey"!==It||(ke=ke.push(new W.Map((0,o.default)({},ht,wt)))),"openIdConnect"===It&&wt.get("openIdConnectData")){var dn=wt.get("openIdConnectData"),Lt=dn.get("grant_types_supported")||["authorization_code","implicit"];(0,C.default)(Lt).call(Lt,function(Dn){var Mn,$r=dn.get("scopes_supported")&&(0,P.default)(Mn=dn.get("scopes_supported")).call(Mn,function(Pr,xr){return Pr.set(xr,"")},new W.Map),ur=(0,W.fromJS)({flow:Dn,authorizationUrl:dn.get("authorization_endpoint"),tokenUrl:dn.get("token_endpoint"),scopes:$r,type:"oauth2",openIdConnectUrl:wt.get("openIdConnectUrl")});ke=ke.push(new W.Map((0,o.default)({},ht,(0,D.default)(ur).call(ur,function(Pr){return void 0!==Pr}))))})}}),ke}),function(_e,Le){return function(){for(var Re=Le.getSystem().specSelectors.specJson(),ke=arguments.length,xe=new Array(ke),U=0;U<ke;U++)xe[U]=arguments[U];if((0,re.isOAS3)(Re)){var pt,ht=Le.getState().getIn(["spec","resolvedSubtrees","components","securitySchemes"]);return ie.apply(void 0,(0,g.default)(pt=[Le,ht]).call(pt,xe))}return _e.apply(void 0,xe)}})},3427:(n,s,t)=>{t.r(s),t.d(s,{default:()=>P});var o=t(863),c=t(9334),g=t(2565),C=t(810),D=(t(5053),t(9569),t(9725));const P=function(j){var W,re=j.callbacks,ge=j.specPath,_e=(0,j.getComponent)("OperationContainer",!0);if(!re)return C.default.createElement("span",null,"No callbacks");var Le=(0,g.default)(W=re.entrySeq()).call(W,function(Re){var ke,xe=(0,c.default)(Re,2),U=xe[0],pt=xe[1];return C.default.createElement("div",{key:U},C.default.createElement("h2",null,U),(0,g.default)(ke=pt.entrySeq()).call(ke,function(ht){var wt,It=(0,c.default)(ht,2),dn=It[0];return"$$ref"===dn?null:C.default.createElement("div",{key:dn},(0,g.default)(wt=It[1].entrySeq()).call(wt,function(Dn){var Mn=(0,c.default)(Dn,2),$r=Mn[0];if("$$ref"===$r)return null;var Pr=(0,D.fromJS)({operation:Mn[1]});return C.default.createElement(_e,(0,o.default)({},j,{op:Pr,key:$r,tag:"",method:$r,path:dn,specPath:ge.push(U,dn,$r),allowTryItOut:!1}))}))}))});return C.default.createElement("div",null,Le)}},6775:(n,s,t)=>{t.r(s),t.d(s,{default:()=>ge});var o=t(7344),c=t(8656),g=t(6340),C=t(9972),D=t(5416),P=t(775),j=t(7512),W=t(6145),re=t(2565),ie=t(810),ge=(t(5053),function(_e){(0,C.default)(Re,_e);var Le=(0,D.default)(Re);function Re(ke,xe){var U;(0,o.default)(this,Re),U=Le.call(this,ke,xe),(0,P.default)((0,g.default)(U),"onChange",function(dn){var Lt=U.props.onChange,Dn=dn.target,Mn=Dn.value,$r=Dn.name,ur=(0,j.default)({},U.state.value);$r?ur[$r]=Mn:ur=Mn,U.setState({value:ur},function(){return Lt(U.state)})});var pt=U.props,ht=pt.name,wt=pt.schema,It=U.getValue();return U.state={name:ht,schema:wt,value:It},U}return(0,c.default)(Re,[{key:"getValue",value:function(){var ke=this.props,U=ke.authorized;return U&&U.getIn([ke.name,"value"])}},{key:"render",value:function(){var ke,xe,U=this.props,pt=U.schema,ht=U.getComponent,wt=U.errSelectors,It=U.name,dn=ht("Input"),Lt=ht("Row"),Dn=ht("Col"),Mn=ht("authError"),$r=ht("Markdown",!0),ur=ht("JumpToPath",!0),Pr=(pt.get("scheme")||"").toLowerCase(),xr=this.getValue(),fn=(0,W.default)(ke=wt.allErrors()).call(ke,function(Qn){return Qn.get("authId")===It});if("basic"===Pr){var Nn,$n=xr?xr.get("username"):null;return ie.default.createElement("div",null,ie.default.createElement("h4",null,ie.default.createElement("code",null,It||pt.get("name")),"\xa0 (http, Basic)",ie.default.createElement(ur,{path:["securityDefinitions",It]})),$n&&ie.default.createElement("h6",null,"Authorized"),ie.default.createElement(Lt,null,ie.default.createElement($r,{source:pt.get("description")})),ie.default.createElement(Lt,null,ie.default.createElement("label",null,"Username:"),$n?ie.default.createElement("code",null," ",$n," "):ie.default.createElement(Dn,null,ie.default.createElement(dn,{type:"text",required:"required",name:"username","aria-label":"auth-basic-username",onChange:this.onChange,autoFocus:!0}))),ie.default.createElement(Lt,null,ie.default.createElement("label",null,"Password:"),$n?ie.default.createElement("code",null," ****** "):ie.default.createElement(Dn,null,ie.default.createElement(dn,{autoComplete:"new-password",name:"password",type:"password","aria-label":"auth-basic-password",onChange:this.onChange}))),(0,re.default)(Nn=fn.valueSeq()).call(Nn,function(Qn,Tn){return ie.default.createElement(Mn,{error:Qn,key:Tn})}))}return"bearer"===Pr?ie.default.createElement("div",null,ie.default.createElement("h4",null,ie.default.createElement("code",null,It||pt.get("name")),"\xa0 (http, Bearer)",ie.default.createElement(ur,{path:["securityDefinitions",It]})),xr&&ie.default.createElement("h6",null,"Authorized"),ie.default.createElement(Lt,null,ie.default.createElement($r,{source:pt.get("description")})),ie.default.createElement(Lt,null,ie.default.createElement("label",null,"Value:"),xr?ie.default.createElement("code",null," ****** "):ie.default.createElement(Dn,null,ie.default.createElement(dn,{type:"text","aria-label":"auth-bearer-value",onChange:this.onChange,autoFocus:!0}))),(0,re.default)(xe=fn.valueSeq()).call(xe,function(Qn,Tn){return ie.default.createElement(Mn,{error:Qn,key:Tn})})):ie.default.createElement("div",null,ie.default.createElement("em",null,ie.default.createElement("b",null,It)," HTTP authentication: unsupported scheme ","'".concat(Pr,"'")))}}]),Re}(ie.default.Component))},6467:(n,s,t)=>{t.r(s),t.d(s,{default:()=>re});var o=t(3427),c=t(2458),g=t(5757),C=t(6617),D=t(9928),P=t(5327),j=t(6775),W=t(6796);const re={Callbacks:o.default,HttpAuth:j.default,RequestBody:c.default,Servers:C.default,ServersContainer:D.default,RequestBodyEditor:P.default,OperationServers:W.default,operationLink:g.default}},5757:(n,s,t)=>{t.r(s),t.d(s,{default:()=>W});var o=t(7344),c=t(8656),g=t(9972),C=t(5416),D=t(313),P=t(2565),j=t(810);t(5053),t(9569);const W=function(re){(0,g.default)(ge,re);var ie=(0,C.default)(ge);function ge(){return(0,o.default)(this,ge),ie.apply(this,arguments)}return(0,c.default)(ge,[{key:"render",value:function(){var wt,It,_e=this.props,Le=_e.link,Re=_e.name,ke=(0,_e.getComponent)("Markdown",!0),xe=Le.get("operationId")||Le.get("operationRef"),U=Le.get("parameters")&&Le.get("parameters").toJS(),pt=Le.get("description");return j.default.createElement("div",{className:"operation-link"},j.default.createElement("div",{className:"description"},j.default.createElement("b",null,j.default.createElement("code",null,Re)),pt?j.default.createElement(ke,{source:pt}):null),j.default.createElement("pre",null,"Operation `",xe,"`",j.default.createElement("br",null),j.default.createElement("br",null),"Parameters ",("string"!=typeof(wt=(0,D.default)(U,null,2))?"":(0,P.default)(It=wt.split("\n")).call(It,function(dn,Lt){return Lt>0?Array(1).join(" ")+dn:dn}).join("\n"))||"{}",j.default.createElement("br",null)))}}]),ge}(j.Component)},6796:(n,s,t)=>{t.r(s),t.d(s,{default:()=>ie});var o=t(1013),c=t(7344),g=t(8656),C=t(6340),D=t(9972),P=t(5416),j=t(775),W=t(5171),re=t(810),ie=(t(5053),t(9569),function(ge){(0,D.default)(Le,ge);var _e=(0,P.default)(Le);function Le(){var Re,ke;(0,c.default)(this,Le);for(var xe=arguments.length,U=new Array(xe),pt=0;pt<xe;pt++)U[pt]=arguments[pt];return ke=_e.call.apply(_e,(0,W.default)(Re=[this]).call(Re,U)),(0,j.default)((0,C.default)(ke),"setSelectedServer",function(ht){var wt,It=ke.props,dn=It.path,Lt=It.method;return ke.forceUpdate(),ke.props.setSelectedServer(ht,(0,W.default)(wt="".concat(dn,":")).call(wt,Lt))}),(0,j.default)((0,C.default)(ke),"setServerVariableValue",function(ht){var wt,It=ke.props,dn=It.path,Lt=It.method;return ke.forceUpdate(),ke.props.setServerVariableValue((0,o.default)((0,o.default)({},ht),{},{namespace:(0,W.default)(wt="".concat(dn,":")).call(wt,Lt)}))}),(0,j.default)((0,C.default)(ke),"getSelectedServer",function(){var ht,wt=ke.props,dn=wt.method;return ke.props.getSelectedServer((0,W.default)(ht="".concat(wt.path,":")).call(ht,dn))}),(0,j.default)((0,C.default)(ke),"getServerVariable",function(ht,wt){var It,dn=ke.props,Dn=dn.method;return ke.props.getServerVariable({namespace:(0,W.default)(It="".concat(dn.path,":")).call(It,Dn),server:ht},wt)}),(0,j.default)((0,C.default)(ke),"getEffectiveServerValue",function(ht){var wt,It=ke.props,Lt=It.method;return ke.props.getEffectiveServerValue({server:ht,namespace:(0,W.default)(wt="".concat(It.path,":")).call(wt,Lt)})}),ke}return(0,g.default)(Le,[{key:"render",value:function(){var Re=this.props,ke=Re.operationServers,xe=Re.pathServers;if(!ke&&!xe)return null;var pt=(0,Re.getComponent)("Servers"),ht=ke||xe,wt=ke?"operation":"path";return re.default.createElement("div",{className:"opblock-section operation-servers"},re.default.createElement("div",{className:"opblock-section-header"},re.default.createElement("div",{className:"tab-header"},re.default.createElement("h4",{className:"opblock-title"},"Servers"))),re.default.createElement("div",{className:"opblock-description-wrapper"},re.default.createElement("h4",{className:"message"},"These ",wt,"-level options override the global server options."),re.default.createElement(pt,{servers:ht,currentServer:this.getSelectedServer(),setSelectedServer:this.setSelectedServer,setServerVariableValue:this.setServerVariableValue,getServerVariable:this.getServerVariable,getEffectiveServerValue:this.getEffectiveServerValue})))}}]),Le}(re.default.Component))},5327:(n,s,t)=>{t.r(s),t.d(s,{default:()=>ge});var o=t(7344),c=t(8656),g=t(6340),C=t(9972),D=t(5416),P=t(775),j=t(810),W=(t(5053),t(8096)),re=t(6298),ie=Function.prototype,ge=function(_e){(0,C.default)(Re,_e);var Le=(0,D.default)(Re);function Re(ke,xe){var U;return(0,o.default)(this,Re),U=Le.call(this,ke,xe),(0,P.default)((0,g.default)(U),"applyDefaultValue",function(pt){var ht=pt||U.props,wt=ht.onChange,It=ht.defaultValue;return U.setState({value:It}),wt(It)}),(0,P.default)((0,g.default)(U),"onChange",function(pt){U.props.onChange((0,re.Pz)(pt))}),(0,P.default)((0,g.default)(U),"onDomChange",function(pt){var ht=pt.target.value;U.setState({value:ht},function(){return U.onChange(ht)})}),U.state={value:(0,re.Pz)(ke.value)||ke.defaultValue},ke.onChange(ke.value),U}return(0,c.default)(Re,[{key:"UNSAFE_componentWillReceiveProps",value:function(ke){this.props.value!==ke.value&&ke.value!==this.state.value&&this.setState({value:(0,re.Pz)(ke.value)}),!ke.value&&ke.defaultValue&&this.state.value&&this.applyDefaultValue(ke)}},{key:"render",value:function(){var ke=this.props,U=ke.errors,pt=this.state.value,ht=U.size>0,wt=(0,ke.getComponent)("TextArea");return j.default.createElement("div",{className:"body-param"},j.default.createElement(wt,{className:(0,W.default)("body-param__text",{invalid:ht}),title:U.size?U.join(", "):"",value:pt,onChange:this.onDomChange}))}}]),Re}(j.PureComponent);(0,P.default)(ge,"defaultProps",{onChange:ie,userHasEditedBody:!1})},2458:(n,s,t)=>{t.r(s),t.d(s,{getDefaultRequestBodyValue:()=>ge,default:()=>_e});var o=t(9334),c=t(2565),g=t(8818),C=t(2372),D=t(5171),P=t(4163),j=t(810),W=(t(5053),t(9569),t(9725)),re=t(6298),ie=t(2518),ge=function(Le,Re,ke){var xe=Le.getIn(["content",Re]),U=xe.get("schema").toJS(),pt=void 0!==xe.get("examples"),ht=xe.get("example"),wt=pt?xe.getIn(["examples",ke,"value"]):ht,It=(0,re.xi)(U,Re,{includeWriteOnly:!0},wt);return(0,re.Pz)(It)};const _e=function(Le){var Re=Le.userHasEditedBody,ke=Le.requestBody,xe=Le.requestBodyValue,U=Le.requestBodyInclusionSetting,pt=Le.requestBodyErrors,ht=Le.getComponent,wt=Le.getConfigs,It=Le.specSelectors,dn=Le.fn,Lt=Le.contentType,Dn=Le.isExecute,Mn=Le.specPath,$r=Le.onChange,ur=Le.onChangeIncludeEmpty,Pr=Le.activeExamplesKey,xr=Le.updateActiveExamplesKey,fn=Le.setRetainRequestBodyValueFlag,Nn=function(_r){var Gr={key:_r,shouldDispatchInit:!1,defaultValue:!0};return"no value"===U.get(_r,"no value")&&(Gr.shouldDispatchInit=!0),Gr},$n=ht("Markdown",!0),Qn=ht("modelExample"),Tn=ht("RequestBodyEditor"),Yr=ht("highlightCode"),ji=ht("ExamplesSelectValueRetainer"),ii=ht("Example"),Ui=ht("ParameterIncludeEmpty"),Jr=wt().showCommonExtensions,An=ke&&ke.get("description")||null,hn=ke&&ke.get("content")||new W.OrderedMap;Lt=Lt||hn.keySeq().first()||"";var qr=hn.get(Lt,(0,W.OrderedMap)()),Ri=qr.get("schema",(0,W.OrderedMap)()),qi=qr.get("examples",null),Zo=null==qi?void 0:(0,c.default)(qi).call(qi,function(_r,Gr){var xi,Zs=null===(xi=_r)||void 0===xi?void 0:xi.get("value",null);return Zs&&(_r=_r.set("value",ge(ke,Lt,Gr),Zs)),_r});if(pt=W.List.isList(pt)?pt:(0,W.List)(),!qr.size)return null;var bo="object"===qr.getIn(["schema","type"]),Ys="binary"===qr.getIn(["schema","format"]),Ws="base64"===qr.getIn(["schema","format"]);if("application/octet-stream"===Lt||0===(0,g.default)(Lt).call(Lt,"image/")||0===(0,g.default)(Lt).call(Lt,"audio/")||0===(0,g.default)(Lt).call(Lt,"video/")||Ys||Ws){var wi=ht("Input");return Dn?j.default.createElement(wi,{type:"file",onChange:function(_r){$r(_r.target.files[0])}}):j.default.createElement("i",null,"Example values are not available for ",j.default.createElement("code",null,Lt)," media types.")}if(bo&&("application/x-www-form-urlencoded"===Lt||0===(0,g.default)(Lt).call(Lt,"multipart/"))&&Ri.get("properties",(0,W.OrderedMap)()).size>0){var lo,go=ht("JsonSchemaForm"),Ge=ht("ParameterExt"),St=Ri.get("properties",(0,W.OrderedMap)());return xe=W.Map.isMap(xe)?xe:(0,W.OrderedMap)(),j.default.createElement("div",{className:"table-container"},An&&j.default.createElement($n,{source:An}),j.default.createElement("table",null,j.default.createElement("tbody",null,W.Map.isMap(St)&&(0,c.default)(lo=St.entrySeq()).call(lo,function(_r){var Gr,xi,Zs=(0,o.default)(_r,2),jo=Zs[0],sl=Zs[1];if(!sl.get("readOnly")){var ml=Jr?(0,re.po)(sl):null,nu=(0,C.default)(Gr=Ri.get("required",(0,W.List)())).call(Gr,jo),Xu=sl.get("type"),Pf=sl.get("format"),Fl=sl.get("description"),qc=xe.getIn([jo,"value"]),up=xe.getIn([jo,"errors"])||pt,Eh=U.get(jo)||!1,Wp=sl.has("default")||sl.has("example")||sl.hasIn(["items","example"])||sl.hasIn(["items","default"]),Th=sl.has("enum")&&(1===sl.get("enum").size||nu),ru=Wp||Th,Zc="";"array"!==Xu||ru||(Zc=[]),("object"===Xu||ru)&&(Zc=(0,re.xi)(sl,!1,{includeWriteOnly:!0})),"string"!=typeof Zc&&"object"===Xu&&(Zc=(0,re.Pz)(Zc)),"string"==typeof Zc&&"array"===Xu&&(Zc=JSON.parse(Zc));var Ip="string"===Xu&&("binary"===Pf||"base64"===Pf);return j.default.createElement("tr",{key:jo,className:"parameters","data-property-name":jo},j.default.createElement("td",{className:"parameters-col_name"},j.default.createElement("div",{className:nu?"parameter__name required":"parameter__name"},jo,nu?j.default.createElement("span",null,"\xa0*"):null),j.default.createElement("div",{className:"parameter__type"},Xu,Pf&&j.default.createElement("span",{className:"prop-format"},"($",Pf,")"),Jr&&ml.size?(0,c.default)(xi=ml.entrySeq()).call(xi,function(Yi){var lr,mi=(0,o.default)(Yi,2),eo=mi[0],Lo=mi[1];return j.default.createElement(Ge,{key:(0,D.default)(lr="".concat(eo,"-")).call(lr,Lo),xKey:eo,xVal:Lo})}):null),j.default.createElement("div",{className:"parameter__deprecated"},sl.get("deprecated")?"deprecated":null)),j.default.createElement("td",{className:"parameters-col_description"},j.default.createElement($n,{source:Fl}),Dn?j.default.createElement("div",null,j.default.createElement(go,{fn:dn,dispatchInitialValue:!Ip,schema:sl,description:jo,getComponent:ht,value:void 0===qc?Zc:qc,required:nu,errors:up,onChange:function(Yi){$r(Yi,[jo])}}),nu?null:j.default.createElement(Ui,{onChange:function(Yi){return ur(jo,Yi)},isIncluded:Eh,isIncludedOptions:Nn(jo),isDisabled:(0,P.default)(qc)?0!==qc.length:!(0,re.O2)(qc)})):null))}}))))}var Et=ge(ke,Lt,Pr),Bn=null;return(0,ie.O)(Et)&&(Bn="json"),j.default.createElement("div",null,An&&j.default.createElement($n,{source:An}),Zo?j.default.createElement(ji,{userHasEditedBody:Re,examples:Zo,currentKey:Pr,currentUserInputValue:xe,onSelect:function(_r){xr(_r)},updateValue:$r,defaultToFirstExample:!0,getComponent:ht,setRetainRequestBodyValueFlag:fn}):null,Dn?j.default.createElement("div",null,j.default.createElement(Tn,{value:xe,errors:pt,defaultValue:Et,onChange:$r,getComponent:ht})):j.default.createElement(Qn,{getComponent:ht,getConfigs:wt,specSelectors:It,expandDepth:1,isExecute:Dn,schema:qr.get("schema"),specPath:Mn.push("content",Lt),example:j.default.createElement(Yr,{className:"body-param__example",getConfigs:wt,language:Bn,value:(0,re.Pz)(xe)||Et}),includeWriteOnly:!0}),Zo?j.default.createElement(ii,{example:Zo.get(Pr),getComponent:ht,getConfigs:wt}):null)}},9928:(n,s,t)=>{t.r(s),t.d(s,{default:()=>P});var o=t(7344),c=t(8656),g=t(9972),C=t(5416),D=t(810),P=(t(5053),function(j){(0,g.default)(re,j);var W=(0,C.default)(re);function re(){return(0,o.default)(this,re),W.apply(this,arguments)}return(0,c.default)(re,[{key:"render",value:function(){var ie=this.props,_e=ie.oas3Selectors,Le=ie.oas3Actions,Re=ie.getComponent,ke=ie.specSelectors.servers(),xe=Re("Servers");return ke&&ke.size?D.default.createElement("div",null,D.default.createElement("span",{className:"servers-title"},"Servers"),D.default.createElement(xe,{servers:ke,currentServer:_e.selectedServer(),setSelectedServer:Le.setSelectedServer,setServerVariableValue:Le.setServerVariableValue,getServerVariable:_e.serverVariableValue,getEffectiveServerValue:_e.serverEffectiveValue})):null}}]),re}(D.default.Component))},6617:(n,s,t)=>{t.r(s),t.d(s,{default:()=>Le});var o=t(9334),c=t(7344),g=t(8656),C=t(6340),D=t(9972),P=t(5416),j=t(775),W=t(5171),re=t(1778),ie=t(2565),ge=t(810),_e=t(9725),Le=(t(5053),t(9569),function(Re){(0,D.default)(xe,Re);var ke=(0,P.default)(xe);function xe(){var U,pt;(0,c.default)(this,xe);for(var ht=arguments.length,wt=new Array(ht),It=0;It<ht;It++)wt[It]=arguments[It];return pt=ke.call.apply(ke,(0,W.default)(U=[this]).call(U,wt)),(0,j.default)((0,C.default)(pt),"onServerChange",function(dn){pt.setServer(dn.target.value)}),(0,j.default)((0,C.default)(pt),"onServerVariableValueChange",function(dn){var Lt=pt.props,Dn=Lt.setServerVariableValue,Mn=Lt.currentServer,$r=dn.target.getAttribute("data-variable");"function"==typeof Dn&&Dn({server:Mn,key:$r,val:dn.target.value})}),(0,j.default)((0,C.default)(pt),"setServer",function(dn){(0,pt.props.setSelectedServer)(dn)}),pt}return(0,g.default)(xe,[{key:"componentDidMount",value:function(){var U,pt=this.props;pt.currentServer||this.setServer(null===(U=pt.servers.first())||void 0===U?void 0:U.get("url"))}},{key:"UNSAFE_componentWillReceiveProps",value:function(U){var pt=this,ht=U.servers,wt=U.setServerVariableValue,It=U.getServerVariable;if(this.props.currentServer!==U.currentServer||this.props.servers!==U.servers){var dn,Lt=(0,re.default)(ht).call(ht,function(xr){return xr.get("url")===U.currentServer}),Dn=(0,re.default)(dn=this.props.servers).call(dn,function(xr){return xr.get("url")===pt.props.currentServer})||(0,_e.OrderedMap)();if(!Lt)return this.setServer(ht.first().get("url"));var Mn=Dn.get("variables")||(0,_e.OrderedMap)(),$r=((0,re.default)(Mn).call(Mn,function(xr){return xr.get("default")})||(0,_e.OrderedMap)()).get("default"),ur=Lt.get("variables")||(0,_e.OrderedMap)(),Pr=((0,re.default)(ur).call(ur,function(xr){return xr.get("default")})||(0,_e.OrderedMap)()).get("default");(0,ie.default)(ur).call(ur,function(xr,fn){It(U.currentServer,fn)&&$r===Pr||wt({server:U.currentServer,key:fn,val:xr.get("default")||""})})}}},{key:"render",value:function(){var U,pt,ht=this,wt=this.props,It=wt.servers,dn=wt.currentServer,Lt=wt.getServerVariable,Dn=wt.getEffectiveServerValue,Mn=((0,re.default)(It).call(It,function(ur){return ur.get("url")===dn})||(0,_e.OrderedMap)()).get("variables")||(0,_e.OrderedMap)(),$r=0!==Mn.size;return ge.default.createElement("div",{className:"servers"},ge.default.createElement("label",{htmlFor:"servers"},ge.default.createElement("select",{onChange:this.onServerChange,value:dn},(0,ie.default)(U=It.valueSeq()).call(U,function(ur){return ge.default.createElement("option",{value:ur.get("url"),key:ur.get("url")},ur.get("url"),ur.get("description")&&" - ".concat(ur.get("description")))}).toArray())),$r?ge.default.createElement("div",null,ge.default.createElement("div",{className:"computed-url"},"Computed URL:",ge.default.createElement("code",null,Dn(dn))),ge.default.createElement("h4",null,"Server variables"),ge.default.createElement("table",null,ge.default.createElement("tbody",null,(0,ie.default)(pt=Mn.entrySeq()).call(pt,function(ur){var Pr,xr=(0,o.default)(ur,2),fn=xr[0],Nn=xr[1];return ge.default.createElement("tr",{key:fn},ge.default.createElement("td",null,fn),ge.default.createElement("td",null,Nn.get("enum")?ge.default.createElement("select",{"data-variable":fn,onChange:ht.onServerVariableValueChange},(0,ie.default)(Pr=Nn.get("enum")).call(Pr,function($n){return ge.default.createElement("option",{selected:$n===Lt(dn,fn),key:$n,value:$n},$n)})):ge.default.createElement("input",{type:"text",value:Lt(dn,fn)||"",onChange:ht.onServerVariableValueChange,"data-variable":fn})))})))):null)}}]),xe}(ge.default.Component))},7779:(n,s,t)=>{t.r(s),t.d(s,{isOAS3:()=>C,isSwagger2:()=>D,OAS3ComponentWrapFactory:()=>P});var o=t(863),c=t(3590),g=t(810);function C(j){var W=j.get("openapi");return"string"==typeof W&&(0,c.default)(W).call(W,"3.0.")&&W.length>4}function D(j){var W=j.get("swagger");return"string"==typeof W&&(0,c.default)(W).call(W,"2.0")}function P(j){return function(W,re){return function(ie){return re&&re.specSelectors&&re.specSelectors.specJson?C(re.specSelectors.specJson())?g.default.createElement(j,(0,o.default)({},ie,re,{Ori:W})):g.default.createElement(W,ie):(console.warn("OAS3 wrapper: couldn't get spec"),null)}}}},7451:(n,s,t)=>{t.r(s),t.d(s,{default:()=>re});var o=t(2044),c=t(3723),g=t(1741),C=t(6467),D=t(7761),P=t(7002),j=t(5065),W=t(9666);function re(){return{components:C.default,wrapComponents:D.default,statePlugins:{spec:{wrapSelectors:o,selectors:g},auth:{wrapSelectors:c},oas3:{actions:P,reducers:W.default,selectors:j}}}}},9666:(n,s,t)=>{t.r(s),t.d(s,{default:()=>ge});var o=t(775);const c=(t.d(Le={},{default:()=>XM}),Le);var Le,g,C=t(9334),D=t(5487),P=t(8136),j=t(29),W=t(6785),re=t(9725),ie=t(7002);const ge=((0,o.default)(g={},ie.UPDATE_SELECTED_SERVER,function(_e,Le){var Re=Le.payload,xe=Re.namespace;return _e.setIn(xe?[xe,"selectedServer"]:["selectedServer"],Re.selectedServerUrl)}),(0,o.default)(g,ie.UPDATE_REQUEST_BODY_VALUE,function(_e,Le){var Re=Le.payload,ke=Re.value,U=(0,C.default)(Re.pathMethod,2),pt=U[0],ht=U[1];if(!re.Map.isMap(ke))return _e.setIn(["requestData",pt,ht,"bodyValue"],ke);var wt,It=_e.getIn(["requestData",pt,ht,"bodyValue"])||(0,re.Map)();re.Map.isMap(It)||(It=(0,re.Map)());var dn=(0,D.default)(ke).call(ke),Lt=(0,c.default)(dn),Dn=(0,P.default)(Lt).call(Lt,0);return(0,j.default)(Dn).call(Dn,function(Mn){var $r=ke.getIn([Mn]);It.has(Mn)&&re.Map.isMap($r)||(wt=It.setIn([Mn,"value"],$r))}),_e.setIn(["requestData",pt,ht,"bodyValue"],wt)}),(0,o.default)(g,ie.UPDATE_REQUEST_BODY_VALUE_RETAIN_FLAG,function(_e,Le){var Re=Le.payload,ke=Re.value,U=(0,C.default)(Re.pathMethod,2);return _e.setIn(["requestData",U[0],U[1],"retainBodyValue"],ke)}),(0,o.default)(g,ie.UPDATE_REQUEST_BODY_INCLUSION,function(_e,Le){var Re=Le.payload,ke=Re.value,U=Re.name,pt=(0,C.default)(Re.pathMethod,2);return _e.setIn(["requestData",pt[0],pt[1],"bodyInclusion",U],ke)}),(0,o.default)(g,ie.UPDATE_ACTIVE_EXAMPLES_MEMBER,function(_e,Le){var Re=Le.payload,ke=Re.name,U=Re.contextType,pt=Re.contextName,ht=(0,C.default)(Re.pathMethod,2);return _e.setIn(["examples",ht[0],ht[1],U,pt,"activeExample"],ke)}),(0,o.default)(g,ie.UPDATE_REQUEST_CONTENT_TYPE,function(_e,Le){var Re=Le.payload,ke=Re.value,U=(0,C.default)(Re.pathMethod,2);return _e.setIn(["requestData",U[0],U[1],"requestContentType"],ke)}),(0,o.default)(g,ie.UPDATE_RESPONSE_CONTENT_TYPE,function(_e,Le){var Re=Le.payload;return _e.setIn(["requestData",Re.path,Re.method,"responseContentType"],Re.value)}),(0,o.default)(g,ie.UPDATE_SERVER_VARIABLE_VALUE,function(_e,Le){var Re=Le.payload,ke=Re.server,xe=Re.namespace,U=Re.key;return _e.setIn(xe?[xe,"serverVariableValues",ke,U]:["serverVariableValues",ke,U],Re.val)}),(0,o.default)(g,ie.SET_REQUEST_BODY_VALIDATE_ERROR,function(_e,Le){var Re=Le.payload,ke=Re.path,xe=Re.method,U=Re.validationErrors,pt=[];if(pt.push("Required field is not provided"),U.missingBodyValue)return _e.setIn(["requestData",ke,xe,"errors"],(0,re.fromJS)(pt));if(U.missingRequiredKeys&&U.missingRequiredKeys.length>0){var ht=U.missingRequiredKeys;return _e.updateIn(["requestData",ke,xe,"bodyValue"],(0,re.fromJS)({}),function(wt){return(0,W.default)(ht).call(ht,function(It,dn){return It.setIn([dn,"errors"],(0,re.fromJS)(pt))},wt)})}return console.warn("unexpected result: SET_REQUEST_BODY_VALIDATE_ERROR"),_e}),(0,o.default)(g,ie.CLEAR_REQUEST_BODY_VALIDATE_ERROR,function(_e,Le){var Re=Le.payload,ke=Re.path,xe=Re.method,U=_e.getIn(["requestData",ke,xe,"bodyValue"]);if(!re.Map.isMap(U))return _e.setIn(["requestData",ke,xe,"errors"],(0,re.fromJS)([]));var pt=(0,D.default)(U).call(U),ht=(0,c.default)(pt),wt=(0,P.default)(ht).call(ht,0);return wt?_e.updateIn(["requestData",ke,xe,"bodyValue"],(0,re.fromJS)({}),function(It){return(0,W.default)(wt).call(wt,function(dn,Lt){return dn.setIn([Lt,"errors"],(0,re.fromJS)([]))},It)}):_e}),(0,o.default)(g,ie.CLEAR_REQUEST_BODY_VALUE,function(_e,Le){var ke=(0,C.default)(Le.payload.pathMethod,2),xe=ke[0],U=ke[1],pt=_e.getIn(["requestData",xe,U,"bodyValue"]);return pt?re.Map.isMap(pt)?_e.setIn(["requestData",xe,U,"bodyValue"],(0,re.Map)()):_e.setIn(["requestData",xe,U,"bodyValue"],""):_e}),g)},5065:(n,s,t)=>{t.r(s),t.d(s,{selectedServer:()=>Le,requestBodyValue:()=>Re,shouldRetainRequestBodyValue:()=>ke,hasUserEditedBody:()=>xe,requestBodyInclusionSetting:()=>U,requestBodyErrors:()=>pt,activeExamplesMember:()=>ht,requestContentType:()=>wt,responseContentType:()=>It,serverVariableValue:()=>dn,serverVariables:()=>Lt,serverEffectiveValue:()=>Dn,validateBeforeExecute:()=>Mn,validateShallowRequired:()=>$r});var o=t(2691),c=t(5171),g=t(2565),C=t(29),D=t(2740),P=t(8818),j=t(9725),W=t(7779),re=t(2458),ie=t(6298);function ge(ur){return function(){for(var Pr=arguments.length,xr=new Array(Pr),fn=0;fn<Pr;fn++)xr[fn]=arguments[fn];return function(Nn){var $n=Nn.getSystem().specSelectors.specJson();return(0,W.isOAS3)($n)?ur.apply(void 0,xr):null}}}var _e,Le=ge(function(ur,Pr){return ur.getIn(Pr?[Pr,"selectedServer"]:["selectedServer"])||""}),Re=ge(function(ur,Pr,xr){return ur.getIn(["requestData",Pr,xr,"bodyValue"])||null}),ke=ge(function(ur,Pr,xr){return ur.getIn(["requestData",Pr,xr,"retainBodyValue"])||!1}),xe=function(ur,Pr,xr){return function(fn){var Nn=fn.getSystem(),$n=Nn.oas3Selectors,Qn=Nn.specSelectors,Tn=Qn.specJson();if((0,W.isOAS3)(Tn)){var Yr=!1,ji=$n.requestContentType(Pr,xr),ii=$n.requestBodyValue(Pr,xr);if(j.Map.isMap(ii)&&(ii=(0,ie.Pz)(ii.mapEntries(function(Jr){return j.Map.isMap(Jr[1])?[Jr[0],Jr[1].get("value")]:Jr}).toJS())),j.List.isList(ii)&&(ii=(0,ie.Pz)(ii)),ji){var Ui=(0,re.getDefaultRequestBodyValue)(Qn.specResolvedSubtree(["paths",Pr,xr,"requestBody"]),ji,$n.activeExamplesMember(Pr,xr,"requestBody","requestBody"));Yr=!!ii&&ii!==Ui}return Yr}return null}},U=ge(function(ur,Pr,xr){return ur.getIn(["requestData",Pr,xr,"bodyInclusion"])||(0,j.Map)()}),pt=ge(function(ur,Pr,xr){return ur.getIn(["requestData",Pr,xr,"errors"])||null}),ht=ge(function(ur,Pr,xr,fn,Nn){return ur.getIn(["examples",Pr,xr,fn,Nn,"activeExample"])||null}),wt=ge(function(ur,Pr,xr){return ur.getIn(["requestData",Pr,xr,"requestContentType"])||null}),It=ge(function(ur,Pr,xr){return ur.getIn(["requestData",Pr,xr,"responseContentType"])||null}),dn=ge(function(ur,Pr,xr){var fn;if("string"!=typeof Pr){var Nn=Pr.server,$n=Pr.namespace;fn=$n?[$n,"serverVariableValues",Nn,xr]:["serverVariableValues",Nn,xr]}else fn=["serverVariableValues",Pr,xr];return ur.getIn(fn)||null}),Lt=ge(function(ur,Pr){var xr;if("string"!=typeof Pr){var fn=Pr.server,Nn=Pr.namespace;xr=Nn?[Nn,"serverVariableValues",fn]:["serverVariableValues",fn]}else xr=["serverVariableValues",Pr];return ur.getIn(xr)||(0,j.OrderedMap)()}),Dn=ge(function(ur,Pr){var xr,fn;if("string"!=typeof Pr){var $n=Pr.namespace;fn=Pr.server,xr=ur.getIn($n?[$n,"serverVariableValues",fn]:["serverVariableValues",fn])}else xr=ur.getIn(["serverVariableValues",fn=Pr]);xr=xr||(0,j.OrderedMap)();var Qn=fn;return(0,g.default)(xr).call(xr,function(Tn,Yr){Qn=Qn.replace(new RegExp("{".concat(Yr,"}"),"g"),Tn)}),Qn}),Mn=(_e=function(ur,Pr){return fn=(fn=Pr)||[],!!ur.getIn((0,c.default)(Nn=["requestData"]).call(Nn,(0,o.default)(fn),["bodyValue"]));var fn,Nn},function(){for(var ur=arguments.length,Pr=new Array(ur),xr=0;xr<ur;xr++)Pr[xr]=arguments[xr];return function(fn){var Nn,$n,Qn=fn.getSystem().specSelectors.specJson(),Tn=(0,c.default)(Nn=[]).call(Nn,Pr)[1]||[];return!Qn.getIn((0,c.default)($n=["paths"]).call($n,(0,o.default)(Tn),["requestBody","required"]))||_e.apply(void 0,Pr)}}),$r=function(ur,Pr){var xr,fn=Pr.oas3RequiredRequestBodyContentType,Nn=Pr.oas3RequestContentType,$n=Pr.oas3RequestBodyValue,Qn=[];if(!j.Map.isMap($n))return Qn;var Tn=[];return(0,C.default)(xr=(0,D.default)(fn.requestContentType)).call(xr,function(Yr){if(Yr===Nn){var ji=fn.requestContentType[Yr];(0,C.default)(ji).call(ji,function(ii){(0,P.default)(Tn).call(Tn,ii)<0&&Tn.push(ii)})}}),(0,C.default)(Tn).call(Tn,function(Yr){$n.getIn([Yr,"value"])||Qn.push(Yr)}),Qn}},1741:(n,s,t)=>{t.r(s),t.d(s,{servers:()=>W,isSwagger2:()=>re});var C,o=t(8639),c=t(9725),g=t(7779),D=function(ie){return ie||(0,c.Map)()},P=(0,o.createSelector)(D,function(ie){return ie.get("json",(0,c.Map)())}),j=(0,o.createSelector)(D,function(ie){return ie.get("resolved",(0,c.Map)())}),W=(C=(0,o.createSelector)(function(ie){var ge=j(ie);return ge.count()<1&&(ge=P(ie)),ge},function(ie){return ie.getIn(["servers"])||(0,c.Map)()}),function(){return function(ie){var ge=ie.getSystem().specSelectors.specJson();if((0,g.isOAS3)(ge)){for(var _e=arguments.length,Le=new Array(_e>1?_e-1:0),Re=1;Re<_e;Re++)Le[Re-1]=arguments[Re];return C.apply(void 0,Le)}return null}}),re=function(ie,ge){return function(){var _e=ge.getSystem().specSelectors.specJson();return(0,g.isSwagger2)(_e)}}},2044:(n,s,t)=>{t.r(s),t.d(s,{definitions:()=>ge,hasHost:()=>_e,securityDefinitions:()=>Le,host:()=>Re,basePath:()=>ke,consumes:()=>xe,produces:()=>U,schemes:()=>pt,servers:()=>ht,isOAS3:()=>wt,isSwagger2:()=>It});var o=t(8639),c=t(3881),g=t(9725),C=t(7779);function D(dn){return function(Lt,Dn){return function(){var Mn=Dn.getSystem().specSelectors.specJson();return(0,C.isOAS3)(Mn)?dn.apply(void 0,arguments):Lt.apply(void 0,arguments)}}}var P=function(dn){return dn||(0,g.Map)()},j=D((0,o.createSelector)(function(){return null})),W=(0,o.createSelector)(P,function(dn){return dn.get("json",(0,g.Map)())}),re=(0,o.createSelector)(P,function(dn){return dn.get("resolved",(0,g.Map)())}),ie=function(dn){var Lt=re(dn);return Lt.count()<1&&(Lt=W(dn)),Lt},ge=D((0,o.createSelector)(ie,function(dn){var Lt=dn.getIn(["components","schemas"]);return g.Map.isMap(Lt)?Lt:(0,g.Map)()})),_e=D(function(dn){return ie(dn).hasIn(["servers",0])}),Le=D((0,o.createSelector)(c.specJsonWithResolvedSubtrees,function(dn){return dn.getIn(["components","securitySchemes"])||null})),Re=j,ke=j,xe=j,U=j,pt=j,ht=D((0,o.createSelector)(ie,function(dn){return dn.getIn(["servers"])||(0,g.Map)()})),wt=function(dn,Lt){return function(){var Dn=Lt.getSystem().specSelectors.specJson();return(0,C.isOAS3)(g.Map.isMap(Dn)?Dn:(0,g.Map)())}},It=function(dn,Lt){return function(){var Dn=Lt.getSystem().specSelectors.specJson();return(0,C.isSwagger2)(g.Map.isMap(Dn)?Dn:(0,g.Map)())}}},356:(n,s,t)=>{t.r(s),t.d(s,{default:()=>D});var o=t(302),c=t(810),g=t(7779),C=["Ori"];const D=(0,g.OAS3ComponentWrapFactory)(function(P){var j=P.Ori,W=(0,o.default)(P,C),re=W.schema,ie=W.getComponent,ge=W.errSelectors,_e=W.authorized,Le=W.onAuthChange,Re=W.name,ke=ie("HttpAuth");return"http"===re.get("type")?c.default.createElement(ke,{key:Re,schema:re,name:Re,errSelectors:ge,authorized:_e,getComponent:ie,onChange:Le}):c.default.createElement(j,W)})},7761:(n,s,t)=>{t.r(s),t.d(s,{default:()=>j});var o=t(2460),c=t(356),g=t(9487),C=t(58),D=t(3499),P=t(287);const j={Markdown:o.default,AuthItem:c.default,JsonSchema_string:P.default,VersionStamp:g.default,model:D.default,onlineValidatorBadge:C.default}},287:(n,s,t)=>{t.r(s),t.d(s,{default:()=>D});var o=t(302),c=t(810),g=t(7779),C=["Ori"];const D=(0,g.OAS3ComponentWrapFactory)(function(P){var j=P.Ori,W=(0,o.default)(P,C),re=W.schema,ie=W.getComponent,ge=W.errors,_e=W.onChange,Le=re&&re.get?re.get("format"):null,Re=re&&re.get?re.get("type"):null,ke=ie("Input");return Re&&"string"===Re&&Le&&("binary"===Le||"base64"===Le)?c.default.createElement(ke,{type:"file",className:ge.length?"invalid":"",title:ge.length?ge:"",onChange:function(xe){_e(xe.target.files[0])},disabled:j.isDisabled}):c.default.createElement(j,W)})},2460:(n,s,t)=>{t.r(s),t.d(s,{Markdown:()=>W,default:()=>re});var o=t(5942),c=t(810),g=(t(5053),t(8096)),C=t(3952),D=t(7779),P=t(5466),j=new C.Remarkable("commonmark");j.block.ruler.enable(["table"]),j.set({linkTarget:"_blank"});var W=function(ie){var ge=ie.source,_e=ie.className,Le=void 0===_e?"":_e;if("string"!=typeof ge)return null;if(ge){var ke,xe=(0,ie.getConfigs)().useUnsafeMarkdown,U=j.render(ge),pt=(0,P.s)(U,{useUnsafeMarkdown:xe});return"string"==typeof pt&&(ke=(0,o.default)(pt).call(pt)),c.default.createElement("div",{dangerouslySetInnerHTML:{__html:ke},className:(0,g.default)(Le,"renderedMarkdown")})}return null};W.defaultProps={getConfigs:function(){return{useUnsafeMarkdown:!1}}};const re=(0,D.OAS3ComponentWrapFactory)(W)},3499:(n,s,t)=>{t.r(s),t.d(s,{default:()=>ie});var o=t(863),c=t(7344),g=t(8656),C=t(9972),D=t(5416),P=t(810),j=(t(5053),t(7779)),W=t(1543),re=function(ge){(0,C.default)(Le,ge);var _e=(0,D.default)(Le);function Le(){return(0,c.default)(this,Le),_e.apply(this,arguments)}return(0,g.default)(Le,[{key:"render",value:function(){var Re=this.props,ke=Re.getConfigs,xe=["model-box"],U=null;return!0===Re.schema.get("deprecated")&&(xe.push("deprecated"),U=P.default.createElement("span",{className:"model-deprecated-warning"},"Deprecated:")),P.default.createElement("div",{className:xe.join(" ")},U,P.default.createElement(W.Z,(0,o.default)({},this.props,{getConfigs:ke,depth:1,expandDepth:this.props.expandDepth||0})))}}]),Le}(P.Component);const ie=(0,j.OAS3ComponentWrapFactory)(re)},58:(n,s,t)=>{t.r(s),t.d(s,{default:()=>g});var o=t(7779),c=t(5623);const g=(0,o.OAS3ComponentWrapFactory)(c.Z)},9487:(n,s,t)=>{t.r(s),t.d(s,{default:()=>c});var o=t(810);const c=(0,t(7779).OAS3ComponentWrapFactory)(function(g){return o.default.createElement("span",null,o.default.createElement(g.Ori,g),o.default.createElement("small",{className:"version-stamp"},o.default.createElement("pre",{className:"version"},"OAS3")))})},8560:(n,s,t)=>{t.r(s),t.d(s,{default:()=>g});var o=t(6235),c=!1;function g(){return{statePlugins:{spec:{wrapActions:{updateSpec:function(C){return function(){return c=!0,C.apply(void 0,arguments)}},updateJsonSpec:function(C,D){return function(){var P=D.getConfigs().onComplete;return c&&"function"==typeof P&&((0,o.default)(P,0),c=!1),C.apply(void 0,arguments)}}}}}}}},4624:(n,s,t)=>{t.r(s),t.d(s,{requestSnippetGenerator_curl_bash:()=>It,requestSnippetGenerator_curl_cmd:()=>dn,requestSnippetGenerator_curl_powershell:()=>wt});var o=t(2691),c=t(9334),g=t(3248),C=t(8818),D=t(5942),P=t(5171),j=t(313),W=t(2565);const re=(t.d(Dn={},{default:()=>qM()}),Dn);var Dn,ie=t(2954),ge=t(2372),_e=t(7504),Le=t(9725),Re=function(Lt){var Dn;return(0,C.default)(Lt).call(Lt,"_**[]")<0?Lt:(0,D.default)(Dn=Lt.split("_**[]")[0]).call(Dn)},ke=function(Lt){return"-d "===Lt||/^[_\/-]/g.test(Lt)?Lt:"'"+Lt.replace(/'/g,"'\\''")+"'"},xe=function(Lt){return"-d "===(Lt=Lt.replace(/\^/g,"^^").replace(/\\"/g,'\\\\"').replace(/"/g,'""').replace(/\n/g,"^\n"))?Lt.replace(/-d /g,"-d ^\n"):/^[_\/-]/g.test(Lt)?Lt:'"'+Lt+'"'},U=function(Lt){return"-d "===Lt?Lt:/\n/.test(Lt)?'@"\n'+Lt.replace(/"/g,'\\"').replace(/`/g,"``").replace(/\$/,"`$")+'\n"@':/^[_\/-]/g.test(Lt)?Lt:"'"+Lt.replace(/"/g,'""').replace(/'/g,"''")+"'"};function pt(Lt){var Dn,Mn=[],$r=(0,g.default)(Lt.get("body").entrySeq());try{for($r.s();!(Dn=$r.n()).done;){var ur,Pr,xr,fn=(0,c.default)(Dn.value,2),$n=fn[1],Qn=Re(fn[0]);Mn.push($n instanceof _e.Z.File?(0,P.default)(ur=(0,P.default)(Pr='  "'.concat(Qn,'": {\n    "name": "')).call(Pr,$n.name,'"')).call(ur,$n.type?',\n    "type": "'.concat($n.type,'"'):"","\n  }"):(0,P.default)(xr='  "'.concat(Qn,'": ')).call(xr,(0,j.default)($n,null,2).replace(/(\r\n|\r|\n)/g,"\n  ")))}}catch(Tn){$r.e(Tn)}finally{$r.f()}return"{\n".concat(Mn.join(",\n"),"\n}")}var ht=function(Lt,Dn,Mn){var $r=arguments.length>3&&void 0!==arguments[3]?arguments[3]:"",ur=!1,Pr="",xr=function(){for(var Et=arguments.length,Bn=new Array(Et),_r=0;_r<Et;_r++)Bn[_r]=arguments[_r];return Pr+=" "+(0,W.default)(Bn).call(Bn,Dn).join(" ")},fn=function(){for(var Et=arguments.length,Bn=new Array(Et),_r=0;_r<Et;_r++)Bn[_r]=arguments[_r];return Pr+=(0,W.default)(Bn).call(Bn,Dn).join(" ")},Nn=function(){return Pr+=" ".concat(Mn)},$n=function(){var Et,Bn=arguments.length>0&&void 0!==arguments[0]?arguments[0]:1;return Pr+=(0,re.default)(Et="  ").call(Et,Bn)},Qn=Lt.get("headers");if(Pr+="curl"+$r,Lt.has("curlOptions")&&xr.apply(void 0,(0,o.default)(Lt.get("curlOptions"))),xr("-X",Lt.get("method")),Nn(),$n(),fn("".concat(Lt.get("url"))),Qn&&Qn.size){var Tn,Yr,ji=(0,g.default)((0,ie.default)(Tn=Lt.get("headers")).call(Tn));try{for(ji.s();!(Yr=ji.n()).done;){var ii,Ui=Yr.value;Nn(),$n();var Jr=(0,c.default)(Ui,2),An=Jr[0],hn=Jr[1];fn("-H",(0,P.default)(ii="".concat(An,": ")).call(ii,hn)),ur=ur||/^content-type$/i.test(An)&&/^multipart\/form-data$/i.test(hn)}}catch(Et){ji.e(Et)}finally{ji.f()}}var qr,Ri=Lt.get("body");if(Ri)if(ur&&(0,ge.default)(qr=["POST","PUT","PATCH"]).call(qr,Lt.get("method"))){var qi,Zo=(0,g.default)(Ri.entrySeq());try{for(Zo.s();!(qi=Zo.n()).done;){var bo,Ys,Ws,wi=(0,c.default)(qi.value,2),lo=wi[0],go=wi[1],Ge=Re(lo);Nn(),$n(),fn("-F"),xr(go instanceof _e.Z.File?(0,P.default)(bo=(0,P.default)(Ys="".concat(Ge,"=@")).call(Ys,go.name)).call(bo,go.type?";type=".concat(go.type):""):(0,P.default)(Ws="".concat(Ge,"=")).call(Ws,go))}}catch(Et){Zo.e(Et)}finally{Zo.f()}}else if(Ri instanceof _e.Z.File)Nn(),$n(),fn("--data-binary '@".concat(Ri.name,"'"));else{Nn(),$n(),fn("-d ");var St=Ri;Le.Map.isMap(St)?fn(pt(Lt)):("string"!=typeof St&&(St=(0,j.default)(St)),fn(St))}else Ri||"POST"!==Lt.get("method")||(Nn(),$n(),fn("-d ''"));return Pr},wt=function(Lt){return ht(Lt,U,"`\n",".exe")},It=function(Lt){return ht(Lt,ke,"\\\n")},dn=function(Lt){return ht(Lt,xe,"^\n")}},6575:(n,s,t)=>{t.r(s),t.d(s,{default:()=>C});var o=t(4624),c=t(4669),g=t(4206);const C=function(){return{components:{RequestSnippets:g.default},fn:o,statePlugins:{requestSnippets:{selectors:c}}}}},4206:(n,s,t)=>{t.r(s),t.d(s,{default:()=>Le});var o=t(9334),c=t(6145),g=t(8898),C=t(29),D=t(2565),P=t(810),j=(t(5053),t(9908)),W=t(7068),re=t(9874),ie=t(471),ge={cursor:"pointer",lineHeight:1,display:"inline-flex",backgroundColor:"rgb(250, 250, 250)",paddingBottom:"0",paddingTop:"0",border:"1px solid rgb(51, 51, 51)",borderRadius:"4px 4px 0 0",boxShadow:"none",borderBottom:"none"},_e={cursor:"pointer",lineHeight:1,display:"inline-flex",backgroundColor:"rgb(51, 51, 51)",boxShadow:"none",border:"1px solid rgb(51, 51, 51)",paddingBottom:"0",paddingTop:"0",borderRadius:"4px 4px 0 0",marginTop:"-5px",marginRight:"-5px",marginLeft:"-5px",zIndex:"9999",borderBottom:"none"};const Le=function(Re){var ke,xe,U=Re.request,pt=Re.requestSnippetsSelectors,ht=Re.getConfigs,wt=(0,W.default)(ht)?ht():null,It=!1!==(0,j.default)(wt,"syntaxHighlight")&&(0,j.default)(wt,"syntaxHighlight.activated",!0),dn=(0,P.useRef)(null),Lt=(0,P.useState)(null===(ke=pt.getSnippetGenerators())||void 0===ke?void 0:ke.keySeq().first()),Dn=(0,o.default)(Lt,2),Mn=Dn[0],$r=Dn[1],ur=(0,P.useState)(null==pt?void 0:pt.getDefaultExpanded()),Pr=(0,o.default)(ur,2),xr=Pr[0],fn=Pr[1];(0,P.useEffect)(function(){},[]),(0,P.useEffect)(function(){var Ui,Jr=(0,c.default)(Ui=(0,g.default)(dn.current.childNodes)).call(Ui,function(An){var hn;return!!An.nodeType&&(null===(hn=An.classList)||void 0===hn?void 0:hn.contains("curl-command"))});return(0,C.default)(Jr).call(Jr,function(An){return An.addEventListener("mousewheel",ji,{passive:!1})}),function(){(0,C.default)(Jr).call(Jr,function(An){return An.removeEventListener("mousewheel",ji)})}},[U]);var Nn=pt.getSnippetGenerators(),$n=Nn.get(Mn),Qn=$n.get("fn")(U),Tn=function(){fn(!xr)},Yr=function(Ui){return Ui===Mn?_e:ge},ji=function(Ui){var Jr=Ui.target,An=Ui.deltaY,hn=Jr.scrollHeight,qr=Jr.offsetHeight,Ri=Jr.scrollTop;hn>qr&&(0===Ri&&An<0||qr+Ri>=hn&&An>0)&&Ui.preventDefault()},ii=It?P.default.createElement(ie.d3,{language:$n.get("syntax"),className:"curl microlight",style:(0,ie.C2)((0,j.default)(wt,"syntaxHighlight.theme"))},Qn):P.default.createElement("textarea",{readOnly:!0,className:"curl",value:Qn});return P.default.createElement("div",{className:"request-snippets",ref:dn},P.default.createElement("div",{style:{width:"100%",display:"flex",justifyContent:"flex-start",alignItems:"center",marginBottom:"15px"}},P.default.createElement("h4",{onClick:function(){return Tn()},style:{cursor:"pointer"}},"Snippets"),P.default.createElement("button",{onClick:function(){return Tn()},style:{border:"none",background:"none"},title:xr?"Collapse operation":"Expand operation"},P.default.createElement("svg",{className:"arrow",width:"10",height:"10"},P.default.createElement("use",{href:xr?"#large-arrow-down":"#large-arrow",xlinkHref:xr?"#large-arrow-down":"#large-arrow"})))),xr&&P.default.createElement("div",{className:"curl-command"},P.default.createElement("div",{style:{paddingLeft:"15px",paddingRight:"10px",width:"100%",display:"flex"}},(0,D.default)(xe=Nn.entrySeq()).call(xe,function(Ui){var Jr=(0,o.default)(Ui,2),An=Jr[0],hn=Jr[1];return P.default.createElement("div",{style:Yr(An),className:"btn",key:An,onClick:function(){var qr;Mn!==(qr=An)&&$r(qr)}},P.default.createElement("h4",{style:An===Mn?{color:"white"}:{}},hn.get("title")))})),P.default.createElement("div",{className:"copy-to-clipboard"},P.default.createElement(re.CopyToClipboard,{text:Qn},P.default.createElement("button",null))),P.default.createElement("div",null,ii)))}},4669:(n,s,t)=>{t.r(s),t.d(s,{getGenerators:()=>j,getSnippetGenerators:()=>W,getActiveLanguage:()=>re,getDefaultExpanded:()=>ie});var o=t(6145),c=t(2372),g=t(2565),C=t(8639),D=t(9725),P=function(ge){return ge||(0,D.Map)()},j=(0,C.createSelector)(P,function(ge){var _e=ge.get("languages"),Le=ge.get("generators",(0,D.Map)());return!_e||_e.isEmpty()?Le:(0,o.default)(Le).call(Le,function(Re,ke){return(0,c.default)(_e).call(_e,ke)})}),W=function(ge){return function(_e){var Le,Re,ke=_e.fn;return(0,o.default)(Le=(0,g.default)(Re=j(ge)).call(Re,function(xe,U){var pt=ke["requestSnippetGenerator_".concat(U)];return"function"!=typeof pt?null:xe.set("fn",pt)})).call(Le,function(xe){return xe})}},re=(0,C.createSelector)(P,function(ge){return ge.get("activeLanguage")}),ie=(0,C.createSelector)(P,function(ge){return ge.get("defaultExpanded")})},6195:(n,s,t)=>{t.r(s),t.d(s,{ErrorBoundary:()=>re,default:()=>ie});var o=t(7344),c=t(8656),g=t(9972),C=t(5416),D=t(5171),P=(t(5053),t(810)),j=t(6189),W=t(9403),re=function(ge){(0,g.default)(Le,ge);var _e=(0,C.default)(Le);function Le(){var Re,ke;(0,o.default)(this,Le);for(var xe=arguments.length,U=new Array(xe),pt=0;pt<xe;pt++)U[pt]=arguments[pt];return(ke=_e.call.apply(_e,(0,D.default)(Re=[this]).call(Re,U))).state={hasError:!1,error:null},ke}return(0,c.default)(Le,[{key:"componentDidCatch",value:function(Re,ke){this.props.fn.componentDidCatch(Re,ke)}},{key:"render",value:function(){var Re=this.props,xe=Re.targetName,U=Re.children;if(this.state.hasError){var pt=(0,Re.getComponent)("Fallback");return P.default.createElement(pt,{name:xe})}return U}}],[{key:"getDerivedStateFromError",value:function(Re){return{hasError:!0,error:Re}}}]),Le}(P.Component);re.defaultProps={targetName:"this component",getComponent:function(){return W.default},fn:{componentDidCatch:j.componentDidCatch},children:null};const ie=re},9403:(n,s,t)=>{t.r(s),t.d(s,{default:()=>c});var o=t(810);t(5053);const c=function(g){var C=g.name;return o.default.createElement("div",{className:"fallback"},"\u{1f631} ",o.default.createElement("i",null,"Could not render ","t"===C?"this component":C,", see the console."))}},6189:(n,s,t)=>{t.r(s),t.d(s,{componentDidCatch:()=>j,withErrorBoundary:()=>W});var o=t(863),c=t(7344),g=t(8656),C=t(9972),D=t(5416),P=t(810),j=console.error,W=function(re){return function(ie){var ge,_e=re(),Le=_e.getComponent,Re=_e.fn,ke=Le("ErrorBoundary"),xe=Re.getDisplayName(ie),U=function(pt){(0,C.default)(wt,pt);var ht=(0,D.default)(wt);function wt(){return(0,c.default)(this,wt),ht.apply(this,arguments)}return(0,g.default)(wt,[{key:"render",value:function(){return P.default.createElement(ke,{targetName:xe,getComponent:Le,fn:Re},P.default.createElement(ie,(0,o.default)({},this.props,this.context)))}}]),wt}(P.Component);return U.displayName="WithErrorBoundary(".concat(xe,")"),(ge=ie).prototype&&ge.prototype.isReactComponent&&(U.prototype.mapStateToProps=ie.prototype.mapStateToProps),U}}},8102:(n,s,t)=>{t.r(s),t.d(s,{default:()=>W});var o=t(2691),c=t(5171);const g=(t.d(ie={},{default:()=>Ux()}),ie),C=(re=>{var ie={};return t.d(ie,re),ie})({default:()=>Yx()});var ie,D=t(6195),P=t(9403),j=t(6189);const W=function(){var re=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},ie=re.componentList,ge=void 0===ie?[]:ie,_e=re.fullOverride,Le=void 0!==_e&&_e;return function(Re){var ke,xe,U=Re.getSystem,pt=Le?ge:(0,c.default)(ke=[]).call(ke,["App","BaseLayout","VersionPragmaFilter","InfoContainer","ServersContainer","SchemesContainer","AuthorizeBtnContainer","FilterContainer","Operations","OperationContainer","parameters","responses","OperationServers","Models","ModelWrapper"],(0,o.default)(ge)),ht=(0,C.default)(pt,(0,g.default)(xe=Array(pt.length)).call(xe,function(wt,It){return It.fn.withErrorBoundary(wt)}));return{fn:{componentDidCatch:j.componentDidCatch,withErrorBoundary:(0,j.withErrorBoundary)(U)},components:{ErrorBoundary:D.default,Fallback:P.default},wrapComponents:ht}}}},2473:(n,s,t)=>{t.r(s),t.d(s,{createXMLExample:()=>Pr,inferSchema:()=>ur,memoizedCreateXMLExample:()=>Nn,memoizedSampleFromSchema:()=>$n,sampleFromSchema:()=>xr,sampleFromSchemaGeneric:()=>$r});var o=t(1581),c=t(5171),g=t(8818),C=t(29),D=t(4163),P=t(2372),j=t(9963),W=t(8136),re=t(1778),ie=t(2565),ge=t(313),_e=t(3479),Le=t.n(_e);const Re=(t.d(Tn={},{default:()=>o0()}),Tn),ke=(Qn=>{var Tn={};return t.d(Tn,Qn),Tn})({default:()=>n2()});var Tn,xe=t(6298),U=t(8287),pt={string:function(Qn){return Qn.pattern?function(Tn){try{return new Re.default(Tn).gen()}catch(Yr){return"string"}}(Qn.pattern):"string"},string_email:function(){return"user@example.com"},"string_date-time":function(){return(new Date).toISOString()},string_date:function(){return(new Date).toISOString().substring(0,10)},string_uuid:function(){return"3fa85f64-5717-4562-b3fc-2c963f66afa6"},string_hostname:function(){return"example.com"},string_ipv4:function(){return"198.51.100.42"},string_ipv6:function(){return"2001:0db8:5b96:0000:0000:426f:8e17:642a"},number:function(){return 0},number_float:function(){return 0},integer:function(){return 0},boolean:function(Qn){return"boolean"!=typeof Qn.default||Qn.default}},ht=function(Qn){var Tn,Yr=Qn=(0,xe.mz)(Qn),ji=Yr.type,ii=Yr.format,Ui=pt[(0,c.default)(Tn="".concat(ji,"_")).call(Tn,ii)]||pt[ji];return(0,xe.Wl)(Ui)?Ui(Qn):"Unknown Type: "+Qn.type},wt=function(Qn){return(0,xe.XV)(Qn,"$$ref",function(Tn){return"string"==typeof Tn&&(0,g.default)(Tn).call(Tn,"#")>-1})},It=["maxProperties","minProperties"],dn=["minItems","maxItems"],Lt=["minimum","maximum","exclusiveMinimum","exclusiveMaximum"],Dn=["minLength","maxLength"],Mn=function Qn(Tn,Yr){var ji,ii,Ui,Jr=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{},An=function(qi){void 0===Yr[qi]&&void 0!==Tn[qi]&&(Yr[qi]=Tn[qi])};if((0,C.default)(ji=(0,c.default)(ii=["example","default","enum","xml","type"]).call(ii,It,dn,Lt,Dn)).call(ji,function(qi){return An(qi)}),void 0!==Tn.required&&(0,D.default)(Tn.required)&&(void 0!==Yr.required&&Yr.required.length||(Yr.required=[]),(0,C.default)(Ui=Tn.required).call(Ui,function(qi){var Zo;(0,P.default)(Zo=Yr.required).call(Zo,qi)||Yr.required.push(qi)})),Tn.properties){Yr.properties||(Yr.properties={});var hn=(0,xe.mz)(Tn.properties);for(var qr in hn){var Ri;Object.prototype.hasOwnProperty.call(hn,qr)&&(!hn[qr]||!hn[qr].deprecated)&&(!hn[qr]||!hn[qr].readOnly||Jr.includeReadOnly)&&(!hn[qr]||!hn[qr].writeOnly||Jr.includeWriteOnly)&&(Yr.properties[qr]||(Yr.properties[qr]=hn[qr],!Tn.required&&(0,D.default)(Tn.required)&&-1!==(0,g.default)(Ri=Tn.required).call(Ri,qr)&&(Yr.required?Yr.required.push(qr):Yr.required=[qr])))}}return Tn.items&&(Yr.items||(Yr.items={}),Yr.items=Qn(Tn.items,Yr.items,Jr)),Yr},$r=function Qn(Tn){var Yr=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},ji=arguments.length>2&&void 0!==arguments[2]?arguments[2]:void 0,ii=arguments.length>3&&void 0!==arguments[3]&&arguments[3];Tn&&(0,xe.Wl)(Tn.toJS)&&(Tn=Tn.toJS());var Ui=void 0!==ji||Tn&&void 0!==Tn.example||Tn&&void 0!==Tn.default,Jr=!Ui&&Tn&&Tn.oneOf&&Tn.oneOf.length>0,An=!Ui&&Tn&&Tn.anyOf&&Tn.anyOf.length>0;if(!Ui&&(Jr||An)){var hn=(0,xe.mz)(Jr?Tn.oneOf[0]:Tn.anyOf[0]);if(Mn(hn,Tn,Yr),!Tn.xml&&hn.xml&&(Tn.xml=hn.xml),void 0!==Tn.example&&void 0!==hn.example)Ui=!0;else if(hn.properties){Tn.properties||(Tn.properties={});var qr=(0,xe.mz)(hn.properties);for(var Ri in qr){var qi;Object.prototype.hasOwnProperty.call(qr,Ri)&&(!qr[Ri]||!qr[Ri].deprecated)&&(!qr[Ri]||!qr[Ri].readOnly||Yr.includeReadOnly)&&(!qr[Ri]||!qr[Ri].writeOnly||Yr.includeWriteOnly)&&(Tn.properties[Ri]||(Tn.properties[Ri]=qr[Ri],!hn.required&&(0,D.default)(hn.required)&&-1!==(0,g.default)(qi=hn.required).call(qi,Ri)&&(Tn.required?Tn.required.push(Ri):Tn.required=[Ri])))}}}var Zo,bo={},Ys=Tn||{},Ws=Ys.xml,wi=Ys.type,lo=Ys.example,go=Ys.properties,Ge=Ys.additionalProperties,St=Ys.items,Et=Yr.includeReadOnly,Bn=Yr.includeWriteOnly,_r=Ws=Ws||{},Gr=_r.name,xi=_r.prefix,Zs=_r.namespace,jo={};if(ii&&(Zo=(xi?xi+":":"")+(Gr=Gr||"notagname"),Zs)){var sl=xi?"xmlns:"+xi:"xmlns";bo[sl]=Zs}ii&&(jo[Zo]=[]);var ml=function(Zi){return(0,j.default)(Zi).call(Zi,function(xs){return Object.prototype.hasOwnProperty.call(Tn,xs)})};Tn&&!wi&&(go||Ge||ml(It)?wi="object":St||ml(dn)?wi="array":ml(Lt)?(wi="number",Tn.type="number"):Ui||Tn.enum||(wi="string",Tn.type="string"));var nu,Xu,Pf=function(Zi){var xs,is,hu,Al,Ci;if(null!==(null===(xs=Tn)||void 0===xs?void 0:xs.maxItems)&&void 0!==(null===(is=Tn)||void 0===is?void 0:is.maxItems)&&(Zi=(0,W.default)(Zi).call(Zi,0,null===(Ci=Tn)||void 0===Ci?void 0:Ci.maxItems)),null!==(null===(hu=Tn)||void 0===hu?void 0:hu.minItems)&&void 0!==(null===(Al=Tn)||void 0===Al?void 0:Al.minItems))for(var qa=0;Zi.length<(null===(ja=Tn)||void 0===ja?void 0:ja.minItems);){var ja;Zi.push(Zi[qa++%Zi.length])}return Zi},Fl=(0,xe.mz)(go),qc=0,up=function(){return Tn&&null!=Tn.maxProperties&&qc>=Tn.maxProperties},Eh=function(){if(!Tn||!Tn.required)return 0;var Zi,xs,is=0;return ii?(0,C.default)(Zi=Tn.required).call(Zi,function(hu){return is+=void 0===jo[hu]?0:1}):(0,C.default)(xs=Tn.required).call(xs,function(hu){var Al;return is+=void 0===(null===(Al=jo[Zo])||void 0===Al?void 0:(0,re.default)(Al).call(Al,function(Ci){return void 0!==Ci[hu]}))?0:1}),Tn.required.length-is},Wp=function(Zi){var xs;return!(Tn&&Tn.required&&Tn.required.length&&(0,P.default)(xs=Tn.required).call(xs,Zi))},Th=function(Zi){return!Tn||null==Tn.maxProperties||!up()&&(!Wp(Zi)||Tn.maxProperties-qc-Eh()>0)};if(nu=ii?function(Zi){var xs=arguments.length>1&&void 0!==arguments[1]?arguments[1]:void 0;if(Tn&&Fl[Zi]){if(Fl[Zi].xml=Fl[Zi].xml||{},Fl[Zi].xml.attribute){var is=(0,D.default)(Fl[Zi].enum)?Fl[Zi].enum[0]:void 0,hu=Fl[Zi].example,Al=Fl[Zi].default;return void(bo[Fl[Zi].xml.name||Zi]=void 0!==hu?hu:void 0!==Al?Al:void 0!==is?is:ht(Fl[Zi]))}Fl[Zi].xml.name=Fl[Zi].xml.name||Zi}else Fl[Zi]||!1===Ge||(Fl[Zi]={xml:{name:Zi}});var Ci,qa=Qn(Tn&&Fl[Zi]||void 0,Yr,xs,ii);Th(Zi)&&(qc++,(0,D.default)(qa)?jo[Zo]=(0,c.default)(Ci=jo[Zo]).call(Ci,qa):jo[Zo].push(qa))}:function(Zi,xs){Th(Zi)&&(jo[Zi]=Qn(Fl[Zi],Yr,xs,ii),qc++)},Ui){var ru;if(ru=wt(void 0!==ji?ji:void 0!==lo?lo:Tn.default),!ii){if("number"==typeof ru&&"string"===wi)return"".concat(ru);if("string"!=typeof ru||"string"===wi)return ru;try{return JSON.parse(ru)}catch(Zi){return ru}}if(Tn||(wi=(0,D.default)(ru)?"array":(0,o.default)(ru)),"array"===wi){if(!(0,D.default)(ru)){if("string"==typeof ru)return ru;ru=[ru]}var Zc=Tn?Tn.items:void 0;Zc&&(Zc.xml=Zc.xml||Ws||{},Zc.xml.name=Zc.xml.name||Ws.name);var Ip=(0,ie.default)(ru).call(ru,function(Zi){return Qn(Zc,Yr,Zi,ii)});return Ip=Pf(Ip),Ws.wrapped?(jo[Zo]=Ip,(0,ke.default)(bo)||jo[Zo].push({_attr:bo})):jo=Ip,jo}if("object"===wi){if("string"==typeof ru)return ru;for(var Yi in ru)Object.prototype.hasOwnProperty.call(ru,Yi)&&(Tn&&Fl[Yi]&&Fl[Yi].readOnly&&!Et||Tn&&Fl[Yi]&&Fl[Yi].writeOnly&&!Bn||(Tn&&Fl[Yi]&&Fl[Yi].xml&&Fl[Yi].xml.attribute?bo[Fl[Yi].xml.name||Yi]=ru[Yi]:nu(Yi,ru[Yi])));return(0,ke.default)(bo)||jo[Zo].push({_attr:bo}),jo}return jo[Zo]=(0,ke.default)(bo)?ru:[{_attr:bo},ru],jo}if("object"===wi){for(var lr in Fl)Object.prototype.hasOwnProperty.call(Fl,lr)&&(Fl[lr]&&Fl[lr].deprecated||Fl[lr]&&Fl[lr].readOnly&&!Et||Fl[lr]&&Fl[lr].writeOnly&&!Bn||nu(lr));if(ii&&bo&&jo[Zo].push({_attr:bo}),up())return jo;if(!0===Ge)ii?jo[Zo].push({additionalProp:"Anything can be here"}):jo.additionalProp1={},qc++;else if(Ge){var mi=(0,xe.mz)(Ge),eo=Qn(mi,Yr,void 0,ii);if(ii&&mi.xml&&mi.xml.name&&"notagname"!==mi.xml.name)jo[Zo].push(eo);else for(var Lo=null!=Tn.minProperties&&qc<Tn.minProperties?Tn.minProperties-qc:3,Xo=1;Xo<=Lo;Xo++){if(up())return jo;if(ii){var rs={};rs["additionalProp"+Xo]=eo.notagname,jo[Zo].push(rs)}else jo["additionalProp"+Xo]=eo;qc++}}return jo}if("array"===wi){if(!St)return;var us,ma,Ka;if(ii&&(St.xml=St.xml||(null===(ma=Tn)||void 0===ma?void 0:ma.xml)||{},St.xml.name=St.xml.name||Ws.name),(0,D.default)(St.anyOf))us=(0,ie.default)(Ka=St.anyOf).call(Ka,function(Zi){return Qn(Mn(St,Zi,Yr),Yr,void 0,ii)});else if((0,D.default)(St.oneOf)){var xu;us=(0,ie.default)(xu=St.oneOf).call(xu,function(Zi){return Qn(Mn(St,Zi,Yr),Yr,void 0,ii)})}else{if(!(!ii||ii&&Ws.wrapped))return Qn(St,Yr,void 0,ii);us=[Qn(St,Yr,void 0,ii)]}return us=Pf(us),ii&&Ws.wrapped?(jo[Zo]=us,(0,ke.default)(bo)||jo[Zo].push({_attr:bo}),jo):us}if(Tn&&(0,D.default)(Tn.enum))Xu=(0,xe.AF)(Tn.enum)[0];else{if(!Tn)return;if("number"==typeof(Xu=ht(Tn))){var Kn=Tn.minimum;null!=Kn&&(Tn.exclusiveMinimum&&Kn++,Xu=Kn);var Pi=Tn.maximum;null!=Pi&&(Tn.exclusiveMaximum&&Pi--,Xu=Pi)}if("string"==typeof Xu&&(null!=Tn.maxLength&&(Xu=(0,W.default)(Xu).call(Xu,0,Tn.maxLength)),null!=Tn.minLength))for(var as=0;Xu.length<Tn.minLength;)Xu+=Xu[as++%Xu.length]}if("file"!==wi)return ii?(jo[Zo]=(0,ke.default)(bo)?Xu:[{_attr:bo},Xu],jo):Xu},ur=function(Qn){return Qn.schema&&(Qn=Qn.schema),Qn.properties&&(Qn.type="object"),Qn},Pr=function(Qn,Tn,Yr){var ji=$r(Qn,Tn,Yr,!0);if(ji)return"string"==typeof ji?ji:Le()(ji,{declaration:!0,indent:"\t"})},xr=function(Qn,Tn,Yr){return $r(Qn,Tn,Yr,!1)},fn=function(Qn,Tn,Yr){return[Qn,(0,ge.default)(Tn),(0,ge.default)(Yr)]},Nn=(0,U.Z)(Pr,fn),$n=(0,U.Z)(xr,fn)},8883:(n,s,t)=>{t.r(s),t.d(s,{default:()=>c});var o=t(2473);function c(){return{fn:o}}},1737:(n,s,t)=>{t.r(s),t.d(s,{CLEAR_REQUEST:()=>hn,CLEAR_RESPONSE:()=>An,CLEAR_VALIDATE_PARAMS:()=>qr,LOG_REQUEST:()=>Jr,SET_MUTATED_REQUEST:()=>Ui,SET_REQUEST:()=>ii,SET_RESPONSE:()=>ji,SET_SCHEME:()=>bo,UPDATE_EMPTY_PARAM_INCLUSION:()=>Tn,UPDATE_JSON:()=>$n,UPDATE_OPERATION_META_VALUE:()=>Ri,UPDATE_PARAM:()=>Qn,UPDATE_RESOLVED:()=>qi,UPDATE_RESOLVED_SUBTREE:()=>Zo,UPDATE_SPEC:()=>fn,UPDATE_URL:()=>Nn,VALIDATE_PARAMS:()=>Yr,changeConsumesValue:()=>Xu,changeParam:()=>Gr,changeParamByIdentity:()=>xi,changeProducesValue:()=>Pf,clearRequest:()=>Zc,clearResponse:()=>ru,clearValidateParams:()=>nu,execute:()=>Th,executeRequest:()=>Wp,invalidateResolvedSubtreeCache:()=>jo,logRequest:()=>Eh,parseToJson:()=>go,requestResolvedSubtree:()=>_r,resolveSpec:()=>St,setMutatedRequest:()=>up,setRequest:()=>qc,setResponse:()=>Fl,setScheme:()=>Ip,updateEmptyParamInclusion:()=>ml,updateJsonSpec:()=>lo,updateResolved:()=>Ws,updateResolvedSubtree:()=>Zs,updateSpec:()=>Ys,updateUrl:()=>wi,validateParams:()=>sl});var o=t(1013),c=t(302);const g=(t.d(lr={},{default:()=>s0}),lr);var lr,C=t(1581);const D=(Yi=>{var lr={};return t.d(lr,Yi),lr})({default:()=>M_()});var P=t(4163),j=t(2565),W=t(3978),re=t.n(W),ie=t(6785),ge=t(7930);const _e=(Yi=>{var lr={};return t.d(lr,Yi),lr})({default:()=>Dg()});var Le=t(6145),Re=t(374),ke=t(8818),xe=t(29),U=t(5171),pt=t(2740),ht=t(7512);const wt=(Yi=>{var lr={};return t.d(lr,Yi),lr})({default:()=>jx()});var It=t(626),dn=t(9725),Lt=t(8900),Dn=t(8518);const Mn=(Yi=>{var lr={};return t.d(lr,Yi),lr})({default:()=>a0()}),$r=(Yi=>{var lr={};return t.d(lr,Yi),lr})({default:()=>Vx()}),ur=(Yi=>{var lr={};return t.d(lr,Yi),lr})({default:()=>ug()});var Pr=t(6298),xr=["path","method"],fn="spec_update_spec",Nn="spec_update_url",$n="spec_update_json",Qn="spec_update_param",Tn="spec_update_empty_param_inclusion",Yr="spec_validate_param",ji="spec_set_response",ii="spec_set_request",Ui="spec_set_mutated_request",Jr="spec_log_request",An="spec_clear_response",hn="spec_clear_request",qr="spec_clear_validate_param",Ri="spec_update_operation_meta_value",qi="spec_update_resolved",Zo="spec_update_resolved_subtree",bo="set_scheme";function Ys(Yi){var lr,mi=(lr=Yi,(0,Mn.default)(lr)?lr:"").replace(/\t/g,"  ");if("string"==typeof Yi)return{type:fn,payload:mi}}function Ws(Yi){return{type:qi,payload:Yi}}function wi(Yi){return{type:Nn,payload:Yi}}function lo(Yi){return{type:$n,payload:Yi}}var go=function(Yi){return function(lr){var mi=lr.specActions,Lo=lr.errActions,Xo=lr.specSelectors.specStr,rs=null;try{Yi=Yi||Xo(),Lo.clear({source:"parser"}),rs=It.default.load(Yi,{schema:It.JSON_SCHEMA})}catch(us){return console.error(us),Lo.newSpecErr({source:"parser",level:"error",message:us.reason,line:us.mark&&us.mark.line?us.mark.line+1:void 0})}return rs&&"object"===(0,C.default)(rs)?mi.updateJsonSpec(rs):{}}},Ge=!1,St=function(Yi,lr){return function(mi){var eo=mi.specActions,Lo=mi.specSelectors,Xo=mi.errActions,rs=mi.fn,us=rs.fetch,ma=rs.resolve,Ka=rs.AST,xu=void 0===Ka?{}:Ka,Kn=mi.getConfigs;Ge||(console.warn("specActions.resolveSpec is deprecated since v3.10.0 and will be removed in v4.0.0; use requestResolvedSubtree instead!"),Ge=!0);var Pi=Kn(),as=Pi.modelPropertyMacro,Zi=Pi.parameterMacro,xs=Pi.requestInterceptor,is=Pi.responseInterceptor;void 0===Yi&&(Yi=Lo.specJson()),void 0===lr&&(lr=Lo.url());var hu=xu.getLineNumberForPath?xu.getLineNumberForPath:function(){},Al=Lo.specStr();return ma({fetch:us,spec:Yi,baseDoc:lr,modelPropertyMacro:as,parameterMacro:Zi,requestInterceptor:xs,responseInterceptor:is}).then(function(Ci){var qa=Ci.spec,ja=Ci.errors;if(Xo.clear({type:"thrown"}),(0,P.default)(ja)&&ja.length>0){var Ku=(0,j.default)(ja).call(ja,function(Du){return console.error(Du),Du.line=Du.fullPath?hu(Al,Du.fullPath):null,Du.path=Du.fullPath?Du.fullPath.join("."):null,Du.level="error",Du.type="thrown",Du.source="resolver",re()(Du,"message",{enumerable:!0,value:Du.message}),Du});Xo.newThrownErrBatch(Ku)}return eo.updateResolved(qa)})}},Et=[],Bn=(0,$r.default)((0,g.default)(D.default.mark(function Yi(){var lr,mi,eo,Lo,Xo,rs,us,ma,Ka,xu,Kn,Pi,as,Zi,xs,is,hu,Al;return D.default.wrap(function(Ci){for(;;)switch(Ci.prev=Ci.next){case 0:if(lr=Et.system){Ci.next=4;break}return console.error("debResolveSubtrees: don't have a system to operate on, aborting."),Ci.abrupt("return");case 4:if(mi=lr.errActions,eo=lr.errSelectors,rs=(Lo=lr.fn).fetch,ma=void 0===(us=Lo.AST)?{}:us,Ka=lr.specSelectors,xu=lr.specActions,Xo=Lo.resolveSubtree){Ci.next=8;break}return console.error("Error: Swagger-Client did not provide a `resolveSubtree` method, doing nothing."),Ci.abrupt("return");case 8:return Kn=ma.getLineNumberForPath?ma.getLineNumberForPath:function(){},Pi=Ka.specStr(),as=lr.getConfigs(),Zi=as.modelPropertyMacro,xs=as.parameterMacro,is=as.requestInterceptor,hu=as.responseInterceptor,Ci.prev=11,Ci.next=14,(0,ie.default)(Et).call(Et,function(){var qa=(0,g.default)(D.default.mark(function ja(Ku,Du){var If,Jp,Ql,Jf,pg,Qp,Ng,I_,l1;return D.default.wrap(function(Xp){for(;;)switch(Xp.prev=Xp.next){case 0:return Xp.next=2,Ku;case 2:return Jp=(If=Xp.sent).resultMap,Ql=If.specWithCurrentSubtrees,Xp.next=7,Xo(Ql,Du,{baseDoc:Ka.url(),modelPropertyMacro:Zi,parameterMacro:xs,requestInterceptor:is,responseInterceptor:hu});case 7:if(pg=(Jf=Xp.sent).errors,Qp=Jf.spec,eo.allErrors().size&&mi.clearBy(function(gd){var Pg;return"thrown"!==gd.get("type")||"resolver"!==gd.get("source")||!(0,ge.default)(Pg=gd.get("fullPath")).call(Pg,function(Em,hg){return Em===Du[hg]||void 0===Du[hg]})}),(0,P.default)(pg)&&pg.length>0&&(Ng=(0,j.default)(pg).call(pg,function(gd){return gd.line=gd.fullPath?Kn(Pi,gd.fullPath):null,gd.path=gd.fullPath?gd.fullPath.join("."):null,gd.level="error",gd.type="thrown",gd.source="resolver",re()(gd,"message",{enumerable:!0,value:gd.message}),gd}),mi.newThrownErrBatch(Ng)),!Qp||!Ka.isOAS3()||"components"!==Du[0]||"securitySchemes"!==Du[1]){Xp.next=15;break}return Xp.next=15,_e.default.all((0,j.default)(I_=(0,Le.default)(l1=(0,Re.default)(Qp)).call(l1,function(gd){return"openIdConnect"===gd.type})).call(I_,function(){var gd=(0,g.default)(D.default.mark(function Pg(Em){var hg,iv;return D.default.wrap(function(Lp){for(;;)switch(Lp.prev=Lp.next){case 0:return hg={url:Em.openIdConnectUrl,requestInterceptor:is,responseInterceptor:hu},Lp.prev=1,Lp.next=4,rs(hg);case 4:(iv=Lp.sent)instanceof Error||iv.status>=400?console.error(iv.statusText+" "+hg.url):Em.openIdConnectData=JSON.parse(iv.text),Lp.next=11;break;case 8:Lp.prev=8,Lp.t0=Lp.catch(1),console.error(Lp.t0);case 11:case"end":return Lp.stop()}},Pg,null,[[1,8]])}));return function(Pg){return gd.apply(this,arguments)}}()));case 15:return(0,ur.default)(Jp,Du,Qp),(0,ur.default)(Ql,Du,Qp),Xp.abrupt("return",{resultMap:Jp,specWithCurrentSubtrees:Ql});case 18:case"end":return Xp.stop()}},ja)}));return function(ja,Ku){return qa.apply(this,arguments)}}(),_e.default.resolve({resultMap:(Ka.specResolvedSubtree([])||(0,dn.Map)()).toJS(),specWithCurrentSubtrees:Ka.specJson().toJS()}));case 14:Al=Ci.sent,delete Et.system,Et=[],Ci.next=22;break;case 19:Ci.prev=19,Ci.t0=Ci.catch(11),console.error(Ci.t0);case 22:xu.updateResolvedSubtree([],Al.resultMap);case 23:case"end":return Ci.stop()}},Yi,null,[[11,19]])})),35),_r=function(Yi){return function(lr){var mi;(0,ke.default)(mi=(0,j.default)(Et).call(Et,function(eo){return eo.join("@@")})).call(mi,Yi.join("@@"))>-1||(Et.push(Yi),Et.system=lr,Bn())}};function Gr(Yi,lr,mi,eo,Lo){return{type:Qn,payload:{path:Yi,value:eo,paramName:lr,paramIn:mi,isXml:Lo}}}function xi(Yi,lr,mi,eo){return{type:Qn,payload:{path:Yi,param:lr,value:mi,isXml:eo}}}var Zs=function(Yi,lr){return{type:Zo,payload:{path:Yi,value:lr}}},jo=function(){return{type:Zo,payload:{path:[],value:(0,dn.Map)()}}},sl=function(Yi,lr){return{type:Yr,payload:{pathMethod:Yi,isOAS3:lr}}},ml=function(Yi,lr,mi,eo){return{type:Tn,payload:{pathMethod:Yi,paramName:lr,paramIn:mi,includeEmptyValue:eo}}};function nu(Yi){return{type:qr,payload:{pathMethod:Yi}}}function Xu(Yi,lr){return{type:Ri,payload:{path:Yi,value:lr,key:"consumes_value"}}}function Pf(Yi,lr){return{type:Ri,payload:{path:Yi,value:lr,key:"produces_value"}}}var Fl=function(Yi,lr,mi){return{payload:{path:Yi,method:lr,res:mi},type:ji}},qc=function(Yi,lr,mi){return{payload:{path:Yi,method:lr,req:mi},type:ii}},up=function(Yi,lr,mi){return{payload:{path:Yi,method:lr,req:mi},type:Ui}},Eh=function(Yi){return{payload:Yi,type:Jr}},Wp=function(Yi){return function(lr){var mi,eo,Lo=lr.fn,Xo=lr.specActions,rs=lr.specSelectors,ma=lr.oas3Selectors,Ka=Yi.pathName,xu=Yi.method,Kn=Yi.operation,Pi=(0,lr.getConfigs)(),as=Pi.requestInterceptor,Zi=Pi.responseInterceptor,xs=Kn.toJS();if(Kn&&Kn.get("parameters")&&(0,xe.default)(mi=(0,Le.default)(eo=Kn.get("parameters")).call(eo,function(Ql){return Ql&&!0===Ql.get("allowEmptyValue")})).call(mi,function(Ql){if(rs.parameterInclusionSettingFor([Ka,xu],Ql.get("name"),Ql.get("in"))){Yi.parameters=Yi.parameters||{};var Jf=(0,Pr.cz)(Ql,Yi.parameters);(!Jf||Jf&&0===Jf.size)&&(Yi.parameters[Ql.get("name")]="")}}),Yi.contextUrl=(0,Lt.default)(rs.url()).toString(),xs&&xs.operationId?Yi.operationId=xs.operationId:xs&&Ka&&xu&&(Yi.operationId=Lo.opId(xs,Ka,xu)),rs.isOAS3()){var is,hu=(0,U.default)(is="".concat(Ka,":")).call(is,xu);Yi.server=ma.selectedServer(hu)||ma.selectedServer();var Al=ma.serverVariables({server:Yi.server,namespace:hu}).toJS(),Ci=ma.serverVariables({server:Yi.server}).toJS();Yi.serverVariables=(0,pt.default)(Al).length?Al:Ci,Yi.requestContentType=ma.requestContentType(Ka,xu),Yi.responseContentType=ma.responseContentType(Ka,xu)||"*/*";var qa,ja=ma.requestBodyValue(Ka,xu),Ku=ma.requestBodyInclusionSetting(Ka,xu);Yi.requestBody=ja&&ja.toJS?(0,Le.default)(qa=(0,j.default)(ja).call(ja,function(Ql){return dn.Map.isMap(Ql)?Ql.get("value"):Ql})).call(qa,function(Ql,Jf){return((0,P.default)(Ql)?0!==Ql.length:!(0,Pr.O2)(Ql))||Ku.get(Jf)}).toJS():ja}var Du=(0,ht.default)({},Yi);Du=Lo.buildRequest(Du),Xo.setRequest(Yi.pathName,Yi.method,Du);var Ql,If=(Ql=(0,g.default)(D.default.mark(function Jf(pg){var Qp,Ng;return D.default.wrap(function(I_){for(;;)switch(I_.prev=I_.next){case 0:return I_.next=2,as.apply(void 0,[pg]);case 2:return Ng=(0,ht.default)({},Qp=I_.sent),Xo.setMutatedRequest(Yi.pathName,Yi.method,Ng),I_.abrupt("return",Qp);case 6:case"end":return I_.stop()}},Jf)})),function(Jf){return Ql.apply(this,arguments)});Yi.requestInterceptor=If,Yi.responseInterceptor=Zi;var Jp=(0,wt.default)();return Lo.execute(Yi).then(function(Ql){Ql.duration=(0,wt.default)()-Jp,Xo.setResponse(Yi.pathName,Yi.method,Ql)}).catch(function(Ql){"Failed to fetch"===Ql.message&&(Ql.name="",Ql.message='**Failed to fetch.**  \n**Possible Reasons:** \n  - CORS \n  - Network Failure \n  - URL scheme must be "http" or "https" for CORS request.'),Xo.setResponse(Yi.pathName,Yi.method,{error:!0,err:(0,Dn.serializeError)(Ql)})})}},Th=function(){var Yi=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},lr=Yi.path,mi=Yi.method,eo=(0,c.default)(Yi,xr);return function(Lo){var Xo=Lo.fn.fetch,rs=Lo.specSelectors,us=Lo.specActions,ma=rs.specJsonWithResolvedSubtrees().toJS(),Ka=rs.operationScheme(lr,mi),xu=rs.contentTypeValues([lr,mi]).toJS(),Kn=xu.requestContentType,Pi=xu.responseContentType,as=/xml/i.test(Kn),Zi=rs.parameterValues([lr,mi],as).toJS();return us.executeRequest((0,o.default)((0,o.default)({},eo),{},{fetch:Xo,spec:ma,pathName:lr,method:mi,parameters:Zi,requestContentType:Kn,scheme:Ka,responseContentType:Pi}))}};function ru(Yi,lr){return{type:An,payload:{path:Yi,method:lr}}}function Zc(Yi,lr){return{type:hn,payload:{path:Yi,method:lr}}}function Ip(Yi,lr,mi){return{type:bo,payload:{scheme:Yi,path:lr,method:mi}}}},7038:(n,s,t)=>{t.r(s),t.d(s,{default:()=>D});var o=t(32),c=t(1737),g=t(3881),C=t(7508);function D(){return{statePlugins:{spec:{wrapActions:C,reducers:o.default,actions:c,selectors:g}}}}},32:(n,s,t)=>{t.r(s),t.d(s,{default:()=>Le});var o,c=t(775),g=t(2691),C=t(5171),D=t(6785),P=t(2565),j=t(7512),W=t(9725),re=t(6298),ie=t(7504),ge=t(3881),_e=t(1737);const Le=((0,c.default)(o={},_e.UPDATE_SPEC,function(Re,ke){return"string"==typeof ke.payload?Re.set("spec",ke.payload):Re}),(0,c.default)(o,_e.UPDATE_URL,function(Re,ke){return Re.set("url",ke.payload+"")}),(0,c.default)(o,_e.UPDATE_JSON,function(Re,ke){return Re.set("json",(0,re.oG)(ke.payload))}),(0,c.default)(o,_e.UPDATE_RESOLVED,function(Re,ke){return Re.setIn(["resolved"],(0,re.oG)(ke.payload))}),(0,c.default)(o,_e.UPDATE_RESOLVED_SUBTREE,function(Re,ke){var xe,U=ke.payload,pt=U.value,ht=U.path;return Re.setIn((0,C.default)(xe=["resolvedSubtrees"]).call(xe,(0,g.default)(ht)),(0,re.oG)(pt))}),(0,c.default)(o,_e.UPDATE_PARAM,function(Re,ke){var xe,U,pt=ke.payload,ht=pt.path,wt=pt.paramName,It=pt.paramIn,dn=pt.param,Lt=pt.value,Dn=pt.isXml,Mn=dn?(0,re.V9)(dn):(0,C.default)(xe="".concat(It,".")).call(xe,wt),$r=Dn?"value_xml":"value";return Re.setIn((0,C.default)(U=["meta","paths"]).call(U,(0,g.default)(ht),["parameters",Mn,$r]),Lt)}),(0,c.default)(o,_e.UPDATE_EMPTY_PARAM_INCLUSION,function(Re,ke){var xe,U,pt=ke.payload,ht=pt.pathMethod,wt=pt.paramName,It=pt.paramIn,dn=pt.includeEmptyValue;if(!wt||!It)return console.warn("Warning: UPDATE_EMPTY_PARAM_INCLUSION could not generate a paramKey."),Re;var Lt=(0,C.default)(xe="".concat(It,".")).call(xe,wt);return Re.setIn((0,C.default)(U=["meta","paths"]).call(U,(0,g.default)(ht),["parameter_inclusions",Lt]),dn)}),(0,c.default)(o,_e.VALIDATE_PARAMS,function(Re,ke){var xe,U,pt=ke.payload,ht=pt.pathMethod,wt=pt.isOAS3,It=(0,ge.specJsonWithResolvedSubtrees)(Re).getIn((0,C.default)(xe=["paths"]).call(xe,(0,g.default)(ht))),dn=(0,ge.parameterValues)(Re,ht).toJS();return Re.updateIn((0,C.default)(U=["meta","paths"]).call(U,(0,g.default)(ht),["parameters"]),(0,W.fromJS)({}),function(Lt){var Dn;return(0,D.default)(Dn=It.get("parameters",(0,W.List)())).call(Dn,function(Mn,$r){var ur=(0,re.cz)($r,dn),Pr=(0,ge.parameterInclusionSettingFor)(Re,ht,$r.get("name"),$r.get("in")),xr=(0,re.Ik)($r,ur,{bypassRequiredCheck:Pr,isOAS3:wt});return Mn.setIn([(0,re.V9)($r),"errors"],(0,W.fromJS)(xr))},Lt)})}),(0,c.default)(o,_e.CLEAR_VALIDATE_PARAMS,function(Re,ke){var xe,U=ke.payload.pathMethod;return Re.updateIn((0,C.default)(xe=["meta","paths"]).call(xe,(0,g.default)(U),["parameters"]),(0,W.fromJS)([]),function(pt){return(0,P.default)(pt).call(pt,function(ht){return ht.set("errors",(0,W.fromJS)([]))})})}),(0,c.default)(o,_e.SET_RESPONSE,function(Re,ke){var xe,U=ke.payload,pt=U.res,ht=U.path,wt=U.method;(xe=pt.error?(0,j.default)({error:!0,name:pt.err.name,message:pt.err.message,statusCode:pt.err.statusCode},pt.err.response):pt).headers=xe.headers||{};var It=Re.setIn(["responses",ht,wt],(0,re.oG)(xe));return ie.Z.Blob&&pt.data instanceof ie.Z.Blob&&(It=It.setIn(["responses",ht,wt,"text"],pt.data)),It}),(0,c.default)(o,_e.SET_REQUEST,function(Re,ke){var xe=ke.payload;return Re.setIn(["requests",xe.path,xe.method],(0,re.oG)(xe.req))}),(0,c.default)(o,_e.SET_MUTATED_REQUEST,function(Re,ke){var xe=ke.payload;return Re.setIn(["mutatedRequests",xe.path,xe.method],(0,re.oG)(xe.req))}),(0,c.default)(o,_e.UPDATE_OPERATION_META_VALUE,function(Re,ke){var xe,U,pt,ht,wt,It,dn=ke.payload,Lt=dn.path,Dn=dn.value,Mn=dn.key,$r=(0,C.default)(xe=["paths"]).call(xe,(0,g.default)(Lt)),ur=(0,C.default)(U=["meta","paths"]).call(U,(0,g.default)(Lt));return Re.getIn((0,C.default)(pt=["json"]).call(pt,(0,g.default)($r)))||Re.getIn((0,C.default)(ht=["resolved"]).call(ht,(0,g.default)($r)))||Re.getIn((0,C.default)(wt=["resolvedSubtrees"]).call(wt,(0,g.default)($r)))?Re.setIn((0,C.default)(It=[]).call(It,(0,g.default)(ur),[Mn]),(0,W.fromJS)(Dn)):Re}),(0,c.default)(o,_e.CLEAR_RESPONSE,function(Re,ke){var xe=ke.payload;return Re.deleteIn(["responses",xe.path,xe.method])}),(0,c.default)(o,_e.CLEAR_REQUEST,function(Re,ke){var xe=ke.payload;return Re.deleteIn(["requests",xe.path,xe.method])}),(0,c.default)(o,_e.SET_SCHEME,function(Re,ke){var xe=ke.payload,U=xe.scheme,pt=xe.path,ht=xe.method;return pt&&ht?Re.setIn(["scheme",pt,ht],U):pt||ht?void 0:Re.setIn(["scheme","_defaultScheme"],U)}),o)},3881:(n,s,t)=>{t.r(s),t.d(s,{lastError:()=>ht,url:()=>wt,specStr:()=>It,specSource:()=>dn,specJson:()=>Lt,specResolved:()=>Dn,specResolvedSubtree:()=>Mn,specJsonWithResolvedSubtrees:()=>ur,spec:()=>Pr,isOAS3:()=>xr,info:()=>fn,externalDocs:()=>Nn,version:()=>$n,semver:()=>Qn,paths:()=>Tn,operations:()=>Yr,consumes:()=>ji,produces:()=>ii,security:()=>Ui,securityDefinitions:()=>Jr,findDefinition:()=>An,definitions:()=>hn,basePath:()=>qr,host:()=>Ri,schemes:()=>qi,operationsWithRootInherited:()=>Zo,tags:()=>bo,tagDetails:()=>Ys,operationsWithTags:()=>Ws,taggedOperations:()=>wi,responses:()=>lo,requests:()=>go,mutatedRequests:()=>Ge,responseFor:()=>St,requestFor:()=>Et,mutatedRequestFor:()=>Bn,allowTryItOutFor:()=>_r,parameterWithMetaByIdentity:()=>Gr,parameterInclusionSettingFor:()=>xi,parameterWithMeta:()=>Zs,operationWithMeta:()=>jo,getParameter:()=>sl,hasHost:()=>ml,parameterValues:()=>nu,parametersIncludeIn:()=>Xu,parametersIncludeType:()=>Pf,contentTypeValues:()=>Fl,currentProducesFor:()=>qc,producesOptionsFor:()=>up,consumesOptionsFor:()=>Eh,operationScheme:()=>Wp,canExecuteScheme:()=>Th,validateBeforeExecute:()=>ru,getOAS3RequiredRequestBodyContentType:()=>Zc,isMediaTypeSchemaPropertiesEqual:()=>Ip});var o=t(9334),c=t(2691),g=t(5171),C=t(8136),D=t(29),P=t(8818),j=t(2565),W=t(6145),re=t(1778),ie=t(6785),ge=t(4350),_e=t(9963),Le=t(4163),Re=t(8639),ke=t(6298),xe=t(9725),U=["get","put","post","delete","options","head","patch","trace"],pt=function(lr){return lr||(0,xe.Map)()},ht=(0,Re.createSelector)(pt,function(lr){return lr.get("lastError")}),wt=(0,Re.createSelector)(pt,function(lr){return lr.get("url")}),It=(0,Re.createSelector)(pt,function(lr){return lr.get("spec")||""}),dn=(0,Re.createSelector)(pt,function(lr){return lr.get("specSource")||"not-editor"}),Lt=(0,Re.createSelector)(pt,function(lr){return lr.get("json",(0,xe.Map)())}),Dn=(0,Re.createSelector)(pt,function(lr){return lr.get("resolved",(0,xe.Map)())}),Mn=function(lr,mi){var eo;return lr.getIn((0,g.default)(eo=["resolvedSubtrees"]).call(eo,(0,c.default)(mi)),void 0)},$r=function lr(mi,eo){return xe.Map.isMap(mi)&&xe.Map.isMap(eo)?eo.get("$$ref")?eo:(0,xe.OrderedMap)().mergeWith(lr,mi,eo):eo},ur=(0,Re.createSelector)(pt,function(lr){return(0,xe.OrderedMap)().mergeWith($r,lr.get("json"),lr.get("resolvedSubtrees"))}),Pr=function(lr){return Lt(lr)},xr=(0,Re.createSelector)(Pr,function(){return!1}),fn=(0,Re.createSelector)(Pr,function(lr){return Yi(lr&&lr.get("info"))}),Nn=(0,Re.createSelector)(Pr,function(lr){return Yi(lr&&lr.get("externalDocs"))}),$n=(0,Re.createSelector)(fn,function(lr){return lr&&lr.get("version")}),Qn=(0,Re.createSelector)($n,function(lr){var mi;return(0,C.default)(mi=/v?([0-9]*)\.([0-9]*)\.([0-9]*)/i.exec(lr)).call(mi,1)}),Tn=(0,Re.createSelector)(ur,function(lr){return lr.get("paths")}),Yr=(0,Re.createSelector)(Tn,function(lr){if(!lr||lr.size<1)return(0,xe.List)();var mi=(0,xe.List)();return lr&&(0,D.default)(lr)?((0,D.default)(lr).call(lr,function(eo,Lo){if(!eo||!(0,D.default)(eo))return{};(0,D.default)(eo).call(eo,function(Xo,rs){var us;(0,P.default)(U).call(U,rs)<0||(mi=mi.push((0,xe.fromJS)({path:Lo,method:rs,operation:Xo,id:(0,g.default)(us="".concat(rs,"-")).call(us,Lo)})))})}),mi):(0,xe.List)()}),ji=(0,Re.createSelector)(Pr,function(lr){return(0,xe.Set)(lr.get("consumes"))}),ii=(0,Re.createSelector)(Pr,function(lr){return(0,xe.Set)(lr.get("produces"))}),Ui=(0,Re.createSelector)(Pr,function(lr){return lr.get("security",(0,xe.List)())}),Jr=(0,Re.createSelector)(Pr,function(lr){return lr.get("securityDefinitions")}),An=function(lr,mi){var eo=lr.getIn(["resolvedSubtrees","definitions",mi],null),Lo=lr.getIn(["json","definitions",mi],null);return eo||Lo||null},hn=(0,Re.createSelector)(Pr,function(lr){var mi=lr.get("definitions");return xe.Map.isMap(mi)?mi:(0,xe.Map)()}),qr=(0,Re.createSelector)(Pr,function(lr){return lr.get("basePath")}),Ri=(0,Re.createSelector)(Pr,function(lr){return lr.get("host")}),qi=(0,Re.createSelector)(Pr,function(lr){return lr.get("schemes",(0,xe.Map)())}),Zo=(0,Re.createSelector)(Yr,ji,ii,function(lr,mi,eo){return(0,j.default)(lr).call(lr,function(Lo){return Lo.update("operation",function(Xo){return Xo?xe.Map.isMap(Xo)?Xo.withMutations(function(rs){return rs.get("consumes")||rs.update("consumes",function(us){return(0,xe.Set)(us).merge(mi)}),rs.get("produces")||rs.update("produces",function(us){return(0,xe.Set)(us).merge(eo)}),rs}):void 0:(0,xe.Map)()})})}),bo=(0,Re.createSelector)(Pr,function(lr){var mi=lr.get("tags",(0,xe.List)());return xe.List.isList(mi)?(0,W.default)(mi).call(mi,function(eo){return xe.Map.isMap(eo)}):(0,xe.List)()}),Ys=function(lr,mi){var eo,Lo=bo(lr)||(0,xe.List)();return(0,re.default)(eo=(0,W.default)(Lo).call(Lo,xe.Map.isMap)).call(eo,function(Xo){return Xo.get("name")===mi},(0,xe.Map)())},Ws=(0,Re.createSelector)(Zo,bo,function(lr,mi){return(0,ie.default)(lr).call(lr,function(eo,Lo){var Xo=(0,xe.Set)(Lo.getIn(["operation","tags"]));return Xo.count()<1?eo.update("default",(0,xe.List)(),function(rs){return rs.push(Lo)}):(0,ie.default)(Xo).call(Xo,function(rs,us){return rs.update(us,(0,xe.List)(),function(ma){return ma.push(Lo)})},eo)},(0,ie.default)(mi).call(mi,function(eo,Lo){return eo.set(Lo.get("name"),(0,xe.List)())},(0,xe.OrderedMap)()))}),wi=function(lr){return function(mi){var eo,Lo=(0,mi.getConfigs)(),Xo=Lo.tagsSorter,rs=Lo.operationsSorter;return(0,j.default)(eo=Ws(lr).sortBy(function(us,ma){return ma},function(us,ma){var Ka="function"==typeof Xo?Xo:ke.wh.tagsSorter[Xo];return Ka?Ka(us,ma):null})).call(eo,function(us,ma){var Ka="function"==typeof rs?rs:ke.wh.operationsSorter[rs],xu=Ka?(0,ge.default)(us).call(us,Ka):us;return(0,xe.Map)({tagDetails:Ys(lr,ma),operations:xu})})}},lo=(0,Re.createSelector)(pt,function(lr){return lr.get("responses",(0,xe.Map)())}),go=(0,Re.createSelector)(pt,function(lr){return lr.get("requests",(0,xe.Map)())}),Ge=(0,Re.createSelector)(pt,function(lr){return lr.get("mutatedRequests",(0,xe.Map)())}),St=function(lr,mi,eo){return lo(lr).getIn([mi,eo],null)},Et=function(lr,mi,eo){return go(lr).getIn([mi,eo],null)},Bn=function(lr,mi,eo){return Ge(lr).getIn([mi,eo],null)},_r=function(){return!0},Gr=function(lr,mi,eo){var Lo,Xo,rs=ur(lr).getIn((0,g.default)(Lo=["paths"]).call(Lo,(0,c.default)(mi),["parameters"]),(0,xe.OrderedMap)()),us=lr.getIn((0,g.default)(Xo=["meta","paths"]).call(Xo,(0,c.default)(mi),["parameters"]),(0,xe.OrderedMap)()),ma=(0,j.default)(rs).call(rs,function(Ka){var xu,Kn,Pi,as=us.get((0,g.default)(xu="".concat(eo.get("in"),".")).call(xu,eo.get("name"))),Zi=us.get((0,g.default)(Kn=(0,g.default)(Pi="".concat(eo.get("in"),".")).call(Pi,eo.get("name"),".hash-")).call(Kn,eo.hashCode()));return(0,xe.OrderedMap)().merge(Ka,as,Zi)});return(0,re.default)(ma).call(ma,function(Ka){return Ka.get("in")===eo.get("in")&&Ka.get("name")===eo.get("name")},(0,xe.OrderedMap)())},xi=function(lr,mi,eo,Lo){var Xo,rs,us=(0,g.default)(Xo="".concat(Lo,".")).call(Xo,eo);return lr.getIn((0,g.default)(rs=["meta","paths"]).call(rs,(0,c.default)(mi),["parameter_inclusions",us]),!1)},Zs=function(lr,mi,eo,Lo){var Xo,rs=ur(lr).getIn((0,g.default)(Xo=["paths"]).call(Xo,(0,c.default)(mi),["parameters"]),(0,xe.OrderedMap)()),us=(0,re.default)(rs).call(rs,function(ma){return ma.get("in")===Lo&&ma.get("name")===eo},(0,xe.OrderedMap)());return Gr(lr,mi,us)},jo=function(lr,mi,eo){var Lo,Xo=ur(lr).getIn(["paths",mi,eo],(0,xe.OrderedMap)()),rs=lr.getIn(["meta","paths",mi,eo],(0,xe.OrderedMap)()),us=(0,j.default)(Lo=Xo.get("parameters",(0,xe.List)())).call(Lo,function(ma){return Gr(lr,[mi,eo],ma)});return(0,xe.OrderedMap)().merge(Xo,rs).set("parameters",us)};function sl(lr,mi,eo,Lo){var Xo;mi=mi||[];var rs=lr.getIn((0,g.default)(Xo=["meta","paths"]).call(Xo,(0,c.default)(mi),["parameters"]),(0,xe.fromJS)([]));return(0,re.default)(rs).call(rs,function(us){return xe.Map.isMap(us)&&us.get("name")===eo&&us.get("in")===Lo})||(0,xe.Map)()}var ml=(0,Re.createSelector)(Pr,function(lr){var mi=lr.get("host");return"string"==typeof mi&&mi.length>0&&"/"!==mi[0]});function nu(lr,mi,eo){var Lo;mi=mi||[];var Xo=jo.apply(void 0,(0,g.default)(Lo=[lr]).call(Lo,(0,c.default)(mi))).get("parameters",(0,xe.List)());return(0,ie.default)(Xo).call(Xo,function(rs,us){var ma=eo&&"body"===us.get("in")?us.get("value_xml"):us.get("value");return rs.set((0,ke.V9)(us,{allowHashes:!1}),ma)},(0,xe.fromJS)({}))}function Xu(lr){var mi=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"";if(xe.List.isList(lr))return(0,_e.default)(lr).call(lr,function(eo){return xe.Map.isMap(eo)&&eo.get("in")===mi})}function Pf(lr){var mi=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"";if(xe.List.isList(lr))return(0,_e.default)(lr).call(lr,function(eo){return xe.Map.isMap(eo)&&eo.get("type")===mi})}function Fl(lr,mi){var eo,Lo;mi=mi||[];var Xo=ur(lr).getIn((0,g.default)(eo=["paths"]).call(eo,(0,c.default)(mi)),(0,xe.fromJS)({})),rs=lr.getIn((0,g.default)(Lo=["meta","paths"]).call(Lo,(0,c.default)(mi)),(0,xe.fromJS)({})),us=qc(lr,mi),ma=Xo.get("parameters")||new xe.List,Ka=rs.get("consumes_value")?rs.get("consumes_value"):Pf(ma,"file")?"multipart/form-data":Pf(ma,"formData")?"application/x-www-form-urlencoded":void 0;return(0,xe.fromJS)({requestContentType:Ka,responseContentType:us})}function qc(lr,mi){var eo,Lo;mi=mi||[];var Xo=ur(lr).getIn((0,g.default)(eo=["paths"]).call(eo,(0,c.default)(mi)),null);if(null!==Xo){var rs=lr.getIn((0,g.default)(Lo=["meta","paths"]).call(Lo,(0,c.default)(mi),["produces_value"]),null),us=Xo.getIn(["produces",0],null);return rs||us||"application/json"}}function up(lr,mi){var eo;mi=mi||[];var Lo=ur(lr),Xo=Lo.getIn((0,g.default)(eo=["paths"]).call(eo,(0,c.default)(mi)),null);if(null!==Xo){var us=(0,o.default)(mi,1)[0],ma=Xo.get("produces",null),Ka=Lo.getIn(["paths",us,"produces"],null),xu=Lo.getIn(["produces"],null);return ma||Ka||xu}}function Eh(lr,mi){var eo;mi=mi||[];var Lo=ur(lr),Xo=Lo.getIn((0,g.default)(eo=["paths"]).call(eo,(0,c.default)(mi)),null);if(null!==Xo){var us=(0,o.default)(mi,1)[0],ma=Xo.get("consumes",null),Ka=Lo.getIn(["paths",us,"consumes"],null),xu=Lo.getIn(["consumes"],null);return ma||Ka||xu}}var Wp=function(lr,mi,eo){var Lo=lr.get("url").match(/^([a-z][a-z0-9+\-.]*):/),Xo=(0,Le.default)(Lo)?Lo[1]:null;return lr.getIn(["scheme",mi,eo])||lr.getIn(["scheme","_defaultScheme"])||Xo||""},Th=function(lr,mi,eo){var Lo;return(0,P.default)(Lo=["http","https"]).call(Lo,Wp(lr,mi,eo))>-1},ru=function(lr,mi){var eo;mi=mi||[];var Lo=lr.getIn((0,g.default)(eo=["meta","paths"]).call(eo,(0,c.default)(mi),["parameters"]),(0,xe.fromJS)([])),Xo=!0;return(0,D.default)(Lo).call(Lo,function(rs){var us=rs.get("errors");us&&us.count()&&(Xo=!1)}),Xo},Zc=function(lr,mi){var eo,Lo,Xo={requestBody:!1,requestContentType:{}},rs=lr.getIn((0,g.default)(eo=["resolvedSubtrees","paths"]).call(eo,(0,c.default)(mi),["requestBody"]),(0,xe.fromJS)([]));return rs.size<1||(rs.getIn(["required"])&&(Xo.requestBody=rs.getIn(["required"])),(0,D.default)(Lo=rs.getIn(["content"]).entrySeq()).call(Lo,function(us){var ma=us[0];if(us[1].getIn(["schema","required"])){var Ka=us[1].getIn(["schema","required"]).toJS();Xo.requestContentType[ma]=Ka}})),Xo},Ip=function(lr,mi,eo,Lo){var Xo;if((eo||Lo)&&eo===Lo)return!0;var rs=lr.getIn((0,g.default)(Xo=["resolvedSubtrees","paths"]).call(Xo,(0,c.default)(mi),["requestBody","content"]),(0,xe.fromJS)([]));if(rs.size<2||!eo||!Lo)return!1;var us=rs.getIn([eo,"schema","properties"],(0,xe.fromJS)([])),ma=rs.getIn([Lo,"schema","properties"],(0,xe.fromJS)([]));return!!us.equals(ma)};function Yi(lr){return xe.Map.isMap(lr)?lr:new xe.Map}},7508:(n,s,t)=>{t.r(s),t.d(s,{updateSpec:()=>C,updateJsonSpec:()=>D,executeRequest:()=>P,validateParams:()=>j});var o=t(2740),c=t(29),g=t(9908),C=function(W,re){var ie=re.specActions;return function(){W.apply(void 0,arguments),ie.parseToJson.apply(ie,arguments)}},D=function(W,re){var ie=re.specActions;return function(){for(var ge=arguments.length,_e=new Array(ge),Le=0;Le<ge;Le++)_e[Le]=arguments[Le];W.apply(void 0,_e),ie.invalidateResolvedSubtreeCache();var Re=_e[0],ke=(0,g.default)(Re,["paths"])||{},xe=(0,o.default)(ke);(0,c.default)(xe).call(xe,function(U){(0,g.default)(ke,[U]).$ref&&ie.requestResolvedSubtree(["paths",U])}),ie.requestResolvedSubtree(["components","securitySchemes"])}},P=function(W,re){var ie=re.specActions;return function(ge){return ie.logRequest(ge),W(ge)}},j=function(W,re){var ie=re.specSelectors;return function(ge){return W(ge,ie.isOAS3())}}},4852:(n,s,t)=>{t.r(s),t.d(s,{loaded:()=>o});var o=function(c,g){return function(){c.apply(void 0,arguments);var C=g.getConfigs().withCredentials;void 0!==C&&(g.fn.fetch.withCredentials="string"==typeof C?"true"===C:!!C)}}},2990:(n,s,t)=>{t.r(s),t.d(s,{default:()=>W});var o=t(5171);const c=(t.d(ie={},{default:()=>n6}),ie),g=(re=>{var ie={};return t.d(ie,re),ie})({buildRequest:()=>u6,execute:()=>P8}),C=(re=>{var ie={};return t.d(ie,re),ie})({default:()=>iA,makeHttp:()=>v3,serializeRes:()=>YT}),D=(re=>{var ie={};return t.d(ie,re),ie})({default:()=>H8});var ie,P=t(5013),j=t(4852);function W(re){var ie=re.configs,ge=re.getConfigs;return{fn:{fetch:(0,C.makeHttp)(C.default,ie.preFetch,ie.postFetch),buildRequest:g.buildRequest,execute:g.execute,resolve:c.default,resolveSubtree:function(_e,Le,Re){var ke;if(void 0===Re){var xe=ge();Re={modelPropertyMacro:xe.modelPropertyMacro,parameterMacro:xe.parameterMacro,requestInterceptor:xe.requestInterceptor,responseInterceptor:xe.responseInterceptor}}for(var U=arguments.length,pt=new Array(U>3?U-3:0),ht=3;ht<U;ht++)pt[ht-3]=arguments[ht];return D.default.apply(void 0,(0,o.default)(ke=[_e,Le,Re]).call(ke,pt))},serializeRes:C.serializeRes,opId:P.opId},statePlugins:{configs:{wrapActions:{loaded:j.loaded}}}}}},8525:(n,s,t)=>{t.r(s),t.d(s,{default:()=>c});var o=t(6298);function c(){return{fn:{shallowEqualKeys:o.be}}}},8347:(n,s,t)=>{t.r(s),t.d(s,{getDisplayName:()=>o});var o=function(c){return c.displayName||c.name||"Component"}},3420:(n,s,t)=>{t.r(s),t.d(s,{default:()=>P});var o=t(313),c=t(6298),g=t(5005),C=t(8347),D=t(8287);const P=function(j){var W,Re,re=j.getComponents,ie=j.getStore,ge=j.getSystem,_e=(W=(0,g.getComponent)(ge,ie,re),(0,c.HP)(W,function(){for(var Re=arguments.length,ke=new Array(Re),xe=0;xe<Re;xe++)ke[xe]=arguments[xe];return(0,o.default)(ke)}));return{rootInjects:{getComponent:_e,makeMappedContainer:(Re=(0,g.withMappedContainer)(ge,ie,_e),(0,D.Z)(Re,function(){for(var ke=arguments.length,xe=new Array(ke),U=0;U<ke;U++)xe[U]=arguments[U];return xe})),render:(0,g.render)(ge,ie,g.getComponent,re)},fn:{getDisplayName:C.getDisplayName}}}},5005:(n,s,t)=>{t.r(s),t.d(s,{getComponent:()=>ht,render:()=>pt,withMappedContainer:()=>U});var o=t(1581),c=t(1013),g=t(863),C=t(7344),D=t(8656),P=t(9972),j=t(5416),W=t(2740),re=t(810);const ie=(t.d(It={},{default:()=>c6}),It);var It,ge=t(9871);const _e=(wt=>{var It={};return t.d(It,wt),It})({Provider:()=>G8,connect:()=>SI}),Le=(wt=>{var It={};return t.d(It,wt),It})({default:()=>OI()}),Re=(wt=>{var It={};return t.d(It,wt),It})({default:()=>xI()});var ke=function(wt,It,dn){return(0,ge.compose)(dn?(Lt=wt,Dn=dn,function(Mn){var $r=Lt().fn,ur=function(Pr){(0,P.default)(fn,Pr);var xr=(0,j.default)(fn);function fn(){return(0,C.default)(this,fn),xr.apply(this,arguments)}return(0,D.default)(fn,[{key:"render",value:function(){return re.default.createElement(_e.Provider,{store:Dn},re.default.createElement(Mn,(0,g.default)({},this.props,this.context)))}}]),fn}(re.Component);return ur.displayName="WithRoot(".concat($r.getDisplayName(Mn),")"),ur}):Re.default,(0,_e.connect)(function(Lt,Dn){var Mn,$r=(0,c.default)((0,c.default)({},Dn),wt());return((null===(Mn=It.prototype)||void 0===Mn?void 0:Mn.mapStateToProps)||function(Pr){return{state:Pr}})(Lt,$r)}),function(Lt){return function(Dn){var Mn=Lt().fn,$r=function(ur){(0,P.default)(xr,ur);var Pr=(0,j.default)(xr);function xr(){return(0,C.default)(this,xr),Pr.apply(this,arguments)}return(0,D.default)(xr,[{key:"render",value:function(){return re.default.createElement(Dn,(0,g.default)({},Lt(),this.props,this.context))}}]),xr}(re.Component);return $r.displayName="WithSystem(".concat(Mn.getDisplayName(Dn),")"),$r}}(wt))(It);var Lt,Dn},xe=function(wt,It,dn,Lt){for(var Dn in It){var Mn=It[Dn];"function"==typeof Mn&&Mn(dn[Dn],Lt[Dn],wt())}},U=function(wt,It,dn){return function(Lt,Dn){var Mn=wt().fn,$r=dn(Lt,"root"),ur=function(Pr){(0,P.default)(fn,Pr);var xr=(0,j.default)(fn);function fn(Nn,$n){var Qn;return(0,C.default)(this,fn),Qn=xr.call(this,Nn,$n),xe(wt,Dn,Nn,{}),Qn}return(0,D.default)(fn,[{key:"UNSAFE_componentWillReceiveProps",value:function(Nn){xe(wt,Dn,Nn,this.props)}},{key:"render",value:function(){var Nn=(0,Le.default)(this.props,Dn?(0,W.default)(Dn):[]);return re.default.createElement($r,Nn)}}]),fn}(re.Component);return ur.displayName="WithMappedContainer(".concat(Mn.getDisplayName($r),")"),ur}},pt=function(wt,It,dn,Lt){return function(Dn){var Mn=dn(wt,It,Lt)("App","root");ie.default.render(re.default.createElement(Mn,null),Dn)}},ht=function(wt,It,dn){return function(Lt,Dn){var Mn=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{};if("string"!=typeof Lt)throw new TypeError("Need a string, to fetch a component. Was given a "+(0,o.default)(Lt));var $r=dn(Lt);return $r?Dn?"root"===Dn?ke(wt,$r,It()):ke(wt,$r):$r:(Mn.failSilently||wt().log.warn("Could not find component:",Lt),null)}}},471:(n,s,t)=>{t.d(s,{d3:()=>g.default,C2:()=>ht});var o=t(2740),c=t(2372);const g=(t.d(It={},{default:()=>XI}),It),C=(wt=>{var It={};return t.d(It,wt),It})({default:()=>e4}),D=(wt=>{var It={};return t.d(It,wt),It})({default:()=>r4}),P=(wt=>{var It={};return t.d(It,wt),It})({default:()=>s4}),j=(wt=>{var It={};return t.d(It,wt),It})({default:()=>u4}),W=(wt=>{var It={};return t.d(It,wt),It})({default:()=>f4}),re=(wt=>{var It={};return t.d(It,wt),It})({default:()=>_4}),ie=(wt=>{var It={};return t.d(It,wt),It})({default:()=>v4}),ge=(wt=>{var It={};return t.d(It,wt),It})({default:()=>y4}),_e=(wt=>{var It={};return t.d(It,wt),It})({default:()=>b4}),Le=(wt=>{var It={};return t.d(It,wt),It})({default:()=>E4}),Re=(wt=>{var It={};return t.d(It,wt),It})({default:()=>T4}),ke=(wt=>{var It={};return t.d(It,wt),It})({default:()=>S4}),xe=(wt=>{var It={};return t.d(It,wt),It})({default:()=>C4});var It;g.default.registerLanguage("json",D.default),g.default.registerLanguage("js",C.default),g.default.registerLanguage("xml",P.default),g.default.registerLanguage("yaml",W.default),g.default.registerLanguage("http",re.default),g.default.registerLanguage("bash",j.default),g.default.registerLanguage("powershell",ie.default),g.default.registerLanguage("javascript",C.default);var U={agate:ge.default,arta:_e.default,monokai:Le.default,nord:Re.default,obsidian:ke.default,"tomorrow-night":xe.default},pt=(0,o.default)(U),ht=function(wt){return(0,c.default)(pt).call(pt,wt)?U[wt]:(console.warn("Request style '".concat(wt,"' is not available, returning default instead")),ge.default)}},6298:(n,s,t)=>{t.d(s,{r3:()=>Fl,GZ:()=>up,Xb:()=>ma,oJ:()=>Zc,XV:()=>mi,iQ:()=>St,J6:()=>Ip,DR:()=>Bn,oG:()=>Ri,Uj:()=>us,QG:()=>ru,po:()=>lr,nX:()=>Yi,gp:()=>Et,xi:()=>Xu,kJ:()=>Ws,O2:()=>xu,LQ:()=>Zo,Wl:()=>Ys,Kn:()=>bo,HP:()=>wi,AF:()=>qi,D$:()=>Lo,Ay:()=>lo,Q2:()=>go,mz:()=>qr,V9:()=>Xo,cz:()=>rs,UG:()=>Pf,Zl:()=>_r,hW:()=>Th,Nm:()=>Wp,be:()=>Eh,wh:()=>qc,Pz:()=>eo,_5:()=>Ge,Ik:()=>xi});var o=t(2691),c=(t(9334),t(1581)),g=t(3248),C=t(4163),D=t(2565),P=t(2954),j=t(5171),W=t(29),re=t(6145),ie=t(2740),ge=(t(5527),t(6785)),_e=t(7512),Le=t(4350),Re=t(8136),ke=t(9963),xe=(t(2372),t(313)),U=t(8818),pt=t(1778),ht=t(3590),wt=t(5942),It=t(9725);const dn=(t.d(Pi={},{sanitizeUrl:()=>M4.N}),Pi),Lt=(Kn=>{var Pi={};return t.d(Pi,Kn),Pi})({default:()=>O4()}),Dn=(Kn=>{var Pi={};return t.d(Pi,Kn),Pi})({default:()=>x4()});var Pi,Mn=t(5476);const $r=(Kn=>{var Pi={};return t.d(Pi,Kn),Pi})({default:()=>R4()}),ur=(Kn=>{var Pi={};return t.d(Pi,Kn),Pi})({default:()=>P4()}),Pr=(Kn=>{var Pi={};return t.d(Pi,Kn),Pi})({default:()=>L4()});var xr=t(7068),fn=t(2473),Nn=t(7504);const $n=(Kn=>{var Pi={};return t.d(Pi,Kn),Pi})({default:()=>k4()});var Qn=t(9069),Tn=t(1798),Yr=t.n(Tn),ji=t(9072),ii=t.n(ji),Ui=t(626),Jr=t(8764).Buffer,An="default",hn=function(Kn){return It.default.Iterable.isIterable(Kn)};function qr(Kn){return bo(Kn)?hn(Kn)?Kn.toJS():Kn:{}}function Ri(Kn){var Pi,as;if(hn(Kn)||Kn instanceof Nn.Z.File||!bo(Kn))return Kn;if((0,C.default)(Kn))return(0,D.default)(as=It.default.Seq(Kn)).call(as,Ri).toList();if((0,xr.default)((0,P.default)(Kn))){var Zi,xs=function(is){if(!(0,xr.default)((0,P.default)(is)))return is;var hu,Al={},qa={},ja=(0,g.default)((0,P.default)(is).call(is));try{for(ja.s();!(hu=ja.n()).done;){var Du,If,Jp,Ql,Ku=hu.value;Al[Ku[0]]||qa[Ku[0]]&&qa[Ku[0]].containsMultiple?(qa[Ku[0]]||(qa[Ku[0]]={containsMultiple:!0,length:1},Al[(0,j.default)(Jp=(0,j.default)(Ql="".concat(Ku[0])).call(Ql,"_**[]")).call(Jp,qa[Ku[0]].length)]=Al[Ku[0]],delete Al[Ku[0]]),qa[Ku[0]].length+=1,Al[(0,j.default)(Du=(0,j.default)(If="".concat(Ku[0])).call(If,"_**[]")).call(Du,qa[Ku[0]].length)]=Ku[1]):Al[Ku[0]]=Ku[1]}}catch(Jf){ja.e(Jf)}finally{ja.f()}return Al}(Kn);return(0,D.default)(Zi=It.default.OrderedMap(xs)).call(Zi,Ri)}return(0,D.default)(Pi=It.default.OrderedMap(Kn)).call(Pi,Ri)}function qi(Kn){return(0,C.default)(Kn)?Kn:[Kn]}function Zo(Kn){return"function"==typeof Kn}function bo(Kn){return!!Kn&&"object"===(0,c.default)(Kn)}function Ys(Kn){return"function"==typeof Kn}function Ws(Kn){return(0,C.default)(Kn)}var wi=Mn.default;function lo(Kn,Pi){var as;return(0,ge.default)(as=(0,ie.default)(Kn)).call(as,function(Zi,xs){return Zi[xs]=Pi(Kn[xs],xs),Zi},{})}function go(Kn,Pi){var as;return(0,ge.default)(as=(0,ie.default)(Kn)).call(as,function(Zi,xs){var is=Pi(Kn[xs],xs);return is&&"object"===(0,c.default)(is)&&(0,_e.default)(Zi,is),Zi},{})}function Ge(Kn){return function(Pi){return function(as){return function(Zi){return"function"==typeof Zi?Zi(Kn()):as(Zi)}}}}function St(Kn){var Pi,as=Kn.keySeq();return as.contains(An)?An:(0,Le.default)(Pi=(0,re.default)(as).call(as,function(Zi){return"2"===(Zi+"")[0]})).call(Pi).first()}function Et(Kn,Pi){if(!It.default.Iterable.isIterable(Kn))return It.default.List();var as=Kn.getIn((0,C.default)(Pi)?Pi:[Pi]);return It.default.List.isList(as)?as:It.default.List()}function Bn(Kn){var Pi,as=[/filename\*=[^']+'\w*'"([^"]+)";?/i,/filename\*=[^']+'\w*'([^;]+);?/i,/filename="([^;]*);?"/i,/filename=([^;]*);?/i];if((0,ke.default)(as).call(as,function(Zi){return null!==(Pi=Zi.exec(Kn))}),null!==Pi&&Pi.length>1)try{return decodeURIComponent(Pi[1])}catch(Zi){console.error(Zi)}return null}function _r(Kn){return Pi=Kn.replace(/\.[^./]*$/,""),(0,Dn.default)((0,Lt.default)(Pi));var Pi}function Gr(Kn,Pi,as,Zi,xs){if(!Pi)return[];var is=[],hu=Pi.get("nullable"),Al=Pi.get("required"),Ci=Pi.get("maximum"),qa=Pi.get("minimum"),ja=Pi.get("type"),Ku=Pi.get("format"),Du=Pi.get("maxLength"),If=Pi.get("minLength"),Jp=Pi.get("uniqueItems"),Ql=Pi.get("maxItems"),Jf=Pi.get("minItems"),pg=Pi.get("pattern"),Qp=as||!0===Al,Ng=null!=Kn;if(hu&&null===Kn||!ja||!(Qp||Ng&&"array"===ja||Qp||Ng))return[];var I_="string"===ja&&Kn,l1="array"===ja&&(0,C.default)(Kn)&&Kn.length,Xp="array"===ja&&It.default.List.isList(Kn)&&Kn.count(),gd=[I_,l1,Xp,"array"===ja&&"string"==typeof Kn&&Kn,"file"===ja&&Kn instanceof Nn.Z.File,"boolean"===ja&&(Kn||!1===Kn),"number"===ja&&(Kn||0===Kn),"integer"===ja&&(Kn||0===Kn),"object"===ja&&"object"===(0,c.default)(Kn)&&null!==Kn,"object"===ja&&"string"==typeof Kn&&Kn],Pg=(0,ke.default)(gd).call(gd,function(za){return!!za});if(Qp&&!Pg&&!Zi)return is.push("Required field is not provided"),is;if("object"===ja&&(null===xs||"application/json"===xs)){var Em,hg=Kn;if("string"==typeof Kn)try{hg=JSON.parse(Kn)}catch(za){return is.push("Parameter string value must be valid JSON"),is}Pi&&Pi.has("required")&&Ys(Al.isList)&&Al.isList()&&(0,W.default)(Al).call(Al,function(za){void 0===hg[za]&&is.push({propKey:za,error:"Required property not found"})}),Pi&&Pi.has("properties")&&(0,W.default)(Em=Pi.get("properties")).call(Em,function(za,Fu){var ld=Gr(hg[Fu],za,!1,Zi,xs);is.push.apply(is,(0,o.default)((0,D.default)(ld).call(ld,function(R0){return{propKey:Fu,error:R0}})))})}if(pg){var iv=function(za,Fu){if(!new RegExp(Fu).test(za))return"Value must follow pattern "+Fu}(Kn,pg);iv&&is.push(iv)}if(Jf&&"array"===ja){var Lp=function(za,Fu){var ld;if(!za&&Fu>=1||za&&za.length<Fu)return(0,j.default)(ld="Array must contain at least ".concat(Fu," item")).call(ld,1===Fu?"":"s")}(Kn,Jf);Lp&&is.push(Lp)}if(Ql&&"array"===ja){var RA=function(za,Fu){var ld;if(za&&za.length>Fu)return(0,j.default)(ld="Array must not contain more then ".concat(Fu," item")).call(ld,1===Fu?"":"s")}(Kn,Ql);RA&&is.push({needRemove:!0,error:RA})}if(Jp&&"array"===ja){var Od=function(za,Fu){if(za&&("true"===Fu||!0===Fu)){var ld=(0,It.fromJS)(za),R0=ld.toSet();if(za.length>R0.size){var u1=(0,It.Set)();if((0,W.default)(ld).call(ld,function(N0,Fp){(0,re.default)(ld).call(ld,function(c1){return Ys(c1.equals)?c1.equals(N0):c1===N0}).size>1&&(u1=u1.add(Fp))}),0!==u1.size)return(0,D.default)(u1).call(u1,function(N0){return{index:N0,error:"No duplicates allowed."}}).toArray()}}}(Kn,Jp);Od&&is.push.apply(is,(0,o.default)(Od))}if(Du||0===Du){var NA=function(za,Fu){var ld;if(za.length>Fu)return(0,j.default)(ld="Value must be no longer than ".concat(Fu," character")).call(ld,1!==Fu?"s":"")}(Kn,Du);NA&&is.push(NA)}if(If){var _S=function(za,Fu){var ld;if(za.length<Fu)return(0,j.default)(ld="Value must be at least ".concat(Fu," character")).call(ld,1!==Fu?"s":"")}(Kn,If);_S&&is.push(_S)}if(Ci||0===Ci){var PA=function(za,Fu){if(za>Fu)return"Value must be less than ".concat(Fu)}(Kn,Ci);PA&&is.push(PA)}if(qa||0===qa){var IA=function(za,Fu){if(za<Fu)return"Value must be greater than ".concat(Fu)}(Kn,qa);IA&&is.push(IA)}if("string"===ja){var gS;if(!(gS="date-time"===Ku?function(za){if(isNaN(Date.parse(za)))return"Value must be a DateTime"}(Kn):"uuid"===Ku?function(za){if(za=za.toString().toLowerCase(),!/^[{(]?[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}[)}]?$/.test(za))return"Value must be a Guid"}(Kn):function(za){if(za&&"string"!=typeof za)return"Value must be a string"}(Kn)))return is;is.push(gS)}else if("boolean"===ja){var Sb=function(za){if("true"!==za&&"false"!==za&&!0!==za&&!1!==za)return"Value must be a boolean"}(Kn);if(!Sb)return is;is.push(Sb)}else if("number"===ja){var LA=function(za){if(!/^-?\d+(\.?\d+)?$/.test(za))return"Value must be a number"}(Kn);if(!LA)return is;is.push(LA)}else if("integer"===ja){var FA=function(za){if(!/^-?\d+$/.test(za))return"Value must be an integer"}(Kn);if(!FA)return is;is.push(FA)}else if("array"===ja){if(!l1&&!Xp)return is;Kn&&(0,W.default)(Kn).call(Kn,function(za,Fu){var ld=Gr(za,Pi.get("items"),!1,Zi,xs);is.push.apply(is,(0,o.default)((0,D.default)(ld).call(ld,function(R0){return{index:Fu,error:R0}})))})}else if("file"===ja){var kA=function(za){if(za&&!(za instanceof Nn.Z.File))return"Value must be a file"}(Kn);if(!kA)return is;is.push(kA)}return is}var xi=function(Kn,Pi){var as=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{},Zi=as.isOAS3,xs=void 0!==Zi&&Zi,is=as.bypassRequiredCheck,hu=void 0!==is&&is,Al=Kn.get("required"),Ci=(0,Qn.Z)(Kn,{isOAS3:xs}),qa=Ci.schema,ja=Ci.parameterContentMediaType;return Gr(Pi,qa,Al,hu,ja)},Zs=function(Kn,Pi,as){if(Kn&&(!Kn.xml||!Kn.xml.name)){if(Kn.xml=Kn.xml||{},!Kn.$$ref)return Kn.type||Kn.items||Kn.properties||Kn.additionalProperties?'<?xml version="1.0" encoding="UTF-8"?>\n\x3c!-- XML example cannot be generated; root element name is undefined --\x3e':null;var Zi=Kn.$$ref.match(/\S*\/(\S+)$/);Kn.xml.name=Zi[1]}return(0,fn.memoizedCreateXMLExample)(Kn,Pi,as)},jo=[{when:/json/,shouldStringifyTypes:["string"]}],sl=["object"],ml=function(Kn,Pi,as,Zi){var xs=(0,fn.memoizedSampleFromSchema)(Kn,Pi,Zi),is=(0,c.default)(xs),hu=(0,ge.default)(jo).call(jo,function(Al,Ci){var qa;return Ci.when.test(as)?(0,j.default)(qa=[]).call(qa,(0,o.default)(Al),(0,o.default)(Ci.shouldStringifyTypes)):Al},sl);return(0,ur.default)(hu,function(Al){return Al===is})?(0,xe.default)(xs,null,2):xs},nu=function(Kn,Pi,as,Zi){var xs,is=ml(Kn,Pi,as,Zi);try{"\n"===(xs=Ui.default.dump(Ui.default.load(is),{lineWidth:-1},{schema:Ui.JSON_SCHEMA}))[xs.length-1]&&(xs=(0,Re.default)(xs).call(xs,0,xs.length-1))}catch(hu){return console.error(hu),"error: could not generate yaml example"}return xs.replace(/\t/g,"  ")},Xu=function(Kn){var Pi=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"",as=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{},Zi=arguments.length>3&&void 0!==arguments[3]?arguments[3]:void 0;return Kn&&Ys(Kn.toJS)&&(Kn=Kn.toJS()),Zi&&Ys(Zi.toJS)&&(Zi=Zi.toJS()),/xml/.test(Pi)?Zs(Kn,as,Zi):/(yaml|yml)/.test(Pi)?nu(Kn,as,Pi,Zi):ml(Kn,as,Pi,Zi)},Pf=function(){var Kn={},Pi=Nn.Z.location.search;if(!Pi)return{};if(""!=Pi){var as=Pi.substr(1).split("&");for(var Zi in as)Object.prototype.hasOwnProperty.call(as,Zi)&&(Zi=as[Zi].split("="),Kn[decodeURIComponent(Zi[0])]=Zi[1]&&decodeURIComponent(Zi[1])||"")}return Kn},Fl=function(Kn){return(Kn instanceof Jr?Kn:Jr.from(Kn.toString(),"utf-8")).toString("base64")},qc={operationsSorter:{alpha:function(Kn,Pi){return Kn.get("path").localeCompare(Pi.get("path"))},method:function(Kn,Pi){return Kn.get("method").localeCompare(Pi.get("method"))}},tagsSorter:{alpha:function(Kn,Pi){return Kn.localeCompare(Pi)}}},up=function(Kn){var Pi=[];for(var as in Kn){var Zi=Kn[as];void 0!==Zi&&""!==Zi&&Pi.push([as,"=",encodeURIComponent(Zi).replace(/%20/g,"+")].join(""))}return Pi.join("&")},Eh=function(Kn,Pi,as){return!!(0,$r.default)(as,function(Zi){return(0,Pr.default)(Kn[Zi],Pi[Zi])})};function Wp(Kn){return"string"!=typeof Kn||""===Kn?"":(0,dn.sanitizeUrl)(Kn)}function Th(Kn){return!(!Kn||(0,U.default)(Kn).call(Kn,"localhost")>=0||(0,U.default)(Kn).call(Kn,"127.0.0.1")>=0||"none"===Kn)}function ru(Kn){if(!It.default.OrderedMap.isOrderedMap(Kn)||!Kn.size)return null;var Pi=(0,pt.default)(Kn).call(Kn,function(xs,is){return(0,ht.default)(is).call(is,"2")&&(0,ie.default)(xs.get("content")||{}).length>0}),as=Kn.get("default")||It.default.OrderedMap(),Zi=(as.get("content")||It.default.OrderedMap()).keySeq().toJS().length?as:null;return Pi||Zi}var Zc=function(Kn){return"string"==typeof Kn||Kn instanceof String?(0,wt.default)(Kn).call(Kn).replace(/\s/g,"%20"):""},Ip=function(Kn){return(0,$n.default)(Zc(Kn).replace(/%20/g,"_"))},Yi=function(Kn){return(0,re.default)(Kn).call(Kn,function(Pi,as){return/^x-/.test(as)})},lr=function(Kn){return(0,re.default)(Kn).call(Kn,function(Pi,as){return/^pattern|maxLength|minLength|maximum|minimum/.test(as)})};function mi(Kn,Pi){var as,Zi=arguments.length>2&&void 0!==arguments[2]?arguments[2]:function(){return!0};if("object"!==(0,c.default)(Kn)||(0,C.default)(Kn)||null===Kn||!Pi)return Kn;var xs=(0,_e.default)({},Kn);return(0,W.default)(as=(0,ie.default)(xs)).call(as,function(is){is===Pi&&Zi(xs[is],is)?delete xs[is]:xs[is]=mi(xs[is],Pi,Zi)}),xs}function eo(Kn){if("string"==typeof Kn)return Kn;if(Kn&&Kn.toJS&&(Kn=Kn.toJS()),"object"===(0,c.default)(Kn)&&null!==Kn)try{return(0,xe.default)(Kn,null,2)}catch(Pi){return String(Kn)}return null==Kn?"":Kn.toString()}function Lo(Kn){return"number"==typeof Kn?Kn.toString():Kn}function Xo(Kn){var Pi=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},as=Pi.returnAll,Zi=void 0!==as&&as,xs=Pi.allowHashes,is=void 0===xs||xs;if(!It.default.Map.isMap(Kn))throw new Error("paramToIdentifier: received a non-Im.Map parameter as input");var hu,Al,Ci,qa=Kn.get("name"),ja=Kn.get("in"),Ku=[];return Kn&&Kn.hashCode&&ja&&qa&&is&&Ku.push((0,j.default)(hu=(0,j.default)(Al="".concat(ja,".")).call(Al,qa,".hash-")).call(hu,Kn.hashCode())),ja&&qa&&Ku.push((0,j.default)(Ci="".concat(ja,".")).call(Ci,qa)),Ku.push(qa),Zi?Ku:Ku[0]||""}function rs(Kn,Pi){var as,Zi=Xo(Kn,{returnAll:!0});return(0,re.default)(as=(0,D.default)(Zi).call(Zi,function(xs){return Pi[xs]})).call(as,function(xs){return void 0!==xs})[0]}function us(){return Ka(Yr()(32).toString("base64"))}function ma(Kn){return Ka(ii()("sha256").update(Kn).digest("base64"))}function Ka(Kn){return Kn.replace(/\+/g,"-").replace(/\//g,"_").replace(/=/g,"")}var xu=function(Kn){return!Kn||!(!hn(Kn)||!Kn.isEmpty())}},2518:(n,s,t)=>{function o(c){return function(g){try{return!!JSON.parse(g)}catch(C){return null}}(c)?"json":null}t.d(s,{O:()=>o})},7504:(n,s,t)=>{t.d(s,{Z:()=>o});const o=function(){var c={location:{},history:{},open:function(){},close:function(){},File:function(){}};if("undefined"==typeof window)return c;try{c=window;for(var g=0,C=["File","Blob","FormData"];g<C.length;g++){var D=C[g];D in window&&(c[D]=window[D])}}catch(P){console.error(P)}return c}()},9069:(n,s,t)=>{t.d(s,{Z:()=>D});var o=t(6145),c=t(2372),g=t(9725),C=g.default.Set.of("type","format","items","default","maximum","exclusiveMaximum","minimum","exclusiveMinimum","maxLength","minLength","pattern","maxItems","minItems","uniqueItems","enum","multipleOf");function D(P){var j=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},W=j.isOAS3;if(!g.default.Map.isMap(P))return{schema:g.default.Map(),parameterContentMediaType:null};if(!W)return"body"===P.get("in")?{schema:P.get("schema",g.default.Map()),parameterContentMediaType:null}:{schema:(0,o.default)(P).call(P,function(ge,_e){return(0,c.default)(C).call(C,_e)}),parameterContentMediaType:null};if(P.get("content")){var re=P.get("content",g.default.Map({})).keySeq(),ie=re.first();return{schema:P.getIn(["content",ie,"schema"],g.default.Map()),parameterContentMediaType:ie}}return{schema:P.get("schema",g.default.Map()),parameterContentMediaType:null}}},8287:(n,s,t)=>{t.d(s,{Z:()=>ht});var o=t(7344),c=t(8656);const g=(t.d(It={},{default:()=>EA}),It),C=(wt=>{var It={};return t.d(It,wt),It})({default:()=>O0});var It,D=t(9972),P=t(5416);const j=(wt=>{var It={};return t.d(It,wt),It})({default:()=>V3});var W=t(4163),re=t(7930),ie=t(8898),ge=t(5487),_e=t(1778);const Le=(wt=>{var It={};return t.d(It,wt),It})({default:()=>B4()});var Re=t(6914),ke=t(5476),xe=function(wt){return function(It){return(0,W.default)(wt)&&(0,W.default)(It)&&wt.length===It.length&&(0,re.default)(wt).call(wt,function(dn,Lt){return dn===It[Lt]})}},U=function(){for(var wt=arguments.length,It=new Array(wt),dn=0;dn<wt;dn++)It[dn]=arguments[dn];return It},pt=function(wt){(0,D.default)(dn,wt);var It=(0,P.default)(dn);function dn(){return(0,o.default)(this,dn),It.apply(this,arguments)}return(0,c.default)(dn,[{key:"delete",value:function(Lt){var Dn=(0,ie.default)((0,ge.default)(this).call(this)),Mn=(0,_e.default)(Dn).call(Dn,xe(Lt));return(0,g.default)((0,C.default)(dn.prototype),"delete",this).call(this,Mn)}},{key:"get",value:function(Lt){var Dn=(0,ie.default)((0,ge.default)(this).call(this)),Mn=(0,_e.default)(Dn).call(Dn,xe(Lt));return(0,g.default)((0,C.default)(dn.prototype),"get",this).call(this,Mn)}},{key:"has",value:function(Lt){var Dn=(0,ie.default)((0,ge.default)(this).call(this));return-1!==(0,Le.default)(Dn).call(Dn,xe(Lt))}}]),dn}((0,j.default)(Re.default));const ht=function(wt){var It=arguments.length>1&&void 0!==arguments[1]?arguments[1]:U,dn=ke.default.Cache;ke.default.Cache=pt;var Lt=(0,ke.default)(wt,It);return ke.default.Cache=dn,Lt}},8764:(n,s,t)=>{const o=t(4780),c=t(3294),g="function"==typeof Symbol&&"function"==typeof Symbol.for?Symbol.for("nodejs.util.inspect.custom"):null;s.Buffer=P,s.SlowBuffer=function(Ge){return+Ge!=Ge&&(Ge=0),P.alloc(+Ge)},s.INSPECT_MAX_BYTES=50;const C=2147483647;function D(Ge){if(Ge>C)throw new RangeError('The value "'+Ge+'" is invalid for option "size"');const St=new Uint8Array(Ge);return Object.setPrototypeOf(St,P.prototype),St}function P(Ge,St,Et){if("number"==typeof Ge){if("string"==typeof St)throw new TypeError('The "string" argument must be of type string. Received type number');return re(Ge)}return j(Ge,St,Et)}function j(Ge,St,Et){if("string"==typeof Ge)return function(Gr,xi){if("string"==typeof xi&&""!==xi||(xi="utf8"),!P.isEncoding(xi))throw new TypeError("Unknown encoding: "+xi);const Zs=0|Le(Gr,xi);let jo=D(Zs);const sl=jo.write(Gr,xi);return sl!==Zs&&(jo=jo.slice(0,sl)),jo}(Ge,St);if(ArrayBuffer.isView(Ge))return function(Gr){if(Ys(Gr,Uint8Array)){const xi=new Uint8Array(Gr);return ge(xi.buffer,xi.byteOffset,xi.byteLength)}return ie(Gr)}(Ge);if(null==Ge)throw new TypeError("The first argument must be one of type string, Buffer, ArrayBuffer, Array, or Array-like Object. Received type "+typeof Ge);if(Ys(Ge,ArrayBuffer)||Ge&&Ys(Ge.buffer,ArrayBuffer)||"undefined"!=typeof SharedArrayBuffer&&(Ys(Ge,SharedArrayBuffer)||Ge&&Ys(Ge.buffer,SharedArrayBuffer)))return ge(Ge,St,Et);if("number"==typeof Ge)throw new TypeError('The "value" argument must not be of type number. Received type number');const Bn=Ge.valueOf&&Ge.valueOf();if(null!=Bn&&Bn!==Ge)return P.from(Bn,St,Et);const _r=function(Gr){if(P.isBuffer(Gr)){const xi=0|_e(Gr.length),Zs=D(xi);return 0===Zs.length||Gr.copy(Zs,0,0,xi),Zs}return void 0!==Gr.length?"number"!=typeof Gr.length||Ws(Gr.length)?D(0):ie(Gr):"Buffer"===Gr.type&&Array.isArray(Gr.data)?ie(Gr.data):void 0}(Ge);if(_r)return _r;if("undefined"!=typeof Symbol&&null!=Symbol.toPrimitive&&"function"==typeof Ge[Symbol.toPrimitive])return P.from(Ge[Symbol.toPrimitive]("string"),St,Et);throw new TypeError("The first argument must be one of type string, Buffer, ArrayBuffer, Array, or Array-like Object. Received type "+typeof Ge)}function W(Ge){if("number"!=typeof Ge)throw new TypeError('"size" argument must be of type number');if(Ge<0)throw new RangeError('The value "'+Ge+'" is invalid for option "size"')}function re(Ge){return W(Ge),D(Ge<0?0:0|_e(Ge))}function ie(Ge){const St=Ge.length<0?0:0|_e(Ge.length),Et=D(St);for(let Bn=0;Bn<St;Bn+=1)Et[Bn]=255&Ge[Bn];return Et}function ge(Ge,St,Et){if(St<0||Ge.byteLength<St)throw new RangeError('"offset" is outside of buffer bounds');if(Ge.byteLength<St+(Et||0))throw new RangeError('"length" is outside of buffer bounds');let Bn;return Bn=void 0===St&&void 0===Et?new Uint8Array(Ge):void 0===Et?new Uint8Array(Ge,St):new Uint8Array(Ge,St,Et),Object.setPrototypeOf(Bn,P.prototype),Bn}function _e(Ge){if(Ge>=C)throw new RangeError("Attempt to allocate Buffer larger than maximum size: 0x"+C.toString(16)+" bytes");return 0|Ge}function Le(Ge,St){if(P.isBuffer(Ge))return Ge.length;if(ArrayBuffer.isView(Ge)||Ys(Ge,ArrayBuffer))return Ge.byteLength;if("string"!=typeof Ge)throw new TypeError('The "string" argument must be one of type string, Buffer, or ArrayBuffer. Received type '+typeof Ge);const Et=Ge.length,Bn=arguments.length>2&&!0===arguments[2];if(!Bn&&0===Et)return 0;let _r=!1;for(;;)switch(St){case"ascii":case"latin1":case"binary":return Et;case"utf8":case"utf-8":return qi(Ge).length;case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":return 2*Et;case"hex":return Et>>>1;case"base64":return Zo(Ge).length;default:if(_r)return Bn?-1:qi(Ge).length;St=(""+St).toLowerCase(),_r=!0}}function Re(Ge,St,Et){let Bn=!1;if((void 0===St||St<0)&&(St=0),St>this.length||((void 0===Et||Et>this.length)&&(Et=this.length),Et<=0)||(Et>>>=0)<=(St>>>=0))return"";for(Ge||(Ge="utf8");;)switch(Ge){case"hex":return Pr(this,St,Et);case"utf8":case"utf-8":return Dn(this,St,Et);case"ascii":return $r(this,St,Et);case"latin1":case"binary":return ur(this,St,Et);case"base64":return Lt(this,St,Et);case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":return xr(this,St,Et);default:if(Bn)throw new TypeError("Unknown encoding: "+Ge);Ge=(Ge+"").toLowerCase(),Bn=!0}}function ke(Ge,St,Et){const Bn=Ge[St];Ge[St]=Ge[Et],Ge[Et]=Bn}function xe(Ge,St,Et,Bn,_r){if(0===Ge.length)return-1;if("string"==typeof Et?(Bn=Et,Et=0):Et>2147483647?Et=2147483647:Et<-2147483648&&(Et=-2147483648),Ws(Et=+Et)&&(Et=_r?0:Ge.length-1),Et<0&&(Et=Ge.length+Et),Et>=Ge.length){if(_r)return-1;Et=Ge.length-1}else if(Et<0){if(!_r)return-1;Et=0}if("string"==typeof St&&(St=P.from(St,Bn)),P.isBuffer(St))return 0===St.length?-1:U(Ge,St,Et,Bn,_r);if("number"==typeof St)return St&=255,"function"==typeof Uint8Array.prototype.indexOf?_r?Uint8Array.prototype.indexOf.call(Ge,St,Et):Uint8Array.prototype.lastIndexOf.call(Ge,St,Et):U(Ge,[St],Et,Bn,_r);throw new TypeError("val must be string, number or Buffer")}function U(Ge,St,Et,Bn,_r){let Gr,xi=1,Zs=Ge.length,jo=St.length;if(void 0!==Bn&&("ucs2"===(Bn=String(Bn).toLowerCase())||"ucs-2"===Bn||"utf16le"===Bn||"utf-16le"===Bn)){if(Ge.length<2||St.length<2)return-1;xi=2,Zs/=2,jo/=2,Et/=2}function sl(ml,nu){return 1===xi?ml[nu]:ml.readUInt16BE(nu*xi)}if(_r){let ml=-1;for(Gr=Et;Gr<Zs;Gr++)if(sl(Ge,Gr)===sl(St,-1===ml?0:Gr-ml)){if(-1===ml&&(ml=Gr),Gr-ml+1===jo)return ml*xi}else-1!==ml&&(Gr-=Gr-ml),ml=-1}else for(Et+jo>Zs&&(Et=Zs-jo),Gr=Et;Gr>=0;Gr--){let ml=!0;for(let nu=0;nu<jo;nu++)if(sl(Ge,Gr+nu)!==sl(St,nu)){ml=!1;break}if(ml)return Gr}return-1}function pt(Ge,St,Et,Bn){Et=Number(Et)||0;const _r=Ge.length-Et;Bn?(Bn=Number(Bn))>_r&&(Bn=_r):Bn=_r;const Gr=St.length;let xi;for(Bn>Gr/2&&(Bn=Gr/2),xi=0;xi<Bn;++xi){const Zs=parseInt(St.substr(2*xi,2),16);if(Ws(Zs))return xi;Ge[Et+xi]=Zs}return xi}function ht(Ge,St,Et,Bn){return bo(qi(St,Ge.length-Et),Ge,Et,Bn)}function wt(Ge,St,Et,Bn){return bo(function(_r){const Gr=[];for(let xi=0;xi<_r.length;++xi)Gr.push(255&_r.charCodeAt(xi));return Gr}(St),Ge,Et,Bn)}function It(Ge,St,Et,Bn){return bo(Zo(St),Ge,Et,Bn)}function dn(Ge,St,Et,Bn){return bo(function(_r,Gr){let xi,Zs,jo;const sl=[];for(let ml=0;ml<_r.length&&!((Gr-=2)<0);++ml)xi=_r.charCodeAt(ml),Zs=xi>>8,jo=xi%256,sl.push(jo),sl.push(Zs);return sl}(St,Ge.length-Et),Ge,Et,Bn)}function Lt(Ge,St,Et){return o.fromByteArray(0===St&&Et===Ge.length?Ge:Ge.slice(St,Et))}function Dn(Ge,St,Et){Et=Math.min(Ge.length,Et);const Bn=[];let _r=St;for(;_r<Et;){const Gr=Ge[_r];let xi=null,Zs=Gr>239?4:Gr>223?3:Gr>191?2:1;if(_r+Zs<=Et){let jo,sl,ml,nu;switch(Zs){case 1:Gr<128&&(xi=Gr);break;case 2:jo=Ge[_r+1],128==(192&jo)&&(nu=(31&Gr)<<6|63&jo,nu>127&&(xi=nu));break;case 3:jo=Ge[_r+1],sl=Ge[_r+2],128==(192&jo)&&128==(192&sl)&&(nu=(15&Gr)<<12|(63&jo)<<6|63&sl,nu>2047&&(nu<55296||nu>57343)&&(xi=nu));break;case 4:jo=Ge[_r+1],sl=Ge[_r+2],ml=Ge[_r+3],128==(192&jo)&&128==(192&sl)&&128==(192&ml)&&(nu=(15&Gr)<<18|(63&jo)<<12|(63&sl)<<6|63&ml,nu>65535&&nu<1114112&&(xi=nu))}}null===xi?(xi=65533,Zs=1):xi>65535&&(xi-=65536,Bn.push(xi>>>10&1023|55296),xi=56320|1023&xi),Bn.push(xi),_r+=Zs}return function(Gr){const xi=Gr.length;if(xi<=Mn)return String.fromCharCode.apply(String,Gr);let Zs="",jo=0;for(;jo<xi;)Zs+=String.fromCharCode.apply(String,Gr.slice(jo,jo+=Mn));return Zs}(Bn)}s.kMaxLength=C,(P.TYPED_ARRAY_SUPPORT=function(){try{const Ge=new Uint8Array(1),St={foo:function(){return 42}};return Object.setPrototypeOf(St,Uint8Array.prototype),Object.setPrototypeOf(Ge,St),42===Ge.foo()}catch(Ge){return!1}}())||"undefined"==typeof console||"function"!=typeof console.error||console.error("This browser lacks typed array (Uint8Array) support which is required by `buffer` v5.x. Use `buffer` v4.x if you require old browser support."),Object.defineProperty(P.prototype,"parent",{enumerable:!0,get:function(){if(P.isBuffer(this))return this.buffer}}),Object.defineProperty(P.prototype,"offset",{enumerable:!0,get:function(){if(P.isBuffer(this))return this.byteOffset}}),P.poolSize=8192,P.from=function(Ge,St,Et){return j(Ge,St,Et)},Object.setPrototypeOf(P.prototype,Uint8Array.prototype),Object.setPrototypeOf(P,Uint8Array),P.alloc=function(Ge,St,Et){return _r=St,Gr=Et,W(Bn=Ge),Bn<=0?D(Bn):void 0!==_r?"string"==typeof Gr?D(Bn).fill(_r,Gr):D(Bn).fill(_r):D(Bn);var Bn,_r,Gr},P.allocUnsafe=function(Ge){return re(Ge)},P.allocUnsafeSlow=function(Ge){return re(Ge)},P.isBuffer=function(Ge){return null!=Ge&&!0===Ge._isBuffer&&Ge!==P.prototype},P.compare=function(Ge,St){if(Ys(Ge,Uint8Array)&&(Ge=P.from(Ge,Ge.offset,Ge.byteLength)),Ys(St,Uint8Array)&&(St=P.from(St,St.offset,St.byteLength)),!P.isBuffer(Ge)||!P.isBuffer(St))throw new TypeError('The "buf1", "buf2" arguments must be one of type Buffer or Uint8Array');if(Ge===St)return 0;let Et=Ge.length,Bn=St.length;for(let _r=0,Gr=Math.min(Et,Bn);_r<Gr;++_r)if(Ge[_r]!==St[_r]){Et=Ge[_r],Bn=St[_r];break}return Et<Bn?-1:Bn<Et?1:0},P.isEncoding=function(Ge){switch(String(Ge).toLowerCase()){case"hex":case"utf8":case"utf-8":case"ascii":case"latin1":case"binary":case"base64":case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":return!0;default:return!1}},P.concat=function(Ge,St){if(!Array.isArray(Ge))throw new TypeError('"list" argument must be an Array of Buffers');if(0===Ge.length)return P.alloc(0);let Et;if(void 0===St)for(St=0,Et=0;Et<Ge.length;++Et)St+=Ge[Et].length;const Bn=P.allocUnsafe(St);let _r=0;for(Et=0;Et<Ge.length;++Et){let Gr=Ge[Et];if(Ys(Gr,Uint8Array))_r+Gr.length>Bn.length?(P.isBuffer(Gr)||(Gr=P.from(Gr)),Gr.copy(Bn,_r)):Uint8Array.prototype.set.call(Bn,Gr,_r);else{if(!P.isBuffer(Gr))throw new TypeError('"list" argument must be an Array of Buffers');Gr.copy(Bn,_r)}_r+=Gr.length}return Bn},P.byteLength=Le,P.prototype._isBuffer=!0,P.prototype.swap16=function(){const Ge=this.length;if(Ge%2!=0)throw new RangeError("Buffer size must be a multiple of 16-bits");for(let St=0;St<Ge;St+=2)ke(this,St,St+1);return this},P.prototype.swap32=function(){const Ge=this.length;if(Ge%4!=0)throw new RangeError("Buffer size must be a multiple of 32-bits");for(let St=0;St<Ge;St+=4)ke(this,St,St+3),ke(this,St+1,St+2);return this},P.prototype.swap64=function(){const Ge=this.length;if(Ge%8!=0)throw new RangeError("Buffer size must be a multiple of 64-bits");for(let St=0;St<Ge;St+=8)ke(this,St,St+7),ke(this,St+1,St+6),ke(this,St+2,St+5),ke(this,St+3,St+4);return this},P.prototype.toLocaleString=P.prototype.toString=function(){const Ge=this.length;return 0===Ge?"":0===arguments.length?Dn(this,0,Ge):Re.apply(this,arguments)},P.prototype.equals=function(Ge){if(!P.isBuffer(Ge))throw new TypeError("Argument must be a Buffer");return this===Ge||0===P.compare(this,Ge)},P.prototype.inspect=function(){let Ge="";const St=s.INSPECT_MAX_BYTES;return Ge=this.toString("hex",0,St).replace(/(.{2})/g,"$1 ").trim(),this.length>St&&(Ge+=" ... "),"<Buffer "+Ge+">"},g&&(P.prototype[g]=P.prototype.inspect),P.prototype.compare=function(Ge,St,Et,Bn,_r){if(Ys(Ge,Uint8Array)&&(Ge=P.from(Ge,Ge.offset,Ge.byteLength)),!P.isBuffer(Ge))throw new TypeError('The "target" argument must be one of type Buffer or Uint8Array. Received type '+typeof Ge);if(void 0===St&&(St=0),void 0===Et&&(Et=Ge?Ge.length:0),void 0===Bn&&(Bn=0),void 0===_r&&(_r=this.length),St<0||Et>Ge.length||Bn<0||_r>this.length)throw new RangeError("out of range index");if(Bn>=_r&&St>=Et)return 0;if(Bn>=_r)return-1;if(St>=Et)return 1;if(this===Ge)return 0;let Gr=(_r>>>=0)-(Bn>>>=0),xi=(Et>>>=0)-(St>>>=0);const Zs=Math.min(Gr,xi),jo=this.slice(Bn,_r),sl=Ge.slice(St,Et);for(let ml=0;ml<Zs;++ml)if(jo[ml]!==sl[ml]){Gr=jo[ml],xi=sl[ml];break}return Gr<xi?-1:xi<Gr?1:0},P.prototype.includes=function(Ge,St,Et){return-1!==this.indexOf(Ge,St,Et)},P.prototype.indexOf=function(Ge,St,Et){return xe(this,Ge,St,Et,!0)},P.prototype.lastIndexOf=function(Ge,St,Et){return xe(this,Ge,St,Et,!1)},P.prototype.write=function(Ge,St,Et,Bn){if(void 0===St)Bn="utf8",Et=this.length,St=0;else if(void 0===Et&&"string"==typeof St)Bn=St,Et=this.length,St=0;else{if(!isFinite(St))throw new Error("Buffer.write(string, encoding, offset[, length]) is no longer supported");St>>>=0,isFinite(Et)?(Et>>>=0,void 0===Bn&&(Bn="utf8")):(Bn=Et,Et=void 0)}const _r=this.length-St;if((void 0===Et||Et>_r)&&(Et=_r),Ge.length>0&&(Et<0||St<0)||St>this.length)throw new RangeError("Attempt to write outside buffer bounds");Bn||(Bn="utf8");let Gr=!1;for(;;)switch(Bn){case"hex":return pt(this,Ge,St,Et);case"utf8":case"utf-8":return ht(this,Ge,St,Et);case"ascii":case"latin1":case"binary":return wt(this,Ge,St,Et);case"base64":return It(this,Ge,St,Et);case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":return dn(this,Ge,St,Et);default:if(Gr)throw new TypeError("Unknown encoding: "+Bn);Bn=(""+Bn).toLowerCase(),Gr=!0}},P.prototype.toJSON=function(){return{type:"Buffer",data:Array.prototype.slice.call(this._arr||this,0)}};const Mn=4096;function $r(Ge,St,Et){let Bn="";Et=Math.min(Ge.length,Et);for(let _r=St;_r<Et;++_r)Bn+=String.fromCharCode(127&Ge[_r]);return Bn}function ur(Ge,St,Et){let Bn="";Et=Math.min(Ge.length,Et);for(let _r=St;_r<Et;++_r)Bn+=String.fromCharCode(Ge[_r]);return Bn}function Pr(Ge,St,Et){const Bn=Ge.length;(!St||St<0)&&(St=0),(!Et||Et<0||Et>Bn)&&(Et=Bn);let _r="";for(let Gr=St;Gr<Et;++Gr)_r+=wi[Ge[Gr]];return _r}function xr(Ge,St,Et){const Bn=Ge.slice(St,Et);let _r="";for(let Gr=0;Gr<Bn.length-1;Gr+=2)_r+=String.fromCharCode(Bn[Gr]+256*Bn[Gr+1]);return _r}function fn(Ge,St,Et){if(Ge%1!=0||Ge<0)throw new RangeError("offset is not uint");if(Ge+St>Et)throw new RangeError("Trying to access beyond buffer length")}function Nn(Ge,St,Et,Bn,_r,Gr){if(!P.isBuffer(Ge))throw new TypeError('"buffer" argument must be a Buffer instance');if(St>_r||St<Gr)throw new RangeError('"value" argument is out of bounds');if(Et+Bn>Ge.length)throw new RangeError("Index out of range")}function $n(Ge,St,Et,Bn,_r){An(St,Bn,_r,Ge,Et,7);let Gr=Number(St&BigInt(4294967295));Ge[Et++]=Gr,Gr>>=8,Ge[Et++]=Gr,Gr>>=8,Ge[Et++]=Gr,Gr>>=8,Ge[Et++]=Gr;let xi=Number(St>>BigInt(32)&BigInt(4294967295));return Ge[Et++]=xi,xi>>=8,Ge[Et++]=xi,xi>>=8,Ge[Et++]=xi,xi>>=8,Ge[Et++]=xi,Et}function Qn(Ge,St,Et,Bn,_r){An(St,Bn,_r,Ge,Et,7);let Gr=Number(St&BigInt(4294967295));Ge[Et+7]=Gr,Gr>>=8,Ge[Et+6]=Gr,Gr>>=8,Ge[Et+5]=Gr,Gr>>=8,Ge[Et+4]=Gr;let xi=Number(St>>BigInt(32)&BigInt(4294967295));return Ge[Et+3]=xi,xi>>=8,Ge[Et+2]=xi,xi>>=8,Ge[Et+1]=xi,xi>>=8,Ge[Et]=xi,Et+8}function Tn(Ge,St,Et,Bn,_r,Gr){if(Et+Bn>Ge.length)throw new RangeError("Index out of range");if(Et<0)throw new RangeError("Index out of range")}function Yr(Ge,St,Et,Bn,_r){return St=+St,Et>>>=0,_r||Tn(Ge,0,Et,4),c.write(Ge,St,Et,Bn,23,4),Et+4}function ji(Ge,St,Et,Bn,_r){return St=+St,Et>>>=0,_r||Tn(Ge,0,Et,8),c.write(Ge,St,Et,Bn,52,8),Et+8}P.prototype.slice=function(Ge,St){const Et=this.length;(Ge=~~Ge)<0?(Ge+=Et)<0&&(Ge=0):Ge>Et&&(Ge=Et),(St=void 0===St?Et:~~St)<0?(St+=Et)<0&&(St=0):St>Et&&(St=Et),St<Ge&&(St=Ge);const Bn=this.subarray(Ge,St);return Object.setPrototypeOf(Bn,P.prototype),Bn},P.prototype.readUintLE=P.prototype.readUIntLE=function(Ge,St,Et){Ge>>>=0,St>>>=0,Et||fn(Ge,St,this.length);let Bn=this[Ge],_r=1,Gr=0;for(;++Gr<St&&(_r*=256);)Bn+=this[Ge+Gr]*_r;return Bn},P.prototype.readUintBE=P.prototype.readUIntBE=function(Ge,St,Et){Ge>>>=0,St>>>=0,Et||fn(Ge,St,this.length);let Bn=this[Ge+--St],_r=1;for(;St>0&&(_r*=256);)Bn+=this[Ge+--St]*_r;return Bn},P.prototype.readUint8=P.prototype.readUInt8=function(Ge,St){return Ge>>>=0,St||fn(Ge,1,this.length),this[Ge]},P.prototype.readUint16LE=P.prototype.readUInt16LE=function(Ge,St){return Ge>>>=0,St||fn(Ge,2,this.length),this[Ge]|this[Ge+1]<<8},P.prototype.readUint16BE=P.prototype.readUInt16BE=function(Ge,St){return Ge>>>=0,St||fn(Ge,2,this.length),this[Ge]<<8|this[Ge+1]},P.prototype.readUint32LE=P.prototype.readUInt32LE=function(Ge,St){return Ge>>>=0,St||fn(Ge,4,this.length),(this[Ge]|this[Ge+1]<<8|this[Ge+2]<<16)+16777216*this[Ge+3]},P.prototype.readUint32BE=P.prototype.readUInt32BE=function(Ge,St){return Ge>>>=0,St||fn(Ge,4,this.length),16777216*this[Ge]+(this[Ge+1]<<16|this[Ge+2]<<8|this[Ge+3])},P.prototype.readBigUInt64LE=lo(function(Ge){hn(Ge>>>=0,"offset");const St=this[Ge],Et=this[Ge+7];void 0!==St&&void 0!==Et||qr(Ge,this.length-8);const Bn=St+256*this[++Ge]+65536*this[++Ge]+this[++Ge]*Sm(2,24),_r=this[++Ge]+256*this[++Ge]+65536*this[++Ge]+Et*Sm(2,24);return BigInt(Bn)+(BigInt(_r)<<BigInt(32))}),P.prototype.readBigUInt64BE=lo(function(Ge){hn(Ge>>>=0,"offset");const St=this[Ge],Et=this[Ge+7];void 0!==St&&void 0!==Et||qr(Ge,this.length-8);const Bn=St*Sm(2,24)+65536*this[++Ge]+256*this[++Ge]+this[++Ge],_r=this[++Ge]*Sm(2,24)+65536*this[++Ge]+256*this[++Ge]+Et;return(BigInt(Bn)<<BigInt(32))+BigInt(_r)}),P.prototype.readIntLE=function(Ge,St,Et){Ge>>>=0,St>>>=0,Et||fn(Ge,St,this.length);let Bn=this[Ge],_r=1,Gr=0;for(;++Gr<St&&(_r*=256);)Bn+=this[Ge+Gr]*_r;return _r*=128,Bn>=_r&&(Bn-=Math.pow(2,8*St)),Bn},P.prototype.readIntBE=function(Ge,St,Et){Ge>>>=0,St>>>=0,Et||fn(Ge,St,this.length);let Bn=St,_r=1,Gr=this[Ge+--Bn];for(;Bn>0&&(_r*=256);)Gr+=this[Ge+--Bn]*_r;return _r*=128,Gr>=_r&&(Gr-=Math.pow(2,8*St)),Gr},P.prototype.readInt8=function(Ge,St){return Ge>>>=0,St||fn(Ge,1,this.length),128&this[Ge]?-1*(255-this[Ge]+1):this[Ge]},P.prototype.readInt16LE=function(Ge,St){Ge>>>=0,St||fn(Ge,2,this.length);const Et=this[Ge]|this[Ge+1]<<8;return 32768&Et?4294901760|Et:Et},P.prototype.readInt16BE=function(Ge,St){Ge>>>=0,St||fn(Ge,2,this.length);const Et=this[Ge+1]|this[Ge]<<8;return 32768&Et?4294901760|Et:Et},P.prototype.readInt32LE=function(Ge,St){return Ge>>>=0,St||fn(Ge,4,this.length),this[Ge]|this[Ge+1]<<8|this[Ge+2]<<16|this[Ge+3]<<24},P.prototype.readInt32BE=function(Ge,St){return Ge>>>=0,St||fn(Ge,4,this.length),this[Ge]<<24|this[Ge+1]<<16|this[Ge+2]<<8|this[Ge+3]},P.prototype.readBigInt64LE=lo(function(Ge){hn(Ge>>>=0,"offset");const St=this[Ge],Et=this[Ge+7];return void 0!==St&&void 0!==Et||qr(Ge,this.length-8),(BigInt(this[Ge+4]+256*this[Ge+5]+65536*this[Ge+6]+(Et<<24))<<BigInt(32))+BigInt(St+256*this[++Ge]+65536*this[++Ge]+this[++Ge]*Sm(2,24))}),P.prototype.readBigInt64BE=lo(function(Ge){hn(Ge>>>=0,"offset");const St=this[Ge],Et=this[Ge+7];void 0!==St&&void 0!==Et||qr(Ge,this.length-8);const Bn=(St<<24)+65536*this[++Ge]+256*this[++Ge]+this[++Ge];return(BigInt(Bn)<<BigInt(32))+BigInt(this[++Ge]*Sm(2,24)+65536*this[++Ge]+256*this[++Ge]+Et)}),P.prototype.readFloatLE=function(Ge,St){return Ge>>>=0,St||fn(Ge,4,this.length),c.read(this,Ge,!0,23,4)},P.prototype.readFloatBE=function(Ge,St){return Ge>>>=0,St||fn(Ge,4,this.length),c.read(this,Ge,!1,23,4)},P.prototype.readDoubleLE=function(Ge,St){return Ge>>>=0,St||fn(Ge,8,this.length),c.read(this,Ge,!0,52,8)},P.prototype.readDoubleBE=function(Ge,St){return Ge>>>=0,St||fn(Ge,8,this.length),c.read(this,Ge,!1,52,8)},P.prototype.writeUintLE=P.prototype.writeUIntLE=function(Ge,St,Et,Bn){Ge=+Ge,St>>>=0,Et>>>=0,!Bn&&Nn(this,Ge,St,Et,Math.pow(2,8*Et)-1,0);let _r=1,Gr=0;for(this[St]=255&Ge;++Gr<Et&&(_r*=256);)this[St+Gr]=Ge/_r&255;return St+Et},P.prototype.writeUintBE=P.prototype.writeUIntBE=function(Ge,St,Et,Bn){Ge=+Ge,St>>>=0,Et>>>=0,!Bn&&Nn(this,Ge,St,Et,Math.pow(2,8*Et)-1,0);let _r=Et-1,Gr=1;for(this[St+_r]=255&Ge;--_r>=0&&(Gr*=256);)this[St+_r]=Ge/Gr&255;return St+Et},P.prototype.writeUint8=P.prototype.writeUInt8=function(Ge,St,Et){return Ge=+Ge,St>>>=0,Et||Nn(this,Ge,St,1,255,0),this[St]=255&Ge,St+1},P.prototype.writeUint16LE=P.prototype.writeUInt16LE=function(Ge,St,Et){return Ge=+Ge,St>>>=0,Et||Nn(this,Ge,St,2,65535,0),this[St]=255&Ge,this[St+1]=Ge>>>8,St+2},P.prototype.writeUint16BE=P.prototype.writeUInt16BE=function(Ge,St,Et){return Ge=+Ge,St>>>=0,Et||Nn(this,Ge,St,2,65535,0),this[St]=Ge>>>8,this[St+1]=255&Ge,St+2},P.prototype.writeUint32LE=P.prototype.writeUInt32LE=function(Ge,St,Et){return Ge=+Ge,St>>>=0,Et||Nn(this,Ge,St,4,4294967295,0),this[St+3]=Ge>>>24,this[St+2]=Ge>>>16,this[St+1]=Ge>>>8,this[St]=255&Ge,St+4},P.prototype.writeUint32BE=P.prototype.writeUInt32BE=function(Ge,St,Et){return Ge=+Ge,St>>>=0,Et||Nn(this,Ge,St,4,4294967295,0),this[St]=Ge>>>24,this[St+1]=Ge>>>16,this[St+2]=Ge>>>8,this[St+3]=255&Ge,St+4},P.prototype.writeBigUInt64LE=lo(function(Ge,St=0){return $n(this,Ge,St,BigInt(0),BigInt("0xffffffffffffffff"))}),P.prototype.writeBigUInt64BE=lo(function(Ge,St=0){return Qn(this,Ge,St,BigInt(0),BigInt("0xffffffffffffffff"))}),P.prototype.writeIntLE=function(Ge,St,Et,Bn){if(Ge=+Ge,St>>>=0,!Bn){const Zs=Math.pow(2,8*Et-1);Nn(this,Ge,St,Et,Zs-1,-Zs)}let _r=0,Gr=1,xi=0;for(this[St]=255&Ge;++_r<Et&&(Gr*=256);)Ge<0&&0===xi&&0!==this[St+_r-1]&&(xi=1),this[St+_r]=(Ge/Gr>>0)-xi&255;return St+Et},P.prototype.writeIntBE=function(Ge,St,Et,Bn){if(Ge=+Ge,St>>>=0,!Bn){const Zs=Math.pow(2,8*Et-1);Nn(this,Ge,St,Et,Zs-1,-Zs)}let _r=Et-1,Gr=1,xi=0;for(this[St+_r]=255&Ge;--_r>=0&&(Gr*=256);)Ge<0&&0===xi&&0!==this[St+_r+1]&&(xi=1),this[St+_r]=(Ge/Gr>>0)-xi&255;return St+Et},P.prototype.writeInt8=function(Ge,St,Et){return Ge=+Ge,St>>>=0,Et||Nn(this,Ge,St,1,127,-128),Ge<0&&(Ge=255+Ge+1),this[St]=255&Ge,St+1},P.prototype.writeInt16LE=function(Ge,St,Et){return Ge=+Ge,St>>>=0,Et||Nn(this,Ge,St,2,32767,-32768),this[St]=255&Ge,this[St+1]=Ge>>>8,St+2},P.prototype.writeInt16BE=function(Ge,St,Et){return Ge=+Ge,St>>>=0,Et||Nn(this,Ge,St,2,32767,-32768),this[St]=Ge>>>8,this[St+1]=255&Ge,St+2},P.prototype.writeInt32LE=function(Ge,St,Et){return Ge=+Ge,St>>>=0,Et||Nn(this,Ge,St,4,2147483647,-2147483648),this[St]=255&Ge,this[St+1]=Ge>>>8,this[St+2]=Ge>>>16,this[St+3]=Ge>>>24,St+4},P.prototype.writeInt32BE=function(Ge,St,Et){return Ge=+Ge,St>>>=0,Et||Nn(this,Ge,St,4,2147483647,-2147483648),Ge<0&&(Ge=4294967295+Ge+1),this[St]=Ge>>>24,this[St+1]=Ge>>>16,this[St+2]=Ge>>>8,this[St+3]=255&Ge,St+4},P.prototype.writeBigInt64LE=lo(function(Ge,St=0){return $n(this,Ge,St,-BigInt("0x8000000000000000"),BigInt("0x7fffffffffffffff"))}),P.prototype.writeBigInt64BE=lo(function(Ge,St=0){return Qn(this,Ge,St,-BigInt("0x8000000000000000"),BigInt("0x7fffffffffffffff"))}),P.prototype.writeFloatLE=function(Ge,St,Et){return Yr(this,Ge,St,!0,Et)},P.prototype.writeFloatBE=function(Ge,St,Et){return Yr(this,Ge,St,!1,Et)},P.prototype.writeDoubleLE=function(Ge,St,Et){return ji(this,Ge,St,!0,Et)},P.prototype.writeDoubleBE=function(Ge,St,Et){return ji(this,Ge,St,!1,Et)},P.prototype.copy=function(Ge,St,Et,Bn){if(!P.isBuffer(Ge))throw new TypeError("argument should be a Buffer");if(Et||(Et=0),Bn||0===Bn||(Bn=this.length),St>=Ge.length&&(St=Ge.length),St||(St=0),Bn>0&&Bn<Et&&(Bn=Et),Bn===Et||0===Ge.length||0===this.length)return 0;if(St<0)throw new RangeError("targetStart out of bounds");if(Et<0||Et>=this.length)throw new RangeError("Index out of range");if(Bn<0)throw new RangeError("sourceEnd out of bounds");Bn>this.length&&(Bn=this.length),Ge.length-St<Bn-Et&&(Bn=Ge.length-St+Et);const _r=Bn-Et;return this===Ge&&"function"==typeof Uint8Array.prototype.copyWithin?this.copyWithin(St,Et,Bn):Uint8Array.prototype.set.call(Ge,this.subarray(Et,Bn),St),_r},P.prototype.fill=function(Ge,St,Et,Bn){if("string"==typeof Ge){if("string"==typeof St?(Bn=St,St=0,Et=this.length):"string"==typeof Et&&(Bn=Et,Et=this.length),void 0!==Bn&&"string"!=typeof Bn)throw new TypeError("encoding must be a string");if("string"==typeof Bn&&!P.isEncoding(Bn))throw new TypeError("Unknown encoding: "+Bn);if(1===Ge.length){const Gr=Ge.charCodeAt(0);("utf8"===Bn&&Gr<128||"latin1"===Bn)&&(Ge=Gr)}}else"number"==typeof Ge?Ge&=255:"boolean"==typeof Ge&&(Ge=Number(Ge));if(St<0||this.length<St||this.length<Et)throw new RangeError("Out of range index");if(Et<=St)return this;let _r;if(St>>>=0,Et=void 0===Et?this.length:Et>>>0,Ge||(Ge=0),"number"==typeof Ge)for(_r=St;_r<Et;++_r)this[_r]=Ge;else{const Gr=P.isBuffer(Ge)?Ge:P.from(Ge,Bn),xi=Gr.length;if(0===xi)throw new TypeError('The value "'+Ge+'" is invalid for argument "value"');for(_r=0;_r<Et-St;++_r)this[_r+St]=Gr[_r%xi]}return this};const ii={};function Ui(Ge,St,Et){ii[Ge]=class extends Et{constructor(){super(),Object.defineProperty(this,"message",{value:St.apply(this,arguments),writable:!0,configurable:!0}),this.name=`${this.name} [${Ge}]`,delete this.name}get code(){return Ge}set code(Bn){Object.defineProperty(this,"code",{configurable:!0,enumerable:!0,value:Bn,writable:!0})}toString(){return`${this.name} [${Ge}]: ${this.message}`}}}function Jr(Ge){let St="",Et=Ge.length;const Bn="-"===Ge[0]?1:0;for(;Et>=Bn+4;Et-=3)St=`_${Ge.slice(Et-3,Et)}${St}`;return`${Ge.slice(0,Et)}${St}`}function An(Ge,St,Et,Bn,_r,Gr){if(Ge>Et||Ge<St){const xi="bigint"==typeof St?"n":"";let Zs;throw Zs=Gr>3?0===St||St===BigInt(0)?`>= 0${xi} and < 2${xi} ** ${8*(Gr+1)}${xi}`:`>= -(2${xi} ** ${8*(Gr+1)-1}${xi}) and < 2 ** ${8*(Gr+1)-1}${xi}`:`>= ${St}${xi} and <= ${Et}${xi}`,new ii.ERR_OUT_OF_RANGE("value",Zs,Ge)}var xi,Zs,jo;xi=Bn,jo=Gr,hn(Zs=_r,"offset"),void 0!==xi[Zs]&&void 0!==xi[Zs+jo]||qr(Zs,xi.length-(jo+1))}function hn(Ge,St){if("number"!=typeof Ge)throw new ii.ERR_INVALID_ARG_TYPE(St,"number",Ge)}function qr(Ge,St,Et){throw Math.floor(Ge)!==Ge?(hn(Ge,Et),new ii.ERR_OUT_OF_RANGE(Et||"offset","an integer",Ge)):St<0?new ii.ERR_BUFFER_OUT_OF_BOUNDS:new ii.ERR_OUT_OF_RANGE(Et||"offset",`>= ${Et?1:0} and <= ${St}`,Ge)}Ui("ERR_BUFFER_OUT_OF_BOUNDS",function(Ge){return Ge?`${Ge} is outside of buffer bounds`:"Attempt to access memory outside buffer bounds"},RangeError),Ui("ERR_INVALID_ARG_TYPE",function(Ge,St){return`The "${Ge}" argument must be of type number. Received type ${typeof St}`},TypeError),Ui("ERR_OUT_OF_RANGE",function(Ge,St,Et){let Bn=`The value of "${Ge}" is out of range.`,_r=Et;return Number.isInteger(Et)&&Math.abs(Et)>Sm(2,32)?_r=Jr(String(Et)):"bigint"==typeof Et&&(_r=String(Et),(Et>Sm(BigInt(2),BigInt(32))||Et<-Sm(BigInt(2),BigInt(32)))&&(_r=Jr(_r)),_r+="n"),Bn+=` It must be ${St}. Received ${_r}`,Bn},RangeError);const Ri=/[^+/0-9A-Za-z-_]/g;function qi(Ge,St){let Et;St=St||1/0;const Bn=Ge.length;let _r=null;const Gr=[];for(let xi=0;xi<Bn;++xi){if(Et=Ge.charCodeAt(xi),Et>55295&&Et<57344){if(!_r){if(Et>56319){(St-=3)>-1&&Gr.push(239,191,189);continue}if(xi+1===Bn){(St-=3)>-1&&Gr.push(239,191,189);continue}_r=Et;continue}if(Et<56320){(St-=3)>-1&&Gr.push(239,191,189),_r=Et;continue}Et=65536+(_r-55296<<10|Et-56320)}else _r&&(St-=3)>-1&&Gr.push(239,191,189);if(_r=null,Et<128){if((St-=1)<0)break;Gr.push(Et)}else if(Et<2048){if((St-=2)<0)break;Gr.push(Et>>6|192,63&Et|128)}else if(Et<65536){if((St-=3)<0)break;Gr.push(Et>>12|224,Et>>6&63|128,63&Et|128)}else{if(!(Et<1114112))throw new Error("Invalid code point");if((St-=4)<0)break;Gr.push(Et>>18|240,Et>>12&63|128,Et>>6&63|128,63&Et|128)}}return Gr}function Zo(Ge){return o.toByteArray(function(St){if((St=(St=St.split("=")[0]).trim().replace(Ri,"")).length<2)return"";for(;St.length%4!=0;)St+="=";return St}(Ge))}function bo(Ge,St,Et,Bn){let _r;for(_r=0;_r<Bn&&!(_r+Et>=St.length||_r>=Ge.length);++_r)St[_r+Et]=Ge[_r];return _r}function Ys(Ge,St){return Ge instanceof St||null!=Ge&&null!=Ge.constructor&&null!=Ge.constructor.name&&Ge.constructor.name===St.name}function Ws(Ge){return Ge!=Ge}const wi=function(){const Ge="0123456789abcdef",St=new Array(256);for(let Et=0;Et<16;++Et){const Bn=16*Et;for(let _r=0;_r<16;++_r)St[Bn+_r]=Ge[Et]+Ge[_r]}return St}();function lo(Ge){return"undefined"==typeof BigInt?go:Ge}function go(){throw new Error("BigInt not supported")}},8171:(n,s,t)=>{t(6450);var o=t(4058).Object,c=n.exports=function(g,C,D){return o.defineProperty(g,C,D)};o.defineProperty.sham&&(c.sham=!0)},4883:(n,s,t)=>{var o=t(1899),c=t(7475),g=t(9826),C=o.TypeError;n.exports=function(D){if(c(D))return D;throw C(g(D)+" is not a function")}},6059:(n,s,t)=>{var o=t(1899),c=t(941),g=o.String,C=o.TypeError;n.exports=function(D){if(c(D))return D;throw C(g(D)+" is not an object")}},2532:(n,s,t)=>{var o=t(5329),c=o({}.toString),g=o("".slice);n.exports=function(C){return g(c(C),8,-1)}},2029:(n,s,t)=>{var o=t(5746),c=t(5988),g=t(1887);n.exports=o?function(C,D,P){return c.f(C,D,g(1,P))}:function(C,D,P){return C[D]=P,C}},1887:n=>{n.exports=function(s,t){return{enumerable:!(1&s),configurable:!(2&s),writable:!(4&s),value:t}}},5746:(n,s,t)=>{var o=t(5981);n.exports=!o(function(){return 7!=Object.defineProperty({},1,{get:function(){return 7}})[1]})},1333:(n,s,t)=>{var o=t(1899),c=t(941),g=o.document,C=c(g)&&c(g.createElement);n.exports=function(D){return C?g.createElement(D):{}}},2861:(n,s,t)=>{var o=t(224);n.exports=o("navigator","userAgent")||""},3385:(n,s,t)=>{var o,c,g=t(1899),C=t(2861),D=g.process,P=g.Deno,j=D&&D.versions||P&&P.version,W=j&&j.v8;W&&(c=(o=W.split("."))[0]>0&&o[0]<4?1:+(o[0]+o[1])),!c&&C&&(!(o=C.match(/Edge\/(\d+)/))||o[1]>=74)&&(o=C.match(/Chrome\/(\d+)/))&&(c=+o[1]),n.exports=c},6887:(n,s,t)=>{var o=t(1899),c=t(9730),g=t(5329),C=t(7475),D=t(9677).f,P=t(7252),j=t(4058),W=t(6843),re=t(2029),ie=t(953),ge=function(_e){var Le=function(Re,ke,xe){if(this instanceof Le){switch(arguments.length){case 0:return new _e;case 1:return new _e(Re);case 2:return new _e(Re,ke)}return new _e(Re,ke,xe)}return c(_e,this,arguments)};return Le.prototype=_e.prototype,Le};n.exports=function(_e,Le){var Re,ke,xe,U,pt,ht,wt,It,dn=_e.target,Lt=_e.global,Dn=_e.stat,Mn=_e.proto,$r=Lt?o:Dn?o[dn]:(o[dn]||{}).prototype,ur=Lt?j:j[dn]||re(j,dn,{})[dn],Pr=ur.prototype;for(xe in Le)Re=!P(Lt?xe:dn+(Dn?".":"#")+xe,_e.forced)&&$r&&ie($r,xe),pt=ur[xe],Re&&(ht=_e.noTargetGet?(It=D($r,xe))&&It.value:$r[xe]),U=Re&&ht?ht:Le[xe],Re&&typeof pt==typeof U||(wt=_e.bind&&Re?W(U,o):_e.wrap&&Re?ge(U):Mn&&C(U)?g(U):U,(_e.sham||U&&U.sham||pt&&pt.sham)&&re(wt,"sham",!0),re(ur,xe,wt),Mn&&(ie(j,ke=dn+"Prototype")||re(j,ke,{}),re(j[ke],xe,U),_e.real&&Pr&&!Pr[xe]&&re(Pr,xe,U)))}},5981:n=>{n.exports=function(s){try{return!!s()}catch(t){return!0}}},9730:(n,s,t)=>{var o=t(8285),c=Function.prototype,g=c.apply,C=c.call;n.exports="object"==typeof Reflect&&Reflect.apply||(o?C.bind(g):function(){return C.apply(g,arguments)})},6843:(n,s,t)=>{var o=t(5329),c=t(4883),g=t(8285),C=o(o.bind);n.exports=function(D,P){return c(D),void 0===P?D:g?C(D,P):function(){return D.apply(P,arguments)}}},8285:(n,s,t)=>{var o=t(5981);n.exports=!o(function(){var c=function(){}.bind();return"function"!=typeof c||c.hasOwnProperty("prototype")})},8834:(n,s,t)=>{var o=t(8285),c=Function.prototype.call;n.exports=o?c.bind(c):function(){return c.apply(c,arguments)}},5329:(n,s,t)=>{var o=t(8285),c=Function.prototype,C=c.call,D=o&&c.bind.bind(C,C);n.exports=o?function(P){return P&&D(P)}:function(P){return P&&function(){return C.apply(P,arguments)}}},224:(n,s,t)=>{var o=t(4058),c=t(1899),g=t(7475),C=function(D){return g(D)?D:void 0};n.exports=function(D,P){return arguments.length<2?C(o[D])||C(c[D]):o[D]&&o[D][P]||c[D]&&c[D][P]}},9733:(n,s,t)=>{var o=t(4883);n.exports=function(c,g){var C=c[g];return null==C?void 0:o(C)}},1899:(n,s,t)=>{var o=function(c){return c&&c.Math==Math&&c};n.exports=o("object"==typeof globalThis&&globalThis)||o("object"==typeof window&&window)||o("object"==typeof self&&self)||o("object"==typeof t.g&&t.g)||function(){return this}()||Function("return this")()},953:(n,s,t)=>{var o=t(5329),c=t(9678),g=o({}.hasOwnProperty);n.exports=Object.hasOwn||function(C,D){return g(c(C),D)}},2840:(n,s,t)=>{var o=t(5746),c=t(5981),g=t(1333);n.exports=!o&&!c(function(){return 7!=Object.defineProperty(g("div"),"a",{get:function(){return 7}}).a})},7026:(n,s,t)=>{var o=t(1899),c=t(5329),g=t(5981),C=t(2532),D=o.Object,P=c("".split);n.exports=g(function(){return!D("z").propertyIsEnumerable(0)})?function(j){return"String"==C(j)?P(j,""):D(j)}:D},7475:n=>{n.exports=function(s){return"function"==typeof s}},7252:(n,s,t)=>{var o=t(5981),c=t(7475),g=/#|\.prototype\./,C=function(re,ie){var ge=P[D(re)];return ge==W||ge!=j&&(c(ie)?o(ie):!!ie)},D=C.normalize=function(re){return String(re).replace(g,".").toLowerCase()},P=C.data={},j=C.NATIVE="N",W=C.POLYFILL="P";n.exports=C},941:(n,s,t)=>{var o=t(7475);n.exports=function(c){return"object"==typeof c?null!==c:o(c)}},2529:n=>{n.exports=!0},6664:(n,s,t)=>{var o=t(1899),c=t(224),g=t(7475),C=t(7046),D=t(2302),P=o.Object;n.exports=D?function(j){return"symbol"==typeof j}:function(j){var W=c("Symbol");return g(W)&&C(W.prototype,P(j))}},2497:(n,s,t)=>{var o=t(3385),c=t(5981);n.exports=!!Object.getOwnPropertySymbols&&!c(function(){var g=Symbol();return!String(g)||!(Object(g)instanceof Symbol)||!Symbol.sham&&o&&o<41})},5988:(n,s,t)=>{var o=t(1899),c=t(5746),g=t(2840),C=t(3937),D=t(6059),P=t(3894),j=o.TypeError,W=Object.defineProperty,re=Object.getOwnPropertyDescriptor;s.f=c?C?function(Le,Re,ke){if(D(Le),Re=P(Re),D(ke),"function"==typeof Le&&"prototype"===Re&&"value"in ke&&"writable"in ke&&!ke.writable){var xe=re(Le,Re);xe&&xe.writable&&(Le[Re]=ke.value,ke={configurable:"configurable"in ke?ke.configurable:xe.configurable,enumerable:"enumerable"in ke?ke.enumerable:xe.enumerable,writable:!1})}return W(Le,Re,ke)}:W:function(Le,Re,ke){if(D(Le),Re=P(Re),D(ke),g)try{return W(Le,Re,ke)}catch(xe){}if("get"in ke||"set"in ke)throw j("Accessors not supported");return"value"in ke&&(Le[Re]=ke.value),Le}},9677:(n,s,t)=>{var o=t(5746),c=t(8834),g=t(6760),C=t(1887),D=t(4529),P=t(3894),j=t(953),W=t(2840),re=Object.getOwnPropertyDescriptor;s.f=o?re:function(ie,ge){if(ie=D(ie),ge=P(ge),W)try{return re(ie,ge)}catch(_e){}if(j(ie,ge))return C(!c(g.f,ie,ge),ie[ge])}},7046:(n,s,t)=>{var o=t(5329);n.exports=o({}.isPrototypeOf)},6760:(n,s)=>{var t={}.propertyIsEnumerable,o=Object.getOwnPropertyDescriptor,c=o&&!t.call({1:2},1);s.f=c?function(g){var C=o(this,g);return!!C&&C.enumerable}:t},9811:(n,s,t)=>{var o=t(1899),c=t(8834),g=t(7475),C=t(941),D=o.TypeError;n.exports=function(P,j){var W,re;if("string"===j&&g(W=P.toString)&&!C(re=c(W,P))||g(W=P.valueOf)&&!C(re=c(W,P))||"string"!==j&&g(W=P.toString)&&!C(re=c(W,P)))return re;throw D("Can't convert object to primitive value")}},4058:n=>{n.exports={}},8219:(n,s,t)=>{var o=t(1899).TypeError;n.exports=function(c){if(null==c)throw o("Can't call method on "+c);return c}},4911:(n,s,t)=>{var o=t(1899),c=Object.defineProperty;n.exports=function(g,C){try{c(o,g,{value:C,configurable:!0,writable:!0})}catch(D){o[g]=C}return C}},3030:(n,s,t)=>{var o=t(1899),c=t(4911),g="__core-js_shared__",C=o[g]||c(g,{});n.exports=C},8726:(n,s,t)=>{var o=t(2529),c=t(3030);(n.exports=function(g,C){return c[g]||(c[g]=void 0!==C?C:{})})("versions",[]).push({version:"3.20.3",mode:o?"pure":"global",copyright:"\xa9 2014-2022 Denis Pushkarev (zloirock.ru)",license:"https://github.com/zloirock/core-js/blob/v3.20.3/LICENSE",source:"https://github.com/zloirock/core-js"})},4529:(n,s,t)=>{var o=t(7026),c=t(8219);n.exports=function(g){return o(c(g))}},9678:(n,s,t)=>{var o=t(1899),c=t(8219),g=o.Object;n.exports=function(C){return g(c(C))}},6935:(n,s,t)=>{var o=t(1899),c=t(8834),g=t(941),C=t(6664),D=t(9733),P=t(9811),j=t(9813),W=o.TypeError,re=j("toPrimitive");n.exports=function(ie,ge){if(!g(ie)||C(ie))return ie;var _e,Le=D(ie,re);if(Le){if(void 0===ge&&(ge="default"),_e=c(Le,ie,ge),!g(_e)||C(_e))return _e;throw W("Can't convert object to primitive value")}return void 0===ge&&(ge="number"),P(ie,ge)}},3894:(n,s,t)=>{var o=t(6935),c=t(6664);n.exports=function(g){var C=o(g,"string");return c(C)?C:C+""}},9826:(n,s,t)=>{var o=t(1899).String;n.exports=function(c){try{return o(c)}catch(g){return"Object"}}},9418:(n,s,t)=>{var o=t(5329),c=0,g=Math.random(),C=o(1..toString);n.exports=function(D){return"Symbol("+(void 0===D?"":D)+")_"+C(++c+g,36)}},2302:(n,s,t)=>{var o=t(2497);n.exports=o&&!Symbol.sham&&"symbol"==typeof Symbol.iterator},3937:(n,s,t)=>{var o=t(5746),c=t(5981);n.exports=o&&c(function(){return 42!=Object.defineProperty(function(){},"prototype",{value:42,writable:!1}).prototype})},9813:(n,s,t)=>{var o=t(1899),c=t(8726),g=t(953),C=t(9418),D=t(2497),P=t(2302),j=c("wks"),W=o.Symbol,re=W&&W.for,ie=P?W:W&&W.withoutSetter||C;n.exports=function(ge){if(!g(j,ge)||!D&&"string"!=typeof j[ge]){var _e="Symbol."+ge;j[ge]=D&&g(W,ge)?W[ge]:P&&re?re(_e):ie(_e)}return j[ge]}},6450:(n,s,t)=>{var o=t(6887),c=t(5746),g=t(5988).f;o({target:"Object",stat:!0,forced:Object.defineProperty!==g,sham:!c},{defineProperty:g})},1910:(n,s,t)=>{var o=t(8171);n.exports=o},7698:(n,s,t)=>{var o=t(8764).Buffer;function c(j){return j instanceof o||j instanceof Date||j instanceof RegExp}function g(j){if(j instanceof o){var W=o.alloc?o.alloc(j.length):new o(j.length);return j.copy(W),W}if(j instanceof Date)return new Date(j.getTime());if(j instanceof RegExp)return new RegExp(j);throw new Error("Unexpected situation")}function C(j){var W=[];return j.forEach(function(re,ie){W[ie]="object"==typeof re&&null!==re?Array.isArray(re)?C(re):c(re)?g(re):P({},re):re}),W}function D(j,W){return"__proto__"===W?void 0:j[W]}var P=n.exports=function(){if(arguments.length<1||"object"!=typeof arguments[0])return!1;if(arguments.length<2)return arguments[0];var j,W,re=arguments[0],ie=Array.prototype.slice.call(arguments,1);return ie.forEach(function(ge){"object"!=typeof ge||null===ge||Array.isArray(ge)||Object.keys(ge).forEach(function(_e){return W=D(re,_e),(j=D(ge,_e))===re?void 0:"object"!=typeof j||null===j?void(re[_e]=j):Array.isArray(j)?void(re[_e]=C(j)):c(j)?void(re[_e]=g(j)):"object"!=typeof W||null===W||Array.isArray(W)?void(re[_e]=P({},j)):void(re[_e]=P(W,j))})}),re}},7187:n=>{var s,t="object"==typeof Reflect?Reflect:null,o=t&&"function"==typeof t.apply?t.apply:function(Re,ke,xe){return Function.prototype.apply.call(Re,ke,xe)};s=t&&"function"==typeof t.ownKeys?t.ownKeys:Object.getOwnPropertySymbols?function(Re){return Object.getOwnPropertyNames(Re).concat(Object.getOwnPropertySymbols(Re))}:function(Re){return Object.getOwnPropertyNames(Re)};var c=Number.isNaN||function(Re){return Re!=Re};function g(){g.init.call(this)}n.exports=g,n.exports.once=function(Re,ke){return new Promise(function(xe,U){function pt(wt){Re.removeListener(ke,ht),U(wt)}function ht(){"function"==typeof Re.removeListener&&Re.removeListener("error",pt),xe([].slice.call(arguments))}var wt;Le(Re,ke,ht,{once:!0}),"error"!==ke&&("function"==typeof(wt=Re).on&&Le(wt,"error",pt,{once:!0}))})},g.EventEmitter=g,g.prototype._events=void 0,g.prototype._eventsCount=0,g.prototype._maxListeners=void 0;var C=10;function D(Re){if("function"!=typeof Re)throw new TypeError('The "listener" argument must be of type Function. Received type '+typeof Re)}function P(Re){return void 0===Re._maxListeners?g.defaultMaxListeners:Re._maxListeners}function j(Re,ke,xe,U){var pt,ht,wt;if(D(xe),void 0===(ht=Re._events)?(ht=Re._events=Object.create(null),Re._eventsCount=0):(void 0!==ht.newListener&&(Re.emit("newListener",ke,xe.listener?xe.listener:xe),ht=Re._events),wt=ht[ke]),void 0===wt)wt=ht[ke]=xe,++Re._eventsCount;else if("function"==typeof wt?wt=ht[ke]=U?[xe,wt]:[wt,xe]:U?wt.unshift(xe):wt.push(xe),(pt=P(Re))>0&&wt.length>pt&&!wt.warned){wt.warned=!0;var dn=new Error("Possible EventEmitter memory leak detected. "+wt.length+" "+String(ke)+" listeners added. Use emitter.setMaxListeners() to increase limit");dn.name="MaxListenersExceededWarning",dn.emitter=Re,dn.type=ke,dn.count=wt.length,console&&console.warn&&console.warn(dn)}return Re}function W(){if(!this.fired)return this.target.removeListener(this.type,this.wrapFn),this.fired=!0,0===arguments.length?this.listener.call(this.target):this.listener.apply(this.target,arguments)}function re(Re,ke,xe){var U={fired:!1,wrapFn:void 0,target:Re,type:ke,listener:xe},pt=W.bind(U);return pt.listener=xe,U.wrapFn=pt,pt}function ie(Re,ke,xe){var U=Re._events;if(void 0===U)return[];var pt=U[ke];return void 0===pt?[]:"function"==typeof pt?xe?[pt.listener||pt]:[pt]:xe?function(ht){for(var wt=new Array(ht.length),It=0;It<wt.length;++It)wt[It]=ht[It].listener||ht[It];return wt}(pt):_e(pt,pt.length)}function ge(Re){var ke=this._events;if(void 0!==ke){var xe=ke[Re];if("function"==typeof xe)return 1;if(void 0!==xe)return xe.length}return 0}function _e(Re,ke){for(var xe=new Array(ke),U=0;U<ke;++U)xe[U]=Re[U];return xe}function Le(Re,ke,xe,U){if("function"==typeof Re.on)U.once?Re.once(ke,xe):Re.on(ke,xe);else{if("function"!=typeof Re.addEventListener)throw new TypeError('The "emitter" argument must be of type EventEmitter. Received type '+typeof Re);Re.addEventListener(ke,function pt(ht){U.once&&Re.removeEventListener(ke,pt),xe(ht)})}}Object.defineProperty(g,"defaultMaxListeners",{enumerable:!0,get:function(){return C},set:function(Re){if("number"!=typeof Re||Re<0||c(Re))throw new RangeError('The value of "defaultMaxListeners" is out of range. It must be a non-negative number. Received '+Re+".");C=Re}}),g.init=function(){void 0!==this._events&&this._events!==Object.getPrototypeOf(this)._events||(this._events=Object.create(null),this._eventsCount=0),this._maxListeners=this._maxListeners||void 0},g.prototype.setMaxListeners=function(Re){if("number"!=typeof Re||Re<0||c(Re))throw new RangeError('The value of "n" is out of range. It must be a non-negative number. Received '+Re+".");return this._maxListeners=Re,this},g.prototype.getMaxListeners=function(){return P(this)},g.prototype.emit=function(Re){for(var ke=[],xe=1;xe<arguments.length;xe++)ke.push(arguments[xe]);var U="error"===Re,pt=this._events;if(void 0!==pt)U=U&&void 0===pt.error;else if(!U)return!1;if(U){var ht;if(ke.length>0&&(ht=ke[0]),ht instanceof Error)throw ht;var wt=new Error("Unhandled error."+(ht?" ("+ht.message+")":""));throw wt.context=ht,wt}var It=pt[Re];if(void 0===It)return!1;if("function"==typeof It)o(It,this,ke);else{var dn=It.length,Lt=_e(It,dn);for(xe=0;xe<dn;++xe)o(Lt[xe],this,ke)}return!0},g.prototype.on=g.prototype.addListener=function(Re,ke){return j(this,Re,ke,!1)},g.prototype.prependListener=function(Re,ke){return j(this,Re,ke,!0)},g.prototype.once=function(Re,ke){return D(ke),this.on(Re,re(this,Re,ke)),this},g.prototype.prependOnceListener=function(Re,ke){return D(ke),this.prependListener(Re,re(this,Re,ke)),this},g.prototype.off=g.prototype.removeListener=function(Re,ke){var xe,U,pt,ht,wt;if(D(ke),void 0===(U=this._events))return this;if(void 0===(xe=U[Re]))return this;if(xe===ke||xe.listener===ke)0==--this._eventsCount?this._events=Object.create(null):(delete U[Re],U.removeListener&&this.emit("removeListener",Re,xe.listener||ke));else if("function"!=typeof xe){for(pt=-1,ht=xe.length-1;ht>=0;ht--)if(xe[ht]===ke||xe[ht].listener===ke){wt=xe[ht].listener,pt=ht;break}if(pt<0)return this;0===pt?xe.shift():function(It,dn){for(;dn+1<It.length;dn++)It[dn]=It[dn+1];It.pop()}(xe,pt),1===xe.length&&(U[Re]=xe[0]),void 0!==U.removeListener&&this.emit("removeListener",Re,wt||ke)}return this},g.prototype.removeAllListeners=function(Re){var ke,xe,U;if(void 0===(xe=this._events))return this;if(void 0===xe.removeListener)return 0===arguments.length?(this._events=Object.create(null),this._eventsCount=0):void 0!==xe[Re]&&(0==--this._eventsCount?this._events=Object.create(null):delete xe[Re]),this;if(0===arguments.length){var pt,ht=Object.keys(xe);for(U=0;U<ht.length;++U)"removeListener"!==(pt=ht[U])&&this.removeAllListeners(pt);return this.removeAllListeners("removeListener"),this._events=Object.create(null),this._eventsCount=0,this}if("function"==typeof(ke=xe[Re]))this.removeListener(Re,ke);else if(void 0!==ke)for(U=ke.length-1;U>=0;U--)this.removeListener(Re,ke[U]);return this},g.prototype.listeners=function(Re){return ie(this,Re,!0)},g.prototype.rawListeners=function(Re){return ie(this,Re,!1)},g.listenerCount=function(Re,ke){return"function"==typeof Re.listenerCount?Re.listenerCount(ke):ge.call(Re,ke)},g.prototype.listenerCount=ge,g.prototype.eventNames=function(){return this._eventsCount>0?s(this._events):[]}},5717:n=>{n.exports="function"==typeof Object.create?function(s,t){t&&(s.super_=t,s.prototype=Object.create(t.prototype,{constructor:{value:s,enumerable:!1,writable:!0,configurable:!0}}))}:function(s,t){if(t){s.super_=t;var o=function(){};o.prototype=t.prototype,s.prototype=new o,s.prototype.constructor=s}}},4155:n=>{var s,t,o=n.exports={};function c(){throw new Error("setTimeout has not been defined")}function g(){throw new Error("clearTimeout has not been defined")}function C(Le){if(s===setTimeout)return setTimeout(Le,0);if((s===c||!s)&&setTimeout)return s=setTimeout,setTimeout(Le,0);try{return s(Le,0)}catch(Re){try{return s.call(null,Le,0)}catch(ke){return s.call(this,Le,0)}}}!function(){try{s="function"==typeof setTimeout?setTimeout:c}catch(Le){s=c}try{t="function"==typeof clearTimeout?clearTimeout:g}catch(Le){t=g}}();var D,P=[],j=!1,W=-1;function re(){j&&D&&(j=!1,D.length?P=D.concat(P):W=-1,P.length&&ie())}function ie(){if(!j){var Le=C(re);j=!0;for(var Re=P.length;Re;){for(D=P,P=[];++W<Re;)D&&D[W].run();W=-1,Re=P.length}D=null,j=!1,function(ke){if(t===clearTimeout)return clearTimeout(ke);if((t===g||!t)&&clearTimeout)return t=clearTimeout,clearTimeout(ke);try{t(ke)}catch(xe){try{return t.call(null,ke)}catch(U){return t.call(this,ke)}}}(Le)}}function ge(Le,Re){this.fun=Le,this.array=Re}function _e(){}o.nextTick=function(Le){var Re=new Array(arguments.length-1);if(arguments.length>1)for(var ke=1;ke<arguments.length;ke++)Re[ke-1]=arguments[ke];P.push(new ge(Le,Re)),1!==P.length||j||C(ie)},ge.prototype.run=function(){this.fun.apply(null,this.array)},o.title="browser",o.browser=!0,o.env={},o.argv=[],o.version="",o.versions={},o.on=_e,o.addListener=_e,o.once=_e,o.off=_e,o.removeListener=_e,o.removeAllListeners=_e,o.emit=_e,o.prependListener=_e,o.prependOnceListener=_e,o.listeners=function(Le){return[]},o.binding=function(Le){throw new Error("process.binding is not supported")},o.cwd=function(){return"/"},o.chdir=function(Le){throw new Error("process.chdir is not supported")},o.umask=function(){return 0}},1798:(n,s,t)=>{var o=t(4155),c=65536,C=t(396).Buffer,D=t.g.crypto||t.g.msCrypto;n.exports=D&&D.getRandomValues?function(P,j){if(P>4294967295)throw new RangeError("requested too many random bytes");var W=C.allocUnsafe(P);if(P>0)if(P>c)for(var re=0;re<P;re+=c)D.getRandomValues(W.slice(re,re+c));else D.getRandomValues(W);return"function"==typeof j?o.nextTick(function(){j(null,W)}):W}:function(){throw new Error("Secure random number generation is not supported by this browser.\nUse Chrome, Firefox or Internet Explorer 11")}},4281:n=>{var s={};function t(c,g,C){C||(C=Error);var D=function(P){var j,W;function re(ie,ge,_e){return P.call(this,"string"==typeof g?g:g(ie,ge,_e))||this}return W=P,(j=re).prototype=Object.create(W.prototype),j.prototype.constructor=j,j.__proto__=W,re}(C);D.prototype.name=C.name,D.prototype.code=c,s[c]=D}function o(c,g){if(Array.isArray(c)){var C=c.length;return c=c.map(function(D){return String(D)}),C>2?"one of ".concat(g," ").concat(c.slice(0,C-1).join(", "),", or ")+c[C-1]:2===C?"one of ".concat(g," ").concat(c[0]," or ").concat(c[1]):"of ".concat(g," ").concat(c[0])}return"of ".concat(g," ").concat(String(c))}t("ERR_INVALID_OPT_VALUE",function(c,g){return'The value "'+g+'" is invalid for option "'+c+'"'},TypeError),t("ERR_INVALID_ARG_TYPE",function(c,g,C){var D,W,ie,_e;if("string"==typeof g&&"not "===g.substr(0,"not ".length)?(D="must not be",g=g.replace(/^not /,"")):D="must be",ie=c,(void 0===_e||_e>ie.length)&&(_e=ie.length)," argument"===ie.substring(_e-" argument".length,_e))W="The ".concat(c," ").concat(D," ").concat(o(g,"type"));else{var re=function(ie,ge,_e){return"number"!=typeof _e&&(_e=0),!(_e+".".length>ie.length)&&-1!==ie.indexOf(".",_e)}(c)?"property":"argument";W='The "'.concat(c,'" ').concat(re," ").concat(D," ").concat(o(g,"type"))}return W+". Received type ".concat(typeof C)},TypeError),t("ERR_STREAM_PUSH_AFTER_EOF","stream.push() after EOF"),t("ERR_METHOD_NOT_IMPLEMENTED",function(c){return"The "+c+" method is not implemented"}),t("ERR_STREAM_PREMATURE_CLOSE","Premature close"),t("ERR_STREAM_DESTROYED",function(c){return"Cannot call "+c+" after a stream was destroyed"}),t("ERR_MULTIPLE_CALLBACK","Callback called multiple times"),t("ERR_STREAM_CANNOT_PIPE","Cannot pipe, not readable"),t("ERR_STREAM_WRITE_AFTER_END","write after end"),t("ERR_STREAM_NULL_VALUES","May not write null values to stream",TypeError),t("ERR_UNKNOWN_ENCODING",function(c){return"Unknown encoding: "+c},TypeError),t("ERR_STREAM_UNSHIFT_AFTER_END_EVENT","stream.unshift() after end event"),n.exports.q=s},6753:(n,s,t)=>{var o=t(4155),c=Object.keys||function(ge){var _e=[];for(var Le in ge)_e.push(Le);return _e};n.exports=W;var g=t(9481),C=t(4229);t(5717)(W,g);for(var D=c(C.prototype),P=0;P<D.length;P++){var j=D[P];W.prototype[j]||(W.prototype[j]=C.prototype[j])}function W(ge){if(!(this instanceof W))return new W(ge);g.call(this,ge),C.call(this,ge),this.allowHalfOpen=!0,ge&&(!1===ge.readable&&(this.readable=!1),!1===ge.writable&&(this.writable=!1),!1===ge.allowHalfOpen&&(this.allowHalfOpen=!1,this.once("end",re)))}function re(){this._writableState.ended||o.nextTick(ie,this)}function ie(ge){ge.end()}Object.defineProperty(W.prototype,"writableHighWaterMark",{enumerable:!1,get:function(){return this._writableState.highWaterMark}}),Object.defineProperty(W.prototype,"writableBuffer",{enumerable:!1,get:function(){return this._writableState&&this._writableState.getBuffer()}}),Object.defineProperty(W.prototype,"writableLength",{enumerable:!1,get:function(){return this._writableState.length}}),Object.defineProperty(W.prototype,"destroyed",{enumerable:!1,get:function(){return void 0!==this._readableState&&void 0!==this._writableState&&this._readableState.destroyed&&this._writableState.destroyed},set:function(ge){void 0!==this._readableState&&void 0!==this._writableState&&(this._readableState.destroyed=ge,this._writableState.destroyed=ge)}})},2725:(n,s,t)=>{n.exports=c;var o=t(4605);function c(g){if(!(this instanceof c))return new c(g);o.call(this,g)}t(5717)(c,o),c.prototype._transform=function(g,C,D){D(null,g)}},9481:(n,s,t)=>{var o,c=t(4155);n.exports=Lt,Lt.ReadableState=dn,t(7187);var j,g=function(An,hn){return An.listeners(hn).length},C=t(2503),D=t(8764).Buffer,P=t.g.Uint8Array||function(){},W=t(4616);j=W&&W.debuglog?W.debuglog("stream"):function(){};var re,ie,ge,_e=t(7327),Le=t(1195),Re=t(2457).getHighWaterMark,ke=t(4281).q,xe=ke.ERR_INVALID_ARG_TYPE,U=ke.ERR_STREAM_PUSH_AFTER_EOF,pt=ke.ERR_METHOD_NOT_IMPLEMENTED,ht=ke.ERR_STREAM_UNSHIFT_AFTER_END_EVENT;t(5717)(Lt,C);var wt=Le.errorOrDestroy,It=["error","close","destroy","pause","resume"];function dn(An,hn,qr){o=o||t(6753),"boolean"!=typeof qr&&(qr=hn instanceof o),this.objectMode=!!(An=An||{}).objectMode,qr&&(this.objectMode=this.objectMode||!!An.readableObjectMode),this.highWaterMark=Re(this,An,"readableHighWaterMark",qr),this.buffer=new _e,this.length=0,this.pipes=null,this.pipesCount=0,this.flowing=null,this.ended=!1,this.endEmitted=!1,this.reading=!1,this.sync=!0,this.needReadable=!1,this.emittedReadable=!1,this.readableListening=!1,this.resumeScheduled=!1,this.paused=!0,this.emitClose=!1!==An.emitClose,this.autoDestroy=!!An.autoDestroy,this.destroyed=!1,this.defaultEncoding=An.defaultEncoding||"utf8",this.awaitDrain=0,this.readingMore=!1,this.decoder=null,this.encoding=null,An.encoding&&(re||(re=t(2553).s),this.decoder=new re(An.encoding),this.encoding=An.encoding)}function Lt(An){if(o=o||t(6753),!(this instanceof Lt))return new Lt(An);this._readableState=new dn(An,this,this instanceof o),this.readable=!0,An&&("function"==typeof An.read&&(this._read=An.read),"function"==typeof An.destroy&&(this._destroy=An.destroy)),C.call(this)}function Dn(An,hn,qr,Ri,qi){j("readableAddChunk",hn);var Zo,Ys,Ws,wi,lo,bo=An._readableState;if(null===hn)bo.reading=!1,function(Ys,Ws){if(j("onEofChunk"),!Ws.ended){if(Ws.decoder){var wi=Ws.decoder.end();wi&&wi.length&&(Ws.buffer.push(wi),Ws.length+=Ws.objectMode?1:wi.length)}Ws.ended=!0,Ws.sync?Pr(Ys):(Ws.needReadable=!1,Ws.emittedReadable||(Ws.emittedReadable=!0,xr(Ys)))}}(An,bo);else if(qi||(Ys=bo,D.isBuffer(lo=Ws=hn)||lo instanceof P||"string"==typeof Ws||void 0===Ws||Ys.objectMode||(wi=new xe("chunk",["string","Buffer","Uint8Array"],Ws)),Zo=wi),Zo)wt(An,Zo);else if(bo.objectMode||hn&&hn.length>0)if("string"==typeof hn||bo.objectMode||Object.getPrototypeOf(hn)===D.prototype||(hn=function(Ys){return D.from(Ys)}(hn)),Ri)bo.endEmitted?wt(An,new ht):Mn(An,bo,hn,!0);else if(bo.ended)wt(An,new U);else{if(bo.destroyed)return!1;bo.reading=!1,bo.decoder&&!qr?(hn=bo.decoder.write(hn),bo.objectMode||0!==hn.length?Mn(An,bo,hn,!1):fn(An,bo)):Mn(An,bo,hn,!1)}else Ri||(bo.reading=!1,fn(An,bo));return!bo.ended&&(bo.length<bo.highWaterMark||0===bo.length)}function Mn(An,hn,qr,Ri){hn.flowing&&0===hn.length&&!hn.sync?(hn.awaitDrain=0,An.emit("data",qr)):(hn.length+=hn.objectMode?1:qr.length,Ri?hn.buffer.unshift(qr):hn.buffer.push(qr),hn.needReadable&&Pr(An)),fn(An,hn)}Object.defineProperty(Lt.prototype,"destroyed",{enumerable:!1,get:function(){return void 0!==this._readableState&&this._readableState.destroyed},set:function(An){this._readableState&&(this._readableState.destroyed=An)}}),Lt.prototype.destroy=Le.destroy,Lt.prototype._undestroy=Le.undestroy,Lt.prototype._destroy=function(An,hn){hn(An)},Lt.prototype.push=function(An,hn){var qr,Ri=this._readableState;return Ri.objectMode?qr=!0:"string"==typeof An&&((hn=hn||Ri.defaultEncoding)!==Ri.encoding&&(An=D.from(An,hn),hn=""),qr=!0),Dn(this,An,hn,!1,qr)},Lt.prototype.unshift=function(An){return Dn(this,An,null,!0,!1)},Lt.prototype.isPaused=function(){return!1===this._readableState.flowing},Lt.prototype.setEncoding=function(An){re||(re=t(2553).s);var hn=new re(An);this._readableState.decoder=hn,this._readableState.encoding=this._readableState.decoder.encoding;for(var qr=this._readableState.buffer.head,Ri="";null!==qr;)Ri+=hn.write(qr.data),qr=qr.next;return this._readableState.buffer.clear(),""!==Ri&&this._readableState.buffer.push(Ri),this._readableState.length=Ri.length,this};var $r=1073741824;function ur(An,hn){return An<=0||0===hn.length&&hn.ended?0:hn.objectMode?1:An!=An?hn.flowing&&hn.length?hn.buffer.head.data.length:hn.length:(An>hn.highWaterMark&&(hn.highWaterMark=((qr=An)>=$r?qr=$r:(qr--,qr|=qr>>>1,qr|=qr>>>2,qr|=qr>>>4,qr|=qr>>>8,qr|=qr>>>16,qr++),qr)),An<=hn.length?An:hn.ended?hn.length:(hn.needReadable=!0,0));var qr}function Pr(An){var hn=An._readableState;j("emitReadable",hn.needReadable,hn.emittedReadable),hn.needReadable=!1,hn.emittedReadable||(j("emitReadable",hn.flowing),hn.emittedReadable=!0,c.nextTick(xr,An))}function xr(An){var hn=An._readableState;j("emitReadable_",hn.destroyed,hn.length,hn.ended),hn.destroyed||!hn.length&&!hn.ended||(An.emit("readable"),hn.emittedReadable=!1),hn.needReadable=!hn.flowing&&!hn.ended&&hn.length<=hn.highWaterMark,Yr(An)}function fn(An,hn){hn.readingMore||(hn.readingMore=!0,c.nextTick(Nn,An,hn))}function Nn(An,hn){for(;!hn.reading&&!hn.ended&&(hn.length<hn.highWaterMark||hn.flowing&&0===hn.length);){var qr=hn.length;if(j("maybeReadMore read 0"),An.read(0),qr===hn.length)break}hn.readingMore=!1}function $n(An){var hn=An._readableState;hn.readableListening=An.listenerCount("readable")>0,hn.resumeScheduled&&!hn.paused?hn.flowing=!0:An.listenerCount("data")>0&&An.resume()}function Qn(An){j("readable nexttick read 0"),An.read(0)}function Tn(An,hn){j("resume",hn.reading),hn.reading||An.read(0),hn.resumeScheduled=!1,An.emit("resume"),Yr(An),hn.flowing&&!hn.reading&&An.read(0)}function Yr(An){var hn=An._readableState;for(j("flow",hn.flowing);hn.flowing&&null!==An.read(););}function ji(An,hn){return 0===hn.length?null:(hn.objectMode?qr=hn.buffer.shift():!An||An>=hn.length?(qr=hn.decoder?hn.buffer.join(""):1===hn.buffer.length?hn.buffer.first():hn.buffer.concat(hn.length),hn.buffer.clear()):qr=hn.buffer.consume(An,hn.decoder),qr);var qr}function ii(An){var hn=An._readableState;j("endReadable",hn.endEmitted),hn.endEmitted||(hn.ended=!0,c.nextTick(Ui,hn,An))}function Ui(An,hn){if(j("endReadableNT",An.endEmitted,An.length),!An.endEmitted&&0===An.length&&(An.endEmitted=!0,hn.readable=!1,hn.emit("end"),An.autoDestroy)){var qr=hn._writableState;(!qr||qr.autoDestroy&&qr.finished)&&hn.destroy()}}function Jr(An,hn){for(var qr=0,Ri=An.length;qr<Ri;qr++)if(An[qr]===hn)return qr;return-1}Lt.prototype.read=function(An){j("read",An),An=parseInt(An,10);var hn=this._readableState,qr=An;if(0!==An&&(hn.emittedReadable=!1),0===An&&hn.needReadable&&((0!==hn.highWaterMark?hn.length>=hn.highWaterMark:hn.length>0)||hn.ended))return j("read: emitReadable",hn.length,hn.ended),0===hn.length&&hn.ended?ii(this):Pr(this),null;if(0===(An=ur(An,hn))&&hn.ended)return 0===hn.length&&ii(this),null;var Ri,qi=hn.needReadable;return j("need readable",qi),(0===hn.length||hn.length-An<hn.highWaterMark)&&j("length less than watermark",qi=!0),hn.ended||hn.reading?j("reading or ended",qi=!1):qi&&(j("do read"),hn.reading=!0,hn.sync=!0,0===hn.length&&(hn.needReadable=!0),this._read(hn.highWaterMark),hn.sync=!1,hn.reading||(An=ur(qr,hn))),null===(Ri=An>0?ji(An,hn):null)?(hn.needReadable=hn.length<=hn.highWaterMark,An=0):(hn.length-=An,hn.awaitDrain=0),0===hn.length&&(hn.ended||(hn.needReadable=!0),qr!==An&&hn.ended&&ii(this)),null!==Ri&&this.emit("data",Ri),Ri},Lt.prototype._read=function(An){wt(this,new pt("_read()"))},Lt.prototype.pipe=function(An,hn){var qr=this,Ri=this._readableState;switch(Ri.pipesCount){case 0:Ri.pipes=An;break;case 1:Ri.pipes=[Ri.pipes,An];break;default:Ri.pipes.push(An)}Ri.pipesCount+=1,j("pipe count=%d opts=%j",Ri.pipesCount,hn);var qi=hn&&!1===hn.end||An===c.stdout||An===c.stderr?St:bo;function bo(){j("onend"),An.end()}Ri.endEmitted?c.nextTick(qi):qr.once("end",qi),An.on("unpipe",function Zo(Et,Bn){j("onunpipe"),Et===qr&&Bn&&!1===Bn.hasUnpiped&&(Bn.hasUnpiped=!0,j("cleanup"),An.removeListener("close",go),An.removeListener("finish",Ge),An.removeListener("drain",Ys),An.removeListener("error",lo),An.removeListener("unpipe",Zo),qr.removeListener("end",bo),qr.removeListener("end",St),qr.removeListener("data",wi),Ws=!0,!Ri.awaitDrain||An._writableState&&!An._writableState.needDrain||Ys())});var Et,Ys=(Et=qr,function(){var Bn=Et._readableState;j("pipeOnDrain",Bn.awaitDrain),Bn.awaitDrain&&Bn.awaitDrain--,0===Bn.awaitDrain&&g(Et,"data")&&(Bn.flowing=!0,Yr(Et))});An.on("drain",Ys);var Ws=!1;function wi(Et){j("ondata");var Bn=An.write(Et);j("dest.write",Bn),!1===Bn&&((1===Ri.pipesCount&&Ri.pipes===An||Ri.pipesCount>1&&-1!==Jr(Ri.pipes,An))&&!Ws&&(j("false write response, pause",Ri.awaitDrain),Ri.awaitDrain++),qr.pause())}function lo(Et){j("onerror",Et),St(),An.removeListener("error",lo),0===g(An,"error")&&wt(An,Et)}function go(){An.removeListener("finish",Ge),St()}function Ge(){j("onfinish"),An.removeListener("close",go),St()}function St(){j("unpipe"),qr.unpipe(An)}return qr.on("data",wi),function(Et,Bn,_r){if("function"==typeof Et.prependListener)return Et.prependListener(Bn,_r);Et._events&&Et._events[Bn]?Array.isArray(Et._events[Bn])?Et._events[Bn].unshift(_r):Et._events[Bn]=[_r,Et._events[Bn]]:Et.on(Bn,_r)}(An,"error",lo),An.once("close",go),An.once("finish",Ge),An.emit("pipe",qr),Ri.flowing||(j("pipe resume"),qr.resume()),An},Lt.prototype.unpipe=function(An){var hn=this._readableState,qr={hasUnpiped:!1};if(0===hn.pipesCount)return this;if(1===hn.pipesCount)return An&&An!==hn.pipes||(An||(An=hn.pipes),hn.pipes=null,hn.pipesCount=0,hn.flowing=!1,An&&An.emit("unpipe",this,qr)),this;if(!An){var Ri=hn.pipes,qi=hn.pipesCount;hn.pipes=null,hn.pipesCount=0,hn.flowing=!1;for(var Zo=0;Zo<qi;Zo++)Ri[Zo].emit("unpipe",this,{hasUnpiped:!1});return this}var bo=Jr(hn.pipes,An);return-1===bo||(hn.pipes.splice(bo,1),hn.pipesCount-=1,1===hn.pipesCount&&(hn.pipes=hn.pipes[0]),An.emit("unpipe",this,qr)),this},Lt.prototype.addListener=Lt.prototype.on=function(An,hn){var qr=C.prototype.on.call(this,An,hn),Ri=this._readableState;return"data"===An?(Ri.readableListening=this.listenerCount("readable")>0,!1!==Ri.flowing&&this.resume()):"readable"===An&&(Ri.endEmitted||Ri.readableListening||(Ri.readableListening=Ri.needReadable=!0,Ri.flowing=!1,Ri.emittedReadable=!1,j("on readable",Ri.length,Ri.reading),Ri.length?Pr(this):Ri.reading||c.nextTick(Qn,this))),qr},Lt.prototype.removeListener=function(An,hn){var qr=C.prototype.removeListener.call(this,An,hn);return"readable"===An&&c.nextTick($n,this),qr},Lt.prototype.removeAllListeners=function(An){var hn=C.prototype.removeAllListeners.apply(this,arguments);return"readable"!==An&&void 0!==An||c.nextTick($n,this),hn},Lt.prototype.resume=function(){var qr,An=this._readableState;return An.flowing||(j("resume"),An.flowing=!An.readableListening,this,(qr=An).resumeScheduled||(qr.resumeScheduled=!0,c.nextTick(Tn,this,qr))),An.paused=!1,this},Lt.prototype.pause=function(){return j("call pause flowing=%j",this._readableState.flowing),!1!==this._readableState.flowing&&(j("pause"),this._readableState.flowing=!1,this.emit("pause")),this._readableState.paused=!0,this},Lt.prototype.wrap=function(An){var hn=this,qr=this._readableState,Ri=!1;for(var qi in An.on("end",function(){if(j("wrapped end"),qr.decoder&&!qr.ended){var bo=qr.decoder.end();bo&&bo.length&&hn.push(bo)}hn.push(null)}),An.on("data",function(bo){j("wrapped data"),qr.decoder&&(bo=qr.decoder.write(bo)),qr.objectMode&&null==bo||(qr.objectMode||bo&&bo.length)&&(hn.push(bo)||(Ri=!0,An.pause()))}),An)void 0===this[qi]&&"function"==typeof An[qi]&&(this[qi]=function(bo){return function(){return An[bo].apply(An,arguments)}}(qi));for(var Zo=0;Zo<It.length;Zo++)An.on(It[Zo],this.emit.bind(this,It[Zo]));return this._read=function(bo){j("wrapped _read",bo),Ri&&(Ri=!1,An.resume())},this},"function"==typeof Symbol&&(Lt.prototype[Symbol.asyncIterator]=function(){return void 0===ie&&(ie=t(5850)),ie(this)}),Object.defineProperty(Lt.prototype,"readableHighWaterMark",{enumerable:!1,get:function(){return this._readableState.highWaterMark}}),Object.defineProperty(Lt.prototype,"readableBuffer",{enumerable:!1,get:function(){return this._readableState&&this._readableState.buffer}}),Object.defineProperty(Lt.prototype,"readableFlowing",{enumerable:!1,get:function(){return this._readableState.flowing},set:function(An){this._readableState&&(this._readableState.flowing=An)}}),Lt._fromList=ji,Object.defineProperty(Lt.prototype,"readableLength",{enumerable:!1,get:function(){return this._readableState.length}}),"function"==typeof Symbol&&(Lt.from=function(An,hn){return void 0===ge&&(ge=t(5167)),ge(Lt,An,hn)})},4605:(n,s,t)=>{n.exports=W;var o=t(4281).q,c=o.ERR_METHOD_NOT_IMPLEMENTED,g=o.ERR_MULTIPLE_CALLBACK,C=o.ERR_TRANSFORM_ALREADY_TRANSFORMING,D=o.ERR_TRANSFORM_WITH_LENGTH_0,P=t(6753);function j(ge,_e){var Le=this._transformState;Le.transforming=!1;var Re=Le.writecb;if(null===Re)return this.emit("error",new g);Le.writechunk=null,Le.writecb=null,null!=_e&&this.push(_e),Re(ge);var ke=this._readableState;ke.reading=!1,(ke.needReadable||ke.length<ke.highWaterMark)&&this._read(ke.highWaterMark)}function W(ge){if(!(this instanceof W))return new W(ge);P.call(this,ge),this._transformState={afterTransform:j.bind(this),needTransform:!1,transforming:!1,writecb:null,writechunk:null,writeencoding:null},this._readableState.needReadable=!0,this._readableState.sync=!1,ge&&("function"==typeof ge.transform&&(this._transform=ge.transform),"function"==typeof ge.flush&&(this._flush=ge.flush)),this.on("prefinish",re)}function re(){var ge=this;"function"!=typeof this._flush||this._readableState.destroyed?ie(this,null,null):this._flush(function(_e,Le){ie(ge,_e,Le)})}function ie(ge,_e,Le){if(_e)return ge.emit("error",_e);if(null!=Le&&ge.push(Le),ge._writableState.length)throw new D;if(ge._transformState.transforming)throw new C;return ge.push(null)}t(5717)(W,P),W.prototype.push=function(ge,_e){return this._transformState.needTransform=!1,P.prototype.push.call(this,ge,_e)},W.prototype._transform=function(ge,_e,Le){Le(new c("_transform()"))},W.prototype._write=function(ge,_e,Le){var Re=this._transformState;if(Re.writecb=Le,Re.writechunk=ge,Re.writeencoding=_e,!Re.transforming){var ke=this._readableState;(Re.needTransform||ke.needReadable||ke.length<ke.highWaterMark)&&this._read(ke.highWaterMark)}},W.prototype._read=function(ge){var _e=this._transformState;null===_e.writechunk||_e.transforming?_e.needTransform=!0:(_e.transforming=!0,this._transform(_e.writechunk,_e.writeencoding,_e.afterTransform))},W.prototype._destroy=function(ge,_e){P.prototype._destroy.call(this,ge,function(Le){_e(Le)})}},4229:(n,s,t)=>{var o,c=t(4155);function g(fn){var Nn=this;this.next=null,this.entry=null,this.finish=function(){!function($n,Qn,Tn){var Yr=$n.entry;for($n.entry=null;Yr;){var ji=Yr.callback;Qn.pendingcb--,ji(void 0),Yr=Yr.next}Qn.corkedRequestsFree.next=$n}(Nn,fn)}}n.exports=Lt,Lt.WritableState=dn;var W,C={deprecate:t(4927)},D=t(2503),P=t(8764).Buffer,j=t.g.Uint8Array||function(){},re=t(1195),ie=t(2457).getHighWaterMark,ge=t(4281).q,_e=ge.ERR_INVALID_ARG_TYPE,Le=ge.ERR_METHOD_NOT_IMPLEMENTED,Re=ge.ERR_MULTIPLE_CALLBACK,ke=ge.ERR_STREAM_CANNOT_PIPE,xe=ge.ERR_STREAM_DESTROYED,U=ge.ERR_STREAM_NULL_VALUES,pt=ge.ERR_STREAM_WRITE_AFTER_END,ht=ge.ERR_UNKNOWN_ENCODING,wt=re.errorOrDestroy;function It(){}function dn(fn,Nn,$n){o=o||t(6753),"boolean"!=typeof $n&&($n=Nn instanceof o),this.objectMode=!!(fn=fn||{}).objectMode,$n&&(this.objectMode=this.objectMode||!!fn.writableObjectMode),this.highWaterMark=ie(this,fn,"writableHighWaterMark",$n),this.finalCalled=!1,this.needDrain=!1,this.ending=!1,this.ended=!1,this.finished=!1,this.destroyed=!1,this.decodeStrings=!(!1===fn.decodeStrings),this.defaultEncoding=fn.defaultEncoding||"utf8",this.length=0,this.writing=!1,this.corked=0,this.sync=!0,this.bufferProcessing=!1,this.onwrite=function(Tn){!function(Yr,ji){var hn,ii=Yr._writableState,Ui=ii.sync,Jr=ii.writecb;if("function"!=typeof Jr)throw new Re;if((hn=ii).writing=!1,hn.writecb=null,hn.length-=hn.writelen,hn.writelen=0,ji)!function(hn,qr,Ri,qi,Zo){--qr.pendingcb,Ri?(c.nextTick(Zo,qi),c.nextTick(xr,hn,qr),hn._writableState.errorEmitted=!0,wt(hn,qi)):(Zo(qi),hn._writableState.errorEmitted=!0,wt(hn,qi),xr(hn,qr))}(Yr,ii,Ui,ji,Jr);else{var An=ur(ii)||Yr.destroyed;An||ii.corked||ii.bufferProcessing||!ii.bufferedRequest||$r(Yr,ii),Ui?c.nextTick(Mn,Yr,ii,An,Jr):Mn(Yr,ii,An,Jr)}}(Nn,Tn)},this.writecb=null,this.writelen=0,this.bufferedRequest=null,this.lastBufferedRequest=null,this.pendingcb=0,this.prefinished=!1,this.errorEmitted=!1,this.emitClose=!1!==fn.emitClose,this.autoDestroy=!!fn.autoDestroy,this.bufferedRequestCount=0,this.corkedRequestsFree=new g(this)}function Lt(fn){var Nn=this instanceof(o=o||t(6753));if(!Nn&&!W.call(Lt,this))return new Lt(fn);this._writableState=new dn(fn,this,Nn),this.writable=!0,fn&&("function"==typeof fn.write&&(this._write=fn.write),"function"==typeof fn.writev&&(this._writev=fn.writev),"function"==typeof fn.destroy&&(this._destroy=fn.destroy),"function"==typeof fn.final&&(this._final=fn.final)),D.call(this)}function Dn(fn,Nn,$n,Qn,Tn,Yr,ji){Nn.writelen=Qn,Nn.writecb=ji,Nn.writing=!0,Nn.sync=!0,Nn.destroyed?Nn.onwrite(new xe("write")):$n?fn._writev(Tn,Nn.onwrite):fn._write(Tn,Yr,Nn.onwrite),Nn.sync=!1}function Mn(fn,Nn,$n,Qn){var Tn,Yr;$n||(Tn=fn,0===(Yr=Nn).length&&Yr.needDrain&&(Yr.needDrain=!1,Tn.emit("drain"))),Nn.pendingcb--,Qn(),xr(fn,Nn)}function $r(fn,Nn){Nn.bufferProcessing=!0;var $n=Nn.bufferedRequest;if(fn._writev&&$n&&$n.next){var Tn=new Array(Nn.bufferedRequestCount),Yr=Nn.corkedRequestsFree;Yr.entry=$n;for(var ji=0,ii=!0;$n;)Tn[ji]=$n,$n.isBuf||(ii=!1),$n=$n.next,ji+=1;Tn.allBuffers=ii,Dn(fn,Nn,!0,Nn.length,Tn,"",Yr.finish),Nn.pendingcb++,Nn.lastBufferedRequest=null,Yr.next?(Nn.corkedRequestsFree=Yr.next,Yr.next=null):Nn.corkedRequestsFree=new g(Nn),Nn.bufferedRequestCount=0}else{for(;$n;){var Ui=$n.chunk;if(Dn(fn,Nn,!1,Nn.objectMode?1:Ui.length,Ui,$n.encoding,$n.callback),$n=$n.next,Nn.bufferedRequestCount--,Nn.writing)break}null===$n&&(Nn.lastBufferedRequest=null)}Nn.bufferedRequest=$n,Nn.bufferProcessing=!1}function ur(fn){return fn.ending&&0===fn.length&&null===fn.bufferedRequest&&!fn.finished&&!fn.writing}function Pr(fn,Nn){fn._final(function($n){Nn.pendingcb--,$n&&wt(fn,$n),Nn.prefinished=!0,fn.emit("prefinish"),xr(fn,Nn)})}function xr(fn,Nn){var Tn,Yr,$n=ur(Nn);if($n&&(Tn=fn,(Yr=Nn).prefinished||Yr.finalCalled||("function"!=typeof Tn._final||Yr.destroyed?(Yr.prefinished=!0,Tn.emit("prefinish")):(Yr.pendingcb++,Yr.finalCalled=!0,c.nextTick(Pr,Tn,Yr))),0===Nn.pendingcb&&(Nn.finished=!0,fn.emit("finish"),Nn.autoDestroy))){var Qn=fn._readableState;(!Qn||Qn.autoDestroy&&Qn.endEmitted)&&fn.destroy()}return $n}t(5717)(Lt,D),dn.prototype.getBuffer=function(){for(var fn=this.bufferedRequest,Nn=[];fn;)Nn.push(fn),fn=fn.next;return Nn},function(){try{Object.defineProperty(dn.prototype,"buffer",{get:C.deprecate(function(){return this.getBuffer()},"_writableState.buffer is deprecated. Use _writableState.getBuffer instead.","DEP0003")})}catch(fn){}}(),"function"==typeof Symbol&&Symbol.hasInstance&&"function"==typeof Function.prototype[Symbol.hasInstance]?(W=Function.prototype[Symbol.hasInstance],Object.defineProperty(Lt,Symbol.hasInstance,{value:function(fn){return!!W.call(this,fn)||this===Lt&&fn&&fn._writableState instanceof dn}})):W=function(fn){return fn instanceof this},Lt.prototype.pipe=function(){wt(this,new ke)},Lt.prototype.write=function(fn,Nn,$n){var Qn,ii,Ui,Jr,Tn=this._writableState,Yr=!1,ji=!Tn.objectMode&&(P.isBuffer(Qn=fn)||Qn instanceof j);return ji&&!P.isBuffer(fn)&&(fn=P.from(fn)),"function"==typeof Nn&&($n=Nn,Nn=null),ji?Nn="buffer":Nn||(Nn=Tn.defaultEncoding),"function"!=typeof $n&&($n=It),Tn.ending?(ii=this,Ui=$n,Jr=new pt,wt(ii,Jr),c.nextTick(Ui,Jr)):(ji||function(ii,Ui,Jr,An){var hn;return null===Jr?hn=new U:"string"==typeof Jr||Ui.objectMode||(hn=new _e("chunk",["string","Buffer"],Jr)),!hn||(wt(ii,hn),c.nextTick(An,hn),!1)}(this,Tn,fn,$n))&&(Tn.pendingcb++,Yr=function(ii,Ui,Jr,An,hn,qr){if(!Jr){var Ri=(Ws=An,(Ys=Ui).objectMode||!1===Ys.decodeStrings||"string"!=typeof Ws||(Ws=P.from(Ws,hn)),Ws);An!==Ri&&(Jr=!0,hn="buffer",An=Ri)}var Ys,Ws,qi=Ui.objectMode?1:An.length;Ui.length+=qi;var Zo=Ui.length<Ui.highWaterMark;if(Zo||(Ui.needDrain=!0),Ui.writing||Ui.corked){var bo=Ui.lastBufferedRequest;Ui.lastBufferedRequest={chunk:An,encoding:hn,isBuf:Jr,callback:qr,next:null},bo?bo.next=Ui.lastBufferedRequest:Ui.bufferedRequest=Ui.lastBufferedRequest,Ui.bufferedRequestCount+=1}else Dn(ii,Ui,!1,qi,An,hn,qr);return Zo}(this,Tn,ji,fn,Nn,$n)),Yr},Lt.prototype.cork=function(){this._writableState.corked++},Lt.prototype.uncork=function(){var fn=this._writableState;fn.corked&&(fn.corked--,fn.writing||fn.corked||fn.bufferProcessing||!fn.bufferedRequest||$r(this,fn))},Lt.prototype.setDefaultEncoding=function(fn){if("string"==typeof fn&&(fn=fn.toLowerCase()),!(["hex","utf8","utf-8","ascii","binary","base64","ucs2","ucs-2","utf16le","utf-16le","raw"].indexOf((fn+"").toLowerCase())>-1))throw new ht(fn);return this._writableState.defaultEncoding=fn,this},Object.defineProperty(Lt.prototype,"writableBuffer",{enumerable:!1,get:function(){return this._writableState&&this._writableState.getBuffer()}}),Object.defineProperty(Lt.prototype,"writableHighWaterMark",{enumerable:!1,get:function(){return this._writableState.highWaterMark}}),Lt.prototype._write=function(fn,Nn,$n){$n(new Le("_write()"))},Lt.prototype._writev=null,Lt.prototype.end=function(fn,Nn,$n){var Yr,ji,Qn=this._writableState;return"function"==typeof fn?($n=fn,fn=null,Nn=null):"function"==typeof Nn&&($n=Nn,Nn=null),null!=fn&&this.write(fn,Nn),Qn.corked&&(Qn.corked=1,this.uncork()),Qn.ending||(this,ji=$n,(Yr=Qn).ending=!0,xr(this,Yr),ji&&(Yr.finished?c.nextTick(ji):this.once("finish",ji)),Yr.ended=!0,this.writable=!1),this},Object.defineProperty(Lt.prototype,"writableLength",{enumerable:!1,get:function(){return this._writableState.length}}),Object.defineProperty(Lt.prototype,"destroyed",{enumerable:!1,get:function(){return void 0!==this._writableState&&this._writableState.destroyed},set:function(fn){this._writableState&&(this._writableState.destroyed=fn)}}),Lt.prototype.destroy=re.destroy,Lt.prototype._undestroy=re.undestroy,Lt.prototype._destroy=function(fn,Nn){Nn(fn)}},5850:(n,s,t)=>{var o,c=t(4155);function g(U,pt,ht){return pt in U?Object.defineProperty(U,pt,{value:ht,enumerable:!0,configurable:!0,writable:!0}):U[pt]=ht,U}var C=t(8610),D=Symbol("lastResolve"),P=Symbol("lastReject"),j=Symbol("error"),W=Symbol("ended"),re=Symbol("lastPromise"),ie=Symbol("handlePromise"),ge=Symbol("stream");function _e(U,pt){return{value:U,done:pt}}function Le(U){var pt=U[D];if(null!==pt){var ht=U[ge].read();null!==ht&&(U[re]=null,U[D]=null,U[P]=null,pt(_e(ht,!1)))}}function Re(U){c.nextTick(Le,U)}var ke=Object.getPrototypeOf(function(){}),xe=Object.setPrototypeOf((g(o={get stream(){return this[ge]},next:function(){var U=this,pt=this[j];if(null!==pt)return Promise.reject(pt);if(this[W])return Promise.resolve(_e(void 0,!0));if(this[ge].destroyed)return new Promise(function(dn,Lt){c.nextTick(function(){U[j]?Lt(U[j]):dn(_e(void 0,!0))})});var ht,dn,Lt,wt=this[re];if(wt)ht=new Promise((dn=wt,Lt=this,function(Dn,Mn){dn.then(function(){Lt[W]?Dn(_e(void 0,!0)):Lt[ie](Dn,Mn)},Mn)}));else{var It=this[ge].read();if(null!==It)return Promise.resolve(_e(It,!1));ht=new Promise(this[ie])}return this[re]=ht,ht}},Symbol.asyncIterator,function(){return this}),g(o,"return",function(){var U=this;return new Promise(function(pt,ht){U[ge].destroy(null,function(wt){wt?ht(wt):pt(_e(void 0,!0))})})}),o),ke);n.exports=function(U){var pt,ht=Object.create(xe,(g(pt={},ge,{value:U,writable:!0}),g(pt,D,{value:null,writable:!0}),g(pt,P,{value:null,writable:!0}),g(pt,j,{value:null,writable:!0}),g(pt,W,{value:U._readableState.endEmitted,writable:!0}),g(pt,ie,{value:function(wt,It){var dn=ht[ge].read();dn?(ht[re]=null,ht[D]=null,ht[P]=null,wt(_e(dn,!1))):(ht[D]=wt,ht[P]=It)},writable:!0}),pt));return ht[re]=null,C(U,function(wt){if(wt&&"ERR_STREAM_PREMATURE_CLOSE"!==wt.code){var It=ht[P];return null!==It&&(ht[re]=null,ht[D]=null,ht[P]=null,It(wt)),void(ht[j]=wt)}var dn=ht[D];null!==dn&&(ht[re]=null,ht[D]=null,ht[P]=null,dn(_e(void 0,!0))),ht[W]=!0}),U.on("readable",Re.bind(null,ht)),ht}},7327:(n,s,t)=>{function o(j,W){var re=Object.keys(j);if(Object.getOwnPropertySymbols){var ie=Object.getOwnPropertySymbols(j);W&&(ie=ie.filter(function(ge){return Object.getOwnPropertyDescriptor(j,ge).enumerable})),re.push.apply(re,ie)}return re}function c(j,W,re){return W in j?Object.defineProperty(j,W,{value:re,enumerable:!0,configurable:!0,writable:!0}):j[W]=re,j}var C=t(8764).Buffer,D=t(2361).inspect,P=D&&D.custom||"inspect";n.exports=function(){function j(){(function(ge,_e){if(!(ge instanceof _e))throw new TypeError("Cannot call a class as a function")})(this,j),this.head=null,this.tail=null,this.length=0}var re;return(re=[{key:"push",value:function(ge){var _e={data:ge,next:null};this.length>0?this.tail.next=_e:this.head=_e,this.tail=_e,++this.length}},{key:"unshift",value:function(ge){var _e={data:ge,next:this.head};0===this.length&&(this.tail=_e),this.head=_e,++this.length}},{key:"shift",value:function(){if(0!==this.length){var ge=this.head.data;return this.head=1===this.length?this.tail=null:this.head.next,--this.length,ge}}},{key:"clear",value:function(){this.head=this.tail=null,this.length=0}},{key:"join",value:function(ge){if(0===this.length)return"";for(var _e=this.head,Le=""+_e.data;_e=_e.next;)Le+=ge+_e.data;return Le}},{key:"concat",value:function(ge){if(0===this.length)return C.alloc(0);for(var ke=C.allocUnsafe(ge>>>0),xe=this.head,U=0;xe;)C.prototype.copy.call(xe.data,ke,U),U+=xe.data.length,xe=xe.next;return ke}},{key:"consume",value:function(ge,_e){var Le;return ge<this.head.data.length?(Le=this.head.data.slice(0,ge),this.head.data=this.head.data.slice(ge)):Le=ge===this.head.data.length?this.shift():_e?this._getString(ge):this._getBuffer(ge),Le}},{key:"first",value:function(){return this.head.data}},{key:"_getString",value:function(ge){var _e=this.head,Le=1,Re=_e.data;for(ge-=Re.length;_e=_e.next;){var ke=_e.data,xe=ge>ke.length?ke.length:ge;if(Re+=xe===ke.length?ke:ke.slice(0,ge),0==(ge-=xe)){xe===ke.length?(++Le,this.head=_e.next?_e.next:this.tail=null):(this.head=_e,_e.data=ke.slice(xe));break}++Le}return this.length-=Le,Re}},{key:"_getBuffer",value:function(ge){var _e=C.allocUnsafe(ge),Le=this.head,Re=1;for(Le.data.copy(_e),ge-=Le.data.length;Le=Le.next;){var ke=Le.data,xe=ge>ke.length?ke.length:ge;if(ke.copy(_e,_e.length-ge,0,xe),0==(ge-=xe)){xe===ke.length?(++Re,this.head=Le.next?Le.next:this.tail=null):(this.head=Le,Le.data=ke.slice(xe));break}++Re}return this.length-=Re,_e}},{key:P,value:function(ge,_e){return D(this,function(Le){for(var Re=1;Re<arguments.length;Re++){var ke=null!=arguments[Re]?arguments[Re]:{};Re%2?o(Object(ke),!0).forEach(function(xe){c(Le,xe,ke[xe])}):Object.getOwnPropertyDescriptors?Object.defineProperties(Le,Object.getOwnPropertyDescriptors(ke)):o(Object(ke)).forEach(function(xe){Object.defineProperty(Le,xe,Object.getOwnPropertyDescriptor(ke,xe))})}return Le}({},_e,{depth:0,customInspect:!1}))}}])&&function(j,W){for(var re=0;re<W.length;re++){var ie=W[re];ie.enumerable=ie.enumerable||!1,ie.configurable=!0,"value"in ie&&(ie.writable=!0),Object.defineProperty(j,ie.key,ie)}}(j.prototype,re),j}()},1195:(n,s,t)=>{var o=t(4155);function c(D,P){C(D,P),g(D)}function g(D){D._writableState&&!D._writableState.emitClose||D._readableState&&!D._readableState.emitClose||D.emit("close")}function C(D,P){D.emit("error",P)}n.exports={destroy:function(D,P){var j=this;return this._readableState&&this._readableState.destroyed||this._writableState&&this._writableState.destroyed?(P?P(D):D&&(this._writableState?this._writableState.errorEmitted||(this._writableState.errorEmitted=!0,o.nextTick(C,this,D)):o.nextTick(C,this,D)),this):(this._readableState&&(this._readableState.destroyed=!0),this._writableState&&(this._writableState.destroyed=!0),this._destroy(D||null,function(ie){!P&&ie?j._writableState?j._writableState.errorEmitted?o.nextTick(g,j):(j._writableState.errorEmitted=!0,o.nextTick(c,j,ie)):o.nextTick(c,j,ie):P?(o.nextTick(g,j),P(ie)):o.nextTick(g,j)}),this)},undestroy:function(){this._readableState&&(this._readableState.destroyed=!1,this._readableState.reading=!1,this._readableState.ended=!1,this._readableState.endEmitted=!1),this._writableState&&(this._writableState.destroyed=!1,this._writableState.ended=!1,this._writableState.ending=!1,this._writableState.finalCalled=!1,this._writableState.prefinished=!1,this._writableState.finished=!1,this._writableState.errorEmitted=!1)},errorOrDestroy:function(D,P){var j=D._readableState,W=D._writableState;j&&j.autoDestroy||W&&W.autoDestroy?D.destroy(P):D.emit("error",P)}}},8610:(n,s,t)=>{var o=t(4281).q.ERR_STREAM_PREMATURE_CLOSE;function c(){}n.exports=function g(C,D,P){if("function"==typeof D)return g(C,null,D);var U,pt;D||(D={}),U=P||c,pt=!1,P=function(){if(!pt){pt=!0;for(var ht=arguments.length,wt=new Array(ht),It=0;It<ht;It++)wt[It]=arguments[It];U.apply(this,wt)}};var j=D.readable||!1!==D.readable&&C.readable,W=D.writable||!1!==D.writable&&C.writable,re=function(){C.writable||ge()},ie=C._writableState&&C._writableState.finished,ge=function(){W=!1,ie=!0,j||P.call(C)},_e=C._readableState&&C._readableState.endEmitted,Le=function(){j=!1,_e=!0,W||P.call(C)},Re=function(U){P.call(C,U)},ke=function(){var U;return j&&!_e?(C._readableState&&C._readableState.ended||(U=new o),P.call(C,U)):W&&!ie?(C._writableState&&C._writableState.ended||(U=new o),P.call(C,U)):void 0},xe=function(){C.req.on("finish",ge)};return function(U){return U.setHeader&&"function"==typeof U.abort}(C)?(C.on("complete",ge),C.on("abort",ke),C.req?xe():C.on("request",xe)):W&&!C._writableState&&(C.on("end",re),C.on("close",re)),C.on("end",Le),C.on("finish",ge),!1!==D.error&&C.on("error",Re),C.on("close",ke),function(){C.removeListener("complete",ge),C.removeListener("abort",ke),C.removeListener("request",xe),C.req&&C.req.removeListener("finish",ge),C.removeListener("end",re),C.removeListener("close",re),C.removeListener("finish",ge),C.removeListener("end",Le),C.removeListener("error",Re),C.removeListener("close",ke)}}},5167:n=>{n.exports=function(){throw new Error("Readable.from is not available in the browser")}},9946:(n,s,t)=>{var o,c=t(4281).q,g=c.ERR_MISSING_ARGS,C=c.ERR_STREAM_DESTROYED;function D(ie){if(ie)throw ie}function P(ie,ge,_e,Le){var xe,U;xe=Le,U=!1,Le=function(){U||(U=!0,xe.apply(void 0,arguments))};var Re=!1;ie.on("close",function(){Re=!0}),void 0===o&&(o=t(8610)),o(ie,{readable:ge,writable:_e},function(xe){if(xe)return Le(xe);Re=!0,Le()});var ke=!1;return function(xe){if(!Re&&!ke)return ke=!0,function(U){return U.setHeader&&"function"==typeof U.abort}(ie)?ie.abort():"function"==typeof ie.destroy?ie.destroy():void Le(xe||new C("pipe"))}}function j(ie){ie()}function W(ie,ge){return ie.pipe(ge)}function re(ie){return ie.length?"function"!=typeof ie[ie.length-1]?D:ie.pop():D}n.exports=function(){for(var ie=arguments.length,ge=new Array(ie),_e=0;_e<ie;_e++)ge[_e]=arguments[_e];var Le,Re=re(ge);if(Array.isArray(ge[0])&&(ge=ge[0]),ge.length<2)throw new g("streams");var ke=ge.map(function(xe,U){var pt=U<ge.length-1;return P(xe,pt,U>0,function(ht){Le||(Le=ht),ht&&ke.forEach(j),pt||(ke.forEach(j),Re(Le))})});return ge.reduce(W)}},2457:(n,s,t)=>{var o=t(4281).q.ERR_INVALID_OPT_VALUE;n.exports={getHighWaterMark:function(c,g,C,D){var j,P=null!=(j=g).highWaterMark?j.highWaterMark:D?j[C]:null;if(null!=P){if(!isFinite(P)||Math.floor(P)!==P||P<0)throw new o(D?C:"highWaterMark",P);return Math.floor(P)}return c.objectMode?16:16384}}},2503:(n,s,t)=>{n.exports=t(7187).EventEmitter},4189:(n,s,t)=>{var o=t(396).Buffer;function c(g,C){this._block=o.alloc(g),this._finalSize=C,this._blockSize=g,this._len=0}c.prototype.update=function(g,C){"string"==typeof g&&(g=o.from(g,C=C||"utf8"));for(var D=this._block,P=this._blockSize,j=g.length,W=this._len,re=0;re<j;){for(var ie=W%P,ge=Math.min(j-re,P-ie),_e=0;_e<ge;_e++)D[ie+_e]=g[re+_e];re+=ge,(W+=ge)%P==0&&this._update(D)}return this._len+=j,this},c.prototype.digest=function(g){var C=this._len%this._blockSize;this._block[C]=128,this._block.fill(0,C+1),C>=this._finalSize&&(this._update(this._block),this._block.fill(0));var D=8*this._len;if(D<=4294967295)this._block.writeUInt32BE(D,this._blockSize-4);else{var P=(4294967295&D)>>>0;this._block.writeUInt32BE((D-P)/4294967296,this._blockSize-8),this._block.writeUInt32BE(P,this._blockSize-4)}this._update(this._block);var W=this._hash();return g?W.toString(g):W},c.prototype._update=function(){throw new Error("_update must be implemented by subclass")},n.exports=c},9072:(n,s,t)=>{var o=n.exports=function(c){c=c.toLowerCase();var g=o[c];if(!g)throw new Error(c+" is not supported (we accept pull requests)");return new g};o.sha=t(4448),o.sha1=t(8336),o.sha224=t(8432),o.sha256=t(7499),o.sha384=t(1686),o.sha512=t(7816)},4448:(n,s,t)=>{var o=t(5717),c=t(4189),g=t(396).Buffer,C=[1518500249,1859775393,-1894007588,-899497514],D=new Array(80);function P(){this.init(),this._w=D,c.call(this,64,56)}function j(re){return re<<30|re>>>2}function W(re,ie,ge,_e){return 0===re?ie&ge|~ie&_e:2===re?ie&ge|ie&_e|ge&_e:ie^ge^_e}o(P,c),P.prototype.init=function(){return this._a=1732584193,this._b=4023233417,this._c=2562383102,this._d=271733878,this._e=3285377520,this},P.prototype._update=function(re){for(var ie,ge=this._w,_e=0|this._a,Le=0|this._b,Re=0|this._c,ke=0|this._d,xe=0|this._e,U=0;U<16;++U)ge[U]=re.readInt32BE(4*U);for(;U<80;++U)ge[U]=ge[U-3]^ge[U-8]^ge[U-14]^ge[U-16];for(var pt=0;pt<80;++pt){var ht=~~(pt/20),wt=0|((ie=_e)<<5|ie>>>27)+W(ht,Le,Re,ke)+xe+ge[pt]+C[ht];xe=ke,ke=Re,Re=j(Le),Le=_e,_e=wt}this._a=_e+this._a|0,this._b=Le+this._b|0,this._c=Re+this._c|0,this._d=ke+this._d|0,this._e=xe+this._e|0},P.prototype._hash=function(){var re=g.allocUnsafe(20);return re.writeInt32BE(0|this._a,0),re.writeInt32BE(0|this._b,4),re.writeInt32BE(0|this._c,8),re.writeInt32BE(0|this._d,12),re.writeInt32BE(0|this._e,16),re},n.exports=P},8336:(n,s,t)=>{var o=t(5717),c=t(4189),g=t(396).Buffer,C=[1518500249,1859775393,-1894007588,-899497514],D=new Array(80);function P(){this.init(),this._w=D,c.call(this,64,56)}function j(ie){return ie<<5|ie>>>27}function W(ie){return ie<<30|ie>>>2}function re(ie,ge,_e,Le){return 0===ie?ge&_e|~ge&Le:2===ie?ge&_e|ge&Le|_e&Le:ge^_e^Le}o(P,c),P.prototype.init=function(){return this._a=1732584193,this._b=4023233417,this._c=2562383102,this._d=271733878,this._e=3285377520,this},P.prototype._update=function(ie){for(var ge,_e=this._w,Le=0|this._a,Re=0|this._b,ke=0|this._c,xe=0|this._d,U=0|this._e,pt=0;pt<16;++pt)_e[pt]=ie.readInt32BE(4*pt);for(;pt<80;++pt)_e[pt]=(ge=_e[pt-3]^_e[pt-8]^_e[pt-14]^_e[pt-16])<<1|ge>>>31;for(var ht=0;ht<80;++ht){var wt=~~(ht/20),It=j(Le)+re(wt,Re,ke,xe)+U+_e[ht]+C[wt]|0;U=xe,xe=ke,ke=W(Re),Re=Le,Le=It}this._a=Le+this._a|0,this._b=Re+this._b|0,this._c=ke+this._c|0,this._d=xe+this._d|0,this._e=U+this._e|0},P.prototype._hash=function(){var ie=g.allocUnsafe(20);return ie.writeInt32BE(0|this._a,0),ie.writeInt32BE(0|this._b,4),ie.writeInt32BE(0|this._c,8),ie.writeInt32BE(0|this._d,12),ie.writeInt32BE(0|this._e,16),ie},n.exports=P},8432:(n,s,t)=>{var o=t(5717),c=t(7499),g=t(4189),C=t(396).Buffer,D=new Array(64);function P(){this.init(),this._w=D,g.call(this,64,56)}o(P,c),P.prototype.init=function(){return this._a=3238371032,this._b=914150663,this._c=812702999,this._d=4144912697,this._e=4290775857,this._f=1750603025,this._g=1694076839,this._h=3204075428,this},P.prototype._hash=function(){var j=C.allocUnsafe(28);return j.writeInt32BE(this._a,0),j.writeInt32BE(this._b,4),j.writeInt32BE(this._c,8),j.writeInt32BE(this._d,12),j.writeInt32BE(this._e,16),j.writeInt32BE(this._f,20),j.writeInt32BE(this._g,24),j},n.exports=P},7499:(n,s,t)=>{var o=t(5717),c=t(4189),g=t(396).Buffer,C=[1116352408,1899447441,3049323471,3921009573,961987163,1508970993,2453635748,2870763221,3624381080,310598401,607225278,1426881987,1925078388,2162078206,2614888103,3248222580,3835390401,4022224774,264347078,604807628,770255983,1249150122,1555081692,1996064986,2554220882,2821834349,2952996808,3210313671,3336571891,3584528711,113926993,338241895,666307205,773529912,1294757372,1396182291,1695183700,1986661051,2177026350,2456956037,2730485921,2820302411,3259730800,3345764771,3516065817,3600352804,4094571909,275423344,430227734,506948616,659060556,883997877,958139571,1322822218,1537002063,1747873779,1955562222,2024104815,2227730452,2361852424,2428436474,2756734187,3204031479,3329325298],D=new Array(64);function P(){this.init(),this._w=D,c.call(this,64,56)}function j(_e,Le,Re){return Re^_e&(Le^Re)}function W(_e,Le,Re){return _e&Le|Re&(_e|Le)}function re(_e){return(_e>>>2|_e<<30)^(_e>>>13|_e<<19)^(_e>>>22|_e<<10)}function ie(_e){return(_e>>>6|_e<<26)^(_e>>>11|_e<<21)^(_e>>>25|_e<<7)}function ge(_e){return(_e>>>7|_e<<25)^(_e>>>18|_e<<14)^_e>>>3}o(P,c),P.prototype.init=function(){return this._a=1779033703,this._b=3144134277,this._c=1013904242,this._d=2773480762,this._e=1359893119,this._f=2600822924,this._g=528734635,this._h=1541459225,this},P.prototype._update=function(_e){for(var Le,Re=this._w,ke=0|this._a,xe=0|this._b,U=0|this._c,pt=0|this._d,ht=0|this._e,wt=0|this._f,It=0|this._g,dn=0|this._h,Lt=0;Lt<16;++Lt)Re[Lt]=_e.readInt32BE(4*Lt);for(;Lt<64;++Lt)Re[Lt]=0|(((Le=Re[Lt-2])>>>17|Le<<15)^(Le>>>19|Le<<13)^Le>>>10)+Re[Lt-7]+ge(Re[Lt-15])+Re[Lt-16];for(var Dn=0;Dn<64;++Dn){var Mn=dn+ie(ht)+j(ht,wt,It)+C[Dn]+Re[Dn]|0,$r=re(ke)+W(ke,xe,U)|0;dn=It,It=wt,wt=ht,ht=pt+Mn|0,pt=U,U=xe,xe=ke,ke=Mn+$r|0}this._a=ke+this._a|0,this._b=xe+this._b|0,this._c=U+this._c|0,this._d=pt+this._d|0,this._e=ht+this._e|0,this._f=wt+this._f|0,this._g=It+this._g|0,this._h=dn+this._h|0},P.prototype._hash=function(){var _e=g.allocUnsafe(32);return _e.writeInt32BE(this._a,0),_e.writeInt32BE(this._b,4),_e.writeInt32BE(this._c,8),_e.writeInt32BE(this._d,12),_e.writeInt32BE(this._e,16),_e.writeInt32BE(this._f,20),_e.writeInt32BE(this._g,24),_e.writeInt32BE(this._h,28),_e},n.exports=P},1686:(n,s,t)=>{var o=t(5717),c=t(7816),g=t(4189),C=t(396).Buffer,D=new Array(160);function P(){this.init(),this._w=D,g.call(this,128,112)}o(P,c),P.prototype.init=function(){return this._ah=3418070365,this._bh=1654270250,this._ch=2438529370,this._dh=355462360,this._eh=1731405415,this._fh=2394180231,this._gh=3675008525,this._hh=1203062813,this._al=3238371032,this._bl=914150663,this._cl=812702999,this._dl=4144912697,this._el=4290775857,this._fl=1750603025,this._gl=1694076839,this._hl=3204075428,this},P.prototype._hash=function(){var j=C.allocUnsafe(48);function W(re,ie,ge){j.writeInt32BE(re,ge),j.writeInt32BE(ie,ge+4)}return W(this._ah,this._al,0),W(this._bh,this._bl,8),W(this._ch,this._cl,16),W(this._dh,this._dl,24),W(this._eh,this._el,32),W(this._fh,this._fl,40),j},n.exports=P},7816:(n,s,t)=>{var o=t(5717),c=t(4189),g=t(396).Buffer,C=[1116352408,3609767458,1899447441,602891725,3049323471,3964484399,3921009573,2173295548,961987163,4081628472,1508970993,3053834265,2453635748,2937671579,2870763221,3664609560,3624381080,2734883394,310598401,1164996542,607225278,1323610764,1426881987,3590304994,1925078388,4068182383,2162078206,991336113,2614888103,633803317,3248222580,3479774868,3835390401,2666613458,4022224774,944711139,264347078,2341262773,604807628,2007800933,770255983,1495990901,1249150122,1856431235,1555081692,3175218132,1996064986,2198950837,2554220882,3999719339,2821834349,766784016,2952996808,2566594879,3210313671,3203337956,3336571891,1034457026,3584528711,2466948901,113926993,3758326383,338241895,168717936,666307205,1188179964,773529912,1546045734,1294757372,1522805485,1396182291,2643833823,1695183700,2343527390,1986661051,1014477480,2177026350,1206759142,2456956037,344077627,2730485921,1290863460,2820302411,3158454273,3259730800,3505952657,3345764771,106217008,3516065817,3606008344,3600352804,1432725776,4094571909,1467031594,275423344,851169720,430227734,3100823752,506948616,1363258195,659060556,3750685593,883997877,3785050280,958139571,3318307427,1322822218,3812723403,1537002063,2003034995,1747873779,3602036899,1955562222,1575990012,2024104815,1125592928,2227730452,2716904306,2361852424,442776044,2428436474,593698344,2756734187,3733110249,3204031479,2999351573,3329325298,3815920427,3391569614,3928383900,3515267271,566280711,3940187606,3454069534,4118630271,4000239992,116418474,1914138554,174292421,2731055270,289380356,3203993006,460393269,320620315,685471733,587496836,852142971,1086792851,1017036298,365543100,1126000580,2618297676,1288033470,3409855158,1501505948,4234509866,1607167915,987167468,1816402316,1246189591],D=new Array(160);function P(){this.init(),this._w=D,c.call(this,128,112)}function j(xe,U,pt){return pt^xe&(U^pt)}function W(xe,U,pt){return xe&U|pt&(xe|U)}function re(xe,U){return(xe>>>28|U<<4)^(U>>>2|xe<<30)^(U>>>7|xe<<25)}function ie(xe,U){return(xe>>>14|U<<18)^(xe>>>18|U<<14)^(U>>>9|xe<<23)}function ge(xe,U){return(xe>>>1|U<<31)^(xe>>>8|U<<24)^xe>>>7}function _e(xe,U){return(xe>>>1|U<<31)^(xe>>>8|U<<24)^(xe>>>7|U<<25)}function Le(xe,U){return(xe>>>19|U<<13)^(U>>>29|xe<<3)^xe>>>6}function Re(xe,U){return(xe>>>19|U<<13)^(U>>>29|xe<<3)^(xe>>>6|U<<26)}function ke(xe,U){return xe>>>0<U>>>0?1:0}o(P,c),P.prototype.init=function(){return this._ah=1779033703,this._bh=3144134277,this._ch=1013904242,this._dh=2773480762,this._eh=1359893119,this._fh=2600822924,this._gh=528734635,this._hh=1541459225,this._al=4089235720,this._bl=2227873595,this._cl=4271175723,this._dl=1595750129,this._el=2917565137,this._fl=725511199,this._gl=4215389547,this._hl=327033209,this},P.prototype._update=function(xe){for(var U=this._w,pt=0|this._ah,ht=0|this._bh,wt=0|this._ch,It=0|this._dh,dn=0|this._eh,Lt=0|this._fh,Dn=0|this._gh,Mn=0|this._hh,$r=0|this._al,ur=0|this._bl,Pr=0|this._cl,xr=0|this._dl,fn=0|this._el,Nn=0|this._fl,$n=0|this._gl,Qn=0|this._hl,Tn=0;Tn<32;Tn+=2)U[Tn]=xe.readInt32BE(4*Tn),U[Tn+1]=xe.readInt32BE(4*Tn+4);for(;Tn<160;Tn+=2){var Yr=U[Tn-30],ji=U[Tn-30+1],ii=ge(Yr,ji),Ui=_e(ji,Yr),Jr=Le(Yr=U[Tn-4],ji=U[Tn-4+1]),An=Re(ji,Yr),Ri=U[Tn-32],qi=U[Tn-32+1],Zo=Ui+U[Tn-14+1]|0,bo=ii+U[Tn-14]+ke(Zo,Ui)|0;bo=(bo=bo+Jr+ke(Zo=Zo+An|0,An)|0)+Ri+ke(Zo=Zo+qi|0,qi)|0,U[Tn]=bo,U[Tn+1]=Zo}for(var Ys=0;Ys<160;Ys+=2){bo=U[Ys],Zo=U[Ys+1];var Ws=W(pt,ht,wt),wi=W($r,ur,Pr),lo=re(pt,$r),go=re($r,pt),Ge=ie(dn,fn),St=ie(fn,dn),Et=C[Ys],Bn=C[Ys+1],_r=j(dn,Lt,Dn),Gr=j(fn,Nn,$n),xi=Qn+St|0,Zs=Mn+Ge+ke(xi,Qn)|0;Zs=(Zs=(Zs=Zs+_r+ke(xi=xi+Gr|0,Gr)|0)+Et+ke(xi=xi+Bn|0,Bn)|0)+bo+ke(xi=xi+Zo|0,Zo)|0;var jo=go+wi|0,sl=lo+Ws+ke(jo,go)|0;Mn=Dn,Qn=$n,Dn=Lt,$n=Nn,Lt=dn,Nn=fn,dn=It+Zs+ke(fn=xr+xi|0,xr)|0,It=wt,xr=Pr,wt=ht,Pr=ur,ht=pt,ur=$r,pt=Zs+sl+ke($r=xi+jo|0,xi)|0}this._al=this._al+$r|0,this._bl=this._bl+ur|0,this._cl=this._cl+Pr|0,this._dl=this._dl+xr|0,this._el=this._el+fn|0,this._fl=this._fl+Nn|0,this._gl=this._gl+$n|0,this._hl=this._hl+Qn|0,this._ah=this._ah+pt+ke(this._al,$r)|0,this._bh=this._bh+ht+ke(this._bl,ur)|0,this._ch=this._ch+wt+ke(this._cl,Pr)|0,this._dh=this._dh+It+ke(this._dl,xr)|0,this._eh=this._eh+dn+ke(this._el,fn)|0,this._fh=this._fh+Lt+ke(this._fl,Nn)|0,this._gh=this._gh+Dn+ke(this._gl,$n)|0,this._hh=this._hh+Mn+ke(this._hl,Qn)|0},P.prototype._hash=function(){var xe=g.allocUnsafe(64);function U(pt,ht,wt){xe.writeInt32BE(pt,wt),xe.writeInt32BE(ht,wt+4)}return U(this._ah,this._al,0),U(this._bh,this._bl,8),U(this._ch,this._cl,16),U(this._dh,this._dl,24),U(this._eh,this._el,32),U(this._fh,this._fl,40),U(this._gh,this._gl,48),U(this._hh,this._hl,56),xe},n.exports=P},2830:(n,s,t)=>{n.exports=c;var o=t(7187).EventEmitter;function c(){o.call(this)}t(5717)(c,o),c.Readable=t(9481),c.Writable=t(4229),c.Duplex=t(6753),c.Transform=t(4605),c.PassThrough=t(2725),c.finished=t(8610),c.pipeline=t(9946),c.Stream=c,c.prototype.pipe=function(g,C){var D=this;function P(Le){g.writable&&!1===g.write(Le)&&D.pause&&D.pause()}function j(){D.readable&&D.resume&&D.resume()}D.on("data",P),g.on("drain",j),g._isStdio||C&&!1===C.end||(D.on("end",re),D.on("close",ie));var W=!1;function re(){W||(W=!0,g.end())}function ie(){W||(W=!0,"function"==typeof g.destroy&&g.destroy())}function ge(Le){if(_e(),0===o.listenerCount(this,"error"))throw Le}function _e(){D.removeListener("data",P),g.removeListener("drain",j),D.removeListener("end",re),D.removeListener("close",ie),D.removeListener("error",ge),g.removeListener("error",ge),D.removeListener("end",_e),D.removeListener("close",_e),g.removeListener("close",_e)}return D.on("error",ge),g.on("error",ge),D.on("end",_e),D.on("close",_e),g.on("close",_e),g.emit("pipe",D),g}},2553:(n,s,t)=>{var o=t(396).Buffer,c=o.isEncoding||function(_e){switch((_e=""+_e)&&_e.toLowerCase()){case"hex":case"utf8":case"utf-8":case"ascii":case"binary":case"base64":case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":case"raw":return!0;default:return!1}};function g(_e){var Le;switch(this.encoding=function(Re){var ke=function(xe){if(!xe)return"utf8";for(var U;;)switch(xe){case"utf8":case"utf-8":return"utf8";case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":return"utf16le";case"latin1":case"binary":return"latin1";case"base64":case"ascii":case"hex":return xe;default:if(U)return;xe=(""+xe).toLowerCase(),U=!0}}(Re);if("string"!=typeof ke&&(o.isEncoding===c||!c(Re)))throw new Error("Unknown encoding: "+Re);return ke||Re}(_e),this.encoding){case"utf16le":this.text=P,this.end=j,Le=4;break;case"utf8":this.fillLast=D,Le=4;break;case"base64":this.text=W,this.end=re,Le=3;break;default:return this.write=ie,void(this.end=ge)}this.lastNeed=0,this.lastTotal=0,this.lastChar=o.allocUnsafe(Le)}function C(_e){return _e<=127?0:_e>>5==6?2:_e>>4==14?3:_e>>3==30?4:_e>>6==2?-1:-2}function D(_e){var Le=this.lastTotal-this.lastNeed,Re=function(ke,xe,U){if(128!=(192&xe[0]))return ke.lastNeed=0,"\ufffd";if(ke.lastNeed>1&&xe.length>1){if(128!=(192&xe[1]))return ke.lastNeed=1,"\ufffd";if(ke.lastNeed>2&&xe.length>2&&128!=(192&xe[2]))return ke.lastNeed=2,"\ufffd"}}(this,_e);return void 0!==Re?Re:this.lastNeed<=_e.length?(_e.copy(this.lastChar,Le,0,this.lastNeed),this.lastChar.toString(this.encoding,0,this.lastTotal)):(_e.copy(this.lastChar,Le,0,_e.length),void(this.lastNeed-=_e.length))}function P(_e,Le){if((_e.length-Le)%2==0){var Re=_e.toString("utf16le",Le);if(Re){var ke=Re.charCodeAt(Re.length-1);if(ke>=55296&&ke<=56319)return this.lastNeed=2,this.lastTotal=4,this.lastChar[0]=_e[_e.length-2],this.lastChar[1]=_e[_e.length-1],Re.slice(0,-1)}return Re}return this.lastNeed=1,this.lastTotal=2,this.lastChar[0]=_e[_e.length-1],_e.toString("utf16le",Le,_e.length-1)}function j(_e){var Le=_e&&_e.length?this.write(_e):"";return this.lastNeed?Le+this.lastChar.toString("utf16le",0,this.lastTotal-this.lastNeed):Le}function W(_e,Le){var Re=(_e.length-Le)%3;return 0===Re?_e.toString("base64",Le):(this.lastNeed=3-Re,this.lastTotal=3,1===Re?this.lastChar[0]=_e[_e.length-1]:(this.lastChar[0]=_e[_e.length-2],this.lastChar[1]=_e[_e.length-1]),_e.toString("base64",Le,_e.length-Re))}function re(_e){var Le=_e&&_e.length?this.write(_e):"";return this.lastNeed?Le+this.lastChar.toString("base64",0,3-this.lastNeed):Le}function ie(_e){return _e.toString(this.encoding)}function ge(_e){return _e&&_e.length?this.write(_e):""}s.s=g,g.prototype.write=function(_e){if(0===_e.length)return"";var Le,Re;if(this.lastNeed){if(void 0===(Le=this.fillLast(_e)))return"";Re=this.lastNeed,this.lastNeed=0}else Re=0;return Re<_e.length?Le?Le+this.text(_e,Re):this.text(_e,Re):Le||""},g.prototype.end=function(_e){var Le=_e&&_e.length?this.write(_e):"";return this.lastNeed?Le+"\ufffd":Le},g.prototype.text=function(_e,Le){var Re=function(xe,U,pt){var ht=U.length-1;if(ht<pt)return 0;var wt=C(U[ht]);return wt>=0?(wt>0&&(xe.lastNeed=wt-1),wt):--ht<pt||-2===wt?0:(wt=C(U[ht]))>=0?(wt>0&&(xe.lastNeed=wt-2),wt):--ht<pt||-2===wt?0:(wt=C(U[ht]))>=0?(wt>0&&(2===wt?wt=0:xe.lastNeed=wt-3),wt):0}(this,_e,Le);if(!this.lastNeed)return _e.toString("utf8",Le);this.lastTotal=Re;var ke=_e.length-(Re-this.lastNeed);return _e.copy(this.lastChar,0,ke),_e.toString("utf8",Le,ke)},g.prototype.fillLast=function(_e){if(this.lastNeed<=_e.length)return _e.copy(this.lastChar,this.lastTotal-this.lastNeed,0,this.lastNeed),this.lastChar.toString(this.encoding,0,this.lastTotal);_e.copy(this.lastChar,this.lastTotal-this.lastNeed,0,_e.length),this.lastNeed-=_e.length}},396:(n,s,t)=>{var o=t(8764),c=o.Buffer;function g(D,P){for(var j in D)P[j]=D[j]}function C(D,P,j){return c(D,P,j)}c.from&&c.alloc&&c.allocUnsafe&&c.allocUnsafeSlow?n.exports=o:(g(o,s),s.Buffer=C),C.prototype=Object.create(c.prototype),g(c,C),C.from=function(D,P,j){if("number"==typeof D)throw new TypeError("Argument must not be a number");return c(D,P,j)},C.alloc=function(D,P,j){if("number"!=typeof D)throw new TypeError("Argument must be a number");var W=c(D);return void 0!==P?"string"==typeof j?W.fill(P,j):W.fill(P):W.fill(0),W},C.allocUnsafe=function(D){if("number"!=typeof D)throw new TypeError("Argument must be a number");return c(D)},C.allocUnsafeSlow=function(D){if("number"!=typeof D)throw new TypeError("Argument must be a number");return o.SlowBuffer(D)}},4927:(n,s,t)=>{function o(c){try{if(!t.g.localStorage)return!1}catch(C){return!1}var g=t.g.localStorage[c];return null!=g&&"true"===String(g).toLowerCase()}n.exports=function(c,g){if(o("noDeprecation"))return c;var C=!1;return function(){if(!C){if(o("throwDeprecation"))throw new Error(g);o("traceDeprecation")?console.trace(g):console.warn(g),C=!0}return c.apply(this,arguments)}}},255:n=>{var s={"&":"&amp;",'"':"&quot;","'":"&apos;","<":"&lt;",">":"&gt;"};n.exports=function(t){return t&&t.replace?t.replace(/([&"<>'])/g,function(o,c){return s[c]}):t}},3479:(n,s,t)=>{var o=t(4155),c=t(255),g=t(2830).Stream;function C(P,j,W){W=W||0;var re,ie,ge=(re=j,new Array(W||0).join(re||"")),_e=P;if("object"==typeof P&&(_e=P[ie=Object.keys(P)[0]])&&_e._elem)return _e._elem.name=ie,_e._elem.icount=W,_e._elem.indent=j,_e._elem.indents=ge,_e._elem.interrupt=_e,_e._elem;var Le,Re=[],ke=[];function xe(U){Object.keys(U).forEach(function(pt){Re.push(pt+'="'+c(U[pt])+'"')})}switch(typeof _e){case"object":if(null===_e)break;_e._attr&&xe(_e._attr),_e._cdata&&ke.push(("<![CDATA["+_e._cdata).replace(/\]\]>/g,"]]]]><![CDATA[>")+"]]>"),_e.forEach&&(Le=!1,ke.push(""),_e.forEach(function(U){"object"==typeof U?"_attr"==Object.keys(U)[0]?xe(U._attr):ke.push(C(U,j,W+1)):(ke.pop(),Le=!0,ke.push(c(U)))}),Le||ke.push(""));break;default:ke.push(c(_e))}return{name:ie,interrupt:!1,attributes:Re,content:ke,icount:W,indents:ge,indent:j}}function D(P,j,W){if("object"!=typeof j)return P(!1,j);var re=j.interrupt?1:j.content.length;function ie(){for(;j.content.length;){var _e=j.content.shift();if(void 0!==_e){if(ge(_e))return;D(P,_e)}}P(!1,(re>1?j.indents:"")+(j.name?"</"+j.name+">":"")+(j.indent&&!W?"\n":"")),W&&W()}function ge(_e){return!!_e.interrupt&&(_e.interrupt.append=P,_e.interrupt.end=ie,_e.interrupt=!1,P(!0),!0)}if(P(!1,j.indents+(j.name?"<"+j.name:"")+(j.attributes.length?" "+j.attributes.join(" "):"")+(re?j.name?">":"":j.name?"/>":"")+(j.indent&&re>1?"\n":"")),!re)return P(!1,j.indent?"\n":"");ge(j)||ie()}n.exports=function(P,j){"object"!=typeof j&&(j={indent:j});var W,re,ie=j.stream?new g:null,ge="",_e=!1,Le=j.indent?!0===j.indent?"    ":j.indent:"",Re=!0;function ke(ht){Re?o.nextTick(ht):ht()}function xe(ht,wt){if(void 0!==wt&&(ge+=wt),ht&&!_e&&(ie=ie||new g,_e=!0),ht&&_e){var It=ge;ke(function(){ie.emit("data",It)}),ge=""}}function U(ht,wt){D(xe,C(ht,Le,Le?1:0),wt)}function pt(){if(ie){var ht=ge;ke(function(){ie.emit("data",ht),ie.emit("end"),ie.readable=!1,ie.emit("close")})}}return ke(function(){Re=!1}),j.declaration&&(re={version:"1.0",encoding:(W=j.declaration).encoding||"UTF-8"},W.standalone&&(re.standalone=W.standalone),U({"?xml":{_attr:re}}),ge=ge.replace("/>","?>")),P&&P.forEach?P.forEach(function(ht,wt){var It;wt+1===P.length&&(It=pt),U(ht,It)}):U(P,pt),ie?(ie.readable=!0,ie):ge},n.exports.element=n.exports.Element=function(){var P=Array.prototype.slice.call(arguments),j={_elem:C(P),push:function(W){if(!this.append)throw new Error("not assigned to a parent!");var re=this,ie=this._elem.indent;D(this.append,C(W,ie,this._elem.icount+(ie?1:0)),function(){re.append(!0)})},close:function(W){void 0!==W&&this.push(W),this.end&&this.end()}};return j}},5102:(n,s,t)=>{var o={"./all.js":5308,"./auth/actions.js":5812,"./auth/index.js":3705,"./auth/reducers.js":3962,"./auth/selectors.js":35,"./auth/spec-wrap-actions.js":8302,"./configs/actions.js":714,"./configs/helpers.js":2256,"./configs/index.js":1661,"./configs/reducers.js":7743,"./configs/selectors.js":9018,"./configs/spec-actions.js":2698,"./deep-linking/helpers.js":1970,"./deep-linking/index.js":4980,"./deep-linking/layout.js":5858,"./deep-linking/operation-tag-wrapper.jsx":4584,"./deep-linking/operation-wrapper.jsx":877,"./download-url.js":8011,"./err/actions.js":4966,"./err/error-transformers/hook.js":6808,"./err/error-transformers/transformers/not-of-type.js":2392,"./err/error-transformers/transformers/parameter-oneof.js":1835,"./err/index.js":7793,"./err/reducers.js":3527,"./err/selectors.js":7667,"./filter/index.js":9978,"./filter/opsFilter.js":4309,"./layout/actions.js":5474,"./layout/index.js":6821,"./layout/reducers.js":5672,"./layout/selectors.js":4400,"./layout/spec-extensions/wrap-selector.js":8989,"./logs/index.js":9150,"./oas3/actions.js":7002,"./oas3/auth-extensions/wrap-selectors.js":3723,"./oas3/components/callbacks.jsx":3427,"./oas3/components/http-auth.jsx":6775,"./oas3/components/index.js":6467,"./oas3/components/operation-link.jsx":5757,"./oas3/components/operation-servers.jsx":6796,"./oas3/components/request-body-editor.jsx":5327,"./oas3/components/request-body.jsx":2458,"./oas3/components/servers-container.jsx":9928,"./oas3/components/servers.jsx":6617,"./oas3/helpers.jsx":7779,"./oas3/index.js":7451,"./oas3/reducers.js":9666,"./oas3/selectors.js":5065,"./oas3/spec-extensions/selectors.js":1741,"./oas3/spec-extensions/wrap-selectors.js":2044,"./oas3/wrap-components/auth-item.jsx":356,"./oas3/wrap-components/index.js":7761,"./oas3/wrap-components/json-schema-string.jsx":287,"./oas3/wrap-components/markdown.jsx":2460,"./oas3/wrap-components/model.jsx":3499,"./oas3/wrap-components/online-validator-badge.js":58,"./oas3/wrap-components/version-stamp.jsx":9487,"./on-complete/index.js":8560,"./request-snippets/fn.js":4624,"./request-snippets/index.js":6575,"./request-snippets/request-snippets.jsx":4206,"./request-snippets/selectors.js":4669,"./safe-render/components/error-boundary.jsx":6195,"./safe-render/components/fallback.jsx":9403,"./safe-render/fn.jsx":6189,"./safe-render/index.js":8102,"./samples/fn.js":2473,"./samples/index.js":8883,"./spec/actions.js":1737,"./spec/index.js":7038,"./spec/reducers.js":32,"./spec/selectors.js":3881,"./spec/wrap-actions.js":7508,"./swagger-js/configs-wrap-actions.js":4852,"./swagger-js/index.js":2990,"./util/index.js":8525,"./view/fn.js":8347,"./view/index.js":3420,"./view/root-injects.jsx":5005,"core/plugins/all.js":5308,"core/plugins/auth/actions.js":5812,"core/plugins/auth/index.js":3705,"core/plugins/auth/reducers.js":3962,"core/plugins/auth/selectors.js":35,"core/plugins/auth/spec-wrap-actions.js":8302,"core/plugins/configs/actions.js":714,"core/plugins/configs/helpers.js":2256,"core/plugins/configs/index.js":1661,"core/plugins/configs/reducers.js":7743,"core/plugins/configs/selectors.js":9018,"core/plugins/configs/spec-actions.js":2698,"core/plugins/deep-linking/helpers.js":1970,"core/plugins/deep-linking/index.js":4980,"core/plugins/deep-linking/layout.js":5858,"core/plugins/deep-linking/operation-tag-wrapper.jsx":4584,"core/plugins/deep-linking/operation-wrapper.jsx":877,"core/plugins/download-url.js":8011,"core/plugins/err/actions.js":4966,"core/plugins/err/error-transformers/hook.js":6808,"core/plugins/err/error-transformers/transformers/not-of-type.js":2392,"core/plugins/err/error-transformers/transformers/parameter-oneof.js":1835,"core/plugins/err/index.js":7793,"core/plugins/err/reducers.js":3527,"core/plugins/err/selectors.js":7667,"core/plugins/filter/index.js":9978,"core/plugins/filter/opsFilter.js":4309,"core/plugins/layout/actions.js":5474,"core/plugins/layout/index.js":6821,"core/plugins/layout/reducers.js":5672,"core/plugins/layout/selectors.js":4400,"core/plugins/layout/spec-extensions/wrap-selector.js":8989,"core/plugins/logs/index.js":9150,"core/plugins/oas3/actions.js":7002,"core/plugins/oas3/auth-extensions/wrap-selectors.js":3723,"core/plugins/oas3/components/callbacks.jsx":3427,"core/plugins/oas3/components/http-auth.jsx":6775,"core/plugins/oas3/components/index.js":6467,"core/plugins/oas3/components/operation-link.jsx":5757,"core/plugins/oas3/components/operation-servers.jsx":6796,"core/plugins/oas3/components/request-body-editor.jsx":5327,"core/plugins/oas3/components/request-body.jsx":2458,"core/plugins/oas3/components/servers-container.jsx":9928,"core/plugins/oas3/components/servers.jsx":6617,"core/plugins/oas3/helpers.jsx":7779,"core/plugins/oas3/index.js":7451,"core/plugins/oas3/reducers.js":9666,"core/plugins/oas3/selectors.js":5065,"core/plugins/oas3/spec-extensions/selectors.js":1741,"core/plugins/oas3/spec-extensions/wrap-selectors.js":2044,"core/plugins/oas3/wrap-components/auth-item.jsx":356,"core/plugins/oas3/wrap-components/index.js":7761,"core/plugins/oas3/wrap-components/json-schema-string.jsx":287,"core/plugins/oas3/wrap-components/markdown.jsx":2460,"core/plugins/oas3/wrap-components/model.jsx":3499,"core/plugins/oas3/wrap-components/online-validator-badge.js":58,"core/plugins/oas3/wrap-components/version-stamp.jsx":9487,"core/plugins/on-complete/index.js":8560,"core/plugins/request-snippets/fn.js":4624,"core/plugins/request-snippets/index.js":6575,"core/plugins/request-snippets/request-snippets.jsx":4206,"core/plugins/request-snippets/selectors.js":4669,"core/plugins/safe-render/components/error-boundary.jsx":6195,"core/plugins/safe-render/components/fallback.jsx":9403,"core/plugins/safe-render/fn.jsx":6189,"core/plugins/safe-render/index.js":8102,"core/plugins/samples/fn.js":2473,"core/plugins/samples/index.js":8883,"core/plugins/spec/actions.js":1737,"core/plugins/spec/index.js":7038,"core/plugins/spec/reducers.js":32,"core/plugins/spec/selectors.js":3881,"core/plugins/spec/wrap-actions.js":7508,"core/plugins/swagger-js/configs-wrap-actions.js":4852,"core/plugins/swagger-js/index.js":2990,"core/plugins/util/index.js":8525,"core/plugins/view/fn.js":8347,"core/plugins/view/index.js":3420,"core/plugins/view/root-injects.jsx":5005};function c(C){var D=g(C);return t(D)}function g(C){if(!t.o(o,C)){var D=new Error("Cannot find module '"+C+"'");throw D.code="MODULE_NOT_FOUND",D}return o[C]}c.keys=function(){return Object.keys(o)},c.resolve=g,n.exports=c,c.id=5102},2517:n=>{n.exports="data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMjAwcHgiICBoZWlnaHQ9IjIwMHB4IiAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB2aWV3Qm94PSIwIDAgMTAwIDEwMCIgcHJlc2VydmVBc3BlY3RSYXRpbz0ieE1pZFlNaWQiIGNsYXNzPSJsZHMtcm9sbGluZyIgc3R5bGU9ImJhY2tncm91bmQtaW1hZ2U6IG5vbmU7IGJhY2tncm91bmQtcG9zaXRpb246IGluaXRpYWwgaW5pdGlhbDsgYmFja2dyb3VuZC1yZXBlYXQ6IGluaXRpYWwgaW5pdGlhbDsiPjxjaXJjbGUgY3g9IjUwIiBjeT0iNTAiIGZpbGw9Im5vbmUiIG5nLWF0dHItc3Ryb2tlPSJ7e2NvbmZpZy5jb2xvcn19IiBuZy1hdHRyLXN0cm9rZS13aWR0aD0ie3tjb25maWcud2lkdGh9fSIgbmctYXR0ci1yPSJ7e2NvbmZpZy5yYWRpdXN9fSIgbmctYXR0ci1zdHJva2UtZGFzaGFycmF5PSJ7e2NvbmZpZy5kYXNoYXJyYXl9fSIgc3Ryb2tlPSIjNTU1NTU1IiBzdHJva2Utd2lkdGg9IjEwIiByPSIzNSIgc3Ryb2tlLWRhc2hhcnJheT0iMTY0LjkzMzYxNDMxMzQ2NDE1IDU2Ljk3Nzg3MTQzNzgyMTM4Ij48YW5pbWF0ZVRyYW5zZm9ybSBhdHRyaWJ1dGVOYW1lPSJ0cmFuc2Zvcm0iIHR5cGU9InJvdGF0ZSIgY2FsY01vZGU9ImxpbmVhciIgdmFsdWVzPSIwIDUwIDUwOzM2MCA1MCA1MCIga2V5VGltZXM9IjA7MSIgZHVyPSIxcyIgYmVnaW49IjBzIiByZXBlYXRDb3VudD0iaW5kZWZpbml0ZSI+PC9hbmltYXRlVHJhbnNmb3JtPjwvY2lyY2xlPjwvc3ZnPgo="},5163:n=>{n.exports='---\nurl: "https://petstore.swagger.io/v2/swagger.json"\ndom_id: "#swagger-ui"\nvalidatorUrl: "https://validator.swagger.io/validator"\n'},8898:(n,s,t)=>{var c;n.exports=(t.d(c={},{default:()=>fT()}),c)},4163:(n,s,t)=>{var c;n.exports=(t.d(c={},{default:()=>Z4()}),c)},5527:(n,s,t)=>{var c;n.exports=(t.d(c={},{default:()=>G4()}),c)},5171:(n,s,t)=>{var c;n.exports=(t.d(c={},{default:()=>la()}),c)},2954:(n,s,t)=>{var c;n.exports=(t.d(c={},{default:()=>u0()}),c)},7930:(n,s,t)=>{var c;n.exports=(t.d(c={},{default:()=>z4()}),c)},6145:(n,s,t)=>{var c;n.exports=(t.d(c={},{default:()=>zp()}),c)},1778:(n,s,t)=>{var c;n.exports=(t.d(c={},{default:()=>dA()}),c)},29:(n,s,t)=>{var c;n.exports=(t.d(c={},{default:()=>J4()}),c)},2372:(n,s,t)=>{var c;n.exports=(t.d(c={},{default:()=>dm()}),c)},8818:(n,s,t)=>{var c;n.exports=(t.d(c={},{default:()=>X4()}),c)},5487:(n,s,t)=>{var c;n.exports=(t.d(c={},{default:()=>q4()}),c)},2565:(n,s,t)=>{var c;n.exports=(t.d(c={},{default:()=>Lu()}),c)},6785:(n,s,t)=>{var c;n.exports=(t.d(c={},{default:()=>t5()}),c)},8136:(n,s,t)=>{var c;n.exports=(t.d(c={},{default:()=>x_()}),c)},9963:(n,s,t)=>{var c;n.exports=(t.d(c={},{default:()=>r5()}),c)},4350:(n,s,t)=>{var c;n.exports=(t.d(c={},{default:()=>o5()}),c)},3590:(n,s,t)=>{var c;n.exports=(t.d(c={},{default:()=>JN()}),c)},5942:(n,s,t)=>{var c;n.exports=(t.d(c={},{default:()=>a5()}),c)},313:(n,s,t)=>{var c;n.exports=(t.d(c={},{default:()=>c0()}),c)},6914:(n,s,t)=>{var c;n.exports=(t.d(c={},{default:()=>u5()}),c)},7512:(n,s,t)=>{var c;n.exports=(t.d(c={},{default:()=>D_()}),c)},2740:(n,s,t)=>{var c;n.exports=(t.d(c={},{default:()=>Su()}),c)},374:(n,s,t)=>{var c;n.exports=(t.d(c={},{default:()=>d5()}),c)},6235:(n,s,t)=>{var c;n.exports=(t.d(c={},{default:()=>p5()}),c)},3769:(n,s,t)=>{var c;n.exports=(t.d(c={},{default:()=>_5()}),c)},6340:(n,s,t)=>{var c;n.exports=(t.d(c={},{default:()=>F6}),c)},7344:(n,s,t)=>{var c;n.exports=(t.d(c={},{default:()=>t1}),c)},8656:(n,s,t)=>{var c;n.exports=(t.d(c={},{default:()=>JT}),c)},3248:(n,s,t)=>{var c;n.exports=(t.d(c={},{default:()=>cm}),c)},5416:(n,s,t)=>{var c;n.exports=(t.d(c={},{default:()=>m5}),c)},775:(n,s,t)=>{var c;n.exports=(t.d(c={},{default:()=>S0}),c)},863:(n,s,t)=>{var c;n.exports=(t.d(c={},{default:()=>z3}),c)},9972:(n,s,t)=>{var c;n.exports=(t.d(c={},{default:()=>v5}),c)},1013:(n,s,t)=>{var c;n.exports=(t.d(c={},{default:()=>_d}),c)},302:(n,s,t)=>{var c;n.exports=(t.d(c={},{default:()=>r6}),c)},9334:(n,s,t)=>{var c;n.exports=(t.d(c={},{default:()=>A_}),c)},2691:(n,s,t)=>{var c;n.exports=(t.d(c={},{default:()=>gm}),c)},1581:(n,s,t)=>{var c;n.exports=(t.d(c={},{default:()=>vc}),c)},4780:n=>{n.exports=b5},8096:(n,s,t)=>{var c;n.exports=(t.d(c={},{default:()=>T5()}),c)},3294:n=>{n.exports=C5},9725:(n,s,t)=>{var c;n.exports=(t.d(c={},{List:()=>ag.List,Map:()=>ag.Map,OrderedMap:()=>ag.OrderedMap,Seq:()=>ag.Seq,Set:()=>ag.Set,default:()=>zE(),fromJS:()=>ag.fromJS}),c)},626:(n,s,t)=>{var c;n.exports=(t.d(c={},{JSON_SCHEMA:()=>t3,default:()=>tA}),c)},9908:(n,s,t)=>{var c;n.exports=(t.d(c={},{default:()=>mb()}),c)},7068:(n,s,t)=>{var c;n.exports=(t.d(c={},{default:()=>A5()}),c)},5476:(n,s,t)=>{var c;n.exports=(t.d(c={},{default:()=>w5()}),c)},5053:(n,s,t)=>{var c;n.exports=(t.d(c={},{default:()=>D5()}),c)},810:(n,s,t)=>{var c;n.exports=(t.d(c={},{Component:()=>Bl.Component,PureComponent:()=>Bl.PureComponent,default:()=>Bl,useEffect:()=>Bl.useEffect,useRef:()=>Bl.useRef,useState:()=>Bl.useState}),c)},9874:(n,s,t)=>{var c;n.exports=(t.d(c={},{CopyToClipboard:()=>R5.CopyToClipboard}),c)},9569:(n,s,t)=>{var c;n.exports=(t.d(c={},{default:()=>P5()}),c)},9871:(n,s,t)=>{var c;n.exports=(t.d(c={},{applyMiddleware:()=>U5,bindActionCreators:()=>H5,compose:()=>j6,createStore:()=>Y6}),c)},3952:(n,s,t)=>{var c;n.exports=(t.d(c={},{Remarkable:()=>a1}),c)},8639:(n,s,t)=>{var c;n.exports=(t.d(c={},{createSelector:()=>uP}),c)},8518:(n,s,t)=>{var c;n.exports=(t.d(c={},{serializeError:()=>DF.serializeError}),c)},5013:(n,s,t)=>{var c;n.exports=(t.d(c={},{opId:()=>L3}),c)},8900:(n,s,t)=>{var c;n.exports=(t.d(c={},{default:()=>NF()}),c)},2361:()=>{},4616:()=>{}},cP={};function wo(n){var s=cP[n];if(void 0!==s)return s.exports;var t=cP[n]={exports:{}};return QF[n](t,t.exports,wo),t.exports}wo.n=n=>{var s=n&&n.__esModule?()=>n.default:()=>n;return wo.d(s,{a:s}),s},wo.d=(n,s)=>{for(var t in s)wo.o(s,t)&&!wo.o(n,t)&&Object.defineProperty(n,t,{enumerable:!0,get:s[t]})},wo.g=function(){if("object"==typeof globalThis)return globalThis;try{return this||new Function("return this")()}catch(n){if("object"==typeof window)return window}}(),wo.o=(n,s)=>Object.prototype.hasOwnProperty.call(n,s),wo.r=n=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(n,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(n,"__esModule",{value:!0})};var dP={};(()=>{wo.d(dP,{Z:()=>l9});var n={};wo.r(n),wo.d(n,{Button:()=>bP,Col:()=>m7,Collapse:()=>CP,Container:()=>g7,Input:()=>b7,Link:()=>TP,Row:()=>v7,Select:()=>EP,TextArea:()=>y7});var s={};wo.r(s),wo.d(s,{JsonSchemaArrayItemFile:()=>uR,JsonSchemaArrayItemText:()=>lR,JsonSchemaForm:()=>DP,JsonSchema_array:()=>NP,JsonSchema_boolean:()=>PP,JsonSchema_object:()=>IP,JsonSchema_string:()=>RP});var t=wo(1581),o=wo(5171);const c=(wo.d(Kt={},{default:()=>IF()}),Kt);var Kt,g=wo(6145),C=wo(2740),D=wo(313),P=wo(7698),j=wo.n(P),W=wo(775),re=wo(7344),ie=wo(8656),ge=wo(5527),_e=wo(7512),Le=wo(8136),Re=wo(4163),ke=wo(6785),xe=wo(2565),U=wo(810),pt=wo(9871),ht=wo(9725);const wt=(bn=>{var Kt={};return wo.d(Kt,bn),Kt})({combineReducers:()=>LF.U});var It=wo(8518);const dn=(bn=>{var Kt={};return wo.d(Kt,bn),Kt})({default:()=>kF()});var Lt=wo(4966),Dn=wo(7504),Mn=wo(6298),$r=function(bn){return bn},ur=function(){function bn(){var Kt,ft=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};(0,re.default)(this,bn),j()(this,{state:{},plugins:[],pluginsOptions:{},system:{configs:{},fn:{},components:{},rootInjects:{},statePlugins:{}},boundSystem:{},toolbox:{}},ft),this.getSystem=(0,ge.default)(Kt=this._getSystem).call(Kt,this),this.store=$n($r,(0,ht.fromJS)(this.state),this.getSystem),this.buildSystem(!1),this.register(this.plugins)}return(0,ie.default)(bn,[{key:"getStore",value:function(){return this.store}},{key:"register",value:function(Kt){var ft=!(arguments.length>1&&void 0!==arguments[1])||arguments[1],Je=Pr(Kt,this.getSystem(),this.pluginsOptions);fn(this.system,Je),ft&&this.buildSystem();var Qe=xr.call(this.system,Kt,this.getSystem());Qe&&this.buildSystem()}},{key:"buildSystem",value:function(){var Kt=!(arguments.length>0&&void 0!==arguments[0])||arguments[0],ft=this.getStore().dispatch,Je=this.getStore().getState;this.boundSystem=(0,_e.default)({},this.getRootInjects(),this.getWrappedAndBoundActions(ft),this.getWrappedAndBoundSelectors(Je,this.getSystem),this.getStateThunks(Je),this.getFn(),this.getConfigs()),Kt&&this.rebuildReducer()}},{key:"_getSystem",value:function(){return this.boundSystem}},{key:"getRootInjects",value:function(){var Kt,ft,Je;return(0,_e.default)({getSystem:this.getSystem,getStore:(0,ge.default)(Kt=this.getStore).call(Kt,this),getComponents:(0,ge.default)(ft=this.getComponents).call(ft,this),getState:this.getStore().getState,getConfigs:(0,ge.default)(Je=this._getConfigs).call(Je,this),Im:ht.default,React:U.default},this.system.rootInjects||{})}},{key:"_getConfigs",value:function(){return this.system.configs}},{key:"getConfigs",value:function(){return{configs:this.system.configs}}},{key:"setConfigs",value:function(Kt){this.system.configs=Kt}},{key:"rebuildReducer",value:function(){var Kt,ft,Je;this.store.replaceReducer((Kt=(0,Mn.Ay)(this.system.statePlugins,function(et){return et.reducers}),Je=(0,ke.default)(ft=(0,C.default)(Kt)).call(ft,function(et,At){return et[At]=(Ot=Kt[At],function(){var Vt=arguments.length>0&&void 0!==arguments[0]?arguments[0]:new ht.Map,Sn=arguments.length>1?arguments[1]:void 0;if(!Ot)return Vt;var jn=Ot[Sn.type];if(jn){var Fn=Nn(jn)(Vt,Sn);return null===Fn?Vt:Fn}return Vt}),et;var Ot},{}),(0,C.default)(Je).length?(0,wt.combineReducers)(Je):$r))}},{key:"getType",value:function(Kt){var ft=Kt[0].toUpperCase()+(0,Le.default)(Kt).call(Kt,1);return(0,Mn.Q2)(this.system.statePlugins,function(Je,Qe){var et=Je[Kt];if(et)return(0,W.default)({},Qe+ft,et)})}},{key:"getSelectors",value:function(){return this.getType("selectors")}},{key:"getActions",value:function(){var Kt=this.getType("actions");return(0,Mn.Ay)(Kt,function(ft){return(0,Mn.Q2)(ft,function(Je,Qe){if((0,Mn.LQ)(Je))return(0,W.default)({},Qe,Je)})})}},{key:"getWrappedAndBoundActions",value:function(Kt){var ft=this,Je=this.getBoundActions(Kt);return(0,Mn.Ay)(Je,function(Qe,et){var At=ft.system.statePlugins[(0,Le.default)(et).call(et,0,-7)].wrapActions;return At?(0,Mn.Ay)(Qe,function(Ot,Vt){var Sn=At[Vt];return Sn?((0,Re.default)(Sn)||(Sn=[Sn]),(0,ke.default)(Sn).call(Sn,function(jn,Fn){var tr=function(){return Fn(jn,ft.getSystem()).apply(void 0,arguments)};if(!(0,Mn.LQ)(tr))throw new TypeError("wrapActions needs to return a function that returns a new function (ie the wrapped action)");return Nn(tr)},Ot||Function.prototype)):Ot}):Qe})}},{key:"getWrappedAndBoundSelectors",value:function(Kt,ft){var Je=this,Qe=this.getBoundSelectors(Kt,ft);return(0,Mn.Ay)(Qe,function(et,At){var Ot=[(0,Le.default)(At).call(At,0,-9)],Vt=Je.system.statePlugins[Ot].wrapSelectors;return Vt?(0,Mn.Ay)(et,function(Sn,jn){var Fn=Vt[jn];return Fn?((0,Re.default)(Fn)||(Fn=[Fn]),(0,ke.default)(Fn).call(Fn,function(tr,pi){var ui=function(){for(var Mi,Di=arguments.length,uo=new Array(Di),Ki=0;Ki<Di;Ki++)uo[Ki]=arguments[Ki];return pi(tr,Je.getSystem()).apply(void 0,(0,o.default)(Mi=[Kt().getIn(Ot)]).call(Mi,uo))};if(!(0,Mn.LQ)(ui))throw new TypeError("wrapSelector needs to return a function that returns a new function (ie the wrapped action)");return ui},Sn||Function.prototype)):Sn}):et})}},{key:"getStates",value:function(Kt){var ft;return(0,ke.default)(ft=(0,C.default)(this.system.statePlugins)).call(ft,function(Je,Qe){return Je[Qe]=Kt.get(Qe),Je},{})}},{key:"getStateThunks",value:function(Kt){var ft;return(0,ke.default)(ft=(0,C.default)(this.system.statePlugins)).call(ft,function(Je,Qe){return Je[Qe]=function(){return Kt().get(Qe)},Je},{})}},{key:"getFn",value:function(){return{fn:this.system.fn}}},{key:"getComponents",value:function(Kt){var ft=this,Je=this.system.components[Kt];return(0,Re.default)(Je)?(0,ke.default)(Je).call(Je,function(Qe,et){return et(Qe,ft.getSystem())}):void 0!==Kt?this.system.components[Kt]:this.system.components}},{key:"getBoundSelectors",value:function(Kt,ft){return(0,Mn.Ay)(this.getSelectors(),function(Je,Qe){var et=[(0,Le.default)(Qe).call(Qe,0,-9)],At=function(){return Kt().getIn(et)};return(0,Mn.Ay)(Je,function(Ot){return function(){for(var Vt,Sn=arguments.length,jn=new Array(Sn),Fn=0;Fn<Sn;Fn++)jn[Fn]=arguments[Fn];var tr=Nn(Ot).apply(null,(0,o.default)(Vt=[At()]).call(Vt,jn));return"function"==typeof tr&&(tr=Nn(tr)(ft())),tr}})})}},{key:"getBoundActions",value:function(Kt){Kt=Kt||this.getStore().dispatch;var ft=this.getActions(),Je=function Qe(et){return"function"!=typeof et?(0,Mn.Ay)(et,function(At){return Qe(At)}):function(){var At=null;try{At=et.apply(void 0,arguments)}catch(Ot){At={type:Lt.NEW_THROWN_ERR,error:!0,payload:(0,It.serializeError)(Ot)}}finally{return At}}};return(0,Mn.Ay)(ft,function(Qe){return(0,pt.bindActionCreators)(Je(Qe),Kt)})}},{key:"getMapStateToProps",value:function(){var Kt=this;return function(){return(0,_e.default)({},Kt.getSystem())}}},{key:"getMapDispatchToProps",value:function(Kt){var ft=this;return function(Je){return j()({},ft.getWrappedAndBoundActions(Je),ft.getFn(),Kt)}}}]),bn}();function Pr(bn,Kt,ft){if((0,Mn.Kn)(bn)&&!(0,Mn.kJ)(bn))return(0,dn.default)({},bn);if((0,Mn.Wl)(bn))return Pr(bn(Kt),Kt,ft);if((0,Mn.kJ)(bn)){var Je,Qe="chain"===ft.pluginLoadType?Kt.getComponents():{};return(0,ke.default)(Je=(0,xe.default)(bn).call(bn,function(et){return Pr(et,Kt,ft)})).call(Je,fn,Qe)}return{}}function xr(bn,Kt){var ft=this,Je=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{},Qe=Je.hasLoaded,et=Qe;return(0,Mn.Kn)(bn)&&!(0,Mn.kJ)(bn)&&"function"==typeof bn.afterLoad&&(et=!0,Nn(bn.afterLoad).call(this,Kt)),(0,Mn.Wl)(bn)?xr.call(this,bn(Kt),Kt,{hasLoaded:et}):(0,Mn.kJ)(bn)?(0,xe.default)(bn).call(bn,function(At){return xr.call(ft,At,Kt,{hasLoaded:et})}):et}function fn(){var bn=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},Kt=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};if(!(0,Mn.Kn)(bn))return{};if(!(0,Mn.Kn)(Kt))return bn;Kt.wrapComponents&&((0,Mn.Ay)(Kt.wrapComponents,function(pi,ui){var Mi=bn.components&&bn.components[ui];Mi&&(0,Re.default)(Mi)?(bn.components[ui]=(0,o.default)(Mi).call(Mi,[pi]),delete Kt.wrapComponents[ui]):Mi&&(bn.components[ui]=[Mi,pi],delete Kt.wrapComponents[ui])}),(0,C.default)(Kt.wrapComponents).length||delete Kt.wrapComponents);var ft=bn.statePlugins;if((0,Mn.Kn)(ft))for(var Je in ft){var Qe=ft[Je];if((0,Mn.Kn)(Qe)){var et=Qe.wrapActions,At=Qe.wrapSelectors;if((0,Mn.Kn)(et))for(var Ot in et){var Vt,Sn=et[Ot];(0,Re.default)(Sn)||(et[Ot]=Sn=[Sn]),Kt&&Kt.statePlugins&&Kt.statePlugins[Je]&&Kt.statePlugins[Je].wrapActions&&Kt.statePlugins[Je].wrapActions[Ot]&&(Kt.statePlugins[Je].wrapActions[Ot]=(0,o.default)(Vt=et[Ot]).call(Vt,Kt.statePlugins[Je].wrapActions[Ot]))}if((0,Mn.Kn)(At))for(var jn in At){var Fn,tr=At[jn];(0,Re.default)(tr)||(At[jn]=tr=[tr]),Kt&&Kt.statePlugins&&Kt.statePlugins[Je]&&Kt.statePlugins[Je].wrapSelectors&&Kt.statePlugins[Je].wrapSelectors[jn]&&(Kt.statePlugins[Je].wrapSelectors[jn]=(0,o.default)(Fn=At[jn]).call(Fn,Kt.statePlugins[Je].wrapSelectors[jn]))}}}return j()(bn,Kt)}function Nn(bn){var Kt=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},ft=Kt.logErrors,Je=void 0===ft||ft;return"function"!=typeof bn?bn:function(){try{for(var Qe,et=arguments.length,At=new Array(et),Ot=0;Ot<et;Ot++)At[Ot]=arguments[Ot];return bn.call.apply(bn,(0,o.default)(Qe=[this]).call(Qe,At))}catch(Vt){return Je&&console.error(Vt),null}}}function $n(bn,Kt,ft){var Qe,et,Ot;return Qe=bn,et=Kt,Ot=[(0,Mn._5)(ft)],(0,pt.createStore)(Qe,et,(Dn.Z.__REDUX_DEVTOOLS_EXTENSION_COMPOSE__||pt.compose)(pt.applyMiddleware.apply(void 0,Ot)))}var Qn=wo(7793),Tn=wo(6821),Yr=wo(7038),ji=wo(3420),ii=wo(8883),Ui=wo(6575),Jr=wo(9150),An=wo(2990),hn=wo(3705),qr=wo(8525),Ri=wo(8011),qi=wo(1661),Zo=wo(4980),bo=wo(9978),Ys=wo(8560),Ws=wo(8102),wi=wo(6340),lo=wo(9972),go=wo(5416),Ge=wo(8818),St=(wo(5053),wo(9569),wo(5013)),Et=function(bn){(0,lo.default)(ft,bn);var Kt=(0,go.default)(ft);function ft(Je,Qe){var et;(0,re.default)(this,ft),et=Kt.call(this,Je,Qe),(0,W.default)((0,wi.default)(et),"toggleShown",function(){var Ot=et.props,Vt=Ot.layoutActions,Sn=Ot.tag,jn=Ot.operationId,Fn=Ot.isShown,tr=et.getResolvedSubtree();Fn||void 0!==tr||et.requestResolvedSubtree(),Vt.show(["operations",Sn,jn],!Fn)}),(0,W.default)((0,wi.default)(et),"onCancelClick",function(){et.setState({tryItOutEnabled:!et.state.tryItOutEnabled})}),(0,W.default)((0,wi.default)(et),"onTryoutClick",function(){et.setState({tryItOutEnabled:!et.state.tryItOutEnabled})}),(0,W.default)((0,wi.default)(et),"onExecute",function(){et.setState({executeInProgress:!0})}),(0,W.default)((0,wi.default)(et),"getResolvedSubtree",function(){var Ot=et.props,Sn=Ot.path,jn=Ot.method,Fn=Ot.specPath;return Ot.specSelectors.specResolvedSubtree(Fn?Fn.toJS():["paths",Sn,jn])}),(0,W.default)((0,wi.default)(et),"requestResolvedSubtree",function(){var Ot=et.props,Sn=Ot.path,jn=Ot.method,Fn=Ot.specPath;return Ot.specActions.requestResolvedSubtree(Fn?Fn.toJS():["paths",Sn,jn])});var At=Je.getConfigs().tryItOutEnabled;return et.state={tryItOutEnabled:!0===At||"true"===At,executeInProgress:!1},et}return(0,ie.default)(ft,[{key:"mapStateToProps",value:function(Je,Qe){var et,At=Qe.op,Ot=Qe.layoutSelectors,Vt=(0,Qe.getConfigs)(),Sn=Vt.docExpansion,jn=Vt.deepLinking,Fn=Vt.displayOperationId,tr=Vt.displayRequestDuration,pi=Vt.supportedSubmitMethods,ui=Ot.showSummary(),Mi=At.getIn(["operation","__originalOperationId"])||At.getIn(["operation","operationId"])||(0,St.opId)(At.get("operation"),Qe.path,Qe.method)||At.get("id"),Di=["operations",Qe.tag,Mi],uo=jn&&"false"!==jn,Ki=(0,Ge.default)(pi).call(pi,Qe.method)>=0&&(void 0===Qe.allowTryItOut?Qe.specSelectors.allowTryItOutFor(Qe.path,Qe.method):Qe.allowTryItOut),to=At.getIn(["operation","security"])||Qe.specSelectors.security();return{operationId:Mi,isDeepLinkingEnabled:uo,showSummary:ui,displayOperationId:Fn,displayRequestDuration:tr,allowTryItOut:Ki,security:to,isAuthorized:Qe.authSelectors.isAuthorized(to),isShown:Ot.isShown(Di,"full"===Sn),jumpToKey:(0,o.default)(et="paths.".concat(Qe.path,".")).call(et,Qe.method),response:Qe.specSelectors.responseFor(Qe.path,Qe.method),request:Qe.specSelectors.requestFor(Qe.path,Qe.method)}}},{key:"componentDidMount",value:function(){var Je=this.props.isShown,Qe=this.getResolvedSubtree();Je&&void 0===Qe&&this.requestResolvedSubtree()}},{key:"UNSAFE_componentWillReceiveProps",value:function(Je){var Qe=Je.response,et=Je.isShown,At=this.getResolvedSubtree();Qe!==this.props.response&&this.setState({executeInProgress:!1}),et&&void 0===At&&this.requestResolvedSubtree()}},{key:"render",value:function(){var Je=this.props,Qe=Je.op,et=Je.tag,At=Je.path,Ot=Je.method,Vt=Je.security,Sn=Je.isAuthorized,jn=Je.operationId,Fn=Je.showSummary,tr=Je.isShown,pi=Je.jumpToKey,ui=Je.allowTryItOut,Mi=Je.response,Di=Je.request,uo=Je.displayOperationId,Ki=Je.displayRequestDuration,to=Je.isDeepLinkingEnabled,ys=Je.specPath,Ls=Je.specSelectors,ta=Je.specActions,Ds=Je.getComponent,Rs=Je.getConfigs,Fs=Je.layoutSelectors,Cs=Je.layoutActions,Fa=Je.authActions,js=Je.authSelectors,Ca=Je.oas3Actions,Ko=Je.oas3Selectors,na=Je.fn,vl=Ds("operation"),ud=this.getResolvedSubtree()||(0,ht.Map)(),af=(0,ht.fromJS)({op:ud,tag:et,path:At,summary:Qe.getIn(["operation","summary"])||"",deprecated:ud.get("deprecated")||Qe.getIn(["operation","deprecated"])||!1,method:Ot,security:Vt,isAuthorized:Sn,operationId:jn,originalOperationId:ud.getIn(["operation","__originalOperationId"]),showSummary:Fn,isShown:tr,jumpToKey:pi,allowTryItOut:ui,request:Di,displayOperationId:uo,displayRequestDuration:Ki,isDeepLinkingEnabled:to,executeInProgress:this.state.executeInProgress,tryItOutEnabled:this.state.tryItOutEnabled});return U.default.createElement(vl,{operation:af,response:Mi,request:Di,isShown:tr,toggleShown:this.toggleShown,onTryoutClick:this.onTryoutClick,onCancelClick:this.onCancelClick,onExecute:this.onExecute,specPath:ys,specActions:ta,specSelectors:Ls,oas3Actions:Ca,oas3Selectors:Ko,layoutActions:Cs,layoutSelectors:Fs,authActions:Fa,authSelectors:js,getComponent:Ds,getConfigs:Rs,fn:na})}}]),ft}(U.PureComponent);(0,W.default)(Et,"defaultProps",{showSummary:!0,response:null,allowTryItOut:!0,displayOperationId:!1,displayRequestDuration:!1});var Bn=function(bn){(0,lo.default)(ft,bn);var Kt=(0,go.default)(ft);function ft(){return(0,re.default)(this,ft),Kt.apply(this,arguments)}return(0,ie.default)(ft,[{key:"getLayout",value:function(){var Je=this.props,Qe=Je.getComponent,et=Je.layoutSelectors.current();return Qe(et,!0)||function(){return U.default.createElement("h1",null,' No layout defined for "',et,'" ')}}},{key:"render",value:function(){var Je=this.getLayout();return U.default.createElement(Je,null)}}]),ft}(U.default.Component);Bn.defaultProps={};var _r=function(bn){(0,lo.default)(ft,bn);var Kt=(0,go.default)(ft);function ft(){var Je,Qe;(0,re.default)(this,ft);for(var et=arguments.length,At=new Array(et),Ot=0;Ot<et;Ot++)At[Ot]=arguments[Ot];return Qe=Kt.call.apply(Kt,(0,o.default)(Je=[this]).call(Je,At)),(0,W.default)((0,wi.default)(Qe),"close",function(){Qe.props.authActions.showDefinitions(!1)}),Qe}return(0,ie.default)(ft,[{key:"render",value:function(){var Je,Qe=this.props,et=Qe.authSelectors,At=Qe.authActions,Ot=Qe.getComponent,Vt=Qe.errSelectors,Sn=Qe.specSelectors,jn=Qe.fn.AST,Fn=void 0===jn?{}:jn,tr=et.shownDefinitions(),pi=Ot("auths");return U.default.createElement("div",{className:"dialog-ux"},U.default.createElement("div",{className:"backdrop-ux"}),U.default.createElement("div",{className:"modal-ux"},U.default.createElement("div",{className:"modal-dialog-ux"},U.default.createElement("div",{className:"modal-ux-inner"},U.default.createElement("div",{className:"modal-ux-header"},U.default.createElement("h3",null,"Available authorizations"),U.default.createElement("button",{type:"button",className:"close-modal",onClick:this.close},U.default.createElement("svg",{width:"20",height:"20"},U.default.createElement("use",{href:"#close",xlinkHref:"#close"})))),U.default.createElement("div",{className:"modal-ux-content"},(0,xe.default)(Je=tr.valueSeq()).call(Je,function(ui,Mi){return U.default.createElement(pi,{key:Mi,AST:Fn,definitions:ui,getComponent:Ot,errSelectors:Vt,authSelectors:et,authActions:At,specSelectors:Sn})}))))))}}]),ft}(U.default.Component),Gr=function(bn){(0,lo.default)(ft,bn);var Kt=(0,go.default)(ft);function ft(){return(0,re.default)(this,ft),Kt.apply(this,arguments)}return(0,ie.default)(ft,[{key:"render",value:function(){var Je=this.props,Qe=Je.isAuthorized,et=Je.showPopup,At=Je.onClick,Ot=(0,Je.getComponent)("authorizationPopup",!0);return U.default.createElement("div",{className:"auth-wrapper"},U.default.createElement("button",{className:Qe?"btn authorize locked":"btn authorize unlocked",onClick:At},U.default.createElement("span",null,"Authorize"),U.default.createElement("svg",{width:"20",height:"20"},U.default.createElement("use",{href:Qe?"#locked":"#unlocked",xlinkHref:Qe?"#locked":"#unlocked"}))),et&&U.default.createElement(Ot,null))}}]),ft}(U.default.Component),xi=function(bn){(0,lo.default)(ft,bn);var Kt=(0,go.default)(ft);function ft(){return(0,re.default)(this,ft),Kt.apply(this,arguments)}return(0,ie.default)(ft,[{key:"render",value:function(){var Je=this.props,Qe=Je.authActions,et=Je.authSelectors,Ot=Je.getComponent,Vt=Je.specSelectors.securityDefinitions(),Sn=et.definitionsToAuthorize(),jn=Ot("authorizeBtn");return Vt?U.default.createElement(jn,{onClick:function(){return Qe.showDefinitions(Sn)},isAuthorized:!!et.authorized().size,showPopup:!!et.shownDefinitions(),getComponent:Ot}):null}}]),ft}(U.default.Component),Zs=function(bn){(0,lo.default)(ft,bn);var Kt=(0,go.default)(ft);function ft(){var Je,Qe;(0,re.default)(this,ft);for(var et=arguments.length,At=new Array(et),Ot=0;Ot<et;Ot++)At[Ot]=arguments[Ot];return Qe=Kt.call.apply(Kt,(0,o.default)(Je=[this]).call(Je,At)),(0,W.default)((0,wi.default)(Qe),"onClick",function(Vt){Vt.stopPropagation();var Sn=Qe.props.onClick;Sn&&Sn()}),Qe}return(0,ie.default)(ft,[{key:"render",value:function(){var Je=this.props.isAuthorized;return U.default.createElement("button",{className:Je?"authorization__btn locked":"authorization__btn unlocked","aria-label":Je?"authorization button locked":"authorization button unlocked",onClick:this.onClick},U.default.createElement("svg",{width:"20",height:"20"},U.default.createElement("use",{href:Je?"#locked":"#unlocked",xlinkHref:Je?"#locked":"#unlocked"})))}}]),ft}(U.default.Component),jo=function(bn){(0,lo.default)(ft,bn);var Kt=(0,go.default)(ft);function ft(Je,Qe){var et;return(0,re.default)(this,ft),et=Kt.call(this,Je,Qe),(0,W.default)((0,wi.default)(et),"onAuthChange",function(At){et.setState((0,W.default)({},At.name,At))}),(0,W.default)((0,wi.default)(et),"submitAuth",function(At){At.preventDefault(),et.props.authActions.authorizeWithPersistOption(et.state)}),(0,W.default)((0,wi.default)(et),"logoutClick",function(At){At.preventDefault();var Ot=et.props,Vt=Ot.authActions,Sn=Ot.definitions,jn=(0,xe.default)(Sn).call(Sn,function(Fn,tr){return tr}).toArray();et.setState((0,ke.default)(jn).call(jn,function(Fn,tr){return Fn[tr]="",Fn},{})),Vt.logoutWithPersistOption(jn)}),(0,W.default)((0,wi.default)(et),"close",function(At){At.preventDefault(),et.props.authActions.showDefinitions(!1)}),et.state={},et}return(0,ie.default)(ft,[{key:"render",value:function(){var Je,Qe=this,et=this.props,At=et.definitions,Ot=et.getComponent,Vt=et.authSelectors,Sn=et.errSelectors,jn=Ot("AuthItem"),Fn=Ot("oauth2",!0),tr=Ot("Button"),pi=Vt.authorized(),ui=(0,g.default)(At).call(At,function(uo,Ki){return!!pi.get(Ki)}),Mi=(0,g.default)(At).call(At,function(uo){return"oauth2"!==uo.get("type")}),Di=(0,g.default)(At).call(At,function(uo){return"oauth2"===uo.get("type")});return U.default.createElement("div",{className:"auth-container"},!!Mi.size&&U.default.createElement("form",{onSubmit:this.submitAuth},(0,xe.default)(Mi).call(Mi,function(uo,Ki){return U.default.createElement(jn,{key:Ki,schema:uo,name:Ki,getComponent:Ot,onAuthChange:Qe.onAuthChange,authorized:pi,errSelectors:Sn})}).toArray(),U.default.createElement("div",{className:"auth-btn-wrapper"},Mi.size===ui.size?U.default.createElement(tr,{className:"btn modal-btn auth",onClick:this.logoutClick},"Logout"):U.default.createElement(tr,{type:"submit",className:"btn modal-btn auth authorize"},"Authorize"),U.default.createElement(tr,{className:"btn modal-btn auth btn-done",onClick:this.close},"Close"))),Di&&Di.size?U.default.createElement("div",null,U.default.createElement("div",{className:"scope-def"},U.default.createElement("p",null,"Scopes are used to grant an application different levels of access to data on behalf of the end user. Each API may declare one or more scopes."),U.default.createElement("p",null,"API requires the following scopes. Select which ones you want to grant to Swagger UI.")),(0,xe.default)(Je=(0,g.default)(At).call(At,function(uo){return"oauth2"===uo.get("type")})).call(Je,function(uo,Ki){return U.default.createElement("div",{key:Ki},U.default.createElement(Fn,{authorized:pi,schema:uo,name:Ki}))}).toArray()):null)}}]),ft}(U.default.Component),sl=function(bn){(0,lo.default)(ft,bn);var Kt=(0,go.default)(ft);function ft(){return(0,re.default)(this,ft),Kt.apply(this,arguments)}return(0,ie.default)(ft,[{key:"render",value:function(){var Je,Qe=this.props,et=Qe.schema,At=Qe.name,Ot=Qe.getComponent,Vt=Qe.onAuthChange,Sn=Qe.authorized,jn=Qe.errSelectors,Fn=Ot("apiKeyAuth"),tr=Ot("basicAuth"),pi=et.get("type");switch(pi){case"apiKey":Je=U.default.createElement(Fn,{key:At,schema:et,name:At,errSelectors:jn,authorized:Sn,getComponent:Ot,onChange:Vt});break;case"basic":Je=U.default.createElement(tr,{key:At,schema:et,name:At,errSelectors:jn,authorized:Sn,getComponent:Ot,onChange:Vt});break;default:Je=U.default.createElement("div",{key:At},"Unknown security definition type ",pi)}return U.default.createElement("div",{key:"".concat(At,"-jump")},Je)}}]),ft}(U.default.Component),ml=function(bn){(0,lo.default)(ft,bn);var Kt=(0,go.default)(ft);function ft(){return(0,re.default)(this,ft),Kt.apply(this,arguments)}return(0,ie.default)(ft,[{key:"render",value:function(){var Je=this.props.error,Qe=Je.get("level"),et=Je.get("message"),At=Je.get("source");return U.default.createElement("div",{className:"errors"},U.default.createElement("b",null,At," ",Qe),U.default.createElement("span",null,et))}}]),ft}(U.default.Component),nu=function(bn){(0,lo.default)(ft,bn);var Kt=(0,go.default)(ft);function ft(Je,Qe){var et;(0,re.default)(this,ft),et=Kt.call(this,Je,Qe),(0,W.default)((0,wi.default)(et),"onChange",function(jn){var Fn=et.props.onChange,pi=(0,_e.default)({},et.state,{value:jn.target.value});et.setState(pi),Fn(pi)});var At=et.props,Ot=At.name,Vt=At.schema,Sn=et.getValue();return et.state={name:Ot,schema:Vt,value:Sn},et}return(0,ie.default)(ft,[{key:"getValue",value:function(){var Je=this.props,et=Je.authorized;return et&&et.getIn([Je.name,"value"])}},{key:"render",value:function(){var Je,Qe,et=this.props,At=et.schema,Ot=et.getComponent,Vt=et.errSelectors,Sn=et.name,jn=Ot("Input"),Fn=Ot("Row"),tr=Ot("Col"),pi=Ot("authError"),ui=Ot("Markdown",!0),Mi=Ot("JumpToPath",!0),Di=this.getValue(),uo=(0,g.default)(Je=Vt.allErrors()).call(Je,function(Ki){return Ki.get("authId")===Sn});return U.default.createElement("div",null,U.default.createElement("h4",null,U.default.createElement("code",null,Sn||At.get("name")),"\xa0(apiKey)",U.default.createElement(Mi,{path:["securityDefinitions",Sn]})),Di&&U.default.createElement("h6",null,"Authorized"),U.default.createElement(Fn,null,U.default.createElement(ui,{source:At.get("description")})),U.default.createElement(Fn,null,U.default.createElement("p",null,"Name: ",U.default.createElement("code",null,At.get("name")))),U.default.createElement(Fn,null,U.default.createElement("p",null,"In: ",U.default.createElement("code",null,At.get("in")))),U.default.createElement(Fn,null,U.default.createElement("label",null,"Value:"),Di?U.default.createElement("code",null," ****** "):U.default.createElement(tr,null,U.default.createElement(jn,{type:"text",onChange:this.onChange,autoFocus:!0}))),(0,xe.default)(Qe=uo.valueSeq()).call(Qe,function(Ki,to){return U.default.createElement(pi,{error:Ki,key:to})}))}}]),ft}(U.default.Component),Xu=function(bn){(0,lo.default)(ft,bn);var Kt=(0,go.default)(ft);function ft(Je,Qe){var et;(0,re.default)(this,ft),et=Kt.call(this,Je,Qe),(0,W.default)((0,wi.default)(et),"onChange",function(jn){var Fn=et.props.onChange,tr=jn.target,Mi=et.state.value;Mi[tr.name]=tr.value,et.setState({value:Mi}),Fn(et.state)});var At=et.props,Ot=At.schema,Vt=At.name,Sn=et.getValue().username;return et.state={name:Vt,schema:Ot,value:Sn?{username:Sn}:{}},et}return(0,ie.default)(ft,[{key:"getValue",value:function(){var Je=this.props,Qe=Je.authorized;return Qe&&Qe.getIn([Je.name,"value"])||{}}},{key:"render",value:function(){var Je,Qe,et=this.props,At=et.schema,Ot=et.getComponent,Vt=et.name,Sn=et.errSelectors,jn=Ot("Input"),Fn=Ot("Row"),tr=Ot("Col"),pi=Ot("authError"),ui=Ot("JumpToPath",!0),Mi=Ot("Markdown",!0),Di=this.getValue().username,uo=(0,g.default)(Je=Sn.allErrors()).call(Je,function(Ki){return Ki.get("authId")===Vt});return U.default.createElement("div",null,U.default.createElement("h4",null,"Basic authorization",U.default.createElement(ui,{path:["securityDefinitions",Vt]})),Di&&U.default.createElement("h6",null,"Authorized"),U.default.createElement(Fn,null,U.default.createElement(Mi,{source:At.get("description")})),U.default.createElement(Fn,null,U.default.createElement("label",null,"Username:"),Di?U.default.createElement("code",null," ",Di," "):U.default.createElement(tr,null,U.default.createElement(jn,{type:"text",required:"required",name:"username",onChange:this.onChange,autoFocus:!0}))),U.default.createElement(Fn,null,U.default.createElement("label",null,"Password:"),Di?U.default.createElement("code",null," ****** "):U.default.createElement(tr,null,U.default.createElement(jn,{autoComplete:"new-password",name:"password",type:"password",onChange:this.onChange}))),(0,xe.default)(Qe=uo.valueSeq()).call(Qe,function(Ki,to){return U.default.createElement(pi,{error:Ki,key:to})}))}}]),ft}(U.default.Component);function Pf(bn){var Kt=bn.example,ft=bn.showValue,Je=bn.getComponent,Qe=bn.getConfigs,et=Je("Markdown",!0),At=Je("highlightCode");return Kt?U.default.createElement("div",{className:"example"},Kt.get("description")?U.default.createElement("section",{className:"example__section"},U.default.createElement("div",{className:"example__section-header"},"Example Description"),U.default.createElement("p",null,U.default.createElement(et,{source:Kt.get("description")}))):null,ft&&Kt.has("value")?U.default.createElement("section",{className:"example__section"},U.default.createElement("div",{className:"example__section-header"},"Example Value"),U.default.createElement(At,{getConfigs:Qe,value:(0,Mn.Pz)(Kt.get("value"))})):null):null}var Fl=wo(6914),qc=function(bn){(0,lo.default)(ft,bn);var Kt=(0,go.default)(ft);function ft(){var Je,Qe;(0,re.default)(this,ft);for(var et=arguments.length,At=new Array(et),Ot=0;Ot<et;Ot++)At[Ot]=arguments[Ot];return Qe=Kt.call.apply(Kt,(0,o.default)(Je=[this]).call(Je,At)),(0,W.default)((0,wi.default)(Qe),"_onSelect",function(Vt){var Sn=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},jn=Sn.isSyntheticChange,Fn=void 0!==jn&&jn;"function"==typeof Qe.props.onSelect&&Qe.props.onSelect(Vt,{isSyntheticChange:Fn})}),(0,W.default)((0,wi.default)(Qe),"_onDomSelect",function(Vt){if("function"==typeof Qe.props.onSelect){var Sn=Vt.target.selectedOptions[0].getAttribute("value");Qe._onSelect(Sn,{isSyntheticChange:!1})}}),(0,W.default)((0,wi.default)(Qe),"getCurrentExample",function(){var Vt=Qe.props,Sn=Vt.examples,Fn=Sn.get(Vt.currentExampleKey),tr=Sn.keySeq().first(),pi=Sn.get(tr);return Fn||pi||(0,Fl.default)({})}),Qe}return(0,ie.default)(ft,[{key:"componentDidMount",value:function(){var Je=this.props,et=Je.examples;if("function"==typeof Je.onSelect){var At=et.first(),Ot=et.keyOf(At);this._onSelect(Ot,{isSyntheticChange:!0})}}},{key:"UNSAFE_componentWillReceiveProps",value:function(Je){var et=Je.examples;if(et!==this.props.examples&&!et.has(Je.currentExampleKey)){var At=et.first(),Ot=et.keyOf(At);this._onSelect(Ot,{isSyntheticChange:!0})}}},{key:"render",value:function(){var Je=this.props,Qe=Je.examples,et=Je.currentExampleKey,At=Je.isValueModified,Ot=Je.isModifiedValueAvailable;return U.default.createElement("div",{className:"examples-select"},Je.showLabels?U.default.createElement("span",{className:"examples-select__section-label"},"Examples: "):null,U.default.createElement("select",{className:"examples-select-element",onChange:this._onDomSelect,value:Ot&&At?"__MODIFIED__VALUE__":et||""},Ot?U.default.createElement("option",{value:"__MODIFIED__VALUE__"},"[Modified value]"):null,(0,xe.default)(Qe).call(Qe,function(Sn,jn){return U.default.createElement("option",{key:jn,value:jn},Sn.get("summary")||jn)}).valueSeq()))}}]),ft}(U.default.PureComponent);(0,W.default)(qc,"defaultProps",{examples:ht.default.Map({}),onSelect:function(){for(var bn,Kt,ft=arguments.length,Je=new Array(ft),Qe=0;Qe<ft;Qe++)Je[Qe]=arguments[Qe];return(bn=console).log.apply(bn,(0,o.default)(Kt=["DEBUG: ExamplesSelect was not given an onSelect callback"]).call(Kt,Je))},currentExampleKey:null,showLabels:!0});var up=function(bn){return ht.List.isList(bn)?bn:(0,Mn.Pz)(bn)},Eh=function(bn){(0,lo.default)(ft,bn);var Kt=(0,go.default)(ft);function ft(Je){var Qe;(0,re.default)(this,ft),Qe=Kt.call(this,Je),(0,W.default)((0,wi.default)(Qe),"_getStateForCurrentNamespace",function(){return(Qe.state[Qe.props.currentNamespace]||(0,ht.Map)()).toObject()}),(0,W.default)((0,wi.default)(Qe),"_setStateForCurrentNamespace",function(At){return Qe._setStateForNamespace(Qe.props.currentNamespace,At)}),(0,W.default)((0,wi.default)(Qe),"_setStateForNamespace",function(At,Ot){var Vt=(Qe.state[At]||(0,ht.Map)()).mergeDeep(Ot);return Qe.setState((0,W.default)({},At,Vt))}),(0,W.default)((0,wi.default)(Qe),"_isCurrentUserInputSameAsExampleValue",function(){var At=Qe.props.currentUserInputValue;return Qe._getCurrentExampleValue()===At}),(0,W.default)((0,wi.default)(Qe),"_getValueForExample",function(At,Ot){return up(((Ot||Qe.props).examples||(0,ht.Map)({})).getIn([At,"value"]))}),(0,W.default)((0,wi.default)(Qe),"_getCurrentExampleValue",function(At){return Qe._getValueForExample((At||Qe.props).currentKey,At||Qe.props)}),(0,W.default)((0,wi.default)(Qe),"_onExamplesSelect",function(At){var Ot=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},Vt=Ot.isSyntheticChange,Sn=Qe.props,jn=Sn.onSelect,Fn=Sn.updateValue,tr=Sn.currentUserInputValue,pi=Sn.userHasEditedBody,ui=Qe._getStateForCurrentNamespace(),Mi=ui.lastUserEditedValue,Di=Qe._getValueForExample(At);if("__MODIFIED__VALUE__"===At)return Fn(up(Mi)),Qe._setStateForCurrentNamespace({isModifiedValueSelected:!0});if("function"==typeof jn){for(var uo,Ki=arguments.length,to=new Array(Ki>2?Ki-2:0),ys=2;ys<Ki;ys++)to[ys-2]=arguments[ys];jn.apply(void 0,(0,o.default)(uo=[At,{isSyntheticChange:Vt}]).call(uo,to))}Qe._setStateForCurrentNamespace({lastDownstreamValue:Di,isModifiedValueSelected:Vt&&pi||!!tr&&tr!==Di}),Vt||"function"==typeof Fn&&Fn(up(Di))});var et=Qe._getCurrentExampleValue();return Qe.state=(0,W.default)({},Je.currentNamespace,(0,ht.Map)({lastUserEditedValue:Qe.props.currentUserInputValue,lastDownstreamValue:et,isModifiedValueSelected:Qe.props.userHasEditedBody||Qe.props.currentUserInputValue!==et})),Qe}return(0,ie.default)(ft,[{key:"componentWillUnmount",value:function(){this.props.setRetainRequestBodyValueFlag(!1)}},{key:"UNSAFE_componentWillReceiveProps",value:function(Je){var Qe=Je.currentUserInputValue,et=Je.examples,At=Je.onSelect,Ot=Je.userHasEditedBody,Vt=this._getStateForCurrentNamespace(),Sn=Vt.lastUserEditedValue,jn=Vt.lastDownstreamValue,Fn=this._getValueForExample(Je.currentKey,Je),tr=(0,g.default)(et).call(et,function(pi){return pi.get("value")===Qe||(0,Mn.Pz)(pi.get("value"))===Qe});tr.size?At(tr.has(Je.currentKey)?Je.currentKey:tr.keySeq().first(),{isSyntheticChange:!0}):Qe!==this.props.currentUserInputValue&&Qe!==Sn&&Qe!==jn&&(this.props.setRetainRequestBodyValueFlag(!0),this._setStateForNamespace(Je.currentNamespace,{lastUserEditedValue:Je.currentUserInputValue,isModifiedValueSelected:Ot||Qe!==Fn}))}},{key:"render",value:function(){var Je=this.props,Qe=Je.currentUserInputValue,et=Je.examples,At=Je.currentKey,Ot=Je.getComponent,Vt=Je.userHasEditedBody,Sn=this._getStateForCurrentNamespace(),jn=Sn.lastDownstreamValue,Fn=Sn.lastUserEditedValue,tr=Sn.isModifiedValueSelected,pi=Ot("ExamplesSelect");return U.default.createElement(pi,{examples:et,currentExampleKey:At,onSelect:this._onExamplesSelect,isModifiedValueAvailable:!!Fn&&Fn!==jn,isValueModified:void 0!==Qe&&tr&&Qe!==this._getCurrentExampleValue()||Vt})}}]),ft}(U.default.PureComponent);(0,W.default)(Eh,"defaultProps",{userHasEditedBody:!1,examples:(0,ht.Map)({}),currentNamespace:"__DEFAULT__NAMESPACE__",setRetainRequestBodyValueFlag:function(){},onSelect:function(){for(var bn,Kt,ft=arguments.length,Je=new Array(ft),Qe=0;Qe<ft;Qe++)Je[Qe]=arguments[Qe];return(bn=console).log.apply(bn,(0,o.default)(Kt=["ExamplesSelectValueRetainer: no `onSelect` function was provided"]).call(Kt,Je))},updateValue:function(){for(var bn,Kt,ft=arguments.length,Je=new Array(ft),Qe=0;Qe<ft;Qe++)Je[Qe]=arguments[Qe];return(bn=console).log.apply(bn,(0,o.default)(Kt=["ExamplesSelectValueRetainer: no `updateValue` function was provided"]).call(Kt,Je))}});var Wp=wo(8898),Th=wo(5487),ru=wo(2372),Zc=wo(8900),Ip=function(bn){(0,lo.default)(ft,bn);var Kt=(0,go.default)(ft);function ft(Je,Qe){var et;(0,re.default)(this,ft),et=Kt.call(this,Je,Qe),(0,W.default)((0,wi.default)(et),"close",function(Ki){Ki.preventDefault(),et.props.authActions.showDefinitions(!1)}),(0,W.default)((0,wi.default)(et),"authorize",function(){var Ki=et.props,to=Ki.authActions,ys=Ki.errActions,ta=Ki.authSelectors,Ds=Ki.oas3Selectors,Rs=(0,Ki.getConfigs)(),Fs=ta.getConfigs();ys.clear({authId:name,type:"auth",source:"auth"}),function(Cs){var Fa=Cs.auth,js=Cs.authActions,Ca=Cs.errActions,Ko=Cs.configs,na=Cs.authConfigs,vl=void 0===na?{}:na,ud=Cs.currentServer,af=Fa.schema,lf=Fa.scopes,Lf=Fa.name,iu=Fa.clientId,cd=af.get("flow"),uc=[];switch(cd){case"password":return void js.authorizePassword(Fa);case"application":case"clientCredentials":case"client_credentials":return void js.authorizeApplication(Fa);case"accessCode":case"authorizationCode":case"authorization_code":uc.push("response_type=code");break;case"implicit":uc.push("response_type=token")}"string"==typeof iu&&uc.push("client_id="+encodeURIComponent(iu));var cp=Ko.oauth2RedirectUrl;if(void 0!==cp){uc.push("redirect_uri="+encodeURIComponent(cp));var Qf=[];(0,Re.default)(lf)?Qf=lf:ht.default.List.isList(lf)&&(Qf=lf.toArray()),Qf.length>0&&uc.push("scope="+encodeURIComponent(Qf.join(vl.scopeSeparator||" ")));var jd=(0,Mn.r3)(new Date);if(uc.push("state="+encodeURIComponent(jd)),void 0!==vl.realm&&uc.push("realm="+encodeURIComponent(vl.realm)),("authorizationCode"===cd||"authorization_code"===cd||"accessCode"===cd)&&vl.usePkceWithAuthorizationCodeGrant){var cc=(0,Mn.Uj)(),Gd=(0,Mn.Xb)(cc);uc.push("code_challenge="+Gd),uc.push("code_challenge_method=S256"),Fa.codeVerifier=cc}var uf=vl.additionalQueryStringParams;for(var cf in uf){var Sh;void 0!==uf[cf]&&uc.push((0,xe.default)(Sh=[cf,uf[cf]]).call(Sh,encodeURIComponent).join("="))}var xd=af.get("authorizationUrl"),Af=[ud?(0,Zc.default)((0,Mn.Nm)(xd),ud,!0).toString():(0,Mn.Nm)(xd),uc.join("&")].join(-1===(0,Ge.default)(xd).call(xd,"?")?"?":"&");js.authPopup(Af,{auth:Fa,state:jd,redirectUrl:cp,callback:"implicit"===cd?js.preAuthorizeImplicit:vl.useBasicAuthenticationWithAccessCodeGrant?js.authorizeAccessCodeWithBasicAuthentication:js.authorizeAccessCodeWithFormParams,errCb:Ca.newAuthErr})}else Ca.newAuthErr({authId:Lf,source:"validation",level:"error",message:"oauth2RedirectUrl configuration is not passed. Oauth2 authorization cannot be performed."})}({auth:et.state,currentServer:Ds.serverEffectiveValue(Ds.selectedServer()),authActions:to,errActions:ys,configs:Rs,authConfigs:Fs})}),(0,W.default)((0,wi.default)(et),"onScopeChange",function(Ki){var to,ys,Ls=Ki.target,ta=Ls.checked,Ds=Ls.dataset.value;if(ta&&-1===(0,Ge.default)(to=et.state.scopes).call(to,Ds)){var Rs,Fs=(0,o.default)(Rs=et.state.scopes).call(Rs,[Ds]);et.setState({scopes:Fs})}else if(!ta&&(0,Ge.default)(ys=et.state.scopes).call(ys,Ds)>-1){var Cs;et.setState({scopes:(0,g.default)(Cs=et.state.scopes).call(Cs,function(Fa){return Fa!==Ds})})}}),(0,W.default)((0,wi.default)(et),"onInputChange",function(Ki){var to=Ki.target,ta=(0,W.default)({},to.dataset.name,to.value);et.setState(ta)}),(0,W.default)((0,wi.default)(et),"selectScopes",function(Ki){var to;et.setState(Ki.target.dataset.all?{scopes:(0,Wp.default)((0,Th.default)(to=et.props.schema.get("allowedScopes")||et.props.schema.get("scopes")).call(to))}:{scopes:[]})}),(0,W.default)((0,wi.default)(et),"logout",function(Ki){Ki.preventDefault();var to=et.props,ys=to.authActions,ta=to.name;to.errActions.clear({authId:ta,type:"auth",source:"auth"}),ys.logoutWithPersistOption([ta])});var At=et.props,Ot=At.name,Vt=At.schema,Sn=At.authorized,jn=At.authSelectors,Fn=Sn&&Sn.get(Ot),tr=jn.getConfigs()||{},pi=Fn&&Fn.get("username")||"",ui=Fn&&Fn.get("clientId")||tr.clientId||"",Mi=Fn&&Fn.get("clientSecret")||tr.clientSecret||"",Di=Fn&&Fn.get("passwordType")||"basic",uo=Fn&&Fn.get("scopes")||tr.scopes||[];return"string"==typeof uo&&(uo=uo.split(tr.scopeSeparator||" ")),et.state={appName:tr.appName,name:Ot,schema:Vt,scopes:uo,clientId:ui,clientSecret:Mi,username:pi,password:"",passwordType:Di},et}return(0,ie.default)(ft,[{key:"render",value:function(){var Je,Qe,et=this,At=this.props,Ot=At.schema,Vt=At.getComponent,Sn=At.authSelectors,jn=At.errSelectors,Fn=At.name,tr=At.specSelectors,pi=Vt("Input"),ui=Vt("Row"),Mi=Vt("Col"),Di=Vt("Button"),uo=Vt("authError"),Ki=Vt("JumpToPath",!0),to=Vt("Markdown",!0),ys=Vt("InitializedInput"),Ls=tr.isOAS3,ta=Ls()?Ot.get("openIdConnectUrl"):null,Ds="implicit",Rs="password",Fs=Ls()?ta?"authorization_code":"authorizationCode":"accessCode",Cs=Ls()?ta?"client_credentials":"clientCredentials":"application",Fa=!!(Sn.getConfigs()||{}).usePkceWithAuthorizationCodeGrant,js=Ot.get("flow"),Ca=js===Fs&&Fa?js+" with PKCE":js,Ko=Ot.get("allowedScopes")||Ot.get("scopes"),na=!!Sn.authorized().get(Fn),vl=(0,g.default)(Je=jn.allErrors()).call(Je,function(lf){return lf.get("authId")===Fn}),ud=!(0,g.default)(vl).call(vl,function(lf){return"validation"===lf.get("source")}).size,af=Ot.get("description");return U.default.createElement("div",null,U.default.createElement("h4",null,Fn," (OAuth2, ",Ca,") ",U.default.createElement(Ki,{path:["securityDefinitions",Fn]})),this.state.appName?U.default.createElement("h5",null,"Application: ",this.state.appName," "):null,af&&U.default.createElement(to,{source:Ot.get("description")}),na&&U.default.createElement("h6",null,"Authorized"),ta&&U.default.createElement("p",null,"OpenID Connect URL: ",U.default.createElement("code",null,ta)),(js===Ds||js===Fs)&&U.default.createElement("p",null,"Authorization URL: ",U.default.createElement("code",null,Ot.get("authorizationUrl"))),(js===Rs||js===Fs||js===Cs)&&U.default.createElement("p",null,"Token URL:",U.default.createElement("code",null," ",Ot.get("tokenUrl"))),U.default.createElement("p",{className:"flow"},"Flow: ",U.default.createElement("code",null,Ca)),js!==Rs?null:U.default.createElement(ui,null,U.default.createElement(ui,null,U.default.createElement("label",{htmlFor:"oauth_username"},"username:"),na?U.default.createElement("code",null," ",this.state.username," "):U.default.createElement(Mi,{tablet:10,desktop:10},U.default.createElement("input",{id:"oauth_username",type:"text","data-name":"username",onChange:this.onInputChange,autoFocus:!0}))),U.default.createElement(ui,null,U.default.createElement("label",{htmlFor:"oauth_password"},"password:"),na?U.default.createElement("code",null," ****** "):U.default.createElement(Mi,{tablet:10,desktop:10},U.default.createElement("input",{id:"oauth_password",type:"password","data-name":"password",onChange:this.onInputChange}))),U.default.createElement(ui,null,U.default.createElement("label",{htmlFor:"password_type"},"Client credentials location:"),na?U.default.createElement("code",null," ",this.state.passwordType," "):U.default.createElement(Mi,{tablet:10,desktop:10},U.default.createElement("select",{id:"password_type","data-name":"passwordType",onChange:this.onInputChange},U.default.createElement("option",{value:"basic"},"Authorization header"),U.default.createElement("option",{value:"request-body"},"Request body"))))),(js===Cs||js===Ds||js===Fs||js===Rs)&&(!na||na&&this.state.clientId)&&U.default.createElement(ui,null,U.default.createElement("label",{htmlFor:"client_id"},"client_id:"),na?U.default.createElement("code",null," ****** "):U.default.createElement(Mi,{tablet:10,desktop:10},U.default.createElement(ys,{id:"client_id",type:"text",required:js===Rs,initialValue:this.state.clientId,"data-name":"clientId",onChange:this.onInputChange}))),(js===Cs||js===Fs||js===Rs)&&!Fa&&U.default.createElement(ui,null,U.default.createElement("label",{htmlFor:"client_secret"},"client_secret:"),na?U.default.createElement("code",null," ****** "):U.default.createElement(Mi,{tablet:10,desktop:10},U.default.createElement(ys,{id:"client_secret",initialValue:this.state.clientSecret,type:"password","data-name":"clientSecret",onChange:this.onInputChange}))),!na&&Ko&&Ko.size?U.default.createElement("div",{className:"scopes"},U.default.createElement("h2",null,"Scopes:",U.default.createElement("a",{onClick:this.selectScopes,"data-all":!0},"select all"),U.default.createElement("a",{onClick:this.selectScopes},"select none")),(0,xe.default)(Ko).call(Ko,function(lf,Lf){var iu,cd,uc,cp,Qf;return U.default.createElement(ui,{key:Lf},U.default.createElement("div",{className:"checkbox"},U.default.createElement(pi,{"data-value":Lf,id:(0,o.default)(iu=(0,o.default)(cd="".concat(Lf,"-")).call(cd,js,"-checkbox-")).call(iu,et.state.name),disabled:na,checked:(0,ru.default)(uc=et.state.scopes).call(uc,Lf),type:"checkbox",onChange:et.onScopeChange}),U.default.createElement("label",{htmlFor:(0,o.default)(cp=(0,o.default)(Qf="".concat(Lf,"-")).call(Qf,js,"-checkbox-")).call(cp,et.state.name)},U.default.createElement("span",{className:"item"}),U.default.createElement("div",{className:"text"},U.default.createElement("p",{className:"name"},Lf),U.default.createElement("p",{className:"description"},lf)))))}).toArray()):null,(0,xe.default)(Qe=vl.valueSeq()).call(Qe,function(lf,Lf){return U.default.createElement(uo,{error:lf,key:Lf})}),U.default.createElement("div",{className:"auth-btn-wrapper"},ud&&(na?U.default.createElement(Di,{className:"btn modal-btn auth authorize",onClick:this.logout},"Logout"):U.default.createElement(Di,{className:"btn modal-btn auth authorize",onClick:this.authorize},"Authorize")),U.default.createElement(Di,{className:"btn modal-btn auth btn-done",onClick:this.close},"Close")))}}]),ft}(U.default.Component),Yi=function(bn){(0,lo.default)(ft,bn);var Kt=(0,go.default)(ft);function ft(){var Je,Qe;(0,re.default)(this,ft);for(var et=arguments.length,At=new Array(et),Ot=0;Ot<et;Ot++)At[Ot]=arguments[Ot];return Qe=Kt.call.apply(Kt,(0,o.default)(Je=[this]).call(Je,At)),(0,W.default)((0,wi.default)(Qe),"onClick",function(){var Vt=Qe.props,Sn=Vt.specActions,jn=Vt.path,Fn=Vt.method;Sn.clearResponse(jn,Fn),Sn.clearRequest(jn,Fn)}),Qe}return(0,ie.default)(ft,[{key:"render",value:function(){return U.default.createElement("button",{className:"btn btn-clear opblock-control__btn",onClick:this.onClick},"Clear")}}]),ft}(U.Component),lr=function(bn){var Kt=bn.headers;return U.default.createElement("div",null,U.default.createElement("h5",null,"Response headers"),U.default.createElement("pre",{className:"microlight"},Kt))},mi=function(bn){var Kt=bn.duration;return U.default.createElement("div",null,U.default.createElement("h5",null,"Request duration"),U.default.createElement("pre",{className:"microlight"},Kt," ms"))},eo=function(bn){(0,lo.default)(ft,bn);var Kt=(0,go.default)(ft);function ft(){return(0,re.default)(this,ft),Kt.apply(this,arguments)}return(0,ie.default)(ft,[{key:"shouldComponentUpdate",value:function(Je){return this.props.response!==Je.response||this.props.path!==Je.path||this.props.method!==Je.method||this.props.displayRequestDuration!==Je.displayRequestDuration}},{key:"render",value:function(){var Je,Qe=this.props,et=Qe.response,At=Qe.getComponent,Ot=Qe.getConfigs,Vt=Qe.displayRequestDuration,Sn=Qe.specSelectors,jn=Qe.path,Fn=Qe.method,tr=Ot(),ui=tr.requestSnippetsEnabled,Mi=tr.showMutatedRequest?Sn.mutatedRequestFor(jn,Fn):Sn.requestFor(jn,Fn),Di=et.get("status"),uo=Mi.get("url"),Ki=et.get("headers").toJS(),to=et.get("notDocumented"),ys=et.get("error"),Ls=et.get("text"),ta=et.get("duration"),Ds=(0,C.default)(Ki),Rs=Ki["content-type"]||Ki["Content-Type"],Fs=At("responseBody"),Cs=(0,xe.default)(Ds).call(Ds,function(na){var vl=(0,Re.default)(Ki[na])?Ki[na].join():Ki[na];return U.default.createElement("span",{className:"headerline",key:na}," ",na,": ",vl," ")}),Fa=0!==Cs.length,js=At("Markdown",!0),Ca=At("RequestSnippets",!0),Ko=At("curl");return U.default.createElement("div",null,Mi&&(!0===ui||"true"===ui?U.default.createElement(Ca,{request:Mi}):U.default.createElement(Ko,{request:Mi,getConfigs:Ot})),uo&&U.default.createElement("div",null,U.default.createElement("div",{className:"request-url"},U.default.createElement("h4",null,"Request URL"),U.default.createElement("pre",{className:"microlight"},uo))),U.default.createElement("h4",null,"Server response"),U.default.createElement("table",{className:"responses-table live-responses-table"},U.default.createElement("thead",null,U.default.createElement("tr",{className:"responses-header"},U.default.createElement("td",{className:"col_header response-col_status"},"Code"),U.default.createElement("td",{className:"col_header response-col_description"},"Details"))),U.default.createElement("tbody",null,U.default.createElement("tr",{className:"response"},U.default.createElement("td",{className:"response-col_status"},Di,to?U.default.createElement("div",{className:"response-undocumented"},U.default.createElement("i",null," Undocumented ")):null),U.default.createElement("td",{className:"response-col_description"},ys?U.default.createElement(js,{source:(0,o.default)(Je="".concat(""!==et.get("name")?"".concat(et.get("name"),": "):"")).call(Je,et.get("message"))}):null,Ls?U.default.createElement(Fs,{content:Ls,contentType:Rs,url:uo,headers:Ki,getConfigs:Ot,getComponent:At}):null,Fa?U.default.createElement(lr,{headers:Cs}):null,Vt&&ta?U.default.createElement(mi,{duration:ta}):null)))))}}]),ft}(U.default.Component),Lo=wo(5623),Xo=["get","put","post","delete","options","head","patch"],rs=(0,o.default)(Xo).call(Xo,["trace"]),us=function(bn){(0,lo.default)(ft,bn);var Kt=(0,go.default)(ft);function ft(){var Je,Qe;(0,re.default)(this,ft);for(var et=arguments.length,At=new Array(et),Ot=0;Ot<et;Ot++)At[Ot]=arguments[Ot];return Qe=Kt.call.apply(Kt,(0,o.default)(Je=[this]).call(Je,At)),(0,W.default)((0,wi.default)(Qe),"renderOperationTag",function(Vt,Sn){var jn=Qe.props,Fn=jn.specSelectors,tr=jn.getComponent,pi=jn.oas3Selectors,ui=jn.layoutSelectors,Mi=jn.layoutActions,Di=jn.getConfigs,uo=tr("OperationContainer",!0),Ki=tr("OperationTag"),to=Vt.get("operations");return U.default.createElement(Ki,{key:"operation-"+Sn,tagObj:Vt,tag:Sn,oas3Selectors:pi,layoutSelectors:ui,layoutActions:Mi,getConfigs:Di,getComponent:tr,specUrl:Fn.url()},U.default.createElement("div",{className:"operation-tag-content"},(0,xe.default)(to).call(to,function(ys){var Ls,ta=ys.get("path"),Ds=ys.get("method"),Rs=ht.default.List(["paths",ta,Ds]),Fs=Fn.isOAS3()?rs:Xo;return-1===(0,Ge.default)(Fs).call(Fs,Ds)?null:U.default.createElement(uo,{key:(0,o.default)(Ls="".concat(ta,"-")).call(Ls,Ds),specPath:Rs,op:ys,path:ta,method:Ds,tag:Sn})}).toArray()))}),Qe}return(0,ie.default)(ft,[{key:"render",value:function(){var Je=this.props.specSelectors.taggedOperations();return 0===Je.size?U.default.createElement("h3",null," No operations defined in spec!"):U.default.createElement("div",null,(0,xe.default)(Je).call(Je,this.renderOperationTag).toArray(),Je.size<1?U.default.createElement("h3",null," No operations defined in spec! "):null)}}]),ft}(U.default.Component),ma=wo(3769);function Ka(bn){return bn.match(/^(?:[a-z]+:)?\/\//i)}function xu(bn,Kt){return bn?Ka(bn)?(ft=bn).match(/^\/\//i)?(0,o.default)(Je="".concat(window.location.protocol)).call(Je,ft):ft:new ma.default(bn,Kt).href:Kt;var ft,Je}function Kn(bn,Kt){var ft=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{},Je=ft.selectedServer,Qe=void 0===Je?"":Je;if(bn){if(Ka(bn))return bn;var et=xu(Qe,Kt);return Ka(et)?new ma.default(bn,et).href:new ma.default(bn,window.location.href).href}}function Pi(bn,Kt){var ft=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{},Je=ft.selectedServer,Qe=void 0===Je?"":Je;try{return Kn(bn,Kt,{selectedServer:Qe})}catch(et){return}}var as=function(bn){(0,lo.default)(ft,bn);var Kt=(0,go.default)(ft);function ft(){return(0,re.default)(this,ft),Kt.apply(this,arguments)}return(0,ie.default)(ft,[{key:"render",value:function(){var Je,Qe=this.props,et=Qe.tagObj,At=Qe.tag,Ot=Qe.children,Vt=Qe.oas3Selectors,Sn=Qe.layoutSelectors,jn=Qe.layoutActions,tr=Qe.getComponent,pi=Qe.specUrl,ui=(0,Qe.getConfigs)(),Mi=ui.docExpansion,Di=ui.deepLinking,uo=Di&&"false"!==Di,Ki=tr("Collapse"),to=tr("Markdown",!0),ys=tr("DeepLink"),Ls=tr("Link"),ta=et.getIn(["tagDetails","description"],null),Ds=et.getIn(["tagDetails","externalDocs","description"]),Rs=et.getIn(["tagDetails","externalDocs","url"]);Je=(0,Mn.Wl)(Vt)&&(0,Mn.Wl)(Vt.selectedServer)?Pi(Rs,pi,{selectedServer:Vt.selectedServer()}):Rs;var Fs=["operations-tag",At],Cs=Sn.isShown(Fs,"full"===Mi||"list"===Mi);return U.default.createElement("div",{className:Cs?"opblock-tag-section is-open":"opblock-tag-section"},U.default.createElement("h3",{onClick:function(){return jn.show(Fs,!Cs)},className:ta?"opblock-tag":"opblock-tag no-desc",id:(0,xe.default)(Fs).call(Fs,function(Fa){return(0,Mn.J6)(Fa)}).join("-"),"data-tag":At,"data-is-open":Cs},U.default.createElement(ys,{enabled:uo,isShown:Cs,path:(0,Mn.oJ)(At),text:At}),ta?U.default.createElement("small",null,U.default.createElement(to,{source:ta})):U.default.createElement("small",null),Ds?U.default.createElement("div",{className:"info__externaldocs"},U.default.createElement("small",null,Ds,Je?": ":null,Je?U.default.createElement(Ls,{href:(0,Mn.Nm)(Je),onClick:function(Fa){return Fa.stopPropagation()},target:"_blank"},Je):null)):null,U.default.createElement("button",{"aria-expanded":Cs,className:"expand-operation",title:Cs?"Collapse operation":"Expand operation",onClick:function(){return jn.show(Fs,!Cs)}},U.default.createElement("svg",{className:"arrow",width:"20",height:"20","aria-hidden":"true",focusable:"false"},U.default.createElement("use",{href:Cs?"#large-arrow-up":"#large-arrow-down",xlinkHref:Cs?"#large-arrow-up":"#large-arrow-down"})))),U.default.createElement(Ki,{isOpened:Cs},Ot))}}]),ft}(U.default.Component);(0,W.default)(as,"defaultProps",{tagObj:ht.default.fromJS({}),tag:""});var Zi=function(bn){(0,lo.default)(ft,bn);var Kt=(0,go.default)(ft);function ft(){return(0,re.default)(this,ft),Kt.apply(this,arguments)}return(0,ie.default)(ft,[{key:"render",value:function(){var Je=this.props,Qe=Je.specPath,et=Je.response,At=Je.request,Ot=Je.toggleShown,Vt=Je.onTryoutClick,Sn=Je.onCancelClick,jn=Je.onExecute,Fn=Je.fn,tr=Je.getComponent,pi=Je.getConfigs,ui=Je.specActions,Mi=Je.specSelectors,Di=Je.authActions,uo=Je.authSelectors,Ki=Je.oas3Actions,to=Je.oas3Selectors,ys=this.props.operation,Ls=ys.toJS(),ta=Ls.deprecated,Ds=Ls.isShown,Rs=Ls.path,Fs=Ls.method,Cs=Ls.op,Fa=Ls.tag,js=Ls.operationId,Ca=Ls.allowTryItOut,Ko=Ls.displayRequestDuration,na=Ls.tryItOutEnabled,vl=Ls.executeInProgress,ud=Cs.description,af=Cs.externalDocs,lf=Cs.schemes,Lf=af?Pi(af.url,Mi.url(),{selectedServer:to.selectedServer()}):"",iu=ys.getIn(["op"]),cd=iu.get("responses"),uc=(0,Mn.gp)(iu,["parameters"]),cp=Mi.operationScheme(Rs,Fs),Qf=["operations",Fa,js],L_=(0,Mn.nX)(iu),jd=tr("responses"),cc=tr("parameters"),Gd=tr("execute"),uf=tr("clear"),cf=tr("Collapse"),Sh=tr("Markdown",!0),wd=tr("schemes"),xd=tr("OperationServers"),Af=tr("OperationExt"),Ch=tr("OperationSummary"),Tm=tr("Link"),u9=pi().showExtensions;if(cd&&et&&et.size>0){var c9=!cd.get(String(et.get("status")))&&!cd.get("default");et=et.set("notDocumented",c9)}var d9=[Rs,Fs];return U.default.createElement("div",{className:ta?"opblock opblock-deprecated":Ds?"opblock opblock-".concat(Fs," is-open"):"opblock opblock-".concat(Fs),id:(0,Mn.J6)(Qf.join("-"))},U.default.createElement(Ch,{operationProps:ys,isShown:Ds,toggleShown:Ot,getComponent:tr,authActions:Di,authSelectors:uo,specPath:Qe}),U.default.createElement(cf,{isOpened:Ds},U.default.createElement("div",{className:"opblock-body"},iu&&iu.size||null===iu?null:U.default.createElement("img",{height:"32px",width:"32px",src:wo(2517),className:"opblock-loading-animation"}),ta&&U.default.createElement("h4",{className:"opblock-title_normal"}," Warning: Deprecated"),ud&&U.default.createElement("div",{className:"opblock-description-wrapper"},U.default.createElement("div",{className:"opblock-description"},U.default.createElement(Sh,{source:ud}))),Lf?U.default.createElement("div",{className:"opblock-external-docs-wrapper"},U.default.createElement("h4",{className:"opblock-title_normal"},"Find more details"),U.default.createElement("div",{className:"opblock-external-docs"},U.default.createElement("span",{className:"opblock-external-docs__description"},U.default.createElement(Sh,{source:af.description})),U.default.createElement(Tm,{target:"_blank",className:"opblock-external-docs__link",href:(0,Mn.Nm)(Lf)},Lf))):null,iu&&iu.size?U.default.createElement(cc,{parameters:uc,specPath:Qe.push("parameters"),operation:iu,onChangeKey:d9,onTryoutClick:Vt,onCancelClick:Sn,tryItOutEnabled:na,allowTryItOut:Ca,fn:Fn,getComponent:tr,specActions:ui,specSelectors:Mi,pathMethod:[Rs,Fs],getConfigs:pi,oas3Actions:Ki,oas3Selectors:to}):null,na?U.default.createElement(xd,{getComponent:tr,path:Rs,method:Fs,operationServers:iu.get("servers"),pathServers:Mi.paths().getIn([Rs,"servers"]),getSelectedServer:to.selectedServer,setSelectedServer:Ki.setSelectedServer,setServerVariableValue:Ki.setServerVariableValue,getServerVariable:to.serverVariableValue,getEffectiveServerValue:to.serverEffectiveValue}):null,na&&Ca&&lf&&lf.size?U.default.createElement("div",{className:"opblock-schemes"},U.default.createElement(wd,{schemes:lf,path:Rs,method:Fs,specActions:ui,currentScheme:cp})):null,U.default.createElement("div",{className:na&&et&&Ca?"btn-group":"execute-wrapper"},na&&Ca?U.default.createElement(Gd,{operation:iu,specActions:ui,specSelectors:Mi,oas3Selectors:to,oas3Actions:Ki,path:Rs,method:Fs,onExecute:jn,disabled:vl}):null,na&&et&&Ca?U.default.createElement(uf,{specActions:ui,path:Rs,method:Fs}):null),vl?U.default.createElement("div",{className:"loading-container"},U.default.createElement("div",{className:"loading"})):null,cd?U.default.createElement(jd,{responses:cd,request:At,tryItOutResponse:et,getComponent:tr,getConfigs:pi,specSelectors:Mi,oas3Actions:Ki,oas3Selectors:to,specActions:ui,produces:Mi.producesOptionsFor([Rs,Fs]),producesValue:Mi.currentProducesFor([Rs,Fs]),specPath:Qe.push("responses"),path:Rs,method:Fs,displayRequestDuration:Ko,fn:Fn}):null,u9&&L_.size?U.default.createElement(Af,{extensions:L_,getComponent:tr}):null)))}}]),ft}(U.PureComponent);(0,W.default)(Zi,"defaultProps",{operation:null,response:null,request:null,specPath:(0,ht.List)(),summary:""});const xs=(bn=>{var Kt={};return wo.d(Kt,bn),Kt})({default:()=>HF()});var is=function(bn){(0,lo.default)(ft,bn);var Kt=(0,go.default)(ft);function ft(){return(0,re.default)(this,ft),Kt.apply(this,arguments)}return(0,ie.default)(ft,[{key:"render",value:function(){var Je,Qe=this.props,et=Qe.isShown,At=Qe.toggleShown,Ot=Qe.getComponent,Vt=Qe.authActions,Sn=Qe.authSelectors,jn=Qe.operationProps,Fn=Qe.specPath,tr=jn.toJS(),pi=tr.summary,ui=tr.isAuthorized,Mi=tr.method,uo=tr.showSummary,Ki=tr.path,to=tr.operationId,ys=tr.originalOperationId,Ls=tr.displayOperationId,ta=tr.op.summary,Ds=jn.get("security"),Rs=Ot("authorizeOperationBtn"),Fs=Ot("OperationSummaryMethod"),Cs=Ot("OperationSummaryPath"),Fa=Ot("JumpToPath",!0),js=Ds&&!!Ds.count(),Ca=js&&1===Ds.size&&Ds.first().isEmpty(),Ko=!js||Ca;return U.default.createElement("div",{className:"opblock-summary opblock-summary-".concat(Mi)},U.default.createElement("button",{"aria-label":(0,o.default)(Je="".concat(Mi," ")).call(Je,Ki.replace(/\//g,"\u200b/")),"aria-expanded":et,className:"opblock-summary-control",onClick:At},U.default.createElement(Fs,{method:Mi}),U.default.createElement(Cs,{getComponent:Ot,operationProps:jn,specPath:Fn}),uo?U.default.createElement("div",{className:"opblock-summary-description"},(0,xs.default)(ta||pi)):null,Ls&&(ys||to)?U.default.createElement("span",{className:"opblock-summary-operation-id"},ys||to):null,U.default.createElement("svg",{className:"arrow",width:"20",height:"20","aria-hidden":"true",focusable:"false"},U.default.createElement("use",{href:et?"#large-arrow-up":"#large-arrow-down",xlinkHref:et?"#large-arrow-up":"#large-arrow-down"}))),Ko?null:U.default.createElement(Rs,{isAuthorized:ui,onClick:function(){var na=Sn.definitionsForRequirements(Ds);Vt.showDefinitions(na)}}),U.default.createElement(Fa,{path:Fn}))}}]),ft}(U.PureComponent);(0,W.default)(is,"defaultProps",{operationProps:null,specPath:(0,ht.List)(),summary:""});var hu=function(bn){(0,lo.default)(ft,bn);var Kt=(0,go.default)(ft);function ft(){return(0,re.default)(this,ft),Kt.apply(this,arguments)}return(0,ie.default)(ft,[{key:"render",value:function(){return U.default.createElement("span",{className:"opblock-summary-method"},this.props.method.toUpperCase())}}]),ft}(U.PureComponent);(0,W.default)(hu,"defaultProps",{operationProps:null});const Al=(bn=>{var Kt={};return wo.d(Kt,bn),Kt})({default:()=>fA()});var Ci=function(bn){(0,lo.default)(ft,bn);var Kt=(0,go.default)(ft);function ft(){return(0,re.default)(this,ft),Kt.apply(this,arguments)}return(0,ie.default)(ft,[{key:"render",value:function(){for(var Je,Qe=this.props,et=Qe.getComponent,At=Qe.operationProps.toJS(),Ot=At.deprecated,Vt=At.isShown,Sn=At.path,jn=At.tag,Fn=At.operationId,tr=At.isDeepLinkingEnabled,pi=Sn.split(/(?=\/)/g),ui=1;ui<pi.length;ui+=2)(0,Al.default)(pi).call(pi,ui,0,U.default.createElement("wbr",{key:ui}));var Mi=et("DeepLink");return U.default.createElement("span",{className:Ot?"opblock-summary-path__deprecated":"opblock-summary-path","data-path":Sn},U.default.createElement(Mi,{enabled:tr,isShown:Vt,path:(0,Mn.oJ)((0,o.default)(Je="".concat(jn,"/")).call(Je,Fn)),text:pi}))}}]),ft}(U.PureComponent),qa=wo(9334);const ja=function(bn){var Kt,ft=bn.extensions,Je=(0,bn.getComponent)("OperationExtRow");return U.default.createElement("div",{className:"opblock-section"},U.default.createElement("div",{className:"opblock-section-header"},U.default.createElement("h4",null,"Extensions")),U.default.createElement("div",{className:"table-container"},U.default.createElement("table",null,U.default.createElement("thead",null,U.default.createElement("tr",null,U.default.createElement("td",{className:"col_header"},"Field"),U.default.createElement("td",{className:"col_header"},"Value"))),U.default.createElement("tbody",null,(0,xe.default)(Kt=ft.entrySeq()).call(Kt,function(Qe){var et,At=(0,qa.default)(Qe,2),Ot=At[0],Vt=At[1];return U.default.createElement(Je,{key:(0,o.default)(et="".concat(Ot,"-")).call(et,Vt),xKey:Ot,xVal:Vt})})))))},Ku=function(bn){var Kt=bn.xKey,ft=bn.xVal,Je=ft?ft.toJS?ft.toJS():ft:null;return U.default.createElement("tr",null,U.default.createElement("td",null,Kt),U.default.createElement("td",null,(0,D.default)(Je)))};var Du=wo(29),If=wo(8096),Jp=wo(471),Ql=wo(9908),Jf=wo(7068);const pg=(bn=>{var Kt={};return wo.d(Kt,bn),Kt})({default:()=>BF()});var Qp=wo(9874),Ng=function(bn){var Kt=bn.value,ft=bn.fileName,Je=bn.className,Qe=bn.downloadable,et=bn.getConfigs,At=bn.canCopy,Ot=bn.language,Vt=(0,Jf.default)(et)?et():null,Sn=!1!==(0,Ql.default)(Vt,"syntaxHighlight")&&(0,Ql.default)(Vt,"syntaxHighlight.activated",!0),jn=(0,U.useRef)(null);(0,U.useEffect)(function(){var tr,pi=(0,g.default)(tr=(0,Wp.default)(jn.current.childNodes)).call(tr,function(ui){return!!ui.nodeType&&ui.classList.contains("microlight")});return(0,Du.default)(pi).call(pi,function(ui){return ui.addEventListener("mousewheel",Fn,{passive:!1})}),function(){(0,Du.default)(pi).call(pi,function(ui){return ui.removeEventListener("mousewheel",Fn)})}},[Kt,Je,Ot]);var Fn=function(tr){var pi=tr.target,ui=tr.deltaY,Mi=pi.scrollHeight,Di=pi.offsetHeight,uo=pi.scrollTop;Mi>Di&&(0===uo&&ui<0||Di+uo>=Mi&&ui>0)&&tr.preventDefault()};return U.default.createElement("div",{className:"highlight-code",ref:jn},Qe?U.default.createElement("div",{className:"download-contents",onClick:function(){(0,pg.default)(Kt,ft)}},"Download"):null,At&&U.default.createElement("div",{className:"copy-to-clipboard"},U.default.createElement(Qp.CopyToClipboard,{text:Kt},U.default.createElement("button",null))),Sn?U.default.createElement(Jp.d3,{language:Ot,className:(0,If.default)(Je,"microlight"),style:(0,Jp.C2)((0,Ql.default)(Vt,"syntaxHighlight.theme","agate"))},Kt):U.default.createElement("pre",{className:(0,If.default)(Je,"microlight")},Kt))};Ng.defaultProps={fileName:"response.txt"};const I_=Ng;var l1=function(bn){(0,lo.default)(ft,bn);var Kt=(0,go.default)(ft);function ft(){var Je,Qe;(0,re.default)(this,ft);for(var et=arguments.length,At=new Array(et),Ot=0;Ot<et;Ot++)At[Ot]=arguments[Ot];return Qe=Kt.call.apply(Kt,(0,o.default)(Je=[this]).call(Je,At)),(0,W.default)((0,wi.default)(Qe),"onChangeProducesWrapper",function(Vt){return Qe.props.specActions.changeProducesValue([Qe.props.path,Qe.props.method],Vt)}),(0,W.default)((0,wi.default)(Qe),"onResponseContentTypeChange",function(Vt){var Fn=Qe.props;Vt.controlsAcceptHeader&&Fn.oas3Actions.setResponseContentType({value:Vt.value,path:Fn.path,method:Fn.method})}),Qe}return(0,ie.default)(ft,[{key:"render",value:function(){var Je,Qe,et=this,At=this.props,Ot=At.responses,Vt=At.tryItOutResponse,Sn=At.getComponent,jn=At.getConfigs,Fn=At.specSelectors,tr=At.fn,pi=At.producesValue,ui=At.displayRequestDuration,Mi=At.specPath,Di=At.path,uo=At.method,Ki=At.oas3Selectors,to=At.oas3Actions,ys=(0,Mn.iQ)(Ot),Ls=Sn("contentType"),ta=Sn("liveResponse"),Ds=Sn("response"),Rs=this.props.produces&&this.props.produces.size?this.props.produces:ft.defaultProps.produces,Fs=Fn.isOAS3()?(0,Mn.QG)(Ot):null,Cs=function(js){var Ca=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"_";return js.replace(/[^\w-]/g,Ca)}((0,o.default)(Je="".concat(uo)).call(Je,Di,"_responses")),Fa="".concat(Cs,"_select");return U.default.createElement("div",{className:"responses-wrapper"},U.default.createElement("div",{className:"opblock-section-header"},U.default.createElement("h4",null,"Responses"),Fn.isOAS3()?null:U.default.createElement("label",{htmlFor:Fa},U.default.createElement("span",null,"Response content type"),U.default.createElement(Ls,{value:pi,ariaControls:Cs,ariaLabel:"Response content type",className:"execute-content-type",contentTypes:Rs,controlId:Fa,onChange:this.onChangeProducesWrapper}))),U.default.createElement("div",{className:"responses-inner"},Vt?U.default.createElement("div",null,U.default.createElement(ta,{response:Vt,getComponent:Sn,getConfigs:jn,specSelectors:Fn,path:this.props.path,method:this.props.method,displayRequestDuration:ui}),U.default.createElement("h4",null,"Responses")):null,U.default.createElement("table",{"aria-live":"polite",className:"responses-table",id:Cs,role:"region"},U.default.createElement("thead",null,U.default.createElement("tr",{className:"responses-header"},U.default.createElement("td",{className:"col_header response-col_status"},"Code"),U.default.createElement("td",{className:"col_header response-col_description"},"Description"),Fn.isOAS3()?U.default.createElement("td",{className:"col col_header response-col_links"},"Links"):null)),U.default.createElement("tbody",null,(0,xe.default)(Qe=Ot.entrySeq()).call(Qe,function(js){var Ca=(0,qa.default)(js,2),Ko=Ca[0],na=Ca[1],vl=Vt&&Vt.get("status")==Ko?"response_current":"";return U.default.createElement(Ds,{key:Ko,path:Di,method:uo,specPath:Mi.push(Ko),isDefault:ys===Ko,fn:tr,className:vl,code:Ko,response:na,specSelectors:Fn,controlsAcceptHeader:na===Fs,onContentTypeChange:et.onResponseContentTypeChange,contentType:pi,getConfigs:jn,activeExamplesKey:Ki.activeExamplesMember(Di,uo,"responses",Ko),oas3Actions:to,getComponent:Sn})}).toArray()))))}}]),ft}(U.default.Component);(0,W.default)(l1,"defaultProps",{tryItOutResponse:null,produces:(0,ht.fromJS)(["application/json"]),displayRequestDuration:!1});var Xp=wo(1013);const gd=(bn=>{var Kt={};return wo.d(Kt,bn),Kt})({default:()=>ZF()});var Pg=wo(2518),Em=function(bn){(0,lo.default)(ft,bn);var Kt=(0,go.default)(ft);function ft(Je,Qe){var et;return(0,re.default)(this,ft),et=Kt.call(this,Je,Qe),(0,W.default)((0,wi.default)(et),"_onContentTypeChange",function(At){var Ot=et.props,Vt=Ot.onContentTypeChange,Sn=Ot.controlsAcceptHeader;et.setState({responseContentType:At}),Vt({value:At,controlsAcceptHeader:Sn})}),(0,W.default)((0,wi.default)(et),"getTargetExamplesKey",function(){var At=et.props,Sn=At.activeExamplesKey,Fn=At.response.getIn(["content",et.state.responseContentType||At.contentType],(0,ht.Map)({})).get("examples",null).keySeq().first();return Sn||Fn}),et.state={responseContentType:""},et}return(0,ie.default)(ft,[{key:"render",value:function(){var Je,Qe,et,At,Ot,Vt=this.props,Sn=Vt.path,jn=Vt.method,Fn=Vt.code,tr=Vt.response,pi=Vt.className,ui=Vt.specPath,Di=Vt.getComponent,uo=Vt.getConfigs,Ki=Vt.specSelectors,to=Vt.contentType,ys=Vt.controlsAcceptHeader,Ls=Vt.oas3Actions,ta=Vt.fn.inferSchema,Ds=Ki.isOAS3(),Rs=uo().showExtensions,Fs=Rs?(0,Mn.nX)(tr):null,Cs=tr.get("headers"),Fa=tr.get("links"),js=Di("ResponseExtension"),Ca=Di("headers"),Ko=Di("highlightCode"),na=Di("modelExample"),vl=Di("Markdown",!0),ud=Di("operationLink"),af=Di("contentType"),lf=Di("ExamplesSelect"),Lf=Di("Example"),iu=this.state.responseContentType||to,cd=tr.getIn(["content",iu],(0,ht.Map)({})),uc=cd.get("examples",null);if(Ds){var cp=cd.get("schema");et=cp?ta(cp.toJS()):null,At=cp?(0,ht.List)(["content",this.state.responseContentType,"schema"]):ui}else et=tr.get("schema"),At=tr.has("schema")?ui.push("schema"):ui;var Qf,L_=!1,jd={includeReadOnly:!0};if(Ds){var cc;if(Qf=null===(cc=cd.get("schema"))||void 0===cc?void 0:cc.toJS(),uc){var Gd=this.getTargetExamplesKey(),uf=function(wd){return wd.get("value")};void 0===(Ot=uf(uc.get(Gd,(0,ht.Map)({}))))&&(Ot=uf((0,gd.default)(uc).call(uc).next().value)),L_=!0}else void 0!==cd.get("example")&&(Ot=cd.get("example"),L_=!0)}else{Qf=et,jd=(0,Xp.default)((0,Xp.default)({},jd),{},{includeWriteOnly:!0});var cf=tr.getIn(["examples",iu]);cf&&(Ot=cf,L_=!0)}var Sh=function(wd,xd,Af){if(null!=wd){var Ch=null;return(0,Pg.O)(wd)&&(Ch="json"),U.default.createElement("div",null,U.default.createElement(xd,{className:"example",getConfigs:Af,language:Ch,value:(0,Mn.Pz)(wd)}))}return null}((0,Mn.xi)(Qf,iu,jd,L_?Ot:void 0),Ko,uo);return U.default.createElement("tr",{className:"response "+(pi||""),"data-code":Fn},U.default.createElement("td",{className:"response-col_status"},Fn),U.default.createElement("td",{className:"response-col_description"},U.default.createElement("div",{className:"response-col_description__inner"},U.default.createElement(vl,{source:tr.get("description")})),Rs&&Fs.size?(0,xe.default)(Je=Fs.entrySeq()).call(Je,function(wd){var xd,Af=(0,qa.default)(wd,2),Ch=Af[0],Tm=Af[1];return U.default.createElement(js,{key:(0,o.default)(xd="".concat(Ch,"-")).call(xd,Tm),xKey:Ch,xVal:Tm})}):null,Ds&&tr.get("content")?U.default.createElement("section",{className:"response-controls"},U.default.createElement("div",{className:(0,If.default)("response-control-media-type",{"response-control-media-type--accept-controller":ys})},U.default.createElement("small",{className:"response-control-media-type__title"},"Media type"),U.default.createElement(af,{value:this.state.responseContentType,contentTypes:tr.get("content")?tr.get("content").keySeq():(0,ht.Seq)(),onChange:this._onContentTypeChange,ariaLabel:"Media Type"}),ys?U.default.createElement("small",{className:"response-control-media-type__accept-message"},"Controls ",U.default.createElement("code",null,"Accept")," header."):null),uc?U.default.createElement("div",{className:"response-control-examples"},U.default.createElement("small",{className:"response-control-examples__title"},"Examples"),U.default.createElement(lf,{examples:uc,currentExampleKey:this.getTargetExamplesKey(),onSelect:function(wd){return Ls.setActiveExamplesMember({name:wd,pathMethod:[Sn,jn],contextType:"responses",contextName:Fn})},showLabels:!1})):null):null,Sh||et?U.default.createElement(na,{specPath:At,getComponent:Di,getConfigs:uo,specSelectors:Ki,schema:(0,Mn.oG)(et),example:Sh,includeReadOnly:!0}):null,Ds&&uc?U.default.createElement(Lf,{example:uc.get(this.getTargetExamplesKey(),(0,ht.Map)({})),getComponent:Di,getConfigs:uo,omitValue:!0}):null,Cs?U.default.createElement(Ca,{headers:Cs,getComponent:Di}):null),Ds?U.default.createElement("td",{className:"response-col_links"},Fa?(0,xe.default)(Qe=Fa.toSeq().entrySeq()).call(Qe,function(wd){var xd=(0,qa.default)(wd,2),Af=xd[0];return U.default.createElement(ud,{key:Af,name:Af,link:xd[1],getComponent:Di})}):U.default.createElement("i",null,"No links")):null)}}]),ft}(U.default.Component);(0,W.default)(Em,"defaultProps",{response:(0,ht.fromJS)({}),onContentTypeChange:function(){}});const hg=function(bn){return U.default.createElement("div",{className:"response__extension"},bn.xKey,": ",String(bn.xVal))},iv=(bn=>{var Kt={};return wo.d(Kt,bn),Kt})({default:()=>GF()}),Lp=(bn=>{var Kt={};return wo.d(Kt,bn),Kt})({default:()=>zF()});var RA=function(bn){(0,lo.default)(ft,bn);var Kt=(0,go.default)(ft);function ft(){var Je,Qe;(0,re.default)(this,ft);for(var et=arguments.length,At=new Array(et),Ot=0;Ot<et;Ot++)At[Ot]=arguments[Ot];return Qe=Kt.call.apply(Kt,(0,o.default)(Je=[this]).call(Je,At)),(0,W.default)((0,wi.default)(Qe),"state",{parsedContent:null}),(0,W.default)((0,wi.default)(Qe),"updateParsedContent",function(Vt){var Sn=Qe.props.content;if(Vt!==Sn)if(Sn&&Sn instanceof Blob){var jn=new FileReader;jn.onload=function(){Qe.setState({parsedContent:jn.result})},jn.readAsText(Sn)}else Qe.setState({parsedContent:Sn.toString()})}),Qe}return(0,ie.default)(ft,[{key:"componentDidMount",value:function(){this.updateParsedContent(null)}},{key:"componentDidUpdate",value:function(Je){this.updateParsedContent(Je.content)}},{key:"render",value:function(){var Je,Qe,et=this.props,At=et.content,Ot=et.contentType,Vt=et.url,Sn=et.headers,jn=void 0===Sn?{}:Sn,Fn=et.getConfigs,pi=this.state.parsedContent,ui=(0,et.getComponent)("highlightCode"),Mi="response_"+(new Date).getTime();if(Vt=Vt||"",/^application\/octet-stream/i.test(Ot)||jn["Content-Disposition"]&&/attachment/i.test(jn["Content-Disposition"])||jn["content-disposition"]&&/attachment/i.test(jn["content-disposition"])||jn["Content-Description"]&&/File Transfer/i.test(jn["Content-Description"])||jn["content-description"]&&/File Transfer/i.test(jn["content-description"]))if("Blob"in window){var Di=Ot||"text/html",uo=At instanceof Blob?At:new Blob([At],{type:Di}),Ki=ma.default.createObjectURL(uo),to=[Di,Vt.substr((0,c.default)(Vt).call(Vt,"/")+1),Ki].join(":"),ys=jn["content-disposition"]||jn["Content-Disposition"];if(void 0!==ys){var Ls=(0,Mn.DR)(ys);null!==Ls&&(to=Ls)}Qe=U.default.createElement("div",null,U.default.createElement("a",Dn.Z.navigator&&Dn.Z.navigator.msSaveOrOpenBlob?{href:Ki,onClick:function(){return Dn.Z.navigator.msSaveOrOpenBlob(uo,to)}}:{href:Ki,download:to},"Download file"))}else Qe=U.default.createElement("pre",{className:"microlight"},"Download headers detected but your browser does not support downloading binary via XHR (Blob).");else if(/json/i.test(Ot)){var ta=null;(0,Pg.O)(At)&&(ta="json");try{Je=(0,D.default)(JSON.parse(At),null,"  ")}catch(Ds){Je="can't parse JSON.  Raw result:\n\n"+At}Qe=U.default.createElement(ui,{language:ta,downloadable:!0,fileName:"".concat(Mi,".json"),value:Je,getConfigs:Fn,canCopy:!0})}else/xml/i.test(Ot)?(Je=(0,iv.default)(At,{textNodesOnSameLine:!0,indentor:"  "}),Qe=U.default.createElement(ui,{downloadable:!0,fileName:"".concat(Mi,".xml"),value:Je,getConfigs:Fn,canCopy:!0})):Qe="text/html"===(0,Lp.default)(Ot)||/text\/plain/.test(Ot)?U.default.createElement(ui,{downloadable:!0,fileName:"".concat(Mi,".html"),value:At,getConfigs:Fn,canCopy:!0}):"text/csv"===(0,Lp.default)(Ot)||/text\/csv/.test(Ot)?U.default.createElement(ui,{downloadable:!0,fileName:"".concat(Mi,".csv"),value:At,getConfigs:Fn,canCopy:!0}):/^image\//i.test(Ot)?(0,ru.default)(Ot).call(Ot,"svg")?U.default.createElement("div",null," ",At," "):U.default.createElement("img",{src:ma.default.createObjectURL(At)}):/^audio\//i.test(Ot)?U.default.createElement("pre",{className:"microlight"},U.default.createElement("audio",{controls:!0},U.default.createElement("source",{src:Vt,type:Ot}))):"string"==typeof At?U.default.createElement(ui,{downloadable:!0,fileName:"".concat(Mi,".txt"),value:At,getConfigs:Fn,canCopy:!0}):At.size>0?pi?U.default.createElement("div",null,U.default.createElement("p",{className:"i"},"Unrecognized response type; displaying content as text."),U.default.createElement(ui,{downloadable:!0,fileName:"".concat(Mi,".txt"),value:pi,getConfigs:Fn,canCopy:!0})):U.default.createElement("p",{className:"i"},"Unrecognized response type; unable to display."):null;return Qe?U.default.createElement("div",null,U.default.createElement("h5",null,"Response body"),Qe):null}}]),ft}(U.default.PureComponent),Od=wo(2691),NA=wo(374),_S=function(bn){(0,lo.default)(ft,bn);var Kt=(0,go.default)(ft);function ft(Je){var Qe;return(0,re.default)(this,ft),Qe=Kt.call(this,Je),(0,W.default)((0,wi.default)(Qe),"onChange",function(et,At,Ot){var Vt=Qe.props;(0,Vt.specActions.changeParamByIdentity)(Vt.onChangeKey,et,At,Ot)}),(0,W.default)((0,wi.default)(Qe),"onChangeConsumesWrapper",function(et){var At=Qe.props;(0,At.specActions.changeConsumesValue)(At.onChangeKey,et)}),(0,W.default)((0,wi.default)(Qe),"toggleTab",function(et){return"parameters"===et?Qe.setState({parametersVisible:!0,callbackVisible:!1}):"callbacks"===et?Qe.setState({callbackVisible:!0,parametersVisible:!1}):void 0}),(0,W.default)((0,wi.default)(Qe),"onChangeMediaType",function(et){var At=et.value,Ot=et.pathMethod,Vt=Qe.props,Sn=Vt.specActions,jn=Vt.oas3Selectors,Fn=Vt.oas3Actions,tr=jn.hasUserEditedBody.apply(jn,(0,Od.default)(Ot)),pi=jn.shouldRetainRequestBodyValue.apply(jn,(0,Od.default)(Ot));Fn.setRequestContentType({value:At,pathMethod:Ot}),Fn.initRequestBodyValidateError({pathMethod:Ot}),tr||(pi||Fn.setRequestBodyValue({value:void 0,pathMethod:Ot}),Sn.clearResponse.apply(Sn,(0,Od.default)(Ot)),Sn.clearRequest.apply(Sn,(0,Od.default)(Ot)),Sn.clearValidateParams(Ot))}),Qe.state={callbackVisible:!1,parametersVisible:!0},Qe}return(0,ie.default)(ft,[{key:"render",value:function(){var Je,Qe,et=this,At=this.props,Ot=At.onTryoutClick,Vt=At.parameters,Sn=At.allowTryItOut,jn=At.tryItOutEnabled,Fn=At.specPath,tr=At.fn,pi=At.getComponent,ui=At.getConfigs,Mi=At.specSelectors,Di=At.specActions,uo=At.pathMethod,Ki=At.oas3Actions,to=At.oas3Selectors,ys=At.operation,Ls=pi("parameterRow"),ta=pi("TryItOutButton"),Ds=pi("contentType"),Rs=pi("Callbacks",!0),Fs=pi("RequestBody",!0),Cs=jn&&Sn,Fa=Mi.isOAS3(),js=ys.get("requestBody"),Ca=(0,ke.default)(Je=(0,NA.default)((0,ke.default)(Vt).call(Vt,function(Ko,na){var vl,ud=na.get("in");return null!==(vl=Ko[ud])&&void 0!==vl||(Ko[ud]=[]),Ko[ud].push(na),Ko},{}))).call(Je,function(Ko,na){return(0,o.default)(Ko).call(Ko,na)},[]);return U.default.createElement("div",{className:"opblock-section"},U.default.createElement("div",{className:"opblock-section-header"},Fa?U.default.createElement("div",{className:"tab-header"},U.default.createElement("div",{onClick:function(){return et.toggleTab("parameters")},className:"tab-item ".concat(this.state.parametersVisible&&"active")},U.default.createElement("h4",{className:"opblock-title"},U.default.createElement("span",null,"Parameters"))),ys.get("callbacks")?U.default.createElement("div",{onClick:function(){return et.toggleTab("callbacks")},className:"tab-item ".concat(this.state.callbackVisible&&"active")},U.default.createElement("h4",{className:"opblock-title"},U.default.createElement("span",null,"Callbacks"))):null):U.default.createElement("div",{className:"tab-header"},U.default.createElement("h4",{className:"opblock-title"},"Parameters")),Sn?U.default.createElement(ta,{isOAS3:Mi.isOAS3(),hasUserEditedBody:to.hasUserEditedBody.apply(to,(0,Od.default)(uo)),enabled:jn,onCancelClick:this.props.onCancelClick,onTryoutClick:Ot,onResetClick:function(){return Ki.setRequestBodyValue({value:void 0,pathMethod:uo})}}):null),this.state.parametersVisible?U.default.createElement("div",{className:"parameters-container"},Ca.length?U.default.createElement("div",{className:"table-container"},U.default.createElement("table",{className:"parameters"},U.default.createElement("thead",null,U.default.createElement("tr",null,U.default.createElement("th",{className:"col_header parameters-col_name"},"Name"),U.default.createElement("th",{className:"col_header parameters-col_description"},"Description"))),U.default.createElement("tbody",null,(0,xe.default)(Ca).call(Ca,function(Ko,na){var vl;return U.default.createElement(Ls,{fn:tr,specPath:Fn.push(na.toString()),getComponent:pi,getConfigs:ui,rawParam:Ko,param:Mi.parameterWithMetaByIdentity(uo,Ko),key:(0,o.default)(vl="".concat(Ko.get("in"),".")).call(vl,Ko.get("name")),onChange:et.onChange,onChangeConsumes:et.onChangeConsumesWrapper,specSelectors:Mi,specActions:Di,oas3Actions:Ki,oas3Selectors:to,pathMethod:uo,isExecute:Cs})})))):U.default.createElement("div",{className:"opblock-description-wrapper"},U.default.createElement("p",null,"No parameters"))):null,this.state.callbackVisible?U.default.createElement("div",{className:"callbacks-container opblock-description-wrapper"},U.default.createElement(Rs,{callbacks:(0,ht.Map)(ys.get("callbacks")),specPath:(0,Le.default)(Fn).call(Fn,0,-1).push("callbacks")})):null,Fa&&js&&this.state.parametersVisible&&U.default.createElement("div",{className:"opblock-section opblock-section-request-body"},U.default.createElement("div",{className:"opblock-section-header"},U.default.createElement("h4",{className:"opblock-title parameter__name ".concat(js.get("required")&&"required")},"Request body"),U.default.createElement("label",null,U.default.createElement(Ds,{value:to.requestContentType.apply(to,(0,Od.default)(uo)),contentTypes:js.get("content",(0,ht.List)()).keySeq(),onChange:function(Ko){et.onChangeMediaType({value:Ko,pathMethod:uo})},className:"body-param-content-type",ariaLabel:"Request content type"}))),U.default.createElement("div",{className:"opblock-description-wrapper"},U.default.createElement(Fs,{setRetainRequestBodyValueFlag:function(Ko){return Ki.setRetainRequestBodyValueFlag({value:Ko,pathMethod:uo})},userHasEditedBody:to.hasUserEditedBody.apply(to,(0,Od.default)(uo)),specPath:(0,Le.default)(Fn).call(Fn,0,-1).push("requestBody"),requestBody:js,requestBodyValue:to.requestBodyValue.apply(to,(0,Od.default)(uo)),requestBodyInclusionSetting:to.requestBodyInclusionSetting.apply(to,(0,Od.default)(uo)),requestBodyErrors:to.requestBodyErrors.apply(to,(0,Od.default)(uo)),isExecute:Cs,getConfigs:ui,activeExamplesKey:to.activeExamplesMember.apply(to,(0,o.default)(Qe=(0,Od.default)(uo)).call(Qe,["requestBody","requestBody"])),updateActiveExamplesKey:function(Ko){et.props.oas3Actions.setActiveExamplesMember({name:Ko,pathMethod:et.props.pathMethod,contextType:"requestBody",contextName:"requestBody"})},onChange:function(Ko,na){if(na){var vl=to.requestBodyValue.apply(to,(0,Od.default)(uo)),ud=ht.Map.isMap(vl)?vl:(0,ht.Map)();return Ki.setRequestBodyValue({pathMethod:uo,value:ud.setIn(na,Ko)})}Ki.setRequestBodyValue({value:Ko,pathMethod:uo})},onChangeIncludeEmpty:function(Ko,na){Ki.setRequestBodyInclusion({pathMethod:uo,value:na,name:Ko})},contentType:to.requestContentType.apply(to,(0,Od.default)(uo))}))))}}]),ft}(U.Component);(0,W.default)(_S,"defaultProps",{onTryoutClick:Function.prototype,onCancelClick:Function.prototype,tryItOutEnabled:!1,allowTryItOut:!0,onChangeKey:[],specPath:[]});const PA=function(bn){return U.default.createElement("div",{className:"parameter__extension"},bn.xKey,": ",String(bn.xVal))};var gS=function(bn){(0,lo.default)(ft,bn);var Kt=(0,go.default)(ft);function ft(){var Je,Qe;(0,re.default)(this,ft);for(var et=arguments.length,At=new Array(et),Ot=0;Ot<et;Ot++)At[Ot]=arguments[Ot];return Qe=Kt.call.apply(Kt,(0,o.default)(Je=[this]).call(Je,At)),(0,W.default)((0,wi.default)(Qe),"onCheckboxChange",function(Vt){(0,Qe.props.onChange)(Vt.target.checked)}),Qe}return(0,ie.default)(ft,[{key:"componentDidMount",value:function(){var Je=this.props,Qe=Je.isIncludedOptions;Qe.shouldDispatchInit&&(0,Je.onChange)(Qe.defaultValue)}},{key:"render",value:function(){var Je=this.props,Qe=Je.isIncluded,et=Je.isDisabled;return U.default.createElement("div",null,U.default.createElement("label",{className:(0,If.default)("parameter__empty_value_toggle",{disabled:et})},U.default.createElement("input",{type:"checkbox",disabled:et,checked:!et&&Qe,onChange:this.onCheckboxChange}),"Send empty value"))}}]),ft}(U.Component);(0,W.default)(gS,"defaultProps",{onChange:function(){},isIncludedOptions:{}});var Sb=wo(9069),LA=function(bn){(0,lo.default)(ft,bn);var Kt=(0,go.default)(ft);function ft(Je,Qe){var et;return(0,re.default)(this,ft),et=Kt.call(this,Je,Qe),(0,W.default)((0,wi.default)(et),"onChangeWrapper",function(At){var Ot=arguments.length>1&&void 0!==arguments[1]&&arguments[1],Vt=et.props,Sn=Vt.onChange,jn=Vt.rawParam;return Sn(jn,""===At||At&&0===At.size?null:At,Ot)}),(0,W.default)((0,wi.default)(et),"_onExampleSelect",function(At){et.props.oas3Actions.setActiveExamplesMember({name:At,pathMethod:et.props.pathMethod,contextType:"parameters",contextName:et.getParamKey()})}),(0,W.default)((0,wi.default)(et),"onChangeIncludeEmpty",function(At){var Ot=et.props,Vt=Ot.specActions,Sn=Ot.param,jn=Ot.pathMethod,Fn=Sn.get("name"),tr=Sn.get("in");return Vt.updateEmptyParamInclusion(jn,Fn,tr,At)}),(0,W.default)((0,wi.default)(et),"setDefaultValue",function(){var At=et.props,Ot=At.specSelectors,Vt=At.pathMethod,jn=At.oas3Selectors,Fn=Ot.parameterWithMetaByIdentity(Vt,At.rawParam)||(0,ht.Map)(),tr=(0,Sb.Z)(Fn,{isOAS3:Ot.isOAS3()}).schema,pi=Fn.get("content",(0,ht.Map)()).keySeq().first(),ui=tr?(0,Mn.xi)(tr.toJS(),pi,{includeWriteOnly:!0}):null;if(Fn&&void 0===Fn.get("value")&&"body"!==Fn.get("in")){var Mi;if(Ot.isSwagger2())Mi=void 0!==Fn.get("x-example")?Fn.get("x-example"):void 0!==Fn.getIn(["schema","example"])?Fn.getIn(["schema","example"]):tr&&tr.getIn(["default"]);else if(Ot.isOAS3()){var Di,uo=jn.activeExamplesMember.apply(jn,(0,o.default)(Di=(0,Od.default)(Vt)).call(Di,["parameters",et.getParamKey()]));Mi=void 0!==Fn.getIn(["examples",uo,"value"])?Fn.getIn(["examples",uo,"value"]):void 0!==Fn.getIn(["content",pi,"example"])?Fn.getIn(["content",pi,"example"]):void 0!==Fn.get("example")?Fn.get("example"):void 0!==(tr&&tr.get("example"))?tr&&tr.get("example"):void 0!==(tr&&tr.get("default"))?tr&&tr.get("default"):Fn.get("default")}void 0===Mi||ht.List.isList(Mi)||(Mi=(0,Mn.Pz)(Mi)),void 0!==Mi?et.onChangeWrapper(Mi):tr&&"object"===tr.get("type")&&ui&&!Fn.get("examples")&&et.onChangeWrapper(ht.List.isList(ui)?ui:(0,Mn.Pz)(ui))}}),et.setDefaultValue(),et}return(0,ie.default)(ft,[{key:"UNSAFE_componentWillReceiveProps",value:function(Je){var Qe,et=Je.specSelectors,At=Je.pathMethod,Ot=Je.rawParam,Vt=et.isOAS3(),Sn=et.parameterWithMetaByIdentity(At,Ot)||new ht.Map;if(Sn=Sn.isEmpty()?Ot:Sn,Vt){var jn=(0,Sb.Z)(Sn,{isOAS3:Vt}).schema;Qe=jn?jn.get("enum"):void 0}else Qe=Sn?Sn.get("enum"):void 0;var Fn,tr=Sn?Sn.get("value"):void 0;void 0!==tr?Fn=tr:Ot.get("required")&&Qe&&Qe.size&&(Fn=Qe.first()),void 0!==Fn&&Fn!==tr&&this.onChangeWrapper((0,Mn.D$)(Fn)),this.setDefaultValue()}},{key:"getParamKey",value:function(){var Je,Qe=this.props.param;return Qe?(0,o.default)(Je="".concat(Qe.get("name"),"-")).call(Je,Qe.get("in")):null}},{key:"render",value:function(){var Je,Qe,et,At,Ot=this.props,Vt=Ot.param,Sn=Ot.rawParam,jn=Ot.getComponent,Fn=Ot.getConfigs,tr=Ot.isExecute,pi=Ot.fn,ui=Ot.onChangeConsumes,Mi=Ot.specSelectors,Di=Ot.pathMethod,uo=Ot.specPath,Ki=Ot.oas3Selectors,to=Mi.isOAS3(),ys=Fn(),Ls=ys.showExtensions,ta=ys.showCommonExtensions;if(Vt||(Vt=Sn),!Sn)return null;var Ds,Rs,Fs,Cs,Fa=jn("JsonSchemaForm"),js=jn("ParamBody"),Ca=Vt.get("in"),Ko="body"!==Ca?null:U.default.createElement(js,{getComponent:jn,getConfigs:Fn,fn:pi,param:Vt,consumes:Mi.consumesOptionsFor(Di),consumesValue:Mi.contentTypeValues(Di).get("requestContentType"),onChange:this.onChangeWrapper,onChangeConsumes:ui,isExecute:tr,specSelectors:Mi,pathMethod:Di}),na=jn("modelExample"),vl=jn("Markdown",!0),ud=jn("ParameterExt"),af=jn("ParameterIncludeEmpty"),lf=jn("ExamplesSelectValueRetainer"),Lf=jn("Example"),iu=(0,Sb.Z)(Vt,{isOAS3:to}).schema,cd=Mi.parameterWithMetaByIdentity(Di,Sn)||(0,ht.Map)(),uc=iu?iu.get("format"):null,cp=iu?iu.get("type"):null,Qf=iu?iu.getIn(["items","type"]):null,L_="formData"===Ca,jd="FormData"in Dn.Z,cc=Vt.get("required"),Gd=cd?cd.get("value"):"",uf=ta?(0,Mn.po)(iu):null,cf=Ls?(0,Mn.nX)(Vt):null,Sh=!1;return void 0!==Vt&&iu&&(Ds=iu.get("items")),void 0!==Ds?(Rs=Ds.get("enum"),Fs=Ds.get("default")):iu&&(Rs=iu.get("enum")),Rs&&Rs.size&&Rs.size>0&&(Sh=!0),void 0!==Vt&&(iu&&(Fs=iu.get("default")),void 0===Fs&&(Fs=Vt.get("default")),void 0===(Cs=Vt.get("example"))&&(Cs=Vt.get("x-example"))),U.default.createElement("tr",{"data-param-name":Vt.get("name"),"data-param-in":Vt.get("in")},U.default.createElement("td",{className:"parameters-col_name"},U.default.createElement("div",{className:cc?"parameter__name required":"parameter__name"},Vt.get("name"),cc?U.default.createElement("span",null,"\xa0*"):null),U.default.createElement("div",{className:"parameter__type"},cp,Qf&&"[".concat(Qf,"]"),uc&&U.default.createElement("span",{className:"prop-format"},"($",uc,")")),U.default.createElement("div",{className:"parameter__deprecated"},to&&Vt.get("deprecated")?"deprecated":null),U.default.createElement("div",{className:"parameter__in"},"(",Vt.get("in"),")"),ta&&uf.size?(0,xe.default)(Je=uf.entrySeq()).call(Je,function(wd){var xd,Af=(0,qa.default)(wd,2),Ch=Af[0],Tm=Af[1];return U.default.createElement(ud,{key:(0,o.default)(xd="".concat(Ch,"-")).call(xd,Tm),xKey:Ch,xVal:Tm})}):null,Ls&&cf.size?(0,xe.default)(Qe=cf.entrySeq()).call(Qe,function(wd){var xd,Af=(0,qa.default)(wd,2),Ch=Af[0],Tm=Af[1];return U.default.createElement(ud,{key:(0,o.default)(xd="".concat(Ch,"-")).call(xd,Tm),xKey:Ch,xVal:Tm})}):null),U.default.createElement("td",{className:"parameters-col_description"},Vt.get("description")?U.default.createElement(vl,{source:Vt.get("description")}):null,!Ko&&tr||!Sh?null:U.default.createElement(vl,{className:"parameter__enum",source:"<i>Available values</i> : "+(0,xe.default)(Rs).call(Rs,function(wd){return wd}).toArray().join(", ")}),!Ko&&tr||void 0===Fs?null:U.default.createElement(vl,{className:"parameter__default",source:"<i>Default value</i> : "+Fs}),!Ko&&tr||void 0===Cs?null:U.default.createElement(vl,{source:"<i>Example</i> : "+Cs}),L_&&!jd&&U.default.createElement("div",null,"Error: your browser does not support FormData"),to&&Vt.get("examples")?U.default.createElement("section",{className:"parameter-controls"},U.default.createElement(lf,{examples:Vt.get("examples"),onSelect:this._onExampleSelect,updateValue:this.onChangeWrapper,getComponent:jn,defaultToFirstExample:!0,currentKey:Ki.activeExamplesMember.apply(Ki,(0,o.default)(et=(0,Od.default)(Di)).call(et,["parameters",this.getParamKey()])),currentUserInputValue:Gd})):null,Ko?null:U.default.createElement(Fa,{fn:pi,getComponent:jn,value:Gd,required:cc,disabled:!tr,description:Vt.get("name"),onChange:this.onChangeWrapper,errors:cd.get("errors"),schema:iu}),Ko&&iu?U.default.createElement(na,{getComponent:jn,specPath:uo.push("schema"),getConfigs:Fn,isExecute:tr,specSelectors:Mi,schema:iu,example:Ko,includeWriteOnly:!0}):null,!Ko&&tr&&Vt.get("allowEmptyValue")?U.default.createElement(af,{onChange:this.onChangeIncludeEmpty,isIncluded:Mi.parameterInclusionSettingFor(Di,Vt.get("name"),Vt.get("in")),isDisabled:!(0,Mn.O2)(Gd)}):null,to&&Vt.get("examples")?U.default.createElement(Lf,{example:Vt.getIn(["examples",Ki.activeExamplesMember.apply(Ki,(0,o.default)(At=(0,Od.default)(Di)).call(At,["parameters",this.getParamKey()]))]),getComponent:jn,getConfigs:Fn}):null))}}]),ft}(U.Component),FA=wo(6235),kA=function(bn){(0,lo.default)(ft,bn);var Kt=(0,go.default)(ft);function ft(){var Je,Qe;(0,re.default)(this,ft);for(var et=arguments.length,At=new Array(et),Ot=0;Ot<et;Ot++)At[Ot]=arguments[Ot];return Qe=Kt.call.apply(Kt,(0,o.default)(Je=[this]).call(Je,At)),(0,W.default)((0,wi.default)(Qe),"handleValidateParameters",function(){var Vt=Qe.props,Sn=Vt.specSelectors,Fn=Vt.path,tr=Vt.method;return Vt.specActions.validateParams([Fn,tr]),Sn.validateBeforeExecute([Fn,tr])}),(0,W.default)((0,wi.default)(Qe),"handleValidateRequestBody",function(){var Vt=Qe.props,Sn=Vt.path,jn=Vt.method,Fn=Vt.specSelectors,tr=Vt.oas3Selectors,pi=Vt.oas3Actions,ui={missingBodyValue:!1,missingRequiredKeys:[]};pi.clearRequestBodyValidateError({path:Sn,method:jn});var Mi=Fn.getOAS3RequiredRequestBodyContentType([Sn,jn]),Di=tr.requestBodyValue(Sn,jn),uo=tr.validateBeforeExecute([Sn,jn]),Ki=tr.requestContentType(Sn,jn);if(!uo)return ui.missingBodyValue=!0,pi.setRequestBodyValidateError({path:Sn,method:jn,validationErrors:ui}),!1;if(!Mi)return!0;var to=tr.validateShallowRequired({oas3RequiredRequestBodyContentType:Mi,oas3RequestContentType:Ki,oas3RequestBodyValue:Di});return!to||to.length<1||((0,Du.default)(to).call(to,function(ys){ui.missingRequiredKeys.push(ys)}),pi.setRequestBodyValidateError({path:Sn,method:jn,validationErrors:ui}),!1)}),(0,W.default)((0,wi.default)(Qe),"handleValidationResultPass",function(){var Vt=Qe.props,Sn=Vt.specActions,jn=Vt.operation,Fn=Vt.path,tr=Vt.method;Qe.props.onExecute&&Qe.props.onExecute(),Sn.execute({operation:jn,path:Fn,method:tr})}),(0,W.default)((0,wi.default)(Qe),"handleValidationResultFail",function(){var Vt=Qe.props,Sn=Vt.specActions,jn=Vt.path,Fn=Vt.method;Sn.clearValidateParams([jn,Fn]),(0,FA.default)(function(){Sn.validateParams([jn,Fn])},40)}),(0,W.default)((0,wi.default)(Qe),"handleValidationResult",function(Vt){Vt?Qe.handleValidationResultPass():Qe.handleValidationResultFail()}),(0,W.default)((0,wi.default)(Qe),"onClick",function(){var Vt=Qe.handleValidateParameters(),Sn=Qe.handleValidateRequestBody();Qe.handleValidationResult(Vt&&Sn)}),(0,W.default)((0,wi.default)(Qe),"onChangeProducesWrapper",function(Vt){return Qe.props.specActions.changeProducesValue([Qe.props.path,Qe.props.method],Vt)}),Qe}return(0,ie.default)(ft,[{key:"render",value:function(){return U.default.createElement("button",{className:"btn execute opblock-control__btn",onClick:this.onClick,disabled:this.props.disabled},"Execute")}}]),ft}(U.Component),za=function(bn){(0,lo.default)(ft,bn);var Kt=(0,go.default)(ft);function ft(){return(0,re.default)(this,ft),Kt.apply(this,arguments)}return(0,ie.default)(ft,[{key:"render",value:function(){var Je,Qe=this.props,et=Qe.headers,At=Qe.getComponent,Ot=At("Property"),Vt=At("Markdown",!0);return et&&et.size?U.default.createElement("div",{className:"headers-wrapper"},U.default.createElement("h4",{className:"headers__title"},"Headers:"),U.default.createElement("table",{className:"headers"},U.default.createElement("thead",null,U.default.createElement("tr",{className:"header-row"},U.default.createElement("th",{className:"header-col"},"Name"),U.default.createElement("th",{className:"header-col"},"Description"),U.default.createElement("th",{className:"header-col"},"Type"))),U.default.createElement("tbody",null,(0,xe.default)(Je=et.entrySeq()).call(Je,function(Sn){var jn=(0,qa.default)(Sn,2),Fn=jn[0],tr=jn[1];if(!ht.default.Map.isMap(tr))return null;var pi=tr.get("description"),ui=tr.getIn(["schema"])?tr.getIn(["schema","type"]):tr.getIn(["type"]),Mi=tr.getIn(["schema","example"]);return U.default.createElement("tr",{key:Fn},U.default.createElement("td",{className:"header-col"},Fn),U.default.createElement("td",{className:"header-col"},pi?U.default.createElement(Vt,{source:pi}):null),U.default.createElement("td",{className:"header-col"},ui," ",Mi?U.default.createElement(Ot,{propKey:"Example",propVal:Mi,propClass:"header-example"}):null))}).toArray()))):null}}]),ft}(U.default.Component),Fu=function(bn){(0,lo.default)(ft,bn);var Kt=(0,go.default)(ft);function ft(){return(0,re.default)(this,ft),Kt.apply(this,arguments)}return(0,ie.default)(ft,[{key:"render",value:function(){var Je=this.props,Qe=Je.editorActions,et=Je.errSelectors,At=Je.layoutSelectors,Ot=Je.layoutActions,Vt=(0,Je.getComponent)("Collapse");if(Qe&&Qe.jumpToLine)var Sn=Qe.jumpToLine;var jn=et.allErrors(),Fn=(0,g.default)(jn).call(jn,function(ui){return"thrown"===ui.get("type")||"error"===ui.get("level")});if(!Fn||Fn.count()<1)return null;var tr=At.isShown(["errorPane"],!0),pi=Fn.sortBy(function(ui){return ui.get("line")});return U.default.createElement("pre",{className:"errors-wrapper"},U.default.createElement("hgroup",{className:"error"},U.default.createElement("h4",{className:"errors__title"},"Errors"),U.default.createElement("button",{className:"btn errors__clear-btn",onClick:function(){return Ot.show(["errorPane"],!tr)}},tr?"Hide":"Show")),U.default.createElement(Vt,{isOpened:tr,animated:!0},U.default.createElement("div",{className:"errors"},(0,xe.default)(pi).call(pi,function(ui,Mi){var Di=ui.get("type");return"thrown"===Di||"auth"===Di?U.default.createElement(ld,{key:Mi,error:ui.get("error")||ui,jumpToLine:Sn}):"spec"===Di?U.default.createElement(R0,{key:Mi,error:ui,jumpToLine:Sn}):void 0}))))}}]),ft}(U.default.Component),ld=function(bn){var Kt=bn.error,ft=bn.jumpToLine;if(!Kt)return null;var Je=Kt.get("line");return U.default.createElement("div",{className:"error-wrapper"},Kt?U.default.createElement("div",null,U.default.createElement("h4",null,Kt.get("source")&&Kt.get("level")?u1(Kt.get("source"))+" "+Kt.get("level"):"",Kt.get("path")?U.default.createElement("small",null," at ",Kt.get("path")):null),U.default.createElement("span",{className:"message thrown"},Kt.get("message")),U.default.createElement("div",{className:"error-line"},Je&&ft?U.default.createElement("a",{onClick:(0,ge.default)(ft).call(ft,null,Je)},"Jump to line ",Je):null)):null)},R0=function(bn){var Kt=bn.error,ft=bn.jumpToLine,Je=null;return Kt.get("path")?Je=ht.List.isList(Kt.get("path"))?U.default.createElement("small",null,"at ",Kt.get("path").join(".")):U.default.createElement("small",null,"at ",Kt.get("path")):Kt.get("line")&&!ft&&(Je=U.default.createElement("small",null,"on line ",Kt.get("line"))),U.default.createElement("div",{className:"error-wrapper"},Kt?U.default.createElement("div",null,U.default.createElement("h4",null,u1(Kt.get("source"))+" "+Kt.get("level"),"\xa0",Je),U.default.createElement("span",{className:"message"},Kt.get("message")),U.default.createElement("div",{className:"error-line"},ft?U.default.createElement("a",{onClick:(0,ge.default)(ft).call(ft,null,Kt.get("line"))},"Jump to line ",Kt.get("line")):null)):null)};function u1(bn){var Kt;return(0,xe.default)(Kt=(bn||"").split(" ")).call(Kt,function(ft){return ft[0].toUpperCase()+(0,Le.default)(ft).call(ft,1)}).join(" ")}ld.defaultProps={jumpToLine:null};var N0=function(bn){(0,lo.default)(ft,bn);var Kt=(0,go.default)(ft);function ft(){var Je,Qe;(0,re.default)(this,ft);for(var et=arguments.length,At=new Array(et),Ot=0;Ot<et;Ot++)At[Ot]=arguments[Ot];return Qe=Kt.call.apply(Kt,(0,o.default)(Je=[this]).call(Je,At)),(0,W.default)((0,wi.default)(Qe),"onChangeWrapper",function(Vt){return Qe.props.onChange(Vt.target.value)}),Qe}return(0,ie.default)(ft,[{key:"componentDidMount",value:function(){this.props.contentTypes&&this.props.onChange(this.props.contentTypes.first())}},{key:"UNSAFE_componentWillReceiveProps",value:function(Je){var Qe;Je.contentTypes&&Je.contentTypes.size&&((0,ru.default)(Qe=Je.contentTypes).call(Qe,Je.value)||Je.onChange(Je.contentTypes.first()))}},{key:"render",value:function(){var Je=this.props,Ot=Je.contentTypes;return Ot&&Ot.size?U.default.createElement("div",{className:"content-type-wrapper "+(Je.className||"")},U.default.createElement("select",{"aria-controls":Je.ariaControls,"aria-label":Je.ariaLabel,className:"content-type",id:Je.controlId,onChange:this.onChangeWrapper,value:Je.value||""},(0,xe.default)(Ot).call(Ot,function(jn){return U.default.createElement("option",{key:jn,value:jn},jn)}).toArray())):null}}]),ft}(U.default.Component);(0,W.default)(N0,"defaultProps",{onChange:function(){},value:null,contentTypes:(0,ht.fromJS)(["application/json"])});var Fp=wo(863),c1=wo(302),p7=wo(5942),h7=["fullscreen","full"],_7=["hide","keepContents","mobile","tablet","desktop","large"];function mS(){for(var bn,Kt=arguments.length,ft=new Array(Kt),Je=0;Je<Kt;Je++)ft[Je]=arguments[Je];return(0,p7.default)(bn=(0,g.default)(ft).call(ft,function(Qe){return!!Qe}).join(" ")).call(bn)}var g7=function(bn){(0,lo.default)(ft,bn);var Kt=(0,go.default)(ft);function ft(){return(0,re.default)(this,ft),Kt.apply(this,arguments)}return(0,ie.default)(ft,[{key:"render",value:function(){var Je=this.props,Qe=Je.fullscreen,et=Je.full,At=(0,c1.default)(Je,h7);return U.default.createElement("section",Qe?At:(0,Fp.default)({},At,{className:mS(At.className,"swagger-container"+(et?"-full":""))}))}}]),ft}(U.default.Component),sR={mobile:"",tablet:"-tablet",desktop:"-desktop",large:"-hd"},m7=function(bn){(0,lo.default)(ft,bn);var Kt=(0,go.default)(ft);function ft(){return(0,re.default)(this,ft),Kt.apply(this,arguments)}return(0,ie.default)(ft,[{key:"render",value:function(){var Je,Qe=this.props,et=Qe.hide,At=Qe.keepContents,Ot=(0,c1.default)(Qe,_7);if(et&&!At)return U.default.createElement("span",null);var Vt=[];for(var Sn in sR)if(Object.prototype.hasOwnProperty.call(sR,Sn)){var jn=sR[Sn];if(Sn in this.props){var Fn=this.props[Sn];if(Fn<1){Vt.push("none"+jn);continue}Vt.push("block"+jn),Vt.push("col-"+Fn+jn)}}et&&Vt.push("hidden");var tr=mS.apply(void 0,(0,o.default)(Je=[Ot.className]).call(Je,Vt));return U.default.createElement("section",(0,Fp.default)({},Ot,{className:tr}))}}]),ft}(U.default.Component),v7=function(bn){(0,lo.default)(ft,bn);var Kt=(0,go.default)(ft);function ft(){return(0,re.default)(this,ft),Kt.apply(this,arguments)}return(0,ie.default)(ft,[{key:"render",value:function(){return U.default.createElement("div",(0,Fp.default)({},this.props,{className:mS(this.props.className,"wrapper")}))}}]),ft}(U.default.Component),bP=function(bn){(0,lo.default)(ft,bn);var Kt=(0,go.default)(ft);function ft(){return(0,re.default)(this,ft),Kt.apply(this,arguments)}return(0,ie.default)(ft,[{key:"render",value:function(){return U.default.createElement("button",(0,Fp.default)({},this.props,{className:mS(this.props.className,"button")}))}}]),ft}(U.default.Component);(0,W.default)(bP,"defaultProps",{className:""});var y7=function(bn){return U.default.createElement("textarea",bn)},b7=function(bn){return U.default.createElement("input",bn)},EP=function(bn){(0,lo.default)(ft,bn);var Kt=(0,go.default)(ft);function ft(Je,Qe){var et;return(0,re.default)(this,ft),et=Kt.call(this,Je,Qe),(0,W.default)((0,wi.default)(et),"onChange",function(Ot){var Vt,Sn,jn=et.props,Fn=jn.onChange,tr=jn.multiple,pi=(0,Le.default)([]).call(Ot.target.options);Vt=tr?(0,xe.default)(Sn=(0,g.default)(pi).call(pi,function(ui){return ui.selected})).call(Sn,function(ui){return ui.value}):Ot.target.value,et.setState({value:Vt}),Fn&&Fn(Vt)}),et.state={value:Je.value?Je.value:Je.multiple?[""]:""},et}return(0,ie.default)(ft,[{key:"UNSAFE_componentWillReceiveProps",value:function(Je){Je.value!==this.props.value&&this.setState({value:Je.value})}},{key:"render",value:function(){var Je,Qe,et=this.props,At=et.allowedValues,Ot=et.multiple,Vt=et.allowEmptyValue,Sn=et.disabled,jn=(null===(Je=this.state.value)||void 0===Je||null===(Qe=Je.toJS)||void 0===Qe?void 0:Qe.call(Je))||this.state.value;return U.default.createElement("select",{className:this.props.className,multiple:Ot,value:jn,onChange:this.onChange,disabled:Sn},Vt?U.default.createElement("option",{value:""},"--"):null,(0,xe.default)(At).call(At,function(Fn,tr){return U.default.createElement("option",{key:tr,value:String(Fn)},String(Fn))}))}}]),ft}(U.default.Component);(0,W.default)(EP,"defaultProps",{multiple:!1,allowEmptyValue:!0});var TP=function(bn){(0,lo.default)(ft,bn);var Kt=(0,go.default)(ft);function ft(){return(0,re.default)(this,ft),Kt.apply(this,arguments)}return(0,ie.default)(ft,[{key:"render",value:function(){return U.default.createElement("a",(0,Fp.default)({},this.props,{rel:"noopener noreferrer",className:mS(this.props.className,"link")}))}}]),ft}(U.default.Component),SP=function(bn){return U.default.createElement("div",{className:"no-margin"}," ",bn.children," ")},CP=function(bn){(0,lo.default)(ft,bn);var Kt=(0,go.default)(ft);function ft(){return(0,re.default)(this,ft),Kt.apply(this,arguments)}return(0,ie.default)(ft,[{key:"renderNotAnimated",value:function(){return this.props.isOpened?U.default.createElement(SP,null,this.props.children):U.default.createElement("noscript",null)}},{key:"render",value:function(){var Je=this.props,At=Je.children;return Je.animated?U.default.createElement(SP,null,At=Je.isOpened?At:null):this.renderNotAnimated()}}]),ft}(U.default.Component);(0,W.default)(CP,"defaultProps",{isOpened:!1,animated:!1});var E7=function(bn){(0,lo.default)(ft,bn);var Kt=(0,go.default)(ft);function ft(){var Je,Qe,et;(0,re.default)(this,ft);for(var At=arguments.length,Ot=new Array(At),Vt=0;Vt<At;Vt++)Ot[Vt]=arguments[Vt];return(et=Kt.call.apply(Kt,(0,o.default)(Je=[this]).call(Je,Ot))).setTagShown=(0,ge.default)(Qe=et._setTagShown).call(Qe,(0,wi.default)(et)),et}return(0,ie.default)(ft,[{key:"_setTagShown",value:function(Je,Qe){this.props.layoutActions.show(Je,Qe)}},{key:"showOp",value:function(Je,Qe){this.props.layoutActions.show(Je,Qe)}},{key:"render",value:function(){var Je=this.props,et=Je.layoutSelectors,At=Je.layoutActions,Ot=Je.getComponent,Vt=Je.specSelectors.taggedOperations(),Sn=Ot("Collapse");return U.default.createElement("div",null,U.default.createElement("h4",{className:"overview-title"},"Overview"),(0,xe.default)(Vt).call(Vt,function(jn,Fn){var tr=jn.get("operations"),pi=["overview-tags",Fn],ui=et.isShown(pi,!0);return U.default.createElement("div",{key:"overview-"+Fn},U.default.createElement("h4",{onClick:function(){return At.show(pi,!ui)},className:"link overview-tag"}," ",ui?"-":"+",Fn),U.default.createElement(Sn,{isOpened:ui,animated:!0},(0,xe.default)(tr).call(tr,function(Mi){var Di=Mi.toObject(),uo=Di.path,Ki=Di.method,to=Di.id,ys="operations",Ls=to,ta=et.isShown([ys,Ls]);return U.default.createElement(T7,{key:to,path:uo,method:Ki,id:uo+"-"+Ki,shown:ta,showOpId:Ls,showOpIdPrefix:ys,href:"#operation-".concat(Ls),onClick:At.show})}).toArray()))}).toArray(),Vt.size<1&&U.default.createElement("h3",null," No operations defined in spec! "))}}]),ft}(U.default.Component),T7=function(bn){(0,lo.default)(ft,bn);var Kt=(0,go.default)(ft);function ft(Je){var Qe,et;return(0,re.default)(this,ft),(et=Kt.call(this,Je)).onClick=(0,ge.default)(Qe=et._onClick).call(Qe,(0,wi.default)(et)),et}return(0,ie.default)(ft,[{key:"_onClick",value:function(){var Je=this.props;(0,Je.onClick)([Je.showOpIdPrefix,Je.showOpId],!Je.shown)}},{key:"render",value:function(){var Je=this.props,Qe=Je.id,et=Je.method;return U.default.createElement(TP,{href:Je.href,onClick:this.onClick,className:"block opblock-link ".concat(Je.shown?"shown":"")},U.default.createElement("div",null,U.default.createElement("small",{className:"bold-label-".concat(et)},et.toUpperCase()),U.default.createElement("span",{className:"bold-label"},Qe)))}}]),ft}(U.default.Component),S7=["value","defaultValue","initialValue"],C7=function(bn){(0,lo.default)(ft,bn);var Kt=(0,go.default)(ft);function ft(){return(0,re.default)(this,ft),Kt.apply(this,arguments)}return(0,ie.default)(ft,[{key:"componentDidMount",value:function(){this.props.initialValue&&(this.inputRef.value=this.props.initialValue)}},{key:"render",value:function(){var Je=this,et=(0,c1.default)(this.props,S7);return U.default.createElement("input",(0,Fp.default)({},et,{ref:function(At){return Je.inputRef=At}}))}}]),ft}(U.default.Component),M7=function(bn){(0,lo.default)(ft,bn);var Kt=(0,go.default)(ft);function ft(){return(0,re.default)(this,ft),Kt.apply(this,arguments)}return(0,ie.default)(ft,[{key:"render",value:function(){var Je=this.props;return U.default.createElement("pre",{className:"base-url"},"[ Base URL: ",Je.host,Je.basePath," ]")}}]),ft}(U.default.Component),A7=function(bn){(0,lo.default)(ft,bn);var Kt=(0,go.default)(ft);function ft(){return(0,re.default)(this,ft),Kt.apply(this,arguments)}return(0,ie.default)(ft,[{key:"render",value:function(){var Je=this.props,Qe=Je.data,et=Je.getComponent,At=Je.selectedServer,Ot=Je.url,Vt=Qe.get("name")||"the developer",Sn=Pi(Qe.get("url"),Ot,{selectedServer:At}),jn=Qe.get("email"),Fn=et("Link");return U.default.createElement("div",{className:"info__contact"},Sn&&U.default.createElement("div",null,U.default.createElement(Fn,{href:(0,Mn.Nm)(Sn),target:"_blank"},Vt," - Website")),jn&&U.default.createElement(Fn,{href:(0,Mn.Nm)("mailto:".concat(jn))},Sn?"Send email to ".concat(Vt):"Contact ".concat(Vt)))}}]),ft}(U.default.Component),O7=function(bn){(0,lo.default)(ft,bn);var Kt=(0,go.default)(ft);function ft(){return(0,re.default)(this,ft),Kt.apply(this,arguments)}return(0,ie.default)(ft,[{key:"render",value:function(){var Je=this.props,Qe=Je.license,At=Je.selectedServer,Ot=Je.url,Vt=(0,Je.getComponent)("Link"),Sn=Qe.get("name")||"License",jn=Pi(Qe.get("url"),Ot,{selectedServer:At});return U.default.createElement("div",{className:"info__license"},jn?U.default.createElement(Vt,{target:"_blank",href:(0,Mn.Nm)(jn)},Sn):U.default.createElement("span",null,Sn))}}]),ft}(U.default.Component),w7=function(bn){(0,lo.default)(ft,bn);var Kt=(0,go.default)(ft);function ft(){return(0,re.default)(this,ft),Kt.apply(this,arguments)}return(0,ie.default)(ft,[{key:"render",value:function(){var Je=this.props,Qe=Je.url,et=(0,Je.getComponent)("Link");return U.default.createElement(et,{target:"_blank",href:(0,Mn.Nm)(Qe)},U.default.createElement("span",{className:"url"}," ",Qe))}}]),ft}(U.default.PureComponent),x7=function(bn){(0,lo.default)(ft,bn);var Kt=(0,go.default)(ft);function ft(){return(0,re.default)(this,ft),Kt.apply(this,arguments)}return(0,ie.default)(ft,[{key:"render",value:function(){var Je=this.props,Qe=Je.info,et=Je.url,At=Je.host,Ot=Je.basePath,Vt=Je.getComponent,Sn=Je.externalDocs,jn=Je.selectedServer,Fn=Je.url,tr=Qe.get("version"),pi=Qe.get("description"),ui=Qe.get("title"),Mi=Pi(Qe.get("termsOfService"),Fn,{selectedServer:jn}),Di=Qe.get("contact"),uo=Qe.get("license"),Ki=Pi(Sn&&Sn.get("url"),Fn,{selectedServer:jn}),to=Sn&&Sn.get("description"),ys=Vt("Markdown",!0),Ls=Vt("Link"),ta=Vt("VersionStamp"),Ds=Vt("InfoUrl"),Rs=Vt("InfoBasePath");return U.default.createElement("div",{className:"info"},U.default.createElement("hgroup",{className:"main"},U.default.createElement("h2",{className:"title"},ui,tr&&U.default.createElement(ta,{version:tr})),At||Ot?U.default.createElement(Rs,{host:At,basePath:Ot}):null,et&&U.default.createElement(Ds,{getComponent:Vt,url:et})),U.default.createElement("div",{className:"description"},U.default.createElement(ys,{source:pi})),Mi&&U.default.createElement("div",{className:"info__tos"},U.default.createElement(Ls,{target:"_blank",href:(0,Mn.Nm)(Mi)},"Terms of service")),Di&&Di.size?U.default.createElement(A7,{getComponent:Vt,data:Di,selectedServer:jn,url:et}):null,uo&&uo.size?U.default.createElement(O7,{getComponent:Vt,license:uo,selectedServer:jn,url:et}):null,Ki?U.default.createElement(Ls,{className:"info__extdocs",target:"_blank",href:(0,Mn.Nm)(Ki)},to||Ki):null)}}]),ft}(U.default.Component),D7=function(bn){(0,lo.default)(ft,bn);var Kt=(0,go.default)(ft);function ft(){return(0,re.default)(this,ft),Kt.apply(this,arguments)}return(0,ie.default)(ft,[{key:"render",value:function(){var Je=this.props,Qe=Je.specSelectors,et=Je.getComponent,At=Je.oas3Selectors,Ot=Qe.info(),Vt=Qe.url(),Sn=Qe.basePath(),jn=Qe.host(),Fn=Qe.externalDocs(),tr=At.selectedServer(),pi=et("info");return U.default.createElement("div",null,Ot&&Ot.count()?U.default.createElement(pi,{info:Ot,url:Vt,host:jn,basePath:Sn,externalDocs:Fn,getComponent:et,selectedServer:tr}):null)}}]),ft}(U.default.Component),R7=function(bn){(0,lo.default)(ft,bn);var Kt=(0,go.default)(ft);function ft(){return(0,re.default)(this,ft),Kt.apply(this,arguments)}return(0,ie.default)(ft,[{key:"render",value:function(){return null}}]),ft}(U.default.Component),N7=function(bn){(0,lo.default)(ft,bn);var Kt=(0,go.default)(ft);function ft(){return(0,re.default)(this,ft),Kt.apply(this,arguments)}return(0,ie.default)(ft,[{key:"render",value:function(){return U.default.createElement("div",{className:"footer"})}}]),ft}(U.default.Component),P7=function(bn){(0,lo.default)(ft,bn);var Kt=(0,go.default)(ft);function ft(){var Je,Qe;(0,re.default)(this,ft);for(var et=arguments.length,At=new Array(et),Ot=0;Ot<et;Ot++)At[Ot]=arguments[Ot];return Qe=Kt.call.apply(Kt,(0,o.default)(Je=[this]).call(Je,At)),(0,W.default)((0,wi.default)(Qe),"onFilterChange",function(Vt){Qe.props.layoutActions.updateFilter(Vt.target.value)}),Qe}return(0,ie.default)(ft,[{key:"render",value:function(){var Je=this.props,Qe=Je.specSelectors,et=Je.layoutSelectors,At=(0,Je.getComponent)("Col"),Ot="loading"===Qe.loadingStatus(),Vt="failed"===Qe.loadingStatus(),Sn=et.currentFilter(),jn=["operation-filter-input"];return Vt&&jn.push("failed"),Ot&&jn.push("loading"),U.default.createElement("div",null,null===Sn||!1===Sn||"false"===Sn?null:U.default.createElement("div",{className:"filter-container"},U.default.createElement(At,{className:"filter wrapper",mobile:12},U.default.createElement("input",{className:jn.join(" "),placeholder:"Filter by tag",type:"text",onChange:this.onFilterChange,value:!0===Sn||"true"===Sn?"":Sn,disabled:Ot}))))}}]),ft}(U.default.Component),aR=Function.prototype,MP=function(bn){(0,lo.default)(ft,bn);var Kt=(0,go.default)(ft);function ft(Je,Qe){var et;return(0,re.default)(this,ft),et=Kt.call(this,Je,Qe),(0,W.default)((0,wi.default)(et),"updateValues",function(At){var Ot=At.param,Vt=At.isExecute,Sn=At.consumesValue,jn=void 0===Sn?"":Sn,Fn=/xml/i.test(jn),tr=/json/i.test(jn),pi=Ot.get(Fn?"value_xml":"value");if(void 0!==pi){var ui=!pi&&tr?"{}":pi;et.setState({value:ui}),et.onChange(ui,{isXml:Fn,isEditBox:Vt})}else Fn?et.onChange(et.sample("xml"),{isXml:Fn,isEditBox:Vt}):et.onChange(et.sample(),{isEditBox:Vt})}),(0,W.default)((0,wi.default)(et),"sample",function(At){var Ot=et.props,Sn=(0,Ot.fn.inferSchema)(Ot.param.toJS());return(0,Mn.xi)(Sn,At,{includeWriteOnly:!0})}),(0,W.default)((0,wi.default)(et),"onChange",function(At,Ot){var Sn=Ot.isXml;et.setState({value:At,isEditBox:Ot.isEditBox}),et._onChange(At,Sn)}),(0,W.default)((0,wi.default)(et),"_onChange",function(At,Ot){(et.props.onChange||aR)(At,Ot)}),(0,W.default)((0,wi.default)(et),"handleOnChange",function(At){var Vt=/xml/i.test(et.props.consumesValue);et.onChange(At.target.value,{isXml:Vt,isEditBox:et.state.isEditBox})}),(0,W.default)((0,wi.default)(et),"toggleIsEditBox",function(){return et.setState(function(At){return{isEditBox:!At.isEditBox}})}),et.state={isEditBox:!1,value:""},et}return(0,ie.default)(ft,[{key:"componentDidMount",value:function(){this.updateValues.call(this,this.props)}},{key:"UNSAFE_componentWillReceiveProps",value:function(Je){this.updateValues.call(this,Je)}},{key:"render",value:function(){var Je=this.props,Qe=Je.onChangeConsumes,et=Je.param,At=Je.isExecute,Ot=Je.specSelectors,Vt=Je.pathMethod,Sn=Je.getConfigs,jn=Je.getComponent,Fn=jn("Button"),tr=jn("TextArea"),pi=jn("highlightCode"),ui=jn("contentType"),Mi=(Ot?Ot.parameterWithMetaByIdentity(Vt,et):et).get("errors",(0,ht.List)()),Di=Ot.contentTypeValues(Vt).get("requestContentType"),uo=this.props.consumes&&this.props.consumes.size?this.props.consumes:ft.defaultProp.consumes,Ki=this.state,to=Ki.value,ys=Ki.isEditBox,Ls=null;return(0,Pg.O)(to)&&(Ls="json"),U.default.createElement("div",{className:"body-param","data-param-name":et.get("name"),"data-param-in":et.get("in")},ys&&At?U.default.createElement(tr,{className:"body-param__text"+(Mi.count()?" invalid":""),value:to,onChange:this.handleOnChange}):to&&U.default.createElement(pi,{className:"body-param__example",language:Ls,getConfigs:Sn,value:to}),U.default.createElement("div",{className:"body-param-options"},At?U.default.createElement("div",{className:"body-param-edit"},U.default.createElement(Fn,{className:ys?"btn cancel body-param__example-edit":"btn edit body-param__example-edit",onClick:this.toggleIsEditBox},ys?"Cancel":"Edit")):null,U.default.createElement("label",{htmlFor:""},U.default.createElement("span",null,"Parameter content type"),U.default.createElement(ui,{value:Di,contentTypes:uo,onChange:Qe,className:"body-param-content-type",ariaLabel:"Parameter content type"}))))}}]),ft}(U.PureComponent);(0,W.default)(MP,"defaultProp",{consumes:(0,ht.fromJS)(["application/json"]),param:(0,ht.fromJS)({}),onChange:aR,onChangeConsumes:aR});var I7=wo(4624),L7=function(bn){(0,lo.default)(ft,bn);var Kt=(0,go.default)(ft);function ft(){return(0,re.default)(this,ft),Kt.apply(this,arguments)}return(0,ie.default)(ft,[{key:"render",value:function(){var Je=this.props,et=Je.getConfigs,At=(0,I7.requestSnippetGenerator_curl_bash)(Je.request),Ot=et(),Vt=(0,Ql.default)(Ot,"syntaxHighlight.activated")?U.default.createElement(Jp.d3,{language:"bash",className:"curl microlight",style:(0,Jp.C2)((0,Ql.default)(Ot,"syntaxHighlight.theme"))},At):U.default.createElement("textarea",{readOnly:!0,className:"curl",value:At});return U.default.createElement("div",{className:"curl-command"},U.default.createElement("h4",null,"Curl"),U.default.createElement("div",{className:"copy-to-clipboard"},U.default.createElement(Qp.CopyToClipboard,{text:At},U.default.createElement("button",null))),U.default.createElement("div",null,Vt))}}]),ft}(U.default.Component),F7=function(bn){(0,lo.default)(ft,bn);var Kt=(0,go.default)(ft);function ft(){var Je,Qe;(0,re.default)(this,ft);for(var et=arguments.length,At=new Array(et),Ot=0;Ot<et;Ot++)At[Ot]=arguments[Ot];return Qe=Kt.call.apply(Kt,(0,o.default)(Je=[this]).call(Je,At)),(0,W.default)((0,wi.default)(Qe),"onChange",function(Vt){Qe.setScheme(Vt.target.value)}),(0,W.default)((0,wi.default)(Qe),"setScheme",function(Vt){var Sn=Qe.props;Sn.specActions.setScheme(Vt,Sn.path,Sn.method)}),Qe}return(0,ie.default)(ft,[{key:"UNSAFE_componentWillMount",value:function(){this.setScheme(this.props.schemes.first())}},{key:"UNSAFE_componentWillReceiveProps",value:function(Je){var Qe;this.props.currentScheme&&(0,ru.default)(Qe=Je.schemes).call(Qe,this.props.currentScheme)||this.setScheme(Je.schemes.first())}},{key:"render",value:function(){var Je,Qe=this.props,et=Qe.schemes,At=Qe.currentScheme;return U.default.createElement("label",{htmlFor:"schemes"},U.default.createElement("span",{className:"schemes-title"},"Schemes"),U.default.createElement("select",{onChange:this.onChange,value:At},(0,xe.default)(Je=et.valueSeq()).call(Je,function(Ot){return U.default.createElement("option",{value:Ot,key:Ot},Ot)}).toArray()))}}]),ft}(U.default.Component),k7=function(bn){(0,lo.default)(ft,bn);var Kt=(0,go.default)(ft);function ft(){return(0,re.default)(this,ft),Kt.apply(this,arguments)}return(0,ie.default)(ft,[{key:"render",value:function(){var Je=this.props,Qe=Je.specActions,et=Je.specSelectors,At=Je.getComponent,Ot=et.operationScheme(),Vt=et.schemes(),Sn=At("schemes");return Vt&&Vt.size?U.default.createElement(Sn,{currentScheme:Ot,schemes:Vt,specActions:Qe}):null}}]),ft}(U.default.Component),AP=function(bn){(0,lo.default)(ft,bn);var Kt=(0,go.default)(ft);function ft(Je,Qe){var et;(0,re.default)(this,ft),et=Kt.call(this,Je,Qe),(0,W.default)((0,wi.default)(et),"toggleCollapsed",function(){et.props.onToggle&&et.props.onToggle(et.props.modelName,!et.state.expanded),et.setState({expanded:!et.state.expanded})}),(0,W.default)((0,wi.default)(et),"onLoad",function(Sn){if(Sn&&et.props.layoutSelectors){var jn=et.props.layoutSelectors.getScrollToKey();ht.default.is(jn,et.props.specPath)&&et.toggleCollapsed(),et.props.layoutActions.readyToScroll(et.props.specPath,Sn.parentElement)}});var At=et.props;return et.state={expanded:At.expanded,collapsedContent:At.collapsedContent||ft.defaultProps.collapsedContent},et}return(0,ie.default)(ft,[{key:"componentDidMount",value:function(){var Je=this.props,et=Je.expanded;Je.hideSelfOnExpand&&et&&this.props.onToggle(Je.modelName,et)}},{key:"UNSAFE_componentWillReceiveProps",value:function(Je){this.props.expanded!==Je.expanded&&this.setState({expanded:Je.expanded})}},{key:"render",value:function(){var Je=this.props,Qe=Je.title,et=Je.classes;return this.state.expanded&&this.props.hideSelfOnExpand?U.default.createElement("span",{className:et||""},this.props.children):U.default.createElement("span",{className:et||"",ref:this.onLoad},U.default.createElement("button",{"aria-expanded":this.state.expanded,className:"model-box-control",onClick:this.toggleCollapsed},Qe&&U.default.createElement("span",{className:"pointer"},Qe),U.default.createElement("span",{className:"model-toggle"+(this.state.expanded?"":" collapsed")}),!this.state.expanded&&U.default.createElement("span",null,this.state.collapsedContent)),this.state.expanded&&this.props.children)}}]),ft}(U.Component);(0,W.default)(AP,"defaultProps",{collapsedContent:"{...}",expanded:!1,title:null,onToggle:function(){},hideSelfOnExpand:!1,specPath:ht.default.List([])});var $7=wo(1798),$A=wo.n($7),H7=function(bn){(0,lo.default)(ft,bn);var Kt=(0,go.default)(ft);function ft(Je,Qe){var et;(0,re.default)(this,ft),et=Kt.call(this,Je,Qe),(0,W.default)((0,wi.default)(et),"activeTab",function(Fn){et.setState({activeTab:Fn.target.dataset.name})});var At=et.props,Vt=At.isExecute,Sn=(0,At.getConfigs)().defaultModelRendering,jn=Sn;return"example"!==Sn&&"model"!==Sn&&(jn="example"),Vt&&(jn="example"),et.state={activeTab:jn},et}return(0,ie.default)(ft,[{key:"UNSAFE_componentWillReceiveProps",value:function(Je){Je.isExecute&&!this.props.isExecute&&this.props.example&&this.setState({activeTab:"example"})}},{key:"render",value:function(){var Je=this.props,Qe=Je.getComponent,et=Je.specSelectors,At=Je.schema,Ot=Je.example,Vt=Je.isExecute,Sn=Je.getConfigs,jn=Je.specPath,Fn=Je.includeReadOnly,tr=Je.includeWriteOnly,pi=Sn().defaultModelExpandDepth,ui=Qe("ModelWrapper"),Mi=Qe("highlightCode"),Di=$A()(5).toString("base64"),uo=$A()(5).toString("base64"),Ki=$A()(5).toString("base64"),to=$A()(5).toString("base64"),ys=et.isOAS3();return U.default.createElement("div",{className:"model-example"},U.default.createElement("ul",{className:"tab",role:"tablist"},U.default.createElement("li",{className:(0,If.default)("tabitem",{active:"example"===this.state.activeTab}),role:"presentation"},U.default.createElement("button",{"aria-controls":uo,"aria-selected":"example"===this.state.activeTab,className:"tablinks","data-name":"example",id:Di,onClick:this.activeTab,role:"tab"},Vt?"Edit Value":"Example Value")),At&&U.default.createElement("li",{className:(0,If.default)("tabitem",{active:"model"===this.state.activeTab}),role:"presentation"},U.default.createElement("button",{"aria-controls":to,"aria-selected":"model"===this.state.activeTab,className:(0,If.default)("tablinks",{inactive:Vt}),"data-name":"model",id:Ki,onClick:this.activeTab,role:"tab"},ys?"Schema":"Model"))),"example"===this.state.activeTab&&U.default.createElement("div",{"aria-hidden":"example"!==this.state.activeTab,"aria-labelledby":Di,"data-name":"examplePanel",id:uo,role:"tabpanel",tabIndex:"0"},Ot||U.default.createElement(Mi,{value:"(no example available)",getConfigs:Sn})),"model"===this.state.activeTab&&U.default.createElement("div",{"aria-hidden":"example"===this.state.activeTab,"aria-labelledby":Ki,"data-name":"modelPanel",id:to,role:"tabpanel",tabIndex:"0"},U.default.createElement(ui,{schema:At,getComponent:Qe,getConfigs:Sn,specSelectors:et,expandDepth:pi,specPath:jn,includeReadOnly:Fn,includeWriteOnly:tr})))}}]),ft}(U.default.Component),U7=function(bn){(0,lo.default)(ft,bn);var Kt=(0,go.default)(ft);function ft(){var Je,Qe;(0,re.default)(this,ft);for(var et=arguments.length,At=new Array(et),Ot=0;Ot<et;Ot++)At[Ot]=arguments[Ot];return Qe=Kt.call.apply(Kt,(0,o.default)(Je=[this]).call(Je,At)),(0,W.default)((0,wi.default)(Qe),"onToggle",function(Vt,Sn){Qe.props.layoutActions&&Qe.props.layoutActions.show(Qe.props.fullPath,Sn)}),Qe}return(0,ie.default)(ft,[{key:"render",value:function(){var Je,Qe=this.props,At=Qe.getConfigs,Ot=(0,Qe.getComponent)("Model");return this.props.layoutSelectors&&(Je=this.props.layoutSelectors.isShown(this.props.fullPath)),U.default.createElement("div",{className:"model-box"},U.default.createElement(Ot,(0,Fp.default)({},this.props,{getConfigs:At,expanded:Je,depth:1,onToggle:this.onToggle,expandDepth:this.props.expandDepth||0})))}}]),ft}(U.Component),B7=wo(1543),Y7=function(bn){(0,lo.default)(ft,bn);var Kt=(0,go.default)(ft);function ft(){var Je,Qe;(0,re.default)(this,ft);for(var et=arguments.length,At=new Array(et),Ot=0;Ot<et;Ot++)At[Ot]=arguments[Ot];return Qe=Kt.call.apply(Kt,(0,o.default)(Je=[this]).call(Je,At)),(0,W.default)((0,wi.default)(Qe),"getSchemaBasePath",function(){return Qe.props.specSelectors.isOAS3()?["components","schemas"]:["definitions"]}),(0,W.default)((0,wi.default)(Qe),"getCollapsedContent",function(){return" "}),(0,W.default)((0,wi.default)(Qe),"handleToggle",function(Vt,Sn){var jn,Fn;Qe.props.layoutActions.show((0,o.default)(jn=[]).call(jn,(0,Od.default)(Qe.getSchemaBasePath()),[Vt]),Sn),Sn&&Qe.props.specActions.requestResolvedSubtree((0,o.default)(Fn=[]).call(Fn,(0,Od.default)(Qe.getSchemaBasePath()),[Vt]))}),(0,W.default)((0,wi.default)(Qe),"onLoadModels",function(Vt){Vt&&Qe.props.layoutActions.readyToScroll(Qe.getSchemaBasePath(),Vt)}),(0,W.default)((0,wi.default)(Qe),"onLoadModel",function(Vt){if(Vt){var Sn,jn=Vt.getAttribute("data-name");Qe.props.layoutActions.readyToScroll((0,o.default)(Sn=[]).call(Sn,(0,Od.default)(Qe.getSchemaBasePath()),[jn]),Vt)}}),Qe}return(0,ie.default)(ft,[{key:"render",value:function(){var Je,Qe=this,et=this.props,At=et.specSelectors,Ot=et.getComponent,Vt=et.layoutSelectors,Sn=et.layoutActions,jn=et.getConfigs,Fn=At.definitions(),tr=jn(),pi=tr.docExpansion,ui=tr.defaultModelsExpandDepth;if(!Fn.size||ui<0)return null;var Mi=this.getSchemaBasePath(),Di=Vt.isShown(Mi,ui>0&&"none"!==pi),uo=At.isOAS3(),Ki=Ot("ModelWrapper"),to=Ot("Collapse"),ys=Ot("ModelCollapse"),Ls=Ot("JumpToPath",!0);return U.default.createElement("section",{className:Di?"models is-open":"models",ref:this.onLoadModels},U.default.createElement("h4",null,U.default.createElement("button",{"aria-expanded":Di,className:"models-control",onClick:function(){return Sn.show(Mi,!Di)}},U.default.createElement("span",null,uo?"Schemas":"Models"),U.default.createElement("svg",{width:"20",height:"20","aria-hidden":"true",focusable:"false"},U.default.createElement("use",{xlinkHref:Di?"#large-arrow-up":"#large-arrow-down"})))),U.default.createElement(to,{isOpened:Di},(0,xe.default)(Je=Fn.entrySeq()).call(Je,function(ta){var Ds,Rs=(0,qa.default)(ta,1)[0],Fs=(0,o.default)(Ds=[]).call(Ds,(0,Od.default)(Mi),[Rs]),Cs=ht.default.List(Fs),Fa=At.specResolvedSubtree(Fs),js=At.specJson().getIn(Fs),Ca=ht.Map.isMap(Fa)?Fa:ht.default.Map(),Ko=ht.Map.isMap(js)?js:ht.default.Map(),na=Ca.get("title")||Ko.get("title")||Rs,vl=Vt.isShown(Fs,!1);vl&&0===Ca.size&&Ko.size>0&&Qe.props.specActions.requestResolvedSubtree(Fs);var ud=U.default.createElement(Ki,{name:Rs,expandDepth:ui,schema:Ca||ht.default.Map(),displayName:na,fullPath:Fs,specPath:Cs,getComponent:Ot,specSelectors:At,getConfigs:jn,layoutSelectors:Vt,layoutActions:Sn,includeReadOnly:!0,includeWriteOnly:!0}),af=U.default.createElement("span",{className:"model-box"},U.default.createElement("span",{className:"model model-title"},na));return U.default.createElement("div",{id:"model-".concat(Rs),className:"model-container",key:"models-section-".concat(Rs),"data-name":Rs,ref:Qe.onLoadModel},U.default.createElement("span",{className:"models-jump-to-path"},U.default.createElement(Ls,{specPath:Cs})),U.default.createElement(ys,{classes:"model-box",collapsedContent:Qe.getCollapsedContent(Rs),onToggle:Qe.handleToggle,title:af,displayName:na,modelName:Rs,specPath:Cs,layoutSelectors:Vt,layoutActions:Sn,hideSelfOnExpand:!0,expanded:ui>0&&vl},ud))}).toArray()))}}]),ft}(U.Component);const Z7=function(bn){var Kt=bn.value,ft=(0,bn.getComponent)("ModelCollapse"),Je=U.default.createElement("span",null,"Array [ ",Kt.count()," ]");return U.default.createElement("span",{className:"prop-enum"},"Enum:",U.default.createElement("br",null),U.default.createElement(ft,{collapsedContent:Je},"[ ",Kt.join(", ")," ]"))};var j7=["schema","name","displayName","isRef","getComponent","getConfigs","depth","onToggle","expanded","specPath"],G7=function(bn){(0,lo.default)(ft,bn);var Kt=(0,go.default)(ft);function ft(){return(0,re.default)(this,ft),Kt.apply(this,arguments)}return(0,ie.default)(ft,[{key:"render",value:function(){var Je,Qe,et,At,Ot=this.props,Vt=Ot.schema,Sn=Ot.name,jn=Ot.displayName,Fn=Ot.isRef,tr=Ot.getComponent,pi=Ot.getConfigs,ui=Ot.depth,Mi=Ot.onToggle,Di=Ot.expanded,uo=Ot.specPath,Ki=(0,c1.default)(Ot,j7),to=Ki.specSelectors,ys=Ki.expandDepth,Ls=Ki.includeReadOnly,ta=Ki.includeWriteOnly,Ds=to.isOAS3;if(!Vt)return null;var Rs=pi().showExtensions,Fs=Vt.get("description"),Cs=Vt.get("properties"),Fa=Vt.get("additionalProperties"),js=Vt.get("title")||jn||Sn,Ca=Vt.get("required"),Ko=(0,g.default)(Vt).call(Vt,function(jd,cc){var Gd;return-1!==(0,Ge.default)(Gd=["maxProperties","minProperties","nullable","example"]).call(Gd,cc)}),na=Vt.get("deprecated"),vl=tr("JumpToPath",!0),ud=tr("Markdown",!0),af=tr("Model"),lf=tr("ModelCollapse"),Lf=tr("Property"),iu=function(){return U.default.createElement("span",{className:"model-jump-to-path"},U.default.createElement(vl,{specPath:uo}))},cd=U.default.createElement("span",null,U.default.createElement("span",null,"{"),"...",U.default.createElement("span",null,"}"),Fn?U.default.createElement(iu,null):""),uc=to.isOAS3()?Vt.get("anyOf"):null,cp=to.isOAS3()?Vt.get("oneOf"):null,Qf=to.isOAS3()?Vt.get("not"):null,L_=js&&U.default.createElement("span",{className:"model-title"},Fn&&Vt.get("$$ref")&&U.default.createElement("span",{className:"model-hint"},Vt.get("$$ref")),U.default.createElement("span",{className:"model-title__text"},js));return U.default.createElement("span",{className:"model"},U.default.createElement(lf,{modelName:Sn,title:L_,onToggle:Mi,expanded:!!Di||ui<=ys,collapsedContent:cd},U.default.createElement("span",{className:"brace-open object"},"{"),Fn?U.default.createElement(iu,null):null,U.default.createElement("span",{className:"inner-object"},U.default.createElement("table",{className:"model"},U.default.createElement("tbody",null,Fs?U.default.createElement("tr",{className:"description"},U.default.createElement("td",null,"description:"),U.default.createElement("td",null,U.default.createElement(ud,{source:Fs}))):null,na?U.default.createElement("tr",{className:"property"},U.default.createElement("td",null,"deprecated:"),U.default.createElement("td",null,"true")):null,Cs&&Cs.size?(0,xe.default)(Je=(0,g.default)(Qe=Cs.entrySeq()).call(Qe,function(jd){var cc=(0,qa.default)(jd,2)[1];return(!cc.get("readOnly")||Ls)&&(!cc.get("writeOnly")||ta)})).call(Je,function(jd){var cc,Gd,uf=(0,qa.default)(jd,2),cf=uf[0],Sh=uf[1],wd=Ds()&&Sh.get("deprecated"),xd=ht.List.isList(Ca)&&Ca.contains(cf),Af=["property-row"];return wd&&Af.push("deprecated"),xd&&Af.push("required"),U.default.createElement("tr",{key:cf,className:Af.join(" ")},U.default.createElement("td",null,cf,xd&&U.default.createElement("span",{className:"star"},"*")),U.default.createElement("td",null,U.default.createElement(af,(0,Fp.default)({key:(0,o.default)(cc=(0,o.default)(Gd="object-".concat(Sn,"-")).call(Gd,cf,"_")).call(cc,Sh)},Ki,{required:xd,getComponent:tr,specPath:uo.push("properties",cf),getConfigs:pi,schema:Sh,depth:ui+1}))))}).toArray():null,Rs?U.default.createElement("tr",null,U.default.createElement("td",null,"\xa0")):null,Rs?(0,xe.default)(et=Vt.entrySeq()).call(et,function(jd){var cc=(0,qa.default)(jd,2),Gd=cc[0],uf=cc[1];if("x-"===(0,Le.default)(Gd).call(Gd,0,2)){var cf=uf?uf.toJS?uf.toJS():uf:null;return U.default.createElement("tr",{key:Gd,className:"extension"},U.default.createElement("td",null,Gd),U.default.createElement("td",null,(0,D.default)(cf)))}}).toArray():null,Fa&&Fa.size?U.default.createElement("tr",null,U.default.createElement("td",null,"< * >:"),U.default.createElement("td",null,U.default.createElement(af,(0,Fp.default)({},Ki,{required:!1,getComponent:tr,specPath:uo.push("additionalProperties"),getConfigs:pi,schema:Fa,depth:ui+1})))):null,uc?U.default.createElement("tr",null,U.default.createElement("td",null,"anyOf ->"),U.default.createElement("td",null,(0,xe.default)(uc).call(uc,function(jd,cc){return U.default.createElement("div",{key:cc},U.default.createElement(af,(0,Fp.default)({},Ki,{required:!1,getComponent:tr,specPath:uo.push("anyOf",cc),getConfigs:pi,schema:jd,depth:ui+1})))}))):null,cp?U.default.createElement("tr",null,U.default.createElement("td",null,"oneOf ->"),U.default.createElement("td",null,(0,xe.default)(cp).call(cp,function(jd,cc){return U.default.createElement("div",{key:cc},U.default.createElement(af,(0,Fp.default)({},Ki,{required:!1,getComponent:tr,specPath:uo.push("oneOf",cc),getConfigs:pi,schema:jd,depth:ui+1})))}))):null,Qf?U.default.createElement("tr",null,U.default.createElement("td",null,"not ->"),U.default.createElement("td",null,U.default.createElement("div",null,U.default.createElement(af,(0,Fp.default)({},Ki,{required:!1,getComponent:tr,specPath:uo.push("not"),getConfigs:pi,schema:Qf,depth:ui+1}))))):null))),U.default.createElement("span",{className:"brace-close"},"}")),Ko.size?(0,xe.default)(At=Ko.entrySeq()).call(At,function(jd){var cc,Gd=(0,qa.default)(jd,2),uf=Gd[0],cf=Gd[1];return U.default.createElement(Lf,{key:(0,o.default)(cc="".concat(uf,"-")).call(cc,cf),propKey:uf,propVal:cf,propClass:"property"})}):null)}}]),ft}(U.Component),V7=function(bn){(0,lo.default)(ft,bn);var Kt=(0,go.default)(ft);function ft(){return(0,re.default)(this,ft),Kt.apply(this,arguments)}return(0,ie.default)(ft,[{key:"render",value:function(){var Je,Qe=this.props,et=Qe.getComponent,At=Qe.getConfigs,Ot=Qe.schema,Vt=Qe.depth,Sn=Qe.expandDepth,jn=Qe.name,Fn=Qe.displayName,tr=Qe.specPath,pi=Ot.get("description"),ui=Ot.get("items"),Mi=Ot.get("title")||Fn||jn,Di=(0,g.default)(Ot).call(Ot,function(ta,Ds){var Rs;return-1===(0,Ge.default)(Rs=["type","items","description","$$ref"]).call(Rs,Ds)}),uo=et("Markdown",!0),Ki=et("ModelCollapse"),to=et("Model"),ys=et("Property"),Ls=Mi&&U.default.createElement("span",{className:"model-title"},U.default.createElement("span",{className:"model-title__text"},Mi));return U.default.createElement("span",{className:"model"},U.default.createElement(Ki,{title:Ls,expanded:Vt<=Sn,collapsedContent:"[...]"},"[",Di.size?(0,xe.default)(Je=Di.entrySeq()).call(Je,function(ta){var Ds,Rs=(0,qa.default)(ta,2),Fs=Rs[0],Cs=Rs[1];return U.default.createElement(ys,{key:(0,o.default)(Ds="".concat(Fs,"-")).call(Ds,Cs),propKey:Fs,propVal:Cs,propClass:"property"})}):null,pi?U.default.createElement(uo,{source:pi}):Di.size?U.default.createElement("div",{className:"markdown"}):null,U.default.createElement("span",null,U.default.createElement(to,(0,Fp.default)({},this.props,{getConfigs:At,specPath:tr.push("items"),name:null,schema:ui,required:!1,depth:Vt+1}))),"]"))}}]),ft}(U.Component),HA="property primitive",z7=function(bn){(0,lo.default)(ft,bn);var Kt=(0,go.default)(ft);function ft(){return(0,re.default)(this,ft),Kt.apply(this,arguments)}return(0,ie.default)(ft,[{key:"render",value:function(){var Je,Qe,et,At=this.props,Ot=At.schema,Vt=At.getComponent,jn=At.name,Fn=At.displayName,tr=At.depth,pi=At.expandDepth,ui=(0,At.getConfigs)().showExtensions;if(!Ot||!Ot.get)return U.default.createElement("div",null);var Mi=Ot.get("type"),Di=Ot.get("format"),uo=Ot.get("xml"),Ki=Ot.get("enum"),to=Ot.get("title")||Fn||jn,ys=Ot.get("description"),Ls=(0,Mn.nX)(Ot),ta=(0,g.default)(Ot).call(Ot,function(js,Ca){var Ko;return-1===(0,Ge.default)(Ko=["enum","type","format","description","$$ref"]).call(Ko,Ca)}).filterNot(function(js,Ca){return Ls.has(Ca)}),Ds=Vt("Markdown",!0),Rs=Vt("EnumModel"),Fs=Vt("Property"),Cs=Vt("ModelCollapse"),Fa=to&&U.default.createElement("span",{className:"model-title"},U.default.createElement("span",{className:"model-title__text"},to));return U.default.createElement("span",{className:"model"},U.default.createElement(Cs,{title:Fa,expanded:tr>=pi,collapsedContent:" ",hideSelfOnExpand:pi!==tr},U.default.createElement("span",{className:"prop"},jn&&tr>1&&U.default.createElement("span",{className:"prop-name"},to),U.default.createElement("span",{className:"prop-type"},Mi),Di&&U.default.createElement("span",{className:"prop-format"},"($",Di,")"),ta.size?(0,xe.default)(Je=ta.entrySeq()).call(Je,function(js){var Ca,Ko=(0,qa.default)(js,2),na=Ko[0],vl=Ko[1];return U.default.createElement(Fs,{key:(0,o.default)(Ca="".concat(na,"-")).call(Ca,vl),propKey:na,propVal:vl,propClass:HA})}):null,ui&&Ls.size?(0,xe.default)(Qe=Ls.entrySeq()).call(Qe,function(js){var Ca,Ko=(0,qa.default)(js,2),na=Ko[0],vl=Ko[1];return U.default.createElement(Fs,{key:(0,o.default)(Ca="".concat(na,"-")).call(Ca,vl),propKey:na,propVal:vl,propClass:HA})}):null,ys?U.default.createElement(Ds,{source:ys}):null,uo&&uo.size?U.default.createElement("span",null,U.default.createElement("br",null),U.default.createElement("span",{className:HA},"xml:"),(0,xe.default)(et=uo.entrySeq()).call(et,function(js){var Ca,Ko=(0,qa.default)(js,2),na=Ko[0],vl=Ko[1];return U.default.createElement("span",{key:(0,o.default)(Ca="".concat(na,"-")).call(Ca,vl),className:HA},U.default.createElement("br",null),"\xa0\xa0\xa0",na,": ",String(vl))}).toArray()):null,Ki&&U.default.createElement(Rs,{value:Ki,getComponent:Vt}))))}}]),ft}(U.Component);const W7=function(bn){var Kt=bn.propKey,ft=bn.propVal;return U.default.createElement("span",{className:bn.propClass},U.default.createElement("br",null),Kt,": ",String(ft))};var OP=function(bn){(0,lo.default)(ft,bn);var Kt=(0,go.default)(ft);function ft(){return(0,re.default)(this,ft),Kt.apply(this,arguments)}return(0,ie.default)(ft,[{key:"render",value:function(){var Je=this.props,Qe=Je.onTryoutClick,At=Je.onResetClick,Sn=Je.isOAS3&&Je.hasUserEditedBody;return U.default.createElement("div",{className:Sn?"try-out btn-group":"try-out"},Je.enabled?U.default.createElement("button",{className:"btn try-out__btn cancel",onClick:Je.onCancelClick},"Cancel"):U.default.createElement("button",{className:"btn try-out__btn",onClick:Qe},"Try it out "),Sn&&U.default.createElement("button",{className:"btn try-out__btn reset",onClick:At},"Reset"))}}]),ft}(U.default.Component);(0,W.default)(OP,"defaultProps",{onTryoutClick:Function.prototype,onCancelClick:Function.prototype,onResetClick:Function.prototype,enabled:!1,hasUserEditedBody:!1,isOAS3:!1});var wP=function(bn){(0,lo.default)(ft,bn);var Kt=(0,go.default)(ft);function ft(){return(0,re.default)(this,ft),Kt.apply(this,arguments)}return(0,ie.default)(ft,[{key:"render",value:function(){var Je=this.props,et=Je.isSwagger2,At=Je.isOAS3,Ot=Je.alsoShow;return Je.bypass?U.default.createElement("div",null,this.props.children):et&&At?U.default.createElement("div",{className:"version-pragma"},Ot,U.default.createElement("div",{className:"version-pragma__message version-pragma__message--ambiguous"},U.default.createElement("div",null,U.default.createElement("h3",null,"Unable to render this definition"),U.default.createElement("p",null,U.default.createElement("code",null,"swagger")," and ",U.default.createElement("code",null,"openapi")," fields cannot be present in the same Swagger or OpenAPI definition. Please remove one of the fields."),U.default.createElement("p",null,"Supported version fields are ",U.default.createElement("code",null,"swagger: ",'"2.0"')," and those that match ",U.default.createElement("code",null,"openapi: 3.0.n")," (for example, ",U.default.createElement("code",null,"openapi: 3.0.0"),").")))):et||At?U.default.createElement("div",null,this.props.children):U.default.createElement("div",{className:"version-pragma"},Ot,U.default.createElement("div",{className:"version-pragma__message version-pragma__message--missing"},U.default.createElement("div",null,U.default.createElement("h3",null,"Unable to render this definition"),U.default.createElement("p",null,"The provided definition does not specify a valid version field."),U.default.createElement("p",null,"Please indicate a valid Swagger or OpenAPI version field. Supported version fields are ",U.default.createElement("code",null,"swagger: ",'"2.0"')," and those that match ",U.default.createElement("code",null,"openapi: 3.0.n")," (for example, ",U.default.createElement("code",null,"openapi: 3.0.0"),")."))))}}]),ft}(U.default.PureComponent);(0,W.default)(wP,"defaultProps",{alsoShow:null,children:null,bypass:!1});const J7=function(bn){return U.default.createElement("small",null,U.default.createElement("pre",{className:"version"}," ",bn.version," "))},Q7=function(bn){var Kt=bn.enabled,Je=bn.text;return U.default.createElement("a",{className:"nostyle",onClick:Kt?function(Qe){return Qe.preventDefault()}:null,href:Kt?"#/".concat(bn.path):null},U.default.createElement("span",null,Je))},X7=function(){return U.default.createElement("div",null,U.default.createElement("svg",{xmlns:"http://www.w3.org/2000/svg",xmlnsXlink:"http://www.w3.org/1999/xlink",className:"svg-assets"},U.default.createElement("defs",null,U.default.createElement("symbol",{viewBox:"0 0 20 20",id:"unlocked"},U.default.createElement("path",{d:"M15.8 8H14V5.6C14 2.703 12.665 1 10 1 7.334 1 6 2.703 6 5.6V6h2v-.801C8 3.754 8.797 3 10 3c1.203 0 2 .754 2 2.199V8H4c-.553 0-1 .646-1 1.199V17c0 .549.428 1.139.951 1.307l1.197.387C5.672 18.861 6.55 19 7.1 19h5.8c.549 0 1.428-.139 1.951-.307l1.196-.387c.524-.167.953-.757.953-1.306V9.199C17 8.646 16.352 8 15.8 8z"})),U.default.createElement("symbol",{viewBox:"0 0 20 20",id:"locked"},U.default.createElement("path",{d:"M15.8 8H14V5.6C14 2.703 12.665 1 10 1 7.334 1 6 2.703 6 5.6V8H4c-.553 0-1 .646-1 1.199V17c0 .549.428 1.139.951 1.307l1.197.387C5.672 18.861 6.55 19 7.1 19h5.8c.549 0 1.428-.139 1.951-.307l1.196-.387c.524-.167.953-.757.953-1.306V9.199C17 8.646 16.352 8 15.8 8zM12 8H8V5.199C8 3.754 8.797 3 10 3c1.203 0 2 .754 2 2.199V8z"})),U.default.createElement("symbol",{viewBox:"0 0 20 20",id:"close"},U.default.createElement("path",{d:"M14.348 14.849c-.469.469-1.229.469-1.697 0L10 11.819l-2.651 3.029c-.469.469-1.229.469-1.697 0-.469-.469-.469-1.229 0-1.697l2.758-3.15-2.759-3.152c-.469-.469-.469-1.228 0-1.697.469-.469 1.228-.469 1.697 0L10 8.183l2.651-3.031c.469-.469 1.228-.469 1.697 0 .469.469.469 1.229 0 1.697l-2.758 3.152 2.758 3.15c.469.469.469 1.229 0 1.698z"})),U.default.createElement("symbol",{viewBox:"0 0 20 20",id:"large-arrow"},U.default.createElement("path",{d:"M13.25 10L6.109 2.58c-.268-.27-.268-.707 0-.979.268-.27.701-.27.969 0l7.83 7.908c.268.271.268.709 0 .979l-7.83 7.908c-.268.271-.701.27-.969 0-.268-.269-.268-.707 0-.979L13.25 10z"})),U.default.createElement("symbol",{viewBox:"0 0 20 20",id:"large-arrow-down"},U.default.createElement("path",{d:"M17.418 6.109c.272-.268.709-.268.979 0s.271.701 0 .969l-7.908 7.83c-.27.268-.707.268-.979 0l-7.908-7.83c-.27-.268-.27-.701 0-.969.271-.268.709-.268.979 0L10 13.25l7.418-7.141z"})),U.default.createElement("symbol",{viewBox:"0 0 20 20",id:"large-arrow-up"},U.default.createElement("path",{d:"M 17.418 14.908 C 17.69 15.176 18.127 15.176 18.397 14.908 C 18.667 14.64 18.668 14.207 18.397 13.939 L 10.489 6.109 C 10.219 5.841 9.782 5.841 9.51 6.109 L 1.602 13.939 C 1.332 14.207 1.332 14.64 1.602 14.908 C 1.873 15.176 2.311 15.176 2.581 14.908 L 10 7.767 L 17.418 14.908 Z"})),U.default.createElement("symbol",{viewBox:"0 0 24 24",id:"jump-to"},U.default.createElement("path",{d:"M19 7v4H5.83l3.58-3.59L8 6l-6 6 6 6 1.41-1.41L5.83 13H21V7z"})),U.default.createElement("symbol",{viewBox:"0 0 24 24",id:"expand"},U.default.createElement("path",{d:"M10 18h4v-2h-4v2zM3 6v2h18V6H3zm3 7h12v-2H6v2z"})))))};var K7=wo(5466),q7=function(bn){(0,lo.default)(ft,bn);var Kt=(0,go.default)(ft);function ft(){return(0,re.default)(this,ft),Kt.apply(this,arguments)}return(0,ie.default)(ft,[{key:"render",value:function(){var Je=this.props,Qe=Je.errSelectors,et=Je.specSelectors,At=Je.getComponent,Ot=At("SvgAssets"),Vt=At("InfoContainer",!0),Sn=At("VersionPragmaFilter"),jn=At("operations",!0),Fn=At("Models",!0),tr=At("Row"),pi=At("Col"),ui=At("errors",!0),Mi=At("ServersContainer",!0),Di=At("SchemesContainer",!0),uo=At("AuthorizeBtnContainer",!0),Ki=At("FilterContainer",!0),to=et.isSwagger2(),ys=et.isOAS3(),Ls=!et.specStr(),ta=et.loadingStatus(),Ds=null;if("loading"===ta&&(Ds=U.default.createElement("div",{className:"info"},U.default.createElement("div",{className:"loading-container"},U.default.createElement("div",{className:"loading"})))),"failed"===ta&&(Ds=U.default.createElement("div",{className:"info"},U.default.createElement("div",{className:"loading-container"},U.default.createElement("h4",{className:"title"},"Failed to load API definition."),U.default.createElement(ui,null)))),"failedConfig"===ta){var Rs=Qe.lastError(),Fs=Rs?Rs.get("message"):"";Ds=U.default.createElement("div",{className:"info failed-config"},U.default.createElement("div",{className:"loading-container"},U.default.createElement("h4",{className:"title"},"Failed to load remote configuration."),U.default.createElement("p",null,Fs)))}if(!Ds&&Ls&&(Ds=U.default.createElement("h4",null,"No API definition provided.")),Ds)return U.default.createElement("div",{className:"swagger-ui"},U.default.createElement("div",{className:"loading-container"},Ds));var Cs=et.servers(),Fa=et.schemes(),js=Cs&&Cs.size,Ca=Fa&&Fa.size,Ko=!!et.securityDefinitions();return U.default.createElement("div",{className:"swagger-ui"},U.default.createElement(Ot,null),U.default.createElement(Sn,{isSwagger2:to,isOAS3:ys,alsoShow:U.default.createElement(ui,null)},U.default.createElement(ui,null),U.default.createElement(tr,{className:"information-container"},U.default.createElement(pi,{mobile:12},U.default.createElement(Vt,null))),js||Ca||Ko?U.default.createElement("div",{className:"scheme-container"},U.default.createElement(pi,{className:"schemes wrapper",mobile:12},js?U.default.createElement(Mi,null):null,Ca?U.default.createElement(Di,null):null,Ko?U.default.createElement(uo,null):null)):null,U.default.createElement(Ki,null),U.default.createElement(tr,null,U.default.createElement(pi,{mobile:12,desktop:12},U.default.createElement(jn,null))),U.default.createElement(tr,null,U.default.createElement(pi,{mobile:12,desktop:12},U.default.createElement(Fn,null)))))}}]),ft}(U.default.Component);const xP=(bn=>{var Kt={};return wo.d(Kt,bn),Kt})({default:()=>JF()});var P0={value:"",onChange:function(){},schema:{},keyName:"",required:!1,errors:(0,ht.List)()},DP=function(bn){(0,lo.default)(ft,bn);var Kt=(0,go.default)(ft);function ft(){return(0,re.default)(this,ft),Kt.apply(this,arguments)}return(0,ie.default)(ft,[{key:"componentDidMount",value:function(){var Je=this.props,Qe=Je.dispatchInitialValue,At=Je.onChange;Qe?At(Je.value):!1===Qe&&At("")}},{key:"render",value:function(){var Je,Qe=this.props,et=Qe.schema,At=Qe.errors,Ot=Qe.value,Vt=Qe.onChange,Sn=Qe.getComponent,jn=Qe.fn,Fn=Qe.disabled,tr=et&&et.get?et.get("format"):null,pi=et&&et.get?et.get("type"):null,Mi=pi?Sn(tr?(0,o.default)(Je="JsonSchema_".concat(pi,"_")).call(Je,tr):"JsonSchema_".concat(pi),!1,{failSilently:!0}):Sn("JsonSchema_string");return Mi||(Mi=Sn("JsonSchema_string")),U.default.createElement(Mi,(0,Fp.default)({},this.props,{errors:At,fn:jn,getComponent:Sn,value:Ot,onChange:Vt,schema:et,disabled:Fn}))}}]),ft}(U.Component);(0,W.default)(DP,"defaultProps",P0);var RP=function(bn){(0,lo.default)(ft,bn);var Kt=(0,go.default)(ft);function ft(){var Je,Qe;(0,re.default)(this,ft);for(var et=arguments.length,At=new Array(et),Ot=0;Ot<et;Ot++)At[Ot]=arguments[Ot];return Qe=Kt.call.apply(Kt,(0,o.default)(Je=[this]).call(Je,At)),(0,W.default)((0,wi.default)(Qe),"onChange",function(Vt){var Sn=Qe.props.schema&&"file"===Qe.props.schema.get("type")?Vt.target.files[0]:Vt.target.value;Qe.props.onChange(Sn,Qe.props.keyName)}),(0,W.default)((0,wi.default)(Qe),"onEnumChange",function(Vt){return Qe.props.onChange(Vt)}),Qe}return(0,ie.default)(ft,[{key:"render",value:function(){var Je=this.props,Qe=Je.getComponent,et=Je.value,At=Je.schema,Ot=Je.errors,Vt=Je.required,Sn=Je.description,jn=Je.disabled,Fn=At&&At.get?At.get("enum"):null,tr=At&&At.get?At.get("format"):null,pi=At&&At.get?At.get("type"):null,ui=At&&At.get?At.get("in"):null;if(et||(et=""),Ot=Ot.toJS?Ot.toJS():[],Fn){var Mi=Qe("Select");return U.default.createElement(Mi,{className:Ot.length?"invalid":"",title:Ot.length?Ot:"",allowedValues:Fn,value:et,allowEmptyValue:!Vt,disabled:jn,onChange:this.onEnumChange})}var Di=jn||ui&&"formData"===ui&&!("FormData"in window),uo=Qe("Input");return pi&&"file"===pi?U.default.createElement(uo,{type:"file",className:Ot.length?"invalid":"",title:Ot.length?Ot:"",onChange:this.onChange,disabled:Di}):U.default.createElement(xP.default,{type:tr&&"password"===tr?"password":"text",className:Ot.length?"invalid":"",title:Ot.length?Ot:"",value:et,minLength:0,debounceTimeout:350,placeholder:Sn,onChange:this.onChange,disabled:Di})}}]),ft}(U.Component);(0,W.default)(RP,"defaultProps",P0);var NP=function(bn){(0,lo.default)(ft,bn);var Kt=(0,go.default)(ft);function ft(Je,Qe){var et;return(0,re.default)(this,ft),et=Kt.call(this,Je,Qe),(0,W.default)((0,wi.default)(et),"onChange",function(){et.props.onChange(et.state.value)}),(0,W.default)((0,wi.default)(et),"onItemChange",function(At,Ot){et.setState(function(Vt){return{value:Vt.value.set(Ot,At)}},et.onChange)}),(0,W.default)((0,wi.default)(et),"removeItem",function(At){et.setState(function(Ot){return{value:Ot.value.delete(At)}},et.onChange)}),(0,W.default)((0,wi.default)(et),"addItem",function(){var At=cR(et.state.value);et.setState(function(){return{value:At.push((0,Mn.xi)(et.state.schema.get("items"),!1,{includeWriteOnly:!0}))}},et.onChange)}),(0,W.default)((0,wi.default)(et),"onEnumChange",function(At){et.setState(function(){return{value:At}},et.onChange)}),et.state={value:cR(Je.value),schema:Je.schema},et}return(0,ie.default)(ft,[{key:"UNSAFE_componentWillReceiveProps",value:function(Je){var Qe=cR(Je.value);Qe!==this.state.value&&this.setState({value:Qe}),Je.schema!==this.state.schema&&this.setState({schema:Je.schema})}},{key:"render",value:function(){var Je,Qe=this,et=this.props,At=et.getComponent,Ot=et.required,Vt=et.schema,Sn=et.errors,jn=et.fn,Fn=et.disabled;Sn=Sn.toJS?Sn.toJS():(0,Re.default)(Sn)?Sn:[];var tr,pi,ui=(0,g.default)(Sn).call(Sn,function(Cs){return"string"==typeof Cs}),Mi=(0,xe.default)(Je=(0,g.default)(Sn).call(Sn,function(Cs){return void 0!==Cs.needRemove})).call(Je,function(Cs){return Cs.error}),Di=this.state.value,uo=!!(Di&&Di.count&&Di.count()>0),Ki=Vt.getIn(["items","enum"]),to=Vt.getIn(["items","type"]),ys=Vt.getIn(["items","format"]),Ls=Vt.get("items"),ta=!1,Ds="file"===to||"string"===to&&"binary"===ys;if(to&&ys?tr=At((0,o.default)(pi="JsonSchema_".concat(to,"_")).call(pi,ys)):"boolean"!==to&&"array"!==to&&"object"!==to||(tr=At("JsonSchema_".concat(to))),tr||Ds||(ta=!0),Ki){var Rs=At("Select");return U.default.createElement(Rs,{className:Sn.length?"invalid":"",title:Sn.length?Sn:"",multiple:!0,value:Di,disabled:Fn,allowedValues:Ki,allowEmptyValue:!Ot,onChange:this.onEnumChange})}var Fs=At("Button");return U.default.createElement("div",{className:"json-schema-array"},uo?(0,xe.default)(Di).call(Di,function(Cs,Fa){var js,Ca=(0,ht.fromJS)((0,Od.default)((0,xe.default)(js=(0,g.default)(Sn).call(Sn,function(Ko){return Ko.index===Fa})).call(js,function(Ko){return Ko.error})));return U.default.createElement("div",{key:Fa,className:"json-schema-form-item"},Ds?U.default.createElement(uR,{value:Cs,onChange:function(Ko){return Qe.onItemChange(Ko,Fa)},disabled:Fn,errors:Ca,getComponent:At}):ta?U.default.createElement(lR,{value:Cs,onChange:function(Ko){return Qe.onItemChange(Ko,Fa)},disabled:Fn,errors:Ca}):U.default.createElement(tr,(0,Fp.default)({},Qe.props,{value:Cs,onChange:function(Ko){return Qe.onItemChange(Ko,Fa)},disabled:Fn,errors:Ca,schema:Ls,getComponent:At,fn:jn})),Fn?null:U.default.createElement(Fs,{className:"btn btn-sm json-schema-form-item-remove ".concat(Mi.length?"invalid":null),title:Mi.length?Mi:"",onClick:function(){return Qe.removeItem(Fa)}}," - "))}):null,Fn?null:U.default.createElement(Fs,{className:"btn btn-sm json-schema-form-item-add ".concat(ui.length?"invalid":null),title:ui.length?ui:"",onClick:this.addItem},"Add ",to?"".concat(to," "):"","item"))}}]),ft}(U.PureComponent);(0,W.default)(NP,"defaultProps",P0);var lR=function(bn){(0,lo.default)(ft,bn);var Kt=(0,go.default)(ft);function ft(){var Je,Qe;(0,re.default)(this,ft);for(var et=arguments.length,At=new Array(et),Ot=0;Ot<et;Ot++)At[Ot]=arguments[Ot];return Qe=Kt.call.apply(Kt,(0,o.default)(Je=[this]).call(Je,At)),(0,W.default)((0,wi.default)(Qe),"onChange",function(Vt){Qe.props.onChange(Vt.target.value,Qe.props.keyName)}),Qe}return(0,ie.default)(ft,[{key:"render",value:function(){var Je=this.props,Qe=Je.value,et=Je.errors,At=Je.description,Ot=Je.disabled;return Qe||(Qe=""),et=et.toJS?et.toJS():[],U.default.createElement(xP.default,{type:"text",className:et.length?"invalid":"",title:et.length?et:"",value:Qe,minLength:0,debounceTimeout:350,placeholder:At,onChange:this.onChange,disabled:Ot})}}]),ft}(U.Component);(0,W.default)(lR,"defaultProps",P0);var uR=function(bn){(0,lo.default)(ft,bn);var Kt=(0,go.default)(ft);function ft(){var Je,Qe;(0,re.default)(this,ft);for(var et=arguments.length,At=new Array(et),Ot=0;Ot<et;Ot++)At[Ot]=arguments[Ot];return Qe=Kt.call.apply(Kt,(0,o.default)(Je=[this]).call(Je,At)),(0,W.default)((0,wi.default)(Qe),"onFileChange",function(Vt){Qe.props.onChange(Vt.target.files[0],Qe.props.keyName)}),Qe}return(0,ie.default)(ft,[{key:"render",value:function(){var Je=this.props,et=Je.errors,At=Je.disabled,Ot=(0,Je.getComponent)("Input"),Vt=At||!("FormData"in window);return U.default.createElement(Ot,{type:"file",className:et.length?"invalid":"",title:et.length?et:"",onChange:this.onFileChange,disabled:Vt})}}]),ft}(U.Component);(0,W.default)(uR,"defaultProps",P0);var PP=function(bn){(0,lo.default)(ft,bn);var Kt=(0,go.default)(ft);function ft(){var Je,Qe;(0,re.default)(this,ft);for(var et=arguments.length,At=new Array(et),Ot=0;Ot<et;Ot++)At[Ot]=arguments[Ot];return Qe=Kt.call.apply(Kt,(0,o.default)(Je=[this]).call(Je,At)),(0,W.default)((0,wi.default)(Qe),"onEnumChange",function(Vt){return Qe.props.onChange(Vt)}),Qe}return(0,ie.default)(ft,[{key:"render",value:function(){var Je=this.props,Qe=Je.getComponent,et=Je.value,At=Je.errors,Ot=Je.schema,Vt=Je.required,Sn=Je.disabled;At=At.toJS?At.toJS():[];var jn=Ot&&Ot.get?Ot.get("enum"):null,Fn=!jn||!Vt,tr=!jn&&(0,ht.fromJS)(["true","false"]),pi=Qe("Select");return U.default.createElement(pi,{className:At.length?"invalid":"",title:At.length?At:"",value:String(et),disabled:Sn,allowedValues:jn||tr,allowEmptyValue:Fn,onChange:this.onEnumChange})}}]),ft}(U.Component);(0,W.default)(PP,"defaultProps",P0);var e9=function(bn){return(0,xe.default)(bn).call(bn,function(Kt){var ft,Qe="string"==typeof Kt?Kt:"string"==typeof Kt.error?Kt.error:null;if(!(void 0!==Kt.propKey?Kt.propKey:Kt.index)&&Qe)return Qe;for(var et=Kt.error,At="/".concat(Kt.propKey);"object"===(0,t.default)(et);){var Ot=void 0!==et.propKey?et.propKey:et.index;if(void 0===Ot||(At+="/".concat(Ot),!et.error))break;et=et.error}return(0,o.default)(ft="".concat(At,": ")).call(ft,et)})},IP=function(bn){(0,lo.default)(ft,bn);var Kt=(0,go.default)(ft);function ft(){var Je;return(0,re.default)(this,ft),Je=Kt.call(this),(0,W.default)((0,wi.default)(Je),"onChange",function(Qe){Je.props.onChange(Qe)}),(0,W.default)((0,wi.default)(Je),"handleOnChange",function(Qe){Je.onChange(Qe.target.value)}),Je}return(0,ie.default)(ft,[{key:"render",value:function(){var Je=this.props,et=Je.value,At=Je.errors,Ot=Je.disabled,Vt=(0,Je.getComponent)("TextArea");return At=At.toJS?At.toJS():(0,Re.default)(At)?At:[],U.default.createElement("div",null,U.default.createElement(Vt,{className:(0,If.default)({invalid:At.length}),title:At.length?e9(At).join(", "):"",value:(0,Mn.Pz)(et),disabled:Ot,onChange:this.handleOnChange}))}}]),ft}(U.PureComponent);function cR(bn){return ht.List.isList(bn)?bn:(0,Re.default)(bn)?(0,ht.fromJS)(bn):(0,ht.List)()}function t9(){return[qi.default,qr.default,Jr.default,ji.default,Yr.default,Qn.default,Tn.default,ii.default,{components:{App:Bn,authorizationPopup:_r,authorizeBtn:Gr,AuthorizeBtnContainer:xi,authorizeOperationBtn:Zs,auths:jo,AuthItem:sl,authError:ml,oauth2:Ip,apiKeyAuth:nu,basicAuth:Xu,clear:Yi,liveResponse:eo,InitializedInput:C7,info:x7,InfoContainer:D7,JumpToPath:R7,onlineValidatorBadge:Lo.Z,operations:us,operation:Zi,OperationSummary:is,OperationSummaryMethod:hu,OperationSummaryPath:Ci,highlightCode:I_,responses:l1,response:Em,ResponseExtension:hg,responseBody:RA,parameters:_S,parameterRow:LA,execute:kA,headers:za,errors:Fu,contentType:N0,overview:E7,footer:N7,FilterContainer:P7,ParamBody:MP,curl:L7,schemes:F7,SchemesContainer:k7,modelExample:H7,ModelWrapper:U7,ModelCollapse:AP,Model:B7.Z,Models:Y7,EnumModel:Z7,ObjectModel:G7,ArrayModel:V7,PrimitiveModel:z7,Property:W7,TryItOutButton:OP,Markdown:K7.Z,BaseLayout:q7,VersionPragmaFilter:wP,VersionStamp:J7,OperationExt:ja,OperationExtRow:Ku,ParameterExt:PA,ParameterIncludeEmpty:gS,OperationTag:as,OperationContainer:Et,DeepLink:Q7,InfoUrl:w7,InfoBasePath:M7,SvgAssets:X7,Example:Pf,ExamplesSelect:qc,ExamplesSelectValueRetainer:Eh}},{components:n},An.default,{components:s},hn.default,Ri.default,Zo.default,bo.default,Ys.default,Ui.default,(0,Ws.default)()]}(0,W.default)(IP,"defaultProps",P0);var n9=wo(7451);function LP(){return[t9,n9.default]}var r9=wo(5308);function dR(bn){var Kt,ft,Je;Dn.Z.versions=Dn.Z.versions||{},Dn.Z.versions.swaggerUi={version:"4.12.0",gitRevision:"ga7e23b5",gitDirty:!0,buildTimestamp:"Fri, 03 Jun 2022 17:07:59 GMT"};var Qe={dom_id:null,domNode:null,spec:{},url:"",urls:null,layout:"BaseLayout",docExpansion:"list",maxDisplayedTags:null,filter:null,validatorUrl:"https://validator.swagger.io/validator",oauth2RedirectUrl:(0,o.default)(Kt=(0,o.default)(ft="".concat(window.location.protocol,"//")).call(ft,window.location.host)).call(Kt,window.location.pathname.substring(0,(0,c.default)(Je=window.location.pathname).call(Je,"/")),"/oauth2-redirect.html"),persistAuthorization:!1,configs:{},custom:{},displayOperationId:!1,displayRequestDuration:!1,deepLinking:!1,tryItOutEnabled:!1,requestInterceptor:function(ui){return ui},responseInterceptor:function(ui){return ui},showMutatedRequest:!0,defaultModelRendering:"example",defaultModelExpandDepth:1,defaultModelsExpandDepth:1,showExtensions:!1,showCommonExtensions:!1,withCredentials:void 0,requestSnippetsEnabled:!1,requestSnippets:{generators:{curl_bash:{title:"cURL (bash)",syntax:"bash"},curl_powershell:{title:"cURL (PowerShell)",syntax:"powershell"},curl_cmd:{title:"cURL (CMD)",syntax:"bash"}},defaultExpanded:!0,languages:null},supportedSubmitMethods:["get","put","post","delete","options","head","patch","trace"],queryConfigEnabled:!1,presets:[LP],plugins:[],pluginsOptions:{pluginLoadType:"legacy"},initialState:{},fn:{},components:{},syntaxHighlight:{activated:!0,theme:"agate"}},et=bn.queryConfigEnabled?(0,Mn.UG)():{},At=bn.domNode;delete bn.domNode;var Ot=j()({},Qe,bn,et),Vt={system:{configs:Ot.configs},plugins:Ot.presets,pluginsOptions:Ot.pluginsOptions,state:j()({layout:{layout:Ot.layout,filter:(0,g.default)(Ot)},spec:{spec:"",url:Ot.url},requestSnippets:Ot.requestSnippets},Ot.initialState)};if(Ot.initialState)for(var Sn in Ot.initialState)Object.prototype.hasOwnProperty.call(Ot.initialState,Sn)&&void 0===Ot.initialState[Sn]&&delete Vt.state[Sn];var jn=new ur(Vt);jn.register([Ot.plugins,function(){return{fn:Ot.fn,components:Ot.components,state:Ot.state}}]);var Fn=jn.getSystem(),tr=function(ui){var Mi=Fn.specSelectors.getLocalConfig?Fn.specSelectors.getLocalConfig():{},Di=j()({},Mi,Ot,ui||{},et);if(At&&(Di.domNode=At),jn.setConfigs(Di),Fn.configsActions.loaded(),null!==ui&&(!et.url&&"object"===(0,t.default)(Di.spec)&&(0,C.default)(Di.spec).length?(Fn.specActions.updateUrl(""),Fn.specActions.updateLoadingStatus("success"),Fn.specActions.updateSpec((0,D.default)(Di.spec))):Fn.specActions.download&&Di.url&&!Di.urls&&(Fn.specActions.updateUrl(Di.url),Fn.specActions.download(Di.url))),Di.domNode)Fn.render(Di.domNode,"App");else if(Di.dom_id){var uo=document.querySelector(Di.dom_id);Fn.render(uo,"App")}else null===Di.dom_id||null===Di.domNode||console.error("Skipped rendering: no `dom_id` or `domNode` was specified");return Fn},pi=et.config||Ot.configUrl;return pi&&Fn.specActions&&Fn.specActions.getConfigByUrl?(Fn.specActions.getConfigByUrl({url:pi,loadRemoteConfig:!0,requestInterceptor:Ot.requestInterceptor,responseInterceptor:Ot.responseInterceptor},tr),Fn):tr()}dR.presets={apis:LP},dR.plugins=r9.default;const l9=dR})();var XF=dP.Z;let KF=(()=>{class n{ngOnInit(){XF({url:window.location.origin+"/docs/openapi.json",dom_id:"#swagger-ui",layout:"BaseLayout"})}}return n.\u0275fac=function(t){return new(t||n)},n.\u0275cmp=e.Xpm({type:n,selectors:[["cd-api-docs"]],decls:1,vars:0,consts:[["id","swagger-ui",1,"apiDocs"]],template:function(t,o){1&t&&e._UZ(0,"div",0)},styles:[".apiDocs[_ngcontent-%COMP%]{background:#f8f9fa;font-size:18px!important;margin-top:-48px!important}"]}),n})();var fP=i(45510);let pP=(()=>{class n{constructor(t,o){this.router=t,this.authStorageService=o}canActivate(t,o){return!(this.authStorageService.isLoggedIn()&&!this.authStorageService.isSSO()&&this.authStorageService.getPwdUpdateRequired()&&(this.router.navigate(["/login-change-password"],{queryParams:{returnUrl:o.url}}),1))}canActivateChild(t,o){return this.canActivate(t,o)}}return n.\u0275fac=function(t){return new(t||n)(e.LFG(Yo.F0),e.LFG(_t.j))},n.\u0275prov=e.Yz7({token:n,factory:n.\u0275fac,providedIn:"root"}),n})();var oR=i(4222),hS=i(54462);let hP=(()=>{class n{constructor(t){this.authStorageService=t}canActivate(){if(!this.authStorageService.isSSO())return!0;throw new Nl.mM}canActivateChild(){return this.canActivate()}}return n.\u0275fac=function(t){return new(t||n)(e.LFG(_t.j))},n.\u0275prov=e.Yz7({token:n,factory:n.\u0275fac,providedIn:"root"}),n})(),_P=(()=>{class n extends z1{resolve(t){const o=[],c=t.queryParams.fromLink||null;let g="";switch(c){case"/monitor":g="Monitors";break;case"/hosts":g="Hosts"}return o.push({text:"Cluster",path:null}),o.push({text:g,path:c}),o.push({text:"Performance Counters",path:""}),o}}return n.\u0275fac=function(){let s;return function(o){return(s||(s=e.n5z(n)))(o||n)}}(),n.\u0275prov=e.Yz7({token:n,factory:n.\u0275fac}),n})(),gP=(()=>{class n extends z1{resolve(t){const o=t.params.name;return[{text:`${Ar().startCase(o)}/Edit`,path:o}]}}return n.\u0275fac=function(){let s;return function(o){return(s||(s=e.n5z(n)))(o||n)}}(),n.\u0275prov=e.Yz7({token:n,factory:n.\u0275fac}),n})();const qF=[{path:"",redirectTo:"dashboard",pathMatch:"full"},{path:"api-docs",component:KF},{path:"",component:MM,canActivate:[fP.P,pP],canActivateChild:[fP.P,pP],children:[{path:"dashboard",component:uC},{path:"error",component:aw},{path:"expand-cluster",component:pv,canActivate:[hS.P],data:{moduleStatusGuardConfig:{uiApiPath:"orchestrator",redirectTo:"dashboard",backend:"cephadm"},breadcrumbs:"Expand Cluster"}},{path:"hosts",component:sh,data:{breadcrumbs:"Cluster/Hosts"},children:[{path:ki.MQ.ADD,component:vt,outlet:"modal"}]},{path:"monitor",component:b_,data:{breadcrumbs:"Cluster/Monitors"}},{path:"services",component:qd,canActivate:[hS.P],data:{moduleStatusGuardConfig:{uiApiPath:"orchestrator",redirectTo:"error",section:"orch",section_info:"Orchestrator",header:"Orchestrator is not available"},breadcrumbs:"Cluster/Services"},children:[{path:ki.MQ.CREATE,component:av,outlet:"modal"},{path:`${ki.MQ.EDIT}/:type/:name`,component:av,outlet:"modal"}]},{path:"inventory",canActivate:[hS.P],component:X,data:{moduleStatusGuardConfig:{uiApiPath:"orchestrator",redirectTo:"error",section:"orch",section_info:"Orchestrator",header:"Orchestrator is not available"},breadcrumbs:"Cluster/Physical Disks"}},{path:"osd",data:{breadcrumbs:"Cluster/OSDs"},children:[{path:"",component:hy},{path:ki.MQ.CREATE,component:a_,data:{breadcrumbs:ki.Qn.CREATE}}]},{path:"configuration",data:{breadcrumbs:"Cluster/Configuration"},children:[{path:"",component:pf},{path:"edit/:name",component:Qa,data:{breadcrumbs:ki.Qn.EDIT}}]},{path:"crush-map",component:Og,data:{breadcrumbs:"Cluster/CRUSH map"}},{path:"logs",component:Zd,data:{breadcrumbs:"Cluster/Logs"}},{path:"telemetry",component:sE,data:{breadcrumbs:"Telemetry configuration"}},{path:"monitoring",data:{breadcrumbs:"Cluster/Monitoring"},children:[{path:"",redirectTo:"active-alerts",pathMatch:"full"},{path:"active-alerts",data:{breadcrumbs:"Active Alerts"},component:oo},{path:"alerts",data:{breadcrumbs:"Alerts"},component:Ba},{path:"silences",data:{breadcrumbs:"Silences"},children:[{path:"",component:_R},{path:ki.MQ.CREATE,component:vy,data:{breadcrumbs:`${ki.Qn.CREATE} Silence`}},{path:`${ki.MQ.CREATE}/:id`,component:vy,data:{breadcrumbs:ki.Qn.CREATE}},{path:`${ki.MQ.EDIT}/:id`,component:vy,data:{breadcrumbs:ki.Qn.EDIT}},{path:`${ki.MQ.RECREATE}/:id`,component:vy,data:{breadcrumbs:ki.Qn.RECREATE}}]}]},{path:"perf_counters/:type/:id",component:VO,data:{breadcrumbs:_P}},{path:"mgr-modules",data:{breadcrumbs:"Cluster/Manager Modules"},children:[{path:"",component:Gu},{path:"edit/:name",component:bv,data:{breadcrumbs:gP}}]},{path:"pool",data:{breadcrumbs:"Pools"},loadChildren:()=>Promise.all([i.e(483),i.e(585)]).then(i.bind(i,24585)).then(n=>n.RoutedPoolModule)},{path:"block",data:{breadcrumbs:!0,text:"Block",path:null},loadChildren:()=>i.e(483).then(i.bind(i,70483)).then(n=>n.RoutedBlockModule)},{path:"cephfs",component:ka,canActivate:[oR.T],data:{breadcrumbs:"File Systems"}},{path:"rgw",canActivateChild:[oR.T,hS.P],data:{moduleStatusGuardConfig:{uiApiPath:"rgw",redirectTo:"error",section:"rgw",section_info:"Object Gateway",header:"The Object Gateway Service is not configured"},breadcrumbs:!0,text:"Object Gateway",path:null},loadChildren:()=>i.e(281).then(i.bind(i,59281)).then(n=>n.RoutedRgwModule)},{path:"user-management",data:{breadcrumbs:"User management",path:null},loadChildren:()=>Promise.resolve().then(i.bind(i,49552)).then(n=>n.RoutedAuthModule)},{path:"user-profile",data:{breadcrumbs:"User profile",path:null},children:[{path:ki.MQ.EDIT,component:UC,canActivate:[hP],data:{breadcrumbs:ki.Qn.EDIT}}]},{path:"nfs",canActivateChild:[oR.T,hS.P],data:{moduleStatusGuardConfig:{uiApiPath:"nfs-ganesha",redirectTo:"error",section:"nfs-ganesha",section_info:"NFS GANESHA",header:"NFS-Ganesha is not configured"},breadcrumbs:"NFS"},children:[{path:"",component:LC},{path:ki.MQ.CREATE,component:OE,data:{breadcrumbs:ki.Qn.CREATE}},{path:`${ki.MQ.EDIT}/:cluster_id/:export_id`,component:OE,data:{breadcrumbs:ki.Qn.EDIT}}]}]},{path:"",component:dw,children:[{path:"login",component:tw},{path:"login-change-password",component:KO,canActivate:[hP]}]},{path:"",component:zC,children:[{path:"**",redirectTo:"/error"}]}];let DA=(()=>{class n{}return n.\u0275fac=function(t){return new(t||n)},n.\u0275mod=e.oAB({type:n}),n.\u0275inj=e.cJS({providers:[gP,_P],imports:[[Yo.Bz.forRoot(qF,{useHash:!0,preloadingStrategy:Yo.wm,relativeLinkResolution:"legacy"})],Yo.Bz]}),n})(),e7=(()=>{class n{constructor(t,o){t.autoClose="outside",t.container="body",t.placement="bottom",o.container="body"}}return n.\u0275fac=function(t){return new(t||n)(e.Y36(lt.AX),e.Y36(lt.xI))},n.\u0275cmp=e.Xpm({type:n,selectors:[["cd-root"]],decls:1,vars:0,template:function(t,o){1&t&&e._UZ(0,"router-outlet")},directives:[Yo.lC],styles:[""]}),n})();var bm=i(44466);let t7=(()=>{class n{}return n.\u0275fac=function(t){return new(t||n)},n.\u0275mod=e.oAB({type:n}),n.\u0275inj=e.cJS({imports:[[_.ez,bm.m,DA,Ho.m9,Il.xc,lt.Oz]]}),n})();var mP=i(66265),vP=i(370);let n7=(()=>{class n{}return n.\u0275fac=function(t){return new(t||n)},n.\u0275mod=e.oAB({type:n}),n.\u0275inj=e.cJS({imports:[[DA,_.ez,vn.UX,bm.m,lt.Oz]]}),n})(),r7=(()=>{class n{}return n.\u0275fac=function(t){return new(t||n)},n.\u0275mod=e.oAB({type:n}),n.\u0275inj=e.cJS({providers:[lt.Kz],imports:[[_.ez,mP.B,lt.Oz,bm.m,Yo.Bz,vn.u5,vn.UX,lt.HK,n7,lt.ZS,lt.UL,Il.xc,vP.t,lt.M,lt.dT,lt.XC,fr.b]]}),n})(),i7=(()=>{class n{}return n.\u0275fac=function(t){return new(t||n)},n.\u0275mod=e.oAB({type:n}),n.\u0275inj=e.cJS({imports:[[vP.t,_.ez,lt.Oz,bm.m,Ho.m9,Yo.Bz,lt.dT,vn.u5,vn.UX]]}),n})(),o7=(()=>{class n{}return n.\u0275fac=function(t){return new(t||n)},n.\u0275mod=e.oAB({type:n}),n.\u0275inj=e.cJS({imports:[[vn.UX,Yo.Bz,bm.m,lt.Oz,_.ez,lt.ZS,lt.HK]]}),n})(),s7=(()=>{class n{}return n.\u0275fac=function(t){return new(t||n)},n.\u0275mod=e.oAB({type:n}),n.\u0275inj=e.cJS({imports:[[_.ez,r7,i7,mP.B,t7,o7,bm.m]]}),n})();var a7=i(49552);let yP=(()=>{class n{}return n.\u0275fac=function(t){return new(t||n)},n.\u0275mod=e.oAB({type:n}),n.\u0275inj=e.cJS({imports:[[_.ez,a7.AuthModule,lt.lQ,lt.XC,DA,bm.m,aM.t,Yo.Bz]]}),n})(),l7=(()=>{class n{}return n.\u0275fac=function(t){return new(t||n)},n.\u0275mod=e.oAB({type:n}),n.\u0275inj=e.cJS({imports:[[Vg.forRoot(),_.ez,yP,lt.XC,Yo.Bz,bm.m],yP]}),n})(),u7=(()=>{class n{constructor(t,o,c){this.router=t,this.authStorageService=o,this.notificationService=c}intercept(t,o){const c=t.headers.get("Accept");let g;return g=c&&c.startsWith("application/vnd.ceph.api.v")?t.clone():t.clone({setHeaders:{Accept:Rd.T.cdVersionHeader("1","0")}}),o.handle(g).pipe((0,Pv.K)(C=>{if(C instanceof y.UA){let D;switch(C.status){case 400:const P=new cl.R,j=C.error.task;Ar().isPlainObject(j)?(j.metadata.component=j.metadata.component||C.error.component,P.name=j.name,P.metadata=j.metadata):P.metadata=C.error,P.success=!1,P.exception=C.error,D=this.notificationService.notifyTask(P);break;case 401:this.authStorageService.remove(),this.router.navigate(["/login"]);break;case 403:this.router.navigate(["error"],{state:{message:"Sorry, you don\u2019t have permission to view this page or resource.",header:"Access Denied",icon:"fa fa-lock",source:"forbidden"}});break;default:D=this.prepareNotification(C)}C.preventDefault=()=>{this.notificationService.cancel(D)},C.ignoreStatusCode=function(P){this.status===P&&this.preventDefault()}}return(0,yE._)(C)}))}prepareNotification(t){return this.notificationService.show(()=>{let o="";return Ar().isPlainObject(t.error)&&Ar().isString(t.error.detail)?o=t.error.detail:Ar().isString(t.error)?o=t.error:Ar().isString(t.message)&&(o=t.message),new wv.T(_a.k.error,`${t.status} - ${t.statusText}`,o,void 0,t.application)})}}return n.\u0275fac=function(t){return new(t||n)(e.LFG(Yo.F0),e.LFG(_t.j),e.LFG(ll.g))},n.\u0275prov=e.Yz7({token:n,factory:n.\u0275fac,providedIn:"root"}),n})(),c7=(()=>{class n{constructor(t){this.http=t}jsError(t,o,c){return this.http.post("ui-api/logging/js-error",{url:t,message:o,stack:c})}}return n.\u0275fac=function(t){return new(t||n)(e.LFG(y.eN))},n.\u0275prov=e.Yz7({token:n,factory:n.\u0275fac,providedIn:"root"}),n})(),d7=(()=>{class n{constructor(t,o){this.injector=t,this.router=o}handleError(t){const o=this.injector.get(c7),c=window.location.href;if(o.jsError(c,t&&t.message,t&&t.stack).subscribe(),!(t.rejection instanceof Nl.s9))throw t;setTimeout(()=>this.router.navigate(["error"],{state:{message:t.rejection.message,header:t.rejection.header,icon:t.rejection.icon}}),50)}}return n.\u0275fac=function(t){return new(t||n)(e.LFG(e.zs3),e.LFG(Yo.F0))},n.\u0275prov=e.Yz7({token:n,factory:n.\u0275fac}),n})(),f7=(()=>{class n{}return n.\u0275fac=function(t){return new(t||n)},n.\u0275mod=e.oAB({type:n,bootstrap:[e7]}),n.\u0275inj=e.cJS({providers:[{provide:e.qLn,useClass:d7},{provide:y.TP,useClass:u7,multi:!0},{provide:_.mr,useValue:"/"+(window.location.pathname.split("/",1)[1]||"")}],imports:[[y.JF,f.b2,Gs,Hu.Rh.forRoot({positionClass:"toast-top-right",preventDuplicates:!0,enableHtml:!0}),DA,l7,bm.m,s7],bm.m]}),n})();WC.N.production&&(0,e.G48)(),f.q6().bootstrapModule(f7).then(n=>{if((0,e.X6Q)()){const t=n.injector.get(e.z2F).components[0];(0,f.HJ)(t)}}).catch(n=>console.log(n))},77340:(v,S,i)=>{var r=i(25591),u=i(60802),p=TypeError;v.exports=function(f){if(r(f))return f;throw p(u(f)+" is not a function")}},95143:(v,S,i)=>{var r=i(25591),u=String,p=TypeError;v.exports=function(f){if("object"==typeof f||r(f))return f;throw p("Can't set "+u(f)+" as a prototype")}},24094:(v,S,i)=>{var r=i(84563),u=i(38724),p=i(52975).f,f=r("unscopables"),e=Array.prototype;null==e[f]&&p(e,f,{configurable:!0,value:u(null)}),v.exports=function(_){e[f][_]=!0}},27678:(v,S,i)=>{"use strict";var r=i(64487).charAt;v.exports=function(u,p,f){return p+(f?r(u,p).length:1)}},86063:(v,S,i)=>{var r=i(93290),u=TypeError;v.exports=function(p,f){if(r(f,p))return p;throw u("Incorrect invocation")}},21099:(v,S,i)=>{var r=i(60726),u=String,p=TypeError;v.exports=function(f){if(r(f))return f;throw p(u(f)+" is not an object")}},93241:(v,S,i)=>{var r=i(8597);v.exports=r(function(){if("function"==typeof ArrayBuffer){var u=new ArrayBuffer(8);Object.isExtensible(u)&&Object.defineProperty(u,"a",{value:8})}})},70452:(v,S,i)=>{var r=i(8643),u=i(20222),p=i(24196),f=function(e){return function(_,y,T){var Z,M=r(_),R=p(M),F=u(T,R);if(e&&y!=y){for(;R>F;)if((Z=M[F++])!=Z)return!0}else for(;R>F;F++)if((e||F in M)&&M[F]===y)return e||F||0;return!e&&-1}};v.exports={includes:f(!0),indexOf:f(!1)}},94115:(v,S,i)=>{var r=i(29727),u=i(47964),p=i(56169),f=i(16174),e=i(24196),_=i(62889),y=u([].push),T=function(M){var R=1==M,F=2==M,Z=3==M,J=4==M,Q=6==M,ee=7==M,ue=5==M||Q;return function(ae,$,se,ve){for(var Ye,je,oe=f(ae),he=p(oe),me=r($,se),Oe=e(he),ce=0,dt=ve||_,ze=R?dt(ae,Oe):F||ee?dt(ae,0):void 0;Oe>ce;ce++)if((ue||ce in he)&&(je=me(Ye=he[ce],ce,oe),M))if(R)ze[ce]=je;else if(je)switch(M){case 3:return!0;case 5:return Ye;case 6:return ce;case 2:y(ze,Ye)}else switch(M){case 4:return!1;case 7:y(ze,Ye)}return Q?-1:Z||J?J:ze}};v.exports={forEach:T(0),map:T(1),filter:T(2),some:T(3),every:T(4),find:T(5),findIndex:T(6),filterReject:T(7)}},37394:(v,S,i)=>{var r=i(8597),u=i(84563),p=i(17189),f=u("species");v.exports=function(e){return p>=51||!r(function(){var _=[];return(_.constructor={})[f]=function(){return{foo:1}},1!==_[e](Boolean).foo})}},47051:(v,S,i)=>{"use strict";var r=i(8597);v.exports=function(u,p){var f=[][u];return!!f&&r(function(){f.call(null,p||function(){return 1},1)})}},14716:(v,S,i)=>{var r=i(77340),u=i(16174),p=i(56169),f=i(24196),e=TypeError,_=function(y){return function(T,M,R,F){r(M);var Z=u(T),J=p(Z),Q=f(Z),ee=y?Q-1:0,ue=y?-1:1;if(R<2)for(;;){if(ee in J){F=J[ee],ee+=ue;break}if(ee+=ue,y?ee<0:Q<=ee)throw e("Reduce of empty array with no initial value")}for(;y?ee>=0:Q>ee;ee+=ue)ee in J&&(F=M(F,J[ee],ee,Z));return F}};v.exports={left:_(!1),right:_(!0)}},32342:(v,S,i)=>{var r=i(20222),u=i(24196),p=i(45347),f=Array,e=Math.max;v.exports=function(_,y,T){for(var M=u(_),R=r(y,M),F=r(void 0===T?M:T,M),Z=f(e(F-R,0)),J=0;R<F;R++,J++)p(Z,J,_[R]);return Z.length=J,Z}},71497:(v,S,i)=>{var r=i(47883),u=i(57995),p=i(60726),e=i(84563)("species"),_=Array;v.exports=function(y){var T;return r(y)&&(u(T=y.constructor)&&(T===_||r(T.prototype))||p(T)&&null===(T=T[e]))&&(T=void 0),void 0===T?_:T}},62889:(v,S,i)=>{var r=i(71497);v.exports=function(u,p){return new(r(u))(0===p?0:p)}},56297:(v,S,i)=>{var u=i(84563)("iterator"),p=!1;try{var f=0,e={next:function(){return{done:!!f++}},return:function(){p=!0}};e[u]=function(){return this},Array.from(e,function(){throw 2})}catch(_){}v.exports=function(_,y){if(!y&&!p)return!1;var T=!1;try{var M={};M[u]=function(){return{next:function(){return{done:T=!0}}}},_(M)}catch(R){}return T}},96644:(v,S,i)=>{var r=i(47964),u=r({}.toString),p=r("".slice);v.exports=function(f){return p(u(f),8,-1)}},99420:(v,S,i)=>{var r=i(72900),u=i(25591),p=i(96644),e=i(84563)("toStringTag"),_=Object,y="Arguments"==p(function(){return arguments}());v.exports=r?p:function(M){var R,F,Z;return void 0===M?"Undefined":null===M?"Null":"string"==typeof(F=function(M,R){try{return M[R]}catch(F){}}(R=_(M),e))?F:y?p(R):"Object"==(Z=p(R))&&u(R.callee)?"Arguments":Z}},96491:(v,S,i)=>{"use strict";var r=i(47964),u=i(41292),p=i(64238).getWeakData,f=i(21099),e=i(60726),_=i(86063),y=i(53284),T=i(94115),M=i(62445),R=i(52493),F=R.set,Z=R.getterFor,J=T.find,Q=T.findIndex,ee=r([].splice),ue=0,ae=function(ve){return ve.frozen||(ve.frozen=new $)},$=function(){this.entries=[]},se=function(ve,oe){return J(ve.entries,function(he){return he[0]===oe})};$.prototype={get:function(ve){var oe=se(this,ve);if(oe)return oe[1]},has:function(ve){return!!se(this,ve)},set:function(ve,oe){var he=se(this,ve);he?he[1]=oe:this.entries.push([ve,oe])},delete:function(ve){var oe=Q(this.entries,function(he){return he[0]===ve});return~oe&&ee(this.entries,oe,1),!!~oe}},v.exports={getConstructor:function(ve,oe,he,me){var Oe=ve(function(Ye,je){_(Ye,ce),F(Ye,{type:oe,id:ue++,frozen:void 0}),null!=je&&y(je,Ye[me],{that:Ye,AS_ENTRIES:he})}),ce=Oe.prototype,dt=Z(oe),ze=function(Ye,je,Ie){var Ve=dt(Ye),He=p(f(je),!0);return!0===He?ae(Ve).set(je,Ie):He[Ve.id]=Ie,Ye};return u(ce,{delete:function(Ye){var je=dt(this);if(!e(Ye))return!1;var Ie=p(Ye);return!0===Ie?ae(je).delete(Ye):Ie&&M(Ie,je.id)&&delete Ie[je.id]},has:function(je){var Ie=dt(this);if(!e(je))return!1;var Ve=p(je);return!0===Ve?ae(Ie).has(je):Ve&&M(Ve,Ie.id)}}),u(ce,he?{get:function(je){var Ie=dt(this);if(e(je)){var Ve=p(je);return!0===Ve?ae(Ie).get(je):Ve?Ve[Ie.id]:void 0}},set:function(je,Ie){return ze(this,je,Ie)}}:{add:function(je){return ze(this,je,!0)}}),Oe}}},41603:(v,S,i)=>{"use strict";var r=i(51163),u=i(31864),p=i(47964),f=i(87215),e=i(70688),_=i(64238),y=i(53284),T=i(86063),M=i(25591),R=i(60726),F=i(8597),Z=i(56297),J=i(58242),Q=i(38267);v.exports=function(ee,ue,ae){var $=-1!==ee.indexOf("Map"),se=-1!==ee.indexOf("Weak"),ve=$?"set":"add",oe=u[ee],he=oe&&oe.prototype,me=oe,Oe={},ce=function(He){var Zt=p(he[He]);e(he,He,"add"==He?function(en){return Zt(this,0===en?0:en),this}:"delete"==He?function(st){return!(se&&!R(st))&&Zt(this,0===st?0:st)}:"get"==He?function(en){return se&&!R(en)?void 0:Zt(this,0===en?0:en)}:"has"==He?function(en){return!(se&&!R(en))&&Zt(this,0===en?0:en)}:function(en,$t){return Zt(this,0===en?0:en,$t),this})};if(f(ee,!M(oe)||!(se||he.forEach&&!F(function(){(new oe).entries().next()}))))me=ae.getConstructor(ue,ee,$,ve),_.enable();else if(f(ee,!0)){var ze=new me,Ye=ze[ve](se?{}:-0,1)!=ze,je=F(function(){ze.has(1)}),Ie=Z(function(He){new oe(He)}),Ve=!se&&F(function(){for(var He=new oe,Zt=5;Zt--;)He[ve](Zt,Zt);return!He.has(-0)});Ie||((me=ue(function(He,Zt){T(He,he);var st=Q(new oe,He,me);return null!=Zt&&y(Zt,st[ve],{that:st,AS_ENTRIES:$}),st})).prototype=he,he.constructor=me),(je||Ve)&&(ce("delete"),ce("has"),$&&ce("get")),(Ve||Ye)&&ce(ve),se&&he.clear&&delete he.clear}return Oe[ee]=me,r({global:!0,constructor:!0,forced:me!=oe},Oe),J(me,ee),se||ae.setStrong(me,ee,$),me}},30009:(v,S,i)=>{var r=i(62445),u=i(99376),p=i(93099),f=i(52975);v.exports=function(e,_,y){for(var T=u(_),M=f.f,R=p.f,F=0;F<T.length;F++){var Z=T[F];!r(e,Z)&&(!y||!r(y,Z))&&M(e,Z,R(_,Z))}}},51335:(v,S,i)=>{var r=i(8597);v.exports=!r(function(){function u(){}return u.prototype.constructor=null,Object.getPrototypeOf(new u)!==u.prototype})},17453:(v,S,i)=>{"use strict";var r=i(92053).IteratorPrototype,u=i(38724),p=i(53203),f=i(58242),e=i(72339),_=function(){return this};v.exports=function(y,T,M,R){var F=T+" Iterator";return y.prototype=u(r,{next:p(+!R,M)}),f(y,F,!1,!0),e[F]=_,y}},815:(v,S,i)=>{var r=i(47012),u=i(52975),p=i(53203);v.exports=r?function(f,e,_){return u.f(f,e,p(1,_))}:function(f,e,_){return f[e]=_,f}},53203:v=>{v.exports=function(S,i){return{enumerable:!(1&S),configurable:!(2&S),writable:!(4&S),value:i}}},45347:(v,S,i)=>{"use strict";var r=i(16582),u=i(52975),p=i(53203);v.exports=function(f,e,_){var y=r(e);y in f?u.f(f,y,p(0,_)):f[y]=_}},70688:(v,S,i)=>{var r=i(25591),u=i(52975),p=i(74952),f=i(11996);v.exports=function(e,_,y,T){T||(T={});var M=T.enumerable,R=void 0!==T.name?T.name:_;if(r(y)&&p(y,R,T),T.global)M?e[_]=y:f(_,y);else{try{T.unsafe?e[_]&&(M=!0):delete e[_]}catch(F){}M?e[_]=y:u.f(e,_,{value:y,enumerable:!1,configurable:!T.nonConfigurable,writable:!T.nonWritable})}return e}},41292:(v,S,i)=>{var r=i(70688);v.exports=function(u,p,f){for(var e in p)r(u,e,p[e],f);return u}},11996:(v,S,i)=>{var r=i(31864),u=Object.defineProperty;v.exports=function(p,f){try{u(r,p,{value:f,configurable:!0,writable:!0})}catch(e){r[p]=f}return f}},66038:(v,S,i)=>{"use strict";var r=i(51163),u=i(757),p=i(97515),f=i(20538),e=i(25591),_=i(17453),y=i(3963),T=i(91464),M=i(58242),R=i(815),F=i(70688),Z=i(84563),J=i(72339),Q=i(92053),ee=f.PROPER,ue=f.CONFIGURABLE,ae=Q.IteratorPrototype,$=Q.BUGGY_SAFARI_ITERATORS,se=Z("iterator"),oe="values",he="entries",me=function(){return this};v.exports=function(Oe,ce,dt,ze,Ye,je,Ie){_(dt,ce,ze);var Ut,Bt,mt,Ve=function(Yt){if(Yt===Ye&&$t)return $t;if(!$&&Yt in st)return st[Yt];switch(Yt){case"keys":case oe:case he:return function(){return new dt(this,Yt)}}return function(){return new dt(this)}},He=ce+" Iterator",Zt=!1,st=Oe.prototype,en=st[se]||st["@@iterator"]||Ye&&st[Ye],$t=!$&&en||Ve(Ye),Gt="Array"==ce&&st.entries||en;if(Gt&&(Ut=y(Gt.call(new Oe)))!==Object.prototype&&Ut.next&&(!p&&y(Ut)!==ae&&(T?T(Ut,ae):e(Ut[se])||F(Ut,se,me)),M(Ut,He,!0,!0),p&&(J[He]=me)),ee&&Ye==oe&&en&&en.name!==oe&&(!p&&ue?R(st,"name",oe):(Zt=!0,$t=function(){return u(en,this)})),Ye)if(Bt={values:Ve(oe),keys:je?$t:Ve("keys"),entries:Ve(he)},Ie)for(mt in Bt)($||Zt||!(mt in st))&&F(st,mt,Bt[mt]);else r({target:ce,proto:!0,forced:$||Zt},Bt);return(!p||Ie)&&st[se]!==$t&&F(st,se,$t,{name:Ye}),J[ce]=$t,Bt}},47012:(v,S,i)=>{var r=i(8597);v.exports=!r(function(){return 7!=Object.defineProperty({},1,{get:function(){return 7}})[1]})},85815:(v,S,i)=>{var r=i(31864),u=i(60726),p=r.document,f=u(p)&&u(p.createElement);v.exports=function(e){return f?p.createElement(e):{}}},26877:v=>{v.exports={CSSRuleList:0,CSSStyleDeclaration:0,CSSValueList:0,ClientRectList:0,DOMRectList:0,DOMStringList:0,DOMTokenList:1,DataTransferItemList:0,FileList:0,HTMLAllCollection:0,HTMLCollection:0,HTMLFormElement:0,HTMLSelectElement:0,MediaList:0,MimeTypeArray:0,NamedNodeMap:0,NodeList:1,PaintRequestList:0,Plugin:0,PluginArray:0,SVGLengthList:0,SVGNumberList:0,SVGPathSegList:0,SVGPointList:0,SVGStringList:0,SVGTransformList:0,SourceBufferList:0,StyleSheetList:0,TextTrackCueList:0,TextTrackList:0,TouchList:0}},20713:(v,S,i)=>{var u=i(85815)("span").classList,p=u&&u.constructor&&u.constructor.prototype;v.exports=p===Object.prototype?void 0:p},32002:(v,S,i)=>{var r=i(96644),u=i(31864);v.exports="process"==r(u.process)},73792:(v,S,i)=>{var r=i(73626);v.exports=r("navigator","userAgent")||""},17189:(v,S,i)=>{var y,T,r=i(31864),u=i(73792),p=r.process,f=r.Deno,e=p&&p.versions||f&&f.version,_=e&&e.v8;_&&(T=(y=_.split("."))[0]>0&&y[0]<4?1:+(y[0]+y[1])),!T&&u&&(!(y=u.match(/Edge\/(\d+)/))||y[1]>=74)&&(y=u.match(/Chrome\/(\d+)/))&&(T=+y[1]),v.exports=T},71001:v=>{v.exports=["constructor","hasOwnProperty","isPrototypeOf","propertyIsEnumerable","toLocaleString","toString","valueOf"]},51163:(v,S,i)=>{var r=i(31864),u=i(93099).f,p=i(815),f=i(70688),e=i(11996),_=i(30009),y=i(87215);v.exports=function(T,M){var Q,ee,ue,ae,$,R=T.target,F=T.global,Z=T.stat;if(Q=F?r:Z?r[R]||e(R,{}):(r[R]||{}).prototype)for(ee in M){if(ae=M[ee],ue=T.dontCallGetSet?($=u(Q,ee))&&$.value:Q[ee],!y(F?ee:R+(Z?".":"#")+ee,T.forced)&&void 0!==ue){if(typeof ae==typeof ue)continue;_(ae,ue)}(T.sham||ue&&ue.sham)&&p(ae,"sham",!0),f(Q,ee,ae,T)}}},8597:v=>{v.exports=function(S){try{return!!S()}catch(i){return!0}}},9357:(v,S,i)=>{"use strict";i(69665);var r=i(47964),u=i(70688),p=i(93084),f=i(8597),e=i(84563),_=i(815),y=e("species"),T=RegExp.prototype;v.exports=function(M,R,F,Z){var J=e(M),Q=!f(function(){var $={};return $[J]=function(){return 7},7!=""[M]($)}),ee=Q&&!f(function(){var $=!1,se=/a/;return"split"===M&&((se={}).constructor={},se.constructor[y]=function(){return se},se.flags="",se[J]=/./[J]),se.exec=function(){return $=!0,null},se[J](""),!$});if(!Q||!ee||F){var ue=r(/./[J]),ae=R(J,""[M],function($,se,ve,oe,he){var me=r($),Oe=se.exec;return Oe===p||Oe===T.exec?Q&&!he?{done:!0,value:ue(se,ve,oe)}:{done:!0,value:me(ve,se,oe)}:{done:!1}});u(String.prototype,M,ae[0]),u(T,J,ae[1])}Z&&_(T[J],"sham",!0)}},39352:(v,S,i)=>{var r=i(8597);v.exports=!r(function(){return Object.isExtensible(Object.preventExtensions({}))})},32328:(v,S,i)=>{var r=i(4459),u=Function.prototype,p=u.apply,f=u.call;v.exports="object"==typeof Reflect&&Reflect.apply||(r?f.bind(p):function(){return f.apply(p,arguments)})},29727:(v,S,i)=>{var r=i(47964),u=i(77340),p=i(4459),f=r(r.bind);v.exports=function(e,_){return u(e),void 0===_?e:p?f(e,_):function(){return e.apply(_,arguments)}}},4459:(v,S,i)=>{var r=i(8597);v.exports=!r(function(){var u=function(){}.bind();return"function"!=typeof u||u.hasOwnProperty("prototype")})},757:(v,S,i)=>{var r=i(4459),u=Function.prototype.call;v.exports=r?u.bind(u):function(){return u.apply(u,arguments)}},20538:(v,S,i)=>{var r=i(47012),u=i(62445),p=Function.prototype,f=r&&Object.getOwnPropertyDescriptor,e=u(p,"name"),_=e&&"something"===function(){}.name,y=e&&(!r||r&&f(p,"name").configurable);v.exports={EXISTS:e,PROPER:_,CONFIGURABLE:y}},47964:(v,S,i)=>{var r=i(4459),u=Function.prototype,f=u.call,e=r&&u.bind.bind(f,f);v.exports=r?function(_){return _&&e(_)}:function(_){return _&&function(){return f.apply(_,arguments)}}},73626:(v,S,i)=>{var r=i(31864),u=i(25591),p=function(f){return u(f)?f:void 0};v.exports=function(f,e){return arguments.length<2?p(r[f]):r[f]&&r[f][e]}},63076:(v,S,i)=>{var r=i(99420),u=i(35642),p=i(72339),e=i(84563)("iterator");v.exports=function(_){if(null!=_)return u(_,e)||u(_,"@@iterator")||p[r(_)]}},36414:(v,S,i)=>{var r=i(757),u=i(77340),p=i(21099),f=i(60802),e=i(63076),_=TypeError;v.exports=function(y,T){var M=arguments.length<2?e(y):T;if(u(M))return p(r(M,y));throw _(f(y)+" is not iterable")}},35642:(v,S,i)=>{var r=i(77340);v.exports=function(u,p){var f=u[p];return null==f?void 0:r(f)}},16162:(v,S,i)=>{var r=i(47964),u=i(16174),p=Math.floor,f=r("".charAt),e=r("".replace),_=r("".slice),y=/\$([$&'`]|\d{1,2}|<[^>]*>)/g,T=/\$([$&'`]|\d{1,2})/g;v.exports=function(M,R,F,Z,J,Q){var ee=F+M.length,ue=Z.length,ae=T;return void 0!==J&&(J=u(J),ae=y),e(Q,ae,function($,se){var ve;switch(f(se,0)){case"$":return"$";case"&":return M;case"`":return _(R,0,F);case"'":return _(R,ee);case"<":ve=J[_(se,1,-1)];break;default:var oe=+se;if(0===oe)return $;if(oe>ue){var he=p(oe/10);return 0===he?$:he<=ue?void 0===Z[he-1]?f(se,1):Z[he-1]+f(se,1):$}ve=Z[oe-1]}return void 0===ve?"":ve})}},31864:v=>{var S=function(i){return i&&i.Math==Math&&i};v.exports=S("object"==typeof globalThis&&globalThis)||S("object"==typeof window&&window)||S("object"==typeof self&&self)||S("object"==typeof global&&global)||function(){return this}()||Function("return this")()},62445:(v,S,i)=>{var r=i(47964),u=i(16174),p=r({}.hasOwnProperty);v.exports=Object.hasOwn||function(e,_){return p(u(e),_)}},3536:v=>{v.exports={}},67538:(v,S,i)=>{var r=i(73626);v.exports=r("document","documentElement")},27091:(v,S,i)=>{var r=i(47012),u=i(8597),p=i(85815);v.exports=!r&&!u(function(){return 7!=Object.defineProperty(p("div"),"a",{get:function(){return 7}}).a})},56169:(v,S,i)=>{var r=i(47964),u=i(8597),p=i(96644),f=Object,e=r("".split);v.exports=u(function(){return!f("z").propertyIsEnumerable(0)})?function(_){return"String"==p(_)?e(_,""):f(_)}:f},38267:(v,S,i)=>{var r=i(25591),u=i(60726),p=i(91464);v.exports=function(f,e,_){var y,T;return p&&r(y=e.constructor)&&y!==_&&u(T=y.prototype)&&T!==_.prototype&&p(f,T),f}},87720:(v,S,i)=>{var r=i(47964),u=i(25591),p=i(59941),f=r(Function.toString);u(p.inspectSource)||(p.inspectSource=function(e){return f(e)}),v.exports=p.inspectSource},64238:(v,S,i)=>{var r=i(51163),u=i(47964),p=i(3536),f=i(60726),e=i(62445),_=i(52975).f,y=i(94564),T=i(7388),M=i(67117),R=i(94295),F=i(39352),Z=!1,J=R("meta"),Q=0,ee=function(oe){_(oe,J,{value:{objectID:"O"+Q++,weakData:{}}})},ve=v.exports={enable:function(){ve.enable=function(){},Z=!0;var oe=y.f,he=u([].splice),me={};me[J]=1,oe(me).length&&(y.f=function(Oe){for(var ce=oe(Oe),dt=0,ze=ce.length;dt<ze;dt++)if(ce[dt]===J){he(ce,dt,1);break}return ce},r({target:"Object",stat:!0,forced:!0},{getOwnPropertyNames:T.f}))},fastKey:function(oe,he){if(!f(oe))return"symbol"==typeof oe?oe:("string"==typeof oe?"S":"P")+oe;if(!e(oe,J)){if(!M(oe))return"F";if(!he)return"E";ee(oe)}return oe[J].objectID},getWeakData:function(oe,he){if(!e(oe,J)){if(!M(oe))return!0;if(!he)return!1;ee(oe)}return oe[J].weakData},onFreeze:function(oe){return F&&Z&&M(oe)&&!e(oe,J)&&ee(oe),oe}};p[J]=!0},52493:(v,S,i)=>{var J,Q,ee,r=i(51635),u=i(31864),p=i(47964),f=i(60726),e=i(815),_=i(62445),y=i(59941),T=i(42650),M=i(3536),R="Object already initialized",F=u.TypeError;if(r||y.state){var $=y.state||(y.state=new(0,u.WeakMap)),se=p($.get),ve=p($.has),oe=p($.set);J=function(me,Oe){if(ve($,me))throw new F(R);return Oe.facade=me,oe($,me,Oe),Oe},Q=function(me){return se($,me)||{}},ee=function(me){return ve($,me)}}else{var he=T("state");M[he]=!0,J=function(me,Oe){if(_(me,he))throw new F(R);return Oe.facade=me,e(me,he,Oe),Oe},Q=function(me){return _(me,he)?me[he]:{}},ee=function(me){return _(me,he)}}v.exports={set:J,get:Q,has:ee,enforce:function(me){return ee(me)?Q(me):J(me,{})},getterFor:function(me){return function(Oe){var ce;if(!f(Oe)||(ce=Q(Oe)).type!==me)throw F("Incompatible receiver, "+me+" required");return ce}}}},81643:(v,S,i)=>{var r=i(84563),u=i(72339),p=r("iterator"),f=Array.prototype;v.exports=function(e){return void 0!==e&&(u.Array===e||f[p]===e)}},47883:(v,S,i)=>{var r=i(96644);v.exports=Array.isArray||function(p){return"Array"==r(p)}},25591:v=>{v.exports=function(S){return"function"==typeof S}},57995:(v,S,i)=>{var r=i(47964),u=i(8597),p=i(25591),f=i(99420),e=i(73626),_=i(87720),y=function(){},T=[],M=e("Reflect","construct"),R=/^\s*(?:class|function)\b/,F=r(R.exec),Z=!R.exec(y),J=function(ue){if(!p(ue))return!1;try{return M(y,T,ue),!0}catch(ae){return!1}},Q=function(ue){if(!p(ue))return!1;switch(f(ue)){case"AsyncFunction":case"GeneratorFunction":case"AsyncGeneratorFunction":return!1}try{return Z||!!F(R,_(ue))}catch(ae){return!0}};Q.sham=!0,v.exports=!M||u(function(){var ee;return J(J.call)||!J(Object)||!J(function(){ee=!0})||ee})?Q:J},87215:(v,S,i)=>{var r=i(8597),u=i(25591),p=/#|\.prototype\./,f=function(M,R){var F=_[e(M)];return F==T||F!=y&&(u(R)?r(R):!!R)},e=f.normalize=function(M){return String(M).replace(p,".").toLowerCase()},_=f.data={},y=f.NATIVE="N",T=f.POLYFILL="P";v.exports=f},60726:(v,S,i)=>{var r=i(25591);v.exports=function(u){return"object"==typeof u?null!==u:r(u)}},97515:v=>{v.exports=!1},26186:(v,S,i)=>{var r=i(73626),u=i(25591),p=i(93290),f=i(24431),e=Object;v.exports=f?function(_){return"symbol"==typeof _}:function(_){var y=r("Symbol");return u(y)&&p(y.prototype,e(_))}},53284:(v,S,i)=>{var r=i(29727),u=i(757),p=i(21099),f=i(60802),e=i(81643),_=i(24196),y=i(93290),T=i(36414),M=i(63076),R=i(87883),F=TypeError,Z=function(Q,ee){this.stopped=Q,this.result=ee},J=Z.prototype;v.exports=function(Q,ee,ue){var me,Oe,ce,dt,ze,Ye,je,$=!(!ue||!ue.AS_ENTRIES),se=!(!ue||!ue.IS_RECORD),ve=!(!ue||!ue.IS_ITERATOR),oe=!(!ue||!ue.INTERRUPTED),he=r(ee,ue&&ue.that),Ie=function(He){return me&&R(me,"normal",He),new Z(!0,He)},Ve=function(He){return $?(p(He),oe?he(He[0],He[1],Ie):he(He[0],He[1])):oe?he(He,Ie):he(He)};if(se)me=Q.iterator;else if(ve)me=Q;else{if(!(Oe=M(Q)))throw F(f(Q)+" is not iterable");if(e(Oe)){for(ce=0,dt=_(Q);dt>ce;ce++)if((ze=Ve(Q[ce]))&&y(J,ze))return ze;return new Z(!1)}me=T(Q,Oe)}for(Ye=se?Q.next:me.next;!(je=u(Ye,me)).done;){try{ze=Ve(je.value)}catch(He){R(me,"throw",He)}if("object"==typeof ze&&ze&&y(J,ze))return ze}return new Z(!1)}},87883:(v,S,i)=>{var r=i(757),u=i(21099),p=i(35642);v.exports=function(f,e,_){var y,T;u(f);try{if(!(y=p(f,"return"))){if("throw"===e)throw _;return _}y=r(y,f)}catch(M){T=!0,y=M}if("throw"===e)throw _;if(T)throw y;return u(y),_}},92053:(v,S,i)=>{"use strict";var R,F,Z,r=i(8597),u=i(25591),p=i(38724),f=i(3963),e=i(70688),_=i(84563),y=i(97515),T=_("iterator"),M=!1;[].keys&&("next"in(Z=[].keys())?(F=f(f(Z)))!==Object.prototype&&(R=F):M=!0),null==R||r(function(){var Q={};return R[T].call(Q)!==Q})?R={}:y&&(R=p(R)),u(R[T])||e(R,T,function(){return this}),v.exports={IteratorPrototype:R,BUGGY_SAFARI_ITERATORS:M}},72339:v=>{v.exports={}},24196:(v,S,i)=>{var r=i(15902);v.exports=function(u){return r(u.length)}},74952:(v,S,i)=>{var r=i(8597),u=i(25591),p=i(62445),f=i(47012),e=i(20538).CONFIGURABLE,_=i(87720),y=i(52493),T=y.enforce,M=y.get,R=Object.defineProperty,F=f&&!r(function(){return 8!==R(function(){},"length",{value:8}).length}),Z=String(String).split("String"),J=v.exports=function(Q,ee,ue){"Symbol("===String(ee).slice(0,7)&&(ee="["+String(ee).replace(/^Symbol\(([^)]*)\)/,"$1")+"]"),ue&&ue.getter&&(ee="get "+ee),ue&&ue.setter&&(ee="set "+ee),(!p(Q,"name")||e&&Q.name!==ee)&&(f?R(Q,"name",{value:ee,configurable:!0}):Q.name=ee),F&&ue&&p(ue,"arity")&&Q.length!==ue.arity&&R(Q,"length",{value:ue.arity});try{ue&&p(ue,"constructor")&&ue.constructor?f&&R(Q,"prototype",{writable:!1}):Q.prototype&&(Q.prototype=void 0)}catch($){}var ae=T(Q);return p(ae,"source")||(ae.source=Z.join("string"==typeof ee?ee:"")),Q};Function.prototype.toString=J(function(){return u(this)&&M(this).source||_(this)},"toString")},58194:v=>{var S=Math.ceil,i=Math.floor;v.exports=Math.trunc||function(u){var p=+u;return(p>0?i:S)(p)}},77040:(v,S,i)=>{var r=i(17189),u=i(8597);v.exports=!!Object.getOwnPropertySymbols&&!u(function(){var p=Symbol();return!String(p)||!(Object(p)instanceof Symbol)||!Symbol.sham&&r&&r<41})},51635:(v,S,i)=>{var r=i(31864),u=i(25591),p=i(87720),f=r.WeakMap;v.exports=u(f)&&/native code/.test(p(f))},43656:(v,S,i)=>{var r=i(31864),u=i(8597),p=i(47964),f=i(73574),e=i(51664).trim,_=i(48004),y=r.parseInt,T=r.Symbol,M=T&&T.iterator,R=/^[+-]?0x/i,F=p(R.exec),Z=8!==y(_+"08")||22!==y(_+"0x16")||M&&!u(function(){y(Object(M))});v.exports=Z?function(Q,ee){var ue=e(f(Q));return y(ue,ee>>>0||(F(R,ue)?16:10))}:y},51746:(v,S,i)=>{"use strict";var r=i(47012),u=i(47964),p=i(757),f=i(8597),e=i(68032),_=i(77593),y=i(5600),T=i(16174),M=i(56169),R=Object.assign,F=Object.defineProperty,Z=u([].concat);v.exports=!R||f(function(){if(r&&1!==R({b:1},R(F({},"a",{enumerable:!0,get:function(){F(this,"b",{value:3,enumerable:!1})}}),{b:2})).b)return!0;var J={},Q={},ee=Symbol(),ue="abcdefghijklmnopqrst";return J[ee]=7,ue.split("").forEach(function(ae){Q[ae]=ae}),7!=R({},J)[ee]||e(R({},Q)).join("")!=ue})?function(Q,ee){for(var ue=T(Q),ae=arguments.length,$=1,se=_.f,ve=y.f;ae>$;)for(var ce,oe=M(arguments[$++]),he=se?Z(e(oe),se(oe)):e(oe),me=he.length,Oe=0;me>Oe;)ce=he[Oe++],(!r||p(ve,oe,ce))&&(ue[ce]=oe[ce]);return ue}:R},38724:(v,S,i)=>{var ae,r=i(21099),u=i(10988),p=i(71001),f=i(3536),e=i(67538),_=i(85815),y=i(42650),R="prototype",F="script",Z=y("IE_PROTO"),J=function(){},Q=function(se){return"<"+F+">"+se+"</"+F+">"},ee=function(se){se.write(Q("")),se.close();var ve=se.parentWindow.Object;return se=null,ve},$=function(){try{ae=new ActiveXObject("htmlfile")}catch(ve){}$="undefined"!=typeof document?document.domain&&ae?ee(ae):function(){var oe,se=_("iframe");return se.style.display="none",e.appendChild(se),se.src=String("javascript:"),(oe=se.contentWindow.document).open(),oe.write(Q("document.F=Object")),oe.close(),oe.F}():ee(ae);for(var se=p.length;se--;)delete $[R][p[se]];return $()};f[Z]=!0,v.exports=Object.create||function(ve,oe){var he;return null!==ve?(J[R]=r(ve),he=new J,J[R]=null,he[Z]=ve):he=$(),void 0===oe?he:u.f(he,oe)}},10988:(v,S,i)=>{var r=i(47012),u=i(52339),p=i(52975),f=i(21099),e=i(8643),_=i(68032);S.f=r&&!u?Object.defineProperties:function(T,M){f(T);for(var Q,R=e(M),F=_(M),Z=F.length,J=0;Z>J;)p.f(T,Q=F[J++],R[Q]);return T}},52975:(v,S,i)=>{var r=i(47012),u=i(27091),p=i(52339),f=i(21099),e=i(16582),_=TypeError,y=Object.defineProperty,T=Object.getOwnPropertyDescriptor,M="enumerable",R="configurable",F="writable";S.f=r?p?function(J,Q,ee){if(f(J),Q=e(Q),f(ee),"function"==typeof J&&"prototype"===Q&&"value"in ee&&F in ee&&!ee[F]){var ue=T(J,Q);ue&&ue[F]&&(J[Q]=ee.value,ee={configurable:R in ee?ee[R]:ue[R],enumerable:M in ee?ee[M]:ue[M],writable:!1})}return y(J,Q,ee)}:y:function(J,Q,ee){if(f(J),Q=e(Q),f(ee),u)try{return y(J,Q,ee)}catch(ue){}if("get"in ee||"set"in ee)throw _("Accessors not supported");return"value"in ee&&(J[Q]=ee.value),J}},93099:(v,S,i)=>{var r=i(47012),u=i(757),p=i(5600),f=i(53203),e=i(8643),_=i(16582),y=i(62445),T=i(27091),M=Object.getOwnPropertyDescriptor;S.f=r?M:function(F,Z){if(F=e(F),Z=_(Z),T)try{return M(F,Z)}catch(J){}if(y(F,Z))return f(!u(p.f,F,Z),F[Z])}},7388:(v,S,i)=>{var r=i(96644),u=i(8643),p=i(94564).f,f=i(32342),e="object"==typeof window&&window&&Object.getOwnPropertyNames?Object.getOwnPropertyNames(window):[];v.exports.f=function(T){return e&&"Window"==r(T)?function(y){try{return p(y)}catch(T){return f(e)}}(T):p(u(T))}},94564:(v,S,i)=>{var r=i(77759),p=i(71001).concat("length","prototype");S.f=Object.getOwnPropertyNames||function(e){return r(e,p)}},77593:(v,S)=>{S.f=Object.getOwnPropertySymbols},3963:(v,S,i)=>{var r=i(62445),u=i(25591),p=i(16174),f=i(42650),e=i(51335),_=f("IE_PROTO"),y=Object,T=y.prototype;v.exports=e?y.getPrototypeOf:function(M){var R=p(M);if(r(R,_))return R[_];var F=R.constructor;return u(F)&&R instanceof F?F.prototype:R instanceof y?T:null}},67117:(v,S,i)=>{var r=i(8597),u=i(60726),p=i(96644),f=i(93241),e=Object.isExtensible,_=r(function(){e(1)});v.exports=_||f?function(T){return!(!u(T)||f&&"ArrayBuffer"==p(T))&&(!e||e(T))}:e},93290:(v,S,i)=>{var r=i(47964);v.exports=r({}.isPrototypeOf)},77759:(v,S,i)=>{var r=i(47964),u=i(62445),p=i(8643),f=i(70452).indexOf,e=i(3536),_=r([].push);v.exports=function(y,T){var Z,M=p(y),R=0,F=[];for(Z in M)!u(e,Z)&&u(M,Z)&&_(F,Z);for(;T.length>R;)u(M,Z=T[R++])&&(~f(F,Z)||_(F,Z));return F}},68032:(v,S,i)=>{var r=i(77759),u=i(71001);v.exports=Object.keys||function(f){return r(f,u)}},5600:(v,S)=>{"use strict";var i={}.propertyIsEnumerable,r=Object.getOwnPropertyDescriptor,u=r&&!i.call({1:2},1);S.f=u?function(f){var e=r(this,f);return!!e&&e.enumerable}:i},91464:(v,S,i)=>{var r=i(47964),u=i(21099),p=i(95143);v.exports=Object.setPrototypeOf||("__proto__"in{}?function(){var _,f=!1,e={};try{(_=r(Object.getOwnPropertyDescriptor(Object.prototype,"__proto__").set))(e,[]),f=e instanceof Array}catch(y){}return function(T,M){return u(T),p(M),f?_(T,M):T.__proto__=M,T}}():void 0)},83119:(v,S,i)=>{"use strict";var r=i(72900),u=i(99420);v.exports=r?{}.toString:function(){return"[object "+u(this)+"]"}},48297:(v,S,i)=>{var r=i(757),u=i(25591),p=i(60726),f=TypeError;v.exports=function(e,_){var y,T;if("string"===_&&u(y=e.toString)&&!p(T=r(y,e))||u(y=e.valueOf)&&!p(T=r(y,e))||"string"!==_&&u(y=e.toString)&&!p(T=r(y,e)))return T;throw f("Can't convert object to primitive value")}},99376:(v,S,i)=>{var r=i(73626),u=i(47964),p=i(94564),f=i(77593),e=i(21099),_=u([].concat);v.exports=r("Reflect","ownKeys")||function(T){var M=p.f(e(T)),R=f.f;return R?_(M,R(T)):M}},53793:(v,S,i)=>{var r=i(757),u=i(21099),p=i(25591),f=i(96644),e=i(93084),_=TypeError;v.exports=function(y,T){var M=y.exec;if(p(M)){var R=r(M,y,T);return null!==R&&u(R),R}if("RegExp"===f(y))return r(e,y,T);throw _("RegExp#exec called on incompatible receiver")}},93084:(v,S,i)=>{"use strict";var he,me,r=i(757),u=i(47964),p=i(73574),f=i(41891),e=i(29895),_=i(77719),y=i(38724),T=i(52493).get,M=i(38126),R=i(31053),F=_("native-string-replace",String.prototype.replace),Z=RegExp.prototype.exec,J=Z,Q=u("".charAt),ee=u("".indexOf),ue=u("".replace),ae=u("".slice),$=(me=/b*/g,r(Z,he=/a/,"a"),r(Z,me,"a"),0!==he.lastIndex||0!==me.lastIndex),se=e.BROKEN_CARET,ve=void 0!==/()??/.exec("")[1];($||ve||se||M||R)&&(J=function(me){var Ye,je,Ie,Ve,He,Zt,st,Oe=this,ce=T(Oe),dt=p(me),ze=ce.raw;if(ze)return ze.lastIndex=Oe.lastIndex,Ye=r(J,ze,dt),Oe.lastIndex=ze.lastIndex,Ye;var en=ce.groups,$t=se&&Oe.sticky,Gt=r(f,Oe),Ut=Oe.source,Bt=0,mt=dt;if($t&&(Gt=ue(Gt,"y",""),-1===ee(Gt,"g")&&(Gt+="g"),mt=ae(dt,Oe.lastIndex),Oe.lastIndex>0&&(!Oe.multiline||Oe.multiline&&"\n"!==Q(dt,Oe.lastIndex-1))&&(Ut="(?: "+Ut+")",mt=" "+mt,Bt++),je=new RegExp("^(?:"+Ut+")",Gt)),ve&&(je=new RegExp("^"+Ut+"$(?!\\s)",Gt)),$&&(Ie=Oe.lastIndex),Ve=r(Z,$t?je:Oe,mt),$t?Ve?(Ve.input=ae(Ve.input,Bt),Ve[0]=ae(Ve[0],Bt),Ve.index=Oe.lastIndex,Oe.lastIndex+=Ve[0].length):Oe.lastIndex=0:$&&Ve&&(Oe.lastIndex=Oe.global?Ve.index+Ve[0].length:Ie),ve&&Ve&&Ve.length>1&&r(F,Ve[0],je,function(){for(He=1;He<arguments.length-2;He++)void 0===arguments[He]&&(Ve[He]=void 0)}),Ve&&en)for(Ve.groups=Zt=y(null),He=0;He<en.length;He++)Zt[(st=en[He])[0]]=Ve[st[1]];return Ve}),v.exports=J},41891:(v,S,i)=>{"use strict";var r=i(21099);v.exports=function(){var u=r(this),p="";return u.hasIndices&&(p+="d"),u.global&&(p+="g"),u.ignoreCase&&(p+="i"),u.multiline&&(p+="m"),u.dotAll&&(p+="s"),u.unicode&&(p+="u"),u.unicodeSets&&(p+="v"),u.sticky&&(p+="y"),p}},29895:(v,S,i)=>{var r=i(8597),p=i(31864).RegExp,f=r(function(){var y=p("a","y");return y.lastIndex=2,null!=y.exec("abcd")}),e=f||r(function(){return!p("a","y").sticky}),_=f||r(function(){var y=p("^r","gy");return y.lastIndex=2,null!=y.exec("str")});v.exports={BROKEN_CARET:_,MISSED_STICKY:e,UNSUPPORTED_Y:f}},38126:(v,S,i)=>{var r=i(8597),p=i(31864).RegExp;v.exports=r(function(){var f=p(".","s");return!(f.dotAll&&f.exec("\n")&&"s"===f.flags)})},31053:(v,S,i)=>{var r=i(8597),p=i(31864).RegExp;v.exports=r(function(){var f=p("(?<a>b)","g");return"b"!==f.exec("b").groups.a||"bc"!=="b".replace(f,"$<a>c")})},95025:v=>{var S=TypeError;v.exports=function(i){if(null==i)throw S("Can't call method on "+i);return i}},58242:(v,S,i)=>{var r=i(52975).f,u=i(62445),f=i(84563)("toStringTag");v.exports=function(e,_,y){e&&!y&&(e=e.prototype),e&&!u(e,f)&&r(e,f,{configurable:!0,value:_})}},42650:(v,S,i)=>{var r=i(77719),u=i(94295),p=r("keys");v.exports=function(f){return p[f]||(p[f]=u(f))}},59941:(v,S,i)=>{var r=i(31864),u=i(11996),p="__core-js_shared__",f=r[p]||u(p,{});v.exports=f},77719:(v,S,i)=>{var r=i(97515),u=i(59941);(v.exports=function(p,f){return u[p]||(u[p]=void 0!==f?f:{})})("versions",[]).push({version:"3.24.1",mode:r?"pure":"global",copyright:"\xa9 2014-2022 Denis Pushkarev (zloirock.ru)",license:"https://github.com/zloirock/core-js/blob/v3.24.1/LICENSE",source:"https://github.com/zloirock/core-js"})},64487:(v,S,i)=>{var r=i(47964),u=i(22157),p=i(73574),f=i(95025),e=r("".charAt),_=r("".charCodeAt),y=r("".slice),T=function(M){return function(R,F){var ee,ue,Z=p(f(R)),J=u(F),Q=Z.length;return J<0||J>=Q?M?"":void 0:(ee=_(Z,J))<55296||ee>56319||J+1===Q||(ue=_(Z,J+1))<56320||ue>57343?M?e(Z,J):ee:M?y(Z,J,J+2):ue-56320+(ee-55296<<10)+65536}};v.exports={codeAt:T(!1),charAt:T(!0)}},51664:(v,S,i)=>{var r=i(47964),u=i(95025),p=i(73574),f=i(48004),e=r("".replace),_="["+f+"]",y=RegExp("^"+_+_+"*"),T=RegExp(_+_+"*$"),M=function(R){return function(F){var Z=p(u(F));return 1&R&&(Z=e(Z,y,"")),2&R&&(Z=e(Z,T,"")),Z}};v.exports={start:M(1),end:M(2),trim:M(3)}},20222:(v,S,i)=>{var r=i(22157),u=Math.max,p=Math.min;v.exports=function(f,e){var _=r(f);return _<0?u(_+e,0):p(_,e)}},8643:(v,S,i)=>{var r=i(56169),u=i(95025);v.exports=function(p){return r(u(p))}},22157:(v,S,i)=>{var r=i(58194);v.exports=function(u){var p=+u;return p!=p||0===p?0:r(p)}},15902:(v,S,i)=>{var r=i(22157),u=Math.min;v.exports=function(p){return p>0?u(r(p),9007199254740991):0}},16174:(v,S,i)=>{var r=i(95025),u=Object;v.exports=function(p){return u(r(p))}},28495:(v,S,i)=>{var r=i(757),u=i(60726),p=i(26186),f=i(35642),e=i(48297),_=i(84563),y=TypeError,T=_("toPrimitive");v.exports=function(M,R){if(!u(M)||p(M))return M;var Z,F=f(M,T);if(F){if(void 0===R&&(R="default"),Z=r(F,M,R),!u(Z)||p(Z))return Z;throw y("Can't convert object to primitive value")}return void 0===R&&(R="number"),e(M,R)}},16582:(v,S,i)=>{var r=i(28495),u=i(26186);v.exports=function(p){var f=r(p,"string");return u(f)?f:f+""}},72900:(v,S,i)=>{var p={};p[i(84563)("toStringTag")]="z",v.exports="[object z]"===String(p)},73574:(v,S,i)=>{var r=i(99420),u=String;v.exports=function(p){if("Symbol"===r(p))throw TypeError("Cannot convert a Symbol value to a string");return u(p)}},60802:v=>{var S=String;v.exports=function(i){try{return S(i)}catch(r){return"Object"}}},94295:(v,S,i)=>{var r=i(47964),u=0,p=Math.random(),f=r(1..toString);v.exports=function(e){return"Symbol("+(void 0===e?"":e)+")_"+f(++u+p,36)}},24431:(v,S,i)=>{var r=i(77040);v.exports=r&&!Symbol.sham&&"symbol"==typeof Symbol.iterator},52339:(v,S,i)=>{var r=i(47012),u=i(8597);v.exports=r&&u(function(){return 42!=Object.defineProperty(function(){},"prototype",{value:42,writable:!1}).prototype})},84563:(v,S,i)=>{var r=i(31864),u=i(77719),p=i(62445),f=i(94295),e=i(77040),_=i(24431),y=u("wks"),T=r.Symbol,M=T&&T.for,R=_?T:T&&T.withoutSetter||f;v.exports=function(F){if(!p(y,F)||!e&&"string"!=typeof y[F]){var Z="Symbol."+F;y[F]=e&&p(T,F)?T[F]:_&&M?M(Z):R(Z)}return y[F]}},48004:v=>{v.exports="\t\n\v\f\r \xa0\u1680\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200a\u202f\u205f\u3000\u2028\u2029\ufeff"},85443:(v,S,i)=>{"use strict";var r=i(51163),u=i(94115).filter;r({target:"Array",proto:!0,forced:!i(37394)("filter")},{filter:function(_){return u(this,_,arguments.length>1?arguments[1]:void 0)}})},66837:(v,S,i)=>{"use strict";var r=i(8643),u=i(24094),p=i(72339),f=i(52493),e=i(52975).f,_=i(66038),y=i(97515),T=i(47012),M="Array Iterator",R=f.set,F=f.getterFor(M);v.exports=_(Array,"Array",function(J,Q){R(this,{type:M,target:r(J),index:0,kind:Q})},function(){var J=F(this),Q=J.target,ee=J.kind,ue=J.index++;return!Q||ue>=Q.length?(J.target=void 0,{value:void 0,done:!0}):"keys"==ee?{value:ue,done:!1}:"values"==ee?{value:Q[ue],done:!1}:{value:[ue,Q[ue]],done:!1}},"values");var Z=p.Arguments=p.Array;if(u("keys"),u("values"),u("entries"),!y&&T&&"values"!==Z.name)try{e(Z,"name",{value:"values"})}catch(J){}},35319:(v,S,i)=>{"use strict";var r=i(51163),u=i(14716).left,p=i(47051),f=i(17189),e=i(32002);r({target:"Array",proto:!0,forced:!p("reduce")||!e&&f>79&&f<83},{reduce:function(M){var R=arguments.length;return u(this,M,R,R>1?arguments[1]:void 0)}})},80477:(v,S,i)=>{var r=i(47012),u=i(20538).EXISTS,p=i(47964),f=i(52975).f,e=Function.prototype,_=p(e.toString),y=/function\b(?:\s|\/\*[\S\s]*?\*\/|\/\/[^\n\r]*[\n\r]+)*([^\s(/]*)/,T=p(y.exec);r&&!u&&f(e,"name",{configurable:!0,get:function(){try{return T(y,_(this))[1]}catch(R){return""}}})},8868:(v,S,i)=>{var r=i(51163),u=i(51746);r({target:"Object",stat:!0,arity:2,forced:Object.assign!==u},{assign:u})},35704:(v,S,i)=>{var r=i(72900),u=i(70688),p=i(83119);r||u(Object.prototype,"toString",p,{unsafe:!0})},21581:(v,S,i)=>{var r=i(51163),u=i(43656);r({global:!0,forced:parseInt!=u},{parseInt:u})},69665:(v,S,i)=>{"use strict";var r=i(51163),u=i(93084);r({target:"RegExp",proto:!0,forced:/./.exec!==u},{exec:u})},13744:(v,S,i)=>{"use strict";var r=i(64487).charAt,u=i(73574),p=i(52493),f=i(66038),e="String Iterator",_=p.set,y=p.getterFor(e);f(String,"String",function(T){_(this,{type:e,string:u(T),index:0})},function(){var Z,M=y(this),R=M.string,F=M.index;return F>=R.length?{value:void 0,done:!0}:(Z=r(R,F),M.index+=Z.length,{value:Z,done:!1})})},26954:(v,S,i)=>{"use strict";var r=i(757),u=i(9357),p=i(21099),f=i(15902),e=i(73574),_=i(95025),y=i(35642),T=i(27678),M=i(53793);u("match",function(R,F,Z){return[function(Q){var ee=_(this),ue=null==Q?void 0:y(Q,R);return ue?r(ue,Q,ee):new RegExp(Q)[R](e(ee))},function(J){var Q=p(this),ee=e(J),ue=Z(F,Q,ee);if(ue.done)return ue.value;if(!Q.global)return M(Q,ee);var ae=Q.unicode;Q.lastIndex=0;for(var ve,$=[],se=0;null!==(ve=M(Q,ee));){var oe=e(ve[0]);$[se]=oe,""===oe&&(Q.lastIndex=T(ee,f(Q.lastIndex),ae)),se++}return 0===se?null:$}]})},66262:(v,S,i)=>{"use strict";var r=i(32328),u=i(757),p=i(47964),f=i(9357),e=i(8597),_=i(21099),y=i(25591),T=i(22157),M=i(15902),R=i(73574),F=i(95025),Z=i(27678),J=i(35642),Q=i(16162),ee=i(53793),ae=i(84563)("replace"),$=Math.max,se=Math.min,ve=p([].concat),oe=p([].push),he=p("".indexOf),me=p("".slice),Oe=function(Ye){return void 0===Ye?Ye:String(Ye)},ce="$0"==="a".replace(/./,"$0"),dt=!!/./[ae]&&""===/./[ae]("a","$0");f("replace",function(Ye,je,Ie){var Ve=dt?"$":"$0";return[function(Zt,st){var en=F(this),$t=null==Zt?void 0:J(Zt,ae);return $t?u($t,Zt,en,st):u(je,R(en),Zt,st)},function(He,Zt){var st=_(this),en=R(He);if("string"==typeof Zt&&-1===he(Zt,Ve)&&-1===he(Zt,"$<")){var $t=Ie(je,st,en,Zt);if($t.done)return $t.value}var Gt=y(Zt);Gt||(Zt=R(Zt));var Ut=st.global;if(Ut){var Bt=st.unicode;st.lastIndex=0}for(var mt=[];;){var Yt=ee(st,en);if(null===Yt||(oe(mt,Yt),!Ut))break;""===R(Yt[0])&&(st.lastIndex=Z(en,M(st.lastIndex),Bt))}for(var zt="",Yn=0,Hr=0;Hr<mt.length;Hr++){for(var ci=R((Yt=mt[Hr])[0]),Ir=$(se(T(Yt.index),en.length),0),wr=[],Qr=1;Qr<Yt.length;Qr++)oe(wr,Oe(Yt[Qr]));var Kr=Yt.groups;if(Gt){var In=ve([ci],wr,Ir,en);void 0!==Kr&&oe(In,Kr);var Hn=R(r(Zt,void 0,In))}else Hn=Q(ci,en,Ir,wr,Kr,Zt);Ir>=Yn&&(zt+=me(en,Yn,Ir)+Hn,Yn=Ir+ci.length)}return zt+me(en,Yn)}]},!!e(function(){var Ye=/./;return Ye.exec=function(){var je=[];return je.groups={a:"7"},je},"7"!=="".replace(Ye,"$<a>")})||!ce||dt)},62913:(v,S,i)=>{"use strict";var Z,r=i(31864),u=i(47964),p=i(41292),f=i(64238),e=i(41603),_=i(96491),y=i(60726),T=i(67117),M=i(52493).enforce,R=i(51635),F=!r.ActiveXObject&&"ActiveXObject"in r,J=function(ve){return function(){return ve(this,arguments.length?arguments[0]:void 0)}},Q=e("WeakMap",J,_);if(R&&F){Z=_.getConstructor(J,"WeakMap",!0),f.enable();var ee=Q.prototype,ue=u(ee.delete),ae=u(ee.has),$=u(ee.get),se=u(ee.set);p(ee,{delete:function(ve){if(y(ve)&&!T(ve)){var oe=M(this);return oe.frozen||(oe.frozen=new Z),ue(this,ve)||oe.frozen.delete(ve)}return ue(this,ve)},has:function(oe){if(y(oe)&&!T(oe)){var he=M(this);return he.frozen||(he.frozen=new Z),ae(this,oe)||he.frozen.has(oe)}return ae(this,oe)},get:function(oe){if(y(oe)&&!T(oe)){var he=M(this);return he.frozen||(he.frozen=new Z),ae(this,oe)?$(this,oe):he.frozen.get(oe)}return $(this,oe)},set:function(oe,he){if(y(oe)&&!T(oe)){var me=M(this);me.frozen||(me.frozen=new Z),ae(this,oe)?se(this,oe,he):me.frozen.set(oe,he)}else se(this,oe,he);return this}})}},63438:(v,S,i)=>{i(62913)},22603:(v,S,i)=>{var r=i(31864),u=i(26877),p=i(20713),f=i(66837),e=i(815),_=i(84563),y=_("iterator"),T=_("toStringTag"),M=f.values,R=function(Z,J){if(Z){if(Z[y]!==M)try{e(Z,y,M)}catch(ee){Z[y]=M}if(Z[T]||e(Z,T,J),u[J])for(var Q in f)if(Z[Q]!==f[Q])try{e(Z,Q,f[Q])}catch(ee){Z[Q]=f[Q]}}};for(var F in u)R(r[F]&&r[F].prototype,F);R(p,"DOMTokenList")},64762:(v,S,i)=>{"use strict";i.d(S,{ZT:()=>u,pi:()=>p,_T:()=>f,gn:()=>e,fM:()=>_,w6:()=>y});var r=function(ze,Ye){return(r=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(je,Ie){je.__proto__=Ie}||function(je,Ie){for(var Ve in Ie)Object.prototype.hasOwnProperty.call(Ie,Ve)&&(je[Ve]=Ie[Ve])})(ze,Ye)};function u(ze,Ye){if("function"!=typeof Ye&&null!==Ye)throw new TypeError("Class extends value "+String(Ye)+" is not a constructor or null");function je(){this.constructor=ze}r(ze,Ye),ze.prototype=null===Ye?Object.create(Ye):(je.prototype=Ye.prototype,new je)}var p=function(){return(p=Object.assign||function(Ye){for(var je,Ie=1,Ve=arguments.length;Ie<Ve;Ie++)for(var He in je=arguments[Ie])Object.prototype.hasOwnProperty.call(je,He)&&(Ye[He]=je[He]);return Ye}).apply(this,arguments)};function f(ze,Ye){var je={};for(var Ie in ze)Object.prototype.hasOwnProperty.call(ze,Ie)&&Ye.indexOf(Ie)<0&&(je[Ie]=ze[Ie]);if(null!=ze&&"function"==typeof Object.getOwnPropertySymbols){var Ve=0;for(Ie=Object.getOwnPropertySymbols(ze);Ve<Ie.length;Ve++)Ye.indexOf(Ie[Ve])<0&&Object.prototype.propertyIsEnumerable.call(ze,Ie[Ve])&&(je[Ie[Ve]]=ze[Ie[Ve]])}return je}function e(ze,Ye,je,Ie){var Zt,Ve=arguments.length,He=Ve<3?Ye:null===Ie?Ie=Object.getOwnPropertyDescriptor(Ye,je):Ie;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)He=Reflect.decorate(ze,Ye,je,Ie);else for(var st=ze.length-1;st>=0;st--)(Zt=ze[st])&&(He=(Ve<3?Zt(He):Ve>3?Zt(Ye,je,He):Zt(Ye,je))||He);return Ve>3&&He&&Object.defineProperty(Ye,je,He),He}function _(ze,Ye){return function(je,Ie){Ye(je,Ie,ze)}}function y(ze,Ye){if("object"==typeof Reflect&&"function"==typeof Reflect.metadata)return Reflect.metadata(ze,Ye)}},46700:(v,S,i)=>{var r={"./af":26431,"./af.js":26431,"./ar":81286,"./ar-dz":1616,"./ar-dz.js":1616,"./ar-kw":9759,"./ar-kw.js":9759,"./ar-ly":43160,"./ar-ly.js":43160,"./ar-ma":62551,"./ar-ma.js":62551,"./ar-sa":79989,"./ar-sa.js":79989,"./ar-tn":6962,"./ar-tn.js":6962,"./ar.js":81286,"./az":15887,"./az.js":15887,"./be":14572,"./be.js":14572,"./bg":3276,"./bg.js":3276,"./bm":93344,"./bm.js":93344,"./bn":58985,"./bn-bd":83990,"./bn-bd.js":83990,"./bn.js":58985,"./bo":94391,"./bo.js":94391,"./br":46728,"./br.js":46728,"./bs":5536,"./bs.js":5536,"./ca":41043,"./ca.js":41043,"./cs":70420,"./cs.js":70420,"./cv":33513,"./cv.js":33513,"./cy":6771,"./cy.js":6771,"./da":47978,"./da.js":47978,"./de":46061,"./de-at":25204,"./de-at.js":25204,"./de-ch":2653,"./de-ch.js":2653,"./de.js":46061,"./dv":85,"./dv.js":85,"./el":8579,"./el.js":8579,"./en-au":25724,"./en-au.js":25724,"./en-ca":10525,"./en-ca.js":10525,"./en-gb":52847,"./en-gb.js":52847,"./en-ie":67216,"./en-ie.js":67216,"./en-il":39305,"./en-il.js":39305,"./en-in":73364,"./en-in.js":73364,"./en-nz":79130,"./en-nz.js":79130,"./en-sg":11161,"./en-sg.js":11161,"./eo":50802,"./eo.js":50802,"./es":40328,"./es-do":45551,"./es-do.js":45551,"./es-mx":75615,"./es-mx.js":75615,"./es-us":64790,"./es-us.js":64790,"./es.js":40328,"./et":96389,"./et.js":96389,"./eu":52961,"./eu.js":52961,"./fa":26151,"./fa.js":26151,"./fi":7997,"./fi.js":7997,"./fil":58898,"./fil.js":58898,"./fo":37779,"./fo.js":37779,"./fr":28174,"./fr-ca":3287,"./fr-ca.js":3287,"./fr-ch":38867,"./fr-ch.js":38867,"./fr.js":28174,"./fy":50452,"./fy.js":50452,"./ga":45014,"./ga.js":45014,"./gd":74127,"./gd.js":74127,"./gl":72124,"./gl.js":72124,"./gom-deva":6444,"./gom-deva.js":6444,"./gom-latn":37953,"./gom-latn.js":37953,"./gu":76604,"./gu.js":76604,"./he":1222,"./he.js":1222,"./hi":74235,"./hi.js":74235,"./hr":622,"./hr.js":622,"./hu":37735,"./hu.js":37735,"./hy-am":90402,"./hy-am.js":90402,"./id":59187,"./id.js":59187,"./is":30536,"./is.js":30536,"./it":35007,"./it-ch":94667,"./it-ch.js":94667,"./it.js":35007,"./ja":62093,"./ja.js":62093,"./jv":80059,"./jv.js":80059,"./ka":66870,"./ka.js":66870,"./kk":80880,"./kk.js":80880,"./km":1083,"./km.js":1083,"./kn":68785,"./kn.js":68785,"./ko":21721,"./ko.js":21721,"./ku":37851,"./ku.js":37851,"./ky":1727,"./ky.js":1727,"./lb":40346,"./lb.js":40346,"./lo":93002,"./lo.js":93002,"./lt":64035,"./lt.js":64035,"./lv":56927,"./lv.js":56927,"./me":5634,"./me.js":5634,"./mi":94173,"./mi.js":94173,"./mk":86320,"./mk.js":86320,"./ml":11705,"./ml.js":11705,"./mn":31062,"./mn.js":31062,"./mr":92805,"./mr.js":92805,"./ms":11341,"./ms-my":59900,"./ms-my.js":59900,"./ms.js":11341,"./mt":37734,"./mt.js":37734,"./my":19034,"./my.js":19034,"./nb":9324,"./nb.js":9324,"./ne":46495,"./ne.js":46495,"./nl":70673,"./nl-be":76272,"./nl-be.js":76272,"./nl.js":70673,"./nn":72486,"./nn.js":72486,"./oc-lnc":46219,"./oc-lnc.js":46219,"./pa-in":2829,"./pa-in.js":2829,"./pl":78444,"./pl.js":78444,"./pt":53170,"./pt-br":66117,"./pt-br.js":66117,"./pt.js":53170,"./ro":96587,"./ro.js":96587,"./ru":39264,"./ru.js":39264,"./sd":42135,"./sd.js":42135,"./se":95366,"./se.js":95366,"./si":93379,"./si.js":93379,"./sk":46143,"./sk.js":46143,"./sl":196,"./sl.js":196,"./sq":21082,"./sq.js":21082,"./sr":91621,"./sr-cyrl":98963,"./sr-cyrl.js":98963,"./sr.js":91621,"./ss":41404,"./ss.js":41404,"./sv":55685,"./sv.js":55685,"./sw":3872,"./sw.js":3872,"./ta":54106,"./ta.js":54106,"./te":39204,"./te.js":39204,"./tet":83692,"./tet.js":83692,"./tg":86361,"./tg.js":86361,"./th":31735,"./th.js":31735,"./tk":1568,"./tk.js":1568,"./tl-ph":96129,"./tl-ph.js":96129,"./tlh":13759,"./tlh.js":13759,"./tr":81644,"./tr.js":81644,"./tzl":90875,"./tzl.js":90875,"./tzm":16878,"./tzm-latn":11041,"./tzm-latn.js":11041,"./tzm.js":16878,"./ug-cn":74357,"./ug-cn.js":74357,"./uk":74810,"./uk.js":74810,"./ur":86794,"./ur.js":86794,"./uz":28966,"./uz-latn":77959,"./uz-latn.js":77959,"./uz.js":28966,"./vi":35386,"./vi.js":35386,"./x-pseudo":23156,"./x-pseudo.js":23156,"./yo":68028,"./yo.js":68028,"./zh-cn":9330,"./zh-cn.js":9330,"./zh-hk":89380,"./zh-hk.js":89380,"./zh-mo":60874,"./zh-mo.js":60874,"./zh-tw":96508,"./zh-tw.js":96508};function u(f){var e=p(f);return i(e)}function p(f){if(!i.o(r,f)){var e=new Error("Cannot find module '"+f+"'");throw e.code="MODULE_NOT_FOUND",e}return r[f]}u.keys=function(){return Object.keys(r)},u.resolve=p,v.exports=u,u.id=46700},24654:()=>{},30071:(v,S,i)=>{v.exports=i(75242)},58711:(v,S,i)=>{v.exports=i(10323)},14226:(v,S,i)=>{v.exports=i(38762)},15886:(v,S,i)=>{v.exports=i(71873)},34377:(v,S,i)=>{v.exports=i(61599)},28086:(v,S,i)=>{v.exports=i(34097)},56166:(v,S,i)=>{v.exports=i(15149)},48129:(v,S,i)=>{v.exports=i(83361)},10068:(v,S,i)=>{v.exports=i(19095)},45163:(v,S,i)=>{v.exports=i(71420)},45819:(v,S,i)=>{v.exports=i(13178)},84901:(v,S,i)=>{v.exports=i(52049)},35524:(v,S,i)=>{v.exports=i(83655)},71851:(v,S,i)=>{v.exports=i(87054)},91465:(v,S,i)=>{v.exports=i(51946)},95327:(v,S,i)=>{v.exports=i(40764)},37940:(v,S,i)=>{v.exports=i(81214)},35431:(v,S,i)=>{v.exports=i(50881)},53757:(v,S,i)=>{v.exports=i(38813)},46558:(v,S,i)=>{v.exports=i(70157)},53625:(v,S,i)=>{v.exports=i(3502)},31978:(v,S,i)=>{v.exports=i(81610)},33814:(v,S,i)=>{v.exports=i(19543)},84220:(v,S,i)=>{v.exports=i(74046)},40984:(v,S,i)=>{v.exports=i(13731)},32322:(v,S,i)=>{v.exports=i(80129)},44859:(v,S,i)=>{v.exports=i(43720)},54082:(v,S,i)=>{v.exports=i(640)},30508:(v,S,i)=>{v.exports=i(50320)},15865:(v,S,i)=>{v.exports=i(15554)},46245:(v,S,i)=>{v.exports=i(1162)},69605:(v,S,i)=>{v.exports=i(70809)},86413:(v,S,i)=>{v.exports=i(26498)},87513:(v,S,i)=>{v.exports=i(12118)},71455:(v,S,i)=>{v.exports=i(44675)},69253:(v,S,i)=>{v.exports=i(70906)},17015:(v,S,i)=>{v.exports=i(95050)},8225:(v,S,i)=>{v.exports=i(56286)},64975:(v,S,i)=>{v.exports=i(54153)},66627:(v,S,i)=>{v.exports=i(90755)},24677:(v,S,i)=>{v.exports=i(60833)},68645:(v,S,i)=>{v.exports=i(98235)},14306:(v,S,i)=>{v.exports=i(78096)},6379:(v,S,i)=>{v.exports=i(31236)},72632:(v,S,i)=>{v.exports=i(15819)},28033:(v,S,i)=>{v.exports=i(44948)},19621:(v,S,i)=>{v.exports=i(96471)},54839:(v,S,i)=>{v.exports=i(5228)},95343:(v,S,i)=>{v.exports=i(50182)},73921:(v,S,i)=>{v.exports=i(41171)},70891:(v,S,i)=>{v.exports=i(54585)},77576:(v,S,i)=>{v.exports=i(62005)},45862:(v,S,i)=>{v.exports=i(39964)},51134:(v,S,i)=>{v.exports=i(70326)},23591:(v,S,i)=>{v.exports=i(98162)},76593:(v,S,i)=>{v.exports=i(42346)},22714:(v,S,i)=>{v.exports=i(4204)},62734:(v,S,i)=>{v.exports=i(24329)},69138:(v,S,i)=>{v.exports=i(2793)},69244:(v,S,i)=>{v.exports=i(42700)},15805:(v,S,i)=>{v.exports=i(70269)},63380:(v,S,i)=>{v.exports=i(88819)},66342:(v,S,i)=>{v.exports=i(55912)},12885:(v,S,i)=>{var r=i(79599).default,u=i(63380),p=i(77576),f=i(73921),e=i(76593),_=i(6379),y=i(62734),T=i(69138),M=i(28033),R=i(19621);function F(){"use strict";v.exports=F=function(){return Z},v.exports.__esModule=!0,v.exports.default=v.exports;var Z={},J=Object.prototype,Q=J.hasOwnProperty,ee="function"==typeof u?u:{},ue=ee.iterator||"@@iterator",ae=ee.asyncIterator||"@@asyncIterator",$=ee.toStringTag||"@@toStringTag";function se(Ut,Bt,mt){return p(Ut,Bt,{value:mt,enumerable:!0,configurable:!0,writable:!0}),Ut[Bt]}try{se({},"")}catch(Ut){se=function(mt,Yt,Dt){return mt[Yt]=Dt}}function ve(Ut,Bt,mt,Yt){var Hr,ci,Ir,wr,zt=f((Bt&&Bt.prototype instanceof me?Bt:me).prototype),Yn=new en(Yt||[]);return zt._invoke=(Hr=Ut,ci=mt,Ir=Yn,wr="suspendedStart",function(Qr,Kr){if("executing"===wr)throw new Error("Generator is already running");if("completed"===wr){if("throw"===Qr)throw Kr;return{value:void 0,done:!0}}for(Ir.method=Qr,Ir.arg=Kr;;){var In=Ir.delegate;if(In){var Hn=He(In,Ir);if(Hn){if(Hn===he)continue;return Hn}}if("next"===Ir.method)Ir.sent=Ir._sent=Ir.arg;else if("throw"===Ir.method){if("suspendedStart"===wr)throw wr="completed",Ir.arg;Ir.dispatchException(Ir.arg)}else"return"===Ir.method&&Ir.abrupt("return",Ir.arg);wr="executing";var Zr=oe(Hr,ci,Ir);if("normal"===Zr.type){if(wr=Ir.done?"completed":"suspendedYield",Zr.arg===he)continue;return{value:Zr.arg,done:Ir.done}}"throw"===Zr.type&&(wr="completed",Ir.method="throw",Ir.arg=Zr.arg)}}),zt}function oe(Ut,Bt,mt){try{return{type:"normal",arg:Ut.call(Bt,mt)}}catch(Yt){return{type:"throw",arg:Yt}}}Z.wrap=ve;var he={};function me(){}function Oe(){}function ce(){}var dt={};se(dt,ue,function(){return this});var Ye=e&&e(e($t([])));Ye&&Ye!==J&&Q.call(Ye,ue)&&(dt=Ye);var je=ce.prototype=me.prototype=f(dt);function Ie(Ut){var Bt;_(Bt=["next","throw","return"]).call(Bt,function(mt){se(Ut,mt,function(Yt){return this._invoke(mt,Yt)})})}function Ve(Ut,Bt){function mt(Dt,zt,Yn,Hr){var ci=oe(Ut[Dt],Ut,zt);if("throw"!==ci.type){var Ir=ci.arg,wr=Ir.value;return wr&&"object"==r(wr)&&Q.call(wr,"__await")?Bt.resolve(wr.__await).then(function(Qr){mt("next",Qr,Yn,Hr)},function(Qr){mt("throw",Qr,Yn,Hr)}):Bt.resolve(wr).then(function(Qr){Ir.value=Qr,Yn(Ir)},function(Qr){return mt("throw",Qr,Yn,Hr)})}Hr(ci.arg)}var Yt;this._invoke=function(Dt,zt){function Yn(){return new Bt(function(Hr,ci){mt(Dt,zt,Hr,ci)})}return Yt=Yt?Yt.then(Yn,Yn):Yn()}}function He(Ut,Bt){var mt=Ut.iterator[Bt.method];if(void 0===mt){if(Bt.delegate=null,"throw"===Bt.method){if(Ut.iterator.return&&(Bt.method="return",Bt.arg=void 0,He(Ut,Bt),"throw"===Bt.method))return he;Bt.method="throw",Bt.arg=new TypeError("The iterator does not provide a 'throw' method")}return he}var Yt=oe(mt,Ut.iterator,Bt.arg);if("throw"===Yt.type)return Bt.method="throw",Bt.arg=Yt.arg,Bt.delegate=null,he;var Dt=Yt.arg;return Dt?Dt.done?(Bt[Ut.resultName]=Dt.value,Bt.next=Ut.nextLoc,"return"!==Bt.method&&(Bt.method="next",Bt.arg=void 0),Bt.delegate=null,he):Dt:(Bt.method="throw",Bt.arg=new TypeError("iterator result is not an object"),Bt.delegate=null,he)}function Zt(Ut){var Bt={tryLoc:Ut[0]};1 in Ut&&(Bt.catchLoc=Ut[1]),2 in Ut&&(Bt.finallyLoc=Ut[2],Bt.afterLoc=Ut[3]),this.tryEntries.push(Bt)}function st(Ut){var Bt=Ut.completion||{};Bt.type="normal",delete Bt.arg,Ut.completion=Bt}function en(Ut){this.tryEntries=[{tryLoc:"root"}],_(Ut).call(Ut,Zt,this),this.reset(!0)}function $t(Ut){if(Ut){var Bt=Ut[ue];if(Bt)return Bt.call(Ut);if("function"==typeof Ut.next)return Ut;if(!isNaN(Ut.length)){var mt=-1,Yt=function Dt(){for(;++mt<Ut.length;)if(Q.call(Ut,mt))return Dt.value=Ut[mt],Dt.done=!1,Dt;return Dt.value=void 0,Dt.done=!0,Dt};return Yt.next=Yt}}return{next:Gt}}function Gt(){return{value:void 0,done:!0}}return Oe.prototype=ce,se(je,"constructor",ce),se(ce,"constructor",Oe),Oe.displayName=se(ce,$,"GeneratorFunction"),Z.isGeneratorFunction=function(Ut){var Bt="function"==typeof Ut&&Ut.constructor;return!!Bt&&(Bt===Oe||"GeneratorFunction"===(Bt.displayName||Bt.name))},Z.mark=function(Ut){return y?y(Ut,ce):(Ut.__proto__=ce,se(Ut,$,"GeneratorFunction")),Ut.prototype=f(je),Ut},Z.awrap=function(Ut){return{__await:Ut}},Ie(Ve.prototype),se(Ve.prototype,ae,function(){return this}),Z.AsyncIterator=Ve,Z.async=function(Ut,Bt,mt,Yt,Dt){void 0===Dt&&(Dt=T);var zt=new Ve(ve(Ut,Bt,mt,Yt),Dt);return Z.isGeneratorFunction(Bt)?zt:zt.next().then(function(Yn){return Yn.done?Yn.value:zt.next()})},Ie(je),se(je,$,"Generator"),se(je,ue,function(){return this}),se(je,"toString",function(){return"[object Generator]"}),Z.keys=function(Ut){var Bt=[];for(var mt in Ut)Bt.push(mt);return M(Bt).call(Bt),function Yt(){for(;Bt.length;){var Dt=Bt.pop();if(Dt in Ut)return Yt.value=Dt,Yt.done=!1,Yt}return Yt.done=!0,Yt}},Z.values=$t,en.prototype={constructor:en,reset:function(Bt){var mt;if(this.prev=0,this.next=0,this.sent=this._sent=void 0,this.done=!1,this.delegate=null,this.method="next",this.arg=void 0,_(mt=this.tryEntries).call(mt,st),!Bt)for(var Yt in this)"t"===Yt.charAt(0)&&Q.call(this,Yt)&&!isNaN(+R(Yt).call(Yt,1))&&(this[Yt]=void 0)},stop:function(){this.done=!0;var Bt=this.tryEntries[0].completion;if("throw"===Bt.type)throw Bt.arg;return this.rval},dispatchException:function(Bt){if(this.done)throw Bt;var mt=this;function Yt(Ir,wr){return Yn.type="throw",Yn.arg=Bt,mt.next=Ir,wr&&(mt.method="next",mt.arg=void 0),!!wr}for(var Dt=this.tryEntries.length-1;Dt>=0;--Dt){var zt=this.tryEntries[Dt],Yn=zt.completion;if("root"===zt.tryLoc)return Yt("end");if(zt.tryLoc<=this.prev){var Hr=Q.call(zt,"catchLoc"),ci=Q.call(zt,"finallyLoc");if(Hr&&ci){if(this.prev<zt.catchLoc)return Yt(zt.catchLoc,!0);if(this.prev<zt.finallyLoc)return Yt(zt.finallyLoc)}else if(Hr){if(this.prev<zt.catchLoc)return Yt(zt.catchLoc,!0)}else{if(!ci)throw new Error("try statement without catch or finally");if(this.prev<zt.finallyLoc)return Yt(zt.finallyLoc)}}}},abrupt:function(Bt,mt){for(var Yt=this.tryEntries.length-1;Yt>=0;--Yt){var Dt=this.tryEntries[Yt];if(Dt.tryLoc<=this.prev&&Q.call(Dt,"finallyLoc")&&this.prev<Dt.finallyLoc){var zt=Dt;break}}zt&&("break"===Bt||"continue"===Bt)&&zt.tryLoc<=mt&&mt<=zt.finallyLoc&&(zt=null);var Yn=zt?zt.completion:{};return Yn.type=Bt,Yn.arg=mt,zt?(this.method="next",this.next=zt.finallyLoc,he):this.complete(Yn)},complete:function(Bt,mt){if("throw"===Bt.type)throw Bt.arg;return"break"===Bt.type||"continue"===Bt.type?this.next=Bt.arg:"return"===Bt.type?(this.rval=this.arg=Bt.arg,this.method="return",this.next="end"):"normal"===Bt.type&&mt&&(this.next=mt),he},finish:function(Bt){for(var mt=this.tryEntries.length-1;mt>=0;--mt){var Yt=this.tryEntries[mt];if(Yt.finallyLoc===Bt)return this.complete(Yt.completion,Yt.afterLoc),st(Yt),he}},catch:function(Bt){for(var mt=this.tryEntries.length-1;mt>=0;--mt){var Yt=this.tryEntries[mt];if(Yt.tryLoc===Bt){var Dt=Yt.completion;if("throw"===Dt.type){var zt=Dt.arg;st(Yt)}return zt}}throw new Error("illegal catch attempt")},delegateYield:function(Bt,mt,Yt){return this.delegate={iterator:$t(Bt),resultName:mt,nextLoc:Yt},"next"===this.method&&(this.arg=void 0),he}},Z}v.exports=F,v.exports.__esModule=!0,v.exports.default=v.exports},79599:(v,S,i)=>{var r=i(63380),u=i(66342);function p(f){return v.exports=p="function"==typeof r&&"symbol"==typeof u?function(e){return typeof e}:function(e){return e&&"function"==typeof r&&e.constructor===r&&e!==r.prototype?"symbol":typeof e},v.exports.__esModule=!0,v.exports.default=v.exports,p(f)}v.exports=p,v.exports.__esModule=!0,v.exports.default=v.exports},33950:(v,S,i)=>{var r=i(12885)();v.exports=r;try{regeneratorRuntime=r}catch(u){"object"==typeof globalThis?globalThis.regeneratorRuntime=r:Function("r","regeneratorRuntime = r")(r)}},64291:(v,S,i)=>{"use strict";i.d(S,{Z:()=>ae});var p=i(66224);const e=function($,se){for(var ve=$.length;ve--;)if((0,p.Z)($[ve][0],se))return ve;return-1};var y=Array.prototype.splice;function ue($){var se=-1,ve=null==$?0:$.length;for(this.clear();++se<ve;){var oe=$[se];this.set(oe[0],oe[1])}}ue.prototype.clear=function(){this.__data__=[],this.size=0},ue.prototype.delete=function($){var se=this.__data__,ve=e(se,$);return!(ve<0||(ve==se.length-1?se.pop():y.call(se,ve,1),--this.size,0))},ue.prototype.get=function($){var se=this.__data__,ve=e(se,$);return ve<0?void 0:se[ve][1]},ue.prototype.has=function($){return e(this.__data__,$)>-1},ue.prototype.set=function($,se){var ve=this.__data__,oe=e(ve,$);return oe<0?(++this.size,ve.push([$,se])):ve[oe][1]=se,this};const ae=ue},54673:(v,S,i)=>{"use strict";i.d(S,{Z:()=>f});var r=i(30214),u=i(40309);const f=(0,r.Z)(u.Z,"Map")},79489:(v,S,i)=>{"use strict";i.d(S,{Z:()=>Bt});const p=(0,i(30214).Z)(Object,"create");var R=Object.prototype.hasOwnProperty;var Q=Object.prototype.hasOwnProperty;function ve(mt){var Yt=-1,Dt=null==mt?0:mt.length;for(this.clear();++Yt<Dt;){var zt=mt[Yt];this.set(zt[0],zt[1])}}ve.prototype.clear=function(){this.__data__=p?p(null):{},this.size=0},ve.prototype.delete=function(mt){var Yt=this.has(mt)&&delete this.__data__[mt];return this.size-=Yt?1:0,Yt},ve.prototype.get=function(mt){var Yt=this.__data__;if(p){var Dt=Yt[mt];return"__lodash_hash_undefined__"===Dt?void 0:Dt}return R.call(Yt,mt)?Yt[mt]:void 0},ve.prototype.has=function(mt){var Yt=this.__data__;return p?void 0!==Yt[mt]:Q.call(Yt,mt)},ve.prototype.set=function(mt,Yt){var Dt=this.__data__;return this.size+=this.has(mt)?0:1,Dt[mt]=p&&void 0===Yt?"__lodash_hash_undefined__":Yt,this};const oe=ve;var he=i(64291),me=i(54673);const je=function(mt,Yt){var Dt=mt.__data__;return function(mt){var Yt=typeof mt;return"string"==Yt||"number"==Yt||"symbol"==Yt||"boolean"==Yt?"__proto__"!==mt:null===mt}(Yt)?Dt["string"==typeof Yt?"string":"hash"]:Dt.map};function Ut(mt){var Yt=-1,Dt=null==mt?0:mt.length;for(this.clear();++Yt<Dt;){var zt=mt[Yt];this.set(zt[0],zt[1])}}Ut.prototype.clear=function(){this.size=0,this.__data__={hash:new oe,map:new(me.Z||he.Z),string:new oe}},Ut.prototype.delete=function(mt){var Yt=je(this,mt).delete(mt);return this.size-=Yt?1:0,Yt},Ut.prototype.get=function(mt){return je(this,mt).get(mt)},Ut.prototype.has=function(mt){return je(this,mt).has(mt)},Ut.prototype.set=function(mt,Yt){var Dt=je(this,mt),zt=Dt.size;return Dt.set(mt,Yt),this.size+=Dt.size==zt?0:1,this};const Bt=Ut},7475:(v,S,i)=>{"use strict";i.d(S,{Z:()=>ue});var r=i(64291);var R=i(54673),F=i(79489);function ee(ae){var $=this.__data__=new r.Z(ae);this.size=$.size}ee.prototype.clear=function(){this.__data__=new r.Z,this.size=0},ee.prototype.delete=function(ae){var $=this.__data__,se=$.delete(ae);return this.size=$.size,se},ee.prototype.get=function(ae){return this.__data__.get(ae)},ee.prototype.has=function(ae){return this.__data__.has(ae)},ee.prototype.set=function(ae,$){var se=this.__data__;if(se instanceof r.Z){var ve=se.__data__;if(!R.Z||ve.length<199)return ve.push([ae,$]),this.size=++se.size,this;se=this.__data__=new F.Z(ve)}return se.set(ae,$),this.size=se.size,this};const ue=ee},35770:(v,S,i)=>{"use strict";i.d(S,{Z:()=>p});const p=i(40309).Z.Symbol},83345:(v,S,i)=>{"use strict";i.d(S,{Z:()=>p});const p=i(40309).Z.Uint8Array},39434:(v,S,i)=>{"use strict";i.d(S,{Z:()=>F});var p=i(2172),f=i(34654),e=i(12434),_=i(28078),y=i(99436),M=Object.prototype.hasOwnProperty;const F=function(Z,J){var Q=(0,f.Z)(Z),ee=!Q&&(0,p.Z)(Z),ue=!Q&&!ee&&(0,e.Z)(Z),ae=!Q&&!ee&&!ue&&(0,y.Z)(Z),$=Q||ee||ue||ae,se=$?function(Z,J){for(var Q=-1,ee=Array(Z);++Q<Z;)ee[Q]=J(Q);return ee}(Z.length,String):[],ve=se.length;for(var oe in Z)(J||M.call(Z,oe))&&(!$||!("length"==oe||ue&&("offset"==oe||"parent"==oe)||ae&&("buffer"==oe||"byteLength"==oe||"byteOffset"==oe)||(0,_.Z)(oe,ve)))&&se.push(oe);return se}},57052:(v,S,i)=>{"use strict";i.d(S,{Z:()=>u});const u=function(p,f){for(var e=-1,_=f.length,y=p.length;++e<_;)p[y+e]=f[e];return p}},15427:(v,S,i)=>{"use strict";i.d(S,{Z:()=>_});var r=i(2951),u=i(66224),f=Object.prototype.hasOwnProperty;const _=function(y,T,M){var R=y[T];(!f.call(y,T)||!(0,u.Z)(R,M)||void 0===M&&!(T in y))&&(0,r.Z)(y,T,M)}},2951:(v,S,i)=>{"use strict";i.d(S,{Z:()=>p});var r=i(99567);const p=function(f,e,_){"__proto__"==e&&r.Z?(0,r.Z)(f,e,{configurable:!0,enumerable:!0,value:_,writable:!0}):f[e]=_}},57765:(v,S,i)=>{"use strict";i.d(S,{Z:()=>ln});var r=i(7475);var f=i(15427),e=i(57640),_=i(6251);var M=i(76212);var Z=i(27672),J=i(36889),Q=i(99913);var ae=i(74202);var ve=i(22018),oe=i(23359),he=i(81901),Oe=Object.prototype.hasOwnProperty;var ze=i(80609);var Ie=/\w*$/;var Zt=i(35770),st=Zt.Z?Zt.Z.prototype:void 0,en=st?st.valueOf:void 0;var Ut=i(1044);const On=function(Ht,cn,Ct){var pr=Ht.constructor;switch(cn){case"[object ArrayBuffer]":return(0,ze.Z)(Ht);case"[object Boolean]":case"[object Date]":return new pr(+Ht);case"[object DataView]":return function(Ht,cn){var Ct=cn?(0,ze.Z)(Ht.buffer):Ht.buffer;return new Ht.constructor(Ct,Ht.byteOffset,Ht.byteLength)}(Ht,Ct);case"[object Float32Array]":case"[object Float64Array]":case"[object Int8Array]":case"[object Int16Array]":case"[object Int32Array]":case"[object Uint8Array]":case"[object Uint8ClampedArray]":case"[object Uint16Array]":case"[object Uint32Array]":return(0,Ut.Z)(Ht,Ct);case"[object Map]":return new pr;case"[object Number]":case"[object String]":return new pr(Ht);case"[object RegExp]":return function(Ht){var cn=new Ht.constructor(Ht.source,Ie.exec(Ht));return cn.lastIndex=Ht.lastIndex,cn}(Ht);case"[object Set]":return new pr;case"[object Symbol]":return function(Ht){return en?Object(en.call(Ht)):{}}(Ht)}};var Wt=i(22595),Jn=i(34654),ir=i(12434),Lr=i(6539);var Ai=i(21162),Tr=i(48514),Nr=Tr.Z&&Tr.Z.isMap;const En=Nr?(0,Ai.Z)(Nr):function(Ht){return(0,Lr.Z)(Ht)&&"[object Map]"==(0,he.Z)(Ht)};var mr=i(4214);var si=Tr.Z&&Tr.Z.isSet;const no=si?(0,Ai.Z)(si):function(Ht){return(0,Lr.Z)(Ht)&&"[object Set]"==(0,he.Z)(Ht)};var jt="[object Arguments]",wn="[object Function]",yo="[object Object]",Li={};Li[jt]=Li["[object Array]"]=Li["[object ArrayBuffer]"]=Li["[object DataView]"]=Li["[object Boolean]"]=Li["[object Date]"]=Li["[object Float32Array]"]=Li["[object Float64Array]"]=Li["[object Int8Array]"]=Li["[object Int16Array]"]=Li["[object Int32Array]"]=Li["[object Map]"]=Li["[object Number]"]=Li[yo]=Li["[object RegExp]"]=Li["[object Set]"]=Li["[object String]"]=Li["[object Symbol]"]=Li["[object Uint8Array]"]=Li["[object Uint8ClampedArray]"]=Li["[object Uint16Array]"]=Li["[object Uint32Array]"]=!0,Li["[object Error]"]=Li[wn]=Li["[object WeakMap]"]=!1;const ln=function ar(Ht,cn,Ct,pr,nn,Cn){var br,zi=1&cn,Wo=2&cn,Do=4&cn;if(Ct&&(br=nn?Ct(Ht,pr,nn,Cn):Ct(Ht)),void 0!==br)return br;if(!(0,mr.Z)(Ht))return Ht;var Js=(0,Jn.Z)(Ht);if(Js){if(br=function(Ht){var cn=Ht.length,Ct=new Ht.constructor(cn);return cn&&"string"==typeof Ht[0]&&Oe.call(Ht,"index")&&(Ct.index=Ht.index,Ct.input=Ht.input),Ct}(Ht),!zi)return(0,J.Z)(Ht,br)}else{var _s=(0,he.Z)(Ht),bs=_s==wn||"[object GeneratorFunction]"==_s;if((0,ir.Z)(Ht))return(0,Z.Z)(Ht,zi);if(_s==yo||_s==jt||bs&&!nn){if(br=Wo||bs?{}:(0,Wt.Z)(Ht),!zi)return Wo?function(Ht,cn){return(0,e.Z)(Ht,(0,ae.Z)(Ht),cn)}(Ht,function(Ht,cn){return Ht&&(0,e.Z)(cn,(0,M.Z)(cn),Ht)}(br,Ht)):function(Ht,cn){return(0,e.Z)(Ht,(0,Q.Z)(Ht),cn)}(Ht,function(Ht,cn){return Ht&&(0,e.Z)(cn,(0,_.Z)(cn),Ht)}(br,Ht))}else{if(!Li[_s])return nn?Ht:{};br=On(Ht,_s,zi)}}Cn||(Cn=new r.Z);var qo=Cn.get(Ht);if(qo)return qo;Cn.set(Ht,br),no(Ht)?Ht.forEach(function(pa){br.add(ar(pa,cn,Ct,pa,Ht,Cn))}):En(Ht)&&Ht.forEach(function(pa,Bs){br.set(Bs,ar(pa,cn,Ct,Bs,Ht,Cn))});var Ia=Js?void 0:(Do?Wo?oe.Z:ve.Z:Wo?M.Z:_.Z)(Ht);return function(Ht,cn){for(var Ct=-1,pr=null==Ht?0:Ht.length;++Ct<pr&&!1!==cn(Ht[Ct],Ct,Ht););}(Ia||Ht,function(pa,Bs){Ia&&(pa=Ht[Bs=pa]),(0,f.Z)(br,Bs,ar(pa,cn,Ct,Bs,Ht,Cn))}),br}},49137:(v,S,i)=>{"use strict";i.d(S,{Z:()=>f});var r=i(57052),u=i(34654);const f=function(e,_,y){var T=_(e);return(0,u.Z)(e)?T:(0,r.Z)(T,y(e))}},46382:(v,S,i)=>{"use strict";i.d(S,{Z:()=>ue});var r=i(35770),u=Object.prototype,p=u.hasOwnProperty,f=u.toString,e=r.Z?r.Z.toStringTag:void 0;var M=Object.prototype.toString;var Q=r.Z?r.Z.toStringTag:void 0;const ue=function(ae){return null==ae?void 0===ae?"[object Undefined]":"[object Null]":Q&&Q in Object(ae)?function(ae){var $=p.call(ae,e),se=ae[e];try{ae[e]=void 0;var ve=!0}catch(he){}var oe=f.call(ae);return ve&&($?ae[e]=se:delete ae[e]),oe}(ae):function(ae){return M.call(ae)}(ae)}},21162:(v,S,i)=>{"use strict";i.d(S,{Z:()=>u});const u=function(p){return function(f){return p(f)}}},80609:(v,S,i)=>{"use strict";i.d(S,{Z:()=>p});var r=i(83345);const p=function(f){var e=new f.constructor(f.byteLength);return new r.Z(e).set(new r.Z(f)),e}},27672:(v,S,i)=>{"use strict";i.d(S,{Z:()=>T});var r=i(40309),u="object"==typeof exports&&exports&&!exports.nodeType&&exports,p=u&&"object"==typeof module&&module&&!module.nodeType&&module,e=p&&p.exports===u?r.Z.Buffer:void 0,_=e?e.allocUnsafe:void 0;const T=function(M,R){if(R)return M.slice();var F=M.length,Z=_?_(F):new M.constructor(F);return M.copy(Z),Z}},1044:(v,S,i)=>{"use strict";i.d(S,{Z:()=>p});var r=i(80609);const p=function(f,e){var _=e?(0,r.Z)(f.buffer):f.buffer;return new f.constructor(_,f.byteOffset,f.length)}},36889:(v,S,i)=>{"use strict";i.d(S,{Z:()=>u});const u=function(p,f){var e=-1,_=p.length;for(f||(f=Array(_));++e<_;)f[e]=p[e];return f}},57640:(v,S,i)=>{"use strict";i.d(S,{Z:()=>f});var r=i(15427),u=i(2951);const f=function(e,_,y,T){var M=!y;y||(y={});for(var R=-1,F=_.length;++R<F;){var Z=_[R],J=T?T(y[Z],e[Z],Z,y,e):void 0;void 0===J&&(J=e[Z]),M?(0,u.Z)(y,Z,J):(0,r.Z)(y,Z,J)}return y}},99567:(v,S,i)=>{"use strict";i.d(S,{Z:()=>p});var r=i(30214);const p=function(){try{var f=(0,r.Z)(Object,"defineProperty");return f({},"",{}),f}catch(e){}}()},7746:(v,S,i)=>{"use strict";i.d(S,{Z:()=>u});const u="object"==typeof global&&global&&global.Object===Object&&global},22018:(v,S,i)=>{"use strict";i.d(S,{Z:()=>e});var r=i(49137),u=i(99913),p=i(6251);const e=function(_){return(0,r.Z)(_,p.Z,u.Z)}},23359:(v,S,i)=>{"use strict";i.d(S,{Z:()=>e});var r=i(49137),u=i(74202),p=i(76212);const e=function(_){return(0,r.Z)(_,p.Z,u.Z)}},30214:(v,S,i)=>{"use strict";i.d(S,{Z:()=>he});var me,r=i(58209),p=i(40309).Z["__core-js_shared__"],e=(me=/[^.]+$/.exec(p&&p.keys&&p.keys.IE_PROTO||""))?"Symbol(src)_1."+me:"";var T=i(4214),M=i(22035),F=/^\[object .+?Constructor\]$/,ue=RegExp("^"+Function.prototype.toString.call(Object.prototype.hasOwnProperty).replace(/[\\^$.*+?()[\]{}|]/g,"\\$&").replace(/hasOwnProperty|(function).*?(?=\\\()| for .+?(?=\\\])/g,"$1.*?")+"$");const $=function(me){return!(!(0,T.Z)(me)||function(me){return!!e&&e in me}(me))&&((0,r.Z)(me)?ue:F).test((0,M.Z)(me))},he=function(me,Oe){var ce=function(me,Oe){return null==me?void 0:me[Oe]}(me,Oe);return $(ce)?ce:void 0}},11595:(v,S,i)=>{"use strict";i.d(S,{Z:()=>p});const p=(0,i(24184).Z)(Object.getPrototypeOf,Object)},99913:(v,S,i)=>{"use strict";i.d(S,{Z:()=>T});var p=i(38387),e=Object.prototype.propertyIsEnumerable,_=Object.getOwnPropertySymbols;const T=_?function(M){return null==M?[]:(M=Object(M),function(M,R){for(var F=-1,Z=null==M?0:M.length,J=0,Q=[];++F<Z;){var ee=M[F];R(ee,F,M)&&(Q[J++]=ee)}return Q}(_(M),function(R){return e.call(M,R)}))}:p.Z},74202:(v,S,i)=>{"use strict";i.d(S,{Z:()=>y});var r=i(57052),u=i(11595),p=i(99913),f=i(38387);const y=Object.getOwnPropertySymbols?function(T){for(var M=[];T;)(0,r.Z)(M,(0,p.Z)(T)),T=(0,u.Z)(T);return M}:f.Z},81901:(v,S,i)=>{"use strict";i.d(S,{Z:()=>dt});var r=i(30214),u=i(40309);const f=(0,r.Z)(u.Z,"DataView");var e=i(54673);const y=(0,r.Z)(u.Z,"Promise"),M=(0,r.Z)(u.Z,"Set"),F=(0,r.Z)(u.Z,"WeakMap");var Z=i(46382),J=i(22035),Q="[object Map]",ue="[object Promise]",ae="[object Set]",$="[object WeakMap]",se="[object DataView]",ve=(0,J.Z)(f),oe=(0,J.Z)(e.Z),he=(0,J.Z)(y),me=(0,J.Z)(M),Oe=(0,J.Z)(F),ce=Z.Z;(f&&ce(new f(new ArrayBuffer(1)))!=se||e.Z&&ce(new e.Z)!=Q||y&&ce(y.resolve())!=ue||M&&ce(new M)!=ae||F&&ce(new F)!=$)&&(ce=function(ze){var Ye=(0,Z.Z)(ze),je="[object Object]"==Ye?ze.constructor:void 0,Ie=je?(0,J.Z)(je):"";if(Ie)switch(Ie){case ve:return se;case oe:return Q;case he:return ue;case me:return ae;case Oe:return $}return Ye});const dt=ce},22595:(v,S,i)=>{"use strict";i.d(S,{Z:()=>T});var r=i(4214),u=Object.create;const f=function(){function M(){}return function(R){if(!(0,r.Z)(R))return{};if(u)return u(R);M.prototype=R;var F=new M;return M.prototype=void 0,F}}();var e=i(11595),_=i(31550);const T=function(M){return"function"!=typeof M.constructor||(0,_.Z)(M)?{}:f((0,e.Z)(M))}},28078:(v,S,i)=>{"use strict";i.d(S,{Z:()=>f});var u=/^(?:0|[1-9]\d*)$/;const f=function(e,_){var y=typeof e;return!!(_=null==_?9007199254740991:_)&&("number"==y||"symbol"!=y&&u.test(e))&&e>-1&&e%1==0&&e<_}},31550:(v,S,i)=>{"use strict";i.d(S,{Z:()=>p});var r=Object.prototype;const p=function(f){var e=f&&f.constructor;return f===("function"==typeof e&&e.prototype||r)}},48514:(v,S,i)=>{"use strict";i.d(S,{Z:()=>y});var r=i(7746),u="object"==typeof exports&&exports&&!exports.nodeType&&exports,p=u&&"object"==typeof module&&module&&!module.nodeType&&module,e=p&&p.exports===u&&r.Z.process;const y=function(){try{return p&&p.require&&p.require("util").types||e&&e.binding&&e.binding("util")}catch(M){}}()},24184:(v,S,i)=>{"use strict";i.d(S,{Z:()=>u});const u=function(p,f){return function(e){return p(f(e))}}},40309:(v,S,i)=>{"use strict";i.d(S,{Z:()=>f});var r=i(7746),u="object"==typeof self&&self&&self.Object===Object&&self;const f=r.Z||u||Function("return this")()},22035:(v,S,i)=>{"use strict";i.d(S,{Z:()=>f});var u=Function.prototype.toString;const f=function(e){if(null!=e){try{return u.call(e)}catch(_){}try{return e+""}catch(_){}}return""}},66224:(v,S,i)=>{"use strict";i.d(S,{Z:()=>u});const u=function(p,f){return p===f||p!=p&&f!=f}},2172:(v,S,i)=>{"use strict";i.d(S,{Z:()=>R});var r=i(46382),u=i(6539);const e=function(F){return(0,u.Z)(F)&&"[object Arguments]"==(0,r.Z)(F)};var _=Object.prototype,y=_.hasOwnProperty,T=_.propertyIsEnumerable;const R=e(function(){return arguments}())?e:function(F){return(0,u.Z)(F)&&y.call(F,"callee")&&!T.call(F,"callee")}},34654:(v,S,i)=>{"use strict";i.d(S,{Z:()=>u});const u=Array.isArray},18402:(v,S,i)=>{"use strict";i.d(S,{Z:()=>f});var r=i(58209),u=i(19238);const f=function(e){return null!=e&&(0,u.Z)(e.length)&&!(0,r.Z)(e)}},12434:(v,S,i)=>{"use strict";i.d(S,{Z:()=>R});var r=i(40309),f="object"==typeof exports&&exports&&!exports.nodeType&&exports,e=f&&"object"==typeof module&&module&&!module.nodeType&&module,y=e&&e.exports===f?r.Z.Buffer:void 0;const R=(y?y.isBuffer:void 0)||function(){return!1}},58209:(v,S,i)=>{"use strict";i.d(S,{Z:()=>T});var r=i(46382),u=i(4214);const T=function(M){if(!(0,u.Z)(M))return!1;var R=(0,r.Z)(M);return"[object Function]"==R||"[object GeneratorFunction]"==R||"[object AsyncFunction]"==R||"[object Proxy]"==R}},19238:(v,S,i)=>{"use strict";i.d(S,{Z:()=>p});const p=function(f){return"number"==typeof f&&f>-1&&f%1==0&&f<=9007199254740991}},4214:(v,S,i)=>{"use strict";i.d(S,{Z:()=>u});const u=function(p){var f=typeof p;return null!=p&&("object"==f||"function"==f)}},6539:(v,S,i)=>{"use strict";i.d(S,{Z:()=>u});const u=function(p){return null!=p&&"object"==typeof p}},99436:(v,S,i)=>{"use strict";i.d(S,{Z:()=>en});var r=i(46382),u=i(19238),p=i(6539),Ye={};Ye["[object Float32Array]"]=Ye["[object Float64Array]"]=Ye["[object Int8Array]"]=Ye["[object Int16Array]"]=Ye["[object Int32Array]"]=Ye["[object Uint8Array]"]=Ye["[object Uint8ClampedArray]"]=Ye["[object Uint16Array]"]=Ye["[object Uint32Array]"]=!0,Ye["[object Arguments]"]=Ye["[object Array]"]=Ye["[object ArrayBuffer]"]=Ye["[object Boolean]"]=Ye["[object DataView]"]=Ye["[object Date]"]=Ye["[object Error]"]=Ye["[object Function]"]=Ye["[object Map]"]=Ye["[object Number]"]=Ye["[object Object]"]=Ye["[object RegExp]"]=Ye["[object Set]"]=Ye["[object String]"]=Ye["[object WeakMap]"]=!1;var Ve=i(21162),He=i(48514),Zt=He.Z&&He.Z.isTypedArray;const en=Zt?(0,Ve.Z)(Zt):function($t){return(0,p.Z)($t)&&(0,u.Z)($t.length)&&!!Ye[(0,r.Z)($t)]}},6251:(v,S,i)=>{"use strict";i.d(S,{Z:()=>Z});var r=i(39434),u=i(31550);const e=(0,i(24184).Z)(Object.keys,Object);var y=Object.prototype.hasOwnProperty;var R=i(18402);const Z=function(J){return(0,R.Z)(J)?(0,r.Z)(J):function(J){if(!(0,u.Z)(J))return e(J);var Q=[];for(var ee in Object(J))y.call(J,ee)&&"constructor"!=ee&&Q.push(ee);return Q}(J)}},76212:(v,S,i)=>{"use strict";i.d(S,{Z:()=>Z});var r=i(39434),u=i(4214),p=i(31550);var y=Object.prototype.hasOwnProperty;const M=function(J){if(!(0,u.Z)(J))return function(J){var Q=[];if(null!=J)for(var ee in Object(J))Q.push(ee);return Q}(J);var Q=(0,p.Z)(J),ee=[];for(var ue in J)"constructor"==ue&&(Q||!y.call(J,ue))||ee.push(ue);return ee};var R=i(18402);const Z=function(J){return(0,R.Z)(J)?(0,r.Z)(J,!0):M(J)}},38387:(v,S,i)=>{"use strict";i.d(S,{Z:()=>u});const u=function(){return[]}}},v=>{v(v.s=66492)}]);
\ No newline at end of file
diff --git a/ceph/src/pybind/mgr/dashboard/frontend/dist/en-US/main.ddd4de0999172734.js b/ceph/src/pybind/mgr/dashboard/frontend/dist/en-US/main.ddd4de0999172734.js
new file mode 100644 (file)
index 0000000..14cdbeb
--- /dev/null
@@ -0,0 +1,3 @@
+var $localize=Object.assign(void 0===$localize?{}:$localize,{locale:"en-US"});
+"use strict";(function(global){global.ng=global.ng||{};global.ng.common=global.ng.common||{};global.ng.common.locales=global.ng.common.locales||{};const u=undefined;function plural(val){const n=val,i=Math.floor(Math.abs(val)),v=val.toString().replace(/^[^.]*\.?/,"").length;if(i===1&&v===0)return 1;return 5}global.ng.common.locales["en-us-posix"]=["en-US-POSIX",[["a","p"],["AM","PM"],u],[["AM","PM"],u,u],[["S","M","T","W","T","F","S"],["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],["Su","Mo","Tu","We","Th","Fr","Sa"]],u,[["J","F","M","A","M","J","J","A","S","O","N","D"],["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"],["January","February","March","April","May","June","July","August","September","October","November","December"]],u,[["B","A"],["BC","AD"],["Before Christ","Anno Domini"]],0,[6,0],["M/d/yy","MMM d, y","MMMM d, y","EEEE, MMMM d, y"],["h:mm a","h:mm:ss a","h:mm:ss a z","h:mm:ss a zzzz"],["{1}, {0}",u,"{1} 'at' {0}",u],[".",",",";","%","+","-","E","\xD7","0/00","INF","NaN",":"],["0.######","0%","\xA4\xA00.00","0.000000E+000"],"USD","$","US Dollar",{},"ltr",plural,[[["mi","n","in the morning","in the afternoon","in the evening","at night"],["midnight","noon","in the morning","in the afternoon","in the evening","at night"],u],[["midnight","noon","morning","afternoon","evening","night"],u,u],["00:00","12:00",["06:00","12:00"],["12:00","18:00"],["18:00","21:00"],["21:00","06:00"]]]]})(typeof globalThis!=="undefined"&&globalThis||typeof global!=="undefined"&&global||typeof window!=="undefined"&&window);;
+var Gg=Math.pow;(self.webpackChunkceph_dashboard=self.webpackChunkceph_dashboard||[]).push([[179],{43155:(m,S)=>{"use strict";S.N=void 0;var r=/^([^\w]*)(javascript|data|vbscript)/im,a=/&#(\w+)(^\w|;)?/g,f=/[\u0000-\u001F\u007F-\u009F\u2000-\u200D\uFEFF]/gim,c=/^([^:]+):/gm,e=[".","/"];S.N=function T(C){var R=function y(C){return C.replace(a,function(R,L){return String.fromCharCode(L)})}(C||"").replace(f,"").trim();if(!R)return"about:blank";if(function p(C){return e.indexOf(C[0])>-1}(R))return R;var L=R.match(c);return L&&r.test(L[0])?"about:blank":R}},62946:(m,S,i)=>{"use strict";i.d(S,{iM:()=>Tf,qr:()=>ug,xc:()=>uv});var r=i(89724),a=i(11048),f=function(I,Z){return(f=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(H,Se){H.__proto__=Se}||function(H,Se){for(var it in Se)Se.hasOwnProperty(it)&&(H[it]=Se[it])})(I,Z)};function c(I,Z){function H(){this.constructor=I}f(I,Z),I.prototype=null===Z?Object.create(Z):(H.prototype=Z.prototype,new H)}var e=function(){return e=Object.assign||function(Z){for(var H,Se=1,it=arguments.length;Se<it;Se++)for(var Ft in H=arguments[Se])Object.prototype.hasOwnProperty.call(H,Ft)&&(Z[Ft]=H[Ft]);return Z},e.apply(this,arguments)};function p(I,Z){var H="function"==typeof Symbol&&I[Symbol.iterator];if(!H)return I;var it,Kn,Se=H.call(I),Ft=[];try{for(;(void 0===Z||Z-- >0)&&!(it=Se.next()).done;)Ft.push(it.value)}catch(Cr){Kn={error:Cr}}finally{try{it&&!it.done&&(H=Se.return)&&H.call(Se)}finally{if(Kn)throw Kn.error}}return Ft}function y(){for(var I=[],Z=0;Z<arguments.length;Z++)I=I.concat(p(arguments[Z]));return I}var C=[];Object.freeze(C);var R={};Object.freeze(R);var L={};function z(){return"undefined"!=typeof window?window:"undefined"!=typeof global?global:L}function W(){return++yr.mobxGuid}function J(I){throw ee(!1,I),"X"}function ee(I,Z){if(!I)throw new Error("[mobx] "+(Z||"An invariant failed, however the error is obfuscated because this is an production build."))}function U(I){var Z=!1;return function(){if(!Z)return Z=!0,I.apply(this,arguments)}}var se=function(){};function ae(I){return null!==I&&"object"==typeof I}function he(I){if(null===I||"object"!=typeof I)return!1;var Z=Object.getPrototypeOf(I);return Z===Object.prototype||null===Z}function ue(I,Z,H){Object.defineProperty(I,Z,{enumerable:!1,writable:!0,configurable:!0,value:H})}function st(I,Z,H){Object.defineProperty(I,Z,{enumerable:!1,writable:!1,configurable:!0,value:H})}function Be(I,Z){var H="isMobX"+I;return Z.prototype[H]=!0,function(Se){return ae(Se)&&!0===Se[H]}}function Ne(I){return void 0!==z().Map&&I instanceof z().Map}function Bt(I){return I instanceof Set}function rt(I){for(var Z=[];;){var H=I.next();if(H.done)break;Z.push(H.value)}return Z}function en(){return"function"==typeof Symbol&&Symbol.toPrimitive||"@@toPrimitive"}function Pt(I){return null===I?null:"object"==typeof I?""+I:I}function Vt(){return"function"==typeof Symbol&&Symbol.iterator||"@@iterator"}function hn(I,Z){st(I,Vt(),Z)}function vn(I){return I[Vt()]=Nt,I}function mt(){return"function"==typeof Symbol&&Symbol.toStringTag||"@@toStringTag"}function Nt(){return this}var St=function(){function I(Z){void 0===Z&&(Z="Atom@"+W()),this.name=Z,this.isPendingUnobservation=!1,this.isBeingObserved=!1,this.observers=[],this.observersIndexes={},this.diffValue=0,this.lastAccessedBy=0,this.lowestObserverState=vi.NOT_TRACKING}return I.prototype.onBecomeUnobserved=function(){},I.prototype.onBecomeObserved=function(){},I.prototype.reportObserved=function(){return es(this)},I.prototype.reportChanged=function(){Us(),function ga(I){if(I.lowestObserverState!==vi.STALE){I.lowestObserverState=vi.STALE;for(var Z=I.observers,H=Z.length;H--;){var Se=Z[H];Se.dependenciesState===vi.UP_TO_DATE&&(Se.isTracing!==Ui.NONE&&la(Se,I),Se.onBecomeStale()),Se.dependenciesState=vi.STALE}}}(this),cs()},I.prototype.toString=function(){return this.name},I}(),Yt=Be("Atom",St);function pr(I,Z){return I===Z}var $r={identity:pr,structural:function Ei(I,Z){return pl(I,Z)},default:function ur(I,Z){return function xe(I,Z){return"number"==typeof I&&"number"==typeof Z&&isNaN(I)&&isNaN(Z)}(I,Z)||pr(I,Z)},shallow:function mi(I,Z){return pl(I,Z,1)}},Br={},Pn={};function Xn(I,Z){var H=Z?Br:Pn;return H[I]||(H[I]={configurable:!0,enumerable:Z,get:function(){return dr(this),this[I]},set:function(Se){dr(this),this[I]=Se}})}function dr(I){if(!0!==I.__mobxDidRunLazyInitializers){var Z=I.__mobxDecorators;if(Z)for(var H in ue(I,"__mobxDidRunLazyInitializers",!0),Z){var Se=Z[H];Se.propertyCreator(I,Se.prop,Se.descriptor,Se.decoratorTarget,Se.decoratorArguments)}}}function Qr(I,Z){return function(){var Se,it=function(Kn,Cr,ai,ns){return!0===ns?(Z(Kn,Cr,ai,Kn,Se),null):(Object.prototype.hasOwnProperty.call(Kn,"__mobxDecorators")||ue(Kn,"__mobxDecorators",e({},Kn.__mobxDecorators)),Kn.__mobxDecorators[Cr]={prop:Cr,propertyCreator:Z,descriptor:ai,decoratorTarget:Kn,decoratorArguments:Se},Xn(Cr,I))};return Ci(arguments)?(Se=C,it.apply(null,arguments)):(Se=Array.prototype.slice.call(arguments),it)}}function Ci(I){return(2===I.length||3===I.length)&&"string"==typeof I[1]||4===I.length&&!0===I[3]}function _i(I,Z,H){return zn(I)?I:Array.isArray(I)?Zn.array(I,{name:H}):he(I)?Zn.object(I,void 0,{name:H}):Ne(I)?Zn.map(I,{name:H}):Bt(I)?Zn.set(I,{name:H}):I}function Ro(I){return I}function Kt(I){var Z=Qr(!0,function(Se,it,Ft,Kn,Cr){!function sn(I,Z,H,Se){var it=wt(I);if(Hi(it)){var Ft=Ia(it,{object:I,name:Z,type:"add",newValue:H});if(!Ft)return;H=Ft.newValue}H=(it.values[Z]=new oo(H,Se,it.name+"."+Z,!1)).value,Object.defineProperty(I,Z,function fi(I){return _r[I]||(_r[I]={configurable:!0,enumerable:!0,get:function(){return this.$mobx.read(this,I)},set:function(Z){this.$mobx.write(this,I,Z)}})}(Z)),it.keys&&it.keys.push(Z),function Dr(I,Z,H,Se){var it=ys(I),Ft=Ys(),Kn=it||Ft?{type:"add",object:Z,name:H,newValue:Se}:null;Ft&&Co(e({},Kn,{name:I.name,key:H})),it&&bl(I,Kn),Ft&&ps()}(it,I,Z,H)}(Se,it,Ft?Ft.initializer?Ft.initializer.call(Se):Ft.value:void 0,I)}),H=("undefined"!=typeof process&&process,Z);return H.enhancer=I,H}var un={deep:!0,name:void 0,defaultDecorator:void 0};function Gn(I){return null==I?un:"string"==typeof I?{name:I,deep:!0}:I}function Xr(I){return I.defaultDecorator?I.defaultDecorator.enhancer:!1===I.deep?Ro:_i}Object.freeze(un),Object.freeze({deep:!1,name:void 0,defaultDecorator:void 0});var Zi=Kt(_i),ii=Kt(function so(I,Z,H){return null==I||Ar(I)||wu(I)||Er(I)||nt(I)?I:Array.isArray(I)?Zn.array(I,{name:H,deep:!1}):he(I)?Zn.object(I,void 0,{name:H,deep:!1}):Ne(I)?Zn.map(I,{name:H,deep:!1}):Bt(I)?Zn.set(I,{name:H,deep:!1}):J(!1)}),hr=Kt(Ro),Ki=Kt(function Sr(I,Z,H){return pl(I,Z)?Z:I}),Mn={box:function(I,Z){arguments.length>2&&cn("box");var H=Gn(Z);return new oo(I,Xr(H),H.name,!0,H.equals)},shallowBox:function(I,Z){return arguments.length>2&&cn("shallowBox"),Zn.box(I,{name:Z,deep:!1})},array:function(I,Z){arguments.length>2&&cn("array");var H=Gn(Z);return new ec(I,Xr(H),H.name)},shallowArray:function(I,Z){return arguments.length>2&&cn("shallowArray"),Zn.array(I,{name:Z,deep:!1})},map:function(I,Z){arguments.length>2&&cn("map");var H=Gn(Z);return new Bo(I,Xr(H),H.name)},shallowMap:function(I,Z){return arguments.length>2&&cn("shallowMap"),Zn.map(I,{name:Z,deep:!1})},set:function(I,Z){arguments.length>2&&cn("set");var H=Gn(Z);return new Ce(I,Xr(H),H.name)},object:function(I,Z,H){"string"==typeof arguments[1]&&cn("object");var Se=Gn(H);return hc({},I,Z,Se)},shallowObject:function(I,Z){return"string"==typeof arguments[1]&&cn("shallowObject"),Zn.object(I,{},{name:Z,deep:!1})},ref:hr,shallow:ii,deep:Zi,struct:Ki},Zn=function ln(I,Z,H){if("string"==typeof arguments[1])return Zi.apply(null,arguments);if(zn(I))return I;var Se=he(I)?Zn.object(I,Z,H):Array.isArray(I)?Zn.array(I,Z):Ne(I)?Zn.map(I,Z):Bt(I)?Zn.set(I,Z):I;if(Se!==I)return Se;J(!1)};function cn(I){J("Expected one or two arguments to observable."+I+". Did you accidentally try to use observable."+I+" as decorator?")}Object.keys(Mn).forEach(function(I){return Zn[I]=Mn[I]});var Sn=Qr(!1,function(I,Z,H,Se,it){!function Cn(I,Z,H){var Se=wt(I);H.name=Se.name+"."+Z,H.context=I,Se.values[Z]=new yo(H),Object.defineProperty(I,Z,function zi(I){return ni[I]||(ni[I]={configurable:yr.computedConfigurable,enumerable:!1,get:function(){return gi(this).read(this,I)},set:function(Z){gi(this).write(this,I,Z)}})}(Z))}(I,Z,e({get:H.get,set:H.set},it[0]||{}))}),Or=Sn({equals:$r.structural}),ri=function(Z,H,Se){if("string"==typeof H||null!==Z&&"object"==typeof Z&&1===arguments.length)return Sn.apply(null,arguments);var it="object"==typeof H?H:{};return it.get=Z,it.set="function"==typeof H?H:it.set,it.name=it.name||Z.name||"",new yo(it)};ri.struct=Or;var vi=(()=>{return(I=vi||(vi={}))[I.NOT_TRACKING=-1]="NOT_TRACKING",I[I.UP_TO_DATE=0]="UP_TO_DATE",I[I.POSSIBLY_STALE=1]="POSSIBLY_STALE",I[I.STALE=2]="STALE",vi;var I})(),Ui=(()=>{return(I=Ui||(Ui={}))[I.NONE=0]="NONE",I[I.LOG=1]="LOG",I[I.BREAK=2]="BREAK",Ui;var I})(),ao=function I(Z){this.cause=Z};function dt(I){return I instanceof ao}function Bi(I){switch(I.dependenciesState){case vi.UP_TO_DATE:return!1;case vi.NOT_TRACKING:case vi.STALE:return!0;case vi.POSSIBLY_STALE:for(var Z=dn(),H=I.observing,Se=H.length,it=0;it<Se;it++){var Ft=H[it];if(go(Ft)){if(yr.disableErrorBoundaries)Ft.get();else try{Ft.get()}catch(Kn){return mr(Z),!0}if(I.dependenciesState===vi.STALE)return mr(Z),!0}}return Uo(I),mr(Z),!1}}function Gt(I){var Z=I.observers.length>0;yr.computationDepth>0&&Z&&J(!1),!yr.allowStateChanges&&(Z||"strict"===yr.enforceActions)&&J(!1)}function _t(I,Z,H){var Se=Oi(!0);Uo(I),I.newObserving=new Array(I.observing.length+100),I.unboundDepsCount=0,I.runId=++yr.runId;var Ft,it=yr.trackingDerivation;if(yr.trackingDerivation=I,!0===yr.disableErrorBoundaries)Ft=Z.call(H);else try{Ft=Z.call(H)}catch(Kn){Ft=new ao(Kn)}return yr.trackingDerivation=it,function ct(I){for(var Z=I.observing,H=I.observing=I.newObserving,Se=vi.UP_TO_DATE,it=0,Ft=I.unboundDepsCount,Kn=0;Kn<Ft;Kn++)0===(Cr=H[Kn]).diffValue&&(Cr.diffValue=1,it!==Kn&&(H[it]=Cr),it++),Cr.dependenciesState>Se&&(Se=Cr.dependenciesState);for(H.length=it,I.newObserving=null,Ft=Z.length;Ft--;)0===(Cr=Z[Ft]).diffValue&&mo(Cr,I),Cr.diffValue=0;for(;it--;){var Cr;1===(Cr=H[it]).diffValue&&(Cr.diffValue=0,no(Cr,I))}Se!==vi.UP_TO_DATE&&(I.dependenciesState=Se,I.onBecomeStale())}(I),di(Se),Ft}function pt(I){var Z=I.observing;I.observing=[];for(var H=Z.length;H--;)mo(Z[H],I);I.dependenciesState=vi.NOT_TRACKING}function kt(I){var Z=dn(),H=I();return mr(Z),H}function dn(){var I=yr.trackingDerivation;return yr.trackingDerivation=null,I}function mr(I){yr.trackingDerivation=I}function Oi(I){var Z=yr.allowStateReads;return yr.allowStateReads=I,Z}function di(I){yr.allowStateReads=I}function Uo(I){if(I.dependenciesState!==vi.UP_TO_DATE){I.dependenciesState=vi.UP_TO_DATE;for(var Z=I.observing,H=Z.length;H--;)Z[H].lowestObserverState=vi.UP_TO_DATE}}var Qo=0,lo=1;function Ai(I,Z){var H=function(){return Fo(I,Z,this,arguments)};return H.isMobxAction=!0,H}function Fo(I,Z,H,Se){var it=function Ko(I,Z,H){var Se=Ys()&&!!I,it=0;if(Se){it=Date.now();var Ft=H&&H.length||0,Kn=new Array(Ft);if(Ft>0)for(var Cr=0;Cr<Ft;Cr++)Kn[Cr]=H[Cr];Co({type:"action",name:I,object:Z,arguments:Kn})}var ai=dn();Us();var Ds={prevDerivation:ai,prevAllowStateChanges:wn(!0),prevAllowStateReads:Oi(!0),notifySpy:Se,startTime:it,actionId:lo++,parentActionId:Qo};return Qo=Ds.actionId,Ds}(I,H,Se);try{return Z.apply(H,Se)}catch(Ft){throw it.error=Ft,Ft}finally{!function qn(I){Qo!==I.actionId&&J("invalid action stack. did you forget to finish an action?"),Qo=I.parentActionId,void 0!==I.error&&(yr.suppressReactionErrors=!0),Qn(I.prevAllowStateChanges),di(I.prevAllowStateReads),cs(),mr(I.prevDerivation),I.notifySpy&&ps({time:Date.now()-I.startTime}),yr.suppressReactionErrors=!1}(it)}}function wn(I){var Z=yr.allowStateChanges;return yr.allowStateChanges=I,Z}function Qn(I){yr.allowStateChanges=I}var oo=function(I){function Z(H,Se,it,Ft,Kn){void 0===it&&(it="ObservableValue@"+W()),void 0===Ft&&(Ft=!0),void 0===Kn&&(Kn=$r.default);var Cr=I.call(this,it)||this;return Cr.enhancer=Se,Cr.name=it,Cr.equals=Kn,Cr.hasUnreportedChange=!1,Cr.value=Se(H,void 0,it),Ft&&Ys()&&ko({type:"create",name:Cr.name,newValue:""+Cr.value}),Cr}return c(Z,I),Z.prototype.dehanceValue=function(H){return void 0!==this.dehancer?this.dehancer(H):H},Z.prototype.set=function(H){var Se=this.value;if((H=this.prepareNewValue(H))!==yr.UNCHANGED){var it=Ys();it&&Co({type:"update",name:this.name,newValue:H,oldValue:Se}),this.setNewValue(H),it&&ps()}},Z.prototype.prepareNewValue=function(H){if(Gt(this),Hi(this)){var Se=Ia(this,{object:this,type:"update",newValue:H});if(!Se)return yr.UNCHANGED;H=Se.newValue}return H=this.enhancer(H,this.value,this.name),this.equals(this.value,H)?yr.UNCHANGED:H},Z.prototype.setNewValue=function(H){var Se=this.value;this.value=H,this.reportChanged(),ys(this)&&bl(this,{type:"update",object:this,newValue:H,oldValue:Se})},Z.prototype.get=function(){return this.reportObserved(),this.dehanceValue(this.value)},Z.prototype.intercept=function(H){return oa(this,H)},Z.prototype.observe=function(H,Se){return Se&&H({object:this,type:"update",newValue:this.value,oldValue:void 0}),qu(this,H)},Z.prototype.toJSON=function(){return this.get()},Z.prototype.toString=function(){return this.name+"["+this.value+"]"},Z.prototype.valueOf=function(){return Pt(this.get())},Z}(St);oo.prototype[en()]=oo.prototype.valueOf,Be("ObservableValue",oo);var yo=function(){function I(Z){this.dependenciesState=vi.NOT_TRACKING,this.observing=[],this.newObserving=null,this.isBeingObserved=!1,this.isPendingUnobservation=!1,this.observers=[],this.observersIndexes={},this.diffValue=0,this.runId=0,this.lastAccessedBy=0,this.lowestObserverState=vi.UP_TO_DATE,this.unboundDepsCount=0,this.__mapid="#"+W(),this.value=new ao(null),this.isComputing=!1,this.isRunningSetter=!1,this.isTracing=Ui.NONE,this.derivation=Z.get,this.name=Z.name||"ComputedValue@"+W(),Z.set&&(this.setter=Ai(this.name+"-setter",Z.set)),this.equals=Z.equals||(Z.compareStructural||Z.struct?$r.structural:$r.default),this.scope=Z.context,this.requiresReaction=!!Z.requiresReaction,this.keepAlive=!!Z.keepAlive}return I.prototype.onBecomeStale=function(){!function fa(I){if(I.lowestObserverState===vi.UP_TO_DATE){I.lowestObserverState=vi.POSSIBLY_STALE;for(var Z=I.observers,H=Z.length;H--;){var Se=Z[H];Se.dependenciesState===vi.UP_TO_DATE&&(Se.dependenciesState=vi.POSSIBLY_STALE,Se.isTracing!==Ui.NONE&&la(Se,I),Se.onBecomeStale())}}}(this)},I.prototype.onBecomeUnobserved=function(){},I.prototype.onBecomeObserved=function(){},I.prototype.get=function(){this.isComputing&&J("Cycle detected in computation "+this.name+": "+this.derivation),0!==yr.inBatch||0!==this.observers.length||this.keepAlive?(es(this),Bi(this)&&this.trackAndCompute()&&function ya(I){if(I.lowestObserverState!==vi.STALE){I.lowestObserverState=vi.STALE;for(var Z=I.observers,H=Z.length;H--;){var Se=Z[H];Se.dependenciesState===vi.POSSIBLY_STALE?Se.dependenciesState=vi.STALE:Se.dependenciesState===vi.UP_TO_DATE&&(I.lowestObserverState=vi.UP_TO_DATE)}}}(this)):Bi(this)&&(this.warnAboutUntrackedRead(),Us(),this.value=this.computeValue(!1),cs());var Z=this.value;if(dt(Z))throw Z.cause;return Z},I.prototype.peek=function(){var Z=this.computeValue(!1);if(dt(Z))throw Z.cause;return Z},I.prototype.set=function(Z){if(this.setter){ee(!this.isRunningSetter,"The setter of computed value '"+this.name+"' is trying to update itself. Did you intend to update an _observable_ value, instead of the computed property?"),this.isRunningSetter=!0;try{this.setter.call(this.scope,Z)}finally{this.isRunningSetter=!1}}else ee(!1,!1)},I.prototype.trackAndCompute=function(){Ys()&&ko({object:this.scope,type:"compute",name:this.name});var Z=this.value,H=this.dependenciesState===vi.NOT_TRACKING,Se=this.computeValue(!0),it=H||dt(Z)||dt(Se)||!this.equals(Z,Se);return it&&(this.value=Se),it},I.prototype.computeValue=function(Z){var H;if(this.isComputing=!0,yr.computationDepth++,Z)H=_t(this,this.derivation,this.scope);else if(!0===yr.disableErrorBoundaries)H=this.derivation.call(this.scope);else try{H=this.derivation.call(this.scope)}catch(Se){H=new ao(Se)}return yr.computationDepth--,this.isComputing=!1,H},I.prototype.suspend=function(){this.keepAlive||(pt(this),this.value=void 0)},I.prototype.observe=function(Z,H){var Se=this,it=!0,Ft=void 0;return Kr(function(){var Kn=Se.get();if(!it||H){var Cr=dn();Z({type:"update",object:Se,newValue:Kn,oldValue:Ft}),mr(Cr)}it=!1,Ft=Kn})},I.prototype.warnAboutUntrackedRead=function(){},I.prototype.toJSON=function(){return this.get()},I.prototype.toString=function(){return this.name+"["+this.derivation.toString()+"]"},I.prototype.valueOf=function(){return Pt(this.get())},I}();yo.prototype[en()]=yo.prototype.valueOf;var I,go=Be("ComputedValue",yo),ua=function I(){this.version=5,this.UNCHANGED={},this.trackingDerivation=null,this.computationDepth=0,this.runId=0,this.mobxGuid=0,this.inBatch=0,this.pendingUnobservations=[],this.pendingReactions=[],this.isRunningReactions=!1,this.allowStateChanges=!0,this.allowStateReads=!0,this.enforceActions=!1,this.spyListeners=[],this.globalReactionErrorHandlers=[],this.computedRequiresReaction=!1,this.reactionRequiresObservable=!1,this.observableRequiresReaction=!1,this.computedConfigurable=!1,this.disableErrorBoundaries=!1,this.suppressReactionErrors=!1},er=!0,yr=((I=z()).__mobxInstanceCount>0&&!I.__mobxGlobals&&(er=!1),I.__mobxGlobals&&I.__mobxGlobals.version!==(new ua).version&&(er=!1),er?I.__mobxGlobals?(I.__mobxInstanceCount+=1,I.__mobxGlobals.UNCHANGED||(I.__mobxGlobals.UNCHANGED={}),I.__mobxGlobals):(I.__mobxInstanceCount=1,I.__mobxGlobals=new ua):(setTimeout(function(){J("There are multiple, different versions of MobX active. Make sure MobX is loaded only once or use `configure({ isolateGlobalState: true })`")},1),new ua));function no(I,Z){var H=I.observers.length;H&&(I.observersIndexes[Z.__mapid]=H),I.observers[H]=Z,I.lowestObserverState>Z.dependenciesState&&(I.lowestObserverState=Z.dependenciesState)}function mo(I,Z){if(1===I.observers.length)I.observers.length=0,wo(I);else{var H=I.observers,Se=I.observersIndexes,it=H.pop();if(it!==Z){var Ft=Se[Z.__mapid]||0;Ft?Se[it.__mapid]=Ft:delete Se[it.__mapid],H[Ft]=it}delete Se[Z.__mapid]}}function wo(I){!1===I.isPendingUnobservation&&(I.isPendingUnobservation=!0,yr.pendingUnobservations.push(I))}function Us(){yr.inBatch++}function cs(){if(0==--yr.inBatch){vs();for(var I=yr.pendingUnobservations,Z=0;Z<I.length;Z++){var H=I[Z];H.isPendingUnobservation=!1,0===H.observers.length&&(H.isBeingObserved&&(H.isBeingObserved=!1,H.onBecomeUnobserved()),H instanceof yo&&H.suspend())}yr.pendingUnobservations=[]}}function es(I){var Z=yr.trackingDerivation;return null!==Z?(Z.runId!==I.lastAccessedBy&&(I.lastAccessedBy=Z.runId,Z.newObserving[Z.unboundDepsCount++]=I,I.isBeingObserved||(I.isBeingObserved=!0,I.onBecomeObserved())),!0):(0===I.observers.length&&yr.inBatch>0&&wo(I),!1)}function la(I,Z){if(console.log("[mobx.trace] '"+I.name+"' is invalidated due to a change in: '"+Z.name+"'"),I.isTracing===Ui.BREAK){var H=[];Pa(function Tl(I,Z){return _c(gr(I,Z))}(I),H,1),new Function("debugger;\n/*\nTracing '"+I.name+"'\n\nYou are entering this break point because derivation '"+I.name+"' is being traced and '"+Z.name+"' is now forcing it to update.\nJust follow the stacktrace you should now see in the devtools to see precisely what piece of your code is causing this update\nThe stackframe you are looking for is at least ~6-8 stack-frames up.\n\n"+(I instanceof yo?I.derivation.toString().replace(/[*]\//g,"/"):"")+"\n\nThe dependencies for this derivation are:\n\n"+H.join("\n")+"\n*/\n    ")()}}function Pa(I,Z,H){Z.length>=1e3?Z.push("(and many more)"):(Z.push(""+new Array(H).join("\t")+I.name),I.dependencies&&I.dependencies.forEach(function(Se){return Pa(Se,Z,H+1)}))}var fl=function(){function I(Z,H,Se,it){void 0===Z&&(Z="Reaction@"+W()),void 0===it&&(it=!1),this.name=Z,this.onInvalidate=H,this.errorHandler=Se,this.requiresObservable=it,this.observing=[],this.newObserving=[],this.dependenciesState=vi.NOT_TRACKING,this.diffValue=0,this.runId=0,this.unboundDepsCount=0,this.__mapid="#"+W(),this.isDisposed=!1,this._isScheduled=!1,this._isTrackPending=!1,this._isRunning=!1,this.isTracing=Ui.NONE}return I.prototype.onBecomeStale=function(){this.schedule()},I.prototype.schedule=function(){this._isScheduled||(this._isScheduled=!0,yr.pendingReactions.push(this),vs())},I.prototype.isScheduled=function(){return this._isScheduled},I.prototype.runReaction=function(){if(!this.isDisposed){if(Us(),this._isScheduled=!1,Bi(this)){this._isTrackPending=!0;try{this.onInvalidate(),this._isTrackPending&&Ys()&&ko({name:this.name,type:"scheduled-reaction"})}catch(Z){this.reportExceptionInDerivation(Z)}}cs()}},I.prototype.track=function(Z){Us();var Se,H=Ys();H&&(Se=Date.now(),Co({name:this.name,type:"reaction"})),this._isRunning=!0;var it=_t(this,Z,void 0);this._isRunning=!1,this._isTrackPending=!1,this.isDisposed&&pt(this),dt(it)&&this.reportExceptionInDerivation(it.cause),H&&ps({time:Date.now()-Se}),cs()},I.prototype.reportExceptionInDerivation=function(Z){var H=this;if(this.errorHandler)this.errorHandler(Z,this);else{if(yr.disableErrorBoundaries)throw Z;var Se="[mobx] Encountered an uncaught exception that was thrown by a reaction or observer component, in: '"+this+"'";yr.suppressReactionErrors?console.warn("[mobx] (error in reaction '"+this.name+"' suppressed, fix error of causing action below)"):console.error(Se,Z),Ys()&&ko({type:"error",name:this.name,message:Se,error:""+Z}),yr.globalReactionErrorHandlers.forEach(function(it){return it(Z,H)})}},I.prototype.dispose=function(){this.isDisposed||(this.isDisposed=!0,this._isRunning||(Us(),pt(this),cs()))},I.prototype.getDisposer=function(){var Z=this.dispose.bind(this);return Z.$mobx=this,Z},I.prototype.toString=function(){return"Reaction["+this.name+"]"},I.prototype.trace=function(Z){void 0===Z&&(Z=!1),function Wo(){for(var I=[],Z=0;Z<arguments.length;Z++)I[Z]=arguments[Z];var H=!1;"boolean"==typeof I[I.length-1]&&(H=I.pop());var Se=Ya(I);if(!Se)return J(!1);Se.isTracing===Ui.NONE&&console.log("[mobx.trace] '"+Se.name+"' tracing enabled"),Se.isTracing=H?Ui.BREAK:Ui.LOG}(this,Z)},I}();function vs(){yr.inBatch>0||yr.isRunningReactions||function(I){I()}(Za)}function Za(){yr.isRunningReactions=!0;for(var I=yr.pendingReactions,Z=0;I.length>0;){100==++Z&&(console.error("Reaction doesn't converge to a stable state after 100 iterations. Probably there is a cycle in the reactive function: "+I[0]),I.splice(0));for(var H=I.splice(0),Se=0,it=H.length;Se<it;Se++)H[Se].runReaction()}yr.isRunningReactions=!1}var Is=Be("Reaction",fl);function Ys(){return!!yr.spyListeners.length}function ko(I){if(yr.spyListeners.length)for(var Z=yr.spyListeners,H=0,Se=Z.length;H<Se;H++)Z[H](I)}function Co(I){ko(e({},I,{spyReportStart:!0}))}var Ps={spyReportEnd:!0};function ps(I){ko(I?e({},I,{spyReportEnd:!0}):Ps)}function Nr(){J(!1)}function Qi(I){return function(Z,H,Se){if(Se){if(Se.value)return{value:Ai(I,Se.value),enumerable:!1,configurable:!0,writable:!0};var it=Se.initializer;return{enumerable:!1,configurable:!0,writable:!0,initializer:function(){return Ai(I,it.call(this))}}}return tt(I).apply(this,arguments)}}function tt(I){return function(Z,H,Se){Object.defineProperty(Z,H,{configurable:!0,enumerable:!1,get:function(){},set:function(it){ue(this,H,ne(I,it))}})}}var ne=function(Z,H,Se,it){return 1===arguments.length&&"function"==typeof Z?Ai(Z.name||"<unnamed action>",Z):2===arguments.length&&"function"==typeof H?Ai(Z,H):1===arguments.length&&"string"==typeof Z?Qi(Z):!0!==it?Qi(H).apply(null,arguments):void(Z[H]=Ai(Z.name||H,Se.value))};function on(I,Z,H){ue(I,Z,Ai(Z,H.bind(I)))}function Kr(I,Z){void 0===Z&&(Z=R);var it,H=Z&&Z.name||I.name||"Autorun@"+W();if(Z.scheduler||Z.delay){var Ft=Ii(Z),Kn=!1;it=new fl(H,function(){Kn||(Kn=!0,Ft(function(){Kn=!1,it.isDisposed||it.track(Cr)}))},Z.onError,Z.requiresObservable)}else it=new fl(H,function(){this.track(Cr)},Z.onError,Z.requiresObservable);function Cr(){I(it)}return it.schedule(),it.getDisposer()}ne.bound=function rn(I,Z,H,Se){return!0===Se?(on(I,Z,H.value),null):H?{configurable:!0,enumerable:!1,get:function(){return on(this,Z,H.value||H.initializer.call(this)),this[Z]},set:Nr}:{enumerable:!1,configurable:!0,set:function(it){on(this,Z,it)},get:function(){}}};var bi=function(I){return I()};function Ii(I){return I.scheduler?I.scheduler:I.delay?function(Z){return setTimeout(Z,I.delay)}:bi}function hs(I,Z,H){void 0===H&&(H=R),"boolean"==typeof H&&(H={fireImmediately:H});var ns,Se=H.name||"Reaction@"+W(),it=ne(Se,H.onError?function zo(I,Z){return function(){try{return Z.apply(this,arguments)}catch(H){I.call(this,H)}}}(H.onError,Z):Z),Ft=!H.scheduler&&!H.delay,Kn=Ii(H),Cr=!0,ai=!1,Jo=H.compareStructural?$r.structural:H.equals||$r.default,Ds=new fl(Se,function(){Cr||Ft?hl():ai||(ai=!0,Kn(hl))},H.onError,H.requiresObservable);function hl(){if(ai=!1,!Ds.isDisposed){var ou=!1;Ds.track(function(){var Ql=I(Ds);ou=Cr||!Jo(ns,Ql),ns=Ql}),Cr&&H.fireImmediately&&it(ns,Ds),!Cr&&!0===ou&&it(ns,Ds),Cr&&(Cr=!1)}}return Ds.schedule(),Ds.getDisposer()}function Xs(I,Z,H){return vl("onBecomeUnobserved",I,Z,H)}function vl(I,Z,H,Se){var it="function"==typeof Se?gr(Z,H):gr(Z),Ft="function"==typeof Se?Se:H,Kn=it[I];return"function"!=typeof Kn?J(!1):(it[I]=function(){Kn.call(this),Ft.call(this)},function(){it[I]=Kn})}function hc(I,Z,H,Se){var Ft=(Se=Gn(Se)).defaultDecorator||(!1===Se.deep?hr:Zi);dr(I),wt(I,Se.name,Ft.enhancer),Us();try{for(var it in Z){var Kn=Object.getOwnPropertyDescriptor(Z,it),ai=(H&&it in H?H[it]:Kn.get?Sn:Ft)(I,it,Kn,!0);ai&&Object.defineProperty(I,it,ai)}}finally{cs()}return I}function _c(I){var Z={name:I.name};return I.observing&&I.observing.length>0&&(Z.dependencies=function ge(I){var Z=[];return I.forEach(function(H){-1===Z.indexOf(H)&&Z.push(H)}),Z}(I.observing).map(_c)),Z}function jt(I,Z){if(null==I)return!1;if(void 0!==Z){if(Ar(I)){var H=I.$mobx;return H.values&&!!H.values[Z]}return!1}return Ar(I)||!!I.$mobx||Yt(I)||Is(I)||go(I)}function zn(I){return 1!==arguments.length&&J(!1),jt(I)}function Ya(I){switch(I.length){case 0:return yr.trackingDerivation;case 1:return gr(I[0]);case 2:return gr(I[0],I[1])}}function yl(I,Z){void 0===Z&&(Z=void 0),Us();try{return I.apply(Z)}finally{cs()}}function Hi(I){return void 0!==I.interceptors&&I.interceptors.length>0}function oa(I,Z){var H=I.interceptors||(I.interceptors=[]);return H.push(Z),U(function(){var Se=H.indexOf(Z);-1!==Se&&H.splice(Se,1)})}function Ia(I,Z){var H=dn();try{var Se=I.interceptors;if(Se)for(var it=0,Ft=Se.length;it<Ft&&(ee(!(Z=Se[it](Z))||Z.type,"Intercept handlers should return nothing or a change object"),Z);it++);return Z}finally{mr(H)}}function ys(I){return void 0!==I.changeListeners&&I.changeListeners.length>0}function qu(I,Z){var H=I.changeListeners||(I.changeListeners=[]);return H.push(Z),U(function(){var Se=H.indexOf(Z);-1!==Se&&H.splice(Se,1)})}function bl(I,Z){var H=dn(),Se=I.changeListeners;if(Se){for(var it=0,Ft=(Se=Se.slice()).length;it<Ft;it++)Se[it](Z);mr(H)}}var vu=function(){var I=!1,Z={};return Object.defineProperty(Z,"0",{set:function(){I=!0}}),Object.create(Z)[0]=1,!1===I}(),nu=0,ra=function I(){};(function yu(I,Z){void 0!==Object.setPrototypeOf?Object.setPrototypeOf(I.prototype,Z):void 0!==I.prototype.__proto__?I.prototype.__proto__=Z:I.prototype=Z})(ra,Array.prototype),Object.isFrozen(Array)&&["constructor","push","shift","concat","pop","unshift","replace","find","findIndex","splice","reverse","sort"].forEach(function(I){Object.defineProperty(ra.prototype,I,{configurable:!0,writable:!0,value:Array.prototype[I]})});var rd=function(){function I(Z,H,Se,it){this.array=Se,this.owned=it,this.values=[],this.lastKnownLength=0,this.atom=new St(Z||"ObservableArray@"+W()),this.enhancer=function(Ft,Kn){return H(Ft,Kn,Z+"[..]")}}return I.prototype.dehanceValue=function(Z){return void 0!==this.dehancer?this.dehancer(Z):Z},I.prototype.dehanceValues=function(Z){return void 0!==this.dehancer&&Z.length>0?Z.map(this.dehancer):Z},I.prototype.intercept=function(Z){return oa(this,Z)},I.prototype.observe=function(Z,H){return void 0===H&&(H=!1),H&&Z({object:this.array,type:"splice",index:0,added:this.values.slice(),addedCount:this.values.length,removed:[],removedCount:0}),qu(this,Z)},I.prototype.getArrayLength=function(){return this.atom.reportObserved(),this.values.length},I.prototype.setArrayLength=function(Z){if("number"!=typeof Z||Z<0)throw new Error("[mobx.array] Out of range: "+Z);var H=this.values.length;if(Z!==H)if(Z>H){for(var Se=new Array(Z-H),it=0;it<Z-H;it++)Se[it]=void 0;this.spliceWithArray(H,0,Se)}else this.spliceWithArray(Z,H-Z)},I.prototype.updateArrayLength=function(Z,H){if(Z!==this.lastKnownLength)throw new Error("[mobx] Modification exception: the internal structure of an observable array was changed. Did you use peek() to change it?");this.lastKnownLength+=H,H>0&&Z+H+1>nu&&$u(Z+H+1)},I.prototype.spliceWithArray=function(Z,H,Se){var it=this;Gt(this.atom);var Ft=this.values.length;if(void 0===Z?Z=0:Z>Ft?Z=Ft:Z<0&&(Z=Math.max(0,Ft+Z)),H=1===arguments.length?Ft-Z:null==H?0:Math.max(0,Math.min(H,Ft-Z)),void 0===Se&&(Se=C),Hi(this)){var Kn=Ia(this,{object:this.array,type:"splice",index:Z,removedCount:H,added:Se});if(!Kn)return C;H=Kn.removedCount,Se=Kn.added}var Cr=(Se=0===Se.length?Se:Se.map(function(ns){return it.enhancer(ns,void 0)})).length-H;this.updateArrayLength(Ft,Cr);var ai=this.spliceItemsIntoValues(Z,H,Se);return(0!==H||0!==Se.length)&&this.notifyArraySplice(Z,Se,ai),this.dehanceValues(ai)},I.prototype.spliceItemsIntoValues=function(Z,H,Se){var it;if(Se.length<1e4)return(it=this.values).splice.apply(it,y([Z,H],Se));var Ft=this.values.slice(Z,Z+H);return this.values=this.values.slice(0,Z).concat(Se,this.values.slice(Z+H)),Ft},I.prototype.notifyArrayChildUpdate=function(Z,H,Se){var it=!this.owned&&Ys(),Ft=ys(this),Kn=Ft||it?{object:this.array,type:"update",index:Z,newValue:H,oldValue:Se}:null;it&&Co(e({},Kn,{name:this.atom.name})),this.atom.reportChanged(),Ft&&bl(this,Kn),it&&ps()},I.prototype.notifyArraySplice=function(Z,H,Se){var it=!this.owned&&Ys(),Ft=ys(this),Kn=Ft||it?{object:this.array,type:"splice",index:Z,removed:Se,added:H,removedCount:Se.length,addedCount:H.length}:null;it&&Co(e({},Kn,{name:this.atom.name})),this.atom.reportChanged(),Ft&&bl(this,Kn),it&&ps()},I}(),ec=function(I){function Z(H,Se,it,Ft){void 0===it&&(it="ObservableArray@"+W()),void 0===Ft&&(Ft=!1);var Kn=I.call(this)||this,Cr=new rd(it,Se,Kn,Ft);if(st(Kn,"$mobx",Cr),H&&H.length){var ai=wn(!0);Kn.spliceWithArray(0,0,H),Qn(ai)}return vu&&Object.defineProperty(Cr.array,"0",au),Kn}return c(Z,I),Z.prototype.intercept=function(H){return this.$mobx.intercept(H)},Z.prototype.observe=function(H,Se){return void 0===Se&&(Se=!1),this.$mobx.observe(H,Se)},Z.prototype.clear=function(){return this.splice(0)},Z.prototype.concat=function(){for(var H=[],Se=0;Se<arguments.length;Se++)H[Se]=arguments[Se];return this.$mobx.atom.reportObserved(),Array.prototype.concat.apply(this.peek(),H.map(function(it){return wu(it)?it.peek():it}))},Z.prototype.replace=function(H){return this.$mobx.spliceWithArray(0,this.$mobx.values.length,H)},Z.prototype.toJS=function(){return this.slice()},Z.prototype.toJSON=function(){return this.toJS()},Z.prototype.peek=function(){return this.$mobx.atom.reportObserved(),this.$mobx.dehanceValues(this.$mobx.values)},Z.prototype.find=function(H,Se,it){void 0===it&&(it=0);var Ft=this.findIndex.apply(this,arguments);return-1===Ft?void 0:this.get(Ft)},Z.prototype.findIndex=function(H,Se,it){void 0===it&&(it=0);for(var Ft=this.peek(),Kn=Ft.length,Cr=it;Cr<Kn;Cr++)if(H.call(Se,Ft[Cr],Cr,this))return Cr;return-1},Z.prototype.splice=function(H,Se){for(var it=[],Ft=2;Ft<arguments.length;Ft++)it[Ft-2]=arguments[Ft];switch(arguments.length){case 0:return[];case 1:return this.$mobx.spliceWithArray(H);case 2:return this.$mobx.spliceWithArray(H,Se)}return this.$mobx.spliceWithArray(H,Se,it)},Z.prototype.spliceWithArray=function(H,Se,it){return this.$mobx.spliceWithArray(H,Se,it)},Z.prototype.push=function(){for(var H=[],Se=0;Se<arguments.length;Se++)H[Se]=arguments[Se];var it=this.$mobx;return it.spliceWithArray(it.values.length,0,H),it.values.length},Z.prototype.pop=function(){return this.splice(Math.max(this.$mobx.values.length-1,0),1)[0]},Z.prototype.shift=function(){return this.splice(0,1)[0]},Z.prototype.unshift=function(){for(var H=[],Se=0;Se<arguments.length;Se++)H[Se]=arguments[Se];var it=this.$mobx;return it.spliceWithArray(0,0,H),it.values.length},Z.prototype.reverse=function(){var H=this.slice();return H.reverse.apply(H,arguments)},Z.prototype.sort=function(H){var Se=this.slice();return Se.sort.apply(Se,arguments)},Z.prototype.remove=function(H){var Se=this.$mobx.dehanceValues(this.$mobx.values).indexOf(H);return Se>-1&&(this.splice(Se,1),!0)},Z.prototype.move=function(H,Se){function it(Cr){if(Cr<0)throw new Error("[mobx.array] Index out of bounds: "+Cr+" is negative");var ai=this.$mobx.values.length;if(Cr>=ai)throw new Error("[mobx.array] Index out of bounds: "+Cr+" is not smaller than "+ai)}if(it.call(this,H),it.call(this,Se),H!==Se){var Kn,Ft=this.$mobx.values;Kn=H<Se?y(Ft.slice(0,H),Ft.slice(H+1,Se+1),[Ft[H]],Ft.slice(Se+1)):y(Ft.slice(0,Se),[Ft[H]],Ft.slice(Se,H),Ft.slice(H+1)),this.replace(Kn)}},Z.prototype.get=function(H){var Se=this.$mobx;if(Se){if(H<Se.values.length)return Se.atom.reportObserved(),Se.dehanceValue(Se.values[H]);console.warn("[mobx.array] Attempt to read an array index ("+H+") that is out of bounds ("+Se.values.length+"). Please check length first. Out of bound indices will not be tracked by MobX")}},Z.prototype.set=function(H,Se){var it=this.$mobx,Ft=it.values;if(H<Ft.length){Gt(it.atom);var Kn=Ft[H];if(Hi(it)){var Cr=Ia(it,{type:"update",object:this,index:H,newValue:Se});if(!Cr)return;Se=Cr.newValue}(Se=it.enhancer(Se,Kn))!==Kn&&(Ft[H]=Se,it.notifyArrayChildUpdate(H,Se,Kn))}else{if(H!==Ft.length)throw new Error("[mobx.array] Index out of bounds, "+H+" is larger than "+Ft.length);it.spliceWithArray(H,0,[Se])}},Z}(ra);hn(ec.prototype,function(){this.$mobx.atom.reportObserved();var I=this,Z=0;return vn({next:function(){return Z<I.length?{value:I[Z++],done:!1}:{done:!0,value:void 0}}})}),Object.defineProperty(ec.prototype,"length",{enumerable:!1,configurable:!0,get:function(){return this.$mobx.getArrayLength()},set:function(I){this.$mobx.setArrayLength(I)}}),ue(ec.prototype,mt(),"Array"),["every","filter","forEach","indexOf","join","lastIndexOf","map","reduce","reduceRight","slice","some","toString","toLocaleString"].forEach(function(I){var Z=Array.prototype[I];ee("function"==typeof Z,"Base function not defined on Array prototype: '"+I+"'"),ue(ec.prototype,I,function(){return Z.apply(this.peek(),arguments)})}),function we(I,Z){for(var H=0;H<Z.length;H++)ue(I,Z[H],I[Z[H]])}(ec.prototype,["constructor","intercept","observe","clear","concat","get","replace","toJS","toJSON","peek","find","findIndex","splice","spliceWithArray","push","pop","set","shift","unshift","reverse","sort","remove","move","toString","toLocaleString"]);var au=uu(0);function uu(I){return{enumerable:!1,configurable:!1,get:function(){return this.get(I)},set:function(Z){this.set(I,Z)}}}function id(I){Object.defineProperty(ec.prototype,""+I,uu(I))}function $u(I){for(var Z=nu;Z<I;Z++)id(Z);nu=I}$u(1e3);var Hu=Be("ObservableArrayAdministration",rd);function wu(I){return ae(I)&&Hu(I.$mobx)}var Fd={},Bo=function(){function I(Z,H,Se){if(void 0===H&&(H=_i),void 0===Se&&(Se="ObservableMap@"+W()),this.enhancer=H,this.name=Se,this.$mobx=Fd,this._keys=new ec(void 0,Ro,this.name+".keys()",!0),"function"!=typeof Map)throw new Error("mobx.map requires Map polyfill for the current browser. Check babel-polyfill or core-js/es6/map.js");this._data=new Map,this._hasMap=new Map,this.merge(Z)}return I.prototype._has=function(Z){return this._data.has(Z)},I.prototype.has=function(Z){var H=this;if(!yr.trackingDerivation)return this._has(Z);var Se=this._hasMap.get(Z);if(!Se){var it=Se=new oo(this._has(Z),Ro,this.name+"."+cu(Z)+"?",!1);this._hasMap.set(Z,it),Xs(it,function(){return H._hasMap.delete(Z)})}return Se.get()},I.prototype.set=function(Z,H){var Se=this._has(Z);if(Hi(this)){var it=Ia(this,{type:Se?"update":"add",object:this,newValue:H,name:Z});if(!it)return this;H=it.newValue}return Se?this._updateValue(Z,H):this._addValue(Z,H),this},I.prototype.delete=function(Z){var H=this;if(Hi(this)&&!(Se=Ia(this,{type:"delete",object:this,name:Z})))return!1;if(this._has(Z)){var it=Ys(),Ft=ys(this),Se=Ft||it?{type:"delete",object:this,oldValue:this._data.get(Z).value,name:Z}:null;return it&&Co(e({},Se,{name:this.name,key:Z})),yl(function(){H._keys.remove(Z),H._updateHasMapEntry(Z,!1),H._data.get(Z).setNewValue(void 0),H._data.delete(Z)}),Ft&&bl(this,Se),it&&ps(),!0}return!1},I.prototype._updateHasMapEntry=function(Z,H){var Se=this._hasMap.get(Z);Se&&Se.setNewValue(H)},I.prototype._updateValue=function(Z,H){var Se=this._data.get(Z);if((H=Se.prepareNewValue(H))!==yr.UNCHANGED){var it=Ys(),Ft=ys(this),Kn=Ft||it?{type:"update",object:this,oldValue:Se.value,name:Z,newValue:H}:null;it&&Co(e({},Kn,{name:this.name,key:Z})),Se.setNewValue(H),Ft&&bl(this,Kn),it&&ps()}},I.prototype._addValue=function(Z,H){var Se=this;yl(function(){var Cr=new oo(H,Se.enhancer,Se.name+"."+cu(Z),!1);Se._data.set(Z,Cr),H=Cr.value,Se._updateHasMapEntry(Z,!0),Se._keys.push(Z)});var it=Ys(),Ft=ys(this),Kn=Ft||it?{type:"add",object:this,name:Z,newValue:H}:null;it&&Co(e({},Kn,{name:this.name,key:Z})),Ft&&bl(this,Kn),it&&ps()},I.prototype.get=function(Z){return this.has(Z)?this.dehanceValue(this._data.get(Z).get()):this.dehanceValue(void 0)},I.prototype.dehanceValue=function(Z){return void 0!==this.dehancer?this.dehancer(Z):Z},I.prototype.keys=function(){return this._keys[Vt()]()},I.prototype.values=function(){var Z=this,H=0;return vn({next:function(){return H<Z._keys.length?{value:Z.get(Z._keys[H++]),done:!1}:{value:void 0,done:!0}}})},I.prototype.entries=function(){var Z=this,H=0;return vn({next:function(){if(H<Z._keys.length){var Se=Z._keys[H++];return{value:[Se,Z.get(Se)],done:!1}}return{done:!0}}})},I.prototype.forEach=function(Z,H){var Se=this;this._keys.forEach(function(it){return Z.call(H,Se.get(it),it,Se)})},I.prototype.merge=function(Z){var H=this;return Er(Z)&&(Z=Z.toJS()),yl(function(){he(Z)?Object.keys(Z).forEach(function(Se){return H.set(Se,Z[Se])}):Array.isArray(Z)?Z.forEach(function(Se){var it=p(Se,2);return H.set(it[0],it[1])}):Ne(Z)?Z.constructor!==Map?J("Cannot initialize from classes that inherit from Map: "+Z.constructor.name):Z.forEach(function(Se,it){return H.set(it,Se)}):null!=Z&&J("Cannot initialize map from "+Z)}),this},I.prototype.clear=function(){var Z=this;yl(function(){kt(function(){Z._keys.slice().forEach(function(H){return Z.delete(H)})})})},I.prototype.replace=function(Z){var H=this;return yl(function(){for(var Se=function be(I){return Ne(I)||Er(I)?I:Array.isArray(I)?new Map(I):he(I)?new Map(Object.entries(I)):J("Cannot convert to map from '"+I+"'")}(Z),it=H._keys,Ft=Array.from(Se.keys()),Kn=!1,Cr=0;Cr<it.length;Cr++){var ai=it[Cr];it.length===Ft.length&&ai!==Ft[Cr]&&(Kn=!0),Se.has(ai)||(Kn=!0,H.delete(ai))}Se.forEach(function(ns,Jo){H._data.has(Jo)||(Kn=!0),H.set(Jo,ns)}),Kn&&H._keys.replace(Ft)}),this},Object.defineProperty(I.prototype,"size",{get:function(){return this._keys.length},enumerable:!0,configurable:!0}),I.prototype.toPOJO=function(){var Z=this,H={};return this._keys.forEach(function(Se){return H["symbol"==typeof Se?Se:cu(Se)]=Z.get(Se)}),H},I.prototype.toJS=function(){var Z=this,H=new Map;return this._keys.forEach(function(Se){return H.set(Se,Z.get(Se))}),H},I.prototype.toJSON=function(){return this.toPOJO()},I.prototype.toString=function(){var Z=this;return this.name+"[{ "+this._keys.map(function(H){return cu(H)+": "+Z.get(H)}).join(", ")+" }]"},I.prototype.observe=function(Z,H){return qu(this,Z)},I.prototype.intercept=function(Z){return oa(this,Z)},I}();function cu(I){return I&&I.toString?I.toString():new String(I).toString()}hn(Bo.prototype,function(){return this.entries()}),st(Bo.prototype,mt(),"Map");var Er=Be("ObservableMap",Bo),j={},Ce=function(){function I(Z,H,Se){if(void 0===H&&(H=_i),void 0===Se&&(Se="ObservableSet@"+W()),this.name=Se,this.$mobx=j,this._data=new Set,this._atom=function Fn(I,Z,H){void 0===Z&&(Z=se),void 0===H&&(H=se);var Se=new St(I);return function Ls(I,Z,H){vl("onBecomeObserved",I,Z,H)}(Se,Z),Xs(Se,H),Se}(this.name),"function"!=typeof Set)throw new Error("mobx.set requires Set polyfill for the current browser. Check babel-polyfill or core-js/es6/set.js");this.enhancer=function(it,Ft){return H(it,Ft,Se)},Z&&this.replace(Z)}return I.prototype.dehanceValue=function(Z){return void 0!==this.dehancer?this.dehancer(Z):Z},I.prototype.clear=function(){var Z=this;yl(function(){kt(function(){Z._data.forEach(function(H){Z.delete(H)})})})},I.prototype.forEach=function(Z,H){var Se=this;this._data.forEach(function(it){Z.call(H,it,it,Se)})},Object.defineProperty(I.prototype,"size",{get:function(){return this._atom.reportObserved(),this._data.size},enumerable:!0,configurable:!0}),I.prototype.add=function(Z){var H=this;if(Gt(this._atom),Hi(this)&&!(Se=Ia(this,{type:"add",object:this,newValue:Z})))return this;if(!this.has(Z)){yl(function(){H._data.add(H.enhancer(Z,void 0)),H._atom.reportChanged()});var it=Ys(),Ft=ys(this),Se=Ft||it?{type:"add",object:this,newValue:Z}:null;Ft&&bl(this,Se)}return this},I.prototype.delete=function(Z){var H=this;if(Hi(this)&&!(Se=Ia(this,{type:"delete",object:this,oldValue:Z})))return!1;if(this.has(Z)){var it=Ys(),Ft=ys(this),Se=Ft||it?{type:"delete",object:this,oldValue:Z}:null;return yl(function(){H._atom.reportChanged(),H._data.delete(Z)}),Ft&&bl(this,Se),!0}return!1},I.prototype.has=function(Z){return this._atom.reportObserved(),this._data.has(this.dehanceValue(Z))},I.prototype.entries=function(){var Z=0,H=rt(this.keys()),Se=rt(this.values());return vn({next:function(){var it=Z;return Z+=1,it<Se.length?{value:[H[it],Se[it]],done:!1}:{done:!0}}})},I.prototype.keys=function(){return this.values()},I.prototype.values=function(){this._atom.reportObserved();var Se,Z=this,H=0;return void 0!==this._data.values?Se=rt(this._data.values()):(Se=[],this._data.forEach(function(it){return Se.push(it)})),vn({next:function(){return H<Se.length?{value:Z.dehanceValue(Se[H++]),done:!1}:{done:!0}}})},I.prototype.replace=function(Z){var H=this;return nt(Z)&&(Z=Z.toJS()),yl(function(){Array.isArray(Z)||Bt(Z)?(H.clear(),Z.forEach(function(Se){return H.add(Se)})):null!=Z&&J("Cannot initialize set from "+Z)}),this},I.prototype.observe=function(Z,H){return qu(this,Z)},I.prototype.intercept=function(Z){return oa(this,Z)},I.prototype.toJS=function(){return new Set(this)},I.prototype.toString=function(){return this.name+"[ "+rt(this.keys()).join(", ")+" ]"},I}();hn(Ce.prototype,function(){return this.values()}),st(Ce.prototype,mt(),"Set");var nt=Be("ObservableSet",Ce),Mt=function(){function I(Z,H,Se){this.target=Z,this.name=H,this.defaultEnhancer=Se,this.values={}}return I.prototype.read=function(Z,H){if(this.target===Z||(this.illegalAccess(Z,H),this.values[H]))return this.values[H].get()},I.prototype.write=function(Z,H,Se){var it=this.target;it!==Z&&this.illegalAccess(Z,H);var Ft=this.values[H];if(Ft instanceof yo)Ft.set(Se);else{if(Hi(this)){if(!(Kn=Ia(this,{type:"update",object:it,name:H,newValue:Se})))return;Se=Kn.newValue}if((Se=Ft.prepareNewValue(Se))!==yr.UNCHANGED){var Cr=ys(this),ai=Ys(),Kn=Cr||ai?{type:"update",object:it,oldValue:Ft.value,name:H,newValue:Se}:null;ai&&Co(e({},Kn,{name:this.name,key:H})),Ft.setNewValue(Se),Cr&&bl(this,Kn),ai&&ps()}}},I.prototype.remove=function(Z){if(this.values[Z]){var H=this.target;if(Hi(this)&&!(Se=Ia(this,{object:H,name:Z,type:"remove"})))return;try{Us();var it=ys(this),Ft=Ys(),Kn=this.values[Z].get();this.keys&&this.keys.remove(Z),delete this.values[Z],delete this.target[Z];var Se=it||Ft?{type:"remove",object:H,oldValue:Kn,name:Z}:null;Ft&&Co(e({},Se,{name:this.name,key:Z})),it&&bl(this,Se),Ft&&ps()}finally{cs()}}},I.prototype.illegalAccess=function(Z,H){console.warn("Property '"+H+"' of '"+Z+"' was accessed through the prototype chain. Use 'decorate' instead to declare the prop or access it statically through it's owner")},I.prototype.observe=function(Z,H){return qu(this,Z)},I.prototype.intercept=function(Z){return oa(this,Z)},I.prototype.getKeys=function(){var Z=this;return void 0===this.keys&&(this.keys=new ec(Object.keys(this.values).filter(function(H){return Z.values[H]instanceof oo}),Ro,"keys("+this.name+")",!0)),this.keys.slice()},I}();function wt(I,Z,H){void 0===Z&&(Z=""),void 0===H&&(H=_i);var Se=I.$mobx;return Se||(he(I)||(Z=(I.constructor.name||"ObservableObject")+"@"+W()),Z||(Z="ObservableObject@"+W()),st(I,"$mobx",Se=new Mt(I,Z,H)),Se)}var _r=Object.create(null),ni=Object.create(null);function gi(I){return I.$mobx||(dr(I),I.$mobx)}var kn=Be("ObservableObjectAdministration",Mt);function Ar(I){return!!ae(I)&&(dr(I),kn(I.$mobx))}function gr(I,Z){if("object"==typeof I&&null!==I){if(wu(I))return void 0!==Z&&J(!1),I.$mobx.atom;if(nt(I))return I.$mobx;if(Er(I)){var H=I;return void 0===Z?gr(H._keys):((Se=H._data.get(Z)||H._hasMap.get(Z))||J(!1),Se)}var Se;if(dr(I),Ar(I))return Z?((Se=I.$mobx.values[Z])||J(!1),Se):J(!1);if(Yt(I)||go(I)||Is(I))return I}else if("function"==typeof I&&Is(I.$mobx))return I.$mobx;return J(!1)}function fo(I,Z){return I||J("Expecting some object"),void 0!==Z?fo(gr(I,Z)):Yt(I)||go(I)||Is(I)||Er(I)||nt(I)?I:(dr(I),I.$mobx?I.$mobx:void J(!1))}var Es=Object.prototype.toString;function pl(I,Z,H){return void 0===H&&(H=-1),Ks(I,Z,H)}function Ks(I,Z,H,Se,it){if(I===Z)return 0!==I||1/I==1/Z;if(null==I||null==Z)return!1;if(I!=I)return Z!=Z;var Ft=typeof I;if("function"!==Ft&&"object"!==Ft&&"object"!=typeof Z)return!1;I=Wc(I),Z=Wc(Z);var Kn=Es.call(I);if(Kn!==Es.call(Z))return!1;switch(Kn){case"[object RegExp]":case"[object String]":return""+I==""+Z;case"[object Number]":return+I!=+I?+Z!=+Z:0==+I?1/+I==1/Z:+I==+Z;case"[object Date]":case"[object Boolean]":return+I==+Z;case"[object Symbol]":return"undefined"!=typeof Symbol&&Symbol.valueOf.call(I)===Symbol.valueOf.call(Z)}var Cr="[object Array]"===Kn;if(!Cr){if("object"!=typeof I||"object"!=typeof Z)return!1;var ai=I.constructor,ns=Z.constructor;if(ai!==ns&&!("function"==typeof ai&&ai instanceof ai&&"function"==typeof ns&&ns instanceof ns)&&"constructor"in I&&"constructor"in Z)return!1}if(0===H)return!1;H<0&&(H=-1),it=it||[];for(var Jo=(Se=Se||[]).length;Jo--;)if(Se[Jo]===I)return it[Jo]===Z;if(Se.push(I),it.push(Z),Cr){if((Jo=I.length)!==Z.length)return!1;for(;Jo--;)if(!Ks(I[Jo],Z[Jo],H-1,Se,it))return!1}else{var Ds=Object.keys(I),hl=void 0;if(Jo=Ds.length,Object.keys(Z).length!==Jo)return!1;for(;Jo--;)if(!Fc(Z,hl=Ds[Jo])||!Ks(I[hl],Z[hl],H-1,Se,it))return!1}return Se.pop(),it.pop(),!0}function Wc(I){return wu(I)?I.peek():Ne(I)||Er(I)||Bt(I)||nt(I)?rt(I.entries()):I}function Fc(I,Z){return Object.prototype.hasOwnProperty.call(I,Z)}"object"==typeof __MOBX_DEVTOOLS_GLOBAL_HOOK__&&__MOBX_DEVTOOLS_GLOBAL_HOOK__.injectMobx({spy:function Oo(I){return yr.spyListeners.push(I),U(function(){yr.spyListeners=yr.spyListeners.filter(function(Z){return Z!==I})})},extras:{getDebugName:function $s(I,Z){return(void 0!==Z?gr(I,Z):Ar(I)||Er(I)||nt(I)?fo(I):gr(I)).name}},$mobx:"$mobx"});const Ed=function yd(I,Z,H){switch(H.length){case 0:return I.call(Z);case 1:return I.call(Z,H[0]);case 2:return I.call(Z,H[0],H[1]);case 3:return I.call(Z,H[0],H[1],H[2])}return I.apply(Z,H)},La=function Uc(I){return I};var kd=Math.max;const Mo=function Oc(I,Z,H){return Z=kd(void 0===Z?I.length-1:Z,0),function(){for(var Se=arguments,it=-1,Ft=kd(Se.length-Z,0),Kn=Array(Ft);++it<Ft;)Kn[it]=Se[Z+it];it=-1;for(var Cr=Array(Z+1);++it<Z;)Cr[it]=Se[it];return Cr[Z]=H(Kn),Ed(I,this,Cr)}},Sa=function No(I){return function(){return I}};var Sl=i(99567),ru=Sl.Z?function(I,Z){return(0,Sl.Z)(I,"toString",{configurable:!0,enumerable:!1,value:Sa(Z),writable:!0})}:La,pa=Date.now,Me=function od(I){var Z=0,H=0;return function(){var Se=pa(),it=16-(Se-H);if(H=Se,it>0){if(++Z>=800)return arguments[0]}else Z=0;return I.apply(void 0,arguments)}}(ru);const _e=Me,vt=function at(I,Z){return _e(Mo(I,Z,La),I+"")};var Qt=i(15131),Ln=i(2951),cr=i(66224);const Lo=function ui(I,Z,H){(void 0!==H&&!(0,cr.Z)(I[Z],H)||void 0===H&&!(Z in I))&&(0,Ln.Z)(I,Z,H)};var ha=function Ta(I){return function(Z,H,Se){for(var it=-1,Ft=Object(Z),Kn=Se(Z),Cr=Kn.length;Cr--;){var ai=Kn[I?Cr:++it];if(!1===H(Ft[ai],ai,Ft))break}return Z}}();const Ca=ha;var Ru=i(27672),lc=i(1044),Fa=i(36889),nl=i(42542),mc=i(40591),vc=i(34654),Bu=i(18402),Bl=i(6539);var kc=i(25014),lu=i(58209),Ma=i(4214),al=i(98286),Il=i(11595),sd=Function.prototype.toString,Ol=Object.prototype.hasOwnProperty,Ll=sd.call(Object);const ll=function Uu(I){if(!(0,Bl.Z)(I)||"[object Object]"!=(0,al.Z)(I))return!1;var Z=(0,Il.Z)(I);if(null===Z)return!0;var H=Ol.call(Z,"constructor")&&Z.constructor;return"function"==typeof H&&H instanceof H&&sd.call(H)==Ll};var Su=i(14803);const yc=function tn(I,Z){if(("constructor"!==Z||"function"!=typeof I[Z])&&"__proto__"!=Z)return I[Z]};var Nu=i(57640),Xa=i(34673);const Sd=function Yc(I,Z,H,Se,it,Ft,Kn){var Cr=yc(I,H),ai=yc(Z,H),ns=Kn.get(ai);if(ns)Lo(I,H,ns);else{var Jo=Ft?Ft(Cr,ai,H+"",I,Z,Kn):void 0,Ds=void 0===Jo;if(Ds){var hl=(0,vc.Z)(ai),ou=!hl&&(0,kc.Z)(ai),Ql=!hl&&!ou&&(0,Su.Z)(ai);Jo=ai,hl||ou||Ql?(0,vc.Z)(Cr)?Jo=Cr:function tc(I){return(0,Bl.Z)(I)&&(0,Bu.Z)(I)}(Cr)?Jo=(0,Fa.Z)(Cr):ou?(Ds=!1,Jo=(0,Ru.Z)(ai,!0)):Ql?(Ds=!1,Jo=(0,lc.Z)(ai,!0)):Jo=[]:ll(ai)||(0,mc.Z)(ai)?(Jo=Cr,(0,mc.Z)(Cr)?Jo=function ul(I){return(0,Nu.Z)(I,(0,Xa.Z)(I))}(Cr):(!(0,Ma.Z)(Cr)||(0,lu.Z)(Cr))&&(Jo=(0,nl.Z)(ai))):Ds=!1}Ds&&(Kn.set(ai,Jo),it(Jo,ai,Se,Ft,Kn),Kn.delete(ai)),Lo(I,H,Jo)}},Td=function uc(I,Z,H,Se,it){I!==Z&&Ca(Z,function(Ft,Kn){if(it||(it=new Qt.Z),(0,Ma.Z)(Ft))Sd(I,Z,Kn,H,uc,Se,it);else{var Cr=Se?Se(yc(I,Kn),Ft,Kn+"",I,Z,it):void 0;void 0===Cr&&(Cr=Ft),Lo(I,Kn,Cr)}},Xa.Z)},_f=function $p(I,Z,H,Se,it,Ft){return(0,Ma.Z)(I)&&(0,Ma.Z)(Z)&&(Ft.set(Z,I),Td(I,Z,void 0,$p,Ft),Ft.delete(Z)),I};var up=i(28078);const Ec=function Yu(I,Z,H){if(!(0,Ma.Z)(H))return!1;var Se=typeof Z;return!!("number"==Se?(0,Bu.Z)(H)&&(0,up.Z)(Z,H.length):"string"==Se&&Z in H)&&(0,cr.Z)(H[Z],I)};var vp=function Vd(I){return vt(function(Z,H){var Se=-1,it=H.length,Ft=it>1?H[it-1]:void 0,Kn=it>2?H[2]:void 0;for(Ft=I.length>3&&"function"==typeof Ft?(it--,Ft):void 0,Kn&&Ec(H[0],H[1],Kn)&&(Ft=it<3?void 0:Ft,it=1),Z=Object(Z);++Se<it;){var Cr=H[Se];Cr&&I(Z,Cr,Se,Ft)}return Z})}(function(I,Z,H,Se){Td(I,Z,H,Se)});const $c=vp;var Pu=vt(function(I){return I.push(void 0,_f),Ed($c,void 0,I)});const ad=Pu,Jc=function Oa(I){return"symbol"==typeof I||(0,Bl.Z)(I)&&"[object Symbol]"==(0,al.Z)(I)};var ld=/\.|\[(?:[^[\]]*|(["'])(?:(?!\1)[^\\]|\\.)*?\1)\]/,cp=/^\w*$/;const vo=function $d(I,Z){if((0,vc.Z)(I))return!1;var H=typeof I;return!("number"!=H&&"symbol"!=H&&"boolean"!=H&&null!=I&&!Jc(I))||cp.test(I)||!ld.test(I)||null!=Z&&I in Object(Z)};var du=i(94013);function Ac(I,Z){if("function"!=typeof I||null!=Z&&"function"!=typeof Z)throw new TypeError("Expected a function");var H=function(){var Se=arguments,it=Z?Z.apply(this,Se):Se[0],Ft=H.cache;if(Ft.has(it))return Ft.get(it);var Kn=I.apply(this,Se);return H.cache=Ft.set(it,Kn)||Ft,Kn};return H.cache=new(Ac.Cache||du.Z),H}Ac.Cache=du.Z;const ma=Ac;var cc=/[^.[\]]+|\[(?:(-?\d+(?:\.\d+)?)|(["'])((?:(?!\2)[^\\]|\\.)*?)\2)\]|(?=(?:\.|\[\])(?:\.|\[\]|$))/g,Jl=/\\(\\)?/g,Sc=function Iu(I){var Z=ma(I,function(Se){return 500===H.size&&H.clear(),Se}),H=Z.cache;return Z}(function(I){var Z=[];return 46===I.charCodeAt(0)&&Z.push(""),I.replace(cc,function(H,Se,it,Ft){Z.push(it?Ft.replace(Jl,"$1"):Se||H)}),Z});const Tc=Sc;var ju=i(35770);const ud=function fu(I,Z){for(var H=-1,Se=null==I?0:I.length,it=Array(Se);++H<Se;)it[H]=Z(I[H],H,I);return it};var Zd=ju.Z?ju.Z.prototype:void 0,Qc=Zd?Zd.toString:void 0;const jc=function Rl(I){if("string"==typeof I)return I;if((0,vc.Z)(I))return ud(I,Rl)+"";if(Jc(I))return Qc?Qc.call(I):"";var Z=I+"";return"0"==Z&&1/I==-1/0?"-0":Z},h=function fc(I){return null==I?"":jc(I)},x=function E(I,Z){return(0,vc.Z)(I)?I:vo(I,Z)?[I]:Tc(h(I))},le=function Q(I){if("string"==typeof I||Jc(I))return I;var Z=I+"";return"0"==Z&&1/I==-1/0?"-0":Z},Fe=function me(I,Z){for(var H=0,Se=(Z=x(Z,I)).length;null!=I&&H<Se;)I=I[le(Z[H++])];return H&&H==Se?I:void 0},Je=function Oe(I,Z,H){var Se=null==I?void 0:Fe(I,Z);return void 0===Se?H:Se};var ht=i(65252);const nn=function gt(I){var Z=null==I?0:I.length;return Z?I[Z-1]:void 0},Pr=function ar(I,Z){return Z.length<2?I:Fe(I,function $n(I,Z,H){var Se=-1,it=I.length;Z<0&&(Z=-Z>it?0:it+Z),(H=H>it?it:H)<0&&(H+=it),it=Z>H?0:H-Z>>>0,Z>>>=0;for(var Ft=Array(it);++Se<it;)Ft[Se]=I[Se+Z];return Ft}(Z,0,-1))},is=function $i(I,Z){return Z=x(Z,I),null==(I=Pr(I,Z))||delete I[le(nn(Z))]},Gs=function Eo(I){return ll(I)?void 0:I};var qs=i(57052),qa=ju.Z?ju.Z.isConcatSpreadable:void 0;const ja=function ka(I){return(0,vc.Z)(I)||(0,mc.Z)(I)||!!(qa&&I&&I[qa])},jl=function wa(I,Z,H,Se,it){var Ft=-1,Kn=I.length;for(H||(H=ja),it||(it=[]);++Ft<Kn;){var Cr=I[Ft];Z>0&&H(Cr)?Z>1?wa(Cr,Z-1,H,Se,it):(0,qs.Z)(it,Cr):Se||(it[it.length]=Cr)}return it},Ga=function pu(I){return null!=I&&I.length?jl(I,1):[]},Lu=function Tu(I){return _e(Mo(I,void 0,Ga),I+"")};var wc=i(23359),K=Lu(function(I,Z){var H={};if(null==I)return H;var Se=!1;Z=ud(Z,function(Ft){return Ft=x(Ft,I),Se||(Se=Ft.length>1),Ft}),(0,Nu.Z)(I,(0,wc.Z)(I),H),Se&&(H=(0,ht.Z)(H,7,Gs));for(var it=Z.length;it--;)is(H,Z[it]);return H});const Ee=K,Si=function Tr(I,Z){for(var H=-1,Se=null==I?0:I.length;++H<Se;)if(Z(I[H],H,I))return!0;return!1};function Gc(I){var Z=-1,H=null==I?0:I.length;for(this.__data__=new du.Z;++Z<H;)this.add(I[Z])}Gc.prototype.add=Gc.prototype.push=function Aa(I){return this.__data__.set(I,"__lodash_hash_undefined__"),this},Gc.prototype.has=function Al(I){return this.__data__.has(I)};const gf=Gc,__=function Hd(I,Z){return I.has(Z)},Bd=function Jd(I,Z,H,Se,it,Ft){var Kn=1&H,Cr=I.length,ai=Z.length;if(Cr!=ai&&!(Kn&&ai>Cr))return!1;var ns=Ft.get(I),Jo=Ft.get(Z);if(ns&&Jo)return ns==Z&&Jo==I;var Ds=-1,hl=!0,ou=2&H?new gf:void 0;for(Ft.set(I,Z),Ft.set(Z,I);++Ds<Cr;){var Ql=I[Ds],Au=Z[Ds];if(Se)var qc=Kn?Se(Au,Ql,Ds,Z,I,Ft):Se(Ql,Au,Ds,I,Z,Ft);if(void 0!==qc){if(qc)continue;hl=!1;break}if(ou){if(!Si(Z,function(sf,hd){if(!__(ou,hd)&&(Ql===sf||it(Ql,sf,H,Se,Ft)))return ou.push(hd)})){hl=!1;break}}else if(Ql!==Au&&!it(Ql,Au,H,Se,Ft)){hl=!1;break}}return Ft.delete(I),Ft.delete(Z),hl};var dh=i(83345);const cl=function Hp(I){var Z=-1,H=Array(I.size);return I.forEach(function(Se,it){H[++Z]=[it,Se]}),H},Df=function g_(I){var Z=-1,H=Array(I.size);return I.forEach(function(Se){H[++Z]=Se}),H};var ph=ju.Z?ju.Z.prototype:void 0,hh=ph?ph.valueOf:void 0;var vf=i(22018),xf=Object.prototype.hasOwnProperty;var Rf=i(17507),Vh="[object Arguments]",v_="[object Array]",gh="[object Object]",Zh=Object.prototype.hasOwnProperty;const tg=function mh(I,Z,H,Se,it,Ft){var Kn=(0,vc.Z)(I),Cr=(0,vc.Z)(Z),ai=Kn?v_:(0,Rf.Z)(I),ns=Cr?v_:(0,Rf.Z)(Z),Jo=(ai=ai==Vh?gh:ai)==gh,Ds=(ns=ns==Vh?gh:ns)==gh,hl=ai==ns;if(hl&&(0,kc.Z)(I)){if(!(0,kc.Z)(Z))return!1;Kn=!0,Jo=!1}if(hl&&!Jo)return Ft||(Ft=new Qt.Z),Kn||(0,Su.Z)(I)?Bd(I,Z,H,Se,it,Ft):function m_(I,Z,H,Se,it,Ft,Kn){switch(H){case"[object DataView]":if(I.byteLength!=Z.byteLength||I.byteOffset!=Z.byteOffset)return!1;I=I.buffer,Z=Z.buffer;case"[object ArrayBuffer]":return!(I.byteLength!=Z.byteLength||!Ft(new dh.Z(I),new dh.Z(Z)));case"[object Boolean]":case"[object Date]":case"[object Number]":return(0,cr.Z)(+I,+Z);case"[object Error]":return I.name==Z.name&&I.message==Z.message;case"[object RegExp]":case"[object String]":return I==Z+"";case"[object Map]":var Cr=cl;case"[object Set]":if(Cr||(Cr=Df),I.size!=Z.size&&!(1&Se))return!1;var ns=Kn.get(I);if(ns)return ns==Z;Se|=2,Kn.set(I,Z);var Jo=Bd(Cr(I),Cr(Z),Se,it,Ft,Kn);return Kn.delete(I),Jo;case"[object Symbol]":if(hh)return hh.call(I)==hh.call(Z)}return!1}(I,Z,ai,H,Se,it,Ft);if(!(1&H)){var ou=Jo&&Zh.call(I,"__wrapped__"),Ql=Ds&&Zh.call(Z,"__wrapped__");if(ou||Ql){var Au=ou?I.value():I,qc=Ql?Z.value():Z;return Ft||(Ft=new Qt.Z),it(Au,qc,H,Se,Ft)}}return!!hl&&(Ft||(Ft=new Qt.Z),function Ef(I,Z,H,Se,it,Ft){var Kn=1&H,Cr=(0,vf.Z)(I),ai=Cr.length;if(ai!=(0,vf.Z)(Z).length&&!Kn)return!1;for(var Ds=ai;Ds--;){var hl=Cr[Ds];if(!(Kn?hl in Z:xf.call(Z,hl)))return!1}var ou=Ft.get(I),Ql=Ft.get(Z);if(ou&&Ql)return ou==Z&&Ql==I;var Au=!0;Ft.set(I,Z),Ft.set(Z,I);for(var qc=Kn;++Ds<ai;){var sf=I[hl=Cr[Ds]],hd=Z[hl];if(Se)var Ph=Kn?Se(hd,sf,hl,Z,I,Ft):Se(sf,hd,hl,I,Z,Ft);if(!(void 0===Ph?sf===hd||it(sf,hd,H,Se,Ft):Ph)){Au=!1;break}qc||(qc="constructor"==hl)}if(Au&&!qc){var G_=I.constructor,af=Z.constructor;G_!=af&&"constructor"in I&&"constructor"in Z&&!("function"==typeof G_&&G_ instanceof G_&&"function"==typeof af&&af instanceof af)&&(Au=!1)}return Ft.delete(I),Ft.delete(Z),Au}(I,Z,H,Se,it,Ft))},Wh=function Ou(I,Z,H,Se,it){return I===Z||(null==I||null==Z||!(0,Bl.Z)(I)&&!(0,Bl.Z)(Z)?I!=I&&Z!=Z:tg(I,Z,H,Se,Ou,it))},yp=function vh(I){return I==I&&!(0,Ma.Z)(I)};var Od=i(44409);const Ad=function Qh(I,Z){return function(H){return null!=H&&H[I]===Z&&(void 0!==Z||I in Object(H))}},Kh=function hu(I){var Z=function E_(I){for(var Z=(0,Od.Z)(I),H=Z.length;H--;){var Se=Z[H],it=I[Se];Z[H]=[Se,it,yp(it)]}return Z}(I);return 1==Z.length&&Z[0][2]?Ad(Z[0][0],Z[0][1]):function(H){return H===I||function y_(I,Z,H,Se){var it=H.length,Ft=it,Kn=!Se;if(null==I)return!Ft;for(I=Object(I);it--;){var Cr=H[it];if(Kn&&Cr[2]?Cr[1]!==I[Cr[0]]:!(Cr[0]in I))return!1}for(;++it<Ft;){var ai=(Cr=H[it])[0],ns=I[ai],Jo=Cr[1];if(Kn&&Cr[2]){if(void 0===ns&&!(ai in I))return!1}else{var Ds=new Qt.Z;if(Se)var hl=Se(ns,Jo,ai,I,Z,Ds);if(!(void 0===hl?Wh(Jo,ns,3,Se,Ds):hl))return!1}}return!0}(H,I,Z)}},Xh=function Ep(I,Z){return null!=I&&Z in Object(I)};var ic=i(19238);const bp=function qh(I,Z){return null!=I&&function Kd(I,Z,H){for(var Se=-1,it=(Z=x(Z,I)).length,Ft=!1;++Se<it;){var Kn=le(Z[Se]);if(!(Ft=null!=I&&H(I,Kn)))break;I=I[Kn]}return Ft||++Se!=it?Ft:!!(it=null==I?0:I.length)&&(0,ic.Z)(it)&&(0,up.Z)(Kn,it)&&((0,vc.Z)(I)||(0,mc.Z)(I))}(I,Z,Xh)},bh=function t_(I){return vo(I)?function Eh(I){return function(Z){return null==Z?void 0:Z[I]}}(le(I)):function e_(I){return function(Z){return Fe(Z,I)}}(I)},Zf=function n_(I){return"function"==typeof I?I:null==I?La:"object"==typeof I?(0,vc.Z)(I)?function yh(I,Z){return vo(I)&&yp(Z)?Ad(le(I),Z):function(H){var Se=Je(H,I);return void 0===Se&&Se===Z?bp(H,I):Wh(Z,Se,3)}}(I[0],I[1]):Kh(I):bh(I)};var Ch=function bf(I,Z){return function(H,Se){if(null==H)return H;if(!(0,Bu.Z)(H))return I(H,Se);for(var it=H.length,Ft=Z?it:-1,Kn=Object(H);(Z?Ft--:++Ft<it)&&!1!==Se(Kn[Ft],Ft,Kn););return H}}(function Sh(I,Z){return I&&Ca(I,Z,Od.Z)});const da=Ch,Fu=function Rc(I,Z){var H;return da(I,function(Se,it,Ft){return!(H=Z(Se,it,Ft))}),!!H},ku=function jp(I,Z){for(var H=-1,Se=null==I?0:I.length;++H<Se;)if(!Z(I[H],H,I))return!1;return!0},Pf=function Mh(I,Z){var H=!0;return da(I,function(Se,it,Ft){return H=!!Z(Se,it,Ft)}),H},qd=function Wf(I){return I&&I.length?I[0]:void 0},Gp=function H_(I){for(var Z=-1,H=null==I?0:I.length,Se=0,it=[];++Z<H;){var Ft=I[Z];Ft&&(it[Se++]=Ft)}return it},zp=function zu(I,Z,H,Se){for(var it=I.length,Ft=H+(Se?1:-1);Se?Ft--:++Ft<it;)if(Z(I[Ft],Ft,I))return Ft;return-1};var pc=/\s/;var Lf=/^\s+/;const r_=function Vp(I){return I&&I.slice(0,function oc(I){for(var Z=I.length;Z--&&pc.test(I.charAt(Z)););return Z}(I)+1).replace(Lf,"")};var tf=/^[-+]0x[0-9a-f]+$/i,Oh=/^0b[01]+$/i,Ah=/^0o[0-7]+$/i,fd=parseInt;const Mp=function Dh(I){if("number"==typeof I)return I;if(Jc(I))return NaN;if((0,Ma.Z)(I)){var Z="function"==typeof I.valueOf?I.valueOf():I;I=(0,Ma.Z)(Z)?Z+"":Z}if("string"!=typeof I)return 0===I?I:+I;I=r_(I);var H=Oh.test(I);return H||Ah.test(I)?fd(I.slice(2),H?2:8):tf.test(I)?NaN:+I},Dd=function Op(I){var Z=function Qf(I){return I?1/0===(I=Mp(I))||-1/0===I?17976931348623157e292*(I<0?-1:1):I==I?I:0:0===I?I:0}(I),H=Z%1;return Z==Z?H?Z-H:Z:0};var Zp=Math.max,o_=function If(I){return function(Z,H,Se){var it=Object(Z);if(!(0,Bu.Z)(Z)){var Ft=Zf(H);Z=(0,Od.Z)(Z),H=function(Cr){return Ft(it[Cr],Cr,it)}}var Kn=I(Z,H,Se);return Kn>-1?it[Ft?Z[Kn]:Kn]:void 0}}(function Kf(I,Z,H){var Se=null==I?0:I.length;if(!Se)return-1;var it=null==H?0:Dd(H);return it<0&&(it=Zp(Se+it,0)),zp(I,Zf(Z),it)});const Ap=o_,Xf=function nf(I){return"string"==typeof I||!(0,vc.Z)(I)&&(0,Bl.Z)(I)&&"[object String]"==(0,al.Z)(I)};var Jp=i(40309);const qf=function(){return Jp.Z.Date.now()};var s_=Math.max,rg=Math.min;const M_=function xh(I,Z,H){var Se=!0,it=!0;if("function"!=typeof I)throw new TypeError("Expected a function");return(0,Ma.Z)(H)&&(Se="leading"in H?!!H.leading:Se,it="trailing"in H?!!H.trailing:it),function Qp(I,Z,H){var Se,it,Ft,Kn,Cr,ai,ns=0,Jo=!1,Ds=!1,hl=!0;if("function"!=typeof I)throw new TypeError("Expected a function");function ou(_d){var hp=Se,Vu=it;return Se=it=void 0,ns=_d,Kn=I.apply(Vu,hp)}function Ql(_d){return ns=_d,Cr=setTimeout(sf,Z),Jo?ou(_d):Kn}function qc(_d){var hp=_d-ai;return void 0===ai||hp>=Z||hp<0||Ds&&_d-ns>=Ft}function sf(){var _d=qf();if(qc(_d))return hd(_d);Cr=setTimeout(sf,function Au(_d){var Pc=Z-(_d-ai);return Ds?rg(Pc,Ft-(_d-ns)):Pc}(_d))}function hd(_d){return Cr=void 0,hl&&Se?ou(_d):(Se=it=void 0,Kn)}function af(){var _d=qf(),hp=qc(_d);if(Se=arguments,it=this,ai=_d,hp){if(void 0===Cr)return Ql(ai);if(Ds)return clearTimeout(Cr),Cr=setTimeout(sf,Z),ou(ai)}return void 0===Cr&&(Cr=setTimeout(sf,Z)),Kn}return Z=Mp(Z)||0,(0,Ma.Z)(H)&&(Jo=!!H.leading,Ft=(Ds="maxWait"in H)?s_(Mp(H.maxWait)||0,Z):Ft,hl="trailing"in H?!!H.trailing:hl),af.cancel=function Ph(){void 0!==Cr&&clearTimeout(Cr),ns=0,Se=ai=it=Cr=void 0},af.flush=function G_(){return void 0===Cr?Kn:hd(qf())},af}(I,Z,{leading:Se,maxWait:Z,trailing:it})},a_=function Sf(I){return I!=I},gg=function Xp(I){return null==I?[]:function Rh(I,Z){return ud(Z,function(H){return I[H]})}(I,(0,Od.Z)(I))};var pd=Math.max;const mg=function u_(I,Z,H,Se){I=(0,Bu.Z)(I)?I:gg(I),H=H&&!Se?Dd(H):0;var it=I.length;return H<0&&(H=pd(it+H,0)),Xf(I)?H<=it&&I.indexOf(Z,H)>-1:!!it&&function l_(I,Z,H){return Z==Z?function tp(I,Z,H){for(var Se=H-1,it=I.length;++Se<it;)if(I[Se]===Z)return Se;return-1}(I,Z,H):zp(I,a_,H)}(I,Z,H)>-1};var pp=i(15427);const Vc=function Nh(I,Z,H,Se){if(!(0,Ma.Z)(I))return I;for(var it=-1,Ft=(Z=x(Z,I)).length,Kn=Ft-1,Cr=I;null!=Cr&&++it<Ft;){var ai=le(Z[it]),ns=H;if("__proto__"===ai||"constructor"===ai||"prototype"===ai)return I;if(it!=Kn){var Jo=Cr[ai];void 0===(ns=Se?Se(Jo,ai,Cr):void 0)&&(ns=(0,Ma.Z)(Jo)?Jo:(0,up.Z)(Z[it+1])?[]:{})}(0,pp.Z)(Cr,ai,ns),Cr=Cr[ai]}return I},P=function B_(I,Z){return function ig(I,Z,H){for(var Se=-1,it=Z.length,Ft={};++Se<it;){var Kn=Z[Se],Cr=Fe(I,Kn);H(Cr,Kn)&&Vc(Ft,x(Kn,I),Cr)}return Ft}(I,Z,function(H,Se){return bp(I,Se)})};var te=Lu(function(I,Z){return null==I?{}:P(I,Z)});const b=te;function G(I,Z){1&I&&(r.TgZ(0,"span"),r._uU(1,"loading..."),r.qZA())}const Te=function(I){return{$implicit:I}};function Ge(I,Z){if(1&I&&(r.ynx(0),r.TgZ(1,"div"),r.Hsn(2),r.qZA(),r.BQk()),2&I){const H=r.oxw();r.xp6(1),r.Udp("height",H.getTotalHeight())}}const an=function(){return{dontDetach:!0}},fr=["*"],wr=["loadingTemplate"],ci=["treeNodeTemplate"],oi=["treeNodeWrapperTemplate"],ts=["treeNodeFullTemplate"],Do=["viewport"],Ss=function(I,Z,H,Se){return{loadingTemplate:I,treeNodeTemplate:Z,treeNodeWrapperTemplate:H,treeNodeFullTemplate:Se}};function Yo(I,Z){if(1&I&&r._UZ(0,"tree-node-collection",4),2&I){const H=r.oxw();r.Q6J("nodes",H.treeModel.roots)("treeModel",H.treeModel)("templates",r.l5B(3,Ss,H.loadingTemplate,H.treeNodeTemplate,H.treeNodeWrapperTemplate,H.treeNodeFullTemplate))}}function ia(I,Z){if(1&I&&r._UZ(0,"tree-node-drop-slot",5),2&I){const H=r.oxw();r.Q6J("dropIndex",0)("node",H.treeModel.virtualRoot)}}function v(I,Z){if(1&I&&r._UZ(0,"tree-node-drop-slot",6),2&I){const H=r.oxw(3);r.Q6J("dropIndex",H.node.index)("node",H.node.parent)}}function D(I,Z){if(1&I&&(r.TgZ(0,"div"),r.YNc(1,v,1,2,"tree-node-drop-slot",3),r._UZ(2,"tree-node-wrapper",4)(3,"tree-node-children",5)(4,"tree-node-drop-slot",6),r.qZA()),2&I){const H=r.oxw(2);r.Tol(H.node.getClass()),r.ekj("tree-node",!0)("tree-node-expanded",H.node.isExpanded&&H.node.hasChildren)("tree-node-collapsed",H.node.isCollapsed&&H.node.hasChildren)("tree-node-leaf",H.node.isLeaf)("tree-node-active",H.node.isActive)("tree-node-focused",H.node.isFocused),r.xp6(1),r.Q6J("ngIf",0===H.index),r.xp6(1),r.Q6J("node",H.node)("index",H.index)("templates",H.templates),r.xp6(1),r.Q6J("node",H.node)("templates",H.templates),r.xp6(1),r.Q6J("dropIndex",H.node.index+1)("node",H.node.parent)}}const B=function(I,Z,H,Se){return{$implicit:I,node:Z,index:H,templates:Se}};function ye(I,Z){if(1&I&&(r.ynx(0),r.YNc(1,D,5,22,"div",1),r.GkF(2,2),r.BQk()),2&I){const H=r.oxw();r.xp6(1),r.Q6J("ngIf",!H.templates.treeNodeFullTemplate),r.xp6(1),r.Q6J("ngTemplateOutlet",H.templates.treeNodeFullTemplate)("ngTemplateOutletContext",r.l5B(3,B,H.node,H.node,H.index,H.templates))}}function He(I,Z){if(1&I&&(r.TgZ(0,"span"),r._uU(1),r.qZA()),2&I){const H=r.oxw();r.xp6(1),r.Oqu(H.node.displayField)}}const yt=function(I,Z,H){return{$implicit:I,node:Z,index:H}};function Wt(I,Z){if(1&I){const H=r.EpF();r.TgZ(0,"span",3),r.NdJ("click",function(it){return r.CHM(H),r.oxw(2).node.mouseAction("expanderClick",it)}),r._UZ(1,"span",4),r.qZA()}if(2&I){const H=r.oxw(2);r.ekj("toggle-children-wrapper-expanded",H.node.isExpanded)("toggle-children-wrapper-collapsed",H.node.isCollapsed)}}function gn(I,Z){1&I&&r._UZ(0,"span",5)}function nr(I,Z){if(1&I&&(r.ynx(0),r.YNc(1,Wt,2,4,"span",1),r.YNc(2,gn,1,0,"span",2),r.BQk()),2&I){const H=r.oxw();r.xp6(1),r.Q6J("ngIf",H.node.hasChildren),r.xp6(1),r.Q6J("ngIf",!H.node.hasChildren)}}function ti(I,Z){if(1&I&&r._UZ(0,"tree-node-collection",4),2&I){const H=r.oxw(3);r.Q6J("nodes",H.node.children)("templates",H.templates)("treeModel",H.node.treeModel)}}function $o(I,Z){if(1&I&&r._UZ(0,"tree-loading-component",5),2&I){const H=r.oxw(3);r.Udp("padding-left",H.node.getNodePadding()),r.Q6J("template",H.templates.loadingTemplate)("node",H.node)}}function Hs(I,Z){if(1&I&&(r.TgZ(0,"div"),r.YNc(1,ti,1,3,"tree-node-collection",2),r.YNc(2,$o,1,4,"tree-loading-component",3),r.qZA()),2&I){const H=r.oxw(2);r.ekj("tree-children",!0)("tree-children-no-padding",H.node.options.levelPadding),r.xp6(1),r.Q6J("ngIf",H.node.children),r.xp6(1),r.Q6J("ngIf",!H.node.children)}}function po(I,Z){if(1&I&&(r.ynx(0),r.YNc(1,Hs,3,6,"div",1),r.BQk()),2&I){const H=r.oxw();r.xp6(1),r.Q6J("treeAnimateOpen",H.node.isExpanded)("treeAnimateOpenSpeed",H.node.options.animateSpeed)("treeAnimateOpenAcceleration",H.node.options.animateAcceleration)("treeAnimateOpenEnabled",H.node.options.animateExpand)}}function ds(I,Z){if(1&I&&r._UZ(0,"tree-node",2),2&I){const H=Z.$implicit,Se=Z.index,it=r.oxw(2);r.Q6J("node",H)("index",Se)("templates",it.templates)}}function sa(I,Z){if(1&I&&(r.ynx(0),r.TgZ(1,"div"),r.YNc(2,ds,1,3,"tree-node",1),r.qZA(),r.BQk()),2&I){const H=r.oxw();r.xp6(1),r.Udp("margin-top",H.marginTop),r.xp6(1),r.Q6J("ngForOf",H.viewportNodes)("ngForTrackBy",H.trackNode)}}function Js(I,Z){if(1&I&&r._UZ(0,"tree-node-checkbox",4),2&I){const H=r.oxw(2);r.Q6J("node",H.node)}}function zr(I,Z){if(1&I){const H=r.EpF();r.TgZ(0,"div",2),r.YNc(1,Js,1,1,"tree-node-checkbox",3),r._UZ(2,"tree-node-expander",4),r.TgZ(3,"div",5),r.NdJ("click",function(it){return r.CHM(H),r.oxw().node.mouseAction("click",it)})("dblclick",function(it){return r.CHM(H),r.oxw().node.mouseAction("dblClick",it)})("mouseover",function(it){return r.CHM(H),r.oxw().node.mouseAction("mouseOver",it)})("mouseout",function(it){return r.CHM(H),r.oxw().node.mouseAction("mouseOut",it)})("contextmenu",function(it){return r.CHM(H),r.oxw().node.mouseAction("contextMenu",it)})("treeDrop",function(it){return r.CHM(H),r.oxw().node.onDrop(it)})("treeDropDragOver",function(it){return r.CHM(H),r.oxw().node.mouseAction("dragOver",it)})("treeDropDragLeave",function(it){return r.CHM(H),r.oxw().node.mouseAction("dragLeave",it)})("treeDropDragEnter",function(it){return r.CHM(H),r.oxw().node.mouseAction("dragEnter",it)}),r._UZ(4,"tree-node-content",6),r.qZA()()}if(2&I){const H=r.oxw();r.Udp("padding-left",H.node.getNodePadding()),r.xp6(1),r.Q6J("ngIf",H.node.options.useCheckbox),r.xp6(1),r.Q6J("node",H.node),r.xp6(1),r.ekj("node-content-wrapper-active",H.node.isActive)("node-content-wrapper-focused",H.node.isFocused),r.Q6J("treeAllowDrop",H.node.allowDrop)("allowDragoverStyling",H.node.allowDragoverStyling())("treeDrag",H.node)("treeDragEnabled",H.node.allowDrag()),r.xp6(1),r.Q6J("node",H.node)("index",H.index)("template",H.templates.treeNodeTemplate)}}function Rr(I,Z){if(1&I){const H=r.EpF();r.ynx(0),r.TgZ(1,"input",1),r.NdJ("click",function(it){return r.CHM(H),r.oxw().node.mouseAction("checkboxClick",it)}),r.qZA(),r.BQk()}if(2&I){const H=r.oxw();r.xp6(1),r.Q6J("checked",H.node.isSelected)("indeterminate",H.node.isPartiallySelected)}}let Ur=(()=>{class I{constructor(H,Se){this.templateRef=H,this.viewContainer=Se,this.templateBindings={}}ngOnInit(){this.view=this.viewContainer.createEmbeddedView(this.templateRef),this.dispose&&this.dispose(),this.shouldDetach()&&this.view.detach(),this.autoDetect(this.view)}shouldDetach(){return this.treeMobxAutorun&&this.treeMobxAutorun.detach}autoDetect(H){this.dispose=Kr(()=>H.detectChanges())}ngOnDestroy(){this.dispose&&this.dispose()}}return I.\u0275fac=function(H){return new(H||I)(r.Y36(r.Rgc),r.Y36(r.s_b))},I.\u0275dir=r.lG2({type:I,selectors:[["","treeMobxAutorun",""]],inputs:{treeMobxAutorun:"treeMobxAutorun"}}),I})();const Tf={TOGGLE_ACTIVE:(I,Z,H)=>Z&&Z.toggleActivated(),TOGGLE_ACTIVE_MULTI:(I,Z,H)=>Z&&Z.toggleActivated(!0),TOGGLE_SELECTED:(I,Z,H)=>Z&&Z.toggleSelected(),ACTIVATE:(I,Z,H)=>Z.setIsActive(!0),DEACTIVATE:(I,Z,H)=>Z.setIsActive(!1),SELECT:(I,Z,H)=>Z.setIsSelected(!0),DESELECT:(I,Z,H)=>Z.setIsSelected(!1),FOCUS:(I,Z,H)=>Z.focus(),TOGGLE_EXPANDED:(I,Z,H)=>Z.hasChildren&&Z.toggleExpanded(),EXPAND:(I,Z,H)=>Z.expand(),COLLAPSE:(I,Z,H)=>Z.collapse(),DRILL_DOWN:(I,Z,H)=>I.focusDrillDown(),DRILL_UP:(I,Z,H)=>I.focusDrillUp(),NEXT_NODE:(I,Z,H)=>I.focusNextNode(),PREVIOUS_NODE:(I,Z,H)=>I.focusPreviousNode(),MOVE_NODE:(I,Z,H,{from:Se,to:it})=>{H.ctrlKey?I.copyNode(Se,it):I.moveNode(Se,it)}},Vg={mouse:{click:Tf.TOGGLE_ACTIVE,dblClick:null,contextMenu:null,expanderClick:Tf.TOGGLE_EXPANDED,checkboxClick:Tf.TOGGLE_SELECTED,drop:Tf.MOVE_NODE},keys:{39:Tf.DRILL_DOWN,37:Tf.DRILL_UP,40:Tf.NEXT_NODE,38:Tf.PREVIOUS_NODE,32:Tf.TOGGLE_ACTIVE,13:Tf.TOGGLE_ACTIVE}};class Em{constructor(Z={}){this.options=Z,this.actionMapping=ad({},this.options.actionMapping,Vg),Z.rtl&&(this.actionMapping.keys[39]=Je(Z,["actionMapping","keys",39])||Tf.DRILL_UP,this.actionMapping.keys[37]=Je(Z,["actionMapping","keys",37])||Tf.DRILL_DOWN)}get hasChildrenField(){return this.options.hasChildrenField||"hasChildren"}get childrenField(){return this.options.childrenField||"children"}get displayField(){return this.options.displayField||"name"}get idField(){return this.options.idField||"id"}get isExpandedField(){return this.options.isExpandedField||"isExpanded"}get getChildren(){return this.options.getChildren}get levelPadding(){return this.options.levelPadding||0}get useVirtualScroll(){return this.options.useVirtualScroll}get animateExpand(){return this.options.animateExpand}get animateSpeed(){return this.options.animateSpeed||1}get animateAcceleration(){return this.options.animateAcceleration||1.2}get scrollOnActivate(){return void 0===this.options.scrollOnActivate||this.options.scrollOnActivate}get rtl(){return!!this.options.rtl}get rootId(){return this.options.rootId}get useCheckbox(){return this.options.useCheckbox}get useTriState(){return void 0===this.options.useTriState||this.options.useTriState}get scrollContainer(){return this.options.scrollContainer}get allowDragoverStyling(){return void 0===this.options.allowDragoverStyling||this.options.allowDragoverStyling}getNodeClone(Z){return this.options.getNodeClone?this.options.getNodeClone(Z):Ee(Object.assign({},Z.data),["id"])}allowDrop(Z,H,Se){return this.options.allowDrop instanceof Function?this.options.allowDrop(Z,H,Se):void 0===this.options.allowDrop||this.options.allowDrop}allowDrag(Z){return this.options.allowDrag instanceof Function?this.options.allowDrag(Z):this.options.allowDrag}nodeClass(Z){return this.options.nodeClass?this.options.nodeClass(Z):""}nodeHeight(Z){if(Z.data.virtual)return 0;let H=this.options.nodeHeight||22;return"function"==typeof H&&(H=H(Z)),H+(0===Z.index?2:1)*this.dropSlotHeight}get dropSlotHeight(){return function Tt(I){return"number"==typeof I||(0,Bl.Z)(I)&&"[object Number]"==(0,al.Z)(I)}(this.options.dropSlotHeight)?this.options.dropSlotHeight:2}}const Kc={toggleExpanded:"toggleExpanded",activate:"activate",deactivate:"deactivate",nodeActivate:"nodeActivate",nodeDeactivate:"nodeDeactivate",select:"select",deselect:"deselect",focus:"focus",blur:"blur",initialized:"initialized",updateData:"updateData",moveNode:"moveNode",copyNode:"copyNode",event:"event",loadNodeChildren:"loadNodeChildren",changeFilter:"changeFilter",stateChange:"stateChange"};var Nc=function(I,Z,H,Se){var Kn,it=arguments.length,Ft=it<3?Z:null===Se?Se=Object.getOwnPropertyDescriptor(Z,H):Se;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)Ft=Reflect.decorate(I,Z,H,Se);else for(var Cr=I.length-1;Cr>=0;Cr--)(Kn=I[Cr])&&(Ft=(it<3?Kn(Ft):it>3?Kn(Z,H,Ft):Kn(Z,H))||Ft);return it>3&&Ft&&Object.defineProperty(Z,H,Ft),Ft},iu=function(I,Z){if("object"==typeof Reflect&&"function"==typeof Reflect.metadata)return Reflect.metadata(I,Z)};let bm=(()=>{class I{constructor(H,Se,it,Ft){this.data=H,this.parent=Se,this.treeModel=it,this.position=0,this.allowDrop=(Kn,Cr)=>this.options.allowDrop(Kn,{parent:this,index:0},Cr),this.allowDragoverStyling=()=>this.options.allowDragoverStyling,null==this.id&&(this.id=function lg(){return Math.floor(1e13*Math.random())}()),this.index=Ft,this.getField("children")&&this._initChildren(),this.autoLoadChildren()}get isHidden(){return this.treeModel.isHidden(this)}get isExpanded(){return this.treeModel.isExpanded(this)}get isActive(){return this.treeModel.isActive(this)}get isFocused(){return this.treeModel.isNodeFocused(this)}get isSelected(){return this.isSelectable()?this.treeModel.isSelected(this):function Ts(I,Z,H){var Se=(0,vc.Z)(I)?Si:Fu;return H&&Ec(I,Z,H)&&(Z=void 0),Se(I,Zf(Z))}(this.children,H=>H.isSelected)}get isAllSelected(){return this.isSelectable()?this.treeModel.isSelected(this):function Cp(I,Z,H){var Se=(0,vc.Z)(I)?ku:Pf;return H&&Ec(I,Z,H)&&(Z=void 0),Se(I,Zf(Z))}(this.children,H=>H.isAllSelected)}get isPartiallySelected(){return this.isSelected&&!this.isAllSelected}get level(){return this.parent?this.parent.level+1:0}get path(){return this.parent?[...this.parent.path,this.id]:[]}get elementRef(){throw"Element Ref is no longer supported since introducing virtual scroll\n\n      You may use a template to obtain a reference to the element"}get originalNode(){return this._originalNode}get hasChildren(){return!!(this.getField("hasChildren")||this.children&&this.children.length>0)}get isCollapsed(){return!this.isExpanded}get isLeaf(){return!this.hasChildren}get isRoot(){return this.parent.data.virtual}get realParent(){return this.isRoot?null:this.parent}get options(){return this.treeModel.options}fireEvent(H){this.treeModel.fireEvent(H)}get displayField(){return this.getField("display")}get id(){return this.getField("id")}set id(H){this.setField("id",H)}getField(H){return this.data[this.options[`${H}Field`]]}setField(H,Se){this.data[this.options[`${H}Field`]]=Se}_findAdjacentSibling(H,Se=!1){const it=this._getParentsChildren(Se),Ft=it.indexOf(this);return it.length>Ft+H?it[Ft+H]:null}findNextSibling(H=!1){return this._findAdjacentSibling(1,H)}findPreviousSibling(H=!1){return this._findAdjacentSibling(-1,H)}getVisibleChildren(){return this.visibleChildren}get visibleChildren(){return(this.children||[]).filter(H=>!H.isHidden)}getFirstChild(H=!1){return qd((H?this.visibleChildren:this.children)||[])}getLastChild(H=!1){return nn((H?this.visibleChildren:this.children)||[])}findNextNode(H=!0,Se=!1){return H&&this.isExpanded&&this.getFirstChild(Se)||this.findNextSibling(Se)||this.parent&&this.parent.findNextNode(!1,Se)}findPreviousNode(H=!1){let Se=this.findPreviousSibling(H);return Se?Se._getLastOpenDescendant(H):this.realParent}_getLastOpenDescendant(H=!1){const Se=this.getLastChild(H);return this.isCollapsed||!Se?this:Se._getLastOpenDescendant(H)}_getParentsChildren(H=!1){return this.parent&&(H?this.parent.getVisibleChildren():this.parent.children)||[]}getIndexInParent(H=!1){return this._getParentsChildren(H).indexOf(this)}isDescendantOf(H){return this===H||this.parent&&this.parent.isDescendantOf(H)}getNodePadding(){return this.options.levelPadding*(this.level-1)+"px"}getClass(){return[this.options.nodeClass(this),`tree-node-level-${this.level}`].join(" ")}onDrop(H){this.mouseAction("drop",H.event,{from:H.element,to:{parent:this,index:0,dropOnNode:!0}})}allowDrag(){return this.options.allowDrag(this)}loadNodeChildren(){return this.options.getChildren?Promise.resolve(this.options.getChildren(this)).then(H=>{H&&(this.setField("children",H),this._initChildren(),this.options.useTriState&&this.treeModel.isSelected(this)&&this.setIsSelected(!0),this.children.forEach(Se=>{Se.getField("isExpanded")&&Se.hasChildren&&Se.expand()}))}).then(()=>{this.fireEvent({eventName:Kc.loadNodeChildren,node:this})}):Promise.resolve()}expand(){return this.isExpanded||this.toggleExpanded(),this}collapse(){return this.isExpanded&&this.toggleExpanded(),this}doForAll(H){Promise.resolve(H(this)).then(()=>{this.children&&this.children.forEach(Se=>Se.doForAll(H))})}expandAll(){this.doForAll(H=>H.expand())}collapseAll(){this.doForAll(H=>H.collapse())}ensureVisible(){return this.realParent&&(this.realParent.expand(),this.realParent.ensureVisible()),this}toggleExpanded(){return this.setIsExpanded(!this.isExpanded),this}setIsExpanded(H){return this.hasChildren&&this.treeModel.setExpandedNode(this,H),this}autoLoadChildren(){this.handler=hs(()=>this.isExpanded,H=>{!this.children&&this.hasChildren&&H&&this.loadNodeChildren()},{fireImmediately:!0})}dispose(){this.children&&this.children.forEach(H=>H.dispose()),this.handler&&this.handler(),this.parent=null,this.children=null}setIsActive(H,Se=!1){return this.treeModel.setActiveNode(this,H,Se),H&&this.focus(this.options.scrollOnActivate),this}isSelectable(){return this.isLeaf||!this.children||!this.options.useTriState}setIsSelected(H){return this.isSelectable()?this.treeModel.setSelectedNode(this,H):this.visibleChildren.forEach(Se=>Se.setIsSelected(H)),this}toggleSelected(){return this.setIsSelected(!this.isSelected),this}toggleActivated(H=!1){return this.setIsActive(!this.isActive,H),this}setActiveAndVisible(H=!1){return this.setIsActive(!0,H).ensureVisible(),setTimeout(this.scrollIntoView.bind(this)),this}scrollIntoView(H=!1){this.treeModel.virtualScroll.scrollIntoView(this,H)}focus(H=!0){let Se=this.treeModel.getFocusedNode();return this.treeModel.setFocusedNode(this),H&&this.scrollIntoView(),Se&&this.fireEvent({eventName:Kc.blur,node:Se}),this.fireEvent({eventName:Kc.focus,node:this}),this}blur(){let H=this.treeModel.getFocusedNode();return this.treeModel.setFocusedNode(null),H&&this.fireEvent({eventName:Kc.blur,node:this}),this}setIsHidden(H){this.treeModel.setIsHidden(this,H)}hide(){this.setIsHidden(!0)}show(){this.setIsHidden(!1)}mouseAction(H,Se,it=null){this.treeModel.setFocus(!0);const Kn=this.options.actionMapping.mouse[H];Kn&&Kn(this.treeModel,this,Se,it)}getSelfHeight(){return this.options.nodeHeight(this)}_initChildren(){this.children=this.getField("children").map((H,Se)=>new I(H,this,this.treeModel,Se))}}return Nc([ri,iu("design:type",Object),iu("design:paramtypes",[])],I.prototype,"isHidden",null),Nc([ri,iu("design:type",Object),iu("design:paramtypes",[])],I.prototype,"isExpanded",null),Nc([ri,iu("design:type",Object),iu("design:paramtypes",[])],I.prototype,"isActive",null),Nc([ri,iu("design:type",Object),iu("design:paramtypes",[])],I.prototype,"isFocused",null),Nc([ri,iu("design:type",Object),iu("design:paramtypes",[])],I.prototype,"isSelected",null),Nc([ri,iu("design:type",Object),iu("design:paramtypes",[])],I.prototype,"isAllSelected",null),Nc([ri,iu("design:type",Object),iu("design:paramtypes",[])],I.prototype,"isPartiallySelected",null),Nc([Zn,iu("design:type",Array)],I.prototype,"children",void 0),Nc([Zn,iu("design:type",Number)],I.prototype,"index",void 0),Nc([Zn,iu("design:type",Object)],I.prototype,"position",void 0),Nc([Zn,iu("design:type",Number)],I.prototype,"height",void 0),Nc([ri,iu("design:type",Number),iu("design:paramtypes",[])],I.prototype,"level",null),Nc([ri,iu("design:type",Array),iu("design:paramtypes",[])],I.prototype,"path",null),Nc([ri,iu("design:type",Object),iu("design:paramtypes",[])],I.prototype,"visibleChildren",null),Nc([ne,iu("design:type",Function),iu("design:paramtypes",[Object]),iu("design:returntype",void 0)],I.prototype,"setIsSelected",null),Nc([ne,iu("design:type",Function),iu("design:paramtypes",[]),iu("design:returntype",void 0)],I.prototype,"_initChildren",null),I})();var Gl=function(I,Z,H,Se){var Kn,it=arguments.length,Ft=it<3?Z:null===Se?Se=Object.getOwnPropertyDescriptor(Z,H):Se;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)Ft=Reflect.decorate(I,Z,H,Se);else for(var Cr=I.length-1;Cr>=0;Cr--)(Kn=I[Cr])&&(Ft=(it<3?Kn(Ft):it>3?Kn(Z,H,Ft):Kn(Z,H))||Ft);return it>3&&Ft&&Object.defineProperty(Z,H,Ft),Ft},Xo=function(I,Z){if("object"==typeof Reflect&&"function"==typeof Reflect.metadata)return Reflect.metadata(I,Z)};let Nl=(()=>{class I{constructor(){this.options=new Em,this.eventNames=Object.keys(Kc),this.expandedNodeIds={},this.selectedLeafNodeIds={},this.activeNodeIds={},this.hiddenNodeIds={},this.focusedNodeId=null,this.firstUpdate=!0,this.subscriptions=[]}fireEvent(H){H.treeModel=this,this.events[H.eventName].emit(H),this.events.event.emit(H)}subscribe(H,Se){const it=this.events[H].subscribe(Se);this.subscriptions.push(it)}getFocusedNode(){return this.focusedNode}getActiveNode(){return this.activeNodes[0]}getActiveNodes(){return this.activeNodes}getVisibleRoots(){return this.virtualRoot.visibleChildren}getFirstRoot(H=!1){return qd(H?this.getVisibleRoots():this.roots)}getLastRoot(H=!1){return nn(H?this.getVisibleRoots():this.roots)}get isFocused(){return I.focusedTree===this}isNodeFocused(H){return this.focusedNode===H}isEmptyTree(){return this.roots&&0===this.roots.length}get focusedNode(){return this.focusedNodeId?this.getNodeById(this.focusedNodeId):null}get expandedNodes(){const H=Object.keys(this.expandedNodeIds).filter(Se=>this.expandedNodeIds[Se]).map(Se=>this.getNodeById(Se));return Gp(H)}get activeNodes(){const H=Object.keys(this.activeNodeIds).filter(Se=>this.activeNodeIds[Se]).map(Se=>this.getNodeById(Se));return Gp(H)}get hiddenNodes(){const H=Object.keys(this.hiddenNodeIds).filter(Se=>this.hiddenNodeIds[Se]).map(Se=>this.getNodeById(Se));return Gp(H)}get selectedLeafNodes(){const H=Object.keys(this.selectedLeafNodeIds).filter(Se=>this.selectedLeafNodeIds[Se]).map(Se=>this.getNodeById(Se));return Gp(H)}getNodeByPath(H,Se=null){if(!H)return null;if(Se=Se||this.virtualRoot,0===H.length)return Se;if(!Se.children)return null;const it=H.shift(),Ft=Ap(Se.children,{id:it});return Ft?this.getNodeByPath(H,Ft):null}getNodeById(H){const Se=H.toString();return this.getNodeBy(it=>it.id.toString()===Se)}getNodeBy(H,Se=null){if(!(Se=Se||this.virtualRoot).children)return null;const it=Ap(Se.children,H);if(it)return it;for(let Ft of Se.children){const Kn=this.getNodeBy(H,Ft);if(Kn)return Kn}}isExpanded(H){return this.expandedNodeIds[H.id]}isHidden(H){return this.hiddenNodeIds[H.id]}isActive(H){return this.activeNodeIds[H.id]}isSelected(H){return this.selectedLeafNodeIds[H.id]}ngOnDestroy(){this.dispose(),this.unsubscribeAll()}dispose(){this.virtualRoot&&this.virtualRoot.dispose()}unsubscribeAll(){this.subscriptions.forEach(H=>H.unsubscribe()),this.subscriptions=[]}setData({nodes:H,options:Se=null,events:it=null}){Se&&(this.options=new Em(Se)),it&&(this.events=it),H&&(this.nodes=H),this.update()}update(){let H={id:this.options.rootId,virtual:!0,[this.options.childrenField]:this.nodes};this.dispose(),this.virtualRoot=new bm(H,null,this,0),this.roots=this.virtualRoot.children,this.firstUpdate?this.roots&&(this.firstUpdate=!1,this._calculateExpandedNodes()):this.fireEvent({eventName:Kc.updateData})}setFocusedNode(H){this.focusedNodeId=H?H.id:null}setFocus(H){I.focusedTree=H?this:null}doForAll(H){this.roots.forEach(Se=>Se.doForAll(H))}focusNextNode(){let H=this.getFocusedNode(),Se=H?H.findNextNode(!0,!0):this.getFirstRoot(!0);Se&&Se.focus()}focusPreviousNode(){let H=this.getFocusedNode(),Se=H?H.findPreviousNode(!0):this.getLastRoot(!0);Se&&Se.focus()}focusDrillDown(){let H=this.getFocusedNode();if(H&&H.isCollapsed&&H.hasChildren)H.toggleExpanded();else{let Se=H?H.getFirstChild(!0):this.getFirstRoot(!0);Se&&Se.focus()}}focusDrillUp(){let H=this.getFocusedNode();if(H)if(H.isExpanded)H.toggleExpanded();else{let Se=H.realParent;Se&&Se.focus()}}setActiveNode(H,Se,it=!1){it?this._setActiveNodeMulti(H,Se):this._setActiveNodeSingle(H,Se),Se?(H.focus(this.options.scrollOnActivate),this.fireEvent({eventName:Kc.activate,node:H}),this.fireEvent({eventName:Kc.nodeActivate,node:H})):(this.fireEvent({eventName:Kc.deactivate,node:H}),this.fireEvent({eventName:Kc.nodeDeactivate,node:H}))}setSelectedNode(H,Se){this.selectedLeafNodeIds=Object.assign({},this.selectedLeafNodeIds,{[H.id]:Se}),Se?(H.focus(),this.fireEvent({eventName:Kc.select,node:H})):this.fireEvent({eventName:Kc.deselect,node:H})}setExpandedNode(H,Se){this.expandedNodeIds=Object.assign({},this.expandedNodeIds,{[H.id]:Se}),this.fireEvent({eventName:Kc.toggleExpanded,node:H,isExpanded:Se})}expandAll(){this.roots.forEach(H=>H.expandAll())}collapseAll(){this.roots.forEach(H=>H.collapseAll())}setIsHidden(H,Se){this.hiddenNodeIds=Object.assign({},this.hiddenNodeIds,{[H.id]:Se})}setHiddenNodeIds(H){this.hiddenNodeIds=H.reduce((Se,it)=>Object.assign(Se,{[it]:!0}),{})}performKeyAction(H,Se){const it=this.options.actionMapping.keys[Se.keyCode];return!!it&&(Se.preventDefault(),it(this,H,Se),!0)}filterNodes(H,Se=!0){let it;if(!H)return this.clearFilter();if(Xf(H))it=Kn=>-1!==Kn.displayField.toLowerCase().indexOf(H.toLowerCase());else{if(!(0,lu.Z)(H))return console.error("Don't know what to do with filter",H),void console.error("Should be either a string or function");it=H}const Ft={};this.roots.forEach(Kn=>this._filterNode(Ft,Kn,it,Se)),this.hiddenNodeIds=Ft,this.fireEvent({eventName:Kc.changeFilter})}clearFilter(){this.hiddenNodeIds={},this.fireEvent({eventName:Kc.changeFilter})}moveNode(H,Se){const it=H.getIndexInParent(),Ft=H.parent;if(!this.canMoveNode(H,Se,it))return;const Kn=Ft.getField("children");Se.parent.getField("children")||Se.parent.setField("children",[]);const Cr=Se.parent.getField("children"),ai=Kn.splice(it,1)[0];let ns=Ft===Se.parent&&Se.index>it?Se.index-1:Se.index;Cr.splice(ns,0,ai),Ft.treeModel.update(),Se.parent.treeModel!==Ft.treeModel&&Se.parent.treeModel.update(),this.fireEvent({eventName:Kc.moveNode,node:ai,to:{parent:Se.parent.data,index:ns},from:{parent:Ft.data,index:it}})}copyNode(H,Se){const it=H.getIndexInParent();if(!this.canMoveNode(H,Se,it))return;Se.parent.getField("children")||Se.parent.setField("children",[]);const Ft=Se.parent.getField("children"),Kn=this.options.getNodeClone(H);Ft.splice(Se.index,0,Kn),H.treeModel.update(),Se.parent.treeModel!==H.treeModel&&Se.parent.treeModel.update(),this.fireEvent({eventName:Kc.copyNode,node:Kn,to:{parent:Se.parent.data,index:Se.index}})}getState(){return{expandedNodeIds:this.expandedNodeIds,selectedLeafNodeIds:this.selectedLeafNodeIds,activeNodeIds:this.activeNodeIds,hiddenNodeIds:this.hiddenNodeIds,focusedNodeId:this.focusedNodeId}}setState(H){!H||Object.assign(this,{expandedNodeIds:H.expandedNodeIds||{},selectedLeafNodeIds:H.selectedLeafNodeIds||{},activeNodeIds:H.activeNodeIds||{},hiddenNodeIds:H.hiddenNodeIds||{},focusedNodeId:H.focusedNodeId})}subscribeToState(H){Kr(()=>H(this.getState()))}canMoveNode(H,Se,it){return it||H.getIndexInParent(),(H.parent!==Se.parent||it!==Se.index)&&!Se.parent.isDescendantOf(H)}calculateExpandedNodes(){this._calculateExpandedNodes()}_filterNode(H,Se,it,Ft){let Kn=it(Se);return Se.children&&Se.children.forEach(Cr=>{this._filterNode(H,Cr,it,Ft)&&(Kn=!0)}),Kn||(H[Se.id]=!0),Ft&&Kn&&Se.ensureVisible(),Kn}_calculateExpandedNodes(H=null){(H=H||this.virtualRoot).data[this.options.isExpandedField]&&(this.expandedNodeIds=Object.assign({},this.expandedNodeIds,{[H.id]:!0})),H.children&&H.children.forEach(Se=>this._calculateExpandedNodes(Se))}_setActiveNodeSingle(H,Se){this.activeNodes.filter(it=>it!==H).forEach(it=>{this.fireEvent({eventName:Kc.deactivate,node:it}),this.fireEvent({eventName:Kc.nodeDeactivate,node:it})}),this.activeNodeIds=Se?{[H.id]:!0}:{}}_setActiveNodeMulti(H,Se){this.activeNodeIds=Object.assign({},this.activeNodeIds,{[H.id]:Se})}}return I.\u0275fac=function(H){return new(H||I)},I.\u0275prov=r.Yz7({token:I,factory:I.\u0275fac}),I.focusedTree=null,I})();Gl([Zn,Xo("design:type",Array)],Nl.prototype,"roots",void 0),Gl([Zn,Xo("design:type",Object)],Nl.prototype,"expandedNodeIds",void 0),Gl([Zn,Xo("design:type",Object)],Nl.prototype,"selectedLeafNodeIds",void 0),Gl([Zn,Xo("design:type",Object)],Nl.prototype,"activeNodeIds",void 0),Gl([Zn,Xo("design:type",Object)],Nl.prototype,"hiddenNodeIds",void 0),Gl([Zn,Xo("design:type",Object)],Nl.prototype,"focusedNodeId",void 0),Gl([Zn,Xo("design:type",bm)],Nl.prototype,"virtualRoot",void 0),Gl([ri,Xo("design:type",Object),Xo("design:paramtypes",[])],Nl.prototype,"focusedNode",null),Gl([ri,Xo("design:type",Object),Xo("design:paramtypes",[])],Nl.prototype,"expandedNodes",null),Gl([ri,Xo("design:type",Object),Xo("design:paramtypes",[])],Nl.prototype,"activeNodes",null),Gl([ri,Xo("design:type",Object),Xo("design:paramtypes",[])],Nl.prototype,"hiddenNodes",null),Gl([ri,Xo("design:type",Object),Xo("design:paramtypes",[])],Nl.prototype,"selectedLeafNodes",null),Gl([ne,Xo("design:type",Function),Xo("design:paramtypes",[Object]),Xo("design:returntype",void 0)],Nl.prototype,"setData",null),Gl([ne,Xo("design:type",Function),Xo("design:paramtypes",[]),Xo("design:returntype",void 0)],Nl.prototype,"update",null),Gl([ne,Xo("design:type",Function),Xo("design:paramtypes",[Object]),Xo("design:returntype",void 0)],Nl.prototype,"setFocusedNode",null),Gl([ne,Xo("design:type",Function),Xo("design:paramtypes",[Object]),Xo("design:returntype",void 0)],Nl.prototype,"setFocus",null),Gl([ne,Xo("design:type",Function),Xo("design:paramtypes",[Object]),Xo("design:returntype",void 0)],Nl.prototype,"doForAll",null),Gl([ne,Xo("design:type",Function),Xo("design:paramtypes",[]),Xo("design:returntype",void 0)],Nl.prototype,"focusNextNode",null),Gl([ne,Xo("design:type",Function),Xo("design:paramtypes",[]),Xo("design:returntype",void 0)],Nl.prototype,"focusPreviousNode",null),Gl([ne,Xo("design:type",Function),Xo("design:paramtypes",[]),Xo("design:returntype",void 0)],Nl.prototype,"focusDrillDown",null),Gl([ne,Xo("design:type",Function),Xo("design:paramtypes",[]),Xo("design:returntype",void 0)],Nl.prototype,"focusDrillUp",null),Gl([ne,Xo("design:type",Function),Xo("design:paramtypes",[Object,Object,Object]),Xo("design:returntype",void 0)],Nl.prototype,"setActiveNode",null),Gl([ne,Xo("design:type",Function),Xo("design:paramtypes",[Object,Object]),Xo("design:returntype",void 0)],Nl.prototype,"setSelectedNode",null),Gl([ne,Xo("design:type",Function),Xo("design:paramtypes",[Object,Object]),Xo("design:returntype",void 0)],Nl.prototype,"setExpandedNode",null),Gl([ne,Xo("design:type",Function),Xo("design:paramtypes",[]),Xo("design:returntype",void 0)],Nl.prototype,"expandAll",null),Gl([ne,Xo("design:type",Function),Xo("design:paramtypes",[]),Xo("design:returntype",void 0)],Nl.prototype,"collapseAll",null),Gl([ne,Xo("design:type",Function),Xo("design:paramtypes",[Object,Object]),Xo("design:returntype",void 0)],Nl.prototype,"setIsHidden",null),Gl([ne,Xo("design:type",Function),Xo("design:paramtypes",[Object]),Xo("design:returntype",void 0)],Nl.prototype,"setHiddenNodeIds",null),Gl([ne,Xo("design:type",Function),Xo("design:paramtypes",[Object,Object]),Xo("design:returntype",void 0)],Nl.prototype,"filterNodes",null),Gl([ne,Xo("design:type",Function),Xo("design:paramtypes",[]),Xo("design:returntype",void 0)],Nl.prototype,"clearFilter",null),Gl([ne,Xo("design:type",Function),Xo("design:paramtypes",[Object,Object]),Xo("design:returntype",void 0)],Nl.prototype,"moveNode",null),Gl([ne,Xo("design:type",Function),Xo("design:paramtypes",[Object,Object]),Xo("design:returntype",void 0)],Nl.prototype,"copyNode",null),Gl([ne,Xo("design:type",Function),Xo("design:paramtypes",[Object]),Xo("design:returntype",void 0)],Nl.prototype,"setState",null);let Wg=(()=>{class I{constructor(){this._draggedElement=null}set(H){this._draggedElement=H}get(){return this._draggedElement}isDragging(){return!!this.get()}}return I.\u0275fac=function(H){return new(H||I)},I.\u0275prov=(0,r.Yz7)({factory:function(){return new I},token:I,providedIn:"root"}),I})();var rf=function(I,Z,H,Se){var Kn,it=arguments.length,Ft=it<3?Z:null===Se?Se=Object.getOwnPropertyDescriptor(Z,H):Se;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)Ft=Reflect.decorate(I,Z,H,Se);else for(var Cr=I.length-1;Cr>=0;Cr--)(Kn=I[Cr])&&(Ft=(it<3?Kn(Ft):it>3?Kn(Z,H,Ft):Kn(Z,H))||Ft);return it>3&&Ft&&Object.defineProperty(Z,H,Ft),Ft},Xc=function(I,Z){if("object"==typeof Reflect&&"function"==typeof Reflect.metadata)return Reflect.metadata(I,Z)};let wp=(()=>{class I{constructor(H){this.treeModel=H,this.yBlocks=0,this.x=0,this.viewportHeight=null,this.viewport=null,H.virtualScroll=this,this._dispose=[Kr(()=>this.fixScroll())]}get y(){return 150*this.yBlocks}get totalHeight(){return this.treeModel.virtualRoot?this.treeModel.virtualRoot.height:0}fireEvent(H){this.treeModel.fireEvent(H)}init(){const H=this.recalcPositions.bind(this);H(),this._dispose=[...this._dispose,hs(()=>this.treeModel.roots,H),hs(()=>this.treeModel.expandedNodeIds,H),hs(()=>this.treeModel.hiddenNodeIds,H)],this.treeModel.subscribe(Kc.loadNodeChildren,H)}isEnabled(){return this.treeModel.options.useVirtualScroll}_setYBlocks(H){this.yBlocks=H}recalcPositions(){this.treeModel.virtualRoot.height=this._getPositionAfter(this.treeModel.getVisibleRoots(),0)}_getPositionAfter(H,Se){let it=Se;return H.forEach(Ft=>{Ft.position=it,it=this._getPositionAfterNode(Ft,it)}),it}_getPositionAfterNode(H,Se){let it=H.getSelfHeight()+Se;return H.children&&H.isExpanded&&(it=this._getPositionAfter(H.visibleChildren,it)),H.height=it-Se,it}clear(){this._dispose.forEach(H=>H())}setViewport(H){Object.assign(this,{viewport:H,x:H.scrollLeft,yBlocks:Math.round(H.scrollTop/150),viewportHeight:H.getBoundingClientRect?H.getBoundingClientRect().height:0})}scrollIntoView(H,Se,it=!0){if(H.options.scrollContainer){const Ft=H.options.scrollContainer,Kn=Ft.getBoundingClientRect().height,Cr=Ft.getBoundingClientRect().top,ai=this.viewport.getBoundingClientRect().top+H.position-Cr;(Se||ai<Ft.scrollTop||ai+H.getSelfHeight()>Ft.scrollTop+Kn)&&(Ft.scrollTop=it?ai-Kn/2:ai)}else(Se||H.position<this.y||H.position+H.getSelfHeight()>this.y+this.viewportHeight)&&this.viewport&&(this.viewport.scrollTop=it?H.position-this.viewportHeight/2:H.position,this._setYBlocks(Math.floor(this.viewport.scrollTop/150)))}getViewportNodes(H){if(!H)return[];const Se=H.filter(ns=>!ns.isHidden);if(!this.isEnabled())return Se;if(!this.viewportHeight||!Se.length)return[];const it=Qg(Se,ns=>ns.position+500>this.y||ns.position+ns.height>this.y),Ft=Qg(Se,ns=>ns.position-500>this.y+this.viewportHeight,it),Kn=[];if(Ft-it>(1e3+this.viewportHeight)/Se[0].treeModel.options.options.nodeHeight)return[];for(let ns=it;ns<=Ft;ns++)Kn.push(Se[ns]);return Kn}fixScroll(){const H=Math.max(0,this.totalHeight-this.viewportHeight);this.y<0&&this._setYBlocks(0),this.y>H&&this._setYBlocks(H/150)}}return I.\u0275fac=function(H){return new(H||I)(r.LFG(Nl))},I.\u0275prov=r.Yz7({token:I,factory:I.\u0275fac}),I})();function Qg(I,Z,H=0){let Se=H,it=I.length-1;for(;Se!==it;){let Ft=Math.floor((Se+it)/2);Z(I[Ft])?it=Ft:Se=Se===Ft?it:Ft}return Se}rf([Zn,Xc("design:type",Object)],wp.prototype,"yBlocks",void 0),rf([Zn,Xc("design:type",Object)],wp.prototype,"x",void 0),rf([Zn,Xc("design:type",Object)],wp.prototype,"viewportHeight",void 0),rf([ri,Xc("design:type",Object),Xc("design:paramtypes",[])],wp.prototype,"y",null),rf([ri,Xc("design:type",Object),Xc("design:paramtypes",[])],wp.prototype,"totalHeight",null),rf([ne,Xc("design:type",Function),Xc("design:paramtypes",[Object]),Xc("design:returntype",void 0)],wp.prototype,"_setYBlocks",null),rf([ne,Xc("design:type",Function),Xc("design:paramtypes",[]),Xc("design:returntype",void 0)],wp.prototype,"recalcPositions",null),rf([ne,Xc("design:type",Function),Xc("design:paramtypes",[Object]),Xc("design:returntype",void 0)],wp.prototype,"setViewport",null),rf([ne,Xc("design:type",Function),Xc("design:paramtypes",[Object,Object,Object]),Xc("design:returntype",void 0)],wp.prototype,"scrollIntoView",null);let sv=(()=>{class I{}return I.\u0275fac=function(H){return new(H||I)},I.\u0275cmp=r.Xpm({type:I,selectors:[["tree-loading-component"]],inputs:{template:"template",node:"node"},decls:2,vars:5,consts:[[4,"ngIf"],[3,"ngTemplateOutlet","ngTemplateOutletContext"]],template:function(H,Se){1&H&&(r.YNc(0,G,2,0,"span",0),r.GkF(1,1)),2&H&&(r.Q6J("ngIf",!Se.template),r.xp6(1),r.Q6J("ngTemplateOutlet",Se.template)("ngTemplateOutletContext",r.VKq(3,Te,Se.node)))},directives:[a.O5,a.tP],encapsulation:2}),I})(),yg=(()=>{class I{constructor(H,Se,it){this.elementRef=H,this.ngZone=Se,this.virtualScroll=it,this.setViewport=M_(()=>{this.virtualScroll.setViewport(this.elementRef.nativeElement)},17),this.scrollEventHandler=this.setViewport.bind(this)}ngOnInit(){this.virtualScroll.init()}ngAfterViewInit(){setTimeout(()=>{this.setViewport(),this.virtualScroll.fireEvent({eventName:Kc.initialized})});let H=this.elementRef.nativeElement;this.ngZone.runOutsideAngular(()=>{H.addEventListener("scroll",this.scrollEventHandler)})}ngOnDestroy(){this.virtualScroll.clear(),this.elementRef.nativeElement.removeEventListener("scroll",this.scrollEventHandler)}getTotalHeight(){return this.virtualScroll.isEnabled()&&this.virtualScroll.totalHeight+"px"||"auto"}}return I.\u0275fac=function(H){return new(H||I)(r.Y36(r.SBq),r.Y36(r.R0b),r.Y36(wp))},I.\u0275cmp=r.Xpm({type:I,selectors:[["tree-viewport"]],features:[r._Bn([wp])],ngContentSelectors:fr,decls:1,vars:2,consts:[[4,"treeMobxAutorun"]],template:function(H,Se){1&H&&(r.F$t(),r.YNc(0,Ge,3,2,"ng-container",0)),2&H&&r.Q6J("treeMobxAutorun",r.DdM(1,an))},directives:[Ur],encapsulation:2}),I})(),ug=(()=>{class I{constructor(H,Se){this.treeModel=H,this.treeDraggedElement=Se,H.eventNames.forEach(it=>this[it]=new r.vpe),H.subscribeToState(it=>this.stateChange.emit(it))}set nodes(H){}set options(H){}set focused(H){this.treeModel.setFocus(H)}set state(H){this.treeModel.setState(H)}onKeydown(H){if(!this.treeModel.isFocused||mg(["input","textarea"],document.activeElement.tagName.toLowerCase()))return;const Se=this.treeModel.getFocusedNode();this.treeModel.performKeyAction(Se,H)}onMousedown(H){(function Se(it,Ft){return!it||it.localName!==Ft&&Se(it.parentElement,Ft)})(H.target,"tree-root")&&this.treeModel.setFocus(!1)}ngOnChanges(H){(H.options||H.nodes)&&this.treeModel.setData({options:H.options&&H.options.currentValue,nodes:H.nodes&&H.nodes.currentValue,events:b(this,this.treeModel.eventNames)})}sizeChanged(){this.viewportComponent.setViewport()}}return I.\u0275fac=function(H){return new(H||I)(r.Y36(Nl),r.Y36(Wg))},I.\u0275cmp=r.Xpm({type:I,selectors:[["Tree"],["tree-root"]],contentQueries:function(H,Se,it){if(1&H&&(r.Suo(it,wr,5),r.Suo(it,ci,5),r.Suo(it,oi,5),r.Suo(it,ts,5)),2&H){let Ft;r.iGM(Ft=r.CRH())&&(Se.loadingTemplate=Ft.first),r.iGM(Ft=r.CRH())&&(Se.treeNodeTemplate=Ft.first),r.iGM(Ft=r.CRH())&&(Se.treeNodeWrapperTemplate=Ft.first),r.iGM(Ft=r.CRH())&&(Se.treeNodeFullTemplate=Ft.first)}},viewQuery:function(H,Se){if(1&H&&r.Gf(Do,5),2&H){let it;r.iGM(it=r.CRH())&&(Se.viewportComponent=it.first)}},hostBindings:function(H,Se){1&H&&r.NdJ("keydown",function(Ft){return Se.onKeydown(Ft)},!1,r.pYS)("mousedown",function(Ft){return Se.onMousedown(Ft)},!1,r.pYS)},inputs:{nodes:"nodes",options:"options",focused:"focused",state:"state"},outputs:{toggleExpanded:"toggleExpanded",activate:"activate",deactivate:"deactivate",nodeActivate:"nodeActivate",nodeDeactivate:"nodeDeactivate",select:"select",deselect:"deselect",focus:"focus",blur:"blur",updateData:"updateData",initialized:"initialized",moveNode:"moveNode",copyNode:"copyNode",loadNodeChildren:"loadNodeChildren",changeFilter:"changeFilter",event:"event",stateChange:"stateChange"},features:[r._Bn([Nl]),r.TTD],decls:5,vars:6,consts:[["viewport",""],[1,"angular-tree-component"],[3,"nodes","treeModel","templates",4,"ngIf"],["class","empty-tree-drop-slot",3,"dropIndex","node",4,"ngIf"],[3,"nodes","treeModel","templates"],[1,"empty-tree-drop-slot",3,"dropIndex","node"]],template:function(H,Se){1&H&&(r.TgZ(0,"tree-viewport",null,0)(2,"div",1),r.YNc(3,Yo,1,8,"tree-node-collection",2),r.YNc(4,ia,1,2,"tree-node-drop-slot",3),r.qZA()()),2&H&&(r.xp6(2),r.ekj("node-dragging",Se.treeDraggedElement.isDragging())("angular-tree-component-rtl",Se.treeModel.options.rtl),r.xp6(1),r.Q6J("ngIf",Se.treeModel.roots),r.xp6(1),r.Q6J("ngIf",Se.treeModel.isEmptyTree()))},directives:function(){return[yg,a.O5,x_,xp]},encapsulation:2}),I})(),A_=(()=>{class I{}return I.\u0275fac=function(H){return new(H||I)},I.\u0275cmp=r.Xpm({type:I,selectors:[["TreeNode"],["tree-node"]],inputs:{node:"node",index:"index",templates:"templates"},decls:1,vars:2,consts:[[4,"treeMobxAutorun"],[3,"class","tree-node","tree-node-expanded","tree-node-collapsed","tree-node-leaf","tree-node-active","tree-node-focused",4,"ngIf"],[3,"ngTemplateOutlet","ngTemplateOutletContext"],[3,"dropIndex","node",4,"ngIf"],[3,"node","index","templates"],[3,"node","templates"],[3,"dropIndex","node"]],template:function(H,Se){1&H&&r.YNc(0,ye,3,8,"ng-container",0),2&H&&r.Q6J("treeMobxAutorun",r.DdM(1,an))},directives:function(){return[Ur,a.O5,xp,Tm,D_,a.tP]},encapsulation:2}),I})(),Eg=(()=>{class I{}return I.\u0275fac=function(H){return new(H||I)},I.\u0275cmp=r.Xpm({type:I,selectors:[["tree-node-content"]],inputs:{node:"node",index:"index",template:"template"},decls:2,vars:7,consts:[[4,"ngIf"],[3,"ngTemplateOutlet","ngTemplateOutletContext"]],template:function(H,Se){1&H&&(r.YNc(0,He,2,1,"span",0),r.GkF(1,1)),2&H&&(r.Q6J("ngIf",!Se.template),r.xp6(1),r.Q6J("ngTemplateOutlet",Se.template)("ngTemplateOutletContext",r.kEZ(3,yt,Se.node,Se.node,Se.index)))},directives:[a.O5,a.tP],encapsulation:2}),I})(),xp=(()=>{class I{onDrop(H){this.node.mouseAction("drop",H.event,{from:H.element,to:{parent:this.node,index:this.dropIndex}})}allowDrop(H,Se){return this.node.options.allowDrop(H,{parent:this.node,index:this.dropIndex},Se)}}return I.\u0275fac=function(H){return new(H||I)},I.\u0275cmp=r.Xpm({type:I,selectors:[["TreeNodeDropSlot"],["tree-node-drop-slot"]],inputs:{node:"node",dropIndex:"dropIndex"},decls:1,vars:2,consts:[[1,"node-drop-slot",3,"treeAllowDrop","allowDragoverStyling","treeDrop"]],template:function(H,Se){1&H&&(r.TgZ(0,"div",0),r.NdJ("treeDrop",function(Ft){return Se.onDrop(Ft)}),r.qZA()),2&H&&r.Q6J("treeAllowDrop",Se.allowDrop.bind(Se))("allowDragoverStyling",!0)},directives:function(){return[tm]},encapsulation:2}),I})(),Y_=(()=>{class I{}return I.\u0275fac=function(H){return new(H||I)},I.\u0275cmp=r.Xpm({type:I,selectors:[["tree-node-expander"]],inputs:{node:"node"},decls:1,vars:2,consts:[[4,"treeMobxAutorun"],["class","toggle-children-wrapper",3,"toggle-children-wrapper-expanded","toggle-children-wrapper-collapsed","click",4,"ngIf"],["class","toggle-children-placeholder",4,"ngIf"],[1,"toggle-children-wrapper",3,"click"],[1,"toggle-children"],[1,"toggle-children-placeholder"]],template:function(H,Se){1&H&&r.YNc(0,nr,3,2,"ng-container",0),2&H&&r.Q6J("treeMobxAutorun",r.DdM(1,an))},directives:[Ur,a.O5],encapsulation:2}),I})(),D_=(()=>{class I{}return I.\u0275fac=function(H){return new(H||I)},I.\u0275cmp=r.Xpm({type:I,selectors:[["tree-node-children"]],inputs:{node:"node",templates:"templates"},decls:1,vars:2,consts:[[4,"treeMobxAutorun"],[3,"tree-children","tree-children-no-padding",4,"treeAnimateOpen","treeAnimateOpenSpeed","treeAnimateOpenAcceleration","treeAnimateOpenEnabled"],[3,"nodes","templates","treeModel",4,"ngIf"],["class","tree-node-loading",3,"padding-left","template","node",4,"ngIf"],[3,"nodes","templates","treeModel"],[1,"tree-node-loading",3,"template","node"]],template:function(H,Se){1&H&&r.YNc(0,po,2,4,"ng-container",0),2&H&&r.Q6J("treeMobxAutorun",r.DdM(1,an))},directives:function(){return[Ur,lv,a.O5,x_,sv]},encapsulation:2}),I})();const Kg=Object.assign(function Sm(...I){return ne(...I)},ne),Sg=Object.assign(function bg(...I){return ri(...I)},ri),j_=Object.assign(function Xg(...I){return Zn(...I)},Zn);var qp=function(I,Z,H,Se){var Kn,it=arguments.length,Ft=it<3?Z:null===Se?Se=Object.getOwnPropertyDescriptor(Z,H):Se;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)Ft=Reflect.decorate(I,Z,H,Se);else for(var Cr=I.length-1;Cr>=0;Cr--)(Kn=I[Cr])&&(Ft=(it<3?Kn(Ft):it>3?Kn(Z,H,Ft):Kn(Z,H))||Ft);return it>3&&Ft&&Object.defineProperty(Z,H,Ft),Ft},w_=function(I,Z){if("object"==typeof Reflect&&"function"==typeof Reflect.metadata)return Reflect.metadata(I,Z)};let x_=(()=>{class I{constructor(){this._dispose=[]}get nodes(){return this._nodes}set nodes(H){this.setNodes(H)}get marginTop(){const H=this.viewportNodes&&this.viewportNodes.length&&this.viewportNodes[0];return(H&&H.parent?H.position-H.parent.position-H.parent.getSelfHeight():0)+"px"}setNodes(H){this._nodes=H}ngOnInit(){this.virtualScroll=this.treeModel.virtualScroll,this._dispose=[hs(()=>this.virtualScroll.getViewportNodes(this.nodes).map(H=>H.index),H=>{this.viewportNodes=H.map(Se=>this.nodes[Se])},{compareStructural:!0,fireImmediately:!0}),hs(()=>this.nodes,H=>{this.viewportNodes=this.virtualScroll.getViewportNodes(H)})]}ngOnDestroy(){this._dispose.forEach(H=>H())}trackNode(H,Se){return Se.id}}return I.\u0275fac=function(H){return new(H||I)},I.\u0275cmp=r.Xpm({type:I,selectors:[["tree-node-collection"]],inputs:{nodes:"nodes",treeModel:"treeModel",templates:"templates"},decls:1,vars:2,consts:[[4,"treeMobxAutorun"],[3,"node","index","templates",4,"ngFor","ngForOf","ngForTrackBy"],[3,"node","index","templates"]],template:function(H,Se){1&H&&r.YNc(0,sa,3,4,"ng-container",0),2&H&&r.Q6J("treeMobxAutorun",r.DdM(1,an))},directives:[Ur,a.sg,A_],encapsulation:2}),I})();qp([j_,w_("design:type",Object)],x_.prototype,"_nodes",void 0),qp([j_,w_("design:type",Array)],x_.prototype,"viewportNodes",void 0),qp([Sg,w_("design:type",String),w_("design:paramtypes",[])],x_.prototype,"marginTop",null),qp([Kg,w_("design:type",Function),w_("design:paramtypes",[Object]),w_("design:returntype",void 0)],x_.prototype,"setNodes",null);let Tm=(()=>{class I{constructor(){}}return I.\u0275fac=function(H){return new(H||I)},I.\u0275cmp=r.Xpm({type:I,selectors:[["tree-node-wrapper"]],inputs:{node:"node",index:"index",templates:"templates"},decls:2,vars:8,consts:[["class","node-wrapper",3,"padding-left",4,"ngIf"],[3,"ngTemplateOutlet","ngTemplateOutletContext"],[1,"node-wrapper"],[3,"node",4,"ngIf"],[3,"node"],[1,"node-content-wrapper",3,"treeAllowDrop","allowDragoverStyling","treeDrag","treeDragEnabled","click","dblclick","mouseover","mouseout","contextmenu","treeDrop","treeDropDragOver","treeDropDragLeave","treeDropDragEnter"],[3,"node","index","template"]],template:function(H,Se){1&H&&(r.YNc(0,zr,5,15,"div",0),r.GkF(1,1)),2&H&&(r.Q6J("ngIf",!Se.templates.treeNodeWrapperTemplate),r.xp6(1),r.Q6J("ngTemplateOutlet",Se.templates.treeNodeWrapperTemplate)("ngTemplateOutletContext",r.l5B(3,B,Se.node,Se.node,Se.index,Se.templates)))},directives:function(){return[a.O5,qg,Y_,av,tm,Eg,a.tP]},encapsulation:2}),I})(),qg=(()=>{class I{}return I.\u0275fac=function(H){return new(H||I)},I.\u0275cmp=r.Xpm({type:I,selectors:[["tree-node-checkbox"]],inputs:{node:"node"},decls:1,vars:2,consts:[[4,"treeMobxAutorun"],["type","checkbox",1,"tree-node-checkbox",3,"checked","indeterminate","click"]],template:function(H,Se){1&H&&r.YNc(0,Rr,2,2,"ng-container",0),2&H&&r.Q6J("treeMobxAutorun",r.DdM(1,an))},directives:[Ur],encapsulation:2}),I})();const em="is-dragging-over",Cm="is-dragging-over-disabled";let tm=(()=>{class I{constructor(H,Se,it,Ft){this.el=H,this.renderer=Se,this.treeDraggedElement=it,this.ngZone=Ft,this.allowDragoverStyling=!0,this.onDropCallback=new r.vpe,this.onDragOverCallback=new r.vpe,this.onDragLeaveCallback=new r.vpe,this.onDragEnterCallback=new r.vpe,this._allowDrop=(Kn,Cr)=>!0,this.dragOverEventHandler=this.onDragOver.bind(this),this.dragEnterEventHandler=this.onDragEnter.bind(this),this.dragLeaveEventHandler=this.onDragLeave.bind(this)}set treeAllowDrop(H){this._allowDrop=H instanceof Function?H:(Se,it)=>H}allowDrop(H){return this._allowDrop(this.treeDraggedElement.get(),H)}ngAfterViewInit(){let H=this.el.nativeElement;this.ngZone.runOutsideAngular(()=>{H.addEventListener("dragover",this.dragOverEventHandler),H.addEventListener("dragenter",this.dragEnterEventHandler),H.addEventListener("dragleave",this.dragLeaveEventHandler)})}ngOnDestroy(){let H=this.el.nativeElement;H.removeEventListener("dragover",this.dragOverEventHandler),H.removeEventListener("dragenter",this.dragEnterEventHandler),H.removeEventListener("dragleave",this.dragLeaveEventHandler)}onDragOver(H){if(!this.allowDrop(H))return this.allowDragoverStyling?this.addDisabledClass():void 0;this.onDragOverCallback.emit({event:H,element:this.treeDraggedElement.get()}),H.preventDefault(),this.allowDragoverStyling&&this.addClass()}onDragEnter(H){!this.allowDrop(H)||(H.preventDefault(),this.onDragEnterCallback.emit({event:H,element:this.treeDraggedElement.get()}))}onDragLeave(H){if(!this.allowDrop(H))return this.allowDragoverStyling?this.removeDisabledClass():void 0;this.onDragLeaveCallback.emit({event:H,element:this.treeDraggedElement.get()}),this.allowDragoverStyling&&this.removeClass()}onDrop(H){!this.allowDrop(H)||(H.preventDefault(),this.onDropCallback.emit({event:H,element:this.treeDraggedElement.get()}),this.allowDragoverStyling&&this.removeClass(),this.treeDraggedElement.set(null))}addClass(){this.renderer.addClass(this.el.nativeElement,em)}removeClass(){this.renderer.removeClass(this.el.nativeElement,em)}addDisabledClass(){this.renderer.addClass(this.el.nativeElement,Cm)}removeDisabledClass(){this.renderer.removeClass(this.el.nativeElement,Cm)}}return I.\u0275fac=function(H){return new(H||I)(r.Y36(r.SBq),r.Y36(r.Qsj),r.Y36(Wg),r.Y36(r.R0b))},I.\u0275dir=r.lG2({type:I,selectors:[["","treeDrop",""]],hostBindings:function(H,Se){1&H&&r.NdJ("drop",function(Ft){return Se.onDrop(Ft)})},inputs:{allowDragoverStyling:"allowDragoverStyling",treeAllowDrop:"treeAllowDrop"},outputs:{onDropCallback:"treeDrop",onDragOverCallback:"treeDropDragOver",onDragLeaveCallback:"treeDropDragLeave",onDragEnterCallback:"treeDropDragEnter"}}),I})(),av=(()=>{class I{constructor(H,Se,it,Ft){this.el=H,this.renderer=Se,this.treeDraggedElement=it,this.ngZone=Ft,this.dragEventHandler=this.onDrag.bind(this)}ngAfterViewInit(){let H=this.el.nativeElement;this.ngZone.runOutsideAngular(()=>{H.addEventListener("drag",this.dragEventHandler)})}ngDoCheck(){this.renderer.setAttribute(this.el.nativeElement,"draggable",this.treeDragEnabled?"true":"false")}ngOnDestroy(){this.el.nativeElement.removeEventListener("drag",this.dragEventHandler)}onDragStart(H){H.dataTransfer.setData("text",H.target.id),this.treeDraggedElement.set(this.draggedElement),this.draggedElement.mouseAction&&this.draggedElement.mouseAction("dragStart",H)}onDrag(H){this.draggedElement.mouseAction&&this.draggedElement.mouseAction("drag",H)}onDragEnd(){this.draggedElement.mouseAction&&this.draggedElement.mouseAction("dragEnd"),this.treeDraggedElement.set(null)}}return I.\u0275fac=function(H){return new(H||I)(r.Y36(r.SBq),r.Y36(r.Qsj),r.Y36(Wg),r.Y36(r.R0b))},I.\u0275dir=r.lG2({type:I,selectors:[["","treeDrag",""]],hostBindings:function(H,Se){1&H&&r.NdJ("dragstart",function(Ft){return Se.onDragStart(Ft)})("dragend",function(){return Se.onDragEnd()})},inputs:{draggedElement:["treeDrag","draggedElement"],treeDragEnabled:"treeDragEnabled"}}),I})(),lv=(()=>{class I{constructor(H,Se,it){this.renderer=H,this.templateRef=Se,this.viewContainerRef=it}set isOpen(H){H?(this._show(),this.isEnabled&&!1===this._isOpen&&this._animateOpen()):this.isEnabled?this._animateClose():this._hide(),this._isOpen=!!H}_show(){this.innerElement||(this.innerElement=this.viewContainerRef.createEmbeddedView(this.templateRef).rootNodes[0])}_hide(){this.viewContainerRef.clear(),this.innerElement=null}_animateOpen(){let H=this.animateSpeed,Se=this.animateAcceleration,it=0;this.renderer.setStyle(this.innerElement,"max-height","0"),setTimeout(()=>{const Ft=setInterval(()=>{if(!this._isOpen||!this.innerElement)return clearInterval(Ft);it+=H;const Kn=Math.round(it);this.renderer.setStyle(this.innerElement,"max-height",`${Kn}px`);const Cr=this.innerElement.getBoundingClientRect?this.innerElement.getBoundingClientRect().height:0;H*=Se,Se*=1.005,Cr<Kn&&(this.renderer.setStyle(this.innerElement,"max-height",null),clearInterval(Ft))},17)})}_animateClose(){if(!this.innerElement)return;let H=this.animateSpeed,Se=this.animateAcceleration,it=this.innerElement.getBoundingClientRect().height;const Ft=setInterval(()=>{if(this._isOpen||!this.innerElement)return clearInterval(Ft);it-=H,this.renderer.setStyle(this.innerElement,"max-height",`${it}px`),H*=Se,Se*=1.005,it<=0&&(this.viewContainerRef.clear(),this.innerElement=null,clearInterval(Ft))},17)}}return I.\u0275fac=function(H){return new(H||I)(r.Y36(r.Qsj),r.Y36(r.Rgc),r.Y36(r.s_b))},I.\u0275dir=r.lG2({type:I,selectors:[["","treeAnimateOpen",""]],inputs:{isOpen:["treeAnimateOpen","isOpen"],animateSpeed:["treeAnimateOpenSpeed","animateSpeed"],animateAcceleration:["treeAnimateOpenAcceleration","animateAcceleration"],isEnabled:["treeAnimateOpenEnabled","isEnabled"]}}),I})(),uv=(()=>{class I{}return I.\u0275fac=function(H){return new(H||I)},I.\u0275mod=r.oAB({type:I}),I.\u0275inj=r.cJS({providers:[],imports:[[a.ez]]}),I})()},84051:(m,S,i)=>{"use strict";i.d(S,{$7:()=>Uo,AR:()=>di,Hg:()=>Zn,Sr:()=>es,dX:()=>Qo,ii:()=>jn,nE:()=>la,vq:()=>dn,xD:()=>Oo});var r=i(89724),a=i(11048),f=i(79765),c=i(22759),e=i(26215),p=i(46782),y=i(64762);const T=["*"];function C(tt,rn){1&tt&&r._UZ(0,"datatable-progress")}function R(tt,rn){if(1&tt&&r._UZ(0,"datatable-summary-row",9),2&tt){const ne=r.oxw(2);r.Q6J("rowHeight",ne.summaryHeight)("offsetX",ne.offsetX)("innerWidth",ne.innerWidth)("rows",ne.rows)("columns",ne.columns)}}function L(tt,rn){if(1&tt){const ne=r.EpF();r.TgZ(0,"datatable-body-row",13),r.NdJ("treeAction",function(){r.CHM(ne);const Lt=r.oxw().$implicit;return r.oxw(2).onTreeAction(Lt)})("activate",function(Lt){r.CHM(ne);const on=r.oxw().index,Kr=r.oxw(2);return r.MAs(2).onActivate(Lt,Kr.indexes.first+on)}),r.qZA()}if(2&tt){const ne=r.oxw().$implicit,Le=r.oxw(2),Lt=r.MAs(2);r.Q6J("isSelected",Lt.getRowSelected(ne))("innerWidth",Le.innerWidth)("offsetX",Le.offsetX)("columns",Le.columns)("rowHeight",Le.getRowHeight(ne))("row",ne)("rowIndex",Le.getRowIndex(ne))("expanded",Le.getRowExpanded(ne))("rowClass",Le.rowClass)("displayCheck",Le.displayCheck)("treeStatus",ne&&ne.treeStatus)}}function z(tt,rn){if(1&tt){const ne=r.EpF();r.TgZ(0,"datatable-body-row",15),r.NdJ("activate",function(Lt){const Kr=r.CHM(ne).index;return r.oxw(4),r.MAs(2).onActivate(Lt,Kr)}),r.qZA()}if(2&tt){const ne=rn.$implicit,Le=r.oxw(2).$implicit,Lt=r.oxw(2),on=r.MAs(2);r.Q6J("isSelected",on.getRowSelected(ne))("innerWidth",Lt.innerWidth)("offsetX",Lt.offsetX)("columns",Lt.columns)("rowHeight",Lt.getRowHeight(ne))("row",ne)("group",Le.value)("rowIndex",Lt.getRowIndex(ne))("expanded",Lt.getRowExpanded(ne))("rowClass",Lt.rowClass)}}function W(tt,rn){if(1&tt&&r.YNc(0,z,1,10,"datatable-body-row",14),2&tt){const ne=r.oxw().$implicit,Le=r.oxw(2);r.Q6J("ngForOf",ne.value)("ngForTrackBy",Le.rowTrackingFn)}}function J(tt,rn){if(1&tt){const ne=r.EpF();r.TgZ(0,"datatable-row-wrapper",10),r.NdJ("rowContextmenu",function(Lt){return r.CHM(ne),r.oxw(2).rowContextmenu.emit(Lt)}),r.YNc(1,L,1,11,"datatable-body-row",11),r.YNc(2,W,1,2,"ng-template",null,12,r.W1O),r.qZA()}if(2&tt){const ne=rn.$implicit,Le=rn.index,Lt=r.MAs(3),on=r.oxw(2);r.Q6J("groupedRows",on.groupedRows)("innerWidth",on.innerWidth)("ngStyle",on.getRowsStyles(ne))("rowDetail",on.rowDetail)("groupHeader",on.groupHeader)("offsetX",on.offsetX)("detailRowHeight",on.getDetailRowHeight(ne&&ne[Le],Le))("row",ne)("expanded",on.getRowExpanded(ne))("rowIndex",on.getRowIndex(ne&&ne[Le])),r.xp6(1),r.Q6J("ngIf",!on.groupedRows)("ngIfElse",Lt)}}function ee(tt,rn){if(1&tt&&r._UZ(0,"datatable-summary-row",16),2&tt){const ne=r.oxw(2);r.Q6J("ngStyle",ne.getBottomSummaryRowStyles())("rowHeight",ne.summaryHeight)("offsetX",ne.offsetX)("innerWidth",ne.innerWidth)("rows",ne.rows)("columns",ne.columns)}}function ce(tt,rn){if(1&tt){const ne=r.EpF();r.TgZ(0,"datatable-scroller",5),r.NdJ("scroll",function(Lt){return r.CHM(ne),r.oxw().onBodyScroll(Lt)}),r.YNc(1,R,1,5,"datatable-summary-row",6),r.YNc(2,J,4,12,"datatable-row-wrapper",7),r.YNc(3,ee,1,6,"datatable-summary-row",8),r.qZA()}if(2&tt){const ne=r.oxw();r.Q6J("scrollbarV",ne.scrollbarV)("scrollbarH",ne.scrollbarH)("scrollHeight",ne.scrollHeight)("scrollWidth",null==ne.columnGroupWidths?null:ne.columnGroupWidths.total),r.xp6(1),r.Q6J("ngIf",ne.summaryRow&&"top"===ne.summaryPosition),r.xp6(1),r.Q6J("ngForOf",ne.temp)("ngForTrackBy",ne.rowTrackingFn),r.xp6(1),r.Q6J("ngIf",ne.summaryRow&&"bottom"===ne.summaryPosition)}}function ie(tt,rn){if(1&tt&&r._UZ(0,"div",17),2&tt){const ne=r.oxw();r.Q6J("innerHTML",ne.emptyMessage,r.oJD)}}function U(tt,rn){if(1&tt){const ne=r.EpF();r.TgZ(0,"datatable-header-cell",4),r.NdJ("resize",function(Lt){const Kr=r.CHM(ne).$implicit;return r.oxw(2).onColumnResized(Lt,Kr)})("longPressStart",function(Lt){return r.CHM(ne),r.oxw(2).onLongPressStart(Lt)})("longPressEnd",function(Lt){return r.CHM(ne),r.oxw(2).onLongPressEnd(Lt)})("sort",function(Lt){return r.CHM(ne),r.oxw(2).onSort(Lt)})("select",function(Lt){return r.CHM(ne),r.oxw(2).select.emit(Lt)})("columnContextmenu",function(Lt){return r.CHM(ne),r.oxw(2).columnContextmenu.emit(Lt)}),r.qZA()}if(2&tt){const ne=rn.$implicit,Le=r.oxw(2);r.Q6J("resizeEnabled",ne.resizeable)("pressModel",ne)("pressEnabled",Le.reorderable&&ne.draggable)("dragX",Le.reorderable&&ne.draggable&&ne.dragging)("dragY",!1)("dragModel",ne)("dragEventTarget",Le.dragEventTarget)("headerHeight",Le.headerHeight)("isTarget",ne.isTarget)("targetMarkerTemplate",Le.targetMarkerTemplate)("targetMarkerContext",ne.targetMarkerContext)("column",ne)("sortType",Le.sortType)("sorts",Le.sorts)("selectionType",Le.selectionType)("sortAscendingIcon",Le.sortAscendingIcon)("sortDescendingIcon",Le.sortDescendingIcon)("sortUnsetIcon",Le.sortUnsetIcon)("allRowsSelected",Le.allRowsSelected)}}function se(tt,rn){if(1&tt&&(r.TgZ(0,"div",2),r.YNc(1,U,1,19,"datatable-header-cell",3),r.qZA()),2&tt){const ne=rn.$implicit,Le=r.oxw();r.Tol("datatable-row-"+ne.type),r.Q6J("ngStyle",Le._styleByGroup[ne.type]),r.xp6(1),r.Q6J("ngForOf",ne.columns)("ngForTrackBy",Le.columnTrackingFn)}}function ge(tt,rn){if(1&tt){const ne=r.EpF();r.TgZ(0,"datatable-header",4),r.NdJ("sort",function(Lt){return r.CHM(ne),r.oxw().onColumnSort(Lt)})("resize",function(Lt){return r.CHM(ne),r.oxw().onColumnResize(Lt)})("reorder",function(Lt){return r.CHM(ne),r.oxw().onColumnReorder(Lt)})("select",function(Lt){return r.CHM(ne),r.oxw().onHeaderSelect(Lt)})("columnContextmenu",function(Lt){return r.CHM(ne),r.oxw().onColumnContextmenu(Lt)}),r.ALo(1,"async"),r.qZA()}if(2&tt){const ne=r.oxw();r.Q6J("sorts",ne.sorts)("sortType",ne.sortType)("scrollbarH",ne.scrollbarH)("innerWidth",ne._innerWidth)("offsetX",r.lcZ(1,15,ne._offsetX))("dealsWithGroup",void 0!==ne.groupedRows)("columns",ne._internalColumns)("headerHeight",ne.headerHeight)("reorderable",ne.reorderable)("targetMarkerTemplate",ne.targetMarkerTemplate)("sortAscendingIcon",ne.cssClasses.sortAscending)("sortDescendingIcon",ne.cssClasses.sortDescending)("sortUnsetIcon",ne.cssClasses.sortUnset)("allRowsSelected",ne.allRowsSelected)("selectionType",ne.selectionType)}}function ae(tt,rn){if(1&tt){const ne=r.EpF();r.TgZ(0,"datatable-footer",5),r.NdJ("page",function(Lt){return r.CHM(ne),r.oxw().onFooterPage(Lt)}),r.qZA()}if(2&tt){const ne=r.oxw();r.Q6J("rowCount",ne.rowCount)("pageSize",ne.pageSize)("offset",ne.offset)("footerHeight",ne.footerHeight)("footerTemplate",ne.footer)("totalMessage",ne.messages.totalMessage)("pagerLeftArrowIcon",ne.cssClasses.pagerLeftArrow)("pagerRightArrowIcon",ne.cssClasses.pagerRightArrow)("pagerPreviousIcon",ne.cssClasses.pagerPrevious)("selectedCount",ne.selected.length)("selectedMessage",!!ne.selectionType&&ne.messages.selectedMessage)("pagerNextIcon",ne.cssClasses.pagerNext)}}function he(tt,rn){}function be(tt,rn){if(1&tt&&r.YNc(0,he,0,0,"ng-template",5),2&tt){const ne=r.oxw();r.Q6J("ngTemplateOutlet",ne.targetMarkerTemplate)("ngTemplateOutletContext",ne.targetMarkerContext)}}function we(tt,rn){if(1&tt){const ne=r.EpF();r.TgZ(0,"label",6)(1,"input",7),r.NdJ("change",function(){r.CHM(ne);const Lt=r.oxw();return Lt.select.emit(!Lt.allRowsSelected)}),r.qZA()()}if(2&tt){const ne=r.oxw();r.xp6(1),r.Q6J("checked",ne.allRowsSelected)}}function ue(tt,rn){if(1&tt){const ne=r.EpF();r.TgZ(0,"span",8)(1,"span",9),r.NdJ("click",function(){return r.CHM(ne),r.oxw().onSort()}),r.qZA()()}if(2&tt){const ne=r.oxw();r.xp6(1),r.Q6J("innerHTML",ne.name,r.oJD)}}function st(tt,rn){}function We(tt,rn){if(1&tt&&r.YNc(0,st,0,0,"ng-template",5),2&tt){const ne=r.oxw();r.Q6J("ngTemplateOutlet",ne.column.headerTemplate)("ngTemplateOutletContext",ne.cellContext)}}function Ve(tt,rn){}const Be=function(tt,rn,ne,Le,Lt){return{rowCount:tt,pageSize:rn,selectedCount:ne,curPage:Le,offset:Lt}};function xe(tt,rn){if(1&tt&&r.YNc(0,Ve,0,0,"ng-template",4),2&tt){const ne=r.oxw();r.Q6J("ngTemplateOutlet",ne.footerTemplate.template)("ngTemplateOutletContext",r.qbA(2,Be,ne.rowCount,ne.pageSize,ne.selectedCount,ne.curPage,ne.offset))}}function je(tt,rn){if(1&tt&&(r.TgZ(0,"span"),r._uU(1),r.qZA()),2&tt){const ne=r.oxw(2);r.xp6(1),r.AsE(" ",null==ne.selectedCount?null:ne.selectedCount.toLocaleString()," ",ne.selectedMessage," / ")}}function Ne(tt,rn){if(1&tt&&(r.TgZ(0,"div",5),r.YNc(1,je,2,2,"span",1),r._uU(2),r.qZA()),2&tt){const ne=r.oxw();r.xp6(1),r.Q6J("ngIf",ne.selectedMessage),r.xp6(1),r.AsE(" ",null==ne.rowCount?null:ne.rowCount.toLocaleString()," ",ne.totalMessage," ")}}function Bt(tt,rn){if(1&tt){const ne=r.EpF();r.TgZ(0,"datatable-pager",6),r.NdJ("change",function(Lt){return r.CHM(ne),r.oxw().page.emit(Lt)}),r.qZA()}if(2&tt){const ne=r.oxw();r.Q6J("pagerLeftArrowIcon",ne.pagerLeftArrowIcon)("pagerRightArrowIcon",ne.pagerRightArrowIcon)("pagerPreviousIcon",ne.pagerPreviousIcon)("pagerNextIcon",ne.pagerNextIcon)("page",ne.curPage)("size",ne.pageSize)("count",ne.rowCount)("hidden",!ne.isVisible)}}const rt=function(tt){return{"selected-count":tt}};function en(tt,rn){if(1&tt){const ne=r.EpF();r.TgZ(0,"li",6)(1,"a",7),r.NdJ("click",function(){const on=r.CHM(ne).$implicit;return r.oxw().selectPage(on.number)}),r._uU(2),r.qZA()()}if(2&tt){const ne=rn.$implicit,Le=r.oxw();r.ekj("active",ne.number===Le.page),r.uIk("aria-label","page "+ne.number),r.xp6(2),r.hij(" ",ne.text," ")}}function Pt(tt,rn){if(1&tt){const ne=r.EpF();r.TgZ(0,"datatable-body-cell",3),r.NdJ("activate",function(Lt){const Kr=r.CHM(ne).index;return r.oxw(2).onActivate(Lt,Kr)})("treeAction",function(){return r.CHM(ne),r.oxw(2).onTreeAction()}),r.qZA()}if(2&tt){const ne=rn.$implicit,Le=r.oxw(2);r.Q6J("row",Le.row)("group",Le.group)("expanded",Le.expanded)("isSelected",Le.isSelected)("rowIndex",Le.rowIndex)("column",ne)("rowHeight",Le.rowHeight)("displayCheck",Le.displayCheck)("treeStatus",Le.treeStatus)}}function Vt(tt,rn){if(1&tt&&(r.TgZ(0,"div",1),r.YNc(1,Pt,1,9,"datatable-body-cell",2),r.qZA()),2&tt){const ne=rn.$implicit,Le=r.oxw();r.Gre("datatable-row-",ne.type," datatable-row-group"),r.Q6J("ngStyle",Le._groupStyles[ne.type]),r.xp6(1),r.Q6J("ngForOf",ne.columns)("ngForTrackBy",Le.columnTrackingFn)}}function hn(tt,rn){}function vn(tt,rn){if(1&tt&&r.YNc(0,hn,0,0,"ng-template",4),2&tt){const ne=r.oxw(2);r.Q6J("ngTemplateOutlet",ne.groupHeader.template)("ngTemplateOutletContext",ne.groupContext)}}function mt(tt,rn){if(1&tt&&(r.TgZ(0,"div",3),r.YNc(1,vn,1,2,null,1),r.qZA()),2&tt){const ne=r.oxw();r.Q6J("ngStyle",ne.getGroupHeaderStyle()),r.xp6(1),r.Q6J("ngIf",ne.groupHeader&&ne.groupHeader.template)}}function Nt(tt,rn){1&tt&&r.Hsn(0,0,["*ngIf","(groupHeader && groupHeader.template && expanded) || !groupHeader || !groupHeader.template"])}function St(tt,rn){}function Yt(tt,rn){if(1&tt&&r.YNc(0,St,0,0,"ng-template",4),2&tt){const ne=r.oxw(2);r.Q6J("ngTemplateOutlet",ne.rowDetail.template)("ngTemplateOutletContext",ne.rowContext)}}function Fn(tt,rn){if(1&tt&&(r.TgZ(0,"div",5),r.YNc(1,Yt,1,2,null,1),r.qZA()),2&tt){const ne=r.oxw();r.Udp("height",ne.detailRowHeight,"px"),r.xp6(1),r.Q6J("ngIf",ne.rowDetail&&ne.rowDetail.template)}}const pr=["cellTemplate"];function Ei(tt,rn){if(1&tt){const ne=r.EpF();r.TgZ(0,"label",4)(1,"input",5),r.NdJ("click",function(Lt){return r.CHM(ne),r.oxw().onCheckboxChange(Lt)}),r.qZA()()}if(2&tt){const ne=r.oxw();r.xp6(1),r.Q6J("checked",ne.isSelected)}}function mi(tt,rn){1&tt&&r._UZ(0,"i",11)}function ur(tt,rn){1&tt&&r._UZ(0,"i",12)}function $r(tt,rn){1&tt&&r._UZ(0,"i",13)}function Br(tt,rn){if(1&tt){const ne=r.EpF();r.TgZ(0,"button",7),r.NdJ("click",function(){return r.CHM(ne),r.oxw(2).onTreeAction()}),r.TgZ(1,"span"),r.YNc(2,mi,1,0,"i",8),r.YNc(3,ur,1,0,"i",9),r.YNc(4,$r,1,0,"i",10),r.qZA()()}if(2&tt){const ne=r.oxw(2);r.Q6J("disabled","disabled"===ne.treeStatus),r.xp6(2),r.Q6J("ngIf","loading"===ne.treeStatus),r.xp6(1),r.Q6J("ngIf","collapsed"===ne.treeStatus),r.xp6(1),r.Q6J("ngIf","expanded"===ne.treeStatus||"disabled"===ne.treeStatus)}}function Pn(tt,rn){}const Xn=function(tt){return{cellContext:tt}};function dr(tt,rn){if(1&tt&&r.YNc(0,Pn,0,0,"ng-template",14),2&tt){const ne=r.oxw(2);r.Q6J("ngTemplateOutlet",ne.column.treeToggleTemplate)("ngTemplateOutletContext",r.VKq(2,Xn,ne.cellContext))}}function Qr(tt,rn){if(1&tt&&(r.ynx(0),r.YNc(1,Br,5,4,"button",6),r.YNc(2,dr,1,4,null,2),r.BQk()),2&tt){const ne=r.oxw();r.xp6(1),r.Q6J("ngIf",!ne.column.treeToggleTemplate),r.xp6(1),r.Q6J("ngIf",ne.column.treeToggleTemplate)}}function Ci(tt,rn){if(1&tt&&r._UZ(0,"span",15),2&tt){const ne=r.oxw();r.Q6J("title",ne.sanitizedValue)("innerHTML",ne.value,r.oJD)}}function _i(tt,rn){}function so(tt,rn){if(1&tt&&r.YNc(0,_i,0,0,"ng-template",14,16,r.W1O),2&tt){const ne=r.oxw();r.Q6J("ngTemplateOutlet",ne.column.cellTemplate)("ngTemplateOutletContext",ne.cellContext)}}function Ro(tt,rn){if(1&tt&&r._UZ(0,"datatable-body-row",1),2&tt){const ne=r.oxw();r.Q6J("innerWidth",ne.innerWidth)("offsetX",ne.offsetX)("columns",ne._internalColumns)("rowHeight",ne.rowHeight)("row",ne.summaryRow)("rowIndex",-1)}}let Sr=(()=>{class tt{constructor(ne){this.document=ne,this.width=this.getWidth()}getWidth(){const ne=this.document.createElement("div");ne.style.visibility="hidden",ne.style.width="100px",ne.style.msOverflowStyle="scrollbar",this.document.body.appendChild(ne);const Le=ne.offsetWidth;ne.style.overflow="scroll";const Lt=this.document.createElement("div");Lt.style.width="100%",ne.appendChild(Lt);const on=Lt.offsetWidth;return ne.parentNode.removeChild(ne),Le-on}}return tt.\u0275fac=function(ne){return new(ne||tt)(r.LFG(a.K0))},tt.\u0275prov=r.Yz7({token:tt,factory:tt.\u0275fac}),tt})(),Kt=(()=>{class tt{getDimensions(ne){return ne.getBoundingClientRect()}}return tt.\u0275fac=function(ne){return new(ne||tt)},tt.\u0275prov=r.Yz7({token:tt,factory:tt.\u0275fac}),tt})(),un=(()=>{class tt{constructor(){this.columnInputChanges=new f.xQ}get columnInputChanges$(){return this.columnInputChanges.asObservable()}onInputChange(){this.columnInputChanges.next()}}return tt.\u0275fac=function(ne){return new(ne||tt)},tt.\u0275prov=r.Yz7({token:tt,factory:tt.\u0275fac}),tt})(),jn=(()=>{class tt{constructor(ne){this.template=ne}}return tt.\u0275fac=function(ne){return new(ne||tt)(r.Y36(r.Rgc))},tt.\u0275dir=r.lG2({type:tt,selectors:[["","ngx-datatable-footer-template",""]]}),tt})(),Jn=(()=>{class tt{constructor(ne,Le){this.element=ne,this.zone=Le,this.isVisible=!1,this.visible=new r.vpe}ngOnInit(){this.runCheck()}ngOnDestroy(){clearTimeout(this.timeout)}onVisibilityChange(){this.zone.run(()=>{this.isVisible=!0,this.visible.emit(!0)})}runCheck(){const ne=()=>{const{offsetHeight:Le,offsetWidth:Lt}=this.element.nativeElement;Le&&Lt?(clearTimeout(this.timeout),this.onVisibilityChange()):(clearTimeout(this.timeout),this.zone.runOutsideAngular(()=>{this.timeout=setTimeout(()=>ne(),50)}))};this.timeout=setTimeout(()=>ne())}}return tt.\u0275fac=function(ne){return new(ne||tt)(r.Y36(r.SBq),r.Y36(r.R0b))},tt.\u0275dir=r.lG2({type:tt,selectors:[["","visibilityObserver",""]],hostVars:2,hostBindings:function(ne,Le){2&ne&&r.ekj("visible",Le.isVisible)},outputs:{visible:"visible"}}),tt})(),Gn=(()=>{class tt{constructor(ne){this.dragX=!0,this.dragY=!0,this.dragStart=new r.vpe,this.dragging=new r.vpe,this.dragEnd=new r.vpe,this.isDragging=!1,this.element=ne.nativeElement}ngOnChanges(ne){ne.dragEventTarget&&ne.dragEventTarget.currentValue&&this.dragModel.dragging&&this.onMousedown(ne.dragEventTarget.currentValue)}ngOnDestroy(){this._destroySubscription()}onMouseup(ne){!this.isDragging||(this.isDragging=!1,this.element.classList.remove("dragging"),this.subscription&&(this._destroySubscription(),this.dragEnd.emit({event:ne,element:this.element,model:this.dragModel})))}onMousedown(ne){if(ne.target.classList.contains("draggable")&&(this.dragX||this.dragY)){ne.preventDefault(),this.isDragging=!0;const Lt={x:ne.clientX,y:ne.clientY},on=(0,c.R)(document,"mouseup");this.subscription=on.subscribe(bi=>this.onMouseup(bi));const Kr=(0,c.R)(document,"mousemove").pipe((0,p.R)(on)).subscribe(bi=>this.move(bi,Lt));this.subscription.add(Kr),this.dragStart.emit({event:ne,element:this.element,model:this.dragModel})}}move(ne,Le){if(!this.isDragging)return;const on=ne.clientY-Le.y;this.dragX&&(this.element.style.left=ne.clientX-Le.x+"px"),this.dragY&&(this.element.style.top=`${on}px`),this.element.classList.add("dragging"),this.dragging.emit({event:ne,element:this.element,model:this.dragModel})}_destroySubscription(){this.subscription&&(this.subscription.unsubscribe(),this.subscription=void 0)}}return tt.\u0275fac=function(ne){return new(ne||tt)(r.Y36(r.SBq))},tt.\u0275dir=r.lG2({type:tt,selectors:[["","draggable",""]],inputs:{dragX:"dragX",dragY:"dragY",dragEventTarget:"dragEventTarget",dragModel:"dragModel"},outputs:{dragStart:"dragStart",dragging:"dragging",dragEnd:"dragEnd"},features:[r.TTD]}),tt})(),Xr=(()=>{class tt{constructor(ne,Le){this.renderer=Le,this.resizeEnabled=!0,this.resize=new r.vpe,this.resizing=!1,this.element=ne.nativeElement}ngAfterViewInit(){const ne=this.renderer;this.resizeHandle=ne.createElement("span"),ne.addClass(this.resizeHandle,this.resizeEnabled?"resize-handle":"resize-handle--not-resizable"),ne.appendChild(this.element,this.resizeHandle)}ngOnDestroy(){this._destroySubscription(),this.renderer.destroyNode?this.renderer.destroyNode(this.resizeHandle):this.resizeHandle&&this.renderer.removeChild(this.renderer.parentNode(this.resizeHandle),this.resizeHandle)}onMouseup(){this.resizing=!1,this.subscription&&!this.subscription.closed&&(this._destroySubscription(),this.resize.emit(this.element.clientWidth))}onMousedown(ne){const Le=ne.target.classList.contains("resize-handle"),Lt=this.element.clientWidth,on=ne.screenX;if(Le){ne.stopPropagation(),this.resizing=!0;const Kr=(0,c.R)(document,"mouseup");this.subscription=Kr.subscribe(Ii=>this.onMouseup());const bi=(0,c.R)(document,"mousemove").pipe((0,p.R)(Kr)).subscribe(Ii=>this.move(Ii,Lt,on));this.subscription.add(bi)}}move(ne,Le,Lt){const Kr=Le+(ne.screenX-Lt);(!this.minWidth||Kr>=this.minWidth)&&(!this.maxWidth||Kr<=this.maxWidth)&&(this.element.style.width=`${Kr}px`)}_destroySubscription(){this.subscription&&(this.subscription.unsubscribe(),this.subscription=void 0)}}return tt.\u0275fac=function(ne){return new(ne||tt)(r.Y36(r.SBq),r.Y36(r.Qsj))},tt.\u0275dir=r.lG2({type:tt,selectors:[["","resizeable",""]],hostVars:2,hostBindings:function(ne,Le){1&ne&&r.NdJ("mousedown",function(on){return Le.onMousedown(on)}),2&ne&&r.ekj("resizeable",Le.resizeEnabled)},inputs:{resizeEnabled:"resizeEnabled",minWidth:"minWidth",maxWidth:"maxWidth"},outputs:{resize:"resize"}}),tt})(),Zi=(()=>{class tt{constructor(ne,Le){this.document=Le,this.reorder=new r.vpe,this.targetChanged=new r.vpe,this.differ=ne.find({}).create()}ngAfterContentInit(){this.updateSubscriptions(),this.draggables.changes.subscribe(this.updateSubscriptions.bind(this))}ngOnDestroy(){this.draggables.forEach(ne=>{ne.dragStart.unsubscribe(),ne.dragging.unsubscribe(),ne.dragEnd.unsubscribe()})}updateSubscriptions(){const ne=this.differ.diff(this.createMapDiffs());if(ne){const Le=({currentValue:on,previousValue:Kr})=>{Lt({previousValue:Kr}),on&&(on.dragStart.subscribe(this.onDragStart.bind(this)),on.dragging.subscribe(this.onDragging.bind(this)),on.dragEnd.subscribe(this.onDragEnd.bind(this)))},Lt=({previousValue:on})=>{on&&(on.dragStart.unsubscribe(),on.dragging.unsubscribe(),on.dragEnd.unsubscribe())};ne.forEachAddedItem(Le),ne.forEachRemovedItem(Lt)}}onDragStart(){this.positions={};let ne=0;for(const Le of this.draggables.toArray()){const Lt=Le.element,on=parseInt(Lt.offsetLeft.toString(),0);this.positions[Le.dragModel.prop]={left:on,right:on+parseInt(Lt.offsetWidth.toString(),0),index:ne++,element:Lt}}}onDragging({model:Le,event:Lt}){const on=this.positions[Le.prop],Kr=this.isTarget(Le,Lt);Kr?this.lastDraggingIndex!==Kr.i&&(this.targetChanged.emit({prevIndex:this.lastDraggingIndex,newIndex:Kr.i,initialIndex:on.index}),this.lastDraggingIndex=Kr.i):this.lastDraggingIndex!==on.index&&(this.targetChanged.emit({prevIndex:this.lastDraggingIndex,initialIndex:on.index}),this.lastDraggingIndex=on.index)}onDragEnd({element:ne,model:Le,event:Lt}){const on=this.positions[Le.prop],Kr=this.isTarget(Le,Lt);Kr&&this.reorder.emit({prevIndex:on.index,newIndex:Kr.i,model:Le}),this.lastDraggingIndex=void 0,ne.style.left="auto"}isTarget(ne,Le){let Lt=0;const bi=this.document.elementsFromPoint(Le.x||Le.clientX,Le.y||Le.clientY);for(const Ii in this.positions){const hs=this.positions[Ii];if(ne.prop!==Ii&&bi.find(zo=>zo===hs.element))return{pos:hs,i:Lt};Lt++}}createMapDiffs(){return this.draggables.toArray().reduce((ne,Le)=>(ne[Le.dragModel.$$id]=Le,ne),{})}}return tt.\u0275fac=function(ne){return new(ne||tt)(r.Y36(r.aQg),r.Y36(a.K0))},tt.\u0275dir=r.lG2({type:tt,selectors:[["","orderable",""]],contentQueries:function(ne,Le,Lt){if(1&ne&&r.Suo(Lt,Gn,5),2&ne){let on;r.iGM(on=r.CRH())&&(Le.draggables=on)}},outputs:{reorder:"reorder",targetChanged:"targetChanged"}}),tt})(),ii=(()=>{class tt{constructor(){this.pressEnabled=!0,this.duration=500,this.longPressStart=new r.vpe,this.longPressing=new r.vpe,this.longPressEnd=new r.vpe,this.mouseX=0,this.mouseY=0}get press(){return this.pressing}get isLongPress(){return this.isLongPressing}onMouseDown(ne){if(1!==ne.which||!this.pressEnabled||ne.target.classList.contains("resize-handle"))return;this.mouseX=ne.clientX,this.mouseY=ne.clientY,this.pressing=!0,this.isLongPressing=!1;const Lt=(0,c.R)(document,"mouseup");this.subscription=Lt.subscribe(on=>this.onMouseup()),this.timeout=setTimeout(()=>{this.isLongPressing=!0,this.longPressStart.emit({event:ne,model:this.pressModel}),this.subscription.add((0,c.R)(document,"mousemove").pipe((0,p.R)(Lt)).subscribe(on=>this.onMouseMove(on))),this.loop(ne)},this.duration),this.loop(ne)}onMouseMove(ne){if(this.pressing&&!this.isLongPressing){const Le=Math.abs(ne.clientX-this.mouseX)>10,Lt=Math.abs(ne.clientY-this.mouseY)>10;(Le||Lt)&&this.endPress()}}loop(ne){this.isLongPressing&&(this.timeout=setTimeout(()=>{this.longPressing.emit({event:ne,model:this.pressModel}),this.loop(ne)},50))}endPress(){clearTimeout(this.timeout),this.isLongPressing=!1,this.pressing=!1,this._destroySubscription(),this.longPressEnd.emit({model:this.pressModel})}onMouseup(){this.endPress()}ngOnDestroy(){this._destroySubscription()}_destroySubscription(){this.subscription&&(this.subscription.unsubscribe(),this.subscription=void 0)}}return tt.\u0275fac=function(ne){return new(ne||tt)},tt.\u0275dir=r.lG2({type:tt,selectors:[["","long-press",""]],hostVars:4,hostBindings:function(ne,Le){1&ne&&r.NdJ("mousedown",function(on){return Le.onMouseDown(on)}),2&ne&&r.ekj("press",Le.press)("longpress",Le.isLongPress)},inputs:{pressEnabled:"pressEnabled",duration:"duration",pressModel:"pressModel"},outputs:{longPressStart:"longPressStart",longPressing:"longPressing",longPressEnd:"longPressEnd"}}),tt})(),hr=(()=>{class tt{constructor(ne,Le,Lt){this.ngZone=ne,this.renderer=Lt,this.scrollbarV=!1,this.scrollbarH=!1,this.scroll=new r.vpe,this.scrollYPos=0,this.scrollXPos=0,this.prevScrollYPos=0,this.prevScrollXPos=0,this._scrollEventListener=null,this.element=Le.nativeElement}ngOnInit(){if(this.scrollbarV||this.scrollbarH){const ne=this.renderer;this.parentElement=ne.parentNode(ne.parentNode(this.element)),this._scrollEventListener=this.onScrolled.bind(this),this.parentElement.addEventListener("scroll",this._scrollEventListener)}}ngOnDestroy(){this._scrollEventListener&&(this.parentElement.removeEventListener("scroll",this._scrollEventListener),this._scrollEventListener=null)}setOffset(ne){this.parentElement&&(this.parentElement.scrollTop=ne)}onScrolled(ne){const Le=ne.currentTarget;requestAnimationFrame(()=>{this.scrollYPos=Le.scrollTop,this.scrollXPos=Le.scrollLeft,this.updateOffset()})}updateOffset(){let ne;this.scrollYPos<this.prevScrollYPos?ne="down":this.scrollYPos>this.prevScrollYPos&&(ne="up"),this.scroll.emit({direction:ne,scrollYPos:this.scrollYPos,scrollXPos:this.scrollXPos}),this.prevScrollYPos=this.scrollYPos,this.prevScrollXPos=this.scrollXPos}}return tt.\u0275fac=function(ne){return new(ne||tt)(r.Y36(r.R0b),r.Y36(r.SBq),r.Y36(r.Qsj))},tt.\u0275cmp=r.Xpm({type:tt,selectors:[["datatable-scroller"]],hostAttrs:[1,"datatable-scroll"],hostVars:4,hostBindings:function(ne,Le){2&ne&&r.Udp("height",Le.scrollHeight,"px")("width",Le.scrollWidth,"px")},inputs:{scrollbarV:"scrollbarV",scrollbarH:"scrollbarH",scrollHeight:"scrollHeight",scrollWidth:"scrollWidth"},outputs:{scroll:"scroll"},ngContentSelectors:T,decls:1,vars:0,template:function(ne,Le){1&ne&&(r.F$t(),r.Hsn(0))},encapsulation:2,changeDetection:0}),tt})(),Ki=(()=>{class tt{constructor(ne){this.template=ne}}return tt.\u0275fac=function(ne){return new(ne||tt)(r.Y36(r.Rgc))},tt.\u0275dir=r.lG2({type:tt,selectors:[["","ngx-datatable-group-header-template",""]]}),tt})(),ln=(()=>{class tt{constructor(){this.rowHeight=0,this.toggle=new r.vpe}get template(){return this._templateInput||this._templateQuery}toggleExpandGroup(ne){this.toggle.emit({type:"group",value:ne})}expandAllGroups(){this.toggle.emit({type:"all",value:!0})}collapseAllGroups(){this.toggle.emit({type:"all",value:!1})}}return tt.\u0275fac=function(ne){return new(ne||tt)},tt.\u0275dir=r.lG2({type:tt,selectors:[["ngx-datatable-group-header"]],contentQueries:function(ne,Le,Lt){if(1&ne&&r.Suo(Lt,Ki,7,r.Rgc),2&ne){let on;r.iGM(on=r.CRH())&&(Le._templateQuery=on.first)}},inputs:{rowHeight:"rowHeight",_templateInput:["template","_templateInput"]},outputs:{toggle:"toggle"}}),tt})();function Mn(){return""}function Zn(tt){return null==tt?Mn:"number"==typeof tt?cn:-1!==tt.indexOf(".")?Or:Sn}function cn(tt,rn){if(null==tt)return"";if(!tt||null==rn)return tt;const ne=tt[rn];return null==ne?"":ne}function Sn(tt,rn){if(null==tt)return"";if(!tt||!rn)return tt;const ne=tt[rn];return null==ne?"":ne}function Or(tt,rn){if(null==tt)return"";if(!tt||!rn)return tt;let ne=tt[rn];if(void 0!==ne)return ne;ne=tt;const Le=rn.split(".");if(Le.length)for(let Lt=0;Lt<Le.length;Lt++)if(ne=ne[Le[Lt]],null==ne)return"";return ne}function ri(tt){return tt&&(rn=>Zn(tt)(rn,tt))}function vi(tt,rn,ne){if(rn&&ne){const Le={},Lt=tt.length;let on=null;Le[0]=new Ui;const Kr=tt.reduce((Ii,hs)=>{const zo=ne(hs);return-1===Ii.indexOf(zo)&&Ii.push(zo),Ii},[]);for(let Ii=0;Ii<Lt;Ii++)Le[ne(tt[Ii])]=new Ui(tt[Ii]);for(let Ii=0;Ii<Lt;Ii++){on=Le[ne(tt[Ii])];let hs=0;const zo=rn(on.row);!!zo&&Kr.indexOf(zo)>-1&&(hs=zo),on.parent=Le[hs],on.row.level=on.parent.row.level+1,on.parent.children.push(on)}let bi=[];return Le[0].flatten(function(){bi=[...bi,this.row]},!0),bi}return tt}class Ui{constructor(rn=null){rn||(rn={level:-1,treeStatus:"expanded"}),this.row=rn,this.parent=null,this.children=[]}flatten(rn,ne){if("expanded"===this.row.treeStatus)for(let Le=0,Lt=this.children.length;Le<Lt;Le++){const on=this.children[Le];rn.apply(on,Array.prototype.slice.call(arguments,2)),ne&&on.flatten.apply(on,arguments)}}}function ao(tt){return(tt=(tt=(tt=tt.replace(/[^a-zA-Z0-9 ]/g," ")).replace(/([a-z](?=[A-Z]))/g,"$1 ")).replace(/([^a-zA-Z0-9 ])|^[0-9]+/g,"").trim().toLowerCase()).replace(/([ 0-9]+)([a-zA-Z])/g,function(rn,ne,Le){return ne.trim()+Le.toUpperCase()})}function dt(tt){return tt.replace(/([A-Z])/g,rn=>` ${rn}`).replace(/^./,rn=>rn.toUpperCase())}function to(tt){if(!tt)return;let rn=!1;for(const ne of tt)ne.$$id||(ne.$$id=("0000"+(Math.random()*Math.pow(36,4)<<0).toString(36)).slice(-4)),Gt(ne.prop)&&ne.name&&(ne.prop=ao(ne.name)),ne.$$valueGetter||(ne.$$valueGetter=Zn(ne.prop)),!Gt(ne.prop)&&Gt(ne.name)&&(ne.name=dt(String(ne.prop))),Gt(ne.prop)&&Gt(ne.name)&&(ne.name=""),ne.hasOwnProperty("resizeable")||(ne.resizeable=!0),ne.hasOwnProperty("sortable")||(ne.sortable=!0),ne.hasOwnProperty("draggable")||(ne.draggable=!0),ne.hasOwnProperty("canAutoResize")||(ne.canAutoResize=!0),ne.hasOwnProperty("width")||(ne.width=150),ne.hasOwnProperty("isTreeColumn")&&ne.isTreeColumn&&!rn?rn=!0:ne.isTreeColumn=!1}function Gt(tt){return null==tt}var _t=(()=>{return(tt=_t||(_t={})).standard="standard",tt.flex="flex",tt.force="force",_t;var tt})(),Rt=(()=>{return(tt=Rt||(Rt={})).single="single",tt.multi="multi",tt.multiClick="multiClick",tt.cell="cell",tt.checkbox="checkbox",Rt;var tt})(),ct=(()=>{return(tt=ct||(ct={})).single="single",tt.multi="multi",ct;var tt})(),pt=(()=>{return(tt=pt||(pt={})).header="header",tt.body="body",pt;var tt})();let kt=(()=>{class tt{constructor(ne){this.template=ne}}return tt.\u0275fac=function(ne){return new(ne||tt)(r.Y36(r.Rgc))},tt.\u0275dir=r.lG2({type:tt,selectors:[["","ngx-datatable-header-template",""]]}),tt})(),dn=(()=>{class tt{constructor(ne){this.template=ne}}return tt.\u0275fac=function(ne){return new(ne||tt)(r.Y36(r.Rgc))},tt.\u0275dir=r.lG2({type:tt,selectors:[["","ngx-datatable-cell-template",""]]}),tt})(),mr=(()=>{class tt{constructor(ne){this.template=ne}}return tt.\u0275fac=function(ne){return new(ne||tt)(r.Y36(r.Rgc))},tt.\u0275dir=r.lG2({type:tt,selectors:[["","ngx-datatable-tree-toggle",""]]}),tt})(),Oi=(()=>{class tt{constructor(ne){this.columnChangesService=ne,this.isFirstChange=!0}get cellTemplate(){return this._cellTemplateInput||this._cellTemplateQuery}get headerTemplate(){return this._headerTemplateInput||this._headerTemplateQuery}get treeToggleTemplate(){return this._treeToggleTemplateInput||this._treeToggleTemplateQuery}ngOnChanges(){this.isFirstChange?this.isFirstChange=!1:this.columnChangesService.onInputChange()}}return tt.\u0275fac=function(ne){return new(ne||tt)(r.Y36(un))},tt.\u0275dir=r.lG2({type:tt,selectors:[["ngx-datatable-column"]],contentQueries:function(ne,Le,Lt){if(1&ne&&(r.Suo(Lt,dn,7,r.Rgc),r.Suo(Lt,kt,7,r.Rgc),r.Suo(Lt,mr,7,r.Rgc)),2&ne){let on;r.iGM(on=r.CRH())&&(Le._cellTemplateQuery=on.first),r.iGM(on=r.CRH())&&(Le._headerTemplateQuery=on.first),r.iGM(on=r.CRH())&&(Le._treeToggleTemplateQuery=on.first)}},inputs:{name:"name",prop:"prop",frozenLeft:"frozenLeft",frozenRight:"frozenRight",flexGrow:"flexGrow",resizeable:"resizeable",comparator:"comparator",pipe:"pipe",sortable:"sortable",draggable:"draggable",canAutoResize:"canAutoResize",minWidth:"minWidth",width:"width",maxWidth:"maxWidth",checkboxable:"checkboxable",headerCheckboxable:"headerCheckboxable",headerClass:"headerClass",cellClass:"cellClass",isTreeColumn:"isTreeColumn",treeLevelIndent:"treeLevelIndent",summaryFunc:"summaryFunc",summaryTemplate:"summaryTemplate",_cellTemplateInput:["cellTemplate","_cellTemplateInput"],_headerTemplateInput:["headerTemplate","_headerTemplateInput"],_treeToggleTemplateInput:["treeToggleTemplate","_treeToggleTemplateInput"]},features:[r.TTD]}),tt})(),di=(()=>{class tt{constructor(ne){this.template=ne}}return tt.\u0275fac=function(ne){return new(ne||tt)(r.Y36(r.Rgc))},tt.\u0275dir=r.lG2({type:tt,selectors:[["","ngx-datatable-row-detail-template",""]]}),tt})(),Uo=(()=>{class tt{constructor(){this.rowHeight=0,this.toggle=new r.vpe}get template(){return this._templateInput||this._templateQuery}toggleExpandRow(ne){this.toggle.emit({type:"row",value:ne})}expandAllRows(){this.toggle.emit({type:"all",value:!0})}collapseAllRows(){this.toggle.emit({type:"all",value:!1})}}return tt.\u0275fac=function(ne){return new(ne||tt)},tt.\u0275dir=r.lG2({type:tt,selectors:[["ngx-datatable-row-detail"]],contentQueries:function(ne,Le,Lt){if(1&ne&&r.Suo(Lt,di,7,r.Rgc),2&ne){let on;r.iGM(on=r.CRH())&&(Le._templateQuery=on.first)}},inputs:{rowHeight:"rowHeight",_templateInput:["template","_templateInput"]},outputs:{toggle:"toggle"}}),tt})(),Qo=(()=>{class tt{get template(){return this._templateInput||this._templateQuery}}return tt.\u0275fac=function(ne){return new(ne||tt)},tt.\u0275dir=r.lG2({type:tt,selectors:[["ngx-datatable-footer"]],contentQueries:function(ne,Le,Lt){if(1&ne&&r.Suo(Lt,jn,5,r.Rgc),2&ne){let on;r.iGM(on=r.CRH())&&(Le._templateQuery=on.first)}},inputs:{footerHeight:"footerHeight",totalMessage:"totalMessage",selectedMessage:"selectedMessage",pagerLeftArrowIcon:"pagerLeftArrowIcon",pagerRightArrowIcon:"pagerRightArrowIcon",pagerPreviousIcon:"pagerPreviousIcon",pagerNextIcon:"pagerNextIcon",_templateInput:["template","_templateInput"]}}),tt})();function lo(tt){const rn={left:[],center:[],right:[]};if(tt)for(const ne of tt)ne.frozenLeft?rn.left.push(ne):ne.frozenRight?rn.right.push(ne):rn.center.push(ne);return rn}function Ai(tt,rn){return{left:Fo(tt.left),center:Fo(tt.center),right:Fo(tt.right),total:Math.floor(Fo(rn))}}function Fo(tt,rn){let ne=0;if(tt)for(const Le of tt)ne+=parseFloat(rn&&Le[rn]?Le[rn]:Le.width);return ne}function qn(tt){const rn=[],ne=lo(tt);return rn.push({type:"left",columns:ne.left}),rn.push({type:"center",columns:ne.center}),rn.push({type:"right",columns:ne.right}),rn}class ei{constructor(){this.treeArray=[]}clearCache(){this.treeArray=[]}initCache(rn){const{rows:ne,rowHeight:Le,detailRowHeight:Lt,externalVirtual:on,rowCount:Kr,rowIndexes:bi,rowExpansions:Ii}=rn,hs="function"==typeof Le,zo="function"==typeof Lt;if(!hs&&isNaN(Le))throw new Error(`Row Height cache initialization failed. Please ensure that 'rowHeight' is a\n        valid number or function value: (${Le}) when 'scrollbarV' is enabled.`);if(!zo&&isNaN(Lt))throw new Error(`Row Height cache initialization failed. Please ensure that 'detailRowHeight' is a\n        valid number or function value: (${Lt}) when 'scrollbarV' is enabled.`);const Ls=on?Kr:ne.length;this.treeArray=new Array(Ls);for(let Xs=0;Xs<Ls;++Xs)this.treeArray[Xs]=0;for(let Xs=0;Xs<Ls;++Xs){const vl=ne[Xs];let ol=Le;hs&&(ol=Le(vl));const Wl=Ii.has(vl);vl&&Wl&&(ol+=zo?Lt(vl,bi.get(vl)):Lt),this.update(Xs,ol)}}getRowIndex(rn){return 0===rn?0:this.calcRowIndex(rn)}update(rn,ne){if(!this.treeArray.length)throw new Error(`Update at index ${rn} with value ${ne} failed:\n        Row Height cache not initialized.`);const Le=this.treeArray.length;for(rn|=0;rn<Le;)this.treeArray[rn]+=ne,rn|=rn+1}query(rn){if(!this.treeArray.length)throw new Error(`query at index ${rn} failed: Fenwick tree array not initialized.`);let ne=0;for(rn|=0;rn>=0;)ne+=this.treeArray[rn],rn=(rn&rn+1)-1;return ne}queryBetween(rn,ne){return this.query(ne)-this.query(rn-1)}calcRowIndex(rn){if(!this.treeArray.length)return 0;let ne=-1;const Le=this.treeArray.length;for(let on=Math.pow(2,Le.toString(2).length-1);0!==on;on>>=1){const Kr=ne+on;Kr<Le&&rn>=this.treeArray[Kr]&&(rn-=this.treeArray[Kr],ne=Kr)}return ne+1}}const wn={},Qn="undefined"!=typeof document?document.createElement("div").style:void 0,oo=function(){const tt="undefined"!=typeof window?window.getComputedStyle(document.documentElement,""):void 0,rn=void 0!==tt?Array.prototype.slice.call(tt).join("").match(/-(moz|webkit|ms)-/):null,ne=null!==rn?rn[1]:void 0,Le=void 0!==ne?"WebKit|Moz|MS|O".match(new RegExp("("+ne+")","i"))[1]:void 0;return Le?{dom:Le,lowercase:ne,css:`-${ne}-`,js:ne[0].toUpperCase()+ne.substr(1)}:void 0}();function Li(tt){const rn=ao(tt);return wn[rn]||(void 0!==oo&&void 0!==Qn[oo.css+tt]?wn[rn]=oo.css+tt:void 0!==Qn[tt]&&(wn[rn]=tt)),wn[rn]}const yo="undefined"!=typeof window?Li("transform"):void 0,go="undefined"!=typeof window?Li("backfaceVisibility"):void 0,Go="undefined"!=typeof window?!!Li("transform"):void 0,ua="undefined"!=typeof window?!!Li("perspective"):void 0,er="undefined"!=typeof window?window.navigator.userAgent:"Chrome",vr=/Safari\//.test(er)&&!/Chrome\//.test(er);function yr(tt,rn,ne){void 0!==yo&&Go?!vr&&ua?(tt[yo]=`translate3d(${rn}px, ${ne}px, 0)`,tt[go]="hidden"):tt[ao(yo)]=`translate(${rn}px, ${ne}px)`:(tt.top=`${ne}px`,tt.left=`${rn}px`)}let or=(()=>{class tt{constructor(ne){this.cd=ne,this.selected=[],this.scroll=new r.vpe,this.page=new r.vpe,this.activate=new r.vpe,this.select=new r.vpe,this.detailToggle=new r.vpe,this.rowContextmenu=new r.vpe(!1),this.treeAction=new r.vpe,this.rowHeightsCache=new ei,this.temp=[],this.offsetY=0,this.indexes={},this.rowIndexes=new WeakMap,this.rowExpansions=[],this.getDetailRowHeight=(Le,Lt)=>{if(!this.rowDetail)return 0;const on=this.rowDetail.rowHeight;return"function"==typeof on?on(Le,Lt):on},this.rowTrackingFn=(Le,Lt)=>{const on=this.getRowIndex(Lt);return this.trackByProp?Lt[this.trackByProp]:on}}set pageSize(ne){this._pageSize=ne,this.recalcLayout()}get pageSize(){return this._pageSize}set rows(ne){this._rows=ne,this.recalcLayout()}get rows(){return this._rows}set columns(ne){this._columns=ne;const Le=lo(ne);this.columnGroupWidths=Ai(Le,ne)}get columns(){return this._columns}set offset(ne){this._offset=ne,(!this.scrollbarV||this.scrollbarV&&!this.virtualization)&&this.recalcLayout()}get offset(){return this._offset}set rowCount(ne){this._rowCount=ne,this.recalcLayout()}get rowCount(){return this._rowCount}get bodyWidth(){return this.scrollbarH?this.innerWidth+"px":"100%"}set bodyHeight(ne){this._bodyHeight=this.scrollbarV?ne+"px":"auto",this.recalcLayout()}get bodyHeight(){return this._bodyHeight}get selectEnabled(){return!!this.selectionType}get scrollHeight(){if(this.scrollbarV&&this.virtualization&&this.rowCount)return this.rowHeightsCache.query(this.rowCount-1)}ngOnInit(){this.rowDetail&&(this.listener=this.rowDetail.toggle.subscribe(({type:ne,value:Le})=>{"row"===ne&&this.toggleRowExpansion(Le),"all"===ne&&this.toggleAllRows(Le),this.updateIndexes(),this.updateRows(),this.cd.markForCheck()})),this.groupHeader&&(this.listener=this.groupHeader.toggle.subscribe(({type:ne,value:Le})=>{"group"===ne&&this.toggleRowExpansion(Le),"all"===ne&&this.toggleAllRows(Le),this.updateIndexes(),this.updateRows(),this.cd.markForCheck()}))}ngOnDestroy(){(this.rowDetail||this.groupHeader)&&this.listener.unsubscribe()}updateOffsetY(ne){this.scroller&&(this.scrollbarV&&this.virtualization&&ne?ne=this.rowHeightsCache.query(this.pageSize*ne-1):this.scrollbarV&&!this.virtualization&&(ne=0),this.scroller.setOffset(ne||0))}onBodyScroll(ne){const Le=ne.scrollYPos,Lt=ne.scrollXPos;(this.offsetY!==Le||this.offsetX!==Lt)&&this.scroll.emit({offsetY:Le,offsetX:Lt}),this.offsetY=Le,this.offsetX=Lt,this.updateIndexes(),this.updatePage(ne.direction),this.updateRows()}updatePage(ne){let Le=this.indexes.first/this.pageSize;"up"===ne?Le=Math.ceil(Le):"down"===ne&&(Le=Math.floor(Le)),void 0!==ne&&!isNaN(Le)&&this.page.emit({offset:Le})}updateRows(){const{first:ne,last:Le}=this.indexes;let Lt=ne,on=0;const Kr=[];if(this.groupedRows){let bi=3;for(1===this.groupedRows.length&&(bi=this.groupedRows[0].value.length);Lt<Le&&Lt<this.groupedRows.length;){const Ii=this.groupedRows[Lt];this.rowIndexes.set(Ii,Lt),Ii.value&&Ii.value.forEach((hs,zo)=>{this.rowIndexes.set(hs,`${Lt}-${zo}`)}),Kr[on]=Ii,on++,Lt++}}else for(;Lt<Le&&Lt<this.rowCount;){const bi=this.rows[Lt];bi&&(this.rowIndexes.set(bi,Lt),Kr[on]=bi),on++,Lt++}this.temp=Kr}getRowHeight(ne){return"function"==typeof this.rowHeight?this.rowHeight(ne):this.rowHeight}getGroupHeight(ne){let Le=0;if(ne.value)for(let Lt=0;Lt<ne.value.length;Lt++)Le+=this.getRowAndDetailHeight(ne.value[Lt]);return Le}getRowAndDetailHeight(ne){let Le=this.getRowHeight(ne);return this.getRowExpanded(ne)&&(Le+=this.getDetailRowHeight(ne)),Le}getRowsStyles(ne){const Le={};if(this.groupedRows&&(Le.width=this.columnGroupWidths.total),this.scrollbarV&&this.virtualization){let Lt=0;if(this.groupedRows){const Kr=ne[ne.length-1];Lt=Kr?this.getRowIndex(Kr):0}else Lt=this.getRowIndex(ne);yr(Le,0,this.rowHeightsCache.query(Lt-1))}return Le}getBottomSummaryRowStyles(){if(!this.scrollbarV||!this.rows||!this.rows.length)return null;const ne={position:"absolute"};return yr(ne,0,this.rowHeightsCache.query(this.rows.length-1)),ne}hideIndicator(){setTimeout(()=>this.loadingIndicator=!1,500)}updateIndexes(){let ne=0,Le=0;if(this.scrollbarV)if(this.virtualization){const Lt=parseInt(this.bodyHeight,0);ne=this.rowHeightsCache.getRowIndex(this.offsetY),Le=this.rowHeightsCache.getRowIndex(Lt+this.offsetY)+1}else ne=0,Le=this.rowCount;else this.externalPaging||(ne=Math.max(this.offset*this.pageSize,0)),Le=Math.min(ne+this.pageSize,this.rowCount);this.indexes={first:ne,last:Le}}refreshRowHeightCache(){if(this.scrollbarV&&(!this.scrollbarV||this.virtualization)&&(this.rowHeightsCache.clearCache(),this.rows&&this.rows.length)){const ne=new Set;for(const Le of this.rows)this.getRowExpanded(Le)&&ne.add(Le);this.rowHeightsCache.initCache({rows:this.rows,rowHeight:this.rowHeight,detailRowHeight:this.getDetailRowHeight,externalVirtual:this.scrollbarV&&this.externalPaging,rowCount:this.rowCount,rowIndexes:this.rowIndexes,rowExpansions:ne})}}getAdjustedViewPortIndex(){const ne=this.indexes.first;return this.scrollbarV&&this.virtualization&&this.rowHeightsCache.query(ne-1)<=this.offsetY?ne-1:ne}toggleRowExpansion(ne){const Le=this.getAdjustedViewPortIndex(),Lt=this.getRowExpandedIdx(ne,this.rowExpansions),on=Lt>-1;if(this.scrollbarV&&this.virtualization){const Kr=this.getDetailRowHeight(ne)*(on?-1:1),bi=this.getRowIndex(ne);this.rowHeightsCache.update(bi,Kr)}on?this.rowExpansions.splice(Lt,1):this.rowExpansions.push(ne),this.detailToggle.emit({rows:[ne],currentIndex:Le})}toggleAllRows(ne){this.rowExpansions=[];const Le=this.getAdjustedViewPortIndex();if(ne)for(const Lt of this.rows)this.rowExpansions.push(Lt);this.scrollbarV&&this.recalcLayout(),this.detailToggle.emit({rows:this.rows,currentIndex:Le})}recalcLayout(){this.refreshRowHeightCache(),this.updateIndexes(),this.updateRows()}columnTrackingFn(ne,Le){return Le.$$id}stylesByGroup(ne){const Le=this.columnGroupWidths,Lt=this.offsetX,on={width:`${Le[ne]}px`};if("left"===ne)yr(on,Lt,0);else if("right"===ne){const Kr=parseInt(this.innerWidth+"",0);yr(on,-1*(Le.total-Kr-Lt),0)}return on}getRowExpanded(ne){if(0===this.rowExpansions.length&&this.groupExpansionDefault)for(const Le of this.groupedRows)this.rowExpansions.push(Le);return this.getRowExpandedIdx(ne,this.rowExpansions)>-1}getRowExpandedIdx(ne,Le){if(!Le||!Le.length)return-1;const Lt=this.rowIdentity(ne);return Le.findIndex(on=>this.rowIdentity(on)===Lt)}getRowIndex(ne){return this.rowIndexes.get(ne)||0}onTreeAction(ne){this.treeAction.emit({row:ne})}}return tt.\u0275fac=function(ne){return new(ne||tt)(r.Y36(r.sBO))},tt.\u0275cmp=r.Xpm({type:tt,selectors:[["datatable-body"]],viewQuery:function(ne,Le){if(1&ne&&r.Gf(hr,5),2&ne){let Lt;r.iGM(Lt=r.CRH())&&(Le.scroller=Lt.first)}},hostAttrs:[1,"datatable-body"],hostVars:4,hostBindings:function(ne,Le){2&ne&&r.Udp("width",Le.bodyWidth)("height",Le.bodyHeight)},inputs:{selected:"selected",pageSize:"pageSize",rows:"rows",columns:"columns",offset:"offset",rowCount:"rowCount",bodyHeight:"bodyHeight",offsetX:"offsetX",loadingIndicator:"loadingIndicator",scrollbarV:"scrollbarV",scrollbarH:"scrollbarH",externalPaging:"externalPaging",rowHeight:"rowHeight",emptyMessage:"emptyMessage",selectionType:"selectionType",rowIdentity:"rowIdentity",rowDetail:"rowDetail",groupHeader:"groupHeader",selectCheck:"selectCheck",displayCheck:"displayCheck",trackByProp:"trackByProp",rowClass:"rowClass",groupedRows:"groupedRows",groupExpansionDefault:"groupExpansionDefault",innerWidth:"innerWidth",groupRowsBy:"groupRowsBy",virtualization:"virtualization",summaryRow:"summaryRow",summaryPosition:"summaryPosition",summaryHeight:"summaryHeight"},outputs:{scroll:"scroll",page:"page",activate:"activate",select:"select",detailToggle:"detailToggle",rowContextmenu:"rowContextmenu",treeAction:"treeAction"},decls:5,vars:9,consts:[[4,"ngIf"],[3,"selected","rows","selectCheck","selectEnabled","selectionType","rowIdentity","select","activate"],["selector",""],[3,"scrollbarV","scrollbarH","scrollHeight","scrollWidth","scroll",4,"ngIf"],["class","empty-row",3,"innerHTML",4,"ngIf"],[3,"scrollbarV","scrollbarH","scrollHeight","scrollWidth","scroll"],[3,"rowHeight","offsetX","innerWidth","rows","columns",4,"ngIf"],[3,"groupedRows","innerWidth","ngStyle","rowDetail","groupHeader","offsetX","detailRowHeight","row","expanded","rowIndex","rowContextmenu",4,"ngFor","ngForOf","ngForTrackBy"],[3,"ngStyle","rowHeight","offsetX","innerWidth","rows","columns",4,"ngIf"],[3,"rowHeight","offsetX","innerWidth","rows","columns"],[3,"groupedRows","innerWidth","ngStyle","rowDetail","groupHeader","offsetX","detailRowHeight","row","expanded","rowIndex","rowContextmenu"],["tabindex","-1",3,"isSelected","innerWidth","offsetX","columns","rowHeight","row","rowIndex","expanded","rowClass","displayCheck","treeStatus","treeAction","activate",4,"ngIf","ngIfElse"],["groupedRowsTemplate",""],["tabindex","-1",3,"isSelected","innerWidth","offsetX","columns","rowHeight","row","rowIndex","expanded","rowClass","displayCheck","treeStatus","treeAction","activate"],["tabindex","-1",3,"isSelected","innerWidth","offsetX","columns","rowHeight","row","group","rowIndex","expanded","rowClass","activate",4,"ngFor","ngForOf","ngForTrackBy"],["tabindex","-1",3,"isSelected","innerWidth","offsetX","columns","rowHeight","row","group","rowIndex","expanded","rowClass","activate"],[3,"ngStyle","rowHeight","offsetX","innerWidth","rows","columns"],[1,"empty-row",3,"innerHTML"]],template:function(ne,Le){1&ne&&(r.YNc(0,C,1,0,"datatable-progress",0),r.TgZ(1,"datatable-selection",1,2),r.NdJ("select",function(on){return Le.select.emit(on)})("activate",function(on){return Le.activate.emit(on)}),r.YNc(3,ce,4,8,"datatable-scroller",3),r.YNc(4,ie,1,1,"div",4),r.qZA()),2&ne&&(r.Q6J("ngIf",Le.loadingIndicator),r.xp6(1),r.Q6J("selected",Le.selected)("rows",Le.rows)("selectCheck",Le.selectCheck)("selectEnabled",Le.selectEnabled)("selectionType",Le.selectionType)("rowIdentity",Le.rowIdentity),r.xp6(2),r.Q6J("ngIf",null==Le.rows?null:Le.rows.length),r.xp6(1),r.Q6J("ngIf",!(null!=Le.rows&&Le.rows.length||Le.loadingIndicator)))},directives:function(){return[a.O5,ml,ko,hr,ps,a.sg,Za,a.PC,vs]},encapsulation:2,changeDetection:0}),tt})(),si=(()=>{class tt{constructor(ne){this.cd=ne,this.sort=new r.vpe,this.reorder=new r.vpe,this.resize=new r.vpe,this.select=new r.vpe,this.columnContextmenu=new r.vpe(!1),this._columnGroupWidths={total:100},this._styleByGroup={left:{},center:{},right:{}},this.destroyed=!1}set innerWidth(ne){this._innerWidth=ne,setTimeout(()=>{if(this._columns){const Le=lo(this._columns);this._columnGroupWidths=Ai(Le,this._columns),this.setStylesByGroup()}})}get innerWidth(){return this._innerWidth}set headerHeight(ne){this._headerHeight="auto"!==ne?`${ne}px`:ne}get headerHeight(){return this._headerHeight}set columns(ne){this._columns=ne;const Le=lo(ne);this._columnsByPin=qn(ne),setTimeout(()=>{this._columnGroupWidths=Ai(Le,ne),this.setStylesByGroup()})}get columns(){return this._columns}set offsetX(ne){this._offsetX=ne,this.setStylesByGroup()}get offsetX(){return this._offsetX}ngOnDestroy(){this.destroyed=!0}onLongPressStart({event:ne,model:Le}){Le.dragging=!0,this.dragEventTarget=ne}onLongPressEnd({event:ne,model:Le}){this.dragEventTarget=ne,setTimeout(()=>{const Lt=this._columns.find(on=>on.$$id===Le.$$id);Lt&&(Lt.dragging=!1)},5)}get headerWidth(){return this.scrollbarH?this.innerWidth+"px":"100%"}trackByGroups(ne,Le){return Le.type}columnTrackingFn(ne,Le){return Le.$$id}onColumnResized(ne,Le){ne<=Le.minWidth?ne=Le.minWidth:ne>=Le.maxWidth&&(ne=Le.maxWidth),this.resize.emit({column:Le,prevValue:Le.width,newValue:ne})}onColumnReordered({prevIndex:ne,newIndex:Le,model:Lt}){const on=this.getColumn(Le);on.isTarget=!1,on.targetMarkerContext=void 0,this.reorder.emit({column:Lt,prevValue:ne,newValue:Le})}onTargetChanged({prevIndex:ne,newIndex:Le,initialIndex:Lt}){if(ne||0===ne){const on=this.getColumn(ne);on.isTarget=!1,on.targetMarkerContext=void 0}if(Le||0===Le){const on=this.getColumn(Le);on.isTarget=!0,Lt!==Le&&(on.targetMarkerContext={class:"targetMarker ".concat(Lt>Le?"dragFromRight":"dragFromLeft")})}}getColumn(ne){const Le=this._columnsByPin[0].columns.length;if(ne<Le)return this._columnsByPin[0].columns[ne];const Lt=this._columnsByPin[1].columns.length;return ne<Le+Lt?this._columnsByPin[1].columns[ne-Le]:this._columnsByPin[2].columns[ne-Le-Lt]}onSort({column:ne,prevValue:Le,newValue:Lt}){if(ne.dragging)return;const on=this.calcNewSorts(ne,Le,Lt);this.sort.emit({sorts:on,column:ne,prevValue:Le,newValue:Lt})}calcNewSorts(ne,Le,Lt){let on=0;this.sorts||(this.sorts=[]);const Kr=this.sorts.map((bi,Ii)=>((bi=Object.assign({},bi)).prop===ne.prop&&(on=Ii),bi));return void 0===Lt?Kr.splice(on,1):Le?Kr[on].dir=Lt:(this.sortType===ct.single&&Kr.splice(0,this.sorts.length),Kr.push({dir:Lt,prop:ne.prop})),Kr}setStylesByGroup(){this._styleByGroup.left=this.calcStylesByGroup("left"),this._styleByGroup.center=this.calcStylesByGroup("center"),this._styleByGroup.right=this.calcStylesByGroup("right"),this.destroyed||this.cd.detectChanges()}calcStylesByGroup(ne){const Le=this._columnGroupWidths,on={width:`${Le[ne]}px`};return"center"===ne?yr(on,-1*this.offsetX,0):"right"===ne&&yr(on,-1*(Le.total-this.innerWidth),0),on}}return tt.\u0275fac=function(ne){return new(ne||tt)(r.Y36(r.sBO))},tt.\u0275cmp=r.Xpm({type:tt,selectors:[["datatable-header"]],hostAttrs:[1,"datatable-header"],hostVars:4,hostBindings:function(ne,Le){2&ne&&r.Udp("height",Le.headerHeight)("width",Le.headerWidth)},inputs:{innerWidth:"innerWidth",headerHeight:"headerHeight",columns:"columns",offsetX:"offsetX",sorts:"sorts",sortAscendingIcon:"sortAscendingIcon",sortDescendingIcon:"sortDescendingIcon",sortUnsetIcon:"sortUnsetIcon",scrollbarH:"scrollbarH",dealsWithGroup:"dealsWithGroup",targetMarkerTemplate:"targetMarkerTemplate",sortType:"sortType",allRowsSelected:"allRowsSelected",selectionType:"selectionType",reorderable:"reorderable"},outputs:{sort:"sort",reorder:"reorder",resize:"resize",select:"select",columnContextmenu:"columnContextmenu"},decls:2,vars:4,consts:[["orderable","",1,"datatable-header-inner",3,"reorder","targetChanged"],[3,"class","ngStyle",4,"ngFor","ngForOf","ngForTrackBy"],[3,"ngStyle"],["resizeable","","long-press","","draggable","",3,"resizeEnabled","pressModel","pressEnabled","dragX","dragY","dragModel","dragEventTarget","headerHeight","isTarget","targetMarkerTemplate","targetMarkerContext","column","sortType","sorts","selectionType","sortAscendingIcon","sortDescendingIcon","sortUnsetIcon","allRowsSelected","resize","longPressStart","longPressEnd","sort","select","columnContextmenu",4,"ngFor","ngForOf","ngForTrackBy"],["resizeable","","long-press","","draggable","",3,"resizeEnabled","pressModel","pressEnabled","dragX","dragY","dragModel","dragEventTarget","headerHeight","isTarget","targetMarkerTemplate","targetMarkerContext","column","sortType","sorts","selectionType","sortAscendingIcon","sortDescendingIcon","sortUnsetIcon","allRowsSelected","resize","longPressStart","longPressEnd","sort","select","columnContextmenu"]],template:function(ne,Le){1&ne&&(r.TgZ(0,"div",0),r.NdJ("reorder",function(on){return Le.onColumnReordered(on)})("targetChanged",function(on){return Le.onTargetChanged(on)}),r.YNc(1,se,2,5,"div",1),r.qZA()),2&ne&&(r.Udp("width",Le._columnGroupWidths.total,"px"),r.xp6(1),r.Q6J("ngForOf",Le._columnsByPin)("ngForTrackBy",Le.trackByGroups))},directives:function(){return[Zi,a.sg,a.PC,Pa,Xr,ii,Gn]},encapsulation:2,changeDetection:0}),tt})();function pn(tt,rn,ne){ne=ne||{};let Le,Lt,on,Kr=null,bi=0;function Ii(){bi=!1===ne.leading?0:+new Date,Kr=null,on=tt.apply(Le,Lt)}return function(){const hs=+new Date;!bi&&!1===ne.leading&&(bi=hs);const zo=rn-(hs-bi);return Le=this,Lt=arguments,zo<=0?(clearTimeout(Kr),Kr=null,bi=hs,on=tt.apply(Le,Lt)):!Kr&&!1!==ne.trailing&&(Kr=setTimeout(Ii,zo)),on}}function xn(tt,rn){return function(Le,Lt,on){return{configurable:!0,enumerable:on.enumerable,get:function(){return Object.defineProperty(this,Lt,{configurable:!0,enumerable:on.enumerable,value:pn(on.value,tt,rn)}),this[Lt]}}}}function Us(tt,rn){for(const ne of rn){const Le=tt.indexOf(ne);tt.splice(Le,1)}}function cs(tt,rn=300){let ne=0;for(const Le of tt)ne+=Le.width||rn;return ne}var es=(()=>{return(tt=es||(es={})).asc="asc",tt.desc="desc",es;var tt})();function ya(tt,rn){if(null==tt&&(tt=0),null==rn&&(rn=0),tt instanceof Date&&rn instanceof Date){if(tt<rn)return-1;if(tt>rn)return 1}else if(isNaN(parseFloat(tt))||!isFinite(tt)||isNaN(parseFloat(rn))||!isFinite(rn)){if(tt=String(tt),rn=String(rn),tt.toLowerCase()<rn.toLowerCase())return-1;if(tt.toLowerCase()>rn.toLowerCase())return 1}else{if(parseFloat(tt)<parseFloat(rn))return-1;if(parseFloat(tt)>parseFloat(rn))return 1}return 0}let la=(()=>{class tt{constructor(ne,Le,Lt,on,Kr,bi,Ii){this.scrollbarHelper=ne,this.dimensionsHelper=Le,this.cd=Lt,this.columnChangesService=bi,this.configuration=Ii,this.selected=[],this.scrollbarV=!1,this.scrollbarH=!1,this.rowHeight=30,this.columnMode=_t.standard,this.headerHeight=30,this.footerHeight=0,this.externalPaging=!1,this.externalSorting=!1,this.loadingIndicator=!1,this.reorderable=!0,this.swapColumns=!0,this.sortType=ct.single,this.sorts=[],this.cssClasses={sortAscending:"datatable-icon-up",sortDescending:"datatable-icon-down",sortUnset:"datatable-icon-sort-unset",pagerLeftArrow:"datatable-icon-left",pagerRightArrow:"datatable-icon-right",pagerPrevious:"datatable-icon-prev",pagerNext:"datatable-icon-skip"},this.messages={emptyMessage:"No data to display",totalMessage:"total",selectedMessage:"selected"},this.groupExpansionDefault=!1,this.selectAllRowsOnPage=!1,this.virtualization=!0,this.summaryRow=!1,this.summaryHeight=30,this.summaryPosition="top",this.scroll=new r.vpe,this.activate=new r.vpe,this.select=new r.vpe,this.sort=new r.vpe,this.page=new r.vpe,this.reorder=new r.vpe,this.resize=new r.vpe,this.tableContextmenu=new r.vpe(!1),this.treeAction=new r.vpe,this.rowCount=0,this._offsetX=new e.X(0),this._count=0,this._offset=0,this._subscriptions=[],this.rowIdentity=hs=>this._groupRowsBy?hs.key:hs,this.element=on.nativeElement,this.rowDiffer=Kr.find({}).create(),this.configuration&&this.configuration.messages&&(this.messages=Object.assign({},this.configuration.messages))}set rows(ne){this._rows=ne,ne&&(this._internalRows=[...ne]),this.externalSorting||this.sortInternalRows(),this._internalRows=vi(this._internalRows,ri(this.treeFromRelation),ri(this.treeToRelation)),this.recalculate(),this._rows&&this._groupRowsBy&&(this.groupedRows=this.groupArrayBy(this._rows,this._groupRowsBy)),this.cd.markForCheck()}get rows(){return this._rows}set groupRowsBy(ne){ne&&(this._groupRowsBy=ne,this._rows&&this._groupRowsBy&&(this.groupedRows=this.groupArrayBy(this._rows,this._groupRowsBy)))}get groupRowsBy(){return this._groupRowsBy}set columns(ne){ne&&(this._internalColumns=[...ne],to(this._internalColumns),this.recalculateColumns()),this._columns=ne}get columns(){return this._columns}set limit(ne){this._limit=ne,this.recalculate()}get limit(){return this._limit}set count(ne){this._count=ne,this.recalculate()}get count(){return this._count}set offset(ne){this._offset=ne}get offset(){return Math.max(Math.min(this._offset,Math.ceil(this.rowCount/this.pageSize)-1),0)}get isFixedHeader(){const ne=this.headerHeight;return"string"!=typeof ne||"auto"!==ne}get isFixedRow(){return"auto"!==this.rowHeight}get isVertScroll(){return this.scrollbarV}get isVirtualized(){return this.virtualization}get isHorScroll(){return this.scrollbarH}get isSelectable(){return void 0!==this.selectionType}get isCheckboxSelection(){return this.selectionType===Rt.checkbox}get isCellSelection(){return this.selectionType===Rt.cell}get isSingleSelection(){return this.selectionType===Rt.single}get isMultiSelection(){return this.selectionType===Rt.multi}get isMultiClickSelection(){return this.selectionType===Rt.multiClick}set columnTemplates(ne){this._columnTemplates=ne,this.translateColumns(ne)}get columnTemplates(){return this._columnTemplates}get allRowsSelected(){let ne=this.rows&&this.selected&&this.selected.length===this.rows.length;if(this.bodyComponent&&this.selectAllRowsOnPage){const Le=this.bodyComponent.indexes;ne=this.selected.length===Le.last-Le.first}return this.selected&&this.rows&&0!==this.rows.length&&ne}ngOnInit(){this.recalculate()}ngAfterViewInit(){this.externalSorting||this.sortInternalRows(),"undefined"!=typeof requestAnimationFrame&&requestAnimationFrame(()=>{this.recalculate(),this.externalPaging&&this.scrollbarV&&this.page.emit({count:this.count,pageSize:this.pageSize,limit:this.limit,offset:0})})}ngAfterContentInit(){this.columnTemplates.changes.subscribe(ne=>this.translateColumns(ne)),this.listenForColumnInputChanges()}translateColumns(ne){if(ne){const Le=ne.toArray();Le.length&&(this._internalColumns=function Rn(tt){const rn=[];for(const ne of tt){const Le={},Lt=Object.getOwnPropertyNames(ne);for(const on of Lt)Le[on]=ne[on];ne.headerTemplate&&(Le.headerTemplate=ne.headerTemplate),ne.cellTemplate&&(Le.cellTemplate=ne.cellTemplate),ne.summaryFunc&&(Le.summaryFunc=ne.summaryFunc),ne.summaryTemplate&&(Le.summaryTemplate=ne.summaryTemplate),rn.push(Le)}return rn}(Le),to(this._internalColumns),this.recalculateColumns(),this.sortInternalRows(),this.cd.markForCheck())}}groupArrayBy(ne,Le){const Lt=new Map;return ne.forEach(bi=>{const Ii=bi[Le];Lt.has(Ii)?Lt.get(Ii).push(bi):Lt.set(Ii,[bi])}),Array.from(Lt,bi=>((bi,Ii)=>({key:bi,value:Ii}))(bi[0],bi[1]))}ngDoCheck(){this.rowDiffer.diff(this.rows)&&(this.externalSorting?this._internalRows=[...this.rows]:this.sortInternalRows(),this._internalRows=vi(this._internalRows,ri(this.treeFromRelation),ri(this.treeToRelation)),this.recalculatePages(),this.cd.markForCheck())}recalculate(){this.recalculateDims(),this.recalculateColumns(),this.cd.markForCheck()}onWindowResize(){this.recalculate()}recalculateColumns(ne=this._internalColumns,Le=-1,Lt=this.scrollbarH){if(!ne)return;let on=this._innerWidth;return this.scrollbarV&&(on-=this.scrollbarHelper.width),this.columnMode===_t.force?function wo(tt,rn,ne,Le,Lt=300){const on=tt.slice(ne+1,tt.length).filter(Xs=>!1!==Xs.canAutoResize);for(const Xs of on)Xs.$$oldWidth||(Xs.$$oldWidth=Xs.width);let Kr=0,bi=!1,Ii=cs(tt,Lt),hs=rn-Ii;const zo=[];do{Kr=hs/on.length,bi=Ii>=rn;for(const Xs of on){if(bi&&Le)Xs.width=Xs.$$oldWidth||Xs.width||Lt;else{const vl=(Xs.width||Lt)+Kr;Xs.minWidth&&vl<Xs.minWidth?(Xs.width=Xs.minWidth,zo.push(Xs)):Xs.maxWidth&&vl>Xs.maxWidth?(Xs.width=Xs.maxWidth,zo.push(Xs)):Xs.width=vl}Xs.width=Math.max(0,Xs.width)}Ii=cs(tt),hs=rn-Ii,Us(on,zo)}while(hs>1&&0!==on.length)}(ne,on,Le,Lt):this.columnMode===_t.flex&&function no(tt,rn){const ne=function Ko(tt,rn){let ne=0;for(const Le of tt)ne+=rn&&Le[rn]?Le[rn]:Le.width;return ne}(tt),Le=function Gr(tt){let rn=0;for(const ne of tt)rn+=ne.flexGrow||0;return rn}(tt),Lt=lo(tt);ne!==rn&&function mo(tt,rn,ne){for(const on in tt)for(const Kr of tt[on])Kr.canAutoResize?Kr.width=0:(rn-=Kr.width,ne-=Kr.flexGrow?Kr.flexGrow:0);const Le={};let Lt=rn;do{const on=Lt/ne;Lt=0;for(const Kr in tt)for(const bi of tt[Kr])if(bi.canAutoResize&&!Le[bi.prop]){const Ii=bi.width+bi.flexGrow*on;void 0!==bi.minWidth&&Ii<bi.minWidth?(Lt+=Ii-bi.minWidth,bi.width=bi.minWidth,Le[bi.prop]=!0):bi.width=Ii}}while(0!==Lt)}(Lt,rn,Le)}(ne,on),ne}recalculateDims(){const ne=this.dimensionsHelper.getDimensions(this.element);if(this._innerWidth=Math.floor(ne.width),this.scrollbarV){let Le=ne.height;this.headerHeight&&(Le-=this.headerHeight),this.footerHeight&&(Le-=this.footerHeight),this.bodyHeight=Le}this.recalculatePages()}recalculatePages(){this.pageSize=this.calcPageSize(),this.rowCount=this.calcRowCount()}onBodyPage({offset:ne}){this.externalPaging&&!this.virtualization||(this.offset=ne,this.page.emit({count:this.count,pageSize:this.pageSize,limit:this.limit,offset:this.offset}))}onBodyScroll(ne){this._offsetX.next(ne.offsetX),this.scroll.emit(ne),this.cd.detectChanges()}onFooterPage(ne){this.offset=ne.page-1,this.bodyComponent.updateOffsetY(this.offset),this.page.emit({count:this.count,pageSize:this.pageSize,limit:this.limit,offset:this.offset}),this.selectAllRowsOnPage&&(this.selected=[],this.select.emit({selected:this.selected}))}calcPageSize(ne=this.rows){if(this.scrollbarV&&this.virtualization){const Le=Math.ceil(this.bodyHeight/this.rowHeight);return Math.max(Le,0)}return void 0!==this.limit?this.limit:ne?ne.length:0}calcRowCount(ne=this.rows){return this.externalPaging?this.count:ne?this.groupedRows?this.groupedRows.length:null!=this.treeFromRelation&&null!=this.treeToRelation?this._internalRows.length:ne.length:0}onColumnContextmenu({event:ne,column:Le}){this.tableContextmenu.emit({event:ne,type:pt.header,content:Le})}onRowContextmenu({event:ne,row:Le}){this.tableContextmenu.emit({event:ne,type:pt.body,content:Le})}onColumnResize({column:ne,newValue:Le}){if(void 0===ne)return;let Lt;const on=this._internalColumns.map((Kr,bi)=>((Kr=Object.assign({},Kr)).$$id===ne.$$id&&(Lt=bi,Kr.width=Le,Kr.$$oldWidth=Le),Kr));this.recalculateColumns(on,Lt),this._internalColumns=on,this.resize.emit({column:ne,newValue:Le})}onColumnReorder({column:ne,newValue:Le,prevValue:Lt}){const on=this._internalColumns.map(Kr=>Object.assign({},Kr));if(this.swapColumns){const Kr=on[Le];on[Le]=ne,on[Lt]=Kr}else if(Le>Lt){const Kr=on[Lt];for(let bi=Lt;bi<Le;bi++)on[bi]=on[bi+1];on[Le]=Kr}else{const Kr=on[Lt];for(let bi=Lt;bi>Le;bi--)on[bi]=on[bi-1];on[Le]=Kr}this._internalColumns=on,this.reorder.emit({column:ne,newValue:Le,prevValue:Lt})}onColumnSort(ne){this.selectAllRowsOnPage&&(this.selected=[],this.select.emit({selected:this.selected})),this.sorts=ne.sorts,!1===this.externalSorting&&this.sortInternalRows(),this._internalRows=vi(this._internalRows,ri(this.treeFromRelation),ri(this.treeToRelation)),this.offset=0,this.bodyComponent.updateOffsetY(this.offset),this.sort.emit(ne)}onHeaderSelect(ne){if(this.bodyComponent&&this.selectAllRowsOnPage){const Le=this.bodyComponent.indexes.first,Lt=this.bodyComponent.indexes.last,on=this.selected.length===Lt-Le;this.selected=[],on||this.selected.push(...this._internalRows.slice(Le,Lt))}else{const Le=this.selected.length===this.rows.length;this.selected=[],Le||this.selected.push(...this.rows)}this.select.emit({selected:this.selected})}onBodySelect(ne){this.select.emit(ne)}onTreeAction(ne){const Le=ne.row,Lt=this._rows.findIndex(on=>on[this.treeToRelation]===ne.row[this.treeToRelation]);this.treeAction.emit({row:Le,rowIndex:Lt})}ngOnDestroy(){this._subscriptions.forEach(ne=>ne.unsubscribe())}listenForColumnInputChanges(){this._subscriptions.push(this.columnChangesService.columnInputChanges$.subscribe(()=>{this.columnTemplates&&this.columnTemplates.notifyOnChanges()}))}sortInternalRows(){this._internalRows=function fa(tt,rn,ne){if(!tt)return[];if(!ne||!ne.length||!rn)return[...tt];const Le=new Map;tt.forEach((bi,Ii)=>Le.set(bi,Ii));const Lt=[...tt],on=rn.reduce((bi,Ii)=>(Ii.comparator&&"function"==typeof Ii.comparator&&(bi[Ii.prop]=Ii.comparator),bi),{}),Kr=ne.map(bi=>{const Ii=bi.prop;return{prop:Ii,dir:bi.dir,valueGetter:Zn(Ii),compareFn:on[Ii]||ya}});return Lt.sort(function(bi,Ii){for(const hs of Kr){const{prop:zo,valueGetter:Ls}=hs,Xs=Ls(bi,zo),vl=Ls(Ii,zo),ol=hs.dir!==es.desc?hs.compareFn(Xs,vl,bi,Ii,hs.dir):-hs.compareFn(Xs,vl,bi,Ii,hs.dir);if(0!==ol)return ol}return Le.has(bi)&&Le.has(Ii)?Le.get(bi)<Le.get(Ii)?-1:1:0})}(this._internalRows,this._internalColumns,this.sorts)}}return tt.\u0275fac=function(ne){return new(ne||tt)(r.Y36(Sr,4),r.Y36(Kt,4),r.Y36(r.sBO),r.Y36(r.SBq),r.Y36(r.aQg),r.Y36(un),r.Y36("configuration",8))},tt.\u0275cmp=r.Xpm({type:tt,selectors:[["ngx-datatable"]],contentQueries:function(ne,Le,Lt){if(1&ne&&(r.Suo(Lt,Uo,5),r.Suo(Lt,ln,5),r.Suo(Lt,Qo,5),r.Suo(Lt,Oi,4)),2&ne){let on;r.iGM(on=r.CRH())&&(Le.rowDetail=on.first),r.iGM(on=r.CRH())&&(Le.groupHeader=on.first),r.iGM(on=r.CRH())&&(Le.footer=on.first),r.iGM(on=r.CRH())&&(Le.columnTemplates=on)}},viewQuery:function(ne,Le){if(1&ne&&(r.Gf(or,5),r.Gf(si,5)),2&ne){let Lt;r.iGM(Lt=r.CRH())&&(Le.bodyComponent=Lt.first),r.iGM(Lt=r.CRH())&&(Le.headerComponent=Lt.first)}},hostAttrs:[1,"ngx-datatable"],hostVars:22,hostBindings:function(ne,Le){1&ne&&r.NdJ("resize",function(){return Le.onWindowResize()},!1,r.Jf7),2&ne&&r.ekj("fixed-header",Le.isFixedHeader)("fixed-row",Le.isFixedRow)("scroll-vertical",Le.isVertScroll)("virtualized",Le.isVirtualized)("scroll-horz",Le.isHorScroll)("selectable",Le.isSelectable)("checkbox-selection",Le.isCheckboxSelection)("cell-selection",Le.isCellSelection)("single-selection",Le.isSingleSelection)("multi-selection",Le.isMultiSelection)("multi-click-selection",Le.isMultiClickSelection)},inputs:{selected:"selected",scrollbarV:"scrollbarV",scrollbarH:"scrollbarH",rowHeight:"rowHeight",columnMode:"columnMode",headerHeight:"headerHeight",footerHeight:"footerHeight",externalPaging:"externalPaging",externalSorting:"externalSorting",loadingIndicator:"loadingIndicator",reorderable:"reorderable",swapColumns:"swapColumns",sortType:"sortType",sorts:"sorts",cssClasses:"cssClasses",messages:"messages",groupExpansionDefault:"groupExpansionDefault",selectAllRowsOnPage:"selectAllRowsOnPage",virtualization:"virtualization",summaryRow:"summaryRow",summaryHeight:"summaryHeight",summaryPosition:"summaryPosition",rowIdentity:"rowIdentity",rows:"rows",groupedRows:"groupedRows",groupRowsBy:"groupRowsBy",columns:"columns",limit:"limit",count:"count",offset:"offset",targetMarkerTemplate:"targetMarkerTemplate",selectionType:"selectionType",rowClass:"rowClass",selectCheck:"selectCheck",displayCheck:"displayCheck",trackByProp:"trackByProp",treeFromRelation:"treeFromRelation",treeToRelation:"treeToRelation"},outputs:{scroll:"scroll",activate:"activate",select:"select",sort:"sort",page:"page",reorder:"reorder",resize:"resize",tableContextmenu:"tableContextmenu",treeAction:"treeAction"},decls:5,vars:34,consts:[["visibilityObserver","",3,"visible"],[3,"sorts","sortType","scrollbarH","innerWidth","offsetX","dealsWithGroup","columns","headerHeight","reorderable","targetMarkerTemplate","sortAscendingIcon","sortDescendingIcon","sortUnsetIcon","allRowsSelected","selectionType","sort","resize","reorder","select","columnContextmenu",4,"ngIf"],[3,"groupRowsBy","groupedRows","rows","groupExpansionDefault","scrollbarV","scrollbarH","virtualization","loadingIndicator","externalPaging","rowHeight","rowCount","offset","trackByProp","columns","pageSize","offsetX","rowDetail","groupHeader","selected","innerWidth","bodyHeight","selectionType","emptyMessage","rowIdentity","rowClass","selectCheck","displayCheck","summaryRow","summaryHeight","summaryPosition","page","activate","rowContextmenu","select","scroll","treeAction"],[3,"rowCount","pageSize","offset","footerHeight","footerTemplate","totalMessage","pagerLeftArrowIcon","pagerRightArrowIcon","pagerPreviousIcon","selectedCount","selectedMessage","pagerNextIcon","page",4,"ngIf"],[3,"sorts","sortType","scrollbarH","innerWidth","offsetX","dealsWithGroup","columns","headerHeight","reorderable","targetMarkerTemplate","sortAscendingIcon","sortDescendingIcon","sortUnsetIcon","allRowsSelected","selectionType","sort","resize","reorder","select","columnContextmenu"],[3,"rowCount","pageSize","offset","footerHeight","footerTemplate","totalMessage","pagerLeftArrowIcon","pagerRightArrowIcon","pagerPreviousIcon","selectedCount","selectedMessage","pagerNextIcon","page"]],template:function(ne,Le){1&ne&&(r.TgZ(0,"div",0),r.NdJ("visible",function(){return Le.recalculate()}),r.YNc(1,ge,2,17,"datatable-header",1),r.TgZ(2,"datatable-body",2),r.NdJ("page",function(on){return Le.onBodyPage(on)})("activate",function(on){return Le.activate.emit(on)})("rowContextmenu",function(on){return Le.onRowContextmenu(on)})("select",function(on){return Le.onBodySelect(on)})("scroll",function(on){return Le.onBodyScroll(on)})("treeAction",function(on){return Le.onTreeAction(on)}),r.ALo(3,"async"),r.qZA(),r.YNc(4,ae,1,12,"datatable-footer",3),r.qZA()),2&ne&&(r.xp6(1),r.Q6J("ngIf",Le.headerHeight),r.xp6(1),r.Q6J("groupRowsBy",Le.groupRowsBy)("groupedRows",Le.groupedRows)("rows",Le._internalRows)("groupExpansionDefault",Le.groupExpansionDefault)("scrollbarV",Le.scrollbarV)("scrollbarH",Le.scrollbarH)("virtualization",Le.virtualization)("loadingIndicator",Le.loadingIndicator)("externalPaging",Le.externalPaging)("rowHeight",Le.rowHeight)("rowCount",Le.rowCount)("offset",Le.offset)("trackByProp",Le.trackByProp)("columns",Le._internalColumns)("pageSize",Le.pageSize)("offsetX",r.lcZ(3,32,Le._offsetX))("rowDetail",Le.rowDetail)("groupHeader",Le.groupHeader)("selected",Le.selected)("innerWidth",Le._innerWidth)("bodyHeight",Le.bodyHeight)("selectionType",Le.selectionType)("emptyMessage",Le.messages.emptyMessage)("rowIdentity",Le.rowIdentity)("rowClass",Le.rowClass)("selectCheck",Le.selectCheck)("displayCheck",Le.displayCheck)("summaryRow",Le.summaryRow)("summaryHeight",Le.summaryHeight)("summaryPosition",Le.summaryPosition),r.xp6(2),r.Q6J("ngIf",Le.footerHeight))},directives:function(){return[Jn,a.O5,si,or,fl]},pipes:function(){return[a.Ov]},styles:[".ngx-datatable{display:block;justify-content:center;overflow:hidden;position:relative;transform:translateZ(0)}.ngx-datatable [hidden]{display:none!important}.ngx-datatable *,.ngx-datatable :after,.ngx-datatable :before{box-sizing:border-box}.ngx-datatable.scroll-vertical .datatable-body{overflow-y:auto}.ngx-datatable.scroll-vertical.virtualized .datatable-body .datatable-row-wrapper{position:absolute}.ngx-datatable.scroll-horz .datatable-body{-webkit-overflow-scrolling:touch;overflow-x:auto}.ngx-datatable.fixed-header .datatable-header .datatable-header-inner{white-space:nowrap}.ngx-datatable.fixed-header .datatable-header .datatable-header-inner .datatable-header-cell{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.ngx-datatable.fixed-row .datatable-scroll,.ngx-datatable.fixed-row .datatable-scroll .datatable-body-row{white-space:nowrap}.ngx-datatable.fixed-row .datatable-scroll .datatable-body-row .datatable-body-cell,.ngx-datatable.fixed-row .datatable-scroll .datatable-body-row .datatable-body-group-cell{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.ngx-datatable .datatable-body-row,.ngx-datatable .datatable-header-inner,.ngx-datatable .datatable-row-center{-o-flex-flow:row;display:flex;flex-direction:row;flex-flow:row}.ngx-datatable .datatable-body-cell,.ngx-datatable .datatable-header-cell{display:inline-block;line-height:1.625;overflow-x:hidden;vertical-align:top}.ngx-datatable .datatable-body-cell:focus,.ngx-datatable .datatable-header-cell:focus{outline:none}.ngx-datatable .datatable-row-left,.ngx-datatable .datatable-row-right{z-index:9}.ngx-datatable .datatable-row-center,.ngx-datatable .datatable-row-group,.ngx-datatable .datatable-row-left,.ngx-datatable .datatable-row-right{position:relative}.ngx-datatable .datatable-header{display:block;overflow:hidden}.ngx-datatable .datatable-header .datatable-header-inner{-webkit-align-items:stretch;align-items:stretch}.ngx-datatable .datatable-header .datatable-header-cell{display:inline-block;position:relative}.ngx-datatable .datatable-header .datatable-header-cell.sortable .datatable-header-cell-wrapper{cursor:pointer}.ngx-datatable .datatable-header .datatable-header-cell.longpress .datatable-header-cell-wrapper{cursor:move}.ngx-datatable .datatable-header .datatable-header-cell .sort-btn{cursor:pointer;display:inline-block;line-height:100%;vertical-align:middle}.ngx-datatable .datatable-header .datatable-header-cell .resize-handle,.ngx-datatable .datatable-header .datatable-header-cell .resize-handle--not-resizable{bottom:0;display:inline-block;padding:0 4px;position:absolute;right:0;top:0;visibility:hidden;width:5px}.ngx-datatable .datatable-header .datatable-header-cell .resize-handle{cursor:ew-resize}.ngx-datatable .datatable-header .datatable-header-cell.resizeable:hover .resize-handle,.ngx-datatable .datatable-header .datatable-header-cell:hover .resize-handle--not-resizable{visibility:visible}.ngx-datatable .datatable-header .datatable-header-cell .targetMarker{bottom:0;position:absolute;top:0}.ngx-datatable .datatable-header .datatable-header-cell .targetMarker.dragFromLeft{right:0}.ngx-datatable .datatable-header .datatable-header-cell .targetMarker.dragFromRight{left:0}.ngx-datatable .datatable-header .datatable-header-cell .datatable-header-cell-template-wrap{height:inherit}.ngx-datatable .datatable-body{display:block;position:relative;z-index:10}.ngx-datatable .datatable-body .datatable-scroll{display:inline-block}.ngx-datatable .datatable-body .datatable-row-detail{overflow-y:hidden}.ngx-datatable .datatable-body .datatable-row-wrapper{display:flex;flex-direction:column}.ngx-datatable .datatable-body .datatable-body-row{outline:none}.ngx-datatable .datatable-body .datatable-body-row>div{display:flex}.ngx-datatable .datatable-footer{display:block;overflow:auto;width:100%}.ngx-datatable .datatable-footer .datatable-footer-inner{align-items:center;display:flex;width:100%}.ngx-datatable .datatable-footer .selected-count .page-count{flex:1 1 40%}.ngx-datatable .datatable-footer .selected-count .datatable-pager{flex:1 1 60%}.ngx-datatable .datatable-footer .page-count{flex:1 1 20%}.ngx-datatable .datatable-footer .datatable-pager{flex:1 1 80%;text-align:right}.ngx-datatable .datatable-footer .datatable-pager .pager,.ngx-datatable .datatable-footer .datatable-pager .pager li{display:inline-block;list-style:none;margin:0;padding:0}.ngx-datatable .datatable-footer .datatable-pager .pager li,.ngx-datatable .datatable-footer .datatable-pager .pager li a{outline:none}.ngx-datatable .datatable-footer .datatable-pager .pager li a{cursor:pointer;display:inline-block}.ngx-datatable .datatable-footer .datatable-pager .pager li.disabled a{cursor:not-allowed}"],encapsulation:2,changeDetection:0}),(0,y.gn)([xn(5)],tt.prototype,"onWindowResize",null),tt})(),Pa=(()=>{class tt{constructor(ne){this.cd=ne,this.sort=new r.vpe,this.select=new r.vpe,this.columnContextmenu=new r.vpe(!1),this.sortFn=this.onSort.bind(this),this.selectFn=this.select.emit.bind(this.select),this.cellContext={column:this.column,sortDir:this.sortDir,sortFn:this.sortFn,allRowsSelected:this.allRowsSelected,selectFn:this.selectFn}}set allRowsSelected(ne){this._allRowsSelected=ne,this.cellContext.allRowsSelected=ne}get allRowsSelected(){return this._allRowsSelected}set column(ne){this._column=ne,this.cellContext.column=ne,this.cd.markForCheck()}get column(){return this._column}set sorts(ne){this._sorts=ne,this.sortDir=this.calcSortDir(ne),this.cellContext.sortDir=this.sortDir,this.sortClass=this.calcSortClass(this.sortDir),this.cd.markForCheck()}get sorts(){return this._sorts}get columnCssClasses(){let ne="datatable-header-cell";if(this.column.sortable&&(ne+=" sortable"),this.column.resizeable&&(ne+=" resizeable"),this.column.headerClass)if("string"==typeof this.column.headerClass)ne+=" "+this.column.headerClass;else if("function"==typeof this.column.headerClass){const Lt=this.column.headerClass({column:this.column});if("string"==typeof Lt)ne+=Lt;else if("object"==typeof Lt){const on=Object.keys(Lt);for(const Kr of on)!0===Lt[Kr]&&(ne+=` ${Kr}`)}}const Le=this.sortDir;return Le&&(ne+=` sort-active sort-${Le}`),ne}get name(){return void 0===this.column.headerTemplate?this.column.name:void 0}get minWidth(){return this.column.minWidth}get maxWidth(){return this.column.maxWidth}get width(){return this.column.width}get isCheckboxable(){return this.column.checkboxable&&this.column.headerCheckboxable&&this.selectionType===Rt.checkbox}onContextmenu(ne){this.columnContextmenu.emit({event:ne,column:this.column})}ngOnInit(){this.sortClass=this.calcSortClass(this.sortDir)}calcSortDir(ne){if(ne&&this.column){const Le=ne.find(Lt=>Lt.prop===this.column.prop);if(Le)return Le.dir}}onSort(){if(!this.column.sortable)return;const ne=function ga(tt,rn){return tt===ct.single?rn===es.asc?es.desc:es.asc:rn?rn===es.asc?es.desc:void 0:es.asc}(this.sortType,this.sortDir);this.sort.emit({column:this.column,prevValue:this.sortDir,newValue:ne})}calcSortClass(ne){if(this.cellContext.column.sortable)return ne===es.asc?`sort-btn sort-asc ${this.sortAscendingIcon}`:ne===es.desc?`sort-btn sort-desc ${this.sortDescendingIcon}`:`sort-btn ${this.sortUnsetIcon}`}}return tt.\u0275fac=function(ne){return new(ne||tt)(r.Y36(r.sBO))},tt.\u0275cmp=r.Xpm({type:tt,selectors:[["datatable-header-cell"]],hostAttrs:[1,"datatable-header-cell"],hostVars:11,hostBindings:function(ne,Le){1&ne&&r.NdJ("contextmenu",function(on){return Le.onContextmenu(on)}),2&ne&&(r.uIk("title",Le.name),r.Tol(Le.columnCssClasses),r.Udp("min-width",Le.minWidth,"px")("max-width",Le.maxWidth,"px")("width",Le.width,"px")("height",Le.headerHeight,"px"))},inputs:{allRowsSelected:"allRowsSelected",column:"column",sorts:"sorts",sortType:"sortType",sortAscendingIcon:"sortAscendingIcon",sortDescendingIcon:"sortDescendingIcon",sortUnsetIcon:"sortUnsetIcon",isTarget:"isTarget",targetMarkerTemplate:"targetMarkerTemplate",targetMarkerContext:"targetMarkerContext",selectionType:"selectionType",headerHeight:"headerHeight"},outputs:{sort:"sort",select:"select",columnContextmenu:"columnContextmenu"},decls:6,vars:6,consts:[[1,"datatable-header-cell-template-wrap"],[4,"ngIf"],["class","datatable-checkbox",4,"ngIf"],["class","datatable-header-cell-wrapper",4,"ngIf"],[3,"click"],[3,"ngTemplateOutlet","ngTemplateOutletContext"],[1,"datatable-checkbox"],["type","checkbox",3,"checked","change"],[1,"datatable-header-cell-wrapper"],[1,"datatable-header-cell-label","draggable",3,"innerHTML","click"]],template:function(ne,Le){1&ne&&(r.TgZ(0,"div",0),r.YNc(1,be,1,2,null,1),r.YNc(2,we,2,1,"label",2),r.YNc(3,ue,2,1,"span",3),r.YNc(4,We,1,2,null,1),r.TgZ(5,"span",4),r.NdJ("click",function(){return Le.onSort()}),r.qZA()()),2&ne&&(r.xp6(1),r.Q6J("ngIf",Le.isTarget),r.xp6(1),r.Q6J("ngIf",Le.isCheckboxable),r.xp6(1),r.Q6J("ngIf",!Le.column.headerTemplate),r.xp6(1),r.Q6J("ngIf",Le.column.headerTemplate),r.xp6(1),r.Tol(Le.sortClass))},directives:[a.O5,a.tP],encapsulation:2,changeDetection:0}),tt})(),fl=(()=>{class tt{constructor(){this.selectedCount=0,this.page=new r.vpe}get isVisible(){return this.rowCount/this.pageSize>1}get curPage(){return this.offset+1}}return tt.\u0275fac=function(ne){return new(ne||tt)},tt.\u0275cmp=r.Xpm({type:tt,selectors:[["datatable-footer"]],hostAttrs:[1,"datatable-footer"],inputs:{selectedCount:"selectedCount",footerHeight:"footerHeight",rowCount:"rowCount",pageSize:"pageSize",offset:"offset",pagerLeftArrowIcon:"pagerLeftArrowIcon",pagerRightArrowIcon:"pagerRightArrowIcon",pagerPreviousIcon:"pagerPreviousIcon",pagerNextIcon:"pagerNextIcon",totalMessage:"totalMessage",footerTemplate:"footerTemplate",selectedMessage:"selectedMessage"},outputs:{page:"page"},decls:4,vars:8,consts:[[1,"datatable-footer-inner",3,"ngClass"],[4,"ngIf"],["class","page-count",4,"ngIf"],[3,"pagerLeftArrowIcon","pagerRightArrowIcon","pagerPreviousIcon","pagerNextIcon","page","size","count","hidden","change",4,"ngIf"],[3,"ngTemplateOutlet","ngTemplateOutletContext"],[1,"page-count"],[3,"pagerLeftArrowIcon","pagerRightArrowIcon","pagerPreviousIcon","pagerNextIcon","page","size","count","hidden","change"]],template:function(ne,Le){1&ne&&(r.TgZ(0,"div",0),r.YNc(1,xe,1,8,null,1),r.YNc(2,Ne,3,3,"div",2),r.YNc(3,Bt,1,8,"datatable-pager",3),r.qZA()),2&ne&&(r.Udp("height",Le.footerHeight,"px"),r.Q6J("ngClass",r.VKq(6,rt,Le.selectedMessage)),r.xp6(1),r.Q6J("ngIf",Le.footerTemplate),r.xp6(1),r.Q6J("ngIf",!Le.footerTemplate),r.xp6(1),r.Q6J("ngIf",!Le.footerTemplate))},directives:function(){return[a.mk,a.O5,a.tP,To]},encapsulation:2,changeDetection:0}),tt})(),To=(()=>{class tt{constructor(){this.change=new r.vpe,this._count=0,this._page=1,this._size=0}set size(ne){this._size=ne,this.pages=this.calcPages()}get size(){return this._size}set count(ne){this._count=ne,this.pages=this.calcPages()}get count(){return this._count}set page(ne){this._page=ne,this.pages=this.calcPages()}get page(){return this._page}get totalPages(){const ne=this.size<1?1:Math.ceil(this.count/this.size);return Math.max(ne||0,1)}canPrevious(){return this.page>1}canNext(){return this.page<this.totalPages}prevPage(){this.selectPage(this.page-1)}nextPage(){this.selectPage(this.page+1)}selectPage(ne){ne>0&&ne<=this.totalPages&&ne!==this.page&&(this.page=ne,this.change.emit({page:ne}))}calcPages(ne){const Le=[];let Lt=1,on=this.totalPages;ne=ne||this.page,5<this.totalPages&&(Lt=ne-Math.floor(2.5),on=ne+Math.floor(2.5),Lt<1?(Lt=1,on=Math.min(Lt+5-1,this.totalPages)):on>this.totalPages&&(Lt=Math.max(this.totalPages-5+1,1),on=this.totalPages));for(let Ii=Lt;Ii<=on;Ii++)Le.push({number:Ii,text:Ii});return Le}}return tt.\u0275fac=function(ne){return new(ne||tt)},tt.\u0275cmp=r.Xpm({type:tt,selectors:[["datatable-pager"]],hostAttrs:[1,"datatable-pager"],inputs:{size:"size",count:"count",page:"page",pagerLeftArrowIcon:"pagerLeftArrowIcon",pagerRightArrowIcon:"pagerRightArrowIcon",pagerPreviousIcon:"pagerPreviousIcon",pagerNextIcon:"pagerNextIcon"},outputs:{change:"change"},decls:14,vars:21,consts:[[1,"pager"],["role","button","aria-label","go to first page","href","javascript:void(0)",3,"click"],["role","button","aria-label","go to previous page","href","javascript:void(0)",3,"click"],["role","button","class","pages",3,"active",4,"ngFor","ngForOf"],["role","button","aria-label","go to next page","href","javascript:void(0)",3,"click"],["role","button","aria-label","go to last page","href","javascript:void(0)",3,"click"],["role","button",1,"pages"],["href","javascript:void(0)",3,"click"]],template:function(ne,Le){1&ne&&(r.TgZ(0,"ul",0)(1,"li")(2,"a",1),r.NdJ("click",function(){return Le.selectPage(1)}),r._UZ(3,"i"),r.qZA()(),r.TgZ(4,"li")(5,"a",2),r.NdJ("click",function(){return Le.prevPage()}),r._UZ(6,"i"),r.qZA()(),r.YNc(7,en,3,4,"li",3),r.TgZ(8,"li")(9,"a",4),r.NdJ("click",function(){return Le.nextPage()}),r._UZ(10,"i"),r.qZA()(),r.TgZ(11,"li")(12,"a",5),r.NdJ("click",function(){return Le.selectPage(Le.totalPages)}),r._UZ(13,"i"),r.qZA()()()),2&ne&&(r.xp6(1),r.ekj("disabled",!Le.canPrevious()),r.xp6(2),r.Tol(Le.pagerPreviousIcon),r.xp6(1),r.ekj("disabled",!Le.canPrevious()),r.xp6(2),r.Tol(Le.pagerLeftArrowIcon),r.xp6(1),r.Q6J("ngForOf",Le.pages),r.xp6(1),r.ekj("disabled",!Le.canNext()),r.xp6(2),r.Tol(Le.pagerRightArrowIcon),r.xp6(1),r.ekj("disabled",!Le.canNext()),r.xp6(2),r.Tol(Le.pagerNextIcon))},directives:[a.sg],encapsulation:2,changeDetection:0}),tt})(),ml=(()=>{class tt{}return tt.\u0275fac=function(ne){return new(ne||tt)},tt.\u0275cmp=r.Xpm({type:tt,selectors:[["datatable-progress"]],decls:3,vars:0,consts:[["role","progressbar",1,"progress-linear"],[1,"container"],[1,"bar"]],template:function(ne,Le){1&ne&&(r.TgZ(0,"div",0)(1,"div",1),r._UZ(2,"div",2),r.qZA()())},encapsulation:2,changeDetection:0}),tt})();var Zo=(()=>{return(tt=Zo||(Zo={}))[tt.up=38]="up",tt[tt.down=40]="down",tt[tt.return=13]="return",tt[tt.escape=27]="escape",tt[tt.left=37]="left",tt[tt.right=39]="right",Zo;var tt})();let vs=(()=>{class tt{constructor(ne,Le,Lt,on){this.differs=ne,this.scrollbarHelper=Le,this.cd=Lt,this.treeStatus="collapsed",this.activate=new r.vpe,this.treeAction=new r.vpe,this._groupStyles={left:{},center:{},right:{}},this._element=on.nativeElement,this._rowDiffer=ne.find({}).create()}set columns(ne){this._columns=ne,this.recalculateColumns(ne),this.buildStylesByGroup()}get columns(){return this._columns}set innerWidth(ne){if(this._columns){const Le=lo(this._columns);this._columnGroupWidths=Ai(Le,this._columns)}this._innerWidth=ne,this.recalculateColumns(),this.buildStylesByGroup()}get innerWidth(){return this._innerWidth}set offsetX(ne){this._offsetX=ne,this.buildStylesByGroup()}get offsetX(){return this._offsetX}get cssClass(){let ne="datatable-body-row";if(this.isSelected&&(ne+=" active"),this.rowIndex%2!=0&&(ne+=" datatable-row-odd"),this.rowIndex%2==0&&(ne+=" datatable-row-even"),this.rowClass){const Le=this.rowClass(this.row);if("string"==typeof Le)ne+=` ${Le}`;else if("object"==typeof Le){const Lt=Object.keys(Le);for(const on of Lt)!0===Le[on]&&(ne+=` ${on}`)}}return ne}get columnsTotalWidths(){return this._columnGroupWidths.total}ngDoCheck(){this._rowDiffer.diff(this.row)&&this.cd.markForCheck()}trackByGroups(ne,Le){return Le.type}columnTrackingFn(ne,Le){return Le.$$id}buildStylesByGroup(){this._groupStyles.left=this.calcStylesByGroup("left"),this._groupStyles.center=this.calcStylesByGroup("center"),this._groupStyles.right=this.calcStylesByGroup("right"),this.cd.markForCheck()}calcStylesByGroup(ne){const Le=this._columnGroupWidths,Lt=this.offsetX,on={width:`${Le[ne]}px`};if("left"===ne)yr(on,Lt,0);else if("right"===ne){const Kr=parseInt(this.innerWidth+"",0);yr(on,-1*(Le.total-Kr-Lt+this.scrollbarHelper.width),0)}return on}onActivate(ne,Le){ne.cellIndex=Le,ne.rowElement=this._element,this.activate.emit(ne)}onKeyDown(ne){const Le=ne.keyCode;(Le===Zo.return||Le===Zo.down||Le===Zo.up||Le===Zo.left||Le===Zo.right)&&ne.target===this._element&&(ne.preventDefault(),ne.stopPropagation(),this.activate.emit({type:"keydown",event:ne,row:this.row,rowElement:this._element}))}onMouseenter(ne){this.activate.emit({type:"mouseenter",event:ne,row:this.row,rowElement:this._element})}recalculateColumns(ne=this.columns){this._columns=ne;const Le=lo(this._columns);this._columnsByPin=qn(this._columns),this._columnGroupWidths=Ai(Le,this._columns)}onTreeAction(){this.treeAction.emit()}}return tt.\u0275fac=function(ne){return new(ne||tt)(r.Y36(r.aQg),r.Y36(Sr,4),r.Y36(r.sBO),r.Y36(r.SBq))},tt.\u0275cmp=r.Xpm({type:tt,selectors:[["datatable-body-row"]],hostVars:6,hostBindings:function(ne,Le){1&ne&&r.NdJ("keydown",function(on){return Le.onKeyDown(on)})("mouseenter",function(on){return Le.onMouseenter(on)}),2&ne&&(r.Tol(Le.cssClass),r.Udp("width",Le.columnsTotalWidths,"px")("height",Le.rowHeight,"px"))},inputs:{treeStatus:"treeStatus",columns:"columns",innerWidth:"innerWidth",offsetX:"offsetX",expanded:"expanded",rowClass:"rowClass",row:"row",group:"group",isSelected:"isSelected",rowIndex:"rowIndex",displayCheck:"displayCheck",rowHeight:"rowHeight"},outputs:{activate:"activate",treeAction:"treeAction"},decls:1,vars:2,consts:[[3,"class","ngStyle",4,"ngFor","ngForOf","ngForTrackBy"],[3,"ngStyle"],["tabindex","-1",3,"row","group","expanded","isSelected","rowIndex","column","rowHeight","displayCheck","treeStatus","activate","treeAction",4,"ngFor","ngForOf","ngForTrackBy"],["tabindex","-1",3,"row","group","expanded","isSelected","rowIndex","column","rowHeight","displayCheck","treeStatus","activate","treeAction"]],template:function(ne,Le){1&ne&&r.YNc(0,Vt,2,6,"div",0),2&ne&&r.Q6J("ngForOf",Le._columnsByPin)("ngForTrackBy",Le.trackByGroups)},directives:function(){return[a.sg,a.PC,Is]},encapsulation:2,changeDetection:0}),tt})(),Za=(()=>{class tt{constructor(ne,Le){this.cd=ne,this.differs=Le,this.rowContextmenu=new r.vpe(!1),this.groupContext={group:this.row,expanded:this.expanded,rowIndex:this.rowIndex},this.rowContext={row:this.row,expanded:this.expanded,rowIndex:this.rowIndex},this._expanded=!1,this.rowDiffer=Le.find({}).create()}set rowIndex(ne){this._rowIndex=ne,this.rowContext.rowIndex=ne,this.groupContext.rowIndex=ne,this.cd.markForCheck()}get rowIndex(){return this._rowIndex}set expanded(ne){this._expanded=ne,this.groupContext.expanded=ne,this.rowContext.expanded=ne,this.cd.markForCheck()}get expanded(){return this._expanded}ngDoCheck(){this.rowDiffer.diff(this.row)&&(this.rowContext.row=this.row,this.groupContext.group=this.row,this.cd.markForCheck())}onContextmenu(ne){this.rowContextmenu.emit({event:ne,row:this.row})}getGroupHeaderStyle(){const ne={};return ne.transform="translate3d("+this.offsetX+"px, 0px, 0px)",ne["backface-visibility"]="hidden",ne.width=this.innerWidth,ne}}return tt.\u0275fac=function(ne){return new(ne||tt)(r.Y36(r.sBO),r.Y36(r.aQg))},tt.\u0275cmp=r.Xpm({type:tt,selectors:[["datatable-row-wrapper"]],hostAttrs:[1,"datatable-row-wrapper"],hostBindings:function(ne,Le){1&ne&&r.NdJ("contextmenu",function(on){return Le.onContextmenu(on)})},inputs:{rowIndex:"rowIndex",expanded:"expanded",innerWidth:"innerWidth",rowDetail:"rowDetail",groupHeader:"groupHeader",offsetX:"offsetX",detailRowHeight:"detailRowHeight",row:"row",groupedRows:"groupedRows"},outputs:{rowContextmenu:"rowContextmenu"},ngContentSelectors:T,decls:3,vars:3,consts:[["class","datatable-group-header",3,"ngStyle",4,"ngIf"],[4,"ngIf"],["class","datatable-row-detail",3,"height",4,"ngIf"],[1,"datatable-group-header",3,"ngStyle"],[3,"ngTemplateOutlet","ngTemplateOutletContext"],[1,"datatable-row-detail"]],template:function(ne,Le){1&ne&&(r.F$t(),r.YNc(0,mt,2,2,"div",0),r.YNc(1,Nt,1,0,"ng-content",1),r.YNc(2,Fn,2,3,"div",2)),2&ne&&(r.Q6J("ngIf",Le.groupHeader&&Le.groupHeader.template),r.xp6(1),r.Q6J("ngIf",Le.groupHeader&&Le.groupHeader.template&&Le.expanded||!Le.groupHeader||!Le.groupHeader.template),r.xp6(1),r.Q6J("ngIf",Le.rowDetail&&Le.rowDetail.template&&Le.expanded))},directives:[a.O5,a.PC,a.tP],encapsulation:2,changeDetection:0}),tt})(),Is=(()=>{class tt{constructor(ne,Le){this.cd=Le,this.activate=new r.vpe,this.treeAction=new r.vpe,this.isFocused=!1,this.onCheckboxChangeFn=this.onCheckboxChange.bind(this),this.activateFn=this.activate.emit.bind(this.activate),this.cellContext={onCheckboxChangeFn:this.onCheckboxChangeFn,activateFn:this.activateFn,row:this.row,group:this.group,value:this.value,column:this.column,rowHeight:this.rowHeight,isSelected:this.isSelected,rowIndex:this.rowIndex,treeStatus:this.treeStatus,onTreeAction:this.onTreeAction.bind(this)},this._element=ne.nativeElement}set group(ne){this._group=ne,this.cellContext.group=ne,this.checkValueUpdates(),this.cd.markForCheck()}get group(){return this._group}set rowHeight(ne){this._rowHeight=ne,this.cellContext.rowHeight=ne,this.checkValueUpdates(),this.cd.markForCheck()}get rowHeight(){return this._rowHeight}set isSelected(ne){this._isSelected=ne,this.cellContext.isSelected=ne,this.cd.markForCheck()}get isSelected(){return this._isSelected}set expanded(ne){this._expanded=ne,this.cellContext.expanded=ne,this.cd.markForCheck()}get expanded(){return this._expanded}set rowIndex(ne){this._rowIndex=ne,this.cellContext.rowIndex=ne,this.checkValueUpdates(),this.cd.markForCheck()}get rowIndex(){return this._rowIndex}set column(ne){this._column=ne,this.cellContext.column=ne,this.checkValueUpdates(),this.cd.markForCheck()}get column(){return this._column}set row(ne){this._row=ne,this.cellContext.row=ne,this.checkValueUpdates(),this.cd.markForCheck()}get row(){return this._row}set sorts(ne){this._sorts=ne,this.calcSortDir=this.calcSortDir(ne)}get sorts(){return this._sorts}set treeStatus(ne){this._treeStatus="collapsed"!==ne&&"expanded"!==ne&&"loading"!==ne&&"disabled"!==ne?"collapsed":ne,this.cellContext.treeStatus=this._treeStatus,this.checkValueUpdates(),this.cd.markForCheck()}get treeStatus(){return this._treeStatus}get columnCssClasses(){let ne="datatable-body-cell";if(this.column.cellClass)if("string"==typeof this.column.cellClass)ne+=" "+this.column.cellClass;else if("function"==typeof this.column.cellClass){const Le=this.column.cellClass({row:this.row,group:this.group,column:this.column,value:this.value,rowHeight:this.rowHeight});if("string"==typeof Le)ne+=" "+Le;else if("object"==typeof Le){const Lt=Object.keys(Le);for(const on of Lt)!0===Le[on]&&(ne+=` ${on}`)}}return this.sortDir||(ne+=" sort-active"),this.isFocused&&(ne+=" active"),this.sortDir===es.asc&&(ne+=" sort-asc"),this.sortDir===es.desc&&(ne+=" sort-desc"),ne}get width(){return this.column.width}get minWidth(){return this.column.minWidth}get maxWidth(){return this.column.maxWidth}get height(){const ne=this.rowHeight;return isNaN(ne)?ne:ne+"px"}ngDoCheck(){this.checkValueUpdates()}ngOnDestroy(){this.cellTemplate&&this.cellTemplate.clear()}checkValueUpdates(){let ne="";if(this.row&&this.column){const Le=this.column.$$valueGetter(this.row,this.column.prop),Lt=this.column.pipe;Lt?ne=Lt.transform(Le):void 0!==ne&&(ne=Le)}else ne="";this.value!==ne&&(this.value=ne,this.cellContext.value=ne,this.sanitizedValue=null!=ne?this.stripHtml(ne):ne,this.cd.markForCheck())}onFocus(){this.isFocused=!0}onBlur(){this.isFocused=!1}onClick(ne){this.activate.emit({type:"click",event:ne,row:this.row,group:this.group,rowHeight:this.rowHeight,column:this.column,value:this.value,cellElement:this._element})}onDblClick(ne){this.activate.emit({type:"dblclick",event:ne,row:this.row,group:this.group,rowHeight:this.rowHeight,column:this.column,value:this.value,cellElement:this._element})}onKeyDown(ne){const Le=ne.keyCode;(Le===Zo.return||Le===Zo.down||Le===Zo.up||Le===Zo.left||Le===Zo.right)&&ne.target===this._element&&(ne.preventDefault(),ne.stopPropagation(),this.activate.emit({type:"keydown",event:ne,row:this.row,group:this.group,rowHeight:this.rowHeight,column:this.column,value:this.value,cellElement:this._element}))}onCheckboxChange(ne){this.activate.emit({type:"checkbox",event:ne,row:this.row,group:this.group,rowHeight:this.rowHeight,column:this.column,value:this.value,cellElement:this._element,treeStatus:"collapsed"})}calcSortDir(ne){if(!ne)return;const Le=ne.find(Lt=>Lt.prop===this.column.prop);return Le?Le.dir:void 0}stripHtml(ne){return ne.replace?ne.replace(/<\/?[^>]+(>|$)/g,""):ne}onTreeAction(){this.treeAction.emit(this.row)}calcLeftMargin(ne,Le){return ne.isTreeColumn?Le.level*(null!=ne.treeLevelIndent?ne.treeLevelIndent:50):0}}return tt.\u0275fac=function(ne){return new(ne||tt)(r.Y36(r.SBq),r.Y36(r.sBO))},tt.\u0275cmp=r.Xpm({type:tt,selectors:[["datatable-body-cell"]],viewQuery:function(ne,Le){if(1&ne&&r.Gf(pr,7,r.s_b),2&ne){let Lt;r.iGM(Lt=r.CRH())&&(Le.cellTemplate=Lt.first)}},hostVars:10,hostBindings:function(ne,Le){1&ne&&r.NdJ("focus",function(){return Le.onFocus()})("blur",function(){return Le.onBlur()})("click",function(on){return Le.onClick(on)})("dblclick",function(on){return Le.onDblClick(on)})("keydown",function(on){return Le.onKeyDown(on)}),2&ne&&(r.Tol(Le.columnCssClasses),r.Udp("width",Le.width,"px")("min-width",Le.minWidth,"px")("max-width",Le.maxWidth,"px")("height",Le.height))},inputs:{group:"group",rowHeight:"rowHeight",isSelected:"isSelected",expanded:"expanded",rowIndex:"rowIndex",column:"column",row:"row",sorts:"sorts",treeStatus:"treeStatus",displayCheck:"displayCheck"},outputs:{activate:"activate",treeAction:"treeAction"},decls:5,vars:6,consts:[[1,"datatable-body-cell-label"],["class","datatable-checkbox",4,"ngIf"],[4,"ngIf"],[3,"title","innerHTML",4,"ngIf"],[1,"datatable-checkbox"],["type","checkbox",3,"checked","click"],["class","datatable-tree-button",3,"disabled","click",4,"ngIf"],[1,"datatable-tree-button",3,"disabled","click"],["class","icon datatable-icon-collapse",4,"ngIf"],["class","icon datatable-icon-up",4,"ngIf"],["class","icon datatable-icon-down",4,"ngIf"],[1,"icon","datatable-icon-collapse"],[1,"icon","datatable-icon-up"],[1,"icon","datatable-icon-down"],[3,"ngTemplateOutlet","ngTemplateOutletContext"],[3,"title","innerHTML"],["cellTemplate",""]],template:function(ne,Le){1&ne&&(r.TgZ(0,"div",0),r.YNc(1,Ei,2,1,"label",1),r.YNc(2,Qr,3,2,"ng-container",2),r.YNc(3,Ci,1,2,"span",3),r.YNc(4,so,2,2,null,2),r.qZA()),2&ne&&(r.Udp("margin-left",Le.calcLeftMargin(Le.column,Le.row),"px"),r.xp6(1),r.Q6J("ngIf",Le.column.checkboxable&&(!Le.displayCheck||Le.displayCheck(Le.row,Le.column,Le.value))),r.xp6(1),r.Q6J("ngIf",Le.column.isTreeColumn),r.xp6(1),r.Q6J("ngIf",!Le.column.cellTemplate),r.xp6(1),r.Q6J("ngIf",Le.column.cellTemplate))},directives:[a.O5,a.tP],encapsulation:2,changeDetection:0}),tt})();function tl(tt,rn,ne){const Le=ne(rn,tt);return Le>-1?tt.splice(Le,1):tt.push(rn),tt}let ko=(()=>{class tt{constructor(){this.activate=new r.vpe,this.select=new r.vpe}selectRow(ne,Le,Lt){if(!this.selectEnabled)return;const on=this.selectionType===Rt.checkbox,bi=this.selectionType===Rt.multiClick;let Ii=[];Ii=this.selectionType===Rt.multi||on||bi?ne.shiftKey?function Ys(tt,rn,ne,Le,Lt){const on=ne<Le;for(let Kr=0;Kr<rn.length;Kr++){const bi=rn[Kr],Ii=Kr>=Le&&Kr<=ne,hs=Kr<=Le&&Kr>=ne;let zo={start:0,end:0};zo=on?{start:ne,end:Le}:{start:Le,end:ne+1},(on&&hs||!on&&Ii)&&Kr>=zo.start&&Kr<=zo.end&&tt.push(bi)}return tt}([],this.rows,Le,this.prevIndex,this.getRowSelectedIdx.bind(this)):tl(ne.ctrlKey||ne.metaKey||bi||on?[...this.selected]:[],Lt,this.getRowSelectedIdx.bind(this)):tl([],Lt,this.getRowSelectedIdx.bind(this)),"function"==typeof this.selectCheck&&(Ii=Ii.filter(this.selectCheck.bind(this))),this.selected.splice(0,this.selected.length),this.selected.push(...Ii),this.prevIndex=Le,this.select.emit({selected:Ii})}onActivate(ne,Le){const{type:Lt,event:on,row:Kr}=ne,bi=this.selectionType===Rt.checkbox;!bi&&("click"===Lt||"dblclick"===Lt)||bi&&"checkbox"===Lt?this.selectRow(on,Le,Kr):"keydown"===Lt&&(on.keyCode===Zo.return?this.selectRow(on,Le,Kr):this.onKeyboardFocus(ne)),this.activate.emit(ne)}onKeyboardFocus(ne){const{keyCode:Le}=ne.event;if(Le===Zo.up||Le===Zo.down||Le===Zo.right||Le===Zo.left){const on=this.selectionType===Rt.cell;ne.cellElement&&on?on&&this.focusCell(ne.cellElement,ne.rowElement,Le,ne.cellIndex):this.focusRow(ne.rowElement,Le)}}focusRow(ne,Le){const Lt=this.getPrevNextRow(ne,Le);Lt&&Lt.focus()}getPrevNextRow(ne,Le){const Lt=ne.parentElement;if(Lt){let on;if(Le===Zo.up?on=Lt.previousElementSibling:Le===Zo.down&&(on=Lt.nextElementSibling),on&&on.children.length)return on.children[0]}}focusCell(ne,Le,Lt,on){let Kr;if(Lt===Zo.left)Kr=ne.previousElementSibling;else if(Lt===Zo.right)Kr=ne.nextElementSibling;else if(Lt===Zo.up||Lt===Zo.down){const bi=this.getPrevNextRow(Le,Lt);if(bi){const Ii=bi.getElementsByClassName("datatable-body-cell");Ii.length&&(Kr=Ii[on])}}Kr&&Kr.focus()}getRowSelected(ne){return this.getRowSelectedIdx(ne,this.selected)>-1}getRowSelectedIdx(ne,Le){if(!Le||!Le.length)return-1;const Lt=this.rowIdentity(ne);return Le.findIndex(on=>this.rowIdentity(on)===Lt)}}return tt.\u0275fac=function(ne){return new(ne||tt)},tt.\u0275cmp=r.Xpm({type:tt,selectors:[["datatable-selection"]],inputs:{rows:"rows",selected:"selected",selectEnabled:"selectEnabled",selectionType:"selectionType",rowIdentity:"rowIdentity",selectCheck:"selectCheck"},outputs:{activate:"activate",select:"select"},ngContentSelectors:T,decls:1,vars:0,template:function(ne,Le){1&ne&&(r.F$t(),r.Hsn(0))},encapsulation:2,changeDetection:0}),tt})();function Co(tt){const rn=tt.filter(ne=>!!ne);return!rn.length||rn.some(ne=>"number"!=typeof ne)?null:rn.reduce((ne,Le)=>ne+Le)}function Ps(tt){return null}let ps=(()=>{class tt{constructor(){this.summaryRow={}}ngOnChanges(){!this.columns||!this.rows||(this.updateInternalColumns(),this.updateValues())}updateInternalColumns(){this._internalColumns=this.columns.map(ne=>Object.assign(Object.assign({},ne),{cellTemplate:ne.summaryTemplate}))}updateValues(){this.summaryRow={},this.columns.filter(ne=>!ne.summaryTemplate).forEach(ne=>{const Le=this.rows.map(on=>on[ne.prop]),Lt=this.getSummaryFunction(ne);this.summaryRow[ne.prop]=ne.pipe?ne.pipe.transform(Lt(Le)):Lt(Le)})}getSummaryFunction(ne){return void 0===ne.summaryFunc?Co:null===ne.summaryFunc?Ps:ne.summaryFunc}}return tt.\u0275fac=function(ne){return new(ne||tt)},tt.\u0275cmp=r.Xpm({type:tt,selectors:[["datatable-summary-row"]],hostAttrs:[1,"datatable-summary-row"],inputs:{rows:"rows",columns:"columns",rowHeight:"rowHeight",offsetX:"offsetX",innerWidth:"innerWidth"},features:[r.TTD],decls:1,vars:1,consts:[["tabindex","-1",3,"innerWidth","offsetX","columns","rowHeight","row","rowIndex",4,"ngIf"],["tabindex","-1",3,"innerWidth","offsetX","columns","rowHeight","row","rowIndex"]],template:function(ne,Le){1&ne&&r.YNc(0,Ro,1,6,"datatable-body-row",0),2&ne&&r.Q6J("ngIf",Le.summaryRow&&Le._internalColumns)},directives:[a.O5,vs],encapsulation:2}),tt})(),Oo=(()=>{class tt{static forRoot(ne){return{ngModule:tt,providers:[{provide:"configuration",useValue:ne}]}}}return tt.\u0275fac=function(ne){return new(ne||tt)},tt.\u0275mod=r.oAB({type:tt}),tt.\u0275inj=r.cJS({providers:[Sr,Kt,un],imports:[[a.ez]]}),tt})();"undefined"!=typeof document&&!document.elementsFromPoint&&(document.elementsFromPoint=function Qi(tt,rn){const ne=[],Le=[];let Lt,on,Kr;for(;(Lt=document.elementFromPoint(tt,rn))&&-1===ne.indexOf(Lt)&&null!=Lt;)ne.push(Lt),Le.push({value:Lt.style.getPropertyValue("pointer-events"),priority:Lt.style.getPropertyPriority("pointer-events")}),Lt.style.setProperty("pointer-events","none","important");for(on=Le.length;Kr=Le[--on];)ne[on].style.setProperty("pointer-events",Kr.value?Kr.value:"",Kr.priority);return ne})},67506:m=>{"use strict";function S(a,f,c){a instanceof RegExp&&(a=i(a,c)),f instanceof RegExp&&(f=i(f,c));var e=r(a,f,c);return e&&{start:e[0],end:e[1],pre:c.slice(0,e[0]),body:c.slice(e[0]+a.length,e[1]),post:c.slice(e[1]+f.length)}}function i(a,f){var c=f.match(a);return c?c[0]:null}function r(a,f,c){var e,p,y,T,C,R=c.indexOf(a),L=c.indexOf(f,R+1),z=R;if(R>=0&&L>0){if(a===f)return[R,L];for(e=[],y=c.length;z>=0&&!C;)z==R?(e.push(z),R=c.indexOf(a,z+1)):1==e.length?C=[e.pop(),L]:((p=e.pop())<y&&(y=p,T=L),L=c.indexOf(f,z+1)),z=R<L&&R>=0?R:L;e.length&&(C=[y,T])}return C}m.exports=S,S.range=r},96434:(m,S)=>{"use strict";S.byteLength=function y(W){var J=p(W),ce=J[1];return 3*(J[0]+ce)/4-ce},S.toByteArray=function C(W){var J,ae,ee=p(W),ce=ee[0],ie=ee[1],U=new a(function T(W,J,ee){return 3*(J+ee)/4-ee}(0,ce,ie)),se=0,ge=ie>0?ce-4:ce;for(ae=0;ae<ge;ae+=4)J=r[W.charCodeAt(ae)]<<18|r[W.charCodeAt(ae+1)]<<12|r[W.charCodeAt(ae+2)]<<6|r[W.charCodeAt(ae+3)],U[se++]=J>>16&255,U[se++]=J>>8&255,U[se++]=255&J;return 2===ie&&(J=r[W.charCodeAt(ae)]<<2|r[W.charCodeAt(ae+1)]>>4,U[se++]=255&J),1===ie&&(J=r[W.charCodeAt(ae)]<<10|r[W.charCodeAt(ae+1)]<<4|r[W.charCodeAt(ae+2)]>>2,U[se++]=J>>8&255,U[se++]=255&J),U},S.fromByteArray=function z(W){for(var J,ee=W.length,ce=ee%3,ie=[],U=16383,se=0,ge=ee-ce;se<ge;se+=U)ie.push(L(W,se,se+U>ge?ge:se+U));return 1===ce?ie.push(i[(J=W[ee-1])>>2]+i[J<<4&63]+"=="):2===ce&&ie.push(i[(J=(W[ee-2]<<8)+W[ee-1])>>10]+i[J>>4&63]+i[J<<2&63]+"="),ie.join("")};for(var i=[],r=[],a="undefined"!=typeof Uint8Array?Uint8Array:Array,f="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/",c=0,e=f.length;c<e;++c)i[c]=f[c],r[f.charCodeAt(c)]=c;function p(W){var J=W.length;if(J%4>0)throw new Error("Invalid string. Length must be a multiple of 4");var ee=W.indexOf("=");return-1===ee&&(ee=J),[ee,ee===J?0:4-ee%4]}function R(W){return i[W>>18&63]+i[W>>12&63]+i[W>>6&63]+i[63&W]}function L(W,J,ee){for(var ie=[],U=J;U<ee;U+=3)ie.push(R((W[U]<<16&16711680)+(W[U+1]<<8&65280)+(255&W[U+2])));return ie.join("")}r["-".charCodeAt(0)]=62,r["_".charCodeAt(0)]=63},33512:(m,S,i)=>{var r=i(2665),a=i(67506);m.exports=function z(se){return se?("{}"===se.substr(0,2)&&(se="\\{\\}"+se.substr(2)),U(function C(se){return se.split("\\\\").join(f).split("\\{").join(c).split("\\}").join(e).split("\\,").join(p).split("\\.").join(y)}(se),!0).map(R)):[]};var f="\0SLASH"+Math.random()+"\0",c="\0OPEN"+Math.random()+"\0",e="\0CLOSE"+Math.random()+"\0",p="\0COMMA"+Math.random()+"\0",y="\0PERIOD"+Math.random()+"\0";function T(se){return parseInt(se,10)==se?parseInt(se,10):se.charCodeAt(0)}function R(se){return se.split(f).join("\\").split(c).join("{").split(e).join("}").split(p).join(",").split(y).join(".")}function L(se){if(!se)return[""];var ge=[],ae=a("{","}",se);if(!ae)return se.split(",");var be=ae.body,we=ae.post,ue=ae.pre.split(",");ue[ue.length-1]+="{"+be+"}";var st=L(we);return we.length&&(ue[ue.length-1]+=st.shift(),ue.push.apply(ue,st)),ge.push.apply(ge,ue),ge}function J(se){return"{"+se+"}"}function ee(se){return/^-?0\d/.test(se)}function ce(se,ge){return se<=ge}function ie(se,ge){return se>=ge}function U(se,ge){var ae=[],he=a("{","}",se);if(!he||/\$$/.test(he.pre))return[se];var We,be=/^-?\d+\.\.-?\d+(?:\.\.-?\d+)?$/.test(he.body),we=/^[a-zA-Z]\.\.[a-zA-Z](?:\.\.-?\d+)?$/.test(he.body),ue=be||we,st=he.body.indexOf(",")>=0;if(!ue&&!st)return he.post.match(/,.*\}/)?U(se=he.pre+"{"+he.body+e+he.post):[se];if(ue)We=he.body.split(/\.\./);else if(1===(We=L(he.body)).length&&1===(We=U(We[0],!1).map(J)).length)return(Be=he.post.length?U(he.post,!1):[""]).map(function(Ei){return he.pre+We[0]+Ei});var xe,Ve=he.pre,Be=he.post.length?U(he.post,!1):[""];if(ue){var je=T(We[0]),Ne=T(We[1]),Bt=Math.max(We[0].length,We[1].length),rt=3==We.length?Math.abs(T(We[2])):1,en=ce;Ne<je&&(rt*=-1,en=ie);var Vt=We.some(ee);xe=[];for(var hn=je;en(hn,Ne);hn+=rt){var vn;if(we)"\\"===(vn=String.fromCharCode(hn))&&(vn="");else if(vn=String(hn),Vt){var mt=Bt-vn.length;if(mt>0){var Nt=new Array(mt+1).join("0");vn=hn<0?"-"+Nt+vn.slice(1):Nt+vn}}xe.push(vn)}}else xe=r(We,function(pr){return U(pr,!1)});for(var St=0;St<xe.length;St++)for(var Yt=0;Yt<Be.length;Yt++){var Fn=Ve+xe[St]+Be[Yt];(!ge||ue||Fn)&&ae.push(Fn)}return ae}},19568:(m,S,i)=>{"use strict";var r=i(18540),a=i(60044),f=a(r("String.prototype.indexOf"));m.exports=function(e,p){var y=r(e,!!p);return"function"==typeof y&&f(e,".prototype.")>-1?a(y):y}},60044:(m,S,i)=>{"use strict";var r=i(75396),a=i(18540),f=a("%Function.prototype.apply%"),c=a("%Function.prototype.call%"),e=a("%Reflect.apply%",!0)||r.call(c,f),p=a("%Object.getOwnPropertyDescriptor%",!0),y=a("%Object.defineProperty%",!0),T=a("%Math.max%");if(y)try{y({},"a",{value:1})}catch(R){y=null}m.exports=function(L){var z=e(r,c,arguments);if(p&&y){var W=p(z,"length");W.configurable&&y(z,"length",{value:1+T(0,L.length-(arguments.length-1))})}return z};var C=function(){return e(r,f,arguments)};y?y(m.exports,"apply",{value:C}):m.exports.apply=C},72318:m=>{var S=!("undefined"==typeof window||!window.document||!window.document.createElement);m.exports=S},6823:function(m,S,i){m.exports=function(r){"use strict";r=r&&r.hasOwnProperty("default")?r.default:r;var c={aliceblue:[240,248,255],antiquewhite:[250,235,215],aqua:[0,255,255],aquamarine:[127,255,212],azure:[240,255,255],beige:[245,245,220],bisque:[255,228,196],black:[0,0,0],blanchedalmond:[255,235,205],blue:[0,0,255],blueviolet:[138,43,226],brown:[165,42,42],burlywood:[222,184,135],cadetblue:[95,158,160],chartreuse:[127,255,0],chocolate:[210,105,30],coral:[255,127,80],cornflowerblue:[100,149,237],cornsilk:[255,248,220],crimson:[220,20,60],cyan:[0,255,255],darkblue:[0,0,139],darkcyan:[0,139,139],darkgoldenrod:[184,134,11],darkgray:[169,169,169],darkgreen:[0,100,0],darkgrey:[169,169,169],darkkhaki:[189,183,107],darkmagenta:[139,0,139],darkolivegreen:[85,107,47],darkorange:[255,140,0],darkorchid:[153,50,204],darkred:[139,0,0],darksalmon:[233,150,122],darkseagreen:[143,188,143],darkslateblue:[72,61,139],darkslategray:[47,79,79],darkslategrey:[47,79,79],darkturquoise:[0,206,209],darkviolet:[148,0,211],deeppink:[255,20,147],deepskyblue:[0,191,255],dimgray:[105,105,105],dimgrey:[105,105,105],dodgerblue:[30,144,255],firebrick:[178,34,34],floralwhite:[255,250,240],forestgreen:[34,139,34],fuchsia:[255,0,255],gainsboro:[220,220,220],ghostwhite:[248,248,255],gold:[255,215,0],goldenrod:[218,165,32],gray:[128,128,128],green:[0,128,0],greenyellow:[173,255,47],grey:[128,128,128],honeydew:[240,255,240],hotpink:[255,105,180],indianred:[205,92,92],indigo:[75,0,130],ivory:[255,255,240],khaki:[240,230,140],lavender:[230,230,250],lavenderblush:[255,240,245],lawngreen:[124,252,0],lemonchiffon:[255,250,205],lightblue:[173,216,230],lightcoral:[240,128,128],lightcyan:[224,255,255],lightgoldenrodyellow:[250,250,210],lightgray:[211,211,211],lightgreen:[144,238,144],lightgrey:[211,211,211],lightpink:[255,182,193],lightsalmon:[255,160,122],lightseagreen:[32,178,170],lightskyblue:[135,206,250],lightslategray:[119,136,153],lightslategrey:[119,136,153],lightsteelblue:[176,196,222],lightyellow:[255,255,224],lime:[0,255,0],limegreen:[50,205,50],linen:[250,240,230],magenta:[255,0,255],maroon:[128,0,0],mediumaquamarine:[102,205,170],mediumblue:[0,0,205],mediumorchid:[186,85,211],mediumpurple:[147,112,219],mediumseagreen:[60,179,113],mediumslateblue:[123,104,238],mediumspringgreen:[0,250,154],mediumturquoise:[72,209,204],mediumvioletred:[199,21,133],midnightblue:[25,25,112],mintcream:[245,255,250],mistyrose:[255,228,225],moccasin:[255,228,181],navajowhite:[255,222,173],navy:[0,0,128],oldlace:[253,245,230],olive:[128,128,0],olivedrab:[107,142,35],orange:[255,165,0],orangered:[255,69,0],orchid:[218,112,214],palegoldenrod:[238,232,170],palegreen:[152,251,152],paleturquoise:[175,238,238],palevioletred:[219,112,147],papayawhip:[255,239,213],peachpuff:[255,218,185],peru:[205,133,63],pink:[255,192,203],plum:[221,160,221],powderblue:[176,224,230],purple:[128,0,128],rebeccapurple:[102,51,153],red:[255,0,0],rosybrown:[188,143,143],royalblue:[65,105,225],saddlebrown:[139,69,19],salmon:[250,128,114],sandybrown:[244,164,96],seagreen:[46,139,87],seashell:[255,245,238],sienna:[160,82,45],silver:[192,192,192],skyblue:[135,206,235],slateblue:[106,90,205],slategray:[112,128,144],slategrey:[112,128,144],snow:[255,250,250],springgreen:[0,255,127],steelblue:[70,130,180],tan:[210,180,140],teal:[0,128,128],thistle:[216,191,216],tomato:[255,99,71],turquoise:[64,224,208],violet:[238,130,238],wheat:[245,222,179],white:[255,255,255],whitesmoke:[245,245,245],yellow:[255,255,0],yellowgreen:[154,205,50]},e=function a(h,E){return h(E={exports:{}},E.exports),E.exports}(function(h){var E={};for(var x in c)c.hasOwnProperty(x)&&(E[c[x]]=x);var F=h.exports={rgb:{channels:3,labels:"rgb"},hsl:{channels:3,labels:"hsl"},hsv:{channels:3,labels:"hsv"},hwb:{channels:3,labels:"hwb"},cmyk:{channels:4,labels:"cmyk"},xyz:{channels:3,labels:"xyz"},lab:{channels:3,labels:"lab"},lch:{channels:3,labels:"lch"},hex:{channels:1,labels:["hex"]},keyword:{channels:1,labels:["keyword"]},ansi16:{channels:1,labels:["ansi16"]},ansi256:{channels:1,labels:["ansi256"]},hcg:{channels:3,labels:["h","c","g"]},apple:{channels:3,labels:["r16","g16","b16"]},gray:{channels:1,labels:["gray"]}};for(var Q in F)if(F.hasOwnProperty(Q)){if(!("channels"in F[Q]))throw new Error("missing channels property: "+Q);if(!("labels"in F[Q]))throw new Error("missing channel labels property: "+Q);if(F[Q].labels.length!==F[Q].channels)throw new Error("channel and label counts mismatch: "+Q);var le=F[Q].channels,me=F[Q].labels;delete F[Q].channels,delete F[Q].labels,Object.defineProperty(F[Q],"channels",{value:le}),Object.defineProperty(F[Q],"labels",{value:me})}function Fe(Oe,Je){return Math.pow(Oe[0]-Je[0],2)+Math.pow(Oe[1]-Je[1],2)+Math.pow(Oe[2]-Je[2],2)}F.rgb.hsl=function(Oe){var ar,$i,Je=Oe[0]/255,ht=Oe[1]/255,gt=Oe[2]/255,nn=Math.min(Je,ht,gt),$n=Math.max(Je,ht,gt),Bn=$n-nn;return $n===nn?ar=0:Je===$n?ar=(ht-gt)/Bn:ht===$n?ar=2+(gt-Je)/Bn:gt===$n&&(ar=4+(Je-ht)/Bn),(ar=Math.min(60*ar,360))<0&&(ar+=360),$i=(nn+$n)/2,[ar,100*($n===nn?0:$i<=.5?Bn/($n+nn):Bn/(2-$n-nn)),100*$i]},F.rgb.hsv=function(Oe){var Je,ht,gt,nn,$n,Bn=Oe[0]/255,ar=Oe[1]/255,Pr=Oe[2]/255,$i=Math.max(Bn,ar,Pr),is=$i-Math.min(Bn,ar,Pr),Eo=function(Gs){return($i-Gs)/6/is+.5};return 0===is?nn=$n=0:($n=is/$i,Je=Eo(Bn),ht=Eo(ar),gt=Eo(Pr),Bn===$i?nn=gt-ht:ar===$i?nn=1/3+Je-gt:Pr===$i&&(nn=2/3+ht-Je),nn<0?nn+=1:nn>1&&(nn-=1)),[360*nn,100*$n,100*$i]},F.rgb.hwb=function(Oe){var Je=Oe[0],ht=Oe[1],gt=Oe[2];return[F.rgb.hsl(Oe)[0],1/255*Math.min(Je,Math.min(ht,gt))*100,100*(gt=1-1/255*Math.max(Je,Math.max(ht,gt)))]},F.rgb.cmyk=function(Oe){var ar,Je=Oe[0]/255,ht=Oe[1]/255,gt=Oe[2]/255;return[100*((1-Je-(ar=Math.min(1-Je,1-ht,1-gt)))/(1-ar)||0),100*((1-ht-ar)/(1-ar)||0),100*((1-gt-ar)/(1-ar)||0),100*ar]},F.rgb.keyword=function(Oe){var Je=E[Oe];if(Je)return Je;var gt,ht=1/0;for(var nn in c)if(c.hasOwnProperty(nn)){var Bn=Fe(Oe,c[nn]);Bn<ht&&(ht=Bn,gt=nn)}return gt},F.keyword.rgb=function(Oe){return c[Oe]},F.rgb.xyz=function(Oe){var Je=Oe[0]/255,ht=Oe[1]/255,gt=Oe[2]/255;return[100*(.4124*(Je=Je>.04045?Math.pow((Je+.055)/1.055,2.4):Je/12.92)+.3576*(ht=ht>.04045?Math.pow((ht+.055)/1.055,2.4):ht/12.92)+.1805*(gt=gt>.04045?Math.pow((gt+.055)/1.055,2.4):gt/12.92)),100*(.2126*Je+.7152*ht+.0722*gt),100*(.0193*Je+.1192*ht+.9505*gt)]},F.rgb.lab=function(Oe){var Je=F.rgb.xyz(Oe),ht=Je[0],gt=Je[1],nn=Je[2];return gt/=100,nn/=108.883,ht=(ht/=95.047)>.008856?Math.pow(ht,1/3):7.787*ht+16/116,[116*(gt=gt>.008856?Math.pow(gt,1/3):7.787*gt+16/116)-16,500*(ht-gt),200*(gt-(nn=nn>.008856?Math.pow(nn,1/3):7.787*nn+16/116))]},F.hsl.rgb=function(Oe){var nn,$n,Bn,ar,Pr,Je=Oe[0]/360,ht=Oe[1]/100,gt=Oe[2]/100;if(0===ht)return[Pr=255*gt,Pr,Pr];nn=2*gt-($n=gt<.5?gt*(1+ht):gt+ht-gt*ht),ar=[0,0,0];for(var $i=0;$i<3;$i++)(Bn=Je+1/3*-($i-1))<0&&Bn++,Bn>1&&Bn--,ar[$i]=255*(Pr=6*Bn<1?nn+6*($n-nn)*Bn:2*Bn<1?$n:3*Bn<2?nn+($n-nn)*(2/3-Bn)*6:nn);return ar},F.hsl.hsv=function(Oe){var Je=Oe[0],ht=Oe[1]/100,gt=Oe[2]/100,nn=ht,$n=Math.max(gt,.01);return ht*=(gt*=2)<=1?gt:2-gt,nn*=$n<=1?$n:2-$n,[Je,100*(0===gt?2*nn/($n+nn):2*ht/(gt+ht)),(gt+ht)/2*100]},F.hsv.rgb=function(Oe){var Je=Oe[0]/60,ht=Oe[1]/100,gt=Oe[2]/100,nn=Math.floor(Je)%6,$n=Je-Math.floor(Je),Bn=255*gt*(1-ht),ar=255*gt*(1-ht*$n),Pr=255*gt*(1-ht*(1-$n));switch(gt*=255,nn){case 0:return[gt,Pr,Bn];case 1:return[ar,gt,Bn];case 2:return[Bn,gt,Pr];case 3:return[Bn,ar,gt];case 4:return[Pr,Bn,gt];case 5:return[gt,Bn,ar]}},F.hsv.hsl=function(Oe){var $n,Bn,ar,Je=Oe[0],ht=Oe[1]/100,gt=Oe[2]/100,nn=Math.max(gt,.01);return ar=(2-ht)*gt,Bn=ht*nn,[Je,100*(Bn=(Bn/=($n=(2-ht)*nn)<=1?$n:2-$n)||0),100*(ar/=2)]},F.hwb.rgb=function(Oe){var $n,Bn,ar,Pr,$i,is,Eo,Je=Oe[0]/360,ht=Oe[1]/100,gt=Oe[2]/100,nn=ht+gt;switch(nn>1&&(ht/=nn,gt/=nn),ar=6*Je-($n=Math.floor(6*Je)),0!=(1&$n)&&(ar=1-ar),Pr=ht+ar*((Bn=1-gt)-ht),$n){default:case 6:case 0:$i=Bn,is=Pr,Eo=ht;break;case 1:$i=Pr,is=Bn,Eo=ht;break;case 2:$i=ht,is=Bn,Eo=Pr;break;case 3:$i=ht,is=Pr,Eo=Bn;break;case 4:$i=Pr,is=ht,Eo=Bn;break;case 5:$i=Bn,is=ht,Eo=Pr}return[255*$i,255*is,255*Eo]},F.cmyk.rgb=function(Oe){var ht=Oe[1]/100,gt=Oe[2]/100,nn=Oe[3]/100;return[255*(1-Math.min(1,Oe[0]/100*(1-nn)+nn)),255*(1-Math.min(1,ht*(1-nn)+nn)),255*(1-Math.min(1,gt*(1-nn)+nn))]},F.xyz.rgb=function(Oe){var nn,$n,Bn,Je=Oe[0]/100,ht=Oe[1]/100,gt=Oe[2]/100;return $n=-.9689*Je+1.8758*ht+.0415*gt,Bn=.0557*Je+-.204*ht+1.057*gt,nn=(nn=3.2406*Je+-1.5372*ht+-.4986*gt)>.0031308?1.055*Math.pow(nn,1/2.4)-.055:12.92*nn,$n=$n>.0031308?1.055*Math.pow($n,1/2.4)-.055:12.92*$n,Bn=Bn>.0031308?1.055*Math.pow(Bn,1/2.4)-.055:12.92*Bn,[255*(nn=Math.min(Math.max(0,nn),1)),255*($n=Math.min(Math.max(0,$n),1)),255*(Bn=Math.min(Math.max(0,Bn),1))]},F.xyz.lab=function(Oe){var Je=Oe[0],ht=Oe[1],gt=Oe[2];return ht/=100,gt/=108.883,Je=(Je/=95.047)>.008856?Math.pow(Je,1/3):7.787*Je+16/116,[116*(ht=ht>.008856?Math.pow(ht,1/3):7.787*ht+16/116)-16,500*(Je-ht),200*(ht-(gt=gt>.008856?Math.pow(gt,1/3):7.787*gt+16/116))]},F.lab.xyz=function(Oe){var nn,$n,Bn;nn=Oe[1]/500+($n=(Oe[0]+16)/116),Bn=$n-Oe[2]/200;var ar=Math.pow($n,3),Pr=Math.pow(nn,3),$i=Math.pow(Bn,3);return $n=ar>.008856?ar:($n-16/116)/7.787,nn=Pr>.008856?Pr:(nn-16/116)/7.787,Bn=$i>.008856?$i:(Bn-16/116)/7.787,[nn*=95.047,$n*=100,Bn*=108.883]},F.lab.lch=function(Oe){var $n,Je=Oe[0],ht=Oe[1],gt=Oe[2];return($n=360*Math.atan2(gt,ht)/2/Math.PI)<0&&($n+=360),[Je,Math.sqrt(ht*ht+gt*gt),$n]},F.lch.lab=function(Oe){var Bn,ht=Oe[1];return Bn=Oe[2]/360*2*Math.PI,[Oe[0],ht*Math.cos(Bn),ht*Math.sin(Bn)]},F.rgb.ansi16=function(Oe){var Je=Oe[0],ht=Oe[1],gt=Oe[2],nn=1 in arguments?arguments[1]:F.rgb.hsv(Oe)[2];if(0===(nn=Math.round(nn/50)))return 30;var $n=30+(Math.round(gt/255)<<2|Math.round(ht/255)<<1|Math.round(Je/255));return 2===nn&&($n+=60),$n},F.hsv.ansi16=function(Oe){return F.rgb.ansi16(F.hsv.rgb(Oe),Oe[2])},F.rgb.ansi256=function(Oe){var Je=Oe[0],ht=Oe[1],gt=Oe[2];return Je===ht&&ht===gt?Je<8?16:Je>248?231:Math.round((Je-8)/247*24)+232:16+36*Math.round(Je/255*5)+6*Math.round(ht/255*5)+Math.round(gt/255*5)},F.ansi16.rgb=function(Oe){var Je=Oe%10;if(0===Je||7===Je)return Oe>50&&(Je+=3.5),[Je=Je/10.5*255,Je,Je];var ht=.5*(1+~~(Oe>50));return[(1&Je)*ht*255,(Je>>1&1)*ht*255,(Je>>2&1)*ht*255]},F.ansi256.rgb=function(Oe){if(Oe>=232){var Je=10*(Oe-232)+8;return[Je,Je,Je]}var ht;return Oe-=16,[Math.floor(Oe/36)/5*255,Math.floor((ht=Oe%36)/6)/5*255,ht%6/5*255]},F.rgb.hex=function(Oe){var ht=(((255&Math.round(Oe[0]))<<16)+((255&Math.round(Oe[1]))<<8)+(255&Math.round(Oe[2]))).toString(16).toUpperCase();return"000000".substring(ht.length)+ht},F.hex.rgb=function(Oe){var Je=Oe.toString(16).match(/[a-f0-9]{6}|[a-f0-9]{3}/i);if(!Je)return[0,0,0];var ht=Je[0];3===Je[0].length&&(ht=ht.split("").map(function(ar){return ar+ar}).join(""));var gt=parseInt(ht,16);return[gt>>16&255,gt>>8&255,255&gt]},F.rgb.hcg=function(Oe){var Pr,Je=Oe[0]/255,ht=Oe[1]/255,gt=Oe[2]/255,nn=Math.max(Math.max(Je,ht),gt),$n=Math.min(Math.min(Je,ht),gt),Bn=nn-$n;return Pr=Bn<=0?0:nn===Je?(ht-gt)/Bn%6:nn===ht?2+(gt-Je)/Bn:4+(Je-ht)/Bn+4,Pr/=6,[360*(Pr%=1),100*Bn,100*(Bn<1?$n/(1-Bn):0)]},F.hsl.hcg=function(Oe){var gt,Je=Oe[1]/100,ht=Oe[2]/100,nn=0;return(gt=ht<.5?2*Je*ht:2*Je*(1-ht))<1&&(nn=(ht-.5*gt)/(1-gt)),[Oe[0],100*gt,100*nn]},F.hsv.hcg=function(Oe){var ht=Oe[2]/100,gt=Oe[1]/100*ht,nn=0;return gt<1&&(nn=(ht-gt)/(1-gt)),[Oe[0],100*gt,100*nn]},F.hcg.rgb=function(Oe){var ht=Oe[1]/100,gt=Oe[2]/100;if(0===ht)return[255*gt,255*gt,255*gt];var Pr,nn=[0,0,0],$n=Oe[0]/360%1*6,Bn=$n%1,ar=1-Bn;switch(Math.floor($n)){case 0:nn[0]=1,nn[1]=Bn,nn[2]=0;break;case 1:nn[0]=ar,nn[1]=1,nn[2]=0;break;case 2:nn[0]=0,nn[1]=1,nn[2]=Bn;break;case 3:nn[0]=0,nn[1]=ar,nn[2]=1;break;case 4:nn[0]=Bn,nn[1]=0,nn[2]=1;break;default:nn[0]=1,nn[1]=0,nn[2]=ar}return[255*(ht*nn[0]+(Pr=(1-ht)*gt)),255*(ht*nn[1]+Pr),255*(ht*nn[2]+Pr)]},F.hcg.hsv=function(Oe){var Je=Oe[1]/100,gt=Je+Oe[2]/100*(1-Je),nn=0;return gt>0&&(nn=Je/gt),[Oe[0],100*nn,100*gt]},F.hcg.hsl=function(Oe){var Je=Oe[1]/100,gt=Oe[2]/100*(1-Je)+.5*Je,nn=0;return gt>0&&gt<.5?nn=Je/(2*gt):gt>=.5&&gt<1&&(nn=Je/(2*(1-gt))),[Oe[0],100*nn,100*gt]},F.hcg.hwb=function(Oe){var Je=Oe[1]/100,gt=Je+Oe[2]/100*(1-Je);return[Oe[0],100*(gt-Je),100*(1-gt)]},F.hwb.hcg=function(Oe){var gt=1-Oe[2]/100,nn=gt-Oe[1]/100,$n=0;return nn<1&&($n=(gt-nn)/(1-nn)),[Oe[0],100*nn,100*$n]},F.apple.rgb=function(Oe){return[Oe[0]/65535*255,Oe[1]/65535*255,Oe[2]/65535*255]},F.rgb.apple=function(Oe){return[Oe[0]/255*65535,Oe[1]/255*65535,Oe[2]/255*65535]},F.gray.rgb=function(Oe){return[Oe[0]/100*255,Oe[0]/100*255,Oe[0]/100*255]},F.gray.hsl=F.gray.hsv=function(Oe){return[0,0,Oe[0]]},F.gray.hwb=function(Oe){return[0,100,Oe[0]]},F.gray.cmyk=function(Oe){return[0,0,0,Oe[0]]},F.gray.lab=function(Oe){return[Oe[0],0,0]},F.gray.hex=function(Oe){var Je=255&Math.round(Oe[0]/100*255),gt=((Je<<16)+(Je<<8)+Je).toString(16).toUpperCase();return"000000".substring(gt.length)+gt},F.rgb.gray=function(Oe){return[(Oe[0]+Oe[1]+Oe[2])/3/255*100]}});function he(h){var E=function ae(){for(var h={},E=Object.keys(e),x=E.length,F=0;F<x;F++)h[E[F]]={distance:-1,parent:null};return h}(),x=[h];for(E[h].distance=0;x.length;)for(var F=x.pop(),Q=Object.keys(e[F]),le=Q.length,me=0;me<le;me++){var Fe=Q[me],Oe=E[Fe];-1===Oe.distance&&(Oe.distance=E[F].distance+1,Oe.parent=F,x.unshift(Fe))}return E}function be(h,E){return function(x){return E(h(x))}}function we(h,E){for(var x=[E[h].parent,h],F=e[E[h].parent][h],Q=E[h].parent;E[Q].parent;)x.unshift(E[Q].parent),F=be(e[E[Q].parent][Q],F),Q=E[Q].parent;return F.conversion=x,F}var st={};Object.keys(e).forEach(function(h){st[h]={},Object.defineProperty(st[h],"channels",{value:e[h].channels}),Object.defineProperty(st[h],"labels",{value:e[h].labels});var E=function(h){for(var E=he(h),x={},F=Object.keys(E),Q=F.length,le=0;le<Q;le++){var me=F[le];null!==E[me].parent&&(x[me]=we(me,E))}return x}(h);Object.keys(E).forEach(function(F){var Q=E[F];st[h][F]=function Be(h){var E=function(x){if(null==x)return x;arguments.length>1&&(x=Array.prototype.slice.call(arguments));var F=h(x);if("object"==typeof F)for(var Q=F.length,le=0;le<Q;le++)F[le]=Math.round(F[le]);return F};return"conversion"in h&&(E.conversion=h.conversion),E}(Q),st[h][F].raw=function Ve(h){var E=function(x){return null==x?x:(arguments.length>1&&(x=Array.prototype.slice.call(arguments)),h(x))};return"conversion"in h&&(E.conversion=h.conversion),E}(Q)})});var xe=st,je={aliceblue:[240,248,255],antiquewhite:[250,235,215],aqua:[0,255,255],aquamarine:[127,255,212],azure:[240,255,255],beige:[245,245,220],bisque:[255,228,196],black:[0,0,0],blanchedalmond:[255,235,205],blue:[0,0,255],blueviolet:[138,43,226],brown:[165,42,42],burlywood:[222,184,135],cadetblue:[95,158,160],chartreuse:[127,255,0],chocolate:[210,105,30],coral:[255,127,80],cornflowerblue:[100,149,237],cornsilk:[255,248,220],crimson:[220,20,60],cyan:[0,255,255],darkblue:[0,0,139],darkcyan:[0,139,139],darkgoldenrod:[184,134,11],darkgray:[169,169,169],darkgreen:[0,100,0],darkgrey:[169,169,169],darkkhaki:[189,183,107],darkmagenta:[139,0,139],darkolivegreen:[85,107,47],darkorange:[255,140,0],darkorchid:[153,50,204],darkred:[139,0,0],darksalmon:[233,150,122],darkseagreen:[143,188,143],darkslateblue:[72,61,139],darkslategray:[47,79,79],darkslategrey:[47,79,79],darkturquoise:[0,206,209],darkviolet:[148,0,211],deeppink:[255,20,147],deepskyblue:[0,191,255],dimgray:[105,105,105],dimgrey:[105,105,105],dodgerblue:[30,144,255],firebrick:[178,34,34],floralwhite:[255,250,240],forestgreen:[34,139,34],fuchsia:[255,0,255],gainsboro:[220,220,220],ghostwhite:[248,248,255],gold:[255,215,0],goldenrod:[218,165,32],gray:[128,128,128],green:[0,128,0],greenyellow:[173,255,47],grey:[128,128,128],honeydew:[240,255,240],hotpink:[255,105,180],indianred:[205,92,92],indigo:[75,0,130],ivory:[255,255,240],khaki:[240,230,140],lavender:[230,230,250],lavenderblush:[255,240,245],lawngreen:[124,252,0],lemonchiffon:[255,250,205],lightblue:[173,216,230],lightcoral:[240,128,128],lightcyan:[224,255,255],lightgoldenrodyellow:[250,250,210],lightgray:[211,211,211],lightgreen:[144,238,144],lightgrey:[211,211,211],lightpink:[255,182,193],lightsalmon:[255,160,122],lightseagreen:[32,178,170],lightskyblue:[135,206,250],lightslategray:[119,136,153],lightslategrey:[119,136,153],lightsteelblue:[176,196,222],lightyellow:[255,255,224],lime:[0,255,0],limegreen:[50,205,50],linen:[250,240,230],magenta:[255,0,255],maroon:[128,0,0],mediumaquamarine:[102,205,170],mediumblue:[0,0,205],mediumorchid:[186,85,211],mediumpurple:[147,112,219],mediumseagreen:[60,179,113],mediumslateblue:[123,104,238],mediumspringgreen:[0,250,154],mediumturquoise:[72,209,204],mediumvioletred:[199,21,133],midnightblue:[25,25,112],mintcream:[245,255,250],mistyrose:[255,228,225],moccasin:[255,228,181],navajowhite:[255,222,173],navy:[0,0,128],oldlace:[253,245,230],olive:[128,128,0],olivedrab:[107,142,35],orange:[255,165,0],orangered:[255,69,0],orchid:[218,112,214],palegoldenrod:[238,232,170],palegreen:[152,251,152],paleturquoise:[175,238,238],palevioletred:[219,112,147],papayawhip:[255,239,213],peachpuff:[255,218,185],peru:[205,133,63],pink:[255,192,203],plum:[221,160,221],powderblue:[176,224,230],purple:[128,0,128],rebeccapurple:[102,51,153],red:[255,0,0],rosybrown:[188,143,143],royalblue:[65,105,225],saddlebrown:[139,69,19],salmon:[250,128,114],sandybrown:[244,164,96],seagreen:[46,139,87],seashell:[255,245,238],sienna:[160,82,45],silver:[192,192,192],skyblue:[135,206,235],slateblue:[106,90,205],slategray:[112,128,144],slategrey:[112,128,144],snow:[255,250,250],springgreen:[0,255,127],steelblue:[70,130,180],tan:[210,180,140],teal:[0,128,128],thistle:[216,191,216],tomato:[255,99,71],turquoise:[64,224,208],violet:[238,130,238],wheat:[245,222,179],white:[255,255,255],whitesmoke:[245,245,245],yellow:[255,255,0],yellowgreen:[154,205,50]},Ne={getRgba:Bt,getHsla:rt,getRgb:function Pt(h){var E=Bt(h);return E&&E.slice(0,3)},getHsl:function Vt(h){var E=rt(h);return E&&E.slice(0,3)},getHwb:en,getAlpha:function hn(h){var E=Bt(h);return E||(E=rt(h))||(E=en(h))?E[3]:void 0},hexString:function vn(h,x){return x=void 0!==x&&3===h.length?x:h[3],"#"+$r(h[0])+$r(h[1])+$r(h[2])+(x>=0&&x<1?$r(Math.round(255*x)):"")},rgbString:function mt(h,E){return E<1||h[3]&&h[3]<1?Nt(h,E):"rgb("+h[0]+", "+h[1]+", "+h[2]+")"},rgbaString:Nt,percentString:function St(h,E){return E<1||h[3]&&h[3]<1?Yt(h,E):"rgb("+Math.round(h[0]/255*100)+"%, "+Math.round(h[1]/255*100)+"%, "+Math.round(h[2]/255*100)+"%)"},percentaString:Yt,hslString:function Fn(h,E){return E<1||h[3]&&h[3]<1?pr(h,E):"hsl("+h[0]+", "+h[1]+"%, "+h[2]+"%)"},hslaString:pr,hwbString:function Ei(h,E){return void 0===E&&(E=void 0!==h[3]?h[3]:1),"hwb("+h[0]+", "+h[1]+"%, "+h[2]+"%"+(void 0!==E&&1!==E?", "+E:"")+")"},keyword:function mi(h){return Br[h.slice(0,3)]}};function Bt(h){if(h){var me=[0,0,0],Fe=1,Oe=h.match(/^#([a-fA-F0-9]{3,4})$/i),Je="";if(Oe){Je=(Oe=Oe[1])[3];for(var ht=0;ht<me.length;ht++)me[ht]=parseInt(Oe[ht]+Oe[ht],16);Je&&(Fe=Math.round(parseInt(Je+Je,16)/255*100)/100)}else if(Oe=h.match(/^#([a-fA-F0-9]{6}([a-fA-F0-9]{2})?)$/i)){for(Je=Oe[2],Oe=Oe[1],ht=0;ht<me.length;ht++)me[ht]=parseInt(Oe.slice(2*ht,2*ht+2),16);Je&&(Fe=Math.round(parseInt(Je,16)/255*100)/100)}else if(Oe=h.match(/^rgba?\(\s*([+-]?\d+)\s*,\s*([+-]?\d+)\s*,\s*([+-]?\d+)\s*(?:,\s*([+-]?[\d\.]+)\s*)?\)$/i)){for(ht=0;ht<me.length;ht++)me[ht]=parseInt(Oe[ht+1]);Fe=parseFloat(Oe[4])}else if(Oe=h.match(/^rgba?\(\s*([+-]?[\d\.]+)\%\s*,\s*([+-]?[\d\.]+)\%\s*,\s*([+-]?[\d\.]+)\%\s*(?:,\s*([+-]?[\d\.]+)\s*)?\)$/i)){for(ht=0;ht<me.length;ht++)me[ht]=Math.round(2.55*parseFloat(Oe[ht+1]));Fe=parseFloat(Oe[4])}else if(Oe=h.match(/(\w+)/)){if("transparent"==Oe[1])return[0,0,0,0];if(!(me=je[Oe[1]]))return}for(ht=0;ht<me.length;ht++)me[ht]=ur(me[ht],0,255);return Fe=Fe||0==Fe?ur(Fe,0,1):1,me[3]=Fe,me}}function rt(h){if(h){var x=h.match(/^hsla?\(\s*([+-]?\d+)(?:deg)?\s*,\s*([+-]?[\d\.]+)%\s*,\s*([+-]?[\d\.]+)%\s*(?:,\s*([+-]?[\d\.]+)\s*)?\)/);if(x){var F=parseFloat(x[4]);return[ur(parseInt(x[1]),0,360),ur(parseFloat(x[2]),0,100),ur(parseFloat(x[3]),0,100),ur(isNaN(F)?1:F,0,1)]}}}function en(h){if(h){var x=h.match(/^hwb\(\s*([+-]?\d+)(?:deg)?\s*,\s*([+-]?[\d\.]+)%\s*,\s*([+-]?[\d\.]+)%\s*(?:,\s*([+-]?[\d\.]+)\s*)?\)/);if(x){var F=parseFloat(x[4]);return[ur(parseInt(x[1]),0,360),ur(parseFloat(x[2]),0,100),ur(parseFloat(x[3]),0,100),ur(isNaN(F)?1:F,0,1)]}}}function Nt(h,E){return void 0===E&&(E=void 0!==h[3]?h[3]:1),"rgba("+h[0]+", "+h[1]+", "+h[2]+", "+E+")"}function Yt(h,E){return"rgba("+Math.round(h[0]/255*100)+"%, "+Math.round(h[1]/255*100)+"%, "+Math.round(h[2]/255*100)+"%, "+(E||h[3]||1)+")"}function pr(h,E){return void 0===E&&(E=void 0!==h[3]?h[3]:1),"hsla("+h[0]+", "+h[1]+"%, "+h[2]+"%, "+E+")"}function ur(h,E,x){return Math.min(Math.max(E,h),x)}function $r(h){var E=h.toString(16).toUpperCase();return E.length<2?"0"+E:E}var Br={};for(var Pn in je)Br[je[Pn]]=Pn;var Xn=function(h){return h instanceof Xn?h:this instanceof Xn?(this.valid=!1,this.values={rgb:[0,0,0],hsl:[0,0,0],hsv:[0,0,0],hwb:[0,0,0],cmyk:[0,0,0,0],alpha:1},void("string"==typeof h?(E=Ne.getRgba(h))?this.setValues("rgb",E):(E=Ne.getHsla(h))?this.setValues("hsl",E):(E=Ne.getHwb(h))&&this.setValues("hwb",E):"object"==typeof h&&(void 0!==(E=h).r||void 0!==E.red?this.setValues("rgb",E):void 0!==E.l||void 0!==E.lightness?this.setValues("hsl",E):void 0!==E.v||void 0!==E.value?this.setValues("hsv",E):void 0!==E.w||void 0!==E.whiteness?this.setValues("hwb",E):(void 0!==E.c||void 0!==E.cyan)&&this.setValues("cmyk",E)))):new Xn(h);var E};Xn.prototype={isValid:function(){return this.valid},rgb:function(){return this.setSpace("rgb",arguments)},hsl:function(){return this.setSpace("hsl",arguments)},hsv:function(){return this.setSpace("hsv",arguments)},hwb:function(){return this.setSpace("hwb",arguments)},cmyk:function(){return this.setSpace("cmyk",arguments)},rgbArray:function(){return this.values.rgb},hslArray:function(){return this.values.hsl},hsvArray:function(){return this.values.hsv},hwbArray:function(){var h=this.values;return 1!==h.alpha?h.hwb.concat([h.alpha]):h.hwb},cmykArray:function(){return this.values.cmyk},rgbaArray:function(){var h=this.values;return h.rgb.concat([h.alpha])},hslaArray:function(){var h=this.values;return h.hsl.concat([h.alpha])},alpha:function(h){return void 0===h?this.values.alpha:(this.setValues("alpha",h),this)},red:function(h){return this.setChannel("rgb",0,h)},green:function(h){return this.setChannel("rgb",1,h)},blue:function(h){return this.setChannel("rgb",2,h)},hue:function(h){return h&&(h=(h%=360)<0?360+h:h),this.setChannel("hsl",0,h)},saturation:function(h){return this.setChannel("hsl",1,h)},lightness:function(h){return this.setChannel("hsl",2,h)},saturationv:function(h){return this.setChannel("hsv",1,h)},whiteness:function(h){return this.setChannel("hwb",1,h)},blackness:function(h){return this.setChannel("hwb",2,h)},value:function(h){return this.setChannel("hsv",2,h)},cyan:function(h){return this.setChannel("cmyk",0,h)},magenta:function(h){return this.setChannel("cmyk",1,h)},yellow:function(h){return this.setChannel("cmyk",2,h)},black:function(h){return this.setChannel("cmyk",3,h)},hexString:function(){return Ne.hexString(this.values.rgb)},rgbString:function(){return Ne.rgbString(this.values.rgb,this.values.alpha)},rgbaString:function(){return Ne.rgbaString(this.values.rgb,this.values.alpha)},percentString:function(){return Ne.percentString(this.values.rgb,this.values.alpha)},hslString:function(){return Ne.hslString(this.values.hsl,this.values.alpha)},hslaString:function(){return Ne.hslaString(this.values.hsl,this.values.alpha)},hwbString:function(){return Ne.hwbString(this.values.hwb,this.values.alpha)},keyword:function(){return Ne.keyword(this.values.rgb,this.values.alpha)},rgbNumber:function(){var h=this.values.rgb;return h[0]<<16|h[1]<<8|h[2]},luminosity:function(){for(var h=this.values.rgb,E=[],x=0;x<h.length;x++){var F=h[x]/255;E[x]=F<=.03928?F/12.92:Math.pow((F+.055)/1.055,2.4)}return.2126*E[0]+.7152*E[1]+.0722*E[2]},contrast:function(h){var E=this.luminosity(),x=h.luminosity();return E>x?(E+.05)/(x+.05):(x+.05)/(E+.05)},level:function(h){var E=this.contrast(h);return E>=7.1?"AAA":E>=4.5?"AA":""},dark:function(){var h=this.values.rgb;return(299*h[0]+587*h[1]+114*h[2])/1e3<128},light:function(){return!this.dark()},negate:function(){for(var h=[],E=0;E<3;E++)h[E]=255-this.values.rgb[E];return this.setValues("rgb",h),this},lighten:function(h){var E=this.values.hsl;return E[2]+=E[2]*h,this.setValues("hsl",E),this},darken:function(h){var E=this.values.hsl;return E[2]-=E[2]*h,this.setValues("hsl",E),this},saturate:function(h){var E=this.values.hsl;return E[1]+=E[1]*h,this.setValues("hsl",E),this},desaturate:function(h){var E=this.values.hsl;return E[1]-=E[1]*h,this.setValues("hsl",E),this},whiten:function(h){var E=this.values.hwb;return E[1]+=E[1]*h,this.setValues("hwb",E),this},blacken:function(h){var E=this.values.hwb;return E[2]+=E[2]*h,this.setValues("hwb",E),this},greyscale:function(){var h=this.values.rgb,E=.3*h[0]+.59*h[1]+.11*h[2];return this.setValues("rgb",[E,E,E]),this},clearer:function(h){var E=this.values.alpha;return this.setValues("alpha",E-E*h),this},opaquer:function(h){var E=this.values.alpha;return this.setValues("alpha",E+E*h),this},rotate:function(h){var E=this.values.hsl,x=(E[0]+h)%360;return E[0]=x<0?360+x:x,this.setValues("hsl",E),this},mix:function(h,E){var x=this,F=h,Q=void 0===E?.5:E,le=2*Q-1,me=x.alpha()-F.alpha(),Fe=((le*me==-1?le:(le+me)/(1+le*me))+1)/2,Oe=1-Fe;return this.rgb(Fe*x.red()+Oe*F.red(),Fe*x.green()+Oe*F.green(),Fe*x.blue()+Oe*F.blue()).alpha(x.alpha()*Q+F.alpha()*(1-Q))},toJSON:function(){return this.rgb()},clone:function(){var F,Q,h=new Xn,E=this.values,x=h.values;for(var le in E)E.hasOwnProperty(le)&&("[object Array]"===(Q={}.toString.call(F=E[le]))?x[le]=F.slice(0):"[object Number]"===Q?x[le]=F:console.error("unexpected color value:",F));return h}},Xn.prototype.spaces={rgb:["red","green","blue"],hsl:["hue","saturation","lightness"],hsv:["hue","saturation","value"],hwb:["hue","whiteness","blackness"],cmyk:["cyan","magenta","yellow","black"]},Xn.prototype.maxes={rgb:[255,255,255],hsl:[360,100,100],hsv:[360,100,100],hwb:[360,100,100],cmyk:[100,100,100,100]},Xn.prototype.getValues=function(h){for(var E=this.values,x={},F=0;F<h.length;F++)x[h.charAt(F)]=E[h][F];return 1!==E.alpha&&(x.a=E.alpha),x},Xn.prototype.setValues=function(h,E){var me,Oe,x=this.values,F=this.spaces,Q=this.maxes,le=1;if(this.valid=!0,"alpha"===h)le=E;else if(E.length)x[h]=E.slice(0,h.length),le=E[h.length];else if(void 0!==E[h.charAt(0)]){for(me=0;me<h.length;me++)x[h][me]=E[h.charAt(me)];le=E.a}else if(void 0!==E[F[h][0]]){var Fe=F[h];for(me=0;me<h.length;me++)x[h][me]=E[Fe[me]];le=E.alpha}if(x.alpha=Math.max(0,Math.min(1,void 0===le?x.alpha:le)),"alpha"===h)return!1;for(me=0;me<h.length;me++)Oe=Math.max(0,Math.min(Q[h][me],x[h][me])),x[h][me]=Math.round(Oe);for(var Je in F)Je!==h&&(x[Je]=xe[h][Je](x[h]));return!0},Xn.prototype.setSpace=function(h,E){var x=E[0];return void 0===x?this.getValues(h):("number"==typeof x&&(x=Array.prototype.slice.call(E)),this.setValues(h,x),this)},Xn.prototype.setChannel=function(h,E,x){var F=this.values[h];return void 0===x?F[E]:(x===F[E]||(F[E]=x,this.setValues(h,F)),this)},"undefined"!=typeof window&&(window.Color=Xn);var dr=Xn;function Qr(h){return-1===["__proto__","prototype","constructor"].indexOf(h)}var h,Ci={noop:function(){},uid:(h=0,function(){return h++}),isNullOrUndef:function(h){return null==h},isArray:function(h){if(Array.isArray&&Array.isArray(h))return!0;var E=Object.prototype.toString.call(h);return"[object"===E.substr(0,7)&&"Array]"===E.substr(-6)},isObject:function(h){return null!==h&&"[object Object]"===Object.prototype.toString.call(h)},isFinite:function(h){return("number"==typeof h||h instanceof Number)&&isFinite(h)},valueOrDefault:function(h,E){return void 0===h?E:h},valueAtIndexOrDefault:function(h,E,x){return Ci.valueOrDefault(Ci.isArray(h)?h[E]:h,x)},callback:function(h,E,x){if(h&&"function"==typeof h.call)return h.apply(x,E)},each:function(h,E,x,F){var Q,le,me;if(Ci.isArray(h))if(le=h.length,F)for(Q=le-1;Q>=0;Q--)E.call(x,h[Q],Q);else for(Q=0;Q<le;Q++)E.call(x,h[Q],Q);else if(Ci.isObject(h))for(le=(me=Object.keys(h)).length,Q=0;Q<le;Q++)E.call(x,h[me[Q]],me[Q])},arrayEquals:function(h,E){var x,F,Q,le;if(!h||!E||h.length!==E.length)return!1;for(x=0,F=h.length;x<F;++x)if(le=E[x],(Q=h[x])instanceof Array&&le instanceof Array){if(!Ci.arrayEquals(Q,le))return!1}else if(Q!==le)return!1;return!0},clone:function(h){if(Ci.isArray(h))return h.map(Ci.clone);if(Ci.isObject(h)){for(var E=Object.create(h),x=Object.keys(h),F=x.length,Q=0;Q<F;++Q)E[x[Q]]=Ci.clone(h[x[Q]]);return E}return h},_merger:function(h,E,x,F){if(Qr(h)){var Q=E[h],le=x[h];Ci.isObject(Q)&&Ci.isObject(le)?Ci.merge(Q,le,F):E[h]=Ci.clone(le)}},_mergerIf:function(h,E,x){if(Qr(h)){var F=E[h],Q=x[h];Ci.isObject(F)&&Ci.isObject(Q)?Ci.mergeIf(F,Q):E.hasOwnProperty(h)||(E[h]=Ci.clone(Q))}},merge:function(h,E,x){var le,me,Fe,Oe,Je,F=Ci.isArray(E)?E:[E],Q=F.length;if(!Ci.isObject(h))return h;for(le=(x=x||{}).merger||Ci._merger,me=0;me<Q;++me)if(Ci.isObject(E=F[me]))for(Je=0,Oe=(Fe=Object.keys(E)).length;Je<Oe;++Je)le(Fe[Je],h,E,x);return h},mergeIf:function(h,E){return Ci.merge(h,E,{merger:Ci._mergerIf})},extend:Object.assign||function(h){return Ci.merge(h,[].slice.call(arguments,1),{merger:function(E,x,F){x[E]=F[E]}})},inherits:function(h){var E=this,x=h&&h.hasOwnProperty("constructor")?h.constructor:function(){return E.apply(this,arguments)},F=function(){this.constructor=x};return F.prototype=E.prototype,x.prototype=new F,x.extend=Ci.inherits,h&&Ci.extend(x.prototype,h),x.__super__=E.prototype,x},_deprecated:function(h,E,x,F){void 0!==E&&console.warn(h+': "'+x+'" is deprecated. Please use "'+F+'" instead')}},_i=Ci;Ci.callCallback=Ci.callback,Ci.indexOf=function(h,E,x){return Array.prototype.indexOf.call(h,E,x)},Ci.getValueOrDefault=Ci.valueOrDefault,Ci.getValueAtIndexOrDefault=Ci.valueAtIndexOrDefault;var so={linear:function(h){return h},easeInQuad:function(h){return h*h},easeOutQuad:function(h){return-h*(h-2)},easeInOutQuad:function(h){return(h/=.5)<1?.5*h*h:-.5*(--h*(h-2)-1)},easeInCubic:function(h){return h*h*h},easeOutCubic:function(h){return(h-=1)*h*h+1},easeInOutCubic:function(h){return(h/=.5)<1?.5*h*h*h:.5*((h-=2)*h*h+2)},easeInQuart:function(h){return h*h*h*h},easeOutQuart:function(h){return-((h-=1)*h*h*h-1)},easeInOutQuart:function(h){return(h/=.5)<1?.5*h*h*h*h:-.5*((h-=2)*h*h*h-2)},easeInQuint:function(h){return h*h*h*h*h},easeOutQuint:function(h){return(h-=1)*h*h*h*h+1},easeInOutQuint:function(h){return(h/=.5)<1?.5*h*h*h*h*h:.5*((h-=2)*h*h*h*h+2)},easeInSine:function(h){return 1-Math.cos(h*(Math.PI/2))},easeOutSine:function(h){return Math.sin(h*(Math.PI/2))},easeInOutSine:function(h){return-.5*(Math.cos(Math.PI*h)-1)},easeInExpo:function(h){return 0===h?0:Math.pow(2,10*(h-1))},easeOutExpo:function(h){return 1===h?1:1-Math.pow(2,-10*h)},easeInOutExpo:function(h){return 0===h?0:1===h?1:(h/=.5)<1?.5*Math.pow(2,10*(h-1)):.5*(2-Math.pow(2,-10*--h))},easeInCirc:function(h){return h>=1?h:-(Math.sqrt(1-h*h)-1)},easeOutCirc:function(h){return Math.sqrt(1-(h-=1)*h)},easeInOutCirc:function(h){return(h/=.5)<1?-.5*(Math.sqrt(1-h*h)-1):.5*(Math.sqrt(1-(h-=2)*h)+1)},easeInElastic:function(h){var E=1.70158,x=0,F=1;return 0===h?0:1===h?1:(x||(x=.3),F<1?(F=1,E=x/4):E=x/(2*Math.PI)*Math.asin(1/F),-F*Math.pow(2,10*(h-=1))*Math.sin((h-E)*(2*Math.PI)/x))},easeOutElastic:function(h){var E=1.70158,x=0,F=1;return 0===h?0:1===h?1:(x||(x=.3),F<1?(F=1,E=x/4):E=x/(2*Math.PI)*Math.asin(1/F),F*Math.pow(2,-10*h)*Math.sin((h-E)*(2*Math.PI)/x)+1)},easeInOutElastic:function(h){var E=1.70158,x=0,F=1;return 0===h?0:2==(h/=.5)?1:(x||(x=.45),F<1?(F=1,E=x/4):E=x/(2*Math.PI)*Math.asin(1/F),h<1?F*Math.pow(2,10*(h-=1))*Math.sin((h-E)*(2*Math.PI)/x)*-.5:F*Math.pow(2,-10*(h-=1))*Math.sin((h-E)*(2*Math.PI)/x)*.5+1)},easeInBack:function(h){var E=1.70158;return h*h*((E+1)*h-E)},easeOutBack:function(h){var E=1.70158;return(h-=1)*h*((E+1)*h+E)+1},easeInOutBack:function(h){var E=1.70158;return(h/=.5)<1?h*h*((1+(E*=1.525))*h-E)*.5:.5*((h-=2)*h*((1+(E*=1.525))*h+E)+2)},easeInBounce:function(h){return 1-so.easeOutBounce(1-h)},easeOutBounce:function(h){return h<1/2.75?7.5625*h*h:h<2/2.75?7.5625*(h-=1.5/2.75)*h+.75:h<2.5/2.75?7.5625*(h-=2.25/2.75)*h+.9375:7.5625*(h-=2.625/2.75)*h+.984375},easeInOutBounce:function(h){return h<.5?.5*so.easeInBounce(2*h):.5*so.easeOutBounce(2*h-1)+.5}},Ro={effects:so};_i.easingEffects=so;var Sr=Math.PI,Kt=Sr/180,un=2*Sr,jn=Sr/2,Jn=Sr/4,Gn=2*Sr/3,Xr={clear:function(h){h.ctx.clearRect(0,0,h.width,h.height)},roundedRect:function(h,E,x,F,Q,le){if(le){var me=Math.min(le,Q/2,F/2),Fe=E+me,Oe=x+me,Je=E+F-me,ht=x+Q-me;h.moveTo(E,Oe),Fe<Je&&Oe<ht?(h.arc(Fe,Oe,me,-Sr,-jn),h.arc(Je,Oe,me,-jn,0),h.arc(Je,ht,me,0,jn),h.arc(Fe,ht,me,jn,Sr)):Fe<Je?(h.moveTo(Fe,x),h.arc(Je,Oe,me,-jn,jn),h.arc(Fe,Oe,me,jn,Sr+jn)):Oe<ht?(h.arc(Fe,Oe,me,-Sr,0),h.arc(Fe,ht,me,0,Sr)):h.arc(Fe,Oe,me,-Sr,Sr),h.closePath(),h.moveTo(E,x)}else h.rect(E,x,F,Q)},drawPoint:function(h,E,x,F,Q,le){var me,Fe,Oe,Je,ht,gt=(le||0)*Kt;if(E&&"object"==typeof E&&("[object HTMLImageElement]"===(me=E.toString())||"[object HTMLCanvasElement]"===me))return h.save(),h.translate(F,Q),h.rotate(gt),h.drawImage(E,-E.width/2,-E.height/2,E.width,E.height),void h.restore();if(!(isNaN(x)||x<=0)){switch(h.beginPath(),E){default:h.arc(F,Q,x,0,un),h.closePath();break;case"triangle":h.moveTo(F+Math.sin(gt)*x,Q-Math.cos(gt)*x),gt+=Gn,h.lineTo(F+Math.sin(gt)*x,Q-Math.cos(gt)*x),gt+=Gn,h.lineTo(F+Math.sin(gt)*x,Q-Math.cos(gt)*x),h.closePath();break;case"rectRounded":Je=x-(ht=.516*x),Fe=Math.cos(gt+Jn)*Je,Oe=Math.sin(gt+Jn)*Je,h.arc(F-Fe,Q-Oe,ht,gt-Sr,gt-jn),h.arc(F+Oe,Q-Fe,ht,gt-jn,gt),h.arc(F+Fe,Q+Oe,ht,gt,gt+jn),h.arc(F-Oe,Q+Fe,ht,gt+jn,gt+Sr),h.closePath();break;case"rect":if(!le){Je=Math.SQRT1_2*x,h.rect(F-Je,Q-Je,2*Je,2*Je);break}gt+=Jn;case"rectRot":Fe=Math.cos(gt)*x,Oe=Math.sin(gt)*x,h.moveTo(F-Fe,Q-Oe),h.lineTo(F+Oe,Q-Fe),h.lineTo(F+Fe,Q+Oe),h.lineTo(F-Oe,Q+Fe),h.closePath();break;case"crossRot":gt+=Jn;case"cross":Fe=Math.cos(gt)*x,Oe=Math.sin(gt)*x,h.moveTo(F-Fe,Q-Oe),h.lineTo(F+Fe,Q+Oe),h.moveTo(F+Oe,Q-Fe),h.lineTo(F-Oe,Q+Fe);break;case"star":Fe=Math.cos(gt)*x,Oe=Math.sin(gt)*x,h.moveTo(F-Fe,Q-Oe),h.lineTo(F+Fe,Q+Oe),h.moveTo(F+Oe,Q-Fe),h.lineTo(F-Oe,Q+Fe),gt+=Jn,Fe=Math.cos(gt)*x,Oe=Math.sin(gt)*x,h.moveTo(F-Fe,Q-Oe),h.lineTo(F+Fe,Q+Oe),h.moveTo(F+Oe,Q-Fe),h.lineTo(F-Oe,Q+Fe);break;case"line":Fe=Math.cos(gt)*x,Oe=Math.sin(gt)*x,h.moveTo(F-Fe,Q-Oe),h.lineTo(F+Fe,Q+Oe);break;case"dash":h.moveTo(F,Q),h.lineTo(F+Math.cos(gt)*x,Q+Math.sin(gt)*x)}h.fill(),h.stroke()}},_isPointInArea:function(h,E){var x=1e-6;return h.x>E.left-x&&h.x<E.right+x&&h.y>E.top-x&&h.y<E.bottom+x},clipArea:function(h,E){h.save(),h.beginPath(),h.rect(E.left,E.top,E.right-E.left,E.bottom-E.top),h.clip()},unclipArea:function(h){h.restore()},lineTo:function(h,E,x,F){var Q=x.steppedLine;if(Q){if("middle"===Q){var le=(E.x+x.x)/2;h.lineTo(le,F?x.y:E.y),h.lineTo(le,F?E.y:x.y)}else"after"===Q&&!F||"after"!==Q&&F?h.lineTo(E.x,x.y):h.lineTo(x.x,E.y);h.lineTo(x.x,x.y)}else x.tension?h.bezierCurveTo(F?E.controlPointPreviousX:E.controlPointNextX,F?E.controlPointPreviousY:E.controlPointNextY,F?x.controlPointNextX:x.controlPointPreviousX,F?x.controlPointNextY:x.controlPointPreviousY,x.x,x.y):h.lineTo(x.x,x.y)}},Zi=Xr;_i.clear=Xr.clear,_i.drawRoundedRectangle=function(h){h.beginPath(),Xr.roundedRect.apply(Xr,arguments)};var ii={_set:function(h,E){return _i.merge(this[h]||(this[h]={}),E)}};ii._set("global",{defaultColor:"rgba(0,0,0,0.1)",defaultFontColor:"#666",defaultFontFamily:"'Helvetica Neue', 'Helvetica', 'Arial', sans-serif",defaultFontSize:12,defaultFontStyle:"normal",defaultLineHeight:1.2,showLines:!0});var hr=ii,Ki=_i.valueOrDefault;var Mn={toLineHeight:function(h,E){var x=(""+h).match(/^(normal|(\d+(?:\.\d+)?)(px|em|%)?)$/);if(!x||"normal"===x[1])return 1.2*E;switch(h=+x[2],x[3]){case"px":return h;case"%":h/=100}return E*h},toPadding:function(h){var E,x,F,Q;return _i.isObject(h)?(E=+h.top||0,x=+h.right||0,F=+h.bottom||0,Q=+h.left||0):E=x=F=Q=+h||0,{top:E,right:x,bottom:F,left:Q,height:E+F,width:Q+x}},_parseFont:function(h){var E=hr.global,x=Ki(h.fontSize,E.defaultFontSize),F={family:Ki(h.fontFamily,E.defaultFontFamily),lineHeight:_i.options.toLineHeight(Ki(h.lineHeight,E.defaultLineHeight),x),size:x,style:Ki(h.fontStyle,E.defaultFontStyle),weight:null,string:""};return F.string=function ln(h){return!h||_i.isNullOrUndef(h.size)||_i.isNullOrUndef(h.family)?null:(h.style?h.style+" ":"")+(h.weight?h.weight+" ":"")+h.size+"px "+h.family}(F),F},resolve:function(h,E,x,F){var le,me,Fe,Q=!0;for(le=0,me=h.length;le<me;++le)if(void 0!==(Fe=h[le])&&(void 0!==E&&"function"==typeof Fe&&(Fe=Fe(E),Q=!1),void 0!==x&&_i.isArray(Fe)&&(Fe=Fe[x],Q=!1),void 0!==Fe))return F&&!Q&&(F.cacheable=!1),Fe}},Zn={_factorize:function(h){var F,E=[],x=Math.sqrt(h);for(F=1;F<x;F++)h%F==0&&(E.push(F),E.push(h/F));return x===(0|x)&&E.push(x),E.sort(function(Q,le){return Q-le}).pop(),E},log10:Math.log10||function(h){var E=Math.log(h)*Math.LOG10E,x=Math.round(E);return h===Math.pow(10,x)?x:E}},cn=Zn;_i.log10=Zn.log10;var dt=_i,to=Zi,Gt=Mn,Rn=cn,_t={getRtlAdapter:function(h,E,x){return h?function(h,E){return{x:function(x){return h+h+E-x},setWidth:function(x){E=x},textAlign:function(x){return"center"===x?x:"right"===x?"left":"right"},xPlus:function(x,F){return x-F},leftForLtr:function(x,F){return x-F}}}(E,x):{x:function(h){return h},setWidth:function(h){},textAlign:function(h){return h},xPlus:function(h,E){return h+E},leftForLtr:function(h,E){return h}}},overrideTextDirection:function(h,E){var x,F;("ltr"===E||"rtl"===E)&&(F=[(x=h.canvas.style).getPropertyValue("direction"),x.getPropertyPriority("direction")],x.setProperty("direction",E,"important"),h.prevTextDirection=F)},restoreTextDirection:function(h){var E=h.prevTextDirection;void 0!==E&&(delete h.prevTextDirection,h.canvas.style.setProperty("direction",E[0],E[1]))}};dt.easing=Ro,dt.canvas=to,dt.options=Gt,dt.math=Rn,dt.rtl=_t;var ct=function(h){dt.extend(this,h),this.initialize.apply(this,arguments)};dt.extend(ct.prototype,{_type:void 0,initialize:function(){this.hidden=!1},pivot:function(){var h=this;return h._view||(h._view=dt.extend({},h._model)),h._start={},h},transition:function(h){var E=this,x=E._model,F=E._start,Q=E._view;return x&&1!==h?(Q||(Q=E._view={}),F||(F=E._start={}),function Rt(h,E,x,F){var le,me,Fe,Oe,Je,ht,gt,nn,$n,Q=Object.keys(x);for(le=0,me=Q.length;le<me;++le)if(ht=x[Fe=Q[le]],E.hasOwnProperty(Fe)||(E[Fe]=ht),(Oe=E[Fe])!==ht&&"_"!==Fe[0]){if(h.hasOwnProperty(Fe)||(h[Fe]=Oe),(gt=typeof ht)==typeof(Je=h[Fe]))if("string"===gt){if((nn=dr(Je)).valid&&($n=dr(ht)).valid){E[Fe]=$n.mix(nn,F).rgbString();continue}}else if(dt.isFinite(Je)&&dt.isFinite(ht)){E[Fe]=Je+(ht-Je)*F;continue}E[Fe]=ht}}(F,Q,x,h),E):(E._view=dt.extend({},x),E._start=null,E)},tooltipPosition:function(){return{x:this._model.x,y:this._model.y}},hasValue:function(){return dt.isNumber(this._model.x)&&dt.isNumber(this._model.y)}}),ct.extend=dt.inherits;var pt=ct,kt=pt.extend({chart:null,currentStep:0,numSteps:60,easing:"",render:null,onAnimationProgress:null,onAnimationComplete:null}),dn=kt;Object.defineProperty(kt.prototype,"animationObject",{get:function(){return this}}),Object.defineProperty(kt.prototype,"chartInstance",{get:function(){return this.chart},set:function(h){this.chart=h}}),hr._set("global",{animation:{duration:1e3,easing:"easeOutQuart",onProgress:dt.noop,onComplete:dt.noop}});var mr={animations:[],request:null,addAnimation:function(h,E,x,F){var le,me,Q=this.animations;for(E.chart=h,E.startTime=Date.now(),E.duration=x,F||(h.animating=!0),le=0,me=Q.length;le<me;++le)if(Q[le].chart===h)return void(Q[le]=E);Q.push(E),1===Q.length&&this.requestAnimationFrame()},cancelAnimation:function(h){var E=dt.findIndex(this.animations,function(x){return x.chart===h});-1!==E&&(this.animations.splice(E,1),h.animating=!1)},requestAnimationFrame:function(){var h=this;null===h.request&&(h.request=dt.requestAnimFrame.call(window,function(){h.request=null,h.startDigest()}))},startDigest:function(){var h=this;h.advance(),h.animations.length>0&&h.requestAnimationFrame()},advance:function(){for(var E,x,F,Q,h=this.animations,le=0;le<h.length;)x=(E=h[le]).chart,F=E.numSteps,Q=Math.floor((Date.now()-E.startTime)/E.duration*F)+1,E.currentStep=Math.min(Q,F),dt.callback(E.render,[x,E],x),dt.callback(E.onAnimationProgress,[E],x),E.currentStep>=F?(dt.callback(E.onAnimationComplete,[E],x),x.animating=!1,h.splice(le,1)):++le}},Oi=dt.options.resolve,di=["push","pop","shift","splice","unshift"];function Qo(h,E){var x=h._chartjs;if(x){var F=x.listeners,Q=F.indexOf(E);-1!==Q&&F.splice(Q,1),!(F.length>0)&&(di.forEach(function(le){delete h[le]}),delete h._chartjs)}}var lo=function(h,E){this.initialize(h,E)};dt.extend(lo.prototype,{datasetElementType:null,dataElementType:null,_datasetElementOptions:["backgroundColor","borderCapStyle","borderColor","borderDash","borderDashOffset","borderJoinStyle","borderWidth"],_dataElementOptions:["backgroundColor","borderColor","borderWidth","pointStyle"],initialize:function(h,E){var x=this;x.chart=h,x.index=E,x.linkScales(),x.addElements(),x._type=x.getMeta().type},updateIndex:function(h){this.index=h},linkScales:function(){var h=this,E=h.getMeta(),x=h.chart,F=x.scales,Q=h.getDataset(),le=x.options.scales;(null===E.xAxisID||!(E.xAxisID in F)||Q.xAxisID)&&(E.xAxisID=Q.xAxisID||le.xAxes[0].id),(null===E.yAxisID||!(E.yAxisID in F)||Q.yAxisID)&&(E.yAxisID=Q.yAxisID||le.yAxes[0].id)},getDataset:function(){return this.chart.data.datasets[this.index]},getMeta:function(){return this.chart.getDatasetMeta(this.index)},getScaleForId:function(h){return this.chart.scales[h]},_getValueScaleId:function(){return this.getMeta().yAxisID},_getIndexScaleId:function(){return this.getMeta().xAxisID},_getValueScale:function(){return this.getScaleForId(this._getValueScaleId())},_getIndexScale:function(){return this.getScaleForId(this._getIndexScaleId())},reset:function(){this._update(!0)},destroy:function(){this._data&&Qo(this._data,this)},createMetaDataset:function(){var h=this,E=h.datasetElementType;return E&&new E({_chart:h.chart,_datasetIndex:h.index})},createMetaData:function(h){var E=this,x=E.dataElementType;return x&&new x({_chart:E.chart,_datasetIndex:E.index,_index:h})},addElements:function(){var Q,le,h=this,E=h.getMeta(),x=h.getDataset().data||[],F=E.data;for(Q=0,le=x.length;Q<le;++Q)F[Q]=F[Q]||h.createMetaData(Q);E.dataset=E.dataset||h.createMetaDataset()},addElementAndReset:function(h){var E=this.createMetaData(h);this.getMeta().data.splice(h,0,E),this.updateElement(E,h,!0)},buildOrUpdateElements:function(){var h=this,E=h.getDataset(),x=E.data||(E.data=[]);h._data!==x&&(h._data&&Qo(h._data,h),x&&Object.isExtensible(x)&&function Uo(h,E){h._chartjs?h._chartjs.listeners.push(E):(Object.defineProperty(h,"_chartjs",{configurable:!0,enumerable:!1,value:{listeners:[E]}}),di.forEach(function(x){var F="onData"+x.charAt(0).toUpperCase()+x.slice(1),Q=h[x];Object.defineProperty(h,x,{configurable:!0,enumerable:!1,value:function(){var le=Array.prototype.slice.call(arguments),me=Q.apply(this,le);return dt.each(h._chartjs.listeners,function(Fe){"function"==typeof Fe[F]&&Fe[F].apply(Fe,le)}),me}})}))}(x,h),h._data=x),h.resyncElements()},_configure:function(){var h=this;h._config=dt.merge(Object.create(null),[h.chart.options.datasets[h._type],h.getDataset()],{merger:function(E,x,F){"_meta"!==E&&"data"!==E&&dt._merger(E,x,F)}})},_update:function(h){var E=this;E._configure(),E._cachedDataOpts=null,E.update(h)},update:dt.noop,transition:function(h){for(var E=this.getMeta(),x=E.data||[],F=x.length,Q=0;Q<F;++Q)x[Q].transition(h);E.dataset&&E.dataset.transition(h)},draw:function(){var h=this.getMeta(),E=h.data||[],x=E.length,F=0;for(h.dataset&&h.dataset.draw();F<x;++F)E[F].draw()},getStyle:function(h){var Q,E=this,x=E.getMeta(),F=x.dataset;return E._configure(),(!1===(Q=F&&void 0===h?E._resolveDatasetElementOptions(F||{}):E._resolveDataElementOptions(x.data[h=h||0]||{},h)).fill||null===Q.fill)&&(Q.backgroundColor=Q.borderColor),Q},_resolveDatasetElementOptions:function(h,E){var Je,ht,gt,nn,x=this,F=x.chart,Q=x._config,le=h.custom||{},me=F.options.elements[x.datasetElementType.prototype._type]||{},Fe=x._datasetElementOptions,Oe={},$n={chart:F,dataset:x.getDataset(),datasetIndex:x.index,hover:E};for(Je=0,ht=Fe.length;Je<ht;++Je)gt=Fe[Je],nn=E?"hover"+gt.charAt(0).toUpperCase()+gt.slice(1):gt,Oe[gt]=Oi([le[nn],Q[nn],me[nn]],$n);return Oe},_resolveDataElementOptions:function(h,E){var x=this,F=h&&h.custom,Q=x._cachedDataOpts;if(Q&&!F)return Q;var nn,$n,Bn,ar,le=x.chart,me=x._config,Fe=le.options.elements[x.dataElementType.prototype._type]||{},Oe=x._dataElementOptions,Je={},ht={chart:le,dataIndex:E,dataset:x.getDataset(),datasetIndex:x.index},gt={cacheable:!F};if(F=F||{},dt.isArray(Oe))for($n=0,Bn=Oe.length;$n<Bn;++$n)Je[ar=Oe[$n]]=Oi([F[ar],me[ar],Fe[ar]],ht,E,gt);else for($n=0,Bn=(nn=Object.keys(Oe)).length;$n<Bn;++$n)Je[ar=nn[$n]]=Oi([F[ar],me[Oe[ar]],me[ar],Fe[ar]],ht,E,gt);return gt.cacheable&&(x._cachedDataOpts=Object.freeze(Je)),Je},removeHoverStyle:function(h){dt.merge(h._model,h.$previousStyle||{}),delete h.$previousStyle},setHoverStyle:function(h){var E=this.chart.data.datasets[h._datasetIndex],x=h._index,F=h.custom||{},Q=h._model,le=dt.getHoverColor;h.$previousStyle={backgroundColor:Q.backgroundColor,borderColor:Q.borderColor,borderWidth:Q.borderWidth},Q.backgroundColor=Oi([F.hoverBackgroundColor,E.hoverBackgroundColor,le(Q.backgroundColor)],void 0,x),Q.borderColor=Oi([F.hoverBorderColor,E.hoverBorderColor,le(Q.borderColor)],void 0,x),Q.borderWidth=Oi([F.hoverBorderWidth,E.hoverBorderWidth,Q.borderWidth],void 0,x)},_removeDatasetHoverStyle:function(){var h=this.getMeta().dataset;h&&this.removeHoverStyle(h)},_setDatasetHoverStyle:function(){var x,F,Q,le,me,Fe,h=this.getMeta().dataset,E={};if(h){for(Fe=h._model,me=this._resolveDatasetElementOptions(h,!0),x=0,F=(le=Object.keys(me)).length;x<F;++x)E[Q=le[x]]=Fe[Q],Fe[Q]=me[Q];h.$previousStyle=E}},resyncElements:function(){var h=this,E=h.getMeta(),x=h.getDataset().data,F=E.data.length,Q=x.length;Q<F?E.data.splice(Q,F-Q):Q>F&&h.insertElements(F,Q-F)},insertElements:function(h,E){for(var x=0;x<E;++x)this.addElementAndReset(h+x)},onDataPush:function(){var h=arguments.length;this.insertElements(this.getDataset().data.length-h,h)},onDataPop:function(){this.getMeta().data.pop()},onDataShift:function(){this.getMeta().data.shift()},onDataSplice:function(h,E){this.getMeta().data.splice(h,E),this.insertElements(h,arguments.length-2)},onDataUnshift:function(){this.insertElements(0,arguments.length)}}),lo.extend=dt.inherits;var Ai=lo,Fo=2*Math.PI;function Ko(h,E){var x=E.startAngle,F=E.endAngle,Q=E.pixelMargin,le=Q/E.outerRadius,me=E.x,Fe=E.y;h.beginPath(),h.arc(me,Fe,E.outerRadius,x-le,F+le),E.innerRadius>Q?h.arc(me,Fe,E.innerRadius-Q,F+(le=Q/E.innerRadius),x-le,!0):h.arc(me,Fe,Q,F+Math.PI/2,x-Math.PI/2),h.closePath(),h.clip()}function ei(h,E,x){var F="inner"===E.borderAlign;F?(h.lineWidth=2*E.borderWidth,h.lineJoin="round"):(h.lineWidth=E.borderWidth,h.lineJoin="bevel"),x.fullCircles&&function qn(h,E,x,F){var le,Q=x.endAngle;for(F&&(x.endAngle=x.startAngle+Fo,Ko(h,x),x.endAngle=Q,x.endAngle===x.startAngle&&x.fullCircles&&(x.endAngle+=Fo,x.fullCircles--)),h.beginPath(),h.arc(x.x,x.y,x.innerRadius,x.startAngle+Fo,x.startAngle,!0),le=0;le<x.fullCircles;++le)h.stroke();for(h.beginPath(),h.arc(x.x,x.y,E.outerRadius,x.startAngle,x.startAngle+Fo),le=0;le<x.fullCircles;++le)h.stroke()}(h,E,x,F),F&&Ko(h,x),h.beginPath(),h.arc(x.x,x.y,E.outerRadius,x.startAngle,x.endAngle),h.arc(x.x,x.y,x.innerRadius,x.endAngle,x.startAngle,!0),h.closePath(),h.stroke()}hr._set("global",{elements:{arc:{backgroundColor:hr.global.defaultColor,borderColor:"#fff",borderWidth:2,borderAlign:"center"}}});var wn=pt.extend({_type:"arc",inLabelRange:function(h){var E=this._view;return!!E&&Math.pow(h-E.x,2)<Math.pow(E.radius+E.hoverRadius,2)},inRange:function(h,E){var x=this._view;if(x){for(var F=dt.getAngleFromPoint(x,{x:h,y:E}),Q=F.angle,le=F.distance,me=x.startAngle,Fe=x.endAngle;Fe<me;)Fe+=Fo;for(;Q>Fe;)Q-=Fo;for(;Q<me;)Q+=Fo;return Q>=me&&Q<=Fe&&le>=x.innerRadius&&le<=x.outerRadius}return!1},getCenterPoint:function(){var h=this._view,E=(h.startAngle+h.endAngle)/2,x=(h.innerRadius+h.outerRadius)/2;return{x:h.x+Math.cos(E)*x,y:h.y+Math.sin(E)*x}},getArea:function(){var h=this._view;return Math.PI*((h.endAngle-h.startAngle)/(2*Math.PI))*(Math.pow(h.outerRadius,2)-Math.pow(h.innerRadius,2))},tooltipPosition:function(){var h=this._view,E=h.startAngle+(h.endAngle-h.startAngle)/2,x=(h.outerRadius-h.innerRadius)/2+h.innerRadius;return{x:h.x+Math.cos(E)*x,y:h.y+Math.sin(E)*x}},draw:function(){var Q,h=this._chart.ctx,E=this._view,x="inner"===E.borderAlign?.33:0,F={x:E.x,y:E.y,innerRadius:E.innerRadius,outerRadius:Math.max(E.outerRadius-x,0),pixelMargin:x,startAngle:E.startAngle,endAngle:E.endAngle,fullCircles:Math.floor(E.circumference/Fo)};if(h.save(),h.fillStyle=E.backgroundColor,h.strokeStyle=E.borderColor,F.fullCircles){for(F.endAngle=F.startAngle+Fo,h.beginPath(),h.arc(F.x,F.y,F.outerRadius,F.startAngle,F.endAngle),h.arc(F.x,F.y,F.innerRadius,F.endAngle,F.startAngle,!0),h.closePath(),Q=0;Q<F.fullCircles;++Q)h.fill();F.endAngle=F.startAngle+E.circumference%Fo}h.beginPath(),h.arc(F.x,F.y,F.outerRadius,F.startAngle,F.endAngle),h.arc(F.x,F.y,F.innerRadius,F.endAngle,F.startAngle,!0),h.closePath(),h.fill(),E.borderWidth&&ei(h,E,F),h.restore()}}),Qn=dt.valueOrDefault,Fr=hr.global.defaultColor;hr._set("global",{elements:{line:{tension:.4,backgroundColor:Fr,borderWidth:3,borderColor:Fr,borderCapStyle:"butt",borderDash:[],borderDashOffset:0,borderJoinStyle:"miter",capBezierPoints:!0,fill:!0}}});var oo=pt.extend({_type:"line",draw:function(){var Je,ht,gt,h=this,E=h._view,x=h._chart.ctx,F=E.spanGaps,Q=h._children.slice(),le=hr.global,me=le.elements.line,Fe=-1,Oe=h._loop;if(Q.length){if(h._loop){for(Je=0;Je<Q.length;++Je)if(ht=dt.previousItem(Q,Je),!Q[Je]._view.skip&&ht._view.skip){Q=Q.slice(Je).concat(Q.slice(0,Je)),Oe=F;break}Oe&&Q.push(Q[0])}for(x.save(),x.lineCap=E.borderCapStyle||me.borderCapStyle,x.setLineDash&&x.setLineDash(E.borderDash||me.borderDash),x.lineDashOffset=Qn(E.borderDashOffset,me.borderDashOffset),x.lineJoin=E.borderJoinStyle||me.borderJoinStyle,x.lineWidth=Qn(E.borderWidth,me.borderWidth),x.strokeStyle=E.borderColor||le.defaultColor,x.beginPath(),(gt=Q[0]._view).skip||(x.moveTo(gt.x,gt.y),Fe=0),Je=1;Je<Q.length;++Je)gt=Q[Je]._view,ht=-1===Fe?dt.previousItem(Q,Je):Q[Fe],gt.skip||(Fe!==Je-1&&!F||-1===Fe?x.moveTo(gt.x,gt.y):dt.canvas.lineTo(x,ht._view,gt),Fe=Je);Oe&&x.closePath(),x.stroke(),x.restore()}}}),Li=dt.valueOrDefault,yo=hr.global.defaultColor;function go(h){var E=this._view;return!!E&&Math.abs(h-E.x)<E.radius+E.hitRadius}hr._set("global",{elements:{point:{radius:3,pointStyle:"circle",backgroundColor:yo,borderColor:yo,borderWidth:1,hitRadius:1,hoverRadius:4,hoverBorderWidth:1}}});var ua=pt.extend({_type:"point",inRange:function(h,E){var x=this._view;return!!x&&Math.pow(h-x.x,2)+Math.pow(E-x.y,2)<Math.pow(x.hitRadius+x.radius,2)},inLabelRange:go,inXRange:go,inYRange:function Go(h){var E=this._view;return!!E&&Math.abs(h-E.y)<E.radius+E.hitRadius},getCenterPoint:function(){var h=this._view;return{x:h.x,y:h.y}},getArea:function(){return Math.PI*Math.pow(this._view.radius,2)},tooltipPosition:function(){var h=this._view;return{x:h.x,y:h.y,padding:h.radius+h.borderWidth}},draw:function(h){var E=this._view,x=this._chart.ctx,F=E.pointStyle,Q=E.rotation,le=E.radius,me=E.x,Fe=E.y,Oe=hr.global,Je=Oe.defaultColor;E.skip||(void 0===h||dt.canvas._isPointInArea(E,h))&&(x.strokeStyle=E.borderColor||Je,x.lineWidth=Li(E.borderWidth,Oe.elements.point.borderWidth),x.fillStyle=E.backgroundColor||Je,dt.canvas.drawPoint(x,F,le,me,Fe,Q))}}),er=hr.global.defaultColor;function vr(h){return h&&void 0!==h.width}function yr(h){var E,x,F,Q,le;return vr(h)?(E=h.x-(le=h.width/2),x=h.x+le,F=Math.min(h.y,h.base),Q=Math.max(h.y,h.base)):(le=h.height/2,E=Math.min(h.x,h.base),x=Math.max(h.x,h.base),F=h.y-le,Q=h.y+le),{left:E,top:F,right:x,bottom:Q}}function or(h,E,x){return h===E?x:h===x?E:h}function pn(h,E,x){var le,me,Fe,Oe,F=h.borderWidth,Q=function si(h){var E=h.borderSkipped,x={};return E&&(h.horizontal?h.base>h.x&&(E=or(E,"left","right")):h.base<h.y&&(E=or(E,"bottom","top")),x[E]=!0),x}(h);return dt.isObject(F)?(le=+F.top||0,me=+F.right||0,Fe=+F.bottom||0,Oe=+F.left||0):le=me=Fe=Oe=+F||0,{t:Q.top||le<0?0:le>x?x:le,r:Q.right||me<0?0:me>E?E:me,b:Q.bottom||Fe<0?0:Fe>x?x:Fe,l:Q.left||Oe<0?0:Oe>E?E:Oe}}function Gr(h,E,x){var F=null===E,Q=null===x,le=!(!h||F&&Q)&&yr(h);return le&&(F||E>=le.left&&E<=le.right)&&(Q||x>=le.top&&x<=le.bottom)}hr._set("global",{elements:{rectangle:{backgroundColor:er,borderColor:er,borderSkipped:"bottom",borderWidth:0}}});var no=pt.extend({_type:"rectangle",draw:function(){var h=this._chart.ctx,E=this._view,x=function xn(h){var E=yr(h),x=E.right-E.left,F=E.bottom-E.top,Q=pn(h,x/2,F/2);return{outer:{x:E.left,y:E.top,w:x,h:F},inner:{x:E.left+Q.l,y:E.top+Q.t,w:x-Q.l-Q.r,h:F-Q.t-Q.b}}}(E),F=x.outer,Q=x.inner;h.fillStyle=E.backgroundColor,h.fillRect(F.x,F.y,F.w,F.h),(F.w!==Q.w||F.h!==Q.h)&&(h.save(),h.beginPath(),h.rect(F.x,F.y,F.w,F.h),h.clip(),h.fillStyle=E.borderColor,h.rect(Q.x,Q.y,Q.w,Q.h),h.fill("evenodd"),h.restore())},height:function(){var h=this._view;return h.base-h.y},inRange:function(h,E){return Gr(this._view,h,E)},inLabelRange:function(h,E){var x=this._view;return vr(x)?Gr(x,h,null):Gr(x,null,E)},inXRange:function(h){return Gr(this._view,h,null)},inYRange:function(h){return Gr(this._view,null,h)},getCenterPoint:function(){var E,x,h=this._view;return vr(h)?(E=h.x,x=(h.y+h.base)/2):(E=(h.x+h.base)/2,x=h.y),{x:E,y:x}},getArea:function(){var h=this._view;return vr(h)?h.width*Math.abs(h.y-h.base):h.height*Math.abs(h.x-h.base)},tooltipPosition:function(){var h=this._view;return{x:h.x,y:h.y}}}),mo={},Us=oo,cs=ua,es=no;mo.Arc=wn,mo.Line=Us,mo.Point=cs,mo.Rectangle=es;var ga=dt._deprecated,ya=dt.valueOrDefault;function la(h,E,x){var Fe,Oe,F=x.barThickness,Q=E.stackCount,le=E.pixels[h],me=dt.isNullOrUndef(F)?function fa(h,E){var F,Q,le,me,x=h._length;for(le=1,me=E.length;le<me;++le)x=Math.min(x,Math.abs(E[le]-E[le-1]));for(le=0,me=h.getTicks().length;le<me;++le)Q=h.getPixelForTick(le),x=le>0?Math.min(x,Math.abs(Q-F)):x,F=Q;return x}(E.scale,E.pixels):-1;return dt.isNullOrUndef(F)?(Fe=me*x.categoryPercentage,Oe=x.barPercentage):(Fe=F*Q,Oe=1),{chunk:Fe/Q,ratio:Oe,start:le-Fe/2}}hr._set("bar",{hover:{mode:"label"},scales:{xAxes:[{type:"category",offset:!0,gridLines:{offsetGridLines:!0}}],yAxes:[{type:"linear"}]}}),hr._set("global",{datasets:{bar:{categoryPercentage:.8,barPercentage:.9}}});var fl=Ai.extend({dataElementType:mo.Rectangle,_dataElementOptions:["backgroundColor","borderColor","borderSkipped","borderWidth","barPercentage","barThickness","categoryPercentage","maxBarThickness","minBarLength"],initialize:function(){var E,x,h=this;Ai.prototype.initialize.apply(h,arguments),(E=h.getMeta()).stack=h.getDataset().stack,E.bar=!0,x=h._getIndexScale().options,ga("bar chart",x.barPercentage,"scales.[x/y]Axes.barPercentage","dataset.barPercentage"),ga("bar chart",x.barThickness,"scales.[x/y]Axes.barThickness","dataset.barThickness"),ga("bar chart",x.categoryPercentage,"scales.[x/y]Axes.categoryPercentage","dataset.categoryPercentage"),ga("bar chart",h._getValueScale().options.minBarLength,"scales.[x/y]Axes.minBarLength","dataset.minBarLength"),ga("bar chart",x.maxBarThickness,"scales.[x/y]Axes.maxBarThickness","dataset.maxBarThickness")},update:function(h){var F,Q,E=this,x=E.getMeta().data;for(E._ruler=E.getRuler(),F=0,Q=x.length;F<Q;++F)E.updateElement(x[F],F,h)},updateElement:function(h,E,x){var F=this,Q=F.getMeta(),le=F.getDataset(),me=F._resolveDataElementOptions(h,E);h._xScale=F.getScaleForId(Q.xAxisID),h._yScale=F.getScaleForId(Q.yAxisID),h._datasetIndex=F.index,h._index=E,h._model={backgroundColor:me.backgroundColor,borderColor:me.borderColor,borderSkipped:me.borderSkipped,borderWidth:me.borderWidth,datasetLabel:le.label,label:F.chart.data.labels[E]},dt.isArray(le.data[E])&&(h._model.borderSkipped=null),F._updateElementGeometry(h,E,x,me),h.pivot()},_updateElementGeometry:function(h,E,x,F){var Q=this,le=h._model,me=Q._getValueScale(),Fe=me.getBasePixel(),Oe=me.isHorizontal(),Je=Q._ruler||Q.getRuler(),ht=Q.calculateBarValuePixels(Q.index,E,F),gt=Q.calculateBarIndexPixels(Q.index,E,Je,F);le.horizontal=Oe,le.base=x?Fe:ht.base,le.x=Oe?x?Fe:ht.head:gt.center,le.y=Oe?gt.center:x?Fe:ht.head,le.height=Oe?gt.size:void 0,le.width=Oe?void 0:gt.size},_getStacks:function(h){var Fe,Oe,x=this._getIndexScale(),F=x._getMatchingVisibleMetas(this._type),Q=x.options.stacked,le=F.length,me=[];for(Fe=0;Fe<le&&(Oe=F[Fe],(!1===Q||-1===me.indexOf(Oe.stack)||void 0===Q&&void 0===Oe.stack)&&me.push(Oe.stack),Oe.index!==h);++Fe);return me},getStackCount:function(){return this._getStacks().length},getStackIndex:function(h,E){var x=this._getStacks(h),F=void 0!==E?x.indexOf(E):-1;return-1===F?x.length-1:F},getRuler:function(){var F,Q,h=this,E=h._getIndexScale(),x=[];for(F=0,Q=h.getMeta().data.length;F<Q;++F)x.push(E.getPixelForValue(null,F,h.index));return{pixels:x,start:E._startPixel,end:E._endPixel,stackCount:h.getStackCount(),scale:E}},calculateBarValuePixels:function(h,E,x){var Pr,$i,is,Eo,Gs,qs,qa,F=this,Q=F.chart,le=F._getValueScale(),me=le.isHorizontal(),Fe=Q.data.datasets,Oe=le._getMatchingVisibleMetas(F._type),Je=le._parseValue(Fe[h].data[E]),ht=x.minBarLength,gt=le.options.stacked,nn=F.getMeta().stack,$n=void 0===Je.start?0:Je.max>=0&&Je.min>=0?Je.min:Je.max,Bn=void 0===Je.start?Je.end:Je.max>=0&&Je.min>=0?Je.max-Je.min:Je.min-Je.max,ar=Oe.length;if(gt||void 0===gt&&void 0!==nn)for(Pr=0;Pr<ar&&($i=Oe[Pr]).index!==h;++Pr)$i.stack===nn&&(is=void 0===(qa=le._parseValue(Fe[$i.index].data[E])).start?qa.end:qa.min>=0&&qa.max>=0?qa.max:qa.min,(Je.min<0&&is<0||Je.max>=0&&is>0)&&($n+=is));return Eo=le.getPixelForValue($n),qs=(Gs=le.getPixelForValue($n+Bn))-Eo,void 0!==ht&&Math.abs(qs)<ht&&(qs=ht,Gs=Bn>=0&&!me||Bn<0&&me?Eo-ht:Eo+ht),{size:qs,base:Eo,head:Gs,center:Gs+qs/2}},calculateBarIndexPixels:function(h,E,x,F){var le="flex"===F.barThickness?function Pa(h,E,x){var Oe,F=E.pixels,Q=F[h],le=h>0?F[h-1]:null,me=h<F.length-1?F[h+1]:null,Fe=x.categoryPercentage;return null===le&&(le=Q-(null===me?E.end-E.start:me-Q)),null===me&&(me=Q+Q-le),Oe=Q-(Q-Math.min(le,me))/2*Fe,{chunk:Math.abs(me-le)/2*Fe/E.stackCount,ratio:x.barPercentage,start:Oe}}(E,x,F):la(E,x,F),me=this.getStackIndex(h,this.getMeta().stack),Fe=le.start+le.chunk*me+le.chunk/2,Oe=Math.min(ya(F.maxBarThickness,1/0),le.chunk*le.ratio);return{base:Fe-Oe/2,head:Fe+Oe/2,center:Fe,size:Oe}},draw:function(){var h=this,E=h.chart,x=h._getValueScale(),F=h.getMeta().data,Q=h.getDataset(),le=F.length,me=0;for(dt.canvas.clipArea(E.ctx,E.chartArea);me<le;++me){var Fe=x._parseValue(Q.data[me]);!isNaN(Fe.min)&&!isNaN(Fe.max)&&F[me].draw()}dt.canvas.unclipArea(E.ctx)},_resolveDataElementOptions:function(){var h=this,E=dt.extend({},Ai.prototype._resolveDataElementOptions.apply(h,arguments)),x=h._getIndexScale().options,F=h._getValueScale().options;return E.barPercentage=ya(x.barPercentage,E.barPercentage),E.barThickness=ya(x.barThickness,E.barThickness),E.categoryPercentage=ya(x.categoryPercentage,E.categoryPercentage),E.maxBarThickness=ya(x.maxBarThickness,E.maxBarThickness),E.minBarLength=ya(F.minBarLength,E.minBarLength),E}}),To=dt.valueOrDefault,ml=dt.options.resolve;hr._set("bubble",{hover:{mode:"single"},scales:{xAxes:[{type:"linear",position:"bottom",id:"x-axis-0"}],yAxes:[{type:"linear",position:"left",id:"y-axis-0"}]},tooltips:{callbacks:{title:function(){return""},label:function(h,E){return(E.datasets[h.datasetIndex].label||"")+": ("+h.xLabel+", "+h.yLabel+", "+E.datasets[h.datasetIndex].data[h.index].r+")"}}}});var Zo=Ai.extend({dataElementType:mo.Point,_dataElementOptions:["backgroundColor","borderColor","borderWidth","hoverBackgroundColor","hoverBorderColor","hoverBorderWidth","hoverRadius","hitRadius","pointStyle","rotation"],update:function(h){var E=this,x=E.getMeta();dt.each(x.data,function(Q,le){E.updateElement(Q,le,h)})},updateElement:function(h,E,x){var F=this,Q=F.getMeta(),le=h.custom||{},me=F.getScaleForId(Q.xAxisID),Fe=F.getScaleForId(Q.yAxisID),Oe=F._resolveDataElementOptions(h,E),Je=F.getDataset().data[E],ht=F.index,gt=x?me.getPixelForDecimal(.5):me.getPixelForValue("object"==typeof Je?Je:NaN,E,ht),nn=x?Fe.getBasePixel():Fe.getPixelForValue(Je,E,ht);h._xScale=me,h._yScale=Fe,h._options=Oe,h._datasetIndex=ht,h._index=E,h._model={backgroundColor:Oe.backgroundColor,borderColor:Oe.borderColor,borderWidth:Oe.borderWidth,hitRadius:Oe.hitRadius,pointStyle:Oe.pointStyle,rotation:Oe.rotation,radius:x?0:Oe.radius,skip:le.skip||isNaN(gt)||isNaN(nn),x:gt,y:nn},h.pivot()},setHoverStyle:function(h){var E=h._model,x=h._options,F=dt.getHoverColor;h.$previousStyle={backgroundColor:E.backgroundColor,borderColor:E.borderColor,borderWidth:E.borderWidth,radius:E.radius},E.backgroundColor=To(x.hoverBackgroundColor,F(x.backgroundColor)),E.borderColor=To(x.hoverBorderColor,F(x.borderColor)),E.borderWidth=To(x.hoverBorderWidth,x.borderWidth),E.radius=x.radius+x.hoverRadius},_resolveDataElementOptions:function(h,E){var x=this,F=x.chart,Q=x.getDataset(),le=h.custom||{},me=Q.data[E]||{},Fe=Ai.prototype._resolveDataElementOptions.apply(x,arguments),Oe={chart:F,dataIndex:E,dataset:Q,datasetIndex:x.index};return x._cachedDataOpts===Fe&&(Fe=dt.extend({},Fe)),Fe.radius=ml([le.radius,me.r,x._config.radius,F.options.elements.point.radius],Oe,E),Fe}}),vs=dt.valueOrDefault,Za=Math.PI,Is=2*Za,tl=Za/2;hr._set("doughnut",{animation:{animateRotate:!0,animateScale:!1},hover:{mode:"single"},legendCallback:function(h){var le,me,Fe,E=document.createElement("ul"),x=h.data,F=x.datasets,Q=x.labels;if(E.setAttribute("class",h.id+"-legend"),F.length)for(le=0,me=F[0].data.length;le<me;++le)(Fe=E.appendChild(document.createElement("li"))).appendChild(document.createElement("span")).style.backgroundColor=F[0].backgroundColor[le],Q[le]&&Fe.appendChild(document.createTextNode(Q[le]));return E.outerHTML},legend:{labels:{generateLabels:function(h){var E=h.data;return E.labels.length&&E.datasets.length?E.labels.map(function(x,F){var Q=h.getDatasetMeta(0),le=Q.controller.getStyle(F);return{text:x,fillStyle:le.backgroundColor,strokeStyle:le.borderColor,lineWidth:le.borderWidth,hidden:isNaN(E.datasets[0].data[F])||Q.data[F].hidden,index:F}}):[]}},onClick:function(h,E){var Q,le,me,x=E.index,F=this.chart;for(Q=0,le=(F.data.datasets||[]).length;Q<le;++Q)(me=F.getDatasetMeta(Q)).data[x]&&(me.data[x].hidden=!me.data[x].hidden);F.update()}},cutoutPercentage:50,rotation:-tl,circumference:Is,tooltips:{callbacks:{title:function(){return""},label:function(h,E){var x=E.labels[h.index],F=": "+E.datasets[h.datasetIndex].data[h.index];return dt.isArray(x)?(x=x.slice())[0]+=F:x+=F,x}}}});var Ys=Ai.extend({dataElementType:mo.Arc,linkScales:dt.noop,_dataElementOptions:["backgroundColor","borderColor","borderWidth","borderAlign","hoverBackgroundColor","hoverBorderColor","hoverBorderWidth"],getRingIndex:function(h){for(var E=0,x=0;x<h;++x)this.chart.isDatasetVisible(x)&&++E;return E},update:function(h){var Pr,$i,E=this,x=E.chart,F=x.chartArea,Q=x.options,le=1,me=1,Fe=0,Oe=0,Je=E.getMeta(),ht=Je.data,gt=Q.cutoutPercentage/100||0,nn=Q.circumference,$n=E._getRingWeight(E.index);if(nn<Is){var is=Q.rotation%Is,Eo=(is+=is>=Za?-Is:is<-Za?Is:0)+nn,Gs=Math.cos(is),qs=Math.sin(is),qa=Math.cos(Eo),ka=Math.sin(Eo),ja=is<=0&&Eo>=0||Eo>=Is,wa=is<=tl&&Eo>=tl||Eo>=Is+tl,pu=is<=-tl&&Eo>=-tl||Eo>=Za+tl,Ga=is===-Za||Eo>=Za?-1:Math.min(Gs,Gs*gt,qa,qa*gt),Tu=pu?-1:Math.min(qs,qs*gt,ka,ka*gt),Lu=ja?1:Math.max(Gs,Gs*gt,qa,qa*gt),wc=wa?1:Math.max(qs,qs*gt,ka,ka*gt);le=(Lu-Ga)/2,me=(wc-Tu)/2,Fe=-(Lu+Ga)/2,Oe=-(wc+Tu)/2}for(Pr=0,$i=ht.length;Pr<$i;++Pr)ht[Pr]._options=E._resolveDataElementOptions(ht[Pr],Pr);for(x.borderWidth=E.getMaxBorderWidth(),x.outerRadius=Math.max(Math.min((F.right-F.left-x.borderWidth)/le,(F.bottom-F.top-x.borderWidth)/me)/2,0),x.innerRadius=Math.max(x.outerRadius*gt,0),x.radiusLength=(x.outerRadius-x.innerRadius)/(E._getVisibleDatasetWeightTotal()||1),x.offsetX=Fe*x.outerRadius,x.offsetY=Oe*x.outerRadius,Je.total=E.calculateTotal(),E.outerRadius=x.outerRadius-x.radiusLength*E._getRingWeightOffset(E.index),E.innerRadius=Math.max(E.outerRadius-x.radiusLength*$n,0),Pr=0,$i=ht.length;Pr<$i;++Pr)E.updateElement(ht[Pr],Pr,h)},updateElement:function(h,E,x){var F=this,Q=F.chart,le=Q.chartArea,me=Q.options,Fe=me.animation,Oe=(le.left+le.right)/2,Je=(le.top+le.bottom)/2,ht=me.rotation,gt=me.rotation,nn=F.getDataset(),$n=x&&Fe.animateRotate||h.hidden?0:F.calculateCircumference(nn.data[E])*(me.circumference/Is),Pr=h._options||{};dt.extend(h,{_datasetIndex:F.index,_index:E,_model:{backgroundColor:Pr.backgroundColor,borderColor:Pr.borderColor,borderWidth:Pr.borderWidth,borderAlign:Pr.borderAlign,x:Oe+Q.offsetX,y:Je+Q.offsetY,startAngle:ht,endAngle:gt,circumference:$n,outerRadius:x&&Fe.animateScale?0:F.outerRadius,innerRadius:x&&Fe.animateScale?0:F.innerRadius,label:dt.valueAtIndexOrDefault(nn.label,E,Q.data.labels[E])}});var $i=h._model;(!x||!Fe.animateRotate)&&($i.startAngle=0===E?me.rotation:F.getMeta().data[E-1]._model.endAngle,$i.endAngle=$i.startAngle+$i.circumference),h.pivot()},calculateTotal:function(){var F,h=this.getDataset(),E=this.getMeta(),x=0;return dt.each(E.data,function(Q,le){F=h.data[le],!isNaN(F)&&!Q.hidden&&(x+=Math.abs(F))}),x},calculateCircumference:function(h){var E=this.getMeta().total;return E>0&&!isNaN(h)?Is*(Math.abs(h)/E):0},getMaxBorderWidth:function(h){var Q,le,me,Fe,Oe,Je,ht,gt,x=0,F=this.chart;if(!h)for(Q=0,le=F.data.datasets.length;Q<le;++Q)if(F.isDatasetVisible(Q)){h=(me=F.getDatasetMeta(Q)).data,Q!==this.index&&(Oe=me.controller);break}if(!h)return 0;for(Q=0,le=h.length;Q<le;++Q)Fe=h[Q],Oe?(Oe._configure(),Je=Oe._resolveDataElementOptions(Fe,Q)):Je=Fe._options,"inner"!==Je.borderAlign&&(x=(gt=Je.hoverBorderWidth)>(x=(ht=Je.borderWidth)>x?ht:x)?gt:x);return x},setHoverStyle:function(h){var E=h._model,x=h._options,F=dt.getHoverColor;h.$previousStyle={backgroundColor:E.backgroundColor,borderColor:E.borderColor,borderWidth:E.borderWidth},E.backgroundColor=vs(x.hoverBackgroundColor,F(x.backgroundColor)),E.borderColor=vs(x.hoverBorderColor,F(x.borderColor)),E.borderWidth=vs(x.hoverBorderWidth,x.borderWidth)},_getRingWeightOffset:function(h){for(var E=0,x=0;x<h;++x)this.chart.isDatasetVisible(x)&&(E+=this._getRingWeight(x));return E},_getRingWeight:function(h){return Math.max(vs(this.chart.data.datasets[h].weight,1),0)},_getVisibleDatasetWeightTotal:function(){return this._getRingWeightOffset(this.chart.data.datasets.length)}});hr._set("horizontalBar",{hover:{mode:"index",axis:"y"},scales:{xAxes:[{type:"linear",position:"bottom"}],yAxes:[{type:"category",position:"left",offset:!0,gridLines:{offsetGridLines:!0}}]},elements:{rectangle:{borderSkipped:"left"}},tooltips:{mode:"index",axis:"y"}}),hr._set("global",{datasets:{horizontalBar:{categoryPercentage:.8,barPercentage:.9}}});var ko=fl.extend({_getValueScaleId:function(){return this.getMeta().xAxisID},_getIndexScaleId:function(){return this.getMeta().yAxisID}}),Co=dt.valueOrDefault,Ps=dt.options.resolve,ps=dt.canvas._isPointInArea;function Oo(h,E){var x=h&&h.options.ticks||{},F=x.reverse,Q=void 0===x.min?E:0,le=void 0===x.max?E:0;return{start:F?le:Q,end:F?Q:le}}function Nr(h,E,x){var F=x/2,Q=Oo(h,F),le=Oo(E,F);return{top:le.end,right:Q.end,bottom:le.start,left:Q.start}}function Qi(h){var E,x,F,Q;return dt.isObject(h)?(E=h.top,x=h.right,F=h.bottom,Q=h.left):E=x=F=Q=h,{top:E,right:x,bottom:F,left:Q}}hr._set("line",{showLines:!0,spanGaps:!1,hover:{mode:"label"},scales:{xAxes:[{type:"category",id:"x-axis-0"}],yAxes:[{type:"linear",id:"y-axis-0"}]}});var tt=Ai.extend({datasetElementType:mo.Line,dataElementType:mo.Point,_datasetElementOptions:["backgroundColor","borderCapStyle","borderColor","borderDash","borderDashOffset","borderJoinStyle","borderWidth","cubicInterpolationMode","fill"],_dataElementOptions:{backgroundColor:"pointBackgroundColor",borderColor:"pointBorderColor",borderWidth:"pointBorderWidth",hitRadius:"pointHitRadius",hoverBackgroundColor:"pointHoverBackgroundColor",hoverBorderColor:"pointHoverBorderColor",hoverBorderWidth:"pointHoverBorderWidth",hoverRadius:"pointHoverRadius",pointStyle:"pointStyle",radius:"pointRadius",rotation:"pointRotation"},update:function(h){var Oe,Je,E=this,x=E.getMeta(),F=x.dataset,Q=x.data||[],me=E._config,Fe=E._showLine=Co(me.showLine,E.chart.options.showLines);for(E._xScale=E.getScaleForId(x.xAxisID),E._yScale=E.getScaleForId(x.yAxisID),Fe&&(void 0!==me.tension&&void 0===me.lineTension&&(me.lineTension=me.tension),F._scale=E._yScale,F._datasetIndex=E.index,F._children=Q,F._model=E._resolveDatasetElementOptions(F),F.pivot()),Oe=0,Je=Q.length;Oe<Je;++Oe)E.updateElement(Q[Oe],Oe,h);for(Fe&&0!==F._model.tension&&E.updateBezierControlPoints(),Oe=0,Je=Q.length;Oe<Je;++Oe)Q[Oe].pivot()},updateElement:function(h,E,x){var nn,$n,F=this,Q=F.getMeta(),le=h.custom||{},me=F.getDataset(),Fe=F.index,Oe=me.data[E],Je=F._xScale,ht=F._yScale,gt=Q.dataset._model,Bn=F._resolveDataElementOptions(h,E);nn=Je.getPixelForValue("object"==typeof Oe?Oe:NaN,E,Fe),$n=x?ht.getBasePixel():F.calculatePointY(Oe,E,Fe),h._xScale=Je,h._yScale=ht,h._options=Bn,h._datasetIndex=Fe,h._index=E,h._model={x:nn,y:$n,skip:le.skip||isNaN(nn)||isNaN($n),radius:Bn.radius,pointStyle:Bn.pointStyle,rotation:Bn.rotation,backgroundColor:Bn.backgroundColor,borderColor:Bn.borderColor,borderWidth:Bn.borderWidth,tension:Co(le.tension,gt?gt.tension:0),steppedLine:!!gt&&gt.steppedLine,hitRadius:Bn.hitRadius}},_resolveDatasetElementOptions:function(h){var E=this,x=E._config,F=h.custom||{},Q=E.chart.options,le=Q.elements.line,me=Ai.prototype._resolveDatasetElementOptions.apply(E,arguments);return me.spanGaps=Co(x.spanGaps,Q.spanGaps),me.tension=Co(x.lineTension,le.tension),me.steppedLine=Ps([F.steppedLine,x.steppedLine,le.stepped]),me.clip=Qi(Co(x.clip,Nr(E._xScale,E._yScale,me.borderWidth))),me},calculatePointY:function(h,E,x){var Oe,ht,gt,nn,$n,Bn,Q=this.chart,le=this._yScale,me=0,Fe=0;if(le.options.stacked){for(nn=+le.getRightValue(h),Bn=($n=Q._getSortedVisibleDatasetMetas()).length,Oe=0;Oe<Bn&&(ht=$n[Oe]).index!==x;++Oe)"line"===ht.type&&ht.yAxisID===le.id&&((gt=+le.getRightValue(Q.data.datasets[ht.index].data[E]))<0?Fe+=gt||0:me+=gt||0);return le.getPixelForValue(nn<0?Fe+nn:me+nn)}return le.getPixelForValue(h)},updateBezierControlPoints:function(){var me,Fe,Oe,Je,E=this.chart,x=this.getMeta(),F=x.dataset._model,Q=E.chartArea,le=x.data||[];function ht(gt,nn,$n){return Math.max(Math.min(gt,$n),nn)}if(F.spanGaps&&(le=le.filter(function(gt){return!gt._model.skip})),"monotone"===F.cubicInterpolationMode)dt.splineCurveMonotone(le);else for(me=0,Fe=le.length;me<Fe;++me)Oe=le[me]._model,Je=dt.splineCurve(dt.previousItem(le,me)._model,Oe,dt.nextItem(le,me)._model,F.tension),Oe.controlPointPreviousX=Je.previous.x,Oe.controlPointPreviousY=Je.previous.y,Oe.controlPointNextX=Je.next.x,Oe.controlPointNextY=Je.next.y;if(E.options.elements.line.capBezierPoints)for(me=0,Fe=le.length;me<Fe;++me)ps(Oe=le[me]._model,Q)&&(me>0&&ps(le[me-1]._model,Q)&&(Oe.controlPointPreviousX=ht(Oe.controlPointPreviousX,Q.left,Q.right),Oe.controlPointPreviousY=ht(Oe.controlPointPreviousY,Q.top,Q.bottom)),me<le.length-1&&ps(le[me+1]._model,Q)&&(Oe.controlPointNextX=ht(Oe.controlPointNextX,Q.left,Q.right),Oe.controlPointNextY=ht(Oe.controlPointNextY,Q.top,Q.bottom)))},draw:function(){var Oe,h=this,E=h.chart,x=h.getMeta(),F=x.data||[],Q=E.chartArea,le=E.canvas,me=0,Fe=F.length;for(h._showLine&&(dt.canvas.clipArea(E.ctx,{left:!1===(Oe=x.dataset._model.clip).left?0:Q.left-Oe.left,right:!1===Oe.right?le.width:Q.right+Oe.right,top:!1===Oe.top?0:Q.top-Oe.top,bottom:!1===Oe.bottom?le.height:Q.bottom+Oe.bottom}),x.dataset.draw(),dt.canvas.unclipArea(E.ctx));me<Fe;++me)F[me].draw(Q)},setHoverStyle:function(h){var E=h._model,x=h._options,F=dt.getHoverColor;h.$previousStyle={backgroundColor:E.backgroundColor,borderColor:E.borderColor,borderWidth:E.borderWidth,radius:E.radius},E.backgroundColor=Co(x.hoverBackgroundColor,F(x.backgroundColor)),E.borderColor=Co(x.hoverBorderColor,F(x.borderColor)),E.borderWidth=Co(x.hoverBorderWidth,x.borderWidth),E.radius=Co(x.hoverRadius,x.radius)}}),rn=dt.options.resolve;hr._set("polarArea",{scale:{type:"radialLinear",angleLines:{display:!1},gridLines:{circular:!0},pointLabels:{display:!1},ticks:{beginAtZero:!0}},animation:{animateRotate:!0,animateScale:!0},startAngle:-.5*Math.PI,legendCallback:function(h){var le,me,Fe,E=document.createElement("ul"),x=h.data,F=x.datasets,Q=x.labels;if(E.setAttribute("class",h.id+"-legend"),F.length)for(le=0,me=F[0].data.length;le<me;++le)(Fe=E.appendChild(document.createElement("li"))).appendChild(document.createElement("span")).style.backgroundColor=F[0].backgroundColor[le],Q[le]&&Fe.appendChild(document.createTextNode(Q[le]));return E.outerHTML},legend:{labels:{generateLabels:function(h){var E=h.data;return E.labels.length&&E.datasets.length?E.labels.map(function(x,F){var Q=h.getDatasetMeta(0),le=Q.controller.getStyle(F);return{text:x,fillStyle:le.backgroundColor,strokeStyle:le.borderColor,lineWidth:le.borderWidth,hidden:isNaN(E.datasets[0].data[F])||Q.data[F].hidden,index:F}}):[]}},onClick:function(h,E){var Q,le,me,x=E.index,F=this.chart;for(Q=0,le=(F.data.datasets||[]).length;Q<le;++Q)(me=F.getDatasetMeta(Q)).data[x].hidden=!me.data[x].hidden;F.update()}},tooltips:{callbacks:{title:function(){return""},label:function(h,E){return E.labels[h.index]+": "+h.yLabel}}}});var ne=Ai.extend({dataElementType:mo.Arc,linkScales:dt.noop,_dataElementOptions:["backgroundColor","borderColor","borderWidth","borderAlign","hoverBackgroundColor","hoverBorderColor","hoverBorderWidth"],_getIndexScaleId:function(){return this.chart.scale.id},_getValueScaleId:function(){return this.chart.scale.id},update:function(h){var Oe,Je,ht,E=this,x=E.getDataset(),F=E.getMeta(),Q=E.chart.options.startAngle||0,le=E._starts=[],me=E._angles=[],Fe=F.data;for(E._updateRadius(),F.count=E.countVisibleElements(),Oe=0,Je=x.data.length;Oe<Je;Oe++)le[Oe]=Q,ht=E._computeAngle(Oe),me[Oe]=ht,Q+=ht;for(Oe=0,Je=Fe.length;Oe<Je;++Oe)Fe[Oe]._options=E._resolveDataElementOptions(Fe[Oe],Oe),E.updateElement(Fe[Oe],Oe,h)},_updateRadius:function(){var h=this,E=h.chart,x=E.chartArea,F=E.options,Q=Math.min(x.right-x.left,x.bottom-x.top);E.outerRadius=Math.max(Q/2,0),E.innerRadius=Math.max(F.cutoutPercentage?E.outerRadius/100*F.cutoutPercentage:1,0),E.radiusLength=(E.outerRadius-E.innerRadius)/E.getVisibleDatasetCount(),h.outerRadius=E.outerRadius-E.radiusLength*h.index,h.innerRadius=h.outerRadius-E.radiusLength},updateElement:function(h,E,x){var F=this,Q=F.chart,le=F.getDataset(),me=Q.options,Fe=me.animation,Oe=Q.scale,Je=Q.data.labels,ht=Oe.xCenter,gt=Oe.yCenter,nn=me.startAngle,$n=h.hidden?0:Oe.getDistanceFromCenterForValue(le.data[E]),Bn=F._starts[E],ar=Bn+(h.hidden?0:F._angles[E]),Pr=Fe.animateScale?0:Oe.getDistanceFromCenterForValue(le.data[E]),$i=h._options||{};dt.extend(h,{_datasetIndex:F.index,_index:E,_scale:Oe,_model:{backgroundColor:$i.backgroundColor,borderColor:$i.borderColor,borderWidth:$i.borderWidth,borderAlign:$i.borderAlign,x:ht,y:gt,innerRadius:0,outerRadius:x?Pr:$n,startAngle:x&&Fe.animateRotate?nn:Bn,endAngle:x&&Fe.animateRotate?nn:ar,label:dt.valueAtIndexOrDefault(Je,E,Je[E])}}),h.pivot()},countVisibleElements:function(){var h=this.getDataset(),E=this.getMeta(),x=0;return dt.each(E.data,function(F,Q){!isNaN(h.data[Q])&&!F.hidden&&x++}),x},setHoverStyle:function(h){var E=h._model,x=h._options,F=dt.getHoverColor,Q=dt.valueOrDefault;h.$previousStyle={backgroundColor:E.backgroundColor,borderColor:E.borderColor,borderWidth:E.borderWidth},E.backgroundColor=Q(x.hoverBackgroundColor,F(x.backgroundColor)),E.borderColor=Q(x.hoverBorderColor,F(x.borderColor)),E.borderWidth=Q(x.hoverBorderWidth,x.borderWidth)},_computeAngle:function(h){var E=this,x=this.getMeta().count,F=E.getDataset(),Q=E.getMeta();return isNaN(F.data[h])||Q.data[h].hidden?0:rn([E.chart.options.elements.arc.angle,2*Math.PI/x],{chart:E.chart,dataIndex:h,dataset:F,datasetIndex:E.index},h)}});hr._set("pie",dt.clone(hr.doughnut)),hr._set("pie",{cutoutPercentage:0});var Le=Ys,Lt=dt.valueOrDefault;hr._set("radar",{spanGaps:!1,scale:{type:"radialLinear"},elements:{line:{fill:"start",tension:0}}});var on=Ai.extend({datasetElementType:mo.Line,dataElementType:mo.Point,linkScales:dt.noop,_datasetElementOptions:["backgroundColor","borderWidth","borderColor","borderCapStyle","borderDash","borderDashOffset","borderJoinStyle","fill"],_dataElementOptions:{backgroundColor:"pointBackgroundColor",borderColor:"pointBorderColor",borderWidth:"pointBorderWidth",hitRadius:"pointHitRadius",hoverBackgroundColor:"pointHoverBackgroundColor",hoverBorderColor:"pointHoverBorderColor",hoverBorderWidth:"pointHoverBorderWidth",hoverRadius:"pointHoverRadius",pointStyle:"pointStyle",radius:"pointRadius",rotation:"pointRotation"},_getIndexScaleId:function(){return this.chart.scale.id},_getValueScaleId:function(){return this.chart.scale.id},update:function(h){var Fe,Oe,E=this,x=E.getMeta(),F=x.dataset,Q=x.data||[],le=E.chart.scale,me=E._config;for(void 0!==me.tension&&void 0===me.lineTension&&(me.lineTension=me.tension),F._scale=le,F._datasetIndex=E.index,F._children=Q,F._loop=!0,F._model=E._resolveDatasetElementOptions(F),F.pivot(),Fe=0,Oe=Q.length;Fe<Oe;++Fe)E.updateElement(Q[Fe],Fe,h);for(E.updateBezierControlPoints(),Fe=0,Oe=Q.length;Fe<Oe;++Fe)Q[Fe].pivot()},updateElement:function(h,E,x){var F=this,Q=h.custom||{},le=F.getDataset(),me=F.chart.scale,Fe=me.getPointPositionForValue(E,le.data[E]),Oe=F._resolveDataElementOptions(h,E),Je=F.getMeta().dataset._model,ht=x?me.xCenter:Fe.x,gt=x?me.yCenter:Fe.y;h._scale=me,h._options=Oe,h._datasetIndex=F.index,h._index=E,h._model={x:ht,y:gt,skip:Q.skip||isNaN(ht)||isNaN(gt),radius:Oe.radius,pointStyle:Oe.pointStyle,rotation:Oe.rotation,backgroundColor:Oe.backgroundColor,borderColor:Oe.borderColor,borderWidth:Oe.borderWidth,tension:Lt(Q.tension,Je?Je.tension:0),hitRadius:Oe.hitRadius}},_resolveDatasetElementOptions:function(){var h=this,E=h._config,x=h.chart.options,F=Ai.prototype._resolveDatasetElementOptions.apply(h,arguments);return F.spanGaps=Lt(E.spanGaps,x.spanGaps),F.tension=Lt(E.lineTension,x.elements.line.tension),F},updateBezierControlPoints:function(){var Q,le,me,Fe,E=this.getMeta(),x=this.chart.chartArea,F=E.data||[];function Oe(Je,ht,gt){return Math.max(Math.min(Je,gt),ht)}for(E.dataset._model.spanGaps&&(F=F.filter(function(Je){return!Je._model.skip})),Q=0,le=F.length;Q<le;++Q)me=F[Q]._model,Fe=dt.splineCurve(dt.previousItem(F,Q,!0)._model,me,dt.nextItem(F,Q,!0)._model,me.tension),me.controlPointPreviousX=Oe(Fe.previous.x,x.left,x.right),me.controlPointPreviousY=Oe(Fe.previous.y,x.top,x.bottom),me.controlPointNextX=Oe(Fe.next.x,x.left,x.right),me.controlPointNextY=Oe(Fe.next.y,x.top,x.bottom)},setHoverStyle:function(h){var E=h._model,x=h._options,F=dt.getHoverColor;h.$previousStyle={backgroundColor:E.backgroundColor,borderColor:E.borderColor,borderWidth:E.borderWidth,radius:E.radius},E.backgroundColor=Lt(x.hoverBackgroundColor,F(x.backgroundColor)),E.borderColor=Lt(x.hoverBorderColor,F(x.borderColor)),E.borderWidth=Lt(x.hoverBorderWidth,x.borderWidth),E.radius=Lt(x.hoverRadius,x.radius)}});hr._set("scatter",{hover:{mode:"single"},scales:{xAxes:[{id:"x-axis-1",type:"linear",position:"bottom"}],yAxes:[{id:"y-axis-1",type:"linear",position:"left"}]},tooltips:{callbacks:{title:function(){return""},label:function(h){return"("+h.xLabel+", "+h.yLabel+")"}}}}),hr._set("global",{datasets:{scatter:{showLine:!1}}});var bi={bar:fl,bubble:Zo,doughnut:Ys,horizontalBar:ko,line:tt,polarArea:ne,pie:Le,radar:on,scatter:tt};function Ii(h,E){return h.native?{x:h.x,y:h.y}:dt.getRelativePosition(h,E)}function hs(h,E){var F,Q,le,me,Fe,Oe,x=h._getSortedVisibleDatasetMetas();for(Q=0,me=x.length;Q<me;++Q)for(le=0,Fe=(F=x[Q].data).length;le<Fe;++le)(Oe=F[le])._view.skip||E(Oe)}function zo(h,E){var x=[];return hs(h,function(F){F.inRange(E.x,E.y)&&x.push(F)}),x}function Ls(h,E,x,F){var Q=Number.POSITIVE_INFINITY,le=[];return hs(h,function(me){if(!x||me.inRange(E.x,E.y)){var Fe=me.getCenterPoint(),Oe=F(E,Fe);Oe<Q?(le=[me],Q=Oe):Oe===Q&&le.push(me)}}),le}function Xs(h){var E=-1!==h.indexOf("x"),x=-1!==h.indexOf("y");return function(F,Q){var le=E?Math.abs(F.x-Q.x):0,me=x?Math.abs(F.y-Q.y):0;return Math.sqrt(Math.pow(le,2)+Math.pow(me,2))}}function vl(h,E,x){var F=Ii(E,h);x.axis=x.axis||"x";var Q=Xs(x.axis),le=x.intersect?zo(h,F):Ls(h,F,!1,Q),me=[];return le.length?(h._getSortedVisibleDatasetMetas().forEach(function(Fe){var Oe=Fe.data[le[0]._index];Oe&&!Oe._view.skip&&me.push(Oe)}),me):[]}var ol={modes:{single:function(h,E){var x=Ii(E,h),F=[];return hs(h,function(Q){if(Q.inRange(x.x,x.y))return F.push(Q),F}),F.slice(0,1)},label:vl,index:vl,dataset:function(h,E,x){var F=Ii(E,h);x.axis=x.axis||"xy";var Q=Xs(x.axis),le=x.intersect?zo(h,F):Ls(h,F,!1,Q);return le.length>0&&(le=h.getDatasetMeta(le[0]._datasetIndex).data),le},"x-axis":function(h,E){return vl(h,E,{intersect:!1})},point:function(h,E){return zo(h,Ii(E,h))},nearest:function(h,E,x){var F=Ii(E,h);x.axis=x.axis||"xy";var Q=Xs(x.axis);return Ls(h,F,x.intersect,Q)},x:function(h,E,x){var F=Ii(E,h),Q=[],le=!1;return hs(h,function(me){me.inXRange(F.x)&&Q.push(me),me.inRange(F.x,F.y)&&(le=!0)}),x.intersect&&!le&&(Q=[]),Q},y:function(h,E,x){var F=Ii(E,h),Q=[],le=!1;return hs(h,function(me){me.inYRange(F.y)&&Q.push(me),me.inRange(F.x,F.y)&&(le=!0)}),x.intersect&&!le&&(Q=[]),Q}}},Wl=dt.extend;function Qu(h,E){return dt.where(h,function(x){return x.pos===E})}function hc(h,E){return h.sort(function(x,F){var Q=E?F:x,le=E?x:F;return Q.weight===le.weight?Q.index-le.index:Q.weight-le.weight})}function Ku(h,E,x,F){return Math.max(h[x],E[x])+Math.max(h[F],E[F])}function Qa(h,E,x){var le,me,F=x.box,Q=h.maxPadding;if(x.size&&(h[x.pos]-=x.size),x.size=x.horizontal?F.height:F.width,h[x.pos]+=x.size,F.getPadding){var Fe=F.getPadding();Q.top=Math.max(Q.top,Fe.top),Q.left=Math.max(Q.left,Fe.left),Q.bottom=Math.max(Q.bottom,Fe.bottom),Q.right=Math.max(Q.right,Fe.right)}if(le=E.outerWidth-Ku(Q,h,"left","right"),me=E.outerHeight-Ku(Q,h,"top","bottom"),le!==h.w||me!==h.h){h.w=le,h.h=me;var Oe=x.horizontal?[le,h.w]:[me,h.h];return!(Oe[0]===Oe[1]||isNaN(Oe[0])&&isNaN(Oe[1]))}}function tu(h,E){var x=E.maxPadding;return function F(Q){var le={left:0,top:0,right:0,bottom:0};return Q.forEach(function(me){le[me]=Math.max(E[me],x[me])}),le}(h?["left","right"]:["top","bottom"])}function Wa(h,E,x){var Q,le,me,Fe,Oe,Je,F=[];for(Q=0,le=h.length;Q<le;++Q)(Fe=(me=h[Q]).box).update(me.width||E.w,me.height||E.h,tu(me.horizontal,E)),Qa(E,x,me)&&(Je=!0,F.length&&(Oe=!0)),Fe.fullWidth||F.push(me);return Oe&&Wa(F,E,x)||Je}function Ml(h,E,x){var me,Fe,Oe,Je,F=x.padding,Q=E.x,le=E.y;for(me=0,Fe=h.length;me<Fe;++me)Je=(Oe=h[me]).box,Oe.horizontal?(Je.left=Je.fullWidth?F.left:E.left,Je.right=Je.fullWidth?x.outerWidth-F.right:E.left+E.w,Je.top=le,Je.bottom=le+Je.height,Je.width=Je.right-Je.left,le=Je.bottom):(Je.left=Q,Je.right=Q+Je.width,Je.top=E.top,Je.bottom=E.top+E.h,Je.height=Je.bottom-Je.top,Q=Je.right);E.x=Q,E.y=le}hr._set("global",{layout:{padding:{top:0,right:0,bottom:0,left:0}}});var Hl={defaults:{},addBox:function(h,E){h.boxes||(h.boxes=[]),E.fullWidth=E.fullWidth||!1,E.position=E.position||"top",E.weight=E.weight||0,E._layers=E._layers||function(){return[{z:0,draw:function(){E.draw.apply(E,arguments)}}]},h.boxes.push(E)},removeBox:function(h,E){var x=h.boxes?h.boxes.indexOf(E):-1;-1!==x&&h.boxes.splice(x,1)},configure:function(h,E,x){for(var me,F=["fullWidth","position","weight"],Q=F.length,le=0;le<Q;++le)x.hasOwnProperty(me=F[le])&&(E[me]=x[me])},update:function(h,E,x){if(h){var Q=dt.options.toPadding((h.options.layout||{}).padding),le=E-Q.width,me=x-Q.height,Fe=function Pl(h){var E=function Tl(h){var x,F,Q,E=[];for(x=0,F=(h||[]).length;x<F;++x)E.push({index:x,box:Q=h[x],pos:Q.position,horizontal:Q.isHorizontal(),weight:Q.weight});return E}(h),x=hc(Qu(E,"left"),!0),F=hc(Qu(E,"right")),Q=hc(Qu(E,"top"),!0),le=hc(Qu(E,"bottom"));return{leftAndTop:x.concat(Q),rightAndBottom:F.concat(le),chartArea:Qu(E,"chartArea"),vertical:x.concat(F),horizontal:Q.concat(le)}}(h.boxes),Oe=Fe.vertical,Je=Fe.horizontal,ht=Object.freeze({outerWidth:E,outerHeight:x,padding:Q,availableWidth:le,vBoxMaxWidth:le/2/Oe.length,hBoxMaxHeight:me/2}),gt=Wl({maxPadding:Wl({},Q),w:le,h:me,x:Q.left,y:Q.top},Q);(function _c(h,E){var x,F,Q;for(x=0,F=h.length;x<F;++x)(Q=h[x]).width=Q.horizontal?Q.box.fullWidth&&E.availableWidth:E.vBoxMaxWidth,Q.height=Q.horizontal&&E.hBoxMaxHeight})(Oe.concat(Je),ht),Wa(Oe,gt,ht),Wa(Je,gt,ht)&&Wa(Oe,gt,ht),function Mc(h){var E=h.maxPadding;function x(F){var Q=Math.max(E[F]-h[F],0);return h[F]+=Q,Q}h.y+=x("top"),h.x+=x("left"),x("right"),x("bottom")}(gt),Ml(Fe.leftAndTop,gt,ht),gt.x+=gt.w,gt.y+=gt.h,Ml(Fe.rightAndBottom,gt,ht),h.chartArea={left:gt.left,top:gt.top,right:gt.left+gt.w,bottom:gt.top+gt.h},dt.each(Fe.chartArea,function(nn){var $n=nn.box;Wl($n,h.chartArea),$n.update(gt.w,gt.h)})}}},ot=function f(h){return h&&h.default||h}(Object.freeze({__proto__:null,default:"/*\r\n * DOM element rendering detection\r\n * https://davidwalsh.name/detect-node-insertion\r\n */\r\n@keyframes chartjs-render-animation {\r\n\tfrom { opacity: 0.99; }\r\n\tto { opacity: 1; }\r\n}\r\n\r\n.chartjs-render-monitor {\r\n\tanimation: chartjs-render-animation 0.001s;\r\n}\r\n\r\n/*\r\n * DOM element resizing detection\r\n * https://github.com/marcj/css-element-queries\r\n */\r\n.chartjs-size-monitor,\r\n.chartjs-size-monitor-expand,\r\n.chartjs-size-monitor-shrink {\r\n\tposition: absolute;\r\n\tdirection: ltr;\r\n\tleft: 0;\r\n\ttop: 0;\r\n\tright: 0;\r\n\tbottom: 0;\r\n\toverflow: hidden;\r\n\tpointer-events: none;\r\n\tvisibility: hidden;\r\n\tz-index: -1;\r\n}\r\n\r\n.chartjs-size-monitor-expand > div {\r\n\tposition: absolute;\r\n\twidth: 1000000px;\r\n\theight: 1000000px;\r\n\tleft: 0;\r\n\ttop: 0;\r\n}\r\n\r\n.chartjs-size-monitor-shrink > div {\r\n\tposition: absolute;\r\n\twidth: 200%;\r\n\theight: 200%;\r\n\tleft: 0;\r\n\ttop: 0;\r\n}\r\n"})),jt="$chartjs",zn="chartjs-",qr=zn+"size-monitor",Di=zn+"render-monitor",js=["animationstart","webkitAnimationStart"],As={touchstart:"mousedown",touchmove:"mousemove",touchend:"mouseup",pointerenter:"mouseenter",pointerdown:"mousedown",pointermove:"mousemove",pointerup:"mouseup",pointerleave:"mouseout",pointerout:"mouseout"};function Ns(h,E){var x=dt.getStyle(h,E),F=x&&x.match(/^(\d+)(\.\d+)?px$/);return F?Number(F[1]):void 0}var sl=!!function(){var h=!1;try{var E=Object.defineProperty({},"passive",{get:function(){h=!0}});window.addEventListener("e",null,E)}catch(x){}return h}()&&{passive:!0};function Bs(h,E,x){h.addEventListener(E,x,sl)}function lt(h,E,x){h.removeEventListener(E,x,sl)}function Xe(h,E,x,F,Q){return{type:h,chart:E,native:Q||null,x:void 0!==x?x:null,y:void 0!==F?F:null}}function pi(h){var E=document.createElement("div");return E.className=h||"",E}function Xu(h,E,x){var F=h[jt]||(h[jt]={}),Q=F.resizer=function Wo(h){var E=1e6,x=pi(qr),F=pi(qr+"-expand"),Q=pi(qr+"-shrink");F.appendChild(pi()),Q.appendChild(pi()),x.appendChild(F),x.appendChild(Q),x._reset=function(){F.scrollLeft=E,F.scrollTop=E,Q.scrollLeft=E,Q.scrollTop=E};var le=function(){x._reset(),h()};return Bs(F,"scroll",le.bind(F,"expand")),Bs(Q,"scroll",le.bind(Q,"shrink")),x}(function Ut(h,E){var x=!1,F=[];return function(){F=Array.prototype.slice.call(arguments),E=E||this,x||(x=!0,dt.requestAnimFrame.call(window,function(){x=!1,h.apply(E,F)}))}}(function(){if(F.resizer){var le=x.options.maintainAspectRatio&&h.parentNode,me=le?le.clientWidth:0;E(Xe("resize",x)),le&&le.clientWidth<me&&x.canvas&&E(Xe("resize",x))}}));!function Ya(h,E){var x=h[jt]||(h[jt]={}),F=x.renderProxy=function(Q){"chartjs-render-animation"===Q.animationName&&E()};dt.each(js,function(Q){Bs(h,Q,F)}),x.reflow=!!h.offsetParent,h.classList.add(Di)}(h,function(){if(F.resizer){var le=h.parentNode;le&&le!==Q.parentNode&&le.insertBefore(Q,le.firstChild),Q._reset()}})}function Lc(h){var E=h[jt]||{},x=E.resizer;delete E.resizer,function yl(h){var E=h[jt]||{},x=E.renderProxy;x&&(dt.each(js,function(F){lt(h,F,x)}),delete E.renderProxy),h.classList.remove(Di)}(h),x&&x.parentNode&&x.parentNode.removeChild(x)}var Hi={disableCSSInjection:!1,_enabled:"undefined"!=typeof window&&"undefined"!=typeof document,_ensureLoaded:function(h){if(!this.disableCSSInjection){var E=h.getRootNode?h.getRootNode():document;!function vd(h,E){var x=h[jt]||(h[jt]={});if(!x.containsStyles){x.containsStyles=!0,E="/* Chart.js */\n"+E;var F=document.createElement("style");F.setAttribute("type","text/css"),F.appendChild(document.createTextNode(E)),h.appendChild(F)}}(E.host?E:document.head,ot)}},acquireContext:function(h,E){"string"==typeof h?h=document.getElementById(h):h.length&&(h=h[0]),h&&h.canvas&&(h=h.canvas);var x=h&&h.getContext&&h.getContext("2d");return x&&x.canvas===h?(this._ensureLoaded(h),function Io(h,E){var x=h.style,F=h.getAttribute("height"),Q=h.getAttribute("width");if(h[jt]={initial:{height:F,width:Q,style:{display:x.display,height:x.height,width:x.width}}},x.display=x.display||"block",null===Q||""===Q){var le=Ns(h,"width");void 0!==le&&(h.width=le)}if(null===F||""===F)if(""===h.style.height)h.height=h.width/(E.options.aspectRatio||2);else{var me=Ns(h,"height");void 0!==le&&(h.height=me)}return h}(h,E),x):null},releaseContext:function(h){var E=h.canvas;if(E[jt]){var x=E[jt].initial;["height","width"].forEach(function(F){var Q=x[F];dt.isNullOrUndef(Q)?E.removeAttribute(F):E.setAttribute(F,Q)}),dt.each(x.style||{},function(F,Q){E.style[Q]=F}),E.width=E.width,delete E[jt]}},addEventListener:function(h,E,x){var F=h.canvas;if("resize"!==E){var Q=x[jt]||(x[jt]={});Bs(F,E,(Q.proxies||(Q.proxies={}))[h.id+"_"+E]=function(Fe){x(function ke(h,E){var x=As[h.type]||h.type,F=dt.getRelativePosition(h,E);return Xe(x,E,F.x,F.y,h)}(Fe,h))})}else Xu(F,x,h)},removeEventListener:function(h,E,x){var F=h.canvas;if("resize"!==E){var me=((x[jt]||{}).proxies||{})[h.id+"_"+E];!me||lt(F,E,me)}else Lc(F)}};dt.addEvent=Bs,dt.removeEvent=lt;var Ia=dt.extend({initialize:function(){},acquireContext:function(){},releaseContext:function(){},addEventListener:function(){},removeEventListener:function(){}},Hi._enabled?Hi:{acquireContext:function(h){return h&&h.canvas&&(h=h.canvas),h&&h.getContext("2d")||null}});hr._set("global",{plugins:{}});var ys={_plugins:[],_cacheId:0,register:function(h){var E=this._plugins;[].concat(h).forEach(function(x){-1===E.indexOf(x)&&E.push(x)}),this._cacheId++},unregister:function(h){var E=this._plugins;[].concat(h).forEach(function(x){var F=E.indexOf(x);-1!==F&&E.splice(F,1)}),this._cacheId++},clear:function(){this._plugins=[],this._cacheId++},count:function(){return this._plugins.length},getAll:function(){return this._plugins},notify:function(h,E,x){var le,me,Fe,Oe,Je,F=this.descriptors(h),Q=F.length;for(le=0;le<Q;++le)if("function"==typeof(Je=(Fe=(me=F[le]).plugin)[E])&&((Oe=[h].concat(x||[])).push(me.options),!1===Je.apply(Fe,Oe)))return!1;return!0},descriptors:function(h){var E=h.$plugins||(h.$plugins={});if(E.id===this._cacheId)return E.descriptors;var x=[],F=[],Q=h&&h.config||{},le=Q.options&&Q.options.plugins||{};return this._plugins.concat(Q.plugins||[]).forEach(function(me){if(-1===x.indexOf(me)){var Oe=me.id,Je=le[Oe];!1!==Je&&(!0===Je&&(Je=dt.clone(hr.global.plugins[Oe])),x.push(me),F.push({plugin:me,options:Je||{}}))}}),E.descriptors=F,E.id=this._cacheId,F},_invalidate:function(h){delete h.$plugins}},qu={constructors:{},defaults:{},registerScaleType:function(h,E,x){this.constructors[h]=E,this.defaults[h]=dt.clone(x)},getScaleConstructor:function(h){return this.constructors.hasOwnProperty(h)?this.constructors[h]:void 0},getScaleDefaults:function(h){return this.defaults.hasOwnProperty(h)?dt.merge(Object.create(null),[hr.scale,this.defaults[h]]):{}},updateScaleDefaults:function(h,E){var x=this;x.defaults.hasOwnProperty(h)&&(x.defaults[h]=dt.extend(x.defaults[h],E))},addScalesToLayout:function(h){dt.each(h.scales,function(E){E.fullWidth=E.options.fullWidth,E.position=E.options.position,E.weight=E.options.weight,Hl.addBox(h,E)})}},bl=dt.valueOrDefault,su=dt.rtl.getRtlAdapter;hr._set("global",{tooltips:{enabled:!0,custom:null,mode:"nearest",position:"average",intersect:!0,backgroundColor:"rgba(0,0,0,0.8)",titleFontStyle:"bold",titleSpacing:2,titleMarginBottom:6,titleFontColor:"#fff",titleAlign:"left",bodySpacing:2,bodyFontColor:"#fff",bodyAlign:"left",footerFontStyle:"bold",footerSpacing:2,footerMarginTop:6,footerFontColor:"#fff",footerAlign:"left",yPadding:6,xPadding:6,caretPadding:2,caretSize:5,cornerRadius:6,multiKeyBackground:"#fff",displayColors:!0,borderColor:"rgba(0,0,0,0)",borderWidth:0,callbacks:{beforeTitle:dt.noop,title:function(h,E){var x="",F=E.labels,Q=F?F.length:0;if(h.length>0){var le=h[0];le.label?x=le.label:le.xLabel?x=le.xLabel:Q>0&&le.index<Q&&(x=F[le.index])}return x},afterTitle:dt.noop,beforeBody:dt.noop,beforeLabel:dt.noop,label:function(h,E){var x=E.datasets[h.datasetIndex].label||"";return x&&(x+=": "),dt.isNullOrUndef(h.value)?x+=h.yLabel:x+=h.value,x},labelColor:function(h,E){var Q=E.getDatasetMeta(h.datasetIndex).data[h.index]._view;return{borderColor:Q.borderColor,backgroundColor:Q.backgroundColor}},labelTextColor:function(){return this._options.bodyFontColor},afterLabel:dt.noop,afterBody:dt.noop,beforeFooter:dt.noop,footer:dt.noop,afterFooter:dt.noop}}});var vu={average:function(h){if(!h.length)return!1;var E,x,F=0,Q=0,le=0;for(E=0,x=h.length;E<x;++E){var me=h[E];if(me&&me.hasValue()){var Fe=me.tooltipPosition();F+=Fe.x,Q+=Fe.y,++le}}return{x:F/le,y:Q/le}},nearest:function(h,E){var le,me,Fe,x=E.x,F=E.y,Q=Number.POSITIVE_INFINITY;for(le=0,me=h.length;le<me;++le){var Oe=h[le];if(Oe&&Oe.hasValue()){var Je=Oe.getCenterPoint(),ht=dt.distanceBetweenPoints(E,Je);ht<Q&&(Q=ht,Fe=Oe)}}if(Fe){var gt=Fe.tooltipPosition();x=gt.x,F=gt.y}return{x,y:F}}};function nu(h,E){return E&&(dt.isArray(E)?Array.prototype.push.apply(h,E):h.push(E)),h}function ra(h){return("string"==typeof h||h instanceof String)&&h.indexOf("\n")>-1?h.split("\n"):h}function yu(h){var E=h._xScale,x=h._yScale||h._scale,F=h._index,Q=h._datasetIndex,le=h._chart.getDatasetMeta(Q).controller,me=le._getIndexScale(),Fe=le._getValueScale();return{xLabel:E?E.getLabelForIndex(F,Q):"",yLabel:x?x.getLabelForIndex(F,Q):"",label:me?""+me.getLabelForIndex(F,Q):"",value:Fe?""+Fe.getLabelForIndex(F,Q):"",index:F,datasetIndex:Q,x:h._model.x,y:h._model.y}}function rd(h){var E=hr.global;return{xPadding:h.xPadding,yPadding:h.yPadding,xAlign:h.xAlign,yAlign:h.yAlign,rtl:h.rtl,textDirection:h.textDirection,bodyFontColor:h.bodyFontColor,_bodyFontFamily:bl(h.bodyFontFamily,E.defaultFontFamily),_bodyFontStyle:bl(h.bodyFontStyle,E.defaultFontStyle),_bodyAlign:h.bodyAlign,bodyFontSize:bl(h.bodyFontSize,E.defaultFontSize),bodySpacing:h.bodySpacing,titleFontColor:h.titleFontColor,_titleFontFamily:bl(h.titleFontFamily,E.defaultFontFamily),_titleFontStyle:bl(h.titleFontStyle,E.defaultFontStyle),titleFontSize:bl(h.titleFontSize,E.defaultFontSize),_titleAlign:h.titleAlign,titleSpacing:h.titleSpacing,titleMarginBottom:h.titleMarginBottom,footerFontColor:h.footerFontColor,_footerFontFamily:bl(h.footerFontFamily,E.defaultFontFamily),_footerFontStyle:bl(h.footerFontStyle,E.defaultFontStyle),footerFontSize:bl(h.footerFontSize,E.defaultFontSize),_footerAlign:h.footerAlign,footerSpacing:h.footerSpacing,footerMarginTop:h.footerMarginTop,caretSize:h.caretSize,cornerRadius:h.cornerRadius,backgroundColor:h.backgroundColor,opacity:0,legendColorBackground:h.multiKeyBackground,displayColors:h.displayColors,borderColor:h.borderColor,borderWidth:h.borderWidth}}function id(h,E){return"center"===E?h.x+h.width/2:"right"===E?h.x+h.width-h.xPadding:h.x+h.xPadding}function $u(h){return nu([],ra(h))}var Hu=pt.extend({initialize:function(){this._model=rd(this._options),this._lastActive=[]},getTitle:function(){var h=this,x=h._options.callbacks,F=x.beforeTitle.apply(h,arguments),Q=x.title.apply(h,arguments),le=x.afterTitle.apply(h,arguments),me=[];return me=nu(me,ra(F)),me=nu(me,ra(Q)),nu(me,ra(le))},getBeforeBody:function(){return $u(this._options.callbacks.beforeBody.apply(this,arguments))},getBody:function(h,E){var x=this,F=x._options.callbacks,Q=[];return dt.each(h,function(le){var me={before:[],lines:[],after:[]};nu(me.before,ra(F.beforeLabel.call(x,le,E))),nu(me.lines,F.label.call(x,le,E)),nu(me.after,ra(F.afterLabel.call(x,le,E))),Q.push(me)}),Q},getAfterBody:function(){return $u(this._options.callbacks.afterBody.apply(this,arguments))},getFooter:function(){var h=this,E=h._options.callbacks,x=E.beforeFooter.apply(h,arguments),F=E.footer.apply(h,arguments),Q=E.afterFooter.apply(h,arguments),le=[];return le=nu(le,ra(x)),le=nu(le,ra(F)),nu(le,ra(Q))},update:function(h){var gt,nn,E=this,x=E._options,F=E._model,Q=E._model=rd(x),le=E._active,me=E._data,Fe={xAlign:F.xAlign,yAlign:F.yAlign},Oe={x:F.x,y:F.y},Je={width:F.width,height:F.height},ht={x:F.caretX,y:F.caretY};if(le.length){Q.opacity=1;var $n=[],Bn=[];ht=vu[x.position].call(E,le,E._eventPosition);var ar=[];for(gt=0,nn=le.length;gt<nn;++gt)ar.push(yu(le[gt]));x.filter&&(ar=ar.filter(function(Pr){return x.filter(Pr,me)})),x.itemSort&&(ar=ar.sort(function(Pr,$i){return x.itemSort(Pr,$i,me)})),dt.each(ar,function(Pr){$n.push(x.callbacks.labelColor.call(E,Pr,E._chart)),Bn.push(x.callbacks.labelTextColor.call(E,Pr,E._chart))}),Q.title=E.getTitle(ar,me),Q.beforeBody=E.getBeforeBody(ar,me),Q.body=E.getBody(ar,me),Q.afterBody=E.getAfterBody(ar,me),Q.footer=E.getFooter(ar,me),Q.x=ht.x,Q.y=ht.y,Q.caretPadding=x.caretPadding,Q.labelColors=$n,Q.labelTextColors=Bn,Q.dataPoints=ar,Oe=function uu(h,E,x,F){var Q=h.x,le=h.y,Fe=h.caretPadding,Je=x.xAlign,ht=x.yAlign,gt=h.caretSize+Fe,nn=h.cornerRadius+Fe;return"right"===Je?Q-=E.width:"center"===Je&&((Q-=E.width/2)+E.width>F.width&&(Q=F.width-E.width),Q<0&&(Q=0)),"top"===ht?le+=gt:le-="bottom"===ht?E.height+gt:E.height/2,"center"===ht?"left"===Je?Q+=gt:"right"===Je&&(Q-=gt):"left"===Je?Q-=nn:"right"===Je&&(Q+=nn),{x:Q,y:le}}(Q,Je=function ec(h,E){var x=h._chart.ctx,F=2*E.yPadding,Q=0,le=E.body,me=le.reduce(function(Bn,ar){return Bn+ar.before.length+ar.lines.length+ar.after.length},0),Fe=E.title.length,Oe=E.footer.length,Je=E.titleFontSize,ht=E.bodyFontSize,gt=E.footerFontSize;F+=Fe*Je,F+=Fe?(Fe-1)*E.titleSpacing:0,F+=Fe?E.titleMarginBottom:0,F+=(me+=E.beforeBody.length+E.afterBody.length)*ht,F+=me?(me-1)*E.bodySpacing:0,F+=Oe?E.footerMarginTop:0,F+=Oe*gt,F+=Oe?(Oe-1)*E.footerSpacing:0;var nn=0,$n=function(Bn){Q=Math.max(Q,x.measureText(Bn).width+nn)};return x.font=dt.fontString(Je,E._titleFontStyle,E._titleFontFamily),dt.each(E.title,$n),x.font=dt.fontString(ht,E._bodyFontStyle,E._bodyFontFamily),dt.each(E.beforeBody.concat(E.afterBody),$n),nn=E.displayColors?ht+2:0,dt.each(le,function(Bn){dt.each(Bn.before,$n),dt.each(Bn.lines,$n),dt.each(Bn.after,$n)}),nn=0,x.font=dt.fontString(gt,E._footerFontStyle,E._footerFontFamily),dt.each(E.footer,$n),{width:Q+=2*E.xPadding,height:F}}(this,Q),Fe=function au(h,E){var x=h._model,F=h._chart,Q=h._chart.chartArea,le="center",me="center";x.y<E.height?me="top":x.y>F.height-E.height&&(me="bottom");var Fe,Oe,Je,ht,gt,nn=(Q.left+Q.right)/2,$n=(Q.top+Q.bottom)/2;"center"===me?(Fe=function(ar){return ar<=nn},Oe=function(ar){return ar>nn}):(Fe=function(ar){return ar<=E.width/2},Oe=function(ar){return ar>=F.width-E.width/2}),Je=function(ar){return ar+E.width+x.caretSize+x.caretPadding>F.width},ht=function(ar){return ar-E.width-x.caretSize-x.caretPadding<0},gt=function(ar){return ar<=$n?"top":"bottom"},Fe(x.x)?(le="left",Je(x.x)&&(le="center",me=gt(x.y))):Oe(x.x)&&(le="right",ht(x.x)&&(le="center",me=gt(x.y)));var Bn=h._options;return{xAlign:Bn.xAlign?Bn.xAlign:le,yAlign:Bn.yAlign?Bn.yAlign:me}}(this,Je),E._chart)}else Q.opacity=0;return Q.xAlign=Fe.xAlign,Q.yAlign=Fe.yAlign,Q.x=Oe.x,Q.y=Oe.y,Q.width=Je.width,Q.height=Je.height,Q.caretX=ht.x,Q.caretY=ht.y,E._model=Q,h&&x.custom&&x.custom.call(E,Q),E},drawCaret:function(h,E){var x=this._chart.ctx,Q=this.getCaretPosition(h,E,this._view);x.lineTo(Q.x1,Q.y1),x.lineTo(Q.x2,Q.y2),x.lineTo(Q.x3,Q.y3)},getCaretPosition:function(h,E,x){var F,Q,le,me,Fe,Oe,Je=x.caretSize,ht=x.cornerRadius,gt=x.xAlign,nn=x.yAlign,$n=h.x,Bn=h.y,ar=E.width,Pr=E.height;if("center"===nn)Fe=Bn+Pr/2,"left"===gt?(Q=(F=$n)-Je,le=F,me=Fe+Je,Oe=Fe-Je):(Q=(F=$n+ar)+Je,le=F,me=Fe-Je,Oe=Fe+Je);else if("left"===gt?(F=(Q=$n+ht+Je)-Je,le=Q+Je):"right"===gt?(F=(Q=$n+ar-ht-Je)-Je,le=Q+Je):(F=(Q=x.caretX)-Je,le=Q+Je),"top"===nn)Fe=(me=Bn)-Je,Oe=me;else{Fe=(me=Bn+Pr)+Je,Oe=me;var $i=le;le=F,F=$i}return{x1:F,x2:Q,x3:le,y1:me,y2:Fe,y3:Oe}},drawTitle:function(h,E,x){var le,me,Fe,F=E.title,Q=F.length;if(Q){var Oe=su(E.rtl,E.x,E.width);for(h.x=id(E,E._titleAlign),x.textAlign=Oe.textAlign(E._titleAlign),x.textBaseline="middle",le=E.titleFontSize,me=E.titleSpacing,x.fillStyle=E.titleFontColor,x.font=dt.fontString(le,E._titleFontStyle,E._titleFontFamily),Fe=0;Fe<Q;++Fe)x.fillText(F[Fe],Oe.x(h.x),h.y+le/2),h.y+=le+me,Fe+1===Q&&(h.y+=E.titleMarginBottom-me)}},drawBody:function(h,E,x){var nn,$n,Bn,ar,Pr,$i,is,Eo,F=E.bodyFontSize,Q=E.bodySpacing,le=E._bodyAlign,me=E.body,Fe=E.displayColors,Oe=0,Je=Fe?id(E,"left"):0,ht=su(E.rtl,E.x,E.width),gt=function(qa){x.fillText(qa,ht.x(h.x+Oe),h.y+F/2),h.y+=F+Q},Gs=ht.textAlign(le);for(x.textAlign=le,x.textBaseline="middle",x.font=dt.fontString(F,E._bodyFontStyle,E._bodyFontFamily),h.x=id(E,Gs),x.fillStyle=E.bodyFontColor,dt.each(E.beforeBody,gt),Oe=Fe&&"right"!==Gs?"center"===le?F/2+1:F+2:0,Pr=0,is=me.length;Pr<is;++Pr){for(nn=me[Pr],Bn=E.labelColors[Pr],x.fillStyle=$n=E.labelTextColors[Pr],dt.each(nn.before,gt),$i=0,Eo=(ar=nn.lines).length;$i<Eo;++$i){if(Fe){var qs=ht.x(Je);x.fillStyle=E.legendColorBackground,x.fillRect(ht.leftForLtr(qs,F),h.y,F,F),x.lineWidth=1,x.strokeStyle=Bn.borderColor,x.strokeRect(ht.leftForLtr(qs,F),h.y,F,F),x.fillStyle=Bn.backgroundColor,x.fillRect(ht.leftForLtr(ht.xPlus(qs,1),F-2),h.y+1,F-2,F-2),x.fillStyle=$n}gt(ar[$i])}dt.each(nn.after,gt)}Oe=0,dt.each(E.afterBody,gt),h.y-=Q},drawFooter:function(h,E,x){var le,me,F=E.footer,Q=F.length;if(Q){var Fe=su(E.rtl,E.x,E.width);for(h.x=id(E,E._footerAlign),h.y+=E.footerMarginTop,x.textAlign=Fe.textAlign(E._footerAlign),x.textBaseline="middle",le=E.footerFontSize,x.fillStyle=E.footerFontColor,x.font=dt.fontString(le,E._footerFontStyle,E._footerFontFamily),me=0;me<Q;++me)x.fillText(F[me],Fe.x(h.x),h.y+le/2),h.y+=le+E.footerSpacing}},drawBackground:function(h,E,x,F){x.fillStyle=E.backgroundColor,x.strokeStyle=E.borderColor,x.lineWidth=E.borderWidth;var Q=E.xAlign,le=E.yAlign,me=h.x,Fe=h.y,Oe=F.width,Je=F.height,ht=E.cornerRadius;x.beginPath(),x.moveTo(me+ht,Fe),"top"===le&&this.drawCaret(h,F),x.lineTo(me+Oe-ht,Fe),x.quadraticCurveTo(me+Oe,Fe,me+Oe,Fe+ht),"center"===le&&"right"===Q&&this.drawCaret(h,F),x.lineTo(me+Oe,Fe+Je-ht),x.quadraticCurveTo(me+Oe,Fe+Je,me+Oe-ht,Fe+Je),"bottom"===le&&this.drawCaret(h,F),x.lineTo(me+ht,Fe+Je),x.quadraticCurveTo(me,Fe+Je,me,Fe+Je-ht),"center"===le&&"left"===Q&&this.drawCaret(h,F),x.lineTo(me,Fe+ht),x.quadraticCurveTo(me,Fe,me+ht,Fe),x.closePath(),x.fill(),E.borderWidth>0&&x.stroke()},draw:function(){var h=this._chart.ctx,E=this._view;if(0!==E.opacity){var x={width:E.width,height:E.height},F={x:E.x,y:E.y},Q=Math.abs(E.opacity<.001)?0:E.opacity;this._options.enabled&&(E.title.length||E.beforeBody.length||E.body.length||E.afterBody.length||E.footer.length)&&(h.save(),h.globalAlpha=Q,this.drawBackground(F,E,h,x),F.y+=E.yPadding,dt.rtl.overrideTextDirection(h,E.textDirection),this.drawTitle(F,E,h),this.drawBody(F,E,h),this.drawFooter(F,E,h),dt.rtl.restoreTextDirection(h,E.textDirection),h.restore())}},handleEvent:function(h){var F,E=this,x=E._options;return E._lastActive=E._lastActive||[],"mouseout"===h.type?E._active=[]:(E._active=E._chart.getElementsAtEventForMode(h,x.mode,x),x.reverse&&E._active.reverse()),(F=!dt.arrayEquals(E._active,E._lastActive))&&(E._lastActive=E._active,(x.enabled||x.custom)&&(E._eventPosition={x:h.x,y:h.y},E.update(!0),E.pivot())),F}}),Fd=Hu;Fd.positioners=vu;var Bo=dt.valueOrDefault;function cu(){return dt.merge(Object.create(null),[].slice.call(arguments),{merger:function(h,E,x,F){if("xAxes"===h||"yAxes"===h){var le,me,Fe,Q=x[h].length;for(E[h]||(E[h]=[]),le=0;le<Q;++le)me=Bo((Fe=x[h][le]).type,"xAxes"===h?"category":"linear"),le>=E[h].length&&E[h].push({}),dt.merge(E[h][le],!E[h][le].type||Fe.type&&Fe.type!==E[h][le].type?[qu.getScaleDefaults(me),Fe]:Fe)}else dt._merger(h,E,x,F)}})}function Er(){return dt.merge(Object.create(null),[].slice.call(arguments),{merger:function(h,E,x,F){var Q=E[h]||Object.create(null),le=x[h];"scales"===h?E[h]=cu(Q,le):"scale"===h?E[h]=dt.merge(Q,[qu.getScaleDefaults(le.type),le]):dt._merger(h,E,x,F)}})}function Ce(h){var E=h.options;dt.each(h.scales,function(x){Hl.removeBox(h,x)}),E=Er(hr.global,hr[h.config.type],E),h.options=h.config.options=E,h.ensureScalesHaveIDs(),h.buildOrUpdateScales(),h.tooltip._options=E.tooltips,h.tooltip.initialize()}function nt(h,E,x){var F,Q=function(le){return le.id===F};do{F=E+x++}while(dt.findIndex(h,Q)>=0);return F}function Mt(h){return"top"===h||"bottom"===h}function wt(h,E){return function(x,F){return x[h]===F[h]?x[E]-F[E]:x[h]-F[h]}}hr._set("global",{elements:{},events:["mousemove","mouseout","click","touchstart","touchmove"],hover:{onHover:null,mode:"nearest",intersect:!0,animationDuration:400},onClick:null,maintainAspectRatio:!0,responsive:!0,responsiveAnimationDuration:0});var sn=function(h,E){return this.construct(h,E),this};dt.extend(sn.prototype,{construct:function(h,E){var x=this;E=function j(h){var E=(h=h||Object.create(null)).data=h.data||{};return E.datasets=E.datasets||[],E.labels=E.labels||[],h.options=Er(hr.global,hr[h.type],h.options||{}),h}(E);var F=Ia.acquireContext(h,E),Q=F&&F.canvas,le=Q&&Q.height,me=Q&&Q.width;x.id=dt.uid(),x.ctx=F,x.canvas=Q,x.config=E,x.width=me,x.height=le,x.aspectRatio=le?me/le:null,x.options=E.options,x._bufferedRender=!1,x._layers=[],x.chart=x,x.controller=x,sn.instances[x.id]=x,Object.defineProperty(x,"data",{get:function(){return x.config.data},set:function(Fe){x.config.data=Fe}}),F&&Q?(x.initialize(),x.update()):console.error("Failed to create chart: can't acquire context from the given item")},initialize:function(){var h=this;return ys.notify(h,"beforeInit"),dt.retinaScale(h,h.options.devicePixelRatio),h.bindEvents(),h.options.responsive&&h.resize(!0),h.initToolTip(),ys.notify(h,"afterInit"),h},clear:function(){return dt.canvas.clear(this),this},stop:function(){return mr.cancelAnimation(this),this},resize:function(h){var E=this,x=E.options,F=E.canvas,Q=x.maintainAspectRatio&&E.aspectRatio||null,le=Math.max(0,Math.floor(dt.getMaximumWidth(F))),me=Math.max(0,Math.floor(Q?le/Q:dt.getMaximumHeight(F)));if((E.width!==le||E.height!==me)&&(F.width=E.width=le,F.height=E.height=me,F.style.width=le+"px",F.style.height=me+"px",dt.retinaScale(E,x.devicePixelRatio),!h)){var Fe={width:le,height:me};ys.notify(E,"resize",[Fe]),x.onResize&&x.onResize(E,Fe),E.stop(),E.update({duration:x.responsiveAnimationDuration})}},ensureScalesHaveIDs:function(){var h=this.options,E=h.scales||{},x=h.scale;dt.each(E.xAxes,function(F,Q){F.id||(F.id=nt(E.xAxes,"x-axis-",Q))}),dt.each(E.yAxes,function(F,Q){F.id||(F.id=nt(E.yAxes,"y-axis-",Q))}),x&&(x.id=x.id||"scale")},buildOrUpdateScales:function(){var h=this,E=h.options,x=h.scales||{},F=[],Q=Object.keys(x).reduce(function(le,me){return le[me]=!1,le},{});E.scales&&(F=F.concat((E.scales.xAxes||[]).map(function(le){return{options:le,dtype:"category",dposition:"bottom"}}),(E.scales.yAxes||[]).map(function(le){return{options:le,dtype:"linear",dposition:"left"}}))),E.scale&&F.push({options:E.scale,dtype:"radialLinear",isDefault:!0,dposition:"chartArea"}),dt.each(F,function(le){var me=le.options,Fe=me.id,Oe=Bo(me.type,le.dtype);Mt(me.position)!==Mt(le.dposition)&&(me.position=le.dposition),Q[Fe]=!0;var Je=null;if(Fe in x&&x[Fe].type===Oe)(Je=x[Fe]).options=me,Je.ctx=h.ctx,Je.chart=h;else{var ht=qu.getScaleConstructor(Oe);if(!ht)return;Je=new ht({id:Fe,type:Oe,options:me,ctx:h.ctx,chart:h}),x[Je.id]=Je}Je.mergeTicksOptions(),le.isDefault&&(h.scale=Je)}),dt.each(Q,function(le,me){le||delete x[me]}),h.scales=x,qu.addScalesToLayout(this)},buildOrUpdateControllers:function(){var F,Q,h=this,E=[],x=h.data.datasets;for(F=0,Q=x.length;F<Q;F++){var le=x[F],me=h.getDatasetMeta(F),Fe=le.type||h.config.type;if(me.type&&me.type!==Fe&&(h.destroyDatasetMeta(F),me=h.getDatasetMeta(F)),me.type=Fe,me.order=le.order||0,me.index=F,me.controller)me.controller.updateIndex(F),me.controller.linkScales();else{var Oe=bi[me.type];if(void 0===Oe)throw new Error('"'+me.type+'" is not a chart type.');me.controller=new Oe(h,F),E.push(me.controller)}}return E},resetElements:function(){var h=this;dt.each(h.data.datasets,function(E,x){h.getDatasetMeta(x).controller.reset()},h)},reset:function(){this.resetElements(),this.tooltip.initialize()},update:function(h){var x,F,E=this;if((!h||"object"!=typeof h)&&(h={duration:h,lazy:arguments[1]}),Ce(E),ys._invalidate(E),!1!==ys.notify(E,"beforeUpdate")){E.tooltip._data=E.data;var Q=E.buildOrUpdateControllers();for(x=0,F=E.data.datasets.length;x<F;x++)E.getDatasetMeta(x).controller.buildOrUpdateElements();E.updateLayout(),E.options.animation&&E.options.animation.duration&&dt.each(Q,function(le){le.reset()}),E.updateDatasets(),E.tooltip.initialize(),E.lastActive=[],ys.notify(E,"afterUpdate"),E._layers.sort(wt("z","_idx")),E._bufferedRender?E._bufferedRequest={duration:h.duration,easing:h.easing,lazy:h.lazy}:E.render(h)}},updateLayout:function(){var h=this;!1!==ys.notify(h,"beforeLayout")&&(Hl.update(this,this.width,this.height),h._layers=[],dt.each(h.boxes,function(E){E._configure&&E._configure(),h._layers.push.apply(h._layers,E._layers())},h),h._layers.forEach(function(E,x){E._idx=x}),ys.notify(h,"afterScaleUpdate"),ys.notify(h,"afterLayout"))},updateDatasets:function(){var h=this;if(!1!==ys.notify(h,"beforeDatasetsUpdate")){for(var E=0,x=h.data.datasets.length;E<x;++E)h.updateDataset(E);ys.notify(h,"afterDatasetsUpdate")}},updateDataset:function(h){var E=this,x=E.getDatasetMeta(h),F={meta:x,index:h};!1!==ys.notify(E,"beforeDatasetUpdate",[F])&&(x.controller._update(),ys.notify(E,"afterDatasetUpdate",[F]))},render:function(h){var E=this;(!h||"object"!=typeof h)&&(h={duration:h,lazy:arguments[1]});var x=E.options.animation,F=Bo(h.duration,x&&x.duration),Q=h.lazy;if(!1!==ys.notify(E,"beforeRender")){var le=function(Fe){ys.notify(E,"afterRender"),dt.callback(x&&x.onComplete,[Fe],E)};if(x&&F){var me=new dn({numSteps:F/16.66,easing:h.easing||x.easing,render:function(Fe,Oe){var ht=Oe.currentStep,gt=ht/Oe.numSteps;Fe.draw((0,dt.easing.effects[Oe.easing])(gt),gt,ht)},onAnimationProgress:x.onProgress,onAnimationComplete:le});mr.addAnimation(E,me,F,Q)}else E.draw(),le(new dn({numSteps:0,chart:E}));return E}},draw:function(h){var x,F,E=this;if(E.clear(),dt.isNullOrUndef(h)&&(h=1),E.transition(h),!(E.width<=0||E.height<=0)&&!1!==ys.notify(E,"beforeDraw",[h])){for(F=E._layers,x=0;x<F.length&&F[x].z<=0;++x)F[x].draw(E.chartArea);for(E.drawDatasets(h);x<F.length;++x)F[x].draw(E.chartArea);E._drawTooltip(h),ys.notify(E,"afterDraw",[h])}},transition:function(h){for(var E=this,x=0,F=(E.data.datasets||[]).length;x<F;++x)E.isDatasetVisible(x)&&E.getDatasetMeta(x).controller.transition(h);E.tooltip.transition(h)},_getSortedDatasetMetas:function(h){var Q,le,E=this,F=[];for(Q=0,le=(E.data.datasets||[]).length;Q<le;++Q)(!h||E.isDatasetVisible(Q))&&F.push(E.getDatasetMeta(Q));return F.sort(wt("order","index")),F},_getSortedVisibleDatasetMetas:function(){return this._getSortedDatasetMetas(!0)},drawDatasets:function(h){var x,F,E=this;if(!1!==ys.notify(E,"beforeDatasetsDraw",[h])){for(F=(x=E._getSortedVisibleDatasetMetas()).length-1;F>=0;--F)E.drawDataset(x[F],h);ys.notify(E,"afterDatasetsDraw",[h])}},drawDataset:function(h,E){var F={meta:h,index:h.index,easingValue:E};!1!==ys.notify(this,"beforeDatasetDraw",[F])&&(h.controller.draw(E),ys.notify(this,"afterDatasetDraw",[F]))},_drawTooltip:function(h){var E=this,x=E.tooltip,F={tooltip:x,easingValue:h};!1!==ys.notify(E,"beforeTooltipDraw",[F])&&(x.draw(),ys.notify(E,"afterTooltipDraw",[F]))},getElementAtEvent:function(h){return ol.modes.single(this,h)},getElementsAtEvent:function(h){return ol.modes.label(this,h,{intersect:!0})},getElementsAtXAxis:function(h){return ol.modes["x-axis"](this,h,{intersect:!0})},getElementsAtEventForMode:function(h,E,x){var F=ol.modes[E];return"function"==typeof F?F(this,h,x):[]},getDatasetAtEvent:function(h){return ol.modes.dataset(this,h,{intersect:!0})},getDatasetMeta:function(h){var E=this,x=E.data.datasets[h];x._meta||(x._meta={});var F=x._meta[E.id];return F||(F=x._meta[E.id]={type:null,data:[],dataset:null,controller:null,hidden:null,xAxisID:null,yAxisID:null,order:x.order||0,index:h}),F},getVisibleDatasetCount:function(){for(var h=0,E=0,x=this.data.datasets.length;E<x;++E)this.isDatasetVisible(E)&&h++;return h},isDatasetVisible:function(h){var E=this.getDatasetMeta(h);return"boolean"==typeof E.hidden?!E.hidden:!this.data.datasets[h].hidden},generateLegend:function(){return this.options.legendCallback(this)},destroyDatasetMeta:function(h){var E=this.id,x=this.data.datasets[h],F=x._meta&&x._meta[E];F&&(F.controller.destroy(),delete x._meta[E])},destroy:function(){var x,F,h=this,E=h.canvas;for(h.stop(),x=0,F=h.data.datasets.length;x<F;++x)h.destroyDatasetMeta(x);E&&(h.unbindEvents(),dt.canvas.clear(h),Ia.releaseContext(h.ctx),h.canvas=null,h.ctx=null),ys.notify(h,"destroy"),delete sn.instances[h.id]},toBase64Image:function(){return this.canvas.toDataURL.apply(this.canvas,arguments)},initToolTip:function(){var h=this;h.tooltip=new Fd({_chart:h,_chartInstance:h,_data:h.data,_options:h.options.tooltips},h)},bindEvents:function(){var h=this,E=h._listeners={},x=function(){h.eventHandler.apply(h,arguments)};dt.each(h.options.events,function(F){Ia.addEventListener(h,F,x),E[F]=x}),h.options.responsive&&(x=function(){h.resize()},Ia.addEventListener(h,"resize",x),E.resize=x)},unbindEvents:function(){var h=this,E=h._listeners;!E||(delete h._listeners,dt.each(E,function(x,F){Ia.removeEventListener(h,F,x)}))},updateHoverStyle:function(h,E,x){var Q,le,me,F=x?"set":"remove";for(le=0,me=h.length;le<me;++le)(Q=h[le])&&this.getDatasetMeta(Q._datasetIndex).controller[F+"HoverStyle"](Q);"dataset"===E&&this.getDatasetMeta(h[0]._datasetIndex).controller["_"+F+"DatasetHoverStyle"]()},eventHandler:function(h){var E=this,x=E.tooltip;if(!1!==ys.notify(E,"beforeEvent",[h])){E._bufferedRender=!0,E._bufferedRequest=null;var F=E.handleEvent(h);x&&(F=x._start?x.handleEvent(h):F|x.handleEvent(h)),ys.notify(E,"afterEvent",[h]);var Q=E._bufferedRequest;return Q?E.render(Q):F&&!E.animating&&(E.stop(),E.render({duration:E.options.hover.animationDuration,lazy:!0})),E._bufferedRender=!1,E._bufferedRequest=null,E}},handleEvent:function(h){var Q,E=this,x=E.options||{},F=x.hover;return E.lastActive=E.lastActive||[],E.active="mouseout"===h.type?[]:E.getElementsAtEventForMode(h,F.mode,F),dt.callback(x.onHover||x.hover.onHover,[h.native,E.active],E),("mouseup"===h.type||"click"===h.type)&&x.onClick&&x.onClick.call(E,h.native,E.active),E.lastActive.length&&E.updateHoverStyle(E.lastActive,F.mode,!1),E.active.length&&F.mode&&E.updateHoverStyle(E.active,F.mode,!0),Q=!dt.arrayEquals(E.active,E.lastActive),E.lastActive=E.active,Q}}),sn.instances={};var Cn=sn;sn.Controller=sn,sn.types={},dt.configMerge=Er,dt.scaleMerge=cu;function ni(){throw new Error("This method is not implemented: either no adapter can be found or an incomplete integration was provided.")}function fi(h){this.options=h||{}}dt.extend(fi.prototype,{formats:ni,parse:ni,format:ni,add:ni,diff:ni,startOf:ni,endOf:ni,_create:function(h){return h}}),fi.override=function(h){dt.extend(fi.prototype,h)};var zi={_date:fi},Dr={formatters:{values:function(h){return dt.isArray(h)?h:""+h},linear:function(h,E,x){var F=x.length>3?x[2]-x[1]:x[1]-x[0];Math.abs(F)>1&&h!==Math.floor(h)&&(F=h-Math.floor(h));var Q=dt.log10(Math.abs(F)),le="";if(0!==h)if(Math.max(Math.abs(x[0]),Math.abs(x[x.length-1]))<1e-4){var Fe=dt.log10(Math.abs(h)),Oe=Math.floor(Fe)-Math.floor(Q);Oe=Math.max(Math.min(Oe,20),0),le=h.toExponential(Oe)}else{var Je=-1*Math.floor(Q);Je=Math.max(Math.min(Je,20),0),le=h.toFixed(Je)}else le="0";return le},logarithmic:function(h,E,x){var F=h/Math.pow(10,Math.floor(dt.log10(h)));return 0===h?"0":1===F||2===F||5===F||0===E||E===x.length-1?h.toExponential():""}}},kn=dt.isArray,Ar=dt.isNullOrUndef,gr=dt.valueOrDefault,fo=dt.valueAtIndexOrDefault;function Es(h,E,x){var Je,F=h.getTicks().length,Q=Math.min(E,F-1),le=h.getPixelForTick(Q),me=h._startPixel,Fe=h._endPixel;if(!(x&&(Je=1===F?Math.max(le-me,Fe-le):0===E?(h.getPixelForTick(1)-le)/2:(le-h.getPixelForTick(Q-1))/2,le+=Q<E?Je:-Je,le<me-1e-6||le>Fe+1e-6)))return le}function Ks(h,E,x,F){var ht,gt,nn,$n,Bn,ar,Pr,$i,is,Eo,Gs,qs,qa,Q=x.length,le=[],me=[],Fe=[],Oe=0,Je=0;for(ht=0;ht<Q;++ht){if($n=x[ht].label,h.font=ar=(Bn=x[ht].major?E.major:E.minor).string,Pr=F[ar]=F[ar]||{data:{},gc:[]},$i=Bn.lineHeight,is=Eo=0,Ar($n)||kn($n)){if(kn($n))for(gt=0,nn=$n.length;gt<nn;++gt)!Ar(Gs=$n[gt])&&!kn(Gs)&&(is=dt.measureText(h,Pr.data,Pr.gc,is,Gs),Eo+=$i)}else is=dt.measureText(h,Pr.data,Pr.gc,is,$n),Eo=$i;le.push(is),me.push(Eo),Fe.push($i/2),Oe=Math.max(is,Oe),Je=Math.max(Eo,Je)}function ka(ja){return{width:le[ja]||0,height:me[ja]||0,offset:Fe[ja]||0}}return function pl(h,E){dt.each(h,function(x){var le,F=x.gc,Q=F.length/2;if(Q>E){for(le=0;le<Q;++le)delete x.data[F[le]];F.splice(0,Q)}})}(F,Q),qs=le.indexOf(Oe),qa=me.indexOf(Je),{first:ka(0),last:ka(Q-1),widest:ka(qs),highest:ka(qa)}}function Wc(h){return h.drawTicks?h.tickMarkLength:0}function Fc(h){var E,x;return h.display?(E=dt.options._parseFont(h),x=dt.options.toPadding(h.padding),E.lineHeight+x.height):0}function xu(h,E){return dt.extend(dt.options._parseFont({fontFamily:gr(E.fontFamily,h.fontFamily),fontSize:gr(E.fontSize,h.fontSize),fontStyle:gr(E.fontStyle,h.fontStyle),lineHeight:gr(E.lineHeight,h.lineHeight)}),{color:dt.options.resolve([E.fontColor,h.fontColor,hr.global.defaultFontColor])})}function Eu(h){var E=xu(h,h.minor);return{minor:E,major:h.major.enabled?xu(h,h.major):E}}function Gd(h){var x,F,Q,E=[];for(F=0,Q=h.length;F<Q;++F)void 0!==(x=h[F])._index&&E.push(x);return E}function kd(h,E,x,F){var Fe,Oe,Je,ht,Q=gr(x,0),le=Math.min(gr(F,h.length),h.length),me=0;for(E=Math.ceil(E),F&&(E=(Fe=F-x)/Math.floor(Fe/E)),ht=Q;ht<0;)me++,ht=Math.round(Q+me*E);for(Oe=Math.max(Q,0);Oe<le;Oe++)Je=h[Oe],Oe===ht?(Je._index=Oe,me++,ht=Math.round(Q+me*E)):delete Je.label}hr._set("scale",{display:!0,position:"left",offset:!1,gridLines:{display:!0,color:"rgba(0,0,0,0.1)",lineWidth:1,drawBorder:!0,drawOnChartArea:!0,drawTicks:!0,tickMarkLength:10,zeroLineWidth:1,zeroLineColor:"rgba(0,0,0,0.25)",zeroLineBorderDash:[],zeroLineBorderDashOffset:0,offsetGridLines:!1,borderDash:[],borderDashOffset:0},scaleLabel:{display:!1,labelString:"",padding:{top:4,bottom:4}},ticks:{beginAtZero:!1,minRotation:0,maxRotation:50,mirror:!1,padding:0,reverse:!1,display:!0,autoSkip:!0,autoSkipPadding:0,labelOffset:0,callback:Dr.formatters.values,minor:{},major:{}}});var Oc=pt.extend({zeroLineIndex:0,getPadding:function(){var h=this;return{left:h.paddingLeft||0,top:h.paddingTop||0,right:h.paddingRight||0,bottom:h.paddingBottom||0}},getTicks:function(){return this._ticks},_getLabels:function(){var h=this.chart.data;return this.options.labels||(this.isHorizontal()?h.xLabels:h.yLabels)||h.labels||[]},mergeTicksOptions:function(){},beforeUpdate:function(){dt.callback(this.options.beforeUpdate,[this])},update:function(h,E,x){var me,Fe,Oe,Je,ht,F=this,Q=F.options.ticks,le=Q.sampleSize;if(F.beforeUpdate(),F.maxWidth=h,F.maxHeight=E,F.margins=dt.extend({left:0,right:0,top:0,bottom:0},x),F._ticks=null,F.ticks=null,F._labelSizes=null,F._maxLabelLines=0,F.longestLabelWidth=0,F.longestTextCache=F.longestTextCache||{},F._gridLineItems=null,F._labelItems=null,F.beforeSetDimensions(),F.setDimensions(),F.afterSetDimensions(),F.beforeDataLimits(),F.determineDataLimits(),F.afterDataLimits(),F.beforeBuildTicks(),Je=F.buildTicks()||[],(!(Je=F.afterBuildTicks(Je)||Je)||!Je.length)&&F.ticks)for(Je=[],me=0,Fe=F.ticks.length;me<Fe;++me)Je.push({value:F.ticks[me],major:!1});return F._ticks=Je,Oe=F._convertTicksToLabels((ht=le<Je.length)?function $s(h,E){for(var x=[],F=h.length/E,Q=0,le=h.length;Q<le;Q+=F)x.push(h[Math.floor(Q)]);return x}(Je,le):Je),F._configure(),F.beforeCalculateTickRotation(),F.calculateTickRotation(),F.afterCalculateTickRotation(),F.beforeFit(),F.fit(),F.afterFit(),F._ticksToDraw=Q.display&&(Q.autoSkip||"auto"===Q.source)?F._autoSkip(Je):Je,ht&&(Oe=F._convertTicksToLabels(F._ticksToDraw)),F.ticks=Oe,F.afterUpdate(),F.minSize},_configure:function(){var x,F,h=this,E=h.options.ticks.reverse;h.isHorizontal()?(x=h.left,F=h.right):(x=h.top,F=h.bottom,E=!E),h._startPixel=x,h._endPixel=F,h._reversePixels=E,h._length=F-x},afterUpdate:function(){dt.callback(this.options.afterUpdate,[this])},beforeSetDimensions:function(){dt.callback(this.options.beforeSetDimensions,[this])},setDimensions:function(){var h=this;h.isHorizontal()?(h.width=h.maxWidth,h.left=0,h.right=h.width):(h.height=h.maxHeight,h.top=0,h.bottom=h.height),h.paddingLeft=0,h.paddingTop=0,h.paddingRight=0,h.paddingBottom=0},afterSetDimensions:function(){dt.callback(this.options.afterSetDimensions,[this])},beforeDataLimits:function(){dt.callback(this.options.beforeDataLimits,[this])},determineDataLimits:dt.noop,afterDataLimits:function(){dt.callback(this.options.afterDataLimits,[this])},beforeBuildTicks:function(){dt.callback(this.options.beforeBuildTicks,[this])},buildTicks:dt.noop,afterBuildTicks:function(h){var E=this;return kn(h)&&h.length?dt.callback(E.options.afterBuildTicks,[E,h]):(E.ticks=dt.callback(E.options.afterBuildTicks,[E,E.ticks])||E.ticks,h)},beforeTickToLabelConversion:function(){dt.callback(this.options.beforeTickToLabelConversion,[this])},convertTicksToLabels:function(){var h=this,E=h.options.ticks;h.ticks=h.ticks.map(E.userCallback||E.callback,this)},afterTickToLabelConversion:function(){dt.callback(this.options.afterTickToLabelConversion,[this])},beforeCalculateTickRotation:function(){dt.callback(this.options.beforeCalculateTickRotation,[this])},calculateTickRotation:function(){var Fe,Oe,Je,ht,gt,nn,$n,h=this,E=h.options,x=E.ticks,F=h.getTicks().length,Q=x.minRotation||0,le=x.maxRotation,me=Q;!h._isVisible()||!x.display||Q>=le||F<=1||!h.isHorizontal()?h.labelRotation=Q:(Oe=(Fe=h._getLabelSizes()).widest.width,Je=Fe.highest.height-Fe.highest.offset,ht=Math.min(h.maxWidth,h.chart.width-Oe),Oe+6>(gt=E.offset?h.maxWidth/F:ht/(F-1))&&(gt=ht/(F-(E.offset?.5:1)),nn=h.maxHeight-Wc(E.gridLines)-x.padding-Fc(E.scaleLabel),$n=Math.sqrt(Oe*Oe+Je*Je),me=dt.toDegrees(Math.min(Math.asin(Math.min((Fe.highest.height+6)/gt,1)),Math.asin(Math.min(nn/$n,1))-Math.asin(Je/$n))),me=Math.max(Q,Math.min(le,me))),h.labelRotation=me)},afterCalculateTickRotation:function(){dt.callback(this.options.afterCalculateTickRotation,[this])},beforeFit:function(){dt.callback(this.options.beforeFit,[this])},fit:function(){var h=this,E=h.minSize={width:0,height:0},x=h.chart,F=h.options,Q=F.ticks,le=F.scaleLabel,me=F.gridLines,Fe=h._isVisible(),Oe="bottom"===F.position,Je=h.isHorizontal();if(Je?E.width=h.maxWidth:Fe&&(E.width=Wc(me)+Fc(le)),Je?Fe&&(E.height=Wc(me)+Fc(le)):E.height=h.maxHeight,Q.display&&Fe){var ht=Eu(Q),gt=h._getLabelSizes(),nn=gt.first,$n=gt.last,Bn=gt.widest,ar=gt.highest,Pr=.4*ht.minor.lineHeight,$i=Q.padding;if(Je){var is=0!==h.labelRotation,Eo=dt.toRadians(h.labelRotation),Gs=Math.cos(Eo),qs=Math.sin(Eo);E.height=Math.min(h.maxHeight,E.height+(qs*Bn.width+Gs*(ar.height-(is?ar.offset:0))+(is?0:Pr))+$i);var wa,jl,ka=h.getPixelForTick(0)-h.left,ja=h.right-h.getPixelForTick(h.getTicks().length-1);is?(wa=Oe?Gs*nn.width+qs*nn.offset:qs*(nn.height-nn.offset),jl=Oe?qs*($n.height-$n.offset):Gs*$n.width+qs*$n.offset):(wa=nn.width/2,jl=$n.width/2),h.paddingLeft=Math.max((wa-ka)*h.width/(h.width-ka),0)+3,h.paddingRight=Math.max((jl-ja)*h.width/(h.width-ja),0)+3}else E.width=Math.min(h.maxWidth,E.width+(Q.mirror?0:Bn.width+$i+Pr)),h.paddingTop=nn.height/2,h.paddingBottom=$n.height/2}h.handleMargins(),Je?(h.width=h._length=x.width-h.margins.left-h.margins.right,h.height=E.height):(h.width=E.width,h.height=h._length=x.height-h.margins.top-h.margins.bottom)},handleMargins:function(){var h=this;h.margins&&(h.margins.left=Math.max(h.paddingLeft,h.margins.left),h.margins.top=Math.max(h.paddingTop,h.margins.top),h.margins.right=Math.max(h.paddingRight,h.margins.right),h.margins.bottom=Math.max(h.paddingBottom,h.margins.bottom))},afterFit:function(){dt.callback(this.options.afterFit,[this])},isHorizontal:function(){var h=this.options.position;return"top"===h||"bottom"===h},isFullWidth:function(){return this.options.fullWidth},getRightValue:function(h){if(Ar(h))return NaN;if(("number"==typeof h||h instanceof Number)&&!isFinite(h))return NaN;if(h)if(this.isHorizontal()){if(void 0!==h.x)return this.getRightValue(h.x)}else if(void 0!==h.y)return this.getRightValue(h.y);return h},_convertTicksToLabels:function(h){var x,F,Q,E=this;for(E.ticks=h.map(function(le){return le.value}),E.beforeTickToLabelConversion(),x=E.convertTicksToLabels(h)||E.ticks,E.afterTickToLabelConversion(),F=0,Q=h.length;F<Q;++F)h[F].label=x[F];return x},_getLabelSizes:function(){var h=this,E=h._labelSizes;return E||(h._labelSizes=E=Ks(h.ctx,Eu(h.options.ticks),h.getTicks(),h.longestTextCache),h.longestLabelWidth=E.widest.width),E},_parseValue:function(h){var E,x,F,Q;return kn(h)?(E=+this.getRightValue(h[0]),x=+this.getRightValue(h[1]),F=Math.min(E,x),Q=Math.max(E,x)):(E=void 0,x=h=+this.getRightValue(h),F=h,Q=h),{min:F,max:Q,start:E,end:x}},_getScaleLabel:function(h){var E=this._parseValue(h);return void 0!==E.start?"["+E.start+", "+E.end+"]":+this.getRightValue(h)},getLabelForIndex:dt.noop,getPixelForValue:dt.noop,getValueForPixel:dt.noop,getPixelForTick:function(h){var E=this,x=E.options.offset,F=E._ticks.length,Q=1/Math.max(F-(x?0:1),1);return h<0||h>F-1?null:E.getPixelForDecimal(h*Q+(x?Q/2:0))},getPixelForDecimal:function(h){var E=this;return E._reversePixels&&(h=1-h),E._startPixel+h*E._length},getDecimalForPixel:function(h){var E=(h-this._startPixel)/this._length;return this._reversePixels?1-E:E},getBasePixel:function(){return this.getPixelForValue(this.getBaseValue())},getBaseValue:function(){var h=this,E=h.min,x=h.max;return h.beginAtZero?0:E<0&&x<0?x:E>0&&x>0?E:0},_autoSkip:function(h){var Je,ht,gt,nn,E=this,x=E.options.ticks,F=E._length,Q=x.maxTicksLimit||F/E._tickSize()+1,le=x.major.enabled?function Uc(h){var x,F,E=[];for(x=0,F=h.length;x<F;x++)h[x].major&&E.push(x);return E}(h):[],me=le.length,Fe=le[0],Oe=le[me-1];if(me>Q)return function La(h,E,x){var le,me,F=0,Q=E[0];for(x=Math.ceil(x),le=0;le<h.length;le++)me=h[le],le===Q?(me._index=le,Q=E[++F*x]):delete me.label}(h,le,me/Q),Gd(h);if(gt=function Ed(h,E,x,F){var me,Fe,Oe,Je,Q=function yd(h){var x,F,E=h.length;if(E<2)return!1;for(F=h[0],x=1;x<E;++x)if(h[x]-h[x-1]!==F)return!1;return F}(h),le=(E.length-1)/F;if(!Q)return Math.max(le,1);for(Oe=0,Je=(me=dt.math._factorize(Q)).length-1;Oe<Je;Oe++)if((Fe=me[Oe])>le)return Fe;return Math.max(le,1)}(le,h,0,Q),me>0){for(Je=0,ht=me-1;Je<ht;Je++)kd(h,gt,le[Je],le[Je+1]);return kd(h,gt,dt.isNullOrUndef(nn=me>1?(Oe-Fe)/(me-1):null)?0:Fe-nn,Fe),kd(h,gt,Oe,dt.isNullOrUndef(nn)?h.length:Oe+nn),Gd(h)}return kd(h,gt),Gd(h)},_tickSize:function(){var h=this,E=h.options.ticks,x=dt.toRadians(h.labelRotation),F=Math.abs(Math.cos(x)),Q=Math.abs(Math.sin(x)),le=h._getLabelSizes(),me=E.autoSkipPadding||0,Fe=le?le.widest.width+me:0,Oe=le?le.highest.height+me:0;return h.isHorizontal()?Oe*F>Fe*Q?Fe/F:Oe/Q:Oe*Q<Fe*F?Oe/F:Fe/Q},_isVisible:function(){var F,Q,le,h=this,E=h.chart,x=h.options.display;if("auto"!==x)return!!x;for(F=0,Q=E.data.datasets.length;F<Q;++F)if(E.isDatasetVisible(F)&&((le=E.getDatasetMeta(F)).xAxisID===h.id||le.yAxisID===h.id))return!0;return!1},_computeGridLineItems:function(h){var Pr,$i,is,Eo,Gs,qs,qa,ka,ja,wa,jl,pu,Ga,Tu,Lu,wc,Cu,E=this,x=E.chart,F=E.options,Q=F.gridLines,le=F.position,me=Q.offsetGridLines,Fe=E.isHorizontal(),Oe=E._ticksToDraw,Je=Oe.length+(me?1:0),ht=Wc(Q),gt=[],nn=Q.drawBorder?fo(Q.lineWidth,0,0):0,$n=nn/2,Bn=dt._alignPixel,ar=function(Wd){return Bn(x,Wd,nn)};for("top"===le?(Pr=ar(E.bottom),qa=E.bottom-ht,ja=Pr-$n,jl=ar(h.top)+$n,Ga=h.bottom):"bottom"===le?(Pr=ar(E.top),jl=h.top,Ga=ar(h.bottom)-$n,qa=Pr+$n,ja=E.top+ht):"left"===le?(Pr=ar(E.right),qs=E.right-ht,ka=Pr-$n,wa=ar(h.left)+$n,pu=h.right):(Pr=ar(E.left),wa=h.left,pu=ar(h.right)-$n,qs=Pr+$n,ka=E.left+ht),$i=0;$i<Je;++$i)!(Ar((is=Oe[$i]||{}).label)&&$i<Oe.length)&&($i===E.zeroLineIndex&&F.offset===me?(Tu=Q.zeroLineWidth,Lu=Q.zeroLineColor,wc=Q.zeroLineBorderDash||[],Cu=Q.zeroLineBorderDashOffset||0):(Tu=fo(Q.lineWidth,$i,1),Lu=fo(Q.color,$i,"rgba(0,0,0,0.1)"),wc=Q.borderDash||[],Cu=Q.borderDashOffset||0),void 0!==(Eo=Es(E,is._index||$i,me))&&(Gs=Bn(x,Eo,Tu),Fe?qs=ka=wa=pu=Gs:qa=ja=jl=Ga=Gs,gt.push({tx1:qs,ty1:qa,tx2:ka,ty2:ja,x1:wa,y1:jl,x2:pu,y2:Ga,width:Tu,color:Lu,borderDash:wc,borderDashOffset:Cu})));return gt.ticksLength=Je,gt.borderValue=Pr,gt},_computeLabelItems:function(){var nn,$n,Bn,ar,Pr,$i,is,Eo,Gs,qs,qa,ka,h=this,E=h.options,x=E.ticks,F=E.position,Q=x.mirror,le=h.isHorizontal(),me=h._ticksToDraw,Fe=Eu(x),Oe=x.padding,Je=Wc(E.gridLines),ht=-dt.toRadians(h.labelRotation),gt=[];for("top"===F?($i=h.bottom-Je-Oe,is=ht?"left":"center"):"bottom"===F?($i=h.top+Je+Oe,is=ht?"right":"center"):"left"===F?(Pr=h.right-(Q?0:Je)-Oe,is=Q?"left":"right"):(Pr=h.left+(Q?0:Je)+Oe,is=Q?"right":"left"),nn=0,$n=me.length;nn<$n;++nn)!Ar(ar=(Bn=me[nn]).label)&&(Eo=h.getPixelForTick(Bn._index||nn)+x.labelOffset,qs=(Gs=Bn.major?Fe.major:Fe.minor).lineHeight,qa=kn(ar)?ar.length:1,le?(Pr=Eo,ka="top"===F?((ht?1:.5)-qa)*qs:(ht?0:.5)*qs):($i=Eo,ka=(1-qa)*qs/2),gt.push({x:Pr,y:$i,rotation:ht,label:ar,font:Gs,textOffset:ka,textAlign:is}));return gt},_drawGrid:function(h){var E=this,x=E.options.gridLines;if(x.display){var Oe,Je,ht,gt,nn,F=E.ctx,Q=E.chart,le=dt._alignPixel,me=x.drawBorder?fo(x.lineWidth,0,0):0,Fe=E._gridLineItems||(E._gridLineItems=E._computeGridLineItems(h));for(ht=0,gt=Fe.length;ht<gt;++ht)Je=(nn=Fe[ht]).color,(Oe=nn.width)&&Je&&(F.save(),F.lineWidth=Oe,F.strokeStyle=Je,F.setLineDash&&(F.setLineDash(nn.borderDash),F.lineDashOffset=nn.borderDashOffset),F.beginPath(),x.drawTicks&&(F.moveTo(nn.tx1,nn.ty1),F.lineTo(nn.tx2,nn.ty2)),x.drawOnChartArea&&(F.moveTo(nn.x1,nn.y1),F.lineTo(nn.x2,nn.y2)),F.stroke(),F.restore());if(me){var Pr,$i,is,Eo,$n=me,Bn=fo(x.lineWidth,Fe.ticksLength-1,1),ar=Fe.borderValue;E.isHorizontal()?(Pr=le(Q,E.left,$n)-$n/2,$i=le(Q,E.right,Bn)+Bn/2,is=Eo=ar):(is=le(Q,E.top,$n)-$n/2,Eo=le(Q,E.bottom,Bn)+Bn/2,Pr=$i=ar),F.lineWidth=me,F.strokeStyle=fo(x.color,0),F.beginPath(),F.moveTo(Pr,is),F.lineTo($i,Eo),F.stroke()}}},_drawLabels:function(){var h=this;if(h.options.ticks.display){var Q,le,me,Fe,Oe,Je,ht,gt,x=h.ctx,F=h._labelItems||(h._labelItems=h._computeLabelItems());for(Q=0,me=F.length;Q<me;++Q){if(Je=(Oe=F[Q]).font,x.save(),x.translate(Oe.x,Oe.y),x.rotate(Oe.rotation),x.font=Je.string,x.fillStyle=Je.color,x.textBaseline="middle",x.textAlign=Oe.textAlign,gt=Oe.textOffset,kn(ht=Oe.label))for(le=0,Fe=ht.length;le<Fe;++le)x.fillText(""+ht[le],0,gt),gt+=Je.lineHeight;else x.fillText(ht,0,gt);x.restore()}}},_drawTitle:function(){var h=this,E=h.ctx,x=h.options,F=x.scaleLabel;if(F.display){var ht,gt,Q=gr(F.fontColor,hr.global.defaultFontColor),le=dt.options._parseFont(F),me=dt.options.toPadding(F.padding),Fe=le.lineHeight/2,Oe=x.position,Je=0;if(h.isHorizontal())ht=h.left+h.width/2,gt="bottom"===Oe?h.bottom-Fe-me.bottom:h.top+Fe+me.top;else{var nn="left"===Oe;ht=nn?h.left+Fe+me.top:h.right-Fe-me.top,gt=h.top+h.height/2,Je=nn?-.5*Math.PI:.5*Math.PI}E.save(),E.translate(ht,gt),E.rotate(Je),E.textAlign="center",E.textBaseline="middle",E.fillStyle=Q,E.font=le.string,E.fillText(F.labelString,0,0),E.restore()}},draw:function(h){var E=this;!E._isVisible()||(E._drawGrid(h),E._drawTitle(),E._drawLabels())},_layers:function(){var h=this,E=h.options,x=E.ticks&&E.ticks.z||0,F=E.gridLines&&E.gridLines.z||0;return h._isVisible()&&x!==F&&h.draw===h._draw?[{z:F,draw:function(){h._drawGrid.apply(h,arguments),h._drawTitle.apply(h,arguments)}},{z:x,draw:function(){h._drawLabels.apply(h,arguments)}}]:[{z:x,draw:function(){h.draw.apply(h,arguments)}}]},_getMatchingVisibleMetas:function(h){var E=this,x=E.isHorizontal();return E.chart._getSortedVisibleDatasetMetas().filter(function(F){return(!h||F.type===h)&&(x?F.xAxisID===E.id:F.yAxisID===E.id)})}});Oc.prototype._draw=Oc.prototype.draw;var Mo=Oc,No=dt.isNullOrUndef,Sl=Mo.extend({determineDataLimits:function(){var Fe,h=this,E=h._getLabels(),x=h.options.ticks,F=x.min,Q=x.max,le=0,me=E.length-1;void 0!==F&&(Fe=E.indexOf(F))>=0&&(le=Fe),void 0!==Q&&(Fe=E.indexOf(Q))>=0&&(me=Fe),h.minIndex=le,h.maxIndex=me,h.min=E[le],h.max=E[me]},buildTicks:function(){var h=this,E=h._getLabels(),x=h.minIndex,F=h.maxIndex;h.ticks=0===x&&F===E.length-1?E:E.slice(x,F+1)},getLabelForIndex:function(h,E){var x=this,F=x.chart;return F.getDatasetMeta(E).controller._getValueScaleId()===x.id?x.getRightValue(F.data.datasets[E].data[h]):x._getLabels()[h]},_configure:function(){var h=this,E=h.options.offset,x=h.ticks;Mo.prototype._configure.call(h),h.isHorizontal()||(h._reversePixels=!h._reversePixels),x&&(h._startValue=h.minIndex-(E?.5:0),h._valueRange=Math.max(x.length-(E?0:1),1))},getPixelForValue:function(h,E,x){var Q,le,me,F=this;return!No(E)&&!No(x)&&(h=F.chart.data.datasets[x].data[E]),No(h)||(Q=F.isHorizontal()?h.x:h.y),(void 0!==Q||void 0!==h&&isNaN(E))&&(le=F._getLabels(),h=dt.valueOrDefault(Q,h),E=-1!==(me=le.indexOf(h))?me:E,isNaN(E)&&(E=h)),F.getPixelForDecimal((E-F._startValue)/F._valueRange)},getPixelForTick:function(h){var E=this.ticks;return h<0||h>E.length-1?null:this.getPixelForValue(E[h],h+this.minIndex)},getValueForPixel:function(h){var E=this,x=Math.round(E._startValue+E.getDecimalForPixel(h)*E._valueRange);return Math.min(Math.max(x,0),E.ticks.length-1)},getBasePixel:function(){return this.bottom}});Sl._defaults={position:"bottom"};var gc=dt.isNullOrUndef;var pa=Mo.extend({getRightValue:function(h){return"string"==typeof h?+h:Mo.prototype.getRightValue.call(this,h)},handleTickRangeOptions:function(){var h=this,x=h.options.ticks;if(x.beginAtZero){var F=dt.sign(h.min),Q=dt.sign(h.max);F<0&&Q<0?h.max=0:F>0&&Q>0&&(h.min=0)}var le=void 0!==x.min||void 0!==x.suggestedMin,me=void 0!==x.max||void 0!==x.suggestedMax;void 0!==x.min?h.min=x.min:void 0!==x.suggestedMin&&(h.min=null===h.min?x.suggestedMin:Math.min(h.min,x.suggestedMin)),void 0!==x.max?h.max=x.max:void 0!==x.suggestedMax&&(h.max=null===h.max?x.suggestedMax:Math.max(h.max,x.suggestedMax)),le!==me&&h.min>=h.max&&(le?h.max=h.min+1:h.min=h.max-1),h.min===h.max&&(h.max++,x.beginAtZero||h.min--)},getTickLimit:function(){var Q,h=this,E=h.options.ticks,x=E.stepSize,F=E.maxTicksLimit;return x?Q=Math.ceil(h.max/x)-Math.floor(h.min/x)+1:(Q=h._computeTickLimit(),F=F||11),F&&(Q=Math.min(F,Q)),Q},_computeTickLimit:function(){return Number.POSITIVE_INFINITY},handleDirectionalChanges:dt.noop,buildTicks:function(){var h=this,x=h.options.ticks,F=h.getTickLimit(),Q={maxTicks:F=Math.max(2,F),min:x.min,max:x.max,precision:x.precision,stepSize:dt.valueOrDefault(x.fixedStepSize,x.stepSize)},le=h.ticks=function _n(h,E){var $n,Bn,ar,Pr,x=[],Q=h.stepSize,le=Q||1,me=h.maxTicks-1,Fe=h.min,Oe=h.max,Je=h.precision,ht=E.min,gt=E.max,nn=dt.niceNum((gt-ht)/me/le)*le;if(nn<1e-14&&gc(Fe)&&gc(Oe))return[ht,gt];(Pr=Math.ceil(gt/nn)-Math.floor(ht/nn))>me&&(nn=dt.niceNum(Pr*nn/me/le)*le),Q||gc(Je)?$n=Math.pow(10,dt._decimalPlaces(nn)):($n=Math.pow(10,Je),nn=Math.ceil(nn*$n)/$n),Bn=Math.floor(ht/nn)*nn,ar=Math.ceil(gt/nn)*nn,Q&&(!gc(Fe)&&dt.almostWhole(Fe/nn,nn/1e3)&&(Bn=Fe),!gc(Oe)&&dt.almostWhole(Oe/nn,nn/1e3)&&(ar=Oe)),Pr=dt.almostEquals(Pr=(ar-Bn)/nn,Math.round(Pr),nn/1e3)?Math.round(Pr):Math.ceil(Pr),Bn=Math.round(Bn*$n)/$n,ar=Math.round(ar*$n)/$n,x.push(gc(Fe)?Bn:Fe);for(var $i=1;$i<Pr;++$i)x.push(Math.round((Bn+$i*nn)*$n)/$n);return x.push(gc(Oe)?ar:Oe),x}(Q,h);h.handleDirectionalChanges(),h.max=dt.max(le),h.min=dt.min(le),x.reverse?(le.reverse(),h.start=h.max,h.end=h.min):(h.start=h.min,h.end=h.max)},convertTicksToLabels:function(){var h=this;h.ticksAsNumbers=h.ticks.slice(),h.zeroLineIndex=h.ticks.indexOf(0),Mo.prototype.convertTicksToLabels.call(h)},_configure:function(){var Q,h=this,E=h.getTicks(),x=h.min,F=h.max;Mo.prototype._configure.call(h),h.options.offset&&E.length&&(x-=Q=(F-x)/Math.max(E.length-1,1)/2,F+=Q),h._startValue=x,h._endValue=F,h._valueRange=F-x}}),od={position:"left",ticks:{callback:Dr.formatters.linear}};function at(h,E,x,F){var ht,gt,Q=h.options,me=function _e(h,E,x){var F=[x.type,void 0===E&&void 0===x.stack?x.index:"",x.stack].join(".");return void 0===h[F]&&(h[F]={pos:[],neg:[]}),h[F]}(E,Q.stacked,x),Fe=me.pos,Oe=me.neg,Je=F.length;for(ht=0;ht<Je;++ht)gt=h._parseValue(F[ht]),!(isNaN(gt.min)||isNaN(gt.max)||x.data[ht].hidden)&&(Fe[ht]=Fe[ht]||0,Oe[ht]=Oe[ht]||0,Q.relativePoints?Fe[ht]=100:gt.min<0||gt.max<0?Oe[ht]+=gt.min:Fe[ht]+=gt.max)}function vt(h,E,x){var Q,le,F=x.length;for(Q=0;Q<F;++Q)le=h._parseValue(x[Q]),!(isNaN(le.min)||isNaN(le.max)||E.data[Q].hidden)&&(h.min=Math.min(h.min,le.min),h.max=Math.max(h.max,le.max))}var Qt=pa.extend({determineDataLimits:function(){var Oe,Je,ht,gt,h=this,E=h.options,F=h.chart.data.datasets,Q=h._getMatchingVisibleMetas(),le=E.stacked,me={},Fe=Q.length;if(h.min=Number.POSITIVE_INFINITY,h.max=Number.NEGATIVE_INFINITY,void 0===le)for(Oe=0;!le&&Oe<Fe;++Oe)le=void 0!==(Je=Q[Oe]).stack;for(Oe=0;Oe<Fe;++Oe)ht=F[(Je=Q[Oe]).index].data,le?at(h,me,Je,ht):vt(h,Je,ht);dt.each(me,function(nn){gt=nn.pos.concat(nn.neg),h.min=Math.min(h.min,dt.min(gt)),h.max=Math.max(h.max,dt.max(gt))}),h.min=dt.isFinite(h.min)&&!isNaN(h.min)?h.min:0,h.max=dt.isFinite(h.max)&&!isNaN(h.max)?h.max:1,h.handleTickRangeOptions()},_computeTickLimit:function(){var E,h=this;return h.isHorizontal()?Math.ceil(h.width/40):(E=dt.options._parseFont(h.options.ticks),Math.ceil(h.height/E.lineHeight))},handleDirectionalChanges:function(){this.isHorizontal()||this.ticks.reverse()},getLabelForIndex:function(h,E){return this._getScaleLabel(this.chart.data.datasets[E].data[h])},getPixelForValue:function(h){var E=this;return E.getPixelForDecimal((+E.getRightValue(h)-E._startValue)/E._valueRange)},getValueForPixel:function(h){return this._startValue+this.getDecimalForPixel(h)*this._valueRange},getPixelForTick:function(h){var E=this.ticksAsNumbers;return h<0||h>E.length-1?null:this.getPixelForValue(E[h])}});Qt._defaults=od;var cr=dt.valueOrDefault,ui=dt.math.log10;var Ta={position:"left",ticks:{callback:Dr.formatters.logarithmic}};function _s(h,E){return dt.isFinite(h)&&h>=0?h:E}var ha=Mo.extend({determineDataLimits:function(){var me,Fe,Oe,Je,ht,gt,h=this,E=h.options,x=h.chart,F=x.data.datasets,Q=h.isHorizontal();function le(Pr){return Q?Pr.xAxisID===h.id:Pr.yAxisID===h.id}h.min=Number.POSITIVE_INFINITY,h.max=Number.NEGATIVE_INFINITY,h.minNotZero=Number.POSITIVE_INFINITY;var nn=E.stacked;if(void 0===nn)for(me=0;me<F.length;me++)if(Fe=x.getDatasetMeta(me),x.isDatasetVisible(me)&&le(Fe)&&void 0!==Fe.stack){nn=!0;break}if(E.stacked||nn){var $n={};for(me=0;me<F.length;me++){var Bn=[(Fe=x.getDatasetMeta(me)).type,void 0===E.stacked&&void 0===Fe.stack?me:"",Fe.stack].join(".");if(x.isDatasetVisible(me)&&le(Fe))for(void 0===$n[Bn]&&($n[Bn]=[]),ht=0,gt=(Je=F[me].data).length;ht<gt;ht++){var ar=$n[Bn];Oe=h._parseValue(Je[ht]),!(isNaN(Oe.min)||isNaN(Oe.max)||Fe.data[ht].hidden||Oe.min<0||Oe.max<0)&&(ar[ht]=ar[ht]||0,ar[ht]+=Oe.max)}}dt.each($n,function(Pr){if(Pr.length>0){var $i=dt.min(Pr),is=dt.max(Pr);h.min=Math.min(h.min,$i),h.max=Math.max(h.max,is)}})}else for(me=0;me<F.length;me++)if(Fe=x.getDatasetMeta(me),x.isDatasetVisible(me)&&le(Fe))for(ht=0,gt=(Je=F[me].data).length;ht<gt;ht++)Oe=h._parseValue(Je[ht]),!(isNaN(Oe.min)||isNaN(Oe.max)||Fe.data[ht].hidden||Oe.min<0||Oe.max<0)&&(h.min=Math.min(Oe.min,h.min),h.max=Math.max(Oe.max,h.max),0!==Oe.min&&(h.minNotZero=Math.min(Oe.min,h.minNotZero)));h.min=dt.isFinite(h.min)?h.min:null,h.max=dt.isFinite(h.max)?h.max:null,h.minNotZero=dt.isFinite(h.minNotZero)?h.minNotZero:null,this.handleTickRangeOptions()},handleTickRangeOptions:function(){var h=this,E=h.options.ticks;h.min=_s(E.min,h.min),h.max=_s(E.max,h.max),h.min===h.max&&(0!==h.min&&null!==h.min?(h.min=Math.pow(10,Math.floor(ui(h.min))-1),h.max=Math.pow(10,Math.floor(ui(h.max))+1)):(h.min=1,h.max=10)),null===h.min&&(h.min=Math.pow(10,Math.floor(ui(h.max))-1)),null===h.max&&(h.max=0!==h.min?Math.pow(10,Math.floor(ui(h.min))+1):10),null===h.minNotZero&&(h.minNotZero=h.min>0?h.min:h.max<1?Math.pow(10,Math.floor(ui(h.max))):1)},buildTicks:function(){var h=this,E=h.options.ticks,x=!h.isHorizontal(),F={min:_s(E.min),max:_s(E.max)},Q=h.ticks=function Lo(h,E){var me,Fe,x=[],F=cr(h.min,Math.pow(10,Math.floor(ui(E.min)))),Q=Math.floor(ui(E.max)),le=Math.ceil(E.max/Math.pow(10,Q));0===F?(me=Math.floor(ui(E.minNotZero)),Fe=Math.floor(E.minNotZero/Math.pow(10,me)),x.push(F),F=Fe*Math.pow(10,me)):(me=Math.floor(ui(F)),Fe=Math.floor(F/Math.pow(10,me)));var Oe=me<0?Math.pow(10,Math.abs(me)):1;do{x.push(F),10==++Fe&&(Fe=1,Oe=++me>=0?1:Oe),F=Math.round(Fe*Math.pow(10,me)*Oe)/Oe}while(me<Q||me===Q&&Fe<le);var Je=cr(h.max,F);return x.push(Je),x}(F,h);h.max=dt.max(Q),h.min=dt.min(Q),E.reverse?(x=!x,h.start=h.max,h.end=h.min):(h.start=h.min,h.end=h.max),x&&Q.reverse()},convertTicksToLabels:function(){this.tickValues=this.ticks.slice(),Mo.prototype.convertTicksToLabels.call(this)},getLabelForIndex:function(h,E){return this._getScaleLabel(this.chart.data.datasets[E].data[h])},getPixelForTick:function(h){var E=this.tickValues;return h<0||h>E.length-1?null:this.getPixelForValue(E[h])},_getFirstTickValue:function(h){var E=Math.floor(ui(h));return Math.floor(h/Math.pow(10,E))*Math.pow(10,E)},_configure:function(){var h=this,E=h.min,x=0;Mo.prototype._configure.call(h),0===E&&(E=h._getFirstTickValue(h.minNotZero),x=cr(h.options.ticks.fontSize,hr.global.defaultFontSize)/h._length),h._startValue=ui(E),h._valueOffset=x,h._valueRange=(ui(h.max)-ui(E))/(1-x)},getPixelForValue:function(h){var E=this,x=0;return(h=+E.getRightValue(h))>E.min&&h>0&&(x=(ui(h)-E._startValue)/E._valueRange+E._valueOffset),E.getPixelForDecimal(x)},getValueForPixel:function(h){var E=this,x=E.getDecimalForPixel(h);return 0===x&&0===E.min?0:Math.pow(10,E._startValue+(x-E._valueOffset)*E._valueRange)}});ha._defaults=Ta;var Ru=dt.valueOrDefault,lc=dt.valueAtIndexOrDefault,Fa=dt.options.resolve,nl={display:!0,animate:!0,position:"chartArea",angleLines:{display:!0,color:"rgba(0,0,0,0.1)",lineWidth:1,borderDash:[],borderDashOffset:0},gridLines:{circular:!1},ticks:{showLabelBackdrop:!0,backdropColor:"rgba(255,255,255,0.75)",backdropPaddingY:2,backdropPaddingX:2,callback:Dr.formatters.linear},pointLabels:{display:!0,fontSize:10,callback:function(h){return h}}};function mc(h){var E=h.ticks;return E.display&&h.display?Ru(E.fontSize,hr.global.defaultFontSize)+2*E.backdropPaddingY:0}function vc(h,E,x){return dt.isArray(x)?{w:dt.longestText(h,h.font,x),h:x.length*E}:{w:h.measureText(x).width,h:E}}function Bu(h,E,x,F,Q){return h===F||h===Q?{start:E-x/2,end:E+x/2}:h<F||h>Q?{start:E-x,end:E}:{start:E,end:E+x}}function tc(h){return 0===h||180===h?"center":h<180?"left":"right"}function bd(h,E,x,F){var le,me,Q=x.y+F/2;if(dt.isArray(E))for(le=0,me=E.length;le<me;++le)h.fillText(E[le],x.x,Q),Q+=F;else h.fillText(E,x.x,Q)}function kc(h,E,x){90===h||270===h?x.y-=E.h/2:(h>270||h<90)&&(x.y-=E.h)}function al(h){return dt.isNumber(h)?h:0}var Il=pa.extend({setDimensions:function(){var h=this;h.width=h.maxWidth,h.height=h.maxHeight,h.paddingTop=mc(h.options)/2,h.xCenter=Math.floor(h.width/2),h.yCenter=Math.floor((h.height-h.paddingTop)/2),h.drawingArea=Math.min(h.height-h.paddingTop,h.width)/2},determineDataLimits:function(){var h=this,E=h.chart,x=Number.POSITIVE_INFINITY,F=Number.NEGATIVE_INFINITY;dt.each(E.data.datasets,function(Q,le){if(E.isDatasetVisible(le)){var me=E.getDatasetMeta(le);dt.each(Q.data,function(Fe,Oe){var Je=+h.getRightValue(Fe);isNaN(Je)||me.data[Oe].hidden||(x=Math.min(Je,x),F=Math.max(Je,F))})}}),h.min=x===Number.POSITIVE_INFINITY?0:x,h.max=F===Number.NEGATIVE_INFINITY?0:F,h.handleTickRangeOptions()},_computeTickLimit:function(){return Math.ceil(this.drawingArea/mc(this.options))},convertTicksToLabels:function(){var h=this;pa.prototype.convertTicksToLabels.call(h),h.pointLabels=h.chart.data.labels.map(function(){var E=dt.callback(h.options.pointLabels.callback,arguments,h);return E||0===E?E:""})},getLabelForIndex:function(h,E){return+this.getRightValue(this.chart.data.datasets[E].data[h])},fit:function(){var h=this,E=h.options;E.display&&E.pointLabels.display?function Bl(h){var Q,le,me,E=dt.options._parseFont(h.options.pointLabels),x={l:0,r:h.width,t:0,b:h.height-h.paddingTop},F={};h.ctx.font=E.string,h._pointLabelSizes=[];var Fe=h.chart.data.labels.length;for(Q=0;Q<Fe;Q++){me=h.getPointPosition(Q,h.drawingArea+5),le=vc(h.ctx,E.lineHeight,h.pointLabels[Q]),h._pointLabelSizes[Q]=le;var Oe=h.getIndexAngle(Q),Je=dt.toDegrees(Oe)%360,ht=Bu(Je,me.x,le.w,0,180),gt=Bu(Je,me.y,le.h,90,270);ht.start<x.l&&(x.l=ht.start,F.l=Oe),ht.end>x.r&&(x.r=ht.end,F.r=Oe),gt.start<x.t&&(x.t=gt.start,F.t=Oe),gt.end>x.b&&(x.b=gt.end,F.b=Oe)}h.setReductions(h.drawingArea,x,F)}(h):h.setCenterPoint(0,0,0,0)},setReductions:function(h,E,x){var F=this,Q=E.l/Math.sin(x.l),le=Math.max(E.r-F.width,0)/Math.sin(x.r),me=-E.t/Math.cos(x.t),Fe=-Math.max(E.b-(F.height-F.paddingTop),0)/Math.cos(x.b);Q=al(Q),le=al(le),me=al(me),Fe=al(Fe),F.drawingArea=Math.min(Math.floor(h-(Q+le)/2),Math.floor(h-(me+Fe)/2)),F.setCenterPoint(Q,le,me,Fe)},setCenterPoint:function(h,E,x,F){var Q=this,Fe=x+Q.drawingArea,Oe=Q.height-Q.paddingTop-F-Q.drawingArea;Q.xCenter=Math.floor((h+Q.drawingArea+(Q.width-E-Q.drawingArea))/2+Q.left),Q.yCenter=Math.floor((Fe+Oe)/2+Q.top+Q.paddingTop)},getIndexAngle:function(h){var E=this.chart,le=(h*(360/E.data.labels.length)+((E.options||{}).startAngle||0))%360;return(le<0?le+360:le)*Math.PI*2/360},getDistanceFromCenterForValue:function(h){var E=this;if(dt.isNullOrUndef(h))return NaN;var x=E.drawingArea/(E.max-E.min);return E.options.ticks.reverse?(E.max-h)*x:(h-E.min)*x},getPointPosition:function(h,E){var x=this,F=x.getIndexAngle(h)-Math.PI/2;return{x:Math.cos(F)*E+x.xCenter,y:Math.sin(F)*E+x.yCenter}},getPointPositionForValue:function(h,E){return this.getPointPosition(h,this.getDistanceFromCenterForValue(E))},getBasePosition:function(h){var E=this,x=E.min,F=E.max;return E.getPointPositionForValue(h||0,E.beginAtZero?0:x<0&&F<0?F:x>0&&F>0?x:0)},_drawGrid:function(){var Fe,Oe,Je,h=this,E=h.ctx,x=h.options,F=x.gridLines,Q=x.angleLines,le=Ru(Q.lineWidth,F.lineWidth),me=Ru(Q.color,F.color);if(x.pointLabels.display&&function lu(h){var E=h.ctx,x=h.options,F=x.pointLabels,Q=mc(x),le=h.getDistanceFromCenterForValue(x.ticks.reverse?h.min:h.max),me=dt.options._parseFont(F);E.save(),E.font=me.string,E.textBaseline="middle";for(var Fe=h.chart.data.labels.length-1;Fe>=0;Fe--){var Je=h.getPointPosition(Fe,le+(0===Fe?Q/2:0)+5),ht=lc(F.fontColor,Fe,hr.global.defaultFontColor);E.fillStyle=ht;var gt=h.getIndexAngle(Fe),nn=dt.toDegrees(gt);E.textAlign=tc(nn),kc(nn,h._pointLabelSizes[Fe],Je),bd(E,h.pointLabels[Fe],Je,me.lineHeight)}E.restore()}(h),F.display&&dt.each(h.ticks,function(ht,gt){0!==gt&&(Oe=h.getDistanceFromCenterForValue(h.ticksAsNumbers[gt]),function Ma(h,E,x,F){var Je,Q=h.ctx,le=E.circular,me=h.chart.data.labels.length,Fe=lc(E.color,F-1),Oe=lc(E.lineWidth,F-1);if((le||me)&&Fe&&Oe){if(Q.save(),Q.strokeStyle=Fe,Q.lineWidth=Oe,Q.setLineDash&&(Q.setLineDash(E.borderDash||[]),Q.lineDashOffset=E.borderDashOffset||0),Q.beginPath(),le)Q.arc(h.xCenter,h.yCenter,x,0,2*Math.PI);else{Je=h.getPointPosition(0,x),Q.moveTo(Je.x,Je.y);for(var ht=1;ht<me;ht++)Je=h.getPointPosition(ht,x),Q.lineTo(Je.x,Je.y)}Q.closePath(),Q.stroke(),Q.restore()}}(h,F,Oe,gt))}),Q.display&&le&&me){for(E.save(),E.lineWidth=le,E.strokeStyle=me,E.setLineDash&&(E.setLineDash(Fa([Q.borderDash,F.borderDash,[]])),E.lineDashOffset=Fa([Q.borderDashOffset,F.borderDashOffset,0])),Fe=h.chart.data.labels.length-1;Fe>=0;Fe--)Oe=h.getDistanceFromCenterForValue(x.ticks.reverse?h.min:h.max),Je=h.getPointPosition(Fe,Oe),E.beginPath(),E.moveTo(h.xCenter,h.yCenter),E.lineTo(Je.x,Je.y),E.stroke();E.restore()}},_drawLabels:function(){var h=this,E=h.ctx,F=h.options.ticks;if(F.display){var Fe,Oe,Q=h.getIndexAngle(0),le=dt.options._parseFont(F),me=Ru(F.fontColor,hr.global.defaultFontColor);E.save(),E.font=le.string,E.translate(h.xCenter,h.yCenter),E.rotate(Q),E.textAlign="center",E.textBaseline="middle",dt.each(h.ticks,function(Je,ht){0===ht&&!F.reverse||(Fe=h.getDistanceFromCenterForValue(h.ticksAsNumbers[ht]),F.showLabelBackdrop&&(Oe=E.measureText(Je).width,E.fillStyle=F.backdropColor,E.fillRect(-Oe/2-F.backdropPaddingX,-Fe-le.size/2-F.backdropPaddingY,Oe+2*F.backdropPaddingX,le.size+2*F.backdropPaddingY)),E.fillStyle=me,E.fillText(Je,0,-Fe))}),E.restore()}},_drawTitle:dt.noop});Il._defaults=nl;var hf=dt._deprecated,zd=dt.options.resolve,sd=dt.valueOrDefault,Ol=Number.MIN_SAFE_INTEGER||-9007199254740991,Ll=Number.MAX_SAFE_INTEGER||9007199254740991,Uu={millisecond:{common:!0,size:1,steps:1e3},second:{common:!0,size:1e3,steps:60},minute:{common:!0,size:6e4,steps:60},hour:{common:!0,size:36e5,steps:24},day:{common:!0,size:864e5,steps:30},week:{common:!1,size:6048e5,steps:4},month:{common:!0,size:2628e6,steps:12},quarter:{common:!1,size:7884e6,steps:4},year:{common:!0,size:3154e7}},ll=Object.keys(Uu);function Su(h,E){return h-E}function yc(h){return dt.valueOrDefault(h.time.min,h.ticks.min)}function Nu(h){return dt.valueOrDefault(h.time.max,h.ticks.max)}function Of(h,E,x,F){var Q=function ul(h,E,x){for(var le,me,Fe,F=0,Q=h.length-1;F>=0&&F<=Q;){if(Fe=h[le=F+Q>>1],!(me=h[le-1]||null))return{lo:null,hi:Fe};if(Fe[E]<x)F=le+1;else{if(!(me[E]>x))return{lo:me,hi:Fe};Q=le-1}}return{lo:Fe,hi:null}}(h,E,x),le=Q.lo?Q.hi?Q.lo:h[h.length-2]:h[0],me=Q.lo?Q.hi?Q.hi:h[h.length-1]:h[1],Fe=me[E]-le[E];return le[F]+(me[F]-le[F])*(Fe?(x-le[E])/Fe:0)}function Yc(h,E){var x=h._adapter,F=h.options.time,Q=F.parser,le=Q||F.format,me=E;return"function"==typeof Q&&(me=Q(me)),dt.isFinite(me)||(me="string"==typeof le?x.parse(me,le):x.parse(me)),null!==me?+me:(!Q&&"function"==typeof le&&(me=le(E),dt.isFinite(me)||(me=x.parse(me))),me)}function Sd(h,E){if(dt.isNullOrUndef(E))return null;var x=h.options.time,F=Yc(h,h.getRightValue(E));return null===F||x.round&&(F=+h._adapter.startOf(F,x.round)),F}function uc(h,E,x,F){var le,me,Q=ll.length;for(le=ll.indexOf(h);le<Q-1;++le)if((me=Uu[ll[le]]).common&&Math.ceil((x-E)/((me.steps?me.steps:Ll)*me.size))<=F)return ll[le];return ll[Q-1]}function Ec(h,E,x){var me,Fe,F=[],Q={},le=E.length;for(me=0;me<le;++me)Q[Fe=E[me]]=me,F.push({value:Fe,major:!1});return 0!==le&&x?function Yu(h,E,x,F){var Fe,Oe,Q=h._adapter,le=+Q.startOf(E[0].value,F),me=E[E.length-1].value;for(Fe=le;Fe<=me;Fe=+Q.add(Fe,1,F))(Oe=x[Fe])>=0&&(E[Oe].major=!0);return E}(h,F,Q,x):F}var Af=Mo.extend({initialize:function(){this.mergeTicksOptions(),Mo.prototype.initialize.call(this)},update:function(){var h=this,E=h.options,x=E.time||(E.time={}),F=h._adapter=new zi._date(E.adapters.date);return hf("time scale",x.format,"time.format","time.parser"),hf("time scale",x.min,"time.min","ticks.min"),hf("time scale",x.max,"time.max","ticks.max"),dt.mergeIf(x.displayFormats,F.formats()),Mo.prototype.update.apply(h,arguments)},getRightValue:function(h){return h&&void 0!==h.t&&(h=h.t),Mo.prototype.getRightValue.call(this,h)},determineDataLimits:function(){var ht,gt,nn,$n,Bn,ar,Pr,h=this,E=h.chart,x=h._adapter,F=h.options,Q=F.time.unit||"day",le=Ll,me=Ol,Fe=[],Oe=[],Je=[],$i=h._getLabels();for(ht=0,nn=$i.length;ht<nn;++ht)Je.push(Sd(h,$i[ht]));for(ht=0,nn=(E.data.datasets||[]).length;ht<nn;++ht)if(E.isDatasetVisible(ht))if(dt.isObject((Bn=E.data.datasets[ht].data)[0]))for(Oe[ht]=[],gt=0,$n=Bn.length;gt<$n;++gt)ar=Sd(h,Bn[gt]),Fe.push(ar),Oe[ht][gt]=ar;else Oe[ht]=Je.slice(0),Pr||(Fe=Fe.concat(Je),Pr=!0);else Oe[ht]=[];Je.length&&(le=Math.min(le,Je[0]),me=Math.max(me,Je[Je.length-1])),Fe.length&&(Fe=nn>1?function tn(h){var F,Q,le,E={},x=[];for(F=0,Q=h.length;F<Q;++F)E[le=h[F]]||(E[le]=!0,x.push(le));return x}(Fe).sort(Su):Fe.sort(Su),le=Math.min(le,Fe[0]),me=Math.max(me,Fe[Fe.length-1])),le=Sd(h,yc(F))||le,me=Sd(h,Nu(F))||me,le=le===Ll?+x.startOf(Date.now(),Q):le,me=me===Ol?+x.endOf(Date.now(),Q)+1:me,h.min=Math.min(le,me),h.max=Math.max(le+1,me),h._table=[],h._timestamps={data:Fe,datasets:Oe,labels:Je}},buildTicks:function(){var gt,nn,$n,h=this,E=h.min,x=h.max,F=h.options,Q=F.ticks,le=F.time,me=h._timestamps,Fe=[],Oe=h.getLabelCapacity(E),Je=Q.source,ht=F.distribution;for(me="data"===Je||"auto"===Je&&"series"===ht?me.data:"labels"===Je?me.labels:function _f(h,E,x,F){var nn,Q=h._adapter,le=h.options,me=le.time,Fe=me.unit||uc(me.minUnit,E,x,F),Oe=zd([me.stepSize,me.unitStepSize,1]),Je="week"===Fe&&me.isoWeekday,ht=E,gt=[];if(Je&&(ht=+Q.startOf(ht,"isoWeek",Je)),ht=+Q.startOf(ht,Je?"day":Fe),Q.diff(x,E,Fe)>1e5*Oe)throw E+" and "+x+" are too far apart with stepSize of "+Oe+" "+Fe;for(nn=ht;nn<x;nn=+Q.add(nn,Oe,Fe))gt.push(nn);return(nn===x||"ticks"===le.bounds)&&gt.push(nn),gt}(h,E,x,Oe),"ticks"===F.bounds&&me.length&&(E=me[0],x=me[me.length-1]),E=Sd(h,yc(F))||E,x=Sd(h,Nu(F))||x,gt=0,nn=me.length;gt<nn;++gt)($n=me[gt])>=E&&$n<=x&&Fe.push($n);return h.min=E,h.max=x,h._unit=le.unit||(Q.autoSkip?uc(le.minUnit,h.min,h.max,Oe):function Td(h,E,x,F,Q){var le,me;for(le=ll.length-1;le>=ll.indexOf(x);le--)if(Uu[me=ll[le]].common&&h._adapter.diff(Q,F,me)>=E-1)return me;return ll[x?ll.indexOf(x):0]}(h,Fe.length,le.minUnit,h.min,h.max)),h._majorUnit=Q.major.enabled&&"year"!==h._unit?function $p(h){for(var E=ll.indexOf(h)+1,x=ll.length;E<x;++E)if(Uu[ll[E]].common)return ll[E]}(h._unit):void 0,h._table=function Xa(h,E,x,F){if("linear"===F||!h.length)return[{time:E,pos:0},{time:x,pos:1}];var me,Fe,Oe,Je,ht,Q=[],le=[E];for(me=0,Fe=h.length;me<Fe;++me)(Je=h[me])>E&&Je<x&&le.push(Je);for(le.push(x),me=0,Fe=le.length;me<Fe;++me)ht=le[me+1],Je=le[me],(void 0===(Oe=le[me-1])||void 0===ht||Math.round((ht+Oe)/2)!==Je)&&Q.push({time:Je,pos:me/(Fe-1)});return Q}(h._timestamps.data,E,x,ht),h._offsets=function up(h,E,x,F,Q){var Fe,Oe,le=0,me=0;return Q.offset&&E.length&&(Fe=Of(h,"time",E[0],"pos"),le=1===E.length?1-Fe:(Of(h,"time",E[1],"pos")-Fe)/2,Oe=Of(h,"time",E[E.length-1],"pos"),me=1===E.length?Oe:(Oe-Of(h,"time",E[E.length-2],"pos"))/2),{start:le,end:me,factor:1/(le+1+me)}}(h._table,Fe,0,0,F),Q.reverse&&Fe.reverse(),Ec(h,Fe,h._majorUnit)},getLabelForIndex:function(h,E){var x=this,F=x._adapter,Q=x.chart.data,le=x.options.time,me=Q.labels&&h<Q.labels.length?Q.labels[h]:"",Fe=Q.datasets[E].data[h];return dt.isObject(Fe)&&(me=x.getRightValue(Fe)),le.tooltipFormat?F.format(Yc(x,me),le.tooltipFormat):"string"==typeof me?me:F.format(Yc(x,me),le.displayFormats.datetime)},tickFormatFunction:function(h,E,x,F){var Q=this,me=Q.options,Fe=me.time.displayFormats,Je=Q._majorUnit,ht=Fe[Je],gt=x[E],nn=me.ticks,$n=Je&&ht&&gt&&gt.major,Bn=Q._adapter.format(h,F||($n?ht:Fe[Q._unit])),ar=$n?nn.major:nn.minor,Pr=zd([ar.callback,ar.userCallback,nn.callback,nn.userCallback]);return Pr?Pr(Bn,E,x):Bn},convertTicksToLabels:function(h){var x,F,E=[];for(x=0,F=h.length;x<F;++x)E.push(this.tickFormatFunction(h[x].value,x,h));return E},getPixelForOffset:function(h){var E=this,x=E._offsets,F=Of(E._table,"time",h,"pos");return E.getPixelForDecimal((x.start+F)*x.factor)},getPixelForValue:function(h,E,x){var F=this,Q=null;if(void 0!==E&&void 0!==x&&(Q=F._timestamps.datasets[x][E]),null===Q&&(Q=Sd(F,h)),null!==Q)return F.getPixelForOffset(Q)},getPixelForTick:function(h){var E=this.getTicks();return h>=0&&h<E.length?this.getPixelForOffset(E[h].value):null},getValueForPixel:function(h){var E=this,x=E._offsets,F=E.getDecimalForPixel(h)/x.factor-x.end,Q=Of(E._table,"pos",F,"time");return E._adapter._create(Q)},_getLabelSize:function(h){var E=this,x=E.options.ticks,F=E.ctx.measureText(h).width,Q=dt.toRadians(E.isHorizontal()?x.maxRotation:x.minRotation),le=Math.cos(Q),me=Math.sin(Q),Fe=sd(x.fontSize,hr.global.defaultFontSize);return{w:F*le+Fe*me,h:F*me+Fe*le}},getLabelWidth:function(h){return this._getLabelSize(h).w},getLabelCapacity:function(h){var E=this,x=E.options.time,F=x.displayFormats,Q=F[x.unit]||F.millisecond,le=E.tickFormatFunction(h,0,Ec(E,[h],E._majorUnit),Q),me=E._getLabelSize(le),Fe=Math.floor(E.isHorizontal()?E.width/me.w:E.height/me.h);return E.options.offset&&Fe--,Fe>0?Fe:1}});Af._defaults={position:"bottom",distribution:"linear",bounds:"data",adapters:{},time:{parser:!1,unit:!1,round:!1,displayFormat:!1,isoWeekday:!1,minUnit:"millisecond",displayFormats:{}},ticks:{autoSkip:!1,source:"auto",major:{enabled:!1}}};var $c={category:Sl,linear:Qt,logarithmic:ha,radialLinear:Il,time:Af},Pu={datetime:"MMM D, YYYY, h:mm:ss a",millisecond:"h:mm:ss.SSS a",second:"h:mm:ss a",minute:"h:mm a",hour:"hA",day:"MMM D",week:"ll",month:"MMM YYYY",quarter:"[Q]Q - YYYY",year:"YYYY"};zi._date.override("function"==typeof r?{_id:"moment",formats:function(){return Pu},parse:function(h,E){return"string"==typeof h&&"string"==typeof E?h=r(h,E):h instanceof r||(h=r(h)),h.isValid()?h.valueOf():null},format:function(h,E){return r(h).format(E)},add:function(h,E,x){return r(h).add(E,x).valueOf()},diff:function(h,E,x){return r(h).diff(r(E),x)},startOf:function(h,E,x){return h=r(h),"isoWeek"===E?h.isoWeekday(x).valueOf():h.startOf(E).valueOf()},endOf:function(h,E){return r(h).endOf(E).valueOf()},_create:function(h){return r(h)}}:{}),hr._set("global",{plugins:{filler:{propagate:!0}}});var ad={dataset:function(h){var E=h.fill,x=h.chart,F=x.getDatasetMeta(E),le=F&&x.isDatasetVisible(E)&&F.dataset._children||[],me=le.length||0;return me?function(Fe,Oe){return Oe<me&&le[Oe]._view||null}:null},boundary:function(h){var E=h.boundary,x=E?E.x:null,F=E?E.y:null;return dt.isArray(E)?function(Q,le){return E[le]}:function(Q){return{x:null===x?Q.x:x,y:null===F?Q.y:F}}}};function nc(h,E,x){var le,F=h._model||{},Q=F.fill;if(void 0===Q&&(Q=!!F.backgroundColor),!1===Q||null===Q)return!1;if(!0===Q)return"origin";if(le=parseFloat(Q,10),isFinite(le)&&Math.floor(le)===le)return("-"===Q[0]||"+"===Q[0])&&(le=E+le),!(le===E||le<0||le>=x)&&le;switch(Q){case"bottom":return"start";case"top":return"end";case"zero":return"origin";case"origin":case"start":case"end":return Q;default:return!1}}function ld(h){return(h.el._scale||{}).getPointPositionForValue?function Jc(h){var me,Fe,Oe,Je,ht,E=h.el._scale,x=E.options,F=E.chart.data.labels.length,Q=h.fill,le=[];if(!F)return null;for(Fe=x.ticks.reverse?E.min:E.max,Oe=E.getPointPositionForValue(0,me=x.ticks.reverse?E.max:E.min),Je=0;Je<F;++Je)ht="start"===Q||"end"===Q?E.getPointPositionForValue(Je,"start"===Q?me:Fe):E.getBasePosition(Je),x.gridLines.circular&&(ht.cx=Oe.x,ht.cy=Oe.y,ht.angle=E.getIndexAngle(Je)-Math.PI/2),le.push(ht);return le}(h):function Oa(h){var le,E=h.el._model||{},x=h.el._scale||{},F=h.fill,Q=null;if(isFinite(F))return null;if("start"===F?Q=void 0===E.scaleBottom?x.bottom:E.scaleBottom:"end"===F?Q=void 0===E.scaleTop?x.top:E.scaleTop:void 0!==E.scaleZero?Q=E.scaleZero:x.getBasePixel&&(Q=x.getBasePixel()),null!=Q){if(void 0!==Q.x&&void 0!==Q.y)return Q;if(dt.isFinite(Q))return{x:(le=x.isHorizontal())?Q:null,y:le?null:Q}}return null}(h)}function cp(h,E,x){var me,Q=h[E].fill,le=[E];if(!x)return Q;for(;!1!==Q&&-1===le.indexOf(Q);){if(!isFinite(Q))return Q;if(!(me=h[Q]))return!1;if(me.visible)return Q;le.push(Q),Q=me.fill}return!1}function $d(h){var E=h.fill,x="dataset";return!1===E?null:(isFinite(E)||(x="boundary"),ad[x](h))}function vo(h){return h&&!h.skip}function du(h,E,x,F,Q){var le,me,Fe,Oe;if(F&&Q){for(h.moveTo(E[0].x,E[0].y),le=1;le<F;++le)dt.canvas.lineTo(h,E[le-1],E[le]);if(void 0!==x[0].angle){for(me=x[0].cx,Fe=x[0].cy,Oe=Math.sqrt(Math.pow(x[0].x-me,2)+Math.pow(x[0].y-Fe,2)),le=Q-1;le>0;--le)h.arc(me,Fe,Oe,x[le].angle,x[le-1].angle,!0);return}for(h.lineTo(x[Q-1].x,x[Q-1].y),le=Q-1;le>0;--le)dt.canvas.lineTo(h,x[le],x[le-1],!0)}}function Fl(h,E,x,F,Q,le){var nn,$n,Bn,ar,Pr,$i,is,Eo,me=E.length,Fe=F.spanGaps,Oe=[],Je=[],ht=0,gt=0;for(h.beginPath(),nn=0,$n=me;nn<$n;++nn)Pr=x(ar=E[Bn=nn%me]._view,Bn,F),$i=vo(ar),is=vo(Pr),le&&void 0===Eo&&$i&&($n=me+(Eo=nn+1)),$i&&is?(ht=Oe.push(ar),gt=Je.push(Pr)):ht&&gt&&(Fe?($i&&Oe.push(ar),is&&Je.push(Pr)):(du(h,Oe,Je,ht,gt),ht=gt=0,Oe=[],Je=[]));du(h,Oe,Je,ht,gt),h.closePath(),h.fillStyle=Q,h.fill()}var Ac={id:"filler",afterDatasetsUpdate:function(h,E){var le,me,Fe,Oe,x=(h.data.datasets||[]).length,F=E.propagate,Q=[];for(me=0;me<x;++me)Oe=null,(Fe=(le=h.getDatasetMeta(me)).dataset)&&Fe._model&&Fe instanceof mo.Line&&(Oe={visible:h.isDatasetVisible(me),fill:nc(Fe,me,x),chart:h,el:Fe}),le.$filler=Oe,Q.push(Oe);for(me=0;me<x;++me)(Oe=Q[me])&&(Oe.fill=cp(Q,me,F),Oe.boundary=ld(Oe),Oe.mapper=$d(Oe))},beforeDatasetsDraw:function(h){var F,Q,le,me,Fe,Oe,Je,E=h._getSortedVisibleDatasetMetas(),x=h.ctx;for(Q=E.length-1;Q>=0;--Q)(F=E[Q].$filler)&&F.visible&&(Fe=(le=F.el)._children||[],Je=(me=le._view).backgroundColor||hr.global.defaultColor,(Oe=F.mapper)&&Je&&Fe.length&&(dt.canvas.clipArea(x,h.chartArea),Fl(x,Fe,Oe,me,Je,le._loop),dt.canvas.unclipArea(x)))}},ma=dt.rtl.getRtlAdapter,Dc=dt.noop,Iu=dt.valueOrDefault;function bc(h,E){return h.usePointStyle&&h.boxWidth>E?E:h.boxWidth}hr._set("global",{legend:{display:!0,position:"top",align:"center",fullWidth:!0,reverse:!1,weight:1e3,onClick:function(h,E){var x=E.datasetIndex,F=this.chart,Q=F.getDatasetMeta(x);Q.hidden=null===Q.hidden?!F.data.datasets[x].hidden:null,F.update()},onHover:null,onLeave:null,labels:{boxWidth:40,padding:10,generateLabels:function(h){var E=h.data.datasets,x=h.options.legend||{},F=x.labels&&x.labels.usePointStyle;return h._getSortedDatasetMetas().map(function(Q){var le=Q.controller.getStyle(F?0:void 0);return{text:E[Q.index].label,fillStyle:le.backgroundColor,hidden:!h.isDatasetVisible(Q.index),lineCap:le.borderCapStyle,lineDash:le.borderDash,lineDashOffset:le.borderDashOffset,lineJoin:le.borderJoinStyle,lineWidth:le.borderWidth,strokeStyle:le.borderColor,pointStyle:le.pointStyle,rotation:le.rotation,datasetIndex:Q.index}},this)}}},legendCallback:function(h){var F,Q,le,E=document.createElement("ul"),x=h.data.datasets;for(E.setAttribute("class",h.id+"-legend"),F=0,Q=x.length;F<Q;F++)(le=E.appendChild(document.createElement("li"))).appendChild(document.createElement("span")).style.backgroundColor=x[F].backgroundColor,x[F].label&&le.appendChild(document.createTextNode(x[F].label));return E.outerHTML}});var cc=pt.extend({initialize:function(h){var E=this;dt.extend(E,h),E.legendHitBoxes=[],E._hoveredItem=null,E.doughnutMode=!1},beforeUpdate:Dc,update:function(h,E,x){var F=this;return F.beforeUpdate(),F.maxWidth=h,F.maxHeight=E,F.margins=x,F.beforeSetDimensions(),F.setDimensions(),F.afterSetDimensions(),F.beforeBuildLabels(),F.buildLabels(),F.afterBuildLabels(),F.beforeFit(),F.fit(),F.afterFit(),F.afterUpdate(),F.minSize},afterUpdate:Dc,beforeSetDimensions:Dc,setDimensions:function(){var h=this;h.isHorizontal()?(h.width=h.maxWidth,h.left=0,h.right=h.width):(h.height=h.maxHeight,h.top=0,h.bottom=h.height),h.paddingLeft=0,h.paddingTop=0,h.paddingRight=0,h.paddingBottom=0,h.minSize={width:0,height:0}},afterSetDimensions:Dc,beforeBuildLabels:Dc,buildLabels:function(){var h=this,E=h.options.labels||{},x=dt.callback(E.generateLabels,[h.chart],h)||[];E.filter&&(x=x.filter(function(F){return E.filter(F,h.chart.data)})),h.options.reverse&&x.reverse(),h.legendItems=x},afterBuildLabels:Dc,beforeFit:Dc,fit:function(){var h=this,E=h.options,x=E.labels,F=E.display,Q=h.ctx,le=dt.options._parseFont(x),me=le.size,Fe=h.legendHitBoxes=[],Oe=h.minSize,Je=h.isHorizontal();if(Je?(Oe.width=h.maxWidth,Oe.height=F?10:0):(Oe.width=F?10:0,Oe.height=h.maxHeight),F){if(Q.font=le.string,Je){var ht=h.lineWidths=[0],gt=0;Q.textAlign="left",Q.textBaseline="middle",dt.each(h.legendItems,function(is,Eo){var qs=bc(x,me)+me/2+Q.measureText(is.text).width;(0===Eo||ht[ht.length-1]+qs+2*x.padding>Oe.width)&&(gt+=me+x.padding,ht[ht.length-(Eo>0?0:1)]=0),Fe[Eo]={left:0,top:0,width:qs,height:me},ht[ht.length-1]+=qs+x.padding}),Oe.height+=gt}else{var nn=x.padding,$n=h.columnWidths=[],Bn=h.columnHeights=[],ar=x.padding,Pr=0,$i=0;dt.each(h.legendItems,function(is,Eo){var qs=bc(x,me)+me/2+Q.measureText(is.text).width;Eo>0&&$i+me+2*nn>Oe.height&&(ar+=Pr+x.padding,$n.push(Pr),Bn.push($i),Pr=0,$i=0),Pr=Math.max(Pr,qs),$i+=me+nn,Fe[Eo]={left:0,top:0,width:qs,height:me}}),ar+=Pr,$n.push(Pr),Bn.push($i),Oe.width+=ar}h.width=Oe.width,h.height=Oe.height}else h.width=Oe.width=h.height=Oe.height=0},afterFit:Dc,isHorizontal:function(){return"top"===this.options.position||"bottom"===this.options.position},draw:function(){var h=this,E=h.options,x=E.labels,F=hr.global,Q=F.defaultColor,le=F.elements.line,me=h.height,Fe=h.columnHeights,Oe=h.width,Je=h.lineWidths;if(E.display){var ar,ht=ma(E.rtl,h.left,h.minSize.width),gt=h.ctx,nn=Iu(x.fontColor,F.defaultFontColor),$n=dt.options._parseFont(x),Bn=$n.size;gt.textAlign=ht.textAlign("left"),gt.textBaseline="middle",gt.lineWidth=.5,gt.strokeStyle=nn,gt.fillStyle=nn,gt.font=$n.string;var Pr=bc(x,Bn),$i=h.legendHitBoxes,Gs=function(ka,ja){switch(E.align){case"start":return x.padding;case"end":return ka-ja;default:return(ka-ja+x.padding)/2}},qs=h.isHorizontal();ar=qs?{x:h.left+Gs(Oe,Je[0]),y:h.top+x.padding,line:0}:{x:h.left+x.padding,y:h.top+Gs(me,Fe[0]),line:0},dt.rtl.overrideTextDirection(h.ctx,E.textDirection);var qa=Bn+x.padding;dt.each(h.legendItems,function(ka,ja){var wa=gt.measureText(ka.text).width,jl=Pr+Bn/2+wa,pu=ar.x,Ga=ar.y;ht.setWidth(h.minSize.width),qs?ja>0&&pu+jl+x.padding>h.left+h.minSize.width&&(Ga=ar.y+=qa,ar.line++,pu=ar.x=h.left+Gs(Oe,Je[ar.line])):ja>0&&Ga+qa>h.top+h.minSize.height&&(pu=ar.x=pu+h.columnWidths[ar.line]+x.padding,ar.line++,Ga=ar.y=h.top+Gs(me,Fe[ar.line]));var Tu=ht.x(pu);(function(ka,ja,wa){if(!(isNaN(Pr)||Pr<=0)){gt.save();var jl=Iu(wa.lineWidth,le.borderWidth);if(gt.fillStyle=Iu(wa.fillStyle,Q),gt.lineCap=Iu(wa.lineCap,le.borderCapStyle),gt.lineDashOffset=Iu(wa.lineDashOffset,le.borderDashOffset),gt.lineJoin=Iu(wa.lineJoin,le.borderJoinStyle),gt.lineWidth=jl,gt.strokeStyle=Iu(wa.strokeStyle,Q),gt.setLineDash&&gt.setLineDash(Iu(wa.lineDash,le.borderDash)),x&&x.usePointStyle){var pu=Pr*Math.SQRT2/2,Ga=ht.xPlus(ka,Pr/2);dt.canvas.drawPoint(gt,wa.pointStyle,pu,Ga,ja+Bn/2,wa.rotation)}else gt.fillRect(ht.leftForLtr(ka,Pr),ja,Pr,Bn),0!==jl&&gt.strokeRect(ht.leftForLtr(ka,Pr),ja,Pr,Bn);gt.restore()}})(Tu,Ga,ka),$i[ja].left=ht.leftForLtr(Tu,$i[ja].width),$i[ja].top=Ga,function(ka,ja,wa,jl){var pu=Bn/2,Ga=ht.xPlus(ka,Pr+pu),Tu=ja+pu;gt.fillText(wa.text,Ga,Tu),wa.hidden&&(gt.beginPath(),gt.lineWidth=2,gt.moveTo(Ga,Tu),gt.lineTo(ht.xPlus(Ga,jl),Tu),gt.stroke())}(Tu,Ga,ka,wa),qs?ar.x+=jl+x.padding:ar.y+=qa}),dt.rtl.restoreTextDirection(h.ctx,E.textDirection)}},_getLegendItemAt:function(h,E){var F,Q,le,x=this;if(h>=x.left&&h<=x.right&&E>=x.top&&E<=x.bottom)for(le=x.legendHitBoxes,F=0;F<le.length;++F)if(h>=(Q=le[F]).left&&h<=Q.left+Q.width&&E>=Q.top&&E<=Q.top+Q.height)return x.legendItems[F];return null},handleEvent:function(h){var Q,E=this,x=E.options,F="mouseup"===h.type?"click":h.type;if("mousemove"===F){if(!x.onHover&&!x.onLeave)return}else{if("click"!==F)return;if(!x.onClick)return}Q=E._getLegendItemAt(h.x,h.y),"click"===F?Q&&x.onClick&&x.onClick.call(E,h.native,Q):(x.onLeave&&Q!==E._hoveredItem&&(E._hoveredItem&&x.onLeave.call(E,h.native,E._hoveredItem),E._hoveredItem=Q),x.onHover&&Q&&x.onHover.call(E,h.native,Q))}});function Jl(h,E){var x=new cc({ctx:h.ctx,options:E,chart:h});Hl.configure(h,x,E),Hl.addBox(h,x),h.legend=x}var Sc={id:"legend",_element:cc,beforeInit:function(h){var E=h.options.legend;E&&Jl(h,E)},beforeUpdate:function(h){var E=h.options.legend,x=h.legend;E?(dt.mergeIf(E,hr.global.legend),x?(Hl.configure(h,x,E),x.options=E):Jl(h,E)):x&&(Hl.removeBox(h,x),delete h.legend)},afterEvent:function(h,E){var x=h.legend;x&&x.handleEvent(E)}},Tc=dt.noop;hr._set("global",{title:{display:!1,fontStyle:"bold",fullWidth:!0,padding:10,position:"top",text:"",weight:2e3}});var ju=pt.extend({initialize:function(h){dt.extend(this,h),this.legendHitBoxes=[]},beforeUpdate:Tc,update:function(h,E,x){var F=this;return F.beforeUpdate(),F.maxWidth=h,F.maxHeight=E,F.margins=x,F.beforeSetDimensions(),F.setDimensions(),F.afterSetDimensions(),F.beforeBuildLabels(),F.buildLabels(),F.afterBuildLabels(),F.beforeFit(),F.fit(),F.afterFit(),F.afterUpdate(),F.minSize},afterUpdate:Tc,beforeSetDimensions:Tc,setDimensions:function(){var h=this;h.isHorizontal()?(h.width=h.maxWidth,h.left=0,h.right=h.width):(h.height=h.maxHeight,h.top=0,h.bottom=h.height),h.paddingLeft=0,h.paddingTop=0,h.paddingRight=0,h.paddingBottom=0,h.minSize={width:0,height:0}},afterSetDimensions:Tc,beforeBuildLabels:Tc,buildLabels:Tc,afterBuildLabels:Tc,beforeFit:Tc,fit:function(){var le,h=this,E=h.options,x=h.minSize={},F=h.isHorizontal();E.display?(le=(dt.isArray(E.text)?E.text.length:1)*dt.options._parseFont(E).lineHeight+2*E.padding,h.width=x.width=F?h.maxWidth:le,h.height=x.height=F?le:h.maxHeight):h.width=x.width=h.height=x.height=0},afterFit:Tc,isHorizontal:function(){var h=this.options.position;return"top"===h||"bottom"===h},draw:function(){var h=this,E=h.ctx,x=h.options;if(x.display){var gt,nn,$n,F=dt.options._parseFont(x),Q=F.lineHeight,le=Q/2+x.padding,me=0,Fe=h.top,Oe=h.left,Je=h.bottom,ht=h.right;E.fillStyle=dt.valueOrDefault(x.fontColor,hr.global.defaultFontColor),E.font=F.string,h.isHorizontal()?(nn=Oe+(ht-Oe)/2,$n=Fe+le,gt=ht-Oe):(nn="left"===x.position?Oe+le:ht-le,$n=Fe+(Je-Fe)/2,gt=Je-Fe,me=Math.PI*("left"===x.position?-.5:.5)),E.save(),E.translate(nn,$n),E.rotate(me),E.textAlign="center",E.textBaseline="middle";var Bn=x.text;if(dt.isArray(Bn))for(var ar=0,Pr=0;Pr<Bn.length;++Pr)E.fillText(Bn[Pr],0,ar,gt),ar+=Q;else E.fillText(Bn,0,0,gt);E.restore()}}});function fu(h,E){var x=new ju({ctx:h.ctx,options:E,chart:h});Hl.configure(h,x,E),Hl.addBox(h,x),h.titleBlock=x}var dc={},Zd=Ac,Qc=Sc,Rl={id:"title",_element:ju,beforeInit:function(h){var E=h.options.title;E&&fu(h,E)},beforeUpdate:function(h){var E=h.options.title,x=h.titleBlock;E?(dt.mergeIf(E,hr.global.title),x?(Hl.configure(h,x,E),x.options=E):fu(h,E)):x&&(Hl.removeBox(h,x),delete h.titleBlock)}};for(var jc in dc.filler=Zd,dc.legend=Qc,dc.title=Rl,Cn.helpers=dt,function(){function h(F,Q,le){var me;return"string"==typeof F?(me=parseInt(F,10),-1!==F.indexOf("%")&&(me=me/100*Q.parentNode[le])):me=F,me}function E(F){return null!=F&&"none"!==F}function x(F,Q,le){var me=document.defaultView,Fe=dt._getParentNode(F),Oe=me.getComputedStyle(F)[Q],Je=me.getComputedStyle(Fe)[Q],ht=E(Oe),gt=E(Je),nn=Number.POSITIVE_INFINITY;return ht||gt?Math.min(ht?h(Oe,F,le):nn,gt?h(Je,Fe,le):nn):"none"}dt.where=function(F,Q){if(dt.isArray(F)&&Array.prototype.filter)return F.filter(Q);var le=[];return dt.each(F,function(me){Q(me)&&le.push(me)}),le},dt.findIndex=Array.prototype.findIndex?function(F,Q,le){return F.findIndex(Q,le)}:function(F,Q,le){le=void 0===le?F:le;for(var me=0,Fe=F.length;me<Fe;++me)if(Q.call(le,F[me],me,F))return me;return-1},dt.findNextWhere=function(F,Q,le){dt.isNullOrUndef(le)&&(le=-1);for(var me=le+1;me<F.length;me++){var Fe=F[me];if(Q(Fe))return Fe}},dt.findPreviousWhere=function(F,Q,le){dt.isNullOrUndef(le)&&(le=F.length);for(var me=le-1;me>=0;me--){var Fe=F[me];if(Q(Fe))return Fe}},dt.isNumber=function(F){return!isNaN(parseFloat(F))&&isFinite(F)},dt.almostEquals=function(F,Q,le){return Math.abs(F-Q)<le},dt.almostWhole=function(F,Q){var le=Math.round(F);return le-Q<=F&&le+Q>=F},dt.max=function(F){return F.reduce(function(Q,le){return isNaN(le)?Q:Math.max(Q,le)},Number.NEGATIVE_INFINITY)},dt.min=function(F){return F.reduce(function(Q,le){return isNaN(le)?Q:Math.min(Q,le)},Number.POSITIVE_INFINITY)},dt.sign=Math.sign?function(F){return Math.sign(F)}:function(F){return 0==(F=+F)||isNaN(F)?F:F>0?1:-1},dt.toRadians=function(F){return F*(Math.PI/180)},dt.toDegrees=function(F){return F*(180/Math.PI)},dt._decimalPlaces=function(F){if(dt.isFinite(F)){for(var Q=1,le=0;Math.round(F*Q)/Q!==F;)Q*=10,le++;return le}},dt.getAngleFromPoint=function(F,Q){var le=Q.x-F.x,me=Q.y-F.y,Fe=Math.sqrt(le*le+me*me),Oe=Math.atan2(me,le);return Oe<-.5*Math.PI&&(Oe+=2*Math.PI),{angle:Oe,distance:Fe}},dt.distanceBetweenPoints=function(F,Q){return Math.sqrt(Math.pow(Q.x-F.x,2)+Math.pow(Q.y-F.y,2))},dt.aliasPixel=function(F){return F%2==0?0:.5},dt._alignPixel=function(F,Q,le){var me=F.currentDevicePixelRatio,Fe=le/2;return Math.round((Q-Fe)*me)/me+Fe},dt.splineCurve=function(F,Q,le,me){var Fe=F.skip?Q:F,Oe=Q,Je=le.skip?Q:le,ht=Math.sqrt(Math.pow(Oe.x-Fe.x,2)+Math.pow(Oe.y-Fe.y,2)),gt=Math.sqrt(Math.pow(Je.x-Oe.x,2)+Math.pow(Je.y-Oe.y,2)),nn=ht/(ht+gt),$n=gt/(ht+gt),Bn=me*(nn=isNaN(nn)?0:nn),ar=me*($n=isNaN($n)?0:$n);return{previous:{x:Oe.x-Bn*(Je.x-Fe.x),y:Oe.y-Bn*(Je.y-Fe.y)},next:{x:Oe.x+ar*(Je.x-Fe.x),y:Oe.y+ar*(Je.y-Fe.y)}}},dt.EPSILON=Number.EPSILON||1e-14,dt.splineCurveMonotone=function(F){var me,Fe,Oe,Je,gt,nn,$n,Bn,ar,Q=(F||[]).map(function(Pr){return{model:Pr._model,deltaK:0,mK:0}}),le=Q.length;for(me=0;me<le;++me)if(!(Oe=Q[me]).model.skip){if(Fe=me>0?Q[me-1]:null,(Je=me<le-1?Q[me+1]:null)&&!Je.model.skip){var ht=Je.model.x-Oe.model.x;Oe.deltaK=0!==ht?(Je.model.y-Oe.model.y)/ht:0}Oe.mK=!Fe||Fe.model.skip?Oe.deltaK:!Je||Je.model.skip?Fe.deltaK:this.sign(Fe.deltaK)!==this.sign(Oe.deltaK)?0:(Fe.deltaK+Oe.deltaK)/2}for(me=0;me<le-1;++me)if(Je=Q[me+1],!(Oe=Q[me]).model.skip&&!Je.model.skip){if(dt.almostEquals(Oe.deltaK,0,this.EPSILON)){Oe.mK=Je.mK=0;continue}gt=Oe.mK/Oe.deltaK,nn=Je.mK/Oe.deltaK,!((Bn=Math.pow(gt,2)+Math.pow(nn,2))<=9)&&($n=3/Math.sqrt(Bn),Oe.mK=gt*$n*Oe.deltaK,Je.mK=nn*$n*Oe.deltaK)}for(me=0;me<le;++me)!(Oe=Q[me]).model.skip&&(Je=me<le-1?Q[me+1]:null,(Fe=me>0?Q[me-1]:null)&&!Fe.model.skip&&(Oe.model.controlPointPreviousX=Oe.model.x-(ar=(Oe.model.x-Fe.model.x)/3),Oe.model.controlPointPreviousY=Oe.model.y-ar*Oe.mK),Je&&!Je.model.skip&&(Oe.model.controlPointNextX=Oe.model.x+(ar=(Je.model.x-Oe.model.x)/3),Oe.model.controlPointNextY=Oe.model.y+ar*Oe.mK))},dt.nextItem=function(F,Q,le){return le?Q>=F.length-1?F[0]:F[Q+1]:Q>=F.length-1?F[F.length-1]:F[Q+1]},dt.previousItem=function(F,Q,le){return le?Q<=0?F[F.length-1]:F[Q-1]:Q<=0?F[0]:F[Q-1]},dt.niceNum=function(F,Q){var le=Math.floor(dt.log10(F)),me=F/Math.pow(10,le);return(Q?me<1.5?1:me<3?2:me<7?5:10:me<=1?1:me<=2?2:me<=5?5:10)*Math.pow(10,le)},dt.requestAnimFrame="undefined"==typeof window?function(F){F()}:window.requestAnimationFrame||window.webkitRequestAnimationFrame||window.mozRequestAnimationFrame||window.oRequestAnimationFrame||window.msRequestAnimationFrame||function(F){return window.setTimeout(F,1e3/60)},dt.getRelativePosition=function(F,Q){var le,me,Fe=F.originalEvent||F,Oe=F.target||F.srcElement,Je=Oe.getBoundingClientRect(),ht=Fe.touches;ht&&ht.length>0?(le=ht[0].clientX,me=ht[0].clientY):(le=Fe.clientX,me=Fe.clientY);var gt=parseFloat(dt.getStyle(Oe,"padding-left")),nn=parseFloat(dt.getStyle(Oe,"padding-top")),$n=parseFloat(dt.getStyle(Oe,"padding-right")),Bn=parseFloat(dt.getStyle(Oe,"padding-bottom")),Pr=Je.bottom-Je.top-nn-Bn;return{x:le=Math.round((le-Je.left-gt)/(Je.right-Je.left-gt-$n)*Oe.width/Q.currentDevicePixelRatio),y:me=Math.round((me-Je.top-nn)/Pr*Oe.height/Q.currentDevicePixelRatio)}},dt.getConstraintWidth=function(F){return x(F,"max-width","clientWidth")},dt.getConstraintHeight=function(F){return x(F,"max-height","clientHeight")},dt._calculatePadding=function(F,Q,le){return(Q=dt.getStyle(F,Q)).indexOf("%")>-1?le*parseInt(Q,10)/100:parseInt(Q,10)},dt._getParentNode=function(F){var Q=F.parentNode;return Q&&"[object ShadowRoot]"===Q.toString()&&(Q=Q.host),Q},dt.getMaximumWidth=function(F){var Q=dt._getParentNode(F);if(!Q)return F.clientWidth;var le=Q.clientWidth,Oe=le-dt._calculatePadding(Q,"padding-left",le)-dt._calculatePadding(Q,"padding-right",le),Je=dt.getConstraintWidth(F);return isNaN(Je)?Oe:Math.min(Oe,Je)},dt.getMaximumHeight=function(F){var Q=dt._getParentNode(F);if(!Q)return F.clientHeight;var le=Q.clientHeight,Oe=le-dt._calculatePadding(Q,"padding-top",le)-dt._calculatePadding(Q,"padding-bottom",le),Je=dt.getConstraintHeight(F);return isNaN(Je)?Oe:Math.min(Oe,Je)},dt.getStyle=function(F,Q){return F.currentStyle?F.currentStyle[Q]:document.defaultView.getComputedStyle(F,null).getPropertyValue(Q)},dt.retinaScale=function(F,Q){var le=F.currentDevicePixelRatio=Q||"undefined"!=typeof window&&window.devicePixelRatio||1;if(1!==le){var me=F.canvas,Fe=F.height,Oe=F.width;me.height=Fe*le,me.width=Oe*le,F.ctx.scale(le,le),!me.style.height&&!me.style.width&&(me.style.height=Fe+"px",me.style.width=Oe+"px")}},dt.fontString=function(F,Q,le){return Q+" "+F+"px "+le},dt.longestText=function(F,Q,le,me){var Fe=(me=me||{}).data=me.data||{},Oe=me.garbageCollect=me.garbageCollect||[];me.font!==Q&&(Fe=me.data={},Oe=me.garbageCollect=[],me.font=Q),F.font=Q;var gt,nn,$n,Bn,ar,Je=0,ht=le.length;for(gt=0;gt<ht;gt++)if(null!=(Bn=le[gt])&&!0!==dt.isArray(Bn))Je=dt.measureText(F,Fe,Oe,Je,Bn);else if(dt.isArray(Bn))for(nn=0,$n=Bn.length;nn<$n;nn++)null!=(ar=Bn[nn])&&!dt.isArray(ar)&&(Je=dt.measureText(F,Fe,Oe,Je,ar));var Pr=Oe.length/2;if(Pr>le.length){for(gt=0;gt<Pr;gt++)delete Fe[Oe[gt]];Oe.splice(0,Pr)}return Je},dt.measureText=function(F,Q,le,me,Fe){var Oe=Q[Fe];return Oe||(Oe=Q[Fe]=F.measureText(Fe).width,le.push(Fe)),Oe>me&&(me=Oe),me},dt.numberOfLabelLines=function(F){var Q=1;return dt.each(F,function(le){dt.isArray(le)&&le.length>Q&&(Q=le.length)}),Q},dt.color=dr?function(F){return F instanceof CanvasGradient&&(F=hr.global.defaultColor),dr(F)}:function(F){return console.error("Color.js not found!"),F},dt.getHoverColor=function(F){return F instanceof CanvasPattern||F instanceof CanvasGradient?F:dt.color(F).saturate(.5).darken(.1).rgbString()}}(),Cn._adapters=zi,Cn.Animation=dn,Cn.animationService=mr,Cn.controllers=bi,Cn.DatasetController=Ai,Cn.defaults=hr,Cn.Element=pt,Cn.elements=mo,Cn.Interaction=ol,Cn.layouts=Hl,Cn.platform=Ia,Cn.plugins=ys,Cn.Scale=Mo,Cn.scaleService=qu,Cn.Ticks=Dr,Cn.Tooltip=Fd,Cn.helpers.each($c,function(h,E){Cn.scaleService.registerScaleType(E,h,h._defaults)}),dc)dc.hasOwnProperty(jc)&&Cn.plugins.register(dc[jc]);Cn.platform.initialize();var fc=Cn;return"undefined"!=typeof window&&(window.Chart=Cn),Cn.Chart=Cn,Cn.Legend=dc.legend._element,Cn.Title=dc.title._element,Cn.pluginService=Cn.plugins,Cn.PluginBase=Cn.Element.extend({}),Cn.canvasHelpers=Cn.helpers.canvas,Cn.layoutService=Cn.layouts,Cn.LinearScaleBase=pa,Cn.helpers.each(["Bar","Bubble","Doughnut","Line","PolarArea","Radar","Scatter"],function(h){Cn[h]=function(E,x){return new Cn(E,Cn.helpers.merge(x||{},{type:h.charAt(0).toLowerCase()+h.slice(1)}))}}),fc}(function(){try{return i(16738)}catch(f){}}())},82885:(m,S)=>{var r;!function(){"use strict";var a={}.hasOwnProperty;function c(){for(var e=[],p=0;p<arguments.length;p++){var y=arguments[p];if(y){var T=typeof y;if("string"===T||"number"===T)e.push(y);else if(Array.isArray(y)){if(y.length){var C=c.apply(null,y);C&&e.push(C)}}else if("object"===T){if(y.toString!==Object.prototype.toString&&!y.toString.toString().includes("[native code]")){e.push(y.toString());continue}for(var R in y)a.call(y,R)&&y[R]&&e.push(R)}}}return e.join(" ")}m.exports?(c.default=c,m.exports=c):void 0!==(r=function(){return c}.apply(S,[]))&&(m.exports=r)}()},2665:m=>{m.exports=function(i,r){for(var a=[],f=0;f<i.length;f++){var c=r(i[f],f);S(c)?a.push.apply(a,c):a.push(c)}return a};var S=Array.isArray||function(i){return"[object Array]"===Object.prototype.toString.call(i)}},7281:(m,S)=>{"use strict";S.parse=function a(T,C){if("string"!=typeof T)throw new TypeError("argument str must be a string");for(var R={},z=(C||{}).decode||c,W=0;W<T.length;){var J=T.indexOf("=",W);if(-1===J)break;var ee=T.indexOf(";",W);if(-1===ee)ee=T.length;else if(ee<J){W=T.lastIndexOf(";",J-1)+1;continue}var ce=T.slice(W,J).trim();if(void 0===R[ce]){var ie=T.slice(J+1,ee).trim();34===ie.charCodeAt(0)&&(ie=ie.slice(1,-1)),R[ce]=y(ie,z)}W=ee+1}return R},S.serialize=function f(T,C,R){var L=R||{},z=L.encode||e;if("function"!=typeof z)throw new TypeError("option encode is invalid");if(!r.test(T))throw new TypeError("argument name is invalid");var W=z(C);if(W&&!r.test(W))throw new TypeError("argument val is invalid");var J=T+"="+W;if(null!=L.maxAge){var ee=L.maxAge-0;if(isNaN(ee)||!isFinite(ee))throw new TypeError("option maxAge is invalid");J+="; Max-Age="+Math.floor(ee)}if(L.domain){if(!r.test(L.domain))throw new TypeError("option domain is invalid");J+="; Domain="+L.domain}if(L.path){if(!r.test(L.path))throw new TypeError("option path is invalid");J+="; Path="+L.path}if(L.expires){var ce=L.expires;if(!function p(T){return"[object Date]"===i.call(T)||T instanceof Date}(ce)||isNaN(ce.valueOf()))throw new TypeError("option expires is invalid");J+="; Expires="+ce.toUTCString()}if(L.httpOnly&&(J+="; HttpOnly"),L.secure&&(J+="; Secure"),L.priority)switch("string"==typeof L.priority?L.priority.toLowerCase():L.priority){case"low":J+="; Priority=Low";break;case"medium":J+="; Priority=Medium";break;case"high":J+="; Priority=High";break;default:throw new TypeError("option priority is invalid")}if(L.sameSite)switch("string"==typeof L.sameSite?L.sameSite.toLowerCase():L.sameSite){case!0:J+="; SameSite=Strict";break;case"lax":J+="; SameSite=Lax";break;case"strict":J+="; SameSite=Strict";break;case"none":J+="; SameSite=None";break;default:throw new TypeError("option sameSite is invalid")}return J};var i=Object.prototype.toString,r=/^[\u0009\u0020-\u007e\u0080-\u00ff]+$/;function c(T){return-1!==T.indexOf("%")?decodeURIComponent(T):T}function e(T){return encodeURIComponent(T)}function y(T,C){try{return C(T)}catch(R){return T}}},96967:(m,S,i)=>{"use strict";var r=i(35311),a={"text/plain":"Text","text/html":"Url",default:"Text"};m.exports=function e(p,y){var T,C,R,L,z,W,J=!1;y||(y={}),T=y.debug||!1;try{if(R=r(),L=document.createRange(),z=document.getSelection(),(W=document.createElement("span")).textContent=p,W.ariaHidden="true",W.style.all="unset",W.style.position="fixed",W.style.top=0,W.style.clip="rect(0, 0, 0, 0)",W.style.whiteSpace="pre",W.style.webkitUserSelect="text",W.style.MozUserSelect="text",W.style.msUserSelect="text",W.style.userSelect="text",W.addEventListener("copy",function(ce){ce.stopPropagation(),y.format&&(ce.preventDefault(),void 0===ce.clipboardData?(T&&console.warn("unable to use e.clipboardData"),T&&console.warn("trying IE specific stuff"),window.clipboardData.clearData(),window.clipboardData.setData(a[y.format]||a.default,p)):(ce.clipboardData.clearData(),ce.clipboardData.setData(y.format,p))),y.onCopy&&(ce.preventDefault(),y.onCopy(ce.clipboardData))}),document.body.appendChild(W),L.selectNodeContents(W),z.addRange(L),!document.execCommand("copy"))throw new Error("copy command was unsuccessful");J=!0}catch(ce){T&&console.error("unable to copy using execCommand: ",ce),T&&console.warn("trying IE specific stuff");try{window.clipboardData.setData(y.format||"text",p),y.onCopy&&y.onCopy(window.clipboardData),J=!0}catch(ie){T&&console.error("unable to copy using clipboardData: ",ie),T&&console.error("falling back to prompt"),C=function c(p){var y=(/mac os x/i.test(navigator.userAgent)?"\u2318":"Ctrl")+"+C";return p.replace(/#{\s*key\s*}/g,y)}("message"in y?y.message:"Copy to clipboard: #{key}, Enter"),window.prompt(C,p)}}finally{z&&("function"==typeof z.removeRange?z.removeRange(L):z.removeAllRanges()),W&&document.body.removeChild(W),R()}return J}},43987:(m,S,i)=>{var r=i(75242);m.exports=r},99556:(m,S,i)=>{var r=i(10323);m.exports=r},39287:(m,S,i)=>{var r=i(8748);m.exports=r},25272:(m,S,i)=>{var r=i(71873);m.exports=r},54450:(m,S,i)=>{var r=i(19095);m.exports=r},39557:(m,S,i)=>{var r=i(52049);m.exports=r},61611:(m,S,i)=>{var r=i(87054);m.exports=r},22549:(m,S,i)=>{var r=i(45284);m.exports=r},47646:(m,S,i)=>{var r=i(70157);m.exports=r},78663:(m,S,i)=>{var r=i(640);m.exports=r},48498:(m,S,i)=>{var r=i(50320);m.exports=r},4922:(m,S,i)=>{var r=i(93006);m.exports=r},95190:(m,S,i)=>{var r=i(36226);m.exports=r},78525:(m,S,i)=>{var r=i(21968);m.exports=r},21064:(m,S,i)=>{var r=i(87259);m.exports=r},65641:(m,S,i)=>{var r=i(62021);m.exports=r},21693:(m,S,i)=>{var r=i(57682);m.exports=r},88907:(m,S,i)=>{var r=i(94222);m.exports=r},41432:(m,S,i)=>{var r=i(1162);m.exports=r},7398:(m,S,i)=>{var r=i(82805);m.exports=r},67221:(m,S,i)=>{var r=i(26498);m.exports=r},67447:(m,S,i)=>{var r=i(44850);m.exports=r},58811:(m,S,i)=>{var r=i(9634);m.exports=r},19573:(m,S,i)=>{var r=i(96551);i(5737),m.exports=r},10226:(m,S,i)=>{var r=i(98908);m.exports=r},56378:(m,S,i)=>{var r=i(55434);m.exports=r},74771:(m,S,i)=>{i(3934),i(261);var r=i(13544);m.exports=r.Array.from},8412:(m,S,i)=>{i(2862);var r=i(13544);m.exports=r.Array.isArray},77377:(m,S,i)=>{i(1625);var r=i(97911);m.exports=r("Array").concat},399:(m,S,i)=>{i(1285),i(17221);var r=i(97911);m.exports=r("Array").entries},66933:(m,S,i)=>{i(70466);var r=i(97911);m.exports=r("Array").every},9504:(m,S,i)=>{i(24990);var r=i(97911);m.exports=r("Array").fill},82168:(m,S,i)=>{i(56534);var r=i(97911);m.exports=r("Array").filter},65618:(m,S,i)=>{i(12773);var r=i(97911);m.exports=r("Array").findIndex},9186:(m,S,i)=>{i(60326);var r=i(97911);m.exports=r("Array").find},98812:(m,S,i)=>{i(98792);var r=i(97911);m.exports=r("Array").forEach},58479:(m,S,i)=>{i(77059);var r=i(97911);m.exports=r("Array").includes},43207:(m,S,i)=>{i(2795);var r=i(97911);m.exports=r("Array").indexOf},33195:(m,S,i)=>{i(1285),i(17221);var r=i(97911);m.exports=r("Array").keys},63033:(m,S,i)=>{i(74926);var r=i(97911);m.exports=r("Array").lastIndexOf},5736:(m,S,i)=>{i(88119);var r=i(97911);m.exports=r("Array").map},7198:(m,S,i)=>{i(46250);var r=i(97911);m.exports=r("Array").reduce},84302:(m,S,i)=>{i(32836);var r=i(97911);m.exports=r("Array").reverse},86693:(m,S,i)=>{i(72999);var r=i(97911);m.exports=r("Array").slice},24273:(m,S,i)=>{i(50733);var r=i(97911);m.exports=r("Array").some},45974:(m,S,i)=>{i(93639);var r=i(97911);m.exports=r("Array").sort},68012:(m,S,i)=>{i(63117);var r=i(97911);m.exports=r("Array").splice},46332:(m,S,i)=>{i(1285),i(17221);var r=i(97911);m.exports=r("Array").values},42618:(m,S,i)=>{i(34699);var r=i(13544);m.exports=r.Date.now},97724:(m,S,i)=>{i(33379);var r=i(97911);m.exports=r("Function").bind},63791:(m,S,i)=>{i(1285),i(3934);var r=i(34014);m.exports=r},69029:(m,S,i)=>{var r=i(23336),a=i(97724),f=Function.prototype;m.exports=function(c){var e=c.bind;return c===f||r(f,c)&&e===f.bind?a:e}},28924:(m,S,i)=>{var r=i(23336),a=i(77377),f=Array.prototype;m.exports=function(c){var e=c.concat;return c===f||r(f,c)&&e===f.concat?a:e}},98709:(m,S,i)=>{var r=i(23336),a=i(66933),f=Array.prototype;m.exports=function(c){var e=c.every;return c===f||r(f,c)&&e===f.every?a:e}},65991:(m,S,i)=>{var r=i(23336),a=i(9504),f=Array.prototype;m.exports=function(c){var e=c.fill;return c===f||r(f,c)&&e===f.fill?a:e}},64158:(m,S,i)=>{var r=i(23336),a=i(82168),f=Array.prototype;m.exports=function(c){var e=c.filter;return c===f||r(f,c)&&e===f.filter?a:e}},91799:(m,S,i)=>{var r=i(23336),a=i(65618),f=Array.prototype;m.exports=function(c){var e=c.findIndex;return c===f||r(f,c)&&e===f.findIndex?a:e}},26155:(m,S,i)=>{var r=i(23336),a=i(9186),f=Array.prototype;m.exports=function(c){var e=c.find;return c===f||r(f,c)&&e===f.find?a:e}},33758:(m,S,i)=>{var r=i(23336),a=i(58479),f=i(85136),c=Array.prototype,e=String.prototype;m.exports=function(p){var y=p.includes;return p===c||r(c,p)&&y===c.includes?a:"string"==typeof p||p===e||r(e,p)&&y===e.includes?f:y}},7592:(m,S,i)=>{var r=i(23336),a=i(43207),f=Array.prototype;m.exports=function(c){var e=c.indexOf;return c===f||r(f,c)&&e===f.indexOf?a:e}},17480:(m,S,i)=>{var r=i(23336),a=i(63033),f=Array.prototype;m.exports=function(c){var e=c.lastIndexOf;return c===f||r(f,c)&&e===f.lastIndexOf?a:e}},20681:(m,S,i)=>{var r=i(23336),a=i(5736),f=Array.prototype;m.exports=function(c){var e=c.map;return c===f||r(f,c)&&e===f.map?a:e}},90949:(m,S,i)=>{var r=i(23336),a=i(7198),f=Array.prototype;m.exports=function(c){var e=c.reduce;return c===f||r(f,c)&&e===f.reduce?a:e}},99316:(m,S,i)=>{var r=i(23336),a=i(96302),f=String.prototype;m.exports=function(c){var e=c.repeat;return"string"==typeof c||c===f||r(f,c)&&e===f.repeat?a:e}},62212:(m,S,i)=>{var r=i(23336),a=i(84302),f=Array.prototype;m.exports=function(c){var e=c.reverse;return c===f||r(f,c)&&e===f.reverse?a:e}},49073:(m,S,i)=>{var r=i(23336),a=i(86693),f=Array.prototype;m.exports=function(c){var e=c.slice;return c===f||r(f,c)&&e===f.slice?a:e}},24146:(m,S,i)=>{var r=i(23336),a=i(24273),f=Array.prototype;m.exports=function(c){var e=c.some;return c===f||r(f,c)&&e===f.some?a:e}},40104:(m,S,i)=>{var r=i(23336),a=i(45974),f=Array.prototype;m.exports=function(c){var e=c.sort;return c===f||r(f,c)&&e===f.sort?a:e}},3555:(m,S,i)=>{var r=i(23336),a=i(68012),f=Array.prototype;m.exports=function(c){var e=c.splice;return c===f||r(f,c)&&e===f.splice?a:e}},68333:(m,S,i)=>{var r=i(23336),a=i(98720),f=String.prototype;m.exports=function(c){var e=c.startsWith;return"string"==typeof c||c===f||r(f,c)&&e===f.startsWith?a:e}},65786:(m,S,i)=>{var r=i(23336),a=i(75998),f=String.prototype;m.exports=function(c){var e=c.trim;return"string"==typeof c||c===f||r(f,c)&&e===f.trim?a:e}},66306:(m,S,i)=>{i(75071);var r=i(13544),a=i(2543);r.JSON||(r.JSON={stringify:JSON.stringify}),m.exports=function(c,e,p){return a(r.JSON.stringify,null,arguments)}},31845:(m,S,i)=>{i(1285),i(85140),i(17221),i(3934);var r=i(13544);m.exports=r.Map},44168:(m,S,i)=>{i(67234);var r=i(13544);m.exports=r.Object.assign},25852:(m,S,i)=>{i(86516);var a=i(13544).Object;m.exports=function(c,e){return a.create(c,e)}},24457:(m,S,i)=>{i(36255);var a=i(13544).Object,f=m.exports=function(e,p){return a.defineProperties(e,p)};a.defineProperties.sham&&(f.sham=!0)},99671:(m,S,i)=>{i(84468);var a=i(13544).Object,f=m.exports=function(e,p,y){return a.defineProperty(e,p,y)};a.defineProperty.sham&&(f.sham=!0)},38007:(m,S,i)=>{i(86627);var a=i(13544).Object,f=m.exports=function(e,p){return a.getOwnPropertyDescriptor(e,p)};a.getOwnPropertyDescriptor.sham&&(f.sham=!0)},57432:(m,S,i)=>{i(78275);var r=i(13544);m.exports=r.Object.getOwnPropertyDescriptors},36541:(m,S,i)=>{i(56728);var r=i(13544);m.exports=r.Object.getOwnPropertySymbols},17303:(m,S,i)=>{i(31193);var r=i(13544);m.exports=r.Object.getPrototypeOf},62149:(m,S,i)=>{i(56557);var r=i(13544);m.exports=r.Object.keys},86537:(m,S,i)=>{i(17971);var r=i(13544);m.exports=r.Object.setPrototypeOf},79553:(m,S,i)=>{i(88923);var r=i(13544);m.exports=r.Object.values},80092:(m,S,i)=>{i(10901),i(1285),i(17221),i(66793),i(84798),i(98857),i(30185),i(3934);var r=i(13544);m.exports=r.Promise},472:(m,S,i)=>{i(19539);var r=i(13544);m.exports=r.Reflect.construct},4678:(m,S,i)=>{i(60851);var r=i(13544);m.exports=r.Reflect.get},85136:(m,S,i)=>{i(97764);var r=i(97911);m.exports=r("String").includes},96302:(m,S,i)=>{i(3588);var r=i(97911);m.exports=r("String").repeat},98720:(m,S,i)=>{i(24655);var r=i(97911);m.exports=r("String").startsWith},75998:(m,S,i)=>{i(90451);var r=i(97911);m.exports=r("String").trim},61697:(m,S,i)=>{i(1625),i(17221),i(56728),i(16426),i(1172),i(99579),i(41258),i(2383),i(44339),i(64776),i(88215),i(65389),i(12733),i(97977),i(59792),i(60242),i(26291),i(32300),i(63603),i(44864);var r=i(13544);m.exports=r.Symbol},42497:(m,S,i)=>{i(1285),i(17221),i(3934),i(2383);var r=i(89734);m.exports=r.f("iterator")},50681:(m,S,i)=>{i(68154),i(59792);var r=i(89734);m.exports=r.f("toPrimitive")},56286:(m,S,i)=>{m.exports=i(73875)},54153:(m,S,i)=>{m.exports=i(91700)},90755:(m,S,i)=>{m.exports=i(70589)},98235:(m,S,i)=>{m.exports=i(71432)},78096:(m,S,i)=>{m.exports=i(73712)},31236:(m,S,i)=>{m.exports=i(58044)},15819:(m,S,i)=>{m.exports=i(55451)},44948:(m,S,i)=>{m.exports=i(61483)},96471:(m,S,i)=>{m.exports=i(46815)},5228:(m,S,i)=>{m.exports=i(28296)},50182:(m,S,i)=>{m.exports=i(96973)},41171:(m,S,i)=>{m.exports=i(47194)},54585:(m,S,i)=>{m.exports=i(56805)},62005:(m,S,i)=>{m.exports=i(32944)},39964:(m,S,i)=>{m.exports=i(70729)},70326:(m,S,i)=>{m.exports=i(48299)},98162:(m,S,i)=>{m.exports=i(33969)},42346:(m,S,i)=>{m.exports=i(26421)},4204:(m,S,i)=>{m.exports=i(37785)},24329:(m,S,i)=>{m.exports=i(15123)},2793:(m,S,i)=>{m.exports=i(49745)},42700:(m,S,i)=>{m.exports=i(29044)},70269:(m,S,i)=>{m.exports=i(20611)},88819:(m,S,i)=>{m.exports=i(65861)},55912:(m,S,i)=>{m.exports=i(63816)},91185:(m,S,i)=>{m.exports=i(72378)},73875:(m,S,i)=>{var r=i(43987);m.exports=r},91700:(m,S,i)=>{var r=i(99556);m.exports=r},70589:(m,S,i)=>{var r=i(39287);m.exports=r},71432:(m,S,i)=>{var r=i(25272);m.exports=r},73712:(m,S,i)=>{var r=i(54450);m.exports=r},58044:(m,S,i)=>{var r=i(39557);m.exports=r},55451:(m,S,i)=>{var r=i(61611);m.exports=r},61483:(m,S,i)=>{var r=i(22549);m.exports=r},46815:(m,S,i)=>{var r=i(47646);m.exports=r},28296:(m,S,i)=>{var r=i(78663);i(78271),i(60854),i(10509),i(30887),i(54547),i(68996),i(1530),i(60176),i(41554),i(41688),i(92847),i(17316),i(58786),i(35517),i(12783),i(69773),i(22337),i(40199),i(69046),i(84131),m.exports=r},96973:(m,S,i)=>{var r=i(48498);m.exports=r},47194:(m,S,i)=>{var r=i(4922);m.exports=r},56805:(m,S,i)=>{var r=i(95190);m.exports=r},32944:(m,S,i)=>{var r=i(78525);m.exports=r},70729:(m,S,i)=>{var r=i(21064);m.exports=r},48299:(m,S,i)=>{var r=i(65641);m.exports=r},33969:(m,S,i)=>{var r=i(21693);m.exports=r},26421:(m,S,i)=>{var r=i(88907);m.exports=r},37785:(m,S,i)=>{var r=i(41432);m.exports=r},15123:(m,S,i)=>{var r=i(7398);m.exports=r},49745:(m,S,i)=>{var r=i(67221);i(67670),i(61127),i(93114),i(45975),m.exports=r},29044:(m,S,i)=>{var r=i(67447);m.exports=r},20611:(m,S,i)=>{var r=i(58811);m.exports=r},65861:(m,S,i)=>{var r=i(19573);i(55461),i(61652),i(90791),i(87097),i(29559),i(90212),i(71985),i(93770),i(47743),m.exports=r},63816:(m,S,i)=>{var r=i(10226);m.exports=r},72378:(m,S,i)=>{var r=i(56378);m.exports=r},61812:(m,S,i)=>{var r=i(52208),a=i(7378),f=TypeError;m.exports=function(c){if(r(c))return c;throw f(a(c)+" is not a function")}},54356:(m,S,i)=>{var r=i(81177),a=i(7378),f=TypeError;m.exports=function(c){if(r(c))return c;throw f(a(c)+" is not a constructor")}},64902:(m,S,i)=>{var r=i(7378);m.exports=function(a){if("object"==typeof a&&"size"in a&&"has"in a&&"get"in a&&"set"in a&&"delete"in a&&"entries"in a)return a;throw TypeError(r(a)+" is not a map")}},93221:(m,S,i)=>{var r=i(52208),a=String,f=TypeError;m.exports=function(c){if("object"==typeof c||r(c))return c;throw f("Can't set "+a(c)+" as a prototype")}},82196:m=>{m.exports=function(){}},54849:(m,S,i)=>{var r=i(23336),a=TypeError;m.exports=function(f,c){if(r(c,f))return f;throw a("Incorrect invocation")}},64562:(m,S,i)=>{var r=i(77293),a=String,f=TypeError;m.exports=function(c){if(r(c))return c;throw f(a(c)+" is not an object")}},76318:(m,S,i)=>{var r=i(55756);m.exports=r(function(){if("function"==typeof ArrayBuffer){var a=new ArrayBuffer(8);Object.isExtensible(a)&&Object.defineProperty(a,"a",{value:8})}})},35277:(m,S,i)=>{"use strict";var r=i(70267),a=i(19401),f=i(6381);m.exports=function(e){for(var p=r(this),y=f(p),T=arguments.length,C=a(T>1?arguments[1]:void 0,y),R=T>2?arguments[2]:void 0,L=void 0===R?y:a(R,y);L>C;)p[C++]=e;return p}},8366:(m,S,i)=>{"use strict";var r=i(68607).forEach,f=i(33620)("forEach");m.exports=f?[].forEach:function(e){return r(this,e,arguments.length>1?arguments[1]:void 0)}},51923:(m,S,i)=>{"use strict";var r=i(76781),a=i(25401),f=i(70267),c=i(93463),e=i(39918),p=i(81177),y=i(6381),T=i(46751),C=i(88055),R=i(34014),L=Array;m.exports=function(W){var J=f(W),ee=p(this),ce=arguments.length,ie=ce>1?arguments[1]:void 0,U=void 0!==ie;U&&(ie=r(ie,ce>2?arguments[2]:void 0));var ae,he,be,we,ue,st,se=R(J),ge=0;if(!se||this===L&&e(se))for(ae=y(J),he=ee?new this(ae):L(ae);ae>ge;ge++)st=U?ie(J[ge],ge):J[ge],T(he,ge,st);else for(ue=(we=C(J,se)).next,he=ee?new this:[];!(be=a(ue,we)).done;ge++)st=U?c(we,ie,[be.value,ge],!0):be.value,T(he,ge,st);return he.length=ge,he}},95171:(m,S,i)=>{var r=i(81010),a=i(19401),f=i(6381),c=function(e){return function(p,y,T){var z,C=r(p),R=f(C),L=a(T,R);if(e&&y!=y){for(;R>L;)if((z=C[L++])!=z)return!0}else for(;R>L;L++)if((e||L in C)&&C[L]===y)return e||L||0;return!e&&-1}};m.exports={includes:c(!0),indexOf:c(!1)}},68607:(m,S,i)=>{var r=i(76781),a=i(23634),f=i(20973),c=i(70267),e=i(6381),p=i(2103),y=a([].push),T=function(C){var R=1==C,L=2==C,z=3==C,W=4==C,J=6==C,ee=7==C,ce=5==C||J;return function(ie,U,se,ge){for(var Ve,Be,ae=c(ie),he=f(ae),be=r(U,se),we=e(he),ue=0,st=ge||p,We=R?st(ie,we):L||ee?st(ie,0):void 0;we>ue;ue++)if((ce||ue in he)&&(Be=be(Ve=he[ue],ue,ae),C))if(R)We[ue]=Be;else if(Be)switch(C){case 3:return!0;case 5:return Ve;case 6:return ue;case 2:y(We,Ve)}else switch(C){case 4:return!1;case 7:y(We,Ve)}return J?-1:z||W?W:We}};m.exports={forEach:T(0),map:T(1),filter:T(2),some:T(3),every:T(4),find:T(5),findIndex:T(6),filterReject:T(7)}},78375:(m,S,i)=>{"use strict";var r=i(2543),a=i(81010),f=i(33912),c=i(6381),e=i(33620),p=Math.min,y=[].lastIndexOf,T=!!y&&1/[1].lastIndexOf(1,-0)<0,C=e("lastIndexOf");m.exports=T||!C?function(z){if(T)return r(y,this,arguments)||0;var W=a(this),J=c(W),ee=J-1;for(arguments.length>1&&(ee=p(ee,f(arguments[1]))),ee<0&&(ee=J+ee);ee>=0;ee--)if(ee in W&&W[ee]===z)return ee||0;return-1}:y},95913:(m,S,i)=>{var r=i(55756),a=i(91840),f=i(63556),c=a("species");m.exports=function(e){return f>=51||!r(function(){var p=[];return(p.constructor={})[c]=function(){return{foo:1}},1!==p[e](Boolean).foo})}},33620:(m,S,i)=>{"use strict";var r=i(55756);m.exports=function(a,f){var c=[][a];return!!c&&r(function(){c.call(null,f||function(){return 1},1)})}},88908:(m,S,i)=>{var r=i(61812),a=i(70267),f=i(20973),c=i(6381),e=TypeError,p=function(y){return function(T,C,R,L){r(C);var z=a(T),W=f(z),J=c(z),ee=y?J-1:0,ce=y?-1:1;if(R<2)for(;;){if(ee in W){L=W[ee],ee+=ce;break}if(ee+=ce,y?ee<0:J<=ee)throw e("Reduce of empty array with no initial value")}for(;y?ee>=0:J>ee;ee+=ce)ee in W&&(L=C(L,W[ee],ee,z));return L}};m.exports={left:p(!1),right:p(!0)}},54716:(m,S,i)=>{"use strict";var r=i(49642),a=i(89735),f=TypeError,c=Object.getOwnPropertyDescriptor,e=r&&!function(){if(void 0!==this)return!0;try{Object.defineProperty([],"length",{writable:!1}).length=1}catch(p){return p instanceof TypeError}}();m.exports=e?function(p,y){if(a(p)&&!c(p,"length").writable)throw f("Cannot set read only .length");return p.length=y}:function(p,y){return p.length=y}},8681:(m,S,i)=>{var r=i(19401),a=i(6381),f=i(46751),c=Array,e=Math.max;m.exports=function(p,y,T){for(var C=a(p),R=r(y,C),L=r(void 0===T?C:T,C),z=c(e(L-R,0)),W=0;R<L;R++,W++)f(z,W,p[R]);return z.length=W,z}},37591:(m,S,i)=>{var r=i(23634);m.exports=r([].slice)},84865:(m,S,i)=>{var r=i(8681),a=Math.floor,f=function(p,y){var T=p.length,C=a(T/2);return T<8?c(p,y):e(p,f(r(p,0,C),y),f(r(p,C),y),y)},c=function(p,y){for(var R,L,T=p.length,C=1;C<T;){for(L=C,R=p[C];L&&y(p[L-1],R)>0;)p[L]=p[--L];L!==C++&&(p[L]=R)}return p},e=function(p,y,T,C){for(var R=y.length,L=T.length,z=0,W=0;z<R||W<L;)p[z+W]=z<R&&W<L?C(y[z],T[W])<=0?y[z++]:T[W++]:z<R?y[z++]:T[W++];return p};m.exports=f},48045:(m,S,i)=>{var r=i(89735),a=i(81177),f=i(77293),e=i(91840)("species"),p=Array;m.exports=function(y){var T;return r(y)&&(a(T=y.constructor)&&(T===p||r(T.prototype))||f(T)&&null===(T=T[e]))&&(T=void 0),void 0===T?p:T}},2103:(m,S,i)=>{var r=i(48045);m.exports=function(a,f){return new(r(a))(0===f?0:f)}},93463:(m,S,i)=>{var r=i(64562),a=i(40798);m.exports=function(f,c,e,p){try{return p?c(r(e)[0],e[1]):c(e)}catch(y){a(f,"throw",y)}}},49458:m=>{m.exports=function(S,i){return 1==i?function(r,a){return r[S](a)}:function(r,a,f){return r[S](a,f)}}},5253:(m,S,i)=>{var a=i(91840)("iterator"),f=!1;try{var c=0,e={next:function(){return{done:!!c++}},return:function(){f=!0}};e[a]=function(){return this},Array.from(e,function(){throw 2})}catch(p){}m.exports=function(p,y){if(!y&&!f)return!1;var T=!1;try{var C={};C[a]=function(){return{next:function(){return{done:T=!0}}}},p(C)}catch(R){}return T}},49806:(m,S,i)=>{var r=i(23634),a=r({}.toString),f=r("".slice);m.exports=function(c){return f(a(c),8,-1)}},35329:(m,S,i)=>{var r=i(5552),a=i(52208),f=i(49806),e=i(91840)("toStringTag"),p=Object,y="Arguments"==f(function(){return arguments}());m.exports=r?f:function(C){var R,L,z;return void 0===C?"Undefined":null===C?"Null":"string"==typeof(L=function(C,R){try{return C[R]}catch(L){}}(R=p(C),e))?L:y?f(R):"Object"==(z=f(R))&&a(R.callee)?"Arguments":z}},83483:(m,S,i)=>{"use strict";var r=i(76781),a=i(25401),f=i(61812),c=i(54356),e=i(43550),p=i(41605),y=[].push;m.exports=function(C){var z,W,J,ee,R=arguments.length,L=R>1?arguments[1]:void 0;return c(this),(z=void 0!==L)&&f(L),e(C)?new this:(W=[],z?(J=0,ee=r(L,R>2?arguments[2]:void 0),p(C,function(ce){a(y,W,ee(ce,J++))})):p(C,y,{that:W}),new this(W))}},13067:(m,S,i)=>{"use strict";var r=i(37591);m.exports=function(){return new this(r(arguments))}},26650:(m,S,i)=>{"use strict";var r=i(83272),a=i(1707),f=i(84604),c=i(76781),e=i(54849),p=i(43550),y=i(41605),T=i(79077),C=i(28738),R=i(58014),L=i(49642),z=i(57867).fastKey,W=i(91093),J=W.set,ee=W.getterFor;m.exports={getConstructor:function(ce,ie,U,se){var ge=ce(function(ue,st){e(ue,ae),J(ue,{type:ie,index:r(null),first:void 0,last:void 0,size:0}),L||(ue.size=0),p(st)||y(st,ue[se],{that:ue,AS_ENTRIES:U})}),ae=ge.prototype,he=ee(ie),be=function(ue,st,We){var xe,je,Ve=he(ue),Be=we(ue,st);return Be?Be.value=We:(Ve.last=Be={index:je=z(st,!0),key:st,value:We,previous:xe=Ve.last,next:void 0,removed:!1},Ve.first||(Ve.first=Be),xe&&(xe.next=Be),L?Ve.size++:ue.size++,"F"!==je&&(Ve.index[je]=Be)),ue},we=function(ue,st){var Be,We=he(ue),Ve=z(st);if("F"!==Ve)return We.index[Ve];for(Be=We.first;Be;Be=Be.next)if(Be.key==st)return Be};return f(ae,{clear:function(){for(var We=he(this),Ve=We.index,Be=We.first;Be;)Be.removed=!0,Be.previous&&(Be.previous=Be.previous.next=void 0),delete Ve[Be.index],Be=Be.next;We.first=We.last=void 0,L?We.size=0:this.size=0},delete:function(ue){var We=he(this),Ve=we(this,ue);if(Ve){var Be=Ve.next,xe=Ve.previous;delete We.index[Ve.index],Ve.removed=!0,xe&&(xe.next=Be),Be&&(Be.previous=xe),We.first==Ve&&(We.first=Be),We.last==Ve&&(We.last=xe),L?We.size--:this.size--}return!!Ve},forEach:function(st){for(var Be,We=he(this),Ve=c(st,arguments.length>1?arguments[1]:void 0);Be=Be?Be.next:We.first;)for(Ve(Be.value,Be.key,this);Be&&Be.removed;)Be=Be.previous},has:function(st){return!!we(this,st)}}),f(ae,U?{get:function(st){var We=we(this,st);return We&&We.value},set:function(st,We){return be(this,0===st?0:st,We)}}:{add:function(st){return be(this,st=0===st?0:st,st)}}),L&&a(ae,"size",{configurable:!0,get:function(){return he(this).size}}),ge},setStrong:function(ce,ie,U){var se=ie+" Iterator",ge=ee(ie),ae=ee(se);T(ce,ie,function(he,be){J(this,{type:se,target:he,state:ge(he),kind:be,last:void 0})},function(){for(var he=ae(this),be=he.kind,we=he.last;we&&we.removed;)we=we.previous;return he.target&&(he.last=we=we?we.next:he.state.first)?C("keys"==be?we.key:"values"==be?we.value:[we.key,we.value],!1):(he.target=void 0,C(void 0,!0))},U?"entries":"values",!U,!0),R(ie)}}},85116:(m,S,i)=>{"use strict";var r=i(90513),a=i(70009),f=i(57867),c=i(55756),e=i(65162),p=i(41605),y=i(54849),T=i(52208),C=i(77293),R=i(85681),L=i(48011).f,z=i(68607).forEach,W=i(49642),J=i(91093),ee=J.set,ce=J.getterFor;m.exports=function(ie,U,se){var st,ge=-1!==ie.indexOf("Map"),ae=-1!==ie.indexOf("Weak"),he=ge?"set":"add",be=a[ie],we=be&&be.prototype,ue={};if(W&&T(be)&&(ae||we.forEach&&!c(function(){(new be).entries().next()}))){var We=(st=U(function(Be,xe){ee(y(Be,We),{type:ie,collection:new be}),null!=xe&&p(xe,Be[he],{that:Be,AS_ENTRIES:ge})})).prototype,Ve=ce(ie);z(["add","clear","delete","forEach","get","has","set","keys","values","entries"],function(Be){var xe="add"==Be||"set"==Be;Be in we&&(!ae||"clear"!=Be)&&e(We,Be,function(je,Ne){var Bt=Ve(this).collection;if(!xe&&ae&&!C(je))return"get"==Be&&void 0;var rt=Bt[Be](0===je?0:je,Ne);return xe?this:rt})}),ae||L(We,"size",{configurable:!0,get:function(){return Ve(this).collection.size}})}else st=se.getConstructor(U,ie,ge,he),f.enable();return R(st,ie,!1,!0),ue[ie]=st,r({global:!0,forced:!0},ue),ae||se.setStrong(st,ie,ge),st}},65031:(m,S,i)=>{var r=i(80112),a=i(59823),f=i(25525),c=i(48011);m.exports=function(e,p,y){for(var T=a(p),C=c.f,R=f.f,L=0;L<T.length;L++){var z=T[L];!r(e,z)&&(!y||!r(y,z))&&C(e,z,R(p,z))}}},79668:(m,S,i)=>{var a=i(91840)("match");m.exports=function(f){var c=/./;try{"/./"[f](c)}catch(e){try{return c[a]=!1,"/./"[f](c)}catch(p){}}return!1}},37112:(m,S,i)=>{var r=i(55756);m.exports=!r(function(){function a(){}return a.prototype.constructor=null,Object.getPrototypeOf(new a)!==a.prototype})},28738:m=>{m.exports=function(S,i){return{value:S,done:i}}},65162:(m,S,i)=>{var r=i(49642),a=i(48011),f=i(51361);m.exports=r?function(c,e,p){return a.f(c,e,f(1,p))}:function(c,e,p){return c[e]=p,c}},51361:m=>{m.exports=function(S,i){return{enumerable:!(1&S),configurable:!(2&S),writable:!(4&S),value:i}}},46751:(m,S,i)=>{"use strict";var r=i(62939),a=i(48011),f=i(51361);m.exports=function(c,e,p){var y=r(e);y in c?a.f(c,y,f(0,p)):c[y]=p}},1707:(m,S,i)=>{var r=i(48011);m.exports=function(a,f,c){return r.f(a,f,c)}},42915:(m,S,i)=>{var r=i(65162);m.exports=function(a,f,c,e){return e&&e.enumerable?a[f]=c:r(a,f,c),a}},84604:(m,S,i)=>{var r=i(42915);m.exports=function(a,f,c){for(var e in f)c&&c.unsafe&&a[e]?a[e]=f[e]:r(a,e,f[e],c);return a}},34056:(m,S,i)=>{var r=i(70009),a=Object.defineProperty;m.exports=function(f,c){try{a(r,f,{value:c,configurable:!0,writable:!0})}catch(e){r[f]=c}return c}},67236:(m,S,i)=>{"use strict";var r=i(7378),a=TypeError;m.exports=function(f,c){if(!delete f[c])throw a("Cannot delete property "+r(c)+" of "+r(f))}},49642:(m,S,i)=>{var r=i(55756);m.exports=!r(function(){return 7!=Object.defineProperty({},1,{get:function(){return 7}})[1]})},59478:m=>{var S="object"==typeof document&&document.all;m.exports={all:S,IS_HTMLDDA:void 0===S&&void 0!==S}},96682:(m,S,i)=>{var r=i(70009),a=i(77293),f=r.document,c=a(f)&&a(f.createElement);m.exports=function(e){return c?f.createElement(e):{}}},11594:m=>{var S=TypeError;m.exports=function(r){if(r>9007199254740991)throw S("Maximum allowed index exceeded");return r}},44125:m=>{m.exports={CSSRuleList:0,CSSStyleDeclaration:0,CSSValueList:0,ClientRectList:0,DOMRectList:0,DOMStringList:0,DOMTokenList:1,DataTransferItemList:0,FileList:0,HTMLAllCollection:0,HTMLCollection:0,HTMLFormElement:0,HTMLSelectElement:0,MediaList:0,MimeTypeArray:0,NamedNodeMap:0,NodeList:1,PaintRequestList:0,Plugin:0,PluginArray:0,SVGLengthList:0,SVGNumberList:0,SVGPathSegList:0,SVGPointList:0,SVGStringList:0,SVGTransformList:0,SourceBufferList:0,StyleSheetList:0,TextTrackCueList:0,TextTrackList:0,TouchList:0}},36410:(m,S,i)=>{var a=i(86053).match(/firefox\/(\d+)/i);m.exports=!!a&&+a[1]},34008:(m,S,i)=>{var r=i(31813),a=i(3787);m.exports=!r&&!a&&"object"==typeof window&&"object"==typeof document},70902:m=>{m.exports="function"==typeof Bun&&Bun&&"string"==typeof Bun.version},31813:m=>{m.exports="object"==typeof Deno&&Deno&&"object"==typeof Deno.version},5329:(m,S,i)=>{var r=i(86053);m.exports=/MSIE|Trident/.test(r)},16137:(m,S,i)=>{var r=i(86053);m.exports=/ipad|iphone|ipod/i.test(r)&&"undefined"!=typeof Pebble},3877:(m,S,i)=>{var r=i(86053);m.exports=/(?:ipad|iphone|ipod).*applewebkit/i.test(r)},3787:(m,S,i)=>{var r=i(49806);m.exports="undefined"!=typeof process&&"process"==r(process)},85308:(m,S,i)=>{var r=i(86053);m.exports=/web0s(?!.*chrome)/i.test(r)},86053:m=>{m.exports="undefined"!=typeof navigator&&String(navigator.userAgent)||""},63556:(m,S,i)=>{var y,T,r=i(70009),a=i(86053),f=r.process,c=r.Deno,e=f&&f.versions||c&&c.version,p=e&&e.v8;p&&(T=(y=p.split("."))[0]>0&&y[0]<4?1:+(y[0]+y[1])),!T&&a&&(!(y=a.match(/Edge\/(\d+)/))||y[1]>=74)&&(y=a.match(/Chrome\/(\d+)/))&&(T=+y[1]),m.exports=T},34545:(m,S,i)=>{var a=i(86053).match(/AppleWebKit\/(\d+)\./);m.exports=!!a&&+a[1]},97911:(m,S,i)=>{var r=i(13544);m.exports=function(a){return r[a+"Prototype"]}},44939:m=>{m.exports=["constructor","hasOwnProperty","isPrototypeOf","propertyIsEnumerable","toLocaleString","toString","valueOf"]},40039:(m,S,i)=>{var r=i(23634),a=Error,f=r("".replace),c=String(a("zxcasd").stack),e=/\n\s*at [^:]*:[^\n]*/,p=e.test(c);m.exports=function(y,T){if(p&&"string"==typeof y&&!a.prepareStackTrace)for(;T--;)y=f(y,e,"");return y}},77732:(m,S,i)=>{var r=i(65162),a=i(40039),f=i(50499),c=Error.captureStackTrace;m.exports=function(e,p,y,T){f&&(c?c(e,p):r(e,"stack",a(y,T)))}},50499:(m,S,i)=>{var r=i(55756),a=i(51361);m.exports=!r(function(){var f=Error("a");return!("stack"in f)||(Object.defineProperty(f,"stack",a(1,7)),7!==f.stack)})},90513:(m,S,i)=>{"use strict";var r=i(70009),a=i(2543),f=i(64350),c=i(52208),e=i(25525).f,p=i(79482),y=i(13544),T=i(76781),C=i(65162),R=i(80112),L=function(z){var W=function(J,ee,ce){if(this instanceof W){switch(arguments.length){case 0:return new z;case 1:return new z(J);case 2:return new z(J,ee)}return new z(J,ee,ce)}return a(z,this,arguments)};return W.prototype=z.prototype,W};m.exports=function(z,W){var ae,he,be,we,ue,st,We,Ve,Be,J=z.target,ee=z.global,ce=z.stat,ie=z.proto,U=ee?r:ce?r[J]:(r[J]||{}).prototype,se=ee?y:y[J]||C(y,J,{})[J],ge=se.prototype;for(we in W)he=!(ae=p(ee?we:J+(ce?".":"#")+we,z.forced))&&U&&R(U,we),st=se[we],he&&(We=z.dontCallGetSet?(Be=e(U,we))&&Be.value:U[we]),ue=he&&We?We:W[we],(!he||typeof st!=typeof ue)&&(Ve=z.bind&&he?T(ue,r):z.wrap&&he?L(ue):ie&&c(ue)?f(ue):ue,(z.sham||ue&&ue.sham||st&&st.sham)&&C(Ve,"sham",!0),C(se,we,Ve),ie&&(R(y,be=J+"Prototype")||C(y,be,{}),C(y[be],we,ue),z.real&&ge&&(ae||!ge[we])&&C(ge,we,ue)))}},55756:m=>{m.exports=function(S){try{return!!S()}catch(i){return!0}}},3124:(m,S,i)=>{var r=i(55756);m.exports=!r(function(){return Object.isExtensible(Object.preventExtensions({}))})},2543:(m,S,i)=>{var r=i(29046),a=Function.prototype,f=a.apply,c=a.call;m.exports="object"==typeof Reflect&&Reflect.apply||(r?c.bind(f):function(){return c.apply(f,arguments)})},76781:(m,S,i)=>{var r=i(64350),a=i(61812),f=i(29046),c=r(r.bind);m.exports=function(e,p){return a(e),void 0===p?e:f?c(e,p):function(){return e.apply(p,arguments)}}},29046:(m,S,i)=>{var r=i(55756);m.exports=!r(function(){var a=function(){}.bind();return"function"!=typeof a||a.hasOwnProperty("prototype")})},44197:(m,S,i)=>{"use strict";var r=i(23634),a=i(61812),f=i(77293),c=i(80112),e=i(37591),p=i(29046),y=Function,T=r([].concat),C=r([].join),R={},L=function(z,W,J){if(!c(R,W)){for(var ee=[],ce=0;ce<W;ce++)ee[ce]="a["+ce+"]";R[W]=y("C,a","return new C("+C(ee,",")+")")}return R[W](z,J)};m.exports=p?y.bind:function(W){var J=a(this),ee=J.prototype,ce=e(arguments,1),ie=function(){var se=T(ce,e(arguments));return this instanceof ie?L(J,se.length,se):J.apply(W,se)};return f(ee)&&(ie.prototype=ee),ie}},25401:(m,S,i)=>{var r=i(29046),a=Function.prototype.call;m.exports=r?a.bind(a):function(){return a.apply(a,arguments)}},29862:(m,S,i)=>{var r=i(49642),a=i(80112),f=Function.prototype,c=r&&Object.getOwnPropertyDescriptor,e=a(f,"name"),p=e&&"something"===function(){}.name,y=e&&(!r||r&&c(f,"name").configurable);m.exports={EXISTS:e,PROPER:p,CONFIGURABLE:y}},13325:(m,S,i)=>{var r=i(23634),a=i(61812);m.exports=function(f,c,e){try{return r(a(Object.getOwnPropertyDescriptor(f,c)[e]))}catch(p){}}},64350:(m,S,i)=>{var r=i(49806),a=i(23634);m.exports=function(f){if("Function"===r(f))return a(f)}},23634:(m,S,i)=>{var r=i(29046),a=Function.prototype,f=a.call,c=r&&a.bind.bind(f,f);m.exports=r?c:function(e){return function(){return f.apply(e,arguments)}}},7365:(m,S,i)=>{var r=i(13544),a=i(70009),f=i(52208),c=function(e){return f(e)?e:void 0};m.exports=function(e,p){return arguments.length<2?c(r[e])||c(a[e]):r[e]&&r[e][p]||a[e]&&a[e][p]}},34014:(m,S,i)=>{var r=i(35329),a=i(34778),f=i(43550),c=i(84394),p=i(91840)("iterator");m.exports=function(y){if(!f(y))return a(y,p)||a(y,"@@iterator")||c[r(y)]}},88055:(m,S,i)=>{var r=i(25401),a=i(61812),f=i(64562),c=i(7378),e=i(34014),p=TypeError;m.exports=function(y,T){var C=arguments.length<2?e(y):T;if(a(C))return f(r(C,y));throw p(c(y)+" is not iterable")}},32092:(m,S,i)=>{var r=i(23634),a=i(89735),f=i(52208),c=i(49806),e=i(41433),p=r([].push);m.exports=function(y){if(f(y))return y;if(a(y)){for(var T=y.length,C=[],R=0;R<T;R++){var L=y[R];"string"==typeof L?p(C,L):("number"==typeof L||"Number"==c(L)||"String"==c(L))&&p(C,e(L))}var z=C.length,W=!0;return function(J,ee){if(W)return W=!1,ee;if(a(this))return ee;for(var ce=0;ce<z;ce++)if(C[ce]===J)return ee}}}},34778:(m,S,i)=>{var r=i(61812),a=i(43550);m.exports=function(f,c){var e=f[c];return a(e)?void 0:r(e)}},70009:m=>{var S=function(i){return i&&i.Math==Math&&i};m.exports=S("object"==typeof globalThis&&globalThis)||S("object"==typeof window&&window)||S("object"==typeof self&&self)||S("object"==typeof global&&global)||function(){return this}()||Function("return this")()},80112:(m,S,i)=>{var r=i(23634),a=i(70267),f=r({}.hasOwnProperty);m.exports=Object.hasOwn||function(e,p){return f(a(e),p)}},45599:m=>{m.exports={}},52912:m=>{m.exports=function(S,i){try{1==arguments.length?console.error(S):console.error(S,i)}catch(r){}}},55690:(m,S,i)=>{var r=i(7365);m.exports=r("document","documentElement")},50495:(m,S,i)=>{var r=i(49642),a=i(55756),f=i(96682);m.exports=!r&&!a(function(){return 7!=Object.defineProperty(f("div"),"a",{get:function(){return 7}}).a})},20973:(m,S,i)=>{var r=i(23634),a=i(55756),f=i(49806),c=Object,e=r("".split);m.exports=a(function(){return!c("z").propertyIsEnumerable(0)})?function(p){return"String"==f(p)?e(p,""):c(p)}:c},26699:(m,S,i)=>{var r=i(23634),a=i(52208),f=i(24766),c=r(Function.toString);a(f.inspectSource)||(f.inspectSource=function(e){return c(e)}),m.exports=f.inspectSource},33411:(m,S,i)=>{var r=i(77293),a=i(65162);m.exports=function(f,c){r(c)&&"cause"in c&&a(f,"cause",c.cause)}},57867:(m,S,i)=>{var r=i(90513),a=i(23634),f=i(45599),c=i(77293),e=i(80112),p=i(48011).f,y=i(51518),T=i(62469),C=i(46401),R=i(13708),L=i(3124),z=!1,W=R("meta"),J=0,ee=function(ae){p(ae,W,{value:{objectID:"O"+J++,weakData:{}}})},ge=m.exports={enable:function(){ge.enable=function(){},z=!0;var ae=y.f,he=a([].splice),be={};be[W]=1,ae(be).length&&(y.f=function(we){for(var ue=ae(we),st=0,We=ue.length;st<We;st++)if(ue[st]===W){he(ue,st,1);break}return ue},r({target:"Object",stat:!0,forced:!0},{getOwnPropertyNames:T.f}))},fastKey:function(ae,he){if(!c(ae))return"symbol"==typeof ae?ae:("string"==typeof ae?"S":"P")+ae;if(!e(ae,W)){if(!C(ae))return"F";if(!he)return"E";ee(ae)}return ae[W].objectID},getWeakData:function(ae,he){if(!e(ae,W)){if(!C(ae))return!0;if(!he)return!1;ee(ae)}return ae[W].weakData},onFreeze:function(ae){return L&&z&&C(ae)&&!e(ae,W)&&ee(ae),ae}};f[W]=!0},91093:(m,S,i)=>{var z,W,J,r=i(81101),a=i(70009),f=i(77293),c=i(65162),e=i(80112),p=i(24766),y=i(86066),T=i(45599),C="Object already initialized",R=a.TypeError;if(r||p.state){var ie=p.state||(p.state=new(0,a.WeakMap));ie.get=ie.get,ie.has=ie.has,ie.set=ie.set,z=function(se,ge){if(ie.has(se))throw R(C);return ge.facade=se,ie.set(se,ge),ge},W=function(se){return ie.get(se)||{}},J=function(se){return ie.has(se)}}else{var U=y("state");T[U]=!0,z=function(se,ge){if(e(se,U))throw R(C);return ge.facade=se,c(se,U,ge),ge},W=function(se){return e(se,U)?se[U]:{}},J=function(se){return e(se,U)}}m.exports={set:z,get:W,has:J,enforce:function(se){return J(se)?W(se):z(se,{})},getterFor:function(se){return function(ge){var ae;if(!f(ge)||(ae=W(ge)).type!==se)throw R("Incompatible receiver, "+se+" required");return ae}}}},39918:(m,S,i)=>{var r=i(91840),a=i(84394),f=r("iterator"),c=Array.prototype;m.exports=function(e){return void 0!==e&&(a.Array===e||c[f]===e)}},89735:(m,S,i)=>{var r=i(49806);m.exports=Array.isArray||function(f){return"Array"==r(f)}},52208:(m,S,i)=>{var r=i(59478),a=r.all;m.exports=r.IS_HTMLDDA?function(f){return"function"==typeof f||f===a}:function(f){return"function"==typeof f}},81177:(m,S,i)=>{var r=i(23634),a=i(55756),f=i(52208),c=i(35329),e=i(7365),p=i(26699),y=function(){},T=[],C=e("Reflect","construct"),R=/^\s*(?:class|function)\b/,L=r(R.exec),z=!R.exec(y),W=function(ce){if(!f(ce))return!1;try{return C(y,T,ce),!0}catch(ie){return!1}},J=function(ce){if(!f(ce))return!1;switch(c(ce)){case"AsyncFunction":case"GeneratorFunction":case"AsyncGeneratorFunction":return!1}try{return z||!!L(R,p(ce))}catch(ie){return!0}};J.sham=!0,m.exports=!C||a(function(){var ee;return W(W.call)||!W(Object)||!W(function(){ee=!0})||ee})?J:W},27029:(m,S,i)=>{var r=i(80112);m.exports=function(a){return void 0!==a&&(r(a,"value")||r(a,"writable"))}},79482:(m,S,i)=>{var r=i(55756),a=i(52208),f=/#|\.prototype\./,c=function(C,R){var L=p[e(C)];return L==T||L!=y&&(a(R)?r(R):!!R)},e=c.normalize=function(C){return String(C).replace(f,".").toLowerCase()},p=c.data={},y=c.NATIVE="N",T=c.POLYFILL="P";m.exports=c},43550:m=>{m.exports=function(S){return null==S}},77293:(m,S,i)=>{var r=i(52208),a=i(59478),f=a.all;m.exports=a.IS_HTMLDDA?function(c){return"object"==typeof c?null!==c:r(c)||c===f}:function(c){return"object"==typeof c?null!==c:r(c)}},81124:m=>{m.exports=!0},60373:(m,S,i)=>{var r=i(77293),a=i(49806),c=i(91840)("match");m.exports=function(e){var p;return r(e)&&(void 0!==(p=e[c])?!!p:"RegExp"==a(e))}},74717:(m,S,i)=>{var r=i(7365),a=i(52208),f=i(23336),c=i(99554),e=Object;m.exports=c?function(p){return"symbol"==typeof p}:function(p){var y=r("Symbol");return a(y)&&f(y.prototype,e(p))}},87463:(m,S,i)=>{var r=i(25401);m.exports=function(a,f,c){for(var p,y,e=c||a.next;!(p=r(e,a)).done;)if(void 0!==(y=f(p.value)))return y}},41605:(m,S,i)=>{var r=i(76781),a=i(25401),f=i(64562),c=i(7378),e=i(39918),p=i(6381),y=i(23336),T=i(88055),C=i(34014),R=i(40798),L=TypeError,z=function(J,ee){this.stopped=J,this.result=ee},W=z.prototype;m.exports=function(J,ee,ce){var be,we,ue,st,We,Ve,Be,U=!(!ce||!ce.AS_ENTRIES),se=!(!ce||!ce.IS_RECORD),ge=!(!ce||!ce.IS_ITERATOR),ae=!(!ce||!ce.INTERRUPTED),he=r(ee,ce&&ce.that),xe=function(Ne){return be&&R(be,"normal",Ne),new z(!0,Ne)},je=function(Ne){return U?(f(Ne),ae?he(Ne[0],Ne[1],xe):he(Ne[0],Ne[1])):ae?he(Ne,xe):he(Ne)};if(se)be=J.iterator;else if(ge)be=J;else{if(!(we=C(J)))throw L(c(J)+" is not iterable");if(e(we)){for(ue=0,st=p(J);st>ue;ue++)if((We=je(J[ue]))&&y(W,We))return We;return new z(!1)}be=T(J,we)}for(Ve=se?J.next:be.next;!(Be=a(Ve,be)).done;){try{We=je(Be.value)}catch(Ne){R(be,"throw",Ne)}if("object"==typeof We&&We&&y(W,We))return We}return new z(!1)}},40798:(m,S,i)=>{var r=i(25401),a=i(64562),f=i(34778);m.exports=function(c,e,p){var y,T;a(c);try{if(!(y=f(c,"return"))){if("throw"===e)throw p;return p}y=r(y,c)}catch(C){T=!0,y=C}if("throw"===e)throw p;if(T)throw y;return a(y),p}},14554:(m,S,i)=>{"use strict";var r=i(38432).IteratorPrototype,a=i(83272),f=i(51361),c=i(85681),e=i(84394),p=function(){return this};m.exports=function(y,T,C,R){var L=T+" Iterator";return y.prototype=a(r,{next:f(+!R,C)}),c(y,L,!1,!0),e[L]=p,y}},79077:(m,S,i)=>{"use strict";var r=i(90513),a=i(25401),f=i(81124),c=i(29862),e=i(52208),p=i(14554),y=i(31426),T=i(54945),C=i(85681),R=i(65162),L=i(42915),z=i(91840),W=i(84394),J=i(38432),ee=c.PROPER,ce=c.CONFIGURABLE,ie=J.IteratorPrototype,U=J.BUGGY_SAFARI_ITERATORS,se=z("iterator"),ae="values",he="entries",be=function(){return this};m.exports=function(we,ue,st,We,Ve,Be,xe){p(st,ue,We);var hn,vn,mt,je=function(Nt){if(Nt===Ve&&Pt)return Pt;if(!U&&Nt in rt)return rt[Nt];switch(Nt){case"keys":case ae:case he:return function(){return new st(this,Nt)}}return function(){return new st(this)}},Ne=ue+" Iterator",Bt=!1,rt=we.prototype,en=rt[se]||rt["@@iterator"]||Ve&&rt[Ve],Pt=!U&&en||je(Ve),Vt="Array"==ue&&rt.entries||en;if(Vt&&(hn=y(Vt.call(new we)))!==Object.prototype&&hn.next&&(!f&&y(hn)!==ie&&(T?T(hn,ie):e(hn[se])||L(hn,se,be)),C(hn,Ne,!0,!0),f&&(W[Ne]=be)),ee&&Ve==ae&&en&&en.name!==ae&&(!f&&ce?R(rt,"name",ae):(Bt=!0,Pt=function(){return a(en,this)})),Ve)if(vn={values:je(ae),keys:Be?Pt:je("keys"),entries:je(he)},xe)for(mt in vn)(U||Bt||!(mt in rt))&&L(rt,mt,vn[mt]);else r({target:ue,proto:!0,forced:U||Bt},vn);return(!f||xe)&&rt[se]!==Pt&&L(rt,se,Pt,{name:Ve}),W[ue]=Pt,vn}},38432:(m,S,i)=>{"use strict";var L,z,W,r=i(55756),a=i(52208),f=i(77293),c=i(83272),e=i(31426),p=i(42915),y=i(91840),T=i(81124),C=y("iterator"),R=!1;[].keys&&("next"in(W=[].keys())?(z=e(e(W)))!==Object.prototype&&(L=z):R=!0),!f(L)||r(function(){var ee={};return L[C].call(ee)!==ee})?L={}:T&&(L=c(L)),a(L[C])||p(L,C,function(){return this}),m.exports={IteratorPrototype:L,BUGGY_SAFARI_ITERATORS:R}},84394:m=>{m.exports={}},6381:(m,S,i)=>{var r=i(48869);m.exports=function(a){return r(a.length)}},60077:(m,S,i)=>{var r=i(7365),a=i(49458),f=r("Map");m.exports={Map:f,set:a("set",2),get:a("get",1),has:a("has",1),remove:a("delete",1),proto:f.prototype}},21515:(m,S,i)=>{var r=i(87463);m.exports=function(a,f,c){return c?r(a.entries(),function(e){return f(e[1],e[0])}):a.forEach(f)}},57729:(m,S,i)=>{"use strict";var r=i(25401),a=i(61812),f=i(52208),c=i(64562),e=TypeError;m.exports=function(y,T){var J,C=c(this),R=a(C.get),L=a(C.has),z=a(C.set),W=arguments.length>2?arguments[2]:void 0;if(!f(T)&&!f(W))throw e("At least one callback required");return r(L,C,y)?(J=r(R,C,y),f(T)&&(J=T(J),r(z,C,y,J))):f(W)&&(J=W(),r(z,C,y,J)),J}},8651:m=>{var S=Math.ceil,i=Math.floor;m.exports=Math.trunc||function(a){var f=+a;return(f>0?i:S)(f)}},58991:(m,S,i)=>{var ce,ie,U,se,ge,r=i(70009),a=i(76781),f=i(25525).f,c=i(37352).set,e=i(70918),p=i(3877),y=i(16137),T=i(85308),C=i(3787),R=r.MutationObserver||r.WebKitMutationObserver,L=r.document,z=r.process,W=r.Promise,J=f(r,"queueMicrotask"),ee=J&&J.value;if(!ee){var ae=new e,he=function(){var be,we;for(C&&(be=z.domain)&&be.exit();we=ae.get();)try{we()}catch(ue){throw ae.head&&ce(),ue}be&&be.enter()};p||C||T||!R||!L?!y&&W&&W.resolve?((se=W.resolve(void 0)).constructor=W,ge=a(se.then,se),ce=function(){ge(he)}):C?ce=function(){z.nextTick(he)}:(c=a(c,r),ce=function(){c(he)}):(ie=!0,U=L.createTextNode(""),new R(he).observe(U,{characterData:!0}),ce=function(){U.data=ie=!ie}),ee=function(be){ae.head||ce(),ae.add(be)}}m.exports=ee},54256:(m,S,i)=>{"use strict";var r=i(61812),a=TypeError,f=function(c){var e,p;this.promise=new c(function(y,T){if(void 0!==e||void 0!==p)throw a("Bad Promise constructor");e=y,p=T}),this.resolve=r(e),this.reject=r(p)};m.exports.f=function(c){return new f(c)}},63313:(m,S,i)=>{var r=i(41433);m.exports=function(a,f){return void 0===a?arguments.length<2?"":f:r(a)}},56421:(m,S,i)=>{var r=i(60373),a=TypeError;m.exports=function(f){if(r(f))throw a("The method doesn't accept regular expressions");return f}},75791:(m,S,i)=>{"use strict";var r=i(49642),a=i(23634),f=i(25401),c=i(55756),e=i(28474),p=i(47238),y=i(25558),T=i(70267),C=i(20973),R=Object.assign,L=Object.defineProperty,z=a([].concat);m.exports=!R||c(function(){if(r&&1!==R({b:1},R(L({},"a",{enumerable:!0,get:function(){L(this,"b",{value:3,enumerable:!1})}}),{b:2})).b)return!0;var W={},J={},ee=Symbol(),ce="abcdefghijklmnopqrst";return W[ee]=7,ce.split("").forEach(function(ie){J[ie]=ie}),7!=R({},W)[ee]||e(R({},J)).join("")!=ce})?function(J,ee){for(var ce=T(J),ie=arguments.length,U=1,se=p.f,ge=y.f;ie>U;)for(var ue,ae=C(arguments[U++]),he=se?z(e(ae),se(ae)):e(ae),be=he.length,we=0;be>we;)ue=he[we++],(!r||f(ge,ae,ue))&&(ce[ue]=ae[ue]);return ce}:R},83272:(m,S,i)=>{var ie,r=i(64562),a=i(25913),f=i(44939),c=i(45599),e=i(55690),p=i(96682),y=i(86066),R="prototype",L="script",z=y("IE_PROTO"),W=function(){},J=function(se){return"<"+L+">"+se+"</"+L+">"},ee=function(se){se.write(J("")),se.close();var ge=se.parentWindow.Object;return se=null,ge},U=function(){try{ie=new ActiveXObject("htmlfile")}catch(ge){}U="undefined"!=typeof document?document.domain&&ie?ee(ie):function(){var ae,se=p("iframe");return se.style.display="none",e.appendChild(se),se.src=String("javascript:"),(ae=se.contentWindow.document).open(),ae.write(J("document.F=Object")),ae.close(),ae.F}():ee(ie);for(var se=f.length;se--;)delete U[R][f[se]];return U()};c[z]=!0,m.exports=Object.create||function(ge,ae){var he;return null!==ge?(W[R]=r(ge),he=new W,W[R]=null,he[z]=ge):he=U(),void 0===ae?he:a.f(he,ae)}},25913:(m,S,i)=>{var r=i(49642),a=i(47960),f=i(48011),c=i(64562),e=i(81010),p=i(28474);S.f=r&&!a?Object.defineProperties:function(T,C){c(T);for(var J,R=e(C),L=p(C),z=L.length,W=0;z>W;)f.f(T,J=L[W++],R[J]);return T}},48011:(m,S,i)=>{var r=i(49642),a=i(50495),f=i(47960),c=i(64562),e=i(62939),p=TypeError,y=Object.defineProperty,T=Object.getOwnPropertyDescriptor,C="enumerable",R="configurable",L="writable";S.f=r?f?function(W,J,ee){if(c(W),J=e(J),c(ee),"function"==typeof W&&"prototype"===J&&"value"in ee&&L in ee&&!ee[L]){var ce=T(W,J);ce&&ce[L]&&(W[J]=ee.value,ee={configurable:R in ee?ee[R]:ce[R],enumerable:C in ee?ee[C]:ce[C],writable:!1})}return y(W,J,ee)}:y:function(W,J,ee){if(c(W),J=e(J),c(ee),a)try{return y(W,J,ee)}catch(ce){}if("get"in ee||"set"in ee)throw p("Accessors not supported");return"value"in ee&&(W[J]=ee.value),W}},25525:(m,S,i)=>{var r=i(49642),a=i(25401),f=i(25558),c=i(51361),e=i(81010),p=i(62939),y=i(80112),T=i(50495),C=Object.getOwnPropertyDescriptor;S.f=r?C:function(L,z){if(L=e(L),z=p(z),T)try{return C(L,z)}catch(W){}if(y(L,z))return c(!a(f.f,L,z),L[z])}},62469:(m,S,i)=>{var r=i(49806),a=i(81010),f=i(51518).f,c=i(8681),e="object"==typeof window&&window&&Object.getOwnPropertyNames?Object.getOwnPropertyNames(window):[];m.exports.f=function(T){return e&&"Window"==r(T)?function(y){try{return f(y)}catch(T){return c(e)}}(T):f(a(T))}},51518:(m,S,i)=>{var r=i(66250),f=i(44939).concat("length","prototype");S.f=Object.getOwnPropertyNames||function(e){return r(e,f)}},47238:(m,S)=>{S.f=Object.getOwnPropertySymbols},31426:(m,S,i)=>{var r=i(80112),a=i(52208),f=i(70267),c=i(86066),e=i(37112),p=c("IE_PROTO"),y=Object,T=y.prototype;m.exports=e?y.getPrototypeOf:function(C){var R=f(C);if(r(R,p))return R[p];var L=R.constructor;return a(L)&&R instanceof L?L.prototype:R instanceof y?T:null}},46401:(m,S,i)=>{var r=i(55756),a=i(77293),f=i(49806),c=i(76318),e=Object.isExtensible,p=r(function(){e(1)});m.exports=p||c?function(T){return!(!a(T)||c&&"ArrayBuffer"==f(T))&&(!e||e(T))}:e},23336:(m,S,i)=>{var r=i(23634);m.exports=r({}.isPrototypeOf)},66250:(m,S,i)=>{var r=i(23634),a=i(80112),f=i(81010),c=i(95171).indexOf,e=i(45599),p=r([].push);m.exports=function(y,T){var z,C=f(y),R=0,L=[];for(z in C)!a(e,z)&&a(C,z)&&p(L,z);for(;T.length>R;)a(C,z=T[R++])&&(~c(L,z)||p(L,z));return L}},28474:(m,S,i)=>{var r=i(66250),a=i(44939);m.exports=Object.keys||function(c){return r(c,a)}},25558:(m,S)=>{"use strict";var i={}.propertyIsEnumerable,r=Object.getOwnPropertyDescriptor,a=r&&!i.call({1:2},1);S.f=a?function(c){var e=r(this,c);return!!e&&e.enumerable}:i},54945:(m,S,i)=>{var r=i(13325),a=i(64562),f=i(93221);m.exports=Object.setPrototypeOf||("__proto__"in{}?function(){var p,c=!1,e={};try{(p=r(Object.prototype,"__proto__","set"))(e,[]),c=e instanceof Array}catch(y){}return function(T,C){return a(T),f(C),c?p(T,C):T.__proto__=C,T}}():void 0)},36805:(m,S,i)=>{var r=i(49642),a=i(23634),f=i(28474),c=i(81010),p=a(i(25558).f),y=a([].push),T=function(C){return function(R){for(var ce,L=c(R),z=f(L),W=z.length,J=0,ee=[];W>J;)ce=z[J++],(!r||p(L,ce))&&y(ee,C?[ce,L[ce]]:L[ce]);return ee}};m.exports={entries:T(!0),values:T(!1)}},97686:(m,S,i)=>{"use strict";var r=i(5552),a=i(35329);m.exports=r?{}.toString:function(){return"[object "+a(this)+"]"}},71689:(m,S,i)=>{var r=i(25401),a=i(52208),f=i(77293),c=TypeError;m.exports=function(e,p){var y,T;if("string"===p&&a(y=e.toString)&&!f(T=r(y,e))||a(y=e.valueOf)&&!f(T=r(y,e))||"string"!==p&&a(y=e.toString)&&!f(T=r(y,e)))return T;throw c("Can't convert object to primitive value")}},59823:(m,S,i)=>{var r=i(7365),a=i(23634),f=i(51518),c=i(47238),e=i(64562),p=a([].concat);m.exports=r("Reflect","ownKeys")||function(T){var C=f.f(e(T)),R=c.f;return R?p(C,R(T)):C}},13544:m=>{m.exports={}},26975:m=>{m.exports=function(S){try{return{error:!1,value:S()}}catch(i){return{error:!0,value:i}}}},9936:(m,S,i)=>{var r=i(70009),a=i(46456),f=i(52208),c=i(79482),e=i(26699),p=i(91840),y=i(34008),T=i(31813),C=i(81124),R=i(63556),L=a&&a.prototype,z=p("species"),W=!1,J=f(r.PromiseRejectionEvent),ee=c("Promise",function(){var ce=e(a),ie=ce!==String(a);if(!ie&&66===R||C&&(!L.catch||!L.finally))return!0;if(!R||R<51||!/native code/.test(ce)){var U=new a(function(ae){ae(1)}),se=function(ae){ae(function(){},function(){})};if((U.constructor={})[z]=se,!(W=U.then(function(){})instanceof se))return!0}return!ie&&(y||T)&&!J});m.exports={CONSTRUCTOR:ee,REJECTION_EVENT:J,SUBCLASSING:W}},46456:(m,S,i)=>{var r=i(70009);m.exports=r.Promise},25524:(m,S,i)=>{var r=i(64562),a=i(77293),f=i(54256);m.exports=function(c,e){if(r(c),a(e)&&e.constructor===c)return e;var p=f.f(c);return(0,p.resolve)(e),p.promise}},95758:(m,S,i)=>{var r=i(46456),a=i(5253),f=i(9936).CONSTRUCTOR;m.exports=f||!a(function(c){r.all(c).then(void 0,function(){})})},70918:m=>{var S=function(){this.head=null,this.tail=null};S.prototype={add:function(i){var r={item:i,next:null},a=this.tail;a?a.next=r:this.head=r,this.tail=r},get:function(){var i=this.head;if(i)return null===(this.head=i.next)&&(this.tail=null),i.item}},m.exports=S},67917:(m,S,i)=>{var r=i(43550),a=TypeError;m.exports=function(f){if(r(f))throw a("Can't call method on "+f);return f}},29627:m=>{m.exports=function(S,i){return S===i||S!=S&&i!=i}},53814:(m,S,i)=>{"use strict";var R,r=i(70009),a=i(2543),f=i(52208),c=i(70902),e=i(86053),p=i(37591),y=i(15086),T=r.Function,C=/MSIE .\./.test(e)||c&&((R=r.Bun.version.split(".")).length<3||0==R[0]&&(R[1]<3||3==R[1]&&0==R[2]));m.exports=function(R,L){var z=L?2:1;return C?function(W,J){var ee=y(arguments.length,1)>z,ce=f(W)?W:T(W),ie=ee?p(arguments,z):[],U=ee?function(){a(ce,this,ie)}:ce;return L?R(U,J):R(U)}:R}},58014:(m,S,i)=>{"use strict";var r=i(7365),a=i(1707),f=i(91840),c=i(49642),e=f("species");m.exports=function(p){var y=r(p);c&&y&&!y[e]&&a(y,e,{configurable:!0,get:function(){return this}})}},85681:(m,S,i)=>{var r=i(5552),a=i(48011).f,f=i(65162),c=i(80112),e=i(97686),y=i(91840)("toStringTag");m.exports=function(T,C,R,L){if(T){var z=R?T:T.prototype;c(z,y)||a(z,y,{configurable:!0,value:C}),L&&!r&&f(z,"toString",e)}}},86066:(m,S,i)=>{var r=i(64579),a=i(13708),f=r("keys");m.exports=function(c){return f[c]||(f[c]=a(c))}},24766:(m,S,i)=>{var r=i(70009),a=i(34056),f="__core-js_shared__",c=r[f]||a(f,{});m.exports=c},64579:(m,S,i)=>{var r=i(81124),a=i(24766);(m.exports=function(f,c){return a[f]||(a[f]=void 0!==c?c:{})})("versions",[]).push({version:"3.29.0",mode:r?"pure":"global",copyright:"\xa9 2014-2023 Denis Pushkarev (zloirock.ru)",license:"https://github.com/zloirock/core-js/blob/v3.29.0/LICENSE",source:"https://github.com/zloirock/core-js"})},95869:(m,S,i)=>{var r=i(64562),a=i(54356),f=i(43550),e=i(91840)("species");m.exports=function(p,y){var C,T=r(p).constructor;return void 0===T||f(C=r(T)[e])?y:a(C)}},61557:(m,S,i)=>{var r=i(23634),a=i(33912),f=i(41433),c=i(67917),e=r("".charAt),p=r("".charCodeAt),y=r("".slice),T=function(C){return function(R,L){var ee,ce,z=f(c(R)),W=a(L),J=z.length;return W<0||W>=J?C?"":void 0:(ee=p(z,W))<55296||ee>56319||W+1===J||(ce=p(z,W+1))<56320||ce>57343?C?e(z,W):ee:C?y(z,W,W+2):ce-56320+(ee-55296<<10)+65536}};m.exports={codeAt:T(!1),charAt:T(!0)}},26662:(m,S,i)=>{var r=i(23634),a=2147483647,L=/[^\0-\u007E]/,z=/[.\u3002\uFF0E\uFF61]/g,W="Overflow: input needs wider integers to process",ee=RangeError,ce=r(z.exec),ie=Math.floor,U=String.fromCharCode,se=r("".charCodeAt),ge=r([].join),ae=r([].push),he=r("".replace),be=r("".split),we=r("".toLowerCase),st=function(Be){return Be+22+75*(Be<26)},We=function(Be,xe,je){var Ne=0;for(Be=je?ie(Be/700):Be>>1,Be+=ie(Be/xe);Be>455;)Be=ie(Be/35),Ne+=36;return ie(Ne+36*Be/(Be+38))},Ve=function(Be){var xe=[];Be=function(Be){for(var xe=[],je=0,Ne=Be.length;je<Ne;){var Bt=se(Be,je++);if(Bt>=55296&&Bt<=56319&&je<Ne){var rt=se(Be,je++);56320==(64512&rt)?ae(xe,((1023&Bt)<<10)+(1023&rt)+65536):(ae(xe,Bt),je--)}else ae(xe,Bt)}return xe}(Be);var en,Pt,je=Be.length,Ne=128,Bt=0,rt=72;for(en=0;en<Be.length;en++)(Pt=Be[en])<128&&ae(xe,U(Pt));var Vt=xe.length,hn=Vt;for(Vt&&ae(xe,"-");hn<je;){var vn=a;for(en=0;en<Be.length;en++)(Pt=Be[en])>=Ne&&Pt<vn&&(vn=Pt);var mt=hn+1;if(vn-Ne>ie((a-Bt)/mt))throw ee(W);for(Bt+=(vn-Ne)*mt,Ne=vn,en=0;en<Be.length;en++){if((Pt=Be[en])<Ne&&++Bt>a)throw ee(W);if(Pt==Ne){for(var Nt=Bt,St=36;;){var Yt=St<=rt?1:St>=rt+26?26:St-rt;if(Nt<Yt)break;var Fn=Nt-Yt,pr=36-Yt;ae(xe,U(st(Yt+Fn%pr))),Nt=ie(Fn/pr),St+=36}ae(xe,U(st(Nt))),rt=We(Bt,mt,hn==Vt),Bt=0,hn++}}Bt++,Ne++}return ge(xe,"")};m.exports=function(Be){var Ne,Bt,xe=[],je=be(he(we(Be),z,"."),".");for(Ne=0;Ne<je.length;Ne++)ae(xe,ce(L,Bt=je[Ne])?"xn--"+Ve(Bt):Bt);return ge(xe,".")}},53411:(m,S,i)=>{"use strict";var r=i(33912),a=i(41433),f=i(67917),c=RangeError;m.exports=function(p){var y=a(f(this)),T="",C=r(p);if(C<0||C==1/0)throw c("Wrong number of repetitions");for(;C>0;(C>>>=1)&&(y+=y))1&C&&(T+=y);return T}},85462:(m,S,i)=>{var r=i(29862).PROPER,a=i(55756),f=i(88185);m.exports=function(e){return a(function(){return!!f[e]()||"\u200b\x85\u180e"!=="\u200b\x85\u180e"[e]()||r&&f[e].name!==e})}},89858:(m,S,i)=>{var r=i(23634),a=i(67917),f=i(41433),c=i(88185),e=r("".replace),p=RegExp("^["+c+"]+"),y=RegExp("(^|[^"+c+"])["+c+"]+$"),T=function(C){return function(R){var L=f(a(R));return 1&C&&(L=e(L,p,"")),2&C&&(L=e(L,y,"$1")),L}};m.exports={start:T(1),end:T(2),trim:T(3)}},98535:(m,S,i)=>{var r=i(63556),a=i(55756);m.exports=!!Object.getOwnPropertySymbols&&!a(function(){var f=Symbol();return!String(f)||!(Object(f)instanceof Symbol)||!Symbol.sham&&r&&r<41})},56992:(m,S,i)=>{var r=i(25401),a=i(7365),f=i(91840),c=i(42915);m.exports=function(){var e=a("Symbol"),p=e&&e.prototype,y=p&&p.valueOf,T=f("toPrimitive");p&&!p[T]&&c(p,T,function(C){return r(y,this)},{arity:1})}},56709:(m,S,i)=>{var r=i(98535);m.exports=r&&!!Symbol.for&&!!Symbol.keyFor},37352:(m,S,i)=>{var be,we,ue,st,r=i(70009),a=i(2543),f=i(76781),c=i(52208),e=i(80112),p=i(55756),y=i(55690),T=i(37591),C=i(96682),R=i(15086),L=i(3877),z=i(3787),W=r.setImmediate,J=r.clearImmediate,ee=r.process,ce=r.Dispatch,ie=r.Function,U=r.MessageChannel,se=r.String,ge=0,ae={},he="onreadystatechange";p(function(){be=r.location});var We=function(je){if(e(ae,je)){var Ne=ae[je];delete ae[je],Ne()}},Ve=function(je){return function(){We(je)}},Be=function(je){We(je.data)},xe=function(je){r.postMessage(se(je),be.protocol+"//"+be.host)};(!W||!J)&&(W=function(Ne){R(arguments.length,1);var Bt=c(Ne)?Ne:ie(Ne),rt=T(arguments,1);return ae[++ge]=function(){a(Bt,void 0,rt)},we(ge),ge},J=function(Ne){delete ae[Ne]},z?we=function(je){ee.nextTick(Ve(je))}:ce&&ce.now?we=function(je){ce.now(Ve(je))}:U&&!L?(st=(ue=new U).port2,ue.port1.onmessage=Be,we=f(st.postMessage,st)):r.addEventListener&&c(r.postMessage)&&!r.importScripts&&be&&"file:"!==be.protocol&&!p(xe)?(we=xe,r.addEventListener("message",Be,!1)):we=he in C("script")?function(je){y.appendChild(C("script"))[he]=function(){y.removeChild(this),We(je)}}:function(je){setTimeout(Ve(je),0)}),m.exports={set:W,clear:J}},19401:(m,S,i)=>{var r=i(33912),a=Math.max,f=Math.min;m.exports=function(c,e){var p=r(c);return p<0?a(p+e,0):f(p,e)}},81010:(m,S,i)=>{var r=i(20973),a=i(67917);m.exports=function(f){return r(a(f))}},33912:(m,S,i)=>{var r=i(8651);m.exports=function(a){var f=+a;return f!=f||0===f?0:r(f)}},48869:(m,S,i)=>{var r=i(33912),a=Math.min;m.exports=function(f){return f>0?a(r(f),9007199254740991):0}},70267:(m,S,i)=>{var r=i(67917),a=Object;m.exports=function(f){return a(r(f))}},1645:(m,S,i)=>{var r=i(25401),a=i(77293),f=i(74717),c=i(34778),e=i(71689),p=i(91840),y=TypeError,T=p("toPrimitive");m.exports=function(C,R){if(!a(C)||f(C))return C;var z,L=c(C,T);if(L){if(void 0===R&&(R="default"),z=r(L,C,R),!a(z)||f(z))return z;throw y("Can't convert object to primitive value")}return void 0===R&&(R="number"),e(C,R)}},62939:(m,S,i)=>{var r=i(1645),a=i(74717);m.exports=function(f){var c=r(f,"string");return a(c)?c:c+""}},5552:(m,S,i)=>{var f={};f[i(91840)("toStringTag")]="z",m.exports="[object z]"===String(f)},41433:(m,S,i)=>{var r=i(35329),a=String;m.exports=function(f){if("Symbol"===r(f))throw TypeError("Cannot convert a Symbol value to a string");return a(f)}},7378:m=>{var S=String;m.exports=function(i){try{return S(i)}catch(r){return"Object"}}},13708:(m,S,i)=>{var r=i(23634),a=0,f=Math.random(),c=r(1..toString);m.exports=function(e){return"Symbol("+(void 0===e?"":e)+")_"+c(++a+f,36)}},54933:(m,S,i)=>{var r=i(55756),a=i(91840),f=i(49642),c=i(81124),e=a("iterator");m.exports=!r(function(){var p=new URL("b?a=1&b=2&c=3","http://a"),y=p.searchParams,T="";return p.pathname="c%20d",y.forEach(function(C,R){y.delete("b"),T+=R+C}),c&&!p.toJSON||!y.size&&(c||!f)||!y.sort||"http://a/c%20d?a=1&c=3"!==p.href||"3"!==y.get("c")||"a=1"!==String(new URLSearchParams("?a=1"))||!y[e]||"a"!==new URL("https://a@b").username||"b"!==new URLSearchParams(new URLSearchParams("a=b")).get("a")||"xn--e1aybc"!==new URL("http://\u0442\u0435\u0441\u0442").host||"#%D0%B1"!==new URL("http://a#\u0431").hash||"a1c3"!==T||"x"!==new URL("http://x",void 0).host})},99554:(m,S,i)=>{var r=i(98535);m.exports=r&&!Symbol.sham&&"symbol"==typeof Symbol.iterator},47960:(m,S,i)=>{var r=i(49642),a=i(55756);m.exports=r&&a(function(){return 42!=Object.defineProperty(function(){},"prototype",{value:42,writable:!1}).prototype})},15086:m=>{var S=TypeError;m.exports=function(i,r){if(i<r)throw S("Not enough arguments");return i}},81101:(m,S,i)=>{var r=i(70009),a=i(52208),f=r.WeakMap;m.exports=a(f)&&/native code/.test(String(f))},25374:(m,S,i)=>{var r=i(13544),a=i(80112),f=i(89734),c=i(48011).f;m.exports=function(e){var p=r.Symbol||(r.Symbol={});a(p,e)||c(p,e,{value:f.f(e)})}},89734:(m,S,i)=>{var r=i(91840);S.f=r},91840:(m,S,i)=>{var r=i(70009),a=i(64579),f=i(80112),c=i(13708),e=i(98535),p=i(99554),y=r.Symbol,T=a("wks"),C=p?y.for||y:y&&y.withoutSetter||c;m.exports=function(R){return f(T,R)||(T[R]=e&&f(y,R)?y[R]:C("Symbol."+R)),T[R]}},88185:m=>{m.exports="\t\n\v\f\r \xa0\u1680\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200a\u202f\u205f\u3000\u2028\u2029\ufeff"},70210:(m,S,i)=>{"use strict";var r=i(90513),a=i(23336),f=i(31426),c=i(54945),e=i(65031),p=i(83272),y=i(65162),T=i(51361),C=i(33411),R=i(77732),L=i(41605),z=i(63313),J=i(91840)("toStringTag"),ee=Error,ce=[].push,ie=function(ge,ae){var be,he=a(U,this);c?be=c(ee(),he?f(this):U):(be=he?this:p(U),y(be,J,"Error")),void 0!==ae&&y(be,"message",z(ae)),R(be,ie,be.stack,1),arguments.length>2&&C(be,arguments[2]);var we=[];return L(ge,ce,{that:we}),y(be,"errors",we),be};c?c(ie,ee):e(ie,ee,{name:!0});var U=ie.prototype=p(ee.prototype,{constructor:T(1,ie),message:T(1,""),name:T(1,"AggregateError")});r({global:!0,constructor:!0,arity:2},{AggregateError:ie})},10901:(m,S,i)=>{i(70210)},1625:(m,S,i)=>{"use strict";var r=i(90513),a=i(55756),f=i(89735),c=i(77293),e=i(70267),p=i(6381),y=i(11594),T=i(46751),C=i(2103),R=i(95913),L=i(91840),z=i(63556),W=L("isConcatSpreadable"),J=z>=51||!a(function(){var ie=[];return ie[W]=!1,ie.concat()[0]!==ie}),ee=function(ie){if(!c(ie))return!1;var U=ie[W];return void 0!==U?!!U:f(ie)};r({target:"Array",proto:!0,arity:1,forced:!J||!R("concat")},{concat:function(U){var he,be,we,ue,st,se=e(this),ge=C(se,0),ae=0;for(he=-1,we=arguments.length;he<we;he++)if(ee(st=-1===he?se:arguments[he]))for(ue=p(st),y(ae+ue),be=0;be<ue;be++,ae++)be in st&&T(ge,ae,st[be]);else y(ae+1),T(ge,ae++,st);return ge.length=ae,ge}})},70466:(m,S,i)=>{"use strict";var r=i(90513),a=i(68607).every;r({target:"Array",proto:!0,forced:!i(33620)("every")},{every:function(p){return a(this,p,arguments.length>1?arguments[1]:void 0)}})},24990:(m,S,i)=>{var r=i(90513),a=i(35277),f=i(82196);r({target:"Array",proto:!0},{fill:a}),f("fill")},56534:(m,S,i)=>{"use strict";var r=i(90513),a=i(68607).filter;r({target:"Array",proto:!0,forced:!i(95913)("filter")},{filter:function(p){return a(this,p,arguments.length>1?arguments[1]:void 0)}})},12773:(m,S,i)=>{"use strict";var r=i(90513),a=i(68607).findIndex,f=i(82196),c="findIndex",e=!0;c in[]&&Array(1)[c](function(){e=!1}),r({target:"Array",proto:!0,forced:e},{findIndex:function(y){return a(this,y,arguments.length>1?arguments[1]:void 0)}}),f(c)},60326:(m,S,i)=>{"use strict";var r=i(90513),a=i(68607).find,f=i(82196),c="find",e=!0;c in[]&&Array(1)[c](function(){e=!1}),r({target:"Array",proto:!0,forced:e},{find:function(y){return a(this,y,arguments.length>1?arguments[1]:void 0)}}),f(c)},98792:(m,S,i)=>{"use strict";var r=i(90513),a=i(8366);r({target:"Array",proto:!0,forced:[].forEach!=a},{forEach:a})},261:(m,S,i)=>{var r=i(90513),a=i(51923);r({target:"Array",stat:!0,forced:!i(5253)(function(e){Array.from(e)})},{from:a})},77059:(m,S,i)=>{"use strict";var r=i(90513),a=i(95171).includes,f=i(55756),c=i(82196);r({target:"Array",proto:!0,forced:f(function(){return!Array(1).includes()})},{includes:function(y){return a(this,y,arguments.length>1?arguments[1]:void 0)}}),c("includes")},2795:(m,S,i)=>{"use strict";var r=i(90513),a=i(64350),f=i(95171).indexOf,c=i(33620),e=a([].indexOf),p=!!e&&1/e([1],1,-0)<0;r({target:"Array",proto:!0,forced:p||!c("indexOf")},{indexOf:function(C){var R=arguments.length>1?arguments[1]:void 0;return p?e(this,C,R)||0:f(this,C,R)}})},2862:(m,S,i)=>{i(90513)({target:"Array",stat:!0},{isArray:i(89735)})},1285:(m,S,i)=>{"use strict";var r=i(81010),a=i(82196),f=i(84394),c=i(91093),e=i(48011).f,p=i(79077),y=i(28738),T=i(81124),C=i(49642),R="Array Iterator",L=c.set,z=c.getterFor(R);m.exports=p(Array,"Array",function(J,ee){L(this,{type:R,target:r(J),index:0,kind:ee})},function(){var J=z(this),ee=J.target,ce=J.kind,ie=J.index++;return!ee||ie>=ee.length?(J.target=void 0,y(void 0,!0)):y("keys"==ce?ie:"values"==ce?ee[ie]:[ie,ee[ie]],!1)},"values");var W=f.Arguments=f.Array;if(a("keys"),a("values"),a("entries"),!T&&C&&"values"!==W.name)try{e(W,"name",{value:"values"})}catch(J){}},74926:(m,S,i)=>{var r=i(90513),a=i(78375);r({target:"Array",proto:!0,forced:a!==[].lastIndexOf},{lastIndexOf:a})},88119:(m,S,i)=>{"use strict";var r=i(90513),a=i(68607).map;r({target:"Array",proto:!0,forced:!i(95913)("map")},{map:function(p){return a(this,p,arguments.length>1?arguments[1]:void 0)}})},46250:(m,S,i)=>{"use strict";var r=i(90513),a=i(88908).left,f=i(33620),c=i(63556);r({target:"Array",proto:!0,forced:!i(3787)&&c>79&&c<83||!f("reduce")},{reduce:function(C){var R=arguments.length;return a(this,C,R,R>1?arguments[1]:void 0)}})},32836:(m,S,i)=>{"use strict";var r=i(90513),a=i(23634),f=i(89735),c=a([].reverse),e=[1,2];r({target:"Array",proto:!0,forced:String(e)===String(e.reverse())},{reverse:function(){return f(this)&&(this.length=this.length),c(this)}})},72999:(m,S,i)=>{"use strict";var r=i(90513),a=i(89735),f=i(81177),c=i(77293),e=i(19401),p=i(6381),y=i(81010),T=i(46751),C=i(91840),R=i(95913),L=i(37591),z=R("slice"),W=C("species"),J=Array,ee=Math.max;r({target:"Array",proto:!0,forced:!z},{slice:function(ie,U){var be,we,ue,se=y(this),ge=p(se),ae=e(ie,ge),he=e(void 0===U?ge:U,ge);if(a(se)&&((f(be=se.constructor)&&(be===J||a(be.prototype))||c(be)&&null===(be=be[W]))&&(be=void 0),be===J||void 0===be))return L(se,ae,he);for(we=new(void 0===be?J:be)(ee(he-ae,0)),ue=0;ae<he;ae++,ue++)ae in se&&T(we,ue,se[ae]);return we.length=ue,we}})},50733:(m,S,i)=>{"use strict";var r=i(90513),a=i(68607).some;r({target:"Array",proto:!0,forced:!i(33620)("some")},{some:function(p){return a(this,p,arguments.length>1?arguments[1]:void 0)}})},93639:(m,S,i)=>{"use strict";var r=i(90513),a=i(23634),f=i(61812),c=i(70267),e=i(6381),p=i(67236),y=i(41433),T=i(55756),C=i(84865),R=i(33620),L=i(36410),z=i(5329),W=i(63556),J=i(34545),ee=[],ce=a(ee.sort),ie=a(ee.push),U=T(function(){ee.sort(void 0)}),se=T(function(){ee.sort(null)}),ge=R("sort"),ae=!T(function(){if(W)return W<70;if(!(L&&L>3)){if(z)return!0;if(J)return J<603;var ue,st,We,Ve,we="";for(ue=65;ue<76;ue++){switch(st=String.fromCharCode(ue),ue){case 66:case 69:case 70:case 72:We=3;break;case 68:case 71:We=4;break;default:We=2}for(Ve=0;Ve<47;Ve++)ee.push({k:st+Ve,v:We})}for(ee.sort(function(Be,xe){return xe.v-Be.v}),Ve=0;Ve<ee.length;Ve++)st=ee[Ve].k.charAt(0),we.charAt(we.length-1)!==st&&(we+=st);return"DGBEFHACIJK"!==we}});r({target:"Array",proto:!0,forced:U||!se||!ge||!ae},{sort:function(ue){void 0!==ue&&f(ue);var st=c(this);if(ae)return void 0===ue?ce(st):ce(st,ue);var Be,xe,We=[],Ve=e(st);for(xe=0;xe<Ve;xe++)xe in st&&ie(We,st[xe]);for(C(We,function(we){return function(ue,st){return void 0===st?-1:void 0===ue?1:void 0!==we?+we(ue,st)||0:y(ue)>y(st)?1:-1}}(ue)),Be=e(We),xe=0;xe<Be;)st[xe]=We[xe++];for(;xe<Ve;)p(st,xe++);return st}})},63117:(m,S,i)=>{"use strict";var r=i(90513),a=i(70267),f=i(19401),c=i(33912),e=i(6381),p=i(54716),y=i(11594),T=i(2103),C=i(46751),R=i(67236),z=i(95913)("splice"),W=Math.max,J=Math.min;r({target:"Array",proto:!0,forced:!z},{splice:function(ce,ie){var he,be,we,ue,st,We,U=a(this),se=e(U),ge=f(ce,se),ae=arguments.length;for(0===ae?he=be=0:1===ae?(he=0,be=se-ge):(he=ae-2,be=J(W(c(ie),0),se-ge)),y(se+he-be),we=T(U,be),ue=0;ue<be;ue++)(st=ge+ue)in U&&C(we,ue,U[st]);if(we.length=be,he<be){for(ue=ge;ue<se-be;ue++)We=ue+he,(st=ue+be)in U?U[We]=U[st]:R(U,We);for(ue=se;ue>se-be+he;ue--)R(U,ue-1)}else if(he>be)for(ue=se-be;ue>ge;ue--)We=ue+he-1,(st=ue+be-1)in U?U[We]=U[st]:R(U,We);for(ue=0;ue<he;ue++)U[ue+ge]=arguments[ue+2];return p(U,se-be+he),we}})},34699:(m,S,i)=>{var r=i(90513),a=i(23634),f=Date,c=a(f.prototype.getTime);r({target:"Date",stat:!0},{now:function(){return c(new f)}})},68154:()=>{},33379:(m,S,i)=>{var r=i(90513),a=i(44197);r({target:"Function",proto:!0,forced:Function.bind!==a},{bind:a})},75071:(m,S,i)=>{var r=i(90513),a=i(7365),f=i(2543),c=i(25401),e=i(23634),p=i(55756),y=i(52208),T=i(74717),C=i(37591),R=i(32092),L=i(98535),z=String,W=a("JSON","stringify"),J=e(/./.exec),ee=e("".charAt),ce=e("".charCodeAt),ie=e("".replace),U=e(1..toString),se=/[\uD800-\uDFFF]/g,ge=/^[\uD800-\uDBFF]$/,ae=/^[\uDC00-\uDFFF]$/,he=!L||p(function(){var st=a("Symbol")();return"[null]"!=W([st])||"{}"!=W({a:st})||"{}"!=W(Object(st))}),be=p(function(){return'"\\udf06\\ud834"'!==W("\udf06\ud834")||'"\\udead"'!==W("\udead")}),we=function(st,We){var Ve=C(arguments),Be=R(We);if(y(Be)||void 0!==st&&!T(st))return Ve[1]=function(xe,je){if(y(Be)&&(je=c(Be,this,z(xe),je)),!T(je))return je},f(W,null,Ve)},ue=function(st,We,Ve){var Be=ee(Ve,We-1),xe=ee(Ve,We+1);return J(ge,st)&&!J(ae,xe)||J(ae,st)&&!J(ge,Be)?"\\u"+U(ce(st,0),16):st};W&&r({target:"JSON",stat:!0,arity:3,forced:he||be},{stringify:function(We,Ve,Be){var xe=C(arguments),je=f(he?we:W,null,xe);return be&&"string"==typeof je?ie(je,se,ue):je}})},32300:(m,S,i)=>{var r=i(70009);i(85681)(r.JSON,"JSON",!0)},83616:(m,S,i)=>{"use strict";i(85116)("Map",function(f){return function(){return f(this,arguments.length?arguments[0]:void 0)}},i(26650))},85140:(m,S,i)=>{i(83616)},63603:()=>{},67234:(m,S,i)=>{var r=i(90513),a=i(75791);r({target:"Object",stat:!0,arity:2,forced:Object.assign!==a},{assign:a})},86516:(m,S,i)=>{i(90513)({target:"Object",stat:!0,sham:!i(49642)},{create:i(83272)})},36255:(m,S,i)=>{var r=i(90513),a=i(49642),f=i(25913).f;r({target:"Object",stat:!0,forced:Object.defineProperties!==f,sham:!a},{defineProperties:f})},84468:(m,S,i)=>{var r=i(90513),a=i(49642),f=i(48011).f;r({target:"Object",stat:!0,forced:Object.defineProperty!==f,sham:!a},{defineProperty:f})},86627:(m,S,i)=>{var r=i(90513),a=i(55756),f=i(81010),c=i(25525).f,e=i(49642);r({target:"Object",stat:!0,forced:!e||a(function(){c(1)}),sham:!e},{getOwnPropertyDescriptor:function(T,C){return c(f(T),C)}})},78275:(m,S,i)=>{var r=i(90513),a=i(49642),f=i(59823),c=i(81010),e=i(25525),p=i(46751);r({target:"Object",stat:!0,sham:!a},{getOwnPropertyDescriptors:function(T){for(var J,ee,C=c(T),R=e.f,L=f(C),z={},W=0;L.length>W;)void 0!==(ee=R(C,J=L[W++]))&&p(z,J,ee);return z}})},37764:(m,S,i)=>{var r=i(90513),a=i(98535),f=i(55756),c=i(47238),e=i(70267);r({target:"Object",stat:!0,forced:!a||f(function(){c.f(1)})},{getOwnPropertySymbols:function(T){var C=c.f;return C?C(e(T)):[]}})},31193:(m,S,i)=>{var r=i(90513),a=i(55756),f=i(70267),c=i(31426),e=i(37112);r({target:"Object",stat:!0,forced:a(function(){c(1)}),sham:!e},{getPrototypeOf:function(T){return c(f(T))}})},56557:(m,S,i)=>{var r=i(90513),a=i(70267),f=i(28474);r({target:"Object",stat:!0,forced:i(55756)(function(){f(1)})},{keys:function(y){return f(a(y))}})},17971:(m,S,i)=>{i(90513)({target:"Object",stat:!0},{setPrototypeOf:i(54945)})},17221:()=>{},88923:(m,S,i)=>{var r=i(90513),a=i(36805).values;r({target:"Object",stat:!0},{values:function(c){return a(c)}})},84798:(m,S,i)=>{"use strict";var r=i(90513),a=i(25401),f=i(61812),c=i(54256),e=i(26975),p=i(41605);r({target:"Promise",stat:!0,forced:i(95758)},{allSettled:function(C){var R=this,L=c.f(R),z=L.resolve,W=L.reject,J=e(function(){var ee=f(R.resolve),ce=[],ie=0,U=1;p(C,function(se){var ge=ie++,ae=!1;U++,a(ee,R,se).then(function(he){ae||(ae=!0,ce[ge]={status:"fulfilled",value:he},--U||z(ce))},function(he){ae||(ae=!0,ce[ge]={status:"rejected",reason:he},--U||z(ce))})}),--U||z(ce)});return J.error&&W(J.value),L.promise}})},58085:(m,S,i)=>{"use strict";var r=i(90513),a=i(25401),f=i(61812),c=i(54256),e=i(26975),p=i(41605);r({target:"Promise",stat:!0,forced:i(95758)},{all:function(C){var R=this,L=c.f(R),z=L.resolve,W=L.reject,J=e(function(){var ee=f(R.resolve),ce=[],ie=0,U=1;p(C,function(se){var ge=ie++,ae=!1;U++,a(ee,R,se).then(function(he){ae||(ae=!0,ce[ge]=he,--U||z(ce))},W)}),--U||z(ce)});return J.error&&W(J.value),L.promise}})},98857:(m,S,i)=>{"use strict";var r=i(90513),a=i(25401),f=i(61812),c=i(7365),e=i(54256),p=i(26975),y=i(41605),T=i(95758),C="No one promise resolved";r({target:"Promise",stat:!0,forced:T},{any:function(L){var z=this,W=c("AggregateError"),J=e.f(z),ee=J.resolve,ce=J.reject,ie=p(function(){var U=f(z.resolve),se=[],ge=0,ae=1,he=!1;y(L,function(be){var we=ge++,ue=!1;ae++,a(U,z,be).then(function(st){ue||he||(he=!0,ee(st))},function(st){ue||he||(ue=!0,se[we]=st,--ae||ce(new W(se,C)))})}),--ae||ce(new W(se,C))});return ie.error&&ce(ie.value),J.promise}})},5846:(m,S,i)=>{"use strict";var r=i(90513),a=i(81124),f=i(9936).CONSTRUCTOR,c=i(46456),e=i(7365),p=i(52208),y=i(42915),T=c&&c.prototype;if(r({target:"Promise",proto:!0,forced:f,real:!0},{catch:function(R){return this.then(void 0,R)}}),!a&&p(c)){var C=e("Promise").prototype.catch;T.catch!==C&&y(T,"catch",C,{unsafe:!0})}},38206:(m,S,i)=>{"use strict";var Ei,mi,$r,r=i(90513),a=i(81124),f=i(3787),c=i(70009),e=i(25401),p=i(42915),y=i(54945),T=i(85681),C=i(58014),R=i(61812),L=i(52208),z=i(77293),W=i(54849),J=i(95869),ee=i(37352).set,ce=i(58991),ie=i(52912),U=i(26975),se=i(70918),ge=i(91093),ae=i(46456),he=i(9936),be=i(54256),we="Promise",ue=he.CONSTRUCTOR,st=he.REJECTION_EVENT,We=he.SUBCLASSING,Ve=ge.getterFor(we),Be=ge.set,xe=ae&&ae.prototype,je=ae,Ne=xe,Bt=c.TypeError,rt=c.document,en=c.process,Pt=be.f,Vt=Pt,hn=!!(rt&&rt.createEvent&&c.dispatchEvent),vn="unhandledrejection",Br=function(Kt){var un;return!(!z(Kt)||!L(un=Kt.then))&&un},Pn=function(Kt,un){var hr,Ki,ln,jn=un.value,Jn=1==un.state,Gn=Jn?Kt.ok:Kt.fail,Xr=Kt.resolve,Zi=Kt.reject,ii=Kt.domain;try{Gn?(Jn||(2===un.rejection&&_i(un),un.rejection=1),!0===Gn?hr=jn:(ii&&ii.enter(),hr=Gn(jn),ii&&(ii.exit(),ln=!0)),hr===Kt.promise?Zi(Bt("Promise-chain cycle")):(Ki=Br(hr))?e(Ki,hr,Xr,Zi):Xr(hr)):Zi(jn)}catch(Mn){ii&&!ln&&ii.exit(),Zi(Mn)}},Xn=function(Kt,un){Kt.notified||(Kt.notified=!0,ce(function(){for(var Jn,jn=Kt.reactions;Jn=jn.get();)Pn(Jn,Kt);Kt.notified=!1,un&&!Kt.rejection&&Qr(Kt)}))},dr=function(Kt,un,jn){var Jn,Gn;hn?((Jn=rt.createEvent("Event")).promise=un,Jn.reason=jn,Jn.initEvent(Kt,!1,!0),c.dispatchEvent(Jn)):Jn={promise:un,reason:jn},!st&&(Gn=c["on"+Kt])?Gn(Jn):Kt===vn&&ie("Unhandled promise rejection",jn)},Qr=function(Kt){e(ee,c,function(){var Gn,un=Kt.facade,jn=Kt.value;if(Ci(Kt)&&(Gn=U(function(){f?en.emit("unhandledRejection",jn,un):dr(vn,un,jn)}),Kt.rejection=f||Ci(Kt)?2:1,Gn.error))throw Gn.value})},Ci=function(Kt){return 1!==Kt.rejection&&!Kt.parent},_i=function(Kt){e(ee,c,function(){var un=Kt.facade;f?en.emit("rejectionHandled",un):dr("rejectionhandled",un,Kt.value)})},so=function(Kt,un,jn){return function(Jn){Kt(un,Jn,jn)}},Ro=function(Kt,un,jn){Kt.done||(Kt.done=!0,jn&&(Kt=jn),Kt.value=un,Kt.state=2,Xn(Kt,!0))},Sr=function(Kt,un,jn){if(!Kt.done){Kt.done=!0,jn&&(Kt=jn);try{if(Kt.facade===un)throw Bt("Promise can't be resolved itself");var Jn=Br(un);Jn?ce(function(){var Gn={done:!1};try{e(Jn,un,so(Sr,Gn,Kt),so(Ro,Gn,Kt))}catch(Xr){Ro(Gn,Xr,Kt)}}):(Kt.value=un,Kt.state=1,Xn(Kt,!1))}catch(Gn){Ro({done:!1},Gn,Kt)}}};if(ue&&(je=function(un){W(this,Ne),R(un),e(Ei,this);var jn=Ve(this);try{un(so(Sr,jn),so(Ro,jn))}catch(Jn){Ro(jn,Jn)}},(Ei=function(un){Be(this,{type:we,done:!1,notified:!1,parent:!1,reactions:new se,rejection:!1,state:0,value:void 0})}).prototype=p(Ne=je.prototype,"then",function(un,jn){var Jn=Ve(this),Gn=Pt(J(this,je));return Jn.parent=!0,Gn.ok=!L(un)||un,Gn.fail=L(jn)&&jn,Gn.domain=f?en.domain:void 0,0==Jn.state?Jn.reactions.add(Gn):ce(function(){Pn(Gn,Jn)}),Gn.promise}),mi=function(){var Kt=new Ei,un=Ve(Kt);this.promise=Kt,this.resolve=so(Sr,un),this.reject=so(Ro,un)},be.f=Pt=function(Kt){return Kt===je||void 0===Kt?new mi(Kt):Vt(Kt)},!a&&L(ae)&&xe!==Object.prototype)){$r=xe.then,We||p(xe,"then",function(un,jn){var Jn=this;return new je(function(Gn,Xr){e($r,Jn,Gn,Xr)}).then(un,jn)},{unsafe:!0});try{delete xe.constructor}catch(Kt){}y&&y(xe,Ne)}r({global:!0,constructor:!0,wrap:!0,forced:ue},{Promise:je}),T(je,we,!1,!0),C(we)},30185:(m,S,i)=>{"use strict";var r=i(90513),a=i(81124),f=i(46456),c=i(55756),e=i(7365),p=i(52208),y=i(95869),T=i(25524),C=i(42915),R=f&&f.prototype;if(r({target:"Promise",proto:!0,real:!0,forced:!!f&&c(function(){R.finally.call({then:function(){}},function(){})})},{finally:function(W){var J=y(this,e("Promise")),ee=p(W);return this.then(ee?function(ce){return T(J,W()).then(function(){return ce})}:W,ee?function(ce){return T(J,W()).then(function(){throw ce})}:W)}}),!a&&p(f)){var z=e("Promise").prototype.finally;R.finally!==z&&C(R,"finally",z,{unsafe:!0})}},66793:(m,S,i)=>{i(38206),i(58085),i(5846),i(44738),i(74767),i(4991)},44738:(m,S,i)=>{"use strict";var r=i(90513),a=i(25401),f=i(61812),c=i(54256),e=i(26975),p=i(41605);r({target:"Promise",stat:!0,forced:i(95758)},{race:function(C){var R=this,L=c.f(R),z=L.reject,W=e(function(){var J=f(R.resolve);p(C,function(ee){a(J,R,ee).then(L.resolve,z)})});return W.error&&z(W.value),L.promise}})},74767:(m,S,i)=>{"use strict";var r=i(90513),a=i(25401),f=i(54256);r({target:"Promise",stat:!0,forced:i(9936).CONSTRUCTOR},{reject:function(p){var y=f.f(this);return a(y.reject,void 0,p),y.promise}})},4991:(m,S,i)=>{"use strict";var r=i(90513),a=i(7365),f=i(81124),c=i(46456),e=i(9936).CONSTRUCTOR,p=i(25524),y=a("Promise"),T=f&&!e;r({target:"Promise",stat:!0,forced:f||e},{resolve:function(R){return p(T&&this===y?c:this,R)}})},19539:(m,S,i)=>{var r=i(90513),a=i(7365),f=i(2543),c=i(44197),e=i(54356),p=i(64562),y=i(77293),T=i(83272),C=i(55756),R=a("Reflect","construct"),L=Object.prototype,z=[].push,W=C(function(){function ce(){}return!(R(function(){},[],ce)instanceof ce)}),J=!C(function(){R(function(){})}),ee=W||J;r({target:"Reflect",stat:!0,forced:ee,sham:ee},{construct:function(ie,U){e(ie),p(U);var se=arguments.length<3?ie:e(arguments[2]);if(J&&!W)return R(ie,U,se);if(ie==se){switch(U.length){case 0:return new ie;case 1:return new ie(U[0]);case 2:return new ie(U[0],U[1]);case 3:return new ie(U[0],U[1],U[2]);case 4:return new ie(U[0],U[1],U[2],U[3])}var ge=[null];return f(z,ge,U),new(f(c,ie,ge))}var ae=se.prototype,he=T(y(ae)?ae:L),be=f(ie,he,U);return y(be)?be:he}})},60851:(m,S,i)=>{var r=i(90513),a=i(25401),f=i(77293),c=i(64562),e=i(27029),p=i(25525),y=i(31426);r({target:"Reflect",stat:!0},{get:function T(C,R){var z,W,L=arguments.length<3?C:arguments[2];return c(C)===L?C[R]:(z=p.f(C,R))?e(z)?z.value:void 0===z.get?void 0:a(z.get,L):f(W=y(C))?T(W,R,L):void 0}})},44864:()=>{},97764:(m,S,i)=>{"use strict";var r=i(90513),a=i(23634),f=i(56421),c=i(67917),e=i(41433),p=i(79668),y=a("".indexOf);r({target:"String",proto:!0,forced:!p("includes")},{includes:function(C){return!!~y(e(c(this)),e(f(C)),arguments.length>1?arguments[1]:void 0)}})},3934:(m,S,i)=>{"use strict";var r=i(61557).charAt,a=i(41433),f=i(91093),c=i(79077),e=i(28738),p="String Iterator",y=f.set,T=f.getterFor(p);c(String,"String",function(C){y(this,{type:p,string:a(C),index:0})},function(){var W,R=T(this),L=R.string,z=R.index;return z>=L.length?e(void 0,!0):(W=r(L,z),R.index+=W.length,e(W,!1))})},3588:(m,S,i)=>{i(90513)({target:"String",proto:!0},{repeat:i(53411)})},24655:(m,S,i)=>{"use strict";var ee,r=i(90513),a=i(64350),f=i(25525).f,c=i(48869),e=i(41433),p=i(56421),y=i(67917),T=i(79668),C=i(81124),R=a("".startsWith),L=a("".slice),z=Math.min,W=T("startsWith");r({target:"String",proto:!0,forced:!(!C&&!W&&(ee=f(String.prototype,"startsWith"),ee&&!ee.writable)||W)},{startsWith:function(ce){var ie=e(y(this));p(ce);var U=c(z(arguments.length>1?arguments[1]:void 0,ie.length)),se=e(ce);return R?R(ie,se,U):L(ie,U,U+se.length)===se}})},90451:(m,S,i)=>{"use strict";var r=i(90513),a=i(89858).trim;r({target:"String",proto:!0,forced:i(85462)("trim")},{trim:function(){return a(this)}})},16426:(m,S,i)=>{i(25374)("asyncIterator")},17858:(m,S,i)=>{"use strict";var r=i(90513),a=i(70009),f=i(25401),c=i(23634),e=i(81124),p=i(49642),y=i(98535),T=i(55756),C=i(80112),R=i(23336),L=i(64562),z=i(81010),W=i(62939),J=i(41433),ee=i(51361),ce=i(83272),ie=i(28474),U=i(51518),se=i(62469),ge=i(47238),ae=i(25525),he=i(48011),be=i(25913),we=i(25558),ue=i(42915),st=i(1707),We=i(64579),Ve=i(86066),Be=i(45599),xe=i(13708),je=i(91840),Ne=i(89734),Bt=i(25374),rt=i(56992),en=i(85681),Pt=i(91093),Vt=i(68607).forEach,hn=Ve("hidden"),vn="Symbol",mt="prototype",Nt=Pt.set,St=Pt.getterFor(vn),Yt=Object[mt],Fn=a.Symbol,pr=Fn&&Fn[mt],Ei=a.TypeError,mi=a.QObject,ur=ae.f,$r=he.f,Br=se.f,Pn=we.f,Xn=c([].push),dr=We("symbols"),Qr=We("op-symbols"),Ci=We("wks"),_i=!mi||!mi[mt]||!mi[mt].findChild,so=p&&T(function(){return 7!=ce($r({},"a",{get:function(){return $r(this,"a",{value:7}).a}})).a})?function(Zi,ii,hr){var Ki=ur(Yt,ii);Ki&&delete Yt[ii],$r(Zi,ii,hr),Ki&&Zi!==Yt&&$r(Yt,ii,Ki)}:$r,Ro=function(Zi,ii){var hr=dr[Zi]=ce(pr);return Nt(hr,{type:vn,tag:Zi,description:ii}),p||(hr.description=ii),hr},Sr=function(ii,hr,Ki){ii===Yt&&Sr(Qr,hr,Ki),L(ii);var ln=W(hr);return L(Ki),C(dr,ln)?(Ki.enumerable?(C(ii,hn)&&ii[hn][ln]&&(ii[hn][ln]=!1),Ki=ce(Ki,{enumerable:ee(0,!1)})):(C(ii,hn)||$r(ii,hn,ee(1,{})),ii[hn][ln]=!0),so(ii,ln,Ki)):$r(ii,ln,Ki)},Kt=function(ii,hr){L(ii);var Ki=z(hr),ln=ie(Ki).concat(Xr(Ki));return Vt(ln,function(Mn){(!p||f(jn,Ki,Mn))&&Sr(ii,Mn,Ki[Mn])}),ii},jn=function(ii){var hr=W(ii),Ki=f(Pn,this,hr);return!(this===Yt&&C(dr,hr)&&!C(Qr,hr))&&(!(Ki||!C(this,hr)||!C(dr,hr)||C(this,hn)&&this[hn][hr])||Ki)},Jn=function(ii,hr){var Ki=z(ii),ln=W(hr);if(Ki!==Yt||!C(dr,ln)||C(Qr,ln)){var Mn=ur(Ki,ln);return Mn&&C(dr,ln)&&!(C(Ki,hn)&&Ki[hn][ln])&&(Mn.enumerable=!0),Mn}},Gn=function(ii){var hr=Br(z(ii)),Ki=[];return Vt(hr,function(ln){!C(dr,ln)&&!C(Be,ln)&&Xn(Ki,ln)}),Ki},Xr=function(Zi){var ii=Zi===Yt,hr=Br(ii?Qr:z(Zi)),Ki=[];return Vt(hr,function(ln){C(dr,ln)&&(!ii||C(Yt,ln))&&Xn(Ki,dr[ln])}),Ki};y||(ue(pr=(Fn=function(){if(R(pr,this))throw Ei("Symbol is not a constructor");var ii=arguments.length&&void 0!==arguments[0]?J(arguments[0]):void 0,hr=xe(ii),Ki=function(ln){this===Yt&&f(Ki,Qr,ln),C(this,hn)&&C(this[hn],hr)&&(this[hn][hr]=!1),so(this,hr,ee(1,ln))};return p&&_i&&so(Yt,hr,{configurable:!0,set:Ki}),Ro(hr,ii)})[mt],"toString",function(){return St(this).tag}),ue(Fn,"withoutSetter",function(Zi){return Ro(xe(Zi),Zi)}),we.f=jn,he.f=Sr,be.f=Kt,ae.f=Jn,U.f=se.f=Gn,ge.f=Xr,Ne.f=function(Zi){return Ro(je(Zi),Zi)},p&&(st(pr,"description",{configurable:!0,get:function(){return St(this).description}}),e||ue(Yt,"propertyIsEnumerable",jn,{unsafe:!0}))),r({global:!0,constructor:!0,wrap:!0,forced:!y,sham:!y},{Symbol:Fn}),Vt(ie(Ci),function(Zi){Bt(Zi)}),r({target:vn,stat:!0,forced:!y},{useSetter:function(){_i=!0},useSimple:function(){_i=!1}}),r({target:"Object",stat:!0,forced:!y,sham:!p},{create:function(ii,hr){return void 0===hr?ce(ii):Kt(ce(ii),hr)},defineProperty:Sr,defineProperties:Kt,getOwnPropertyDescriptor:Jn}),r({target:"Object",stat:!0,forced:!y},{getOwnPropertyNames:Gn}),rt(),en(Fn,vn),Be[hn]=!0},1172:()=>{},12353:(m,S,i)=>{var r=i(90513),a=i(7365),f=i(80112),c=i(41433),e=i(64579),p=i(56709),y=e("string-to-symbol-registry"),T=e("symbol-to-string-registry");r({target:"Symbol",stat:!0,forced:!p},{for:function(C){var R=c(C);if(f(y,R))return y[R];var L=a("Symbol")(R);return y[R]=L,T[L]=R,L}})},99579:(m,S,i)=>{i(25374)("hasInstance")},41258:(m,S,i)=>{i(25374)("isConcatSpreadable")},2383:(m,S,i)=>{i(25374)("iterator")},56728:(m,S,i)=>{i(17858),i(12353),i(27632),i(75071),i(37764)},27632:(m,S,i)=>{var r=i(90513),a=i(80112),f=i(74717),c=i(7378),e=i(64579),p=i(56709),y=e("symbol-to-string-registry");r({target:"Symbol",stat:!0,forced:!p},{keyFor:function(C){if(!f(C))throw TypeError(c(C)+" is not a symbol");if(a(y,C))return y[C]}})},64776:(m,S,i)=>{i(25374)("matchAll")},44339:(m,S,i)=>{i(25374)("match")},88215:(m,S,i)=>{i(25374)("replace")},65389:(m,S,i)=>{i(25374)("search")},12733:(m,S,i)=>{i(25374)("species")},97977:(m,S,i)=>{i(25374)("split")},59792:(m,S,i)=>{var r=i(25374),a=i(56992);r("toPrimitive"),a()},60242:(m,S,i)=>{var r=i(7365),a=i(25374),f=i(85681);a("toStringTag"),f(r("Symbol"),"Symbol")},26291:(m,S,i)=>{i(25374)("unscopables")},67670:(m,S,i)=>{i(10901)},10509:(m,S,i)=>{"use strict";var r=i(90513),a=i(64902),f=i(60077).remove;r({target:"Map",proto:!0,real:!0,forced:!0},{deleteAll:function(){for(var y,e=a(this),p=!0,T=0,C=arguments.length;T<C;T++)y=f(e,arguments[T]),p=p&&y;return!!p}})},30887:(m,S,i)=>{"use strict";var r=i(90513),a=i(64902),f=i(60077),c=f.get,e=f.has,p=f.set;r({target:"Map",proto:!0,real:!0,forced:!0},{emplace:function(T,C){var L,z,R=a(this);return e(R,T)?(L=c(R,T),"update"in C&&(L=C.update(L,T,R),p(R,T,L)),L):(z=C.insert(T,R),p(R,T,z),z)}})},54547:(m,S,i)=>{"use strict";var r=i(90513),a=i(76781),f=i(64902),c=i(21515);r({target:"Map",proto:!0,real:!0,forced:!0},{every:function(p){var y=f(this),T=a(p,arguments.length>1?arguments[1]:void 0);return!1!==c(y,function(C,R){if(!T(C,R,y))return!1},!0)}})},68996:(m,S,i)=>{"use strict";var r=i(90513),a=i(76781),f=i(64902),c=i(60077),e=i(21515),p=c.Map,y=c.set;r({target:"Map",proto:!0,real:!0,forced:!0},{filter:function(C){var R=f(this),L=a(C,arguments.length>1?arguments[1]:void 0),z=new p;return e(R,function(W,J){L(W,J,R)&&y(z,J,W)}),z}})},60176:(m,S,i)=>{"use strict";var r=i(90513),a=i(76781),f=i(64902),c=i(21515);r({target:"Map",proto:!0,real:!0,forced:!0},{findKey:function(p){var y=f(this),T=a(p,arguments.length>1?arguments[1]:void 0),C=c(y,function(R,L){if(T(R,L,y))return{key:L}},!0);return C&&C.key}})},1530:(m,S,i)=>{"use strict";var r=i(90513),a=i(76781),f=i(64902),c=i(21515);r({target:"Map",proto:!0,real:!0,forced:!0},{find:function(p){var y=f(this),T=a(p,arguments.length>1?arguments[1]:void 0),C=c(y,function(R,L){if(T(R,L,y))return{value:R}},!0);return C&&C.value}})},78271:(m,S,i)=>{i(90513)({target:"Map",stat:!0,forced:!0},{from:i(83483)})},41554:(m,S,i)=>{"use strict";var r=i(90513),a=i(25401),f=i(23634),c=i(52208),e=i(61812),p=i(41605),y=i(60077).Map,T=f([].push);r({target:"Map",stat:!0,forced:!0},{groupBy:function(R,L){var W=new(c(this)?this:y);e(L);var J=e(W.has),ee=e(W.get),ce=e(W.set);return p(R,function(ie){var U=L(ie);a(J,W,U)?T(a(ee,W,U),ie):a(ce,W,U,[ie])}),W}})},41688:(m,S,i)=>{"use strict";var r=i(90513),a=i(29627),f=i(64902),c=i(21515);r({target:"Map",proto:!0,real:!0,forced:!0},{includes:function(p){return!0===c(f(this),function(y){if(a(y,p))return!0},!0)}})},92847:(m,S,i)=>{"use strict";var r=i(90513),a=i(25401),f=i(41605),c=i(52208),e=i(61812),p=i(60077).Map;r({target:"Map",stat:!0,forced:!0},{keyBy:function(T,C){var L=new(c(this)?this:p);e(C);var z=e(L.set);return f(T,function(W){a(z,L,C(W),W)}),L}})},17316:(m,S,i)=>{"use strict";var r=i(90513),a=i(64902),f=i(21515);r({target:"Map",proto:!0,real:!0,forced:!0},{keyOf:function(e){var p=f(a(this),function(y,T){if(y===e)return{key:T}},!0);return p&&p.key}})},58786:(m,S,i)=>{"use strict";var r=i(90513),a=i(76781),f=i(64902),c=i(60077),e=i(21515),p=c.Map,y=c.set;r({target:"Map",proto:!0,real:!0,forced:!0},{mapKeys:function(C){var R=f(this),L=a(C,arguments.length>1?arguments[1]:void 0),z=new p;return e(R,function(W,J){y(z,L(W,J,R),W)}),z}})},35517:(m,S,i)=>{"use strict";var r=i(90513),a=i(76781),f=i(64902),c=i(60077),e=i(21515),p=c.Map,y=c.set;r({target:"Map",proto:!0,real:!0,forced:!0},{mapValues:function(C){var R=f(this),L=a(C,arguments.length>1?arguments[1]:void 0),z=new p;return e(R,function(W,J){y(z,J,L(W,J,R))}),z}})},12783:(m,S,i)=>{"use strict";var r=i(90513),a=i(64902),f=i(41605),c=i(60077).set;r({target:"Map",proto:!0,real:!0,arity:1,forced:!0},{merge:function(p){for(var y=a(this),T=arguments.length,C=0;C<T;)f(arguments[C++],function(R,L){c(y,R,L)},{AS_ENTRIES:!0});return y}})},60854:(m,S,i)=>{i(90513)({target:"Map",stat:!0,forced:!0},{of:i(13067)})},69773:(m,S,i)=>{"use strict";var r=i(90513),a=i(61812),f=i(64902),c=i(21515),e=TypeError;r({target:"Map",proto:!0,real:!0,forced:!0},{reduce:function(y){var T=f(this),C=arguments.length<2,R=C?void 0:arguments[1];if(a(y),c(T,function(L,z){C?(C=!1,R=L):R=y(R,L,z,T)}),C)throw e("Reduce of empty map with no initial value");return R}})},22337:(m,S,i)=>{"use strict";var r=i(90513),a=i(76781),f=i(64902),c=i(21515);r({target:"Map",proto:!0,real:!0,forced:!0},{some:function(p){var y=f(this),T=a(p,arguments.length>1?arguments[1]:void 0);return!0===c(y,function(C,R){if(T(C,R,y))return!0},!0)}})},84131:(m,S,i)=>{"use strict";i(90513)({target:"Map",proto:!0,real:!0,name:"upsert",forced:!0},{updateOrInsert:i(57729)})},40199:(m,S,i)=>{"use strict";var r=i(90513),a=i(61812),f=i(64902),c=i(60077),e=TypeError,p=c.get,y=c.has,T=c.set;r({target:"Map",proto:!0,real:!0,forced:!0},{update:function(R,L){var z=f(this),W=arguments.length;a(L);var J=y(z,R);if(!J&&W<3)throw e("Updating absent value");var ee=J?p(z,R):a(W>2?arguments[2]:void 0)(R,z);return T(z,R,L(ee,R,z)),z}})},69046:(m,S,i)=>{"use strict";i(90513)({target:"Map",proto:!0,real:!0,forced:!0},{upsert:i(57729)})},61127:(m,S,i)=>{i(84798)},45975:(m,S,i)=>{i(98857)},93114:(m,S,i)=>{"use strict";var r=i(90513),a=i(54256),f=i(26975);r({target:"Promise",stat:!0,forced:!0},{try:function(c){var e=a.f(this),p=f(c);return(p.error?e.reject:e.resolve)(p.value),e.promise}})},55461:(m,S,i)=>{i(25374)("asyncDispose")},5737:(m,S,i)=>{i(25374)("dispose")},61652:(m,S,i)=>{var r=i(90513),a=i(7365),f=i(23634),c=a("Symbol"),e=c.keyFor,p=f(c.prototype.valueOf);r({target:"Symbol",stat:!0},{isRegistered:function(T){try{return void 0!==e(p(T))}catch(C){return!1}}})},90791:(m,S,i)=>{for(var r=i(90513),a=i(64579),f=i(7365),c=i(23634),e=i(74717),p=i(91840),y=f("Symbol"),T=y.isWellKnown,C=f("Object","getOwnPropertyNames"),R=c(y.prototype.valueOf),L=a("wks"),z=0,W=C(y),J=W.length;z<J;z++)try{var ee=W[z];e(y[ee])&&p(ee)}catch(ce){}r({target:"Symbol",stat:!0,forced:!0},{isWellKnown:function(ie){if(T&&T(ie))return!0;try{for(var U=R(ie),se=0,ge=C(L),ae=ge.length;se<ae;se++)if(L[ge[se]]==U)return!0}catch(he){}return!1}})},87097:(m,S,i)=>{i(25374)("matcher")},29559:(m,S,i)=>{i(25374)("metadataKey")},71985:(m,S,i)=>{i(25374)("metadata")},90212:(m,S,i)=>{i(25374)("observable")},93770:(m,S,i)=>{i(25374)("patternMatch")},47743:(m,S,i)=>{i(25374)("replaceAll")},33089:(m,S,i)=>{i(1285);var r=i(44125),a=i(70009),f=i(35329),c=i(65162),e=i(84394),y=i(91840)("toStringTag");for(var T in r){var C=a[T],R=C&&C.prototype;R&&f(R)!==y&&c(R,y,T),e[T]=e.Array}},94784:(m,S,i)=>{var r=i(90513),a=i(70009),c=i(53814)(a.setInterval,!0);r({global:!0,bind:!0,forced:a.setInterval!==c},{setInterval:c})},36445:(m,S,i)=>{var r=i(90513),a=i(70009),c=i(53814)(a.setTimeout,!0);r({global:!0,bind:!0,forced:a.setTimeout!==c},{setTimeout:c})},69280:(m,S,i)=>{i(94784),i(36445)},73842:(m,S,i)=>{"use strict";i(1285);var r=i(90513),a=i(70009),f=i(25401),c=i(23634),e=i(49642),p=i(54933),y=i(42915),T=i(1707),C=i(84604),R=i(85681),L=i(14554),z=i(91093),W=i(54849),J=i(52208),ee=i(80112),ce=i(76781),ie=i(35329),U=i(64562),se=i(77293),ge=i(41433),ae=i(83272),he=i(51361),be=i(88055),we=i(34014),ue=i(15086),st=i(91840),We=i(84865),Ve=st("iterator"),Be="URLSearchParams",xe=Be+"Iterator",je=z.set,Ne=z.getterFor(Be),Bt=z.getterFor(xe),rt=Object.getOwnPropertyDescriptor,en=function(ln){if(!e)return a[ln];var Mn=rt(a,ln);return Mn&&Mn.value},Pt=en("fetch"),Vt=en("Request"),hn=en("Headers"),vn=Vt&&Vt.prototype,mt=hn&&hn.prototype,Nt=a.RegExp,St=a.TypeError,Yt=a.decodeURIComponent,Fn=a.encodeURIComponent,pr=c("".charAt),Ei=c([].join),mi=c([].push),ur=c("".replace),$r=c([].shift),Br=c([].splice),Pn=c("".split),Xn=c("".slice),dr=/\+/g,Qr=Array(4),Ci=function(ln){return Qr[ln-1]||(Qr[ln-1]=Nt("((?:%[\\da-f]{2}){"+ln+"})","gi"))},_i=function(ln){try{return Yt(ln)}catch(Mn){return ln}},so=function(ln){var Mn=ur(ln,dr," "),Zn=4;try{return Yt(Mn)}catch(cn){for(;Zn;)Mn=ur(Mn,Ci(Zn--),_i);return Mn}},Ro=/[!'()~]|%20/g,Sr={"!":"%21","'":"%27","(":"%28",")":"%29","~":"%7E","%20":"+"},Kt=function(ln){return Sr[ln]},un=function(ln){return ur(Fn(ln),Ro,Kt)},jn=L(function(Mn,Zn){je(this,{type:xe,iterator:be(Ne(Mn).entries),kind:Zn})},"Iterator",function(){var Mn=Bt(this),Zn=Mn.kind,cn=Mn.iterator.next(),Sn=cn.value;return cn.done||(cn.value="keys"===Zn?Sn.key:"values"===Zn?Sn.value:[Sn.key,Sn.value]),cn},!0),Jn=function(ln){this.entries=[],this.url=null,void 0!==ln&&(se(ln)?this.parseObject(ln):this.parseQuery("string"==typeof ln?"?"===pr(ln,0)?Xn(ln,1):ln:ge(ln)))};Jn.prototype={type:Be,bindURL:function(ln){this.url=ln,this.update()},parseObject:function(ln){var Zn,cn,Sn,Or,ri,vi,Ui,Mn=we(ln);if(Mn)for(cn=(Zn=be(ln,Mn)).next;!(Sn=f(cn,Zn)).done;){if(Or=be(U(Sn.value)),(vi=f(ri=Or.next,Or)).done||(Ui=f(ri,Or)).done||!f(ri,Or).done)throw St("Expected sequence with length 2");mi(this.entries,{key:ge(vi.value),value:ge(Ui.value)})}else for(var ao in ln)ee(ln,ao)&&mi(this.entries,{key:ao,value:ge(ln[ao])})},parseQuery:function(ln){if(ln)for(var cn,Sn,Mn=Pn(ln,"&"),Zn=0;Zn<Mn.length;)(cn=Mn[Zn++]).length&&(Sn=Pn(cn,"="),mi(this.entries,{key:so($r(Sn)),value:so(Ei(Sn,"="))}))},serialize:function(){for(var cn,ln=this.entries,Mn=[],Zn=0;Zn<ln.length;)cn=ln[Zn++],mi(Mn,un(cn.key)+"="+un(cn.value));return Ei(Mn,"&")},update:function(){this.entries.length=0,this.parseQuery(this.url.query)},updateURL:function(){this.url&&this.url.update()}};var Gn=function(){W(this,Xr);var Mn=arguments.length>0?arguments[0]:void 0,Zn=je(this,new Jn(Mn));e||(this.length=Zn.entries.length)},Xr=Gn.prototype;if(C(Xr,{append:function(Mn,Zn){ue(arguments.length,2);var cn=Ne(this);mi(cn.entries,{key:ge(Mn),value:ge(Zn)}),e||this.length++,cn.updateURL()},delete:function(ln){ue(arguments.length,1);for(var Mn=Ne(this),Zn=Mn.entries,cn=ge(ln),Sn=0;Sn<Zn.length;)Zn[Sn].key===cn?Br(Zn,Sn,1):Sn++;e||(this.length=Zn.length),Mn.updateURL()},get:function(Mn){ue(arguments.length,1);for(var Zn=Ne(this).entries,cn=ge(Mn),Sn=0;Sn<Zn.length;Sn++)if(Zn[Sn].key===cn)return Zn[Sn].value;return null},getAll:function(Mn){ue(arguments.length,1);for(var Zn=Ne(this).entries,cn=ge(Mn),Sn=[],Or=0;Or<Zn.length;Or++)Zn[Or].key===cn&&mi(Sn,Zn[Or].value);return Sn},has:function(Mn){ue(arguments.length,1);for(var Zn=Ne(this).entries,cn=ge(Mn),Sn=0;Sn<Zn.length;)if(Zn[Sn++].key===cn)return!0;return!1},set:function(Mn,Zn){ue(arguments.length,1);for(var ao,cn=Ne(this),Sn=cn.entries,Or=!1,ri=ge(Mn),vi=ge(Zn),Ui=0;Ui<Sn.length;Ui++)(ao=Sn[Ui]).key===ri&&(Or?Br(Sn,Ui--,1):(Or=!0,ao.value=vi));Or||mi(Sn,{key:ri,value:vi}),e||(this.length=Sn.length),cn.updateURL()},sort:function(){var Mn=Ne(this);We(Mn.entries,function(Zn,cn){return Zn.key>cn.key?1:-1}),Mn.updateURL()},forEach:function(Mn){for(var Or,Zn=Ne(this).entries,cn=ce(Mn,arguments.length>1?arguments[1]:void 0),Sn=0;Sn<Zn.length;)cn((Or=Zn[Sn++]).value,Or.key,this)},keys:function(){return new jn(this,"keys")},values:function(){return new jn(this,"values")},entries:function(){return new jn(this,"entries")}},{enumerable:!0}),y(Xr,Ve,Xr.entries,{name:"entries"}),y(Xr,"toString",function(){return Ne(this).serialize()},{enumerable:!0}),e&&T(Xr,"size",{get:function(){return Ne(this).entries.length},configurable:!0,enumerable:!0}),R(Gn,Be),r({global:!0,constructor:!0,forced:!p},{URLSearchParams:Gn}),!p&&J(hn)){var Zi=c(mt.has),ii=c(mt.set),hr=function(ln){if(se(ln)){var Zn,Mn=ln.body;if(ie(Mn)===Be)return Zn=ln.headers?new hn(ln.headers):new hn,Zi(Zn,"content-type")||ii(Zn,"content-type","application/x-www-form-urlencoded;charset=UTF-8"),ae(ln,{body:he(0,ge(Mn)),headers:he(0,Zn)})}return ln};if(J(Pt)&&r({global:!0,enumerable:!0,dontCallGetSet:!0,forced:!0},{fetch:function(Mn){return Pt(Mn,arguments.length>1?hr(arguments[1]):{})}}),J(Vt)){var Ki=function(Mn){return W(this,vn),new Vt(Mn,arguments.length>1?hr(arguments[1]):{})};vn.constructor=Ki,Ki.prototype=vn,r({global:!0,constructor:!0,dontCallGetSet:!0,forced:!0},{Request:Ki})}}m.exports={URLSearchParams:Gn,getState:Ne}},26953:(m,S,i)=>{i(73842)},86023:()=>{},80504:(m,S,i)=>{"use strict";i(3934);var Ro,r=i(90513),a=i(49642),f=i(54933),c=i(70009),e=i(76781),p=i(23634),y=i(42915),T=i(1707),C=i(54849),R=i(80112),L=i(75791),z=i(51923),W=i(8681),J=i(61557).codeAt,ee=i(26662),ce=i(41433),ie=i(85681),U=i(15086),se=i(73842),ge=i(91093),ae=ge.set,he=ge.getterFor("URL"),be=se.URLSearchParams,we=se.getState,ue=c.URL,st=c.TypeError,We=c.parseInt,Ve=Math.floor,Be=Math.pow,xe=p("".charAt),je=p(/./.exec),Ne=p([].join),Bt=p(1..toString),rt=p([].pop),en=p([].push),Pt=p("".replace),Vt=p([].shift),hn=p("".split),vn=p("".slice),mt=p("".toLowerCase),Nt=p([].unshift),Yt="Invalid scheme",Fn="Invalid host",pr="Invalid port",Ei=/[a-z]/i,mi=/[\d+-.a-z]/i,ur=/\d/,$r=/^0x/i,Br=/^[0-7]+$/,Pn=/^\d+$/,Xn=/^[\da-f]+$/i,dr=/[\0\t\n\r #%/:<>?@[\\\]^|]/,Qr=/[\0\t\n\r #/:<>?@[\\\]^|]/,Ci=/^[\u0000-\u0020]+/,_i=/(^|[^\u0000-\u0020])[\u0000-\u0020]+$/,so=/[\t\n\r]/g,jn=function(qn){var ei,wn,Qn,Fr;if("number"==typeof qn){for(ei=[],wn=0;wn<4;wn++)Nt(ei,qn%256),qn=Ve(qn/256);return Ne(ei,".")}if("object"==typeof qn){for(ei="",Qn=function(qn){for(var ei=null,wn=1,Qn=null,Fr=0,oo=0;oo<8;oo++)0!==qn[oo]?(Fr>wn&&(ei=Qn,wn=Fr),Qn=null,Fr=0):(null===Qn&&(Qn=oo),++Fr);return Fr>wn&&(ei=Qn,wn=Fr),ei}(qn),wn=0;wn<8;wn++)Fr&&0===qn[wn]||(Fr&&(Fr=!1),Qn===wn?(ei+=wn?":":"::",Fr=!0):(ei+=Bt(qn[wn],16),wn<7&&(ei+=":")));return"["+ei+"]"}return qn},Jn={},Gn=L({},Jn,{" ":1,'"':1,"<":1,">":1,"`":1}),Xr=L({},Gn,{"#":1,"?":1,"{":1,"}":1}),Zi=L({},Xr,{"/":1,":":1,";":1,"=":1,"@":1,"[":1,"\\":1,"]":1,"^":1,"|":1}),ii=function(qn,ei){var wn=J(qn,0);return wn>32&&wn<127&&!R(ei,qn)?qn:encodeURIComponent(qn)},hr={ftp:21,file:null,http:80,https:443,ws:80,wss:443},Ki=function(qn,ei){var wn;return 2==qn.length&&je(Ei,xe(qn,0))&&(":"==(wn=xe(qn,1))||!ei&&"|"==wn)},ln=function(qn){var ei;return qn.length>1&&Ki(vn(qn,0,2))&&(2==qn.length||"/"===(ei=xe(qn,2))||"\\"===ei||"?"===ei||"#"===ei)},Mn=function(qn){return"."===qn||"%2e"===mt(qn)},Zn=function(qn){return".."===(qn=mt(qn))||"%2e."===qn||".%2e"===qn||"%2e%2e"===qn},cn={},Sn={},Or={},ri={},vi={},Ui={},ao={},dt={},Bi={},to={},Gt={},Rn={},_t={},Rt={},ct={},pt={},kt={},dn={},mr={},Oi={},di={},Uo=function(qn,ei,wn){var Fr,oo,Li,Qn=ce(qn);if(ei){if(oo=this.parse(Qn))throw st(oo);this.searchParams=null}else{if(void 0!==wn&&(Fr=new Uo(wn,!0)),oo=this.parse(Qn,null,Fr))throw st(oo);(Li=we(new be)).bindURL(this),this.searchParams=Li}};Uo.prototype={type:"URL",parse:function(qn,ei,wn){var ua,er,vr,yr,Qn=this,Fr=ei||cn,oo=0,Li="",yo=!1,go=!1,Go=!1;for(qn=ce(qn),ei||(Qn.scheme="",Qn.username="",Qn.password="",Qn.host=null,Qn.port=null,Qn.path=[],Qn.query=null,Qn.fragment=null,Qn.cannotBeABaseURL=!1,qn=Pt(qn,Ci,""),qn=Pt(qn,_i,"$1")),qn=Pt(qn,so,""),ua=z(qn);oo<=ua.length;){switch(er=ua[oo],Fr){case cn:if(!er||!je(Ei,er)){if(ei)return Yt;Fr=Or;continue}Li+=mt(er),Fr=Sn;break;case Sn:if(er&&(je(mi,er)||"+"==er||"-"==er||"."==er))Li+=mt(er);else{if(":"!=er){if(ei)return Yt;Li="",Fr=Or,oo=0;continue}if(ei&&(Qn.isSpecial()!=R(hr,Li)||"file"==Li&&(Qn.includesCredentials()||null!==Qn.port)||"file"==Qn.scheme&&!Qn.host))return;if(Qn.scheme=Li,ei)return void(Qn.isSpecial()&&hr[Qn.scheme]==Qn.port&&(Qn.port=null));Li="","file"==Qn.scheme?Fr=Rt:Qn.isSpecial()&&wn&&wn.scheme==Qn.scheme?Fr=ri:Qn.isSpecial()?Fr=dt:"/"==ua[oo+1]?(Fr=vi,oo++):(Qn.cannotBeABaseURL=!0,en(Qn.path,""),Fr=mr)}break;case Or:if(!wn||wn.cannotBeABaseURL&&"#"!=er)return Yt;if(wn.cannotBeABaseURL&&"#"==er){Qn.scheme=wn.scheme,Qn.path=W(wn.path),Qn.query=wn.query,Qn.fragment="",Qn.cannotBeABaseURL=!0,Fr=di;break}Fr="file"==wn.scheme?Rt:Ui;continue;case ri:if("/"!=er||"/"!=ua[oo+1]){Fr=Ui;continue}Fr=Bi,oo++;break;case vi:if("/"==er){Fr=to;break}Fr=dn;continue;case Ui:if(Qn.scheme=wn.scheme,er==Ro)Qn.username=wn.username,Qn.password=wn.password,Qn.host=wn.host,Qn.port=wn.port,Qn.path=W(wn.path),Qn.query=wn.query;else if("/"==er||"\\"==er&&Qn.isSpecial())Fr=ao;else if("?"==er)Qn.username=wn.username,Qn.password=wn.password,Qn.host=wn.host,Qn.port=wn.port,Qn.path=W(wn.path),Qn.query="",Fr=Oi;else{if("#"!=er){Qn.username=wn.username,Qn.password=wn.password,Qn.host=wn.host,Qn.port=wn.port,Qn.path=W(wn.path),Qn.path.length--,Fr=dn;continue}Qn.username=wn.username,Qn.password=wn.password,Qn.host=wn.host,Qn.port=wn.port,Qn.path=W(wn.path),Qn.query=wn.query,Qn.fragment="",Fr=di}break;case ao:if(!Qn.isSpecial()||"/"!=er&&"\\"!=er){if("/"!=er){Qn.username=wn.username,Qn.password=wn.password,Qn.host=wn.host,Qn.port=wn.port,Fr=dn;continue}Fr=to}else Fr=Bi;break;case dt:if(Fr=Bi,"/"!=er||"/"!=xe(Li,oo+1))continue;oo++;break;case Bi:if("/"!=er&&"\\"!=er){Fr=to;continue}break;case to:if("@"==er){yo&&(Li="%40"+Li),yo=!0,vr=z(Li);for(var or=0;or<vr.length;or++){var si=vr[or];if(":"!=si||Go){var pn=ii(si,Zi);Go?Qn.password+=pn:Qn.username+=pn}else Go=!0}Li=""}else if(er==Ro||"/"==er||"?"==er||"#"==er||"\\"==er&&Qn.isSpecial()){if(yo&&""==Li)return"Invalid authority";oo-=z(Li).length+1,Li="",Fr=Gt}else Li+=er;break;case Gt:case Rn:if(ei&&"file"==Qn.scheme){Fr=pt;continue}if(":"!=er||go){if(er==Ro||"/"==er||"?"==er||"#"==er||"\\"==er&&Qn.isSpecial()){if(Qn.isSpecial()&&""==Li)return Fn;if(ei&&""==Li&&(Qn.includesCredentials()||null!==Qn.port))return;if(yr=Qn.parseHost(Li))return yr;if(Li="",Fr=kt,ei)return;continue}"["==er?go=!0:"]"==er&&(go=!1),Li+=er}else{if(""==Li)return Fn;if(yr=Qn.parseHost(Li))return yr;if(Li="",Fr=_t,ei==Rn)return}break;case _t:if(!je(ur,er)){if(er==Ro||"/"==er||"?"==er||"#"==er||"\\"==er&&Qn.isSpecial()||ei){if(""!=Li){var xn=We(Li,10);if(xn>65535)return pr;Qn.port=Qn.isSpecial()&&xn===hr[Qn.scheme]?null:xn,Li=""}if(ei)return;Fr=kt;continue}return pr}Li+=er;break;case Rt:if(Qn.scheme="file","/"==er||"\\"==er)Fr=ct;else{if(!wn||"file"!=wn.scheme){Fr=dn;continue}if(er==Ro)Qn.host=wn.host,Qn.path=W(wn.path),Qn.query=wn.query;else if("?"==er)Qn.host=wn.host,Qn.path=W(wn.path),Qn.query="",Fr=Oi;else{if("#"!=er){ln(Ne(W(ua,oo),""))||(Qn.host=wn.host,Qn.path=W(wn.path),Qn.shortenPath()),Fr=dn;continue}Qn.host=wn.host,Qn.path=W(wn.path),Qn.query=wn.query,Qn.fragment="",Fr=di}}break;case ct:if("/"==er||"\\"==er){Fr=pt;break}wn&&"file"==wn.scheme&&!ln(Ne(W(ua,oo),""))&&(Ki(wn.path[0],!0)?en(Qn.path,wn.path[0]):Qn.host=wn.host),Fr=dn;continue;case pt:if(er==Ro||"/"==er||"\\"==er||"?"==er||"#"==er){if(!ei&&Ki(Li))Fr=dn;else if(""==Li){if(Qn.host="",ei)return;Fr=kt}else{if(yr=Qn.parseHost(Li))return yr;if("localhost"==Qn.host&&(Qn.host=""),ei)return;Li="",Fr=kt}continue}Li+=er;break;case kt:if(Qn.isSpecial()){if(Fr=dn,"/"!=er&&"\\"!=er)continue}else if(ei||"?"!=er)if(ei||"#"!=er){if(er!=Ro&&(Fr=dn,"/"!=er))continue}else Qn.fragment="",Fr=di;else Qn.query="",Fr=Oi;break;case dn:if(er==Ro||"/"==er||"\\"==er&&Qn.isSpecial()||!ei&&("?"==er||"#"==er)){if(Zn(Li)?(Qn.shortenPath(),"/"!=er&&!("\\"==er&&Qn.isSpecial())&&en(Qn.path,"")):Mn(Li)?"/"!=er&&!("\\"==er&&Qn.isSpecial())&&en(Qn.path,""):("file"==Qn.scheme&&!Qn.path.length&&Ki(Li)&&(Qn.host&&(Qn.host=""),Li=xe(Li,0)+":"),en(Qn.path,Li)),Li="","file"==Qn.scheme&&(er==Ro||"?"==er||"#"==er))for(;Qn.path.length>1&&""===Qn.path[0];)Vt(Qn.path);"?"==er?(Qn.query="",Fr=Oi):"#"==er&&(Qn.fragment="",Fr=di)}else Li+=ii(er,Xr);break;case mr:"?"==er?(Qn.query="",Fr=Oi):"#"==er?(Qn.fragment="",Fr=di):er!=Ro&&(Qn.path[0]+=ii(er,Jn));break;case Oi:ei||"#"!=er?er!=Ro&&("'"==er&&Qn.isSpecial()?Qn.query+="%27":Qn.query+="#"==er?"%23":ii(er,Jn)):(Qn.fragment="",Fr=di);break;case di:er!=Ro&&(Qn.fragment+=ii(er,Gn))}oo++}},parseHost:function(qn){var ei,wn,Qn;if("["==xe(qn,0)){if("]"!=xe(qn,qn.length-1)||(ei=function(qn){var oo,Li,yo,go,Go,ua,er,ei=[0,0,0,0,0,0,0,0],wn=0,Qn=null,Fr=0,vr=function(){return xe(qn,Fr)};if(":"==vr()){if(":"!=xe(qn,1))return;Fr+=2,Qn=++wn}for(;vr();){if(8==wn)return;if(":"!=vr()){for(oo=Li=0;Li<4&&je(Xn,vr());)oo=16*oo+We(vr(),16),Fr++,Li++;if("."==vr()){if(0==Li||(Fr-=Li,wn>6))return;for(yo=0;vr();){if(go=null,yo>0){if(!("."==vr()&&yo<4))return;Fr++}if(!je(ur,vr()))return;for(;je(ur,vr());){if(Go=We(vr(),10),null===go)go=Go;else{if(0==go)return;go=10*go+Go}if(go>255)return;Fr++}ei[wn]=256*ei[wn]+go,(2==++yo||4==yo)&&wn++}if(4!=yo)return;break}if(":"==vr()){if(Fr++,!vr())return}else if(vr())return;ei[wn++]=oo}else{if(null!==Qn)return;Fr++,Qn=++wn}}if(null!==Qn)for(ua=wn-Qn,wn=7;0!=wn&&ua>0;)er=ei[wn],ei[wn--]=ei[Qn+ua-1],ei[Qn+--ua]=er;else if(8!=wn)return;return ei}(vn(qn,1,-1)),!ei))return Fn;this.host=ei}else if(this.isSpecial()){if(qn=ee(qn),je(dr,qn)||(ei=function(qn){var wn,Qn,Fr,oo,Li,yo,go,ei=hn(qn,".");if(ei.length&&""==ei[ei.length-1]&&ei.length--,(wn=ei.length)>4)return qn;for(Qn=[],Fr=0;Fr<wn;Fr++){if(""==(oo=ei[Fr]))return qn;if(Li=10,oo.length>1&&"0"==xe(oo,0)&&(Li=je($r,oo)?16:8,oo=vn(oo,8==Li?1:2)),""===oo)yo=0;else{if(!je(10==Li?Pn:8==Li?Br:Xn,oo))return qn;yo=We(oo,Li)}en(Qn,yo)}for(Fr=0;Fr<wn;Fr++)if(yo=Qn[Fr],Fr==wn-1){if(yo>=Be(256,5-wn))return null}else if(yo>255)return null;for(go=rt(Qn),Fr=0;Fr<Qn.length;Fr++)go+=Qn[Fr]*Be(256,3-Fr);return go}(qn),null===ei))return Fn;this.host=ei}else{if(je(Qr,qn))return Fn;for(ei="",wn=z(qn),Qn=0;Qn<wn.length;Qn++)ei+=ii(wn[Qn],Jn);this.host=ei}},cannotHaveUsernamePasswordPort:function(){return!this.host||this.cannotBeABaseURL||"file"==this.scheme},includesCredentials:function(){return""!=this.username||""!=this.password},isSpecial:function(){return R(hr,this.scheme)},shortenPath:function(){var qn=this.path,ei=qn.length;ei&&("file"!=this.scheme||1!=ei||!Ki(qn[0],!0))&&qn.length--},serialize:function(){var qn=this,ei=qn.scheme,wn=qn.username,Qn=qn.password,Fr=qn.host,oo=qn.port,Li=qn.path,yo=qn.query,go=qn.fragment,Go=ei+":";return null!==Fr?(Go+="//",qn.includesCredentials()&&(Go+=wn+(Qn?":"+Qn:"")+"@"),Go+=jn(Fr),null!==oo&&(Go+=":"+oo)):"file"==ei&&(Go+="//"),Go+=qn.cannotBeABaseURL?Li[0]:Li.length?"/"+Ne(Li,"/"):"",null!==yo&&(Go+="?"+yo),null!==go&&(Go+="#"+go),Go},setHref:function(qn){var ei=this.parse(qn);if(ei)throw st(ei);this.searchParams.update()},getOrigin:function(){var qn=this.scheme,ei=this.port;if("blob"==qn)try{return new Qo(qn.path[0]).origin}catch(wn){return"null"}return"file"!=qn&&this.isSpecial()?qn+"://"+jn(this.host)+(null!==ei?":"+ei:""):"null"},getProtocol:function(){return this.scheme+":"},setProtocol:function(qn){this.parse(ce(qn)+":",cn)},getUsername:function(){return this.username},setUsername:function(qn){var ei=z(ce(qn));if(!this.cannotHaveUsernamePasswordPort()){this.username="";for(var wn=0;wn<ei.length;wn++)this.username+=ii(ei[wn],Zi)}},getPassword:function(){return this.password},setPassword:function(qn){var ei=z(ce(qn));if(!this.cannotHaveUsernamePasswordPort()){this.password="";for(var wn=0;wn<ei.length;wn++)this.password+=ii(ei[wn],Zi)}},getHost:function(){var qn=this.host,ei=this.port;return null===qn?"":null===ei?jn(qn):jn(qn)+":"+ei},setHost:function(qn){this.cannotBeABaseURL||this.parse(qn,Gt)},getHostname:function(){var qn=this.host;return null===qn?"":jn(qn)},setHostname:function(qn){this.cannotBeABaseURL||this.parse(qn,Rn)},getPort:function(){var qn=this.port;return null===qn?"":ce(qn)},setPort:function(qn){this.cannotHaveUsernamePasswordPort()||(""==(qn=ce(qn))?this.port=null:this.parse(qn,_t))},getPathname:function(){var qn=this.path;return this.cannotBeABaseURL?qn[0]:qn.length?"/"+Ne(qn,"/"):""},setPathname:function(qn){this.cannotBeABaseURL||(this.path=[],this.parse(qn,kt))},getSearch:function(){var qn=this.query;return qn?"?"+qn:""},setSearch:function(qn){""==(qn=ce(qn))?this.query=null:("?"==xe(qn,0)&&(qn=vn(qn,1)),this.query="",this.parse(qn,Oi)),this.searchParams.update()},getSearchParams:function(){return this.searchParams.facade},getHash:function(){var qn=this.fragment;return qn?"#"+qn:""},setHash:function(qn){""!=(qn=ce(qn))?("#"==xe(qn,0)&&(qn=vn(qn,1)),this.fragment="",this.parse(qn,di)):this.fragment=null},update:function(){this.query=this.searchParams.serialize()||null}};var Qo=function(ei){var wn=C(this,lo),Qn=U(arguments.length,1)>1?arguments[1]:void 0,Fr=ae(wn,new Uo(ei,!1,Qn));a||(wn.href=Fr.serialize(),wn.origin=Fr.getOrigin(),wn.protocol=Fr.getProtocol(),wn.username=Fr.getUsername(),wn.password=Fr.getPassword(),wn.host=Fr.getHost(),wn.hostname=Fr.getHostname(),wn.port=Fr.getPort(),wn.pathname=Fr.getPathname(),wn.search=Fr.getSearch(),wn.searchParams=Fr.getSearchParams(),wn.hash=Fr.getHash())},lo=Qo.prototype,Ai=function(qn,ei){return{get:function(){return he(this)[qn]()},set:ei&&function(wn){return he(this)[ei](wn)},configurable:!0,enumerable:!0}};if(a&&(T(lo,"href",Ai("serialize","setHref")),T(lo,"origin",Ai("getOrigin")),T(lo,"protocol",Ai("getProtocol","setProtocol")),T(lo,"username",Ai("getUsername","setUsername")),T(lo,"password",Ai("getPassword","setPassword")),T(lo,"host",Ai("getHost","setHost")),T(lo,"hostname",Ai("getHostname","setHostname")),T(lo,"port",Ai("getPort","setPort")),T(lo,"pathname",Ai("getPathname","setPathname")),T(lo,"search",Ai("getSearch","setSearch")),T(lo,"searchParams",Ai("getSearchParams")),T(lo,"hash",Ai("getHash","setHash"))),y(lo,"toJSON",function(){return he(this).serialize()},{enumerable:!0}),y(lo,"toString",function(){return he(this).serialize()},{enumerable:!0}),ue){var Fo=ue.createObjectURL,Ko=ue.revokeObjectURL;Fo&&y(Qo,"createObjectURL",e(Fo,ue)),Ko&&y(Qo,"revokeObjectURL",e(Ko,ue))}ie(Qo,"URL"),r({global:!0,constructor:!0,forced:!f,sham:!a},{URL:Qo})},95981:(m,S,i)=>{i(80504)},71324:()=>{},75242:(m,S,i)=>{var r=i(74771);m.exports=r},10323:(m,S,i)=>{var r=i(8412);m.exports=r},99940:(m,S,i)=>{var r=i(399);m.exports=r},89919:(m,S,i)=>{var r=i(98812);m.exports=r},14869:(m,S,i)=>{var r=i(33195);m.exports=r},4475:(m,S,i)=>{var r=i(46332);m.exports=r},38762:(m,S,i)=>{var r=i(42618);m.exports=r},8748:(m,S,i)=>{var r=i(63791);i(33089),m.exports=r},71873:(m,S,i)=>{var r=i(69029);m.exports=r},61599:(m,S,i)=>{var r=i(28924);m.exports=r},34097:(m,S,i)=>{i(33089);var r=i(35329),a=i(80112),f=i(23336),c=i(99940),e=Array.prototype,p={DOMTokenList:!0,NodeList:!0};m.exports=function(y){var T=y.entries;return y===e||f(e,y)&&T===e.entries||a(p,r(y))?c:T}},15149:(m,S,i)=>{var r=i(98709);m.exports=r},83361:(m,S,i)=>{var r=i(65991);m.exports=r},19095:(m,S,i)=>{var r=i(64158);m.exports=r},71420:(m,S,i)=>{var r=i(91799);m.exports=r},13178:(m,S,i)=>{var r=i(26155);m.exports=r},52049:(m,S,i)=>{i(33089);var r=i(35329),a=i(80112),f=i(23336),c=i(89919),e=Array.prototype,p={DOMTokenList:!0,NodeList:!0};m.exports=function(y){var T=y.forEach;return y===e||f(e,y)&&T===e.forEach||a(p,r(y))?c:T}},83655:(m,S,i)=>{var r=i(33758);m.exports=r},87054:(m,S,i)=>{var r=i(7592);m.exports=r},51946:(m,S,i)=>{i(33089);var r=i(35329),a=i(80112),f=i(23336),c=i(14869),e=Array.prototype,p={DOMTokenList:!0,NodeList:!0};m.exports=function(y){var T=y.keys;return y===e||f(e,y)&&T===e.keys||a(p,r(y))?c:T}},40764:(m,S,i)=>{var r=i(17480);m.exports=r},81214:(m,S,i)=>{var r=i(20681);m.exports=r},50881:(m,S,i)=>{var r=i(90949);m.exports=r},38813:(m,S,i)=>{var r=i(99316);m.exports=r},45284:(m,S,i)=>{var r=i(62212);m.exports=r},70157:(m,S,i)=>{var r=i(49073);m.exports=r},3502:(m,S,i)=>{var r=i(24146);m.exports=r},81610:(m,S,i)=>{var r=i(40104);m.exports=r},19543:(m,S,i)=>{var r=i(3555);m.exports=r},74046:(m,S,i)=>{var r=i(68333);m.exports=r},13731:(m,S,i)=>{var r=i(65786);m.exports=r},80129:(m,S,i)=>{i(33089);var r=i(35329),a=i(80112),f=i(23336),c=i(4475),e=Array.prototype,p={DOMTokenList:!0,NodeList:!0};m.exports=function(y){var T=y.values;return y===e||f(e,y)&&T===e.values||a(p,r(y))?c:T}},43720:(m,S,i)=>{var r=i(66306);m.exports=r},640:(m,S,i)=>{var r=i(31845);i(33089),m.exports=r},50320:(m,S,i)=>{var r=i(44168);m.exports=r},93006:(m,S,i)=>{var r=i(25852);m.exports=r},36226:(m,S,i)=>{var r=i(24457);m.exports=r},21968:(m,S,i)=>{var r=i(99671);m.exports=r},87259:(m,S,i)=>{var r=i(38007);m.exports=r},62021:(m,S,i)=>{var r=i(57432);m.exports=r},57682:(m,S,i)=>{var r=i(36541);m.exports=r},94222:(m,S,i)=>{var r=i(17303);m.exports=r},1162:(m,S,i)=>{var r=i(62149);m.exports=r},82805:(m,S,i)=>{var r=i(86537);m.exports=r},70809:(m,S,i)=>{var r=i(79553);m.exports=r},26498:(m,S,i)=>{var r=i(80092);i(33089),m.exports=r},44850:(m,S,i)=>{var r=i(472);m.exports=r},9634:(m,S,i)=>{var r=i(4678);m.exports=r},12118:(m,S,i)=>{i(69280);var r=i(13544);m.exports=r.setTimeout},96551:(m,S,i)=>{var r=i(61697);i(33089),m.exports=r},98908:(m,S,i)=>{var r=i(42497);i(33089),m.exports=r},55434:(m,S,i)=>{var r=i(50681);m.exports=r},70906:(m,S,i)=>{var r=i(75081);m.exports=r},75081:(m,S,i)=>{i(95981),i(71324),i(26953),i(86023);var r=i(13544);m.exports=r.URL},71577:function(){var m;m="undefined"!=typeof self?self:this,function(i){var r_searchParams="URLSearchParams"in m,r_iterable="Symbol"in m&&"iterator"in Symbol,r_blob="FileReader"in m&&"Blob"in m&&function(){try{return new Blob,!0}catch(we){return!1}}(),r_formData="FormData"in m,r_arrayBuffer="ArrayBuffer"in m;if(r_arrayBuffer)var f=["[object Int8Array]","[object Uint8Array]","[object Uint8ClampedArray]","[object Int16Array]","[object Uint16Array]","[object Int32Array]","[object Uint32Array]","[object Float32Array]","[object Float64Array]"],c=ArrayBuffer.isView||function(we){return we&&f.indexOf(Object.prototype.toString.call(we))>-1};function e(we){if("string"!=typeof we&&(we=String(we)),/[^a-z0-9\-#$%&'*+.^_`|~]/i.test(we))throw new TypeError("Invalid character in header field name");return we.toLowerCase()}function p(we){return"string"!=typeof we&&(we=String(we)),we}function y(we){var ue={next:function(){var st=we.shift();return{done:void 0===st,value:st}}};return r_iterable&&(ue[Symbol.iterator]=function(){return ue}),ue}function T(we){this.map={},we instanceof T?we.forEach(function(ue,st){this.append(st,ue)},this):Array.isArray(we)?we.forEach(function(ue){this.append(ue[0],ue[1])},this):we&&Object.getOwnPropertyNames(we).forEach(function(ue){this.append(ue,we[ue])},this)}function C(we){if(we.bodyUsed)return Promise.reject(new TypeError("Already read"));we.bodyUsed=!0}function R(we){return new Promise(function(ue,st){we.onload=function(){ue(we.result)},we.onerror=function(){st(we.error)}})}function L(we){var ue=new FileReader,st=R(ue);return ue.readAsArrayBuffer(we),st}function J(we){if(we.slice)return we.slice(0);var ue=new Uint8Array(we.byteLength);return ue.set(new Uint8Array(we)),ue.buffer}function ee(){return this.bodyUsed=!1,this._initBody=function(we){this._bodyInit=we,we?"string"==typeof we?this._bodyText=we:r_blob&&Blob.prototype.isPrototypeOf(we)?this._bodyBlob=we:r_formData&&FormData.prototype.isPrototypeOf(we)?this._bodyFormData=we:r_searchParams&&URLSearchParams.prototype.isPrototypeOf(we)?this._bodyText=we.toString():r_arrayBuffer&&r_blob&&function a(we){return we&&DataView.prototype.isPrototypeOf(we)}(we)?(this._bodyArrayBuffer=J(we.buffer),this._bodyInit=new Blob([this._bodyArrayBuffer])):r_arrayBuffer&&(ArrayBuffer.prototype.isPrototypeOf(we)||c(we))?this._bodyArrayBuffer=J(we):this._bodyText=we=Object.prototype.toString.call(we):this._bodyText="",this.headers.get("content-type")||("string"==typeof we?this.headers.set("content-type","text/plain;charset=UTF-8"):this._bodyBlob&&this._bodyBlob.type?this.headers.set("content-type",this._bodyBlob.type):r_searchParams&&URLSearchParams.prototype.isPrototypeOf(we)&&this.headers.set("content-type","application/x-www-form-urlencoded;charset=UTF-8"))},r_blob&&(this.blob=function(){var we=C(this);if(we)return we;if(this._bodyBlob)return Promise.resolve(this._bodyBlob);if(this._bodyArrayBuffer)return Promise.resolve(new Blob([this._bodyArrayBuffer]));if(this._bodyFormData)throw new Error("could not read FormData body as blob");return Promise.resolve(new Blob([this._bodyText]))},this.arrayBuffer=function(){return this._bodyArrayBuffer?C(this)||Promise.resolve(this._bodyArrayBuffer):this.blob().then(L)}),this.text=function(){var we=C(this);if(we)return we;if(this._bodyBlob)return function z(we){var ue=new FileReader,st=R(ue);return ue.readAsText(we),st}(this._bodyBlob);if(this._bodyArrayBuffer)return Promise.resolve(function W(we){for(var ue=new Uint8Array(we),st=new Array(ue.length),We=0;We<ue.length;We++)st[We]=String.fromCharCode(ue[We]);return st.join("")}(this._bodyArrayBuffer));if(this._bodyFormData)throw new Error("could not read FormData body as text");return Promise.resolve(this._bodyText)},r_formData&&(this.formData=function(){return this.text().then(se)}),this.json=function(){return this.text().then(JSON.parse)},this}T.prototype.append=function(we,ue){we=e(we),ue=p(ue);var st=this.map[we];this.map[we]=st?st+", "+ue:ue},T.prototype.delete=function(we){delete this.map[e(we)]},T.prototype.get=function(we){return we=e(we),this.has(we)?this.map[we]:null},T.prototype.has=function(we){return this.map.hasOwnProperty(e(we))},T.prototype.set=function(we,ue){this.map[e(we)]=p(ue)},T.prototype.forEach=function(we,ue){for(var st in this.map)this.map.hasOwnProperty(st)&&we.call(ue,this.map[st],st,this)},T.prototype.keys=function(){var we=[];return this.forEach(function(ue,st){we.push(st)}),y(we)},T.prototype.values=function(){var we=[];return this.forEach(function(ue){we.push(ue)}),y(we)},T.prototype.entries=function(){var we=[];return this.forEach(function(ue,st){we.push([st,ue])}),y(we)},r_iterable&&(T.prototype[Symbol.iterator]=T.prototype.entries);var ce=["DELETE","GET","HEAD","OPTIONS","POST","PUT"];function U(we,ue){var st=(ue=ue||{}).body;if(we instanceof U){if(we.bodyUsed)throw new TypeError("Already read");this.url=we.url,this.credentials=we.credentials,ue.headers||(this.headers=new T(we.headers)),this.method=we.method,this.mode=we.mode,this.signal=we.signal,!st&&null!=we._bodyInit&&(st=we._bodyInit,we.bodyUsed=!0)}else this.url=String(we);if(this.credentials=ue.credentials||this.credentials||"same-origin",(ue.headers||!this.headers)&&(this.headers=new T(ue.headers)),this.method=function ie(we){var ue=we.toUpperCase();return ce.indexOf(ue)>-1?ue:we}(ue.method||this.method||"GET"),this.mode=ue.mode||this.mode||null,this.signal=ue.signal||this.signal,this.referrer=null,("GET"===this.method||"HEAD"===this.method)&&st)throw new TypeError("Body not allowed for GET or HEAD requests");this._initBody(st)}function se(we){var ue=new FormData;return we.trim().split("&").forEach(function(st){if(st){var We=st.split("="),Ve=We.shift().replace(/\+/g," "),Be=We.join("=").replace(/\+/g," ");ue.append(decodeURIComponent(Ve),decodeURIComponent(Be))}}),ue}function ge(we){var ue=new T;return we.replace(/\r?\n[\t ]+/g," ").split(/\r?\n/).forEach(function(We){var Ve=We.split(":"),Be=Ve.shift().trim();if(Be){var xe=Ve.join(":").trim();ue.append(Be,xe)}}),ue}function ae(we,ue){ue||(ue={}),this.type="default",this.status=void 0===ue.status?200:ue.status,this.ok=this.status>=200&&this.status<300,this.statusText="statusText"in ue?ue.statusText:"OK",this.headers=new T(ue.headers),this.url=ue.url||"",this._initBody(we)}U.prototype.clone=function(){return new U(this,{body:this._bodyInit})},ee.call(U.prototype),ee.call(ae.prototype),ae.prototype.clone=function(){return new ae(this._bodyInit,{status:this.status,statusText:this.statusText,headers:new T(this.headers),url:this.url})},ae.error=function(){var we=new ae(null,{status:0,statusText:""});return we.type="error",we};var he=[301,302,303,307,308];ae.redirect=function(we,ue){if(-1===he.indexOf(ue))throw new RangeError("Invalid status code");return new ae(null,{status:ue,headers:{location:we}})},i.DOMException=m.DOMException;try{new i.DOMException}catch(we){i.DOMException=function(ue,st){this.message=ue,this.name=st;var We=Error(ue);this.stack=We.stack},i.DOMException.prototype=Object.create(Error.prototype),i.DOMException.prototype.constructor=i.DOMException}function be(we,ue){return new Promise(function(st,We){var Ve=new U(we,ue);if(Ve.signal&&Ve.signal.aborted)return We(new i.DOMException("Aborted","AbortError"));var Be=new XMLHttpRequest;function xe(){Be.abort()}Be.onload=function(){var je={status:Be.status,statusText:Be.statusText,headers:ge(Be.getAllResponseHeaders()||"")};je.url="responseURL"in Be?Be.responseURL:je.headers.get("X-Request-URL"),st(new ae("response"in Be?Be.response:Be.responseText,je))},Be.onerror=function(){We(new TypeError("Network request failed"))},Be.ontimeout=function(){We(new TypeError("Network request failed"))},Be.onabort=function(){We(new i.DOMException("Aborted","AbortError"))},Be.open(Ve.method,Ve.url,!0),"include"===Ve.credentials?Be.withCredentials=!0:"omit"===Ve.credentials&&(Be.withCredentials=!1),"responseType"in Be&&r_blob&&(Be.responseType="blob"),Ve.headers.forEach(function(je,Ne){Be.setRequestHeader(Ne,je)}),Ve.signal&&(Ve.signal.addEventListener("abort",xe),Be.onreadystatechange=function(){4===Be.readyState&&Ve.signal.removeEventListener("abort",xe)}),Be.send(void 0===Ve._bodyInit?null:Ve._bodyInit)})}be.polyfill=!0,m.fetch||(m.fetch=be,m.Headers=T,m.Request=U,m.Response=ae),i.Headers=T,i.Request=U,i.Response=ae,i.fetch=be,Object.defineProperty(i,"__esModule",{value:!0})}({})},52243:function(m){var S;S="undefined"!=typeof global?global:this,m.exports=function(S){if(S.CSS&&S.CSS.escape)return S.CSS.escape;var i=function(r){if(0==arguments.length)throw new TypeError("`CSS.escape` requires an argument.");for(var e,a=String(r),f=a.length,c=-1,p="",y=a.charCodeAt(0);++c<f;)0!=(e=a.charCodeAt(c))?p+=e>=1&&e<=31||127==e||0==c&&e>=48&&e<=57||1==c&&e>=48&&e<=57&&45==y?"\\"+e.toString(16)+" ":0==c&&1==f&&45==e||!(e>=128||45==e||95==e||e>=48&&e<=57||e>=65&&e<=90||e>=97&&e<=122)?"\\"+a.charAt(c):a.charAt(c):p+="\ufffd";return p};return S.CSS||(S.CSS={}),S.CSS.escape=i,i}(S)},89225:m=>{"use strict";var S=function(ie){return function i(ce){return!!ce&&"object"==typeof ce}(ie)&&!function r(ce){var ie=Object.prototype.toString.call(ce);return"[object RegExp]"===ie||"[object Date]"===ie||function c(ce){return ce.$$typeof===f}(ce)}(ie)},f="function"==typeof Symbol&&Symbol.for?Symbol.for("react.element"):60103;function p(ce,ie){return!1!==ie.clone&&ie.isMergeableObject(ce)?J(function e(ce){return Array.isArray(ce)?[]:{}}(ce),ce,ie):ce}function y(ce,ie,U){return ce.concat(ie).map(function(se){return p(se,U)})}function R(ce){return Object.keys(ce).concat(function C(ce){return Object.getOwnPropertySymbols?Object.getOwnPropertySymbols(ce).filter(function(ie){return Object.propertyIsEnumerable.call(ce,ie)}):[]}(ce))}function L(ce,ie){try{return ie in ce}catch(U){return!1}}function J(ce,ie,U){(U=U||{}).arrayMerge=U.arrayMerge||y,U.isMergeableObject=U.isMergeableObject||S,U.cloneUnlessOtherwiseSpecified=p;var se=Array.isArray(ie);return se===Array.isArray(ce)?se?U.arrayMerge(ce,ie,U):function W(ce,ie,U){var se={};return U.isMergeableObject(ce)&&R(ce).forEach(function(ge){se[ge]=p(ce[ge],U)}),R(ie).forEach(function(ge){(function z(ce,ie){return L(ce,ie)&&!(Object.hasOwnProperty.call(ce,ie)&&Object.propertyIsEnumerable.call(ce,ie))})(ce,ge)||(se[ge]=L(ce,ge)&&U.isMergeableObject(ie[ge])?function T(ce,ie){if(!ie.customMerge)return J;var U=ie.customMerge(ce);return"function"==typeof U?U:J}(ge,U)(ce[ge],ie[ge],U):p(ie[ge],U))}),se}(ce,ie,U):p(ie,U)}J.all=function(ie,U){if(!Array.isArray(ie))throw new Error("first argument should be an array");return ie.reduce(function(se,ge){return J(se,ge,U)},{})},m.exports=J},97057:(m,S,i)=>{"use strict";i.d(S,{qY:()=>z});var a=function se(ge,ae,he){this.name=ge,this.version=ae,this.os=he,this.type="browser"},f=function se(ge){this.version=ge,this.type="node",this.name="node",this.os=process.platform},c=function se(ge,ae,he,be){this.name=ge,this.version=ae,this.os=he,this.bot=be,this.type="bot-device"},e=function se(){this.type="bot",this.bot=!0,this.name="bot",this.version=null,this.os=null},p=function se(){this.type="react-native",this.name="react-native",this.version=null,this.os=null},T=/(nuhk|Googlebot|Yammybot|Openbot|Slurp|MSNBot|Ask\ Jeeves\/Teoma|ia_archiver)/,R=[["aol",/AOLShield\/([0-9\._]+)/],["edge",/Edge\/([0-9\._]+)/],["edge-ios",/EdgiOS\/([0-9\._]+)/],["yandexbrowser",/YaBrowser\/([0-9\._]+)/],["kakaotalk",/KAKAOTALK\s([0-9\.]+)/],["samsung",/SamsungBrowser\/([0-9\.]+)/],["silk",/\bSilk\/([0-9._-]+)\b/],["miui",/MiuiBrowser\/([0-9\.]+)$/],["beaker",/BeakerBrowser\/([0-9\.]+)/],["edge-chromium",/EdgA?\/([0-9\.]+)/],["chromium-webview",/(?!Chrom.*OPR)wv\).*Chrom(?:e|ium)\/([0-9\.]+)(:?\s|$)/],["chrome",/(?!Chrom.*OPR)Chrom(?:e|ium)\/([0-9\.]+)(:?\s|$)/],["phantomjs",/PhantomJS\/([0-9\.]+)(:?\s|$)/],["crios",/CriOS\/([0-9\.]+)(:?\s|$)/],["firefox",/Firefox\/([0-9\.]+)(?:\s|$)/],["fxios",/FxiOS\/([0-9\.]+)/],["opera-mini",/Opera Mini.*Version\/([0-9\.]+)/],["opera",/Opera\/([0-9\.]+)(?:\s|$)/],["opera",/OPR\/([0-9\.]+)(:?\s|$)/],["ie",/Trident\/7\.0.*rv\:([0-9\.]+).*\).*Gecko$/],["ie",/MSIE\s([0-9\.]+);.*Trident\/[4-7].0/],["ie",/MSIE\s(7\.0)/],["bb10",/BB10;\sTouch.*Version\/([0-9\.]+)/],["android",/Android\s([0-9\.]+)/],["ios",/Version\/([0-9\._]+).*Mobile.*Safari.*/],["safari",/Version\/([0-9\._]+).*Safari/],["facebook",/FBAV\/([0-9\.]+)/],["instagram",/Instagram\s([0-9\.]+)/],["ios-webview",/AppleWebKit\/([0-9\.]+).*Mobile/],["ios-webview",/AppleWebKit\/([0-9\.]+).*Gecko\)$/],["searchbot",/alexa|bot|crawl(er|ing)|facebookexternalhit|feedburner|google web preview|nagios|postrank|pingdom|slurp|spider|yahoo!|yandex/]],L=[["iOS",/iP(hone|od|ad)/],["Android OS",/Android/],["BlackBerry OS",/BlackBerry|BB10/],["Windows Mobile",/IEMobile/],["Amazon OS",/Kindle/],["Windows 3.11",/Win16/],["Windows 95",/(Windows 95)|(Win95)|(Windows_95)/],["Windows 98",/(Windows 98)|(Win98)/],["Windows 2000",/(Windows NT 5.0)|(Windows 2000)/],["Windows XP",/(Windows NT 5.1)|(Windows XP)/],["Windows Server 2003",/(Windows NT 5.2)/],["Windows Vista",/(Windows NT 6.0)/],["Windows 7",/(Windows NT 6.1)/],["Windows 8",/(Windows NT 6.2)/],["Windows 8.1",/(Windows NT 6.3)/],["Windows 10",/(Windows NT 10.0)/],["Windows ME",/Windows ME/],["Open BSD",/OpenBSD/],["Sun OS",/SunOS/],["Chrome OS",/CrOS/],["Linux",/(Linux)|(X11)/],["Mac OS",/(Mac_PowerPC)|(Macintosh)/],["QNX",/QNX/],["BeOS",/BeOS/],["OS/2",/OS\/2/]];function z(se){return se?ee(se):"undefined"==typeof document&&"undefined"!=typeof navigator&&"ReactNative"===navigator.product?new p:"undefined"!=typeof navigator?ee(navigator.userAgent):function ie(){return"undefined"!=typeof process&&process.version?new f(process.version.slice(1)):null}()}function ee(se){var ge=function W(se){return""!==se&&R.reduce(function(ge,ae){var he=ae[0];if(ge)return ge;var we=ae[1].exec(se);return!!we&&[he,we]},!1)}(se);if(!ge)return null;var ae=ge[0],he=ge[1];if("searchbot"===ae)return new e;var be=he[1]&&he[1].split(/[._]/).slice(0,3);be?be.length<3&&(be=function(){for(var se=0,ge=0,ae=arguments.length;ge<ae;ge++)se+=arguments[ge].length;var he=Array(se),be=0;for(ge=0;ge<ae;ge++)for(var we=arguments[ge],ue=0,st=we.length;ue<st;ue++,be++)he[be]=we[ue];return he}(be,function U(se){for(var ge=[],ae=0;ae<se;ae++)ge.push("0");return ge}(3-be.length))):be=[];var we=be.join("."),ue=function ce(se){for(var ge=0,ae=L.length;ge<ae;ge++){var he=L[ge],be=he[0];if(he[1].exec(se))return be}return null}(se),st=T.exec(se);return st&&st[1]?new c(ae,we,ue,st[1]):new a(ae,we,ue)}},23358:function(m){m.exports=function(){"use strict";var i=Object.hasOwnProperty,r=Object.setPrototypeOf,a=Object.isFrozen,f=Object.getPrototypeOf,c=Object.getOwnPropertyDescriptor,e=Object.freeze,p=Object.seal,y=Object.create,T="undefined"!=typeof Reflect&&Reflect,C=T.apply,R=T.construct;C||(C=function(Pn,Xn,dr){return Pn.apply(Xn,dr)}),e||(e=function(Pn){return Pn}),p||(p=function(Pn){return Pn}),R||(R=function(Pn,Xn){return new(Function.prototype.bind.apply(Pn,[null].concat(function S(Br){if(Array.isArray(Br)){for(var Pn=0,Xn=Array(Br.length);Pn<Br.length;Pn++)Xn[Pn]=Br[Pn];return Xn}return Array.from(Br)}(Xn))))});var L=ae(Array.prototype.forEach),z=ae(Array.prototype.pop),W=ae(Array.prototype.push),J=ae(String.prototype.toLowerCase),ee=ae(String.prototype.match),ce=ae(String.prototype.replace),ie=ae(String.prototype.indexOf),U=ae(String.prototype.trim),se=ae(RegExp.prototype.test),ge=function he(Br){return function(){for(var Pn=arguments.length,Xn=Array(Pn),dr=0;dr<Pn;dr++)Xn[dr]=arguments[dr];return R(Br,Xn)}}(TypeError);function ae(Br){return function(Pn){for(var Xn=arguments.length,dr=Array(Xn>1?Xn-1:0),Qr=1;Qr<Xn;Qr++)dr[Qr-1]=arguments[Qr];return C(Br,Pn,dr)}}function be(Br,Pn){r&&r(Br,null);for(var Xn=Pn.length;Xn--;){var dr=Pn[Xn];if("string"==typeof dr){var Qr=J(dr);Qr!==dr&&(a(Pn)||(Pn[Xn]=Qr),dr=Qr)}Br[dr]=!0}return Br}function we(Br){var Pn=y(null),Xn=void 0;for(Xn in Br)C(i,Br,[Xn])&&(Pn[Xn]=Br[Xn]);return Pn}function ue(Br,Pn){for(;null!==Br;){var Xn=c(Br,Pn);if(Xn){if(Xn.get)return ae(Xn.get);if("function"==typeof Xn.value)return ae(Xn.value)}Br=f(Br)}return function dr(Qr){return console.warn("fallback value for",Qr),null}}var st=e(["a","abbr","acronym","address","area","article","aside","audio","b","bdi","bdo","big","blink","blockquote","body","br","button","canvas","caption","center","cite","code","col","colgroup","content","data","datalist","dd","decorator","del","details","dfn","dialog","dir","div","dl","dt","element","em","fieldset","figcaption","figure","font","footer","form","h1","h2","h3","h4","h5","h6","head","header","hgroup","hr","html","i","img","input","ins","kbd","label","legend","li","main","map","mark","marquee","menu","menuitem","meter","nav","nobr","ol","optgroup","option","output","p","picture","pre","progress","q","rp","rt","ruby","s","samp","section","select","shadow","small","source","spacer","span","strike","strong","style","sub","summary","sup","table","tbody","td","template","textarea","tfoot","th","thead","time","tr","track","tt","u","ul","var","video","wbr"]),We=e(["svg","a","altglyph","altglyphdef","altglyphitem","animatecolor","animatemotion","animatetransform","circle","clippath","defs","desc","ellipse","filter","font","g","glyph","glyphref","hkern","image","line","lineargradient","marker","mask","metadata","mpath","path","pattern","polygon","polyline","radialgradient","rect","stop","style","switch","symbol","text","textpath","title","tref","tspan","view","vkern"]),Ve=e(["feBlend","feColorMatrix","feComponentTransfer","feComposite","feConvolveMatrix","feDiffuseLighting","feDisplacementMap","feDistantLight","feFlood","feFuncA","feFuncB","feFuncG","feFuncR","feGaussianBlur","feMerge","feMergeNode","feMorphology","feOffset","fePointLight","feSpecularLighting","feSpotLight","feTile","feTurbulence"]),Be=e(["animate","color-profile","cursor","discard","fedropshadow","feimage","font-face","font-face-format","font-face-name","font-face-src","font-face-uri","foreignobject","hatch","hatchpath","mesh","meshgradient","meshpatch","meshrow","missing-glyph","script","set","solidcolor","unknown","use"]),xe=e(["math","menclose","merror","mfenced","mfrac","mglyph","mi","mlabeledtr","mmultiscripts","mn","mo","mover","mpadded","mphantom","mroot","mrow","ms","mspace","msqrt","mstyle","msub","msup","msubsup","mtable","mtd","mtext","mtr","munder","munderover"]),je=e(["maction","maligngroup","malignmark","mlongdiv","mscarries","mscarry","msgroup","mstack","msline","msrow","semantics","annotation","annotation-xml","mprescripts","none"]),Ne=e(["#text"]),Bt=e(["accept","action","align","alt","autocapitalize","autocomplete","autopictureinpicture","autoplay","background","bgcolor","border","capture","cellpadding","cellspacing","checked","cite","class","clear","color","cols","colspan","controls","controlslist","coords","crossorigin","datetime","decoding","default","dir","disabled","disablepictureinpicture","disableremoteplayback","download","draggable","enctype","enterkeyhint","face","for","headers","height","hidden","high","href","hreflang","id","inputmode","integrity","ismap","kind","label","lang","list","loading","loop","low","max","maxlength","media","method","min","minlength","multiple","muted","name","noshade","novalidate","nowrap","open","optimum","pattern","placeholder","playsinline","poster","preload","pubdate","radiogroup","readonly","rel","required","rev","reversed","role","rows","rowspan","spellcheck","scope","selected","shape","size","sizes","span","srclang","start","src","srcset","step","style","summary","tabindex","title","translate","type","usemap","valign","value","width","xmlns","slot"]),rt=e(["accent-height","accumulate","additive","alignment-baseline","ascent","attributename","attributetype","azimuth","basefrequency","baseline-shift","begin","bias","by","class","clip","clippathunits","clip-path","clip-rule","color","color-interpolation","color-interpolation-filters","color-profile","color-rendering","cx","cy","d","dx","dy","diffuseconstant","direction","display","divisor","dur","edgemode","elevation","end","fill","fill-opacity","fill-rule","filter","filterunits","flood-color","flood-opacity","font-family","font-size","font-size-adjust","font-stretch","font-style","font-variant","font-weight","fx","fy","g1","g2","glyph-name","glyphref","gradientunits","gradienttransform","height","href","id","image-rendering","in","in2","k","k1","k2","k3","k4","kerning","keypoints","keysplines","keytimes","lang","lengthadjust","letter-spacing","kernelmatrix","kernelunitlength","lighting-color","local","marker-end","marker-mid","marker-start","markerheight","markerunits","markerwidth","maskcontentunits","maskunits","max","mask","media","method","mode","min","name","numoctaves","offset","operator","opacity","order","orient","orientation","origin","overflow","paint-order","path","pathlength","patterncontentunits","patterntransform","patternunits","points","preservealpha","preserveaspectratio","primitiveunits","r","rx","ry","radius","refx","refy","repeatcount","repeatdur","restart","result","rotate","scale","seed","shape-rendering","specularconstant","specularexponent","spreadmethod","startoffset","stddeviation","stitchtiles","stop-color","stop-opacity","stroke-dasharray","stroke-dashoffset","stroke-linecap","stroke-linejoin","stroke-miterlimit","stroke-opacity","stroke","stroke-width","style","surfacescale","systemlanguage","tabindex","targetx","targety","transform","text-anchor","text-decoration","text-rendering","textlength","type","u1","u2","unicode","values","viewbox","visibility","version","vert-adv-y","vert-origin-x","vert-origin-y","width","word-spacing","wrap","writing-mode","xchannelselector","ychannelselector","x","x1","x2","xmlns","y","y1","y2","z","zoomandpan"]),en=e(["accent","accentunder","align","bevelled","close","columnsalign","columnlines","columnspan","denomalign","depth","dir","display","displaystyle","encoding","fence","frame","height","href","id","largeop","length","linethickness","lspace","lquote","mathbackground","mathcolor","mathsize","mathvariant","maxsize","minsize","movablelimits","notation","numalign","open","rowalign","rowlines","rowspacing","rowspan","rspace","rquote","scriptlevel","scriptminsize","scriptsizemultiplier","selection","separator","separators","stretchy","subscriptshift","supscriptshift","symmetric","voffset","width","xmlns"]),Pt=e(["xlink:href","xml:id","xlink:title","xml:space","xmlns:xlink"]),Vt=p(/\{\{[\s\S]*|[\s\S]*\}\}/gm),hn=p(/<%[\s\S]*|[\s\S]*%>/gm),vn=p(/^data-[\-\w.\u00B7-\uFFFF]/),mt=p(/^aria-[\-\w]+$/),Nt=p(/^(?:(?:(?:f|ht)tps?|mailto|tel|callto|cid|xmpp):|[^a-z]|[a-z+.\-]+(?:[^a-z+.\-:]|$))/i),St=p(/^(?:\w+script|data):/i),Yt=p(/[\u0000-\u0020\u00A0\u1680\u180E\u2000-\u2029\u205F\u3000]/g),Fn="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(Br){return typeof Br}:function(Br){return Br&&"function"==typeof Symbol&&Br.constructor===Symbol&&Br!==Symbol.prototype?"symbol":typeof Br};function pr(Br){if(Array.isArray(Br)){for(var Pn=0,Xn=Array(Br.length);Pn<Br.length;Pn++)Xn[Pn]=Br[Pn];return Xn}return Array.from(Br)}var Ei=function(){return"undefined"==typeof window?null:window},mi=function(Pn,Xn){if("object"!==(void 0===Pn?"undefined":Fn(Pn))||"function"!=typeof Pn.createPolicy)return null;var dr=null,Qr="data-tt-policy-suffix";Xn.currentScript&&Xn.currentScript.hasAttribute(Qr)&&(dr=Xn.currentScript.getAttribute(Qr));var Ci="dompurify"+(dr?"#"+dr:"");try{return Pn.createPolicy(Ci,{createHTML:function(so){return so}})}catch(_i){return console.warn("TrustedTypes policy "+Ci+" could not be created."),null}};return function ur(){var Br=arguments.length>0&&void 0!==arguments[0]?arguments[0]:Ei(),Pn=function(Nr){return ur(Nr)};if(Pn.version="2.3.3",Pn.removed=[],!Br||!Br.document||9!==Br.document.nodeType)return Pn.isSupported=!1,Pn;var Xn=Br.document,dr=Br.document,Qr=Br.DocumentFragment,Ci=Br.HTMLTemplateElement,_i=Br.Node,so=Br.Element,Ro=Br.NodeFilter,Sr=Br.NamedNodeMap,Kt=void 0===Sr?Br.NamedNodeMap||Br.MozNamedAttrMap:Sr,un=Br.Text,jn=Br.Comment,Jn=Br.DOMParser,Gn=Br.trustedTypes,Xr=so.prototype,Zi=ue(Xr,"cloneNode"),ii=ue(Xr,"nextSibling"),hr=ue(Xr,"childNodes"),Ki=ue(Xr,"parentNode");if("function"==typeof Ci){var ln=dr.createElement("template");ln.content&&ln.content.ownerDocument&&(dr=ln.content.ownerDocument)}var Mn=mi(Gn,Xn),Zn=Mn&&Fr?Mn.createHTML(""):"",Sn=dr.implementation,Or=dr.createNodeIterator,ri=dr.createDocumentFragment,vi=dr.getElementsByTagName,Ui=Xn.importNode,ao={};try{ao=we(dr).documentMode?dr.documentMode:{}}catch(Oo){}var dt={};Pn.isSupported="function"==typeof Ki&&Sn&&void 0!==Sn.createHTMLDocument&&9!==ao;var Bi=Vt,to=hn,Gt=vn,Rn=mt,_t=St,Rt=Yt,ct=Nt,pt=null,kt=be({},[].concat(pr(st),pr(We),pr(Ve),pr(xe),pr(Ne))),dn=null,mr=be({},[].concat(pr(Bt),pr(rt),pr(en),pr(Pt))),Oi=null,di=null,Uo=!0,Qo=!0,lo=!1,Ai=!1,Fo=!1,Ko=!1,qn=!1,ei=!1,wn=!1,Qn=!0,Fr=!1,oo=!0,Li=!0,yo=!1,go={},Go=null,ua=be({},["annotation-xml","audio","colgroup","desc","foreignobject","head","iframe","math","mi","mn","mo","ms","mtext","noembed","noframes","noscript","plaintext","script","style","svg","template","thead","title","video","xmp"]),er=null,vr=be({},["audio","video","img","source","image","track"]),yr=null,or=be({},["alt","class","for","id","label","name","pattern","placeholder","role","summary","title","value","style","xmlns"]),si="http://www.w3.org/1998/Math/MathML",pn="http://www.w3.org/2000/svg",xn="http://www.w3.org/1999/xhtml",Gr=xn,no=!1,mo=void 0,wo=["application/xhtml+xml","text/html"],Us="text/html",cs=void 0,es=null,ga=dr.createElement("form"),ya=function(Nr){es&&es===Nr||((!Nr||"object"!==(void 0===Nr?"undefined":Fn(Nr)))&&(Nr={}),Nr=we(Nr),pt="ALLOWED_TAGS"in Nr?be({},Nr.ALLOWED_TAGS):kt,dn="ALLOWED_ATTR"in Nr?be({},Nr.ALLOWED_ATTR):mr,yr="ADD_URI_SAFE_ATTR"in Nr?be(we(or),Nr.ADD_URI_SAFE_ATTR):or,er="ADD_DATA_URI_TAGS"in Nr?be(we(vr),Nr.ADD_DATA_URI_TAGS):vr,Go="FORBID_CONTENTS"in Nr?be({},Nr.FORBID_CONTENTS):ua,Oi="FORBID_TAGS"in Nr?be({},Nr.FORBID_TAGS):{},di="FORBID_ATTR"in Nr?be({},Nr.FORBID_ATTR):{},go="USE_PROFILES"in Nr&&Nr.USE_PROFILES,Uo=!1!==Nr.ALLOW_ARIA_ATTR,Qo=!1!==Nr.ALLOW_DATA_ATTR,lo=Nr.ALLOW_UNKNOWN_PROTOCOLS||!1,Ai=Nr.SAFE_FOR_TEMPLATES||!1,Fo=Nr.WHOLE_DOCUMENT||!1,ei=Nr.RETURN_DOM||!1,wn=Nr.RETURN_DOM_FRAGMENT||!1,Qn=!1!==Nr.RETURN_DOM_IMPORT,Fr=Nr.RETURN_TRUSTED_TYPE||!1,qn=Nr.FORCE_BODY||!1,oo=!1!==Nr.SANITIZE_DOM,Li=!1!==Nr.KEEP_CONTENT,yo=Nr.IN_PLACE||!1,ct=Nr.ALLOWED_URI_REGEXP||ct,Gr=Nr.NAMESPACE||xn,mo=mo=-1===wo.indexOf(Nr.PARSER_MEDIA_TYPE)?Us:Nr.PARSER_MEDIA_TYPE,cs="application/xhtml+xml"===mo?function(Qi){return Qi}:J,Ai&&(Qo=!1),wn&&(ei=!0),go&&(pt=be({},[].concat(pr(Ne))),dn=[],!0===go.html&&(be(pt,st),be(dn,Bt)),!0===go.svg&&(be(pt,We),be(dn,rt),be(dn,Pt)),!0===go.svgFilters&&(be(pt,Ve),be(dn,rt),be(dn,Pt)),!0===go.mathMl&&(be(pt,xe),be(dn,en),be(dn,Pt))),Nr.ADD_TAGS&&(pt===kt&&(pt=we(pt)),be(pt,Nr.ADD_TAGS)),Nr.ADD_ATTR&&(dn===mr&&(dn=we(dn)),be(dn,Nr.ADD_ATTR)),Nr.ADD_URI_SAFE_ATTR&&be(yr,Nr.ADD_URI_SAFE_ATTR),Nr.FORBID_CONTENTS&&(Go===ua&&(Go=we(Go)),be(Go,Nr.FORBID_CONTENTS)),Li&&(pt["#text"]=!0),Fo&&be(pt,["html","head","body"]),pt.table&&(be(pt,["tbody"]),delete Oi.tbody),e&&e(Nr),es=Nr)},fa=be({},["mi","mo","mn","ms","mtext"]),la=be({},["foreignobject","desc","title","annotation-xml"]),Pa=be({},We);be(Pa,Ve),be(Pa,Be);var fl=be({},xe);be(fl,je);var To=function(Nr){var Qi=Ki(Nr);(!Qi||!Qi.tagName)&&(Qi={namespaceURI:xn,tagName:"template"});var tt=J(Nr.tagName),rn=J(Qi.tagName);if(Nr.namespaceURI===pn)return Qi.namespaceURI===xn?"svg"===tt:Qi.namespaceURI===si?"svg"===tt&&("annotation-xml"===rn||fa[rn]):Boolean(Pa[tt]);if(Nr.namespaceURI===si)return Qi.namespaceURI===xn?"math"===tt:Qi.namespaceURI===pn?"math"===tt&&la[rn]:Boolean(fl[tt]);if(Nr.namespaceURI===xn){if(Qi.namespaceURI===pn&&!la[rn]||Qi.namespaceURI===si&&!fa[rn])return!1;var ne=be({},["title","style","font","a","script"]);return!fl[tt]&&(ne[tt]||!Pa[tt])}return!1},ml=function(Nr){W(Pn.removed,{element:Nr});try{Nr.parentNode.removeChild(Nr)}catch(Qi){try{Nr.outerHTML=Zn}catch(tt){Nr.remove()}}},Zo=function(Nr,Qi){try{W(Pn.removed,{attribute:Qi.getAttributeNode(Nr),from:Qi})}catch(tt){W(Pn.removed,{attribute:null,from:Qi})}if(Qi.removeAttribute(Nr),"is"===Nr&&!dn[Nr])if(ei||wn)try{ml(Qi)}catch(tt){}else try{Qi.setAttribute(Nr,"")}catch(tt){}},vs=function(Nr){var Qi=void 0,tt=void 0;if(qn)Nr="<remove></remove>"+Nr;else{var rn=ee(Nr,/^[\r\n\t ]+/);tt=rn&&rn[0]}"application/xhtml+xml"===mo&&(Nr='<html xmlns="http://www.w3.org/1999/xhtml"><head></head><body>'+Nr+"</body></html>");var ne=Mn?Mn.createHTML(Nr):Nr;if(Gr===xn)try{Qi=(new Jn).parseFromString(ne,mo)}catch(Lt){}if(!Qi||!Qi.documentElement){Qi=Sn.createDocument(Gr,"template",null);try{Qi.documentElement.innerHTML=no?"":ne}catch(Lt){}}var Le=Qi.body||Qi.documentElement;return Nr&&tt&&Le.insertBefore(dr.createTextNode(tt),Le.childNodes[0]||null),Gr===xn?vi.call(Qi,Fo?"html":"body")[0]:Fo?Qi.documentElement:Le},Za=function(Nr){return Or.call(Nr.ownerDocument||Nr,Nr,Ro.SHOW_ELEMENT|Ro.SHOW_COMMENT|Ro.SHOW_TEXT,null,!1)},Is=function(Nr){return!(Nr instanceof un||Nr instanceof jn||"string"==typeof Nr.nodeName&&"string"==typeof Nr.textContent&&"function"==typeof Nr.removeChild&&Nr.attributes instanceof Kt&&"function"==typeof Nr.removeAttribute&&"function"==typeof Nr.setAttribute&&"string"==typeof Nr.namespaceURI&&"function"==typeof Nr.insertBefore)},tl=function(Nr){return"object"===(void 0===_i?"undefined":Fn(_i))?Nr instanceof _i:Nr&&"object"===(void 0===Nr?"undefined":Fn(Nr))&&"number"==typeof Nr.nodeType&&"string"==typeof Nr.nodeName},Ys=function(Nr,Qi,tt){!dt[Nr]||L(dt[Nr],function(rn){rn.call(Pn,Qi,tt,es)})},ko=function(Nr){var Qi=void 0;if(Ys("beforeSanitizeElements",Nr,null),Is(Nr)||ee(Nr.nodeName,/[\u0080-\uFFFF]/))return ml(Nr),!0;var tt=cs(Nr.nodeName);if(Ys("uponSanitizeElement",Nr,{tagName:tt,allowedTags:pt}),!tl(Nr.firstElementChild)&&(!tl(Nr.content)||!tl(Nr.content.firstElementChild))&&se(/<[/\w]/g,Nr.innerHTML)&&se(/<[/\w]/g,Nr.textContent)||"select"===tt&&se(/<template/i,Nr.innerHTML))return ml(Nr),!0;if(!pt[tt]||Oi[tt]){if(Li&&!Go[tt]){var rn=Ki(Nr)||Nr.parentNode,ne=hr(Nr)||Nr.childNodes;if(ne&&rn)for(var Lt=ne.length-1;Lt>=0;--Lt)rn.insertBefore(Zi(ne[Lt],!0),ii(Nr))}return ml(Nr),!0}return Nr instanceof so&&!To(Nr)||("noscript"===tt||"noembed"===tt)&&se(/<\/no(script|embed)/i,Nr.innerHTML)?(ml(Nr),!0):(Ai&&3===Nr.nodeType&&(Qi=ce(Qi=Nr.textContent,Bi," "),Qi=ce(Qi,to," "),Nr.textContent!==Qi&&(W(Pn.removed,{element:Nr.cloneNode()}),Nr.textContent=Qi)),Ys("afterSanitizeElements",Nr,null),!1)},Co=function(Nr,Qi,tt){if(oo&&("id"===Qi||"name"===Qi)&&(tt in dr||tt in ga))return!1;if((!Qo||di[Qi]||!se(Gt,Qi))&&(!Uo||!se(Rn,Qi))){if(!dn[Qi]||di[Qi])return!1;if(!yr[Qi]&&!se(ct,ce(tt,Rt,""))&&("src"!==Qi&&"xlink:href"!==Qi&&"href"!==Qi||"script"===Nr||0!==ie(tt,"data:")||!er[Nr])&&(!lo||se(_t,ce(tt,Rt,"")))&&tt)return!1}return!0},Ps=function(Nr){var Qi=void 0,tt=void 0,rn=void 0,ne=void 0;Ys("beforeSanitizeAttributes",Nr,null);var Le=Nr.attributes;if(Le){var Lt={attrName:"",attrValue:"",keepAttr:!0,allowedAttributes:dn};for(ne=Le.length;ne--;){var Kr=(Qi=Le[ne]).name,bi=Qi.namespaceURI;if(tt=U(Qi.value),rn=cs(Kr),Lt.attrName=rn,Lt.attrValue=tt,Lt.keepAttr=!0,Lt.forceKeepAttr=void 0,Ys("uponSanitizeAttribute",Nr,Lt),tt=Lt.attrValue,!Lt.forceKeepAttr&&(Zo(Kr,Nr),Lt.keepAttr)){if(se(/\/>/i,tt)){Zo(Kr,Nr);continue}Ai&&(tt=ce(tt,Bi," "),tt=ce(tt,to," "));var Ii=cs(Nr.nodeName);if(Co(Ii,rn,tt))try{bi?Nr.setAttributeNS(bi,Kr,tt):Nr.setAttribute(Kr,tt),z(Pn.removed)}catch(hs){}}}Ys("afterSanitizeAttributes",Nr,null)}},ps=function Oo(Nr){var Qi=void 0,tt=Za(Nr);for(Ys("beforeSanitizeShadowDOM",Nr,null);Qi=tt.nextNode();)Ys("uponSanitizeShadowNode",Qi,null),!ko(Qi)&&(Qi.content instanceof Qr&&Oo(Qi.content),Ps(Qi));Ys("afterSanitizeShadowDOM",Nr,null)};return Pn.sanitize=function(Oo,Nr){var Qi=void 0,tt=void 0,rn=void 0,ne=void 0,Le=void 0;if((no=!Oo)&&(Oo="\x3c!--\x3e"),"string"!=typeof Oo&&!tl(Oo)){if("function"!=typeof Oo.toString)throw ge("toString is not a function");if("string"!=typeof(Oo=Oo.toString()))throw ge("dirty is not a string, aborting")}if(!Pn.isSupported){if("object"===Fn(Br.toStaticHTML)||"function"==typeof Br.toStaticHTML){if("string"==typeof Oo)return Br.toStaticHTML(Oo);if(tl(Oo))return Br.toStaticHTML(Oo.outerHTML)}return Oo}if(Ko||ya(Nr),Pn.removed=[],"string"==typeof Oo&&(yo=!1),!yo)if(Oo instanceof _i)1===(tt=(Qi=vs("\x3c!----\x3e")).ownerDocument.importNode(Oo,!0)).nodeType&&"BODY"===tt.nodeName||"HTML"===tt.nodeName?Qi=tt:Qi.appendChild(tt);else{if(!ei&&!Ai&&!Fo&&-1===Oo.indexOf("<"))return Mn&&Fr?Mn.createHTML(Oo):Oo;if(!(Qi=vs(Oo)))return ei?null:Zn}Qi&&qn&&ml(Qi.firstChild);for(var Lt=Za(yo?Oo:Qi);rn=Lt.nextNode();)3===rn.nodeType&&rn===ne||ko(rn)||(rn.content instanceof Qr&&ps(rn.content),Ps(rn),ne=rn);if(ne=null,yo)return Oo;if(ei){if(wn)for(Le=ri.call(Qi.ownerDocument);Qi.firstChild;)Le.appendChild(Qi.firstChild);else Le=Qi;return Qn&&(Le=Ui.call(Xn,Le,!0)),Le}var on=Fo?Qi.outerHTML:Qi.innerHTML;return Ai&&(on=ce(on,Bi," "),on=ce(on,to," ")),Mn&&Fr?Mn.createHTML(on):on},Pn.setConfig=function(Oo){ya(Oo),Ko=!0},Pn.clearConfig=function(){es=null,Ko=!1},Pn.isValidAttribute=function(Oo,Nr,Qi){es||ya({});var tt=cs(Oo),rn=cs(Nr);return Co(tt,rn,Qi)},Pn.addHook=function(Oo,Nr){"function"==typeof Nr&&(dt[Oo]=dt[Oo]||[],W(dt[Oo],Nr))},Pn.removeHook=function(Oo){dt[Oo]&&z(dt[Oo])},Pn.removeHooks=function(Oo){dt[Oo]&&(dt[Oo]=[])},Pn.removeAllHooks=function(){dt={}},Pn}()}()},32582:m=>{"use strict";class S{constructor(a,f){this.low=a,this.high=f,this.length=1+f-a}overlaps(a){return!(this.high<a.low||this.low>a.high)}touches(a){return!(this.high+1<a.low||this.low-1>a.high)}add(a){return new S(Math.min(this.low,a.low),Math.max(this.high,a.high))}subtract(a){return a.low<=this.low&&a.high>=this.high?[]:a.low>this.low&&a.high<this.high?[new S(this.low,a.low-1),new S(a.high+1,this.high)]:a.low<=this.low?[new S(a.high+1,this.high)]:[new S(this.low,a.low-1)]}toString(){return this.low==this.high?this.low.toString():this.low+"-"+this.high}}class i{constructor(a,f){this.ranges=[],this.length=0,null!=a&&this.add(a,f)}_update_length(){this.length=this.ranges.reduce((a,f)=>a+f.length,0)}add(a,f){var c=e=>{for(var p=0;p<this.ranges.length&&!e.touches(this.ranges[p]);)p++;for(var y=this.ranges.slice(0,p);p<this.ranges.length&&e.touches(this.ranges[p]);)e=e.add(this.ranges[p]),p++;y.push(e),this.ranges=y.concat(this.ranges.slice(p)),this._update_length()};return a instanceof i?a.ranges.forEach(c):(null==f&&(f=a),c(new S(a,f))),this}subtract(a,f){var c=e=>{for(var p=0;p<this.ranges.length&&!e.overlaps(this.ranges[p]);)p++;for(var y=this.ranges.slice(0,p);p<this.ranges.length&&e.overlaps(this.ranges[p]);)y=y.concat(this.ranges[p].subtract(e)),p++;this.ranges=y.concat(this.ranges.slice(p)),this._update_length()};return a instanceof i?a.ranges.forEach(c):(null==f&&(f=a),c(new S(a,f))),this}intersect(a,f){var c=[],e=p=>{for(var y=0;y<this.ranges.length&&!p.overlaps(this.ranges[y]);)y++;for(;y<this.ranges.length&&p.overlaps(this.ranges[y]);){var T=Math.max(this.ranges[y].low,p.low),C=Math.min(this.ranges[y].high,p.high);c.push(new S(T,C)),y++}};return a instanceof i?a.ranges.forEach(e):(null==f&&(f=a),e(new S(a,f))),this.ranges=c,this._update_length(),this}index(a){for(var f=0;f<this.ranges.length&&this.ranges[f].length<=a;)a-=this.ranges[f].length,f++;return this.ranges[f].low+a}toString(){return"[ "+this.ranges.join(", ")+" ]"}clone(){return new i(this)}numbers(){return this.ranges.reduce((a,f)=>{for(var c=f.low;c<=f.high;)a.push(c),c++;return a},[])}subranges(){return this.ranges.map(a=>({low:a.low,high:a.high,length:1+a.high-a.low}))}}m.exports=i},11926:(m,S,i)=>{"use strict";var r=i(88430),a=f(Error);function f(c){return e.displayName=c.displayName||c.name,e;function e(p){return p&&(p=r.apply(null,arguments)),new c(p)}}m.exports=a,a.eval=f(EvalError),a.range=f(RangeError),a.reference=f(ReferenceError),a.syntax=f(SyntaxError),a.type=f(TypeError),a.uri=f(URIError),a.create=f},49457:function(m,S){var a;void 0!==(a=function(){"use strict";function c(C,R,L){var z=new XMLHttpRequest;z.open("GET",C),z.responseType="blob",z.onload=function(){T(z.response,R,L)},z.onerror=function(){console.error("could not download file")},z.send()}function e(C){var R=new XMLHttpRequest;R.open("HEAD",C,!1);try{R.send()}catch(L){}return 200<=R.status&&299>=R.status}function p(C){try{C.dispatchEvent(new MouseEvent("click"))}catch(L){var R=document.createEvent("MouseEvents");R.initMouseEvent("click",!0,!0,window,0,0,0,80,20,!1,!1,!1,!1,0,null),C.dispatchEvent(R)}}var y="object"==typeof window&&window.window===window?window:"object"==typeof self&&self.self===self?self:"object"==typeof global&&global.global===global?global:void 0,T=y.saveAs||("object"!=typeof window||window!==y?function(){}:"download"in HTMLAnchorElement.prototype?function(C,R,L){var z=y.URL||y.webkitURL,W=document.createElement("a");W.download=R=R||C.name||"download",W.rel="noopener","string"==typeof C?(W.href=C,W.origin===location.origin?p(W):e(W.href)?c(C,R,L):p(W,W.target="_blank")):(W.href=z.createObjectURL(C),setTimeout(function(){z.revokeObjectURL(W.href)},4e4),setTimeout(function(){p(W)},0))}:"msSaveOrOpenBlob"in navigator?function(C,R,L){if(R=R||C.name||"download","string"!=typeof C)navigator.msSaveOrOpenBlob(function f(C,R){return void 0===R?R={autoBom:!1}:"object"!=typeof R&&(console.warn("Deprecated: Expected third argument to be a object"),R={autoBom:!R}),R.autoBom&&/^\s*(?:text\/\S*|application\/xml|\S*\/\S*\+xml)\s*;.*charset\s*=\s*utf-8/i.test(C.type)?new Blob(["\ufeff",C],{type:C.type}):C}(C,L),R);else if(e(C))c(C,R,L);else{var z=document.createElement("a");z.href=C,z.target="_blank",setTimeout(function(){p(z)})}}:function(C,R,L,z){if((z=z||open("","_blank"))&&(z.document.title=z.document.body.innerText="downloading..."),"string"==typeof C)return c(C,R,L);var W="application/octet-stream"===C.type,J=/constructor/i.test(y.HTMLElement)||y.safari,ee=/CriOS\/[\d]+/.test(navigator.userAgent);if((ee||W&&J)&&"object"==typeof FileReader){var ce=new FileReader;ce.onloadend=function(){var se=ce.result;se=ee?se:se.replace(/^data:[^;]*;/,"data:attachment/file;"),z?z.location.href=se:location=se,z=null},ce.readAsDataURL(C)}else{var ie=y.URL||y.webkitURL,U=ie.createObjectURL(C);z?z.location=U:location.href=U,z=null,setTimeout(function(){ie.revokeObjectURL(U)},4e4)}});y.saveAs=T.saveAs=T,m.exports=T}.apply(S,[]))&&(m.exports=a)},88430:m=>{!function(){var S;function a(f){for(var C,L,z,J,c=1,e=[].slice.call(arguments),p=0,y=f.length,T="",R=!1,W=!1,ee=function(){return e[c++]},ce=function(){for(var ie="";/\d/.test(f[p]);)ie+=f[p++],C=f[p];return ie.length>0?parseInt(ie):null};p<y;++p)if(C=f[p],R)switch(R=!1,"."==C?(W=!1,C=f[++p]):"0"==C&&"."==f[p+1]?(W=!0,p+=2,C=f[p]):W=!0,J=ce(),C){case"b":T+=parseInt(ee(),10).toString(2);break;case"c":T+="string"==typeof(L=ee())||L instanceof String?L:String.fromCharCode(parseInt(L,10));break;case"d":T+=parseInt(ee(),10);break;case"f":z=String(parseFloat(ee()).toFixed(J||6)),T+=W?z:z.replace(/^0/,"");break;case"j":T+=JSON.stringify(ee());break;case"o":T+="0"+parseInt(ee(),10).toString(8);break;case"s":T+=ee();break;case"x":T+="0x"+parseInt(ee(),10).toString(16);break;case"X":T+="0x"+parseInt(ee(),10).toString(16).toUpperCase();break;default:T+=C}else"%"===C?R=!0:T+=C;return T}(S=m.exports=a).format=a,S.vsprintf=function r(f,c){return a.apply(null,[f].concat(c))},"undefined"!=typeof console&&"function"==typeof console.log&&(S.printf=function i(){console.log(a.apply(null,arguments))})}()},31609:m=>{"use strict";var S="Function.prototype.bind called on incompatible ",i=Array.prototype.slice,r=Object.prototype.toString,a="[object Function]";m.exports=function(c){var e=this;if("function"!=typeof e||r.call(e)!==a)throw new TypeError(S+e);for(var y,p=i.call(arguments,1),T=function(){if(this instanceof y){var W=e.apply(this,p.concat(i.call(arguments)));return Object(W)===W?W:this}return e.apply(c,p.concat(i.call(arguments)))},C=Math.max(0,e.length-p.length),R=[],L=0;L<C;L++)R.push("$"+L);if(y=Function("binder","return function ("+R.join(",")+"){ return binder.apply(this,arguments); }")(T),e.prototype){var z=function(){};z.prototype=e.prototype,y.prototype=new z,z.prototype=null}return y}},75396:(m,S,i)=>{"use strict";var r=i(31609);m.exports=Function.prototype.bind||r},18540:(m,S,i)=>{"use strict";var r,a=SyntaxError,f=Function,c=TypeError,e=function(Ve){try{return f('"use strict"; return ('+Ve+").constructor;")()}catch(Be){}},p=Object.getOwnPropertyDescriptor;if(p)try{p({},"")}catch(Ve){p=null}var y=function(){throw new c},T=p?function(){try{return y}catch(Ve){try{return p(arguments,"callee").get}catch(Be){return y}}}():y,C=i(59326)(),R=Object.getPrototypeOf||function(Ve){return Ve.__proto__},L={},z="undefined"==typeof Uint8Array?r:R(Uint8Array),W={"%AggregateError%":"undefined"==typeof AggregateError?r:AggregateError,"%Array%":Array,"%ArrayBuffer%":"undefined"==typeof ArrayBuffer?r:ArrayBuffer,"%ArrayIteratorPrototype%":C?R([][Symbol.iterator]()):r,"%AsyncFromSyncIteratorPrototype%":r,"%AsyncFunction%":L,"%AsyncGenerator%":L,"%AsyncGeneratorFunction%":L,"%AsyncIteratorPrototype%":L,"%Atomics%":"undefined"==typeof Atomics?r:Atomics,"%BigInt%":"undefined"==typeof BigInt?r:BigInt,"%BigInt64Array%":"undefined"==typeof BigInt64Array?r:BigInt64Array,"%BigUint64Array%":"undefined"==typeof BigUint64Array?r:BigUint64Array,"%Boolean%":Boolean,"%DataView%":"undefined"==typeof DataView?r:DataView,"%Date%":Date,"%decodeURI%":decodeURI,"%decodeURIComponent%":decodeURIComponent,"%encodeURI%":encodeURI,"%encodeURIComponent%":encodeURIComponent,"%Error%":Error,"%eval%":eval,"%EvalError%":EvalError,"%Float32Array%":"undefined"==typeof Float32Array?r:Float32Array,"%Float64Array%":"undefined"==typeof Float64Array?r:Float64Array,"%FinalizationRegistry%":"undefined"==typeof FinalizationRegistry?r:FinalizationRegistry,"%Function%":f,"%GeneratorFunction%":L,"%Int8Array%":"undefined"==typeof Int8Array?r:Int8Array,"%Int16Array%":"undefined"==typeof Int16Array?r:Int16Array,"%Int32Array%":"undefined"==typeof Int32Array?r:Int32Array,"%isFinite%":isFinite,"%isNaN%":isNaN,"%IteratorPrototype%":C?R(R([][Symbol.iterator]())):r,"%JSON%":"object"==typeof JSON?JSON:r,"%Map%":"undefined"==typeof Map?r:Map,"%MapIteratorPrototype%":"undefined"!=typeof Map&&C?R((new Map)[Symbol.iterator]()):r,"%Math%":Math,"%Number%":Number,"%Object%":Object,"%parseFloat%":parseFloat,"%parseInt%":parseInt,"%Promise%":"undefined"==typeof Promise?r:Promise,"%Proxy%":"undefined"==typeof Proxy?r:Proxy,"%RangeError%":RangeError,"%ReferenceError%":ReferenceError,"%Reflect%":"undefined"==typeof Reflect?r:Reflect,"%RegExp%":RegExp,"%Set%":"undefined"==typeof Set?r:Set,"%SetIteratorPrototype%":"undefined"!=typeof Set&&C?R((new Set)[Symbol.iterator]()):r,"%SharedArrayBuffer%":"undefined"==typeof SharedArrayBuffer?r:SharedArrayBuffer,"%String%":String,"%StringIteratorPrototype%":C?R(""[Symbol.iterator]()):r,"%Symbol%":C?Symbol:r,"%SyntaxError%":a,"%ThrowTypeError%":T,"%TypedArray%":z,"%TypeError%":c,"%Uint8Array%":"undefined"==typeof Uint8Array?r:Uint8Array,"%Uint8ClampedArray%":"undefined"==typeof Uint8ClampedArray?r:Uint8ClampedArray,"%Uint16Array%":"undefined"==typeof Uint16Array?r:Uint16Array,"%Uint32Array%":"undefined"==typeof Uint32Array?r:Uint32Array,"%URIError%":URIError,"%WeakMap%":"undefined"==typeof WeakMap?r:WeakMap,"%WeakRef%":"undefined"==typeof WeakRef?r:WeakRef,"%WeakSet%":"undefined"==typeof WeakSet?r:WeakSet};try{null.error}catch(Ve){var J=R(R(Ve));W["%Error.prototype%"]=J}var ee=function Ve(Be){var xe;if("%AsyncFunction%"===Be)xe=e("async function () {}");else if("%GeneratorFunction%"===Be)xe=e("function* () {}");else if("%AsyncGeneratorFunction%"===Be)xe=e("async function* () {}");else if("%AsyncGenerator%"===Be){var je=Ve("%AsyncGeneratorFunction%");je&&(xe=je.prototype)}else if("%AsyncIteratorPrototype%"===Be){var Ne=Ve("%AsyncGenerator%");Ne&&(xe=R(Ne.prototype))}return W[Be]=xe,xe},ce={"%ArrayBufferPrototype%":["ArrayBuffer","prototype"],"%ArrayPrototype%":["Array","prototype"],"%ArrayProto_entries%":["Array","prototype","entries"],"%ArrayProto_forEach%":["Array","prototype","forEach"],"%ArrayProto_keys%":["Array","prototype","keys"],"%ArrayProto_values%":["Array","prototype","values"],"%AsyncFunctionPrototype%":["AsyncFunction","prototype"],"%AsyncGenerator%":["AsyncGeneratorFunction","prototype"],"%AsyncGeneratorPrototype%":["AsyncGeneratorFunction","prototype","prototype"],"%BooleanPrototype%":["Boolean","prototype"],"%DataViewPrototype%":["DataView","prototype"],"%DatePrototype%":["Date","prototype"],"%ErrorPrototype%":["Error","prototype"],"%EvalErrorPrototype%":["EvalError","prototype"],"%Float32ArrayPrototype%":["Float32Array","prototype"],"%Float64ArrayPrototype%":["Float64Array","prototype"],"%FunctionPrototype%":["Function","prototype"],"%Generator%":["GeneratorFunction","prototype"],"%GeneratorPrototype%":["GeneratorFunction","prototype","prototype"],"%Int8ArrayPrototype%":["Int8Array","prototype"],"%Int16ArrayPrototype%":["Int16Array","prototype"],"%Int32ArrayPrototype%":["Int32Array","prototype"],"%JSONParse%":["JSON","parse"],"%JSONStringify%":["JSON","stringify"],"%MapPrototype%":["Map","prototype"],"%NumberPrototype%":["Number","prototype"],"%ObjectPrototype%":["Object","prototype"],"%ObjProto_toString%":["Object","prototype","toString"],"%ObjProto_valueOf%":["Object","prototype","valueOf"],"%PromisePrototype%":["Promise","prototype"],"%PromiseProto_then%":["Promise","prototype","then"],"%Promise_all%":["Promise","all"],"%Promise_reject%":["Promise","reject"],"%Promise_resolve%":["Promise","resolve"],"%RangeErrorPrototype%":["RangeError","prototype"],"%ReferenceErrorPrototype%":["ReferenceError","prototype"],"%RegExpPrototype%":["RegExp","prototype"],"%SetPrototype%":["Set","prototype"],"%SharedArrayBufferPrototype%":["SharedArrayBuffer","prototype"],"%StringPrototype%":["String","prototype"],"%SymbolPrototype%":["Symbol","prototype"],"%SyntaxErrorPrototype%":["SyntaxError","prototype"],"%TypedArrayPrototype%":["TypedArray","prototype"],"%TypeErrorPrototype%":["TypeError","prototype"],"%Uint8ArrayPrototype%":["Uint8Array","prototype"],"%Uint8ClampedArrayPrototype%":["Uint8ClampedArray","prototype"],"%Uint16ArrayPrototype%":["Uint16Array","prototype"],"%Uint32ArrayPrototype%":["Uint32Array","prototype"],"%URIErrorPrototype%":["URIError","prototype"],"%WeakMapPrototype%":["WeakMap","prototype"],"%WeakSetPrototype%":["WeakSet","prototype"]},ie=i(75396),U=i(57709),se=ie.call(Function.call,Array.prototype.concat),ge=ie.call(Function.apply,Array.prototype.splice),ae=ie.call(Function.call,String.prototype.replace),he=ie.call(Function.call,String.prototype.slice),be=ie.call(Function.call,RegExp.prototype.exec),we=/[^%.[\]]+|\[(?:(-?\d+(?:\.\d+)?)|(["'])((?:(?!\2)[^\\]|\\.)*?)\2)\]|(?=(?:\.|\[\])(?:\.|\[\]|%$))/g,ue=/\\(\\)?/g,st=function(Be){var xe=he(Be,0,1),je=he(Be,-1);if("%"===xe&&"%"!==je)throw new a("invalid intrinsic syntax, expected closing `%`");if("%"===je&&"%"!==xe)throw new a("invalid intrinsic syntax, expected opening `%`");var Ne=[];return ae(Be,we,function(Bt,rt,en,Pt){Ne[Ne.length]=en?ae(Pt,ue,"$1"):rt||Bt}),Ne},We=function(Be,xe){var Ne,je=Be;if(U(ce,je)&&(je="%"+(Ne=ce[je])[0]+"%"),U(W,je)){var Bt=W[je];if(Bt===L&&(Bt=ee(je)),void 0===Bt&&!xe)throw new c("intrinsic "+Be+" exists, but is not available. Please file an issue!");return{alias:Ne,name:je,value:Bt}}throw new a("intrinsic "+Be+" does not exist!")};m.exports=function(Be,xe){if("string"!=typeof Be||0===Be.length)throw new c("intrinsic name must be a non-empty string");if(arguments.length>1&&"boolean"!=typeof xe)throw new c('"allowMissing" argument must be a boolean');if(null===be(/^%?[^%]*%?$/,Be))throw new a("`%` may not be present anywhere but at the beginning and end of the intrinsic name");var je=st(Be),Ne=je.length>0?je[0]:"",Bt=We("%"+Ne+"%",xe),rt=Bt.name,en=Bt.value,Pt=!1,Vt=Bt.alias;Vt&&(Ne=Vt[0],ge(je,se([0,1],Vt)));for(var hn=1,vn=!0;hn<je.length;hn+=1){var mt=je[hn],Nt=he(mt,0,1),St=he(mt,-1);if(('"'===Nt||"'"===Nt||"`"===Nt||'"'===St||"'"===St||"`"===St)&&Nt!==St)throw new a("property names with quotes must have matching quotes");if(("constructor"===mt||!vn)&&(Pt=!0),U(W,rt="%"+(Ne+="."+mt)+"%"))en=W[rt];else if(null!=en){if(!(mt in en)){if(!xe)throw new c("base intrinsic for "+Be+" exists, but the property is not available.");return}if(p&&hn+1>=je.length){var Yt=p(en,mt);en=(vn=!!Yt)&&"get"in Yt&&!("originalValue"in Yt.get)?Yt.get:en[mt]}else vn=U(en,mt),en=en[mt];vn&&!Pt&&(W[rt]=en)}}return en}},59326:(m,S,i)=>{"use strict";var r="undefined"!=typeof Symbol&&Symbol,a=i(79045);m.exports=function(){return"function"==typeof r&&"function"==typeof Symbol&&"symbol"==typeof r("foo")&&"symbol"==typeof Symbol("bar")&&a()}},79045:m=>{"use strict";m.exports=function(){if("function"!=typeof Symbol||"function"!=typeof Object.getOwnPropertySymbols)return!1;if("symbol"==typeof Symbol.iterator)return!0;var i={},r=Symbol("test"),a=Object(r);if("string"==typeof r||"[object Symbol]"!==Object.prototype.toString.call(r)||"[object Symbol]"!==Object.prototype.toString.call(a))return!1;for(r in i[r]=42,i)return!1;if("function"==typeof Object.keys&&0!==Object.keys(i).length||"function"==typeof Object.getOwnPropertyNames&&0!==Object.getOwnPropertyNames(i).length)return!1;var c=Object.getOwnPropertySymbols(i);if(1!==c.length||c[0]!==r||!Object.prototype.propertyIsEnumerable.call(i,r))return!1;if("function"==typeof Object.getOwnPropertyDescriptor){var e=Object.getOwnPropertyDescriptor(i,r);if(42!==e.value||!0!==e.enumerable)return!1}return!0}},57709:(m,S,i)=>{"use strict";var r=i(75396);m.exports=r.call(Function.call,Object.prototype.hasOwnProperty)},7856:m=>{function S(cn){return cn instanceof Map?cn.clear=cn.delete=cn.set=function(){throw new Error("map is read-only")}:cn instanceof Set&&(cn.add=cn.clear=cn.delete=function(){throw new Error("set is read-only")}),Object.freeze(cn),Object.getOwnPropertyNames(cn).forEach(function(Sn){var Or=cn[Sn];"object"==typeof Or&&!Object.isFrozen(Or)&&S(Or)}),cn}var i=S;i.default=S;class a{constructor(Sn){void 0===Sn.data&&(Sn.data={}),this.data=Sn.data,this.isMatchIgnored=!1}ignoreMatch(){this.isMatchIgnored=!0}}function f(cn){return cn.replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;").replace(/"/g,"&quot;").replace(/'/g,"&#x27;")}function c(cn,...Sn){const Or=Object.create(null);for(const ri in cn)Or[ri]=cn[ri];return Sn.forEach(function(ri){for(const vi in ri)Or[vi]=ri[vi]}),Or}const p=cn=>!!cn.kind;class y{constructor(Sn,Or){this.buffer="",this.classPrefix=Or.classPrefix,Sn.walk(this)}addText(Sn){this.buffer+=f(Sn)}openNode(Sn){if(!p(Sn))return;let Or=Sn.kind;Sn.sublanguage||(Or=`${this.classPrefix}${Or}`),this.span(Or)}closeNode(Sn){!p(Sn)||(this.buffer+="</span>")}value(){return this.buffer}span(Sn){this.buffer+=`<span class="${Sn}">`}}class T{constructor(){this.rootNode={children:[]},this.stack=[this.rootNode]}get top(){return this.stack[this.stack.length-1]}get root(){return this.rootNode}add(Sn){this.top.children.push(Sn)}openNode(Sn){const Or={kind:Sn,children:[]};this.add(Or),this.stack.push(Or)}closeNode(){if(this.stack.length>1)return this.stack.pop()}closeAllNodes(){for(;this.closeNode(););}toJSON(){return JSON.stringify(this.rootNode,null,4)}walk(Sn){return this.constructor._walk(Sn,this.rootNode)}static _walk(Sn,Or){return"string"==typeof Or?Sn.addText(Or):Or.children&&(Sn.openNode(Or),Or.children.forEach(ri=>this._walk(Sn,ri)),Sn.closeNode(Or)),Sn}static _collapse(Sn){"string"!=typeof Sn&&(!Sn.children||(Sn.children.every(Or=>"string"==typeof Or)?Sn.children=[Sn.children.join("")]:Sn.children.forEach(Or=>{T._collapse(Or)})))}}class C extends T{constructor(Sn){super(),this.options=Sn}addKeyword(Sn,Or){""!==Sn&&(this.openNode(Or),this.addText(Sn),this.closeNode())}addText(Sn){""!==Sn&&this.add(Sn)}addSublanguage(Sn,Or){const ri=Sn.root;ri.kind=Or,ri.sublanguage=!0,this.add(ri)}toHTML(){return new y(this,this.options).value()}finalize(){return!0}}function L(cn){return cn?"string"==typeof cn?cn:cn.source:null}const ce=/\[(?:[^\\\]]|\\.)*\]|\(\??|\\([1-9][0-9]*)|\\./,se="[a-zA-Z]\\w*",ge="[a-zA-Z_]\\w*",ae="\\b\\d+(\\.\\d+)?",he="(-?)(\\b0[xX][a-fA-F0-9]+|(\\b\\d+(\\.\\d*)?|\\.\\d+)([eE][-+]?\\d+)?)",be="\\b(0b[01]+)",st={begin:"\\\\[\\s\\S]",relevance:0},We={className:"string",begin:"'",end:"'",illegal:"\\n",contains:[st]},Ve={className:"string",begin:'"',end:'"',illegal:"\\n",contains:[st]},Be={begin:/\b(a|an|the|are|I'm|isn't|don't|doesn't|won't|but|just|should|pretty|simply|enough|gonna|going|wtf|so|such|will|you|your|they|like|more)\b/},xe=function(cn,Sn,Or={}){const ri=c({className:"comment",begin:cn,end:Sn,contains:[]},Or);return ri.contains.push(Be),ri.contains.push({className:"doctag",begin:"(?:TODO|FIXME|NOTE|BUG|OPTIMIZE|HACK|XXX):",relevance:0}),ri},je=xe("//","$"),Ne=xe("/\\*","\\*/"),Bt=xe("#","$");var Yt=Object.freeze({__proto__:null,MATCH_NOTHING_RE:/\b\B/,IDENT_RE:se,UNDERSCORE_IDENT_RE:ge,NUMBER_RE:ae,C_NUMBER_RE:he,BINARY_NUMBER_RE:be,RE_STARTERS_RE:"!|!=|!==|%|%=|&|&&|&=|\\*|\\*=|\\+|\\+=|,|-|-=|/=|/|:|;|<<|<<=|<=|<|===|==|=|>>>=|>>=|>=|>>>|>>|>|\\?|\\[|\\{|\\(|\\^|\\^=|\\||\\|=|\\|\\||~",SHEBANG:(cn={})=>{const Sn=/^#![ ]*\//;return cn.binary&&(cn.begin=function z(...cn){return cn.map(Or=>L(Or)).join("")}(Sn,/.*\b/,cn.binary,/\b.*/)),c({className:"meta",begin:Sn,end:/$/,relevance:0,"on:begin":(Or,ri)=>{0!==Or.index&&ri.ignoreMatch()}},cn)},BACKSLASH_ESCAPE:st,APOS_STRING_MODE:We,QUOTE_STRING_MODE:Ve,PHRASAL_WORDS_MODE:Be,COMMENT:xe,C_LINE_COMMENT_MODE:je,C_BLOCK_COMMENT_MODE:Ne,HASH_COMMENT_MODE:Bt,NUMBER_MODE:{className:"number",begin:ae,relevance:0},C_NUMBER_MODE:{className:"number",begin:he,relevance:0},BINARY_NUMBER_MODE:{className:"number",begin:be,relevance:0},CSS_NUMBER_MODE:{className:"number",begin:ae+"(%|em|ex|ch|rem|vw|vh|vmin|vmax|cm|mm|in|pt|pc|px|deg|grad|rad|turn|s|ms|Hz|kHz|dpi|dpcm|dppx)?",relevance:0},REGEXP_MODE:{begin:/(?=\/[^/\n]*\/)/,contains:[{className:"regexp",begin:/\//,end:/\/[gimuy]*/,illegal:/\n/,contains:[st,{begin:/\[/,end:/\]/,relevance:0,contains:[st]}]}]},TITLE_MODE:{className:"title",begin:se,relevance:0},UNDERSCORE_TITLE_MODE:{className:"title",begin:ge,relevance:0},METHOD_GUARD:{begin:"\\.\\s*"+ge,relevance:0},END_SAME_AS_BEGIN:function(cn){return Object.assign(cn,{"on:begin":(Sn,Or)=>{Or.data._beginMatch=Sn[1]},"on:end":(Sn,Or)=>{Or.data._beginMatch!==Sn[1]&&Or.ignoreMatch()}})}});function Fn(cn,Sn){"."===cn.input[cn.index-1]&&Sn.ignoreMatch()}function pr(cn,Sn){!Sn||!cn.beginKeywords||(cn.begin="\\b("+cn.beginKeywords.split(" ").join("|")+")(?!\\.)(?=\\b|\\s)",cn.__beforeBegin=Fn,cn.keywords=cn.keywords||cn.beginKeywords,delete cn.beginKeywords,void 0===cn.relevance&&(cn.relevance=0))}function Ei(cn,Sn){!Array.isArray(cn.illegal)||(cn.illegal=function W(...cn){return"("+cn.map(Or=>L(Or)).join("|")+")"}(...cn.illegal))}function mi(cn,Sn){if(cn.match){if(cn.begin||cn.end)throw new Error("begin & end are not supported with match");cn.begin=cn.match,delete cn.match}}function ur(cn,Sn){void 0===cn.relevance&&(cn.relevance=1)}const $r=["of","and","for","in","not","or","if","then","parent","list","value"];function Pn(cn,Sn,Or="keyword"){const ri={};return"string"==typeof cn?vi(Or,cn.split(" ")):Array.isArray(cn)?vi(Or,cn):Object.keys(cn).forEach(function(Ui){Object.assign(ri,Pn(cn[Ui],Sn,Ui))}),ri;function vi(Ui,ao){Sn&&(ao=ao.map(dt=>dt.toLowerCase())),ao.forEach(function(dt){const Bi=dt.split("|");ri[Bi[0]]=[Ui,Xn(Bi[0],Bi[1])]})}}function Xn(cn,Sn){return Sn?Number(Sn):function dr(cn){return $r.includes(cn.toLowerCase())}(cn)?0:1}function Qr(cn,{}){function Or(dt,Bi){return new RegExp(L(dt),"m"+(cn.case_insensitive?"i":"")+(Bi?"g":""))}class ri{constructor(){this.matchIndexes={},this.regexes=[],this.matchAt=1,this.position=0}addRule(Bi,to){to.position=this.position++,this.matchIndexes[this.matchAt]=to,this.regexes.push([to,Bi]),this.matchAt+=function J(cn){return new RegExp(cn.toString()+"|").exec("").length-1}(Bi)+1}compile(){0===this.regexes.length&&(this.exec=()=>null);const Bi=this.regexes.map(to=>to[1]);this.matcherRe=Or(function ie(cn,Sn="|"){let Or=0;return cn.map(ri=>{Or+=1;const vi=Or;let Ui=L(ri),ao="";for(;Ui.length>0;){const dt=ce.exec(Ui);if(!dt){ao+=Ui;break}ao+=Ui.substring(0,dt.index),Ui=Ui.substring(dt.index+dt[0].length),"\\"===dt[0][0]&&dt[1]?ao+="\\"+String(Number(dt[1])+vi):(ao+=dt[0],"("===dt[0]&&Or++)}return ao}).map(ri=>`(${ri})`).join(Sn)}(Bi),!0),this.lastIndex=0}exec(Bi){this.matcherRe.lastIndex=this.lastIndex;const to=this.matcherRe.exec(Bi);if(!to)return null;const Gt=to.findIndex((_t,Rt)=>Rt>0&&void 0!==_t),Rn=this.matchIndexes[Gt];return to.splice(0,Gt),Object.assign(to,Rn)}}class vi{constructor(){this.rules=[],this.multiRegexes=[],this.count=0,this.lastIndex=0,this.regexIndex=0}getMatcher(Bi){if(this.multiRegexes[Bi])return this.multiRegexes[Bi];const to=new ri;return this.rules.slice(Bi).forEach(([Gt,Rn])=>to.addRule(Gt,Rn)),to.compile(),this.multiRegexes[Bi]=to,to}resumingScanAtSamePosition(){return 0!==this.regexIndex}considerAll(){this.regexIndex=0}addRule(Bi,to){this.rules.push([Bi,to]),"begin"===to.type&&this.count++}exec(Bi){const to=this.getMatcher(this.regexIndex);to.lastIndex=this.lastIndex;let Gt=to.exec(Bi);if(this.resumingScanAtSamePosition()&&(!Gt||Gt.index!==this.lastIndex)){const Rn=this.getMatcher(0);Rn.lastIndex=this.lastIndex+1,Gt=Rn.exec(Bi)}return Gt&&(this.regexIndex+=Gt.position+1,this.regexIndex===this.count&&this.considerAll()),Gt}}if(cn.compilerExtensions||(cn.compilerExtensions=[]),cn.contains&&cn.contains.includes("self"))throw new Error("ERR: contains `self` is not supported at the top-level of a language.  See documentation.");return cn.classNameAliases=c(cn.classNameAliases||{}),function ao(dt,Bi){const to=dt;if(dt.isCompiled)return to;[mi].forEach(Rn=>Rn(dt,Bi)),cn.compilerExtensions.forEach(Rn=>Rn(dt,Bi)),dt.__beforeBegin=null,[pr,Ei,ur].forEach(Rn=>Rn(dt,Bi)),dt.isCompiled=!0;let Gt=null;if("object"==typeof dt.keywords&&(Gt=dt.keywords.$pattern,delete dt.keywords.$pattern),dt.keywords&&(dt.keywords=Pn(dt.keywords,cn.case_insensitive)),dt.lexemes&&Gt)throw new Error("ERR: Prefer `keywords.$pattern` to `mode.lexemes`, BOTH are not allowed. (see mode reference) ");return Gt=Gt||dt.lexemes||/\w+/,to.keywordPatternRe=Or(Gt,!0),Bi&&(dt.begin||(dt.begin=/\B|\b/),to.beginRe=Or(dt.begin),dt.endSameAsBegin&&(dt.end=dt.begin),!dt.end&&!dt.endsWithParent&&(dt.end=/\B|\b/),dt.end&&(to.endRe=Or(dt.end)),to.terminatorEnd=L(dt.end)||"",dt.endsWithParent&&Bi.terminatorEnd&&(to.terminatorEnd+=(dt.end?"|":"")+Bi.terminatorEnd)),dt.illegal&&(to.illegalRe=Or(dt.illegal)),dt.contains||(dt.contains=[]),dt.contains=[].concat(...dt.contains.map(function(Rn){return function _i(cn){return cn.variants&&!cn.cachedVariants&&(cn.cachedVariants=cn.variants.map(function(Sn){return c(cn,{variants:null},Sn)})),cn.cachedVariants?cn.cachedVariants:Ci(cn)?c(cn,{starts:cn.starts?c(cn.starts):null}):Object.isFrozen(cn)?c(cn):cn}("self"===Rn?dt:Rn)})),dt.contains.forEach(function(Rn){ao(Rn,to)}),dt.starts&&ao(dt.starts,Bi),to.matcher=function Ui(dt){const Bi=new vi;return dt.contains.forEach(to=>Bi.addRule(to.begin,{rule:to,type:"begin"})),dt.terminatorEnd&&Bi.addRule(dt.terminatorEnd,{type:"end"}),dt.illegal&&Bi.addRule(dt.illegal,{type:"illegal"}),Bi}(to),to}(cn)}function Ci(cn){return!!cn&&(cn.endsWithParent||Ci(cn.starts))}function Sr(cn){const Sn={props:["language","code","autodetect"],data:function(){return{detectedLanguage:"",unknownLanguage:!1}},computed:{className(){return this.unknownLanguage?"":"hljs "+this.detectedLanguage},highlighted(){if(!this.autoDetect&&!cn.getLanguage(this.language))return console.warn(`The language "${this.language}" you specified could not be found.`),this.unknownLanguage=!0,f(this.code);let ri={};return this.autoDetect?(ri=cn.highlightAuto(this.code),this.detectedLanguage=ri.language):(ri=cn.highlight(this.language,this.code,this.ignoreIllegals),this.detectedLanguage=this.language),ri.value},autoDetect(){return!this.language||function Ro(cn){return Boolean(cn||""===cn)}(this.autodetect)},ignoreIllegals:()=>!0},render(ri){return ri("pre",{},[ri("code",{class:this.className,domProps:{innerHTML:this.highlighted}})])}};return{Component:Sn,VuePlugin:{install(ri){ri.component("highlightjs",Sn)}}}}const Kt={"after:highlightElement":({el:cn,result:Sn,text:Or})=>{const ri=jn(cn);if(!ri.length)return;const vi=document.createElement("div");vi.innerHTML=Sn.value,Sn.value=function Jn(cn,Sn,Or){let ri=0,vi="";const Ui=[];function ao(){return cn.length&&Sn.length?cn[0].offset!==Sn[0].offset?cn[0].offset<Sn[0].offset?cn:Sn:"start"===Sn[0].event?cn:Sn:cn.length?cn:Sn}function dt(Gt){vi+="<"+un(Gt)+[].map.call(Gt.attributes,function Rn(_t){return" "+_t.nodeName+'="'+f(_t.value)+'"'}).join("")+">"}function Bi(Gt){vi+="</"+un(Gt)+">"}function to(Gt){("start"===Gt.event?dt:Bi)(Gt.node)}for(;cn.length||Sn.length;){let Gt=ao();if(vi+=f(Or.substring(ri,Gt[0].offset)),ri=Gt[0].offset,Gt===cn){Ui.reverse().forEach(Bi);do{to(Gt.splice(0,1)[0]),Gt=ao()}while(Gt===cn&&Gt.length&&Gt[0].offset===ri);Ui.reverse().forEach(dt)}else"start"===Gt[0].event?Ui.push(Gt[0].node):Ui.pop(),to(Gt.splice(0,1)[0])}return vi+f(Or.substr(ri))}(ri,jn(vi),Or)}};function un(cn){return cn.nodeName.toLowerCase()}function jn(cn){const Sn=[];return function Or(ri,vi){for(let Ui=ri.firstChild;Ui;Ui=Ui.nextSibling)3===Ui.nodeType?vi+=Ui.nodeValue.length:1===Ui.nodeType&&(Sn.push({event:"start",offset:vi,node:Ui}),vi=Or(Ui,vi),un(Ui).match(/br|hr|img|input/)||Sn.push({event:"stop",offset:vi,node:Ui}));return vi}(cn,0),Sn}const Gn={},Xr=cn=>{console.error(cn)},Zi=(cn,...Sn)=>{console.log(`WARN: ${cn}`,...Sn)},ii=(cn,Sn)=>{Gn[`${cn}/${Sn}`]||(console.log(`Deprecated as of ${cn}. ${Sn}`),Gn[`${cn}/${Sn}`]=!0)},hr=f,Ki=c,ln=Symbol("nomatch");var Zn=function(cn){const Sn=Object.create(null),Or=Object.create(null),ri=[];let vi=!0;const Ui=/(^(<[^>]+>|\t|)+|\n)/gm,ao="Could not find the language '{}', did you forget to load/include a language module?",dt={disableAutodetect:!0,name:"Plain text",contains:[]};let Bi={noHighlightRe:/^(no-?highlight)$/i,languageDetectRe:/\blang(?:uage)?-([\w-]+)\b/i,classPrefix:"hljs-",tabReplace:null,useBR:!1,languages:null,__emitter:C};function to(vr){return Bi.noHighlightRe.test(vr)}function Rn(vr,yr,or,si){let pn="",xn="";"object"==typeof yr?(pn=vr,or=yr.ignoreIllegals,xn=yr.language,si=void 0):(ii("10.7.0","highlight(lang, code, ...args) has been deprecated."),ii("10.7.0","Please use highlight(code, options) instead.\nhttps://github.com/highlightjs/highlight.js/issues/2277"),xn=vr,pn=yr);const Gr={code:pn,language:xn};Go("before:highlight",Gr);const no=Gr.result?Gr.result:_t(Gr.language,Gr.code,or,si);return no.code=Gr.code,Go("after:highlight",no),no}function _t(vr,yr,or,si){function pn(ko,Co){const Ps=la.case_insensitive?Co[0].toLowerCase():Co[0];return Object.prototype.hasOwnProperty.call(ko.keywords,Ps)&&ko.keywords[Ps]}function no(){null!=To.subLanguage?function Gr(){if(""===vs)return;let ko=null;if("string"==typeof To.subLanguage){if(!Sn[To.subLanguage])return void Zo.addText(vs);ko=_t(To.subLanguage,vs,!0,ml[To.subLanguage]),ml[To.subLanguage]=ko.top}else ko=ct(vs,To.subLanguage.length?To.subLanguage:null);To.relevance>0&&(Za+=ko.relevance),Zo.addSublanguage(ko.emitter,ko.language)}():function xn(){if(!To.keywords)return void Zo.addText(vs);let ko=0;To.keywordPatternRe.lastIndex=0;let Co=To.keywordPatternRe.exec(vs),Ps="";for(;Co;){Ps+=vs.substring(ko,Co.index);const ps=pn(To,Co);if(ps){const[Oo,Nr]=ps;Zo.addText(Ps),Ps="",Za+=Nr,Oo.startsWith("_")?Ps+=Co[0]:Zo.addKeyword(Co[0],la.classNameAliases[Oo]||Oo)}else Ps+=Co[0];ko=To.keywordPatternRe.lastIndex,Co=To.keywordPatternRe.exec(vs)}Ps+=vs.substr(ko),Zo.addText(Ps)}(),vs=""}function mo(ko){return ko.className&&Zo.openNode(la.classNameAliases[ko.className]||ko.className),To=Object.create(ko,{parent:{value:To}}),To}function wo(ko,Co,Ps){let ps=function ee(cn,Sn){const Or=cn&&cn.exec(Sn);return Or&&0===Or.index}(ko.endRe,Ps);if(ps){if(ko["on:end"]){const Oo=new a(ko);ko["on:end"](Co,Oo),Oo.isMatchIgnored&&(ps=!1)}if(ps){for(;ko.endsParent&&ko.parent;)ko=ko.parent;return ko}}if(ko.endsWithParent)return wo(ko.parent,Co,Ps)}function Us(ko){return 0===To.matcher.regexIndex?(vs+=ko[0],1):(Ys=!0,0)}function es(ko){const Co=ko[0],Ps=yr.substr(ko.index),ps=wo(To,ko,Ps);if(!ps)return ln;const Oo=To;Oo.skip?vs+=Co:(Oo.returnEnd||Oo.excludeEnd||(vs+=Co),no(),Oo.excludeEnd&&(vs=Co));do{To.className&&Zo.closeNode(),!To.skip&&!To.subLanguage&&(Za+=To.relevance),To=To.parent}while(To!==ps.parent);return ps.starts&&(ps.endSameAsBegin&&(ps.starts.endRe=ps.endRe),mo(ps.starts)),Oo.returnEnd?0:Co.length}let ya={};function fa(ko,Co){const Ps=Co&&Co[0];if(vs+=ko,null==Ps)return no(),0;if("begin"===ya.type&&"end"===Co.type&&ya.index===Co.index&&""===Ps){if(vs+=yr.slice(Co.index,Co.index+1),!vi){const ps=new Error("0 width match regex");throw ps.languageName=vr,ps.badRule=ya.rule,ps}return 1}if(ya=Co,"begin"===Co.type)return function cs(ko){const Co=ko[0],Ps=ko.rule,ps=new a(Ps),Oo=[Ps.__beforeBegin,Ps["on:begin"]];for(const Nr of Oo)if(Nr&&(Nr(ko,ps),ps.isMatchIgnored))return Us(Co);return Ps&&Ps.endSameAsBegin&&(Ps.endRe=function R(cn){return new RegExp(cn.replace(/[-/\\^$*+?.()|[\]{}]/g,"\\$&"),"m")}(Co)),Ps.skip?vs+=Co:(Ps.excludeBegin&&(vs+=Co),no(),!Ps.returnBegin&&!Ps.excludeBegin&&(vs=Co)),mo(Ps),Ps.returnBegin?0:Co.length}(Co);if("illegal"===Co.type&&!or){const ps=new Error('Illegal lexeme "'+Ps+'" for mode "'+(To.className||"<unnamed>")+'"');throw ps.mode=To,ps}if("end"===Co.type){const ps=es(Co);if(ps!==ln)return ps}if("illegal"===Co.type&&""===Ps)return 1;if(tl>1e5&&tl>3*Co.index)throw new Error("potential infinite loop, way more iterations than matches");return vs+=Ps,Ps.length}const la=Fr(vr);if(!la)throw Xr(ao.replace("{}",vr)),new Error('Unknown language: "'+vr+'"');const Pa=Qr(la,{plugins:ri});let fl="",To=si||Pa;const ml={},Zo=new Bi.__emitter(Bi);!function ga(){const ko=[];for(let Co=To;Co!==la;Co=Co.parent)Co.className&&ko.unshift(Co.className);ko.forEach(Co=>Zo.openNode(Co))}();let vs="",Za=0,Is=0,tl=0,Ys=!1;try{for(To.matcher.considerAll();;){tl++,Ys?Ys=!1:To.matcher.considerAll(),To.matcher.lastIndex=Is;const ko=To.matcher.exec(yr);if(!ko)break;const Ps=fa(yr.substring(Is,ko.index),ko);Is=ko.index+Ps}return fa(yr.substr(Is)),Zo.closeAllNodes(),Zo.finalize(),fl=Zo.toHTML(),{relevance:Math.floor(Za),value:fl,language:vr,illegal:!1,emitter:Zo,top:To}}catch(ko){if(ko.message&&ko.message.includes("Illegal"))return{illegal:!0,illegalBy:{msg:ko.message,context:yr.slice(Is-100,Is+100),mode:ko.mode},sofar:fl,relevance:0,value:hr(yr),emitter:Zo};if(vi)return{illegal:!1,relevance:0,value:hr(yr),emitter:Zo,language:vr,top:To,errorRaised:ko};throw ko}}function ct(vr,yr){yr=yr||Bi.languages||Object.keys(Sn);const or=function Rt(vr){const yr={relevance:0,emitter:new Bi.__emitter(Bi),value:hr(vr),illegal:!1,top:dt};return yr.emitter.addText(vr),yr}(vr),si=yr.filter(Fr).filter(Li).map(mo=>_t(mo,vr,!1));si.unshift(or);const pn=si.sort((mo,wo)=>{if(mo.relevance!==wo.relevance)return wo.relevance-mo.relevance;if(mo.language&&wo.language){if(Fr(mo.language).supersetOf===wo.language)return 1;if(Fr(wo.language).supersetOf===mo.language)return-1}return 0}),[xn,Gr]=pn,no=xn;return no.second_best=Gr,no}const dn={"before:highlightElement":({el:vr})=>{Bi.useBR&&(vr.innerHTML=vr.innerHTML.replace(/\n/g,"").replace(/<br[ /]*>/g,"\n"))},"after:highlightElement":({result:vr})=>{Bi.useBR&&(vr.value=vr.value.replace(/\n/g,"<br>"))}},mr=/^(<[^>]+>|\t)+/gm,Oi={"after:highlightElement":({result:vr})=>{Bi.tabReplace&&(vr.value=vr.value.replace(mr,yr=>yr.replace(/\t/g,Bi.tabReplace)))}};function di(vr){let yr=null;const or=function Gt(vr){let yr=vr.className+" ";yr+=vr.parentNode?vr.parentNode.className:"";const or=Bi.languageDetectRe.exec(yr);if(or){const si=Fr(or[1]);return si||(Zi(ao.replace("{}",or[1])),Zi("Falling back to no-highlight mode for this block.",vr)),si?or[1]:"no-highlight"}return yr.split(/\s+/).find(si=>to(si)||Fr(si))}(vr);if(to(or))return;Go("before:highlightElement",{el:vr,language:or}),yr=vr;const si=yr.textContent,pn=or?Rn(si,{language:or,ignoreIllegals:!0}):ct(si);Go("after:highlightElement",{el:vr,result:pn,text:si}),vr.innerHTML=pn.value,function kt(vr,yr,or){const si=yr?Or[yr]:or;vr.classList.add("hljs"),si&&vr.classList.add(si)}(vr,or,pn.language),vr.result={language:pn.language,re:pn.relevance,relavance:pn.relevance},pn.second_best&&(vr.second_best={language:pn.second_best.language,re:pn.second_best.relevance,relavance:pn.second_best.relevance})}const Qo=()=>{Qo.called||(Qo.called=!0,ii("10.6.0","initHighlighting() is deprecated.  Use highlightAll() instead."),document.querySelectorAll("pre code").forEach(di))};let Ai=!1;function Fo(){"loading"!==document.readyState?document.querySelectorAll("pre code").forEach(di):Ai=!0}function Fr(vr){return vr=(vr||"").toLowerCase(),Sn[vr]||Sn[Or[vr]]}function oo(vr,{languageName:yr}){"string"==typeof vr&&(vr=[vr]),vr.forEach(or=>{Or[or.toLowerCase()]=yr})}function Li(vr){const yr=Fr(vr);return yr&&!yr.disableAutodetect}function Go(vr,yr){const or=vr;ri.forEach(function(si){si[or]&&si[or](yr)})}"undefined"!=typeof window&&window.addEventListener&&window.addEventListener("DOMContentLoaded",function Ko(){Ai&&Fo()},!1),Object.assign(cn,{highlight:Rn,highlightAuto:ct,highlightAll:Fo,fixMarkup:function ua(vr){return ii("10.2.0","fixMarkup will be removed entirely in v11.0"),ii("10.2.0","Please see https://github.com/highlightjs/highlight.js/issues/2534"),function pt(vr){return Bi.tabReplace||Bi.useBR?vr.replace(Ui,yr=>"\n"===yr?Bi.useBR?"<br>":yr:Bi.tabReplace?yr.replace(/\t/g,Bi.tabReplace):yr):vr}(vr)},highlightElement:di,highlightBlock:function er(vr){return ii("10.7.0","highlightBlock will be removed entirely in v12.0"),ii("10.7.0","Please use highlightElement now."),di(vr)},configure:function Uo(vr){vr.useBR&&(ii("10.3.0","'useBR' will be removed entirely in v11.0"),ii("10.3.0","Please see https://github.com/highlightjs/highlight.js/issues/2559")),Bi=Ki(Bi,vr)},initHighlighting:Qo,initHighlightingOnLoad:function lo(){ii("10.6.0","initHighlightingOnLoad() is deprecated.  Use highlightAll() instead."),Ai=!0},registerLanguage:function qn(vr,yr){let or=null;try{or=yr(cn)}catch(si){if(Xr("Language definition for '{}' could not be registered.".replace("{}",vr)),!vi)throw si;Xr(si),or=dt}or.name||(or.name=vr),Sn[vr]=or,or.rawDefinition=yr.bind(null,cn),or.aliases&&oo(or.aliases,{languageName:vr})},unregisterLanguage:function ei(vr){delete Sn[vr];for(const yr of Object.keys(Or))Or[yr]===vr&&delete Or[yr]},listLanguages:function wn(){return Object.keys(Sn)},getLanguage:Fr,registerAliases:oo,requireLanguage:function Qn(vr){ii("10.4.0","requireLanguage will be removed entirely in v11."),ii("10.4.0","Please see https://github.com/highlightjs/highlight.js/pull/2844");const yr=Fr(vr);if(yr)return yr;throw new Error("The '{}' language is required, but not loaded.".replace("{}",vr))},autoDetection:Li,inherit:Ki,addPlugin:function go(vr){(function yo(vr){vr["before:highlightBlock"]&&!vr["before:highlightElement"]&&(vr["before:highlightElement"]=yr=>{vr["before:highlightBlock"](Object.assign({block:yr.el},yr))}),vr["after:highlightBlock"]&&!vr["after:highlightElement"]&&(vr["after:highlightElement"]=yr=>{vr["after:highlightBlock"](Object.assign({block:yr.el},yr))})})(vr),ri.push(vr)},vuePlugin:Sr(cn).VuePlugin}),cn.debugMode=function(){vi=!1},cn.safeMode=function(){vi=!0},cn.versionString="10.7.3";for(const vr in Yt)"object"==typeof Yt[vr]&&i(Yt[vr]);return Object.assign(cn,Yt),cn.addPlugin(dn),cn.addPlugin(Kt),cn.addPlugin(Oi),cn}({});m.exports=Zn},4357:m=>{function i(...a){return a.map(c=>function S(a){return a?"string"==typeof a?a:a.source:null}(c)).join("")}m.exports=function r(a){const f={},c={begin:/\$\{/,end:/\}/,contains:["self",{begin:/:-/,contains:[f]}]};Object.assign(f,{className:"variable",variants:[{begin:i(/\$[\w\d#@][\w\d_]*/,"(?![\\w\\d])(?![$])")},c]});const e={className:"subst",begin:/\$\(/,end:/\)/,contains:[a.BACKSLASH_ESCAPE]},p={begin:/<<-?\s*(?=\w+)/,starts:{contains:[a.END_SAME_AS_BEGIN({begin:/(\w+)/,end:/(\w+)/,className:"string"})]}},y={className:"string",begin:/"/,end:/"/,contains:[a.BACKSLASH_ESCAPE,f,e]};e.contains.push(y);const R={begin:/\$\(\(/,end:/\)\)/,contains:[{begin:/\d+#[0-9a-f]+/,className:"number"},a.NUMBER_MODE,f]},z=a.SHEBANG({binary:`(${["fish","bash","zsh","sh","csh","ksh","tcsh","dash","scsh"].join("|")})`,relevance:10}),W={className:"function",begin:/\w[\w\d_]*\s*\(\s*\)\s*\{/,returnBegin:!0,contains:[a.inherit(a.TITLE_MODE,{begin:/\w[\w\d_]*/})],relevance:0};return{name:"Bash",aliases:["sh","zsh"],keywords:{$pattern:/\b[a-z._-]+\b/,keyword:"if then else elif fi for while in do done case esac function",literal:"true false",built_in:"break cd continue eval exec exit export getopts hash pwd readonly return shift test times trap umask unset alias bind builtin caller command declare echo enable help let local logout mapfile printf read readarray source type typeset ulimit unalias set shopt autoload bg bindkey bye cap chdir clone comparguments compcall compctl compdescribe compfiles compgroups compquote comptags comptry compvalues dirs disable disown echotc echoti emulate fc fg float functions getcap getln history integer jobs kill limit log noglob popd print pushd pushln rehash sched setcap setopt stat suspend ttyctl unfunction unhash unlimit unsetopt vared wait whence where which zcompile zformat zftp zle zmodload zparseopts zprof zpty zregexparse zsocket zstyle ztcp"},contains:[z,a.SHEBANG(),W,R,a.HASH_COMMENT_MODE,p,y,{className:"",begin:/\\"/},{className:"string",begin:/'/,end:/'/},f]}}},28390:m=>{function i(...a){return a.map(c=>function S(a){return a?"string"==typeof a?a:a.source:null}(c)).join("")}m.exports=function r(a){const f="HTTP/(2|1\\.[01])",e={className:"attribute",begin:i("^",/[A-Za-z][A-Za-z0-9-]*/,"(?=\\:\\s)"),starts:{contains:[{className:"punctuation",begin:/: /,relevance:0,starts:{end:"$",relevance:0}}]}},p=[e,{begin:"\\n\\n",starts:{subLanguage:[],endsWithParent:!0}}];return{name:"HTTP",aliases:["https"],illegal:/\S/,contains:[{begin:"^(?="+f+" \\d{3})",end:/$/,contains:[{className:"meta",begin:f},{className:"number",begin:"\\b\\d{3}\\b"}],starts:{end:/\b\B/,illegal:/\S/,contains:p}},{begin:"(?=^[A-Z]+ (.*?) "+f+"$)",end:/$/,contains:[{className:"string",begin:" ",end:" ",excludeBegin:!0,excludeEnd:!0},{className:"meta",begin:f},{className:"keyword",begin:"[A-Z]+"}],starts:{end:/\b\B/,illegal:/\S/,contains:p}},a.inherit(e,{relevance:0})]}}},36147:m=>{const S="[A-Za-z$_][0-9A-Za-z$_]*",i=["as","in","of","if","for","while","finally","var","new","function","do","return","void","else","break","catch","instanceof","with","throw","case","default","try","switch","continue","typeof","delete","let","yield","const","class","debugger","async","await","static","import","from","export","extends"],r=["true","false","null","undefined","NaN","Infinity"],p=[].concat(["setInterval","setTimeout","clearInterval","clearTimeout","require","exports","eval","isFinite","isNaN","parseFloat","parseInt","decodeURI","decodeURIComponent","encodeURI","encodeURIComponent","escape","unescape"],["arguments","this","super","console","window","document","localStorage","module","global"],["Intl","DataView","Number","Math","Date","String","RegExp","Object","Function","Boolean","Error","Symbol","Set","Map","WeakSet","WeakMap","Proxy","Reflect","JSON","Promise","Float64Array","Int16Array","Int32Array","Int8Array","Uint16Array","Uint32Array","Float32Array","Array","Uint8Array","Uint8ClampedArray","ArrayBuffer","BigInt64Array","BigUint64Array","BigInt"],["EvalError","InternalError","RangeError","ReferenceError","SyntaxError","TypeError","URIError"]);function T(L){return C("(?=",L,")")}function C(...L){return L.map(W=>function y(L){return L?"string"==typeof L?L:L.source:null}(W)).join("")}m.exports=function R(L){const W=S,ee={begin:/<[A-Za-z0-9\\._:-]+/,end:/\/[A-Za-z0-9\\._:-]+>|\/>/,isTrulyOpeningTag:(je,Ne)=>{const Bt=je[0].length+je.index,rt=je.input[Bt];"<"!==rt?">"===rt&&(((je,{after:Ne})=>{const Bt="</"+je[0].slice(1);return-1!==je.input.indexOf(Bt,Ne)})(je,{after:Bt})||Ne.ignoreMatch()):Ne.ignoreMatch()}},ce={$pattern:S,keyword:i,literal:r,built_in:p},ie="[0-9](_?[0-9])*",U=`\\.(${ie})`,se="0|[1-9](_?[0-9])*|0[0-7]*[89][0-9]*",ge={className:"number",variants:[{begin:`(\\b(${se})((${U})|\\.)?|(${U}))[eE][+-]?(${ie})\\b`},{begin:`\\b(${se})\\b((${U})\\b|\\.)?|(${U})\\b`},{begin:"\\b(0|[1-9](_?[0-9])*)n\\b"},{begin:"\\b0[xX][0-9a-fA-F](_?[0-9a-fA-F])*n?\\b"},{begin:"\\b0[bB][0-1](_?[0-1])*n?\\b"},{begin:"\\b0[oO][0-7](_?[0-7])*n?\\b"},{begin:"\\b0[0-7]+n?\\b"}],relevance:0},ae={className:"subst",begin:"\\$\\{",end:"\\}",keywords:ce,contains:[]},he={begin:"html`",end:"",starts:{end:"`",returnEnd:!1,contains:[L.BACKSLASH_ESCAPE,ae],subLanguage:"xml"}},be={begin:"css`",end:"",starts:{end:"`",returnEnd:!1,contains:[L.BACKSLASH_ESCAPE,ae],subLanguage:"css"}},we={className:"string",begin:"`",end:"`",contains:[L.BACKSLASH_ESCAPE,ae]},st={className:"comment",variants:[L.COMMENT(/\/\*\*(?!\/)/,"\\*/",{relevance:0,contains:[{className:"doctag",begin:"@[A-Za-z]+",contains:[{className:"type",begin:"\\{",end:"\\}",relevance:0},{className:"variable",begin:W+"(?=\\s*(-)|$)",endsParent:!0,relevance:0},{begin:/(?=[^\n])\s/,relevance:0}]}]}),L.C_BLOCK_COMMENT_MODE,L.C_LINE_COMMENT_MODE]},We=[L.APOS_STRING_MODE,L.QUOTE_STRING_MODE,he,be,we,ge,L.REGEXP_MODE];ae.contains=We.concat({begin:/\{/,end:/\}/,keywords:ce,contains:["self"].concat(We)});const Ve=[].concat(st,ae.contains),Be=Ve.concat([{begin:/\(/,end:/\)/,keywords:ce,contains:["self"].concat(Ve)}]),xe={className:"params",begin:/\(/,end:/\)/,excludeBegin:!0,excludeEnd:!0,keywords:ce,contains:Be};return{name:"Javascript",aliases:["js","jsx","mjs","cjs"],keywords:ce,exports:{PARAMS_CONTAINS:Be},illegal:/#(?![$_A-z])/,contains:[L.SHEBANG({label:"shebang",binary:"node",relevance:5}),{label:"use_strict",className:"meta",relevance:10,begin:/^\s*['"]use (strict|asm)['"]/},L.APOS_STRING_MODE,L.QUOTE_STRING_MODE,he,be,we,st,ge,{begin:C(/[{,\n]\s*/,T(C(/(((\/\/.*$)|(\/\*(\*[^/]|[^*])*\*\/))\s*)*/,W+"\\s*:"))),relevance:0,contains:[{className:"attr",begin:W+T("\\s*:"),relevance:0}]},{begin:"("+L.RE_STARTERS_RE+"|\\b(case|return|throw)\\b)\\s*",keywords:"return throw case",contains:[st,L.REGEXP_MODE,{className:"function",begin:"(\\([^()]*(\\([^()]*(\\([^()]*\\)[^()]*)*\\)[^()]*)*\\)|"+L.UNDERSCORE_IDENT_RE+")\\s*=>",returnBegin:!0,end:"\\s*=>",contains:[{className:"params",variants:[{begin:L.UNDERSCORE_IDENT_RE,relevance:0},{className:null,begin:/\(\s*\)/,skip:!0},{begin:/\(/,end:/\)/,excludeBegin:!0,excludeEnd:!0,keywords:ce,contains:Be}]}]},{begin:/,/,relevance:0},{className:"",begin:/\s/,end:/\s*/,skip:!0},{variants:[{begin:"<>",end:"</>"},{begin:ee.begin,"on:begin":ee.isTrulyOpeningTag,end:ee.end}],subLanguage:"xml",contains:[{begin:ee.begin,end:ee.end,skip:!0,contains:["self"]}]}],relevance:0},{className:"function",beginKeywords:"function",end:/[{;]/,excludeEnd:!0,keywords:ce,contains:["self",L.inherit(L.TITLE_MODE,{begin:W}),xe],illegal:/%/},{beginKeywords:"while if switch catch for"},{className:"function",begin:L.UNDERSCORE_IDENT_RE+"\\([^()]*(\\([^()]*(\\([^()]*\\)[^()]*)*\\)[^()]*)*\\)\\s*\\{",returnBegin:!0,contains:[xe,L.inherit(L.TITLE_MODE,{begin:W})]},{variants:[{begin:"\\."+W},{begin:"\\$"+W}],relevance:0},{className:"class",beginKeywords:"class",end:/[{;=]/,excludeEnd:!0,illegal:/[:"[\]]/,contains:[{beginKeywords:"extends"},L.UNDERSCORE_TITLE_MODE]},{begin:/\b(?=constructor)/,end:/[{;]/,excludeEnd:!0,contains:[L.inherit(L.TITLE_MODE,{begin:W}),"self",xe]},{begin:"(get|set)\\s+(?="+W+"\\()",end:/\{/,keywords:"get set",contains:[L.inherit(L.TITLE_MODE,{begin:W}),{begin:/\(\)/},xe]},{begin:/\$[(.]/}]}}},92229:m=>{m.exports=function S(i){const r={literal:"true false null"},a=[i.C_LINE_COMMENT_MODE,i.C_BLOCK_COMMENT_MODE],f=[i.QUOTE_STRING_MODE,i.C_NUMBER_MODE],c={end:",",endsWithParent:!0,excludeEnd:!0,contains:f,keywords:r},e={begin:/\{/,end:/\}/,contains:[{className:"attr",begin:/"/,end:/"/,contains:[i.BACKSLASH_ESCAPE],illegal:"\\n"},i.inherit(c,{begin:/:/})].concat(a),illegal:"\\S"},p={begin:"\\[",end:"\\]",contains:[i.inherit(c)],illegal:"\\S"};return f.push(e,p),a.forEach(function(y){f.push(y)}),{name:"JSON",contains:f,keywords:r,illegal:"\\S"}}},78932:m=>{m.exports=function S(i){const c={$pattern:/-?[A-z\.\-]+\b/,keyword:"if else foreach return do while until elseif begin for trap data dynamicparam end break throw param continue finally in switch exit filter try process catch hidden static parameter",built_in:"ac asnp cat cd CFS chdir clc clear clhy cli clp cls clv cnsn compare copy cp cpi cpp curl cvpa dbp del diff dir dnsn ebp echo|0 epal epcsv epsn erase etsn exsn fc fhx fl ft fw gal gbp gc gcb gci gcm gcs gdr gerr ghy gi gin gjb gl gm gmo gp gps gpv group gsn gsnp gsv gtz gu gv gwmi h history icm iex ihy ii ipal ipcsv ipmo ipsn irm ise iwmi iwr kill lp ls man md measure mi mount move mp mv nal ndr ni nmo npssc nsn nv ogv oh popd ps pushd pwd r rbp rcjb rcsn rd rdr ren ri rjb rm rmdir rmo rni rnp rp rsn rsnp rujb rv rvpa rwmi sajb sal saps sasv sbp sc scb select set shcm si sl sleep sls sort sp spjb spps spsv start stz sujb sv swmi tee trcm type wget where wjb write"},p={begin:"`[\\s\\S]",relevance:0},y={className:"variable",variants:[{begin:/\$\B/},{className:"keyword",begin:/\$this/},{begin:/\$[\w\d][\w\d_:]*/}]},C={className:"string",variants:[{begin:/"/,end:/"/},{begin:/@"/,end:/^"@/}],contains:[p,y,{className:"variable",begin:/\$[A-z]/,end:/[^A-z]/}]},R={className:"string",variants:[{begin:/'/,end:/'/},{begin:/@'/,end:/^'@/}]},z=i.inherit(i.COMMENT(null,null),{variants:[{begin:/#/,end:/$/},{begin:/<#/,end:/#>/}],contains:[{className:"doctag",variants:[{begin:/\.(synopsis|description|example|inputs|outputs|notes|link|component|role|functionality)/},{begin:/\.(parameter|forwardhelptargetname|forwardhelpcategory|remotehelprunspace|externalhelp)\s+\S+/}]}]}),W={className:"built_in",variants:[{begin:"(".concat("Add|Clear|Close|Copy|Enter|Exit|Find|Format|Get|Hide|Join|Lock|Move|New|Open|Optimize|Pop|Push|Redo|Remove|Rename|Reset|Resize|Search|Select|Set|Show|Skip|Split|Step|Switch|Undo|Unlock|Watch|Backup|Checkpoint|Compare|Compress|Convert|ConvertFrom|ConvertTo|Dismount|Edit|Expand|Export|Group|Import|Initialize|Limit|Merge|Mount|Out|Publish|Restore|Save|Sync|Unpublish|Update|Approve|Assert|Build|Complete|Confirm|Deny|Deploy|Disable|Enable|Install|Invoke|Register|Request|Restart|Resume|Start|Stop|Submit|Suspend|Uninstall|Unregister|Wait|Debug|Measure|Ping|Repair|Resolve|Test|Trace|Connect|Disconnect|Read|Receive|Send|Write|Block|Grant|Protect|Revoke|Unblock|Unprotect|Use|ForEach|Sort|Tee|Where",")+(-)[\\w\\d]+")}]},J={className:"class",beginKeywords:"class enum",end:/\s*[{]/,excludeEnd:!0,relevance:0,contains:[i.TITLE_MODE]},ee={className:"function",begin:/function\s+/,end:/\s*\{|$/,excludeEnd:!0,returnBegin:!0,relevance:0,contains:[{begin:"function",relevance:0,className:"keyword"},{className:"title",begin:/\w[\w\d]*((-)[\w\d]+)*/,relevance:0},{begin:/\(/,end:/\)/,className:"params",relevance:0,contains:[y]}]},ce={begin:/using\s/,end:/$/,returnBegin:!0,contains:[C,R,{className:"keyword",begin:/(using|assembly|command|module|namespace|type)/}]},ie={variants:[{className:"operator",begin:"(".concat("-and|-as|-band|-bnot|-bor|-bxor|-casesensitive|-ccontains|-ceq|-cge|-cgt|-cle|-clike|-clt|-cmatch|-cne|-cnotcontains|-cnotlike|-cnotmatch|-contains|-creplace|-csplit|-eq|-exact|-f|-file|-ge|-gt|-icontains|-ieq|-ige|-igt|-ile|-ilike|-ilt|-imatch|-in|-ine|-inotcontains|-inotlike|-inotmatch|-ireplace|-is|-isnot|-isplit|-join|-le|-like|-lt|-match|-ne|-not|-notcontains|-notin|-notlike|-notmatch|-or|-regex|-replace|-shl|-shr|-split|-wildcard|-xor",")\\b")},{className:"literal",begin:/(-)[\w\d]+/,relevance:0}]},se={className:"function",begin:/\[.*\]\s*[\w]+[ ]??\(/,end:/$/,returnBegin:!0,relevance:0,contains:[{className:"keyword",begin:"(".concat(c.keyword.toString().replace(/\s/g,"|"),")\\b"),endsParent:!0,relevance:0},i.inherit(i.TITLE_MODE,{endsParent:!0})]},ge=[se,z,p,i.NUMBER_MODE,C,R,W,y,{className:"literal",begin:/\$(null|true|false)\b/},{className:"selector-tag",begin:/@\B/,relevance:0}],ae={begin:/\[/,end:/\]/,excludeBegin:!0,excludeEnd:!0,relevance:0,contains:[].concat("self",ge,{begin:"("+["string","char","byte","int","long","bool","decimal","single","double","DateTime","xml","array","hashtable","void"].join("|")+")",className:"built_in",relevance:0},{className:"type",begin:/[\.\w\d]+/,relevance:0})};return se.contains.unshift(ae),{name:"PowerShell",aliases:["ps","ps1"],case_insensitive:!0,keywords:c,contains:ge.concat(J,ee,ce,ie,ae)}}},13546:m=>{function S(e){return e?"string"==typeof e?e:e.source:null}function i(e){return a("(?=",e,")")}function a(...e){return e.map(y=>S(y)).join("")}function f(...e){return"("+e.map(y=>S(y)).join("|")+")"}m.exports=function c(e){const p=a(/[A-Z_]/,function r(e){return a("(",e,")?")}(/[A-Z0-9_.-]*:/),/[A-Z0-9_.-]*/),T={className:"symbol",begin:/&[a-z]+;|&#[0-9]+;|&#x[a-f0-9]+;/},C={begin:/\s/,contains:[{className:"meta-keyword",begin:/#?[a-z_][a-z1-9_-]+/,illegal:/\n/}]},R=e.inherit(C,{begin:/\(/,end:/\)/}),L=e.inherit(e.APOS_STRING_MODE,{className:"meta-string"}),z=e.inherit(e.QUOTE_STRING_MODE,{className:"meta-string"}),W={endsWithParent:!0,illegal:/</,relevance:0,contains:[{className:"attr",begin:/[A-Za-z0-9._:-]+/,relevance:0},{begin:/=\s*/,relevance:0,contains:[{className:"string",endsParent:!0,variants:[{begin:/"/,end:/"/,contains:[T]},{begin:/'/,end:/'/,contains:[T]},{begin:/[^\s"'=<>`]+/}]}]}]};return{name:"HTML, XML",aliases:["html","xhtml","rss","atom","xjb","xsd","xsl","plist","wsf","svg"],case_insensitive:!0,contains:[{className:"meta",begin:/<![a-z]/,end:/>/,relevance:10,contains:[C,z,L,R,{begin:/\[/,end:/\]/,contains:[{className:"meta",begin:/<![a-z]/,end:/>/,contains:[C,R,z,L]}]}]},e.COMMENT(/<!--/,/-->/,{relevance:10}),{begin:/<!\[CDATA\[/,end:/\]\]>/,relevance:10},T,{className:"meta",begin:/<\?xml/,end:/\?>/,relevance:10},{className:"tag",begin:/<style(?=\s|>)/,end:/>/,keywords:{name:"style"},contains:[W],starts:{end:/<\/style>/,returnEnd:!0,subLanguage:["css","xml"]}},{className:"tag",begin:/<script(?=\s|>)/,end:/>/,keywords:{name:"script"},contains:[W],starts:{end:/<\/script>/,returnEnd:!0,subLanguage:["javascript","handlebars","xml"]}},{className:"tag",begin:/<>|<\/>/},{className:"tag",begin:a(/</,i(a(p,f(/\/>/,/>/,/\s/)))),end:/\/?>/,contains:[{className:"name",begin:p,relevance:0,starts:W}]},{className:"tag",begin:a(/<\//,i(a(p,/>/))),contains:[{className:"name",begin:p,relevance:0},{begin:/>/,relevance:0,endsParent:!0}]}]}}},44776:m=>{m.exports=function S(i){var r="true false yes no null",a="[\\w#;/?:@&=+$,.~*'()[\\]]+",e={className:"string",relevance:0,variants:[{begin:/'/,end:/'/},{begin:/"/,end:/"/},{begin:/\S+/}],contains:[i.BACKSLASH_ESCAPE,{className:"template-variable",variants:[{begin:/\{\{/,end:/\}\}/},{begin:/%\{/,end:/\}/}]}]},p=i.inherit(e,{variants:[{begin:/'/,end:/'/},{begin:/"/,end:/"/},{begin:/[^\s,{}[\]]+/}]}),z={end:",",endsWithParent:!0,excludeEnd:!0,keywords:r,relevance:0},ee=[{className:"attr",variants:[{begin:"\\w[\\w :\\/.-]*:(?=[ \t]|$)"},{begin:'"\\w[\\w :\\/.-]*":(?=[ \t]|$)'},{begin:"'\\w[\\w :\\/.-]*':(?=[ \t]|$)"}]},{className:"meta",begin:"^---\\s*$",relevance:10},{className:"string",begin:"[\\|>]([1-9]?[+-])?[ ]*\\n( +)[^ ][^\\n]*\\n(\\2[^\\n]+\\n?)*"},{begin:"<%[%=-]?",end:"[%-]?%>",subLanguage:"ruby",excludeBegin:!0,excludeEnd:!0,relevance:0},{className:"type",begin:"!\\w+!"+a},{className:"type",begin:"!<"+a+">"},{className:"type",begin:"!"+a},{className:"type",begin:"!!"+a},{className:"meta",begin:"&"+i.UNDERSCORE_IDENT_RE+"$"},{className:"meta",begin:"\\*"+i.UNDERSCORE_IDENT_RE+"$"},{className:"bullet",begin:"-(?=[ ]|$)",relevance:0},i.HASH_COMMENT_MODE,{beginKeywords:r,keywords:{literal:r}},{className:"number",begin:"\\b[0-9]{4}(-[0-9][0-9]){0,2}([Tt \\t][0-9][0-9]?(:[0-9][0-9]){2})?(\\.[0-9]*)?([ \\t])*(Z|[-+][0-9][0-9]?(:[0-9][0-9])?)?\\b"},{className:"number",begin:i.C_NUMBER_RE+"\\b",relevance:0},{begin:/\{/,end:/\}/,contains:[z],illegal:"\\n",relevance:0},{begin:"\\[",end:"\\]",contains:[z],illegal:"\\n",relevance:0},e],ce=[...ee];return ce.pop(),ce.push(p),z.contains=ce,{name:"YAML",case_insensitive:!0,aliases:["yml"],contains:ee}}},62568:(m,S,i)=>{"use strict";var r=i(38308),a={childContextTypes:!0,contextType:!0,contextTypes:!0,defaultProps:!0,displayName:!0,getDefaultProps:!0,getDerivedStateFromError:!0,getDerivedStateFromProps:!0,mixins:!0,propTypes:!0,type:!0},f={name:!0,length:!0,prototype:!0,caller:!0,callee:!0,arguments:!0,arity:!0},e={$$typeof:!0,compare:!0,defaultProps:!0,displayName:!0,propTypes:!0,type:!0},p={};function y(ee){return r.isMemo(ee)?e:p[ee.$$typeof]||a}p[r.ForwardRef]={$$typeof:!0,render:!0,defaultProps:!0,displayName:!0,propTypes:!0},p[r.Memo]=e;var T=Object.defineProperty,C=Object.getOwnPropertyNames,R=Object.getOwnPropertySymbols,L=Object.getOwnPropertyDescriptor,z=Object.getPrototypeOf,W=Object.prototype;m.exports=function J(ee,ce,ie){if("string"!=typeof ce){if(W){var U=z(ce);U&&U!==W&&J(ee,U,ie)}var se=C(ce);R&&(se=se.concat(R(ce)));for(var ge=y(ee),ae=y(ce),he=0;he<se.length;++he){var be=se[he];if(!(f[be]||ie&&ie[be]||ae&&ae[be]||ge&&ge[be])){var we=L(ce,be);try{T(ee,be,we)}catch(ue){}}}}return ee}},12658:(m,S)=>{S.read=function(i,r,a,f,c){var e,p,y=8*c-f-1,T=(1<<y)-1,C=T>>1,R=-7,L=a?c-1:0,z=a?-1:1,W=i[r+L];for(L+=z,e=W&(1<<-R)-1,W>>=-R,R+=y;R>0;e=256*e+i[r+L],L+=z,R-=8);for(p=e&(1<<-R)-1,e>>=-R,R+=f;R>0;p=256*p+i[r+L],L+=z,R-=8);if(0===e)e=1-C;else{if(e===T)return p?NaN:1/0*(W?-1:1);p+=Math.pow(2,f),e-=C}return(W?-1:1)*p*Math.pow(2,e-f)},S.write=function(i,r,a,f,c,e){var p,y,T,C=8*e-c-1,R=(1<<C)-1,L=R>>1,z=23===c?Math.pow(2,-24)-Math.pow(2,-77):0,W=f?0:e-1,J=f?1:-1,ee=r<0||0===r&&1/r<0?1:0;for(r=Math.abs(r),isNaN(r)||r===1/0?(y=isNaN(r)?1:0,p=R):(p=Math.floor(Math.log(r)/Math.LN2),r*(T=Math.pow(2,-p))<1&&(p--,T*=2),(r+=p+L>=1?z/T:z*Math.pow(2,1-L))*T>=2&&(p++,T/=2),p+L>=R?(y=0,p=R):p+L>=1?(y=(r*T-1)*Math.pow(2,c),p+=L):(y=r*Math.pow(2,L-1)*Math.pow(2,c),p=0));c>=8;i[a+W]=255&y,W+=J,y/=256,c-=8);for(p=p<<c|y,C+=c;C>0;i[a+W]=255&p,W+=J,p/=256,C-=8);i[a+W-J]|=128*ee}},16482:function(m){m.exports=function(){"use strict";var S=Array.prototype.slice;function i(j,Ce){Ce&&(j.prototype=Object.create(Ce.prototype)),j.prototype.constructor=j}function r(j){return e(j)?j:Ei(j)}function a(j){return p(j)?j:mi(j)}function f(j){return y(j)?j:ur(j)}function c(j){return e(j)&&!T(j)?j:$r(j)}function e(j){return!(!j||!j[R])}function p(j){return!(!j||!j[L])}function y(j){return!(!j||!j[z])}function T(j){return p(j)||y(j)}function C(j){return!(!j||!j[W])}i(a,r),i(f,r),i(c,r),r.isIterable=e,r.isKeyed=p,r.isIndexed=y,r.isAssociative=T,r.isOrdered=C,r.Keyed=a,r.Indexed=f,r.Set=c;var R="@@__IMMUTABLE_ITERABLE__@@",L="@@__IMMUTABLE_KEYED__@@",z="@@__IMMUTABLE_INDEXED__@@",W="@@__IMMUTABLE_ORDERED__@@",J="delete",U={},se={value:!1},ge={value:!1};function ae(j){return j.value=!1,j}function he(j){j&&(j.value=!0)}function be(){}function we(j,Ce){Ce=Ce||0;for(var nt=Math.max(0,j.length-Ce),Mt=new Array(nt),wt=0;wt<nt;wt++)Mt[wt]=j[wt+Ce];return Mt}function ue(j){return void 0===j.size&&(j.size=j.__iterate(We)),j.size}function st(j,Ce){if("number"!=typeof Ce){var nt=Ce>>>0;if(""+nt!==Ce||4294967295===nt)return NaN;Ce=nt}return Ce<0?ue(j)+Ce:Ce}function We(){return!0}function Ve(j,Ce,nt){return(0===j||void 0!==nt&&j<=-nt)&&(void 0===Ce||void 0!==nt&&Ce>=nt)}function Be(j,Ce){return je(j,Ce,0)}function xe(j,Ce){return je(j,Ce,Ce)}function je(j,Ce,nt){return void 0===j?nt:j<0?Math.max(0,Ce+j):void 0===Ce?j:Math.min(Ce,j)}var en="function"==typeof Symbol&&Symbol.iterator,Pt="@@iterator",Vt=en||Pt;function hn(j){this.next=j}function vn(j,Ce,nt,Mt){var wt=0===j?Ce:1===j?nt:[Ce,nt];return Mt?Mt.value=wt:Mt={value:wt,done:!1},Mt}function mt(){return{value:void 0,done:!0}}function Nt(j){return!!Fn(j)}function St(j){return j&&"function"==typeof j.next}function Yt(j){var Ce=Fn(j);return Ce&&Ce.call(j)}function Fn(j){var Ce=j&&(en&&j[en]||j[Pt]);if("function"==typeof Ce)return Ce}function pr(j){return j&&"number"==typeof j.length}function Ei(j){return null==j?so():e(j)?j.toSeq():function Kt(j){var Ce=un(j)||"object"==typeof j&&new Xn(j);if(!Ce)throw new TypeError("Expected Array or iterable object of values, or keyed object: "+j);return Ce}(j)}function mi(j){return null==j?so().toKeyedSeq():e(j)?p(j)?j.toSeq():j.fromEntrySeq():Ro(j)}function ur(j){return null==j?so():e(j)?p(j)?j.entrySeq():j.toIndexedSeq():Sr(j)}function $r(j){return(null==j?so():e(j)?p(j)?j.entrySeq():j:Sr(j)).toSetSeq()}hn.prototype.toString=function(){return"[Iterator]"},hn.KEYS=0,hn.VALUES=1,hn.ENTRIES=2,hn.prototype.inspect=hn.prototype.toSource=function(){return this.toString()},hn.prototype[Vt]=function(){return this},i(Ei,r),Ei.of=function(){return Ei(arguments)},Ei.prototype.toSeq=function(){return this},Ei.prototype.toString=function(){return this.__toString("Seq {","}")},Ei.prototype.cacheResult=function(){return!this._cache&&this.__iterateUncached&&(this._cache=this.entrySeq().toArray(),this.size=this._cache.length),this},Ei.prototype.__iterate=function(j,Ce){return jn(this,j,Ce,!0)},Ei.prototype.__iterator=function(j,Ce){return Jn(this,j,Ce,!0)},i(mi,Ei),mi.prototype.toKeyedSeq=function(){return this},i(ur,Ei),ur.of=function(){return ur(arguments)},ur.prototype.toIndexedSeq=function(){return this},ur.prototype.toString=function(){return this.__toString("Seq [","]")},ur.prototype.__iterate=function(j,Ce){return jn(this,j,Ce,!1)},ur.prototype.__iterator=function(j,Ce){return Jn(this,j,Ce,!1)},i($r,Ei),$r.of=function(){return $r(arguments)},$r.prototype.toSetSeq=function(){return this},Ei.isSeq=Ci,Ei.Keyed=mi,Ei.Set=$r,Ei.Indexed=ur;var _i,Mn,Sn,Br="@@__IMMUTABLE_SEQ__@@";function Pn(j){this._array=j,this.size=j.length}function Xn(j){var Ce=Object.keys(j);this._object=j,this._keys=Ce,this.size=Ce.length}function dr(j){this._iterable=j,this.size=j.length||j.size}function Qr(j){this._iterator=j,this._iteratorCache=[]}function Ci(j){return!(!j||!j[Br])}function so(){return _i||(_i=new Pn([]))}function Ro(j){var Ce=Array.isArray(j)?new Pn(j).fromEntrySeq():St(j)?new Qr(j).fromEntrySeq():Nt(j)?new dr(j).fromEntrySeq():"object"==typeof j?new Xn(j):void 0;if(!Ce)throw new TypeError("Expected Array or iterable object of [k, v] entries, or keyed object: "+j);return Ce}function Sr(j){var Ce=un(j);if(!Ce)throw new TypeError("Expected Array or iterable object of values: "+j);return Ce}function un(j){return pr(j)?new Pn(j):St(j)?new Qr(j):Nt(j)?new dr(j):void 0}function jn(j,Ce,nt,Mt){var wt=j._cache;if(wt){for(var sn=wt.length-1,Cn=0;Cn<=sn;Cn++){var _r=wt[nt?sn-Cn:Cn];if(!1===Ce(_r[1],Mt?_r[0]:Cn,j))return Cn+1}return Cn}return j.__iterateUncached(Ce,nt)}function Jn(j,Ce,nt,Mt){var wt=j._cache;if(wt){var sn=wt.length-1,Cn=0;return new hn(function(){var _r=wt[nt?sn-Cn:Cn];return Cn++>sn?{value:void 0,done:!0}:vn(Ce,Mt?_r[0]:Cn-1,_r[1])})}return j.__iteratorUncached(Ce,nt)}function Gn(j,Ce){return Ce?Xr(Ce,j,"",{"":j}):Zi(j)}function Xr(j,Ce,nt,Mt){return Array.isArray(Ce)?j.call(Mt,nt,ur(Ce).map(function(wt,sn){return Xr(j,wt,sn,Ce)})):ii(Ce)?j.call(Mt,nt,mi(Ce).map(function(wt,sn){return Xr(j,wt,sn,Ce)})):Ce}function Zi(j){return Array.isArray(j)?ur(j).map(Zi).toList():ii(j)?mi(j).map(Zi).toMap():j}function ii(j){return j&&(j.constructor===Object||void 0===j.constructor)}function hr(j,Ce){if(j===Ce||j!=j&&Ce!=Ce)return!0;if(!j||!Ce)return!1;if("function"==typeof j.valueOf&&"function"==typeof Ce.valueOf){if((j=j.valueOf())===(Ce=Ce.valueOf())||j!=j&&Ce!=Ce)return!0;if(!j||!Ce)return!1}return!("function"!=typeof j.equals||"function"!=typeof Ce.equals||!j.equals(Ce))}function Ki(j,Ce){if(j===Ce)return!0;if(!e(Ce)||void 0!==j.size&&void 0!==Ce.size&&j.size!==Ce.size||void 0!==j.__hash&&void 0!==Ce.__hash&&j.__hash!==Ce.__hash||p(j)!==p(Ce)||y(j)!==y(Ce)||C(j)!==C(Ce))return!1;if(0===j.size&&0===Ce.size)return!0;var nt=!T(j);if(C(j)){var Mt=j.entries();return Ce.every(function(ni,fi){var gi=Mt.next().value;return gi&&hr(gi[1],ni)&&(nt||hr(gi[0],fi))})&&Mt.next().done}var wt=!1;if(void 0===j.size)if(void 0===Ce.size)"function"==typeof j.cacheResult&&j.cacheResult();else{wt=!0;var sn=j;j=Ce,Ce=sn}var Cn=!0,_r=Ce.__iterate(function(ni,fi){if(nt?!j.has(ni):wt?!hr(ni,j.get(fi,U)):!hr(j.get(fi,U),ni))return Cn=!1,!1});return Cn&&j.size===_r}function ln(j,Ce){if(!(this instanceof ln))return new ln(j,Ce);if(this._value=j,this.size=void 0===Ce?1/0:Math.max(0,Ce),0===this.size){if(Mn)return Mn;Mn=this}}function Zn(j,Ce){if(!j)throw new Error(Ce)}function cn(j,Ce,nt){if(!(this instanceof cn))return new cn(j,Ce,nt);if(Zn(0!==nt,"Cannot step a Range by 0"),j=j||0,void 0===Ce&&(Ce=1/0),nt=void 0===nt?1:Math.abs(nt),Ce<j&&(nt=-nt),this._start=j,this._end=Ce,this._step=nt,this.size=Math.max(0,Math.ceil((Ce-j)/nt-1)+1),0===this.size){if(Sn)return Sn;Sn=this}}function Or(){throw TypeError("Abstract")}function ri(){}function vi(){}function Ui(){}Ei.prototype[Br]=!0,i(Pn,ur),Pn.prototype.get=function(j,Ce){return this.has(j)?this._array[st(this,j)]:Ce},Pn.prototype.__iterate=function(j,Ce){for(var nt=this._array,Mt=nt.length-1,wt=0;wt<=Mt;wt++)if(!1===j(nt[Ce?Mt-wt:wt],wt,this))return wt+1;return wt},Pn.prototype.__iterator=function(j,Ce){var nt=this._array,Mt=nt.length-1,wt=0;return new hn(function(){return wt>Mt?{value:void 0,done:!0}:vn(j,wt,nt[Ce?Mt-wt++:wt++])})},i(Xn,mi),Xn.prototype.get=function(j,Ce){return void 0===Ce||this.has(j)?this._object[j]:Ce},Xn.prototype.has=function(j){return this._object.hasOwnProperty(j)},Xn.prototype.__iterate=function(j,Ce){for(var nt=this._object,Mt=this._keys,wt=Mt.length-1,sn=0;sn<=wt;sn++){var Cn=Mt[Ce?wt-sn:sn];if(!1===j(nt[Cn],Cn,this))return sn+1}return sn},Xn.prototype.__iterator=function(j,Ce){var nt=this._object,Mt=this._keys,wt=Mt.length-1,sn=0;return new hn(function(){var Cn=Mt[Ce?wt-sn:sn];return sn++>wt?{value:void 0,done:!0}:vn(j,Cn,nt[Cn])})},Xn.prototype[W]=!0,i(dr,ur),dr.prototype.__iterateUncached=function(j,Ce){if(Ce)return this.cacheResult().__iterate(j,Ce);var Mt=Yt(this._iterable),wt=0;if(St(Mt))for(var sn;!(sn=Mt.next()).done&&!1!==j(sn.value,wt++,this););return wt},dr.prototype.__iteratorUncached=function(j,Ce){if(Ce)return this.cacheResult().__iterator(j,Ce);var Mt=Yt(this._iterable);if(!St(Mt))return new hn(mt);var wt=0;return new hn(function(){var sn=Mt.next();return sn.done?sn:vn(j,wt++,sn.value)})},i(Qr,ur),Qr.prototype.__iterateUncached=function(j,Ce){if(Ce)return this.cacheResult().__iterate(j,Ce);for(var nt=this._iterator,Mt=this._iteratorCache,wt=0;wt<Mt.length;)if(!1===j(Mt[wt],wt++,this))return wt;for(var sn;!(sn=nt.next()).done;){var Cn=sn.value;if(Mt[wt]=Cn,!1===j(Cn,wt++,this))break}return wt},Qr.prototype.__iteratorUncached=function(j,Ce){if(Ce)return this.cacheResult().__iterator(j,Ce);var nt=this._iterator,Mt=this._iteratorCache,wt=0;return new hn(function(){if(wt>=Mt.length){var sn=nt.next();if(sn.done)return sn;Mt[wt]=sn.value}return vn(j,wt,Mt[wt++])})},i(ln,ur),ln.prototype.toString=function(){return 0===this.size?"Repeat []":"Repeat [ "+this._value+" "+this.size+" times ]"},ln.prototype.get=function(j,Ce){return this.has(j)?this._value:Ce},ln.prototype.includes=function(j){return hr(this._value,j)},ln.prototype.slice=function(j,Ce){var nt=this.size;return Ve(j,Ce,nt)?this:new ln(this._value,xe(Ce,nt)-Be(j,nt))},ln.prototype.reverse=function(){return this},ln.prototype.indexOf=function(j){return hr(this._value,j)?0:-1},ln.prototype.lastIndexOf=function(j){return hr(this._value,j)?this.size:-1},ln.prototype.__iterate=function(j,Ce){for(var nt=0;nt<this.size;nt++)if(!1===j(this._value,nt,this))return nt+1;return nt},ln.prototype.__iterator=function(j,Ce){var nt=this,Mt=0;return new hn(function(){return Mt<nt.size?vn(j,Mt++,nt._value):{value:void 0,done:!0}})},ln.prototype.equals=function(j){return j instanceof ln?hr(this._value,j._value):Ki(j)},i(cn,ur),cn.prototype.toString=function(){return 0===this.size?"Range []":"Range [ "+this._start+"..."+this._end+(1!==this._step?" by "+this._step:"")+" ]"},cn.prototype.get=function(j,Ce){return this.has(j)?this._start+st(this,j)*this._step:Ce},cn.prototype.includes=function(j){var Ce=(j-this._start)/this._step;return Ce>=0&&Ce<this.size&&Ce===Math.floor(Ce)},cn.prototype.slice=function(j,Ce){return Ve(j,Ce,this.size)?this:(j=Be(j,this.size),(Ce=xe(Ce,this.size))<=j?new cn(0,0):new cn(this.get(j,this._end),this.get(Ce,this._end),this._step))},cn.prototype.indexOf=function(j){var Ce=j-this._start;if(Ce%this._step==0){var nt=Ce/this._step;if(nt>=0&&nt<this.size)return nt}return-1},cn.prototype.lastIndexOf=function(j){return this.indexOf(j)},cn.prototype.__iterate=function(j,Ce){for(var nt=this.size-1,Mt=this._step,wt=Ce?this._start+nt*Mt:this._start,sn=0;sn<=nt;sn++){if(!1===j(wt,sn,this))return sn+1;wt+=Ce?-Mt:Mt}return sn},cn.prototype.__iterator=function(j,Ce){var nt=this.size-1,Mt=this._step,wt=Ce?this._start+nt*Mt:this._start,sn=0;return new hn(function(){var Cn=wt;return wt+=Ce?-Mt:Mt,sn>nt?{value:void 0,done:!0}:vn(j,sn++,Cn)})},cn.prototype.equals=function(j){return j instanceof cn?this._start===j._start&&this._end===j._end&&this._step===j._step:Ki(this,j)},i(Or,r),i(ri,Or),i(vi,Or),i(Ui,Or),Or.Keyed=ri,Or.Indexed=vi,Or.Set=Ui;var ao="function"==typeof Math.imul&&-2===Math.imul(4294967295,2)?Math.imul:function(Ce,nt){var Mt=65535&(Ce|=0),wt=65535&(nt|=0);return Mt*wt+((Ce>>>16)*wt+Mt*(nt>>>16)<<16>>>0)|0};function dt(j){return j>>>1&1073741824|3221225471&j}function Bi(j){if(!1===j||null==j||"function"==typeof j.valueOf&&(!1===(j=j.valueOf())||null==j))return 0;if(!0===j)return 1;var Ce=typeof j;if("number"===Ce){if(j!=j||j===1/0)return 0;var nt=0|j;for(nt!==j&&(nt^=4294967295*j);j>4294967295;)nt^=j/=4294967295;return dt(nt)}if("string"===Ce)return j.length>Oi?function to(j){var Ce=Qo[j];return void 0===Ce&&(Ce=Gt(j),Uo===di&&(Uo=0,Qo={}),Uo++,Qo[j]=Ce),Ce}(j):Gt(j);if("function"==typeof j.hashCode)return j.hashCode();if("object"===Ce)return function Rn(j){var Ce;if(pt&&void 0!==(Ce=kt.get(j))||void 0!==(Ce=j[mr])||!Rt&&(void 0!==(Ce=j.propertyIsEnumerable&&j.propertyIsEnumerable[mr])||void 0!==(Ce=function ct(j){if(j&&j.nodeType>0)switch(j.nodeType){case 1:return j.uniqueID;case 9:return j.documentElement&&j.documentElement.uniqueID}}(j))))return Ce;if(Ce=++dn,1073741824&dn&&(dn=0),pt)kt.set(j,Ce);else{if(void 0!==_t&&!1===_t(j))throw new Error("Non-extensible objects are not allowed as keys.");if(Rt)Object.defineProperty(j,mr,{enumerable:!1,configurable:!1,writable:!1,value:Ce});else if(void 0!==j.propertyIsEnumerable&&j.propertyIsEnumerable===j.constructor.prototype.propertyIsEnumerable)j.propertyIsEnumerable=function(){return this.constructor.prototype.propertyIsEnumerable.apply(this,arguments)},j.propertyIsEnumerable[mr]=Ce;else{if(void 0===j.nodeType)throw new Error("Unable to set a non-enumerable property on object.");j[mr]=Ce}}return Ce}(j);if("function"==typeof j.toString)return Gt(j.toString());throw new Error("Value type "+Ce+" cannot be hashed.")}function Gt(j){for(var Ce=0,nt=0;nt<j.length;nt++)Ce=31*Ce+j.charCodeAt(nt)|0;return dt(Ce)}var _t=Object.isExtensible,Rt=function(){try{return Object.defineProperty({},"@",{}),!0}catch(j){return!1}}();var kt,pt="function"==typeof WeakMap;pt&&(kt=new WeakMap);var dn=0,mr="__immutablehash__";"function"==typeof Symbol&&(mr=Symbol(mr));var Oi=16,di=255,Uo=0,Qo={};function lo(j){Zn(j!==1/0,"Cannot perform this action with an infinite size.")}function Ai(j){return null==j?er():Fo(j)&&!C(j)?j:er().withMutations(function(Ce){var nt=a(j);lo(nt.size),nt.forEach(function(Mt,wt){return Ce.set(wt,Mt)})})}function Fo(j){return!(!j||!j[Ko])}i(Ai,ri),Ai.of=function(){var j=S.call(arguments,0);return er().withMutations(function(Ce){for(var nt=0;nt<j.length;nt+=2){if(nt+1>=j.length)throw new Error("Missing value for key: "+j[nt]);Ce.set(j[nt],j[nt+1])}})},Ai.prototype.toString=function(){return this.__toString("Map {","}")},Ai.prototype.get=function(j,Ce){return this._root?this._root.get(0,void 0,j,Ce):Ce},Ai.prototype.set=function(j,Ce){return vr(this,j,Ce)},Ai.prototype.setIn=function(j,Ce){return this.updateIn(j,U,function(){return Ce})},Ai.prototype.remove=function(j){return vr(this,j,U)},Ai.prototype.deleteIn=function(j){return this.updateIn(j,function(){return U})},Ai.prototype.update=function(j,Ce,nt){return 1===arguments.length?j(this):this.updateIn([j],Ce,nt)},Ai.prototype.updateIn=function(j,Ce,nt){nt||(nt=Ce,Ce=void 0);var Mt=cs(this,as(j),Ce,nt);return Mt===U?void 0:Mt},Ai.prototype.clear=function(){return 0===this.size?this:this.__ownerID?(this.size=0,this._root=null,this.__hash=void 0,this.__altered=!0,this):er()},Ai.prototype.merge=function(){return no(this,void 0,arguments)},Ai.prototype.mergeWith=function(j){return no(this,j,S.call(arguments,1))},Ai.prototype.mergeIn=function(j){var Ce=S.call(arguments,1);return this.updateIn(j,er(),function(nt){return"function"==typeof nt.merge?nt.merge.apply(nt,Ce):Ce[Ce.length-1]})},Ai.prototype.mergeDeep=function(){return no(this,mo,arguments)},Ai.prototype.mergeDeepWith=function(j){var Ce=S.call(arguments,1);return no(this,wo(j),Ce)},Ai.prototype.mergeDeepIn=function(j){var Ce=S.call(arguments,1);return this.updateIn(j,er(),function(nt){return"function"==typeof nt.mergeDeep?nt.mergeDeep.apply(nt,Ce):Ce[Ce.length-1]})},Ai.prototype.sort=function(j){return ne(Wa(this,j))},Ai.prototype.sortBy=function(j,Ce){return ne(Wa(this,Ce,j))},Ai.prototype.withMutations=function(j){var Ce=this.asMutable();return j(Ce),Ce.wasAltered()?Ce.__ensureOwner(this.__ownerID):this},Ai.prototype.asMutable=function(){return this.__ownerID?this:this.__ensureOwner(new be)},Ai.prototype.asImmutable=function(){return this.__ensureOwner()},Ai.prototype.wasAltered=function(){return this.__altered},Ai.prototype.__iterator=function(j,Ce){return new Li(this,j,Ce)},Ai.prototype.__iterate=function(j,Ce){var nt=this,Mt=0;return this._root&&this._root.iterate(function(wt){return Mt++,j(wt[1],wt[0],nt)},Ce),Mt},Ai.prototype.__ensureOwner=function(j){return j===this.__ownerID?this:j?Go(this.size,this._root,j,this.__hash):(this.__ownerID=j,this.__altered=!1,this)},Ai.isMap=Fo;var ua,Ko="@@__IMMUTABLE_MAP__@@",qn=Ai.prototype;function ei(j,Ce){this.ownerID=j,this.entries=Ce}function wn(j,Ce,nt){this.ownerID=j,this.bitmap=Ce,this.nodes=nt}function Qn(j,Ce,nt){this.ownerID=j,this.count=Ce,this.nodes=nt}function Fr(j,Ce,nt){this.ownerID=j,this.keyHash=Ce,this.entries=nt}function oo(j,Ce,nt){this.ownerID=j,this.keyHash=Ce,this.entry=nt}function Li(j,Ce,nt){this._type=Ce,this._reverse=nt,this._stack=j._root&&go(j._root)}function yo(j,Ce){return vn(j,Ce[0],Ce[1])}function go(j,Ce){return{node:j,index:0,__prev:Ce}}function Go(j,Ce,nt,Mt){var wt=Object.create(qn);return wt.size=j,wt._root=Ce,wt.__ownerID=nt,wt.__hash=Mt,wt.__altered=!1,wt}function er(){return ua||(ua=Go(0))}function vr(j,Ce,nt){var Mt,wt;if(j._root){var sn=ae(se),Cn=ae(ge);if(Mt=yr(j._root,j.__ownerID,0,void 0,Ce,nt,sn,Cn),!Cn.value)return j;wt=j.size+(sn.value?nt===U?-1:1:0)}else{if(nt===U)return j;wt=1,Mt=new ei(j.__ownerID,[[Ce,nt]])}return j.__ownerID?(j.size=wt,j._root=Mt,j.__hash=void 0,j.__altered=!0,j):Mt?Go(wt,Mt):er()}function yr(j,Ce,nt,Mt,wt,sn,Cn,_r){return j?j.update(Ce,nt,Mt,wt,sn,Cn,_r):sn===U?j:(he(_r),he(Cn),new oo(Ce,Mt,[wt,sn]))}function or(j){return j.constructor===oo||j.constructor===Fr}function si(j,Ce,nt,Mt,wt){if(j.keyHash===Mt)return new Fr(Ce,Mt,[j.entry,wt]);var _r,sn=31&(0===nt?j.keyHash:j.keyHash>>>nt),Cn=31&(0===nt?Mt:Mt>>>nt);return new wn(Ce,1<<sn|1<<Cn,sn===Cn?[si(j,Ce,nt+5,Mt,wt)]:(_r=new oo(Ce,Mt,wt),sn<Cn?[j,_r]:[_r,j]))}function no(j,Ce,nt){for(var Mt=[],wt=0;wt<nt.length;wt++){var sn=nt[wt],Cn=a(sn);e(sn)||(Cn=Cn.map(function(_r){return Gn(_r)})),Mt.push(Cn)}return Us(j,Ce,Mt)}function mo(j,Ce,nt){return j&&j.mergeDeep&&e(Ce)?j.mergeDeep(Ce):hr(j,Ce)?j:Ce}function wo(j){return function(Ce,nt,Mt){if(Ce&&Ce.mergeDeepWith&&e(nt))return Ce.mergeDeepWith(j,nt);var wt=j(Ce,nt,Mt);return hr(Ce,wt)?Ce:wt}}function Us(j,Ce,nt){return 0===(nt=nt.filter(function(Mt){return 0!==Mt.size})).length?j:0!==j.size||j.__ownerID||1!==nt.length?j.withMutations(function(Mt){for(var wt=Ce?function(Cn,_r){Mt.update(_r,U,function(ni){return ni===U?Cn:Ce(ni,Cn,_r)})}:function(Cn,_r){Mt.set(_r,Cn)},sn=0;sn<nt.length;sn++)nt[sn].forEach(wt)}):j.constructor(nt[0])}function cs(j,Ce,nt,Mt){var wt=j===U,sn=Ce.next();if(sn.done){var Cn=wt?nt:j,_r=Mt(Cn);return _r===Cn?j:_r}Zn(wt||j&&j.set,"invalid keyPath");var ni=sn.value,fi=wt?U:j.get(ni,U),gi=cs(fi,Ce,nt,Mt);return gi===fi?j:gi===U?j.remove(ni):(wt?er():j).set(ni,gi)}function es(j){return j=(j=(858993459&(j-=j>>1&1431655765))+(j>>2&858993459))+(j>>4)&252645135,127&(j+=j>>8)+(j>>16)}function ga(j,Ce,nt,Mt){var wt=Mt?j:we(j);return wt[Ce]=nt,wt}qn[Ko]=!0,qn[J]=qn.remove,qn.removeIn=qn.deleteIn,ei.prototype.get=function(j,Ce,nt,Mt){for(var wt=this.entries,sn=0,Cn=wt.length;sn<Cn;sn++)if(hr(nt,wt[sn][0]))return wt[sn][1];return Mt},ei.prototype.update=function(j,Ce,nt,Mt,wt,sn,Cn){for(var _r=wt===U,ni=this.entries,fi=0,gi=ni.length;fi<gi&&!hr(Mt,ni[fi][0]);fi++);var zi=fi<gi;if(zi?ni[fi][1]===wt:_r)return this;if(he(Cn),(_r||!zi)&&he(sn),!_r||1!==ni.length){if(!zi&&!_r&&ni.length>=la)return function pn(j,Ce,nt,Mt){j||(j=new be);for(var wt=new oo(j,Bi(nt),[nt,Mt]),sn=0;sn<Ce.length;sn++){var Cn=Ce[sn];wt=wt.update(j,0,void 0,Cn[0],Cn[1])}return wt}(j,ni,Mt,wt);var Dr=j&&j===this.ownerID,kn=Dr?ni:we(ni);return zi?_r?fi===gi-1?kn.pop():kn[fi]=kn.pop():kn[fi]=[Mt,wt]:kn.push([Mt,wt]),Dr?(this.entries=kn,this):new ei(j,kn)}},wn.prototype.get=function(j,Ce,nt,Mt){void 0===Ce&&(Ce=Bi(nt));var wt=1<<(31&(0===j?Ce:Ce>>>j)),sn=this.bitmap;return 0==(sn&wt)?Mt:this.nodes[es(sn&wt-1)].get(j+5,Ce,nt,Mt)},wn.prototype.update=function(j,Ce,nt,Mt,wt,sn,Cn){void 0===nt&&(nt=Bi(Mt));var _r=31&(0===Ce?nt:nt>>>Ce),ni=1<<_r,fi=this.bitmap,gi=0!=(fi&ni);if(!gi&&wt===U)return this;var zi=es(fi&ni-1),Dr=this.nodes,kn=gi?Dr[zi]:void 0,Ar=yr(kn,j,Ce+5,nt,Mt,wt,sn,Cn);if(Ar===kn)return this;if(!gi&&Ar&&Dr.length>=Pa)return function Gr(j,Ce,nt,Mt,wt){for(var sn=0,Cn=new Array(32),_r=0;0!==nt;_r++,nt>>>=1)Cn[_r]=1&nt?Ce[sn++]:void 0;return Cn[Mt]=wt,new Qn(j,sn+1,Cn)}(j,Dr,fi,_r,Ar);if(gi&&!Ar&&2===Dr.length&&or(Dr[1^zi]))return Dr[1^zi];if(gi&&Ar&&1===Dr.length&&or(Ar))return Ar;var gr=j&&j===this.ownerID,fo=gi?Ar?fi:fi^ni:fi|ni,$s=gi?Ar?ga(Dr,zi,Ar,gr):function fa(j,Ce,nt){var Mt=j.length-1;if(nt&&Ce===Mt)return j.pop(),j;for(var wt=new Array(Mt),sn=0,Cn=0;Cn<Mt;Cn++)Cn===Ce&&(sn=1),wt[Cn]=j[Cn+sn];return wt}(Dr,zi,gr):function ya(j,Ce,nt,Mt){var wt=j.length+1;if(Mt&&Ce+1===wt)return j[Ce]=nt,j;for(var sn=new Array(wt),Cn=0,_r=0;_r<wt;_r++)_r===Ce?(sn[_r]=nt,Cn=-1):sn[_r]=j[_r+Cn];return sn}(Dr,zi,Ar,gr);return gr?(this.bitmap=fo,this.nodes=$s,this):new wn(j,fo,$s)},Qn.prototype.get=function(j,Ce,nt,Mt){void 0===Ce&&(Ce=Bi(nt));var sn=this.nodes[31&(0===j?Ce:Ce>>>j)];return sn?sn.get(j+5,Ce,nt,Mt):Mt},Qn.prototype.update=function(j,Ce,nt,Mt,wt,sn,Cn){void 0===nt&&(nt=Bi(Mt));var _r=31&(0===Ce?nt:nt>>>Ce),fi=this.nodes,gi=fi[_r];if(wt===U&&!gi)return this;var zi=yr(gi,j,Ce+5,nt,Mt,wt,sn,Cn);if(zi===gi)return this;var Dr=this.count;if(gi){if(!zi&&--Dr<fl)return function xn(j,Ce,nt,Mt){for(var wt=0,sn=0,Cn=new Array(nt),_r=0,ni=1,fi=Ce.length;_r<fi;_r++,ni<<=1){var gi=Ce[_r];void 0!==gi&&_r!==Mt&&(wt|=ni,Cn[sn++]=gi)}return new wn(j,wt,Cn)}(j,fi,Dr,_r)}else Dr++;var kn=j&&j===this.ownerID,Ar=ga(fi,_r,zi,kn);return kn?(this.count=Dr,this.nodes=Ar,this):new Qn(j,Dr,Ar)},Fr.prototype.get=function(j,Ce,nt,Mt){for(var wt=this.entries,sn=0,Cn=wt.length;sn<Cn;sn++)if(hr(nt,wt[sn][0]))return wt[sn][1];return Mt},Fr.prototype.update=function(j,Ce,nt,Mt,wt,sn,Cn){void 0===nt&&(nt=Bi(Mt));var _r=wt===U;if(nt!==this.keyHash)return _r?this:(he(Cn),he(sn),si(this,j,Ce,nt,[Mt,wt]));for(var ni=this.entries,fi=0,gi=ni.length;fi<gi&&!hr(Mt,ni[fi][0]);fi++);var zi=fi<gi;if(zi?ni[fi][1]===wt:_r)return this;if(he(Cn),(_r||!zi)&&he(sn),_r&&2===gi)return new oo(j,this.keyHash,ni[1^fi]);var Dr=j&&j===this.ownerID,kn=Dr?ni:we(ni);return zi?_r?fi===gi-1?kn.pop():kn[fi]=kn.pop():kn[fi]=[Mt,wt]:kn.push([Mt,wt]),Dr?(this.entries=kn,this):new Fr(j,this.keyHash,kn)},oo.prototype.get=function(j,Ce,nt,Mt){return hr(nt,this.entry[0])?this.entry[1]:Mt},oo.prototype.update=function(j,Ce,nt,Mt,wt,sn,Cn){var _r=wt===U,ni=hr(Mt,this.entry[0]);return(ni?wt===this.entry[1]:_r)?this:(he(Cn),_r?void he(sn):ni?j&&j===this.ownerID?(this.entry[1]=wt,this):new oo(j,this.keyHash,[Mt,wt]):(he(sn),si(this,j,Ce,Bi(Mt),[Mt,wt])))},ei.prototype.iterate=Fr.prototype.iterate=function(j,Ce){for(var nt=this.entries,Mt=0,wt=nt.length-1;Mt<=wt;Mt++)if(!1===j(nt[Ce?wt-Mt:Mt]))return!1},wn.prototype.iterate=Qn.prototype.iterate=function(j,Ce){for(var nt=this.nodes,Mt=0,wt=nt.length-1;Mt<=wt;Mt++){var sn=nt[Ce?wt-Mt:Mt];if(sn&&!1===sn.iterate(j,Ce))return!1}},oo.prototype.iterate=function(j,Ce){return j(this.entry)},i(Li,hn),Li.prototype.next=function(){for(var j=this._type,Ce=this._stack;Ce;){var wt,nt=Ce.node,Mt=Ce.index++;if(nt.entry){if(0===Mt)return yo(j,nt.entry)}else if(nt.entries){if(Mt<=(wt=nt.entries.length-1))return yo(j,nt.entries[this._reverse?wt-Mt:Mt])}else if(Mt<=(wt=nt.nodes.length-1)){var sn=nt.nodes[this._reverse?wt-Mt:Mt];if(sn){if(sn.entry)return yo(j,sn.entry);Ce=this._stack=go(sn,Ce)}continue}Ce=this._stack=this._stack.__prev}return{value:void 0,done:!0}};var la=8,Pa=16,fl=8;function To(j){var Ce=Co();if(null==j)return Ce;if(ml(j))return j;var nt=f(j),Mt=nt.size;return 0===Mt?Ce:(lo(Mt),Mt>0&&Mt<32?Ys(0,Mt,5,null,new Za(nt.toArray())):Ce.withMutations(function(wt){wt.setSize(Mt),nt.forEach(function(sn,Cn){return wt.set(Cn,sn)})}))}function ml(j){return!(!j||!j[Zo])}i(To,vi),To.of=function(){return this(arguments)},To.prototype.toString=function(){return this.__toString("List [","]")},To.prototype.get=function(j,Ce){if((j=st(this,j))>=0&&j<this.size){var nt=Nr(this,j+=this._origin);return nt&&nt.array[31&j]}return Ce},To.prototype.set=function(j,Ce){return function Ps(j,Ce,nt){if((Ce=st(j,Ce))!=Ce)return j;if(Ce>=j.size||Ce<0)return j.withMutations(function(Cn){Ce<0?Qi(Cn,Ce).set(0,nt):Qi(Cn,0,Ce+1).set(Ce,nt)});Ce+=j._origin;var Mt=j._tail,wt=j._root,sn=ae(ge);return Ce>=rn(j._capacity)?Mt=ps(Mt,j.__ownerID,0,Ce,nt,sn):wt=ps(wt,j.__ownerID,j._level,Ce,nt,sn),sn.value?j.__ownerID?(j._root=wt,j._tail=Mt,j.__hash=void 0,j.__altered=!0,j):Ys(j._origin,j._capacity,j._level,wt,Mt):j}(this,j,Ce)},To.prototype.remove=function(j){return this.has(j)?0===j?this.shift():j===this.size-1?this.pop():this.splice(j,1):this},To.prototype.insert=function(j,Ce){return this.splice(j,0,Ce)},To.prototype.clear=function(){return 0===this.size?this:this.__ownerID?(this.size=this._origin=this._capacity=0,this._level=5,this._root=this._tail=null,this.__hash=void 0,this.__altered=!0,this):Co()},To.prototype.push=function(){var j=arguments,Ce=this.size;return this.withMutations(function(nt){Qi(nt,0,Ce+j.length);for(var Mt=0;Mt<j.length;Mt++)nt.set(Ce+Mt,j[Mt])})},To.prototype.pop=function(){return Qi(this,0,-1)},To.prototype.unshift=function(){var j=arguments;return this.withMutations(function(Ce){Qi(Ce,-j.length);for(var nt=0;nt<j.length;nt++)Ce.set(nt,j[nt])})},To.prototype.shift=function(){return Qi(this,1)},To.prototype.merge=function(){return tt(this,void 0,arguments)},To.prototype.mergeWith=function(j){return tt(this,j,S.call(arguments,1))},To.prototype.mergeDeep=function(){return tt(this,mo,arguments)},To.prototype.mergeDeepWith=function(j){var Ce=S.call(arguments,1);return tt(this,wo(j),Ce)},To.prototype.setSize=function(j){return Qi(this,0,j)},To.prototype.slice=function(j,Ce){var nt=this.size;return Ve(j,Ce,nt)?this:Qi(this,Be(j,nt),xe(Ce,nt))},To.prototype.__iterator=function(j,Ce){var nt=0,Mt=tl(this,Ce);return new hn(function(){var wt=Mt();return wt===Is?{value:void 0,done:!0}:vn(j,nt++,wt)})},To.prototype.__iterate=function(j,Ce){for(var wt,nt=0,Mt=tl(this,Ce);(wt=Mt())!==Is&&!1!==j(wt,nt++,this););return nt},To.prototype.__ensureOwner=function(j){return j===this.__ownerID?this:j?Ys(this._origin,this._capacity,this._level,this._root,this._tail,j,this.__hash):(this.__ownerID=j,this)},To.isList=ml;var Zo="@@__IMMUTABLE_LIST__@@",vs=To.prototype;function Za(j,Ce){this.array=j,this.ownerID=Ce}vs[Zo]=!0,vs[J]=vs.remove,vs.setIn=qn.setIn,vs.deleteIn=vs.removeIn=qn.removeIn,vs.update=qn.update,vs.updateIn=qn.updateIn,vs.mergeIn=qn.mergeIn,vs.mergeDeepIn=qn.mergeDeepIn,vs.withMutations=qn.withMutations,vs.asMutable=qn.asMutable,vs.asImmutable=qn.asImmutable,vs.wasAltered=qn.wasAltered,Za.prototype.removeBefore=function(j,Ce,nt){if(nt===Ce?1<<Ce:0===this.array.length)return this;var Mt=nt>>>Ce&31;if(Mt>=this.array.length)return new Za([],j);var sn,wt=0===Mt;if(Ce>0){var Cn=this.array[Mt];if((sn=Cn&&Cn.removeBefore(j,Ce-5,nt))===Cn&&wt)return this}if(wt&&!sn)return this;var _r=Oo(this,j);if(!wt)for(var ni=0;ni<Mt;ni++)_r.array[ni]=void 0;return sn&&(_r.array[Mt]=sn),_r},Za.prototype.removeAfter=function(j,Ce,nt){if(nt===(Ce?1<<Ce:0)||0===this.array.length)return this;var wt,Mt=nt-1>>>Ce&31;if(Mt>=this.array.length)return this;if(Ce>0){var sn=this.array[Mt];if((wt=sn&&sn.removeAfter(j,Ce-5,nt))===sn&&Mt===this.array.length-1)return this}var Cn=Oo(this,j);return Cn.array.splice(Mt+1),wt&&(Cn.array[Mt]=wt),Cn};var ko,on,Is={};function tl(j,Ce){var nt=j._origin,Mt=j._capacity,wt=rn(Mt),sn=j._tail;return Cn(j._root,j._level,0);function Cn(fi,gi,zi){return 0===gi?function _r(fi,gi){var zi=gi===wt?sn&&sn.array:fi&&fi.array,Dr=gi>nt?0:nt-gi,kn=Mt-gi;return kn>32&&(kn=32),function(){if(Dr===kn)return Is;var Ar=Ce?--kn:Dr++;return zi&&zi[Ar]}}(fi,zi):function ni(fi,gi,zi){var Dr,kn=fi&&fi.array,Ar=zi>nt?0:nt-zi>>gi,gr=1+(Mt-zi>>gi);return gr>32&&(gr=32),function(){for(;;){if(Dr){var fo=Dr();if(fo!==Is)return fo;Dr=null}if(Ar===gr)return Is;var $s=Ce?--gr:Ar++;Dr=Cn(kn&&kn[$s],gi-5,zi+($s<<gi))}}}(fi,gi,zi)}}function Ys(j,Ce,nt,Mt,wt,sn,Cn){var _r=Object.create(vs);return _r.size=Ce-j,_r._origin=j,_r._capacity=Ce,_r._level=nt,_r._root=Mt,_r._tail=wt,_r.__ownerID=sn,_r.__hash=Cn,_r.__altered=!1,_r}function Co(){return ko||(ko=Ys(0,0,5))}function ps(j,Ce,nt,Mt,wt,sn){var ni,Cn=Mt>>>nt&31,_r=j&&Cn<j.array.length;if(!_r&&void 0===wt)return j;if(nt>0){var fi=j&&j.array[Cn],gi=ps(fi,Ce,nt-5,Mt,wt,sn);return gi===fi?j:((ni=Oo(j,Ce)).array[Cn]=gi,ni)}return _r&&j.array[Cn]===wt?j:(he(sn),ni=Oo(j,Ce),void 0===wt&&Cn===ni.array.length-1?ni.array.pop():ni.array[Cn]=wt,ni)}function Oo(j,Ce){return Ce&&j&&Ce===j.ownerID?j:new Za(j?j.array.slice():[],Ce)}function Nr(j,Ce){if(Ce>=rn(j._capacity))return j._tail;if(Ce<1<<j._level+5){for(var nt=j._root,Mt=j._level;nt&&Mt>0;)nt=nt.array[Ce>>>Mt&31],Mt-=5;return nt}}function Qi(j,Ce,nt){void 0!==Ce&&(Ce|=0),void 0!==nt&&(nt|=0);var Mt=j.__ownerID||new be,wt=j._origin,sn=j._capacity,Cn=wt+Ce,_r=void 0===nt?sn:nt<0?sn+nt:wt+nt;if(Cn===wt&&_r===sn)return j;if(Cn>=_r)return j.clear();for(var ni=j._level,fi=j._root,gi=0;Cn+gi<0;)fi=new Za(fi&&fi.array.length?[void 0,fi]:[],Mt),gi+=1<<(ni+=5);gi&&(Cn+=gi,wt+=gi,_r+=gi,sn+=gi);for(var zi=rn(sn),Dr=rn(_r);Dr>=1<<ni+5;)fi=new Za(fi&&fi.array.length?[fi]:[],Mt),ni+=5;var kn=j._tail,Ar=Dr<zi?Nr(j,_r-1):Dr>zi?new Za([],Mt):kn;if(kn&&Dr>zi&&Cn<sn&&kn.array.length){for(var gr=fi=Oo(fi,Mt),fo=ni;fo>5;fo-=5){var $s=zi>>>fo&31;gr=gr.array[$s]=Oo(gr.array[$s],Mt)}gr.array[zi>>>5&31]=kn}if(_r<sn&&(Ar=Ar&&Ar.removeAfter(Mt,0,_r)),Cn>=Dr)Cn-=Dr,_r-=Dr,ni=5,fi=null,Ar=Ar&&Ar.removeBefore(Mt,0,Cn);else if(Cn>wt||Dr<zi){for(gi=0;fi;){var Es=Cn>>>ni&31;if(Es!==Dr>>>ni&31)break;Es&&(gi+=(1<<ni)*Es),ni-=5,fi=fi.array[Es]}fi&&Cn>wt&&(fi=fi.removeBefore(Mt,ni,Cn-gi)),fi&&Dr<zi&&(fi=fi.removeAfter(Mt,ni,Dr-gi)),gi&&(Cn-=gi,_r-=gi)}return j.__ownerID?(j.size=_r-Cn,j._origin=Cn,j._capacity=_r,j._level=ni,j._root=fi,j._tail=Ar,j.__hash=void 0,j.__altered=!0,j):Ys(Cn,_r,ni,fi,Ar)}function tt(j,Ce,nt){for(var Mt=[],wt=0,sn=0;sn<nt.length;sn++){var Cn=nt[sn],_r=f(Cn);_r.size>wt&&(wt=_r.size),e(Cn)||(_r=_r.map(function(ni){return Gn(ni)})),Mt.push(_r)}return wt>j.size&&(j=j.setSize(wt)),Us(j,Ce,Mt)}function rn(j){return j<32?0:j-1>>>5<<5}function ne(j){return null==j?Kr():Le(j)?j:Kr().withMutations(function(Ce){var nt=a(j);lo(nt.size),nt.forEach(function(Mt,wt){return Ce.set(wt,Mt)})})}function Le(j){return Fo(j)&&C(j)}function Lt(j,Ce,nt,Mt){var wt=Object.create(ne.prototype);return wt.size=j?j.size:0,wt._map=j,wt._list=Ce,wt.__ownerID=nt,wt.__hash=Mt,wt}function Kr(){return on||(on=Lt(er(),Co()))}function bi(j,Ce,nt){var _r,ni,Mt=j._map,wt=j._list,sn=Mt.get(Ce),Cn=void 0!==sn;if(nt===U){if(!Cn)return j;wt.size>=32&&wt.size>=2*Mt.size?(_r=(ni=wt.filter(function(fi,gi){return void 0!==fi&&sn!==gi})).toKeyedSeq().map(function(fi){return fi[0]}).flip().toMap(),j.__ownerID&&(_r.__ownerID=ni.__ownerID=j.__ownerID)):(_r=Mt.remove(Ce),ni=sn===wt.size-1?wt.pop():wt.set(sn,void 0))}else if(Cn){if(nt===wt.get(sn)[1])return j;_r=Mt,ni=wt.set(sn,[Ce,nt])}else _r=Mt.set(Ce,wt.size),ni=wt.set(wt.size,[Ce,nt]);return j.__ownerID?(j.size=_r.size,j._map=_r,j._list=ni,j.__hash=void 0,j):Lt(_r,ni)}function Ii(j,Ce){this._iter=j,this._useKeys=Ce,this.size=j.size}function hs(j){this._iter=j,this.size=j.size}function zo(j){this._iter=j,this.size=j.size}function Ls(j){this._iter=j,this.size=j.size}function Xs(j){var Ce=zn(j);return Ce._iter=j,Ce.size=j.size,Ce.flip=function(){return j},Ce.reverse=function(){var nt=j.reverse.apply(this);return nt.flip=function(){return j.reverse()},nt},Ce.has=function(nt){return j.includes(nt)},Ce.includes=function(nt){return j.has(nt)},Ce.cacheResult=qr,Ce.__iterateUncached=function(nt,Mt){var wt=this;return j.__iterate(function(sn,Cn){return!1!==nt(Cn,sn,wt)},Mt)},Ce.__iteratorUncached=function(nt,Mt){if(2===nt){var wt=j.__iterator(nt,Mt);return new hn(function(){var sn=wt.next();if(!sn.done){var Cn=sn.value[0];sn.value[0]=sn.value[1],sn.value[1]=Cn}return sn})}return j.__iterator(1===nt?0:1,Mt)},Ce}function vl(j,Ce,nt){var Mt=zn(j);return Mt.size=j.size,Mt.has=function(wt){return j.has(wt)},Mt.get=function(wt,sn){var Cn=j.get(wt,U);return Cn===U?sn:Ce.call(nt,Cn,wt,j)},Mt.__iterateUncached=function(wt,sn){var Cn=this;return j.__iterate(function(_r,ni,fi){return!1!==wt(Ce.call(nt,_r,ni,fi),ni,Cn)},sn)},Mt.__iteratorUncached=function(wt,sn){var Cn=j.__iterator(2,sn);return new hn(function(){var _r=Cn.next();if(_r.done)return _r;var ni=_r.value,fi=ni[0];return vn(wt,fi,Ce.call(nt,ni[1],fi,j),_r)})},Mt}function ol(j,Ce){var nt=zn(j);return nt._iter=j,nt.size=j.size,nt.reverse=function(){return j},j.flip&&(nt.flip=function(){var Mt=Xs(j);return Mt.reverse=function(){return j.flip()},Mt}),nt.get=function(Mt,wt){return j.get(Ce?Mt:-1-Mt,wt)},nt.has=function(Mt){return j.has(Ce?Mt:-1-Mt)},nt.includes=function(Mt){return j.includes(Mt)},nt.cacheResult=qr,nt.__iterate=function(Mt,wt){var sn=this;return j.__iterate(function(Cn,_r){return Mt(Cn,_r,sn)},!wt)},nt.__iterator=function(Mt,wt){return j.__iterator(Mt,!wt)},nt}function Wl(j,Ce,nt,Mt){var wt=zn(j);return Mt&&(wt.has=function(sn){var Cn=j.get(sn,U);return Cn!==U&&!!Ce.call(nt,Cn,sn,j)},wt.get=function(sn,Cn){var _r=j.get(sn,U);return _r!==U&&Ce.call(nt,_r,sn,j)?_r:Cn}),wt.__iterateUncached=function(sn,Cn){var _r=this,ni=0;return j.__iterate(function(fi,gi,zi){if(Ce.call(nt,fi,gi,zi))return ni++,sn(fi,Mt?gi:ni-1,_r)},Cn),ni},wt.__iteratorUncached=function(sn,Cn){var _r=j.__iterator(2,Cn),ni=0;return new hn(function(){for(;;){var fi=_r.next();if(fi.done)return fi;var gi=fi.value,zi=gi[0],Dr=gi[1];if(Ce.call(nt,Dr,zi,j))return vn(sn,Mt?zi:ni++,Dr,fi)}})},wt}function Tl(j,Ce,nt,Mt){var wt=j.size;if(void 0!==Ce&&(Ce|=0),void 0!==nt&&(nt===1/0?nt=wt:nt|=0),Ve(Ce,nt,wt))return j;var sn=Be(Ce,wt),Cn=xe(nt,wt);if(sn!=sn||Cn!=Cn)return Tl(j.toSeq().cacheResult(),Ce,nt,Mt);var ni,_r=Cn-sn;_r==_r&&(ni=_r<0?0:_r);var fi=zn(j);return fi.size=0===ni?ni:j.size&&ni||void 0,!Mt&&Ci(j)&&ni>=0&&(fi.get=function(gi,zi){return(gi=st(this,gi))>=0&&gi<ni?j.get(gi+sn,zi):zi}),fi.__iterateUncached=function(gi,zi){var Dr=this;if(0===ni)return 0;if(zi)return this.cacheResult().__iterate(gi,zi);var kn=0,Ar=!0,gr=0;return j.__iterate(function(fo,$s){if(!Ar||!(Ar=kn++<sn))return gr++,!1!==gi(fo,Mt?$s:gr-1,Dr)&&gr!==ni}),gr},fi.__iteratorUncached=function(gi,zi){if(0!==ni&&zi)return this.cacheResult().__iterator(gi,zi);var Dr=0!==ni&&j.__iterator(gi,zi),kn=0,Ar=0;return new hn(function(){for(;kn++<sn;)Dr.next();if(++Ar>ni)return{value:void 0,done:!0};var gr=Dr.next();return Mt||1===gi?gr:vn(gi,Ar-1,0===gi?void 0:gr.value[1],gr)})},fi}function Pl(j,Ce,nt,Mt){var wt=zn(j);return wt.__iterateUncached=function(sn,Cn){var _r=this;if(Cn)return this.cacheResult().__iterate(sn,Cn);var ni=!0,fi=0;return j.__iterate(function(gi,zi,Dr){if(!ni||!(ni=Ce.call(nt,gi,zi,Dr)))return fi++,sn(gi,Mt?zi:fi-1,_r)}),fi},wt.__iteratorUncached=function(sn,Cn){var _r=this;if(Cn)return this.cacheResult().__iterator(sn,Cn);var ni=j.__iterator(2,Cn),fi=!0,gi=0;return new hn(function(){var zi,Dr,kn;do{if((zi=ni.next()).done)return Mt||1===sn?zi:vn(sn,gi++,0===sn?void 0:zi.value[1],zi);var Ar=zi.value;Dr=Ar[0],kn=Ar[1],fi&&(fi=Ce.call(nt,kn,Dr,_r))}while(fi);return 2===sn?zi:vn(sn,Dr,kn,zi)})},wt}function Ku(j,Ce){var nt=p(j),Mt=[j].concat(Ce).map(function(Cn){return e(Cn)?nt&&(Cn=a(Cn)):Cn=nt?Ro(Cn):Sr(Array.isArray(Cn)?Cn:[Cn]),Cn}).filter(function(Cn){return 0!==Cn.size});if(0===Mt.length)return j;if(1===Mt.length){var wt=Mt[0];if(wt===j||nt&&p(wt)||y(j)&&y(wt))return wt}var sn=new Pn(Mt);return nt?sn=sn.toKeyedSeq():y(j)||(sn=sn.toSetSeq()),(sn=sn.flatten(!0)).size=Mt.reduce(function(Cn,_r){if(void 0!==Cn){var ni=_r.size;if(void 0!==ni)return Cn+ni}},0),sn}function Qa(j,Ce,nt){var Mt=zn(j);return Mt.__iterateUncached=function(wt,sn){var Cn=0,_r=!1;return function ni(fi,gi){var zi=this;fi.__iterate(function(Dr,kn){return(!Ce||gi<Ce)&&e(Dr)?ni(Dr,gi+1):!1===wt(Dr,nt?kn:Cn++,zi)&&(_r=!0),!_r},sn)}(j,0),Cn},Mt.__iteratorUncached=function(wt,sn){var Cn=j.__iterator(wt,sn),_r=[],ni=0;return new hn(function(){for(;Cn;){var fi=Cn.next();if(!1===fi.done){var gi=fi.value;if(2===wt&&(gi=gi[1]),Ce&&!(_r.length<Ce)||!e(gi))return nt?fi:vn(wt,ni++,gi,fi);_r.push(Cn),Cn=gi.__iterator(wt,sn)}else Cn=_r.pop()}return{value:void 0,done:!0}})},Mt}function Wa(j,Ce,nt){Ce||(Ce=Di);var Mt=p(j),wt=0,sn=j.toSeq().map(function(Cn,_r){return[_r,Cn,wt++,nt?nt(Cn,_r,j):Cn]}).toArray();return sn.sort(function(Cn,_r){return Ce(Cn[3],_r[3])||Cn[2]-_r[2]}).forEach(Mt?function(Cn,_r){sn[_r].length=2}:function(Cn,_r){sn[_r]=Cn[1]}),Mt?mi(sn):y(j)?ur(sn):$r(sn)}function Ml(j,Ce,nt){if(Ce||(Ce=Di),nt){var Mt=j.toSeq().map(function(wt,sn){return[wt,nt(wt,sn,j)]}).reduce(function(wt,sn){return Hl(Ce,wt[1],sn[1])?sn:wt});return Mt&&Mt[0]}return j.reduce(function(wt,sn){return Hl(Ce,wt,sn)?sn:wt})}function Hl(j,Ce,nt){var Mt=j(nt,Ce);return 0===Mt&&nt!==Ce&&(null==nt||nt!=nt)||Mt>0}function Ua(j,Ce,nt){var Mt=zn(j);return Mt.size=new Pn(nt).map(function(wt){return wt.size}).min(),Mt.__iterate=function(wt,sn){for(var _r,Cn=this.__iterator(1,sn),ni=0;!(_r=Cn.next()).done&&!1!==wt(_r.value,ni++,this););return ni},Mt.__iteratorUncached=function(wt,sn){var Cn=nt.map(function(fi){return fi=r(fi),Yt(sn?fi.reverse():fi)}),_r=0,ni=!1;return new hn(function(){var fi;return ni||(fi=Cn.map(function(gi){return gi.next()}),ni=fi.some(function(gi){return gi.done})),ni?{value:void 0,done:!0}:vn(wt,_r++,Ce.apply(null,fi.map(function(gi){return gi.value})))})},Mt}function Qe(j,Ce){return Ci(j)?Ce:j.constructor(Ce)}function zt(j){if(j!==Object(j))throw new TypeError("Expected [K, V] tuple: "+j)}function ot(j){return lo(j.size),ue(j)}function jt(j){return p(j)?a:y(j)?f:c}function zn(j){return Object.create((p(j)?mi:y(j)?ur:$r).prototype)}function qr(){return this._iter.cacheResult?(this._iter.cacheResult(),this.size=this._iter.size,this):Ei.prototype.cacheResult.call(this)}function Di(j,Ce){return j>Ce?1:j<Ce?-1:0}function as(j){var Ce=Yt(j);if(!Ce){if(!pr(j))throw new TypeError("Expected iterable or array-like: "+j);Ce=Yt(r(j))}return Ce}function js(j,Ce){var nt,Mt=function(Cn){if(Cn instanceof Mt)return Cn;if(!(this instanceof Mt))return new Mt(Cn);if(!nt){nt=!0;var _r=Object.keys(j);(function Ka(j,Ce){try{Ce.forEach(sl.bind(void 0,j))}catch(nt){}})(wt,_r),wt.size=_r.length,wt._name=Ce,wt._keys=_r,wt._defaultValues=j}this._map=Ai(Cn)},wt=Mt.prototype=Object.create(As);return wt.constructor=Mt,Mt}i(ne,Ai),ne.of=function(){return this(arguments)},ne.prototype.toString=function(){return this.__toString("OrderedMap {","}")},ne.prototype.get=function(j,Ce){var nt=this._map.get(j);return void 0!==nt?this._list.get(nt)[1]:Ce},ne.prototype.clear=function(){return 0===this.size?this:this.__ownerID?(this.size=0,this._map.clear(),this._list.clear(),this):Kr()},ne.prototype.set=function(j,Ce){return bi(this,j,Ce)},ne.prototype.remove=function(j){return bi(this,j,U)},ne.prototype.wasAltered=function(){return this._map.wasAltered()||this._list.wasAltered()},ne.prototype.__iterate=function(j,Ce){var nt=this;return this._list.__iterate(function(Mt){return Mt&&j(Mt[1],Mt[0],nt)},Ce)},ne.prototype.__iterator=function(j,Ce){return this._list.fromEntrySeq().__iterator(j,Ce)},ne.prototype.__ensureOwner=function(j){if(j===this.__ownerID)return this;var Ce=this._map.__ensureOwner(j),nt=this._list.__ensureOwner(j);return j?Lt(Ce,nt,j,this.__hash):(this.__ownerID=j,this._map=Ce,this._list=nt,this)},ne.isOrderedMap=Le,ne.prototype[W]=!0,ne.prototype[J]=ne.prototype.remove,i(Ii,mi),Ii.prototype.get=function(j,Ce){return this._iter.get(j,Ce)},Ii.prototype.has=function(j){return this._iter.has(j)},Ii.prototype.valueSeq=function(){return this._iter.valueSeq()},Ii.prototype.reverse=function(){var j=this,Ce=ol(this,!0);return this._useKeys||(Ce.valueSeq=function(){return j._iter.toSeq().reverse()}),Ce},Ii.prototype.map=function(j,Ce){var nt=this,Mt=vl(this,j,Ce);return this._useKeys||(Mt.valueSeq=function(){return nt._iter.toSeq().map(j,Ce)}),Mt},Ii.prototype.__iterate=function(j,Ce){var Mt,nt=this;return this._iter.__iterate(this._useKeys?function(wt,sn){return j(wt,sn,nt)}:(Mt=Ce?ot(this):0,function(wt){return j(wt,Ce?--Mt:Mt++,nt)}),Ce)},Ii.prototype.__iterator=function(j,Ce){if(this._useKeys)return this._iter.__iterator(j,Ce);var nt=this._iter.__iterator(1,Ce),Mt=Ce?ot(this):0;return new hn(function(){var wt=nt.next();return wt.done?wt:vn(j,Ce?--Mt:Mt++,wt.value,wt)})},Ii.prototype[W]=!0,i(hs,ur),hs.prototype.includes=function(j){return this._iter.includes(j)},hs.prototype.__iterate=function(j,Ce){var nt=this,Mt=0;return this._iter.__iterate(function(wt){return j(wt,Mt++,nt)},Ce)},hs.prototype.__iterator=function(j,Ce){var nt=this._iter.__iterator(1,Ce),Mt=0;return new hn(function(){var wt=nt.next();return wt.done?wt:vn(j,Mt++,wt.value,wt)})},i(zo,$r),zo.prototype.has=function(j){return this._iter.includes(j)},zo.prototype.__iterate=function(j,Ce){var nt=this;return this._iter.__iterate(function(Mt){return j(Mt,Mt,nt)},Ce)},zo.prototype.__iterator=function(j,Ce){var nt=this._iter.__iterator(1,Ce);return new hn(function(){var Mt=nt.next();return Mt.done?Mt:vn(j,Mt.value,Mt.value,Mt)})},i(Ls,mi),Ls.prototype.entrySeq=function(){return this._iter.toSeq()},Ls.prototype.__iterate=function(j,Ce){var nt=this;return this._iter.__iterate(function(Mt){if(Mt){zt(Mt);var wt=e(Mt);return j(wt?Mt.get(1):Mt[1],wt?Mt.get(0):Mt[0],nt)}},Ce)},Ls.prototype.__iterator=function(j,Ce){var nt=this._iter.__iterator(1,Ce);return new hn(function(){for(;;){var Mt=nt.next();if(Mt.done)return Mt;var wt=Mt.value;if(wt){zt(wt);var sn=e(wt);return vn(j,sn?wt.get(0):wt[0],sn?wt.get(1):wt[1],Mt)}}})},hs.prototype.cacheResult=Ii.prototype.cacheResult=zo.prototype.cacheResult=Ls.prototype.cacheResult=qr,i(js,ri),js.prototype.toString=function(){return this.__toString(Io(this)+" {","}")},js.prototype.has=function(j){return this._defaultValues.hasOwnProperty(j)},js.prototype.get=function(j,Ce){if(!this.has(j))return Ce;var nt=this._defaultValues[j];return this._map?this._map.get(j,nt):nt},js.prototype.clear=function(){if(this.__ownerID)return this._map&&this._map.clear(),this;var j=this.constructor;return j._empty||(j._empty=Ns(this,er()))},js.prototype.set=function(j,Ce){if(!this.has(j))throw new Error('Cannot set unknown key "'+j+'" on '+Io(this));if(this._map&&!this._map.has(j)&&Ce===this._defaultValues[j])return this;var Mt=this._map&&this._map.set(j,Ce);return this.__ownerID||Mt===this._map?this:Ns(this,Mt)},js.prototype.remove=function(j){if(!this.has(j))return this;var Ce=this._map&&this._map.remove(j);return this.__ownerID||Ce===this._map?this:Ns(this,Ce)},js.prototype.wasAltered=function(){return this._map.wasAltered()},js.prototype.__iterator=function(j,Ce){var nt=this;return a(this._defaultValues).map(function(Mt,wt){return nt.get(wt)}).__iterator(j,Ce)},js.prototype.__iterate=function(j,Ce){var nt=this;return a(this._defaultValues).map(function(Mt,wt){return nt.get(wt)}).__iterate(j,Ce)},js.prototype.__ensureOwner=function(j){if(j===this.__ownerID)return this;var Ce=this._map&&this._map.__ensureOwner(j);return j?Ns(this,Ce,j):(this.__ownerID=j,this._map=Ce,this)};var As=js.prototype;function Ns(j,Ce,nt){var Mt=Object.create(Object.getPrototypeOf(j));return Mt._map=Ce,Mt.__ownerID=nt,Mt}function Io(j){return j._name||j.constructor.name||"Record"}function sl(j,Ce){Object.defineProperty(j,Ce,{get:function(){return this.get(Ce)},set:function(nt){Zn(this.__ownerID,"Cannot set on an immutable record."),this.set(Ce,nt)}})}function Bs(j){return null==j?Ya():lt(j)&&!C(j)?j:Ya().withMutations(function(Ce){var nt=c(j);lo(nt.size),nt.forEach(function(Mt){return Ce.add(Mt)})})}function lt(j){return!(!j||!j[Xe])}As[J]=As.remove,As.deleteIn=As.removeIn=qn.removeIn,As.merge=qn.merge,As.mergeWith=qn.mergeWith,As.mergeIn=qn.mergeIn,As.mergeDeep=qn.mergeDeep,As.mergeDeepWith=qn.mergeDeepWith,As.mergeDeepIn=qn.mergeDeepIn,As.setIn=qn.setIn,As.update=qn.update,As.updateIn=qn.updateIn,As.withMutations=qn.withMutations,As.asMutable=qn.asMutable,As.asImmutable=qn.asImmutable,i(Bs,Ui),Bs.of=function(){return this(arguments)},Bs.fromKeys=function(j){return this(a(j).keySeq())},Bs.prototype.toString=function(){return this.__toString("Set {","}")},Bs.prototype.has=function(j){return this._map.has(j)},Bs.prototype.add=function(j){return Ut(this,this._map.set(j,!0))},Bs.prototype.remove=function(j){return Ut(this,this._map.remove(j))},Bs.prototype.clear=function(){return Ut(this,this._map.clear())},Bs.prototype.union=function(){var j=S.call(arguments,0);return 0===(j=j.filter(function(Ce){return 0!==Ce.size})).length?this:0!==this.size||this.__ownerID||1!==j.length?this.withMutations(function(Ce){for(var nt=0;nt<j.length;nt++)c(j[nt]).forEach(function(Mt){return Ce.add(Mt)})}):this.constructor(j[0])},Bs.prototype.intersect=function(){var j=S.call(arguments,0);if(0===j.length)return this;j=j.map(function(nt){return c(nt)});var Ce=this;return this.withMutations(function(nt){Ce.forEach(function(Mt){j.every(function(wt){return wt.includes(Mt)})||nt.remove(Mt)})})},Bs.prototype.subtract=function(){var j=S.call(arguments,0);if(0===j.length)return this;j=j.map(function(nt){return c(nt)});var Ce=this;return this.withMutations(function(nt){Ce.forEach(function(Mt){j.some(function(wt){return wt.includes(Mt)})&&nt.remove(Mt)})})},Bs.prototype.merge=function(){return this.union.apply(this,arguments)},Bs.prototype.mergeWith=function(j){var Ce=S.call(arguments,1);return this.union.apply(this,Ce)},Bs.prototype.sort=function(j){return yl(Wa(this,j))},Bs.prototype.sortBy=function(j,Ce){return yl(Wa(this,Ce,j))},Bs.prototype.wasAltered=function(){return this._map.wasAltered()},Bs.prototype.__iterate=function(j,Ce){var nt=this;return this._map.__iterate(function(Mt,wt){return j(wt,wt,nt)},Ce)},Bs.prototype.__iterator=function(j,Ce){return this._map.map(function(nt,Mt){return Mt}).__iterator(j,Ce)},Bs.prototype.__ensureOwner=function(j){if(j===this.__ownerID)return this;var Ce=this._map.__ensureOwner(j);return j?this.__make(Ce,j):(this.__ownerID=j,this._map=Ce,this)},Bs.isSet=lt;var Wo,Xe="@@__IMMUTABLE_SET__@@",ke=Bs.prototype;function Ut(j,Ce){return j.__ownerID?(j.size=Ce.size,j._map=Ce,j):Ce===j._map?j:0===Ce.size?j.__empty():j.__make(Ce)}function pi(j,Ce){var nt=Object.create(ke);return nt.size=j?j.size:0,nt._map=j,nt.__ownerID=Ce,nt}function Ya(){return Wo||(Wo=pi(er()))}function yl(j){return null==j?oa():Xu(j)?j:oa().withMutations(function(Ce){var nt=c(j);lo(nt.size),nt.forEach(function(Mt){return Ce.add(Mt)})})}function Xu(j){return lt(j)&&C(j)}ke[Xe]=!0,ke[J]=ke.remove,ke.mergeDeep=ke.merge,ke.mergeDeepWith=ke.mergeWith,ke.withMutations=qn.withMutations,ke.asMutable=qn.asMutable,ke.asImmutable=qn.asImmutable,ke.__empty=Ya,ke.__make=pi,i(yl,Bs),yl.of=function(){return this(arguments)},yl.fromKeys=function(j){return this(a(j).keySeq())},yl.prototype.toString=function(){return this.__toString("OrderedSet {","}")},yl.isOrderedSet=Xu;var Hi,Lc=yl.prototype;function vd(j,Ce){var nt=Object.create(Lc);return nt.size=j?j.size:0,nt._map=j,nt.__ownerID=Ce,nt}function oa(){return Hi||(Hi=vd(Kr()))}function Ia(j){return null==j?nu():ys(j)?j:nu().unshiftAll(j)}function ys(j){return!(!j||!j[qu])}Lc[W]=!0,Lc.__empty=oa,Lc.__make=vd,i(Ia,vi),Ia.of=function(){return this(arguments)},Ia.prototype.toString=function(){return this.__toString("Stack [","]")},Ia.prototype.get=function(j,Ce){var nt=this._head;for(j=st(this,j);nt&&j--;)nt=nt.next;return nt?nt.value:Ce},Ia.prototype.peek=function(){return this._head&&this._head.value},Ia.prototype.push=function(){if(0===arguments.length)return this;for(var j=this.size+arguments.length,Ce=this._head,nt=arguments.length-1;nt>=0;nt--)Ce={value:arguments[nt],next:Ce};return this.__ownerID?(this.size=j,this._head=Ce,this.__hash=void 0,this.__altered=!0,this):su(j,Ce)},Ia.prototype.pushAll=function(j){if(0===(j=f(j)).size)return this;lo(j.size);var Ce=this.size,nt=this._head;return j.reverse().forEach(function(Mt){Ce++,nt={value:Mt,next:nt}}),this.__ownerID?(this.size=Ce,this._head=nt,this.__hash=void 0,this.__altered=!0,this):su(Ce,nt)},Ia.prototype.pop=function(){return this.slice(1)},Ia.prototype.unshift=function(){return this.push.apply(this,arguments)},Ia.prototype.unshiftAll=function(j){return this.pushAll(j)},Ia.prototype.shift=function(){return this.pop.apply(this,arguments)},Ia.prototype.clear=function(){return 0===this.size?this:this.__ownerID?(this.size=0,this._head=void 0,this.__hash=void 0,this.__altered=!0,this):nu()},Ia.prototype.slice=function(j,Ce){if(Ve(j,Ce,this.size))return this;var nt=Be(j,this.size);if(xe(Ce,this.size)!==this.size)return vi.prototype.slice.call(this,j,Ce);for(var wt=this.size-nt,sn=this._head;nt--;)sn=sn.next;return this.__ownerID?(this.size=wt,this._head=sn,this.__hash=void 0,this.__altered=!0,this):su(wt,sn)},Ia.prototype.__ensureOwner=function(j){return j===this.__ownerID?this:j?su(this.size,this._head,j,this.__hash):(this.__ownerID=j,this.__altered=!1,this)},Ia.prototype.__iterate=function(j,Ce){if(Ce)return this.reverse().__iterate(j);for(var nt=0,Mt=this._head;Mt&&!1!==j(Mt.value,nt++,this);)Mt=Mt.next;return nt},Ia.prototype.__iterator=function(j,Ce){if(Ce)return this.reverse().__iterator(j);var nt=0,Mt=this._head;return new hn(function(){if(Mt){var wt=Mt.value;return Mt=Mt.next,vn(j,nt++,wt)}return{value:void 0,done:!0}})},Ia.isStack=ys;var vu,qu="@@__IMMUTABLE_STACK__@@",bl=Ia.prototype;function su(j,Ce,nt,Mt){var wt=Object.create(bl);return wt.size=j,wt._head=Ce,wt.__ownerID=nt,wt.__hash=Mt,wt.__altered=!1,wt}function nu(){return vu||(vu=su(0))}function ra(j,Ce){var nt=function(Mt){j.prototype[Mt]=Ce[Mt]};return Object.keys(Ce).forEach(nt),Object.getOwnPropertySymbols&&Object.getOwnPropertySymbols(Ce).forEach(nt),j}bl[qu]=!0,bl.withMutations=qn.withMutations,bl.asMutable=qn.asMutable,bl.asImmutable=qn.asImmutable,bl.wasAltered=qn.wasAltered,r.Iterator=hn,ra(r,{toArray:function(){lo(this.size);var j=new Array(this.size||0);return this.valueSeq().__iterate(function(Ce,nt){j[nt]=Ce}),j},toIndexedSeq:function(){return new hs(this)},toJS:function(){return this.toSeq().map(function(j){return j&&"function"==typeof j.toJS?j.toJS():j}).__toJS()},toJSON:function(){return this.toSeq().map(function(j){return j&&"function"==typeof j.toJSON?j.toJSON():j}).__toJS()},toKeyedSeq:function(){return new Ii(this,!0)},toMap:function(){return Ai(this.toKeyedSeq())},toObject:function(){lo(this.size);var j={};return this.__iterate(function(Ce,nt){j[nt]=Ce}),j},toOrderedMap:function(){return ne(this.toKeyedSeq())},toOrderedSet:function(){return yl(p(this)?this.valueSeq():this)},toSet:function(){return Bs(p(this)?this.valueSeq():this)},toSetSeq:function(){return new zo(this)},toSeq:function(){return y(this)?this.toIndexedSeq():p(this)?this.toKeyedSeq():this.toSetSeq()},toStack:function(){return Ia(p(this)?this.valueSeq():this)},toList:function(){return To(p(this)?this.valueSeq():this)},toString:function(){return"[Iterable]"},__toString:function(j,Ce){return 0===this.size?j+Ce:j+" "+this.toSeq().map(this.__toStringMapper).join(", ")+" "+Ce},concat:function(){return Qe(this,Ku(this,S.call(arguments,0)))},includes:function(j){return this.some(function(Ce){return hr(Ce,j)})},entries:function(){return this.__iterator(2)},every:function(j,Ce){lo(this.size);var nt=!0;return this.__iterate(function(Mt,wt,sn){if(!j.call(Ce,Mt,wt,sn))return nt=!1,!1}),nt},filter:function(j,Ce){return Qe(this,Wl(this,j,Ce,!0))},find:function(j,Ce,nt){var Mt=this.findEntry(j,Ce);return Mt?Mt[1]:nt},forEach:function(j,Ce){return lo(this.size),this.__iterate(Ce?j.bind(Ce):j)},join:function(j){lo(this.size),j=void 0!==j?""+j:",";var Ce="",nt=!0;return this.__iterate(function(Mt){nt?nt=!1:Ce+=j,Ce+=null!=Mt?Mt.toString():""}),Ce},keys:function(){return this.__iterator(0)},map:function(j,Ce){return Qe(this,vl(this,j,Ce))},reduce:function(j,Ce,nt){var Mt,wt;return lo(this.size),arguments.length<2?wt=!0:Mt=Ce,this.__iterate(function(sn,Cn,_r){wt?(wt=!1,Mt=sn):Mt=j.call(nt,Mt,sn,Cn,_r)}),Mt},reduceRight:function(j,Ce,nt){var Mt=this.toKeyedSeq().reverse();return Mt.reduce.apply(Mt,arguments)},reverse:function(){return Qe(this,ol(this,!0))},slice:function(j,Ce){return Qe(this,Tl(this,j,Ce,!0))},some:function(j,Ce){return!this.every(uu(j),Ce)},sort:function(j){return Qe(this,Wa(this,j))},values:function(){return this.__iterator(1)},butLast:function(){return this.slice(0,-1)},isEmpty:function(){return void 0!==this.size?0===this.size:!this.some(function(){return!0})},count:function(j,Ce){return ue(j?this.toSeq().filter(j,Ce):this)},countBy:function(j,Ce){return function Qu(j,Ce,nt){var Mt=Ai().asMutable();return j.__iterate(function(wt,sn){Mt.update(Ce.call(nt,wt,sn,j),0,function(Cn){return Cn+1})}),Mt.asImmutable()}(this,j,Ce)},equals:function(j){return Ki(this,j)},entrySeq:function(){var j=this;if(j._cache)return new Pn(j._cache);var Ce=j.toSeq().map(au).toIndexedSeq();return Ce.fromEntrySeq=function(){return j.toSeq()},Ce},filterNot:function(j,Ce){return this.filter(uu(j),Ce)},findEntry:function(j,Ce,nt){var Mt=nt;return this.__iterate(function(wt,sn,Cn){if(j.call(Ce,wt,sn,Cn))return Mt=[sn,wt],!1}),Mt},findKey:function(j,Ce){var nt=this.findEntry(j,Ce);return nt&&nt[0]},findLast:function(j,Ce,nt){return this.toKeyedSeq().reverse().find(j,Ce,nt)},findLastEntry:function(j,Ce,nt){return this.toKeyedSeq().reverse().findEntry(j,Ce,nt)},findLastKey:function(j,Ce){return this.toKeyedSeq().reverse().findKey(j,Ce)},first:function(){return this.find(We)},flatMap:function(j,Ce){return Qe(this,function Mc(j,Ce,nt){var Mt=jt(j);return j.toSeq().map(function(wt,sn){return Mt(Ce.call(nt,wt,sn,j))}).flatten(!0)}(this,j,Ce))},flatten:function(j){return Qe(this,Qa(this,j,!0))},fromEntrySeq:function(){return new Ls(this)},get:function(j,Ce){return this.find(function(nt,Mt){return hr(Mt,j)},void 0,Ce)},getIn:function(j,Ce){for(var wt,nt=this,Mt=as(j);!(wt=Mt.next()).done;)if((nt=nt&&nt.get?nt.get(wt.value,U):U)===U)return Ce;return nt},groupBy:function(j,Ce){return function hc(j,Ce,nt){var Mt=p(j),wt=(C(j)?ne():Ai()).asMutable();j.__iterate(function(Cn,_r){wt.update(Ce.call(nt,Cn,_r,j),function(ni){return(ni=ni||[]).push(Mt?[_r,Cn]:Cn),ni})});var sn=jt(j);return wt.map(function(Cn){return Qe(j,sn(Cn))})}(this,j,Ce)},has:function(j){return this.get(j,U)!==U},hasIn:function(j){return this.getIn(j,U)!==U},isSubset:function(j){return j="function"==typeof j.includes?j:r(j),this.every(function(Ce){return j.includes(Ce)})},isSuperset:function(j){return(j="function"==typeof j.isSubset?j:r(j)).isSubset(this)},keyOf:function(j){return this.findKey(function(Ce){return hr(Ce,j)})},keySeq:function(){return this.toSeq().map(ec).toIndexedSeq()},last:function(){return this.toSeq().reverse().first()},lastKeyOf:function(j){return this.toKeyedSeq().reverse().keyOf(j)},max:function(j){return Ml(this,j)},maxBy:function(j,Ce){return Ml(this,Ce,j)},min:function(j){return Ml(this,j?id(j):wu)},minBy:function(j,Ce){return Ml(this,Ce?id(Ce):wu,j)},rest:function(){return this.slice(1)},skip:function(j){return this.slice(Math.max(0,j))},skipLast:function(j){return Qe(this,this.toSeq().reverse().skip(j).reverse())},skipWhile:function(j,Ce){return Qe(this,Pl(this,j,Ce,!0))},skipUntil:function(j,Ce){return this.skipWhile(uu(j),Ce)},sortBy:function(j,Ce){return Qe(this,Wa(this,Ce,j))},take:function(j){return this.slice(0,Math.max(0,j))},takeLast:function(j){return Qe(this,this.toSeq().reverse().take(j).reverse())},takeWhile:function(j,Ce){return Qe(this,function _c(j,Ce,nt){var Mt=zn(j);return Mt.__iterateUncached=function(wt,sn){var Cn=this;if(sn)return this.cacheResult().__iterate(wt,sn);var _r=0;return j.__iterate(function(ni,fi,gi){return Ce.call(nt,ni,fi,gi)&&++_r&&wt(ni,fi,Cn)}),_r},Mt.__iteratorUncached=function(wt,sn){var Cn=this;if(sn)return this.cacheResult().__iterator(wt,sn);var _r=j.__iterator(2,sn),ni=!0;return new hn(function(){if(!ni)return{value:void 0,done:!0};var fi=_r.next();if(fi.done)return fi;var gi=fi.value,zi=gi[0],Dr=gi[1];return Ce.call(nt,Dr,zi,Cn)?2===wt?fi:vn(wt,zi,Dr,fi):(ni=!1,{value:void 0,done:!0})})},Mt}(this,j,Ce))},takeUntil:function(j,Ce){return this.takeWhile(uu(j),Ce)},valueSeq:function(){return this.toIndexedSeq()},hashCode:function(){return this.__hash||(this.__hash=function Fd(j){if(j.size===1/0)return 0;var Ce=C(j),nt=p(j),Mt=Ce?1:0;return function Bo(j,Ce){return Ce=ao(Ce,3432918353),Ce=ao(Ce<<15|Ce>>>-15,461845907),Ce=ao(Ce<<13|Ce>>>-13,5),Ce=ao((Ce=(Ce+3864292196|0)^j)^Ce>>>16,2246822507),dt((Ce=ao(Ce^Ce>>>13,3266489909))^Ce>>>16)}(j.__iterate(nt?Ce?function(sn,Cn){Mt=31*Mt+cu(Bi(sn),Bi(Cn))|0}:function(sn,Cn){Mt=Mt+cu(Bi(sn),Bi(Cn))|0}:Ce?function(sn){Mt=31*Mt+Bi(sn)|0}:function(sn){Mt=Mt+Bi(sn)|0}),Mt)}(this))}});var yu=r.prototype;yu[R]=!0,yu[Vt]=yu.values,yu.__toJS=yu.toArray,yu.__toStringMapper=$u,yu.inspect=yu.toSource=function(){return this.toString()},yu.chain=yu.flatMap,yu.contains=yu.includes,ra(a,{flip:function(){return Qe(this,Xs(this))},mapEntries:function(j,Ce){var nt=this,Mt=0;return Qe(this,this.toSeq().map(function(wt,sn){return j.call(Ce,[sn,wt],Mt++,nt)}).fromEntrySeq())},mapKeys:function(j,Ce){var nt=this;return Qe(this,this.toSeq().flip().map(function(Mt,wt){return j.call(Ce,Mt,wt,nt)}).flip())}});var rd=a.prototype;function ec(j,Ce){return Ce}function au(j,Ce){return[Ce,j]}function uu(j){return function(){return!j.apply(this,arguments)}}function id(j){return function(){return-j.apply(this,arguments)}}function $u(j){return"string"==typeof j?JSON.stringify(j):String(j)}function Hu(){return we(arguments)}function wu(j,Ce){return j<Ce?1:j>Ce?-1:0}function cu(j,Ce){return j^Ce+2654435769+(j<<6)+(j>>2)|0}return rd[L]=!0,rd[Vt]=yu.entries,rd.__toJS=yu.toObject,rd.__toStringMapper=function(j,Ce){return JSON.stringify(Ce)+": "+$u(j)},ra(f,{toKeyedSeq:function(){return new Ii(this,!1)},filter:function(j,Ce){return Qe(this,Wl(this,j,Ce,!1))},findIndex:function(j,Ce){var nt=this.findEntry(j,Ce);return nt?nt[0]:-1},indexOf:function(j){var Ce=this.keyOf(j);return void 0===Ce?-1:Ce},lastIndexOf:function(j){var Ce=this.lastKeyOf(j);return void 0===Ce?-1:Ce},reverse:function(){return Qe(this,ol(this,!1))},slice:function(j,Ce){return Qe(this,Tl(this,j,Ce,!1))},splice:function(j,Ce){var nt=arguments.length;if(Ce=Math.max(0|Ce,0),0===nt||2===nt&&!Ce)return this;j=Be(j,j<0?this.count():this.size);var Mt=this.slice(0,j);return Qe(this,1===nt?Mt:Mt.concat(we(arguments,2),this.slice(j+Ce)))},findLastIndex:function(j,Ce){var nt=this.findLastEntry(j,Ce);return nt?nt[0]:-1},first:function(){return this.get(0)},flatten:function(j){return Qe(this,Qa(this,j,!1))},get:function(j,Ce){return(j=st(this,j))<0||this.size===1/0||void 0!==this.size&&j>this.size?Ce:this.find(function(nt,Mt){return Mt===j},void 0,Ce)},has:function(j){return(j=st(this,j))>=0&&(void 0!==this.size?this.size===1/0||j<this.size:-1!==this.indexOf(j))},interpose:function(j){return Qe(this,function tu(j,Ce){var nt=zn(j);return nt.size=j.size&&2*j.size-1,nt.__iterateUncached=function(Mt,wt){var sn=this,Cn=0;return j.__iterate(function(_r,ni){return(!Cn||!1!==Mt(Ce,Cn++,sn))&&!1!==Mt(_r,Cn++,sn)},wt),Cn},nt.__iteratorUncached=function(Mt,wt){var _r,sn=j.__iterator(1,wt),Cn=0;return new hn(function(){return(!_r||Cn%2)&&(_r=sn.next()).done?_r:Cn%2?vn(Mt,Cn++,Ce):vn(Mt,Cn++,_r.value,_r)})},nt}(this,j))},interleave:function(){var j=[this].concat(we(arguments)),Ce=Ua(this.toSeq(),ur.of,j),nt=Ce.flatten(!0);return Ce.size&&(nt.size=Ce.size*j.length),Qe(this,nt)},keySeq:function(){return cn(0,this.size)},last:function(){return this.get(-1)},skipWhile:function(j,Ce){return Qe(this,Pl(this,j,Ce,!1))},zip:function(){return Qe(this,Ua(this,Hu,[this].concat(we(arguments))))},zipWith:function(j){var Ce=we(arguments);return Ce[0]=this,Qe(this,Ua(this,j,Ce))}}),f.prototype[z]=!0,f.prototype[W]=!0,ra(c,{get:function(j,Ce){return this.has(j)?j:Ce},includes:function(j){return this.has(j)},keySeq:function(){return this.valueSeq()}}),c.prototype.has=yu.includes,c.prototype.contains=c.prototype.includes,ra(mi,a.prototype),ra(ur,f.prototype),ra($r,c.prototype),ra(ri,a.prototype),ra(vi,f.prototype),ra(Ui,c.prototype),{Iterable:r,Seq:Ei,Collection:Or,Map:Ai,OrderedMap:ne,List:To,Stack:Ia,Set:Bs,OrderedSet:yl,Record:js,Range:cn,Repeat:ln,is:hr,fromJS:Gn}}()},74299:m=>{m.exports=function(S,i,r,a){var c=new Blob(void 0!==a?[a,S]:[S],{type:r||"application/octet-stream"});if(void 0!==window.navigator.msSaveBlob)window.navigator.msSaveBlob(c,i);else{var e=window.URL&&window.URL.createObjectURL?window.URL.createObjectURL(c):window.webkitURL.createObjectURL(c),p=document.createElement("a");p.style.display="none",p.href=e,p.setAttribute("download",i),void 0===p.download&&p.setAttribute("target","_blank"),document.body.appendChild(p),p.click(),setTimeout(function(){document.body.removeChild(p),window.URL.revokeObjectURL(e)},200)}}},86906:m=>{var a=/^\s+|\s+$/g,f=/^[-+]0x[0-9a-f]+$/i,c=/^0b[01]+$/i,e=/^0o[0-7]+$/i,p=parseInt,y="object"==typeof global&&global&&global.Object===Object&&global,T="object"==typeof self&&self&&self.Object===Object&&self,C=y||T||Function("return this")(),L=Object.prototype.toString,z=Math.max,W=Math.min,J=function(){return C.Date.now()};function ce(ge){var ae=typeof ge;return!!ge&&("object"==ae||"function"==ae)}function se(ge){if("number"==typeof ge)return ge;if(function U(ge){return"symbol"==typeof ge||function ie(ge){return!!ge&&"object"==typeof ge}(ge)&&"[object Symbol]"==L.call(ge)}(ge))return NaN;if(ce(ge)){var ae="function"==typeof ge.valueOf?ge.valueOf():ge;ge=ce(ae)?ae+"":ae}if("string"!=typeof ge)return 0===ge?ge:+ge;ge=ge.replace(a,"");var he=c.test(ge);return he||e.test(ge)?p(ge.slice(2),he?2:8):f.test(ge)?NaN:+ge}m.exports=function ee(ge,ae,he){var be,we,ue,st,We,Ve,Be=0,xe=!1,je=!1,Ne=!0;if("function"!=typeof ge)throw new TypeError("Expected a function");function Bt(St){var Yt=be,Fn=we;return be=we=void 0,Be=St,st=ge.apply(Fn,Yt)}function rt(St){return Be=St,We=setTimeout(Vt,ae),xe?Bt(St):st}function Pt(St){var Yt=St-Ve;return void 0===Ve||Yt>=ae||Yt<0||je&&St-Be>=ue}function Vt(){var St=J();if(Pt(St))return hn(St);We=setTimeout(Vt,function en(St){var pr=ae-(St-Ve);return je?W(pr,ue-(St-Be)):pr}(St))}function hn(St){return We=void 0,Ne&&be?Bt(St):(be=we=void 0,st)}function Nt(){var St=J(),Yt=Pt(St);if(be=arguments,we=this,Ve=St,Yt){if(void 0===We)return rt(Ve);if(je)return We=setTimeout(Vt,ae),Bt(Ve)}return void 0===We&&(We=setTimeout(Vt,ae)),st}return ae=se(ae)||0,ce(he)&&(xe=!!he.leading,ue=(je="maxWait"in he)?z(se(he.maxWait)||0,ae):ue,Ne="trailing"in he?!!he.trailing:Ne),Nt.cancel=function vn(){void 0!==We&&clearTimeout(We),Be=0,be=Ve=we=We=void 0},Nt.flush=function mt(){return void 0===We?st:hn(J())},Nt}},66941:m=>{var Pn,i="__lodash_hash_undefined__",c=/^\[object .+?Constructor\]$/,e="object"==typeof global&&global&&global.Object===Object&&global,p="object"==typeof self&&self&&self.Object===Object&&self,y=e||p||Function("return this")(),R=Array.prototype,L=Function.prototype,z=Object.prototype,W=y["__core-js_shared__"],J=(Pn=/[^.]+$/.exec(W&&W.keys&&W.keys.IE_PROTO||""))?"Symbol(src)_1."+Pn:"",ee=L.toString,ce=z.hasOwnProperty,ie=z.toString,U=RegExp("^"+ee.call(ce).replace(/[\\^$.*+?()[\]{}|]/g,"\\$&").replace(/hasOwnProperty|(function).*?(?=\\\()| for .+?(?=\\\])/g,"$1.*?")+"$"),se=R.splice,ge=Yt(y,"Map"),ae=Yt(Object,"create");function he(Pn){var Xn=-1,dr=Pn?Pn.length:0;for(this.clear();++Xn<dr;){var Qr=Pn[Xn];this.set(Qr[0],Qr[1])}}function Ve(Pn){var Xn=-1,dr=Pn?Pn.length:0;for(this.clear();++Xn<dr;){var Qr=Pn[Xn];this.set(Qr[0],Qr[1])}}function rt(Pn){var Xn=-1,dr=Pn?Pn.length:0;for(this.clear();++Xn<dr;){var Qr=Pn[Xn];this.set(Qr[0],Qr[1])}}function mt(Pn,Xn){for(var dr=Pn.length;dr--;)if(ur(Pn[dr][0],Xn))return dr;return-1}function St(Pn,Xn){var dr=Pn.__data__;return function Fn(Pn){var Xn=typeof Pn;return"string"==Xn||"number"==Xn||"symbol"==Xn||"boolean"==Xn?"__proto__"!==Pn:null===Pn}(Xn)?dr["string"==typeof Xn?"string":"hash"]:dr.map}function Yt(Pn,Xn){var dr=function T(Pn,Xn){return null==Pn?void 0:Pn[Xn]}(Pn,Xn);return function Nt(Pn){if(!Br(Pn)||function pr(Pn){return!!J&&J in Pn}(Pn))return!1;var Xn=function $r(Pn){var Xn=Br(Pn)?ie.call(Pn):"";return"[object Function]"==Xn||"[object GeneratorFunction]"==Xn}(Pn)||function C(Pn){var Xn=!1;if(null!=Pn&&"function"!=typeof Pn.toString)try{Xn=!!(Pn+"")}catch(dr){}return Xn}(Pn)?U:c;return Xn.test(function Ei(Pn){if(null!=Pn){try{return ee.call(Pn)}catch(Xn){}try{return Pn+""}catch(Xn){}}return""}(Pn))}(dr)?dr:void 0}function mi(Pn,Xn){if("function"!=typeof Pn||Xn&&"function"!=typeof Xn)throw new TypeError("Expected a function");var dr=function(){var Qr=arguments,Ci=Xn?Xn.apply(this,Qr):Qr[0],_i=dr.cache;if(_i.has(Ci))return _i.get(Ci);var so=Pn.apply(this,Qr);return dr.cache=_i.set(Ci,so),so};return dr.cache=new(mi.Cache||rt),dr}function ur(Pn,Xn){return Pn===Xn||Pn!=Pn&&Xn!=Xn}function Br(Pn){var Xn=typeof Pn;return!!Pn&&("object"==Xn||"function"==Xn)}he.prototype.clear=function be(){this.__data__=ae?ae(null):{}},he.prototype.delete=function we(Pn){return this.has(Pn)&&delete this.__data__[Pn]},he.prototype.get=function ue(Pn){var Xn=this.__data__;if(ae){var dr=Xn[Pn];return dr===i?void 0:dr}return ce.call(Xn,Pn)?Xn[Pn]:void 0},he.prototype.has=function st(Pn){var Xn=this.__data__;return ae?void 0!==Xn[Pn]:ce.call(Xn,Pn)},he.prototype.set=function We(Pn,Xn){return this.__data__[Pn]=ae&&void 0===Xn?i:Xn,this},Ve.prototype.clear=function Be(){this.__data__=[]},Ve.prototype.delete=function xe(Pn){var Xn=this.__data__,dr=mt(Xn,Pn);return!(dr<0||(dr==Xn.length-1?Xn.pop():se.call(Xn,dr,1),0))},Ve.prototype.get=function je(Pn){var Xn=this.__data__,dr=mt(Xn,Pn);return dr<0?void 0:Xn[dr][1]},Ve.prototype.has=function Ne(Pn){return mt(this.__data__,Pn)>-1},Ve.prototype.set=function Bt(Pn,Xn){var dr=this.__data__,Qr=mt(dr,Pn);return Qr<0?dr.push([Pn,Xn]):dr[Qr][1]=Xn,this},rt.prototype.clear=function en(){this.__data__={hash:new he,map:new(ge||Ve),string:new he}},rt.prototype.delete=function Pt(Pn){return St(this,Pn).delete(Pn)},rt.prototype.get=function Vt(Pn){return St(this,Pn).get(Pn)},rt.prototype.has=function hn(Pn){return St(this,Pn).has(Pn)},rt.prototype.set=function vn(Pn,Xn){return St(this,Pn).set(Pn,Xn),this},mi.Cache=rt,m.exports=mi},6123:m=>{var S="Expected a function",a=/^\s+|\s+$/g,f=/^[-+]0x[0-9a-f]+$/i,c=/^0b[01]+$/i,e=/^0o[0-7]+$/i,p=parseInt,y="object"==typeof global&&global&&global.Object===Object&&global,T="object"==typeof self&&self&&self.Object===Object&&self,C=y||T||Function("return this")(),L=Object.prototype.toString,z=Math.max,W=Math.min,J=function(){return C.Date.now()};function ie(ae){var he=typeof ae;return!!ae&&("object"==he||"function"==he)}function ge(ae){if("number"==typeof ae)return ae;if(function se(ae){return"symbol"==typeof ae||function U(ae){return!!ae&&"object"==typeof ae}(ae)&&"[object Symbol]"==L.call(ae)}(ae))return NaN;if(ie(ae)){var he="function"==typeof ae.valueOf?ae.valueOf():ae;ae=ie(he)?he+"":he}if("string"!=typeof ae)return 0===ae?ae:+ae;ae=ae.replace(a,"");var be=c.test(ae);return be||e.test(ae)?p(ae.slice(2),be?2:8):f.test(ae)?NaN:+ae}m.exports=function ce(ae,he,be){var we=!0,ue=!0;if("function"!=typeof ae)throw new TypeError(S);return ie(be)&&(we="leading"in be?!!be.leading:we,ue="trailing"in be?!!be.trailing:ue),function ee(ae,he,be){var we,ue,st,We,Ve,Be,xe=0,je=!1,Ne=!1,Bt=!0;if("function"!=typeof ae)throw new TypeError(S);function rt(Yt){var Fn=we,pr=ue;return we=ue=void 0,xe=Yt,We=ae.apply(pr,Fn)}function en(Yt){return xe=Yt,Ve=setTimeout(hn,he),je?rt(Yt):We}function Vt(Yt){var Fn=Yt-Be;return void 0===Be||Fn>=he||Fn<0||Ne&&Yt-xe>=st}function hn(){var Yt=J();if(Vt(Yt))return vn(Yt);Ve=setTimeout(hn,function Pt(Yt){var Ei=he-(Yt-Be);return Ne?W(Ei,st-(Yt-xe)):Ei}(Yt))}function vn(Yt){return Ve=void 0,Bt&&we?rt(Yt):(we=ue=void 0,We)}function St(){var Yt=J(),Fn=Vt(Yt);if(we=arguments,ue=this,Be=Yt,Fn){if(void 0===Ve)return en(Be);if(Ne)return Ve=setTimeout(hn,he),rt(Be)}return void 0===Ve&&(Ve=setTimeout(hn,he)),We}return he=ge(he)||0,ie(be)&&(je=!!be.leading,st=(Ne="maxWait"in be)?z(ge(be.maxWait)||0,he):st,Bt="trailing"in be?!!be.trailing:Bt),St.cancel=function mt(){void 0!==Ve&&clearTimeout(Ve),xe=0,we=Be=ue=Ve=void 0},St.flush=function Nt(){return void 0===Ve?We:vn(J())},St}(ae,he,{leading:we,maxWait:he,trailing:ue})}},81235:(m,S,i)=>{var f=i(4153)(i(27038),"DataView");m.exports=f},41505:(m,S,i)=>{var r=i(59410),a=i(21143),f=i(604),c=i(80584),e=i(7792);function p(y){var T=-1,C=null==y?0:y.length;for(this.clear();++T<C;){var R=y[T];this.set(R[0],R[1])}}p.prototype.clear=r,p.prototype.delete=a,p.prototype.get=f,p.prototype.has=c,p.prototype.set=e,m.exports=p},73545:(m,S,i)=>{var r=i(63391),a=i(68971),f=i(18858),c=i(13913),e=i(68944);function p(y){var T=-1,C=null==y?0:y.length;for(this.clear();++T<C;){var R=y[T];this.set(R[0],R[1])}}p.prototype.clear=r,p.prototype.delete=a,p.prototype.get=f,p.prototype.has=c,p.prototype.set=e,m.exports=p},39046:(m,S,i)=>{var f=i(4153)(i(27038),"Map");m.exports=f},93177:(m,S,i)=>{var r=i(70536),a=i(61502),f=i(94960),c=i(61539),e=i(34138);function p(y){var T=-1,C=null==y?0:y.length;for(this.clear();++T<C;){var R=y[T];this.set(R[0],R[1])}}p.prototype.clear=r,p.prototype.delete=a,p.prototype.get=f,p.prototype.has=c,p.prototype.set=e,m.exports=p},97129:(m,S,i)=>{var f=i(4153)(i(27038),"Promise");m.exports=f},74918:(m,S,i)=>{var f=i(4153)(i(27038),"Set");m.exports=f},48690:(m,S,i)=>{var r=i(93177),a=i(30365),f=i(58235);function c(e){var p=-1,y=null==e?0:e.length;for(this.__data__=new r;++p<y;)this.add(e[p])}c.prototype.add=c.prototype.push=a,c.prototype.has=f,m.exports=c},33667:(m,S,i)=>{var r=i(73545),a=i(18034),f=i(37238),c=i(75887),e=i(81450),p=i(61386);function y(T){var C=this.__data__=new r(T);this.size=C.size}y.prototype.clear=a,y.prototype.delete=f,y.prototype.get=c,y.prototype.has=e,y.prototype.set=p,m.exports=y},57333:(m,S,i)=>{var r=i(27038);m.exports=r.Symbol},96820:(m,S,i)=>{var r=i(27038);m.exports=r.Uint8Array},54203:(m,S,i)=>{var f=i(4153)(i(27038),"WeakMap");m.exports=f},81638:m=>{m.exports=function S(i,r,a){switch(a.length){case 0:return i.call(r);case 1:return i.call(r,a[0]);case 2:return i.call(r,a[0],a[1]);case 3:return i.call(r,a[0],a[1],a[2])}return i.apply(r,a)}},4500:m=>{m.exports=function S(i,r){for(var a=-1,f=null==i?0:i.length;++a<f&&!1!==r(i[a],a,i););return i}},11375:m=>{m.exports=function S(i,r){for(var a=-1,f=null==i?0:i.length,c=0,e=[];++a<f;){var p=i[a];r(p,a,i)&&(e[c++]=p)}return e}},71890:(m,S,i)=>{var r=i(48282),a=i(2952),f=i(81690),c=i(84444),e=i(20968),p=i(47679),T=Object.prototype.hasOwnProperty;m.exports=function C(R,L){var z=f(R),W=!z&&a(R),J=!z&&!W&&c(R),ee=!z&&!W&&!J&&p(R),ce=z||W||J||ee,ie=ce?r(R.length,String):[],U=ie.length;for(var se in R)(L||T.call(R,se))&&(!ce||!("length"==se||J&&("offset"==se||"parent"==se)||ee&&("buffer"==se||"byteLength"==se||"byteOffset"==se)||e(se,U)))&&ie.push(se);return ie}},14992:m=>{m.exports=function S(i,r){for(var a=-1,f=null==i?0:i.length,c=Array(f);++a<f;)c[a]=r(i[a],a,i);return c}},94165:m=>{m.exports=function S(i,r){for(var a=-1,f=r.length,c=i.length;++a<f;)i[c+a]=r[a];return i}},89731:m=>{m.exports=function S(i,r,a,f){var c=-1,e=null==i?0:i.length;for(f&&e&&(a=i[++c]);++c<e;)a=r(a,i[c],c,i);return a}},8141:m=>{m.exports=function S(i,r){for(var a=-1,f=null==i?0:i.length;++a<f;)if(r(i[a],a,i))return!0;return!1}},87280:m=>{m.exports=function S(i){return i.split("")}},54561:m=>{var S=/[^\x00-\x2f\x3a-\x40\x5b-\x60\x7b-\x7f]+/g;m.exports=function i(r){return r.match(S)||[]}},63530:(m,S,i)=>{var r=i(92007),a=i(71166);m.exports=function f(c,e,p){(void 0!==p&&!a(c[e],p)||void 0===p&&!(e in c))&&r(c,e,p)}},23898:(m,S,i)=>{var r=i(92007),a=i(71166),c=Object.prototype.hasOwnProperty;m.exports=function e(p,y,T){var C=p[y];(!c.call(p,y)||!a(C,T)||void 0===T&&!(y in p))&&r(p,y,T)}},15758:(m,S,i)=>{var r=i(71166);m.exports=function a(f,c){for(var e=f.length;e--;)if(r(f[e][0],c))return e;return-1}},22067:(m,S,i)=>{var r=i(11694),a=i(59108);m.exports=function f(c,e){return c&&r(e,a(e),c)}},57836:(m,S,i)=>{var r=i(11694),a=i(42970);m.exports=function f(c,e){return c&&r(e,a(e),c)}},92007:(m,S,i)=>{var r=i(20395);m.exports=function a(f,c,e){"__proto__"==c&&r?r(f,c,{configurable:!0,enumerable:!0,value:e,writable:!0}):f[c]=e}},77007:(m,S,i)=>{var r=i(33667),a=i(4500),f=i(23898),c=i(22067),e=i(57836),p=i(50694),y=i(53595),T=i(14746),C=i(78857),R=i(58605),L=i(51675),z=i(26663),W=i(62963),J=i(32143),ee=i(31563),ce=i(81690),ie=i(84444),U=i(32e3),se=i(53867),ge=i(48855),ae=i(59108),he=i(42970),st="[object Arguments]",je="[object Function]",en="[object Object]",Xn={};Xn[st]=Xn["[object Array]"]=Xn["[object ArrayBuffer]"]=Xn["[object DataView]"]=Xn["[object Boolean]"]=Xn["[object Date]"]=Xn["[object Float32Array]"]=Xn["[object Float64Array]"]=Xn["[object Int8Array]"]=Xn["[object Int16Array]"]=Xn["[object Int32Array]"]=Xn["[object Map]"]=Xn["[object Number]"]=Xn[en]=Xn["[object RegExp]"]=Xn["[object Set]"]=Xn["[object String]"]=Xn["[object Symbol]"]=Xn["[object Uint8Array]"]=Xn["[object Uint8ClampedArray]"]=Xn["[object Uint16Array]"]=Xn["[object Uint32Array]"]=!0,Xn["[object Error]"]=Xn[je]=Xn["[object WeakMap]"]=!1,m.exports=function dr(Qr,Ci,_i,so,Ro,Sr){var Kt,un=1&Ci,jn=2&Ci,Jn=4&Ci;if(_i&&(Kt=Ro?_i(Qr,so,Ro,Sr):_i(Qr)),void 0!==Kt)return Kt;if(!se(Qr))return Qr;var Gn=ce(Qr);if(Gn){if(Kt=W(Qr),!un)return y(Qr,Kt)}else{var Xr=z(Qr),Zi=Xr==je||"[object GeneratorFunction]"==Xr;if(ie(Qr))return p(Qr,un);if(Xr==en||Xr==st||Zi&&!Ro){if(Kt=jn||Zi?{}:ee(Qr),!un)return jn?C(Qr,e(Kt,Qr)):T(Qr,c(Kt,Qr))}else{if(!Xn[Xr])return Ro?Qr:{};Kt=J(Qr,Xr,un)}}Sr||(Sr=new r);var ii=Sr.get(Qr);if(ii)return ii;Sr.set(Qr,Kt),ge(Qr)?Qr.forEach(function(ln){Kt.add(dr(ln,Ci,_i,ln,Qr,Sr))}):U(Qr)&&Qr.forEach(function(ln,Mn){Kt.set(Mn,dr(ln,Ci,_i,Mn,Qr,Sr))});var Ki=Gn?void 0:(Jn?jn?L:R:jn?he:ae)(Qr);return a(Ki||Qr,function(ln,Mn){Ki&&(ln=Qr[Mn=ln]),f(Kt,Mn,dr(ln,Ci,_i,Mn,Qr,Sr))}),Kt}},60920:(m,S,i)=>{var r=i(53867),a=Object.create,f=function(){function c(){}return function(e){if(!r(e))return{};if(a)return a(e);c.prototype=e;var p=new c;return c.prototype=void 0,p}}();m.exports=f},59026:(m,S,i)=>{var r=i(18022),f=i(99889)(r);m.exports=f},12229:m=>{m.exports=function S(i,r,a,f){for(var c=i.length,e=a+(f?1:-1);f?e--:++e<c;)if(r(i[e],e,i))return e;return-1}},56369:(m,S,i)=>{var r=i(94165),a=i(21006);m.exports=function f(c,e,p,y,T){var C=-1,R=c.length;for(p||(p=a),T||(T=[]);++C<R;){var L=c[C];e>0&&p(L)?e>1?f(L,e-1,p,y,T):r(T,L):y||(T[T.length]=L)}return T}},75290:(m,S,i)=>{var a=i(8269)();m.exports=a},18022:(m,S,i)=>{var r=i(75290),a=i(59108);m.exports=function f(c,e){return c&&r(c,e,a)}},93436:(m,S,i)=>{var r=i(64667),a=i(82773);m.exports=function f(c,e){for(var p=0,y=(e=r(e,c)).length;null!=c&&p<y;)c=c[a(e[p++])];return p&&p==y?c:void 0}},19215:(m,S,i)=>{var r=i(94165),a=i(81690);m.exports=function f(c,e,p){var y=e(c);return a(c)?y:r(y,p(c))}},72802:(m,S,i)=>{var r=i(57333),a=i(21613),f=i(81244),p=r?r.toStringTag:void 0;m.exports=function y(T){return null==T?void 0===T?"[object Undefined]":"[object Null]":p&&p in Object(T)?a(T):f(T)}},55333:m=>{m.exports=function S(i,r){return null!=i&&r in Object(i)}},77090:(m,S,i)=>{var r=i(72802),a=i(27503);m.exports=function c(e){return a(e)&&"[object Arguments]"==r(e)}},30696:(m,S,i)=>{var r=i(36863),a=i(27503);m.exports=function f(c,e,p,y,T){return c===e||(null==c||null==e||!a(c)&&!a(e)?c!=c&&e!=e:r(c,e,p,y,f,T))}},36863:(m,S,i)=>{var r=i(33667),a=i(27667),f=i(64630),c=i(70838),e=i(26663),p=i(81690),y=i(84444),T=i(47679),R="[object Arguments]",L="[object Array]",z="[object Object]",J=Object.prototype.hasOwnProperty;m.exports=function ee(ce,ie,U,se,ge,ae){var he=p(ce),be=p(ie),we=he?L:e(ce),ue=be?L:e(ie),st=(we=we==R?z:we)==z,We=(ue=ue==R?z:ue)==z,Ve=we==ue;if(Ve&&y(ce)){if(!y(ie))return!1;he=!0,st=!1}if(Ve&&!st)return ae||(ae=new r),he||T(ce)?a(ce,ie,U,se,ge,ae):f(ce,ie,we,U,se,ge,ae);if(!(1&U)){var Be=st&&J.call(ce,"__wrapped__"),xe=We&&J.call(ie,"__wrapped__");if(Be||xe){var je=Be?ce.value():ce,Ne=xe?ie.value():ie;return ae||(ae=new r),ge(je,Ne,U,se,ae)}}return!!Ve&&(ae||(ae=new r),c(ce,ie,U,se,ge,ae))}},63434:(m,S,i)=>{var r=i(26663),a=i(27503);m.exports=function c(e){return a(e)&&"[object Map]"==r(e)}},88783:(m,S,i)=>{var r=i(33667),a=i(30696);m.exports=function e(p,y,T,C){var R=T.length,L=R,z=!C;if(null==p)return!L;for(p=Object(p);R--;){var W=T[R];if(z&&W[2]?W[1]!==p[W[0]]:!(W[0]in p))return!1}for(;++R<L;){var J=(W=T[R])[0],ee=p[J],ce=W[1];if(z&&W[2]){if(void 0===ee&&!(J in p))return!1}else{var ie=new r;if(C)var U=C(ee,ce,J,p,y,ie);if(!(void 0===U?a(ce,ee,3,C,ie):U))return!1}}return!0}},43540:(m,S,i)=>{var r=i(55836),a=i(38466),f=i(53867),c=i(51217),p=/^\[object .+?Constructor\]$/,L=RegExp("^"+Function.prototype.toString.call(Object.prototype.hasOwnProperty).replace(/[\\^$.*+?()[\]{}|]/g,"\\$&").replace(/hasOwnProperty|(function).*?(?=\\\()| for .+?(?=\\\])/g,"$1.*?")+"$");m.exports=function z(W){return!(!f(W)||a(W))&&(r(W)?L:p).test(c(W))}},67495:(m,S,i)=>{var r=i(26663),a=i(27503);m.exports=function c(e){return a(e)&&"[object Set]"==r(e)}},99390:(m,S,i)=>{var r=i(72802),a=i(8613),f=i(27503),Ve={};Ve["[object Float32Array]"]=Ve["[object Float64Array]"]=Ve["[object Int8Array]"]=Ve["[object Int16Array]"]=Ve["[object Int32Array]"]=Ve["[object Uint8Array]"]=Ve["[object Uint8ClampedArray]"]=Ve["[object Uint16Array]"]=Ve["[object Uint32Array]"]=!0,Ve["[object Arguments]"]=Ve["[object Array]"]=Ve["[object ArrayBuffer]"]=Ve["[object Boolean]"]=Ve["[object DataView]"]=Ve["[object Date]"]=Ve["[object Error]"]=Ve["[object Function]"]=Ve["[object Map]"]=Ve["[object Number]"]=Ve["[object Object]"]=Ve["[object RegExp]"]=Ve["[object Set]"]=Ve["[object String]"]=Ve["[object WeakMap]"]=!1,m.exports=function Be(xe){return f(xe)&&a(xe.length)&&!!Ve[r(xe)]}},5245:(m,S,i)=>{var r=i(69433),a=i(68608),f=i(80290),c=i(81690),e=i(63354);m.exports=function p(y){return"function"==typeof y?y:null==y?f:"object"==typeof y?c(y)?a(y[0],y[1]):r(y):e(y)}},92488:(m,S,i)=>{var r=i(58845),a=i(36700),c=Object.prototype.hasOwnProperty;m.exports=function e(p){if(!r(p))return a(p);var y=[];for(var T in Object(p))c.call(p,T)&&"constructor"!=T&&y.push(T);return y}},50762:(m,S,i)=>{var r=i(53867),a=i(58845),f=i(25618),e=Object.prototype.hasOwnProperty;m.exports=function p(y){if(!r(y))return f(y);var T=a(y),C=[];for(var R in y)"constructor"==R&&(T||!e.call(y,R))||C.push(R);return C}},69433:(m,S,i)=>{var r=i(88783),a=i(48834),f=i(63587);m.exports=function c(e){var p=a(e);return 1==p.length&&p[0][2]?f(p[0][0],p[0][1]):function(y){return y===e||r(y,e,p)}}},68608:(m,S,i)=>{var r=i(30696),a=i(58102),f=i(18303),c=i(99743),e=i(45774),p=i(63587),y=i(82773);m.exports=function R(L,z){return c(L)&&e(z)?p(y(L),z):function(W){var J=a(W,L);return void 0===J&&J===z?f(W,L):r(z,J,3)}}},9085:(m,S,i)=>{var r=i(33667),a=i(63530),f=i(75290),c=i(23607),e=i(53867),p=i(42970),y=i(45959);m.exports=function T(C,R,L,z,W){C!==R&&f(R,function(J,ee){if(W||(W=new r),e(J))c(C,R,ee,L,T,z,W);else{var ce=z?z(y(C,ee),J,ee+"",C,R,W):void 0;void 0===ce&&(ce=J),a(C,ee,ce)}},p)}},23607:(m,S,i)=>{var r=i(63530),a=i(50694),f=i(96282),c=i(53595),e=i(31563),p=i(2952),y=i(81690),T=i(82027),C=i(84444),R=i(55836),L=i(53867),z=i(82358),W=i(47679),J=i(45959),ee=i(31413);m.exports=function ce(ie,U,se,ge,ae,he,be){var we=J(ie,se),ue=J(U,se),st=be.get(ue);if(st)r(ie,se,st);else{var We=he?he(we,ue,se+"",ie,U,be):void 0,Ve=void 0===We;if(Ve){var Be=y(ue),xe=!Be&&C(ue),je=!Be&&!xe&&W(ue);We=ue,Be||xe||je?y(we)?We=we:T(we)?We=c(we):xe?(Ve=!1,We=a(ue,!0)):je?(Ve=!1,We=f(ue,!0)):We=[]:z(ue)||p(ue)?(We=we,p(we)?We=ee(we):(!L(we)||R(we))&&(We=e(ue))):Ve=!1}Ve&&(be.set(ue,We),ae(We,ue,ge,he,be),be.delete(ue)),r(ie,se,We)}}},68840:m=>{m.exports=function S(i){return function(r){return null==r?void 0:r[i]}}},59866:(m,S,i)=>{var r=i(93436);m.exports=function a(f){return function(c){return r(c,f)}}},17421:m=>{m.exports=function S(i){return function(r){return null==i?void 0:i[r]}}},85105:m=>{m.exports=function S(i,r,a,f,c){return c(i,function(e,p,y){a=f?(f=!1,e):r(a,e,p,y)}),a}},84441:(m,S,i)=>{var r=i(80290),a=i(15529),f=i(39009);m.exports=function c(e,p){return f(a(e,p,r),e+"")}},32773:(m,S,i)=>{var r=i(23898),a=i(64667),f=i(20968),c=i(53867),e=i(82773);m.exports=function p(y,T,C,R){if(!c(y))return y;for(var L=-1,z=(T=a(T,y)).length,W=z-1,J=y;null!=J&&++L<z;){var ee=e(T[L]),ce=C;if("__proto__"===ee||"constructor"===ee||"prototype"===ee)return y;if(L!=W){var ie=J[ee];void 0===(ce=R?R(ie,ee,J):void 0)&&(ce=c(ie)?ie:f(T[L+1])?[]:{})}r(J,ee,ce),J=J[ee]}return y}},99372:(m,S,i)=>{var r=i(45654),a=i(20395),f=i(80290);m.exports=a?function(e,p){return a(e,"toString",{configurable:!0,enumerable:!1,value:r(p),writable:!0})}:f},63586:m=>{m.exports=function S(i,r,a){var f=-1,c=i.length;r<0&&(r=-r>c?0:c+r),(a=a>c?c:a)<0&&(a+=c),c=r>a?0:a-r>>>0,r>>>=0;for(var e=Array(c);++f<c;)e[f]=i[f+r];return e}},37834:(m,S,i)=>{var r=i(59026);m.exports=function a(f,c){var e;return r(f,function(p,y,T){return!(e=c(p,y,T))}),!!e}},48282:m=>{m.exports=function S(i,r){for(var a=-1,f=Array(i);++a<i;)f[a]=r(a);return f}},68166:(m,S,i)=>{var r=i(57333),a=i(14992),f=i(81690),c=i(7786),p=r?r.prototype:void 0,y=p?p.toString:void 0;m.exports=function T(C){if("string"==typeof C)return C;if(f(C))return a(C,T)+"";if(c(C))return y?y.call(C):"";var R=C+"";return"0"==R&&1/C==-1/0?"-0":R}},13743:(m,S,i)=>{var r=i(87478),a=/^\s+/;m.exports=function f(c){return c&&c.slice(0,r(c)+1).replace(a,"")}},70544:m=>{m.exports=function S(i){return function(r){return i(r)}}},72064:(m,S,i)=>{var r=i(64667),a=i(27842),f=i(61746),c=i(82773);m.exports=function e(p,y){return y=r(y,p),null==(p=f(p,y))||delete p[c(a(y))]}},25687:m=>{m.exports=function S(i,r,a){for(var f=-1,c=i.length,e=r.length,p={};++f<c;)a(p,i[f],f<e?r[f]:void 0);return p}},13747:m=>{m.exports=function S(i,r){return i.has(r)}},64667:(m,S,i)=>{var r=i(81690),a=i(99743),f=i(89775),c=i(41233);m.exports=function e(p,y){return r(p)?p:a(p,y)?[p]:f(c(p))}},26477:(m,S,i)=>{var r=i(63586);m.exports=function a(f,c,e){var p=f.length;return e=void 0===e?p:e,!c&&e>=p?f:r(f,c,e)}},88461:(m,S,i)=>{var r=i(96820);m.exports=function a(f){var c=new f.constructor(f.byteLength);return new r(c).set(new r(f)),c}},50694:(m,S,i)=>{m=i.nmd(m);var r=i(27038),a=S&&!S.nodeType&&S,f=a&&m&&!m.nodeType&&m,e=f&&f.exports===a?r.Buffer:void 0,p=e?e.allocUnsafe:void 0;m.exports=function y(T,C){if(C)return T.slice();var R=T.length,L=p?p(R):new T.constructor(R);return T.copy(L),L}},59757:(m,S,i)=>{var r=i(88461);m.exports=function a(f,c){var e=c?r(f.buffer):f.buffer;return new f.constructor(e,f.byteOffset,f.byteLength)}},83615:m=>{var S=/\w*$/;m.exports=function i(r){var a=new r.constructor(r.source,S.exec(r));return a.lastIndex=r.lastIndex,a}},42282:(m,S,i)=>{var r=i(57333),a=r?r.prototype:void 0,f=a?a.valueOf:void 0;m.exports=function c(e){return f?Object(f.call(e)):{}}},96282:(m,S,i)=>{var r=i(88461);m.exports=function a(f,c){var e=c?r(f.buffer):f.buffer;return new f.constructor(e,f.byteOffset,f.length)}},53595:m=>{m.exports=function S(i,r){var a=-1,f=i.length;for(r||(r=Array(f));++a<f;)r[a]=i[a];return r}},11694:(m,S,i)=>{var r=i(23898),a=i(92007);m.exports=function f(c,e,p,y){var T=!p;p||(p={});for(var C=-1,R=e.length;++C<R;){var L=e[C],z=y?y(p[L],c[L],L,p,c):void 0;void 0===z&&(z=c[L]),T?a(p,L,z):r(p,L,z)}return p}},14746:(m,S,i)=>{var r=i(11694),a=i(10296);m.exports=function f(c,e){return r(c,a(c),e)}},78857:(m,S,i)=>{var r=i(11694),a=i(29572);m.exports=function f(c,e){return r(c,a(c),e)}},93412:(m,S,i)=>{var r=i(27038);m.exports=r["__core-js_shared__"]},30906:(m,S,i)=>{var r=i(84441),a=i(71100);m.exports=function f(c){return r(function(e,p){var y=-1,T=p.length,C=T>1?p[T-1]:void 0,R=T>2?p[2]:void 0;for(C=c.length>3&&"function"==typeof C?(T--,C):void 0,R&&a(p[0],p[1],R)&&(C=T<3?void 0:C,T=1),e=Object(e);++y<T;){var L=p[y];L&&c(e,L,y,C)}return e})}},99889:(m,S,i)=>{var r=i(93406);m.exports=function a(f,c){return function(e,p){if(null==e)return e;if(!r(e))return f(e,p);for(var y=e.length,T=c?y:-1,C=Object(e);(c?T--:++T<y)&&!1!==p(C[T],T,C););return e}}},8269:m=>{m.exports=function S(i){return function(r,a,f){for(var c=-1,e=Object(r),p=f(r),y=p.length;y--;){var T=p[i?y:++c];if(!1===a(e[T],T,e))break}return r}}},66803:(m,S,i)=>{var r=i(26477),a=i(407),f=i(2150),c=i(41233);m.exports=function e(p){return function(y){y=c(y);var T=a(y)?f(y):void 0,C=T?T[0]:y.charAt(0),R=T?r(T,1).join(""):y.slice(1);return C[p]()+R}}},17407:(m,S,i)=>{var r=i(89731),a=i(75289),f=i(96590),e=RegExp("['\u2019]","g");m.exports=function p(y){return function(T){return r(f(a(T).replace(e,"")),y,"")}}},44674:(m,S,i)=>{var r=i(5245),a=i(93406),f=i(59108);m.exports=function c(e){return function(p,y,T){var C=Object(p);if(!a(p)){var R=r(y,3);p=f(p),y=function(z){return R(C[z],z,C)}}var L=e(p,y,T);return L>-1?C[R?p[L]:L]:void 0}}},925:(m,S,i)=>{var r=i(82358);m.exports=function a(f){return r(f)?void 0:f}},4068:(m,S,i)=>{var f=i(17421)({\u00c0:"A",\u00c1:"A",\u00c2:"A",\u00c3:"A",\u00c4:"A",\u00c5:"A",\u00e0:"a",\u00e1:"a",\u00e2:"a",\u00e3:"a",\u00e4:"a",\u00e5:"a",\u00c7:"C",\u00e7:"c",\u00d0:"D",\u00f0:"d",\u00c8:"E",\u00c9:"E",\u00ca:"E",\u00cb:"E",\u00e8:"e",\u00e9:"e",\u00ea:"e",\u00eb:"e",\u00cc:"I",\u00cd:"I",\u00ce:"I",\u00cf:"I",\u00ec:"i",\u00ed:"i",\u00ee:"i",\u00ef:"i",\u00d1:"N",\u00f1:"n",\u00d2:"O",\u00d3:"O",\u00d4:"O",\u00d5:"O",\u00d6:"O",\u00d8:"O",\u00f2:"o",\u00f3:"o",\u00f4:"o",\u00f5:"o",\u00f6:"o",\u00f8:"o",\u00d9:"U",\u00da:"U",\u00db:"U",\u00dc:"U",\u00f9:"u",\u00fa:"u",\u00fb:"u",\u00fc:"u",\u00dd:"Y",\u00fd:"y",\u00ff:"y",\u00c6:"Ae",\u00e6:"ae",\u00de:"Th",\u00fe:"th",\u00df:"ss",\u0100:"A",\u0102:"A",\u0104:"A",\u0101:"a",\u0103:"a",\u0105:"a",\u0106:"C",\u0108:"C",\u010a:"C",\u010c:"C",\u0107:"c",\u0109:"c",\u010b:"c",\u010d:"c",\u010e:"D",\u0110:"D",\u010f:"d",\u0111:"d",\u0112:"E",\u0114:"E",\u0116:"E",\u0118:"E",\u011a:"E",\u0113:"e",\u0115:"e",\u0117:"e",\u0119:"e",\u011b:"e",\u011c:"G",\u011e:"G",\u0120:"G",\u0122:"G",\u011d:"g",\u011f:"g",\u0121:"g",\u0123:"g",\u0124:"H",\u0126:"H",\u0125:"h",\u0127:"h",\u0128:"I",\u012a:"I",\u012c:"I",\u012e:"I",\u0130:"I",\u0129:"i",\u012b:"i",\u012d:"i",\u012f:"i",\u0131:"i",\u0134:"J",\u0135:"j",\u0136:"K",\u0137:"k",\u0138:"k",\u0139:"L",\u013b:"L",\u013d:"L",\u013f:"L",\u0141:"L",\u013a:"l",\u013c:"l",\u013e:"l",\u0140:"l",\u0142:"l",\u0143:"N",\u0145:"N",\u0147:"N",\u014a:"N",\u0144:"n",\u0146:"n",\u0148:"n",\u014b:"n",\u014c:"O",\u014e:"O",\u0150:"O",\u014d:"o",\u014f:"o",\u0151:"o",\u0154:"R",\u0156:"R",\u0158:"R",\u0155:"r",\u0157:"r",\u0159:"r",\u015a:"S",\u015c:"S",\u015e:"S",\u0160:"S",\u015b:"s",\u015d:"s",\u015f:"s",\u0161:"s",\u0162:"T",\u0164:"T",\u0166:"T",\u0163:"t",\u0165:"t",\u0167:"t",\u0168:"U",\u016a:"U",\u016c:"U",\u016e:"U",\u0170:"U",\u0172:"U",\u0169:"u",\u016b:"u",\u016d:"u",\u016f:"u",\u0171:"u",\u0173:"u",\u0174:"W",\u0175:"w",\u0176:"Y",\u0177:"y",\u0178:"Y",\u0179:"Z",\u017b:"Z",\u017d:"Z",\u017a:"z",\u017c:"z",\u017e:"z",\u0132:"IJ",\u0133:"ij",\u0152:"Oe",\u0153:"oe",\u0149:"'n",\u017f:"s"});m.exports=f},20395:(m,S,i)=>{var r=i(4153),a=function(){try{var f=r(Object,"defineProperty");return f({},"",{}),f}catch(c){}}();m.exports=a},27667:(m,S,i)=>{var r=i(48690),a=i(8141),f=i(13747);m.exports=function p(y,T,C,R,L,z){var W=1&C,J=y.length,ee=T.length;if(J!=ee&&!(W&&ee>J))return!1;var ce=z.get(y),ie=z.get(T);if(ce&&ie)return ce==T&&ie==y;var U=-1,se=!0,ge=2&C?new r:void 0;for(z.set(y,T),z.set(T,y);++U<J;){var ae=y[U],he=T[U];if(R)var be=W?R(he,ae,U,T,y,z):R(ae,he,U,y,T,z);if(void 0!==be){if(be)continue;se=!1;break}if(ge){if(!a(T,function(we,ue){if(!f(ge,ue)&&(ae===we||L(ae,we,C,R,z)))return ge.push(ue)})){se=!1;break}}else if(ae!==he&&!L(ae,he,C,R,z)){se=!1;break}}return z.delete(y),z.delete(T),se}},64630:(m,S,i)=>{var r=i(57333),a=i(96820),f=i(71166),c=i(27667),e=i(37461),p=i(57673),ge=r?r.prototype:void 0,ae=ge?ge.valueOf:void 0;m.exports=function he(be,we,ue,st,We,Ve,Be){switch(ue){case"[object DataView]":if(be.byteLength!=we.byteLength||be.byteOffset!=we.byteOffset)return!1;be=be.buffer,we=we.buffer;case"[object ArrayBuffer]":return!(be.byteLength!=we.byteLength||!Ve(new a(be),new a(we)));case"[object Boolean]":case"[object Date]":case"[object Number]":return f(+be,+we);case"[object Error]":return be.name==we.name&&be.message==we.message;case"[object RegExp]":case"[object String]":return be==we+"";case"[object Map]":var xe=e;case"[object Set]":if(xe||(xe=p),be.size!=we.size&&!(1&st))return!1;var Ne=Be.get(be);if(Ne)return Ne==we;st|=2,Be.set(be,we);var Bt=c(xe(be),xe(we),st,We,Ve,Be);return Be.delete(be),Bt;case"[object Symbol]":if(ae)return ae.call(be)==ae.call(we)}return!1}},70838:(m,S,i)=>{var r=i(58605),c=Object.prototype.hasOwnProperty;m.exports=function e(p,y,T,C,R,L){var z=1&T,W=r(p),J=W.length;if(J!=r(y).length&&!z)return!1;for(var ie=J;ie--;){var U=W[ie];if(!(z?U in y:c.call(y,U)))return!1}var se=L.get(p),ge=L.get(y);if(se&&ge)return se==y&&ge==p;var ae=!0;L.set(p,y),L.set(y,p);for(var he=z;++ie<J;){var be=p[U=W[ie]],we=y[U];if(C)var ue=z?C(we,be,U,y,p,L):C(be,we,U,p,y,L);if(!(void 0===ue?be===we||R(be,we,T,C,L):ue)){ae=!1;break}he||(he="constructor"==U)}if(ae&&!he){var st=p.constructor,We=y.constructor;st!=We&&"constructor"in p&&"constructor"in y&&!("function"==typeof st&&st instanceof st&&"function"==typeof We&&We instanceof We)&&(ae=!1)}return L.delete(p),L.delete(y),ae}},10058:(m,S,i)=>{var r=i(94694),a=i(15529),f=i(39009);m.exports=function c(e){return f(a(e,void 0,r),e+"")}},61138:m=>{var S="object"==typeof global&&global&&global.Object===Object&&global;m.exports=S},58605:(m,S,i)=>{var r=i(19215),a=i(10296),f=i(59108);m.exports=function c(e){return r(e,f,a)}},51675:(m,S,i)=>{var r=i(19215),a=i(29572),f=i(42970);m.exports=function c(e){return r(e,f,a)}},85556:(m,S,i)=>{var r=i(36586);m.exports=function a(f,c){var e=f.__data__;return r(c)?e["string"==typeof c?"string":"hash"]:e.map}},48834:(m,S,i)=>{var r=i(45774),a=i(59108);m.exports=function f(c){for(var e=a(c),p=e.length;p--;){var y=e[p],T=c[y];e[p]=[y,T,r(T)]}return e}},4153:(m,S,i)=>{var r=i(43540),a=i(36825);m.exports=function f(c,e){var p=a(c,e);return r(p)?p:void 0}},52398:(m,S,i)=>{var a=i(93332)(Object.getPrototypeOf,Object);m.exports=a},21613:(m,S,i)=>{var r=i(57333),a=Object.prototype,f=a.hasOwnProperty,c=a.toString,e=r?r.toStringTag:void 0;m.exports=function p(y){var T=f.call(y,e),C=y[e];try{y[e]=void 0;var R=!0}catch(z){}var L=c.call(y);return R&&(T?y[e]=C:delete y[e]),L}},10296:(m,S,i)=>{var r=i(11375),a=i(65336),c=Object.prototype.propertyIsEnumerable,e=Object.getOwnPropertySymbols;m.exports=e?function(y){return null==y?[]:(y=Object(y),r(e(y),function(T){return c.call(y,T)}))}:a},29572:(m,S,i)=>{var r=i(94165),a=i(52398),f=i(10296),c=i(65336);m.exports=Object.getOwnPropertySymbols?function(y){for(var T=[];y;)r(T,f(y)),y=a(y);return T}:c},26663:(m,S,i)=>{var r=i(81235),a=i(39046),f=i(97129),c=i(74918),e=i(54203),p=i(72802),y=i(51217),T="[object Map]",R="[object Promise]",L="[object Set]",z="[object WeakMap]",W="[object DataView]",J=y(r),ee=y(a),ce=y(f),ie=y(c),U=y(e),se=p;(r&&se(new r(new ArrayBuffer(1)))!=W||a&&se(new a)!=T||f&&se(f.resolve())!=R||c&&se(new c)!=L||e&&se(new e)!=z)&&(se=function(ge){var ae=p(ge),he="[object Object]"==ae?ge.constructor:void 0,be=he?y(he):"";if(be)switch(be){case J:return W;case ee:return T;case ce:return R;case ie:return L;case U:return z}return ae}),m.exports=se},36825:m=>{m.exports=function S(i,r){return null==i?void 0:i[r]}},82138:(m,S,i)=>{var r=i(64667),a=i(2952),f=i(81690),c=i(20968),e=i(8613),p=i(82773);m.exports=function y(T,C,R){for(var L=-1,z=(C=r(C,T)).length,W=!1;++L<z;){var J=p(C[L]);if(!(W=null!=T&&R(T,J)))break;T=T[J]}return W||++L!=z?W:!!(z=null==T?0:T.length)&&e(z)&&c(J,z)&&(f(T)||a(T))}},407:m=>{var p=RegExp("[\\u200d\\ud800-\\udfff\\u0300-\\u036f\\ufe20-\\ufe2f\\u20d0-\\u20ff\\ufe0e\\ufe0f]");m.exports=function y(T){return p.test(T)}},59316:m=>{var S=/[a-z][A-Z]|[A-Z]{2}[a-z]|[0-9][a-zA-Z]|[a-zA-Z][0-9]|[^a-zA-Z0-9 ]/;m.exports=function i(r){return S.test(r)}},59410:(m,S,i)=>{var r=i(95969);m.exports=function a(){this.__data__=r?r(null):{},this.size=0}},21143:m=>{m.exports=function S(i){var r=this.has(i)&&delete this.__data__[i];return this.size-=r?1:0,r}},604:(m,S,i)=>{var r=i(95969),c=Object.prototype.hasOwnProperty;m.exports=function e(p){var y=this.__data__;if(r){var T=y[p];return"__lodash_hash_undefined__"===T?void 0:T}return c.call(y,p)?y[p]:void 0}},80584:(m,S,i)=>{var r=i(95969),f=Object.prototype.hasOwnProperty;m.exports=function c(e){var p=this.__data__;return r?void 0!==p[e]:f.call(p,e)}},7792:(m,S,i)=>{var r=i(95969);m.exports=function f(c,e){var p=this.__data__;return this.size+=this.has(c)?0:1,p[c]=r&&void 0===e?"__lodash_hash_undefined__":e,this}},62963:m=>{var i=Object.prototype.hasOwnProperty;m.exports=function r(a){var f=a.length,c=new a.constructor(f);return f&&"string"==typeof a[0]&&i.call(a,"index")&&(c.index=a.index,c.input=a.input),c}},32143:(m,S,i)=>{var r=i(88461),a=i(59757),f=i(83615),c=i(42282),e=i(96282);m.exports=function ue(st,We,Ve){var Be=st.constructor;switch(We){case"[object ArrayBuffer]":return r(st);case"[object Boolean]":case"[object Date]":return new Be(+st);case"[object DataView]":return a(st,Ve);case"[object Float32Array]":case"[object Float64Array]":case"[object Int8Array]":case"[object Int16Array]":case"[object Int32Array]":case"[object Uint8Array]":case"[object Uint8ClampedArray]":case"[object Uint16Array]":case"[object Uint32Array]":return e(st,Ve);case"[object Map]":case"[object Set]":return new Be;case"[object Number]":case"[object String]":return new Be(st);case"[object RegExp]":return f(st);case"[object Symbol]":return c(st)}}},31563:(m,S,i)=>{var r=i(60920),a=i(52398),f=i(58845);m.exports=function c(e){return"function"!=typeof e.constructor||f(e)?{}:r(a(e))}},21006:(m,S,i)=>{var r=i(57333),a=i(2952),f=i(81690),c=r?r.isConcatSpreadable:void 0;m.exports=function e(p){return f(p)||a(p)||!!(c&&p&&p[c])}},20968:m=>{var i=/^(?:0|[1-9]\d*)$/;m.exports=function r(a,f){var c=typeof a;return!!(f=null==f?9007199254740991:f)&&("number"==c||"symbol"!=c&&i.test(a))&&a>-1&&a%1==0&&a<f}},71100:(m,S,i)=>{var r=i(71166),a=i(93406),f=i(20968),c=i(53867);m.exports=function e(p,y,T){if(!c(T))return!1;var C=typeof y;return!!("number"==C?a(T)&&f(y,T.length):"string"==C&&y in T)&&r(T[y],p)}},99743:(m,S,i)=>{var r=i(81690),a=i(7786),f=/\.|\[(?:[^[\]]*|(["'])(?:(?!\1)[^\\]|\\.)*?\1)\]/,c=/^\w*$/;m.exports=function e(p,y){if(r(p))return!1;var T=typeof p;return!("number"!=T&&"symbol"!=T&&"boolean"!=T&&null!=p&&!a(p))||c.test(p)||!f.test(p)||null!=y&&p in Object(y)}},36586:m=>{m.exports=function S(i){var r=typeof i;return"string"==r||"number"==r||"symbol"==r||"boolean"==r?"__proto__"!==i:null===i}},38466:(m,S,i)=>{var c,r=i(93412),a=(c=/[^.]+$/.exec(r&&r.keys&&r.keys.IE_PROTO||""))?"Symbol(src)_1."+c:"";m.exports=function f(c){return!!a&&a in c}},58845:m=>{var S=Object.prototype;m.exports=function i(r){var a=r&&r.constructor;return r===("function"==typeof a&&a.prototype||S)}},45774:(m,S,i)=>{var r=i(53867);m.exports=function a(f){return f==f&&!r(f)}},63391:m=>{m.exports=function S(){this.__data__=[],this.size=0}},68971:(m,S,i)=>{var r=i(15758),f=Array.prototype.splice;m.exports=function c(e){var p=this.__data__,y=r(p,e);return!(y<0||(y==p.length-1?p.pop():f.call(p,y,1),--this.size,0))}},18858:(m,S,i)=>{var r=i(15758);m.exports=function a(f){var c=this.__data__,e=r(c,f);return e<0?void 0:c[e][1]}},13913:(m,S,i)=>{var r=i(15758);m.exports=function a(f){return r(this.__data__,f)>-1}},68944:(m,S,i)=>{var r=i(15758);m.exports=function a(f,c){var e=this.__data__,p=r(e,f);return p<0?(++this.size,e.push([f,c])):e[p][1]=c,this}},70536:(m,S,i)=>{var r=i(41505),a=i(73545),f=i(39046);m.exports=function c(){this.size=0,this.__data__={hash:new r,map:new(f||a),string:new r}}},61502:(m,S,i)=>{var r=i(85556);m.exports=function a(f){var c=r(this,f).delete(f);return this.size-=c?1:0,c}},94960:(m,S,i)=>{var r=i(85556);m.exports=function a(f){return r(this,f).get(f)}},61539:(m,S,i)=>{var r=i(85556);m.exports=function a(f){return r(this,f).has(f)}},34138:(m,S,i)=>{var r=i(85556);m.exports=function a(f,c){var e=r(this,f),p=e.size;return e.set(f,c),this.size+=e.size==p?0:1,this}},37461:m=>{m.exports=function S(i){var r=-1,a=Array(i.size);return i.forEach(function(f,c){a[++r]=[c,f]}),a}},63587:m=>{m.exports=function S(i,r){return function(a){return null!=a&&a[i]===r&&(void 0!==r||i in Object(a))}}},43911:(m,S,i)=>{var r=i(97425);m.exports=function f(c){var e=r(c,function(y){return 500===p.size&&p.clear(),y}),p=e.cache;return e}},95969:(m,S,i)=>{var a=i(4153)(Object,"create");m.exports=a},36700:(m,S,i)=>{var a=i(93332)(Object.keys,Object);m.exports=a},25618:m=>{m.exports=function S(i){var r=[];if(null!=i)for(var a in Object(i))r.push(a);return r}},70938:(m,S,i)=>{m=i.nmd(m);var r=i(61138),a=S&&!S.nodeType&&S,f=a&&m&&!m.nodeType&&m,e=f&&f.exports===a&&r.process,p=function(){try{return f&&f.require&&f.require("util").types||e&&e.binding&&e.binding("util")}catch(T){}}();m.exports=p},81244:m=>{var i=Object.prototype.toString;m.exports=function r(a){return i.call(a)}},93332:m=>{m.exports=function S(i,r){return function(a){return i(r(a))}}},15529:(m,S,i)=>{var r=i(81638),a=Math.max;m.exports=function f(c,e,p){return e=a(void 0===e?c.length-1:e,0),function(){for(var y=arguments,T=-1,C=a(y.length-e,0),R=Array(C);++T<C;)R[T]=y[e+T];T=-1;for(var L=Array(e+1);++T<e;)L[T]=y[T];return L[e]=p(R),r(c,this,L)}}},61746:(m,S,i)=>{var r=i(93436),a=i(63586);m.exports=function f(c,e){return e.length<2?c:r(c,a(e,0,-1))}},27038:(m,S,i)=>{var r=i(61138),a="object"==typeof self&&self&&self.Object===Object&&self,f=r||a||Function("return this")();m.exports=f},45959:m=>{m.exports=function S(i,r){if(("constructor"!==r||"function"!=typeof i[r])&&"__proto__"!=r)return i[r]}},30365:m=>{m.exports=function i(r){return this.__data__.set(r,"__lodash_hash_undefined__"),this}},58235:m=>{m.exports=function S(i){return this.__data__.has(i)}},57673:m=>{m.exports=function S(i){var r=-1,a=Array(i.size);return i.forEach(function(f){a[++r]=f}),a}},39009:(m,S,i)=>{var r=i(99372),f=i(44094)(r);m.exports=f},44094:m=>{var r=Date.now;m.exports=function a(f){var c=0,e=0;return function(){var p=r(),y=16-(p-e);if(e=p,y>0){if(++c>=800)return arguments[0]}else c=0;return f.apply(void 0,arguments)}}},18034:(m,S,i)=>{var r=i(73545);m.exports=function a(){this.__data__=new r,this.size=0}},37238:m=>{m.exports=function S(i){var r=this.__data__,a=r.delete(i);return this.size=r.size,a}},75887:m=>{m.exports=function S(i){return this.__data__.get(i)}},81450:m=>{m.exports=function S(i){return this.__data__.has(i)}},61386:(m,S,i)=>{var r=i(73545),a=i(39046),f=i(93177);m.exports=function e(p,y){var T=this.__data__;if(T instanceof r){var C=T.__data__;if(!a||C.length<199)return C.push([p,y]),this.size=++T.size,this;T=this.__data__=new f(C)}return T.set(p,y),this.size=T.size,this}},2150:(m,S,i)=>{var r=i(87280),a=i(407),f=i(1879);m.exports=function c(e){return a(e)?f(e):r(e)}},89775:(m,S,i)=>{var r=i(43911),a=/[^.[\]]+|\[(?:(-?\d+(?:\.\d+)?)|(["'])((?:(?!\2)[^\\]|\\.)*?)\2)\]|(?=(?:\.|\[\])(?:\.|\[\]|$))/g,f=/\\(\\)?/g,c=r(function(e){var p=[];return 46===e.charCodeAt(0)&&p.push(""),e.replace(a,function(y,T,C,R){p.push(C?R.replace(f,"$1"):T||y)}),p});m.exports=c},82773:(m,S,i)=>{var r=i(7786);m.exports=function f(c){if("string"==typeof c||r(c))return c;var e=c+"";return"0"==e&&1/c==-1/0?"-0":e}},51217:m=>{var i=Function.prototype.toString;m.exports=function r(a){if(null!=a){try{return i.call(a)}catch(f){}try{return a+""}catch(f){}}return""}},87478:m=>{var S=/\s/;m.exports=function i(r){for(var a=r.length;a--&&S.test(r.charAt(a)););return a}},1879:m=>{var S="\\ud800-\\udfff",e="["+S+"]",p="[\\u0300-\\u036f\\ufe20-\\ufe2f\\u20d0-\\u20ff]",y="\\ud83c[\\udffb-\\udfff]",C="[^"+S+"]",R="(?:\\ud83c[\\udde6-\\uddff]){2}",L="[\\ud800-\\udbff][\\udc00-\\udfff]",W="(?:"+p+"|"+y+")?",J="[\\ufe0e\\ufe0f]?",ce=J+W+"(?:\\u200d(?:"+[C,R,L].join("|")+")"+J+W+")*",ie="(?:"+[C+p+"?",p,R,L,e].join("|")+")",U=RegExp(y+"(?="+y+")|"+ie+ce,"g");m.exports=function se(ge){return ge.match(U)||[]}},58863:m=>{var S="\\ud800-\\udfff",c="\\u2700-\\u27bf",e="a-z\\xdf-\\xf6\\xf8-\\xff",R="A-Z\\xc0-\\xd6\\xd8-\\xde",z="\\xac\\xb1\\xd7\\xf7\\x00-\\x2f\\x3a-\\x40\\x5b-\\x60\\x7b-\\xbf\\u2000-\\u206f \\t\\x0b\\f\\xa0\\ufeff\\n\\r\\u2028\\u2029\\u1680\\u180e\\u2000\\u2001\\u2002\\u2003\\u2004\\u2005\\u2006\\u2007\\u2008\\u2009\\u200a\\u202f\\u205f\\u3000",J="["+z+"]",ce="\\d+",ie="["+c+"]",U="["+e+"]",se="[^"+S+z+ce+c+e+R+"]",be="(?:\\ud83c[\\udde6-\\uddff]){2}",we="[\\ud800-\\udbff][\\udc00-\\udfff]",ue="["+R+"]",We="(?:"+U+"|"+se+")",Ve="(?:"+ue+"|"+se+")",Be="(?:['\u2019](?:d|ll|m|re|s|t|ve))?",xe="(?:['\u2019](?:D|LL|M|RE|S|T|VE))?",je="(?:[\\u0300-\\u036f\\ufe20-\\ufe2f\\u20d0-\\u20ff]|\\ud83c[\\udffb-\\udfff])?",Ne="[\\ufe0e\\ufe0f]?",Pt=Ne+je+"(?:\\u200d(?:"+["[^"+S+"]",be,we].join("|")+")"+Ne+je+")*",Vt="(?:"+[ie,be,we].join("|")+")"+Pt,hn=RegExp([ue+"?"+U+"+"+Be+"(?="+[J,ue,"$"].join("|")+")",Ve+"+"+xe+"(?="+[J,ue+We,"$"].join("|")+")",ue+"?"+We+"+"+Be,ue+"+"+xe,"\\d*(?:1ST|2ND|3RD|(?![123])\\dTH)(?=\\b|[a-z_])","\\d*(?:1st|2nd|3rd|(?![123])\\dth)(?=\\b|[A-Z_])",ce,Vt].join("|"),"g");m.exports=function vn(mt){return mt.match(hn)||[]}},35037:(m,S,i)=>{var r=i(76974),f=i(17407)(function(c,e,p){return e=e.toLowerCase(),c+(p?r(e):e)});m.exports=f},76974:(m,S,i)=>{var r=i(41233),a=i(93890);m.exports=function f(c){return a(r(c).toLowerCase())}},45654:m=>{m.exports=function S(i){return function(){return i}}},41776:(m,S,i)=>{var r=i(53867),a=i(30765),f=i(45038),e=Math.max,p=Math.min;m.exports=function y(T,C,R){var L,z,W,J,ee,ce,ie=0,U=!1,se=!1,ge=!0;if("function"!=typeof T)throw new TypeError("Expected a function");function ae(xe){var je=L,Ne=z;return L=z=void 0,ie=xe,J=T.apply(Ne,je)}function he(xe){return ie=xe,ee=setTimeout(ue,C),U?ae(xe):J}function we(xe){var je=xe-ce;return void 0===ce||je>=C||je<0||se&&xe-ie>=W}function ue(){var xe=a();if(we(xe))return st(xe);ee=setTimeout(ue,function be(xe){var Bt=C-(xe-ce);return se?p(Bt,W-(xe-ie)):Bt}(xe))}function st(xe){return ee=void 0,ge&&L?ae(xe):(L=z=void 0,J)}function Be(){var xe=a(),je=we(xe);if(L=arguments,z=this,ce=xe,je){if(void 0===ee)return he(ce);if(se)return clearTimeout(ee),ee=setTimeout(ue,C),ae(ce)}return void 0===ee&&(ee=setTimeout(ue,C)),J}return C=f(C)||0,r(R)&&(U=!!R.leading,W=(se="maxWait"in R)?e(f(R.maxWait)||0,C):W,ge="trailing"in R?!!R.trailing:ge),Be.cancel=function We(){void 0!==ee&&clearTimeout(ee),ie=0,L=ce=z=ee=void 0},Be.flush=function Ve(){return void 0===ee?J:st(a())},Be}},75289:(m,S,i)=>{var r=i(4068),a=i(41233),f=/[\xc0-\xd6\xd8-\xf6\xf8-\xff\u0100-\u017f]/g,C=RegExp("[\\u0300-\\u036f\\ufe20-\\ufe2f\\u20d0-\\u20ff]","g");m.exports=function R(L){return(L=a(L))&&L.replace(f,r).replace(C,"")}},71166:m=>{m.exports=function S(i,r){return i===r||i!=i&&r!=r}},98990:(m,S,i)=>{var f=i(44674)(i(84857));m.exports=f},84857:(m,S,i)=>{var r=i(12229),a=i(5245),f=i(32781),c=Math.max;m.exports=function e(p,y,T){var C=null==p?0:p.length;if(!C)return-1;var R=null==T?0:f(T);return R<0&&(R=c(C+R,0)),r(p,a(y,3),R)}},94694:(m,S,i)=>{var r=i(56369);m.exports=function a(f){return null!=f&&f.length?r(f,1):[]}},58102:(m,S,i)=>{var r=i(93436);m.exports=function a(f,c,e){var p=null==f?void 0:r(f,c);return void 0===p?e:p}},18303:(m,S,i)=>{var r=i(55333),a=i(82138);m.exports=function f(c,e){return null!=c&&a(c,e,r)}},80290:m=>{m.exports=function S(i){return i}},2952:(m,S,i)=>{var r=i(77090),a=i(27503),f=Object.prototype,c=f.hasOwnProperty,e=f.propertyIsEnumerable,p=r(function(){return arguments}())?r:function(y){return a(y)&&c.call(y,"callee")&&!e.call(y,"callee")};m.exports=p},81690:m=>{m.exports=Array.isArray},93406:(m,S,i)=>{var r=i(55836),a=i(8613);m.exports=function f(c){return null!=c&&a(c.length)&&!r(c)}},82027:(m,S,i)=>{var r=i(93406),a=i(27503);m.exports=function f(c){return a(c)&&r(c)}},84444:(m,S,i)=>{m=i.nmd(m);var r=i(27038),a=i(61711),f=S&&!S.nodeType&&S,c=f&&m&&!m.nodeType&&m,p=c&&c.exports===f?r.Buffer:void 0;m.exports=(p?p.isBuffer:void 0)||a},12232:(m,S,i)=>{var r=i(92488),a=i(26663),f=i(2952),c=i(81690),e=i(93406),p=i(84444),y=i(58845),T=i(47679),z=Object.prototype.hasOwnProperty;m.exports=function W(J){if(null==J)return!0;if(e(J)&&(c(J)||"string"==typeof J||"function"==typeof J.splice||p(J)||T(J)||f(J)))return!J.length;var ee=a(J);if("[object Map]"==ee||"[object Set]"==ee)return!J.size;if(y(J))return!r(J).length;for(var ce in J)if(z.call(J,ce))return!1;return!0}},55836:(m,S,i)=>{var r=i(72802),a=i(53867);m.exports=function y(T){if(!a(T))return!1;var C=r(T);return"[object Function]"==C||"[object GeneratorFunction]"==C||"[object AsyncFunction]"==C||"[object Proxy]"==C}},8613:m=>{m.exports=function i(r){return"number"==typeof r&&r>-1&&r%1==0&&r<=9007199254740991}},32e3:(m,S,i)=>{var r=i(63434),a=i(70544),f=i(70938),c=f&&f.isMap,e=c?a(c):r;m.exports=e},53867:m=>{m.exports=function S(i){var r=typeof i;return null!=i&&("object"==r||"function"==r)}},27503:m=>{m.exports=function S(i){return null!=i&&"object"==typeof i}},82358:(m,S,i)=>{var r=i(72802),a=i(52398),f=i(27503),y=Function.prototype.toString,T=Object.prototype.hasOwnProperty,C=y.call(Object);m.exports=function R(L){if(!f(L)||"[object Object]"!=r(L))return!1;var z=a(L);if(null===z)return!0;var W=T.call(z,"constructor")&&z.constructor;return"function"==typeof W&&W instanceof W&&y.call(W)==C}},48855:(m,S,i)=>{var r=i(67495),a=i(70544),f=i(70938),c=f&&f.isSet,e=c?a(c):r;m.exports=e},64871:(m,S,i)=>{var r=i(72802),a=i(81690),f=i(27503);m.exports=function e(p){return"string"==typeof p||!a(p)&&f(p)&&"[object String]"==r(p)}},7786:(m,S,i)=>{var r=i(72802),a=i(27503);m.exports=function c(e){return"symbol"==typeof e||a(e)&&"[object Symbol]"==r(e)}},47679:(m,S,i)=>{var r=i(99390),a=i(70544),f=i(70938),c=f&&f.isTypedArray,e=c?a(c):r;m.exports=e},59108:(m,S,i)=>{var r=i(71890),a=i(92488),f=i(93406);m.exports=function c(e){return f(e)?r(e):a(e)}},42970:(m,S,i)=>{var r=i(71890),a=i(50762),f=i(93406);m.exports=function c(e){return f(e)?r(e,!0):a(e)}},27842:m=>{m.exports=function S(i){var r=null==i?0:i.length;return r?i[r-1]:void 0}},23815:function(m,S,i){var r;m=i.nmd(m),function(){var a,p="Expected a function",T="__lodash_hash_undefined__",R="__lodash_placeholder__",Bt=1/0,rt=9007199254740991,Vt=4294967295,mt=[["ary",128],["bind",1],["bindKey",2],["curry",8],["curryRight",16],["flip",512],["partial",32],["partialRight",64],["rearg",256]],Nt="[object Arguments]",St="[object Array]",Fn="[object Boolean]",pr="[object Date]",mi="[object Error]",ur="[object Function]",$r="[object GeneratorFunction]",Br="[object Map]",Pn="[object Number]",dr="[object Object]",Qr="[object Promise]",_i="[object RegExp]",so="[object Set]",Ro="[object String]",Sr="[object Symbol]",un="[object WeakMap]",Jn="[object ArrayBuffer]",Gn="[object DataView]",Xr="[object Float32Array]",Zi="[object Float64Array]",ii="[object Int8Array]",hr="[object Int16Array]",Ki="[object Int32Array]",ln="[object Uint8Array]",Mn="[object Uint8ClampedArray]",Zn="[object Uint16Array]",cn="[object Uint32Array]",Sn=/\b__p \+= '';/g,Or=/\b(__p \+=) '' \+/g,ri=/(__e\(.*?\)|\b__t\)) \+\n'';/g,vi=/&(?:amp|lt|gt|quot|#39);/g,Ui=/[&<>"']/g,ao=RegExp(vi.source),dt=RegExp(Ui.source),Bi=/<%-([\s\S]+?)%>/g,to=/<%([\s\S]+?)%>/g,Gt=/<%=([\s\S]+?)%>/g,Rn=/\.|\[(?:[^[\]]*|(["'])(?:(?!\1)[^\\]|\\.)*?\1)\]/,_t=/^\w*$/,Rt=/[^.[\]]+|\[(?:(-?\d+(?:\.\d+)?)|(["'])((?:(?!\2)[^\\]|\\.)*?)\2)\]|(?=(?:\.|\[\])(?:\.|\[\]|$))/g,ct=/[\\^$.*+?()[\]{}|]/g,pt=RegExp(ct.source),kt=/^\s+/,dn=/\s/,mr=/\{(?:\n\/\* \[wrapped with .+\] \*\/)?\n?/,Oi=/\{\n\/\* \[wrapped with (.+)\] \*/,di=/,? & /,Uo=/[^\x00-\x2f\x3a-\x40\x5b-\x60\x7b-\x7f]+/g,Qo=/[()=,{}\[\]\/\s]/,lo=/\\(\\)?/g,Ai=/\$\{([^\\}]*(?:\\.[^\\}]*)*)\}/g,Fo=/\w*$/,Ko=/^[-+]0x[0-9a-f]+$/i,qn=/^0b[01]+$/i,ei=/^\[object .+?Constructor\]$/,wn=/^0o[0-7]+$/i,Qn=/^(?:0|[1-9]\d*)$/,Fr=/[\xc0-\xd6\xd8-\xf6\xf8-\xff\u0100-\u017f]/g,oo=/($^)/,Li=/['\n\r\u2028\u2029\\]/g,yo="\\ud800-\\udfff",er="\\u0300-\\u036f\\ufe20-\\ufe2f\\u20d0-\\u20ff",vr="\\u2700-\\u27bf",yr="a-z\\xdf-\\xf6\\xf8-\\xff",Gr="A-Z\\xc0-\\xd6\\xd8-\\xde",no="\\ufe0e\\ufe0f",mo="\\xac\\xb1\\xd7\\xf7\\x00-\\x2f\\x3a-\\x40\\x5b-\\x60\\x7b-\\xbf\\u2000-\\u206f \\t\\x0b\\f\\xa0\\ufeff\\n\\r\\u2028\\u2029\\u1680\\u180e\\u2000\\u2001\\u2002\\u2003\\u2004\\u2005\\u2006\\u2007\\u2008\\u2009\\u200a\\u202f\\u205f\\u3000",Us="["+yo+"]",cs="["+mo+"]",es="["+er+"]",ga="\\d+",ya="["+vr+"]",fa="["+yr+"]",la="[^"+yo+mo+ga+vr+yr+Gr+"]",Pa="\\ud83c[\\udffb-\\udfff]",To="[^"+yo+"]",ml="(?:\\ud83c[\\udde6-\\uddff]){2}",Zo="[\\ud800-\\udbff][\\udc00-\\udfff]",vs="["+Gr+"]",Is="(?:"+fa+"|"+la+")",tl="(?:"+vs+"|"+la+")",Ys="(?:['\u2019](?:d|ll|m|re|s|t|ve))?",ko="(?:['\u2019](?:D|LL|M|RE|S|T|VE))?",Co="(?:"+es+"|"+Pa+")?",Ps="["+no+"]?",Qi=Ps+Co+"(?:\\u200d(?:"+[To,ml,Zo].join("|")+")"+Ps+Co+")*",tt="(?:"+[ya,ml,Zo].join("|")+")"+Qi,rn="(?:"+[To+es+"?",es,ml,Zo,Us].join("|")+")",ne=RegExp("['\u2019]","g"),Le=RegExp(es,"g"),Lt=RegExp(Pa+"(?="+Pa+")|"+rn+Qi,"g"),on=RegExp([vs+"?"+fa+"+"+Ys+"(?="+[cs,vs,"$"].join("|")+")",tl+"+"+ko+"(?="+[cs,vs+Is,"$"].join("|")+")",vs+"?"+Is+"+"+Ys,vs+"+"+ko,"\\d*(?:1ST|2ND|3RD|(?![123])\\dTH)(?=\\b|[a-z_])","\\d*(?:1st|2nd|3rd|(?![123])\\dth)(?=\\b|[A-Z_])",ga,tt].join("|"),"g"),Kr=RegExp("[\\u200d"+yo+er+no+"]"),bi=/[a-z][A-Z]|[A-Z]{2}[a-z]|[0-9][a-zA-Z]|[a-zA-Z][0-9]|[^a-zA-Z0-9 ]/,Ii=["Array","Buffer","DataView","Date","Error","Float32Array","Float64Array","Function","Int8Array","Int16Array","Int32Array","Map","Math","Object","Promise","RegExp","Set","String","Symbol","TypeError","Uint8Array","Uint8ClampedArray","Uint16Array","Uint32Array","WeakMap","_","clearTimeout","isFinite","parseInt","setTimeout"],hs=-1,zo={};zo[Xr]=zo[Zi]=zo[ii]=zo[hr]=zo[Ki]=zo[ln]=zo[Mn]=zo[Zn]=zo[cn]=!0,zo[Nt]=zo[St]=zo[Jn]=zo[Fn]=zo[Gn]=zo[pr]=zo[mi]=zo[ur]=zo[Br]=zo[Pn]=zo[dr]=zo[_i]=zo[so]=zo[Ro]=zo[un]=!1;var Ls={};Ls[Nt]=Ls[St]=Ls[Jn]=Ls[Gn]=Ls[Fn]=Ls[pr]=Ls[Xr]=Ls[Zi]=Ls[ii]=Ls[hr]=Ls[Ki]=Ls[Br]=Ls[Pn]=Ls[dr]=Ls[_i]=Ls[so]=Ls[Ro]=Ls[Sr]=Ls[ln]=Ls[Mn]=Ls[Zn]=Ls[cn]=!0,Ls[mi]=Ls[ur]=Ls[un]=!1;var Wl={"\\":"\\","'":"'","\n":"n","\r":"r","\u2028":"u2028","\u2029":"u2029"},Qu=parseFloat,hc=parseInt,Tl="object"==typeof global&&global&&global.Object===Object&&global,_c="object"==typeof self&&self&&self.Object===Object&&self,Pl=Tl||_c||Function("return this")(),Ku=S&&!S.nodeType&&S,Qa=Ku&&m&&!m.nodeType&&m,Mc=Qa&&Qa.exports===Ku,tu=Mc&&Tl.process,Wa=function(){try{return Qa&&Qa.require&&Qa.require("util").types||tu&&tu.binding&&tu.binding("util")}catch(Ar){}}(),Ml=Wa&&Wa.isArrayBuffer,Hl=Wa&&Wa.isDate,Ua=Wa&&Wa.isMap,Qe=Wa&&Wa.isRegExp,zt=Wa&&Wa.isSet,ot=Wa&&Wa.isTypedArray;function jt(kn,Ar,gr){switch(gr.length){case 0:return kn.call(Ar);case 1:return kn.call(Ar,gr[0]);case 2:return kn.call(Ar,gr[0],gr[1]);case 3:return kn.call(Ar,gr[0],gr[1],gr[2])}return kn.apply(Ar,gr)}function zn(kn,Ar,gr,fo){for(var $s=-1,Es=null==kn?0:kn.length;++$s<Es;){var pl=kn[$s];Ar(fo,pl,gr(pl),kn)}return fo}function qr(kn,Ar){for(var gr=-1,fo=null==kn?0:kn.length;++gr<fo&&!1!==Ar(kn[gr],gr,kn););return kn}function Di(kn,Ar){for(var gr=null==kn?0:kn.length;gr--&&!1!==Ar(kn[gr],gr,kn););return kn}function as(kn,Ar){for(var gr=-1,fo=null==kn?0:kn.length;++gr<fo;)if(!Ar(kn[gr],gr,kn))return!1;return!0}function js(kn,Ar){for(var gr=-1,fo=null==kn?0:kn.length,$s=0,Es=[];++gr<fo;){var pl=kn[gr];Ar(pl,gr,kn)&&(Es[$s++]=pl)}return Es}function As(kn,Ar){return!(null==kn||!kn.length)&&Ya(kn,Ar,0)>-1}function Ns(kn,Ar,gr){for(var fo=-1,$s=null==kn?0:kn.length;++fo<$s;)if(gr(Ar,kn[fo]))return!0;return!1}function Io(kn,Ar){for(var gr=-1,fo=null==kn?0:kn.length,$s=Array(fo);++gr<fo;)$s[gr]=Ar(kn[gr],gr,kn);return $s}function Ka(kn,Ar){for(var gr=-1,fo=Ar.length,$s=kn.length;++gr<fo;)kn[$s+gr]=Ar[gr];return kn}function sl(kn,Ar,gr,fo){var $s=-1,Es=null==kn?0:kn.length;for(fo&&Es&&(gr=kn[++$s]);++$s<Es;)gr=Ar(gr,kn[$s],$s,kn);return gr}function Bs(kn,Ar,gr,fo){var $s=null==kn?0:kn.length;for(fo&&$s&&(gr=kn[--$s]);$s--;)gr=Ar(gr,kn[$s],$s,kn);return gr}function lt(kn,Ar){for(var gr=-1,fo=null==kn?0:kn.length;++gr<fo;)if(Ar(kn[gr],gr,kn))return!0;return!1}var Xe=vd("length");function pi(kn,Ar,gr){var fo;return gr(kn,function($s,Es,pl){if(Ar($s,Es,pl))return fo=Es,!1}),fo}function Wo(kn,Ar,gr,fo){for(var $s=kn.length,Es=gr+(fo?1:-1);fo?Es--:++Es<$s;)if(Ar(kn[Es],Es,kn))return Es;return-1}function Ya(kn,Ar,gr){return Ar==Ar?function nt(kn,Ar,gr){for(var fo=gr-1,$s=kn.length;++fo<$s;)if(kn[fo]===Ar)return fo;return-1}(kn,Ar,gr):Wo(kn,Xu,gr)}function yl(kn,Ar,gr,fo){for(var $s=gr-1,Es=kn.length;++$s<Es;)if(fo(kn[$s],Ar))return $s;return-1}function Xu(kn){return kn!=kn}function Lc(kn,Ar){var gr=null==kn?0:kn.length;return gr?ys(kn,Ar)/gr:NaN}function vd(kn){return function(Ar){return null==Ar?a:Ar[kn]}}function Hi(kn){return function(Ar){return null==kn?a:kn[Ar]}}function oa(kn,Ar,gr,fo,$s){return $s(kn,function(Es,pl,Ks){gr=fo?(fo=!1,Es):Ar(gr,Es,pl,Ks)}),gr}function ys(kn,Ar){for(var gr,fo=-1,$s=kn.length;++fo<$s;){var Es=Ar(kn[fo]);Es!==a&&(gr=gr===a?Es:gr+Es)}return gr}function qu(kn,Ar){for(var gr=-1,fo=Array(kn);++gr<kn;)fo[gr]=Ar(gr);return fo}function su(kn){return kn&&kn.slice(0,Cn(kn)+1).replace(kt,"")}function vu(kn){return function(Ar){return kn(Ar)}}function nu(kn,Ar){return Io(Ar,function(gr){return kn[gr]})}function ra(kn,Ar){return kn.has(Ar)}function yu(kn,Ar){for(var gr=-1,fo=kn.length;++gr<fo&&Ya(Ar,kn[gr],0)>-1;);return gr}function rd(kn,Ar){for(var gr=kn.length;gr--&&Ya(Ar,kn[gr],0)>-1;);return gr}function ec(kn,Ar){for(var gr=kn.length,fo=0;gr--;)kn[gr]===Ar&&++fo;return fo}var au=Hi({\u00c0:"A",\u00c1:"A",\u00c2:"A",\u00c3:"A",\u00c4:"A",\u00c5:"A",\u00e0:"a",\u00e1:"a",\u00e2:"a",\u00e3:"a",\u00e4:"a",\u00e5:"a",\u00c7:"C",\u00e7:"c",\u00d0:"D",\u00f0:"d",\u00c8:"E",\u00c9:"E",\u00ca:"E",\u00cb:"E",\u00e8:"e",\u00e9:"e",\u00ea:"e",\u00eb:"e",\u00cc:"I",\u00cd:"I",\u00ce:"I",\u00cf:"I",\u00ec:"i",\u00ed:"i",\u00ee:"i",\u00ef:"i",\u00d1:"N",\u00f1:"n",\u00d2:"O",\u00d3:"O",\u00d4:"O",\u00d5:"O",\u00d6:"O",\u00d8:"O",\u00f2:"o",\u00f3:"o",\u00f4:"o",\u00f5:"o",\u00f6:"o",\u00f8:"o",\u00d9:"U",\u00da:"U",\u00db:"U",\u00dc:"U",\u00f9:"u",\u00fa:"u",\u00fb:"u",\u00fc:"u",\u00dd:"Y",\u00fd:"y",\u00ff:"y",\u00c6:"Ae",\u00e6:"ae",\u00de:"Th",\u00fe:"th",\u00df:"ss",\u0100:"A",\u0102:"A",\u0104:"A",\u0101:"a",\u0103:"a",\u0105:"a",\u0106:"C",\u0108:"C",\u010a:"C",\u010c:"C",\u0107:"c",\u0109:"c",\u010b:"c",\u010d:"c",\u010e:"D",\u0110:"D",\u010f:"d",\u0111:"d",\u0112:"E",\u0114:"E",\u0116:"E",\u0118:"E",\u011a:"E",\u0113:"e",\u0115:"e",\u0117:"e",\u0119:"e",\u011b:"e",\u011c:"G",\u011e:"G",\u0120:"G",\u0122:"G",\u011d:"g",\u011f:"g",\u0121:"g",\u0123:"g",\u0124:"H",\u0126:"H",\u0125:"h",\u0127:"h",\u0128:"I",\u012a:"I",\u012c:"I",\u012e:"I",\u0130:"I",\u0129:"i",\u012b:"i",\u012d:"i",\u012f:"i",\u0131:"i",\u0134:"J",\u0135:"j",\u0136:"K",\u0137:"k",\u0138:"k",\u0139:"L",\u013b:"L",\u013d:"L",\u013f:"L",\u0141:"L",\u013a:"l",\u013c:"l",\u013e:"l",\u0140:"l",\u0142:"l",\u0143:"N",\u0145:"N",\u0147:"N",\u014a:"N",\u0144:"n",\u0146:"n",\u0148:"n",\u014b:"n",\u014c:"O",\u014e:"O",\u0150:"O",\u014d:"o",\u014f:"o",\u0151:"o",\u0154:"R",\u0156:"R",\u0158:"R",\u0155:"r",\u0157:"r",\u0159:"r",\u015a:"S",\u015c:"S",\u015e:"S",\u0160:"S",\u015b:"s",\u015d:"s",\u015f:"s",\u0161:"s",\u0162:"T",\u0164:"T",\u0166:"T",\u0163:"t",\u0165:"t",\u0167:"t",\u0168:"U",\u016a:"U",\u016c:"U",\u016e:"U",\u0170:"U",\u0172:"U",\u0169:"u",\u016b:"u",\u016d:"u",\u016f:"u",\u0171:"u",\u0173:"u",\u0174:"W",\u0175:"w",\u0176:"Y",\u0177:"y",\u0178:"Y",\u0179:"Z",\u017b:"Z",\u017d:"Z",\u017a:"z",\u017c:"z",\u017e:"z",\u0132:"IJ",\u0133:"ij",\u0152:"Oe",\u0153:"oe",\u0149:"'n",\u017f:"s"}),uu=Hi({"&":"&amp;","<":"&lt;",">":"&gt;",'"':"&quot;","'":"&#39;"});function id(kn){return"\\"+Wl[kn]}function Hu(kn){return Kr.test(kn)}function Bo(kn){var Ar=-1,gr=Array(kn.size);return kn.forEach(function(fo,$s){gr[++Ar]=[$s,fo]}),gr}function cu(kn,Ar){return function(gr){return kn(Ar(gr))}}function Er(kn,Ar){for(var gr=-1,fo=kn.length,$s=0,Es=[];++gr<fo;){var pl=kn[gr];(pl===Ar||pl===R)&&(kn[gr]=R,Es[$s++]=gr)}return Es}function j(kn){var Ar=-1,gr=Array(kn.size);return kn.forEach(function(fo){gr[++Ar]=fo}),gr}function wt(kn){return Hu(kn)?function ni(kn){for(var Ar=Lt.lastIndex=0;Lt.test(kn);)++Ar;return Ar}(kn):Xe(kn)}function sn(kn){return Hu(kn)?function fi(kn){return kn.match(Lt)||[]}(kn):function ke(kn){return kn.split("")}(kn)}function Cn(kn){for(var Ar=kn.length;Ar--&&dn.test(kn.charAt(Ar)););return Ar}var _r=Hi({"&amp;":"&","&lt;":"<","&gt;":">","&quot;":'"',"&#39;":"'"}),Dr=function kn(Ar){var O,gr=(Ar=null==Ar?Pl:Dr.defaults(Pl.Object(),Ar,Dr.pick(Pl,Ii))).Array,fo=Ar.Date,$s=Ar.Error,Es=Ar.Function,pl=Ar.Math,Ks=Ar.Object,Wc=Ar.RegExp,Fc=Ar.String,xu=Ar.TypeError,Eu=gr.prototype,yd=Ks.prototype,Ed=Ar["__core-js_shared__"],Uc=Es.prototype.toString,La=yd.hasOwnProperty,kd=0,Oc=(O=/[^.]+$/.exec(Ed&&Ed.keys&&Ed.keys.IE_PROTO||""))?"Symbol(src)_1."+O:"",Mo=yd.toString,No=Uc.call(Ks),Sa=Pl._,Sl=Wc("^"+Uc.call(La).replace(ct,"\\$&").replace(/hasOwnProperty|(function).*?(?=\\\()| for .+?(?=\\\])/g,"$1.*?")+"$"),ru=Mc?Ar.Buffer:a,bu=Ar.Symbol,gc=Ar.Uint8Array,_n=ru?ru.allocUnsafe:a,pa=cu(Ks.getPrototypeOf,Ks),od=Ks.create,$e=yd.propertyIsEnumerable,Me=Eu.splice,_e=bu?bu.isConcatSpreadable:a,at=bu?bu.iterator:a,vt=bu?bu.toStringTag:a,Qt=function(){try{var O=ku(Ks,"defineProperty");return O({},"",{}),O}catch($){}}(),Ln=Ar.clearTimeout!==Pl.clearTimeout&&Ar.clearTimeout,cr=fo&&fo.now!==Pl.Date.now&&fo.now,ui=Ar.setTimeout!==Pl.setTimeout&&Ar.setTimeout,Lo=pl.ceil,Ta=pl.floor,_s=Ks.getOwnPropertySymbols,ha=ru?ru.isBuffer:a,Ca=Ar.isFinite,Ru=Eu.join,lc=cu(Ks.keys,Ks),Fa=pl.max,nl=pl.min,mc=fo.now,vc=Ar.parseInt,Bu=pl.random,Bl=Eu.reverse,tc=ku(Ar,"DataView"),bd=ku(Ar,"Map"),kc=ku(Ar,"Promise"),lu=ku(Ar,"Set"),Ma=ku(Ar,"WeakMap"),al=ku(Ks,"create"),Il=Ma&&new Ma,Cl={},hf=Xf(tc),zd=Xf(bd),sd=Xf(kc),Ol=Xf(lu),Ll=Xf(Ma),Uu=bu?bu.prototype:a,ll=Uu?Uu.valueOf:a,Su=Uu?Uu.toString:a;function tn(O){if(Pc(O)&&!ai(O)&&!(O instanceof ul)){if(O instanceof Xa)return O;if(La.call(O,"__wrapped__"))return T_(O)}return new Xa(O)}var yc=function(){function O(){}return function($){if(!Vu($))return{};if(od)return od($);O.prototype=$;var de=new O;return O.prototype=a,de}}();function Nu(){}function Xa(O,$){this.__wrapped__=O,this.__actions__=[],this.__chain__=!!$,this.__index__=0,this.__values__=a}function ul(O){this.__wrapped__=O,this.__actions__=[],this.__dir__=1,this.__filtered__=!1,this.__iteratees__=[],this.__takeCount__=Vt,this.__views__=[]}function uc(O){var $=-1,de=null==O?0:O.length;for(this.clear();++$<de;){var Ke=O[$];this.set(Ke[0],Ke[1])}}function Ec(O){var $=-1,de=null==O?0:O.length;for(this.clear();++$<de;){var Ke=O[$];this.set(Ke[0],Ke[1])}}function ad(O){var $=-1,de=null==O?0:O.length;for(this.clear();++$<de;){var Ke=O[$];this.set(Ke[0],Ke[1])}}function $d(O){var $=-1,de=null==O?0:O.length;for(this.__data__=new ad;++$<de;)this.add(O[$])}function Fl(O){var $=this.__data__=new Ec(O);this.size=$.size}function cc(O,$){var de=ai(O),Ke=!de&&Cr(O),$t=!de&&!Ke&&ou(O),mn=!de&&!Ke&&!$t&&Cg(O),rr=de||Ke||$t||mn,xr=rr?qu(O.length,Fc):[],Zr=xr.length;for(var io in O)($||La.call(O,io))&&(!rr||!("length"==io||$t&&("offset"==io||"parent"==io)||mn&&("buffer"==io||"byteLength"==io||"byteOffset"==io)||pc(io,Zr)))&&xr.push(io);return xr}function Jl(O){var $=O.length;return $?O[Bd(0,$-1)]:a}function Sc(O,$){return Ap(Md(O),fc($,0,O.length))}function Tc(O){return Ap(Md(O))}function ju(O,$,de){(de!==a&&!it(O[$],de)||de===a&&!($ in O))&&Rl(O,$,de)}function fu(O,$,de){var Ke=O[$];(!La.call(O,$)||!it(Ke,de)||de===a&&!($ in O))&&Rl(O,$,de)}function ud(O,$){for(var de=O.length;de--;)if(it(O[de][0],$))return de;return-1}function dc(O,$,de,Ke){return le(O,function($t,mn,rr){$(Ke,$t,de($t),rr)}),Ke}function Zd(O,$){return O&&Qd($,wd($),O)}function Rl(O,$,de){"__proto__"==$&&Qt?Qt(O,$,{configurable:!0,enumerable:!0,value:de,writable:!0}):O[$]=de}function jc(O,$){for(var de=-1,Ke=$.length,$t=gr(Ke),mn=null==O;++de<Ke;)$t[de]=mn?a:_1(O,$[de]);return $t}function fc(O,$,de){return O==O&&(de!==a&&(O=O<=de?O:de),$!==a&&(O=O>=$?O:$)),O}function h(O,$,de,Ke,$t,mn){var rr,xr=1&$,Zr=2&$,io=4&$;if(de&&(rr=$t?de(O,Ke,$t,mn):de(O)),rr!==a)return rr;if(!Vu(O))return O;var ho=ai(O);if(ho){if(rr=function Gp(O){var $=O.length,de=new O.constructor($);return $&&"string"==typeof O[0]&&La.call(O,"index")&&(de.index=O.index,de.input=O.input),de}(O),!xr)return Md(O,rr)}else{var So=Gu(O),bs=So==ur||So==$r;if(ou(O))return zh(O,xr);if(So==dr||So==Nt||bs&&!$t){if(rr=Zr||bs?{}:If(O),!xr)return Zr?function ng(O,$){return Qd(O,Cp(O),$)}(O,function Qc(O,$){return O&&Qd($,rp($),O)}(rr,O)):function y_(O,$){return Qd(O,Pf(O),$)}(O,Zd(rr,O))}else{if(!Ls[So])return $t?O:{};rr=function Cs(O,$,de){var Ke=O.constructor;switch($){case Jn:return Vh(O);case Fn:case pr:return new Ke(+O);case Gn:return function v_(O,$){var de=$?Vh(O.buffer):O.buffer;return new O.constructor(de,O.byteOffset,O.byteLength)}(O,de);case Xr:case Zi:case ii:case hr:case Ki:case ln:case Mn:case Zn:case cn:return Zh(O,de);case Br:return new Ke;case Pn:case Ro:return new Ke(O);case _i:return function gh(O){var $=new O.constructor(O.source,Fo.exec(O));return $.lastIndex=O.lastIndex,$}(O);case so:return new Ke;case Sr:return function Yp(O){return ll?Ks(ll.call(O)):{}}(O)}}(O,So,xr)}}mn||(mn=new Fl);var aa=mn.get(O);if(aa)return aa;mn.set(O,rr),k0(O)?O.forEach(function(Ra){rr.add(h(Ra,$,de,Ra,O,mn))}):n1(O)&&O.forEach(function(Ra,kl){rr.set(kl,h(Ra,$,de,kl,O,mn))});var wl=ho?a:(io?Zr?Ch:Th:Zr?rp:wd)(O);return qr(wl||O,function(Ra,kl){wl&&(Ra=O[kl=Ra]),fu(rr,kl,h(Ra,$,de,kl,O,mn))}),rr}function x(O,$,de){var Ke=de.length;if(null==O)return!Ke;for(O=Ks(O);Ke--;){var $t=de[Ke],rr=O[$t];if(rr===a&&!($t in O)||!(0,$[$t])(rr))return!1}return!0}function F(O,$,de){if("function"!=typeof O)throw new xu(p);return Zp(function(){O.apply(a,de)},$)}function Q(O,$,de,Ke){var $t=-1,mn=As,rr=!0,xr=O.length,Zr=[],io=$.length;if(!xr)return Zr;de&&($=Io($,vu(de))),Ke?(mn=Ns,rr=!1):$.length>=200&&(mn=ra,rr=!1,$=new $d($));e:for(;++$t<xr;){var ho=O[$t],So=null==de?ho:de(ho);if(ho=Ke||0!==ho?ho:0,rr&&So==So){for(var bs=io;bs--;)if($[bs]===So)continue e;Zr.push(ho)}else mn($,So,Ke)||Zr.push(ho)}return Zr}tn.templateSettings={escape:Bi,evaluate:to,interpolate:Gt,variable:"",imports:{_:tn}},(tn.prototype=Nu.prototype).constructor=tn,(Xa.prototype=yc(Nu.prototype)).constructor=Xa,(ul.prototype=yc(Nu.prototype)).constructor=ul,uc.prototype.clear=function Td(){this.__data__=al?al(null):{},this.size=0},uc.prototype.delete=function $p(O){var $=this.has(O)&&delete this.__data__[O];return this.size-=$?1:0,$},uc.prototype.get=function _f(O){var $=this.__data__;if(al){var de=$[O];return de===T?a:de}return La.call($,O)?$[O]:a},uc.prototype.has=function up(O){var $=this.__data__;return al?$[O]!==a:La.call($,O)},uc.prototype.set=function Yu(O,$){var de=this.__data__;return this.size+=this.has(O)?0:1,de[O]=al&&$===a?T:$,this},Ec.prototype.clear=function Vd(){this.__data__=[],this.size=0},Ec.prototype.delete=function Af(O){var $=this.__data__,de=ud($,O);return!(de<0||(de==$.length-1?$.pop():Me.call($,de,1),--this.size,0))},Ec.prototype.get=function vp(O){var $=this.__data__,de=ud($,O);return de<0?a:$[de][1]},Ec.prototype.has=function $c(O){return ud(this.__data__,O)>-1},Ec.prototype.set=function Pu(O,$){var de=this.__data__,Ke=ud(de,O);return Ke<0?(++this.size,de.push([O,$])):de[Ke][1]=$,this},ad.prototype.clear=function nc(){this.size=0,this.__data__={hash:new uc,map:new(bd||Ec),string:new uc}},ad.prototype.delete=function Oa(O){var $=Nf(this,O).delete(O);return this.size-=$?1:0,$},ad.prototype.get=function Jc(O){return Nf(this,O).get(O)},ad.prototype.has=function ld(O){return Nf(this,O).has(O)},ad.prototype.set=function cp(O,$){var de=Nf(this,O),Ke=de.size;return de.set(O,$),this.size+=de.size==Ke?0:1,this},$d.prototype.add=$d.prototype.push=function vo(O){return this.__data__.set(O,T),this},$d.prototype.has=function du(O){return this.__data__.has(O)},Fl.prototype.clear=function Ac(){this.__data__=new Ec,this.size=0},Fl.prototype.delete=function ma(O){var $=this.__data__,de=$.delete(O);return this.size=$.size,de},Fl.prototype.get=function Dc(O){return this.__data__.get(O)},Fl.prototype.has=function Iu(O){return this.__data__.has(O)},Fl.prototype.set=function bc(O,$){var de=this.__data__;if(de instanceof Ec){var Ke=de.__data__;if(!bd||Ke.length<199)return Ke.push([O,$]),this.size=++de.size,this;de=this.__data__=new ad(Ke)}return de.set(O,$),this.size=de.size,this};var le=Od(Bn),me=Od(ar,!0);function Fe(O,$){var de=!0;return le(O,function(Ke,$t,mn){return de=!!$(Ke,$t,mn)}),de}function Oe(O,$,de){for(var Ke=-1,$t=O.length;++Ke<$t;){var mn=O[Ke],rr=$(mn);if(null!=rr&&(xr===a?rr==rr&&!eh(rr):de(rr,xr)))var xr=rr,Zr=mn}return Zr}function ht(O,$){var de=[];return le(O,function(Ke,$t,mn){$(Ke,$t,mn)&&de.push(Ke)}),de}function gt(O,$,de,Ke,$t){var mn=-1,rr=O.length;for(de||(de=zp),$t||($t=[]);++mn<rr;){var xr=O[mn];$>0&&de(xr)?$>1?gt(xr,$-1,de,Ke,$t):Ka($t,xr):Ke||($t[$t.length]=xr)}return $t}var nn=E_(),$n=E_(!0);function Bn(O,$){return O&&nn(O,$,wd)}function ar(O,$){return O&&$n(O,$,wd)}function Pr(O,$){return js($,function(de){return af(O[de])})}function $i(O,$){for(var de=0,Ke=($=xf($,O)).length;null!=O&&de<Ke;)O=O[nf($[de++])];return de&&de==Ke?O:a}function is(O,$,de){var Ke=$(O);return ai(O)?Ke:Ka(Ke,de(O))}function Eo(O){return null==O?O===a?"[object Undefined]":"[object Null]":vt&&vt in Ks(O)?function Mh(O){var $=La.call(O,vt),de=O[vt];try{O[vt]=a;var Ke=!0}catch(mn){}var $t=Mo.call(O);return Ke&&($?O[vt]=de:delete O[vt]),$t}(O):function wh(O){return Mo.call(O)}(O)}function Gs(O,$){return O>$}function qs(O,$){return null!=O&&La.call(O,$)}function qa(O,$){return null!=O&&$ in Ks(O)}function ja(O,$,de){for(var Ke=de?Ns:As,$t=O[0].length,mn=O.length,rr=mn,xr=gr(mn),Zr=1/0,io=[];rr--;){var ho=O[rr];rr&&$&&(ho=Io(ho,vu($))),Zr=nl(ho.length,Zr),xr[rr]=!de&&($||$t>=120&&ho.length>=120)?new $d(rr&&ho):a}ho=O[0];var So=-1,bs=xr[0];e:for(;++So<$t&&io.length<Zr;){var aa=ho[So],Ea=$?$(aa):aa;if(aa=de||0!==aa?aa:0,!(bs?ra(bs,Ea):Ke(io,Ea,de))){for(rr=mn;--rr;){var wl=xr[rr];if(!(wl?ra(wl,Ea):Ke(O[rr],Ea,de)))continue e}bs&&bs.push(Ea),io.push(aa)}}return io}function jl(O,$,de){var Ke=null==(O=Qf(O,$=xf($,O)))?O:O[nf(Vc($))];return null==Ke?a:jt(Ke,O,de)}function pu(O){return Pc(O)&&Eo(O)==Nt}function Lu(O,$,de,Ke,$t){return O===$||(null==O||null==$||!Pc(O)&&!Pc($)?O!=O&&$!=$:function wc(O,$,de,Ke,$t,mn){var rr=ai(O),xr=ai($),Zr=rr?St:Gu(O),io=xr?St:Gu($),ho=(Zr=Zr==Nt?dr:Zr)==dr,So=(io=io==Nt?dr:io)==dr,bs=Zr==io;if(bs&&ou(O)){if(!ou($))return!1;rr=!0,ho=!1}if(bs&&!ho)return mn||(mn=new Fl),rr||Cg(O)?Zf(O,$,de,Ke,$t,mn):function Sh(O,$,de,Ke,$t,mn,rr){switch(de){case Gn:if(O.byteLength!=$.byteLength||O.byteOffset!=$.byteOffset)return!1;O=O.buffer,$=$.buffer;case Jn:return!(O.byteLength!=$.byteLength||!mn(new gc(O),new gc($)));case Fn:case pr:case Pn:return it(+O,+$);case mi:return O.name==$.name&&O.message==$.message;case _i:case Ro:return O==$+"";case Br:var xr=Bo;case so:if(xr||(xr=j),O.size!=$.size&&!(1&Ke))return!1;var io=rr.get(O);if(io)return io==$;Ke|=2,rr.set(O,$);var ho=Zf(xr(O),xr($),Ke,$t,mn,rr);return rr.delete(O),ho;case Sr:if(ll)return ll.call(O)==ll.call($)}return!1}(O,$,Zr,de,Ke,$t,mn);if(!(1&de)){var aa=ho&&La.call(O,"__wrapped__"),Ea=So&&La.call($,"__wrapped__");if(aa||Ea){var wl=aa?O.value():O,Ra=Ea?$.value():$;return mn||(mn=new Fl),$t(wl,Ra,de,Ke,mn)}}return!!bs&&(mn||(mn=new Fl),function Tp(O,$,de,Ke,$t,mn){var rr=1&de,xr=Th(O),Zr=xr.length;if(Zr!=Th($).length&&!rr)return!1;for(var So=Zr;So--;){var bs=xr[So];if(!(rr?bs in $:La.call($,bs)))return!1}var aa=mn.get(O),Ea=mn.get($);if(aa&&Ea)return aa==$&&Ea==O;var wl=!0;mn.set(O,$),mn.set($,O);for(var Ra=rr;++So<Zr;){var kl=O[bs=xr[So]],Xl=$[bs];if(Ke)var Bf=rr?Ke(Xl,kl,bs,$,O,mn):Ke(kl,Xl,bs,O,$,mn);if(!(Bf===a?kl===Xl||$t(kl,Xl,de,Ke,mn):Bf)){wl=!1;break}Ra||(Ra="constructor"==bs)}if(wl&&!Ra){var lf=O.constructor,op=$.constructor;lf!=op&&"constructor"in O&&"constructor"in $&&!("function"==typeof lf&&lf instanceof lf&&"function"==typeof op&&op instanceof op)&&(wl=!1)}return mn.delete(O),mn.delete($),wl}(O,$,de,Ke,$t,mn))}(O,$,de,Ke,Lu,$t))}function Wd(O,$,de,Ke){var $t=de.length,mn=$t,rr=!Ke;if(null==O)return!mn;for(O=Ks(O);$t--;){var xr=de[$t];if(rr&&xr[2]?xr[1]!==O[xr[0]]:!(xr[0]in O))return!1}for(;++$t<mn;){var Zr=(xr=de[$t])[0],io=O[Zr],ho=xr[1];if(rr&&xr[2]){if(io===a&&!(Zr in O))return!1}else{var So=new Fl;if(Ke)var bs=Ke(io,ho,Zr,O,$,So);if(!(bs===a?Lu(ho,io,3,Ke,So):bs))return!1}}return!0}function rl(O){return!(!Vu(O)||function r_(O){return!!Oc&&Oc in O}(O))&&(af(O)?Sl:ei).test(Xf(O))}function Tt(O){return"function"==typeof O?O:null==O?ip:"object"==typeof O?ai(O)?ca(O[0],O[1]):Aa(O):I1(O)}function Xt(O){if(!tf(O))return lc(O);var $=[];for(var de in Ks(O))La.call(O,de)&&"constructor"!=de&&$.push(de);return $}function Si(O,$){return O<$}function gs(O,$){var de=-1,Ke=Jo(O)?gr(O.length):[];return le(O,function($t,mn,rr){Ke[++de]=$($t,mn,rr)}),Ke}function Aa(O){var $=jp(O);return 1==$.length&&$[0][2]?Ah($[0][0],$[0][1]):function(de){return de===O||Wd(de,O,$)}}function ca(O,$){return Jf(O)&&Oh($)?Ah(nf(O),$):function(de){var Ke=_1(de,O);return Ke===a&&Ke===$?g1(de,O):Lu($,Ke,3)}}function Al(O,$,de,Ke,$t){O!==$&&nn($,function(mn,rr){if($t||($t=new Fl),Vu(mn))!function Ul(O,$,de,Ke,$t,mn,rr){var xr=Op(O,de),Zr=Op($,de),io=rr.get(Zr);if(io)ju(O,de,io);else{var ho=mn?mn(xr,Zr,de+"",O,$,rr):a,So=ho===a;if(So){var bs=ai(Zr),aa=!bs&&ou(Zr),Ea=!bs&&!aa&&Cg(Zr);ho=Zr,bs||aa||Ea?ai(xr)?ho=xr:Ds(xr)?ho=Md(xr):aa?(So=!1,ho=zh(Zr,!0)):Ea?(So=!1,ho=Zh(Zr,!0)):ho=[]:cg(Zr)||Cr(Zr)?(ho=xr,Cr(xr)?ho=Dm(xr):(!Vu(xr)||af(xr))&&(ho=If(Zr))):So=!1}So&&(rr.set(Zr,ho),$t(ho,Zr,Ke,mn,rr),rr.delete(Zr)),ju(O,de,ho)}}(O,$,rr,de,Al,Ke,$t);else{var xr=Ke?Ke(Op(O,rr),mn,rr+"",O,$,$t):a;xr===a&&(xr=mn),ju(O,rr,xr)}},rp)}function Gc(O,$){var de=O.length;if(de)return pc($+=$<0?de:0,de)?O[$]:a}function gf(O,$,de){$=$.length?Io($,function(mn){return ai(mn)?function(rr){return $i(rr,1===mn.length?mn[0]:mn)}:mn}):[ip];var Ke=-1;return $=Io($,vu(Ts())),function Ia(kn,Ar){var gr=kn.length;for(kn.sort(Ar);gr--;)kn[gr]=kn[gr].value;return kn}(gs(O,function(mn,rr,xr){return{criteria:Io($,function(io){return io(mn)}),index:++Ke,value:mn}}),function(mn,rr){return function tg(O,$,de){for(var Ke=-1,$t=O.criteria,mn=$.criteria,rr=$t.length,xr=de.length;++Ke<rr;){var Zr=mh($t[Ke],mn[Ke]);if(Zr)return Ke>=xr?Zr:Zr*("desc"==de[Ke]?-1:1)}return O.index-$.index}(mn,rr,de)})}function __(O,$,de){for(var Ke=-1,$t=$.length,mn={};++Ke<$t;){var rr=$[Ke],xr=$i(O,rr);de(xr,rr)&&Ud(mn,xf(rr,O),xr)}return mn}function xc(O,$,de,Ke){var $t=Ke?yl:Ya,mn=-1,rr=$.length,xr=O;for(O===$&&($=Md($)),de&&(xr=Io(O,vu(de)));++mn<rr;)for(var Zr=0,io=$[mn],ho=de?de(io):io;(Zr=$t(xr,ho,Zr,Ke))>-1;)xr!==O&&Me.call(xr,Zr,1),Me.call(O,Zr,1);return O}function Jd(O,$){for(var de=O?$.length:0,Ke=de-1;de--;){var $t=$[de];if(de==Ke||$t!==mn){var mn=$t;pc($t)?Me.call(O,$t,1):Up(O,$t)}}return O}function Bd(O,$){return O+Ta(Bu()*($-O+1))}function Hp(O,$){var de="";if(!O||$<1||$>rt)return de;do{$%2&&(de+=O),($=Ta($/2))&&(O+=O)}while($);return de}function cl(O,$){return Kf(zc(O,$,ip),O+"")}function g_(O){return Jl(rm(O))}function Df(O,$){var de=rm(O);return Ap(de,fc($,0,de.length))}function Ud(O,$,de,Ke){if(!Vu(O))return O;for(var $t=-1,mn=($=xf($,O)).length,rr=mn-1,xr=O;null!=xr&&++$t<mn;){var Zr=nf($[$t]),io=de;if("__proto__"===Zr||"constructor"===Zr||"prototype"===Zr)return O;if($t!=rr){var ho=xr[Zr];(io=Ke?Ke(ho,Zr,xr):a)===a&&(io=Vu(ho)?ho:pc($[$t+1])?[]:{})}fu(xr,Zr,io),xr=xr[Zr]}return O}var cd=Il?function(O,$){return Il.set(O,$),O}:ip,Kl=Qt?function(O,$){return Qt(O,"toString",{configurable:!0,enumerable:!1,value:Z_($),writable:!0})}:ip;function dp(O){return Ap(rm(O))}function dd(O,$,de){var Ke=-1,$t=O.length;$<0&&($=-$>$t?0:$t+$),(de=de>$t?$t:de)<0&&(de+=$t),$t=$>de?0:de-$>>>0,$>>>=0;for(var mn=gr($t);++Ke<$t;)mn[Ke]=O[Ke+$];return mn}function Gh(O,$){var de;return le(O,function(Ke,$t,mn){return!(de=$(Ke,$t,mn))}),!!de}function fh(O,$,de){var Ke=0,$t=null==O?Ke:O.length;if("number"==typeof $&&$==$&&$t<=2147483647){for(;Ke<$t;){var mn=Ke+$t>>>1,rr=O[mn];null!==rr&&!eh(rr)&&(de?rr<=$:rr<$)?Ke=mn+1:$t=mn}return $t}return wf(O,$,ip,de)}function wf(O,$,de,Ke){var $t=0,mn=null==O?0:O.length;if(0===mn)return 0;for(var rr=($=de($))!=$,xr=null===$,Zr=eh($),io=$===a;$t<mn;){var ho=Ta(($t+mn)/2),So=de(O[ho]),bs=So!==a,aa=null===So,Ea=So==So,wl=eh(So);if(rr)var Ra=Ke||Ea;else Ra=io?Ea&&(Ke||bs):xr?Ea&&bs&&(Ke||!aa):Zr?Ea&&bs&&!aa&&(Ke||!wl):!aa&&!wl&&(Ke?So<=$:So<$);Ra?$t=ho+1:mn=ho}return nl(mn,4294967294)}function Bp(O,$){for(var de=-1,Ke=O.length,$t=0,mn=[];++de<Ke;){var rr=O[de],xr=$?$(rr):rr;if(!de||!it(xr,Zr)){var Zr=xr;mn[$t++]=0===rr?0:rr}}return mn}function mf(O){return"number"==typeof O?O:eh(O)?NaN:+O}function rc(O){if("string"==typeof O)return O;if(ai(O))return Io(O,rc)+"";if(eh(O))return Su?Su.call(O):"";var $=O+"";return"0"==$&&1/O==-Bt?"-0":$}function Cd(O,$,de){var Ke=-1,$t=As,mn=O.length,rr=!0,xr=[],Zr=xr;if(de)rr=!1,$t=Ns;else if(mn>=200){var io=$?null:$_(O);if(io)return j(io);rr=!1,$t=ra,Zr=new $d}else Zr=$?[]:xr;e:for(;++Ke<mn;){var ho=O[Ke],So=$?$(ho):ho;if(ho=de||0!==ho?ho:0,rr&&So==So){for(var bs=Zr.length;bs--;)if(Zr[bs]===So)continue e;$&&Zr.push(So),xr.push(ho)}else $t(Zr,So,de)||(Zr!==xr&&Zr.push(So),xr.push(ho))}return xr}function Up(O,$){return null==(O=Qf(O,$=xf($,O)))||delete O[nf(Vc($))]}function ph(O,$,de,Ke){return Ud(O,$,de($i(O,$)),Ke)}function hh(O,$,de,Ke){for(var $t=O.length,mn=Ke?$t:-1;(Ke?mn--:++mn<$t)&&$(O[mn],mn,O););return de?dd(O,Ke?0:mn,Ke?mn+1:$t):dd(O,Ke?mn+1:0,Ke?$t:mn)}function m_(O,$){var de=O;return de instanceof ul&&(de=de.value()),sl($,function(Ke,$t){return $t.func.apply($t.thisArg,Ka([Ke],$t.args))},de)}function _h(O,$,de){var Ke=O.length;if(Ke<2)return Ke?Cd(O[0]):[];for(var $t=-1,mn=gr(Ke);++$t<Ke;)for(var rr=O[$t],xr=-1;++xr<Ke;)xr!=$t&&(mn[$t]=Q(mn[$t]||rr,O[xr],$,de));return Cd(gt(mn,1),$,de)}function vf(O,$,de){for(var Ke=-1,$t=O.length,mn=$.length,rr={};++Ke<$t;)de(rr,O[Ke],Ke<mn?$[Ke]:a);return rr}function yf(O){return Ds(O)?O:[]}function zf(O){return"function"==typeof O?O:ip}function xf(O,$){return ai(O)?O:Jf(O,$)?[O]:Wp(_u(O))}var Ef=cl;function Mu(O,$,de){var Ke=O.length;return de=de===a?Ke:de,!$&&de>=Ke?O:dd(O,$,de)}var Rf=Ln||function(O){return Pl.clearTimeout(O)};function zh(O,$){if($)return O.slice();var de=O.length,Ke=_n?_n(de):new O.constructor(de);return O.copy(Ke),Ke}function Vh(O){var $=new O.constructor(O.byteLength);return new gc($).set(new gc(O)),$}function Zh(O,$){var de=$?Vh(O.buffer):O.buffer;return new O.constructor(de,O.byteOffset,O.length)}function mh(O,$){if(O!==$){var de=O!==a,Ke=null===O,$t=O==O,mn=eh(O),rr=$!==a,xr=null===$,Zr=$==$,io=eh($);if(!xr&&!io&&!mn&&O>$||mn&&rr&&Zr&&!xr&&!io||Ke&&rr&&Zr||!de&&Zr||!$t)return 1;if(!Ke&&!mn&&!io&&O<$||io&&de&&$t&&!Ke&&!mn||xr&&de&&$t||!rr&&$t||!Zr)return-1}return 0}function Ou(O,$,de,Ke){for(var $t=-1,mn=O.length,rr=de.length,xr=-1,Zr=$.length,io=Fa(mn-rr,0),ho=gr(Zr+io),So=!Ke;++xr<Zr;)ho[xr]=$[xr];for(;++$t<rr;)(So||$t<mn)&&(ho[de[$t]]=O[$t]);for(;io--;)ho[xr++]=O[$t++];return ho}function Wh(O,$,de,Ke){for(var $t=-1,mn=O.length,rr=-1,xr=de.length,Zr=-1,io=$.length,ho=Fa(mn-xr,0),So=gr(ho+io),bs=!Ke;++$t<ho;)So[$t]=O[$t];for(var aa=$t;++Zr<io;)So[aa+Zr]=$[Zr];for(;++rr<xr;)(bs||$t<mn)&&(So[aa+de[rr]]=O[$t++]);return So}function Md(O,$){var de=-1,Ke=O.length;for($||($=gr(Ke));++de<Ke;)$[de]=O[de];return $}function Qd(O,$,de,Ke){var $t=!de;de||(de={});for(var mn=-1,rr=$.length;++mn<rr;){var xr=$[mn],Zr=Ke?Ke(de[xr],O[xr],xr,de,O):a;Zr===a&&(Zr=O[xr]),$t?Rl(de,xr,Zr):fu(de,xr,Zr)}return de}function vh(O,$){return function(de,Ke){var $t=ai(de)?zn:dc,mn=$?$():{};return $t(de,O,Ts(Ke,2),mn)}}function yp(O){return cl(function($,de){var Ke=-1,$t=de.length,mn=$t>1?de[$t-1]:a,rr=$t>2?de[2]:a;for(mn=O.length>3&&"function"==typeof mn?($t--,mn):a,rr&&oc(de[0],de[1],rr)&&(mn=$t<3?a:mn,$t=1),$=Ks($);++Ke<$t;){var xr=de[Ke];xr&&O($,xr,Ke,mn)}return $})}function Od(O,$){return function(de,Ke){if(null==de)return de;if(!Jo(de))return O(de,Ke);for(var $t=de.length,mn=$?$t:-1,rr=Ks(de);($?mn--:++mn<$t)&&!1!==Ke(rr[mn],mn,rr););return de}}function E_(O){return function($,de,Ke){for(var $t=-1,mn=Ks($),rr=Ke($),xr=rr.length;xr--;){var Zr=rr[O?xr:++$t];if(!1===de(mn[Zr],Zr,mn))break}return $}}function Qh(O){return function($){var de=Hu($=_u($))?sn($):a,Ke=de?de[0]:$.charAt(0),$t=de?Mu(de,1).join(""):$.slice(1);return Ke[O]()+$t}}function Ad(O){return function($){return sl(fg(Q0($).replace(ne,"")),O,"")}}function hu(O){return function(){var $=arguments;switch($.length){case 0:return new O;case 1:return new O($[0]);case 2:return new O($[0],$[1]);case 3:return new O($[0],$[1],$[2]);case 4:return new O($[0],$[1],$[2],$[3]);case 5:return new O($[0],$[1],$[2],$[3],$[4]);case 6:return new O($[0],$[1],$[2],$[3],$[4],$[5]);case 7:return new O($[0],$[1],$[2],$[3],$[4],$[5],$[6])}var de=yc(O.prototype),Ke=O.apply(de,$);return Vu(Ke)?Ke:de}}function Ep(O){return function($,de,Ke){var $t=Ks($);if(!Jo($)){var mn=Ts(de,3);$=wd($),de=function(xr){return mn($t[xr],xr,$t)}}var rr=O($,de,Ke);return rr>-1?$t[mn?$[rr]:rr]:a}}function Xh(O){return bf(function($){var de=$.length,Ke=de,$t=Xa.prototype.thru;for(O&&$.reverse();Ke--;){var mn=$[Ke];if("function"!=typeof mn)throw new xu(p);if($t&&!rr&&"wrapper"==Rc(mn))var rr=new Xa([],!0)}for(Ke=rr?Ke:de;++Ke<de;){var xr=Rc(mn=$[Ke]),Zr="wrapper"==xr?da(mn):a;rr=Zr&&Vp(Zr[0])&&424==Zr[1]&&!Zr[4].length&&1==Zr[9]?rr[Rc(Zr[0])].apply(rr,Zr[3]):1==mn.length&&Vp(mn)?rr[xr]():rr.thru(mn)}return function(){var io=arguments,ho=io[0];if(rr&&1==io.length&&ai(ho))return rr.plant(ho).value();for(var So=0,bs=de?$[So].apply(this,io):ho;++So<de;)bs=$[So].call(this,bs);return bs}})}function ic(O,$,de,Ke,$t,mn,rr,xr,Zr,io){var ho=128&$,So=1&$,bs=2&$,aa=24&$,Ea=512&$,wl=bs?a:hu(O);return function Ra(){for(var kl=arguments.length,Xl=gr(kl),Bf=kl;Bf--;)Xl[Bf]=arguments[Bf];if(aa)var lf=Fu(Ra),op=ec(Xl,lf);if(Ke&&(Xl=Ou(Xl,Ke,$t,aa)),mn&&(Xl=Wh(Xl,mn,rr,aa)),kl-=op,aa&&kl<io){var Rd=Er(Xl,lf);return S_(O,$,ic,Ra.placeholder,de,Xl,Rd,xr,Zr,io-kl)}var kh=So?de:this,Rp=bs?kh[O]:O;return kl=Xl.length,xr?Xl=fp(Xl,xr):Ea&&kl>1&&Xl.reverse(),ho&&Zr<kl&&(Xl.length=Zr),this&&this!==Pl&&this instanceof Ra&&(Rp=wl||hu(Rp)),Rp.apply(kh,Xl)}}function Kd(O,$){return function(de,Ke){return function wa(O,$,de,Ke){return Bn(O,function($t,mn,rr){$(Ke,de($t),mn,rr)}),Ke}(de,O,$(Ke),{})}}function Vf(O,$){return function(de,Ke){var $t;if(de===a&&Ke===a)return $;if(de!==a&&($t=de),Ke!==a){if($t===a)return Ke;"string"==typeof de||"string"==typeof Ke?(de=rc(de),Ke=rc(Ke)):(de=mf(de),Ke=mf(Ke)),$t=O(de,Ke)}return $t}}function qh(O){return bf(function($){return $=Io($,vu(Ts())),cl(function(de){var Ke=this;return O($,function($t){return jt($t,Ke,de)})})})}function bp(O,$){var de=($=$===a?" ":rc($)).length;if(de<2)return de?Hp($,O):$;var Ke=Hp($,Lo(O/wt($)));return Hu($)?Mu(sn(Ke),0,O).join(""):Ke.slice(0,O)}function Sp(O){return function($,de,Ke){return Ke&&"number"!=typeof Ke&&oc($,de,Ke)&&(de=Ke=a),$=th($),de===a?(de=$,$=0):de=th(de),function dh(O,$,de,Ke){for(var $t=-1,mn=Fa(Lo(($-O)/(de||1)),0),rr=gr(mn);mn--;)rr[Ke?mn:++$t]=O,O+=de;return rr}($,de,Ke=Ke===a?$<de?1:-1:th(Ke),O)}}function yh(O){return function($,de){return"string"==typeof $&&"string"==typeof de||($=Ih($),de=Ih(de)),O($,de)}}function S_(O,$,de,Ke,$t,mn,rr,xr,Zr,io){var ho=8&$;$|=ho?32:64,4&($&=~(ho?64:32))||($&=-4);var wl=[O,$,$t,ho?mn:a,ho?rr:a,ho?a:mn,ho?a:rr,xr,Zr,io],Ra=de.apply(a,wl);return Vp(O)&&Dd(Ra,wl),Ra.placeholder=Ke,i_(Ra,O,$)}function Eh(O){var $=pl[O];return function(de,Ke){if(de=Ih(de),(Ke=null==Ke?0:nl(Dl(Ke),292))&&Ca(de)){var $t=(_u(de)+"e").split("e");return+(($t=(_u($($t[0]+"e"+(+$t[1]+Ke)))+"e").split("e"))[0]+"e"+(+$t[1]-Ke))}return $(de)}}var $_=lu&&1/j(new lu([,-0]))[1]==Bt?function(O){return new lu(O)}:vv;function e_(O){return function($){var de=Gu($);return de==Br?Bo($):de==so?function Ce(kn){var Ar=-1,gr=Array(kn.size);return kn.forEach(function(fo){gr[++Ar]=[fo,fo]}),gr}($):function bl(kn,Ar){return Io(Ar,function(gr){return[gr,kn[gr]]})}($,O($))}}function Xd(O,$,de,Ke,$t,mn,rr,xr){var Zr=2&$;if(!Zr&&"function"!=typeof O)throw new xu(p);var io=Ke?Ke.length:0;if(io||($&=-97,Ke=$t=a),rr=rr===a?rr:Fa(Dl(rr),0),xr=xr===a?xr:Dl(xr),io-=$t?$t.length:0,64&$){var ho=Ke,So=$t;Ke=$t=a}var bs=Zr?a:da(O),aa=[O,$,de,Ke,$t,ho,So,mn,rr,xr];if(bs&&function Dh(O,$){var de=O[1],Ke=$[1],$t=de|Ke;if(!($t<131||(128==Ke&&8==de||128==Ke&&256==de&&O[7].length<=$[8]||384==Ke&&$[7].length<=$[8]&&8==de)))return O;1&Ke&&(O[2]=$[2],$t|=1&de?0:4);var xr=$[3];if(xr){var Zr=O[3];O[3]=Zr?Ou(Zr,xr,$[4]):xr,O[4]=Zr?Er(O[3],R):$[4]}(xr=$[5])&&(O[5]=(Zr=O[5])?Wh(Zr,xr,$[6]):xr,O[6]=Zr?Er(O[5],R):$[6]),(xr=$[7])&&(O[7]=xr),128&Ke&&(O[8]=null==O[8]?$[8]:nl(O[8],$[8])),null==O[9]&&(O[9]=$[9]),O[0]=$[0],O[1]=$t}(aa,bs),O=aa[0],$=aa[1],de=aa[2],Ke=aa[3],$t=aa[4],!(xr=aa[9]=aa[9]===a?Zr?0:O.length:Fa(aa[9]-io,0))&&24&$&&($&=-25),$&&1!=$)Ea=8==$||16==$?function Kh(O,$,de){var Ke=hu(O);return function $t(){for(var mn=arguments.length,rr=gr(mn),xr=mn,Zr=Fu($t);xr--;)rr[xr]=arguments[xr];var io=mn<3&&rr[0]!==Zr&&rr[mn-1]!==Zr?[]:Er(rr,Zr);return(mn-=io.length)<de?S_(O,$,ic,$t.placeholder,a,rr,io,a,a,de-mn):jt(this&&this!==Pl&&this instanceof $t?Ke:O,this,rr)}}(O,$,xr):32!=$&&33!=$||$t.length?ic.apply(a,aa):function b_(O,$,de,Ke){var $t=1&$,mn=hu(O);return function rr(){for(var xr=-1,Zr=arguments.length,io=-1,ho=Ke.length,So=gr(ho+Zr),bs=this&&this!==Pl&&this instanceof rr?mn:O;++io<ho;)So[io]=Ke[io];for(;Zr--;)So[io++]=arguments[++xr];return jt(bs,$t?de:this,So)}}(O,$,de,Ke);else var Ea=function Jh(O,$,de){var Ke=1&$,$t=hu(O);return function mn(){return(this&&this!==Pl&&this instanceof mn?$t:O).apply(Ke?de:this,arguments)}}(O,$,de);return i_((bs?cd:Dd)(Ea,aa),O,$)}function t_(O,$,de,Ke){return O===a||it(O,yd[de])&&!La.call(Ke,de)?$:O}function bh(O,$,de,Ke,$t,mn){return Vu(O)&&Vu($)&&(mn.set($,O),Al(O,$,a,bh,mn),mn.delete($)),O}function n_(O){return cg(O)?a:O}function Zf(O,$,de,Ke,$t,mn){var rr=1&de,xr=O.length,Zr=$.length;if(xr!=Zr&&!(rr&&Zr>xr))return!1;var io=mn.get(O),ho=mn.get($);if(io&&ho)return io==$&&ho==O;var So=-1,bs=!0,aa=2&de?new $d:a;for(mn.set(O,$),mn.set($,O);++So<xr;){var Ea=O[So],wl=$[So];if(Ke)var Ra=rr?Ke(wl,Ea,So,$,O,mn):Ke(Ea,wl,So,O,$,mn);if(Ra!==a){if(Ra)continue;bs=!1;break}if(aa){if(!lt($,function(kl,Xl){if(!ra(aa,Xl)&&(Ea===kl||$t(Ea,kl,de,Ke,mn)))return aa.push(Xl)})){bs=!1;break}}else if(Ea!==wl&&!$t(Ea,wl,de,Ke,mn)){bs=!1;break}}return mn.delete(O),mn.delete($),bs}function bf(O){return Kf(zc(O,a,l_),O+"")}function Th(O){return is(O,wd,Pf)}function Ch(O){return is(O,rp,Cp)}var da=Il?function(O){return Il.get(O)}:vv;function Rc(O){for(var $=O.name+"",de=Cl[$],Ke=La.call(Cl,$)?de.length:0;Ke--;){var $t=de[Ke],mn=$t.func;if(null==mn||mn==O)return $t.name}return $}function Fu(O){return(La.call(tn,"placeholder")?tn:O).placeholder}function Ts(){var O=tn.iteratee||Pm;return O=O===Pm?Tt:O,arguments.length?O(arguments[0],arguments[1]):O}function Nf(O,$){var de=O.__data__;return function Lf(O){var $=typeof O;return"string"==$||"number"==$||"symbol"==$||"boolean"==$?"__proto__"!==O:null===O}($)?de["string"==typeof $?"string":"hash"]:de.map}function jp(O){for(var $=wd(O),de=$.length;de--;){var Ke=$[de],$t=O[Ke];$[de]=[Ke,$t,Oh($t)]}return $}function ku(O,$){var de=function $u(kn,Ar){return null==kn?a:kn[Ar]}(O,$);return rl(de)?de:a}var Pf=_s?function(O){return null==O?[]:(O=Ks(O),js(_s(O),function($){return $e.call(O,$)}))}:Lm,Cp=_s?function(O){for(var $=[];O;)Ka($,Pf(O)),O=pa(O);return $}:Lm,Gu=Eo;function H_(O,$,de){for(var Ke=-1,$t=($=xf($,O)).length,mn=!1;++Ke<$t;){var rr=nf($[Ke]);if(!(mn=null!=O&&de(O,rr)))break;O=O[rr]}return mn||++Ke!=$t?mn:!!($t=null==O?0:O.length)&&hp($t)&&pc(rr,$t)&&(ai(O)||Cr(O))}function If(O){return"function"!=typeof O.constructor||tf(O)?{}:yc(pa(O))}function zp(O){return ai(O)||Cr(O)||!!(_e&&O&&O[_e])}function pc(O,$){var de=typeof O;return!!($=null==$?rt:$)&&("number"==de||"symbol"!=de&&Qn.test(O))&&O>-1&&O%1==0&&O<$}function oc(O,$,de){if(!Vu(de))return!1;var Ke=typeof $;return!!("number"==Ke?Jo(de)&&pc($,de.length):"string"==Ke&&$ in de)&&it(de[$],O)}function Jf(O,$){if(ai(O))return!1;var de=typeof O;return!("number"!=de&&"symbol"!=de&&"boolean"!=de&&null!=O&&!eh(O))||_t.test(O)||!Rn.test(O)||null!=$&&O in Ks($)}function Vp(O){var $=Rc(O),de=tn[$];if("function"!=typeof de||!($ in ul.prototype))return!1;if(O===de)return!0;var Ke=da(de);return!!Ke&&O===Ke[0]}(tc&&Gu(new tc(new ArrayBuffer(1)))!=Gn||bd&&Gu(new bd)!=Br||kc&&Gu(kc.resolve())!=Qr||lu&&Gu(new lu)!=so||Ma&&Gu(new Ma)!=un)&&(Gu=function(O){var $=Eo(O),de=$==dr?O.constructor:a,Ke=de?Xf(de):"";if(Ke)switch(Ke){case hf:return Gn;case zd:return Br;case sd:return Qr;case Ol:return so;case Ll:return un}return $});var ef=Ed?af:yv;function tf(O){var $=O&&O.constructor;return O===("function"==typeof $&&$.prototype||yd)}function Oh(O){return O==O&&!Vu(O)}function Ah(O,$){return function(de){return null!=de&&de[O]===$&&($!==a||O in Ks(de))}}function zc(O,$,de){return $=Fa($===a?O.length-1:$,0),function(){for(var Ke=arguments,$t=-1,mn=Fa(Ke.length-$,0),rr=gr(mn);++$t<mn;)rr[$t]=Ke[$+$t];$t=-1;for(var xr=gr($+1);++$t<$;)xr[$t]=Ke[$t];return xr[$]=de(rr),jt(O,this,xr)}}function Qf(O,$){return $.length<2?O:$i(O,dd($,0,-1))}function fp(O,$){for(var de=O.length,Ke=nl($.length,de),$t=Md(O);Ke--;){var mn=$[Ke];O[Ke]=pc(mn,de)?$t[mn]:a}return O}function Op(O,$){if(("constructor"!==$||"function"!=typeof O[$])&&"__proto__"!=$)return O[$]}var Dd=o_(cd),Zp=ui||function(O,$){return Pl.setTimeout(O,$)},Kf=o_(Kl);function i_(O,$,de){var Ke=$+"";return Kf(O,function zu(O,$){var de=$.length;if(!de)return O;var Ke=de-1;return $[Ke]=(de>1?"& ":"")+$[Ke],$=$.join(de>2?", ":" "),O.replace(mr,"{\n/* [wrapped with "+$+"] */\n")}(Ke,function Jp(O,$){return qr(mt,function(de){var Ke="_."+de[0];$&de[1]&&!As(O,Ke)&&O.push(Ke)}),O.sort()}(function qd(O){var $=O.match(Oi);return $?$[1].split(di):[]}(Ke),de)))}function o_(O){var $=0,de=0;return function(){var Ke=mc(),$t=16-(Ke-de);if(de=Ke,$t>0){if(++$>=800)return arguments[0]}else $=0;return O.apply(a,arguments)}}function Ap(O,$){var de=-1,Ke=O.length,$t=Ke-1;for($=$===a?Ke:$;++de<$;){var mn=Bd(de,$t),rr=O[mn];O[mn]=O[de],O[de]=rr}return O.length=$,O}var Wp=function fd(O){var $=j_(O,function(Ke){return 500===de.size&&de.clear(),Ke}),de=$.cache;return $}(function(O){var $=[];return 46===O.charCodeAt(0)&&$.push(""),O.replace(Rt,function(de,Ke,$t,mn){$.push($t?mn.replace(lo,"$1"):Ke||de)}),$});function nf(O){if("string"==typeof O||eh(O))return O;var $=O+"";return"0"==$&&1/O==-Bt?"-0":$}function Xf(O){if(null!=O){try{return Uc.call(O)}catch($){}try{return O+""}catch($){}}return""}function T_(O){if(O instanceof ul)return O.clone();var $=new Xa(O.__wrapped__,O.__chain__);return $.__actions__=Md(O.__actions__),$.__index__=O.__index__,$.__values__=O.__values__,$}var rg=cl(function(O,$){return Ds(O)?Q(O,gt($,1,Ds,!0)):[]}),Qp=cl(function(O,$){var de=Vc($);return Ds(de)&&(de=a),Ds(O)?Q(O,gt($,1,Ds,!0),Ts(de,2)):[]}),C_=cl(function(O,$){var de=Vc($);return Ds(de)&&(de=a),Ds(O)?Q(O,gt($,1,Ds,!0),a,de):[]});function tp(O,$,de){var Ke=null==O?0:O.length;if(!Ke)return-1;var $t=null==de?0:Dl(de);return $t<0&&($t=Fa(Ke+$t,0)),Wo(O,Ts($,3),$t)}function Kp(O,$,de){var Ke=null==O?0:O.length;if(!Ke)return-1;var $t=Ke-1;return de!==a&&($t=Dl(de),$t=de<0?Fa(Ke+$t,0):nl($t,Ke-1)),Wo(O,Ts($,3),$t,!0)}function l_(O){return null!=O&&O.length?gt(O,1):[]}function Xp(O){return O&&O.length?O[0]:a}var u_=cl(function(O){var $=Io(O,yf);return $.length&&$[0]===O[0]?ja($):[]}),mg=cl(function(O){var $=Vc(O),de=Io(O,yf);return $===Vc(de)?$=a:de.pop(),de.length&&de[0]===O[0]?ja(de,Ts($,2)):[]}),pp=cl(function(O){var $=Vc(O),de=Io(O,yf);return($="function"==typeof $?$:a)&&de.pop(),de.length&&de[0]===O[0]?ja(de,a,$):[]});function Vc(O){var $=null==O?0:O.length;return $?O[$-1]:a}var B_=cl(P);function P(O,$){return O&&O.length&&$&&$.length?xc(O,$):O}var G=bf(function(O,$){var de=null==O?0:O.length,Ke=jc(O,$);return Jd(O,Io($,function($t){return pc($t,de)?+$t:$t}).sort(mh)),Ke});function Ge(O){return null==O?O:Bl.call(O)}var He=cl(function(O){return Cd(gt(O,1,Ds,!0))}),yt=cl(function(O){var $=Vc(O);return Ds($)&&($=a),Cd(gt(O,1,Ds,!0),Ts($,2))}),Wt=cl(function(O){var $=Vc(O);return $="function"==typeof $?$:a,Cd(gt(O,1,Ds,!0),a,$)});function $o(O){if(!O||!O.length)return[];var $=0;return O=js(O,function(de){if(Ds(de))return $=Fa(de.length,$),!0}),qu($,function(de){return Io(O,vd(de))})}function Hs(O,$){if(!O||!O.length)return[];var de=$o(O);return null==$?de:Io(de,function(Ke){return jt($,a,Ke)})}var po=cl(function(O,$){return Ds(O)?Q(O,$):[]}),ds=cl(function(O){return _h(js(O,Ds))}),sa=cl(function(O){var $=Vc(O);return Ds($)&&($=a),_h(js(O,Ds),Ts($,2))}),Js=cl(function(O){var $=Vc(O);return $="function"==typeof $?$:a,_h(js(O,Ds),a,$)}),zr=cl($o),Fi=cl(function(O){var $=O.length,de=$>1?O[$-1]:a;return de="function"==typeof de?(O.pop(),de):a,Hs(O,de)});function ro(O){var $=tn(O);return $.__chain__=!0,$}function ms(O,$){return $(O)}var xa=bf(function(O){var $=O.length,de=$?O[0]:0,Ke=this.__wrapped__,$t=function(mn){return jc(mn,O)};return!($>1||this.__actions__.length)&&Ke instanceof ul&&pc(de)?((Ke=Ke.slice(de,+de+($?1:0))).__actions__.push({func:ms,args:[$t],thisArg:a}),new Xa(Ke,this.__chain__).thru(function(mn){return $&&!mn.length&&mn.push(a),mn})):this.thru($t)}),ag=vh(function(O,$,de){La.call(O,de)?++O[de]:Rl(O,de,1)}),iv=Ep(tp),ov=Ep(Kp);function Zg(O,$){return(ai(O)?qr:le)(O,Ts($,3))}function Em(O,$){return(ai(O)?Di:me)(O,Ts($,3))}var Kc=vh(function(O,$,de){La.call(O,de)?O[de].push($):Rl(O,de,[$])}),iu=cl(function(O,$,de){var Ke=-1,$t="function"==typeof $,mn=Jo(O)?gr(O.length):[];return le(O,function(rr){mn[++Ke]=$t?jt($,rr,de):jl(rr,$,de)}),mn}),bm=vh(function(O,$,de){Rl(O,de,$)});function lg(O,$){return(ai(O)?Io:gs)(O,Ts($,3))}var Xo=vh(function(O,$,de){O[de?0:1].push($)},function(){return[[],[]]}),sv=cl(function(O,$){if(null==O)return[];var de=$.length;return de>1&&oc(O,$[0],$[1])?$=[]:de>2&&oc($[0],$[1],$[2])&&($=[$[0]]),gf(O,gt($,1),[])}),yg=cr||function(){return Pl.Date.now()};function A_(O,$,de){return $=de?a:$,Xd(O,128,a,a,a,a,$=O&&null==$?O.length:$)}function Eg(O,$){var de;if("function"!=typeof $)throw new xu(p);return O=Dl(O),function(){return--O>0&&(de=$.apply(this,arguments)),O<=1&&($=a),de}}var xp=cl(function(O,$,de){var Ke=1;if(de.length){var $t=Er(de,Fu(xp));Ke|=32}return Xd(O,Ke,$,de,$t)}),Y_=cl(function(O,$,de){var Ke=3;if(de.length){var $t=Er(de,Fu(Y_));Ke|=32}return Xd($,Ke,O,de,$t)});function Kg(O,$,de){var Ke,$t,mn,rr,xr,Zr,io=0,ho=!1,So=!1,bs=!0;if("function"!=typeof O)throw new xu(p);function aa(Rd){var kh=Ke,Rp=$t;return Ke=$t=a,io=Rd,rr=O.apply(Rp,kh)}function Ea(Rd){return io=Rd,xr=Zp(kl,$),ho?aa(Rd):rr}function Ra(Rd){var kh=Rd-Zr;return Zr===a||kh>=$||kh<0||So&&Rd-io>=mn}function kl(){var Rd=yg();if(Ra(Rd))return Xl(Rd);xr=Zp(kl,function wl(Rd){var rh=$-(Rd-Zr);return So?nl(rh,mn-(Rd-io)):rh}(Rd))}function Xl(Rd){return xr=a,bs&&Ke?aa(Rd):(Ke=$t=a,rr)}function op(){var Rd=yg(),kh=Ra(Rd);if(Ke=arguments,$t=this,Zr=Rd,kh){if(xr===a)return Ea(Zr);if(So)return Rf(xr),xr=Zp(kl,$),aa(Zr)}return xr===a&&(xr=Zp(kl,$)),rr}return $=Ih($)||0,Vu(de)&&(ho=!!de.leading,mn=(So="maxWait"in de)?Fa(Ih(de.maxWait)||0,$):mn,bs="trailing"in de?!!de.trailing:bs),op.cancel=function Bf(){xr!==a&&Rf(xr),io=0,Ke=Zr=$t=xr=a},op.flush=function lf(){return xr===a?rr:Xl(yg())},op}var bg=cl(function(O,$){return F(O,1,$)}),Sg=cl(function(O,$,de){return F(O,Ih($)||0,de)});function j_(O,$){if("function"!=typeof O||null!=$&&"function"!=typeof $)throw new xu(p);var de=function(){var Ke=arguments,$t=$?$.apply(this,Ke):Ke[0],mn=de.cache;if(mn.has($t))return mn.get($t);var rr=O.apply(this,Ke);return de.cache=mn.set($t,rr)||mn,rr};return de.cache=new(j_.Cache||ad),de}function qp(O){if("function"!=typeof O)throw new xu(p);return function(){var $=arguments;switch($.length){case 0:return!O.call(this);case 1:return!O.call(this,$[0]);case 2:return!O.call(this,$[0],$[1]);case 3:return!O.call(this,$[0],$[1],$[2])}return!O.apply(this,$)}}j_.Cache=ad;var x_=Ef(function(O,$){var de=($=1==$.length&&ai($[0])?Io($[0],vu(Ts())):Io(gt($,1),vu(Ts()))).length;return cl(function(Ke){for(var $t=-1,mn=nl(Ke.length,de);++$t<mn;)Ke[$t]=$[$t].call(this,Ke[$t]);return jt(O,this,Ke)})}),Tm=cl(function(O,$){var de=Er($,Fu(Tm));return Xd(O,32,a,$,de)}),qg=cl(function(O,$){var de=Er($,Fu(qg));return Xd(O,64,a,$,de)}),em=bf(function(O,$){return Xd(O,256,a,a,a,$)});function it(O,$){return O===$||O!=O&&$!=$}var Ft=yh(Gs),Kn=yh(function(O,$){return O>=$}),Cr=pu(function(){return arguments}())?pu:function(O){return Pc(O)&&La.call(O,"callee")&&!$e.call(O,"callee")},ai=gr.isArray,ns=Ml?vu(Ml):function Ga(O){return Pc(O)&&Eo(O)==Jn};function Jo(O){return null!=O&&hp(O.length)&&!af(O)}function Ds(O){return Pc(O)&&Jo(O)}var ou=ha||yv,Ql=Hl?vu(Hl):function Tu(O){return Pc(O)&&Eo(O)==pr};function Ph(O){if(!Pc(O))return!1;var $=Eo(O);return $==mi||"[object DOMException]"==$||"string"==typeof O.message&&"string"==typeof O.name&&!cg(O)}function af(O){if(!Vu(O))return!1;var $=Eo(O);return $==ur||$==$r||"[object AsyncFunction]"==$||"[object Proxy]"==$}function _d(O){return"number"==typeof O&&O==Dl(O)}function hp(O){return"number"==typeof O&&O>-1&&O%1==0&&O<=rt}function Vu(O){var $=typeof O;return null!=O&&("object"==$||"function"==$)}function Pc(O){return null!=O&&"object"==typeof O}var n1=Ua?vu(Ua):function Cu(O){return Pc(O)&&Gu(O)==Br};function Om(O){return"number"==typeof O||Pc(O)&&Eo(O)==Pn}function cg(O){if(!Pc(O)||Eo(O)!=dr)return!1;var $=pa(O);if(null===$)return!0;var de=La.call($,"constructor")&&$.constructor;return"function"==typeof de&&de instanceof de&&Uc.call(de)==No}var Am=Qe?vu(Qe):function K(O){return Pc(O)&&Eo(O)==_i},k0=zt?vu(zt):function Ee(O){return Pc(O)&&Gu(O)==so};function Tg(O){return"string"==typeof O||!ai(O)&&Pc(O)&&Eo(O)==Ro}function eh(O){return"symbol"==typeof O||Pc(O)&&Eo(O)==Sr}var Cg=ot?vu(ot):function et(O){return Pc(O)&&hp(O.length)&&!!zo[Eo(O)]},o1=yh(Si),s1=yh(function(O,$){return O<=$});function d_(O){if(!O)return[];if(Jo(O))return Tg(O)?sn(O):Md(O);if(at&&O[at])return function Fd(kn){for(var Ar,gr=[];!(Ar=kn.next()).done;)gr.push(Ar.value);return gr}(O[at]());var $=Gu(O);return($==Br?Bo:$==so?j:rm)(O)}function th(O){return O?(O=Ih(O))===Bt||O===-Bt?17976931348623157e292*(O<0?-1:1):O==O?O:0:0===O?O:0}function Dl(O){var $=th(O),de=$%1;return $==$?de?$-de:$:0}function a1(O){return O?fc(Dl(O),0,Vt):0}function Ih(O){if("number"==typeof O)return O;if(eh(O))return NaN;if(Vu(O)){var $="function"==typeof O.valueOf?O.valueOf():O;O=Vu($)?$+"":$}if("string"!=typeof O)return 0===O?O:+O;O=su(O);var de=qn.test(O);return de||wn.test(O)?hc(O.slice(2),de?2:8):Ko.test(O)?NaN:+O}function Dm(O){return Qd(O,rp(O))}function _u(O){return null==O?"":rc(O)}var nm=yp(function(O,$){if(tf($)||Jo($))Qd($,wd($),O);else for(var de in $)La.call($,de)&&fu(O,de,$[de])}),u1=yp(function(O,$){Qd($,rp($),O)}),Og=yp(function(O,$,de,Ke){Qd($,rp($),O,Ke)}),c1=yp(function(O,$,de,Ke){Qd($,wd($),O,Ke)}),d1=bf(jc),$0=cl(function(O,$){O=Ks(O);var de=-1,Ke=$.length,$t=Ke>2?$[2]:a;for($t&&oc($[0],$[1],$t)&&(Ke=1);++de<Ke;)for(var mn=$[de],rr=rp(mn),xr=-1,Zr=rr.length;++xr<Zr;){var io=rr[xr],ho=O[io];(ho===a||it(ho,yd[io])&&!La.call(O,io))&&(O[io]=mn[io])}return O}),fv=cl(function(O){return O.push(a,bh),jt(G0,a,O)});function _1(O,$,de){var Ke=null==O?a:$i(O,$);return Ke===a?de:Ke}function g1(O,$){return null!=O&&H_(O,$,qa)}var ib=Kd(function(O,$,de){null!=$&&"function"!=typeof $.toString&&($=Mo.call($)),O[$]=de},Z_(ip)),R_=Kd(function(O,$,de){null!=$&&"function"!=typeof $.toString&&($=Mo.call($)),La.call(O,$)?O[$].push(de):O[$]=[de]},Ts),m1=cl(jl);function wd(O){return Jo(O)?cc(O):Xt(O)}function rp(O){return Jo(O)?cc(O,!0):function Tr(O){if(!Vu(O))return function Mp(O){var $=[];if(null!=O)for(var de in Ks(O))$.push(de);return $}(O);var $=tf(O),de=[];for(var Ke in O)"constructor"==Ke&&($||!La.call(O,Ke))||de.push(Ke);return de}(O)}var wm=yp(function(O,$,de){Al(O,$,de)}),G0=yp(function(O,$,de,Ke){Al(O,$,de,Ke)}),ob=bf(function(O,$){var de={};if(null==O)return de;var Ke=!1;$=Io($,function(mn){return mn=xf(mn,O),Ke||(Ke=mn.length>1),mn}),Qd(O,Ch(O),de),Ke&&(de=h(de,7,n_));for(var $t=$.length;$t--;)Up(de,$[$t]);return de}),z0=bf(function(O,$){return null==O?{}:function Hd(O,$){return __(O,$,function(de,Ke){return g1(O,Ke)})}(O,$)});function ab(O,$){if(null==O)return{};var de=Io(Ch(O),function(Ke){return[Ke]});return $=Ts($),__(O,de,function(Ke,$t){return $(Ke,$t[0])})}var Z0=e_(wd),W0=e_(rp);function rm(O){return null==O?[]:nu(O,wd(O))}var E1=Ad(function(O,$,de){return $=$.toLowerCase(),O+(de?b1($):$)});function b1(O){return V_(_u(O).toLowerCase())}function Q0(O){return(O=_u(O))&&O.replace(Fr,au).replace(Le,"")}var T1=Ad(function(O,$,de){return O+(de?"-":"")+$.toLowerCase()}),Ag=Ad(function(O,$,de){return O+(de?" ":"")+$.toLowerCase()}),C1=Qh("toLowerCase"),Fh=Ad(function(O,$,de){return O+(de?"_":"")+$.toLowerCase()}),im=Ad(function(O,$,de){return O+(de?" ":"")+V_($)}),gv=Ad(function(O,$,de){return O+(de?" ":"")+$.toUpperCase()}),V_=Qh("toUpperCase");function fg(O,$,de){return O=_u(O),($=de?a:$)===a?function wu(kn){return bi.test(kn)}(O)?function gi(kn){return kn.match(on)||[]}(O):function Ut(kn){return kn.match(Uo)||[]}(O):O.match($)||[]}var pg=cl(function(O,$){try{return jt(O,a,$)}catch(de){return Ph(de)?de:new $s(de)}}),wg=bf(function(O,$){return qr($,function(de){de=nf(de),Rl(O,de,xp(O[de],O))}),O});function Z_(O){return function(){return O}}var Pg=Xh(),O1=Xh(!0);function ip(O){return O}function Pm(O){return Tt("function"==typeof O?O:h(O,1))}var D1=cl(function(O,$){return function(de){return jl(de,O,$)}}),w1=cl(function(O,$){return function(de){return jl(O,de,$)}});function Im(O,$,de){var Ke=wd($),$t=Pr($,Ke);null==de&&(!Vu($)||!$t.length&&Ke.length)&&(de=$,$=O,O=this,$t=Pr($,wd($)));var mn=!(Vu(de)&&"chain"in de&&!de.chain),rr=af(O);return qr($t,function(xr){var Zr=$[xr];O[xr]=Zr,rr&&(O.prototype[xr]=function(){var io=this.__chain__;if(mn||io){var ho=O(this.__wrapped__),So=ho.__actions__=Md(this.__actions__);return So.push({func:Zr,args:arguments,thisArg:O}),ho.__chain__=io,ho}return Zr.apply(O,Ka([this.value()],arguments))})}),O}function vv(){}var iy=qh(Io),N1=qh(as),P1=qh(lt);function I1(O){return Jf(O)?vd(nf(O)):function ch(O){return function($){return $i($,O)}}(O)}var L1=Sp(),sy=Sp(!0);function Lm(){return[]}function yv(){return!1}var cy=Vf(function(O,$){return O+$},0),db=Eh("ceil"),fb=Vf(function(O,$){return O/$},1),dy=Eh("floor"),hy=Vf(function(O,$){return O*$},1),$1=Eh("round"),Fm=Vf(function(O,$){return O-$},0);return tn.after=function ug(O,$){if("function"!=typeof $)throw new xu(p);return O=Dl(O),function(){if(--O<1)return $.apply(this,arguments)}},tn.ary=A_,tn.assign=nm,tn.assignIn=u1,tn.assignInWith=Og,tn.assignWith=c1,tn.at=d1,tn.before=Eg,tn.bind=xp,tn.bindAll=wg,tn.bindKey=Y_,tn.castArray=function lv(){if(!arguments.length)return[];var O=arguments[0];return ai(O)?O:[O]},tn.chain=ro,tn.chunk=function qf(O,$,de){$=(de?oc(O,$,de):$===a)?1:Fa(Dl($),0);var Ke=null==O?0:O.length;if(!Ke||$<1)return[];for(var $t=0,mn=0,rr=gr(Lo(Ke/$));$t<Ke;)rr[mn++]=dd(O,$t,$t+=$);return rr},tn.compact=function Dp(O){for(var $=-1,de=null==O?0:O.length,Ke=0,$t=[];++$<de;){var mn=O[$];mn&&($t[Ke++]=mn)}return $t},tn.concat=function s_(){var O=arguments.length;if(!O)return[];for(var $=gr(O-1),de=arguments[0],Ke=O;Ke--;)$[Ke-1]=arguments[Ke];return Ka(ai(de)?Md(de):[de],gt($,1))},tn.cond=function xg(O){var $=null==O?0:O.length,de=Ts();return O=$?Io(O,function(Ke){if("function"!=typeof Ke[1])throw new xu(p);return[de(Ke[0]),Ke[1]]}):[],cl(function(Ke){for(var $t=-1;++$t<$;){var mn=O[$t];if(jt(mn[0],this,Ke))return jt(mn[1],this,Ke)}})},tn.conforms=function Rg(O){return function E(O){var $=wd(O);return function(de){return x(de,O,$)}}(h(O,1))},tn.constant=Z_,tn.countBy=ag,tn.create=function f1(O,$){var de=yc(O);return null==$?de:Zd(de,$)},tn.curry=function D_(O,$,de){var Ke=Xd(O,8,a,a,a,a,a,$=de?a:$);return Ke.placeholder=D_.placeholder,Ke},tn.curryRight=function Sm(O,$,de){var Ke=Xd(O,16,a,a,a,a,a,$=de?a:$);return Ke.placeholder=Sm.placeholder,Ke},tn.debounce=Kg,tn.defaults=$0,tn.defaultsDeep=fv,tn.defer=bg,tn.delay=Sg,tn.difference=rg,tn.differenceBy=Qp,tn.differenceWith=C_,tn.drop=function ep(O,$,de){var Ke=null==O?0:O.length;return Ke?dd(O,($=de||$===a?1:Dl($))<0?0:$,Ke):[]},tn.dropRight=function xh(O,$,de){var Ke=null==O?0:O.length;return Ke?dd(O,0,($=Ke-($=de||$===a?1:Dl($)))<0?0:$):[]},tn.dropRightWhile=function M_(O,$){return O&&O.length?hh(O,Ts($,3),!0,!0):[]},tn.dropWhile=function Sf(O,$){return O&&O.length?hh(O,Ts($,3),!0):[]},tn.fill=function a_(O,$,de,Ke){var $t=null==O?0:O.length;return $t?(de&&"number"!=typeof de&&oc(O,$,de)&&(de=0,Ke=$t),function Je(O,$,de,Ke){var $t=O.length;for((de=Dl(de))<0&&(de=-de>$t?0:$t+de),(Ke=Ke===a||Ke>$t?$t:Dl(Ke))<0&&(Ke+=$t),Ke=de>Ke?0:a1(Ke);de<Ke;)O[de++]=$;return O}(O,$,de,Ke)):[]},tn.filter=function ym(O,$){return(ai(O)?js:ht)(O,Ts($,3))},tn.flatMap=function vg(O,$){return gt(lg(O,$),1)},tn.flatMapDeep=function Tf(O,$){return gt(lg(O,$),Bt)},tn.flatMapDepth=function Vg(O,$,de){return de=de===a?1:Dl(de),gt(lg(O,$),de)},tn.flatten=l_,tn.flattenDeep=function Ff(O){return null!=O&&O.length?gt(O,Bt):[]},tn.flattenDepth=function Rh(O,$){return null!=O&&O.length?gt(O,$=$===a?1:Dl($)):[]},tn.flip=function Xg(O){return Xd(O,512)},tn.flow=Pg,tn.flowRight=O1,tn.fromPairs=function np(O){for(var $=-1,de=null==O?0:O.length,Ke={};++$<de;){var $t=O[$];Ke[$t[0]]=$t[1]}return Ke},tn.functions=function nb(O){return null==O?[]:Pr(O,wd(O))},tn.functionsIn=function gd(O){return null==O?[]:Pr(O,rp(O))},tn.groupBy=Kc,tn.initial=function pd(O){return null!=O&&O.length?dd(O,0,-1):[]},tn.intersection=u_,tn.intersectionBy=mg,tn.intersectionWith=pp,tn.invert=ib,tn.invertBy=R_,tn.invokeMap=iu,tn.iteratee=Pm,tn.keyBy=bm,tn.keys=wd,tn.keysIn=rp,tn.map=lg,tn.mapKeys=function Y0(O,$){var de={};return $=Ts($,3),Bn(O,function(Ke,$t,mn){Rl(de,$(Ke,$t,mn),Ke)}),de},tn.mapValues=function j0(O,$){var de={};return $=Ts($,3),Bn(O,function(Ke,$t,mn){Rl(de,$t,$(Ke,$t,mn))}),de},tn.matches=function A1(O){return Aa(h(O,1))},tn.matchesProperty=function mv(O,$){return ca(O,h($,1))},tn.memoize=j_,tn.merge=wm,tn.mergeWith=G0,tn.method=D1,tn.methodOf=w1,tn.mixin=Im,tn.negate=qp,tn.nthArg=function R1(O){return O=Dl(O),cl(function($){return Gc($,O)})},tn.omit=ob,tn.omitBy=function sb(O,$){return ab(O,qp(Ts($)))},tn.once=function w_(O){return Eg(2,O)},tn.orderBy=function Gl(O,$,de,Ke){return null==O?[]:(ai($)||($=null==$?[]:[$]),ai(de=Ke?a:de)||(de=null==de?[]:[de]),gf(O,$,de))},tn.over=iy,tn.overArgs=x_,tn.overEvery=N1,tn.overSome=P1,tn.partial=Tm,tn.partialRight=qg,tn.partition=Xo,tn.pick=z0,tn.pickBy=ab,tn.property=I1,tn.propertyOf=function oy(O){return function($){return null==O?a:$i(O,$)}},tn.pull=B_,tn.pullAll=P,tn.pullAllBy=function te(O,$,de){return O&&O.length&&$&&$.length?xc(O,$,Ts(de,2)):O},tn.pullAllWith=function b(O,$,de){return O&&O.length&&$&&$.length?xc(O,$,a,de):O},tn.pullAt=G,tn.range=L1,tn.rangeRight=sy,tn.rearg=em,tn.reject=function rf(O,$){return(ai(O)?js:ht)(O,qp(Ts($,3)))},tn.remove=function Te(O,$){var de=[];if(!O||!O.length)return de;var Ke=-1,$t=[],mn=O.length;for($=Ts($,3);++Ke<mn;){var rr=O[Ke];$(rr,Ke,O)&&(de.push(rr),$t.push(Ke))}return Jd(O,$t),de},tn.rest=function Cm(O,$){if("function"!=typeof O)throw new xu(p);return cl(O,$=$===a?$:Dl($))},tn.reverse=Ge,tn.sampleSize=function Jg(O,$,de){return $=(de?oc(O,$,de):$===a)?1:Dl($),(ai(O)?Sc:Df)(O,$)},tn.set=function lb(O,$,de){return null==O?O:Ud(O,$,de)},tn.setWith=function ub(O,$,de,Ke){return Ke="function"==typeof Ke?Ke:a,null==O?O:Ud(O,$,de,Ke)},tn.shuffle=function U_(O){return(ai(O)?Tc:dp)(O)},tn.slice=function an(O,$,de){var Ke=null==O?0:O.length;return Ke?(de&&"number"!=typeof de&&oc(O,$,de)?($=0,de=Ke):($=null==$?0:Dl($),de=de===a?Ke:Dl(de)),dd(O,$,de)):[]},tn.sortBy=sv,tn.sortedUniq=function Ss(O){return O&&O.length?Bp(O):[]},tn.sortedUniqBy=function Yo(O,$){return O&&O.length?Bp(O,Ts($,2)):[]},tn.split=function ny(O,$,de){return de&&"number"!=typeof de&&oc(O,$,de)&&($=de=a),(de=de===a?Vt:de>>>0)?(O=_u(O))&&("string"==typeof $||null!=$&&!Am($))&&!($=rc($))&&Hu(O)?Mu(sn(O),0,de):O.split($,de):[]},tn.spread=function tm(O,$){if("function"!=typeof O)throw new xu(p);return $=null==$?0:Fa(Dl($),0),cl(function(de){var Ke=de[$],$t=Mu(de,0,$);return Ke&&Ka($t,Ke),jt(O,this,$t)})},tn.tail=function ia(O){var $=null==O?0:O.length;return $?dd(O,1,$):[]},tn.take=function v(O,$,de){return O&&O.length?dd(O,0,($=de||$===a?1:Dl($))<0?0:$):[]},tn.takeRight=function D(O,$,de){var Ke=null==O?0:O.length;return Ke?dd(O,($=Ke-($=de||$===a?1:Dl($)))<0?0:$,Ke):[]},tn.takeRightWhile=function B(O,$){return O&&O.length?hh(O,Ts($,3),!1,!0):[]},tn.takeWhile=function ye(O,$){return O&&O.length?hh(O,Ts($,3)):[]},tn.tap=function $a(O,$){return $(O),O},tn.throttle=function t1(O,$,de){var Ke=!0,$t=!0;if("function"!=typeof O)throw new xu(p);return Vu(de)&&(Ke="leading"in de?!!de.leading:Ke,$t="trailing"in de?!!de.trailing:$t),Kg(O,$,{leading:Ke,maxWait:$,trailing:$t})},tn.thru=ms,tn.toArray=d_,tn.toPairs=Z0,tn.toPairsIn=W0,tn.toPath=function sm(O){return ai(O)?Io(O,nf):eh(O)?[O]:Md(Wp(_u(O)))},tn.toPlainObject=Dm,tn.transform=function pv(O,$,de){var Ke=ai(O),$t=Ke||ou(O)||Cg(O);if($=Ts($,4),null==de){var mn=O&&O.constructor;de=$t?Ke?new mn:[]:Vu(O)&&af(mn)?yc(pa(O)):{}}return($t?qr:Bn)(O,function(rr,xr,Zr){return $(de,rr,xr,Zr)}),de},tn.unary=function av(O){return A_(O,1)},tn.union=He,tn.unionBy=yt,tn.unionWith=Wt,tn.uniq=function gn(O){return O&&O.length?Cd(O):[]},tn.uniqBy=function nr(O,$){return O&&O.length?Cd(O,Ts($,2)):[]},tn.uniqWith=function ti(O,$){return $="function"==typeof $?$:a,O&&O.length?Cd(O,a,$):[]},tn.unset=function J0(O,$){return null==O||Up(O,$)},tn.unzip=$o,tn.unzipWith=Hs,tn.update=function v1(O,$,de){return null==O?O:ph(O,$,zf(de))},tn.updateWith=function y1(O,$,de,Ke){return Ke="function"==typeof Ke?Ke:a,null==O?O:ph(O,$,zf(de),Ke)},tn.values=rm,tn.valuesIn=function Lh(O){return null==O?[]:nu(O,rp(O))},tn.without=po,tn.words=fg,tn.wrap=function $f(O,$){return Tm(zf($),O)},tn.xor=ds,tn.xorBy=sa,tn.xorWith=Js,tn.zip=zr,tn.zipObject=function Rr(O,$){return vf(O||[],$||[],fu)},tn.zipObjectDeep=function Ur(O,$){return vf(O||[],$||[],Ud)},tn.zipWith=Fi,tn.entries=Z0,tn.entriesIn=W0,tn.extend=u1,tn.extendWith=Og,Im(tn,tn),tn.add=cy,tn.attempt=pg,tn.camelCase=E1,tn.capitalize=b1,tn.ceil=db,tn.clamp=function xd(O,$,de){return de===a&&(de=$,$=a),de!==a&&(de=(de=Ih(de))==de?de:0),$!==a&&($=($=Ih($))==$?$:0),fc(Ih(O),$,de)},tn.clone=function uv(O){return h(O,4)},tn.cloneDeep=function Z(O){return h(O,5)},tn.cloneDeepWith=function H(O,$){return h(O,5,$="function"==typeof $?$:a)},tn.cloneWith=function I(O,$){return h(O,4,$="function"==typeof $?$:a)},tn.conformsTo=function Se(O,$){return null==$||x(O,$,wd($))},tn.deburr=Q0,tn.defaultTo=function Ng(O,$){return null==O||O!=O?$:O},tn.divide=fb,tn.endsWith=function K0(O,$,de){O=_u(O),$=rc($);var Ke=O.length,$t=de=de===a?Ke:fc(Dl(de),0,Ke);return(de-=$.length)>=0&&O.slice(de,$t)==$},tn.eq=it,tn.escape=function hv(O){return(O=_u(O))&&dt.test(O)?O.replace(Ui,uu):O},tn.escapeRegExp=function S1(O){return(O=_u(O))&&pt.test(O)?O.replace(ct,"\\$&"):O},tn.every=function vm(O,$,de){var Ke=ai(O)?as:Fe;return de&&oc(O,$,de)&&($=a),Ke(O,Ts($,3))},tn.find=iv,tn.findIndex=tp,tn.findKey=function H0(O,$){return pi(O,Ts($,3),Bn)},tn.findLast=ov,tn.findLastIndex=Kp,tn.findLastKey=function B0(O,$){return pi(O,Ts($,3),ar)},tn.floor=dy,tn.forEach=Zg,tn.forEachRight=Em,tn.forIn=function p1(O,$){return null==O?O:nn(O,Ts($,3),rp)},tn.forInRight=function z_(O,$){return null==O?O:$n(O,Ts($,3),rp)},tn.forOwn=function U0(O,$){return O&&Bn(O,Ts($,3))},tn.forOwnRight=function h1(O,$){return O&&ar(O,Ts($,3))},tn.get=_1,tn.gt=Ft,tn.gte=Kn,tn.has=function rb(O,$){return null!=O&&H_(O,$,qs)},tn.hasIn=g1,tn.head=Xp,tn.identity=ip,tn.includes=function Nc(O,$,de,Ke){O=Jo(O)?O:rm(O),de=de&&!Ke?Dl(de):0;var $t=O.length;return de<0&&(de=Fa($t+de,0)),Tg(O)?de<=$t&&O.indexOf($,de)>-1:!!$t&&Ya(O,$,de)>-1},tn.indexOf=function gg(O,$,de){var Ke=null==O?0:O.length;if(!Ke)return-1;var $t=null==de?0:Dl(de);return $t<0&&($t=Fa(Ke+$t,0)),Ya(O,$,$t)},tn.inRange=function xm(O,$,de){return $=th($),de===a?(de=$,$=0):de=th(de),function ka(O,$,de){return O>=nl($,de)&&O<Fa($,de)}(O=Ih(O),$,de)},tn.invoke=m1,tn.isArguments=Cr,tn.isArray=ai,tn.isArrayBuffer=ns,tn.isArrayLike=Jo,tn.isArrayLikeObject=Ds,tn.isBoolean=function hl(O){return!0===O||!1===O||Pc(O)&&Eo(O)==Fn},tn.isBuffer=ou,tn.isDate=Ql,tn.isElement=function Au(O){return Pc(O)&&1===O.nodeType&&!cg(O)},tn.isEmpty=function qc(O){if(null==O)return!0;if(Jo(O)&&(ai(O)||"string"==typeof O||"function"==typeof O.splice||ou(O)||Cg(O)||Cr(O)))return!O.length;var $=Gu(O);if($==Br||$==so)return!O.size;if(tf(O))return!Xt(O).length;for(var de in O)if(La.call(O,de))return!1;return!0},tn.isEqual=function sf(O,$){return Lu(O,$)},tn.isEqualWith=function hd(O,$,de){var Ke=(de="function"==typeof de?de:a)?de(O,$):a;return Ke===a?Lu(O,$,a,de):!!Ke},tn.isError=Ph,tn.isFinite=function G_(O){return"number"==typeof O&&Ca(O)},tn.isFunction=af,tn.isInteger=_d,tn.isLength=hp,tn.isMap=n1,tn.isMatch=function cv(O,$){return O===$||Wd(O,$,jp($))},tn.isMatchWith=function I0(O,$,de){return de="function"==typeof de?de:a,Wd(O,$,jp($),de)},tn.isNaN=function L0(O){return Om(O)&&O!=+O},tn.isNative=function Mm(O){if(ef(O))throw new $s("Unsupported core-js use. Try https://npms.io/search?q=ponyfill.");return rl(O)},tn.isNil=function F0(O){return null==O},tn.isNull=function dv(O){return null===O},tn.isNumber=Om,tn.isObject=Vu,tn.isObjectLike=Pc,tn.isPlainObject=cg,tn.isRegExp=Am,tn.isSafeInteger=function tb(O){return _d(O)&&O>=-rt&&O<=rt},tn.isSet=k0,tn.isString=Tg,tn.isSymbol=eh,tn.isTypedArray=Cg,tn.isUndefined=function r1(O){return O===a},tn.isWeakMap=function i1(O){return Pc(O)&&Gu(O)==un},tn.isWeakSet=function Mg(O){return Pc(O)&&"[object WeakSet]"==Eo(O)},tn.join=function Nh(O,$){return null==O?"":Ru.call(O,$)},tn.kebabCase=T1,tn.last=Vc,tn.lastIndexOf=function ig(O,$,de){var Ke=null==O?0:O.length;if(!Ke)return-1;var $t=Ke;return de!==a&&($t=($t=Dl(de))<0?Fa(Ke+$t,0):nl($t,Ke-1)),$==$?function Mt(kn,Ar,gr){for(var fo=gr+1;fo--;)if(kn[fo]===Ar)return fo;return fo}(O,$,$t):Wo(O,Xu,$t,!0)},tn.lowerCase=Ag,tn.lowerFirst=C1,tn.lt=o1,tn.lte=s1,tn.max=function F1(O){return O&&O.length?Oe(O,ip,Gs):a},tn.maxBy=function pb(O,$){return O&&O.length?Oe(O,Ts($,2),Gs):a},tn.mean=function fy(O){return Lc(O,ip)},tn.meanBy=function Ig(O,$){return Lc(O,Ts($,2))},tn.min=function py(O){return O&&O.length?Oe(O,ip,Si):a},tn.minBy=function k1(O,$){return O&&O.length?Oe(O,Ts($,2),Si):a},tn.stubArray=Lm,tn.stubFalse=yv,tn.stubObject=function ay(){return{}},tn.stubString=function cb(){return""},tn.stubTrue=function ly(){return!0},tn.multiply=hy,tn.nth=function O_(O,$){return O&&O.length?Gc(O,Dl($)):a},tn.noConflict=function x1(){return Pl._===this&&(Pl._=Sa),this},tn.noop=vv,tn.now=yg,tn.pad=function X0(O,$,de){O=_u(O);var Ke=($=Dl($))?wt(O):0;if(!$||Ke>=$)return O;var $t=($-Ke)/2;return bp(Ta($t),de)+O+bp(Lo($t),de)},tn.padEnd=function Dg(O,$,de){O=_u(O);var Ke=($=Dl($))?wt(O):0;return $&&Ke<$?O+bp($-Ke,de):O},tn.padStart=function q0(O,$,de){O=_u(O);var Ke=($=Dl($))?wt(O):0;return $&&Ke<$?bp($-Ke,de)+O:O},tn.parseInt=function ey(O,$,de){return de||null==$?$=0:$&&($=+$),vc(_u(O).replace(kt,""),$||0)},tn.random=function dg(O,$,de){if(de&&"boolean"!=typeof de&&oc(O,$,de)&&($=de=a),de===a&&("boolean"==typeof $?(de=$,$=a):"boolean"==typeof O&&(de=O,O=a)),O===a&&$===a?(O=0,$=1):(O=th(O),$===a?($=O,O=0):$=th($)),O>$){var Ke=O;O=$,$=Ke}if(de||O%1||$%1){var $t=Bu();return nl(O+$t*($-O+Qu("1e-"+(($t+"").length-1))),$)}return Bd(O,$)},tn.reduce=function Nl(O,$,de){var Ke=ai(O)?sl:oa,$t=arguments.length<3;return Ke(O,Ts($,4),de,$t,le)},tn.reduceRight=function Wg(O,$,de){var Ke=ai(O)?Bs:oa,$t=arguments.length<3;return Ke(O,Ts($,4),de,$t,me)},tn.repeat=function ty(O,$,de){return $=(de?oc(O,$,de):$===a)?1:Dl($),Hp(_u(O),$)},tn.replace=function Rm(){var O=arguments,$=_u(O[0]);return O.length<3?$:$.replace(O[1],O[2])},tn.result=function V0(O,$,de){var Ke=-1,$t=($=xf($,O)).length;for($t||($t=1,O=a);++Ke<$t;){var mn=null==O?a:O[nf($[Ke])];mn===a&&(Ke=$t,mn=de),O=af(mn)?mn.call(O):mn}return O},tn.round=$1,tn.runInContext=kn,tn.sample=function Xc(O){return(ai(O)?Jl:g_)(O)},tn.size=function wp(O){if(null==O)return 0;if(Jo(O))return Tg(O)?wt(O):O.length;var $=Gu(O);return $==Br||$==so?O.size:Xt(O).length},tn.snakeCase=Fh,tn.some=function Qg(O,$,de){var Ke=ai(O)?lt:Gh;return de&&oc(O,$,de)&&($=a),Ke(O,Ts($,3))},tn.sortedIndex=function fr(O,$){return fh(O,$)},tn.sortedIndexBy=function wr(O,$,de){return wf(O,$,Ts(de,2))},tn.sortedIndexOf=function ci(O,$){var de=null==O?0:O.length;if(de){var Ke=fh(O,$);if(Ke<de&&it(O[Ke],$))return Ke}return-1},tn.sortedLastIndex=function oi(O,$){return fh(O,$,!0)},tn.sortedLastIndexBy=function ts(O,$,de){return wf(O,$,Ts(de,2),!0)},tn.sortedLastIndexOf=function Do(O,$){if(null!=O&&O.length){var Ke=fh(O,$,!0)-1;if(it(O[Ke],$))return Ke}return-1},tn.startCase=im,tn.startsWith=function ry(O,$,de){return O=_u(O),de=null==de?0:fc(Dl(de),0,O.length),$=rc($),O.slice(de,de+$.length)==$},tn.subtract=Fm,tn.sum=function _y(O){return O&&O.length?ys(O,ip):0},tn.sumBy=function H1(O,$){return O&&O.length?ys(O,Ts($,2)):0},tn.template=function M1(O,$,de){var Ke=tn.templateSettings;de&&oc(O,$,de)&&($=a),O=_u(O),$=Og({},$,Ke,t_);var xr,Zr,$t=Og({},$.imports,Ke.imports,t_),mn=wd($t),rr=nu($t,mn),io=0,ho=$.interpolate||oo,So="__p += '",bs=Wc(($.escape||oo).source+"|"+ho.source+"|"+(ho===Gt?Ai:oo).source+"|"+($.evaluate||oo).source+"|$","g"),aa="//# sourceURL="+(La.call($,"sourceURL")?($.sourceURL+"").replace(/\s/g," "):"lodash.templateSources["+ ++hs+"]")+"\n";O.replace(bs,function(Ra,kl,Xl,Bf,lf,op){return Xl||(Xl=Bf),So+=O.slice(io,op).replace(Li,id),kl&&(xr=!0,So+="' +\n__e("+kl+") +\n'"),lf&&(Zr=!0,So+="';\n"+lf+";\n__p += '"),Xl&&(So+="' +\n((__t = ("+Xl+")) == null ? '' : __t) +\n'"),io=op+Ra.length,Ra}),So+="';\n";var Ea=La.call($,"variable")&&$.variable;if(Ea){if(Qo.test(Ea))throw new $s("Invalid `variable` option passed into `_.template`")}else So="with (obj) {\n"+So+"\n}\n";So=(Zr?So.replace(Sn,""):So).replace(Or,"$1").replace(ri,"$1;"),So="function("+(Ea||"obj")+") {\n"+(Ea?"":"obj || (obj = {});\n")+"var __t, __p = ''"+(xr?", __e = _.escape":"")+(Zr?", __j = Array.prototype.join;\nfunction print() { __p += __j.call(arguments, '') }\n":";\n")+So+"return __p\n}";var wl=pg(function(){return Es(mn,aa+"return "+So).apply(a,rr)});if(wl.source=So,Ph(wl))throw wl;return wl},tn.times=function Ev(O,$){if((O=Dl(O))<1||O>rt)return[];var de=Vt,Ke=nl(O,Vt);$=Ts($),O-=Vt;for(var $t=qu(Ke,$);++de<O;)$(de);return $t},tn.toFinite=th,tn.toInteger=Dl,tn.toLength=a1,tn.toLower=function _v(O){return _u(O).toLowerCase()},tn.toNumber=Ih,tn.toSafeInteger=function l1(O){return O?fc(Dl(O),-rt,rt):0===O?O:0},tn.toString=_u,tn.toUpper=function f_(O){return _u(O).toUpperCase()},tn.trim=function om(O,$,de){if((O=_u(O))&&(de||$===a))return su(O);if(!O||!($=rc($)))return O;var Ke=sn(O),$t=sn($);return Mu(Ke,yu(Ke,$t),rd(Ke,$t)+1).join("")},tn.trimEnd=function Hf(O,$,de){if((O=_u(O))&&(de||$===a))return O.slice(0,Cn(O)+1);if(!O||!($=rc($)))return O;var Ke=sn(O);return Mu(Ke,0,rd(Ke,sn($))+1).join("")},tn.trimStart=function N_(O,$,de){if((O=_u(O))&&(de||$===a))return O.replace(kt,"");if(!O||!($=rc($)))return O;var Ke=sn(O);return Mu(Ke,yu(Ke,sn($))).join("")},tn.truncate=function Nm(O,$){var de=30,Ke="...";if(Vu($)){var $t="separator"in $?$.separator:$t;de="length"in $?Dl($.length):de,Ke="omission"in $?rc($.omission):Ke}var mn=(O=_u(O)).length;if(Hu(O)){var rr=sn(O);mn=rr.length}if(de>=mn)return O;var xr=de-wt(Ke);if(xr<1)return Ke;var Zr=rr?Mu(rr,0,xr).join(""):O.slice(0,xr);if($t===a)return Zr+Ke;if(rr&&(xr+=Zr.length-xr),Am($t)){if(O.slice(xr).search($t)){var io,ho=Zr;for($t.global||($t=Wc($t.source,_u(Fo.exec($t))+"g")),$t.lastIndex=0;io=$t.exec(ho);)var So=io.index;Zr=Zr.slice(0,So===a?xr:So)}}else if(O.indexOf(rc($t),xr)!=xr){var bs=Zr.lastIndexOf($t);bs>-1&&(Zr=Zr.slice(0,bs))}return Zr+Ke},tn.unescape=function nh(O){return(O=_u(O))&&ao.test(O)?O.replace(vi,_r):O},tn.uniqueId=function uy(O){var $=++kd;return _u(O)+$},tn.upperCase=gv,tn.upperFirst=V_,tn.each=Zg,tn.eachRight=Em,tn.first=Xp,Im(tn,function(){var O={};return Bn(tn,function($,de){La.call(tn.prototype,de)||(O[de]=$)}),O}(),{chain:!1}),tn.VERSION="4.17.21",qr(["bind","bindKey","curry","curryRight","partial","partialRight"],function(O){tn[O].placeholder=tn}),qr(["drop","take"],function(O,$){ul.prototype[O]=function(de){de=de===a?1:Fa(Dl(de),0);var Ke=this.__filtered__&&!$?new ul(this):this.clone();return Ke.__filtered__?Ke.__takeCount__=nl(de,Ke.__takeCount__):Ke.__views__.push({size:nl(de,Vt),type:O+(Ke.__dir__<0?"Right":"")}),Ke},ul.prototype[O+"Right"]=function(de){return this.reverse()[O](de).reverse()}}),qr(["filter","map","takeWhile"],function(O,$){var de=$+1,Ke=1==de||3==de;ul.prototype[O]=function($t){var mn=this.clone();return mn.__iteratees__.push({iteratee:Ts($t,3),type:de}),mn.__filtered__=mn.__filtered__||Ke,mn}}),qr(["head","last"],function(O,$){var de="take"+($?"Right":"");ul.prototype[O]=function(){return this[de](1).value()[0]}}),qr(["initial","tail"],function(O,$){var de="drop"+($?"":"Right");ul.prototype[O]=function(){return this.__filtered__?new ul(this):this[de](1)}}),ul.prototype.compact=function(){return this.filter(ip)},ul.prototype.find=function(O){return this.filter(O).head()},ul.prototype.findLast=function(O){return this.reverse().find(O)},ul.prototype.invokeMap=cl(function(O,$){return"function"==typeof O?new ul(this):this.map(function(de){return jl(de,O,$)})}),ul.prototype.reject=function(O){return this.filter(qp(Ts(O)))},ul.prototype.slice=function(O,$){O=Dl(O);var de=this;return de.__filtered__&&(O>0||$<0)?new ul(de):(O<0?de=de.takeRight(-O):O&&(de=de.drop(O)),$!==a&&(de=($=Dl($))<0?de.dropRight(-$):de.take($-O)),de)},ul.prototype.takeRightWhile=function(O){return this.reverse().takeWhile(O).reverse()},ul.prototype.toArray=function(){return this.take(Vt)},Bn(ul.prototype,function(O,$){var de=/^(?:filter|find|map|reject)|While$/.test($),Ke=/^(?:head|last)$/.test($),$t=tn[Ke?"take"+("last"==$?"Right":""):$],mn=Ke||/^find/.test($);!$t||(tn.prototype[$]=function(){var rr=this.__wrapped__,xr=Ke?[1]:arguments,Zr=rr instanceof ul,io=xr[0],ho=Zr||ai(rr),So=function(kl){var Xl=$t.apply(tn,Ka([kl],xr));return Ke&&bs?Xl[0]:Xl};ho&&de&&"function"==typeof io&&1!=io.length&&(Zr=ho=!1);var bs=this.__chain__,aa=!!this.__actions__.length,Ea=mn&&!bs,wl=Zr&&!aa;if(!mn&&ho){rr=wl?rr:new ul(this);var Ra=O.apply(rr,xr);return Ra.__actions__.push({func:ms,args:[So],thisArg:a}),new Xa(Ra,bs)}return Ea&&wl?O.apply(this,xr):(Ra=this.thru(So),Ea?Ke?Ra.value()[0]:Ra.value():Ra)})}),qr(["pop","push","shift","sort","splice","unshift"],function(O){var $=Eu[O],de=/^(?:push|sort|unshift)$/.test(O)?"tap":"thru",Ke=/^(?:pop|shift)$/.test(O);tn.prototype[O]=function(){var $t=arguments;if(Ke&&!this.__chain__){var mn=this.value();return $.apply(ai(mn)?mn:[],$t)}return this[de](function(rr){return $.apply(ai(rr)?rr:[],$t)})}}),Bn(ul.prototype,function(O,$){var de=tn[$];if(de){var Ke=de.name+"";La.call(Cl,Ke)||(Cl[Ke]=[]),Cl[Ke].push({name:$,func:de})}}),Cl[ic(a,2).name]=[{name:"wrapper",func:a}],ul.prototype.clone=function Of(){var O=new ul(this.__wrapped__);return O.__actions__=Md(this.__actions__),O.__dir__=this.__dir__,O.__filtered__=this.__filtered__,O.__iteratees__=Md(this.__iteratees__),O.__takeCount__=this.__takeCount__,O.__views__=Md(this.__views__),O},ul.prototype.reverse=function Yc(){if(this.__filtered__){var O=new ul(this);O.__dir__=-1,O.__filtered__=!0}else(O=this.clone()).__dir__*=-1;return O},ul.prototype.value=function Sd(){var O=this.__wrapped__.value(),$=this.__dir__,de=ai(O),Ke=$<0,$t=de?O.length:0,mn=function Wf(O,$,de){for(var Ke=-1,$t=de.length;++Ke<$t;){var mn=de[Ke],rr=mn.size;switch(mn.type){case"drop":O+=rr;break;case"dropRight":$-=rr;break;case"take":$=nl($,O+rr);break;case"takeRight":O=Fa(O,$-rr)}}return{start:O,end:$}}(0,$t,this.__views__),rr=mn.start,xr=mn.end,Zr=xr-rr,io=Ke?xr:rr-1,ho=this.__iteratees__,So=ho.length,bs=0,aa=nl(Zr,this.__takeCount__);if(!de||!Ke&&$t==Zr&&aa==Zr)return m_(O,this.__actions__);var Ea=[];e:for(;Zr--&&bs<aa;){for(var wl=-1,Ra=O[io+=$];++wl<So;){var kl=ho[wl],Bf=kl.type,lf=(0,kl.iteratee)(Ra);if(2==Bf)Ra=lf;else if(!lf){if(1==Bf)continue e;break e}}Ea[bs++]=Ra}return Ea},tn.prototype.at=xa,tn.prototype.chain=function za(){return ro(this)},tn.prototype.commit=function va(){return new Xa(this.value(),this.__chain__)},tn.prototype.next=function kf(){this.__values__===a&&(this.__values__=d_(this.value()));var O=this.__index__>=this.__values__.length;return{done:O,value:O?a:this.__values__[this.__index__++]}},tn.prototype.plant=function c_(O){for(var $,de=this;de instanceof Nu;){var Ke=T_(de);Ke.__index__=0,Ke.__values__=a,$?$t.__wrapped__=Ke:$=Ke;var $t=Ke;de=de.__wrapped__}return $t.__wrapped__=O,$},tn.prototype.reverse=function sg(){var O=this.__wrapped__;if(O instanceof ul){var $=O;return this.__actions__.length&&($=new ul(this)),($=$.reverse()).__actions__.push({func:ms,args:[Ge],thisArg:a}),new Xa($,this.__chain__)}return this.thru(Ge)},tn.prototype.toJSON=tn.prototype.valueOf=tn.prototype.value=function zg(){return m_(this.__wrapped__,this.__actions__)},tn.prototype.first=tn.prototype.head,at&&(tn.prototype[at]=function og(){return this}),tn}();Pl._=Dr,(r=function(){return Dr}.call(S,i,S,m))!==a&&(m.exports=r)}.call(this)},97425:(m,S,i)=>{var r=i(93177);function f(c,e){if("function"!=typeof c||null!=e&&"function"!=typeof e)throw new TypeError("Expected a function");var p=function(){var y=arguments,T=e?e.apply(this,y):y[0],C=p.cache;if(C.has(T))return C.get(T);var R=c.apply(this,y);return p.cache=C.set(T,R)||C,R};return p.cache=new(f.Cache||r),p}f.Cache=r,m.exports=f},3912:(m,S,i)=>{var r=i(9085),f=i(30906)(function(c,e,p){r(c,e,p)});m.exports=f},30765:(m,S,i)=>{var r=i(27038);m.exports=function(){return r.Date.now()}},12482:(m,S,i)=>{var r=i(14992),a=i(77007),f=i(72064),c=i(64667),e=i(11694),p=i(925),y=i(10058),T=i(51675),z=y(function(W,J){var ee={};if(null==W)return ee;var ce=!1;J=r(J,function(U){return U=c(U,W),ce||(ce=U.length>1),U}),e(W,T(W),ee),ce&&(ee=a(ee,7,p));for(var ie=J.length;ie--;)f(ee,J[ie]);return ee});m.exports=z},63354:(m,S,i)=>{var r=i(68840),a=i(59866),f=i(99743),c=i(82773);m.exports=function e(p){return f(p)?r(c(p)):a(p)}},86101:(m,S,i)=>{var r=i(89731),a=i(59026),f=i(5245),c=i(85105),e=i(81690);m.exports=function p(y,T,C){var R=e(y)?r:c,L=arguments.length<3;return R(y,f(T,4),C,L,a)}},12666:(m,S,i)=>{var r=i(32773);m.exports=function a(f,c,e){return null==f?f:r(f,c,e)}},52190:(m,S,i)=>{var r=i(8141),a=i(5245),f=i(37834),c=i(81690),e=i(71100);m.exports=function p(y,T,C){var R=c(y)?r:f;return C&&e(y,T,C)&&(T=void 0),R(y,a(T,3))}},65336:m=>{m.exports=function S(){return[]}},61711:m=>{m.exports=function S(){return!1}},5152:(m,S,i)=>{var r=i(45038),a=1/0;m.exports=function c(e){return e?(e=r(e))===a||e===-a?17976931348623157e292*(e<0?-1:1):e==e?e:0:0===e?e:0}},32781:(m,S,i)=>{var r=i(5152);m.exports=function a(f){var c=r(f),e=c%1;return c==c?e?c-e:c:0}},69883:(m,S,i)=>{var r=i(41233);m.exports=function a(f){return r(f).toLowerCase()}},45038:(m,S,i)=>{var r=i(13743),a=i(53867),f=i(7786),e=/^[-+]0x[0-9a-f]+$/i,p=/^0b[01]+$/i,y=/^0o[0-7]+$/i,T=parseInt;m.exports=function C(R){if("number"==typeof R)return R;if(f(R))return NaN;if(a(R)){var L="function"==typeof R.valueOf?R.valueOf():R;R=a(L)?L+"":L}if("string"!=typeof R)return 0===R?R:+R;R=r(R);var z=p.test(R);return z||y.test(R)?T(R.slice(2),z?2:8):e.test(R)?NaN:+R}},31413:(m,S,i)=>{var r=i(11694),a=i(42970);m.exports=function f(c){return r(c,a(c))}},41233:(m,S,i)=>{var r=i(68166);m.exports=function a(f){return null==f?"":r(f)}},93890:(m,S,i)=>{var a=i(66803)("toUpperCase");m.exports=a},96590:(m,S,i)=>{var r=i(54561),a=i(59316),f=i(41233),c=i(58863);m.exports=function e(p,y,T){return p=f(p),void 0===(y=T?void 0:y)?a(p)?c(p):r(p):p.match(y)||[]}},31507:(m,S,i)=>{var r=i(23898),a=i(25687);m.exports=function f(c,e){return a(c||[],e||[],r)}},74538:(m,S,i)=>{"use strict";var r=i(7856),a=i(11926);S.highlight=c,S.highlightAuto=function e(ie,U){var we,ue,st,We,se=U||{},ge=se.subset||r.listLanguages(),ae=se.prefix,he=ge.length,be=-1;if(null==ae&&(ae=f),"string"!=typeof ie)throw a("Expected `string` for value, got `%s`",ie);for(ue={relevance:0,language:null,value:[]},we={relevance:0,language:null,value:[]};++be<he;)r.getLanguage(We=ge[be])&&((st=c(We,ie,U)).language=We,st.relevance>ue.relevance&&(ue=st),st.relevance>we.relevance&&(ue=we,we=st));return ue.language&&(we.secondBest=ue),we},S.registerLanguage=function p(ie,U){r.registerLanguage(ie,U)},S.listLanguages=function y(){return r.listLanguages()},S.registerAlias=function T(ie,U){var ge,se=ie;for(ge in U&&((se={})[ie]=U),se)r.registerAliases(se[ge],{languageName:ge})},C.prototype.addText=function z(ie){var se,ge,U=this.stack;""!==ie&&((ge=(se=U[U.length-1]).children[se.children.length-1])&&"text"===ge.type?ge.value+=ie:se.children.push({type:"text",value:ie}))},C.prototype.addKeyword=function R(ie,U){this.openNode(U),this.addText(ie),this.closeNode()},C.prototype.addSublanguage=function L(ie,U){var se=this.stack,ge=se[se.length-1],ae=ie.rootNode.children;ge.children=ge.children.concat(U?{type:"element",tagName:"span",properties:{className:[U]},children:ae}:ae)},C.prototype.openNode=function W(ie){var U=this.stack,ae={type:"element",tagName:"span",properties:{className:[this.options.classPrefix+ie]},children:[]};U[U.length-1].children.push(ae),U.push(ae)},C.prototype.closeNode=function J(){this.stack.pop()},C.prototype.closeAllNodes=ce,C.prototype.finalize=ce,C.prototype.toHTML=function ee(){return""};var f="hljs-";function c(ie,U,se){var be,ge=r.configure({}),he=(se||{}).prefix;if("string"!=typeof ie)throw a("Expected `string` for name, got `%s`",ie);if(!r.getLanguage(ie))throw a("Unknown language: `%s` is not registered",ie);if("string"!=typeof U)throw a("Expected `string` for value, got `%s`",U);if(null==he&&(he=f),r.configure({__emitter:C,classPrefix:he}),be=r.highlight(U,{language:ie,ignoreIllegals:!0}),r.configure(ge||{}),be.errorRaised)throw be.errorRaised;return{relevance:be.relevance,language:be.language,value:be.emitter.rootNode.children}}function C(ie){this.options=ie,this.rootNode={children:[]},this.stack=[this.rootNode]}function ce(){}},26431:function(m,S,i){!function(r){"use strict";r.defineLocale("af",{months:"Januarie_Februarie_Maart_April_Mei_Junie_Julie_Augustus_September_Oktober_November_Desember".split("_"),monthsShort:"Jan_Feb_Mrt_Apr_Mei_Jun_Jul_Aug_Sep_Okt_Nov_Des".split("_"),weekdays:"Sondag_Maandag_Dinsdag_Woensdag_Donderdag_Vrydag_Saterdag".split("_"),weekdaysShort:"Son_Maa_Din_Woe_Don_Vry_Sat".split("_"),weekdaysMin:"So_Ma_Di_Wo_Do_Vr_Sa".split("_"),meridiemParse:/vm|nm/i,isPM:function(f){return/^nm$/i.test(f)},meridiem:function(f,c,e){return f<12?e?"vm":"VM":e?"nm":"NM"},longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd, D MMMM YYYY HH:mm"},calendar:{sameDay:"[Vandag om] LT",nextDay:"[M\xf4re om] LT",nextWeek:"dddd [om] LT",lastDay:"[Gister om] LT",lastWeek:"[Laas] dddd [om] LT",sameElse:"L"},relativeTime:{future:"oor %s",past:"%s gelede",s:"'n paar sekondes",ss:"%d sekondes",m:"'n minuut",mm:"%d minute",h:"'n uur",hh:"%d ure",d:"'n dag",dd:"%d dae",M:"'n maand",MM:"%d maande",y:"'n jaar",yy:"%d jaar"},dayOfMonthOrdinalParse:/\d{1,2}(ste|de)/,ordinal:function(f){return f+(1===f||8===f||f>=20?"ste":"de")},week:{dow:1,doy:4}})}(i(16738))},1616:function(m,S,i){!function(r){"use strict";var a=function(y){return 0===y?0:1===y?1:2===y?2:y%100>=3&&y%100<=10?3:y%100>=11?4:5},f={s:["\u0623\u0642\u0644 \u0645\u0646 \u062b\u0627\u0646\u064a\u0629","\u062b\u0627\u0646\u064a\u0629 \u0648\u0627\u062d\u062f\u0629",["\u062b\u0627\u0646\u064a\u062a\u0627\u0646","\u062b\u0627\u0646\u064a\u062a\u064a\u0646"],"%d \u062b\u0648\u0627\u0646","%d \u062b\u0627\u0646\u064a\u0629","%d \u062b\u0627\u0646\u064a\u0629"],m:["\u0623\u0642\u0644 \u0645\u0646 \u062f\u0642\u064a\u0642\u0629","\u062f\u0642\u064a\u0642\u0629 \u0648\u0627\u062d\u062f\u0629",["\u062f\u0642\u064a\u0642\u062a\u0627\u0646","\u062f\u0642\u064a\u0642\u062a\u064a\u0646"],"%d \u062f\u0642\u0627\u0626\u0642","%d \u062f\u0642\u064a\u0642\u0629","%d \u062f\u0642\u064a\u0642\u0629"],h:["\u0623\u0642\u0644 \u0645\u0646 \u0633\u0627\u0639\u0629","\u0633\u0627\u0639\u0629 \u0648\u0627\u062d\u062f\u0629",["\u0633\u0627\u0639\u062a\u0627\u0646","\u0633\u0627\u0639\u062a\u064a\u0646"],"%d \u0633\u0627\u0639\u0627\u062a","%d \u0633\u0627\u0639\u0629","%d \u0633\u0627\u0639\u0629"],d:["\u0623\u0642\u0644 \u0645\u0646 \u064a\u0648\u0645","\u064a\u0648\u0645 \u0648\u0627\u062d\u062f",["\u064a\u0648\u0645\u0627\u0646","\u064a\u0648\u0645\u064a\u0646"],"%d \u0623\u064a\u0627\u0645","%d \u064a\u0648\u0645\u064b\u0627","%d \u064a\u0648\u0645"],M:["\u0623\u0642\u0644 \u0645\u0646 \u0634\u0647\u0631","\u0634\u0647\u0631 \u0648\u0627\u062d\u062f",["\u0634\u0647\u0631\u0627\u0646","\u0634\u0647\u0631\u064a\u0646"],"%d \u0623\u0634\u0647\u0631","%d \u0634\u0647\u0631\u0627","%d \u0634\u0647\u0631"],y:["\u0623\u0642\u0644 \u0645\u0646 \u0639\u0627\u0645","\u0639\u0627\u0645 \u0648\u0627\u062d\u062f",["\u0639\u0627\u0645\u0627\u0646","\u0639\u0627\u0645\u064a\u0646"],"%d \u0623\u0639\u0648\u0627\u0645","%d \u0639\u0627\u0645\u064b\u0627","%d \u0639\u0627\u0645"]},c=function(y){return function(T,C,R,L){var z=a(T),W=f[y][a(T)];return 2===z&&(W=W[C?0:1]),W.replace(/%d/i,T)}},e=["\u062c\u0627\u0646\u0641\u064a","\u0641\u064a\u0641\u0631\u064a","\u0645\u0627\u0631\u0633","\u0623\u0641\u0631\u064a\u0644","\u0645\u0627\u064a","\u062c\u0648\u0627\u0646","\u062c\u0648\u064a\u0644\u064a\u0629","\u0623\u0648\u062a","\u0633\u0628\u062a\u0645\u0628\u0631","\u0623\u0643\u062a\u0648\u0628\u0631","\u0646\u0648\u0641\u0645\u0628\u0631","\u062f\u064a\u0633\u0645\u0628\u0631"];r.defineLocale("ar-dz",{months:e,monthsShort:e,weekdays:"\u0627\u0644\u0623\u062d\u062f_\u0627\u0644\u0625\u062b\u0646\u064a\u0646_\u0627\u0644\u062b\u0644\u0627\u062b\u0627\u0621_\u0627\u0644\u0623\u0631\u0628\u0639\u0627\u0621_\u0627\u0644\u062e\u0645\u064a\u0633_\u0627\u0644\u062c\u0645\u0639\u0629_\u0627\u0644\u0633\u0628\u062a".split("_"),weekdaysShort:"\u0623\u062d\u062f_\u0625\u062b\u0646\u064a\u0646_\u062b\u0644\u0627\u062b\u0627\u0621_\u0623\u0631\u0628\u0639\u0627\u0621_\u062e\u0645\u064a\u0633_\u062c\u0645\u0639\u0629_\u0633\u0628\u062a".split("_"),weekdaysMin:"\u062d_\u0646_\u062b_\u0631_\u062e_\u062c_\u0633".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"D/\u200fM/\u200fYYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd D MMMM YYYY HH:mm"},meridiemParse:/\u0635|\u0645/,isPM:function(y){return"\u0645"===y},meridiem:function(y,T,C){return y<12?"\u0635":"\u0645"},calendar:{sameDay:"[\u0627\u0644\u064a\u0648\u0645 \u0639\u0646\u062f \u0627\u0644\u0633\u0627\u0639\u0629] LT",nextDay:"[\u063a\u062f\u064b\u0627 \u0639\u0646\u062f \u0627\u0644\u0633\u0627\u0639\u0629] LT",nextWeek:"dddd [\u0639\u0646\u062f \u0627\u0644\u0633\u0627\u0639\u0629] LT",lastDay:"[\u0623\u0645\u0633 \u0639\u0646\u062f \u0627\u0644\u0633\u0627\u0639\u0629] LT",lastWeek:"dddd [\u0639\u0646\u062f \u0627\u0644\u0633\u0627\u0639\u0629] LT",sameElse:"L"},relativeTime:{future:"\u0628\u0639\u062f %s",past:"\u0645\u0646\u0630 %s",s:c("s"),ss:c("s"),m:c("m"),mm:c("m"),h:c("h"),hh:c("h"),d:c("d"),dd:c("d"),M:c("M"),MM:c("M"),y:c("y"),yy:c("y")},postformat:function(y){return y.replace(/,/g,"\u060c")},week:{dow:0,doy:4}})}(i(16738))},9759:function(m,S,i){!function(r){"use strict";r.defineLocale("ar-kw",{months:"\u064a\u0646\u0627\u064a\u0631_\u0641\u0628\u0631\u0627\u064a\u0631_\u0645\u0627\u0631\u0633_\u0623\u0628\u0631\u064a\u0644_\u0645\u0627\u064a_\u064a\u0648\u0646\u064a\u0648_\u064a\u0648\u0644\u064a\u0648\u0632_\u063a\u0634\u062a_\u0634\u062a\u0646\u0628\u0631_\u0623\u0643\u062a\u0648\u0628\u0631_\u0646\u0648\u0646\u0628\u0631_\u062f\u062c\u0646\u0628\u0631".split("_"),monthsShort:"\u064a\u0646\u0627\u064a\u0631_\u0641\u0628\u0631\u0627\u064a\u0631_\u0645\u0627\u0631\u0633_\u0623\u0628\u0631\u064a\u0644_\u0645\u0627\u064a_\u064a\u0648\u0646\u064a\u0648_\u064a\u0648\u0644\u064a\u0648\u0632_\u063a\u0634\u062a_\u0634\u062a\u0646\u0628\u0631_\u0623\u0643\u062a\u0648\u0628\u0631_\u0646\u0648\u0646\u0628\u0631_\u062f\u062c\u0646\u0628\u0631".split("_"),weekdays:"\u0627\u0644\u0623\u062d\u062f_\u0627\u0644\u0625\u062a\u0646\u064a\u0646_\u0627\u0644\u062b\u0644\u0627\u062b\u0627\u0621_\u0627\u0644\u0623\u0631\u0628\u0639\u0627\u0621_\u0627\u0644\u062e\u0645\u064a\u0633_\u0627\u0644\u062c\u0645\u0639\u0629_\u0627\u0644\u0633\u0628\u062a".split("_"),weekdaysShort:"\u0627\u062d\u062f_\u0627\u062a\u0646\u064a\u0646_\u062b\u0644\u0627\u062b\u0627\u0621_\u0627\u0631\u0628\u0639\u0627\u0621_\u062e\u0645\u064a\u0633_\u062c\u0645\u0639\u0629_\u0633\u0628\u062a".split("_"),weekdaysMin:"\u062d_\u0646_\u062b_\u0631_\u062e_\u062c_\u0633".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd D MMMM YYYY HH:mm"},calendar:{sameDay:"[\u0627\u0644\u064a\u0648\u0645 \u0639\u0644\u0649 \u0627\u0644\u0633\u0627\u0639\u0629] LT",nextDay:"[\u063a\u062f\u0627 \u0639\u0644\u0649 \u0627\u0644\u0633\u0627\u0639\u0629] LT",nextWeek:"dddd [\u0639\u0644\u0649 \u0627\u0644\u0633\u0627\u0639\u0629] LT",lastDay:"[\u0623\u0645\u0633 \u0639\u0644\u0649 \u0627\u0644\u0633\u0627\u0639\u0629] LT",lastWeek:"dddd [\u0639\u0644\u0649 \u0627\u0644\u0633\u0627\u0639\u0629] LT",sameElse:"L"},relativeTime:{future:"\u0641\u064a %s",past:"\u0645\u0646\u0630 %s",s:"\u062b\u0648\u0627\u0646",ss:"%d \u062b\u0627\u0646\u064a\u0629",m:"\u062f\u0642\u064a\u0642\u0629",mm:"%d \u062f\u0642\u0627\u0626\u0642",h:"\u0633\u0627\u0639\u0629",hh:"%d \u0633\u0627\u0639\u0627\u062a",d:"\u064a\u0648\u0645",dd:"%d \u0623\u064a\u0627\u0645",M:"\u0634\u0647\u0631",MM:"%d \u0623\u0634\u0647\u0631",y:"\u0633\u0646\u0629",yy:"%d \u0633\u0646\u0648\u0627\u062a"},week:{dow:0,doy:12}})}(i(16738))},43160:function(m,S,i){!function(r){"use strict";var a={1:"1",2:"2",3:"3",4:"4",5:"5",6:"6",7:"7",8:"8",9:"9",0:"0"},f=function(T){return 0===T?0:1===T?1:2===T?2:T%100>=3&&T%100<=10?3:T%100>=11?4:5},c={s:["\u0623\u0642\u0644 \u0645\u0646 \u062b\u0627\u0646\u064a\u0629","\u062b\u0627\u0646\u064a\u0629 \u0648\u0627\u062d\u062f\u0629",["\u062b\u0627\u0646\u064a\u062a\u0627\u0646","\u062b\u0627\u0646\u064a\u062a\u064a\u0646"],"%d \u062b\u0648\u0627\u0646","%d \u062b\u0627\u0646\u064a\u0629","%d \u062b\u0627\u0646\u064a\u0629"],m:["\u0623\u0642\u0644 \u0645\u0646 \u062f\u0642\u064a\u0642\u0629","\u062f\u0642\u064a\u0642\u0629 \u0648\u0627\u062d\u062f\u0629",["\u062f\u0642\u064a\u0642\u062a\u0627\u0646","\u062f\u0642\u064a\u0642\u062a\u064a\u0646"],"%d \u062f\u0642\u0627\u0626\u0642","%d \u062f\u0642\u064a\u0642\u0629","%d \u062f\u0642\u064a\u0642\u0629"],h:["\u0623\u0642\u0644 \u0645\u0646 \u0633\u0627\u0639\u0629","\u0633\u0627\u0639\u0629 \u0648\u0627\u062d\u062f\u0629",["\u0633\u0627\u0639\u062a\u0627\u0646","\u0633\u0627\u0639\u062a\u064a\u0646"],"%d \u0633\u0627\u0639\u0627\u062a","%d \u0633\u0627\u0639\u0629","%d \u0633\u0627\u0639\u0629"],d:["\u0623\u0642\u0644 \u0645\u0646 \u064a\u0648\u0645","\u064a\u0648\u0645 \u0648\u0627\u062d\u062f",["\u064a\u0648\u0645\u0627\u0646","\u064a\u0648\u0645\u064a\u0646"],"%d \u0623\u064a\u0627\u0645","%d \u064a\u0648\u0645\u064b\u0627","%d \u064a\u0648\u0645"],M:["\u0623\u0642\u0644 \u0645\u0646 \u0634\u0647\u0631","\u0634\u0647\u0631 \u0648\u0627\u062d\u062f",["\u0634\u0647\u0631\u0627\u0646","\u0634\u0647\u0631\u064a\u0646"],"%d \u0623\u0634\u0647\u0631","%d \u0634\u0647\u0631\u0627","%d \u0634\u0647\u0631"],y:["\u0623\u0642\u0644 \u0645\u0646 \u0639\u0627\u0645","\u0639\u0627\u0645 \u0648\u0627\u062d\u062f",["\u0639\u0627\u0645\u0627\u0646","\u0639\u0627\u0645\u064a\u0646"],"%d \u0623\u0639\u0648\u0627\u0645","%d \u0639\u0627\u0645\u064b\u0627","%d \u0639\u0627\u0645"]},e=function(T){return function(C,R,L,z){var W=f(C),J=c[T][f(C)];return 2===W&&(J=J[R?0:1]),J.replace(/%d/i,C)}},p=["\u064a\u0646\u0627\u064a\u0631","\u0641\u0628\u0631\u0627\u064a\u0631","\u0645\u0627\u0631\u0633","\u0623\u0628\u0631\u064a\u0644","\u0645\u0627\u064a\u0648","\u064a\u0648\u0646\u064a\u0648","\u064a\u0648\u0644\u064a\u0648","\u0623\u063a\u0633\u0637\u0633","\u0633\u0628\u062a\u0645\u0628\u0631","\u0623\u0643\u062a\u0648\u0628\u0631","\u0646\u0648\u0641\u0645\u0628\u0631","\u062f\u064a\u0633\u0645\u0628\u0631"];r.defineLocale("ar-ly",{months:p,monthsShort:p,weekdays:"\u0627\u0644\u0623\u062d\u062f_\u0627\u0644\u0625\u062b\u0646\u064a\u0646_\u0627\u0644\u062b\u0644\u0627\u062b\u0627\u0621_\u0627\u0644\u0623\u0631\u0628\u0639\u0627\u0621_\u0627\u0644\u062e\u0645\u064a\u0633_\u0627\u0644\u062c\u0645\u0639\u0629_\u0627\u0644\u0633\u0628\u062a".split("_"),weekdaysShort:"\u0623\u062d\u062f_\u0625\u062b\u0646\u064a\u0646_\u062b\u0644\u0627\u062b\u0627\u0621_\u0623\u0631\u0628\u0639\u0627\u0621_\u062e\u0645\u064a\u0633_\u062c\u0645\u0639\u0629_\u0633\u0628\u062a".split("_"),weekdaysMin:"\u062d_\u0646_\u062b_\u0631_\u062e_\u062c_\u0633".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"D/\u200fM/\u200fYYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd D MMMM YYYY HH:mm"},meridiemParse:/\u0635|\u0645/,isPM:function(T){return"\u0645"===T},meridiem:function(T,C,R){return T<12?"\u0635":"\u0645"},calendar:{sameDay:"[\u0627\u0644\u064a\u0648\u0645 \u0639\u0646\u062f \u0627\u0644\u0633\u0627\u0639\u0629] LT",nextDay:"[\u063a\u062f\u064b\u0627 \u0639\u0646\u062f \u0627\u0644\u0633\u0627\u0639\u0629] LT",nextWeek:"dddd [\u0639\u0646\u062f \u0627\u0644\u0633\u0627\u0639\u0629] LT",lastDay:"[\u0623\u0645\u0633 \u0639\u0646\u062f \u0627\u0644\u0633\u0627\u0639\u0629] LT",lastWeek:"dddd [\u0639\u0646\u062f \u0627\u0644\u0633\u0627\u0639\u0629] LT",sameElse:"L"},relativeTime:{future:"\u0628\u0639\u062f %s",past:"\u0645\u0646\u0630 %s",s:e("s"),ss:e("s"),m:e("m"),mm:e("m"),h:e("h"),hh:e("h"),d:e("d"),dd:e("d"),M:e("M"),MM:e("M"),y:e("y"),yy:e("y")},preparse:function(T){return T.replace(/\u060c/g,",")},postformat:function(T){return T.replace(/\d/g,function(C){return a[C]}).replace(/,/g,"\u060c")},week:{dow:6,doy:12}})}(i(16738))},62551:function(m,S,i){!function(r){"use strict";r.defineLocale("ar-ma",{months:"\u064a\u0646\u0627\u064a\u0631_\u0641\u0628\u0631\u0627\u064a\u0631_\u0645\u0627\u0631\u0633_\u0623\u0628\u0631\u064a\u0644_\u0645\u0627\u064a_\u064a\u0648\u0646\u064a\u0648_\u064a\u0648\u0644\u064a\u0648\u0632_\u063a\u0634\u062a_\u0634\u062a\u0646\u0628\u0631_\u0623\u0643\u062a\u0648\u0628\u0631_\u0646\u0648\u0646\u0628\u0631_\u062f\u062c\u0646\u0628\u0631".split("_"),monthsShort:"\u064a\u0646\u0627\u064a\u0631_\u0641\u0628\u0631\u0627\u064a\u0631_\u0645\u0627\u0631\u0633_\u0623\u0628\u0631\u064a\u0644_\u0645\u0627\u064a_\u064a\u0648\u0646\u064a\u0648_\u064a\u0648\u0644\u064a\u0648\u0632_\u063a\u0634\u062a_\u0634\u062a\u0646\u0628\u0631_\u0623\u0643\u062a\u0648\u0628\u0631_\u0646\u0648\u0646\u0628\u0631_\u062f\u062c\u0646\u0628\u0631".split("_"),weekdays:"\u0627\u0644\u0623\u062d\u062f_\u0627\u0644\u0625\u062b\u0646\u064a\u0646_\u0627\u0644\u062b\u0644\u0627\u062b\u0627\u0621_\u0627\u0644\u0623\u0631\u0628\u0639\u0627\u0621_\u0627\u0644\u062e\u0645\u064a\u0633_\u0627\u0644\u062c\u0645\u0639\u0629_\u0627\u0644\u0633\u0628\u062a".split("_"),weekdaysShort:"\u0627\u062d\u062f_\u0627\u062b\u0646\u064a\u0646_\u062b\u0644\u0627\u062b\u0627\u0621_\u0627\u0631\u0628\u0639\u0627\u0621_\u062e\u0645\u064a\u0633_\u062c\u0645\u0639\u0629_\u0633\u0628\u062a".split("_"),weekdaysMin:"\u062d_\u0646_\u062b_\u0631_\u062e_\u062c_\u0633".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd D MMMM YYYY HH:mm"},calendar:{sameDay:"[\u0627\u0644\u064a\u0648\u0645 \u0639\u0644\u0649 \u0627\u0644\u0633\u0627\u0639\u0629] LT",nextDay:"[\u063a\u062f\u0627 \u0639\u0644\u0649 \u0627\u0644\u0633\u0627\u0639\u0629] LT",nextWeek:"dddd [\u0639\u0644\u0649 \u0627\u0644\u0633\u0627\u0639\u0629] LT",lastDay:"[\u0623\u0645\u0633 \u0639\u0644\u0649 \u0627\u0644\u0633\u0627\u0639\u0629] LT",lastWeek:"dddd [\u0639\u0644\u0649 \u0627\u0644\u0633\u0627\u0639\u0629] LT",sameElse:"L"},relativeTime:{future:"\u0641\u064a %s",past:"\u0645\u0646\u0630 %s",s:"\u062b\u0648\u0627\u0646",ss:"%d \u062b\u0627\u0646\u064a\u0629",m:"\u062f\u0642\u064a\u0642\u0629",mm:"%d \u062f\u0642\u0627\u0626\u0642",h:"\u0633\u0627\u0639\u0629",hh:"%d \u0633\u0627\u0639\u0627\u062a",d:"\u064a\u0648\u0645",dd:"%d \u0623\u064a\u0627\u0645",M:"\u0634\u0647\u0631",MM:"%d \u0623\u0634\u0647\u0631",y:"\u0633\u0646\u0629",yy:"%d \u0633\u0646\u0648\u0627\u062a"},week:{dow:1,doy:4}})}(i(16738))},79989:function(m,S,i){!function(r){"use strict";var a={1:"\u0661",2:"\u0662",3:"\u0663",4:"\u0664",5:"\u0665",6:"\u0666",7:"\u0667",8:"\u0668",9:"\u0669",0:"\u0660"},f={"\u0661":"1","\u0662":"2","\u0663":"3","\u0664":"4","\u0665":"5","\u0666":"6","\u0667":"7","\u0668":"8","\u0669":"9","\u0660":"0"};r.defineLocale("ar-sa",{months:"\u064a\u0646\u0627\u064a\u0631_\u0641\u0628\u0631\u0627\u064a\u0631_\u0645\u0627\u0631\u0633_\u0623\u0628\u0631\u064a\u0644_\u0645\u0627\u064a\u0648_\u064a\u0648\u0646\u064a\u0648_\u064a\u0648\u0644\u064a\u0648_\u0623\u063a\u0633\u0637\u0633_\u0633\u0628\u062a\u0645\u0628\u0631_\u0623\u0643\u062a\u0648\u0628\u0631_\u0646\u0648\u0641\u0645\u0628\u0631_\u062f\u064a\u0633\u0645\u0628\u0631".split("_"),monthsShort:"\u064a\u0646\u0627\u064a\u0631_\u0641\u0628\u0631\u0627\u064a\u0631_\u0645\u0627\u0631\u0633_\u0623\u0628\u0631\u064a\u0644_\u0645\u0627\u064a\u0648_\u064a\u0648\u0646\u064a\u0648_\u064a\u0648\u0644\u064a\u0648_\u0623\u063a\u0633\u0637\u0633_\u0633\u0628\u062a\u0645\u0628\u0631_\u0623\u0643\u062a\u0648\u0628\u0631_\u0646\u0648\u0641\u0645\u0628\u0631_\u062f\u064a\u0633\u0645\u0628\u0631".split("_"),weekdays:"\u0627\u0644\u0623\u062d\u062f_\u0627\u0644\u0625\u062b\u0646\u064a\u0646_\u0627\u0644\u062b\u0644\u0627\u062b\u0627\u0621_\u0627\u0644\u0623\u0631\u0628\u0639\u0627\u0621_\u0627\u0644\u062e\u0645\u064a\u0633_\u0627\u0644\u062c\u0645\u0639\u0629_\u0627\u0644\u0633\u0628\u062a".split("_"),weekdaysShort:"\u0623\u062d\u062f_\u0625\u062b\u0646\u064a\u0646_\u062b\u0644\u0627\u062b\u0627\u0621_\u0623\u0631\u0628\u0639\u0627\u0621_\u062e\u0645\u064a\u0633_\u062c\u0645\u0639\u0629_\u0633\u0628\u062a".split("_"),weekdaysMin:"\u062d_\u0646_\u062b_\u0631_\u062e_\u062c_\u0633".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd D MMMM YYYY HH:mm"},meridiemParse:/\u0635|\u0645/,isPM:function(e){return"\u0645"===e},meridiem:function(e,p,y){return e<12?"\u0635":"\u0645"},calendar:{sameDay:"[\u0627\u0644\u064a\u0648\u0645 \u0639\u0644\u0649 \u0627\u0644\u0633\u0627\u0639\u0629] LT",nextDay:"[\u063a\u062f\u0627 \u0639\u0644\u0649 \u0627\u0644\u0633\u0627\u0639\u0629] LT",nextWeek:"dddd [\u0639\u0644\u0649 \u0627\u0644\u0633\u0627\u0639\u0629] LT",lastDay:"[\u0623\u0645\u0633 \u0639\u0644\u0649 \u0627\u0644\u0633\u0627\u0639\u0629] LT",lastWeek:"dddd [\u0639\u0644\u0649 \u0627\u0644\u0633\u0627\u0639\u0629] LT",sameElse:"L"},relativeTime:{future:"\u0641\u064a %s",past:"\u0645\u0646\u0630 %s",s:"\u062b\u0648\u0627\u0646",ss:"%d \u062b\u0627\u0646\u064a\u0629",m:"\u062f\u0642\u064a\u0642\u0629",mm:"%d \u062f\u0642\u0627\u0626\u0642",h:"\u0633\u0627\u0639\u0629",hh:"%d \u0633\u0627\u0639\u0627\u062a",d:"\u064a\u0648\u0645",dd:"%d \u0623\u064a\u0627\u0645",M:"\u0634\u0647\u0631",MM:"%d \u0623\u0634\u0647\u0631",y:"\u0633\u0646\u0629",yy:"%d \u0633\u0646\u0648\u0627\u062a"},preparse:function(e){return e.replace(/[\u0661\u0662\u0663\u0664\u0665\u0666\u0667\u0668\u0669\u0660]/g,function(p){return f[p]}).replace(/\u060c/g,",")},postformat:function(e){return e.replace(/\d/g,function(p){return a[p]}).replace(/,/g,"\u060c")},week:{dow:0,doy:6}})}(i(16738))},6962:function(m,S,i){!function(r){"use strict";r.defineLocale("ar-tn",{months:"\u062c\u0627\u0646\u0641\u064a_\u0641\u064a\u0641\u0631\u064a_\u0645\u0627\u0631\u0633_\u0623\u0641\u0631\u064a\u0644_\u0645\u0627\u064a_\u062c\u0648\u0627\u0646_\u062c\u0648\u064a\u0644\u064a\u0629_\u0623\u0648\u062a_\u0633\u0628\u062a\u0645\u0628\u0631_\u0623\u0643\u062a\u0648\u0628\u0631_\u0646\u0648\u0641\u0645\u0628\u0631_\u062f\u064a\u0633\u0645\u0628\u0631".split("_"),monthsShort:"\u062c\u0627\u0646\u0641\u064a_\u0641\u064a\u0641\u0631\u064a_\u0645\u0627\u0631\u0633_\u0623\u0641\u0631\u064a\u0644_\u0645\u0627\u064a_\u062c\u0648\u0627\u0646_\u062c\u0648\u064a\u0644\u064a\u0629_\u0623\u0648\u062a_\u0633\u0628\u062a\u0645\u0628\u0631_\u0623\u0643\u062a\u0648\u0628\u0631_\u0646\u0648\u0641\u0645\u0628\u0631_\u062f\u064a\u0633\u0645\u0628\u0631".split("_"),weekdays:"\u0627\u0644\u0623\u062d\u062f_\u0627\u0644\u0625\u062b\u0646\u064a\u0646_\u0627\u0644\u062b\u0644\u0627\u062b\u0627\u0621_\u0627\u0644\u0623\u0631\u0628\u0639\u0627\u0621_\u0627\u0644\u062e\u0645\u064a\u0633_\u0627\u0644\u062c\u0645\u0639\u0629_\u0627\u0644\u0633\u0628\u062a".split("_"),weekdaysShort:"\u0623\u062d\u062f_\u0625\u062b\u0646\u064a\u0646_\u062b\u0644\u0627\u062b\u0627\u0621_\u0623\u0631\u0628\u0639\u0627\u0621_\u062e\u0645\u064a\u0633_\u062c\u0645\u0639\u0629_\u0633\u0628\u062a".split("_"),weekdaysMin:"\u062d_\u0646_\u062b_\u0631_\u062e_\u062c_\u0633".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd D MMMM YYYY HH:mm"},calendar:{sameDay:"[\u0627\u0644\u064a\u0648\u0645 \u0639\u0644\u0649 \u0627\u0644\u0633\u0627\u0639\u0629] LT",nextDay:"[\u063a\u062f\u0627 \u0639\u0644\u0649 \u0627\u0644\u0633\u0627\u0639\u0629] LT",nextWeek:"dddd [\u0639\u0644\u0649 \u0627\u0644\u0633\u0627\u0639\u0629] LT",lastDay:"[\u0623\u0645\u0633 \u0639\u0644\u0649 \u0627\u0644\u0633\u0627\u0639\u0629] LT",lastWeek:"dddd [\u0639\u0644\u0649 \u0627\u0644\u0633\u0627\u0639\u0629] LT",sameElse:"L"},relativeTime:{future:"\u0641\u064a %s",past:"\u0645\u0646\u0630 %s",s:"\u062b\u0648\u0627\u0646",ss:"%d \u062b\u0627\u0646\u064a\u0629",m:"\u062f\u0642\u064a\u0642\u0629",mm:"%d \u062f\u0642\u0627\u0626\u0642",h:"\u0633\u0627\u0639\u0629",hh:"%d \u0633\u0627\u0639\u0627\u062a",d:"\u064a\u0648\u0645",dd:"%d \u0623\u064a\u0627\u0645",M:"\u0634\u0647\u0631",MM:"%d \u0623\u0634\u0647\u0631",y:"\u0633\u0646\u0629",yy:"%d \u0633\u0646\u0648\u0627\u062a"},week:{dow:1,doy:4}})}(i(16738))},81286:function(m,S,i){!function(r){"use strict";var a={1:"\u0661",2:"\u0662",3:"\u0663",4:"\u0664",5:"\u0665",6:"\u0666",7:"\u0667",8:"\u0668",9:"\u0669",0:"\u0660"},f={"\u0661":"1","\u0662":"2","\u0663":"3","\u0664":"4","\u0665":"5","\u0666":"6","\u0667":"7","\u0668":"8","\u0669":"9","\u0660":"0"},c=function(C){return 0===C?0:1===C?1:2===C?2:C%100>=3&&C%100<=10?3:C%100>=11?4:5},e={s:["\u0623\u0642\u0644 \u0645\u0646 \u062b\u0627\u0646\u064a\u0629","\u062b\u0627\u0646\u064a\u0629 \u0648\u0627\u062d\u062f\u0629",["\u062b\u0627\u0646\u064a\u062a\u0627\u0646","\u062b\u0627\u0646\u064a\u062a\u064a\u0646"],"%d \u062b\u0648\u0627\u0646","%d \u062b\u0627\u0646\u064a\u0629","%d \u062b\u0627\u0646\u064a\u0629"],m:["\u0623\u0642\u0644 \u0645\u0646 \u062f\u0642\u064a\u0642\u0629","\u062f\u0642\u064a\u0642\u0629 \u0648\u0627\u062d\u062f\u0629",["\u062f\u0642\u064a\u0642\u062a\u0627\u0646","\u062f\u0642\u064a\u0642\u062a\u064a\u0646"],"%d \u062f\u0642\u0627\u0626\u0642","%d \u062f\u0642\u064a\u0642\u0629","%d \u062f\u0642\u064a\u0642\u0629"],h:["\u0623\u0642\u0644 \u0645\u0646 \u0633\u0627\u0639\u0629","\u0633\u0627\u0639\u0629 \u0648\u0627\u062d\u062f\u0629",["\u0633\u0627\u0639\u062a\u0627\u0646","\u0633\u0627\u0639\u062a\u064a\u0646"],"%d \u0633\u0627\u0639\u0627\u062a","%d \u0633\u0627\u0639\u0629","%d \u0633\u0627\u0639\u0629"],d:["\u0623\u0642\u0644 \u0645\u0646 \u064a\u0648\u0645","\u064a\u0648\u0645 \u0648\u0627\u062d\u062f",["\u064a\u0648\u0645\u0627\u0646","\u064a\u0648\u0645\u064a\u0646"],"%d \u0623\u064a\u0627\u0645","%d \u064a\u0648\u0645\u064b\u0627","%d \u064a\u0648\u0645"],M:["\u0623\u0642\u0644 \u0645\u0646 \u0634\u0647\u0631","\u0634\u0647\u0631 \u0648\u0627\u062d\u062f",["\u0634\u0647\u0631\u0627\u0646","\u0634\u0647\u0631\u064a\u0646"],"%d \u0623\u0634\u0647\u0631","%d \u0634\u0647\u0631\u0627","%d \u0634\u0647\u0631"],y:["\u0623\u0642\u0644 \u0645\u0646 \u0639\u0627\u0645","\u0639\u0627\u0645 \u0648\u0627\u062d\u062f",["\u0639\u0627\u0645\u0627\u0646","\u0639\u0627\u0645\u064a\u0646"],"%d \u0623\u0639\u0648\u0627\u0645","%d \u0639\u0627\u0645\u064b\u0627","%d \u0639\u0627\u0645"]},p=function(C){return function(R,L,z,W){var J=c(R),ee=e[C][c(R)];return 2===J&&(ee=ee[L?0:1]),ee.replace(/%d/i,R)}},y=["\u064a\u0646\u0627\u064a\u0631","\u0641\u0628\u0631\u0627\u064a\u0631","\u0645\u0627\u0631\u0633","\u0623\u0628\u0631\u064a\u0644","\u0645\u0627\u064a\u0648","\u064a\u0648\u0646\u064a\u0648","\u064a\u0648\u0644\u064a\u0648","\u0623\u063a\u0633\u0637\u0633","\u0633\u0628\u062a\u0645\u0628\u0631","\u0623\u0643\u062a\u0648\u0628\u0631","\u0646\u0648\u0641\u0645\u0628\u0631","\u062f\u064a\u0633\u0645\u0628\u0631"];r.defineLocale("ar",{months:y,monthsShort:y,weekdays:"\u0627\u0644\u0623\u062d\u062f_\u0627\u0644\u0625\u062b\u0646\u064a\u0646_\u0627\u0644\u062b\u0644\u0627\u062b\u0627\u0621_\u0627\u0644\u0623\u0631\u0628\u0639\u0627\u0621_\u0627\u0644\u062e\u0645\u064a\u0633_\u0627\u0644\u062c\u0645\u0639\u0629_\u0627\u0644\u0633\u0628\u062a".split("_"),weekdaysShort:"\u0623\u062d\u062f_\u0625\u062b\u0646\u064a\u0646_\u062b\u0644\u0627\u062b\u0627\u0621_\u0623\u0631\u0628\u0639\u0627\u0621_\u062e\u0645\u064a\u0633_\u062c\u0645\u0639\u0629_\u0633\u0628\u062a".split("_"),weekdaysMin:"\u062d_\u0646_\u062b_\u0631_\u062e_\u062c_\u0633".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"D/\u200fM/\u200fYYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd D MMMM YYYY HH:mm"},meridiemParse:/\u0635|\u0645/,isPM:function(C){return"\u0645"===C},meridiem:function(C,R,L){return C<12?"\u0635":"\u0645"},calendar:{sameDay:"[\u0627\u0644\u064a\u0648\u0645 \u0639\u0646\u062f \u0627\u0644\u0633\u0627\u0639\u0629] LT",nextDay:"[\u063a\u062f\u064b\u0627 \u0639\u0646\u062f \u0627\u0644\u0633\u0627\u0639\u0629] LT",nextWeek:"dddd [\u0639\u0646\u062f \u0627\u0644\u0633\u0627\u0639\u0629] LT",lastDay:"[\u0623\u0645\u0633 \u0639\u0646\u062f \u0627\u0644\u0633\u0627\u0639\u0629] LT",lastWeek:"dddd [\u0639\u0646\u062f \u0627\u0644\u0633\u0627\u0639\u0629] LT",sameElse:"L"},relativeTime:{future:"\u0628\u0639\u062f %s",past:"\u0645\u0646\u0630 %s",s:p("s"),ss:p("s"),m:p("m"),mm:p("m"),h:p("h"),hh:p("h"),d:p("d"),dd:p("d"),M:p("M"),MM:p("M"),y:p("y"),yy:p("y")},preparse:function(C){return C.replace(/[\u0661\u0662\u0663\u0664\u0665\u0666\u0667\u0668\u0669\u0660]/g,function(R){return f[R]}).replace(/\u060c/g,",")},postformat:function(C){return C.replace(/\d/g,function(R){return a[R]}).replace(/,/g,"\u060c")},week:{dow:6,doy:12}})}(i(16738))},15887:function(m,S,i){!function(r){"use strict";var a={1:"-inci",5:"-inci",8:"-inci",70:"-inci",80:"-inci",2:"-nci",7:"-nci",20:"-nci",50:"-nci",3:"-\xfcnc\xfc",4:"-\xfcnc\xfc",100:"-\xfcnc\xfc",6:"-nc\u0131",9:"-uncu",10:"-uncu",30:"-uncu",60:"-\u0131nc\u0131",90:"-\u0131nc\u0131"};r.defineLocale("az",{months:"yanvar_fevral_mart_aprel_may_iyun_iyul_avqust_sentyabr_oktyabr_noyabr_dekabr".split("_"),monthsShort:"yan_fev_mar_apr_may_iyn_iyl_avq_sen_okt_noy_dek".split("_"),weekdays:"Bazar_Bazar ert\u0259si_\xc7\u0259r\u015f\u0259nb\u0259 ax\u015fam\u0131_\xc7\u0259r\u015f\u0259nb\u0259_C\xfcm\u0259 ax\u015fam\u0131_C\xfcm\u0259_\u015e\u0259nb\u0259".split("_"),weekdaysShort:"Baz_BzE_\xc7Ax_\xc7\u0259r_CAx_C\xfcm_\u015e\u0259n".split("_"),weekdaysMin:"Bz_BE_\xc7A_\xc7\u0259_CA_C\xfc_\u015e\u0259".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD.MM.YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd, D MMMM YYYY HH:mm"},calendar:{sameDay:"[bug\xfcn saat] LT",nextDay:"[sabah saat] LT",nextWeek:"[g\u0259l\u0259n h\u0259ft\u0259] dddd [saat] LT",lastDay:"[d\xfcn\u0259n] LT",lastWeek:"[ke\xe7\u0259n h\u0259ft\u0259] dddd [saat] LT",sameElse:"L"},relativeTime:{future:"%s sonra",past:"%s \u0259vv\u0259l",s:"bir ne\xe7\u0259 saniy\u0259",ss:"%d saniy\u0259",m:"bir d\u0259qiq\u0259",mm:"%d d\u0259qiq\u0259",h:"bir saat",hh:"%d saat",d:"bir g\xfcn",dd:"%d g\xfcn",M:"bir ay",MM:"%d ay",y:"bir il",yy:"%d il"},meridiemParse:/gec\u0259|s\u0259h\u0259r|g\xfcnd\xfcz|ax\u015fam/,isPM:function(c){return/^(g\xfcnd\xfcz|ax\u015fam)$/.test(c)},meridiem:function(c,e,p){return c<4?"gec\u0259":c<12?"s\u0259h\u0259r":c<17?"g\xfcnd\xfcz":"ax\u015fam"},dayOfMonthOrdinalParse:/\d{1,2}-(\u0131nc\u0131|inci|nci|\xfcnc\xfc|nc\u0131|uncu)/,ordinal:function(c){if(0===c)return c+"-\u0131nc\u0131";var e=c%10;return c+(a[e]||a[c%100-e]||a[c>=100?100:null])},week:{dow:1,doy:7}})}(i(16738))},14572:function(m,S,i){!function(r){"use strict";function f(e,p,y){return"m"===y?p?"\u0445\u0432\u0456\u043b\u0456\u043d\u0430":"\u0445\u0432\u0456\u043b\u0456\u043d\u0443":"h"===y?p?"\u0433\u0430\u0434\u0437\u0456\u043d\u0430":"\u0433\u0430\u0434\u0437\u0456\u043d\u0443":e+" "+function a(e,p){var y=e.split("_");return p%10==1&&p%100!=11?y[0]:p%10>=2&&p%10<=4&&(p%100<10||p%100>=20)?y[1]:y[2]}({ss:p?"\u0441\u0435\u043a\u0443\u043d\u0434\u0430_\u0441\u0435\u043a\u0443\u043d\u0434\u044b_\u0441\u0435\u043a\u0443\u043d\u0434":"\u0441\u0435\u043a\u0443\u043d\u0434\u0443_\u0441\u0435\u043a\u0443\u043d\u0434\u044b_\u0441\u0435\u043a\u0443\u043d\u0434",mm:p?"\u0445\u0432\u0456\u043b\u0456\u043d\u0430_\u0445\u0432\u0456\u043b\u0456\u043d\u044b_\u0445\u0432\u0456\u043b\u0456\u043d":"\u0445\u0432\u0456\u043b\u0456\u043d\u0443_\u0445\u0432\u0456\u043b\u0456\u043d\u044b_\u0445\u0432\u0456\u043b\u0456\u043d",hh:p?"\u0433\u0430\u0434\u0437\u0456\u043d\u0430_\u0433\u0430\u0434\u0437\u0456\u043d\u044b_\u0433\u0430\u0434\u0437\u0456\u043d":"\u0433\u0430\u0434\u0437\u0456\u043d\u0443_\u0433\u0430\u0434\u0437\u0456\u043d\u044b_\u0433\u0430\u0434\u0437\u0456\u043d",dd:"\u0434\u0437\u0435\u043d\u044c_\u0434\u043d\u0456_\u0434\u0437\u0451\u043d",MM:"\u043c\u0435\u0441\u044f\u0446_\u043c\u0435\u0441\u044f\u0446\u044b_\u043c\u0435\u0441\u044f\u0446\u0430\u045e",yy:"\u0433\u043e\u0434_\u0433\u0430\u0434\u044b_\u0433\u0430\u0434\u043e\u045e"}[y],+e)}r.defineLocale("be",{months:{format:"\u0441\u0442\u0443\u0434\u0437\u0435\u043d\u044f_\u043b\u044e\u0442\u0430\u0433\u0430_\u0441\u0430\u043a\u0430\u0432\u0456\u043a\u0430_\u043a\u0440\u0430\u0441\u0430\u0432\u0456\u043a\u0430_\u0442\u0440\u0430\u045e\u043d\u044f_\u0447\u044d\u0440\u0432\u0435\u043d\u044f_\u043b\u0456\u043f\u0435\u043d\u044f_\u0436\u043d\u0456\u045e\u043d\u044f_\u0432\u0435\u0440\u0430\u0441\u043d\u044f_\u043a\u0430\u0441\u0442\u0440\u044b\u0447\u043d\u0456\u043a\u0430_\u043b\u0456\u0441\u0442\u0430\u043f\u0430\u0434\u0430_\u0441\u043d\u0435\u0436\u043d\u044f".split("_"),standalone:"\u0441\u0442\u0443\u0434\u0437\u0435\u043d\u044c_\u043b\u044e\u0442\u044b_\u0441\u0430\u043a\u0430\u0432\u0456\u043a_\u043a\u0440\u0430\u0441\u0430\u0432\u0456\u043a_\u0442\u0440\u0430\u0432\u0435\u043d\u044c_\u0447\u044d\u0440\u0432\u0435\u043d\u044c_\u043b\u0456\u043f\u0435\u043d\u044c_\u0436\u043d\u0456\u0432\u0435\u043d\u044c_\u0432\u0435\u0440\u0430\u0441\u0435\u043d\u044c_\u043a\u0430\u0441\u0442\u0440\u044b\u0447\u043d\u0456\u043a_\u043b\u0456\u0441\u0442\u0430\u043f\u0430\u0434_\u0441\u043d\u0435\u0436\u0430\u043d\u044c".split("_")},monthsShort:"\u0441\u0442\u0443\u0434_\u043b\u044e\u0442_\u0441\u0430\u043a_\u043a\u0440\u0430\u0441_\u0442\u0440\u0430\u0432_\u0447\u044d\u0440\u0432_\u043b\u0456\u043f_\u0436\u043d\u0456\u0432_\u0432\u0435\u0440_\u043a\u0430\u0441\u0442_\u043b\u0456\u0441\u0442_\u0441\u043d\u0435\u0436".split("_"),weekdays:{format:"\u043d\u044f\u0434\u0437\u0435\u043b\u044e_\u043f\u0430\u043d\u044f\u0434\u0437\u0435\u043b\u0430\u043a_\u0430\u045e\u0442\u043e\u0440\u0430\u043a_\u0441\u0435\u0440\u0430\u0434\u0443_\u0447\u0430\u0446\u0432\u0435\u0440_\u043f\u044f\u0442\u043d\u0456\u0446\u0443_\u0441\u0443\u0431\u043e\u0442\u0443".split("_"),standalone:"\u043d\u044f\u0434\u0437\u0435\u043b\u044f_\u043f\u0430\u043d\u044f\u0434\u0437\u0435\u043b\u0430\u043a_\u0430\u045e\u0442\u043e\u0440\u0430\u043a_\u0441\u0435\u0440\u0430\u0434\u0430_\u0447\u0430\u0446\u0432\u0435\u0440_\u043f\u044f\u0442\u043d\u0456\u0446\u0430_\u0441\u0443\u0431\u043e\u0442\u0430".split("_"),isFormat:/\[ ?[\u0423\u0443\u045e] ?(?:\u043c\u0456\u043d\u0443\u043b\u0443\u044e|\u043d\u0430\u0441\u0442\u0443\u043f\u043d\u0443\u044e)? ?\] ?dddd/},weekdaysShort:"\u043d\u0434_\u043f\u043d_\u0430\u0442_\u0441\u0440_\u0447\u0446_\u043f\u0442_\u0441\u0431".split("_"),weekdaysMin:"\u043d\u0434_\u043f\u043d_\u0430\u0442_\u0441\u0440_\u0447\u0446_\u043f\u0442_\u0441\u0431".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD.MM.YYYY",LL:"D MMMM YYYY \u0433.",LLL:"D MMMM YYYY \u0433., HH:mm",LLLL:"dddd, D MMMM YYYY \u0433., HH:mm"},calendar:{sameDay:"[\u0421\u0451\u043d\u043d\u044f \u045e] LT",nextDay:"[\u0417\u0430\u045e\u0442\u0440\u0430 \u045e] LT",lastDay:"[\u0423\u0447\u043e\u0440\u0430 \u045e] LT",nextWeek:function(){return"[\u0423] dddd [\u045e] LT"},lastWeek:function(){switch(this.day()){case 0:case 3:case 5:case 6:return"[\u0423 \u043c\u0456\u043d\u0443\u043b\u0443\u044e] dddd [\u045e] LT";case 1:case 2:case 4:return"[\u0423 \u043c\u0456\u043d\u0443\u043b\u044b] dddd [\u045e] LT"}},sameElse:"L"},relativeTime:{future:"\u043f\u0440\u0430\u0437 %s",past:"%s \u0442\u0430\u043c\u0443",s:"\u043d\u0435\u043a\u0430\u043b\u044c\u043a\u0456 \u0441\u0435\u043a\u0443\u043d\u0434",m:f,mm:f,h:f,hh:f,d:"\u0434\u0437\u0435\u043d\u044c",dd:f,M:"\u043c\u0435\u0441\u044f\u0446",MM:f,y:"\u0433\u043e\u0434",yy:f},meridiemParse:/\u043d\u043e\u0447\u044b|\u0440\u0430\u043d\u0456\u0446\u044b|\u0434\u043d\u044f|\u0432\u0435\u0447\u0430\u0440\u0430/,isPM:function(e){return/^(\u0434\u043d\u044f|\u0432\u0435\u0447\u0430\u0440\u0430)$/.test(e)},meridiem:function(e,p,y){return e<4?"\u043d\u043e\u0447\u044b":e<12?"\u0440\u0430\u043d\u0456\u0446\u044b":e<17?"\u0434\u043d\u044f":"\u0432\u0435\u0447\u0430\u0440\u0430"},dayOfMonthOrdinalParse:/\d{1,2}-(\u0456|\u044b|\u0433\u0430)/,ordinal:function(e,p){switch(p){case"M":case"d":case"DDD":case"w":case"W":return e%10!=2&&e%10!=3||e%100==12||e%100==13?e+"-\u044b":e+"-\u0456";case"D":return e+"-\u0433\u0430";default:return e}},week:{dow:1,doy:7}})}(i(16738))},3276:function(m,S,i){!function(r){"use strict";r.defineLocale("bg",{months:"\u044f\u043d\u0443\u0430\u0440\u0438_\u0444\u0435\u0432\u0440\u0443\u0430\u0440\u0438_\u043c\u0430\u0440\u0442_\u0430\u043f\u0440\u0438\u043b_\u043c\u0430\u0439_\u044e\u043d\u0438_\u044e\u043b\u0438_\u0430\u0432\u0433\u0443\u0441\u0442_\u0441\u0435\u043f\u0442\u0435\u043c\u0432\u0440\u0438_\u043e\u043a\u0442\u043e\u043c\u0432\u0440\u0438_\u043d\u043e\u0435\u043c\u0432\u0440\u0438_\u0434\u0435\u043a\u0435\u043c\u0432\u0440\u0438".split("_"),monthsShort:"\u044f\u043d\u0443_\u0444\u0435\u0432_\u043c\u0430\u0440_\u0430\u043f\u0440_\u043c\u0430\u0439_\u044e\u043d\u0438_\u044e\u043b\u0438_\u0430\u0432\u0433_\u0441\u0435\u043f_\u043e\u043a\u0442_\u043d\u043e\u0435_\u0434\u0435\u043a".split("_"),weekdays:"\u043d\u0435\u0434\u0435\u043b\u044f_\u043f\u043e\u043d\u0435\u0434\u0435\u043b\u043d\u0438\u043a_\u0432\u0442\u043e\u0440\u043d\u0438\u043a_\u0441\u0440\u044f\u0434\u0430_\u0447\u0435\u0442\u0432\u044a\u0440\u0442\u044a\u043a_\u043f\u0435\u0442\u044a\u043a_\u0441\u044a\u0431\u043e\u0442\u0430".split("_"),weekdaysShort:"\u043d\u0435\u0434_\u043f\u043e\u043d_\u0432\u0442\u043e_\u0441\u0440\u044f_\u0447\u0435\u0442_\u043f\u0435\u0442_\u0441\u044a\u0431".split("_"),weekdaysMin:"\u043d\u0434_\u043f\u043d_\u0432\u0442_\u0441\u0440_\u0447\u0442_\u043f\u0442_\u0441\u0431".split("_"),longDateFormat:{LT:"H:mm",LTS:"H:mm:ss",L:"D.MM.YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY H:mm",LLLL:"dddd, D MMMM YYYY H:mm"},calendar:{sameDay:"[\u0414\u043d\u0435\u0441 \u0432] LT",nextDay:"[\u0423\u0442\u0440\u0435 \u0432] LT",nextWeek:"dddd [\u0432] LT",lastDay:"[\u0412\u0447\u0435\u0440\u0430 \u0432] LT",lastWeek:function(){switch(this.day()){case 0:case 3:case 6:return"[\u041c\u0438\u043d\u0430\u043b\u0430\u0442\u0430] dddd [\u0432] LT";case 1:case 2:case 4:case 5:return"[\u041c\u0438\u043d\u0430\u043b\u0438\u044f] dddd [\u0432] LT"}},sameElse:"L"},relativeTime:{future:"\u0441\u043b\u0435\u0434 %s",past:"\u043f\u0440\u0435\u0434\u0438 %s",s:"\u043d\u044f\u043a\u043e\u043b\u043a\u043e \u0441\u0435\u043a\u0443\u043d\u0434\u0438",ss:"%d \u0441\u0435\u043a\u0443\u043d\u0434\u0438",m:"\u043c\u0438\u043d\u0443\u0442\u0430",mm:"%d \u043c\u0438\u043d\u0443\u0442\u0438",h:"\u0447\u0430\u0441",hh:"%d \u0447\u0430\u0441\u0430",d:"\u0434\u0435\u043d",dd:"%d \u0434\u0435\u043d\u0430",w:"\u0441\u0435\u0434\u043c\u0438\u0446\u0430",ww:"%d \u0441\u0435\u0434\u043c\u0438\u0446\u0438",M:"\u043c\u0435\u0441\u0435\u0446",MM:"%d \u043c\u0435\u0441\u0435\u0446\u0430",y:"\u0433\u043e\u0434\u0438\u043d\u0430",yy:"%d \u0433\u043e\u0434\u0438\u043d\u0438"},dayOfMonthOrdinalParse:/\d{1,2}-(\u0435\u0432|\u0435\u043d|\u0442\u0438|\u0432\u0438|\u0440\u0438|\u043c\u0438)/,ordinal:function(f){var c=f%10,e=f%100;return 0===f?f+"-\u0435\u0432":0===e?f+"-\u0435\u043d":e>10&&e<20?f+"-\u0442\u0438":1===c?f+"-\u0432\u0438":2===c?f+"-\u0440\u0438":7===c||8===c?f+"-\u043c\u0438":f+"-\u0442\u0438"},week:{dow:1,doy:7}})}(i(16738))},93344:function(m,S,i){!function(r){"use strict";r.defineLocale("bm",{months:"Zanwuyekalo_Fewuruyekalo_Marisikalo_Awirilikalo_M\u025bkalo_Zuw\u025bnkalo_Zuluyekalo_Utikalo_S\u025btanburukalo_\u0254kut\u0254burukalo_Nowanburukalo_Desanburukalo".split("_"),monthsShort:"Zan_Few_Mar_Awi_M\u025b_Zuw_Zul_Uti_S\u025bt_\u0254ku_Now_Des".split("_"),weekdays:"Kari_Nt\u025bn\u025bn_Tarata_Araba_Alamisa_Juma_Sibiri".split("_"),weekdaysShort:"Kar_Nt\u025b_Tar_Ara_Ala_Jum_Sib".split("_"),weekdaysMin:"Ka_Nt_Ta_Ar_Al_Ju_Si".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"MMMM [tile] D [san] YYYY",LLL:"MMMM [tile] D [san] YYYY [l\u025br\u025b] HH:mm",LLLL:"dddd MMMM [tile] D [san] YYYY [l\u025br\u025b] HH:mm"},calendar:{sameDay:"[Bi l\u025br\u025b] LT",nextDay:"[Sini l\u025br\u025b] LT",nextWeek:"dddd [don l\u025br\u025b] LT",lastDay:"[Kunu l\u025br\u025b] LT",lastWeek:"dddd [t\u025bm\u025bnen l\u025br\u025b] LT",sameElse:"L"},relativeTime:{future:"%s k\u0254n\u0254",past:"a b\u025b %s b\u0254",s:"sanga dama dama",ss:"sekondi %d",m:"miniti kelen",mm:"miniti %d",h:"l\u025br\u025b kelen",hh:"l\u025br\u025b %d",d:"tile kelen",dd:"tile %d",M:"kalo kelen",MM:"kalo %d",y:"san kelen",yy:"san %d"},week:{dow:1,doy:4}})}(i(16738))},83990:function(m,S,i){!function(r){"use strict";var a={1:"\u09e7",2:"\u09e8",3:"\u09e9",4:"\u09ea",5:"\u09eb",6:"\u09ec",7:"\u09ed",8:"\u09ee",9:"\u09ef",0:"\u09e6"},f={"\u09e7":"1","\u09e8":"2","\u09e9":"3","\u09ea":"4","\u09eb":"5","\u09ec":"6","\u09ed":"7","\u09ee":"8","\u09ef":"9","\u09e6":"0"};r.defineLocale("bn-bd",{months:"\u099c\u09be\u09a8\u09c1\u09df\u09be\u09b0\u09bf_\u09ab\u09c7\u09ac\u09cd\u09b0\u09c1\u09df\u09be\u09b0\u09bf_\u09ae\u09be\u09b0\u09cd\u099a_\u098f\u09aa\u09cd\u09b0\u09bf\u09b2_\u09ae\u09c7_\u099c\u09c1\u09a8_\u099c\u09c1\u09b2\u09be\u0987_\u0986\u0997\u09b8\u09cd\u099f_\u09b8\u09c7\u09aa\u09cd\u099f\u09c7\u09ae\u09cd\u09ac\u09b0_\u0985\u0995\u09cd\u099f\u09cb\u09ac\u09b0_\u09a8\u09ad\u09c7\u09ae\u09cd\u09ac\u09b0_\u09a1\u09bf\u09b8\u09c7\u09ae\u09cd\u09ac\u09b0".split("_"),monthsShort:"\u099c\u09be\u09a8\u09c1_\u09ab\u09c7\u09ac\u09cd\u09b0\u09c1_\u09ae\u09be\u09b0\u09cd\u099a_\u098f\u09aa\u09cd\u09b0\u09bf\u09b2_\u09ae\u09c7_\u099c\u09c1\u09a8_\u099c\u09c1\u09b2\u09be\u0987_\u0986\u0997\u09b8\u09cd\u099f_\u09b8\u09c7\u09aa\u09cd\u099f_\u0985\u0995\u09cd\u099f\u09cb_\u09a8\u09ad\u09c7_\u09a1\u09bf\u09b8\u09c7".split("_"),weekdays:"\u09b0\u09ac\u09bf\u09ac\u09be\u09b0_\u09b8\u09cb\u09ae\u09ac\u09be\u09b0_\u09ae\u0999\u09cd\u0997\u09b2\u09ac\u09be\u09b0_\u09ac\u09c1\u09a7\u09ac\u09be\u09b0_\u09ac\u09c3\u09b9\u09b8\u09cd\u09aa\u09a4\u09bf\u09ac\u09be\u09b0_\u09b6\u09c1\u0995\u09cd\u09b0\u09ac\u09be\u09b0_\u09b6\u09a8\u09bf\u09ac\u09be\u09b0".split("_"),weekdaysShort:"\u09b0\u09ac\u09bf_\u09b8\u09cb\u09ae_\u09ae\u0999\u09cd\u0997\u09b2_\u09ac\u09c1\u09a7_\u09ac\u09c3\u09b9\u09b8\u09cd\u09aa\u09a4\u09bf_\u09b6\u09c1\u0995\u09cd\u09b0_\u09b6\u09a8\u09bf".split("_"),weekdaysMin:"\u09b0\u09ac\u09bf_\u09b8\u09cb\u09ae_\u09ae\u0999\u09cd\u0997\u09b2_\u09ac\u09c1\u09a7_\u09ac\u09c3\u09b9_\u09b6\u09c1\u0995\u09cd\u09b0_\u09b6\u09a8\u09bf".split("_"),longDateFormat:{LT:"A h:mm \u09b8\u09ae\u09df",LTS:"A h:mm:ss \u09b8\u09ae\u09df",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY, A h:mm \u09b8\u09ae\u09df",LLLL:"dddd, D MMMM YYYY, A h:mm \u09b8\u09ae\u09df"},calendar:{sameDay:"[\u0986\u099c] LT",nextDay:"[\u0986\u0997\u09be\u09ae\u09c0\u0995\u09be\u09b2] LT",nextWeek:"dddd, LT",lastDay:"[\u0997\u09a4\u0995\u09be\u09b2] LT",lastWeek:"[\u0997\u09a4] dddd, LT",sameElse:"L"},relativeTime:{future:"%s \u09aa\u09b0\u09c7",past:"%s \u0986\u0997\u09c7",s:"\u0995\u09df\u09c7\u0995 \u09b8\u09c7\u0995\u09c7\u09a8\u09cd\u09a1",ss:"%d \u09b8\u09c7\u0995\u09c7\u09a8\u09cd\u09a1",m:"\u098f\u0995 \u09ae\u09bf\u09a8\u09bf\u099f",mm:"%d \u09ae\u09bf\u09a8\u09bf\u099f",h:"\u098f\u0995 \u0998\u09a8\u09cd\u099f\u09be",hh:"%d \u0998\u09a8\u09cd\u099f\u09be",d:"\u098f\u0995 \u09a6\u09bf\u09a8",dd:"%d \u09a6\u09bf\u09a8",M:"\u098f\u0995 \u09ae\u09be\u09b8",MM:"%d \u09ae\u09be\u09b8",y:"\u098f\u0995 \u09ac\u099b\u09b0",yy:"%d \u09ac\u099b\u09b0"},preparse:function(e){return e.replace(/[\u09e7\u09e8\u09e9\u09ea\u09eb\u09ec\u09ed\u09ee\u09ef\u09e6]/g,function(p){return f[p]})},postformat:function(e){return e.replace(/\d/g,function(p){return a[p]})},meridiemParse:/\u09b0\u09be\u09a4|\u09ad\u09cb\u09b0|\u09b8\u0995\u09be\u09b2|\u09a6\u09c1\u09aa\u09c1\u09b0|\u09ac\u09bf\u0995\u09be\u09b2|\u09b8\u09a8\u09cd\u09a7\u09cd\u09af\u09be|\u09b0\u09be\u09a4/,meridiemHour:function(e,p){return 12===e&&(e=0),"\u09b0\u09be\u09a4"===p?e<4?e:e+12:"\u09ad\u09cb\u09b0"===p||"\u09b8\u0995\u09be\u09b2"===p?e:"\u09a6\u09c1\u09aa\u09c1\u09b0"===p?e>=3?e:e+12:"\u09ac\u09bf\u0995\u09be\u09b2"===p||"\u09b8\u09a8\u09cd\u09a7\u09cd\u09af\u09be"===p?e+12:void 0},meridiem:function(e,p,y){return e<4?"\u09b0\u09be\u09a4":e<6?"\u09ad\u09cb\u09b0":e<12?"\u09b8\u0995\u09be\u09b2":e<15?"\u09a6\u09c1\u09aa\u09c1\u09b0":e<18?"\u09ac\u09bf\u0995\u09be\u09b2":e<20?"\u09b8\u09a8\u09cd\u09a7\u09cd\u09af\u09be":"\u09b0\u09be\u09a4"},week:{dow:0,doy:6}})}(i(16738))},58985:function(m,S,i){!function(r){"use strict";var a={1:"\u09e7",2:"\u09e8",3:"\u09e9",4:"\u09ea",5:"\u09eb",6:"\u09ec",7:"\u09ed",8:"\u09ee",9:"\u09ef",0:"\u09e6"},f={"\u09e7":"1","\u09e8":"2","\u09e9":"3","\u09ea":"4","\u09eb":"5","\u09ec":"6","\u09ed":"7","\u09ee":"8","\u09ef":"9","\u09e6":"0"};r.defineLocale("bn",{months:"\u099c\u09be\u09a8\u09c1\u09df\u09be\u09b0\u09bf_\u09ab\u09c7\u09ac\u09cd\u09b0\u09c1\u09df\u09be\u09b0\u09bf_\u09ae\u09be\u09b0\u09cd\u099a_\u098f\u09aa\u09cd\u09b0\u09bf\u09b2_\u09ae\u09c7_\u099c\u09c1\u09a8_\u099c\u09c1\u09b2\u09be\u0987_\u0986\u0997\u09b8\u09cd\u099f_\u09b8\u09c7\u09aa\u09cd\u099f\u09c7\u09ae\u09cd\u09ac\u09b0_\u0985\u0995\u09cd\u099f\u09cb\u09ac\u09b0_\u09a8\u09ad\u09c7\u09ae\u09cd\u09ac\u09b0_\u09a1\u09bf\u09b8\u09c7\u09ae\u09cd\u09ac\u09b0".split("_"),monthsShort:"\u099c\u09be\u09a8\u09c1_\u09ab\u09c7\u09ac\u09cd\u09b0\u09c1_\u09ae\u09be\u09b0\u09cd\u099a_\u098f\u09aa\u09cd\u09b0\u09bf\u09b2_\u09ae\u09c7_\u099c\u09c1\u09a8_\u099c\u09c1\u09b2\u09be\u0987_\u0986\u0997\u09b8\u09cd\u099f_\u09b8\u09c7\u09aa\u09cd\u099f_\u0985\u0995\u09cd\u099f\u09cb_\u09a8\u09ad\u09c7_\u09a1\u09bf\u09b8\u09c7".split("_"),weekdays:"\u09b0\u09ac\u09bf\u09ac\u09be\u09b0_\u09b8\u09cb\u09ae\u09ac\u09be\u09b0_\u09ae\u0999\u09cd\u0997\u09b2\u09ac\u09be\u09b0_\u09ac\u09c1\u09a7\u09ac\u09be\u09b0_\u09ac\u09c3\u09b9\u09b8\u09cd\u09aa\u09a4\u09bf\u09ac\u09be\u09b0_\u09b6\u09c1\u0995\u09cd\u09b0\u09ac\u09be\u09b0_\u09b6\u09a8\u09bf\u09ac\u09be\u09b0".split("_"),weekdaysShort:"\u09b0\u09ac\u09bf_\u09b8\u09cb\u09ae_\u09ae\u0999\u09cd\u0997\u09b2_\u09ac\u09c1\u09a7_\u09ac\u09c3\u09b9\u09b8\u09cd\u09aa\u09a4\u09bf_\u09b6\u09c1\u0995\u09cd\u09b0_\u09b6\u09a8\u09bf".split("_"),weekdaysMin:"\u09b0\u09ac\u09bf_\u09b8\u09cb\u09ae_\u09ae\u0999\u09cd\u0997\u09b2_\u09ac\u09c1\u09a7_\u09ac\u09c3\u09b9_\u09b6\u09c1\u0995\u09cd\u09b0_\u09b6\u09a8\u09bf".split("_"),longDateFormat:{LT:"A h:mm \u09b8\u09ae\u09df",LTS:"A h:mm:ss \u09b8\u09ae\u09df",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY, A h:mm \u09b8\u09ae\u09df",LLLL:"dddd, D MMMM YYYY, A h:mm \u09b8\u09ae\u09df"},calendar:{sameDay:"[\u0986\u099c] LT",nextDay:"[\u0986\u0997\u09be\u09ae\u09c0\u0995\u09be\u09b2] LT",nextWeek:"dddd, LT",lastDay:"[\u0997\u09a4\u0995\u09be\u09b2] LT",lastWeek:"[\u0997\u09a4] dddd, LT",sameElse:"L"},relativeTime:{future:"%s \u09aa\u09b0\u09c7",past:"%s \u0986\u0997\u09c7",s:"\u0995\u09df\u09c7\u0995 \u09b8\u09c7\u0995\u09c7\u09a8\u09cd\u09a1",ss:"%d \u09b8\u09c7\u0995\u09c7\u09a8\u09cd\u09a1",m:"\u098f\u0995 \u09ae\u09bf\u09a8\u09bf\u099f",mm:"%d \u09ae\u09bf\u09a8\u09bf\u099f",h:"\u098f\u0995 \u0998\u09a8\u09cd\u099f\u09be",hh:"%d \u0998\u09a8\u09cd\u099f\u09be",d:"\u098f\u0995 \u09a6\u09bf\u09a8",dd:"%d \u09a6\u09bf\u09a8",M:"\u098f\u0995 \u09ae\u09be\u09b8",MM:"%d \u09ae\u09be\u09b8",y:"\u098f\u0995 \u09ac\u099b\u09b0",yy:"%d \u09ac\u099b\u09b0"},preparse:function(e){return e.replace(/[\u09e7\u09e8\u09e9\u09ea\u09eb\u09ec\u09ed\u09ee\u09ef\u09e6]/g,function(p){return f[p]})},postformat:function(e){return e.replace(/\d/g,function(p){return a[p]})},meridiemParse:/\u09b0\u09be\u09a4|\u09b8\u0995\u09be\u09b2|\u09a6\u09c1\u09aa\u09c1\u09b0|\u09ac\u09bf\u0995\u09be\u09b2|\u09b0\u09be\u09a4/,meridiemHour:function(e,p){return 12===e&&(e=0),"\u09b0\u09be\u09a4"===p&&e>=4||"\u09a6\u09c1\u09aa\u09c1\u09b0"===p&&e<5||"\u09ac\u09bf\u0995\u09be\u09b2"===p?e+12:e},meridiem:function(e,p,y){return e<4?"\u09b0\u09be\u09a4":e<10?"\u09b8\u0995\u09be\u09b2":e<17?"\u09a6\u09c1\u09aa\u09c1\u09b0":e<20?"\u09ac\u09bf\u0995\u09be\u09b2":"\u09b0\u09be\u09a4"},week:{dow:0,doy:6}})}(i(16738))},94391:function(m,S,i){!function(r){"use strict";var a={1:"\u0f21",2:"\u0f22",3:"\u0f23",4:"\u0f24",5:"\u0f25",6:"\u0f26",7:"\u0f27",8:"\u0f28",9:"\u0f29",0:"\u0f20"},f={"\u0f21":"1","\u0f22":"2","\u0f23":"3","\u0f24":"4","\u0f25":"5","\u0f26":"6","\u0f27":"7","\u0f28":"8","\u0f29":"9","\u0f20":"0"};r.defineLocale("bo",{months:"\u0f5f\u0fb3\u0f0b\u0f56\u0f0b\u0f51\u0f44\u0f0b\u0f54\u0f7c_\u0f5f\u0fb3\u0f0b\u0f56\u0f0b\u0f42\u0f49\u0f72\u0f66\u0f0b\u0f54_\u0f5f\u0fb3\u0f0b\u0f56\u0f0b\u0f42\u0f66\u0f74\u0f58\u0f0b\u0f54_\u0f5f\u0fb3\u0f0b\u0f56\u0f0b\u0f56\u0f5e\u0f72\u0f0b\u0f54_\u0f5f\u0fb3\u0f0b\u0f56\u0f0b\u0f63\u0f94\u0f0b\u0f54_\u0f5f\u0fb3\u0f0b\u0f56\u0f0b\u0f51\u0fb2\u0f74\u0f42\u0f0b\u0f54_\u0f5f\u0fb3\u0f0b\u0f56\u0f0b\u0f56\u0f51\u0f74\u0f53\u0f0b\u0f54_\u0f5f\u0fb3\u0f0b\u0f56\u0f0b\u0f56\u0f62\u0f92\u0fb1\u0f51\u0f0b\u0f54_\u0f5f\u0fb3\u0f0b\u0f56\u0f0b\u0f51\u0f42\u0f74\u0f0b\u0f54_\u0f5f\u0fb3\u0f0b\u0f56\u0f0b\u0f56\u0f45\u0f74\u0f0b\u0f54_\u0f5f\u0fb3\u0f0b\u0f56\u0f0b\u0f56\u0f45\u0f74\u0f0b\u0f42\u0f45\u0f72\u0f42\u0f0b\u0f54_\u0f5f\u0fb3\u0f0b\u0f56\u0f0b\u0f56\u0f45\u0f74\u0f0b\u0f42\u0f49\u0f72\u0f66\u0f0b\u0f54".split("_"),monthsShort:"\u0f5f\u0fb3\u0f0b1_\u0f5f\u0fb3\u0f0b2_\u0f5f\u0fb3\u0f0b3_\u0f5f\u0fb3\u0f0b4_\u0f5f\u0fb3\u0f0b5_\u0f5f\u0fb3\u0f0b6_\u0f5f\u0fb3\u0f0b7_\u0f5f\u0fb3\u0f0b8_\u0f5f\u0fb3\u0f0b9_\u0f5f\u0fb3\u0f0b10_\u0f5f\u0fb3\u0f0b11_\u0f5f\u0fb3\u0f0b12".split("_"),monthsShortRegex:/^(\u0f5f\u0fb3\u0f0b\d{1,2})/,monthsParseExact:!0,weekdays:"\u0f42\u0f5f\u0f60\u0f0b\u0f49\u0f72\u0f0b\u0f58\u0f0b_\u0f42\u0f5f\u0f60\u0f0b\u0f5f\u0fb3\u0f0b\u0f56\u0f0b_\u0f42\u0f5f\u0f60\u0f0b\u0f58\u0f72\u0f42\u0f0b\u0f51\u0f58\u0f62\u0f0b_\u0f42\u0f5f\u0f60\u0f0b\u0f63\u0fb7\u0f42\u0f0b\u0f54\u0f0b_\u0f42\u0f5f\u0f60\u0f0b\u0f55\u0f74\u0f62\u0f0b\u0f56\u0f74_\u0f42\u0f5f\u0f60\u0f0b\u0f54\u0f0b\u0f66\u0f44\u0f66\u0f0b_\u0f42\u0f5f\u0f60\u0f0b\u0f66\u0fa4\u0f7a\u0f53\u0f0b\u0f54\u0f0b".split("_"),weekdaysShort:"\u0f49\u0f72\u0f0b\u0f58\u0f0b_\u0f5f\u0fb3\u0f0b\u0f56\u0f0b_\u0f58\u0f72\u0f42\u0f0b\u0f51\u0f58\u0f62\u0f0b_\u0f63\u0fb7\u0f42\u0f0b\u0f54\u0f0b_\u0f55\u0f74\u0f62\u0f0b\u0f56\u0f74_\u0f54\u0f0b\u0f66\u0f44\u0f66\u0f0b_\u0f66\u0fa4\u0f7a\u0f53\u0f0b\u0f54\u0f0b".split("_"),weekdaysMin:"\u0f49\u0f72_\u0f5f\u0fb3_\u0f58\u0f72\u0f42_\u0f63\u0fb7\u0f42_\u0f55\u0f74\u0f62_\u0f66\u0f44\u0f66_\u0f66\u0fa4\u0f7a\u0f53".split("_"),longDateFormat:{LT:"A h:mm",LTS:"A h:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY, A h:mm",LLLL:"dddd, D MMMM YYYY, A h:mm"},calendar:{sameDay:"[\u0f51\u0f72\u0f0b\u0f62\u0f72\u0f44] LT",nextDay:"[\u0f66\u0f44\u0f0b\u0f49\u0f72\u0f53] LT",nextWeek:"[\u0f56\u0f51\u0f74\u0f53\u0f0b\u0f55\u0fb2\u0f42\u0f0b\u0f62\u0f97\u0f7a\u0f66\u0f0b\u0f58], LT",lastDay:"[\u0f41\u0f0b\u0f66\u0f44] LT",lastWeek:"[\u0f56\u0f51\u0f74\u0f53\u0f0b\u0f55\u0fb2\u0f42\u0f0b\u0f58\u0f50\u0f60\u0f0b\u0f58] dddd, LT",sameElse:"L"},relativeTime:{future:"%s \u0f63\u0f0b",past:"%s \u0f66\u0f94\u0f53\u0f0b\u0f63",s:"\u0f63\u0f58\u0f0b\u0f66\u0f44",ss:"%d \u0f66\u0f90\u0f62\u0f0b\u0f46\u0f0d",m:"\u0f66\u0f90\u0f62\u0f0b\u0f58\u0f0b\u0f42\u0f45\u0f72\u0f42",mm:"%d \u0f66\u0f90\u0f62\u0f0b\u0f58",h:"\u0f46\u0f74\u0f0b\u0f5a\u0f7c\u0f51\u0f0b\u0f42\u0f45\u0f72\u0f42",hh:"%d \u0f46\u0f74\u0f0b\u0f5a\u0f7c\u0f51",d:"\u0f49\u0f72\u0f53\u0f0b\u0f42\u0f45\u0f72\u0f42",dd:"%d \u0f49\u0f72\u0f53\u0f0b",M:"\u0f5f\u0fb3\u0f0b\u0f56\u0f0b\u0f42\u0f45\u0f72\u0f42",MM:"%d \u0f5f\u0fb3\u0f0b\u0f56",y:"\u0f63\u0f7c\u0f0b\u0f42\u0f45\u0f72\u0f42",yy:"%d \u0f63\u0f7c"},preparse:function(e){return e.replace(/[\u0f21\u0f22\u0f23\u0f24\u0f25\u0f26\u0f27\u0f28\u0f29\u0f20]/g,function(p){return f[p]})},postformat:function(e){return e.replace(/\d/g,function(p){return a[p]})},meridiemParse:/\u0f58\u0f5a\u0f53\u0f0b\u0f58\u0f7c|\u0f5e\u0f7c\u0f42\u0f66\u0f0b\u0f40\u0f66|\u0f49\u0f72\u0f53\u0f0b\u0f42\u0f74\u0f44|\u0f51\u0f42\u0f7c\u0f44\u0f0b\u0f51\u0f42|\u0f58\u0f5a\u0f53\u0f0b\u0f58\u0f7c/,meridiemHour:function(e,p){return 12===e&&(e=0),"\u0f58\u0f5a\u0f53\u0f0b\u0f58\u0f7c"===p&&e>=4||"\u0f49\u0f72\u0f53\u0f0b\u0f42\u0f74\u0f44"===p&&e<5||"\u0f51\u0f42\u0f7c\u0f44\u0f0b\u0f51\u0f42"===p?e+12:e},meridiem:function(e,p,y){return e<4?"\u0f58\u0f5a\u0f53\u0f0b\u0f58\u0f7c":e<10?"\u0f5e\u0f7c\u0f42\u0f66\u0f0b\u0f40\u0f66":e<17?"\u0f49\u0f72\u0f53\u0f0b\u0f42\u0f74\u0f44":e<20?"\u0f51\u0f42\u0f7c\u0f44\u0f0b\u0f51\u0f42":"\u0f58\u0f5a\u0f53\u0f0b\u0f58\u0f7c"},week:{dow:0,doy:6}})}(i(16738))},46728:function(m,S,i){!function(r){"use strict";function a(ee,ce,ie){return ee+" "+function e(ee,ce){return 2===ce?function p(ee){var ce={m:"v",b:"v",d:"z"};return void 0===ce[ee.charAt(0)]?ee:ce[ee.charAt(0)]+ee.substring(1)}(ee):ee}({mm:"munutenn",MM:"miz",dd:"devezh"}[ie],ee)}function c(ee){return ee>9?c(ee%10):ee}var y=[/^gen/i,/^c[\u02bc\']hwe/i,/^meu/i,/^ebr/i,/^mae/i,/^(mez|eve)/i,/^gou/i,/^eos/i,/^gwe/i,/^her/i,/^du/i,/^ker/i],T=/^(genver|c[\u02bc\']hwevrer|meurzh|ebrel|mae|mezheven|gouere|eost|gwengolo|here|du|kerzu|gen|c[\u02bc\']hwe|meu|ebr|mae|eve|gou|eos|gwe|her|du|ker)/i,W=[/^Su/i,/^Lu/i,/^Me([^r]|$)/i,/^Mer/i,/^Ya/i,/^Gw/i,/^Sa/i];r.defineLocale("br",{months:"Genver_C\u02bchwevrer_Meurzh_Ebrel_Mae_Mezheven_Gouere_Eost_Gwengolo_Here_Du_Kerzu".split("_"),monthsShort:"Gen_C\u02bchwe_Meu_Ebr_Mae_Eve_Gou_Eos_Gwe_Her_Du_Ker".split("_"),weekdays:"Sul_Lun_Meurzh_Merc\u02bcher_Yaou_Gwener_Sadorn".split("_"),weekdaysShort:"Sul_Lun_Meu_Mer_Yao_Gwe_Sad".split("_"),weekdaysMin:"Su_Lu_Me_Mer_Ya_Gw_Sa".split("_"),weekdaysParse:W,fullWeekdaysParse:[/^sul/i,/^lun/i,/^meurzh/i,/^merc[\u02bc\']her/i,/^yaou/i,/^gwener/i,/^sadorn/i],shortWeekdaysParse:[/^Sul/i,/^Lun/i,/^Meu/i,/^Mer/i,/^Yao/i,/^Gwe/i,/^Sad/i],minWeekdaysParse:W,monthsRegex:T,monthsShortRegex:T,monthsStrictRegex:/^(genver|c[\u02bc\']hwevrer|meurzh|ebrel|mae|mezheven|gouere|eost|gwengolo|here|du|kerzu)/i,monthsShortStrictRegex:/^(gen|c[\u02bc\']hwe|meu|ebr|mae|eve|gou|eos|gwe|her|du|ker)/i,monthsParse:y,longMonthsParse:y,shortMonthsParse:y,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D [a viz] MMMM YYYY",LLL:"D [a viz] MMMM YYYY HH:mm",LLLL:"dddd, D [a viz] MMMM YYYY HH:mm"},calendar:{sameDay:"[Hiziv da] LT",nextDay:"[Warc\u02bchoazh da] LT",nextWeek:"dddd [da] LT",lastDay:"[Dec\u02bch da] LT",lastWeek:"dddd [paset da] LT",sameElse:"L"},relativeTime:{future:"a-benn %s",past:"%s \u02bczo",s:"un nebeud segondenno\xf9",ss:"%d eilenn",m:"ur vunutenn",mm:a,h:"un eur",hh:"%d eur",d:"un devezh",dd:a,M:"ur miz",MM:a,y:"ur bloaz",yy:function f(ee){switch(c(ee)){case 1:case 3:case 4:case 5:case 9:return ee+" bloaz";default:return ee+" vloaz"}}},dayOfMonthOrdinalParse:/\d{1,2}(a\xf1|vet)/,ordinal:function(ee){return ee+(1===ee?"a\xf1":"vet")},week:{dow:1,doy:4},meridiemParse:/a.m.|g.m./,isPM:function(ee){return"g.m."===ee},meridiem:function(ee,ce,ie){return ee<12?"a.m.":"g.m."}})}(i(16738))},5536:function(m,S,i){!function(r){"use strict";function a(c,e,p){var y=c+" ";switch(p){case"ss":return y+(1===c?"sekunda":2===c||3===c||4===c?"sekunde":"sekundi");case"m":return e?"jedna minuta":"jedne minute";case"mm":return y+(1===c?"minuta":2===c||3===c||4===c?"minute":"minuta");case"h":return e?"jedan sat":"jednog sata";case"hh":return y+(1===c?"sat":2===c||3===c||4===c?"sata":"sati");case"dd":return y+(1===c?"dan":"dana");case"MM":return y+(1===c?"mjesec":2===c||3===c||4===c?"mjeseca":"mjeseci");case"yy":return y+(1===c?"godina":2===c||3===c||4===c?"godine":"godina")}}r.defineLocale("bs",{months:"januar_februar_mart_april_maj_juni_juli_august_septembar_oktobar_novembar_decembar".split("_"),monthsShort:"jan._feb._mar._apr._maj._jun._jul._aug._sep._okt._nov._dec.".split("_"),monthsParseExact:!0,weekdays:"nedjelja_ponedjeljak_utorak_srijeda_\u010detvrtak_petak_subota".split("_"),weekdaysShort:"ned._pon._uto._sri._\u010det._pet._sub.".split("_"),weekdaysMin:"ne_po_ut_sr_\u010de_pe_su".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"H:mm",LTS:"H:mm:ss",L:"DD.MM.YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY H:mm",LLLL:"dddd, D. MMMM YYYY H:mm"},calendar:{sameDay:"[danas u] LT",nextDay:"[sutra u] LT",nextWeek:function(){switch(this.day()){case 0:return"[u] [nedjelju] [u] LT";case 3:return"[u] [srijedu] [u] LT";case 6:return"[u] [subotu] [u] LT";case 1:case 2:case 4:case 5:return"[u] dddd [u] LT"}},lastDay:"[ju\u010der u] LT",lastWeek:function(){switch(this.day()){case 0:case 3:return"[pro\u0161lu] dddd [u] LT";case 6:return"[pro\u0161le] [subote] [u] LT";case 1:case 2:case 4:case 5:return"[pro\u0161li] dddd [u] LT"}},sameElse:"L"},relativeTime:{future:"za %s",past:"prije %s",s:"par sekundi",ss:a,m:a,mm:a,h:a,hh:a,d:"dan",dd:a,M:"mjesec",MM:a,y:"godinu",yy:a},dayOfMonthOrdinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:7}})}(i(16738))},41043:function(m,S,i){!function(r){"use strict";r.defineLocale("ca",{months:{standalone:"gener_febrer_mar\xe7_abril_maig_juny_juliol_agost_setembre_octubre_novembre_desembre".split("_"),format:"de gener_de febrer_de mar\xe7_d'abril_de maig_de juny_de juliol_d'agost_de setembre_d'octubre_de novembre_de desembre".split("_"),isFormat:/D[oD]?(\s)+MMMM/},monthsShort:"gen._febr._mar\xe7_abr._maig_juny_jul._ag._set._oct._nov._des.".split("_"),monthsParseExact:!0,weekdays:"diumenge_dilluns_dimarts_dimecres_dijous_divendres_dissabte".split("_"),weekdaysShort:"dg._dl._dt._dc._dj._dv._ds.".split("_"),weekdaysMin:"dg_dl_dt_dc_dj_dv_ds".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"H:mm",LTS:"H:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM [de] YYYY",ll:"D MMM YYYY",LLL:"D MMMM [de] YYYY [a les] H:mm",lll:"D MMM YYYY, H:mm",LLLL:"dddd D MMMM [de] YYYY [a les] H:mm",llll:"ddd D MMM YYYY, H:mm"},calendar:{sameDay:function(){return"[avui a "+(1!==this.hours()?"les":"la")+"] LT"},nextDay:function(){return"[dem\xe0 a "+(1!==this.hours()?"les":"la")+"] LT"},nextWeek:function(){return"dddd [a "+(1!==this.hours()?"les":"la")+"] LT"},lastDay:function(){return"[ahir a "+(1!==this.hours()?"les":"la")+"] LT"},lastWeek:function(){return"[el] dddd [passat a "+(1!==this.hours()?"les":"la")+"] LT"},sameElse:"L"},relativeTime:{future:"d'aqu\xed %s",past:"fa %s",s:"uns segons",ss:"%d segons",m:"un minut",mm:"%d minuts",h:"una hora",hh:"%d hores",d:"un dia",dd:"%d dies",M:"un mes",MM:"%d mesos",y:"un any",yy:"%d anys"},dayOfMonthOrdinalParse:/\d{1,2}(r|n|t|\xe8|a)/,ordinal:function(f,c){var e=1===f?"r":2===f?"n":3===f?"r":4===f?"t":"\xe8";return("w"===c||"W"===c)&&(e="a"),f+e},week:{dow:1,doy:4}})}(i(16738))},70420:function(m,S,i){!function(r){"use strict";var a={format:"leden_\xfanor_b\u0159ezen_duben_kv\u011bten_\u010derven_\u010dervenec_srpen_z\xe1\u0159\xed_\u0159\xedjen_listopad_prosinec".split("_"),standalone:"ledna_\xfanora_b\u0159ezna_dubna_kv\u011btna_\u010dervna_\u010dervence_srpna_z\xe1\u0159\xed_\u0159\xedjna_listopadu_prosince".split("_")},f="led_\xfano_b\u0159e_dub_kv\u011b_\u010dvn_\u010dvc_srp_z\xe1\u0159_\u0159\xedj_lis_pro".split("_"),c=[/^led/i,/^\xfano/i,/^b\u0159e/i,/^dub/i,/^kv\u011b/i,/^(\u010dvn|\u010derven$|\u010dervna)/i,/^(\u010dvc|\u010dervenec|\u010dervence)/i,/^srp/i,/^z\xe1\u0159/i,/^\u0159\xedj/i,/^lis/i,/^pro/i],e=/^(leden|\xfanor|b\u0159ezen|duben|kv\u011bten|\u010dervenec|\u010dervence|\u010derven|\u010dervna|srpen|z\xe1\u0159\xed|\u0159\xedjen|listopad|prosinec|led|\xfano|b\u0159e|dub|kv\u011b|\u010dvn|\u010dvc|srp|z\xe1\u0159|\u0159\xedj|lis|pro)/i;function p(C){return C>1&&C<5&&1!=~~(C/10)}function y(C,R,L,z){var W=C+" ";switch(L){case"s":return R||z?"p\xe1r sekund":"p\xe1r sekundami";case"ss":return R||z?W+(p(C)?"sekundy":"sekund"):W+"sekundami";case"m":return R?"minuta":z?"minutu":"minutou";case"mm":return R||z?W+(p(C)?"minuty":"minut"):W+"minutami";case"h":return R?"hodina":z?"hodinu":"hodinou";case"hh":return R||z?W+(p(C)?"hodiny":"hodin"):W+"hodinami";case"d":return R||z?"den":"dnem";case"dd":return R||z?W+(p(C)?"dny":"dn\xed"):W+"dny";case"M":return R||z?"m\u011bs\xedc":"m\u011bs\xedcem";case"MM":return R||z?W+(p(C)?"m\u011bs\xedce":"m\u011bs\xedc\u016f"):W+"m\u011bs\xedci";case"y":return R||z?"rok":"rokem";case"yy":return R||z?W+(p(C)?"roky":"let"):W+"lety"}}r.defineLocale("cs",{months:a,monthsShort:f,monthsRegex:e,monthsShortRegex:e,monthsStrictRegex:/^(leden|ledna|\xfanora|\xfanor|b\u0159ezen|b\u0159ezna|duben|dubna|kv\u011bten|kv\u011btna|\u010dervenec|\u010dervence|\u010derven|\u010dervna|srpen|srpna|z\xe1\u0159\xed|\u0159\xedjen|\u0159\xedjna|listopadu|listopad|prosinec|prosince)/i,monthsShortStrictRegex:/^(led|\xfano|b\u0159e|dub|kv\u011b|\u010dvn|\u010dvc|srp|z\xe1\u0159|\u0159\xedj|lis|pro)/i,monthsParse:c,longMonthsParse:c,shortMonthsParse:c,weekdays:"ned\u011ble_pond\u011bl\xed_\xfater\xfd_st\u0159eda_\u010dtvrtek_p\xe1tek_sobota".split("_"),weekdaysShort:"ne_po_\xfat_st_\u010dt_p\xe1_so".split("_"),weekdaysMin:"ne_po_\xfat_st_\u010dt_p\xe1_so".split("_"),longDateFormat:{LT:"H:mm",LTS:"H:mm:ss",L:"DD.MM.YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY H:mm",LLLL:"dddd D. MMMM YYYY H:mm",l:"D. M. YYYY"},calendar:{sameDay:"[dnes v] LT",nextDay:"[z\xedtra v] LT",nextWeek:function(){switch(this.day()){case 0:return"[v ned\u011bli v] LT";case 1:case 2:return"[v] dddd [v] LT";case 3:return"[ve st\u0159edu v] LT";case 4:return"[ve \u010dtvrtek v] LT";case 5:return"[v p\xe1tek v] LT";case 6:return"[v sobotu v] LT"}},lastDay:"[v\u010dera v] LT",lastWeek:function(){switch(this.day()){case 0:return"[minulou ned\u011bli v] LT";case 1:case 2:return"[minul\xe9] dddd [v] LT";case 3:return"[minulou st\u0159edu v] LT";case 4:case 5:return"[minul\xfd] dddd [v] LT";case 6:return"[minulou sobotu v] LT"}},sameElse:"L"},relativeTime:{future:"za %s",past:"p\u0159ed %s",s:y,ss:y,m:y,mm:y,h:y,hh:y,d:y,dd:y,M:y,MM:y,y,yy:y},dayOfMonthOrdinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:4}})}(i(16738))},33513:function(m,S,i){!function(r){"use strict";r.defineLocale("cv",{months:"\u043a\u04d1\u0440\u043b\u0430\u0447_\u043d\u0430\u0440\u04d1\u0441_\u043f\u0443\u0448_\u0430\u043a\u0430_\u043c\u0430\u0439_\u04ab\u04d7\u0440\u0442\u043c\u0435_\u0443\u0442\u04d1_\u04ab\u0443\u0440\u043b\u0430_\u0430\u0432\u04d1\u043d_\u044e\u043f\u0430_\u0447\u04f3\u043a_\u0440\u0430\u0448\u0442\u0430\u0432".split("_"),monthsShort:"\u043a\u04d1\u0440_\u043d\u0430\u0440_\u043f\u0443\u0448_\u0430\u043a\u0430_\u043c\u0430\u0439_\u04ab\u04d7\u0440_\u0443\u0442\u04d1_\u04ab\u0443\u0440_\u0430\u0432\u043d_\u044e\u043f\u0430_\u0447\u04f3\u043a_\u0440\u0430\u0448".split("_"),weekdays:"\u0432\u044b\u0440\u0441\u0430\u0440\u043d\u0438\u043a\u0443\u043d_\u0442\u0443\u043d\u0442\u0438\u043a\u0443\u043d_\u044b\u0442\u043b\u0430\u0440\u0438\u043a\u0443\u043d_\u044e\u043d\u043a\u0443\u043d_\u043a\u04d7\u04ab\u043d\u0435\u0440\u043d\u0438\u043a\u0443\u043d_\u044d\u0440\u043d\u0435\u043a\u0443\u043d_\u0448\u04d1\u043c\u0430\u0442\u043a\u0443\u043d".split("_"),weekdaysShort:"\u0432\u044b\u0440_\u0442\u0443\u043d_\u044b\u0442\u043b_\u044e\u043d_\u043a\u04d7\u04ab_\u044d\u0440\u043d_\u0448\u04d1\u043c".split("_"),weekdaysMin:"\u0432\u0440_\u0442\u043d_\u044b\u0442_\u044e\u043d_\u043a\u04ab_\u044d\u0440_\u0448\u043c".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD-MM-YYYY",LL:"YYYY [\u04ab\u0443\u043b\u0445\u0438] MMMM [\u0443\u0439\u04d1\u0445\u04d7\u043d] D[-\u043c\u04d7\u0448\u04d7]",LLL:"YYYY [\u04ab\u0443\u043b\u0445\u0438] MMMM [\u0443\u0439\u04d1\u0445\u04d7\u043d] D[-\u043c\u04d7\u0448\u04d7], HH:mm",LLLL:"dddd, YYYY [\u04ab\u0443\u043b\u0445\u0438] MMMM [\u0443\u0439\u04d1\u0445\u04d7\u043d] D[-\u043c\u04d7\u0448\u04d7], HH:mm"},calendar:{sameDay:"[\u041f\u0430\u044f\u043d] LT [\u0441\u0435\u0445\u0435\u0442\u0440\u0435]",nextDay:"[\u042b\u0440\u0430\u043d] LT [\u0441\u0435\u0445\u0435\u0442\u0440\u0435]",lastDay:"[\u04d6\u043d\u0435\u0440] LT [\u0441\u0435\u0445\u0435\u0442\u0440\u0435]",nextWeek:"[\u04aa\u0438\u0442\u0435\u0441] dddd LT [\u0441\u0435\u0445\u0435\u0442\u0440\u0435]",lastWeek:"[\u0418\u0440\u0442\u043d\u04d7] dddd LT [\u0441\u0435\u0445\u0435\u0442\u0440\u0435]",sameElse:"L"},relativeTime:{future:function(f){return f+(/\u0441\u0435\u0445\u0435\u0442$/i.exec(f)?"\u0440\u0435\u043d":/\u04ab\u0443\u043b$/i.exec(f)?"\u0442\u0430\u043d":"\u0440\u0430\u043d")},past:"%s \u043a\u0430\u044f\u043b\u043b\u0430",s:"\u043f\u04d7\u0440-\u0438\u043a \u04ab\u0435\u043a\u043a\u0443\u043d\u0442",ss:"%d \u04ab\u0435\u043a\u043a\u0443\u043d\u0442",m:"\u043f\u04d7\u0440 \u043c\u0438\u043d\u0443\u0442",mm:"%d \u043c\u0438\u043d\u0443\u0442",h:"\u043f\u04d7\u0440 \u0441\u0435\u0445\u0435\u0442",hh:"%d \u0441\u0435\u0445\u0435\u0442",d:"\u043f\u04d7\u0440 \u043a\u0443\u043d",dd:"%d \u043a\u0443\u043d",M:"\u043f\u04d7\u0440 \u0443\u0439\u04d1\u0445",MM:"%d \u0443\u0439\u04d1\u0445",y:"\u043f\u04d7\u0440 \u04ab\u0443\u043b",yy:"%d \u04ab\u0443\u043b"},dayOfMonthOrdinalParse:/\d{1,2}-\u043c\u04d7\u0448/,ordinal:"%d-\u043c\u04d7\u0448",week:{dow:1,doy:7}})}(i(16738))},6771:function(m,S,i){!function(r){"use strict";r.defineLocale("cy",{months:"Ionawr_Chwefror_Mawrth_Ebrill_Mai_Mehefin_Gorffennaf_Awst_Medi_Hydref_Tachwedd_Rhagfyr".split("_"),monthsShort:"Ion_Chwe_Maw_Ebr_Mai_Meh_Gor_Aws_Med_Hyd_Tach_Rhag".split("_"),weekdays:"Dydd Sul_Dydd Llun_Dydd Mawrth_Dydd Mercher_Dydd Iau_Dydd Gwener_Dydd Sadwrn".split("_"),weekdaysShort:"Sul_Llun_Maw_Mer_Iau_Gwe_Sad".split("_"),weekdaysMin:"Su_Ll_Ma_Me_Ia_Gw_Sa".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd, D MMMM YYYY HH:mm"},calendar:{sameDay:"[Heddiw am] LT",nextDay:"[Yfory am] LT",nextWeek:"dddd [am] LT",lastDay:"[Ddoe am] LT",lastWeek:"dddd [diwethaf am] LT",sameElse:"L"},relativeTime:{future:"mewn %s",past:"%s yn \xf4l",s:"ychydig eiliadau",ss:"%d eiliad",m:"munud",mm:"%d munud",h:"awr",hh:"%d awr",d:"diwrnod",dd:"%d diwrnod",M:"mis",MM:"%d mis",y:"blwyddyn",yy:"%d flynedd"},dayOfMonthOrdinalParse:/\d{1,2}(fed|ain|af|il|ydd|ed|eg)/,ordinal:function(f){var e="";return f>20?e=40===f||50===f||60===f||80===f||100===f?"fed":"ain":f>0&&(e=["","af","il","ydd","ydd","ed","ed","ed","fed","fed","fed","eg","fed","eg","eg","fed","eg","eg","fed","eg","fed"][f]),f+e},week:{dow:1,doy:4}})}(i(16738))},47978:function(m,S,i){!function(r){"use strict";r.defineLocale("da",{months:"januar_februar_marts_april_maj_juni_juli_august_september_oktober_november_december".split("_"),monthsShort:"jan_feb_mar_apr_maj_jun_jul_aug_sep_okt_nov_dec".split("_"),weekdays:"s\xf8ndag_mandag_tirsdag_onsdag_torsdag_fredag_l\xf8rdag".split("_"),weekdaysShort:"s\xf8n_man_tir_ons_tor_fre_l\xf8r".split("_"),weekdaysMin:"s\xf8_ma_ti_on_to_fr_l\xf8".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD.MM.YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY HH:mm",LLLL:"dddd [d.] D. MMMM YYYY [kl.] HH:mm"},calendar:{sameDay:"[i dag kl.] LT",nextDay:"[i morgen kl.] LT",nextWeek:"p\xe5 dddd [kl.] LT",lastDay:"[i g\xe5r kl.] LT",lastWeek:"[i] dddd[s kl.] LT",sameElse:"L"},relativeTime:{future:"om %s",past:"%s siden",s:"f\xe5 sekunder",ss:"%d sekunder",m:"et minut",mm:"%d minutter",h:"en time",hh:"%d timer",d:"en dag",dd:"%d dage",M:"en m\xe5ned",MM:"%d m\xe5neder",y:"et \xe5r",yy:"%d \xe5r"},dayOfMonthOrdinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:4}})}(i(16738))},25204:function(m,S,i){!function(r){"use strict";function a(c,e,p,y){var T={m:["eine Minute","einer Minute"],h:["eine Stunde","einer Stunde"],d:["ein Tag","einem Tag"],dd:[c+" Tage",c+" Tagen"],w:["eine Woche","einer Woche"],M:["ein Monat","einem Monat"],MM:[c+" Monate",c+" Monaten"],y:["ein Jahr","einem Jahr"],yy:[c+" Jahre",c+" Jahren"]};return e?T[p][0]:T[p][1]}r.defineLocale("de-at",{months:"J\xe4nner_Februar_M\xe4rz_April_Mai_Juni_Juli_August_September_Oktober_November_Dezember".split("_"),monthsShort:"J\xe4n._Feb._M\xe4rz_Apr._Mai_Juni_Juli_Aug._Sep._Okt._Nov._Dez.".split("_"),monthsParseExact:!0,weekdays:"Sonntag_Montag_Dienstag_Mittwoch_Donnerstag_Freitag_Samstag".split("_"),weekdaysShort:"So._Mo._Di._Mi._Do._Fr._Sa.".split("_"),weekdaysMin:"So_Mo_Di_Mi_Do_Fr_Sa".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD.MM.YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY HH:mm",LLLL:"dddd, D. MMMM YYYY HH:mm"},calendar:{sameDay:"[heute um] LT [Uhr]",sameElse:"L",nextDay:"[morgen um] LT [Uhr]",nextWeek:"dddd [um] LT [Uhr]",lastDay:"[gestern um] LT [Uhr]",lastWeek:"[letzten] dddd [um] LT [Uhr]"},relativeTime:{future:"in %s",past:"vor %s",s:"ein paar Sekunden",ss:"%d Sekunden",m:a,mm:"%d Minuten",h:a,hh:"%d Stunden",d:a,dd:a,w:a,ww:"%d Wochen",M:a,MM:a,y:a,yy:a},dayOfMonthOrdinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:4}})}(i(16738))},2653:function(m,S,i){!function(r){"use strict";function a(c,e,p,y){var T={m:["eine Minute","einer Minute"],h:["eine Stunde","einer Stunde"],d:["ein Tag","einem Tag"],dd:[c+" Tage",c+" Tagen"],w:["eine Woche","einer Woche"],M:["ein Monat","einem Monat"],MM:[c+" Monate",c+" Monaten"],y:["ein Jahr","einem Jahr"],yy:[c+" Jahre",c+" Jahren"]};return e?T[p][0]:T[p][1]}r.defineLocale("de-ch",{months:"Januar_Februar_M\xe4rz_April_Mai_Juni_Juli_August_September_Oktober_November_Dezember".split("_"),monthsShort:"Jan._Feb._M\xe4rz_Apr._Mai_Juni_Juli_Aug._Sep._Okt._Nov._Dez.".split("_"),monthsParseExact:!0,weekdays:"Sonntag_Montag_Dienstag_Mittwoch_Donnerstag_Freitag_Samstag".split("_"),weekdaysShort:"So_Mo_Di_Mi_Do_Fr_Sa".split("_"),weekdaysMin:"So_Mo_Di_Mi_Do_Fr_Sa".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD.MM.YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY HH:mm",LLLL:"dddd, D. MMMM YYYY HH:mm"},calendar:{sameDay:"[heute um] LT [Uhr]",sameElse:"L",nextDay:"[morgen um] LT [Uhr]",nextWeek:"dddd [um] LT [Uhr]",lastDay:"[gestern um] LT [Uhr]",lastWeek:"[letzten] dddd [um] LT [Uhr]"},relativeTime:{future:"in %s",past:"vor %s",s:"ein paar Sekunden",ss:"%d Sekunden",m:a,mm:"%d Minuten",h:a,hh:"%d Stunden",d:a,dd:a,w:a,ww:"%d Wochen",M:a,MM:a,y:a,yy:a},dayOfMonthOrdinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:4}})}(i(16738))},46061:function(m,S,i){!function(r){"use strict";function a(c,e,p,y){var T={m:["eine Minute","einer Minute"],h:["eine Stunde","einer Stunde"],d:["ein Tag","einem Tag"],dd:[c+" Tage",c+" Tagen"],w:["eine Woche","einer Woche"],M:["ein Monat","einem Monat"],MM:[c+" Monate",c+" Monaten"],y:["ein Jahr","einem Jahr"],yy:[c+" Jahre",c+" Jahren"]};return e?T[p][0]:T[p][1]}r.defineLocale("de",{months:"Januar_Februar_M\xe4rz_April_Mai_Juni_Juli_August_September_Oktober_November_Dezember".split("_"),monthsShort:"Jan._Feb._M\xe4rz_Apr._Mai_Juni_Juli_Aug._Sep._Okt._Nov._Dez.".split("_"),monthsParseExact:!0,weekdays:"Sonntag_Montag_Dienstag_Mittwoch_Donnerstag_Freitag_Samstag".split("_"),weekdaysShort:"So._Mo._Di._Mi._Do._Fr._Sa.".split("_"),weekdaysMin:"So_Mo_Di_Mi_Do_Fr_Sa".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD.MM.YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY HH:mm",LLLL:"dddd, D. MMMM YYYY HH:mm"},calendar:{sameDay:"[heute um] LT [Uhr]",sameElse:"L",nextDay:"[morgen um] LT [Uhr]",nextWeek:"dddd [um] LT [Uhr]",lastDay:"[gestern um] LT [Uhr]",lastWeek:"[letzten] dddd [um] LT [Uhr]"},relativeTime:{future:"in %s",past:"vor %s",s:"ein paar Sekunden",ss:"%d Sekunden",m:a,mm:"%d Minuten",h:a,hh:"%d Stunden",d:a,dd:a,w:a,ww:"%d Wochen",M:a,MM:a,y:a,yy:a},dayOfMonthOrdinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:4}})}(i(16738))},85:function(m,S,i){!function(r){"use strict";var a=["\u0796\u07ac\u0782\u07aa\u0787\u07a6\u0783\u07a9","\u078a\u07ac\u0784\u07b0\u0783\u07aa\u0787\u07a6\u0783\u07a9","\u0789\u07a7\u0783\u07a8\u0797\u07aa","\u0787\u07ad\u0795\u07b0\u0783\u07a9\u078d\u07aa","\u0789\u07ad","\u0796\u07ab\u0782\u07b0","\u0796\u07aa\u078d\u07a6\u0787\u07a8","\u0787\u07af\u078e\u07a6\u0790\u07b0\u0793\u07aa","\u0790\u07ac\u0795\u07b0\u0793\u07ac\u0789\u07b0\u0784\u07a6\u0783\u07aa","\u0787\u07ae\u0786\u07b0\u0793\u07af\u0784\u07a6\u0783\u07aa","\u0782\u07ae\u0788\u07ac\u0789\u07b0\u0784\u07a6\u0783\u07aa","\u0791\u07a8\u0790\u07ac\u0789\u07b0\u0784\u07a6\u0783\u07aa"],f=["\u0787\u07a7\u078b\u07a8\u0787\u07b0\u078c\u07a6","\u0780\u07af\u0789\u07a6","\u0787\u07a6\u0782\u07b0\u078e\u07a7\u0783\u07a6","\u0784\u07aa\u078b\u07a6","\u0784\u07aa\u0783\u07a7\u0790\u07b0\u078a\u07a6\u078c\u07a8","\u0780\u07aa\u0786\u07aa\u0783\u07aa","\u0780\u07ae\u0782\u07a8\u0780\u07a8\u0783\u07aa"];r.defineLocale("dv",{months:a,monthsShort:a,weekdays:f,weekdaysShort:f,weekdaysMin:"\u0787\u07a7\u078b\u07a8_\u0780\u07af\u0789\u07a6_\u0787\u07a6\u0782\u07b0_\u0784\u07aa\u078b\u07a6_\u0784\u07aa\u0783\u07a7_\u0780\u07aa\u0786\u07aa_\u0780\u07ae\u0782\u07a8".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"D/M/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd D MMMM YYYY HH:mm"},meridiemParse:/\u0789\u0786|\u0789\u078a/,isPM:function(e){return"\u0789\u078a"===e},meridiem:function(e,p,y){return e<12?"\u0789\u0786":"\u0789\u078a"},calendar:{sameDay:"[\u0789\u07a8\u0787\u07a6\u078b\u07aa] LT",nextDay:"[\u0789\u07a7\u078b\u07a6\u0789\u07a7] LT",nextWeek:"dddd LT",lastDay:"[\u0787\u07a8\u0787\u07b0\u0794\u07ac] LT",lastWeek:"[\u078a\u07a7\u0787\u07a8\u078c\u07aa\u0788\u07a8] dddd LT",sameElse:"L"},relativeTime:{future:"\u078c\u07ac\u0783\u07ad\u078e\u07a6\u0787\u07a8 %s",past:"\u0786\u07aa\u0783\u07a8\u0782\u07b0 %s",s:"\u0790\u07a8\u0786\u07aa\u0782\u07b0\u078c\u07aa\u0786\u07ae\u0785\u07ac\u0787\u07b0",ss:"d% \u0790\u07a8\u0786\u07aa\u0782\u07b0\u078c\u07aa",m:"\u0789\u07a8\u0782\u07a8\u0793\u07ac\u0787\u07b0",mm:"\u0789\u07a8\u0782\u07a8\u0793\u07aa %d",h:"\u078e\u07a6\u0791\u07a8\u0787\u07a8\u0783\u07ac\u0787\u07b0",hh:"\u078e\u07a6\u0791\u07a8\u0787\u07a8\u0783\u07aa %d",d:"\u078b\u07aa\u0788\u07a6\u0780\u07ac\u0787\u07b0",dd:"\u078b\u07aa\u0788\u07a6\u0790\u07b0 %d",M:"\u0789\u07a6\u0780\u07ac\u0787\u07b0",MM:"\u0789\u07a6\u0790\u07b0 %d",y:"\u0787\u07a6\u0780\u07a6\u0783\u07ac\u0787\u07b0",yy:"\u0787\u07a6\u0780\u07a6\u0783\u07aa %d"},preparse:function(e){return e.replace(/\u060c/g,",")},postformat:function(e){return e.replace(/,/g,"\u060c")},week:{dow:7,doy:12}})}(i(16738))},8579:function(m,S,i){!function(r){"use strict";r.defineLocale("el",{monthsNominativeEl:"\u0399\u03b1\u03bd\u03bf\u03c5\u03ac\u03c1\u03b9\u03bf\u03c2_\u03a6\u03b5\u03b2\u03c1\u03bf\u03c5\u03ac\u03c1\u03b9\u03bf\u03c2_\u039c\u03ac\u03c1\u03c4\u03b9\u03bf\u03c2_\u0391\u03c0\u03c1\u03af\u03bb\u03b9\u03bf\u03c2_\u039c\u03ac\u03b9\u03bf\u03c2_\u0399\u03bf\u03cd\u03bd\u03b9\u03bf\u03c2_\u0399\u03bf\u03cd\u03bb\u03b9\u03bf\u03c2_\u0391\u03cd\u03b3\u03bf\u03c5\u03c3\u03c4\u03bf\u03c2_\u03a3\u03b5\u03c0\u03c4\u03ad\u03bc\u03b2\u03c1\u03b9\u03bf\u03c2_\u039f\u03ba\u03c4\u03ce\u03b2\u03c1\u03b9\u03bf\u03c2_\u039d\u03bf\u03ad\u03bc\u03b2\u03c1\u03b9\u03bf\u03c2_\u0394\u03b5\u03ba\u03ad\u03bc\u03b2\u03c1\u03b9\u03bf\u03c2".split("_"),monthsGenitiveEl:"\u0399\u03b1\u03bd\u03bf\u03c5\u03b1\u03c1\u03af\u03bf\u03c5_\u03a6\u03b5\u03b2\u03c1\u03bf\u03c5\u03b1\u03c1\u03af\u03bf\u03c5_\u039c\u03b1\u03c1\u03c4\u03af\u03bf\u03c5_\u0391\u03c0\u03c1\u03b9\u03bb\u03af\u03bf\u03c5_\u039c\u03b1\u0390\u03bf\u03c5_\u0399\u03bf\u03c5\u03bd\u03af\u03bf\u03c5_\u0399\u03bf\u03c5\u03bb\u03af\u03bf\u03c5_\u0391\u03c5\u03b3\u03bf\u03cd\u03c3\u03c4\u03bf\u03c5_\u03a3\u03b5\u03c0\u03c4\u03b5\u03bc\u03b2\u03c1\u03af\u03bf\u03c5_\u039f\u03ba\u03c4\u03c9\u03b2\u03c1\u03af\u03bf\u03c5_\u039d\u03bf\u03b5\u03bc\u03b2\u03c1\u03af\u03bf\u03c5_\u0394\u03b5\u03ba\u03b5\u03bc\u03b2\u03c1\u03af\u03bf\u03c5".split("_"),months:function(c,e){return c?"string"==typeof e&&/D/.test(e.substring(0,e.indexOf("MMMM")))?this._monthsGenitiveEl[c.month()]:this._monthsNominativeEl[c.month()]:this._monthsNominativeEl},monthsShort:"\u0399\u03b1\u03bd_\u03a6\u03b5\u03b2_\u039c\u03b1\u03c1_\u0391\u03c0\u03c1_\u039c\u03b1\u03ca_\u0399\u03bf\u03c5\u03bd_\u0399\u03bf\u03c5\u03bb_\u0391\u03c5\u03b3_\u03a3\u03b5\u03c0_\u039f\u03ba\u03c4_\u039d\u03bf\u03b5_\u0394\u03b5\u03ba".split("_"),weekdays:"\u039a\u03c5\u03c1\u03b9\u03b1\u03ba\u03ae_\u0394\u03b5\u03c5\u03c4\u03ad\u03c1\u03b1_\u03a4\u03c1\u03af\u03c4\u03b7_\u03a4\u03b5\u03c4\u03ac\u03c1\u03c4\u03b7_\u03a0\u03ad\u03bc\u03c0\u03c4\u03b7_\u03a0\u03b1\u03c1\u03b1\u03c3\u03ba\u03b5\u03c5\u03ae_\u03a3\u03ac\u03b2\u03b2\u03b1\u03c4\u03bf".split("_"),weekdaysShort:"\u039a\u03c5\u03c1_\u0394\u03b5\u03c5_\u03a4\u03c1\u03b9_\u03a4\u03b5\u03c4_\u03a0\u03b5\u03bc_\u03a0\u03b1\u03c1_\u03a3\u03b1\u03b2".split("_"),weekdaysMin:"\u039a\u03c5_\u0394\u03b5_\u03a4\u03c1_\u03a4\u03b5_\u03a0\u03b5_\u03a0\u03b1_\u03a3\u03b1".split("_"),meridiem:function(c,e,p){return c>11?p?"\u03bc\u03bc":"\u039c\u039c":p?"\u03c0\u03bc":"\u03a0\u039c"},isPM:function(c){return"\u03bc"===(c+"").toLowerCase()[0]},meridiemParse:/[\u03a0\u039c]\.?\u039c?\.?/i,longDateFormat:{LT:"h:mm A",LTS:"h:mm:ss A",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY h:mm A",LLLL:"dddd, D MMMM YYYY h:mm A"},calendarEl:{sameDay:"[\u03a3\u03ae\u03bc\u03b5\u03c1\u03b1 {}] LT",nextDay:"[\u0391\u03cd\u03c1\u03b9\u03bf {}] LT",nextWeek:"dddd [{}] LT",lastDay:"[\u03a7\u03b8\u03b5\u03c2 {}] LT",lastWeek:function(){return 6===this.day()?"[\u03c4\u03bf \u03c0\u03c1\u03bf\u03b7\u03b3\u03bf\u03cd\u03bc\u03b5\u03bd\u03bf] dddd [{}] LT":"[\u03c4\u03b7\u03bd \u03c0\u03c1\u03bf\u03b7\u03b3\u03bf\u03cd\u03bc\u03b5\u03bd\u03b7] dddd [{}] LT"},sameElse:"L"},calendar:function(c,e){var p=this._calendarEl[c],y=e&&e.hours();return function a(c){return"undefined"!=typeof Function&&c instanceof Function||"[object Function]"===Object.prototype.toString.call(c)}(p)&&(p=p.apply(e)),p.replace("{}",y%12==1?"\u03c3\u03c4\u03b7":"\u03c3\u03c4\u03b9\u03c2")},relativeTime:{future:"\u03c3\u03b5 %s",past:"%s \u03c0\u03c1\u03b9\u03bd",s:"\u03bb\u03af\u03b3\u03b1 \u03b4\u03b5\u03c5\u03c4\u03b5\u03c1\u03cc\u03bb\u03b5\u03c0\u03c4\u03b1",ss:"%d \u03b4\u03b5\u03c5\u03c4\u03b5\u03c1\u03cc\u03bb\u03b5\u03c0\u03c4\u03b1",m:"\u03ad\u03bd\u03b1 \u03bb\u03b5\u03c0\u03c4\u03cc",mm:"%d \u03bb\u03b5\u03c0\u03c4\u03ac",h:"\u03bc\u03af\u03b1 \u03ce\u03c1\u03b1",hh:"%d \u03ce\u03c1\u03b5\u03c2",d:"\u03bc\u03af\u03b1 \u03bc\u03ad\u03c1\u03b1",dd:"%d \u03bc\u03ad\u03c1\u03b5\u03c2",M:"\u03ad\u03bd\u03b1\u03c2 \u03bc\u03ae\u03bd\u03b1\u03c2",MM:"%d \u03bc\u03ae\u03bd\u03b5\u03c2",y:"\u03ad\u03bd\u03b1\u03c2 \u03c7\u03c1\u03cc\u03bd\u03bf\u03c2",yy:"%d \u03c7\u03c1\u03cc\u03bd\u03b9\u03b1"},dayOfMonthOrdinalParse:/\d{1,2}\u03b7/,ordinal:"%d\u03b7",week:{dow:1,doy:4}})}(i(16738))},25724:function(m,S,i){!function(r){"use strict";r.defineLocale("en-au",{months:"January_February_March_April_May_June_July_August_September_October_November_December".split("_"),monthsShort:"Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec".split("_"),weekdays:"Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday".split("_"),weekdaysShort:"Sun_Mon_Tue_Wed_Thu_Fri_Sat".split("_"),weekdaysMin:"Su_Mo_Tu_We_Th_Fr_Sa".split("_"),longDateFormat:{LT:"h:mm A",LTS:"h:mm:ss A",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY h:mm A",LLLL:"dddd, D MMMM YYYY h:mm A"},calendar:{sameDay:"[Today at] LT",nextDay:"[Tomorrow at] LT",nextWeek:"dddd [at] LT",lastDay:"[Yesterday at] LT",lastWeek:"[Last] dddd [at] LT",sameElse:"L"},relativeTime:{future:"in %s",past:"%s ago",s:"a few seconds",ss:"%d seconds",m:"a minute",mm:"%d minutes",h:"an hour",hh:"%d hours",d:"a day",dd:"%d days",M:"a month",MM:"%d months",y:"a year",yy:"%d years"},dayOfMonthOrdinalParse:/\d{1,2}(st|nd|rd|th)/,ordinal:function(f){var c=f%10;return f+(1==~~(f%100/10)?"th":1===c?"st":2===c?"nd":3===c?"rd":"th")},week:{dow:0,doy:4}})}(i(16738))},10525:function(m,S,i){!function(r){"use strict";r.defineLocale("en-ca",{months:"January_February_March_April_May_June_July_August_September_October_November_December".split("_"),monthsShort:"Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec".split("_"),weekdays:"Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday".split("_"),weekdaysShort:"Sun_Mon_Tue_Wed_Thu_Fri_Sat".split("_"),weekdaysMin:"Su_Mo_Tu_We_Th_Fr_Sa".split("_"),longDateFormat:{LT:"h:mm A",LTS:"h:mm:ss A",L:"YYYY-MM-DD",LL:"MMMM D, YYYY",LLL:"MMMM D, YYYY h:mm A",LLLL:"dddd, MMMM D, YYYY h:mm A"},calendar:{sameDay:"[Today at] LT",nextDay:"[Tomorrow at] LT",nextWeek:"dddd [at] LT",lastDay:"[Yesterday at] LT",lastWeek:"[Last] dddd [at] LT",sameElse:"L"},relativeTime:{future:"in %s",past:"%s ago",s:"a few seconds",ss:"%d seconds",m:"a minute",mm:"%d minutes",h:"an hour",hh:"%d hours",d:"a day",dd:"%d days",M:"a month",MM:"%d months",y:"a year",yy:"%d years"},dayOfMonthOrdinalParse:/\d{1,2}(st|nd|rd|th)/,ordinal:function(f){var c=f%10;return f+(1==~~(f%100/10)?"th":1===c?"st":2===c?"nd":3===c?"rd":"th")}})}(i(16738))},52847:function(m,S,i){!function(r){"use strict";r.defineLocale("en-gb",{months:"January_February_March_April_May_June_July_August_September_October_November_December".split("_"),monthsShort:"Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec".split("_"),weekdays:"Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday".split("_"),weekdaysShort:"Sun_Mon_Tue_Wed_Thu_Fri_Sat".split("_"),weekdaysMin:"Su_Mo_Tu_We_Th_Fr_Sa".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd, D MMMM YYYY HH:mm"},calendar:{sameDay:"[Today at] LT",nextDay:"[Tomorrow at] LT",nextWeek:"dddd [at] LT",lastDay:"[Yesterday at] LT",lastWeek:"[Last] dddd [at] LT",sameElse:"L"},relativeTime:{future:"in %s",past:"%s ago",s:"a few seconds",ss:"%d seconds",m:"a minute",mm:"%d minutes",h:"an hour",hh:"%d hours",d:"a day",dd:"%d days",M:"a month",MM:"%d months",y:"a year",yy:"%d years"},dayOfMonthOrdinalParse:/\d{1,2}(st|nd|rd|th)/,ordinal:function(f){var c=f%10;return f+(1==~~(f%100/10)?"th":1===c?"st":2===c?"nd":3===c?"rd":"th")},week:{dow:1,doy:4}})}(i(16738))},67216:function(m,S,i){!function(r){"use strict";r.defineLocale("en-ie",{months:"January_February_March_April_May_June_July_August_September_October_November_December".split("_"),monthsShort:"Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec".split("_"),weekdays:"Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday".split("_"),weekdaysShort:"Sun_Mon_Tue_Wed_Thu_Fri_Sat".split("_"),weekdaysMin:"Su_Mo_Tu_We_Th_Fr_Sa".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd D MMMM YYYY HH:mm"},calendar:{sameDay:"[Today at] LT",nextDay:"[Tomorrow at] LT",nextWeek:"dddd [at] LT",lastDay:"[Yesterday at] LT",lastWeek:"[Last] dddd [at] LT",sameElse:"L"},relativeTime:{future:"in %s",past:"%s ago",s:"a few seconds",ss:"%d seconds",m:"a minute",mm:"%d minutes",h:"an hour",hh:"%d hours",d:"a day",dd:"%d days",M:"a month",MM:"%d months",y:"a year",yy:"%d years"},dayOfMonthOrdinalParse:/\d{1,2}(st|nd|rd|th)/,ordinal:function(f){var c=f%10;return f+(1==~~(f%100/10)?"th":1===c?"st":2===c?"nd":3===c?"rd":"th")},week:{dow:1,doy:4}})}(i(16738))},39305:function(m,S,i){!function(r){"use strict";r.defineLocale("en-il",{months:"January_February_March_April_May_June_July_August_September_October_November_December".split("_"),monthsShort:"Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec".split("_"),weekdays:"Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday".split("_"),weekdaysShort:"Sun_Mon_Tue_Wed_Thu_Fri_Sat".split("_"),weekdaysMin:"Su_Mo_Tu_We_Th_Fr_Sa".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd, D MMMM YYYY HH:mm"},calendar:{sameDay:"[Today at] LT",nextDay:"[Tomorrow at] LT",nextWeek:"dddd [at] LT",lastDay:"[Yesterday at] LT",lastWeek:"[Last] dddd [at] LT",sameElse:"L"},relativeTime:{future:"in %s",past:"%s ago",s:"a few seconds",ss:"%d seconds",m:"a minute",mm:"%d minutes",h:"an hour",hh:"%d hours",d:"a day",dd:"%d days",M:"a month",MM:"%d months",y:"a year",yy:"%d years"},dayOfMonthOrdinalParse:/\d{1,2}(st|nd|rd|th)/,ordinal:function(f){var c=f%10;return f+(1==~~(f%100/10)?"th":1===c?"st":2===c?"nd":3===c?"rd":"th")}})}(i(16738))},73364:function(m,S,i){!function(r){"use strict";r.defineLocale("en-in",{months:"January_February_March_April_May_June_July_August_September_October_November_December".split("_"),monthsShort:"Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec".split("_"),weekdays:"Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday".split("_"),weekdaysShort:"Sun_Mon_Tue_Wed_Thu_Fri_Sat".split("_"),weekdaysMin:"Su_Mo_Tu_We_Th_Fr_Sa".split("_"),longDateFormat:{LT:"h:mm A",LTS:"h:mm:ss A",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY h:mm A",LLLL:"dddd, D MMMM YYYY h:mm A"},calendar:{sameDay:"[Today at] LT",nextDay:"[Tomorrow at] LT",nextWeek:"dddd [at] LT",lastDay:"[Yesterday at] LT",lastWeek:"[Last] dddd [at] LT",sameElse:"L"},relativeTime:{future:"in %s",past:"%s ago",s:"a few seconds",ss:"%d seconds",m:"a minute",mm:"%d minutes",h:"an hour",hh:"%d hours",d:"a day",dd:"%d days",M:"a month",MM:"%d months",y:"a year",yy:"%d years"},dayOfMonthOrdinalParse:/\d{1,2}(st|nd|rd|th)/,ordinal:function(f){var c=f%10;return f+(1==~~(f%100/10)?"th":1===c?"st":2===c?"nd":3===c?"rd":"th")},week:{dow:0,doy:6}})}(i(16738))},79130:function(m,S,i){!function(r){"use strict";r.defineLocale("en-nz",{months:"January_February_March_April_May_June_July_August_September_October_November_December".split("_"),monthsShort:"Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec".split("_"),weekdays:"Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday".split("_"),weekdaysShort:"Sun_Mon_Tue_Wed_Thu_Fri_Sat".split("_"),weekdaysMin:"Su_Mo_Tu_We_Th_Fr_Sa".split("_"),longDateFormat:{LT:"h:mm A",LTS:"h:mm:ss A",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY h:mm A",LLLL:"dddd, D MMMM YYYY h:mm A"},calendar:{sameDay:"[Today at] LT",nextDay:"[Tomorrow at] LT",nextWeek:"dddd [at] LT",lastDay:"[Yesterday at] LT",lastWeek:"[Last] dddd [at] LT",sameElse:"L"},relativeTime:{future:"in %s",past:"%s ago",s:"a few seconds",ss:"%d seconds",m:"a minute",mm:"%d minutes",h:"an hour",hh:"%d hours",d:"a day",dd:"%d days",M:"a month",MM:"%d months",y:"a year",yy:"%d years"},dayOfMonthOrdinalParse:/\d{1,2}(st|nd|rd|th)/,ordinal:function(f){var c=f%10;return f+(1==~~(f%100/10)?"th":1===c?"st":2===c?"nd":3===c?"rd":"th")},week:{dow:1,doy:4}})}(i(16738))},11161:function(m,S,i){!function(r){"use strict";r.defineLocale("en-sg",{months:"January_February_March_April_May_June_July_August_September_October_November_December".split("_"),monthsShort:"Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec".split("_"),weekdays:"Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday".split("_"),weekdaysShort:"Sun_Mon_Tue_Wed_Thu_Fri_Sat".split("_"),weekdaysMin:"Su_Mo_Tu_We_Th_Fr_Sa".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd, D MMMM YYYY HH:mm"},calendar:{sameDay:"[Today at] LT",nextDay:"[Tomorrow at] LT",nextWeek:"dddd [at] LT",lastDay:"[Yesterday at] LT",lastWeek:"[Last] dddd [at] LT",sameElse:"L"},relativeTime:{future:"in %s",past:"%s ago",s:"a few seconds",ss:"%d seconds",m:"a minute",mm:"%d minutes",h:"an hour",hh:"%d hours",d:"a day",dd:"%d days",M:"a month",MM:"%d months",y:"a year",yy:"%d years"},dayOfMonthOrdinalParse:/\d{1,2}(st|nd|rd|th)/,ordinal:function(f){var c=f%10;return f+(1==~~(f%100/10)?"th":1===c?"st":2===c?"nd":3===c?"rd":"th")},week:{dow:1,doy:4}})}(i(16738))},50802:function(m,S,i){!function(r){"use strict";r.defineLocale("eo",{months:"januaro_februaro_marto_aprilo_majo_junio_julio_a\u016dgusto_septembro_oktobro_novembro_decembro".split("_"),monthsShort:"jan_feb_mart_apr_maj_jun_jul_a\u016dg_sept_okt_nov_dec".split("_"),weekdays:"diman\u0109o_lundo_mardo_merkredo_\u0135a\u016ddo_vendredo_sabato".split("_"),weekdaysShort:"dim_lun_mard_merk_\u0135a\u016d_ven_sab".split("_"),weekdaysMin:"di_lu_ma_me_\u0135a_ve_sa".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"YYYY-MM-DD",LL:"[la] D[-an de] MMMM, YYYY",LLL:"[la] D[-an de] MMMM, YYYY HH:mm",LLLL:"dddd[n], [la] D[-an de] MMMM, YYYY HH:mm",llll:"ddd, [la] D[-an de] MMM, YYYY HH:mm"},meridiemParse:/[ap]\.t\.m/i,isPM:function(f){return"p"===f.charAt(0).toLowerCase()},meridiem:function(f,c,e){return f>11?e?"p.t.m.":"P.T.M.":e?"a.t.m.":"A.T.M."},calendar:{sameDay:"[Hodia\u016d je] LT",nextDay:"[Morga\u016d je] LT",nextWeek:"dddd[n je] LT",lastDay:"[Hiera\u016d je] LT",lastWeek:"[pasintan] dddd[n je] LT",sameElse:"L"},relativeTime:{future:"post %s",past:"anta\u016d %s",s:"kelkaj sekundoj",ss:"%d sekundoj",m:"unu minuto",mm:"%d minutoj",h:"unu horo",hh:"%d horoj",d:"unu tago",dd:"%d tagoj",M:"unu monato",MM:"%d monatoj",y:"unu jaro",yy:"%d jaroj"},dayOfMonthOrdinalParse:/\d{1,2}a/,ordinal:"%da",week:{dow:1,doy:7}})}(i(16738))},45551:function(m,S,i){!function(r){"use strict";var a="ene._feb._mar._abr._may._jun._jul._ago._sep._oct._nov._dic.".split("_"),f="ene_feb_mar_abr_may_jun_jul_ago_sep_oct_nov_dic".split("_"),c=[/^ene/i,/^feb/i,/^mar/i,/^abr/i,/^may/i,/^jun/i,/^jul/i,/^ago/i,/^sep/i,/^oct/i,/^nov/i,/^dic/i],e=/^(enero|febrero|marzo|abril|mayo|junio|julio|agosto|septiembre|octubre|noviembre|diciembre|ene\.?|feb\.?|mar\.?|abr\.?|may\.?|jun\.?|jul\.?|ago\.?|sep\.?|oct\.?|nov\.?|dic\.?)/i;r.defineLocale("es-do",{months:"enero_febrero_marzo_abril_mayo_junio_julio_agosto_septiembre_octubre_noviembre_diciembre".split("_"),monthsShort:function(y,T){return y?/-MMM-/.test(T)?f[y.month()]:a[y.month()]:a},monthsRegex:e,monthsShortRegex:e,monthsStrictRegex:/^(enero|febrero|marzo|abril|mayo|junio|julio|agosto|septiembre|octubre|noviembre|diciembre)/i,monthsShortStrictRegex:/^(ene\.?|feb\.?|mar\.?|abr\.?|may\.?|jun\.?|jul\.?|ago\.?|sep\.?|oct\.?|nov\.?|dic\.?)/i,monthsParse:c,longMonthsParse:c,shortMonthsParse:c,weekdays:"domingo_lunes_martes_mi\xe9rcoles_jueves_viernes_s\xe1bado".split("_"),weekdaysShort:"dom._lun._mar._mi\xe9._jue._vie._s\xe1b.".split("_"),weekdaysMin:"do_lu_ma_mi_ju_vi_s\xe1".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"h:mm A",LTS:"h:mm:ss A",L:"DD/MM/YYYY",LL:"D [de] MMMM [de] YYYY",LLL:"D [de] MMMM [de] YYYY h:mm A",LLLL:"dddd, D [de] MMMM [de] YYYY h:mm A"},calendar:{sameDay:function(){return"[hoy a la"+(1!==this.hours()?"s":"")+"] LT"},nextDay:function(){return"[ma\xf1ana a la"+(1!==this.hours()?"s":"")+"] LT"},nextWeek:function(){return"dddd [a la"+(1!==this.hours()?"s":"")+"] LT"},lastDay:function(){return"[ayer a la"+(1!==this.hours()?"s":"")+"] LT"},lastWeek:function(){return"[el] dddd [pasado a la"+(1!==this.hours()?"s":"")+"] LT"},sameElse:"L"},relativeTime:{future:"en %s",past:"hace %s",s:"unos segundos",ss:"%d segundos",m:"un minuto",mm:"%d minutos",h:"una hora",hh:"%d horas",d:"un d\xeda",dd:"%d d\xedas",w:"una semana",ww:"%d semanas",M:"un mes",MM:"%d meses",y:"un a\xf1o",yy:"%d a\xf1os"},dayOfMonthOrdinalParse:/\d{1,2}\xba/,ordinal:"%d\xba",week:{dow:1,doy:4}})}(i(16738))},75615:function(m,S,i){!function(r){"use strict";var a="ene._feb._mar._abr._may._jun._jul._ago._sep._oct._nov._dic.".split("_"),f="ene_feb_mar_abr_may_jun_jul_ago_sep_oct_nov_dic".split("_"),c=[/^ene/i,/^feb/i,/^mar/i,/^abr/i,/^may/i,/^jun/i,/^jul/i,/^ago/i,/^sep/i,/^oct/i,/^nov/i,/^dic/i],e=/^(enero|febrero|marzo|abril|mayo|junio|julio|agosto|septiembre|octubre|noviembre|diciembre|ene\.?|feb\.?|mar\.?|abr\.?|may\.?|jun\.?|jul\.?|ago\.?|sep\.?|oct\.?|nov\.?|dic\.?)/i;r.defineLocale("es-mx",{months:"enero_febrero_marzo_abril_mayo_junio_julio_agosto_septiembre_octubre_noviembre_diciembre".split("_"),monthsShort:function(y,T){return y?/-MMM-/.test(T)?f[y.month()]:a[y.month()]:a},monthsRegex:e,monthsShortRegex:e,monthsStrictRegex:/^(enero|febrero|marzo|abril|mayo|junio|julio|agosto|septiembre|octubre|noviembre|diciembre)/i,monthsShortStrictRegex:/^(ene\.?|feb\.?|mar\.?|abr\.?|may\.?|jun\.?|jul\.?|ago\.?|sep\.?|oct\.?|nov\.?|dic\.?)/i,monthsParse:c,longMonthsParse:c,shortMonthsParse:c,weekdays:"domingo_lunes_martes_mi\xe9rcoles_jueves_viernes_s\xe1bado".split("_"),weekdaysShort:"dom._lun._mar._mi\xe9._jue._vie._s\xe1b.".split("_"),weekdaysMin:"do_lu_ma_mi_ju_vi_s\xe1".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"H:mm",LTS:"H:mm:ss",L:"DD/MM/YYYY",LL:"D [de] MMMM [de] YYYY",LLL:"D [de] MMMM [de] YYYY H:mm",LLLL:"dddd, D [de] MMMM [de] YYYY H:mm"},calendar:{sameDay:function(){return"[hoy a la"+(1!==this.hours()?"s":"")+"] LT"},nextDay:function(){return"[ma\xf1ana a la"+(1!==this.hours()?"s":"")+"] LT"},nextWeek:function(){return"dddd [a la"+(1!==this.hours()?"s":"")+"] LT"},lastDay:function(){return"[ayer a la"+(1!==this.hours()?"s":"")+"] LT"},lastWeek:function(){return"[el] dddd [pasado a la"+(1!==this.hours()?"s":"")+"] LT"},sameElse:"L"},relativeTime:{future:"en %s",past:"hace %s",s:"unos segundos",ss:"%d segundos",m:"un minuto",mm:"%d minutos",h:"una hora",hh:"%d horas",d:"un d\xeda",dd:"%d d\xedas",w:"una semana",ww:"%d semanas",M:"un mes",MM:"%d meses",y:"un a\xf1o",yy:"%d a\xf1os"},dayOfMonthOrdinalParse:/\d{1,2}\xba/,ordinal:"%d\xba",week:{dow:0,doy:4},invalidDate:"Fecha inv\xe1lida"})}(i(16738))},64790:function(m,S,i){!function(r){"use strict";var a="ene._feb._mar._abr._may._jun._jul._ago._sep._oct._nov._dic.".split("_"),f="ene_feb_mar_abr_may_jun_jul_ago_sep_oct_nov_dic".split("_"),c=[/^ene/i,/^feb/i,/^mar/i,/^abr/i,/^may/i,/^jun/i,/^jul/i,/^ago/i,/^sep/i,/^oct/i,/^nov/i,/^dic/i],e=/^(enero|febrero|marzo|abril|mayo|junio|julio|agosto|septiembre|octubre|noviembre|diciembre|ene\.?|feb\.?|mar\.?|abr\.?|may\.?|jun\.?|jul\.?|ago\.?|sep\.?|oct\.?|nov\.?|dic\.?)/i;r.defineLocale("es-us",{months:"enero_febrero_marzo_abril_mayo_junio_julio_agosto_septiembre_octubre_noviembre_diciembre".split("_"),monthsShort:function(y,T){return y?/-MMM-/.test(T)?f[y.month()]:a[y.month()]:a},monthsRegex:e,monthsShortRegex:e,monthsStrictRegex:/^(enero|febrero|marzo|abril|mayo|junio|julio|agosto|septiembre|octubre|noviembre|diciembre)/i,monthsShortStrictRegex:/^(ene\.?|feb\.?|mar\.?|abr\.?|may\.?|jun\.?|jul\.?|ago\.?|sep\.?|oct\.?|nov\.?|dic\.?)/i,monthsParse:c,longMonthsParse:c,shortMonthsParse:c,weekdays:"domingo_lunes_martes_mi\xe9rcoles_jueves_viernes_s\xe1bado".split("_"),weekdaysShort:"dom._lun._mar._mi\xe9._jue._vie._s\xe1b.".split("_"),weekdaysMin:"do_lu_ma_mi_ju_vi_s\xe1".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"h:mm A",LTS:"h:mm:ss A",L:"MM/DD/YYYY",LL:"D [de] MMMM [de] YYYY",LLL:"D [de] MMMM [de] YYYY h:mm A",LLLL:"dddd, D [de] MMMM [de] YYYY h:mm A"},calendar:{sameDay:function(){return"[hoy a la"+(1!==this.hours()?"s":"")+"] LT"},nextDay:function(){return"[ma\xf1ana a la"+(1!==this.hours()?"s":"")+"] LT"},nextWeek:function(){return"dddd [a la"+(1!==this.hours()?"s":"")+"] LT"},lastDay:function(){return"[ayer a la"+(1!==this.hours()?"s":"")+"] LT"},lastWeek:function(){return"[el] dddd [pasado a la"+(1!==this.hours()?"s":"")+"] LT"},sameElse:"L"},relativeTime:{future:"en %s",past:"hace %s",s:"unos segundos",ss:"%d segundos",m:"un minuto",mm:"%d minutos",h:"una hora",hh:"%d horas",d:"un d\xeda",dd:"%d d\xedas",w:"una semana",ww:"%d semanas",M:"un mes",MM:"%d meses",y:"un a\xf1o",yy:"%d a\xf1os"},dayOfMonthOrdinalParse:/\d{1,2}\xba/,ordinal:"%d\xba",week:{dow:0,doy:6}})}(i(16738))},40328:function(m,S,i){!function(r){"use strict";var a="ene._feb._mar._abr._may._jun._jul._ago._sep._oct._nov._dic.".split("_"),f="ene_feb_mar_abr_may_jun_jul_ago_sep_oct_nov_dic".split("_"),c=[/^ene/i,/^feb/i,/^mar/i,/^abr/i,/^may/i,/^jun/i,/^jul/i,/^ago/i,/^sep/i,/^oct/i,/^nov/i,/^dic/i],e=/^(enero|febrero|marzo|abril|mayo|junio|julio|agosto|septiembre|octubre|noviembre|diciembre|ene\.?|feb\.?|mar\.?|abr\.?|may\.?|jun\.?|jul\.?|ago\.?|sep\.?|oct\.?|nov\.?|dic\.?)/i;r.defineLocale("es",{months:"enero_febrero_marzo_abril_mayo_junio_julio_agosto_septiembre_octubre_noviembre_diciembre".split("_"),monthsShort:function(y,T){return y?/-MMM-/.test(T)?f[y.month()]:a[y.month()]:a},monthsRegex:e,monthsShortRegex:e,monthsStrictRegex:/^(enero|febrero|marzo|abril|mayo|junio|julio|agosto|septiembre|octubre|noviembre|diciembre)/i,monthsShortStrictRegex:/^(ene\.?|feb\.?|mar\.?|abr\.?|may\.?|jun\.?|jul\.?|ago\.?|sep\.?|oct\.?|nov\.?|dic\.?)/i,monthsParse:c,longMonthsParse:c,shortMonthsParse:c,weekdays:"domingo_lunes_martes_mi\xe9rcoles_jueves_viernes_s\xe1bado".split("_"),weekdaysShort:"dom._lun._mar._mi\xe9._jue._vie._s\xe1b.".split("_"),weekdaysMin:"do_lu_ma_mi_ju_vi_s\xe1".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"H:mm",LTS:"H:mm:ss",L:"DD/MM/YYYY",LL:"D [de] MMMM [de] YYYY",LLL:"D [de] MMMM [de] YYYY H:mm",LLLL:"dddd, D [de] MMMM [de] YYYY H:mm"},calendar:{sameDay:function(){return"[hoy a la"+(1!==this.hours()?"s":"")+"] LT"},nextDay:function(){return"[ma\xf1ana a la"+(1!==this.hours()?"s":"")+"] LT"},nextWeek:function(){return"dddd [a la"+(1!==this.hours()?"s":"")+"] LT"},lastDay:function(){return"[ayer a la"+(1!==this.hours()?"s":"")+"] LT"},lastWeek:function(){return"[el] dddd [pasado a la"+(1!==this.hours()?"s":"")+"] LT"},sameElse:"L"},relativeTime:{future:"en %s",past:"hace %s",s:"unos segundos",ss:"%d segundos",m:"un minuto",mm:"%d minutos",h:"una hora",hh:"%d horas",d:"un d\xeda",dd:"%d d\xedas",w:"una semana",ww:"%d semanas",M:"un mes",MM:"%d meses",y:"un a\xf1o",yy:"%d a\xf1os"},dayOfMonthOrdinalParse:/\d{1,2}\xba/,ordinal:"%d\xba",week:{dow:1,doy:4},invalidDate:"Fecha inv\xe1lida"})}(i(16738))},96389:function(m,S,i){!function(r){"use strict";function a(c,e,p,y){var T={s:["m\xf5ne sekundi","m\xf5ni sekund","paar sekundit"],ss:[c+"sekundi",c+"sekundit"],m:["\xfche minuti","\xfcks minut"],mm:[c+" minuti",c+" minutit"],h:["\xfche tunni","tund aega","\xfcks tund"],hh:[c+" tunni",c+" tundi"],d:["\xfche p\xe4eva","\xfcks p\xe4ev"],M:["kuu aja","kuu aega","\xfcks kuu"],MM:[c+" kuu",c+" kuud"],y:["\xfche aasta","aasta","\xfcks aasta"],yy:[c+" aasta",c+" aastat"]};return e?T[p][2]?T[p][2]:T[p][1]:y?T[p][0]:T[p][1]}r.defineLocale("et",{months:"jaanuar_veebruar_m\xe4rts_aprill_mai_juuni_juuli_august_september_oktoober_november_detsember".split("_"),monthsShort:"jaan_veebr_m\xe4rts_apr_mai_juuni_juuli_aug_sept_okt_nov_dets".split("_"),weekdays:"p\xfchap\xe4ev_esmasp\xe4ev_teisip\xe4ev_kolmap\xe4ev_neljap\xe4ev_reede_laup\xe4ev".split("_"),weekdaysShort:"P_E_T_K_N_R_L".split("_"),weekdaysMin:"P_E_T_K_N_R_L".split("_"),longDateFormat:{LT:"H:mm",LTS:"H:mm:ss",L:"DD.MM.YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY H:mm",LLLL:"dddd, D. MMMM YYYY H:mm"},calendar:{sameDay:"[T\xe4na,] LT",nextDay:"[Homme,] LT",nextWeek:"[J\xe4rgmine] dddd LT",lastDay:"[Eile,] LT",lastWeek:"[Eelmine] dddd LT",sameElse:"L"},relativeTime:{future:"%s p\xe4rast",past:"%s tagasi",s:a,ss:a,m:a,mm:a,h:a,hh:a,d:a,dd:"%d p\xe4eva",M:a,MM:a,y:a,yy:a},dayOfMonthOrdinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:4}})}(i(16738))},52961:function(m,S,i){!function(r){"use strict";r.defineLocale("eu",{months:"urtarrila_otsaila_martxoa_apirila_maiatza_ekaina_uztaila_abuztua_iraila_urria_azaroa_abendua".split("_"),monthsShort:"urt._ots._mar._api._mai._eka._uzt._abu._ira._urr._aza._abe.".split("_"),monthsParseExact:!0,weekdays:"igandea_astelehena_asteartea_asteazkena_osteguna_ostirala_larunbata".split("_"),weekdaysShort:"ig._al._ar._az._og._ol._lr.".split("_"),weekdaysMin:"ig_al_ar_az_og_ol_lr".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"YYYY-MM-DD",LL:"YYYY[ko] MMMM[ren] D[a]",LLL:"YYYY[ko] MMMM[ren] D[a] HH:mm",LLLL:"dddd, YYYY[ko] MMMM[ren] D[a] HH:mm",l:"YYYY-M-D",ll:"YYYY[ko] MMM D[a]",lll:"YYYY[ko] MMM D[a] HH:mm",llll:"ddd, YYYY[ko] MMM D[a] HH:mm"},calendar:{sameDay:"[gaur] LT[etan]",nextDay:"[bihar] LT[etan]",nextWeek:"dddd LT[etan]",lastDay:"[atzo] LT[etan]",lastWeek:"[aurreko] dddd LT[etan]",sameElse:"L"},relativeTime:{future:"%s barru",past:"duela %s",s:"segundo batzuk",ss:"%d segundo",m:"minutu bat",mm:"%d minutu",h:"ordu bat",hh:"%d ordu",d:"egun bat",dd:"%d egun",M:"hilabete bat",MM:"%d hilabete",y:"urte bat",yy:"%d urte"},dayOfMonthOrdinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:7}})}(i(16738))},26151:function(m,S,i){!function(r){"use strict";var a={1:"\u06f1",2:"\u06f2",3:"\u06f3",4:"\u06f4",5:"\u06f5",6:"\u06f6",7:"\u06f7",8:"\u06f8",9:"\u06f9",0:"\u06f0"},f={"\u06f1":"1","\u06f2":"2","\u06f3":"3","\u06f4":"4","\u06f5":"5","\u06f6":"6","\u06f7":"7","\u06f8":"8","\u06f9":"9","\u06f0":"0"};r.defineLocale("fa",{months:"\u0698\u0627\u0646\u0648\u06cc\u0647_\u0641\u0648\u0631\u06cc\u0647_\u0645\u0627\u0631\u0633_\u0622\u0648\u0631\u06cc\u0644_\u0645\u0647_\u0698\u0648\u0626\u0646_\u0698\u0648\u0626\u06cc\u0647_\u0627\u0648\u062a_\u0633\u067e\u062a\u0627\u0645\u0628\u0631_\u0627\u06a9\u062a\u0628\u0631_\u0646\u0648\u0627\u0645\u0628\u0631_\u062f\u0633\u0627\u0645\u0628\u0631".split("_"),monthsShort:"\u0698\u0627\u0646\u0648\u06cc\u0647_\u0641\u0648\u0631\u06cc\u0647_\u0645\u0627\u0631\u0633_\u0622\u0648\u0631\u06cc\u0644_\u0645\u0647_\u0698\u0648\u0626\u0646_\u0698\u0648\u0626\u06cc\u0647_\u0627\u0648\u062a_\u0633\u067e\u062a\u0627\u0645\u0628\u0631_\u0627\u06a9\u062a\u0628\u0631_\u0646\u0648\u0627\u0645\u0628\u0631_\u062f\u0633\u0627\u0645\u0628\u0631".split("_"),weekdays:"\u06cc\u06a9\u200c\u0634\u0646\u0628\u0647_\u062f\u0648\u0634\u0646\u0628\u0647_\u0633\u0647\u200c\u0634\u0646\u0628\u0647_\u0686\u0647\u0627\u0631\u0634\u0646\u0628\u0647_\u067e\u0646\u062c\u200c\u0634\u0646\u0628\u0647_\u062c\u0645\u0639\u0647_\u0634\u0646\u0628\u0647".split("_"),weekdaysShort:"\u06cc\u06a9\u200c\u0634\u0646\u0628\u0647_\u062f\u0648\u0634\u0646\u0628\u0647_\u0633\u0647\u200c\u0634\u0646\u0628\u0647_\u0686\u0647\u0627\u0631\u0634\u0646\u0628\u0647_\u067e\u0646\u062c\u200c\u0634\u0646\u0628\u0647_\u062c\u0645\u0639\u0647_\u0634\u0646\u0628\u0647".split("_"),weekdaysMin:"\u06cc_\u062f_\u0633_\u0686_\u067e_\u062c_\u0634".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd, D MMMM YYYY HH:mm"},meridiemParse:/\u0642\u0628\u0644 \u0627\u0632 \u0638\u0647\u0631|\u0628\u0639\u062f \u0627\u0632 \u0638\u0647\u0631/,isPM:function(e){return/\u0628\u0639\u062f \u0627\u0632 \u0638\u0647\u0631/.test(e)},meridiem:function(e,p,y){return e<12?"\u0642\u0628\u0644 \u0627\u0632 \u0638\u0647\u0631":"\u0628\u0639\u062f \u0627\u0632 \u0638\u0647\u0631"},calendar:{sameDay:"[\u0627\u0645\u0631\u0648\u0632 \u0633\u0627\u0639\u062a] LT",nextDay:"[\u0641\u0631\u062f\u0627 \u0633\u0627\u0639\u062a] LT",nextWeek:"dddd [\u0633\u0627\u0639\u062a] LT",lastDay:"[\u062f\u06cc\u0631\u0648\u0632 \u0633\u0627\u0639\u062a] LT",lastWeek:"dddd [\u067e\u06cc\u0634] [\u0633\u0627\u0639\u062a] LT",sameElse:"L"},relativeTime:{future:"\u062f\u0631 %s",past:"%s \u067e\u06cc\u0634",s:"\u0686\u0646\u062f \u062b\u0627\u0646\u06cc\u0647",ss:"%d \u062b\u0627\u0646\u06cc\u0647",m:"\u06cc\u06a9 \u062f\u0642\u06cc\u0642\u0647",mm:"%d \u062f\u0642\u06cc\u0642\u0647",h:"\u06cc\u06a9 \u0633\u0627\u0639\u062a",hh:"%d \u0633\u0627\u0639\u062a",d:"\u06cc\u06a9 \u0631\u0648\u0632",dd:"%d \u0631\u0648\u0632",M:"\u06cc\u06a9 \u0645\u0627\u0647",MM:"%d \u0645\u0627\u0647",y:"\u06cc\u06a9 \u0633\u0627\u0644",yy:"%d \u0633\u0627\u0644"},preparse:function(e){return e.replace(/[\u06f0-\u06f9]/g,function(p){return f[p]}).replace(/\u060c/g,",")},postformat:function(e){return e.replace(/\d/g,function(p){return a[p]}).replace(/,/g,"\u060c")},dayOfMonthOrdinalParse:/\d{1,2}\u0645/,ordinal:"%d\u0645",week:{dow:6,doy:12}})}(i(16738))},7997:function(m,S,i){!function(r){"use strict";var a="nolla yksi kaksi kolme nelj\xe4 viisi kuusi seitsem\xe4n kahdeksan yhdeks\xe4n".split(" "),f=["nolla","yhden","kahden","kolmen","nelj\xe4n","viiden","kuuden",a[7],a[8],a[9]];function c(y,T,C,R){var L="";switch(C){case"s":return R?"muutaman sekunnin":"muutama sekunti";case"ss":L=R?"sekunnin":"sekuntia";break;case"m":return R?"minuutin":"minuutti";case"mm":L=R?"minuutin":"minuuttia";break;case"h":return R?"tunnin":"tunti";case"hh":L=R?"tunnin":"tuntia";break;case"d":return R?"p\xe4iv\xe4n":"p\xe4iv\xe4";case"dd":L=R?"p\xe4iv\xe4n":"p\xe4iv\xe4\xe4";break;case"M":return R?"kuukauden":"kuukausi";case"MM":L=R?"kuukauden":"kuukautta";break;case"y":return R?"vuoden":"vuosi";case"yy":L=R?"vuoden":"vuotta"}return function e(y,T){return y<10?T?f[y]:a[y]:y}(y,R)+" "+L}r.defineLocale("fi",{months:"tammikuu_helmikuu_maaliskuu_huhtikuu_toukokuu_kes\xe4kuu_hein\xe4kuu_elokuu_syyskuu_lokakuu_marraskuu_joulukuu".split("_"),monthsShort:"tammi_helmi_maalis_huhti_touko_kes\xe4_hein\xe4_elo_syys_loka_marras_joulu".split("_"),weekdays:"sunnuntai_maanantai_tiistai_keskiviikko_torstai_perjantai_lauantai".split("_"),weekdaysShort:"su_ma_ti_ke_to_pe_la".split("_"),weekdaysMin:"su_ma_ti_ke_to_pe_la".split("_"),longDateFormat:{LT:"HH.mm",LTS:"HH.mm.ss",L:"DD.MM.YYYY",LL:"Do MMMM[ta] YYYY",LLL:"Do MMMM[ta] YYYY, [klo] HH.mm",LLLL:"dddd, Do MMMM[ta] YYYY, [klo] HH.mm",l:"D.M.YYYY",ll:"Do MMM YYYY",lll:"Do MMM YYYY, [klo] HH.mm",llll:"ddd, Do MMM YYYY, [klo] HH.mm"},calendar:{sameDay:"[t\xe4n\xe4\xe4n] [klo] LT",nextDay:"[huomenna] [klo] LT",nextWeek:"dddd [klo] LT",lastDay:"[eilen] [klo] LT",lastWeek:"[viime] dddd[na] [klo] LT",sameElse:"L"},relativeTime:{future:"%s p\xe4\xe4st\xe4",past:"%s sitten",s:c,ss:c,m:c,mm:c,h:c,hh:c,d:c,dd:c,M:c,MM:c,y:c,yy:c},dayOfMonthOrdinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:4}})}(i(16738))},58898:function(m,S,i){!function(r){"use strict";r.defineLocale("fil",{months:"Enero_Pebrero_Marso_Abril_Mayo_Hunyo_Hulyo_Agosto_Setyembre_Oktubre_Nobyembre_Disyembre".split("_"),monthsShort:"Ene_Peb_Mar_Abr_May_Hun_Hul_Ago_Set_Okt_Nob_Dis".split("_"),weekdays:"Linggo_Lunes_Martes_Miyerkules_Huwebes_Biyernes_Sabado".split("_"),weekdaysShort:"Lin_Lun_Mar_Miy_Huw_Biy_Sab".split("_"),weekdaysMin:"Li_Lu_Ma_Mi_Hu_Bi_Sab".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"MM/D/YYYY",LL:"MMMM D, YYYY",LLL:"MMMM D, YYYY HH:mm",LLLL:"dddd, MMMM DD, YYYY HH:mm"},calendar:{sameDay:"LT [ngayong araw]",nextDay:"[Bukas ng] LT",nextWeek:"LT [sa susunod na] dddd",lastDay:"LT [kahapon]",lastWeek:"LT [noong nakaraang] dddd",sameElse:"L"},relativeTime:{future:"sa loob ng %s",past:"%s ang nakalipas",s:"ilang segundo",ss:"%d segundo",m:"isang minuto",mm:"%d minuto",h:"isang oras",hh:"%d oras",d:"isang araw",dd:"%d araw",M:"isang buwan",MM:"%d buwan",y:"isang taon",yy:"%d taon"},dayOfMonthOrdinalParse:/\d{1,2}/,ordinal:function(f){return f},week:{dow:1,doy:4}})}(i(16738))},37779:function(m,S,i){!function(r){"use strict";r.defineLocale("fo",{months:"januar_februar_mars_apr\xedl_mai_juni_juli_august_september_oktober_november_desember".split("_"),monthsShort:"jan_feb_mar_apr_mai_jun_jul_aug_sep_okt_nov_des".split("_"),weekdays:"sunnudagur_m\xe1nadagur_t\xfdsdagur_mikudagur_h\xf3sdagur_fr\xedggjadagur_leygardagur".split("_"),weekdaysShort:"sun_m\xe1n_t\xfds_mik_h\xf3s_fr\xed_ley".split("_"),weekdaysMin:"su_m\xe1_t\xfd_mi_h\xf3_fr_le".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd D. MMMM, YYYY HH:mm"},calendar:{sameDay:"[\xcd dag kl.] LT",nextDay:"[\xcd morgin kl.] LT",nextWeek:"dddd [kl.] LT",lastDay:"[\xcd gj\xe1r kl.] LT",lastWeek:"[s\xed\xf0stu] dddd [kl] LT",sameElse:"L"},relativeTime:{future:"um %s",past:"%s s\xed\xf0ani",s:"f\xe1 sekund",ss:"%d sekundir",m:"ein minuttur",mm:"%d minuttir",h:"ein t\xedmi",hh:"%d t\xedmar",d:"ein dagur",dd:"%d dagar",M:"ein m\xe1na\xf0ur",MM:"%d m\xe1na\xf0ir",y:"eitt \xe1r",yy:"%d \xe1r"},dayOfMonthOrdinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:4}})}(i(16738))},3287:function(m,S,i){!function(r){"use strict";r.defineLocale("fr-ca",{months:"janvier_f\xe9vrier_mars_avril_mai_juin_juillet_ao\xfbt_septembre_octobre_novembre_d\xe9cembre".split("_"),monthsShort:"janv._f\xe9vr._mars_avr._mai_juin_juil._ao\xfbt_sept._oct._nov._d\xe9c.".split("_"),monthsParseExact:!0,weekdays:"dimanche_lundi_mardi_mercredi_jeudi_vendredi_samedi".split("_"),weekdaysShort:"dim._lun._mar._mer._jeu._ven._sam.".split("_"),weekdaysMin:"di_lu_ma_me_je_ve_sa".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"YYYY-MM-DD",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd D MMMM YYYY HH:mm"},calendar:{sameDay:"[Aujourd\u2019hui \xe0] LT",nextDay:"[Demain \xe0] LT",nextWeek:"dddd [\xe0] LT",lastDay:"[Hier \xe0] LT",lastWeek:"dddd [dernier \xe0] LT",sameElse:"L"},relativeTime:{future:"dans %s",past:"il y a %s",s:"quelques secondes",ss:"%d secondes",m:"une minute",mm:"%d minutes",h:"une heure",hh:"%d heures",d:"un jour",dd:"%d jours",M:"un mois",MM:"%d mois",y:"un an",yy:"%d ans"},dayOfMonthOrdinalParse:/\d{1,2}(er|e)/,ordinal:function(f,c){switch(c){default:case"M":case"Q":case"D":case"DDD":case"d":return f+(1===f?"er":"e");case"w":case"W":return f+(1===f?"re":"e")}}})}(i(16738))},38867:function(m,S,i){!function(r){"use strict";r.defineLocale("fr-ch",{months:"janvier_f\xe9vrier_mars_avril_mai_juin_juillet_ao\xfbt_septembre_octobre_novembre_d\xe9cembre".split("_"),monthsShort:"janv._f\xe9vr._mars_avr._mai_juin_juil._ao\xfbt_sept._oct._nov._d\xe9c.".split("_"),monthsParseExact:!0,weekdays:"dimanche_lundi_mardi_mercredi_jeudi_vendredi_samedi".split("_"),weekdaysShort:"dim._lun._mar._mer._jeu._ven._sam.".split("_"),weekdaysMin:"di_lu_ma_me_je_ve_sa".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD.MM.YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd D MMMM YYYY HH:mm"},calendar:{sameDay:"[Aujourd\u2019hui \xe0] LT",nextDay:"[Demain \xe0] LT",nextWeek:"dddd [\xe0] LT",lastDay:"[Hier \xe0] LT",lastWeek:"dddd [dernier \xe0] LT",sameElse:"L"},relativeTime:{future:"dans %s",past:"il y a %s",s:"quelques secondes",ss:"%d secondes",m:"une minute",mm:"%d minutes",h:"une heure",hh:"%d heures",d:"un jour",dd:"%d jours",M:"un mois",MM:"%d mois",y:"un an",yy:"%d ans"},dayOfMonthOrdinalParse:/\d{1,2}(er|e)/,ordinal:function(f,c){switch(c){default:case"M":case"Q":case"D":case"DDD":case"d":return f+(1===f?"er":"e");case"w":case"W":return f+(1===f?"re":"e")}},week:{dow:1,doy:4}})}(i(16738))},28174:function(m,S,i){!function(r){"use strict";var c=/(janv\.?|f\xe9vr\.?|mars|avr\.?|mai|juin|juil\.?|ao\xfbt|sept\.?|oct\.?|nov\.?|d\xe9c\.?|janvier|f\xe9vrier|mars|avril|mai|juin|juillet|ao\xfbt|septembre|octobre|novembre|d\xe9cembre)/i,e=[/^janv/i,/^f\xe9vr/i,/^mars/i,/^avr/i,/^mai/i,/^juin/i,/^juil/i,/^ao\xfbt/i,/^sept/i,/^oct/i,/^nov/i,/^d\xe9c/i];r.defineLocale("fr",{months:"janvier_f\xe9vrier_mars_avril_mai_juin_juillet_ao\xfbt_septembre_octobre_novembre_d\xe9cembre".split("_"),monthsShort:"janv._f\xe9vr._mars_avr._mai_juin_juil._ao\xfbt_sept._oct._nov._d\xe9c.".split("_"),monthsRegex:c,monthsShortRegex:c,monthsStrictRegex:/^(janvier|f\xe9vrier|mars|avril|mai|juin|juillet|ao\xfbt|septembre|octobre|novembre|d\xe9cembre)/i,monthsShortStrictRegex:/(janv\.?|f\xe9vr\.?|mars|avr\.?|mai|juin|juil\.?|ao\xfbt|sept\.?|oct\.?|nov\.?|d\xe9c\.?)/i,monthsParse:e,longMonthsParse:e,shortMonthsParse:e,weekdays:"dimanche_lundi_mardi_mercredi_jeudi_vendredi_samedi".split("_"),weekdaysShort:"dim._lun._mar._mer._jeu._ven._sam.".split("_"),weekdaysMin:"di_lu_ma_me_je_ve_sa".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd D MMMM YYYY HH:mm"},calendar:{sameDay:"[Aujourd\u2019hui \xe0] LT",nextDay:"[Demain \xe0] LT",nextWeek:"dddd [\xe0] LT",lastDay:"[Hier \xe0] LT",lastWeek:"dddd [dernier \xe0] LT",sameElse:"L"},relativeTime:{future:"dans %s",past:"il y a %s",s:"quelques secondes",ss:"%d secondes",m:"une minute",mm:"%d minutes",h:"une heure",hh:"%d heures",d:"un jour",dd:"%d jours",w:"une semaine",ww:"%d semaines",M:"un mois",MM:"%d mois",y:"un an",yy:"%d ans"},dayOfMonthOrdinalParse:/\d{1,2}(er|)/,ordinal:function(y,T){switch(T){case"D":return y+(1===y?"er":"");default:case"M":case"Q":case"DDD":case"d":return y+(1===y?"er":"e");case"w":case"W":return y+(1===y?"re":"e")}},week:{dow:1,doy:4}})}(i(16738))},50452:function(m,S,i){!function(r){"use strict";var a="jan._feb._mrt._apr._mai_jun._jul._aug._sep._okt._nov._des.".split("_"),f="jan_feb_mrt_apr_mai_jun_jul_aug_sep_okt_nov_des".split("_");r.defineLocale("fy",{months:"jannewaris_febrewaris_maart_april_maaie_juny_july_augustus_septimber_oktober_novimber_desimber".split("_"),monthsShort:function(e,p){return e?/-MMM-/.test(p)?f[e.month()]:a[e.month()]:a},monthsParseExact:!0,weekdays:"snein_moandei_tiisdei_woansdei_tongersdei_freed_sneon".split("_"),weekdaysShort:"si._mo._ti._wo._to._fr._so.".split("_"),weekdaysMin:"Si_Mo_Ti_Wo_To_Fr_So".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD-MM-YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd D MMMM YYYY HH:mm"},calendar:{sameDay:"[hjoed om] LT",nextDay:"[moarn om] LT",nextWeek:"dddd [om] LT",lastDay:"[juster om] LT",lastWeek:"[\xf4fr\xfbne] dddd [om] LT",sameElse:"L"},relativeTime:{future:"oer %s",past:"%s lyn",s:"in pear sekonden",ss:"%d sekonden",m:"ien min\xfat",mm:"%d minuten",h:"ien oere",hh:"%d oeren",d:"ien dei",dd:"%d dagen",M:"ien moanne",MM:"%d moannen",y:"ien jier",yy:"%d jierren"},dayOfMonthOrdinalParse:/\d{1,2}(ste|de)/,ordinal:function(e){return e+(1===e||8===e||e>=20?"ste":"de")},week:{dow:1,doy:4}})}(i(16738))},45014:function(m,S,i){!function(r){"use strict";r.defineLocale("ga",{months:["Ean\xe1ir","Feabhra","M\xe1rta","Aibre\xe1n","Bealtaine","Meitheamh","I\xfail","L\xfanasa","Me\xe1n F\xf3mhair","Deireadh F\xf3mhair","Samhain","Nollaig"],monthsShort:["Ean","Feabh","M\xe1rt","Aib","Beal","Meith","I\xfail","L\xfan","M.F.","D.F.","Samh","Noll"],monthsParseExact:!0,weekdays:["D\xe9 Domhnaigh","D\xe9 Luain","D\xe9 M\xe1irt","D\xe9 C\xe9adaoin","D\xe9ardaoin","D\xe9 hAoine","D\xe9 Sathairn"],weekdaysShort:["Domh","Luan","M\xe1irt","C\xe9ad","D\xe9ar","Aoine","Sath"],weekdaysMin:["Do","Lu","M\xe1","C\xe9","D\xe9","A","Sa"],longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd, D MMMM YYYY HH:mm"},calendar:{sameDay:"[Inniu ag] LT",nextDay:"[Am\xe1rach ag] LT",nextWeek:"dddd [ag] LT",lastDay:"[Inn\xe9 ag] LT",lastWeek:"dddd [seo caite] [ag] LT",sameElse:"L"},relativeTime:{future:"i %s",past:"%s \xf3 shin",s:"c\xfapla soicind",ss:"%d soicind",m:"n\xf3im\xe9ad",mm:"%d n\xf3im\xe9ad",h:"uair an chloig",hh:"%d uair an chloig",d:"l\xe1",dd:"%d l\xe1",M:"m\xed",MM:"%d m\xedonna",y:"bliain",yy:"%d bliain"},dayOfMonthOrdinalParse:/\d{1,2}(d|na|mh)/,ordinal:function(T){return T+(1===T?"d":T%10==2?"na":"mh")},week:{dow:1,doy:4}})}(i(16738))},74127:function(m,S,i){!function(r){"use strict";r.defineLocale("gd",{months:["Am Faoilleach","An Gearran","Am M\xe0rt","An Giblean","An C\xe8itean","An t-\xd2gmhios","An t-Iuchar","An L\xf9nastal","An t-Sultain","An D\xe0mhair","An t-Samhain","An D\xf9bhlachd"],monthsShort:["Faoi","Gear","M\xe0rt","Gibl","C\xe8it","\xd2gmh","Iuch","L\xf9n","Sult","D\xe0mh","Samh","D\xf9bh"],monthsParseExact:!0,weekdays:["Did\xf2mhnaich","Diluain","Dim\xe0irt","Diciadain","Diardaoin","Dihaoine","Disathairne"],weekdaysShort:["Did","Dil","Dim","Dic","Dia","Dih","Dis"],weekdaysMin:["D\xf2","Lu","M\xe0","Ci","Ar","Ha","Sa"],longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd, D MMMM YYYY HH:mm"},calendar:{sameDay:"[An-diugh aig] LT",nextDay:"[A-m\xe0ireach aig] LT",nextWeek:"dddd [aig] LT",lastDay:"[An-d\xe8 aig] LT",lastWeek:"dddd [seo chaidh] [aig] LT",sameElse:"L"},relativeTime:{future:"ann an %s",past:"bho chionn %s",s:"beagan diogan",ss:"%d diogan",m:"mionaid",mm:"%d mionaidean",h:"uair",hh:"%d uairean",d:"latha",dd:"%d latha",M:"m\xecos",MM:"%d m\xecosan",y:"bliadhna",yy:"%d bliadhna"},dayOfMonthOrdinalParse:/\d{1,2}(d|na|mh)/,ordinal:function(T){return T+(1===T?"d":T%10==2?"na":"mh")},week:{dow:1,doy:4}})}(i(16738))},72124:function(m,S,i){!function(r){"use strict";r.defineLocale("gl",{months:"xaneiro_febreiro_marzo_abril_maio_xu\xf1o_xullo_agosto_setembro_outubro_novembro_decembro".split("_"),monthsShort:"xan._feb._mar._abr._mai._xu\xf1._xul._ago._set._out._nov._dec.".split("_"),monthsParseExact:!0,weekdays:"domingo_luns_martes_m\xe9rcores_xoves_venres_s\xe1bado".split("_"),weekdaysShort:"dom._lun._mar._m\xe9r._xov._ven._s\xe1b.".split("_"),weekdaysMin:"do_lu_ma_m\xe9_xo_ve_s\xe1".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"H:mm",LTS:"H:mm:ss",L:"DD/MM/YYYY",LL:"D [de] MMMM [de] YYYY",LLL:"D [de] MMMM [de] YYYY H:mm",LLLL:"dddd, D [de] MMMM [de] YYYY H:mm"},calendar:{sameDay:function(){return"[hoxe "+(1!==this.hours()?"\xe1s":"\xe1")+"] LT"},nextDay:function(){return"[ma\xf1\xe1 "+(1!==this.hours()?"\xe1s":"\xe1")+"] LT"},nextWeek:function(){return"dddd ["+(1!==this.hours()?"\xe1s":"a")+"] LT"},lastDay:function(){return"[onte "+(1!==this.hours()?"\xe1":"a")+"] LT"},lastWeek:function(){return"[o] dddd [pasado "+(1!==this.hours()?"\xe1s":"a")+"] LT"},sameElse:"L"},relativeTime:{future:function(f){return 0===f.indexOf("un")?"n"+f:"en "+f},past:"hai %s",s:"uns segundos",ss:"%d segundos",m:"un minuto",mm:"%d minutos",h:"unha hora",hh:"%d horas",d:"un d\xeda",dd:"%d d\xedas",M:"un mes",MM:"%d meses",y:"un ano",yy:"%d anos"},dayOfMonthOrdinalParse:/\d{1,2}\xba/,ordinal:"%d\xba",week:{dow:1,doy:4}})}(i(16738))},6444:function(m,S,i){!function(r){"use strict";function a(c,e,p,y){var T={s:["\u0925\u094b\u0921\u092f\u093e \u0938\u0945\u0915\u0902\u0921\u093e\u0902\u0928\u0940","\u0925\u094b\u0921\u0947 \u0938\u0945\u0915\u0902\u0921"],ss:[c+" \u0938\u0945\u0915\u0902\u0921\u093e\u0902\u0928\u0940",c+" \u0938\u0945\u0915\u0902\u0921"],m:["\u090f\u0915\u093e \u092e\u093f\u0923\u091f\u093e\u0928","\u090f\u0915 \u092e\u093f\u0928\u0942\u091f"],mm:[c+" \u092e\u093f\u0923\u091f\u093e\u0902\u0928\u0940",c+" \u092e\u093f\u0923\u091f\u093e\u0902"],h:["\u090f\u0915\u093e \u0935\u0930\u093e\u0928","\u090f\u0915 \u0935\u0930"],hh:[c+" \u0935\u0930\u093e\u0902\u0928\u0940",c+" \u0935\u0930\u093e\u0902"],d:["\u090f\u0915\u093e \u0926\u093f\u0938\u093e\u0928","\u090f\u0915 \u0926\u0940\u0938"],dd:[c+" \u0926\u093f\u0938\u093e\u0902\u0928\u0940",c+" \u0926\u0940\u0938"],M:["\u090f\u0915\u093e \u092e\u094d\u0939\u092f\u0928\u094d\u092f\u093e\u0928","\u090f\u0915 \u092e\u094d\u0939\u092f\u0928\u094b"],MM:[c+" \u092e\u094d\u0939\u092f\u0928\u094d\u092f\u093e\u0928\u0940",c+" \u092e\u094d\u0939\u092f\u0928\u0947"],y:["\u090f\u0915\u093e \u0935\u0930\u094d\u0938\u093e\u0928","\u090f\u0915 \u0935\u0930\u094d\u0938"],yy:[c+" \u0935\u0930\u094d\u0938\u093e\u0902\u0928\u0940",c+" \u0935\u0930\u094d\u0938\u093e\u0902"]};return y?T[p][0]:T[p][1]}r.defineLocale("gom-deva",{months:{standalone:"\u091c\u093e\u0928\u0947\u0935\u093e\u0930\u0940_\u092b\u0947\u092c\u094d\u0930\u0941\u0935\u093e\u0930\u0940_\u092e\u093e\u0930\u094d\u091a_\u090f\u092a\u094d\u0930\u0940\u0932_\u092e\u0947_\u091c\u0942\u0928_\u091c\u0941\u0932\u092f_\u0911\u0917\u0938\u094d\u091f_\u0938\u092a\u094d\u091f\u0947\u0902\u092c\u0930_\u0911\u0915\u094d\u091f\u094b\u092c\u0930_\u0928\u094b\u0935\u094d\u0939\u0947\u0902\u092c\u0930_\u0921\u093f\u0938\u0947\u0902\u092c\u0930".split("_"),format:"\u091c\u093e\u0928\u0947\u0935\u093e\u0930\u0940\u091a\u094d\u092f\u093e_\u092b\u0947\u092c\u094d\u0930\u0941\u0935\u093e\u0930\u0940\u091a\u094d\u092f\u093e_\u092e\u093e\u0930\u094d\u091a\u093e\u091a\u094d\u092f\u093e_\u090f\u092a\u094d\u0930\u0940\u0932\u093e\u091a\u094d\u092f\u093e_\u092e\u0947\u092f\u093e\u091a\u094d\u092f\u093e_\u091c\u0942\u0928\u093e\u091a\u094d\u092f\u093e_\u091c\u0941\u0932\u092f\u093e\u091a\u094d\u092f\u093e_\u0911\u0917\u0938\u094d\u091f\u093e\u091a\u094d\u092f\u093e_\u0938\u092a\u094d\u091f\u0947\u0902\u092c\u0930\u093e\u091a\u094d\u092f\u093e_\u0911\u0915\u094d\u091f\u094b\u092c\u0930\u093e\u091a\u094d\u092f\u093e_\u0928\u094b\u0935\u094d\u0939\u0947\u0902\u092c\u0930\u093e\u091a\u094d\u092f\u093e_\u0921\u093f\u0938\u0947\u0902\u092c\u0930\u093e\u091a\u094d\u092f\u093e".split("_"),isFormat:/MMMM(\s)+D[oD]?/},monthsShort:"\u091c\u093e\u0928\u0947._\u092b\u0947\u092c\u094d\u0930\u0941._\u092e\u093e\u0930\u094d\u091a_\u090f\u092a\u094d\u0930\u0940._\u092e\u0947_\u091c\u0942\u0928_\u091c\u0941\u0932._\u0911\u0917._\u0938\u092a\u094d\u091f\u0947\u0902._\u0911\u0915\u094d\u091f\u094b._\u0928\u094b\u0935\u094d\u0939\u0947\u0902._\u0921\u093f\u0938\u0947\u0902.".split("_"),monthsParseExact:!0,weekdays:"\u0906\u092f\u0924\u093e\u0930_\u0938\u094b\u092e\u093e\u0930_\u092e\u0902\u0917\u0933\u093e\u0930_\u092c\u0941\u0927\u0935\u093e\u0930_\u092c\u093f\u0930\u0947\u0938\u094d\u0924\u093e\u0930_\u0938\u0941\u0915\u094d\u0930\u093e\u0930_\u0936\u0947\u0928\u0935\u093e\u0930".split("_"),weekdaysShort:"\u0906\u092f\u0924._\u0938\u094b\u092e._\u092e\u0902\u0917\u0933._\u092c\u0941\u0927._\u092c\u094d\u0930\u0947\u0938\u094d\u0924._\u0938\u0941\u0915\u094d\u0930._\u0936\u0947\u0928.".split("_"),weekdaysMin:"\u0906_\u0938\u094b_\u092e\u0902_\u092c\u0941_\u092c\u094d\u0930\u0947_\u0938\u0941_\u0936\u0947".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"A h:mm [\u0935\u093e\u091c\u0924\u093e\u0902]",LTS:"A h:mm:ss [\u0935\u093e\u091c\u0924\u093e\u0902]",L:"DD-MM-YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY A h:mm [\u0935\u093e\u091c\u0924\u093e\u0902]",LLLL:"dddd, MMMM Do, YYYY, A h:mm [\u0935\u093e\u091c\u0924\u093e\u0902]",llll:"ddd, D MMM YYYY, A h:mm [\u0935\u093e\u091c\u0924\u093e\u0902]"},calendar:{sameDay:"[\u0906\u092f\u091c] LT",nextDay:"[\u092b\u093e\u0932\u094d\u092f\u093e\u0902] LT",nextWeek:"[\u092b\u0941\u0921\u0932\u094b] dddd[,] LT",lastDay:"[\u0915\u093e\u0932] LT",lastWeek:"[\u092b\u093e\u091f\u0932\u094b] dddd[,] LT",sameElse:"L"},relativeTime:{future:"%s",past:"%s \u0906\u0926\u0940\u0902",s:a,ss:a,m:a,mm:a,h:a,hh:a,d:a,dd:a,M:a,MM:a,y:a,yy:a},dayOfMonthOrdinalParse:/\d{1,2}(\u0935\u0947\u0930)/,ordinal:function(c,e){return"D"===e?c+"\u0935\u0947\u0930":c},week:{dow:0,doy:3},meridiemParse:/\u0930\u093e\u0924\u0940|\u0938\u0915\u093e\u0933\u0940\u0902|\u0926\u0928\u092a\u093e\u0930\u093e\u0902|\u0938\u093e\u0902\u091c\u0947/,meridiemHour:function(c,e){return 12===c&&(c=0),"\u0930\u093e\u0924\u0940"===e?c<4?c:c+12:"\u0938\u0915\u093e\u0933\u0940\u0902"===e?c:"\u0926\u0928\u092a\u093e\u0930\u093e\u0902"===e?c>12?c:c+12:"\u0938\u093e\u0902\u091c\u0947"===e?c+12:void 0},meridiem:function(c,e,p){return c<4?"\u0930\u093e\u0924\u0940":c<12?"\u0938\u0915\u093e\u0933\u0940\u0902":c<16?"\u0926\u0928\u092a\u093e\u0930\u093e\u0902":c<20?"\u0938\u093e\u0902\u091c\u0947":"\u0930\u093e\u0924\u0940"}})}(i(16738))},37953:function(m,S,i){!function(r){"use strict";function a(c,e,p,y){var T={s:["thoddea sekondamni","thodde sekond"],ss:[c+" sekondamni",c+" sekond"],m:["eka mintan","ek minut"],mm:[c+" mintamni",c+" mintam"],h:["eka voran","ek vor"],hh:[c+" voramni",c+" voram"],d:["eka disan","ek dis"],dd:[c+" disamni",c+" dis"],M:["eka mhoinean","ek mhoino"],MM:[c+" mhoineamni",c+" mhoine"],y:["eka vorsan","ek voros"],yy:[c+" vorsamni",c+" vorsam"]};return y?T[p][0]:T[p][1]}r.defineLocale("gom-latn",{months:{standalone:"Janer_Febrer_Mars_Abril_Mai_Jun_Julai_Agost_Setembr_Otubr_Novembr_Dezembr".split("_"),format:"Janerachea_Febrerachea_Marsachea_Abrilachea_Maiachea_Junachea_Julaiachea_Agostachea_Setembrachea_Otubrachea_Novembrachea_Dezembrachea".split("_"),isFormat:/MMMM(\s)+D[oD]?/},monthsShort:"Jan._Feb._Mars_Abr._Mai_Jun_Jul._Ago._Set._Otu._Nov._Dez.".split("_"),monthsParseExact:!0,weekdays:"Aitar_Somar_Mongllar_Budhvar_Birestar_Sukrar_Son'var".split("_"),weekdaysShort:"Ait._Som._Mon._Bud._Bre._Suk._Son.".split("_"),weekdaysMin:"Ai_Sm_Mo_Bu_Br_Su_Sn".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"A h:mm [vazta]",LTS:"A h:mm:ss [vazta]",L:"DD-MM-YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY A h:mm [vazta]",LLLL:"dddd, MMMM Do, YYYY, A h:mm [vazta]",llll:"ddd, D MMM YYYY, A h:mm [vazta]"},calendar:{sameDay:"[Aiz] LT",nextDay:"[Faleam] LT",nextWeek:"[Fuddlo] dddd[,] LT",lastDay:"[Kal] LT",lastWeek:"[Fattlo] dddd[,] LT",sameElse:"L"},relativeTime:{future:"%s",past:"%s adim",s:a,ss:a,m:a,mm:a,h:a,hh:a,d:a,dd:a,M:a,MM:a,y:a,yy:a},dayOfMonthOrdinalParse:/\d{1,2}(er)/,ordinal:function(c,e){return"D"===e?c+"er":c},week:{dow:0,doy:3},meridiemParse:/rati|sokallim|donparam|sanje/,meridiemHour:function(c,e){return 12===c&&(c=0),"rati"===e?c<4?c:c+12:"sokallim"===e?c:"donparam"===e?c>12?c:c+12:"sanje"===e?c+12:void 0},meridiem:function(c,e,p){return c<4?"rati":c<12?"sokallim":c<16?"donparam":c<20?"sanje":"rati"}})}(i(16738))},76604:function(m,S,i){!function(r){"use strict";var a={1:"\u0ae7",2:"\u0ae8",3:"\u0ae9",4:"\u0aea",5:"\u0aeb",6:"\u0aec",7:"\u0aed",8:"\u0aee",9:"\u0aef",0:"\u0ae6"},f={"\u0ae7":"1","\u0ae8":"2","\u0ae9":"3","\u0aea":"4","\u0aeb":"5","\u0aec":"6","\u0aed":"7","\u0aee":"8","\u0aef":"9","\u0ae6":"0"};r.defineLocale("gu",{months:"\u0a9c\u0abe\u0aa8\u0acd\u0aaf\u0ac1\u0a86\u0ab0\u0ac0_\u0aab\u0ac7\u0aac\u0acd\u0ab0\u0ac1\u0a86\u0ab0\u0ac0_\u0aae\u0abe\u0ab0\u0acd\u0a9a_\u0a8f\u0aaa\u0acd\u0ab0\u0abf\u0ab2_\u0aae\u0ac7_\u0a9c\u0ac2\u0aa8_\u0a9c\u0ac1\u0ab2\u0abe\u0a88_\u0a91\u0a97\u0ab8\u0acd\u0a9f_\u0ab8\u0aaa\u0acd\u0a9f\u0ac7\u0aae\u0acd\u0aac\u0ab0_\u0a91\u0a95\u0acd\u0a9f\u0acd\u0aac\u0ab0_\u0aa8\u0ab5\u0ac7\u0aae\u0acd\u0aac\u0ab0_\u0aa1\u0abf\u0ab8\u0ac7\u0aae\u0acd\u0aac\u0ab0".split("_"),monthsShort:"\u0a9c\u0abe\u0aa8\u0acd\u0aaf\u0ac1._\u0aab\u0ac7\u0aac\u0acd\u0ab0\u0ac1._\u0aae\u0abe\u0ab0\u0acd\u0a9a_\u0a8f\u0aaa\u0acd\u0ab0\u0abf._\u0aae\u0ac7_\u0a9c\u0ac2\u0aa8_\u0a9c\u0ac1\u0ab2\u0abe._\u0a91\u0a97._\u0ab8\u0aaa\u0acd\u0a9f\u0ac7._\u0a91\u0a95\u0acd\u0a9f\u0acd._\u0aa8\u0ab5\u0ac7._\u0aa1\u0abf\u0ab8\u0ac7.".split("_"),monthsParseExact:!0,weekdays:"\u0ab0\u0ab5\u0abf\u0ab5\u0abe\u0ab0_\u0ab8\u0acb\u0aae\u0ab5\u0abe\u0ab0_\u0aae\u0a82\u0a97\u0ab3\u0ab5\u0abe\u0ab0_\u0aac\u0ac1\u0aa7\u0acd\u0ab5\u0abe\u0ab0_\u0a97\u0ac1\u0ab0\u0ac1\u0ab5\u0abe\u0ab0_\u0ab6\u0ac1\u0a95\u0acd\u0ab0\u0ab5\u0abe\u0ab0_\u0ab6\u0aa8\u0abf\u0ab5\u0abe\u0ab0".split("_"),weekdaysShort:"\u0ab0\u0ab5\u0abf_\u0ab8\u0acb\u0aae_\u0aae\u0a82\u0a97\u0ab3_\u0aac\u0ac1\u0aa7\u0acd_\u0a97\u0ac1\u0ab0\u0ac1_\u0ab6\u0ac1\u0a95\u0acd\u0ab0_\u0ab6\u0aa8\u0abf".split("_"),weekdaysMin:"\u0ab0_\u0ab8\u0acb_\u0aae\u0a82_\u0aac\u0ac1_\u0a97\u0ac1_\u0ab6\u0ac1_\u0ab6".split("_"),longDateFormat:{LT:"A h:mm \u0ab5\u0abe\u0a97\u0acd\u0aaf\u0ac7",LTS:"A h:mm:ss \u0ab5\u0abe\u0a97\u0acd\u0aaf\u0ac7",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY, A h:mm \u0ab5\u0abe\u0a97\u0acd\u0aaf\u0ac7",LLLL:"dddd, D MMMM YYYY, A h:mm \u0ab5\u0abe\u0a97\u0acd\u0aaf\u0ac7"},calendar:{sameDay:"[\u0a86\u0a9c] LT",nextDay:"[\u0a95\u0abe\u0ab2\u0ac7] LT",nextWeek:"dddd, LT",lastDay:"[\u0a97\u0a87\u0a95\u0abe\u0ab2\u0ac7] LT",lastWeek:"[\u0aaa\u0abe\u0a9b\u0ab2\u0abe] dddd, LT",sameElse:"L"},relativeTime:{future:"%s \u0aae\u0abe",past:"%s \u0aaa\u0ab9\u0ac7\u0ab2\u0abe",s:"\u0a85\u0aae\u0ac1\u0a95 \u0aaa\u0ab3\u0acb",ss:"%d \u0ab8\u0ac7\u0a95\u0a82\u0aa1",m:"\u0a8f\u0a95 \u0aae\u0abf\u0aa8\u0abf\u0a9f",mm:"%d \u0aae\u0abf\u0aa8\u0abf\u0a9f",h:"\u0a8f\u0a95 \u0a95\u0ab2\u0abe\u0a95",hh:"%d \u0a95\u0ab2\u0abe\u0a95",d:"\u0a8f\u0a95 \u0aa6\u0abf\u0ab5\u0ab8",dd:"%d \u0aa6\u0abf\u0ab5\u0ab8",M:"\u0a8f\u0a95 \u0aae\u0ab9\u0abf\u0aa8\u0acb",MM:"%d \u0aae\u0ab9\u0abf\u0aa8\u0acb",y:"\u0a8f\u0a95 \u0ab5\u0ab0\u0acd\u0ab7",yy:"%d \u0ab5\u0ab0\u0acd\u0ab7"},preparse:function(e){return e.replace(/[\u0ae7\u0ae8\u0ae9\u0aea\u0aeb\u0aec\u0aed\u0aee\u0aef\u0ae6]/g,function(p){return f[p]})},postformat:function(e){return e.replace(/\d/g,function(p){return a[p]})},meridiemParse:/\u0ab0\u0abe\u0aa4|\u0aac\u0aaa\u0acb\u0ab0|\u0ab8\u0ab5\u0abe\u0ab0|\u0ab8\u0abe\u0a82\u0a9c/,meridiemHour:function(e,p){return 12===e&&(e=0),"\u0ab0\u0abe\u0aa4"===p?e<4?e:e+12:"\u0ab8\u0ab5\u0abe\u0ab0"===p?e:"\u0aac\u0aaa\u0acb\u0ab0"===p?e>=10?e:e+12:"\u0ab8\u0abe\u0a82\u0a9c"===p?e+12:void 0},meridiem:function(e,p,y){return e<4?"\u0ab0\u0abe\u0aa4":e<10?"\u0ab8\u0ab5\u0abe\u0ab0":e<17?"\u0aac\u0aaa\u0acb\u0ab0":e<20?"\u0ab8\u0abe\u0a82\u0a9c":"\u0ab0\u0abe\u0aa4"},week:{dow:0,doy:6}})}(i(16738))},1222:function(m,S,i){!function(r){"use strict";r.defineLocale("he",{months:"\u05d9\u05e0\u05d5\u05d0\u05e8_\u05e4\u05d1\u05e8\u05d5\u05d0\u05e8_\u05de\u05e8\u05e5_\u05d0\u05e4\u05e8\u05d9\u05dc_\u05de\u05d0\u05d9_\u05d9\u05d5\u05e0\u05d9_\u05d9\u05d5\u05dc\u05d9_\u05d0\u05d5\u05d2\u05d5\u05e1\u05d8_\u05e1\u05e4\u05d8\u05de\u05d1\u05e8_\u05d0\u05d5\u05e7\u05d8\u05d5\u05d1\u05e8_\u05e0\u05d5\u05d1\u05de\u05d1\u05e8_\u05d3\u05e6\u05de\u05d1\u05e8".split("_"),monthsShort:"\u05d9\u05e0\u05d5\u05f3_\u05e4\u05d1\u05e8\u05f3_\u05de\u05e8\u05e5_\u05d0\u05e4\u05e8\u05f3_\u05de\u05d0\u05d9_\u05d9\u05d5\u05e0\u05d9_\u05d9\u05d5\u05dc\u05d9_\u05d0\u05d5\u05d2\u05f3_\u05e1\u05e4\u05d8\u05f3_\u05d0\u05d5\u05e7\u05f3_\u05e0\u05d5\u05d1\u05f3_\u05d3\u05e6\u05de\u05f3".split("_"),weekdays:"\u05e8\u05d0\u05e9\u05d5\u05df_\u05e9\u05e0\u05d9_\u05e9\u05dc\u05d9\u05e9\u05d9_\u05e8\u05d1\u05d9\u05e2\u05d9_\u05d7\u05de\u05d9\u05e9\u05d9_\u05e9\u05d9\u05e9\u05d9_\u05e9\u05d1\u05ea".split("_"),weekdaysShort:"\u05d0\u05f3_\u05d1\u05f3_\u05d2\u05f3_\u05d3\u05f3_\u05d4\u05f3_\u05d5\u05f3_\u05e9\u05f3".split("_"),weekdaysMin:"\u05d0_\u05d1_\u05d2_\u05d3_\u05d4_\u05d5_\u05e9".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D [\u05d1]MMMM YYYY",LLL:"D [\u05d1]MMMM YYYY HH:mm",LLLL:"dddd, D [\u05d1]MMMM YYYY HH:mm",l:"D/M/YYYY",ll:"D MMM YYYY",lll:"D MMM YYYY HH:mm",llll:"ddd, D MMM YYYY HH:mm"},calendar:{sameDay:"[\u05d4\u05d9\u05d5\u05dd \u05d1\u05be]LT",nextDay:"[\u05de\u05d7\u05e8 \u05d1\u05be]LT",nextWeek:"dddd [\u05d1\u05e9\u05e2\u05d4] LT",lastDay:"[\u05d0\u05ea\u05de\u05d5\u05dc \u05d1\u05be]LT",lastWeek:"[\u05d1\u05d9\u05d5\u05dd] dddd [\u05d4\u05d0\u05d7\u05e8\u05d5\u05df \u05d1\u05e9\u05e2\u05d4] LT",sameElse:"L"},relativeTime:{future:"\u05d1\u05e2\u05d5\u05d3 %s",past:"\u05dc\u05e4\u05e0\u05d9 %s",s:"\u05de\u05e1\u05e4\u05e8 \u05e9\u05e0\u05d9\u05d5\u05ea",ss:"%d \u05e9\u05e0\u05d9\u05d5\u05ea",m:"\u05d3\u05e7\u05d4",mm:"%d \u05d3\u05e7\u05d5\u05ea",h:"\u05e9\u05e2\u05d4",hh:function(f){return 2===f?"\u05e9\u05e2\u05ea\u05d9\u05d9\u05dd":f+" \u05e9\u05e2\u05d5\u05ea"},d:"\u05d9\u05d5\u05dd",dd:function(f){return 2===f?"\u05d9\u05d5\u05de\u05d9\u05d9\u05dd":f+" \u05d9\u05de\u05d9\u05dd"},M:"\u05d7\u05d5\u05d3\u05e9",MM:function(f){return 2===f?"\u05d7\u05d5\u05d3\u05e9\u05d9\u05d9\u05dd":f+" \u05d7\u05d5\u05d3\u05e9\u05d9\u05dd"},y:"\u05e9\u05e0\u05d4",yy:function(f){return 2===f?"\u05e9\u05e0\u05ea\u05d9\u05d9\u05dd":f%10==0&&10!==f?f+" \u05e9\u05e0\u05d4":f+" \u05e9\u05e0\u05d9\u05dd"}},meridiemParse:/\u05d0\u05d7\u05d4"\u05e6|\u05dc\u05e4\u05e0\u05d4"\u05e6|\u05d0\u05d7\u05e8\u05d9 \u05d4\u05e6\u05d4\u05e8\u05d9\u05d9\u05dd|\u05dc\u05e4\u05e0\u05d9 \u05d4\u05e6\u05d4\u05e8\u05d9\u05d9\u05dd|\u05dc\u05e4\u05e0\u05d5\u05ea \u05d1\u05d5\u05e7\u05e8|\u05d1\u05d1\u05d5\u05e7\u05e8|\u05d1\u05e2\u05e8\u05d1/i,isPM:function(f){return/^(\u05d0\u05d7\u05d4"\u05e6|\u05d0\u05d7\u05e8\u05d9 \u05d4\u05e6\u05d4\u05e8\u05d9\u05d9\u05dd|\u05d1\u05e2\u05e8\u05d1)$/.test(f)},meridiem:function(f,c,e){return f<5?"\u05dc\u05e4\u05e0\u05d5\u05ea \u05d1\u05d5\u05e7\u05e8":f<10?"\u05d1\u05d1\u05d5\u05e7\u05e8":f<12?e?'\u05dc\u05e4\u05e0\u05d4"\u05e6':"\u05dc\u05e4\u05e0\u05d9 \u05d4\u05e6\u05d4\u05e8\u05d9\u05d9\u05dd":f<18?e?'\u05d0\u05d7\u05d4"\u05e6':"\u05d0\u05d7\u05e8\u05d9 \u05d4\u05e6\u05d4\u05e8\u05d9\u05d9\u05dd":"\u05d1\u05e2\u05e8\u05d1"}})}(i(16738))},74235:function(m,S,i){!function(r){"use strict";var a={1:"\u0967",2:"\u0968",3:"\u0969",4:"\u096a",5:"\u096b",6:"\u096c",7:"\u096d",8:"\u096e",9:"\u096f",0:"\u0966"},f={"\u0967":"1","\u0968":"2","\u0969":"3","\u096a":"4","\u096b":"5","\u096c":"6","\u096d":"7","\u096e":"8","\u096f":"9","\u0966":"0"},c=[/^\u091c\u0928/i,/^\u092b\u093c\u0930|\u092b\u0930/i,/^\u092e\u093e\u0930\u094d\u091a/i,/^\u0905\u092a\u094d\u0930\u0948/i,/^\u092e\u0908/i,/^\u091c\u0942\u0928/i,/^\u091c\u0941\u0932/i,/^\u0905\u0917/i,/^\u0938\u093f\u0924\u0902|\u0938\u093f\u0924/i,/^\u0905\u0915\u094d\u091f\u0942/i,/^\u0928\u0935|\u0928\u0935\u0902/i,/^\u0926\u093f\u0938\u0902|\u0926\u093f\u0938/i];r.defineLocale("hi",{months:{format:"\u091c\u0928\u0935\u0930\u0940_\u092b\u093c\u0930\u0935\u0930\u0940_\u092e\u093e\u0930\u094d\u091a_\u0905\u092a\u094d\u0930\u0948\u0932_\u092e\u0908_\u091c\u0942\u0928_\u091c\u0941\u0932\u093e\u0908_\u0905\u0917\u0938\u094d\u0924_\u0938\u093f\u0924\u092e\u094d\u092c\u0930_\u0905\u0915\u094d\u091f\u0942\u092c\u0930_\u0928\u0935\u092e\u094d\u092c\u0930_\u0926\u093f\u0938\u092e\u094d\u092c\u0930".split("_"),standalone:"\u091c\u0928\u0935\u0930\u0940_\u092b\u0930\u0935\u0930\u0940_\u092e\u093e\u0930\u094d\u091a_\u0905\u092a\u094d\u0930\u0948\u0932_\u092e\u0908_\u091c\u0942\u0928_\u091c\u0941\u0932\u093e\u0908_\u0905\u0917\u0938\u094d\u0924_\u0938\u093f\u0924\u0902\u092c\u0930_\u0905\u0915\u094d\u091f\u0942\u092c\u0930_\u0928\u0935\u0902\u092c\u0930_\u0926\u093f\u0938\u0902\u092c\u0930".split("_")},monthsShort:"\u091c\u0928._\u092b\u093c\u0930._\u092e\u093e\u0930\u094d\u091a_\u0905\u092a\u094d\u0930\u0948._\u092e\u0908_\u091c\u0942\u0928_\u091c\u0941\u0932._\u0905\u0917._\u0938\u093f\u0924._\u0905\u0915\u094d\u091f\u0942._\u0928\u0935._\u0926\u093f\u0938.".split("_"),weekdays:"\u0930\u0935\u093f\u0935\u093e\u0930_\u0938\u094b\u092e\u0935\u093e\u0930_\u092e\u0902\u0917\u0932\u0935\u093e\u0930_\u092c\u0941\u0927\u0935\u093e\u0930_\u0917\u0941\u0930\u0942\u0935\u093e\u0930_\u0936\u0941\u0915\u094d\u0930\u0935\u093e\u0930_\u0936\u0928\u093f\u0935\u093e\u0930".split("_"),weekdaysShort:"\u0930\u0935\u093f_\u0938\u094b\u092e_\u092e\u0902\u0917\u0932_\u092c\u0941\u0927_\u0917\u0941\u0930\u0942_\u0936\u0941\u0915\u094d\u0930_\u0936\u0928\u093f".split("_"),weekdaysMin:"\u0930_\u0938\u094b_\u092e\u0902_\u092c\u0941_\u0917\u0941_\u0936\u0941_\u0936".split("_"),longDateFormat:{LT:"A h:mm \u092c\u091c\u0947",LTS:"A h:mm:ss \u092c\u091c\u0947",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY, A h:mm \u092c\u091c\u0947",LLLL:"dddd, D MMMM YYYY, A h:mm \u092c\u091c\u0947"},monthsParse:c,longMonthsParse:c,shortMonthsParse:[/^\u091c\u0928/i,/^\u092b\u093c\u0930/i,/^\u092e\u093e\u0930\u094d\u091a/i,/^\u0905\u092a\u094d\u0930\u0948/i,/^\u092e\u0908/i,/^\u091c\u0942\u0928/i,/^\u091c\u0941\u0932/i,/^\u0905\u0917/i,/^\u0938\u093f\u0924/i,/^\u0905\u0915\u094d\u091f\u0942/i,/^\u0928\u0935/i,/^\u0926\u093f\u0938/i],monthsRegex:/^(\u091c\u0928\u0935\u0930\u0940|\u091c\u0928\.?|\u092b\u093c\u0930\u0935\u0930\u0940|\u092b\u0930\u0935\u0930\u0940|\u092b\u093c\u0930\.?|\u092e\u093e\u0930\u094d\u091a?|\u0905\u092a\u094d\u0930\u0948\u0932|\u0905\u092a\u094d\u0930\u0948\.?|\u092e\u0908?|\u091c\u0942\u0928?|\u091c\u0941\u0932\u093e\u0908|\u091c\u0941\u0932\.?|\u0905\u0917\u0938\u094d\u0924|\u0905\u0917\.?|\u0938\u093f\u0924\u092e\u094d\u092c\u0930|\u0938\u093f\u0924\u0902\u092c\u0930|\u0938\u093f\u0924\.?|\u0905\u0915\u094d\u091f\u0942\u092c\u0930|\u0905\u0915\u094d\u091f\u0942\.?|\u0928\u0935\u092e\u094d\u092c\u0930|\u0928\u0935\u0902\u092c\u0930|\u0928\u0935\.?|\u0926\u093f\u0938\u092e\u094d\u092c\u0930|\u0926\u093f\u0938\u0902\u092c\u0930|\u0926\u093f\u0938\.?)/i,monthsShortRegex:/^(\u091c\u0928\u0935\u0930\u0940|\u091c\u0928\.?|\u092b\u093c\u0930\u0935\u0930\u0940|\u092b\u0930\u0935\u0930\u0940|\u092b\u093c\u0930\.?|\u092e\u093e\u0930\u094d\u091a?|\u0905\u092a\u094d\u0930\u0948\u0932|\u0905\u092a\u094d\u0930\u0948\.?|\u092e\u0908?|\u091c\u0942\u0928?|\u091c\u0941\u0932\u093e\u0908|\u091c\u0941\u0932\.?|\u0905\u0917\u0938\u094d\u0924|\u0905\u0917\.?|\u0938\u093f\u0924\u092e\u094d\u092c\u0930|\u0938\u093f\u0924\u0902\u092c\u0930|\u0938\u093f\u0924\.?|\u0905\u0915\u094d\u091f\u0942\u092c\u0930|\u0905\u0915\u094d\u091f\u0942\.?|\u0928\u0935\u092e\u094d\u092c\u0930|\u0928\u0935\u0902\u092c\u0930|\u0928\u0935\.?|\u0926\u093f\u0938\u092e\u094d\u092c\u0930|\u0926\u093f\u0938\u0902\u092c\u0930|\u0926\u093f\u0938\.?)/i,monthsStrictRegex:/^(\u091c\u0928\u0935\u0930\u0940?|\u092b\u093c\u0930\u0935\u0930\u0940|\u092b\u0930\u0935\u0930\u0940?|\u092e\u093e\u0930\u094d\u091a?|\u0905\u092a\u094d\u0930\u0948\u0932?|\u092e\u0908?|\u091c\u0942\u0928?|\u091c\u0941\u0932\u093e\u0908?|\u0905\u0917\u0938\u094d\u0924?|\u0938\u093f\u0924\u092e\u094d\u092c\u0930|\u0938\u093f\u0924\u0902\u092c\u0930|\u0938\u093f\u0924?\.?|\u0905\u0915\u094d\u091f\u0942\u092c\u0930|\u0905\u0915\u094d\u091f\u0942\.?|\u0928\u0935\u092e\u094d\u092c\u0930|\u0928\u0935\u0902\u092c\u0930?|\u0926\u093f\u0938\u092e\u094d\u092c\u0930|\u0926\u093f\u0938\u0902\u092c\u0930?)/i,monthsShortStrictRegex:/^(\u091c\u0928\.?|\u092b\u093c\u0930\.?|\u092e\u093e\u0930\u094d\u091a?|\u0905\u092a\u094d\u0930\u0948\.?|\u092e\u0908?|\u091c\u0942\u0928?|\u091c\u0941\u0932\.?|\u0905\u0917\.?|\u0938\u093f\u0924\.?|\u0905\u0915\u094d\u091f\u0942\.?|\u0928\u0935\.?|\u0926\u093f\u0938\.?)/i,calendar:{sameDay:"[\u0906\u091c] LT",nextDay:"[\u0915\u0932] LT",nextWeek:"dddd, LT",lastDay:"[\u0915\u0932] LT",lastWeek:"[\u092a\u093f\u091b\u0932\u0947] dddd, LT",sameElse:"L"},relativeTime:{future:"%s \u092e\u0947\u0902",past:"%s \u092a\u0939\u0932\u0947",s:"\u0915\u0941\u091b \u0939\u0940 \u0915\u094d\u0937\u0923",ss:"%d \u0938\u0947\u0915\u0902\u0921",m:"\u090f\u0915 \u092e\u093f\u0928\u091f",mm:"%d \u092e\u093f\u0928\u091f",h:"\u090f\u0915 \u0918\u0902\u091f\u093e",hh:"%d \u0918\u0902\u091f\u0947",d:"\u090f\u0915 \u0926\u093f\u0928",dd:"%d \u0926\u093f\u0928",M:"\u090f\u0915 \u092e\u0939\u0940\u0928\u0947",MM:"%d \u092e\u0939\u0940\u0928\u0947",y:"\u090f\u0915 \u0935\u0930\u094d\u0937",yy:"%d \u0935\u0930\u094d\u0937"},preparse:function(y){return y.replace(/[\u0967\u0968\u0969\u096a\u096b\u096c\u096d\u096e\u096f\u0966]/g,function(T){return f[T]})},postformat:function(y){return y.replace(/\d/g,function(T){return a[T]})},meridiemParse:/\u0930\u093e\u0924|\u0938\u0941\u092c\u0939|\u0926\u094b\u092a\u0939\u0930|\u0936\u093e\u092e/,meridiemHour:function(y,T){return 12===y&&(y=0),"\u0930\u093e\u0924"===T?y<4?y:y+12:"\u0938\u0941\u092c\u0939"===T?y:"\u0926\u094b\u092a\u0939\u0930"===T?y>=10?y:y+12:"\u0936\u093e\u092e"===T?y+12:void 0},meridiem:function(y,T,C){return y<4?"\u0930\u093e\u0924":y<10?"\u0938\u0941\u092c\u0939":y<17?"\u0926\u094b\u092a\u0939\u0930":y<20?"\u0936\u093e\u092e":"\u0930\u093e\u0924"},week:{dow:0,doy:6}})}(i(16738))},622:function(m,S,i){!function(r){"use strict";function a(c,e,p){var y=c+" ";switch(p){case"ss":return y+(1===c?"sekunda":2===c||3===c||4===c?"sekunde":"sekundi");case"m":return e?"jedna minuta":"jedne minute";case"mm":return y+(1===c?"minuta":2===c||3===c||4===c?"minute":"minuta");case"h":return e?"jedan sat":"jednog sata";case"hh":return y+(1===c?"sat":2===c||3===c||4===c?"sata":"sati");case"dd":return y+(1===c?"dan":"dana");case"MM":return y+(1===c?"mjesec":2===c||3===c||4===c?"mjeseca":"mjeseci");case"yy":return y+(1===c?"godina":2===c||3===c||4===c?"godine":"godina")}}r.defineLocale("hr",{months:{format:"sije\u010dnja_velja\u010de_o\u017eujka_travnja_svibnja_lipnja_srpnja_kolovoza_rujna_listopada_studenoga_prosinca".split("_"),standalone:"sije\u010danj_velja\u010da_o\u017eujak_travanj_svibanj_lipanj_srpanj_kolovoz_rujan_listopad_studeni_prosinac".split("_")},monthsShort:"sij._velj._o\u017eu._tra._svi._lip._srp._kol._ruj._lis._stu._pro.".split("_"),monthsParseExact:!0,weekdays:"nedjelja_ponedjeljak_utorak_srijeda_\u010detvrtak_petak_subota".split("_"),weekdaysShort:"ned._pon._uto._sri._\u010det._pet._sub.".split("_"),weekdaysMin:"ne_po_ut_sr_\u010de_pe_su".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"H:mm",LTS:"H:mm:ss",L:"DD.MM.YYYY",LL:"Do MMMM YYYY",LLL:"Do MMMM YYYY H:mm",LLLL:"dddd, Do MMMM YYYY H:mm"},calendar:{sameDay:"[danas u] LT",nextDay:"[sutra u] LT",nextWeek:function(){switch(this.day()){case 0:return"[u] [nedjelju] [u] LT";case 3:return"[u] [srijedu] [u] LT";case 6:return"[u] [subotu] [u] LT";case 1:case 2:case 4:case 5:return"[u] dddd [u] LT"}},lastDay:"[ju\u010der u] LT",lastWeek:function(){switch(this.day()){case 0:return"[pro\u0161lu] [nedjelju] [u] LT";case 3:return"[pro\u0161lu] [srijedu] [u] LT";case 6:return"[pro\u0161le] [subote] [u] LT";case 1:case 2:case 4:case 5:return"[pro\u0161li] dddd [u] LT"}},sameElse:"L"},relativeTime:{future:"za %s",past:"prije %s",s:"par sekundi",ss:a,m:a,mm:a,h:a,hh:a,d:"dan",dd:a,M:"mjesec",MM:a,y:"godinu",yy:a},dayOfMonthOrdinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:7}})}(i(16738))},37735:function(m,S,i){!function(r){"use strict";var a="vas\xe1rnap h\xe9tf\u0151n kedden szerd\xe1n cs\xfct\xf6rt\xf6k\xf6n p\xe9nteken szombaton".split(" ");function f(p,y,T,C){var R=p;switch(T){case"s":return C||y?"n\xe9h\xe1ny m\xe1sodperc":"n\xe9h\xe1ny m\xe1sodperce";case"ss":return R+(C||y)?" m\xe1sodperc":" m\xe1sodperce";case"m":return"egy"+(C||y?" perc":" perce");case"mm":return R+(C||y?" perc":" perce");case"h":return"egy"+(C||y?" \xf3ra":" \xf3r\xe1ja");case"hh":return R+(C||y?" \xf3ra":" \xf3r\xe1ja");case"d":return"egy"+(C||y?" nap":" napja");case"dd":return R+(C||y?" nap":" napja");case"M":return"egy"+(C||y?" h\xf3nap":" h\xf3napja");case"MM":return R+(C||y?" h\xf3nap":" h\xf3napja");case"y":return"egy"+(C||y?" \xe9v":" \xe9ve");case"yy":return R+(C||y?" \xe9v":" \xe9ve")}return""}function c(p){return(p?"":"[m\xfalt] ")+"["+a[this.day()]+"] LT[-kor]"}r.defineLocale("hu",{months:"janu\xe1r_febru\xe1r_m\xe1rcius_\xe1prilis_m\xe1jus_j\xfanius_j\xfalius_augusztus_szeptember_okt\xf3ber_november_december".split("_"),monthsShort:"jan._feb._m\xe1rc._\xe1pr._m\xe1j._j\xfan._j\xfal._aug._szept._okt._nov._dec.".split("_"),monthsParseExact:!0,weekdays:"vas\xe1rnap_h\xe9tf\u0151_kedd_szerda_cs\xfct\xf6rt\xf6k_p\xe9ntek_szombat".split("_"),weekdaysShort:"vas_h\xe9t_kedd_sze_cs\xfct_p\xe9n_szo".split("_"),weekdaysMin:"v_h_k_sze_cs_p_szo".split("_"),longDateFormat:{LT:"H:mm",LTS:"H:mm:ss",L:"YYYY.MM.DD.",LL:"YYYY. MMMM D.",LLL:"YYYY. MMMM D. H:mm",LLLL:"YYYY. MMMM D., dddd H:mm"},meridiemParse:/de|du/i,isPM:function(p){return"u"===p.charAt(1).toLowerCase()},meridiem:function(p,y,T){return p<12?!0===T?"de":"DE":!0===T?"du":"DU"},calendar:{sameDay:"[ma] LT[-kor]",nextDay:"[holnap] LT[-kor]",nextWeek:function(){return c.call(this,!0)},lastDay:"[tegnap] LT[-kor]",lastWeek:function(){return c.call(this,!1)},sameElse:"L"},relativeTime:{future:"%s m\xfalva",past:"%s",s:f,ss:f,m:f,mm:f,h:f,hh:f,d:f,dd:f,M:f,MM:f,y:f,yy:f},dayOfMonthOrdinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:4}})}(i(16738))},90402:function(m,S,i){!function(r){"use strict";r.defineLocale("hy-am",{months:{format:"\u0570\u0578\u0582\u0576\u057e\u0561\u0580\u056b_\u0583\u0565\u057f\u0580\u057e\u0561\u0580\u056b_\u0574\u0561\u0580\u057f\u056b_\u0561\u057a\u0580\u056b\u056c\u056b_\u0574\u0561\u0575\u056b\u057d\u056b_\u0570\u0578\u0582\u0576\u056b\u057d\u056b_\u0570\u0578\u0582\u056c\u056b\u057d\u056b_\u0585\u0563\u0578\u057d\u057f\u0578\u057d\u056b_\u057d\u0565\u057a\u057f\u0565\u0574\u0562\u0565\u0580\u056b_\u0570\u0578\u056f\u057f\u0565\u0574\u0562\u0565\u0580\u056b_\u0576\u0578\u0575\u0565\u0574\u0562\u0565\u0580\u056b_\u0564\u0565\u056f\u057f\u0565\u0574\u0562\u0565\u0580\u056b".split("_"),standalone:"\u0570\u0578\u0582\u0576\u057e\u0561\u0580_\u0583\u0565\u057f\u0580\u057e\u0561\u0580_\u0574\u0561\u0580\u057f_\u0561\u057a\u0580\u056b\u056c_\u0574\u0561\u0575\u056b\u057d_\u0570\u0578\u0582\u0576\u056b\u057d_\u0570\u0578\u0582\u056c\u056b\u057d_\u0585\u0563\u0578\u057d\u057f\u0578\u057d_\u057d\u0565\u057a\u057f\u0565\u0574\u0562\u0565\u0580_\u0570\u0578\u056f\u057f\u0565\u0574\u0562\u0565\u0580_\u0576\u0578\u0575\u0565\u0574\u0562\u0565\u0580_\u0564\u0565\u056f\u057f\u0565\u0574\u0562\u0565\u0580".split("_")},monthsShort:"\u0570\u0576\u057e_\u0583\u057f\u0580_\u0574\u0580\u057f_\u0561\u057a\u0580_\u0574\u0575\u057d_\u0570\u0576\u057d_\u0570\u056c\u057d_\u0585\u0563\u057d_\u057d\u057a\u057f_\u0570\u056f\u057f_\u0576\u0574\u0562_\u0564\u056f\u057f".split("_"),weekdays:"\u056f\u056b\u0580\u0561\u056f\u056b_\u0565\u0580\u056f\u0578\u0582\u0577\u0561\u0562\u0569\u056b_\u0565\u0580\u0565\u0584\u0577\u0561\u0562\u0569\u056b_\u0579\u0578\u0580\u0565\u0584\u0577\u0561\u0562\u0569\u056b_\u0570\u056b\u0576\u0563\u0577\u0561\u0562\u0569\u056b_\u0578\u0582\u0580\u0562\u0561\u0569_\u0577\u0561\u0562\u0561\u0569".split("_"),weekdaysShort:"\u056f\u0580\u056f_\u0565\u0580\u056f_\u0565\u0580\u0584_\u0579\u0580\u0584_\u0570\u0576\u0563_\u0578\u0582\u0580\u0562_\u0577\u0562\u0569".split("_"),weekdaysMin:"\u056f\u0580\u056f_\u0565\u0580\u056f_\u0565\u0580\u0584_\u0579\u0580\u0584_\u0570\u0576\u0563_\u0578\u0582\u0580\u0562_\u0577\u0562\u0569".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD.MM.YYYY",LL:"D MMMM YYYY \u0569.",LLL:"D MMMM YYYY \u0569., HH:mm",LLLL:"dddd, D MMMM YYYY \u0569., HH:mm"},calendar:{sameDay:"[\u0561\u0575\u057d\u0585\u0580] LT",nextDay:"[\u057e\u0561\u0572\u0568] LT",lastDay:"[\u0565\u0580\u0565\u056f] LT",nextWeek:function(){return"dddd [\u0585\u0580\u0568 \u056a\u0561\u0574\u0568] LT"},lastWeek:function(){return"[\u0561\u0576\u0581\u0561\u056e] dddd [\u0585\u0580\u0568 \u056a\u0561\u0574\u0568] LT"},sameElse:"L"},relativeTime:{future:"%s \u0570\u0565\u057f\u0578",past:"%s \u0561\u057c\u0561\u057b",s:"\u0574\u056b \u0584\u0561\u0576\u056b \u057e\u0561\u0575\u0580\u056f\u0575\u0561\u0576",ss:"%d \u057e\u0561\u0575\u0580\u056f\u0575\u0561\u0576",m:"\u0580\u0578\u057a\u0565",mm:"%d \u0580\u0578\u057a\u0565",h:"\u056a\u0561\u0574",hh:"%d \u056a\u0561\u0574",d:"\u0585\u0580",dd:"%d \u0585\u0580",M:"\u0561\u0574\u056b\u057d",MM:"%d \u0561\u0574\u056b\u057d",y:"\u057f\u0561\u0580\u056b",yy:"%d \u057f\u0561\u0580\u056b"},meridiemParse:/\u0563\u056b\u0577\u0565\u0580\u057e\u0561|\u0561\u057c\u0561\u057e\u0578\u057f\u057e\u0561|\u0581\u0565\u0580\u0565\u056f\u057e\u0561|\u0565\u0580\u0565\u056f\u0578\u0575\u0561\u0576/,isPM:function(f){return/^(\u0581\u0565\u0580\u0565\u056f\u057e\u0561|\u0565\u0580\u0565\u056f\u0578\u0575\u0561\u0576)$/.test(f)},meridiem:function(f){return f<4?"\u0563\u056b\u0577\u0565\u0580\u057e\u0561":f<12?"\u0561\u057c\u0561\u057e\u0578\u057f\u057e\u0561":f<17?"\u0581\u0565\u0580\u0565\u056f\u057e\u0561":"\u0565\u0580\u0565\u056f\u0578\u0575\u0561\u0576"},dayOfMonthOrdinalParse:/\d{1,2}|\d{1,2}-(\u056b\u0576|\u0580\u0564)/,ordinal:function(f,c){switch(c){case"DDD":case"w":case"W":case"DDDo":return 1===f?f+"-\u056b\u0576":f+"-\u0580\u0564";default:return f}},week:{dow:1,doy:7}})}(i(16738))},59187:function(m,S,i){!function(r){"use strict";r.defineLocale("id",{months:"Januari_Februari_Maret_April_Mei_Juni_Juli_Agustus_September_Oktober_November_Desember".split("_"),monthsShort:"Jan_Feb_Mar_Apr_Mei_Jun_Jul_Agt_Sep_Okt_Nov_Des".split("_"),weekdays:"Minggu_Senin_Selasa_Rabu_Kamis_Jumat_Sabtu".split("_"),weekdaysShort:"Min_Sen_Sel_Rab_Kam_Jum_Sab".split("_"),weekdaysMin:"Mg_Sn_Sl_Rb_Km_Jm_Sb".split("_"),longDateFormat:{LT:"HH.mm",LTS:"HH.mm.ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY [pukul] HH.mm",LLLL:"dddd, D MMMM YYYY [pukul] HH.mm"},meridiemParse:/pagi|siang|sore|malam/,meridiemHour:function(f,c){return 12===f&&(f=0),"pagi"===c?f:"siang"===c?f>=11?f:f+12:"sore"===c||"malam"===c?f+12:void 0},meridiem:function(f,c,e){return f<11?"pagi":f<15?"siang":f<19?"sore":"malam"},calendar:{sameDay:"[Hari ini pukul] LT",nextDay:"[Besok pukul] LT",nextWeek:"dddd [pukul] LT",lastDay:"[Kemarin pukul] LT",lastWeek:"dddd [lalu pukul] LT",sameElse:"L"},relativeTime:{future:"dalam %s",past:"%s yang lalu",s:"beberapa detik",ss:"%d detik",m:"semenit",mm:"%d menit",h:"sejam",hh:"%d jam",d:"sehari",dd:"%d hari",M:"sebulan",MM:"%d bulan",y:"setahun",yy:"%d tahun"},week:{dow:0,doy:6}})}(i(16738))},30536:function(m,S,i){!function(r){"use strict";function a(e){return e%100==11||e%10!=1}function f(e,p,y,T){var C=e+" ";switch(y){case"s":return p||T?"nokkrar sek\xfandur":"nokkrum sek\xfandum";case"ss":return a(e)?C+(p||T?"sek\xfandur":"sek\xfandum"):C+"sek\xfanda";case"m":return p?"m\xedn\xfata":"m\xedn\xfatu";case"mm":return a(e)?C+(p||T?"m\xedn\xfatur":"m\xedn\xfatum"):p?C+"m\xedn\xfata":C+"m\xedn\xfatu";case"hh":return a(e)?C+(p||T?"klukkustundir":"klukkustundum"):C+"klukkustund";case"d":return p?"dagur":T?"dag":"degi";case"dd":return a(e)?p?C+"dagar":C+(T?"daga":"d\xf6gum"):p?C+"dagur":C+(T?"dag":"degi");case"M":return p?"m\xe1nu\xf0ur":T?"m\xe1nu\xf0":"m\xe1nu\xf0i";case"MM":return a(e)?p?C+"m\xe1nu\xf0ir":C+(T?"m\xe1nu\xf0i":"m\xe1nu\xf0um"):p?C+"m\xe1nu\xf0ur":C+(T?"m\xe1nu\xf0":"m\xe1nu\xf0i");case"y":return p||T?"\xe1r":"\xe1ri";case"yy":return a(e)?C+(p||T?"\xe1r":"\xe1rum"):C+(p||T?"\xe1r":"\xe1ri")}}r.defineLocale("is",{months:"jan\xfaar_febr\xfaar_mars_apr\xedl_ma\xed_j\xfan\xed_j\xfal\xed_\xe1g\xfast_september_okt\xf3ber_n\xf3vember_desember".split("_"),monthsShort:"jan_feb_mar_apr_ma\xed_j\xfan_j\xfal_\xe1g\xfa_sep_okt_n\xf3v_des".split("_"),weekdays:"sunnudagur_m\xe1nudagur_\xferi\xf0judagur_mi\xf0vikudagur_fimmtudagur_f\xf6studagur_laugardagur".split("_"),weekdaysShort:"sun_m\xe1n_\xferi_mi\xf0_fim_f\xf6s_lau".split("_"),weekdaysMin:"Su_M\xe1_\xder_Mi_Fi_F\xf6_La".split("_"),longDateFormat:{LT:"H:mm",LTS:"H:mm:ss",L:"DD.MM.YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY [kl.] H:mm",LLLL:"dddd, D. MMMM YYYY [kl.] H:mm"},calendar:{sameDay:"[\xed dag kl.] LT",nextDay:"[\xe1 morgun kl.] LT",nextWeek:"dddd [kl.] LT",lastDay:"[\xed g\xe6r kl.] LT",lastWeek:"[s\xed\xf0asta] dddd [kl.] LT",sameElse:"L"},relativeTime:{future:"eftir %s",past:"fyrir %s s\xed\xf0an",s:f,ss:f,m:f,mm:f,h:"klukkustund",hh:f,d:f,dd:f,M:f,MM:f,y:f,yy:f},dayOfMonthOrdinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:4}})}(i(16738))},94667:function(m,S,i){!function(r){"use strict";r.defineLocale("it-ch",{months:"gennaio_febbraio_marzo_aprile_maggio_giugno_luglio_agosto_settembre_ottobre_novembre_dicembre".split("_"),monthsShort:"gen_feb_mar_apr_mag_giu_lug_ago_set_ott_nov_dic".split("_"),weekdays:"domenica_luned\xec_marted\xec_mercoled\xec_gioved\xec_venerd\xec_sabato".split("_"),weekdaysShort:"dom_lun_mar_mer_gio_ven_sab".split("_"),weekdaysMin:"do_lu_ma_me_gi_ve_sa".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD.MM.YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd D MMMM YYYY HH:mm"},calendar:{sameDay:"[Oggi alle] LT",nextDay:"[Domani alle] LT",nextWeek:"dddd [alle] LT",lastDay:"[Ieri alle] LT",lastWeek:function(){return 0===this.day()?"[la scorsa] dddd [alle] LT":"[lo scorso] dddd [alle] LT"},sameElse:"L"},relativeTime:{future:function(f){return(/^[0-9].+$/.test(f)?"tra":"in")+" "+f},past:"%s fa",s:"alcuni secondi",ss:"%d secondi",m:"un minuto",mm:"%d minuti",h:"un'ora",hh:"%d ore",d:"un giorno",dd:"%d giorni",M:"un mese",MM:"%d mesi",y:"un anno",yy:"%d anni"},dayOfMonthOrdinalParse:/\d{1,2}\xba/,ordinal:"%d\xba",week:{dow:1,doy:4}})}(i(16738))},35007:function(m,S,i){!function(r){"use strict";r.defineLocale("it",{months:"gennaio_febbraio_marzo_aprile_maggio_giugno_luglio_agosto_settembre_ottobre_novembre_dicembre".split("_"),monthsShort:"gen_feb_mar_apr_mag_giu_lug_ago_set_ott_nov_dic".split("_"),weekdays:"domenica_luned\xec_marted\xec_mercoled\xec_gioved\xec_venerd\xec_sabato".split("_"),weekdaysShort:"dom_lun_mar_mer_gio_ven_sab".split("_"),weekdaysMin:"do_lu_ma_me_gi_ve_sa".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd D MMMM YYYY HH:mm"},calendar:{sameDay:function(){return"[Oggi a"+(this.hours()>1?"lle ":0===this.hours()?" ":"ll'")+"]LT"},nextDay:function(){return"[Domani a"+(this.hours()>1?"lle ":0===this.hours()?" ":"ll'")+"]LT"},nextWeek:function(){return"dddd [a"+(this.hours()>1?"lle ":0===this.hours()?" ":"ll'")+"]LT"},lastDay:function(){return"[Ieri a"+(this.hours()>1?"lle ":0===this.hours()?" ":"ll'")+"]LT"},lastWeek:function(){return 0===this.day()?"[La scorsa] dddd [a"+(this.hours()>1?"lle ":0===this.hours()?" ":"ll'")+"]LT":"[Lo scorso] dddd [a"+(this.hours()>1?"lle ":0===this.hours()?" ":"ll'")+"]LT"},sameElse:"L"},relativeTime:{future:"tra %s",past:"%s fa",s:"alcuni secondi",ss:"%d secondi",m:"un minuto",mm:"%d minuti",h:"un'ora",hh:"%d ore",d:"un giorno",dd:"%d giorni",w:"una settimana",ww:"%d settimane",M:"un mese",MM:"%d mesi",y:"un anno",yy:"%d anni"},dayOfMonthOrdinalParse:/\d{1,2}\xba/,ordinal:"%d\xba",week:{dow:1,doy:4}})}(i(16738))},62093:function(m,S,i){!function(r){"use strict";r.defineLocale("ja",{eras:[{since:"2019-05-01",offset:1,name:"\u4ee4\u548c",narrow:"\u32ff",abbr:"R"},{since:"1989-01-08",until:"2019-04-30",offset:1,name:"\u5e73\u6210",narrow:"\u337b",abbr:"H"},{since:"1926-12-25",until:"1989-01-07",offset:1,name:"\u662d\u548c",narrow:"\u337c",abbr:"S"},{since:"1912-07-30",until:"1926-12-24",offset:1,name:"\u5927\u6b63",narrow:"\u337d",abbr:"T"},{since:"1873-01-01",until:"1912-07-29",offset:6,name:"\u660e\u6cbb",narrow:"\u337e",abbr:"M"},{since:"0001-01-01",until:"1873-12-31",offset:1,name:"\u897f\u66a6",narrow:"AD",abbr:"AD"},{since:"0000-12-31",until:-1/0,offset:1,name:"\u7d00\u5143\u524d",narrow:"BC",abbr:"BC"}],eraYearOrdinalRegex:/(\u5143|\d+)\u5e74/,eraYearOrdinalParse:function(f,c){return"\u5143"===c[1]?1:parseInt(c[1]||f,10)},months:"1\u6708_2\u6708_3\u6708_4\u6708_5\u6708_6\u6708_7\u6708_8\u6708_9\u6708_10\u6708_11\u6708_12\u6708".split("_"),monthsShort:"1\u6708_2\u6708_3\u6708_4\u6708_5\u6708_6\u6708_7\u6708_8\u6708_9\u6708_10\u6708_11\u6708_12\u6708".split("_"),weekdays:"\u65e5\u66dc\u65e5_\u6708\u66dc\u65e5_\u706b\u66dc\u65e5_\u6c34\u66dc\u65e5_\u6728\u66dc\u65e5_\u91d1\u66dc\u65e5_\u571f\u66dc\u65e5".split("_"),weekdaysShort:"\u65e5_\u6708_\u706b_\u6c34_\u6728_\u91d1_\u571f".split("_"),weekdaysMin:"\u65e5_\u6708_\u706b_\u6c34_\u6728_\u91d1_\u571f".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"YYYY/MM/DD",LL:"YYYY\u5e74M\u6708D\u65e5",LLL:"YYYY\u5e74M\u6708D\u65e5 HH:mm",LLLL:"YYYY\u5e74M\u6708D\u65e5 dddd HH:mm",l:"YYYY/MM/DD",ll:"YYYY\u5e74M\u6708D\u65e5",lll:"YYYY\u5e74M\u6708D\u65e5 HH:mm",llll:"YYYY\u5e74M\u6708D\u65e5(ddd) HH:mm"},meridiemParse:/\u5348\u524d|\u5348\u5f8c/i,isPM:function(f){return"\u5348\u5f8c"===f},meridiem:function(f,c,e){return f<12?"\u5348\u524d":"\u5348\u5f8c"},calendar:{sameDay:"[\u4eca\u65e5] LT",nextDay:"[\u660e\u65e5] LT",nextWeek:function(f){return f.week()!==this.week()?"[\u6765\u9031]dddd LT":"dddd LT"},lastDay:"[\u6628\u65e5] LT",lastWeek:function(f){return this.week()!==f.week()?"[\u5148\u9031]dddd LT":"dddd LT"},sameElse:"L"},dayOfMonthOrdinalParse:/\d{1,2}\u65e5/,ordinal:function(f,c){switch(c){case"y":return 1===f?"\u5143\u5e74":f+"\u5e74";case"d":case"D":case"DDD":return f+"\u65e5";default:return f}},relativeTime:{future:"%s\u5f8c",past:"%s\u524d",s:"\u6570\u79d2",ss:"%d\u79d2",m:"1\u5206",mm:"%d\u5206",h:"1\u6642\u9593",hh:"%d\u6642\u9593",d:"1\u65e5",dd:"%d\u65e5",M:"1\u30f6\u6708",MM:"%d\u30f6\u6708",y:"1\u5e74",yy:"%d\u5e74"}})}(i(16738))},80059:function(m,S,i){!function(r){"use strict";r.defineLocale("jv",{months:"Januari_Februari_Maret_April_Mei_Juni_Juli_Agustus_September_Oktober_Nopember_Desember".split("_"),monthsShort:"Jan_Feb_Mar_Apr_Mei_Jun_Jul_Ags_Sep_Okt_Nop_Des".split("_"),weekdays:"Minggu_Senen_Seloso_Rebu_Kemis_Jemuwah_Septu".split("_"),weekdaysShort:"Min_Sen_Sel_Reb_Kem_Jem_Sep".split("_"),weekdaysMin:"Mg_Sn_Sl_Rb_Km_Jm_Sp".split("_"),longDateFormat:{LT:"HH.mm",LTS:"HH.mm.ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY [pukul] HH.mm",LLLL:"dddd, D MMMM YYYY [pukul] HH.mm"},meridiemParse:/enjing|siyang|sonten|ndalu/,meridiemHour:function(f,c){return 12===f&&(f=0),"enjing"===c?f:"siyang"===c?f>=11?f:f+12:"sonten"===c||"ndalu"===c?f+12:void 0},meridiem:function(f,c,e){return f<11?"enjing":f<15?"siyang":f<19?"sonten":"ndalu"},calendar:{sameDay:"[Dinten puniko pukul] LT",nextDay:"[Mbenjang pukul] LT",nextWeek:"dddd [pukul] LT",lastDay:"[Kala wingi pukul] LT",lastWeek:"dddd [kepengker pukul] LT",sameElse:"L"},relativeTime:{future:"wonten ing %s",past:"%s ingkang kepengker",s:"sawetawis detik",ss:"%d detik",m:"setunggal menit",mm:"%d menit",h:"setunggal jam",hh:"%d jam",d:"sedinten",dd:"%d dinten",M:"sewulan",MM:"%d wulan",y:"setaun",yy:"%d taun"},week:{dow:1,doy:7}})}(i(16738))},66870:function(m,S,i){!function(r){"use strict";r.defineLocale("ka",{months:"\u10d8\u10d0\u10dc\u10d5\u10d0\u10e0\u10d8_\u10d7\u10d4\u10d1\u10d4\u10e0\u10d5\u10d0\u10da\u10d8_\u10db\u10d0\u10e0\u10e2\u10d8_\u10d0\u10de\u10e0\u10d8\u10da\u10d8_\u10db\u10d0\u10d8\u10e1\u10d8_\u10d8\u10d5\u10dc\u10d8\u10e1\u10d8_\u10d8\u10d5\u10da\u10d8\u10e1\u10d8_\u10d0\u10d2\u10d5\u10d8\u10e1\u10e2\u10dd_\u10e1\u10d4\u10e5\u10e2\u10d4\u10db\u10d1\u10d4\u10e0\u10d8_\u10dd\u10e5\u10e2\u10dd\u10db\u10d1\u10d4\u10e0\u10d8_\u10dc\u10dd\u10d4\u10db\u10d1\u10d4\u10e0\u10d8_\u10d3\u10d4\u10d9\u10d4\u10db\u10d1\u10d4\u10e0\u10d8".split("_"),monthsShort:"\u10d8\u10d0\u10dc_\u10d7\u10d4\u10d1_\u10db\u10d0\u10e0_\u10d0\u10de\u10e0_\u10db\u10d0\u10d8_\u10d8\u10d5\u10dc_\u10d8\u10d5\u10da_\u10d0\u10d2\u10d5_\u10e1\u10d4\u10e5_\u10dd\u10e5\u10e2_\u10dc\u10dd\u10d4_\u10d3\u10d4\u10d9".split("_"),weekdays:{standalone:"\u10d9\u10d5\u10d8\u10e0\u10d0_\u10dd\u10e0\u10e8\u10d0\u10d1\u10d0\u10d7\u10d8_\u10e1\u10d0\u10db\u10e8\u10d0\u10d1\u10d0\u10d7\u10d8_\u10dd\u10d7\u10ee\u10e8\u10d0\u10d1\u10d0\u10d7\u10d8_\u10ee\u10e3\u10d7\u10e8\u10d0\u10d1\u10d0\u10d7\u10d8_\u10de\u10d0\u10e0\u10d0\u10e1\u10d9\u10d4\u10d5\u10d8_\u10e8\u10d0\u10d1\u10d0\u10d7\u10d8".split("_"),format:"\u10d9\u10d5\u10d8\u10e0\u10d0\u10e1_\u10dd\u10e0\u10e8\u10d0\u10d1\u10d0\u10d7\u10e1_\u10e1\u10d0\u10db\u10e8\u10d0\u10d1\u10d0\u10d7\u10e1_\u10dd\u10d7\u10ee\u10e8\u10d0\u10d1\u10d0\u10d7\u10e1_\u10ee\u10e3\u10d7\u10e8\u10d0\u10d1\u10d0\u10d7\u10e1_\u10de\u10d0\u10e0\u10d0\u10e1\u10d9\u10d4\u10d5\u10e1_\u10e8\u10d0\u10d1\u10d0\u10d7\u10e1".split("_"),isFormat:/(\u10ec\u10d8\u10dc\u10d0|\u10e8\u10d4\u10db\u10d3\u10d4\u10d2)/},weekdaysShort:"\u10d9\u10d5\u10d8_\u10dd\u10e0\u10e8_\u10e1\u10d0\u10db_\u10dd\u10d7\u10ee_\u10ee\u10e3\u10d7_\u10de\u10d0\u10e0_\u10e8\u10d0\u10d1".split("_"),weekdaysMin:"\u10d9\u10d5_\u10dd\u10e0_\u10e1\u10d0_\u10dd\u10d7_\u10ee\u10e3_\u10de\u10d0_\u10e8\u10d0".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd, D MMMM YYYY HH:mm"},calendar:{sameDay:"[\u10d3\u10e6\u10d4\u10e1] LT[-\u10d6\u10d4]",nextDay:"[\u10ee\u10d5\u10d0\u10da] LT[-\u10d6\u10d4]",lastDay:"[\u10d2\u10e3\u10e8\u10d8\u10dc] LT[-\u10d6\u10d4]",nextWeek:"[\u10e8\u10d4\u10db\u10d3\u10d4\u10d2] dddd LT[-\u10d6\u10d4]",lastWeek:"[\u10ec\u10d8\u10dc\u10d0] dddd LT-\u10d6\u10d4",sameElse:"L"},relativeTime:{future:function(f){return f.replace(/(\u10ec\u10d0\u10db|\u10ec\u10e3\u10d7|\u10e1\u10d0\u10d0\u10d7|\u10ec\u10d4\u10da|\u10d3\u10e6|\u10d7\u10d5)(\u10d8|\u10d4)/,function(c,e,p){return"\u10d8"===p?e+"\u10e8\u10d8":e+p+"\u10e8\u10d8"})},past:function(f){return/(\u10ec\u10d0\u10db\u10d8|\u10ec\u10e3\u10d7\u10d8|\u10e1\u10d0\u10d0\u10d7\u10d8|\u10d3\u10e6\u10d4|\u10d7\u10d5\u10d4)/.test(f)?f.replace(/(\u10d8|\u10d4)$/,"\u10d8\u10e1 \u10ec\u10d8\u10dc"):/\u10ec\u10d4\u10da\u10d8/.test(f)?f.replace(/\u10ec\u10d4\u10da\u10d8$/,"\u10ec\u10da\u10d8\u10e1 \u10ec\u10d8\u10dc"):f},s:"\u10e0\u10d0\u10db\u10d3\u10d4\u10dc\u10d8\u10db\u10d4 \u10ec\u10d0\u10db\u10d8",ss:"%d \u10ec\u10d0\u10db\u10d8",m:"\u10ec\u10e3\u10d7\u10d8",mm:"%d \u10ec\u10e3\u10d7\u10d8",h:"\u10e1\u10d0\u10d0\u10d7\u10d8",hh:"%d \u10e1\u10d0\u10d0\u10d7\u10d8",d:"\u10d3\u10e6\u10d4",dd:"%d \u10d3\u10e6\u10d4",M:"\u10d7\u10d5\u10d4",MM:"%d \u10d7\u10d5\u10d4",y:"\u10ec\u10d4\u10da\u10d8",yy:"%d \u10ec\u10d4\u10da\u10d8"},dayOfMonthOrdinalParse:/0|1-\u10da\u10d8|\u10db\u10d4-\d{1,2}|\d{1,2}-\u10d4/,ordinal:function(f){return 0===f?f:1===f?f+"-\u10da\u10d8":f<20||f<=100&&f%20==0||f%100==0?"\u10db\u10d4-"+f:f+"-\u10d4"},week:{dow:1,doy:7}})}(i(16738))},80880:function(m,S,i){!function(r){"use strict";var a={0:"-\u0448\u0456",1:"-\u0448\u0456",2:"-\u0448\u0456",3:"-\u0448\u0456",4:"-\u0448\u0456",5:"-\u0448\u0456",6:"-\u0448\u044b",7:"-\u0448\u0456",8:"-\u0448\u0456",9:"-\u0448\u044b",10:"-\u0448\u044b",20:"-\u0448\u044b",30:"-\u0448\u044b",40:"-\u0448\u044b",50:"-\u0448\u0456",60:"-\u0448\u044b",70:"-\u0448\u0456",80:"-\u0448\u0456",90:"-\u0448\u044b",100:"-\u0448\u0456"};r.defineLocale("kk",{months:"\u049b\u0430\u04a3\u0442\u0430\u0440_\u0430\u049b\u043f\u0430\u043d_\u043d\u0430\u0443\u0440\u044b\u0437_\u0441\u04d9\u0443\u0456\u0440_\u043c\u0430\u043c\u044b\u0440_\u043c\u0430\u0443\u0441\u044b\u043c_\u0448\u0456\u043b\u0434\u0435_\u0442\u0430\u043c\u044b\u0437_\u049b\u044b\u0440\u043a\u04af\u0439\u0435\u043a_\u049b\u0430\u0437\u0430\u043d_\u049b\u0430\u0440\u0430\u0448\u0430_\u0436\u0435\u043b\u0442\u043e\u049b\u0441\u0430\u043d".split("_"),monthsShort:"\u049b\u0430\u04a3_\u0430\u049b\u043f_\u043d\u0430\u0443_\u0441\u04d9\u0443_\u043c\u0430\u043c_\u043c\u0430\u0443_\u0448\u0456\u043b_\u0442\u0430\u043c_\u049b\u044b\u0440_\u049b\u0430\u0437_\u049b\u0430\u0440_\u0436\u0435\u043b".split("_"),weekdays:"\u0436\u0435\u043a\u0441\u0435\u043d\u0431\u0456_\u0434\u04af\u0439\u0441\u0435\u043d\u0431\u0456_\u0441\u0435\u0439\u0441\u0435\u043d\u0431\u0456_\u0441\u04d9\u0440\u0441\u0435\u043d\u0431\u0456_\u0431\u0435\u0439\u0441\u0435\u043d\u0431\u0456_\u0436\u04b1\u043c\u0430_\u0441\u0435\u043d\u0431\u0456".split("_"),weekdaysShort:"\u0436\u0435\u043a_\u0434\u04af\u0439_\u0441\u0435\u0439_\u0441\u04d9\u0440_\u0431\u0435\u0439_\u0436\u04b1\u043c_\u0441\u0435\u043d".split("_"),weekdaysMin:"\u0436\u043a_\u0434\u0439_\u0441\u0439_\u0441\u0440_\u0431\u0439_\u0436\u043c_\u0441\u043d".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD.MM.YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd, D MMMM YYYY HH:mm"},calendar:{sameDay:"[\u0411\u04af\u0433\u0456\u043d \u0441\u0430\u0493\u0430\u0442] LT",nextDay:"[\u0415\u0440\u0442\u0435\u04a3 \u0441\u0430\u0493\u0430\u0442] LT",nextWeek:"dddd [\u0441\u0430\u0493\u0430\u0442] LT",lastDay:"[\u041a\u0435\u0448\u0435 \u0441\u0430\u0493\u0430\u0442] LT",lastWeek:"[\u04e8\u0442\u043a\u0435\u043d \u0430\u043f\u0442\u0430\u043d\u044b\u04a3] dddd [\u0441\u0430\u0493\u0430\u0442] LT",sameElse:"L"},relativeTime:{future:"%s \u0456\u0448\u0456\u043d\u0434\u0435",past:"%s \u0431\u04b1\u0440\u044b\u043d",s:"\u0431\u0456\u0440\u043d\u0435\u0448\u0435 \u0441\u0435\u043a\u0443\u043d\u0434",ss:"%d \u0441\u0435\u043a\u0443\u043d\u0434",m:"\u0431\u0456\u0440 \u043c\u0438\u043d\u0443\u0442",mm:"%d \u043c\u0438\u043d\u0443\u0442",h:"\u0431\u0456\u0440 \u0441\u0430\u0493\u0430\u0442",hh:"%d \u0441\u0430\u0493\u0430\u0442",d:"\u0431\u0456\u0440 \u043a\u04af\u043d",dd:"%d \u043a\u04af\u043d",M:"\u0431\u0456\u0440 \u0430\u0439",MM:"%d \u0430\u0439",y:"\u0431\u0456\u0440 \u0436\u044b\u043b",yy:"%d \u0436\u044b\u043b"},dayOfMonthOrdinalParse:/\d{1,2}-(\u0448\u0456|\u0448\u044b)/,ordinal:function(c){return c+(a[c]||a[c%10]||a[c>=100?100:null])},week:{dow:1,doy:7}})}(i(16738))},1083:function(m,S,i){!function(r){"use strict";var a={1:"\u17e1",2:"\u17e2",3:"\u17e3",4:"\u17e4",5:"\u17e5",6:"\u17e6",7:"\u17e7",8:"\u17e8",9:"\u17e9",0:"\u17e0"},f={"\u17e1":"1","\u17e2":"2","\u17e3":"3","\u17e4":"4","\u17e5":"5","\u17e6":"6","\u17e7":"7","\u17e8":"8","\u17e9":"9","\u17e0":"0"};r.defineLocale("km",{months:"\u1798\u1780\u179a\u17b6_\u1780\u17bb\u1798\u17d2\u1797\u17c8_\u1798\u17b8\u1793\u17b6_\u1798\u17c1\u179f\u17b6_\u17a7\u179f\u1797\u17b6_\u1798\u17b7\u1790\u17bb\u1793\u17b6_\u1780\u1780\u17d2\u1780\u178a\u17b6_\u179f\u17b8\u17a0\u17b6_\u1780\u1789\u17d2\u1789\u17b6_\u178f\u17bb\u179b\u17b6_\u179c\u17b7\u1785\u17d2\u1786\u17b7\u1780\u17b6_\u1792\u17d2\u1793\u17bc".split("_"),monthsShort:"\u1798\u1780\u179a\u17b6_\u1780\u17bb\u1798\u17d2\u1797\u17c8_\u1798\u17b8\u1793\u17b6_\u1798\u17c1\u179f\u17b6_\u17a7\u179f\u1797\u17b6_\u1798\u17b7\u1790\u17bb\u1793\u17b6_\u1780\u1780\u17d2\u1780\u178a\u17b6_\u179f\u17b8\u17a0\u17b6_\u1780\u1789\u17d2\u1789\u17b6_\u178f\u17bb\u179b\u17b6_\u179c\u17b7\u1785\u17d2\u1786\u17b7\u1780\u17b6_\u1792\u17d2\u1793\u17bc".split("_"),weekdays:"\u17a2\u17b6\u1791\u17b7\u178f\u17d2\u1799_\u1785\u17d0\u1793\u17d2\u1791_\u17a2\u1784\u17d2\u1782\u17b6\u179a_\u1796\u17bb\u1792_\u1796\u17d2\u179a\u17a0\u179f\u17d2\u1794\u178f\u17b7\u17cd_\u179f\u17bb\u1780\u17d2\u179a_\u179f\u17c5\u179a\u17cd".split("_"),weekdaysShort:"\u17a2\u17b6_\u1785_\u17a2_\u1796_\u1796\u17d2\u179a_\u179f\u17bb_\u179f".split("_"),weekdaysMin:"\u17a2\u17b6_\u1785_\u17a2_\u1796_\u1796\u17d2\u179a_\u179f\u17bb_\u179f".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd, D MMMM YYYY HH:mm"},meridiemParse:/\u1796\u17d2\u179a\u17b9\u1780|\u179b\u17d2\u1784\u17b6\u1785/,isPM:function(e){return"\u179b\u17d2\u1784\u17b6\u1785"===e},meridiem:function(e,p,y){return e<12?"\u1796\u17d2\u179a\u17b9\u1780":"\u179b\u17d2\u1784\u17b6\u1785"},calendar:{sameDay:"[\u1790\u17d2\u1784\u17c3\u1793\u17c1\u17c7 \u1798\u17c9\u17c4\u1784] LT",nextDay:"[\u179f\u17d2\u17a2\u17c2\u1780 \u1798\u17c9\u17c4\u1784] LT",nextWeek:"dddd [\u1798\u17c9\u17c4\u1784] LT",lastDay:"[\u1798\u17d2\u179f\u17b7\u179b\u1798\u17b7\u1789 \u1798\u17c9\u17c4\u1784] LT",lastWeek:"dddd [\u179f\u1794\u17d2\u178f\u17b6\u17a0\u17cd\u1798\u17bb\u1793] [\u1798\u17c9\u17c4\u1784] LT",sameElse:"L"},relativeTime:{future:"%s\u1791\u17c0\u178f",past:"%s\u1798\u17bb\u1793",s:"\u1794\u17c9\u17bb\u1793\u17d2\u1798\u17b6\u1793\u179c\u17b7\u1793\u17b6\u1791\u17b8",ss:"%d \u179c\u17b7\u1793\u17b6\u1791\u17b8",m:"\u1798\u17bd\u1799\u1793\u17b6\u1791\u17b8",mm:"%d \u1793\u17b6\u1791\u17b8",h:"\u1798\u17bd\u1799\u1798\u17c9\u17c4\u1784",hh:"%d \u1798\u17c9\u17c4\u1784",d:"\u1798\u17bd\u1799\u1790\u17d2\u1784\u17c3",dd:"%d \u1790\u17d2\u1784\u17c3",M:"\u1798\u17bd\u1799\u1781\u17c2",MM:"%d \u1781\u17c2",y:"\u1798\u17bd\u1799\u1786\u17d2\u1793\u17b6\u17c6",yy:"%d \u1786\u17d2\u1793\u17b6\u17c6"},dayOfMonthOrdinalParse:/\u1791\u17b8\d{1,2}/,ordinal:"\u1791\u17b8%d",preparse:function(e){return e.replace(/[\u17e1\u17e2\u17e3\u17e4\u17e5\u17e6\u17e7\u17e8\u17e9\u17e0]/g,function(p){return f[p]})},postformat:function(e){return e.replace(/\d/g,function(p){return a[p]})},week:{dow:1,doy:4}})}(i(16738))},68785:function(m,S,i){!function(r){"use strict";var a={1:"\u0ce7",2:"\u0ce8",3:"\u0ce9",4:"\u0cea",5:"\u0ceb",6:"\u0cec",7:"\u0ced",8:"\u0cee",9:"\u0cef",0:"\u0ce6"},f={"\u0ce7":"1","\u0ce8":"2","\u0ce9":"3","\u0cea":"4","\u0ceb":"5","\u0cec":"6","\u0ced":"7","\u0cee":"8","\u0cef":"9","\u0ce6":"0"};r.defineLocale("kn",{months:"\u0c9c\u0ca8\u0cb5\u0cb0\u0cbf_\u0cab\u0cc6\u0cac\u0ccd\u0cb0\u0cb5\u0cb0\u0cbf_\u0cae\u0cbe\u0cb0\u0ccd\u0c9a\u0ccd_\u0c8f\u0caa\u0ccd\u0cb0\u0cbf\u0cb2\u0ccd_\u0cae\u0cc6\u0cd5_\u0c9c\u0cc2\u0ca8\u0ccd_\u0c9c\u0cc1\u0cb2\u0cc6\u0cd6_\u0c86\u0c97\u0cb8\u0ccd\u0c9f\u0ccd_\u0cb8\u0cc6\u0caa\u0ccd\u0c9f\u0cc6\u0c82\u0cac\u0cb0\u0ccd_\u0c85\u0c95\u0ccd\u0c9f\u0cc6\u0cc2\u0cd5\u0cac\u0cb0\u0ccd_\u0ca8\u0cb5\u0cc6\u0c82\u0cac\u0cb0\u0ccd_\u0ca1\u0cbf\u0cb8\u0cc6\u0c82\u0cac\u0cb0\u0ccd".split("_"),monthsShort:"\u0c9c\u0ca8_\u0cab\u0cc6\u0cac\u0ccd\u0cb0_\u0cae\u0cbe\u0cb0\u0ccd\u0c9a\u0ccd_\u0c8f\u0caa\u0ccd\u0cb0\u0cbf\u0cb2\u0ccd_\u0cae\u0cc6\u0cd5_\u0c9c\u0cc2\u0ca8\u0ccd_\u0c9c\u0cc1\u0cb2\u0cc6\u0cd6_\u0c86\u0c97\u0cb8\u0ccd\u0c9f\u0ccd_\u0cb8\u0cc6\u0caa\u0ccd\u0c9f\u0cc6\u0c82_\u0c85\u0c95\u0ccd\u0c9f\u0cc6\u0cc2\u0cd5_\u0ca8\u0cb5\u0cc6\u0c82_\u0ca1\u0cbf\u0cb8\u0cc6\u0c82".split("_"),monthsParseExact:!0,weekdays:"\u0cad\u0cbe\u0ca8\u0cc1\u0cb5\u0cbe\u0cb0_\u0cb8\u0cc6\u0cc2\u0cd5\u0cae\u0cb5\u0cbe\u0cb0_\u0cae\u0c82\u0c97\u0cb3\u0cb5\u0cbe\u0cb0_\u0cac\u0cc1\u0ca7\u0cb5\u0cbe\u0cb0_\u0c97\u0cc1\u0cb0\u0cc1\u0cb5\u0cbe\u0cb0_\u0cb6\u0cc1\u0c95\u0ccd\u0cb0\u0cb5\u0cbe\u0cb0_\u0cb6\u0ca8\u0cbf\u0cb5\u0cbe\u0cb0".split("_"),weekdaysShort:"\u0cad\u0cbe\u0ca8\u0cc1_\u0cb8\u0cc6\u0cc2\u0cd5\u0cae_\u0cae\u0c82\u0c97\u0cb3_\u0cac\u0cc1\u0ca7_\u0c97\u0cc1\u0cb0\u0cc1_\u0cb6\u0cc1\u0c95\u0ccd\u0cb0_\u0cb6\u0ca8\u0cbf".split("_"),weekdaysMin:"\u0cad\u0cbe_\u0cb8\u0cc6\u0cc2\u0cd5_\u0cae\u0c82_\u0cac\u0cc1_\u0c97\u0cc1_\u0cb6\u0cc1_\u0cb6".split("_"),longDateFormat:{LT:"A h:mm",LTS:"A h:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY, A h:mm",LLLL:"dddd, D MMMM YYYY, A h:mm"},calendar:{sameDay:"[\u0c87\u0c82\u0ca6\u0cc1] LT",nextDay:"[\u0ca8\u0cbe\u0cb3\u0cc6] LT",nextWeek:"dddd, LT",lastDay:"[\u0ca8\u0cbf\u0ca8\u0ccd\u0ca8\u0cc6] LT",lastWeek:"[\u0c95\u0cc6\u0cc2\u0ca8\u0cc6\u0caf] dddd, LT",sameElse:"L"},relativeTime:{future:"%s \u0ca8\u0c82\u0ca4\u0cb0",past:"%s \u0cb9\u0cbf\u0c82\u0ca6\u0cc6",s:"\u0c95\u0cc6\u0cb2\u0cb5\u0cc1 \u0c95\u0ccd\u0cb7\u0ca3\u0c97\u0cb3\u0cc1",ss:"%d \u0cb8\u0cc6\u0c95\u0cc6\u0c82\u0ca1\u0cc1\u0c97\u0cb3\u0cc1",m:"\u0c92\u0c82\u0ca6\u0cc1 \u0ca8\u0cbf\u0cae\u0cbf\u0cb7",mm:"%d \u0ca8\u0cbf\u0cae\u0cbf\u0cb7",h:"\u0c92\u0c82\u0ca6\u0cc1 \u0c97\u0c82\u0c9f\u0cc6",hh:"%d \u0c97\u0c82\u0c9f\u0cc6",d:"\u0c92\u0c82\u0ca6\u0cc1 \u0ca6\u0cbf\u0ca8",dd:"%d \u0ca6\u0cbf\u0ca8",M:"\u0c92\u0c82\u0ca6\u0cc1 \u0ca4\u0cbf\u0c82\u0c97\u0cb3\u0cc1",MM:"%d \u0ca4\u0cbf\u0c82\u0c97\u0cb3\u0cc1",y:"\u0c92\u0c82\u0ca6\u0cc1 \u0cb5\u0cb0\u0ccd\u0cb7",yy:"%d \u0cb5\u0cb0\u0ccd\u0cb7"},preparse:function(e){return e.replace(/[\u0ce7\u0ce8\u0ce9\u0cea\u0ceb\u0cec\u0ced\u0cee\u0cef\u0ce6]/g,function(p){return f[p]})},postformat:function(e){return e.replace(/\d/g,function(p){return a[p]})},meridiemParse:/\u0cb0\u0cbe\u0ca4\u0ccd\u0cb0\u0cbf|\u0cac\u0cc6\u0cb3\u0cbf\u0c97\u0ccd\u0c97\u0cc6|\u0cae\u0ca7\u0ccd\u0caf\u0cbe\u0cb9\u0ccd\u0ca8|\u0cb8\u0c82\u0c9c\u0cc6/,meridiemHour:function(e,p){return 12===e&&(e=0),"\u0cb0\u0cbe\u0ca4\u0ccd\u0cb0\u0cbf"===p?e<4?e:e+12:"\u0cac\u0cc6\u0cb3\u0cbf\u0c97\u0ccd\u0c97\u0cc6"===p?e:"\u0cae\u0ca7\u0ccd\u0caf\u0cbe\u0cb9\u0ccd\u0ca8"===p?e>=10?e:e+12:"\u0cb8\u0c82\u0c9c\u0cc6"===p?e+12:void 0},meridiem:function(e,p,y){return e<4?"\u0cb0\u0cbe\u0ca4\u0ccd\u0cb0\u0cbf":e<10?"\u0cac\u0cc6\u0cb3\u0cbf\u0c97\u0ccd\u0c97\u0cc6":e<17?"\u0cae\u0ca7\u0ccd\u0caf\u0cbe\u0cb9\u0ccd\u0ca8":e<20?"\u0cb8\u0c82\u0c9c\u0cc6":"\u0cb0\u0cbe\u0ca4\u0ccd\u0cb0\u0cbf"},dayOfMonthOrdinalParse:/\d{1,2}(\u0ca8\u0cc6\u0cd5)/,ordinal:function(e){return e+"\u0ca8\u0cc6\u0cd5"},week:{dow:0,doy:6}})}(i(16738))},21721:function(m,S,i){!function(r){"use strict";r.defineLocale("ko",{months:"1\uc6d4_2\uc6d4_3\uc6d4_4\uc6d4_5\uc6d4_6\uc6d4_7\uc6d4_8\uc6d4_9\uc6d4_10\uc6d4_11\uc6d4_12\uc6d4".split("_"),monthsShort:"1\uc6d4_2\uc6d4_3\uc6d4_4\uc6d4_5\uc6d4_6\uc6d4_7\uc6d4_8\uc6d4_9\uc6d4_10\uc6d4_11\uc6d4_12\uc6d4".split("_"),weekdays:"\uc77c\uc694\uc77c_\uc6d4\uc694\uc77c_\ud654\uc694\uc77c_\uc218\uc694\uc77c_\ubaa9\uc694\uc77c_\uae08\uc694\uc77c_\ud1a0\uc694\uc77c".split("_"),weekdaysShort:"\uc77c_\uc6d4_\ud654_\uc218_\ubaa9_\uae08_\ud1a0".split("_"),weekdaysMin:"\uc77c_\uc6d4_\ud654_\uc218_\ubaa9_\uae08_\ud1a0".split("_"),longDateFormat:{LT:"A h:mm",LTS:"A h:mm:ss",L:"YYYY.MM.DD.",LL:"YYYY\ub144 MMMM D\uc77c",LLL:"YYYY\ub144 MMMM D\uc77c A h:mm",LLLL:"YYYY\ub144 MMMM D\uc77c dddd A h:mm",l:"YYYY.MM.DD.",ll:"YYYY\ub144 MMMM D\uc77c",lll:"YYYY\ub144 MMMM D\uc77c A h:mm",llll:"YYYY\ub144 MMMM D\uc77c dddd A h:mm"},calendar:{sameDay:"\uc624\ub298 LT",nextDay:"\ub0b4\uc77c LT",nextWeek:"dddd LT",lastDay:"\uc5b4\uc81c LT",lastWeek:"\uc9c0\ub09c\uc8fc dddd LT",sameElse:"L"},relativeTime:{future:"%s \ud6c4",past:"%s \uc804",s:"\uba87 \ucd08",ss:"%d\ucd08",m:"1\ubd84",mm:"%d\ubd84",h:"\ud55c \uc2dc\uac04",hh:"%d\uc2dc\uac04",d:"\ud558\ub8e8",dd:"%d\uc77c",M:"\ud55c \ub2ec",MM:"%d\ub2ec",y:"\uc77c \ub144",yy:"%d\ub144"},dayOfMonthOrdinalParse:/\d{1,2}(\uc77c|\uc6d4|\uc8fc)/,ordinal:function(f,c){switch(c){case"d":case"D":case"DDD":return f+"\uc77c";case"M":return f+"\uc6d4";case"w":case"W":return f+"\uc8fc";default:return f}},meridiemParse:/\uc624\uc804|\uc624\ud6c4/,isPM:function(f){return"\uc624\ud6c4"===f},meridiem:function(f,c,e){return f<12?"\uc624\uc804":"\uc624\ud6c4"}})}(i(16738))},37851:function(m,S,i){!function(r){"use strict";var a={1:"\u0661",2:"\u0662",3:"\u0663",4:"\u0664",5:"\u0665",6:"\u0666",7:"\u0667",8:"\u0668",9:"\u0669",0:"\u0660"},f={"\u0661":"1","\u0662":"2","\u0663":"3","\u0664":"4","\u0665":"5","\u0666":"6","\u0667":"7","\u0668":"8","\u0669":"9","\u0660":"0"},c=["\u06a9\u0627\u0646\u0648\u0646\u06cc \u062f\u0648\u0648\u06d5\u0645","\u0634\u0648\u0628\u0627\u062a","\u0626\u0627\u0632\u0627\u0631","\u0646\u06cc\u0633\u0627\u0646","\u0626\u0627\u06cc\u0627\u0631","\u062d\u0648\u0632\u06d5\u06cc\u0631\u0627\u0646","\u062a\u06d5\u0645\u0645\u0648\u0632","\u0626\u0627\u0628","\u0626\u06d5\u06cc\u0644\u0648\u0648\u0644","\u062a\u0634\u0631\u06cc\u0646\u06cc \u06cc\u06d5\u0643\u06d5\u0645","\u062a\u0634\u0631\u06cc\u0646\u06cc \u062f\u0648\u0648\u06d5\u0645","\u0643\u0627\u0646\u0648\u0646\u06cc \u06cc\u06d5\u06a9\u06d5\u0645"];r.defineLocale("ku",{months:c,monthsShort:c,weekdays:"\u06cc\u0647\u200c\u0643\u0634\u0647\u200c\u0645\u0645\u0647\u200c_\u062f\u0648\u0648\u0634\u0647\u200c\u0645\u0645\u0647\u200c_\u0633\u06ce\u0634\u0647\u200c\u0645\u0645\u0647\u200c_\u0686\u0648\u0627\u0631\u0634\u0647\u200c\u0645\u0645\u0647\u200c_\u067e\u06ce\u0646\u062c\u0634\u0647\u200c\u0645\u0645\u0647\u200c_\u0647\u0647\u200c\u06cc\u0646\u06cc_\u0634\u0647\u200c\u0645\u0645\u0647\u200c".split("_"),weekdaysShort:"\u06cc\u0647\u200c\u0643\u0634\u0647\u200c\u0645_\u062f\u0648\u0648\u0634\u0647\u200c\u0645_\u0633\u06ce\u0634\u0647\u200c\u0645_\u0686\u0648\u0627\u0631\u0634\u0647\u200c\u0645_\u067e\u06ce\u0646\u062c\u0634\u0647\u200c\u0645_\u0647\u0647\u200c\u06cc\u0646\u06cc_\u0634\u0647\u200c\u0645\u0645\u0647\u200c".split("_"),weekdaysMin:"\u06cc_\u062f_\u0633_\u0686_\u067e_\u0647_\u0634".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd, D MMMM YYYY HH:mm"},meridiemParse:/\u0626\u06ce\u0648\u0627\u0631\u0647\u200c|\u0628\u0647\u200c\u06cc\u0627\u0646\u06cc/,isPM:function(p){return/\u0626\u06ce\u0648\u0627\u0631\u0647\u200c/.test(p)},meridiem:function(p,y,T){return p<12?"\u0628\u0647\u200c\u06cc\u0627\u0646\u06cc":"\u0626\u06ce\u0648\u0627\u0631\u0647\u200c"},calendar:{sameDay:"[\u0626\u0647\u200c\u0645\u0631\u06c6 \u0643\u0627\u062a\u0698\u0645\u06ce\u0631] LT",nextDay:"[\u0628\u0647\u200c\u06cc\u0627\u0646\u06cc \u0643\u0627\u062a\u0698\u0645\u06ce\u0631] LT",nextWeek:"dddd [\u0643\u0627\u062a\u0698\u0645\u06ce\u0631] LT",lastDay:"[\u062f\u0648\u06ce\u0646\u06ce \u0643\u0627\u062a\u0698\u0645\u06ce\u0631] LT",lastWeek:"dddd [\u0643\u0627\u062a\u0698\u0645\u06ce\u0631] LT",sameElse:"L"},relativeTime:{future:"\u0644\u0647\u200c %s",past:"%s",s:"\u0686\u0647\u200c\u0646\u062f \u0686\u0631\u0643\u0647\u200c\u06cc\u0647\u200c\u0643",ss:"\u0686\u0631\u0643\u0647\u200c %d",m:"\u06cc\u0647\u200c\u0643 \u062e\u0648\u0644\u0647\u200c\u0643",mm:"%d \u062e\u0648\u0644\u0647\u200c\u0643",h:"\u06cc\u0647\u200c\u0643 \u0643\u0627\u062a\u0698\u0645\u06ce\u0631",hh:"%d \u0643\u0627\u062a\u0698\u0645\u06ce\u0631",d:"\u06cc\u0647\u200c\u0643 \u0695\u06c6\u0698",dd:"%d \u0695\u06c6\u0698",M:"\u06cc\u0647\u200c\u0643 \u0645\u0627\u0646\u06af",MM:"%d \u0645\u0627\u0646\u06af",y:"\u06cc\u0647\u200c\u0643 \u0633\u0627\u06b5",yy:"%d \u0633\u0627\u06b5"},preparse:function(p){return p.replace(/[\u0661\u0662\u0663\u0664\u0665\u0666\u0667\u0668\u0669\u0660]/g,function(y){return f[y]}).replace(/\u060c/g,",")},postformat:function(p){return p.replace(/\d/g,function(y){return a[y]}).replace(/,/g,"\u060c")},week:{dow:6,doy:12}})}(i(16738))},1727:function(m,S,i){!function(r){"use strict";var a={0:"-\u0447\u04af",1:"-\u0447\u0438",2:"-\u0447\u0438",3:"-\u0447\u04af",4:"-\u0447\u04af",5:"-\u0447\u0438",6:"-\u0447\u044b",7:"-\u0447\u0438",8:"-\u0447\u0438",9:"-\u0447\u0443",10:"-\u0447\u0443",20:"-\u0447\u044b",30:"-\u0447\u0443",40:"-\u0447\u044b",50:"-\u0447\u04af",60:"-\u0447\u044b",70:"-\u0447\u0438",80:"-\u0447\u0438",90:"-\u0447\u0443",100:"-\u0447\u04af"};r.defineLocale("ky",{months:"\u044f\u043d\u0432\u0430\u0440\u044c_\u0444\u0435\u0432\u0440\u0430\u043b\u044c_\u043c\u0430\u0440\u0442_\u0430\u043f\u0440\u0435\u043b\u044c_\u043c\u0430\u0439_\u0438\u044e\u043d\u044c_\u0438\u044e\u043b\u044c_\u0430\u0432\u0433\u0443\u0441\u0442_\u0441\u0435\u043d\u0442\u044f\u0431\u0440\u044c_\u043e\u043a\u0442\u044f\u0431\u0440\u044c_\u043d\u043e\u044f\u0431\u0440\u044c_\u0434\u0435\u043a\u0430\u0431\u0440\u044c".split("_"),monthsShort:"\u044f\u043d\u0432_\u0444\u0435\u0432_\u043c\u0430\u0440\u0442_\u0430\u043f\u0440_\u043c\u0430\u0439_\u0438\u044e\u043d\u044c_\u0438\u044e\u043b\u044c_\u0430\u0432\u0433_\u0441\u0435\u043d_\u043e\u043a\u0442_\u043d\u043e\u044f_\u0434\u0435\u043a".split("_"),weekdays:"\u0416\u0435\u043a\u0448\u0435\u043c\u0431\u0438_\u0414\u04af\u0439\u0448\u04e9\u043c\u0431\u04af_\u0428\u0435\u0439\u0448\u0435\u043c\u0431\u0438_\u0428\u0430\u0440\u0448\u0435\u043c\u0431\u0438_\u0411\u0435\u0439\u0448\u0435\u043c\u0431\u0438_\u0416\u0443\u043c\u0430_\u0418\u0448\u0435\u043c\u0431\u0438".split("_"),weekdaysShort:"\u0416\u0435\u043a_\u0414\u04af\u0439_\u0428\u0435\u0439_\u0428\u0430\u0440_\u0411\u0435\u0439_\u0416\u0443\u043c_\u0418\u0448\u0435".split("_"),weekdaysMin:"\u0416\u043a_\u0414\u0439_\u0428\u0439_\u0428\u0440_\u0411\u0439_\u0416\u043c_\u0418\u0448".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD.MM.YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd, D MMMM YYYY HH:mm"},calendar:{sameDay:"[\u0411\u04af\u0433\u04af\u043d \u0441\u0430\u0430\u0442] LT",nextDay:"[\u042d\u0440\u0442\u0435\u04a3 \u0441\u0430\u0430\u0442] LT",nextWeek:"dddd [\u0441\u0430\u0430\u0442] LT",lastDay:"[\u041a\u0435\u0447\u044d\u044d \u0441\u0430\u0430\u0442] LT",lastWeek:"[\u04e8\u0442\u043a\u04e9\u043d \u0430\u043f\u0442\u0430\u043d\u044b\u043d] dddd [\u043a\u04af\u043d\u04af] [\u0441\u0430\u0430\u0442] LT",sameElse:"L"},relativeTime:{future:"%s \u0438\u0447\u0438\u043d\u0434\u0435",past:"%s \u043c\u0443\u0440\u0443\u043d",s:"\u0431\u0438\u0440\u043d\u0435\u0447\u0435 \u0441\u0435\u043a\u0443\u043d\u0434",ss:"%d \u0441\u0435\u043a\u0443\u043d\u0434",m:"\u0431\u0438\u0440 \u043c\u04af\u043d\u04e9\u0442",mm:"%d \u043c\u04af\u043d\u04e9\u0442",h:"\u0431\u0438\u0440 \u0441\u0430\u0430\u0442",hh:"%d \u0441\u0430\u0430\u0442",d:"\u0431\u0438\u0440 \u043a\u04af\u043d",dd:"%d \u043a\u04af\u043d",M:"\u0431\u0438\u0440 \u0430\u0439",MM:"%d \u0430\u0439",y:"\u0431\u0438\u0440 \u0436\u044b\u043b",yy:"%d \u0436\u044b\u043b"},dayOfMonthOrdinalParse:/\d{1,2}-(\u0447\u0438|\u0447\u044b|\u0447\u04af|\u0447\u0443)/,ordinal:function(c){return c+(a[c]||a[c%10]||a[c>=100?100:null])},week:{dow:1,doy:7}})}(i(16738))},40346:function(m,S,i){!function(r){"use strict";function a(y,T,C,R){var L={m:["eng Minutt","enger Minutt"],h:["eng Stonn","enger Stonn"],d:["een Dag","engem Dag"],M:["ee Mount","engem Mount"],y:["ee Joer","engem Joer"]};return T?L[C][0]:L[C][1]}function e(y){if(y=parseInt(y,10),isNaN(y))return!1;if(y<0)return!0;if(y<10)return 4<=y&&y<=7;if(y<100){var T=y%10;return e(0===T?y/10:T)}if(y<1e4){for(;y>=10;)y/=10;return e(y)}return e(y/=1e3)}r.defineLocale("lb",{months:"Januar_Februar_M\xe4erz_Abr\xebll_Mee_Juni_Juli_August_September_Oktober_November_Dezember".split("_"),monthsShort:"Jan._Febr._Mrz._Abr._Mee_Jun._Jul._Aug._Sept._Okt._Nov._Dez.".split("_"),monthsParseExact:!0,weekdays:"Sonndeg_M\xe9indeg_D\xebnschdeg_M\xebttwoch_Donneschdeg_Freideg_Samschdeg".split("_"),weekdaysShort:"So._M\xe9._D\xeb._M\xeb._Do._Fr._Sa.".split("_"),weekdaysMin:"So_M\xe9_D\xeb_M\xeb_Do_Fr_Sa".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"H:mm [Auer]",LTS:"H:mm:ss [Auer]",L:"DD.MM.YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY H:mm [Auer]",LLLL:"dddd, D. MMMM YYYY H:mm [Auer]"},calendar:{sameDay:"[Haut um] LT",sameElse:"L",nextDay:"[Muer um] LT",nextWeek:"dddd [um] LT",lastDay:"[G\xebschter um] LT",lastWeek:function(){switch(this.day()){case 2:case 4:return"[Leschten] dddd [um] LT";default:return"[Leschte] dddd [um] LT"}}},relativeTime:{future:function f(y){return e(y.substr(0,y.indexOf(" ")))?"a "+y:"an "+y},past:function c(y){return e(y.substr(0,y.indexOf(" ")))?"viru "+y:"virun "+y},s:"e puer Sekonnen",ss:"%d Sekonnen",m:a,mm:"%d Minutten",h:a,hh:"%d Stonnen",d:a,dd:"%d Deeg",M:a,MM:"%d M\xe9int",y:a,yy:"%d Joer"},dayOfMonthOrdinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:4}})}(i(16738))},93002:function(m,S,i){!function(r){"use strict";r.defineLocale("lo",{months:"\u0ea1\u0eb1\u0e87\u0e81\u0ead\u0e99_\u0e81\u0eb8\u0ea1\u0e9e\u0eb2_\u0ea1\u0eb5\u0e99\u0eb2_\u0ec0\u0ea1\u0eaa\u0eb2_\u0e9e\u0eb6\u0e94\u0eaa\u0eb0\u0e9e\u0eb2_\u0ea1\u0eb4\u0e96\u0eb8\u0e99\u0eb2_\u0e81\u0ecd\u0ea5\u0eb0\u0e81\u0ebb\u0e94_\u0eaa\u0eb4\u0e87\u0eab\u0eb2_\u0e81\u0eb1\u0e99\u0e8d\u0eb2_\u0e95\u0eb8\u0ea5\u0eb2_\u0e9e\u0eb0\u0e88\u0eb4\u0e81_\u0e97\u0eb1\u0e99\u0ea7\u0eb2".split("_"),monthsShort:"\u0ea1\u0eb1\u0e87\u0e81\u0ead\u0e99_\u0e81\u0eb8\u0ea1\u0e9e\u0eb2_\u0ea1\u0eb5\u0e99\u0eb2_\u0ec0\u0ea1\u0eaa\u0eb2_\u0e9e\u0eb6\u0e94\u0eaa\u0eb0\u0e9e\u0eb2_\u0ea1\u0eb4\u0e96\u0eb8\u0e99\u0eb2_\u0e81\u0ecd\u0ea5\u0eb0\u0e81\u0ebb\u0e94_\u0eaa\u0eb4\u0e87\u0eab\u0eb2_\u0e81\u0eb1\u0e99\u0e8d\u0eb2_\u0e95\u0eb8\u0ea5\u0eb2_\u0e9e\u0eb0\u0e88\u0eb4\u0e81_\u0e97\u0eb1\u0e99\u0ea7\u0eb2".split("_"),weekdays:"\u0ead\u0eb2\u0e97\u0eb4\u0e94_\u0e88\u0eb1\u0e99_\u0ead\u0eb1\u0e87\u0e84\u0eb2\u0e99_\u0e9e\u0eb8\u0e94_\u0e9e\u0eb0\u0eab\u0eb1\u0e94_\u0eaa\u0eb8\u0e81_\u0ec0\u0eaa\u0ebb\u0eb2".split("_"),weekdaysShort:"\u0e97\u0eb4\u0e94_\u0e88\u0eb1\u0e99_\u0ead\u0eb1\u0e87\u0e84\u0eb2\u0e99_\u0e9e\u0eb8\u0e94_\u0e9e\u0eb0\u0eab\u0eb1\u0e94_\u0eaa\u0eb8\u0e81_\u0ec0\u0eaa\u0ebb\u0eb2".split("_"),weekdaysMin:"\u0e97_\u0e88_\u0ead\u0e84_\u0e9e_\u0e9e\u0eab_\u0eaa\u0e81_\u0eaa".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"\u0ea7\u0eb1\u0e99dddd D MMMM YYYY HH:mm"},meridiemParse:/\u0e95\u0ead\u0e99\u0ec0\u0e8a\u0ebb\u0ec9\u0eb2|\u0e95\u0ead\u0e99\u0ec1\u0ea5\u0e87/,isPM:function(f){return"\u0e95\u0ead\u0e99\u0ec1\u0ea5\u0e87"===f},meridiem:function(f,c,e){return f<12?"\u0e95\u0ead\u0e99\u0ec0\u0e8a\u0ebb\u0ec9\u0eb2":"\u0e95\u0ead\u0e99\u0ec1\u0ea5\u0e87"},calendar:{sameDay:"[\u0ea1\u0eb7\u0ec9\u0e99\u0eb5\u0ec9\u0ec0\u0ea7\u0ea5\u0eb2] LT",nextDay:"[\u0ea1\u0eb7\u0ec9\u0ead\u0eb7\u0ec8\u0e99\u0ec0\u0ea7\u0ea5\u0eb2] LT",nextWeek:"[\u0ea7\u0eb1\u0e99]dddd[\u0edc\u0ec9\u0eb2\u0ec0\u0ea7\u0ea5\u0eb2] LT",lastDay:"[\u0ea1\u0eb7\u0ec9\u0ea7\u0eb2\u0e99\u0e99\u0eb5\u0ec9\u0ec0\u0ea7\u0ea5\u0eb2] LT",lastWeek:"[\u0ea7\u0eb1\u0e99]dddd[\u0ec1\u0ea5\u0ec9\u0ea7\u0e99\u0eb5\u0ec9\u0ec0\u0ea7\u0ea5\u0eb2] LT",sameElse:"L"},relativeTime:{future:"\u0ead\u0eb5\u0e81 %s",past:"%s\u0e9c\u0ec8\u0eb2\u0e99\u0ea1\u0eb2",s:"\u0e9a\u0ecd\u0ec8\u0ec0\u0e97\u0ebb\u0ec8\u0eb2\u0ec3\u0e94\u0ea7\u0eb4\u0e99\u0eb2\u0e97\u0eb5",ss:"%d \u0ea7\u0eb4\u0e99\u0eb2\u0e97\u0eb5",m:"1 \u0e99\u0eb2\u0e97\u0eb5",mm:"%d \u0e99\u0eb2\u0e97\u0eb5",h:"1 \u0e8a\u0ebb\u0ec8\u0ea7\u0ec2\u0ea1\u0e87",hh:"%d \u0e8a\u0ebb\u0ec8\u0ea7\u0ec2\u0ea1\u0e87",d:"1 \u0ea1\u0eb7\u0ec9",dd:"%d \u0ea1\u0eb7\u0ec9",M:"1 \u0ec0\u0e94\u0eb7\u0ead\u0e99",MM:"%d \u0ec0\u0e94\u0eb7\u0ead\u0e99",y:"1 \u0e9b\u0eb5",yy:"%d \u0e9b\u0eb5"},dayOfMonthOrdinalParse:/(\u0e97\u0eb5\u0ec8)\d{1,2}/,ordinal:function(f){return"\u0e97\u0eb5\u0ec8"+f}})}(i(16738))},64035:function(m,S,i){!function(r){"use strict";var a={ss:"sekund\u0117_sekund\u017ei\u0173_sekundes",m:"minut\u0117_minut\u0117s_minut\u0119",mm:"minut\u0117s_minu\u010di\u0173_minutes",h:"valanda_valandos_valand\u0105",hh:"valandos_valand\u0173_valandas",d:"diena_dienos_dien\u0105",dd:"dienos_dien\u0173_dienas",M:"m\u0117nuo_m\u0117nesio_m\u0117nes\u012f",MM:"m\u0117nesiai_m\u0117nesi\u0173_m\u0117nesius",y:"metai_met\u0173_metus",yy:"metai_met\u0173_metus"};function c(C,R,L,z){return R?p(L)[0]:z?p(L)[1]:p(L)[2]}function e(C){return C%10==0||C>10&&C<20}function p(C){return a[C].split("_")}function y(C,R,L,z){var W=C+" ";return 1===C?W+c(0,R,L[0],z):R?W+(e(C)?p(L)[1]:p(L)[0]):z?W+p(L)[1]:W+(e(C)?p(L)[1]:p(L)[2])}r.defineLocale("lt",{months:{format:"sausio_vasario_kovo_baland\u017eio_gegu\u017e\u0117s_bir\u017eelio_liepos_rugpj\u016b\u010dio_rugs\u0117jo_spalio_lapkri\u010dio_gruod\u017eio".split("_"),standalone:"sausis_vasaris_kovas_balandis_gegu\u017e\u0117_bir\u017eelis_liepa_rugpj\u016btis_rugs\u0117jis_spalis_lapkritis_gruodis".split("_"),isFormat:/D[oD]?(\[[^\[\]]*\]|\s)+MMMM?|MMMM?(\[[^\[\]]*\]|\s)+D[oD]?/},monthsShort:"sau_vas_kov_bal_geg_bir_lie_rgp_rgs_spa_lap_grd".split("_"),weekdays:{format:"sekmadien\u012f_pirmadien\u012f_antradien\u012f_tre\u010diadien\u012f_ketvirtadien\u012f_penktadien\u012f_\u0161e\u0161tadien\u012f".split("_"),standalone:"sekmadienis_pirmadienis_antradienis_tre\u010diadienis_ketvirtadienis_penktadienis_\u0161e\u0161tadienis".split("_"),isFormat:/dddd HH:mm/},weekdaysShort:"Sek_Pir_Ant_Tre_Ket_Pen_\u0160e\u0161".split("_"),weekdaysMin:"S_P_A_T_K_Pn_\u0160".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"YYYY-MM-DD",LL:"YYYY [m.] MMMM D [d.]",LLL:"YYYY [m.] MMMM D [d.], HH:mm [val.]",LLLL:"YYYY [m.] MMMM D [d.], dddd, HH:mm [val.]",l:"YYYY-MM-DD",ll:"YYYY [m.] MMMM D [d.]",lll:"YYYY [m.] MMMM D [d.], HH:mm [val.]",llll:"YYYY [m.] MMMM D [d.], ddd, HH:mm [val.]"},calendar:{sameDay:"[\u0160iandien] LT",nextDay:"[Rytoj] LT",nextWeek:"dddd LT",lastDay:"[Vakar] LT",lastWeek:"[Pra\u0117jus\u012f] dddd LT",sameElse:"L"},relativeTime:{future:"po %s",past:"prie\u0161 %s",s:function f(C,R,L,z){return R?"kelios sekund\u0117s":z?"keli\u0173 sekund\u017ei\u0173":"kelias sekundes"},ss:y,m:c,mm:y,h:c,hh:y,d:c,dd:y,M:c,MM:y,y:c,yy:y},dayOfMonthOrdinalParse:/\d{1,2}-oji/,ordinal:function(C){return C+"-oji"},week:{dow:1,doy:4}})}(i(16738))},56927:function(m,S,i){!function(r){"use strict";var a={ss:"sekundes_sekund\u0113m_sekunde_sekundes".split("_"),m:"min\u016btes_min\u016bt\u0113m_min\u016bte_min\u016btes".split("_"),mm:"min\u016btes_min\u016bt\u0113m_min\u016bte_min\u016btes".split("_"),h:"stundas_stund\u0101m_stunda_stundas".split("_"),hh:"stundas_stund\u0101m_stunda_stundas".split("_"),d:"dienas_dien\u0101m_diena_dienas".split("_"),dd:"dienas_dien\u0101m_diena_dienas".split("_"),M:"m\u0113ne\u0161a_m\u0113ne\u0161iem_m\u0113nesis_m\u0113ne\u0161i".split("_"),MM:"m\u0113ne\u0161a_m\u0113ne\u0161iem_m\u0113nesis_m\u0113ne\u0161i".split("_"),y:"gada_gadiem_gads_gadi".split("_"),yy:"gada_gadiem_gads_gadi".split("_")};function f(T,C,R){return R?C%10==1&&C%100!=11?T[2]:T[3]:C%10==1&&C%100!=11?T[0]:T[1]}function c(T,C,R){return T+" "+f(a[R],T,C)}function e(T,C,R){return f(a[R],T,C)}r.defineLocale("lv",{months:"janv\u0101ris_febru\u0101ris_marts_apr\u012blis_maijs_j\u016bnijs_j\u016blijs_augusts_septembris_oktobris_novembris_decembris".split("_"),monthsShort:"jan_feb_mar_apr_mai_j\u016bn_j\u016bl_aug_sep_okt_nov_dec".split("_"),weekdays:"sv\u0113tdiena_pirmdiena_otrdiena_tre\u0161diena_ceturtdiena_piektdiena_sestdiena".split("_"),weekdaysShort:"Sv_P_O_T_C_Pk_S".split("_"),weekdaysMin:"Sv_P_O_T_C_Pk_S".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD.MM.YYYY.",LL:"YYYY. [gada] D. MMMM",LLL:"YYYY. [gada] D. MMMM, HH:mm",LLLL:"YYYY. [gada] D. MMMM, dddd, HH:mm"},calendar:{sameDay:"[\u0160odien pulksten] LT",nextDay:"[R\u012bt pulksten] LT",nextWeek:"dddd [pulksten] LT",lastDay:"[Vakar pulksten] LT",lastWeek:"[Pag\u0101ju\u0161\u0101] dddd [pulksten] LT",sameElse:"L"},relativeTime:{future:"p\u0113c %s",past:"pirms %s",s:function p(T,C){return C?"da\u017eas sekundes":"da\u017e\u0101m sekund\u0113m"},ss:c,m:e,mm:c,h:e,hh:c,d:e,dd:c,M:e,MM:c,y:e,yy:c},dayOfMonthOrdinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:4}})}(i(16738))},5634:function(m,S,i){!function(r){"use strict";var a={words:{ss:["sekund","sekunda","sekundi"],m:["jedan minut","jednog minuta"],mm:["minut","minuta","minuta"],h:["jedan sat","jednog sata"],hh:["sat","sata","sati"],dd:["dan","dana","dana"],MM:["mjesec","mjeseca","mjeseci"],yy:["godina","godine","godina"]},correctGrammaticalCase:function(c,e){return 1===c?e[0]:c>=2&&c<=4?e[1]:e[2]},translate:function(c,e,p){var y=a.words[p];return 1===p.length?e?y[0]:y[1]:c+" "+a.correctGrammaticalCase(c,y)}};r.defineLocale("me",{months:"januar_februar_mart_april_maj_jun_jul_avgust_septembar_oktobar_novembar_decembar".split("_"),monthsShort:"jan._feb._mar._apr._maj_jun_jul_avg._sep._okt._nov._dec.".split("_"),monthsParseExact:!0,weekdays:"nedjelja_ponedjeljak_utorak_srijeda_\u010detvrtak_petak_subota".split("_"),weekdaysShort:"ned._pon._uto._sri._\u010det._pet._sub.".split("_"),weekdaysMin:"ne_po_ut_sr_\u010de_pe_su".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"H:mm",LTS:"H:mm:ss",L:"DD.MM.YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY H:mm",LLLL:"dddd, D. MMMM YYYY H:mm"},calendar:{sameDay:"[danas u] LT",nextDay:"[sjutra u] LT",nextWeek:function(){switch(this.day()){case 0:return"[u] [nedjelju] [u] LT";case 3:return"[u] [srijedu] [u] LT";case 6:return"[u] [subotu] [u] LT";case 1:case 2:case 4:case 5:return"[u] dddd [u] LT"}},lastDay:"[ju\u010de u] LT",lastWeek:function(){return["[pro\u0161le] [nedjelje] [u] LT","[pro\u0161log] [ponedjeljka] [u] LT","[pro\u0161log] [utorka] [u] LT","[pro\u0161le] [srijede] [u] LT","[pro\u0161log] [\u010detvrtka] [u] LT","[pro\u0161log] [petka] [u] LT","[pro\u0161le] [subote] [u] LT"][this.day()]},sameElse:"L"},relativeTime:{future:"za %s",past:"prije %s",s:"nekoliko sekundi",ss:a.translate,m:a.translate,mm:a.translate,h:a.translate,hh:a.translate,d:"dan",dd:a.translate,M:"mjesec",MM:a.translate,y:"godinu",yy:a.translate},dayOfMonthOrdinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:7}})}(i(16738))},94173:function(m,S,i){!function(r){"use strict";r.defineLocale("mi",{months:"Kohi-t\u0101te_Hui-tanguru_Pout\u016b-te-rangi_Paenga-wh\u0101wh\u0101_Haratua_Pipiri_H\u014dngoingoi_Here-turi-k\u014dk\u0101_Mahuru_Whiringa-\u0101-nuku_Whiringa-\u0101-rangi_Hakihea".split("_"),monthsShort:"Kohi_Hui_Pou_Pae_Hara_Pipi_H\u014dngoi_Here_Mahu_Whi-nu_Whi-ra_Haki".split("_"),monthsRegex:/(?:['a-z\u0101\u014D\u016B]+\-?){1,3}/i,monthsStrictRegex:/(?:['a-z\u0101\u014D\u016B]+\-?){1,3}/i,monthsShortRegex:/(?:['a-z\u0101\u014D\u016B]+\-?){1,3}/i,monthsShortStrictRegex:/(?:['a-z\u0101\u014D\u016B]+\-?){1,2}/i,weekdays:"R\u0101tapu_Mane_T\u016brei_Wenerei_T\u0101ite_Paraire_H\u0101tarei".split("_"),weekdaysShort:"Ta_Ma_T\u016b_We_T\u0101i_Pa_H\u0101".split("_"),weekdaysMin:"Ta_Ma_T\u016b_We_T\u0101i_Pa_H\u0101".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY [i] HH:mm",LLLL:"dddd, D MMMM YYYY [i] HH:mm"},calendar:{sameDay:"[i teie mahana, i] LT",nextDay:"[apopo i] LT",nextWeek:"dddd [i] LT",lastDay:"[inanahi i] LT",lastWeek:"dddd [whakamutunga i] LT",sameElse:"L"},relativeTime:{future:"i roto i %s",past:"%s i mua",s:"te h\u0113kona ruarua",ss:"%d h\u0113kona",m:"he meneti",mm:"%d meneti",h:"te haora",hh:"%d haora",d:"he ra",dd:"%d ra",M:"he marama",MM:"%d marama",y:"he tau",yy:"%d tau"},dayOfMonthOrdinalParse:/\d{1,2}\xba/,ordinal:"%d\xba",week:{dow:1,doy:4}})}(i(16738))},86320:function(m,S,i){!function(r){"use strict";r.defineLocale("mk",{months:"\u0458\u0430\u043d\u0443\u0430\u0440\u0438_\u0444\u0435\u0432\u0440\u0443\u0430\u0440\u0438_\u043c\u0430\u0440\u0442_\u0430\u043f\u0440\u0438\u043b_\u043c\u0430\u0458_\u0458\u0443\u043d\u0438_\u0458\u0443\u043b\u0438_\u0430\u0432\u0433\u0443\u0441\u0442_\u0441\u0435\u043f\u0442\u0435\u043c\u0432\u0440\u0438_\u043e\u043a\u0442\u043e\u043c\u0432\u0440\u0438_\u043d\u043e\u0435\u043c\u0432\u0440\u0438_\u0434\u0435\u043a\u0435\u043c\u0432\u0440\u0438".split("_"),monthsShort:"\u0458\u0430\u043d_\u0444\u0435\u0432_\u043c\u0430\u0440_\u0430\u043f\u0440_\u043c\u0430\u0458_\u0458\u0443\u043d_\u0458\u0443\u043b_\u0430\u0432\u0433_\u0441\u0435\u043f_\u043e\u043a\u0442_\u043d\u043e\u0435_\u0434\u0435\u043a".split("_"),weekdays:"\u043d\u0435\u0434\u0435\u043b\u0430_\u043f\u043e\u043d\u0435\u0434\u0435\u043b\u043d\u0438\u043a_\u0432\u0442\u043e\u0440\u043d\u0438\u043a_\u0441\u0440\u0435\u0434\u0430_\u0447\u0435\u0442\u0432\u0440\u0442\u043e\u043a_\u043f\u0435\u0442\u043e\u043a_\u0441\u0430\u0431\u043e\u0442\u0430".split("_"),weekdaysShort:"\u043d\u0435\u0434_\u043f\u043e\u043d_\u0432\u0442\u043e_\u0441\u0440\u0435_\u0447\u0435\u0442_\u043f\u0435\u0442_\u0441\u0430\u0431".split("_"),weekdaysMin:"\u043de_\u043fo_\u0432\u0442_\u0441\u0440_\u0447\u0435_\u043f\u0435_\u0441a".split("_"),longDateFormat:{LT:"H:mm",LTS:"H:mm:ss",L:"D.MM.YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY H:mm",LLLL:"dddd, D MMMM YYYY H:mm"},calendar:{sameDay:"[\u0414\u0435\u043d\u0435\u0441 \u0432\u043e] LT",nextDay:"[\u0423\u0442\u0440\u0435 \u0432\u043e] LT",nextWeek:"[\u0412\u043e] dddd [\u0432\u043e] LT",lastDay:"[\u0412\u0447\u0435\u0440\u0430 \u0432\u043e] LT",lastWeek:function(){switch(this.day()){case 0:case 3:case 6:return"[\u0418\u0437\u043c\u0438\u043d\u0430\u0442\u0430\u0442\u0430] dddd [\u0432\u043e] LT";case 1:case 2:case 4:case 5:return"[\u0418\u0437\u043c\u0438\u043d\u0430\u0442\u0438\u043e\u0442] dddd [\u0432\u043e] LT"}},sameElse:"L"},relativeTime:{future:"\u0437\u0430 %s",past:"\u043f\u0440\u0435\u0434 %s",s:"\u043d\u0435\u043a\u043e\u043b\u043a\u0443 \u0441\u0435\u043a\u0443\u043d\u0434\u0438",ss:"%d \u0441\u0435\u043a\u0443\u043d\u0434\u0438",m:"\u0435\u0434\u043d\u0430 \u043c\u0438\u043d\u0443\u0442\u0430",mm:"%d \u043c\u0438\u043d\u0443\u0442\u0438",h:"\u0435\u0434\u0435\u043d \u0447\u0430\u0441",hh:"%d \u0447\u0430\u0441\u0430",d:"\u0435\u0434\u0435\u043d \u0434\u0435\u043d",dd:"%d \u0434\u0435\u043d\u0430",M:"\u0435\u0434\u0435\u043d \u043c\u0435\u0441\u0435\u0446",MM:"%d \u043c\u0435\u0441\u0435\u0446\u0438",y:"\u0435\u0434\u043d\u0430 \u0433\u043e\u0434\u0438\u043d\u0430",yy:"%d \u0433\u043e\u0434\u0438\u043d\u0438"},dayOfMonthOrdinalParse:/\d{1,2}-(\u0435\u0432|\u0435\u043d|\u0442\u0438|\u0432\u0438|\u0440\u0438|\u043c\u0438)/,ordinal:function(f){var c=f%10,e=f%100;return 0===f?f+"-\u0435\u0432":0===e?f+"-\u0435\u043d":e>10&&e<20?f+"-\u0442\u0438":1===c?f+"-\u0432\u0438":2===c?f+"-\u0440\u0438":7===c||8===c?f+"-\u043c\u0438":f+"-\u0442\u0438"},week:{dow:1,doy:7}})}(i(16738))},11705:function(m,S,i){!function(r){"use strict";r.defineLocale("ml",{months:"\u0d1c\u0d28\u0d41\u0d35\u0d30\u0d3f_\u0d2b\u0d46\u0d2c\u0d4d\u0d30\u0d41\u0d35\u0d30\u0d3f_\u0d2e\u0d3e\u0d7c\u0d1a\u0d4d\u0d1a\u0d4d_\u0d0f\u0d2a\u0d4d\u0d30\u0d3f\u0d7d_\u0d2e\u0d47\u0d2f\u0d4d_\u0d1c\u0d42\u0d7a_\u0d1c\u0d42\u0d32\u0d48_\u0d13\u0d17\u0d38\u0d4d\u0d31\u0d4d\u0d31\u0d4d_\u0d38\u0d46\u0d2a\u0d4d\u0d31\u0d4d\u0d31\u0d02\u0d2c\u0d7c_\u0d12\u0d15\u0d4d\u0d1f\u0d4b\u0d2c\u0d7c_\u0d28\u0d35\u0d02\u0d2c\u0d7c_\u0d21\u0d3f\u0d38\u0d02\u0d2c\u0d7c".split("_"),monthsShort:"\u0d1c\u0d28\u0d41._\u0d2b\u0d46\u0d2c\u0d4d\u0d30\u0d41._\u0d2e\u0d3e\u0d7c._\u0d0f\u0d2a\u0d4d\u0d30\u0d3f._\u0d2e\u0d47\u0d2f\u0d4d_\u0d1c\u0d42\u0d7a_\u0d1c\u0d42\u0d32\u0d48._\u0d13\u0d17._\u0d38\u0d46\u0d2a\u0d4d\u0d31\u0d4d\u0d31._\u0d12\u0d15\u0d4d\u0d1f\u0d4b._\u0d28\u0d35\u0d02._\u0d21\u0d3f\u0d38\u0d02.".split("_"),monthsParseExact:!0,weekdays:"\u0d1e\u0d3e\u0d2f\u0d31\u0d3e\u0d34\u0d4d\u0d1a_\u0d24\u0d3f\u0d19\u0d4d\u0d15\u0d33\u0d3e\u0d34\u0d4d\u0d1a_\u0d1a\u0d4a\u0d35\u0d4d\u0d35\u0d3e\u0d34\u0d4d\u0d1a_\u0d2c\u0d41\u0d27\u0d28\u0d3e\u0d34\u0d4d\u0d1a_\u0d35\u0d4d\u0d2f\u0d3e\u0d34\u0d3e\u0d34\u0d4d\u0d1a_\u0d35\u0d46\u0d33\u0d4d\u0d33\u0d3f\u0d2f\u0d3e\u0d34\u0d4d\u0d1a_\u0d36\u0d28\u0d3f\u0d2f\u0d3e\u0d34\u0d4d\u0d1a".split("_"),weekdaysShort:"\u0d1e\u0d3e\u0d2f\u0d7c_\u0d24\u0d3f\u0d19\u0d4d\u0d15\u0d7e_\u0d1a\u0d4a\u0d35\u0d4d\u0d35_\u0d2c\u0d41\u0d27\u0d7b_\u0d35\u0d4d\u0d2f\u0d3e\u0d34\u0d02_\u0d35\u0d46\u0d33\u0d4d\u0d33\u0d3f_\u0d36\u0d28\u0d3f".split("_"),weekdaysMin:"\u0d1e\u0d3e_\u0d24\u0d3f_\u0d1a\u0d4a_\u0d2c\u0d41_\u0d35\u0d4d\u0d2f\u0d3e_\u0d35\u0d46_\u0d36".split("_"),longDateFormat:{LT:"A h:mm -\u0d28\u0d41",LTS:"A h:mm:ss -\u0d28\u0d41",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY, A h:mm -\u0d28\u0d41",LLLL:"dddd, D MMMM YYYY, A h:mm -\u0d28\u0d41"},calendar:{sameDay:"[\u0d07\u0d28\u0d4d\u0d28\u0d4d] LT",nextDay:"[\u0d28\u0d3e\u0d33\u0d46] LT",nextWeek:"dddd, LT",lastDay:"[\u0d07\u0d28\u0d4d\u0d28\u0d32\u0d46] LT",lastWeek:"[\u0d15\u0d34\u0d3f\u0d1e\u0d4d\u0d1e] dddd, LT",sameElse:"L"},relativeTime:{future:"%s \u0d15\u0d34\u0d3f\u0d1e\u0d4d\u0d1e\u0d4d",past:"%s \u0d2e\u0d41\u0d7b\u0d2a\u0d4d",s:"\u0d05\u0d7d\u0d2a \u0d28\u0d3f\u0d2e\u0d3f\u0d37\u0d19\u0d4d\u0d19\u0d7e",ss:"%d \u0d38\u0d46\u0d15\u0d4d\u0d15\u0d7b\u0d21\u0d4d",m:"\u0d12\u0d30\u0d41 \u0d2e\u0d3f\u0d28\u0d3f\u0d31\u0d4d\u0d31\u0d4d",mm:"%d \u0d2e\u0d3f\u0d28\u0d3f\u0d31\u0d4d\u0d31\u0d4d",h:"\u0d12\u0d30\u0d41 \u0d2e\u0d23\u0d3f\u0d15\u0d4d\u0d15\u0d42\u0d7c",hh:"%d \u0d2e\u0d23\u0d3f\u0d15\u0d4d\u0d15\u0d42\u0d7c",d:"\u0d12\u0d30\u0d41 \u0d26\u0d3f\u0d35\u0d38\u0d02",dd:"%d \u0d26\u0d3f\u0d35\u0d38\u0d02",M:"\u0d12\u0d30\u0d41 \u0d2e\u0d3e\u0d38\u0d02",MM:"%d \u0d2e\u0d3e\u0d38\u0d02",y:"\u0d12\u0d30\u0d41 \u0d35\u0d7c\u0d37\u0d02",yy:"%d \u0d35\u0d7c\u0d37\u0d02"},meridiemParse:/\u0d30\u0d3e\u0d24\u0d4d\u0d30\u0d3f|\u0d30\u0d3e\u0d35\u0d3f\u0d32\u0d46|\u0d09\u0d1a\u0d4d\u0d1a \u0d15\u0d34\u0d3f\u0d1e\u0d4d\u0d1e\u0d4d|\u0d35\u0d48\u0d15\u0d41\u0d28\u0d4d\u0d28\u0d47\u0d30\u0d02|\u0d30\u0d3e\u0d24\u0d4d\u0d30\u0d3f/i,meridiemHour:function(f,c){return 12===f&&(f=0),"\u0d30\u0d3e\u0d24\u0d4d\u0d30\u0d3f"===c&&f>=4||"\u0d09\u0d1a\u0d4d\u0d1a \u0d15\u0d34\u0d3f\u0d1e\u0d4d\u0d1e\u0d4d"===c||"\u0d35\u0d48\u0d15\u0d41\u0d28\u0d4d\u0d28\u0d47\u0d30\u0d02"===c?f+12:f},meridiem:function(f,c,e){return f<4?"\u0d30\u0d3e\u0d24\u0d4d\u0d30\u0d3f":f<12?"\u0d30\u0d3e\u0d35\u0d3f\u0d32\u0d46":f<17?"\u0d09\u0d1a\u0d4d\u0d1a \u0d15\u0d34\u0d3f\u0d1e\u0d4d\u0d1e\u0d4d":f<20?"\u0d35\u0d48\u0d15\u0d41\u0d28\u0d4d\u0d28\u0d47\u0d30\u0d02":"\u0d30\u0d3e\u0d24\u0d4d\u0d30\u0d3f"}})}(i(16738))},31062:function(m,S,i){!function(r){"use strict";function a(c,e,p,y){switch(p){case"s":return e?"\u0445\u044d\u0434\u0445\u044d\u043d \u0441\u0435\u043a\u0443\u043d\u0434":"\u0445\u044d\u0434\u0445\u044d\u043d \u0441\u0435\u043a\u0443\u043d\u0434\u044b\u043d";case"ss":return c+(e?" \u0441\u0435\u043a\u0443\u043d\u0434":" \u0441\u0435\u043a\u0443\u043d\u0434\u044b\u043d");case"m":case"mm":return c+(e?" \u043c\u0438\u043d\u0443\u0442":" \u043c\u0438\u043d\u0443\u0442\u044b\u043d");case"h":case"hh":return c+(e?" \u0446\u0430\u0433":" \u0446\u0430\u0433\u0438\u0439\u043d");case"d":case"dd":return c+(e?" \u04e9\u0434\u04e9\u0440":" \u04e9\u0434\u0440\u0438\u0439\u043d");case"M":case"MM":return c+(e?" \u0441\u0430\u0440":" \u0441\u0430\u0440\u044b\u043d");case"y":case"yy":return c+(e?" \u0436\u0438\u043b":" \u0436\u0438\u043b\u0438\u0439\u043d");default:return c}}r.defineLocale("mn",{months:"\u041d\u044d\u0433\u0434\u04af\u0433\u044d\u044d\u0440 \u0441\u0430\u0440_\u0425\u043e\u0451\u0440\u0434\u0443\u0433\u0430\u0430\u0440 \u0441\u0430\u0440_\u0413\u0443\u0440\u0430\u0432\u0434\u0443\u0433\u0430\u0430\u0440 \u0441\u0430\u0440_\u0414\u04e9\u0440\u04e9\u0432\u0434\u04af\u0433\u044d\u044d\u0440 \u0441\u0430\u0440_\u0422\u0430\u0432\u0434\u0443\u0433\u0430\u0430\u0440 \u0441\u0430\u0440_\u0417\u0443\u0440\u0433\u0430\u0434\u0443\u0433\u0430\u0430\u0440 \u0441\u0430\u0440_\u0414\u043e\u043b\u0434\u0443\u0433\u0430\u0430\u0440 \u0441\u0430\u0440_\u041d\u0430\u0439\u043c\u0434\u0443\u0433\u0430\u0430\u0440 \u0441\u0430\u0440_\u0415\u0441\u0434\u04af\u0433\u044d\u044d\u0440 \u0441\u0430\u0440_\u0410\u0440\u0430\u0432\u0434\u0443\u0433\u0430\u0430\u0440 \u0441\u0430\u0440_\u0410\u0440\u0432\u0430\u043d \u043d\u044d\u0433\u0434\u04af\u0433\u044d\u044d\u0440 \u0441\u0430\u0440_\u0410\u0440\u0432\u0430\u043d \u0445\u043e\u0451\u0440\u0434\u0443\u0433\u0430\u0430\u0440 \u0441\u0430\u0440".split("_"),monthsShort:"1 \u0441\u0430\u0440_2 \u0441\u0430\u0440_3 \u0441\u0430\u0440_4 \u0441\u0430\u0440_5 \u0441\u0430\u0440_6 \u0441\u0430\u0440_7 \u0441\u0430\u0440_8 \u0441\u0430\u0440_9 \u0441\u0430\u0440_10 \u0441\u0430\u0440_11 \u0441\u0430\u0440_12 \u0441\u0430\u0440".split("_"),monthsParseExact:!0,weekdays:"\u041d\u044f\u043c_\u0414\u0430\u0432\u0430\u0430_\u041c\u044f\u0433\u043c\u0430\u0440_\u041b\u0445\u0430\u0433\u0432\u0430_\u041f\u04af\u0440\u044d\u0432_\u0411\u0430\u0430\u0441\u0430\u043d_\u0411\u044f\u043c\u0431\u0430".split("_"),weekdaysShort:"\u041d\u044f\u043c_\u0414\u0430\u0432_\u041c\u044f\u0433_\u041b\u0445\u0430_\u041f\u04af\u0440_\u0411\u0430\u0430_\u0411\u044f\u043c".split("_"),weekdaysMin:"\u041d\u044f_\u0414\u0430_\u041c\u044f_\u041b\u0445_\u041f\u04af_\u0411\u0430_\u0411\u044f".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"YYYY-MM-DD",LL:"YYYY \u043e\u043d\u044b MMMM\u044b\u043d D",LLL:"YYYY \u043e\u043d\u044b MMMM\u044b\u043d D HH:mm",LLLL:"dddd, YYYY \u043e\u043d\u044b MMMM\u044b\u043d D HH:mm"},meridiemParse:/\u04ae\u04e8|\u04ae\u0425/i,isPM:function(c){return"\u04ae\u0425"===c},meridiem:function(c,e,p){return c<12?"\u04ae\u04e8":"\u04ae\u0425"},calendar:{sameDay:"[\u04e8\u043d\u04e9\u04e9\u0434\u04e9\u0440] LT",nextDay:"[\u041c\u0430\u0440\u0433\u0430\u0430\u0448] LT",nextWeek:"[\u0418\u0440\u044d\u0445] dddd LT",lastDay:"[\u04e8\u0447\u0438\u0433\u0434\u04e9\u0440] LT",lastWeek:"[\u04e8\u043d\u0433\u04e9\u0440\u0441\u04e9\u043d] dddd LT",sameElse:"L"},relativeTime:{future:"%s \u0434\u0430\u0440\u0430\u0430",past:"%s \u04e9\u043c\u043d\u04e9",s:a,ss:a,m:a,mm:a,h:a,hh:a,d:a,dd:a,M:a,MM:a,y:a,yy:a},dayOfMonthOrdinalParse:/\d{1,2} \u04e9\u0434\u04e9\u0440/,ordinal:function(c,e){switch(e){case"d":case"D":case"DDD":return c+" \u04e9\u0434\u04e9\u0440";default:return c}}})}(i(16738))},92805:function(m,S,i){!function(r){"use strict";var a={1:"\u0967",2:"\u0968",3:"\u0969",4:"\u096a",5:"\u096b",6:"\u096c",7:"\u096d",8:"\u096e",9:"\u096f",0:"\u0966"},f={"\u0967":"1","\u0968":"2","\u0969":"3","\u096a":"4","\u096b":"5","\u096c":"6","\u096d":"7","\u096e":"8","\u096f":"9","\u0966":"0"};function c(p,y,T,C){var R="";if(y)switch(T){case"s":R="\u0915\u093e\u0939\u0940 \u0938\u0947\u0915\u0902\u0926";break;case"ss":R="%d \u0938\u0947\u0915\u0902\u0926";break;case"m":R="\u090f\u0915 \u092e\u093f\u0928\u093f\u091f";break;case"mm":R="%d \u092e\u093f\u0928\u093f\u091f\u0947";break;case"h":R="\u090f\u0915 \u0924\u093e\u0938";break;case"hh":R="%d \u0924\u093e\u0938";break;case"d":R="\u090f\u0915 \u0926\u093f\u0935\u0938";break;case"dd":R="%d \u0926\u093f\u0935\u0938";break;case"M":R="\u090f\u0915 \u092e\u0939\u093f\u0928\u093e";break;case"MM":R="%d \u092e\u0939\u093f\u0928\u0947";break;case"y":R="\u090f\u0915 \u0935\u0930\u094d\u0937";break;case"yy":R="%d \u0935\u0930\u094d\u0937\u0947"}else switch(T){case"s":R="\u0915\u093e\u0939\u0940 \u0938\u0947\u0915\u0902\u0926\u093e\u0902";break;case"ss":R="%d \u0938\u0947\u0915\u0902\u0926\u093e\u0902";break;case"m":R="\u090f\u0915\u093e \u092e\u093f\u0928\u093f\u091f\u093e";break;case"mm":R="%d \u092e\u093f\u0928\u093f\u091f\u093e\u0902";break;case"h":R="\u090f\u0915\u093e \u0924\u093e\u0938\u093e";break;case"hh":R="%d \u0924\u093e\u0938\u093e\u0902";break;case"d":R="\u090f\u0915\u093e \u0926\u093f\u0935\u0938\u093e";break;case"dd":R="%d \u0926\u093f\u0935\u0938\u093e\u0902";break;case"M":R="\u090f\u0915\u093e \u092e\u0939\u093f\u0928\u094d\u092f\u093e";break;case"MM":R="%d \u092e\u0939\u093f\u0928\u094d\u092f\u093e\u0902";break;case"y":R="\u090f\u0915\u093e \u0935\u0930\u094d\u0937\u093e";break;case"yy":R="%d \u0935\u0930\u094d\u0937\u093e\u0902"}return R.replace(/%d/i,p)}r.defineLocale("mr",{months:"\u091c\u093e\u0928\u0947\u0935\u093e\u0930\u0940_\u092b\u0947\u092c\u094d\u0930\u0941\u0935\u093e\u0930\u0940_\u092e\u093e\u0930\u094d\u091a_\u090f\u092a\u094d\u0930\u093f\u0932_\u092e\u0947_\u091c\u0942\u0928_\u091c\u0941\u0932\u0948_\u0911\u0917\u0938\u094d\u091f_\u0938\u092a\u094d\u091f\u0947\u0902\u092c\u0930_\u0911\u0915\u094d\u091f\u094b\u092c\u0930_\u0928\u094b\u0935\u094d\u0939\u0947\u0902\u092c\u0930_\u0921\u093f\u0938\u0947\u0902\u092c\u0930".split("_"),monthsShort:"\u091c\u093e\u0928\u0947._\u092b\u0947\u092c\u094d\u0930\u0941._\u092e\u093e\u0930\u094d\u091a._\u090f\u092a\u094d\u0930\u093f._\u092e\u0947._\u091c\u0942\u0928._\u091c\u0941\u0932\u0948._\u0911\u0917._\u0938\u092a\u094d\u091f\u0947\u0902._\u0911\u0915\u094d\u091f\u094b._\u0928\u094b\u0935\u094d\u0939\u0947\u0902._\u0921\u093f\u0938\u0947\u0902.".split("_"),monthsParseExact:!0,weekdays:"\u0930\u0935\u093f\u0935\u093e\u0930_\u0938\u094b\u092e\u0935\u093e\u0930_\u092e\u0902\u0917\u0933\u0935\u093e\u0930_\u092c\u0941\u0927\u0935\u093e\u0930_\u0917\u0941\u0930\u0942\u0935\u093e\u0930_\u0936\u0941\u0915\u094d\u0930\u0935\u093e\u0930_\u0936\u0928\u093f\u0935\u093e\u0930".split("_"),weekdaysShort:"\u0930\u0935\u093f_\u0938\u094b\u092e_\u092e\u0902\u0917\u0933_\u092c\u0941\u0927_\u0917\u0941\u0930\u0942_\u0936\u0941\u0915\u094d\u0930_\u0936\u0928\u093f".split("_"),weekdaysMin:"\u0930_\u0938\u094b_\u092e\u0902_\u092c\u0941_\u0917\u0941_\u0936\u0941_\u0936".split("_"),longDateFormat:{LT:"A h:mm \u0935\u093e\u091c\u0924\u093e",LTS:"A h:mm:ss \u0935\u093e\u091c\u0924\u093e",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY, A h:mm \u0935\u093e\u091c\u0924\u093e",LLLL:"dddd, D MMMM YYYY, A h:mm \u0935\u093e\u091c\u0924\u093e"},calendar:{sameDay:"[\u0906\u091c] LT",nextDay:"[\u0909\u0926\u094d\u092f\u093e] LT",nextWeek:"dddd, LT",lastDay:"[\u0915\u093e\u0932] LT",lastWeek:"[\u092e\u093e\u0917\u0940\u0932] dddd, LT",sameElse:"L"},relativeTime:{future:"%s\u092e\u0927\u094d\u092f\u0947",past:"%s\u092a\u0942\u0930\u094d\u0935\u0940",s:c,ss:c,m:c,mm:c,h:c,hh:c,d:c,dd:c,M:c,MM:c,y:c,yy:c},preparse:function(p){return p.replace(/[\u0967\u0968\u0969\u096a\u096b\u096c\u096d\u096e\u096f\u0966]/g,function(y){return f[y]})},postformat:function(p){return p.replace(/\d/g,function(y){return a[y]})},meridiemParse:/\u092a\u0939\u093e\u091f\u0947|\u0938\u0915\u093e\u0933\u0940|\u0926\u0941\u092a\u093e\u0930\u0940|\u0938\u093e\u092f\u0902\u0915\u093e\u0933\u0940|\u0930\u093e\u0924\u094d\u0930\u0940/,meridiemHour:function(p,y){return 12===p&&(p=0),"\u092a\u0939\u093e\u091f\u0947"===y||"\u0938\u0915\u093e\u0933\u0940"===y?p:"\u0926\u0941\u092a\u093e\u0930\u0940"===y||"\u0938\u093e\u092f\u0902\u0915\u093e\u0933\u0940"===y||"\u0930\u093e\u0924\u094d\u0930\u0940"===y?p>=12?p:p+12:void 0},meridiem:function(p,y,T){return p>=0&&p<6?"\u092a\u0939\u093e\u091f\u0947":p<12?"\u0938\u0915\u093e\u0933\u0940":p<17?"\u0926\u0941\u092a\u093e\u0930\u0940":p<20?"\u0938\u093e\u092f\u0902\u0915\u093e\u0933\u0940":"\u0930\u093e\u0924\u094d\u0930\u0940"},week:{dow:0,doy:6}})}(i(16738))},59900:function(m,S,i){!function(r){"use strict";r.defineLocale("ms-my",{months:"Januari_Februari_Mac_April_Mei_Jun_Julai_Ogos_September_Oktober_November_Disember".split("_"),monthsShort:"Jan_Feb_Mac_Apr_Mei_Jun_Jul_Ogs_Sep_Okt_Nov_Dis".split("_"),weekdays:"Ahad_Isnin_Selasa_Rabu_Khamis_Jumaat_Sabtu".split("_"),weekdaysShort:"Ahd_Isn_Sel_Rab_Kha_Jum_Sab".split("_"),weekdaysMin:"Ah_Is_Sl_Rb_Km_Jm_Sb".split("_"),longDateFormat:{LT:"HH.mm",LTS:"HH.mm.ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY [pukul] HH.mm",LLLL:"dddd, D MMMM YYYY [pukul] HH.mm"},meridiemParse:/pagi|tengahari|petang|malam/,meridiemHour:function(f,c){return 12===f&&(f=0),"pagi"===c?f:"tengahari"===c?f>=11?f:f+12:"petang"===c||"malam"===c?f+12:void 0},meridiem:function(f,c,e){return f<11?"pagi":f<15?"tengahari":f<19?"petang":"malam"},calendar:{sameDay:"[Hari ini pukul] LT",nextDay:"[Esok pukul] LT",nextWeek:"dddd [pukul] LT",lastDay:"[Kelmarin pukul] LT",lastWeek:"dddd [lepas pukul] LT",sameElse:"L"},relativeTime:{future:"dalam %s",past:"%s yang lepas",s:"beberapa saat",ss:"%d saat",m:"seminit",mm:"%d minit",h:"sejam",hh:"%d jam",d:"sehari",dd:"%d hari",M:"sebulan",MM:"%d bulan",y:"setahun",yy:"%d tahun"},week:{dow:1,doy:7}})}(i(16738))},11341:function(m,S,i){!function(r){"use strict";r.defineLocale("ms",{months:"Januari_Februari_Mac_April_Mei_Jun_Julai_Ogos_September_Oktober_November_Disember".split("_"),monthsShort:"Jan_Feb_Mac_Apr_Mei_Jun_Jul_Ogs_Sep_Okt_Nov_Dis".split("_"),weekdays:"Ahad_Isnin_Selasa_Rabu_Khamis_Jumaat_Sabtu".split("_"),weekdaysShort:"Ahd_Isn_Sel_Rab_Kha_Jum_Sab".split("_"),weekdaysMin:"Ah_Is_Sl_Rb_Km_Jm_Sb".split("_"),longDateFormat:{LT:"HH.mm",LTS:"HH.mm.ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY [pukul] HH.mm",LLLL:"dddd, D MMMM YYYY [pukul] HH.mm"},meridiemParse:/pagi|tengahari|petang|malam/,meridiemHour:function(f,c){return 12===f&&(f=0),"pagi"===c?f:"tengahari"===c?f>=11?f:f+12:"petang"===c||"malam"===c?f+12:void 0},meridiem:function(f,c,e){return f<11?"pagi":f<15?"tengahari":f<19?"petang":"malam"},calendar:{sameDay:"[Hari ini pukul] LT",nextDay:"[Esok pukul] LT",nextWeek:"dddd [pukul] LT",lastDay:"[Kelmarin pukul] LT",lastWeek:"dddd [lepas pukul] LT",sameElse:"L"},relativeTime:{future:"dalam %s",past:"%s yang lepas",s:"beberapa saat",ss:"%d saat",m:"seminit",mm:"%d minit",h:"sejam",hh:"%d jam",d:"sehari",dd:"%d hari",M:"sebulan",MM:"%d bulan",y:"setahun",yy:"%d tahun"},week:{dow:1,doy:7}})}(i(16738))},37734:function(m,S,i){!function(r){"use strict";r.defineLocale("mt",{months:"Jannar_Frar_Marzu_April_Mejju_\u0120unju_Lulju_Awwissu_Settembru_Ottubru_Novembru_Di\u010bembru".split("_"),monthsShort:"Jan_Fra_Mar_Apr_Mej_\u0120un_Lul_Aww_Set_Ott_Nov_Di\u010b".split("_"),weekdays:"Il-\u0126add_It-Tnejn_It-Tlieta_L-Erbg\u0127a_Il-\u0126amis_Il-\u0120img\u0127a_Is-Sibt".split("_"),weekdaysShort:"\u0126ad_Tne_Tli_Erb_\u0126am_\u0120im_Sib".split("_"),weekdaysMin:"\u0126a_Tn_Tl_Er_\u0126a_\u0120i_Si".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd, D MMMM YYYY HH:mm"},calendar:{sameDay:"[Illum fil-]LT",nextDay:"[G\u0127ada fil-]LT",nextWeek:"dddd [fil-]LT",lastDay:"[Il-biera\u0127 fil-]LT",lastWeek:"dddd [li g\u0127adda] [fil-]LT",sameElse:"L"},relativeTime:{future:"f\u2019 %s",past:"%s ilu",s:"ftit sekondi",ss:"%d sekondi",m:"minuta",mm:"%d minuti",h:"sieg\u0127a",hh:"%d sieg\u0127at",d:"\u0121urnata",dd:"%d \u0121ranet",M:"xahar",MM:"%d xhur",y:"sena",yy:"%d sni"},dayOfMonthOrdinalParse:/\d{1,2}\xba/,ordinal:"%d\xba",week:{dow:1,doy:4}})}(i(16738))},19034:function(m,S,i){!function(r){"use strict";var a={1:"\u1041",2:"\u1042",3:"\u1043",4:"\u1044",5:"\u1045",6:"\u1046",7:"\u1047",8:"\u1048",9:"\u1049",0:"\u1040"},f={"\u1041":"1","\u1042":"2","\u1043":"3","\u1044":"4","\u1045":"5","\u1046":"6","\u1047":"7","\u1048":"8","\u1049":"9","\u1040":"0"};r.defineLocale("my",{months:"\u1007\u1014\u103a\u1014\u101d\u102b\u101b\u102e_\u1016\u1031\u1016\u1031\u102c\u103a\u101d\u102b\u101b\u102e_\u1019\u1010\u103a_\u1027\u1015\u103c\u102e_\u1019\u1031_\u1007\u103d\u1014\u103a_\u1007\u1030\u101c\u102d\u102f\u1004\u103a_\u101e\u103c\u1002\u102f\u1010\u103a_\u1005\u1000\u103a\u1010\u1004\u103a\u1018\u102c_\u1021\u1031\u102c\u1000\u103a\u1010\u102d\u102f\u1018\u102c_\u1014\u102d\u102f\u101d\u1004\u103a\u1018\u102c_\u1012\u102e\u1007\u1004\u103a\u1018\u102c".split("_"),monthsShort:"\u1007\u1014\u103a_\u1016\u1031_\u1019\u1010\u103a_\u1015\u103c\u102e_\u1019\u1031_\u1007\u103d\u1014\u103a_\u101c\u102d\u102f\u1004\u103a_\u101e\u103c_\u1005\u1000\u103a_\u1021\u1031\u102c\u1000\u103a_\u1014\u102d\u102f_\u1012\u102e".split("_"),weekdays:"\u1010\u1014\u1004\u103a\u1039\u1002\u1014\u103d\u1031_\u1010\u1014\u1004\u103a\u1039\u101c\u102c_\u1021\u1004\u103a\u1039\u1002\u102b_\u1017\u102f\u1012\u1039\u1013\u101f\u1030\u1038_\u1000\u103c\u102c\u101e\u1015\u1010\u1031\u1038_\u101e\u1031\u102c\u1000\u103c\u102c_\u1005\u1014\u1031".split("_"),weekdaysShort:"\u1014\u103d\u1031_\u101c\u102c_\u1002\u102b_\u101f\u1030\u1038_\u1000\u103c\u102c_\u101e\u1031\u102c_\u1014\u1031".split("_"),weekdaysMin:"\u1014\u103d\u1031_\u101c\u102c_\u1002\u102b_\u101f\u1030\u1038_\u1000\u103c\u102c_\u101e\u1031\u102c_\u1014\u1031".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd D MMMM YYYY HH:mm"},calendar:{sameDay:"[\u101a\u1014\u1031.] LT [\u1019\u103e\u102c]",nextDay:"[\u1019\u1014\u1000\u103a\u1016\u103c\u1014\u103a] LT [\u1019\u103e\u102c]",nextWeek:"dddd LT [\u1019\u103e\u102c]",lastDay:"[\u1019\u1014\u1031.\u1000] LT [\u1019\u103e\u102c]",lastWeek:"[\u1015\u103c\u102e\u1038\u1001\u1032\u1037\u101e\u1031\u102c] dddd LT [\u1019\u103e\u102c]",sameElse:"L"},relativeTime:{future:"\u101c\u102c\u1019\u100a\u103a\u1037 %s \u1019\u103e\u102c",past:"\u101c\u103d\u1014\u103a\u1001\u1032\u1037\u101e\u1031\u102c %s \u1000",s:"\u1005\u1000\u1039\u1000\u1014\u103a.\u1021\u1014\u100a\u103a\u1038\u1004\u101a\u103a",ss:"%d \u1005\u1000\u1039\u1000\u1014\u1037\u103a",m:"\u1010\u1005\u103a\u1019\u102d\u1014\u1005\u103a",mm:"%d \u1019\u102d\u1014\u1005\u103a",h:"\u1010\u1005\u103a\u1014\u102c\u101b\u102e",hh:"%d \u1014\u102c\u101b\u102e",d:"\u1010\u1005\u103a\u101b\u1000\u103a",dd:"%d \u101b\u1000\u103a",M:"\u1010\u1005\u103a\u101c",MM:"%d \u101c",y:"\u1010\u1005\u103a\u1014\u103e\u1005\u103a",yy:"%d \u1014\u103e\u1005\u103a"},preparse:function(e){return e.replace(/[\u1041\u1042\u1043\u1044\u1045\u1046\u1047\u1048\u1049\u1040]/g,function(p){return f[p]})},postformat:function(e){return e.replace(/\d/g,function(p){return a[p]})},week:{dow:1,doy:4}})}(i(16738))},9324:function(m,S,i){!function(r){"use strict";r.defineLocale("nb",{months:"januar_februar_mars_april_mai_juni_juli_august_september_oktober_november_desember".split("_"),monthsShort:"jan._feb._mars_apr._mai_juni_juli_aug._sep._okt._nov._des.".split("_"),monthsParseExact:!0,weekdays:"s\xf8ndag_mandag_tirsdag_onsdag_torsdag_fredag_l\xf8rdag".split("_"),weekdaysShort:"s\xf8._ma._ti._on._to._fr._l\xf8.".split("_"),weekdaysMin:"s\xf8_ma_ti_on_to_fr_l\xf8".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD.MM.YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY [kl.] HH:mm",LLLL:"dddd D. MMMM YYYY [kl.] HH:mm"},calendar:{sameDay:"[i dag kl.] LT",nextDay:"[i morgen kl.] LT",nextWeek:"dddd [kl.] LT",lastDay:"[i g\xe5r kl.] LT",lastWeek:"[forrige] dddd [kl.] LT",sameElse:"L"},relativeTime:{future:"om %s",past:"%s siden",s:"noen sekunder",ss:"%d sekunder",m:"ett minutt",mm:"%d minutter",h:"en time",hh:"%d timer",d:"en dag",dd:"%d dager",w:"en uke",ww:"%d uker",M:"en m\xe5ned",MM:"%d m\xe5neder",y:"ett \xe5r",yy:"%d \xe5r"},dayOfMonthOrdinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:4}})}(i(16738))},46495:function(m,S,i){!function(r){"use strict";var a={1:"\u0967",2:"\u0968",3:"\u0969",4:"\u096a",5:"\u096b",6:"\u096c",7:"\u096d",8:"\u096e",9:"\u096f",0:"\u0966"},f={"\u0967":"1","\u0968":"2","\u0969":"3","\u096a":"4","\u096b":"5","\u096c":"6","\u096d":"7","\u096e":"8","\u096f":"9","\u0966":"0"};r.defineLocale("ne",{months:"\u091c\u0928\u0935\u0930\u0940_\u092b\u0947\u092c\u094d\u0930\u0941\u0935\u0930\u0940_\u092e\u093e\u0930\u094d\u091a_\u0905\u092a\u094d\u0930\u093f\u0932_\u092e\u0908_\u091c\u0941\u0928_\u091c\u0941\u0932\u093e\u0908_\u0905\u0917\u0937\u094d\u091f_\u0938\u0947\u092a\u094d\u091f\u0947\u092e\u094d\u092c\u0930_\u0905\u0915\u094d\u091f\u094b\u092c\u0930_\u0928\u094b\u092d\u0947\u092e\u094d\u092c\u0930_\u0921\u093f\u0938\u0947\u092e\u094d\u092c\u0930".split("_"),monthsShort:"\u091c\u0928._\u092b\u0947\u092c\u094d\u0930\u0941._\u092e\u093e\u0930\u094d\u091a_\u0905\u092a\u094d\u0930\u093f._\u092e\u0908_\u091c\u0941\u0928_\u091c\u0941\u0932\u093e\u0908._\u0905\u0917._\u0938\u0947\u092a\u094d\u091f._\u0905\u0915\u094d\u091f\u094b._\u0928\u094b\u092d\u0947._\u0921\u093f\u0938\u0947.".split("_"),monthsParseExact:!0,weekdays:"\u0906\u0907\u0924\u092c\u093e\u0930_\u0938\u094b\u092e\u092c\u093e\u0930_\u092e\u0919\u094d\u0917\u0932\u092c\u093e\u0930_\u092c\u0941\u0927\u092c\u093e\u0930_\u092c\u093f\u0939\u093f\u092c\u093e\u0930_\u0936\u0941\u0915\u094d\u0930\u092c\u093e\u0930_\u0936\u0928\u093f\u092c\u093e\u0930".split("_"),weekdaysShort:"\u0906\u0907\u0924._\u0938\u094b\u092e._\u092e\u0919\u094d\u0917\u0932._\u092c\u0941\u0927._\u092c\u093f\u0939\u093f._\u0936\u0941\u0915\u094d\u0930._\u0936\u0928\u093f.".split("_"),weekdaysMin:"\u0906._\u0938\u094b._\u092e\u0902._\u092c\u0941._\u092c\u093f._\u0936\u0941._\u0936.".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"A\u0915\u094b h:mm \u092c\u091c\u0947",LTS:"A\u0915\u094b h:mm:ss \u092c\u091c\u0947",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY, A\u0915\u094b h:mm \u092c\u091c\u0947",LLLL:"dddd, D MMMM YYYY, A\u0915\u094b h:mm \u092c\u091c\u0947"},preparse:function(e){return e.replace(/[\u0967\u0968\u0969\u096a\u096b\u096c\u096d\u096e\u096f\u0966]/g,function(p){return f[p]})},postformat:function(e){return e.replace(/\d/g,function(p){return a[p]})},meridiemParse:/\u0930\u093e\u0924\u093f|\u092c\u093f\u0939\u093e\u0928|\u0926\u093f\u0909\u0901\u0938\u094b|\u0938\u093e\u0901\u091d/,meridiemHour:function(e,p){return 12===e&&(e=0),"\u0930\u093e\u0924\u093f"===p?e<4?e:e+12:"\u092c\u093f\u0939\u093e\u0928"===p?e:"\u0926\u093f\u0909\u0901\u0938\u094b"===p?e>=10?e:e+12:"\u0938\u093e\u0901\u091d"===p?e+12:void 0},meridiem:function(e,p,y){return e<3?"\u0930\u093e\u0924\u093f":e<12?"\u092c\u093f\u0939\u093e\u0928":e<16?"\u0926\u093f\u0909\u0901\u0938\u094b":e<20?"\u0938\u093e\u0901\u091d":"\u0930\u093e\u0924\u093f"},calendar:{sameDay:"[\u0906\u091c] LT",nextDay:"[\u092d\u094b\u0932\u093f] LT",nextWeek:"[\u0906\u0909\u0901\u0926\u094b] dddd[,] LT",lastDay:"[\u0939\u093f\u091c\u094b] LT",lastWeek:"[\u0917\u090f\u0915\u094b] dddd[,] LT",sameElse:"L"},relativeTime:{future:"%s\u092e\u093e",past:"%s \u0905\u0917\u093e\u0921\u093f",s:"\u0915\u0947\u0939\u0940 \u0915\u094d\u0937\u0923",ss:"%d \u0938\u0947\u0915\u0947\u0923\u094d\u0921",m:"\u090f\u0915 \u092e\u093f\u0928\u0947\u091f",mm:"%d \u092e\u093f\u0928\u0947\u091f",h:"\u090f\u0915 \u0918\u0923\u094d\u091f\u093e",hh:"%d \u0918\u0923\u094d\u091f\u093e",d:"\u090f\u0915 \u0926\u093f\u0928",dd:"%d \u0926\u093f\u0928",M:"\u090f\u0915 \u092e\u0939\u093f\u0928\u093e",MM:"%d \u092e\u0939\u093f\u0928\u093e",y:"\u090f\u0915 \u092c\u0930\u094d\u0937",yy:"%d \u092c\u0930\u094d\u0937"},week:{dow:0,doy:6}})}(i(16738))},76272:function(m,S,i){!function(r){"use strict";var a="jan._feb._mrt._apr._mei_jun._jul._aug._sep._okt._nov._dec.".split("_"),f="jan_feb_mrt_apr_mei_jun_jul_aug_sep_okt_nov_dec".split("_"),c=[/^jan/i,/^feb/i,/^maart|mrt.?$/i,/^apr/i,/^mei$/i,/^jun[i.]?$/i,/^jul[i.]?$/i,/^aug/i,/^sep/i,/^okt/i,/^nov/i,/^dec/i],e=/^(januari|februari|maart|april|mei|ju[nl]i|augustus|september|oktober|november|december|jan\.?|feb\.?|mrt\.?|apr\.?|ju[nl]\.?|aug\.?|sep\.?|okt\.?|nov\.?|dec\.?)/i;r.defineLocale("nl-be",{months:"januari_februari_maart_april_mei_juni_juli_augustus_september_oktober_november_december".split("_"),monthsShort:function(y,T){return y?/-MMM-/.test(T)?f[y.month()]:a[y.month()]:a},monthsRegex:e,monthsShortRegex:e,monthsStrictRegex:/^(januari|februari|maart|april|mei|ju[nl]i|augustus|september|oktober|november|december)/i,monthsShortStrictRegex:/^(jan\.?|feb\.?|mrt\.?|apr\.?|mei|ju[nl]\.?|aug\.?|sep\.?|okt\.?|nov\.?|dec\.?)/i,monthsParse:c,longMonthsParse:c,shortMonthsParse:c,weekdays:"zondag_maandag_dinsdag_woensdag_donderdag_vrijdag_zaterdag".split("_"),weekdaysShort:"zo._ma._di._wo._do._vr._za.".split("_"),weekdaysMin:"zo_ma_di_wo_do_vr_za".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd D MMMM YYYY HH:mm"},calendar:{sameDay:"[vandaag om] LT",nextDay:"[morgen om] LT",nextWeek:"dddd [om] LT",lastDay:"[gisteren om] LT",lastWeek:"[afgelopen] dddd [om] LT",sameElse:"L"},relativeTime:{future:"over %s",past:"%s geleden",s:"een paar seconden",ss:"%d seconden",m:"\xe9\xe9n minuut",mm:"%d minuten",h:"\xe9\xe9n uur",hh:"%d uur",d:"\xe9\xe9n dag",dd:"%d dagen",M:"\xe9\xe9n maand",MM:"%d maanden",y:"\xe9\xe9n jaar",yy:"%d jaar"},dayOfMonthOrdinalParse:/\d{1,2}(ste|de)/,ordinal:function(y){return y+(1===y||8===y||y>=20?"ste":"de")},week:{dow:1,doy:4}})}(i(16738))},70673:function(m,S,i){!function(r){"use strict";var a="jan._feb._mrt._apr._mei_jun._jul._aug._sep._okt._nov._dec.".split("_"),f="jan_feb_mrt_apr_mei_jun_jul_aug_sep_okt_nov_dec".split("_"),c=[/^jan/i,/^feb/i,/^maart|mrt.?$/i,/^apr/i,/^mei$/i,/^jun[i.]?$/i,/^jul[i.]?$/i,/^aug/i,/^sep/i,/^okt/i,/^nov/i,/^dec/i],e=/^(januari|februari|maart|april|mei|ju[nl]i|augustus|september|oktober|november|december|jan\.?|feb\.?|mrt\.?|apr\.?|ju[nl]\.?|aug\.?|sep\.?|okt\.?|nov\.?|dec\.?)/i;r.defineLocale("nl",{months:"januari_februari_maart_april_mei_juni_juli_augustus_september_oktober_november_december".split("_"),monthsShort:function(y,T){return y?/-MMM-/.test(T)?f[y.month()]:a[y.month()]:a},monthsRegex:e,monthsShortRegex:e,monthsStrictRegex:/^(januari|februari|maart|april|mei|ju[nl]i|augustus|september|oktober|november|december)/i,monthsShortStrictRegex:/^(jan\.?|feb\.?|mrt\.?|apr\.?|mei|ju[nl]\.?|aug\.?|sep\.?|okt\.?|nov\.?|dec\.?)/i,monthsParse:c,longMonthsParse:c,shortMonthsParse:c,weekdays:"zondag_maandag_dinsdag_woensdag_donderdag_vrijdag_zaterdag".split("_"),weekdaysShort:"zo._ma._di._wo._do._vr._za.".split("_"),weekdaysMin:"zo_ma_di_wo_do_vr_za".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD-MM-YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd D MMMM YYYY HH:mm"},calendar:{sameDay:"[vandaag om] LT",nextDay:"[morgen om] LT",nextWeek:"dddd [om] LT",lastDay:"[gisteren om] LT",lastWeek:"[afgelopen] dddd [om] LT",sameElse:"L"},relativeTime:{future:"over %s",past:"%s geleden",s:"een paar seconden",ss:"%d seconden",m:"\xe9\xe9n minuut",mm:"%d minuten",h:"\xe9\xe9n uur",hh:"%d uur",d:"\xe9\xe9n dag",dd:"%d dagen",w:"\xe9\xe9n week",ww:"%d weken",M:"\xe9\xe9n maand",MM:"%d maanden",y:"\xe9\xe9n jaar",yy:"%d jaar"},dayOfMonthOrdinalParse:/\d{1,2}(ste|de)/,ordinal:function(y){return y+(1===y||8===y||y>=20?"ste":"de")},week:{dow:1,doy:4}})}(i(16738))},72486:function(m,S,i){!function(r){"use strict";r.defineLocale("nn",{months:"januar_februar_mars_april_mai_juni_juli_august_september_oktober_november_desember".split("_"),monthsShort:"jan._feb._mars_apr._mai_juni_juli_aug._sep._okt._nov._des.".split("_"),monthsParseExact:!0,weekdays:"sundag_m\xe5ndag_tysdag_onsdag_torsdag_fredag_laurdag".split("_"),weekdaysShort:"su._m\xe5._ty._on._to._fr._lau.".split("_"),weekdaysMin:"su_m\xe5_ty_on_to_fr_la".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD.MM.YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY [kl.] H:mm",LLLL:"dddd D. MMMM YYYY [kl.] HH:mm"},calendar:{sameDay:"[I dag klokka] LT",nextDay:"[I morgon klokka] LT",nextWeek:"dddd [klokka] LT",lastDay:"[I g\xe5r klokka] LT",lastWeek:"[F\xf8reg\xe5ande] dddd [klokka] LT",sameElse:"L"},relativeTime:{future:"om %s",past:"%s sidan",s:"nokre sekund",ss:"%d sekund",m:"eit minutt",mm:"%d minutt",h:"ein time",hh:"%d timar",d:"ein dag",dd:"%d dagar",w:"ei veke",ww:"%d veker",M:"ein m\xe5nad",MM:"%d m\xe5nader",y:"eit \xe5r",yy:"%d \xe5r"},dayOfMonthOrdinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:4}})}(i(16738))},46219:function(m,S,i){!function(r){"use strict";r.defineLocale("oc-lnc",{months:{standalone:"geni\xe8r_febri\xe8r_mar\xe7_abril_mai_junh_julhet_agost_setembre_oct\xf2bre_novembre_decembre".split("_"),format:"de geni\xe8r_de febri\xe8r_de mar\xe7_d'abril_de mai_de junh_de julhet_d'agost_de setembre_d'oct\xf2bre_de novembre_de decembre".split("_"),isFormat:/D[oD]?(\s)+MMMM/},monthsShort:"gen._febr._mar\xe7_abr._mai_junh_julh._ago._set._oct._nov._dec.".split("_"),monthsParseExact:!0,weekdays:"dimenge_diluns_dimars_dim\xe8cres_dij\xf2us_divendres_dissabte".split("_"),weekdaysShort:"dg._dl._dm._dc._dj._dv._ds.".split("_"),weekdaysMin:"dg_dl_dm_dc_dj_dv_ds".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"H:mm",LTS:"H:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM [de] YYYY",ll:"D MMM YYYY",LLL:"D MMMM [de] YYYY [a] H:mm",lll:"D MMM YYYY, H:mm",LLLL:"dddd D MMMM [de] YYYY [a] H:mm",llll:"ddd D MMM YYYY, H:mm"},calendar:{sameDay:"[u\xe8i a] LT",nextDay:"[deman a] LT",nextWeek:"dddd [a] LT",lastDay:"[i\xe8r a] LT",lastWeek:"dddd [passat a] LT",sameElse:"L"},relativeTime:{future:"d'aqu\xed %s",past:"fa %s",s:"unas segondas",ss:"%d segondas",m:"una minuta",mm:"%d minutas",h:"una ora",hh:"%d oras",d:"un jorn",dd:"%d jorns",M:"un mes",MM:"%d meses",y:"un an",yy:"%d ans"},dayOfMonthOrdinalParse:/\d{1,2}(r|n|t|\xe8|a)/,ordinal:function(f,c){var e=1===f?"r":2===f?"n":3===f?"r":4===f?"t":"\xe8";return("w"===c||"W"===c)&&(e="a"),f+e},week:{dow:1,doy:4}})}(i(16738))},2829:function(m,S,i){!function(r){"use strict";var a={1:"\u0a67",2:"\u0a68",3:"\u0a69",4:"\u0a6a",5:"\u0a6b",6:"\u0a6c",7:"\u0a6d",8:"\u0a6e",9:"\u0a6f",0:"\u0a66"},f={"\u0a67":"1","\u0a68":"2","\u0a69":"3","\u0a6a":"4","\u0a6b":"5","\u0a6c":"6","\u0a6d":"7","\u0a6e":"8","\u0a6f":"9","\u0a66":"0"};r.defineLocale("pa-in",{months:"\u0a1c\u0a28\u0a35\u0a30\u0a40_\u0a2b\u0a3c\u0a30\u0a35\u0a30\u0a40_\u0a2e\u0a3e\u0a30\u0a1a_\u0a05\u0a2a\u0a4d\u0a30\u0a48\u0a32_\u0a2e\u0a08_\u0a1c\u0a42\u0a28_\u0a1c\u0a41\u0a32\u0a3e\u0a08_\u0a05\u0a17\u0a38\u0a24_\u0a38\u0a24\u0a70\u0a2c\u0a30_\u0a05\u0a15\u0a24\u0a42\u0a2c\u0a30_\u0a28\u0a35\u0a70\u0a2c\u0a30_\u0a26\u0a38\u0a70\u0a2c\u0a30".split("_"),monthsShort:"\u0a1c\u0a28\u0a35\u0a30\u0a40_\u0a2b\u0a3c\u0a30\u0a35\u0a30\u0a40_\u0a2e\u0a3e\u0a30\u0a1a_\u0a05\u0a2a\u0a4d\u0a30\u0a48\u0a32_\u0a2e\u0a08_\u0a1c\u0a42\u0a28_\u0a1c\u0a41\u0a32\u0a3e\u0a08_\u0a05\u0a17\u0a38\u0a24_\u0a38\u0a24\u0a70\u0a2c\u0a30_\u0a05\u0a15\u0a24\u0a42\u0a2c\u0a30_\u0a28\u0a35\u0a70\u0a2c\u0a30_\u0a26\u0a38\u0a70\u0a2c\u0a30".split("_"),weekdays:"\u0a10\u0a24\u0a35\u0a3e\u0a30_\u0a38\u0a4b\u0a2e\u0a35\u0a3e\u0a30_\u0a2e\u0a70\u0a17\u0a32\u0a35\u0a3e\u0a30_\u0a2c\u0a41\u0a27\u0a35\u0a3e\u0a30_\u0a35\u0a40\u0a30\u0a35\u0a3e\u0a30_\u0a38\u0a3c\u0a41\u0a71\u0a15\u0a30\u0a35\u0a3e\u0a30_\u0a38\u0a3c\u0a28\u0a40\u0a1a\u0a30\u0a35\u0a3e\u0a30".split("_"),weekdaysShort:"\u0a10\u0a24_\u0a38\u0a4b\u0a2e_\u0a2e\u0a70\u0a17\u0a32_\u0a2c\u0a41\u0a27_\u0a35\u0a40\u0a30_\u0a38\u0a3c\u0a41\u0a15\u0a30_\u0a38\u0a3c\u0a28\u0a40".split("_"),weekdaysMin:"\u0a10\u0a24_\u0a38\u0a4b\u0a2e_\u0a2e\u0a70\u0a17\u0a32_\u0a2c\u0a41\u0a27_\u0a35\u0a40\u0a30_\u0a38\u0a3c\u0a41\u0a15\u0a30_\u0a38\u0a3c\u0a28\u0a40".split("_"),longDateFormat:{LT:"A h:mm \u0a35\u0a1c\u0a47",LTS:"A h:mm:ss \u0a35\u0a1c\u0a47",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY, A h:mm \u0a35\u0a1c\u0a47",LLLL:"dddd, D MMMM YYYY, A h:mm \u0a35\u0a1c\u0a47"},calendar:{sameDay:"[\u0a05\u0a1c] LT",nextDay:"[\u0a15\u0a32] LT",nextWeek:"[\u0a05\u0a17\u0a32\u0a3e] dddd, LT",lastDay:"[\u0a15\u0a32] LT",lastWeek:"[\u0a2a\u0a3f\u0a1b\u0a32\u0a47] dddd, LT",sameElse:"L"},relativeTime:{future:"%s \u0a35\u0a3f\u0a71\u0a1a",past:"%s \u0a2a\u0a3f\u0a1b\u0a32\u0a47",s:"\u0a15\u0a41\u0a1d \u0a38\u0a15\u0a3f\u0a70\u0a1f",ss:"%d \u0a38\u0a15\u0a3f\u0a70\u0a1f",m:"\u0a07\u0a15 \u0a2e\u0a3f\u0a70\u0a1f",mm:"%d \u0a2e\u0a3f\u0a70\u0a1f",h:"\u0a07\u0a71\u0a15 \u0a18\u0a70\u0a1f\u0a3e",hh:"%d \u0a18\u0a70\u0a1f\u0a47",d:"\u0a07\u0a71\u0a15 \u0a26\u0a3f\u0a28",dd:"%d \u0a26\u0a3f\u0a28",M:"\u0a07\u0a71\u0a15 \u0a2e\u0a39\u0a40\u0a28\u0a3e",MM:"%d \u0a2e\u0a39\u0a40\u0a28\u0a47",y:"\u0a07\u0a71\u0a15 \u0a38\u0a3e\u0a32",yy:"%d \u0a38\u0a3e\u0a32"},preparse:function(e){return e.replace(/[\u0a67\u0a68\u0a69\u0a6a\u0a6b\u0a6c\u0a6d\u0a6e\u0a6f\u0a66]/g,function(p){return f[p]})},postformat:function(e){return e.replace(/\d/g,function(p){return a[p]})},meridiemParse:/\u0a30\u0a3e\u0a24|\u0a38\u0a35\u0a47\u0a30|\u0a26\u0a41\u0a2a\u0a39\u0a3f\u0a30|\u0a38\u0a3c\u0a3e\u0a2e/,meridiemHour:function(e,p){return 12===e&&(e=0),"\u0a30\u0a3e\u0a24"===p?e<4?e:e+12:"\u0a38\u0a35\u0a47\u0a30"===p?e:"\u0a26\u0a41\u0a2a\u0a39\u0a3f\u0a30"===p?e>=10?e:e+12:"\u0a38\u0a3c\u0a3e\u0a2e"===p?e+12:void 0},meridiem:function(e,p,y){return e<4?"\u0a30\u0a3e\u0a24":e<10?"\u0a38\u0a35\u0a47\u0a30":e<17?"\u0a26\u0a41\u0a2a\u0a39\u0a3f\u0a30":e<20?"\u0a38\u0a3c\u0a3e\u0a2e":"\u0a30\u0a3e\u0a24"},week:{dow:0,doy:6}})}(i(16738))},78444:function(m,S,i){!function(r){"use strict";var a="stycze\u0144_luty_marzec_kwiecie\u0144_maj_czerwiec_lipiec_sierpie\u0144_wrzesie\u0144_pa\u017adziernik_listopad_grudzie\u0144".split("_"),f="stycznia_lutego_marca_kwietnia_maja_czerwca_lipca_sierpnia_wrze\u015bnia_pa\u017adziernika_listopada_grudnia".split("_"),c=[/^sty/i,/^lut/i,/^mar/i,/^kwi/i,/^maj/i,/^cze/i,/^lip/i,/^sie/i,/^wrz/i,/^pa\u017a/i,/^lis/i,/^gru/i];function e(T){return T%10<5&&T%10>1&&~~(T/10)%10!=1}function p(T,C,R){var L=T+" ";switch(R){case"ss":return L+(e(T)?"sekundy":"sekund");case"m":return C?"minuta":"minut\u0119";case"mm":return L+(e(T)?"minuty":"minut");case"h":return C?"godzina":"godzin\u0119";case"hh":return L+(e(T)?"godziny":"godzin");case"ww":return L+(e(T)?"tygodnie":"tygodni");case"MM":return L+(e(T)?"miesi\u0105ce":"miesi\u0119cy");case"yy":return L+(e(T)?"lata":"lat")}}r.defineLocale("pl",{months:function(T,C){return T?/D MMMM/.test(C)?f[T.month()]:a[T.month()]:a},monthsShort:"sty_lut_mar_kwi_maj_cze_lip_sie_wrz_pa\u017a_lis_gru".split("_"),monthsParse:c,longMonthsParse:c,shortMonthsParse:c,weekdays:"niedziela_poniedzia\u0142ek_wtorek_\u015broda_czwartek_pi\u0105tek_sobota".split("_"),weekdaysShort:"ndz_pon_wt_\u015br_czw_pt_sob".split("_"),weekdaysMin:"Nd_Pn_Wt_\u015ar_Cz_Pt_So".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD.MM.YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd, D MMMM YYYY HH:mm"},calendar:{sameDay:"[Dzi\u015b o] LT",nextDay:"[Jutro o] LT",nextWeek:function(){switch(this.day()){case 0:return"[W niedziel\u0119 o] LT";case 2:return"[We wtorek o] LT";case 3:return"[W \u015brod\u0119 o] LT";case 6:return"[W sobot\u0119 o] LT";default:return"[W] dddd [o] LT"}},lastDay:"[Wczoraj o] LT",lastWeek:function(){switch(this.day()){case 0:return"[W zesz\u0142\u0105 niedziel\u0119 o] LT";case 3:return"[W zesz\u0142\u0105 \u015brod\u0119 o] LT";case 6:return"[W zesz\u0142\u0105 sobot\u0119 o] LT";default:return"[W zesz\u0142y] dddd [o] LT"}},sameElse:"L"},relativeTime:{future:"za %s",past:"%s temu",s:"kilka sekund",ss:p,m:p,mm:p,h:p,hh:p,d:"1 dzie\u0144",dd:"%d dni",w:"tydzie\u0144",ww:p,M:"miesi\u0105c",MM:p,y:"rok",yy:p},dayOfMonthOrdinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:4}})}(i(16738))},66117:function(m,S,i){!function(r){"use strict";r.defineLocale("pt-br",{months:"janeiro_fevereiro_mar\xe7o_abril_maio_junho_julho_agosto_setembro_outubro_novembro_dezembro".split("_"),monthsShort:"jan_fev_mar_abr_mai_jun_jul_ago_set_out_nov_dez".split("_"),weekdays:"domingo_segunda-feira_ter\xe7a-feira_quarta-feira_quinta-feira_sexta-feira_s\xe1bado".split("_"),weekdaysShort:"dom_seg_ter_qua_qui_sex_s\xe1b".split("_"),weekdaysMin:"do_2\xaa_3\xaa_4\xaa_5\xaa_6\xaa_s\xe1".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D [de] MMMM [de] YYYY",LLL:"D [de] MMMM [de] YYYY [\xe0s] HH:mm",LLLL:"dddd, D [de] MMMM [de] YYYY [\xe0s] HH:mm"},calendar:{sameDay:"[Hoje \xe0s] LT",nextDay:"[Amanh\xe3 \xe0s] LT",nextWeek:"dddd [\xe0s] LT",lastDay:"[Ontem \xe0s] LT",lastWeek:function(){return 0===this.day()||6===this.day()?"[\xdaltimo] dddd [\xe0s] LT":"[\xdaltima] dddd [\xe0s] LT"},sameElse:"L"},relativeTime:{future:"em %s",past:"h\xe1 %s",s:"poucos segundos",ss:"%d segundos",m:"um minuto",mm:"%d minutos",h:"uma hora",hh:"%d horas",d:"um dia",dd:"%d dias",M:"um m\xeas",MM:"%d meses",y:"um ano",yy:"%d anos"},dayOfMonthOrdinalParse:/\d{1,2}\xba/,ordinal:"%d\xba",invalidDate:"Data inv\xe1lida"})}(i(16738))},53170:function(m,S,i){!function(r){"use strict";r.defineLocale("pt",{months:"janeiro_fevereiro_mar\xe7o_abril_maio_junho_julho_agosto_setembro_outubro_novembro_dezembro".split("_"),monthsShort:"jan_fev_mar_abr_mai_jun_jul_ago_set_out_nov_dez".split("_"),weekdays:"Domingo_Segunda-feira_Ter\xe7a-feira_Quarta-feira_Quinta-feira_Sexta-feira_S\xe1bado".split("_"),weekdaysShort:"Dom_Seg_Ter_Qua_Qui_Sex_S\xe1b".split("_"),weekdaysMin:"Do_2\xaa_3\xaa_4\xaa_5\xaa_6\xaa_S\xe1".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D [de] MMMM [de] YYYY",LLL:"D [de] MMMM [de] YYYY HH:mm",LLLL:"dddd, D [de] MMMM [de] YYYY HH:mm"},calendar:{sameDay:"[Hoje \xe0s] LT",nextDay:"[Amanh\xe3 \xe0s] LT",nextWeek:"dddd [\xe0s] LT",lastDay:"[Ontem \xe0s] LT",lastWeek:function(){return 0===this.day()||6===this.day()?"[\xdaltimo] dddd [\xe0s] LT":"[\xdaltima] dddd [\xe0s] LT"},sameElse:"L"},relativeTime:{future:"em %s",past:"h\xe1 %s",s:"segundos",ss:"%d segundos",m:"um minuto",mm:"%d minutos",h:"uma hora",hh:"%d horas",d:"um dia",dd:"%d dias",w:"uma semana",ww:"%d semanas",M:"um m\xeas",MM:"%d meses",y:"um ano",yy:"%d anos"},dayOfMonthOrdinalParse:/\d{1,2}\xba/,ordinal:"%d\xba",week:{dow:1,doy:4}})}(i(16738))},96587:function(m,S,i){!function(r){"use strict";function a(c,e,p){var T=" ";return(c%100>=20||c>=100&&c%100==0)&&(T=" de "),c+T+{ss:"secunde",mm:"minute",hh:"ore",dd:"zile",ww:"s\u0103pt\u0103m\xe2ni",MM:"luni",yy:"ani"}[p]}r.defineLocale("ro",{months:"ianuarie_februarie_martie_aprilie_mai_iunie_iulie_august_septembrie_octombrie_noiembrie_decembrie".split("_"),monthsShort:"ian._feb._mart._apr._mai_iun._iul._aug._sept._oct._nov._dec.".split("_"),monthsParseExact:!0,weekdays:"duminic\u0103_luni_mar\u021bi_miercuri_joi_vineri_s\xe2mb\u0103t\u0103".split("_"),weekdaysShort:"Dum_Lun_Mar_Mie_Joi_Vin_S\xe2m".split("_"),weekdaysMin:"Du_Lu_Ma_Mi_Jo_Vi_S\xe2".split("_"),longDateFormat:{LT:"H:mm",LTS:"H:mm:ss",L:"DD.MM.YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY H:mm",LLLL:"dddd, D MMMM YYYY H:mm"},calendar:{sameDay:"[azi la] LT",nextDay:"[m\xe2ine la] LT",nextWeek:"dddd [la] LT",lastDay:"[ieri la] LT",lastWeek:"[fosta] dddd [la] LT",sameElse:"L"},relativeTime:{future:"peste %s",past:"%s \xeen urm\u0103",s:"c\xe2teva secunde",ss:a,m:"un minut",mm:a,h:"o or\u0103",hh:a,d:"o zi",dd:a,w:"o s\u0103pt\u0103m\xe2n\u0103",ww:a,M:"o lun\u0103",MM:a,y:"un an",yy:a},week:{dow:1,doy:7}})}(i(16738))},39264:function(m,S,i){!function(r){"use strict";function f(p,y,T){return"m"===T?y?"\u043c\u0438\u043d\u0443\u0442\u0430":"\u043c\u0438\u043d\u0443\u0442\u0443":p+" "+function a(p,y){var T=p.split("_");return y%10==1&&y%100!=11?T[0]:y%10>=2&&y%10<=4&&(y%100<10||y%100>=20)?T[1]:T[2]}({ss:y?"\u0441\u0435\u043a\u0443\u043d\u0434\u0430_\u0441\u0435\u043a\u0443\u043d\u0434\u044b_\u0441\u0435\u043a\u0443\u043d\u0434":"\u0441\u0435\u043a\u0443\u043d\u0434\u0443_\u0441\u0435\u043a\u0443\u043d\u0434\u044b_\u0441\u0435\u043a\u0443\u043d\u0434",mm:y?"\u043c\u0438\u043d\u0443\u0442\u0430_\u043c\u0438\u043d\u0443\u0442\u044b_\u043c\u0438\u043d\u0443\u0442":"\u043c\u0438\u043d\u0443\u0442\u0443_\u043c\u0438\u043d\u0443\u0442\u044b_\u043c\u0438\u043d\u0443\u0442",hh:"\u0447\u0430\u0441_\u0447\u0430\u0441\u0430_\u0447\u0430\u0441\u043e\u0432",dd:"\u0434\u0435\u043d\u044c_\u0434\u043d\u044f_\u0434\u043d\u0435\u0439",ww:"\u043d\u0435\u0434\u0435\u043b\u044f_\u043d\u0435\u0434\u0435\u043b\u0438_\u043d\u0435\u0434\u0435\u043b\u044c",MM:"\u043c\u0435\u0441\u044f\u0446_\u043c\u0435\u0441\u044f\u0446\u0430_\u043c\u0435\u0441\u044f\u0446\u0435\u0432",yy:"\u0433\u043e\u0434_\u0433\u043e\u0434\u0430_\u043b\u0435\u0442"}[T],+p)}var c=[/^\u044f\u043d\u0432/i,/^\u0444\u0435\u0432/i,/^\u043c\u0430\u0440/i,/^\u0430\u043f\u0440/i,/^\u043c\u0430[\u0439\u044f]/i,/^\u0438\u044e\u043d/i,/^\u0438\u044e\u043b/i,/^\u0430\u0432\u0433/i,/^\u0441\u0435\u043d/i,/^\u043e\u043a\u0442/i,/^\u043d\u043e\u044f/i,/^\u0434\u0435\u043a/i];r.defineLocale("ru",{months:{format:"\u044f\u043d\u0432\u0430\u0440\u044f_\u0444\u0435\u0432\u0440\u0430\u043b\u044f_\u043c\u0430\u0440\u0442\u0430_\u0430\u043f\u0440\u0435\u043b\u044f_\u043c\u0430\u044f_\u0438\u044e\u043d\u044f_\u0438\u044e\u043b\u044f_\u0430\u0432\u0433\u0443\u0441\u0442\u0430_\u0441\u0435\u043d\u0442\u044f\u0431\u0440\u044f_\u043e\u043a\u0442\u044f\u0431\u0440\u044f_\u043d\u043e\u044f\u0431\u0440\u044f_\u0434\u0435\u043a\u0430\u0431\u0440\u044f".split("_"),standalone:"\u044f\u043d\u0432\u0430\u0440\u044c_\u0444\u0435\u0432\u0440\u0430\u043b\u044c_\u043c\u0430\u0440\u0442_\u0430\u043f\u0440\u0435\u043b\u044c_\u043c\u0430\u0439_\u0438\u044e\u043d\u044c_\u0438\u044e\u043b\u044c_\u0430\u0432\u0433\u0443\u0441\u0442_\u0441\u0435\u043d\u0442\u044f\u0431\u0440\u044c_\u043e\u043a\u0442\u044f\u0431\u0440\u044c_\u043d\u043e\u044f\u0431\u0440\u044c_\u0434\u0435\u043a\u0430\u0431\u0440\u044c".split("_")},monthsShort:{format:"\u044f\u043d\u0432._\u0444\u0435\u0432\u0440._\u043c\u0430\u0440._\u0430\u043f\u0440._\u043c\u0430\u044f_\u0438\u044e\u043d\u044f_\u0438\u044e\u043b\u044f_\u0430\u0432\u0433._\u0441\u0435\u043d\u0442._\u043e\u043a\u0442._\u043d\u043e\u044f\u0431._\u0434\u0435\u043a.".split("_"),standalone:"\u044f\u043d\u0432._\u0444\u0435\u0432\u0440._\u043c\u0430\u0440\u0442_\u0430\u043f\u0440._\u043c\u0430\u0439_\u0438\u044e\u043d\u044c_\u0438\u044e\u043b\u044c_\u0430\u0432\u0433._\u0441\u0435\u043d\u0442._\u043e\u043a\u0442._\u043d\u043e\u044f\u0431._\u0434\u0435\u043a.".split("_")},weekdays:{standalone:"\u0432\u043e\u0441\u043a\u0440\u0435\u0441\u0435\u043d\u044c\u0435_\u043f\u043e\u043d\u0435\u0434\u0435\u043b\u044c\u043d\u0438\u043a_\u0432\u0442\u043e\u0440\u043d\u0438\u043a_\u0441\u0440\u0435\u0434\u0430_\u0447\u0435\u0442\u0432\u0435\u0440\u0433_\u043f\u044f\u0442\u043d\u0438\u0446\u0430_\u0441\u0443\u0431\u0431\u043e\u0442\u0430".split("_"),format:"\u0432\u043e\u0441\u043a\u0440\u0435\u0441\u0435\u043d\u044c\u0435_\u043f\u043e\u043d\u0435\u0434\u0435\u043b\u044c\u043d\u0438\u043a_\u0432\u0442\u043e\u0440\u043d\u0438\u043a_\u0441\u0440\u0435\u0434\u0443_\u0447\u0435\u0442\u0432\u0435\u0440\u0433_\u043f\u044f\u0442\u043d\u0438\u0446\u0443_\u0441\u0443\u0431\u0431\u043e\u0442\u0443".split("_"),isFormat:/\[ ?[\u0412\u0432] ?(?:\u043f\u0440\u043e\u0448\u043b\u0443\u044e|\u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0443\u044e|\u044d\u0442\u0443)? ?] ?dddd/},weekdaysShort:"\u0432\u0441_\u043f\u043d_\u0432\u0442_\u0441\u0440_\u0447\u0442_\u043f\u0442_\u0441\u0431".split("_"),weekdaysMin:"\u0432\u0441_\u043f\u043d_\u0432\u0442_\u0441\u0440_\u0447\u0442_\u043f\u0442_\u0441\u0431".split("_"),monthsParse:c,longMonthsParse:c,shortMonthsParse:c,monthsRegex:/^(\u044f\u043d\u0432\u0430\u0440[\u044c\u044f]|\u044f\u043d\u0432\.?|\u0444\u0435\u0432\u0440\u0430\u043b[\u044c\u044f]|\u0444\u0435\u0432\u0440?\.?|\u043c\u0430\u0440\u0442\u0430?|\u043c\u0430\u0440\.?|\u0430\u043f\u0440\u0435\u043b[\u044c\u044f]|\u0430\u043f\u0440\.?|\u043c\u0430[\u0439\u044f]|\u0438\u044e\u043d[\u044c\u044f]|\u0438\u044e\u043d\.?|\u0438\u044e\u043b[\u044c\u044f]|\u0438\u044e\u043b\.?|\u0430\u0432\u0433\u0443\u0441\u0442\u0430?|\u0430\u0432\u0433\.?|\u0441\u0435\u043d\u0442\u044f\u0431\u0440[\u044c\u044f]|\u0441\u0435\u043d\u0442?\.?|\u043e\u043a\u0442\u044f\u0431\u0440[\u044c\u044f]|\u043e\u043a\u0442\.?|\u043d\u043e\u044f\u0431\u0440[\u044c\u044f]|\u043d\u043e\u044f\u0431?\.?|\u0434\u0435\u043a\u0430\u0431\u0440[\u044c\u044f]|\u0434\u0435\u043a\.?)/i,monthsShortRegex:/^(\u044f\u043d\u0432\u0430\u0440[\u044c\u044f]|\u044f\u043d\u0432\.?|\u0444\u0435\u0432\u0440\u0430\u043b[\u044c\u044f]|\u0444\u0435\u0432\u0440?\.?|\u043c\u0430\u0440\u0442\u0430?|\u043c\u0430\u0440\.?|\u0430\u043f\u0440\u0435\u043b[\u044c\u044f]|\u0430\u043f\u0440\.?|\u043c\u0430[\u0439\u044f]|\u0438\u044e\u043d[\u044c\u044f]|\u0438\u044e\u043d\.?|\u0438\u044e\u043b[\u044c\u044f]|\u0438\u044e\u043b\.?|\u0430\u0432\u0433\u0443\u0441\u0442\u0430?|\u0430\u0432\u0433\.?|\u0441\u0435\u043d\u0442\u044f\u0431\u0440[\u044c\u044f]|\u0441\u0435\u043d\u0442?\.?|\u043e\u043a\u0442\u044f\u0431\u0440[\u044c\u044f]|\u043e\u043a\u0442\.?|\u043d\u043e\u044f\u0431\u0440[\u044c\u044f]|\u043d\u043e\u044f\u0431?\.?|\u0434\u0435\u043a\u0430\u0431\u0440[\u044c\u044f]|\u0434\u0435\u043a\.?)/i,monthsStrictRegex:/^(\u044f\u043d\u0432\u0430\u0440[\u044f\u044c]|\u0444\u0435\u0432\u0440\u0430\u043b[\u044f\u044c]|\u043c\u0430\u0440\u0442\u0430?|\u0430\u043f\u0440\u0435\u043b[\u044f\u044c]|\u043c\u0430[\u044f\u0439]|\u0438\u044e\u043d[\u044f\u044c]|\u0438\u044e\u043b[\u044f\u044c]|\u0430\u0432\u0433\u0443\u0441\u0442\u0430?|\u0441\u0435\u043d\u0442\u044f\u0431\u0440[\u044f\u044c]|\u043e\u043a\u0442\u044f\u0431\u0440[\u044f\u044c]|\u043d\u043e\u044f\u0431\u0440[\u044f\u044c]|\u0434\u0435\u043a\u0430\u0431\u0440[\u044f\u044c])/i,monthsShortStrictRegex:/^(\u044f\u043d\u0432\.|\u0444\u0435\u0432\u0440?\.|\u043c\u0430\u0440[\u0442.]|\u0430\u043f\u0440\.|\u043c\u0430[\u044f\u0439]|\u0438\u044e\u043d[\u044c\u044f.]|\u0438\u044e\u043b[\u044c\u044f.]|\u0430\u0432\u0433\.|\u0441\u0435\u043d\u0442?\.|\u043e\u043a\u0442\.|\u043d\u043e\u044f\u0431?\.|\u0434\u0435\u043a\.)/i,longDateFormat:{LT:"H:mm",LTS:"H:mm:ss",L:"DD.MM.YYYY",LL:"D MMMM YYYY \u0433.",LLL:"D MMMM YYYY \u0433., H:mm",LLLL:"dddd, D MMMM YYYY \u0433., H:mm"},calendar:{sameDay:"[\u0421\u0435\u0433\u043e\u0434\u043d\u044f, \u0432] LT",nextDay:"[\u0417\u0430\u0432\u0442\u0440\u0430, \u0432] LT",lastDay:"[\u0412\u0447\u0435\u0440\u0430, \u0432] LT",nextWeek:function(p){if(p.week()===this.week())return 2===this.day()?"[\u0412\u043e] dddd, [\u0432] LT":"[\u0412] dddd, [\u0432] LT";switch(this.day()){case 0:return"[\u0412 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0435] dddd, [\u0432] LT";case 1:case 2:case 4:return"[\u0412 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439] dddd, [\u0432] LT";case 3:case 5:case 6:return"[\u0412 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0443\u044e] dddd, [\u0432] LT"}},lastWeek:function(p){if(p.week()===this.week())return 2===this.day()?"[\u0412\u043e] dddd, [\u0432] LT":"[\u0412] dddd, [\u0432] LT";switch(this.day()){case 0:return"[\u0412 \u043f\u0440\u043e\u0448\u043b\u043e\u0435] dddd, [\u0432] LT";case 1:case 2:case 4:return"[\u0412 \u043f\u0440\u043e\u0448\u043b\u044b\u0439] dddd, [\u0432] LT";case 3:case 5:case 6:return"[\u0412 \u043f\u0440\u043e\u0448\u043b\u0443\u044e] dddd, [\u0432] LT"}},sameElse:"L"},relativeTime:{future:"\u0447\u0435\u0440\u0435\u0437 %s",past:"%s \u043d\u0430\u0437\u0430\u0434",s:"\u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0441\u0435\u043a\u0443\u043d\u0434",ss:f,m:f,mm:f,h:"\u0447\u0430\u0441",hh:f,d:"\u0434\u0435\u043d\u044c",dd:f,w:"\u043d\u0435\u0434\u0435\u043b\u044f",ww:f,M:"\u043c\u0435\u0441\u044f\u0446",MM:f,y:"\u0433\u043e\u0434",yy:f},meridiemParse:/\u043d\u043e\u0447\u0438|\u0443\u0442\u0440\u0430|\u0434\u043d\u044f|\u0432\u0435\u0447\u0435\u0440\u0430/i,isPM:function(p){return/^(\u0434\u043d\u044f|\u0432\u0435\u0447\u0435\u0440\u0430)$/.test(p)},meridiem:function(p,y,T){return p<4?"\u043d\u043e\u0447\u0438":p<12?"\u0443\u0442\u0440\u0430":p<17?"\u0434\u043d\u044f":"\u0432\u0435\u0447\u0435\u0440\u0430"},dayOfMonthOrdinalParse:/\d{1,2}-(\u0439|\u0433\u043e|\u044f)/,ordinal:function(p,y){switch(y){case"M":case"d":case"DDD":return p+"-\u0439";case"D":return p+"-\u0433\u043e";case"w":case"W":return p+"-\u044f";default:return p}},week:{dow:1,doy:4}})}(i(16738))},42135:function(m,S,i){!function(r){"use strict";var a=["\u062c\u0646\u0648\u0631\u064a","\u0641\u064a\u0628\u0631\u0648\u0631\u064a","\u0645\u0627\u0631\u0686","\u0627\u067e\u0631\u064a\u0644","\u0645\u0626\u064a","\u062c\u0648\u0646","\u062c\u0648\u0644\u0627\u0621\u0650","\u0622\u06af\u0633\u067d","\u0633\u064a\u067e\u067d\u0645\u0628\u0631","\u0622\u06aa\u067d\u0648\u0628\u0631","\u0646\u0648\u0645\u0628\u0631","\u068a\u0633\u0645\u0628\u0631"],f=["\u0622\u0686\u0631","\u0633\u0648\u0645\u0631","\u0627\u06b1\u0627\u0631\u0648","\u0627\u0631\u0628\u0639","\u062e\u0645\u064a\u0633","\u062c\u0645\u0639","\u0687\u0646\u0687\u0631"];r.defineLocale("sd",{months:a,monthsShort:a,weekdays:f,weekdaysShort:f,weekdaysMin:f,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd\u060c D MMMM YYYY HH:mm"},meridiemParse:/\u0635\u0628\u062d|\u0634\u0627\u0645/,isPM:function(e){return"\u0634\u0627\u0645"===e},meridiem:function(e,p,y){return e<12?"\u0635\u0628\u062d":"\u0634\u0627\u0645"},calendar:{sameDay:"[\u0627\u0684] LT",nextDay:"[\u0633\u0680\u0627\u06bb\u064a] LT",nextWeek:"dddd [\u0627\u06b3\u064a\u0646 \u0647\u0641\u062a\u064a \u062a\u064a] LT",lastDay:"[\u06aa\u0627\u0644\u0647\u0647] LT",lastWeek:"[\u06af\u0632\u0631\u064a\u0644 \u0647\u0641\u062a\u064a] dddd [\u062a\u064a] LT",sameElse:"L"},relativeTime:{future:"%s \u067e\u0648\u0621",past:"%s \u0627\u06b3",s:"\u0686\u0646\u062f \u0633\u064a\u06aa\u0646\u068a",ss:"%d \u0633\u064a\u06aa\u0646\u068a",m:"\u0647\u06aa \u0645\u0646\u067d",mm:"%d \u0645\u0646\u067d",h:"\u0647\u06aa \u06aa\u0644\u0627\u06aa",hh:"%d \u06aa\u0644\u0627\u06aa",d:"\u0647\u06aa \u068f\u064a\u0646\u0647\u0646",dd:"%d \u068f\u064a\u0646\u0647\u0646",M:"\u0647\u06aa \u0645\u0647\u064a\u0646\u0648",MM:"%d \u0645\u0647\u064a\u0646\u0627",y:"\u0647\u06aa \u0633\u0627\u0644",yy:"%d \u0633\u0627\u0644"},preparse:function(e){return e.replace(/\u060c/g,",")},postformat:function(e){return e.replace(/,/g,"\u060c")},week:{dow:1,doy:4}})}(i(16738))},95366:function(m,S,i){!function(r){"use strict";r.defineLocale("se",{months:"o\u0111\u0111ajagem\xe1nnu_guovvam\xe1nnu_njuk\u010dam\xe1nnu_cuo\u014bom\xe1nnu_miessem\xe1nnu_geassem\xe1nnu_suoidnem\xe1nnu_borgem\xe1nnu_\u010dak\u010dam\xe1nnu_golggotm\xe1nnu_sk\xe1bmam\xe1nnu_juovlam\xe1nnu".split("_"),monthsShort:"o\u0111\u0111j_guov_njuk_cuo_mies_geas_suoi_borg_\u010dak\u010d_golg_sk\xe1b_juov".split("_"),weekdays:"sotnabeaivi_vuoss\xe1rga_ma\u014b\u014beb\xe1rga_gaskavahkku_duorastat_bearjadat_l\xe1vvardat".split("_"),weekdaysShort:"sotn_vuos_ma\u014b_gask_duor_bear_l\xe1v".split("_"),weekdaysMin:"s_v_m_g_d_b_L".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD.MM.YYYY",LL:"MMMM D. [b.] YYYY",LLL:"MMMM D. [b.] YYYY [ti.] HH:mm",LLLL:"dddd, MMMM D. [b.] YYYY [ti.] HH:mm"},calendar:{sameDay:"[otne ti] LT",nextDay:"[ihttin ti] LT",nextWeek:"dddd [ti] LT",lastDay:"[ikte ti] LT",lastWeek:"[ovddit] dddd [ti] LT",sameElse:"L"},relativeTime:{future:"%s gea\u017ees",past:"ma\u014bit %s",s:"moadde sekunddat",ss:"%d sekunddat",m:"okta minuhta",mm:"%d minuhtat",h:"okta diimmu",hh:"%d diimmut",d:"okta beaivi",dd:"%d beaivvit",M:"okta m\xe1nnu",MM:"%d m\xe1nut",y:"okta jahki",yy:"%d jagit"},dayOfMonthOrdinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:4}})}(i(16738))},93379:function(m,S,i){!function(r){"use strict";r.defineLocale("si",{months:"\u0da2\u0db1\u0dc0\u0dcf\u0dbb\u0dd2_\u0db4\u0dd9\u0db6\u0dbb\u0dc0\u0dcf\u0dbb\u0dd2_\u0db8\u0dcf\u0dbb\u0dca\u0dad\u0dd4_\u0d85\u0db4\u0dca\u200d\u0dbb\u0dda\u0dbd\u0dca_\u0db8\u0dd0\u0dba\u0dd2_\u0da2\u0dd6\u0db1\u0dd2_\u0da2\u0dd6\u0dbd\u0dd2_\u0d85\u0d9c\u0ddd\u0dc3\u0dca\u0dad\u0dd4_\u0dc3\u0dd0\u0db4\u0dca\u0dad\u0dd0\u0db8\u0dca\u0db6\u0dbb\u0dca_\u0d94\u0d9a\u0dca\u0dad\u0ddd\u0db6\u0dbb\u0dca_\u0db1\u0ddc\u0dc0\u0dd0\u0db8\u0dca\u0db6\u0dbb\u0dca_\u0daf\u0dd9\u0dc3\u0dd0\u0db8\u0dca\u0db6\u0dbb\u0dca".split("_"),monthsShort:"\u0da2\u0db1_\u0db4\u0dd9\u0db6_\u0db8\u0dcf\u0dbb\u0dca_\u0d85\u0db4\u0dca_\u0db8\u0dd0\u0dba\u0dd2_\u0da2\u0dd6\u0db1\u0dd2_\u0da2\u0dd6\u0dbd\u0dd2_\u0d85\u0d9c\u0ddd_\u0dc3\u0dd0\u0db4\u0dca_\u0d94\u0d9a\u0dca_\u0db1\u0ddc\u0dc0\u0dd0_\u0daf\u0dd9\u0dc3\u0dd0".split("_"),weekdays:"\u0d89\u0dbb\u0dd2\u0daf\u0dcf_\u0dc3\u0db3\u0dd4\u0daf\u0dcf_\u0d85\u0d9f\u0dc4\u0dbb\u0dd4\u0dc0\u0dcf\u0daf\u0dcf_\u0db6\u0daf\u0dcf\u0daf\u0dcf_\u0db6\u0dca\u200d\u0dbb\u0dc4\u0dc3\u0dca\u0db4\u0dad\u0dd2\u0db1\u0dca\u0daf\u0dcf_\u0dc3\u0dd2\u0d9a\u0dd4\u0dbb\u0dcf\u0daf\u0dcf_\u0dc3\u0dd9\u0db1\u0dc3\u0dd4\u0dbb\u0dcf\u0daf\u0dcf".split("_"),weekdaysShort:"\u0d89\u0dbb\u0dd2_\u0dc3\u0db3\u0dd4_\u0d85\u0d9f_\u0db6\u0daf\u0dcf_\u0db6\u0dca\u200d\u0dbb\u0dc4_\u0dc3\u0dd2\u0d9a\u0dd4_\u0dc3\u0dd9\u0db1".split("_"),weekdaysMin:"\u0d89_\u0dc3_\u0d85_\u0db6_\u0db6\u0dca\u200d\u0dbb_\u0dc3\u0dd2_\u0dc3\u0dd9".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"a h:mm",LTS:"a h:mm:ss",L:"YYYY/MM/DD",LL:"YYYY MMMM D",LLL:"YYYY MMMM D, a h:mm",LLLL:"YYYY MMMM D [\u0dc0\u0dd0\u0db1\u0dd2] dddd, a h:mm:ss"},calendar:{sameDay:"[\u0d85\u0daf] LT[\u0da7]",nextDay:"[\u0dc4\u0dd9\u0da7] LT[\u0da7]",nextWeek:"dddd LT[\u0da7]",lastDay:"[\u0d8a\u0dba\u0dda] LT[\u0da7]",lastWeek:"[\u0db4\u0dc3\u0dd4\u0d9c\u0dd2\u0dba] dddd LT[\u0da7]",sameElse:"L"},relativeTime:{future:"%s\u0d9a\u0dd2\u0db1\u0dca",past:"%s\u0d9a\u0da7 \u0db4\u0dd9\u0dbb",s:"\u0dad\u0dad\u0dca\u0db4\u0dbb \u0d9a\u0dd2\u0dc4\u0dd2\u0db4\u0dba",ss:"\u0dad\u0dad\u0dca\u0db4\u0dbb %d",m:"\u0db8\u0dd2\u0db1\u0dd2\u0dad\u0dca\u0dad\u0dd4\u0dc0",mm:"\u0db8\u0dd2\u0db1\u0dd2\u0dad\u0dca\u0dad\u0dd4 %d",h:"\u0db4\u0dd0\u0dba",hh:"\u0db4\u0dd0\u0dba %d",d:"\u0daf\u0dd2\u0db1\u0dba",dd:"\u0daf\u0dd2\u0db1 %d",M:"\u0db8\u0dcf\u0dc3\u0dba",MM:"\u0db8\u0dcf\u0dc3 %d",y:"\u0dc0\u0dc3\u0dbb",yy:"\u0dc0\u0dc3\u0dbb %d"},dayOfMonthOrdinalParse:/\d{1,2} \u0dc0\u0dd0\u0db1\u0dd2/,ordinal:function(f){return f+" \u0dc0\u0dd0\u0db1\u0dd2"},meridiemParse:/\u0db4\u0dd9\u0dbb \u0dc0\u0dbb\u0dd4|\u0db4\u0dc3\u0dca \u0dc0\u0dbb\u0dd4|\u0db4\u0dd9.\u0dc0|\u0db4.\u0dc0./,isPM:function(f){return"\u0db4.\u0dc0."===f||"\u0db4\u0dc3\u0dca \u0dc0\u0dbb\u0dd4"===f},meridiem:function(f,c,e){return f>11?e?"\u0db4.\u0dc0.":"\u0db4\u0dc3\u0dca \u0dc0\u0dbb\u0dd4":e?"\u0db4\u0dd9.\u0dc0.":"\u0db4\u0dd9\u0dbb \u0dc0\u0dbb\u0dd4"}})}(i(16738))},46143:function(m,S,i){!function(r){"use strict";var a="janu\xe1r_febru\xe1r_marec_apr\xedl_m\xe1j_j\xfan_j\xfal_august_september_okt\xf3ber_november_december".split("_"),f="jan_feb_mar_apr_m\xe1j_j\xfan_j\xfal_aug_sep_okt_nov_dec".split("_");function c(y){return y>1&&y<5}function e(y,T,C,R){var L=y+" ";switch(C){case"s":return T||R?"p\xe1r sek\xfand":"p\xe1r sekundami";case"ss":return T||R?L+(c(y)?"sekundy":"sek\xfand"):L+"sekundami";case"m":return T?"min\xfata":R?"min\xfatu":"min\xfatou";case"mm":return T||R?L+(c(y)?"min\xfaty":"min\xfat"):L+"min\xfatami";case"h":return T?"hodina":R?"hodinu":"hodinou";case"hh":return T||R?L+(c(y)?"hodiny":"hod\xedn"):L+"hodinami";case"d":return T||R?"de\u0148":"d\u0148om";case"dd":return T||R?L+(c(y)?"dni":"dn\xed"):L+"d\u0148ami";case"M":return T||R?"mesiac":"mesiacom";case"MM":return T||R?L+(c(y)?"mesiace":"mesiacov"):L+"mesiacmi";case"y":return T||R?"rok":"rokom";case"yy":return T||R?L+(c(y)?"roky":"rokov"):L+"rokmi"}}r.defineLocale("sk",{months:a,monthsShort:f,weekdays:"nede\u013ea_pondelok_utorok_streda_\u0161tvrtok_piatok_sobota".split("_"),weekdaysShort:"ne_po_ut_st_\u0161t_pi_so".split("_"),weekdaysMin:"ne_po_ut_st_\u0161t_pi_so".split("_"),longDateFormat:{LT:"H:mm",LTS:"H:mm:ss",L:"DD.MM.YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY H:mm",LLLL:"dddd D. MMMM YYYY H:mm"},calendar:{sameDay:"[dnes o] LT",nextDay:"[zajtra o] LT",nextWeek:function(){switch(this.day()){case 0:return"[v nede\u013eu o] LT";case 1:case 2:return"[v] dddd [o] LT";case 3:return"[v stredu o] LT";case 4:return"[vo \u0161tvrtok o] LT";case 5:return"[v piatok o] LT";case 6:return"[v sobotu o] LT"}},lastDay:"[v\u010dera o] LT",lastWeek:function(){switch(this.day()){case 0:return"[minul\xfa nede\u013eu o] LT";case 1:case 2:case 4:case 5:return"[minul\xfd] dddd [o] LT";case 3:return"[minul\xfa stredu o] LT";case 6:return"[minul\xfa sobotu o] LT"}},sameElse:"L"},relativeTime:{future:"za %s",past:"pred %s",s:e,ss:e,m:e,mm:e,h:e,hh:e,d:e,dd:e,M:e,MM:e,y:e,yy:e},dayOfMonthOrdinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:4}})}(i(16738))},196:function(m,S,i){!function(r){"use strict";function a(c,e,p,y){var T=c+" ";switch(p){case"s":return e||y?"nekaj sekund":"nekaj sekundami";case"ss":return T+(1===c?e?"sekundo":"sekundi":2===c?e||y?"sekundi":"sekundah":c<5?e||y?"sekunde":"sekundah":"sekund");case"m":return e?"ena minuta":"eno minuto";case"mm":return T+(1===c?e?"minuta":"minuto":2===c?e||y?"minuti":"minutama":c<5?e||y?"minute":"minutami":e||y?"minut":"minutami");case"h":return e?"ena ura":"eno uro";case"hh":return T+(1===c?e?"ura":"uro":2===c?e||y?"uri":"urama":c<5?e||y?"ure":"urami":e||y?"ur":"urami");case"d":return e||y?"en dan":"enim dnem";case"dd":return T+(1===c?e||y?"dan":"dnem":2===c?e||y?"dni":"dnevoma":e||y?"dni":"dnevi");case"M":return e||y?"en mesec":"enim mesecem";case"MM":return T+(1===c?e||y?"mesec":"mesecem":2===c?e||y?"meseca":"mesecema":c<5?e||y?"mesece":"meseci":e||y?"mesecev":"meseci");case"y":return e||y?"eno leto":"enim letom";case"yy":return T+(1===c?e||y?"leto":"letom":2===c?e||y?"leti":"letoma":c<5?e||y?"leta":"leti":e||y?"let":"leti")}}r.defineLocale("sl",{months:"januar_februar_marec_april_maj_junij_julij_avgust_september_oktober_november_december".split("_"),monthsShort:"jan._feb._mar._apr._maj._jun._jul._avg._sep._okt._nov._dec.".split("_"),monthsParseExact:!0,weekdays:"nedelja_ponedeljek_torek_sreda_\u010detrtek_petek_sobota".split("_"),weekdaysShort:"ned._pon._tor._sre._\u010det._pet._sob.".split("_"),weekdaysMin:"ne_po_to_sr_\u010de_pe_so".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"H:mm",LTS:"H:mm:ss",L:"DD. MM. YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY H:mm",LLLL:"dddd, D. MMMM YYYY H:mm"},calendar:{sameDay:"[danes ob] LT",nextDay:"[jutri ob] LT",nextWeek:function(){switch(this.day()){case 0:return"[v] [nedeljo] [ob] LT";case 3:return"[v] [sredo] [ob] LT";case 6:return"[v] [soboto] [ob] LT";case 1:case 2:case 4:case 5:return"[v] dddd [ob] LT"}},lastDay:"[v\u010deraj ob] LT",lastWeek:function(){switch(this.day()){case 0:return"[prej\u0161njo] [nedeljo] [ob] LT";case 3:return"[prej\u0161njo] [sredo] [ob] LT";case 6:return"[prej\u0161njo] [soboto] [ob] LT";case 1:case 2:case 4:case 5:return"[prej\u0161nji] dddd [ob] LT"}},sameElse:"L"},relativeTime:{future:"\u010dez %s",past:"pred %s",s:a,ss:a,m:a,mm:a,h:a,hh:a,d:a,dd:a,M:a,MM:a,y:a,yy:a},dayOfMonthOrdinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:7}})}(i(16738))},21082:function(m,S,i){!function(r){"use strict";r.defineLocale("sq",{months:"Janar_Shkurt_Mars_Prill_Maj_Qershor_Korrik_Gusht_Shtator_Tetor_N\xebntor_Dhjetor".split("_"),monthsShort:"Jan_Shk_Mar_Pri_Maj_Qer_Kor_Gus_Sht_Tet_N\xebn_Dhj".split("_"),weekdays:"E Diel_E H\xebn\xeb_E Mart\xeb_E M\xebrkur\xeb_E Enjte_E Premte_E Shtun\xeb".split("_"),weekdaysShort:"Die_H\xebn_Mar_M\xebr_Enj_Pre_Sht".split("_"),weekdaysMin:"D_H_Ma_M\xeb_E_P_Sh".split("_"),weekdaysParseExact:!0,meridiemParse:/PD|MD/,isPM:function(f){return"M"===f.charAt(0)},meridiem:function(f,c,e){return f<12?"PD":"MD"},longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd, D MMMM YYYY HH:mm"},calendar:{sameDay:"[Sot n\xeb] LT",nextDay:"[Nes\xebr n\xeb] LT",nextWeek:"dddd [n\xeb] LT",lastDay:"[Dje n\xeb] LT",lastWeek:"dddd [e kaluar n\xeb] LT",sameElse:"L"},relativeTime:{future:"n\xeb %s",past:"%s m\xeb par\xeb",s:"disa sekonda",ss:"%d sekonda",m:"nj\xeb minut\xeb",mm:"%d minuta",h:"nj\xeb or\xeb",hh:"%d or\xeb",d:"nj\xeb dit\xeb",dd:"%d dit\xeb",M:"nj\xeb muaj",MM:"%d muaj",y:"nj\xeb vit",yy:"%d vite"},dayOfMonthOrdinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:4}})}(i(16738))},98963:function(m,S,i){!function(r){"use strict";var a={words:{ss:["\u0441\u0435\u043a\u0443\u043d\u0434\u0430","\u0441\u0435\u043a\u0443\u043d\u0434\u0435","\u0441\u0435\u043a\u0443\u043d\u0434\u0438"],m:["\u0458\u0435\u0434\u0430\u043d \u043c\u0438\u043d\u0443\u0442","\u0458\u0435\u0434\u043d\u043e\u0433 \u043c\u0438\u043d\u0443\u0442\u0430"],mm:["\u043c\u0438\u043d\u0443\u0442","\u043c\u0438\u043d\u0443\u0442\u0430","\u043c\u0438\u043d\u0443\u0442\u0430"],h:["\u0458\u0435\u0434\u0430\u043d \u0441\u0430\u0442","\u0458\u0435\u0434\u043d\u043e\u0433 \u0441\u0430\u0442\u0430"],hh:["\u0441\u0430\u0442","\u0441\u0430\u0442\u0430","\u0441\u0430\u0442\u0438"],d:["\u0458\u0435\u0434\u0430\u043d \u0434\u0430\u043d","\u0458\u0435\u0434\u043d\u043e\u0433 \u0434\u0430\u043d\u0430"],dd:["\u0434\u0430\u043d","\u0434\u0430\u043d\u0430","\u0434\u0430\u043d\u0430"],M:["\u0458\u0435\u0434\u0430\u043d \u043c\u0435\u0441\u0435\u0446","\u0458\u0435\u0434\u043d\u043e\u0433 \u043c\u0435\u0441\u0435\u0446\u0430"],MM:["\u043c\u0435\u0441\u0435\u0446","\u043c\u0435\u0441\u0435\u0446\u0430","\u043c\u0435\u0441\u0435\u0446\u0438"],y:["\u0458\u0435\u0434\u043d\u0443 \u0433\u043e\u0434\u0438\u043d\u0443","\u0458\u0435\u0434\u043d\u0435 \u0433\u043e\u0434\u0438\u043d\u0435"],yy:["\u0433\u043e\u0434\u0438\u043d\u0443","\u0433\u043e\u0434\u0438\u043d\u0435","\u0433\u043e\u0434\u0438\u043d\u0430"]},correctGrammaticalCase:function(c,e){return c%10>=1&&c%10<=4&&(c%100<10||c%100>=20)?c%10==1?e[0]:e[1]:e[2]},translate:function(c,e,p,y){var C,T=a.words[p];return 1===p.length?"y"===p&&e?"\u0458\u0435\u0434\u043d\u0430 \u0433\u043e\u0434\u0438\u043d\u0430":y||e?T[0]:T[1]:(C=a.correctGrammaticalCase(c,T),"yy"===p&&e&&"\u0433\u043e\u0434\u0438\u043d\u0443"===C?c+" \u0433\u043e\u0434\u0438\u043d\u0430":c+" "+C)}};r.defineLocale("sr-cyrl",{months:"\u0458\u0430\u043d\u0443\u0430\u0440_\u0444\u0435\u0431\u0440\u0443\u0430\u0440_\u043c\u0430\u0440\u0442_\u0430\u043f\u0440\u0438\u043b_\u043c\u0430\u0458_\u0458\u0443\u043d_\u0458\u0443\u043b_\u0430\u0432\u0433\u0443\u0441\u0442_\u0441\u0435\u043f\u0442\u0435\u043c\u0431\u0430\u0440_\u043e\u043a\u0442\u043e\u0431\u0430\u0440_\u043d\u043e\u0432\u0435\u043c\u0431\u0430\u0440_\u0434\u0435\u0446\u0435\u043c\u0431\u0430\u0440".split("_"),monthsShort:"\u0458\u0430\u043d._\u0444\u0435\u0431._\u043c\u0430\u0440._\u0430\u043f\u0440._\u043c\u0430\u0458_\u0458\u0443\u043d_\u0458\u0443\u043b_\u0430\u0432\u0433._\u0441\u0435\u043f._\u043e\u043a\u0442._\u043d\u043e\u0432._\u0434\u0435\u0446.".split("_"),monthsParseExact:!0,weekdays:"\u043d\u0435\u0434\u0435\u0459\u0430_\u043f\u043e\u043d\u0435\u0434\u0435\u0459\u0430\u043a_\u0443\u0442\u043e\u0440\u0430\u043a_\u0441\u0440\u0435\u0434\u0430_\u0447\u0435\u0442\u0432\u0440\u0442\u0430\u043a_\u043f\u0435\u0442\u0430\u043a_\u0441\u0443\u0431\u043e\u0442\u0430".split("_"),weekdaysShort:"\u043d\u0435\u0434._\u043f\u043e\u043d._\u0443\u0442\u043e._\u0441\u0440\u0435._\u0447\u0435\u0442._\u043f\u0435\u0442._\u0441\u0443\u0431.".split("_"),weekdaysMin:"\u043d\u0435_\u043f\u043e_\u0443\u0442_\u0441\u0440_\u0447\u0435_\u043f\u0435_\u0441\u0443".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"H:mm",LTS:"H:mm:ss",L:"D. M. YYYY.",LL:"D. MMMM YYYY.",LLL:"D. MMMM YYYY. H:mm",LLLL:"dddd, D. MMMM YYYY. H:mm"},calendar:{sameDay:"[\u0434\u0430\u043d\u0430\u0441 \u0443] LT",nextDay:"[\u0441\u0443\u0442\u0440\u0430 \u0443] LT",nextWeek:function(){switch(this.day()){case 0:return"[\u0443] [\u043d\u0435\u0434\u0435\u0459\u0443] [\u0443] LT";case 3:return"[\u0443] [\u0441\u0440\u0435\u0434\u0443] [\u0443] LT";case 6:return"[\u0443] [\u0441\u0443\u0431\u043e\u0442\u0443] [\u0443] LT";case 1:case 2:case 4:case 5:return"[\u0443] dddd [\u0443] LT"}},lastDay:"[\u0458\u0443\u0447\u0435 \u0443] LT",lastWeek:function(){return["[\u043f\u0440\u043e\u0448\u043b\u0435] [\u043d\u0435\u0434\u0435\u0459\u0435] [\u0443] LT","[\u043f\u0440\u043e\u0448\u043b\u043e\u0433] [\u043f\u043e\u043d\u0435\u0434\u0435\u0459\u043a\u0430] [\u0443] LT","[\u043f\u0440\u043e\u0448\u043b\u043e\u0433] [\u0443\u0442\u043e\u0440\u043a\u0430] [\u0443] LT","[\u043f\u0440\u043e\u0448\u043b\u0435] [\u0441\u0440\u0435\u0434\u0435] [\u0443] LT","[\u043f\u0440\u043e\u0448\u043b\u043e\u0433] [\u0447\u0435\u0442\u0432\u0440\u0442\u043a\u0430] [\u0443] LT","[\u043f\u0440\u043e\u0448\u043b\u043e\u0433] [\u043f\u0435\u0442\u043a\u0430] [\u0443] LT","[\u043f\u0440\u043e\u0448\u043b\u0435] [\u0441\u0443\u0431\u043e\u0442\u0435] [\u0443] LT"][this.day()]},sameElse:"L"},relativeTime:{future:"\u0437\u0430 %s",past:"\u043f\u0440\u0435 %s",s:"\u043d\u0435\u043a\u043e\u043b\u0438\u043a\u043e \u0441\u0435\u043a\u0443\u043d\u0434\u0438",ss:a.translate,m:a.translate,mm:a.translate,h:a.translate,hh:a.translate,d:a.translate,dd:a.translate,M:a.translate,MM:a.translate,y:a.translate,yy:a.translate},dayOfMonthOrdinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:7}})}(i(16738))},91621:function(m,S,i){!function(r){"use strict";var a={words:{ss:["sekunda","sekunde","sekundi"],m:["jedan minut","jednog minuta"],mm:["minut","minuta","minuta"],h:["jedan sat","jednog sata"],hh:["sat","sata","sati"],d:["jedan dan","jednog dana"],dd:["dan","dana","dana"],M:["jedan mesec","jednog meseca"],MM:["mesec","meseca","meseci"],y:["jednu godinu","jedne godine"],yy:["godinu","godine","godina"]},correctGrammaticalCase:function(c,e){return c%10>=1&&c%10<=4&&(c%100<10||c%100>=20)?c%10==1?e[0]:e[1]:e[2]},translate:function(c,e,p,y){var C,T=a.words[p];return 1===p.length?"y"===p&&e?"jedna godina":y||e?T[0]:T[1]:(C=a.correctGrammaticalCase(c,T),"yy"===p&&e&&"godinu"===C?c+" godina":c+" "+C)}};r.defineLocale("sr",{months:"januar_februar_mart_april_maj_jun_jul_avgust_septembar_oktobar_novembar_decembar".split("_"),monthsShort:"jan._feb._mar._apr._maj_jun_jul_avg._sep._okt._nov._dec.".split("_"),monthsParseExact:!0,weekdays:"nedelja_ponedeljak_utorak_sreda_\u010detvrtak_petak_subota".split("_"),weekdaysShort:"ned._pon._uto._sre._\u010det._pet._sub.".split("_"),weekdaysMin:"ne_po_ut_sr_\u010de_pe_su".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"H:mm",LTS:"H:mm:ss",L:"D. M. YYYY.",LL:"D. MMMM YYYY.",LLL:"D. MMMM YYYY. H:mm",LLLL:"dddd, D. MMMM YYYY. H:mm"},calendar:{sameDay:"[danas u] LT",nextDay:"[sutra u] LT",nextWeek:function(){switch(this.day()){case 0:return"[u] [nedelju] [u] LT";case 3:return"[u] [sredu] [u] LT";case 6:return"[u] [subotu] [u] LT";case 1:case 2:case 4:case 5:return"[u] dddd [u] LT"}},lastDay:"[ju\u010de u] LT",lastWeek:function(){return["[pro\u0161le] [nedelje] [u] LT","[pro\u0161log] [ponedeljka] [u] LT","[pro\u0161log] [utorka] [u] LT","[pro\u0161le] [srede] [u] LT","[pro\u0161log] [\u010detvrtka] [u] LT","[pro\u0161log] [petka] [u] LT","[pro\u0161le] [subote] [u] LT"][this.day()]},sameElse:"L"},relativeTime:{future:"za %s",past:"pre %s",s:"nekoliko sekundi",ss:a.translate,m:a.translate,mm:a.translate,h:a.translate,hh:a.translate,d:a.translate,dd:a.translate,M:a.translate,MM:a.translate,y:a.translate,yy:a.translate},dayOfMonthOrdinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:7}})}(i(16738))},41404:function(m,S,i){!function(r){"use strict";r.defineLocale("ss",{months:"Bhimbidvwane_Indlovana_Indlov'lenkhulu_Mabasa_Inkhwekhweti_Inhlaba_Kholwane_Ingci_Inyoni_Imphala_Lweti_Ingongoni".split("_"),monthsShort:"Bhi_Ina_Inu_Mab_Ink_Inh_Kho_Igc_Iny_Imp_Lwe_Igo".split("_"),weekdays:"Lisontfo_Umsombuluko_Lesibili_Lesitsatfu_Lesine_Lesihlanu_Umgcibelo".split("_"),weekdaysShort:"Lis_Umb_Lsb_Les_Lsi_Lsh_Umg".split("_"),weekdaysMin:"Li_Us_Lb_Lt_Ls_Lh_Ug".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"h:mm A",LTS:"h:mm:ss A",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY h:mm A",LLLL:"dddd, D MMMM YYYY h:mm A"},calendar:{sameDay:"[Namuhla nga] LT",nextDay:"[Kusasa nga] LT",nextWeek:"dddd [nga] LT",lastDay:"[Itolo nga] LT",lastWeek:"dddd [leliphelile] [nga] LT",sameElse:"L"},relativeTime:{future:"nga %s",past:"wenteka nga %s",s:"emizuzwana lomcane",ss:"%d mzuzwana",m:"umzuzu",mm:"%d emizuzu",h:"lihora",hh:"%d emahora",d:"lilanga",dd:"%d emalanga",M:"inyanga",MM:"%d tinyanga",y:"umnyaka",yy:"%d iminyaka"},meridiemParse:/ekuseni|emini|entsambama|ebusuku/,meridiem:function(f,c,e){return f<11?"ekuseni":f<15?"emini":f<19?"entsambama":"ebusuku"},meridiemHour:function(f,c){return 12===f&&(f=0),"ekuseni"===c?f:"emini"===c?f>=11?f:f+12:"entsambama"===c||"ebusuku"===c?0===f?0:f+12:void 0},dayOfMonthOrdinalParse:/\d{1,2}/,ordinal:"%d",week:{dow:1,doy:4}})}(i(16738))},55685:function(m,S,i){!function(r){"use strict";r.defineLocale("sv",{months:"januari_februari_mars_april_maj_juni_juli_augusti_september_oktober_november_december".split("_"),monthsShort:"jan_feb_mar_apr_maj_jun_jul_aug_sep_okt_nov_dec".split("_"),weekdays:"s\xf6ndag_m\xe5ndag_tisdag_onsdag_torsdag_fredag_l\xf6rdag".split("_"),weekdaysShort:"s\xf6n_m\xe5n_tis_ons_tor_fre_l\xf6r".split("_"),weekdaysMin:"s\xf6_m\xe5_ti_on_to_fr_l\xf6".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"YYYY-MM-DD",LL:"D MMMM YYYY",LLL:"D MMMM YYYY [kl.] HH:mm",LLLL:"dddd D MMMM YYYY [kl.] HH:mm",lll:"D MMM YYYY HH:mm",llll:"ddd D MMM YYYY HH:mm"},calendar:{sameDay:"[Idag] LT",nextDay:"[Imorgon] LT",lastDay:"[Ig\xe5r] LT",nextWeek:"[P\xe5] dddd LT",lastWeek:"[I] dddd[s] LT",sameElse:"L"},relativeTime:{future:"om %s",past:"f\xf6r %s sedan",s:"n\xe5gra sekunder",ss:"%d sekunder",m:"en minut",mm:"%d minuter",h:"en timme",hh:"%d timmar",d:"en dag",dd:"%d dagar",M:"en m\xe5nad",MM:"%d m\xe5nader",y:"ett \xe5r",yy:"%d \xe5r"},dayOfMonthOrdinalParse:/\d{1,2}(\:e|\:a)/,ordinal:function(f){var c=f%10;return f+(1==~~(f%100/10)?":e":1===c||2===c?":a":":e")},week:{dow:1,doy:4}})}(i(16738))},3872:function(m,S,i){!function(r){"use strict";r.defineLocale("sw",{months:"Januari_Februari_Machi_Aprili_Mei_Juni_Julai_Agosti_Septemba_Oktoba_Novemba_Desemba".split("_"),monthsShort:"Jan_Feb_Mac_Apr_Mei_Jun_Jul_Ago_Sep_Okt_Nov_Des".split("_"),weekdays:"Jumapili_Jumatatu_Jumanne_Jumatano_Alhamisi_Ijumaa_Jumamosi".split("_"),weekdaysShort:"Jpl_Jtat_Jnne_Jtan_Alh_Ijm_Jmos".split("_"),weekdaysMin:"J2_J3_J4_J5_Al_Ij_J1".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"hh:mm A",LTS:"HH:mm:ss",L:"DD.MM.YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd, D MMMM YYYY HH:mm"},calendar:{sameDay:"[leo saa] LT",nextDay:"[kesho saa] LT",nextWeek:"[wiki ijayo] dddd [saat] LT",lastDay:"[jana] LT",lastWeek:"[wiki iliyopita] dddd [saat] LT",sameElse:"L"},relativeTime:{future:"%s baadaye",past:"tokea %s",s:"hivi punde",ss:"sekunde %d",m:"dakika moja",mm:"dakika %d",h:"saa limoja",hh:"masaa %d",d:"siku moja",dd:"siku %d",M:"mwezi mmoja",MM:"miezi %d",y:"mwaka mmoja",yy:"miaka %d"},week:{dow:1,doy:7}})}(i(16738))},54106:function(m,S,i){!function(r){"use strict";var a={1:"\u0be7",2:"\u0be8",3:"\u0be9",4:"\u0bea",5:"\u0beb",6:"\u0bec",7:"\u0bed",8:"\u0bee",9:"\u0bef",0:"\u0be6"},f={"\u0be7":"1","\u0be8":"2","\u0be9":"3","\u0bea":"4","\u0beb":"5","\u0bec":"6","\u0bed":"7","\u0bee":"8","\u0bef":"9","\u0be6":"0"};r.defineLocale("ta",{months:"\u0b9c\u0ba9\u0bb5\u0bb0\u0bbf_\u0baa\u0bbf\u0baa\u0bcd\u0bb0\u0bb5\u0bb0\u0bbf_\u0bae\u0bbe\u0bb0\u0bcd\u0b9a\u0bcd_\u0b8f\u0baa\u0bcd\u0bb0\u0bb2\u0bcd_\u0bae\u0bc7_\u0b9c\u0bc2\u0ba9\u0bcd_\u0b9c\u0bc2\u0bb2\u0bc8_\u0b86\u0b95\u0bb8\u0bcd\u0b9f\u0bcd_\u0b9a\u0bc6\u0baa\u0bcd\u0b9f\u0bc6\u0bae\u0bcd\u0baa\u0bb0\u0bcd_\u0b85\u0b95\u0bcd\u0b9f\u0bc7\u0bbe\u0baa\u0bb0\u0bcd_\u0ba8\u0bb5\u0bae\u0bcd\u0baa\u0bb0\u0bcd_\u0b9f\u0bbf\u0b9a\u0bae\u0bcd\u0baa\u0bb0\u0bcd".split("_"),monthsShort:"\u0b9c\u0ba9\u0bb5\u0bb0\u0bbf_\u0baa\u0bbf\u0baa\u0bcd\u0bb0\u0bb5\u0bb0\u0bbf_\u0bae\u0bbe\u0bb0\u0bcd\u0b9a\u0bcd_\u0b8f\u0baa\u0bcd\u0bb0\u0bb2\u0bcd_\u0bae\u0bc7_\u0b9c\u0bc2\u0ba9\u0bcd_\u0b9c\u0bc2\u0bb2\u0bc8_\u0b86\u0b95\u0bb8\u0bcd\u0b9f\u0bcd_\u0b9a\u0bc6\u0baa\u0bcd\u0b9f\u0bc6\u0bae\u0bcd\u0baa\u0bb0\u0bcd_\u0b85\u0b95\u0bcd\u0b9f\u0bc7\u0bbe\u0baa\u0bb0\u0bcd_\u0ba8\u0bb5\u0bae\u0bcd\u0baa\u0bb0\u0bcd_\u0b9f\u0bbf\u0b9a\u0bae\u0bcd\u0baa\u0bb0\u0bcd".split("_"),weekdays:"\u0b9e\u0bbe\u0baf\u0bbf\u0bb1\u0bcd\u0bb1\u0bc1\u0b95\u0bcd\u0b95\u0bbf\u0bb4\u0bae\u0bc8_\u0ba4\u0bbf\u0b99\u0bcd\u0b95\u0b9f\u0bcd\u0b95\u0bbf\u0bb4\u0bae\u0bc8_\u0b9a\u0bc6\u0bb5\u0bcd\u0bb5\u0bbe\u0baf\u0bcd\u0b95\u0bbf\u0bb4\u0bae\u0bc8_\u0baa\u0bc1\u0ba4\u0ba9\u0bcd\u0b95\u0bbf\u0bb4\u0bae\u0bc8_\u0bb5\u0bbf\u0baf\u0bbe\u0bb4\u0b95\u0bcd\u0b95\u0bbf\u0bb4\u0bae\u0bc8_\u0bb5\u0bc6\u0bb3\u0bcd\u0bb3\u0bbf\u0b95\u0bcd\u0b95\u0bbf\u0bb4\u0bae\u0bc8_\u0b9a\u0ba9\u0bbf\u0b95\u0bcd\u0b95\u0bbf\u0bb4\u0bae\u0bc8".split("_"),weekdaysShort:"\u0b9e\u0bbe\u0baf\u0bbf\u0bb1\u0bc1_\u0ba4\u0bbf\u0b99\u0bcd\u0b95\u0bb3\u0bcd_\u0b9a\u0bc6\u0bb5\u0bcd\u0bb5\u0bbe\u0baf\u0bcd_\u0baa\u0bc1\u0ba4\u0ba9\u0bcd_\u0bb5\u0bbf\u0baf\u0bbe\u0bb4\u0ba9\u0bcd_\u0bb5\u0bc6\u0bb3\u0bcd\u0bb3\u0bbf_\u0b9a\u0ba9\u0bbf".split("_"),weekdaysMin:"\u0b9e\u0bbe_\u0ba4\u0bbf_\u0b9a\u0bc6_\u0baa\u0bc1_\u0bb5\u0bbf_\u0bb5\u0bc6_\u0b9a".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY, HH:mm",LLLL:"dddd, D MMMM YYYY, HH:mm"},calendar:{sameDay:"[\u0b87\u0ba9\u0bcd\u0bb1\u0bc1] LT",nextDay:"[\u0ba8\u0bbe\u0bb3\u0bc8] LT",nextWeek:"dddd, LT",lastDay:"[\u0ba8\u0bc7\u0bb1\u0bcd\u0bb1\u0bc1] LT",lastWeek:"[\u0b95\u0b9f\u0ba8\u0bcd\u0ba4 \u0bb5\u0bbe\u0bb0\u0bae\u0bcd] dddd, LT",sameElse:"L"},relativeTime:{future:"%s \u0b87\u0bb2\u0bcd",past:"%s \u0bae\u0bc1\u0ba9\u0bcd",s:"\u0b92\u0bb0\u0bc1 \u0b9a\u0bbf\u0bb2 \u0bb5\u0bbf\u0ba8\u0bbe\u0b9f\u0bbf\u0b95\u0bb3\u0bcd",ss:"%d \u0bb5\u0bbf\u0ba8\u0bbe\u0b9f\u0bbf\u0b95\u0bb3\u0bcd",m:"\u0b92\u0bb0\u0bc1 \u0ba8\u0bbf\u0bae\u0bbf\u0b9f\u0bae\u0bcd",mm:"%d \u0ba8\u0bbf\u0bae\u0bbf\u0b9f\u0b99\u0bcd\u0b95\u0bb3\u0bcd",h:"\u0b92\u0bb0\u0bc1 \u0bae\u0ba3\u0bbf \u0ba8\u0bc7\u0bb0\u0bae\u0bcd",hh:"%d \u0bae\u0ba3\u0bbf \u0ba8\u0bc7\u0bb0\u0bae\u0bcd",d:"\u0b92\u0bb0\u0bc1 \u0ba8\u0bbe\u0bb3\u0bcd",dd:"%d \u0ba8\u0bbe\u0b9f\u0bcd\u0b95\u0bb3\u0bcd",M:"\u0b92\u0bb0\u0bc1 \u0bae\u0bbe\u0ba4\u0bae\u0bcd",MM:"%d \u0bae\u0bbe\u0ba4\u0b99\u0bcd\u0b95\u0bb3\u0bcd",y:"\u0b92\u0bb0\u0bc1 \u0bb5\u0bb0\u0bc1\u0b9f\u0bae\u0bcd",yy:"%d \u0b86\u0ba3\u0bcd\u0b9f\u0bc1\u0b95\u0bb3\u0bcd"},dayOfMonthOrdinalParse:/\d{1,2}\u0bb5\u0ba4\u0bc1/,ordinal:function(e){return e+"\u0bb5\u0ba4\u0bc1"},preparse:function(e){return e.replace(/[\u0be7\u0be8\u0be9\u0bea\u0beb\u0bec\u0bed\u0bee\u0bef\u0be6]/g,function(p){return f[p]})},postformat:function(e){return e.replace(/\d/g,function(p){return a[p]})},meridiemParse:/\u0baf\u0bbe\u0bae\u0bae\u0bcd|\u0bb5\u0bc8\u0b95\u0bb1\u0bc8|\u0b95\u0bbe\u0bb2\u0bc8|\u0ba8\u0ba3\u0bcd\u0baa\u0b95\u0bb2\u0bcd|\u0b8e\u0bb1\u0bcd\u0baa\u0bbe\u0b9f\u0bc1|\u0bae\u0bbe\u0bb2\u0bc8/,meridiem:function(e,p,y){return e<2?" \u0baf\u0bbe\u0bae\u0bae\u0bcd":e<6?" \u0bb5\u0bc8\u0b95\u0bb1\u0bc8":e<10?" \u0b95\u0bbe\u0bb2\u0bc8":e<14?" \u0ba8\u0ba3\u0bcd\u0baa\u0b95\u0bb2\u0bcd":e<18?" \u0b8e\u0bb1\u0bcd\u0baa\u0bbe\u0b9f\u0bc1":e<22?" \u0bae\u0bbe\u0bb2\u0bc8":" \u0baf\u0bbe\u0bae\u0bae\u0bcd"},meridiemHour:function(e,p){return 12===e&&(e=0),"\u0baf\u0bbe\u0bae\u0bae\u0bcd"===p?e<2?e:e+12:"\u0bb5\u0bc8\u0b95\u0bb1\u0bc8"===p||"\u0b95\u0bbe\u0bb2\u0bc8"===p||"\u0ba8\u0ba3\u0bcd\u0baa\u0b95\u0bb2\u0bcd"===p&&e>=10?e:e+12},week:{dow:0,doy:6}})}(i(16738))},39204:function(m,S,i){!function(r){"use strict";r.defineLocale("te",{months:"\u0c1c\u0c28\u0c35\u0c30\u0c3f_\u0c2b\u0c3f\u0c2c\u0c4d\u0c30\u0c35\u0c30\u0c3f_\u0c2e\u0c3e\u0c30\u0c4d\u0c1a\u0c3f_\u0c0f\u0c2a\u0c4d\u0c30\u0c3f\u0c32\u0c4d_\u0c2e\u0c47_\u0c1c\u0c42\u0c28\u0c4d_\u0c1c\u0c41\u0c32\u0c48_\u0c06\u0c17\u0c38\u0c4d\u0c1f\u0c41_\u0c38\u0c46\u0c2a\u0c4d\u0c1f\u0c46\u0c02\u0c2c\u0c30\u0c4d_\u0c05\u0c15\u0c4d\u0c1f\u0c4b\u0c2c\u0c30\u0c4d_\u0c28\u0c35\u0c02\u0c2c\u0c30\u0c4d_\u0c21\u0c3f\u0c38\u0c46\u0c02\u0c2c\u0c30\u0c4d".split("_"),monthsShort:"\u0c1c\u0c28._\u0c2b\u0c3f\u0c2c\u0c4d\u0c30._\u0c2e\u0c3e\u0c30\u0c4d\u0c1a\u0c3f_\u0c0f\u0c2a\u0c4d\u0c30\u0c3f._\u0c2e\u0c47_\u0c1c\u0c42\u0c28\u0c4d_\u0c1c\u0c41\u0c32\u0c48_\u0c06\u0c17._\u0c38\u0c46\u0c2a\u0c4d._\u0c05\u0c15\u0c4d\u0c1f\u0c4b._\u0c28\u0c35._\u0c21\u0c3f\u0c38\u0c46.".split("_"),monthsParseExact:!0,weekdays:"\u0c06\u0c26\u0c3f\u0c35\u0c3e\u0c30\u0c02_\u0c38\u0c4b\u0c2e\u0c35\u0c3e\u0c30\u0c02_\u0c2e\u0c02\u0c17\u0c33\u0c35\u0c3e\u0c30\u0c02_\u0c2c\u0c41\u0c27\u0c35\u0c3e\u0c30\u0c02_\u0c17\u0c41\u0c30\u0c41\u0c35\u0c3e\u0c30\u0c02_\u0c36\u0c41\u0c15\u0c4d\u0c30\u0c35\u0c3e\u0c30\u0c02_\u0c36\u0c28\u0c3f\u0c35\u0c3e\u0c30\u0c02".split("_"),weekdaysShort:"\u0c06\u0c26\u0c3f_\u0c38\u0c4b\u0c2e_\u0c2e\u0c02\u0c17\u0c33_\u0c2c\u0c41\u0c27_\u0c17\u0c41\u0c30\u0c41_\u0c36\u0c41\u0c15\u0c4d\u0c30_\u0c36\u0c28\u0c3f".split("_"),weekdaysMin:"\u0c06_\u0c38\u0c4b_\u0c2e\u0c02_\u0c2c\u0c41_\u0c17\u0c41_\u0c36\u0c41_\u0c36".split("_"),longDateFormat:{LT:"A h:mm",LTS:"A h:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY, A h:mm",LLLL:"dddd, D MMMM YYYY, A h:mm"},calendar:{sameDay:"[\u0c28\u0c47\u0c21\u0c41] LT",nextDay:"[\u0c30\u0c47\u0c2a\u0c41] LT",nextWeek:"dddd, LT",lastDay:"[\u0c28\u0c3f\u0c28\u0c4d\u0c28] LT",lastWeek:"[\u0c17\u0c24] dddd, LT",sameElse:"L"},relativeTime:{future:"%s \u0c32\u0c4b",past:"%s \u0c15\u0c4d\u0c30\u0c3f\u0c24\u0c02",s:"\u0c15\u0c4a\u0c28\u0c4d\u0c28\u0c3f \u0c15\u0c4d\u0c37\u0c23\u0c3e\u0c32\u0c41",ss:"%d \u0c38\u0c46\u0c15\u0c28\u0c4d\u0c32\u0c41",m:"\u0c12\u0c15 \u0c28\u0c3f\u0c2e\u0c3f\u0c37\u0c02",mm:"%d \u0c28\u0c3f\u0c2e\u0c3f\u0c37\u0c3e\u0c32\u0c41",h:"\u0c12\u0c15 \u0c17\u0c02\u0c1f",hh:"%d \u0c17\u0c02\u0c1f\u0c32\u0c41",d:"\u0c12\u0c15 \u0c30\u0c4b\u0c1c\u0c41",dd:"%d \u0c30\u0c4b\u0c1c\u0c41\u0c32\u0c41",M:"\u0c12\u0c15 \u0c28\u0c46\u0c32",MM:"%d \u0c28\u0c46\u0c32\u0c32\u0c41",y:"\u0c12\u0c15 \u0c38\u0c02\u0c35\u0c24\u0c4d\u0c38\u0c30\u0c02",yy:"%d \u0c38\u0c02\u0c35\u0c24\u0c4d\u0c38\u0c30\u0c3e\u0c32\u0c41"},dayOfMonthOrdinalParse:/\d{1,2}\u0c35/,ordinal:"%d\u0c35",meridiemParse:/\u0c30\u0c3e\u0c24\u0c4d\u0c30\u0c3f|\u0c09\u0c26\u0c2f\u0c02|\u0c2e\u0c27\u0c4d\u0c2f\u0c3e\u0c39\u0c4d\u0c28\u0c02|\u0c38\u0c3e\u0c2f\u0c02\u0c24\u0c4d\u0c30\u0c02/,meridiemHour:function(f,c){return 12===f&&(f=0),"\u0c30\u0c3e\u0c24\u0c4d\u0c30\u0c3f"===c?f<4?f:f+12:"\u0c09\u0c26\u0c2f\u0c02"===c?f:"\u0c2e\u0c27\u0c4d\u0c2f\u0c3e\u0c39\u0c4d\u0c28\u0c02"===c?f>=10?f:f+12:"\u0c38\u0c3e\u0c2f\u0c02\u0c24\u0c4d\u0c30\u0c02"===c?f+12:void 0},meridiem:function(f,c,e){return f<4?"\u0c30\u0c3e\u0c24\u0c4d\u0c30\u0c3f":f<10?"\u0c09\u0c26\u0c2f\u0c02":f<17?"\u0c2e\u0c27\u0c4d\u0c2f\u0c3e\u0c39\u0c4d\u0c28\u0c02":f<20?"\u0c38\u0c3e\u0c2f\u0c02\u0c24\u0c4d\u0c30\u0c02":"\u0c30\u0c3e\u0c24\u0c4d\u0c30\u0c3f"},week:{dow:0,doy:6}})}(i(16738))},83692:function(m,S,i){!function(r){"use strict";r.defineLocale("tet",{months:"Janeiru_Fevereiru_Marsu_Abril_Maiu_Ju\xf1u_Jullu_Agustu_Setembru_Outubru_Novembru_Dezembru".split("_"),monthsShort:"Jan_Fev_Mar_Abr_Mai_Jun_Jul_Ago_Set_Out_Nov_Dez".split("_"),weekdays:"Domingu_Segunda_Tersa_Kuarta_Kinta_Sesta_Sabadu".split("_"),weekdaysShort:"Dom_Seg_Ters_Kua_Kint_Sest_Sab".split("_"),weekdaysMin:"Do_Seg_Te_Ku_Ki_Ses_Sa".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd, D MMMM YYYY HH:mm"},calendar:{sameDay:"[Ohin iha] LT",nextDay:"[Aban iha] LT",nextWeek:"dddd [iha] LT",lastDay:"[Horiseik iha] LT",lastWeek:"dddd [semana kotuk] [iha] LT",sameElse:"L"},relativeTime:{future:"iha %s",past:"%s liuba",s:"segundu balun",ss:"segundu %d",m:"minutu ida",mm:"minutu %d",h:"oras ida",hh:"oras %d",d:"loron ida",dd:"loron %d",M:"fulan ida",MM:"fulan %d",y:"tinan ida",yy:"tinan %d"},dayOfMonthOrdinalParse:/\d{1,2}(st|nd|rd|th)/,ordinal:function(f){var c=f%10;return f+(1==~~(f%100/10)?"th":1===c?"st":2===c?"nd":3===c?"rd":"th")},week:{dow:1,doy:4}})}(i(16738))},86361:function(m,S,i){!function(r){"use strict";var a={0:"-\u0443\u043c",1:"-\u0443\u043c",2:"-\u044e\u043c",3:"-\u044e\u043c",4:"-\u0443\u043c",5:"-\u0443\u043c",6:"-\u0443\u043c",7:"-\u0443\u043c",8:"-\u0443\u043c",9:"-\u0443\u043c",10:"-\u0443\u043c",12:"-\u0443\u043c",13:"-\u0443\u043c",20:"-\u0443\u043c",30:"-\u044e\u043c",40:"-\u0443\u043c",50:"-\u0443\u043c",60:"-\u0443\u043c",70:"-\u0443\u043c",80:"-\u0443\u043c",90:"-\u0443\u043c",100:"-\u0443\u043c"};r.defineLocale("tg",{months:{format:"\u044f\u043d\u0432\u0430\u0440\u0438_\u0444\u0435\u0432\u0440\u0430\u043b\u0438_\u043c\u0430\u0440\u0442\u0438_\u0430\u043f\u0440\u0435\u043b\u0438_\u043c\u0430\u0439\u0438_\u0438\u044e\u043d\u0438_\u0438\u044e\u043b\u0438_\u0430\u0432\u0433\u0443\u0441\u0442\u0438_\u0441\u0435\u043d\u0442\u044f\u0431\u0440\u0438_\u043e\u043a\u0442\u044f\u0431\u0440\u0438_\u043d\u043e\u044f\u0431\u0440\u0438_\u0434\u0435\u043a\u0430\u0431\u0440\u0438".split("_"),standalone:"\u044f\u043d\u0432\u0430\u0440_\u0444\u0435\u0432\u0440\u0430\u043b_\u043c\u0430\u0440\u0442_\u0430\u043f\u0440\u0435\u043b_\u043c\u0430\u0439_\u0438\u044e\u043d_\u0438\u044e\u043b_\u0430\u0432\u0433\u0443\u0441\u0442_\u0441\u0435\u043d\u0442\u044f\u0431\u0440_\u043e\u043a\u0442\u044f\u0431\u0440_\u043d\u043e\u044f\u0431\u0440_\u0434\u0435\u043a\u0430\u0431\u0440".split("_")},monthsShort:"\u044f\u043d\u0432_\u0444\u0435\u0432_\u043c\u0430\u0440_\u0430\u043f\u0440_\u043c\u0430\u0439_\u0438\u044e\u043d_\u0438\u044e\u043b_\u0430\u0432\u0433_\u0441\u0435\u043d_\u043e\u043a\u0442_\u043d\u043e\u044f_\u0434\u0435\u043a".split("_"),weekdays:"\u044f\u043a\u0448\u0430\u043d\u0431\u0435_\u0434\u0443\u0448\u0430\u043d\u0431\u0435_\u0441\u0435\u0448\u0430\u043d\u0431\u0435_\u0447\u043e\u0440\u0448\u0430\u043d\u0431\u0435_\u043f\u0430\u043d\u04b7\u0448\u0430\u043d\u0431\u0435_\u04b7\u0443\u043c\u044a\u0430_\u0448\u0430\u043d\u0431\u0435".split("_"),weekdaysShort:"\u044f\u0448\u0431_\u0434\u0448\u0431_\u0441\u0448\u0431_\u0447\u0448\u0431_\u043f\u0448\u0431_\u04b7\u0443\u043c_\u0448\u043d\u0431".split("_"),weekdaysMin:"\u044f\u0448_\u0434\u0448_\u0441\u0448_\u0447\u0448_\u043f\u0448_\u04b7\u043c_\u0448\u0431".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD.MM.YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd, D MMMM YYYY HH:mm"},calendar:{sameDay:"[\u0418\u043c\u0440\u04ef\u0437 \u0441\u043e\u0430\u0442\u0438] LT",nextDay:"[\u0424\u0430\u0440\u0434\u043e \u0441\u043e\u0430\u0442\u0438] LT",lastDay:"[\u0414\u0438\u0440\u04ef\u0437 \u0441\u043e\u0430\u0442\u0438] LT",nextWeek:"dddd[\u0438] [\u04b3\u0430\u0444\u0442\u0430\u0438 \u043e\u044f\u043d\u0434\u0430 \u0441\u043e\u0430\u0442\u0438] LT",lastWeek:"dddd[\u0438] [\u04b3\u0430\u0444\u0442\u0430\u0438 \u0433\u0443\u0437\u0430\u0448\u0442\u0430 \u0441\u043e\u0430\u0442\u0438] LT",sameElse:"L"},relativeTime:{future:"\u0431\u0430\u044a\u0434\u0438 %s",past:"%s \u043f\u0435\u0448",s:"\u044f\u043a\u0447\u0430\u043d\u0434 \u0441\u043e\u043d\u0438\u044f",m:"\u044f\u043a \u0434\u0430\u049b\u0438\u049b\u0430",mm:"%d \u0434\u0430\u049b\u0438\u049b\u0430",h:"\u044f\u043a \u0441\u043e\u0430\u0442",hh:"%d \u0441\u043e\u0430\u0442",d:"\u044f\u043a \u0440\u04ef\u0437",dd:"%d \u0440\u04ef\u0437",M:"\u044f\u043a \u043c\u043e\u04b3",MM:"%d \u043c\u043e\u04b3",y:"\u044f\u043a \u0441\u043e\u043b",yy:"%d \u0441\u043e\u043b"},meridiemParse:/\u0448\u0430\u0431|\u0441\u0443\u0431\u04b3|\u0440\u04ef\u0437|\u0431\u0435\u0433\u043e\u04b3/,meridiemHour:function(c,e){return 12===c&&(c=0),"\u0448\u0430\u0431"===e?c<4?c:c+12:"\u0441\u0443\u0431\u04b3"===e?c:"\u0440\u04ef\u0437"===e?c>=11?c:c+12:"\u0431\u0435\u0433\u043e\u04b3"===e?c+12:void 0},meridiem:function(c,e,p){return c<4?"\u0448\u0430\u0431":c<11?"\u0441\u0443\u0431\u04b3":c<16?"\u0440\u04ef\u0437":c<19?"\u0431\u0435\u0433\u043e\u04b3":"\u0448\u0430\u0431"},dayOfMonthOrdinalParse:/\d{1,2}-(\u0443\u043c|\u044e\u043c)/,ordinal:function(c){return c+(a[c]||a[c%10]||a[c>=100?100:null])},week:{dow:1,doy:7}})}(i(16738))},31735:function(m,S,i){!function(r){"use strict";r.defineLocale("th",{months:"\u0e21\u0e01\u0e23\u0e32\u0e04\u0e21_\u0e01\u0e38\u0e21\u0e20\u0e32\u0e1e\u0e31\u0e19\u0e18\u0e4c_\u0e21\u0e35\u0e19\u0e32\u0e04\u0e21_\u0e40\u0e21\u0e29\u0e32\u0e22\u0e19_\u0e1e\u0e24\u0e29\u0e20\u0e32\u0e04\u0e21_\u0e21\u0e34\u0e16\u0e38\u0e19\u0e32\u0e22\u0e19_\u0e01\u0e23\u0e01\u0e0e\u0e32\u0e04\u0e21_\u0e2a\u0e34\u0e07\u0e2b\u0e32\u0e04\u0e21_\u0e01\u0e31\u0e19\u0e22\u0e32\u0e22\u0e19_\u0e15\u0e38\u0e25\u0e32\u0e04\u0e21_\u0e1e\u0e24\u0e28\u0e08\u0e34\u0e01\u0e32\u0e22\u0e19_\u0e18\u0e31\u0e19\u0e27\u0e32\u0e04\u0e21".split("_"),monthsShort:"\u0e21.\u0e04._\u0e01.\u0e1e._\u0e21\u0e35.\u0e04._\u0e40\u0e21.\u0e22._\u0e1e.\u0e04._\u0e21\u0e34.\u0e22._\u0e01.\u0e04._\u0e2a.\u0e04._\u0e01.\u0e22._\u0e15.\u0e04._\u0e1e.\u0e22._\u0e18.\u0e04.".split("_"),monthsParseExact:!0,weekdays:"\u0e2d\u0e32\u0e17\u0e34\u0e15\u0e22\u0e4c_\u0e08\u0e31\u0e19\u0e17\u0e23\u0e4c_\u0e2d\u0e31\u0e07\u0e04\u0e32\u0e23_\u0e1e\u0e38\u0e18_\u0e1e\u0e24\u0e2b\u0e31\u0e2a\u0e1a\u0e14\u0e35_\u0e28\u0e38\u0e01\u0e23\u0e4c_\u0e40\u0e2a\u0e32\u0e23\u0e4c".split("_"),weekdaysShort:"\u0e2d\u0e32\u0e17\u0e34\u0e15\u0e22\u0e4c_\u0e08\u0e31\u0e19\u0e17\u0e23\u0e4c_\u0e2d\u0e31\u0e07\u0e04\u0e32\u0e23_\u0e1e\u0e38\u0e18_\u0e1e\u0e24\u0e2b\u0e31\u0e2a_\u0e28\u0e38\u0e01\u0e23\u0e4c_\u0e40\u0e2a\u0e32\u0e23\u0e4c".split("_"),weekdaysMin:"\u0e2d\u0e32._\u0e08._\u0e2d._\u0e1e._\u0e1e\u0e24._\u0e28._\u0e2a.".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"H:mm",LTS:"H:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY \u0e40\u0e27\u0e25\u0e32 H:mm",LLLL:"\u0e27\u0e31\u0e19dddd\u0e17\u0e35\u0e48 D MMMM YYYY \u0e40\u0e27\u0e25\u0e32 H:mm"},meridiemParse:/\u0e01\u0e48\u0e2d\u0e19\u0e40\u0e17\u0e35\u0e48\u0e22\u0e07|\u0e2b\u0e25\u0e31\u0e07\u0e40\u0e17\u0e35\u0e48\u0e22\u0e07/,isPM:function(f){return"\u0e2b\u0e25\u0e31\u0e07\u0e40\u0e17\u0e35\u0e48\u0e22\u0e07"===f},meridiem:function(f,c,e){return f<12?"\u0e01\u0e48\u0e2d\u0e19\u0e40\u0e17\u0e35\u0e48\u0e22\u0e07":"\u0e2b\u0e25\u0e31\u0e07\u0e40\u0e17\u0e35\u0e48\u0e22\u0e07"},calendar:{sameDay:"[\u0e27\u0e31\u0e19\u0e19\u0e35\u0e49 \u0e40\u0e27\u0e25\u0e32] LT",nextDay:"[\u0e1e\u0e23\u0e38\u0e48\u0e07\u0e19\u0e35\u0e49 \u0e40\u0e27\u0e25\u0e32] LT",nextWeek:"dddd[\u0e2b\u0e19\u0e49\u0e32 \u0e40\u0e27\u0e25\u0e32] LT",lastDay:"[\u0e40\u0e21\u0e37\u0e48\u0e2d\u0e27\u0e32\u0e19\u0e19\u0e35\u0e49 \u0e40\u0e27\u0e25\u0e32] LT",lastWeek:"[\u0e27\u0e31\u0e19]dddd[\u0e17\u0e35\u0e48\u0e41\u0e25\u0e49\u0e27 \u0e40\u0e27\u0e25\u0e32] LT",sameElse:"L"},relativeTime:{future:"\u0e2d\u0e35\u0e01 %s",past:"%s\u0e17\u0e35\u0e48\u0e41\u0e25\u0e49\u0e27",s:"\u0e44\u0e21\u0e48\u0e01\u0e35\u0e48\u0e27\u0e34\u0e19\u0e32\u0e17\u0e35",ss:"%d \u0e27\u0e34\u0e19\u0e32\u0e17\u0e35",m:"1 \u0e19\u0e32\u0e17\u0e35",mm:"%d \u0e19\u0e32\u0e17\u0e35",h:"1 \u0e0a\u0e31\u0e48\u0e27\u0e42\u0e21\u0e07",hh:"%d \u0e0a\u0e31\u0e48\u0e27\u0e42\u0e21\u0e07",d:"1 \u0e27\u0e31\u0e19",dd:"%d \u0e27\u0e31\u0e19",w:"1 \u0e2a\u0e31\u0e1b\u0e14\u0e32\u0e2b\u0e4c",ww:"%d \u0e2a\u0e31\u0e1b\u0e14\u0e32\u0e2b\u0e4c",M:"1 \u0e40\u0e14\u0e37\u0e2d\u0e19",MM:"%d \u0e40\u0e14\u0e37\u0e2d\u0e19",y:"1 \u0e1b\u0e35",yy:"%d \u0e1b\u0e35"}})}(i(16738))},1568:function(m,S,i){!function(r){"use strict";var a={1:"'inji",5:"'inji",8:"'inji",70:"'inji",80:"'inji",2:"'nji",7:"'nji",20:"'nji",50:"'nji",3:"'\xfcnji",4:"'\xfcnji",100:"'\xfcnji",6:"'njy",9:"'unjy",10:"'unjy",30:"'unjy",60:"'ynjy",90:"'ynjy"};r.defineLocale("tk",{months:"\xddanwar_Fewral_Mart_Aprel_Ma\xfd_I\xfdun_I\xfdul_Awgust_Sent\xfdabr_Okt\xfdabr_No\xfdabr_Dekabr".split("_"),monthsShort:"\xddan_Few_Mar_Apr_Ma\xfd_I\xfdn_I\xfdl_Awg_Sen_Okt_No\xfd_Dek".split("_"),weekdays:"\xddek\u015fenbe_Du\u015fenbe_Si\u015fenbe_\xc7ar\u015fenbe_Pen\u015fenbe_Anna_\u015eenbe".split("_"),weekdaysShort:"\xddek_Du\u015f_Si\u015f_\xc7ar_Pen_Ann_\u015een".split("_"),weekdaysMin:"\xddk_D\u015f_S\u015f_\xc7r_Pn_An_\u015en".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD.MM.YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd, D MMMM YYYY HH:mm"},calendar:{sameDay:"[bug\xfcn sagat] LT",nextDay:"[ertir sagat] LT",nextWeek:"[indiki] dddd [sagat] LT",lastDay:"[d\xfc\xfdn] LT",lastWeek:"[ge\xe7en] dddd [sagat] LT",sameElse:"L"},relativeTime:{future:"%s so\u0148",past:"%s \xf6\u0148",s:"birn\xe4\xe7e sekunt",m:"bir minut",mm:"%d minut",h:"bir sagat",hh:"%d sagat",d:"bir g\xfcn",dd:"%d g\xfcn",M:"bir a\xfd",MM:"%d a\xfd",y:"bir \xfdyl",yy:"%d \xfdyl"},ordinal:function(c,e){switch(e){case"d":case"D":case"Do":case"DD":return c;default:if(0===c)return c+"'unjy";var p=c%10;return c+(a[p]||a[c%100-p]||a[c>=100?100:null])}},week:{dow:1,doy:7}})}(i(16738))},96129:function(m,S,i){!function(r){"use strict";r.defineLocale("tl-ph",{months:"Enero_Pebrero_Marso_Abril_Mayo_Hunyo_Hulyo_Agosto_Setyembre_Oktubre_Nobyembre_Disyembre".split("_"),monthsShort:"Ene_Peb_Mar_Abr_May_Hun_Hul_Ago_Set_Okt_Nob_Dis".split("_"),weekdays:"Linggo_Lunes_Martes_Miyerkules_Huwebes_Biyernes_Sabado".split("_"),weekdaysShort:"Lin_Lun_Mar_Miy_Huw_Biy_Sab".split("_"),weekdaysMin:"Li_Lu_Ma_Mi_Hu_Bi_Sab".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"MM/D/YYYY",LL:"MMMM D, YYYY",LLL:"MMMM D, YYYY HH:mm",LLLL:"dddd, MMMM DD, YYYY HH:mm"},calendar:{sameDay:"LT [ngayong araw]",nextDay:"[Bukas ng] LT",nextWeek:"LT [sa susunod na] dddd",lastDay:"LT [kahapon]",lastWeek:"LT [noong nakaraang] dddd",sameElse:"L"},relativeTime:{future:"sa loob ng %s",past:"%s ang nakalipas",s:"ilang segundo",ss:"%d segundo",m:"isang minuto",mm:"%d minuto",h:"isang oras",hh:"%d oras",d:"isang araw",dd:"%d araw",M:"isang buwan",MM:"%d buwan",y:"isang taon",yy:"%d taon"},dayOfMonthOrdinalParse:/\d{1,2}/,ordinal:function(f){return f},week:{dow:1,doy:4}})}(i(16738))},13759:function(m,S,i){!function(r){"use strict";var a="pagh_wa\u2019_cha\u2019_wej_loS_vagh_jav_Soch_chorgh_Hut".split("_");function e(T,C,R,L){var z=function p(T){var C=Math.floor(T%1e3/100),R=Math.floor(T%100/10),L=T%10,z="";return C>0&&(z+=a[C]+"vatlh"),R>0&&(z+=(""!==z?" ":"")+a[R]+"maH"),L>0&&(z+=(""!==z?" ":"")+a[L]),""===z?"pagh":z}(T);switch(R){case"ss":return z+" lup";case"mm":return z+" tup";case"hh":return z+" rep";case"dd":return z+" jaj";case"MM":return z+" jar";case"yy":return z+" DIS"}}r.defineLocale("tlh",{months:"tera\u2019 jar wa\u2019_tera\u2019 jar cha\u2019_tera\u2019 jar wej_tera\u2019 jar loS_tera\u2019 jar vagh_tera\u2019 jar jav_tera\u2019 jar Soch_tera\u2019 jar chorgh_tera\u2019 jar Hut_tera\u2019 jar wa\u2019maH_tera\u2019 jar wa\u2019maH wa\u2019_tera\u2019 jar wa\u2019maH cha\u2019".split("_"),monthsShort:"jar wa\u2019_jar cha\u2019_jar wej_jar loS_jar vagh_jar jav_jar Soch_jar chorgh_jar Hut_jar wa\u2019maH_jar wa\u2019maH wa\u2019_jar wa\u2019maH cha\u2019".split("_"),monthsParseExact:!0,weekdays:"lojmItjaj_DaSjaj_povjaj_ghItlhjaj_loghjaj_buqjaj_ghInjaj".split("_"),weekdaysShort:"lojmItjaj_DaSjaj_povjaj_ghItlhjaj_loghjaj_buqjaj_ghInjaj".split("_"),weekdaysMin:"lojmItjaj_DaSjaj_povjaj_ghItlhjaj_loghjaj_buqjaj_ghInjaj".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD.MM.YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd, D MMMM YYYY HH:mm"},calendar:{sameDay:"[DaHjaj] LT",nextDay:"[wa\u2019leS] LT",nextWeek:"LLL",lastDay:"[wa\u2019Hu\u2019] LT",lastWeek:"LLL",sameElse:"L"},relativeTime:{future:function f(T){var C=T;return-1!==T.indexOf("jaj")?C.slice(0,-3)+"leS":-1!==T.indexOf("jar")?C.slice(0,-3)+"waQ":-1!==T.indexOf("DIS")?C.slice(0,-3)+"nem":C+" pIq"},past:function c(T){var C=T;return-1!==T.indexOf("jaj")?C.slice(0,-3)+"Hu\u2019":-1!==T.indexOf("jar")?C.slice(0,-3)+"wen":-1!==T.indexOf("DIS")?C.slice(0,-3)+"ben":C+" ret"},s:"puS lup",ss:e,m:"wa\u2019 tup",mm:e,h:"wa\u2019 rep",hh:e,d:"wa\u2019 jaj",dd:e,M:"wa\u2019 jar",MM:e,y:"wa\u2019 DIS",yy:e},dayOfMonthOrdinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:4}})}(i(16738))},81644:function(m,S,i){!function(r){"use strict";var a={1:"'inci",5:"'inci",8:"'inci",70:"'inci",80:"'inci",2:"'nci",7:"'nci",20:"'nci",50:"'nci",3:"'\xfcnc\xfc",4:"'\xfcnc\xfc",100:"'\xfcnc\xfc",6:"'nc\u0131",9:"'uncu",10:"'uncu",30:"'uncu",60:"'\u0131nc\u0131",90:"'\u0131nc\u0131"};r.defineLocale("tr",{months:"Ocak_\u015eubat_Mart_Nisan_May\u0131s_Haziran_Temmuz_A\u011fustos_Eyl\xfcl_Ekim_Kas\u0131m_Aral\u0131k".split("_"),monthsShort:"Oca_\u015eub_Mar_Nis_May_Haz_Tem_A\u011fu_Eyl_Eki_Kas_Ara".split("_"),weekdays:"Pazar_Pazartesi_Sal\u0131_\xc7ar\u015famba_Per\u015fembe_Cuma_Cumartesi".split("_"),weekdaysShort:"Paz_Pzt_Sal_\xc7ar_Per_Cum_Cmt".split("_"),weekdaysMin:"Pz_Pt_Sa_\xc7a_Pe_Cu_Ct".split("_"),meridiem:function(c,e,p){return c<12?p?"\xf6\xf6":"\xd6\xd6":p?"\xf6s":"\xd6S"},meridiemParse:/\xf6\xf6|\xd6\xd6|\xf6s|\xd6S/,isPM:function(c){return"\xf6s"===c||"\xd6S"===c},longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD.MM.YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd, D MMMM YYYY HH:mm"},calendar:{sameDay:"[bug\xfcn saat] LT",nextDay:"[yar\u0131n saat] LT",nextWeek:"[gelecek] dddd [saat] LT",lastDay:"[d\xfcn] LT",lastWeek:"[ge\xe7en] dddd [saat] LT",sameElse:"L"},relativeTime:{future:"%s sonra",past:"%s \xf6nce",s:"birka\xe7 saniye",ss:"%d saniye",m:"bir dakika",mm:"%d dakika",h:"bir saat",hh:"%d saat",d:"bir g\xfcn",dd:"%d g\xfcn",w:"bir hafta",ww:"%d hafta",M:"bir ay",MM:"%d ay",y:"bir y\u0131l",yy:"%d y\u0131l"},ordinal:function(c,e){switch(e){case"d":case"D":case"Do":case"DD":return c;default:if(0===c)return c+"'\u0131nc\u0131";var p=c%10;return c+(a[p]||a[c%100-p]||a[c>=100?100:null])}},week:{dow:1,doy:7}})}(i(16738))},90875:function(m,S,i){!function(r){"use strict";function f(c,e,p,y){var T={s:["viensas secunds","'iensas secunds"],ss:[c+" secunds",c+" secunds"],m:["'n m\xedut","'iens m\xedut"],mm:[c+" m\xeduts",c+" m\xeduts"],h:["'n \xfeora","'iensa \xfeora"],hh:[c+" \xfeoras",c+" \xfeoras"],d:["'n ziua","'iensa ziua"],dd:[c+" ziuas",c+" ziuas"],M:["'n mes","'iens mes"],MM:[c+" mesen",c+" mesen"],y:["'n ar","'iens ar"],yy:[c+" ars",c+" ars"]};return y||e?T[p][0]:T[p][1]}r.defineLocale("tzl",{months:"Januar_Fevraglh_Mar\xe7_Avr\xefu_Mai_G\xfcn_Julia_Guscht_Setemvar_Listop\xe4ts_Noemvar_Zecemvar".split("_"),monthsShort:"Jan_Fev_Mar_Avr_Mai_G\xfcn_Jul_Gus_Set_Lis_Noe_Zec".split("_"),weekdays:"S\xfaladi_L\xfane\xe7i_Maitzi_M\xe1rcuri_Xh\xfaadi_Vi\xe9ner\xe7i_S\xe1turi".split("_"),weekdaysShort:"S\xfal_L\xfan_Mai_M\xe1r_Xh\xfa_Vi\xe9_S\xe1t".split("_"),weekdaysMin:"S\xfa_L\xfa_Ma_M\xe1_Xh_Vi_S\xe1".split("_"),longDateFormat:{LT:"HH.mm",LTS:"HH.mm.ss",L:"DD.MM.YYYY",LL:"D. MMMM [dallas] YYYY",LLL:"D. MMMM [dallas] YYYY HH.mm",LLLL:"dddd, [li] D. MMMM [dallas] YYYY HH.mm"},meridiemParse:/d\'o|d\'a/i,isPM:function(c){return"d'o"===c.toLowerCase()},meridiem:function(c,e,p){return c>11?p?"d'o":"D'O":p?"d'a":"D'A"},calendar:{sameDay:"[oxhi \xe0] LT",nextDay:"[dem\xe0 \xe0] LT",nextWeek:"dddd [\xe0] LT",lastDay:"[ieiri \xe0] LT",lastWeek:"[s\xfcr el] dddd [lasteu \xe0] LT",sameElse:"L"},relativeTime:{future:"osprei %s",past:"ja%s",s:f,ss:f,m:f,mm:f,h:f,hh:f,d:f,dd:f,M:f,MM:f,y:f,yy:f},dayOfMonthOrdinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:4}})}(i(16738))},11041:function(m,S,i){!function(r){"use strict";r.defineLocale("tzm-latn",{months:"innayr_br\u02e4ayr\u02e4_mar\u02e4s\u02e4_ibrir_mayyw_ywnyw_ywlywz_\u0263w\u0161t_\u0161wtanbir_kt\u02e4wbr\u02e4_nwwanbir_dwjnbir".split("_"),monthsShort:"innayr_br\u02e4ayr\u02e4_mar\u02e4s\u02e4_ibrir_mayyw_ywnyw_ywlywz_\u0263w\u0161t_\u0161wtanbir_kt\u02e4wbr\u02e4_nwwanbir_dwjnbir".split("_"),weekdays:"asamas_aynas_asinas_akras_akwas_asimwas_asi\u1e0dyas".split("_"),weekdaysShort:"asamas_aynas_asinas_akras_akwas_asimwas_asi\u1e0dyas".split("_"),weekdaysMin:"asamas_aynas_asinas_akras_akwas_asimwas_asi\u1e0dyas".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd D MMMM YYYY HH:mm"},calendar:{sameDay:"[asdkh g] LT",nextDay:"[aska g] LT",nextWeek:"dddd [g] LT",lastDay:"[assant g] LT",lastWeek:"dddd [g] LT",sameElse:"L"},relativeTime:{future:"dadkh s yan %s",past:"yan %s",s:"imik",ss:"%d imik",m:"minu\u1e0d",mm:"%d minu\u1e0d",h:"sa\u025ba",hh:"%d tassa\u025bin",d:"ass",dd:"%d ossan",M:"ayowr",MM:"%d iyyirn",y:"asgas",yy:"%d isgasn"},week:{dow:6,doy:12}})}(i(16738))},16878:function(m,S,i){!function(r){"use strict";r.defineLocale("tzm",{months:"\u2d49\u2d4f\u2d4f\u2d30\u2d62\u2d54_\u2d31\u2d55\u2d30\u2d62\u2d55_\u2d4e\u2d30\u2d55\u2d5a_\u2d49\u2d31\u2d54\u2d49\u2d54_\u2d4e\u2d30\u2d62\u2d62\u2d53_\u2d62\u2d53\u2d4f\u2d62\u2d53_\u2d62\u2d53\u2d4d\u2d62\u2d53\u2d63_\u2d56\u2d53\u2d5b\u2d5c_\u2d5b\u2d53\u2d5c\u2d30\u2d4f\u2d31\u2d49\u2d54_\u2d3d\u2d5f\u2d53\u2d31\u2d55_\u2d4f\u2d53\u2d61\u2d30\u2d4f\u2d31\u2d49\u2d54_\u2d37\u2d53\u2d4a\u2d4f\u2d31\u2d49\u2d54".split("_"),monthsShort:"\u2d49\u2d4f\u2d4f\u2d30\u2d62\u2d54_\u2d31\u2d55\u2d30\u2d62\u2d55_\u2d4e\u2d30\u2d55\u2d5a_\u2d49\u2d31\u2d54\u2d49\u2d54_\u2d4e\u2d30\u2d62\u2d62\u2d53_\u2d62\u2d53\u2d4f\u2d62\u2d53_\u2d62\u2d53\u2d4d\u2d62\u2d53\u2d63_\u2d56\u2d53\u2d5b\u2d5c_\u2d5b\u2d53\u2d5c\u2d30\u2d4f\u2d31\u2d49\u2d54_\u2d3d\u2d5f\u2d53\u2d31\u2d55_\u2d4f\u2d53\u2d61\u2d30\u2d4f\u2d31\u2d49\u2d54_\u2d37\u2d53\u2d4a\u2d4f\u2d31\u2d49\u2d54".split("_"),weekdays:"\u2d30\u2d59\u2d30\u2d4e\u2d30\u2d59_\u2d30\u2d62\u2d4f\u2d30\u2d59_\u2d30\u2d59\u2d49\u2d4f\u2d30\u2d59_\u2d30\u2d3d\u2d54\u2d30\u2d59_\u2d30\u2d3d\u2d61\u2d30\u2d59_\u2d30\u2d59\u2d49\u2d4e\u2d61\u2d30\u2d59_\u2d30\u2d59\u2d49\u2d39\u2d62\u2d30\u2d59".split("_"),weekdaysShort:"\u2d30\u2d59\u2d30\u2d4e\u2d30\u2d59_\u2d30\u2d62\u2d4f\u2d30\u2d59_\u2d30\u2d59\u2d49\u2d4f\u2d30\u2d59_\u2d30\u2d3d\u2d54\u2d30\u2d59_\u2d30\u2d3d\u2d61\u2d30\u2d59_\u2d30\u2d59\u2d49\u2d4e\u2d61\u2d30\u2d59_\u2d30\u2d59\u2d49\u2d39\u2d62\u2d30\u2d59".split("_"),weekdaysMin:"\u2d30\u2d59\u2d30\u2d4e\u2d30\u2d59_\u2d30\u2d62\u2d4f\u2d30\u2d59_\u2d30\u2d59\u2d49\u2d4f\u2d30\u2d59_\u2d30\u2d3d\u2d54\u2d30\u2d59_\u2d30\u2d3d\u2d61\u2d30\u2d59_\u2d30\u2d59\u2d49\u2d4e\u2d61\u2d30\u2d59_\u2d30\u2d59\u2d49\u2d39\u2d62\u2d30\u2d59".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd D MMMM YYYY HH:mm"},calendar:{sameDay:"[\u2d30\u2d59\u2d37\u2d45 \u2d34] LT",nextDay:"[\u2d30\u2d59\u2d3d\u2d30 \u2d34] LT",nextWeek:"dddd [\u2d34] LT",lastDay:"[\u2d30\u2d5a\u2d30\u2d4f\u2d5c \u2d34] LT",lastWeek:"dddd [\u2d34] LT",sameElse:"L"},relativeTime:{future:"\u2d37\u2d30\u2d37\u2d45 \u2d59 \u2d62\u2d30\u2d4f %s",past:"\u2d62\u2d30\u2d4f %s",s:"\u2d49\u2d4e\u2d49\u2d3d",ss:"%d \u2d49\u2d4e\u2d49\u2d3d",m:"\u2d4e\u2d49\u2d4f\u2d53\u2d3a",mm:"%d \u2d4e\u2d49\u2d4f\u2d53\u2d3a",h:"\u2d59\u2d30\u2d44\u2d30",hh:"%d \u2d5c\u2d30\u2d59\u2d59\u2d30\u2d44\u2d49\u2d4f",d:"\u2d30\u2d59\u2d59",dd:"%d o\u2d59\u2d59\u2d30\u2d4f",M:"\u2d30\u2d62o\u2d53\u2d54",MM:"%d \u2d49\u2d62\u2d62\u2d49\u2d54\u2d4f",y:"\u2d30\u2d59\u2d33\u2d30\u2d59",yy:"%d \u2d49\u2d59\u2d33\u2d30\u2d59\u2d4f"},week:{dow:6,doy:12}})}(i(16738))},74357:function(m,S,i){!function(r){"use strict";r.defineLocale("ug-cn",{months:"\u064a\u0627\u0646\u06cb\u0627\u0631_\u0641\u06d0\u06cb\u0631\u0627\u0644_\u0645\u0627\u0631\u062a_\u0626\u0627\u067e\u0631\u06d0\u0644_\u0645\u0627\u064a_\u0626\u0649\u064a\u06c7\u0646_\u0626\u0649\u064a\u06c7\u0644_\u0626\u0627\u06cb\u063a\u06c7\u0633\u062a_\u0633\u06d0\u0646\u062a\u06d5\u0628\u0649\u0631_\u0626\u06c6\u0643\u062a\u06d5\u0628\u0649\u0631_\u0646\u0648\u064a\u0627\u0628\u0649\u0631_\u062f\u06d0\u0643\u0627\u0628\u0649\u0631".split("_"),monthsShort:"\u064a\u0627\u0646\u06cb\u0627\u0631_\u0641\u06d0\u06cb\u0631\u0627\u0644_\u0645\u0627\u0631\u062a_\u0626\u0627\u067e\u0631\u06d0\u0644_\u0645\u0627\u064a_\u0626\u0649\u064a\u06c7\u0646_\u0626\u0649\u064a\u06c7\u0644_\u0626\u0627\u06cb\u063a\u06c7\u0633\u062a_\u0633\u06d0\u0646\u062a\u06d5\u0628\u0649\u0631_\u0626\u06c6\u0643\u062a\u06d5\u0628\u0649\u0631_\u0646\u0648\u064a\u0627\u0628\u0649\u0631_\u062f\u06d0\u0643\u0627\u0628\u0649\u0631".split("_"),weekdays:"\u064a\u06d5\u0643\u0634\u06d5\u0646\u0628\u06d5_\u062f\u06c8\u0634\u06d5\u0646\u0628\u06d5_\u0633\u06d5\u064a\u0634\u06d5\u0646\u0628\u06d5_\u0686\u0627\u0631\u0634\u06d5\u0646\u0628\u06d5_\u067e\u06d5\u064a\u0634\u06d5\u0646\u0628\u06d5_\u062c\u06c8\u0645\u06d5_\u0634\u06d5\u0646\u0628\u06d5".split("_"),weekdaysShort:"\u064a\u06d5_\u062f\u06c8_\u0633\u06d5_\u0686\u0627_\u067e\u06d5_\u062c\u06c8_\u0634\u06d5".split("_"),weekdaysMin:"\u064a\u06d5_\u062f\u06c8_\u0633\u06d5_\u0686\u0627_\u067e\u06d5_\u062c\u06c8_\u0634\u06d5".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"YYYY-MM-DD",LL:"YYYY-\u064a\u0649\u0644\u0649M-\u0626\u0627\u064a\u0646\u0649\u06adD-\u0643\u06c8\u0646\u0649",LLL:"YYYY-\u064a\u0649\u0644\u0649M-\u0626\u0627\u064a\u0646\u0649\u06adD-\u0643\u06c8\u0646\u0649\u060c HH:mm",LLLL:"dddd\u060c YYYY-\u064a\u0649\u0644\u0649M-\u0626\u0627\u064a\u0646\u0649\u06adD-\u0643\u06c8\u0646\u0649\u060c HH:mm"},meridiemParse:/\u064a\u06d0\u0631\u0649\u0645 \u0643\u06d0\u0686\u06d5|\u0633\u06d5\u06be\u06d5\u0631|\u0686\u06c8\u0634\u062a\u0649\u0646 \u0628\u06c7\u0631\u06c7\u0646|\u0686\u06c8\u0634|\u0686\u06c8\u0634\u062a\u0649\u0646 \u0643\u06d0\u064a\u0649\u0646|\u0643\u06d5\u0686/,meridiemHour:function(f,c){return 12===f&&(f=0),"\u064a\u06d0\u0631\u0649\u0645 \u0643\u06d0\u0686\u06d5"===c||"\u0633\u06d5\u06be\u06d5\u0631"===c||"\u0686\u06c8\u0634\u062a\u0649\u0646 \u0628\u06c7\u0631\u06c7\u0646"===c?f:"\u0686\u06c8\u0634\u062a\u0649\u0646 \u0643\u06d0\u064a\u0649\u0646"===c||"\u0643\u06d5\u0686"===c?f+12:f>=11?f:f+12},meridiem:function(f,c,e){var p=100*f+c;return p<600?"\u064a\u06d0\u0631\u0649\u0645 \u0643\u06d0\u0686\u06d5":p<900?"\u0633\u06d5\u06be\u06d5\u0631":p<1130?"\u0686\u06c8\u0634\u062a\u0649\u0646 \u0628\u06c7\u0631\u06c7\u0646":p<1230?"\u0686\u06c8\u0634":p<1800?"\u0686\u06c8\u0634\u062a\u0649\u0646 \u0643\u06d0\u064a\u0649\u0646":"\u0643\u06d5\u0686"},calendar:{sameDay:"[\u0628\u06c8\u06af\u06c8\u0646 \u0633\u0627\u0626\u06d5\u062a] LT",nextDay:"[\u0626\u06d5\u062a\u06d5 \u0633\u0627\u0626\u06d5\u062a] LT",nextWeek:"[\u0643\u06d0\u0644\u06d5\u0631\u0643\u0649] dddd [\u0633\u0627\u0626\u06d5\u062a] LT",lastDay:"[\u062a\u06c6\u0646\u06c8\u06af\u06c8\u0646] LT",lastWeek:"[\u0626\u0627\u0644\u062f\u0649\u0646\u0642\u0649] dddd [\u0633\u0627\u0626\u06d5\u062a] LT",sameElse:"L"},relativeTime:{future:"%s \u0643\u06d0\u064a\u0649\u0646",past:"%s \u0628\u06c7\u0631\u06c7\u0646",s:"\u0646\u06d5\u0686\u0686\u06d5 \u0633\u06d0\u0643\u0648\u0646\u062a",ss:"%d \u0633\u06d0\u0643\u0648\u0646\u062a",m:"\u0628\u0649\u0631 \u0645\u0649\u0646\u06c7\u062a",mm:"%d \u0645\u0649\u0646\u06c7\u062a",h:"\u0628\u0649\u0631 \u0633\u0627\u0626\u06d5\u062a",hh:"%d \u0633\u0627\u0626\u06d5\u062a",d:"\u0628\u0649\u0631 \u0643\u06c8\u0646",dd:"%d \u0643\u06c8\u0646",M:"\u0628\u0649\u0631 \u0626\u0627\u064a",MM:"%d \u0626\u0627\u064a",y:"\u0628\u0649\u0631 \u064a\u0649\u0644",yy:"%d \u064a\u0649\u0644"},dayOfMonthOrdinalParse:/\d{1,2}(-\u0643\u06c8\u0646\u0649|-\u0626\u0627\u064a|-\u06be\u06d5\u067e\u062a\u06d5)/,ordinal:function(f,c){switch(c){case"d":case"D":case"DDD":return f+"-\u0643\u06c8\u0646\u0649";case"w":case"W":return f+"-\u06be\u06d5\u067e\u062a\u06d5";default:return f}},preparse:function(f){return f.replace(/\u060c/g,",")},postformat:function(f){return f.replace(/,/g,"\u060c")},week:{dow:1,doy:7}})}(i(16738))},74810:function(m,S,i){!function(r){"use strict";function f(y,T,C){return"m"===C?T?"\u0445\u0432\u0438\u043b\u0438\u043d\u0430":"\u0445\u0432\u0438\u043b\u0438\u043d\u0443":"h"===C?T?"\u0433\u043e\u0434\u0438\u043d\u0430":"\u0433\u043e\u0434\u0438\u043d\u0443":y+" "+function a(y,T){var C=y.split("_");return T%10==1&&T%100!=11?C[0]:T%10>=2&&T%10<=4&&(T%100<10||T%100>=20)?C[1]:C[2]}({ss:T?"\u0441\u0435\u043a\u0443\u043d\u0434\u0430_\u0441\u0435\u043a\u0443\u043d\u0434\u0438_\u0441\u0435\u043a\u0443\u043d\u0434":"\u0441\u0435\u043a\u0443\u043d\u0434\u0443_\u0441\u0435\u043a\u0443\u043d\u0434\u0438_\u0441\u0435\u043a\u0443\u043d\u0434",mm:T?"\u0445\u0432\u0438\u043b\u0438\u043d\u0430_\u0445\u0432\u0438\u043b\u0438\u043d\u0438_\u0445\u0432\u0438\u043b\u0438\u043d":"\u0445\u0432\u0438\u043b\u0438\u043d\u0443_\u0445\u0432\u0438\u043b\u0438\u043d\u0438_\u0445\u0432\u0438\u043b\u0438\u043d",hh:T?"\u0433\u043e\u0434\u0438\u043d\u0430_\u0433\u043e\u0434\u0438\u043d\u0438_\u0433\u043e\u0434\u0438\u043d":"\u0433\u043e\u0434\u0438\u043d\u0443_\u0433\u043e\u0434\u0438\u043d\u0438_\u0433\u043e\u0434\u0438\u043d",dd:"\u0434\u0435\u043d\u044c_\u0434\u043d\u0456_\u0434\u043d\u0456\u0432",MM:"\u043c\u0456\u0441\u044f\u0446\u044c_\u043c\u0456\u0441\u044f\u0446\u0456_\u043c\u0456\u0441\u044f\u0446\u0456\u0432",yy:"\u0440\u0456\u043a_\u0440\u043e\u043a\u0438_\u0440\u043e\u043a\u0456\u0432"}[C],+y)}function e(y){return function(){return y+"\u043e"+(11===this.hours()?"\u0431":"")+"] LT"}}r.defineLocale("uk",{months:{format:"\u0441\u0456\u0447\u043d\u044f_\u043b\u044e\u0442\u043e\u0433\u043e_\u0431\u0435\u0440\u0435\u0437\u043d\u044f_\u043a\u0432\u0456\u0442\u043d\u044f_\u0442\u0440\u0430\u0432\u043d\u044f_\u0447\u0435\u0440\u0432\u043d\u044f_\u043b\u0438\u043f\u043d\u044f_\u0441\u0435\u0440\u043f\u043d\u044f_\u0432\u0435\u0440\u0435\u0441\u043d\u044f_\u0436\u043e\u0432\u0442\u043d\u044f_\u043b\u0438\u0441\u0442\u043e\u043f\u0430\u0434\u0430_\u0433\u0440\u0443\u0434\u043d\u044f".split("_"),standalone:"\u0441\u0456\u0447\u0435\u043d\u044c_\u043b\u044e\u0442\u0438\u0439_\u0431\u0435\u0440\u0435\u0437\u0435\u043d\u044c_\u043a\u0432\u0456\u0442\u0435\u043d\u044c_\u0442\u0440\u0430\u0432\u0435\u043d\u044c_\u0447\u0435\u0440\u0432\u0435\u043d\u044c_\u043b\u0438\u043f\u0435\u043d\u044c_\u0441\u0435\u0440\u043f\u0435\u043d\u044c_\u0432\u0435\u0440\u0435\u0441\u0435\u043d\u044c_\u0436\u043e\u0432\u0442\u0435\u043d\u044c_\u043b\u0438\u0441\u0442\u043e\u043f\u0430\u0434_\u0433\u0440\u0443\u0434\u0435\u043d\u044c".split("_")},monthsShort:"\u0441\u0456\u0447_\u043b\u044e\u0442_\u0431\u0435\u0440_\u043a\u0432\u0456\u0442_\u0442\u0440\u0430\u0432_\u0447\u0435\u0440\u0432_\u043b\u0438\u043f_\u0441\u0435\u0440\u043f_\u0432\u0435\u0440_\u0436\u043e\u0432\u0442_\u043b\u0438\u0441\u0442_\u0433\u0440\u0443\u0434".split("_"),weekdays:function c(y,T){var C={nominative:"\u043d\u0435\u0434\u0456\u043b\u044f_\u043f\u043e\u043d\u0435\u0434\u0456\u043b\u043e\u043a_\u0432\u0456\u0432\u0442\u043e\u0440\u043e\u043a_\u0441\u0435\u0440\u0435\u0434\u0430_\u0447\u0435\u0442\u0432\u0435\u0440_\u043f\u2019\u044f\u0442\u043d\u0438\u0446\u044f_\u0441\u0443\u0431\u043e\u0442\u0430".split("_"),accusative:"\u043d\u0435\u0434\u0456\u043b\u044e_\u043f\u043e\u043d\u0435\u0434\u0456\u043b\u043e\u043a_\u0432\u0456\u0432\u0442\u043e\u0440\u043e\u043a_\u0441\u0435\u0440\u0435\u0434\u0443_\u0447\u0435\u0442\u0432\u0435\u0440_\u043f\u2019\u044f\u0442\u043d\u0438\u0446\u044e_\u0441\u0443\u0431\u043e\u0442\u0443".split("_"),genitive:"\u043d\u0435\u0434\u0456\u043b\u0456_\u043f\u043e\u043d\u0435\u0434\u0456\u043b\u043a\u0430_\u0432\u0456\u0432\u0442\u043e\u0440\u043a\u0430_\u0441\u0435\u0440\u0435\u0434\u0438_\u0447\u0435\u0442\u0432\u0435\u0440\u0433\u0430_\u043f\u2019\u044f\u0442\u043d\u0438\u0446\u0456_\u0441\u0443\u0431\u043e\u0442\u0438".split("_")};return!0===y?C.nominative.slice(1,7).concat(C.nominative.slice(0,1)):y?C[/(\[[\u0412\u0432\u0423\u0443]\]) ?dddd/.test(T)?"accusative":/\[?(?:\u043c\u0438\u043d\u0443\u043b\u043e\u0457|\u043d\u0430\u0441\u0442\u0443\u043f\u043d\u043e\u0457)? ?\] ?dddd/.test(T)?"genitive":"nominative"][y.day()]:C.nominative},weekdaysShort:"\u043d\u0434_\u043f\u043d_\u0432\u0442_\u0441\u0440_\u0447\u0442_\u043f\u0442_\u0441\u0431".split("_"),weekdaysMin:"\u043d\u0434_\u043f\u043d_\u0432\u0442_\u0441\u0440_\u0447\u0442_\u043f\u0442_\u0441\u0431".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD.MM.YYYY",LL:"D MMMM YYYY \u0440.",LLL:"D MMMM YYYY \u0440., HH:mm",LLLL:"dddd, D MMMM YYYY \u0440., HH:mm"},calendar:{sameDay:e("[\u0421\u044c\u043e\u0433\u043e\u0434\u043d\u0456 "),nextDay:e("[\u0417\u0430\u0432\u0442\u0440\u0430 "),lastDay:e("[\u0412\u0447\u043e\u0440\u0430 "),nextWeek:e("[\u0423] dddd ["),lastWeek:function(){switch(this.day()){case 0:case 3:case 5:case 6:return e("[\u041c\u0438\u043d\u0443\u043b\u043e\u0457] dddd [").call(this);case 1:case 2:case 4:return e("[\u041c\u0438\u043d\u0443\u043b\u043e\u0433\u043e] dddd [").call(this)}},sameElse:"L"},relativeTime:{future:"\u0437\u0430 %s",past:"%s \u0442\u043e\u043c\u0443",s:"\u0434\u0435\u043a\u0456\u043b\u044c\u043a\u0430 \u0441\u0435\u043a\u0443\u043d\u0434",ss:f,m:f,mm:f,h:"\u0433\u043e\u0434\u0438\u043d\u0443",hh:f,d:"\u0434\u0435\u043d\u044c",dd:f,M:"\u043c\u0456\u0441\u044f\u0446\u044c",MM:f,y:"\u0440\u0456\u043a",yy:f},meridiemParse:/\u043d\u043e\u0447\u0456|\u0440\u0430\u043d\u043a\u0443|\u0434\u043d\u044f|\u0432\u0435\u0447\u043e\u0440\u0430/,isPM:function(y){return/^(\u0434\u043d\u044f|\u0432\u0435\u0447\u043e\u0440\u0430)$/.test(y)},meridiem:function(y,T,C){return y<4?"\u043d\u043e\u0447\u0456":y<12?"\u0440\u0430\u043d\u043a\u0443":y<17?"\u0434\u043d\u044f":"\u0432\u0435\u0447\u043e\u0440\u0430"},dayOfMonthOrdinalParse:/\d{1,2}-(\u0439|\u0433\u043e)/,ordinal:function(y,T){switch(T){case"M":case"d":case"DDD":case"w":case"W":return y+"-\u0439";case"D":return y+"-\u0433\u043e";default:return y}},week:{dow:1,doy:7}})}(i(16738))},86794:function(m,S,i){!function(r){"use strict";var a=["\u062c\u0646\u0648\u0631\u06cc","\u0641\u0631\u0648\u0631\u06cc","\u0645\u0627\u0631\u0686","\u0627\u067e\u0631\u06cc\u0644","\u0645\u0626\u06cc","\u062c\u0648\u0646","\u062c\u0648\u0644\u0627\u0626\u06cc","\u0627\u06af\u0633\u062a","\u0633\u062a\u0645\u0628\u0631","\u0627\u06a9\u062a\u0648\u0628\u0631","\u0646\u0648\u0645\u0628\u0631","\u062f\u0633\u0645\u0628\u0631"],f=["\u0627\u062a\u0648\u0627\u0631","\u067e\u06cc\u0631","\u0645\u0646\u06af\u0644","\u0628\u062f\u06be","\u062c\u0645\u0639\u0631\u0627\u062a","\u062c\u0645\u0639\u06c1","\u06c1\u0641\u062a\u06c1"];r.defineLocale("ur",{months:a,monthsShort:a,weekdays:f,weekdaysShort:f,weekdaysMin:f,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd\u060c D MMMM YYYY HH:mm"},meridiemParse:/\u0635\u0628\u062d|\u0634\u0627\u0645/,isPM:function(e){return"\u0634\u0627\u0645"===e},meridiem:function(e,p,y){return e<12?"\u0635\u0628\u062d":"\u0634\u0627\u0645"},calendar:{sameDay:"[\u0622\u062c \u0628\u0648\u0642\u062a] LT",nextDay:"[\u06a9\u0644 \u0628\u0648\u0642\u062a] LT",nextWeek:"dddd [\u0628\u0648\u0642\u062a] LT",lastDay:"[\u06af\u0630\u0634\u062a\u06c1 \u0631\u0648\u0632 \u0628\u0648\u0642\u062a] LT",lastWeek:"[\u06af\u0630\u0634\u062a\u06c1] dddd [\u0628\u0648\u0642\u062a] LT",sameElse:"L"},relativeTime:{future:"%s \u0628\u0639\u062f",past:"%s \u0642\u0628\u0644",s:"\u0686\u0646\u062f \u0633\u06cc\u06a9\u0646\u0688",ss:"%d \u0633\u06cc\u06a9\u0646\u0688",m:"\u0627\u06cc\u06a9 \u0645\u0646\u0679",mm:"%d \u0645\u0646\u0679",h:"\u0627\u06cc\u06a9 \u06af\u06be\u0646\u0679\u06c1",hh:"%d \u06af\u06be\u0646\u0679\u06d2",d:"\u0627\u06cc\u06a9 \u062f\u0646",dd:"%d \u062f\u0646",M:"\u0627\u06cc\u06a9 \u0645\u0627\u06c1",MM:"%d \u0645\u0627\u06c1",y:"\u0627\u06cc\u06a9 \u0633\u0627\u0644",yy:"%d \u0633\u0627\u0644"},preparse:function(e){return e.replace(/\u060c/g,",")},postformat:function(e){return e.replace(/,/g,"\u060c")},week:{dow:1,doy:4}})}(i(16738))},77959:function(m,S,i){!function(r){"use strict";r.defineLocale("uz-latn",{months:"Yanvar_Fevral_Mart_Aprel_May_Iyun_Iyul_Avgust_Sentabr_Oktabr_Noyabr_Dekabr".split("_"),monthsShort:"Yan_Fev_Mar_Apr_May_Iyun_Iyul_Avg_Sen_Okt_Noy_Dek".split("_"),weekdays:"Yakshanba_Dushanba_Seshanba_Chorshanba_Payshanba_Juma_Shanba".split("_"),weekdaysShort:"Yak_Dush_Sesh_Chor_Pay_Jum_Shan".split("_"),weekdaysMin:"Ya_Du_Se_Cho_Pa_Ju_Sha".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"D MMMM YYYY, dddd HH:mm"},calendar:{sameDay:"[Bugun soat] LT [da]",nextDay:"[Ertaga] LT [da]",nextWeek:"dddd [kuni soat] LT [da]",lastDay:"[Kecha soat] LT [da]",lastWeek:"[O'tgan] dddd [kuni soat] LT [da]",sameElse:"L"},relativeTime:{future:"Yaqin %s ichida",past:"Bir necha %s oldin",s:"soniya",ss:"%d soniya",m:"bir daqiqa",mm:"%d daqiqa",h:"bir soat",hh:"%d soat",d:"bir kun",dd:"%d kun",M:"bir oy",MM:"%d oy",y:"bir yil",yy:"%d yil"},week:{dow:1,doy:7}})}(i(16738))},28966:function(m,S,i){!function(r){"use strict";r.defineLocale("uz",{months:"\u044f\u043d\u0432\u0430\u0440_\u0444\u0435\u0432\u0440\u0430\u043b_\u043c\u0430\u0440\u0442_\u0430\u043f\u0440\u0435\u043b_\u043c\u0430\u0439_\u0438\u044e\u043d_\u0438\u044e\u043b_\u0430\u0432\u0433\u0443\u0441\u0442_\u0441\u0435\u043d\u0442\u044f\u0431\u0440_\u043e\u043a\u0442\u044f\u0431\u0440_\u043d\u043e\u044f\u0431\u0440_\u0434\u0435\u043a\u0430\u0431\u0440".split("_"),monthsShort:"\u044f\u043d\u0432_\u0444\u0435\u0432_\u043c\u0430\u0440_\u0430\u043f\u0440_\u043c\u0430\u0439_\u0438\u044e\u043d_\u0438\u044e\u043b_\u0430\u0432\u0433_\u0441\u0435\u043d_\u043e\u043a\u0442_\u043d\u043e\u044f_\u0434\u0435\u043a".split("_"),weekdays:"\u042f\u043a\u0448\u0430\u043d\u0431\u0430_\u0414\u0443\u0448\u0430\u043d\u0431\u0430_\u0421\u0435\u0448\u0430\u043d\u0431\u0430_\u0427\u043e\u0440\u0448\u0430\u043d\u0431\u0430_\u041f\u0430\u0439\u0448\u0430\u043d\u0431\u0430_\u0416\u0443\u043c\u0430_\u0428\u0430\u043d\u0431\u0430".split("_"),weekdaysShort:"\u042f\u043a\u0448_\u0414\u0443\u0448_\u0421\u0435\u0448_\u0427\u043e\u0440_\u041f\u0430\u0439_\u0416\u0443\u043c_\u0428\u0430\u043d".split("_"),weekdaysMin:"\u042f\u043a_\u0414\u0443_\u0421\u0435_\u0427\u043e_\u041f\u0430_\u0416\u0443_\u0428\u0430".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"D MMMM YYYY, dddd HH:mm"},calendar:{sameDay:"[\u0411\u0443\u0433\u0443\u043d \u0441\u043e\u0430\u0442] LT [\u0434\u0430]",nextDay:"[\u042d\u0440\u0442\u0430\u0433\u0430] LT [\u0434\u0430]",nextWeek:"dddd [\u043a\u0443\u043d\u0438 \u0441\u043e\u0430\u0442] LT [\u0434\u0430]",lastDay:"[\u041a\u0435\u0447\u0430 \u0441\u043e\u0430\u0442] LT [\u0434\u0430]",lastWeek:"[\u0423\u0442\u0433\u0430\u043d] dddd [\u043a\u0443\u043d\u0438 \u0441\u043e\u0430\u0442] LT [\u0434\u0430]",sameElse:"L"},relativeTime:{future:"\u042f\u043a\u0438\u043d %s \u0438\u0447\u0438\u0434\u0430",past:"\u0411\u0438\u0440 \u043d\u0435\u0447\u0430 %s \u043e\u043b\u0434\u0438\u043d",s:"\u0444\u0443\u0440\u0441\u0430\u0442",ss:"%d \u0444\u0443\u0440\u0441\u0430\u0442",m:"\u0431\u0438\u0440 \u0434\u0430\u043a\u0438\u043a\u0430",mm:"%d \u0434\u0430\u043a\u0438\u043a\u0430",h:"\u0431\u0438\u0440 \u0441\u043e\u0430\u0442",hh:"%d \u0441\u043e\u0430\u0442",d:"\u0431\u0438\u0440 \u043a\u0443\u043d",dd:"%d \u043a\u0443\u043d",M:"\u0431\u0438\u0440 \u043e\u0439",MM:"%d \u043e\u0439",y:"\u0431\u0438\u0440 \u0439\u0438\u043b",yy:"%d \u0439\u0438\u043b"},week:{dow:1,doy:7}})}(i(16738))},35386:function(m,S,i){!function(r){"use strict";r.defineLocale("vi",{months:"th\xe1ng 1_th\xe1ng 2_th\xe1ng 3_th\xe1ng 4_th\xe1ng 5_th\xe1ng 6_th\xe1ng 7_th\xe1ng 8_th\xe1ng 9_th\xe1ng 10_th\xe1ng 11_th\xe1ng 12".split("_"),monthsShort:"Thg 01_Thg 02_Thg 03_Thg 04_Thg 05_Thg 06_Thg 07_Thg 08_Thg 09_Thg 10_Thg 11_Thg 12".split("_"),monthsParseExact:!0,weekdays:"ch\u1ee7 nh\u1eadt_th\u1ee9 hai_th\u1ee9 ba_th\u1ee9 t\u01b0_th\u1ee9 n\u0103m_th\u1ee9 s\xe1u_th\u1ee9 b\u1ea3y".split("_"),weekdaysShort:"CN_T2_T3_T4_T5_T6_T7".split("_"),weekdaysMin:"CN_T2_T3_T4_T5_T6_T7".split("_"),weekdaysParseExact:!0,meridiemParse:/sa|ch/i,isPM:function(f){return/^ch$/i.test(f)},meridiem:function(f,c,e){return f<12?e?"sa":"SA":e?"ch":"CH"},longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM [n\u0103m] YYYY",LLL:"D MMMM [n\u0103m] YYYY HH:mm",LLLL:"dddd, D MMMM [n\u0103m] YYYY HH:mm",l:"DD/M/YYYY",ll:"D MMM YYYY",lll:"D MMM YYYY HH:mm",llll:"ddd, D MMM YYYY HH:mm"},calendar:{sameDay:"[H\xf4m nay l\xfac] LT",nextDay:"[Ng\xe0y mai l\xfac] LT",nextWeek:"dddd [tu\u1ea7n t\u1edbi l\xfac] LT",lastDay:"[H\xf4m qua l\xfac] LT",lastWeek:"dddd [tu\u1ea7n tr\u01b0\u1edbc l\xfac] LT",sameElse:"L"},relativeTime:{future:"%s t\u1edbi",past:"%s tr\u01b0\u1edbc",s:"v\xe0i gi\xe2y",ss:"%d gi\xe2y",m:"m\u1ed9t ph\xfat",mm:"%d ph\xfat",h:"m\u1ed9t gi\u1edd",hh:"%d gi\u1edd",d:"m\u1ed9t ng\xe0y",dd:"%d ng\xe0y",w:"m\u1ed9t tu\u1ea7n",ww:"%d tu\u1ea7n",M:"m\u1ed9t th\xe1ng",MM:"%d th\xe1ng",y:"m\u1ed9t n\u0103m",yy:"%d n\u0103m"},dayOfMonthOrdinalParse:/\d{1,2}/,ordinal:function(f){return f},week:{dow:1,doy:4}})}(i(16738))},23156:function(m,S,i){!function(r){"use strict";r.defineLocale("x-pseudo",{months:"J~\xe1\xf1\xfa\xe1~r\xfd_F~\xe9br\xfa~\xe1r\xfd_~M\xe1rc~h_\xc1p~r\xedl_~M\xe1\xfd_~J\xfa\xf1\xe9~_J\xfal~\xfd_\xc1\xfa~g\xfast~_S\xe9p~t\xe9mb~\xe9r_\xd3~ct\xf3b~\xe9r_\xd1~\xf3v\xe9m~b\xe9r_~D\xe9c\xe9~mb\xe9r".split("_"),monthsShort:"J~\xe1\xf1_~F\xe9b_~M\xe1r_~\xc1pr_~M\xe1\xfd_~J\xfa\xf1_~J\xfal_~\xc1\xfag_~S\xe9p_~\xd3ct_~\xd1\xf3v_~D\xe9c".split("_"),monthsParseExact:!0,weekdays:"S~\xfa\xf1d\xe1~\xfd_M\xf3~\xf1d\xe1\xfd~_T\xfa\xe9~sd\xe1\xfd~_W\xe9d~\xf1\xe9sd~\xe1\xfd_T~h\xfars~d\xe1\xfd_~Fr\xedd~\xe1\xfd_S~\xe1t\xfar~d\xe1\xfd".split("_"),weekdaysShort:"S~\xfa\xf1_~M\xf3\xf1_~T\xfa\xe9_~W\xe9d_~Th\xfa_~Fr\xed_~S\xe1t".split("_"),weekdaysMin:"S~\xfa_M\xf3~_T\xfa_~W\xe9_T~h_Fr~_S\xe1".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd, D MMMM YYYY HH:mm"},calendar:{sameDay:"[T~\xf3d\xe1~\xfd \xe1t] LT",nextDay:"[T~\xf3m\xf3~rr\xf3~w \xe1t] LT",nextWeek:"dddd [\xe1t] LT",lastDay:"[\xdd~\xe9st~\xe9rd\xe1~\xfd \xe1t] LT",lastWeek:"[L~\xe1st] dddd [\xe1t] LT",sameElse:"L"},relativeTime:{future:"\xed~\xf1 %s",past:"%s \xe1~g\xf3",s:"\xe1 ~f\xe9w ~s\xe9c\xf3~\xf1ds",ss:"%d s~\xe9c\xf3\xf1~ds",m:"\xe1 ~m\xed\xf1~\xfat\xe9",mm:"%d m~\xed\xf1\xfa~t\xe9s",h:"\xe1~\xf1 h\xf3~\xfar",hh:"%d h~\xf3\xfars",d:"\xe1 ~d\xe1\xfd",dd:"%d d~\xe1\xfds",M:"\xe1 ~m\xf3\xf1~th",MM:"%d m~\xf3\xf1t~hs",y:"\xe1 ~\xfd\xe9\xe1r",yy:"%d \xfd~\xe9\xe1rs"},dayOfMonthOrdinalParse:/\d{1,2}(th|st|nd|rd)/,ordinal:function(f){var c=f%10;return f+(1==~~(f%100/10)?"th":1===c?"st":2===c?"nd":3===c?"rd":"th")},week:{dow:1,doy:4}})}(i(16738))},68028:function(m,S,i){!function(r){"use strict";r.defineLocale("yo",{months:"S\u1eb9\u0301r\u1eb9\u0301_E\u0300re\u0300le\u0300_\u1eb8r\u1eb9\u0300na\u0300_I\u0300gbe\u0301_E\u0300bibi_O\u0300ku\u0300du_Ag\u1eb9mo_O\u0300gu\u0301n_Owewe_\u1ecc\u0300wa\u0300ra\u0300_Be\u0301lu\u0301_\u1ecc\u0300p\u1eb9\u0300\u0300".split("_"),monthsShort:"S\u1eb9\u0301r_E\u0300rl_\u1eb8rn_I\u0300gb_E\u0300bi_O\u0300ku\u0300_Ag\u1eb9_O\u0300gu\u0301_Owe_\u1ecc\u0300wa\u0300_Be\u0301l_\u1ecc\u0300p\u1eb9\u0300\u0300".split("_"),weekdays:"A\u0300i\u0300ku\u0301_Aje\u0301_I\u0300s\u1eb9\u0301gun_\u1eccj\u1ecd\u0301ru\u0301_\u1eccj\u1ecd\u0301b\u1ecd_\u1eb8ti\u0300_A\u0300ba\u0301m\u1eb9\u0301ta".split("_"),weekdaysShort:"A\u0300i\u0300k_Aje\u0301_I\u0300s\u1eb9\u0301_\u1eccjr_\u1eccjb_\u1eb8ti\u0300_A\u0300ba\u0301".split("_"),weekdaysMin:"A\u0300i\u0300_Aj_I\u0300s_\u1eccr_\u1eccb_\u1eb8t_A\u0300b".split("_"),longDateFormat:{LT:"h:mm A",LTS:"h:mm:ss A",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY h:mm A",LLLL:"dddd, D MMMM YYYY h:mm A"},calendar:{sameDay:"[O\u0300ni\u0300 ni] LT",nextDay:"[\u1ecc\u0300la ni] LT",nextWeek:"dddd [\u1eccs\u1eb9\u0300 to\u0301n'b\u1ecd] [ni] LT",lastDay:"[A\u0300na ni] LT",lastWeek:"dddd [\u1eccs\u1eb9\u0300 to\u0301l\u1ecd\u0301] [ni] LT",sameElse:"L"},relativeTime:{future:"ni\u0301 %s",past:"%s k\u1ecdja\u0301",s:"i\u0300s\u1eb9ju\u0301 aaya\u0301 die",ss:"aaya\u0301 %d",m:"i\u0300s\u1eb9ju\u0301 kan",mm:"i\u0300s\u1eb9ju\u0301 %d",h:"wa\u0301kati kan",hh:"wa\u0301kati %d",d:"\u1ecdj\u1ecd\u0301 kan",dd:"\u1ecdj\u1ecd\u0301 %d",M:"osu\u0300 kan",MM:"osu\u0300 %d",y:"\u1ecddu\u0301n kan",yy:"\u1ecddu\u0301n %d"},dayOfMonthOrdinalParse:/\u1ecdj\u1ecd\u0301\s\d{1,2}/,ordinal:"\u1ecdj\u1ecd\u0301 %d",week:{dow:1,doy:4}})}(i(16738))},9330:function(m,S,i){!function(r){"use strict";r.defineLocale("zh-cn",{months:"\u4e00\u6708_\u4e8c\u6708_\u4e09\u6708_\u56db\u6708_\u4e94\u6708_\u516d\u6708_\u4e03\u6708_\u516b\u6708_\u4e5d\u6708_\u5341\u6708_\u5341\u4e00\u6708_\u5341\u4e8c\u6708".split("_"),monthsShort:"1\u6708_2\u6708_3\u6708_4\u6708_5\u6708_6\u6708_7\u6708_8\u6708_9\u6708_10\u6708_11\u6708_12\u6708".split("_"),weekdays:"\u661f\u671f\u65e5_\u661f\u671f\u4e00_\u661f\u671f\u4e8c_\u661f\u671f\u4e09_\u661f\u671f\u56db_\u661f\u671f\u4e94_\u661f\u671f\u516d".split("_"),weekdaysShort:"\u5468\u65e5_\u5468\u4e00_\u5468\u4e8c_\u5468\u4e09_\u5468\u56db_\u5468\u4e94_\u5468\u516d".split("_"),weekdaysMin:"\u65e5_\u4e00_\u4e8c_\u4e09_\u56db_\u4e94_\u516d".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"YYYY/MM/DD",LL:"YYYY\u5e74M\u6708D\u65e5",LLL:"YYYY\u5e74M\u6708D\u65e5Ah\u70b9mm\u5206",LLLL:"YYYY\u5e74M\u6708D\u65e5ddddAh\u70b9mm\u5206",l:"YYYY/M/D",ll:"YYYY\u5e74M\u6708D\u65e5",lll:"YYYY\u5e74M\u6708D\u65e5 HH:mm",llll:"YYYY\u5e74M\u6708D\u65e5dddd HH:mm"},meridiemParse:/\u51cc\u6668|\u65e9\u4e0a|\u4e0a\u5348|\u4e2d\u5348|\u4e0b\u5348|\u665a\u4e0a/,meridiemHour:function(f,c){return 12===f&&(f=0),"\u51cc\u6668"===c||"\u65e9\u4e0a"===c||"\u4e0a\u5348"===c?f:"\u4e0b\u5348"===c||"\u665a\u4e0a"===c?f+12:f>=11?f:f+12},meridiem:function(f,c,e){var p=100*f+c;return p<600?"\u51cc\u6668":p<900?"\u65e9\u4e0a":p<1130?"\u4e0a\u5348":p<1230?"\u4e2d\u5348":p<1800?"\u4e0b\u5348":"\u665a\u4e0a"},calendar:{sameDay:"[\u4eca\u5929]LT",nextDay:"[\u660e\u5929]LT",nextWeek:function(f){return f.week()!==this.week()?"[\u4e0b]dddLT":"[\u672c]dddLT"},lastDay:"[\u6628\u5929]LT",lastWeek:function(f){return this.week()!==f.week()?"[\u4e0a]dddLT":"[\u672c]dddLT"},sameElse:"L"},dayOfMonthOrdinalParse:/\d{1,2}(\u65e5|\u6708|\u5468)/,ordinal:function(f,c){switch(c){case"d":case"D":case"DDD":return f+"\u65e5";case"M":return f+"\u6708";case"w":case"W":return f+"\u5468";default:return f}},relativeTime:{future:"%s\u540e",past:"%s\u524d",s:"\u51e0\u79d2",ss:"%d \u79d2",m:"1 \u5206\u949f",mm:"%d \u5206\u949f",h:"1 \u5c0f\u65f6",hh:"%d \u5c0f\u65f6",d:"1 \u5929",dd:"%d \u5929",w:"1 \u5468",ww:"%d \u5468",M:"1 \u4e2a\u6708",MM:"%d \u4e2a\u6708",y:"1 \u5e74",yy:"%d \u5e74"},week:{dow:1,doy:4}})}(i(16738))},89380:function(m,S,i){!function(r){"use strict";r.defineLocale("zh-hk",{months:"\u4e00\u6708_\u4e8c\u6708_\u4e09\u6708_\u56db\u6708_\u4e94\u6708_\u516d\u6708_\u4e03\u6708_\u516b\u6708_\u4e5d\u6708_\u5341\u6708_\u5341\u4e00\u6708_\u5341\u4e8c\u6708".split("_"),monthsShort:"1\u6708_2\u6708_3\u6708_4\u6708_5\u6708_6\u6708_7\u6708_8\u6708_9\u6708_10\u6708_11\u6708_12\u6708".split("_"),weekdays:"\u661f\u671f\u65e5_\u661f\u671f\u4e00_\u661f\u671f\u4e8c_\u661f\u671f\u4e09_\u661f\u671f\u56db_\u661f\u671f\u4e94_\u661f\u671f\u516d".split("_"),weekdaysShort:"\u9031\u65e5_\u9031\u4e00_\u9031\u4e8c_\u9031\u4e09_\u9031\u56db_\u9031\u4e94_\u9031\u516d".split("_"),weekdaysMin:"\u65e5_\u4e00_\u4e8c_\u4e09_\u56db_\u4e94_\u516d".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"YYYY/MM/DD",LL:"YYYY\u5e74M\u6708D\u65e5",LLL:"YYYY\u5e74M\u6708D\u65e5 HH:mm",LLLL:"YYYY\u5e74M\u6708D\u65e5dddd HH:mm",l:"YYYY/M/D",ll:"YYYY\u5e74M\u6708D\u65e5",lll:"YYYY\u5e74M\u6708D\u65e5 HH:mm",llll:"YYYY\u5e74M\u6708D\u65e5dddd HH:mm"},meridiemParse:/\u51cc\u6668|\u65e9\u4e0a|\u4e0a\u5348|\u4e2d\u5348|\u4e0b\u5348|\u665a\u4e0a/,meridiemHour:function(f,c){return 12===f&&(f=0),"\u51cc\u6668"===c||"\u65e9\u4e0a"===c||"\u4e0a\u5348"===c?f:"\u4e2d\u5348"===c?f>=11?f:f+12:"\u4e0b\u5348"===c||"\u665a\u4e0a"===c?f+12:void 0},meridiem:function(f,c,e){var p=100*f+c;return p<600?"\u51cc\u6668":p<900?"\u65e9\u4e0a":p<1200?"\u4e0a\u5348":1200===p?"\u4e2d\u5348":p<1800?"\u4e0b\u5348":"\u665a\u4e0a"},calendar:{sameDay:"[\u4eca\u5929]LT",nextDay:"[\u660e\u5929]LT",nextWeek:"[\u4e0b]ddddLT",lastDay:"[\u6628\u5929]LT",lastWeek:"[\u4e0a]ddddLT",sameElse:"L"},dayOfMonthOrdinalParse:/\d{1,2}(\u65e5|\u6708|\u9031)/,ordinal:function(f,c){switch(c){case"d":case"D":case"DDD":return f+"\u65e5";case"M":return f+"\u6708";case"w":case"W":return f+"\u9031";default:return f}},relativeTime:{future:"%s\u5f8c",past:"%s\u524d",s:"\u5e7e\u79d2",ss:"%d \u79d2",m:"1 \u5206\u9418",mm:"%d \u5206\u9418",h:"1 \u5c0f\u6642",hh:"%d \u5c0f\u6642",d:"1 \u5929",dd:"%d \u5929",M:"1 \u500b\u6708",MM:"%d \u500b\u6708",y:"1 \u5e74",yy:"%d \u5e74"}})}(i(16738))},60874:function(m,S,i){!function(r){"use strict";r.defineLocale("zh-mo",{months:"\u4e00\u6708_\u4e8c\u6708_\u4e09\u6708_\u56db\u6708_\u4e94\u6708_\u516d\u6708_\u4e03\u6708_\u516b\u6708_\u4e5d\u6708_\u5341\u6708_\u5341\u4e00\u6708_\u5341\u4e8c\u6708".split("_"),monthsShort:"1\u6708_2\u6708_3\u6708_4\u6708_5\u6708_6\u6708_7\u6708_8\u6708_9\u6708_10\u6708_11\u6708_12\u6708".split("_"),weekdays:"\u661f\u671f\u65e5_\u661f\u671f\u4e00_\u661f\u671f\u4e8c_\u661f\u671f\u4e09_\u661f\u671f\u56db_\u661f\u671f\u4e94_\u661f\u671f\u516d".split("_"),weekdaysShort:"\u9031\u65e5_\u9031\u4e00_\u9031\u4e8c_\u9031\u4e09_\u9031\u56db_\u9031\u4e94_\u9031\u516d".split("_"),weekdaysMin:"\u65e5_\u4e00_\u4e8c_\u4e09_\u56db_\u4e94_\u516d".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"YYYY\u5e74M\u6708D\u65e5",LLL:"YYYY\u5e74M\u6708D\u65e5 HH:mm",LLLL:"YYYY\u5e74M\u6708D\u65e5dddd HH:mm",l:"D/M/YYYY",ll:"YYYY\u5e74M\u6708D\u65e5",lll:"YYYY\u5e74M\u6708D\u65e5 HH:mm",llll:"YYYY\u5e74M\u6708D\u65e5dddd HH:mm"},meridiemParse:/\u51cc\u6668|\u65e9\u4e0a|\u4e0a\u5348|\u4e2d\u5348|\u4e0b\u5348|\u665a\u4e0a/,meridiemHour:function(f,c){return 12===f&&(f=0),"\u51cc\u6668"===c||"\u65e9\u4e0a"===c||"\u4e0a\u5348"===c?f:"\u4e2d\u5348"===c?f>=11?f:f+12:"\u4e0b\u5348"===c||"\u665a\u4e0a"===c?f+12:void 0},meridiem:function(f,c,e){var p=100*f+c;return p<600?"\u51cc\u6668":p<900?"\u65e9\u4e0a":p<1130?"\u4e0a\u5348":p<1230?"\u4e2d\u5348":p<1800?"\u4e0b\u5348":"\u665a\u4e0a"},calendar:{sameDay:"[\u4eca\u5929] LT",nextDay:"[\u660e\u5929] LT",nextWeek:"[\u4e0b]dddd LT",lastDay:"[\u6628\u5929] LT",lastWeek:"[\u4e0a]dddd LT",sameElse:"L"},dayOfMonthOrdinalParse:/\d{1,2}(\u65e5|\u6708|\u9031)/,ordinal:function(f,c){switch(c){case"d":case"D":case"DDD":return f+"\u65e5";case"M":return f+"\u6708";case"w":case"W":return f+"\u9031";default:return f}},relativeTime:{future:"%s\u5167",past:"%s\u524d",s:"\u5e7e\u79d2",ss:"%d \u79d2",m:"1 \u5206\u9418",mm:"%d \u5206\u9418",h:"1 \u5c0f\u6642",hh:"%d \u5c0f\u6642",d:"1 \u5929",dd:"%d \u5929",M:"1 \u500b\u6708",MM:"%d \u500b\u6708",y:"1 \u5e74",yy:"%d \u5e74"}})}(i(16738))},96508:function(m,S,i){!function(r){"use strict";r.defineLocale("zh-tw",{months:"\u4e00\u6708_\u4e8c\u6708_\u4e09\u6708_\u56db\u6708_\u4e94\u6708_\u516d\u6708_\u4e03\u6708_\u516b\u6708_\u4e5d\u6708_\u5341\u6708_\u5341\u4e00\u6708_\u5341\u4e8c\u6708".split("_"),monthsShort:"1\u6708_2\u6708_3\u6708_4\u6708_5\u6708_6\u6708_7\u6708_8\u6708_9\u6708_10\u6708_11\u6708_12\u6708".split("_"),weekdays:"\u661f\u671f\u65e5_\u661f\u671f\u4e00_\u661f\u671f\u4e8c_\u661f\u671f\u4e09_\u661f\u671f\u56db_\u661f\u671f\u4e94_\u661f\u671f\u516d".split("_"),weekdaysShort:"\u9031\u65e5_\u9031\u4e00_\u9031\u4e8c_\u9031\u4e09_\u9031\u56db_\u9031\u4e94_\u9031\u516d".split("_"),weekdaysMin:"\u65e5_\u4e00_\u4e8c_\u4e09_\u56db_\u4e94_\u516d".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"YYYY/MM/DD",LL:"YYYY\u5e74M\u6708D\u65e5",LLL:"YYYY\u5e74M\u6708D\u65e5 HH:mm",LLLL:"YYYY\u5e74M\u6708D\u65e5dddd HH:mm",l:"YYYY/M/D",ll:"YYYY\u5e74M\u6708D\u65e5",lll:"YYYY\u5e74M\u6708D\u65e5 HH:mm",llll:"YYYY\u5e74M\u6708D\u65e5dddd HH:mm"},meridiemParse:/\u51cc\u6668|\u65e9\u4e0a|\u4e0a\u5348|\u4e2d\u5348|\u4e0b\u5348|\u665a\u4e0a/,meridiemHour:function(f,c){return 12===f&&(f=0),"\u51cc\u6668"===c||"\u65e9\u4e0a"===c||"\u4e0a\u5348"===c?f:"\u4e2d\u5348"===c?f>=11?f:f+12:"\u4e0b\u5348"===c||"\u665a\u4e0a"===c?f+12:void 0},meridiem:function(f,c,e){var p=100*f+c;return p<600?"\u51cc\u6668":p<900?"\u65e9\u4e0a":p<1130?"\u4e0a\u5348":p<1230?"\u4e2d\u5348":p<1800?"\u4e0b\u5348":"\u665a\u4e0a"},calendar:{sameDay:"[\u4eca\u5929] LT",nextDay:"[\u660e\u5929] LT",nextWeek:"[\u4e0b]dddd LT",lastDay:"[\u6628\u5929] LT",lastWeek:"[\u4e0a]dddd LT",sameElse:"L"},dayOfMonthOrdinalParse:/\d{1,2}(\u65e5|\u6708|\u9031)/,ordinal:function(f,c){switch(c){case"d":case"D":case"DDD":return f+"\u65e5";case"M":return f+"\u6708";case"w":case"W":return f+"\u9031";default:return f}},relativeTime:{future:"%s\u5f8c",past:"%s\u524d",s:"\u5e7e\u79d2",ss:"%d \u79d2",m:"1 \u5206\u9418",mm:"%d \u5206\u9418",h:"1 \u5c0f\u6642",hh:"%d \u5c0f\u6642",d:"1 \u5929",dd:"%d \u5929",M:"1 \u500b\u6708",MM:"%d \u500b\u6708",y:"1 \u5e74",yy:"%d \u5e74"}})}(i(16738))},16738:function(m,S,i){(m=i.nmd(m)).exports=function(){"use strict";var r,ce;function a(){return r.apply(null,arguments)}function c(K){return K instanceof Array||"[object Array]"===Object.prototype.toString.call(K)}function e(K){return null!=K&&"[object Object]"===Object.prototype.toString.call(K)}function p(K,Ee){return Object.prototype.hasOwnProperty.call(K,Ee)}function y(K){if(Object.getOwnPropertyNames)return 0===Object.getOwnPropertyNames(K).length;var Ee;for(Ee in K)if(p(K,Ee))return!1;return!0}function T(K){return void 0===K}function C(K){return"number"==typeof K||"[object Number]"===Object.prototype.toString.call(K)}function R(K){return K instanceof Date||"[object Date]"===Object.prototype.toString.call(K)}function L(K,Ee){var Tt,et=[],Xt=K.length;for(Tt=0;Tt<Xt;++Tt)et.push(Ee(K[Tt],Tt));return et}function z(K,Ee){for(var et in Ee)p(Ee,et)&&(K[et]=Ee[et]);return p(Ee,"toString")&&(K.toString=Ee.toString),p(Ee,"valueOf")&&(K.valueOf=Ee.valueOf),K}function W(K,Ee,et,Tt){return nu(K,Ee,et,Tt,!0).utc()}function ee(K){return null==K._pf&&(K._pf={empty:!1,unusedTokens:[],unusedInput:[],overflow:-2,charsLeftOver:0,nullInput:!1,invalidEra:null,invalidMonth:null,invalidFormat:!1,userInvalidated:!1,iso:!1,parsedDateParts:[],era:null,meridiem:null,rfc2822:!1,weekdayMismatch:!1}),K._pf}function ie(K){if(null==K._isValid){var Ee=ee(K),et=ce.call(Ee.parsedDateParts,function(Xt){return null!=Xt}),Tt=!isNaN(K._d.getTime())&&Ee.overflow<0&&!Ee.empty&&!Ee.invalidEra&&!Ee.invalidMonth&&!Ee.invalidWeekday&&!Ee.weekdayMismatch&&!Ee.nullInput&&!Ee.invalidFormat&&!Ee.userInvalidated&&(!Ee.meridiem||Ee.meridiem&&et);if(K._strict&&(Tt=Tt&&0===Ee.charsLeftOver&&0===Ee.unusedTokens.length&&void 0===Ee.bigHour),null!=Object.isFrozen&&Object.isFrozen(K))return Tt;K._isValid=Tt}return K._isValid}function U(K){var Ee=W(NaN);return null!=K?z(ee(Ee),K):ee(Ee).userInvalidated=!0,Ee}ce=Array.prototype.some?Array.prototype.some:function(K){var Tt,Ee=Object(this),et=Ee.length>>>0;for(Tt=0;Tt<et;Tt++)if(Tt in Ee&&K.call(this,Ee[Tt],Tt,Ee))return!0;return!1};var se=a.momentProperties=[],ge=!1;function ae(K,Ee){var et,Tt,Xt,Tr=se.length;if(T(Ee._isAMomentObject)||(K._isAMomentObject=Ee._isAMomentObject),T(Ee._i)||(K._i=Ee._i),T(Ee._f)||(K._f=Ee._f),T(Ee._l)||(K._l=Ee._l),T(Ee._strict)||(K._strict=Ee._strict),T(Ee._tzm)||(K._tzm=Ee._tzm),T(Ee._isUTC)||(K._isUTC=Ee._isUTC),T(Ee._offset)||(K._offset=Ee._offset),T(Ee._pf)||(K._pf=ee(Ee)),T(Ee._locale)||(K._locale=Ee._locale),Tr>0)for(et=0;et<Tr;et++)T(Xt=Ee[Tt=se[et]])||(K[Tt]=Xt);return K}function he(K){ae(this,K),this._d=new Date(null!=K._d?K._d.getTime():NaN),this.isValid()||(this._d=new Date(NaN)),!1===ge&&(ge=!0,a.updateOffset(this),ge=!1)}function be(K){return K instanceof he||null!=K&&null!=K._isAMomentObject}function we(K){!1===a.suppressDeprecationWarnings&&"undefined"!=typeof console&&console.warn&&console.warn("Deprecation warning: "+K)}function ue(K,Ee){var et=!0;return z(function(){if(null!=a.deprecationHandler&&a.deprecationHandler(null,K),et){var Xt,Tr,Si,Tt=[],gs=arguments.length;for(Tr=0;Tr<gs;Tr++){if(Xt="","object"==typeof arguments[Tr]){for(Si in Xt+="\n["+Tr+"] ",arguments[0])p(arguments[0],Si)&&(Xt+=Si+": "+arguments[0][Si]+", ");Xt=Xt.slice(0,-2)}else Xt=arguments[Tr];Tt.push(Xt)}we(K+"\nArguments: "+Array.prototype.slice.call(Tt).join("")+"\n"+(new Error).stack),et=!1}return Ee.apply(this,arguments)},Ee)}var Ne,st={};function We(K,Ee){null!=a.deprecationHandler&&a.deprecationHandler(K,Ee),st[K]||(we(Ee),st[K]=!0)}function Ve(K){return"undefined"!=typeof Function&&K instanceof Function||"[object Function]"===Object.prototype.toString.call(K)}function xe(K,Ee){var Tt,et=z({},K);for(Tt in Ee)p(Ee,Tt)&&(e(K[Tt])&&e(Ee[Tt])?(et[Tt]={},z(et[Tt],K[Tt]),z(et[Tt],Ee[Tt])):null!=Ee[Tt]?et[Tt]=Ee[Tt]:delete et[Tt]);for(Tt in K)p(K,Tt)&&!p(Ee,Tt)&&e(K[Tt])&&(et[Tt]=z({},et[Tt]));return et}function je(K){null!=K&&this.set(K)}a.suppressDeprecationWarnings=!1,a.deprecationHandler=null,Ne=Object.keys?Object.keys:function(K){var Ee,et=[];for(Ee in K)p(K,Ee)&&et.push(Ee);return et};function en(K,Ee,et){var Tt=""+Math.abs(K);return(K>=0?et?"+":"":"-")+Math.pow(10,Math.max(0,Ee-Tt.length)).toString().substr(1)+Tt}var Pt=/(\[[^\[]*\])|(\\)?([Hh]mm(ss)?|Mo|MM?M?M?|Do|DDDo|DD?D?D?|ddd?d?|do?|w[o|w]?|W[o|W]?|Qo?|N{1,5}|YYYYYY|YYYYY|YYYY|YY|y{2,4}|yo?|gg(ggg?)?|GG(GGG?)?|e|E|a|A|hh?|HH?|kk?|mm?|ss?|S{1,9}|x|X|zz?|ZZ?|.)/g,Vt=/(\[[^\[]*\])|(\\)?(LTS|LT|LL?L?L?|l{1,4})/g,hn={},vn={};function mt(K,Ee,et,Tt){var Xt=Tt;"string"==typeof Tt&&(Xt=function(){return this[Tt]()}),K&&(vn[K]=Xt),Ee&&(vn[Ee[0]]=function(){return en(Xt.apply(this,arguments),Ee[1],Ee[2])}),et&&(vn[et]=function(){return this.localeData().ordinal(Xt.apply(this,arguments),K)})}function Nt(K){return K.match(/\[[\s\S]/)?K.replace(/^\[|\]$/g,""):K.replace(/\\/g,"")}function Yt(K,Ee){return K.isValid()?(Ee=Fn(Ee,K.localeData()),hn[Ee]=hn[Ee]||function St(K){var et,Tt,Ee=K.match(Pt);for(et=0,Tt=Ee.length;et<Tt;et++)Ee[et]=vn[Ee[et]]?vn[Ee[et]]:Nt(Ee[et]);return function(Xt){var Si,Tr="";for(Si=0;Si<Tt;Si++)Tr+=Ve(Ee[Si])?Ee[Si].call(Xt,K):Ee[Si];return Tr}}(Ee),hn[Ee](K)):K.localeData().invalidDate()}function Fn(K,Ee){var et=5;function Tt(Xt){return Ee.longDateFormat(Xt)||Xt}for(Vt.lastIndex=0;et>=0&&Vt.test(K);)K=K.replace(Vt,Tt),Vt.lastIndex=0,et-=1;return K}var Ci={};function _i(K,Ee){var et=K.toLowerCase();Ci[et]=Ci[et+"s"]=Ci[Ee]=K}function so(K){return"string"==typeof K?Ci[K]||Ci[K.toLowerCase()]:void 0}function Ro(K){var et,Tt,Ee={};for(Tt in K)p(K,Tt)&&(et=so(Tt))&&(Ee[et]=K[Tt]);return Ee}var Sr={};function Kt(K,Ee){Sr[K]=Ee}function jn(K){return K%4==0&&K%100!=0||K%400==0}function Jn(K){return K<0?Math.ceil(K)||0:Math.floor(K)}function Gn(K){var Ee=+K,et=0;return 0!==Ee&&isFinite(Ee)&&(et=Jn(Ee)),et}function Xr(K,Ee){return function(et){return null!=et?(ii(this,K,et),a.updateOffset(this,Ee),this):Zi(this,K)}}function Zi(K,Ee){return K.isValid()?K._d["get"+(K._isUTC?"UTC":"")+Ee]():NaN}function ii(K,Ee,et){K.isValid()&&!isNaN(et)&&("FullYear"===Ee&&jn(K.year())&&1===K.month()&&29===K.date()?(et=Gn(et),K._d["set"+(K._isUTC?"UTC":"")+Ee](et,K.month(),yo(et,K.month()))):K._d["set"+(K._isUTC?"UTC":"")+Ee](et))}var ct,ln=/\d/,Mn=/\d\d/,Zn=/\d{3}/,cn=/\d{4}/,Sn=/[+-]?\d{6}/,Or=/\d\d?/,ri=/\d\d\d\d?/,vi=/\d\d\d\d\d\d?/,Ui=/\d{1,3}/,ao=/\d{1,4}/,dt=/[+-]?\d{1,6}/,Bi=/\d+/,to=/[+-]?\d+/,Gt=/Z|[+-]\d\d:?\d\d/gi,Rn=/Z|[+-]\d\d(?::?\d\d)?/gi,Rt=/[0-9]{0,256}['a-z\u00A0-\u05FF\u0700-\uD7FF\uF900-\uFDCF\uFDF0-\uFF07\uFF10-\uFFEF]{1,256}|[\u0600-\u06FF\/]{1,256}(\s*?[\u0600-\u06FF]{1,256}){1,2}/i;function pt(K,Ee,et){ct[K]=Ve(Ee)?Ee:function(Tt,Xt){return Tt&&et?et:Ee}}function kt(K,Ee){return p(ct,K)?ct[K](Ee._strict,Ee._locale):new RegExp(function dn(K){return mr(K.replace("\\","").replace(/\\(\[)|\\(\])|\[([^\]\[]*)\]|\\(.)/g,function(Ee,et,Tt,Xt,Tr){return et||Tt||Xt||Tr}))}(K))}function mr(K){return K.replace(/[-\/\\^$*+?.()|[\]{}]/g,"\\$&")}ct={};var Oi={};function di(K,Ee){var et,Xt,Tt=Ee;for("string"==typeof K&&(K=[K]),C(Ee)&&(Tt=function(Tr,Si){Si[Ee]=Gn(Tr)}),Xt=K.length,et=0;et<Xt;et++)Oi[K[et]]=Tt}function Uo(K,Ee){di(K,function(et,Tt,Xt,Tr){Xt._w=Xt._w||{},Ee(et,Xt._w,Xt,Tr)})}function Qo(K,Ee,et){null!=Ee&&p(Oi,K)&&Oi[K](Ee,et._a,et,K)}var Li;function yo(K,Ee){if(isNaN(K)||isNaN(Ee))return NaN;var et=function oo(K,Ee){return(K%Ee+Ee)%Ee}(Ee,12);return K+=(Ee-et)/12,1===et?jn(K)?29:28:31-et%7%2}Li=Array.prototype.indexOf?Array.prototype.indexOf:function(K){var Ee;for(Ee=0;Ee<this.length;++Ee)if(this[Ee]===K)return Ee;return-1},mt("M",["MM",2],"Mo",function(){return this.month()+1}),mt("MMM",0,0,function(K){return this.localeData().monthsShort(this,K)}),mt("MMMM",0,0,function(K){return this.localeData().months(this,K)}),_i("month","M"),Kt("month",8),pt("M",Or),pt("MM",Or,Mn),pt("MMM",function(K,Ee){return Ee.monthsShortRegex(K)}),pt("MMMM",function(K,Ee){return Ee.monthsRegex(K)}),di(["M","MM"],function(K,Ee){Ee[1]=Gn(K)-1}),di(["MMM","MMMM"],function(K,Ee,et,Tt){var Xt=et._locale.monthsParse(K,Tt,et._strict);null!=Xt?Ee[1]=Xt:ee(et).invalidMonth=K});var go="January_February_March_April_May_June_July_August_September_October_November_December".split("_"),Go="Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec".split("_"),ua=/D[oD]?(\[[^\[\]]*\]|\s)+MMMM?/,er=Rt,vr=Rt;function si(K,Ee,et){var Tt,Xt,Tr,Si=K.toLocaleLowerCase();if(!this._monthsParse)for(this._monthsParse=[],this._longMonthsParse=[],this._shortMonthsParse=[],Tt=0;Tt<12;++Tt)Tr=W([2e3,Tt]),this._shortMonthsParse[Tt]=this.monthsShort(Tr,"").toLocaleLowerCase(),this._longMonthsParse[Tt]=this.months(Tr,"").toLocaleLowerCase();return et?"MMM"===Ee?-1!==(Xt=Li.call(this._shortMonthsParse,Si))?Xt:null:-1!==(Xt=Li.call(this._longMonthsParse,Si))?Xt:null:"MMM"===Ee?-1!==(Xt=Li.call(this._shortMonthsParse,Si))||-1!==(Xt=Li.call(this._longMonthsParse,Si))?Xt:null:-1!==(Xt=Li.call(this._longMonthsParse,Si))||-1!==(Xt=Li.call(this._shortMonthsParse,Si))?Xt:null}function xn(K,Ee){var et;if(!K.isValid())return K;if("string"==typeof Ee)if(/^\d+$/.test(Ee))Ee=Gn(Ee);else if(!C(Ee=K.localeData().monthsParse(Ee)))return K;return et=Math.min(K.date(),yo(K.year(),Ee)),K._d["set"+(K._isUTC?"UTC":"")+"Month"](Ee,et),K}function Gr(K){return null!=K?(xn(this,K),a.updateOffset(this,!0),this):Zi(this,"Month")}function Us(){function K(Si,gs){return gs.length-Si.length}var Xt,Tr,Ee=[],et=[],Tt=[];for(Xt=0;Xt<12;Xt++)Tr=W([2e3,Xt]),Ee.push(this.monthsShort(Tr,"")),et.push(this.months(Tr,"")),Tt.push(this.months(Tr,"")),Tt.push(this.monthsShort(Tr,""));for(Ee.sort(K),et.sort(K),Tt.sort(K),Xt=0;Xt<12;Xt++)Ee[Xt]=mr(Ee[Xt]),et[Xt]=mr(et[Xt]);for(Xt=0;Xt<24;Xt++)Tt[Xt]=mr(Tt[Xt]);this._monthsRegex=new RegExp("^("+Tt.join("|")+")","i"),this._monthsShortRegex=this._monthsRegex,this._monthsStrictRegex=new RegExp("^("+et.join("|")+")","i"),this._monthsShortStrictRegex=new RegExp("^("+Ee.join("|")+")","i")}function cs(K){return jn(K)?366:365}mt("Y",0,0,function(){var K=this.year();return K<=9999?en(K,4):"+"+K}),mt(0,["YY",2],0,function(){return this.year()%100}),mt(0,["YYYY",4],0,"year"),mt(0,["YYYYY",5],0,"year"),mt(0,["YYYYYY",6,!0],0,"year"),_i("year","y"),Kt("year",1),pt("Y",to),pt("YY",Or,Mn),pt("YYYY",ao,cn),pt("YYYYY",dt,Sn),pt("YYYYYY",dt,Sn),di(["YYYYY","YYYYYY"],0),di("YYYY",function(K,Ee){Ee[0]=2===K.length?a.parseTwoDigitYear(K):Gn(K)}),di("YY",function(K,Ee){Ee[0]=a.parseTwoDigitYear(K)}),di("Y",function(K,Ee){Ee[0]=parseInt(K,10)}),a.parseTwoDigitYear=function(K){return Gn(K)+(Gn(K)>68?1900:2e3)};var es=Xr("FullYear",!0);function ya(K,Ee,et,Tt,Xt,Tr,Si){var gs;return K<100&&K>=0?(gs=new Date(K+400,Ee,et,Tt,Xt,Tr,Si),isFinite(gs.getFullYear())&&gs.setFullYear(K)):gs=new Date(K,Ee,et,Tt,Xt,Tr,Si),gs}function fa(K){var Ee,et;return K<100&&K>=0?((et=Array.prototype.slice.call(arguments))[0]=K+400,Ee=new Date(Date.UTC.apply(null,et)),isFinite(Ee.getUTCFullYear())&&Ee.setUTCFullYear(K)):Ee=new Date(Date.UTC.apply(null,arguments)),Ee}function la(K,Ee,et){var Tt=7+Ee-et;return-(7+fa(K,0,Tt).getUTCDay()-Ee)%7+Tt-1}function Pa(K,Ee,et,Tt,Xt){var Aa,ca,gs=1+7*(Ee-1)+(7+et-Tt)%7+la(K,Tt,Xt);return gs<=0?ca=cs(Aa=K-1)+gs:gs>cs(K)?(Aa=K+1,ca=gs-cs(K)):(Aa=K,ca=gs),{year:Aa,dayOfYear:ca}}function fl(K,Ee,et){var Tr,Si,Tt=la(K.year(),Ee,et),Xt=Math.floor((K.dayOfYear()-Tt-1)/7)+1;return Xt<1?Tr=Xt+To(Si=K.year()-1,Ee,et):Xt>To(K.year(),Ee,et)?(Tr=Xt-To(K.year(),Ee,et),Si=K.year()+1):(Si=K.year(),Tr=Xt),{week:Tr,year:Si}}function To(K,Ee,et){var Tt=la(K,Ee,et),Xt=la(K+1,Ee,et);return(cs(K)-Tt+Xt)/7}mt("w",["ww",2],"wo","week"),mt("W",["WW",2],"Wo","isoWeek"),_i("week","w"),_i("isoWeek","W"),Kt("week",5),Kt("isoWeek",5),pt("w",Or),pt("ww",Or,Mn),pt("W",Or),pt("WW",Or,Mn),Uo(["w","ww","W","WW"],function(K,Ee,et,Tt){Ee[Tt.substr(0,1)]=Gn(K)});function Co(K,Ee){return K.slice(Ee,7).concat(K.slice(0,Ee))}mt("d",0,"do","day"),mt("dd",0,0,function(K){return this.localeData().weekdaysMin(this,K)}),mt("ddd",0,0,function(K){return this.localeData().weekdaysShort(this,K)}),mt("dddd",0,0,function(K){return this.localeData().weekdays(this,K)}),mt("e",0,0,"weekday"),mt("E",0,0,"isoWeekday"),_i("day","d"),_i("weekday","e"),_i("isoWeekday","E"),Kt("day",11),Kt("weekday",11),Kt("isoWeekday",11),pt("d",Or),pt("e",Or),pt("E",Or),pt("dd",function(K,Ee){return Ee.weekdaysMinRegex(K)}),pt("ddd",function(K,Ee){return Ee.weekdaysShortRegex(K)}),pt("dddd",function(K,Ee){return Ee.weekdaysRegex(K)}),Uo(["dd","ddd","dddd"],function(K,Ee,et,Tt){var Xt=et._locale.weekdaysParse(K,Tt,et._strict);null!=Xt?Ee.d=Xt:ee(et).invalidWeekday=K}),Uo(["d","e","E"],function(K,Ee,et,Tt){Ee[Tt]=Gn(K)});var Ps="Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday".split("_"),ps="Sun_Mon_Tue_Wed_Thu_Fri_Sat".split("_"),Oo="Su_Mo_Tu_We_Th_Fr_Sa".split("_"),Nr=Rt,Qi=Rt,tt=Rt;function Lt(K,Ee,et){var Tt,Xt,Tr,Si=K.toLocaleLowerCase();if(!this._weekdaysParse)for(this._weekdaysParse=[],this._shortWeekdaysParse=[],this._minWeekdaysParse=[],Tt=0;Tt<7;++Tt)Tr=W([2e3,1]).day(Tt),this._minWeekdaysParse[Tt]=this.weekdaysMin(Tr,"").toLocaleLowerCase(),this._shortWeekdaysParse[Tt]=this.weekdaysShort(Tr,"").toLocaleLowerCase(),this._weekdaysParse[Tt]=this.weekdays(Tr,"").toLocaleLowerCase();return et?"dddd"===Ee?-1!==(Xt=Li.call(this._weekdaysParse,Si))?Xt:null:"ddd"===Ee?-1!==(Xt=Li.call(this._shortWeekdaysParse,Si))?Xt:null:-1!==(Xt=Li.call(this._minWeekdaysParse,Si))?Xt:null:"dddd"===Ee?-1!==(Xt=Li.call(this._weekdaysParse,Si))||-1!==(Xt=Li.call(this._shortWeekdaysParse,Si))||-1!==(Xt=Li.call(this._minWeekdaysParse,Si))?Xt:null:"ddd"===Ee?-1!==(Xt=Li.call(this._shortWeekdaysParse,Si))||-1!==(Xt=Li.call(this._weekdaysParse,Si))||-1!==(Xt=Li.call(this._minWeekdaysParse,Si))?Xt:null:-1!==(Xt=Li.call(this._minWeekdaysParse,Si))||-1!==(Xt=Li.call(this._weekdaysParse,Si))||-1!==(Xt=Li.call(this._shortWeekdaysParse,Si))?Xt:null}function Xs(){function K(Al,Ul){return Ul.length-Al.length}var Tr,Si,gs,Aa,ca,Ee=[],et=[],Tt=[],Xt=[];for(Tr=0;Tr<7;Tr++)Si=W([2e3,1]).day(Tr),gs=mr(this.weekdaysMin(Si,"")),Aa=mr(this.weekdaysShort(Si,"")),ca=mr(this.weekdays(Si,"")),Ee.push(gs),et.push(Aa),Tt.push(ca),Xt.push(gs),Xt.push(Aa),Xt.push(ca);Ee.sort(K),et.sort(K),Tt.sort(K),Xt.sort(K),this._weekdaysRegex=new RegExp("^("+Xt.join("|")+")","i"),this._weekdaysShortRegex=this._weekdaysRegex,this._weekdaysMinRegex=this._weekdaysRegex,this._weekdaysStrictRegex=new RegExp("^("+Tt.join("|")+")","i"),this._weekdaysShortStrictRegex=new RegExp("^("+et.join("|")+")","i"),this._weekdaysMinStrictRegex=new RegExp("^("+Ee.join("|")+")","i")}function vl(){return this.hours()%12||12}function Wl(K,Ee){mt(K,0,0,function(){return this.localeData().meridiem(this.hours(),this.minutes(),Ee)})}function Qu(K,Ee){return Ee._meridiemParse}mt("H",["HH",2],0,"hour"),mt("h",["hh",2],0,vl),mt("k",["kk",2],0,function ol(){return this.hours()||24}),mt("hmm",0,0,function(){return""+vl.apply(this)+en(this.minutes(),2)}),mt("hmmss",0,0,function(){return""+vl.apply(this)+en(this.minutes(),2)+en(this.seconds(),2)}),mt("Hmm",0,0,function(){return""+this.hours()+en(this.minutes(),2)}),mt("Hmmss",0,0,function(){return""+this.hours()+en(this.minutes(),2)+en(this.seconds(),2)}),Wl("a",!0),Wl("A",!1),_i("hour","h"),Kt("hour",13),pt("a",Qu),pt("A",Qu),pt("H",Or),pt("h",Or),pt("k",Or),pt("HH",Or,Mn),pt("hh",Or,Mn),pt("kk",Or,Mn),pt("hmm",ri),pt("hmmss",vi),pt("Hmm",ri),pt("Hmmss",vi),di(["H","HH"],3),di(["k","kk"],function(K,Ee,et){var Tt=Gn(K);Ee[3]=24===Tt?0:Tt}),di(["a","A"],function(K,Ee,et){et._isPm=et._locale.isPM(K),et._meridiem=K}),di(["h","hh"],function(K,Ee,et){Ee[3]=Gn(K),ee(et).bigHour=!0}),di("hmm",function(K,Ee,et){var Tt=K.length-2;Ee[3]=Gn(K.substr(0,Tt)),Ee[4]=Gn(K.substr(Tt)),ee(et).bigHour=!0}),di("hmmss",function(K,Ee,et){var Tt=K.length-4,Xt=K.length-2;Ee[3]=Gn(K.substr(0,Tt)),Ee[4]=Gn(K.substr(Tt,2)),Ee[5]=Gn(K.substr(Xt)),ee(et).bigHour=!0}),di("Hmm",function(K,Ee,et){var Tt=K.length-2;Ee[3]=Gn(K.substr(0,Tt)),Ee[4]=Gn(K.substr(Tt))}),di("Hmmss",function(K,Ee,et){var Tt=K.length-4,Xt=K.length-2;Ee[3]=Gn(K.substr(0,Tt)),Ee[4]=Gn(K.substr(Tt,2)),Ee[5]=Gn(K.substr(Xt))});var _c=Xr("Hours",!0);var tu,Ku={calendar:{sameDay:"[Today at] LT",nextDay:"[Tomorrow at] LT",nextWeek:"dddd [at] LT",lastDay:"[Yesterday at] LT",lastWeek:"[Last] dddd [at] LT",sameElse:"L"},longDateFormat:{LTS:"h:mm:ss A",LT:"h:mm A",L:"MM/DD/YYYY",LL:"MMMM D, YYYY",LLL:"MMMM D, YYYY h:mm A",LLLL:"dddd, MMMM D, YYYY h:mm A"},invalidDate:"Invalid date",ordinal:"%d",dayOfMonthOrdinalParse:/\d{1,2}/,relativeTime:{future:"in %s",past:"%s ago",s:"a few seconds",ss:"%d seconds",m:"a minute",mm:"%d minutes",h:"an hour",hh:"%d hours",d:"a day",dd:"%d days",w:"a week",ww:"%d weeks",M:"a month",MM:"%d months",y:"a year",yy:"%d years"},months:go,monthsShort:Go,week:{dow:0,doy:6},weekdays:Ps,weekdaysMin:Oo,weekdaysShort:ps,meridiemParse:/[ap]\.?m?\.?/i},Qa={},Mc={};function Wa(K,Ee){var et,Tt=Math.min(K.length,Ee.length);for(et=0;et<Tt;et+=1)if(K[et]!==Ee[et])return et;return Tt}function Ml(K){return K&&K.toLowerCase().replace("_","-")}function Qe(K){var Ee=null;if(void 0===Qa[K]&&m&&m.exports&&function Ua(K){return null!=K.match("^[^/\\\\]*$")}(K))try{Ee=tu._abbr,i(46700)("./"+K),zt(Ee)}catch(Tt){Qa[K]=null}return Qa[K]}function zt(K,Ee){var et;return K&&((et=T(Ee)?zn(K):ot(K,Ee))?tu=et:"undefined"!=typeof console&&console.warn&&console.warn("Locale "+K+" not found. Did you forget to load it?")),tu._abbr}function ot(K,Ee){if(null!==Ee){var et,Tt=Ku;if(Ee.abbr=K,null!=Qa[K])We("defineLocaleOverride","use moment.updateLocale(localeName, config) to change an existing locale. moment.defineLocale(localeName, config) should only be used for creating a new locale See http://momentjs.com/guides/#/warnings/define-locale/ for more info."),Tt=Qa[K]._config;else if(null!=Ee.parentLocale)if(null!=Qa[Ee.parentLocale])Tt=Qa[Ee.parentLocale]._config;else{if(null==(et=Qe(Ee.parentLocale)))return Mc[Ee.parentLocale]||(Mc[Ee.parentLocale]=[]),Mc[Ee.parentLocale].push({name:K,config:Ee}),null;Tt=et._config}return Qa[K]=new je(xe(Tt,Ee)),Mc[K]&&Mc[K].forEach(function(Xt){ot(Xt.name,Xt.config)}),zt(K),Qa[K]}return delete Qa[K],null}function zn(K){var Ee;if(K&&K._locale&&K._locale._abbr&&(K=K._locale._abbr),!K)return tu;if(!c(K)){if(Ee=Qe(K))return Ee;K=[K]}return function Hl(K){for(var et,Tt,Xt,Tr,Ee=0;Ee<K.length;){for(et=(Tr=Ml(K[Ee]).split("-")).length,Tt=(Tt=Ml(K[Ee+1]))?Tt.split("-"):null;et>0;){if(Xt=Qe(Tr.slice(0,et).join("-")))return Xt;if(Tt&&Tt.length>=et&&Wa(Tr,Tt)>=et-1)break;et--}Ee++}return tu}(K)}function Di(K){var Ee,et=K._a;return et&&-2===ee(K).overflow&&(Ee=et[1]<0||et[1]>11?1:et[2]<1||et[2]>yo(et[0],et[1])?2:et[3]<0||et[3]>24||24===et[3]&&(0!==et[4]||0!==et[5]||0!==et[6])?3:et[4]<0||et[4]>59?4:et[5]<0||et[5]>59?5:et[6]<0||et[6]>999?6:-1,ee(K)._overflowDayOfYear&&(Ee<0||Ee>2)&&(Ee=2),ee(K)._overflowWeeks&&-1===Ee&&(Ee=7),ee(K)._overflowWeekday&&-1===Ee&&(Ee=8),ee(K).overflow=Ee),K}var as=/^\s*((?:[+-]\d{6}|\d{4})-(?:\d\d-\d\d|W\d\d-\d|W\d\d|\d\d\d|\d\d))(?:(T| )(\d\d(?::\d\d(?::\d\d(?:[.,]\d+)?)?)?)([+-]\d\d(?::?\d\d)?|\s*Z)?)?$/,js=/^\s*((?:[+-]\d{6}|\d{4})(?:\d\d\d\d|W\d\d\d|W\d\d|\d\d\d|\d\d|))(?:(T| )(\d\d(?:\d\d(?:\d\d(?:[.,]\d+)?)?)?)([+-]\d\d(?::?\d\d)?|\s*Z)?)?$/,As=/Z|[+-]\d\d(?::?\d\d)?/,Ns=[["YYYYYY-MM-DD",/[+-]\d{6}-\d\d-\d\d/],["YYYY-MM-DD",/\d{4}-\d\d-\d\d/],["GGGG-[W]WW-E",/\d{4}-W\d\d-\d/],["GGGG-[W]WW",/\d{4}-W\d\d/,!1],["YYYY-DDD",/\d{4}-\d{3}/],["YYYY-MM",/\d{4}-\d\d/,!1],["YYYYYYMMDD",/[+-]\d{10}/],["YYYYMMDD",/\d{8}/],["GGGG[W]WWE",/\d{4}W\d{3}/],["GGGG[W]WW",/\d{4}W\d{2}/,!1],["YYYYDDD",/\d{7}/],["YYYYMM",/\d{6}/,!1],["YYYY",/\d{4}/,!1]],Io=[["HH:mm:ss.SSSS",/\d\d:\d\d:\d\d\.\d+/],["HH:mm:ss,SSSS",/\d\d:\d\d:\d\d,\d+/],["HH:mm:ss",/\d\d:\d\d:\d\d/],["HH:mm",/\d\d:\d\d/],["HHmmss.SSSS",/\d\d\d\d\d\d\.\d+/],["HHmmss,SSSS",/\d\d\d\d\d\d,\d+/],["HHmmss",/\d\d\d\d\d\d/],["HHmm",/\d\d\d\d/],["HH",/\d\d/]],Ka=/^\/?Date\((-?\d+)/i,sl=/^(?:(Mon|Tue|Wed|Thu|Fri|Sat|Sun),?\s)?(\d{1,2})\s(Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)\s(\d{2,4})\s(\d\d):(\d\d)(?::(\d\d))?\s(?:(UT|GMT|[ECMP][SD]T)|([Zz])|([+-]\d{4}))$/,Bs={UT:0,GMT:0,EDT:-240,EST:-300,CDT:-300,CST:-360,MDT:-360,MST:-420,PDT:-420,PST:-480};function lt(K){var Ee,et,Tr,Si,gs,Aa,Tt=K._i,Xt=as.exec(Tt)||js.exec(Tt),ca=Ns.length,Al=Io.length;if(Xt){for(ee(K).iso=!0,Ee=0,et=ca;Ee<et;Ee++)if(Ns[Ee][1].exec(Xt[1])){Si=Ns[Ee][0],Tr=!1!==Ns[Ee][2];break}if(null==Si)return void(K._isValid=!1);if(Xt[3]){for(Ee=0,et=Al;Ee<et;Ee++)if(Io[Ee][1].exec(Xt[3])){gs=(Xt[2]||" ")+Io[Ee][0];break}if(null==gs)return void(K._isValid=!1)}if(!Tr&&null!=gs)return void(K._isValid=!1);if(Xt[4]){if(!As.exec(Xt[4]))return void(K._isValid=!1);Aa="Z"}K._f=Si+(gs||"")+(Aa||""),oa(K)}else K._isValid=!1}function ke(K){var Ee=parseInt(K,10);return Ee<=49?2e3+Ee:Ee<=999?1900+Ee:Ee}function Ya(K){var et,Ee=sl.exec(function Ut(K){return K.replace(/\([^)]*\)|[\n\t]/g," ").replace(/(\s\s+)/g," ").replace(/^\s\s*/,"").replace(/\s\s*$/,"")}(K._i));if(Ee){if(et=function Xe(K,Ee,et,Tt,Xt,Tr){var Si=[ke(K),Go.indexOf(Ee),parseInt(et,10),parseInt(Tt,10),parseInt(Xt,10)];return Tr&&Si.push(parseInt(Tr,10)),Si}(Ee[4],Ee[3],Ee[2],Ee[5],Ee[6],Ee[7]),!function pi(K,Ee,et){return!K||ps.indexOf(K)===new Date(Ee[0],Ee[1],Ee[2]).getDay()||(ee(et).weekdayMismatch=!0,et._isValid=!1,!1)}(Ee[1],et,K))return;K._a=et,K._tzm=function Wo(K,Ee,et){if(K)return Bs[K];if(Ee)return 0;var Tt=parseInt(et,10),Xt=Tt%100;return(Tt-Xt)/100*60+Xt}(Ee[8],Ee[9],Ee[10]),K._d=fa.apply(null,K._a),K._d.setUTCMinutes(K._d.getUTCMinutes()-K._tzm),ee(K).rfc2822=!0}else K._isValid=!1}function Xu(K,Ee,et){return null!=K?K:null!=Ee?Ee:et}function vd(K){var Ee,et,Xt,Tr,Si,Tt=[];if(!K._d){for(Xt=function Lc(K){var Ee=new Date(a.now());return K._useUTC?[Ee.getUTCFullYear(),Ee.getUTCMonth(),Ee.getUTCDate()]:[Ee.getFullYear(),Ee.getMonth(),Ee.getDate()]}(K),K._w&&null==K._a[2]&&null==K._a[1]&&function Hi(K){var Ee,et,Tt,Xt,Tr,Si,gs,Aa,ca;null!=(Ee=K._w).GG||null!=Ee.W||null!=Ee.E?(Tr=1,Si=4,et=Xu(Ee.GG,K._a[0],fl(ra(),1,4).year),Tt=Xu(Ee.W,1),((Xt=Xu(Ee.E,1))<1||Xt>7)&&(Aa=!0)):(Tr=K._locale._week.dow,Si=K._locale._week.doy,ca=fl(ra(),Tr,Si),et=Xu(Ee.gg,K._a[0],ca.year),Tt=Xu(Ee.w,ca.week),null!=Ee.d?((Xt=Ee.d)<0||Xt>6)&&(Aa=!0):null!=Ee.e?(Xt=Ee.e+Tr,(Ee.e<0||Ee.e>6)&&(Aa=!0)):Xt=Tr),Tt<1||Tt>To(et,Tr,Si)?ee(K)._overflowWeeks=!0:null!=Aa?ee(K)._overflowWeekday=!0:(gs=Pa(et,Tt,Xt,Tr,Si),K._a[0]=gs.year,K._dayOfYear=gs.dayOfYear)}(K),null!=K._dayOfYear&&(Si=Xu(K._a[0],Xt[0]),(K._dayOfYear>cs(Si)||0===K._dayOfYear)&&(ee(K)._overflowDayOfYear=!0),et=fa(Si,0,K._dayOfYear),K._a[1]=et.getUTCMonth(),K._a[2]=et.getUTCDate()),Ee=0;Ee<3&&null==K._a[Ee];++Ee)K._a[Ee]=Tt[Ee]=Xt[Ee];for(;Ee<7;Ee++)K._a[Ee]=Tt[Ee]=null==K._a[Ee]?2===Ee?1:0:K._a[Ee];24===K._a[3]&&0===K._a[4]&&0===K._a[5]&&0===K._a[6]&&(K._nextDay=!0,K._a[3]=0),K._d=(K._useUTC?fa:ya).apply(null,Tt),Tr=K._useUTC?K._d.getUTCDay():K._d.getDay(),null!=K._tzm&&K._d.setUTCMinutes(K._d.getUTCMinutes()-K._tzm),K._nextDay&&(K._a[3]=24),K._w&&void 0!==K._w.d&&K._w.d!==Tr&&(ee(K).weekdayMismatch=!0)}}function oa(K){if(K._f!==a.ISO_8601)if(K._f!==a.RFC_2822){K._a=[],ee(K).empty=!0;var et,Tt,Xt,Tr,Si,ca,Al,Ee=""+K._i,gs=Ee.length,Aa=0;for(Al=(Xt=Fn(K._f,K._locale).match(Pt)||[]).length,et=0;et<Al;et++)(Tt=(Ee.match(kt(Tr=Xt[et],K))||[])[0])&&((Si=Ee.substr(0,Ee.indexOf(Tt))).length>0&&ee(K).unusedInput.push(Si),Ee=Ee.slice(Ee.indexOf(Tt)+Tt.length),Aa+=Tt.length),vn[Tr]?(Tt?ee(K).empty=!1:ee(K).unusedTokens.push(Tr),Qo(Tr,Tt,K)):K._strict&&!Tt&&ee(K).unusedTokens.push(Tr);ee(K).charsLeftOver=gs-Aa,Ee.length>0&&ee(K).unusedInput.push(Ee),K._a[3]<=12&&!0===ee(K).bigHour&&K._a[3]>0&&(ee(K).bigHour=void 0),ee(K).parsedDateParts=K._a.slice(0),ee(K).meridiem=K._meridiem,K._a[3]=function Ia(K,Ee,et){var Tt;return null==et?Ee:null!=K.meridiemHour?K.meridiemHour(Ee,et):(null!=K.isPM&&((Tt=K.isPM(et))&&Ee<12&&(Ee+=12),!Tt&&12===Ee&&(Ee=0)),Ee)}(K._locale,K._a[3],K._meridiem),null!==(ca=ee(K).era)&&(K._a[0]=K._locale.erasConvertYear(ca,K._a[0])),vd(K),Di(K)}else Ya(K);else lt(K)}function su(K){var Ee=K._i,et=K._f;return K._locale=K._locale||zn(K._l),null===Ee||void 0===et&&""===Ee?U({nullInput:!0}):("string"==typeof Ee&&(K._i=Ee=K._locale.preparse(Ee)),be(Ee)?new he(Di(Ee)):(R(Ee)?K._d=Ee:c(et)?function ys(K){var Ee,et,Tt,Xt,Tr,Si,gs=!1,Aa=K._f.length;if(0===Aa)return ee(K).invalidFormat=!0,void(K._d=new Date(NaN));for(Xt=0;Xt<Aa;Xt++)Tr=0,Si=!1,Ee=ae({},K),null!=K._useUTC&&(Ee._useUTC=K._useUTC),Ee._f=K._f[Xt],oa(Ee),ie(Ee)&&(Si=!0),Tr+=ee(Ee).charsLeftOver,Tr+=10*ee(Ee).unusedTokens.length,ee(Ee).score=Tr,gs?Tr<Tt&&(Tt=Tr,et=Ee):(null==Tt||Tr<Tt||Si)&&(Tt=Tr,et=Ee,Si&&(gs=!0));z(K,et||Ee)}(K):et?oa(K):function vu(K){var Ee=K._i;T(Ee)?K._d=new Date(a.now()):R(Ee)?K._d=new Date(Ee.valueOf()):"string"==typeof Ee?function yl(K){var Ee=Ka.exec(K._i);null===Ee?(lt(K),!1===K._isValid&&(delete K._isValid,Ya(K),!1===K._isValid&&(delete K._isValid,K._strict?K._isValid=!1:a.createFromInputFallback(K)))):K._d=new Date(+Ee[1])}(K):c(Ee)?(K._a=L(Ee.slice(0),function(et){return parseInt(et,10)}),vd(K)):e(Ee)?function qu(K){if(!K._d){var Ee=Ro(K._i);K._a=L([Ee.year,Ee.month,void 0===Ee.day?Ee.date:Ee.day,Ee.hour,Ee.minute,Ee.second,Ee.millisecond],function(Tt){return Tt&&parseInt(Tt,10)}),vd(K)}}(K):C(Ee)?K._d=new Date(Ee):a.createFromInputFallback(K)}(K),ie(K)||(K._d=null),K))}function nu(K,Ee,et,Tt,Xt){var Tr={};return(!0===Ee||!1===Ee)&&(Tt=Ee,Ee=void 0),(!0===et||!1===et)&&(Tt=et,et=void 0),(e(K)&&y(K)||c(K)&&0===K.length)&&(K=void 0),Tr._isAMomentObject=!0,Tr._useUTC=Tr._isUTC=Xt,Tr._l=et,Tr._i=K,Tr._f=Ee,Tr._strict=Tt,function bl(K){var Ee=new he(Di(su(K)));return Ee._nextDay&&(Ee.add(1,"d"),Ee._nextDay=void 0),Ee}(Tr)}function ra(K,Ee,et,Tt){return nu(K,Ee,et,Tt,!1)}a.createFromInputFallback=ue("value provided is not in a recognized RFC2822 or ISO format. moment construction falls back to js Date(), which is not reliable across all browsers and versions. Non RFC2822/ISO date formats are discouraged. Please refer to http://momentjs.com/guides/#/warnings/js-date/ for more info.",function(K){K._d=new Date(K._i+(K._useUTC?" UTC":""))}),a.ISO_8601=function(){},a.RFC_2822=function(){};var yu=ue("moment().min is deprecated, use moment.max instead. http://momentjs.com/guides/#/warnings/min-max/",function(){var K=ra.apply(null,arguments);return this.isValid()&&K.isValid()?K<this?this:K:U()}),rd=ue("moment().max is deprecated, use moment.min instead. http://momentjs.com/guides/#/warnings/min-max/",function(){var K=ra.apply(null,arguments);return this.isValid()&&K.isValid()?K>this?this:K:U()});function ec(K,Ee){var et,Tt;if(1===Ee.length&&c(Ee[0])&&(Ee=Ee[0]),!Ee.length)return ra();for(et=Ee[0],Tt=1;Tt<Ee.length;++Tt)(!Ee[Tt].isValid()||Ee[Tt][K](et))&&(et=Ee[Tt]);return et}var $u=["year","quarter","month","week","day","hour","minute","second","millisecond"];function Bo(K){var Ee=Ro(K),et=Ee.year||0,Tt=Ee.quarter||0,Xt=Ee.month||0,Tr=Ee.week||Ee.isoWeek||0,Si=Ee.day||0,gs=Ee.hour||0,Aa=Ee.minute||0,ca=Ee.second||0,Al=Ee.millisecond||0;this._isValid=function Hu(K){var Ee,Tt,et=!1,Xt=$u.length;for(Ee in K)if(p(K,Ee)&&(-1===Li.call($u,Ee)||null!=K[Ee]&&isNaN(K[Ee])))return!1;for(Tt=0;Tt<Xt;++Tt)if(K[$u[Tt]]){if(et)return!1;parseFloat(K[$u[Tt]])!==Gn(K[$u[Tt]])&&(et=!0)}return!0}(Ee),this._milliseconds=+Al+1e3*ca+6e4*Aa+1e3*gs*60*60,this._days=+Si+7*Tr,this._months=+Xt+3*Tt+12*et,this._data={},this._locale=zn(),this._bubble()}function cu(K){return K instanceof Bo}function Er(K){return K<0?-1*Math.round(-1*K):Math.round(K)}function Ce(K,Ee){mt(K,0,0,function(){var et=this.utcOffset(),Tt="+";return et<0&&(et=-et,Tt="-"),Tt+en(~~(et/60),2)+Ee+en(~~et%60,2)})}Ce("Z",":"),Ce("ZZ",""),pt("Z",Rn),pt("ZZ",Rn),di(["Z","ZZ"],function(K,Ee,et){et._useUTC=!0,et._tzm=Mt(Rn,K)});var nt=/([\+\-]|\d\d)/gi;function Mt(K,Ee){var Xt,Tr,et=(Ee||"").match(K);return null===et?null:0===(Tr=60*(Xt=((et[et.length-1]||[])+"").match(nt)||["-",0,0])[1]+Gn(Xt[2]))?0:"+"===Xt[0]?Tr:-Tr}function wt(K,Ee){var et,Tt;return Ee._isUTC?(et=Ee.clone(),Tt=(be(K)||R(K)?K.valueOf():ra(K).valueOf())-et.valueOf(),et._d.setTime(et._d.valueOf()+Tt),a.updateOffset(et,!1),et):ra(K).local()}function sn(K){return-Math.round(K._d.getTimezoneOffset())}function fo(){return!!this.isValid()&&this._isUTC&&0===this._offset}a.updateOffset=function(){};var $s=/^(-|\+)?(?:(\d*)[. ])?(\d+):(\d+)(?::(\d+)(\.\d*)?)?$/,Es=/^(-|\+)?P(?:([-+]?[0-9,.]*)Y)?(?:([-+]?[0-9,.]*)M)?(?:([-+]?[0-9,.]*)W)?(?:([-+]?[0-9,.]*)D)?(?:T(?:([-+]?[0-9,.]*)H)?(?:([-+]?[0-9,.]*)M)?(?:([-+]?[0-9,.]*)S)?)?$/;function pl(K,Ee){var Xt,Tr,Si,et=K,Tt=null;return cu(K)?et={ms:K._milliseconds,d:K._days,M:K._months}:C(K)||!isNaN(+K)?(et={},Ee?et[Ee]=+K:et.milliseconds=+K):(Tt=$s.exec(K))?(Xt="-"===Tt[1]?-1:1,et={y:0,d:Gn(Tt[2])*Xt,h:Gn(Tt[3])*Xt,m:Gn(Tt[4])*Xt,s:Gn(Tt[5])*Xt,ms:Gn(Er(1e3*Tt[6]))*Xt}):(Tt=Es.exec(K))?et={y:Ks(Tt[2],Xt="-"===Tt[1]?-1:1),M:Ks(Tt[3],Xt),w:Ks(Tt[4],Xt),d:Ks(Tt[5],Xt),h:Ks(Tt[6],Xt),m:Ks(Tt[7],Xt),s:Ks(Tt[8],Xt)}:null==et?et={}:"object"==typeof et&&("from"in et||"to"in et)&&(Si=function Fc(K,Ee){var et;return K.isValid()&&Ee.isValid()?(Ee=wt(Ee,K),K.isBefore(Ee)?et=Wc(K,Ee):((et=Wc(Ee,K)).milliseconds=-et.milliseconds,et.months=-et.months),et):{milliseconds:0,months:0}}(ra(et.from),ra(et.to)),(et={}).ms=Si.milliseconds,et.M=Si.months),Tr=new Bo(et),cu(K)&&p(K,"_locale")&&(Tr._locale=K._locale),cu(K)&&p(K,"_isValid")&&(Tr._isValid=K._isValid),Tr}function Ks(K,Ee){var et=K&&parseFloat(K.replace(",","."));return(isNaN(et)?0:et)*Ee}function Wc(K,Ee){var et={};return et.months=Ee.month()-K.month()+12*(Ee.year()-K.year()),K.clone().add(et.months,"M").isAfter(Ee)&&--et.months,et.milliseconds=+Ee-+K.clone().add(et.months,"M"),et}function xu(K,Ee){return function(et,Tt){var Tr;return null!==Tt&&!isNaN(+Tt)&&(We(Ee,"moment()."+Ee+"(period, number) is deprecated. Please use moment()."+Ee+"(number, period). See http://momentjs.com/guides/#/warnings/add-inverted-param/ for more info."),Tr=et,et=Tt,Tt=Tr),Eu(this,pl(et,Tt),K),this}}function Eu(K,Ee,et,Tt){var Xt=Ee._milliseconds,Tr=Er(Ee._days),Si=Er(Ee._months);!K.isValid()||(Tt=null==Tt||Tt,Si&&xn(K,Zi(K,"Month")+Si*et),Tr&&ii(K,"Date",Zi(K,"Date")+Tr*et),Xt&&K._d.setTime(K._d.valueOf()+Xt*et),Tt&&a.updateOffset(K,Tr||Si))}pl.fn=Bo.prototype,pl.invalid=function Fd(){return pl(NaN)};var Gd=xu(1,"add"),yd=xu(-1,"subtract");function Ed(K){return"string"==typeof K||K instanceof String}function Uc(K){return be(K)||R(K)||Ed(K)||C(K)||function kd(K){var Ee=c(K),et=!1;return Ee&&(et=0===K.filter(function(Tt){return!C(Tt)&&Ed(K)}).length),Ee&&et}(K)||function La(K){var Xt,Ee=e(K)&&!y(K),et=!1,Tt=["years","year","y","months","month","M","days","day","d","dates","date","D","hours","hour","h","minutes","minute","m","seconds","second","s","milliseconds","millisecond","ms"],Si=Tt.length;for(Xt=0;Xt<Si;Xt+=1)et=et||p(K,Tt[Xt]);return Ee&&et}(K)||null==K}function Oc(K){var Xt,Ee=e(K)&&!y(K),et=!1,Tt=["sameDay","nextDay","lastDay","nextWeek","lastWeek","sameElse"];for(Xt=0;Xt<Tt.length;Xt+=1)et=et||p(K,Tt[Xt]);return Ee&&et}function $e(K,Ee){if(K.date()<Ee.date())return-$e(Ee,K);var et=12*(Ee.year()-K.year())+(Ee.month()-K.month()),Tt=K.clone().add(et,"months");return-(et+(Ee-Tt<0?(Ee-Tt)/(Tt-K.clone().add(et-1,"months")):(Ee-Tt)/(K.clone().add(et+1,"months")-Tt)))||0}function Lo(K){var Ee;return void 0===K?this._locale._abbr:(null!=(Ee=zn(K))&&(this._locale=Ee),this)}a.defaultFormat="YYYY-MM-DDTHH:mm:ssZ",a.defaultFormatUtc="YYYY-MM-DDTHH:mm:ss[Z]";var Ta=ue("moment().lang() is deprecated. Instead, use moment().localeData() to get the language configuration. Use moment().locale() to change languages.",function(K){return void 0===K?this.localeData():this.locale(K)});function _s(){return this._locale}var Ca=6e4,Ru=60*Ca,lc=3506328*Ru;function Fa(K,Ee){return(K%Ee+Ee)%Ee}function nl(K,Ee,et){return K<100&&K>=0?new Date(K+400,Ee,et)-lc:new Date(K,Ee,et).valueOf()}function mc(K,Ee,et){return K<100&&K>=0?Date.UTC(K+400,Ee,et)-lc:Date.UTC(K,Ee,et)}function Xa(K,Ee){return Ee.erasAbbrRegex(K)}function Sd(){var Xt,Tr,K=[],Ee=[],et=[],Tt=[],Si=this.eras();for(Xt=0,Tr=Si.length;Xt<Tr;++Xt)Ee.push(mr(Si[Xt].name)),K.push(mr(Si[Xt].abbr)),et.push(mr(Si[Xt].narrow)),Tt.push(mr(Si[Xt].name)),Tt.push(mr(Si[Xt].abbr)),Tt.push(mr(Si[Xt].narrow));this._erasRegex=new RegExp("^("+Tt.join("|")+")","i"),this._erasNameRegex=new RegExp("^("+Ee.join("|")+")","i"),this._erasAbbrRegex=new RegExp("^("+K.join("|")+")","i"),this._erasNarrowRegex=new RegExp("^("+et.join("|")+")","i")}function uc(K,Ee){mt(0,[K,K.length],0,Ee)}function Vd(K,Ee,et,Tt,Xt){var Tr;return null==K?fl(this,Tt,Xt).year:(Ee>(Tr=To(K,Tt,Xt))&&(Ee=Tr),Af.call(this,K,Ee,et,Tt,Xt))}function Af(K,Ee,et,Tt,Xt){var Tr=Pa(K,Ee,et,Tt,Xt),Si=fa(Tr.year,0,Tr.dayOfYear);return this.year(Si.getUTCFullYear()),this.month(Si.getUTCMonth()),this.date(Si.getUTCDate()),this}mt("N",0,0,"eraAbbr"),mt("NN",0,0,"eraAbbr"),mt("NNN",0,0,"eraAbbr"),mt("NNNN",0,0,"eraName"),mt("NNNNN",0,0,"eraNarrow"),mt("y",["y",1],"yo","eraYear"),mt("y",["yy",2],0,"eraYear"),mt("y",["yyy",3],0,"eraYear"),mt("y",["yyyy",4],0,"eraYear"),pt("N",Xa),pt("NN",Xa),pt("NNN",Xa),pt("NNNN",function ul(K,Ee){return Ee.erasNameRegex(K)}),pt("NNNNN",function Of(K,Ee){return Ee.erasNarrowRegex(K)}),di(["N","NN","NNN","NNNN","NNNNN"],function(K,Ee,et,Tt){var Xt=et._locale.erasParse(K,Tt,et._strict);Xt?ee(et).era=Xt:ee(et).invalidEra=K}),pt("y",Bi),pt("yy",Bi),pt("yyy",Bi),pt("yyyy",Bi),pt("yo",function Yc(K,Ee){return Ee._eraYearOrdinalRegex||Bi}),di(["y","yy","yyy","yyyy"],0),di(["yo"],function(K,Ee,et,Tt){var Xt;et._locale._eraYearOrdinalRegex&&(Xt=K.match(et._locale._eraYearOrdinalRegex)),Ee[0]=et._locale.eraYearOrdinalParse?et._locale.eraYearOrdinalParse(K,Xt):parseInt(K,10)}),mt(0,["gg",2],0,function(){return this.weekYear()%100}),mt(0,["GG",2],0,function(){return this.isoWeekYear()%100}),uc("gggg","weekYear"),uc("ggggg","weekYear"),uc("GGGG","isoWeekYear"),uc("GGGGG","isoWeekYear"),_i("weekYear","gg"),_i("isoWeekYear","GG"),Kt("weekYear",1),Kt("isoWeekYear",1),pt("G",to),pt("g",to),pt("GG",Or,Mn),pt("gg",Or,Mn),pt("GGGG",ao,cn),pt("gggg",ao,cn),pt("GGGGG",dt,Sn),pt("ggggg",dt,Sn),Uo(["gggg","ggggg","GGGG","GGGGG"],function(K,Ee,et,Tt){Ee[Tt.substr(0,2)]=Gn(K)}),Uo(["gg","GG"],function(K,Ee,et,Tt){Ee[Tt]=a.parseTwoDigitYear(K)}),mt("Q",0,"Qo","quarter"),_i("quarter","Q"),Kt("quarter",7),pt("Q",ln),di("Q",function(K,Ee){Ee[1]=3*(Gn(K)-1)}),mt("D",["DD",2],"Do","date"),_i("date","D"),Kt("date",9),pt("D",Or),pt("DD",Or,Mn),pt("Do",function(K,Ee){return K?Ee._dayOfMonthOrdinalParse||Ee._ordinalParse:Ee._dayOfMonthOrdinalParseLenient}),di(["D","DD"],2),di("Do",function(K,Ee){Ee[2]=Gn(K.match(Or)[0])});var $c=Xr("Date",!0);mt("DDD",["DDDD",3],"DDDo","dayOfYear"),_i("dayOfYear","DDD"),Kt("dayOfYear",4),pt("DDD",Ui),pt("DDDD",Zn),di(["DDD","DDDD"],function(K,Ee,et){et._dayOfYear=Gn(K)}),mt("m",["mm",2],0,"minute"),_i("minute","m"),Kt("minute",14),pt("m",Or),pt("mm",Or,Mn),di(["m","mm"],4);var ad=Xr("Minutes",!1);mt("s",["ss",2],0,"second"),_i("second","s"),Kt("second",15),pt("s",Or),pt("ss",Or,Mn),di(["s","ss"],5);var Oa,Jc,nc=Xr("Seconds",!1);for(mt("S",0,0,function(){return~~(this.millisecond()/100)}),mt(0,["SS",2],0,function(){return~~(this.millisecond()/10)}),mt(0,["SSS",3],0,"millisecond"),mt(0,["SSSS",4],0,function(){return 10*this.millisecond()}),mt(0,["SSSSS",5],0,function(){return 100*this.millisecond()}),mt(0,["SSSSSS",6],0,function(){return 1e3*this.millisecond()}),mt(0,["SSSSSSS",7],0,function(){return 1e4*this.millisecond()}),mt(0,["SSSSSSSS",8],0,function(){return 1e5*this.millisecond()}),mt(0,["SSSSSSSSS",9],0,function(){return 1e6*this.millisecond()}),_i("millisecond","ms"),Kt("millisecond",16),pt("S",Ui,ln),pt("SS",Ui,Mn),pt("SSS",Ui,Zn),Oa="SSSS";Oa.length<=9;Oa+="S")pt(Oa,Bi);function ld(K,Ee){Ee[6]=Gn(1e3*("0."+K))}for(Oa="S";Oa.length<=9;Oa+="S")di(Oa,ld);Jc=Xr("Milliseconds",!1),mt("z",0,0,"zoneAbbr"),mt("zz",0,0,"zoneName");var vo=he.prototype;function Ac(K){return K}vo.add=Gd,vo.calendar=function No(K,Ee){1===arguments.length&&(arguments[0]?Uc(arguments[0])?(K=arguments[0],Ee=void 0):Oc(arguments[0])&&(Ee=arguments[0],K=void 0):(K=void 0,Ee=void 0));var et=K||ra(),Tt=wt(et,this).startOf("day"),Xt=a.calendarFormat(this,Tt)||"sameElse",Tr=Ee&&(Ve(Ee[Xt])?Ee[Xt].call(this,et):Ee[Xt]);return this.format(Tr||this.localeData().calendar(Xt,this,ra(et)))},vo.clone=function Sa(){return new he(this)},vo.diff=function od(K,Ee,et){var Tt,Xt,Tr;if(!this.isValid())return NaN;if(!(Tt=wt(K,this)).isValid())return NaN;switch(Xt=6e4*(Tt.utcOffset()-this.utcOffset()),Ee=so(Ee)){case"year":Tr=$e(this,Tt)/12;break;case"month":Tr=$e(this,Tt);break;case"quarter":Tr=$e(this,Tt)/3;break;case"second":Tr=(this-Tt)/1e3;break;case"minute":Tr=(this-Tt)/6e4;break;case"hour":Tr=(this-Tt)/36e5;break;case"day":Tr=(this-Tt-Xt)/864e5;break;case"week":Tr=(this-Tt-Xt)/6048e5;break;default:Tr=this-Tt}return et?Tr:Jn(Tr)},vo.endOf=function Bu(K){var Ee,et;if(void 0===(K=so(K))||"millisecond"===K||!this.isValid())return this;switch(et=this._isUTC?mc:nl,K){case"year":Ee=et(this.year()+1,0,1)-1;break;case"quarter":Ee=et(this.year(),this.month()-this.month()%3+3,1)-1;break;case"month":Ee=et(this.year(),this.month()+1,1)-1;break;case"week":Ee=et(this.year(),this.month(),this.date()-this.weekday()+7)-1;break;case"isoWeek":Ee=et(this.year(),this.month(),this.date()-(this.isoWeekday()-1)+7)-1;break;case"day":case"date":Ee=et(this.year(),this.month(),this.date()+1)-1;break;case"hour":Ee=this._d.valueOf(),Ee+=Ru-Fa(Ee+(this._isUTC?0:this.utcOffset()*Ca),Ru)-1;break;case"minute":Ee=this._d.valueOf(),Ee+=Ca-Fa(Ee,Ca)-1;break;case"second":Ee=this._d.valueOf(),Ee+=1e3-Fa(Ee,1e3)-1}return this._d.setTime(Ee),a.updateOffset(this,!0),this},vo.format=function vt(K){K||(K=this.isUtc()?a.defaultFormatUtc:a.defaultFormat);var Ee=Yt(this,K);return this.localeData().postformat(Ee)},vo.from=function Qt(K,Ee){return this.isValid()&&(be(K)&&K.isValid()||ra(K).isValid())?pl({to:this,from:K}).locale(this.locale()).humanize(!Ee):this.localeData().invalidDate()},vo.fromNow=function Ln(K){return this.from(ra(),K)},vo.to=function cr(K,Ee){return this.isValid()&&(be(K)&&K.isValid()||ra(K).isValid())?pl({from:this,to:K}).locale(this.locale()).humanize(!Ee):this.localeData().invalidDate()},vo.toNow=function ui(K){return this.to(ra(),K)},vo.get=function hr(K){return Ve(this[K=so(K)])?this[K]():this},vo.invalidAt=function Cl(){return ee(this).overflow},vo.isAfter=function Sl(K,Ee){var et=be(K)?K:ra(K);return!(!this.isValid()||!et.isValid())&&("millisecond"===(Ee=so(Ee)||"millisecond")?this.valueOf()>et.valueOf():et.valueOf()<this.clone().startOf(Ee).valueOf())},vo.isBefore=function ru(K,Ee){var et=be(K)?K:ra(K);return!(!this.isValid()||!et.isValid())&&("millisecond"===(Ee=so(Ee)||"millisecond")?this.valueOf()<et.valueOf():this.clone().endOf(Ee).valueOf()<et.valueOf())},vo.isBetween=function bu(K,Ee,et,Tt){var Xt=be(K)?K:ra(K),Tr=be(Ee)?Ee:ra(Ee);return!!(this.isValid()&&Xt.isValid()&&Tr.isValid())&&("("===(Tt=Tt||"()")[0]?this.isAfter(Xt,et):!this.isBefore(Xt,et))&&(")"===Tt[1]?this.isBefore(Tr,et):!this.isAfter(Tr,et))},vo.isSame=function gc(K,Ee){var Tt,et=be(K)?K:ra(K);return!(!this.isValid()||!et.isValid())&&("millisecond"===(Ee=so(Ee)||"millisecond")?this.valueOf()===et.valueOf():(Tt=et.valueOf(),this.clone().startOf(Ee).valueOf()<=Tt&&Tt<=this.clone().endOf(Ee).valueOf()))},vo.isSameOrAfter=function _n(K,Ee){return this.isSame(K,Ee)||this.isAfter(K,Ee)},vo.isSameOrBefore=function pa(K,Ee){return this.isSame(K,Ee)||this.isBefore(K,Ee)},vo.isValid=function al(){return ie(this)},vo.lang=Ta,vo.locale=Lo,vo.localeData=_s,vo.max=rd,vo.min=yu,vo.parsingFlags=function Il(){return z({},ee(this))},vo.set=function Ki(K,Ee){if("object"==typeof K){var Tt,et=function un(K){var et,Ee=[];for(et in K)p(K,et)&&Ee.push({unit:et,priority:Sr[et]});return Ee.sort(function(Tt,Xt){return Tt.priority-Xt.priority}),Ee}(K=Ro(K)),Xt=et.length;for(Tt=0;Tt<Xt;Tt++)this[et[Tt].unit](K[et[Tt].unit])}else if(Ve(this[K=so(K)]))return this[K](Ee);return this},vo.startOf=function vc(K){var Ee,et;if(void 0===(K=so(K))||"millisecond"===K||!this.isValid())return this;switch(et=this._isUTC?mc:nl,K){case"year":Ee=et(this.year(),0,1);break;case"quarter":Ee=et(this.year(),this.month()-this.month()%3,1);break;case"month":Ee=et(this.year(),this.month(),1);break;case"week":Ee=et(this.year(),this.month(),this.date()-this.weekday());break;case"isoWeek":Ee=et(this.year(),this.month(),this.date()-(this.isoWeekday()-1));break;case"day":case"date":Ee=et(this.year(),this.month(),this.date());break;case"hour":Ee=this._d.valueOf(),Ee-=Fa(Ee+(this._isUTC?0:this.utcOffset()*Ca),Ru);break;case"minute":Ee=this._d.valueOf(),Ee-=Fa(Ee,Ca);break;case"second":Ee=this._d.valueOf(),Ee-=Fa(Ee,1e3)}return this._d.setTime(Ee),a.updateOffset(this,!0),this},vo.subtract=yd,vo.toArray=function kc(){var K=this;return[K.year(),K.month(),K.date(),K.hour(),K.minute(),K.second(),K.millisecond()]},vo.toObject=function lu(){var K=this;return{years:K.year(),months:K.month(),date:K.date(),hours:K.hours(),minutes:K.minutes(),seconds:K.seconds(),milliseconds:K.milliseconds()}},vo.toDate=function bd(){return new Date(this.valueOf())},vo.toISOString=function _e(K){if(!this.isValid())return null;var Ee=!0!==K,et=Ee?this.clone().utc():this;return et.year()<0||et.year()>9999?Yt(et,Ee?"YYYYYY-MM-DD[T]HH:mm:ss.SSS[Z]":"YYYYYY-MM-DD[T]HH:mm:ss.SSSZ"):Ve(Date.prototype.toISOString)?Ee?this.toDate().toISOString():new Date(this.valueOf()+60*this.utcOffset()*1e3).toISOString().replace("Z",Yt(et,"Z")):Yt(et,Ee?"YYYY-MM-DD[T]HH:mm:ss.SSS[Z]":"YYYY-MM-DD[T]HH:mm:ss.SSSZ")},vo.inspect=function at(){if(!this.isValid())return"moment.invalid(/* "+this._i+" */)";var et,Tt,K="moment",Ee="";return this.isLocal()||(K=0===this.utcOffset()?"moment.utc":"moment.parseZone",Ee="Z"),et="["+K+'("]',Tt=0<=this.year()&&this.year()<=9999?"YYYY":"YYYYYY",this.format(et+Tt+"-MM-DD[T]HH:mm:ss.SSS"+Ee+'[")]')},"undefined"!=typeof Symbol&&null!=Symbol.for&&(vo[Symbol.for("nodejs.util.inspect.custom")]=function(){return"Moment<"+this.format()+">"}),vo.toJSON=function Ma(){return this.isValid()?this.toISOString():null},vo.toString=function Me(){return this.clone().locale("en").format("ddd MMM DD YYYY HH:mm:ss [GMT]ZZ")},vo.unix=function tc(){return Math.floor(this.valueOf()/1e3)},vo.valueOf=function Bl(){return this._d.valueOf()-6e4*(this._offset||0)},vo.creationData=function hf(){return{input:this._i,format:this._f,locale:this._locale,isUTC:this._isUTC,strict:this._strict}},vo.eraName=function Ll(){var K,Ee,et,Tt=this.localeData().eras();for(K=0,Ee=Tt.length;K<Ee;++K)if(et=this.clone().startOf("day").valueOf(),Tt[K].since<=et&&et<=Tt[K].until||Tt[K].until<=et&&et<=Tt[K].since)return Tt[K].name;return""},vo.eraNarrow=function Uu(){var K,Ee,et,Tt=this.localeData().eras();for(K=0,Ee=Tt.length;K<Ee;++K)if(et=this.clone().startOf("day").valueOf(),Tt[K].since<=et&&et<=Tt[K].until||Tt[K].until<=et&&et<=Tt[K].since)return Tt[K].narrow;return""},vo.eraAbbr=function ll(){var K,Ee,et,Tt=this.localeData().eras();for(K=0,Ee=Tt.length;K<Ee;++K)if(et=this.clone().startOf("day").valueOf(),Tt[K].since<=et&&et<=Tt[K].until||Tt[K].until<=et&&et<=Tt[K].since)return Tt[K].abbr;return""},vo.eraYear=function Su(){var K,Ee,et,Tt,Xt=this.localeData().eras();for(K=0,Ee=Xt.length;K<Ee;++K)if(et=Xt[K].since<=Xt[K].until?1:-1,Tt=this.clone().startOf("day").valueOf(),Xt[K].since<=Tt&&Tt<=Xt[K].until||Xt[K].until<=Tt&&Tt<=Xt[K].since)return(this.year()-a(Xt[K].since).year())*et+Xt[K].offset;return this.year()},vo.year=es,vo.isLeapYear=function ga(){return jn(this.year())},vo.weekYear=function Td(K){return Vd.call(this,K,this.week(),this.weekday(),this.localeData()._week.dow,this.localeData()._week.doy)},vo.isoWeekYear=function $p(K){return Vd.call(this,K,this.isoWeek(),this.isoWeekday(),1,4)},vo.quarter=vo.quarters=function vp(K){return null==K?Math.ceil((this.month()+1)/3):this.month(3*(K-1)+this.month()%3)},vo.month=Gr,vo.daysInMonth=function no(){return yo(this.year(),this.month())},vo.week=vo.weeks=function Is(K){var Ee=this.localeData().week(this);return null==K?Ee:this.add(7*(K-Ee),"d")},vo.isoWeek=vo.isoWeeks=function tl(K){var Ee=fl(this,1,4).week;return null==K?Ee:this.add(7*(K-Ee),"d")},vo.weeksInYear=function Yu(){var K=this.localeData()._week;return To(this.year(),K.dow,K.doy)},vo.weeksInWeekYear=function Ec(){var K=this.localeData()._week;return To(this.weekYear(),K.dow,K.doy)},vo.isoWeeksInYear=function _f(){return To(this.year(),1,4)},vo.isoWeeksInISOWeekYear=function up(){return To(this.isoWeekYear(),1,4)},vo.date=$c,vo.day=vo.days=function Kr(K){if(!this.isValid())return null!=K?this:NaN;var Ee=this._isUTC?this._d.getUTCDay():this._d.getDay();return null!=K?(K=function Ys(K,Ee){return"string"!=typeof K?K:isNaN(K)?"number"==typeof(K=Ee.weekdaysParse(K))?K:null:parseInt(K,10)}(K,this.localeData()),this.add(K-Ee,"d")):Ee},vo.weekday=function bi(K){if(!this.isValid())return null!=K?this:NaN;var Ee=(this.day()+7-this.localeData()._week.dow)%7;return null==K?Ee:this.add(K-Ee,"d")},vo.isoWeekday=function Ii(K){if(!this.isValid())return null!=K?this:NaN;if(null!=K){var Ee=function ko(K,Ee){return"string"==typeof K?Ee.weekdaysParse(K)%7||7:isNaN(K)?null:K}(K,this.localeData());return this.day(this.day()%7?Ee:Ee-7)}return this.day()||7},vo.dayOfYear=function Pu(K){var Ee=Math.round((this.clone().startOf("day")-this.clone().startOf("year"))/864e5)+1;return null==K?Ee:this.add(K-Ee,"d")},vo.hour=vo.hours=_c,vo.minute=vo.minutes=ad,vo.second=vo.seconds=nc,vo.millisecond=vo.milliseconds=Jc,vo.utcOffset=function Cn(K,Ee,et){var Xt,Tt=this._offset||0;if(!this.isValid())return null!=K?this:NaN;if(null!=K){if("string"==typeof K){if(null===(K=Mt(Rn,K)))return this}else Math.abs(K)<16&&!et&&(K*=60);return!this._isUTC&&Ee&&(Xt=sn(this)),this._offset=K,this._isUTC=!0,null!=Xt&&this.add(Xt,"m"),Tt!==K&&(!Ee||this._changeInProgress?Eu(this,pl(K-Tt,"m"),1,!1):this._changeInProgress||(this._changeInProgress=!0,a.updateOffset(this,!0),this._changeInProgress=null)),this}return this._isUTC?Tt:sn(this)},vo.utc=function ni(K){return this.utcOffset(0,K)},vo.local=function fi(K){return this._isUTC&&(this.utcOffset(0,K),this._isUTC=!1,K&&this.subtract(sn(this),"m")),this},vo.parseZone=function gi(){if(null!=this._tzm)this.utcOffset(this._tzm,!1,!0);else if("string"==typeof this._i){var K=Mt(Gt,this._i);null!=K?this.utcOffset(K):this.utcOffset(0,!0)}return this},vo.hasAlignedHourOffset=function zi(K){return!!this.isValid()&&(K=K?ra(K).utcOffset():0,(this.utcOffset()-K)%60==0)},vo.isDST=function Dr(){return this.utcOffset()>this.clone().month(0).utcOffset()||this.utcOffset()>this.clone().month(5).utcOffset()},vo.isLocal=function Ar(){return!!this.isValid()&&!this._isUTC},vo.isUtcOffset=function gr(){return!!this.isValid()&&this._isUTC},vo.isUtc=fo,vo.isUTC=fo,vo.zoneAbbr=function cp(){return this._isUTC?"UTC":""},vo.zoneName=function $d(){return this._isUTC?"Coordinated Universal Time":""},vo.dates=ue("dates accessor is deprecated. Use date instead.",$c),vo.months=ue("months accessor is deprecated. Use month instead",Gr),vo.years=ue("years accessor is deprecated. Use year instead",es),vo.zone=ue("moment().zone is deprecated, use moment().utcOffset instead. http://momentjs.com/guides/#/warnings/zone/",function _r(K,Ee){return null!=K?("string"!=typeof K&&(K=-K),this.utcOffset(K,Ee),this):-this.utcOffset()}),vo.isDSTShifted=ue("isDSTShifted is deprecated. See http://momentjs.com/guides/#/warnings/dst-shifted/ for more information",function kn(){if(!T(this._isDSTShifted))return this._isDSTShifted;var Ee,K={};return ae(K,this),(K=su(K))._a?(Ee=K._isUTC?W(K._a):ra(K._a),this._isDSTShifted=this.isValid()&&function j(K,Ee,et){var Si,Tt=Math.min(K.length,Ee.length),Xt=Math.abs(K.length-Ee.length),Tr=0;for(Si=0;Si<Tt;Si++)(et&&K[Si]!==Ee[Si]||!et&&Gn(K[Si])!==Gn(Ee[Si]))&&Tr++;return Tr+Xt}(K._a,Ee.toArray())>0):this._isDSTShifted=!1,this._isDSTShifted});var ma=je.prototype;function Dc(K,Ee,et,Tt){var Xt=zn(),Tr=W().set(Tt,Ee);return Xt[et](Tr,K)}function Iu(K,Ee,et){if(C(K)&&(Ee=K,K=void 0),K=K||"",null!=Ee)return Dc(K,Ee,et,"month");var Tt,Xt=[];for(Tt=0;Tt<12;Tt++)Xt[Tt]=Dc(K,Tt,et,"month");return Xt}function bc(K,Ee,et,Tt){"boolean"==typeof K?(C(Ee)&&(et=Ee,Ee=void 0),Ee=Ee||""):(et=Ee=K,K=!1,C(Ee)&&(et=Ee,Ee=void 0),Ee=Ee||"");var Si,Xt=zn(),Tr=K?Xt._week.dow:0,gs=[];if(null!=et)return Dc(Ee,(et+Tr)%7,Tt,"day");for(Si=0;Si<7;Si++)gs[Si]=Dc(Ee,(Si+Tr)%7,Tt,"day");return gs}ma.calendar=function rt(K,Ee,et){var Tt=this._calendar[K]||this._calendar.sameElse;return Ve(Tt)?Tt.call(Ee,et):Tt},ma.longDateFormat=function Ei(K){var Ee=this._longDateFormat[K],et=this._longDateFormat[K.toUpperCase()];return Ee||!et?Ee:(this._longDateFormat[K]=et.match(Pt).map(function(Tt){return"MMMM"===Tt||"MM"===Tt||"DD"===Tt||"dddd"===Tt?Tt.slice(1):Tt}).join(""),this._longDateFormat[K])},ma.invalidDate=function ur(){return this._invalidDate},ma.ordinal=function Pn(K){return this._ordinal.replace("%d",K)},ma.preparse=Ac,ma.postformat=Ac,ma.relativeTime=function dr(K,Ee,et,Tt){var Xt=this._relativeTime[et];return Ve(Xt)?Xt(K,Ee,et,Tt):Xt.replace(/%d/i,K)},ma.pastFuture=function Qr(K,Ee){var et=this._relativeTime[K>0?"future":"past"];return Ve(et)?et(Ee):et.replace(/%s/i,Ee)},ma.set=function Be(K){var Ee,et;for(et in K)p(K,et)&&(Ve(Ee=K[et])?this[et]=Ee:this["_"+et]=Ee);this._config=K,this._dayOfMonthOrdinalParseLenient=new RegExp((this._dayOfMonthOrdinalParse.source||this._ordinalParse.source)+"|"+/\d{1,2}/.source)},ma.eras=function zd(K,Ee){var et,Tt,Xt,Tr=this._eras||zn("en")._eras;for(et=0,Tt=Tr.length;et<Tt;++et)switch("string"==typeof Tr[et].since&&(Xt=a(Tr[et].since).startOf("day"),Tr[et].since=Xt.valueOf()),typeof Tr[et].until){case"undefined":Tr[et].until=1/0;break;case"string":Xt=a(Tr[et].until).startOf("day").valueOf(),Tr[et].until=Xt.valueOf()}return Tr},ma.erasParse=function sd(K,Ee,et){var Tt,Xt,Si,gs,Aa,Tr=this.eras();for(K=K.toUpperCase(),Tt=0,Xt=Tr.length;Tt<Xt;++Tt)if(Si=Tr[Tt].name.toUpperCase(),gs=Tr[Tt].abbr.toUpperCase(),Aa=Tr[Tt].narrow.toUpperCase(),et)switch(Ee){case"N":case"NN":case"NNN":if(gs===K)return Tr[Tt];break;case"NNNN":if(Si===K)return Tr[Tt];break;case"NNNNN":if(Aa===K)return Tr[Tt]}else if([Si,gs,Aa].indexOf(K)>=0)return Tr[Tt]},ma.erasConvertYear=function Ol(K,Ee){var et=K.since<=K.until?1:-1;return void 0===Ee?a(K.since).year():a(K.since).year()+(Ee-K.offset)*et},ma.erasAbbrRegex=function yc(K){return p(this,"_erasAbbrRegex")||Sd.call(this),K?this._erasAbbrRegex:this._erasRegex},ma.erasNameRegex=function tn(K){return p(this,"_erasNameRegex")||Sd.call(this),K?this._erasNameRegex:this._erasRegex},ma.erasNarrowRegex=function Nu(K){return p(this,"_erasNarrowRegex")||Sd.call(this),K?this._erasNarrowRegex:this._erasRegex},ma.months=function yr(K,Ee){return K?c(this._months)?this._months[K.month()]:this._months[(this._months.isFormat||ua).test(Ee)?"format":"standalone"][K.month()]:c(this._months)?this._months:this._months.standalone},ma.monthsShort=function or(K,Ee){return K?c(this._monthsShort)?this._monthsShort[K.month()]:this._monthsShort[ua.test(Ee)?"format":"standalone"][K.month()]:c(this._monthsShort)?this._monthsShort:this._monthsShort.standalone},ma.monthsParse=function pn(K,Ee,et){var Tt,Xt,Tr;if(this._monthsParseExact)return si.call(this,K,Ee,et);for(this._monthsParse||(this._monthsParse=[],this._longMonthsParse=[],this._shortMonthsParse=[]),Tt=0;Tt<12;Tt++){if(Xt=W([2e3,Tt]),et&&!this._longMonthsParse[Tt]&&(this._longMonthsParse[Tt]=new RegExp("^"+this.months(Xt,"").replace(".","")+"$","i"),this._shortMonthsParse[Tt]=new RegExp("^"+this.monthsShort(Xt,"").replace(".","")+"$","i")),!et&&!this._monthsParse[Tt]&&(Tr="^"+this.months(Xt,"")+"|^"+this.monthsShort(Xt,""),this._monthsParse[Tt]=new RegExp(Tr.replace(".",""),"i")),et&&"MMMM"===Ee&&this._longMonthsParse[Tt].test(K))return Tt;if(et&&"MMM"===Ee&&this._shortMonthsParse[Tt].test(K))return Tt;if(!et&&this._monthsParse[Tt].test(K))return Tt}},ma.monthsRegex=function wo(K){return this._monthsParseExact?(p(this,"_monthsRegex")||Us.call(this),K?this._monthsStrictRegex:this._monthsRegex):(p(this,"_monthsRegex")||(this._monthsRegex=vr),this._monthsStrictRegex&&K?this._monthsStrictRegex:this._monthsRegex)},ma.monthsShortRegex=function mo(K){return this._monthsParseExact?(p(this,"_monthsRegex")||Us.call(this),K?this._monthsShortStrictRegex:this._monthsShortRegex):(p(this,"_monthsShortRegex")||(this._monthsShortRegex=er),this._monthsShortStrictRegex&&K?this._monthsShortStrictRegex:this._monthsShortRegex)},ma.week=function ml(K){return fl(K,this._week.dow,this._week.doy).week},ma.firstDayOfYear=function Za(){return this._week.doy},ma.firstDayOfWeek=function vs(){return this._week.dow},ma.weekdays=function rn(K,Ee){var et=c(this._weekdays)?this._weekdays:this._weekdays[K&&!0!==K&&this._weekdays.isFormat.test(Ee)?"format":"standalone"];return!0===K?Co(et,this._week.dow):K?et[K.day()]:et},ma.weekdaysMin=function Le(K){return!0===K?Co(this._weekdaysMin,this._week.dow):K?this._weekdaysMin[K.day()]:this._weekdaysMin},ma.weekdaysShort=function ne(K){return!0===K?Co(this._weekdaysShort,this._week.dow):K?this._weekdaysShort[K.day()]:this._weekdaysShort},ma.weekdaysParse=function on(K,Ee,et){var Tt,Xt,Tr;if(this._weekdaysParseExact)return Lt.call(this,K,Ee,et);for(this._weekdaysParse||(this._weekdaysParse=[],this._minWeekdaysParse=[],this._shortWeekdaysParse=[],this._fullWeekdaysParse=[]),Tt=0;Tt<7;Tt++){if(Xt=W([2e3,1]).day(Tt),et&&!this._fullWeekdaysParse[Tt]&&(this._fullWeekdaysParse[Tt]=new RegExp("^"+this.weekdays(Xt,"").replace(".","\\.?")+"$","i"),this._shortWeekdaysParse[Tt]=new RegExp("^"+this.weekdaysShort(Xt,"").replace(".","\\.?")+"$","i"),this._minWeekdaysParse[Tt]=new RegExp("^"+this.weekdaysMin(Xt,"").replace(".","\\.?")+"$","i")),this._weekdaysParse[Tt]||(Tr="^"+this.weekdays(Xt,"")+"|^"+this.weekdaysShort(Xt,"")+"|^"+this.weekdaysMin(Xt,""),this._weekdaysParse[Tt]=new RegExp(Tr.replace(".",""),"i")),et&&"dddd"===Ee&&this._fullWeekdaysParse[Tt].test(K))return Tt;if(et&&"ddd"===Ee&&this._shortWeekdaysParse[Tt].test(K))return Tt;if(et&&"dd"===Ee&&this._minWeekdaysParse[Tt].test(K))return Tt;if(!et&&this._weekdaysParse[Tt].test(K))return Tt}},ma.weekdaysRegex=function hs(K){return this._weekdaysParseExact?(p(this,"_weekdaysRegex")||Xs.call(this),K?this._weekdaysStrictRegex:this._weekdaysRegex):(p(this,"_weekdaysRegex")||(this._weekdaysRegex=Nr),this._weekdaysStrictRegex&&K?this._weekdaysStrictRegex:this._weekdaysRegex)},ma.weekdaysShortRegex=function zo(K){return this._weekdaysParseExact?(p(this,"_weekdaysRegex")||Xs.call(this),K?this._weekdaysShortStrictRegex:this._weekdaysShortRegex):(p(this,"_weekdaysShortRegex")||(this._weekdaysShortRegex=Qi),this._weekdaysShortStrictRegex&&K?this._weekdaysShortStrictRegex:this._weekdaysShortRegex)},ma.weekdaysMinRegex=function Ls(K){return this._weekdaysParseExact?(p(this,"_weekdaysRegex")||Xs.call(this),K?this._weekdaysMinStrictRegex:this._weekdaysMinRegex):(p(this,"_weekdaysMinRegex")||(this._weekdaysMinRegex=tt),this._weekdaysMinStrictRegex&&K?this._weekdaysMinStrictRegex:this._weekdaysMinRegex)},ma.isPM=function hc(K){return"p"===(K+"").toLowerCase().charAt(0)},ma.meridiem=function Pl(K,Ee,et){return K>11?et?"pm":"PM":et?"am":"AM"},zt("en",{eras:[{since:"0001-01-01",until:1/0,offset:1,name:"Anno Domini",narrow:"AD",abbr:"AD"},{since:"0000-12-31",until:-1/0,offset:1,name:"Before Christ",narrow:"BC",abbr:"BC"}],dayOfMonthOrdinalParse:/\d{1,2}(th|st|nd|rd)/,ordinal:function(K){var Ee=K%10;return K+(1===Gn(K%100/10)?"th":1===Ee?"st":2===Ee?"nd":3===Ee?"rd":"th")}}),a.lang=ue("moment.lang is deprecated. Use moment.locale instead.",zt),a.langData=ue("moment.langData is deprecated. Use moment.localeData instead.",zn);var fu=Math.abs;function dc(K,Ee,et,Tt){var Xt=pl(Ee,et);return K._milliseconds+=Tt*Xt._milliseconds,K._days+=Tt*Xt._days,K._months+=Tt*Xt._months,K._bubble()}function Rl(K){return K<0?Math.floor(K):Math.ceil(K)}function fc(K){return 4800*K/146097}function h(K){return 146097*K/4800}function F(K){return function(){return this.as(K)}}var Q=F("ms"),le=F("s"),me=F("m"),Fe=F("h"),Oe=F("d"),Je=F("w"),ht=F("M"),gt=F("Q"),nn=F("y");function ar(K){return function(){return this.isValid()?this._data[K]:NaN}}var Pr=ar("milliseconds"),$i=ar("seconds"),is=ar("minutes"),Eo=ar("hours"),Gs=ar("days"),qs=ar("months"),qa=ar("years");var ja=Math.round,wa={ss:44,s:45,m:45,h:22,d:26,w:null,M:11};function jl(K,Ee,et,Tt,Xt){return Xt.relativeTime(Ee||1,!!et,K,Tt)}var wc=Math.abs;function Cu(K){return(K>0)-(K<0)||+K}function Wd(){if(!this.isValid())return this.localeData().invalidDate();var Tt,Xt,Tr,Si,Aa,ca,Al,Ul,K=wc(this._milliseconds)/1e3,Ee=wc(this._days),et=wc(this._months),gs=this.asSeconds();return gs?(Tt=Jn(K/60),Xt=Jn(Tt/60),K%=60,Tt%=60,Tr=Jn(et/12),et%=12,Si=K?K.toFixed(3).replace(/\.?0+$/,""):"",Aa=gs<0?"-":"",ca=Cu(this._months)!==Cu(gs)?"-":"",Al=Cu(this._days)!==Cu(gs)?"-":"",Ul=Cu(this._milliseconds)!==Cu(gs)?"-":"",Aa+"P"+(Tr?ca+Tr+"Y":"")+(et?ca+et+"M":"")+(Ee?Al+Ee+"D":"")+(Xt||Tt||K?"T":"")+(Xt?Ul+Xt+"H":"")+(Tt?Ul+Tt+"M":"")+(K?Ul+Si+"S":"")):"P0D"}var rl=Bo.prototype;return rl.isValid=function wu(){return this._isValid},rl.abs=function ud(){var K=this._data;return this._milliseconds=fu(this._milliseconds),this._days=fu(this._days),this._months=fu(this._months),K.milliseconds=fu(K.milliseconds),K.seconds=fu(K.seconds),K.minutes=fu(K.minutes),K.hours=fu(K.hours),K.months=fu(K.months),K.years=fu(K.years),this},rl.add=function Zd(K,Ee){return dc(this,K,Ee,1)},rl.subtract=function Qc(K,Ee){return dc(this,K,Ee,-1)},rl.as=function E(K){if(!this.isValid())return NaN;var Ee,et,Tt=this._milliseconds;if("month"===(K=so(K))||"quarter"===K||"year"===K)switch(Ee=this._days+Tt/864e5,et=this._months+fc(Ee),K){case"month":return et;case"quarter":return et/3;case"year":return et/12}else switch(Ee=this._days+Math.round(h(this._months)),K){case"week":return Ee/7+Tt/6048e5;case"day":return Ee+Tt/864e5;case"hour":return 24*Ee+Tt/36e5;case"minute":return 1440*Ee+Tt/6e4;case"second":return 86400*Ee+Tt/1e3;case"millisecond":return Math.floor(864e5*Ee)+Tt;default:throw new Error("Unknown unit "+K)}},rl.asMilliseconds=Q,rl.asSeconds=le,rl.asMinutes=me,rl.asHours=Fe,rl.asDays=Oe,rl.asWeeks=Je,rl.asMonths=ht,rl.asQuarters=gt,rl.asYears=nn,rl.valueOf=function x(){return this.isValid()?this._milliseconds+864e5*this._days+this._months%12*2592e6+31536e6*Gn(this._months/12):NaN},rl._bubble=function jc(){var Xt,Tr,Si,gs,Aa,K=this._milliseconds,Ee=this._days,et=this._months,Tt=this._data;return K>=0&&Ee>=0&&et>=0||K<=0&&Ee<=0&&et<=0||(K+=864e5*Rl(h(et)+Ee),Ee=0,et=0),Tt.milliseconds=K%1e3,Xt=Jn(K/1e3),Tt.seconds=Xt%60,Tr=Jn(Xt/60),Tt.minutes=Tr%60,Si=Jn(Tr/60),Tt.hours=Si%24,Ee+=Jn(Si/24),et+=Aa=Jn(fc(Ee)),Ee-=Rl(h(Aa)),gs=Jn(et/12),et%=12,Tt.days=Ee,Tt.months=et,Tt.years=gs,this},rl.clone=function $n(){return pl(this)},rl.get=function Bn(K){return K=so(K),this.isValid()?this[K+"s"]():NaN},rl.milliseconds=Pr,rl.seconds=$i,rl.minutes=is,rl.hours=Eo,rl.days=Gs,rl.weeks=function ka(){return Jn(this.days()/7)},rl.months=qs,rl.years=qa,rl.humanize=function Lu(K,Ee){if(!this.isValid())return this.localeData().invalidDate();var Xt,Tr,et=!1,Tt=wa;return"object"==typeof K&&(Ee=K,K=!1),"boolean"==typeof K&&(et=K),"object"==typeof Ee&&(Tt=Object.assign({},wa,Ee),null!=Ee.s&&null==Ee.ss&&(Tt.ss=Ee.s-1)),Tr=function pu(K,Ee,et,Tt){var Xt=pl(K).abs(),Tr=ja(Xt.as("s")),Si=ja(Xt.as("m")),gs=ja(Xt.as("h")),Aa=ja(Xt.as("d")),ca=ja(Xt.as("M")),Al=ja(Xt.as("w")),Ul=ja(Xt.as("y")),Gc=Tr<=et.ss&&["s",Tr]||Tr<et.s&&["ss",Tr]||Si<=1&&["m"]||Si<et.m&&["mm",Si]||gs<=1&&["h"]||gs<et.h&&["hh",gs]||Aa<=1&&["d"]||Aa<et.d&&["dd",Aa];return null!=et.w&&(Gc=Gc||Al<=1&&["w"]||Al<et.w&&["ww",Al]),(Gc=Gc||ca<=1&&["M"]||ca<et.M&&["MM",ca]||Ul<=1&&["y"]||["yy",Ul])[2]=Ee,Gc[3]=+K>0,Gc[4]=Tt,jl.apply(null,Gc)}(this,!et,Tt,Xt=this.localeData()),et&&(Tr=Xt.pastFuture(+this,Tr)),Xt.postformat(Tr)},rl.toISOString=Wd,rl.toString=Wd,rl.toJSON=Wd,rl.locale=Lo,rl.localeData=_s,rl.toIsoString=ue("toIsoString() is deprecated. Please use toISOString() instead (notice the capitals)",Wd),rl.lang=Ta,mt("X",0,0,"unix"),mt("x",0,0,"valueOf"),pt("x",to),pt("X",/[+-]?\d+(\.\d{1,3})?/),di("X",function(K,Ee,et){et._d=new Date(1e3*parseFloat(K))}),di("x",function(K,Ee,et){et._d=new Date(Gn(K))}),a.version="2.29.3",function f(K){r=K}(ra),a.fn=vo,a.min=function au(){return ec("isBefore",[].slice.call(arguments,0))},a.max=function uu(){return ec("isAfter",[].slice.call(arguments,0))},a.now=function(){return Date.now?Date.now():+new Date},a.utc=W,a.unix=function du(K){return ra(1e3*K)},a.months=function cc(K,Ee){return Iu(K,Ee,"months")},a.isDate=R,a.locale=zt,a.invalid=U,a.duration=pl,a.isMoment=be,a.weekdays=function Sc(K,Ee,et){return bc(K,Ee,et,"weekdays")},a.parseZone=function Fl(){return ra.apply(null,arguments).parseZone()},a.localeData=zn,a.isDuration=cu,a.monthsShort=function Jl(K,Ee){return Iu(K,Ee,"monthsShort")},a.weekdaysMin=function ju(K,Ee,et){return bc(K,Ee,et,"weekdaysMin")},a.defineLocale=ot,a.updateLocale=function jt(K,Ee){if(null!=Ee){var et,Tt,Xt=Ku;null!=Qa[K]&&null!=Qa[K].parentLocale?Qa[K].set(xe(Qa[K]._config,Ee)):(null!=(Tt=Qe(K))&&(Xt=Tt._config),Ee=xe(Xt,Ee),null==Tt&&(Ee.abbr=K),(et=new je(Ee)).parentLocale=Qa[K],Qa[K]=et),zt(K)}else null!=Qa[K]&&(null!=Qa[K].parentLocale?(Qa[K]=Qa[K].parentLocale,K===zt()&&zt(K)):null!=Qa[K]&&delete Qa[K]);return Qa[K]},a.locales=function qr(){return Ne(Qa)},a.weekdaysShort=function Tc(K,Ee,et){return bc(K,Ee,et,"weekdaysShort")},a.normalizeUnits=so,a.relativeTimeRounding=function Ga(K){return void 0===K?ja:"function"==typeof K&&(ja=K,!0)},a.relativeTimeThreshold=function Tu(K,Ee){return void 0!==wa[K]&&(void 0===Ee?wa[K]:(wa[K]=Ee,"s"===K&&(wa.ss=Ee-1),!0))},a.calendarFormat=function Mo(K,Ee){var et=K.diff(Ee,"days",!0);return et<-6?"sameElse":et<-1?"lastWeek":et<0?"lastDay":et<1?"sameDay":et<2?"nextDay":et<7?"nextWeek":"sameElse"},a.prototype=vo,a.HTML5_FMT={DATETIME_LOCAL:"YYYY-MM-DDTHH:mm",DATETIME_LOCAL_SECONDS:"YYYY-MM-DDTHH:mm:ss",DATETIME_LOCAL_MS:"YYYY-MM-DDTHH:mm:ss.SSS",DATE:"YYYY-MM-DD",TIME:"HH:mm",TIME_SECONDS:"HH:mm:ss",TIME_MS:"HH:mm:ss.SSS",WEEK:"GGGG-[W]WW",MONTH:"YYYY-MM"},a}()},90504:(m,S,i)=>{"use strict";i.d(S,{_:()=>p,w:()=>T});var r=i(89724),a=i(11048),f=function(C,R,L,z){var ee,W=arguments.length,J=W<3?R:null===z?z=Object.getOwnPropertyDescriptor(R,L):z;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)J=Reflect.decorate(C,R,L,z);else for(var ce=C.length-1;ce>=0;ce--)(ee=C[ce])&&(J=(W<3?ee(J):W>3?ee(R,L,J):ee(R,L))||J);return W>3&&J&&Object.defineProperty(R,L,J),J},c=function(C,R){if("object"==typeof Reflect&&"function"==typeof Reflect.metadata)return Reflect.metadata(C,R)},e=function(C,R){return function(L,z){R(L,z,C)}},p=function(){function C(R,L,z){this._el=R,this._ngZone=L,this.platformId=z,this.clickOutsideEnabled=!0,this.attachOutsideOnClick=!1,this.delayClickOutsideInit=!1,this.emitOnBlur=!1,this.exclude="",this.excludeBeforeClick=!1,this.clickOutsideEvents="",this.clickOutside=new r.vpe,this._nodesExcluded=[],this._events=["click"],this._initOnClickBody=this._initOnClickBody.bind(this),this._onClickBody=this._onClickBody.bind(this),this._onWindowBlur=this._onWindowBlur.bind(this)}return C.prototype.ngOnInit=function(){!(0,a.NF)(this.platformId)||this._init()},C.prototype.ngOnDestroy=function(){!(0,a.NF)(this.platformId)||(this._removeClickOutsideListener(),this._removeAttachOutsideOnClickListener(),this._removeWindowBlurListener())},C.prototype.ngOnChanges=function(R){!(0,a.NF)(this.platformId)||(R.attachOutsideOnClick||R.exclude||R.emitOnBlur)&&this._init()},C.prototype._init=function(){""!==this.clickOutsideEvents&&(this._events=this.clickOutsideEvents.split(",").map(function(R){return R.trim()})),this._excludeCheck(),this.attachOutsideOnClick?this._initAttachOutsideOnClickListener():this._initOnClickBody(),this.emitOnBlur&&this._initWindowBlurListener()},C.prototype._initOnClickBody=function(){this.delayClickOutsideInit?setTimeout(this._initClickOutsideListener.bind(this)):this._initClickOutsideListener()},C.prototype._excludeCheck=function(){if(this.exclude)try{var R=Array.from(document.querySelectorAll(this.exclude));R&&(this._nodesExcluded=R)}catch(L){console.error("[ng-click-outside] Check your exclude selector syntax.",L)}},C.prototype._onClickBody=function(R){!this.clickOutsideEnabled||(this.excludeBeforeClick&&this._excludeCheck(),!this._el.nativeElement.contains(R.target)&&!this._shouldExclude(R.target)&&(this._emit(R),this.attachOutsideOnClick&&this._removeClickOutsideListener()))},C.prototype._onWindowBlur=function(R){var L=this;setTimeout(function(){document.hidden||L._emit(R)})},C.prototype._emit=function(R){var L=this;!this.clickOutsideEnabled||this._ngZone.run(function(){return L.clickOutside.emit(R)})},C.prototype._shouldExclude=function(R){for(var L=0,z=this._nodesExcluded;L<z.length;L++)if(z[L].contains(R))return!0;return!1},C.prototype._initClickOutsideListener=function(){var R=this;this._ngZone.runOutsideAngular(function(){R._events.forEach(function(L){return document.addEventListener(L,R._onClickBody)})})},C.prototype._removeClickOutsideListener=function(){var R=this;this._ngZone.runOutsideAngular(function(){R._events.forEach(function(L){return document.removeEventListener(L,R._onClickBody)})})},C.prototype._initAttachOutsideOnClickListener=function(){var R=this;this._ngZone.runOutsideAngular(function(){R._events.forEach(function(L){return R._el.nativeElement.addEventListener(L,R._initOnClickBody)})})},C.prototype._removeAttachOutsideOnClickListener=function(){var R=this;this._ngZone.runOutsideAngular(function(){R._events.forEach(function(L){return R._el.nativeElement.removeEventListener(L,R._initOnClickBody)})})},C.prototype._initWindowBlurListener=function(){var R=this;this._ngZone.runOutsideAngular(function(){window.addEventListener("blur",R._onWindowBlur)})},C.prototype._removeWindowBlurListener=function(){var R=this;this._ngZone.runOutsideAngular(function(){window.removeEventListener("blur",R._onWindowBlur)})},f([(0,r.IIB)(),c("design:type",Boolean)],C.prototype,"clickOutsideEnabled",void 0),f([(0,r.IIB)(),c("design:type",Boolean)],C.prototype,"attachOutsideOnClick",void 0),f([(0,r.IIB)(),c("design:type",Boolean)],C.prototype,"delayClickOutsideInit",void 0),f([(0,r.IIB)(),c("design:type",Boolean)],C.prototype,"emitOnBlur",void 0),f([(0,r.IIB)(),c("design:type",String)],C.prototype,"exclude",void 0),f([(0,r.IIB)(),c("design:type",Boolean)],C.prototype,"excludeBeforeClick",void 0),f([(0,r.IIB)(),c("design:type",String)],C.prototype,"clickOutsideEvents",void 0),f([(0,r.r_U)(),c("design:type",r.vpe)],C.prototype,"clickOutside",void 0),(C=f([e(2,(0,r.tBr)(r.Lbi)),c("design:paramtypes",[r.SBq,r.R0b,Object])],C)).\u0275fac=function(L){return new(L||C)(r.Y36(r.SBq),r.Y36(r.R0b),r.Y36(r.Lbi))},C.\u0275dir=r.lG2({type:C,selectors:[["","clickOutside",""]],inputs:{clickOutsideEnabled:"clickOutsideEnabled",attachOutsideOnClick:"attachOutsideOnClick",delayClickOutsideInit:"delayClickOutsideInit",emitOnBlur:"emitOnBlur",exclude:"exclude",excludeBeforeClick:"excludeBeforeClick",clickOutsideEvents:"clickOutsideEvents"},outputs:{clickOutside:"clickOutside"},features:[r.TTD]}),C.\u0275prov=r.Yz7({token:C,factory:function(R){return C.\u0275fac(R)}}),C}(),T=function(){function C(){}return C.\u0275fac=function(L){return new(L||C)},C.\u0275mod=r.oAB({type:C}),C.\u0275inj=r.cJS({}),C}()},72621:(m,S,i)=>{"use strict";i.d(S,{jh:()=>be,m9:()=>we});var r=i(89724),a=i(26215),f=i(65252);var T=i(6823);const C=[[255,99,132],[54,162,235],[255,206,86],[231,233,237],[75,192,192],[151,187,205],[220,220,220],[247,70,74],[70,191,189],[253,180,92],[148,159,177],[77,83,96]];function L(Be,xe){return"rgba("+Be.concat(xe).join(",")+")"}function z(Be,xe){return Math.floor(Math.random()*(xe-Be+1))+Be}function ee(Be){return{backgroundColor:Be.map(xe=>L(xe,.6)),borderColor:Be.map(()=>"#fff"),pointBackgroundColor:Be.map(xe=>L(xe,1)),pointBorderColor:Be.map(()=>"#fff"),pointHoverBackgroundColor:Be.map(xe=>L(xe,1)),pointHoverBorderColor:Be.map(xe=>L(xe,1))}}function ie(){return[z(0,255),z(0,255),z(0,255)]}function U(Be){return C[Be]||ie()}function se(Be){const xe=new Array(Be);for(let je=0;je<Be;je++)xe[je]=C[je]||ie();return xe}let ge=(()=>{class Be{constructor(){this.pColorschemesOptions={},this.colorschemesOptions=new a.X({})}setColorschemesOptions(je){this.pColorschemesOptions=je,this.colorschemesOptions.next(je)}getColorschemesOptions(){return this.pColorschemesOptions}}return Be.\u0275fac=function(je){return new(je||Be)},Be.\u0275prov=(0,r.Yz7)({factory:function(){return new Be},token:Be,providedIn:"root"}),Be})();const he={Default:0,Update:1,Refresh:2};he[he.Default]="Default",he[he.Update]="Update",he[he.Refresh]="Refresh";let be=(()=>{class Be{constructor(je,Ne){this.element=je,this.themeService=Ne,this.options={},this.chartClick=new r.vpe,this.chartHover=new r.vpe,this.old={dataExists:!1,dataLength:0,datasetsExists:!1,datasetsLength:0,datasetsDataObjects:[],datasetsDataLengths:[],colorsExists:!1,colors:[],labelsExist:!1,labels:[],legendExists:!1,legend:{}},this.subs=[]}static registerPlugin(je){T.pluginService.register(je)}static unregisterPlugin(je){T.pluginService.unregister(je)}ngOnInit(){this.ctx=this.element.nativeElement.getContext("2d"),this.refresh(),this.subs.push(this.themeService.colorschemesOptions.subscribe(je=>this.themeChanged(je)))}themeChanged(je){this.refresh()}ngDoCheck(){if(!this.chart)return;let je=he.Default;const Ne=Bt=>{je=Bt>je?Bt:je};switch(!!this.data!==this.old.dataExists&&(this.propagateDataToDatasets(this.data),this.old.dataExists=!!this.data,Ne(he.Update)),this.data&&this.data.length!==this.old.dataLength&&(this.old.dataLength=this.data&&this.data.length||0,Ne(he.Update)),!!this.datasets!==this.old.datasetsExists&&(this.old.datasetsExists=!!this.datasets,Ne(he.Update)),this.datasets&&this.datasets.length!==this.old.datasetsLength&&(this.old.datasetsLength=this.datasets&&this.datasets.length||0,Ne(he.Update)),this.datasets&&this.datasets.filter((Bt,rt)=>Bt.data!==this.old.datasetsDataObjects[rt]).length&&(this.old.datasetsDataObjects=this.datasets.map(Bt=>Bt.data),Ne(he.Update)),this.datasets&&this.datasets.filter((Bt,rt)=>Bt.data.length!==this.old.datasetsDataLengths[rt]).length&&(this.old.datasetsDataLengths=this.datasets.map(Bt=>Bt.data.length),Ne(he.Update)),!!this.colors!==this.old.colorsExists&&(this.old.colorsExists=!!this.colors,this.updateColors(),Ne(he.Update)),this.colors&&this.colors.filter((Bt,rt)=>!this.colorsEqual(Bt,this.old.colors[rt])).length&&(this.old.colors=this.colors.map(Bt=>this.copyColor(Bt)),this.updateColors(),Ne(he.Update)),!!this.labels!==this.old.labelsExist&&(this.old.labelsExist=!!this.labels,Ne(he.Update)),this.labels&&this.labels.filter((Bt,rt)=>!this.labelsEqual(Bt,this.old.labels[rt])).length&&(this.old.labels=this.labels.map(Bt=>this.copyLabel(Bt)),Ne(he.Update)),!!this.options.legend!==this.old.legendExists&&(this.old.legendExists=!!this.options.legend,Ne(he.Refresh)),this.options.legend&&this.options.legend.position!==this.old.legend.position&&(this.old.legend.position=this.options.legend.position,Ne(he.Refresh)),je){case he.Default:break;case he.Update:this.update();break;case he.Refresh:this.refresh()}}copyLabel(je){return Array.isArray(je)?[...je]:je}labelsEqual(je,Ne){return Array.isArray(je)===Array.isArray(Ne)&&(Array.isArray(je)||je===Ne)&&(!Array.isArray(je)||je.length===Ne.length)&&(!Array.isArray(je)||0===je.filter((Bt,rt)=>Bt!==Ne[rt]).length)}copyColor(je){return{backgroundColor:je.backgroundColor,borderWidth:je.borderWidth,borderColor:je.borderColor,borderCapStyle:je.borderCapStyle,borderDash:je.borderDash,borderDashOffset:je.borderDashOffset,borderJoinStyle:je.borderJoinStyle,pointBorderColor:je.pointBorderColor,pointBackgroundColor:je.pointBackgroundColor,pointBorderWidth:je.pointBorderWidth,pointRadius:je.pointRadius,pointHoverRadius:je.pointHoverRadius,pointHitRadius:je.pointHitRadius,pointHoverBackgroundColor:je.pointHoverBackgroundColor,pointHoverBorderColor:je.pointHoverBorderColor,pointHoverBorderWidth:je.pointHoverBorderWidth,pointStyle:je.pointStyle,hoverBackgroundColor:je.hoverBackgroundColor,hoverBorderColor:je.hoverBorderColor,hoverBorderWidth:je.hoverBorderWidth}}colorsEqual(je,Ne){return!je==!Ne&&(!je||je.backgroundColor===Ne.backgroundColor&&je.borderWidth===Ne.borderWidth&&je.borderColor===Ne.borderColor&&je.borderCapStyle===Ne.borderCapStyle&&je.borderDash===Ne.borderDash&&je.borderDashOffset===Ne.borderDashOffset&&je.borderJoinStyle===Ne.borderJoinStyle&&je.pointBorderColor===Ne.pointBorderColor&&je.pointBackgroundColor===Ne.pointBackgroundColor&&je.pointBorderWidth===Ne.pointBorderWidth&&je.pointRadius===Ne.pointRadius&&je.pointHoverRadius===Ne.pointHoverRadius&&je.pointHitRadius===Ne.pointHitRadius&&je.pointHoverBackgroundColor===Ne.pointHoverBackgroundColor&&je.pointHoverBorderColor===Ne.pointHoverBorderColor&&je.pointHoverBorderWidth===Ne.pointHoverBorderWidth&&je.pointStyle===Ne.pointStyle&&je.hoverBackgroundColor===Ne.hoverBackgroundColor&&je.hoverBorderColor===Ne.hoverBorderColor&&je.hoverBorderWidth===Ne.hoverBorderWidth)}updateColors(){this.datasets.forEach((je,Ne)=>{this.colors&&this.colors[Ne]?Object.assign(je,this.colors[Ne]):Object.assign(je,function R(Be,xe,je){if("pie"===Be||"doughnut"===Be)return ee(se(je));if("polarArea"===Be)return function ce(Be){return{backgroundColor:Be.map(xe=>L(xe,.6)),borderColor:Be.map(xe=>L(xe,1)),hoverBackgroundColor:Be.map(xe=>L(xe,.8)),hoverBorderColor:Be.map(xe=>L(xe,1))}}(se(je));if("line"===Be||"radar"===Be)return function W(Be){return{backgroundColor:L(Be,.4),borderColor:L(Be,1),pointBackgroundColor:L(Be,1),pointBorderColor:"#fff",pointHoverBackgroundColor:"#fff",pointHoverBorderColor:L(Be,.8)}}(U(xe));if("bar"===Be||"horizontalBar"===Be)return function J(Be){return{backgroundColor:L(Be,.6),borderColor:L(Be,1),hoverBackgroundColor:L(Be,.8),hoverBorderColor:L(Be,1)}}(U(xe));if("bubble"===Be||"scatter"===Be)return ee(se(je));throw new Error(`getColors - Unsupported chart type ${Be}`)}(this.chartType,Ne,je.data.length),Object.assign({},je))})}ngOnChanges(je){let Ne=he.Default;const Bt=rt=>{Ne=rt>Ne?rt:Ne};switch(je.hasOwnProperty("data")&&je.data.currentValue&&(this.propagateDataToDatasets(je.data.currentValue),Bt(he.Update)),je.hasOwnProperty("datasets")&&je.datasets.currentValue&&(this.propagateDatasetsToData(je.datasets.currentValue),Bt(he.Update)),je.hasOwnProperty("labels")&&(this.chart&&(this.chart.data.labels=je.labels.currentValue),Bt(he.Update)),je.hasOwnProperty("legend")&&(this.chart&&(this.chart.config.options.legend.display=je.legend.currentValue,this.chart.generateLegend()),Bt(he.Update)),je.hasOwnProperty("options")&&Bt(he.Refresh),Ne){case he.Update:this.update();break;case he.Refresh:case he.Default:this.refresh()}}ngOnDestroy(){this.chart&&(this.chart.destroy(),this.chart=void 0),this.subs.forEach(je=>je.unsubscribe())}update(je){if(this.chart)return this.chart.update(je)}hideDataset(je,Ne){this.chart.getDatasetMeta(je).hidden=Ne,this.chart.update()}isDatasetHidden(je){return this.chart.getDatasetMeta(je).hidden}toBase64Image(){return this.chart.toBase64Image()}getChartConfiguration(){const je=this.getDatasets(),Ne=Object.assign({},this.options);!1===this.legend&&(Ne.legend={display:!1}),Ne.hover=Ne.hover||{},Ne.hover.onHover||(Ne.hover.onHover=(rt,en)=>{en&&!en.length||this.chartHover.emit({event:rt,active:en})}),Ne.onClick||(Ne.onClick=(rt,en)=>{this.chartClick.emit({event:rt,active:en})});const Bt=this.smartMerge(Ne,this.themeService.getColorschemesOptions());return{type:this.chartType,data:{labels:this.labels||[],datasets:je},plugins:this.plugins,options:Bt}}getChartBuilder(je){const Ne=this.getChartConfiguration();return new T.Chart(je,Ne)}smartMerge(je,Ne,Bt=0){if(0===Bt&&(je=function p(Be){return(0,f.Z)(Be,5)}(je)),Object.keys(Ne).forEach(en=>{if(Array.isArray(Ne[en])){const Pt=je[en];Pt&&Pt.forEach(Vt=>{this.smartMerge(Vt,Ne[en][0],Bt+1)})}else"object"==typeof Ne[en]?(en in je||(je[en]={}),this.smartMerge(je[en],Ne[en],Bt+1)):je[en]=Ne[en]}),0===Bt)return je}isMultiLineLabel(je){return Array.isArray(je)}joinLabel(je){return je?this.isMultiLineLabel(je)?je.join(" "):je:null}propagateDatasetsToData(je){this.data=this.datasets.map(Ne=>Ne.data),this.chart&&(this.chart.data.datasets=je),this.updateColors()}propagateDataToDatasets(je){this.isMultiDataSet(je)?this.datasets&&je.length===this.datasets.length?this.datasets.forEach((Ne,Bt)=>{Ne.data=je[Bt]}):(this.datasets=je.map((Ne,Bt)=>({data:Ne,label:this.joinLabel(this.labels[Bt])||`Label ${Bt}`})),this.chart&&(this.chart.data.datasets=this.datasets)):this.datasets?(this.datasets[0]||(this.datasets[0]={}),this.datasets[0].data=je,this.datasets.splice(1)):(this.datasets=[{data:je}],this.chart&&(this.chart.data.datasets=this.datasets)),this.updateColors()}isMultiDataSet(je){return Array.isArray(je[0])}getDatasets(){if(!this.datasets&&!this.data)throw new Error(`ng-charts configuration error, data or datasets field are required to render chart ${this.chartType}`);return this.datasets?(this.propagateDatasetsToData(this.datasets),this.datasets):this.data?(this.propagateDataToDatasets(this.data),this.datasets):void 0}refresh(){this.chart&&(this.chart.destroy(),this.chart=void 0),this.ctx&&(this.chart=this.getChartBuilder(this.ctx))}}return Be.\u0275fac=function(je){return new(je||Be)(r.Y36(r.SBq),r.Y36(ge))},Be.\u0275dir=r.lG2({type:Be,selectors:[["canvas","baseChart",""]],inputs:{options:"options",data:"data",datasets:"datasets",labels:"labels",chartType:"chartType",colors:"colors",legend:"legend",plugins:"plugins"},outputs:{chartClick:"chartClick",chartHover:"chartHover"},exportAs:["base-chart"],features:[r.TTD]}),Be})(),we=(()=>{class Be{}return Be.\u0275fac=function(je){return new(je||Be)},Be.\u0275mod=r.oAB({type:Be}),Be.\u0275inj=r.cJS({imports:[[]]}),Be})()},37496:(m,S,i)=>{"use strict";i.d(S,{b:()=>f,i:()=>a});var r=i(89724);let a=(()=>{class c{transform(p,y,T){return T?y.call(T,p):y(p)}}return c.\u0275fac=function(p){return new(p||c)},c.\u0275pipe=r.Yjl({name:"pipeFunction",type:c,pure:!0}),c})(),f=(()=>{class c{}return c.\u0275fac=function(p){return new(p||c)},c.\u0275mod=r.oAB({type:c}),c.\u0275inj=r.cJS({}),c})()},18228:m=>{"use strict";var S=Object.getOwnPropertySymbols,i=Object.prototype.hasOwnProperty,r=Object.prototype.propertyIsEnumerable;function a(c){if(null==c)throw new TypeError("Object.assign cannot be called with null or undefined");return Object(c)}m.exports=function f(){try{if(!Object.assign)return!1;var c=new String("abc");if(c[5]="de","5"===Object.getOwnPropertyNames(c)[0])return!1;for(var e={},p=0;p<10;p++)e["_"+String.fromCharCode(p)]=p;if("0123456789"!==Object.getOwnPropertyNames(e).map(function(C){return e[C]}).join(""))return!1;var T={};return"abcdefghijklmnopqrst".split("").forEach(function(C){T[C]=C}),"abcdefghijklmnopqrst"===Object.keys(Object.assign({},T)).join("")}catch(C){return!1}}()?Object.assign:function(c,e){for(var p,T,y=a(c),C=1;C<arguments.length;C++){for(var R in p=Object(arguments[C]))i.call(p,R)&&(y[R]=p[R]);if(S){T=S(p);for(var L=0;L<T.length;L++)r.call(p,T[L])&&(y[T[L]]=p[T[L]])}}return y}},81380:(m,S,i)=>{var r="function"==typeof Map&&Map.prototype,a=Object.getOwnPropertyDescriptor&&r?Object.getOwnPropertyDescriptor(Map.prototype,"size"):null,f=r&&a&&"function"==typeof a.get?a.get:null,c=r&&Map.prototype.forEach,e="function"==typeof Set&&Set.prototype,p=Object.getOwnPropertyDescriptor&&e?Object.getOwnPropertyDescriptor(Set.prototype,"size"):null,y=e&&p&&"function"==typeof p.get?p.get:null,T=e&&Set.prototype.forEach,R="function"==typeof WeakMap&&WeakMap.prototype?WeakMap.prototype.has:null,z="function"==typeof WeakSet&&WeakSet.prototype?WeakSet.prototype.has:null,J="function"==typeof WeakRef&&WeakRef.prototype?WeakRef.prototype.deref:null,ee=Boolean.prototype.valueOf,ce=Object.prototype.toString,ie=Function.prototype.toString,U=String.prototype.match,se=String.prototype.slice,ge=String.prototype.replace,ae=String.prototype.toUpperCase,he=String.prototype.toLowerCase,be=RegExp.prototype.test,we=Array.prototype.concat,ue=Array.prototype.join,st=Array.prototype.slice,We=Math.floor,Ve="function"==typeof BigInt?BigInt.prototype.valueOf:null,Be=Object.getOwnPropertySymbols,xe="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?Symbol.prototype.toString:null,je="function"==typeof Symbol&&"object"==typeof Symbol.iterator,Ne="function"==typeof Symbol&&Symbol.toStringTag&&(Symbol,1)?Symbol.toStringTag:null,Bt=Object.prototype.propertyIsEnumerable,rt=("function"==typeof Reflect?Reflect.getPrototypeOf:Object.getPrototypeOf)||([].__proto__===Array.prototype?function(ln){return ln.__proto__}:null);function en(ln,Mn){if(ln===1/0||ln===-1/0||ln!=ln||ln&&ln>-1e3&&ln<1e3||be.call(/e/,Mn))return Mn;var Zn=/[0-9](?=(?:[0-9]{3})+(?![0-9]))/g;if("number"==typeof ln){var cn=ln<0?-We(-ln):We(ln);if(cn!==ln){var Sn=String(cn),Or=se.call(Mn,Sn.length+1);return ge.call(Sn,Zn,"$&_")+"."+ge.call(ge.call(Or,/([0-9]{3})/g,"$&_"),/_$/,"")}}return ge.call(Mn,Zn,"$&_")}var Pt=i(24654),Vt=Pt.custom,hn=ur(Vt)?Vt:null;function vn(ln,Mn,Zn){var cn="double"===(Zn.quoteStyle||Mn)?'"':"'";return cn+ln+cn}function mt(ln){return ge.call(String(ln),/"/g,"&quot;")}function Nt(ln){return!("[object Array]"!==Xn(ln)||Ne&&"object"==typeof ln&&Ne in ln)}function Yt(ln){return!("[object RegExp]"!==Xn(ln)||Ne&&"object"==typeof ln&&Ne in ln)}function ur(ln){if(je)return ln&&"object"==typeof ln&&ln instanceof Symbol;if("symbol"==typeof ln)return!0;if(!ln||"object"!=typeof ln||!xe)return!1;try{return xe.call(ln),!0}catch(Mn){}return!1}m.exports=function ln(Mn,Zn,cn,Sn){var Or=Zn||{};if(Pn(Or,"quoteStyle")&&"single"!==Or.quoteStyle&&"double"!==Or.quoteStyle)throw new TypeError('option "quoteStyle" must be "single" or "double"');if(Pn(Or,"maxStringLength")&&("number"==typeof Or.maxStringLength?Or.maxStringLength<0&&Or.maxStringLength!==1/0:null!==Or.maxStringLength))throw new TypeError('option "maxStringLength", if provided, must be a positive integer, Infinity, or `null`');var ri=!Pn(Or,"customInspect")||Or.customInspect;if("boolean"!=typeof ri&&"symbol"!==ri)throw new TypeError("option \"customInspect\", if provided, must be `true`, `false`, or `'symbol'`");if(Pn(Or,"indent")&&null!==Or.indent&&"\t"!==Or.indent&&!(parseInt(Or.indent,10)===Or.indent&&Or.indent>0))throw new TypeError('option "indent" must be "\\t", an integer > 0, or `null`');if(Pn(Or,"numericSeparator")&&"boolean"!=typeof Or.numericSeparator)throw new TypeError('option "numericSeparator", if provided, must be `true` or `false`');var vi=Or.numericSeparator;if(void 0===Mn)return"undefined";if(null===Mn)return"null";if("boolean"==typeof Mn)return Mn?"true":"false";if("string"==typeof Mn)return un(Mn,Or);if("number"==typeof Mn){if(0===Mn)return 1/0/Mn>0?"0":"-0";var Ui=String(Mn);return vi?en(Mn,Ui):Ui}if("bigint"==typeof Mn){var ao=String(Mn)+"n";return vi?en(Mn,ao):ao}var dt=void 0===Or.depth?5:Or.depth;if(void 0===cn&&(cn=0),cn>=dt&&dt>0&&"object"==typeof Mn)return Nt(Mn)?"[Array]":"[Object]";var Bi=function ii(ln,Mn){var Zn;if("\t"===ln.indent)Zn="\t";else{if(!("number"==typeof ln.indent&&ln.indent>0))return null;Zn=ue.call(Array(ln.indent+1)," ")}return{base:Zn,prev:ue.call(Array(Mn+1),Zn)}}(Or,cn);if(void 0===Sn)Sn=[];else if(Qr(Sn,Mn)>=0)return"[Circular]";function to(Ko,qn,ei){if(qn&&(Sn=st.call(Sn)).push(qn),ei){var wn={depth:Or.depth};return Pn(Or,"quoteStyle")&&(wn.quoteStyle=Or.quoteStyle),ln(Ko,wn,cn+1,Sn)}return ln(Ko,Or,cn+1,Sn)}if("function"==typeof Mn&&!Yt(Mn)){var Gt=function dr(ln){if(ln.name)return ln.name;var Mn=U.call(ie.call(ln),/^function\s*([\w$]+)/);return Mn?Mn[1]:null}(Mn),Rn=Ki(Mn,to);return"[Function"+(Gt?": "+Gt:" (anonymous)")+"]"+(Rn.length>0?" { "+ue.call(Rn,", ")+" }":"")}if(ur(Mn)){var _t=je?ge.call(String(Mn),/^(Symbol\(.*\))_[^)]*$/,"$1"):xe.call(Mn);return"object"!=typeof Mn||je?_t:Jn(_t)}if(function Kt(ln){return!(!ln||"object"!=typeof ln)&&("undefined"!=typeof HTMLElement&&ln instanceof HTMLElement||"string"==typeof ln.nodeName&&"function"==typeof ln.getAttribute)}(Mn)){for(var Rt="<"+he.call(String(Mn.nodeName)),ct=Mn.attributes||[],pt=0;pt<ct.length;pt++)Rt+=" "+ct[pt].name+"="+vn(mt(ct[pt].value),"double",Or);return Rt+=">",Mn.childNodes&&Mn.childNodes.length&&(Rt+="..."),Rt+"</"+he.call(String(Mn.nodeName))+">"}if(Nt(Mn)){if(0===Mn.length)return"[]";var kt=Ki(Mn,to);return Bi&&!function Zi(ln){for(var Mn=0;Mn<ln.length;Mn++)if(Qr(ln[Mn],"\n")>=0)return!1;return!0}(kt)?"["+hr(kt,Bi)+"]":"[ "+ue.call(kt,", ")+" ]"}if(function Fn(ln){return!("[object Error]"!==Xn(ln)||Ne&&"object"==typeof ln&&Ne in ln)}(Mn)){var dn=Ki(Mn,to);return"cause"in Error.prototype||!("cause"in Mn)||Bt.call(Mn,"cause")?0===dn.length?"["+String(Mn)+"]":"{ ["+String(Mn)+"] "+ue.call(dn,", ")+" }":"{ ["+String(Mn)+"] "+ue.call(we.call("[cause]: "+to(Mn.cause),dn),", ")+" }"}if("object"==typeof Mn&&ri){if(hn&&"function"==typeof Mn[hn]&&Pt)return Pt(Mn,{depth:dt-cn});if("symbol"!==ri&&"function"==typeof Mn.inspect)return Mn.inspect()}if(function Ci(ln){if(!f||!ln||"object"!=typeof ln)return!1;try{f.call(ln);try{y.call(ln)}catch(Mn){return!0}return ln instanceof Map}catch(Mn){}return!1}(Mn)){var mr=[];return c&&c.call(Mn,function(Ko,qn){mr.push(to(qn,Mn,!0)+" => "+to(Ko,Mn))}),Xr("Map",f.call(Mn),mr,Bi)}if(function Ro(ln){if(!y||!ln||"object"!=typeof ln)return!1;try{y.call(ln);try{f.call(ln)}catch(Mn){return!0}return ln instanceof Set}catch(Mn){}return!1}(Mn)){var Oi=[];return T&&T.call(Mn,function(Ko){Oi.push(to(Ko,Mn))}),Xr("Set",y.call(Mn),Oi,Bi)}if(function _i(ln){if(!R||!ln||"object"!=typeof ln)return!1;try{R.call(ln,R);try{z.call(ln,z)}catch(Mn){return!0}return ln instanceof WeakMap}catch(Mn){}return!1}(Mn))return Gn("WeakMap");if(function Sr(ln){if(!z||!ln||"object"!=typeof ln)return!1;try{z.call(ln,z);try{R.call(ln,R)}catch(Mn){return!0}return ln instanceof WeakSet}catch(Mn){}return!1}(Mn))return Gn("WeakSet");if(function so(ln){if(!J||!ln||"object"!=typeof ln)return!1;try{return J.call(ln),!0}catch(Mn){}return!1}(Mn))return Gn("WeakRef");if(function Ei(ln){return!("[object Number]"!==Xn(ln)||Ne&&"object"==typeof ln&&Ne in ln)}(Mn))return Jn(to(Number(Mn)));if(function $r(ln){if(!ln||"object"!=typeof ln||!Ve)return!1;try{return Ve.call(ln),!0}catch(Mn){}return!1}(Mn))return Jn(to(Ve.call(Mn)));if(function mi(ln){return!("[object Boolean]"!==Xn(ln)||Ne&&"object"==typeof ln&&Ne in ln)}(Mn))return Jn(ee.call(Mn));if(function pr(ln){return!("[object String]"!==Xn(ln)||Ne&&"object"==typeof ln&&Ne in ln)}(Mn))return Jn(to(String(Mn)));if(!function St(ln){return!("[object Date]"!==Xn(ln)||Ne&&"object"==typeof ln&&Ne in ln)}(Mn)&&!Yt(Mn)){var di=Ki(Mn,to),Uo=rt?rt(Mn)===Object.prototype:Mn instanceof Object||Mn.constructor===Object,Qo=Mn instanceof Object?"":"null prototype",lo=!Uo&&Ne&&Object(Mn)===Mn&&Ne in Mn?se.call(Xn(Mn),8,-1):Qo?"Object":"",Fo=(Uo||"function"!=typeof Mn.constructor?"":Mn.constructor.name?Mn.constructor.name+" ":"")+(lo||Qo?"["+ue.call(we.call([],lo||[],Qo||[]),": ")+"] ":"");return 0===di.length?Fo+"{}":Bi?Fo+"{"+hr(di,Bi)+"}":Fo+"{ "+ue.call(di,", ")+" }"}return String(Mn)};var Br=Object.prototype.hasOwnProperty||function(ln){return ln in this};function Pn(ln,Mn){return Br.call(ln,Mn)}function Xn(ln){return ce.call(ln)}function Qr(ln,Mn){if(ln.indexOf)return ln.indexOf(Mn);for(var Zn=0,cn=ln.length;Zn<cn;Zn++)if(ln[Zn]===Mn)return Zn;return-1}function un(ln,Mn){if(ln.length>Mn.maxStringLength){var Zn=ln.length-Mn.maxStringLength,cn="... "+Zn+" more character"+(Zn>1?"s":"");return un(se.call(ln,0,Mn.maxStringLength),Mn)+cn}return vn(ge.call(ge.call(ln,/(['\\])/g,"\\$1"),/[\x00-\x1f]/g,jn),"single",Mn)}function jn(ln){var Mn=ln.charCodeAt(0),Zn={8:"b",9:"t",10:"n",12:"f",13:"r"}[Mn];return Zn?"\\"+Zn:"\\x"+(Mn<16?"0":"")+ae.call(Mn.toString(16))}function Jn(ln){return"Object("+ln+")"}function Gn(ln){return ln+" { ? }"}function Xr(ln,Mn,Zn,cn){return ln+" ("+Mn+") {"+(cn?hr(Zn,cn):ue.call(Zn,", "))+"}"}function hr(ln,Mn){if(0===ln.length)return"";var Zn="\n"+Mn.prev+Mn.base;return Zn+ue.call(ln,","+Zn)+"\n"+Mn.prev}function Ki(ln,Mn){var Zn=Nt(ln),cn=[];if(Zn){cn.length=ln.length;for(var Sn=0;Sn<ln.length;Sn++)cn[Sn]=Pn(ln,Sn)?Mn(ln[Sn],ln):""}var ri,Or="function"==typeof Be?Be(ln):[];if(je){ri={};for(var vi=0;vi<Or.length;vi++)ri["$"+Or[vi]]=Or[vi]}for(var Ui in ln)!Pn(ln,Ui)||Zn&&String(Number(Ui))===Ui&&Ui<ln.length||je&&ri["$"+Ui]instanceof Symbol||(be.call(/[^\w$]/,Ui)?cn.push(Mn(Ui,ln)+": "+Mn(ln[Ui],ln)):cn.push(Ui+": "+Mn(ln[Ui],ln)));if("function"==typeof Be)for(var ao=0;ao<Or.length;ao++)Bt.call(ln,Or[ao])&&cn.push("["+Mn(Or[ao])+"]: "+Mn(ln[Or[ao]],ln));return cn}},25119:(m,S,i)=>{"use strict";var r=i(88411);function a(){}function f(){}f.resetWarningCache=a,m.exports=function(){function c(y,T,C,R,L,z){if(z!==r){var W=new Error("Calling PropTypes validators directly is not supported by the `prop-types` package. Use PropTypes.checkPropTypes() to call them. Read more at http://fb.me/use-check-prop-types");throw W.name="Invariant Violation",W}}function e(){return c}c.isRequired=c;var p={array:c,bigint:c,bool:c,func:c,number:c,object:c,string:c,symbol:c,any:c,arrayOf:e,element:c,elementType:c,instanceOf:e,node:c,objectOf:e,oneOf:e,oneOfType:e,shape:e,exact:e,checkPropTypes:f,resetWarningCache:a};return p.PropTypes=p,p}},76874:(m,S,i)=>{m.exports=i(25119)()},88411:m=>{"use strict";m.exports="SECRET_DO_NOT_PASS_THIS_OR_YOU_WILL_BE_FIRED"},87504:function(m,S,i){var r;m=i.nmd(m),function(a){"object"==typeof global&&global;var p,y=2147483647,T=36,ce=/^xn--/,ie=/[^\x20-\x7E]/,U=/[\x2E\u3002\uFF0E\uFF61]/g,se={overflow:"Overflow: input needs wider integers to process","not-basic":"Illegal input >= 0x80 (not a basic code point)","invalid-input":"Invalid input"},ae=Math.floor,he=String.fromCharCode;function we(Pt){throw RangeError(se[Pt])}function ue(Pt,Vt){for(var hn=Pt.length,vn=[];hn--;)vn[hn]=Vt(Pt[hn]);return vn}function st(Pt,Vt){var hn=Pt.split("@"),vn="";return hn.length>1&&(vn=hn[0]+"@",Pt=hn[1]),vn+ue((Pt=Pt.replace(U,".")).split("."),Vt).join(".")}function We(Pt){for(var mt,Nt,Vt=[],hn=0,vn=Pt.length;hn<vn;)(mt=Pt.charCodeAt(hn++))>=55296&&mt<=56319&&hn<vn?56320==(64512&(Nt=Pt.charCodeAt(hn++)))?Vt.push(((1023&mt)<<10)+(1023&Nt)+65536):(Vt.push(mt),hn--):Vt.push(mt);return Vt}function Ve(Pt){return ue(Pt,function(Vt){var hn="";return Vt>65535&&(hn+=he((Vt-=65536)>>>10&1023|55296),Vt=56320|1023&Vt),hn+he(Vt)}).join("")}function Be(Pt){return Pt-48<10?Pt-22:Pt-65<26?Pt-65:Pt-97<26?Pt-97:T}function xe(Pt,Vt){return Pt+22+75*(Pt<26)-((0!=Vt)<<5)}function je(Pt,Vt,hn){var vn=0;for(Pt=hn?ae(Pt/700):Pt>>1,Pt+=ae(Pt/Vt);Pt>455;vn+=T)Pt=ae(Pt/35);return ae(vn+36*Pt/(Pt+38))}function Ne(Pt){var vn,Yt,Fn,pr,Ei,mi,ur,$r,Br,Pn,Vt=[],hn=Pt.length,mt=0,Nt=128,St=72;for((Yt=Pt.lastIndexOf("-"))<0&&(Yt=0),Fn=0;Fn<Yt;++Fn)Pt.charCodeAt(Fn)>=128&&we("not-basic"),Vt.push(Pt.charCodeAt(Fn));for(pr=Yt>0?Yt+1:0;pr<hn;){for(Ei=mt,mi=1,ur=T;pr>=hn&&we("invalid-input"),(($r=Be(Pt.charCodeAt(pr++)))>=T||$r>ae((y-mt)/mi))&&we("overflow"),mt+=$r*mi,!($r<(Br=ur<=St?1:ur>=St+26?26:ur-St));ur+=T)mi>ae(y/(Pn=T-Br))&&we("overflow"),mi*=Pn;St=je(mt-Ei,vn=Vt.length+1,0==Ei),ae(mt/vn)>y-Nt&&we("overflow"),Nt+=ae(mt/vn),mt%=vn,Vt.splice(mt++,0,Nt)}return Ve(Vt)}function Bt(Pt){var Vt,hn,vn,mt,Nt,St,Yt,Fn,pr,Ei,mi,$r,Br,Pn,Xn,ur=[];for($r=(Pt=We(Pt)).length,Vt=128,hn=0,Nt=72,St=0;St<$r;++St)(mi=Pt[St])<128&&ur.push(he(mi));for(vn=mt=ur.length,mt&&ur.push("-");vn<$r;){for(Yt=y,St=0;St<$r;++St)(mi=Pt[St])>=Vt&&mi<Yt&&(Yt=mi);for(Yt-Vt>ae((y-hn)/(Br=vn+1))&&we("overflow"),hn+=(Yt-Vt)*Br,Vt=Yt,St=0;St<$r;++St)if((mi=Pt[St])<Vt&&++hn>y&&we("overflow"),mi==Vt){for(Fn=hn,pr=T;!(Fn<(Ei=pr<=Nt?1:pr>=Nt+26?26:pr-Nt));pr+=T)ur.push(he(xe(Ei+(Xn=Fn-Ei)%(Pn=T-Ei),0))),Fn=ae(Xn/Pn);ur.push(he(xe(Fn,0))),Nt=je(hn,Br,vn==mt),hn=0,++vn}++hn,++Vt}return ur.join("")}p={version:"1.3.2",ucs2:{decode:We,encode:Ve},decode:Ne,encode:Bt,toASCII:function en(Pt){return st(Pt,function(Vt){return ie.test(Vt)?"xn--"+Bt(Vt):Vt})},toUnicode:function rt(Pt){return st(Pt,function(Vt){return ce.test(Vt)?Ne(Vt.slice(4).toLowerCase()):Vt})}},void 0!==(r=function(){return p}.call(S,i,S,m))&&(m.exports=r)}()},8157:m=>{"use strict";var S=String.prototype.replace,i=/%20/g;m.exports={default:"RFC3986",formatters:{RFC1738:function(a){return S.call(a,i,"+")},RFC3986:function(a){return String(a)}},RFC1738:"RFC1738",RFC3986:"RFC3986"}},59009:(m,S,i)=>{"use strict";var r=i(75672),a=i(19913),f=i(8157);m.exports={formats:f,parse:a,stringify:r}},19913:(m,S,i)=>{"use strict";var r=i(16835),a=Object.prototype.hasOwnProperty,f=Array.isArray,c={allowDots:!1,allowPrototypes:!1,allowSparse:!1,arrayLimit:20,charset:"utf-8",charsetSentinel:!1,comma:!1,decoder:r.decode,delimiter:"&",depth:5,ignoreQueryPrefix:!1,interpretNumericEntities:!1,parameterLimit:1e3,parseArrays:!0,plainObjects:!1,strictNullHandling:!1},p=function(W,J){return W&&"string"==typeof W&&J.comma&&W.indexOf(",")>-1?W.split(","):W},L=function(J,ee,ce,ie){if(J){var U=ce.allowDots?J.replace(/\.([^.[]+)/g,"[$1]"):J,ge=/(\[[^[\]]*])/g,ae=ce.depth>0&&/(\[[^[\]]*])/.exec(U),he=ae?U.slice(0,ae.index):U,be=[];if(he){if(!ce.plainObjects&&a.call(Object.prototype,he)&&!ce.allowPrototypes)return;be.push(he)}for(var we=0;ce.depth>0&&null!==(ae=ge.exec(U))&&we<ce.depth;){if(we+=1,!ce.plainObjects&&a.call(Object.prototype,ae[1].slice(1,-1))&&!ce.allowPrototypes)return;be.push(ae[1])}return ae&&be.push("["+U.slice(ae.index)+"]"),function(W,J,ee,ce){for(var ie=ce?J:p(J,ee),U=W.length-1;U>=0;--U){var se,ge=W[U];if("[]"===ge&&ee.parseArrays)se=[].concat(ie);else{se=ee.plainObjects?Object.create(null):{};var ae="["===ge.charAt(0)&&"]"===ge.charAt(ge.length-1)?ge.slice(1,-1):ge,he=parseInt(ae,10);ee.parseArrays||""!==ae?!isNaN(he)&&ge!==ae&&String(he)===ae&&he>=0&&ee.parseArrays&&he<=ee.arrayLimit?(se=[])[he]=ie:"__proto__"!==ae&&(se[ae]=ie):se={0:ie}}ie=se}return ie}(be,ee,ce,ie)}};m.exports=function(W,J){var ee=function(J){if(!J)return c;if(null!=J.decoder&&"function"!=typeof J.decoder)throw new TypeError("Decoder has to be a function.");if(void 0!==J.charset&&"utf-8"!==J.charset&&"iso-8859-1"!==J.charset)throw new TypeError("The charset option must be either utf-8, iso-8859-1, or undefined");return{allowDots:void 0===J.allowDots?c.allowDots:!!J.allowDots,allowPrototypes:"boolean"==typeof J.allowPrototypes?J.allowPrototypes:c.allowPrototypes,allowSparse:"boolean"==typeof J.allowSparse?J.allowSparse:c.allowSparse,arrayLimit:"number"==typeof J.arrayLimit?J.arrayLimit:c.arrayLimit,charset:void 0===J.charset?c.charset:J.charset,charsetSentinel:"boolean"==typeof J.charsetSentinel?J.charsetSentinel:c.charsetSentinel,comma:"boolean"==typeof J.comma?J.comma:c.comma,decoder:"function"==typeof J.decoder?J.decoder:c.decoder,delimiter:"string"==typeof J.delimiter||r.isRegExp(J.delimiter)?J.delimiter:c.delimiter,depth:"number"==typeof J.depth||!1===J.depth?+J.depth:c.depth,ignoreQueryPrefix:!0===J.ignoreQueryPrefix,interpretNumericEntities:"boolean"==typeof J.interpretNumericEntities?J.interpretNumericEntities:c.interpretNumericEntities,parameterLimit:"number"==typeof J.parameterLimit?J.parameterLimit:c.parameterLimit,parseArrays:!1!==J.parseArrays,plainObjects:"boolean"==typeof J.plainObjects?J.plainObjects:c.plainObjects,strictNullHandling:"boolean"==typeof J.strictNullHandling?J.strictNullHandling:c.strictNullHandling}}(J);if(""===W||null==W)return ee.plainObjects?Object.create(null):{};for(var ce="string"==typeof W?function(J,ee){var ae,ce={},se=(ee.ignoreQueryPrefix?J.replace(/^\?/,""):J).split(ee.delimiter,ee.parameterLimit===1/0?void 0:ee.parameterLimit),ge=-1,he=ee.charset;if(ee.charsetSentinel)for(ae=0;ae<se.length;++ae)0===se[ae].indexOf("utf8=")&&("utf8=%E2%9C%93"===se[ae]?he="utf-8":"utf8=%26%2310003%3B"===se[ae]&&(he="iso-8859-1"),ge=ae,ae=se.length);for(ae=0;ae<se.length;++ae)if(ae!==ge){var st,We,be=se[ae],we=be.indexOf("]="),ue=-1===we?be.indexOf("="):we+1;-1===ue?(st=ee.decoder(be,c.decoder,he,"key"),We=ee.strictNullHandling?null:""):(st=ee.decoder(be.slice(0,ue),c.decoder,he,"key"),We=r.maybeMap(p(be.slice(ue+1),ee),function(Ve){return ee.decoder(Ve,c.decoder,he,"value")})),We&&ee.interpretNumericEntities&&"iso-8859-1"===he&&(We=We.replace(/&#(\d+);/g,function(J,ee){return String.fromCharCode(parseInt(ee,10))})),be.indexOf("[]=")>-1&&(We=f(We)?[We]:We),ce[st]=a.call(ce,st)?r.combine(ce[st],We):We}return ce}(W,ee):W,ie=ee.plainObjects?Object.create(null):{},U=Object.keys(ce),se=0;se<U.length;++se){var ge=U[se],ae=L(ge,ce[ge],ee,"string"==typeof W);ie=r.merge(ie,ae,ee)}return!0===ee.allowSparse?ie:r.compact(ie)}},75672:(m,S,i)=>{"use strict";var r=i(11144),a=i(16835),f=i(8157),c=Object.prototype.hasOwnProperty,e={brackets:function(U){return U+"[]"},comma:"comma",indices:function(U,se){return U+"["+se+"]"},repeat:function(U){return U}},p=Array.isArray,y=String.prototype.split,T=Array.prototype.push,C=function(ie,U){T.apply(ie,p(U)?U:[U])},R=Date.prototype.toISOString,L=f.default,z={addQueryPrefix:!1,allowDots:!1,charset:"utf-8",charsetSentinel:!1,delimiter:"&",encode:!0,encoder:a.encode,encodeValuesOnly:!1,format:L,formatter:f.formatters[L],indices:!1,serializeDate:function(U){return R.call(U)},skipNulls:!1,strictNullHandling:!1},J={},ee=function ie(U,se,ge,ae,he,be,we,ue,st,We,Ve,Be,xe,je,Ne,Bt){for(var rt=U,en=Bt,Pt=0,Vt=!1;void 0!==(en=en.get(J))&&!Vt;){var hn=en.get(U);if(Pt+=1,void 0!==hn){if(hn===Pt)throw new RangeError("Cyclic object value");Vt=!0}void 0===en.get(J)&&(Pt=0)}if("function"==typeof ue?rt=ue(se,rt):rt instanceof Date?rt=Ve(rt):"comma"===ge&&p(rt)&&(rt=a.maybeMap(rt,function(Xn){return Xn instanceof Date?Ve(Xn):Xn})),null===rt){if(he)return we&&!je?we(se,z.encoder,Ne,"key",Be):se;rt=""}if(function(U){return"string"==typeof U||"number"==typeof U||"boolean"==typeof U||"symbol"==typeof U||"bigint"==typeof U}(rt)||a.isBuffer(rt)){if(we){var vn=je?se:we(se,z.encoder,Ne,"key",Be);if("comma"===ge&&je){for(var mt=y.call(String(rt),","),Nt="",St=0;St<mt.length;++St)Nt+=(0===St?"":",")+xe(we(mt[St],z.encoder,Ne,"value",Be));return[xe(vn)+(ae&&p(rt)&&1===mt.length?"[]":"")+"="+Nt]}return[xe(vn)+"="+xe(we(rt,z.encoder,Ne,"value",Be))]}return[xe(se)+"="+xe(String(rt))]}var Fn,Yt=[];if(void 0===rt)return Yt;if("comma"===ge&&p(rt))Fn=[{value:rt.length>0?rt.join(",")||null:void 0}];else if(p(ue))Fn=ue;else{var pr=Object.keys(rt);Fn=st?pr.sort(st):pr}for(var Ei=ae&&p(rt)&&1===rt.length?se+"[]":se,mi=0;mi<Fn.length;++mi){var ur=Fn[mi],$r="object"==typeof ur&&void 0!==ur.value?ur.value:rt[ur];if(!be||null!==$r){var Br=p(rt)?"function"==typeof ge?ge(Ei,ur):Ei:Ei+(We?"."+ur:"["+ur+"]");Bt.set(U,Pt);var Pn=r();Pn.set(J,Bt),C(Yt,ie($r,Br,ge,ae,he,be,we,ue,st,We,Ve,Be,xe,je,Ne,Pn))}}return Yt};m.exports=function(ie,U){var ae,se=ie,ge=function(U){if(!U)return z;if(null!=U.encoder&&"function"!=typeof U.encoder)throw new TypeError("Encoder has to be a function.");var se=U.charset||z.charset;if(void 0!==U.charset&&"utf-8"!==U.charset&&"iso-8859-1"!==U.charset)throw new TypeError("The charset option must be either utf-8, iso-8859-1, or undefined");var ge=f.default;if(void 0!==U.format){if(!c.call(f.formatters,U.format))throw new TypeError("Unknown format option provided.");ge=U.format}var ae=f.formatters[ge],he=z.filter;return("function"==typeof U.filter||p(U.filter))&&(he=U.filter),{addQueryPrefix:"boolean"==typeof U.addQueryPrefix?U.addQueryPrefix:z.addQueryPrefix,allowDots:void 0===U.allowDots?z.allowDots:!!U.allowDots,charset:se,charsetSentinel:"boolean"==typeof U.charsetSentinel?U.charsetSentinel:z.charsetSentinel,delimiter:void 0===U.delimiter?z.delimiter:U.delimiter,encode:"boolean"==typeof U.encode?U.encode:z.encode,encoder:"function"==typeof U.encoder?U.encoder:z.encoder,encodeValuesOnly:"boolean"==typeof U.encodeValuesOnly?U.encodeValuesOnly:z.encodeValuesOnly,filter:he,format:ge,formatter:ae,serializeDate:"function"==typeof U.serializeDate?U.serializeDate:z.serializeDate,skipNulls:"boolean"==typeof U.skipNulls?U.skipNulls:z.skipNulls,sort:"function"==typeof U.sort?U.sort:null,strictNullHandling:"boolean"==typeof U.strictNullHandling?U.strictNullHandling:z.strictNullHandling}}(U);"function"==typeof ge.filter?se=(0,ge.filter)("",se):p(ge.filter)&&(ae=ge.filter);var be=[];if("object"!=typeof se||null===se)return"";var ue=e[U&&U.arrayFormat in e?U.arrayFormat:U&&"indices"in U?U.indices?"indices":"repeat":"indices"];if(U&&"commaRoundTrip"in U&&"boolean"!=typeof U.commaRoundTrip)throw new TypeError("`commaRoundTrip` must be a boolean, or absent");var st="comma"===ue&&U&&U.commaRoundTrip;ae||(ae=Object.keys(se)),ge.sort&&ae.sort(ge.sort);for(var We=r(),Ve=0;Ve<ae.length;++Ve){var Be=ae[Ve];ge.skipNulls&&null===se[Be]||C(be,ee(se[Be],Be,ue,st,ge.strictNullHandling,ge.skipNulls,ge.encode?ge.encoder:null,ge.filter,ge.sort,ge.allowDots,ge.serializeDate,ge.format,ge.formatter,ge.encodeValuesOnly,ge.charset,We))}var xe=be.join(ge.delimiter),je=!0===ge.addQueryPrefix?"?":"";return ge.charsetSentinel&&(je+="iso-8859-1"===ge.charset?"utf8=%26%2310003%3B&":"utf8=%E2%9C%93&"),xe.length>0?je+xe:""}},16835:(m,S,i)=>{"use strict";var r=i(8157),a=Object.prototype.hasOwnProperty,f=Array.isArray,c=function(){for(var ce=[],ie=0;ie<256;++ie)ce.push("%"+((ie<16?"0":"")+ie.toString(16)).toUpperCase());return ce}(),p=function(ie,U){for(var se=U&&U.plainObjects?Object.create(null):{},ge=0;ge<ie.length;++ge)void 0!==ie[ge]&&(se[ge]=ie[ge]);return se};m.exports={arrayToObject:p,assign:function(ie,U){return Object.keys(U).reduce(function(se,ge){return se[ge]=U[ge],se},ie)},combine:function(ie,U){return[].concat(ie,U)},compact:function(ie){for(var U=[{obj:{o:ie},prop:"o"}],se=[],ge=0;ge<U.length;++ge)for(var ae=U[ge],he=ae.obj[ae.prop],be=Object.keys(he),we=0;we<be.length;++we){var ue=be[we],st=he[ue];"object"==typeof st&&null!==st&&-1===se.indexOf(st)&&(U.push({obj:he,prop:ue}),se.push(st))}return function(ie){for(;ie.length>1;){var U=ie.pop(),se=U.obj[U.prop];if(f(se)){for(var ge=[],ae=0;ae<se.length;++ae)void 0!==se[ae]&&ge.push(se[ae]);U.obj[U.prop]=ge}}}(U),ie},decode:function(ce,ie,U){var se=ce.replace(/\+/g," ");if("iso-8859-1"===U)return se.replace(/%[0-9a-f]{2}/gi,unescape);try{return decodeURIComponent(se)}catch(ge){return se}},encode:function(ie,U,se,ge,ae){if(0===ie.length)return ie;var he=ie;if("symbol"==typeof ie?he=Symbol.prototype.toString.call(ie):"string"!=typeof ie&&(he=String(ie)),"iso-8859-1"===se)return escape(he).replace(/%u[0-9a-f]{4}/gi,function(st){return"%26%23"+parseInt(st.slice(2),16)+"%3B"});for(var be="",we=0;we<he.length;++we){var ue=he.charCodeAt(we);45===ue||46===ue||95===ue||126===ue||ue>=48&&ue<=57||ue>=65&&ue<=90||ue>=97&&ue<=122||ae===r.RFC1738&&(40===ue||41===ue)?be+=he.charAt(we):ue<128?be+=c[ue]:ue<2048?be+=c[192|ue>>6]+c[128|63&ue]:ue<55296||ue>=57344?be+=c[224|ue>>12]+c[128|ue>>6&63]+c[128|63&ue]:(ue=65536+((1023&ue)<<10|1023&he.charCodeAt(we+=1)),be+=c[240|ue>>18]+c[128|ue>>12&63]+c[128|ue>>6&63]+c[128|63&ue])}return be},isBuffer:function(ie){return!(!ie||"object"!=typeof ie||!(ie.constructor&&ie.constructor.isBuffer&&ie.constructor.isBuffer(ie)))},isRegExp:function(ie){return"[object RegExp]"===Object.prototype.toString.call(ie)},maybeMap:function(ie,U){if(f(ie)){for(var se=[],ge=0;ge<ie.length;ge+=1)se.push(U(ie[ge]));return se}return U(ie)},merge:function ce(ie,U,se){if(!U)return ie;if("object"!=typeof U){if(f(ie))ie.push(U);else{if(!ie||"object"!=typeof ie)return[ie,U];(se&&(se.plainObjects||se.allowPrototypes)||!a.call(Object.prototype,U))&&(ie[U]=!0)}return ie}if(!ie||"object"!=typeof ie)return[ie].concat(U);var ge=ie;return f(ie)&&!f(U)&&(ge=p(ie,se)),f(ie)&&f(U)?(U.forEach(function(ae,he){if(a.call(ie,he)){var be=ie[he];be&&"object"==typeof be&&ae&&"object"==typeof ae?ie[he]=ce(be,ae,se):ie.push(ae)}else ie[he]=ae}),ie):Object.keys(U).reduce(function(ae,he){var be=U[he];return ae[he]=a.call(ae,he)?ce(ae[he],be,se):be,ae},ge)}}},98216:m=>{"use strict";function S(i,r){return Object.prototype.hasOwnProperty.call(i,r)}m.exports=function(i,r,a,f){a=a||"=";var c={};if("string"!=typeof i||0===i.length)return c;var e=/\+/g;i=i.split(r=r||"&");var p=1e3;f&&"number"==typeof f.maxKeys&&(p=f.maxKeys);var y=i.length;p>0&&y>p&&(y=p);for(var T=0;T<y;++T){var L,z,W,J,C=i[T].replace(e,"%20"),R=C.indexOf(a);R>=0?(L=C.substr(0,R),z=C.substr(R+1)):(L=C,z=""),W=decodeURIComponent(L),J=decodeURIComponent(z),S(c,W)?Array.isArray(c[W])?c[W].push(J):c[W]=[c[W],J]:c[W]=J}return c}},36173:m=>{"use strict";var S=function(i){switch(typeof i){case"string":return i;case"boolean":return i?"true":"false";case"number":return isFinite(i)?i:"";default:return""}};m.exports=function(i,r,a,f){return r=r||"&",a=a||"=",null===i&&(i=void 0),"object"==typeof i?Object.keys(i).map(function(c){var e=encodeURIComponent(S(c))+a;return Array.isArray(i[c])?i[c].map(function(p){return e+encodeURIComponent(S(p))}).join(r):e+encodeURIComponent(S(i[c]))}).join(r):f?encodeURIComponent(S(f))+a+encodeURIComponent(S(i)):""}},36284:(m,S,i)=>{"use strict";S.decode=S.parse=i(98216),S.encode=S.stringify=i(36173)},76959:(m,S)=>{"use strict";var i=Object.prototype.hasOwnProperty;function a(p){try{return decodeURIComponent(p.replace(/\+/g," "))}catch(y){return null}}function f(p){try{return encodeURIComponent(p)}catch(y){return null}}S.stringify=function e(p,y){y=y||"";var C,R,T=[];for(R in"string"!=typeof y&&(y="?"),p)if(i.call(p,R)){if(!(C=p[R])&&(null==C||isNaN(C))&&(C=""),R=f(R),C=f(C),null===R||null===C)continue;T.push(R+"="+C)}return T.length?y+T.join("&"):""},S.parse=function c(p){for(var C,y=/([^=?#&]+)=?([^&]*)/g,T={};C=y.exec(p);){var R=a(C[1]),L=a(C[2]);null===R||null===L||R in T||(T[R]=L)}return T}},17346:(m,S,i)=>{const r=i(66952),a=i(32582),f=r.types;m.exports=class eb{constructor(e,p){if(this._setDefaults(e),e instanceof RegExp)this.ignoreCase=e.ignoreCase,this.multiline=e.multiline,e=e.source;else{if("string"!=typeof e)throw new Error("Expected a regexp or string");this.ignoreCase=p&&-1!==p.indexOf("i"),this.multiline=p&&-1!==p.indexOf("m")}this.tokens=r(e)}_setDefaults(e){this.max=null!=e.max?e.max:null!=eb.prototype.max?eb.prototype.max:100,this.defaultRange=e.defaultRange?e.defaultRange:this.defaultRange.clone(),e.randInt&&(this.randInt=e.randInt)}gen(){return this._gen(this.tokens,[])}_gen(e,p){var y,T,C,R,L;switch(e.type){case f.ROOT:case f.GROUP:if(e.followedBy||e.notFollowedBy)return"";for(e.remember&&void 0===e.groupNumber&&(e.groupNumber=p.push(null)-1),T="",R=0,L=(y=e.options?this._randSelect(e.options):e.stack).length;R<L;R++)T+=this._gen(y[R],p);return e.remember&&(p[e.groupNumber]=T),T;case f.POSITION:return"";case f.SET:var z=this._expand(e);return z.length?String.fromCharCode(this._randSelect(z)):"";case f.REPETITION:for(C=this.randInt(e.min,e.max===1/0?e.min+this.max:e.max),T="",R=0;R<C;R++)T+=this._gen(e.value,p);return T;case f.REFERENCE:return p[e.value-1]||"";case f.CHAR:var W=this.ignoreCase&&this._randBool()?this._toOtherCase(e.value):e.value;return String.fromCharCode(W)}}_toOtherCase(e){return e+(97<=e&&e<=122?-32:65<=e&&e<=90?32:0)}_randBool(){return!this.randInt(0,1)}_randSelect(e){return e instanceof a?e.index(this.randInt(0,e.length-1)):e[this.randInt(0,e.length-1)]}_expand(e){if(e.type===r.types.CHAR)return new a(e.value);if(e.type===r.types.RANGE)return new a(e.from,e.to);{let p=new a;for(let y=0;y<e.set.length;y++){let T=this._expand(e.set[y]);if(p.add(T),this.ignoreCase)for(let C=0;C<T.length;C++){let R=T.index(C),L=this._toOtherCase(R);R!==L&&p.add(L)}}return e.not?this.defaultRange.clone().subtract(p):this.defaultRange.clone().intersect(p)}}randInt(e,p){return e+Math.floor(Math.random()*(1+p-e))}get defaultRange(){return this._range=this._range||new a(32,126)}set defaultRange(e){this._range=e}static randexp(e,p){var y;return"string"==typeof e&&(e=new RegExp(e,p)),void 0===e._randexp?(y=new eb(e,p),e._randexp=y):(y=e._randexp)._setDefaults(e),y.gen()}static sugar(){RegExp.prototype.gen=function(){return eb.randexp(this)}}}},57021:(m,S,i)=>{"use strict";Object.defineProperty(S,"__esModule",{value:!0}),S.CopyToClipboard=void 0;var r=f(i(78139)),a=f(i(96967));function f(se){return se&&se.__esModule?se:{default:se}}function c(se){return(c="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(ae){return typeof ae}:function(ae){return ae&&"function"==typeof Symbol&&ae.constructor===Symbol&&ae!==Symbol.prototype?"symbol":typeof ae})(se)}function e(se,ge){var ae=Object.keys(se);if(Object.getOwnPropertySymbols){var he=Object.getOwnPropertySymbols(se);ge&&(he=he.filter(function(be){return Object.getOwnPropertyDescriptor(se,be).enumerable})),ae.push.apply(ae,he)}return ae}function C(se,ge){if(!(se instanceof ge))throw new TypeError("Cannot call a class as a function")}function R(se,ge){for(var ae=0;ae<ge.length;ae++){var he=ge[ae];he.enumerable=he.enumerable||!1,he.configurable=!0,"value"in he&&(he.writable=!0),Object.defineProperty(se,he.key,he)}}function z(se,ge){return!ge||"object"!==c(ge)&&"function"!=typeof ge?J(se):ge}function W(se){return(W=Object.setPrototypeOf?Object.getPrototypeOf:function(ae){return ae.__proto__||Object.getPrototypeOf(ae)})(se)}function J(se){if(void 0===se)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return se}function ce(se,ge){return(ce=Object.setPrototypeOf||function(he,be){return he.__proto__=be,he})(se,ge)}function ie(se,ge,ae){return ge in se?Object.defineProperty(se,ge,{value:ae,enumerable:!0,configurable:!0,writable:!0}):se[ge]=ae,se}var U=function(se){function ge(){var ae,he;C(this,ge);for(var be=arguments.length,we=new Array(be),ue=0;ue<be;ue++)we[ue]=arguments[ue];return ie(J(he=z(this,(ae=W(ge)).call.apply(ae,[this].concat(we)))),"onClick",function(st){var We=he.props,Ve=We.text,Be=We.onCopy,je=We.options,Ne=r.default.Children.only(We.children),Bt=(0,a.default)(Ve,je);Be&&Be(Ve,Bt),Ne&&Ne.props&&"function"==typeof Ne.props.onClick&&Ne.props.onClick(st)}),he}return function ee(se,ge){if("function"!=typeof ge&&null!==ge)throw new TypeError("Super expression must either be null or a function");se.prototype=Object.create(ge&&ge.prototype,{constructor:{value:se,writable:!0,configurable:!0}}),ge&&ce(se,ge)}(ge,se),function L(se,ge,ae){ge&&R(se.prototype,ge),ae&&R(se,ae)}(ge,[{key:"render",value:function(){var he=this.props,st=he.children,We=function y(se,ge){if(null==se)return{};var he,be,ae=function T(se,ge){if(null==se)return{};var be,we,ae={},he=Object.keys(se);for(we=0;we<he.length;we++)!(ge.indexOf(be=he[we])>=0)&&(ae[be]=se[be]);return ae}(se,ge);if(Object.getOwnPropertySymbols){var we=Object.getOwnPropertySymbols(se);for(be=0;be<we.length;be++)!(ge.indexOf(he=we[be])>=0)&&(!Object.prototype.propertyIsEnumerable.call(se,he)||(ae[he]=se[he]))}return ae}(he,["text","onCopy","options","children"]),Ve=r.default.Children.only(st);return r.default.cloneElement(Ve,function p(se){for(var ge=1;ge<arguments.length;ge++){var ae=null!=arguments[ge]?arguments[ge]:{};ge%2?e(ae,!0).forEach(function(he){ie(se,he,ae[he])}):Object.getOwnPropertyDescriptors?Object.defineProperties(se,Object.getOwnPropertyDescriptors(ae)):e(ae).forEach(function(he){Object.defineProperty(se,he,Object.getOwnPropertyDescriptor(ae,he))})}return se}({},We,{onClick:this.onClick}))}}]),ge}(r.default.PureComponent);S.CopyToClipboard=U,ie(U,"defaultProps",{onCopy:void 0,options:void 0})},43409:(m,S,i)=>{"use strict";var a=i(57021).CopyToClipboard;a.CopyToClipboard=a,m.exports=a},16709:(m,S,i)=>{"use strict";Object.defineProperty(S,"__esModule",{value:!0}),S.DebounceInput=void 0;var r=f(i(78139)),a=f(i(86906));function f(ae){return ae&&ae.__esModule?ae:{default:ae}}function c(ae){return(c="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(be){return typeof be}:function(be){return be&&"function"==typeof Symbol&&be.constructor===Symbol&&be!==Symbol.prototype?"symbol":typeof be})(ae)}function y(ae,he){var be=Object.keys(ae);if(Object.getOwnPropertySymbols){var we=Object.getOwnPropertySymbols(ae);he&&(we=we.filter(function(ue){return Object.getOwnPropertyDescriptor(ae,ue).enumerable})),be.push.apply(be,we)}return be}function T(ae){for(var he=1;he<arguments.length;he++){var be=null!=arguments[he]?arguments[he]:{};he%2?y(Object(be),!0).forEach(function(we){se(ae,we,be[we])}):Object.getOwnPropertyDescriptors?Object.defineProperties(ae,Object.getOwnPropertyDescriptors(be)):y(Object(be)).forEach(function(we){Object.defineProperty(ae,we,Object.getOwnPropertyDescriptor(be,we))})}return ae}function R(ae,he){for(var be=0;be<he.length;be++){var we=he[be];we.enumerable=we.enumerable||!1,we.configurable=!0,"value"in we&&(we.writable=!0),Object.defineProperty(ae,we.key,we)}}function W(ae,he){return(W=Object.setPrototypeOf||function(we,ue){return we.__proto__=ue,we})(ae,he)}function ee(ae,he){return!he||"object"!==c(he)&&"function"!=typeof he?ce(ae):he}function ce(ae){if(void 0===ae)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return ae}function U(ae){return(U=Object.setPrototypeOf?Object.getPrototypeOf:function(be){return be.__proto__||Object.getPrototypeOf(be)})(ae)}function se(ae,he,be){return he in ae?Object.defineProperty(ae,he,{value:be,enumerable:!0,configurable:!0,writable:!0}):ae[he]=be,ae}var ge=function(ae){!function z(ae,he){if("function"!=typeof he&&null!==he)throw new TypeError("Super expression must either be null or a function");ae.prototype=Object.create(he&&he.prototype,{constructor:{value:ae,writable:!0,configurable:!0}}),he&&W(ae,he)}(be,ae);var he=function J(ae){var he=function ie(){if("undefined"==typeof Reflect||!Reflect.construct||Reflect.construct.sham)return!1;if("function"==typeof Proxy)return!0;try{return Date.prototype.toString.call(Reflect.construct(Date,[],function(){})),!0}catch(ae){return!1}}();return function(){var ue,we=U(ae);if(he){var st=U(this).constructor;ue=Reflect.construct(we,arguments,st)}else ue=we.apply(this,arguments);return ee(this,ue)}}(be);function be(we){var ue;return function C(ae,he){if(!(ae instanceof he))throw new TypeError("Cannot call a class as a function")}(this,be),se(ce(ue=he.call(this,we)),"onChange",function(We){We.persist();var Ve=ue.state.value,Be=ue.props.minLength;ue.setState({value:We.target.value},function(){var xe=ue.state.value;xe.length>=Be?ue.notify(We):Ve.length>xe.length&&ue.notify(T(T({},We),{},{target:T(T({},We.target),{},{value:""})}))})}),se(ce(ue),"onKeyDown",function(We){"Enter"===We.key&&ue.forceNotify(We);var Ve=ue.props.onKeyDown;Ve&&(We.persist(),Ve(We))}),se(ce(ue),"onBlur",function(We){ue.forceNotify(We);var Ve=ue.props.onBlur;Ve&&(We.persist(),Ve(We))}),se(ce(ue),"createNotifier",function(We){if(We<0)ue.notify=function(){return null};else if(0===We)ue.notify=ue.doNotify;else{var Ve=(0,a.default)(function(Be){ue.isDebouncing=!1,ue.doNotify(Be)},We);ue.notify=function(Be){ue.isDebouncing=!0,Ve(Be)},ue.flush=function(){return Ve.flush()},ue.cancel=function(){ue.isDebouncing=!1,Ve.cancel()}}}),se(ce(ue),"doNotify",function(){var We=ue.props.onChange;We.apply(void 0,arguments)}),se(ce(ue),"forceNotify",function(We){if(ue.isDebouncing||!(ue.props.debounceTimeout>0)){ue.cancel&&ue.cancel();var Be=ue.state.value;ue.doNotify(Be.length>=ue.props.minLength?We:T(T({},We),{},{target:T(T({},We.target),{},{value:Be})}))}}),ue.isDebouncing=!1,ue.state={value:null==we.value?"":we.value},ue.createNotifier(ue.props.debounceTimeout),ue}return function L(ae,he,be){he&&R(ae.prototype,he),be&&R(ae,be)}(be,[{key:"componentDidUpdate",value:function(ue){if(!this.isDebouncing){var st=this.props,We=st.value,Ve=st.debounceTimeout,Be=ue.debounceTimeout;void 0!==We&&ue.value!==We&&this.state.value!==We&&this.setState({value:We}),Ve!==Be&&this.createNotifier(Ve)}}},{key:"componentWillUnmount",value:function(){this.flush&&this.flush()}},{key:"render",value:function(){var hn,vn,ue=this.props,st=ue.element,je=ue.forceNotifyByEnter,Ne=ue.forceNotifyOnBlur,Bt=ue.onKeyDown,rt=ue.onBlur,en=ue.inputRef,Pt=function e(ae,he){if(null==ae)return{};var we,ue,be=function p(ae,he){if(null==ae)return{};var ue,st,be={},we=Object.keys(ae);for(st=0;st<we.length;st++)!(he.indexOf(ue=we[st])>=0)&&(be[ue]=ae[ue]);return be}(ae,he);if(Object.getOwnPropertySymbols){var st=Object.getOwnPropertySymbols(ae);for(ue=0;ue<st.length;ue++)!(he.indexOf(we=st[ue])>=0)&&(!Object.prototype.propertyIsEnumerable.call(ae,we)||(be[we]=ae[we]))}return be}(ue,["element","onChange","value","minLength","debounceTimeout","forceNotifyByEnter","forceNotifyOnBlur","onKeyDown","onBlur","inputRef"]),Vt=this.state.value;hn=je?{onKeyDown:this.onKeyDown}:Bt?{onKeyDown:Bt}:{},vn=Ne?{onBlur:this.onBlur}:rt?{onBlur:rt}:{};var mt=en?{ref:en}:{};return r.default.createElement(st,T(T(T(T({},Pt),{},{onChange:this.onChange,value:Vt},hn),vn),mt))}}]),be}(r.default.PureComponent);S.DebounceInput=ge,se(ge,"defaultProps",{element:"input",type:"text",onKeyDown:void 0,onBlur:void 0,value:void 0,minLength:0,debounceTimeout:100,forceNotifyByEnter:!0,forceNotifyOnBlur:!0,inputRef:void 0})},41205:(m,S,i)=>{"use strict";var a=i(16709).DebounceInput;a.DebounceInput=a,m.exports=a},85503:(m,S,i)=>{"use strict";var r=i(78139),a=i(18228),f=i(88712);function c(v){for(var D="https://reactjs.org/docs/error-decoder.html?invariant="+v,B=1;B<arguments.length;B++)D+="&args[]="+encodeURIComponent(arguments[B]);return"Minified React error #"+v+"; visit "+D+" for the full message or use the non-minified dev environment for full errors and additional helpful warnings."}if(!r)throw Error(c(227));var e=new Set,p={};function y(v,D){T(v,D),T(v+"Capture",D)}function T(v,D){for(p[v]=D,v=0;v<D.length;v++)e.add(D[v])}var C=!("undefined"==typeof window||void 0===window.document||void 0===window.document.createElement),R=/^[:A-Z_a-z\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u02FF\u0370-\u037D\u037F-\u1FFF\u200C-\u200D\u2070-\u218F\u2C00-\u2FEF\u3001-\uD7FF\uF900-\uFDCF\uFDF0-\uFFFD][:A-Z_a-z\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u02FF\u0370-\u037D\u037F-\u1FFF\u200C-\u200D\u2070-\u218F\u2C00-\u2FEF\u3001-\uD7FF\uF900-\uFDCF\uFDF0-\uFFFD\-.0-9\u00B7\u0300-\u036F\u203F-\u2040]*$/,L=Object.prototype.hasOwnProperty,z={},W={};function ie(v,D,B,ye,He,yt,Wt){this.acceptsBooleans=2===D||3===D||4===D,this.attributeName=ye,this.attributeNamespace=He,this.mustUseProperty=B,this.propertyName=v,this.type=D,this.sanitizeURL=yt,this.removeEmptyString=Wt}var U={};"children dangerouslySetInnerHTML defaultValue defaultChecked innerHTML suppressContentEditableWarning suppressHydrationWarning style".split(" ").forEach(function(v){U[v]=new ie(v,0,!1,v,null,!1,!1)}),[["acceptCharset","accept-charset"],["className","class"],["htmlFor","for"],["httpEquiv","http-equiv"]].forEach(function(v){var D=v[0];U[D]=new ie(D,1,!1,v[1],null,!1,!1)}),["contentEditable","draggable","spellCheck","value"].forEach(function(v){U[v]=new ie(v,2,!1,v.toLowerCase(),null,!1,!1)}),["autoReverse","externalResourcesRequired","focusable","preserveAlpha"].forEach(function(v){U[v]=new ie(v,2,!1,v,null,!1,!1)}),"allowFullScreen async autoFocus autoPlay controls default defer disabled disablePictureInPicture disableRemotePlayback formNoValidate hidden loop noModule noValidate open playsInline readOnly required reversed scoped seamless itemScope".split(" ").forEach(function(v){U[v]=new ie(v,3,!1,v.toLowerCase(),null,!1,!1)}),["checked","multiple","muted","selected"].forEach(function(v){U[v]=new ie(v,3,!0,v,null,!1,!1)}),["capture","download"].forEach(function(v){U[v]=new ie(v,4,!1,v,null,!1,!1)}),["cols","rows","size","span"].forEach(function(v){U[v]=new ie(v,6,!1,v,null,!1,!1)}),["rowSpan","start"].forEach(function(v){U[v]=new ie(v,5,!1,v.toLowerCase(),null,!1,!1)});var se=/[\-:]([a-z])/g;function ge(v){return v[1].toUpperCase()}function ae(v,D,B,ye){var He=U.hasOwnProperty(D)?U[D]:null;(null!==He?0===He.type:!ye&&2<D.length&&("o"===D[0]||"O"===D[0])&&("n"===D[1]||"N"===D[1]))||(function ce(v,D,B,ye){if(null==D||function ee(v,D,B,ye){if(null!==B&&0===B.type)return!1;switch(typeof D){case"function":case"symbol":return!0;case"boolean":return!ye&&(null!==B?!B.acceptsBooleans:"data-"!==(v=v.toLowerCase().slice(0,5))&&"aria-"!==v);default:return!1}}(v,D,B,ye))return!0;if(ye)return!1;if(null!==B)switch(B.type){case 3:return!D;case 4:return!1===D;case 5:return isNaN(D);case 6:return isNaN(D)||1>D}return!1}(D,B,He,ye)&&(B=null),ye||null===He?function J(v){return!!L.call(W,v)||!L.call(z,v)&&(R.test(v)?W[v]=!0:(z[v]=!0,!1))}(D)&&(null===B?v.removeAttribute(D):v.setAttribute(D,""+B)):He.mustUseProperty?v[He.propertyName]=null===B?3!==He.type&&"":B:(D=He.attributeName,ye=He.attributeNamespace,null===B?v.removeAttribute(D):(B=3===(He=He.type)||4===He&&!0===B?"":""+B,ye?v.setAttributeNS(ye,D,B):v.setAttribute(D,B))))}"accent-height alignment-baseline arabic-form baseline-shift cap-height clip-path clip-rule color-interpolation color-interpolation-filters color-profile color-rendering dominant-baseline enable-background fill-opacity fill-rule flood-color flood-opacity font-family font-size font-size-adjust font-stretch font-style font-variant font-weight glyph-name glyph-orientation-horizontal glyph-orientation-vertical horiz-adv-x horiz-origin-x image-rendering letter-spacing lighting-color marker-end marker-mid marker-start overline-position overline-thickness paint-order panose-1 pointer-events rendering-intent shape-rendering stop-color stop-opacity strikethrough-position strikethrough-thickness stroke-dasharray stroke-dashoffset stroke-linecap stroke-linejoin stroke-miterlimit stroke-opacity stroke-width text-anchor text-decoration text-rendering underline-position underline-thickness unicode-bidi unicode-range units-per-em v-alphabetic v-hanging v-ideographic v-mathematical vector-effect vert-adv-y vert-origin-x vert-origin-y word-spacing writing-mode xmlns:xlink x-height".split(" ").forEach(function(v){var D=v.replace(se,ge);U[D]=new ie(D,1,!1,v,null,!1,!1)}),"xlink:actuate xlink:arcrole xlink:role xlink:show xlink:title xlink:type".split(" ").forEach(function(v){var D=v.replace(se,ge);U[D]=new ie(D,1,!1,v,"http://www.w3.org/1999/xlink",!1,!1)}),["xml:base","xml:lang","xml:space"].forEach(function(v){var D=v.replace(se,ge);U[D]=new ie(D,1,!1,v,"http://www.w3.org/XML/1998/namespace",!1,!1)}),["tabIndex","crossOrigin"].forEach(function(v){U[v]=new ie(v,1,!1,v.toLowerCase(),null,!1,!1)}),U.xlinkHref=new ie("xlinkHref",1,!1,"xlink:href","http://www.w3.org/1999/xlink",!0,!1),["src","href","action","formAction"].forEach(function(v){U[v]=new ie(v,1,!1,v.toLowerCase(),null,!0,!0)});var he=r.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED,be=60103,we=60106,ue=60107,st=60108,We=60114,Ve=60109,Be=60110,xe=60112,je=60113,Ne=60120,Bt=60115,rt=60116,en=60121,Pt=60128,Vt=60129,hn=60130,vn=60131;if("function"==typeof Symbol&&Symbol.for){var mt=Symbol.for;be=mt("react.element"),we=mt("react.portal"),ue=mt("react.fragment"),st=mt("react.strict_mode"),We=mt("react.profiler"),Ve=mt("react.provider"),Be=mt("react.context"),xe=mt("react.forward_ref"),je=mt("react.suspense"),Ne=mt("react.suspense_list"),Bt=mt("react.memo"),rt=mt("react.lazy"),en=mt("react.block"),mt("react.scope"),Pt=mt("react.opaque.id"),Vt=mt("react.debug_trace_mode"),hn=mt("react.offscreen"),vn=mt("react.legacy_hidden")}var Yt,Nt="function"==typeof Symbol&&Symbol.iterator;function St(v){return null===v||"object"!=typeof v?null:"function"==typeof(v=Nt&&v[Nt]||v["@@iterator"])?v:null}function Fn(v){if(void 0===Yt)try{throw Error()}catch(B){var D=B.stack.trim().match(/\n( *(at )?)/);Yt=D&&D[1]||""}return"\n"+Yt+v}var pr=!1;function Ei(v,D){if(!v||pr)return"";pr=!0;var B=Error.prepareStackTrace;Error.prepareStackTrace=void 0;try{if(D)if(D=function(){throw Error()},Object.defineProperty(D.prototype,"props",{set:function(){throw Error()}}),"object"==typeof Reflect&&Reflect.construct){try{Reflect.construct(D,[])}catch(nr){var ye=nr}Reflect.construct(v,[],D)}else{try{D.call()}catch(nr){ye=nr}v.call(D.prototype)}else{try{throw Error()}catch(nr){ye=nr}v()}}catch(nr){if(nr&&ye&&"string"==typeof nr.stack){for(var He=nr.stack.split("\n"),yt=ye.stack.split("\n"),Wt=He.length-1,gn=yt.length-1;1<=Wt&&0<=gn&&He[Wt]!==yt[gn];)gn--;for(;1<=Wt&&0<=gn;Wt--,gn--)if(He[Wt]!==yt[gn]){if(1!==Wt||1!==gn)do{if(Wt--,0>--gn||He[Wt]!==yt[gn])return"\n"+He[Wt].replace(" at new "," at ")}while(1<=Wt&&0<=gn);break}}}finally{pr=!1,Error.prepareStackTrace=B}return(v=v?v.displayName||v.name:"")?Fn(v):""}function mi(v){switch(v.tag){case 5:return Fn(v.type);case 16:return Fn("Lazy");case 13:return Fn("Suspense");case 19:return Fn("SuspenseList");case 0:case 2:case 15:return Ei(v.type,!1);case 11:return Ei(v.type.render,!1);case 22:return Ei(v.type._render,!1);case 1:return Ei(v.type,!0);default:return""}}function ur(v){if(null==v)return null;if("function"==typeof v)return v.displayName||v.name||null;if("string"==typeof v)return v;switch(v){case ue:return"Fragment";case we:return"Portal";case We:return"Profiler";case st:return"StrictMode";case je:return"Suspense";case Ne:return"SuspenseList"}if("object"==typeof v)switch(v.$$typeof){case Be:return(v.displayName||"Context")+".Consumer";case Ve:return(v._context.displayName||"Context")+".Provider";case xe:var D=v.render;return D=D.displayName||D.name||"",v.displayName||(""!==D?"ForwardRef("+D+")":"ForwardRef");case Bt:return ur(v.type);case en:return ur(v._render);case rt:D=v._payload,v=v._init;try{return ur(v(D))}catch(B){}}return null}function $r(v){switch(typeof v){case"boolean":case"number":case"object":case"string":case"undefined":return v;default:return""}}function Br(v){var D=v.type;return(v=v.nodeName)&&"input"===v.toLowerCase()&&("checkbox"===D||"radio"===D)}function Xn(v){v._valueTracker||(v._valueTracker=function Pn(v){var D=Br(v)?"checked":"value",B=Object.getOwnPropertyDescriptor(v.constructor.prototype,D),ye=""+v[D];if(!v.hasOwnProperty(D)&&void 0!==B&&"function"==typeof B.get&&"function"==typeof B.set){var He=B.get,yt=B.set;return Object.defineProperty(v,D,{configurable:!0,get:function(){return He.call(this)},set:function(Wt){ye=""+Wt,yt.call(this,Wt)}}),Object.defineProperty(v,D,{enumerable:B.enumerable}),{getValue:function(){return ye},setValue:function(Wt){ye=""+Wt},stopTracking:function(){v._valueTracker=null,delete v[D]}}}}(v))}function dr(v){if(!v)return!1;var D=v._valueTracker;if(!D)return!0;var B=D.getValue(),ye="";return v&&(ye=Br(v)?v.checked?"true":"false":v.value),(v=ye)!==B&&(D.setValue(v),!0)}function Qr(v){if(void 0===(v=v||("undefined"!=typeof document?document:void 0)))return null;try{return v.activeElement||v.body}catch(D){return v.body}}function Ci(v,D){var B=D.checked;return a({},D,{defaultChecked:void 0,defaultValue:void 0,value:void 0,checked:null!=B?B:v._wrapperState.initialChecked})}function _i(v,D){var B=null==D.defaultValue?"":D.defaultValue,ye=null!=D.checked?D.checked:D.defaultChecked;B=$r(null!=D.value?D.value:B),v._wrapperState={initialChecked:ye,initialValue:B,controlled:"checkbox"===D.type||"radio"===D.type?null!=D.checked:null!=D.value}}function so(v,D){null!=(D=D.checked)&&ae(v,"checked",D,!1)}function Ro(v,D){so(v,D);var B=$r(D.value),ye=D.type;if(null!=B)"number"===ye?(0===B&&""===v.value||v.value!=B)&&(v.value=""+B):v.value!==""+B&&(v.value=""+B);else if("submit"===ye||"reset"===ye)return void v.removeAttribute("value");D.hasOwnProperty("value")?Kt(v,D.type,B):D.hasOwnProperty("defaultValue")&&Kt(v,D.type,$r(D.defaultValue)),null==D.checked&&null!=D.defaultChecked&&(v.defaultChecked=!!D.defaultChecked)}function Sr(v,D,B){if(D.hasOwnProperty("value")||D.hasOwnProperty("defaultValue")){var ye=D.type;if(("submit"===ye||"reset"===ye)&&null==D.value)return;D=""+v._wrapperState.initialValue,B||D===v.value||(v.value=D),v.defaultValue=D}""!==(B=v.name)&&(v.name=""),v.defaultChecked=!!v._wrapperState.initialChecked,""!==B&&(v.name=B)}function Kt(v,D,B){("number"!==D||Qr(v.ownerDocument)!==v)&&(null==B?v.defaultValue=""+v._wrapperState.initialValue:v.defaultValue!==""+B&&(v.defaultValue=""+B))}function jn(v,D){return v=a({children:void 0},D),(D=function un(v){var D="";return r.Children.forEach(v,function(B){null!=B&&(D+=B)}),D}(D.children))&&(v.children=D),v}function Jn(v,D,B,ye){if(v=v.options,D){D={};for(var He=0;He<B.length;He++)D["$"+B[He]]=!0;for(B=0;B<v.length;B++)He=D.hasOwnProperty("$"+v[B].value),v[B].selected!==He&&(v[B].selected=He),He&&ye&&(v[B].defaultSelected=!0)}else{for(B=""+$r(B),D=null,He=0;He<v.length;He++){if(v[He].value===B)return v[He].selected=!0,void(ye&&(v[He].defaultSelected=!0));null!==D||v[He].disabled||(D=v[He])}null!==D&&(D.selected=!0)}}function Gn(v,D){if(null!=D.dangerouslySetInnerHTML)throw Error(c(91));return a({},D,{value:void 0,defaultValue:void 0,children:""+v._wrapperState.initialValue})}function Xr(v,D){var B=D.value;if(null==B){if(B=D.children,D=D.defaultValue,null!=B){if(null!=D)throw Error(c(92));if(Array.isArray(B)){if(!(1>=B.length))throw Error(c(93));B=B[0]}D=B}null==D&&(D=""),B=D}v._wrapperState={initialValue:$r(B)}}function Zi(v,D){var B=$r(D.value),ye=$r(D.defaultValue);null!=B&&((B=""+B)!==v.value&&(v.value=B),null==D.defaultValue&&v.defaultValue!==B&&(v.defaultValue=B)),null!=ye&&(v.defaultValue=""+ye)}function ii(v){var D=v.textContent;D===v._wrapperState.initialValue&&""!==D&&null!==D&&(v.value=D)}var hr_html="http://www.w3.org/1999/xhtml";function Ki(v){switch(v){case"svg":return"http://www.w3.org/2000/svg";case"math":return"http://www.w3.org/1998/Math/MathML";default:return"http://www.w3.org/1999/xhtml"}}function ln(v,D){return null==v||"http://www.w3.org/1999/xhtml"===v?Ki(D):"http://www.w3.org/2000/svg"===v&&"foreignObject"===D?"http://www.w3.org/1999/xhtml":v}var Mn,v,Zn=(v=function(v,D){if("http://www.w3.org/2000/svg"!==v.namespaceURI||"innerHTML"in v)v.innerHTML=D;else{for((Mn=Mn||document.createElement("div")).innerHTML="<svg>"+D.valueOf().toString()+"</svg>",D=Mn.firstChild;v.firstChild;)v.removeChild(v.firstChild);for(;D.firstChild;)v.appendChild(D.firstChild)}},"undefined"!=typeof MSApp&&MSApp.execUnsafeLocalFunction?function(D,B,ye,He){MSApp.execUnsafeLocalFunction(function(){return v(D,B)})}:v);function cn(v,D){if(D){var B=v.firstChild;if(B&&B===v.lastChild&&3===B.nodeType)return void(B.nodeValue=D)}v.textContent=D}var Sn={animationIterationCount:!0,borderImageOutset:!0,borderImageSlice:!0,borderImageWidth:!0,boxFlex:!0,boxFlexGroup:!0,boxOrdinalGroup:!0,columnCount:!0,columns:!0,flex:!0,flexGrow:!0,flexPositive:!0,flexShrink:!0,flexNegative:!0,flexOrder:!0,gridArea:!0,gridRow:!0,gridRowEnd:!0,gridRowSpan:!0,gridRowStart:!0,gridColumn:!0,gridColumnEnd:!0,gridColumnSpan:!0,gridColumnStart:!0,fontWeight:!0,lineClamp:!0,lineHeight:!0,opacity:!0,order:!0,orphans:!0,tabSize:!0,widows:!0,zIndex:!0,zoom:!0,fillOpacity:!0,floodOpacity:!0,stopOpacity:!0,strokeDasharray:!0,strokeDashoffset:!0,strokeMiterlimit:!0,strokeOpacity:!0,strokeWidth:!0},Or=["Webkit","ms","Moz","O"];function ri(v,D,B){return null==D||"boolean"==typeof D||""===D?"":B||"number"!=typeof D||0===D||Sn.hasOwnProperty(v)&&Sn[v]?(""+D).trim():D+"px"}function vi(v,D){for(var B in v=v.style,D)if(D.hasOwnProperty(B)){var ye=0===B.indexOf("--"),He=ri(B,D[B],ye);"float"===B&&(B="cssFloat"),ye?v.setProperty(B,He):v[B]=He}}Object.keys(Sn).forEach(function(v){Or.forEach(function(D){D=D+v.charAt(0).toUpperCase()+v.substring(1),Sn[D]=Sn[v]})});var Ui=a({menuitem:!0},{area:!0,base:!0,br:!0,col:!0,embed:!0,hr:!0,img:!0,input:!0,keygen:!0,link:!0,meta:!0,param:!0,source:!0,track:!0,wbr:!0});function ao(v,D){if(D){if(Ui[v]&&(null!=D.children||null!=D.dangerouslySetInnerHTML))throw Error(c(137,v));if(null!=D.dangerouslySetInnerHTML){if(null!=D.children)throw Error(c(60));if("object"!=typeof D.dangerouslySetInnerHTML||!("__html"in D.dangerouslySetInnerHTML))throw Error(c(61))}if(null!=D.style&&"object"!=typeof D.style)throw Error(c(62))}}function dt(v,D){if(-1===v.indexOf("-"))return"string"==typeof D.is;switch(v){case"annotation-xml":case"color-profile":case"font-face":case"font-face-src":case"font-face-uri":case"font-face-format":case"font-face-name":case"missing-glyph":return!1;default:return!0}}function Bi(v){return(v=v.target||v.srcElement||window).correspondingUseElement&&(v=v.correspondingUseElement),3===v.nodeType?v.parentNode:v}var to=null,Gt=null,Rn=null;function _t(v){if(v=Ma(v)){if("function"!=typeof to)throw Error(c(280));var D=v.stateNode;D&&(D=Il(D),to(v.stateNode,v.type,D))}}function Rt(v){Gt?Rn?Rn.push(v):Rn=[v]:Gt=v}function ct(){if(Gt){var v=Gt,D=Rn;if(Rn=Gt=null,_t(v),D)for(v=0;v<D.length;v++)_t(D[v])}}function pt(v,D){return v(D)}function kt(v,D,B,ye,He){return v(D,B,ye,He)}function dn(){}var mr=pt,Oi=!1,di=!1;function Uo(){(null!==Gt||null!==Rn)&&(dn(),ct())}function lo(v,D){var B=v.stateNode;if(null===B)return null;var ye=Il(B);if(null===ye)return null;B=ye[D];e:switch(D){case"onClick":case"onClickCapture":case"onDoubleClick":case"onDoubleClickCapture":case"onMouseDown":case"onMouseDownCapture":case"onMouseMove":case"onMouseMoveCapture":case"onMouseUp":case"onMouseUpCapture":case"onMouseEnter":(ye=!ye.disabled)||(ye=!("button"===(v=v.type)||"input"===v||"select"===v||"textarea"===v)),v=!ye;break e;default:v=!1}if(v)return null;if(B&&"function"!=typeof B)throw Error(c(231,D,typeof B));return B}var Ai=!1;if(C)try{var Fo={};Object.defineProperty(Fo,"passive",{get:function(){Ai=!0}}),window.addEventListener("test",Fo,Fo),window.removeEventListener("test",Fo,Fo)}catch(v){Ai=!1}function Ko(v,D,B,ye,He,yt,Wt,gn,nr){var ti=Array.prototype.slice.call(arguments,3);try{D.apply(B,ti)}catch($o){this.onError($o)}}var qn=!1,ei=null,wn=!1,Qn=null,Fr={onError:function(v){qn=!0,ei=v}};function oo(v,D,B,ye,He,yt,Wt,gn,nr){qn=!1,ei=null,Ko.apply(Fr,arguments)}function yo(v){var D=v,B=v;if(v.alternate)for(;D.return;)D=D.return;else{v=D;do{0!=(1026&(D=v).flags)&&(B=D.return),v=D.return}while(v)}return 3===D.tag?B:null}function go(v){if(13===v.tag){var D=v.memoizedState;if(null===D&&null!==(v=v.alternate)&&(D=v.memoizedState),null!==D)return D.dehydrated}return null}function Go(v){if(yo(v)!==v)throw Error(c(188))}function er(v){if(v=function ua(v){var D=v.alternate;if(!D){if(null===(D=yo(v)))throw Error(c(188));return D!==v?null:v}for(var B=v,ye=D;;){var He=B.return;if(null===He)break;var yt=He.alternate;if(null===yt){if(null!==(ye=He.return)){B=ye;continue}break}if(He.child===yt.child){for(yt=He.child;yt;){if(yt===B)return Go(He),v;if(yt===ye)return Go(He),D;yt=yt.sibling}throw Error(c(188))}if(B.return!==ye.return)B=He,ye=yt;else{for(var Wt=!1,gn=He.child;gn;){if(gn===B){Wt=!0,B=He,ye=yt;break}if(gn===ye){Wt=!0,ye=He,B=yt;break}gn=gn.sibling}if(!Wt){for(gn=yt.child;gn;){if(gn===B){Wt=!0,B=yt,ye=He;break}if(gn===ye){Wt=!0,ye=yt,B=He;break}gn=gn.sibling}if(!Wt)throw Error(c(189))}}if(B.alternate!==ye)throw Error(c(190))}if(3!==B.tag)throw Error(c(188));return B.stateNode.current===B?v:D}(v),!v)return null;for(var D=v;;){if(5===D.tag||6===D.tag)return D;if(D.child)D.child.return=D,D=D.child;else{if(D===v)break;for(;!D.sibling;){if(!D.return||D.return===v)return null;D=D.return}D.sibling.return=D.return,D=D.sibling}}return null}function vr(v,D){for(var B=v.alternate;null!==D;){if(D===v||D===B)return!0;D=D.return}return!1}var yr,or,si,pn,xn=!1,Gr=[],no=null,mo=null,wo=null,Us=new Map,cs=new Map,es=[],ga="mousedown mouseup touchcancel touchend touchstart auxclick dblclick pointercancel pointerdown pointerup dragend dragstart drop compositionend compositionstart keydown keypress keyup input textInput copy cut paste click change contextmenu reset submit".split(" ");function ya(v,D,B,ye,He){return{blockedOn:v,domEventName:D,eventSystemFlags:16|B,nativeEvent:He,targetContainers:[ye]}}function fa(v,D){switch(v){case"focusin":case"focusout":no=null;break;case"dragenter":case"dragleave":mo=null;break;case"mouseover":case"mouseout":wo=null;break;case"pointerover":case"pointerout":Us.delete(D.pointerId);break;case"gotpointercapture":case"lostpointercapture":cs.delete(D.pointerId)}}function la(v,D,B,ye,He,yt){return null===v||v.nativeEvent!==yt?(v=ya(D,B,ye,He,yt),null!==D&&null!==(D=Ma(D))&&or(D),v):(v.eventSystemFlags|=ye,D=v.targetContainers,null!==He&&-1===D.indexOf(He)&&D.push(He),v)}function fl(v){var D=lu(v.target);if(null!==D){var B=yo(D);if(null!==B)if(13===(D=B.tag)){if(null!==(D=go(B)))return v.blockedOn=D,void pn(v.lanePriority,function(){f.unstable_runWithPriority(v.priority,function(){si(B)})})}else if(3===D&&B.stateNode.hydrate)return void(v.blockedOn=3===B.tag?B.stateNode.containerInfo:null)}v.blockedOn=null}function To(v){if(null!==v.blockedOn)return!1;for(var D=v.targetContainers;0<D.length;){var B=tu(v.domEventName,v.eventSystemFlags,D[0],v.nativeEvent);if(null!==B)return null!==(D=Ma(B))&&or(D),v.blockedOn=B,!1;D.shift()}return!0}function ml(v,D,B){To(v)&&B.delete(D)}function Zo(){for(xn=!1;0<Gr.length;){var v=Gr[0];if(null!==v.blockedOn){null!==(v=Ma(v.blockedOn))&&yr(v);break}for(var D=v.targetContainers;0<D.length;){var B=tu(v.domEventName,v.eventSystemFlags,D[0],v.nativeEvent);if(null!==B){v.blockedOn=B;break}D.shift()}null===v.blockedOn&&Gr.shift()}null!==no&&To(no)&&(no=null),null!==mo&&To(mo)&&(mo=null),null!==wo&&To(wo)&&(wo=null),Us.forEach(ml),cs.forEach(ml)}function vs(v,D){v.blockedOn===D&&(v.blockedOn=null,xn||(xn=!0,f.unstable_scheduleCallback(f.unstable_NormalPriority,Zo)))}function Za(v){function D(He){return vs(He,v)}if(0<Gr.length){vs(Gr[0],v);for(var B=1;B<Gr.length;B++){var ye=Gr[B];ye.blockedOn===v&&(ye.blockedOn=null)}}for(null!==no&&vs(no,v),null!==mo&&vs(mo,v),null!==wo&&vs(wo,v),Us.forEach(D),cs.forEach(D),B=0;B<es.length;B++)(ye=es[B]).blockedOn===v&&(ye.blockedOn=null);for(;0<es.length&&null===(B=es[0]).blockedOn;)fl(B),null===B.blockedOn&&es.shift()}function Is(v,D){var B={};return B[v.toLowerCase()]=D.toLowerCase(),B["Webkit"+v]="webkit"+D,B["Moz"+v]="moz"+D,B}var tl={animationend:Is("Animation","AnimationEnd"),animationiteration:Is("Animation","AnimationIteration"),animationstart:Is("Animation","AnimationStart"),transitionend:Is("Transition","TransitionEnd")},Ys={},ko={};function Co(v){if(Ys[v])return Ys[v];if(!tl[v])return v;var B,D=tl[v];for(B in D)if(D.hasOwnProperty(B)&&B in ko)return Ys[v]=D[B];return v}C&&(ko=document.createElement("div").style,"AnimationEvent"in window||(delete tl.animationend.animation,delete tl.animationiteration.animation,delete tl.animationstart.animation),"TransitionEvent"in window||delete tl.transitionend.transition);var Ps=Co("animationend"),ps=Co("animationiteration"),Oo=Co("animationstart"),Nr=Co("transitionend"),Qi=new Map,tt=new Map,rn=["abort","abort",Ps,"animationEnd",ps,"animationIteration",Oo,"animationStart","canplay","canPlay","canplaythrough","canPlayThrough","durationchange","durationChange","emptied","emptied","encrypted","encrypted","ended","ended","error","error","gotpointercapture","gotPointerCapture","load","load","loadeddata","loadedData","loadedmetadata","loadedMetadata","loadstart","loadStart","lostpointercapture","lostPointerCapture","playing","playing","progress","progress","seeking","seeking","stalled","stalled","suspend","suspend","timeupdate","timeUpdate",Nr,"transitionEnd","waiting","waiting"];function ne(v,D){for(var B=0;B<v.length;B+=2){var ye=v[B],He=v[B+1];He="on"+(He[0].toUpperCase()+He.slice(1)),tt.set(ye,D),Qi.set(ye,He),y(He,[ye])}}(0,f.unstable_now)();var Lt=8;function on(v){if(0!=(1&v))return Lt=15,1;if(0!=(2&v))return Lt=14,2;if(0!=(4&v))return Lt=13,4;var D=24&v;return 0!==D?(Lt=12,D):0!=(32&v)?(Lt=11,32):0!=(D=192&v)?(Lt=10,D):0!=(256&v)?(Lt=9,256):0!=(D=3584&v)?(Lt=8,D):0!=(4096&v)?(Lt=7,4096):0!=(D=4186112&v)?(Lt=6,D):0!=(D=62914560&v)?(Lt=5,D):67108864&v?(Lt=4,67108864):0!=(134217728&v)?(Lt=3,134217728):0!=(D=805306368&v)?(Lt=2,D):0!=(1073741824&v)?(Lt=1,1073741824):(Lt=8,v)}function Ii(v,D){var B=v.pendingLanes;if(0===B)return Lt=0;var ye=0,He=0,yt=v.expiredLanes,Wt=v.suspendedLanes,gn=v.pingedLanes;if(0!==yt)ye=yt,He=Lt=15;else if(0!=(yt=134217727&B)){var nr=yt&~Wt;0!==nr?(ye=on(nr),He=Lt):0!=(gn&=yt)&&(ye=on(gn),He=Lt)}else 0!=(yt=B&~Wt)?(ye=on(yt),He=Lt):0!==gn&&(ye=on(gn),He=Lt);if(0===ye)return 0;if(ye=B&((0>(ye=31-ol(ye))?0:1<<ye)<<1)-1,0!==D&&D!==ye&&0==(D&Wt)){if(on(D),He<=Lt)return D;Lt=He}if(0!==(D=v.entangledLanes))for(v=v.entanglements,D&=ye;0<D;)ye|=v[B=31-ol(D)],D&=~(He=1<<B);return ye}function hs(v){return 0!=(v=-1073741825&v.pendingLanes)?v:1073741824&v?1073741824:0}function zo(v,D){switch(v){case 15:return 1;case 14:return 2;case 12:return 0===(v=Ls(24&~D))?zo(10,D):v;case 10:return 0===(v=Ls(192&~D))?zo(8,D):v;case 8:return 0===(v=Ls(3584&~D))&&0===(v=Ls(4186112&~D))&&(v=512),v;case 2:return 0===(D=Ls(805306368&~D))&&(D=268435456),D}throw Error(c(358,v))}function Ls(v){return v&-v}function Xs(v){for(var D=[],B=0;31>B;B++)D.push(v);return D}function vl(v,D,B){v.pendingLanes|=D;var ye=D-1;v.suspendedLanes&=ye,v.pingedLanes&=ye,(v=v.eventTimes)[D=31-ol(D)]=B}var ol=Math.clz32?Math.clz32:function hc(v){return 0===v?32:31-(Wl(v)/Qu|0)|0},Wl=Math.log,Qu=Math.LN2,Tl=f.unstable_UserBlockingPriority,_c=f.unstable_runWithPriority,Pl=!0;function Ku(v,D,B,ye){Oi||dn();var He=Mc,yt=Oi;Oi=!0;try{kt(He,v,D,B,ye)}finally{(Oi=yt)||Uo()}}function Qa(v,D,B,ye){_c(Tl,Mc.bind(null,v,D,B,ye))}function Mc(v,D,B,ye){var He;if(Pl)if((He=0==(4&D))&&0<Gr.length&&-1<ga.indexOf(v))v=ya(null,v,D,B,ye),Gr.push(v);else{var yt=tu(v,D,B,ye);if(null===yt)He&&fa(v,ye);else{if(He){if(-1<ga.indexOf(v))return v=ya(yt,v,D,B,ye),void Gr.push(v);if(function Pa(v,D,B,ye,He){switch(D){case"focusin":return no=la(no,v,D,B,ye,He),!0;case"dragenter":return mo=la(mo,v,D,B,ye,He),!0;case"mouseover":return wo=la(wo,v,D,B,ye,He),!0;case"pointerover":var yt=He.pointerId;return Us.set(yt,la(Us.get(yt)||null,v,D,B,ye,He)),!0;case"gotpointercapture":return cs.set(yt=He.pointerId,la(cs.get(yt)||null,v,D,B,ye,He)),!0}return!1}(yt,v,D,B,ye))return;fa(v,ye)}at(v,D,ye,null,B)}}}function tu(v,D,B,ye){var He=Bi(ye);if(null!==(He=lu(He))){var yt=yo(He);if(null===yt)He=null;else{var Wt=yt.tag;if(13===Wt){if(null!==(He=go(yt)))return He;He=null}else if(3===Wt){if(yt.stateNode.hydrate)return 3===yt.tag?yt.stateNode.containerInfo:null;He=null}else yt!==He&&(He=null)}}return at(v,D,ye,He,B),null}var Wa=null,Ml=null,Hl=null;function Ua(){if(Hl)return Hl;var v,ye,D=Ml,B=D.length,He="value"in Wa?Wa.value:Wa.textContent,yt=He.length;for(v=0;v<B&&D[v]===He[v];v++);var Wt=B-v;for(ye=1;ye<=Wt&&D[B-ye]===He[yt-ye];ye++);return Hl=He.slice(v,1<ye?1-ye:void 0)}function Qe(v){var D=v.keyCode;return"charCode"in v?0===(v=v.charCode)&&13===D&&(v=13):v=D,10===v&&(v=13),32<=v||13===v?v:0}function zt(){return!0}function ot(){return!1}function jt(v){function D(B,ye,He,yt,Wt){for(var gn in this._reactName=B,this._targetInst=He,this.type=ye,this.nativeEvent=yt,this.target=Wt,this.currentTarget=null,v)v.hasOwnProperty(gn)&&(this[gn]=(B=v[gn])?B(yt):yt[gn]);return this.isDefaultPrevented=(null!=yt.defaultPrevented?yt.defaultPrevented:!1===yt.returnValue)?zt:ot,this.isPropagationStopped=ot,this}return a(D.prototype,{preventDefault:function(){this.defaultPrevented=!0;var B=this.nativeEvent;B&&(B.preventDefault?B.preventDefault():"unknown"!=typeof B.returnValue&&(B.returnValue=!1),this.isDefaultPrevented=zt)},stopPropagation:function(){var B=this.nativeEvent;B&&(B.stopPropagation?B.stopPropagation():"unknown"!=typeof B.cancelBubble&&(B.cancelBubble=!0),this.isPropagationStopped=zt)},persist:function(){},isPersistent:zt}),D}var js,As,Ns,zn={eventPhase:0,bubbles:0,cancelable:0,timeStamp:function(v){return v.timeStamp||Date.now()},defaultPrevented:0,isTrusted:0},qr=jt(zn),Di=a({},zn,{view:0,detail:0}),as=jt(Di),Io=a({},Di,{screenX:0,screenY:0,clientX:0,clientY:0,pageX:0,pageY:0,ctrlKey:0,shiftKey:0,altKey:0,metaKey:0,getModifierState:oa,button:0,buttons:0,relatedTarget:function(v){return void 0===v.relatedTarget?v.fromElement===v.srcElement?v.toElement:v.fromElement:v.relatedTarget},movementX:function(v){return"movementX"in v?v.movementX:(v!==Ns&&(Ns&&"mousemove"===v.type?(js=v.screenX-Ns.screenX,As=v.screenY-Ns.screenY):As=js=0,Ns=v),js)},movementY:function(v){return"movementY"in v?v.movementY:As}}),Ka=jt(Io),Bs=jt(a({},Io,{dataTransfer:0})),Xe=jt(a({},Di,{relatedTarget:0})),Ut=jt(a({},zn,{animationName:0,elapsedTime:0,pseudoElement:0})),pi=a({},zn,{clipboardData:function(v){return"clipboardData"in v?v.clipboardData:window.clipboardData}}),Wo=jt(pi),yl=jt(a({},zn,{data:0})),Xu={Esc:"Escape",Spacebar:" ",Left:"ArrowLeft",Up:"ArrowUp",Right:"ArrowRight",Down:"ArrowDown",Del:"Delete",Win:"OS",Menu:"ContextMenu",Apps:"ContextMenu",Scroll:"ScrollLock",MozPrintableKey:"Unidentified"},Lc={8:"Backspace",9:"Tab",12:"Clear",13:"Enter",16:"Shift",17:"Control",18:"Alt",19:"Pause",20:"CapsLock",27:"Escape",32:" ",33:"PageUp",34:"PageDown",35:"End",36:"Home",37:"ArrowLeft",38:"ArrowUp",39:"ArrowRight",40:"ArrowDown",45:"Insert",46:"Delete",112:"F1",113:"F2",114:"F3",115:"F4",116:"F5",117:"F6",118:"F7",119:"F8",120:"F9",121:"F10",122:"F11",123:"F12",144:"NumLock",145:"ScrollLock",224:"Meta"},vd={Alt:"altKey",Control:"ctrlKey",Meta:"metaKey",Shift:"shiftKey"};function Hi(v){var D=this.nativeEvent;return D.getModifierState?D.getModifierState(v):!!(v=vd[v])&&!!D[v]}function oa(){return Hi}var Ia=a({},Di,{key:function(v){if(v.key){var D=Xu[v.key]||v.key;if("Unidentified"!==D)return D}return"keypress"===v.type?13===(v=Qe(v))?"Enter":String.fromCharCode(v):"keydown"===v.type||"keyup"===v.type?Lc[v.keyCode]||"Unidentified":""},code:0,location:0,ctrlKey:0,shiftKey:0,altKey:0,metaKey:0,repeat:0,locale:0,getModifierState:oa,charCode:function(v){return"keypress"===v.type?Qe(v):0},keyCode:function(v){return"keydown"===v.type||"keyup"===v.type?v.keyCode:0},which:function(v){return"keypress"===v.type?Qe(v):"keydown"===v.type||"keyup"===v.type?v.keyCode:0}}),ys=jt(Ia),bl=jt(a({},Io,{pointerId:0,width:0,height:0,pressure:0,tangentialPressure:0,tiltX:0,tiltY:0,twist:0,pointerType:0,isPrimary:0})),vu=jt(a({},Di,{touches:0,targetTouches:0,changedTouches:0,altKey:0,metaKey:0,ctrlKey:0,shiftKey:0,getModifierState:oa})),ra=jt(a({},zn,{propertyName:0,elapsedTime:0,pseudoElement:0})),yu=a({},Io,{deltaX:function(v){return"deltaX"in v?v.deltaX:"wheelDeltaX"in v?-v.wheelDeltaX:0},deltaY:function(v){return"deltaY"in v?v.deltaY:"wheelDeltaY"in v?-v.wheelDeltaY:"wheelDelta"in v?-v.wheelDelta:0},deltaZ:0,deltaMode:0}),rd=jt(yu),ec=[9,13,27,32],au=C&&"CompositionEvent"in window,uu=null;C&&"documentMode"in document&&(uu=document.documentMode);var id=C&&"TextEvent"in window&&!uu,$u=C&&(!au||uu&&8<uu&&11>=uu),Hu=String.fromCharCode(32),wu=!1;function Fd(v,D){switch(v){case"keyup":return-1!==ec.indexOf(D.keyCode);case"keydown":return 229!==D.keyCode;case"keypress":case"mousedown":case"focusout":return!0;default:return!1}}function Bo(v){return"object"==typeof(v=v.detail)&&"data"in v?v.data:null}var cu=!1,Ce={color:!0,date:!0,datetime:!0,"datetime-local":!0,email:!0,month:!0,number:!0,password:!0,range:!0,search:!0,tel:!0,text:!0,time:!0,url:!0,week:!0};function nt(v){var D=v&&v.nodeName&&v.nodeName.toLowerCase();return"input"===D?!!Ce[v.type]:"textarea"===D}function Mt(v,D,B,ye){Rt(ye),0<(D=Qt(D,"onChange")).length&&(B=new qr("onChange","change",null,B,ye),v.push({event:B,listeners:D}))}var wt=null,sn=null;function Cn(v){_n(v,0)}function _r(v){if(dr(al(v)))return v}function ni(v,D){if("change"===v)return D}var fi=!1;if(C){var gi;if(C){var zi="oninput"in document;if(!zi){var Dr=document.createElement("div");Dr.setAttribute("oninput","return;"),zi="function"==typeof Dr.oninput}gi=zi}else gi=!1;fi=gi&&(!document.documentMode||9<document.documentMode)}function kn(){wt&&(wt.detachEvent("onpropertychange",Ar),sn=wt=null)}function Ar(v){if("value"===v.propertyName&&_r(sn)){var D=[];if(Mt(D,sn,v,Bi(v)),v=Cn,Oi)v(D);else{Oi=!0;try{pt(v,D)}finally{Oi=!1,Uo()}}}}function gr(v,D,B){"focusin"===v?(kn(),sn=B,(wt=D).attachEvent("onpropertychange",Ar)):"focusout"===v&&kn()}function fo(v){if("selectionchange"===v||"keyup"===v||"keydown"===v)return _r(sn)}function $s(v,D){if("click"===v)return _r(D)}function Es(v,D){if("input"===v||"change"===v)return _r(D)}var Ks="function"==typeof Object.is?Object.is:function pl(v,D){return v===D&&(0!==v||1/v==1/D)||v!=v&&D!=D},Wc=Object.prototype.hasOwnProperty;function Fc(v,D){if(Ks(v,D))return!0;if("object"!=typeof v||null===v||"object"!=typeof D||null===D)return!1;var B=Object.keys(v),ye=Object.keys(D);if(B.length!==ye.length)return!1;for(ye=0;ye<B.length;ye++)if(!Wc.call(D,B[ye])||!Ks(v[B[ye]],D[B[ye]]))return!1;return!0}function xu(v){for(;v&&v.firstChild;)v=v.firstChild;return v}function Eu(v,D){var ye,B=xu(v);for(v=0;B;){if(3===B.nodeType){if(ye=v+B.textContent.length,v<=D&&ye>=D)return{node:B,offset:D-v};v=ye}e:{for(;B;){if(B.nextSibling){B=B.nextSibling;break e}B=B.parentNode}B=void 0}B=xu(B)}}function Gd(v,D){return!(!v||!D)&&(v===D||(!v||3!==v.nodeType)&&(D&&3===D.nodeType?Gd(v,D.parentNode):"contains"in v?v.contains(D):!!v.compareDocumentPosition&&!!(16&v.compareDocumentPosition(D))))}function yd(){for(var v=window,D=Qr();D instanceof v.HTMLIFrameElement;){try{var B="string"==typeof D.contentWindow.location.href}catch(ye){B=!1}if(!B)break;D=Qr((v=D.contentWindow).document)}return D}function Ed(v){var D=v&&v.nodeName&&v.nodeName.toLowerCase();return D&&("input"===D&&("text"===v.type||"search"===v.type||"tel"===v.type||"url"===v.type||"password"===v.type)||"textarea"===D||"true"===v.contentEditable)}var Uc=C&&"documentMode"in document&&11>=document.documentMode,La=null,kd=null,Oc=null,Mo=!1;function No(v,D,B){var ye=B.window===B?B.document:9===B.nodeType?B:B.ownerDocument;Mo||null==La||La!==Qr(ye)||(ye="selectionStart"in(ye=La)&&Ed(ye)?{start:ye.selectionStart,end:ye.selectionEnd}:{anchorNode:(ye=(ye.ownerDocument&&ye.ownerDocument.defaultView||window).getSelection()).anchorNode,anchorOffset:ye.anchorOffset,focusNode:ye.focusNode,focusOffset:ye.focusOffset},Oc&&Fc(Oc,ye)||(Oc=ye,0<(ye=Qt(kd,"onSelect")).length&&(D=new qr("onSelect","select",null,D,B),v.push({event:D,listeners:ye}),D.target=La)))}ne("cancel cancel click click close close contextmenu contextMenu copy copy cut cut auxclick auxClick dblclick doubleClick dragend dragEnd dragstart dragStart drop drop focusin focus focusout blur input input invalid invalid keydown keyDown keypress keyPress keyup keyUp mousedown mouseDown mouseup mouseUp paste paste pause pause play play pointercancel pointerCancel pointerdown pointerDown pointerup pointerUp ratechange rateChange reset reset seeked seeked submit submit touchcancel touchCancel touchend touchEnd touchstart touchStart volumechange volumeChange".split(" "),0),ne("drag drag dragenter dragEnter dragexit dragExit dragleave dragLeave dragover dragOver mousemove mouseMove mouseout mouseOut mouseover mouseOver pointermove pointerMove pointerout pointerOut pointerover pointerOver scroll scroll toggle toggle touchmove touchMove wheel wheel".split(" "),1),ne(rn,2);for(var Sa="change selectionchange textInput compositionstart compositionend compositionupdate".split(" "),Sl=0;Sl<Sa.length;Sl++)tt.set(Sa[Sl],0);T("onMouseEnter",["mouseout","mouseover"]),T("onMouseLeave",["mouseout","mouseover"]),T("onPointerEnter",["pointerout","pointerover"]),T("onPointerLeave",["pointerout","pointerover"]),y("onChange","change click focusin focusout input keydown keyup selectionchange".split(" ")),y("onSelect","focusout contextmenu dragend focusin keydown keyup mousedown mouseup selectionchange".split(" ")),y("onBeforeInput",["compositionend","keypress","textInput","paste"]),y("onCompositionEnd","compositionend focusout keydown keypress keyup mousedown".split(" ")),y("onCompositionStart","compositionstart focusout keydown keypress keyup mousedown".split(" ")),y("onCompositionUpdate","compositionupdate focusout keydown keypress keyup mousedown".split(" "));var ru="abort canplay canplaythrough durationchange emptied encrypted ended error loadeddata loadedmetadata loadstart pause play playing progress ratechange seeked seeking stalled suspend timeupdate volumechange waiting".split(" "),bu=new Set("cancel close invalid load scroll toggle".split(" ").concat(ru));function gc(v,D,B){var ye=v.type||"unknown-event";v.currentTarget=B,function Li(v,D,B,ye,He,yt,Wt,gn,nr){if(oo.apply(this,arguments),qn){if(!qn)throw Error(c(198));var ti=ei;qn=!1,ei=null,wn||(wn=!0,Qn=ti)}}(ye,D,void 0,v),v.currentTarget=null}function _n(v,D){D=0!=(4&D);for(var B=0;B<v.length;B++){var ye=v[B],He=ye.event;ye=ye.listeners;e:{var yt=void 0;if(D)for(var Wt=ye.length-1;0<=Wt;Wt--){var gn=ye[Wt],nr=gn.instance,ti=gn.currentTarget;if(gn=gn.listener,nr!==yt&&He.isPropagationStopped())break e;gc(He,gn,ti),yt=nr}else for(Wt=0;Wt<ye.length;Wt++){if(nr=(gn=ye[Wt]).instance,ti=gn.currentTarget,gn=gn.listener,nr!==yt&&He.isPropagationStopped())break e;gc(He,gn,ti),yt=nr}}}if(wn)throw v=Qn,wn=!1,Qn=null,v}function pa(v,D){var B=Cl(D),ye=v+"__bubble";B.has(ye)||(_e(D,v,2,!1),B.add(ye))}var od="_reactListening"+Math.random().toString(36).slice(2);function $e(v){v[od]||(v[od]=!0,e.forEach(function(D){bu.has(D)||Me(D,!1,v,null),Me(D,!0,v,null)}))}function Me(v,D,B,ye){var He=4<arguments.length&&void 0!==arguments[4]?arguments[4]:0,yt=B;if("selectionchange"===v&&9!==B.nodeType&&(yt=B.ownerDocument),null!==ye&&!D&&bu.has(v)){if("scroll"!==v)return;He|=2,yt=ye}var Wt=Cl(yt),gn=v+"__"+(D?"capture":"bubble");Wt.has(gn)||(D&&(He|=4),_e(yt,v,He,D),Wt.add(gn))}function _e(v,D,B,ye){var He=tt.get(D);switch(void 0===He?2:He){case 0:He=Ku;break;case 1:He=Qa;break;default:He=Mc}B=He.bind(null,D,B,v),He=void 0,!Ai||"touchstart"!==D&&"touchmove"!==D&&"wheel"!==D||(He=!0),v.addEventListener(D,B,ye?void 0===He||{capture:!0,passive:He}:void 0!==He&&{passive:He})}function at(v,D,B,ye,He){var yt=ye;if(0==(1&D)&&0==(2&D)&&null!==ye)e:for(;;){if(null===ye)return;var Wt=ye.tag;if(3===Wt||4===Wt){var gn=ye.stateNode.containerInfo;if(gn===He||8===gn.nodeType&&gn.parentNode===He)break;if(4===Wt)for(Wt=ye.return;null!==Wt;){var nr=Wt.tag;if((3===nr||4===nr)&&((nr=Wt.stateNode.containerInfo)===He||8===nr.nodeType&&nr.parentNode===He))return;Wt=Wt.return}for(;null!==gn;){if(null===(Wt=lu(gn)))return;if(5===(nr=Wt.tag)||6===nr){ye=yt=Wt;continue e}gn=gn.parentNode}}ye=ye.return}!function Qo(v,D,B){if(di)return v(D,B);di=!0;try{mr(v,D,B)}finally{di=!1,Uo()}}(function(){var ti=yt,$o=Bi(B),Hs=[];e:{var po=Qi.get(v);if(void 0!==po){var ds=qr,sa=v;switch(v){case"keypress":if(0===Qe(B))break e;case"keydown":case"keyup":ds=ys;break;case"focusin":sa="focus",ds=Xe;break;case"focusout":sa="blur",ds=Xe;break;case"beforeblur":case"afterblur":ds=Xe;break;case"click":if(2===B.button)break e;case"auxclick":case"dblclick":case"mousedown":case"mousemove":case"mouseup":case"mouseout":case"mouseover":case"contextmenu":ds=Ka;break;case"drag":case"dragend":case"dragenter":case"dragexit":case"dragleave":case"dragover":case"dragstart":case"drop":ds=Bs;break;case"touchcancel":case"touchend":case"touchmove":case"touchstart":ds=vu;break;case Ps:case ps:case Oo:ds=Ut;break;case Nr:ds=ra;break;case"scroll":ds=as;break;case"wheel":ds=rd;break;case"copy":case"cut":case"paste":ds=Wo;break;case"gotpointercapture":case"lostpointercapture":case"pointercancel":case"pointerdown":case"pointermove":case"pointerout":case"pointerover":case"pointerup":ds=bl}var Js=0!=(4&D),zr=!Js&&"scroll"===v,Rr=Js?null!==po?po+"Capture":null:po;Js=[];for(var Fi,Ur=ti;null!==Ur;){var ro=(Fi=Ur).stateNode;if(5===Fi.tag&&null!==ro&&(Fi=ro,null!==Rr&&null!=(ro=lo(Ur,Rr))&&Js.push(vt(Ur,ro,Fi))),zr)break;Ur=Ur.return}0<Js.length&&(po=new ds(po,sa,null,B,$o),Hs.push({event:po,listeners:Js}))}}if(0==(7&D)){if(ds="mouseout"===v||"pointerout"===v,(!(po="mouseover"===v||"pointerover"===v)||0!=(16&D)||!(sa=B.relatedTarget||B.fromElement)||!lu(sa)&&!sa[bd])&&(ds||po)&&(po=$o.window===$o?$o:(po=$o.ownerDocument)?po.defaultView||po.parentWindow:window,ds?(ds=ti,null!==(sa=(sa=B.relatedTarget||B.toElement)?lu(sa):null)&&(sa!==(zr=yo(sa))||5!==sa.tag&&6!==sa.tag)&&(sa=null)):(ds=null,sa=ti),ds!==sa)){if(Js=Ka,ro="onMouseLeave",Rr="onMouseEnter",Ur="mouse",("pointerout"===v||"pointerover"===v)&&(Js=bl,ro="onPointerLeave",Rr="onPointerEnter",Ur="pointer"),zr=null==ds?po:al(ds),Fi=null==sa?po:al(sa),(po=new Js(ro,Ur+"leave",ds,B,$o)).target=zr,po.relatedTarget=Fi,ro=null,lu($o)===ti&&((Js=new Js(Rr,Ur+"enter",sa,B,$o)).target=Fi,Js.relatedTarget=zr,ro=Js),zr=ro,ds&&sa)t:{for(Rr=sa,Ur=0,Fi=Js=ds;Fi;Fi=Ln(Fi))Ur++;for(Fi=0,ro=Rr;ro;ro=Ln(ro))Fi++;for(;0<Ur-Fi;)Js=Ln(Js),Ur--;for(;0<Fi-Ur;)Rr=Ln(Rr),Fi--;for(;Ur--;){if(Js===Rr||null!==Rr&&Js===Rr.alternate)break t;Js=Ln(Js),Rr=Ln(Rr)}Js=null}else Js=null;null!==ds&&cr(Hs,po,ds,Js,!1),null!==sa&&null!==zr&&cr(Hs,zr,sa,Js,!0)}if("select"===(ds=(po=ti?al(ti):window).nodeName&&po.nodeName.toLowerCase())||"input"===ds&&"file"===po.type)var $a=ni;else if(nt(po))if(fi)$a=Es;else{$a=fo;var ms=gr}else(ds=po.nodeName)&&"input"===ds.toLowerCase()&&("checkbox"===po.type||"radio"===po.type)&&($a=$s);switch($a&&($a=$a(v,ti))?Mt(Hs,$a,B,$o):(ms&&ms(v,po,ti),"focusout"===v&&(ms=po._wrapperState)&&ms.controlled&&"number"===po.type&&Kt(po,"number",po.value)),ms=ti?al(ti):window,v){case"focusin":(nt(ms)||"true"===ms.contentEditable)&&(La=ms,kd=ti,Oc=null);break;case"focusout":Oc=kd=La=null;break;case"mousedown":Mo=!0;break;case"contextmenu":case"mouseup":case"dragend":Mo=!1,No(Hs,B,$o);break;case"selectionchange":if(Uc)break;case"keydown":case"keyup":No(Hs,B,$o)}var xa;if(au)e:{switch(v){case"compositionstart":var za="onCompositionStart";break e;case"compositionend":za="onCompositionEnd";break e;case"compositionupdate":za="onCompositionUpdate";break e}za=void 0}else cu?Fd(v,B)&&(za="onCompositionEnd"):"keydown"===v&&229===B.keyCode&&(za="onCompositionStart");za&&($u&&"ko"!==B.locale&&(cu||"onCompositionStart"!==za?"onCompositionEnd"===za&&cu&&(xa=Ua()):(Ml="value"in(Wa=$o)?Wa.value:Wa.textContent,cu=!0)),0<(ms=Qt(ti,za)).length&&(za=new yl(za,v,null,B,$o),Hs.push({event:za,listeners:ms}),(xa||null!==(xa=Bo(B)))&&(za.data=xa))),(xa=id?function Er(v,D){switch(v){case"compositionend":return Bo(D);case"keypress":return 32!==D.which?null:(wu=!0,Hu);case"textInput":return(v=D.data)===Hu&&wu?null:v;default:return null}}(v,B):function j(v,D){if(cu)return"compositionend"===v||!au&&Fd(v,D)?(v=Ua(),Hl=Ml=Wa=null,cu=!1,v):null;switch(v){case"paste":default:return null;case"keypress":if(!(D.ctrlKey||D.altKey||D.metaKey)||D.ctrlKey&&D.altKey){if(D.char&&1<D.char.length)return D.char;if(D.which)return String.fromCharCode(D.which)}return null;case"compositionend":return $u&&"ko"!==D.locale?null:D.data}}(v,B))&&0<(ti=Qt(ti,"onBeforeInput")).length&&($o=new yl("onBeforeInput","beforeinput",null,B,$o),Hs.push({event:$o,listeners:ti}),$o.data=xa)}_n(Hs,D)})}function vt(v,D,B){return{instance:v,listener:D,currentTarget:B}}function Qt(v,D){for(var B=D+"Capture",ye=[];null!==v;){var He=v,yt=He.stateNode;5===He.tag&&null!==yt&&(He=yt,null!=(yt=lo(v,B))&&ye.unshift(vt(v,yt,He)),null!=(yt=lo(v,D))&&ye.push(vt(v,yt,He))),v=v.return}return ye}function Ln(v){if(null===v)return null;do{v=v.return}while(v&&5!==v.tag);return v||null}function cr(v,D,B,ye,He){for(var yt=D._reactName,Wt=[];null!==B&&B!==ye;){var gn=B,nr=gn.alternate,ti=gn.stateNode;if(null!==nr&&nr===ye)break;5===gn.tag&&null!==ti&&(gn=ti,He?null!=(nr=lo(B,yt))&&Wt.unshift(vt(B,nr,gn)):He||null!=(nr=lo(B,yt))&&Wt.push(vt(B,nr,gn))),B=B.return}0!==Wt.length&&v.push({event:D,listeners:Wt})}function ui(){}var Lo=null,Ta=null;function _s(v,D){switch(v){case"button":case"input":case"select":case"textarea":return!!D.autoFocus}return!1}function ha(v,D){return"textarea"===v||"option"===v||"noscript"===v||"string"==typeof D.children||"number"==typeof D.children||"object"==typeof D.dangerouslySetInnerHTML&&null!==D.dangerouslySetInnerHTML&&null!=D.dangerouslySetInnerHTML.__html}var Ca="function"==typeof setTimeout?setTimeout:void 0,Ru="function"==typeof clearTimeout?clearTimeout:void 0;function lc(v){(1===v.nodeType||9===v.nodeType&&null!=(v=v.body))&&(v.textContent="")}function Fa(v){for(;null!=v;v=v.nextSibling){var D=v.nodeType;if(1===D||3===D)break}return v}function nl(v){v=v.previousSibling;for(var D=0;v;){if(8===v.nodeType){var B=v.data;if("$"===B||"$!"===B||"$?"===B){if(0===D)return v;D--}else"/$"===B&&D++}v=v.previousSibling}return null}var mc=0,Bu=Math.random().toString(36).slice(2),Bl="__reactFiber$"+Bu,tc="__reactProps$"+Bu,bd="__reactContainer$"+Bu,kc="__reactEvents$"+Bu;function lu(v){var D=v[Bl];if(D)return D;for(var B=v.parentNode;B;){if(D=B[bd]||B[Bl]){if(B=D.alternate,null!==D.child||null!==B&&null!==B.child)for(v=nl(v);null!==v;){if(B=v[Bl])return B;v=nl(v)}return D}B=(v=B).parentNode}return null}function Ma(v){return!(v=v[Bl]||v[bd])||5!==v.tag&&6!==v.tag&&13!==v.tag&&3!==v.tag?null:v}function al(v){if(5===v.tag||6===v.tag)return v.stateNode;throw Error(c(33))}function Il(v){return v[tc]||null}function Cl(v){var D=v[kc];return void 0===D&&(D=v[kc]=new Set),D}var hf=[],zd=-1;function sd(v){return{current:v}}function Ol(v){0>zd||(v.current=hf[zd],hf[zd]=null,zd--)}function Ll(v,D){zd++,hf[zd]=v.current,v.current=D}var Uu={},ll=sd(Uu),Su=sd(!1),tn=Uu;function yc(v,D){var B=v.type.contextTypes;if(!B)return Uu;var ye=v.stateNode;if(ye&&ye.__reactInternalMemoizedUnmaskedChildContext===D)return ye.__reactInternalMemoizedMaskedChildContext;var yt,He={};for(yt in B)He[yt]=D[yt];return ye&&((v=v.stateNode).__reactInternalMemoizedUnmaskedChildContext=D,v.__reactInternalMemoizedMaskedChildContext=He),He}function Nu(v){return null!=v.childContextTypes}function Xa(){Ol(Su),Ol(ll)}function ul(v,D,B){if(ll.current!==Uu)throw Error(c(168));Ll(ll,D),Ll(Su,B)}function Of(v,D,B){var ye=v.stateNode;if(v=D.childContextTypes,"function"!=typeof ye.getChildContext)return B;for(var He in ye=ye.getChildContext())if(!(He in v))throw Error(c(108,ur(D)||"Unknown",He));return a({},B,ye)}function Yc(v){return v=(v=v.stateNode)&&v.__reactInternalMemoizedMergedChildContext||Uu,tn=ll.current,Ll(ll,v),Ll(Su,Su.current),!0}function Sd(v,D,B){var ye=v.stateNode;if(!ye)throw Error(c(169));B?(v=Of(v,D,tn),ye.__reactInternalMemoizedMergedChildContext=v,Ol(Su),Ol(ll),Ll(ll,v)):Ol(Su),Ll(Su,B)}var uc=null,Td=null,$p=f.unstable_runWithPriority,_f=f.unstable_scheduleCallback,up=f.unstable_cancelCallback,Yu=f.unstable_shouldYield,Ec=f.unstable_requestPaint,Vd=f.unstable_now,Af=f.unstable_getCurrentPriorityLevel,vp=f.unstable_ImmediatePriority,$c=f.unstable_UserBlockingPriority,Pu=f.unstable_NormalPriority,ad=f.unstable_LowPriority,nc=f.unstable_IdlePriority,Oa={},Jc=void 0!==Ec?Ec:function(){},ld=null,cp=null,$d=!1,vo=Vd(),du=1e4>vo?Vd:function(){return Vd()-vo};function Fl(){switch(Af()){case vp:return 99;case $c:return 98;case Pu:return 97;case ad:return 96;case nc:return 95;default:throw Error(c(332))}}function Ac(v){switch(v){case 99:return vp;case 98:return $c;case 97:return Pu;case 96:return ad;case 95:return nc;default:throw Error(c(332))}}function ma(v,D){return v=Ac(v),$p(v,D)}function Dc(v,D,B){return v=Ac(v),_f(v,D,B)}function Iu(){if(null!==cp){var v=cp;cp=null,up(v)}bc()}function bc(){if(!$d&&null!==ld){$d=!0;var v=0;try{var D=ld;ma(99,function(){for(;v<D.length;v++){var B=D[v];do{B=B(!0)}while(null!==B)}}),ld=null}catch(B){throw null!==ld&&(ld=ld.slice(v+1)),_f(vp,Iu),B}finally{$d=!1}}}var cc=he.ReactCurrentBatchConfig;function Jl(v,D){if(v&&v.defaultProps){for(var B in D=a({},D),v=v.defaultProps)void 0===D[B]&&(D[B]=v[B]);return D}return D}var Sc=sd(null),Tc=null,ju=null,fu=null;function ud(){fu=ju=Tc=null}function dc(v){var D=Sc.current;Ol(Sc),v.type._context._currentValue=D}function Zd(v,D){for(;null!==v;){var B=v.alternate;if((v.childLanes&D)===D){if(null===B||(B.childLanes&D)===D)break;B.childLanes|=D}else v.childLanes|=D,null!==B&&(B.childLanes|=D);v=v.return}}function Qc(v,D){Tc=v,fu=ju=null,null!==(v=v.dependencies)&&null!==v.firstContext&&(0!=(v.lanes&D)&&(Ef=!0),v.firstContext=null)}function Rl(v,D){if(fu!==v&&!1!==D&&0!==D)if(("number"!=typeof D||1073741823===D)&&(fu=v,D=1073741823),D={context:v,observedBits:D,next:null},null===ju){if(null===Tc)throw Error(c(308));ju=D,Tc.dependencies={lanes:0,firstContext:D,responders:null}}else ju=ju.next=D;return v._currentValue}var jc=!1;function fc(v){v.updateQueue={baseState:v.memoizedState,firstBaseUpdate:null,lastBaseUpdate:null,shared:{pending:null},effects:null}}function h(v,D){D.updateQueue===(v=v.updateQueue)&&(D.updateQueue={baseState:v.baseState,firstBaseUpdate:v.firstBaseUpdate,lastBaseUpdate:v.lastBaseUpdate,shared:v.shared,effects:v.effects})}function E(v,D){return{eventTime:v,lane:D,tag:0,payload:null,callback:null,next:null}}function x(v,D){if(null!==(v=v.updateQueue)){var B=(v=v.shared).pending;null===B?D.next=D:(D.next=B.next,B.next=D),v.pending=D}}function F(v,D){var B=v.updateQueue,ye=v.alternate;if(null===ye||B!==(ye=ye.updateQueue))null===(v=B.lastBaseUpdate)?B.firstBaseUpdate=D:v.next=D,B.lastBaseUpdate=D;else{var He=null,yt=null;if(null!==(B=B.firstBaseUpdate)){do{var Wt={eventTime:B.eventTime,lane:B.lane,tag:B.tag,payload:B.payload,callback:B.callback,next:null};null===yt?He=yt=Wt:yt=yt.next=Wt,B=B.next}while(null!==B);null===yt?He=yt=D:yt=yt.next=D}else He=yt=D;v.updateQueue=B={baseState:ye.baseState,firstBaseUpdate:He,lastBaseUpdate:yt,shared:ye.shared,effects:ye.effects}}}function Q(v,D,B,ye){var He=v.updateQueue;jc=!1;var yt=He.firstBaseUpdate,Wt=He.lastBaseUpdate,gn=He.shared.pending;if(null!==gn){He.shared.pending=null;var nr=gn,ti=nr.next;nr.next=null,null===Wt?yt=ti:Wt.next=ti,Wt=nr;var $o=v.alternate;if(null!==$o){var Hs=($o=$o.updateQueue).lastBaseUpdate;Hs!==Wt&&(null===Hs?$o.firstBaseUpdate=ti:Hs.next=ti,$o.lastBaseUpdate=nr)}}if(null!==yt){for(Hs=He.baseState,Wt=0,$o=ti=nr=null;;){var po=yt.eventTime;if((ye&(gn=yt.lane))===gn){null!==$o&&($o=$o.next={eventTime:po,lane:0,tag:yt.tag,payload:yt.payload,callback:yt.callback,next:null});e:{var ds=v,sa=yt;switch(gn=D,po=B,sa.tag){case 1:if("function"==typeof(ds=sa.payload)){Hs=ds.call(po,Hs,gn);break e}Hs=ds;break e;case 3:ds.flags=-4097&ds.flags|64;case 0:if(null==(gn="function"==typeof(ds=sa.payload)?ds.call(po,Hs,gn):ds))break e;Hs=a({},Hs,gn);break e;case 2:jc=!0}}null!==yt.callback&&(v.flags|=32,null===(gn=He.effects)?He.effects=[yt]:gn.push(yt))}else po={eventTime:po,lane:gn,tag:yt.tag,payload:yt.payload,callback:yt.callback,next:null},null===$o?(ti=$o=po,nr=Hs):$o=$o.next=po,Wt|=gn;if(null===(yt=yt.next)){if(null===(gn=He.shared.pending))break;yt=gn.next,gn.next=null,He.lastBaseUpdate=gn,He.shared.pending=null}}null===$o&&(nr=Hs),He.baseState=nr,He.firstBaseUpdate=ti,He.lastBaseUpdate=$o,Cp|=Wt,v.lanes=Wt,v.memoizedState=Hs}}function le(v,D,B){if(v=D.effects,D.effects=null,null!==v)for(D=0;D<v.length;D++){var ye=v[D],He=ye.callback;if(null!==He){if(ye.callback=null,ye=B,"function"!=typeof He)throw Error(c(191,He));He.call(ye)}}}var me=(new r.Component).refs;function Fe(v,D,B,ye){B=null==(B=B(ye,D=v.memoizedState))?D:a({},D,B),v.memoizedState=B,0===v.lanes&&(v.updateQueue.baseState=B)}var Oe={isMounted:function(v){return!!(v=v._reactInternals)&&yo(v)===v},enqueueSetState:function(v,D,B){v=v._reactInternals;var ye=zc(),He=Qf(v),yt=E(ye,He);yt.payload=D,null!=B&&(yt.callback=B),x(v,yt),fp(v,He,ye)},enqueueReplaceState:function(v,D,B){v=v._reactInternals;var ye=zc(),He=Qf(v),yt=E(ye,He);yt.tag=1,yt.payload=D,null!=B&&(yt.callback=B),x(v,yt),fp(v,He,ye)},enqueueForceUpdate:function(v,D){v=v._reactInternals;var B=zc(),ye=Qf(v),He=E(B,ye);He.tag=2,null!=D&&(He.callback=D),x(v,He),fp(v,ye,B)}};function Je(v,D,B,ye,He,yt,Wt){return"function"==typeof(v=v.stateNode).shouldComponentUpdate?v.shouldComponentUpdate(ye,yt,Wt):!(D.prototype&&D.prototype.isPureReactComponent&&Fc(B,ye)&&Fc(He,yt))}function ht(v,D,B){var ye=!1,He=Uu,yt=D.contextType;return"object"==typeof yt&&null!==yt?yt=Rl(yt):(He=Nu(D)?tn:ll.current,yt=(ye=null!=(ye=D.contextTypes))?yc(v,He):Uu),D=new D(B,yt),v.memoizedState=null!=D.state?D.state:null,D.updater=Oe,v.stateNode=D,D._reactInternals=v,ye&&((v=v.stateNode).__reactInternalMemoizedUnmaskedChildContext=He,v.__reactInternalMemoizedMaskedChildContext=yt),D}function gt(v,D,B,ye){v=D.state,"function"==typeof D.componentWillReceiveProps&&D.componentWillReceiveProps(B,ye),"function"==typeof D.UNSAFE_componentWillReceiveProps&&D.UNSAFE_componentWillReceiveProps(B,ye),D.state!==v&&Oe.enqueueReplaceState(D,D.state,null)}function nn(v,D,B,ye){var He=v.stateNode;He.props=B,He.state=v.memoizedState,He.refs=me,fc(v);var yt=D.contextType;"object"==typeof yt&&null!==yt?He.context=Rl(yt):(yt=Nu(D)?tn:ll.current,He.context=yc(v,yt)),Q(v,B,He,ye),He.state=v.memoizedState,"function"==typeof(yt=D.getDerivedStateFromProps)&&(Fe(v,D,yt,B),He.state=v.memoizedState),"function"==typeof D.getDerivedStateFromProps||"function"==typeof He.getSnapshotBeforeUpdate||"function"!=typeof He.UNSAFE_componentWillMount&&"function"!=typeof He.componentWillMount||(D=He.state,"function"==typeof He.componentWillMount&&He.componentWillMount(),"function"==typeof He.UNSAFE_componentWillMount&&He.UNSAFE_componentWillMount(),D!==He.state&&Oe.enqueueReplaceState(He,He.state,null),Q(v,B,He,ye),He.state=v.memoizedState),"function"==typeof He.componentDidMount&&(v.flags|=4)}var $n=Array.isArray;function Bn(v,D,B){if(null!==(v=B.ref)&&"function"!=typeof v&&"object"!=typeof v){if(B._owner){if(B=B._owner){if(1!==B.tag)throw Error(c(309));var ye=B.stateNode}if(!ye)throw Error(c(147,v));var He=""+v;return null!==D&&null!==D.ref&&"function"==typeof D.ref&&D.ref._stringRef===He?D.ref:((D=function(yt){var Wt=ye.refs;Wt===me&&(Wt=ye.refs={}),null===yt?delete Wt[He]:Wt[He]=yt})._stringRef=He,D)}if("string"!=typeof v)throw Error(c(284));if(!B._owner)throw Error(c(290,v))}return v}function ar(v,D){if("textarea"!==v.type)throw Error(c(31,"[object Object]"===Object.prototype.toString.call(D)?"object with keys {"+Object.keys(D).join(", ")+"}":D))}function Pr(v){function D(zr,Rr){if(v){var Ur=zr.lastEffect;null!==Ur?(Ur.nextEffect=Rr,zr.lastEffect=Rr):zr.firstEffect=zr.lastEffect=Rr,Rr.nextEffect=null,Rr.flags=8}}function B(zr,Rr){if(!v)return null;for(;null!==Rr;)D(zr,Rr),Rr=Rr.sibling;return null}function ye(zr,Rr){for(zr=new Map;null!==Rr;)zr.set(null!==Rr.key?Rr.key:Rr.index,Rr),Rr=Rr.sibling;return zr}function He(zr,Rr){return(zr=pp(zr,Rr)).index=0,zr.sibling=null,zr}function yt(zr,Rr,Ur){return zr.index=Ur,v?null!==(Ur=zr.alternate)?(Ur=Ur.index)<Rr?(zr.flags=2,Rr):Ur:(zr.flags=2,Rr):Rr}function Wt(zr){return v&&null===zr.alternate&&(zr.flags=2),zr}function gn(zr,Rr,Ur,Fi){return null===Rr||6!==Rr.tag?((Rr=O_(Ur,zr.mode,Fi)).return=zr,Rr):((Rr=He(Rr,Ur)).return=zr,Rr)}function nr(zr,Rr,Ur,Fi){return null!==Rr&&Rr.elementType===Ur.type?((Fi=He(Rr,Ur.props)).ref=Bn(zr,Rr,Ur),Fi.return=zr,Fi):((Fi=Nh(Ur.type,Ur.key,Ur.props,null,zr.mode,Fi)).ref=Bn(zr,Rr,Ur),Fi.return=zr,Fi)}function ti(zr,Rr,Ur,Fi){return null===Rr||4!==Rr.tag||Rr.stateNode.containerInfo!==Ur.containerInfo||Rr.stateNode.implementation!==Ur.implementation?((Rr=B_(Ur,zr.mode,Fi)).return=zr,Rr):((Rr=He(Rr,Ur.children||[])).return=zr,Rr)}function $o(zr,Rr,Ur,Fi,ro){return null===Rr||7!==Rr.tag?((Rr=Vc(Ur,zr.mode,Fi,ro)).return=zr,Rr):((Rr=He(Rr,Ur)).return=zr,Rr)}function Hs(zr,Rr,Ur){if("string"==typeof Rr||"number"==typeof Rr)return(Rr=O_(""+Rr,zr.mode,Ur)).return=zr,Rr;if("object"==typeof Rr&&null!==Rr){switch(Rr.$$typeof){case be:return(Ur=Nh(Rr.type,Rr.key,Rr.props,null,zr.mode,Ur)).ref=Bn(zr,null,Rr),Ur.return=zr,Ur;case we:return(Rr=B_(Rr,zr.mode,Ur)).return=zr,Rr}if($n(Rr)||St(Rr))return(Rr=Vc(Rr,zr.mode,Ur,null)).return=zr,Rr;ar(zr,Rr)}return null}function po(zr,Rr,Ur,Fi){var ro=null!==Rr?Rr.key:null;if("string"==typeof Ur||"number"==typeof Ur)return null!==ro?null:gn(zr,Rr,""+Ur,Fi);if("object"==typeof Ur&&null!==Ur){switch(Ur.$$typeof){case be:return Ur.key===ro?Ur.type===ue?$o(zr,Rr,Ur.props.children,Fi,ro):nr(zr,Rr,Ur,Fi):null;case we:return Ur.key===ro?ti(zr,Rr,Ur,Fi):null}if($n(Ur)||St(Ur))return null!==ro?null:$o(zr,Rr,Ur,Fi,null);ar(zr,Ur)}return null}function ds(zr,Rr,Ur,Fi,ro){if("string"==typeof Fi||"number"==typeof Fi)return gn(Rr,zr=zr.get(Ur)||null,""+Fi,ro);if("object"==typeof Fi&&null!==Fi){switch(Fi.$$typeof){case be:return zr=zr.get(null===Fi.key?Ur:Fi.key)||null,Fi.type===ue?$o(Rr,zr,Fi.props.children,ro,Fi.key):nr(Rr,zr,Fi,ro);case we:return ti(Rr,zr=zr.get(null===Fi.key?Ur:Fi.key)||null,Fi,ro)}if($n(Fi)||St(Fi))return $o(Rr,zr=zr.get(Ur)||null,Fi,ro,null);ar(Rr,Fi)}return null}return function(zr,Rr,Ur,Fi){var ro="object"==typeof Ur&&null!==Ur&&Ur.type===ue&&null===Ur.key;ro&&(Ur=Ur.props.children);var $a="object"==typeof Ur&&null!==Ur;if($a)switch(Ur.$$typeof){case be:e:{for($a=Ur.key,ro=Rr;null!==ro;){if(ro.key===$a){if(7===ro.tag){if(Ur.type===ue){B(zr,ro.sibling),(Rr=He(ro,Ur.props.children)).return=zr,zr=Rr;break e}}else if(ro.elementType===Ur.type){B(zr,ro.sibling),(Rr=He(ro,Ur.props)).ref=Bn(zr,ro,Ur),Rr.return=zr,zr=Rr;break e}B(zr,ro);break}D(zr,ro),ro=ro.sibling}Ur.type===ue?((Rr=Vc(Ur.props.children,zr.mode,Fi,Ur.key)).return=zr,zr=Rr):((Fi=Nh(Ur.type,Ur.key,Ur.props,null,zr.mode,Fi)).ref=Bn(zr,Rr,Ur),Fi.return=zr,zr=Fi)}return Wt(zr);case we:e:{for(ro=Ur.key;null!==Rr;){if(Rr.key===ro){if(4===Rr.tag&&Rr.stateNode.containerInfo===Ur.containerInfo&&Rr.stateNode.implementation===Ur.implementation){B(zr,Rr.sibling),(Rr=He(Rr,Ur.children||[])).return=zr,zr=Rr;break e}B(zr,Rr);break}D(zr,Rr),Rr=Rr.sibling}(Rr=B_(Ur,zr.mode,Fi)).return=zr,zr=Rr}return Wt(zr)}if("string"==typeof Ur||"number"==typeof Ur)return Ur=""+Ur,null!==Rr&&6===Rr.tag?(B(zr,Rr.sibling),(Rr=He(Rr,Ur)).return=zr,zr=Rr):(B(zr,Rr),(Rr=O_(Ur,zr.mode,Fi)).return=zr,zr=Rr),Wt(zr);if($n(Ur))return function sa(zr,Rr,Ur,Fi){for(var ro=null,$a=null,ms=Rr,xa=Rr=0,za=null;null!==ms&&xa<Ur.length;xa++){ms.index>xa?(za=ms,ms=null):za=ms.sibling;var va=po(zr,ms,Ur[xa],Fi);if(null===va){null===ms&&(ms=za);break}v&&ms&&null===va.alternate&&D(zr,ms),Rr=yt(va,Rr,xa),null===$a?ro=va:$a.sibling=va,$a=va,ms=za}if(xa===Ur.length)return B(zr,ms),ro;if(null===ms){for(;xa<Ur.length;xa++)null!==(ms=Hs(zr,Ur[xa],Fi))&&(Rr=yt(ms,Rr,xa),null===$a?ro=ms:$a.sibling=ms,$a=ms);return ro}for(ms=ye(zr,ms);xa<Ur.length;xa++)null!==(za=ds(ms,zr,xa,Ur[xa],Fi))&&(v&&null!==za.alternate&&ms.delete(null===za.key?xa:za.key),Rr=yt(za,Rr,xa),null===$a?ro=za:$a.sibling=za,$a=za);return v&&ms.forEach(function(kf){return D(zr,kf)}),ro}(zr,Rr,Ur,Fi);if(St(Ur))return function Js(zr,Rr,Ur,Fi){var ro=St(Ur);if("function"!=typeof ro)throw Error(c(150));if(null==(Ur=ro.call(Ur)))throw Error(c(151));for(var $a=ro=null,ms=Rr,xa=Rr=0,za=null,va=Ur.next();null!==ms&&!va.done;xa++,va=Ur.next()){ms.index>xa?(za=ms,ms=null):za=ms.sibling;var kf=po(zr,ms,va.value,Fi);if(null===kf){null===ms&&(ms=za);break}v&&ms&&null===kf.alternate&&D(zr,ms),Rr=yt(kf,Rr,xa),null===$a?ro=kf:$a.sibling=kf,$a=kf,ms=za}if(va.done)return B(zr,ms),ro;if(null===ms){for(;!va.done;xa++,va=Ur.next())null!==(va=Hs(zr,va.value,Fi))&&(Rr=yt(va,Rr,xa),null===$a?ro=va:$a.sibling=va,$a=va);return ro}for(ms=ye(zr,ms);!va.done;xa++,va=Ur.next())null!==(va=ds(ms,zr,xa,va.value,Fi))&&(v&&null!==va.alternate&&ms.delete(null===va.key?xa:va.key),Rr=yt(va,Rr,xa),null===$a?ro=va:$a.sibling=va,$a=va);return v&&ms.forEach(function(og){return D(zr,og)}),ro}(zr,Rr,Ur,Fi);if($a&&ar(zr,Ur),void 0===Ur&&!ro)switch(zr.tag){case 1:case 22:case 0:case 11:case 15:throw Error(c(152,ur(zr.type)||"Component"))}return B(zr,Rr)}}var $i=Pr(!0),is=Pr(!1),Eo={},Gs=sd(Eo),qs=sd(Eo),qa=sd(Eo);function ka(v){if(v===Eo)throw Error(c(174));return v}function ja(v,D){switch(Ll(qa,D),Ll(qs,v),Ll(Gs,Eo),v=D.nodeType){case 9:case 11:D=(D=D.documentElement)?D.namespaceURI:ln(null,"");break;default:D=ln(D=(v=8===v?D.parentNode:D).namespaceURI||null,v=v.tagName)}Ol(Gs),Ll(Gs,D)}function wa(){Ol(Gs),Ol(qs),Ol(qa)}function jl(v){ka(qa.current);var D=ka(Gs.current),B=ln(D,v.type);D!==B&&(Ll(qs,v),Ll(Gs,B))}function pu(v){qs.current===v&&(Ol(Gs),Ol(qs))}var Ga=sd(0);function Tu(v){for(var D=v;null!==D;){if(13===D.tag){var B=D.memoizedState;if(null!==B&&(null===(B=B.dehydrated)||"$?"===B.data||"$!"===B.data))return D}else if(19===D.tag&&void 0!==D.memoizedProps.revealOrder){if(0!=(64&D.flags))return D}else if(null!==D.child){D.child.return=D,D=D.child;continue}if(D===v)break;for(;null===D.sibling;){if(null===D.return||D.return===v)return null;D=D.return}D.sibling.return=D.return,D=D.sibling}return null}var Lu=null,wc=null,Cu=!1;function Wd(v,D){var B=pd(5,null,null,0);B.elementType="DELETED",B.type="DELETED",B.stateNode=D,B.return=v,B.flags=8,null!==v.lastEffect?(v.lastEffect.nextEffect=B,v.lastEffect=B):v.firstEffect=v.lastEffect=B}function rl(v,D){switch(v.tag){case 5:return null!==(D=1!==D.nodeType||v.type.toLowerCase()!==D.nodeName.toLowerCase()?null:D)&&(v.stateNode=D,!0);case 6:return null!==(D=""===v.pendingProps||3!==D.nodeType?null:D)&&(v.stateNode=D,!0);default:return!1}}function K(v){if(Cu){var D=wc;if(D){var B=D;if(!rl(v,D)){if(!(D=Fa(B.nextSibling))||!rl(v,D))return v.flags=-1025&v.flags|2,Cu=!1,void(Lu=v);Wd(Lu,B)}Lu=v,wc=Fa(D.firstChild)}else v.flags=-1025&v.flags|2,Cu=!1,Lu=v}}function Ee(v){for(v=v.return;null!==v&&5!==v.tag&&3!==v.tag&&13!==v.tag;)v=v.return;Lu=v}function et(v){if(v!==Lu)return!1;if(!Cu)return Ee(v),Cu=!0,!1;var D=v.type;if(5!==v.tag||"head"!==D&&"body"!==D&&!ha(D,v.memoizedProps))for(D=wc;D;)Wd(v,D),D=Fa(D.nextSibling);if(Ee(v),13===v.tag){if(!(v=null!==(v=v.memoizedState)?v.dehydrated:null))throw Error(c(317));e:{for(v=v.nextSibling,D=0;v;){if(8===v.nodeType){var B=v.data;if("/$"===B){if(0===D){wc=Fa(v.nextSibling);break e}D--}else"$"!==B&&"$!"!==B&&"$?"!==B||D++}v=v.nextSibling}wc=null}}else wc=Lu?Fa(v.stateNode.nextSibling):null;return!0}function Tt(){wc=Lu=null,Cu=!1}var Xt=[];function Tr(){for(var v=0;v<Xt.length;v++)Xt[v]._workInProgressVersionPrimary=null;Xt.length=0}var Si=he.ReactCurrentDispatcher,gs=he.ReactCurrentBatchConfig,Aa=0,ca=null,Al=null,Ul=null,Gc=!1,gf=!1;function Hd(){throw Error(c(321))}function __(v,D){if(null===D)return!1;for(var B=0;B<D.length&&B<v.length;B++)if(!Ks(v[B],D[B]))return!1;return!0}function ch(v,D,B,ye,He,yt){if(Aa=yt,ca=D,D.memoizedState=null,D.updateQueue=null,D.lanes=0,Si.current=null===v||null===v.memoizedState?vf:yf,v=B(ye,He),gf){yt=0;do{if(gf=!1,!(25>yt))throw Error(c(301));yt+=1,Ul=Al=null,D.updateQueue=null,Si.current=zf,v=B(ye,He)}while(gf)}if(Si.current=_h,D=null!==Al&&null!==Al.next,Aa=0,Ul=Al=ca=null,Gc=!1,D)throw Error(c(300));return v}function xc(){var v={memoizedState:null,baseState:null,baseQueue:null,queue:null,next:null};return null===Ul?ca.memoizedState=Ul=v:Ul=Ul.next=v,Ul}function Jd(){if(null===Al){var v=ca.alternate;v=null!==v?v.memoizedState:null}else v=Al.next;var D=null===Ul?ca.memoizedState:Ul.next;if(null!==D)Ul=D,Al=v;else{if(null===v)throw Error(c(310));v={memoizedState:(Al=v).memoizedState,baseState:Al.baseState,baseQueue:Al.baseQueue,queue:Al.queue,next:null},null===Ul?ca.memoizedState=Ul=v:Ul=Ul.next=v}return Ul}function Bd(v,D){return"function"==typeof D?D(v):D}function dh(v){var D=Jd(),B=D.queue;if(null===B)throw Error(c(311));B.lastRenderedReducer=v;var ye=Al,He=ye.baseQueue,yt=B.pending;if(null!==yt){if(null!==He){var Wt=He.next;He.next=yt.next,yt.next=Wt}ye.baseQueue=He=yt,B.pending=null}if(null!==He){ye=ye.baseState;var gn=Wt=yt=null,nr=He=He.next;do{var ti=nr.lane;if((Aa&ti)===ti)null!==gn&&(gn=gn.next={lane:0,action:nr.action,eagerReducer:nr.eagerReducer,eagerState:nr.eagerState,next:null}),ye=nr.eagerReducer===v?nr.eagerState:v(ye,nr.action);else{var $o={lane:ti,action:nr.action,eagerReducer:nr.eagerReducer,eagerState:nr.eagerState,next:null};null===gn?(Wt=gn=$o,yt=ye):gn=gn.next=$o,ca.lanes|=ti,Cp|=ti}nr=nr.next}while(null!==nr&&nr!==He);null===gn?yt=ye:gn.next=Wt,Ks(ye,D.memoizedState)||(Ef=!0),D.memoizedState=ye,D.baseState=yt,D.baseQueue=gn,B.lastRenderedState=ye}return[D.memoizedState,B.dispatch]}function Hp(v){var D=Jd(),B=D.queue;if(null===B)throw Error(c(311));B.lastRenderedReducer=v;var ye=B.dispatch,He=B.pending,yt=D.memoizedState;if(null!==He){B.pending=null;var Wt=He=He.next;do{yt=v(yt,Wt.action),Wt=Wt.next}while(Wt!==He);Ks(yt,D.memoizedState)||(Ef=!0),D.memoizedState=yt,null===D.baseQueue&&(D.baseState=yt),B.lastRenderedState=yt}return[yt,ye]}function cl(v,D,B){var ye=D._getVersion;ye=ye(D._source);var He=D._workInProgressVersionPrimary;if(null!==He?v=He===ye:(v=(Aa&(v=v.mutableReadLanes))===v)&&(D._workInProgressVersionPrimary=ye,Xt.push(D)),v)return B(D._source);throw Xt.push(D),Error(c(350))}function g_(v,D,B,ye){var He=Rc;if(null===He)throw Error(c(349));var yt=D._getVersion,Wt=yt(D._source),gn=Si.current,nr=gn.useState(function(){return cl(He,D,B)}),ti=nr[1],$o=nr[0];nr=Ul;var Hs=v.memoizedState,po=Hs.refs,ds=po.getSnapshot,sa=Hs.source;Hs=Hs.subscribe;var Js=ca;return v.memoizedState={refs:po,source:D,subscribe:ye},gn.useEffect(function(){po.getSnapshot=B,po.setSnapshot=ti;var zr=yt(D._source);if(!Ks(Wt,zr)){zr=B(D._source),Ks($o,zr)||(ti(zr),zr=Qf(Js),He.mutableReadLanes|=zr&He.pendingLanes),He.entangledLanes|=zr=He.mutableReadLanes;for(var Rr=He.entanglements,Ur=zr;0<Ur;){var Fi=31-ol(Ur),ro=1<<Fi;Rr[Fi]|=zr,Ur&=~ro}}},[B,D,ye]),gn.useEffect(function(){return ye(D._source,function(){var zr=po.getSnapshot,Rr=po.setSnapshot;try{Rr(zr(D._source));var Ur=Qf(Js);He.mutableReadLanes|=Ur&He.pendingLanes}catch(Fi){Rr(function(){throw Fi})}})},[D,ye]),Ks(ds,B)&&Ks(sa,D)&&Ks(Hs,ye)||((v={pending:null,dispatch:null,lastRenderedReducer:Bd,lastRenderedState:$o}).dispatch=ti=m_.bind(null,ca,v),nr.queue=v,nr.baseQueue=null,$o=cl(He,D,B),nr.memoizedState=nr.baseState=$o),$o}function Df(v,D,B){return g_(Jd(),v,D,B)}function Ud(v){var D=xc();return"function"==typeof v&&(v=v()),D.memoizedState=D.baseState=v,v=(v=D.queue={pending:null,dispatch:null,lastRenderedReducer:Bd,lastRenderedState:v}).dispatch=m_.bind(null,ca,v),[D.memoizedState,v]}function cd(v,D,B,ye){return v={tag:v,create:D,destroy:B,deps:ye,next:null},null===(D=ca.updateQueue)?(ca.updateQueue=D={lastEffect:null},D.lastEffect=v.next=v):null===(B=D.lastEffect)?D.lastEffect=v.next=v:(ye=B.next,B.next=v,v.next=ye,D.lastEffect=v),v}function Kl(v){return xc().memoizedState={current:v}}function dp(){return Jd().memoizedState}function dd(v,D,B,ye){var He=xc();ca.flags|=v,He.memoizedState=cd(1|D,B,void 0,void 0===ye?null:ye)}function Gh(v,D,B,ye){var He=Jd();ye=void 0===ye?null:ye;var yt=void 0;if(null!==Al){var Wt=Al.memoizedState;if(yt=Wt.destroy,null!==ye&&__(ye,Wt.deps))return void cd(D,B,yt,ye)}ca.flags|=v,He.memoizedState=cd(1|D,B,yt,ye)}function fh(v,D){return dd(516,4,v,D)}function wf(v,D){return Gh(516,4,v,D)}function Bp(v,D){return Gh(4,2,v,D)}function mf(v,D){return"function"==typeof D?(v=v(),D(v),function(){D(null)}):null!=D?(v=v(),D.current=v,function(){D.current=null}):void 0}function rc(v,D,B){return B=null!=B?B.concat([v]):null,Gh(4,2,mf.bind(null,D,v),B)}function Cd(){}function Up(v,D){var B=Jd();D=void 0===D?null:D;var ye=B.memoizedState;return null!==ye&&null!==D&&__(D,ye[1])?ye[0]:(B.memoizedState=[v,D],v)}function ph(v,D){var B=Jd();D=void 0===D?null:D;var ye=B.memoizedState;return null!==ye&&null!==D&&__(D,ye[1])?ye[0]:(v=v(),B.memoizedState=[v,D],v)}function hh(v,D){var B=Fl();ma(98>B?98:B,function(){v(!0)}),ma(97<B?97:B,function(){var ye=gs.transition;gs.transition=1;try{v(!1),D()}finally{gs.transition=ye}})}function m_(v,D,B){var ye=zc(),He=Qf(v),yt={lane:He,action:B,eagerReducer:null,eagerState:null,next:null},Wt=D.pending;if(null===Wt?yt.next=yt:(yt.next=Wt.next,Wt.next=yt),D.pending=yt,Wt=v.alternate,v===ca||null!==Wt&&Wt===ca)gf=Gc=!0;else{if(0===v.lanes&&(null===Wt||0===Wt.lanes)&&null!==(Wt=D.lastRenderedReducer))try{var gn=D.lastRenderedState,nr=Wt(gn,B);if(yt.eagerReducer=Wt,yt.eagerState=nr,Ks(nr,gn))return}catch(ti){}fp(v,He,ye)}}var _h={readContext:Rl,useCallback:Hd,useContext:Hd,useEffect:Hd,useImperativeHandle:Hd,useLayoutEffect:Hd,useMemo:Hd,useReducer:Hd,useRef:Hd,useState:Hd,useDebugValue:Hd,useDeferredValue:Hd,useTransition:Hd,useMutableSource:Hd,useOpaqueIdentifier:Hd,unstable_isNewReconciler:!1},vf={readContext:Rl,useCallback:function(v,D){return xc().memoizedState=[v,void 0===D?null:D],v},useContext:Rl,useEffect:fh,useImperativeHandle:function(v,D,B){return B=null!=B?B.concat([v]):null,dd(4,2,mf.bind(null,D,v),B)},useLayoutEffect:function(v,D){return dd(4,2,v,D)},useMemo:function(v,D){var B=xc();return D=void 0===D?null:D,v=v(),B.memoizedState=[v,D],v},useReducer:function(v,D,B){var ye=xc();return D=void 0!==B?B(D):D,ye.memoizedState=ye.baseState=D,v=(v=ye.queue={pending:null,dispatch:null,lastRenderedReducer:v,lastRenderedState:D}).dispatch=m_.bind(null,ca,v),[ye.memoizedState,v]},useRef:Kl,useState:Ud,useDebugValue:Cd,useDeferredValue:function(v){var D=Ud(v),B=D[0],ye=D[1];return fh(function(){var He=gs.transition;gs.transition=1;try{ye(v)}finally{gs.transition=He}},[v]),B},useTransition:function(){var v=Ud(!1),D=v[0];return Kl(v=hh.bind(null,v[1])),[v,D]},useMutableSource:function(v,D,B){var ye=xc();return ye.memoizedState={refs:{getSnapshot:D,setSnapshot:null},source:v,subscribe:B},g_(ye,v,D,B)},useOpaqueIdentifier:function(){if(Cu){var v=!1,D=function vc(v){return{$$typeof:Pt,toString:v,valueOf:v}}(function(){throw v||(v=!0,B("r:"+(mc++).toString(36))),Error(c(355))}),B=Ud(D)[1];return 0==(2&ca.mode)&&(ca.flags|=516,cd(5,function(){B("r:"+(mc++).toString(36))},void 0,null)),D}return Ud(D="r:"+(mc++).toString(36)),D},unstable_isNewReconciler:!1},yf={readContext:Rl,useCallback:Up,useContext:Rl,useEffect:wf,useImperativeHandle:rc,useLayoutEffect:Bp,useMemo:ph,useReducer:dh,useRef:dp,useState:function(){return dh(Bd)},useDebugValue:Cd,useDeferredValue:function(v){var D=dh(Bd),B=D[0],ye=D[1];return wf(function(){var He=gs.transition;gs.transition=1;try{ye(v)}finally{gs.transition=He}},[v]),B},useTransition:function(){var v=dh(Bd)[0];return[dp().current,v]},useMutableSource:Df,useOpaqueIdentifier:function(){return dh(Bd)[0]},unstable_isNewReconciler:!1},zf={readContext:Rl,useCallback:Up,useContext:Rl,useEffect:wf,useImperativeHandle:rc,useLayoutEffect:Bp,useMemo:ph,useReducer:Hp,useRef:dp,useState:function(){return Hp(Bd)},useDebugValue:Cd,useDeferredValue:function(v){var D=Hp(Bd),B=D[0],ye=D[1];return wf(function(){var He=gs.transition;gs.transition=1;try{ye(v)}finally{gs.transition=He}},[v]),B},useTransition:function(){var v=Hp(Bd)[0];return[dp().current,v]},useMutableSource:Df,useOpaqueIdentifier:function(){return Hp(Bd)[0]},unstable_isNewReconciler:!1},xf=he.ReactCurrentOwner,Ef=!1;function Mu(v,D,B,ye){D.child=null===v?is(D,null,B,ye):$i(D,v.child,B,ye)}function Rf(v,D,B,ye,He){B=B.render;var yt=D.ref;return Qc(D,He),ye=ch(v,D,B,ye,yt,He),null===v||Ef?(D.flags|=1,Mu(v,D,ye,He),D.child):(D.updateQueue=v.updateQueue,D.flags&=-517,v.lanes&=~He,Od(v,D,He))}function zh(v,D,B,ye,He,yt){if(null===v){var Wt=B.type;return"function"!=typeof Wt||u_(Wt)||void 0!==Wt.defaultProps||null!==B.compare||void 0!==B.defaultProps?((v=Nh(B.type,null,ye,D,D.mode,yt)).ref=D.ref,v.return=D,D.child=v):(D.tag=15,D.type=Wt,Vh(v,D,Wt,ye,He,yt))}return Wt=v.child,0==(He&yt)&&(B=null!==(B=B.compare)?B:Fc)(He=Wt.memoizedProps,ye)&&v.ref===D.ref?Od(v,D,yt):(D.flags|=1,(v=pp(Wt,ye)).ref=D.ref,v.return=D,D.child=v)}function Vh(v,D,B,ye,He,yt){if(null!==v&&Fc(v.memoizedProps,ye)&&v.ref===D.ref){if(Ef=!1,0==(yt&He))return D.lanes=v.lanes,Od(v,D,yt);0!=(16384&v.flags)&&(Ef=!0)}return Yp(v,D,B,ye,yt)}function v_(v,D,B){var ye=D.pendingProps,He=ye.children,yt=null!==v?v.memoizedState:null;if("hidden"===ye.mode||"unstable-defer-without-hiding"===ye.mode)if(0==(4&D.mode))D.memoizedState={baseLanes:0},nf(0,B);else{if(0==(1073741824&B))return v=null!==yt?yt.baseLanes|B:B,D.lanes=D.childLanes=1073741824,D.memoizedState={baseLanes:v},nf(0,v),null;D.memoizedState={baseLanes:0},nf(0,null!==yt?yt.baseLanes:B)}else null!==yt?(ye=yt.baseLanes|B,D.memoizedState=null):ye=B,nf(0,ye);return Mu(v,D,He,B),D.child}function gh(v,D){var B=D.ref;(null===v&&null!==B||null!==v&&v.ref!==B)&&(D.flags|=128)}function Yp(v,D,B,ye,He){var yt=Nu(B)?tn:ll.current;return yt=yc(D,yt),Qc(D,He),B=ch(v,D,B,ye,yt,He),null===v||Ef?(D.flags|=1,Mu(v,D,B,He),D.child):(D.updateQueue=v.updateQueue,D.flags&=-517,v.lanes&=~He,Od(v,D,He))}function Zh(v,D,B,ye,He){if(Nu(B)){var yt=!0;Yc(D)}else yt=!1;if(Qc(D,He),null===D.stateNode)null!==v&&(v.alternate=null,D.alternate=null,D.flags|=2),ht(D,B,ye),nn(D,B,ye,He),ye=!0;else if(null===v){var Wt=D.stateNode,gn=D.memoizedProps;Wt.props=gn;var nr=Wt.context,ti=B.contextType;ti="object"==typeof ti&&null!==ti?Rl(ti):yc(D,ti=Nu(B)?tn:ll.current);var $o=B.getDerivedStateFromProps,Hs="function"==typeof $o||"function"==typeof Wt.getSnapshotBeforeUpdate;Hs||"function"!=typeof Wt.UNSAFE_componentWillReceiveProps&&"function"!=typeof Wt.componentWillReceiveProps||(gn!==ye||nr!==ti)&&gt(D,Wt,ye,ti),jc=!1;var po=D.memoizedState;Wt.state=po,Q(D,ye,Wt,He),nr=D.memoizedState,gn!==ye||po!==nr||Su.current||jc?("function"==typeof $o&&(Fe(D,B,$o,ye),nr=D.memoizedState),(gn=jc||Je(D,B,gn,ye,po,nr,ti))?(Hs||"function"!=typeof Wt.UNSAFE_componentWillMount&&"function"!=typeof Wt.componentWillMount||("function"==typeof Wt.componentWillMount&&Wt.componentWillMount(),"function"==typeof Wt.UNSAFE_componentWillMount&&Wt.UNSAFE_componentWillMount()),"function"==typeof Wt.componentDidMount&&(D.flags|=4)):("function"==typeof Wt.componentDidMount&&(D.flags|=4),D.memoizedProps=ye,D.memoizedState=nr),Wt.props=ye,Wt.state=nr,Wt.context=ti,ye=gn):("function"==typeof Wt.componentDidMount&&(D.flags|=4),ye=!1)}else{Wt=D.stateNode,h(v,D),gn=D.memoizedProps,ti=D.type===D.elementType?gn:Jl(D.type,gn),Wt.props=ti,Hs=D.pendingProps,po=Wt.context,nr="object"==typeof(nr=B.contextType)&&null!==nr?Rl(nr):yc(D,nr=Nu(B)?tn:ll.current);var ds=B.getDerivedStateFromProps;($o="function"==typeof ds||"function"==typeof Wt.getSnapshotBeforeUpdate)||"function"!=typeof Wt.UNSAFE_componentWillReceiveProps&&"function"!=typeof Wt.componentWillReceiveProps||(gn!==Hs||po!==nr)&&gt(D,Wt,ye,nr),jc=!1,Wt.state=po=D.memoizedState,Q(D,ye,Wt,He);var sa=D.memoizedState;gn!==Hs||po!==sa||Su.current||jc?("function"==typeof ds&&(Fe(D,B,ds,ye),sa=D.memoizedState),(ti=jc||Je(D,B,ti,ye,po,sa,nr))?($o||"function"!=typeof Wt.UNSAFE_componentWillUpdate&&"function"!=typeof Wt.componentWillUpdate||("function"==typeof Wt.componentWillUpdate&&Wt.componentWillUpdate(ye,sa,nr),"function"==typeof Wt.UNSAFE_componentWillUpdate&&Wt.UNSAFE_componentWillUpdate(ye,sa,nr)),"function"==typeof Wt.componentDidUpdate&&(D.flags|=4),"function"==typeof Wt.getSnapshotBeforeUpdate&&(D.flags|=256)):("function"!=typeof Wt.componentDidUpdate||gn===v.memoizedProps&&po===v.memoizedState||(D.flags|=4),"function"!=typeof Wt.getSnapshotBeforeUpdate||gn===v.memoizedProps&&po===v.memoizedState||(D.flags|=256),D.memoizedProps=ye,D.memoizedState=sa),Wt.props=ye,Wt.state=sa,Wt.context=nr,ye=ti):("function"!=typeof Wt.componentDidUpdate||gn===v.memoizedProps&&po===v.memoizedState||(D.flags|=4),"function"!=typeof Wt.getSnapshotBeforeUpdate||gn===v.memoizedProps&&po===v.memoizedState||(D.flags|=256),ye=!1)}return mh(v,D,B,ye,yt,He)}function mh(v,D,B,ye,He,yt){gh(v,D);var Wt=0!=(64&D.flags);if(!ye&&!Wt)return He&&Sd(D,B,!1),Od(v,D,yt);ye=D.stateNode,xf.current=D;var gn=Wt&&"function"!=typeof B.getDerivedStateFromError?null:ye.render();return D.flags|=1,null!==v&&Wt?(D.child=$i(D,v.child,null,yt),D.child=$i(D,null,gn,yt)):Mu(v,D,gn,yt),D.memoizedState=ye.state,He&&Sd(D,B,!0),D.child}function tg(v){var D=v.stateNode;D.pendingContext?ul(0,D.pendingContext,D.pendingContext!==D.context):D.context&&ul(0,D.context,!1),ja(v,D.containerInfo)}var E_,Qh,Ad,Ou={dehydrated:null,retryLane:0};function Wh(v,D,B){var Wt,ye=D.pendingProps,He=Ga.current,yt=!1;return(Wt=0!=(64&D.flags))||(Wt=(null===v||null!==v.memoizedState)&&0!=(2&He)),Wt?(yt=!0,D.flags&=-65):null!==v&&null===v.memoizedState||void 0===ye.fallback||!0===ye.unstable_avoidThisFallback||(He|=1),Ll(Ga,1&He),null===v?(void 0!==ye.fallback&&K(D),v=ye.children,He=ye.fallback,yt?(v=Md(D,v,He,B),D.child.memoizedState={baseLanes:B},D.memoizedState=Ou,v):"number"==typeof ye.unstable_expectedLoadTime?(v=Md(D,v,He,B),D.child.memoizedState={baseLanes:B},D.memoizedState=Ou,D.lanes=33554432,v):((B=ig({mode:"visible",children:v},D.mode,B,null)).return=D,D.child=B)):yt?(ye=function y_(v,D,B,ye,He){var yt=D.mode,Wt=v.child;v=Wt.sibling;var gn={mode:"hidden",children:B};return 0==(2&yt)&&D.child!==Wt?((B=D.child).childLanes=0,B.pendingProps=gn,null!==(Wt=B.lastEffect)?(D.firstEffect=B.firstEffect,D.lastEffect=Wt,Wt.nextEffect=null):D.firstEffect=D.lastEffect=null):B=pp(Wt,gn),null!==v?ye=pp(v,ye):(ye=Vc(ye,yt,He,null)).flags|=2,ye.return=D,B.return=D,B.sibling=ye,D.child=B,ye}(v,D,ye.children,ye.fallback,B),(yt=D.child).memoizedState=null===(He=v.child.memoizedState)?{baseLanes:B}:{baseLanes:He.baseLanes|B},yt.childLanes=v.childLanes&~B,D.memoizedState=Ou,ye):(B=function Qd(v,D,B,ye){var He=v.child;return v=He.sibling,B=pp(He,{mode:"visible",children:B}),0==(2&D.mode)&&(B.lanes=ye),B.return=D,B.sibling=null,null!==v&&(v.nextEffect=null,v.flags=8,D.firstEffect=D.lastEffect=v),D.child=B}(v,D,ye.children,B),D.memoizedState=null,B)}function Md(v,D,B,ye){var He=v.mode,yt=v.child;return D={mode:"hidden",children:D},0==(2&He)&&null!==yt?(yt.childLanes=0,yt.pendingProps=D):yt=ig(D,He,0,null),B=Vc(B,He,ye,null),yt.return=v,B.return=v,yt.sibling=B,v.child=yt,B}function ng(v,D){v.lanes|=D;var B=v.alternate;null!==B&&(B.lanes|=D),Zd(v.return,D)}function vh(v,D,B,ye,He,yt){var Wt=v.memoizedState;null===Wt?v.memoizedState={isBackwards:D,rendering:null,renderingStartTime:0,last:ye,tail:B,tailMode:He,lastEffect:yt}:(Wt.isBackwards=D,Wt.rendering=null,Wt.renderingStartTime=0,Wt.last=ye,Wt.tail=B,Wt.tailMode=He,Wt.lastEffect=yt)}function yp(v,D,B){var ye=D.pendingProps,He=ye.revealOrder,yt=ye.tail;if(Mu(v,D,ye.children,B),0!=(2&(ye=Ga.current)))ye=1&ye|2,D.flags|=64;else{if(null!==v&&0!=(64&v.flags))e:for(v=D.child;null!==v;){if(13===v.tag)null!==v.memoizedState&&ng(v,B);else if(19===v.tag)ng(v,B);else if(null!==v.child){v.child.return=v,v=v.child;continue}if(v===D)break e;for(;null===v.sibling;){if(null===v.return||v.return===D)break e;v=v.return}v.sibling.return=v.return,v=v.sibling}ye&=1}if(Ll(Ga,ye),0==(2&D.mode))D.memoizedState=null;else switch(He){case"forwards":for(B=D.child,He=null;null!==B;)null!==(v=B.alternate)&&null===Tu(v)&&(He=B),B=B.sibling;null===(B=He)?(He=D.child,D.child=null):(He=B.sibling,B.sibling=null),vh(D,!1,He,B,yt,D.lastEffect);break;case"backwards":for(B=null,He=D.child,D.child=null;null!==He;){if(null!==(v=He.alternate)&&null===Tu(v)){D.child=He;break}v=He.sibling,He.sibling=B,B=He,He=v}vh(D,!0,B,null,yt,D.lastEffect);break;case"together":vh(D,!1,null,null,void 0,D.lastEffect);break;default:D.memoizedState=null}return D.child}function Od(v,D,B){if(null!==v&&(D.dependencies=v.dependencies),Cp|=D.lanes,0!=(B&D.childLanes)){if(null!==v&&D.child!==v.child)throw Error(c(153));if(null!==D.child){for(B=pp(v=D.child,v.pendingProps),D.child=B,B.return=D;null!==v.sibling;)(B=B.sibling=pp(v=v.sibling,v.pendingProps)).return=D;B.sibling=null}return D.child}return null}function hu(v,D){if(!Cu)switch(v.tailMode){case"hidden":D=v.tail;for(var B=null;null!==D;)null!==D.alternate&&(B=D),D=D.sibling;null===B?v.tail=null:B.sibling=null;break;case"collapsed":B=v.tail;for(var ye=null;null!==B;)null!==B.alternate&&(ye=B),B=B.sibling;null===ye?D||null===v.tail?v.tail=null:v.tail.sibling=null:ye.sibling=null}}function Kh(v,D,B){var ye=D.pendingProps;switch(D.tag){case 2:case 16:case 15:case 0:case 11:case 7:case 8:case 12:case 9:case 14:return null;case 1:case 17:return Nu(D.type)&&Xa(),null;case 3:return wa(),Ol(Su),Ol(ll),Tr(),(ye=D.stateNode).pendingContext&&(ye.context=ye.pendingContext,ye.pendingContext=null),(null===v||null===v.child)&&(et(D)?D.flags|=4:ye.hydrate||(D.flags|=256)),null;case 5:pu(D);var He=ka(qa.current);if(B=D.type,null!==v&&null!=D.stateNode)Qh(v,D,B,ye),v.ref!==D.ref&&(D.flags|=128);else{if(!ye){if(null===D.stateNode)throw Error(c(166));return null}if(v=ka(Gs.current),et(D)){B=D.type;var yt=D.memoizedProps;switch((ye=D.stateNode)[Bl]=D,ye[tc]=yt,B){case"dialog":pa("cancel",ye),pa("close",ye);break;case"iframe":case"object":case"embed":pa("load",ye);break;case"video":case"audio":for(v=0;v<ru.length;v++)pa(ru[v],ye);break;case"source":pa("error",ye);break;case"img":case"image":case"link":pa("error",ye),pa("load",ye);break;case"details":pa("toggle",ye);break;case"input":_i(ye,yt),pa("invalid",ye);break;case"select":ye._wrapperState={wasMultiple:!!yt.multiple},pa("invalid",ye);break;case"textarea":Xr(ye,yt),pa("invalid",ye)}for(var Wt in ao(B,yt),v=null,yt)yt.hasOwnProperty(Wt)&&(He=yt[Wt],"children"===Wt?"string"==typeof He?ye.textContent!==He&&(v=["children",He]):"number"==typeof He&&ye.textContent!==""+He&&(v=["children",""+He]):p.hasOwnProperty(Wt)&&null!=He&&"onScroll"===Wt&&pa("scroll",ye));switch(B){case"input":Xn(ye),Sr(ye,yt,!0);break;case"textarea":Xn(ye),ii(ye);break;case"select":case"option":break;default:"function"==typeof yt.onClick&&(ye.onclick=ui)}D.updateQueue=ye=v,null!==ye&&(D.flags|=4)}else{switch(Wt=9===He.nodeType?He:He.ownerDocument,v===hr_html&&(v=Ki(B)),v===hr_html?"script"===B?((v=Wt.createElement("div")).innerHTML="<script><\/script>",v=v.removeChild(v.firstChild)):"string"==typeof ye.is?v=Wt.createElement(B,{is:ye.is}):(v=Wt.createElement(B),"select"===B&&(Wt=v,ye.multiple?Wt.multiple=!0:ye.size&&(Wt.size=ye.size))):v=Wt.createElementNS(v,B),v[Bl]=D,v[tc]=ye,E_(v,D),D.stateNode=v,Wt=dt(B,ye),B){case"dialog":pa("cancel",v),pa("close",v),He=ye;break;case"iframe":case"object":case"embed":pa("load",v),He=ye;break;case"video":case"audio":for(He=0;He<ru.length;He++)pa(ru[He],v);He=ye;break;case"source":pa("error",v),He=ye;break;case"img":case"image":case"link":pa("error",v),pa("load",v),He=ye;break;case"details":pa("toggle",v),He=ye;break;case"input":_i(v,ye),He=Ci(v,ye),pa("invalid",v);break;case"option":He=jn(v,ye);break;case"select":v._wrapperState={wasMultiple:!!ye.multiple},He=a({},ye,{value:void 0}),pa("invalid",v);break;case"textarea":Xr(v,ye),He=Gn(v,ye),pa("invalid",v);break;default:He=ye}ao(B,He);var gn=He;for(yt in gn)if(gn.hasOwnProperty(yt)){var nr=gn[yt];"style"===yt?vi(v,nr):"dangerouslySetInnerHTML"===yt?null!=(nr=nr?nr.__html:void 0)&&Zn(v,nr):"children"===yt?"string"==typeof nr?("textarea"!==B||""!==nr)&&cn(v,nr):"number"==typeof nr&&cn(v,""+nr):"suppressContentEditableWarning"!==yt&&"suppressHydrationWarning"!==yt&&"autoFocus"!==yt&&(p.hasOwnProperty(yt)?null!=nr&&"onScroll"===yt&&pa("scroll",v):null!=nr&&ae(v,yt,nr,Wt))}switch(B){case"input":Xn(v),Sr(v,ye,!1);break;case"textarea":Xn(v),ii(v);break;case"option":null!=ye.value&&v.setAttribute("value",""+$r(ye.value));break;case"select":v.multiple=!!ye.multiple,null!=(yt=ye.value)?Jn(v,!!ye.multiple,yt,!1):null!=ye.defaultValue&&Jn(v,!!ye.multiple,ye.defaultValue,!0);break;default:"function"==typeof He.onClick&&(v.onclick=ui)}_s(B,ye)&&(D.flags|=4)}null!==D.ref&&(D.flags|=128)}return null;case 6:if(v&&null!=D.stateNode)Ad(0,D,v.memoizedProps,ye);else{if("string"!=typeof ye&&null===D.stateNode)throw Error(c(166));B=ka(qa.current),ka(Gs.current),et(D)?(B=D.memoizedProps,(ye=D.stateNode)[Bl]=D,ye.nodeValue!==B&&(D.flags|=4)):((ye=(9===B.nodeType?B:B.ownerDocument).createTextNode(ye))[Bl]=D,D.stateNode=ye)}return null;case 13:return Ol(Ga),ye=D.memoizedState,0!=(64&D.flags)?(D.lanes=B,D):(ye=null!==ye,B=!1,null===v?void 0!==D.memoizedProps.fallback&&et(D):B=null!==v.memoizedState,ye&&!B&&0!=(2&D.mode)&&(null===v&&!0!==D.memoizedProps.unstable_avoidThisFallback||0!=(1&Ga.current)?0===ku&&(ku=3):((0===ku||3===ku)&&(ku=4),null===Rc||0==(134217727&Cp)&&0==(134217727&Gu)||Kf(Rc,Ts))),(ye||B)&&(D.flags|=4),null);case 4:return wa(),null===v&&$e(D.stateNode.containerInfo),null;case 10:return dc(D),null;case 19:if(Ol(Ga),null===(ye=D.memoizedState))return null;if(yt=0!=(64&D.flags),null===(Wt=ye.rendering))if(yt)hu(ye,!1);else{if(0!==ku||null!==v&&0!=(64&v.flags))for(v=D.child;null!==v;){if(null!==(Wt=Tu(v))){for(D.flags|=64,hu(ye,!1),null!==(yt=Wt.updateQueue)&&(D.updateQueue=yt,D.flags|=4),null===ye.lastEffect&&(D.firstEffect=null),D.lastEffect=ye.lastEffect,ye=B,B=D.child;null!==B;)v=ye,(yt=B).flags&=2,yt.nextEffect=null,yt.firstEffect=null,yt.lastEffect=null,null===(Wt=yt.alternate)?(yt.childLanes=0,yt.lanes=v,yt.child=null,yt.memoizedProps=null,yt.memoizedState=null,yt.updateQueue=null,yt.dependencies=null,yt.stateNode=null):(yt.childLanes=Wt.childLanes,yt.lanes=Wt.lanes,yt.child=Wt.child,yt.memoizedProps=Wt.memoizedProps,yt.memoizedState=Wt.memoizedState,yt.updateQueue=Wt.updateQueue,yt.type=Wt.type,yt.dependencies=null===(v=Wt.dependencies)?null:{lanes:v.lanes,firstContext:v.firstContext}),B=B.sibling;return Ll(Ga,1&Ga.current|2),D.child}v=v.sibling}null!==ye.tail&&du()>Gp&&(D.flags|=64,yt=!0,hu(ye,!1),D.lanes=33554432)}else{if(!yt)if(null!==(v=Tu(Wt))){if(D.flags|=64,yt=!0,null!==(B=v.updateQueue)&&(D.updateQueue=B,D.flags|=4),hu(ye,!0),null===ye.tail&&"hidden"===ye.tailMode&&!Wt.alternate&&!Cu)return null!==(D=D.lastEffect=ye.lastEffect)&&(D.nextEffect=null),null}else 2*du()-ye.renderingStartTime>Gp&&1073741824!==B&&(D.flags|=64,yt=!0,hu(ye,!1),D.lanes=33554432);ye.isBackwards?(Wt.sibling=D.child,D.child=Wt):(null!==(B=ye.last)?B.sibling=Wt:D.child=Wt,ye.last=Wt)}return null!==ye.tail?(ye.rendering=B=ye.tail,ye.tail=B.sibling,ye.lastEffect=D.lastEffect,ye.renderingStartTime=du(),B.sibling=null,D=Ga.current,Ll(Ga,yt?1&D|2:1&D),B):null;case 23:case 24:return Xf(),null!==v&&null!==v.memoizedState!=(null!==D.memoizedState)&&"unstable-defer-without-hiding"!==ye.mode&&(D.flags|=4),null}throw Error(c(156,D.tag))}function Ep(v){switch(v.tag){case 1:Nu(v.type)&&Xa();var D=v.flags;return 4096&D?(v.flags=-4097&D|64,v):null;case 3:if(wa(),Ol(Su),Ol(ll),Tr(),0!=(64&(D=v.flags)))throw Error(c(285));return v.flags=-4097&D|64,v;case 5:return pu(v),null;case 13:return Ol(Ga),4096&(D=v.flags)?(v.flags=-4097&D|64,v):null;case 19:return Ol(Ga),null;case 4:return wa(),null;case 10:return dc(v),null;case 23:case 24:return Xf(),null;default:return null}}function Xh(v,D){try{var B="",ye=D;do{B+=mi(ye),ye=ye.return}while(ye);var He=B}catch(yt){He="\nError generating stack: "+yt.message+"\n"+yt.stack}return{value:v,source:D,stack:He}}function ic(v,D){try{console.error(D.value)}catch(B){setTimeout(function(){throw B})}}E_=function(v,D){for(var B=D.child;null!==B;){if(5===B.tag||6===B.tag)v.appendChild(B.stateNode);else if(4!==B.tag&&null!==B.child){B.child.return=B,B=B.child;continue}if(B===D)break;for(;null===B.sibling;){if(null===B.return||B.return===D)return;B=B.return}B.sibling.return=B.return,B=B.sibling}},Qh=function(v,D,B,ye){var He=v.memoizedProps;if(He!==ye){v=D.stateNode,ka(Gs.current);var Wt,yt=null;switch(B){case"input":He=Ci(v,He),ye=Ci(v,ye),yt=[];break;case"option":He=jn(v,He),ye=jn(v,ye),yt=[];break;case"select":He=a({},He,{value:void 0}),ye=a({},ye,{value:void 0}),yt=[];break;case"textarea":He=Gn(v,He),ye=Gn(v,ye),yt=[];break;default:"function"!=typeof He.onClick&&"function"==typeof ye.onClick&&(v.onclick=ui)}for(ti in ao(B,ye),B=null,He)if(!ye.hasOwnProperty(ti)&&He.hasOwnProperty(ti)&&null!=He[ti])if("style"===ti){var gn=He[ti];for(Wt in gn)gn.hasOwnProperty(Wt)&&(B||(B={}),B[Wt]="")}else"dangerouslySetInnerHTML"!==ti&&"children"!==ti&&"suppressContentEditableWarning"!==ti&&"suppressHydrationWarning"!==ti&&"autoFocus"!==ti&&(p.hasOwnProperty(ti)?yt||(yt=[]):(yt=yt||[]).push(ti,null));for(ti in ye){var nr=ye[ti];if(gn=null!=He?He[ti]:void 0,ye.hasOwnProperty(ti)&&nr!==gn&&(null!=nr||null!=gn))if("style"===ti)if(gn){for(Wt in gn)!gn.hasOwnProperty(Wt)||nr&&nr.hasOwnProperty(Wt)||(B||(B={}),B[Wt]="");for(Wt in nr)nr.hasOwnProperty(Wt)&&gn[Wt]!==nr[Wt]&&(B||(B={}),B[Wt]=nr[Wt])}else B||(yt||(yt=[]),yt.push(ti,B)),B=nr;else"dangerouslySetInnerHTML"===ti?(gn=gn?gn.__html:void 0,null!=(nr=nr?nr.__html:void 0)&&gn!==nr&&(yt=yt||[]).push(ti,nr)):"children"===ti?"string"!=typeof nr&&"number"!=typeof nr||(yt=yt||[]).push(ti,""+nr):"suppressContentEditableWarning"!==ti&&"suppressHydrationWarning"!==ti&&(p.hasOwnProperty(ti)?(null!=nr&&"onScroll"===ti&&pa("scroll",v),yt||gn===nr||(yt=[])):"object"==typeof nr&&null!==nr&&nr.$$typeof===Pt?nr.toString():(yt=yt||[]).push(ti,nr))}B&&(yt=yt||[]).push("style",B);var ti=yt;(D.updateQueue=ti)&&(D.flags|=4)}},Ad=function(v,D,B,ye){B!==ye&&(D.flags|=4)};var Kd="function"==typeof WeakMap?WeakMap:Map;function Vf(v,D,B){(B=E(-1,B)).tag=3,B.payload={element:null};var ye=D.value;return B.callback=function(){zu||(zu=!0,zp=ye),ic(0,D)},B}function qh(v,D,B){(B=E(-1,B)).tag=3;var ye=v.type.getDerivedStateFromError;if("function"==typeof ye){var He=D.value;B.payload=function(){return ic(0,D),ye(He)}}var yt=v.stateNode;return null!==yt&&"function"==typeof yt.componentDidCatch&&(B.callback=function(){"function"!=typeof ye&&(null===pc?pc=new Set([this]):pc.add(this),ic(0,D));var Wt=D.stack;this.componentDidCatch(D.value,{componentStack:null!==Wt?Wt:""})}),B}var bp="function"==typeof WeakSet?WeakSet:Set;function b_(v){var D=v.ref;if(null!==D)if("function"==typeof D)try{D(null)}catch(B){Ff(v,B)}else D.current=null}function Sp(v,D){switch(D.tag){case 0:case 11:case 15:case 22:case 5:case 6:case 4:case 17:return;case 1:if(256&D.flags&&null!==v){var B=v.memoizedProps,ye=v.memoizedState;D=(v=D.stateNode).getSnapshotBeforeUpdate(D.elementType===D.type?B:Jl(D.type,B),ye),v.__reactInternalSnapshotBeforeUpdate=D}return;case 3:return void(256&D.flags&&lc(D.stateNode.containerInfo))}throw Error(c(163))}function yh(v,D,B){switch(B.tag){case 0:case 11:case 15:case 22:if(null!==(D=null!==(D=B.updateQueue)?D.lastEffect:null)){v=D=D.next;do{if(3==(3&v.tag)){var ye=v.create;v.destroy=ye()}v=v.next}while(v!==D)}if(null!==(D=null!==(D=B.updateQueue)?D.lastEffect:null)){v=D=D.next;do{var He=v;ye=He.next,0!=(4&(He=He.tag))&&0!=(1&He)&&(tp(B,v),a_(B,v)),v=ye}while(v!==D)}return;case 1:return v=B.stateNode,4&B.flags&&(null===D?v.componentDidMount():(ye=B.elementType===B.type?D.memoizedProps:Jl(B.type,D.memoizedProps),v.componentDidUpdate(ye,D.memoizedState,v.__reactInternalSnapshotBeforeUpdate))),void(null!==(D=B.updateQueue)&&le(B,D,v));case 3:if(null!==(D=B.updateQueue)){if(v=null,null!==B.child)switch(B.child.tag){case 5:case 1:v=B.child.stateNode}le(B,D,v)}return;case 5:return v=B.stateNode,void(null===D&&4&B.flags&&_s(B.type,B.memoizedProps)&&v.focus());case 6:case 4:case 12:case 19:case 17:case 20:case 21:case 23:case 24:return;case 13:return void(null===B.memoizedState&&(B=B.alternate,null!==B&&(B=B.memoizedState,null!==B&&(B=B.dehydrated,null!==B&&Za(B)))))}throw Error(c(163))}function S_(v,D){for(var B=v;;){if(5===B.tag){var ye=B.stateNode;if(D)"function"==typeof(ye=ye.style).setProperty?ye.setProperty("display","none","important"):ye.display="none";else{ye=B.stateNode;var He=B.memoizedProps.style;He=null!=He&&He.hasOwnProperty("display")?He.display:null,ye.style.display=ri("display",He)}}else if(6===B.tag)B.stateNode.nodeValue=D?"":B.memoizedProps;else if((23!==B.tag&&24!==B.tag||null===B.memoizedState||B===v)&&null!==B.child){B.child.return=B,B=B.child;continue}if(B===v)break;for(;null===B.sibling;){if(null===B.return||B.return===v)return;B=B.return}B.sibling.return=B.return,B=B.sibling}}function Eh(v,D){if(Td&&"function"==typeof Td.onCommitFiberUnmount)try{Td.onCommitFiberUnmount(uc,D)}catch(yt){}switch(D.tag){case 0:case 11:case 14:case 15:case 22:if(null!==(v=D.updateQueue)&&null!==(v=v.lastEffect)){var B=v=v.next;do{var ye=B,He=ye.destroy;if(ye=ye.tag,void 0!==He)if(0!=(4&ye))tp(D,B);else{ye=D;try{He()}catch(yt){Ff(ye,yt)}}B=B.next}while(B!==v)}break;case 1:if(b_(D),"function"==typeof(v=D.stateNode).componentWillUnmount)try{v.props=D.memoizedProps,v.state=D.memoizedState,v.componentWillUnmount()}catch(yt){Ff(D,yt)}break;case 5:b_(D);break;case 4:n_(v,D)}}function $_(v){v.alternate=null,v.child=null,v.dependencies=null,v.firstEffect=null,v.lastEffect=null,v.memoizedProps=null,v.memoizedState=null,v.pendingProps=null,v.return=null,v.updateQueue=null}function e_(v){return 5===v.tag||3===v.tag||4===v.tag}function Xd(v){e:{for(var D=v.return;null!==D;){if(e_(D))break e;D=D.return}throw Error(c(160))}var B=D;switch(D=B.stateNode,B.tag){case 5:var ye=!1;break;case 3:case 4:D=D.containerInfo,ye=!0;break;default:throw Error(c(161))}16&B.flags&&(cn(D,""),B.flags&=-17);e:t:for(B=v;;){for(;null===B.sibling;){if(null===B.return||e_(B.return)){B=null;break e}B=B.return}for(B.sibling.return=B.return,B=B.sibling;5!==B.tag&&6!==B.tag&&18!==B.tag;){if(2&B.flags||null===B.child||4===B.tag)continue t;B.child.return=B,B=B.child}if(!(2&B.flags)){B=B.stateNode;break e}}ye?t_(v,B,D):bh(v,B,D)}function t_(v,D,B){var ye=v.tag,He=5===ye||6===ye;if(He)v=He?v.stateNode:v.stateNode.instance,D?8===B.nodeType?B.parentNode.insertBefore(v,D):B.insertBefore(v,D):(8===B.nodeType?(D=B.parentNode).insertBefore(v,B):(D=B).appendChild(v),null!=(B=B._reactRootContainer)||null!==D.onclick||(D.onclick=ui));else if(4!==ye&&null!==(v=v.child))for(t_(v,D,B),v=v.sibling;null!==v;)t_(v,D,B),v=v.sibling}function bh(v,D,B){var ye=v.tag,He=5===ye||6===ye;if(He)v=He?v.stateNode:v.stateNode.instance,D?B.insertBefore(v,D):B.appendChild(v);else if(4!==ye&&null!==(v=v.child))for(bh(v,D,B),v=v.sibling;null!==v;)bh(v,D,B),v=v.sibling}function n_(v,D){for(var He,yt,B=D,ye=!1;;){if(!ye){ye=B.return;e:for(;;){if(null===ye)throw Error(c(160));switch(He=ye.stateNode,ye.tag){case 5:yt=!1;break e;case 3:case 4:He=He.containerInfo,yt=!0;break e}ye=ye.return}ye=!0}if(5===B.tag||6===B.tag){e:for(var Wt=v,gn=B,nr=gn;;)if(Eh(Wt,nr),null!==nr.child&&4!==nr.tag)nr.child.return=nr,nr=nr.child;else{if(nr===gn)break e;for(;null===nr.sibling;){if(null===nr.return||nr.return===gn)break e;nr=nr.return}nr.sibling.return=nr.return,nr=nr.sibling}yt?(gn=B.stateNode,8===(Wt=He).nodeType?Wt.parentNode.removeChild(gn):Wt.removeChild(gn)):He.removeChild(B.stateNode)}else if(4===B.tag){if(null!==B.child){He=B.stateNode.containerInfo,yt=!0,B.child.return=B,B=B.child;continue}}else if(Eh(v,B),null!==B.child){B.child.return=B,B=B.child;continue}if(B===D)break;for(;null===B.sibling;){if(null===B.return||B.return===D)return;4===(B=B.return).tag&&(ye=!1)}B.sibling.return=B.return,B=B.sibling}}function Zf(v,D){switch(D.tag){case 0:case 11:case 14:case 15:case 22:var B=D.updateQueue;if(null!==(B=null!==B?B.lastEffect:null)){var ye=B=B.next;do{3==(3&ye.tag)&&(v=ye.destroy,ye.destroy=void 0,void 0!==v&&v()),ye=ye.next}while(ye!==B)}return;case 1:case 12:case 17:return;case 5:if(null!=(B=D.stateNode)){ye=D.memoizedProps;var He=null!==v?v.memoizedProps:ye;v=D.type;var yt=D.updateQueue;if(D.updateQueue=null,null!==yt){for(B[tc]=ye,"input"===v&&"radio"===ye.type&&null!=ye.name&&so(B,ye),dt(v,He),D=dt(v,ye),He=0;He<yt.length;He+=2){var Wt=yt[He],gn=yt[He+1];"style"===Wt?vi(B,gn):"dangerouslySetInnerHTML"===Wt?Zn(B,gn):"children"===Wt?cn(B,gn):ae(B,Wt,gn,D)}switch(v){case"input":Ro(B,ye);break;case"textarea":Zi(B,ye);break;case"select":v=B._wrapperState.wasMultiple,B._wrapperState.wasMultiple=!!ye.multiple,null!=(yt=ye.value)?Jn(B,!!ye.multiple,yt,!1):v!==!!ye.multiple&&(null!=ye.defaultValue?Jn(B,!!ye.multiple,ye.defaultValue,!0):Jn(B,!!ye.multiple,ye.multiple?[]:"",!1))}}}return;case 6:if(null===D.stateNode)throw Error(c(162));return void(D.stateNode.nodeValue=D.memoizedProps);case 3:return void((B=D.stateNode).hydrate&&(B.hydrate=!1,Za(B.containerInfo)));case 13:return null!==D.memoizedState&&(H_=du(),S_(D.child,!0)),void Sh(D);case 19:return void Sh(D);case 23:case 24:return void S_(D,null!==D.memoizedState)}throw Error(c(163))}function Sh(v){var D=v.updateQueue;if(null!==D){v.updateQueue=null;var B=v.stateNode;null===B&&(B=v.stateNode=new bp),D.forEach(function(ye){var He=np.bind(null,v,ye);B.has(ye)||(B.add(ye),ye.then(He,He))})}}function Tp(v,D){return null!==v&&(null===(v=v.memoizedState)||null!==v.dehydrated)&&null!==(D=D.memoizedState)&&null===D.dehydrated}var bf=Math.ceil,Th=he.ReactCurrentDispatcher,Ch=he.ReactCurrentOwner,da=0,Rc=null,Fu=null,Ts=0,Nf=0,jp=sd(0),ku=0,Mh=null,Pf=0,Cp=0,Gu=0,Wf=0,qd=null,H_=0,Gp=1/0;function If(){Gp=du()+500}var Xp,Cs=null,zu=!1,zp=null,pc=null,oc=!1,Jf=null,Lf=90,Vp=[],r_=[],ef=null,tf=0,Oh=null,Ah=-1,fd=0,Dh=0,Mp=null,wh=!1;function zc(){return 0!=(48&da)?du():-1!==Ah?Ah:Ah=du()}function Qf(v){if(0==(2&(v=v.mode)))return 1;if(0==(4&v))return 99===Fl()?1:2;if(0===fd&&(fd=Pf),0!==cc.transition){0!==Dh&&(Dh=null!==qd?qd.pendingLanes:0),v=fd;var D=4186112&~Dh;return 0==(D&=-D)&&0==(D=(v=4186112&~v)&-v)&&(D=8192),D}return v=Fl(),v=zo(0!=(4&da)&&98===v?12:v=function Kr(v){switch(v){case 99:return 15;case 98:return 10;case 97:case 96:return 8;case 95:return 2;default:return 0}}(v),fd)}function fp(v,D,B){if(50<tf)throw tf=0,Oh=null,Error(c(185));if(null===(v=Op(v,D)))return null;vl(v,D,B),v===Rc&&(Gu|=D,4===ku&&Kf(v,Ts));var ye=Fl();1===D?0!=(8&da)&&0==(48&da)?i_(v):(Dd(v,B),0===da&&(If(),Iu())):(0==(4&da)||98!==ye&&99!==ye||(null===ef?ef=new Set([v]):ef.add(v)),Dd(v,B)),qd=v}function Op(v,D){v.lanes|=D;var B=v.alternate;for(null!==B&&(B.lanes|=D),B=v,v=v.return;null!==v;)v.childLanes|=D,null!==(B=v.alternate)&&(B.childLanes|=D),B=v,v=v.return;return 3===B.tag?B.stateNode:null}function Dd(v,D){for(var B=v.callbackNode,ye=v.suspendedLanes,He=v.pingedLanes,yt=v.expirationTimes,Wt=v.pendingLanes;0<Wt;){var gn=31-ol(Wt),nr=1<<gn,ti=yt[gn];-1===ti?0!=(nr&ye)&&0==(nr&He)||(ti=D,on(nr),yt[gn]=10<=Lt?ti+250:6<=Lt?ti+5e3:-1):ti<=D&&(v.expiredLanes|=nr),Wt&=~nr}if(ye=Ii(v,v===Rc?Ts:0),D=Lt,0===ye)null!==B&&(B!==Oa&&up(B),v.callbackNode=null,v.callbackPriority=0);else{if(null!==B){if(v.callbackPriority===D)return;B!==Oa&&up(B)}15===D?(B=i_.bind(null,v),null===ld?(ld=[B],cp=_f(vp,bc)):ld.push(B),B=Oa):14===D?B=Dc(99,i_.bind(null,v)):(B=function bi(v){switch(v){case 15:case 14:return 99;case 13:case 12:case 11:case 10:return 98;case 9:case 8:case 7:case 6:case 4:case 5:return 97;case 3:case 2:case 1:return 95;case 0:return 90;default:throw Error(c(358,v))}}(D),B=Dc(B,Zp.bind(null,v))),v.callbackPriority=D,v.callbackNode=B}}function Zp(v){if(Ah=-1,Dh=fd=0,0!=(48&da))throw Error(c(327));var D=v.callbackNode;if(Sf()&&v.callbackNode!==D)return null;var B=Ii(v,v===Rc?Ts:0);if(0===B)return null;var ye=B,He=da;da|=16;var yt=qf();for((Rc!==v||Ts!==ye)&&(If(),Jp(v,ye));;)try{rg();break}catch(gn){T_(v,gn)}if(ud(),Th.current=yt,da=He,null!==Fu?ye=0:(Rc=null,Ts=0,ye=ku),0!=(Pf&Gu))Jp(v,0);else if(0!==ye){if(2===ye&&(da|=64,v.hydrate&&(v.hydrate=!1,lc(v.containerInfo)),0!==(B=hs(v))&&(ye=Dp(v,B))),1===ye)throw D=Mh,Jp(v,0),Kf(v,B),Dd(v,du()),D;switch(v.finishedWork=v.current.alternate,v.finishedLanes=B,ye){case 0:case 1:throw Error(c(345));case 2:case 5:ep(v);break;case 3:if(Kf(v,B),(62914560&B)===B&&10<(ye=H_+500-du())){if(0!==Ii(v,0))break;if(((He=v.suspendedLanes)&B)!==B){zc(),v.pingedLanes|=v.suspendedLanes&He;break}v.timeoutHandle=Ca(ep.bind(null,v),ye);break}ep(v);break;case 4:if(Kf(v,B),(4186112&B)===B)break;for(ye=v.eventTimes,He=-1;0<B;){var Wt=31-ol(B);yt=1<<Wt,(Wt=ye[Wt])>He&&(He=Wt),B&=~yt}if(B=He,10<(B=(120>(B=du()-B)?120:480>B?480:1080>B?1080:1920>B?1920:3e3>B?3e3:4320>B?4320:1960*bf(B/1960))-B)){v.timeoutHandle=Ca(ep.bind(null,v),B);break}ep(v);break;default:throw Error(c(329))}}return Dd(v,du()),v.callbackNode===D?Zp.bind(null,v):null}function Kf(v,D){for(D&=~Wf,v.suspendedLanes|=D&=~Gu,v.pingedLanes&=~D,v=v.expirationTimes;0<D;){var B=31-ol(D),ye=1<<B;v[B]=-1,D&=~ye}}function i_(v){if(0!=(48&da))throw Error(c(327));if(Sf(),v===Rc&&0!=(v.expiredLanes&Ts)){var D=Ts,B=Dp(v,D);0!=(Pf&Gu)&&(B=Dp(v,D=Ii(v,D)))}else B=Dp(v,D=Ii(v,0));if(0!==v.tag&&2===B&&(da|=64,v.hydrate&&(v.hydrate=!1,lc(v.containerInfo)),0!==(D=hs(v))&&(B=Dp(v,D))),1===B)throw B=Mh,Jp(v,0),Kf(v,D),Dd(v,du()),B;return v.finishedWork=v.current.alternate,v.finishedLanes=D,ep(v),Dd(v,du()),null}function Ap(v,D){var B=da;da|=1;try{return v(D)}finally{0===(da=B)&&(If(),Iu())}}function Wp(v,D){var B=da;da&=-2,da|=8;try{return v(D)}finally{0===(da=B)&&(If(),Iu())}}function nf(v,D){Ll(jp,Nf),Nf|=D,Pf|=D}function Xf(){Nf=jp.current,Ol(jp)}function Jp(v,D){v.finishedWork=null,v.finishedLanes=0;var B=v.timeoutHandle;if(-1!==B&&(v.timeoutHandle=-1,Ru(B)),null!==Fu)for(B=Fu.return;null!==B;){var ye=B;switch(ye.tag){case 1:null!=(ye=ye.type.childContextTypes)&&Xa();break;case 3:wa(),Ol(Su),Ol(ll),Tr();break;case 5:pu(ye);break;case 4:wa();break;case 13:case 19:Ol(Ga);break;case 10:dc(ye);break;case 23:case 24:Xf()}B=B.return}Rc=v,Fu=pp(v.current,null),Ts=Nf=Pf=D,ku=0,Mh=null,Wf=Gu=Cp=0}function T_(v,D){for(;;){var B=Fu;try{if(ud(),Si.current=_h,Gc){for(var ye=ca.memoizedState;null!==ye;){var He=ye.queue;null!==He&&(He.pending=null),ye=ye.next}Gc=!1}if(Aa=0,Ul=Al=ca=null,gf=!1,Ch.current=null,null===B||null===B.return){ku=1,Mh=D,Fu=null;break}e:{var yt=v,Wt=B.return,gn=B,nr=D;if(D=Ts,gn.flags|=2048,gn.firstEffect=gn.lastEffect=null,null!==nr&&"object"==typeof nr&&"function"==typeof nr.then){var ti=nr;if(0==(2&gn.mode)){var $o=gn.alternate;$o?(gn.updateQueue=$o.updateQueue,gn.memoizedState=$o.memoizedState,gn.lanes=$o.lanes):(gn.updateQueue=null,gn.memoizedState=null)}var Hs=0!=(1&Ga.current),po=Wt;do{var ds;if(ds=13===po.tag){var sa=po.memoizedState;if(null!==sa)ds=null!==sa.dehydrated;else{var Js=po.memoizedProps;ds=void 0!==Js.fallback&&(!0!==Js.unstable_avoidThisFallback||!Hs)}}if(ds){var zr=po.updateQueue;if(null===zr){var Rr=new Set;Rr.add(ti),po.updateQueue=Rr}else zr.add(ti);if(0==(2&po.mode)){if(po.flags|=64,gn.flags|=16384,gn.flags&=-2981,1===gn.tag)if(null===gn.alternate)gn.tag=17;else{var Ur=E(-1,1);Ur.tag=2,x(gn,Ur)}gn.lanes|=1;break e}nr=void 0,gn=D;var Fi=yt.pingCache;if(null===Fi?(Fi=yt.pingCache=new Kd).set(ti,nr=new Set):void 0===(nr=Fi.get(ti))&&Fi.set(ti,nr=new Set),!nr.has(gn)){nr.add(gn);var ro=Rh.bind(null,yt,ti,gn);ti.then(ro,ro)}po.flags|=4096,po.lanes=D;break e}po=po.return}while(null!==po);nr=Error((ur(gn.type)||"A React component")+" suspended while rendering, but no fallback UI was specified.\n\nAdd a <Suspense fallback=...> component higher in the tree to provide a loading indicator or placeholder to display.")}5!==ku&&(ku=2),nr=Xh(nr,gn),po=Wt;do{switch(po.tag){case 3:yt=nr,po.flags|=4096,po.lanes|=D&=-D,F(po,Vf(0,yt,D));break e;case 1:yt=nr;var xa=po.stateNode;if(0==(64&po.flags)&&("function"==typeof po.type.getDerivedStateFromError||null!==xa&&"function"==typeof xa.componentDidCatch&&(null===pc||!pc.has(xa)))){po.flags|=4096,po.lanes|=D&=-D,F(po,qh(po,yt,D));break e}}po=po.return}while(null!==po)}C_(B)}catch(va){D=va,Fu===B&&null!==B&&(Fu=B=B.return);continue}break}}function qf(){var v=Th.current;return Th.current=_h,null===v?_h:v}function Dp(v,D){var B=da;da|=16;var ye=qf();for(Rc===v&&Ts===D||Jp(v,D);;)try{s_();break}catch(He){T_(v,He)}if(ud(),da=B,Th.current=ye,null!==Fu)throw Error(c(261));return Rc=null,Ts=0,ku}function s_(){for(;null!==Fu;)Qp(Fu)}function rg(){for(;null!==Fu&&!Yu();)Qp(Fu)}function Qp(v){var D=Xp(v.alternate,v,Nf);v.memoizedProps=v.pendingProps,null===D?C_(v):Fu=D,Ch.current=null}function C_(v){var D=v;do{var B=D.alternate;if(v=D.return,0==(2048&D.flags)){if(null!==(B=Kh(B,D,Nf)))return void(Fu=B);if(24!==(B=D).tag&&23!==B.tag||null===B.memoizedState||0!=(1073741824&Nf)||0==(4&B.mode)){for(var ye=0,He=B.child;null!==He;)ye|=He.lanes|He.childLanes,He=He.sibling;B.childLanes=ye}null!==v&&0==(2048&v.flags)&&(null===v.firstEffect&&(v.firstEffect=D.firstEffect),null!==D.lastEffect&&(null!==v.lastEffect&&(v.lastEffect.nextEffect=D.firstEffect),v.lastEffect=D.lastEffect),1<D.flags&&(null!==v.lastEffect?v.lastEffect.nextEffect=D:v.firstEffect=D,v.lastEffect=D))}else{if(null!==(B=Ep(D)))return B.flags&=2047,void(Fu=B);null!==v&&(v.firstEffect=v.lastEffect=null,v.flags|=2048)}if(null!==(D=D.sibling))return void(Fu=D);Fu=D=v}while(null!==D);0===ku&&(ku=5)}function ep(v){var D=Fl();return ma(99,xh.bind(null,v,D)),null}function xh(v,D){do{Sf()}while(null!==Jf);if(0!=(48&da))throw Error(c(327));var B=v.finishedWork;if(null===B)return null;if(v.finishedWork=null,v.finishedLanes=0,B===v.current)throw Error(c(177));v.callbackNode=null;var ye=B.lanes|B.childLanes,He=ye,yt=v.pendingLanes&~He;v.pendingLanes=He,v.suspendedLanes=0,v.pingedLanes=0,v.expiredLanes&=He,v.mutableReadLanes&=He,v.entangledLanes&=He,He=v.entanglements;for(var Wt=v.eventTimes,gn=v.expirationTimes;0<yt;){var nr=31-ol(yt),ti=1<<nr;He[nr]=0,Wt[nr]=-1,gn[nr]=-1,yt&=~ti}if(null!==ef&&0==(24&ye)&&ef.has(v)&&ef.delete(v),v===Rc&&(Fu=Rc=null,Ts=0),1<B.flags?null!==B.lastEffect?(B.lastEffect.nextEffect=B,ye=B.firstEffect):ye=B:ye=B.firstEffect,null!==ye){if(He=da,da|=32,Ch.current=null,Lo=Pl,Ed(Wt=yd())){if("selectionStart"in Wt)gn={start:Wt.selectionStart,end:Wt.selectionEnd};else if((ti=(gn=(gn=Wt.ownerDocument)&&gn.defaultView||window).getSelection&&gn.getSelection())&&0!==ti.rangeCount){gn=ti.anchorNode,yt=ti.anchorOffset,nr=ti.focusNode,ti=ti.focusOffset;var $o=0,Hs=-1,po=-1,ds=0,sa=0,Js=Wt,zr=null;t:for(;;){for(var Rr;Js!==gn||0!==yt&&3!==Js.nodeType||(Hs=$o+yt),Js!==nr||0!==ti&&3!==Js.nodeType||(po=$o+ti),3===Js.nodeType&&($o+=Js.nodeValue.length),null!==(Rr=Js.firstChild);)zr=Js,Js=Rr;for(;;){if(Js===Wt)break t;if(zr===gn&&++ds===yt&&(Hs=$o),zr===nr&&++sa===ti&&(po=$o),null!==(Rr=Js.nextSibling))break;zr=(Js=zr).parentNode}Js=Rr}gn=-1===Hs||-1===po?null:{start:Hs,end:po}}else gn=null;gn=gn||{start:0,end:0}}else gn=null;Ta={focusedElem:Wt,selectionRange:gn},Pl=!1,Mp=null,wh=!1,Cs=ye;do{try{M_()}catch(va){if(null===Cs)throw Error(c(330));Ff(Cs,va),Cs=Cs.nextEffect}}while(null!==Cs);Mp=null,Cs=ye;do{try{for(Wt=v;null!==Cs;){var Ur=Cs.flags;if(16&Ur&&cn(Cs.stateNode,""),128&Ur){var Fi=Cs.alternate;if(null!==Fi){var ro=Fi.ref;null!==ro&&("function"==typeof ro?ro(null):ro.current=null)}}switch(1038&Ur){case 2:Xd(Cs),Cs.flags&=-3;break;case 6:Xd(Cs),Cs.flags&=-3,Zf(Cs.alternate,Cs);break;case 1024:Cs.flags&=-1025;break;case 1028:Cs.flags&=-1025,Zf(Cs.alternate,Cs);break;case 4:Zf(Cs.alternate,Cs);break;case 8:n_(Wt,gn=Cs);var $a=gn.alternate;$_(gn),null!==$a&&$_($a)}Cs=Cs.nextEffect}}catch(va){if(null===Cs)throw Error(c(330));Ff(Cs,va),Cs=Cs.nextEffect}}while(null!==Cs);if(ro=Ta,Fi=yd(),Wt=ro.selectionRange,Fi!==(Ur=ro.focusedElem)&&Ur&&Ur.ownerDocument&&Gd(Ur.ownerDocument.documentElement,Ur)){for((null!==Wt&&Ed(Ur)&&(Fi=Wt.start,void 0===(ro=Wt.end)&&(ro=Fi),"selectionStart"in Ur?(Ur.selectionStart=Fi,Ur.selectionEnd=Math.min(ro,Ur.value.length)):(ro=(Fi=Ur.ownerDocument||document)&&Fi.defaultView||window).getSelection&&(ro=ro.getSelection(),gn=Ur.textContent.length,$a=Math.min(Wt.start,gn),Wt=void 0===Wt.end?$a:Math.min(Wt.end,gn),!ro.extend&&$a>Wt&&(gn=Wt,Wt=$a,$a=gn),gn=Eu(Ur,$a),yt=Eu(Ur,Wt),gn&&yt&&(1!==ro.rangeCount||ro.anchorNode!==gn.node||ro.anchorOffset!==gn.offset||ro.focusNode!==yt.node||ro.focusOffset!==yt.offset)&&((Fi=Fi.createRange()).setStart(gn.node,gn.offset),ro.removeAllRanges(),$a>Wt?(ro.addRange(Fi),ro.extend(yt.node,yt.offset)):(Fi.setEnd(yt.node,yt.offset),ro.addRange(Fi))))),Fi=[],ro=Ur);ro=ro.parentNode;)1===ro.nodeType&&Fi.push({element:ro,left:ro.scrollLeft,top:ro.scrollTop});for("function"==typeof Ur.focus&&Ur.focus(),Ur=0;Ur<Fi.length;Ur++)(ro=Fi[Ur]).element.scrollLeft=ro.left,ro.element.scrollTop=ro.top}Pl=!!Lo,Ta=Lo=null,v.current=B,Cs=ye;do{try{for(Ur=v;null!==Cs;){var ms=Cs.flags;if(36&ms&&yh(Ur,Cs.alternate,Cs),128&ms){Fi=void 0;var xa=Cs.ref;if(null!==xa)Fi=Cs.stateNode,"function"==typeof xa?xa(Fi):xa.current=Fi}Cs=Cs.nextEffect}}catch(va){if(null===Cs)throw Error(c(330));Ff(Cs,va),Cs=Cs.nextEffect}}while(null!==Cs);Cs=null,Jc(),da=He}else v.current=B;if(oc)oc=!1,Jf=v,Lf=D;else for(Cs=ye;null!==Cs;)D=Cs.nextEffect,Cs.nextEffect=null,8&Cs.flags&&((ms=Cs).sibling=null,ms.stateNode=null),Cs=D;if(0===(ye=v.pendingLanes)&&(pc=null),1===ye?v===Oh?tf++:(tf=0,Oh=v):tf=0,B=B.stateNode,Td&&"function"==typeof Td.onCommitFiberRoot)try{Td.onCommitFiberRoot(uc,B,void 0,64==(64&B.current.flags))}catch(va){}if(Dd(v,du()),zu)throw zu=!1,v=zp,zp=null,v;return 0!=(8&da)||Iu(),null}function M_(){for(;null!==Cs;){var v=Cs.alternate;wh||null===Mp||(0!=(8&Cs.flags)?vr(Cs,Mp)&&(wh=!0):13===Cs.tag&&Tp(v,Cs)&&vr(Cs,Mp)&&(wh=!0));var D=Cs.flags;0!=(256&D)&&Sp(v,Cs),0==(512&D)||oc||(oc=!0,Dc(97,function(){return Sf(),null})),Cs=Cs.nextEffect}}function Sf(){if(90!==Lf){var v=97<Lf?97:Lf;return Lf=90,ma(v,Kp)}return!1}function a_(v,D){Vp.push(D,v),oc||(oc=!0,Dc(97,function(){return Sf(),null}))}function tp(v,D){r_.push(D,v),oc||(oc=!0,Dc(97,function(){return Sf(),null}))}function Kp(){if(null===Jf)return!1;var v=Jf;if(Jf=null,0!=(48&da))throw Error(c(331));var D=da;da|=32;var B=r_;r_=[];for(var ye=0;ye<B.length;ye+=2){var He=B[ye],yt=B[ye+1],Wt=He.destroy;if(He.destroy=void 0,"function"==typeof Wt)try{Wt()}catch(nr){if(null===yt)throw Error(c(330));Ff(yt,nr)}}for(B=Vp,Vp=[],ye=0;ye<B.length;ye+=2){He=B[ye],yt=B[ye+1];try{var gn=He.create;He.destroy=gn()}catch(nr){if(null===yt)throw Error(c(330));Ff(yt,nr)}}for(gn=v.current.firstEffect;null!==gn;)v=gn.nextEffect,gn.nextEffect=null,8&gn.flags&&(gn.sibling=null,gn.stateNode=null),gn=v;return da=D,Iu(),!0}function l_(v,D,B){x(v,D=Vf(0,D=Xh(B,D),1)),D=zc(),null!==(v=Op(v,1))&&(vl(v,1,D),Dd(v,D))}function Ff(v,D){if(3===v.tag)l_(v,v,D);else for(var B=v.return;null!==B;){if(3===B.tag){l_(B,v,D);break}if(1===B.tag){var ye=B.stateNode;if("function"==typeof B.type.getDerivedStateFromError||"function"==typeof ye.componentDidCatch&&(null===pc||!pc.has(ye))){var He=qh(B,v=Xh(D,v),1);if(x(B,He),He=zc(),null!==(B=Op(B,1)))vl(B,1,He),Dd(B,He);else if("function"==typeof ye.componentDidCatch&&(null===pc||!pc.has(ye)))try{ye.componentDidCatch(D,v)}catch(yt){}break}}B=B.return}}function Rh(v,D,B){var ye=v.pingCache;null!==ye&&ye.delete(D),D=zc(),v.pingedLanes|=v.suspendedLanes&B,Rc===v&&(Ts&B)===B&&(4===ku||3===ku&&(62914560&Ts)===Ts&&500>du()-H_?Jp(v,0):Wf|=B),Dd(v,D)}function np(v,D){var B=v.stateNode;null!==B&&B.delete(D),0==(D=0)&&(0==(2&(D=v.mode))?D=1:0==(4&D)?D=99===Fl()?1:2:(0===fd&&(fd=Pf),0===(D=Ls(62914560&~fd))&&(D=4194304))),B=zc(),null!==(v=Op(v,D))&&(vl(v,D,B),Dd(v,B))}function gg(v,D,B,ye){this.tag=v,this.key=B,this.sibling=this.child=this.return=this.stateNode=this.type=this.elementType=null,this.index=0,this.ref=null,this.pendingProps=D,this.dependencies=this.memoizedState=this.updateQueue=this.memoizedProps=null,this.mode=ye,this.flags=0,this.lastEffect=this.firstEffect=this.nextEffect=null,this.childLanes=this.lanes=0,this.alternate=null}function pd(v,D,B,ye){return new gg(v,D,B,ye)}function u_(v){return!(!(v=v.prototype)||!v.isReactComponent)}function pp(v,D){var B=v.alternate;return null===B?((B=pd(v.tag,D,v.key,v.mode)).elementType=v.elementType,B.type=v.type,B.stateNode=v.stateNode,B.alternate=v,v.alternate=B):(B.pendingProps=D,B.type=v.type,B.flags=0,B.nextEffect=null,B.firstEffect=null,B.lastEffect=null),B.childLanes=v.childLanes,B.lanes=v.lanes,B.child=v.child,B.memoizedProps=v.memoizedProps,B.memoizedState=v.memoizedState,B.updateQueue=v.updateQueue,B.dependencies=null===(D=v.dependencies)?null:{lanes:D.lanes,firstContext:D.firstContext},B.sibling=v.sibling,B.index=v.index,B.ref=v.ref,B}function Nh(v,D,B,ye,He,yt){var Wt=2;if(ye=v,"function"==typeof v)u_(v)&&(Wt=1);else if("string"==typeof v)Wt=5;else e:switch(v){case ue:return Vc(B.children,He,yt,D);case Vt:Wt=8,He|=16;break;case st:Wt=8,He|=1;break;case We:return(v=pd(12,B,D,8|He)).elementType=We,v.type=We,v.lanes=yt,v;case je:return(v=pd(13,B,D,He)).type=je,v.elementType=je,v.lanes=yt,v;case Ne:return(v=pd(19,B,D,He)).elementType=Ne,v.lanes=yt,v;case hn:return ig(B,He,yt,D);case vn:return(v=pd(24,B,D,He)).elementType=vn,v.lanes=yt,v;default:if("object"==typeof v&&null!==v)switch(v.$$typeof){case Ve:Wt=10;break e;case Be:Wt=9;break e;case xe:Wt=11;break e;case Bt:Wt=14;break e;case rt:Wt=16,ye=null;break e;case en:Wt=22;break e}throw Error(c(130,null==v?v:typeof v,""))}return(D=pd(Wt,B,D,He)).elementType=v,D.type=ye,D.lanes=yt,D}function Vc(v,D,B,ye){return(v=pd(7,v,ye,D)).lanes=B,v}function ig(v,D,B,ye){return(v=pd(23,v,ye,D)).elementType=hn,v.lanes=B,v}function O_(v,D,B){return(v=pd(6,v,null,D)).lanes=B,v}function B_(v,D,B){return(D=pd(4,null!==v.children?v.children:[],v.key,D)).lanes=B,D.stateNode={containerInfo:v.containerInfo,pendingChildren:null,implementation:v.implementation},D}function P(v,D,B){this.tag=D,this.containerInfo=v,this.finishedWork=this.pingCache=this.current=this.pendingChildren=null,this.timeoutHandle=-1,this.pendingContext=this.context=null,this.hydrate=B,this.callbackNode=null,this.callbackPriority=0,this.eventTimes=Xs(0),this.expirationTimes=Xs(-1),this.entangledLanes=this.finishedLanes=this.mutableReadLanes=this.expiredLanes=this.pingedLanes=this.suspendedLanes=this.pendingLanes=0,this.entanglements=Xs(0),this.mutableSourceEagerHydrationData=null}function te(v,D,B){var ye=3<arguments.length&&void 0!==arguments[3]?arguments[3]:null;return{$$typeof:we,key:null==ye?null:""+ye,children:v,containerInfo:D,implementation:B}}function b(v,D,B,ye){var He=D.current,yt=zc(),Wt=Qf(He);e:if(B){t:{if(yo(B=B._reactInternals)!==B||1!==B.tag)throw Error(c(170));var gn=B;do{switch(gn.tag){case 3:gn=gn.stateNode.context;break t;case 1:if(Nu(gn.type)){gn=gn.stateNode.__reactInternalMemoizedMergedChildContext;break t}}gn=gn.return}while(null!==gn);throw Error(c(171))}if(1===B.tag){var nr=B.type;if(Nu(nr)){B=Of(B,nr,gn);break e}}B=gn}else B=Uu;return null===D.context?D.context=B:D.pendingContext=B,(D=E(yt,Wt)).payload={element:v},null!==(ye=void 0===ye?null:ye)&&(D.callback=ye),x(He,D),fp(He,Wt,yt),Wt}function G(v){return(v=v.current).child?v.child.stateNode:null}function Te(v,D){if(null!==(v=v.memoizedState)&&null!==v.dehydrated){var B=v.retryLane;v.retryLane=0!==B&&B<D?B:D}}function Ge(v,D){Te(v,D),(v=v.alternate)&&Te(v,D)}function fr(v,D,B){var ye=null!=B&&null!=B.hydrationOptions&&B.hydrationOptions.mutableSources||null;if(B=new P(v,D,null!=B&&!0===B.hydrate),D=pd(3,null,null,2===D?7:1===D?3:0),B.current=D,D.stateNode=B,fc(D),v[bd]=B.current,$e(8===v.nodeType?v.parentNode:v),ye)for(v=0;v<ye.length;v++){var He=(D=ye[v])._getVersion;He=He(D._source),null==B.mutableSourceEagerHydrationData?B.mutableSourceEagerHydrationData=[D,He]:B.mutableSourceEagerHydrationData.push(D,He)}this._internalRoot=B}function wr(v){return!(!v||1!==v.nodeType&&9!==v.nodeType&&11!==v.nodeType&&(8!==v.nodeType||" react-mount-point-unstable "!==v.nodeValue))}function oi(v,D,B,ye,He){var yt=B._reactRootContainer;if(yt){var Wt=yt._internalRoot;if("function"==typeof He){var gn=He;He=function(){var ti=G(Wt);gn.call(ti)}}b(D,Wt,v,He)}else{if(yt=B._reactRootContainer=function ci(v,D){if(D||(D=!(!(D=v?9===v.nodeType?v.documentElement:v.firstChild:null)||1!==D.nodeType||!D.hasAttribute("data-reactroot"))),!D)for(var B;B=v.lastChild;)v.removeChild(B);return new fr(v,0,D?{hydrate:!0}:void 0)}(B,ye),Wt=yt._internalRoot,"function"==typeof He){var nr=He;He=function(){var ti=G(Wt);nr.call(ti)}}Wp(function(){b(D,Wt,v,He)})}return G(Wt)}function ts(v,D){var B=2<arguments.length&&void 0!==arguments[2]?arguments[2]:null;if(!wr(D))throw Error(c(200));return te(v,D,null,B)}Xp=function(v,D,B){var ye=D.lanes;if(null!==v)if(v.memoizedProps!==D.pendingProps||Su.current)Ef=!0;else{if(0==(B&ye)){switch(Ef=!1,D.tag){case 3:tg(D),Tt();break;case 5:jl(D);break;case 1:Nu(D.type)&&Yc(D);break;case 4:ja(D,D.stateNode.containerInfo);break;case 10:ye=D.memoizedProps.value;var He=D.type._context;Ll(Sc,He._currentValue),He._currentValue=ye;break;case 13:if(null!==D.memoizedState)return 0!=(B&D.child.childLanes)?Wh(v,D,B):(Ll(Ga,1&Ga.current),null!==(D=Od(v,D,B))?D.sibling:null);Ll(Ga,1&Ga.current);break;case 19:if(ye=0!=(B&D.childLanes),0!=(64&v.flags)){if(ye)return yp(v,D,B);D.flags|=64}if(null!==(He=D.memoizedState)&&(He.rendering=null,He.tail=null,He.lastEffect=null),Ll(Ga,Ga.current),ye)break;return null;case 23:case 24:return D.lanes=0,v_(v,D,B)}return Od(v,D,B)}Ef=0!=(16384&v.flags)}else Ef=!1;switch(D.lanes=0,D.tag){case 2:if(ye=D.type,null!==v&&(v.alternate=null,D.alternate=null,D.flags|=2),v=D.pendingProps,He=yc(D,ll.current),Qc(D,B),He=ch(null,D,ye,v,He,B),D.flags|=1,"object"==typeof He&&null!==He&&"function"==typeof He.render&&void 0===He.$$typeof){if(D.tag=1,D.memoizedState=null,D.updateQueue=null,Nu(ye)){var yt=!0;Yc(D)}else yt=!1;D.memoizedState=null!=He.state?He.state:null,fc(D);var Wt=ye.getDerivedStateFromProps;"function"==typeof Wt&&Fe(D,ye,Wt,v),He.updater=Oe,D.stateNode=He,He._reactInternals=D,nn(D,ye,v,B),D=mh(null,D,ye,!0,yt,B)}else D.tag=0,Mu(null,D,He,B),D=D.child;return D;case 16:He=D.elementType;e:{switch(null!==v&&(v.alternate=null,D.alternate=null,D.flags|=2),v=D.pendingProps,He=(yt=He._init)(He._payload),D.type=He,yt=D.tag=function mg(v){if("function"==typeof v)return u_(v)?1:0;if(null!=v){if((v=v.$$typeof)===xe)return 11;if(v===Bt)return 14}return 2}(He),v=Jl(He,v),yt){case 0:D=Yp(null,D,He,v,B);break e;case 1:D=Zh(null,D,He,v,B);break e;case 11:D=Rf(null,D,He,v,B);break e;case 14:D=zh(null,D,He,Jl(He.type,v),ye,B);break e}throw Error(c(306,He,""))}return D;case 0:return He=D.pendingProps,Yp(v,D,ye=D.type,He=D.elementType===ye?He:Jl(ye,He),B);case 1:return He=D.pendingProps,Zh(v,D,ye=D.type,He=D.elementType===ye?He:Jl(ye,He),B);case 3:if(tg(D),ye=D.updateQueue,null===v||null===ye)throw Error(c(282));if(ye=D.pendingProps,He=null!==(He=D.memoizedState)?He.element:null,h(v,D),Q(D,ye,null,B),(ye=D.memoizedState.element)===He)Tt(),D=Od(v,D,B);else{if((yt=(He=D.stateNode).hydrate)&&(wc=Fa(D.stateNode.containerInfo.firstChild),Lu=D,yt=Cu=!0),yt){if(null!=(v=He.mutableSourceEagerHydrationData))for(He=0;He<v.length;He+=2)(yt=v[He])._workInProgressVersionPrimary=v[He+1],Xt.push(yt);for(B=is(D,null,ye,B),D.child=B;B;)B.flags=-3&B.flags|1024,B=B.sibling}else Mu(v,D,ye,B),Tt();D=D.child}return D;case 5:return jl(D),null===v&&K(D),yt=null!==v?v.memoizedProps:null,Wt=(He=D.pendingProps).children,ha(ye=D.type,He)?Wt=null:null!==yt&&ha(ye,yt)&&(D.flags|=16),gh(v,D),Mu(v,D,Wt,B),D.child;case 6:return null===v&&K(D),null;case 13:return Wh(v,D,B);case 4:return ja(D,D.stateNode.containerInfo),ye=D.pendingProps,null===v?D.child=$i(D,null,ye,B):Mu(v,D,ye,B),D.child;case 11:return He=D.pendingProps,Rf(v,D,ye=D.type,He=D.elementType===ye?He:Jl(ye,He),B);case 7:return Mu(v,D,D.pendingProps,B),D.child;case 8:case 12:return Mu(v,D,D.pendingProps.children,B),D.child;case 10:e:{ye=D.type._context,Wt=D.memoizedProps,yt=(He=D.pendingProps).value;var gn=D.type._context;if(Ll(Sc,gn._currentValue),gn._currentValue=yt,null!==Wt)if(0==(yt=Ks(gn=Wt.value,yt)?0:0|("function"==typeof ye._calculateChangedBits?ye._calculateChangedBits(gn,yt):1073741823))){if(Wt.children===He.children&&!Su.current){D=Od(v,D,B);break e}}else for(null!==(gn=D.child)&&(gn.return=D);null!==gn;){var nr=gn.dependencies;if(null!==nr){Wt=gn.child;for(var ti=nr.firstContext;null!==ti;){if(ti.context===ye&&0!=(ti.observedBits&yt)){1===gn.tag&&((ti=E(-1,B&-B)).tag=2,x(gn,ti)),gn.lanes|=B,null!==(ti=gn.alternate)&&(ti.lanes|=B),Zd(gn.return,B),nr.lanes|=B;break}ti=ti.next}}else Wt=10===gn.tag&&gn.type===D.type?null:gn.child;if(null!==Wt)Wt.return=gn;else for(Wt=gn;null!==Wt;){if(Wt===D){Wt=null;break}if(null!==(gn=Wt.sibling)){gn.return=Wt.return,Wt=gn;break}Wt=Wt.return}gn=Wt}Mu(v,D,He.children,B),D=D.child}return D;case 9:return He=D.type,ye=(yt=D.pendingProps).children,Qc(D,B),ye=ye(He=Rl(He,yt.unstable_observedBits)),D.flags|=1,Mu(v,D,ye,B),D.child;case 14:return yt=Jl(He=D.type,D.pendingProps),zh(v,D,He,yt=Jl(He.type,yt),ye,B);case 15:return Vh(v,D,D.type,D.pendingProps,ye,B);case 17:return He=D.pendingProps,He=D.elementType===(ye=D.type)?He:Jl(ye,He),null!==v&&(v.alternate=null,D.alternate=null,D.flags|=2),D.tag=1,Nu(ye)?(v=!0,Yc(D)):v=!1,Qc(D,B),ht(D,ye,He),nn(D,ye,He,B),mh(null,D,ye,!0,v,B);case 19:return yp(v,D,B);case 23:case 24:return v_(v,D,B)}throw Error(c(156,D.tag))},fr.prototype.render=function(v){b(v,this._internalRoot,null,null)},fr.prototype.unmount=function(){var v=this._internalRoot,D=v.containerInfo;b(null,v,null,function(){D[bd]=null})},yr=function(v){13===v.tag&&(fp(v,4,zc()),Ge(v,4))},or=function(v){13===v.tag&&(fp(v,67108864,zc()),Ge(v,67108864))},si=function(v){if(13===v.tag){var D=zc(),B=Qf(v);fp(v,B,D),Ge(v,B)}},pn=function(v,D){return D()},to=function(v,D,B){switch(D){case"input":if(Ro(v,B),D=B.name,"radio"===B.type&&null!=D){for(B=v;B.parentNode;)B=B.parentNode;for(B=B.querySelectorAll("input[name="+JSON.stringify(""+D)+'][type="radio"]'),D=0;D<B.length;D++){var ye=B[D];if(ye!==v&&ye.form===v.form){var He=Il(ye);if(!He)throw Error(c(90));dr(ye),Ro(ye,He)}}}break;case"textarea":Zi(v,B);break;case"select":null!=(D=B.value)&&Jn(v,!!B.multiple,D,!1)}},pt=Ap,kt=function(v,D,B,ye,He){var yt=da;da|=4;try{return ma(98,v.bind(null,D,B,ye,He))}finally{0===(da=yt)&&(If(),Iu())}},dn=function(){0==(49&da)&&(function o_(){if(null!==ef){var v=ef;ef=null,v.forEach(function(D){D.expiredLanes|=24&D.pendingLanes,Dd(D,du())})}Iu()}(),Sf())},mr=function(v,D){var B=da;da|=2;try{return v(D)}finally{0===(da=B)&&(If(),Iu())}};var Do={Events:[Ma,al,Il,Rt,ct,Sf,{current:!1}]},Ss={findFiberByHostInstance:lu,bundleType:0,version:"17.0.2",rendererPackageName:"react-dom"},Yo={bundleType:Ss.bundleType,version:Ss.version,rendererPackageName:Ss.rendererPackageName,rendererConfig:Ss.rendererConfig,overrideHookState:null,overrideHookStateDeletePath:null,overrideHookStateRenamePath:null,overrideProps:null,overridePropsDeletePath:null,overridePropsRenamePath:null,setSuspenseHandler:null,scheduleUpdate:null,currentDispatcherRef:he.ReactCurrentDispatcher,findHostInstanceByFiber:function(v){return null===(v=er(v))?null:v.stateNode},findFiberByHostInstance:Ss.findFiberByHostInstance||function an(){return null},findHostInstancesForRefresh:null,scheduleRefresh:null,scheduleRoot:null,setRefreshHandler:null,getCurrentFiber:null};if("undefined"!=typeof __REACT_DEVTOOLS_GLOBAL_HOOK__){var ia=__REACT_DEVTOOLS_GLOBAL_HOOK__;if(!ia.isDisabled&&ia.supportsFiber)try{uc=ia.inject(Yo),Td=ia}catch(v){}}S.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED=Do,S.createPortal=ts,S.findDOMNode=function(v){if(null==v)return null;if(1===v.nodeType)return v;var D=v._reactInternals;if(void 0===D)throw"function"==typeof v.render?Error(c(188)):Error(c(268,Object.keys(v)));return null===(v=er(D))?null:v.stateNode},S.flushSync=function(v,D){var B=da;if(0!=(48&B))return v(D);da|=1;try{if(v)return ma(99,v.bind(null,D))}finally{da=B,Iu()}},S.hydrate=function(v,D,B){if(!wr(D))throw Error(c(200));return oi(null,v,D,!0,B)},S.render=function(v,D,B){if(!wr(D))throw Error(c(200));return oi(null,v,D,!1,B)},S.unmountComponentAtNode=function(v){if(!wr(v))throw Error(c(40));return!!v._reactRootContainer&&(Wp(function(){oi(null,null,v,!1,function(){v._reactRootContainer=null,v[bd]=null})}),!0)},S.unstable_batchedUpdates=Ap,S.unstable_createPortal=function(v,D){return ts(v,D,2<arguments.length&&void 0!==arguments[2]?arguments[2]:null)},S.unstable_renderSubtreeIntoContainer=function(v,D,B,ye){if(!wr(B))throw Error(c(200));if(null==v||void 0===v._reactInternals)throw Error(c(38));return oi(v,D,B,!1,ye)},S.version="17.0.2"},88768:(m,S,i)=>{"use strict";(function r(){if("undefined"!=typeof __REACT_DEVTOOLS_GLOBAL_HOOK__&&"function"==typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE)try{__REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE(r)}catch(a){console.error(a)}})(),m.exports=i(85503)},14395:(m,S,i)=>{"use strict";var f,r=i(16482),a="<<anonymous>>",c=function(){invariant(!1,"ImmutablePropTypes type checking code is stripped in production.")};c.isRequired=c;var e=function(){return c};function C(ue,st){return function T(ue,st){return function y(ue){function st(Ve,Be,xe,je,Ne,Bt){for(var rt=arguments.length,en=Array(rt>6?rt-6:0),Pt=6;Pt<rt;Pt++)en[Pt-6]=arguments[Pt];return Bt=Bt||xe,je=je||a,null!=Be[xe]?ue.apply(void 0,[Be,xe,je,Ne,Bt].concat(en)):Ve?new Error("Required "+Ne+" `"+Bt+"` was not specified in `"+je+"`."):void 0}var We=st.bind(null,!1);return We.isRequired=st.bind(null,!0),We}(function We(Ve,Be,xe,je,Ne){var Bt=Ve[Be];if(!st(Bt)){var rt=function p(ue){var st=typeof ue;return Array.isArray(ue)?"array":ue instanceof RegExp?"object":ue instanceof r.Iterable?"Immutable."+ue.toSource().split(" ")[0]:st}(Bt);return new Error("Invalid "+je+" `"+Ne+"` of type `"+rt+"` supplied to `"+xe+"`, expected `"+ue+"`.")}return null})}("Iterable."+ue,function(We){return r.Iterable.isIterable(We)&&st(We)})}(f={listOf:e,mapOf:e,orderedMapOf:e,setOf:e,orderedSetOf:e,stackOf:e,iterableOf:e,recordOf:e,shape:e,contains:e,mapContains:e,orderedMapContains:e,list:c,map:c,orderedMap:c,set:c,orderedSet:c,stack:c,seq:c,record:c,iterable:c}).iterable.indexed=C("Indexed",r.Iterable.isIndexed),f.iterable.keyed=C("Keyed",r.Iterable.isKeyed),m.exports=f},6249:(m,S)=>{"use strict";var i="function"==typeof Symbol&&Symbol.for,r=i?Symbol.for("react.element"):60103,a=i?Symbol.for("react.portal"):60106,f=i?Symbol.for("react.fragment"):60107,c=i?Symbol.for("react.strict_mode"):60108,e=i?Symbol.for("react.profiler"):60114,p=i?Symbol.for("react.provider"):60109,y=i?Symbol.for("react.context"):60110,T=i?Symbol.for("react.async_mode"):60111,C=i?Symbol.for("react.concurrent_mode"):60111,R=i?Symbol.for("react.forward_ref"):60112,L=i?Symbol.for("react.suspense"):60113,z=i?Symbol.for("react.suspense_list"):60120,W=i?Symbol.for("react.memo"):60115,J=i?Symbol.for("react.lazy"):60116,ee=i?Symbol.for("react.block"):60121,ce=i?Symbol.for("react.fundamental"):60117,ie=i?Symbol.for("react.responder"):60118,U=i?Symbol.for("react.scope"):60119;function se(ae){if("object"==typeof ae&&null!==ae){var he=ae.$$typeof;switch(he){case r:switch(ae=ae.type){case T:case C:case f:case e:case c:case L:return ae;default:switch(ae=ae&&ae.$$typeof){case y:case R:case J:case W:case p:return ae;default:return he}}case a:return he}}}function ge(ae){return se(ae)===C}S.AsyncMode=T,S.ConcurrentMode=C,S.ContextConsumer=y,S.ContextProvider=p,S.Element=r,S.ForwardRef=R,S.Fragment=f,S.Lazy=J,S.Memo=W,S.Portal=a,S.Profiler=e,S.StrictMode=c,S.Suspense=L,S.isAsyncMode=function(ae){return ge(ae)||se(ae)===T},S.isConcurrentMode=ge,S.isContextConsumer=function(ae){return se(ae)===y},S.isContextProvider=function(ae){return se(ae)===p},S.isElement=function(ae){return"object"==typeof ae&&null!==ae&&ae.$$typeof===r},S.isForwardRef=function(ae){return se(ae)===R},S.isFragment=function(ae){return se(ae)===f},S.isLazy=function(ae){return se(ae)===J},S.isMemo=function(ae){return se(ae)===W},S.isPortal=function(ae){return se(ae)===a},S.isProfiler=function(ae){return se(ae)===e},S.isStrictMode=function(ae){return se(ae)===c},S.isSuspense=function(ae){return se(ae)===L},S.isValidElementType=function(ae){return"string"==typeof ae||"function"==typeof ae||ae===f||ae===C||ae===e||ae===c||ae===L||ae===z||"object"==typeof ae&&null!==ae&&(ae.$$typeof===J||ae.$$typeof===W||ae.$$typeof===p||ae.$$typeof===y||ae.$$typeof===R||ae.$$typeof===ce||ae.$$typeof===ie||ae.$$typeof===U||ae.$$typeof===ee)},S.typeOf=se},38308:(m,S,i)=>{"use strict";m.exports=i(6249)},1422:(m,S)=>{"use strict";var r=60103,a=60106,f=60107,c=60108,e=60114,p=60109,y=60110,T=60112,C=60113,R=60120,L=60115,z=60116;if("function"==typeof Symbol&&Symbol.for){var U=Symbol.for;r=U("react.element"),a=U("react.portal"),f=U("react.fragment"),c=U("react.strict_mode"),e=U("react.profiler"),p=U("react.provider"),y=U("react.context"),T=U("react.forward_ref"),C=U("react.suspense"),R=U("react.suspense_list"),L=U("react.memo"),z=U("react.lazy"),U("react.block"),U("react.server.block"),U("react.fundamental"),U("react.debug_trace_mode"),U("react.legacy_hidden")}S.isContextConsumer=function(xe){return function se(xe){if("object"==typeof xe&&null!==xe){var je=xe.$$typeof;switch(je){case r:switch(xe=xe.type){case f:case e:case c:case C:case R:return xe;default:switch(xe=xe&&xe.$$typeof){case y:case T:case z:case L:case p:return xe;default:return je}}case a:return je}}}(xe)===y}},56261:(m,S,i)=>{"use strict";m.exports=i(1422)},55429:(m,S,i)=>{"use strict";var r=i(18228),a=60103,f=60106;S.Fragment=60107,S.StrictMode=60108,S.Profiler=60114;var c=60109,e=60110,p=60112;S.Suspense=60113;var y=60115,T=60116;if("function"==typeof Symbol&&Symbol.for){var C=Symbol.for;a=C("react.element"),f=C("react.portal"),S.Fragment=C("react.fragment"),S.StrictMode=C("react.strict_mode"),S.Profiler=C("react.profiler"),c=C("react.provider"),e=C("react.context"),p=C("react.forward_ref"),S.Suspense=C("react.suspense"),y=C("react.memo"),T=C("react.lazy")}var R="function"==typeof Symbol&&Symbol.iterator;function z(rt){for(var en="https://reactjs.org/docs/error-decoder.html?invariant="+rt,Pt=1;Pt<arguments.length;Pt++)en+="&args[]="+encodeURIComponent(arguments[Pt]);return"Minified React error #"+rt+"; visit "+en+" for the full message or use the non-minified dev environment for full errors and additional helpful warnings."}var W={isMounted:function(){return!1},enqueueForceUpdate:function(){},enqueueReplaceState:function(){},enqueueSetState:function(){}},J={};function ee(rt,en,Pt){this.props=rt,this.context=en,this.refs=J,this.updater=Pt||W}function ce(){}function ie(rt,en,Pt){this.props=rt,this.context=en,this.refs=J,this.updater=Pt||W}ee.prototype.isReactComponent={},ee.prototype.setState=function(rt,en){if("object"!=typeof rt&&"function"!=typeof rt&&null!=rt)throw Error(z(85));this.updater.enqueueSetState(this,rt,en,"setState")},ee.prototype.forceUpdate=function(rt){this.updater.enqueueForceUpdate(this,rt,"forceUpdate")},ce.prototype=ee.prototype;var U=ie.prototype=new ce;U.constructor=ie,r(U,ee.prototype),U.isPureReactComponent=!0;var se={current:null},ge=Object.prototype.hasOwnProperty,ae={key:!0,ref:!0,__self:!0,__source:!0};function he(rt,en,Pt){var Vt,hn={},vn=null,mt=null;if(null!=en)for(Vt in void 0!==en.ref&&(mt=en.ref),void 0!==en.key&&(vn=""+en.key),en)ge.call(en,Vt)&&!ae.hasOwnProperty(Vt)&&(hn[Vt]=en[Vt]);var Nt=arguments.length-2;if(1===Nt)hn.children=Pt;else if(1<Nt){for(var St=Array(Nt),Yt=0;Yt<Nt;Yt++)St[Yt]=arguments[Yt+2];hn.children=St}if(rt&&rt.defaultProps)for(Vt in Nt=rt.defaultProps)void 0===hn[Vt]&&(hn[Vt]=Nt[Vt]);return{$$typeof:a,type:rt,key:vn,ref:mt,props:hn,_owner:se.current}}function we(rt){return"object"==typeof rt&&null!==rt&&rt.$$typeof===a}var st=/\/+/g;function We(rt,en){return"object"==typeof rt&&null!==rt&&null!=rt.key?function ue(rt){var en={"=":"=0",":":"=2"};return"$"+rt.replace(/[=:]/g,function(Pt){return en[Pt]})}(""+rt.key):en.toString(36)}function Ve(rt,en,Pt,Vt,hn){var vn=typeof rt;("undefined"===vn||"boolean"===vn)&&(rt=null);var mt=!1;if(null===rt)mt=!0;else switch(vn){case"string":case"number":mt=!0;break;case"object":switch(rt.$$typeof){case a:case f:mt=!0}}if(mt)return hn=hn(mt=rt),rt=""===Vt?"."+We(mt,0):Vt,Array.isArray(hn)?(Pt="",null!=rt&&(Pt=rt.replace(st,"$&/")+"/"),Ve(hn,en,Pt,"",function(Yt){return Yt})):null!=hn&&(we(hn)&&(hn=function be(rt,en){return{$$typeof:a,type:rt.type,key:en,ref:rt.ref,props:rt.props,_owner:rt._owner}}(hn,Pt+(!hn.key||mt&&mt.key===hn.key?"":(""+hn.key).replace(st,"$&/")+"/")+rt)),en.push(hn)),1;if(mt=0,Vt=""===Vt?".":Vt+":",Array.isArray(rt))for(var Nt=0;Nt<rt.length;Nt++){var St=Vt+We(vn=rt[Nt],Nt);mt+=Ve(vn,en,Pt,St,hn)}else if(St=function L(rt){return null===rt||"object"!=typeof rt?null:"function"==typeof(rt=R&&rt[R]||rt["@@iterator"])?rt:null}(rt),"function"==typeof St)for(rt=St.call(rt),Nt=0;!(vn=rt.next()).done;)mt+=Ve(vn=vn.value,en,Pt,St=Vt+We(vn,Nt++),hn);else if("object"===vn)throw en=""+rt,Error(z(31,"[object Object]"===en?"object with keys {"+Object.keys(rt).join(", ")+"}":en));return mt}function Be(rt,en,Pt){if(null==rt)return rt;var Vt=[],hn=0;return Ve(rt,Vt,"","",function(vn){return en.call(Pt,vn,hn++)}),Vt}function xe(rt){if(-1===rt._status){var en=rt._result;en=en(),rt._status=0,rt._result=en,en.then(function(Pt){0===rt._status&&(Pt=Pt.default,rt._status=1,rt._result=Pt)},function(Pt){0===rt._status&&(rt._status=2,rt._result=Pt)})}if(1===rt._status)return rt._result;throw rt._result}var je={current:null};function Ne(){var rt=je.current;if(null===rt)throw Error(z(321));return rt}var Bt={ReactCurrentDispatcher:je,ReactCurrentBatchConfig:{transition:0},ReactCurrentOwner:se,IsSomeRendererActing:{current:!1},assign:r};S.Children={map:Be,forEach:function(rt,en,Pt){Be(rt,function(){en.apply(this,arguments)},Pt)},count:function(rt){var en=0;return Be(rt,function(){en++}),en},toArray:function(rt){return Be(rt,function(en){return en})||[]},only:function(rt){if(!we(rt))throw Error(z(143));return rt}},S.Component=ee,S.PureComponent=ie,S.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED=Bt,S.cloneElement=function(rt,en,Pt){if(null==rt)throw Error(z(267,rt));var Vt=r({},rt.props),hn=rt.key,vn=rt.ref,mt=rt._owner;if(null!=en){if(void 0!==en.ref&&(vn=en.ref,mt=se.current),void 0!==en.key&&(hn=""+en.key),rt.type&&rt.type.defaultProps)var Nt=rt.type.defaultProps;for(St in en)ge.call(en,St)&&!ae.hasOwnProperty(St)&&(Vt[St]=void 0===en[St]&&void 0!==Nt?Nt[St]:en[St])}var St=arguments.length-2;if(1===St)Vt.children=Pt;else if(1<St){Nt=Array(St);for(var Yt=0;Yt<St;Yt++)Nt[Yt]=arguments[Yt+2];Vt.children=Nt}return{$$typeof:a,type:rt.type,key:hn,ref:vn,props:Vt,_owner:mt}},S.createContext=function(rt,en){return void 0===en&&(en=null),(rt={$$typeof:e,_calculateChangedBits:en,_currentValue:rt,_currentValue2:rt,_threadCount:0,Provider:null,Consumer:null}).Provider={$$typeof:c,_context:rt},rt.Consumer=rt},S.createElement=he,S.createFactory=function(rt){var en=he.bind(null,rt);return en.type=rt,en},S.createRef=function(){return{current:null}},S.forwardRef=function(rt){return{$$typeof:p,render:rt}},S.isValidElement=we,S.lazy=function(rt){return{$$typeof:T,_payload:{_status:-1,_result:rt},_init:xe}},S.memo=function(rt,en){return{$$typeof:y,type:rt,compare:void 0===en?null:en}},S.useCallback=function(rt,en){return Ne().useCallback(rt,en)},S.useContext=function(rt,en){return Ne().useContext(rt,en)},S.useDebugValue=function(){},S.useEffect=function(rt,en){return Ne().useEffect(rt,en)},S.useImperativeHandle=function(rt,en,Pt){return Ne().useImperativeHandle(rt,en,Pt)},S.useLayoutEffect=function(rt,en){return Ne().useLayoutEffect(rt,en)},S.useMemo=function(rt,en){return Ne().useMemo(rt,en)},S.useReducer=function(rt,en,Pt){return Ne().useReducer(rt,en,Pt)},S.useRef=function(rt){return Ne().useRef(rt)},S.useState=function(rt){return Ne().useState(rt)},S.version="17.0.2"},78139:(m,S,i)=>{"use strict";m.exports=i(55429)},59882:(m,S,i)=>{"use strict";Object.defineProperty(S,"__esModule",{value:!0});var a=function c(e){return e&&e.__esModule?e:{default:e}}(i(16482)),f=i(11715);S.default=function(e){var p=arguments.length>1&&void 0!==arguments[1]?arguments[1]:a.default.Map,y=Object.keys(e);return function(){var T=arguments.length>0&&void 0!==arguments[0]?arguments[0]:p(),C=arguments[1];return T.withMutations(function(L){y.forEach(function(z){var ee=(0,e[z])(L.get(z),C);(0,f.validateNextState)(ee,z,C),L.set(z,ee)})})}},m.exports=S.default},31208:(m,S,i)=>{"use strict";S.U=void 0;var f=function c(e){return e&&e.__esModule?e:{default:e}}(i(59882));S.U=f.default},46944:(m,S)=>{"use strict";Object.defineProperty(S,"__esModule",{value:!0}),S.default=function(i){return i&&"@@redux/INIT"===i.type?"initialState argument passed to createStore":"previous state received by the reducer"},m.exports=S.default},99319:(m,S,i)=>{"use strict";Object.defineProperty(S,"__esModule",{value:!0});var a=e(i(16482)),c=e(i(46944));function e(p){return p&&p.__esModule?p:{default:p}}S.default=function(p,y,T){var C=Object.keys(y);if(!C.length)return"Store does not have a valid reducer. Make sure the argument passed to combineReducers is an object whose values are reducers.";var R=(0,c.default)(T);if(a.default.isImmutable?!a.default.isImmutable(p):!a.default.Iterable.isIterable(p))return"The "+R+' is of unexpected type. Expected argument to be an instance of Immutable.Collection or Immutable.Record with the following properties: "'+C.join('", "')+'".';var L=p.toSeq().keySeq().toArray().filter(function(z){return!y.hasOwnProperty(z)});return L.length>0?"Unexpected "+(1===L.length?"property":"properties")+' "'+L.join('", "')+'" found in '+R+'. Expected to find one of the known reducer property names instead: "'+C.join('", "')+'". Unexpected properties will be ignored.':null},m.exports=S.default},11715:(m,S,i)=>{"use strict";Object.defineProperty(S,"__esModule",{value:!0}),S.validateNextState=S.getUnexpectedInvocationParameterMessage=S.getStateName=void 0;var a=y(i(46944)),c=y(i(99319)),p=y(i(95159));function y(T){return T&&T.__esModule?T:{default:T}}S.getStateName=a.default,S.getUnexpectedInvocationParameterMessage=c.default,S.validateNextState=p.default},95159:(m,S)=>{"use strict";Object.defineProperty(S,"__esModule",{value:!0}),S.default=function(i,r,a){if(void 0===i)throw new Error('Reducer "'+r+'" returned undefined when handling "'+a.type+'" action. To ignore an action, you must explicitly return the previous state.')},m.exports=S.default},88280:m=>{"use strict";var i,S="";m.exports=function r(a,f){if("string"!=typeof a)throw new TypeError("expected a string");if(1===f)return a;if(2===f)return a+a;var c=a.length*f;if(i!==a||void 0===i)i=a,S="";else if(S.length>=c)return S.substr(0,c);for(;c>S.length&&f>1;)1&f&&(S+=a),f>>=1,a+=a;return S=(S+=a).substr(0,c)}},90465:m=>{"use strict";m.exports=function(i,r){if(r=r.split(":")[0],!(i=+i))return!1;switch(r){case"http":case"ws":return 80!==i;case"https":case"wss":return 443!==i;case"ftp":return 21!==i;case"gopher":return 70!==i;case"file":return!1}return 0!==i}},66952:(m,S,i)=>{const r=i(18514),a=i(29394),f=i(87931),c=i(45899);m.exports=e=>{var y,T,p=0,C={type:a.ROOT,stack:[]},R=C,L=C.stack,z=[],W=he=>{r.error(e,"Nothing to repeat at column "+(he-1))},J=r.strToChars(e);for(y=J.length;p<y;)switch(T=J[p++],T){case"\\":switch(T=J[p++]){case"b":L.push(c.wordBoundary());break;case"B":L.push(c.nonWordBoundary());break;case"w":L.push(f.words());break;case"W":L.push(f.notWords());break;case"d":L.push(f.ints());break;case"D":L.push(f.notInts());break;case"s":L.push(f.whitespace());break;case"S":L.push(f.notWhitespace());break;default:/\d/.test(T)?L.push({type:a.REFERENCE,value:parseInt(T,10)}):L.push({type:a.CHAR,value:T.charCodeAt(0)})}break;case"^":L.push(c.begin());break;case"$":L.push(c.end());break;case"[":var ee;"^"===J[p]?(ee=!0,p++):ee=!1;var ce=r.tokenizeClass(J.slice(p),e);p+=ce[1],L.push({type:a.SET,set:ce[0],not:ee});break;case".":L.push(f.anyChar());break;case"(":var ie={type:a.GROUP,stack:[],remember:!0};"?"===(T=J[p])&&(T=J[p+1],p+=2,"="===T?ie.followedBy=!0:"!"===T?ie.notFollowedBy=!0:":"!==T&&r.error(e,`Invalid group, character '${T}' after '?' at column ${p-1}`),ie.remember=!1),L.push(ie),z.push(R),R=ie,L=ie.stack;break;case")":0===z.length&&r.error(e,"Unmatched ) at column "+(p-1)),L=(R=z.pop()).options?R.options[R.options.length-1]:R.stack;break;case"|":R.options||(R.options=[R.stack],delete R.stack);var U=[];R.options.push(U),L=U;break;case"{":var ge,ae,se=/^(\d+)(,(\d+)?)?\}/.exec(J.slice(p));null!==se?(0===L.length&&W(p),ge=parseInt(se[1],10),ae=se[2]?se[3]?parseInt(se[3],10):1/0:ge,p+=se[0].length,L.push({type:a.REPETITION,min:ge,max:ae,value:L.pop()})):L.push({type:a.CHAR,value:123});break;case"?":0===L.length&&W(p),L.push({type:a.REPETITION,min:0,max:1,value:L.pop()});break;case"+":0===L.length&&W(p),L.push({type:a.REPETITION,min:1,max:1/0,value:L.pop()});break;case"*":0===L.length&&W(p),L.push({type:a.REPETITION,min:0,max:1/0,value:L.pop()});break;default:L.push({type:a.CHAR,value:T.charCodeAt(0)})}return 0!==z.length&&r.error(e,"Unterminated group"),C},m.exports.types=a},45899:(m,S,i)=>{const r=i(29394);S.wordBoundary=()=>({type:r.POSITION,value:"b"}),S.nonWordBoundary=()=>({type:r.POSITION,value:"B"}),S.begin=()=>({type:r.POSITION,value:"^"}),S.end=()=>({type:r.POSITION,value:"$"})},87931:(m,S,i)=>{const r=i(29394),a=()=>[{type:r.RANGE,from:48,to:57}],f=()=>[{type:r.CHAR,value:95},{type:r.RANGE,from:97,to:122},{type:r.RANGE,from:65,to:90}].concat(a()),c=()=>[{type:r.CHAR,value:9},{type:r.CHAR,value:10},{type:r.CHAR,value:11},{type:r.CHAR,value:12},{type:r.CHAR,value:13},{type:r.CHAR,value:32},{type:r.CHAR,value:160},{type:r.CHAR,value:5760},{type:r.RANGE,from:8192,to:8202},{type:r.CHAR,value:8232},{type:r.CHAR,value:8233},{type:r.CHAR,value:8239},{type:r.CHAR,value:8287},{type:r.CHAR,value:12288},{type:r.CHAR,value:65279}];S.words=()=>({type:r.SET,set:f(),not:!1}),S.notWords=()=>({type:r.SET,set:f(),not:!0}),S.ints=()=>({type:r.SET,set:a(),not:!1}),S.notInts=()=>({type:r.SET,set:a(),not:!0}),S.whitespace=()=>({type:r.SET,set:c(),not:!1}),S.notWhitespace=()=>({type:r.SET,set:c(),not:!0}),S.anyChar=()=>({type:r.SET,set:[{type:r.CHAR,value:10},{type:r.CHAR,value:13},{type:r.CHAR,value:8232},{type:r.CHAR,value:8233}],not:!0})},29394:m=>{m.exports={ROOT:0,GROUP:1,POSITION:2,SET:3,RANGE:4,REPETITION:5,REFERENCE:6,CHAR:7}},18514:(m,S,i)=>{const r=i(29394),a=i(87931),c={0:0,t:9,n:10,v:11,f:12,r:13};S.strToChars=function(e){return e.replace(/(\[\\b\])|(\\)?\\(?:u([A-F0-9]{4})|x([A-F0-9]{2})|(0?[0-7]{2})|c([@A-Z[\\\]^?])|([0tnvfr]))/g,function(y,T,C,R,L,z,W,J){if(C)return y;var ee=T?8:R?parseInt(R,16):L?parseInt(L,16):z?parseInt(z,8):W?"@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^ ?".indexOf(W):c[J],ce=String.fromCharCode(ee);return/[[\]{}^$.|?*+()]/.test(ce)&&(ce="\\"+ce),ce})},S.tokenizeClass=(e,p)=>{for(var C,R,y=[],T=/\\(?:(w)|(d)|(s)|(W)|(D)|(S))|((?:(?:\\)(.)|([^\]\\]))-(?:\\)?([^\]]))|(\])|(?:\\)?([^])/g;null!=(C=T.exec(e));)if(C[1])y.push(a.words());else if(C[2])y.push(a.ints());else if(C[3])y.push(a.whitespace());else if(C[4])y.push(a.notWords());else if(C[5])y.push(a.notInts());else if(C[6])y.push(a.notWhitespace());else if(C[7])y.push({type:r.RANGE,from:(C[8]||C[9]).charCodeAt(0),to:C[10].charCodeAt(0)});else{if(!(R=C[12]))return[y,T.lastIndex];y.push({type:r.CHAR,value:R.charCodeAt(0)})}S.error(p,"Unterminated character class")},S.error=(e,p)=>{throw new SyntaxError("Invalid regular expression: /"+e+"/: "+p)}},26215:(m,S,i)=>{"use strict";i.d(S,{X:()=>f});var r=i(79765),a=i(77971);class f extends r.xQ{constructor(e){super(),this._value=e}get value(){return this.getValue()}_subscribe(e){const p=super._subscribe(e);return p&&!p.closed&&e.next(this._value),p}getValue(){if(this.hasError)throw this.thrownError;if(this.closed)throw new a.N;return this._value}next(e){super.next(this._value=e)}}},23098:(m,S,i)=>{"use strict";i.d(S,{P:()=>e});var r=i(59193),a=i(25917),f=i(40205);class e{constructor(y,T,C){this.kind=y,this.value=T,this.error=C,this.hasValue="N"===y}observe(y){switch(this.kind){case"N":return y.next&&y.next(this.value);case"E":return y.error&&y.error(this.error);case"C":return y.complete&&y.complete()}}do(y,T,C){switch(this.kind){case"N":return y&&y(this.value);case"E":return T&&T(this.error);case"C":return C&&C()}}accept(y,T,C){return y&&"function"==typeof y.next?this.observe(y):this.do(y,T,C)}toObservable(){switch(this.kind){case"N":return(0,a.of)(this.value);case"E":return(0,f._)(this.error);case"C":return(0,r.c)()}throw new Error("unexpected notification kind value")}static createNext(y){return void 0!==y?new e("N",y):e.undefinedValueNotification}static createError(y){return new e("E",void 0,y)}static createComplete(){return e.completeNotification}}e.completeNotification=new e("C"),e.undefinedValueNotification=new e("N",void 0)},70882:(m,S,i)=>{"use strict";i.d(S,{y:()=>C});var r=i(77393),f=i(29181),c=i(46490),p=i(16554),y=i(34022),T=i(82494);let C=(()=>{class L{constructor(W){this._isScalar=!1,W&&(this._subscribe=W)}lift(W){const J=new L;return J.source=this,J.operator=W,J}subscribe(W,J,ee){const{operator:ce}=this,ie=function e(L,z,W){if(L){if(L instanceof r.L)return L;if(L[f.b])return L[f.b]()}return L||z||W?new r.L(L,z,W):new r.L(c.c)}(W,J,ee);if(ie.add(ce?ce.call(ie,this.source):this.source||T.v.useDeprecatedSynchronousErrorHandling&&!ie.syncErrorThrowable?this._subscribe(ie):this._trySubscribe(ie)),T.v.useDeprecatedSynchronousErrorHandling&&ie.syncErrorThrowable&&(ie.syncErrorThrowable=!1,ie.syncErrorThrown))throw ie.syncErrorValue;return ie}_trySubscribe(W){try{return this._subscribe(W)}catch(J){T.v.useDeprecatedSynchronousErrorHandling&&(W.syncErrorThrown=!0,W.syncErrorValue=J),function a(L){for(;L;){const{closed:z,destination:W,isStopped:J}=L;if(z||J)return!1;L=W&&W instanceof r.L?W:null}return!0}(W)?W.error(J):console.warn(J)}}forEach(W,J){return new(J=R(J))((ee,ce)=>{let ie;ie=this.subscribe(U=>{try{W(U)}catch(se){ce(se),ie&&ie.unsubscribe()}},ce,ee)})}_subscribe(W){const{source:J}=this;return J&&J.subscribe(W)}[p.L](){return this}pipe(...W){return 0===W.length?this:(0,y.U)(W)(this)}toPromise(W){return new(W=R(W))((J,ee)=>{let ce;this.subscribe(ie=>ce=ie,ie=>ee(ie),()=>J(ce))})}}return L.create=z=>new L(z),L})();function R(L){if(L||(L=T.v.Promise||Promise),!L)throw new Error("no Promise impl found");return L}},46490:(m,S,i)=>{"use strict";i.d(S,{c:()=>f});var r=i(82494),a=i(54449);const f={closed:!0,next(c){},error(c){if(r.v.useDeprecatedSynchronousErrorHandling)throw c;(0,a.z)(c)},complete(){}}},55197:(m,S,i)=>{"use strict";i.d(S,{L:()=>a});var r=i(77393);class a extends r.L{notifyNext(c,e,p,y,T){this.destination.next(e)}notifyError(c,e){this.destination.error(c)}notifyComplete(c){this.destination.complete()}}},7357:(m,S,i)=>{"use strict";i.d(S,{t:()=>z});var r=i(79765),a=i(23989),c=i(46493);const y=new class e extends c.v{}(class f extends a.o{constructor(ee,ce){super(ee,ce),this.scheduler=ee,this.work=ce}schedule(ee,ce=0){return ce>0?super.schedule(ee,ce):(this.delay=ce,this.state=ee,this.scheduler.flush(this),this)}execute(ee,ce){return ce>0||this.closed?super.execute(ee,ce):this._execute(ee,ce)}requestAsyncId(ee,ce,ie=0){return null!==ie&&ie>0||null===ie&&this.delay>0?super.requestAsyncId(ee,ce,ie):ee.flush(this)}});var T=i(13464),C=i(59746),R=i(77971),L=i(78858);class z extends r.xQ{constructor(ee=Number.POSITIVE_INFINITY,ce=Number.POSITIVE_INFINITY,ie){super(),this.scheduler=ie,this._events=[],this._infiniteTimeWindow=!1,this._bufferSize=ee<1?1:ee,this._windowTime=ce<1?1:ce,ce===Number.POSITIVE_INFINITY?(this._infiniteTimeWindow=!0,this.next=this.nextInfiniteTimeWindow):this.next=this.nextTimeWindow}nextInfiniteTimeWindow(ee){if(!this.isStopped){const ce=this._events;ce.push(ee),ce.length>this._bufferSize&&ce.shift()}super.next(ee)}nextTimeWindow(ee){this.isStopped||(this._events.push(new W(this._getNow(),ee)),this._trimBufferThenGetEvents()),super.next(ee)}_subscribe(ee){const ce=this._infiniteTimeWindow,ie=ce?this._events:this._trimBufferThenGetEvents(),U=this.scheduler,se=ie.length;let ge;if(this.closed)throw new R.N;if(this.isStopped||this.hasError?ge=T.w.EMPTY:(this.observers.push(ee),ge=new L.W(this,ee)),U&&ee.add(ee=new C.ht(ee,U)),ce)for(let ae=0;ae<se&&!ee.closed;ae++)ee.next(ie[ae]);else for(let ae=0;ae<se&&!ee.closed;ae++)ee.next(ie[ae].value);return this.hasError?ee.error(this.thrownError):this.isStopped&&ee.complete(),ge}_getNow(){return(this.scheduler||y).now()}_trimBufferThenGetEvents(){const ee=this._getNow(),ce=this._bufferSize,ie=this._windowTime,U=this._events,se=U.length;let ge=0;for(;ge<se&&!(ee-U[ge].time<ie);)ge++;return se>ce&&(ge=Math.max(ge,se-ce)),ge>0&&U.splice(0,ge),U}}class W{constructor(ee,ce){this.time=ee,this.value=ce}}},79765:(m,S,i)=>{"use strict";i.d(S,{Yc:()=>y,xQ:()=>T});var r=i(70882),a=i(77393),f=i(13464),c=i(77971),e=i(78858),p=i(29181);class y extends a.L{constructor(L){super(L),this.destination=L}}let T=(()=>{class R extends r.y{constructor(){super(),this.observers=[],this.closed=!1,this.isStopped=!1,this.hasError=!1,this.thrownError=null}[p.b](){return new y(this)}lift(z){const W=new C(this,this);return W.operator=z,W}next(z){if(this.closed)throw new c.N;if(!this.isStopped){const{observers:W}=this,J=W.length,ee=W.slice();for(let ce=0;ce<J;ce++)ee[ce].next(z)}}error(z){if(this.closed)throw new c.N;this.hasError=!0,this.thrownError=z,this.isStopped=!0;const{observers:W}=this,J=W.length,ee=W.slice();for(let ce=0;ce<J;ce++)ee[ce].error(z);this.observers.length=0}complete(){if(this.closed)throw new c.N;this.isStopped=!0;const{observers:z}=this,W=z.length,J=z.slice();for(let ee=0;ee<W;ee++)J[ee].complete();this.observers.length=0}unsubscribe(){this.isStopped=!0,this.closed=!0,this.observers=null}_trySubscribe(z){if(this.closed)throw new c.N;return super._trySubscribe(z)}_subscribe(z){if(this.closed)throw new c.N;return this.hasError?(z.error(this.thrownError),f.w.EMPTY):this.isStopped?(z.complete(),f.w.EMPTY):(this.observers.push(z),new e.W(this,z))}asObservable(){const z=new r.y;return z.source=this,z}}return R.create=(L,z)=>new C(L,z),R})();class C extends T{constructor(L,z){super(),this.destination=L,this.source=z}next(L){const{destination:z}=this;z&&z.next&&z.next(L)}error(L){const{destination:z}=this;z&&z.error&&this.destination.error(L)}complete(){const{destination:L}=this;L&&L.complete&&this.destination.complete()}_subscribe(L){const{source:z}=this;return z?this.source.subscribe(L):f.w.EMPTY}}},78858:(m,S,i)=>{"use strict";i.d(S,{W:()=>a});var r=i(13464);class a extends r.w{constructor(c,e){super(),this.subject=c,this.subscriber=e,this.closed=!1}unsubscribe(){if(this.closed)return;this.closed=!0;const c=this.subject,e=c.observers;if(this.subject=null,!e||0===e.length||c.isStopped||c.closed)return;const p=e.indexOf(this.subscriber);-1!==p&&e.splice(p,1)}}},77393:(m,S,i)=>{"use strict";i.d(S,{L:()=>y});var r=i(69105),a=i(46490),f=i(13464),c=i(29181),e=i(82494),p=i(54449);class y extends f.w{constructor(R,L,z){switch(super(),this.syncErrorValue=null,this.syncErrorThrown=!1,this.syncErrorThrowable=!1,this.isStopped=!1,arguments.length){case 0:this.destination=a.c;break;case 1:if(!R){this.destination=a.c;break}if("object"==typeof R){R instanceof y?(this.syncErrorThrowable=R.syncErrorThrowable,this.destination=R,R.add(this)):(this.syncErrorThrowable=!0,this.destination=new T(this,R));break}default:this.syncErrorThrowable=!0,this.destination=new T(this,R,L,z)}}[c.b](){return this}static create(R,L,z){const W=new y(R,L,z);return W.syncErrorThrowable=!1,W}next(R){this.isStopped||this._next(R)}error(R){this.isStopped||(this.isStopped=!0,this._error(R))}complete(){this.isStopped||(this.isStopped=!0,this._complete())}unsubscribe(){this.closed||(this.isStopped=!0,super.unsubscribe())}_next(R){this.destination.next(R)}_error(R){this.destination.error(R),this.unsubscribe()}_complete(){this.destination.complete(),this.unsubscribe()}_unsubscribeAndRecycle(){const{_parentOrParents:R}=this;return this._parentOrParents=null,this.unsubscribe(),this.closed=!1,this.isStopped=!1,this._parentOrParents=R,this}}class T extends y{constructor(R,L,z,W){super(),this._parentSubscriber=R;let J,ee=this;(0,r.m)(L)?J=L:L&&(J=L.next,z=L.error,W=L.complete,L!==a.c&&(ee=Object.create(L),(0,r.m)(ee.unsubscribe)&&this.add(ee.unsubscribe.bind(ee)),ee.unsubscribe=this.unsubscribe.bind(this))),this._context=ee,this._next=J,this._error=z,this._complete=W}next(R){if(!this.isStopped&&this._next){const{_parentSubscriber:L}=this;e.v.useDeprecatedSynchronousErrorHandling&&L.syncErrorThrowable?this.__tryOrSetError(L,this._next,R)&&this.unsubscribe():this.__tryOrUnsub(this._next,R)}}error(R){if(!this.isStopped){const{_parentSubscriber:L}=this,{useDeprecatedSynchronousErrorHandling:z}=e.v;if(this._error)z&&L.syncErrorThrowable?(this.__tryOrSetError(L,this._error,R),this.unsubscribe()):(this.__tryOrUnsub(this._error,R),this.unsubscribe());else if(L.syncErrorThrowable)z?(L.syncErrorValue=R,L.syncErrorThrown=!0):(0,p.z)(R),this.unsubscribe();else{if(this.unsubscribe(),z)throw R;(0,p.z)(R)}}}complete(){if(!this.isStopped){const{_parentSubscriber:R}=this;if(this._complete){const L=()=>this._complete.call(this._context);e.v.useDeprecatedSynchronousErrorHandling&&R.syncErrorThrowable?(this.__tryOrSetError(R,L),this.unsubscribe()):(this.__tryOrUnsub(L),this.unsubscribe())}else this.unsubscribe()}}__tryOrUnsub(R,L){try{R.call(this._context,L)}catch(z){if(this.unsubscribe(),e.v.useDeprecatedSynchronousErrorHandling)throw z;(0,p.z)(z)}}__tryOrSetError(R,L,z){if(!e.v.useDeprecatedSynchronousErrorHandling)throw new Error("bad call");try{L.call(this._context,z)}catch(W){return e.v.useDeprecatedSynchronousErrorHandling?(R.syncErrorValue=W,R.syncErrorThrown=!0,!0):((0,p.z)(W),!0)}return!1}_unsubscribe(){const{_parentSubscriber:R}=this;this._context=null,this._parentSubscriber=null,R.unsubscribe()}}},13464:(m,S,i)=>{"use strict";i.d(S,{w:()=>p});var r=i(59796),a=i(81555),f=i(69105);const e=(()=>{function T(C){return Error.call(this),this.message=C?`${C.length} errors occurred during unsubscription:\n${C.map((R,L)=>`${L+1}) ${R.toString()}`).join("\n  ")}`:"",this.name="UnsubscriptionError",this.errors=C,this}return T.prototype=Object.create(Error.prototype),T})();class p{constructor(C){this.closed=!1,this._parentOrParents=null,this._subscriptions=null,C&&(this._ctorUnsubscribe=!0,this._unsubscribe=C)}unsubscribe(){let C;if(this.closed)return;let{_parentOrParents:R,_ctorUnsubscribe:L,_unsubscribe:z,_subscriptions:W}=this;if(this.closed=!0,this._parentOrParents=null,this._subscriptions=null,R instanceof p)R.remove(this);else if(null!==R)for(let J=0;J<R.length;++J)R[J].remove(this);if((0,f.m)(z)){L&&(this._unsubscribe=void 0);try{z.call(this)}catch(J){C=J instanceof e?y(J.errors):[J]}}if((0,r.k)(W)){let J=-1,ee=W.length;for(;++J<ee;){const ce=W[J];if((0,a.K)(ce))try{ce.unsubscribe()}catch(ie){C=C||[],ie instanceof e?C=C.concat(y(ie.errors)):C.push(ie)}}}if(C)throw new e(C)}add(C){let R=C;if(!C)return p.EMPTY;switch(typeof C){case"function":R=new p(C);case"object":if(R===this||R.closed||"function"!=typeof R.unsubscribe)return R;if(this.closed)return R.unsubscribe(),R;if(!(R instanceof p)){const W=R;R=new p,R._subscriptions=[W]}break;default:throw new Error("unrecognized teardown "+C+" added to Subscription.")}let{_parentOrParents:L}=R;if(null===L)R._parentOrParents=this;else if(L instanceof p){if(L===this)return R;R._parentOrParents=[L,this]}else{if(-1!==L.indexOf(this))return R;L.push(this)}const z=this._subscriptions;return null===z?this._subscriptions=[R]:z.push(R),R}remove(C){const R=this._subscriptions;if(R){const L=R.indexOf(C);-1!==L&&R.splice(L,1)}}}var T;function y(T){return T.reduce((C,R)=>C.concat(R instanceof e?R.errors:R),[])}p.EMPTY=((T=new p).closed=!0,T)},82494:(m,S,i)=>{"use strict";i.d(S,{v:()=>a});let r=!1;const a={Promise:void 0,set useDeprecatedSynchronousErrorHandling(f){if(f){const c=new Error;console.warn("DEPRECATED! RxJS was set to use deprecated synchronous error handling behavior by code at: \n"+c.stack)}else r&&console.log("RxJS: Back to a better error behavior. Thank you. <3");r=f},get useDeprecatedSynchronousErrorHandling(){return r}}},85345:(m,S,i)=>{"use strict";i.d(S,{Ds:()=>p,IY:()=>c,ft:()=>T});var r=i(77393),a=i(70882),f=i(19846);class c extends r.L{constructor(R){super(),this.parent=R}_next(R){this.parent.notifyNext(R)}_error(R){this.parent.notifyError(R),this.unsubscribe()}_complete(){this.parent.notifyComplete(),this.unsubscribe()}}class p extends r.L{notifyNext(R){this.destination.next(R)}notifyError(R){this.destination.error(R)}notifyComplete(){this.destination.complete()}}function T(C,R){if(!R.closed)return C instanceof a.y?C.subscribe(R):(0,f.s)(C)(R)}},52441:(m,S,i)=>{"use strict";i.d(S,{N:()=>p,c:()=>e});var r=i(79765),a=i(70882),f=i(13464),c=i(51307);class e extends a.y{constructor(L,z){super(),this.source=L,this.subjectFactory=z,this._refCount=0,this._isComplete=!1}_subscribe(L){return this.getSubject().subscribe(L)}getSubject(){const L=this._subject;return(!L||L.isStopped)&&(this._subject=this.subjectFactory()),this._subject}connect(){let L=this._connection;return L||(this._isComplete=!1,L=this._connection=new f.w,L.add(this.source.subscribe(new y(this.getSubject(),this))),L.closed&&(this._connection=null,L=f.w.EMPTY)),L}refCount(){return(0,c.x)()(this)}}const p=(()=>{const R=e.prototype;return{operator:{value:null},_refCount:{value:0,writable:!0},_subject:{value:null,writable:!0},_connection:{value:null,writable:!0},_subscribe:{value:R._subscribe},_isComplete:{value:R._isComplete,writable:!0},getSubject:{value:R.getSubject},connect:{value:R.connect},refCount:{value:R.refCount}}})();class y extends r.Yc{constructor(L,z){super(L),this.connectable=z}_error(L){this._unsubscribe(),super._error(L)}_complete(){this.connectable._isComplete=!0,this._unsubscribe(),super._complete()}_unsubscribe(){const L=this.connectable;if(L){this.connectable=null;const z=L._connection;L._refCount=0,L._subject=null,L._connection=null,z&&z.unsubscribe()}}}},9112:(m,S,i)=>{"use strict";i.d(S,{aj:()=>y});var r=i(54869),a=i(59796),f=i(55197),c=i(53960),e=i(56693);const p={};function y(...R){let L,z;return(0,r.K)(R[R.length-1])&&(z=R.pop()),"function"==typeof R[R.length-1]&&(L=R.pop()),1===R.length&&(0,a.k)(R[0])&&(R=R[0]),(0,e.n)(R,z).lift(new T(L))}class T{constructor(L){this.resultSelector=L}call(L,z){return z.subscribe(new C(L,this.resultSelector))}}class C extends f.L{constructor(L,z){super(L),this.resultSelector=z,this.active=0,this.values=[],this.observables=[]}_next(L){this.values.push(p),this.observables.push(L)}_complete(){const L=this.observables,z=L.length;if(0===z)this.destination.complete();else{this.active=z,this.toRespond=z;for(let W=0;W<z;W++)this.add((0,c.D)(this,L[W],void 0,W))}}notifyComplete(L){0==(this.active-=1)&&this.destination.complete()}notifyNext(L,z,W){const J=this.values,ce=this.toRespond?J[W]===p?--this.toRespond:this.toRespond:0;J[W]=z,0===ce&&(this.resultSelector?this._tryResultSelector(J):this.destination.next(J.slice()))}_tryResultSelector(L){let z;try{z=this.resultSelector.apply(this,L)}catch(W){return void this.destination.error(W)}this.destination.next(z)}}},6481:(m,S,i)=>{"use strict";i.d(S,{z:()=>c});var r=i(25917),a=i(63282);function c(...e){return function f(){return(0,a.J)(1)}()((0,r.of)(...e))}},59193:(m,S,i)=>{"use strict";i.d(S,{E:()=>a,c:()=>f});var r=i(70882);const a=new r.y(e=>e.complete());function f(e){return e?function c(e){return new r.y(p=>e.schedule(()=>p.complete()))}(e):a}},35758:(m,S,i)=>{"use strict";i.d(S,{D:()=>p});var r=i(70882),a=i(59796),f=i(88002),c=i(81555),e=i(76666);function p(...T){if(1===T.length){const C=T[0];if((0,a.k)(C))return y(C,null);if((0,c.K)(C)&&Object.getPrototypeOf(C)===Object.prototype){const R=Object.keys(C);return y(R.map(L=>C[L]),R)}}if("function"==typeof T[T.length-1]){const C=T.pop();return y(T=1===T.length&&(0,a.k)(T[0])?T[0]:T,null).pipe((0,f.U)(R=>C(...R)))}return y(T,null)}function y(T,C){return new r.y(R=>{const L=T.length;if(0===L)return void R.complete();const z=new Array(L);let W=0,J=0;for(let ee=0;ee<L;ee++){const ce=(0,e.D)(T[ee]);let ie=!1;R.add(ce.subscribe({next:U=>{ie||(ie=!0,J++),z[ee]=U},error:U=>R.error(U),complete:()=>{W++,(W===L||!ie)&&(J===L&&R.next(C?C.reduce((U,se,ge)=>(U[se]=z[ge],U),{}):z),R.complete())}}))}})}},76666:(m,S,i)=>{"use strict";i.d(S,{D:()=>ee});var r=i(70882),a=i(19846),f=i(13464),c=i(16554),y=i(94087),T=i(20377),L=i(44072),z=i(69489);function ee(ce,ie){return ie?function J(ce,ie){if(null!=ce){if(function R(ce){return ce&&"function"==typeof ce[c.L]}(ce))return function e(ce,ie){return new r.y(U=>{const se=new f.w;return se.add(ie.schedule(()=>{const ge=ce[c.L]();se.add(ge.subscribe({next(ae){se.add(ie.schedule(()=>U.next(ae)))},error(ae){se.add(ie.schedule(()=>U.error(ae)))},complete(){se.add(ie.schedule(()=>U.complete()))}}))})),se})}(ce,ie);if((0,L.t)(ce))return function p(ce,ie){return new r.y(U=>{const se=new f.w;return se.add(ie.schedule(()=>ce.then(ge=>{se.add(ie.schedule(()=>{U.next(ge),se.add(ie.schedule(()=>U.complete()))}))},ge=>{se.add(ie.schedule(()=>U.error(ge)))}))),se})}(ce,ie);if((0,z.z)(ce))return(0,y.r)(ce,ie);if(function W(ce){return ce&&"function"==typeof ce[T.hZ]}(ce)||"string"==typeof ce)return function C(ce,ie){if(!ce)throw new Error("Iterable cannot be null");return new r.y(U=>{const se=new f.w;let ge;return se.add(()=>{ge&&"function"==typeof ge.return&&ge.return()}),se.add(ie.schedule(()=>{ge=ce[T.hZ](),se.add(ie.schedule(function(){if(U.closed)return;let ae,he;try{const be=ge.next();ae=be.value,he=be.done}catch(be){return void U.error(be)}he?U.complete():(U.next(ae),this.schedule())}))})),se})}(ce,ie)}throw new TypeError((null!==ce&&typeof ce||ce)+" is not observable")}(ce,ie):ce instanceof r.y?ce:new r.y((0,a.s)(ce))}},56693:(m,S,i)=>{"use strict";i.d(S,{n:()=>c});var r=i(70882),a=i(55015),f=i(94087);function c(e,p){return p?(0,f.r)(e,p):new r.y((0,a.V)(e))}},22759:(m,S,i)=>{"use strict";i.d(S,{R:()=>p});var r=i(70882),a=i(59796),f=i(69105),c=i(88002);function p(L,z,W,J){return(0,f.m)(W)&&(J=W,W=void 0),J?p(L,z,W).pipe((0,c.U)(ee=>(0,a.k)(ee)?J(...ee):J(ee))):new r.y(ee=>{y(L,z,function ce(ie){ee.next(arguments.length>1?Array.prototype.slice.call(arguments):ie)},ee,W)})}function y(L,z,W,J,ee){let ce;if(function R(L){return L&&"function"==typeof L.addEventListener&&"function"==typeof L.removeEventListener}(L)){const ie=L;L.addEventListener(z,W,ee),ce=()=>ie.removeEventListener(z,W,ee)}else if(function C(L){return L&&"function"==typeof L.on&&"function"==typeof L.off}(L)){const ie=L;L.on(z,W),ce=()=>ie.off(z,W)}else if(function T(L){return L&&"function"==typeof L.addListener&&"function"==typeof L.removeListener}(L)){const ie=L;L.addListener(z,W),ce=()=>ie.removeListener(z,W)}else{if(!L||!L.length)throw new TypeError("Invalid event target");for(let ie=0,U=L.length;ie<U;ie++)y(L[ie],z,W,J,ee)}J.add(ce)}},66682:(m,S,i)=>{"use strict";i.d(S,{T:()=>e});var r=i(70882),a=i(54869),f=i(63282),c=i(56693);function e(...p){let y=Number.POSITIVE_INFINITY,T=null,C=p[p.length-1];return(0,a.K)(C)?(T=p.pop(),p.length>1&&"number"==typeof p[p.length-1]&&(y=p.pop())):"number"==typeof C&&(y=p.pop()),null===T&&1===p.length&&p[0]instanceof r.y?p[0]:(0,f.J)(y)((0,c.n)(p,T))}},17757:(m,S,i)=>{"use strict";i.d(S,{C:()=>f});var r=i(70882),a=i(98640);const f=new r.y(a.Z)},25917:(m,S,i)=>{"use strict";i.d(S,{of:()=>c});var r=i(54869),a=i(56693),f=i(94087);function c(...e){let p=e[e.length-1];return(0,r.K)(p)?(e.pop(),(0,f.r)(e,p)):(0,a.n)(e)}},40205:(m,S,i)=>{"use strict";i.d(S,{_:()=>a});var r=i(70882);function a(c,e){return new r.y(e?p=>e.schedule(f,0,{error:c,subscriber:p}):p=>p.error(c))}function f({error:c,subscriber:e}){e.error(c)}},46797:(m,S,i)=>{"use strict";i.d(S,{H:()=>e});var r=i(70882),a=i(33637),f=i(26561),c=i(54869);function e(y=0,T,C){let R=-1;return(0,f.k)(T)?R=Number(T)<1?1:Number(T):(0,c.K)(T)&&(C=T),(0,c.K)(C)||(C=a.P),new r.y(L=>{const z=(0,f.k)(y)?y:+y-C.now();return C.schedule(p,z,{index:0,period:R,subscriber:L})})}function p(y){const{index:T,period:C,subscriber:R}=y;if(R.next(T),!R.closed){if(-1===C)return R.complete();y.index=T+1,this.schedule(y,C)}}},5304:(m,S,i)=>{"use strict";i.d(S,{K:()=>a});var r=i(85345);function a(e){return function(y){const T=new f(e),C=y.lift(T);return T.caught=C}}class f{constructor(p){this.selector=p}call(p,y){return y.subscribe(new c(p,this.selector,this.caught))}}class c extends r.Ds{constructor(p,y,T){super(p),this.selector=y,this.caught=T}error(p){if(!this.isStopped){let y;try{y=this.selector(p,this.caught)}catch(R){return void super.error(R)}this._unsubscribeAndRecycle();const T=new r.IY(this);this.add(T);const C=(0,r.ft)(y,T);C!==T&&this.add(C)}}}},94612:(m,S,i)=>{"use strict";i.d(S,{b:()=>a});var r=i(19773);function a(f,c){return(0,r.zg)(f,c,1)}},95242:(m,S,i)=>{"use strict";i.d(S,{d:()=>a});var r=i(77393);function a(e=null){return p=>p.lift(new f(e))}class f{constructor(p){this.defaultValue=p}call(p,y){return y.subscribe(new c(p,this.defaultValue))}}class c extends r.L{constructor(p,y){super(p),this.defaultValue=y,this.isEmpty=!0}_next(p){this.isEmpty=!1,this.destination.next(p)}_complete(){this.isEmpty&&this.destination.next(this.defaultValue),this.destination.complete()}}},67460:(m,S,i)=>{"use strict";i.d(S,{g:()=>e});var r=i(33637),f=i(77393),c=i(23098);function e(C,R=r.P){const z=function a(C){return C instanceof Date&&!isNaN(+C)}(C)?+C-R.now():Math.abs(C);return W=>W.lift(new p(z,R))}class p{constructor(R,L){this.delay=R,this.scheduler=L}call(R,L){return L.subscribe(new y(R,this.delay,this.scheduler))}}class y extends f.L{constructor(R,L,z){super(R),this.delay=L,this.scheduler=z,this.queue=[],this.active=!1,this.errored=!1}static dispatch(R){const L=R.source,z=L.queue,W=R.scheduler,J=R.destination;for(;z.length>0&&z[0].time-W.now()<=0;)z.shift().notification.observe(J);if(z.length>0){const ee=Math.max(0,z[0].time-W.now());this.schedule(R,ee)}else this.unsubscribe(),L.active=!1}_schedule(R){this.active=!0,this.destination.add(R.schedule(y.dispatch,this.delay,{source:this,destination:this.destination,scheduler:R}))}scheduleNotification(R){if(!0===this.errored)return;const L=this.scheduler,z=new T(L.now()+this.delay,R);this.queue.push(z),!1===this.active&&this._schedule(L)}_next(R){this.scheduleNotification(c.P.createNext(R))}_error(R){this.errored=!0,this.queue=[],this.destination.error(R),this.unsubscribe()}_complete(){this.scheduleNotification(c.P.createComplete()),this.unsubscribe()}}class T{constructor(R,L){this.time=R,this.notification=L}}},87519:(m,S,i)=>{"use strict";i.d(S,{x:()=>a});var r=i(77393);function a(e,p){return y=>y.lift(new f(e,p))}class f{constructor(p,y){this.compare=p,this.keySelector=y}call(p,y){return y.subscribe(new c(p,this.compare,this.keySelector))}}class c extends r.L{constructor(p,y,T){super(p),this.keySelector=T,this.hasKey=!1,"function"==typeof y&&(this.compare=y)}compare(p,y){return p===y}_next(p){let y;try{const{keySelector:C}=this;y=C?C(p):p}catch(C){return this.destination.error(C)}let T=!1;if(this.hasKey)try{const{compare:C}=this;T=C(this.key,y)}catch(C){return this.destination.error(C)}else this.hasKey=!0;T||(this.key=y,this.destination.next(p))}}},45435:(m,S,i)=>{"use strict";i.d(S,{h:()=>a});var r=i(77393);function a(e,p){return function(T){return T.lift(new f(e,p))}}class f{constructor(p,y){this.predicate=p,this.thisArg=y}call(p,y){return y.subscribe(new c(p,this.predicate,this.thisArg))}}class c extends r.L{constructor(p,y,T){super(p),this.predicate=y,this.thisArg=T,this.count=0}_next(p){let y;try{y=this.predicate.call(this.thisArg,p,this.count++)}catch(T){return void this.destination.error(T)}y&&this.destination.next(p)}}},68939:(m,S,i)=>{"use strict";i.d(S,{x:()=>f});var r=i(77393),a=i(13464);function f(p){return y=>y.lift(new c(p))}class c{constructor(y){this.callback=y}call(y,T){return T.subscribe(new e(y,this.callback))}}class e extends r.L{constructor(y,T){super(y),this.add(new a.w(T))}}},28049:(m,S,i)=>{"use strict";i.d(S,{P:()=>y});var r=i(13410),a=i(45435),f=i(15257),c=i(95242),e=i(44635),p=i(54487);function y(T,C){const R=arguments.length>=2;return L=>L.pipe(T?(0,a.h)((z,W)=>T(z,W,L)):p.y,(0,f.q)(1),R?(0,c.d)(C):(0,e.T)(()=>new r.K))}},12627:(m,S,i)=>{"use strict";i.d(S,{Z:()=>y});var r=i(13410),a=i(45435),f=i(548),c=i(44635),e=i(95242),p=i(54487);function y(T,C){const R=arguments.length>=2;return L=>L.pipe(T?(0,a.h)((z,W)=>T(z,W,L)):p.y,(0,f.h)(1),R?(0,e.d)(C):(0,c.T)(()=>new r.K))}},88002:(m,S,i)=>{"use strict";i.d(S,{U:()=>a});var r=i(77393);function a(e,p){return function(T){if("function"!=typeof e)throw new TypeError("argument is not a function. Are you looking for `mapTo()`?");return T.lift(new f(e,p))}}class f{constructor(p,y){this.project=p,this.thisArg=y}call(p,y){return y.subscribe(new c(p,this.project,this.thisArg))}}class c extends r.L{constructor(p,y,T){super(p),this.project=y,this.count=0,this.thisArg=T||this}_next(p){let y;try{y=this.project.call(this.thisArg,p,this.count++)}catch(T){return void this.destination.error(T)}this.destination.next(y)}}},96736:(m,S,i)=>{"use strict";i.d(S,{h:()=>a});var r=i(77393);function a(e){return p=>p.lift(new f(e))}class f{constructor(p){this.value=p}call(p,y){return y.subscribe(new c(p,this.value))}}class c extends r.L{constructor(p,y){super(p),this.value=y}_next(p){this.destination.next(this.value)}}},63282:(m,S,i)=>{"use strict";i.d(S,{J:()=>f});var r=i(19773),a=i(54487);function f(c=Number.POSITIVE_INFINITY){return(0,r.zg)(a.y,c)}},19773:(m,S,i)=>{"use strict";i.d(S,{zg:()=>c});var r=i(88002),a=i(76666),f=i(85345);function c(T,C,R=Number.POSITIVE_INFINITY){return"function"==typeof C?L=>L.pipe(c((z,W)=>(0,a.D)(T(z,W)).pipe((0,r.U)((J,ee)=>C(z,J,W,ee))),R)):("number"==typeof C&&(R=C),L=>L.lift(new e(T,R)))}class e{constructor(C,R=Number.POSITIVE_INFINITY){this.project=C,this.concurrent=R}call(C,R){return R.subscribe(new p(C,this.project,this.concurrent))}}class p extends f.Ds{constructor(C,R,L=Number.POSITIVE_INFINITY){super(C),this.project=R,this.concurrent=L,this.hasCompleted=!1,this.buffer=[],this.active=0,this.index=0}_next(C){this.active<this.concurrent?this._tryNext(C):this.buffer.push(C)}_tryNext(C){let R;const L=this.index++;try{R=this.project(C,L)}catch(z){return void this.destination.error(z)}this.active++,this._innerSub(R)}_innerSub(C){const R=new f.IY(this),L=this.destination;L.add(R);const z=(0,f.ft)(C,R);z!==R&&L.add(z)}_complete(){this.hasCompleted=!0,0===this.active&&0===this.buffer.length&&this.destination.complete(),this.unsubscribe()}notifyNext(C){this.destination.next(C)}notifyComplete(){const C=this.buffer;this.active--,C.length>0?this._next(C.shift()):0===this.active&&this.hasCompleted&&this.destination.complete()}}},59746:(m,S,i)=>{"use strict";i.d(S,{QV:()=>f,ht:()=>e});var r=i(77393),a=i(23098);function f(y,T=0){return function(R){return R.lift(new c(y,T))}}class c{constructor(T,C=0){this.scheduler=T,this.delay=C}call(T,C){return C.subscribe(new e(T,this.scheduler,this.delay))}}class e extends r.L{constructor(T,C,R=0){super(T),this.scheduler=C,this.delay=R}static dispatch(T){const{notification:C,destination:R}=T;C.observe(R),this.unsubscribe()}scheduleMessage(T){this.destination.add(this.scheduler.schedule(e.dispatch,this.delay,new p(T,this.destination)))}_next(T){this.scheduleMessage(a.P.createNext(T))}_error(T){this.scheduleMessage(a.P.createError(T)),this.unsubscribe()}_complete(){this.scheduleMessage(a.P.createComplete()),this.unsubscribe()}}class p{constructor(T,C){this.notification=T,this.destination=C}}},51307:(m,S,i)=>{"use strict";i.d(S,{x:()=>a});var r=i(77393);function a(){return function(p){return p.lift(new f(p))}}class f{constructor(p){this.connectable=p}call(p,y){const{connectable:T}=this;T._refCount++;const C=new c(p,T),R=y.subscribe(C);return C.closed||(C.connection=T.connect()),R}}class c extends r.L{constructor(p,y){super(p),this.connectable=y}_unsubscribe(){const{connectable:p}=this;if(!p)return void(this.connection=null);this.connectable=null;const y=p._refCount;if(y<=0)return void(this.connection=null);if(p._refCount=y-1,y>1)return void(this.connection=null);const{connection:T}=this,C=p._connection;this.connection=null,C&&(!T||C===T)&&C.unsubscribe()}}},42145:(m,S,i)=>{"use strict";i.d(S,{R:()=>a});var r=i(77393);function a(e,p){let y=!1;return arguments.length>=2&&(y=!0),function(C){return C.lift(new f(e,p,y))}}class f{constructor(p,y,T=!1){this.accumulator=p,this.seed=y,this.hasSeed=T}call(p,y){return y.subscribe(new c(p,this.accumulator,this.seed,this.hasSeed))}}class c extends r.L{constructor(p,y,T,C){super(p),this.accumulator=y,this._seed=T,this.hasSeed=C,this.index=0}get seed(){return this._seed}set seed(p){this.hasSeed=!0,this._seed=p}_next(p){if(this.hasSeed)return this._tryNext(p);this.seed=p,this.destination.next(p)}_tryNext(p){const y=this.index++;let T;try{T=this.accumulator(this.seed,p,y)}catch(C){this.destination.error(C)}this.seed=T,this.destination.next(T)}}},4121:(m,S,i)=>{"use strict";i.d(S,{B:()=>y});var r=i(52441);class f{constructor(C,R){this.subjectFactory=C,this.selector=R}call(C,R){const{selector:L}=this,z=this.subjectFactory(),W=L(z).subscribe(C);return W.add(R.subscribe(z)),W}}var c=i(51307),e=i(79765);function p(){return new e.xQ}function y(){return T=>(0,c.x)()(function a(T,C){return function(L){let z;if(z="function"==typeof T?T:function(){return T},"function"==typeof C)return L.lift(new f(z,C));const W=Object.create(L,r.N);return W.source=L,W.subjectFactory=z,W}}(p)(T))}},47349:(m,S,i)=>{"use strict";i.d(S,{d:()=>a});var r=i(7357);function a(c,e,p){let y;return y=c&&"object"==typeof c?c:{bufferSize:c,windowTime:e,refCount:!1,scheduler:p},T=>T.lift(function f({bufferSize:c=Number.POSITIVE_INFINITY,windowTime:e=Number.POSITIVE_INFINITY,refCount:p,scheduler:y}){let T,R,C=0,L=!1,z=!1;return function(J){let ee;C++,!T||L?(L=!1,T=new r.t(c,e,y),ee=T.subscribe(this),R=J.subscribe({next(ce){T.next(ce)},error(ce){L=!0,T.error(ce)},complete(){z=!0,R=void 0,T.complete()}})):ee=T.subscribe(this),this.add(()=>{C--,ee.unsubscribe(),R&&!z&&p&&0===C&&(R.unsubscribe(),R=void 0,T=void 0)})}}(y))}},39761:(m,S,i)=>{"use strict";i.d(S,{O:()=>f});var r=i(6481),a=i(54869);function f(...c){const e=c[c.length-1];return(0,a.K)(e)?(c.pop(),p=>(0,r.z)(c,p,e)):p=>(0,r.z)(c,p)}},43190:(m,S,i)=>{"use strict";i.d(S,{w:()=>c});var r=i(88002),a=i(76666),f=i(85345);function c(y,T){return"function"==typeof T?C=>C.pipe(c((R,L)=>(0,a.D)(y(R,L)).pipe((0,r.U)((z,W)=>T(R,z,L,W))))):C=>C.lift(new e(y))}class e{constructor(T){this.project=T}call(T,C){return C.subscribe(new p(T,this.project))}}class p extends f.Ds{constructor(T,C){super(T),this.project=C,this.index=0}_next(T){let C;const R=this.index++;try{C=this.project(T,R)}catch(L){return void this.destination.error(L)}this._innerSub(C)}_innerSub(T){const C=this.innerSubscription;C&&C.unsubscribe();const R=new f.IY(this),L=this.destination;L.add(R),this.innerSubscription=(0,f.ft)(T,R),this.innerSubscription!==R&&L.add(this.innerSubscription)}_complete(){const{innerSubscription:T}=this;(!T||T.closed)&&super._complete(),this.unsubscribe()}_unsubscribe(){this.innerSubscription=void 0}notifyComplete(){this.innerSubscription=void 0,this.isStopped&&super._complete()}notifyNext(T){this.destination.next(T)}}},15257:(m,S,i)=>{"use strict";i.d(S,{q:()=>c});var r=i(77393),a=i(7108),f=i(59193);function c(y){return T=>0===y?(0,f.c)():T.lift(new e(y))}class e{constructor(T){if(this.total=T,this.total<0)throw new a.W}call(T,C){return C.subscribe(new p(T,this.total))}}class p extends r.L{constructor(T,C){super(T),this.total=C,this.count=0}_next(T){const C=this.total,R=++this.count;R<=C&&(this.destination.next(T),R===C&&(this.destination.complete(),this.unsubscribe()))}}},548:(m,S,i)=>{"use strict";i.d(S,{h:()=>c});var r=i(77393),a=i(7108),f=i(59193);function c(y){return function(C){return 0===y?(0,f.c)():C.lift(new e(y))}}class e{constructor(T){if(this.total=T,this.total<0)throw new a.W}call(T,C){return C.subscribe(new p(T,this.total))}}class p extends r.L{constructor(T,C){super(T),this.total=C,this.ring=new Array,this.count=0}_next(T){const C=this.ring,R=this.total,L=this.count++;C.length<R?C.push(T):C[L%R]=T}_complete(){const T=this.destination;let C=this.count;if(C>0){const R=this.count>=this.total?this.total:this.count,L=this.ring;for(let z=0;z<R;z++){const W=C++%R;T.next(L[W])}}T.complete()}}},46782:(m,S,i)=>{"use strict";i.d(S,{R:()=>a});var r=i(85345);function a(e){return p=>p.lift(new f(e))}class f{constructor(p){this.notifier=p}call(p,y){const T=new c(p),C=(0,r.ft)(this.notifier,new r.IY(T));return C&&!T.seenValue?(T.add(C),y.subscribe(T)):T}}class c extends r.Ds{constructor(p){super(p),this.seenValue=!1}notifyNext(){this.seenValue=!0,this.complete()}notifyComplete(){}}},68307:(m,S,i)=>{"use strict";i.d(S,{b:()=>c});var r=i(77393),a=i(98640),f=i(69105);function c(y,T,C){return function(L){return L.lift(new e(y,T,C))}}class e{constructor(T,C,R){this.nextOrObserver=T,this.error=C,this.complete=R}call(T,C){return C.subscribe(new p(T,this.nextOrObserver,this.error,this.complete))}}class p extends r.L{constructor(T,C,R,L){super(T),this._tapNext=a.Z,this._tapError=a.Z,this._tapComplete=a.Z,this._tapError=R||a.Z,this._tapComplete=L||a.Z,(0,f.m)(C)?(this._context=this,this._tapNext=C):C&&(this._context=C,this._tapNext=C.next||a.Z,this._tapError=C.error||a.Z,this._tapComplete=C.complete||a.Z)}_next(T){try{this._tapNext.call(this._context,T)}catch(C){return void this.destination.error(C)}this.destination.next(T)}_error(T){try{this._tapError.call(this._context,T)}catch(C){return void this.destination.error(C)}this.destination.error(T)}_complete(){try{this._tapComplete.call(this._context)}catch(T){return void this.destination.error(T)}return this.destination.complete()}}},44635:(m,S,i)=>{"use strict";i.d(S,{T:()=>f});var r=i(13410),a=i(77393);function f(y=p){return T=>T.lift(new c(y))}class c{constructor(T){this.errorFactory=T}call(T,C){return C.subscribe(new e(T,this.errorFactory))}}class e extends a.L{constructor(T,C){super(T),this.errorFactory=C,this.hasValue=!1}_next(T){this.hasValue=!0,this.destination.next(T)}_complete(){if(this.hasValue)return this.destination.complete();{let T;try{T=this.errorFactory()}catch(C){T=C}this.destination.error(T)}}}function p(){return new r.K}},94087:(m,S,i)=>{"use strict";i.d(S,{r:()=>f});var r=i(70882),a=i(13464);function f(c,e){return new r.y(p=>{const y=new a.w;let T=0;return y.add(e.schedule(function(){T!==c.length?(p.next(c[T++]),p.closed||y.add(this.schedule())):p.complete()})),y})}},23989:(m,S,i)=>{"use strict";i.d(S,{o:()=>f});var r=i(13464);class a extends r.w{constructor(e,p){super()}schedule(e,p=0){return this}}class f extends a{constructor(e,p){super(e,p),this.scheduler=e,this.work=p,this.pending=!1}schedule(e,p=0){if(this.closed)return this;this.state=e;const y=this.id,T=this.scheduler;return null!=y&&(this.id=this.recycleAsyncId(T,y,p)),this.pending=!0,this.delay=p,this.id=this.id||this.requestAsyncId(T,this.id,p),this}requestAsyncId(e,p,y=0){return setInterval(e.flush.bind(e,this),y)}recycleAsyncId(e,p,y=0){if(null!==y&&this.delay===y&&!1===this.pending)return p;clearInterval(p)}execute(e,p){if(this.closed)return new Error("executing a cancelled action");this.pending=!1;const y=this._execute(e,p);if(y)return y;!1===this.pending&&null!=this.id&&(this.id=this.recycleAsyncId(this.scheduler,this.id,null))}_execute(e,p){let T,y=!1;try{this.work(e)}catch(C){y=!0,T=!!C&&C||new Error(C)}if(y)return this.unsubscribe(),T}_unsubscribe(){const e=this.id,p=this.scheduler,y=p.actions,T=y.indexOf(this);this.work=null,this.state=null,this.pending=!1,this.scheduler=null,-1!==T&&y.splice(T,1),null!=e&&(this.id=this.recycleAsyncId(p,e,null)),this.delay=null}}},46493:(m,S,i)=>{"use strict";i.d(S,{v:()=>a});let r=(()=>{class f{constructor(e,p=f.now){this.SchedulerAction=e,this.now=p}schedule(e,p=0,y){return new this.SchedulerAction(this,e).schedule(y,p)}}return f.now=()=>Date.now(),f})();class a extends r{constructor(c,e=r.now){super(c,()=>a.delegate&&a.delegate!==this?a.delegate.now():e()),this.actions=[],this.active=!1,this.scheduled=void 0}schedule(c,e=0,p){return a.delegate&&a.delegate!==this?a.delegate.schedule(c,e,p):super.schedule(c,e,p)}flush(c){const{actions:e}=this;if(this.active)return void e.push(c);let p;this.active=!0;do{if(p=c.execute(c.state,c.delay))break}while(c=e.shift());if(this.active=!1,p){for(;c=e.shift();)c.unsubscribe();throw p}}}},33637:(m,S,i)=>{"use strict";i.d(S,{P:()=>c,z:()=>f});var r=i(23989);const f=new(i(46493).v)(r.o),c=f},20377:(m,S,i)=>{"use strict";i.d(S,{hZ:()=>a});const a=function r(){return"function"==typeof Symbol&&Symbol.iterator?Symbol.iterator:"@@iterator"}()},16554:(m,S,i)=>{"use strict";i.d(S,{L:()=>r});const r="function"==typeof Symbol&&Symbol.observable||"@@observable"},29181:(m,S,i)=>{"use strict";i.d(S,{b:()=>r});const r="function"==typeof Symbol?Symbol("rxSubscriber"):"@@rxSubscriber_"+Math.random()},7108:(m,S,i)=>{"use strict";i.d(S,{W:()=>a});const a=(()=>{function f(){return Error.call(this),this.message="argument out of range",this.name="ArgumentOutOfRangeError",this}return f.prototype=Object.create(Error.prototype),f})()},13410:(m,S,i)=>{"use strict";i.d(S,{K:()=>a});const a=(()=>{function f(){return Error.call(this),this.message="no elements in sequence",this.name="EmptyError",this}return f.prototype=Object.create(Error.prototype),f})()},77971:(m,S,i)=>{"use strict";i.d(S,{N:()=>a});const a=(()=>{function f(){return Error.call(this),this.message="object unsubscribed",this.name="ObjectUnsubscribedError",this}return f.prototype=Object.create(Error.prototype),f})()},54449:(m,S,i)=>{"use strict";function r(a){setTimeout(()=>{throw a},0)}i.d(S,{z:()=>r})},54487:(m,S,i)=>{"use strict";function r(a){return a}i.d(S,{y:()=>r})},59796:(m,S,i)=>{"use strict";i.d(S,{k:()=>r});const r=Array.isArray||(a=>a&&"number"==typeof a.length)},69489:(m,S,i)=>{"use strict";i.d(S,{z:()=>r});const r=a=>a&&"number"==typeof a.length&&"function"!=typeof a},69105:(m,S,i)=>{"use strict";function r(a){return"function"==typeof a}i.d(S,{m:()=>r})},26561:(m,S,i)=>{"use strict";i.d(S,{k:()=>a});var r=i(59796);function a(f){return!(0,r.k)(f)&&f-parseFloat(f)+1>=0}},81555:(m,S,i)=>{"use strict";function r(a){return null!==a&&"object"==typeof a}i.d(S,{K:()=>r})},44072:(m,S,i)=>{"use strict";function r(a){return!!a&&"function"!=typeof a.subscribe&&"function"==typeof a.then}i.d(S,{t:()=>r})},54869:(m,S,i)=>{"use strict";function r(a){return a&&"function"==typeof a.schedule}i.d(S,{K:()=>r})},98640:(m,S,i)=>{"use strict";function r(){}i.d(S,{Z:()=>r})},34022:(m,S,i)=>{"use strict";i.d(S,{U:()=>f,z:()=>a});var r=i(54487);function a(...c){return f(c)}function f(c){return 0===c.length?r.y:1===c.length?c[0]:function(p){return c.reduce((y,T)=>T(y),p)}}},19846:(m,S,i)=>{"use strict";i.d(S,{s:()=>L});var r=i(55015),a=i(54449),c=i(20377),p=i(16554),T=i(69489),C=i(44072),R=i(81555);const L=z=>{if(z&&"function"==typeof z[p.L])return(z=>W=>{const J=z[p.L]();if("function"!=typeof J.subscribe)throw new TypeError("Provided object does not correctly implement Symbol.observable");return J.subscribe(W)})(z);if((0,T.z)(z))return(0,r.V)(z);if((0,C.t)(z))return(z=>W=>(z.then(J=>{W.closed||(W.next(J),W.complete())},J=>W.error(J)).then(null,a.z),W))(z);if(z&&"function"==typeof z[c.hZ])return(z=>W=>{const J=z[c.hZ]();for(;;){let ee;try{ee=J.next()}catch(ce){return W.error(ce),W}if(ee.done){W.complete();break}if(W.next(ee.value),W.closed)break}return"function"==typeof J.return&&W.add(()=>{J.return&&J.return()}),W})(z);{const J=`You provided ${(0,R.K)(z)?"an invalid object":`'${z}'`} where a stream was expected. You can provide an Observable, Promise, Array, or Iterable.`;throw new TypeError(J)}}},55015:(m,S,i)=>{"use strict";i.d(S,{V:()=>r});const r=a=>f=>{for(let c=0,e=a.length;c<e&&!f.closed;c++)f.next(a[c]);f.complete()}},53960:(m,S,i)=>{"use strict";i.d(S,{D:()=>e});var r=i(77393);class a extends r.L{constructor(y,T,C){super(),this.parent=y,this.outerValue=T,this.outerIndex=C,this.index=0}_next(y){this.parent.notifyNext(this.outerValue,y,this.outerIndex,this.index++,this)}_error(y){this.parent.notifyError(y,this),this.unsubscribe()}_complete(){this.parent.notifyComplete(this),this.unsubscribe()}}var f=i(19846),c=i(70882);function e(p,y,T,C,R=new a(p,T,C)){if(!R.closed)return y instanceof c.y?y.subscribe(R):(0,f.s)(y)(R)}},59771:(m,S)=>{"use strict";var i,r,a,f;if("object"==typeof performance&&"function"==typeof performance.now){var c=performance;S.unstable_now=function(){return c.now()}}else{var e=Date,p=e.now();S.unstable_now=function(){return e.now()-p}}if("undefined"==typeof window||"function"!=typeof MessageChannel){var y=null,T=null,C=function(){if(null!==y)try{var Pt=S.unstable_now();y(!0,Pt),y=null}catch(Vt){throw setTimeout(C,0),Vt}};i=function(Pt){null!==y?setTimeout(i,0,Pt):(y=Pt,setTimeout(C,0))},r=function(Pt,Vt){T=setTimeout(Pt,Vt)},a=function(){clearTimeout(T)},S.unstable_shouldYield=function(){return!1},f=S.unstable_forceFrameRate=function(){}}else{var R=window.setTimeout,L=window.clearTimeout;if("undefined"!=typeof console){var z=window.cancelAnimationFrame;"function"!=typeof window.requestAnimationFrame&&console.error("This browser doesn't support requestAnimationFrame. Make sure that you load a polyfill in older browsers. https://reactjs.org/link/react-polyfills"),"function"!=typeof z&&console.error("This browser doesn't support cancelAnimationFrame. Make sure that you load a polyfill in older browsers. https://reactjs.org/link/react-polyfills")}var W=!1,J=null,ee=-1,ce=5,ie=0;S.unstable_shouldYield=function(){return S.unstable_now()>=ie},f=function(){},S.unstable_forceFrameRate=function(Pt){0>Pt||125<Pt?console.error("forceFrameRate takes a positive int between 0 and 125, forcing frame rates higher than 125 fps is not supported"):ce=0<Pt?Math.floor(1e3/Pt):5};var U=new MessageChannel,se=U.port2;U.port1.onmessage=function(){if(null!==J){var Pt=S.unstable_now();ie=Pt+ce;try{J(!0,Pt)?se.postMessage(null):(W=!1,J=null)}catch(Vt){throw se.postMessage(null),Vt}}else W=!1},i=function(Pt){J=Pt,W||(W=!0,se.postMessage(null))},r=function(Pt,Vt){ee=R(function(){Pt(S.unstable_now())},Vt)},a=function(){L(ee),ee=-1}}function ge(Pt,Vt){var hn=Pt.length;Pt.push(Vt);e:for(;;){var vn=hn-1>>>1,mt=Pt[vn];if(!(void 0!==mt&&0<be(mt,Vt)))break e;Pt[vn]=Vt,Pt[hn]=mt,hn=vn}}function ae(Pt){return void 0===(Pt=Pt[0])?null:Pt}function he(Pt){var Vt=Pt[0];if(void 0!==Vt){var hn=Pt.pop();if(hn!==Vt){Pt[0]=hn;e:for(var vn=0,mt=Pt.length;vn<mt;){var Nt=2*(vn+1)-1,St=Pt[Nt],Yt=Nt+1,Fn=Pt[Yt];if(void 0!==St&&0>be(St,hn))void 0!==Fn&&0>be(Fn,St)?(Pt[vn]=Fn,Pt[Yt]=hn,vn=Yt):(Pt[vn]=St,Pt[Nt]=hn,vn=Nt);else{if(!(void 0!==Fn&&0>be(Fn,hn)))break e;Pt[vn]=Fn,Pt[Yt]=hn,vn=Yt}}}return Vt}return null}function be(Pt,Vt){var hn=Pt.sortIndex-Vt.sortIndex;return 0!==hn?hn:Pt.id-Vt.id}var we=[],ue=[],st=1,We=null,Ve=3,Be=!1,xe=!1,je=!1;function Ne(Pt){for(var Vt=ae(ue);null!==Vt;){if(null===Vt.callback)he(ue);else{if(!(Vt.startTime<=Pt))break;he(ue),Vt.sortIndex=Vt.expirationTime,ge(we,Vt)}Vt=ae(ue)}}function Bt(Pt){if(je=!1,Ne(Pt),!xe)if(null!==ae(we))xe=!0,i(rt);else{var Vt=ae(ue);null!==Vt&&r(Bt,Vt.startTime-Pt)}}function rt(Pt,Vt){xe=!1,je&&(je=!1,a()),Be=!0;var hn=Ve;try{for(Ne(Vt),We=ae(we);null!==We&&(!(We.expirationTime>Vt)||Pt&&!S.unstable_shouldYield());){var vn=We.callback;if("function"==typeof vn){We.callback=null,Ve=We.priorityLevel;var mt=vn(We.expirationTime<=Vt);Vt=S.unstable_now(),"function"==typeof mt?We.callback=mt:We===ae(we)&&he(we),Ne(Vt)}else he(we);We=ae(we)}if(null!==We)var Nt=!0;else{var St=ae(ue);null!==St&&r(Bt,St.startTime-Vt),Nt=!1}return Nt}finally{We=null,Ve=hn,Be=!1}}var en=f;S.unstable_IdlePriority=5,S.unstable_ImmediatePriority=1,S.unstable_LowPriority=4,S.unstable_NormalPriority=3,S.unstable_Profiling=null,S.unstable_UserBlockingPriority=2,S.unstable_cancelCallback=function(Pt){Pt.callback=null},S.unstable_continueExecution=function(){xe||Be||(xe=!0,i(rt))},S.unstable_getCurrentPriorityLevel=function(){return Ve},S.unstable_getFirstCallbackNode=function(){return ae(we)},S.unstable_next=function(Pt){switch(Ve){case 1:case 2:case 3:var Vt=3;break;default:Vt=Ve}var hn=Ve;Ve=Vt;try{return Pt()}finally{Ve=hn}},S.unstable_pauseExecution=function(){},S.unstable_requestPaint=en,S.unstable_runWithPriority=function(Pt,Vt){switch(Pt){case 1:case 2:case 3:case 4:case 5:break;default:Pt=3}var hn=Ve;Ve=Pt;try{return Vt()}finally{Ve=hn}},S.unstable_scheduleCallback=function(Pt,Vt,hn){var vn=S.unstable_now();switch(hn="object"==typeof hn&&null!==hn&&"number"==typeof(hn=hn.delay)&&0<hn?vn+hn:vn,Pt){case 1:var mt=-1;break;case 2:mt=250;break;case 5:mt=1073741823;break;case 4:mt=1e4;break;default:mt=5e3}return Pt={id:st++,callback:Vt,priorityLevel:Pt,startTime:hn,expirationTime:mt=hn+mt,sortIndex:-1},hn>vn?(Pt.sortIndex=hn,ge(ue,Pt),null===ae(we)&&Pt===ae(ue)&&(je?a():je=!0,r(Bt,hn-vn))):(Pt.sortIndex=mt,ge(we,Pt),xe||Be||(xe=!0,i(rt))),Pt},S.unstable_wrapCallback=function(Pt){var Vt=Ve;return function(){var hn=Ve;Ve=Vt;try{return Pt.apply(this,arguments)}finally{Ve=hn}}}},88712:(m,S,i)=>{"use strict";m.exports=i(59771)},4043:m=>{"use strict";class S extends Error{constructor(y){super(S._prepareSuperMessage(y)),Object.defineProperty(this,"name",{value:"NonError",configurable:!0,writable:!0}),Error.captureStackTrace&&Error.captureStackTrace(this,S)}static _prepareSuperMessage(y){try{return JSON.stringify(y)}catch(T){return String(y)}}}const i=[{property:"name",enumerable:!1},{property:"message",enumerable:!1},{property:"stack",enumerable:!1},{property:"code",enumerable:!0}],r=Symbol(".toJSON called"),f=({from:p,seen:y,to_:T,forceEnumerable:C,maxDepth:R,depth:L})=>{const z=T||(Array.isArray(p)?[]:{});if(y.push(p),L>=R)return z;if("function"==typeof p.toJSON&&!0!==p[r])return(p=>{p[r]=!0;const y=p.toJSON();return delete p[r],y})(p);for(const[W,J]of Object.entries(p))if("function"==typeof Buffer&&Buffer.isBuffer(J))z[W]="[object Buffer]";else if("function"!=typeof J){if(!J||"object"!=typeof J){z[W]=J;continue}if(!y.includes(p[W])){L++,z[W]=f({from:p[W],seen:y.slice(),forceEnumerable:C,maxDepth:R,depth:L});continue}z[W]="[Circular]"}for(const{property:W,enumerable:J}of i)"string"==typeof p[W]&&Object.defineProperty(z,W,{value:p[W],enumerable:!!C||J,configurable:!0,writable:!0});return z};m.exports={serializeError:(p,y={})=>{const{maxDepth:T=Number.POSITIVE_INFINITY}=y;return"object"==typeof p&&null!==p?f({from:p,seen:[],forceEnumerable:!0,maxDepth:T,depth:0}):"function"==typeof p?`[Function: ${p.name||"anonymous"}]`:p},deserializeError:(p,y={})=>{const{maxDepth:T=Number.POSITIVE_INFINITY}=y;if(p instanceof Error)return p;if("object"==typeof p&&null!==p&&!Array.isArray(p)){const C=new Error;return f({from:p,seen:[],to_:C,maxDepth:T,depth:0}),C}return new S(p)}}},11144:(m,S,i)=>{"use strict";var r=i(18540),a=i(19568),f=i(81380),c=r("%TypeError%"),e=r("%WeakMap%",!0),p=r("%Map%",!0),y=a("WeakMap.prototype.get",!0),T=a("WeakMap.prototype.set",!0),C=a("WeakMap.prototype.has",!0),R=a("Map.prototype.get",!0),L=a("Map.prototype.set",!0),z=a("Map.prototype.has",!0),W=function(ie,U){for(var ge,se=ie;null!==(ge=se.next);se=ge)if(ge.key===U)return se.next=ge.next,ge.next=ie.next,ie.next=ge,ge};m.exports=function(){var U,se,ge,ae={assert:function(he){if(!ae.has(he))throw new c("Side channel does not contain "+f(he))},get:function(he){if(e&&he&&("object"==typeof he||"function"==typeof he)){if(U)return y(U,he)}else if(p){if(se)return R(se,he)}else if(ge)return function(ie,U){var se=W(ie,U);return se&&se.value}(ge,he)},has:function(he){if(e&&he&&("object"==typeof he||"function"==typeof he)){if(U)return C(U,he)}else if(p){if(se)return z(se,he)}else if(ge)return function(ie,U){return!!W(ie,U)}(ge,he);return!1},set:function(he,be){e&&he&&("object"==typeof he||"function"==typeof he)?(U||(U=new e),T(U,he,be)):p?(se||(se=new p),L(se,he,be)):(ge||(ge={key:{},next:null}),function(ie,U,se){var ge=W(ie,U);ge?ge.value=se:ie.next={key:U,next:ie.next,value:se}}(ge,he,be))}};return ae}},85770:(m,S,i)=>{"use strict";i.d(S,{M:()=>Bi,t:()=>to}),i(21581),i(8868),i(85443),i(35704),i(66837),i(13744),i(63438),i(22603);var Yt,C=i(6123),R=i.n(C),L=i(86906),z=i.n(L),W=i(66941),J=i.n(W),ee=[],U="ResizeObserver loop completed with undelivered notifications.",ge=(()=>{return(Gt=ge||(ge={})).BORDER_BOX="border-box",Gt.CONTENT_BOX="content-box",Gt.DEVICE_PIXEL_CONTENT_BOX="device-pixel-content-box",ge;var Gt})(),ae=function(Gt){return Object.freeze(Gt)},he=function Gt(Rn,_t){this.inlineSize=Rn,this.blockSize=_t,ae(this)},be=function(){function Gt(Rn,_t,Rt,ct){return this.x=Rn,this.y=_t,this.width=Rt,this.height=ct,this.top=this.y,this.left=this.x,this.bottom=this.top+this.height,this.right=this.left+this.width,ae(this)}return Gt.prototype.toJSON=function(){var Rn=this;return{x:Rn.x,y:Rn.y,top:Rn.top,right:Rn.right,bottom:Rn.bottom,left:Rn.left,width:Rn.width,height:Rn.height}},Gt.fromRect=function(Rn){return new Gt(Rn.x,Rn.y,Rn.width,Rn.height)},Gt}(),we=function(Gt){return Gt instanceof SVGElement&&"getBBox"in Gt},ue=function(Gt){if(we(Gt)){var Rn=Gt.getBBox();return!Rn.width&&!Rn.height}return!(Gt.offsetWidth||Gt.offsetHeight||Gt.getClientRects().length)},st=function(Gt){var Rn;if(Gt instanceof Element)return!0;var _t=null===(Rn=null==Gt?void 0:Gt.ownerDocument)||void 0===Rn?void 0:Rn.defaultView;return!!(_t&&Gt instanceof _t.Element)},Ve="undefined"!=typeof window?window:{},Be=new WeakMap,xe=/auto|scroll/,je=/^tb|vertical/,Ne=/msie|trident/i.test(Ve.navigator&&Ve.navigator.userAgent),Bt=function(Gt){return parseFloat(Gt||"0")},rt=function(Gt,Rn,_t){return void 0===Gt&&(Gt=0),void 0===Rn&&(Rn=0),void 0===_t&&(_t=!1),new he((_t?Rn:Gt)||0,(_t?Gt:Rn)||0)},en=ae({devicePixelContentBoxSize:rt(),borderBoxSize:rt(),contentBoxSize:rt(),contentRect:new be(0,0,0,0)}),Pt=function(Gt,Rn){if(void 0===Rn&&(Rn=!1),Be.has(Gt)&&!Rn)return Be.get(Gt);if(ue(Gt))return Be.set(Gt,en),en;var _t=getComputedStyle(Gt),Rt=we(Gt)&&Gt.ownerSVGElement&&Gt.getBBox(),ct=!Ne&&"border-box"===_t.boxSizing,pt=je.test(_t.writingMode||""),kt=!Rt&&xe.test(_t.overflowY||""),dn=!Rt&&xe.test(_t.overflowX||""),mr=Rt?0:Bt(_t.paddingTop),Oi=Rt?0:Bt(_t.paddingRight),di=Rt?0:Bt(_t.paddingBottom),Uo=Rt?0:Bt(_t.paddingLeft),Qo=Rt?0:Bt(_t.borderTopWidth),lo=Rt?0:Bt(_t.borderRightWidth),Ai=Rt?0:Bt(_t.borderBottomWidth),Ko=Uo+Oi,qn=mr+di,ei=(Rt?0:Bt(_t.borderLeftWidth))+lo,wn=Qo+Ai,Qn=dn?Gt.offsetHeight-wn-Gt.clientHeight:0,Fr=kt?Gt.offsetWidth-ei-Gt.clientWidth:0,oo=ct?Ko+ei:0,Li=ct?qn+wn:0,yo=Rt?Rt.width:Bt(_t.width)-oo-Fr,go=Rt?Rt.height:Bt(_t.height)-Li-Qn,Go=yo+Ko+Fr+ei,ua=go+qn+Qn+wn,er=ae({devicePixelContentBoxSize:rt(Math.round(yo*devicePixelRatio),Math.round(go*devicePixelRatio),pt),borderBoxSize:rt(Go,ua,pt),contentBoxSize:rt(yo,go,pt),contentRect:new be(Uo,mr,yo,go)});return Be.set(Gt,er),er},Vt=function(Gt,Rn,_t){var Rt=Pt(Gt,_t),ct=Rt.borderBoxSize,pt=Rt.contentBoxSize,kt=Rt.devicePixelContentBoxSize;switch(Rn){case ge.DEVICE_PIXEL_CONTENT_BOX:return kt;case ge.BORDER_BOX:return ct;default:return pt}},hn=function Gt(Rn){var _t=Pt(Rn);this.target=Rn,this.contentRect=_t.contentRect,this.borderBoxSize=ae([_t.borderBoxSize]),this.contentBoxSize=ae([_t.contentBoxSize]),this.devicePixelContentBoxSize=ae([_t.devicePixelContentBoxSize])},vn=function(Gt){if(ue(Gt))return 1/0;for(var Rn=0,_t=Gt.parentNode;_t;)Rn+=1,_t=_t.parentNode;return Rn},mt=function(){var Gt=1/0,Rn=[];ee.forEach(function(kt){if(0!==kt.activeTargets.length){var dn=[];kt.activeTargets.forEach(function(Oi){var di=new hn(Oi.target),Uo=vn(Oi.target);dn.push(di),Oi.lastReportedSize=Vt(Oi.target,Oi.observedBox),Uo<Gt&&(Gt=Uo)}),Rn.push(function(){kt.callback.call(kt.observer,dn,kt.observer)}),kt.activeTargets.splice(0,kt.activeTargets.length)}});for(var _t=0,Rt=Rn;_t<Rt.length;_t++)(0,Rt[_t])();return Gt},Nt=function(Gt){ee.forEach(function(_t){_t.activeTargets.splice(0,_t.activeTargets.length),_t.skippedTargets.splice(0,_t.skippedTargets.length),_t.observationTargets.forEach(function(ct){ct.isActive()&&(vn(ct.target)>Gt?_t.activeTargets.push(ct):_t.skippedTargets.push(ct))})})},Fn=[],ur=0,Pn={attributes:!0,characterData:!0,childList:!0,subtree:!0},Xn=["resize","load","transitionend","animationend","animationstart","animationiteration","keyup","keydown","mouseup","mousedown","mouseover","mouseout","blur","focus"],dr=function(Gt){return void 0===Gt&&(Gt=0),Date.now()+Gt},Qr=!1,_i=new(function(){function Gt(){var Rn=this;this.stopped=!0,this.listener=function(){return Rn.schedule()}}return Gt.prototype.run=function(Rn){var _t=this;if(void 0===Rn&&(Rn=250),!Qr){Qr=!0;var Rt=dr(Rn);!function(Gt){!function(Gt){if(!Yt){var Rn=0,_t=document.createTextNode("");new MutationObserver(function(){return Fn.splice(0).forEach(function(Gt){return Gt()})}).observe(_t,{characterData:!0}),Yt=function(){_t.textContent="".concat(Rn?Rn--:Rn++)}}Fn.push(Gt),Yt()}(function(){requestAnimationFrame(Gt)})}(function(){var ct=!1;try{ct=function(){var Gt=0;for(Nt(Gt);ee.some(function(Gt){return Gt.activeTargets.length>0});)Gt=mt(),Nt(Gt);return ee.some(function(Gt){return Gt.skippedTargets.length>0})&&function(){var Gt;"function"==typeof ErrorEvent?Gt=new ErrorEvent("error",{message:U}):((Gt=document.createEvent("Event")).initEvent("error",!1,!1),Gt.message=U),window.dispatchEvent(Gt)}(),Gt>0}()}finally{if(Qr=!1,Rn=Rt-dr(),!ur)return;ct?_t.run(1e3):Rn>0?_t.run(Rn):_t.start()}})}},Gt.prototype.schedule=function(){this.stop(),this.run()},Gt.prototype.observe=function(){var Rn=this,_t=function(){return Rn.observer&&Rn.observer.observe(document.body,Pn)};document.body?_t():Ve.addEventListener("DOMContentLoaded",_t)},Gt.prototype.start=function(){var Rn=this;this.stopped&&(this.stopped=!1,this.observer=new MutationObserver(this.listener),this.observe(),Xn.forEach(function(_t){return Ve.addEventListener(_t,Rn.listener,!0)}))},Gt.prototype.stop=function(){var Rn=this;this.stopped||(this.observer&&this.observer.disconnect(),Xn.forEach(function(_t){return Ve.removeEventListener(_t,Rn.listener,!0)}),this.stopped=!0)},Gt}()),so=function(Gt){!ur&&Gt>0&&_i.start(),!(ur+=Gt)&&_i.stop()},Sr=function(){function Gt(Rn,_t){this.target=Rn,this.observedBox=_t||ge.CONTENT_BOX,this.lastReportedSize={inlineSize:0,blockSize:0}}return Gt.prototype.isActive=function(){var Rn=Vt(this.target,this.observedBox,!0);return function(Gt){return!we(Gt)&&!function(Gt){switch(Gt.tagName){case"INPUT":if("image"!==Gt.type)break;case"VIDEO":case"AUDIO":case"EMBED":case"OBJECT":case"CANVAS":case"IFRAME":case"IMG":return!0}return!1}(Gt)&&"inline"===getComputedStyle(Gt).display}(this.target)&&(this.lastReportedSize=Rn),this.lastReportedSize.inlineSize!==Rn.inlineSize||this.lastReportedSize.blockSize!==Rn.blockSize},Gt}(),Kt=function Gt(Rn,_t){this.activeTargets=[],this.skippedTargets=[],this.observationTargets=[],this.observer=Rn,this.callback=_t},un=new WeakMap,jn=function(Gt,Rn){for(var _t=0;_t<Gt.length;_t+=1)if(Gt[_t].target===Rn)return _t;return-1},Jn=function(){function Gt(){}return Gt.connect=function(Rn,_t){var Rt=new Kt(Rn,_t);un.set(Rn,Rt)},Gt.observe=function(Rn,_t,Rt){var ct=un.get(Rn),pt=0===ct.observationTargets.length;jn(ct.observationTargets,_t)<0&&(pt&&ee.push(ct),ct.observationTargets.push(new Sr(_t,Rt&&Rt.box)),so(1),_i.schedule())},Gt.unobserve=function(Rn,_t){var Rt=un.get(Rn),ct=jn(Rt.observationTargets,_t);ct>=0&&(1===Rt.observationTargets.length&&ee.splice(ee.indexOf(Rt),1),Rt.observationTargets.splice(ct,1),so(-1))},Gt.disconnect=function(Rn){var _t=this,Rt=un.get(Rn);Rt.observationTargets.slice().forEach(function(ct){return _t.unobserve(Rn,ct.target)}),Rt.activeTargets.splice(0,Rt.activeTargets.length)},Gt}(),Gn=function(){function Gt(Rn){if(0===arguments.length)throw new TypeError("Failed to construct 'ResizeObserver': 1 argument required, but only 0 present.");if("function"!=typeof Rn)throw new TypeError("Failed to construct 'ResizeObserver': The callback provided as parameter 1 is not a function.");Jn.connect(this,Rn)}return Gt.prototype.observe=function(Rn,_t){if(0===arguments.length)throw new TypeError("Failed to execute 'observe' on 'ResizeObserver': 1 argument required, but only 0 present.");if(!st(Rn))throw new TypeError("Failed to execute 'observe' on 'ResizeObserver': parameter 1 is not of type 'Element");Jn.observe(this,Rn,_t)},Gt.prototype.unobserve=function(Rn){if(0===arguments.length)throw new TypeError("Failed to execute 'unobserve' on 'ResizeObserver': 1 argument required, but only 0 present.");if(!st(Rn))throw new TypeError("Failed to execute 'unobserve' on 'ResizeObserver': parameter 1 is not of type 'Element");Jn.unobserve(this,Rn)},Gt.prototype.disconnect=function(){Jn.disconnect(this)},Gt.toString=function(){return"function ResizeObserver () { [polyfill code] }"},Gt}(),Xr=i(72318),Zi=i.n(Xr);function Zn(Gt){return Gt&&Gt.ownerDocument&&Gt.ownerDocument.defaultView?Gt.ownerDocument.defaultView:window}function cn(Gt){return Gt&&Gt.ownerDocument?Gt.ownerDocument:document}i(35319),i(69665),i(26954),i(80477),i(66262);var Sn=null,Or=null;function ri(Gt){if(null===Sn){var Rn=cn(Gt);if(void 0===Rn)return Sn=0;var _t=Rn.body,Rt=Rn.createElement("div");Rt.classList.add("simplebar-hide-scrollbar"),_t.appendChild(Rt);var ct=Rt.getBoundingClientRect().right;_t.removeChild(Rt),Sn=ct}return Sn}Zi()&&window.addEventListener("resize",function(){Or!==window.devicePixelRatio&&(Or=window.devicePixelRatio,Sn=null)});var vi=function(){function Gt(_t,Rt){var ct=this;this.onScroll=function(){var pt=Zn(ct.el);ct.scrollXTicking||(pt.requestAnimationFrame(ct.scrollX),ct.scrollXTicking=!0),ct.scrollYTicking||(pt.requestAnimationFrame(ct.scrollY),ct.scrollYTicking=!0)},this.scrollX=function(){ct.axis.x.isOverflowing&&(ct.showScrollbar("x"),ct.positionScrollbar("x")),ct.scrollXTicking=!1},this.scrollY=function(){ct.axis.y.isOverflowing&&(ct.showScrollbar("y"),ct.positionScrollbar("y")),ct.scrollYTicking=!1},this.onMouseEnter=function(){ct.showScrollbar("x"),ct.showScrollbar("y")},this.onMouseMove=function(pt){ct.mouseX=pt.clientX,ct.mouseY=pt.clientY,(ct.axis.x.isOverflowing||ct.axis.x.forceVisible)&&ct.onMouseMoveForAxis("x"),(ct.axis.y.isOverflowing||ct.axis.y.forceVisible)&&ct.onMouseMoveForAxis("y")},this.onMouseLeave=function(){ct.onMouseMove.cancel(),(ct.axis.x.isOverflowing||ct.axis.x.forceVisible)&&ct.onMouseLeaveForAxis("x"),(ct.axis.y.isOverflowing||ct.axis.y.forceVisible)&&ct.onMouseLeaveForAxis("y"),ct.mouseX=-1,ct.mouseY=-1},this.onWindowResize=function(){ct.scrollbarWidth=ct.getScrollbarWidth(),ct.hideNativeScrollbar()},this.hideScrollbars=function(){ct.axis.x.track.rect=ct.axis.x.track.el.getBoundingClientRect(),ct.axis.y.track.rect=ct.axis.y.track.el.getBoundingClientRect(),ct.isWithinBounds(ct.axis.y.track.rect)||(ct.axis.y.scrollbar.el.classList.remove(ct.classNames.visible),ct.axis.y.isVisible=!1),ct.isWithinBounds(ct.axis.x.track.rect)||(ct.axis.x.scrollbar.el.classList.remove(ct.classNames.visible),ct.axis.x.isVisible=!1)},this.onPointerEvent=function(pt){var kt,dn;ct.axis.x.track.rect=ct.axis.x.track.el.getBoundingClientRect(),ct.axis.y.track.rect=ct.axis.y.track.el.getBoundingClientRect(),(ct.axis.x.isOverflowing||ct.axis.x.forceVisible)&&(kt=ct.isWithinBounds(ct.axis.x.track.rect)),(ct.axis.y.isOverflowing||ct.axis.y.forceVisible)&&(dn=ct.isWithinBounds(ct.axis.y.track.rect)),(kt||dn)&&(pt.preventDefault(),pt.stopPropagation(),"mousedown"===pt.type&&(kt&&(ct.axis.x.scrollbar.rect=ct.axis.x.scrollbar.el.getBoundingClientRect(),ct.isWithinBounds(ct.axis.x.scrollbar.rect)?ct.onDragStart(pt,"x"):ct.onTrackClick(pt,"x")),dn&&(ct.axis.y.scrollbar.rect=ct.axis.y.scrollbar.el.getBoundingClientRect(),ct.isWithinBounds(ct.axis.y.scrollbar.rect)?ct.onDragStart(pt,"y"):ct.onTrackClick(pt,"y"))))},this.drag=function(pt){var dn=ct.axis[ct.draggedAxis].track,mr=dn.rect[ct.axis[ct.draggedAxis].sizeAttr],Oi=ct.axis[ct.draggedAxis].scrollbar,di=ct.contentWrapperEl[ct.axis[ct.draggedAxis].scrollSizeAttr],Uo=parseInt(ct.elStyles[ct.axis[ct.draggedAxis].sizeAttr],10);pt.preventDefault(),pt.stopPropagation();var Ai=(("y"===ct.draggedAxis?pt.pageY:pt.pageX)-dn.rect[ct.axis[ct.draggedAxis].offsetAttr]-ct.axis[ct.draggedAxis].dragOffset)/(mr-Oi.size)*(di-Uo);"x"===ct.draggedAxis&&(Ai=ct.isRtl&&Gt.getRtlHelpers().isRtlScrollbarInverted?Ai-(mr+Oi.size):Ai,Ai=ct.isRtl&&Gt.getRtlHelpers().isRtlScrollingInverted?-Ai:Ai),ct.contentWrapperEl[ct.axis[ct.draggedAxis].scrollOffsetAttr]=Ai},this.onEndDrag=function(pt){var kt=cn(ct.el),dn=Zn(ct.el);pt.preventDefault(),pt.stopPropagation(),ct.el.classList.remove(ct.classNames.dragging),kt.removeEventListener("mousemove",ct.drag,!0),kt.removeEventListener("mouseup",ct.onEndDrag,!0),ct.removePreventClickId=dn.setTimeout(function(){kt.removeEventListener("click",ct.preventClick,!0),kt.removeEventListener("dblclick",ct.preventClick,!0),ct.removePreventClickId=null})},this.preventClick=function(pt){pt.preventDefault(),pt.stopPropagation()},this.el=_t,this.minScrollbarWidth=20,this.options=Object.assign({},Gt.defaultOptions,Rt),this.classNames=Object.assign({},Gt.defaultOptions.classNames,this.options.classNames),this.axis={x:{scrollOffsetAttr:"scrollLeft",sizeAttr:"width",scrollSizeAttr:"scrollWidth",offsetSizeAttr:"offsetWidth",offsetAttr:"left",overflowAttr:"overflowX",dragOffset:0,isOverflowing:!0,isVisible:!1,forceVisible:!1,track:{},scrollbar:{}},y:{scrollOffsetAttr:"scrollTop",sizeAttr:"height",scrollSizeAttr:"scrollHeight",offsetSizeAttr:"offsetHeight",offsetAttr:"top",overflowAttr:"overflowY",dragOffset:0,isOverflowing:!0,isVisible:!1,forceVisible:!1,track:{},scrollbar:{}}},this.removePreventClickId=null,!Gt.instances.has(this.el)&&(this.recalculate=R()(this.recalculate.bind(this),64),this.onMouseMove=R()(this.onMouseMove.bind(this),64),this.hideScrollbars=z()(this.hideScrollbars.bind(this),this.options.timeout),this.onWindowResize=z()(this.onWindowResize.bind(this),64,{leading:!0}),Gt.getRtlHelpers=J()(Gt.getRtlHelpers),this.init())}Gt.getRtlHelpers=function(){var Rt=document.createElement("div");Rt.innerHTML='<div class="hs-dummy-scrollbar-size"><div style="height: 200%; width: 200%; margin: 10px 0;"></div></div>';var ct=Rt.firstElementChild;document.body.appendChild(ct);var pt=ct.firstElementChild;ct.scrollLeft=0;var kt=Gt.getOffset(ct),dn=Gt.getOffset(pt);ct.scrollLeft=999;var mr=Gt.getOffset(pt);return{isRtlScrollingInverted:kt.left!==dn.left&&dn.left-mr.left!=0,isRtlScrollbarInverted:kt.left!==dn.left}},Gt.getOffset=function(Rt){var ct=Rt.getBoundingClientRect(),pt=cn(Rt),kt=Zn(Rt);return{top:ct.top+(kt.pageYOffset||pt.documentElement.scrollTop),left:ct.left+(kt.pageXOffset||pt.documentElement.scrollLeft)}};var Rn=Gt.prototype;return Rn.init=function(){Gt.instances.set(this.el,this),Zi()&&(this.initDOM(),this.setAccessibilityAttributes(),this.scrollbarWidth=this.getScrollbarWidth(),this.recalculate(),this.initListeners())},Rn.initDOM=function(){var Rt=this;if(Array.prototype.filter.call(this.el.children,function(kt){return kt.classList.contains(Rt.classNames.wrapper)}).length)this.wrapperEl=this.el.querySelector("."+this.classNames.wrapper),this.contentWrapperEl=this.options.scrollableNode||this.el.querySelector("."+this.classNames.contentWrapper),this.contentEl=this.options.contentNode||this.el.querySelector("."+this.classNames.contentEl),this.offsetEl=this.el.querySelector("."+this.classNames.offset),this.maskEl=this.el.querySelector("."+this.classNames.mask),this.placeholderEl=this.findChild(this.wrapperEl,"."+this.classNames.placeholder),this.heightAutoObserverWrapperEl=this.el.querySelector("."+this.classNames.heightAutoObserverWrapperEl),this.heightAutoObserverEl=this.el.querySelector("."+this.classNames.heightAutoObserverEl),this.axis.x.track.el=this.findChild(this.el,"."+this.classNames.track+"."+this.classNames.horizontal),this.axis.y.track.el=this.findChild(this.el,"."+this.classNames.track+"."+this.classNames.vertical);else{for(this.wrapperEl=document.createElement("div"),this.contentWrapperEl=document.createElement("div"),this.offsetEl=document.createElement("div"),this.maskEl=document.createElement("div"),this.contentEl=document.createElement("div"),this.placeholderEl=document.createElement("div"),this.heightAutoObserverWrapperEl=document.createElement("div"),this.heightAutoObserverEl=document.createElement("div"),this.wrapperEl.classList.add(this.classNames.wrapper),this.contentWrapperEl.classList.add(this.classNames.contentWrapper),this.offsetEl.classList.add(this.classNames.offset),this.maskEl.classList.add(this.classNames.mask),this.contentEl.classList.add(this.classNames.contentEl),this.placeholderEl.classList.add(this.classNames.placeholder),this.heightAutoObserverWrapperEl.classList.add(this.classNames.heightAutoObserverWrapperEl),this.heightAutoObserverEl.classList.add(this.classNames.heightAutoObserverEl);this.el.firstChild;)this.contentEl.appendChild(this.el.firstChild);this.contentWrapperEl.appendChild(this.contentEl),this.offsetEl.appendChild(this.contentWrapperEl),this.maskEl.appendChild(this.offsetEl),this.heightAutoObserverWrapperEl.appendChild(this.heightAutoObserverEl),this.wrapperEl.appendChild(this.heightAutoObserverWrapperEl),this.wrapperEl.appendChild(this.maskEl),this.wrapperEl.appendChild(this.placeholderEl),this.el.appendChild(this.wrapperEl)}if(!this.axis.x.track.el||!this.axis.y.track.el){var ct=document.createElement("div"),pt=document.createElement("div");ct.classList.add(this.classNames.track),pt.classList.add(this.classNames.scrollbar),ct.appendChild(pt),this.axis.x.track.el=ct.cloneNode(!0),this.axis.x.track.el.classList.add(this.classNames.horizontal),this.axis.y.track.el=ct.cloneNode(!0),this.axis.y.track.el.classList.add(this.classNames.vertical),this.el.appendChild(this.axis.x.track.el),this.el.appendChild(this.axis.y.track.el)}this.axis.x.scrollbar.el=this.axis.x.track.el.querySelector("."+this.classNames.scrollbar),this.axis.y.scrollbar.el=this.axis.y.track.el.querySelector("."+this.classNames.scrollbar),this.options.autoHide||(this.axis.x.scrollbar.el.classList.add(this.classNames.visible),this.axis.y.scrollbar.el.classList.add(this.classNames.visible)),this.el.setAttribute("data-simplebar","init")},Rn.setAccessibilityAttributes=function(){var Rt=this.options.ariaLabel||"scrollable content";this.contentWrapperEl.setAttribute("tabindex","0"),this.contentWrapperEl.setAttribute("role","region"),this.contentWrapperEl.setAttribute("aria-label",Rt)},Rn.initListeners=function(){var Rt=this,ct=Zn(this.el);this.options.autoHide&&this.el.addEventListener("mouseenter",this.onMouseEnter),["mousedown","click","dblclick"].forEach(function(mr){Rt.el.addEventListener(mr,Rt.onPointerEvent,!0)}),["touchstart","touchend","touchmove"].forEach(function(mr){Rt.el.addEventListener(mr,Rt.onPointerEvent,{capture:!0,passive:!0})}),this.el.addEventListener("mousemove",this.onMouseMove),this.el.addEventListener("mouseleave",this.onMouseLeave),this.contentWrapperEl.addEventListener("scroll",this.onScroll),ct.addEventListener("resize",this.onWindowResize);var pt=!1,kt=null;this.resizeObserver=new(ct.ResizeObserver||Gn)(function(){!pt||null!==kt||(kt=ct.requestAnimationFrame(function(){Rt.recalculate(),kt=null}))}),this.resizeObserver.observe(this.el),this.resizeObserver.observe(this.contentEl),ct.requestAnimationFrame(function(){pt=!0}),this.mutationObserver=new ct.MutationObserver(this.recalculate),this.mutationObserver.observe(this.contentEl,{childList:!0,subtree:!0,characterData:!0})},Rn.recalculate=function(){var Rt=Zn(this.el);this.elStyles=Rt.getComputedStyle(this.el),this.isRtl="rtl"===this.elStyles.direction;var ct=this.heightAutoObserverEl.offsetHeight<=1,pt=this.heightAutoObserverEl.offsetWidth<=1,kt=this.contentEl.offsetWidth,dn=this.contentWrapperEl.offsetWidth,mr=this.elStyles.overflowX,Oi=this.elStyles.overflowY;this.contentEl.style.padding=this.elStyles.paddingTop+" "+this.elStyles.paddingRight+" "+this.elStyles.paddingBottom+" "+this.elStyles.paddingLeft,this.wrapperEl.style.margin="-"+this.elStyles.paddingTop+" -"+this.elStyles.paddingRight+" -"+this.elStyles.paddingBottom+" -"+this.elStyles.paddingLeft;var di=this.contentEl.scrollHeight,Uo=this.contentEl.scrollWidth;this.contentWrapperEl.style.height=ct?"auto":"100%",this.placeholderEl.style.width=pt?kt+"px":"auto",this.placeholderEl.style.height=di+"px";var Qo=this.contentWrapperEl.offsetHeight;this.axis.x.isOverflowing=Uo>kt,this.axis.y.isOverflowing=di>Qo,this.axis.x.isOverflowing="hidden"!==mr&&this.axis.x.isOverflowing,this.axis.y.isOverflowing="hidden"!==Oi&&this.axis.y.isOverflowing,this.axis.x.forceVisible="x"===this.options.forceVisible||!0===this.options.forceVisible,this.axis.y.forceVisible="y"===this.options.forceVisible||!0===this.options.forceVisible,this.hideNativeScrollbar();var lo=this.axis.x.isOverflowing?this.scrollbarWidth:0;this.axis.x.isOverflowing=this.axis.x.isOverflowing&&Uo>dn-(this.axis.y.isOverflowing?this.scrollbarWidth:0),this.axis.y.isOverflowing=this.axis.y.isOverflowing&&di>Qo-lo,this.axis.x.scrollbar.size=this.getScrollbarSize("x"),this.axis.y.scrollbar.size=this.getScrollbarSize("y"),this.axis.x.scrollbar.el.style.width=this.axis.x.scrollbar.size+"px",this.axis.y.scrollbar.el.style.height=this.axis.y.scrollbar.size+"px",this.positionScrollbar("x"),this.positionScrollbar("y"),this.toggleTrackVisibility("x"),this.toggleTrackVisibility("y")},Rn.getScrollbarSize=function(Rt){if(void 0===Rt&&(Rt="y"),!this.axis[Rt].isOverflowing)return 0;var kt,pt=this.axis[Rt].track.el[this.axis[Rt].offsetSizeAttr];return kt=Math.max(~~(pt/this.contentEl[this.axis[Rt].scrollSizeAttr]*pt),this.options.scrollbarMinSize),this.options.scrollbarMaxSize&&(kt=Math.min(kt,this.options.scrollbarMaxSize)),kt},Rn.positionScrollbar=function(Rt){if(void 0===Rt&&(Rt="y"),this.axis[Rt].isOverflowing){var ct=this.contentWrapperEl[this.axis[Rt].scrollSizeAttr],pt=this.axis[Rt].track.el[this.axis[Rt].offsetSizeAttr],kt=parseInt(this.elStyles[this.axis[Rt].sizeAttr],10),dn=this.axis[Rt].scrollbar,mr=this.contentWrapperEl[this.axis[Rt].scrollOffsetAttr],di=~~((mr="x"===Rt&&this.isRtl&&Gt.getRtlHelpers().isRtlScrollingInverted?-mr:mr)/(ct-kt)*(pt-dn.size));di="x"===Rt&&this.isRtl&&Gt.getRtlHelpers().isRtlScrollbarInverted?di+(pt-dn.size):di,dn.el.style.transform="x"===Rt?"translate3d("+di+"px, 0, 0)":"translate3d(0, "+di+"px, 0)"}},Rn.toggleTrackVisibility=function(Rt){void 0===Rt&&(Rt="y");var ct=this.axis[Rt].track.el,pt=this.axis[Rt].scrollbar.el;this.axis[Rt].isOverflowing||this.axis[Rt].forceVisible?(ct.style.visibility="visible",this.contentWrapperEl.style[this.axis[Rt].overflowAttr]="scroll"):(ct.style.visibility="hidden",this.contentWrapperEl.style[this.axis[Rt].overflowAttr]="hidden"),pt.style.display=this.axis[Rt].isOverflowing?"block":"none"},Rn.hideNativeScrollbar=function(){this.offsetEl.style[this.isRtl?"left":"right"]=this.axis.y.isOverflowing||this.axis.y.forceVisible?"-"+this.scrollbarWidth+"px":0,this.offsetEl.style.bottom=this.axis.x.isOverflowing||this.axis.x.forceVisible?"-"+this.scrollbarWidth+"px":0},Rn.onMouseMoveForAxis=function(Rt){void 0===Rt&&(Rt="y"),this.axis[Rt].track.rect=this.axis[Rt].track.el.getBoundingClientRect(),this.axis[Rt].scrollbar.rect=this.axis[Rt].scrollbar.el.getBoundingClientRect(),this.isWithinBounds(this.axis[Rt].scrollbar.rect)?this.axis[Rt].scrollbar.el.classList.add(this.classNames.hover):this.axis[Rt].scrollbar.el.classList.remove(this.classNames.hover),this.isWithinBounds(this.axis[Rt].track.rect)?(this.showScrollbar(Rt),this.axis[Rt].track.el.classList.add(this.classNames.hover)):this.axis[Rt].track.el.classList.remove(this.classNames.hover)},Rn.onMouseLeaveForAxis=function(Rt){void 0===Rt&&(Rt="y"),this.axis[Rt].track.el.classList.remove(this.classNames.hover),this.axis[Rt].scrollbar.el.classList.remove(this.classNames.hover)},Rn.showScrollbar=function(Rt){void 0===Rt&&(Rt="y"),this.axis[Rt].isVisible||(this.axis[Rt].scrollbar.el.classList.add(this.classNames.visible),this.axis[Rt].isVisible=!0),this.options.autoHide&&this.hideScrollbars()},Rn.onDragStart=function(Rt,ct){void 0===ct&&(ct="y");var pt=cn(this.el),kt=Zn(this.el);this.axis[ct].dragOffset=("y"===ct?Rt.pageY:Rt.pageX)-this.axis[ct].scrollbar.rect[this.axis[ct].offsetAttr],this.draggedAxis=ct,this.el.classList.add(this.classNames.dragging),pt.addEventListener("mousemove",this.drag,!0),pt.addEventListener("mouseup",this.onEndDrag,!0),null===this.removePreventClickId?(pt.addEventListener("click",this.preventClick,!0),pt.addEventListener("dblclick",this.preventClick,!0)):(kt.clearTimeout(this.removePreventClickId),this.removePreventClickId=null)},Rn.onTrackClick=function(Rt,ct){var pt=this;if(void 0===ct&&(ct="y"),this.options.clickOnTrack){var kt=Zn(this.el);this.axis[ct].scrollbar.rect=this.axis[ct].scrollbar.el.getBoundingClientRect();var mr=this.axis[ct].scrollbar.rect[this.axis[ct].offsetAttr],Oi=parseInt(this.elStyles[this.axis[ct].sizeAttr],10),di=this.contentWrapperEl[this.axis[ct].scrollOffsetAttr],Qo=("y"===ct?this.mouseY-mr:this.mouseX-mr)<0?-1:1,lo=-1===Qo?di-Oi:di+Oi;!function Fo(){var Ko;if(-1===Qo)di>lo&&(pt.contentWrapperEl.scrollTo(((Ko={})[pt.axis[ct].offsetAttr]=di-=pt.options.clickOnTrackSpeed,Ko)),kt.requestAnimationFrame(Fo));else if(di<lo){var qn;pt.contentWrapperEl.scrollTo(((qn={})[pt.axis[ct].offsetAttr]=di+=pt.options.clickOnTrackSpeed,qn)),kt.requestAnimationFrame(Fo)}}()}},Rn.getContentElement=function(){return this.contentEl},Rn.getScrollElement=function(){return this.contentWrapperEl},Rn.getScrollbarWidth=function(){try{return"none"===getComputedStyle(this.contentWrapperEl,"::-webkit-scrollbar").display||"scrollbarWidth"in document.documentElement.style||"-ms-overflow-style"in document.documentElement.style?0:ri(this.el)}catch(Rt){return ri(this.el)}},Rn.removeListeners=function(){var Rt=this,ct=Zn(this.el);this.options.autoHide&&this.el.removeEventListener("mouseenter",this.onMouseEnter),["mousedown","click","dblclick"].forEach(function(pt){Rt.el.removeEventListener(pt,Rt.onPointerEvent,!0)}),["touchstart","touchend","touchmove"].forEach(function(pt){Rt.el.removeEventListener(pt,Rt.onPointerEvent,{capture:!0,passive:!0})}),this.el.removeEventListener("mousemove",this.onMouseMove),this.el.removeEventListener("mouseleave",this.onMouseLeave),this.contentWrapperEl&&this.contentWrapperEl.removeEventListener("scroll",this.onScroll),ct.removeEventListener("resize",this.onWindowResize),this.mutationObserver&&this.mutationObserver.disconnect(),this.resizeObserver&&this.resizeObserver.disconnect(),this.recalculate.cancel(),this.onMouseMove.cancel(),this.hideScrollbars.cancel(),this.onWindowResize.cancel()},Rn.unMount=function(){this.removeListeners(),Gt.instances.delete(this.el)},Rn.isWithinBounds=function(Rt){return this.mouseX>=Rt.left&&this.mouseX<=Rt.left+Rt.width&&this.mouseY>=Rt.top&&this.mouseY<=Rt.top+Rt.height},Rn.findChild=function(Rt,ct){var pt=Rt.matches||Rt.webkitMatchesSelector||Rt.mozMatchesSelector||Rt.msMatchesSelector;return Array.prototype.filter.call(Rt.children,function(kt){return pt.call(kt,ct)})[0]},Gt}();vi.defaultOptions={autoHide:!0,forceVisible:!1,clickOnTrack:!0,clickOnTrackSpeed:40,classNames:{contentEl:"simplebar-content",contentWrapper:"simplebar-content-wrapper",offset:"simplebar-offset",mask:"simplebar-mask",wrapper:"simplebar-wrapper",placeholder:"simplebar-placeholder",scrollbar:"simplebar-scrollbar",track:"simplebar-track",heightAutoObserverWrapperEl:"simplebar-height-auto-observer-wrapper",heightAutoObserverEl:"simplebar-height-auto-observer",visible:"simplebar-visible",horizontal:"simplebar-horizontal",vertical:"simplebar-vertical",hover:"simplebar-hover",dragging:"simplebar-dragging"},scrollbarMinSize:25,scrollbarMaxSize:0,timeout:1e3},vi.instances=new WeakMap;const Ui=vi;var ao=i(89724);const dt=["*"];let Bi=(()=>{class Gt{constructor(_t){this.elRef=_t}ngOnInit(){}ngAfterViewInit(){this.SimpleBar=new Ui(this.elRef.nativeElement,this.options||{})}ngOnDestroy(){this.SimpleBar.unMount(),this.SimpleBar=null}}return Gt.\u0275fac=function(_t){return new(_t||Gt)(ao.Y36(ao.SBq))},Gt.\u0275cmp=ao.Xpm({type:Gt,selectors:[["ngx-simplebar"]],hostAttrs:["data-simplebar","init"],inputs:{options:"options"},ngContentSelectors:dt,decls:13,vars:0,consts:[[1,"simplebar-wrapper"],[1,"simplebar-height-auto-observer-wrapper"],[1,"simplebar-height-auto-observer"],[1,"simplebar-mask"],[1,"simplebar-offset"],[1,"simplebar-content-wrapper"],[1,"simplebar-content"],[1,"simplebar-placeholder"],[1,"simplebar-track","simplebar-horizontal"],[1,"simplebar-scrollbar"],[1,"simplebar-track","simplebar-vertical"]],template:function(_t,Rt){1&_t&&(ao.F$t(),ao.TgZ(0,"div",0)(1,"div",1),ao._UZ(2,"div",2),ao.qZA(),ao.TgZ(3,"div",3)(4,"div",4)(5,"div",5)(6,"div",6),ao.Hsn(7),ao.qZA()()()(),ao._UZ(8,"div",7),ao.qZA(),ao.TgZ(9,"div",8),ao._UZ(10,"div",9),ao.qZA(),ao.TgZ(11,"div",10),ao._UZ(12,"div",9),ao.qZA())},styles:["[data-simplebar]{position:relative;-webkit-box-orient:vertical;-webkit-box-direction:normal;flex-direction:column;flex-wrap:wrap;-webkit-box-pack:start;justify-content:flex-start;align-content:flex-start;-webkit-box-align:start;align-items:flex-start}.simplebar-wrapper{overflow:hidden;width:inherit;height:inherit;max-width:inherit;max-height:inherit}.simplebar-mask{direction:inherit;position:absolute;overflow:hidden;padding:0;margin:0;left:0;top:0;bottom:0;right:0;width:auto!important;height:auto!important;z-index:0}.simplebar-offset{direction:inherit!important;box-sizing:inherit!important;resize:none!important;position:absolute;top:0;left:0;bottom:0;right:0;padding:0;margin:0;-webkit-overflow-scrolling:touch}.simplebar-content-wrapper{direction:inherit;box-sizing:border-box!important;position:relative;display:block;height:100%;width:auto;max-width:100%;max-height:100%;scrollbar-width:none;-ms-overflow-style:none}.simplebar-content-wrapper::-webkit-scrollbar,.simplebar-hide-scrollbar::-webkit-scrollbar{width:0;height:0}.simplebar-content:after,.simplebar-content:before{content:' ';display:table}.simplebar-placeholder{max-height:100%;max-width:100%;width:100%;pointer-events:none}.simplebar-height-auto-observer-wrapper{box-sizing:inherit!important;height:100%;width:100%;max-width:1px;position:relative;float:left;max-height:1px;overflow:hidden;z-index:-1;padding:0;margin:0;pointer-events:none;-webkit-box-flex:inherit;flex-grow:inherit;flex-shrink:0;flex-basis:0}.simplebar-height-auto-observer{box-sizing:inherit;display:block;opacity:0;position:absolute;top:0;left:0;height:1000%;width:1000%;min-height:1px;min-width:1px;overflow:hidden;pointer-events:none;z-index:-1}.simplebar-track{z-index:1;position:absolute;right:0;bottom:0;pointer-events:none;overflow:hidden}[data-simplebar].simplebar-dragging .simplebar-content{pointer-events:none;-moz-user-select:none;-ms-user-select:none;user-select:none;-webkit-user-select:none}[data-simplebar].simplebar-dragging .simplebar-track{pointer-events:all}.simplebar-scrollbar{position:absolute;left:0;right:0;min-height:10px}.simplebar-scrollbar:before{position:absolute;content:'';background:#000;border-radius:7px;left:2px;right:2px;opacity:0;-webkit-transition:opacity .2s linear;transition:opacity .2s linear}.simplebar-scrollbar.simplebar-visible:before{opacity:.5;-webkit-transition:opacity linear;transition:opacity linear}.simplebar-track.simplebar-vertical{top:0;width:11px}.simplebar-track.simplebar-vertical .simplebar-scrollbar:before{top:2px;bottom:2px}.simplebar-track.simplebar-horizontal{left:0;height:11px}.simplebar-track.simplebar-horizontal .simplebar-scrollbar:before{height:100%;left:2px;right:2px}.simplebar-track.simplebar-horizontal .simplebar-scrollbar{right:auto;left:0;top:2px;height:7px;min-height:0;min-width:10px;width:auto}[data-simplebar-direction=rtl] .simplebar-track.simplebar-vertical{right:auto;left:0}.hs-dummy-scrollbar-size{direction:rtl;position:fixed;opacity:0;visibility:hidden;height:500px;width:500px;overflow-y:hidden;overflow-x:scroll}.simplebar-hide-scrollbar{position:fixed;left:0;visibility:hidden;overflow-y:scroll;scrollbar-width:none;-ms-overflow-style:none}","ngx-simplebar{display:block}"],encapsulation:2}),Gt})(),to=(()=>{class Gt{}return Gt.\u0275fac=function(_t){return new(_t||Gt)},Gt.\u0275mod=ao.oAB({type:Gt}),Gt.\u0275inj=ao.cJS({imports:[[]]}),Gt})()},35311:m=>{m.exports=function(){var S=document.getSelection();if(!S.rangeCount)return function(){};for(var i=document.activeElement,r=[],a=0;a<S.rangeCount;a++)r.push(S.getRangeAt(a));switch(i.tagName.toUpperCase()){case"INPUT":case"TEXTAREA":i.blur();break;default:i=null}return S.removeAllRanges(),function(){"Caret"===S.type&&S.removeAllRanges(),S.rangeCount||r.forEach(function(f){S.addRange(f)}),i&&i.focus()}}},18807:m=>{"use strict";function S(J){return Object.prototype.toString.call(J)}var p=Array.isArray||function(ee){return"[object Array]"===Object.prototype.toString.call(ee)};function y(J,ee){if(J.forEach)return J.forEach(ee);for(var ce=0;ce<J.length;ce++)ee(J[ce],ce,J)}var T=Object.keys||function(ee){var ce=[];for(var ie in ee)ce.push(ie);return ce},C=Object.prototype.hasOwnProperty||function(J,ee){return ee in J};function R(J){if("object"==typeof J&&null!==J){var ee;if(p(J))ee=[];else if(function i(J){return"[object Date]"===S(J)}(J))ee=new Date(J.getTime?J.getTime():J);else if(function r(J){return"[object RegExp]"===S(J)}(J))ee=new RegExp(J);else if(function a(J){return"[object Error]"===S(J)}(J))ee={message:J.message};else if(function f(J){return"[object Boolean]"===S(J)}(J)||function c(J){return"[object Number]"===S(J)}(J)||function e(J){return"[object String]"===S(J)}(J))ee=Object(J);else if(Object.create&&Object.getPrototypeOf)ee=Object.create(Object.getPrototypeOf(J));else if(J.constructor===Object)ee={};else{var ie=function(){};ie.prototype=J.constructor&&J.constructor.prototype||J.__proto__||{},ee=new ie}return y(T(J),function(U){ee[U]=J[U]}),ee}return J}function L(J,ee,ce){var ie=[],U=[],se=!0;return function ge(ae){var he=ce?R(ae):ae,be={},we=!0,ue={node:he,node_:ae,path:[].concat(ie),parent:U[U.length-1],parents:U,key:ie[ie.length-1],isRoot:0===ie.length,level:ie.length,circular:null,update:function(Ve,Be){ue.isRoot||(ue.parent.node[ue.key]=Ve),ue.node=Ve,Be&&(we=!1)},delete:function(Ve){delete ue.parent.node[ue.key],Ve&&(we=!1)},remove:function(Ve){p(ue.parent.node)?ue.parent.node.splice(ue.key,1):delete ue.parent.node[ue.key],Ve&&(we=!1)},keys:null,before:function(Ve){be.before=Ve},after:function(Ve){be.after=Ve},pre:function(Ve){be.pre=Ve},post:function(Ve){be.post=Ve},stop:function(){se=!1},block:function(){we=!1}};if(!se)return ue;function st(){if("object"==typeof ue.node&&null!==ue.node){(!ue.keys||ue.node_!==ue.node)&&(ue.keys=T(ue.node)),ue.isLeaf=0===ue.keys.length;for(var Ve=0;Ve<U.length;Ve++)if(U[Ve].node_===ae){ue.circular=U[Ve];break}}else ue.isLeaf=!0,ue.keys=null;ue.notLeaf=!ue.isLeaf,ue.notRoot=!ue.isRoot}st();var We=ee.call(ue,ue.node);return void 0!==We&&ue.update&&ue.update(We),be.before&&be.before.call(ue,ue.node),we&&("object"==typeof ue.node&&null!==ue.node&&!ue.circular&&(U.push(ue),st(),y(ue.keys,function(Ve,Be){ie.push(Ve),be.pre&&be.pre.call(ue,ue.node[Ve],Ve);var xe=ge(ue.node[Ve]);ce&&C.call(ue.node,Ve)&&(ue.node[Ve]=xe.node),xe.isLast=Be===ue.keys.length-1,xe.isFirst=0===Be,be.post&&be.post.call(ue,xe),ie.pop()}),U.pop()),be.after&&be.after.call(ue,ue.node)),ue}(J).node}function z(J){this.value=J}function W(J){return new z(J)}z.prototype.get=function(J){for(var ee=this.value,ce=0;ce<J.length;ce++){var ie=J[ce];if(!ee||!C.call(ee,ie))return;ee=ee[ie]}return ee},z.prototype.has=function(J){for(var ee=this.value,ce=0;ce<J.length;ce++){var ie=J[ce];if(!ee||!C.call(ee,ie))return!1;ee=ee[ie]}return!0},z.prototype.set=function(J,ee){for(var ce=this.value,ie=0;ie<J.length-1;ie++){var U=J[ie];C.call(ce,U)||(ce[U]={}),ce=ce[U]}return ce[J[ie]]=ee,ee},z.prototype.map=function(J){return L(this.value,J,!0)},z.prototype.forEach=function(J){return this.value=L(this.value,J,!1),this.value},z.prototype.reduce=function(J,ee){var ce=1===arguments.length,ie=ce?this.value:ee;return this.forEach(function(U){(!this.isRoot||!ce)&&(ie=J.call(this,ie,U))}),ie},z.prototype.paths=function(){var J=[];return this.forEach(function(){J.push(this.path)}),J},z.prototype.nodes=function(){var J=[];return this.forEach(function(){J.push(this.node)}),J},z.prototype.clone=function(){var J=[],ee=[];return function ce(ie){for(var U=0;U<J.length;U++)if(J[U]===ie)return ee[U];if("object"==typeof ie&&null!==ie){var se=R(ie);return J.push(ie),ee.push(se),y(T(ie),function(ge){se[ge]=ce(ie[ge])}),J.pop(),ee.pop(),se}return ie}(this.value)},y(T(z.prototype),function(J){W[J]=function(ee){var ce=[].slice.call(arguments,1),ie=new z(ee);return ie[J].apply(ie,ce)}}),m.exports=W},2135:(m,S,i)=>{"use strict";var r=i(90465),a=i(76959),f=/^[\x00-\x20\u00a0\u1680\u2000-\u200a\u2028\u2029\u202f\u205f\u3000\ufeff]+/,c=/[\n\r\t]/g,e=/^[A-Za-z][A-Za-z0-9+-.]*:\/\//,p=/:\d+$/,y=/^([a-z][a-z0-9.+-]*:)?(\/\/)?([\\/]+)?([\S\s]*)/i,T=/^[a-zA-Z]:/;function C(se){return(se||"").toString().replace(f,"")}var R=[["#","hash"],["?","query"],function(ge,ae){return W(ae.protocol)?ge.replace(/\\/g,"/"):ge},["/","pathname"],["@","auth",1],[NaN,"host",void 0,1,1],[/:(\d*)$/,"port",void 0,1],[NaN,"hostname",void 0,1,1]],L={hash:1,query:1};function z(se){var ge;ge="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof self?self:{};var we,he={},be=typeof(se=se||ge.location||{});if("blob:"===se.protocol)he=new ce(unescape(se.pathname),{});else if("string"===be)for(we in he=new ce(se,{}),L)delete he[we];else if("object"===be){for(we in se)we in L||(he[we]=se[we]);void 0===he.slashes&&(he.slashes=e.test(se.href))}return he}function W(se){return"file:"===se||"ftp:"===se||"http:"===se||"https:"===se||"ws:"===se||"wss:"===se}function J(se,ge){se=(se=C(se)).replace(c,""),ge=ge||{};var st,ae=y.exec(se),he=ae[1]?ae[1].toLowerCase():"",be=!!ae[2],we=!!ae[3],ue=0;return be?we?(st=ae[2]+ae[3]+ae[4],ue=ae[2].length+ae[3].length):(st=ae[2]+ae[4],ue=ae[2].length):we?(st=ae[3]+ae[4],ue=ae[3].length):st=ae[4],"file:"===he?ue>=2&&(st=st.slice(2)):W(he)?st=ae[4]:he?be&&(st=st.slice(2)):ue>=2&&W(ge.protocol)&&(st=ae[4]),{protocol:he,slashes:be||W(he),slashesCount:ue,rest:st}}function ce(se,ge,ae){if(se=(se=C(se)).replace(c,""),!(this instanceof ce))return new ce(se,ge,ae);var he,be,we,ue,st,We,Ve=R.slice(),Be=typeof ge,xe=this,je=0;for("object"!==Be&&"string"!==Be&&(ae=ge,ge=null),ae&&"function"!=typeof ae&&(ae=a.parse),he=!(be=J(se||"",ge=z(ge))).protocol&&!be.slashes,xe.slashes=be.slashes||he&&ge.slashes,xe.protocol=be.protocol||ge.protocol||"",se=be.rest,("file:"===be.protocol&&(2!==be.slashesCount||T.test(se))||!be.slashes&&(be.protocol||be.slashesCount<2||!W(xe.protocol)))&&(Ve[3]=[/(.*)/,"pathname"]);je<Ve.length;je++)"function"!=typeof(ue=Ve[je])?(We=ue[1],(we=ue[0])!=we?xe[We]=se:"string"==typeof we?~(st="@"===we?se.lastIndexOf(we):se.indexOf(we))&&("number"==typeof ue[2]?(xe[We]=se.slice(0,st),se=se.slice(st+ue[2])):(xe[We]=se.slice(st),se=se.slice(0,st))):(st=we.exec(se))&&(xe[We]=st[1],se=se.slice(0,st.index)),xe[We]=xe[We]||he&&ue[3]&&ge[We]||"",ue[4]&&(xe[We]=xe[We].toLowerCase())):se=ue(se,xe);ae&&(xe.query=ae(xe.query)),he&&ge.slashes&&"/"!==xe.pathname.charAt(0)&&(""!==xe.pathname||""!==ge.pathname)&&(xe.pathname=function ee(se,ge){if(""===se)return ge;for(var ae=(ge||"/").split("/").slice(0,-1).concat(se.split("/")),he=ae.length,be=ae[he-1],we=!1,ue=0;he--;)"."===ae[he]?ae.splice(he,1):".."===ae[he]?(ae.splice(he,1),ue++):ue&&(0===he&&(we=!0),ae.splice(he,1),ue--);return we&&ae.unshift(""),("."===be||".."===be)&&ae.push(""),ae.join("/")}(xe.pathname,ge.pathname)),"/"!==xe.pathname.charAt(0)&&W(xe.protocol)&&(xe.pathname="/"+xe.pathname),r(xe.port,xe.protocol)||(xe.host=xe.hostname,xe.port=""),xe.username=xe.password="",xe.auth&&(~(st=xe.auth.indexOf(":"))?(xe.username=xe.auth.slice(0,st),xe.username=encodeURIComponent(decodeURIComponent(xe.username)),xe.password=xe.auth.slice(st+1),xe.password=encodeURIComponent(decodeURIComponent(xe.password))):xe.username=encodeURIComponent(decodeURIComponent(xe.auth)),xe.auth=xe.password?xe.username+":"+xe.password:xe.username),xe.origin="file:"!==xe.protocol&&W(xe.protocol)&&xe.host?xe.protocol+"//"+xe.host:"null",xe.href=xe.toString()}ce.prototype={set:function ie(se,ge,ae){var he=this;switch(se){case"query":"string"==typeof ge&&ge.length&&(ge=(ae||a.parse)(ge)),he[se]=ge;break;case"port":he[se]=ge,r(ge,he.protocol)?ge&&(he.host=he.hostname+":"+ge):(he.host=he.hostname,he[se]="");break;case"hostname":he[se]=ge,he.port&&(ge+=":"+he.port),he.host=ge;break;case"host":he[se]=ge,p.test(ge)?(ge=ge.split(":"),he.port=ge.pop(),he.hostname=ge.join(":")):(he.hostname=ge,he.port="");break;case"protocol":he.protocol=ge.toLowerCase(),he.slashes=!ae;break;case"pathname":case"hash":if(ge){var be="pathname"===se?"/":"#";he[se]=ge.charAt(0)!==be?be+ge:ge}else he[se]=ge;break;case"username":case"password":he[se]=encodeURIComponent(ge);break;case"auth":var we=ge.indexOf(":");~we?(he.username=ge.slice(0,we),he.username=encodeURIComponent(decodeURIComponent(he.username)),he.password=ge.slice(we+1),he.password=encodeURIComponent(decodeURIComponent(he.password))):he.username=encodeURIComponent(decodeURIComponent(ge))}for(var ue=0;ue<R.length;ue++){var st=R[ue];st[4]&&(he[st[1]]=he[st[1]].toLowerCase())}return he.auth=he.password?he.username+":"+he.password:he.username,he.origin="file:"!==he.protocol&&W(he.protocol)&&he.host?he.protocol+"//"+he.host:"null",he.href=he.toString(),he},toString:function U(se){(!se||"function"!=typeof se)&&(se=a.stringify);var ge,ae=this,he=ae.host,be=ae.protocol;be&&":"!==be.charAt(be.length-1)&&(be+=":");var we=be+(ae.protocol&&ae.slashes||W(ae.protocol)?"//":"");return ae.username?(we+=ae.username,ae.password&&(we+=":"+ae.password),we+="@"):ae.password?(we+=":"+ae.password,we+="@"):"file:"!==ae.protocol&&W(ae.protocol)&&!he&&"/"!==ae.pathname&&(we+="@"),(":"===he[he.length-1]||p.test(ae.hostname)&&!ae.port)&&(he+=":"),we+=he+ae.pathname,(ge="object"==typeof ae.query?se(ae.query):ae.query)&&(we+="?"!==ge.charAt(0)?"?"+ge:ge),ae.hash&&(we+=ae.hash),we}},ce.extractProtocol=J,ce.location=z,ce.trimLeft=C,ce.qs=a,m.exports=ce},38505:(m,S,i)=>{"use strict";var r=i(87504),a=i(43745);function f(){this.protocol=null,this.slashes=null,this.auth=null,this.host=null,this.port=null,this.hostname=null,this.hash=null,this.search=null,this.query=null,this.pathname=null,this.path=null,this.href=null}S.parse=se,S.resolve=function ae(be,we){return se(be,!1,!0).resolve(we)},S.resolveObject=function he(be,we){return be?se(be,!1,!0).resolveObject(we):we},S.format=function ge(be){return a.isString(be)&&(be=se(be)),be instanceof f?be.format():f.prototype.format.call(be)},S.Url=f;var c=/^([a-z0-9.+-]+:)/i,e=/:[0-9]*$/,p=/^(\/\/?(?!\/)[^\?\s]*)(\?[^\s]*)?$/,T=["{","}","|","\\","^","`"].concat(["<",">",'"',"`"," ","\r","\n","\t"]),C=["'"].concat(T),R=["%","/","?",";","#"].concat(C),L=["/","?","#"],W=/^[+a-z0-9A-Z_-]{0,63}$/,J=/^([+a-z0-9A-Z_-]{0,63})(.*)$/,ee={javascript:!0,"javascript:":!0},ce={javascript:!0,"javascript:":!0},ie={http:!0,https:!0,ftp:!0,gopher:!0,file:!0,"http:":!0,"https:":!0,"ftp:":!0,"gopher:":!0,"file:":!0},U=i(36284);function se(be,we,ue){if(be&&a.isObject(be)&&be instanceof f)return be;var st=new f;return st.parse(be,we,ue),st}f.prototype.parse=function(be,we,ue){if(!a.isString(be))throw new TypeError("Parameter 'url' must be a string, not "+typeof be);var st=be.indexOf("?"),We=-1!==st&&st<be.indexOf("#")?"?":"#",Ve=be.split(We);Ve[0]=Ve[0].replace(/\\/g,"/");var xe=be=Ve.join(We);if(xe=xe.trim(),!ue&&1===be.split("#").length){var je=p.exec(xe);if(je)return this.path=xe,this.href=xe,this.pathname=je[1],je[2]?(this.search=je[2],this.query=we?U.parse(this.search.substr(1)):this.search.substr(1)):we&&(this.search="",this.query={}),this}var Ne=c.exec(xe);if(Ne){var Bt=(Ne=Ne[0]).toLowerCase();this.protocol=Bt,xe=xe.substr(Ne.length)}if(ue||Ne||xe.match(/^\/\/[^@\/]+@[^@\/]+/)){var rt="//"===xe.substr(0,2);rt&&(!Ne||!ce[Ne])&&(xe=xe.substr(2),this.slashes=!0)}if(!ce[Ne]&&(rt||Ne&&!ie[Ne])){for(var en=-1,Pt=0;Pt<L.length;Pt++)-1!==(Vt=xe.indexOf(L[Pt]))&&(-1===en||Vt<en)&&(en=Vt);var hn,vn;for(-1!==(vn=-1===en?xe.lastIndexOf("@"):xe.lastIndexOf("@",en))&&(hn=xe.slice(0,vn),xe=xe.slice(vn+1),this.auth=decodeURIComponent(hn)),en=-1,Pt=0;Pt<R.length;Pt++){var Vt;-1!==(Vt=xe.indexOf(R[Pt]))&&(-1===en||Vt<en)&&(en=Vt)}-1===en&&(en=xe.length),this.host=xe.slice(0,en),xe=xe.slice(en),this.parseHost(),this.hostname=this.hostname||"";var mt="["===this.hostname[0]&&"]"===this.hostname[this.hostname.length-1];if(!mt)for(var Nt=this.hostname.split(/\./),St=(Pt=0,Nt.length);Pt<St;Pt++){var Yt=Nt[Pt];if(Yt&&!Yt.match(W)){for(var Fn="",pr=0,Ei=Yt.length;pr<Ei;pr++)Yt.charCodeAt(pr)>127?Fn+="x":Fn+=Yt[pr];if(!Fn.match(W)){var mi=Nt.slice(0,Pt),ur=Nt.slice(Pt+1),$r=Yt.match(J);$r&&(mi.push($r[1]),ur.unshift($r[2])),ur.length&&(xe="/"+ur.join(".")+xe),this.hostname=mi.join(".");break}}}this.hostname=this.hostname.length>255?"":this.hostname.toLowerCase(),mt||(this.hostname=r.toASCII(this.hostname)),this.host=(this.hostname||"")+(this.port?":"+this.port:""),this.href+=this.host,mt&&(this.hostname=this.hostname.substr(1,this.hostname.length-2),"/"!==xe[0]&&(xe="/"+xe))}if(!ee[Bt])for(Pt=0,St=C.length;Pt<St;Pt++){var Xn=C[Pt];if(-1!==xe.indexOf(Xn)){var dr=encodeURIComponent(Xn);dr===Xn&&(dr=escape(Xn)),xe=xe.split(Xn).join(dr)}}var Qr=xe.indexOf("#");-1!==Qr&&(this.hash=xe.substr(Qr),xe=xe.slice(0,Qr));var Ci=xe.indexOf("?");return-1!==Ci?(this.search=xe.substr(Ci),this.query=xe.substr(Ci+1),we&&(this.query=U.parse(this.query)),xe=xe.slice(0,Ci)):we&&(this.search="",this.query={}),xe&&(this.pathname=xe),ie[Bt]&&this.hostname&&!this.pathname&&(this.pathname="/"),(this.pathname||this.search)&&(this.path=(this.pathname||"")+(this.search||"")),this.href=this.format(),this},f.prototype.format=function(){var be=this.auth||"";be&&(be=(be=encodeURIComponent(be)).replace(/%3A/i,":"),be+="@");var we=this.protocol||"",ue=this.pathname||"",st=this.hash||"",We=!1,Ve="";this.host?We=be+this.host:this.hostname&&(We=be+(-1===this.hostname.indexOf(":")?this.hostname:"["+this.hostname+"]"),this.port&&(We+=":"+this.port)),this.query&&a.isObject(this.query)&&Object.keys(this.query).length&&(Ve=U.stringify(this.query));var Be=this.search||Ve&&"?"+Ve||"";return we&&":"!==we.substr(-1)&&(we+=":"),this.slashes||(!we||ie[we])&&!1!==We?(We="//"+(We||""),ue&&"/"!==ue.charAt(0)&&(ue="/"+ue)):We||(We=""),st&&"#"!==st.charAt(0)&&(st="#"+st),Be&&"?"!==Be.charAt(0)&&(Be="?"+Be),we+We+(ue=ue.replace(/[?#]/g,function(xe){return encodeURIComponent(xe)}))+(Be=Be.replace("#","%23"))+st},f.prototype.resolve=function(be){return this.resolveObject(se(be,!1,!0)).format()},f.prototype.resolveObject=function(be){if(a.isString(be)){var we=new f;we.parse(be,!1,!0),be=we}for(var ue=new f,st=Object.keys(this),We=0;We<st.length;We++){var Ve=st[We];ue[Ve]=this[Ve]}if(ue.hash=be.hash,""===be.href)return ue.href=ue.format(),ue;if(be.slashes&&!be.protocol){for(var Be=Object.keys(be),xe=0;xe<Be.length;xe++){var je=Be[xe];"protocol"!==je&&(ue[je]=be[je])}return ie[ue.protocol]&&ue.hostname&&!ue.pathname&&(ue.path=ue.pathname="/"),ue.href=ue.format(),ue}if(be.protocol&&be.protocol!==ue.protocol){if(!ie[be.protocol]){for(var Ne=Object.keys(be),Bt=0;Bt<Ne.length;Bt++){var rt=Ne[Bt];ue[rt]=be[rt]}return ue.href=ue.format(),ue}if(ue.protocol=be.protocol,be.host||ce[be.protocol])ue.pathname=be.pathname;else{for(var St=(be.pathname||"").split("/");St.length&&!(be.host=St.shift()););be.host||(be.host=""),be.hostname||(be.hostname=""),""!==St[0]&&St.unshift(""),St.length<2&&St.unshift(""),ue.pathname=St.join("/")}return ue.search=be.search,ue.query=be.query,ue.host=be.host||"",ue.auth=be.auth,ue.hostname=be.hostname||be.host,ue.port=be.port,(ue.pathname||ue.search)&&(ue.path=(ue.pathname||"")+(ue.search||"")),ue.slashes=ue.slashes||be.slashes,ue.href=ue.format(),ue}var Vt=ue.pathname&&"/"===ue.pathname.charAt(0),hn=be.host||be.pathname&&"/"===be.pathname.charAt(0),vn=hn||Vt||ue.host&&be.pathname,mt=vn,Nt=ue.pathname&&ue.pathname.split("/")||[],Yt=(St=be.pathname&&be.pathname.split("/")||[],ue.protocol&&!ie[ue.protocol]);if(Yt&&(ue.hostname="",ue.port=null,ue.host&&(""===Nt[0]?Nt[0]=ue.host:Nt.unshift(ue.host)),ue.host="",be.protocol&&(be.hostname=null,be.port=null,be.host&&(""===St[0]?St[0]=be.host:St.unshift(be.host)),be.host=null),vn=vn&&(""===St[0]||""===Nt[0])),hn)ue.host=be.host||""===be.host?be.host:ue.host,ue.hostname=be.hostname||""===be.hostname?be.hostname:ue.hostname,ue.search=be.search,ue.query=be.query,Nt=St;else if(St.length)Nt||(Nt=[]),Nt.pop(),Nt=Nt.concat(St),ue.search=be.search,ue.query=be.query;else if(!a.isNullOrUndefined(be.search))return Yt&&(ue.hostname=ue.host=Nt.shift(),(Fn=!!(ue.host&&ue.host.indexOf("@")>0)&&ue.host.split("@"))&&(ue.auth=Fn.shift(),ue.host=ue.hostname=Fn.shift())),ue.search=be.search,ue.query=be.query,(!a.isNull(ue.pathname)||!a.isNull(ue.search))&&(ue.path=(ue.pathname?ue.pathname:"")+(ue.search?ue.search:"")),ue.href=ue.format(),ue;if(!Nt.length)return ue.pathname=null,ue.path=ue.search?"/"+ue.search:null,ue.href=ue.format(),ue;for(var pr=Nt.slice(-1)[0],Ei=(ue.host||be.host||Nt.length>1)&&("."===pr||".."===pr)||""===pr,mi=0,ur=Nt.length;ur>=0;ur--)"."===(pr=Nt[ur])?Nt.splice(ur,1):".."===pr?(Nt.splice(ur,1),mi++):mi&&(Nt.splice(ur,1),mi--);if(!vn&&!mt)for(;mi--;mi)Nt.unshift("..");vn&&""!==Nt[0]&&(!Nt[0]||"/"!==Nt[0].charAt(0))&&Nt.unshift(""),Ei&&"/"!==Nt.join("/").substr(-1)&&Nt.push("");var Fn,$r=""===Nt[0]||Nt[0]&&"/"===Nt[0].charAt(0);return Yt&&(ue.hostname=ue.host=$r?"":Nt.length?Nt.shift():"",(Fn=!!(ue.host&&ue.host.indexOf("@")>0)&&ue.host.split("@"))&&(ue.auth=Fn.shift(),ue.host=ue.hostname=Fn.shift())),(vn=vn||ue.host&&Nt.length)&&!$r&&Nt.unshift(""),Nt.length?ue.pathname=Nt.join("/"):(ue.pathname=null,ue.path=null),(!a.isNull(ue.pathname)||!a.isNull(ue.search))&&(ue.path=(ue.pathname?ue.pathname:"")+(ue.search?ue.search:"")),ue.auth=be.auth||ue.auth,ue.slashes=ue.slashes||be.slashes,ue.href=ue.format(),ue},f.prototype.parseHost=function(){var be=this.host,we=e.exec(be);we&&(":"!==(we=we[0])&&(this.port=we.substr(1)),be=be.substr(0,be.length-we.length)),be&&(this.hostname=be)}},43745:m=>{"use strict";m.exports={isString:function(S){return"string"==typeof S},isObject:function(S){return"object"==typeof S&&null!==S},isNull:function(S){return null===S},isNullOrUndefined:function(S){return null==S}}},58734:(m,S,i)=>{"use strict";var r=i(88280),c=function(R){return/<\/+[^>]+>/.test(R)},e=function(R){return/<[^>]+\/>/.test(R)};function y(C){return(R=C,R.split(/(<\/?[^>]+>)/g).filter(function(L){return""!==L.trim()})).map(function(L){return{value:L,type:T(L)}});var R}function T(C){return c(C)?"ClosingTag":!function(R){return/<[^>!]+>/.test(R)}(R=C)||c(R)||e(R)?e(C)?"SelfClosingTag":"Text":"OpeningTag";var R}m.exports=function(C){var R=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},L=R.indentor,z=R.textNodesOnSameLine,W=0,J=[];L=L||"    ";var ee=y(C).map(function(ce,ie,U){var se=ce.value,ge=ce.type;"ClosingTag"===ge&&W--;var ae=r(L,W),he=ae+se;if("OpeningTag"===ge&&W++,z){var be=U[ie-1],we=U[ie-2];"ClosingTag"===ge&&"Text"===be.type&&"OpeningTag"===we.type&&(he=""+ae+we.value+be.value+se,J.push(ie-2,ie-1))}return he});return J.forEach(function(ce){return ee[ce]=null}),ee.filter(function(ce){return!!ce}).join("\n")}},1653:function(m,S){var i,r,a;r=[],void 0!==(a="function"==typeof(i=function(){"use strict";var f=function(L){return L&&"getComputedStyle"in window&&"smooth"===window.getComputedStyle(L)["scroll-behavior"]};if("undefined"==typeof window||!("document"in window))return{};var c=function(L,z,W){z=z||999,!W&&0!==W&&(W=9);var J,ee=function(be){J=be},ce=function(){clearTimeout(J),ee(0)},ie=function(be){return Math.max(0,L.getTopOf(be)-W)},U=function(be,we,ue){if(ce(),0===we||we&&we<0||f(L.body))L.toY(be),ue&&ue();else{var st=L.getY(),We=Math.max(0,be)-st,Ve=(new Date).getTime();we=we||Math.min(Math.abs(We),z),function Be(){ee(setTimeout(function(){var xe=Math.min(1,((new Date).getTime()-Ve)/we),je=Math.max(0,Math.floor(st+We*(xe<.5?2*xe*xe:xe*(4-2*xe)-1)));L.toY(je),xe<1&&L.getHeight()+je<L.body.scrollHeight?Be():(setTimeout(ce,99),ue&&ue())},9))}()}},se=function(be,we,ue){U(ie(be),we,ue)};return{setup:function(be,we){return(0===be||be)&&(z=be),(0===we||we)&&(W=we),{defaultDuration:z,edgeOffset:W}},to:se,toY:U,intoView:function(be,we,ue){var st=be.getBoundingClientRect().height,We=L.getTopOf(be)+st,Ve=L.getHeight(),Be=L.getY(),xe=Be+Ve;ie(be)<Be||st+W>Ve?se(be,we,ue):We+W>xe?U(We-Ve+W,we,ue):ue&&ue()},center:function(be,we,ue,st){U(Math.max(0,L.getTopOf(be)-L.getHeight()/2+(ue||be.getBoundingClientRect().height/2)),we,st)},stop:ce,moving:function(){return!!J},getY:L.getY,getTopOf:L.getTopOf}},e=document.documentElement,p=function(){return window.scrollY||e.scrollTop},y=c({body:document.scrollingElement||document.body,toY:function(L){window.scrollTo(0,L)},getY:p,getHeight:function(){return window.innerHeight||e.clientHeight},getTopOf:function(L){return L.getBoundingClientRect().top+p()-e.offsetTop}});if(y.createScroller=function(L,z,W){return c({body:L,toY:function(J){L.scrollTop=J},getY:function(){return L.scrollTop},getHeight:function(){return Math.min(L.clientHeight,window.innerHeight||e.clientHeight)},getTopOf:function(J){return J.offsetTop}},z,W)},"addEventListener"in window&&!window.noZensmooth&&!f(document.body)){var T="history"in window&&"pushState"in history,C=T&&"scrollRestoration"in history;C&&(history.scrollRestoration="auto"),window.addEventListener("load",function(){C&&(setTimeout(function(){history.scrollRestoration="manual"},9),window.addEventListener("popstate",function(L){L.state&&"zenscrollY"in L.state&&y.toY(L.state.zenscrollY)},!1)),window.location.hash&&setTimeout(function(){var L=y.setup().edgeOffset;if(L){var z=document.getElementById(window.location.href.split("#")[1]);if(z){var W=Math.max(0,y.getTopOf(z)-L),J=y.getY()-W;0<=J&&J<9&&window.scrollTo(0,W)}}},9)},!1);var R=new RegExp("(^|\\s)noZensmooth(\\s|$)");window.addEventListener("click",function(L){for(var z=L.target;z&&"A"!==z.tagName;)z=z.parentNode;if(!(!z||1!==L.which||L.shiftKey||L.metaKey||L.ctrlKey||L.altKey)){if(C){var W=history.state&&"object"==typeof history.state?history.state:{};W.zenscrollY=y.getY();try{history.replaceState(W,"")}catch(se){}}var J=z.getAttribute("href")||"";if(0===J.indexOf("#")&&!R.test(z.className)){var ee=0,ce=document.getElementById(J.substring(1));if("#"!==J){if(!ce)return;ee=y.getTopOf(ce)}L.preventDefault();var ie=function(){window.location=J},U=y.setup().edgeOffset;U&&(ee=Math.max(0,ee-U),T&&(ie=function(){history.pushState({},"",J)})),y.toY(ee,null,ie)}}},!1)}return y}())?i.apply(S,r):i)&&(m.exports=a)},66265:(m,S,i)=>{"use strict";i.d(S,{B:()=>e});var r=i(11048),a=i(55860),f=i(44466),c=i(89724);let e=(()=>{class p{}return p.\u0275fac=function(T){return new(T||p)},p.\u0275mod=c.oAB({type:p}),p.\u0275inj=c.cJS({imports:[[r.ez,f.m,a.Bz]]}),p})()},60351:(m,S,i)=>{"use strict";i.d(S,{p:()=>ce});var r=i(64762),a=i(19725),f=i(25917),c=i(19773),e=i(93523),p=i(89724);let y=class{constructor(U){this.http=U,this.url="api/perf_counters"}list(){return this.http.get(this.url)}get(U,se){return this.http.get(`${this.url}/${U}/${se}`).pipe((0,c.zg)(ge=>(0,f.of)(ge.counters)))}};y.\u0275fac=function(U){return new(U||y)(p.LFG(a.eN))},y.\u0275prov=p.Yz7({token:y,factory:y.\u0275fac,providedIn:"root"}),y=(0,r.gn)([e.o,(0,r.w6)("design:paramtypes",[a.eN])],y);var T=i(11048),C=i(83697),R=i(34501),L=i(66369);const z=["valueTpl"];function W(ie,U){if(1&ie&&(p._uU(0),p.ALo(1,"dimless")),2&ie){const se=U.row;p.AsE(" ",p.lcZ(1,2,se.value)," ",se.unit," ")}}function J(ie,U){if(1&ie){const se=p.EpF();p.TgZ(0,"cd-table",2),p.NdJ("fetchData",function(ae){return p.CHM(se),p.oxw().getCounters(ae)}),p.YNc(1,W,2,4,"ng-template",null,3,p.W1O),p.qZA()}if(2&ie){const se=p.oxw();p.Q6J("data",se.counters)("columns",se.columns)("autoSave",!1)}}function ee(ie,U){1&ie&&(p.TgZ(0,"cd-alert-panel",4),p.SDv(1,5),p.qZA())}let ce=(()=>{class ie{constructor(se){this.performanceCounterService=se,this.columns=[],this.counters=[]}ngOnInit(){this.columns=[{name:"Name",prop:"name",flexGrow:1},{name:"Description",prop:"description",flexGrow:1},{name:"Value",prop:"value",cellTemplate:this.valueTpl,flexGrow:1}]}getCounters(se){this.performanceCounterService.get(this.serviceType,this.serviceId).subscribe(ge=>{this.counters=ge},ge=>{404===ge.status?(ge.preventDefault(),this.counters=null):se.error()})}}return ie.\u0275fac=function(se){return new(se||ie)(p.Y36(y))},ie.\u0275cmp=p.Xpm({type:ie,selectors:[["cd-table-performance-counter"]],viewQuery:function(se,ge){if(1&se&&p.Gf(z,5),2&se){let ae;p.iGM(ae=p.CRH())&&(ge.valueTpl=ae.first)}},inputs:{serviceType:"serviceType",serviceId:"serviceId"},decls:3,vars:2,consts:function(){let U;return U="Performance counters not available",[["columnMode","flex",3,"data","columns","autoSave","fetchData",4,"ngIf","ngIfElse"],["warning",""],["columnMode","flex",3,"data","columns","autoSave","fetchData"],["valueTpl",""],["type","warning"],U]},template:function(se,ge){if(1&se&&(p.YNc(0,J,3,3,"cd-table",0),p.YNc(1,ee,2,0,"ng-template",null,1,p.W1O)),2&se){const ae=p.MAs(2);p.Q6J("ngIf",ge.counters)("ngIfElse",ae)}},directives:[T.O5,C.a,R.G],pipes:[L.n],styles:[""]}),ie})()},370:(m,S,i)=>{"use strict";i.d(S,{t:()=>y});var r=i(11048),a=i(71334),f=i(37496),c=i(2149),e=i(44466),p=i(89724);let y=(()=>{class T{}return T.\u0275fac=function(R){return new(R||T)},T.\u0275mod=p.oAB({type:T}),T.\u0275inj=p.cJS({imports:[[r.ez,c.t,e.m,a.Oz,f.b]]}),T})()},20687:(m,S,i)=>{"use strict";i.d(S,{j:()=>p});var r=i(23815),a=i.n(r),f=i(370);class c{constructor(T){if(this.type=T,!this.isValidType())throw new Error("Wrong placement group category type");this.setTypeStates()}isValidType(){return c.VALID_CATEGORIES.includes(this.type)}setTypeStates(){switch(this.type){case c.CATEGORY_CLEAN:this.states=["active","clean"];break;case c.CATEGORY_WORKING:this.states=["activating","backfill_wait","backfilling","creating","deep","degraded","forced_backfill","forced_recovery","peering","peered","recovering","recovery_wait","repair","scrubbing","snaptrim","snaptrim_wait"];break;case c.CATEGORY_WARNING:this.states=["backfill_toofull","backfill_unfound","down","incomplete","inconsistent","recovery_toofull","recovery_unfound","remapped","snaptrim_error","stale","undersized"];break;default:this.states=[]}}}c.CATEGORY_CLEAN="clean",c.CATEGORY_WORKING="working",c.CATEGORY_WARNING="warning",c.CATEGORY_UNKNOWN="unknown",c.VALID_CATEGORIES=[c.CATEGORY_CLEAN,c.CATEGORY_WORKING,c.CATEGORY_WARNING,c.CATEGORY_UNKNOWN];var e=i(89724);let p=(()=>{class y{constructor(){this.categories=this.createCategories()}getAllTypes(){return c.VALID_CATEGORIES}getTypeByStates(C){const R=this.getPgStatesFromText(C);if(0===R.length)return c.CATEGORY_UNKNOWN;const L=a().zipObject(c.VALID_CATEGORIES,c.VALID_CATEGORIES.map(W=>a().intersection(this.categories[W].states,R).length));if(L[c.CATEGORY_WARNING]>0)return c.CATEGORY_WARNING;const z=L[c.CATEGORY_WORKING];return R.length>L[c.CATEGORY_CLEAN]+z?c.CATEGORY_UNKNOWN:z?c.CATEGORY_WORKING:c.CATEGORY_CLEAN}createCategories(){return a().zipObject(c.VALID_CATEGORIES,c.VALID_CATEGORIES.map(C=>new c(C)))}getPgStatesFromText(C){const R=C.replace(/[^a-z_]+/g," ").trim().split(" ");return a().uniq(R)}}return y.\u0275fac=function(C){return new(C||y)},y.\u0275prov=e.Yz7({token:y,factory:y.\u0275fac,providedIn:f.t}),y})()},13140:(m,S,i)=>{"use strict";i.r(S),i.d(S,{AuthModule:()=>er,RoutedAuthModule:()=>yr});var r=i(11048),a=i(1659),f=i(55860),c=i(71334),e=i(37496),p=i(79512),y=i(44466),T=i(23815),C=i.n(T),R=i(35758),L=i(18001),z=i(93614),W=i(95463),J=i(90070),ee=i(97161),ce=(()=>((ce||(ce={})).editing="editing",ce))();class ie{}var U=i(89724),se=i(25917),ge=i(19773),ae=i(19725);let he=(()=>{class or{constructor(pn){this.http=pn}list(){return this.http.get("api/role")}delete(pn){return this.http.delete(`api/role/${pn}`)}get(pn){return this.http.get(`api/role/${pn}`)}create(pn){return this.http.post("api/role",pn)}clone(pn,xn){return this.http.post(`api/role/${pn}/clone`,{new_name:xn})}update(pn){return this.http.put(`api/role/${pn.name}`,pn)}exists(pn){return this.list().pipe((0,ge.zg)(xn=>{const Gr=xn.some(no=>no.name===pn);return(0,se.of)(Gr)}))}}return or.\u0275fac=function(pn){return new(pn||or)(U.LFG(ae.eN))},or.\u0275prov=U.Yz7({token:or,factory:or.\u0275fac,providedIn:"root"}),or})(),be=(()=>{class or{constructor(pn){this.http=pn}list(){return this.http.get("ui-api/scope")}}return or.\u0275fac=function(pn){return new(pn||or)(U.LFG(ae.eN))},or.\u0275prov=U.Yz7({token:or,factory:or.\u0275fac,providedIn:"root"}),or})();var we=i(63622),ue=i(41582),st=i(56310),We=i(87925),Ve=i(94276),Be=i(82945),xe=i(83697),je=i(30839),Ne=i(10545);const Bt=["headerPermissionCheckboxTpl"],rt=["cellScopeCheckboxTpl"],en=["cellPermissionCheckboxTpl"];function Pt(or,si){1&or&&(U.TgZ(0,"span",25),U.SDv(1,26),U.qZA())}function Vt(or,si){1&or&&(U.TgZ(0,"span",25),U.SDv(1,27),U.qZA())}const hn=function(or){return{required:or}};function vn(or,si){if(1&or){const pn=U.EpF();U.TgZ(0,"div",4)(1,"form",5,6)(3,"div",7)(4,"div",8),U.SDv(5,9),U.ALo(6,"titlecase"),U.ALo(7,"upperFirst"),U.qZA(),U.TgZ(8,"div",10)(9,"div",11)(10,"label",12),U.SDv(11,13),U.qZA(),U.TgZ(12,"div",14),U._UZ(13,"input",15),U.YNc(14,Pt,2,0,"span",16),U.YNc(15,Vt,2,0,"span",16),U.qZA()(),U.TgZ(16,"div",11)(17,"label",17),U.SDv(18,18),U.qZA(),U.TgZ(19,"div",14),U._UZ(20,"input",19),U.qZA()(),U.TgZ(21,"div",11)(22,"label",20),U.SDv(23,21),U.qZA(),U.TgZ(24,"div",14),U._UZ(25,"cd-table",22),U.qZA()()(),U.TgZ(26,"div",23)(27,"cd-form-button-panel",24),U.NdJ("submitActionEvent",function(){return U.CHM(pn),U.oxw().submit()}),U.ALo(28,"titlecase"),U.ALo(29,"upperFirst"),U.qZA()()()()()}if(2&or){const pn=U.MAs(2),xn=U.oxw();U.xp6(1),U.Q6J("formGroup",xn.roleForm),U.xp6(6),U.pQV(U.lcZ(6,15,xn.action))(U.lcZ(7,17,xn.resource)),U.QtT(5),U.xp6(3),U.Q6J("ngClass",U.VKq(23,hn,xn.mode!==xn.roleFormMode.editing)),U.xp6(4),U.Q6J("ngIf",xn.roleForm.showError("name",pn,"required")),U.xp6(1),U.Q6J("ngIf",xn.roleForm.showError("name",pn,"notUnique")),U.xp6(10),U.Q6J("data",xn.scopes_permissions)("columns",xn.columns)("toolHeader",!1)("autoReload",!1)("autoSave",!1)("footer",!1)("limit",0),U.xp6(2),U.Q6J("form",xn.roleForm)("submitText",U.lcZ(28,19,xn.action)+" "+U.lcZ(29,21,xn.resource))}}function mt(or,si){if(1&or){const pn=U.EpF();U.TgZ(0,"div",28)(1,"input",29),U.NdJ("change",function(Gr){const no=U.CHM(pn),mo=no.row,wo=no.column;return U.oxw().onClickCellCheckbox(mo.scope,wo.prop,Gr)}),U.qZA(),U.TgZ(2,"label",30),U._uU(3),U.qZA()()}if(2&or){const pn=si.row,xn=si.value,Gr=U.oxw();U.xp6(1),U.MGl("id","scope_",pn.scope,""),U.Q6J("checked",Gr.isRowChecked(pn.scope)),U.xp6(1),U.MGl("for","scope_",pn.scope,""),U.xp6(1),U.Oqu(xn)}}function Nt(or,si){if(1&or){const pn=U.EpF();U.TgZ(0,"div",28)(1,"input",31),U.NdJ("change",function(Gr){const no=U.CHM(pn),mo=no.row,wo=no.column;return U.oxw().onClickCellCheckbox(mo.scope,wo.prop,Gr)}),U.qZA(),U._UZ(2,"label",32),U.qZA()}if(2&or){const pn=si.column,xn=si.row,Gr=si.value;U.xp6(1),U.Q6J("checked",Gr)("id",xn.scope+"-"+pn.prop),U.xp6(1),U.Q6J("for",xn.scope+"-"+pn.prop)}}function St(or,si){if(1&or){const pn=U.EpF();U.TgZ(0,"div",28)(1,"input",29),U.NdJ("change",function(Gr){const mo=U.CHM(pn).column;return U.oxw().onClickHeaderCheckbox(mo.prop,Gr)}),U.qZA(),U.TgZ(2,"label",33),U._uU(3),U.qZA()()}if(2&or){const pn=si.column,xn=U.oxw();U.xp6(1),U.MGl("id","header_",pn.prop,""),U.Q6J("checked",xn.isHeaderChecked(pn.prop)),U.xp6(1),U.MGl("for","header_",pn.prop,""),U.xp6(1),U.Oqu(pn.name)}}let Yt=(()=>{class or extends z.E{constructor(pn,xn,Gr,no,mo,wo){super(),this.route=pn,this.router=xn,this.roleService=Gr,this.scopeService=no,this.notificationService=mo,this.actionLabels=wo,this.scopes=[],this.scopes_permissions=[],this.roleFormMode=ce,this.resource="role",this.createForm(),this.listenToChanges()}createForm(){this.roleForm=new W.d({name:new a.NI("",{validators:[a.kI.required],asyncValidators:[J.h.unique(this.roleService.exists,this.roleService)]}),description:new a.NI(""),scopes_permissions:new a.NI({})})}ngOnInit(){this.columns=[{prop:"scope",name:"All",flexGrow:2,cellTemplate:this.cellScopeCheckboxTpl,headerTemplate:this.headerPermissionCheckboxTpl},{prop:"read",name:"Read",flexGrow:1,cellClass:"text-center",cellTemplate:this.cellPermissionCheckboxTpl,headerTemplate:this.headerPermissionCheckboxTpl},{prop:"create",name:"Create",flexGrow:1,cellClass:"text-center",cellTemplate:this.cellPermissionCheckboxTpl,headerTemplate:this.headerPermissionCheckboxTpl},{prop:"update",name:"Update",flexGrow:1,cellClass:"text-center",cellTemplate:this.cellPermissionCheckboxTpl,headerTemplate:this.headerPermissionCheckboxTpl},{prop:"delete",name:"Delete",flexGrow:1,cellClass:"text-center",cellTemplate:this.cellPermissionCheckboxTpl,headerTemplate:this.headerPermissionCheckboxTpl}],this.router.url.startsWith("/user-management/roles/edit")?(this.mode=this.roleFormMode.editing,this.action=this.actionLabels.EDIT):this.action=this.actionLabels.CREATE,this.mode===this.roleFormMode.editing?this.initEdit():this.initCreate()}initCreate(){this.scopeService.list().subscribe(pn=>{this.scopes=pn,this.roleForm.get("scopes_permissions").setValue({}),this.loadingReady()})}initEdit(){this.roleForm.get("name").disable(),this.route.params.subscribe(pn=>{const xn=[];xn.push(this.scopeService.list()),xn.push(this.roleService.get(pn.name)),(0,R.D)(xn).subscribe(Gr=>{this.scopes=Gr[0],["name","description","scopes_permissions"].forEach(no=>this.roleForm.get(no).setValue(Gr[1][no])),this.loadingReady()})})}listenToChanges(){this.roleForm.get("scopes_permissions").valueChanges.subscribe(pn=>{const xn=[];C().each(this.scopes,Gr=>{const no={read:!1,create:!1,update:!1,delete:!1};no.scope=Gr,Gr in pn&&C().each(pn[Gr],mo=>{no[mo]=!0}),xn.push(no)}),this.scopes_permissions=xn})}isRowChecked(pn){const xn=C().find(this.scopes_permissions,Gr=>Gr.scope===pn);return!C().isUndefined(xn)&&xn.read&&xn.create&&xn.update&&xn.delete}isHeaderChecked(pn){let xn=[pn];return"scope"===pn&&(xn=["read","create","update","delete"]),xn.every(Gr=>this.scopes_permissions.every(no=>no[Gr]))}onClickCellCheckbox(pn,xn,Gr=null){const no=C().cloneDeep(this.roleForm.getValue("scopes_permissions"));let mo=[xn];"scope"===xn&&(mo=["read","create","update","delete"]),pn in no||(no[pn]=[]),Gr&&Gr.target.checked||!C().isEqual(mo.sort(),C().intersection(no[pn],mo).sort())?no[pn]=C().union(no[pn],mo):(no[pn]=C().difference(no[pn],mo),C().isEmpty(no[pn])&&C().unset(no,pn)),this.roleForm.get("scopes_permissions").setValue(no)}onClickHeaderCheckbox(pn,xn){const Gr=C().cloneDeep(this.roleForm.getValue("scopes_permissions"));let no=[pn];"scope"===pn&&(no=["read","create","update","delete"]),C().each(no,mo=>{C().each(this.scopes,wo=>{xn.target.checked?Gr[wo]=C().union(Gr[wo],[mo]):(Gr[wo]=C().difference(Gr[wo],[mo]),C().isEmpty(Gr[wo])&&C().unset(Gr,wo))})}),this.roleForm.get("scopes_permissions").setValue(Gr)}getRequest(){const pn=new ie;return["name","description","scopes_permissions"].forEach(xn=>pn[xn]=this.roleForm.get(xn).value),pn}createAction(){const pn=this.getRequest();this.roleService.create(pn).subscribe(()=>{this.notificationService.show(L.k.success,"Created role '" + pn.name + "'"),this.router.navigate(["/user-management/roles"])},()=>{this.roleForm.setErrors({cdSubmitButton:!0})})}editAction(){const pn=this.getRequest();this.roleService.update(pn).subscribe(()=>{this.notificationService.show(L.k.success,"Updated role '" + pn.name + "'"),this.router.navigate(["/user-management/roles"])},()=>{this.roleForm.setErrors({cdSubmitButton:!0})})}submit(){this.mode===this.roleFormMode.editing?this.editAction():this.createAction()}}return or.\u0275fac=function(pn){return new(pn||or)(U.Y36(f.gz),U.Y36(f.F0),U.Y36(he),U.Y36(be),U.Y36(ee.g),U.Y36(p.p4))},or.\u0275cmp=U.Xpm({type:or,selectors:[["cd-role-form"]],viewQuery:function(pn,xn){if(1&pn&&(U.Gf(Bt,7),U.Gf(rt,7),U.Gf(en,7)),2&pn){let Gr;U.iGM(Gr=U.CRH())&&(xn.headerPermissionCheckboxTpl=Gr.first),U.iGM(Gr=U.CRH())&&(xn.cellScopeCheckboxTpl=Gr.first),U.iGM(Gr=U.CRH())&&(xn.cellPermissionCheckboxTpl=Gr.first)}},features:[U.qOj],decls:7,vars:1,consts:function(){let si,pn,xn,Gr,no,mo,wo,Us;return si="" + "\ufffd0\ufffd" + " " + "\ufffd1\ufffd" + "",pn="Name",xn="Name...",Gr="Description",no="Description...",mo="Permissions",wo="This field is required.",Us="The chosen name is already in use.",[["class","cd-col-form",4,"cdFormLoading"],["cellScopeCheckboxTpl",""],["cellPermissionCheckboxTpl",""],["headerPermissionCheckboxTpl",""],[1,"cd-col-form"],["name","roleForm","novalidate","",3,"formGroup"],["formDir","ngForm"],[1,"card"],[1,"card-header"],si,[1,"card-body"],[1,"form-group","row"],["for","name",1,"cd-col-form-label",3,"ngClass"],pn,[1,"cd-col-form-input"],["type","text","placeholder",xn,"id","name","name","name","formControlName","name","autofocus","",1,"form-control"],["class","invalid-feedback",4,"ngIf"],["for","description",1,"cd-col-form-label"],Gr,["type","text","placeholder",no,"id","description","name","description","formControlName","description",1,"form-control"],[1,"cd-col-form-label"],mo,["columnMode","flex",3,"data","columns","toolHeader","autoReload","autoSave","footer","limit"],[1,"card-footer"],["wrappingClass","text-right",3,"form","submitText","submitActionEvent"],[1,"invalid-feedback"],wo,Us,[1,"custom-control","custom-checkbox"],["type","checkbox",1,"custom-control-input",3,"id","checked","change"],[1,"datatable-permissions-scope-cell-label","custom-control-label",3,"for"],["type","checkbox",1,"custom-control-input",3,"checked","id","change"],[1,"custom-control-label",3,"for"],[1,"datatable-permissions-header-cell-label","custom-control-label",3,"for"]]},template:function(pn,xn){1&pn&&(U.YNc(0,vn,30,25,"div",0),U.YNc(1,mt,4,4,"ng-template",null,1,U.W1O),U.YNc(3,Nt,3,3,"ng-template",null,2,U.W1O),U.YNc(5,St,4,4,"ng-template",null,3,U.W1O)),2&pn&&U.Q6J("cdFormLoading",xn.loading)},directives:[we.y,a._Y,a.JL,a.sg,ue.V,st.P,r.mk,We.o,a.Fj,Ve.b,a.JJ,a.u,Be.U,r.O5,xe.a,je.p],pipes:[r.rS,Ne.m],styles:[".datatable-permissions-header-cell-label[_ngcontent-%COMP%], .datatable-permissions-scope-cell-label[_ngcontent-%COMP%]{font-weight:700}"]}),or})();var Fn=i(68136),pr=i(30982),Ei=i(65683),mi=i(99466),ur=i(65862),$r=i(68774),Br=i(41039),Pn=i(51847),Xn=i(47640),dr=i(63285);const Qr=function(){return{exact:!0}};let Ci=(()=>{class or{constructor(pn){this.router=pn}}return or.\u0275fac=function(pn){return new(pn||or)(U.Y36(f.F0))},or.\u0275cmp=U.Xpm({type:or,selectors:[["cd-user-tabs"]],decls:7,vars:4,consts:function(){let si,pn;return si="Users",pn="Roles",[[1,"nav","nav-tabs"],[1,"nav-item"],["routerLink","/user-management/users","routerLinkActive","active","ariaCurrentWhenActive","page",1,"nav-link",3,"routerLinkActiveOptions"],si,["routerLink","/user-management/roles","routerLinkActive","active","ariaCurrentWhenActive","page",1,"nav-link",3,"routerLinkActiveOptions"],pn]},template:function(pn,xn){1&pn&&(U.TgZ(0,"ul",0)(1,"li",1)(2,"a",2),U.SDv(3,3),U.qZA()(),U.TgZ(4,"li",1)(5,"a",4),U.SDv(6,5),U.qZA()()()),2&pn&&(U.xp6(2),U.Q6J("routerLinkActiveOptions",U.DdM(2,Qr)),U.xp6(3),U.Q6J("routerLinkActiveOptions",U.DdM(3,Qr)))},directives:[f.yS,f.Od],styles:[""]}),or})();var _i=i(94928);function so(or,si){if(1&or&&(U.ynx(0),U._UZ(1,"cd-table",1),U.BQk()),2&or){const pn=U.oxw();U.xp6(1),U.Q6J("data",pn.scopes_permissions)("columns",pn.columns)("toolHeader",!1)("autoReload",!1)("autoSave",!1)("footer",!1)("limit",0)}}let Ro=(()=>{class or{constructor(){this.scopes_permissions=[]}ngOnInit(){this.columns=[{prop:"scope",name:"Scope",flexGrow:2},{prop:"read",name:"Read",flexGrow:1,cellClass:"text-center",cellTransformation:mi.e.checkIcon},{prop:"create",name:"Create",flexGrow:1,cellClass:"text-center",cellTransformation:mi.e.checkIcon},{prop:"update",name:"Update",flexGrow:1,cellClass:"text-center",cellTransformation:mi.e.checkIcon},{prop:"delete",name:"Delete",flexGrow:1,cellClass:"text-center",cellTransformation:mi.e.checkIcon}]}ngOnChanges(){if(this.selection){this.selectedItem=this.selection;const pn=[];C().each(this.scopes,xn=>{const Gr={read:!1,create:!1,update:!1,delete:!1};Gr.scope=xn,xn in this.selectedItem.scopes_permissions&&C().each(this.selectedItem.scopes_permissions[xn],no=>{Gr[no]=!0}),pn.push(Gr)}),this.scopes_permissions=pn}}}return or.\u0275fac=function(pn){return new(pn||or)},or.\u0275cmp=U.Xpm({type:or,selectors:[["cd-role-details"]],inputs:{selection:"selection",scopes:"scopes"},features:[U.TTD],decls:1,vars:1,consts:[[4,"ngIf"],["columnMode","flex",3,"data","columns","toolHeader","autoReload","autoSave","footer","limit"]],template:function(pn,xn){1&pn&&U.YNc(0,so,2,7,"ng-container",0),2&pn&&U.Q6J("ngIf",xn.selection)},directives:[r.O5,xe.a],styles:[".fa[_ngcontent-%COMP%]{font-size:large}.fa.fa-square-o[_ngcontent-%COMP%]{color:#ced4da}"]}),or})(),Kt=(()=>{class or extends Fn.o{constructor(pn,xn,Gr,no,mo,wo,Us,cs){super(),this.roleService=pn,this.scopeService=xn,this.emptyPipe=Gr,this.authStorageService=no,this.modalService=mo,this.notificationService=wo,this.urlBuilder=Us,this.actionLabels=cs,this.selection=new $r.r,this.permission=this.authStorageService.getPermissions().user,this.tableActions=[{permission:"create",icon:ur.P.add,routerLink:()=>this.urlBuilder.getCreate(),name:this.actionLabels.CREATE},{permission:"create",icon:ur.P.clone,name:this.actionLabels.CLONE,disable:()=>!this.selection.hasSingleSelection,click:()=>this.cloneRole()},{permission:"update",icon:ur.P.edit,disable:()=>!this.selection.hasSingleSelection||this.selection.first().system,routerLink:()=>this.selection.first()&&this.urlBuilder.getEdit(this.selection.first().name),name:this.actionLabels.EDIT},{permission:"delete",icon:ur.P.destroy,disable:()=>!this.selection.hasSingleSelection||this.selection.first().system,click:()=>this.deleteRoleModal(),name:this.actionLabels.DELETE}]}ngOnInit(){this.columns=[{name:"Name",prop:"name",flexGrow:3},{name:"Description",prop:"description",flexGrow:5,pipe:this.emptyPipe},{name:"System Role",prop:"system",cellClass:"text-center",flexGrow:1,cellTransformation:mi.e.checkIcon}]}getRoles(){(0,R.D)([this.roleService.list(),this.scopeService.list()]).subscribe(pn=>{this.roles=pn[0],this.scopes=pn[1]})}updateSelection(pn){this.selection=pn}deleteRole(pn){this.roleService.delete(pn).subscribe(()=>{this.getRoles(),this.modalRef.close(),this.notificationService.show(L.k.success,"Deleted role '" + pn + "'")},()=>{this.modalRef.componentInstance.stopLoadingSpinner()})}deleteRoleModal(){const pn=this.selection.first().name;this.modalRef=this.modalService.show(pr.M,{itemDescription:"Role",itemNames:[pn],submitAction:()=>this.deleteRole(pn)})}cloneRole(){const pn=this.selection.first().name;this.modalRef=this.modalService.show(Ei.X,{fields:[{type:"text",name:"newName",value:`${pn}_clone`,label:"New name",required:!0}],titleText:"Clone Role",submitButtonText:"Clone Role",onSubmit:xn=>{this.roleService.clone(pn,xn.newName).subscribe(()=>{this.getRoles(),this.notificationService.show(L.k.success,"Cloned role '" + xn.newName + "' from '" + pn + "'")})}})}}return or.\u0275fac=function(pn){return new(pn||or)(U.Y36(he),U.Y36(be),U.Y36(Br.W),U.Y36(Xn.j),U.Y36(dr.Z),U.Y36(ee.g),U.Y36(Pn.F),U.Y36(p.p4))},or.\u0275cmp=U.Xpm({type:or,selectors:[["cd-role-list"]],features:[U._Bn([{provide:Pn.F,useValue:new Pn.F("user-management/roles")}]),U.qOj],decls:4,vars:8,consts:[["columnMode","flex","identifier","name","selectionType","single",3,"data","columns","hasDetails","setExpandedRow","fetchData","updateSelection"],[1,"table-actions",3,"permission","selection","tableActions"],["cdTableDetail","",3,"selection","scopes"]],template:function(pn,xn){1&pn&&(U._UZ(0,"cd-user-tabs"),U.TgZ(1,"cd-table",0),U.NdJ("setExpandedRow",function(no){return xn.setExpandedRow(no)})("fetchData",function(){return xn.getRoles()})("updateSelection",function(no){return xn.updateSelection(no)}),U._UZ(2,"cd-table-actions",1)(3,"cd-role-details",2),U.qZA()),2&pn&&(U.xp6(1),U.Q6J("data",xn.roles)("columns",xn.columns)("hasDetails",!0),U.xp6(1),U.Q6J("permission",xn.permission)("selection",xn.selection)("tableActions",xn.tableActions),U.xp6(1),U.Q6J("selection",xn.expandedRow)("scopes",xn.scopes))},directives:[Ci,xe.a,_i.K,Ro],styles:[""]}),or})();var un=i(16738),jn=i.n(un),Jn=i(39219),Gn=i(9837),Xr=i(36169),Zi=i(7022),ii=i(51907),hr=i(81354),Ki=(()=>((Ki||(Ki={})).editing="editing",Ki))();class ln{}var Mn=i(32057),Zn=i(62862),cn=i(18372),Sn=i(4416),Or=i(60192),ri=i(52266);const vi=["removeSelfUserReadUpdatePermissionTpl"];function Ui(or,si){1&or&&(U.TgZ(0,"span",28),U.SDv(1,29),U.qZA())}function ao(or,si){1&or&&(U.TgZ(0,"span",28),U.SDv(1,30),U.qZA())}function dt(or,si){if(1&or&&U._UZ(0,"cd-helper",39),2&or){const pn=U.oxw(3);U.s9C("html",pn.passwordPolicyHelpText)}}function Bi(or,si){1&or&&(U.TgZ(0,"span",28),U.SDv(1,40),U.qZA())}function to(or,si){if(1&or&&(U.TgZ(0,"span",28),U._uU(1),U.qZA()),2&or){const pn=U.oxw(3);U.xp6(1),U.hij(" ",pn.passwordValuation," ")}}function Gt(or,si){if(1&or&&(U.TgZ(0,"div",10)(1,"label",31),U.ynx(2),U.SDv(3,32),U.BQk(),U.YNc(4,dt,1,1,"cd-helper",33),U.qZA(),U.TgZ(5,"div",13)(6,"div",34),U._UZ(7,"input",35)(8,"button",36),U.qZA(),U.TgZ(9,"div",37),U._UZ(10,"div",38),U.qZA(),U.YNc(11,Bi,2,0,"span",15),U.YNc(12,to,2,1,"span",15),U.qZA()()),2&or){U.oxw();const pn=U.MAs(2),xn=U.oxw();U.xp6(4),U.Q6J("ngIf",xn.passwordPolicyHelpText.length>0),U.xp6(6),U.Tol(xn.passwordStrengthLevelClass),U.s9C("title",xn.passwordValuation),U.xp6(1),U.Q6J("ngIf",xn.userForm.showError("password",pn,"required")),U.xp6(1),U.Q6J("ngIf",xn.userForm.showError("password",pn,"passwordPolicy"))}}function Rn(or,si){1&or&&(U.TgZ(0,"span",28),U.SDv(1,45),U.qZA())}function _t(or,si){1&or&&(U.TgZ(0,"span",28),U.SDv(1,46),U.qZA())}function Rt(or,si){if(1&or&&(U.TgZ(0,"div",10)(1,"label",41),U.SDv(2,42),U.qZA(),U.TgZ(3,"div",13)(4,"div",34),U._UZ(5,"input",43)(6,"button",44),U.YNc(7,Rn,2,0,"span",15),U.qZA(),U.YNc(8,_t,2,0,"span",15),U.qZA()()),2&or){U.oxw();const pn=U.MAs(2),xn=U.oxw();U.xp6(7),U.Q6J("ngIf",xn.userForm.showError("confirmpassword",pn,"match")),U.xp6(1),U.Q6J("ngIf",xn.userForm.showError("confirmpassword",pn,"required"))}}function ct(or,si){1&or&&(U.TgZ(0,"cd-helper",53)(1,"p"),U._uU(2," The Dashboard setting defining the expiration interval of passwords is currently set to "),U.TgZ(3,"strong"),U._uU(4,"0"),U.qZA(),U._uU(5,". This means if a date is set, the user password will only expire once. "),U.qZA(),U.TgZ(6,"p"),U._uU(7," Consider configuring the Dashboard setting "),U.TgZ(8,"a",54),U._uU(9,"USER_PWD_EXPIRATION_SPAN"),U.qZA(),U._uU(10," in order to let passwords expire periodically. "),U.qZA()())}function pt(or,si){1&or&&(U.TgZ(0,"span",28),U.SDv(1,55),U.qZA())}const kt=function(or){return{required:or}};function dn(or,si){if(1&or){const pn=U.EpF();U.TgZ(0,"div",10)(1,"label",47),U.ynx(2),U.SDv(3,48),U.BQk(),U.YNc(4,ct,11,0,"cd-helper",49),U.qZA(),U.TgZ(5,"div",13)(6,"div",34)(7,"input",50,51),U.NdJ("click",function(){return U.CHM(pn),U.MAs(8).open()})("keypress",function(){return U.CHM(pn),U.MAs(8).close()}),U.qZA(),U.TgZ(9,"button",52),U.NdJ("click",function(){return U.CHM(pn),U.oxw(2).clearExpirationDate()}),U._UZ(10,"i"),U.qZA(),U.YNc(11,pt,2,0,"span",15),U.qZA()()()}if(2&or){U.oxw();const pn=U.MAs(2),xn=U.oxw(),Gr=U.MAs(4);U.xp6(1),U.Q6J("ngClass",U.VKq(7,kt,xn.pwdExpirationSettings.pwdExpirationSpan>0)),U.xp6(3),U.Q6J("ngIf",0==xn.pwdExpirationSettings.pwdExpirationSpan),U.xp6(3),U.Q6J("ngbPopover",Gr),U.xp6(3),U.Gre("icon-prepend ",xn.icons.destroy,""),U.xp6(1),U.Q6J("ngIf",xn.userForm.showError("pwdExpirationDate",pn,"required"))}}function mr(or,si){1&or&&(U.TgZ(0,"span",28),U.SDv(1,56),U.qZA())}function Oi(or,si){if(1&or&&(U.TgZ(0,"span",57),U._UZ(1,"cd-select-badges",58),U.qZA()),2&or){const pn=U.oxw(2);U.xp6(1),U.Q6J("data",pn.userForm.controls.roles.value)("options",pn.allRoles)("messages",pn.messages)}}function di(or,si){1&or&&(U.TgZ(0,"div",10)(1,"div",59)(2,"div",60),U._UZ(3,"input",61),U.TgZ(4,"label",62),U.SDv(5,63),U.qZA()()()())}function Uo(or,si){1&or&&(U.TgZ(0,"div",10)(1,"div",59)(2,"div",60),U._UZ(3,"input",64),U.TgZ(4,"label",65),U.SDv(5,66),U.qZA()()()())}function Qo(or,si){if(1&or){const pn=U.EpF();U.TgZ(0,"div",3)(1,"form",4,5)(3,"div",6)(4,"div",7),U.SDv(5,8),U.ALo(6,"titlecase"),U.ALo(7,"upperFirst"),U.qZA(),U.TgZ(8,"div",9)(9,"div",10)(10,"label",11),U.SDv(11,12),U.qZA(),U.TgZ(12,"div",13),U._UZ(13,"input",14),U.YNc(14,Ui,2,0,"span",15),U.YNc(15,ao,2,0,"span",15),U.qZA()(),U.YNc(16,Gt,13,7,"div",16),U.YNc(17,Rt,9,2,"div",16),U.YNc(18,dn,12,9,"div",16),U.TgZ(19,"div",10)(20,"label",17),U.SDv(21,18),U.qZA(),U.TgZ(22,"div",13),U._UZ(23,"input",19),U.qZA()(),U.TgZ(24,"div",10)(25,"label",20),U.SDv(26,21),U.qZA(),U.TgZ(27,"div",13),U._UZ(28,"input",22),U.YNc(29,mr,2,0,"span",15),U.qZA()(),U.TgZ(30,"div",10)(31,"label",23),U.SDv(32,24),U.qZA(),U.TgZ(33,"div",13),U.YNc(34,Oi,2,3,"span",25),U.qZA()(),U.YNc(35,di,6,0,"div",16),U.YNc(36,Uo,6,0,"div",16),U.qZA(),U.TgZ(37,"div",26)(38,"cd-form-button-panel",27),U.NdJ("submitActionEvent",function(){return U.CHM(pn),U.oxw().submit()}),U.ALo(39,"titlecase"),U.ALo(40,"upperFirst"),U.qZA()()()()()}if(2&or){const pn=U.MAs(2),xn=U.oxw();U.xp6(1),U.Q6J("formGroup",xn.userForm),U.xp6(6),U.pQV(U.lcZ(6,15,xn.action))(U.lcZ(7,17,xn.resource)),U.QtT(5),U.xp6(3),U.Q6J("ngClass",U.VKq(23,kt,xn.mode!==xn.userFormMode.editing)),U.xp6(4),U.Q6J("ngIf",xn.userForm.showError("username",pn,"required")),U.xp6(1),U.Q6J("ngIf",xn.userForm.showError("username",pn,"notUnique")),U.xp6(1),U.Q6J("ngIf",!xn.authStorageService.isSSO()),U.xp6(1),U.Q6J("ngIf",!xn.authStorageService.isSSO()),U.xp6(1),U.Q6J("ngIf",!xn.authStorageService.isSSO()),U.xp6(11),U.Q6J("ngIf",xn.userForm.showError("email",pn,"email")),U.xp6(5),U.Q6J("ngIf",xn.allRoles),U.xp6(1),U.Q6J("ngIf",!xn.isCurrentUser()),U.xp6(1),U.Q6J("ngIf",!xn.isCurrentUser()&&!xn.authStorageService.isSSO()),U.xp6(2),U.Q6J("form",xn.userForm)("submitText",U.lcZ(39,19,xn.action)+" "+U.lcZ(40,21,xn.resource))}}function lo(or,si){1&or&&(U.TgZ(0,"p")(1,"strong"),U.SDv(2,67),U.qZA()(),U._UZ(3,"br"),U.TgZ(4,"p"),U.SDv(5,68),U.qZA(),U.ynx(6),U.SDv(7,69),U.BQk())}function Ai(or,si){if(1&or&&U._UZ(0,"cd-date-time-picker",70),2&or){const pn=U.oxw();U.Q6J("control",pn.userForm.get("pwdExpirationDate"))("hasTime",!1)}}let Fo=(()=>{class or extends z.E{constructor(pn,xn,Gr,no,mo,wo,Us,cs,es,ga,ya,fa){super(),this.authService=pn,this.authStorageService=xn,this.route=Gr,this.router=no,this.modalService=mo,this.roleService=wo,this.userService=Us,this.notificationService=cs,this.actionLabels=es,this.passwordPolicyService=ga,this.formBuilder=ya,this.settingsService=fa,this.userFormMode=Ki,this.messages=new Zi.a({empty:"There are no roles."}),this.passwordPolicyHelpText="",this.icons=ur.P,this.pwdExpirationFormat="YYYY-MM-DD",this.resource="user",this.createForm(),this.messages=new Zi.a({empty:"There are no roles."})}createForm(){this.passwordPolicyService.getHelpText().subscribe(pn=>{this.passwordPolicyHelpText=pn}),this.userForm=this.formBuilder.group({username:["",[a.kI.required],[J.h.unique(this.userService.validateUserName,this.userService)]],name:[""],password:["",[],[J.h.passwordPolicy(this.userService,()=>this.userForm.getValue("username"),(pn,xn,Gr)=>{this.passwordStrengthLevelClass=this.passwordPolicyService.mapCreditsToCssClass(xn),this.passwordValuation=C().defaultTo(Gr,"")})]],confirmpassword:[""],pwdExpirationDate:[void 0],email:["",[J.h.email]],roles:[[]],enabled:[!0,[a.kI.required]],pwdUpdateRequired:[!0]},{validators:[J.h.match("password","confirmpassword")]})}ngOnInit(){this.router.url.startsWith("/user-management/users/edit")?(this.mode=this.userFormMode.editing,this.action=this.actionLabels.EDIT):this.action=this.actionLabels.CREATE;const pn=[this.roleService.list(),this.settingsService.getStandardSettings()];(0,R.D)(pn).subscribe(xn=>{if(this.allRoles=C().map(xn[0],Gr=>(Gr.enabled=!0,Gr)),this.pwdExpirationSettings=new ii.G(xn[1]),this.mode===this.userFormMode.editing)this.initEdit();else{if(this.pwdExpirationSettings.pwdExpirationSpan>0){const Gr=this.userForm.get("pwdExpirationDate"),no=jn()();no.add(this.pwdExpirationSettings.pwdExpirationSpan,"day"),Gr.setValue(no.format(this.pwdExpirationFormat)),Gr.setValidators([a.kI.required])}this.loadingReady()}})}initEdit(){this.disableForEdit(),this.route.params.subscribe(pn=>{this.userService.get(pn.username).subscribe(Gr=>{this.response=C().cloneDeep(Gr),this.setResponse(Gr),this.loadingReady()})})}disableForEdit(){this.userForm.get("username").disable()}setResponse(pn){["username","name","email","roles","enabled","pwdUpdateRequired"].forEach(Gr=>this.userForm.get(Gr).setValue(pn[Gr]));const xn=pn.pwdExpirationDate;xn&&this.userForm.get("pwdExpirationDate").setValue(jn()(1e3*xn).format(this.pwdExpirationFormat))}getRequest(){const pn=new ln;["username","password","name","email","roles","enabled","pwdUpdateRequired"].forEach(Gr=>pn[Gr]=this.userForm.get(Gr).value);const xn=this.userForm.get("pwdExpirationDate").value;if(xn){const Gr=jn()(xn,this.pwdExpirationFormat);(this.mode!==this.userFormMode.editing||this.response.pwdExpirationDate!==Gr.unix())&&Gr.set({hour:23,minute:59,second:59}),pn.pwdExpirationDate=Gr.unix()}return pn}createAction(){const pn=this.getRequest();this.userService.create(pn).subscribe(()=>{this.notificationService.show(L.k.success,"Created user '" + pn.username + "'"),this.router.navigate(["/user-management/users"])},()=>{this.userForm.setErrors({cdSubmitButton:!0})})}editAction(){if(this.isUserRemovingNeededRolePermissions()){const pn={titleText:"Update user",buttonText:"Continue",bodyTpl:this.removeSelfUserReadUpdatePermissionTpl,onSubmit:()=>{this.modalRef.close(),this.doEditAction()},onCancel:()=>{this.userForm.setErrors({cdSubmitButton:!0}),this.userForm.get("roles").reset(this.userForm.get("roles").value)}};this.modalRef=this.modalService.show(Xr.Y,pn)}else this.doEditAction()}isCurrentUser(){return this.authStorageService.getUsername()===this.userForm.getValue("username")}isUserChangingRoles(){return this.isCurrentUser()&&this.response&&!C().isEqual(this.response.roles,this.userForm.getValue("roles"))}isUserRemovingNeededRolePermissions(){return this.isCurrentUser()&&!this.hasUserReadUpdatePermissions(this.userForm.getValue("roles"))}hasUserReadUpdatePermissions(pn=[]){for(const xn of this.allRoles)if(-1!==pn.indexOf(xn.name)&&xn.scopes_permissions.user){const Gr=xn.scopes_permissions.user;return["read","update"].every(no=>-1!==Gr.indexOf(no))}return!1}doEditAction(){const pn=this.getRequest();this.userService.update(pn).subscribe(()=>{this.isUserChangingRoles()?this.authService.logout(()=>{this.notificationService.show(L.k.info,"You were automatically logged out because your roles have been changed.")}):(this.notificationService.show(L.k.success,"Updated user '" + pn.username + "'"),this.router.navigate(["/user-management/users"]))},()=>{this.userForm.setErrors({cdSubmitButton:!0})})}clearExpirationDate(){this.userForm.get("pwdExpirationDate").setValue(void 0)}submit(){this.mode===this.userFormMode.editing?this.editAction():this.createAction()}}return or.\u0275fac=function(pn){return new(pn||or)(U.Y36(Jn.e),U.Y36(Xn.j),U.Y36(f.gz),U.Y36(f.F0),U.Y36(dr.Z),U.Y36(he),U.Y36(Mn.K),U.Y36(ee.g),U.Y36(p.p4),U.Y36(hr.q),U.Y36(Zn.O),U.Y36(Gn.g))},or.\u0275cmp=U.Xpm({type:or,selectors:[["cd-user-form"]],viewQuery:function(pn,xn){if(1&pn&&U.Gf(vi,7),2&pn){let Gr;U.iGM(Gr=U.CRH())&&(xn.removeSelfUserReadUpdatePermissionTpl=Gr.first)}},features:[U.qOj],decls:5,vars:1,consts:function(){let si,pn,xn,Gr,no,mo,wo,Us,cs,es,ga,ya,fa,la,Pa,fl,To,ml,Zo,vs,Za;return si="" + "\ufffd0\ufffd" + " " + "\ufffd1\ufffd" + "",pn="Username",xn="Full name",Gr="Email",no="Roles",mo="This field is required.",wo="The username already exists.",Us="Password",cs="This field is required.",es="Confirm password",ga="Password confirmation doesn't match the password.",ya="This field is required.",fa="Password expiration date",la="Password expiration date...",Pa="This field is required.",fl="Invalid email.",To="Enabled",ml="User must change password at next logon",Zo="You are about to remove \"user read / update\" permissions from your own user.",vs="If you continue, you will no longer be able to add or remove roles from any user.",Za="Are you sure you want to continue?",[["class","cd-col-form",4,"cdFormLoading"],["removeSelfUserReadUpdatePermissionTpl",""],["popContent",""],[1,"cd-col-form"],["name","userForm","novalidate","",3,"formGroup"],["formDir","ngForm"],[1,"card"],[1,"card-header"],si,[1,"card-body"],[1,"form-group","row"],["for","username",1,"cd-col-form-label",3,"ngClass"],pn,[1,"cd-col-form-input"],["type","text","placeholder","Username...","id","username","name","username","formControlName","username","autocomplete","off","autofocus","",1,"form-control"],["class","invalid-feedback",4,"ngIf"],["class","form-group row",4,"ngIf"],["for","name",1,"cd-col-form-label"],xn,["type","text","placeholder","Full name...","id","name","name","name","formControlName","name",1,"form-control"],["for","email",1,"cd-col-form-label"],Gr,["type","email","placeholder","Email...","id","email","name","email","formControlName","email",1,"form-control"],[1,"cd-col-form-label"],no,["class","no-border full-height",4,"ngIf"],[1,"card-footer"],["wrappingClass","text-right",3,"form","submitText","submitActionEvent"],[1,"invalid-feedback"],mo,wo,["for","password",1,"cd-col-form-label"],Us,["class","text-pre-wrap",3,"html",4,"ngIf"],[1,"input-group"],["type","password","placeholder","Password...","id","password","name","password","autocomplete","new-password","formControlName","password",1,"form-control"],["type","button","cdPasswordButton","password",1,"btn","btn-light"],[1,"password-strength-level"],["data-toggle","tooltip",3,"title"],[1,"text-pre-wrap",3,"html"],cs,["for","confirmpassword",1,"cd-col-form-label"],es,["type","password","placeholder","Confirm password...","id","confirmpassword","name","confirmpassword","autocomplete","new-password","formControlName","confirmpassword",1,"form-control"],["type","button","cdPasswordButton","confirmpassword",1,"btn","btn-light"],ga,ya,["for","pwdExpirationDate",1,"cd-col-form-label",3,"ngClass"],fa,["class","text-pre-wrap",4,"ngIf"],["placeholder",la,"id","pwdExpirationDate","name","pwdExpirationDate","formControlName","pwdExpirationDate","triggers","manual",1,"form-control",3,"ngbPopover","click","keypress"],["p","ngbPopover"],["type","button",1,"btn","btn-light",3,"click"],[1,"text-pre-wrap"],["routerLink","/mgr-modules/edit/dashboard",1,"alert-link"],Pa,fl,[1,"no-border","full-height"],[3,"data","options","messages"],[1,"cd-col-form-offset"],[1,"custom-control","custom-checkbox"],["type","checkbox","id","enabled","name","enabled","formControlName","enabled",1,"custom-control-input"],["for","enabled",1,"custom-control-label"],To,["type","checkbox","id","pwdUpdateRequired","name","pwdUpdateRequired","formControlName","pwdUpdateRequired",1,"custom-control-input"],["for","pwdUpdateRequired",1,"custom-control-label"],ml,Zo,vs,Za,[3,"control","hasTime"]]},template:function(pn,xn){1&pn&&(U.YNc(0,Qo,41,25,"div",0),U.YNc(1,lo,8,0,"ng-template",null,1,U.W1O),U.YNc(3,Ai,1,2,"ng-template",null,2,U.W1O)),2&pn&&U.Q6J("cdFormLoading",xn.loading)},directives:[we.y,a._Y,a.JL,a.sg,ue.V,st.P,r.mk,We.o,a.Fj,Ve.b,a.JJ,a.u,Be.U,r.O5,cn.S,Sn.C,f.yS,c.o8,Or.m,a.Wl,je.p,ri.J],pipes:[r.rS,Ne.m],styles:[""]}),or})();var Ko=i(96102),qn=i(94088);const ei=["userRolesTpl"],wn=["warningTpl"],Qn=["durationTpl"];function Fr(or,si){if(1&or&&(U.TgZ(0,"span"),U._uU(1),U.qZA()),2&or){const pn=si.$implicit,xn=si.last;U.xp6(1),U.AsE(" ",pn,"",xn?"":", "," ")}}function oo(or,si){1&or&&U.YNc(0,Fr,2,2,"span",5),2&or&&U.Q6J("ngForOf",si.value)}function Li(or,si){if(1&or&&(U.TgZ(0,"div",6)(1,"div",7),U._uU(2),U.qZA()()),2&or){const pn=si.value,xn=si.row,Gr=U.oxw();U.ekj("border-danger",xn.remainingDays<Gr.expirationDangerAlert)("border-warning",xn.remainingDays<Gr.expirationWarningAlert&&xn.remainingDays>=Gr.expirationDangerAlert),U.xp6(2),U.hij(" ",pn," ")}}function yo(or,si){if(1&or&&U._UZ(0,"i",10),2&or){const pn=U.oxw().row,xn=U.oxw();U.Tol(xn.icons.warning),U.ekj("icon-danger-color",pn.remainingDays<xn.expirationDangerAlert)("icon-warning-color",pn.remainingDays<xn.expirationWarningAlert&&pn.remainingDays>=xn.expirationDangerAlert)}}function go(or,si){if(1&or&&(U.YNc(0,yo,1,7,"i",8),U.TgZ(1,"span",9),U.ALo(2,"cdDate"),U._uU(3),U.ALo(4,"duration"),U.qZA()),2&or){const pn=si.value,xn=si.row,Gr=U.oxw();U.Q6J("ngIf",xn.remainingDays<Gr.expirationWarningAlert),U.xp6(1),U.s9C("title",U.lcZ(2,3,pn)),U.xp6(2),U.Oqu(U.lcZ(4,5,xn.remainingTimeWithoutSeconds/1e3))}}let ua=(()=>{class or{constructor(pn,xn,Gr,no,mo,wo,Us,cs){this.userService=pn,this.emptyPipe=xn,this.modalService=Gr,this.notificationService=no,this.authStorageService=mo,this.urlBuilder=wo,this.settingsService=Us,this.actionLabels=cs,this.selection=new $r.r,this.icons=ur.P,this.permission=this.authStorageService.getPermissions().user,this.tableActions=[{permission:"create",icon:ur.P.add,routerLink:()=>this.urlBuilder.getCreate(),name:this.actionLabels.CREATE},{permission:"update",icon:ur.P.edit,routerLink:()=>this.selection.first()&&this.urlBuilder.getEdit(this.selection.first().username),name:this.actionLabels.EDIT},{permission:"delete",icon:ur.P.destroy,click:()=>this.deleteUserModal(),name:this.actionLabels.DELETE}]}ngOnInit(){this.columns=[{name:"Username",prop:"username",flexGrow:1,cellTemplate:this.warningTpl},{name:"Name",prop:"name",flexGrow:1,pipe:this.emptyPipe},{name:"Email",prop:"email",flexGrow:1,pipe:this.emptyPipe},{name:"Roles",prop:"roles",flexGrow:1,cellTemplate:this.userRolesTpl},{name:"Enabled",prop:"enabled",flexGrow:1,cellTransformation:mi.e.checkIcon},{name:"Password expires",prop:"pwdExpirationDate",flexGrow:1,cellTemplate:this.durationTpl}],this.settingsService.getValues(["USER_PWD_EXPIRATION_WARNING_1","USER_PWD_EXPIRATION_WARNING_2"]).subscribe(xn=>{this.expirationWarningAlert=xn.USER_PWD_EXPIRATION_WARNING_1,this.expirationDangerAlert=xn.USER_PWD_EXPIRATION_WARNING_2})}getUsers(){this.userService.list().subscribe(pn=>{pn.forEach(xn=>{xn.remainingTimeWithoutSeconds=0,xn.pwdExpirationDate&&xn.pwdExpirationDate>0&&(xn.pwdExpirationDate=1e3*xn.pwdExpirationDate,xn.remainingTimeWithoutSeconds=this.getRemainingTimeWithoutSeconds(xn.pwdExpirationDate),xn.remainingDays=this.getRemainingDays(xn.pwdExpirationDate))}),this.users=pn})}updateSelection(pn){this.selection=pn}deleteUser(pn){this.userService.delete(pn).subscribe(()=>{this.getUsers(),this.modalRef.close(),this.notificationService.show(L.k.success,"Deleted user '" + pn + "'")},()=>{this.modalRef.componentInstance.stopLoadingSpinner()})}deleteUserModal(){const pn=this.authStorageService.getUsername(),xn=this.selection.first().username;pn!==xn?this.modalRef=this.modalService.show(pr.M,{itemDescription:"User",itemNames:[xn],submitAction:()=>this.deleteUser(xn)}):this.notificationService.show(L.k.error,"Failed to delete user '" + xn + "'","You are currently logged in as '" + xn + "'.")}getWarningIconClass(pn){return null===pn||this.expirationWarningAlert>10?"":this.getRemainingDays(pn)<=this.expirationDangerAlert?"icon-danger-color":"icon-warning-color"}getWarningClass(pn){return null===pn||this.expirationWarningAlert>10?"":this.getRemainingDays(pn)<=this.expirationDangerAlert?"border-danger":"border-warning"}getRemainingDays(pn){if(void 0!==pn&&null!=pn)return pn<0?0:Math.max(0,Math.floor(this.getRemainingTime(pn)/864e5))}getRemainingTimeWithoutSeconds(pn){const xn=this.getRemainingTime(pn);return 60*Math.floor(xn/6e4)*1e3}getRemainingTime(pn){return pn-Date.now()}}return or.\u0275fac=function(pn){return new(pn||or)(U.Y36(Mn.K),U.Y36(Br.W),U.Y36(dr.Z),U.Y36(ee.g),U.Y36(Xn.j),U.Y36(Pn.F),U.Y36(Gn.g),U.Y36(p.p4))},or.\u0275cmp=U.Xpm({type:or,selectors:[["cd-user-list"]],viewQuery:function(pn,xn){if(1&pn&&(U.Gf(ei,7),U.Gf(wn,7),U.Gf(Qn,7)),2&pn){let Gr;U.iGM(Gr=U.CRH())&&(xn.userRolesTpl=Gr.first),U.iGM(Gr=U.CRH())&&(xn.warningTpl=Gr.first),U.iGM(Gr=U.CRH())&&(xn.durationTpl=Gr.first)}},features:[U._Bn([{provide:Pn.F,useValue:new Pn.F("user-management/users")}])],decls:9,vars:5,consts:function(){let si;return si="User's password is about to expire",[["columnMode","flex","identifier","username","selectionType","single",3,"data","columns","fetchData","updateSelection"],[1,"table-actions",3,"permission","selection","tableActions"],["userRolesTpl",""],["warningTpl",""],["durationTpl",""],[4,"ngFor","ngForOf"],[1,"border-margin"],[1,"warning-content"],["title",si,3,"icon-danger-color","icon-warning-color","class",4,"ngIf"],[3,"title"],["title",si]]},template:function(pn,xn){1&pn&&(U._UZ(0,"cd-user-tabs"),U.TgZ(1,"cd-table",0),U.NdJ("fetchData",function(){return xn.getUsers()})("updateSelection",function(no){return xn.updateSelection(no)}),U._UZ(2,"cd-table-actions",1),U.qZA(),U.YNc(3,oo,1,1,"ng-template",null,2,U.W1O),U.YNc(5,Li,3,5,"ng-template",null,3,U.W1O),U.YNc(7,go,5,7,"ng-template",null,4,U.W1O)),2&pn&&(U.xp6(1),U.Q6J("data",xn.users)("columns",xn.columns),U.xp6(1),U.Q6J("permission",xn.permission)("selection",xn.selection)("tableActions",xn.tableActions))},directives:[Ci,xe.a,_i.K,r.sg,r.O5],pipes:[Ko.N,qn.u],styles:[".border-margin[_ngcontent-%COMP%]{border-left:3px solid transparent;height:calc(100% + 10px);margin-bottom:-5px;margin-left:-5px;margin-top:-5px}.warning-content[_ngcontent-%COMP%]{height:100%;padding-bottom:5px;padding-left:5px;padding-top:5px}"]}),or})(),er=(()=>{class or{}return or.\u0275fac=function(pn){return new(pn||or)},or.\u0275mod=U.oAB({type:or}),or.\u0275inj=U.cJS({imports:[[r.ez,a.u5,a.UX,y.m,c.Oz,c.dT,e.b,f.Bz]]}),or})();const vr=[{path:"",redirectTo:"users",pathMatch:"full"},{path:"users",data:{breadcrumbs:"Users"},children:[{path:"",component:ua},{path:p.MQ.CREATE,component:Fo,data:{breadcrumbs:p.Qn.CREATE}},{path:`${p.MQ.EDIT}/:username`,component:Fo,data:{breadcrumbs:p.Qn.EDIT}}]},{path:"roles",data:{breadcrumbs:"Roles"},children:[{path:"",component:Kt},{path:p.MQ.CREATE,component:Yt,data:{breadcrumbs:p.Qn.CREATE}},{path:`${p.MQ.EDIT}/:name`,component:Yt,data:{breadcrumbs:p.Qn.EDIT}}]}];let yr=(()=>{class or{}return or.\u0275fac=function(pn){return new(pn||or)},or.\u0275mod=U.oAB({type:or}),or.\u0275inj=U.cJS({imports:[[er,f.Bz.forChild(vr)]]}),or})()},26504:(m,S,i)=>{"use strict";i.d(S,{_2:()=>f,mM:()=>e,s9:()=>a});var r=i(65862);class a extends Error{}class f extends a{constructor(){super(...arguments),this.header="Page Not Found",this.message="Sorry, we couldn\u2019t find what you were looking for.\n  The page you requested may have been changed or moved.",this.icon=r.P.warning}}class e extends a{constructor(){super(...arguments),this.header="User Denied",this.message="Sorry, the user does not exist in Ceph.\n  You'll be logged out from the Identity Provider when you retry logging in.",this.icon=r.P.warning}}},76189:(m,S,i)=>{"use strict";i.d(S,{S:()=>r});class r{getVersionHeaderValue(f,c){return`application/vnd.ceph.api.v${f}.${c}+json`}}},39219:(m,S,i)=>{"use strict";i.d(S,{e:()=>T});var r=i(23815),f=i(68307),c=i(89724),e=i(47640),p=i(19725),y=i(55860);let T=(()=>{class C{constructor(L,z,W,J){this.authStorageService=L,this.http=z,this.router=W,this.route=J}check(L){return this.http.post("api/auth/check",{token:L})}login(L){return this.http.post("api/auth",L).pipe((0,f.b)(z=>{this.authStorageService.set(z.username,z.permissions,z.sso,z.pwdExpirationDate,z.pwdUpdateRequired)}))}logout(L=null){return this.http.post("api/auth/logout",null).subscribe(z=>{this.authStorageService.remove();const W=r.get(this.route.snapshot.queryParams,"returnUrl","/login");this.router.navigate([W],{skipLocationChange:!0}),L&&L(),window.location.replace(z.redirect_url)})}}return C.\u0275fac=function(L){return new(L||C)(c.LFG(e.j),c.LFG(p.eN),c.LFG(y.F0),c.LFG(y.gz))},C.\u0275prov=c.Yz7({token:C,factory:C.\u0275fac,providedIn:"root"}),C})()},64724:(m,S,i)=>{"use strict";i.d(S,{e:()=>f});var r=i(89724),a=i(19725);let f=(()=>{class c{constructor(p){this.http=p}findValue(p,y){if(p.value)return p.value.find(T=>T.section===y)}getValue(p,y){let T=this.findValue(p,y);if(!T){const C=y.indexOf(".");-1!==C&&(T=this.findValue(p,y.substring(0,C)))}return T||(T=this.findValue(p,"global")),T?T.value:p.default}getConfigData(){return this.http.get("api/cluster_conf/")}get(p){return this.http.get(`api/cluster_conf/${p}`)}filter(p){return this.http.get(`api/cluster_conf/filter?names=${p.join(",")}`)}create(p){return this.http.post("api/cluster_conf/",p)}delete(p,y){return this.http.delete(`api/cluster_conf/${p}?section=${y}`)}bulkCreate(p){return this.http.put("api/cluster_conf/",p)}}return c.\u0275fac=function(p){return new(p||c)(r.LFG(a.eN))},c.\u0275prov=r.Yz7({token:c,factory:c.\u0275fac,providedIn:"root"}),c})()},83608:(m,S,i)=>{"use strict";i.d(S,{H:()=>f});var r=i(89724),a=i(19725);let f=(()=>{class c{constructor(p){this.http=p,this.apiPath="api/crush_rule",this.formTooltips={root:"The name of the node under which data should be placed.",failure_domain:"The type of CRUSH nodes across which we should separate replicas.",device_class:"The device class data should be placed on."}}create(p){return this.http.post(this.apiPath,p,{observe:"response"})}delete(p){return this.http.delete(`${this.apiPath}/${p}`,{observe:"response"})}getInfo(){return this.http.get(`ui-${this.apiPath}/info`)}}return c.\u0275fac=function(p){return new(p||c)(r.LFG(a.eN))},c.\u0275prov=r.Yz7({token:c,factory:c.\u0275fac,providedIn:"root"}),c})()},7273:(m,S,i)=>{"use strict";i.d(S,{N:()=>f});var r=i(89724),a=i(19725);let f=(()=>{class c{constructor(p){this.http=p,this.url="api/mgr/module"}list(){return this.http.get(`${this.url}`)}getConfig(p){return this.http.get(`${this.url}/${p}`)}updateConfig(p,y){return this.http.put(`${this.url}/${p}`,{config:y})}enable(p){return this.http.post(`${this.url}/${p}/enable`,null)}disable(p){return this.http.post(`${this.url}/${p}/disable`,null)}getOptions(p){return this.http.get(`${this.url}/${p}/options`)}}return c.\u0275fac=function(p){return new(p||c)(r.LFG(a.eN))},c.\u0275prov=r.Yz7({token:c,factory:c.\u0275fac,providedIn:"root"}),c})()},80842:(m,S,i)=>{"use strict";i.d(S,{q:()=>y});var r=i(64762),a=i(19725),f=i(88002),c=i(93523),e=i(34089),p=i(89724);let y=class{constructor(C,R){this.http=C,this.rbdConfigurationService=R,this.apiPath="api/pool"}create(C){return this.http.post(this.apiPath,C,{observe:"response"})}update(C){let R;return C.hasOwnProperty("srcpool")?(R=C.srcpool,delete C.srcpool):(R=C.pool,delete C.pool),this.http.put(`${this.apiPath}/${encodeURIComponent(R)}`,C,{observe:"response"})}delete(C){return this.http.delete(`${this.apiPath}/${C}`,{observe:"response"})}get(C){return this.http.get(`${this.apiPath}/${C}`)}getList(){return this.http.get(`${this.apiPath}?stats=true`)}getConfiguration(C){return this.http.get(`${this.apiPath}/${C}/configuration`).pipe((0,f.U)(R=>R.map(L=>Object.assign(L,this.rbdConfigurationService.getOptionByName(L.name)))))}getInfo(){return this.http.get(`ui-${this.apiPath}/info`)}list(C=[]){const R=C.join(",");return this.http.get(`${this.apiPath}?attrs=${R}`).toPromise().then(L=>L)}};y.\u0275fac=function(C){return new(C||y)(p.LFG(a.eN),p.LFG(e.n))},y.\u0275prov=p.Yz7({token:y,factory:y.\u0275fac,providedIn:"root"}),y=(0,r.gn)([c.o,(0,r.w6)("design:paramtypes",[a.eN,e.n])],y)},95152:(m,S,i)=>{"use strict";i.d(S,{o:()=>z});var r=i(64762),a=i(19725),f=i(23815),c=i.n(f),e=i(25917),p=i(96736),y=i(5304),T=i(76189),C=i(20523),R=i(93523),L=i(89724);let z=class extends T.S{constructor(J,ee){super(),this.http=J,this.rgwDaemonService=ee,this.url="api/rgw/bucket"}list(J=!1,ee=""){return this.rgwDaemonService.request(ce=>(ce=ce.append("stats",J.toString()),ee&&(ce=ce.append("uid",ee)),this.http.get(this.url,{headers:{Accept:this.getVersionHeaderValue(1,1)},params:ce})))}get(J){return this.rgwDaemonService.request(ee=>this.http.get(`${this.url}/${J}`,{params:ee}))}create(J,ee,ce,ie,U,se,ge,ae,he,be){return this.rgwDaemonService.request(we=>this.http.post(this.url,null,{params:new a.LE({fromObject:{bucket:J,uid:ee,zonegroup:ce,placement_target:ie,lock_enabled:String(U),lock_mode:se,lock_retention_period_days:ge,encryption_state:String(ae),encryption_type:he,key_id:be,daemon_name:we.get("daemon_name")}})}))}update(J,ee,ce,ie,U,se,ge,ae,he,be,we,ue){return this.rgwDaemonService.request(st=>(st=st.appendAll({bucket_id:ee,uid:ce,versioning_state:ie,encryption_state:String(U),encryption_type:se,key_id:ge,mfa_delete:ae,mfa_token_serial:he,mfa_token_pin:be,lock_mode:we,lock_retention_period_days:ue}),this.http.put(`${this.url}/${J}`,null,{params:st})))}delete(J,ee=!0){return this.rgwDaemonService.request(ce=>(ce=ce.append("purge_objects",ee?"true":"false"),this.http.delete(`${this.url}/${J}`,{params:ce})))}exists(J){return this.get(J).pipe((0,p.h)(!0),(0,y.K)(ee=>(c().isFunction(ee.preventDefault)&&ee.preventDefault(),(0,e.of)(!1))))}getLockDays(J){return J.lock_retention_period_years>0?Math.floor(365.242*J.lock_retention_period_years):J.lock_retention_period_days||0}setEncryptionConfig(J,ee,ce,ie,U,se,ge,ae,he,be,we,ue){return this.rgwDaemonService.request(st=>(st=st.appendAll({encryption_type:J,kms_provider:ee,auth_method:ce,secret_engine:ie,secret_path:U,namespace:se,address:ge,token:ae,owner:he,ssl_cert:be,client_cert:we,client_key:ue}),this.http.put(`${this.url}/setEncryptionConfig`,null,{params:st})))}getEncryption(J){return this.rgwDaemonService.request(ee=>this.http.get(`${this.url}/${J}/getEncryption`,{params:ee}))}deleteEncryption(J){return this.rgwDaemonService.request(ee=>this.http.get(`${this.url}/${J}/deleteEncryption`,{params:ee}))}getEncryptionConfig(){return this.rgwDaemonService.request(J=>this.http.get(`${this.url}/getEncryptionConfig`,{params:J}))}};z.\u0275fac=function(J){return new(J||z)(L.LFG(a.eN),L.LFG(C.b))},z.\u0275prov=L.Yz7({token:z,factory:z.\u0275fac,providedIn:"root"}),z=(0,r.gn)([R.o,(0,r.w6)("design:paramtypes",[a.eN,C.b])],z)},20523:(m,S,i)=>{"use strict";i.d(S,{b:()=>W});var r=i(64762),a=i(19725),f=i(23815),c=i.n(f),e=i(26215),p=i(40205),y=i(25917),T=i(68307),C=i(19773),R=i(15257),L=i(93523),z=i(89724);let W=class{constructor(ee){this.http=ee,this.url="api/rgw/daemon",this.daemons=new e.X([]),this.daemons$=this.daemons.asObservable(),this.selectedDaemon=new e.X(null),this.selectedDaemon$=this.selectedDaemon.asObservable()}list(){return this.http.get(this.url).pipe((0,T.b)(ee=>{this.daemons.next(ee);const ce=this.selectedDaemon.getValue();(c().isEmpty(ce)||void 0===c().find(ee,{id:ce.id}))&&this.selectDefaultDaemon(ee)}))}get(ee){return this.http.get(`${this.url}/${ee}`)}selectDaemon(ee){this.selectedDaemon.next(ee)}selectDefaultDaemon(ee){if(0===ee.length)return null;for(const ce of ee)if(ce.default)return this.selectDaemon(ce),ce;return this.selectDaemon(ee[0]),ee[0]}request(ee){return this.selectedDaemon.pipe((0,C.zg)(ce=>c().isEmpty(ce)?this.list().pipe((0,C.zg)(ie=>c().isEmpty(ie)?(0,p._)("No RGW daemons found!"):this.selectedDaemon$)):(0,y.of)(ce)),(0,R.q)(1),(0,C.zg)(ce=>{let ie=new a.LE;return ie=ie.append("daemon_name",ce.id),ee(ie)}))}};W.\u0275fac=function(ee){return new(ee||W)(z.LFG(a.eN))},W.\u0275prov=z.Yz7({token:W,factory:W.\u0275fac,providedIn:"root"}),W=(0,r.gn)([L.o,(0,r.w6)("design:paramtypes",[a.eN])],W)},33394:(m,S,i)=>{"use strict";i.d(S,{I:()=>T});var r=i(64762),a=i(19725),f=i(19773),c=i(88002),e=i(20523),p=i(93523),y=i(89724);let T=class{constructor(R,L){this.http=R,this.rgwDaemonService=L,this.url="api/rgw/site"}get(R){return this.rgwDaemonService.request(L=>(R&&(L=L.append("query",R)),this.http.get(this.url,{params:L})))}isDefaultRealm(){return this.get("default-realm").pipe((0,f.zg)(R=>this.rgwDaemonService.selectedDaemon$.pipe((0,c.U)(L=>L.realm_name===R))))}};T.\u0275fac=function(R){return new(R||T)(y.LFG(a.eN),y.LFG(e.b))},T.\u0275prov=y.Yz7({token:T,factory:T.\u0275fac,providedIn:"root"}),T=(0,r.gn)([p.o,(0,r.w6)("design:paramtypes",[a.eN,e.b])],T)},9837:(m,S,i)=>{"use strict";i.d(S,{g:()=>y});var r=i(23815),a=i.n(r),f=i(88002),c=i(89724),e=i(19725);let y=(()=>{class T{constructor(R){this.http=R,this.settings={}}getValues(R){return a().isArray(R)&&(R=R.join(",")),this.http.get(`api/settings?names=${R}`).pipe((0,f.U)(L=>{const z={};return a().forEach(L,W=>{a().set(z,W.name,W.value)}),z}))}ifSettingConfigured(R,L,z){const W=this.settings[R];void 0===W?this.http.get(R).subscribe(J=>{this.settings[R]=this.getSettingsValue(J),this.ifSettingConfigured(R,L,z)},J=>{401!==J.status&&(this.settings[R]="")}):""!==W?L(W):z&&z()}disableSetting(R){this.settings[R]=""}getSettingsValue(R){return R.value||R.instance||""}validateGrafanaDashboardUrl(R){return this.http.get(`api/grafana/validation/${R}`)}getStandardSettings(){return this.http.get("ui-api/standard_settings")}}return T.\u0275fac=function(R){return new(R||T)(c.LFG(e.eN))},T.\u0275prov=c.Yz7({token:T,factory:T.\u0275fac,providedIn:"root"}),T})()},32057:(m,S,i)=>{"use strict";i.d(S,{K:()=>p});var r=i(25917),a=i(96736),f=i(5304),c=i(89724),e=i(19725);let p=(()=>{class y{constructor(C){this.http=C}list(){return this.http.get("api/user")}delete(C){return this.http.delete(`api/user/${C}`)}get(C){return this.http.get(`api/user/${C}`)}create(C){return this.http.post("api/user",C)}update(C){return this.http.put(`api/user/${C.username}`,C)}changePassword(C,R,L){return this.http.post(`api/user/${C}/change_password`,{old_password:R,new_password:L})}validateUserName(C){return this.get(C).pipe((0,a.h)(!0),(0,f.K)(R=>(R.preventDefault(),(0,r.of)(!1))))}validatePassword(C,R=null,L=null){return this.http.post("api/user/validate_password",{password:C,username:R,old_password:L})}}return y.\u0275fac=function(C){return new(C||y)(c.LFG(e.eN))},y.\u0275prov=c.Yz7({token:y,factory:y.\u0275fac,providedIn:"root"}),y})()},51295:(m,S,i)=>{"use strict";i.d(S,{T:()=>f});var r=i(23815),a=i.n(r);class f{static updateChanged(e,p){let y=!1;return Object.keys(p).forEach(T=>{const C=p[T];a().isEqual(C,e[T])||(e[T]=C,y=!0)}),y}static cdVersionHeader(e,p){return`application/vnd.ceph.api.v${e}.${p}+json`}}},99475:(m,S,i)=>{"use strict";i.d(S,{P:()=>r});class r{propertyValue(f){return getComputedStyle(document.body).getPropertyValue(`--${f}`)}}},68136:(m,S,i)=>{"use strict";i.d(S,{o:()=>a});var r=i(71225);class a{constructor(c){this.ngZone=c}setExpandedRow(c){this.expandedRow=c}setTableRefreshTimeout(){clearTimeout(this.staleTimeout),this.ngZone.runOutsideAngular(()=>{this.staleTimeout=window.setTimeout(()=>{this.ngZone.run(()=>{this.tableStatus=new r.c("warning","The user list data might be stale. If needed, you can manually reload it.")})},1e4)})}}},69158:(m,S,i)=>{"use strict";i.d(S,{E:()=>f});var r=i(91801),a=i(71225);class f extends a.c{constructor(e=r.T.ValueOk,p=""){switch(super(),e){case r.T.ValueOk:this.type="light",this.msg="";break;case r.T.ValueNone:this.type="info",this.msg=(p?"Retrieving data for " + p + ".":"Retrieving data.")+" "+"Please wait...";break;case r.T.ValueStale:this.type="warning",this.msg=p?"Displaying previously cached data for " + p + ".":"Displaying previously cached data.";break;case r.T.ValueException:this.type="danger",this.msg=(p?"Could not load data for " + p + ".":"Could not load data.")+" "+"Please check the cluster health."}}}},71225:(m,S,i)=>{"use strict";i.d(S,{c:()=>r});class r{constructor(f="light",c=""){this.type=f,this.msg=c}}},34501:(m,S,i)=>{"use strict";i.d(S,{G:()=>ce});var r=i(89724),a=i(65862),f=i(71334),c=i(11048);const e=function(ie){return[ie]};function p(ie,U){if(1&ie&&(r.TgZ(0,"td",8),r._UZ(1,"i",9),r.qZA()),2&ie){const se=r.oxw(2);r.xp6(1),r.MT6("alert-",se.bootstrapClass," ",se.typeIcon,""),r.Q6J("ngClass",r.VKq(5,e,se.icons.large3x))}}function y(ie,U){if(1&ie&&(r.TgZ(0,"td",10),r._uU(1),r.qZA()),2&ie){const se=r.oxw(2);r.xp6(1),r.Oqu(se.title)}}function T(ie,U){1&ie&&r.GkF(0)}function C(ie,U){if(1&ie&&(r.ynx(0),r.TgZ(1,"tr"),r.YNc(2,p,2,7,"td",4),r.YNc(3,y,2,1,"td",5),r.qZA(),r.TgZ(4,"tr")(5,"td",6),r.YNc(6,T,1,0,"ng-container",7),r.qZA()(),r.BQk()),2&ie){const se=r.oxw(),ge=r.MAs(6);r.xp6(2),r.Q6J("ngIf",se.showIcon),r.xp6(1),r.Q6J("ngIf",se.showTitle),r.xp6(3),r.Q6J("ngTemplateOutlet",ge)}}function R(ie,U){if(1&ie&&(r.TgZ(0,"td",12),r._UZ(1,"i",13),r.qZA()),2&ie){const se=r.oxw(2);r.xp6(1),r.MT6("alert-",se.bootstrapClass," ",se.typeIcon,"")}}function L(ie,U){if(1&ie&&(r.TgZ(0,"td",10),r._uU(1),r.qZA()),2&ie){const se=r.oxw(2);r.xp6(1),r.Oqu(se.title)}}function z(ie,U){1&ie&&r.GkF(0)}function W(ie,U){if(1&ie&&(r.TgZ(0,"tr"),r.YNc(1,R,2,4,"td",11),r.YNc(2,L,2,1,"td",5),r.TgZ(3,"td",6),r.YNc(4,z,1,0,"ng-container",7),r.qZA()()),2&ie){const se=r.oxw(),ge=r.MAs(6);r.xp6(1),r.Q6J("ngIf",se.showIcon),r.xp6(1),r.Q6J("ngIf",se.showTitle),r.xp6(2),r.Q6J("ngTemplateOutlet",ge)}}function J(ie,U){1&ie&&r.Hsn(0)}const ee=["*"];let ce=(()=>{class ie{constructor(){this.title="",this.bootstrapClass="",this.size="normal",this.showIcon=!0,this.showTitle=!0,this.dismissible=!1,this.dismissed=new r.vpe,this.icons=a.P}ngOnInit(){switch(this.type){case"warning":this.title=this.title||"Warning",this.typeIcon=this.typeIcon||a.P.warning,this.bootstrapClass=this.bootstrapClass||"warning";break;case"error":this.title=this.title||"Error",this.typeIcon=this.typeIcon||a.P.destroyCircle,this.bootstrapClass=this.bootstrapClass||"danger";break;case"info":this.title=this.title||"Information",this.typeIcon=this.typeIcon||a.P.infoCircle,this.bootstrapClass=this.bootstrapClass||"info";break;case"success":this.title=this.title||"Success",this.typeIcon=this.typeIcon||a.P.check,this.bootstrapClass=this.bootstrapClass||"success";break;case"danger":this.title=this.title||"Danger",this.typeIcon=this.typeIcon||a.P.warning,this.bootstrapClass=this.bootstrapClass||"danger"}}onClose(){this.dismissed.emit()}}return ie.\u0275fac=function(se){return new(se||ie)},ie.\u0275cmp=r.Xpm({type:ie,selectors:[["cd-alert-panel"]],inputs:{title:"title",bootstrapClass:"bootstrapClass",type:"type",typeIcon:"typeIcon",size:"size",showIcon:"showIcon",showTitle:"showTitle",dismissible:"dismissible"},outputs:{dismissed:"dismissed"},ngContentSelectors:ee,decls:7,vars:4,consts:[[3,"type","dismissible","closed"],[4,"ngIf","ngIfElse"],["slim",""],["content",""],["rowspan","2","class","alert-panel-icon",4,"ngIf"],["class","alert-panel-title",4,"ngIf"],[1,"alert-panel-text"],[4,"ngTemplateOutlet"],["rowspan","2",1,"alert-panel-icon"],["aria-hidden","true",3,"ngClass"],[1,"alert-panel-title"],["class","alert-panel-icon",4,"ngIf"],[1,"alert-panel-icon"],["aria-hidden","true"]],template:function(se,ge){if(1&se&&(r.F$t(),r.TgZ(0,"ngb-alert",0),r.NdJ("closed",function(){return ge.onClose()}),r.TgZ(1,"table"),r.YNc(2,C,7,3,"ng-container",1),r.YNc(3,W,5,3,"ng-template",null,2,r.W1O),r.qZA()(),r.YNc(5,J,1,0,"ng-template",null,3,r.W1O)),2&se){const ae=r.MAs(4);r.s9C("type",ge.bootstrapClass),r.Q6J("dismissible",ge.dismissible),r.xp6(2),r.Q6J("ngIf","normal"===ge.size)("ngIfElse",ae)}},directives:[f.xm,c.O5,c.mk,c.tP],styles:[".alert-panel-icon[_ngcontent-%COMP%]{padding-right:.5em;vertical-align:top}.alert-panel-title[_ngcontent-%COMP%]{font-weight:700}.alert[_ngcontent-%COMP%]{margin-bottom:0}"]}),ie})()},13472:(m,S,i)=>{"use strict";i.d(S,{W:()=>e});var r=i(89724),a=i(79512),f=i(11048),c=i(87925);let e=(()=>{class p{constructor(T,C){this.location=T,this.actionLabels=C,this.backAction=new r.vpe,this.name=this.actionLabels.CANCEL}back(){0===this.backAction.observers.length?this.location.back():this.backAction.emit()}}return p.\u0275fac=function(T){return new(T||p)(r.Y36(f.Ye),r.Y36(a.p4))},p.\u0275cmp=r.Xpm({type:p,selectors:[["cd-back-button"]],inputs:{name:"name"},outputs:{backAction:"backAction"},decls:2,vars:1,consts:[["type","button",1,"btn","btn-light","tc_backButton",3,"click"]],template:function(T,C){1&T&&(r.TgZ(0,"button",0),r.NdJ("click",function(){return C.back()}),r._uU(1),r.qZA()),2&T&&(r.xp6(1),r.hij(" ",C.name,"\n"))},directives:[c.o],styles:[""]}),p})()},15626:(m,S,i)=>{"use strict";i.d(S,{K:()=>L});var r=i(11048),a=i(1659),f=i(55860),c=i(71334),e=i(90504),p=i(72621),y=i(85770),T=i(35540),C=i(12455),R=i(89724);let L=(()=>{class z{}return z.\u0275fac=function(J){return new(J||z)},z.\u0275mod=R.oAB({type:z}),z.\u0275inj=R.cJS({providers:[],imports:[[r.ez,a.u5,a.UX,c._A,c.dT,c.ZQ,c.HK,p.m9,a.UX,C.D,T.o,c.XC,e.w,y.t,f.Bz,c.M,c.UL]]}),z})()},36169:(m,S,i)=>{"use strict";i.d(S,{Y:()=>L});var r=i(1659),a=i(89724),f=i(71334),c=i(60312),e=i(11048),p=i(41582),y=i(30839);function T(z,W){1&z&&(a.TgZ(0,"span",11),a._UZ(1,"i",12),a.qZA())}function C(z,W){1&z&&a.GkF(0)}function R(z,W){if(1&z&&(a.TgZ(0,"p"),a._uU(1),a.qZA()),2&z){const J=a.oxw();a.xp6(1),a.hij(" ",J.description," ")}}let L=(()=>{class z{constructor(J){this.activeModal=J,this.warning=!1,this.showSubmit=!0,this.boundCancel=this.cancel.bind(this),this.canceled=!1,this.confirmationForm=new r.cw({})}ngOnInit(){if(this.bodyContext=this.bodyContext||{},this.bodyContext.$implicit=this.bodyData,!this.onSubmit)throw new Error("No submit action defined");if(!this.buttonText)throw new Error("No action name defined");if(!this.titleText)throw new Error("No title defined");if(!this.bodyTpl&&!this.description)throw new Error("No description defined")}ngOnDestroy(){this.onCancel&&this.canceled&&this.onCancel()}cancel(){this.canceled=!0,this.activeModal.close()}stopLoadingSpinner(){this.confirmationForm.setErrors({cdSubmitButton:!0})}}return z.\u0275fac=function(J){return new(J||z)(a.Y36(f.Kz))},z.\u0275cmp=a.Xpm({type:z,selectors:[["cd-confirmation-modal"]],decls:12,vars:9,consts:[[3,"hide"],[1,"modal-title"],["class","text-warning",4,"ngIf"],[1,"modal-content"],["name","confirmationForm","novalidate","",3,"formGroup"],["formDir","ngForm"],[1,"modal-body"],[4,"ngTemplateOutlet","ngTemplateOutletContext"],[4,"ngIf"],[1,"modal-footer"],[3,"form","submitText","showSubmit","submitActionEvent","backActionEvent"],[1,"text-warning"],[1,"fa","fa-exclamation-triangle","fa-1x"]],template:function(J,ee){1&J&&(a.TgZ(0,"cd-modal",0),a.NdJ("hide",function(){return ee.cancel()}),a.ynx(1,1),a.YNc(2,T,2,0,"span",2),a._uU(3),a.BQk(),a.ynx(4,3),a.TgZ(5,"form",4,5)(7,"div",6),a.YNc(8,C,1,0,"ng-container",7),a.YNc(9,R,2,1,"p",8),a.qZA(),a.TgZ(10,"div",9)(11,"cd-form-button-panel",10),a.NdJ("submitActionEvent",function(){return ee.onSubmit(ee.confirmationForm.value)})("backActionEvent",function(){return ee.boundCancel()}),a.qZA()()(),a.BQk(),a.qZA()),2&J&&(a.xp6(2),a.Q6J("ngIf",ee.warning),a.xp6(1),a.Oqu(ee.titleText),a.xp6(2),a.Q6J("formGroup",ee.confirmationForm),a.xp6(3),a.Q6J("ngTemplateOutlet",ee.bodyTpl)("ngTemplateOutletContext",ee.bodyContext),a.xp6(1),a.Q6J("ngIf",ee.description),a.xp6(2),a.Q6J("form",ee.confirmationForm)("submitText",ee.buttonText)("showSubmit",ee.showSubmit))},directives:[c.z,e.O5,r._Y,r.JL,r.sg,p.V,e.tP,y.p],styles:[""]}),z})()},58039:(m,S,i)=>{"use strict";i.d(S,{s:()=>T});var r=i(97057),a=i(65862),f=i(89724),c=i(92870),e=i(87925),p=i(11048);const y=function(C){return[C]};let T=(()=>{class C{constructor(L){this.toastr=L,this.byId=!0,this.icons=a.P}getText(){return document.getElementById(this.source).value}onClick(){try{const L=(0,r.qY)(),z=this.byId?this.getText():this.source,W=()=>{this.toastr.success("Copied text to the clipboard successfully.")};["firefox","ie","ios","safari"].includes(L.name)?navigator.clipboard.writeText(z).then(()=>W()):navigator.permissions.query({name:"clipboard-write"}).then(J=>{("granted"===J.state||"prompt"===J.state)&&navigator.clipboard.writeText(z).then(()=>W())})}catch(L){this.toastr.error("Failed to copy text to the clipboard.")}}}return C.\u0275fac=function(L){return new(L||C)(f.Y36(c._W))},C.\u0275cmp=f.Xpm({type:C,selectors:[["cd-copy-2-clipboard-button"]],hostBindings:function(L,z){1&L&&f.NdJ("click",function(){return z.onClick()})},inputs:{source:"source",byId:"byId"},decls:2,vars:3,consts:function(){let R;return R="Copy to Clipboard",[["type","button","title",R,1,"btn","btn-light",3,"click"],[3,"ngClass"]]},template:function(L,z){1&L&&(f.TgZ(0,"button",0),f.NdJ("click",function(){return z.onClick()}),f._UZ(1,"i",1),f.qZA()),2&L&&(f.xp6(1),f.Q6J("ngClass",f.VKq(1,y,z.icons.clipboard)))},directives:[e.o,p.mk],styles:[""]}),C})()},30982:(m,S,i)=>{"use strict";i.d(S,{M:()=>we});var r=i(1659),a=i(95463),f=i(39749),c=i(89724),e=i(71334),p=i(60312),y=i(11048),T=i(41582),C=i(56310),R=i(87925),L=i(94276),z=i(82945),W=i(30839);function J(ue,st){1&ue&&c.GkF(0)}function ee(ue,st){1&ue&&c.GkF(0)}function ce(ue,st){if(1&ue&&(c.TgZ(0,"p"),c.tHW(1,21),c.ALo(2,"lowercase"),c._UZ(3,"strong"),c.N_p(),c.qZA()),2&ue){const We=c.oxw(2);c.xp6(3),c.pQV(c.lcZ(2,2,We.actionDescription))(We.itemNames[0]),c.QtT(1)}}function ie(ue,st){if(1&ue&&(c.TgZ(0,"li")(1,"strong"),c._uU(2),c.qZA()()),2&ue){const We=st.$implicit;c.xp6(2),c.Oqu(We)}}function U(ue,st){if(1&ue&&(c.TgZ(0,"p"),c.SDv(1,22),c.ALo(2,"lowercase"),c.qZA(),c.TgZ(3,"ul"),c.YNc(4,ie,3,1,"li",23),c.qZA()),2&ue){const We=c.oxw(2);c.xp6(2),c.pQV(c.lcZ(2,2,We.actionDescription)),c.QtT(1),c.xp6(2),c.Q6J("ngForOf",We.itemNames)}}function se(ue,st){if(1&ue&&(c.TgZ(0,"span"),c.YNc(1,ce,4,4,"p",10),c.YNc(2,U,5,4,"ng-template",null,20,c.W1O),c.qZA()),2&ue){const We=c.MAs(3),Ve=c.oxw();c.xp6(1),c.Q6J("ngIf",1===Ve.itemNames.length)("ngIfElse",We)}}function ge(ue,st){if(1&ue&&(c.TgZ(0,"p"),c.SDv(1,24),c.ALo(2,"lowercase"),c.qZA()),2&ue){const We=c.oxw();c.xp6(2),c.pQV(c.lcZ(2,2,We.actionDescription))(We.itemDescription),c.QtT(1)}}function ae(ue,st){1&ue&&c.GkF(0)}function he(ue,st){if(1&ue&&(c._uU(0),c.ALo(1,"titlecase")),2&ue){const We=c.oxw();c.AsE(" ",c.lcZ(1,2,We.actionDescription)," ",We.itemDescription,"\n")}}const be=function(ue){return{form:ue}};let we=(()=>{class ue{constructor(We){this.activeModal=We,this.actionDescription="delete"}ngOnInit(){const We={confirmation:new r.NI(!1,[r.kI.requiredTrue])};if(this.childFormGroup&&(We.child=this.childFormGroup),this.deletionForm=new a.d(We),!this.submitAction&&!this.submitActionObservable)throw new Error("No submit action defined")}callSubmitAction(){this.submitActionObservable?this.submitActionObservable().subscribe({error:this.stopLoadingSpinner.bind(this),complete:this.hideModal.bind(this)}):this.submitAction()}hideModal(){this.activeModal.close()}stopLoadingSpinner(){this.deletionForm.setErrors({cdSubmitButton:!0})}}return ue.\u0275fac=function(We){return new(We||ue)(c.Y36(e.Kz))},ue.\u0275cmp=c.Xpm({type:ue,selectors:[["cd-deletion-modal"]],viewQuery:function(We,Ve){if(1&We&&c.Gf(f.w,7),2&We){let Be;c.iGM(Be=c.CRH())&&(Ve.submitButton=Be.first)}},decls:24,vars:15,consts:function(){let st,We,Ve,Be;return st="Yes, I am sure.",We="Are you sure that you want to " + "\ufffd0\ufffd" + " " + "\ufffd#3\ufffd" + "" + "\ufffd1\ufffd" + "" + "\ufffd/#3\ufffd" + "?",Ve="Are you sure that you want to " + "\ufffd0\ufffd" + " the selected items?",Be="Are you sure that you want to " + "\ufffd0\ufffd" + " the selected " + "\ufffd1\ufffd" + "?",[[3,"modalRef"],["modal",""],[1,"modal-title"],[4,"ngTemplateOutlet"],[1,"modal-content"],["name","deletionForm","novalidate","",3,"formGroup"],["formDir","ngForm"],[1,"modal-body"],[4,"ngTemplateOutlet","ngTemplateOutletContext"],[1,"question"],[4,"ngIf","ngIfElse"],["noNames",""],[1,"form-group"],[1,"custom-control","custom-checkbox"],["type","checkbox","name","confirmation","id","confirmation","formControlName","confirmation","autofocus","",1,"custom-control-input"],["for","confirmation",1,"custom-control-label"],st,[1,"modal-footer"],[3,"form","submitText","submitActionEvent"],["deletionHeading",""],["manyNames",""],We,Ve,[4,"ngFor","ngForOf"],Be]},template:function(We,Ve){if(1&We&&(c.TgZ(0,"cd-modal",0,1),c.ynx(2,2),c.YNc(3,J,1,0,"ng-container",3),c.BQk(),c.ynx(4,4),c.TgZ(5,"form",5,6)(7,"div",7),c.YNc(8,ee,1,0,"ng-container",8),c.TgZ(9,"div",9),c.YNc(10,se,4,2,"span",10),c.YNc(11,ge,3,4,"ng-template",null,11,c.W1O),c.YNc(13,ae,1,0,"ng-container",8),c.TgZ(14,"div",12)(15,"div",13),c._UZ(16,"input",14),c.TgZ(17,"label",15),c.SDv(18,16),c.qZA()()()()(),c.TgZ(19,"div",17)(20,"cd-form-button-panel",18),c.NdJ("submitActionEvent",function(){return Ve.callSubmitAction()}),c.ALo(21,"titlecase"),c.qZA()()(),c.BQk(),c.qZA(),c.YNc(22,he,2,4,"ng-template",null,19,c.W1O)),2&We){const Be=c.MAs(12),xe=c.MAs(23);c.Q6J("modalRef",Ve.activeModal),c.xp6(3),c.Q6J("ngTemplateOutlet",xe),c.xp6(2),c.Q6J("formGroup",Ve.deletionForm),c.xp6(3),c.Q6J("ngTemplateOutlet",Ve.bodyTemplate)("ngTemplateOutletContext",Ve.bodyContext),c.xp6(2),c.Q6J("ngIf",Ve.itemNames)("ngIfElse",Be),c.xp6(3),c.Q6J("ngTemplateOutlet",Ve.childFormGroupTemplate)("ngTemplateOutletContext",c.VKq(13,be,Ve.deletionForm)),c.xp6(7),c.Q6J("form",Ve.deletionForm)("submitText",c.lcZ(21,11,Ve.actionDescription)+" "+Ve.itemDescription)}},directives:[p.z,y.tP,r._Y,r.JL,r.sg,T.V,y.O5,y.sg,C.P,R.o,r.Wl,L.b,r.JJ,r.u,z.U,W.p],pipes:[y.i8,y.rS],styles:[".modal-body[_ngcontent-%COMP%]   .question[_ngcontent-%COMP%]{margin-top:1em}.modal-body[_ngcontent-%COMP%]   label[_ngcontent-%COMP%]{font-weight:700}.modal-body[_ngcontent-%COMP%]   .question[_ngcontent-%COMP%]   .form-check[_ngcontent-%COMP%]{padding-top:7px}"]}),ue})()},52266:(m,S,i)=>{"use strict";i.d(S,{J:()=>T});var r=i(16738),a=i.n(r),f=i(89724),c=i(71334),e=i(1659),p=i(11048);function y(C,R){if(1&C){const L=f.EpF();f.TgZ(0,"div",0)(1,"ngb-timepicker",4),f.NdJ("ngModelChange",function(W){return f.CHM(L),f.oxw().time=W})("ngModelChange",function(){return f.CHM(L),f.oxw().onModelChange()}),f.qZA()()}if(2&C){const L=f.oxw();f.xp6(1),f.Q6J("seconds",L.hasSeconds)("ngModel",L.time)}}let T=(()=>{class C{constructor(L){this.calendar=L,this.hasSeconds=!0,this.hasTime=!0}ngOnInit(){var L;this.minDate=this.calendar.getToday(),this.format=this.hasTime?this.hasSeconds?"YYYY-MM-DD HH:mm:ss":"YYYY-MM-DD HH:mm":"YYYY-MM-DD";let z=a()(null===(L=this.control)||void 0===L?void 0:L.value,this.format);(!z.isValid()||z.isBefore(a()()))&&(z=a()()),this.date={year:z.year(),month:z.month()+1,day:z.date()},this.time={hour:z.hour(),minute:z.minute(),second:z.second()},this.onModelChange()}onModelChange(){if(this.date){const L=Object.assign({},this.date,this.time);L.month--,setTimeout(()=>{this.control.setValue(a()(L).format(this.format))})}else setTimeout(()=>{this.control.setValue("")})}}return C.\u0275fac=function(L){return new(L||C)(f.Y36(c.vL))},C.\u0275cmp=f.Xpm({type:C,selectors:[["cd-date-time-picker"]],inputs:{control:"control",hasSeconds:"hasSeconds",hasTime:"hasTime"},decls:4,vars:3,consts:[[1,"d-flex","justify-content-center"],[3,"ngModel","minDate","ngModelChange"],["dp",""],["class","d-flex justify-content-center",4,"ngIf"],[3,"seconds","ngModel","ngModelChange"]],template:function(L,z){1&L&&(f.TgZ(0,"div",0)(1,"ngb-datepicker",1,2),f.NdJ("ngModelChange",function(J){return z.date=J})("ngModelChange",function(){return z.onModelChange()}),f.qZA()(),f.YNc(3,y,2,2,"div",3)),2&L&&(f.xp6(1),f.Q6J("ngModel",z.date)("minDate",z.minDate),f.xp6(2),f.Q6J("ngIf",z.hasTime))},directives:[c.VL,e.JJ,e.On,p.O5,c.Pm],styles:[""]}),C})()},30490:(m,S,i)=>{"use strict";i.d(S,{K:()=>f});var r=i(72625),a=i(89724);let f=(()=>{class c{constructor(p){this.docService=p,this.docText="documentation"}ngOnInit(){this.noSubscribe?this.docUrl=this.docService.urlGenerator(this.section):this.docService.subscribeOnce(this.section,p=>{this.docUrl=p})}}return c.\u0275fac=function(p){return new(p||c)(a.Y36(r.R))},c.\u0275cmp=a.Xpm({type:c,selectors:[["cd-doc"]],inputs:{section:"section",docText:"docText",noSubscribe:"noSubscribe"},decls:2,vars:2,consts:[["target","_blank",3,"href"]],template:function(p,y){1&p&&(a.TgZ(0,"a",0),a._uU(1),a.qZA()),2&p&&(a.s9C("href",y.docUrl,a.LSH),a.xp6(1),a.Oqu(y.docText))},styles:[""]}),c})()},30839:(m,S,i)=>{"use strict";i.d(S,{p:()=>T});var r=i(89724),a=i(79512),f=i(39749),c=i(11048),e=i(63285),p=i(13472);function y(C,R){if(1&C){const L=r.EpF();r.TgZ(0,"cd-submit-button",2),r.NdJ("submitAction",function(){return r.CHM(L),r.oxw().submitAction()}),r._uU(1),r.qZA()}if(2&C){const L=r.oxw();r.Q6J("disabled",L.disabled)("form",L.form)("ariaLabel",L.submitText),r.xp6(1),r.Oqu(L.submitText)}}let T=(()=>{class C{constructor(L,z,W){this.location=L,this.actionLabels=z,this.modalService=W,this.submitActionEvent=new r.vpe,this.backActionEvent=new r.vpe,this.showSubmit=!0,this.wrappingClass="",this.btnClass="",this.submitText=this.actionLabels.CREATE,this.cancelText=this.actionLabels.CANCEL,this.disabled=!1}submitAction(){this.submitActionEvent.emit()}backAction(){0===this.backActionEvent.observers.length?this.modalService.hasOpenModals()?this.modalService.dismissAll():this.location.back():this.backActionEvent.emit()}}return C.\u0275fac=function(L){return new(L||C)(r.Y36(c.Ye),r.Y36(a.p4),r.Y36(e.Z))},C.\u0275cmp=r.Xpm({type:C,selectors:[["cd-form-button-panel"]],viewQuery:function(L,z){if(1&L&&r.Gf(f.w,5),2&L){let W;r.iGM(W=r.CRH())&&(z.submitButton=W.first)}},inputs:{form:"form",showSubmit:"showSubmit",wrappingClass:"wrappingClass",btnClass:"btnClass",submitText:"submitText",cancelText:"cancelText",disabled:"disabled"},outputs:{submitActionEvent:"submitActionEvent",backActionEvent:"backActionEvent"},decls:3,vars:4,consts:[[1,"m-2",3,"name","backAction"],["data-cy","submitBtn",3,"disabled","form","ariaLabel","submitAction",4,"ngIf"],["data-cy","submitBtn",3,"disabled","form","ariaLabel","submitAction"]],template:function(L,z){1&L&&(r.TgZ(0,"div")(1,"cd-back-button",0),r.NdJ("backAction",function(){return z.backAction()}),r.qZA(),r.YNc(2,y,2,4,"cd-submit-button",1),r.qZA()),2&L&&(r.Tol(z.wrappingClass),r.xp6(1),r.Q6J("name",z.cancelText),r.xp6(1),r.Q6J("ngIf",z.showSubmit))},directives:[p.W,c.O5,f.w],styles:[""]}),C})()},65683:(m,S,i)=>{"use strict";i.d(S,{X:()=>je});var r=i(1659),a=i(23815),f=i.n(a),c=i(47557),e=i(28211),p=i(89724),y=i(71334),T=i(62862),C=i(60312),R=i(11048),L=i(41582),z=i(87925),W=i(94276),J=i(17932),ee=i(60192),ce=i(30839);function ie(Ne,Bt){if(1&Ne&&(p.ynx(0,10),p._uU(1),p.BQk()),2&Ne){const rt=p.oxw();p.xp6(1),p.hij(" ",rt.titleText," ")}}function U(Ne,Bt){if(1&Ne&&(p.TgZ(0,"p"),p._uU(1),p.qZA()),2&Ne){const rt=p.oxw();p.xp6(1),p.Oqu(rt.message)}}const se=function(Ne){return{required:Ne}};function ge(Ne,Bt){if(1&Ne&&(p.TgZ(0,"label",18),p._uU(1),p.qZA()),2&Ne){const rt=p.oxw().$implicit;p.Q6J("ngClass",p.VKq(3,se,!0===(null==rt?null:rt.required)))("for",rt.name),p.xp6(1),p.hij(" ",rt.label," ")}}function ae(Ne,Bt){if(1&Ne&&p._UZ(0,"input",19),2&Ne){const rt=p.oxw().$implicit;p.Q6J("type",rt.type)("id",rt.name)("name",rt.name)("formControlName",rt.name)}}function he(Ne,Bt){if(1&Ne&&p._UZ(0,"input",20),2&Ne){const rt=p.oxw().$implicit;p.Q6J("id",rt.name)("name",rt.name)("formControlName",rt.name)}}function be(Ne,Bt){if(1&Ne&&(p.TgZ(0,"option",24),p._uU(1),p.qZA()),2&Ne){const rt=p.oxw(2).$implicit;p.Q6J("ngValue",null),p.xp6(1),p.hij(" ",null==rt||null==rt.typeConfig?null:rt.typeConfig.placeholder," ")}}function we(Ne,Bt){if(1&Ne&&(p.TgZ(0,"option",25),p._uU(1),p.qZA()),2&Ne){const rt=Bt.$implicit;p.Q6J("value",rt.value),p.xp6(1),p.hij(" ",rt.text," ")}}function ue(Ne,Bt){if(1&Ne&&(p.TgZ(0,"select",21),p.YNc(1,be,2,2,"option",22),p.YNc(2,we,2,2,"option",23),p.qZA()),2&Ne){const rt=p.oxw().$implicit;p.Q6J("id",rt.name)("formControlName",rt.name),p.xp6(1),p.Q6J("ngIf",null==rt||null==rt.typeConfig?null:rt.typeConfig.placeholder),p.xp6(1),p.Q6J("ngForOf",null==rt||null==rt.typeConfig?null:rt.typeConfig.options)}}function st(Ne,Bt){if(1&Ne&&p._UZ(0,"cd-select-badges",26),2&Ne){const rt=p.oxw().$implicit;p.Q6J("id",rt.name)("data",rt.value)("customBadges",null==rt||null==rt.typeConfig?null:rt.typeConfig.customBadges)("options",null==rt||null==rt.typeConfig?null:rt.typeConfig.options)("messages",null==rt||null==rt.typeConfig?null:rt.typeConfig.messages)}}function We(Ne,Bt){if(1&Ne&&(p.TgZ(0,"span",27),p._uU(1),p.qZA()),2&Ne){const rt=p.oxw().$implicit,en=p.oxw();p.xp6(1),p.hij(" ",en.getError(rt)," ")}}const Ve=function(Ne,Bt){return{"cd-col-form-input":Ne,"col-sm-12":Bt}},Be=function(){return["text","number"]};function xe(Ne,Bt){if(1&Ne&&(p.ynx(0),p.TgZ(1,"div"),p.YNc(2,ge,2,5,"label",11),p.TgZ(3,"div",12),p.YNc(4,ae,1,4,"input",13),p.YNc(5,he,1,3,"input",14),p.YNc(6,ue,3,4,"select",15),p.YNc(7,st,1,5,"cd-select-badges",16),p.YNc(8,We,2,1,"span",17),p.qZA()(),p.BQk()),2&Ne){const rt=Bt.$implicit,en=p.oxw(),Pt=p.MAs(4);p.xp6(1),p.Gre("form-group row cd-",rt.name,"-form-group"),p.xp6(1),p.Q6J("ngIf",rt.label),p.xp6(1),p.Q6J("ngClass",p.WLB(10,Ve,rt.label,!rt.label)),p.xp6(1),p.Q6J("ngIf",p.DdM(13,Be).includes(rt.type)),p.xp6(1),p.Q6J("ngIf","binary"===rt.type),p.xp6(1),p.Q6J("ngIf","select"===rt.type),p.xp6(1),p.Q6J("ngIf","select-badges"===rt.type),p.xp6(1),p.Q6J("ngIf",en.formGroup.showError(rt.name,Pt))}}let je=(()=>{class Ne{constructor(rt,en,Pt,Vt){this.activeModal=rt,this.formBuilder=en,this.formatter=Pt,this.dimlessBinaryPipe=Vt}ngOnInit(){this.createForm()}createForm(){const rt={};this.fields.forEach(en=>{rt[en.name]=this.createFormControl(en)}),this.formGroup=this.formBuilder.group(rt)}createFormControl(rt){let en=[];return f().isBoolean(rt.required)&&rt.required&&en.push(r.kI.required),rt.validators&&(en=en.concat(rt.validators)),new r.NI(f().defaultTo("binary"===rt.type?this.dimlessBinaryPipe.transform(rt.value):rt.value,null),{validators:en})}getError(rt){const en=this.formGroup.get(rt.name).errors;return Object.keys(en).map(Vt=>this.getErrorMessage(Vt,en[Vt],rt.errors)).join("<br>")}getErrorMessage(rt,en,Pt){if(Pt){const Vt=Pt[rt];if(Vt)return Vt}return["binaryMin","binaryMax"].includes(rt)?en():"required"===rt?"This field is required.":"An error occurred."}onSubmitForm(rt){this.fields.filter(Pt=>"binary"===Pt.type).map(Pt=>Pt.name).forEach(Pt=>{const Vt=rt[Pt];Vt&&(rt[Pt]=this.formatter.toBytes(Vt))}),this.activeModal.close(),f().isFunction(this.onSubmit)&&this.onSubmit(rt)}}return Ne.\u0275fac=function(rt){return new(rt||Ne)(p.Y36(y.Kz),p.Y36(T.O),p.Y36(e.H),p.Y36(c.$))},Ne.\u0275cmp=p.Xpm({type:Ne,selectors:[["cd-form-modal"]],decls:10,vars:7,consts:[[3,"modalRef"],["class","modal-title",4,"ngIf"],[1,"modal-content"],["novalidate","",3,"formGroup"],["formDir","ngForm"],[1,"modal-body"],[4,"ngIf"],[4,"ngFor","ngForOf"],[1,"modal-footer"],[3,"form","submitText","submitActionEvent"],[1,"modal-title"],["class","cd-col-form-label",3,"ngClass","for",4,"ngIf"],[3,"ngClass"],["class","form-control",3,"type","id","name","formControlName",4,"ngIf"],["type","text","class","form-control","cdDimlessBinary","",3,"id","name","formControlName",4,"ngIf"],["class","form-select",3,"id","formControlName",4,"ngIf"],[3,"id","data","customBadges","options","messages",4,"ngIf"],["class","invalid-feedback",4,"ngIf"],[1,"cd-col-form-label",3,"ngClass","for"],[1,"form-control",3,"type","id","name","formControlName"],["type","text","cdDimlessBinary","",1,"form-control",3,"id","name","formControlName"],[1,"form-select",3,"id","formControlName"],[3,"ngValue",4,"ngIf"],[3,"value",4,"ngFor","ngForOf"],[3,"ngValue"],[3,"value"],[3,"id","data","customBadges","options","messages"],[1,"invalid-feedback"]],template:function(rt,en){1&rt&&(p.TgZ(0,"cd-modal",0),p.YNc(1,ie,2,1,"ng-container",1),p.ynx(2,2),p.TgZ(3,"form",3,4)(5,"div",5),p.YNc(6,U,2,1,"p",6),p.YNc(7,xe,9,14,"ng-container",7),p.qZA(),p.TgZ(8,"div",8)(9,"cd-form-button-panel",9),p.NdJ("submitActionEvent",function(){return en.onSubmitForm(en.formGroup.value)}),p.qZA()()(),p.BQk(),p.qZA()),2&rt&&(p.Q6J("modalRef",en.activeModal),p.xp6(1),p.Q6J("ngIf",en.titleText),p.xp6(2),p.Q6J("formGroup",en.formGroup),p.xp6(3),p.Q6J("ngIf",en.message),p.xp6(1),p.Q6J("ngForOf",en.fields),p.xp6(2),p.Q6J("form",en.formGroup)("submitText",en.submitButtonText))},directives:[C.z,R.O5,r._Y,r.JL,r.sg,L.V,R.sg,R.mk,z.o,r.Fj,W.b,r.JJ,r.u,J.Q,r.EJ,r.YN,r.Kr,ee.m,ce.p],styles:[""]}),Ne})()},76317:(m,S,i)=>{"use strict";i.d(S,{F:()=>ge});var r=i(9837),a=i(65862),f=i(89724),c=i(14800),e=i(11048),p=i(8958),y=i(34501),T=i(30490),C=i(87925),R=i(1659);function L(ae,he){1&ae&&(f.TgZ(0,"cd-loading-panel"),f.SDv(1,2),f.qZA())}function z(ae,he){1&ae&&(f.TgZ(0,"cd-alert-panel",3),f.tHW(1,4),f._UZ(2,"cd-doc",5),f.N_p(),f.qZA())}function W(ae,he){1&ae&&(f.TgZ(0,"cd-alert-panel",3),f.tHW(1,6),f._UZ(2,"cd-doc",5),f.N_p(),f.qZA())}function J(ae,he){if(1&ae&&(f.TgZ(0,"option",25),f._uU(1),f.qZA()),2&ae){const be=he.$implicit;f.Q6J("ngValue",be.value),f.xp6(1),f.hij("",be.name," ")}}function ee(ae,he){if(1&ae){const be=f.EpF();f.TgZ(0,"cd-alert-panel",28),f.NdJ("dismissed",function(){return f.CHM(be),f.oxw(3).showMessage=!1}),f.tHW(1,29),f._UZ(2,"a",30),f.N_p(),f.qZA()}if(2&ae){const be=f.oxw(3);f.xp6(2),f.Q6J("href",be.grafanaSrc,f.LSH)}}function ce(ae,he){if(1&ae&&(f.TgZ(0,"div",26),f.YNc(1,ee,3,1,"cd-alert-panel",27),f.qZA()),2&ae){const be=f.oxw(2);f.xp6(1),f.Q6J("ngIf",be.showMessage)}}const ie=function(ae){return[ae]},U=function(ae,he){return[ae,he]};function se(ae,he){if(1&ae){const be=f.EpF();f.ynx(0),f.TgZ(1,"div",7)(2,"div",8)(3,"div",9)(4,"label",10),f.SDv(5,11),f.qZA()(),f.TgZ(6,"div",12)(7,"select",13),f.NdJ("ngModelChange",function(ue){return f.CHM(be),f.oxw().time=ue})("ngModelChange",function(ue){return f.CHM(be),f.oxw().onTimepickerChange(ue)}),f.YNc(8,J,2,2,"option",14),f.qZA()(),f.TgZ(9,"div",15)(10,"button",16),f.NdJ("click",function(){return f.CHM(be),f.oxw().reset()}),f._UZ(11,"i",17),f.qZA(),f.TgZ(12,"button",18),f.NdJ("click",function(){f.CHM(be);const ue=f.oxw();return ue.showMessage=!ue.showMessage}),f._UZ(13,"i",17),f.qZA()()()(),f.TgZ(14,"div",19),f.YNc(15,ce,2,1,"div",20),f.qZA(),f.TgZ(16,"div",19)(17,"div",21)(18,"div",22),f._UZ(19,"iframe",23,24),f.qZA()()(),f.BQk()}if(2&ae){const be=f.oxw();f.xp6(7),f.Q6J("ngModel",be.time),f.xp6(1),f.Q6J("ngForOf",be.grafanaTimes),f.xp6(3),f.Q6J("ngClass",f.VKq(8,ie,be.icons.undo)),f.xp6(2),f.Q6J("ngClass",f.WLB(10,U,be.icons.infoCircle,be.icons.large)),f.xp6(2),f.Q6J("ngIf",be.showMessage),f.xp6(4),f.Q6J("src",be.grafanaSrc,f.uOi)("ngClass",be.panelStyle)("title",be.title)}}let ge=(()=>{class ae{constructor(be,we){this.sanitizer=be,this.settingsService=we,this.grafanaExist=!1,this.mode="&kiosk",this.loading=!0,this.styles={},this.dashboardExist=!0,this.showMessage=!1,this.icons=a.P,this.DEFAULT_TIME="from=now-1h&to=now",this.grafanaTimes=[{name:"Last 5 minutes",value:"from=now-5m&to=now"},{name:"Last 15 minutes",value:"from=now-15m&to=now"},{name:"Last 30 minutes",value:"from=now-30m&to=now"},{name:"Last 1 hour (Default)",value:"from=now-1h&to=now"},{name:"Last 3 hours",value:"from=now-3h&to=now"},{name:"Last 6 hours",value:"from=now-6h&to=now"},{name:"Last 12 hours",value:"from=now-12h&to=now"},{name:"Last 24 hours",value:"from=now-24h&to=now"},{name:"Yesterday",value:"from=now-1d%2Fd&to=now-1d%2Fd"},{name:"Today so far",value:"from=now%2Fd&to=now"},{name:"Day before yesterday",value:"from=now-2d%2Fd&to=now-2d%2Fd"},{name:"Last 2 days",value:"from=now-2d&to=now"},{name:"This day last week",value:"from=now-7d%2Fd&to=now-7d%2Fd"},{name:"Previous week",value:"from=now-1w%2Fw&to=now-1w%2Fw"},{name:"This week so far",value:"from=now%2Fw&to=now"},{name:"Last 7 days",value:"from=now-7d&to=now"},{name:"Previous month",value:"from=now-1M%2FM&to=now-1M%2FM"},{name:"This month so far",value:"from=now%2FM&to=now"},{name:"Last 30 days",value:"from=now-30d&to=now"},{name:"Last 90 days",value:"from=now-90d&to=now"},{name:"Last 6 months",value:"from=now-6M&to=now"},{name:"Last 1 year",value:"from=now-1y&to=now"},{name:"Previous year",value:"from=now-1y%2Fy&to=now-1y%2Fy"},{name:"This year so far",value:"from=now%2Fy&to=now"},{name:"Last 2 years",value:"from=now-2y&to=now"},{name:"Last 5 years",value:"from=now-5y&to=now"}]}ngOnInit(){this.time=this.DEFAULT_TIME,this.styles={one:"grafana_one",two:"grafana_two",three:"grafana_three",four:"grafana_four"},this.datasource="metrics"===this.type?"Dashboard1":"Loki",this.settingsService.ifSettingConfigured("api/grafana/url",be=>{this.grafanaExist=!0,this.loading=!1,this.baseUrl=be+"/d/",this.getFrame()}),this.panelStyle=this.styles[this.grafanaStyle]}getFrame(){this.settingsService.validateGrafanaDashboardUrl(this.uid).subscribe(be=>this.dashboardExist=200===be),this.url="metrics"===this.type?`${this.baseUrl}${this.uid}/${this.grafanaPath}&refresh=2s&var-datasource=${this.datasource}${this.mode}&${this.time}`:`${this.baseUrl.slice(0,-2)}${this.grafanaPath}orgId=1&left=["now-1h","now","${this.datasource}",{"refId":"A"}]${this.mode}`,this.grafanaSrc=this.sanitizer.bypassSecurityTrustResourceUrl(this.url)}onTimepickerChange(){this.grafanaExist&&this.getFrame()}reset(){this.time=this.DEFAULT_TIME,this.grafanaExist&&this.getFrame()}ngOnChanges(){this.grafanaExist&&this.getFrame()}}return ae.\u0275fac=function(be){return new(be||ae)(f.Y36(c.H7),f.Y36(r.g))},ae.\u0275cmp=f.Xpm({type:ae,selectors:[["cd-grafana"]],inputs:{type:"type",grafanaPath:"grafanaPath",grafanaStyle:"grafanaStyle",uid:"uid",title:"title"},features:[f.TTD],decls:4,vars:4,consts:function(){let he,be,we,ue,st,We,Ve;return he="Loading panel data...",be="Please consult the " + "\ufffd#2\ufffd" + "" + "\ufffd/#2\ufffd" + " on how to configure and enable the monitoring functionality.",we="Grafana Dashboard doesn't exist. Please refer to " + "\ufffd#2\ufffd" + "" + "\ufffd/#2\ufffd" + " on how to add dashboards to Grafana.",ue="Grafana Time Picker",st="Reset Settings",We="Show hidden information",Ve="If no embedded Grafana Dashboard appeared below, please follow " + "\ufffd#2\ufffd" + "this link " + "\ufffd/#2\ufffd" + " to check if Grafana is reachable and there are no HTTPS certificate issues. You may need to reload this page after accepting any Browser certificate exceptions",[[4,"ngIf"],["type","info",4,"ngIf"],he,["type","info"],be,["section","grafana"],we,[1,"row","mb-3"],[1,"col-lg-4","d-flex"],[1,"col-md-3","timepicker"],["for","timepicker",1,"mt-2"],ue,[1,"col-md-4"],["id","timepicker","name","timepicker",1,"form-select",3,"ngModel","ngModelChange"],[3,"ngValue",4,"ngFor","ngForOf"],[1,"col-md-3"],["title",st,1,"btn","btn-light","ms-3",3,"click"],[3,"ngClass"],["title",We,1,"btn","btn-light","ms-3",3,"click"],[1,"row"],["class","col my-2",4,"ngIf"],[1,"col"],[1,"grafana-container"],["id","iframe","frameborder","0","scrolling","no",1,"grafana",3,"src","ngClass","title"],["iframe",""],[3,"ngValue"],[1,"col","my-2"],["type","info","class","mb-3","dismissible","true",3,"dismissed",4,"ngIf"],["type","info","dismissible","true",1,"mb-3",3,"dismissed"],Ve,["target","_blank","noopener","","noreferrer","",3,"href"]]},template:function(be,we){1&be&&(f.YNc(0,L,2,0,"cd-loading-panel",0),f.YNc(1,z,3,0,"cd-alert-panel",1),f.YNc(2,W,3,0,"cd-alert-panel",1),f.YNc(3,se,21,13,"ng-container",0)),2&be&&(f.Q6J("ngIf",we.loading&&we.grafanaExist),f.xp6(1),f.Q6J("ngIf",!we.grafanaExist),f.xp6(1),f.Q6J("ngIf",!we.dashboardExist),f.xp6(1),f.Q6J("ngIf",we.grafanaExist&&we.dashboardExist))},directives:[e.O5,p.b,y.G,T.K,C.o,R.EJ,R.JJ,R.On,e.sg,R.YN,R.Kr,e.mk],styles:[".grafana[_ngcontent-%COMP%]{height:600px;width:100%;z-index:0}.grafana_one[_ngcontent-%COMP%]{height:400px}.grafana_two[_ngcontent-%COMP%]{height:750px}.grafana_three[_ngcontent-%COMP%]{height:900px}.grafana_four[_ngcontent-%COMP%]{height:1160px}.timepicker[_ngcontent-%COMP%]   label[_ngcontent-%COMP%]{font-weight:700}.dropdown-menu[_ngcontent-%COMP%]{left:auto;right:20px;top:20px}"]}),ae})()},18372:(m,S,i)=>{"use strict";i.d(S,{S:()=>T});var r=i(65862),a=i(89724),f=i(11048),c=i(71334);function e(C,R){if(1&C&&(a._UZ(0,"div",2),a.Hsn(1)),2&C){const L=a.oxw();a.Tol(L.class),a.Q6J("innerHtml",L.html,a.oJD)}}const p=function(C){return[C]},y=["*"];let T=(()=>{class C{constructor(){this.iconClass="",this.icons=r.P}}return C.\u0275fac=function(L){return new(L||C)},C.\u0275cmp=a.Xpm({type:C,selectors:[["cd-helper"]],inputs:{class:"class",iconClass:"iconClass",html:"html"},ngContentSelectors:y,decls:3,vars:4,consts:[["popoverTpl",""],["aria-hidden","true",3,"ngClass","ngbPopover","click"],[3,"innerHtml"]],template:function(L,z){if(1&L&&(a.F$t(),a.YNc(0,e,2,3,"ng-template",null,0,a.W1O),a.TgZ(2,"i",1),a.NdJ("click",function(J){return J.preventDefault()}),a.qZA()),2&L){const W=a.MAs(1);a.xp6(2),a.Q6J("ngClass",z.iconClass?z.iconClass:a.VKq(2,p,z.icons.questionCircle))("ngbPopover",W)}},directives:[f.mk,c.o8],styles:["i[_ngcontent-%COMP%]{color:#25828e;cursor:pointer;padding-left:4px}"]}),C})()},8958:(m,S,i)=>{"use strict";i.d(S,{b:()=>y});var r=i(65862),a=i(89724),f=i(71334),c=i(11048);const e=function(T,C){return[T,C]},p=["*"];let y=(()=>{class T{constructor(){this.icons=r.P}}return T.\u0275fac=function(R){return new(R||T)},T.\u0275cmp=a.Xpm({type:T,selectors:[["cd-loading-panel"]],ngContentSelectors:p,decls:4,vars:5,consts:[["type","info",3,"dismissible"],["aria-hidden","true",1,"me-2",3,"ngClass"]],template:function(R,L){1&R&&(a.F$t(),a.TgZ(0,"ngb-alert",0)(1,"strong"),a._UZ(2,"i",1),a.qZA(),a.Hsn(3),a.qZA()),2&R&&(a.Q6J("dismissible",!1),a.xp6(2),a.Q6J("ngClass",a.WLB(2,e,L.icons.spinner,L.icons.spin)))},directives:[f.xm,c.mk],styles:[""]}),T})()},60312:(m,S,i)=>{"use strict";i.d(S,{z:()=>y});var r=i(89724),a=i(55860),f=i(11048),c=i(87925);const e=[[["",8,"modal-title"]],[["",8,"modal-content"]]],p=[".modal-title",".modal-content"];let y=(()=>{class T{constructor(R){this.router=R,this.hide=new r.vpe}close(){var R;this.pageURL?this.router.navigate([this.pageURL,{outlets:{modal:null}}]):null===(R=this.modalRef)||void 0===R||R.close(),this.hide.emit()}}return T.\u0275fac=function(R){return new(R||T)(r.Y36(a.F0))},T.\u0275cmp=r.Xpm({type:T,selectors:[["cd-modal"]],inputs:{modalRef:"modalRef",pageURL:"pageURL"},outputs:{hide:"hide"},ngContentSelectors:p,decls:8,vars:2,consts:[[3,"ngClass"],[1,"modal-content"],[1,"modal-header"],[1,"modal-title","float-start"],["type","button","aria-label","Close",1,"btn-close","float-end",3,"click"]],template:function(R,L){1&R&&(r.F$t(e),r.TgZ(0,"div",0)(1,"div",0)(2,"div",1)(3,"div",2)(4,"h4",3),r.Hsn(5),r.qZA(),r.TgZ(6,"button",4),r.NdJ("click",function(){return L.close()}),r.qZA()(),r.Hsn(7,1),r.qZA()()()),2&R&&(r.Q6J("ngClass",L.pageURL?"modal":""),r.xp6(1),r.Q6J("ngClass",L.pageURL?"modal-dialog":""))},directives:[f.mk,c.o],styles:[".modal-header[_ngcontent-%COMP%]{background-color:#e9ecef;border-bottom:1px solid #ced4da;border-radius:5px 5px 0 0}  cd-modal .modal-footer{background-color:#e9ecef;border-bottom:1px solid #ced4da;border-radius:0 0 5px 5px}  cd-modal .modal-body{max-height:70vh;overflow-x:hidden;overflow-y:auto}button.close[_ngcontent-%COMP%]{outline:none}"]}),T})()},60192:(m,S,i)=>{"use strict";i.d(S,{m:()=>C});var r=i(89724),a=i(65862),f=i(7022),c=i(39092),e=i(11048);const p=["cdSelect"],y=function(R){return[R]};function T(R,L){if(1&R){const z=r.EpF();r.TgZ(0,"span")(1,"span",4)(2,"span",5),r._uU(3),r.qZA(),r.TgZ(4,"a",6),r.NdJ("click",function(){const ee=r.CHM(z).$implicit;return r.oxw(),r.MAs(1).removeItem(ee)}),r._UZ(5,"i",7),r.qZA()()()}if(2&R){const z=L.$implicit,W=r.oxw();r.xp6(3),r.Oqu(z),r.xp6(2),r.Q6J("ngClass",r.VKq(2,y,W.icons.destroy))}}let C=(()=>{class R{constructor(){this.data=[],this.options=[],this.messages=new f.a({}),this.customBadges=!1,this.customBadgeValidators=[],this.selection=new r.vpe,this.icons=a.P}}return R.\u0275fac=function(z){return new(z||R)},R.\u0275cmp=r.Xpm({type:R,selectors:[["cd-select-badges"]],viewQuery:function(z,W){if(1&z&&r.Gf(p,7),2&z){let J;r.iGM(J=r.CRH())&&(W.cdSelect=J.first)}},inputs:{data:"data",options:"options",messages:"messages",selectionLimit:"selectionLimit",customBadges:"customBadges",customBadgeValidators:"customBadgeValidators"},outputs:{selection:"selection"},decls:4,vars:10,consts:[["elemClass","me-2 select-menu-edit",3,"data","options","messages","selectionLimit","customBadges","customBadgeValidators","selection"],["cdSelect",""],[3,"ngClass"],[4,"ngFor","ngForOf"],[1,"badge","badge-dark","me-2"],[1,"me-2"],[1,"badge-remove",3,"click"],["aria-hidden","true",3,"ngClass"]],template:function(z,W){1&z&&(r.TgZ(0,"cd-select",0,1),r.NdJ("selection",function(ee){return W.selection.emit(ee)}),r._UZ(2,"i",2),r.qZA(),r.YNc(3,T,6,4,"span",3)),2&z&&(r.Q6J("data",W.data)("options",W.options)("messages",W.messages)("selectionLimit",W.selectionLimit)("customBadges",W.customBadges)("customBadgeValidators",W.customBadgeValidators),r.xp6(2),r.Q6J("ngClass",r.VKq(8,y,W.icons.edit)),r.xp6(1),r.Q6J("ngForOf",W.data))},directives:[c.H,e.mk,e.sg],styles:[".badge-remove[_ngcontent-%COMP%]{color:#fff}i.fa-pencil[_ngcontent-%COMP%]{font-size:1.1rem}"]}),R})()},7022:(m,S,i)=>{"use strict";i.d(S,{a:()=>f});var r=i(23815),a=i.n(r);class f{constructor(e){this.customValidations={},this.empty="No items selected.",this.selectionLimit={tooltip:"Deselect item to select again",text:"Selection limit reached"},this.filter="Filter tags",this.add="Add badge",this.noOptions="There are no items available.",a().merge(this,e)}}},14745:(m,S,i)=>{"use strict";i.d(S,{$:()=>r});class r{constructor(f,c,e,p=!0){this.selected=f,this.name=c,this.description=e,this.enabled=p}}},39092:(m,S,i)=>{"use strict";i.d(S,{H:()=>Be});var r=i(89724),a=i(1659),f=i(23815),c=i.n(f),e=i(65862),p=i(95463),y=i(7022),T=i(14745),C=i(41582),R=i(87925),L=i(94276),z=i(11048),W=i(71334);function J(xe,je){if(1&xe&&(r.TgZ(0,"span",12),r._uU(1),r.qZA()),2&xe){const Ne=r.oxw().$implicit,Bt=r.oxw(2);r.xp6(1),r.hij(" ",Bt.messages.customValidations[Ne]," ")}}function ee(xe,je){if(1&xe&&(r.ynx(0),r.YNc(1,J,2,1,"span",11),r.BQk()),2&xe){const Ne=je.$implicit;r.oxw();const Bt=r.MAs(1),rt=r.oxw();r.xp6(1),r.Q6J("ngIf",rt.form.showError("filter",Bt)&&rt.filter.hasError(Ne))}}const ce=function(xe){return[xe]};function ie(xe,je){if(1&xe&&r._UZ(0,"i",18),2&xe){const Ne=r.oxw(3);r.Q6J("ngClass",r.VKq(1,ce,Ne.icons.check))}}function U(xe,je){if(1&xe&&(r.ynx(0),r._UZ(1,"br"),r.TgZ(2,"small",19),r._uU(3),r.qZA(),r.BQk()),2&xe){const Ne=r.oxw().$implicit;r.xp6(3),r.hij(" ",Ne.description,"\xa0 ")}}const se=function(xe){return{"help-block disabled":xe}};function ge(xe,je){if(1&xe){const Ne=r.EpF();r.TgZ(0,"div",13),r.NdJ("click",function(){const en=r.CHM(Ne).$implicit;return r.oxw(2).triggerSelection(en)}),r.TgZ(1,"div",14),r.YNc(2,ie,1,3,"i",15),r._uU(3," \xa0 "),r.qZA(),r.TgZ(4,"div",16),r._uU(5),r.YNc(6,U,4,1,"ng-container",17),r.qZA()()}if(2&xe){const Ne=je.$implicit,Bt=r.oxw(2);r.Q6J("ngClass",r.VKq(4,se,!(Bt.data.length!==Bt.selectionLimit&&Ne.enabled||Ne.selected))),r.xp6(2),r.Q6J("ngIf",Ne.selected),r.xp6(3),r.hij(" ",Ne.name," "),r.xp6(1),r.Q6J("ngIf",Ne.description)}}function ae(xe,je){if(1&xe){const Ne=r.EpF();r.TgZ(0,"div",20),r.NdJ("click",function(){return r.CHM(Ne),r.oxw(2).addCustomOption()}),r.TgZ(1,"div",14),r._UZ(2,"i",18),r._uU(3," \xa0 "),r.qZA(),r.TgZ(4,"div",16),r._uU(5),r.qZA()()}if(2&xe){const Ne=r.oxw(2);r.xp6(2),r.Q6J("ngClass",r.VKq(3,ce,Ne.icons.tag)),r.xp6(3),r.AsE(" ",Ne.messages.add," '",Ne.filter.value,"' ")}}function he(xe,je){if(1&xe&&(r.TgZ(0,"span",23),r._uU(1),r.qZA()),2&xe){const Ne=r.oxw(3);r.Q6J("ngbTooltip",Ne.messages.selectionLimit.tooltip),r.xp6(1),r.hij(" ",Ne.messages.selectionLimit.text," ")}}function be(xe,je){if(1&xe&&(r.TgZ(0,"div",21),r.YNc(1,he,2,2,"span",22),r.qZA()),2&xe){const Ne=r.oxw(2);r.xp6(1),r.Q6J("ngIf",Ne.data.length===Ne.selectionLimit)}}function we(xe,je){if(1&xe){const Ne=r.EpF();r.TgZ(0,"form",4,5)(2,"div")(3,"input",6),r.NdJ("keyup",function(rt){r.CHM(Ne);const en=r.oxw();return 13===rt.keyCode?en.selectOption():en.updateFilter()}),r.qZA(),r.YNc(4,ee,2,1,"ng-container",7),r.qZA()(),r.YNc(5,ge,7,6,"div",8),r.YNc(6,ae,6,5,"div",9),r.YNc(7,be,2,1,"div",10)}if(2&xe){const Ne=r.oxw();r.Q6J("formGroup",Ne.form),r.xp6(3),r.Q6J("placeholder",Ne.messages.filter),r.xp6(1),r.Q6J("ngForOf",Ne.Object.keys(Ne.messages.customValidations)),r.xp6(1),r.Q6J("ngForOf",Ne.filteredOptions),r.xp6(1),r.Q6J("ngIf",Ne.isCreatable()),r.xp6(1),r.Q6J("ngIf",Ne.data.length===Ne.selectionLimit)}}function ue(xe,je){if(1&xe&&(r.TgZ(0,"a",24),r.Hsn(1),r.qZA()),2&xe){const Ne=r.oxw(),Bt=r.MAs(1);r.Q6J("ngClass",Ne.elemClass)("ngbPopover",Bt)}}function st(xe,je){if(1&xe&&(r.TgZ(0,"span",25),r._uU(1),r.qZA()),2&xe){const Ne=r.oxw();r.xp6(1),r.hij(" ",Ne.messages.empty,"\n")}}function We(xe,je){if(1&xe&&(r.TgZ(0,"span",25),r._uU(1),r.qZA()),2&xe){const Ne=r.oxw();r.xp6(1),r.hij(" ",Ne.messages.noOptions,"\n")}}const Ve=["*"];let Be=(()=>{class xe{constructor(){this.data=[],this.options=[],this.messages=new y.a({}),this.customBadges=!1,this.customBadgeValidators=[],this.selection=new r.vpe,this.Object=Object,this.filteredOptions=[],this.icons=e.P}ngOnInit(){this.initFilter(),this.data.length>0&&this.initMissingOptions(),this.options=c().sortBy(this.options,["name"]),this.updateOptions()}initFilter(){this.filter=new a.NI("",{validators:this.customBadgeValidators}),this.form=new p.d({filter:this.filter}),this.filteredOptions=[...this.options||[]]}initMissingOptions(){const Ne=this.options.map(rt=>rt.name);this.data.filter(rt=>-1===Ne.indexOf(rt)).forEach(rt=>this.addOption(rt)),this.forceOptionsToReflectData()}addOption(Ne){this.options.push(new T.$(!1,Ne,"")),this.options=c().sortBy(this.options,["name"]),this.triggerSelection(this.options.find(Bt=>Bt.name===Ne))}triggerSelection(Ne){!Ne||this.selectionLimit&&!Ne.selected&&this.data.length>=this.selectionLimit||(Ne.selected=!Ne.selected,this.updateOptions(),this.selection.emit({option:Ne}))}updateOptions(){this.data.splice(0,this.data.length),this.options.forEach(Ne=>{Ne.selected&&this.data.push(Ne.name)}),this.updateFilter()}updateFilter(){this.filteredOptions=this.options.filter(Ne=>Ne.name.includes(this.filter.value))}forceOptionsToReflectData(){this.options.forEach(Ne=>{-1!==this.data.indexOf(Ne.name)&&(Ne.selected=!0)})}ngOnChanges(){this.filter&&this.updateFilter(),this.options&&this.data&&0!==this.data.length&&this.forceOptionsToReflectData()}selectOption(){0===this.filteredOptions.length?this.addCustomOption():(this.triggerSelection(this.filteredOptions[0]),this.resetFilter())}addCustomOption(){!this.isCreatable()||(this.addOption(this.filter.value),this.resetFilter())}isCreatable(){return this.customBadges&&this.filter.valid&&this.filter.value.length>0&&this.filteredOptions.every(Ne=>Ne.name!==this.filter.value)}resetFilter(){this.filter.setValue(""),this.updateFilter()}removeItem(Ne){this.triggerSelection(this.options.find(Bt=>Bt.name===Ne&&Bt.selected))}}return xe.\u0275fac=function(Ne){return new(Ne||xe)},xe.\u0275cmp=r.Xpm({type:xe,selectors:[["cd-select"]],inputs:{elemClass:"elemClass",data:"data",options:"options",messages:"messages",selectionLimit:"selectionLimit",customBadges:"customBadges",customBadgeValidators:"customBadgeValidators"},outputs:{selection:"selection"},features:[r.TTD],ngContentSelectors:Ve,decls:5,vars:3,consts:[["popTemplate",""],["class","select-menu-edit float-start","data-testid","select-menu-edit",3,"ngClass","ngbPopover",4,"ngIf"],["class","form-text text-muted float-start",4,"ngIf"],["class","form-text text-muted  float-start",4,"ngIf"],["name","form","novalidate","",3,"formGroup"],["formDir","ngForm"],["type","text","formControlName","filter",1,"form-control","text-center",3,"placeholder","keyup"],[4,"ngFor","ngForOf"],["class","select-menu-item",3,"ngClass","click",4,"ngFor","ngForOf"],["class","select-menu-item",3,"click",4,"ngIf"],["class","is-invalid",4,"ngIf"],["class","invalid-feedback text-center d-block",4,"ngIf"],[1,"invalid-feedback","text-center","d-block"],[1,"select-menu-item",3,"ngClass","click"],[1,"select-menu-item-icon"],["aria-hidden","true",3,"ngClass",4,"ngIf"],[1,"select-menu-item-content"],[4,"ngIf"],["aria-hidden","true",3,"ngClass"],[1,"form-text","text-muted"],[1,"select-menu-item",3,"click"],[1,"is-invalid"],["class","form-text text-muted text-center text-warning",3,"ngbTooltip",4,"ngIf"],[1,"form-text","text-muted","text-center","text-warning",3,"ngbTooltip"],["data-testid","select-menu-edit",1,"select-menu-edit","float-start",3,"ngClass","ngbPopover"],[1,"form-text","text-muted","float-start"]],template:function(Ne,Bt){1&Ne&&(r.F$t(),r.YNc(0,we,8,6,"ng-template",null,0,r.W1O),r.YNc(2,ue,2,2,"a",1),r.YNc(3,st,2,1,"span",2),r.YNc(4,We,2,1,"span",3)),2&Ne&&(r.xp6(2),r.Q6J("ngIf",Bt.customBadges||Bt.options.length>0),r.xp6(1),r.Q6J("ngIf",0===Bt.data.length&&!(!Bt.customBadges&&0===Bt.options.length)),r.xp6(1),r.Q6J("ngIf",!Bt.customBadges&&0===Bt.options.length))},directives:[a._Y,a.JL,a.sg,C.V,R.o,a.Fj,L.b,a.JJ,a.u,z.sg,z.O5,z.mk,W._L,W.o8],styles:[".select-menu-item[_ngcontent-%COMP%]{border-bottom:1px solid rgba(0,0,0,.09);cursor:pointer;display:block;font-size:1rem}.select-menu-item[_ngcontent-%COMP%]:hover{background-color:#e9ecef}.select-menu-item-icon[_ngcontent-%COMP%]{float:left;padding:.5em;width:3em}.select-menu-item-content[_ngcontent-%COMP%]{padding:.5em}.select-menu-item-content[_ngcontent-%COMP%]   .form-text[_ngcontent-%COMP%]{display:flex}"]}),xe})()},76446:(m,S,i)=>{"use strict";i.d(S,{l:()=>T});var r=i(87311),a=i(47557),f=i(89724),c=i(11048),e=i(72621);const p=["sparkCanvas"],y=["sparkTooltip"];let T=(()=>{class C{constructor(L){this.dimlessBinaryPipe=L,this.style={height:"30px",width:"100px"},this.colors=[{backgroundColor:"rgba(40,140,234,0.2)",borderColor:"rgba(40,140,234,1)",pointBackgroundColor:"rgba(40,140,234,1)",pointBorderColor:"#fff",pointHoverBackgroundColor:"#fff",pointHoverBorderColor:"rgba(40,140,234,0.8)"}],this.options={animation:{duration:0},responsive:!0,maintainAspectRatio:!1,legend:{display:!1},elements:{line:{borderWidth:1}},tooltips:{enabled:!1,mode:"index",intersect:!1,custom:void 0,callbacks:{label:z=>this.isBinary?this.dimlessBinaryPipe.transform(z.yLabel):z.yLabel,title:()=>""}},scales:{yAxes:[{display:!1}],xAxes:[{display:!1}]}},this.datasets=[{data:[]}],this.labels=[]}ngOnInit(){const W=new r.h(this.chartCanvasRef,this.chartTooltipRef,(J,ee)=>ee+J.caretX+"px",J=>J.caretY-J.height-J.yPadding-5+"px");W.customColors={backgroundColor:this.colors[0].pointBackgroundColor,borderColor:this.colors[0].pointBorderColor},this.options.tooltips.custom=J=>{W.customTooltips(J)}}ngOnChanges(L){this.datasets[0].data=L.data.currentValue,this.labels=[...Array(L.data.currentValue.length)]}}return C.\u0275fac=function(L){return new(L||C)(f.Y36(a.$))},C.\u0275cmp=f.Xpm({type:C,selectors:[["cd-sparkline"]],viewQuery:function(L,z){if(1&L&&(f.Gf(p,7),f.Gf(y,7)),2&L){let W;f.iGM(W=f.CRH())&&(z.chartCanvasRef=W.first),f.iGM(W=f.CRH())&&(z.chartTooltipRef=W.first)}},inputs:{data:"data",style:"style",isBinary:"isBinary"},features:[f.TTD],decls:6,vars:6,consts:[[1,"chart-container",3,"ngStyle"],["baseChart","",3,"labels","datasets","options","colors","chartType"],["sparkCanvas",""],[1,"chartjs-tooltip"],["sparkTooltip",""]],template:function(L,z){1&L&&(f.TgZ(0,"div",0),f._UZ(1,"canvas",1,2),f.TgZ(3,"div",3,4),f._UZ(5,"table"),f.qZA()()),2&L&&(f.Q6J("ngStyle",z.style),f.xp6(1),f.Q6J("labels",z.labels)("datasets",z.datasets)("options",z.options)("colors",z.colors)("chartType","line"))},directives:[c.PC,e.jh],styles:['.chart-container[_ngcontent-%COMP%]{cursor:pointer;margin:auto;overflow:visible;position:absolute}canvas[_ngcontent-%COMP%]{user-select:none}.chartjs-tooltip[_ngcontent-%COMP%]{background:rgba(0,0,0,.7);border-radius:3px;color:#fff;font-family:Helvetica Neue,Helvetica,Arial,sans-serif!important;opacity:0;pointer-events:none;position:absolute;transform:translate(-50%);transition:all .1s ease}.chartjs-tooltip.transform-left[_ngcontent-%COMP%]{transform:translate(-10%)}.chartjs-tooltip.transform-left[_ngcontent-%COMP%]:after{left:10%}.chartjs-tooltip.transform-right[_ngcontent-%COMP%]{transform:translate(-90%)}.chartjs-tooltip.transform-right[_ngcontent-%COMP%]:after{left:90%}.chartjs-tooltip[_ngcontent-%COMP%]:after{border-color:#000 transparent transparent transparent;border-style:solid;border-width:5px;content:" ";left:50%;margin-left:-5px;position:absolute;top:100%}  .chartjs-tooltip-key{display:inline-block;height:10px;margin-right:10px;width:10px}.chart-container[_ngcontent-%COMP%]{position:static!important}']}),C})()},39749:(m,S,i)=>{"use strict";i.d(S,{w:()=>L});var r=i(89724),a=i(1659),f=i(23815),c=i.n(f),e=i(65862),p=i(87925),y=i(11048);const T=function(z,W){return[z,W]};function C(z,W){if(1&z&&(r.TgZ(0,"span"),r._UZ(1,"i",2),r.qZA()),2&z){const J=r.oxw();r.xp6(1),r.Q6J("ngClass",r.WLB(1,T,J.icons.spinner,J.icons.spin))}}const R=["*"];let L=(()=>{class z{constructor(J){this.elRef=J,this.type="submit",this.disabled=!1,this.submitAction=new r.vpe,this.loading=!1,this.icons=e.P}ngOnInit(){this.form.statusChanges.subscribe(()=>{c().has(this.form.errors,"cdSubmitButton")&&(this.loading=!1,c().unset(this.form.errors,"cdSubmitButton"),this.form instanceof a.TO&&this.form.updateValueAndValidity())})}submit(J){this.focusButton(),this.form instanceof a.sg&&this.form.onSubmit(J),this.form.invalid?this.focusInvalid():(this.loading=!0,this.submitAction.emit())}focusButton(){this.elRef.nativeElement.offsetParent.querySelector(`button[type="${this.type}"]`).focus()}focusInvalid(){const J=this.elRef.nativeElement.offsetParent.querySelector("input.ng-invalid, select.ng-invalid");J&&J.focus()}}return z.\u0275fac=function(J){return new(J||z)(r.Y36(r.SBq))},z.\u0275cmp=r.Xpm({type:z,selectors:[["cd-submit-button"]],inputs:{form:"form",type:"type",disabled:"disabled",btnClass:"btnClass",ariaLabel:"ariaLabel"},outputs:{submitAction:"submitAction"},ngContentSelectors:R,decls:3,vars:5,consts:[[1,"btn","btn-accent","tc_submitButton",3,"type","ngClass","disabled","click"],[4,"ngIf"],[3,"ngClass"]],template:function(J,ee){1&J&&(r.F$t(),r.TgZ(0,"button",0),r.NdJ("click",function(ie){return ee.submit(ie)}),r.Hsn(1),r.YNc(2,C,2,4,"span",1),r.qZA()),2&J&&(r.Q6J("type",ee.type)("ngClass",ee.btnClass)("disabled",ee.loading||ee.disabled),r.uIk("aria-label",ee.ariaLabel),r.xp6(2),r.Q6J("ngIf",ee.loading))},directives:[p.o,y.mk,y.O5],styles:[""]}),z})()},60251:(m,S,i)=>{"use strict";i.d(S,{O:()=>R});var r=i(89724),a=i(11048),f=i(71334),c=i(47557),e=i(66369);function p(L,z){if(1&L&&(r.TgZ(0,"tr")(1,"td",4),r._uU(2,"Free:\xa0"),r.qZA(),r.TgZ(3,"td",7)(4,"strong"),r._uU(5),r.ALo(6,"dimlessBinary"),r.ALo(7,"dimless"),r.qZA()()()),2&L){const W=r.oxw(2);r.xp6(5),r.Oqu(W.isBinary?r.lcZ(6,1,W.total-W.used):r.lcZ(7,3,W.total-W.used))}}function y(L,z){if(1&L&&(r.TgZ(0,"table")(1,"tr")(2,"td",4),r._uU(3,"Used:\xa0"),r.qZA(),r.TgZ(4,"td",5)(5,"strong"),r._uU(6),r.ALo(7,"dimlessBinary"),r.ALo(8,"dimless"),r.qZA()()(),r.YNc(9,p,8,5,"tr",6),r.qZA()),2&L){const W=r.oxw();r.xp6(6),r.hij(" ",W.isBinary?r.lcZ(7,2,W.used):r.lcZ(8,4,W.used),""),r.xp6(3),r.Q6J("ngIf",W.calculatePerc)}}const T=function(L,z){return{"bg-warning":L,"bg-danger":z}},C=function(L){return{title:L}};let R=(()=>{class L{constructor(){this.isBinary=!0,this.decimals=0,this.calculatePerc=!0,this.title="usage"}ngOnChanges(){this.calculatePerc?(this.usedPercentage=this.total>0?this.used/this.total*100:0,this.freePercentage=100-this.usedPercentage):this.used?(this.used=this.used.slice(0,-1),this.usedPercentage=Number(this.used),this.freePercentage=100-this.usedPercentage):this.usedPercentage=0}}return L.\u0275fac=function(W){return new(W||L)},L.\u0275cmp=r.Xpm({type:L,selectors:[["cd-usage-bar"]],inputs:{total:"total",used:"used",warningThreshold:"warningThreshold",errorThreshold:"errorThreshold",isBinary:"isBinary",decimals:"decimals",calculatePerc:"calculatePerc",title:"title"},features:[r.TTD],decls:8,vars:19,consts:[["usageTooltipTpl",""],["data-placement","left",1,"progress",3,"ngbTooltip"],["role","progressbar",1,"progress-bar","bg-info",3,"ngClass"],["role","progressbar",1,"progress-bar","bg-freespace"],[1,"text-left"],[1,"text-right"],[4,"ngIf"],[1,"'text-right"]],template:function(W,J){if(1&W&&(r.YNc(0,y,10,6,"ng-template",null,0,r.W1O),r.TgZ(2,"div",1)(3,"div",2)(4,"span"),r._uU(5),r.ALo(6,"number"),r.qZA()(),r._UZ(7,"div",3),r.qZA()),2&W){const ee=r.MAs(1);r.xp6(2),r.Q6J("ngbTooltip",ee),r.xp6(1),r.Udp("width",J.usedPercentage+"%"),r.Q6J("ngClass",r.WLB(12,T,J.usedPercentage/100>=J.warningThreshold,J.usedPercentage/100>=J.errorThreshold)),r.uIk("aria-label",r.VKq(15,C,J.title)),r.xp6(2),r.hij("",r.xi3(6,9,J.usedPercentage,"1.0-"+J.decimals),"%"),r.xp6(2),r.Udp("width",J.freePercentage+"%"),r.uIk("aria-label",r.VKq(17,C,J.title))}},directives:[a.O5,f._L,a.mk],pipes:[c.$,e.n,a.JJ],styles:[".bg-info[_ngcontent-%COMP%]{background-color:#25828e!important}.bg-warning[_ngcontent-%COMP%]{background-color:#d48200!important}.bg-danger[_ngcontent-%COMP%]{background-color:#dc3545!important}.bg-freespace[_ngcontent-%COMP%]{background-color:#ced4da!important}.progress[_ngcontent-%COMP%]{height:20px;margin-bottom:0;position:relative}.progress[_ngcontent-%COMP%]   div.progress-bar[_ngcontent-%COMP%]{position:static}.progress[_ngcontent-%COMP%]   span[_ngcontent-%COMP%]{color:#000;display:block;font-weight:400;position:absolute;width:100%}"]}),L})()},79512:(m,S,i)=>{"use strict";i.d(S,{$x:()=>f,MQ:()=>c,Qn:()=>e,aX:()=>y,p4:()=>p});var r=i(92340),a=i(89724);class f{}f.organization="ceph",f.projectName="Ceph Dashboard",f.license="Free software (LGPL 2.1).",f.copyright="Copyright(c) "+r.N.year+" Ceph contributors.",f.cephLogo="assets/Ceph_Logo.svg";var c=(()=>{return(T=c||(c={})).CREATE="create",T.EDIT="edit",T.UPDATE="update",T.REMOVE="remove",T.DELETE="delete",T.ADD="add",T.COPY="copy",T.CLONE="clone",T.RECREATE="recreate",T.EXPIRE="expire",T.RESTART="Restart",c;var T})(),e=(()=>{return(T=e||(e={})).CREATE="Create",T.DELETE="Delete",T.ADD="Add",T.REMOVE="Remove",T.EDIT="Edit",T.CANCEL="Cancel",T.COPY="Copy",T.CLONE="Clone",T.UPDATE="Update",T.EVICT="Evict",T.SHOW="Show",T.RECREATE="Recreate",T.EXPIRE="Expire",T.START="Start",T.STOP="Stop",T.REDEPLOY="Redeploy",T.RESTART="Restart",e;var T})();let p=(()=>{class T{constructor(){this.CREATE="Create",this.DELETE="Delete",this.ADD="Add",this.SET="Set",this.SUBMIT="Submit",this.REMOVE="Remove",this.UNSET="Unset",this.EDIT="Edit",this.UPDATE="Update",this.CANCEL="Cancel",this.PREVIEW="Preview",this.MOVE="Move",this.NEXT="Next",this.BACK="Back",this.CLONE="Clone",this.COPY="Copy",this.DEEP_SCRUB="Deep Scrub",this.DESTROY="Destroy",this.EVICT="Evict",this.FLATTEN="Flatten",this.MARK_DOWN="Mark Down",this.MARK_IN="Mark In",this.MARK_LOST="Mark Lost",this.MARK_OUT="Mark Out",this.PROTECT="Protect",this.PURGE="Purge",this.RENAME="Rename",this.RESTORE="Restore",this.REWEIGHT="Reweight",this.ROLLBACK="Rollback",this.SCRUB="Scrub",this.SHOW="Show",this.TRASH="Move to Trash",this.UNPROTECT="Unprotect",this.CHANGE="Change",this.FLAGS="Flags",this.ENTER_MAINTENANCE="Enter Maintenance",this.EXIT_MAINTENANCE="Exit Maintenance",this.START_DRAIN="Start Drain",this.STOP_DRAIN="Stop Drain",this.RESYNC="Resync",this.RECREATE="Recreate",this.EXPIRE="Expire",this.START="Start",this.STOP="Stop",this.REDEPLOY="Redeploy",this.RESTART="Restart",this.REMOVE_SCHEDULING="Remove Scheduling",this.PROMOTE="Promote",this.DEMOTE="Demote"}}return T.\u0275fac=function(R){return new(R||T)},T.\u0275prov=a.Yz7({token:T,factory:T.\u0275fac,providedIn:"root"}),T})(),y=(()=>{class T{constructor(){this.CREATED="Created",this.DELETED="Deleted",this.ADDED="Added",this.REMOVED="Removed",this.EDITED="Edited",this.CANCELED="Canceled",this.PREVIEWED="Previewed",this.MOVED="Moved",this.CLONED="Cloned",this.COPIED="Copied",this.DEEP_SCRUBBED="Deep Scrubbed",this.DESTROYED="Destroyed",this.FLATTENED="Flattened",this.MARKED_DOWN="Marked Down",this.MARKED_IN="Marked In",this.MARKED_LOST="Marked Lost",this.MARKED_OUT="Marked Out",this.PROTECTED="Protected",this.PURGED="Purged",this.RENAMED="Renamed",this.RESTORED="Restored",this.REWEIGHTED="Reweighted",this.ROLLED_BACK="Rolled back",this.SCRUBBED="Scrubbed",this.SHOWED="Showed",this.TRASHED="Moved to Trash",this.UNPROTECTED="Unprotected",this.CHANGE="Change",this.RECREATED="Recreated",this.EXPIRED="Expired",this.START="Start",this.STOP="Stop",this.REDEPLOY="Redeploy",this.RESTART="Restart"}}return T.\u0275fac=function(R){return new(R||T)},T.\u0275prov=a.Yz7({token:T,factory:T.\u0275fac,providedIn:"root"}),T})()},2149:(m,S,i)=>{"use strict";i.d(S,{t:()=>R});var r=i(11048),a=i(1659),f=i(55860),c=i(71334),e=i(84051),p=i(37496),y=i(15626),T=i(12455),C=i(89724);let R=(()=>{class L{}return L.\u0275fac=function(W){return new(W||L)},L.\u0275mod=C.oAB({type:L}),L.\u0275inj=C.cJS({imports:[[r.ez,e.xD,p.b,a.u5,c.XC,c.HK,T.D,y.K,f.Bz],e.xD]}),L})()},94928:(m,S,i)=>{"use strict";i.d(S,{K:()=>ce});var r=i(23815),a=i.n(r),f=i(65862),c=i(89724),e=i(11048),p=i(55860),y=i(71334);const T=function(ie){return{disabled:ie}},C=function(ie){return[ie]};function R(ie,U){if(1&ie){const se=c.EpF();c.ynx(0),c.TgZ(1,"button",3),c.NdJ("click",function(){c.CHM(se);const ae=c.oxw();return ae.useClickAction(ae.currentAction)}),c._UZ(2,"i",4),c.TgZ(3,"span",5),c._uU(4),c.qZA()(),c.BQk()}if(2&ie){const se=c.oxw();c.xp6(1),c.Gre("btn btn-",se.btnColor,""),c.s9C("title",se.useDisableDesc(se.currentAction)),c.Q6J("ngClass",c.VKq(11,T,se.disableSelectionAction(se.currentAction)))("disabled",se.disableSelectionAction(se.currentAction))("routerLink",se.useRouterLink(se.currentAction))("preserveFragment",se.currentAction.preserveFragment?"":null),c.uIk("aria-label",se.currentAction.name),c.xp6(1),c.Q6J("ngClass",c.VKq(13,C,se.currentAction.icon)),c.xp6(2),c.Oqu(se.currentAction.name)}}function L(ie,U){if(1&ie&&(c.ynx(0),c._uU(1),c.BQk()),2&ie){const se=c.oxw(2);c.xp6(1),c.hij("",se.dropDownOnly," ")}}function z(ie,U){1&ie&&c._UZ(0,"span",11)}const W=function(ie){return[ie,"action-icon"]};function J(ie,U){if(1&ie){const se=c.EpF();c.ynx(0),c.TgZ(1,"button",12),c.NdJ("click",function(){const he=c.CHM(se).$implicit;return c.oxw(2).useClickAction(he)}),c._UZ(2,"i",4),c.TgZ(3,"span"),c._uU(4),c.qZA()(),c.BQk()}if(2&ie){const se=U.$implicit,ge=c.oxw(2);c.xp6(1),c.Tol(ge.toClassName(se)),c.s9C("title",ge.useDisableDesc(se)),c.Q6J("routerLink",ge.useRouterLink(se))("preserveFragment",se.preserveFragment?"":null)("disabled",ge.disableSelectionAction(se)),c.uIk("aria-label",se.name),c.xp6(1),c.Q6J("ngClass",c.VKq(10,W,se.icon)),c.xp6(2),c.Oqu(se.name)}}function ee(ie,U){if(1&ie&&(c.TgZ(0,"div",6)(1,"button",7),c.YNc(2,L,2,1,"ng-container",1),c.YNc(3,z,1,0,"span",8),c.qZA(),c.TgZ(4,"div",9),c.YNc(5,J,5,12,"ng-container",10),c.qZA()()),2&ie){const se=c.oxw();c.xp6(1),c.Gre("btn btn-",se.btnColor," dropdown-toggle-split"),c.xp6(1),c.Q6J("ngIf",se.dropDownOnly),c.xp6(1),c.Q6J("ngIf",!se.dropDownOnly),c.xp6(2),c.Q6J("ngForOf",se.dropDownActions)}}let ce=(()=>{class ie{constructor(){this.btnColor="accent",this.dropDownActions=[],this.icons=f.P}ngOnInit(){this.removeActionsWithNoPermissions(),this.onSelectionChange()}ngOnChanges(se){se.selection&&this.onSelectionChange()}onSelectionChange(){this.updateDropDownActions(),this.updateCurrentAction()}toClassName(se){return se.name.replace(/ /g,"-").replace(/[^a-z-]/gi,"").toLowerCase()}removeActionsWithNoPermissions(){if(!this.permission)return void(this.tableActions=[]);const se=Object.keys(this.permission).filter(ge=>this.permission[ge]);this.tableActions=this.tableActions.filter(ge=>se.includes(ge.permission))}updateDropDownActions(){this.dropDownActions=this.tableActions.filter(se=>se.visible?se.visible(this.selection):se)}updateCurrentAction(){if(this.dropDownOnly)return void(this.currentAction=void 0);let se=this.dropDownActions.find(ge=>this.showableAction(ge));!se&&this.dropDownActions.length>0&&(se=this.dropDownActions[0]),this.currentAction=se}showableAction(se){const ge=se.canBePrimary,ae=this.selection.hasSingleSelection,he="create"===se.permission?!ae:ae;return ge&&ge(this.selection)||!ge&&he}useRouterLink(se){if(se.routerLink&&!this.disableSelectionAction(se))return a().isString(se.routerLink)?se.routerLink:se.routerLink()}disableSelectionAction(se){const ge=se.disable;if(ge)return Boolean(ge(this.selection));const ae=se.permission,he=this.selection.hasSingleSelection&&this.selection.first();return Boolean(["update","delete"].includes(ae)&&(!he||he.cdExecuting))}useClickAction(se){return!this.disableSelectionAction(se)&&se.click&&se.click()}useDisableDesc(se){if(se.disable){const ge=se.disable(this.selection);return a().isString(ge)?ge:void 0}}}return ie.\u0275fac=function(se){return new(se||ie)},ie.\u0275cmp=c.Xpm({type:ie,selectors:[["cd-table-actions"]],inputs:{permission:"permission",selection:"selection",tableActions:"tableActions",btnColor:"btnColor",dropDownOnly:"dropDownOnly"},features:[c.TTD],decls:3,vars:2,consts:[[1,"btn-group"],[4,"ngIf"],["class","btn-group","ngbDropdown","","role","group","aria-label","Button group with nested dropdown",4,"ngIf"],["type","button",3,"title","ngClass","disabled","routerLink","preserveFragment","click"],[3,"ngClass"],[1,"action-label"],["ngbDropdown","","role","group","aria-label","Button group with nested dropdown",1,"btn-group"],["aria-label","dropdown-menu-toggle","ngbDropdownToggle",""],["class","sr-only",4,"ngIf"],["ngbDropdownMenu","",1,"dropdown-menu"],[4,"ngFor","ngForOf"],[1,"sr-only"],["ngbDropdownItem","",3,"title","routerLink","preserveFragment","disabled","click"]],template:function(se,ge){1&se&&(c.TgZ(0,"div",0),c.YNc(1,R,5,15,"ng-container",1),c.YNc(2,ee,6,6,"div",2),c.qZA()),2&se&&(c.xp6(1),c.Q6J("ngIf",ge.currentAction),c.xp6(1),c.Q6J("ngIf",ge.dropDownActions.length>1))},directives:[e.O5,e.mk,p.rH,y.jt,y.iD,y.Vi,e.sg,y.TH],styles:["button.disabled[_ngcontent-%COMP%]{color:#adb5bd;cursor:default!important;pointer-events:auto}button.dropdown-item[_ngcontent-%COMP%]:hover{background-color:#dee2e6}.action-icon[_ngcontent-%COMP%]{padding-right:1.5rem}.action-label[_ngcontent-%COMP%]{font-weight:700}"]}),ie})()},61350:(m,S,i)=>{"use strict";i.d(S,{b:()=>y});var r=i(89724),a=i(23815),f=i.n(a),c=i(99466),e=i(83697),p=i(96102);let y=(()=>{class T{constructor(R){this.datePipe=R,this.autoReload=5e3,this.renderObjects=!1,this.appendParentKey=!0,this.hideEmpty=!1,this.hideKeys=[],this.columns=[],this.fetchData=new r.vpe}ngOnInit(){this.columns=[{prop:"key",flexGrow:1,cellTransformation:c.e.bold},{prop:"value",flexGrow:3}],this.customCss&&(this.columns[1].cellTransformation=c.e.classAdding),this.fetchData.observers.length>0&&this.table.fetchData.subscribe(()=>{this.fetchData.emit()}),this.useData()}ngOnChanges(){this.useData()}useData(){if(!this.data)return;let R=this.makePairs(this.data);this.hideKeys&&(R=R.filter(L=>!this.hideKeys.includes(L.key))),this.tableData=R}makePairs(R){let L=[];if(R){if(f().isArray(R))L=this.makePairsFromArray(R);else{if(!f().isObject(R))throw new Error("Wrong data format");L=this.makePairsFromObject(R)}return L=L.map(z=>(z.value=this.convertValue(z.value),z)).filter(z=>null!==z.value),f().sortBy(this.renderObjects?this.insertFlattenObjects(L):L,"key")}}makePairsFromArray(R){let L=[];const z=R[0];if(f().isArray(z)){if(2!==z.length)throw new Error(`Array contains too many elements (${z.length}). Needs to be of type [string, any][]`);L=R.map(W=>({key:W[0],value:W[1]}))}else f().isObject(z)&&(L=f().has(z,"key")&&f().has(z,"value")?[...R]:R.reduce((W,J)=>W.concat(this.makePairsFromObject(J)),L));return L}makePairsFromObject(R){return Object.keys(R).map(L=>({key:L,value:R[L]}))}insertFlattenObjects(R){return f().flattenDeep(R.map(L=>{const z=L.value,W=f().isObject(z);return!W||f().isEmpty(z)?(W&&(L.value=""),L):this.splitItemIntoItems(L)}))}splitItemIntoItems(R){return this.makePairs(R.value).map(L=>(this.appendParentKey&&(L.key=R.key+" "+L.key),L))}convertValue(R){if(f().isArray(R)){if(f().isEmpty(R)&&this.hideEmpty)return null;R=R.map(L=>f().isObject(L)?JSON.stringify(L):L).join(", ")}else if(f().isObject(R)){if(this.hideEmpty&&f().isEmpty(R)||!this.renderObjects)return null}else if(f().isString(R)){if(""===R&&this.hideEmpty)return null;this.isDate(R)&&(R=this.datePipe.transform(R)||R)}return R}isDate(R){const L="[ -:.TZ]",z="\\d{2}"+L;return R.match(new RegExp("^\\d{4}"+L+z+z+z+z+z+"\\d*Z?$"))}}return T.\u0275fac=function(R){return new(R||T)(r.Y36(p.N))},T.\u0275cmp=r.Xpm({type:T,selectors:[["cd-table-key-value"]],viewQuery:function(R,L){if(1&R&&r.Gf(e.a,7),2&R){let z;r.iGM(z=r.CRH())&&(L.table=z.first)}},inputs:{data:"data",autoReload:"autoReload",renderObjects:"renderObjects",appendParentKey:"appendParentKey",hideEmpty:"hideEmpty",hideKeys:"hideKeys",customCss:"customCss"},outputs:{fetchData:"fetchData"},features:[r.TTD],decls:2,vars:9,consts:[["columnMode","flex",3,"data","columns","toolHeader","autoReload","customCss","autoSave","header","footer","limit"],["table",""]],template:function(R,L){1&R&&r._UZ(0,"cd-table",0,1),2&R&&r.Q6J("data",L.tableData)("columns",L.columns)("toolHeader",!1)("autoReload",L.autoReload)("customCss",L.customCss)("autoSave",!1)("header",!1)("footer",!1)("limit",0)},directives:[e.a],styles:[""]}),T})()},83697:(m,S,i)=>{"use strict";i.d(S,{a:()=>to});var r=i(89724),a=i(84051),f=i(23815),c=i.n(f),e=i(25917),p=i(70882),y=i(71225),T=i(99466),C=i(65862),R=i(48168),L=i(68774),z=i(36848),W=i(11048),J=i(71334),ee=i(1659);let ce=(()=>{class Gt{constructor(){this._size=0,this._count=0,this._page=1,this.pageChange=new r.vpe}set size(_t){this._size=_t,this.pages=this.calcPages()}get size(){return this._size}set page(_t){this._page=_t}get page(){return this._page}set count(_t){this._count=_t}get count(){return this._count}get totalPages(){const _t=this.size<1?1:Math.ceil(this._count/this._size);return Math.max(_t||0,1)}canPrevious(){return this._page>1}canNext(){return this._page<this.totalPages}prevPage(){this.selectPage(this._page-1)}nextPage(){this.selectPage(this._page+1)}selectPage(_t){_t>0&&_t<=this.totalPages&&_t!==this.page?(this._page=_t,this.pageChange.emit({page:_t})):_t>0&&_t>=this.totalPages&&(this._page=this.totalPages,this.pageChange.emit({page:this.totalPages}))}calcPages(_t){const Rt=[];let ct=1,pt=this.totalPages;_t=_t||this.page,5<this.totalPages&&(ct=_t-Math.floor(2.5),pt=_t+Math.floor(2.5),ct<1?(ct=1,pt=Math.min(ct+5-1,this.totalPages)):pt>this.totalPages&&(ct=Math.max(this.totalPages-5+1,1),pt=this.totalPages));for(let mr=ct;mr<=pt;mr++)Rt.push({number:mr,text:mr});return Rt}}return Gt.\u0275fac=function(_t){return new(_t||Gt)},Gt.\u0275cmp=r.Xpm({type:Gt,selectors:[["cd-table-pagination"]],inputs:{size:"size",page:"page",count:"count"},outputs:{pageChange:"pageChange"},decls:14,vars:7,consts:function(){let Rn,_t,Rt,ct,pt,kt;return Rn="Pagination",_t="Go to first page",Rt="Go to previous page",ct="Current page",pt="Go to next page",kt="Go to last page",[["aria-label",Rn,1,"pagination"],["aria-label",_t,1,"pagination__btn","pagination__btn_first",3,"disabled","click"],["aria-hidden","true",1,"fa","fa-angle-double-left"],["aria-label",Rt,1,"pagination__btn","pagination__btn_prev",3,"disabled","click"],["aria-hidden","true",1,"fa","fa-angle-left"],[1,"pagination__pages"],["aria-label",ct,"type","number","min","1",1,"pagination__page_input",3,"max","value","input"],["pageNumber",""],["aria-hidden","true"],["aria-label",pt,1,"pagination__btn","pagination__btn_next",3,"disabled","click"],["aria-hidden","true",1,"fa","fa-angle-right"],["aria-label",kt,1,"pagination__btn","pagination__btn_last",3,"disabled","click"],["aria-hidden","true",1,"fa","fa-angle-double-right"]]},template:function(_t,Rt){if(1&_t){const ct=r.EpF();r.TgZ(0,"nav",0)(1,"button",1),r.NdJ("click",function(){return Rt.selectPage(1)}),r._UZ(2,"i",2),r.qZA(),r.TgZ(3,"button",3),r.NdJ("click",function(){return Rt.prevPage()}),r._UZ(4,"i",4),r.qZA(),r.TgZ(5,"div",5)(6,"input",6,7),r.NdJ("input",function(){r.CHM(ct);const kt=r.MAs(7);return Rt.selectPage(kt.valueAsNumber)}),r.qZA(),r.TgZ(8,"span",8),r._uU(9),r.qZA()(),r.TgZ(10,"button",9),r.NdJ("click",function(){return Rt.nextPage()}),r._UZ(11,"i",10),r.qZA(),r.TgZ(12,"button",11),r.NdJ("click",function(){return Rt.selectPage(Rt.totalPages)}),r._UZ(13,"i",12),r.qZA()()}2&_t&&(r.xp6(1),r.Q6J("disabled",!Rt.canPrevious()),r.xp6(2),r.Q6J("disabled",!Rt.canPrevious()),r.xp6(3),r.Q6J("max",Rt.totalPages)("value",Rt.page),r.xp6(3),r.hij(" of ",Rt.totalPages," "),r.xp6(1),r.Q6J("disabled",!Rt.canNext()),r.xp6(2),r.Q6J("disabled",!Rt.canNext()))},styles:[".pagination[_ngcontent-%COMP%]{align-items:center;display:flex}.pagination__btn[_ngcontent-%COMP%]{background:none;border:0}.pagination__btn[_ngcontent-%COMP%]:disabled{color:#adb5bd}.pagination__page_input[_ngcontent-%COMP%]{border:1px solid #adb5bd;border-radius:.25rem;padding-left:.25rem}"]}),Gt})();var ie=i(76446),U=i(55860),se=i(70442),ge=i(66369),ae=i(37496),he=i(47187),be=i(78877),we=i(52821),ue=i(96102),st=i(90068);const We=["tableCellBoldTpl"],Ve=["sparklineTpl"],Be=["routerLinkTpl"],xe=["checkIconTpl"],je=["perSecondTpl"],Ne=["executingTpl"],Bt=["classAddingTpl"],rt=["badgeTpl"],en=["mapTpl"],Pt=["truncateTpl"],Vt=["timeAgoTpl"],hn=["rowDetailsTpl"],vn=["rowSelectionTpl"];function mt(Gt,Rn){1&Gt&&(r.TgZ(0,"div",22)(1,"div",23),r.Hsn(2),r.qZA()())}function Nt(Gt,Rn){if(1&Gt){const _t=r.EpF();r.ynx(0),r.TgZ(1,"button",39),r.NdJ("click",function(){const pt=r.CHM(_t).$implicit;return r.oxw(3).onSelectFilter(pt),!1}),r._uU(2),r.qZA(),r.BQk()}if(2&Gt){const _t=Rn.$implicit;r.xp6(2),r.Oqu(_t.column.name)}}const St=function(Gt){return[Gt]};function Yt(Gt,Rn){if(1&Gt&&r._UZ(0,"i",30),2&Gt){const _t=r.oxw(4);r.Q6J("ngClass",r.VKq(1,St,_t.icons.check))}}function Fn(Gt,Rn){if(1&Gt){const _t=r.EpF();r.ynx(0),r.TgZ(1,"button",39),r.NdJ("click",function(){const pt=r.CHM(_t).$implicit,kt=r.oxw(3);return kt.onChangeFilter(kt.selectedFilter,pt),!1}),r._uU(2),r.YNc(3,Yt,1,3,"i",40),r.qZA(),r.BQk()}if(2&Gt){const _t=Rn.$implicit,Rt=r.oxw(3);r.xp6(2),r.hij(" ",_t.formatted," "),r.xp6(1),r.Q6J("ngIf",void 0!==Rt.selectedFilter.value&&Rt.selectedFilter.value.raw===_t.raw)}}const pr=function(Gt,Rn){return[Gt,Rn]};function Ei(Gt,Rn){if(1&Gt&&(r.TgZ(0,"div",34)(1,"div",35)(2,"button",36),r._UZ(3,"i",30),r._uU(4),r.qZA(),r.TgZ(5,"div",31),r.YNc(6,Nt,3,1,"ng-container",32),r.qZA()(),r.TgZ(7,"div",37)(8,"button",38),r._uU(9),r.qZA(),r.TgZ(10,"div",31),r.YNc(11,Fn,4,2,"ng-container",32),r.qZA()()()),2&Gt){const _t=r.oxw(2);r.xp6(3),r.Q6J("ngClass",r.WLB(7,pr,_t.icons.large,_t.icons.filter)),r.xp6(1),r.hij(" ",_t.selectedFilter.column.name," "),r.xp6(2),r.Q6J("ngForOf",_t.columnFilters),r.xp6(2),r.ekj("disabled",0===_t.selectedFilter.options.length),r.xp6(1),r.hij(" ",_t.selectedFilter.value?_t.selectedFilter.value.formatted:"Any"," "),r.xp6(2),r.Q6J("ngForOf",_t.selectedFilter.options)}}function mi(Gt,Rn){if(1&Gt){const _t=r.EpF();r.TgZ(0,"div",41)(1,"span",42),r._UZ(2,"i",30),r.qZA(),r.TgZ(3,"input",43),r.NdJ("ngModelChange",function(ct){return r.CHM(_t),r.oxw(2).search=ct})("keyup",function(){return r.CHM(_t),r.oxw(2).updateFilter()}),r.qZA(),r.TgZ(4,"button",44),r.NdJ("click",function(){return r.CHM(_t),r.oxw(2).onClearSearch()}),r._UZ(5,"i"),r.qZA()()}if(2&Gt){const _t=r.oxw(2);r.xp6(2),r.Q6J("ngClass",r.VKq(5,St,_t.icons.search)),r.xp6(1),r.Q6J("ngModel",_t.search),r.xp6(2),r.Gre("icon-prepend ",_t.icons.destroy,"")}}function ur(Gt,Rn){if(1&Gt){const _t=r.EpF();r.TgZ(0,"div",45)(1,"input",46),r.NdJ("click",function(ct){return r.CHM(_t),r.oxw(2).setLimit(ct)})("keyup",function(ct){return r.CHM(_t),r.oxw(2).setLimit(ct)})("blur",function(ct){return r.CHM(_t),r.oxw(2).setLimit(ct)}),r.qZA()()}if(2&Gt){const _t=r.oxw(2);r.xp6(1),r.Q6J("value",_t.userConfig.limit)}}function $r(Gt,Rn){if(1&Gt){const _t=r.EpF();r.TgZ(0,"button",39),r.NdJ("click",function(){r.CHM(_t);const ct=r.oxw().$implicit;return r.oxw(2).toggleColumn(ct),!1}),r.TgZ(1,"div",48),r._UZ(2,"input",49),r.TgZ(3,"label",50),r._uU(4),r.qZA()()()}if(2&Gt){const _t=r.oxw().$implicit,Rt=r.oxw(2);r.xp6(2),r.hYB("id","",_t.prop,"",Rt.tableName,""),r.Q6J("name",_t.prop)("checked",!_t.isHidden),r.xp6(1),r.hYB("for","",_t.prop,"",Rt.tableName,""),r.xp6(1),r.Oqu(_t.name)}}function Br(Gt,Rn){if(1&Gt&&(r.ynx(0),r.YNc(1,$r,5,7,"button",47),r.BQk()),2&Gt){const _t=Rn.$implicit;r.xp6(1),r.Q6J("ngIf",""!==_t.name)}}function Pn(Gt,Rn){if(1&Gt){const _t=r.EpF();r.TgZ(0,"div",51)(1,"button",52),r.NdJ("click",function(){return r.CHM(_t),r.oxw(2).refreshBtn()}),r._UZ(2,"i",30),r.qZA()()}if(2&Gt){const _t=r.oxw(2);r.xp6(1),r.Tol("btn btn-"+_t.status.type),r.Q6J("ngbTooltip",_t.status.msg),r.xp6(1),r.ekj("fa-spin",_t.updating||_t.loadingIndicator),r.Q6J("ngClass",r.WLB(6,pr,_t.icons.large,_t.icons.refresh))}}function Xn(Gt,Rn){if(1&Gt&&(r.TgZ(0,"div",22)(1,"div",23),r.Hsn(2,1),r.qZA(),r.YNc(3,Ei,12,10,"div",24),r.YNc(4,mi,6,7,"div",25),r.YNc(5,ur,2,1,"div",26),r.TgZ(6,"div",27)(7,"div",28)(8,"button",29),r._UZ(9,"i",30),r.qZA(),r.TgZ(10,"div",31),r.YNc(11,Br,2,1,"ng-container",32),r.qZA()()(),r.YNc(12,Pn,3,9,"div",33),r.qZA()),2&Gt){const _t=r.oxw();r.xp6(3),r.Q6J("ngIf",0!==_t.columnFilters.length),r.xp6(1),r.Q6J("ngIf",_t.searchField),r.xp6(1),r.Q6J("ngIf",_t.limit),r.xp6(4),r.Q6J("ngClass",r.WLB(6,pr,_t.icons.large,_t.icons.table)),r.xp6(2),r.Q6J("ngForOf",_t.columns),r.xp6(1),r.Q6J("ngIf",_t.fetchData.observers.length>0)}}function dr(Gt,Rn){if(1&Gt){const _t=r.EpF();r.TgZ(0,"span",57)(1,"span",58),r._uU(2),r.qZA(),r.TgZ(3,"a",59),r.NdJ("click",function(){r.CHM(_t);const ct=r.oxw().$implicit;return r.oxw(2).onChangeFilter(ct),!1}),r._UZ(4,"i",60),r.qZA()()}if(2&Gt){const _t=r.oxw().$implicit,Rt=r.oxw(2);r.xp6(2),r.AsE("",_t.column.name,": ",_t.value.formatted,""),r.xp6(2),r.Q6J("ngClass",r.VKq(3,St,Rt.icons.destroy))}}function Qr(Gt,Rn){if(1&Gt&&(r.TgZ(0,"span"),r.YNc(1,dr,5,5,"span",56),r.qZA()),2&Gt){const _t=Rn.$implicit;r.xp6(1),r.Q6J("ngIf",_t.value)}}function Ci(Gt,Rn){if(1&Gt){const _t=r.EpF();r.TgZ(0,"div",22)(1,"div",53),r.YNc(2,Qr,2,1,"span",32),r.TgZ(3,"a",54),r.NdJ("click",function(){return r.CHM(_t),r.oxw().onClearFilters(),!1}),r.ynx(4),r.SDv(5,55),r.BQk(),r.qZA()()()}if(2&Gt){const _t=r.oxw();r.xp6(2),r.Q6J("ngForOf",_t.columnFilters)}}function _i(Gt,Rn){if(1&Gt&&r._UZ(0,"input",61),2&Gt){const _t=Rn.isSelected;r.Q6J("checked",_t),r.uIk("aria-label",_t?"selected":"select")}}function so(Gt,Rn){1&Gt&&r.Hsn(0,2)}function Ro(Gt,Rn){if(1&Gt&&(r.TgZ(0,"span"),r._uU(1),r.ynx(2),r.SDv(3,67),r.BQk(),r._uU(4," / "),r.qZA()),2&Gt){const _t=r.oxw().selectedCount;r.xp6(1),r.hij(" ",_t," ")}}function Sr(Gt,Rn){if(1&Gt&&(r.TgZ(0,"span"),r._uU(1),r.ynx(2),r.SDv(3,69),r.BQk(),r._uU(4," / "),r.qZA()),2&Gt){const _t=r.oxw(2).rowCount;r.xp6(1),r.hij(" ",_t," ")}}function Kt(Gt,Rn){if(1&Gt&&(r.TgZ(0,"span"),r.YNc(1,Sr,5,1,"span",63),r._uU(2),r.ynx(3),r.SDv(4,68),r.BQk(),r.qZA()),2&Gt){const _t=r.oxw().rowCount,Rt=r.oxw();r.xp6(1),r.Q6J("ngIf",_t!=(null==Rt.data?null:Rt.data.length)),r.xp6(1),r.hij(" ",(null==Rt.data?null:Rt.data.length)||0," ")}}function un(Gt,Rn){if(1&Gt&&(r._uU(0),r.ynx(1),r.SDv(2,70),r.BQk(),r._uU(3),r.ynx(4),r.SDv(5,71),r.BQk()),2&Gt){const _t=r.oxw().rowCount,Rt=r.oxw();r.hij(" ",(null==Rt.data?null:Rt.data.length)||0," "),r.xp6(3),r.hij(" / ",_t," ")}}function jn(Gt,Rn){if(1&Gt){const _t=r.EpF();r.TgZ(0,"div",62),r.YNc(1,Ro,5,1,"span",63),r.YNc(2,Kt,5,2,"span",64),r.YNc(3,un,6,2,"ng-template",null,65,r.W1O),r.qZA(),r.TgZ(5,"cd-table-pagination",66),r.NdJ("pageChange",function(ct){return r.CHM(_t),r.oxw(),r.MAs(5).onFooterPage(ct)}),r.qZA()}if(2&Gt){const _t=Rn.rowCount,Rt=Rn.pageSize,ct=Rn.curPage,pt=r.MAs(4),kt=r.oxw();r.xp6(1),r.Q6J("ngIf",kt.selectionType),r.xp6(1),r.Q6J("ngIf",!kt.serverSide)("ngIfElse",pt),r.xp6(3),r.Q6J("page",ct)("size",Rt)("count",_t)("hidden",!(_t/Rt>1))}}function Jn(Gt,Rn){if(1&Gt&&(r.TgZ(0,"strong"),r._uU(1),r.qZA()),2&Gt){const _t=Rn.value;r.xp6(1),r.Oqu(_t)}}function Gn(Gt,Rn){if(1&Gt&&r._UZ(0,"cd-sparkline",72),2&Gt){const _t=Rn.row;r.Q6J("data",Rn.value)("isBinary",_t.cdIsBinary)}}function Xr(Gt,Rn){if(1&Gt&&(r.TgZ(0,"a",73),r._uU(1),r.qZA()),2&Gt){const _t=Rn.row,Rt=Rn.value;r.Q6J("routerLink",r.VKq(3,St,_t.cdLink))("queryParams",_t.cdParams),r.xp6(1),r.Oqu(Rt)}}function Zi(Gt,Rn){if(1&Gt&&(r._UZ(0,"i",74),r.ALo(1,"boolean")),2&Gt){const _t=Rn.value,Rt=r.oxw();r.Q6J("ngClass",r.VKq(4,St,Rt.icons.check))("hidden",!r.lcZ(1,2,_t))}}function ii(Gt,Rn){1&Gt&&(r._uU(0),r.ALo(1,"dimless")),2&Gt&&r.hij(" ",r.lcZ(1,1,Rn.value)," /s\n")}function hr(Gt,Rn){if(1&Gt&&r._UZ(0,"i",30),2&Gt){const _t=r.oxw(2);r.Q6J("ngClass",r.WLB(1,pr,_t.icons.spinner,_t.icons.spin))}}function Ki(Gt,Rn){if(1&Gt&&(r.TgZ(0,"span",30),r._uU(1),r.qZA()),2&Gt){const _t=r.oxw(),Rt=_t.column,ct=_t.row;r.Q6J("ngClass",null!=Rt&&null!=Rt.customTemplateConfig&&Rt.customTemplateConfig.executingClass?Rt.customTemplateConfig.executingClass:"text-muted italic"),r.xp6(1),r.hij("(",ct.cdExecuting,")")}}function ln(Gt,Rn){if(1&Gt&&(r.YNc(0,hr,1,4,"i",40),r.TgZ(1,"span",30),r._uU(2),r.qZA(),r.YNc(3,Ki,2,2,"span",40)),2&Gt){const _t=Rn.column,Rt=Rn.row,ct=Rn.value;r.Q6J("ngIf",Rt.cdExecuting),r.xp6(1),r.Q6J("ngClass",null==_t||null==_t.customTemplateConfig?null:_t.customTemplateConfig.valueClass),r.xp6(1),r.hij(" ",ct," "),r.xp6(1),r.Q6J("ngIf",Rt.cdExecuting)}}function Mn(Gt,Rn){if(1&Gt&&(r.TgZ(0,"span"),r.ALo(1,"pipeFunction"),r._uU(2),r.qZA()),2&Gt){const _t=Rn.value,Rt=r.oxw();r.Tol(r.Dn7(1,4,_t,Rt.useCustomClass,Rt)),r.xp6(2),r.Oqu(_t)}}function Zn(Gt,Rn){if(1&Gt&&(r.TgZ(0,"span",76),r._uU(1),r.qZA()),2&Gt){const _t=r.oxw().$implicit,Rt=r.oxw().column;r.Q6J("ngClass",null!=Rt&&null!=Rt.customTemplateConfig&&Rt.customTemplateConfig.map&&null!=Rt&&null!=Rt.customTemplateConfig&&null!=Rt.customTemplateConfig.map[_t]&&Rt.customTemplateConfig.map[_t].class?Rt.customTemplateConfig.map[_t].class:null!=Rt&&null!=Rt.customTemplateConfig&&Rt.customTemplateConfig.class?Rt.customTemplateConfig.class:"badge-primary"),r.xp6(1),r.hij(" ",null!=Rt&&null!=Rt.customTemplateConfig&&Rt.customTemplateConfig.map&&null!=Rt&&null!=Rt.customTemplateConfig&&null!=Rt.customTemplateConfig.map[_t]&&Rt.customTemplateConfig.map[_t].value?Rt.customTemplateConfig.map[_t].value:null!=Rt&&null!=Rt.customTemplateConfig&&Rt.customTemplateConfig.prefix?Rt.customTemplateConfig.prefix+_t:_t," ")}}function cn(Gt,Rn){1&Gt&&(r.TgZ(0,"span"),r._uU(1,"\xa0"),r.qZA())}function Sn(Gt,Rn){if(1&Gt&&(r.TgZ(0,"span"),r.YNc(1,Zn,2,2,"span",75),r.YNc(2,cn,2,0,"span",63),r.qZA()),2&Gt){const _t=Rn.$implicit,Rt=Rn.last,ct=r.oxw().column;r.xp6(1),r.Q6J("ngIf",null!=ct&&null!=ct.customTemplateConfig&&ct.customTemplateConfig.map&&null!=ct&&null!=ct.customTemplateConfig&&null!=ct.customTemplateConfig.map[_t]&&ct.customTemplateConfig.map[_t].value?ct.customTemplateConfig.map[_t].value:null!=ct&&null!=ct.customTemplateConfig&&ct.customTemplateConfig.prefix?ct.customTemplateConfig.prefix+_t:_t),r.xp6(1),r.Q6J("ngIf",!Rt)}}function Or(Gt,Rn){1&Gt&&(r.YNc(0,Sn,3,2,"span",32),r.ALo(1,"array")),2&Gt&&r.Q6J("ngForOf",r.lcZ(1,1,Rn.value))}function ri(Gt,Rn){if(1&Gt&&(r.TgZ(0,"span"),r._uU(1),r.ALo(2,"map"),r.qZA()),2&Gt){const _t=Rn.column,Rt=Rn.value;r.xp6(1),r.Oqu(r.xi3(2,1,Rt,null==_t?null:_t.customTemplateConfig))}}function vi(Gt,Rn){if(1&Gt&&(r.TgZ(0,"span",77),r._uU(1),r.ALo(2,"truncate"),r.qZA()),2&Gt){const _t=Rn.column,Rt=Rn.value;r.Q6J("title",Rt),r.xp6(1),r.Oqu(r.Dn7(2,2,Rt,null==_t||null==_t.customTemplateConfig?null:_t.customTemplateConfig.length,null==_t||null==_t.customTemplateConfig?null:_t.customTemplateConfig.omission))}}function Ui(Gt,Rn){if(1&Gt){const _t=r.EpF();r.TgZ(0,"a",78),r.NdJ("click",function(ct){const pt=r.CHM(_t),kt=pt.row,dn=pt.expanded;return r.oxw().toggleExpandRow(kt,dn,ct)}),r.qZA()}if(2&Gt){const _t=Rn.expanded;r.ekj("expand-collapse-icon-right",!_t)("expand-collapse-icon-down",_t)}}function ao(Gt,Rn){if(1&Gt&&(r.TgZ(0,"span",77),r.ALo(1,"cdDate"),r._uU(2),r.ALo(3,"relativeDate"),r.qZA()),2&Gt){const _t=Rn.value;r.Q6J("title",r.lcZ(1,2,_t)),r.xp6(2),r.Oqu(r.lcZ(3,4,_t))}}const dt=[[["",8,"only-table-actions"]],[["",8,"table-actions"]],[["","cdTableDetail",""]]],Bi=[".only-table-actions",".table-actions","[cdTableDetail]"];let to=(()=>{class Gt{constructor(_t,Rt){this.cdRef=_t,this.timerService=Rt,this.columnMode="flex",this.onlyActionHeader=!1,this.toolHeader=!0,this.searchField=!0,this.header=!0,this.footer=!0,this.limit=10,this.maxLimit=9999,this.hasDetails=!1,this.autoReload=5e3,this.identifier="id",this.forceIdentifier=!1,this.selectionType=void 0,this.updateSelectionOnRefresh="onChange",this.updateExpandedOnRefresh="onChange",this.autoSave=!0,this.searchableObjects=!1,this.extraFilterableColumns=[],this.status=new y.c,this.serverSide=!1,this.count=0,this.fetchData=new r.vpe,this.updateSelection=new r.vpe,this.setExpandedRow=new r.vpe,this.columnFiltersChanged=new r.vpe,this.selection=new L.r,this.expanded=void 0,this.icons=C.P,this.cellTemplates={},this.search="",this.rows=[],this.loadingIndicator=!0,this.paginationClasses={pagerLeftArrow:C.P.leftArrowDouble,pagerRightArrow:C.P.rightArrowDouble,pagerPrevious:C.P.leftArrow,pagerNext:C.P.rightArrow},this.userConfig={},this.localStorage=window.localStorage,this.updating=!1,this.columnFilters=[]}get columnFiltered(){return c().some(this.columnFilters,_t=>void 0!==_t.value)}static prepareSearch(_t){return(_t=_t.toLowerCase().replace(/,/g,"")).match(/['"][^'"]+['"]/)&&(_t=_t.replace(/['"][^'"]+['"]/g,Rt=>Rt.replace(/(['"])([^'"]+)(['"])/g,"$2").replace(/ /g,"+"))),_t.split(" ").filter(Rt=>Rt)}ngOnInit(){if(this.localColumns=c().clone(this.columns),this.serverSide&&(this.reloadData=c().debounce(this.reloadData,1e3)),this.table.element.addEventListener("mouseenter",_t=>_t.stopPropagation()),this._addTemplates(),!this.sorts){const _t=-1!==c().findIndex(this.localColumns,["prop",this.identifier]);this.sorts=this.createSortingDefinition(_t?this.identifier:this.localColumns[0].prop+""),!_t&&!this.forceIdentifier&&(this.identifier=this.localColumns[0].prop+"")}this.initUserConfig(),this.localColumns.forEach(_t=>{_t.cellTransformation&&(_t.cellTemplate=this.cellTemplates[_t.cellTransformation]),_t.flexGrow||(_t.flexGrow=_t.prop+""===this.identifier?1:2),_t.resizeable||(_t.resizeable=!1)}),this.initExpandCollapseColumn(),this.initCheckboxColumn(),this.filterHiddenColumns(),this.initColumnFilters(),this.updateColumnFilterOptions(),this.updateSelection.emit(new L.r),this.fetchData.observers.length>0&&(this.loadingIndicator=!0),c().isInteger(this.autoReload)&&this.autoReload>0?this.reloadSubscriber=this.timerService.get(()=>(0,e.of)(0),this.autoReload).subscribe(()=>{this.reloadData()}):this.autoReload?this.useData():this.reloadData()}initUserConfig(){this.autoSave&&(this.tableName=this._calculateUniqueTableName(this.localColumns),this._loadUserConfig(),this._initUserConfigAutoSave()),this.userConfig.limit||(this.userConfig.limit=this.limit),this.userConfig.offset>=0||(this.userConfig.offset=this.table.offset),this.userConfig.search||(this.userConfig.search=this.search),this.userConfig.sorts||(this.userConfig.sorts=this.sorts),this.userConfig.columns?this.userConfig.columns.forEach(_t=>{for(let Rt=0;Rt<this.localColumns.length;Rt++)this.localColumns[Rt].prop===_t.prop&&(this.localColumns[Rt].isHidden=_t.isHidden)}):this.updateUserColumns()}_calculateUniqueTableName(_t){const Rt=ct=>{if(!c().isString(ct))return 0;let pt=0;for(let kt=0;kt<ct.length;kt++)pt+=ct.charCodeAt(kt)*kt;return pt};return _t.reduce((ct,pt,kt)=>(Rt(pt.prop)+Rt(pt.name))*(kt+1)+ct,0).toString()}_loadUserConfig(){const _t=this.localStorage.getItem(this.tableName);_t&&(this.userConfig=JSON.parse(_t))}_initUserConfigAutoSave(){const _t=new p.y(this._initUserConfigProxy.bind(this));this.saveSubscriber=_t.subscribe(this._saveUserConfig.bind(this))}_initUserConfigProxy(_t){this.userConfig=new Proxy(this.userConfig,{set:(Rt,ct,pt)=>(Rt[ct]=pt,_t.next(Rt),!0)})}_saveUserConfig(_t){this.localStorage.setItem(this.tableName,JSON.stringify(_t))}updateUserColumns(){this.userConfig.columns=this.localColumns.map(_t=>({prop:_t.prop,name:_t.name,isHidden:!!_t.isHidden}))}initCheckboxColumn(){"multiClick"===this.selectionType&&this.localColumns.unshift({prop:void 0,resizeable:!1,sortable:!1,draggable:!1,checkboxable:!1,canAutoResize:!1,cellClass:"cd-datatable-checkbox",cellTemplate:this.rowSelectionTpl,width:30})}initExpandCollapseColumn(){this.hasDetails&&this.localColumns.unshift({prop:void 0,resizeable:!1,sortable:!1,draggable:!1,isHidden:!1,canAutoResize:!1,cellClass:"cd-datatable-expand-collapse",width:40,cellTemplate:this.rowDetailsTpl})}filterHiddenColumns(){this.tableColumns=this.localColumns.filter(_t=>!_t.isHidden)}initColumnFilters(){let _t=c().filter(this.localColumns,{filterable:!0});_t=[..._t,...this.extraFilterableColumns],this.columnFilters=_t.map(Rt=>({column:Rt,options:[],value:Rt.filterInitValue?this.createColumnFilterOption(Rt.filterInitValue,Rt.pipe):void 0})),this.selectedFilter=c().first(this.columnFilters)}createColumnFilterOption(_t,Rt){return{raw:c().toString(_t),formatted:Rt?Rt.transform(_t):c().toString(_t)}}updateColumnFilterOptions(){this.columnFilters.forEach(_t=>{let Rt=[];if(c().isUndefined(_t.column.filterOptions)){const pt=c().filter(c().map(this.data,_t.column.prop),kt=>c().isString(kt)&&""!==kt||c().isBoolean(kt)||c().isFinite(kt)||c().isDate(kt));Rt=c().sortedUniq(pt.sort())}else Rt=_t.column.filterOptions;const ct=Rt.map(pt=>this.createColumnFilterOption(pt,_t.column.pipe));_t.value&&c().isUndefined(c().find(ct,{raw:_t.value.raw}))&&(_t.value=void 0),_t.options=ct})}onSelectFilter(_t){this.selectedFilter=_t}onChangeFilter(_t,Rt){_t.value=c().isEqual(_t.value,Rt)?void 0:Rt,this.updateFilter()}doColumnFiltering(){const _t=[];let Rt=[...this.data],ct=[];return this.columnFilters.forEach(pt=>{if(void 0===pt.value)return;_t.push({name:pt.column.name,prop:pt.column.prop,value:pt.value});const kt=c().partition(Rt,dn=>{const Oi=(0,a.Hg)(pt.column.prop)(dn,pt.column.prop);return c().isUndefined(pt.column.filterPredicate)?`${Oi}`===pt.value.raw:pt.column.filterPredicate(dn,pt.value.raw)});Rt=kt[0],ct=[...ct,...kt[1]]}),this.columnFiltersChanged.emit({filters:_t,data:Rt,dataOut:ct}),c().forEach(this.selection.selected,pt=>{void 0===c().find(Rt,{[this.identifier]:pt[this.identifier]})&&(this.selection=new L.r,this.onSelect(this.selection))}),Rt}ngOnDestroy(){this.reloadSubscriber&&this.reloadSubscriber.unsubscribe(),this.saveSubscriber&&this.saveSubscriber.unsubscribe()}ngAfterContentChecked(){this.table&&this.table.element.clientWidth!==this.currentWidth&&(this.currentWidth=this.table.element.clientWidth,this.table.recalculate(),c().get(this.table,"cd").markForCheck())}_addTemplates(){this.cellTemplates.bold=this.tableCellBoldTpl,this.cellTemplates.checkIcon=this.checkIconTpl,this.cellTemplates.sparkline=this.sparklineTpl,this.cellTemplates.routerLink=this.routerLinkTpl,this.cellTemplates.perSecond=this.perSecondTpl,this.cellTemplates.executing=this.executingTpl,this.cellTemplates.classAdding=this.classAddingTpl,this.cellTemplates.badge=this.badgeTpl,this.cellTemplates.map=this.mapTpl,this.cellTemplates.truncate=this.truncateTpl,this.cellTemplates.timeAgo=this.timeAgoTpl}useCustomClass(_t){if(!this.customCss)throw new Error("Custom classes are not set!");const Rt=Object.keys(this.customCss),ct=Object.values(this.customCss).map((pt,kt)=>(c().isFunction(pt)&&pt(_t)||pt===_t)&&Rt[kt]).filter(pt=>pt).join(" ");return c().isEmpty(ct)?void 0:ct}ngOnChanges(_t){_t.data&&_t.data.currentValue&&this.useData()}setLimit(_t){const Rt=Number(_t.target.value);Rt>0&&(this.maxLimit&&Rt>this.maxLimit?(this.userConfig.limit=this.maxLimit,_t.srcElement.value=this.maxLimit):this.userConfig.limit=Rt),this.serverSide&&this.reloadData()}reloadData(){var _t;if(!this.updating){this.status=new y.c;const Rt=new R.E(()=>{Rt.errorConfig.displayError&&(this.status=new y.c("danger","Failed to load data.")),Rt.errorConfig.resetData&&(this.data=[]),this.useData()});if(Rt.pageInfo.offset=this.userConfig.offset,Rt.pageInfo.limit=this.userConfig.limit,Rt.search=this.userConfig.search,null===(_t=this.userConfig.sorts)||void 0===_t?void 0:_t.length){const ct=this.userConfig.sorts[0];Rt.sort=`${"desc"===ct.dir?"-":"+"}${ct.prop}`}this.fetchData.emit(Rt),this.updating=!0}}refreshBtn(){this.loadingIndicator=!0,this.reloadData()}changePage(_t){this.userConfig.offset=_t.offset,this.userConfig.limit=_t.limit,this.serverSide&&this.reloadData()}rowIdentity(){return _t=>{const Rt=_t[this.identifier];if(c().isUndefined(Rt))throw new Error(`Wrong identifier "${this.identifier}" -> "${Rt}"`);return Rt}}useData(){!this.data||(this.updateColumnFilterOptions(),this.updateFilter(),this.reset(),this.updateSelected(),this.updateExpanded())}reset(){this.loadingIndicator=!1,this.updating=!1}updateSelected(){if("never"===this.updateSelectionOnRefresh)return;const _t=new Set;this.selection.selected.forEach(ct=>{for(const pt of this.data)ct[this.identifier]===pt[this.identifier]&&_t.add(pt)});const Rt=Array.from(_t.values());"onChange"===this.updateSelectionOnRefresh&&c().isEqual(this.selection.selected,Rt)||(this.selection.selected=Rt,this.onSelect(this.selection))}updateExpanded(){if(c().isUndefined(this.expanded)||"never"===this.updateExpandedOnRefresh)return;const _t=this.expanded[this.identifier],Rt=c().find(this.data,ct=>_t===ct[this.identifier]);"onChange"===this.updateExpandedOnRefresh&&c().isEqual(this.expanded,Rt)||(this.expanded=Rt,this.setExpandedRow.emit(Rt))}onSelect(_t){c().has(_t,"selected")&&(this.selection.selected=_t.selected),this.updateSelection.emit(c().clone(this.selection))}toggleColumn(_t){const Rt=_t.prop,ct=!_t.isHidden;ct&&1===this.tableColumns.length?_t.isHidden=!0:(c().find(this.localColumns,pt=>pt.prop===Rt).isHidden=ct,this.updateColumns())}updateColumns(){this.updateUserColumns(),this.filterHiddenColumns();const _t=this.userConfig.sorts[0].prop;c().find(this.tableColumns,Rt=>Rt.prop===_t)||(this.userConfig.sorts=this.createSortingDefinition(this.tableColumns[0].prop)),this.table.recalculate(),this.cdRef.detectChanges()}createSortingDefinition(_t){return[{prop:_t,dir:a.Sr.asc}]}changeSorting({sorts:_t}){this.userConfig.sorts=_t,this.serverSide&&(this.userConfig.offset=0,this.reloadData())}onClearSearch(){this.search="",this.updateFilter()}onClearFilters(){this.columnFilters.forEach(_t=>{_t.value=void 0}),this.selectedFilter=c().first(this.columnFilters),this.updateFilter()}updateFilter(){if(this.serverSide)this.userConfig.search!==this.search&&(this.userConfig.offset=0,this.userConfig.limit=this.limit,this.userConfig.search=this.search,this.updating=!1,this.reloadData()),this.rows=this.data;else{let _t=0!==this.columnFilters.length?this.doColumnFiltering():this.data;if(this.search.length>0&&_t){const Rt=this.localColumns.filter(ct=>ct.cellTransformation!==T.e.sparkline);_t=this.subSearch(_t,Gt.prepareSearch(this.search),Rt),this.table.offset=0}this.rows=_t}}subSearch(_t,Rt,ct){if(0===Rt.length||0===_t.length)return _t;const pt=Rt.pop().replace(/\+/g," ").split(":"),kt=[...ct];return 2===pt.length&&(ct=kt.filter(dn=>-1!==dn.name.toLowerCase().indexOf(pt[0]))),_t=this.basicDataSearch(c().last(pt),_t,ct),this.subSearch(_t,Rt,kt)}basicDataSearch(_t,Rt,ct){return 0===_t.length?Rt:Rt.filter(pt=>ct.filter(kt=>{let dn=c().get(pt,kt.prop);if(c().isUndefined(kt.pipe)||(dn=kt.pipe.transform(dn)),c().isUndefined(dn)||c().isNull(dn))return!1;if(c().isArray(dn)?dn=dn.join(" "):(c().isNumber(dn)||c().isBoolean(dn))&&(dn=dn.toString()),c().isObjectLike(dn)){if(!this.searchableObjects)return!1;dn=JSON.stringify(dn)}return-1!==dn.toLowerCase().indexOf(_t)}).length>0)}getRowClass(){return()=>({clickable:!c().isUndefined(this.selectionType)})}toggleExpandRow(_t,Rt,ct){ct.stopPropagation(),Rt?(this.expanded=void 0,this.setExpandedRow.emit(void 0)):(this.expanded=_t,this.table.rowDetail.collapseAllRows(),this.setExpandedRow.emit(_t)),this.table.rowDetail.toggleExpandRow(_t)}}return Gt.\u0275fac=function(_t){return new(_t||Gt)(r.Y36(r.sBO),r.Y36(z.f))},Gt.\u0275cmp=r.Xpm({type:Gt,selectors:[["cd-table"]],viewQuery:function(_t,Rt){if(1&_t&&(r.Gf(a.nE,7),r.Gf(We,7),r.Gf(Ve,7),r.Gf(Be,7),r.Gf(xe,7),r.Gf(je,7),r.Gf(Ne,7),r.Gf(Bt,7),r.Gf(rt,7),r.Gf(en,7),r.Gf(Pt,7),r.Gf(Vt,7),r.Gf(hn,7),r.Gf(vn,7)),2&_t){let ct;r.iGM(ct=r.CRH())&&(Rt.table=ct.first),r.iGM(ct=r.CRH())&&(Rt.tableCellBoldTpl=ct.first),r.iGM(ct=r.CRH())&&(Rt.sparklineTpl=ct.first),r.iGM(ct=r.CRH())&&(Rt.routerLinkTpl=ct.first),r.iGM(ct=r.CRH())&&(Rt.checkIconTpl=ct.first),r.iGM(ct=r.CRH())&&(Rt.perSecondTpl=ct.first),r.iGM(ct=r.CRH())&&(Rt.executingTpl=ct.first),r.iGM(ct=r.CRH())&&(Rt.classAddingTpl=ct.first),r.iGM(ct=r.CRH())&&(Rt.badgeTpl=ct.first),r.iGM(ct=r.CRH())&&(Rt.mapTpl=ct.first),r.iGM(ct=r.CRH())&&(Rt.truncateTpl=ct.first),r.iGM(ct=r.CRH())&&(Rt.timeAgoTpl=ct.first),r.iGM(ct=r.CRH())&&(Rt.rowDetailsTpl=ct.first),r.iGM(ct=r.CRH())&&(Rt.rowSelectionTpl=ct.first)}},inputs:{data:"data",columns:"columns",sorts:"sorts",columnMode:"columnMode",onlyActionHeader:"onlyActionHeader",toolHeader:"toolHeader",searchField:"searchField",header:"header",footer:"footer",limit:"limit",maxLimit:"maxLimit",hasDetails:"hasDetails",autoReload:"autoReload",identifier:"identifier",forceIdentifier:"forceIdentifier",selectionType:"selectionType",updateSelectionOnRefresh:"updateSelectionOnRefresh",updateExpandedOnRefresh:"updateExpandedOnRefresh",autoSave:"autoSave",searchableObjects:"searchableObjects",customCss:"customCss",extraFilterableColumns:"extraFilterableColumns",status:"status",serverSide:"serverSide",count:"count"},outputs:{fetchData:"fetchData",updateSelection:"updateSelection",setExpandedRow:"setExpandedRow",columnFiltersChanged:"columnFiltersChanged"},features:[r.TTD],ngContentSelectors:Bi,decls:37,vars:21,consts:function(){let Rn,_t,Rt,ct,pt,kt,dn;return Rn="Clear filters",_t="selected",Rt="total",ct="found",pt="found",kt="total",dn="Expand/Collapse Row",[[1,"dataTables_wrapper"],["class","dataTables_header clearfix",4,"ngIf"],[1,"bootstrap","cd-datatable",3,"cssClasses","selectionType","selected","sorts","columns","columnMode","rows","rowClass","headerHeight","footerHeight","count","externalPaging","externalSorting","limit","offset","loadingIndicator","rowIdentity","rowHeight","select","sort","page"],["table",""],["ngx-datatable-cell-template",""],["rowSelectionTpl",""],["rowHeight","auto"],["detailRow",""],["ngx-datatable-row-detail-template",""],["ngx-datatable-footer-template",""],["tableCellBoldTpl",""],["sparklineTpl",""],["routerLinkTpl",""],["checkIconTpl",""],["perSecondTpl",""],["executingTpl",""],["classAddingTpl",""],["badgeTpl",""],["mapTpl",""],["truncateTpl",""],["rowDetailsTpl",""],["timeAgoTpl",""],[1,"dataTables_header","clearfix"],[1,"cd-datatable-actions"],["class","btn-group widget-toolbar",4,"ngIf"],["class","input-group search",4,"ngIf"],["class","input-group dataTables_paginate",4,"ngIf"],[1,"widget-toolbar"],["ngbDropdown","","autoClose","outside",1,"tc_menuitem"],["ngbDropdownToggle","","title","toggle columns",1,"btn","btn-light","tc_columnBtn"],[3,"ngClass"],["ngbDropdownMenu",""],[4,"ngFor","ngForOf"],["class","widget-toolbar tc_refreshBtn",4,"ngIf"],[1,"btn-group","widget-toolbar"],["ngbDropdown","","placement","bottom-right",1,"tc_filter_name"],["ngbDropdownToggle","","title","Filter",1,"btn","btn-light"],["ngbDropdown","","placement","bottom-right",1,"tc_filter_option"],["ngbDropdownToggle","",1,"btn","btn-light"],["ngbDropdownItem","",3,"click"],[3,"ngClass",4,"ngIf"],[1,"input-group","search"],[1,"input-group-text"],["aria-label","search","type","text",1,"form-control",3,"ngModel","ngModelChange","keyup"],["type","button","title","Clear",1,"btn","btn-light",3,"click"],[1,"input-group","dataTables_paginate"],["aria-label","table pagination","type","number","min","1","max","9999",1,"form-control",3,"value","click","keyup","blur"],["ngbDropdownItem","",3,"click",4,"ngIf"],[1,"custom-control","custom-checkbox","py-0"],["type","checkbox",1,"custom-control-input",3,"name","id","checked"],[1,"custom-control-label",3,"for"],[1,"widget-toolbar","tc_refreshBtn"],["type","button","title","Refresh",3,"ngbTooltip","click"],[1,"filter-chips"],["href","",1,"tc_clearSelections",3,"click"],Rn,["class","badge badge-info me-2",4,"ngIf"],[1,"badge","badge-info","me-2"],[1,"me-2"],[1,"badge-remove",3,"click"],["aria-hidden","true",3,"ngClass"],["type","checkbox",1,"cd-datatable-checkbox",3,"checked"],[1,"page-count"],[4,"ngIf"],[4,"ngIf","ngIfElse"],["serverSideTpl",""],[3,"page","size","count","hidden","pageChange"],_t,Rt,ct,pt,kt,[3,"data","isBinary"],[3,"routerLink","queryParams"],[3,"ngClass","hidden"],["class","badge",3,"ngClass",4,"ngIf"],[1,"badge",3,"ngClass"],["data-toggle","tooltip",3,"title"],["href","javascript:void(0)","title",dn,1,"expand-collapse-icon","tc_expand-collapse",3,"click"]]},template:function(_t,Rt){1&_t&&(r.F$t(dt),r.TgZ(0,"div",0),r.YNc(1,mt,3,0,"div",1),r.YNc(2,Xn,13,9,"div",1),r.YNc(3,Ci,6,1,"div",1),r.TgZ(4,"ngx-datatable",2,3),r.NdJ("select",function(pt){return Rt.onSelect(pt)})("sort",function(pt){return Rt.changeSorting(pt)})("page",function(pt){return Rt.changePage(pt)}),r.YNc(6,_i,1,2,"ng-template",4,5,r.W1O),r.TgZ(8,"ngx-datatable-row-detail",6,7),r.YNc(10,so,1,0,"ng-template",8),r.qZA(),r.TgZ(11,"ngx-datatable-footer"),r.YNc(12,jn,6,7,"ng-template",9),r.qZA()()(),r.YNc(13,Jn,2,1,"ng-template",null,10,r.W1O),r.YNc(15,Gn,1,2,"ng-template",null,11,r.W1O),r.YNc(17,Xr,2,5,"ng-template",null,12,r.W1O),r.YNc(19,Zi,2,6,"ng-template",null,13,r.W1O),r.YNc(21,ii,2,3,"ng-template",null,14,r.W1O),r.YNc(23,ln,4,4,"ng-template",null,15,r.W1O),r.YNc(25,Mn,3,8,"ng-template",null,16,r.W1O),r.YNc(27,Or,2,3,"ng-template",null,17,r.W1O),r.YNc(29,ri,3,4,"ng-template",null,18,r.W1O),r.YNc(31,vi,3,6,"ng-template",null,19,r.W1O),r.YNc(33,Ui,1,4,"ng-template",4,20,r.W1O),r.YNc(35,ao,4,6,"ng-template",null,21,r.W1O)),2&_t&&(r.xp6(1),r.Q6J("ngIf",Rt.onlyActionHeader),r.xp6(1),r.Q6J("ngIf",Rt.toolHeader),r.xp6(1),r.Q6J("ngIf",Rt.toolHeader&&Rt.columnFiltered),r.xp6(1),r.Q6J("cssClasses",Rt.paginationClasses)("selectionType",Rt.selectionType)("selected",Rt.selection.selected)("sorts",Rt.userConfig.sorts)("columns",Rt.tableColumns)("columnMode",Rt.columnMode)("rows",Rt.rows)("rowClass",Rt.getRowClass())("headerHeight",Rt.header?"auto":0)("footerHeight",Rt.footer?"auto":0)("count",Rt.count)("externalPaging",Rt.serverSide)("externalSorting",Rt.serverSide)("limit",Rt.userConfig.limit>0?Rt.userConfig.limit:void 0)("offset",Rt.userConfig.offset>=0?Rt.userConfig.offset:0)("loadingIndicator",Rt.loadingIndicator)("rowIdentity",Rt.rowIdentity())("rowHeight","auto"))},directives:[W.O5,J.jt,J.iD,W.mk,J.Vi,W.sg,J.TH,ee.Fj,ee.JJ,ee.On,J._L,a.nE,a.vq,a.$7,a.AR,a.dX,a.ii,ce,ie.l,U.yS],pipes:[se.i,ge.n,ae.i,he.I,be.b,we.W,ue.N,st.h],styles:['.dataTables_wrapper[_ngcontent-%COMP%]{margin-bottom:25px;max-width:99.9%}.dataTables_wrapper[_ngcontent-%COMP%]   .separator[_ngcontent-%COMP%]{border-left:1px solid rgba(0,0,0,.09);display:inline-block;height:30px;margin-left:5px;padding-left:5px;vertical-align:middle}.dataTables_wrapper[_ngcontent-%COMP%]   .widget-toolbar[_ngcontent-%COMP%]{border-left:1px solid rgba(0,0,0,.09);float:right;padding:0 8px}.dataTables_wrapper[_ngcontent-%COMP%]   .widget-toolbar[_ngcontent-%COMP%]   .form-check[_ngcontent-%COMP%]{padding-left:0}.dataTables_wrapper[_ngcontent-%COMP%]   .dataTables_length[_ngcontent-%COMP%] > input[_ngcontent-%COMP%]{line-height:25px;text-align:right}.dataTables_header[_ngcontent-%COMP%]{background-color:#f8f9fa;border:1px solid #ced4da;border-bottom:0;padding:5px;position:relative}.dataTables_header[_ngcontent-%COMP%]   .cd-datatable-actions[_ngcontent-%COMP%]{float:left}.dataTables_header[_ngcontent-%COMP%]   .form-group[_ngcontent-%COMP%]{padding-left:8px}.dataTables_header[_ngcontent-%COMP%]   .input-group[_ngcontent-%COMP%]{border-left:1px solid rgba(0,0,0,.09);float:right;max-width:250px;padding-left:8px;padding-right:8px;width:40%}.dataTables_header[_ngcontent-%COMP%]   .input-group[_ngcontent-%COMP%]   .form-control[_ngcontent-%COMP%]{height:30px}.dataTables_header[_ngcontent-%COMP%]   .input-group.dataTables_paginate[_ngcontent-%COMP%]{min-width:85px;padding-right:8px;width:8%}.dataTables_header[_ngcontent-%COMP%]   .filter-chips[_ngcontent-%COMP%]{float:right;padding:0 8px}.dataTables_header[_ngcontent-%COMP%]   .filter-chips[_ngcontent-%COMP%]   .badge-remove[_ngcontent-%COMP%]{color:#fff}  cd-table .cd-datatable{border:1px solid #ced4da;margin-bottom:0;max-width:none!important}  cd-table .cd-datatable .progress-linear{display:block;height:5px;margin:0;padding:0;position:relative;width:100%}  cd-table .cd-datatable .progress-linear .container{background-color:#25828e}  cd-table .cd-datatable .progress-linear .container .bar{background-color:#25828e;height:100%;left:0;overflow:hidden;position:absolute;width:100%}  cd-table .cd-datatable .progress-linear .container .bar:before{animation:progress-loading 3s linear infinite;background-color:#25828e;content:"";display:block;height:100%;left:-200px;position:absolute;width:200px}  cd-table .cd-datatable .datatable-header{background-clip:padding-box;background-color:#f8f9fa;background-image:linear-gradient(to bottom,#f8f9fa 0,#e9ecef 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr="#fffafafa",endColorstr="#ffededed",GradientType=0)}  cd-table .cd-datatable .datatable-header .sort-asc,   cd-table .cd-datatable .datatable-header .sort-desc{color:#25828e}  cd-table .cd-datatable .datatable-header .datatable-header-cell{border:0;border-bottom:1px solid #ced4da;border-left:1px solid #ced4da;padding:5px;font-weight:700;text-align:left}  cd-table .cd-datatable .datatable-header .datatable-header-cell .datatable-header-cell-label:after{font-family:ForkAwesome;font-weight:400;height:9px;left:10px;line-height:12px;position:relative;vertical-align:baseline;width:12px}  cd-table .cd-datatable .datatable-header .datatable-header-cell.sortable .datatable-header-cell-label:after{content:" \\f0dc"}  cd-table .cd-datatable .datatable-header .datatable-header-cell.sortable.sort-active.sort-asc .datatable-header-cell-label:after{content:" \\f160"}  cd-table .cd-datatable .datatable-header .datatable-header-cell.sortable.sort-active.sort-desc .datatable-header-cell-label:after{content:" \\f161"}  cd-table .cd-datatable .datatable-header .datatable-header-cell:first-child{border-left:0}  cd-table .cd-datatable .datatable-body{margin-bottom:-6px}  cd-table .cd-datatable .datatable-body .empty-row{background-color:#aee3ea;font-style:italic;font-weight:700;padding-bottom:5px;padding-top:5px;text-align:center}  cd-table .cd-datatable .datatable-body .datatable-body-row.clickable:hover .datatable-row-group{background-color:#aee3ea;transition-duration:.3s;transition-property:background;transition-timing-function:linear}  cd-table .cd-datatable .datatable-body .datatable-body-row.datatable-row-even{background-color:#fff}  cd-table .cd-datatable .datatable-body .datatable-body-row.datatable-row-odd{background-color:#fff}  cd-table .cd-datatable .datatable-body .datatable-body-row.active,   cd-table .cd-datatable .datatable-body .datatable-body-row.active:hover{background-color:#86d5df}  cd-table .cd-datatable .datatable-body .datatable-body-row .datatable-body-cell{border:0;border-bottom:1px solid #ced4da;border-left:1px solid #ced4da;padding:5px}  cd-table .cd-datatable .datatable-body .datatable-body-row .datatable-body-cell:first-child{border-left:0}  cd-table .cd-datatable .datatable-body .datatable-body-row .datatable-body-cell .datatable-body-cell-label{display:block;height:100%}  cd-table .cd-datatable .datatable-body .datatable-row-detail{border-bottom:2px solid #ced4da;overflow-y:visible!important;padding:20px}  cd-table .cd-datatable .datatable-body .expand-collapse-icon{display:block;height:100%;text-align:center}  cd-table .cd-datatable .datatable-body .expand-collapse-icon:hover{text-decoration:none}  cd-table .cd-datatable .datatable-body .expand-collapse-icon-right:before{color:#212529;font-family:ForkAwesome,sans-serif;font-size:1rem;line-height:1;content:"\\f105"}  cd-table .cd-datatable .datatable-body .expand-collapse-icon-down:before{color:#212529;font-family:ForkAwesome,sans-serif;font-size:1rem;line-height:1;content:"\\f107"}  cd-table .cd-datatable .datatable-footer .selected-count,   cd-table .cd-datatable .datatable-footer .page-count{font-style:italic;min-height:2rem;padding-left:.3rem;padding-top:.3rem}  cd-table .cd-datatable .cd-datatable-checkbox{text-align:center}  cd-table .cd-datatable .cd-datatable-checkbox:checked{accent-color:#25828e}@keyframes progress-loading{0%{left:-200px;width:15%}50%{width:30%}70%{width:70%}80%{left:50%}95%{left:120%}to{left:100%}}'],changeDetection:0}),Gt})()},93523:(m,S,i)=>{"use strict";i.d(S,{G:()=>c,o:()=>f});var r=i(23815),a=i.n(r);function f(...y){switch(y.length){case 1:return e.apply(void 0,y);case 3:return p.apply(void 0,y);default:throw new Error}}function c(y,T,C){const R=`__ignore_${T}`;Array.isArray(y[R])?y[R].push(C):y[R]=[C]}function e(y){for(const T of Object.getOwnPropertyNames(y.prototype)){const C=Object.getOwnPropertyDescriptor(y.prototype,T);!(C.value instanceof Function)||"constructor"===T||(p(y.prototype,T,C),Object.defineProperty(y.prototype,T,C))}}function p(y,T,C){void 0===C&&(C=Object.getOwnPropertyDescriptor(y,T));const R=C.value;C.value=function(){const L=`__ignore_${T}`,z=y[L]||[],W=[];for(let ee=0;ee<arguments.length;ee++)W[ee]=a().isString(arguments[ee])&&-1===z.indexOf(ee)?encodeURIComponent(arguments[ee]):arguments[ee];return R.apply(this,W)}}},82945:(m,S,i)=>{"use strict";i.d(S,{U:()=>c});var r=i(23815),a=i.n(r),f=i(89724);let c=(()=>{class e{constructor(y){this.elementRef=y,this.focus=!0}ngAfterViewInit(){const y=this.elementRef.nativeElement;this.focus&&a().isFunction(y.focus)&&y.focus()}set autofocus(y){a().isBoolean(y)?this.focus=y:a().isFunction(y)&&(this.focus=y())}}return e.\u0275fac=function(y){return new(y||e)(f.Y36(f.SBq))},e.\u0275dir=f.lG2({type:e,selectors:[["","autofocus",""]],inputs:{autofocus:"autofocus"}}),e})()},17932:(m,S,i)=>{"use strict";i.d(S,{Q:()=>y});var r=i(89724),a=i(23815),f=i.n(a),c=i(47557),e=i(28211),p=i(1659);let y=(()=>{class T{constructor(R,L,z,W){this.elementRef=R,this.control=L,this.dimlessBinaryPipe=z,this.formatter=W,this.ngModelChange=new r.vpe,this.el=this.elementRef.nativeElement}ngOnInit(){this.setValue(this.el.value)}setValue(R){/^[\d.]+$/.test(R)&&(R+=this.defaultUnit||"m");const L=this.formatter.toBytes(R),z=this.round(L);this.el.value=this.dimlessBinaryPipe.transform(z),null!==L?(this.ngModelChange.emit(this.el.value),this.control.control.setValue(this.el.value)):(this.ngModelChange.emit(null),this.control.control.setValue(null))}round(R){if(null!==R&&0!==R){if(!f().isUndefined(this.minBytes)&&R<this.minBytes)return this.minBytes;if(!f().isUndefined(this.maxBytes)&&R>this.maxBytes)return this.maxBytes;if(!f().isUndefined(this.roundPower)){const L=Math.round(Math.log(R)/Math.log(this.roundPower));return Math.pow(this.roundPower,L)}}return R}onBlur(R){this.setValue(R)}}return T.\u0275fac=function(R){return new(R||T)(r.Y36(r.SBq),r.Y36(p.a5),r.Y36(c.$),r.Y36(e.H))},T.\u0275dir=r.lG2({type:T,selectors:[["","cdDimlessBinary",""]],hostBindings:function(R,L){1&R&&r.NdJ("blur",function(W){return L.onBlur(W.target.value)})},inputs:{minBytes:"minBytes",maxBytes:"maxBytes",roundPower:"roundPower",defaultUnit:"defaultUnit"},outputs:{ngModelChange:"ngModelChange"}}),T})()},35540:(m,S,i)=>{"use strict";i.d(S,{o:()=>a});var r=i(89724);let a=(()=>{class f{}return f.\u0275fac=function(e){return new(e||f)},f.\u0275mod=r.oAB({type:f}),f.\u0275inj=r.cJS({imports:[[]]}),f})()},87925:(m,S,i)=>{"use strict";i.d(S,{o:()=>c});var r=i(89724),a=i(84333),f=i(47640);let c=(()=>{class e{constructor(y,T,C){this.formScope=y,this.authStorageService=T,this.elementRef=C}ngAfterViewInit(){var y,T,C;this.permissions=this.authStorageService.getPermissions();const R=null===(y=this.formScope)||void 0===y?void 0:y.cdFormScope;R&&!(null===(C=null===(T=this.permissions)||void 0===T?void 0:T[R])||void 0===C?void 0:C.update)&&(this.elementRef.nativeElement.disabled=!0)}}return e.\u0275fac=function(y){return new(y||e)(r.Y36(a.T,8),r.Y36(f.j),r.Y36(r.SBq))},e.\u0275dir=r.lG2({type:e,selectors:[["input",3,"cdNoFormInputDisable",""],["select",3,"cdNoFormInputDisable",""],["button",3,"cdNoFormInputDisable",""],["","cdFormInputDisable",""]]}),e})()},63622:(m,S,i)=>{"use strict";i.d(S,{y:()=>e});var r=i(34501),a=i(8958),f=i(93614),c=i(89724);let e=(()=>{class p{constructor(T,C){this.templateRef=T,this.viewContainer=C}set cdFormLoading(T){let C;switch(this.viewContainer.clear(),T){case f.Q.Loading:C=this.resolveNgContent("Loading form data..."),this.viewContainer.createComponent(a.b,{projectableNodes:C});break;case f.Q.Ready:this.viewContainer.createEmbeddedView(this.templateRef);break;case f.Q.Error:C=this.resolveNgContent("Form data could not be loaded."),this.viewContainer.createComponent(r.G,{projectableNodes:C}).instance.type="error"}}resolveNgContent(T){return[[document.createTextNode(T)]]}}return p.\u0275fac=function(T){return new(T||p)(c.Y36(c.Rgc),c.Y36(c.s_b))},p.\u0275dir=c.lG2({type:p,selectors:[["","cdFormLoading",""]],inputs:{cdFormLoading:"cdFormLoading"}}),p})()},84333:(m,S,i)=>{"use strict";i.d(S,{T:()=>a});var r=i(89724);let a=(()=>{class f{}return f.\u0275fac=function(e){return new(e||f)},f.\u0275dir=r.lG2({type:f,selectors:[["","cdFormScope",""]],inputs:{cdFormScope:"cdFormScope"}}),f})()},94276:(m,S,i)=>{"use strict";i.d(S,{b:()=>c});var r=i(89724),a=i(1659);let c=(()=>{class e{constructor(y){this.parent=y}get validClass(){return!!this.control&&this.control.valid&&(this.control.touched||this.control.dirty)}get invalidClass(){return!!this.control&&this.control.invalid&&this.control.touched&&this.control.dirty}get path(){return function f(e,p){return[...p.path,e]}(this.formControlName,this.parent)}get control(){return this.formDirective&&this.formDirective.getControl(this)}get formDirective(){return this.parent?this.parent.formDirective:null}}return e.\u0275fac=function(y){return new(y||e)(r.Y36(a.gN,13))},e.\u0275dir=r.lG2({type:e,selectors:[["",8,"form-control"],["",8,"form-check-input"],["",8,"custom-control-input"]],hostVars:4,hostBindings:function(y,T){2&y&&r.ekj("is-valid",T.validClass)("is-invalid",T.invalidClass)},inputs:{formControlName:"formControlName",formControl:"formControl"}}),e})()},56310:(m,S,i)=>{"use strict";i.d(S,{P:()=>f});var r=i(1659),a=i(89724);let f=(()=>{class c{constructor(p){this.elRef=p,this.validationDisabled=!1}get hasErrors(){return this.formControlNames.some(p=>!p.valid&&p.dirty&&p.touched)&&!this.validationDisabled}get hasSuccess(){return!this.formControlNames.some(p=>!p.valid)&&this.formControlNames.some(p=>p.dirty&&p.touched)&&!this.validationDisabled}get label(){const p=this.elRef.nativeElement.querySelector("label");return p&&p.textContent?p.textContent.trim():"This field"}get isDirtyAndTouched(){return this.formControlNames.some(p=>p.dirty&&p.touched)}}return c.\u0275fac=function(p){return new(p||c)(a.Y36(a.SBq))},c.\u0275dir=a.lG2({type:c,selectors:[["",8,"form-group"]],contentQueries:function(p,y,T){if(1&p&&a.Suo(T,r.u,4),2&p){let C;a.iGM(C=a.CRH())&&(y.formControlNames=C)}},hostVars:4,hostBindings:function(p,y){2&p&&a.ekj("has-error",y.hasErrors)("has-success",y.hasSuccess)},inputs:{validationDisabled:"validationDisabled"}}),c})()},41582:(m,S,i)=>{"use strict";i.d(S,{V:()=>f});var r=i(89724),a=i(1659);let f=(()=>{class c{constructor(){this.validSubmit=new r.vpe}onSubmit(){this.markAsTouchedAndDirty(this.formGroup),this.formGroup.valid&&this.validSubmit.emit(this.formGroup.value)}markAsTouchedAndDirty(p){p instanceof a.cw?Object.keys(p.controls).forEach(y=>this.markAsTouchedAndDirty(p.controls[y])):p instanceof a.Oe?p.controls.forEach(y=>this.markAsTouchedAndDirty(y)):p instanceof a.NI&&p.enabled&&(p.markAsDirty(),p.markAsTouched(),p.updateValueAndValidity())}}return c.\u0275fac=function(p){return new(p||c)},c.\u0275dir=r.lG2({type:c,selectors:[["","formGroup",""]],hostBindings:function(p,y){1&p&&r.NdJ("submit",function(){return y.onSubmit()})},inputs:{formGroup:"formGroup"},outputs:{validSubmit:"validSubmit"}}),c})()},4416:(m,S,i)=>{"use strict";i.d(S,{C:()=>a});var r=i(89724);let a=(()=>{class f{constructor(e,p){this.elementRef=e,this.renderer=p}ngOnInit(){this.renderer.setAttribute(this.elementRef.nativeElement,"tabindex","-1"),this.iElement=this.renderer.createElement("i"),this.renderer.addClass(this.iElement,"fa"),this.renderer.appendChild(this.elementRef.nativeElement,this.iElement),this.update()}getInputElement(){return document.getElementById(this.cdPasswordButton)}update(){const e=this.getInputElement();e&&"text"===e.type?(this.renderer.removeClass(this.iElement,"fa-eye"),this.renderer.addClass(this.iElement,"fa-eye-slash")):(this.renderer.removeClass(this.iElement,"fa-eye-slash"),this.renderer.addClass(this.iElement,"fa-eye"))}onClick(){const e=this.getInputElement();e.type="password"===e.type?"text":"password",this.update()}}return f.\u0275fac=function(e){return new(e||f)(r.Y36(r.SBq),r.Y36(r.Qsj))},f.\u0275dir=r.lG2({type:f,selectors:[["","cdPasswordButton",""]],hostBindings:function(e,p){1&e&&r.NdJ("click",function(){return p.onClick()})},inputs:{cdPasswordButton:"cdPasswordButton"}}),f})()},59376:(m,S,i)=>{"use strict";i.d(S,{m:()=>f});var r=i(89724),a=i(71334);let f=(()=>{class c{constructor(p){this.nav=p,this.localStorage=window.localStorage}ngOnInit(){const p=this.localStorage.getItem(`tabset_${this.cdStatefulTab}`);p&&this.nav.select(p)}onNavChange(p){this.cdStatefulTab&&p.nextId&&this.localStorage.setItem(`tabset_${this.cdStatefulTab}`,p.nextId)}}return c.\u0275fac=function(p){return new(p||c)(r.Y36(a.Pz,9))},c.\u0275dir=r.lG2({type:c,selectors:[["","cdStatefulTab",""]],hostBindings:function(p,y){1&p&&r.NdJ("navChange",function(C){return y.onNavChange(C)})},inputs:{cdStatefulTab:"cdStatefulTab"}}),c})()},99466:(m,S,i)=>{"use strict";i.d(S,{e:()=>r});var r=(()=>{return(a=r||(r={})).bold="bold",a.sparkline="sparkline",a.perSecond="perSecond",a.checkIcon="checkIcon",a.routerLink="routerLink",a.executing="executing",a.classAdding="classAdding",a.badge="badge",a.map="map",a.truncate="truncate",a.timeAgo="timeAgo",r;var a})()},65862:(m,S,i)=>{"use strict";i.d(S,{P:()=>r});var r=(()=>{return(a=r||(r={})).add="fa fa-plus",a.addCircle="fa fa-plus-circle",a.minusCircle="fa fa-minus-circle",a.edit="fa fa-pencil",a.destroy="fa fa-times",a.destroyCircle="fa fa-times-circle",a.exchange="fa fa-exchange",a.copy="fa fa-copy",a.clipboard="fa fa-clipboard",a.flatten="fa fa-chain-broken",a.trash="fa fa-trash-o",a.lock="fa fa-lock",a.unlock="fa fa-unlock",a.clone="fa fa-clone",a.undo="fa fa-undo",a.search="fa fa-search",a.start="fa fa-play",a.stop="fa fa-stop",a.analyse="fa fa-stethoscope",a.deepCheck="fa fa-cog",a.reweight="fa fa-balance-scale",a.left="fa fa-arrow-left",a.right="fa fa-arrow-right",a.down="fa fa-arrow-down",a.erase="fa fa-eraser",a.user="fa fa-user",a.users="fa fa-users",a.share="fa fa-share-alt",a.key="fa fa-key-modern",a.warning="fa fa-exclamation-triangle",a.info="fa fa-info",a.infoCircle="fa fa-info-circle",a.questionCircle="fa fa-question-circle-o",a.check="fa fa-check",a.show="fa fa-eye",a.paragraph="fa fa-paragraph",a.terminal="fa fa-terminal",a.magic="fa fa-magic",a.hourglass="fa fa-hourglass-o",a.filledHourglass="fa fa-hourglass",a.table="fa fa-table",a.spinner="fa fa-spinner",a.refresh="fa fa-refresh",a.bullseye="fa fa-bullseye",a.disk="fa fa-hdd-o",a.server="fa fa-server",a.filter="fa fa-filter",a.lineChart="fa fa-line-chart",a.signOut="fa fa-sign-out",a.health="fa fa-heartbeat",a.circle="fa fa-circle",a.bell="fa fa-bell",a.mute="fa fa-bell-slash",a.tag="fa fa-tag",a.leftArrow="fa fa-angle-left",a.rightArrow="fa fa-angle-right",a.leftArrowDouble="fa fa-angle-double-left",a.rightArrowDouble="fa fa-angle-double-right",a.flag="fa fa-flag",a.clearFilters="fa fa-window-close",a.download="fa fa-download",a.upload="fa fa-upload",a.close="fa fa-times",a.json="fa fa-file-code-o",a.text="fa fa-file-text",a.wrench="fa fa-wrench",a.enter="fa fa-sign-in",a.exit="fa fa-sign-out",a.restart="fa fa-history",a.deploy="fa fa-cube",a.large="fa fa-lg",a.large2x="fa fa-2x",a.large3x="fa fa-3x",a.stack="fa fa-stack",a.stack1x="fa fa-stack-1x",a.stack2x="fa fa-stack-2x",a.pulse="fa fa-pulse",a.spin="fa fa-spin",a.inverse="fa fa-inverse",r;var a})()},18001:(m,S,i)=>{"use strict";i.d(S,{k:()=>r});var r=(()=>{return(a=r||(r={}))[a.error=0]="error",a[a.info=1]="info",a[a.success=2]="success",r;var a})()},91801:(m,S,i)=>{"use strict";i.d(S,{T:()=>r});var r=(()=>{return(a=r||(r={}))[a.ValueOk=0]="ValueOk",a[a.ValueStale=1]="ValueStale",a[a.ValueNone=2]="ValueNone",a[a.ValueException=3]="ValueException",r;var a})()},62862:(m,S,i)=>{"use strict";i.d(S,{O:()=>c});var r=i(1659),a=i(95463),f=i(89724);let c=(()=>{class e extends r.qu{group(y,T=null){const C=super.group(y,T);return new a.d(C.controls,C.validator,C.asyncValidator)}}return e.\u0275fac=function(){let p;return function(T){return(p||(p=f.n5z(e)))(T||e)}}(),e.\u0275prov=f.Yz7({token:e,factory:e.\u0275fac,providedIn:"root"}),e})()},95463:(m,S,i)=>{"use strict";i.d(S,{d:()=>a});var r=i(1659);class a extends r.cw{constructor(c,e,p){super(c,e,p),this.controls=c}get(c){const e=this._get(c);if(!e)throw new Error(`Control '${c}' could not be found!`);return e}_get(c){return super.get(c)||Object.values(this.controls).filter(e=>e.get).map(e=>e instanceof a?e._get(c):e.get(c)).find(e=>Boolean(e))}getValue(c){return this.get(c).value}silentSet(c,e){this.get(c).setValue(e,{emitEvent:!1})}showError(c,e,p){const y=this.get(c);return(e.submitted||y.dirty)&&(p?y.hasError(p):y.invalid)}}},93614:(m,S,i)=>{"use strict";i.d(S,{E:()=>a,Q:()=>r});var r=(()=>{return(f=r||(r={}))[f.Loading=0]="Loading",f[f.Ready=1]="Ready",f[f.Error=2]="Error",f[f.None=3]="None",r;var f})();class a{constructor(){this.loading=r.Loading}loadingStart(){this.loading=r.Loading}loadingReady(){this.loading=r.Ready}loadingError(){this.loading=r.Error}loadingNone(){this.loading=r.None}}},90070:(m,S,i)=>{"use strict";i.d(S,{h:()=>W,P:()=>z});var r=i(1659),a=i(23815),f=i.n(a),c=i(25917),e=i(46797),p=i(43190);function y(J,ee){return ee?(0,p.w)(()=>J,ee):(0,p.w)(()=>J)}var T=i(88002),C=i(15257),R=i(47557),L=i(28211);function z(J){return null==J||0===J.length}class W{static email(ee){return z(ee.value)?null:r.kI.email(ee)}static ip(ee=0){const ce=/^((25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$/i,ie=/^(?:[a-f0-9]{1,4}:){7}[a-f0-9]{1,4}$/i;return r.kI.pattern(4===ee?ce:6===ee?ie:new RegExp(ce.source+"|"+ie.source))}static number(ee=!0){return r.kI.pattern(ee?/^-?[0-9]+$/i:/^[0-9]+$/i)}static decimalNumber(ee=!0){return r.kI.pattern(ee?/^-?[0-9]+(.[0-9]+)?$/i:/^[0-9]+(.[0-9]+)?$/i)}static sslCert(){return r.kI.pattern(/^-----BEGIN CERTIFICATE-----(\n|\r|\f)((.+)?((\n|\r|\f).+)*)(\n|\r|\f)-----END CERTIFICATE-----[\n\r\f]*$/)}static sslPrivKey(){return r.kI.pattern(/^-----BEGIN RSA PRIVATE KEY-----(\n|\r|\f)((.+)?((\n|\r|\f).+)*)(\n|\r|\f)-----END RSA PRIVATE KEY-----[\n\r\f]*$/)}static pemCert(){return r.kI.pattern(/^-----BEGIN .+-----$.+^-----END .+-----$/ms)}static requiredIf(ee,ce){let ie=!1;return U=>(!ie&&U.parent&&(Object.keys(ee).forEach(ge=>{U.parent.get(ge).valueChanges.subscribe(()=>{U.updateValueAndValidity({emitEvent:!1})})}),ie=!0),Object.keys(ee).every(ge=>{if(!U.parent)return!1;const ae=U.parent.get(ge).value,he=ee[ge];if(f().isObjectLike(he)){let be=!1;switch(he.op){case"empty":be=f().isEmpty(ae);break;case"!empty":be=!f().isEmpty(ae);break;case"equal":be=ae===he.arg1;break;case"!equal":be=ae!==he.arg1;break;case"minLength":f().isString(ae)&&(be=ae.length>=he.arg1)}return be}return ae===he})&&(f().isFunction(ce)?ce.call(ce,U.value):z(U.value))?{required:!0}:null)}static composeIf(ee,ce){let ie=!1;return U=>(!ie&&U.parent&&(Object.keys(ee).forEach(se=>{U.parent.get(se).valueChanges.subscribe(()=>{U.updateValueAndValidity({emitEvent:!1})})}),ie=!0),Object.keys(ee).every(se=>U.parent&&U.parent.get(se).value===ee[se])?r.kI.compose(ce)(U):null)}static custom(ee,ce){return ie=>{const U=ce.call(this,ie.value);return U?{[ee]:U}:null}}static validateIf(ee,ce,ie,U=[],se=[]){ie=ie.concat(U),ee.setValidators(ge=>ce.call(this)?r.kI.compose(ie)(ge):U.length>0?r.kI.compose(U)(ge):null),se.forEach(ge=>{ge.valueChanges.subscribe(()=>{ee.updateValueAndValidity({emitEvent:!1})})})}static match(ee,ce){return ie=>{const U=ie.get(ee),se=ie.get(ce);if(!U||!se)return null;if(U.value!==se.value)se.setErrors({match:!0});else if(se.hasError("match")){const ae=se.errors;f().unset(ae,"match"),se.setErrors(f().isEmpty(f().keys(ae))?null:ae)}return null}}static unique(ee,ce=null,ie,U=!1){let se;return ge=>ge.pristine||z(ge.value)?(0,c.of)(null):(se=ge.value,f().isFunction(ie)&&null!==ie()&&""!==ie()&&(se=U?`${ge.value}$${ie()}`:`${ie()}$${ge.value}`),(0,e.H)().pipe(y(ee.call(ce,se)),(0,T.U)(ae=>ae?{notUnique:!0}:null),(0,C.q)(1)))}static uuid(ee=!1){const ce=/^[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i;return ie=>ie.pristine&&ie.untouched||!ee&&!ie.value||ce.test(ie.value)?null:{invalidUuid:"This is not a valid UUID"}}static binaryMin(ee){return ce=>{const ie=new L.H,U=(new L.H).toBytes(ce.value);if(ee<=U)return null;const se=new R.$(ie).transform(ee);return{binaryMin:()=>"Size has to be at least " + se + " or more"}}}static binaryMax(ee){return ce=>{const ie=new L.H,U=ie.toBytes(ce.value);if(ee>=U)return null;const se=new R.$(ie).transform(ee);return{binaryMax:()=>"Size has to be at most " + se + " or less"}}}static passwordPolicy(ee,ce,ie){return U=>{if(U.pristine||""===U.value)return f().isFunction(ie)&&ie(!0,0),(0,c.of)(null);let se;return f().isFunction(ce)&&(se=ce()),(0,e.H)(500).pipe(y(f().invoke(ee,"validatePassword",U.value,se)),(0,T.U)(ge=>(f().isFunction(ie)&&ie(ge.valid,ge.credits,ge.valuation),ge.valid?null:{passwordPolicy:!0})),(0,C.q)(1))}}static bucketName(){return ee=>{if(ee.pristine||!ee.value)return(0,c.of)({required:!0});const ce=[];let ie;return ce.push(()=>{const ge=ee.value;let ae=!0;return(/^((25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$/i.test(ge)||/^(?:[a-f0-9]{1,4}:){7}[a-f0-9]{1,4}$/i.test(ge))&&(ie="ipAddress",ae=!1),ae}),ce.push(U=>f().inRange(U.length,3,64)?!!/^[0-9a-z.-]+$/.test(ee.value)||(ie="bucketNameInvalid",!1):(ie="shouldBeInRange",!1)),ce.push(U=>{const se=f().split(U,".");return f().every(se,ge=>ge!==f().toLower(ge)||ge.includes("_")?(ie="containsUpperCase",!1):/^[0-9a-z-]+$/.test(ge)?f().every([0,ge.length-1],ae=>(ie="lowerCaseOrNumber",/[a-z]/.test(ge[ae])||f().isInteger(f().parseInt(ge[ae])))):(ie="onlyLowerCaseAndNumbers",!1))}),f().every(ce,U=>U(ee.value))?(0,c.of)(null):(0,c.of)((()=>{switch(ie){case"onlyLowerCaseAndNumbers":return{onlyLowerCaseAndNumbers:!0};case"shouldBeInRange":return{shouldBeInRange:!0};case"ipAddress":return{ipAddress:!0};case"containsUpperCase":return{containsUpperCase:!0};case"lowerCaseOrNumber":return{lowerCaseOrNumber:!0};default:return{bucketNameInvalid:!0}}})())}}static bucketExistence(ee,ce){return ie=>ie.pristine||!ie.value?(0,c.of)({required:!0}):ce.exists(ie.value).pipe((0,T.U)(U=>U===ee?null:{bucketNameNotAllowed:!0}))}}},61355:(m,S,i)=>{"use strict";i.d(S,{T:()=>f,e:()=>c});var r=i(65862),a=i(18001);class f{constructor(p=a.k.info,y,T,C,R="Ceph"){this.type=p,this.title=y,this.message=T,this.options=C,this.application=R,this.isFinishedTask=!1,this.classes={Ceph:"ceph-icon",Prometheus:"prometheus-icon"},this.applicationClass=this.classes[this.application]}}class c extends f{constructor(p=new f){super(p.type,p.title,p.message,p.options,p.application),this.config=p,this.alertSilenced=!1,this.textClasses=["text-danger","text-info","text-success"],this.iconClasses=[r.P.warning,r.P.info,r.P.check],this.borderClasses=["border-danger","border-info","border-success"],delete this.config,this.timestamp=(new Date).toJSON(),this.iconClass=this.iconClasses[this.type],this.textClass=this.textClasses[this.type],this.borderClass=this.borderClasses[this.type],this.isFinishedTask=p.isFinishedTask}}},51907:(m,S,i)=>{"use strict";i.d(S,{G:()=>r});class r{constructor(f){this.pwdExpirationSpan=0,this.pwdExpirationSpan=f.user_pwd_expiration_span,this.pwdExpirationWarning1=f.user_pwd_expiration_warning_1,this.pwdExpirationWarning2=f.user_pwd_expiration_warning_2}}},48168:(m,S,i)=>{"use strict";i.d(S,{E:()=>c});var r=i(19725);class f{constructor(){this.offset=0,this.limit=10,this.pageSize=10}}class c{constructor(p){this.errorConfig={resetData:!0,displayError:!0},this.pageInfo=new f,this.search="",this.sort="+name",this.error=p}toParams(){return Number.isNaN(this.pageInfo.offset)&&(this.pageInfo.offset=0),null===this.pageInfo.limit&&(this.pageInfo.limit=0),this.search||(this.search=""),(!this.sort||this.sort.length<2)&&(this.sort="+name"),new r.LE({fromObject:{offset:String(this.pageInfo.offset*this.pageInfo.limit),limit:String(this.pageInfo.limit),search:this.search,sort:this.sort}})}}},68774:(m,S,i)=>{"use strict";i.d(S,{r:()=>r});class r{constructor(f){this._selected=[],f&&(this._selected=f),this.update()}update(){this.hasSelection=this._selected.length>0,this.hasSingleSelection=1===this._selected.length,this.hasMultiSelection=this._selected.length>1}set selected(f){this._selected=f,this.update()}get selected(){return this._selected}add(f){this._selected.push(f),this.update()}first(){return this.hasSelection?this._selected[0]:null}}},87311:(m,S,i)=>{"use strict";i.d(S,{h:()=>r});class r{constructor(f,c,e,p){this.customColors={backgroundColor:void 0,borderColor:void 0},this.checkOffset=!1,this.chartEl=f.nativeElement,this.getStyleLeft=e,this.getStyleTop=p,this.tooltipEl=c.nativeElement}customTooltips(f){if(0===f.opacity)return void(this.tooltipEl.style.opacity=0);if(this.tooltipEl.classList.remove("above","below","no-transform"),this.tooltipEl.classList.add(f.yAlign?f.yAlign:"no-transform"),f.body){const p=f.title||[],y=f.body.map(R=>R.lines);let T="<thead>";p.forEach(R=>{T+="<tr><th>"+this.getTitle(R)+"</th></tr>"}),T+="</thead><tbody>",y.forEach((R,L)=>{const z=f.labelColors[L];let W="background:"+(this.customColors.backgroundColor||z.backgroundColor);W+="; border-color:"+(this.customColors.borderColor||z.borderColor),W+="; border-width: 2px",T+='<tr><td nowrap><span class="chartjs-tooltip-key" style="'+W+'"></span>'+this.getBody(R)+"</td></tr>"}),T+="</tbody>",this.tooltipEl.querySelector("table").innerHTML=T}const c=this.chartEl.offsetTop,e=this.chartEl.offsetLeft;if(this.checkOffset){const p=f.width/2;this.tooltipEl.classList.remove("transform-left"),this.tooltipEl.classList.remove("transform-right"),f.caretX-p<0?this.tooltipEl.classList.add("transform-left"):f.caretX+p>this.chartEl.width&&this.tooltipEl.classList.add("transform-right")}this.tooltipEl.style.left=this.getStyleLeft(f,e),this.tooltipEl.style.top=this.getStyleTop(f,c),this.tooltipEl.style.opacity=1,this.tooltipEl.style.fontFamily=f._fontFamily,this.tooltipEl.style.fontSize=f.fontSize,this.tooltipEl.style.fontStyle=f._fontStyle,this.tooltipEl.style.padding=f.yPadding+"px "+f.xPadding+"px"}getBody(f){return f}getTitle(f){return f}}},30633:(m,S,i)=>{"use strict";i.d(S,{h:()=>r,r:()=>a});var r=(()=>{return(f=r||(r={}))[f.global=0]="global",f[f.pool=1]="pool",f[f.image=2]="image",r;var f})(),a=(()=>{return(f=a||(a={}))[f.bps=0]="bps",f[f.iops=1]="iops",f[f.milliseconds=2]="milliseconds",a;var f})()},60737:(m,S,i)=>{"use strict";i.d(S,{o:()=>a});var r=i(29075);class a extends r.i{}},76111:(m,S,i)=>{"use strict";i.d(S,{R:()=>a});var r=i(29075);class a extends r.i{}},19358:(m,S,i)=>{"use strict";i.d(S,{N:()=>r});class r{constructor(f,c,e){this.poolName=f,this.namespace=c,this.imageName=e}static fromString(f){const c=f.split("/");return new this(c[0],c.length>=3?c[1]:null,c.length>=3?c[2]:c[1])}getNameSpace(){return this.namespace?`${this.namespace}/`:""}toString(){return`${this.poolName}/${this.getNameSpace()}${this.imageName}`}toStringEncoded(){return encodeURIComponent(`${this.poolName}/${this.getNameSpace()}${this.imageName}`)}}},29075:(m,S,i)=>{"use strict";i.d(S,{i:()=>r});class r{constructor(f,c){this.name=f,this.metadata=c}}},47187:(m,S,i)=>{"use strict";i.d(S,{I:()=>c});var r=i(23815),a=i.n(r),f=i(89724);let c=(()=>{class e{transform(y,T=!1){let C=y;return(!a().isArray(y)||a().isArray(y)&&T)&&(C=[y]),C}}return e.\u0275fac=function(y){return new(y||e)},e.\u0275pipe=f.Yjl({name:"array",type:e,pure:!0}),e})()},68962:(m,S,i)=>{"use strict";i.d(S,{T:()=>a});var r=i(89724);let a=(()=>{class f{transform(e,p="Yes",y="No"){return Boolean(e)?p:y}}return f.\u0275fac=function(e){return new(e||f)},f.\u0275pipe=r.Yjl({name:"booleanText",type:f,pure:!0}),f})()},70442:(m,S,i)=>{"use strict";i.d(S,{i:()=>a});var r=i(89724);let a=(()=>{class f{transform(e){let p=!1;switch(e){case!0:case 1:case"y":case"yes":case"t":case"true":case"on":case"1":p=!0}return p}}return f.\u0275fac=function(e){return new(e||f)},f.\u0275pipe=r.Yjl({name:"boolean",type:f,pure:!0}),f})()},96102:(m,S,i)=>{"use strict";i.d(S,{N:()=>f});var r=i(89724),a=i(11048);let f=(()=>{class c{constructor(p){this.datePipe=p}transform(p){return null===p||""===p?"":this.datePipe.transform(p,"shortDate")+" "+this.datePipe.transform(p,"mediumTime")}}return c.\u0275fac=function(p){return new(p||c)(r.Y36(a.uU,16))},c.\u0275pipe=r.Yjl({name:"cdDate",type:c,pure:!0}),c})()},24310:(m,S,i)=>{"use strict";i.d(S,{t:()=>a});var r=i(89724);let a=(()=>{class f{transform(e){const p=/ceph version\s+[^ ]+\s+\(.+\)\s+(.+)\s+\((.+)\)/.exec(e);return p?"dev"===p[2]?"main":p[1]:e}}return f.\u0275fac=function(e){return new(e||f)},f.\u0275pipe=r.Yjl({name:"cephReleaseName",type:f,pure:!0}),f})()},58111:(m,S,i)=>{"use strict";i.d(S,{F:()=>a});var r=i(89724);let a=(()=>{class f{transform(e){const p=/ceph version\s+([^ ]+)\s+\(.+\)/.exec(e);return p?p[1]:e}}return f.\u0275fac=function(e){return new(e||f)},f.\u0275pipe=r.Yjl({name:"cephShortVersion",type:f,pure:!0}),f})()},20044:(m,S,i)=>{"use strict";i.d(S,{O:()=>f});var r=i(28211),a=i(89724);let f=(()=>{class c{constructor(p){this.formatter=p}transform(p){return this.formatter.format_number(p,1024,["B/s","kB/s","MB/s","GB/s","TB/s","PB/s","EB/s","ZB/s","YB/s"])}}return c.\u0275fac=function(p){return new(p||c)(a.Y36(r.H,16))},c.\u0275pipe=a.Yjl({name:"dimlessBinaryPerSecond",type:c,pure:!0}),c})()},47557:(m,S,i)=>{"use strict";i.d(S,{$:()=>f});var r=i(28211),a=i(89724);let f=(()=>{class c{constructor(p){this.formatter=p}transform(p){return this.formatter.format_number(p,1024,["B","KiB","MiB","GiB","TiB","PiB","EiB","ZiB","YiB"])}}return c.\u0275fac=function(p){return new(p||c)(a.Y36(r.H,16))},c.\u0275pipe=a.Yjl({name:"dimlessBinary",type:c,pure:!0}),c})()},66369:(m,S,i)=>{"use strict";i.d(S,{n:()=>f});var r=i(28211),a=i(89724);let f=(()=>{class c{constructor(p){this.formatter=p}transform(p){return this.formatter.format_number(p,1e3,["","k","M","G","T","P","E","Z","Y"])}}return c.\u0275fac=function(p){return new(p||c)(a.Y36(r.H,16))},c.\u0275pipe=a.Yjl({name:"dimless",type:c,pure:!0}),c})()},94088:(m,S,i)=>{"use strict";i.d(S,{u:()=>a});var r=i(89724);let a=(()=>{class f{transform(e){if(null===e||e<=0)return"";const p=[[`${Math.floor(e/31536e3)}`,"years"],[`${Math.floor(e%31536e3/86400)}`,"days"],[`${Math.floor(e%86400/3600)}`,"hours"],[`${Math.floor(e%3600/60)}`,"minutes"],[`${Math.floor(e%60)}`,"seconds"]];let y="";for(let T=0,C=p.length;T<C;T++)"0"!==p[T][0]&&(y+=" "+p[T][0]+" "+("1"===p[T][0]?p[T][1].substr(0,p[T][1].length-1):p[T][1]));return y.trim()||"1 second"}}return f.\u0275fac=function(e){return new(e||f)},f.\u0275pipe=r.Yjl({name:"duration",type:f,pure:!1}),f})()},41039:(m,S,i)=>{"use strict";i.d(S,{W:()=>c});var r=i(23815),a=i.n(r),f=i(89724);let c=(()=>{class e{transform(y){return a().isUndefined(y)||a().isNull(y)?"-":a().isNaN(y)?"N/A":y}}return e.\u0275fac=function(y){return new(y||e)},e.\u0275pipe=f.Yjl({name:"empty",type:e,pure:!0}),e})()},21766:(m,S,i)=>{"use strict";i.d(S,{A:()=>a});var r=i(89724);let a=(()=>{class f{transform(e){return`${e} IOPS`}}return f.\u0275fac=function(e){return new(e||f)},f.\u0275pipe=r.Yjl({name:"iops",type:f,pure:!0}),f})()},88820:(m,S,i)=>{"use strict";i.d(S,{V:()=>a});var r=i(89724);let a=(()=>{class f{transform(e){return"user:rbd"===e?"user:rbd (tcmu-runner)":e}}return f.\u0275fac=function(e){return new(e||f)},f.\u0275pipe=r.Yjl({name:"iscsiBackstore",type:f,pure:!0}),f})()},86969:(m,S,i)=>{"use strict";i.d(S,{A:()=>a});var r=i(89724);let a=(()=>{class f{transform(e){return e.join(", ")}}return f.\u0275fac=function(e){return new(e||f)},f.\u0275pipe=r.Yjl({name:"join",type:f,pure:!0}),f})()},42746:(m,S,i)=>{"use strict";i.d(S,{e:()=>a});var r=i(89724);let a=(()=>{class f{transform(e){return"[DBG]"===e?"debug":"[INF]"===e?"info":"[WRN]"===e?"warn":"[ERR]"===e?"err":""}}return f.\u0275fac=function(e){return new(e||f)},f.\u0275pipe=r.Yjl({name:"logPriority",type:f,pure:!0}),f})()},78877:(m,S,i)=>{"use strict";i.d(S,{b:()=>c});var r=i(23815),a=i.n(r),f=i(89724);let c=(()=>{class e{transform(y,T){return a().isPlainObject(T)?a().get(T,y,y):y}}return e.\u0275fac=function(y){return new(y||e)},e.\u0275pipe=f.Yjl({name:"map",type:e,pure:!0}),e})()},48537:(m,S,i)=>{"use strict";i.d(S,{J:()=>a});var r=i(89724);let a=(()=>{class f{transform(e){return`${e} ms`}}return f.\u0275fac=function(e){return new(e||f)},f.\u0275pipe=r.Yjl({name:"milliseconds",type:f,pure:!0}),f})()},55657:(m,S,i)=>{"use strict";i.d(S,{g:()=>c});var r=i(23815),a=i.n(r),f=i(89724);let c=(()=>{class e{transform(y,T){return""===y?a().defaultTo(T,"n/a"):y}}return e.\u0275fac=function(y){return new(y||e)},e.\u0275pipe=f.Yjl({name:"notAvailable",type:e,pure:!0}),e})()},36569:(m,S,i)=>{"use strict";i.d(S,{f:()=>a});var r=i(89724);let a=(()=>{class f{transform(e){const p=parseInt(e,10);return isNaN(p)?e:e+(1===Math.floor(p/10)?"th":p%10==1?"st":p%10==2?"nd":p%10==3?"rd":"th")}}return f.\u0275fac=function(e){return new(e||f)},f.\u0275pipe=r.Yjl({name:"ordinal",type:f,pure:!0}),f})()},12455:(m,S,i)=>{"use strict";i.d(S,{D:()=>We});var r=i(11048),a=i(47187),f=i(68962),c=i(70442),e=i(96102),p=i(24310),y=i(58111),T=i(20044),C=i(47557),R=i(66369),L=i(94088),z=i(41039),W=i(89724);let J=(()=>{class Ve{transform(xe){return encodeURIComponent(xe)}}return Ve.\u0275fac=function(xe){return new(xe||Ve)},Ve.\u0275pipe=W.Yjl({name:"encodeUri",type:Ve,pure:!0}),Ve})();var ee=i(21766),ce=i(88820),ie=i(86969),U=i(42746),se=i(78877),ge=i(48537),ae=i(55657),he=i(36569),be=i(90068),we=i(60793),ue=i(52821),st=i(10545);let We=(()=>{class Ve{}return Ve.\u0275fac=function(xe){return new(xe||Ve)},Ve.\u0275mod=W.oAB({type:Ve}),Ve.\u0275inj=W.cJS({providers:[a.I,c.i,f.T,r.uU,y.F,p.t,C.$,T.O,R.n,be.h,ce.V,ie.A,U.e,e.N,z.W,J,he.f,ee.A,ge.J,ae.g,st.m,L.u,se.b,ue.W,we.A],imports:[[r.ez]]}),Ve})()},90068:(m,S,i)=>{"use strict";i.d(S,{h:()=>p});var r=i(23815),a=i.n(r),f=i(16738),c=i.n(f),e=i(89724);c().updateLocale("en",{relativeTime:{future:"in %s",past:"%s ago",s:"a few seconds",ss:"%d seconds",m:"a minute",mm:"%d minutes",h:"an hour",hh:"%d hours",d:"a day",dd:"%d days",w:"a week",ww:"%d weeks",M:"a month",MM:"%d months",y:"a year",yy:"%d years"}});let p=(()=>{class y{transform(C,R=!0){let L;if(L=a().isNumber(C)?c().unix(C):c()(C),!L.isValid())return"";let z=L.fromNow();return R&&(z=a().upperFirst(z)),z}}return y.\u0275fac=function(C){return new(C||y)},y.\u0275pipe=e.Yjl({name:"relativeDate",type:y,pure:!1}),y})()},60793:(m,S,i)=>{"use strict";i.d(S,{A:()=>f});var r=i(89724),a=i(14800);let f=(()=>{class c{constructor(p){this.domSanitizer=p}transform(p){return this.domSanitizer.sanitize(r.q3G.HTML,p)}}return c.\u0275fac=function(p){return new(p||c)(r.Y36(a.H7,16))},c.\u0275pipe=r.Yjl({name:"sanitizeHtml",type:c,pure:!0}),c})()},52821:(m,S,i)=>{"use strict";i.d(S,{W:()=>c});var r=i(23815),a=i.n(r),f=i(89724);let c=(()=>{class e{transform(y,T,C){return a().isString(y)?(C=a().defaultTo(C,""),a().truncate(y,{length:T,omission:C})):y}}return e.\u0275fac=function(y){return new(y||e)},e.\u0275pipe=f.Yjl({name:"truncate",type:e,pure:!0}),e})()},10545:(m,S,i)=>{"use strict";i.d(S,{m:()=>c});var r=i(23815),a=i.n(r),f=i(89724);let c=(()=>{class e{transform(y){return a().upperFirst(y)}}return e.\u0275fac=function(y){return new(y||e)},e.\u0275pipe=f.Yjl({name:"upperFirst",type:e,pure:!0}),e})()},2817:(m,S,i)=>{"use strict";function r(ee,ce){function ie(){return!ie.pred.apply(ie.thisArg,arguments)}return ie.pred=ee,ie.thisArg=ce,ie}i.d(S,{r:()=>J});var a=i(19846),f=i(45435),c=i(70882),p=i(22759),y=i(79765),T=i(85345);class R{constructor(ce){this.notifier=ce}call(ce,ie){return ie.subscribe(new L(ce,this.notifier,ie))}}class L extends T.Ds{constructor(ce,ie,U){super(ce),this.notifier=ie,this.source=U,this.sourceIsBeingSubscribedTo=!0}notifyNext(){this.sourceIsBeingSubscribedTo=!0,this.source.subscribe(this)}notifyComplete(){if(!1===this.sourceIsBeingSubscribedTo)return super.complete()}complete(){if(this.sourceIsBeingSubscribedTo=!1,!this.isStopped){if(this.retries||this.subscribeToRetries(),!this.retriesSubscription||this.retriesSubscription.closed)return super.complete();this._unsubscribeAndRecycle(),this.notifications.next(void 0)}}_unsubscribe(){const{notifications:ce,retriesSubscription:ie}=this;ce&&(ce.unsubscribe(),this.notifications=void 0),ie&&(ie.unsubscribe(),this.retriesSubscription=void 0),this.retries=void 0}_unsubscribeAndRecycle(){const{_unsubscribe:ce}=this;return this._unsubscribe=null,super._unsubscribeAndRecycle(),this._unsubscribe=ce,this}subscribeToRetries(){let ce;this.notifications=new y.xQ;try{const{notifier:ie}=this;ce=ie(this.notifications)}catch(ie){return super.complete()}this.retries=ce,this.retriesSubscription=(0,T.ft)(ce,new T.IY(this))}}var z=i(47349),W=i(46782);function J(){const ee=(0,p.R)(document,"visibilitychange").pipe((0,z.d)({refCount:!0,bufferSize:1})),[ce,ie]=function e(ee,ce,ie){return[(0,f.h)(ce,ie)(new c.y((0,a.s)(ee))),(0,f.h)(r(ce,ie))(new c.y((0,a.s)(ee)))]}(ee,()=>"visible"===document.visibilityState);return function(U){return U.pipe((0,W.R)(ie),function C(ee){return ce=>ce.lift(new R(ee))}(()=>ce))}}},45510:(m,S,i)=>{"use strict";i.d(S,{P:()=>c});var r=i(89724),a=i(55860),f=i(47640);let c=(()=>{class e{constructor(y,T){this.router=y,this.authStorageService=T}canActivate(y,T){return!!this.authStorageService.isLoggedIn()||(this.router.navigate(["/login"],{queryParams:{returnUrl:T.url}}),!1)}canActivateChild(y,T){return this.canActivate(y,T)}}return e.\u0275fac=function(y){return new(y||e)(r.LFG(a.F0),r.LFG(f.j))},e.\u0275prov=r.Yz7({token:e,factory:e.\u0275fac,providedIn:"root"}),e})()},47640:(m,S,i)=>{"use strict";i.d(S,{j:()=>e});var r=i(26215);class a{constructor(y=[]){["read","create","update","delete"].forEach(T=>this[T]=y.includes(T))}}class f{constructor(y){this.hosts=new a(y.hosts),this.configOpt=new a(y["config-opt"]),this.pool=new a(y.pool),this.osd=new a(y.osd),this.monitor=new a(y.monitor),this.rbdImage=new a(y["rbd-image"]),this.iscsi=new a(y.iscsi),this.rbdMirroring=new a(y["rbd-mirroring"]),this.rgw=new a(y.rgw),this.cephfs=new a(y.cephfs),this.manager=new a(y.manager),this.log=new a(y.log),this.user=new a(y.user),this.grafana=new a(y.grafana),this.prometheus=new a(y.prometheus),this.nfs=new a(y["nfs-ganesha"])}}var c=i(89724);let e=(()=>{class p{constructor(){this.isPwdDisplayedSource=new r.X(!1),this.isPwdDisplayed$=this.isPwdDisplayedSource.asObservable()}set(T,C={},R=!1,L=null,z=!1){localStorage.setItem("dashboard_username",T),localStorage.setItem("dashboard_permissions",JSON.stringify(new f(C))),localStorage.setItem("user_pwd_expiration_date",String(L)),localStorage.setItem("user_pwd_update_required",String(z)),localStorage.setItem("sso",String(R))}remove(){localStorage.removeItem("dashboard_username"),localStorage.removeItem("user_pwd_expiration_data"),localStorage.removeItem("user_pwd_update_required")}isLoggedIn(){return null!==localStorage.getItem("dashboard_username")}getUsername(){return localStorage.getItem("dashboard_username")}getPermissions(){return JSON.parse(localStorage.getItem("dashboard_permissions")||JSON.stringify(new f({})))}getPwdExpirationDate(){return Number(localStorage.getItem("user_pwd_expiration_date"))}getPwdUpdateRequired(){return"true"===localStorage.getItem("user_pwd_update_required")}isSSO(){return"true"===localStorage.getItem("sso")}}return p.\u0275fac=function(T){return new(T||p)},p.\u0275prov=c.Yz7({token:p,factory:p.\u0275fac,providedIn:"root"}),p})()},72625:(m,S,i)=>{"use strict";i.d(S,{R:()=>T});var r=i(26215),a=i(45435),f=i(88002),c=i(28049),e=i(74255),p=i(89724),y=i(24310);let T=(()=>{class C{constructor(L,z){this.summaryservice=L,this.cephReleaseNamePipe=z,this.releaseDataSource=new r.X(null),this.releaseData$=this.releaseDataSource.asObservable(),this.summaryservice.subscribeOnce(W=>{const J=this.cephReleaseNamePipe.transform(W.version);this.releaseDataSource.next(J)})}urlGenerator(L,z="master"){const J=`https://docs.ceph.com/en/${"master"===z?"latest":z}/`,ee="https://ceph.io/";return{iscsi:`${J}mgr/dashboard/#enabling-iscsi-management`,prometheus:`${J}mgr/dashboard/#enabling-prometheus-alerting`,"nfs-ganesha":`${J}mgr/dashboard/#configuring-nfs-ganesha-in-the-dashboard`,"rgw-nfs":`${J}radosgw/nfs`,rgw:`${J}mgr/dashboard/#enabling-the-object-gateway-management-frontend`,dashboard:`${J}mgr/dashboard`,grafana:`${J}mgr/dashboard/#enabling-the-embedding-of-grafana-dashboards`,orch:`${J}mgr/orchestrator`,pgs:`${ee}pgcalc`,help:`${ee}help/`,security:`${ee}security/`,trademarks:`${ee}legal-page/trademarks/`,"dashboard-landing-page-status":`${J}mgr/dashboard/#dashboard-landing-page-status`,"dashboard-landing-page-performance":`${J}mgr/dashboard/#dashboard-landing-page-performance`,"dashboard-landing-page-capacity":`${J}mgr/dashboard/#dashboard-landing-page-capacity`}[L]}subscribeOnce(L,z,W){return this.releaseData$.pipe((0,a.h)(J=>!!J),(0,f.U)(J=>this.urlGenerator(L,J)),(0,c.P)()).subscribe(z,W)}}return C.\u0275fac=function(L){return new(L||C)(p.LFG(e.J),p.LFG(y.t))},C.\u0275prov=p.Yz7({token:C,factory:C.\u0275fac,providedIn:"root"}),C})()},4222:(m,S,i)=>{"use strict";i.d(S,{T:()=>e});var r=i(88002),a=i(26504),f=i(89724),c=i(89154);let e=(()=>{class p{constructor(T){this.featureToggles=T}canActivate(T){return this.featureToggles.get().pipe((0,r.U)(C=>{if(!1===C[T.routeConfig.path])throw new a._2;return!0}))}canActivateChild(T){return this.canActivate(T.parent)}}return p.\u0275fac=function(T){return new(T||p)(f.LFG(c.l))},p.\u0275prov=f.Yz7({token:p,factory:p.\u0275fac,providedIn:"root"}),p})()},89154:(m,S,i)=>{"use strict";i.d(S,{l:()=>e});var r=i(89724),a=i(19725),f=i(36848);let e=(()=>{class p{constructor(T,C){this.http=T,this.timerService=C,this.API_URL="api/feature_toggles",this.REFRESH_INTERVAL=3e4,this.featureToggleMap$=this.timerService.get(()=>this.http.get(this.API_URL),this.REFRESH_INTERVAL)}get(){return this.featureToggleMap$}}return p.\u0275fac=function(T){return new(T||p)(r.LFG(a.eN),r.LFG(f.f))},p.\u0275prov=r.Yz7({token:p,factory:p.\u0275fac,providedIn:"root"}),p})()},28211:(m,S,i)=>{"use strict";i.d(S,{H:()=>c});var r=i(23815),a=i.n(r),f=i(89724);let c=(()=>{class e{format_number(y,T,C,R=1){if(a().isString(y)&&(y=Number(y)),!a().isNumber(y))return"-";let L=y<1?0:Math.floor(Math.log(y)/Math.log(T));L=L>=C.length?C.length-1:L;let z=a().round(y/Math.pow(T,L),R).toString();return""===z?"-":(""!==C[L]&&(z=`${z} ${C[L]}`),z)}toBytes(y,T=null){const R=["b","k","m","g","t","p","e","z","y"],L=RegExp("^(\\d+(.\\d+)?) ?(["+R.join("")+"]?(b|ib|B/s)?)?$","i").exec(y);if(null===L)return T;let z=parseFloat(L[1]);return a().isString(L[3])&&(z*=Math.pow(1024,R.indexOf(L[3].toLowerCase()[0]))),Math.round(z)}toMilliseconds(y){const C=/^\s*(\d+)\s*(ms)?\s*$/i.exec(y);return null!==C?+C[1]:0}toIops(y){const C=/^\s*(\d+)\s*(IOPS)?\s*$/i.exec(y);return null!==C?+C[1]:0}}return e.\u0275fac=function(y){return new(y||e)},e.\u0275prov=f.Yz7({token:e,factory:e.\u0275fac,providedIn:"root"}),e})()},63285:(m,S,i)=>{"use strict";i.d(S,{Z:()=>f});var r=i(89724),a=i(71334);let f=(()=>{class c{constructor(p){this.modal=p}show(p,y,T){const C=this.modal.open(p,T);return y&&Object.assign(C.componentInstance,y),C}dismissAll(){this.modal.dismissAll()}hasOpenModals(){return this.modal.hasOpenModals()}}return c.\u0275fac=function(p){return new(p||c)(r.LFG(a.FF))},c.\u0275prov=r.Yz7({token:c,factory:c.\u0275fac,providedIn:"root"}),c})()},54462:(m,S,i)=>{"use strict";i.d(S,{P:()=>C});var r=i(25917),a=i(88002),f=i(5304),c=i(65862),e=i(89724),p=i(19725),y=i(55860),T=i(7273);let C=(()=>{class R{constructor(z,W,J){this.http=z,this.router=W,this.mgrModuleService=J}canActivate(z){return this.doCheck(z)}canActivateChild(z){return this.doCheck(z)}doCheck(z){if(z.url.length>0&&R.ALLOWLIST.includes(z.url[0].path))return(0,r.of)(!0);const W=z.data.moduleStatusGuardConfig;let J=!1;return W.backend&&this.mgrModuleService.getConfig("orchestrator").subscribe(ee=>{J=W.backend===ee.orchestrator},()=>(this.router.navigate([W.redirectTo]),(0,r.of)(!1))),this.http.get(`ui-api/${W.uiApiPath}/status`).pipe((0,a.U)(ee=>(!ee.available&&!J&&this.router.navigate([W.redirectTo||""],{state:{header:W.header,message:ee.message,section:W.section,section_info:W.section_info,button_name:W.button_name,button_route:W.button_route,button_title:W.button_title,uiConfig:W.uiConfig,uiApiPath:W.uiApiPath,icon:c.P.wrench,component:W.component}}),ee.available)),(0,f.K)(()=>(this.router.navigate([W.redirectTo]),(0,r.of)(!1))))}}return R.ALLOWLIST=["501"],R.\u0275fac=function(z){return new(z||R)(e.LFG(p.eN),e.LFG(y.F0),e.LFG(T.N))},R.\u0275prov=e.Yz7({token:R,factory:R.\u0275fac,providedIn:"root"}),R})()},97161:(m,S,i)=>{"use strict";i.d(S,{g:()=>L});var r=i(23815),a=i.n(r),f=i(26215),c=i(79765),e=i(18001),p=i(61355),y=i(89724),T=i(92870),C=i(57924),R=i(96102);let L=(()=>{class z{constructor(J,ee,ce){this.toastr=J,this.taskMessageService=ee,this.cdDatePipe=ce,this.hideToasties=!1,this.dataSource=new f.X([]),this.data$=this.dataSource.asObservable(),this.sidebarSubject=new c.xQ,this.queued=[],this.KEY="cdNotifications";const ie=localStorage.getItem(this.KEY);let U=[];a().isString(ie)&&(U=JSON.parse(ie,(se,ge)=>a().isPlainObject(ge)?a().assign(new p.e,ge):ge)),this.dataSource.next(U)}removeAll(){localStorage.removeItem(this.KEY),this.dataSource.next([])}remove(J){const ee=this.dataSource.getValue();ee.splice(J,1),this.dataSource.next(ee),localStorage.setItem(this.KEY,JSON.stringify(ee))}save(J){const ee=this.dataSource.getValue();for(ee.push(J),ee.sort((ce,ie)=>ce.timestamp>ie.timestamp?-1:1);ee.length>10;)ee.pop();this.dataSource.next(ee),localStorage.setItem(this.KEY,JSON.stringify(ee))}show(J,ee,ce,ie,U){return window.setTimeout(()=>{let se;se=a().isFunction(J)?J():a().isObject(J)?J:new p.T(J,ee,ce,ie,U),this.queueToShow(se)},10)}queueToShow(J){this.cancel(this.queuedTimeoutId),this.queued.find(ee=>a().isEqual(ee,J))||this.queued.push(J),this.queuedTimeoutId=window.setTimeout(()=>{this.showQueued()},500)}showQueued(){this.getUnifiedTitleQueue().forEach(J=>{const ee=new p.e(J);ee.isFinishedTask||this.save(ee),this.showToasty(ee)})}getUnifiedTitleQueue(){return Object.values(this.queueShiftByTitle()).map(J=>{const ee=J[0];return J.length>1&&(ee.message="<ul>"+J.map(ce=>`<li>${ce.message}</li>`).join("")+"</ul>"),ee})}queueShiftByTitle(){const J={};let ee;for(;ee=this.queued.shift();)J[ee.title]||(J[ee.title]=[]),J[ee.title].push(ee);return J}showToasty(J){this.hideToasties||this.toastr[["error","info","success"][J.type]]((J.message?J.message+"<br>":"")+this.renderTimeAndApplicationHtml(J),J.title,J.options)}renderTimeAndApplicationHtml(J){return`<small class="date">${this.cdDatePipe.transform(J.timestamp)}</small><i class="float-end custom-icon ${J.applicationClass}" title="${J.application}"></i>`}notifyTask(J,ee=!0){const ce=this.finishedTaskToNotification(J,ee);return ce.isFinishedTask=!0,this.show(ce)}finishedTaskToNotification(J,ee=!0){let ce;return ce=J.success&&ee?new p.T(e.k.success,this.taskMessageService.getSuccessTitle(J)):new p.T(e.k.error,this.taskMessageService.getErrorTitle(J),this.taskMessageService.getErrorMessage(J)),ce.isFinishedTask=!0,ce}cancel(J){window.clearTimeout(J)}suspendToasties(J){this.hideToasties=J}toggleSidebar(J=!1){this.sidebarSubject.next(J)}}return z.\u0275fac=function(J){return new(J||z)(y.LFG(T._W),y.LFG(C.p),y.LFG(R.N))},z.\u0275prov=y.Yz7({token:z,factory:z.\u0275fac,providedIn:"root"}),z})()},81354:(m,S,i)=>{"use strict";i.d(S,{q:()=>y});var r=i(23815),a=i.n(r),f=i(88002),c=i(9837);class e{constructor(C){this.pwdPolicyEnabled=C.pwd_policy_enabled,this.pwdPolicyMinLength=C.pwd_policy_min_length,this.pwdPolicyCheckLengthEnabled=C.pwd_policy_check_length_enabled,this.pwdPolicyCheckOldpwdEnabled=C.pwd_policy_check_oldpwd_enabled,this.pwdPolicyCheckUsernameEnabled=C.pwd_policy_check_username_enabled,this.pwdPolicyCheckExclusionListEnabled=C.pwd_policy_check_exclusion_list_enabled,this.pwdPolicyCheckRepetitiveCharsEnabled=C.pwd_policy_check_repetitive_chars_enabled,this.pwdPolicyCheckSequentialCharsEnabled=C.pwd_policy_check_sequential_chars_enabled,this.pwdPolicyCheckComplexityEnabled=C.pwd_policy_check_complexity_enabled}}var p=i(89724);let y=(()=>{class T{constructor(R){this.settingsService=R}getHelpText(){return this.settingsService.getStandardSettings().pipe((0,f.U)(R=>{const L=new e(R);let z=[];if(L.pwdPolicyEnabled){z.push("Required rules for passwords:");const W={pwdPolicyCheckLengthEnabled:"Must contain at least " + L.pwdPolicyMinLength + " characters",pwdPolicyCheckOldpwdEnabled:"Must not be the same as the previous one",pwdPolicyCheckUsernameEnabled:"Cannot contain the username",pwdPolicyCheckExclusionListEnabled:"Cannot contain any configured keyword",pwdPolicyCheckRepetitiveCharsEnabled:"Cannot contain any repetitive characters e.g. \"aaa\"",pwdPolicyCheckSequentialCharsEnabled:"Cannot contain any sequential characters e.g. \"abc\"",pwdPolicyCheckComplexityEnabled:"Must consist of characters from the following groups:\n  * Alphabetic a-z, A-Z\n  * Numbers 0-9\n  * Special chars: !\"#$%& '()*+,-./:;<=>?@[\\]^_`{{|}}~\n  * Any other characters (signs)"};z=z.concat(a().keys(W).filter(J=>a().get(L,J)).map(J=>"- "+a().get(W,J)))}return z.join("\n")}))}mapCreditsToCssClass(R){let L="very-strong";return R<10?L="too-weak":R<15?L="weak":R<20?L="ok":R<25&&(L="strong"),L}}return T.\u0275fac=function(R){return new(R||T)(p.LFG(c.g))},T.\u0275prov=p.Yz7({token:T,factory:T.\u0275fac,providedIn:"root"}),T})()},34089:(m,S,i)=>{"use strict";i.d(S,{n:()=>f});var r=i(30633),a=i(89724);let f=(()=>{class c{constructor(){this.sections=[{heading:"Quality of Service",class:"quality-of-service",options:[{name:"rbd_qos_bps_limit",displayName:"BPS Limit",description:"The desired limit of IO bytes per second.",type:r.r.bps},{name:"rbd_qos_iops_limit",displayName:"IOPS Limit",description:"The desired limit of IO operations per second.",type:r.r.iops},{name:"rbd_qos_read_bps_limit",displayName:"Read BPS Limit",description:"The desired limit of read bytes per second.",type:r.r.bps},{name:"rbd_qos_read_iops_limit",displayName:"Read IOPS Limit",description:"The desired limit of read operations per second.",type:r.r.iops},{name:"rbd_qos_write_bps_limit",displayName:"Write BPS Limit",description:"The desired limit of write bytes per second.",type:r.r.bps},{name:"rbd_qos_write_iops_limit",displayName:"Write IOPS Limit",description:"The desired limit of write operations per second.",type:r.r.iops},{name:"rbd_qos_bps_burst",displayName:"BPS Burst",description:"The desired burst limit of IO bytes.",type:r.r.bps},{name:"rbd_qos_iops_burst",displayName:"IOPS Burst",description:"The desired burst limit of IO operations.",type:r.r.iops},{name:"rbd_qos_read_bps_burst",displayName:"Read BPS Burst",description:"The desired burst limit of read bytes.",type:r.r.bps},{name:"rbd_qos_read_iops_burst",displayName:"Read IOPS Burst",description:"The desired burst limit of read operations.",type:r.r.iops},{name:"rbd_qos_write_bps_burst",displayName:"Write BPS Burst",description:"The desired burst limit of write bytes.",type:r.r.bps},{name:"rbd_qos_write_iops_burst",displayName:"Write IOPS Burst",description:"The desired burst limit of write operations.",type:r.r.iops}]}]}static getOptionsFromSections(p){return p.map(y=>y.options).reduce((y,T)=>y.concat(T))}filterConfigOptionsByName(p){return c.getOptionsFromSections(this.sections).filter(y=>y.name===p)}getOptionValueByName(p,y,T=""){const C=this.filterConfigOptionsByName(p);return 1===C.length?C.pop()[y]:T}getWritableSections(){return this.sections.map(p=>(p.options=p.options.filter(y=>!y.readOnly),p))}getOptionFields(){return c.getOptionsFromSections(this.sections)}getWritableOptionFields(){return c.getOptionsFromSections(this.getWritableSections())}getOptionByName(p){return this.filterConfigOptionsByName(p).pop()}getDisplayName(p){return this.getOptionValueByName(p,"displayName")}getDescription(p){return this.getOptionValueByName(p,"description")}}return c.\u0275fac=function(p){return new(p||c)},c.\u0275prov=a.Yz7({token:c,factory:c.\u0275fac,providedIn:"root"}),c})()},74255:(m,S,i)=>{"use strict";i.d(S,{J:()=>C});var r=i(23815),a=i.n(r),f=i(26215),c=i(45435),e=i(28049),p=i(89724),y=i(19725),T=i(36848);let C=(()=>{class R{constructor(z,W){this.http=z,this.timerService=W,this.REFRESH_INTERVAL=5e3,this.summaryDataSource=new f.X(null),this.summaryData$=this.summaryDataSource.asObservable()}startPolling(){return this.timerService.get(()=>this.retrieveSummaryObservable(),this.REFRESH_INTERVAL).subscribe(this.retrieveSummaryObserver())}refresh(){return this.retrieveSummaryObservable().subscribe(this.retrieveSummaryObserver())}retrieveSummaryObservable(){return this.http.get("api/summary")}retrieveSummaryObserver(){return z=>{this.summaryDataSource.next(z)}}subscribeOnce(z,W){return this.summaryData$.pipe((0,c.h)(J=>!!J),(0,e.P)()).subscribe(z,W)}subscribe(z,W){return this.summaryData$.pipe((0,c.h)(J=>!!J)).subscribe(z,W)}addRunningTask(z){const W=this.summaryDataSource.getValue();!W||(a().isArray(W.executing_tasks)?W.executing_tasks.find(ee=>ee.name===z.name&&a().isEqual(ee.metadata,z.metadata))||W.executing_tasks.push(z):W.executing_tasks=[z],this.summaryDataSource.next(W))}}return R.\u0275fac=function(z){return new(z||R)(p.LFG(y.eN),p.LFG(T.f))},R.\u0275prov=p.Yz7({token:R,factory:R.\u0275fac,providedIn:"root"}),R})()},38047:(m,S,i)=>{"use strict";i.d(S,{j:()=>c});var r=i(74255),a=i(89724),f=i(57924);let c=(()=>{class e{constructor(y,T){this.taskMessageService=y,this.summaryService=T}init(y,T,C,R,L,z,W){this.getUpdate=y,this.preProcessing=T,this.setList=C,this.onFetchError=R,this.taskFilter=L,this.itemFilter=z,this.builders=W||{},this.summaryDataSubscription=this.summaryService.subscribe(J=>{this.summary=J,this.fetch()},this.onFetchError)}fetch(y=null){this.getUpdate(y).subscribe(T=>{var C;this.updateData(T,null===(C=this.summary)||void 0===C?void 0:C.executing_tasks.filter(this.taskFilter))},this.onFetchError)}updateData(y,T){const C=this.preProcessing?this.preProcessing(y):y;this.addMissing(C,T),C.forEach(R=>{const L=T.filter(z=>this.itemFilter(R,z));R.cdExecuting=this.getTaskAction(L)}),this.setList(C)}addMissing(y,T){const C=this.builders.default;null==T||T.forEach(R=>{const L=y.find(W=>this.itemFilter(W,R)),z=this.builders[R.name];!L&&(z||C)&&y.push(z?z(R.metadata):C(R.metadata))})}getTaskAction(y){if(0!==y.length)return y.map(T=>{const C=T.progress?` ${T.progress}%`:"";return this.taskMessageService.getRunningText(T)+"..."+C}).join(", ")}ngOnDestroy(){this.summaryDataSubscription&&this.summaryDataSubscription.unsubscribe()}}return e.\u0275fac=function(y){return new(y||e)(a.LFG(f.p),a.LFG(r.J))},e.\u0275prov=a.Yz7({token:e,factory:e.\u0275fac}),e})()},71099:(m,S,i)=>{"use strict";i.d(S,{k:()=>e});var r=i(23815),a=i.n(r),f=i(89724);class c{constructor(y,T,C){this.name=y,this.metadata=T,this.onTaskFinished=C}}let e=(()=>{class p{constructor(){this.subscriptions=[]}init(T){return T.subscribe(C=>{const R=C.executing_tasks,L=C.finished_tasks,z=[];for(const W of this.subscriptions){const J=this._getTask(W,L),ee=this._getTask(W,R);null!==J&&null===ee&&W.onTaskFinished(J),null!==ee&&z.push(W),this.subscriptions=z}})}subscribe(T,C,R){this.subscriptions.push(new c(T,C,R))}_getTask(T,C){for(const R of C)if(R.name===T.name&&a().isEqual(R.metadata,T.metadata))return R;return null}}return p.\u0275fac=function(T){return new(T||p)},p.\u0275prov=f.Yz7({token:p,factory:p.\u0275fac,providedIn:"root"}),p})()},57924:(m,S,i)=>{"use strict";i.d(S,{p:()=>p});var r=(()=>{return(y=r||(r={})).auth="Login",y.cephfs="CephFS",y.rbd="RBD",y.pool="Pool",y.osd="OSD",y.role="Role",y.user="User",r;var y})(),a=i(19358),f=i(89724);class c{constructor(T,C,R){this.running=T,this.failure=C,this.success=R}}class e{constructor(T,C,R){this.operation=T,this.involves=C,this.errors=R||(()=>({}))}failure(T){return "Failed to " + this.operation.failure + " " + this.involves(T) + ""}running(T){return`${this.operation.running} ${this.involves(T)}`}success(T){return`${this.operation.success} ${this.involves(T)}`}}let p=(()=>{class y{constructor(){this.defaultMessage=this.newTaskMessage(new c("Executing","execute","Executed"),C=>C&&(r[C.component]||C.component)||"unknown task",()=>({})),this.commonOperations={create:new c("Creating","create","Created"),update:new c("Updating","update","Updated"),delete:new c("Deleting","delete","Deleted"),add:new c("Adding","add","Added"),remove:new c("Removing","remove","Removed"),import:new c("Importing","import","Imported")},this.rbd={default:C=>"RBD '" + C.image_spec + "'",create:C=>{const R=new a.N(C.pool_name,C.namespace,C.image_name).toString();return "RBD '" + R + "'"},child:C=>{const R=new a.N(C.child_pool_name,C.child_namespace,C.child_image_name).toString();return "RBD '" + R + "'"},destination:C=>{const R=new a.N(C.dest_pool_name,C.dest_namespace,C.dest_image_name).toString();return "RBD '" + R + "'"},snapshot:C=>"RBD snapshot '" + C.image_spec + "@" + C.snapshot_name + "'"},this.rbd_mirroring={site_name:()=>"mirroring site name",bootstrap:()=>"bootstrap token",pool:C=>"mirror mode for pool '" + C.pool_name + "'",pool_peer:C=>"mirror peer for pool '" + C.pool_name + "'"},this.grafana={update_dashboards:()=>"all dashboards"},this.messages={"host/add":this.newTaskMessage(this.commonOperations.add,C=>this.host(C)),"host/remove":this.newTaskMessage(this.commonOperations.remove,C=>this.host(C)),"host/identify_device":this.newTaskMessage(new c("Identifying","identify","Identified"),C=>"device '" + C.device + "' on host '" + C.hostname + "'"),"osd/create":this.newTaskMessage(this.commonOperations.create,C=>"OSDs (DriveGroups: " + C.tracking_id + ")"),"osd/delete":this.newTaskMessage(this.commonOperations.delete,C=>this.osd(C)),"pool/create":this.newTaskMessage(this.commonOperations.create,C=>this.pool(C),C=>({17:"Name is already used by " + this.pool(C) + "."})),"pool/edit":this.newTaskMessage(this.commonOperations.update,C=>this.pool(C),C=>({17:"Name is already used by " + this.pool(C) + "."})),"pool/delete":this.newTaskMessage(this.commonOperations.delete,C=>this.pool(C)),"ecp/create":this.newTaskMessage(this.commonOperations.create,C=>this.ecp(C),C=>({17:"Name is already used by " + this.ecp(C) + "."})),"ecp/delete":this.newTaskMessage(this.commonOperations.delete,C=>this.ecp(C)),"crushRule/create":this.newTaskMessage(this.commonOperations.create,C=>this.crushRule(C),C=>({17:"Name is already used by " + this.crushRule(C) + "."})),"crushRule/delete":this.newTaskMessage(this.commonOperations.delete,C=>this.crushRule(C)),"rbd/create":this.newTaskMessage(this.commonOperations.create,this.rbd.create,C=>({17:"Name is already used by " + this.rbd.create(C) + "."})),"rbd/edit":this.newTaskMessage(this.commonOperations.update,this.rbd.default,C=>({17:"Name is already used by " + this.rbd.default(C) + "."})),"rbd/delete":this.newTaskMessage(this.commonOperations.delete,this.rbd.default,C=>({16:"" + this.rbd.default(C) + " is busy.",39:"" + this.rbd.default(C) + " contains snapshots."})),"rbd/clone":this.newTaskMessage(new c("Cloning","clone","Cloned"),this.rbd.child,C=>({17:"Name is already used by " + this.rbd.child(C) + ".",22:"Snapshot of " + this.rbd.child(C) + " must be protected."})),"rbd/copy":this.newTaskMessage(new c("Copying","copy","Copied"),this.rbd.destination,C=>({17:"Name is already used by " + this.rbd.destination(C) + "."})),"rbd/flatten":this.newTaskMessage(new c("Flattening","flatten","Flattened"),this.rbd.default),"rbd/snap/create":this.newTaskMessage(this.commonOperations.create,this.rbd.snapshot,C=>({17:"Name is already used by " + this.rbd.snapshot(C) + "."})),"rbd/snap/edit":this.newTaskMessage(this.commonOperations.update,this.rbd.snapshot,C=>({16:"Cannot unprotect " + this.rbd.snapshot(C) + " because it contains child images."})),"rbd/snap/delete":this.newTaskMessage(this.commonOperations.delete,this.rbd.snapshot,C=>({16:"Cannot delete " + this.rbd.snapshot(C) + " because it's protected."})),"rbd/snap/rollback":this.newTaskMessage(new c("Rolling back","rollback","Rolled back"),this.rbd.snapshot),"rbd/trash/move":this.newTaskMessage(new c("Moving","move","Moved"),C=>"image '" + C.image_spec + "' to trash",()=>({2:"Could not find image."})),"rbd/trash/restore":this.newTaskMessage(new c("Restoring","restore","Restored"),C=>"image '" + C.image_id_spec + "' into '" + C.new_image_name + "'",C=>({17:"Image name '" + C.new_image_name + "' is already in use."})),"rbd/trash/remove":this.newTaskMessage(new c("Deleting","delete","Deleted"),C=>"image '" + C.image_id_spec + "'"),"rbd/trash/purge":this.newTaskMessage(new c("Purging","purge","Purged"),C=>{let R="all pools";return C.pool_name&&(R=`'${C.pool_name}'`),"images from " + R + ""}),"rbd/mirroring/site_name/edit":this.newTaskMessage(this.commonOperations.update,this.rbd_mirroring.site_name,()=>({})),"rbd/mirroring/bootstrap/create":this.newTaskMessage(this.commonOperations.create,this.rbd_mirroring.bootstrap,()=>({})),"rbd/mirroring/bootstrap/import":this.newTaskMessage(this.commonOperations.import,this.rbd_mirroring.bootstrap,()=>({})),"rbd/mirroring/pool/edit":this.newTaskMessage(this.commonOperations.update,this.rbd_mirroring.pool,()=>({16:"Cannot disable mirroring because it contains a peer."})),"rbd/mirroring/peer/add":this.newTaskMessage(this.commonOperations.create,this.rbd_mirroring.pool_peer,()=>({})),"rbd/mirroring/peer/edit":this.newTaskMessage(this.commonOperations.update,this.rbd_mirroring.pool_peer,()=>({})),"rbd/mirroring/peer/delete":this.newTaskMessage(this.commonOperations.delete,this.rbd_mirroring.pool_peer,()=>({})),"iscsi/target/create":this.newTaskMessage(this.commonOperations.create,C=>this.iscsiTarget(C)),"iscsi/target/edit":this.newTaskMessage(this.commonOperations.update,C=>this.iscsiTarget(C)),"iscsi/target/delete":this.newTaskMessage(this.commonOperations.delete,C=>this.iscsiTarget(C)),"nfs/create":this.newTaskMessage(this.commonOperations.create,C=>this.nfs(C)),"nfs/edit":this.newTaskMessage(this.commonOperations.update,C=>this.nfs(C)),"nfs/delete":this.newTaskMessage(this.commonOperations.delete,C=>this.nfs(C)),"grafana/dashboards/update":this.newTaskMessage(this.commonOperations.update,this.grafana.update_dashboards,()=>({})),"service/create":this.newTaskMessage(this.commonOperations.create,C=>this.service(C)),"service/edit":this.newTaskMessage(this.commonOperations.update,C=>this.service(C)),"service/delete":this.newTaskMessage(this.commonOperations.delete,C=>this.service(C))}}newTaskMessage(C,R,L){return new e(C,R,L)}host(C){return "host '" + C.hostname + "'"}osd(C){return "OSD '" + C.svc_id + "'"}pool(C){return "pool '" + C.pool_name + "'"}ecp(C){return "erasure code profile '" + C.name + "'"}crushRule(C){return "crush rule '" + C.name + "'"}iscsiTarget(C){return "target '" + C.target_iqn + "'"}nfs(C){return "NFS '" + C.cluster_id + ":" + (C.export_id ? C.export_id : C.path) + "'"}service(C){return "Service '" + C.service_name + "'"}_getTaskTitle(C){return C.name&&C.name.startsWith("progress/")?this.newTaskMessage(new c(C.name.replace("progress/",""),"",C.name.replace("progress/","")),R=>""):this.messages[C.name]||this.defaultMessage}getSuccessTitle(C){return this._getTaskTitle(C).success(C.metadata)}getErrorMessage(C){return this._getTaskTitle(C).errors(C.metadata)[C.exception.code]||C.exception.detail}getErrorTitle(C){return this._getTaskTitle(C).failure(C.metadata)}getRunningTitle(C){return this._getTaskTitle(C).running(C.metadata)}getRunningText(C){return this._getTaskTitle(C).operation.running}}return y.\u0275fac=function(C){return new(C||y)},y.\u0275prov=f.Yz7({token:y,factory:y.\u0275fac,providedIn:"root"}),y})()},32337:(m,S,i)=>{"use strict";i.d(S,{P:()=>R});var r=i(70882),a=i(18001),f=i(61355),c=i(60737),e=i(97161),p=i(74255),y=i(71099),T=i(89724),C=i(57924);let R=(()=>{class L{constructor(W,J,ee,ce){this.notificationService=W,this.summaryService=J,this.taskMessageService=ee,this.taskManagerService=ce}wrapTaskAroundCall({task:W,call:J}){return new r.y(ee=>{J.subscribe(ce=>{202===ce.status?this._handleExecutingTasks(W):(this.summaryService.refresh(),W.success=!0,this.notificationService.notifyTask(W))},ce=>{W.success=!1,W.exception=ce.error,ee.error(ce)},()=>{ee.complete()})})}_handleExecutingTasks(W){const J=new f.T(a.k.info,this.taskMessageService.getRunningTitle(W));J.isFinishedTask=!0,this.notificationService.show(J);const ee=new c.o(W.name,W.metadata);this.summaryService.addRunningTask(ee),this.taskManagerService.subscribe(ee.name,ee.metadata,ce=>{this.notificationService.notifyTask(ce)})}}return L.\u0275fac=function(W){return new(W||L)(T.LFG(e.g),T.LFG(p.J),T.LFG(C.p),T.LFG(y.k))},L.\u0275prov=T.Yz7({token:L,factory:L.\u0275fac,providedIn:"root"}),L})()},36848:(m,S,i)=>{"use strict";i.d(S,{f:()=>z});var r=i(46797),a=i(59746),f=i(43190),c=i(47349),e=i(2817),p=i(89724),y=i(33637);class T{constructor(J){this.zone=J,this.scheduler=y.z}now(){return this.scheduler.now()}}let C=(()=>{class W extends T{constructor(ee){super(ee)}schedule(...ee){return this.zone.runOutsideAngular(()=>this.scheduler.schedule.apply(this.scheduler,ee))}}return W.\u0275fac=function(ee){return new(ee||W)(p.LFG(p.R0b))},W.\u0275prov=p.Yz7({token:W,factory:W.\u0275fac,providedIn:"root"}),W})(),R=(()=>{class W extends T{constructor(ee){super(ee)}schedule(...ee){return this.zone.run(()=>this.scheduler.schedule.apply(this.scheduler,ee))}}return W.\u0275fac=function(ee){return new(ee||W)(p.LFG(p.R0b))},W.\u0275prov=p.Yz7({token:W,factory:W.\u0275fac,providedIn:"root"}),W})(),L=(()=>{class W{constructor(ee,ce){this.leave=ee,this.enter=ce}}return W.\u0275fac=function(ee){return new(ee||W)(p.LFG(C),p.LFG(R))},W.\u0275prov=p.Yz7({token:W,factory:W.\u0275fac,providedIn:"root"}),W})(),z=(()=>{class W{constructor(ee){this.ngZone=ee,this.DEFAULT_REFRESH_INTERVAL=5e3,this.DEFAULT_DUE_TIME=0}get(ee,ce=this.DEFAULT_REFRESH_INTERVAL,ie=this.DEFAULT_DUE_TIME){return(0,r.H)(ie,ce,this.ngZone.leave).pipe((0,a.QV)(this.ngZone.enter),(0,f.w)(ee),(0,c.d)({refCount:!0,bufferSize:1}),(0,e.r)())}}return W.\u0275fac=function(ee){return new(ee||W)(p.LFG(L))},W.\u0275prov=p.Yz7({token:W,factory:W.\u0275fac,providedIn:"root"}),W})()},51847:(m,S,i)=>{"use strict";i.d(S,{F:()=>f});var r=i(11048),a=i(79512);class f{constructor(e){this.base=e}static concatURLSegments(e){return e.reduce(r.Ye.joinWithSlash)}static buildURL(e,...p){return f.concatURLSegments([...e?["/"]:[],...p])}getURL(e,p=!0,...y){return f.buildURL(p,this.base,e,...y)}getCreate(e=!0){return this.getURL(a.MQ.CREATE,e)}getCreateFrom(e,p=!0){return this.getURL(a.MQ.CREATE,p,e)}getDelete(e=!0){return this.getURL(a.MQ.DELETE,e)}getEdit(e,p=!0){return this.getURL(a.MQ.EDIT,p,e)}getUpdate(e,p=!0){return this.getURL(a.MQ.UPDATE,p,e)}getAdd(e=!0){return this.getURL(a.MQ.ADD,e)}getRemove(e=!0){return this.getURL(a.MQ.REMOVE,e)}getRecreate(e,p=!0){return this.getURL(a.MQ.RECREATE,p,e)}}},44466:(m,S,i)=>{"use strict";i.d(S,{m:()=>L});var r=i(11048),a=i(99475),f=i(15626),c=i(2149),e=i(35540),p=i(12455),y=i(45510),T=i(47640),C=i(28211),R=i(89724);let L=(()=>{class z{}return z.\u0275fac=function(J){return new(J||z)},z.\u0275mod=R.oAB({type:z}),z.\u0275inj=R.cJS({providers:[T.j,y.P,C.H,a.P],imports:[[r.ez,p.D,f.K,c.t,e.o],f.K,p.D,c.t,e.o]}),z})()},92340:(m,S,i)=>{"use strict";i.d(S,{N:()=>r});const r={default_lang:"en-US",production:!0,year:"2023"}},88480:(m,S,i)=>{"use strict";var r={};i.r(r),i.d(r,{JsonPatchError:()=>uf,_areEquals:()=>jE,applyOperation:()=>zv,applyPatch:()=>Xm,applyReducer:()=>g6,deepClone:()=>h6,getValueByPointer:()=>YE,validate:()=>hx,validator:()=>aC});var a={};i.r(a),i.d(a,{compare:()=>C6,generate:()=>tA,observe:()=>T6,unobserve:()=>S6});var f={};i.r(f),i.d(f,{cookie:()=>x8,header:()=>w8,path:()=>O8,query:()=>A8});var c=i(14800),e=i(89724),p=i(11048),y=i(19725),T=i(32019);const C=!1;function L(n){return new e.vHH(3e3,C)}function mi(){return"undefined"!=typeof window&&void 0!==window.document}function ur(){return"undefined"!=typeof process&&"[object process]"==={}.toString.call(process)}function $r(n){switch(n.length){case 0:return new T.ZN;case 1:return n[0];default:return new T.ZE(n)}}function Br(n,s,t,o,l={},_={}){const M=[],w=[];let N=-1,V=null;if(o.forEach(X=>{const re=X.offset,oe=re==N,fe=oe&&V||{};Object.keys(X).forEach(ve=>{let Pe=ve,De=X[ve];if("offset"!==ve)switch(Pe=s.normalizePropertyName(Pe,M),De){case T.k1:De=l[ve];break;case T.l3:De=_[ve];break;default:De=s.normalizeStyleValue(ve,Pe,De,M)}fe[Pe]=De}),oe||w.push(fe),V=fe,N=re}),M.length)throw function en(n){return new e.vHH(3502,C)}();return w}function Pn(n,s,t,o){switch(s){case"start":n.onStart(()=>o(t&&Xn(t,"start",n)));break;case"done":n.onDone(()=>o(t&&Xn(t,"done",n)));break;case"destroy":n.onDestroy(()=>o(t&&Xn(t,"destroy",n)))}}function Xn(n,s,t){const o=t.totalTime,_=dr(n.element,n.triggerName,n.fromState,n.toState,s||n.phaseName,null==o?n.totalTime:o,!!t.disabled),M=n._data;return null!=M&&(_._data=M),_}function dr(n,s,t,o,l="",_=0,M){return{element:n,triggerName:s,fromState:t,toState:o,phaseName:l,totalTime:_,disabled:!!M}}function Qr(n,s,t){let o;return n instanceof Map?(o=n.get(s),o||n.set(s,o=t)):(o=n[s],o||(o=n[s]=t)),o}function Ci(n){const s=n.indexOf(":");return[n.substring(1,s),n.substr(s+1)]}let _i=(n,s)=>!1,so=(n,s,t)=>[],Ro=null;function Sr(n){const s=n.parentNode||n.host;return s===Ro?null:s}(ur()||"undefined"!=typeof Element)&&(mi()?(Ro=(()=>document.documentElement)(),_i=(n,s)=>{for(;s;){if(s===n)return!0;s=Sr(s)}return!1}):_i=(n,s)=>n.contains(s),so=(n,s,t)=>{if(t)return Array.from(n.querySelectorAll(s));const o=n.querySelector(s);return o?[o]:[]});let jn=null,Jn=!1;function Gn(n){jn||(jn=function Xr(){return"undefined"!=typeof document?document.body:null}()||{},Jn=!!jn.style&&"WebkitAppearance"in jn.style);let s=!0;return jn.style&&!function un(n){return"ebkit"==n.substring(1,6)}(n)&&(s=n in jn.style,!s&&Jn&&(s="Webkit"+n.charAt(0).toUpperCase()+n.substr(1)in jn.style)),s}const Zi=_i,ii=so;let Ki=(()=>{class n{validateStyleProperty(t){return Gn(t)}matchesElement(t,o){return!1}containsElement(t,o){return Zi(t,o)}getParentElement(t){return Sr(t)}query(t,o,l){return ii(t,o,l)}computeStyle(t,o,l){return l||""}animate(t,o,l,_,M,w=[],N){return new T.ZN(l,_)}}return n.\u0275fac=function(t){return new(t||n)},n.\u0275prov=e.Yz7({token:n,factory:n.\u0275fac}),n})(),ln=(()=>{class n{}return n.NOOP=new Ki,n})();const Sn="ng-enter",Or="ng-leave",ri="ng-trigger",vi=".ng-trigger",Ui="ng-animating",ao=".ng-animating";function dt(n){if("number"==typeof n)return n;const s=n.match(/^(-?[\.\d]+)(m?s)/);return!s||s.length<2?0:Bi(parseFloat(s[1]),s[2])}function Bi(n,s){return"s"===s?1e3*n:n}function to(n,s,t){return n.hasOwnProperty("duration")?n:function Gt(n,s,t){let l,_=0,M="";if("string"==typeof n){const w=n.match(/^(-?[\.\d]+)(m?s)(?:\s+(-?[\.\d]+)(m?s))?(?:\s+([-a-z]+(?:\(.+?\))?))?$/i);if(null===w)return s.push(L()),{duration:0,delay:0,easing:""};l=Bi(parseFloat(w[1]),w[2]);const N=w[3];null!=N&&(_=Bi(parseFloat(N),w[4]));const V=w[5];V&&(M=V)}else l=n;if(!t){let w=!1,N=s.length;l<0&&(s.push(function z(){return new e.vHH(3100,C)}()),w=!0),_<0&&(s.push(function W(){return new e.vHH(3101,C)}()),w=!0),w&&s.splice(N,0,L())}return{duration:l,delay:_,easing:M}}(n,s,t)}function Rn(n,s={}){return Object.keys(n).forEach(t=>{s[t]=n[t]}),s}function Rt(n,s,t={}){if(s)for(let o in n)t[o]=n[o];else Rn(n,t);return t}function ct(n,s,t){return t?s+":"+t+";":""}function pt(n){let s="";for(let t=0;t<n.style.length;t++){const o=n.style.item(t);s+=ct(0,o,n.style.getPropertyValue(o))}for(const t in n.style)n.style.hasOwnProperty(t)&&!t.startsWith("_")&&(s+=ct(0,Ko(t),n.style[t]));n.setAttribute("style",s)}function kt(n,s,t){n.style&&(Object.keys(s).forEach(o=>{const l=Fo(o);t&&!t.hasOwnProperty(o)&&(t[o]=n.style[l]),n.style[l]=s[o]}),ur()&&pt(n))}function dn(n,s){n.style&&(Object.keys(s).forEach(t=>{const o=Fo(t);n.style[o]=""}),ur()&&pt(n))}function mr(n){return Array.isArray(n)?1==n.length?n[0]:(0,T.vP)(n):n}const di=new RegExp("{{\\s*(.+?)\\s*}}","g");function Uo(n){let s=[];if("string"==typeof n){let t;for(;t=di.exec(n);)s.push(t[1]);di.lastIndex=0}return s}function Qo(n,s,t){const o=n.toString(),l=o.replace(di,(_,M)=>{let w=s[M];return s.hasOwnProperty(M)||(t.push(function ee(n){return new e.vHH(3003,C)}()),w=""),w.toString()});return l==o?n:l}function lo(n){const s=[];let t=n.next();for(;!t.done;)s.push(t.value),t=n.next();return s}const Ai=/-+([a-z0-9])/g;function Fo(n){return n.replace(Ai,(...s)=>s[1].toUpperCase())}function Ko(n){return n.replace(/([a-z])([A-Z])/g,"$1-$2").toLowerCase()}function wn(n,s,t){switch(s.type){case 7:return n.visitTrigger(s,t);case 0:return n.visitState(s,t);case 1:return n.visitTransition(s,t);case 2:return n.visitSequence(s,t);case 3:return n.visitGroup(s,t);case 4:return n.visitAnimate(s,t);case 5:return n.visitKeyframes(s,t);case 6:return n.visitStyle(s,t);case 8:return n.visitReference(s,t);case 9:return n.visitAnimateChild(s,t);case 10:return n.visitAnimateRef(s,t);case 11:return n.visitQuery(s,t);case 12:return n.visitStagger(s,t);default:throw function ce(n){return new e.vHH(3004,C)}()}}function Qn(n,s){return window.getComputedStyle(n)[s]}function vr(n,s){const t=[];return"string"==typeof n?n.split(/\s*,\s*/).forEach(o=>function yr(n,s,t){if(":"==n[0]){const N=function or(n,s){switch(n){case":enter":return"void => *";case":leave":return"* => void";case":increment":return(t,o)=>parseFloat(o)>parseFloat(t);case":decrement":return(t,o)=>parseFloat(o)<parseFloat(t);default:return s.push(function je(n){return new e.vHH(3016,C)}()),"* => *"}}(n,t);if("function"==typeof N)return void s.push(N);n=N}const o=n.match(/^(\*|[-\w]+)\s*(<?[=-]>)\s*(\*|[-\w]+)$/);if(null==o||o.length<4)return t.push(function xe(n){return new e.vHH(3015,C)}()),s;const l=o[1],_=o[2],M=o[3];s.push(xn(l,M));"<"==_[0]&&!("*"==l&&"*"==M)&&s.push(xn(M,l))}(o,t,s)):t.push(n),t}const si=new Set(["true","1"]),pn=new Set(["false","0"]);function xn(n,s){const t=si.has(n)||pn.has(n),o=si.has(s)||pn.has(s);return(l,_)=>{let M="*"==n||n==l,w="*"==s||s==_;return!M&&t&&"boolean"==typeof l&&(M=l?si.has(n):pn.has(n)),!w&&o&&"boolean"==typeof _&&(w=_?si.has(s):pn.has(s)),M&&w}}const no=new RegExp("s*:selfs*,?","g");function mo(n,s,t,o){return new Us(n).build(s,t,o)}class Us{constructor(s){this._driver=s}build(s,t,o){const l=new ga(t);this._resetContextStyleTimingState(l);const _=wn(this,mr(s),l);return l.unsupportedCSSPropertiesFound.size&&l.unsupportedCSSPropertiesFound.keys(),_}_resetContextStyleTimingState(s){s.currentQuerySelector="",s.collectedStyles={},s.collectedStyles[""]={},s.currentTime=0}visitTrigger(s,t){let o=t.queryCount=0,l=t.depCount=0;const _=[],M=[];return"@"==s.name.charAt(0)&&t.errors.push(function U(){return new e.vHH(3006,C)}()),s.definitions.forEach(w=>{if(this._resetContextStyleTimingState(t),0==w.type){const N=w,V=N.name;V.toString().split(/\s*,\s*/).forEach(X=>{N.name=X,_.push(this.visitState(N,t))}),N.name=V}else if(1==w.type){const N=this.visitTransition(w,t);o+=N.queryCount,l+=N.depCount,M.push(N)}else t.errors.push(function se(){return new e.vHH(3007,C)}())}),{type:7,name:s.name,states:_,transitions:M,queryCount:o,depCount:l,options:null}}visitState(s,t){const o=this.visitStyle(s.styles,t),l=s.options&&s.options.params||null;if(o.containsDynamicStyles){const _=new Set,M=l||{};o.styles.forEach(w=>{if(fa(w)){const N=w;Object.keys(N).forEach(V=>{Uo(N[V]).forEach(X=>{M.hasOwnProperty(X)||_.add(X)})})}}),_.size&&(lo(_.values()),t.errors.push(function ge(n,s){return new e.vHH(3008,C)}()))}return{type:0,name:s.name,style:o,options:l?{params:l}:null}}visitTransition(s,t){t.queryCount=0,t.depCount=0;const o=wn(this,mr(s.animation),t);return{type:1,matchers:vr(s.expr,t.errors),animation:o,queryCount:t.queryCount,depCount:t.depCount,options:Pa(s.options)}}visitSequence(s,t){return{type:2,steps:s.steps.map(o=>wn(this,o,t)),options:Pa(s.options)}}visitGroup(s,t){const o=t.currentTime;let l=0;const _=s.steps.map(M=>{t.currentTime=o;const w=wn(this,M,t);return l=Math.max(l,t.currentTime),w});return t.currentTime=l,{type:3,steps:_,options:Pa(s.options)}}visitAnimate(s,t){const o=function la(n,s){if(n.hasOwnProperty("duration"))return n;if("number"==typeof n)return fl(to(n,s).duration,0,"");const t=n;if(t.split(/\s+/).some(_=>"{"==_.charAt(0)&&"{"==_.charAt(1))){const _=fl(0,0,"");return _.dynamic=!0,_.strValue=t,_}const l=to(t,s);return fl(l.duration,l.delay,l.easing)}(s.timings,t.errors);t.currentAnimateTimings=o;let l,_=s.styles?s.styles:(0,T.oB)({});if(5==_.type)l=this.visitKeyframes(_,t);else{let M=s.styles,w=!1;if(!M){w=!0;const V={};o.easing&&(V.easing=o.easing),M=(0,T.oB)(V)}t.currentTime+=o.duration+o.delay;const N=this.visitStyle(M,t);N.isEmptyStep=w,l=N}return t.currentAnimateTimings=null,{type:4,timings:o,style:l,options:null}}visitStyle(s,t){const o=this._makeStyleAst(s,t);return this._validateStyleAst(o,t),o}_makeStyleAst(s,t){const o=[];Array.isArray(s.styles)?s.styles.forEach(M=>{"string"==typeof M?M==T.l3?o.push(M):t.errors.push(function ae(n){return new e.vHH(3002,C)}()):o.push(M)}):o.push(s.styles);let l=!1,_=null;return o.forEach(M=>{if(fa(M)){const w=M,N=w.easing;if(N&&(_=N,delete w.easing),!l)for(let V in w)if(w[V].toString().indexOf("{{")>=0){l=!0;break}}}),{type:6,styles:o,easing:_,offset:s.offset,containsDynamicStyles:l,options:null}}_validateStyleAst(s,t){const o=t.currentAnimateTimings;let l=t.currentTime,_=t.currentTime;o&&_>0&&(_-=o.duration+o.delay),s.styles.forEach(M=>{"string"!=typeof M&&Object.keys(M).forEach(w=>{if(!this._driver.validateStyleProperty(w))return delete M[w],void t.unsupportedCSSPropertiesFound.add(w);const N=t.collectedStyles[t.currentQuerySelector],V=N[w];let X=!0;V&&(_!=l&&_>=V.startTime&&l<=V.endTime&&(t.errors.push(function be(n,s,t,o,l){return new e.vHH(3010,C)}()),X=!1),_=V.startTime),X&&(N[w]={startTime:_,endTime:l}),t.options&&function Oi(n,s,t){const o=s.params||{},l=Uo(n);l.length&&l.forEach(_=>{o.hasOwnProperty(_)||t.push(function J(n){return new e.vHH(3001,C)}())})}(M[w],t.options,t.errors)})})}visitKeyframes(s,t){const o={type:5,styles:[],options:null};if(!t.currentAnimateTimings)return t.errors.push(function we(){return new e.vHH(3011,C)}()),o;let _=0;const M=[];let w=!1,N=!1,V=0;const X=s.steps.map(Ie=>{const Ae=this._makeStyleAst(Ie,t);let Y=null!=Ae.offset?Ae.offset:function ya(n){if("string"==typeof n)return null;let s=null;if(Array.isArray(n))n.forEach(t=>{if(fa(t)&&t.hasOwnProperty("offset")){const o=t;s=parseFloat(o.offset),delete o.offset}});else if(fa(n)&&n.hasOwnProperty("offset")){const t=n;s=parseFloat(t.offset),delete t.offset}return s}(Ae.styles),Et=0;return null!=Y&&(_++,Et=Ae.offset=Y),N=N||Et<0||Et>1,w=w||Et<V,V=Et,M.push(Et),Ae});N&&t.errors.push(function ue(){return new e.vHH(3012,C)}()),w&&t.errors.push(function st(){return new e.vHH(3200,C)}());const re=s.steps.length;let oe=0;_>0&&_<re?t.errors.push(function We(){return new e.vHH(3202,C)}()):0==_&&(oe=1/(re-1));const fe=re-1,ve=t.currentTime,Pe=t.currentAnimateTimings,De=Pe.duration;return X.forEach((Ie,Ae)=>{const Y=oe>0?Ae==fe?1:oe*Ae:M[Ae],Et=Y*De;t.currentTime=ve+Pe.delay+Et,Pe.duration=Et,this._validateStyleAst(Ie,t),Ie.offset=Y,o.styles.push(Ie)}),o}visitReference(s,t){return{type:8,animation:wn(this,mr(s.animation),t),options:Pa(s.options)}}visitAnimateChild(s,t){return t.depCount++,{type:9,options:Pa(s.options)}}visitAnimateRef(s,t){return{type:10,animation:this.visitReference(s.animation,t),options:Pa(s.options)}}visitQuery(s,t){const o=t.currentQuerySelector,l=s.options||{};t.queryCount++,t.currentQuery=s;const[_,M]=function cs(n){const s=!!n.split(/\s*,\s*/).find(t=>":self"==t);return s&&(n=n.replace(no,"")),n=n.replace(/@\*/g,vi).replace(/@\w+/g,t=>vi+"-"+t.substr(1)).replace(/:animating/g,ao),[n,s]}(s.selector);t.currentQuerySelector=o.length?o+" "+_:_,Qr(t.collectedStyles,t.currentQuerySelector,{});const w=wn(this,mr(s.animation),t);return t.currentQuery=null,t.currentQuerySelector=o,{type:11,selector:_,limit:l.limit||0,optional:!!l.optional,includeSelf:M,animation:w,originalSelector:s.selector,options:Pa(s.options)}}visitStagger(s,t){t.currentQuery||t.errors.push(function Ve(){return new e.vHH(3013,C)}());const o="full"===s.timings?{duration:0,delay:0,easing:"full"}:to(s.timings,t.errors,!0);return{type:12,animation:wn(this,mr(s.animation),t),timings:o,options:null}}}class ga{constructor(s){this.errors=s,this.queryCount=0,this.depCount=0,this.currentTransition=null,this.currentQuery=null,this.currentQuerySelector=null,this.currentAnimateTimings=null,this.currentTime=0,this.collectedStyles={},this.options=null,this.unsupportedCSSPropertiesFound=new Set}}function fa(n){return!Array.isArray(n)&&"object"==typeof n}function Pa(n){return n?(n=Rn(n)).params&&(n.params=function es(n){return n?Rn(n):null}(n.params)):n={},n}function fl(n,s,t){return{duration:n,delay:s,easing:t}}function To(n,s,t,o,l,_,M=null,w=!1){return{type:1,element:n,keyframes:s,preStyleProps:t,postStyleProps:o,duration:l,delay:_,totalTime:l+_,easing:M,subTimeline:w}}class ml{constructor(){this._map=new Map}get(s){return this._map.get(s)||[]}append(s,t){let o=this._map.get(s);o||this._map.set(s,o=[]),o.push(...t)}has(s){return this._map.has(s)}clear(){this._map.clear()}}const Za=new RegExp(":enter","g"),tl=new RegExp(":leave","g");function Ys(n,s,t,o,l,_={},M={},w,N,V=[]){return(new ko).buildKeyframes(n,s,t,o,l,_,M,w,N,V)}class ko{buildKeyframes(s,t,o,l,_,M,w,N,V,X=[]){V=V||new ml;const re=new Ps(s,t,V,l,_,X,[]);re.options=N,re.currentTimeline.setStyles([M],null,re.errors,N),wn(this,o,re);const oe=re.timelines.filter(fe=>fe.containsAnimation());if(Object.keys(w).length){let fe;for(let ve=oe.length-1;ve>=0;ve--){const Pe=oe[ve];if(Pe.element===t){fe=Pe;break}}fe&&!fe.allowOnlyTimelineStyles()&&fe.setStyles([w],null,re.errors,N)}return oe.length?oe.map(fe=>fe.buildKeyframes()):[To(t,[],[],[],0,0,"",!1)]}visitTrigger(s,t){}visitState(s,t){}visitTransition(s,t){}visitAnimateChild(s,t){const o=t.subInstructions.get(t.element);if(o){const l=t.createSubContext(s.options),_=t.currentTimeline.currentTime,M=this._visitSubInstructions(o,l,l.options);_!=M&&t.transformIntoNewTimeline(M)}t.previousNode=s}visitAnimateRef(s,t){const o=t.createSubContext(s.options);o.transformIntoNewTimeline(),this.visitReference(s.animation,o),t.transformIntoNewTimeline(o.currentTimeline.currentTime),t.previousNode=s}_visitSubInstructions(s,t,o){let _=t.currentTimeline.currentTime;const M=null!=o.duration?dt(o.duration):null,w=null!=o.delay?dt(o.delay):null;return 0!==M&&s.forEach(N=>{const V=t.appendInstructionToTimeline(N,M,w);_=Math.max(_,V.duration+V.delay)}),_}visitReference(s,t){t.updateOptions(s.options,!0),wn(this,s.animation,t),t.previousNode=s}visitSequence(s,t){const o=t.subContextCount;let l=t;const _=s.options;if(_&&(_.params||_.delay)&&(l=t.createSubContext(_),l.transformIntoNewTimeline(),null!=_.delay)){6==l.previousNode.type&&(l.currentTimeline.snapshotCurrentStyles(),l.previousNode=Co);const M=dt(_.delay);l.delayNextStep(M)}s.steps.length&&(s.steps.forEach(M=>wn(this,M,l)),l.currentTimeline.applyStylesToKeyframe(),l.subContextCount>o&&l.transformIntoNewTimeline()),t.previousNode=s}visitGroup(s,t){const o=[];let l=t.currentTimeline.currentTime;const _=s.options&&s.options.delay?dt(s.options.delay):0;s.steps.forEach(M=>{const w=t.createSubContext(s.options);_&&w.delayNextStep(_),wn(this,M,w),l=Math.max(l,w.currentTimeline.currentTime),o.push(w.currentTimeline)}),o.forEach(M=>t.currentTimeline.mergeTimelineCollectedStyles(M)),t.transformIntoNewTimeline(l),t.previousNode=s}_visitTiming(s,t){if(s.dynamic){const o=s.strValue;return to(t.params?Qo(o,t.params,t.errors):o,t.errors)}return{duration:s.duration,delay:s.delay,easing:s.easing}}visitAnimate(s,t){const o=t.currentAnimateTimings=this._visitTiming(s.timings,t),l=t.currentTimeline;o.delay&&(t.incrementTime(o.delay),l.snapshotCurrentStyles());const _=s.style;5==_.type?this.visitKeyframes(_,t):(t.incrementTime(o.duration),this.visitStyle(_,t),l.applyStylesToKeyframe()),t.currentAnimateTimings=null,t.previousNode=s}visitStyle(s,t){const o=t.currentTimeline,l=t.currentAnimateTimings;!l&&o.getCurrentStyleProperties().length&&o.forwardFrame();const _=l&&l.easing||s.easing;s.isEmptyStep?o.applyEmptyStep(_):o.setStyles(s.styles,_,t.errors,t.options),t.previousNode=s}visitKeyframes(s,t){const o=t.currentAnimateTimings,l=t.currentTimeline.duration,_=o.duration,w=t.createSubContext().currentTimeline;w.easing=o.easing,s.styles.forEach(N=>{w.forwardTime((N.offset||0)*_),w.setStyles(N.styles,N.easing,t.errors,t.options),w.applyStylesToKeyframe()}),t.currentTimeline.mergeTimelineCollectedStyles(w),t.transformIntoNewTimeline(l+_),t.previousNode=s}visitQuery(s,t){const o=t.currentTimeline.currentTime,l=s.options||{},_=l.delay?dt(l.delay):0;_&&(6===t.previousNode.type||0==o&&t.currentTimeline.getCurrentStyleProperties().length)&&(t.currentTimeline.snapshotCurrentStyles(),t.previousNode=Co);let M=o;const w=t.invokeQuery(s.selector,s.originalSelector,s.limit,s.includeSelf,!!l.optional,t.errors);t.currentQueryTotal=w.length;let N=null;w.forEach((V,X)=>{t.currentQueryIndex=X;const re=t.createSubContext(s.options,V);_&&re.delayNextStep(_),V===t.element&&(N=re.currentTimeline),wn(this,s.animation,re),re.currentTimeline.applyStylesToKeyframe(),M=Math.max(M,re.currentTimeline.currentTime)}),t.currentQueryIndex=0,t.currentQueryTotal=0,t.transformIntoNewTimeline(M),N&&(t.currentTimeline.mergeTimelineCollectedStyles(N),t.currentTimeline.snapshotCurrentStyles()),t.previousNode=s}visitStagger(s,t){const o=t.parentContext,l=t.currentTimeline,_=s.timings,M=Math.abs(_.duration),w=M*(t.currentQueryTotal-1);let N=M*t.currentQueryIndex;switch(_.duration<0?"reverse":_.easing){case"reverse":N=w-N;break;case"full":N=o.currentStaggerTime}const X=t.currentTimeline;N&&X.delayNextStep(N);const re=X.currentTime;wn(this,s.animation,t),t.previousNode=s,o.currentStaggerTime=l.currentTime-re+(l.startTime-o.currentTimeline.startTime)}}const Co={};class Ps{constructor(s,t,o,l,_,M,w,N){this._driver=s,this.element=t,this.subInstructions=o,this._enterClassName=l,this._leaveClassName=_,this.errors=M,this.timelines=w,this.parentContext=null,this.currentAnimateTimings=null,this.previousNode=Co,this.subContextCount=0,this.options={},this.currentQueryIndex=0,this.currentQueryTotal=0,this.currentStaggerTime=0,this.currentTimeline=N||new ps(this._driver,t,0),w.push(this.currentTimeline)}get params(){return this.options.params}updateOptions(s,t){if(!s)return;const o=s;let l=this.options;null!=o.duration&&(l.duration=dt(o.duration)),null!=o.delay&&(l.delay=dt(o.delay));const _=o.params;if(_){let M=l.params;M||(M=this.options.params={}),Object.keys(_).forEach(w=>{(!t||!M.hasOwnProperty(w))&&(M[w]=Qo(_[w],M,this.errors))})}}_copyOptions(){const s={};if(this.options){const t=this.options.params;if(t){const o=s.params={};Object.keys(t).forEach(l=>{o[l]=t[l]})}}return s}createSubContext(s=null,t,o){const l=t||this.element,_=new Ps(this._driver,l,this.subInstructions,this._enterClassName,this._leaveClassName,this.errors,this.timelines,this.currentTimeline.fork(l,o||0));return _.previousNode=this.previousNode,_.currentAnimateTimings=this.currentAnimateTimings,_.options=this._copyOptions(),_.updateOptions(s),_.currentQueryIndex=this.currentQueryIndex,_.currentQueryTotal=this.currentQueryTotal,_.parentContext=this,this.subContextCount++,_}transformIntoNewTimeline(s){return this.previousNode=Co,this.currentTimeline=this.currentTimeline.fork(this.element,s),this.timelines.push(this.currentTimeline),this.currentTimeline}appendInstructionToTimeline(s,t,o){const l={duration:null!=t?t:s.duration,delay:this.currentTimeline.currentTime+(null!=o?o:0)+s.delay,easing:""},_=new Oo(this._driver,s.element,s.keyframes,s.preStyleProps,s.postStyleProps,l,s.stretchStartingKeyframe);return this.timelines.push(_),l}incrementTime(s){this.currentTimeline.forwardTime(this.currentTimeline.duration+s)}delayNextStep(s){s>0&&this.currentTimeline.delayNextStep(s)}invokeQuery(s,t,o,l,_,M){let w=[];if(l&&w.push(this.element),s.length>0){s=(s=s.replace(Za,"."+this._enterClassName)).replace(tl,"."+this._leaveClassName);let V=this._driver.query(this.element,s,1!=o);0!==o&&(V=o<0?V.slice(V.length+o,V.length):V.slice(0,o)),w.push(...V)}return!_&&0==w.length&&M.push(function Be(n){return new e.vHH(3014,C)}()),w}}class ps{constructor(s,t,o,l){this._driver=s,this.element=t,this.startTime=o,this._elementTimelineStylesLookup=l,this.duration=0,this._previousKeyframe={},this._currentKeyframe={},this._keyframes=new Map,this._styleSummary={},this._pendingStyles={},this._backFill={},this._currentEmptyStepKeyframe=null,this._elementTimelineStylesLookup||(this._elementTimelineStylesLookup=new Map),this._localTimelineStyles=Object.create(this._backFill,{}),this._globalTimelineStyles=this._elementTimelineStylesLookup.get(t),this._globalTimelineStyles||(this._globalTimelineStyles=this._localTimelineStyles,this._elementTimelineStylesLookup.set(t,this._localTimelineStyles)),this._loadKeyframe()}containsAnimation(){switch(this._keyframes.size){case 0:return!1;case 1:return this.getCurrentStyleProperties().length>0;default:return!0}}getCurrentStyleProperties(){return Object.keys(this._currentKeyframe)}get currentTime(){return this.startTime+this.duration}delayNextStep(s){const t=1==this._keyframes.size&&Object.keys(this._pendingStyles).length;this.duration||t?(this.forwardTime(this.currentTime+s),t&&this.snapshotCurrentStyles()):this.startTime+=s}fork(s,t){return this.applyStylesToKeyframe(),new ps(this._driver,s,t||this.currentTime,this._elementTimelineStylesLookup)}_loadKeyframe(){this._currentKeyframe&&(this._previousKeyframe=this._currentKeyframe),this._currentKeyframe=this._keyframes.get(this.duration),this._currentKeyframe||(this._currentKeyframe=Object.create(this._backFill,{}),this._keyframes.set(this.duration,this._currentKeyframe))}forwardFrame(){this.duration+=1,this._loadKeyframe()}forwardTime(s){this.applyStylesToKeyframe(),this.duration=s,this._loadKeyframe()}_updateStyle(s,t){this._localTimelineStyles[s]=t,this._globalTimelineStyles[s]=t,this._styleSummary[s]={time:this.currentTime,value:t}}allowOnlyTimelineStyles(){return this._currentEmptyStepKeyframe!==this._currentKeyframe}applyEmptyStep(s){s&&(this._previousKeyframe.easing=s),Object.keys(this._globalTimelineStyles).forEach(t=>{this._backFill[t]=this._globalTimelineStyles[t]||T.l3,this._currentKeyframe[t]=T.l3}),this._currentEmptyStepKeyframe=this._currentKeyframe}setStyles(s,t,o,l){t&&(this._previousKeyframe.easing=t);const _=l&&l.params||{},M=function Qi(n,s){const t={};let o;return n.forEach(l=>{"*"===l?(o=o||Object.keys(s),o.forEach(_=>{t[_]=T.l3})):Rt(l,!1,t)}),t}(s,this._globalTimelineStyles);Object.keys(M).forEach(w=>{const N=Qo(M[w],_,o);this._pendingStyles[w]=N,this._localTimelineStyles.hasOwnProperty(w)||(this._backFill[w]=this._globalTimelineStyles.hasOwnProperty(w)?this._globalTimelineStyles[w]:T.l3),this._updateStyle(w,N)})}applyStylesToKeyframe(){const s=this._pendingStyles,t=Object.keys(s);0!=t.length&&(this._pendingStyles={},t.forEach(o=>{this._currentKeyframe[o]=s[o]}),Object.keys(this._localTimelineStyles).forEach(o=>{this._currentKeyframe.hasOwnProperty(o)||(this._currentKeyframe[o]=this._localTimelineStyles[o])}))}snapshotCurrentStyles(){Object.keys(this._localTimelineStyles).forEach(s=>{const t=this._localTimelineStyles[s];this._pendingStyles[s]=t,this._updateStyle(s,t)})}getFinalKeyframe(){return this._keyframes.get(this.duration)}get properties(){const s=[];for(let t in this._currentKeyframe)s.push(t);return s}mergeTimelineCollectedStyles(s){Object.keys(s._styleSummary).forEach(t=>{const o=this._styleSummary[t],l=s._styleSummary[t];(!o||l.time>o.time)&&this._updateStyle(t,l.value)})}buildKeyframes(){this.applyStylesToKeyframe();const s=new Set,t=new Set,o=1===this._keyframes.size&&0===this.duration;let l=[];this._keyframes.forEach((w,N)=>{const V=Rt(w,!0);Object.keys(V).forEach(X=>{const re=V[X];re==T.k1?s.add(X):re==T.l3&&t.add(X)}),o||(V.offset=N/this.duration),l.push(V)});const _=s.size?lo(s.values()):[],M=t.size?lo(t.values()):[];if(o){const w=l[0],N=Rn(w);w.offset=0,N.offset=1,l=[w,N]}return To(this.element,l,_,M,this.duration,this.startTime,this.easing,!1)}}class Oo extends ps{constructor(s,t,o,l,_,M,w=!1){super(s,t,M.delay),this.keyframes=o,this.preStyleProps=l,this.postStyleProps=_,this._stretchStartingKeyframe=w,this.timings={duration:M.duration,delay:M.delay,easing:M.easing}}containsAnimation(){return this.keyframes.length>1}buildKeyframes(){let s=this.keyframes,{delay:t,duration:o,easing:l}=this.timings;if(this._stretchStartingKeyframe&&t){const _=[],M=o+t,w=t/M,N=Rt(s[0],!1);N.offset=0,_.push(N);const V=Rt(s[0],!1);V.offset=Nr(w),_.push(V);const X=s.length-1;for(let re=1;re<=X;re++){let oe=Rt(s[re],!1);oe.offset=Nr((t+oe.offset*o)/M),_.push(oe)}o=M,t=0,l="",s=_}return To(this.element,s,this.preStyleProps,this.postStyleProps,o,t,l,!0)}}function Nr(n,s=3){const t=Math.pow(10,s-1);return Math.round(n*t)/t}class rn{}class Le extends rn{normalizePropertyName(s,t){return Fo(s)}normalizeStyleValue(s,t,o,l){let _="";const M=o.toString().trim();if(Lt[t]&&0!==o&&"0"!==o)if("number"==typeof o)_="px";else{const w=o.match(/^[+-]?[\d\.]+([a-z]*)$/);w&&0==w[1].length&&l.push(function ie(n,s){return new e.vHH(3005,C)}())}return M+_}}const Lt=(()=>function on(n){const s={};return n.forEach(t=>s[t]=!0),s}("width,height,minWidth,minHeight,maxWidth,maxHeight,left,top,bottom,right,fontSize,outlineWidth,outlineOffset,paddingTop,paddingLeft,paddingBottom,paddingRight,marginTop,marginLeft,marginBottom,marginRight,borderRadius,borderWidth,borderTopWidth,borderLeftWidth,borderRightWidth,borderBottomWidth,textIndent,perspective".split(",")))();function Kr(n,s,t,o,l,_,M,w,N,V,X,re,oe){return{type:0,element:n,triggerName:s,isRemovalTransition:l,fromState:t,fromStyles:_,toState:o,toStyles:M,timelines:w,queriedElements:N,preStyleProps:V,postStyleProps:X,totalTime:re,errors:oe}}const bi={};class Ii{constructor(s,t,o){this._triggerName=s,this.ast=t,this._stateStyles=o}match(s,t,o,l){return function hs(n,s,t,o,l){return n.some(_=>_(s,t,o,l))}(this.ast.matchers,s,t,o,l)}buildStyles(s,t,o){const l=this._stateStyles["*"],_=this._stateStyles[s],M=l?l.buildStyles(t,o):{};return _?_.buildStyles(t,o):M}build(s,t,o,l,_,M,w,N,V,X){const re=[],oe=this.ast.options&&this.ast.options.params||bi,ve=this.buildStyles(o,w&&w.params||bi,re),Pe=N&&N.params||bi,De=this.buildStyles(l,Pe,re),Ie=new Set,Ae=new Map,Y=new Map,Et="void"===l,ft={params:Object.assign(Object.assign({},oe),Pe)},xt=X?[]:Ys(s,t,this.ast.animation,_,M,ve,De,ft,V,re);let Ht=0;if(xt.forEach(It=>{Ht=Math.max(It.duration+It.delay,Ht)}),re.length)return Kr(t,this._triggerName,o,l,Et,ve,De,[],[],Ae,Y,Ht,re);xt.forEach(It=>{const In=It.element,On=Qr(Ae,In,{});It.preStyleProps.forEach(Ir=>On[Ir]=!0);const Yr=Qr(Y,In,{});It.postStyleProps.forEach(Ir=>Yr[Ir]=!0),In!==t&&Ie.add(In)});const yn=lo(Ie.values());return Kr(t,this._triggerName,o,l,Et,ve,De,xt,yn,Ae,Y,Ht)}}class zo{constructor(s,t,o){this.styles=s,this.defaultParams=t,this.normalizer=o}buildStyles(s,t){const o={},l=Rn(this.defaultParams);return Object.keys(s).forEach(_=>{const M=s[_];null!=M&&(l[_]=M)}),this.styles.styles.forEach(_=>{if("string"!=typeof _){const M=_;Object.keys(M).forEach(w=>{let N=M[w];N.length>1&&(N=Qo(N,l,t));const V=this.normalizer.normalizePropertyName(w,t);N=this.normalizer.normalizeStyleValue(w,V,N,t),o[V]=N})}}),o}}class Xs{constructor(s,t,o){this.name=s,this.ast=t,this._normalizer=o,this.transitionFactories=[],this.states={},t.states.forEach(l=>{this.states[l.name]=new zo(l.style,l.options&&l.options.params||{},o)}),ol(this.states,"true","1"),ol(this.states,"false","0"),t.transitions.forEach(l=>{this.transitionFactories.push(new Ii(s,l,this.states))}),this.fallbackTransition=function vl(n,s,t){return new Ii(n,{type:1,animation:{type:2,steps:[],options:null},matchers:[(M,w)=>!0],options:null,queryCount:0,depCount:0},s)}(s,this.states)}get containsQueries(){return this.ast.queryCount>0}matchTransition(s,t,o,l){return this.transitionFactories.find(M=>M.match(s,t,o,l))||null}matchStyles(s,t,o){return this.fallbackTransition.buildStyles(s,t,o)}}function ol(n,s,t){n.hasOwnProperty(s)?n.hasOwnProperty(t)||(n[t]=n[s]):n.hasOwnProperty(t)&&(n[s]=n[t])}const Wl=new ml;class Qu{constructor(s,t,o){this.bodyNode=s,this._driver=t,this._normalizer=o,this._animations={},this._playersById={},this.players=[]}register(s,t){const o=[],_=mo(this._driver,t,o,[]);if(o.length)throw function Pt(n){return new e.vHH(3503,C)}();this._animations[s]=_}_buildPlayer(s,t,o){const l=s.element,_=Br(0,this._normalizer,0,s.keyframes,t,o);return this._driver.animate(l,_,s.duration,s.delay,s.easing,[],!0)}create(s,t,o={}){const l=[],_=this._animations[s];let M;const w=new Map;if(_?(M=Ys(this._driver,t,_,Sn,Or,{},{},o,Wl,l),M.forEach(X=>{const re=Qr(w,X.element,{});X.postStyleProps.forEach(oe=>re[oe]=null)})):(l.push(function Vt(){return new e.vHH(3300,C)}()),M=[]),l.length)throw function hn(n){return new e.vHH(3504,C)}();w.forEach((X,re)=>{Object.keys(X).forEach(oe=>{X[oe]=this._driver.computeStyle(re,oe,T.l3)})});const V=$r(M.map(X=>{const re=w.get(X.element);return this._buildPlayer(X,{},re)}));return this._playersById[s]=V,V.onDestroy(()=>this.destroy(s)),this.players.push(V),V}destroy(s){const t=this._getPlayer(s);t.destroy(),delete this._playersById[s];const o=this.players.indexOf(t);o>=0&&this.players.splice(o,1)}_getPlayer(s){const t=this._playersById[s];if(!t)throw function vn(n){return new e.vHH(3301,C)}();return t}listen(s,t,o,l){const _=dr(t,"","","");return Pn(this._getPlayer(s),o,_,l),()=>{}}command(s,t,o,l){if("register"==o)return void this.register(s,l[0]);if("create"==o)return void this.create(s,t,l[0]||{});const _=this._getPlayer(s);switch(o){case"play":_.play();break;case"pause":_.pause();break;case"reset":_.reset();break;case"restart":_.restart();break;case"finish":_.finish();break;case"init":_.init();break;case"setPosition":_.setPosition(parseFloat(l[0]));break;case"destroy":this.destroy(s)}}}const hc="ng-animate-queued",_c="ng-animate-disabled",Mc=[],tu={namespaceId:"",setForRemoval:!1,setForMove:!1,hasAnimation:!1,removedBeforeQueried:!1},Wa={namespaceId:"",setForMove:!1,setForRemoval:!1,hasAnimation:!1,removedBeforeQueried:!0},Ml="__ng_removed";class Hl{constructor(s,t=""){this.namespaceId=t;const o=s&&s.hasOwnProperty("value");if(this.value=function qr(n){return null!=n?n:null}(o?s.value:s),o){const _=Rn(s);delete _.value,this.options=_}else this.options={};this.options.params||(this.options.params={})}get params(){return this.options.params}absorbOptions(s){const t=s.params;if(t){const o=this.options.params;Object.keys(t).forEach(l=>{null==o[l]&&(o[l]=t[l])})}}}const Ua="void",Qe=new Hl(Ua);class zt{constructor(s,t,o){this.id=s,this.hostElement=t,this._engine=o,this.players=[],this._triggers={},this._queue=[],this._elementListeners=new Map,this._hostClassName="ng-tns-"+s,Io(t,this._hostClassName)}listen(s,t,o,l){if(!this._triggers.hasOwnProperty(t))throw function mt(n,s){return new e.vHH(3302,C)}();if(null==o||0==o.length)throw function Nt(n){return new e.vHH(3303,C)}();if(!function as(n){return"start"==n||"done"==n}(o))throw function St(n,s){return new e.vHH(3400,C)}();const _=Qr(this._elementListeners,s,[]),M={name:t,phase:o,callback:l};_.push(M);const w=Qr(this._engine.statesByElement,s,{});return w.hasOwnProperty(t)||(Io(s,ri),Io(s,ri+"-"+t),w[t]=Qe),()=>{this._engine.afterFlush(()=>{const N=_.indexOf(M);N>=0&&_.splice(N,1),this._triggers[t]||delete w[t]})}}register(s,t){return!this._triggers[s]&&(this._triggers[s]=t,!0)}_getTrigger(s){const t=this._triggers[s];if(!t)throw function Yt(n){return new e.vHH(3401,C)}();return t}trigger(s,t,o,l=!0){const _=this._getTrigger(t),M=new jt(this.id,t,s);let w=this._engine.statesByElement.get(s);w||(Io(s,ri),Io(s,ri+"-"+t),this._engine.statesByElement.set(s,w={}));let N=w[t];const V=new Hl(o,this.id);if(!(o&&o.hasOwnProperty("value"))&&N&&V.absorbOptions(N.options),w[t]=V,N||(N=Qe),V.value!==Ua&&N.value===V.value){if(!function Xe(n,s){const t=Object.keys(n),o=Object.keys(s);if(t.length!=o.length)return!1;for(let l=0;l<t.length;l++){const _=t[l];if(!s.hasOwnProperty(_)||n[_]!==s[_])return!1}return!0}(N.params,V.params)){const Pe=[],De=_.matchStyles(N.value,N.params,Pe),Ie=_.matchStyles(V.value,V.params,Pe);Pe.length?this._engine.reportError(Pe):this._engine.afterFlush(()=>{dn(s,De),kt(s,Ie)})}return}const oe=Qr(this._engine.playersByElement,s,[]);oe.forEach(Pe=>{Pe.namespaceId==this.id&&Pe.triggerName==t&&Pe.queued&&Pe.destroy()});let fe=_.matchTransition(N.value,V.value,s,V.params),ve=!1;if(!fe){if(!l)return;fe=_.fallbackTransition,ve=!0}return this._engine.totalQueuedPlayers++,this._queue.push({element:s,triggerName:t,transition:fe,fromState:N,toState:V,player:M,isFallbackTransition:ve}),ve||(Io(s,hc),M.onStart(()=>{Ka(s,hc)})),M.onDone(()=>{let Pe=this.players.indexOf(M);Pe>=0&&this.players.splice(Pe,1);const De=this._engine.playersByElement.get(s);if(De){let Ie=De.indexOf(M);Ie>=0&&De.splice(Ie,1)}}),this.players.push(M),oe.push(M),M}deregister(s){delete this._triggers[s],this._engine.statesByElement.forEach((t,o)=>{delete t[s]}),this._elementListeners.forEach((t,o)=>{this._elementListeners.set(o,t.filter(l=>l.name!=s))})}clearElementCache(s){this._engine.statesByElement.delete(s),this._elementListeners.delete(s);const t=this._engine.playersByElement.get(s);t&&(t.forEach(o=>o.destroy()),this._engine.playersByElement.delete(s))}_signalRemovalForInnerTriggers(s,t){const o=this._engine.driver.query(s,vi,!0);o.forEach(l=>{if(l[Ml])return;const _=this._engine.fetchNamespacesByElement(l);_.size?_.forEach(M=>M.triggerLeaveAnimation(l,t,!1,!0)):this.clearElementCache(l)}),this._engine.afterFlushAnimationsDone(()=>o.forEach(l=>this.clearElementCache(l)))}triggerLeaveAnimation(s,t,o,l){const _=this._engine.statesByElement.get(s),M=new Map;if(_){const w=[];if(Object.keys(_).forEach(N=>{if(M.set(N,_[N].value),this._triggers[N]){const V=this.trigger(s,N,Ua,l);V&&w.push(V)}}),w.length)return this._engine.markElementAsRemoved(this.id,s,!0,t,M),o&&$r(w).onDone(()=>this._engine.processLeaveNode(s)),!0}return!1}prepareLeaveAnimationListeners(s){const t=this._elementListeners.get(s),o=this._engine.statesByElement.get(s);if(t&&o){const l=new Set;t.forEach(_=>{const M=_.name;if(l.has(M))return;l.add(M);const N=this._triggers[M].fallbackTransition,V=o[M]||Qe,X=new Hl(Ua),re=new jt(this.id,M,s);this._engine.totalQueuedPlayers++,this._queue.push({element:s,triggerName:M,transition:N,fromState:V,toState:X,player:re,isFallbackTransition:!0})})}}removeNode(s,t){const o=this._engine;if(s.childElementCount&&this._signalRemovalForInnerTriggers(s,t),this.triggerLeaveAnimation(s,t,!0))return;let l=!1;if(o.totalAnimations){const _=o.players.length?o.playersByQueriedElement.get(s):[];if(_&&_.length)l=!0;else{let M=s;for(;M=M.parentNode;)if(o.statesByElement.get(M)){l=!0;break}}}if(this.prepareLeaveAnimationListeners(s),l)o.markElementAsRemoved(this.id,s,!1,t);else{const _=s[Ml];(!_||_===tu)&&(o.afterFlush(()=>this.clearElementCache(s)),o.destroyInnerAnimations(s),o._onRemovalComplete(s,t))}}insertNode(s,t){Io(s,this._hostClassName)}drainQueuedTransitions(s){const t=[];return this._queue.forEach(o=>{const l=o.player;if(l.destroyed)return;const _=o.element,M=this._elementListeners.get(_);M&&M.forEach(w=>{if(w.name==o.triggerName){const N=dr(_,o.triggerName,o.fromState.value,o.toState.value);N._data=s,Pn(o.player,w.phase,N,w.callback)}}),l.markedForDestroy?this._engine.afterFlush(()=>{l.destroy()}):t.push(o)}),this._queue=[],t.sort((o,l)=>{const _=o.transition.ast.depCount,M=l.transition.ast.depCount;return 0==_||0==M?_-M:this._engine.driver.containsElement(o.element,l.element)?1:-1})}destroy(s){this.players.forEach(t=>t.destroy()),this._signalRemovalForInnerTriggers(this.hostElement,s)}elementContainsData(s){let t=!1;return this._elementListeners.has(s)&&(t=!0),t=!!this._queue.find(o=>o.element===s)||t,t}}class ot{constructor(s,t,o){this.bodyNode=s,this.driver=t,this._normalizer=o,this.players=[],this.newHostElements=new Map,this.playersByElement=new Map,this.playersByQueriedElement=new Map,this.statesByElement=new Map,this.disabledNodes=new Set,this.totalAnimations=0,this.totalQueuedPlayers=0,this._namespaceLookup={},this._namespaceList=[],this._flushFns=[],this._whenQuietFns=[],this.namespacesByHostElement=new Map,this.collectedEnterElements=[],this.collectedLeaveElements=[],this.onRemovalComplete=(l,_)=>{}}_onRemovalComplete(s,t){this.onRemovalComplete(s,t)}get queuedPlayers(){const s=[];return this._namespaceList.forEach(t=>{t.players.forEach(o=>{o.queued&&s.push(o)})}),s}createNamespace(s,t){const o=new zt(s,t,this);return this.bodyNode&&this.driver.containsElement(this.bodyNode,t)?this._balanceNamespaceList(o,t):(this.newHostElements.set(t,o),this.collectEnterElement(t)),this._namespaceLookup[s]=o}_balanceNamespaceList(s,t){const o=this._namespaceList,l=this.namespacesByHostElement,_=o.length-1;if(_>=0){let M=!1;if(void 0!==this.driver.getParentElement){let w=this.driver.getParentElement(t);for(;w;){const N=l.get(w);if(N){const V=o.indexOf(N);o.splice(V+1,0,s),M=!0;break}w=this.driver.getParentElement(w)}}else for(let w=_;w>=0;w--)if(this.driver.containsElement(o[w].hostElement,t)){o.splice(w+1,0,s),M=!0;break}M||o.unshift(s)}else o.push(s);return l.set(t,s),s}register(s,t){let o=this._namespaceLookup[s];return o||(o=this.createNamespace(s,t)),o}registerTrigger(s,t,o){let l=this._namespaceLookup[s];l&&l.register(t,o)&&this.totalAnimations++}destroy(s,t){if(!s)return;const o=this._fetchNamespace(s);this.afterFlush(()=>{this.namespacesByHostElement.delete(o.hostElement),delete this._namespaceLookup[s];const l=this._namespaceList.indexOf(o);l>=0&&this._namespaceList.splice(l,1)}),this.afterFlushAnimationsDone(()=>o.destroy(t))}_fetchNamespace(s){return this._namespaceLookup[s]}fetchNamespacesByElement(s){const t=new Set,o=this.statesByElement.get(s);if(o){const l=Object.keys(o);for(let _=0;_<l.length;_++){const M=o[l[_]].namespaceId;if(M){const w=this._fetchNamespace(M);w&&t.add(w)}}}return t}trigger(s,t,o,l){if(Di(t)){const _=this._fetchNamespace(s);if(_)return _.trigger(t,o,l),!0}return!1}insertNode(s,t,o,l){if(!Di(t))return;const _=t[Ml];if(_&&_.setForRemoval){_.setForRemoval=!1,_.setForMove=!0;const M=this.collectedLeaveElements.indexOf(t);M>=0&&this.collectedLeaveElements.splice(M,1)}if(s){const M=this._fetchNamespace(s);M&&M.insertNode(t,o)}l&&this.collectEnterElement(t)}collectEnterElement(s){this.collectedEnterElements.push(s)}markElementAsDisabled(s,t){t?this.disabledNodes.has(s)||(this.disabledNodes.add(s),Io(s,_c)):this.disabledNodes.has(s)&&(this.disabledNodes.delete(s),Ka(s,_c))}removeNode(s,t,o,l){if(Di(t)){const _=s?this._fetchNamespace(s):null;if(_?_.removeNode(t,l):this.markElementAsRemoved(s,t,!1,l),o){const M=this.namespacesByHostElement.get(t);M&&M.id!==s&&M.removeNode(t,l)}}else this._onRemovalComplete(t,l)}markElementAsRemoved(s,t,o,l,_){this.collectedLeaveElements.push(t),t[Ml]={namespaceId:s,setForRemoval:l,hasAnimation:o,removedBeforeQueried:!1,previousTriggersValues:_}}listen(s,t,o,l,_){return Di(t)?this._fetchNamespace(s).listen(t,o,l,_):()=>{}}_buildInstruction(s,t,o,l,_){return s.transition.build(this.driver,s.element,s.fromState.value,s.toState.value,o,l,s.fromState.options,s.toState.options,t,_)}destroyInnerAnimations(s){let t=this.driver.query(s,vi,!0);t.forEach(o=>this.destroyActiveAnimationsForElement(o)),0!=this.playersByQueriedElement.size&&(t=this.driver.query(s,ao,!0),t.forEach(o=>this.finishActiveQueriedAnimationOnElement(o)))}destroyActiveAnimationsForElement(s){const t=this.playersByElement.get(s);t&&t.forEach(o=>{o.queued?o.markedForDestroy=!0:o.destroy()})}finishActiveQueriedAnimationOnElement(s){const t=this.playersByQueriedElement.get(s);t&&t.forEach(o=>o.finish())}whenRenderingDone(){return new Promise(s=>{if(this.players.length)return $r(this.players).onDone(()=>s());s()})}processLeaveNode(s){var t;const o=s[Ml];if(o&&o.setForRemoval){if(s[Ml]=tu,o.namespaceId){this.destroyInnerAnimations(s);const l=this._fetchNamespace(o.namespaceId);l&&l.clearElementCache(s)}this._onRemovalComplete(s,o.setForRemoval)}(null===(t=s.classList)||void 0===t?void 0:t.contains(_c))&&this.markElementAsDisabled(s,!1),this.driver.query(s,".ng-animate-disabled",!0).forEach(l=>{this.markElementAsDisabled(l,!1)})}flush(s=-1){let t=[];if(this.newHostElements.size&&(this.newHostElements.forEach((o,l)=>this._balanceNamespaceList(o,l)),this.newHostElements.clear()),this.totalAnimations&&this.collectedEnterElements.length)for(let o=0;o<this.collectedEnterElements.length;o++)Io(this.collectedEnterElements[o],"ng-star-inserted");if(this._namespaceList.length&&(this.totalQueuedPlayers||this.collectedLeaveElements.length)){const o=[];try{t=this._flushAnimations(o,s)}finally{for(let l=0;l<o.length;l++)o[l]()}}else for(let o=0;o<this.collectedLeaveElements.length;o++)this.processLeaveNode(this.collectedLeaveElements[o]);if(this.totalQueuedPlayers=0,this.collectedEnterElements.length=0,this.collectedLeaveElements.length=0,this._flushFns.forEach(o=>o()),this._flushFns=[],this._whenQuietFns.length){const o=this._whenQuietFns;this._whenQuietFns=[],t.length?$r(t).onDone(()=>{o.forEach(l=>l())}):o.forEach(l=>l())}}reportError(s){throw function Fn(n){return new e.vHH(3402,C)}()}_flushAnimations(s,t){const o=new ml,l=[],_=new Map,M=[],w=new Map,N=new Map,V=new Map,X=new Set;this.disabledNodes.forEach(En=>{X.add(En);const Un=this.driver.query(En,".ng-animate-queued",!0);for(let Yn=0;Yn<Un.length;Yn++)X.add(Un[Yn])});const re=this.bodyNode,oe=Array.from(this.statesByElement.keys()),fe=Ns(oe,this.collectedEnterElements),ve=new Map;let Pe=0;fe.forEach((En,Un)=>{const Yn=Sn+Pe++;ve.set(Un,Yn),En.forEach(ir=>Io(ir,Yn))});const De=[],Ie=new Set,Ae=new Set;for(let En=0;En<this.collectedLeaveElements.length;En++){const Un=this.collectedLeaveElements[En],Yn=Un[Ml];Yn&&Yn.setForRemoval&&(De.push(Un),Ie.add(Un),Yn.hasAnimation?this.driver.query(Un,".ng-star-inserted",!0).forEach(ir=>Ie.add(ir)):Ae.add(Un))}const Y=new Map,Et=Ns(oe,Array.from(Ie));Et.forEach((En,Un)=>{const Yn=Or+Pe++;Y.set(Un,Yn),En.forEach(ir=>Io(ir,Yn))}),s.push(()=>{fe.forEach((En,Un)=>{const Yn=ve.get(Un);En.forEach(ir=>Ka(ir,Yn))}),Et.forEach((En,Un)=>{const Yn=Y.get(Un);En.forEach(ir=>Ka(ir,Yn))}),De.forEach(En=>{this.processLeaveNode(En)})});const ft=[],xt=[];for(let En=this._namespaceList.length-1;En>=0;En--)this._namespaceList[En].drainQueuedTransitions(t).forEach(Yn=>{const ir=Yn.player,An=Yn.element;if(ft.push(ir),this.collectedEnterElements.length){const fn=An[Ml];if(fn&&fn.setForMove){if(fn.previousTriggersValues&&fn.previousTriggersValues.has(Yn.triggerName)){const Vr=fn.previousTriggersValues.get(Yn.triggerName),xi=this.statesByElement.get(Yn.element);xi&&xi[Yn.triggerName]&&(xi[Yn.triggerName].value=Vr)}return void ir.destroy()}}const Lr=!re||!this.driver.containsElement(re,An),Wi=Y.get(An),Mi=ve.get(An),Yi=this._buildInstruction(Yn,o,Mi,Wi,Lr);if(Yi.errors&&Yi.errors.length)return void xt.push(Yi);if(Lr)return ir.onStart(()=>dn(An,Yi.fromStyles)),ir.onDestroy(()=>kt(An,Yi.toStyles)),void l.push(ir);if(Yn.isFallbackTransition)return ir.onStart(()=>dn(An,Yi.fromStyles)),ir.onDestroy(()=>kt(An,Yi.toStyles)),void l.push(ir);const jr=[];Yi.timelines.forEach(fn=>{fn.stretchStartingKeyframe=!0,this.disabledNodes.has(fn.element)||jr.push(fn)}),Yi.timelines=jr,o.append(An,Yi.timelines),M.push({instruction:Yi,player:ir,element:An}),Yi.queriedElements.forEach(fn=>Qr(w,fn,[]).push(ir)),Yi.preStyleProps.forEach((fn,Vr)=>{const xi=Object.keys(fn);if(xi.length){let Ji=N.get(Vr);Ji||N.set(Vr,Ji=new Set),xi.forEach(Ho=>Ji.add(Ho))}}),Yi.postStyleProps.forEach((fn,Vr)=>{const xi=Object.keys(fn);let Ji=V.get(Vr);Ji||V.set(Vr,Ji=new Set),xi.forEach(Ho=>Ji.add(Ho))})});if(xt.length){const En=[];xt.forEach(Un=>{En.push(function Ei(n,s){return new e.vHH(3505,C)}())}),ft.forEach(Un=>Un.destroy()),this.reportError(En)}const Ht=new Map,yn=new Map;M.forEach(En=>{const Un=En.element;o.has(Un)&&(yn.set(Un,Un),this._beforeAnimationBuild(En.player.namespaceId,En.instruction,Ht))}),l.forEach(En=>{const Un=En.element;this._getPreviousPlayers(Un,!1,En.namespaceId,En.triggerName,null).forEach(ir=>{Qr(Ht,Un,[]).push(ir),ir.destroy()})});const It=De.filter(En=>ke(En,N,V)),In=new Map;As(In,this.driver,Ae,V,T.l3).forEach(En=>{ke(En,N,V)&&It.push(En)});const Yr=new Map;fe.forEach((En,Un)=>{As(Yr,this.driver,new Set(En),N,T.k1)}),It.forEach(En=>{const Un=In.get(En),Yn=Yr.get(En);In.set(En,Object.assign(Object.assign({},Un),Yn))});const Ir=[],Hr=[],Wr={};M.forEach(En=>{const{element:Un,player:Yn,instruction:ir}=En;if(o.has(Un)){if(X.has(Un))return Yn.onDestroy(()=>kt(Un,ir.toStyles)),Yn.disabled=!0,Yn.overrideTotalTime(ir.totalTime),void l.push(Yn);let An=Wr;if(yn.size>1){let Wi=Un;const Mi=[];for(;Wi=Wi.parentNode;){const Yi=yn.get(Wi);if(Yi){An=Yi;break}Mi.push(Wi)}Mi.forEach(Yi=>yn.set(Yi,An))}const Lr=this._buildAnimation(Yn.namespaceId,ir,Ht,_,Yr,In);if(Yn.setRealPlayer(Lr),An===Wr)Ir.push(Yn);else{const Wi=this.playersByElement.get(An);Wi&&Wi.length&&(Yn.parentPlayer=$r(Wi)),l.push(Yn)}}else dn(Un,ir.fromStyles),Yn.onDestroy(()=>kt(Un,ir.toStyles)),Hr.push(Yn),X.has(Un)&&l.push(Yn)}),Hr.forEach(En=>{const Un=_.get(En.element);if(Un&&Un.length){const Yn=$r(Un);En.setRealPlayer(Yn)}}),l.forEach(En=>{En.parentPlayer?En.syncPlayerEvents(En.parentPlayer):En.destroy()});for(let En=0;En<De.length;En++){const Un=De[En],Yn=Un[Ml];if(Ka(Un,Or),Yn&&Yn.hasAnimation)continue;let ir=[];if(w.size){let Lr=w.get(Un);Lr&&Lr.length&&ir.push(...Lr);let Wi=this.driver.query(Un,ao,!0);for(let Mi=0;Mi<Wi.length;Mi++){let Yi=w.get(Wi[Mi]);Yi&&Yi.length&&ir.push(...Yi)}}const An=ir.filter(Lr=>!Lr.destroyed);An.length?sl(this,Un,An):this.processLeaveNode(Un)}return De.length=0,Ir.forEach(En=>{this.players.push(En),En.onDone(()=>{En.destroy();const Un=this.players.indexOf(En);this.players.splice(Un,1)}),En.play()}),Ir}elementContainsData(s,t){let o=!1;const l=t[Ml];return l&&l.setForRemoval&&(o=!0),this.playersByElement.has(t)&&(o=!0),this.playersByQueriedElement.has(t)&&(o=!0),this.statesByElement.has(t)&&(o=!0),this._fetchNamespace(s).elementContainsData(t)||o}afterFlush(s){this._flushFns.push(s)}afterFlushAnimationsDone(s){this._whenQuietFns.push(s)}_getPreviousPlayers(s,t,o,l,_){let M=[];if(t){const w=this.playersByQueriedElement.get(s);w&&(M=w)}else{const w=this.playersByElement.get(s);if(w){const N=!_||_==Ua;w.forEach(V=>{V.queued||!N&&V.triggerName!=l||M.push(V)})}}return(o||l)&&(M=M.filter(w=>!(o&&o!=w.namespaceId||l&&l!=w.triggerName))),M}_beforeAnimationBuild(s,t,o){const _=t.element,M=t.isRemovalTransition?void 0:s,w=t.isRemovalTransition?void 0:t.triggerName;for(const N of t.timelines){const V=N.element,X=V!==_,re=Qr(o,V,[]);this._getPreviousPlayers(V,X,M,w,t.toState).forEach(fe=>{const ve=fe.getRealPlayer();ve.beforeDestroy&&ve.beforeDestroy(),fe.destroy(),re.push(fe)})}dn(_,t.fromStyles)}_buildAnimation(s,t,o,l,_,M){const w=t.triggerName,N=t.element,V=[],X=new Set,re=new Set,oe=t.timelines.map(ve=>{const Pe=ve.element;X.add(Pe);const De=Pe[Ml];if(De&&De.removedBeforeQueried)return new T.ZN(ve.duration,ve.delay);const Ie=Pe!==N,Ae=function Bs(n){const s=[];return lt(n,s),s}((o.get(Pe)||Mc).map(Ht=>Ht.getRealPlayer())).filter(Ht=>!!Ht.element&&Ht.element===Pe),Y=_.get(Pe),Et=M.get(Pe),ft=Br(0,this._normalizer,0,ve.keyframes,Y,Et),xt=this._buildPlayer(ve,ft,Ae);if(ve.subTimeline&&l&&re.add(Pe),Ie){const Ht=new jt(s,w,Pe);Ht.setRealPlayer(xt),V.push(Ht)}return xt});V.forEach(ve=>{Qr(this.playersByQueriedElement,ve.element,[]).push(ve),ve.onDone(()=>function zn(n,s,t){let o;if(n instanceof Map){if(o=n.get(s),o){if(o.length){const l=o.indexOf(t);o.splice(l,1)}0==o.length&&n.delete(s)}}else if(o=n[s],o){if(o.length){const l=o.indexOf(t);o.splice(l,1)}0==o.length&&delete n[s]}return o}(this.playersByQueriedElement,ve.element,ve))}),X.forEach(ve=>Io(ve,Ui));const fe=$r(oe);return fe.onDestroy(()=>{X.forEach(ve=>Ka(ve,Ui)),kt(N,t.toStyles)}),re.forEach(ve=>{Qr(l,ve,[]).push(fe)}),fe}_buildPlayer(s,t,o){return t.length>0?this.driver.animate(s.element,t,s.duration,s.delay,s.easing,o):new T.ZN(s.duration,s.delay)}}class jt{constructor(s,t,o){this.namespaceId=s,this.triggerName=t,this.element=o,this._player=new T.ZN,this._containsRealPlayer=!1,this._queuedCallbacks={},this.destroyed=!1,this.markedForDestroy=!1,this.disabled=!1,this.queued=!0,this.totalTime=0}setRealPlayer(s){this._containsRealPlayer||(this._player=s,Object.keys(this._queuedCallbacks).forEach(t=>{this._queuedCallbacks[t].forEach(o=>Pn(s,t,void 0,o))}),this._queuedCallbacks={},this._containsRealPlayer=!0,this.overrideTotalTime(s.totalTime),this.queued=!1)}getRealPlayer(){return this._player}overrideTotalTime(s){this.totalTime=s}syncPlayerEvents(s){const t=this._player;t.triggerCallback&&s.onStart(()=>t.triggerCallback("start")),s.onDone(()=>this.finish()),s.onDestroy(()=>this.destroy())}_queueEvent(s,t){Qr(this._queuedCallbacks,s,[]).push(t)}onDone(s){this.queued&&this._queueEvent("done",s),this._player.onDone(s)}onStart(s){this.queued&&this._queueEvent("start",s),this._player.onStart(s)}onDestroy(s){this.queued&&this._queueEvent("destroy",s),this._player.onDestroy(s)}init(){this._player.init()}hasStarted(){return!this.queued&&this._player.hasStarted()}play(){!this.queued&&this._player.play()}pause(){!this.queued&&this._player.pause()}restart(){!this.queued&&this._player.restart()}finish(){this._player.finish()}destroy(){this.destroyed=!0,this._player.destroy()}reset(){!this.queued&&this._player.reset()}setPosition(s){this.queued||this._player.setPosition(s)}getPosition(){return this.queued?0:this._player.getPosition()}triggerCallback(s){const t=this._player;t.triggerCallback&&t.triggerCallback(s)}}function Di(n){return n&&1===n.nodeType}function js(n,s){const t=n.style.display;return n.style.display=null!=s?s:"none",t}function As(n,s,t,o,l){const _=[];t.forEach(N=>_.push(js(N)));const M=[];o.forEach((N,V)=>{const X={};N.forEach(re=>{const oe=X[re]=s.computeStyle(V,re,l);(!oe||0==oe.length)&&(V[Ml]=Wa,M.push(V))}),n.set(V,X)});let w=0;return t.forEach(N=>js(N,_[w++])),M}function Ns(n,s){const t=new Map;if(n.forEach(w=>t.set(w,[])),0==s.length)return t;const l=new Set(s),_=new Map;function M(w){if(!w)return 1;let N=_.get(w);if(N)return N;const V=w.parentNode;return N=t.has(V)?V:l.has(V)?1:M(V),_.set(w,N),N}return s.forEach(w=>{const N=M(w);1!==N&&t.get(N).push(w)}),t}function Io(n,s){var t;null===(t=n.classList)||void 0===t||t.add(s)}function Ka(n,s){var t;null===(t=n.classList)||void 0===t||t.remove(s)}function sl(n,s,t){$r(t).onDone(()=>n.processLeaveNode(s))}function lt(n,s){for(let t=0;t<n.length;t++){const o=n[t];o instanceof T.ZE?lt(o.players,s):s.push(o)}}function ke(n,s,t){const o=t.get(n);if(!o)return!1;let l=s.get(n);return l?o.forEach(_=>l.add(_)):s.set(n,o),t.delete(n),!0}class Ut{constructor(s,t,o){this.bodyNode=s,this._driver=t,this._normalizer=o,this._triggerCache={},this.onRemovalComplete=(l,_)=>{},this._transitionEngine=new ot(s,t,o),this._timelineEngine=new Qu(s,t,o),this._transitionEngine.onRemovalComplete=(l,_)=>this.onRemovalComplete(l,_)}registerTrigger(s,t,o,l,_){const M=s+"-"+l;let w=this._triggerCache[M];if(!w){const N=[],X=mo(this._driver,_,N,[]);if(N.length)throw function rt(n,s){return new e.vHH(3404,C)}();w=function Ls(n,s,t){return new Xs(n,s,t)}(l,X,this._normalizer),this._triggerCache[M]=w}this._transitionEngine.registerTrigger(t,l,w)}register(s,t){this._transitionEngine.register(s,t)}destroy(s,t){this._transitionEngine.destroy(s,t)}onInsert(s,t,o,l){this._transitionEngine.insertNode(s,t,o,l)}onRemove(s,t,o,l){this._transitionEngine.removeNode(s,t,l||!1,o)}disableAnimations(s,t){this._transitionEngine.markElementAsDisabled(s,t)}process(s,t,o,l){if("@"==o.charAt(0)){const[_,M]=Ci(o);this._timelineEngine.command(_,t,M,l)}else this._transitionEngine.trigger(s,t,o,l)}listen(s,t,o,l,_){if("@"==o.charAt(0)){const[M,w]=Ci(o);return this._timelineEngine.listen(M,t,w,_)}return this._transitionEngine.listen(s,t,o,l,_)}flush(s=-1){this._transitionEngine.flush(s)}get players(){return this._transitionEngine.players.concat(this._timelineEngine.players)}whenRenderingDone(){return this._transitionEngine.whenRenderingDone()}}let Wo=(()=>{class n{constructor(t,o,l){this._element=t,this._startStyles=o,this._endStyles=l,this._state=0;let _=n.initialStylesByElement.get(t);_||n.initialStylesByElement.set(t,_={}),this._initialStyles=_}start(){this._state<1&&(this._startStyles&&kt(this._element,this._startStyles,this._initialStyles),this._state=1)}finish(){this.start(),this._state<2&&(kt(this._element,this._initialStyles),this._endStyles&&(kt(this._element,this._endStyles),this._endStyles=null),this._state=1)}destroy(){this.finish(),this._state<3&&(n.initialStylesByElement.delete(this._element),this._startStyles&&(dn(this._element,this._startStyles),this._endStyles=null),this._endStyles&&(dn(this._element,this._endStyles),this._endStyles=null),kt(this._element,this._initialStyles),this._state=3)}}return n.initialStylesByElement=new WeakMap,n})();function Ya(n){let s=null;const t=Object.keys(n);for(let o=0;o<t.length;o++){const l=t[o];yl(l)&&(s=s||{},s[l]=n[l])}return s}function yl(n){return"display"===n||"position"===n}class Xu{constructor(s,t,o,l){this.element=s,this.keyframes=t,this.options=o,this._specialStyles=l,this._onDoneFns=[],this._onStartFns=[],this._onDestroyFns=[],this._initialized=!1,this._finished=!1,this._started=!1,this._destroyed=!1,this.time=0,this.parentPlayer=null,this.currentSnapshot={},this._duration=o.duration,this._delay=o.delay||0,this.time=this._duration+this._delay}_onFinish(){this._finished||(this._finished=!0,this._onDoneFns.forEach(s=>s()),this._onDoneFns=[])}init(){this._buildPlayer(),this._preparePlayerBeforeStart()}_buildPlayer(){if(this._initialized)return;this._initialized=!0;const s=this.keyframes;this.domPlayer=this._triggerWebAnimation(this.element,s,this.options),this._finalKeyframe=s.length?s[s.length-1]:{},this.domPlayer.addEventListener("finish",()=>this._onFinish())}_preparePlayerBeforeStart(){this._delay?this._resetDomPlayerState():this.domPlayer.pause()}_triggerWebAnimation(s,t,o){return s.animate(t,o)}onStart(s){this._onStartFns.push(s)}onDone(s){this._onDoneFns.push(s)}onDestroy(s){this._onDestroyFns.push(s)}play(){this._buildPlayer(),this.hasStarted()||(this._onStartFns.forEach(s=>s()),this._onStartFns=[],this._started=!0,this._specialStyles&&this._specialStyles.start()),this.domPlayer.play()}pause(){this.init(),this.domPlayer.pause()}finish(){this.init(),this._specialStyles&&this._specialStyles.finish(),this._onFinish(),this.domPlayer.finish()}reset(){this._resetDomPlayerState(),this._destroyed=!1,this._finished=!1,this._started=!1}_resetDomPlayerState(){this.domPlayer&&this.domPlayer.cancel()}restart(){this.reset(),this.play()}hasStarted(){return this._started}destroy(){this._destroyed||(this._destroyed=!0,this._resetDomPlayerState(),this._onFinish(),this._specialStyles&&this._specialStyles.destroy(),this._onDestroyFns.forEach(s=>s()),this._onDestroyFns=[])}setPosition(s){void 0===this.domPlayer&&this.init(),this.domPlayer.currentTime=s*this.time}getPosition(){return this.domPlayer.currentTime/this.time}get totalTime(){return this._delay+this._duration}beforeDestroy(){const s={};if(this.hasStarted()){const t=this._finalKeyframe;Object.keys(t).forEach(o=>{"offset"!=o&&(s[o]=this._finished?t[o]:Qn(this.element,o))})}this.currentSnapshot=s}triggerCallback(s){const t="start"==s?this._onStartFns:this._onDoneFns;t.forEach(o=>o()),t.length=0}}class Lc{validateStyleProperty(s){return Gn(s)}matchesElement(s,t){return!1}containsElement(s,t){return Zi(s,t)}getParentElement(s){return Sr(s)}query(s,t,o){return ii(s,t,o)}computeStyle(s,t,o){return window.getComputedStyle(s)[t]}animate(s,t,o,l,_,M=[]){const N={duration:o,delay:l,fill:0==l?"both":"forwards"};_&&(N.easing=_);const V={},X=M.filter(oe=>oe instanceof Xu);(function qn(n,s){return 0===n||0===s})(o,l)&&X.forEach(oe=>{let fe=oe.currentSnapshot;Object.keys(fe).forEach(ve=>V[ve]=fe[ve])}),t=function ei(n,s,t){const o=Object.keys(t);if(o.length&&s.length){let _=s[0],M=[];if(o.forEach(w=>{_.hasOwnProperty(w)||M.push(w),_[w]=t[w]}),M.length)for(var l=1;l<s.length;l++){let w=s[l];M.forEach(function(N){w[N]=Qn(n,N)})}}return s}(s,t=t.map(oe=>Rt(oe,!1)),V);const re=function pi(n,s){let t=null,o=null;return Array.isArray(s)&&s.length?(t=Ya(s[0]),s.length>1&&(o=Ya(s[s.length-1]))):s&&(t=Ya(s)),t||o?new Wo(n,t,o):null}(s,t);return new Xu(s,t,N,re)}}let vd=(()=>{class n extends T._j{constructor(t,o){super(),this._nextAnimationId=0,this._renderer=t.createRenderer(o.body,{id:"0",encapsulation:e.ifc.None,styles:[],data:{animation:[]}})}build(t){const o=this._nextAnimationId.toString();this._nextAnimationId++;const l=Array.isArray(t)?(0,T.vP)(t):t;return Ia(this._renderer,null,o,"register",[l]),new Hi(o,this._renderer)}}return n.\u0275fac=function(t){return new(t||n)(e.LFG(e.FYo),e.LFG(p.K0))},n.\u0275prov=e.Yz7({token:n,factory:n.\u0275fac}),n})();class Hi extends T.LC{constructor(s,t){super(),this._id=s,this._renderer=t}create(s,t){return new oa(this._id,s,t||{},this._renderer)}}class oa{constructor(s,t,o,l){this.id=s,this.element=t,this._renderer=l,this.parentPlayer=null,this._started=!1,this.totalTime=0,this._command("create",o)}_listen(s,t){return this._renderer.listen(this.element,`@@${this.id}:${s}`,t)}_command(s,...t){return Ia(this._renderer,this.element,this.id,s,t)}onDone(s){this._listen("done",s)}onStart(s){this._listen("start",s)}onDestroy(s){this._listen("destroy",s)}init(){this._command("init")}hasStarted(){return this._started}play(){this._command("play"),this._started=!0}pause(){this._command("pause")}restart(){this._command("restart")}finish(){this._command("finish")}destroy(){this._command("destroy")}reset(){this._command("reset"),this._started=!1}setPosition(s){this._command("setPosition",s)}getPosition(){var s,t;return null!==(t=null===(s=this._renderer.engine.players[+this.id])||void 0===s?void 0:s.getPosition())&&void 0!==t?t:0}}function Ia(n,s,t,o,l){return n.setProperty(s,`@@${t}:${o}`,l)}const qu="@.disabled";let bl=(()=>{class n{constructor(t,o,l){this.delegate=t,this.engine=o,this._zone=l,this._currentId=0,this._microtaskId=1,this._animationCallbacksBuffer=[],this._rendererCache=new Map,this._cdRecurDepth=0,this.promise=Promise.resolve(0),o.onRemovalComplete=(_,M)=>{const w=null==M?void 0:M.parentNode(_);w&&M.removeChild(w,_)}}createRenderer(t,o){const _=this.delegate.createRenderer(t,o);if(!(t&&o&&o.data&&o.data.animation)){let X=this._rendererCache.get(_);return X||(X=new su("",_,this.engine),this._rendererCache.set(_,X)),X}const M=o.id,w=o.id+"-"+this._currentId;this._currentId++,this.engine.register(w,t);const N=X=>{Array.isArray(X)?X.forEach(N):this.engine.registerTrigger(M,w,t,X.name,X)};return o.data.animation.forEach(N),new vu(this,w,_,this.engine)}begin(){this._cdRecurDepth++,this.delegate.begin&&this.delegate.begin()}_scheduleCountTask(){this.promise.then(()=>{this._microtaskId++})}scheduleListenerCallback(t,o,l){t>=0&&t<this._microtaskId?this._zone.run(()=>o(l)):(0==this._animationCallbacksBuffer.length&&Promise.resolve(null).then(()=>{this._zone.run(()=>{this._animationCallbacksBuffer.forEach(_=>{const[M,w]=_;M(w)}),this._animationCallbacksBuffer=[]})}),this._animationCallbacksBuffer.push([o,l]))}end(){this._cdRecurDepth--,0==this._cdRecurDepth&&this._zone.runOutsideAngular(()=>{this._scheduleCountTask(),this.engine.flush(this._microtaskId)}),this.delegate.end&&this.delegate.end()}whenRenderingDone(){return this.engine.whenRenderingDone()}}return n.\u0275fac=function(t){return new(t||n)(e.LFG(e.FYo),e.LFG(Ut),e.LFG(e.R0b))},n.\u0275prov=e.Yz7({token:n,factory:n.\u0275fac}),n})();class su{constructor(s,t,o){this.namespaceId=s,this.delegate=t,this.engine=o,this.destroyNode=this.delegate.destroyNode?l=>t.destroyNode(l):null}get data(){return this.delegate.data}destroy(){this.engine.destroy(this.namespaceId,this.delegate),this.delegate.destroy()}createElement(s,t){return this.delegate.createElement(s,t)}createComment(s){return this.delegate.createComment(s)}createText(s){return this.delegate.createText(s)}appendChild(s,t){this.delegate.appendChild(s,t),this.engine.onInsert(this.namespaceId,t,s,!1)}insertBefore(s,t,o,l=!0){this.delegate.insertBefore(s,t,o),this.engine.onInsert(this.namespaceId,t,s,l)}removeChild(s,t,o){this.engine.onRemove(this.namespaceId,t,this.delegate,o)}selectRootElement(s,t){return this.delegate.selectRootElement(s,t)}parentNode(s){return this.delegate.parentNode(s)}nextSibling(s){return this.delegate.nextSibling(s)}setAttribute(s,t,o,l){this.delegate.setAttribute(s,t,o,l)}removeAttribute(s,t,o){this.delegate.removeAttribute(s,t,o)}addClass(s,t){this.delegate.addClass(s,t)}removeClass(s,t){this.delegate.removeClass(s,t)}setStyle(s,t,o,l){this.delegate.setStyle(s,t,o,l)}removeStyle(s,t,o){this.delegate.removeStyle(s,t,o)}setProperty(s,t,o){"@"==t.charAt(0)&&t==qu?this.disableAnimations(s,!!o):this.delegate.setProperty(s,t,o)}setValue(s,t){this.delegate.setValue(s,t)}listen(s,t,o){return this.delegate.listen(s,t,o)}disableAnimations(s,t){this.engine.disableAnimations(s,t)}}class vu extends su{constructor(s,t,o,l){super(t,o,l),this.factory=s,this.namespaceId=t}setProperty(s,t,o){"@"==t.charAt(0)?"."==t.charAt(1)&&t==qu?this.disableAnimations(s,o=void 0===o||!!o):this.engine.process(this.namespaceId,s,t.substr(1),o):this.delegate.setProperty(s,t,o)}listen(s,t,o){if("@"==t.charAt(0)){const l=function nu(n){switch(n){case"body":return document.body;case"document":return document;case"window":return window;default:return n}}(s);let _=t.substr(1),M="";return"@"!=_.charAt(0)&&([_,M]=function ra(n){const s=n.indexOf(".");return[n.substring(0,s),n.substr(s+1)]}(_)),this.engine.listen(this.namespaceId,l,_,M,w=>{this.factory.scheduleListenerCallback(w._data||-1,o,w)})}return this.delegate.listen(s,t,o)}}let yu=(()=>{class n extends Ut{constructor(t,o,l){super(t.body,o,l)}ngOnDestroy(){this.flush()}}return n.\u0275fac=function(t){return new(t||n)(e.LFG(p.K0),e.LFG(ln),e.LFG(rn))},n.\u0275prov=e.Yz7({token:n,factory:n.\u0275fac}),n})();const au=new e.OlP("AnimationModuleType"),uu=[{provide:T._j,useClass:vd},{provide:rn,useFactory:function rd(){return new Le}},{provide:Ut,useClass:yu},{provide:e.FYo,useFactory:function ec(n,s,t){return new bl(n,s,t)},deps:[c.se,Ut,e.R0b]}],id=[{provide:ln,useFactory:()=>new Lc},{provide:au,useValue:"BrowserAnimations"},...uu],$u=[{provide:ln,useClass:Ki},{provide:au,useValue:"NoopAnimations"},...uu];let Hu=(()=>{class n{static withConfig(t){return{ngModule:n,providers:t.disableAnimations?$u:id}}}return n.\u0275fac=function(t){return new(t||n)},n.\u0275mod=e.oAB({type:n}),n.\u0275inj=e.cJS({providers:id,imports:[c.b2]}),n})();var Fd=i(92870),Bo=i(55860),cu=i(23815),Er=i.n(cu),j=i(64762),Ce=i(93523);let nt=class{constructor(s){this.http=s,this.baseURL="api/cephfs",this.baseUiURL="ui-api/cephfs"}list(){return this.http.get(`${this.baseURL}`)}lsDir(s,t){let o=`${this.baseUiURL}/${s}/ls_dir?depth=2`;return t&&(o+=`&path=${encodeURIComponent(t)}`),this.http.get(o)}getCephfs(s){return this.http.get(`${this.baseURL}/${s}`)}getTabs(s){return this.http.get(`ui-api/cephfs/${s}/tabs`)}getClients(s){return this.http.get(`${this.baseURL}/${s}/clients`)}evictClient(s,t){return this.http.delete(`${this.baseURL}/${s}/client/${t}`)}getMdsCounters(s){return this.http.get(`${this.baseURL}/${s}/mds_counters`)}mkSnapshot(s,t,o){let l=new y.LE;return l=l.append("path",t),Er().isUndefined(o)||(l=l.append("name",o)),this.http.post(`${this.baseURL}/${s}/snapshot`,null,{params:l})}rmSnapshot(s,t,o){let l=new y.LE;return l=l.append("path",t),l=l.append("name",o),this.http.delete(`${this.baseURL}/${s}/snapshot`,{params:l})}quota(s,t,o){let l=new y.LE;return l=l.append("path",t),this.http.put(`${this.baseURL}/${s}/quota`,o,{observe:"response",params:l})}};nt.\u0275fac=function(s){return new(s||nt)(e.LFG(y.eN))},nt.\u0275prov=e.Yz7({token:nt,factory:nt.\u0275fac,providedIn:"root"}),nt=(0,j.gn)([Ce.o,(0,j.w6)("design:paramtypes",[y.eN])],nt);var Mt=i(68136),wt=i(99466),sn=i(68774),Cn=i(96102),_r=i(83697),ni=i(46797),fi=i(69158),gi=i(91801),zi=i(47640),Dr=i(71334),kn=i(59376),Ar=i(47557),gr=i(66369),fo=i(61350),$s=i(16738),Es=i.n($s),pl=i(87311),Ks=i(72621);const Wc=["chartCanvas"],Fc=["chartTooltip"];let xu=(()=>{class n{constructor(){this.lhsCounter="mds_mem.ino",this.rhsCounter="mds_server.handle_client_request",this.chart={datasets:[{label:this.lhsCounter,yAxisID:"LHS",data:[],lineTension:.1},{label:this.rhsCounter,yAxisID:"RHS",data:[],lineTension:.1}],options:{title:{text:"",display:!0},responsive:!0,maintainAspectRatio:!1,legend:{position:"top"},scales:{xAxes:[{position:"top",type:"time",time:{displayFormats:{quarter:"MMM YYYY"}},ticks:{maxRotation:0}}],yAxes:[{id:"LHS",type:"linear",position:"left"},{id:"RHS",type:"linear",position:"right"}]},tooltips:{enabled:!1,mode:"index",intersect:!1,position:"nearest",callbacks:{title:(t,o)=>{let l=0;if(t.length>0){const _=t[0];l=o.datasets[_.datasetIndex].data[_.index].x}return l.toString()}}}},chartType:"line"}}ngOnInit(){Er().isUndefined(this.mdsCounter)||(this.setChartTooltip(),this.updateChart())}ngOnChanges(){Er().isUndefined(this.mdsCounter)||this.updateChart()}setChartTooltip(){const t=new pl.h(this.chartCanvas,this.chartTooltip,l=>l.caretX+"px",l=>l.caretY-l.height-23+"px");t.getTitle=l=>Es()(l,"x").format("LTS"),t.checkOffset=!0;const o={title:{text:this.mdsCounter.name},tooltips:{custom:l=>t.customTooltips(l)}};Er().merge(this.chart,{options:o})}updateChart(){const t=[{data:this.convertTimeSeries(this.mdsCounter[this.lhsCounter])},{data:this.deltaTimeSeries(this.mdsCounter[this.rhsCounter])}];Er().merge(this.chart,{datasets:t}),this.chart.datasets=[...this.chart.datasets]}convertTimeSeries(t){const o=[];return Er().each(t,l=>{o.push({x:1e3*l[0],y:l[1]})}),o.shift(),o}deltaTimeSeries(t){let o,l=t[0];const _=[];for(o=1;o<t.length;o++){const M=t[o];_.push({x:1e3*M[0],y:M[1]-l[1]}),l=M}return _}}return n.\u0275fac=function(t){return new(t||n)},n.\u0275cmp=e.Xpm({type:n,selectors:[["cd-cephfs-chart"]],viewQuery:function(t,o){if(1&t&&(e.Gf(Wc,7),e.Gf(Fc,7)),2&t){let l;e.iGM(l=e.CRH())&&(o.chartCanvas=l.first),e.iGM(l=e.CRH())&&(o.chartTooltip=l.first)}},inputs:{mdsCounter:"mdsCounter"},features:[e.TTD],decls:6,vars:3,consts:[[1,"chart-container"],["baseChart","",3,"datasets","options","chartType"],["chartCanvas",""],[1,"chartjs-tooltip"],["chartTooltip",""]],template:function(t,o){1&t&&(e.TgZ(0,"div",0),e._UZ(1,"canvas",1,2),e.TgZ(3,"div",3,4),e._UZ(5,"table"),e.qZA()()),2&t&&(e.xp6(1),e.Q6J("datasets",o.chart.datasets)("options",o.chart.options)("chartType",o.chart.chartType))},directives:[Ks.jh],styles:['.chart-container[_ngcontent-%COMP%]{cursor:pointer;margin:auto;overflow:visible;position:absolute}canvas[_ngcontent-%COMP%]{user-select:none}.chartjs-tooltip[_ngcontent-%COMP%]{background:rgba(0,0,0,.7);border-radius:3px;color:#fff;font-family:Helvetica Neue,Helvetica,Arial,sans-serif!important;opacity:0;pointer-events:none;position:absolute;transform:translate(-50%);transition:all .1s ease}.chartjs-tooltip.transform-left[_ngcontent-%COMP%]{transform:translate(-10%)}.chartjs-tooltip.transform-left[_ngcontent-%COMP%]:after{left:10%}.chartjs-tooltip.transform-right[_ngcontent-%COMP%]{transform:translate(-90%)}.chartjs-tooltip.transform-right[_ngcontent-%COMP%]:after{left:90%}.chartjs-tooltip[_ngcontent-%COMP%]:after{border-color:#000 transparent transparent transparent;border-style:solid;border-width:5px;content:" ";left:50%;margin-left:-5px;position:absolute;top:100%}  .chartjs-tooltip-key{display:inline-block;height:10px;margin-right:10px;width:10px}.chart-container[_ngcontent-%COMP%]{height:500px;margin-bottom:20px;position:relative;width:100%}']}),n})();var Eu=i(60251);const Gd=["poolUsageTpl"],yd=["activityTmpl"];function Ed(n,s){if(1&n&&(e.TgZ(0,"div",0)(1,"div",11),e._UZ(2,"cd-cephfs-chart",12),e.qZA()()),2&n){const t=s.$implicit;e.xp6(2),e.Q6J("mdsCounter",t)}}function Uc(n,s){if(1&n&&e._UZ(0,"cd-usage-bar",13),2&n){const t=s.row;e.Q6J("total",t.size)("used",t.used)("title",t.pool_name)}}function La(n,s){1&n&&(e._uU(0),e.ALo(1,"dimless")),2&n&&e.AsE(" ","standby-replay"===s.row.state?"Evts":"Reqs",": ",e.lcZ(1,2,s.value)," /s\n")}let kd=(()=>{class n{constructor(t,o){this.dimlessBinary=t,this.dimless=o,this.standbys=[],this.objectValues=Object.values}ngOnChanges(){this.setStandbys()}setStandbys(){this.standbys=[{key:"Standby daemons",value:this.data.standbys}]}ngOnInit(){this.columns={ranks:[{prop:"rank",name:"Rank"},{prop:"state",name:"State"},{prop:"mds",name:"Daemon"},{prop:"activity",name:"Activity",cellTemplate:this.activityTmpl},{prop:"dns",name:"Dentries",pipe:this.dimless},{prop:"inos",name:"Inodes",pipe:this.dimless},{prop:"dirs",name:"Dirs",pipe:this.dimless},{prop:"caps",name:"Caps",pipe:this.dimless}],pools:[{prop:"pool",name:"Pool"},{prop:"type",name:"Type"},{prop:"size",name:"Size",pipe:this.dimlessBinary},{name:"Usage",cellTemplate:this.poolUsageTpl,comparator:(t,o,l,_)=>{const M=l.used/l.avail,w=_.used/_.avail;return M===w?0:M>w?1:-1}}]}}trackByFn(t,o){return o.name}}return n.\u0275fac=function(t){return new(t||n)(e.Y36(Ar.$),e.Y36(gr.n))},n.\u0275cmp=e.Xpm({type:n,selectors:[["cd-cephfs-detail"]],viewQuery:function(t,o){if(1&t&&(e.Gf(Gd,7),e.Gf(yd,7)),2&t){let l;e.iGM(l=e.CRH())&&(o.poolUsageTpl=l.first),e.iGM(l=e.CRH())&&(o.activityTmpl=l.first)}},inputs:{data:"data"},features:[e.TTD],decls:19,vars:9,consts:function(){let s,t,o,l;return s="Ranks",t="Standbys",o="Pools",l="MDS performance counters",[[1,"row"],[1,"col-sm-6"],s,[3,"data","columns","toolHeader"],t,[3,"data"],o,l,["class","row",4,"ngFor","ngForOf","ngForTrackBy"],["poolUsageTpl",""],["activityTmpl",""],[1,"col-md-12"],[3,"mdsCounter"],[3,"total","used","title"]]},template:function(t,o){1&t&&(e.TgZ(0,"div",0)(1,"div",1)(2,"legend"),e.SDv(3,2),e.qZA(),e._UZ(4,"cd-table",3),e.TgZ(5,"legend"),e.SDv(6,4),e.qZA(),e._UZ(7,"cd-table-key-value",5),e.qZA(),e.TgZ(8,"div",1)(9,"legend"),e.SDv(10,6),e.qZA(),e._UZ(11,"cd-table",3),e.qZA()(),e.TgZ(12,"legend"),e.SDv(13,7),e.qZA(),e.YNc(14,Ed,3,1,"div",8),e.YNc(15,Uc,1,3,"ng-template",null,9,e.W1O),e.YNc(17,La,2,4,"ng-template",null,10,e.W1O)),2&t&&(e.xp6(4),e.Q6J("data",o.data.ranks)("columns",o.columns.ranks)("toolHeader",!1),e.xp6(3),e.Q6J("data",o.standbys),e.xp6(4),e.Q6J("data",o.data.pools)("columns",o.columns.pools)("toolHeader",!1),e.xp6(3),e.Q6J("ngForOf",o.objectValues(o.data.mdsCounters))("ngForTrackBy",o.trackByFn))},directives:[_r.a,fo.b,p.sg,xu,Eu.O],pipes:[gr.n],styles:[".progress[_ngcontent-%COMP%]{margin-bottom:0}"]}),n})();var Oc=i(30982),Mo=i(79512),No=i(65862),Sa=i(18001),Sl=i(97161),ru=i(63285),bu=i(94928);let gc=(()=>{class n{constructor(t,o,l,_,M){this.cephfsService=t,this.modalService=o,this.notificationService=l,this.authStorageService=_,this.actionLabels=M,this.triggerApiUpdate=new e.vpe,this.selection=new sn.r,this.permission=this.authStorageService.getPermissions().cephfs,this.tableActions=[{permission:"update",icon:No.P.signOut,click:()=>this.evictClientModal(),name:this.actionLabels.EVICT}]}ngOnInit(){this.columns=[{prop:"id",name:"id"},{prop:"type",name:"type"},{prop:"state",name:"state"},{prop:"version",name:"version"},{prop:"hostname",name:"Host"},{prop:"root",name:"root"}]}updateSelection(t){this.selection=t}evictClient(t){this.cephfsService.evictClient(this.id,t).subscribe(()=>{this.triggerApiUpdate.emit(),this.modalRef.close(),this.notificationService.show(Sa.k.success,"Evicted client '" + t + "'")},()=>{this.modalRef.componentInstance.stopLoadingSpinner()})}evictClientModal(){const t=this.selection.first().id;this.modalRef=this.modalService.show(Oc.M,{itemDescription:"client",itemNames:[t],actionDescription:"evict",submitAction:()=>this.evictClient(t)})}}return n.\u0275fac=function(t){return new(t||n)(e.Y36(nt),e.Y36(ru.Z),e.Y36(Sl.g),e.Y36(zi.j),e.Y36(Mo.p4))},n.\u0275cmp=e.Xpm({type:n,selectors:[["cd-cephfs-clients"]],inputs:{id:"id",clients:"clients"},outputs:{triggerApiUpdate:"triggerApiUpdate"},decls:2,vars:7,consts:[["selectionType","single",3,"data","columns","status","autoReload","fetchData","updateSelection"],[1,"table-actions",3,"permission","selection","tableActions"]],template:function(t,o){1&t&&(e.TgZ(0,"cd-table",0),e.NdJ("fetchData",function(){return o.triggerApiUpdate.emit()})("updateSelection",function(_){return o.updateSelection(_)}),e._UZ(1,"cd-table-actions",1),e.qZA()),2&t&&(e.Q6J("data",o.clients.data)("columns",o.columns)("status",o.clients.status)("autoReload",-1),e.xp6(1),e.Q6J("permission",o.permission)("selection",o.selection)("tableActions",o.tableActions))},directives:[_r.a,bu.K],styles:[""]}),n})();var _n=i(1659),pa=i(62946),od=i(36169),$e=i(65683),Me=i(90070),_e=i(87925);const at=["origin"],vt=function(n,s){return[n,s]};function Qt(n,s){if(1&n&&e._UZ(0,"i",5),2&n){const t=e.oxw(2);e.Q6J("ngClass",e.WLB(1,vt,t.icons.spinner,t.icons.spin))}}function Ln(n,s){if(1&n&&(e.TgZ(0,"tree-root",10),e.YNc(1,Qt,1,4,"ng-template",null,11,e.W1O),e.qZA()),2&n){const t=e.oxw();e.Q6J("nodes",t.nodes)("options",t.treeOptions)}}function cr(n,s){if(1&n){const t=e.EpF();e.ynx(0),e.TgZ(1,"legend"),e.SDv(2,17),e.qZA(),e.TgZ(3,"cd-table",18),e.NdJ("updateSelection",function(l){return e.CHM(t),e.oxw(2).quota.updateSelection(l)}),e._UZ(4,"cd-table-actions",19),e.qZA(),e.BQk()}if(2&n){const t=e.oxw(2);e.xp6(3),e.Q6J("data",t.settings)("columns",t.quota.columns)("limit",0)("footer",!1)("onlyActionHeader",!0)("forceIdentifier",!0)("toolHeader",!1),e.xp6(1),e.Q6J("permission",t.permission)("selection",t.quota.selection)("tableActions",t.quota.tableActions)}}function ui(n,s){if(1&n){const t=e.EpF();e.TgZ(0,"div",12)(1,"div",2)(2,"div",3),e._uU(3),e.qZA(),e.TgZ(4,"div",6),e.YNc(5,cr,5,10,"ng-container",13),e.TgZ(6,"legend"),e.SDv(7,14),e.qZA(),e.TgZ(8,"cd-table",15),e.NdJ("updateSelection",function(l){return e.CHM(t),e.oxw().snapshot.updateSelection(l)}),e._UZ(9,"cd-table-actions",16),e.qZA()()()()}if(2&n){const t=e.oxw();e.xp6(3),e.hij(" ",t.selectedDir.path," "),e.xp6(2),e.Q6J("ngIf","/"!==t.selectedDir.path),e.xp6(3),e.Q6J("data",t.selectedDir.snapshots)("columns",t.snapshot.columns),e.xp6(1),e.Q6J("permission",t.permission)("selection",t.snapshot.selection)("tableActions",t.snapshot.tableActions)}}function Lo(n,s){if(1&n){const t=e.EpF();e.TgZ(0,"span",20),e.NdJ("click",function(){const _=e.CHM(t).value;return e.oxw().selectOrigin(_)}),e._uU(1),e.qZA()}if(2&n){const t=s.value;e.xp6(1),e.Oqu(t)}}let _s=(()=>{class n{constructor(t,o,l,_,M,w,N){this.authStorageService=t,this.modalService=o,this.cephfsService=l,this.cdDatePipe=_,this.actionLabels=M,this.notificationService=w,this.dimlessBinaryPipe=N,this.icons=No.P,this.loadingIndicator=!1,this.loading={},this.treeOptions={useVirtualScroll:!0,getChildren:V=>this.updateDirectory(V.id),actionMapping:{mouse:{click:this.selectAndShowNode.bind(this),expanderClick:this.selectAndShowNode.bind(this)}}}}selectAndShowNode(t,o,l){pa.iM.TOGGLE_EXPANDED(t,o,l),this.selectNode(o)}selectNode(t){pa.iM.TOGGLE_ACTIVE(void 0,t,void 0),this.selectedDir=this.getDirectory(t),"/"!==t.id&&this.setSettings(t)}ngOnInit(){this.permission=this.authStorageService.getPermissions().cephfs,this.setUpQuotaTable(),this.setUpSnapshotTable()}setUpQuotaTable(){this.quota={columns:[{prop:"row.name",name:"Name",flexGrow:1},{prop:"row.value",name:"Value",sortable:!1,flexGrow:1},{prop:"row.originPath",name:"Origin",sortable:!1,cellTemplate:this.originTmpl,flexGrow:1}],selection:new sn.r,updateSelection:t=>{this.quota.selection=t},tableActions:[{name:this.actionLabels.SET,icon:No.P.edit,permission:"update",visible:t=>!t.hasSelection||t.first()&&0===t.first().dirValue,click:()=>this.updateQuotaModal()},{name:this.actionLabels.UPDATE,icon:No.P.edit,permission:"update",visible:t=>t.first()&&t.first().dirValue>0,click:()=>this.updateQuotaModal()},{name:this.actionLabels.UNSET,icon:No.P.destroy,permission:"update",disable:t=>!t.hasSelection||t.first()&&0===t.first().dirValue,click:()=>this.unsetQuotaModal()}]}}setUpSnapshotTable(){this.snapshot={columns:[{prop:"name",name:"Name",flexGrow:1},{prop:"path",name:"Path",isHidden:!0,flexGrow:2},{prop:"created",name:"Created",flexGrow:1,pipe:this.cdDatePipe}],selection:new sn.r,updateSelection:t=>{this.snapshot.selection=t},tableActions:[{name:this.actionLabels.CREATE,icon:No.P.add,permission:"create",canBePrimary:t=>!t.hasSelection,click:()=>this.createSnapshot(),disable:()=>this.disableCreateSnapshot()},{name:this.actionLabels.DELETE,icon:No.P.destroy,permission:"delete",click:()=>this.deleteSnapshotModal(),canBePrimary:t=>t.hasSelection,disable:t=>!t.hasSelection}]}}disableCreateSnapshot(){const t=this.selectedDir.path.split("/").slice(1);return t.length>=4&&"volumes"===t[0]&&"Cannot create snapshots for files/folders in the subvolume " + t[2] + ""}ngOnChanges(){this.selectedDir=void 0,this.dirs=[],this.requestedPaths=[],this.nodeIds={},this.id&&(this.setRootNode(),this.firstCall())}setRootNode(){this.nodes=[{name:"/",id:"/",isExpanded:!0}]}firstCall(){setTimeout(()=>{this.getNode("/").loadNodeChildren()},10)}updateDirectory(t){if(this.unsetLoadingIndicator(),this.requestedPaths.includes(t)){if(!0===this.loading[t])return}else this.requestedPaths.push(t);return new Promise(o=>{this.setLoadingIndicator(t,!0),this.cephfsService.lsDir(this.id,t).subscribe(l=>{this.updateTreeStructure(l),this.updateQuotaTable(),this.updateTree(),o(this.getChildren(t)),this.setLoadingIndicator(t,!1)})})}setLoadingIndicator(t,o){this.loading[t]=o,this.unsetLoadingIndicator()}getSubDirectories(t,o=this.dirs){return o.filter(l=>l.parent===t)}getChildren(t){const o=this.getSubTree(t);return Er().sortBy(this.getSubDirectories(t),"path").map(l=>this.createNode(l,o))}createNode(t,o){return this.nodeIds[t.path]=t,o||this.getSubTree(t.parent),{name:t.name,id:t.path,hasChildren:this.getSubDirectories(t.path,o).length>0}}getSubTree(t){return this.dirs.filter(o=>o.parent&&o.parent.startsWith(t))}setSettings(t){const o=(l,_)=>l?_?_(l):l:"";this.settings=[this.getQuota(t,"max_files",o),this.getQuota(t,"max_bytes",l=>o(l,_=>this.dimlessBinaryPipe.transform(_)))]}getQuota(t,o,l){const _=t.id;t=this.getOrigin(t,o);const M=this.getDirectory(t),w=M.quotas[o];let N=w,V=M.path;if(t.id===_)if("/"===t.parent.id)N=0;else{const X=this.getDirectory(this.getOrigin(t.parent,o));N=X.quotas[o],V=X.path}return{row:{name:"max_bytes"===o?"Max size":"Max files",value:l(w),originPath:w?M.path:""},quotaKey:o,dirValue:this.nodeIds[_].quotas[o],nextTreeMaximum:{value:N,path:N?V:""}}}getOrigin(t,o){if(t.parent&&"/"!==t.parent.id){const l=this.getQuotaFromTree(t,o),_=this.getOrigin(t.parent,o),M=this.getQuotaFromTree(_,o);return 0===l||0!==M&&M<l?_:t}return t}getQuotaFromTree(t,o){return this.getDirectory(t).quotas[o]}getDirectory(t){return this.nodeIds[t.id]}selectOrigin(t){this.selectNode(this.getNode(t))}getNode(t){return this.treeComponent.treeModel.getNodeById(t)}updateQuotaModal(){const t=this.selectedDir.path,o=this.quota.selection.first(),l=o.nextTreeMaximum,_=o.quotaKey,M=o.dirValue;this.modalService.show($e.X,{titleText:this.getModalQuotaTitle(0===M?this.actionLabels.SET:this.actionLabels.UPDATE,t),message:l.value?"The inherited " + this.getQuotaValueFromPathMsg(l.value, l.path) + " is the maximum value to be used.":void 0,fields:[this.getQuotaFormField(o.row.name,_,M,l.value)],submitButtonText:"Save",onSubmit:w=>this.updateQuota(w)})}getModalQuotaTitle(t,o){return "" + t + " CephFS " + this.getQuotaName() + " quota for '" + o + "'"}getQuotaName(){return this.isBytesQuotaSelected()?"size":"files"}isBytesQuotaSelected(){return"max_bytes"===this.quota.selection.first().quotaKey}getQuotaValueFromPathMsg(t,o){return t=this.isBytesQuotaSelected()?this.dimlessBinaryPipe.transform(t):t,"" + this.getQuotaName() + " quota " + t + " from '" + o + "'"}getQuotaFormField(t,o,l,_){const M="max_bytes"===o,w=[M?Me.h.binaryMin(0):_n.kI.min(0)];_&&w.push(M?Me.h.binaryMax(_):_n.kI.max(_));const N={type:M?"binary":"number",label:t,name:o,value:l,validators:w,required:!0};return M||(N.errors={min:"Value has to be at least 0 or more",max:"Value has to be at most " + _ + " or less"}),N}updateQuota(t,o){const l=this.selectedDir.path,_=this.quota.selection.first().quotaKey,M=0===this.selectedDir.quotas[_]?this.actionLabels.SET:0===t[_]?this.actionLabels.UNSET:"Updated";this.cephfsService.quota(this.id,l,t).subscribe(()=>{o&&o(),this.notificationService.show(Sa.k.success,this.getModalQuotaTitle(M,l)),this.forceDirRefresh()})}unsetQuotaModal(){const t=this.selectedDir.path,o=this.quota.selection.first(),l=o.quotaKey,_=o.nextTreeMaximum,M=o.dirValue,w=this.getQuotaValueFromPathMsg(_.value,_.path),N=_.value>0?_.value>M?"in order to inherit " + w + "":"which isn't used because of the inheritance of " + w + "":"in order to have no quota on the directory";this.modalRef=this.modalService.show(od.Y,{titleText:this.getModalQuotaTitle(this.actionLabels.UNSET,t),buttonText:this.actionLabels.UNSET,description:"" + this.actionLabels.UNSET + " " + this.getQuotaValueFromPathMsg(M, t) + " " + N + ".",onSubmit:()=>this.updateQuota({[l]:0},()=>this.modalRef.close())})}createSnapshot(){const t=this.selectedDir.path;this.modalService.show($e.X,{titleText:"Create Snapshot",message:"Please enter the name of the snapshot.",fields:[{type:"text",name:"name",value:`${Es()().toISOString(!0)}`,required:!0,validators:[this.validateValue.bind(this)]}],submitButtonText:"Create Snapshot",onSubmit:o=>{this.alreadyExists?this.notificationService.show(Sa.k.error,"Snapshot name '" + o.name + "' is already in use. Please use another name."):this.cephfsService.mkSnapshot(this.id,t,o.name).subscribe(l=>{this.notificationService.show(Sa.k.success,"Created snapshot '" + l + "' for '" + t + "'"),this.forceDirRefresh()})}})}validateValue(t){this.alreadyExists=this.selectedDir.snapshots.some(o=>o.name===t.value)}forceDirRefresh(t){if(!t){const l=this.selectedDir;if(!l)throw new Error("This function can only be called without path if an selection was made");t=l.parent?l.parent:l.path}this.getNode(t).loadNodeChildren()}updateTreeStructure(t){const o=(_,M)=>{const w=_.filter(V=>V.parent===M),N=w.map(V=>V.path);return{children:w,paths:N}};Er().uniq(t.map(_=>_.parent).sort()).forEach(_=>{const M=o(t,_),w=o(this.dirs,_);w.children.forEach(N=>{M.paths.includes(N.path)||this.removeOldDirectory(N)}),M.children.forEach(N=>{w.paths.includes(N.path)?this.updateExistingDirectory(w.children,N):this.addNewDirectory(N)})})}removeOldDirectory(t){const o=t.path;Er().remove(this.dirs,l=>l.path===o),delete this.nodeIds[o],this.updateDirectoriesParentNode(t)}updateDirectoriesParentNode(t){const o=t.parent;if(!o)return;const l=this.getNode(o);if(!l)return;const _=this.getChildren(o);l.data.children=_,l.data.hasChildren=_.length>0,this.treeComponent.treeModel.update()}addNewDirectory(t){this.dirs.push(t),this.nodeIds[t.path]=t,this.updateDirectoriesParentNode(t)}updateExistingDirectory(t,o){const l=t.find(_=>_.path===o.path);Object.assign(l,o)}updateQuotaTable(){const t=this.selectedDir?this.getNode(this.selectedDir.path):void 0;t&&"/"!==t.id&&this.setSettings(t)}updateTree(t=!1){this.loadingIndicator&&!t||(this.treeComponent.treeModel.update(),this.nodes=[...this.nodes],this.treeComponent.sizeChanged())}deleteSnapshotModal(){this.modalRef=this.modalService.show(Oc.M,{itemDescription:"CephFs Snapshot",itemNames:this.snapshot.selection.selected.map(t=>t.name),submitAction:()=>this.deleteSnapshot()})}deleteSnapshot(){const t=this.selectedDir.path;this.snapshot.selection.selected.forEach(o=>{const l=o.name;this.cephfsService.rmSnapshot(this.id,t,l).subscribe(()=>{this.notificationService.show(Sa.k.success,"Deleted snapshot '" + l + "' for '" + t + "'")})}),this.modalRef.close(),this.forceDirRefresh()}refreshAllDirectories(){this.loadingIndicator=!0,this.requestedPaths.map(o=>this.forceDirRefresh(o));const t=setInterval(()=>{this.updateTree(!0),this.loadingIndicator||clearInterval(t)},3e3)}unsetLoadingIndicator(){!this.loadingIndicator||(clearTimeout(this.loadingTimeout),this.loadingTimeout=setTimeout(()=>{if(Object.values(this.loading).some(o=>o))return this.unsetLoadingIndicator();this.loadingIndicator=!1,this.updateTree()},3e3))}}return n.\u0275fac=function(t){return new(t||n)(e.Y36(zi.j),e.Y36(ru.Z),e.Y36(nt),e.Y36(Cn.N),e.Y36(Mo.p4),e.Y36(Sl.g),e.Y36(Ar.$))},n.\u0275cmp=e.Xpm({type:n,selectors:[["cd-cephfs-directories"]],viewQuery:function(t,o){if(1&t&&(e.Gf(pa.qr,5),e.Gf(at,7)),2&t){let l;e.iGM(l=e.CRH())&&(o.treeComponent=l.first),e.iGM(l=e.CRH())&&(o.originTmpl=l.first)}},inputs:{id:"id"},features:[e.TTD],decls:11,vars:10,consts:function(){let s,t;return s="Snapshots",t="Quotas",[[1,"row"],[1,"col-sm-4","pe-0"],[1,"card"],[1,"card-header"],["type","button",1,"btn","btn-light","pull-right",3,"click"],[3,"ngClass"],[1,"card-body"],[3,"nodes","options",4,"ngIf"],["class","col-sm-8 metadata",4,"ngIf"],["origin",""],[3,"nodes","options"],["loadingTemplate",""],[1,"col-sm-8","metadata"],[4,"ngIf"],s,["identifier","name","forceIdentifier","true","selectionType","multiClick",3,"data","columns","updateSelection"],[1,"table-actions",3,"permission","selection","tableActions"],t,["selectionType","single","identifier","quotaKey",3,"data","columns","limit","footer","onlyActionHeader","forceIdentifier","toolHeader","updateSelection"],[1,"only-table-actions",3,"permission","selection","tableActions"],[1,"quota-origin",3,"click"]]},template:function(t,o){1&t&&(e.TgZ(0,"div",0)(1,"div",1)(2,"div",2)(3,"div",3)(4,"button",4),e.NdJ("click",function(){return o.refreshAllDirectories()}),e._UZ(5,"i",5),e.qZA()(),e.TgZ(6,"div",6),e.YNc(7,Ln,3,2,"tree-root",7),e.qZA()()(),e.YNc(8,ui,10,7,"div",8),e.qZA(),e.YNc(9,Lo,2,1,"ng-template",null,9,e.W1O)),2&t&&(e.xp6(4),e.ekj("disabled",o.loadingIndicator),e.xp6(1),e.ekj("fa-spin",o.loadingIndicator),e.Q6J("ngClass",e.WLB(7,vt,o.icons.large,o.icons.refresh)),e.xp6(2),e.Q6J("ngIf",o.nodes),e.xp6(1),e.Q6J("ngIf",o.selectedDir))},directives:[_e.o,p.mk,p.O5,pa.qr,_r.a,bu.K],styles:["cd-cephfs-directories tree-root .tree-children{overflow:inherit}.quota-origin[_ngcontent-%COMP%]{color:#25828e;cursor:pointer}.quota-origin[_ngcontent-%COMP%]:hover{color:#212529}"]}),n})();var ha=i(76317);function Ca(n,s){if(1&n&&e._UZ(0,"cd-cephfs-detail",15),2&n){const t=e.oxw(2);e.Q6J("data",t.details)}}function Ru(n,s){if(1&n){const t=e.EpF();e.TgZ(0,"cd-cephfs-clients",16),e.NdJ("triggerApiUpdate",function(){return e.CHM(t),e.oxw(2).refresh()}),e.qZA()}if(2&n){const t=e.oxw(2);e.Q6J("id",t.id)("clients",t.clients)}}function lc(n,s){if(1&n&&e._UZ(0,"cd-cephfs-directories",17),2&n){const t=e.oxw(2);e.Q6J("id",t.id)}}function Fa(n,s){if(1&n&&e._UZ(0,"cd-grafana",18),2&n){const t=e.oxw(2);e.Q6J("grafanaPath","mds-performance?var-mds_servers=mds."+t.grafanaId)("type","metrics")}}function nl(n,s){if(1&n){const t=e.EpF();e.ynx(0),e.TgZ(1,"nav",1,2),e.NdJ("navChange",function(){return e.CHM(t),e.oxw().softRefresh()}),e.ynx(3,3),e.TgZ(4,"a",4),e.SDv(5,5),e.qZA(),e.YNc(6,Ca,1,1,"ng-template",6),e.BQk(),e.ynx(7,7),e.TgZ(8,"a",4),e.ynx(9),e.SDv(10,8),e.BQk(),e.TgZ(11,"span",9),e._uU(12),e.qZA()(),e.YNc(13,Ru,1,2,"ng-template",6),e.BQk(),e.ynx(14,10),e.TgZ(15,"a",4),e.SDv(16,11),e.qZA(),e.YNc(17,lc,1,1,"ng-template",6),e.BQk(),e.ynx(18,12),e.TgZ(19,"a",4),e.SDv(20,13),e.qZA(),e.YNc(21,Fa,1,2,"ng-template",6),e.BQk(),e.qZA(),e._UZ(22,"div",14),e.BQk()}if(2&n){const t=e.MAs(2),o=e.oxw();e.xp6(12),e.Oqu(o.clients.data.length),e.xp6(10),e.Q6J("ngbNavOutlet",t)}}let mc=(()=>{class n{constructor(t,o,l){this.ngZone=t,this.authStorageService=o,this.cephfsService=l,this.clients={data:[],status:new fi.E(gi.T.ValueNone)},this.details={standbys:"",pools:[],ranks:[],mdsCounters:{},name:""},this.grafanaPermission=this.authStorageService.getPermissions().grafana}ngOnChanges(){this.selection?this.selection.id!==this.id&&this.setupSelected(this.selection.id,this.selection.mdsmap.info):this.unsubscribeInterval()}setupSelected(t,o){this.id=t;const l=Er().first(Object.values(o));this.grafanaId=l&&l.name,this.details={standbys:"",pools:[],ranks:[],mdsCounters:{},name:""},this.clients={data:[],status:new fi.E(gi.T.ValueNone)},this.updateInterval()}updateInterval(){this.unsubscribeInterval(),this.subscribeInterval()}unsubscribeInterval(){this.reloadSubscriber&&this.reloadSubscriber.unsubscribe()}subscribeInterval(){this.ngZone.runOutsideAngular(()=>this.reloadSubscriber=(0,ni.H)(0,5e3).subscribe(()=>this.ngZone.run(()=>this.refresh())))}refresh(){this.cephfsService.getTabs(this.id).subscribe(t=>{this.data=t,this.softRefresh()},()=>{this.clients.status=new fi.E(gi.T.ValueException)})}softRefresh(){const t=Er().cloneDeep(this.data);this.clients=t.clients,this.clients.status=new fi.E(this.clients.status),this.details={standbys:t.standbys,pools:t.pools,ranks:t.ranks,mdsCounters:t.mds_counters,name:t.name}}ngOnDestroy(){this.unsubscribeInterval()}}return n.\u0275fac=function(t){return new(t||n)(e.Y36(e.R0b),e.Y36(zi.j),e.Y36(nt))},n.\u0275cmp=e.Xpm({type:n,selectors:[["cd-cephfs-tabs"]],inputs:{selection:"selection"},features:[e.TTD],decls:1,vars:1,consts:function(){let s,t,o,l,_;return s="Details",t="Clients",o="Directories",l="Performance Details",_="CephFS MDS performance",[[4,"ngIf"],["ngbNav","","cdStatefulTab","cephfs-tabs",1,"nav-tabs",3,"navChange"],["nav","ngbNav"],["ngbNavItem","details"],["ngbNavLink",""],s,["ngbNavContent",""],["ngbNavItem","clients"],t,[1,"badge","badge-pill","badge-tab","ms-1"],["ngbNavItem","directories"],o,["ngbNavItem","performance-details"],l,[3,"ngbNavOutlet"],[3,"data"],[3,"id","clients","triggerApiUpdate"],[3,"id"],["title",_,"uid","tbO9LAiZz","grafanaStyle","one",3,"grafanaPath","type"]]},template:function(t,o){1&t&&e.YNc(0,nl,23,2,"ng-container",0),2&t&&e.Q6J("ngIf",o.selection)},directives:[p.O5,Dr.Pz,kn.m,Dr.nv,Dr.Vx,Dr.uN,kd,gc,_s,ha.F,Dr.tO],styles:[""]}),n})(),vc=(()=>{class n extends Mt.o{constructor(t,o){super(),this.cephfsService=t,this.cdDatePipe=o,this.filesystems=[],this.selection=new sn.r}ngOnInit(){this.columns=[{name:"Name",prop:"mdsmap.fs_name",flexGrow:2},{name:"Created",prop:"mdsmap.created",flexGrow:2,pipe:this.cdDatePipe},{name:"Enabled",prop:"mdsmap.enabled",flexGrow:1,cellTransformation:wt.e.checkIcon}]}loadFilesystems(t){this.cephfsService.list().subscribe(o=>{this.filesystems=o},()=>{t.error()})}updateSelection(t){this.selection=t}}return n.\u0275fac=function(t){return new(t||n)(e.Y36(nt),e.Y36(Cn.N))},n.\u0275cmp=e.Xpm({type:n,selectors:[["cd-cephfs-list"]],features:[e.qOj],decls:2,vars:4,consts:[["columnMode","flex","identifier","id","forceIdentifier","true","selectionType","single",3,"data","columns","hasDetails","fetchData","setExpandedRow","updateSelection"],["cdTableDetail","",3,"selection"]],template:function(t,o){1&t&&(e.TgZ(0,"cd-table",0),e.NdJ("fetchData",function(_){return o.loadFilesystems(_)})("setExpandedRow",function(_){return o.setExpandedRow(_)})("updateSelection",function(_){return o.updateSelection(_)}),e._UZ(1,"cd-cephfs-tabs",1),e.qZA()),2&t&&(e.Q6J("data",o.filesystems)("columns",o.columns)("hasDetails",!0),e.xp6(1),e.Q6J("selection",o.expandedRow))},directives:[_r.a,mc],styles:[""]}),n})(),Bu=(()=>{class n{static getType(t){const o=Er().find(this.knownTypes,l=>l.name===t);if(void 0!==o)return o;throw new Error('Found unknown type "'+t+'" for config option.')}static getTypeValidators(t){const o=n.getType(t.type);if("bool"===o.name||"str"===o.name)return;const l={validators:[],patternHelpText:o.patternHelpText};return o.isNumberType?(t.max&&""!==t.max&&(l.max=t.max,l.validators.push(_n.kI.max(t.max))),t.min&&""!==t.min?(l.min=t.min,l.validators.push(_n.kI.min(t.min))):"defaultMin"in o&&(l.min=o.defaultMin,l.validators.push(_n.kI.min(o.defaultMin))),l.validators.push("float"===t.type?Me.h.decimalNumber():Me.h.number(o.allowsNegative))):"addr"===t.type?l.validators=[Me.h.ip()]:"uuid"===t.type&&(l.validators=[Me.h.uuid()]),l}static getTypeStep(t,o){if(["uint","int","size","secs"].includes(t))return 1;if("float"===t){if(null!==o&&-1!==o.toString().indexOf(".")){const M=o.toString().split(".");return Math.pow(10,-M[1].length)}return.1}}}return n.knownTypes=[{name:"uint",inputType:"number",humanReadable:"Unsigned integer value",defaultMin:0,patternHelpText:"The entered value needs to be an unsigned number.",isNumberType:!0,allowsNegative:!1},{name:"int",inputType:"number",humanReadable:"Integer value",patternHelpText:"The entered value needs to be a number.",isNumberType:!0,allowsNegative:!0},{name:"size",inputType:"number",humanReadable:"Unsigned integer value (>=16bit)",defaultMin:0,patternHelpText:"The entered value needs to be a unsigned number.",isNumberType:!0,allowsNegative:!1},{name:"secs",inputType:"number",humanReadable:"Number of seconds",defaultMin:1,patternHelpText:"The entered value needs to be a number >= 1.",isNumberType:!0,allowsNegative:!1},{name:"float",inputType:"number",humanReadable:"Double value",patternHelpText:"The entered value needs to be a number or decimal.",isNumberType:!0,allowsNegative:!0},{name:"str",inputType:"text",humanReadable:"Text",isNumberType:!1},{name:"addr",inputType:"text",humanReadable:"IPv4 or IPv6 address",patternHelpText:"The entered value needs to be a valid IP address.",isNumberType:!1},{name:"uuid",inputType:"text",humanReadable:"UUID",patternHelpText:"The entered value is not a valid UUID, e.g.: 67dcac9f-2c03-4d6c-b7bd-1210b3a259a8",isNumberType:!1},{name:"bool",inputType:"checkbox",humanReadable:"Boolean value",isNumberType:!1}],n})();var Bl=i(93614),tc=i(95463);class bd{constructor(){this.value=[]}}var kc=i(64724),lu=i(63622),Ma=i(41582),al=i(56310),Il=i(94276),Cl=i(30839);function hf(n,s){1&n&&(e.TgZ(0,"div",8)(1,"label",9),e.SDv(2,20),e.qZA(),e.TgZ(3,"div",11)(4,"textarea",21),e._uU(5,"            "),e.qZA()()())}function zd(n,s){1&n&&(e.TgZ(0,"div",8)(1,"label",9),e.SDv(2,22),e.qZA(),e.TgZ(3,"div",11)(4,"textarea",23),e._uU(5,"            "),e.qZA()()())}function sd(n,s){1&n&&(e.TgZ(0,"div",8)(1,"label",9),e.SDv(2,24),e.qZA(),e.TgZ(3,"div",11),e._UZ(4,"input",25),e.qZA()())}function Ol(n,s){1&n&&(e.TgZ(0,"div",8)(1,"label",9),e.SDv(2,26),e.qZA(),e.TgZ(3,"div",11),e._UZ(4,"input",27),e.qZA()())}function Ll(n,s){if(1&n&&(e.TgZ(0,"span",30)(1,"span",31),e._uU(2),e.qZA()()),2&n){const t=s.$implicit;e.xp6(2),e.Oqu(t)}}function Uu(n,s){if(1&n&&(e.TgZ(0,"div",8)(1,"label",9),e.SDv(2,28),e.qZA(),e.TgZ(3,"div",11),e.YNc(4,Ll,3,1,"span",29),e.qZA()()),2&n){const t=e.oxw(2);e.xp6(4),e.Q6J("ngForOf",t.configForm.getValue("services"))}}function ll(n,s){if(1&n&&(e.TgZ(0,"div",8)(1,"label",32),e._uU(2),e.qZA(),e.TgZ(3,"div",11)(4,"select",33)(5,"option",34),e.SDv(6,35),e.qZA(),e.TgZ(7,"option",34),e.SDv(8,36),e.qZA(),e.TgZ(9,"option",34),e.SDv(10,37),e.qZA()()()()),2&n){const t=e.oxw().$implicit;e.xp6(1),e.Q6J("for",t),e.xp6(1),e.hij("",t," "),e.xp6(2),e.Q6J("formControlName",t),e.xp6(1),e.Q6J("ngValue",null),e.xp6(2),e.Q6J("ngValue",!0),e.xp6(2),e.Q6J("ngValue",!1)}}function Su(n,s){if(1&n&&(e.TgZ(0,"span",40),e._uU(1),e.qZA()),2&n){const t=e.oxw(4);e.xp6(1),e.hij(" ",t.patternHelpText," ")}}function tn(n,s){if(1&n&&(e.TgZ(0,"span",40),e._uU(1),e.qZA()),2&n){const t=e.oxw(4);e.xp6(1),e.hij(" ",t.patternHelpText," ")}}function yc(n,s){if(1&n&&(e.TgZ(0,"span",40),e.SDv(1,41),e.qZA()),2&n){const t=e.oxw(4);e.xp6(1),e.pQV(t.maxValue),e.QtT(1)}}function Nu(n,s){if(1&n&&(e.TgZ(0,"span",40),e.SDv(1,42),e.qZA()),2&n){const t=e.oxw(4);e.xp6(1),e.pQV(t.minValue),e.QtT(1)}}function Xa(n,s){if(1&n&&(e.TgZ(0,"div",8)(1,"label",32),e._uU(2),e.qZA(),e.TgZ(3,"div",11),e._UZ(4,"input",38),e.YNc(5,Su,2,1,"span",39),e.YNc(6,tn,2,1,"span",39),e.YNc(7,yc,2,1,"span",39),e.YNc(8,Nu,2,1,"span",39),e.qZA()()),2&n){const t=e.oxw().$implicit;e.oxw();const o=e.MAs(2),l=e.oxw();e.xp6(1),e.Q6J("for",t),e.xp6(1),e.hij("",t," "),e.xp6(2),e.Q6J("type",l.inputType)("id",t)("placeholder",l.humanReadableType)("formControlName",t)("step",l.getStep(l.type,l.configForm.getValue(t))),e.xp6(1),e.Q6J("ngIf",l.configForm.showError(t,o,"pattern")),e.xp6(1),e.Q6J("ngIf",l.configForm.showError(t,o,"invalidUuid")),e.xp6(1),e.Q6J("ngIf",l.configForm.showError(t,o,"max")),e.xp6(1),e.Q6J("ngIf",l.configForm.showError(t,o,"min"))}}function ul(n,s){if(1&n&&(e.ynx(0),e.YNc(1,ll,11,6,"div",13),e.YNc(2,Xa,9,11,"div",13),e.BQk()),2&n){const t=e.oxw(2);e.xp6(1),e.Q6J("ngIf","bool"===t.type),e.xp6(1),e.Q6J("ngIf","bool"!==t.type)}}function Of(n,s){if(1&n){const t=e.EpF();e.TgZ(0,"div",1)(1,"form",2,3)(3,"div",4)(4,"div",5),e.ynx(5,6),e._uU(6,"Edit"),e.BQk(),e._uU(7),e.qZA(),e.TgZ(8,"div",7)(9,"div",8)(10,"label",9),e.SDv(11,10),e.qZA(),e.TgZ(12,"div",11),e._UZ(13,"input",12),e.qZA()(),e.YNc(14,hf,6,0,"div",13),e.YNc(15,zd,6,0,"div",13),e.YNc(16,sd,5,0,"div",13),e.YNc(17,Ol,5,0,"div",13),e.YNc(18,Uu,5,1,"div",13),e.TgZ(19,"div",14)(20,"h3",15),e.SDv(21,16),e.qZA(),e.YNc(22,ul,3,2,"ng-container",17),e.qZA()(),e.TgZ(23,"div",18)(24,"cd-form-button-panel",19),e.NdJ("submitActionEvent",function(){return e.CHM(t),e.oxw().submit()}),e.qZA()()()()()}if(2&n){const t=e.oxw();e.xp6(1),e.Q6J("formGroup",t.configForm),e.xp6(6),e.hij(" ",t.configForm.getValue("name")," "),e.xp6(7),e.Q6J("ngIf",t.configForm.getValue("desc")),e.xp6(1),e.Q6J("ngIf",t.configForm.getValue("long_desc")),e.xp6(1),e.Q6J("ngIf",""!==t.configForm.getValue("default")),e.xp6(1),e.Q6J("ngIf",""!==t.configForm.getValue("daemon_default")),e.xp6(1),e.Q6J("ngIf",t.configForm.getValue("services").length>0),e.xp6(4),e.Q6J("ngForOf",t.availSections),e.xp6(2),e.Q6J("form",t.configForm)("submitText",t.actionLabels.UPDATE)}}let Yc=(()=>{class n extends Bl.E{constructor(t,o,l,_,M){super(),this.actionLabels=t,this.route=o,this.router=l,this.configService=_,this.notificationService=M,this.availSections=["global","mon","mgr","osd","mds","client"],this.createForm()}createForm(){const t={name:new _n.NI({value:null}),desc:new _n.NI({value:null}),long_desc:new _n.NI({value:null}),values:new _n.cw({}),default:new _n.NI({value:null}),daemon_default:new _n.NI({value:null}),services:new _n.NI([])};this.availSections.forEach(o=>{t.values.addControl(o,new _n.NI(null))}),this.configForm=new tc.d(t)}ngOnInit(){this.route.params.subscribe(t=>{this.configService.get(t.name).subscribe(l=>{this.setResponse(l),this.loadingReady()})})}getValidators(t){const o=Bu.getTypeValidators(t);if(o)return this.patternHelpText=o.patternHelpText,"max"in o&&""!==o.max&&(this.maxValue=o.max),"min"in o&&""!==o.min&&(this.minValue=o.min),o.validators}getStep(t,o){return Bu.getTypeStep(t,o)}setResponse(t){this.response=t;const o=this.getValidators(t);this.configForm.get("name").setValue(t.name),this.configForm.get("desc").setValue(t.desc),this.configForm.get("long_desc").setValue(t.long_desc),this.configForm.get("default").setValue(t.default),this.configForm.get("daemon_default").setValue(t.daemon_default),this.configForm.get("services").setValue(t.services),this.response.value&&this.response.value.forEach(_=>{let M=null;M="true"===_.value||"false"!==_.value&&_.value,this.configForm.get("values").get(_.section).setValue(M)}),this.availSections.forEach(_=>{this.configForm.get("values").get(_).setValidators(o)});const l=Bu.getType(t.type);this.type=l.name,this.inputType=l.inputType,this.humanReadableType=l.humanReadable}createRequest(){const t=[];if(this.availSections.forEach(o=>{const l=this.configForm.getValue(o);null!==l&&""!==l&&t.push({section:o,value:l})}),!Er().isEqual(this.response.value,t)){const o=new bd;return o.name=this.configForm.getValue("name"),o.value=t,o}return null}submit(){const t=this.createRequest();t&&this.configService.create(t).subscribe(()=>{this.notificationService.show(Sa.k.success,"Updated config option " + t.name + ""),this.router.navigate(["/configuration"])},()=>{this.configForm.setErrors({cdSubmitButton:!0})}),this.router.navigate(["/configuration"])}}return n.\u0275fac=function(t){return new(t||n)(e.Y36(Mo.p4),e.Y36(Bo.gz),e.Y36(Bo.F0),e.Y36(kc.e),e.Y36(Sl.g))},n.\u0275cmp=e.Xpm({type:n,selectors:[["cd-configuration-form"]],features:[e.qOj],decls:1,vars:1,consts:function(){let s,t,o,l,_,M,w,N,V,X,re,oe;return s="Name",t="Values",o="Description",l="Long description",_="Default",M="Daemon default",w="Services",N="-- Default --",V="true",X="false",re="The entered value is too high! It must not be greater than " + "\ufffd0\ufffd" + ".",oe="The entered value is too low! It must not be lower than " + "\ufffd0\ufffd" + ".",[["class","cd-col-form",4,"cdFormLoading"],[1,"cd-col-form"],["name","configForm","novalidate","",3,"formGroup"],["formDir","ngForm"],[1,"card"],[1,"card-header"],["i18",""],[1,"card-body"],[1,"form-group","row"],[1,"cd-col-form-label"],s,[1,"cd-col-form-input"],["type","text","id","name","formControlName","name","readonly","",1,"form-control"],["class","form-group row",4,"ngIf"],["formGroupName","values"],[1,"cd-header"],t,[4,"ngFor","ngForOf"],[1,"card-footer"],["wrappingClass","text-right",3,"form","submitText","submitActionEvent"],o,["id","desc","formControlName","desc","readonly","",1,"form-control","resize-vertical"],l,["id","long_desc","formControlName","long_desc","readonly","",1,"form-control","resize-vertical"],_,["type","text","id","default","formControlName","default","readonly","",1,"form-control"],M,["type","text","id","daemon_default","formControlName","daemon_default","readonly","",1,"form-control"],w,["class","form-component-badge",4,"ngFor","ngForOf"],[1,"form-component-badge"],[1,"badge","badge-dark"],[1,"cd-col-form-label",3,"for"],["id","pool","name","pool",1,"form-select",3,"formControlName"],[3,"ngValue"],N,V,X,[1,"form-control",3,"type","id","placeholder","formControlName","step"],["class","invalid-feedback",4,"ngIf"],[1,"invalid-feedback"],re,oe]},template:function(t,o){1&t&&e.YNc(0,Of,25,10,"div",0),2&t&&e.Q6J("cdFormLoading",o.loading)},directives:[lu.y,_n._Y,_n.JL,Ma.V,_n.sg,al.P,_e.o,_n.Fj,Il.b,_n.JJ,_n.u,p.O5,p.sg,_n.x0,_n.EJ,_n.YN,_n.Kr,Cl.p],styles:[".form-component-badge[_ngcontent-%COMP%]{display:block;height:34px}.form-component-badge[_ngcontent-%COMP%]   span[_ngcontent-%COMP%]{margin-top:7px}.resize-vertical[_ngcontent-%COMP%]{resize:vertical}"]}),n})();var Sd=i(68962);function uc(n,s){if(1&n&&(e.TgZ(0,"span"),e._uU(1),e._UZ(2,"br"),e.qZA()),2&n){const t=s.$implicit,o=s.last;e.xp6(1),e.lnq(" ",t.section,": ",t.value,"",o?"":",","")}}function Td(n,s){if(1&n&&(e.TgZ(0,"span")(1,"span",23)(2,"span",24),e._uU(3),e.ALo(4,"uppercase"),e.qZA()()()),2&n){const t=s.$implicit,o=e.oxw(2);e.xp6(1),e.s9C("title",o.flags[t]),e.xp6(2),e.Oqu(e.lcZ(4,2,t))}}function $p(n,s){if(1&n&&(e.TgZ(0,"span")(1,"span",24),e._uU(2),e.qZA()()),2&n){const t=s.$implicit;e.xp6(2),e.Oqu(t)}}function _f(n,s){if(1&n&&(e.ynx(0),e.TgZ(1,"table",1)(2,"tbody")(3,"tr")(4,"td",2),e.SDv(5,3),e.qZA(),e.TgZ(6,"td",4),e._uU(7),e.qZA()(),e.TgZ(8,"tr")(9,"td",5),e.SDv(10,6),e.qZA(),e.TgZ(11,"td"),e._uU(12),e.qZA()(),e.TgZ(13,"tr")(14,"td",5),e.SDv(15,7),e.qZA(),e.TgZ(16,"td"),e._uU(17),e.qZA()(),e.TgZ(18,"tr")(19,"td",5),e.SDv(20,8),e.qZA(),e.TgZ(21,"td"),e.YNc(22,uc,3,3,"span",9),e.qZA()(),e.TgZ(23,"tr")(24,"td",5),e.SDv(25,10),e.qZA(),e.TgZ(26,"td"),e._uU(27),e.qZA()(),e.TgZ(28,"tr")(29,"td",5),e.SDv(30,11),e.qZA(),e.TgZ(31,"td"),e._uU(32),e.qZA()(),e.TgZ(33,"tr")(34,"td",5),e.SDv(35,12),e.qZA(),e.TgZ(36,"td"),e._uU(37),e.qZA()(),e.TgZ(38,"tr")(39,"td",5),e.SDv(40,13),e.qZA(),e.TgZ(41,"td"),e._uU(42),e.qZA()(),e.TgZ(43,"tr")(44,"td",5),e.SDv(45,14),e.qZA(),e.TgZ(46,"td"),e._uU(47),e.qZA()(),e.TgZ(48,"tr")(49,"td",5),e.SDv(50,15),e.qZA(),e.TgZ(51,"td"),e.YNc(52,Td,5,4,"span",9),e.qZA()(),e.TgZ(53,"tr")(54,"td",5),e.SDv(55,16),e.qZA(),e.TgZ(56,"td"),e.YNc(57,$p,3,1,"span",9),e.qZA()(),e.TgZ(58,"tr")(59,"td",5),e.SDv(60,17),e.qZA(),e.TgZ(61,"td"),e._uU(62),e.qZA()(),e.TgZ(63,"tr")(64,"td",5),e.SDv(65,18),e.qZA(),e.TgZ(66,"td"),e._uU(67),e.qZA()(),e.TgZ(68,"tr")(69,"td",5),e.SDv(70,19),e.qZA(),e.TgZ(71,"td"),e._uU(72),e.ALo(73,"booleanText"),e.qZA()(),e.TgZ(74,"tr")(75,"td",5),e.SDv(76,20),e.qZA(),e.TgZ(77,"td"),e._uU(78),e.qZA()(),e.TgZ(79,"tr")(80,"td",5),e.SDv(81,21),e.qZA(),e.TgZ(82,"td"),e._uU(83),e.qZA()(),e.TgZ(84,"tr")(85,"td",5),e.SDv(86,22),e.qZA(),e.TgZ(87,"td"),e._uU(88),e.qZA()()()(),e.BQk()),2&n){const t=e.oxw();e.xp6(7),e.Oqu(t.selection.name),e.xp6(5),e.Oqu(t.selection.desc),e.xp6(5),e.Oqu(t.selection.long_desc),e.xp6(5),e.Q6J("ngForOf",t.selection.value),e.xp6(5),e.Oqu(t.selection.default),e.xp6(5),e.Oqu(t.selection.daemon_default),e.xp6(5),e.Oqu(t.selection.type),e.xp6(5),e.Oqu(t.selection.min),e.xp6(5),e.Oqu(t.selection.max),e.xp6(5),e.Q6J("ngForOf",t.selection.flags),e.xp6(5),e.Q6J("ngForOf",t.selection.services),e.xp6(5),e.Oqu(t.selection.source),e.xp6(5),e.Oqu(t.selection.level),e.xp6(5),e.Oqu(e.lcZ(73,17,t.selection.can_update_at_runtime)),e.xp6(6),e.Oqu(t.selection.tags),e.xp6(5),e.Oqu(t.selection.enum_values),e.xp6(5),e.Oqu(t.selection.see_also)}}let up=(()=>{class n{constructor(){this.flags={runtime:"The value can be updated at runtime.",no_mon_update:"Daemons/clients do not pull this value from the\n      monitor config database. We disallow setting this option via 'ceph config\n      set ...'. This option should be configured via ceph.conf or via the\n      command line.",startup:"Option takes effect only during daemon startup.",cluster_create:"Option only affects cluster creation.",create:"Option only affects daemon creation."}}ngOnChanges(){this.selection&&(this.selection.services=Er().split(this.selection.services,","))}}return n.\u0275fac=function(t){return new(t||n)},n.\u0275cmp=e.Xpm({type:n,selectors:[["cd-configuration-details"]],inputs:{selection:"selection"},features:[e.TTD],decls:1,vars:1,consts:function(){let s,t,o,l,_,M,w,N,V,X,re,oe,fe,ve,Pe,De,Ie;return s="Name",t="Description",o="Long description",l="Current values",_="Default",M="Daemon default",w="Type",N="Min",V="Max",X="Flags",re="Services",oe="Source",fe="Level",ve="Can be updated at runtime (editable)",Pe="Tags",De="Enum values",Ie="See also",[[4,"ngIf"],[1,"table","table-striped","table-bordered"],[1,"bold","w-25"],s,[1,"w-75"],[1,"bold"],t,o,l,[4,"ngFor","ngForOf"],_,M,w,N,V,X,re,oe,fe,ve,Pe,De,Ie,[3,"title"],[1,"badge","badge-dark","me-2"]]},template:function(t,o){1&t&&e.YNc(0,_f,89,19,"ng-container",0),2&t&&e.Q6J("ngIf",o.selection)},directives:[p.O5,p.sg],pipes:[p.gd,Sd.T],styles:[""]}),n})();const Yu=["confValTpl"],Ec=["confFlagTpl"];function Vd(n,s){if(1&n&&(e.TgZ(0,"span"),e._uU(1),e._UZ(2,"br"),e.qZA()),2&n){const t=s.$implicit,o=s.last;e.xp6(1),e.lnq(" ",t.section,": ",t.value,"",o?"":",","")}}function Af(n,s){if(1&n&&(e.TgZ(0,"span"),e.YNc(1,Vd,3,3,"span",5),e.qZA()),2&n){const t=e.oxw().value;e.xp6(1),e.Q6J("ngForOf",t)}}function vp(n,s){1&n&&e.YNc(0,Af,2,1,"span",4),2&n&&e.Q6J("ngIf",s.value)}let $c=(()=>{class n extends Mt.o{constructor(t,o,l){super(),this.authStorageService=t,this.configurationService=o,this.actionLabels=l,this.data=[],this.icons=No.P,this.selection=new sn.r,this.filters=[{name:"Level",prop:"level",filterOptions:["basic","advanced","dev"],filterInitValue:"basic",filterPredicate:(w,N)=>{let V;var re;return(re=V||(V={}))[re.basic=0]="basic",re[re.advanced=1]="advanced",re[re.dev=2]="dev",V[w.level]<=V[N]}},{name:"Service",prop:"services",filterOptions:["mon","mgr","osd","mds","common","mds_client","rgw"],filterPredicate:(w,N)=>w.services.includes(N)},{name:"Source",prop:"source",filterOptions:["mon"],filterPredicate:(w,N)=>!!w.hasOwnProperty("source")&&w.source.includes(N)},{name:"Modified",prop:"modified",filterOptions:["yes","no"],filterPredicate:(w,N)=>!!("yes"===N&&w.hasOwnProperty("value")||"no"===N&&!w.hasOwnProperty("value"))}],this.permission=this.authStorageService.getPermissions().configOpt;const _=()=>this.selection.first()&&`${encodeURIComponent(this.selection.first().name)}`;this.tableActions=[{permission:"update",icon:No.P.edit,routerLink:()=>`/configuration/edit/${_()}`,name:this.actionLabels.EDIT,disable:()=>!this.isEditable(this.selection)}]}ngOnInit(){this.columns=[{canAutoResize:!0,prop:"name",name:"Name"},{prop:"desc",name:"Description",cellClass:"wrap"},{prop:"value",name:"Current value",cellClass:"wrap",cellTemplate:this.confValTpl},{prop:"default",name:"Default",cellClass:"wrap"},{prop:"can_update_at_runtime",name:"Editable",cellTransformation:wt.e.checkIcon,flexGrow:.4,cellClass:"text-center"}]}updateSelection(t){this.selection=t}getConfigurationList(t){this.configurationService.getConfigData().subscribe(o=>{this.data=o},()=>{t.error()})}isEditable(t){return 1===t.selected.length&&t.selected[0].can_update_at_runtime}}return n.\u0275fac=function(t){return new(t||n)(e.Y36(zi.j),e.Y36(kc.e),e.Y36(Mo.p4))},n.\u0275cmp=e.Xpm({type:n,selectors:[["cd-configuration"]],viewQuery:function(t,o){if(1&t&&(e.Gf(Yu,7),e.Gf(Ec,5)),2&t){let l;e.iGM(l=e.CRH())&&(o.confValTpl=l.first),e.iGM(l=e.CRH())&&(o.confFlagTpl=l.first)}},features:[e.qOj],decls:5,vars:8,consts:[["selectionType","single",3,"data","columns","extraFilterableColumns","hasDetails","fetchData","setExpandedRow","updateSelection"],[1,"table-actions",3,"permission","selection","tableActions"],["cdTableDetail","",3,"selection"],["confValTpl",""],[4,"ngIf"],[4,"ngFor","ngForOf"]],template:function(t,o){1&t&&(e.TgZ(0,"cd-table",0),e.NdJ("fetchData",function(_){return o.getConfigurationList(_)})("setExpandedRow",function(_){return o.setExpandedRow(_)})("updateSelection",function(_){return o.updateSelection(_)}),e._UZ(1,"cd-table-actions",1)(2,"cd-configuration-details",2),e.qZA(),e.YNc(3,vp,1,1,"ng-template",null,3,e.W1O)),2&t&&(e.Q6J("data",o.data)("columns",o.columns)("extraFilterableColumns",o.filters)("hasDetails",!0),e.xp6(1),e.Q6J("permission",o.permission)("selection",o.selection)("tableActions",o.tableActions),e.xp6(1),e.Q6J("selection",o.expandedRow))},directives:[_r.a,bu.K,up,p.O5,p.sg],styles:[".filter[_ngcontent-%COMP%]{padding-right:8px}.fa-stack[_ngcontent-%COMP%]{font-size:.79rem}.fa-stack[_ngcontent-%COMP%]   .fa-stack-1x[_ngcontent-%COMP%]{margin-left:8px;margin-top:5px}  cd-configuration datatable-body-cell.wrap{word-break:break-all}"]}),n})();var Pu=i(35758),ad=i(68939),nc=i(25917),Oa=i(88002),Jc=i(42145),ld=i(548),cp=i(95242),$d=i(34022);function du(n,s,t){return 0===t?[s]:(n.push(s),n)}function Fl(){return function vo(n,s){return arguments.length>=2?function(o){return(0,$d.z)((0,Jc.R)(n,s),(0,ld.h)(1),(0,cp.d)(s))(o)}:function(o){return(0,$d.z)((0,Jc.R)((l,_,M)=>n(l,_,M+1)),(0,ld.h)(1))(o)}}(du,[])}var Ac=i(19773),ma=i(76189),Dc=i(51295);let Iu=(()=>{class n{calculateAdditionalData(t){if(!t.life_expectancy_min||!t.life_expectancy_max)return t.state="unknown",t;const o=N=>!!Number.parseFloat(N),l=(N,V)=>N&&V&&o(N)&&o(V)?Es().duration(Es()(N).diff(Es()(V))).asWeeks():null,_=Es().duration(Es()(Es().now()).diff(Es()(t.life_expectancy_stamp))).asWeeks(),M=l(t.life_expectancy_max,t.life_expectancy_stamp),w=l(t.life_expectancy_min,t.life_expectancy_stamp);return t.state=_>1?"stale":null!==M&&M<=2?"bad":null!==w&&w<=4?"warning":"good",t.life_expectancy_weeks={max:null!==M?Math.round(M):null,min:null!==w?Math.round(w):null},t}readable(t){return t.readableDaemons=t.daemons.join(" "),t}prepareDevice(t){return this.readable(this.calculateAdditionalData(t))}}return n.\u0275fac=function(t){return new(t||n)},n.\u0275prov=e.Yz7({token:n,factory:n.\u0275fac,providedIn:"root"}),n})(),bc=(()=>{class n extends ma.S{constructor(t,o){super(),this.http=t,this.deviceService=o,this.baseURL="api/host",this.baseUIURL="ui-api/host",this.predefinedLabels=["mon","mgr","osd","mds","rgw","nfs","iscsi","rbd","grafana"]}list(t){return this.http.get(this.baseURL,{headers:{Accept:this.getVersionHeaderValue(1,2)},params:{facts:t}})}create(t,o,l,_){return this.http.post(this.baseURL,{hostname:t,addr:o,labels:l,status:_},{observe:"response",headers:{Accept:Dc.T.cdVersionHeader("0","1")}})}delete(t){return this.http.delete(`${this.baseURL}/${t}`,{observe:"response"})}getDevices(t){return this.http.get(`${this.baseURL}/${t}/devices`).pipe((0,Oa.U)(o=>o.map(l=>this.deviceService.prepareDevice(l))))}getSmartData(t){return this.http.get(`${this.baseURL}/${t}/smart`)}getDaemons(t){return this.http.get(`${this.baseURL}/${t}/daemons`)}getLabels(){return this.http.get(`${this.baseUIURL}/labels`)}update(t,o=!1,l=[],_=!1,M=!1,w=!1){return this.http.put(`${this.baseURL}/${t}`,{update_labels:o,labels:l,maintenance:_,force:M,drain:w},{headers:{Accept:this.getVersionHeaderValue(0,1)}})}identifyDevice(t,o,l){return this.http.post(`${this.baseURL}/${t}/identify_device`,{device:o,duration:l})}getInventoryParams(t){let o=new y.LE;return t&&(o=o.append("refresh",Er().toString(t))),o}getInventory(t,o){const l=this.getInventoryParams(o);return this.http.get(`${this.baseURL}/${t}/inventory`,{params:l})}inventoryList(t){const o=this.getInventoryParams(t);return this.http.get(`${this.baseUIURL}/inventory`,{params:o})}inventoryDeviceList(t,o){let l;return l=t?this.getInventory(t,o).pipe(Fl()):this.inventoryList(o),l.pipe((0,Ac.zg)(_=>{const M=Er().flatMap(_,w=>w.devices.map(N=>(N.hostname=w.name,N.uid=N.device_id?`${N.device_id}-${N.hostname}-${N.path}`:`${N.hostname}-${N.path}`,N)));return(0,nc.of)(M)}))}}return n.\u0275fac=function(t){return new(t||n)(e.LFG(y.eN),e.LFG(Iu))},n.\u0275prov=e.Yz7({token:n,factory:n.\u0275fac,providedIn:"root"}),n})(),cc=(()=>{class n{constructor(t,o){this.http=t,this.deviceService=o,this.path="api/osd",this.uiPath="ui-api/osd",this.osdDevices=[],this.osdRecvSpeedModalPriorities={KNOWN_PRIORITIES:[{name:null,text:"-- Select the priority --",values:{osd_max_backfills:null,osd_recovery_max_active:null,osd_recovery_max_single_start:null,osd_recovery_sleep:null}},{name:"low",text:"Low",values:{osd_max_backfills:1,osd_recovery_max_active:1,osd_recovery_max_single_start:1,osd_recovery_sleep:.5}},{name:"default",text:"Default",values:{osd_max_backfills:1,osd_recovery_max_active:3,osd_recovery_max_single_start:1,osd_recovery_sleep:0}},{name:"high",text:"High",values:{osd_max_backfills:4,osd_recovery_max_active:4,osd_recovery_max_single_start:4,osd_recovery_sleep:0}}]}}create(t,o,l="drive_groups"){return this.http.post(this.path,{method:l,data:t,tracking_id:o},{observe:"response"})}getList(){return this.http.get(`${this.path}`)}getOsdSettings(){return this.http.get(`${this.path}/settings`,{headers:{Accept:"application/vnd.ceph.api.v0.1+json"}})}getDetails(t){return this.http.get(`${this.path}/${t}`)}getSmartData(t){return this.http.get(`${this.path}/${t}/smart`)}scrub(t,o){return this.http.post(`${this.path}/${t}/scrub?deep=${o}`,null)}getDeploymentOptions(){return this.http.get(`${this.uiPath}/deployment_options`)}getFlags(){return this.http.get(`${this.path}/flags`)}updateFlags(t){return this.http.put(`${this.path}/flags`,{flags:t})}updateIndividualFlags(t,o){return this.http.put(`${this.path}/flags/individual`,{flags:t,ids:o})}markOut(t){return this.http.put(`${this.path}/${t}/mark`,{action:"out"})}markIn(t){return this.http.put(`${this.path}/${t}/mark`,{action:"in"})}markDown(t){return this.http.put(`${this.path}/${t}/mark`,{action:"down"})}reweight(t,o){return this.http.post(`${this.path}/${t}/reweight`,{weight:o})}update(t,o){return this.http.put(`${this.path}/${t}`,{device_class:o})}markLost(t){return this.http.put(`${this.path}/${t}/mark`,{action:"lost"})}purge(t){return this.http.post(`${this.path}/${t}/purge`,null)}destroy(t){return this.http.post(`${this.path}/${t}/destroy`,null)}delete(t,o,l){return this.http.delete(`${this.path}/${t}`,{observe:"response",params:{preserve_id:o?"true":"false",force:l?"true":"false"}})}safeToDestroy(t){return this.http.get(`${this.path}/safe_to_destroy?ids=${t}`)}safeToDelete(t){return this.http.get(`${this.path}/safe_to_delete?svc_ids=${t}`)}getDevices(t){return this.http.get(`${this.path}/${t}/devices`).pipe((0,Oa.U)(o=>o.map(l=>this.deviceService.prepareDevice(l))))}}return n.\u0275fac=function(t){return new(t||n)(e.LFG(y.eN),e.LFG(Iu))},n.\u0275prov=e.Yz7({token:n,factory:n.\u0275fac,providedIn:"root"}),n})();var Jl=i(76111),Sc=i(32337),Tc=i(26215);const ju=[{stepIndex:1,isComplete:!1}];let fu=(()=>{class n{constructor(){this.currentStep$=new Tc.X(null),this.steps$=new Tc.X(ju),this.currentStep$.next(this.steps$.value[0])}setTotalSteps(t){const o=[];for(let l=1;l<=t;l++)o.push({stepIndex:l,isComplete:!1});this.steps$=new Tc.X(o)}setCurrentStep(t){this.currentStep$.next(t)}getCurrentStep(){return this.currentStep$.asObservable()}getSteps(){return this.steps$.asObservable()}moveToNextStep(){this.currentStep$.next(this.steps$.value[this.currentStep$.value.stepIndex])}moveToPreviousStep(){this.currentStep$.next(this.steps$.value[this.currentStep$.value.stepIndex-1-1])}isLastStep(){return this.currentStep$.value.stepIndex===this.steps$.value.length}isFirstStep(){var t;return(null===(t=this.currentStep$.value)||void 0===t?void 0:t.stepIndex)-1==0}}return n.\u0275fac=function(t){return new(t||n)},n.\u0275prov=e.Yz7({token:n,factory:n.\u0275fac,providedIn:"root"}),n})();var ud=i(28211);class dc{constructor(){this.reset(),this.formatterService=new ud.H,this.deviceSelectionAttrs={"sys_api.vendor":{name:"vendor"},"sys_api.model":{name:"model"},device_id:{name:"device_id"},human_readable_type:{name:"rotational",formatter:s=>"hdd"===s.toLowerCase()},"sys_api.size":{name:"size",formatter:s=>this.formatterService.format_number(s,1024,["B","KB","MB","GB","TB","PB"]).replace(" ","")}}}reset(){this.spec={service_type:"osd",service_id:`dashboard-${Er().now()}`}}setName(s){this.spec.service_id=s}setHostPattern(s){this.spec.host_pattern=s}setDeviceSelection(s,t){const o=`${s}_devices`;this.spec[o]={},t.forEach(l=>{const _=this.deviceSelectionAttrs[l.prop];_&&(this.spec[o][_.name]=_.formatter?_.formatter(l.value.raw):l.value.raw)})}clearDeviceSelection(s){delete this.spec[`${s}_devices`]}setSlots(s,t){const o=`${s}_slots`;0===t?delete this.spec[o]:this.spec[o]=t}setFeature(s,t){t?this.spec[s]=!0:delete this.spec[s]}}let Zd=(()=>{class n{constructor(t){this.http=t,this.baseURL="api/cluster"}getStatus(){return this.http.get(`${this.baseURL}`,{headers:{Accept:"application/vnd.ceph.api.v0.1+json"}})}updateStatus(t){return this.http.put(`${this.baseURL}`,{status:t},{headers:{Accept:"application/vnd.ceph.api.v0.1+json"}})}}return n.\u0275fac=function(t){return new(t||n)(e.LFG(y.eN))},n.\u0275prov=e.Yz7({token:n,factory:n.\u0275fac,providedIn:"root"}),n})();const Qc=function(n){return{active:n}};function Rl(n,s){if(1&n){const t=e.EpF();e.TgZ(0,"ul",4)(1,"li",5)(2,"a",6),e.NdJ("click",function(){const _=e.CHM(t).$implicit;return e.oxw().onStepClick(_)}),e.TgZ(3,"span",7),e.SDv(4,8),e.qZA(),e.TgZ(5,"span"),e.SDv(6,9),e.qZA()()()()}if(2&n){const t=s.$implicit,o=s.index,l=e.oxw();e.xp6(2),e.Q6J("ngClass",e.VKq(4,Qc,l.currentStep.stepIndex===t.stepIndex)),e.xp6(1),e.Q6J("ngClass",e.VKq(6,Qc,l.currentStep.stepIndex===t.stepIndex)),e.xp6(1),e.pQV(t.stepIndex),e.QtT(4),e.xp6(2),e.pQV(l.stepsTitle[o]),e.QtT(6)}}let jc=(()=>{class n{constructor(t){this.stepsService=t}ngOnInit(){this.stepsService.setTotalSteps(this.stepsTitle.length),this.steps=this.stepsService.getSteps(),this.currentStepSub=this.stepsService.getCurrentStep().subscribe(t=>{this.currentStep=t})}onStepClick(t){this.stepsService.setCurrentStep(t)}ngOnDestroy(){this.currentStepSub.unsubscribe()}}return n.\u0275fac=function(t){return new(t||n)(e.Y36(fu))},n.\u0275cmp=e.Xpm({type:n,selectors:[["cd-wizard"]],inputs:{stepsTitle:"stepsTitle"},decls:5,vars:3,consts:function(){let s,t;return s="" + "\ufffd0\ufffd" + "",t="" + "\ufffd0\ufffd" + "",[[1,"card-body"],[1,"row","m-7"],[1,"col"],["class","nav nav-pills flex-column",4,"ngFor","ngForOf"],[1,"nav","nav-pills","flex-column"],[1,"nav-item"],[1,"nav-link",3,"ngClass","click"],[1,"circle-step",3,"ngClass"],s,t]},template:function(t,o){1&t&&(e.TgZ(0,"div",0)(1,"div",1)(2,"nav",2),e.YNc(3,Rl,7,8,"ul",3),e.ALo(4,"async"),e.qZA()()()),2&t&&(e.xp6(3),e.Q6J("ngForOf",e.lcZ(4,1,o.steps)))},directives:[p.sg,p.mk],pipes:[p.Ov],styles:["cd-wizard{width:15%}.card-body[_ngcontent-%COMP%]{padding-left:0}span.circle-step[_ngcontent-%COMP%]{background:#adb5bd;border-radius:.8em;color:#fff;display:inline-block;font-weight:700;line-height:1.6em;margin-right:5px;text-align:center;width:1.6em}span.circle-step.active[_ngcontent-%COMP%]{background-color:#25828e}.nav-pills[_ngcontent-%COMP%]   .nav-link[_ngcontent-%COMP%]{background-color:#fff;color:#343a40}.nav-pills[_ngcontent-%COMP%]   .nav-link.active[_ngcontent-%COMP%]{color:#25828e}"]}),n})();var fc=i(13464);let h=(()=>{class n{constructor(t){this.http=t,this.url="ui-api/orchestrator",this.disableMessages={noOrchestrator:"The feature is disabled because Orchestrator is not available.",missingFeature:"The Orchestrator backend doesn't support this feature."}}status(){return this.http.get(`${this.url}/status`)}hasFeature(t,o){return Er().every(o,l=>Er().get(t.features,`${l}.available`))}getTableActionDisableDesc(t,o){return!!t&&(t.available?!this.hasFeature(t,o)&&this.disableMessages.missingFeature:this.disableMessages.noOrchestrator)}}return n.\u0275fac=function(t){return new(t||n)(e.LFG(y.eN))},n.\u0275prov=e.Yz7({token:n,factory:n.\u0275fac,providedIn:"root"}),n})();var E=i(7022),x=(()=>{return(n=x||(x={})).HOST_LIST="get_hosts",n.HOST_ADD="add_host",n.HOST_REMOVE="remove_host",n.HOST_LABEL_ADD="add_host_label",n.HOST_LABEL_REMOVE="remove_host_label",n.HOST_MAINTENANCE_ENTER="enter_host_maintenance",n.HOST_MAINTENANCE_EXIT="exit_host_maintenance",n.HOST_FACTS="get_facts",n.HOST_DRAIN="drain_host",n.SERVICE_LIST="describe_service",n.SERVICE_CREATE="apply",n.SERVICE_EDIT="apply",n.SERVICE_DELETE="remove_service",n.SERVICE_RELOAD="service_action",n.DAEMON_LIST="list_daemons",n.OSD_GET_REMOVE_STATUS="remove_osds_status",n.OSD_CREATE="apply_drivegroups",n.OSD_DELETE="remove_osds",n.DEVICE_LIST="get_inventory",n.DEVICE_BLINK_LIGHT="blink_device_light",x;var n})(),F=i(41039),Q=i(51847),le=i(33512),me=i.n(le),Fe=i(60312),Oe=i(18372),Je=i(82945),ht=i(60192),gt=i(10545);function nn(n,s){1&n&&(e.TgZ(0,"span",24),e.SDv(1,25),e.qZA())}function $n(n,s){1&n&&(e.TgZ(0,"span",24),e.SDv(1,26),e.qZA())}function Bn(n,s){1&n&&(e.TgZ(0,"span",24),e.SDv(1,30),e.qZA())}function ar(n,s){if(1&n&&(e.TgZ(0,"div",8)(1,"label",27),e.SDv(2,28),e.qZA(),e.TgZ(3,"div",15),e._UZ(4,"input",29),e.YNc(5,Bn,2,0,"span",17),e.qZA()()),2&n){e.oxw();const t=e.MAs(2),o=e.oxw();e.xp6(5),e.Q6J("ngIf",o.hostForm.showError("addr",t,"pattern"))}}function Pr(n,s){1&n&&(e.TgZ(0,"div",8)(1,"div",31)(2,"div",32),e._UZ(3,"input",33),e.TgZ(4,"label",34),e.SDv(5,35),e.qZA()()()())}function $i(n,s){if(1&n){const t=e.EpF();e.TgZ(0,"div")(1,"form",5,6)(3,"div",7)(4,"div",8)(5,"label",9),e.ynx(6),e.SDv(7,10),e.BQk(),e.TgZ(8,"cd-helper")(9,"p"),e.SDv(10,11),e.qZA(),e.TgZ(11,"ul")(12,"li"),e.tHW(13,12),e._UZ(14,"samp"),e.N_p(),e.qZA(),e.TgZ(15,"li"),e.tHW(16,13),e._UZ(17,"samp"),e.N_p(),e.qZA(),e.TgZ(18,"li"),e.tHW(19,14),e._UZ(20,"samp"),e.N_p(),e.qZA()()()(),e.TgZ(21,"div",15)(22,"input",16),e.NdJ("keyup",function(){return e.CHM(t),e.oxw().checkHostNameValue()}),e.qZA(),e.YNc(23,nn,2,0,"span",17),e.YNc(24,$n,2,0,"span",17),e.qZA()(),e.YNc(25,ar,6,1,"div",18),e.TgZ(26,"div",8)(27,"label",19),e.SDv(28,20),e.qZA(),e.TgZ(29,"div",15),e._UZ(30,"cd-select-badges",21),e.qZA()(),e.YNc(31,Pr,6,0,"div",18),e.qZA(),e.TgZ(32,"div",22)(33,"cd-form-button-panel",23),e.NdJ("submitActionEvent",function(){return e.CHM(t),e.oxw().submit()}),e.ALo(34,"titlecase"),e.ALo(35,"upperFirst"),e.qZA()()()()}if(2&n){const t=e.MAs(2),o=e.oxw();e.xp6(1),e.Q6J("formGroup",o.hostForm),e.xp6(22),e.Q6J("ngIf",o.hostForm.showError("hostname",t,"required")),e.xp6(1),e.Q6J("ngIf",o.hostForm.showError("hostname",t,"uniqueName")),e.xp6(1),e.Q6J("ngIf",!o.hostPattern),e.xp6(5),e.Q6J("data",o.hostForm.controls.labels.value)("options",o.labelsOption)("customBadges",!0)("messages",o.messages),e.xp6(1),e.Q6J("ngIf",!o.hideMaintenance),e.xp6(2),e.Q6J("form",o.hostForm)("submitText",e.lcZ(34,11,o.action)+" "+e.lcZ(35,13,o.resource))}}let is=(()=>{class n extends Bl.E{constructor(t,o,l,_,M){super(),this.router=t,this.actionLabels=o,this.hostService=l,this.taskWrapper=_,this.activeModal=M,this.hostnameArray=[],this.hostPattern=!1,this.labelsOption=[],this.messages=new E.a({empty:"There are no labels.",filter:"Filter or add labels",add:"Add label"}),this.resource="host",this.action=this.actionLabels.ADD}ngOnInit(){this.router.url.includes("hosts")&&(this.pageURL="hosts"),this.createForm(),this.hostService.list("false").subscribe(t=>{this.hostnames=t.map(o=>o.hostname),this.loadingReady()}),this.hostService.getLabels().subscribe(t=>{const o=new Set(t.concat(this.hostService.predefinedLabels));this.labelsOption=Array.from(o).map(l=>({enabled:!0,name:l,selected:!1,description:null}))})}checkHostNameValue(){this.hostPattern=!!this.hostForm.get("hostname").value.match(/[()\[\]{},]/g)}createForm(){this.hostForm=new tc.d({hostname:new _n.NI("",{validators:[_n.kI.required,Me.h.custom("uniqueName",t=>this.hostnames&&-1!==this.hostnames.indexOf(t))]}),addr:new _n.NI("",{validators:[Me.h.ip()]}),labels:new _n.NI([]),maintenance:new _n.NI(!1)})}isCommaSeparatedPattern(t){return t.includes(",")}isRangeTypePattern(t){return t.includes("[")&&t.includes("]")&&!t.match(/(?![^(]*\)),/g)}replaceBraces(t){return t.replace(/(\d)\s*-\s*(\d)/g,"$1..$2").replace(/\(/g,"{").replace(/\)/g,"}").replace(/\[/g,"{").replace(/]/g,"}")}checkHostNamePattern(t){if(this.isRangeTypePattern(t)){const o=this.replaceBraces(t);this.hostnameArray=me()(o)}else if(this.isCommaSeparatedPattern(t)){let o=[];o=t.split(","),o.forEach(l=>{if(this.isRangeTypePattern(l)){const _=this.replaceBraces(l);this.hostnameArray=this.hostnameArray.concat(me()(_))}else this.hostnameArray.push(l)})}else this.hostnameArray.push(t)}submit(){const t=this.hostForm.get("hostname").value;this.checkHostNamePattern(t),this.addr=this.hostForm.get("addr").value,this.status=this.hostForm.get("maintenance").value?"maintenance":"",this.allLabels=this.hostForm.get("labels").value,"hosts"!==this.pageURL&&!this.allLabels.includes("_no_schedule")&&this.allLabels.push("_no_schedule"),this.hostnameArray.forEach(o=>{this.taskWrapper.wrapTaskAroundCall({task:new Jl.R("host/"+Mo.MQ.ADD,{hostname:o}),call:this.hostService.create(o,this.addr,this.allLabels,this.status)}).subscribe({error:()=>{this.hostForm.setErrors({cdSubmitButton:!0})},complete:()=>{"hosts"===this.pageURL?this.router.navigate([this.pageURL,{outlets:{modal:null}}]):this.activeModal.close()}})})}}return n.\u0275fac=function(t){return new(t||n)(e.Y36(Bo.F0),e.Y36(Mo.p4),e.Y36(bc),e.Y36(Sc.P),e.Y36(Dr.Kz))},n.\u0275cmp=e.Xpm({type:n,selectors:[["cd-host-form"]],features:[e.qOj],decls:7,vars:9,consts:function(){let s,t,o,l,_,M,w,N,V,X,re,oe;return s="" + "\ufffd0\ufffd" + " " + "\ufffd1\ufffd" + "",t="Hostname",o="To add multiple hosts at once, you can enter:",l="a comma-separated list of hostnames " + "\ufffd#14\ufffd" + "(e.g.: example-01,example-02,example-03)" + "\ufffd/#14\ufffd" + ",",_="a range expression " + "\ufffd#17\ufffd" + "(e.g.: example-[01-03].ceph)" + "\ufffd/#17\ufffd" + ",",M="a comma separated range expression " + "\ufffd#20\ufffd" + "(e.g.: example-[01-05].lab.com,example2-[1-4].lab.com,example3-[001-006].lab.com)" + "\ufffd/#20\ufffd" + "",w="Labels",N="This field is required.",V="The chosen hostname is already in use.",X="Network address",re="The value is not a valid IP address.",oe="Maintenance Mode",[[3,"pageURL","modalRef"],[1,"modal-title"],s,[1,"modal-content"],[4,"cdFormLoading"],["name","hostForm","novalidate","",3,"formGroup"],["formDir","ngForm"],[1,"modal-body"],[1,"form-group","row"],["for","hostname",1,"cd-col-form-label","required"],t,o,l,_,M,[1,"cd-col-form-input"],["type","text","placeholder","mon-123","id","hostname","name","hostname","formControlName","hostname","autofocus","",1,"form-control",3,"keyup"],["class","invalid-feedback",4,"ngIf"],["class","form-group row",4,"ngIf"],["for","labels",1,"cd-col-form-label"],w,["id","labels",3,"data","options","customBadges","messages"],[1,"modal-footer"],["wrappingClass","text-right",3,"form","submitText","submitActionEvent"],[1,"invalid-feedback"],N,V,["for","addr",1,"cd-col-form-label"],X,["type","text","placeholder","192.168.0.1","id","addr","name","addr","formControlName","addr",1,"form-control"],re,[1,"cd-col-form-offset"],[1,"custom-control","custom-checkbox"],["id","maintenance","type","checkbox","formControlName","maintenance",1,"custom-control-input"],["for","maintenance",1,"custom-control-label"],oe]},template:function(t,o){1&t&&(e.TgZ(0,"cd-modal",0)(1,"span",1),e.SDv(2,2),e.ALo(3,"titlecase"),e.ALo(4,"upperFirst"),e.qZA(),e.ynx(5,3),e.YNc(6,$i,36,15,"div",4),e.BQk(),e.qZA()),2&t&&(e.Q6J("pageURL",o.pageURL)("modalRef",o.activeModal),e.xp6(4),e.pQV(e.lcZ(3,5,o.action))(e.lcZ(4,7,o.resource)),e.QtT(2),e.xp6(2),e.Q6J("cdFormLoading",o.loading))},directives:[Fe.z,lu.y,_n._Y,_n.JL,Ma.V,_n.sg,al.P,Oe.S,_e.o,_n.Fj,Il.b,_n.JJ,_n.u,Je.U,p.O5,ht.m,_n.Wl,Cl.p],pipes:[p.rS,gt.m],styles:[""]}),n})();var Eo=i(34501);let Gs=(()=>{class n{constructor(){this.cssClasses=["badge-cd-label-green","badge-cd-label-cyan","badge-cd-label-purple","badge-cd-label-light-blue","badge-cd-label-gold","badge-cd-label-light-green"]}transform(t){let o=0,l=0;if(t)for(let _=0;_<t.length;_++)l=t.charCodeAt(_),o=Math.abs((o<<5)-o+l);return this.cssClasses[o%this.cssClasses.length]}}return n.\u0275fac=function(t){return new(t||n)},n.\u0275pipe=e.Yjl({name:"colorClassFromText",type:n,pure:!0}),n})();function qs(n,s){if(1&n&&(e.TgZ(0,"span",2),e.ALo(1,"colorClassFromText"),e._uU(2),e.qZA()),2&n){const t=e.oxw();e.Gre("badge badge-",t.value,""),e.s9C("ngClass",e.lcZ(1,5,t.value)),e.xp6(2),e.hij(" ",t.value,"\n")}}function qa(n,s){if(1&n&&(e.TgZ(0,"span"),e._uU(1),e.qZA()),2&n){const t=e.oxw();e.MT6("badge badge-background-primary badge-",t.key,"-",t.value,""),e.xp6(1),e.AsE(" ",t.key,": ",t.value," ")}}let ka=(()=>{class n{}return n.\u0275fac=function(t){return new(t||n)},n.\u0275cmp=e.Xpm({type:n,selectors:[["cd-label"]],inputs:{key:"key",value:"value"},decls:3,vars:2,consts:[[3,"class","ngClass",4,"ngIf","ngIfElse"],["key_value",""],[3,"ngClass"]],template:function(t,o){if(1&t&&(e.YNc(0,qs,3,7,"span",0),e.YNc(1,qa,2,6,"ng-template",null,1,e.W1O)),2&t){const l=e.MAs(2);e.Q6J("ngIf",!o.key)("ngIfElse",l)}},directives:[p.O5,p.mk],pipes:[Gs],styles:[""]}),n})();var ja=i(55657);const wa=["deviceLocation"],jl=["daemonName"],pu=["lifeExpectancy"],Ga=["lifeExpectancyTimestamp"];function Tu(n,s){if(1&n&&e._UZ(0,"cd-table",8),2&n){const t=e.oxw();e.Q6J("data",t.devices)("columns",t.columns)}}function Lu(n,s){1&n&&(e.TgZ(0,"cd-alert-panel",9),e.SDv(1,10),e.qZA())}function wc(n,s){if(1&n&&e._UZ(0,"cd-label",13),2&n){const t=e.oxw().$implicit;e.Q6J("value",t.dev)}}function Cu(n,s){if(1&n&&(e.ynx(0),e.YNc(1,wc,1,1,"cd-label",12),e.BQk()),2&n){const t=s.$implicit,o=e.oxw(2);e.xp6(1),e.Q6J("ngIf",t.host===o.hostname)}}function Wd(n,s){1&n&&e.YNc(0,Cu,2,1,"ng-container",11),2&n&&e.Q6J("ngForOf",s.value)}const rl=function(n){return{daemons:n}};function K(n,s){if(1&n&&e.GkF(0,14),2&n){const t=s.value,o=e.oxw(),l=e.MAs(7),_=e.MAs(9);e.Q6J("ngTemplateOutlet",null!==o.osdId?l:_)("ngTemplateOutletContext",e.VKq(2,rl,t))}}function Ee(n,s){if(1&n&&e._UZ(0,"cd-label",13),2&n){const t=e.oxw().$implicit;e.Q6J("value",t)}}function et(n,s){if(1&n&&(e.ynx(0),e.YNc(1,Ee,1,1,"cd-label",12),e.BQk()),2&n){const t=s.$implicit,o=e.oxw(2);e.xp6(1),e.Q6J("ngIf",t.includes(o.osdId))}}function Tt(n,s){1&n&&e.YNc(0,et,2,1,"ng-container",11),2&n&&e.Q6J("ngForOf",s.daemons)}function Xt(n,s){if(1&n&&(e.ynx(0),e._UZ(1,"cd-label",15),e.BQk()),2&n){const t=s.$implicit;e.xp6(1),e.Q6J("value",t)}}function Tr(n,s){1&n&&e.YNc(0,Xt,2,1,"ng-container",11),2&n&&e.Q6J("ngForOf",s.daemons)}function Si(n,s){1&n&&(e.TgZ(0,"span"),e.SDv(1,17),e.ALo(2,"notAvailable"),e.qZA()),2&n&&(e.xp6(2),e.pQV(e.lcZ(2,1,"")),e.QtT(1))}function gs(n,s){if(1&n&&(e.TgZ(0,"span"),e._uU(1),e.ALo(2,"i18nPlural"),e.qZA()),2&n){const t=e.oxw().value,o=e.oxw();e.xp6(1),e.hij("> ",e.xi3(2,1,t.min,o.translationMapping),"")}}function Aa(n,s){if(1&n&&(e.TgZ(0,"span"),e._uU(1),e.ALo(2,"i18nPlural"),e.qZA()),2&n){const t=e.oxw().value,o=e.oxw();e.xp6(1),e.hij("< ",e.xi3(2,1,t.max,o.translationMapping),"")}}function ca(n,s){if(1&n&&(e.TgZ(0,"span"),e._uU(1),e.ALo(2,"i18nPlural"),e.qZA()),2&n){const t=e.oxw().value,o=e.oxw();e.xp6(1),e.AsE("",t.min," to ",e.xi3(2,2,t.max,o.translationMapping),"")}}function Al(n,s){if(1&n&&(e.YNc(0,Si,3,3,"span",16),e.YNc(1,gs,3,4,"span",16),e.YNc(2,Aa,3,4,"span",16),e.YNc(3,ca,3,5,"span",16)),2&n){const t=s.value;e.Q6J("ngIf",!t.life_expectancy_enabled),e.xp6(1),e.Q6J("ngIf",t.min&&!t.max),e.xp6(1),e.Q6J("ngIf",t.max&&!t.min),e.xp6(1),e.Q6J("ngIf",t.max&&t.min)}}function Ul(n,s){1&n&&e._uU(0),2&n&&e.hij(" ",s.value,"\n")}let Gc=(()=>{class n{constructor(t,o,l){this.hostService=t,this.datePipe=o,this.osdService=l,this.hostname="",this.osdId=null,this.osdList=!1,this.devices=null,this.columns=[],this.translationMapping={"=1":"# week",other:"# weeks"}}ngOnInit(){this.columns=[{prop:"devid",name:"Device ID",minWidth:200},{prop:"state",name:"State of Health",flexGrow:1,cellTransformation:wt.e.badge,customTemplateConfig:{map:{good:{value:"Good",class:"badge-success"},warning:{value:"Warning",class:"badge-warning"},bad:{value:"Bad",class:"badge-danger"},stale:{value:"Stale",class:"badge-info"},unknown:{value:"Unknown",class:"badge-dark"}}}},{prop:"life_expectancy_weeks",name:"Life Expectancy",cellTemplate:this.lifeExpectancyTemplate},{prop:"life_expectancy_stamp",name:"Prediction Creation Date",cellTemplate:this.lifeExpectancyTimestampTemplate,pipe:this.datePipe,isHidden:!0},{prop:"location",name:"Device Name",cellTemplate:this.locationTemplate},{prop:"daemons",name:"Daemons",cellTemplate:this.daemonNameTemplate}]}ngOnChanges(){const t=o=>this.devices=o;this.osdList&&null!==this.osdId?this.osdService.getDevices(this.osdId).subscribe(t):this.hostname&&this.hostService.getDevices(this.hostname).subscribe(t)}}return n.\u0275fac=function(t){return new(t||n)(e.Y36(bc),e.Y36(p.uU),e.Y36(cc))},n.\u0275cmp=e.Xpm({type:n,selectors:[["cd-device-list"]],viewQuery:function(t,o){if(1&t&&(e.Gf(wa,7),e.Gf(jl,7),e.Gf(pu,7),e.Gf(Ga,7)),2&t){let l;e.iGM(l=e.CRH())&&(o.locationTemplate=l.first),e.iGM(l=e.CRH())&&(o.daemonNameTemplate=l.first),e.iGM(l=e.CRH())&&(o.lifeExpectancyTemplate=l.first),e.iGM(l=e.CRH())&&(o.lifeExpectancyTimestampTemplate=l.first)}},inputs:{hostname:"hostname",osdId:"osdId",osdList:"osdList"},features:[e.TTD],decls:14,vars:2,consts:function(){let s,t;return s="Neither hostname nor OSD ID given",t="" + "\ufffd0\ufffd" + "",[[3,"data","columns",4,"ngIf"],["type","warning",4,"ngIf"],["deviceLocation",""],["daemonName",""],["osdIdDaemon",""],["readableDaemons",""],["lifeExpectancy",""],["lifeExpectancyTimestamp",""],[3,"data","columns"],["type","warning"],s,[4,"ngFor","ngForOf"],[3,"value",4,"ngIf"],[3,"value"],[3,"ngTemplateOutlet","ngTemplateOutletContext"],[1,"me-1",3,"value"],[4,"ngIf"],t]},template:function(t,o){1&t&&(e.YNc(0,Tu,1,2,"cd-table",0),e.YNc(1,Lu,2,0,"cd-alert-panel",1),e.YNc(2,Wd,1,1,"ng-template",null,2,e.W1O),e.YNc(4,K,1,4,"ng-template",null,3,e.W1O),e.YNc(6,Tt,1,1,"ng-template",null,4,e.W1O),e.YNc(8,Tr,1,1,"ng-template",null,5,e.W1O),e.YNc(10,Al,4,4,"ng-template",null,6,e.W1O),e.YNc(12,Ul,1,1,"ng-template",null,7,e.W1O)),2&t&&(e.Q6J("ngIf",o.hostname||null!==o.osdId),e.xp6(1),e.Q6J("ngIf",""===o.hostname&&null===o.osdId))},directives:[p.O5,_r.a,Eo.G,p.sg,ka,p.tP],pipes:[ja.g,p.Gx],styles:[""]}),n})();var gf=i(30490);function Hd(n,s){1&n&&(e.TgZ(0,"cd-alert-panel",2),e.SDv(1,3),e.qZA())}function __(n,s){1&n&&(e.TgZ(0,"cd-alert-panel",2),e.tHW(1,4),e._UZ(2,"cd-doc",5),e.N_p(),e.qZA())}let ch=(()=>{class n{}return n.\u0275fac=function(t){return new(t||n)},n.\u0275cmp=e.Xpm({type:n,selectors:[["cd-orchestrator-doc-panel"]],inputs:{missingFeatures:"missingFeatures"},decls:3,vars:2,consts:function(){let s,t;return s="The feature is not supported in the current Orchestrator.",t="Orchestrator is not available. Please consult the " + "\ufffd#2\ufffd" + "" + "\ufffd/#2\ufffd" + " on how to configure and enable the functionality.",[["type","info",4,"ngIf","ngIfElse"],["elseBlock",""],["type","info"],s,t,["section","orch"]]},template:function(t,o){if(1&t&&(e.YNc(0,Hd,2,0,"cd-alert-panel",0),e.YNc(1,__,3,0,"ng-template",null,1,e.W1O)),2&t){const l=e.MAs(2);e.Q6J("ngIf",o.missingFeatures)("ngIfElse",l)}},directives:[p.O5,Eo.G,gf.K],styles:[""]}),n})(),xc=(()=>{class n{constructor(t,o,l,_,M,w){this.authStorageService=t,this.dimlessBinary=o,this.modalService=l,this.notificationService=_,this.orchService=M,this.hostService=w,this.devices=[],this.showAvailDeviceOnly=!1,this.hiddenColumns=[],this.hostname="",this.diskType="",this.filterColumns=["hostname","human_readable_type","available","sys_api.vendor","sys_api.model","sys_api.size"],this.selectionType=void 0,this.filterChange=new e.vpe,this.fetchInventory=new e.vpe,this.icons=No.P,this.columns=[],this.selection=new sn.r,this.orchStatus=void 0,this.actionOrchFeatures={identify:[x.DEVICE_BLINK_LIGHT]}}ngOnInit(){this.permission=this.authStorageService.getPermissions().osd,this.tableActions=[{permission:"update",icon:No.P.show,click:()=>this.identifyDevice(),name:"Identify",disable:o=>this.getDisable("identify",o),canBePrimary:o=>!o.hasSingleSelection,visible:()=>Er().isString(this.selectionType)}];const t=[{name:"Hostname",prop:"hostname",flexGrow:1},{name:"Device path",prop:"path",flexGrow:1},{name:"Type",prop:"human_readable_type",flexGrow:1,cellTransformation:wt.e.badge,customTemplateConfig:{map:{hdd:{value:"HDD",class:"badge-hdd"},ssd:{value:"SSD",class:"badge-ssd"}}}},{name:"Available",prop:"available",flexGrow:1,cellClass:"text-center",cellTransformation:wt.e.checkIcon},{name:"Vendor",prop:"sys_api.vendor",flexGrow:1},{name:"Model",prop:"sys_api.model",flexGrow:1},{name:"Size",prop:"sys_api.size",flexGrow:1,pipe:this.dimlessBinary},{name:"OSDs",prop:"osd_ids",flexGrow:1,cellTransformation:wt.e.badge,customTemplateConfig:{class:"badge-dark",prefix:"osd."}}];this.columns=t.filter(o=>!this.hiddenColumns.includes(o.prop)),Er().forEach(this.filterColumns,o=>{const l=Er().find(this.columns,{prop:o});l&&(l.filterable=!0),"human_readable_type"===(null==l?void 0:l.prop)&&"ssd"===this.diskType&&(l.filterInitValue=this.diskType),"hostname"===(null==l?void 0:l.prop)&&this.hostname&&(l.filterInitValue=this.hostname)}),this.fetchInventory.observers.length>0&&(this.fetchInventorySub=this.table.fetchData.subscribe(()=>{this.fetchInventory.emit()}))}getDevices(){this.showAvailDeviceOnly?this.hostService.inventoryDeviceList().subscribe(t=>{this.devices=Er().filter(t,"available"),this.devices=[...this.devices]},()=>{this.devices=[]}):this.devices=[...this.devices]}ngOnDestroy(){this.fetchInventorySub&&this.fetchInventorySub.unsubscribe()}onColumnFiltersChanged(t){this.filterChange.emit(t)}getDisable(t,o){return!o.hasSingleSelection||this.orchService.getTableActionDisableDesc(this.orchStatus,this.actionOrchFeatures[t])}updateSelection(t){this.selection=t}identifyDevice(){const t=this.selection.first(),o=t.hostname,l=t.path||t.device_id;this.modalService.show($e.X,{titleText:"Identify device " + l + "",message:"Please enter the duration how long to blink the LED.",fields:[{type:"select",name:"duration",value:300,required:!0,typeConfig:{options:[{text:"1 minute",value:60},{text:"2 minutes",value:120},{text:"5 minutes",value:300},{text:"10 minutes",value:600},{text:"15 minutes",value:900}]}}],submitButtonText:"Execute",onSubmit:_=>{this.hostService.identifyDevice(o,l,_.duration).subscribe(()=>{this.notificationService.show(Sa.k.success,"Identifying '" + l + "' started on host '" + o + "'")})}})}}return n.\u0275fac=function(t){return new(t||n)(e.Y36(zi.j),e.Y36(Ar.$),e.Y36(ru.Z),e.Y36(Sl.g),e.Y36(h),e.Y36(bc))},n.\u0275cmp=e.Xpm({type:n,selectors:[["cd-inventory-devices"]],viewQuery:function(t,o){if(1&t&&e.Gf(_r.a,7),2&t){let l;e.iGM(l=e.CRH())&&(o.table=l.first)}},inputs:{devices:"devices",showAvailDeviceOnly:"showAvailDeviceOnly",hiddenColumns:"hiddenColumns",hostname:"hostname",diskType:"diskType",filterColumns:"filterColumns",selectionType:"selectionType",orchStatus:"orchStatus"},outputs:{filterChange:"filterChange",fetchInventory:"fetchInventory"},decls:2,vars:8,consts:[["identifier","uid","columnMode","flex",3,"data","columns","forceIdentifier","selectionType","searchField","fetchData","updateSelection","columnFiltersChanged"],[1,"table-actions",3,"permission","selection","tableActions"]],template:function(t,o){1&t&&(e.TgZ(0,"cd-table",0),e.NdJ("fetchData",function(){return o.getDevices()})("updateSelection",function(_){return o.updateSelection(_)})("columnFiltersChanged",function(_){return o.onColumnFiltersChanged(_)}),e._UZ(1,"cd-table-actions",1),e.qZA()),2&t&&(e.Q6J("data",o.devices)("columns",o.columns)("forceIdentifier",!0)("selectionType",o.selectionType)("searchField",!1),e.xp6(1),e.Q6J("permission",o.permission)("selection",o.selection)("tableActions",o.tableActions))},directives:[_r.a,bu.K],styles:[".filter[_ngcontent-%COMP%]{padding-right:8px}.fa-stack[_ngcontent-%COMP%]{font-size:.79rem}.fa-stack[_ngcontent-%COMP%]   .fa-stack-1x[_ngcontent-%COMP%]{margin-left:8px;margin-top:5px}"]}),n})();function Jd(n,s){1&n&&e._UZ(0,"cd-orchestrator-doc-panel")}const Bd=function(){return[]},dh=function(){return["hostname"]};function Hp(n,s){if(1&n){const t=e.EpF();e.ynx(0),e.TgZ(1,"legend"),e.SDv(2,1),e.qZA(),e.TgZ(3,"div",2)(4,"div",3)(5,"cd-inventory-devices",4),e.NdJ("fetchInventory",function(){return e.CHM(t),e.oxw().refresh()}),e.qZA()()(),e.BQk()}if(2&n){const t=e.oxw();e.xp6(5),e.Q6J("devices",t.devices)("hiddenColumns",void 0===t.hostname?e.DdM(3,Bd):e.DdM(4,dh))("orchStatus",t.orchStatus)}}let cl=(()=>{class n{constructor(t,o,l){this.orchService=t,this.hostService=o,this.ngZone=l,this.reloadInterval=5e3,this.firstRefresh=!0,this.icons=No.P,this.showDocPanel=!1,this.devices=[]}ngOnInit(){this.orchService.status().subscribe(t=>{this.orchStatus=t,this.showDocPanel=!t.available,t.available&&this.ngZone.runOutsideAngular(()=>{this.reloadSubscriber=(0,ni.H)(this.reloadInterval,this.reloadInterval).subscribe(()=>{this.ngZone.run(()=>{this.getInventory(!1)})})})})}ngOnDestroy(){var t;null===(t=this.reloadSubscriber)||void 0===t||t.unsubscribe()}ngOnChanges(){var t;(null===(t=this.orchStatus)||void 0===t?void 0:t.available)&&(this.devices=[],this.getInventory(!1))}getInventory(t){""!==this.hostname&&this.hostService.inventoryDeviceList(this.hostname,t).subscribe(o=>{this.devices=o},()=>{this.devices=[]})}refresh(){this.getInventory(!this.firstRefresh),this.firstRefresh=!1}}return n.\u0275fac=function(t){return new(t||n)(e.Y36(h),e.Y36(bc),e.Y36(e.R0b))},n.\u0275cmp=e.Xpm({type:n,selectors:[["cd-inventory"]],inputs:{hostname:"hostname"},features:[e.TTD],decls:2,vars:2,consts:function(){let s;return s="Physical Disks",[[4,"ngIf"],s,[1,"row"],[1,"col-md-12"],["selectionType","single",3,"devices","hiddenColumns","orchStatus","fetchInventory"]]},template:function(t,o){1&t&&(e.YNc(0,Jd,1,0,"cd-orchestrator-doc-panel",0),e.YNc(1,Hp,6,5,"ng-container",0)),2&t&&(e.Q6J("ngIf",o.showDocPanel),e.xp6(1),e.Q6J("ngIf",null==o.orchStatus?null:o.orchStatus.available))},directives:[p.O5,ch,xc],styles:[""]}),n})();var g_=i(15257);let Df=class{constructor(s){this.http=s,this.url="api/daemon"}action(s,t){return this.http.put(`${this.url}/${s}`,{action:t,container_image:null},{headers:{Accept:"application/vnd.ceph.api.v0.1+json"},observe:"response"})}};Df.\u0275fac=function(s){return new(s||Df)(e.LFG(y.eN))},Df.\u0275prov=e.Yz7({token:Df,factory:Df.\u0275fac,providedIn:"root"}),Df=(0,j.gn)([Ce.o,(0,j.w6)("design:paramtypes",[y.eN])],Df);var Ud=i(90068);class cd{constructor(s){this.observable=s.pipe((0,Oa.U)(t=>{var o;return this.count=Number(null===(o=t.headers)||void 0===o?void 0:o.get("X-Total-Count")),t.body}))}}let Kl=(()=>{class n extends ma.S{constructor(t){super(),this.http=t,this.url="api/service"}list(t,o){const l={headers:{Accept:this.getVersionHeaderValue(2,0)},params:t,observe:"response"};return o&&(l.params=l.params.append("service_name",o)),new cd(this.http.get(this.url,l))}getDaemons(t){return this.http.get(`${this.url}/${t}/daemons`)}create(t){return this.http.post(this.url,{service_name:t.service_id?`${t.service_type}.${t.service_id}`:t.service_type,service_spec:t},{observe:"response"})}update(t){const o=t.service_id?`${t.service_type}.${t.service_id}`:t.service_type;return this.http.put(`${this.url}/${o}`,{service_name:o,service_spec:t},{observe:"response"})}delete(t){return this.http.delete(`${this.url}/${t}`,{observe:"response"})}getKnownTypes(){return this.http.get(`${this.url}/known_types`)}}return n.\u0275fac=function(t){return new(t||n)(e.LFG(y.eN))},n.\u0275prov=e.Yz7({token:n,factory:n.\u0275fac,providedIn:"root"}),n})();var dp=i(37496);const dd=["statusTpl"],Gh=["listTpl"],fh=["cpuTpl"],wf=["daemonsTable"];function Bp(n,s){1&n&&e._UZ(0,"cd-orchestrator-doc-panel")}function mf(n,s){1&n&&e.GkF(0)}function rc(n,s){if(1&n&&(e.TgZ(0,"div"),e.YNc(1,mf,1,0,"ng-container",7),e.qZA()),2&n){e.oxw();const t=e.MAs(9);e.xp6(1),e.Q6J("ngTemplateOutlet",t)}}function Cd(n,s){1&n&&e.GkF(0)}function Up(n,s){if(1&n&&e.YNc(0,Cd,1,0,"ng-container",7),2&n){e.oxw(2);const t=e.MAs(9);e.Q6J("ngTemplateOutlet",t)}}function ph(n,s){if(1&n){const t=e.EpF();e.TgZ(0,"cd-table",18,19),e.NdJ("fetchData",function(l){return e.CHM(t),e.oxw(3).getServices(l)}),e.qZA()}if(2&n){const t=e.oxw(3);e.Q6J("data",t.services)("columns",t.serviceColumns)}}function hh(n,s){if(1&n&&e.YNc(0,ph,2,2,"cd-table",17),2&n){const t=e.oxw(2);e.Q6J("ngIf",t.hasOrchestrator)}}function m_(n,s){if(1&n&&(e.ynx(0),e.TgZ(1,"nav",8,9),e.ynx(3,10),e.TgZ(4,"a",11),e.SDv(5,12),e.qZA(),e.YNc(6,Up,1,1,"ng-template",13),e.BQk(),e.ynx(7,14),e.TgZ(8,"a",11),e.SDv(9,15),e.qZA(),e.YNc(10,hh,1,1,"ng-template",13),e.BQk(),e.qZA(),e._UZ(11,"div",16),e.BQk()),2&n){const t=e.MAs(2);e.xp6(11),e.Q6J("ngbNavOutlet",t)}}function _h(n,s){if(1&n&&(e.TgZ(0,"span",20),e.ALo(1,"pipeFunction"),e._uU(2),e.qZA()),2&n){const t=s.row,o=e.oxw();e.Q6J("ngClass",e.xi3(1,2,t,o.getStatusClass)),e.xp6(2),e.hij(" ",t.status_desc," ")}}const vf=function(n){return[n]};function yf(n,s){if(1&n&&(e.TgZ(0,"span"),e._UZ(1,"i",27),e.qZA()),2&n){const t=e.oxw(4);e.xp6(1),e.Q6J("ngClass",e.VKq(1,vf,t.icons.infoCircle))}}function zf(n,s){if(1&n&&(e.TgZ(0,"span"),e._UZ(1,"i",27),e.qZA()),2&n){const t=e.oxw(4);e.xp6(1),e.Q6J("ngClass",e.VKq(1,vf,t.icons.warning))}}function xf(n,s){if(1&n&&(e.TgZ(0,"li",25)(1,"b"),e._uU(2),e.ALo(3,"relativeDate"),e.qZA(),e.TgZ(4,"span",26),e._uU(5),e.qZA(),e._UZ(6,"br"),e.YNc(7,yf,2,3,"span",0),e.YNc(8,zf,2,3,"span",0),e._uU(9),e.qZA()),2&n){const t=s.$implicit;e.xp6(2),e.hij("",e.lcZ(3,5,t.created)," - "),e.xp6(3),e.Oqu(t.subject),e.xp6(2),e.Q6J("ngIf","INFO"===t.level),e.xp6(1),e.Q6J("ngIf","ERROR"===t.level),e.xp6(1),e.hij(" ",t.message," ")}}function Ef(n,s){if(1&n&&(e.TgZ(0,"ul",23),e.YNc(1,xf,10,7,"li",24),e.qZA()),2&n){const t=e.oxw().value,o=e.oxw();e.xp6(1),e.Q6J("ngForOf",t)("ngForTrackBy",o.trackByFn)}}function Mu(n,s){1&n&&(e.TgZ(0,"div",25)(1,"span"),e._uU(2,"No data available"),e.qZA()())}function Rf(n,s){if(1&n&&e.YNc(0,Mu,3,0,"div",28),2&n){const t=e.oxw().value;e.Q6J("ngIf",0===(null==t?null:t.length))}}function zh(n,s){if(1&n&&(e.YNc(0,Ef,2,2,"ul",21),e.YNc(1,Rf,1,1,"ng-template",null,22,e.W1O)),2&n){const t=s.value,o=e.MAs(2);e.Q6J("ngIf",null==t?null:t.length)("ngIfElse",o)}}function Vh(n,s){if(1&n){const t=e.EpF();e.TgZ(0,"cd-table",30,31),e.NdJ("fetchData",function(l){return e.CHM(t),e.oxw(2).getDaemons(l)})("updateSelection",function(l){return e.CHM(t),e.oxw(2).updateSelection(l)}),e._UZ(2,"cd-table-actions",32),e.qZA()}if(2&n){const t=e.oxw(2);e.Q6J("data",t.daemons)("columns",t.columns),e.xp6(2),e.Q6J("selection",t.selection)("permission",t.permissions.hosts)("tableActions",t.tableActions)}}function v_(n,s){if(1&n&&e.YNc(0,Vh,3,5,"cd-table",29),2&n){const t=e.oxw();e.Q6J("ngIf",t.hasOrchestrator)}}function gh(n,s){if(1&n&&e._UZ(0,"cd-usage-bar",33),2&n){const t=s.row,o=e.oxw();e.Q6J("total",o.total)("calculatePerc",!1)("used",t.cpu_percentage)("isBinary",!1)("warningThreshold",o.warningThreshold)("errorThreshold",o.errorThreshold)}}let Yp=(()=>{class n{constructor(t,o,l,_,M,w,N,V,X,re){this.hostService=t,this.cephServiceService=o,this.orchService=l,this.relativeDatePipe=_,this.dimlessBinary=M,this.actionLabels=w,this.authStorageService=N,this.daemonService=V,this.notificationService=X,this.cdRef=re,this.hiddenColumns=[],this.total=100,this.warningThreshold=.8,this.errorThreshold=.9,this.icons=No.P,this.daemons=[],this.services=[],this.columns=[],this.serviceColumns=[],this.selection=new sn.r,this.hasOrchestrator=!1,this.showDocPanel=!1}ngOnInit(){this.permissions=this.authStorageService.getPermissions(),this.tableActions=[{permission:"update",icon:No.P.start,click:()=>this.daemonAction("start"),name:this.actionLabels.START,disable:()=>this.actionDisabled("start")},{permission:"update",icon:No.P.stop,click:()=>this.daemonAction("stop"),name:this.actionLabels.STOP,disable:()=>this.actionDisabled("stop")},{permission:"update",icon:No.P.restart,click:()=>this.daemonAction("restart"),name:this.actionLabels.RESTART,disable:()=>this.actionDisabled("restart")},{permission:"update",icon:No.P.deploy,click:()=>this.daemonAction("redeploy"),name:this.actionLabels.REDEPLOY,disable:()=>this.actionDisabled("redeploy")}],this.columns=[{name:"Hostname",prop:"hostname",flexGrow:2,filterable:!0},{name:"Daemon name",prop:"daemon_name",flexGrow:1,filterable:!0},{name:"Version",prop:"version",flexGrow:1,filterable:!0},{name:"Status",prop:"status_desc",flexGrow:1,filterable:!0,cellTemplate:this.statusTpl},{name:"Last Refreshed",prop:"last_refresh",pipe:this.relativeDatePipe,flexGrow:1},{name:"CPU Usage",prop:"cpu_percentage",flexGrow:1,cellTemplate:this.cpuTpl},{name:"Memory Usage",prop:"memory_usage",flexGrow:1,pipe:this.dimlessBinary,cellClass:"text-right"},{name:"Daemon Events",prop:"events",flexGrow:2,cellTemplate:this.listTpl}],this.serviceColumns=[{name:"Service Name",prop:"service_name",flexGrow:2,filterable:!0},{name:"Service Type",prop:"service_type",flexGrow:1,filterable:!0},{name:"Service Events",prop:"events",flexGrow:5,cellTemplate:this.listTpl}],this.orchService.status().subscribe(t=>{this.hasOrchestrator=t.available,this.showDocPanel=!t.available}),this.columns=this.columns.filter(t=>!this.hiddenColumns.includes(t.prop)),setTimeout(()=>{this.cdRef.detectChanges()},1e3)}ngOnChanges(){Er().isUndefined(this.daemonsTable)||this.daemonsTable.reloadData()}ngAfterViewInit(){this.daemonsTableTplsSub=this.daemonsTableTpls.changes.subscribe(t=>{this.daemonsTable=t.first})}ngOnDestroy(){this.daemonsTableTplsSub&&this.daemonsTableTplsSub.unsubscribe(),this.serviceSub&&this.serviceSub.unsubscribe()}getStatusClass(t){return Er().get({"-1":"badge-danger",0:"badge-warning",1:"badge-success"},t.status,"badge-dark")}getDaemons(t){let o;if(this.hostname)o=this.hostService.getDaemons(this.hostname);else{if(!this.serviceName)return void(this.daemons=[]);o=this.cephServiceService.getDaemons(this.serviceName)}o.subscribe(l=>{this.daemons=l,this.sortDaemonEvents()},()=>{this.daemons=[],t.error()})}sortDaemonEvents(){this.daemons.forEach(t=>{var o;null===(o=t.events)||void 0===o||o.sort((l,_)=>new Date(_.created).getTime()-new Date(l.created).getTime())})}getServices(t){this.serviceSub=this.cephServiceService.list(new y.LE({fromObject:{limit:-1,offset:0}}),this.serviceName).observable.subscribe(o=>{this.services=o},()=>{this.services=[],t.error()})}trackByFn(t,o){return o.created}updateSelection(t){this.selection=t}daemonAction(t){var o;this.daemonService.action(null===(o=this.selection.first())||void 0===o?void 0:o.daemon_name,t).pipe((0,g_.q)(1)).subscribe({next:l=>{this.notificationService.show(Sa.k.success,`Daemon ${t} scheduled`,l.body.toString())},error:l=>{this.notificationService.show(Sa.k.error,"Daemon action failed",l.body.toString())}})}actionDisabled(t){var o;if(null===(o=this.selection)||void 0===o?void 0:o.hasSelection){const l=this.selection.selected[0];if("mon"===l.daemon_type||"mgr"===l.daemon_type)return!0;switch(t){case"start":if("running"===l.status_desc)return!0;break;case"stop":if("stopped"===l.status_desc)return!0}return!1}return!0}}return n.\u0275fac=function(t){return new(t||n)(e.Y36(bc),e.Y36(Kl),e.Y36(h),e.Y36(Ud.h),e.Y36(Ar.$),e.Y36(Mo.p4),e.Y36(zi.j),e.Y36(Df),e.Y36(Sl.g),e.Y36(e.sBO))},n.\u0275cmp=e.Xpm({type:n,selectors:[["cd-service-daemon-list"]],viewQuery:function(t,o){if(1&t&&(e.Gf(dd,7),e.Gf(Gh,7),e.Gf(fh,7),e.Gf(wf,5)),2&t){let l;e.iGM(l=e.CRH())&&(o.statusTpl=l.first),e.iGM(l=e.CRH())&&(o.listTpl=l.first),e.iGM(l=e.CRH())&&(o.cpuTpl=l.first),e.iGM(l=e.CRH())&&(o.daemonsTableTpls=l)}},inputs:{serviceName:"serviceName",hostname:"hostname",hiddenColumns:"hiddenColumns",flag:"flag"},features:[e.TTD],decls:12,vars:3,consts:function(){let s,t;return s="Details",t="Service Events",[[4,"ngIf"],[4,"ngIf","ngIfElse"],["serviceDetailsTpl",""],["statusTpl",""],["listTpl",""],["serviceDaemonDetailsTpl",""],["cpuTpl",""],[4,"ngTemplateOutlet"],["ngbNav","","cdStatefulTab","service-details",1,"nav-tabs"],["nav","ngbNav"],["ngbNavItem","details"],["ngbNavLink",""],s,["ngbNavContent",""],["ngbNavItem","service_events"],t,[3,"ngbNavOutlet"],["columnMode","flex",3,"data","columns","fetchData",4,"ngIf"],["columnMode","flex",3,"data","columns","fetchData"],["serviceTable",""],[1,"badge",3,"ngClass"],["class","list-group list-group-flush",4,"ngIf","ngIfElse"],["noEventsAvailable",""],[1,"list-group","list-group-flush"],["class","list-group-item",4,"ngFor","ngForOf","ngForTrackBy"],[1,"list-group-item"],[1,"badge","badge-info"],["aria-hidden","true",3,"ngClass"],["class","list-group-item",4,"ngIf"],["selectionType","single","columnMode","flex","identifier","daemon_name",3,"data","columns","fetchData","updateSelection",4,"ngIf"],["selectionType","single","columnMode","flex","identifier","daemon_name",3,"data","columns","fetchData","updateSelection"],["daemonsTable",""],["id","service-daemon-list-actions",1,"table-actions",3,"selection","permission","tableActions"],[3,"total","calculatePerc","used","isBinary","warningThreshold","errorThreshold"]]},template:function(t,o){if(1&t&&(e.YNc(0,Bp,1,0,"cd-orchestrator-doc-panel",0),e.YNc(1,rc,2,1,"div",1),e.YNc(2,m_,12,1,"ng-template",null,2,e.W1O),e.YNc(4,_h,3,5,"ng-template",null,3,e.W1O),e.YNc(6,zh,3,2,"ng-template",null,4,e.W1O),e.YNc(8,v_,1,1,"ng-template",null,5,e.W1O),e.YNc(10,gh,1,6,"ng-template",null,6,e.W1O)),2&t){const l=e.MAs(3);e.Q6J("ngIf",o.showDocPanel),e.xp6(1),e.Q6J("ngIf","hostDetails"===o.flag)("ngIfElse",l)}},directives:[p.O5,ch,p.tP,Dr.Pz,kn.m,Dr.nv,Dr.Vx,Dr.uN,_r.a,Dr.tO,p.mk,p.sg,bu.K,Eu.O],pipes:[dp.i,Ud.h],styles:[".fa-info-circle[_ngcontent-%COMP%]{color:#25828e}.fa-exclamation-triangle[_ngcontent-%COMP%]{color:#dc3545}.list-group-item[_ngcontent-%COMP%]{background-color:transparent;border-width:0}"]}),n})();var Zh=i(8958);const mh=["innerNav"];function tg(n,s){1&n&&(e.TgZ(0,"cd-alert-panel",5),e.SDv(1,6),e.qZA())}function Ou(n,s){1&n&&(e.TgZ(0,"cd-alert-panel",7),e.SDv(1,8),e.qZA())}function Wh(n,s){1&n&&(e.TgZ(0,"cd-alert-panel",10),e.SDv(1,11),e.qZA())}function Md(n,s){if(1&n&&(e.ynx(0),e.TgZ(1,"cd-alert-panel",20),e._uU(2),e.qZA(),e.BQk()),2&n){const t=e.oxw(2).$implicit;e.xp6(2),e.Oqu(t.value.userMessage)}}function Qd(n,s){1&n&&(e.TgZ(0,"cd-alert-panel",23),e.SDv(1,24),e.qZA())}function y_(n,s){1&n&&(e.ynx(0),e.TgZ(1,"cd-alert-panel",26),e.SDv(2,27),e.qZA(),e.BQk())}function ng(n,s){1&n&&(e.TgZ(0,"cd-alert-panel",28),e.SDv(1,29),e.qZA())}function vh(n,s){if(1&n&&(e.YNc(0,y_,3,0,"ng-container",0),e.YNc(1,ng,2,0,"ng-template",null,25,e.W1O)),2&n){const t=e.MAs(2),o=e.oxw(3).$implicit;e.Q6J("ngIf",o.value.info.smart_status.passed)("ngIfElse",t)}}function yp(n,s){if(1&n&&(e.YNc(0,Qd,2,0,"cd-alert-panel",21),e.ALo(1,"pipeFunction"),e.YNc(2,vh,3,2,"ng-template",null,22,e.W1O)),2&n){const t=e.MAs(3),o=e.oxw(2).$implicit,l=e.oxw(4);e.Q6J("ngIf",e.xi3(1,2,null==o.value.info?null:o.value.info.smart_status,l.isEmpty))("ngIfElse",t)}}function Od(n,s){if(1&n&&e._UZ(0,"cd-table-key-value",36),2&n){const t=e.oxw(4).$implicit;e.Q6J("renderObjects",!0)("data",t.value.info)}}function E_(n,s){1&n&&(e.TgZ(0,"cd-alert-panel",37),e.SDv(1,38),e.qZA())}function Jh(n,s){if(1&n&&(e.YNc(0,Od,1,2,"cd-table-key-value",34),e.ALo(1,"pipeFunction"),e.YNc(2,E_,2,0,"cd-alert-panel",35),e.ALo(3,"pipeFunction")),2&n){const t=e.oxw(3).$implicit,o=e.oxw(4);e.Q6J("ngIf",!e.xi3(1,2,t.value.info,o.isEmpty)),e.xp6(2),e.Q6J("ngIf",e.xi3(3,5,t.value.info,o.isEmpty))}}function Qh(n,s){if(1&n&&e._UZ(0,"cd-table",42),2&n){const t=e.oxw(4).$implicit,o=e.oxw(4);e.Q6J("data",t.value.smart.attributes.table)("columns",o.smartDataColumns)}}function Ad(n,s){if(1&n&&e._UZ(0,"cd-table-key-value",43),2&n){const t=e.oxw(4).$implicit;e.Q6J("renderObjects",!0)("data",t.value.smart)}}function hu(n,s){if(1&n&&e._UZ(0,"cd-table-key-value",43),2&n){const t=e.oxw(4).$implicit;e.Q6J("renderObjects",!0)("data",t.value.smart.nvmeData)}}function Kh(n,s){1&n&&(e.TgZ(0,"cd-alert-panel",44),e.SDv(1,45),e.qZA())}function Ep(n,s){if(1&n&&(e.YNc(0,Qh,1,2,"cd-table",39),e.YNc(1,Ad,1,2,"cd-table-key-value",40),e.YNc(2,hu,1,2,"cd-table-key-value",40),e.YNc(3,Kh,2,0,"cd-alert-panel",41)),2&n){const t=e.oxw(3).$implicit;e.Q6J("ngIf",null==t.value.smart?null:t.value.smart.attributes),e.xp6(1),e.Q6J("ngIf",null==t.value.smart?null:t.value.smart.scsi_error_counter_log),e.xp6(1),e.Q6J("ngIf",null==t.value.smart?null:t.value.smart.nvmeData),e.xp6(1),e.Q6J("ngIf",!(null!=t.value.smart&&t.value.smart.attributes||null!=t.value.smart&&t.value.smart.nvmeData||null!=t.value.smart&&t.value.smart.scsi_error_counter_log))}}function Xh(n,s){if(1&n&&(e.ynx(0),e.TgZ(1,"nav",12,30)(3,"li",31)(4,"a",17),e.SDv(5,32),e.qZA(),e.YNc(6,Jh,4,8,"ng-template",18),e.qZA(),e.TgZ(7,"li",31)(8,"a",17),e.SDv(9,33),e.qZA(),e.YNc(10,Ep,4,4,"ng-template",18),e.qZA()(),e._UZ(11,"div",15),e.BQk()),2&n){const t=e.MAs(2);e.xp6(3),e.Q6J("ngbNavItem",1),e.xp6(4),e.Q6J("ngbNavItem",2),e.xp6(4),e.Q6J("ngbNavOutlet",t)}}function ic(n,s){if(1&n&&(e.YNc(0,Md,3,1,"ng-container",0),e.YNc(1,yp,4,5,"ng-template",null,19,e.W1O),e.YNc(3,Xh,12,3,"ng-container",4),e.ALo(4,"pipeFunction"),e.ALo(5,"pipeFunction")),2&n){const t=e.MAs(2),o=e.oxw().$implicit,l=e.oxw(4);e.Q6J("ngIf",o.value.error)("ngIfElse",t),e.xp6(3),e.Q6J("ngIf",!e.xi3(4,3,o.value.info,l.isEmpty)||!e.xi3(5,6,o.value.smart,l.isEmpty))}}function Kd(n,s){if(1&n&&(e.ynx(0,16),e.TgZ(1,"a",17),e._uU(2),e.qZA(),e.YNc(3,ic,6,9,"ng-template",18),e.BQk()),2&n){const t=s.$implicit;e.xp6(2),e.AsE("",t.value.device," (",t.value.identifier,")")}}function Vf(n,s){if(1&n&&(e.ynx(0),e.TgZ(1,"nav",12,13),e.YNc(3,Kd,4,2,"ng-container",14),e.ALo(4,"keyvalue"),e.qZA(),e._UZ(5,"div",15),e.BQk()),2&n){const t=e.MAs(2),o=e.oxw(3);e.xp6(3),e.Q6J("ngForOf",e.lcZ(4,2,o.data)),e.xp6(2),e.Q6J("ngbNavOutlet",t)}}function qh(n,s){if(1&n&&(e.ynx(0),e.YNc(1,Wh,2,0,"cd-alert-panel",9),e.ALo(2,"pipeFunction"),e.YNc(3,Vf,6,4,"ng-container",4),e.ALo(4,"pipeFunction"),e.BQk()),2&n){const t=e.oxw(2);e.xp6(1),e.Q6J("ngIf",e.xi3(2,2,t.data,t.isEmpty)),e.xp6(2),e.Q6J("ngIf",!e.xi3(4,5,t.data,t.isEmpty))}}function bp(n,s){if(1&n&&(e.ynx(0),e.YNc(1,tg,2,0,"cd-alert-panel",2),e.YNc(2,Ou,2,0,"cd-alert-panel",3),e.YNc(3,qh,5,8,"ng-container",4),e.BQk()),2&n){const t=e.oxw();e.xp6(1),e.Q6J("ngIf",t.error),e.xp6(1),e.Q6J("ngIf",t.incompatible),e.xp6(1),e.Q6J("ngIf",!t.error&&!t.incompatible)}}function b_(n,s){1&n&&(e.TgZ(0,"cd-loading-panel"),e.SDv(1,46),e.qZA())}let Sp=(()=>{class n{constructor(t,o){this.osdService=t,this.hostService=o,this.osdId=null,this.hostname=null,this.loading=!1,this.incompatible=!1,this.error=!1,this.data={},this.isEmpty=Er().isEmpty}isSmartError(t){return void 0!==Er().get(t,"error")}isNvmeSmartData(t){return"nvme"===Er().get(t,"device.protocol","").toLowerCase()}isAtaSmartData(t){return"ata"===Er().get(t,"device.protocol","").toLowerCase()}isIscsiSmartData(t){return"scsi"===Er().get(t,"device.protocol","").toLowerCase()}fetchData(t){const o={};Er().each(t,(l,_)=>{if(this.isSmartError(l)){let M="";M=-22===l.smartctl_error_code?"Smartctl has received an unknown argument (error code " + l.smartctl_error_code + "). You may be using an incompatible version of smartmontools. Version >= 7.0 of smartmontools is required to successfully retrieve data.":"An error with error code " + l.smartctl_error_code + " occurred.",o[_]={error:l.error,smartctl_error_code:l.smartctl_error_code,smartctl_output:l.smartctl_output,userMessage:M,device:l.dev,identifier:l.nvme_vendor}}else 1!==l.json_format_version[0]?this.incompatible=!0:this.isAtaSmartData(l)?o[_]=this.extractAtaData(l):this.isIscsiSmartData(l)?o[_]=this.extractIscsiData(l):this.isNvmeSmartData(l)&&(o[_]=this.extractNvmeData(l))}),this.data=o,this.loading=!1}extractNvmeData(t){return{info:Er().omitBy(t,(l,_)=>["nvme_smart_health_information_log"].includes(_)),smart:{nvmeData:t.nvme_smart_health_information_log},device:t.device.name,identifier:t.serial_number}}extractIscsiData(t){const o=Er().omitBy(t,(l,_)=>["scsi_error_counter_log","scsi_grown_defect_list"].includes(_));return{info:o,smart:{scsi_error_counter_log:t.scsi_error_counter_log,scsi_grown_defect_list:t.scsi_grown_defect_list},device:o.device.name,identifier:o.serial_number}}extractAtaData(t){const o=Er().omitBy(t,(l,_)=>["ata_smart_attributes","ata_smart_selective_self_test_log","ata_smart_data"].includes(_));return{info:o,smart:{attributes:t.ata_smart_attributes,data:t.ata_smart_data},device:o.device.name,identifier:o.serial_number}}updateData(){this.loading=!0,null!==this.osdId?this.osdService.getSmartData(this.osdId).subscribe({next:this.fetchData.bind(this),error:t=>{t.preventDefault(),this.error=t,this.loading=!1}}):null!==this.hostname&&this.hostService.getSmartData(this.hostname).subscribe({next:this.fetchData.bind(this),error:t=>{t.preventDefault(),this.error=t,this.loading=!1}})}ngOnInit(){this.smartDataColumns=[{prop:"id",name:"ID"},{prop:"name",name:"Name"},{prop:"raw.value",name:"Raw"},{prop:"thresh",name:"Threshold"},{prop:"value",name:"Value"},{prop:"when_failed",name:"When Failed"},{prop:"worst",name:"Worst"}],this.scsiSmartDataColumns=[{prop:"correction_algorithm_invocations",name:"Correction Algorithm Invocations"},{prop:"errors_corrected_by_eccdelayed",name:"Errors Corrected by ECC (Delayed)"},{prop:"errors_corrected_by_eccfast",name:"Errors Corrected by ECC (Fast)"},{prop:"errors_corrected_by_rereads_rewrites",name:"Errors Corrected by Rereads/Rewrites"},{prop:"gigabytes_processed",name:"Gigabyes Processed"},{prop:"total_errors_corrected",name:"Total Errors Corrected"},{prop:"total_uncorrected_errors",name:"Total Errors Uncorrected"}]}ngOnChanges(t){this.data={},t.osdId?this.osdId=t.osdId.currentValue:t.hostname&&(this.hostname=t.hostname.currentValue),this.updateData()}}return n.\u0275fac=function(t){return new(t||n)(e.Y36(cc),e.Y36(bc))},n.\u0275cmp=e.Xpm({type:n,selectors:[["cd-smart-list"]],viewQuery:function(t,o){if(1&t&&e.Gf(mh,5),2&t){let l;e.iGM(l=e.CRH())&&(o.nav=l.first)}},inputs:{osdId:"osdId",hostname:"hostname"},features:[e.TTD],decls:3,vars:2,consts:function(){let s,t,o,l,_,M,w,N,V,X,re,oe,fe,ve;return s="Failed to retrieve SMART data.",t="The data received has the JSON format version 2.x and is currently incompatible with the dashboard.",o="No SMART data available.",l="SMART overall-health self-assessment test result",_="unknown",M="SMART overall-health self-assessment test result",w="passed",N="SMART overall-health self-assessment test result",V="failed",X="Device Information",re="SMART",oe="No device information available for this device.",fe="No SMART data available for this device.",ve="SMART data is loading.",[[4,"ngIf","ngIfElse"],["isLoading",""],["type","error",4,"ngIf"],["type","warning",4,"ngIf"],[4,"ngIf"],["type","error"],s,["type","warning"],t,["type","info",4,"ngIf"],["type","info"],o,["ngbNav","",1,"nav-tabs"],["nav","ngbNav"],["ngbNavItem","",4,"ngFor","ngForOf"],[3,"ngbNavOutlet"],["ngbNavItem",""],["ngbNavLink",""],["ngbNavContent",""],["noError",""],["id","alert-error","type","warning"],["id","alert-self-test-unknown","size","slim","type","warning","title",l,4,"ngIf","ngIfElse"],["hasSmartStatus",""],["id","alert-self-test-unknown","size","slim","type","warning","title",l],_,["selfTestFailed",""],["id","alert-self-test-passed","size","slim","type","info","title",M],w,["id","alert-self-test-failed","size","slim","type","warning","title",N],V,["innerNav","ngbNav"],[3,"ngbNavItem"],X,re,[3,"renderObjects","data",4,"ngIf"],["id","alert-device-info-unavailable","type","info",4,"ngIf"],[3,"renderObjects","data"],["id","alert-device-info-unavailable","type","info"],oe,["updateSelectionOnRefresh","never",3,"data","columns",4,"ngIf"],["updateSelectionOnRefresh","never",3,"renderObjects","data",4,"ngIf"],["id","alert-device-smart-data-unavailable","type","info",4,"ngIf"],["updateSelectionOnRefresh","never",3,"data","columns"],["updateSelectionOnRefresh","never",3,"renderObjects","data"],["id","alert-device-smart-data-unavailable","type","info"],fe,ve]},template:function(t,o){if(1&t&&(e.YNc(0,bp,4,3,"ng-container",0),e.YNc(1,b_,2,0,"ng-template",null,1,e.W1O)),2&t){const l=e.MAs(2);e.Q6J("ngIf",!o.loading)("ngIfElse",l)}},directives:[p.O5,Eo.G,Dr.Pz,p.sg,Dr.nv,Dr.Vx,Dr.uN,fo.b,_r.a,Dr.tO,Zh.b],pipes:[dp.i,p.Nd],styles:[""]}),n})();function yh(n,s){if(1&n&&e._UZ(0,"cd-device-list",14),2&n){const t=e.oxw(2);e.Q6J("hostname",t.selection.hostname)}}function S_(n,s){if(1&n&&e._UZ(0,"cd-inventory",14),2&n){const t=e.oxw(3);e.Q6J("hostname",t.selectedHostname)}}function Eh(n,s){1&n&&(e.ynx(0,15),e.TgZ(1,"a",5),e.SDv(2,16),e.qZA(),e.YNc(3,S_,1,1,"ng-template",7),e.BQk())}const $_=function(){return["hostname"]};function e_(n,s){if(1&n&&e._UZ(0,"cd-service-daemon-list",19),2&n){const t=e.oxw(3);e.Q6J("hostname",t.selectedHostname)("hiddenColumns",e.DdM(2,$_))}}function Xd(n,s){1&n&&(e.ynx(0,17),e.TgZ(1,"a",5),e.SDv(2,18),e.qZA(),e.YNc(3,e_,1,3,"ng-template",7),e.BQk())}function t_(n,s){if(1&n&&e._UZ(0,"cd-grafana",22),2&n){const t=e.oxw(3);e.Q6J("grafanaPath","host-details?var-ceph_hosts="+t.selectedHostname)("type","metrics")}}function bh(n,s){1&n&&(e.ynx(0,20),e.TgZ(1,"a",5),e.SDv(2,21),e.qZA(),e.YNc(3,t_,1,2,"ng-template",7),e.BQk())}function n_(n,s){if(1&n&&e._UZ(0,"cd-smart-list",14),2&n){const t=e.oxw(3);e.Q6J("hostname",t.selectedHostname)}}function Zf(n,s){if(1&n&&e.YNc(0,n_,1,1,"cd-smart-list",23),2&n){const t=e.oxw(2),o=e.MAs(2);e.Q6J("ngIf",t.selectedHostname)("ngIfElse",o)}}function Sh(n,s){if(1&n&&(e.ynx(0),e.TgZ(1,"nav",2,3),e.ynx(3,4),e.TgZ(4,"a",5),e.SDv(5,6),e.qZA(),e.YNc(6,yh,1,1,"ng-template",7),e.BQk(),e.YNc(7,Eh,4,0,"ng-container",8),e.YNc(8,Xd,4,0,"ng-container",9),e.YNc(9,bh,4,0,"ng-container",10),e.ynx(10,11),e.TgZ(11,"a",5),e.SDv(12,12),e.qZA(),e.YNc(13,Zf,1,2,"ng-template",7),e.BQk(),e.qZA(),e._UZ(14,"div",13),e.BQk()),2&n){const t=e.MAs(2),o=e.oxw();e.xp6(7),e.Q6J("ngIf",o.permissions.hosts.read),e.xp6(1),e.Q6J("ngIf",o.permissions.hosts.read),e.xp6(1),e.Q6J("ngIf",o.permissions.grafana.read),e.xp6(5),e.Q6J("ngbNavOutlet",t)}}function Tp(n,s){1&n&&(e.TgZ(0,"cd-alert-panel",24),e.SDv(1,25),e.qZA())}let bf=(()=>{class n{get selectedHostname(){return void 0!==this.selection?this.selection.hostname:null}}return n.\u0275fac=function(t){return new(t||n)},n.\u0275cmp=e.Xpm({type:n,selectors:[["cd-host-details"]],inputs:{permissions:"permissions",selection:"selection"},decls:3,vars:1,consts:function(){let s,t,o,l,_,M,w;return s="Devices",t="Device health",o="Physical Disks",l="Daemons",_="Performance Details",M="Host details",w="No hostname found.",[[4,"ngIf"],["noHostname",""],["ngbNav","","cdStatefulTab","host-details",1,"nav-tabs"],["nav","ngbNav"],["ngbNavItem","devices"],["ngbNavLink",""],s,["ngbNavContent",""],["ngbNavItem","inventory",4,"ngIf"],["ngbNavItem","daemons",4,"ngIf"],["ngbNavItem","performance-details",4,"ngIf"],["ngbNavItem","device-health"],t,[3,"ngbNavOutlet"],[3,"hostname"],["ngbNavItem","inventory"],o,["ngbNavItem","daemons"],l,["flag","hostDetails",3,"hostname","hiddenColumns"],["ngbNavItem","performance-details"],_,["title",M,"uid","rtOg0AiWz","grafanaStyle","four",3,"grafanaPath","type"],[3,"hostname",4,"ngIf","ngIfElse"],["type","error"],w]},template:function(t,o){1&t&&(e.YNc(0,Sh,15,4,"ng-container",0),e.YNc(1,Tp,2,0,"ng-template",null,1,e.W1O)),2&t&&e.Q6J("ngIf",o.selection)},directives:[p.O5,Dr.Pz,kn.m,Dr.nv,Dr.Vx,Dr.uN,Gc,cl,Yp,ha.F,Sp,Dr.tO,Eo.G],styles:[""]}),n})();const Th=["servicesTpl"],Ch=["maintenanceConfirmTpl"],da=["orchTmpl"],Rc=["flashTmpl"];function Fu(n,s){if(1&n){const t=e.EpF();e.TgZ(0,"cd-table",13,14),e.NdJ("fetchData",function(l){return e.CHM(t),e.oxw().getHosts(l)})("setExpandedRow",function(l){return e.CHM(t),e.oxw().setExpandedRow(l)})("updateSelection",function(l){return e.CHM(t),e.oxw().updateSelection(l)}),e.TgZ(2,"div",15),e._UZ(3,"cd-table-actions",16),e.qZA(),e._UZ(4,"cd-host-details",17),e.qZA()}if(2&n){const t=e.oxw();e.Q6J("data",t.hosts)("columns",t.columns)("hasDetails",t.hasTableDetails)("toolHeader",!t.hideToolHeader),e.xp6(3),e.Q6J("permission",t.permissions.hosts)("selection",t.selection)("tableActions",t.tableActions),e.xp6(1),e.Q6J("permissions",t.permissions)("selection",t.expandedRow)}}function Ts(n,s){1&n&&e.GkF(0,2)}function Nf(n,s){1&n&&e._UZ(0,"cd-grafana",19),2&n&&e.Q6J("grafanaPath","host-overview?")("type","metrics")}function jp(n,s){1&n&&(e.ynx(0,2),e.TgZ(1,"a",3),e.SDv(2,18),e.qZA(),e.YNc(3,Nf,1,2,"ng-template",5),e.BQk())}function ku(n,s){if(1&n&&(e.TgZ(0,"span"),e._UZ(1,"cd-label",21),e.qZA()),2&n){const t=s.$implicit;e.xp6(1),e.Q6J("key",t.type)("value",t.count)}}function Mh(n,s){1&n&&e.YNc(0,ku,2,2,"span",20),2&n&&e.Q6J("ngForOf",s.value)}function Pf(n,s){if(1&n&&(e.TgZ(0,"ul")(1,"li"),e.SDv(2,23),e.qZA()()),2&n){const t=e.oxw().$implicit;e.xp6(2),e.pQV(t),e.QtT(2)}}function Cp(n,s){if(1&n&&(e.TgZ(0,"div"),e.YNc(1,Pf,3,1,"ul",22),e.qZA()),2&n){const t=s.last,o=e.oxw(2);e.xp6(1),e.Q6J("ngIf",!t||"1"===o.errorMessage.length)}}function Gu(n,s){1&n&&(e.ynx(0),e.SDv(1,24),e.BQk())}function Wf(n,s){if(1&n&&(e.YNc(0,Cp,2,1,"div",20),e.YNc(1,Gu,2,0,"ng-container",22)),2&n){const t=e.oxw();e.Q6J("ngForOf",t.errorMessage),e.xp6(1),e.Q6J("ngIf",t.showSubmit)}}function qd(n,s){1&n&&(e.TgZ(0,"span",25),e.SDv(1,26),e.qZA())}function H_(n,s){1&n&&(e.TgZ(0,"span",27),e.SDv(1,28),e.qZA())}let If=(()=>{class n extends Mt.o{constructor(t,o,l,_,M,w,N,V,X,re){super(),this.authStorageService=t,this.dimlessBinary=o,this.emptyPipe=l,this.hostService=_,this.actionLabels=M,this.modalService=w,this.taskWrapper=N,this.router=V,this.notificationService=X,this.orchService=re,this.sub=new fc.w,this.hiddenColumns=[],this.hideMaintenance=!1,this.hasTableDetails=!0,this.hideToolHeader=!1,this.showGeneralActionsOnly=!1,this.columns=[],this.hosts=[],this.isLoadingHosts=!1,this.cdParams={fromLink:"/hosts"},this.selection=new sn.r,this.isExecuting=!1,this.icons=No.P,this.messages={nonOrchHost:"The feature is disabled because the selected host is not managed by Orchestrator."},this.actionOrchFeatures={add:[x.HOST_ADD],edit:[x.HOST_LABEL_ADD,x.HOST_LABEL_REMOVE],remove:[x.HOST_REMOVE],maintenance:[x.HOST_MAINTENANCE_ENTER,x.HOST_MAINTENANCE_EXIT],drain:[x.HOST_DRAIN]},this.permissions=this.authStorageService.getPermissions(),this.tableActions=[{name:this.actionLabels.ADD,permission:"create",icon:No.P.add,click:()=>this.router.url.includes("/hosts")?this.router.navigate(["hosts",{outlets:{modal:[Mo.MQ.ADD]}}]):this.bsModalRef=this.modalService.show(is,{hideMaintenance:this.hideMaintenance}),disable:oe=>this.getDisable("add",oe)},{name:this.actionLabels.EDIT,permission:"update",icon:No.P.edit,click:()=>this.editAction(),disable:oe=>this.getDisable("edit",oe)},{name:this.actionLabels.START_DRAIN,permission:"update",icon:No.P.exit,click:()=>this.hostDrain(),disable:oe=>this.getDisable("drain",oe)||!this.enableDrainBtn,visible:()=>!this.showGeneralActionsOnly&&this.enableDrainBtn},{name:this.actionLabels.STOP_DRAIN,permission:"update",icon:No.P.exit,click:()=>this.hostDrain(!0),disable:oe=>this.getDisable("drain",oe)||this.enableDrainBtn,visible:()=>!this.showGeneralActionsOnly&&!this.enableDrainBtn},{name:this.actionLabels.REMOVE,permission:"delete",icon:No.P.destroy,click:()=>this.deleteAction(),disable:oe=>this.getDisable("remove",oe)},{name:this.actionLabels.ENTER_MAINTENANCE,permission:"update",icon:No.P.enter,click:()=>this.hostMaintenance(),disable:oe=>this.getDisable("maintenance",oe)||this.isExecuting||this.enableMaintenanceBtn,visible:()=>!this.showGeneralActionsOnly&&!this.enableMaintenanceBtn},{name:this.actionLabels.EXIT_MAINTENANCE,permission:"update",icon:No.P.exit,click:()=>this.hostMaintenance(),disable:oe=>this.getDisable("maintenance",oe)||this.isExecuting||!this.enableMaintenanceBtn,visible:()=>!this.showGeneralActionsOnly&&this.enableMaintenanceBtn}]}ngOnInit(){this.columns=[{name:"Hostname",prop:"hostname",flexGrow:1},{name:"Service Instances",prop:"service_instances",flexGrow:1.5,cellTemplate:this.servicesTpl},{name:"Labels",prop:"labels",flexGrow:1,cellTransformation:wt.e.badge,customTemplateConfig:{class:"badge-dark"}},{name:"Status",prop:"status",flexGrow:.8,cellTransformation:wt.e.badge,customTemplateConfig:{map:{maintenance:{class:"badge-warning"}}}},{name:"Model",prop:"model",flexGrow:1},{name:"CPUs",prop:"cpu_count",flexGrow:.3},{name:"Cores",prop:"cpu_cores",flexGrow:.3},{name:"Total Memory",prop:"memory_total_bytes",pipe:this.dimlessBinary,flexGrow:.4},{name:"Raw Capacity",prop:"raw_capacity",pipe:this.dimlessBinary,flexGrow:.5},{name:"HDDs",prop:"hdd_count",flexGrow:.3},{name:"Flash",prop:"flash_count",headerTemplate:this.flashTmpl,flexGrow:.3},{name:"NICs",prop:"nic_count",flexGrow:.3}],this.columns=this.columns.filter(t=>!this.hiddenColumns.includes(t.prop))}ngOnDestroy(){this.sub.unsubscribe()}updateSelection(t){this.selection=t,this.enableMaintenanceBtn=!1,this.enableDrainBtn=!1,this.selection.hasSelection&&("maintenance"===this.selection.first().status&&(this.enableMaintenanceBtn=!0),this.selection.first().labels.includes("_no_schedule")||(this.enableDrainBtn=!0))}editAction(){this.hostService.getLabels().subscribe(t=>{const o=this.selection.first(),l=new Set(t.concat(this.hostService.predefinedLabels)),_=Array.from(l).map(M=>({enabled:!0,name:M}));this.modalService.show($e.X,{titleText:"Edit Host: " + o.hostname + "",fields:[{type:"select-badges",name:"labels",value:o.labels,label:"Labels",typeConfig:{customBadges:!0,options:_,messages:new E.a({empty:"There are no labels.",filter:"Filter or add labels",add:"Add label"})}}],submitButtonText:"Edit Host",onSubmit:M=>{this.hostService.update(o.hostname,!0,M.labels).subscribe(()=>{this.notificationService.show(Sa.k.success,"Updated Host \"" + o.hostname + "\""),this.table.refreshBtn()})}})})}hostMaintenance(){this.isExecuting=!0;const t=this.selection.first();"maintenance"!==t.status?this.hostService.update(t.hostname,!1,[],!0).subscribe(()=>{this.isExecuting=!1,this.notificationService.show(Sa.k.success,"\"" + t.hostname + "\" moved to maintenance"),this.table.refreshBtn()},o=>{if(this.isExecuting=!1,this.errorMessage=o.error.detail.split(/\n/),o.preventDefault(),!o.error.detail.includes("WARNING")||o.error.detail.includes("It is NOT safe to stop")||o.error.detail.includes("ALERT")||o.error.detail.includes("unsafe to stop"))this.notificationService.show(Sa.k.error,"\"" + t.hostname + "\" cannot be put into maintenance","" + o.error.detail + "");else{const l={titleText:"Warning",buttonText:"Continue",warning:!0,bodyTpl:this.maintenanceConfirmTpl,showSubmit:!0,onSubmit:()=>{this.hostService.update(t.hostname,!1,[],!0,!0).subscribe(()=>{this.modalRef.close()},()=>this.modalRef.close())}};this.modalRef=this.modalService.show(od.Y,l)}}):this.hostService.update(t.hostname,!1,[],!0).subscribe(()=>{this.isExecuting=!1,this.notificationService.show(Sa.k.success,"\"" + t.hostname + "\" has exited maintenance"),this.table.refreshBtn()})}hostDrain(t=!1){const o=this.selection.first();if(t){const l=o.labels.indexOf("_no_schedule",0);o.labels.splice(l,1),this.hostService.update(o.hostname,!0,o.labels).subscribe(()=>{this.notificationService.show(Sa.k.info,"\"" + o.hostname + "\" stopped draining"),this.table.refreshBtn()})}else this.hostService.update(o.hostname,!1,[],!1,!1,!0).subscribe(()=>{this.notificationService.show(Sa.k.info,"\"" + o.hostname + "\" started draining"),this.table.refreshBtn()})}getDisable(t,o){if("remove"===t||"edit"===t||"maintenance"===t||"drain"===t){if(!(null==o?void 0:o.hasSingleSelection))return!0;if(!Er().every(o.selected,"sources.orchestrator"))return this.messages.nonOrchHost}return this.orchService.getTableActionDisableDesc(this.orchStatus,this.actionOrchFeatures[t])}deleteAction(){const t=this.selection.first().hostname;this.modalRef=this.modalService.show(Oc.M,{itemDescription:"Host",itemNames:[t],actionDescription:"remove",submitActionObservable:()=>this.taskWrapper.wrapTaskAroundCall({task:new Jl.R("host/remove",{hostname:t}),call:this.hostService.delete(t)})})}checkHostsFactsAvailable(){const t=this.orchStatus.features;return!Er().isEmpty(t)&&!!t.get_facts.available}transformHostsData(){if(this.checkHostsFactsAvailable())Er().forEach(this.hosts,t=>{t.memory_total_bytes=this.emptyPipe.transform(1024*t.memory_total_kb),t.raw_capacity=this.emptyPipe.transform(t.hdd_capacity_bytes+t.flash_capacity_bytes)});else for(let t=4;t<this.columns.length;t++)this.columns[t].cellTemplate=this.orchTmpl}getHosts(t){this.isLoadingHosts||(this.isLoadingHosts=!0,this.sub=this.orchService.status().pipe((0,Ac.zg)(o=>{this.orchStatus=o;const l=this.checkHostsFactsAvailable();return this.hostService.list(`${l}`)})).subscribe(o=>{this.hosts=o,this.transformHostsData(),this.isLoadingHosts=!1},()=>{this.isLoadingHosts=!1,t.error()}))}}return n.\u0275fac=function(t){return new(t||n)(e.Y36(zi.j),e.Y36(Ar.$),e.Y36(F.W),e.Y36(bc),e.Y36(Mo.p4),e.Y36(ru.Z),e.Y36(Sc.P),e.Y36(Bo.F0),e.Y36(Sl.g),e.Y36(h))},n.\u0275cmp=e.Xpm({type:n,selectors:[["cd-hosts"]],viewQuery:function(t,o){if(1&t&&(e.Gf(_r.a,5),e.Gf(Th,7),e.Gf(Ch,7),e.Gf(da,7),e.Gf(Rc,7)),2&t){let l;e.iGM(l=e.CRH())&&(o.table=l.first),e.iGM(l=e.CRH())&&(o.servicesTpl=l.first),e.iGM(l=e.CRH())&&(o.maintenanceConfirmTpl=l.first),e.iGM(l=e.CRH())&&(o.orchTmpl=l.first),e.iGM(l=e.CRH())&&(o.flashTmpl=l.first)}},inputs:{hiddenColumns:"hiddenColumns",hideMaintenance:"hideMaintenance",hasTableDetails:"hasTableDetails",hideToolHeader:"hideToolHeader",showGeneralActionsOnly:"showGeneralActionsOnly"},features:[e._Bn([{provide:Q.F,useValue:new Q.F("hosts")}]),e.qOj],decls:18,vars:3,consts:function(){let s,t,o,l,_,M,w,N,V;return s="Hosts List",t="Overall Performance",o="Host overview",l="" + "\ufffd0\ufffd" + "",_="Are you sure you want to continue?",M="Data will be available only if Orchestrator is available.",w="N/A",N="SSD, NVMEs",V="Flash",[["ngbNav","",1,"nav-tabs"],["nav","ngbNav"],["ngbNavItem",""],["ngbNavLink",""],s,["ngbNavContent",""],["ngbNavItem","",4,"ngIf"],[3,"ngbNavOutlet"],["servicesTpl",""],["maintenanceConfirmTpl",""],["orchTmpl",""],["flashTmpl",""],["name","modal"],["columnMode","flex","selectionType","single",3,"data","columns","hasDetails","toolHeader","fetchData","setExpandedRow","updateSelection"],["table",""],[1,"table-actions","btn-toolbar"],["id","host-actions",1,"btn-group",3,"permission","selection","tableActions"],["cdTableDetail","",3,"permissions","selection"],t,["title",o,"uid","y0KGL0iZz","grafanaStyle","two",3,"grafanaPath","type"],[4,"ngFor","ngForOf"],[1,"me-1",3,"key","value"],[4,"ngIf"],l,_,["ngbTooltip",M],w,["ngbTooltip",N],V]},template:function(t,o){if(1&t&&(e.TgZ(0,"nav",0,1),e.ynx(2,2),e.TgZ(3,"a",3),e.SDv(4,4),e.qZA(),e.YNc(5,Fu,5,9,"ng-template",5),e.BQk(),e.YNc(6,Ts,1,0,"ng-container",6),e.YNc(7,jp,4,0,"ng-container",6),e.qZA(),e._UZ(8,"div",7),e.YNc(9,Mh,1,1,"ng-template",null,8,e.W1O),e.YNc(11,Wf,2,2,"ng-template",null,9,e.W1O),e.YNc(13,qd,2,0,"ng-template",null,10,e.W1O),e.YNc(15,H_,2,0,"ng-template",null,11,e.W1O),e._UZ(17,"router-outlet",12)),2&t){const l=e.MAs(1);e.xp6(6),e.Q6J("ngIf",o.permissions.grafana.read),e.xp6(1),e.Q6J("ngIf",o.permissions.grafana.read),e.xp6(1),e.Q6J("ngbNavOutlet",l)}},directives:[Dr.Pz,Dr.nv,Dr.Vx,Dr.uN,_r.a,bu.K,bf,p.O5,ha.F,Dr.tO,p.sg,ka,Dr._L,Bo.lC],styles:[""]}),n})();var Cs=(()=>{return(n=Cs||(Cs={})).COST_CAPACITY="cost_capacity",n.THROUGHPUT="throughput_optimized",n.IOPS="iops_optimized",Cs;var n})(),zu=i(62862);let zp=(()=>{class n{constructor(t,o,l,_,M){this.activeModal=t,this.actionLabels=o,this.formBuilder=l,this.osdService=_,this.taskWrapper=M,this.driveGroups=[],this.submitAction=new e.vpe,this.action=o.CREATE,this.createForm()}createForm(){this.formGroup=this.formBuilder.group({})}onSubmit(){const t=Er().join(Er().map(this.driveGroups,"service_id"),", ");this.taskWrapper.wrapTaskAroundCall({task:new Jl.R("osd/"+Mo.MQ.CREATE,{tracking_id:t}),call:this.osdService.create(this.driveGroups,t)}).subscribe({error:()=>{this.formGroup.setErrors({cdSubmitButton:!0})},complete:()=>{this.submitAction.emit(),this.activeModal.close()}})}}return n.\u0275fac=function(t){return new(t||n)(e.Y36(Dr.Kz),e.Y36(Mo.p4),e.Y36(zu.O),e.Y36(cc),e.Y36(Sc.P))},n.\u0275cmp=e.Xpm({type:n,selectors:[["cd-osd-creation-preview-modal"]],inputs:{driveGroups:"driveGroups"},outputs:{submitAction:"submitAction"},decls:15,vars:9,consts:function(){let s,t;return s="OSD creation preview",t="DriveGroups",[[3,"modalRef"],[1,"modal-title"],s,[1,"modal-content"],["novalidate","",3,"formGroup"],["frm","ngForm"],[1,"modal-body"],t,[1,"modal-footer"],[3,"form","submitText","submitActionEvent"]]},template:function(t,o){1&t&&(e.TgZ(0,"cd-modal",0),e.ynx(1,1),e.SDv(2,2),e.BQk(),e.ynx(3,3),e.TgZ(4,"form",4,5)(6,"div",6)(7,"h4"),e.SDv(8,7),e.qZA(),e.TgZ(9,"pre"),e._uU(10),e.ALo(11,"json"),e.qZA()(),e.TgZ(12,"div",8)(13,"cd-form-button-panel",9),e.NdJ("submitActionEvent",function(){return o.onSubmit()}),e.ALo(14,"titlecase"),e.qZA()()(),e.BQk(),e.qZA()),2&t&&(e.Q6J("modalRef",o.activeModal),e.xp6(4),e.Q6J("formGroup",o.formGroup),e.xp6(6),e.Oqu(e.lcZ(11,5,o.driveGroups)),e.xp6(3),e.Q6J("form",o.formGroup)("submitText",e.lcZ(14,7,o.action)))},directives:[Fe.z,_n._Y,_n.JL,Ma.V,_n.sg,Cl.p],pipes:[p.Ts,p.rS],styles:[""]}),n})();const pc=["inventoryDevices"];function oc(n,s){if(1&n&&(e.TgZ(0,"span",16),e._uU(1),e.qZA()),2&n){const t=s.$implicit;e.xp6(1),e.hij(" ",t," ")}}function Jf(n,s){if(1&n&&(e.TgZ(0,"cd-alert-panel",13),e.ynx(1),e.SDv(2,14),e.BQk(),e.YNc(3,oc,2,1,"span",15),e.qZA()),2&n){const t=e.oxw();e.Q6J("showTitle",!1),e.xp6(3),e.Q6J("ngForOf",t.requiredFilters)}}function Lf(n,s){if(1&n&&(e.TgZ(0,"div")(1,"p",17)(2,"span"),e.SDv(3,18),e.ALo(4,"dimlessBinary"),e.qZA()()()),2&n){const t=e.oxw();e.xp6(4),e.pQV(t.filteredDevices.length)(e.lcZ(4,2,t.capacity)),e.QtT(3)}}const Vp=function(){return["available","osd_ids"]};let r_=(()=>{class n{constructor(t,o,l,_,M){this.formBuilder=t,this.cdRef=o,this.activeModal=l,this.actionLabels=_,this.wizardStepService=M,this.submitAction=new e.vpe,this.icons=No.P,this.filterColumns=[],this.devices=[],this.filteredDevices=[],this.capacity=0,this.canSubmit=!1,this.requiredFilters=[],this.action=_.ADD,this.createForm()}ngAfterViewInit(){const t=Er().filter(this.inventoryDevices.columns,o=>this.filterColumns.includes(o.prop)&&"hostname"!==o.prop);setTimeout(()=>{this.requiredFilters=Er().map(t,"name")},0)}createForm(){this.formGroup=this.formBuilder.group({})}onFilterChange(t){if(this.capacity=0,this.canSubmit=!1,Er().isEmpty(t.filters))this.filteredDevices=[],this.event=void 0;else{const o=t.filters.filter(l=>"hostname"!==l.prop);this.canSubmit=!Er().isEmpty(o),this.filteredDevices=t.data,this.capacity=Er().sumBy(this.filteredDevices,"sys_api.size"),this.event=t}this.cdRef.detectChanges()}onSubmit(){this.submitAction.emit(this.event),this.activeModal.close()}}return n.\u0275fac=function(t){return new(t||n)(e.Y36(zu.O),e.Y36(e.sBO),e.Y36(Dr.Kz),e.Y36(Mo.p4),e.Y36(fu))},n.\u0275cmp=e.Xpm({type:n,selectors:[["cd-osd-devices-selection-modal"]],viewQuery:function(t,o){if(1&t&&e.Gf(pc,5),2&t){let l;e.iGM(l=e.CRH())&&(o.inventoryDevices=l.first)}},outputs:{submitAction:"submitAction"},decls:14,vars:16,consts:function(){let s,t,o;return s="" + "\ufffd0\ufffd" + " devices",t="At least one of these filters must be applied in order to proceed:",o="Number of devices: " + "\ufffd0\ufffd" + ". Raw capacity: " + "\ufffd1\ufffd" + ".",[[3,"modalRef"],[1,"modal-title"],s,[1,"modal-content"],["novalidate","",3,"formGroup"],["frm","ngForm"],[1,"modal-body"],["type","warning","size","slim",3,"showTitle",4,"ngIf"],[3,"devices","filterColumns","hostname","diskType","hiddenColumns","filterChange"],["inventoryDevices",""],[4,"ngIf"],[1,"modal-footer"],[3,"form","disabled","submitText","submitActionEvent"],["type","warning","size","slim",3,"showTitle"],t,["class","badge badge-dark ms-2",4,"ngFor","ngForOf"],[1,"badge","badge-dark","ms-2"],[1,"text-center"],o]},template:function(t,o){1&t&&(e.TgZ(0,"cd-modal",0),e.ynx(1,1),e.SDv(2,2),e.BQk(),e.ynx(3,3),e.TgZ(4,"form",4,5)(6,"div",6),e.YNc(7,Jf,4,2,"cd-alert-panel",7),e.TgZ(8,"cd-inventory-devices",8,9),e.NdJ("filterChange",function(_){return o.onFilterChange(_)}),e.qZA(),e.YNc(10,Lf,5,4,"div",10),e.qZA(),e.TgZ(11,"div",11)(12,"cd-form-button-panel",12),e.NdJ("submitActionEvent",function(){return o.onSubmit()}),e.ALo(13,"titlecase"),e.qZA()()(),e.BQk(),e.qZA()),2&t&&(e.Q6J("modalRef",o.activeModal),e.xp6(2),e.pQV(o.deviceType),e.QtT(2),e.xp6(2),e.Q6J("formGroup",o.formGroup),e.xp6(3),e.Q6J("ngIf",!o.canSubmit),e.xp6(1),e.Q6J("devices",o.devices)("filterColumns",o.filterColumns)("hostname",o.hostname)("diskType",o.diskType)("hiddenColumns",e.DdM(15,Vp)),e.xp6(2),e.Q6J("ngIf",o.canSubmit),e.xp6(2),e.Q6J("form",o.formGroup)("disabled",!o.canSubmit||0===o.filteredDevices.length)("submitText",e.lcZ(13,13,o.action)))},directives:[Fe.z,_n._Y,_n.JL,Ma.V,_n.sg,p.O5,Eo.G,p.sg,xc,Cl.p],pipes:[Ar.$,p.rS],styles:[""]}),n})();function ef(n,s){1&n&&(e.TgZ(0,"span"),e.SDv(1,7),e.qZA())}function tf(n,s){1&n&&(e.TgZ(0,"span"),e.SDv(1,8),e.qZA())}function Oh(n,s){1&n&&(e.TgZ(0,"span"),e.SDv(1,9),e.qZA())}const Ah=function(n){return[n]};function fd(n,s){if(1&n){const t=e.EpF();e.ynx(0),e.TgZ(1,"button",10),e.NdJ("click",function(){return e.CHM(t),e.oxw().showSelectionModal()}),e._UZ(2,"i",11),e.ynx(3),e.SDv(4,12),e.BQk(),e.qZA(),e.BQk()}if(2&n){const t=e.oxw();e.xp6(1),e.Q6J("title",t.addButtonTooltip)("disabled",0===t.availDevices.length||!t.canSelect||t.expansionCanSelect),e.xp6(1),e.Q6J("ngClass",e.VKq(3,Ah,t.icons.add))}}function Dh(n,s){if(1&n&&(e.TgZ(0,"span")(1,"span",19),e._uU(2),e.qZA()()),2&n){const t=s.$implicit;e.xp6(2),e.AsE("",t.name,": ",t.value.formatted,"")}}function Mp(n,s){if(1&n&&(e.TgZ(0,"div",20)(1,"span"),e.SDv(2,21),e.ALo(3,"dimlessBinary"),e.qZA()()),2&n){const t=e.oxw(2);e.xp6(3),e.pQV(e.lcZ(3,1,t.capacity)),e.QtT(2)}}const wh=function(){return["available","osd_ids"]},zc=function(){return[]};function Qf(n,s){if(1&n){const t=e.EpF();e.TgZ(0,"div",13),e.YNc(1,Dh,3,2,"span",14),e.TgZ(2,"a",15),e.NdJ("click",function(){return e.CHM(t),e.oxw().clearDevices(),!1}),e._UZ(3,"i",11),e.ynx(4),e.SDv(5,16),e.BQk(),e.qZA()(),e.TgZ(6,"div"),e._UZ(7,"cd-inventory-devices",17),e.qZA(),e.YNc(8,Mp,4,3,"div",18)}if(2&n){const t=e.oxw();e.xp6(1),e.Q6J("ngForOf",t.appliedFilters),e.xp6(2),e.Q6J("ngClass",e.VKq(6,Ah,t.icons.clearFilters)),e.xp6(4),e.Q6J("devices",t.devices)("hiddenColumns",e.DdM(8,wh))("filterColumns",e.DdM(9,zc)),e.xp6(1),e.Q6J("ngIf","data"===t.type)}}let fp=(()=>{class n{constructor(t,o,l){this.modalService=t,this.osdService=o,this.router=l,this.selected=new e.vpe,this.cleared=new e.vpe,this.icons=No.P,this.devices=[],this.capacity=0,this.appliedFilters=new Array,this.expansionCanSelect=!1,this.tooltips={noAvailDevices:"No available devices",addPrimaryFirst:"Please add primary devices first",addByFilters:"Add devices by using filters"},this.isOsdPage=this.router.url.includes("/osd")}ngOnInit(){var t,o,l;this.isOsdPage||(this.devices=(null===(t=this.osdService)||void 0===t?void 0:t.osdDevices[this.type])?this.osdService.osdDevices[this.type]:[],this.capacity=Er().sumBy(this.devices,"sys_api.size"),this.expansionCanSelect=!!(null===(o=this.osdService)||void 0===o?void 0:o.osdDevices)&&(null===(l=this.osdService)||void 0===l?void 0:l.osdDevices.disableSelect)),this.updateAddButtonTooltip()}ngOnChanges(){this.updateAddButtonTooltip()}showSelectionModal(){this.modalService.show(r_,{hostname:this.hostname,deviceType:this.name,diskType:"Primary"===this.name?"hdd":"ssd",devices:this.availDevices,filterColumns:["hostname","human_readable_type","sys_api.vendor","sys_api.model","sys_api.size"]},{size:"xl"}).componentInstance.submitAction.subscribe(M=>{this.devices=M.data,this.capacity=Er().sumBy(this.devices,"sys_api.size"),this.appliedFilters=M.filters;const w=Er().assign({type:this.type},M);this.isOsdPage||(this.osdService.osdDevices[this.type]=this.devices,this.osdService.osdDevices.disableSelect=this.canSelect||this.devices.length===this.availDevices.length,this.osdService.osdDevices[this.type].capacity=this.capacity),this.selected.emit(w)})}updateAddButtonTooltip(){this.addButtonTooltip="data"===this.type&&0===this.availDevices.length?this.tooltips.noAvailDevices:this.canSelect?0===this.availDevices.length?this.tooltips.noAvailDevices:this.tooltips.addByFilters:this.tooltips.addPrimaryFirst}clearDevices(){this.isOsdPage||(this.expansionCanSelect=!1,this.osdService.osdDevices.disableSelect=!1,this.osdService.osdDevices=[]);const t={type:this.type,clearedDevices:[...this.devices]};this.devices=[],this.cleared.emit(t)}}return n.\u0275fac=function(t){return new(t||n)(e.Y36(ru.Z),e.Y36(cc),e.Y36(Bo.F0))},n.\u0275cmp=e.Xpm({type:n,selectors:[["cd-osd-devices-selection-groups"]],inputs:{type:"type",name:"name",hostname:"hostname",availDevices:"availDevices",canSelect:"canSelect"},outputs:{selected:"selected",cleared:"cleared"},features:[e.TTD],decls:12,vars:6,consts:function(){let s,t,o,l,_,M,w;return s="" + "\ufffd0\ufffd" + " devices",t="The primary storage devices. These devices contain all OSD data.",o="Write-Ahead-Log devices. These devices are used for BlueStore\u2019s internal journal. It is only useful to use a WAL device if the device is faster than the primary device (e.g. NVME devices or SSDs). If there is only a small amount of fast storage available (e.g., less than a gigabyte), we recommend using it as a WAL device.",l="DB devices can be used for storing BlueStore\u2019s internal metadata. It is only helpful to provision a DB device if it is faster than the primary device (e.g. NVME devices or SSD).",_="Add",M="Clear",w="Raw capacity: " + "\ufffd0\ufffd" + "",[[1,"form-group","row"],["for","createDeleteButton",1,"cd-col-form-label"],s,[4,"ngIf"],[1,"cd-col-form-input"],[4,"ngIf","ngIfElse"],["blockClearDevices",""],t,o,l,["type","button","data-toggle","tooltip",1,"btn","btn-light",3,"title","disabled","click"],[3,"ngClass"],_,[1,"pb-2","my-2","border-bottom"],[4,"ngFor","ngForOf"],["href","",1,"tc_clearSelections",3,"click"],M,[3,"devices","hiddenColumns","filterColumns"],["class","float-end",4,"ngIf"],[1,"badge","badge-dark","me-2"],[1,"float-end"],w]},template:function(t,o){if(1&t&&(e.TgZ(0,"div",0)(1,"label",1),e.ynx(2),e.SDv(3,2),e.BQk(),e.TgZ(4,"cd-helper"),e.YNc(5,ef,2,0,"span",3),e.YNc(6,tf,2,0,"span",3),e.YNc(7,Oh,2,0,"span",3),e.qZA()(),e.TgZ(8,"div",4),e.YNc(9,fd,5,5,"ng-container",5),e.YNc(10,Qf,9,10,"ng-template",null,6,e.W1O),e.qZA()()),2&t){const l=e.MAs(11);e.xp6(3),e.pQV(o.name),e.QtT(3),e.xp6(2),e.Q6J("ngIf","data"===o.type),e.xp6(1),e.Q6J("ngIf","wal"===o.type),e.xp6(1),e.Q6J("ngIf","db"===o.type),e.xp6(2),e.Q6J("ngIf",0===o.devices.length)("ngIfElse",l)}},directives:[al.P,Oe.S,p.O5,_e.o,p.mk,p.sg,xc],pipes:[Ar.$],styles:[".tc_clearSelections[_ngcontent-%COMP%]{text-decoration:none}"]}),n})();const Op=["dataDeviceSelectionGroups"],Dd=["walDeviceSelectionGroups"],Zp=["dbDeviceSelectionGroups"],Kf=["previewButtonPanel"];function i_(n,s){1&n&&e._UZ(0,"cd-orchestrator-doc-panel")}function o_(n,s){if(1&n&&(e.TgZ(0,"div",32),e.SDv(1,33),e.ALo(2,"titlecase"),e.ALo(3,"upperFirst"),e.qZA()),2&n){const t=e.oxw(2);e.xp6(3),e.pQV(e.lcZ(2,2,t.action))(e.lcZ(3,4,t.resource)),e.QtT(1)}}function Ap(n,s){if(1&n){const t=e.EpF();e.TgZ(0,"div",34)(1,"div",35)(2,"input",36),e.NdJ("change",function(){return e.CHM(t),e.oxw(2).emitDeploymentSelection()}),e.qZA(),e.TgZ(3,"label",37),e.tHW(4,38),e.TgZ(5,"cd-helper"),e._UZ(6,"span"),e.qZA(),e.N_p(),e.qZA()()()}if(2&n){const t=s.$implicit,o=e.oxw(2);e.xp6(2),e.Q6J("id",t)("value",t),e.uIk("disabled",null==o.deploymentOptions||!o.deploymentOptions.options[t].available||null),e.xp6(1),e.Q6J("id","label_"+t)("for",t),e.xp6(3),e.pQV(null==o.deploymentOptions?null:o.deploymentOptions.options[t].title)(o.deploymentOptions.recommended_option===t?"(Recommended)":"")(null==o.deploymentOptions?null:o.deploymentOptions.options[t].desc),e.QtT(4)}}function Wp(n,s){1&n&&(e.TgZ(0,"span",47),e.SDv(1,48),e.qZA())}function nf(n,s){if(1&n&&(e.TgZ(0,"div",39)(1,"label",40),e.ynx(2),e.SDv(3,41),e.BQk(),e.TgZ(4,"cd-helper")(5,"span"),e.SDv(6,42),e.qZA(),e._UZ(7,"br"),e.TgZ(8,"span"),e.SDv(9,43),e.qZA()()(),e.TgZ(10,"div",44),e._UZ(11,"input",45),e.YNc(12,Wp,2,0,"span",46),e.qZA()()),2&n){e.oxw();const t=e.MAs(4),o=e.oxw();e.xp6(12),e.Q6J("ngIf",o.form.showError("walSlots",t,"min"))}}function Xf(n,s){1&n&&(e.TgZ(0,"span",47),e.SDv(1,54),e.qZA())}function Jp(n,s){if(1&n&&(e.TgZ(0,"div",39)(1,"label",49),e.ynx(2),e.SDv(3,50),e.BQk(),e.TgZ(4,"cd-helper")(5,"span"),e.SDv(6,51),e.qZA(),e._UZ(7,"br"),e.TgZ(8,"span"),e.SDv(9,52),e.qZA()()(),e.TgZ(10,"div",44),e._UZ(11,"input",53),e.YNc(12,Xf,2,0,"span",46),e.qZA()()),2&n){e.oxw();const t=e.MAs(4),o=e.oxw();e.xp6(12),e.Q6J("ngIf",o.form.showError("dbSlots",t,"min"))}}function T_(n,s){if(1&n){const t=e.EpF();e.TgZ(0,"div",55)(1,"input",56),e.NdJ("change",function(){return e.CHM(t),e.oxw(2).emitDeploymentSelection()}),e.qZA(),e.TgZ(2,"label",57),e._uU(3),e.qZA()()}if(2&n){const t=s.$implicit;e.xp6(1),e.s9C("id",t.key),e.s9C("name",t.key),e.s9C("formControlName",t.key),e.xp6(1),e.s9C("for",t.key),e.xp6(1),e.Oqu(t.desc)}}function qf(n,s){if(1&n){const t=e.EpF();e.TgZ(0,"div",58)(1,"cd-form-button-panel",59,60),e.NdJ("submitActionEvent",function(){return e.CHM(t),e.oxw(2).submit()}),e.qZA()()}if(2&n){e.oxw();const t=e.MAs(22),o=e.oxw();e.xp6(1),e.Q6J("form",o.form)("disabled",0===t.devices.length&&!o.simpleDeployment)("submitText",o.simpleDeployment?"Create OSDs":o.actionLabels.PREVIEW)}}const Dp=function(n){return{collapsed:n}},s_=function(n){return{show:n}};function rg(n,s){if(1&n){const t=e.EpF();e.TgZ(0,"div",2),e.YNc(1,o_,4,6,"div",3),e.TgZ(2,"div",4)(3,"form",5,6)(5,"div",7)(6,"div",8)(7,"h2",9)(8,"button",10),e.NdJ("click",function(){return e.CHM(t),e.oxw().emitDeploymentMode()}),e.SDv(9,11),e.qZA()()(),e.TgZ(10,"div",12)(11,"div",13),e.YNc(12,Ap,7,8,"div",14),e.qZA()(),e.TgZ(13,"div",8)(14,"h2",9)(15,"button",15),e.NdJ("click",function(){return e.CHM(t),e.oxw().emitDeploymentMode()}),e.SDv(16,16),e.qZA()()(),e.TgZ(17,"div",12)(18,"div",13)(19,"div",17)(20,"fieldset")(21,"cd-osd-devices-selection-groups",18,19),e.NdJ("selected",function(l){return e.CHM(t),e.oxw().onDevicesSelected(l)})("cleared",function(l){return e.CHM(t),e.oxw().onDevicesCleared(l)}),e.qZA()(),e.TgZ(23,"fieldset")(24,"legend"),e.SDv(25,20),e.qZA(),e.TgZ(26,"cd-osd-devices-selection-groups",21,22),e.NdJ("selected",function(l){return e.CHM(t),e.oxw().onDevicesSelected(l)})("cleared",function(l){return e.CHM(t),e.oxw().onDevicesCleared(l)}),e.qZA(),e.YNc(28,nf,13,1,"div",23),e.TgZ(29,"cd-osd-devices-selection-groups",24,25),e.NdJ("selected",function(l){return e.CHM(t),e.oxw().onDevicesSelected(l)})("cleared",function(l){return e.CHM(t),e.oxw().onDevicesCleared(l)}),e.qZA(),e.YNc(31,Jp,13,1,"div",23),e.qZA()()()(),e.TgZ(32,"div",8)(33,"h2",9)(34,"button",26),e.SDv(35,27),e.qZA()()(),e.TgZ(36,"div",28)(37,"div",13)(38,"div",29),e.YNc(39,T_,4,5,"div",30),e.qZA()()()()()(),e.YNc(40,qf,3,3,"div",31),e.qZA()}if(2&n){const t=e.MAs(22),o=e.MAs(27),l=e.MAs(30),_=e.oxw();e.xp6(1),e.Q6J("ngIf",!_.hideTitle),e.xp6(2),e.Q6J("formGroup",_.form),e.xp6(5),e.Q6J("ngClass",e.VKq(19,Dp,!_.simpleDeployment)),e.xp6(2),e.Q6J("ngClass",e.VKq(21,s_,_.simpleDeployment)),e.xp6(2),e.Q6J("ngForOf",_.optionNames),e.xp6(3),e.Q6J("ngClass",e.VKq(23,Dp,_.simpleDeployment)),e.xp6(2),e.Q6J("ngClass",e.VKq(25,s_,!_.simpleDeployment)),e.xp6(4),e.Q6J("availDevices",_.availDevices)("canSelect",0!==_.availDevices.length),e.xp6(5),e.Q6J("availDevices",_.availDevices)("canSelect",0!==t.devices.length)("hostname",_.hostname),e.xp6(2),e.Q6J("ngIf",0!==o.devices.length),e.xp6(1),e.Q6J("availDevices",_.availDevices)("canSelect",0!==t.devices.length)("hostname",_.hostname),e.xp6(2),e.Q6J("ngIf",0!==l.devices.length),e.xp6(8),e.Q6J("ngForOf",_.featureList),e.xp6(1),e.Q6J("ngIf",!_.hideSubmitBtn)}}let Qp=(()=>{class n extends Bl.E{constructor(t,o,l,_,M,w,N,V){super(),this.actionLabels=t,this.authStorageService=o,this.orchService=l,this.hostService=_,this.router=M,this.modalService=w,this.osdService=N,this.taskWrapper=V,this.hideTitle=!1,this.hideSubmitBtn=!1,this.emitDriveGroup=new e.vpe,this.emitDeploymentOption=new e.vpe,this.emitMode=new e.vpe,this.icons=No.P,this.columns=[],this.allDevices=[],this.availDevices=[],this.dataDeviceFilters=[],this.dbDeviceFilters=[],this.walDeviceFilters=[],this.hostname="",this.driveGroup=new dc,this.featureList=[],this.hasOrchestrator=!0,this.simpleDeployment=!0,this.optionNames=Object.values(Cs),this.resource="OSDs",this.action=this.actionLabels.CREATE,this.features={encrypted:{key:"encrypted",desc:"Encryption"}},this.featureList=Er().map(this.features,(X,re)=>Object.assign(X,{key:re})),this.createForm()}ngOnInit(){this.orchService.status().subscribe(t=>{this.hasOrchestrator=t.available,t.available?this.getDataDevices():this.loadingNone()}),this.osdService.getDeploymentOptions().subscribe(t=>{var o,l;this.deploymentOptions=t,this.form.get("deploymentOption").setValue(null===(o=this.deploymentOptions)||void 0===o?void 0:o.recommended_option),(null===(l=this.deploymentOptions)||void 0===l?void 0:l.recommended_option)&&this.enableFeatures()}),this.form.get("walSlots").valueChanges.subscribe(t=>this.setSlots("wal",t)),this.form.get("dbSlots").valueChanges.subscribe(t=>this.setSlots("db",t)),Er().each(this.features,t=>{this.form.get("features").get(t.key).valueChanges.subscribe(o=>this.featureFormUpdate(t.key,o))})}createForm(){this.form=new tc.d({walSlots:new _n.NI(0),dbSlots:new _n.NI(0),features:new tc.d(this.featureList.reduce((t,o)=>(t[o.key]=new _n.NI({value:!1,disabled:!0}),t),{})),deploymentOption:new _n.NI(0)})}getDataDevices(){this.hostService.inventoryDeviceList().subscribe(t=>{this.allDevices=Er().filter(t,"available"),this.availDevices=[...this.allDevices],this.loadingReady()},()=>{this.allDevices=[],this.availDevices=[],this.loadingError()})}setSlots(t,o){"number"==typeof o&&o>=0&&this.driveGroup.setSlots(t,o)}featureFormUpdate(t,o){this.driveGroup.setFeature(t,o)}enableFeatures(){this.featureList.forEach(t=>{this.form.get(t.key).enable({emitEvent:!1})})}disableFeatures(){this.featureList.forEach(t=>{const o=this.form.get(t.key);o.disable({emitEvent:!1}),o.setValue(!1,{emitEvent:!1})})}onDevicesSelected(t){if(this.availDevices=t.dataOut,"data"===t.type){const o=Er().find(t.filters,{prop:"hostname"});o?(this.hostname=o.value.raw,this.availDevices=t.dataOut.filter(l=>l.hostname===this.hostname),this.driveGroup.setHostPattern(this.hostname)):this.driveGroup.setHostPattern("*"),this.enableFeatures()}this.driveGroup.setDeviceSelection(t.type,t.filters),this.emitDriveGroup.emit(this.driveGroup)}onDevicesCleared(t){"data"===t.type?(this.hostname="",this.availDevices=[...this.allDevices],this.walDeviceSelectionGroups.devices=[],this.dbDeviceSelectionGroups.devices=[],this.disableFeatures(),this.driveGroup.reset(),this.form.get("walSlots").setValue(0,{emitEvent:!1}),this.form.get("dbSlots").setValue(0,{emitEvent:!1})):(this.availDevices=[...this.availDevices,...t.clearedDevices],this.driveGroup.clearDeviceSelection(t.type),this.form.get(`${t.type}Slots`).setValue(0,{emitEvent:!1}))}emitDeploymentSelection(){const t=this.form.get("deploymentOption").value,o=this.form.get("encrypted").value;this.emitDeploymentOption.emit({option:t,encrypted:o})}emitDeploymentMode(){this.simpleDeployment=!this.simpleDeployment,this.simpleDeployment||0!==this.dataDeviceSelectionGroups.devices.length?this.enableFeatures():this.disableFeatures(),this.emitMode.emit(this.simpleDeployment)}submit(){if(this.simpleDeployment){const l={option:this.form.get("deploymentOption").value,encrypted:this.form.get("encrypted").value},M=`${this.deploymentOptions.options[l.option].title} deployment`;this.taskWrapper.wrapTaskAroundCall({task:new Jl.R("osd/"+Mo.MQ.CREATE,{tracking_id:M}),call:this.osdService.create([l],M,"predefined")}).subscribe({complete:()=>{this.router.navigate(["/osd"])}})}else{const t=this.authStorageService.getUsername();this.driveGroup.setName(`dashboard-${t}-${Er().now()}`),this.modalService.show(zp,{driveGroups:[this.driveGroup.spec]}).componentInstance.submitAction.subscribe(()=>{this.router.navigate(["/osd"])}),this.previewButtonPanel.submitButton.loading=!1}}}return n.\u0275fac=function(t){return new(t||n)(e.Y36(Mo.p4),e.Y36(zi.j),e.Y36(h),e.Y36(bc),e.Y36(Bo.F0),e.Y36(ru.Z),e.Y36(cc),e.Y36(Sc.P))},n.\u0275cmp=e.Xpm({type:n,selectors:[["cd-osd-form"]],viewQuery:function(t,o){if(1&t&&(e.Gf(Op,5),e.Gf(Dd,5),e.Gf(Zp,5),e.Gf(Kf,5)),2&t){let l;e.iGM(l=e.CRH())&&(o.dataDeviceSelectionGroups=l.first),e.iGM(l=e.CRH())&&(o.walDeviceSelectionGroups=l.first),e.iGM(l=e.CRH())&&(o.dbDeviceSelectionGroups=l.first),e.iGM(l=e.CRH())&&(o.previewButtonPanel=l.first)}},inputs:{hideTitle:"hideTitle",hideSubmitBtn:"hideSubmitBtn"},outputs:{emitDriveGroup:"emitDriveGroup",emitDeploymentOption:"emitDeploymentOption",emitMode:"emitMode"},features:[e.qOj],decls:2,vars:2,consts:function(){let s,t,o,l,_,M,w,N,V,X,re,oe,fe,ve;return s="Deployment Options",t="Advanced Mode",o="Shared devices",l="Features",_="" + "\ufffd0\ufffd" + " " + "\ufffd1\ufffd" + "",M="" + "\ufffd0\ufffd" + " " + "\ufffd1\ufffd" + " " + "\ufffd#5\ufffd" + "" + "\ufffd#6\ufffd" + "" + "\ufffd2\ufffd" + "" + "\ufffd/#6\ufffd" + "" + "\ufffd/#5\ufffd" + "",w="WAL slots",N="How many OSDs per WAL device.",V="Specify 0 to let Orchestrator backend decide it.",X="Value should be greater than or equal to 0",re="DB slots",oe="How many OSDs per DB device.",fe="Specify 0 to let Orchestrator backend decide it.",ve="Value should be greater than or equal to 0",[[4,"ngIf"],["class","card",4,"cdFormLoading"],[1,"card"],["class","card-header",4,"ngIf"],[1,"card-body","ms-2"],["name","form","novalidate","",3,"formGroup"],["formDir","ngForm"],[1,"accordion"],[1,"accordion-item"],[1,"accordion-header"],["type","button","data-toggle","collapse","aria-label","toggle deployment options",1,"accordion-button",3,"ngClass","click"],s,[1,"accordion-collapse","collapse",3,"ngClass"],[1,"accordion-body"],["class","pt-3 pb-3",4,"ngFor","ngForOf"],["type","button","aria-label","toggle advanced mode",1,"accordion-button",3,"ngClass","click"],t,[1,"card-body"],["name","Primary","type","data",3,"availDevices","canSelect","selected","cleared"],["dataDeviceSelectionGroups",""],o,["name","WAL","type","wal",3,"availDevices","canSelect","hostname","selected","cleared"],["walDeviceSelectionGroups",""],["class","form-group row",4,"ngIf"],["name","DB","type","db",3,"availDevices","canSelect","hostname","selected","cleared"],["dbDeviceSelectionGroups",""],["type","button","data-toggle","collapse","aria-label","features","aria-expanded","true",1,"accordion-button"],l,[1,"accordion-collapse","collapse","show"],["formGroupName","features",1,"pt-3","pb-3"],["class","custom-control custom-checkbox",4,"ngFor","ngForOf"],["class","card-footer",4,"ngIf"],[1,"card-header"],_,[1,"pt-3","pb-3"],[1,"custom-control","form-check","custom-control-inline"],["type","radio","name","deploymentOption","formControlName","deploymentOption",1,"form-check-input",3,"id","value","change"],[1,"form-check-label",3,"id","for"],M,[1,"form-group","row"],["for","walSlots",1,"cd-col-form-label"],w,N,V,[1,"cd-col-form-input"],["id","walSlots","name","walSlots","type","number","min","0","formControlName","walSlots",1,"form-control"],["class","invalid-feedback",4,"ngIf"],[1,"invalid-feedback"],X,["for","dbSlots",1,"cd-col-form-label"],re,oe,fe,["id","dbSlots","name","dbSlots","type","number","min","0","formControlName","dbSlots",1,"form-control"],ve,[1,"custom-control","custom-checkbox"],["type","checkbox",1,"custom-control-input",3,"id","name","formControlName","change"],[1,"custom-control-label",3,"for"],[1,"card-footer"],["wrappingClass","text-right",3,"form","disabled","submitText","submitActionEvent"],["previewButtonPanel",""]]},template:function(t,o){1&t&&(e.YNc(0,i_,1,0,"cd-orchestrator-doc-panel",0),e.YNc(1,rg,41,27,"div",1)),2&t&&(e.Q6J("ngIf",!o.hasOrchestrator),e.xp6(1),e.Q6J("cdFormLoading",o.loading))},directives:[p.O5,ch,lu.y,_n._Y,_n.JL,Ma.V,_n.sg,_e.o,p.mk,p.sg,_n._,_n.Fj,Il.b,_n.JJ,_n.u,Oe.S,fp,al.P,_n.qQ,_n.wV,_n.x0,_n.Wl,Cl.p],pipes:[p.rS,gt.m],styles:[""]}),n})();var C_=i(67460);let ep=(()=>{class n{transform(t){if(Er().isUndefined(t))return "no spec";if(Er().get(t,"unmanaged",!1))return "unmanaged";const o=[],l=Er().get(t,"placement.hosts"),_=Er().get(t,"placement.count"),M=Er().get(t,"placement.label"),w=Er().get(t,"placement.host_pattern");return Er().isArray(l)&&o.push(...l),Er().isNumber(_)&&o.push("count:" + _ + ""),Er().isString(M)&&o.push("label:" + M + ""),Er().isString(w)&&o.push(w),o.join(";")}}return n.\u0275fac=function(t){return new(t||n)},n.\u0275pipe=e.Yjl({name:"placement",type:n,pure:!0}),n})();var xh=i(79765),M_=i(66682),Sf=i(77393),a_=i(33637);function tp(n,s=a_.P){return t=>t.lift(new Kp(n,s))}class Kp{constructor(s,t){this.dueTime=s,this.scheduler=t}call(s,t){return t.subscribe(new l_(s,this.dueTime,this.scheduler))}}class l_ extends Sf.L{constructor(s,t,o){super(s),this.dueTime=t,this.scheduler=o,this.debouncedSubscription=null,this.lastValue=null,this.hasValue=!1}_next(s){this.clearDebounce(),this.lastValue=s,this.hasValue=!0,this.add(this.debouncedSubscription=this.scheduler.schedule(Ff,this.dueTime,this))}_complete(){this.debouncedNext(),this.destination.complete()}debouncedNext(){if(this.clearDebounce(),this.hasValue){const{lastValue:s}=this;this.lastValue=null,this.hasValue=!1,this.destination.next(s)}}clearDebounce(){const s=this.debouncedSubscription;null!==s&&(this.remove(s),s.unsubscribe(),this.debouncedSubscription=null)}}function Ff(n){n.debouncedNext()}var Rh=i(87519),np=i(45435),Xp=i(80842),gg=i(14745),pd=i(4416),u_=i(58039);function mg(n,s){if(1&n&&(e.TgZ(0,"option",26),e._uU(1),e.qZA()),2&n){const t=s.$implicit;e.Q6J("value",t),e.xp6(1),e.hij(" ",t," ")}}function pp(n,s){1&n&&(e.TgZ(0,"span",27),e.SDv(1,28),e.qZA())}function Nh(n,s){1&n&&(e.TgZ(0,"option",12),e.SDv(1,33),e.qZA()),2&n&&e.Q6J("ngValue",null)}function Vc(n,s){1&n&&(e.TgZ(0,"option",12),e.SDv(1,34),e.qZA()),2&n&&e.Q6J("ngValue",null)}function ig(n,s){1&n&&(e.TgZ(0,"option",12),e.SDv(1,35),e.qZA()),2&n&&e.Q6J("ngValue",null)}function O_(n,s){if(1&n&&(e.TgZ(0,"option",26),e._uU(1),e.qZA()),2&n){const t=s.$implicit;e.Q6J("value",t.service_name),e.xp6(1),e.Oqu(t.service_name)}}function B_(n,s){1&n&&(e.TgZ(0,"span",27),e.SDv(1,36),e.qZA())}const P=function(){return["ingress"]},te=function(n){return{required:n}};function b(n,s){if(1&n){const t=e.EpF();e.TgZ(0,"div",7)(1,"label",29),e.SDv(2,30),e.qZA(),e.TgZ(3,"div",10)(4,"select",31),e.NdJ("change",function(){return e.CHM(t),e.oxw().prePopulateId()}),e.YNc(5,Nh,2,1,"option",32),e.YNc(6,Vc,2,1,"option",32),e.YNc(7,ig,2,1,"option",32),e.YNc(8,O_,2,2,"option",14),e.qZA(),e.YNc(9,B_,2,0,"span",15),e.qZA()()}if(2&n){const t=e.oxw(),o=e.MAs(7);e.xp6(1),e.Q6J("ngClass",e.VKq(7,te,e.DdM(6,P).includes(t.serviceForm.controls.service_type.value))),e.xp6(4),e.Q6J("ngIf",null===t.services),e.xp6(1),e.Q6J("ngIf",null!==t.services&&0===t.services.length),e.xp6(1),e.Q6J("ngIf",null!==t.services&&t.services.length>0),e.xp6(1),e.Q6J("ngForOf",t.services),e.xp6(1),e.Q6J("ngIf",t.serviceForm.showError("backend_service",o,"required"))}}function G(n,s){1&n&&(e.TgZ(0,"span",27),e.SDv(1,41),e.qZA())}function Te(n,s){1&n&&(e.TgZ(0,"span",27),e.SDv(1,42),e.qZA())}function Ge(n,s){1&n&&(e.TgZ(0,"span",27),e.tHW(1,43),e._UZ(2,"strong"),e.N_p(),e.qZA())}function an(n,s){1&n&&(e.TgZ(0,"span",27),e.SDv(1,44),e.qZA())}const fr=function(){return["mds","rgw","nfs","iscsi","ingress"]};function wr(n,s){if(1&n&&(e.TgZ(0,"div",7)(1,"label",37)(2,"span"),e.SDv(3,38),e.qZA(),e.TgZ(4,"cd-helper"),e.SDv(5,39),e.qZA()(),e.TgZ(6,"div",10),e._UZ(7,"input",40),e.YNc(8,G,2,0,"span",15),e.YNc(9,Te,2,0,"span",15),e.YNc(10,Ge,3,0,"span",15),e.YNc(11,an,2,0,"span",15),e.qZA()()),2&n){const t=e.oxw(),o=e.MAs(7);e.xp6(1),e.Q6J("ngClass",e.VKq(6,te,e.DdM(5,fr).includes(t.serviceForm.controls.service_type.value))),e.xp6(7),e.Q6J("ngIf",t.serviceForm.showError("service_id",o,"required")),e.xp6(1),e.Q6J("ngIf",t.serviceForm.showError("service_id",o,"uniqueName")),e.xp6(1),e.Q6J("ngIf",t.serviceForm.showError("service_id",o,"rgwPattern")),e.xp6(1),e.Q6J("ngIf",t.serviceForm.showError("service_id",o,"mdsPattern"))}}function ci(n,s){1&n&&(e.TgZ(0,"div",7)(1,"label",45),e.SDv(2,46),e.qZA(),e.TgZ(3,"div",10)(4,"select",47)(5,"option",48),e.SDv(6,49),e.qZA(),e.TgZ(7,"option",50),e.SDv(8,51),e.qZA()()()())}function oi(n,s){1&n&&(e.TgZ(0,"span",27),e.SDv(1,55),e.qZA())}function ts(n,s){if(1&n){const t=e.EpF();e.TgZ(0,"div",7)(1,"label",52),e.SDv(2,53),e.qZA(),e.TgZ(3,"div",10)(4,"input",54),e.NdJ("focus",function(l){return e.CHM(t),e.oxw().labelFocus.next(l.target.value)})("click",function(l){return e.CHM(t),e.oxw().labelClick.next(l.target.value)}),e.qZA(),e.YNc(5,oi,2,0,"span",15),e.qZA()()}if(2&n){const t=e.oxw(),o=e.MAs(7);e.xp6(4),e.Q6J("ngbTypeahead",t.searchLabels),e.xp6(1),e.Q6J("ngIf",t.serviceForm.showError("label",o,"required"))}}function Do(n,s){if(1&n&&(e.TgZ(0,"div",7)(1,"label",56),e.SDv(2,57),e.qZA(),e.TgZ(3,"div",10),e._UZ(4,"cd-select-badges",58),e.qZA()()),2&n){const t=e.oxw();e.xp6(4),e.Q6J("data",t.serviceForm.controls.hosts.value)("options",t.hosts.options)("messages",t.hosts.messages)}}function Ss(n,s){1&n&&(e.TgZ(0,"span",27),e.SDv(1,63),e.qZA())}function Yo(n,s){1&n&&(e.TgZ(0,"span",27),e.SDv(1,64),e.qZA())}function ia(n,s){if(1&n&&(e.TgZ(0,"div",7)(1,"label",59)(2,"span"),e.SDv(3,60),e.qZA(),e.TgZ(4,"cd-helper"),e.SDv(5,61),e.qZA()(),e.TgZ(6,"div",10),e._UZ(7,"input",62),e.YNc(8,Ss,2,0,"span",15),e.YNc(9,Yo,2,0,"span",15),e.qZA()()),2&n){const t=e.oxw(),o=e.MAs(7);e.xp6(8),e.Q6J("ngIf",t.serviceForm.showError("count",o,"min")),e.xp6(1),e.Q6J("ngIf",t.serviceForm.showError("count",o,"pattern"))}}function v(n,s){1&n&&(e.TgZ(0,"span",27),e.SDv(1,68),e.qZA())}function D(n,s){1&n&&(e.TgZ(0,"span",27),e.SDv(1,69),e.qZA())}function B(n,s){1&n&&(e.TgZ(0,"span",27),e.SDv(1,70),e.qZA())}function ye(n,s){if(1&n&&(e.ynx(0),e.TgZ(1,"div",7)(2,"label",65),e.SDv(3,66),e.qZA(),e.TgZ(4,"div",10),e._UZ(5,"input",67),e.YNc(6,v,2,0,"span",15),e.YNc(7,D,2,0,"span",15),e.YNc(8,B,2,0,"span",15),e.qZA()(),e.BQk()),2&n){const t=e.oxw(),o=e.MAs(7);e.xp6(6),e.Q6J("ngIf",t.serviceForm.showError("rgw_frontend_port",o,"pattern")),e.xp6(1),e.Q6J("ngIf",t.serviceForm.showError("rgw_frontend_port",o,"min")),e.xp6(1),e.Q6J("ngIf",t.serviceForm.showError("rgw_frontend_port",o,"max"))}}function He(n,s){1&n&&(e.TgZ(0,"option",12),e.SDv(1,74),e.qZA()),2&n&&e.Q6J("ngValue",null)}function yt(n,s){1&n&&(e.TgZ(0,"option",12),e.SDv(1,75),e.qZA()),2&n&&e.Q6J("ngValue",null)}function Wt(n,s){1&n&&(e.TgZ(0,"option",12),e.SDv(1,76),e.qZA()),2&n&&e.Q6J("ngValue",null)}function gn(n,s){if(1&n&&(e.TgZ(0,"option",26),e._uU(1),e.qZA()),2&n){const t=s.$implicit;e.Q6J("value",t.pool_name),e.xp6(1),e.Oqu(t.pool_name)}}function nr(n,s){1&n&&(e.TgZ(0,"span",27),e.SDv(1,77),e.qZA())}function ti(n,s){if(1&n&&(e.TgZ(0,"div",7)(1,"label",71),e.SDv(2,72),e.qZA(),e.TgZ(3,"div",10)(4,"select",73),e.YNc(5,He,2,1,"option",32),e.YNc(6,yt,2,1,"option",32),e.YNc(7,Wt,2,1,"option",32),e.YNc(8,gn,2,2,"option",14),e.qZA(),e.YNc(9,nr,2,0,"span",15),e.qZA()()),2&n){const t=e.oxw(),o=e.MAs(7);e.xp6(5),e.Q6J("ngIf",null===t.pools),e.xp6(1),e.Q6J("ngIf",t.pools&&0===t.pools.length),e.xp6(1),e.Q6J("ngIf",t.pools&&t.pools.length>0),e.xp6(1),e.Q6J("ngForOf",t.pools),e.xp6(1),e.Q6J("ngIf",t.serviceForm.showError("pool",o,"required"))}}function $o(n,s){1&n&&(e.TgZ(0,"span",27),e.SDv(1,95),e.qZA())}function Hs(n,s){1&n&&(e.TgZ(0,"span",27),e.SDv(1,96),e.qZA())}function po(n,s){1&n&&(e.TgZ(0,"span",27),e.SDv(1,97),e.qZA())}function ds(n,s){1&n&&(e.TgZ(0,"span",27),e.SDv(1,98),e.qZA())}function sa(n,s){1&n&&(e.TgZ(0,"span",27),e.SDv(1,99),e.qZA())}const Js=function(){return["iscsi"]};function zr(n,s){if(1&n&&(e.ynx(0),e.TgZ(1,"div",7)(2,"label",78)(3,"span"),e.SDv(4,79),e.qZA(),e.TgZ(5,"cd-helper")(6,"span"),e.SDv(7,80),e.qZA(),e._UZ(8,"br"),e.TgZ(9,"span"),e.tHW(10,81),e._UZ(11,"b"),e.N_p(),e.qZA()()(),e.TgZ(12,"div",10),e._UZ(13,"input",82),e.qZA()(),e.TgZ(14,"div",7)(15,"label",83),e.SDv(16,84),e.qZA(),e.TgZ(17,"div",10),e._UZ(18,"input",85),e.YNc(19,$o,2,0,"span",15),e.YNc(20,Hs,2,0,"span",15),e.YNc(21,po,2,0,"span",15),e.qZA()(),e.TgZ(22,"div",7)(23,"label",86),e.SDv(24,87),e.qZA(),e.TgZ(25,"div",10),e._UZ(26,"input",88),e.YNc(27,ds,2,0,"span",15),e.qZA()(),e.TgZ(28,"div",7)(29,"label",89),e.SDv(30,90),e.qZA(),e.TgZ(31,"div",10)(32,"div",91),e._UZ(33,"input",92)(34,"button",93)(35,"cd-copy-2-clipboard-button",94),e.YNc(36,sa,2,0,"span",15),e.qZA()()(),e.BQk()),2&n){const t=e.oxw(),o=e.MAs(7);e.xp6(19),e.Q6J("ngIf",t.serviceForm.showError("api_port",o,"pattern")),e.xp6(1),e.Q6J("ngIf",t.serviceForm.showError("api_port",o,"min")),e.xp6(1),e.Q6J("ngIf",t.serviceForm.showError("api_port",o,"max")),e.xp6(2),e.Q6J("ngClass",e.VKq(8,te,e.DdM(7,Js).includes(t.serviceForm.controls.service_type.value))),e.xp6(4),e.Q6J("ngIf",t.serviceForm.showError("api_user",o,"required")),e.xp6(2),e.Q6J("ngClass",e.VKq(11,te,e.DdM(10,Js).includes(t.serviceForm.controls.service_type.value))),e.xp6(7),e.Q6J("ngIf",t.serviceForm.showError("api_password",o,"required"))}}function Rr(n,s){1&n&&(e.TgZ(0,"span",27),e.SDv(1,112),e.qZA())}function Ur(n,s){1&n&&(e.TgZ(0,"span",27),e.SDv(1,113),e.qZA())}function Fi(n,s){1&n&&(e.TgZ(0,"span",27),e.SDv(1,114),e.qZA())}function ro(n,s){1&n&&(e.TgZ(0,"span",27),e.SDv(1,115),e.qZA())}function $a(n,s){1&n&&(e.TgZ(0,"span",27),e.SDv(1,116),e.qZA())}function ms(n,s){1&n&&(e.TgZ(0,"span",27),e.SDv(1,117),e.qZA())}function xa(n,s){1&n&&(e.TgZ(0,"span",27),e.SDv(1,118),e.qZA())}function za(n,s){1&n&&(e.TgZ(0,"span",27),e.SDv(1,119),e.qZA())}function va(n,s){1&n&&(e.TgZ(0,"span",27),e.SDv(1,120),e.qZA())}function kf(n,s){1&n&&(e.TgZ(0,"div",7)(1,"label",121)(2,"span"),e.SDv(3,122),e.qZA(),e.TgZ(4,"cd-helper")(5,"span"),e.SDv(6,123),e.qZA()()(),e.TgZ(7,"div",10),e._UZ(8,"input",124),e.qZA()())}function og(n,s){if(1&n&&(e.ynx(0),e.TgZ(1,"div",7)(2,"label",100)(3,"span"),e.SDv(4,101),e.qZA(),e.TgZ(5,"cd-helper")(6,"span"),e.SDv(7,102),e.qZA()()(),e.TgZ(8,"div",10),e._UZ(9,"input",103),e.YNc(10,Rr,2,0,"span",15),e.qZA()(),e.TgZ(11,"div",7)(12,"label",104)(13,"span"),e.SDv(14,105),e.qZA(),e.TgZ(15,"cd-helper")(16,"span"),e.SDv(17,106),e.qZA()()(),e.TgZ(18,"div",10),e._UZ(19,"input",107),e.YNc(20,Ur,2,0,"span",15),e.YNc(21,Fi,2,0,"span",15),e.YNc(22,ro,2,0,"span",15),e.YNc(23,$a,2,0,"span",15),e.qZA()(),e.TgZ(24,"div",7)(25,"label",108)(26,"span"),e.SDv(27,109),e.qZA(),e.TgZ(28,"cd-helper")(29,"span"),e.SDv(30,110),e.qZA()()(),e.TgZ(31,"div",10),e._UZ(32,"input",111),e.YNc(33,ms,2,0,"span",15),e.YNc(34,xa,2,0,"span",15),e.YNc(35,za,2,0,"span",15),e.YNc(36,va,2,0,"span",15),e.qZA()(),e.YNc(37,kf,9,0,"div",16),e.BQk()),2&n){const t=e.oxw(),o=e.MAs(7);e.xp6(2),e.Q6J("ngClass",e.VKq(14,te,e.DdM(13,P).includes(t.serviceForm.controls.service_type.value))),e.xp6(8),e.Q6J("ngIf",t.serviceForm.showError("virtual_ip",o,"required")),e.xp6(2),e.Q6J("ngClass",e.VKq(17,te,e.DdM(16,P).includes(t.serviceForm.controls.service_type.value))),e.xp6(8),e.Q6J("ngIf",t.serviceForm.showError("frontend_port",o,"pattern")),e.xp6(1),e.Q6J("ngIf",t.serviceForm.showError("frontend_port",o,"min")),e.xp6(1),e.Q6J("ngIf",t.serviceForm.showError("frontend_port",o,"max")),e.xp6(1),e.Q6J("ngIf",t.serviceForm.showError("frontend_port",o,"required")),e.xp6(2),e.Q6J("ngClass",e.VKq(20,te,e.DdM(19,P).includes(t.serviceForm.controls.service_type.value))),e.xp6(8),e.Q6J("ngIf",t.serviceForm.showError("monitor_port",o,"pattern")),e.xp6(1),e.Q6J("ngIf",t.serviceForm.showError("monitor_port",o,"min")),e.xp6(1),e.Q6J("ngIf",t.serviceForm.showError("monitor_port",o,"max")),e.xp6(1),e.Q6J("ngIf",t.serviceForm.showError("monitor_port",o,"required")),e.xp6(1),e.Q6J("ngIf",!t.serviceForm.controls.unmanaged.value)}}function c_(n,s){if(1&n&&(e.TgZ(0,"option",26),e._uU(1),e.qZA()),2&n){const t=s.$implicit;e.Q6J("value",t),e.xp6(1),e.Oqu(t)}}function sg(n,s){1&n&&(e.TgZ(0,"span",27),e.SDv(1,134),e.qZA())}function zg(n,s){1&n&&(e.TgZ(0,"span",27),e.SDv(1,135),e.qZA())}function ag(n,s){1&n&&(e.TgZ(0,"span",27),e.tHW(1,136),e._UZ(2,"strong"),e.N_p(),e.qZA())}function vm(n,s){1&n&&(e.TgZ(0,"span",27),e.SDv(1,141),e.qZA())}function ym(n,s){1&n&&(e.TgZ(0,"span",27),e.tHW(1,142),e._UZ(2,"strong"),e.N_p(),e.qZA())}function iv(n,s){if(1&n&&(e.TgZ(0,"div",7)(1,"label",137)(2,"span"),e.SDv(3,138),e.qZA(),e.TgZ(4,"cd-helper")(5,"span"),e.SDv(6,139),e.qZA()()(),e.TgZ(7,"div",10),e._UZ(8,"input",140),e.YNc(9,vm,2,0,"span",15),e.YNc(10,ym,3,0,"span",15),e.qZA()()),2&n){const t=e.oxw(2),o=e.MAs(7);e.xp6(9),e.Q6J("ngIf",t.serviceForm.showError("engine_id",o,"required")),e.xp6(1),e.Q6J("ngIf",t.serviceForm.showError("engine_id",o,"snmpEngineIdPattern"))}}function ov(n,s){if(1&n&&(e.TgZ(0,"option",26),e._uU(1),e.qZA()),2&n){const t=s.$implicit;e.Q6J("value",t),e.xp6(1),e.hij(" ",t," ")}}function vg(n,s){1&n&&(e.TgZ(0,"span",27),e.SDv(1,147),e.qZA())}const Tf=function(){return["SHA","MD5"]};function Vg(n,s){if(1&n&&(e.TgZ(0,"div",7)(1,"label",143),e.SDv(2,144),e.qZA(),e.TgZ(3,"div",10)(4,"select",145)(5,"option",12),e.SDv(6,146),e.qZA(),e.YNc(7,ov,2,2,"option",14),e.qZA(),e.YNc(8,vg,2,0,"span",15),e.qZA()()),2&n){const t=e.oxw(2),o=e.MAs(7);e.xp6(5),e.Q6J("ngValue",null),e.xp6(2),e.Q6J("ngForOf",e.DdM(3,Tf)),e.xp6(1),e.Q6J("ngIf",t.serviceForm.showError("auth_protocol",o,"required"))}}function Zg(n,s){if(1&n&&(e.TgZ(0,"option",26),e._uU(1),e.qZA()),2&n){const t=s.$implicit;e.Q6J("value",t),e.xp6(1),e.hij(" ",t," ")}}const Em=function(){return["DES","AES"]};function Kc(n,s){1&n&&(e.TgZ(0,"div",7)(1,"label",148),e.SDv(2,149),e.qZA(),e.TgZ(3,"div",10)(4,"select",150)(5,"option",12),e.SDv(6,151),e.qZA(),e.YNc(7,Zg,2,2,"option",14),e.qZA()()()),2&n&&(e.xp6(5),e.Q6J("ngValue",null),e.xp6(2),e.Q6J("ngForOf",e.DdM(2,Em)))}function Nc(n,s){1&n&&(e.TgZ(0,"span",27),e.SDv(1,155),e.qZA())}function iu(n,s){if(1&n&&(e.TgZ(0,"div",7)(1,"label",152)(2,"span"),e.SDv(3,153),e.qZA()(),e.TgZ(4,"div",10),e._UZ(5,"input",154),e.YNc(6,Nc,2,0,"span",15),e.qZA()()),2&n){const t=e.oxw(2),o=e.MAs(7);e.xp6(6),e.Q6J("ngIf",t.serviceForm.showError("snmp_community",o,"required"))}}function bm(n,s){1&n&&(e.TgZ(0,"span",27),e.SDv(1,159),e.qZA())}function lg(n,s){if(1&n&&(e.TgZ(0,"div",7)(1,"label",156)(2,"span"),e.SDv(3,157),e.qZA()(),e.TgZ(4,"div",10),e._UZ(5,"input",158),e.YNc(6,bm,2,0,"span",15),e.qZA()()),2&n){const t=e.oxw(2),o=e.MAs(7);e.xp6(6),e.Q6J("ngIf",t.serviceForm.showError("snmp_v3_auth_username",o,"required"))}}function Gl(n,s){1&n&&(e.TgZ(0,"span",27),e.SDv(1,163),e.qZA())}function Xo(n,s){if(1&n&&(e.TgZ(0,"div",7)(1,"label",160)(2,"span"),e.SDv(3,161),e.qZA()(),e.TgZ(4,"div",10),e._UZ(5,"input",162),e.YNc(6,Gl,2,0,"span",15),e.qZA()()),2&n){const t=e.oxw(2),o=e.MAs(7);e.xp6(6),e.Q6J("ngIf",t.serviceForm.showError("snmp_v3_auth_password",o,"required"))}}function Nl(n,s){1&n&&(e.TgZ(0,"span",27),e.SDv(1,167),e.qZA())}function Wg(n,s){if(1&n&&(e.TgZ(0,"div",7)(1,"label",164)(2,"span"),e.SDv(3,165),e.qZA()(),e.TgZ(4,"div",10),e._UZ(5,"input",166),e.YNc(6,Nl,2,0,"span",15),e.qZA()()),2&n){const t=e.oxw(2),o=e.MAs(7);e.xp6(6),e.Q6J("ngIf",t.serviceForm.showError("snmp_v3_priv_password",o,"required"))}}const rf=function(){return["V2c","V3"]};function Xc(n,s){if(1&n){const t=e.EpF();e.ynx(0),e.TgZ(1,"div",7)(2,"label",125),e.SDv(3,126),e.qZA(),e.TgZ(4,"div",10)(5,"select",127),e.NdJ("change",function(){return e.CHM(t),e.oxw().clearValidations()}),e.TgZ(6,"option",12),e.SDv(7,128),e.qZA(),e.YNc(8,c_,2,2,"option",14),e.qZA(),e.YNc(9,sg,2,0,"span",15),e.qZA()(),e.TgZ(10,"div",7)(11,"label",129)(12,"span"),e.SDv(13,130),e.qZA(),e.TgZ(14,"cd-helper")(15,"span"),e.SDv(16,131),e.qZA()()(),e.TgZ(17,"div",10),e._UZ(18,"input",132),e.YNc(19,zg,2,0,"span",15),e.YNc(20,ag,3,0,"span",15),e.qZA()(),e.YNc(21,iv,11,2,"div",16),e.YNc(22,Vg,9,4,"div",16),e.YNc(23,Kc,8,3,"div",16),e.TgZ(24,"fieldset")(25,"legend"),e.SDv(26,133),e.qZA(),e.YNc(27,iu,7,1,"div",16),e.YNc(28,lg,7,1,"div",16),e.YNc(29,Xo,7,1,"div",16),e.YNc(30,Wg,7,1,"div",16),e.qZA(),e.BQk()}if(2&n){const t=e.oxw(),o=e.MAs(7);e.xp6(6),e.Q6J("ngValue",null),e.xp6(2),e.Q6J("ngForOf",e.DdM(12,rf)),e.xp6(1),e.Q6J("ngIf",t.serviceForm.showError("snmp_version",o,"required")),e.xp6(10),e.Q6J("ngIf",t.serviceForm.showError("snmp_destination",o,"required")),e.xp6(1),e.Q6J("ngIf",t.serviceForm.showError("snmp_destination",o,"snmpDestinationPattern")),e.xp6(1),e.Q6J("ngIf","V3"===t.serviceForm.controls.snmp_version.value),e.xp6(1),e.Q6J("ngIf","V3"===t.serviceForm.controls.snmp_version.value),e.xp6(1),e.Q6J("ngIf","V3"===t.serviceForm.controls.snmp_version.value),e.xp6(4),e.Q6J("ngIf","V2c"===t.serviceForm.controls.snmp_version.value),e.xp6(1),e.Q6J("ngIf","V3"===t.serviceForm.controls.snmp_version.value),e.xp6(1),e.Q6J("ngIf","V3"===t.serviceForm.controls.snmp_version.value),e.xp6(1),e.Q6J("ngIf","V3"===t.serviceForm.controls.snmp_version.value&&null!=t.serviceForm.controls.privacy_protocol.value)}}function Jg(n,s){1&n&&(e.TgZ(0,"span",27),e.SDv(1,176),e.qZA())}function U_(n,s){1&n&&(e.TgZ(0,"span",27),e.SDv(1,177),e.qZA())}function wp(n,s){if(1&n){const t=e.EpF();e.TgZ(0,"div",7)(1,"label",171)(2,"span"),e.SDv(3,172),e.qZA(),e.TgZ(4,"cd-helper"),e.SDv(5,173),e.qZA()(),e.TgZ(6,"div",10)(7,"textarea",174),e._uU(8,"              "),e.qZA(),e.TgZ(9,"input",175),e.NdJ("change",function(l){return e.CHM(t),e.oxw(2).fileUpload(l.target.files,"ssl_cert")}),e.qZA(),e.YNc(10,Jg,2,0,"span",15),e.YNc(11,U_,2,0,"span",15),e.qZA()()}if(2&n){const t=e.oxw(2),o=e.MAs(7);e.xp6(10),e.Q6J("ngIf",t.serviceForm.showError("ssl_cert",o,"required")),e.xp6(1),e.Q6J("ngIf",t.serviceForm.showError("ssl_cert",o,"pattern"))}}function Qg(n,s){1&n&&(e.TgZ(0,"span",27),e.SDv(1,182),e.qZA())}function sv(n,s){1&n&&(e.TgZ(0,"span",27),e.SDv(1,183),e.qZA())}function yg(n,s){if(1&n){const t=e.EpF();e.TgZ(0,"div",7)(1,"label",178)(2,"span"),e.SDv(3,179),e.qZA(),e.TgZ(4,"cd-helper"),e.SDv(5,180),e.qZA()(),e.TgZ(6,"div",10)(7,"textarea",181),e._uU(8,"              "),e.qZA(),e.TgZ(9,"input",175),e.NdJ("change",function(l){return e.CHM(t),e.oxw(2).fileUpload(l.target.files,"ssl_key")}),e.qZA(),e.YNc(10,Qg,2,0,"span",15),e.YNc(11,sv,2,0,"span",15),e.qZA()()}if(2&n){const t=e.oxw(2),o=e.MAs(7);e.xp6(10),e.Q6J("ngIf",t.serviceForm.showError("ssl_key",o,"required")),e.xp6(1),e.Q6J("ngIf",t.serviceForm.showError("ssl_key",o,"pattern"))}}const ug=function(){return["rgw","ingress"]};function A_(n,s){if(1&n&&(e.ynx(0),e.TgZ(1,"div",7)(2,"div",17)(3,"div",18),e._UZ(4,"input",168),e.TgZ(5,"label",169),e.SDv(6,170),e.qZA()()()(),e.YNc(7,wp,12,2,"div",16),e.YNc(8,yg,12,2,"div",16),e.BQk()),2&n){const t=e.oxw();e.xp6(7),e.Q6J("ngIf",t.serviceForm.controls.ssl.value),e.xp6(1),e.Q6J("ngIf",t.serviceForm.controls.ssl.value&&!e.DdM(2,ug).includes(t.serviceForm.controls.service_type.value))}}const Eg=function(){return["rgw","iscsi","ingress"]};let xp=(()=>{class n extends Bl.E{constructor(t,o,l,_,M,w,N,V,X){super(),this.actionLabels=t,this.cephServiceService=o,this.formBuilder=l,this.hostService=_,this.poolService=M,this.router=w,this.taskWrapperService=N,this.route=V,this.activeModal=X,this.RGW_SVC_ID_PATTERN=/^([^.]+)(\.([^.]+)\.([^.]+))?$/,this.MDS_SVC_ID_PATTERN=/^[a-zA-Z_.-][a-zA-Z0-9_.-]*$/,this.SNMP_DESTINATION_PATTERN=/^[^\:]+:[0-9]/,this.SNMP_ENGINE_ID_PATTERN=/^[0-9A-Fa-f]{10,64}/g,this.INGRESS_SUPPORTED_SERVICE_TYPES=["rgw","nfs"],this.hiddenServices=[],this.editing=!1,this.serviceTypes=[],this.serviceIds=[],this.labelClick=new xh.xQ,this.labelFocus=new xh.xQ,this.services=[],this.searchLabels=re=>(0,M_.T)(re.pipe(tp(200),(0,Rh.x)()),this.labelFocus,this.labelClick.pipe((0,np.h)(()=>!this.typeahead.isPopupOpen()))).pipe((0,Oa.U)(oe=>this.labels.filter(fe=>fe.toLowerCase().indexOf(oe.toLowerCase())>-1).slice(0,10))),this.resource="service",this.hosts={options:[],messages:new E.a({empty:"There are no hosts.",filter:"Filter hosts"})},this.createForm()}createForm(){this.serviceForm=this.formBuilder.group({service_type:[null,[_n.kI.required]],service_id:[null,[Me.h.composeIf({service_type:"mds"},[_n.kI.required,Me.h.custom("mdsPattern",t=>!Er().isEmpty(t)&&!this.MDS_SVC_ID_PATTERN.test(t))]),Me.h.requiredIf({service_type:"nfs"}),Me.h.requiredIf({service_type:"iscsi"}),Me.h.requiredIf({service_type:"ingress"}),Me.h.composeIf({service_type:"rgw"},[_n.kI.required,Me.h.custom("rgwPattern",t=>!Er().isEmpty(t)&&!this.RGW_SVC_ID_PATTERN.test(t))]),Me.h.custom("uniqueName",t=>this.serviceIds&&this.serviceIds.includes(t))]],placement:["hosts"],label:[null,[Me.h.requiredIf({placement:"label",unmanaged:!1})]],hosts:[[]],count:[null,[Me.h.number(!1)]],unmanaged:[!1],pool:[null,[Me.h.requiredIf({service_type:"iscsi"})]],rgw_frontend_port:[null,[Me.h.number(!1)]],trusted_ip_list:[null],api_port:[null,[Me.h.number(!1)]],api_user:[null,[Me.h.requiredIf({service_type:"iscsi",unmanaged:!1})]],api_password:[null,[Me.h.requiredIf({service_type:"iscsi",unmanaged:!1})]],backend_service:[null,[Me.h.requiredIf({service_type:"ingress"})]],virtual_ip:[null,[Me.h.requiredIf({service_type:"ingress"})]],frontend_port:[null,[Me.h.number(!1),Me.h.requiredIf({service_type:"ingress"})]],monitor_port:[null,[Me.h.number(!1),Me.h.requiredIf({service_type:"ingress"})]],virtual_interface_networks:[null],ssl:[!1],ssl_cert:["",[Me.h.composeIf({service_type:"rgw",unmanaged:!1,ssl:!0},[_n.kI.required,Me.h.pemCert()]),Me.h.composeIf({service_type:"iscsi",unmanaged:!1,ssl:!0},[_n.kI.required,Me.h.sslCert()]),Me.h.composeIf({service_type:"ingress",unmanaged:!1,ssl:!0},[_n.kI.required,Me.h.pemCert()])]],ssl_key:["",[Me.h.composeIf({service_type:"iscsi",unmanaged:!1,ssl:!0},[_n.kI.required,Me.h.sslPrivKey()])]],snmp_version:[null,[Me.h.requiredIf({service_type:"snmp-gateway"})]],snmp_destination:[null,{validators:[Me.h.requiredIf({service_type:"snmp-gateway"}),Me.h.custom("snmpDestinationPattern",t=>!Er().isEmpty(t)&&!this.SNMP_DESTINATION_PATTERN.test(t))]}],engine_id:[null,[Me.h.requiredIf({service_type:"snmp-gateway"}),Me.h.custom("snmpEngineIdPattern",t=>!Er().isEmpty(t)&&!this.SNMP_ENGINE_ID_PATTERN.test(t))]],auth_protocol:["SHA",[Me.h.requiredIf({service_type:"snmp-gateway"})]],privacy_protocol:[null],snmp_community:[null,[Me.h.requiredIf({snmp_version:"V2c"})]],snmp_v3_auth_username:[null,[Me.h.requiredIf({service_type:"snmp-gateway"})]],snmp_v3_auth_password:[null,[Me.h.requiredIf({service_type:"snmp-gateway"})]],snmp_v3_priv_password:[null,[Me.h.requiredIf({privacy_protocol:{op:"!empty"}})]]})}ngOnInit(){this.action=this.actionLabels.CREATE,this.router.url.includes("services/(modal:create")?this.pageURL="services":this.router.url.includes("services/(modal:edit")&&(this.editing=!0,this.pageURL="services",this.route.params.subscribe(t=>{this.serviceName=t.name,this.serviceType=t.type})),this.cephServiceService.list(new y.LE({fromObject:{limit:-1,offset:0}})).observable.subscribe(t=>{this.serviceList=t,this.services=t.filter(o=>this.INGRESS_SUPPORTED_SERVICE_TYPES.includes(o.service_type))}),this.cephServiceService.getKnownTypes().subscribe(t=>{this.hiddenServices.push("osd","container"),this.serviceTypes=Er().difference(t,this.hiddenServices).sort()}),this.hostService.list("false").subscribe(t=>{const o=[];Er().forEach(t,l=>{if(Er().get(l,"sources.orchestrator",!1)){const _=new gg.$(!1,Er().get(l,"hostname"),"");o.push(_)}}),this.hosts.options=[...o]}),this.hostService.getLabels().subscribe(t=>{this.labels=t}),this.poolService.getList().subscribe(t=>{this.pools=t}),this.editing&&(this.action=this.actionLabels.EDIT,this.disableForEditing(this.serviceType),this.cephServiceService.list(new y.LE({fromObject:{limit:-1,offset:0}}),this.serviceName).observable.subscribe(t=>{var o,l,_,M,w,N,V,X,re,oe,fe,ve,Pe;if(["service_type","service_id","unmanaged"].forEach(Ie=>{this.serviceForm.get(Ie).setValue(t[0][Ie])}),!t[0].unmanaged){const Ie=Object.keys(t[0].placement)[0];let Ae;Ae=["hosts","label"].indexOf(Ie)>=0?Ie:"hosts",this.serviceForm.get("placement").setValue(Ae),this.serviceForm.get("count").setValue(t[0].placement.count),(null===(o=t[0])||void 0===o?void 0:o.placement[Ae])&&this.serviceForm.get(Ae).setValue(null===(l=t[0])||void 0===l?void 0:l.placement[Ae])}switch(this.serviceType){case"iscsi":["pool","api_password","api_user","trusted_ip_list","api_port"].forEach(Et=>{this.serviceForm.get(Et).setValue(t[0].spec[Et])}),this.serviceForm.get("ssl").setValue(null===(_=t[0].spec)||void 0===_?void 0:_.api_secure),(null===(M=t[0].spec)||void 0===M?void 0:M.api_secure)&&(this.serviceForm.get("ssl_cert").setValue(null===(w=t[0].spec)||void 0===w?void 0:w.ssl_cert),this.serviceForm.get("ssl_key").setValue(null===(N=t[0].spec)||void 0===N?void 0:N.ssl_key));break;case"rgw":this.serviceForm.get("rgw_frontend_port").setValue(null===(V=t[0].spec)||void 0===V?void 0:V.rgw_frontend_port),this.serviceForm.get("ssl").setValue(null===(X=t[0].spec)||void 0===X?void 0:X.ssl),(null===(re=t[0].spec)||void 0===re?void 0:re.ssl)&&this.serviceForm.get("ssl_cert").setValue(null===(oe=t[0].spec)||void 0===oe?void 0:oe.rgw_frontend_ssl_certificate);break;case"ingress":["backend_service","virtual_ip","frontend_port","monitor_port","virtual_interface_networks","ssl"].forEach(Et=>{this.serviceForm.get(Et).setValue(t[0].spec[Et])}),(null===(fe=t[0].spec)||void 0===fe?void 0:fe.ssl)&&(this.serviceForm.get("ssl_cert").setValue(null===(ve=t[0].spec)||void 0===ve?void 0:ve.ssl_cert),this.serviceForm.get("ssl_key").setValue(null===(Pe=t[0].spec)||void 0===Pe?void 0:Pe.ssl_key));break;case"snmp-gateway":["snmp_version","snmp_destination"].forEach(Et=>{this.serviceForm.get(Et).setValue(t[0].spec[Et])}),"V3"===this.serviceForm.getValue("snmp_version")?["engine_id","auth_protocol","privacy_protocol","snmp_v3_auth_username","snmp_v3_auth_password","snmp_v3_priv_password"].forEach(ft=>{null!==ft&&("snmp_v3_auth_username"===ft||"snmp_v3_auth_password"===ft||"snmp_v3_priv_password"===ft?this.serviceForm.get(ft).setValue(t[0].spec.credentials[ft]):this.serviceForm.get(ft).setValue(t[0].spec[ft]))}):this.serviceForm.get("snmp_community").setValue(t[0].spec.credentials.snmp_community)}}))}getServiceIds(t){var o;this.serviceIds=null===(o=this.serviceList)||void 0===o?void 0:o.filter(l=>l.service_type===t).map(l=>l.service_id)}disableForEditing(t){"ingress"===(["service_type","service_id"].forEach(l=>{this.serviceForm.get(l).disable()}),t)&&this.serviceForm.get("backend_service").disable()}fileUpload(t,o){const l=t[0],_=new FileReader;_.addEventListener("load",M=>{const w=this.serviceForm.get(o);w.setValue(M.target.result),w.markAsDirty(),w.markAsTouched(),w.updateValueAndValidity()}),_.readAsText(l,"utf8")}prePopulateId(){const t=this.serviceForm.get("service_id"),o=this.serviceForm.getValue("backend_service");t.reset({value:o,disabled:!0})}onSubmit(){var t,o,l,_,M;const w=this,N=this.serviceForm.getRawValue(),V=N.service_type;let X=`service/${Mo.MQ.CREATE}`;this.editing&&(X=`service/${Mo.MQ.EDIT}`);const re={service_type:V,placement:{},unmanaged:N.unmanaged};let oe;if("rgw"===V){const Pe=N.service_id.match(this.RGW_SVC_ID_PATTERN);oe=Pe[1],Pe[3]&&(re.rgw_realm=Pe[3],re.rgw_zone=Pe[4])}else oe=N.service_id;const fe=oe;let ve=V;switch(Er().isString(fe)&&!Er().isEmpty(fe)&&(ve=`${V}.${fe}`,re.service_id=fe),V){case"ingress":re.backend_service=N.backend_service,re.service_id=N.backend_service,Er().isNumber(N.frontend_port)&&N.frontend_port>0&&(re.frontend_port=N.frontend_port),Er().isString(N.virtual_ip)&&!Er().isEmpty(N.virtual_ip)&&(re.virtual_ip=N.virtual_ip.trim()),Er().isNumber(N.monitor_port)&&N.monitor_port>0&&(re.monitor_port=N.monitor_port);break;case"iscsi":re.pool=N.pool;break;case"snmp-gateway":re.credentials={},re.snmp_version=N.snmp_version,re.snmp_destination=N.snmp_destination,"V3"===N.snmp_version?(re.engine_id=N.engine_id,re.auth_protocol=N.auth_protocol,re.credentials.snmp_v3_auth_username=N.snmp_v3_auth_username,re.credentials.snmp_v3_auth_password=N.snmp_v3_auth_password,null!==N.privacy_protocol&&(re.privacy_protocol=N.privacy_protocol,re.credentials.snmp_v3_priv_password=N.snmp_v3_priv_password)):re.credentials.snmp_community=N.snmp_community}if(!N.unmanaged){switch(N.placement){case"hosts":N.hosts.length>0&&(re.placement.hosts=N.hosts);break;case"label":re.placement.label=N.label}switch(Er().isNumber(N.count)&&N.count>0&&(re.placement.count=N.count),V){case"rgw":Er().isNumber(N.rgw_frontend_port)&&N.rgw_frontend_port>0&&(re.rgw_frontend_port=N.rgw_frontend_port),re.ssl=N.ssl,N.ssl&&(re.rgw_frontend_ssl_certificate=null===(t=N.ssl_cert)||void 0===t?void 0:t.trim());break;case"iscsi":Er().isString(N.trusted_ip_list)&&!Er().isEmpty(N.trusted_ip_list)&&(re.trusted_ip_list=N.trusted_ip_list.trim()),Er().isNumber(N.api_port)&&N.api_port>0&&(re.api_port=N.api_port),re.api_user=N.api_user,re.api_password=N.api_password,re.api_secure=N.ssl,N.ssl&&(re.ssl_cert=null===(o=N.ssl_cert)||void 0===o?void 0:o.trim(),re.ssl_key=null===(l=N.ssl_key)||void 0===l?void 0:l.trim());break;case"ingress":re.ssl=N.ssl,N.ssl&&(re.ssl_cert=null===(_=N.ssl_cert)||void 0===_?void 0:_.trim(),re.ssl_key=null===(M=N.ssl_key)||void 0===M?void 0:M.trim()),re.virtual_interface_networks=N.virtual_interface_networks}}this.taskWrapperService.wrapTaskAroundCall({task:new Jl.R(X,{service_name:ve}),call:this.editing?this.cephServiceService.update(re):this.cephServiceService.create(re)}).subscribe({error(){w.serviceForm.setErrors({cdSubmitButton:!0})},complete:()=>{"services"===this.pageURL?this.router.navigate([this.pageURL,{outlets:{modal:null}}]):this.activeModal.close()}})}clearValidations(){const t=this.serviceForm.getValue("snmp_version"),o=this.serviceForm.getValue("privacy_protocol");"V3"===t?this.serviceForm.get("snmp_community").clearValidators():(this.serviceForm.get("engine_id").clearValidators(),this.serviceForm.get("auth_protocol").clearValidators(),this.serviceForm.get("privacy_protocol").clearValidators(),this.serviceForm.get("snmp_v3_auth_username").clearValidators(),this.serviceForm.get("snmp_v3_auth_password").clearValidators()),null===o&&this.serviceForm.get("snmp_v3_priv_password").clearValidators()}}return n.\u0275fac=function(t){return new(t||n)(e.Y36(Mo.p4),e.Y36(Kl),e.Y36(zu.O),e.Y36(bc),e.Y36(Xp.q),e.Y36(Bo.F0),e.Y36(Sc.P),e.Y36(Bo.gz),e.Y36(Dr.Kz))},n.\u0275cmp=e.Xpm({type:n,selectors:[["cd-service-form"]],viewQuery:function(t,o){if(1&t&&e.Gf(Dr.dR,5),2&t){let l;e.iGM(l=e.CRH())&&(o.typeahead=l.first)}},inputs:{hiddenServices:"hiddenServices",editing:"editing",serviceName:"serviceName",serviceType:"serviceType"},features:[e.qOj],decls:41,vars:31,consts:function(){let s,t,o,l,_,M,w,N,V,X,re,oe,fe,ve,Pe,De,Ie,Ae,Y,Et,ft,xt,Ht,yn,It,In,On,Yr,Ir,Hr,Wr,En,Un,Yn,ir,An,Lr,Wi,Mi,Yi,jr,Nn,fn,Vr,xi,Ji,Ho,Ao,Vs,Qs,Ri,uo,bo,Ye,Ct,bt,Vn,Mr,kr,Ni,Zs,Vo,il,_l,zl,Wu,Yf,xl,Zc,gp,Bh,sh,Uh,Vl,Bc,Lp,ji,lr,yi,qi,Po,qo,os,fs,_a,el,gu,tr,ki,us,Gi,ws,ss,eu,El,dl,Ha;return s="" + "\ufffd0\ufffd" + " " + "\ufffd1\ufffd" + "",t="Type",o="-- Select a service type --",l="Unmanaged",_="This field is required.",M="Backend Service",w="Loading...",N="-- No service available --",V="-- Select an existing service --",X="This field is required.",re="Id",oe="Used in the service name which is <service_type.service_id>",fe="This field is required.",ve="This service id is already in use.",Pe="The value does not match the pattern " + "\ufffd#2\ufffd" + "<service_id>[.<realm_name>.<zone_name>]" + "\ufffd/#2\ufffd" + ".",De="MDS service id must start with a letter and contain alphanumeric characters or '.', '-', and '_'",Ie="Placement",Ae="Hosts",Y="Label",Et="Label",ft="This field is required.",xt="Hosts",Ht="Count",yn="Only that number of daemons will be created.",It="The value must be at least 1.",In="The entered value needs to be a number.",On="Port",Yr="The entered value needs to be a number.",Ir="The value must be at least 1.",Hr="The value cannot exceed 65535.",Wr="Pool",En="Loading...",Un="-- No pools available --",Yn="-- Select a pool --",ir="This field is required.",An="Trusted IPs",Lr="Comma separated list of IP addresses.",Wi="Please add the " + "\ufffd#11\ufffd" + "Ceph Manager" + "\ufffd/#11\ufffd" + " IP addresses here, otherwise the iSCSI gateways can't be reached.",Mi="Port",Yi="User",jr="Password",Nn="The entered value needs to be a number.",fn="The value must be at least 1.",Vr="The value cannot exceed 65535.",xi="This field is required.",Ji="This field is required.",Ho="Virtual IP",Ao="The virtual IP address and subnet (in CIDR notation) where the ingress service will be available.",Vs="Frontend Port",Qs="The port used to access the ingress service.",Ri="Monitor Port",uo="The port used by haproxy for load balancer status.",bo="This field is required.",Ye="The entered value needs to be a number.",Ct="The value must be at least 1.",bt="The value cannot exceed 65535.",Vn="This field is required.",Mr="The entered value needs to be a number.",kr="The value must be at least 1.",Ni="The value cannot exceed 65535.",Zs="This field is required.",Vo="CIDR Networks",il="A list of networks to identify which network interface to use for the virtual IP address.",_l="Version",zl="-- Select SNMP version --",Wu="Destination",Yf="Must be of the format hostname:port.",xl="Credentials",Zc="This field is required.",gp="This field is required.",Bh="The value does not match the pattern: " + "\ufffd#2\ufffd" + "hostname:port" + "\ufffd/#2\ufffd" + "",sh="Engine Id",Uh="Unique identifier for the device (in hex).",Vl="This field is required.",Bc="The value does not match the pattern: " + "\ufffd#2\ufffd" + "Must be in hexadecimal and length must be multiple of 2 with min value = 10 amd max value = 64." + "\ufffd/#2\ufffd" + "",Lp="Auth Protocol",ji="-- Select auth protocol --",lr="This field is required.",yi="Privacy Protocol",qi="-- Select privacy protocol --",Po="SNMP Community",qo="This field is required.",os="Username",fs="This field is required.",_a="Password",el="This field is required.",gu="Encryption",tr="This field is required.",ki="SSL",us="Certificate",Gi="The SSL certificate in PEM format.",ws="This field is required.",ss="Invalid SSL certificate.",eu="Private key",El="The SSL private key in PEM format.",dl="This field is required.",Ha="Invalid SSL private key.",[[3,"pageURL","modalRef"],[1,"modal-title"],s,[1,"modal-content"],["novalidate","",3,"formGroup"],["frm","ngForm"],[1,"modal-body"],[1,"form-group","row"],["for","service_type",1,"cd-col-form-label","required"],t,[1,"cd-col-form-input"],["id","service_type","name","service_type","formControlName","service_type",1,"form-select",3,"change"],[3,"ngValue"],o,[3,"value",4,"ngFor","ngForOf"],["class","invalid-feedback",4,"ngIf"],["class","form-group row",4,"ngIf"],[1,"cd-col-form-offset"],[1,"custom-control","custom-checkbox"],["id","unmanaged","type","checkbox","formControlName","unmanaged",1,"custom-control-input"],["for","unmanaged",1,"custom-control-label"],l,[4,"ngIf"],[1,"modal-footer"],[1,"text-right"],[3,"form","submitText","submitActionEvent"],[3,"value"],[1,"invalid-feedback"],_,["for","backend_service",1,"cd-col-form-label",3,"ngClass"],M,["id","backend_service","name","backend_service","formControlName","backend_service",1,"form-select",3,"change"],[3,"ngValue",4,"ngIf"],w,N,V,X,["for","service_id",1,"cd-col-form-label",3,"ngClass"],re,oe,["id","service_id","type","text","formControlName","service_id",1,"form-control"],fe,ve,Pe,De,["for","placement",1,"cd-col-form-label"],Ie,["id","placement","formControlName","placement",1,"form-select"],["value","hosts"],Ae,["value","label"],Y,["for","label",1,"cd-col-form-label"],Et,["id","label","type","text","formControlName","label",1,"form-control",3,"ngbTypeahead","focus","click"],ft,["for","hosts",1,"cd-col-form-label"],xt,["id","hosts",3,"data","options","messages"],["for","count",1,"cd-col-form-label"],Ht,yn,["id","count","type","number","formControlName","count","min","1",1,"form-control"],It,In,["for","rgw_frontend_port",1,"cd-col-form-label"],On,["id","rgw_frontend_port","type","number","formControlName","rgw_frontend_port","min","1","max","65535",1,"form-control"],Yr,Ir,Hr,["for","pool",1,"cd-col-form-label","required"],Wr,["id","pool","name","pool","formControlName","pool",1,"form-select"],En,Un,Yn,ir,["for","trusted_ip_list",1,"cd-col-form-label"],An,Lr,Wi,["id","trusted_ip_list","type","text","formControlName","trusted_ip_list",1,"form-control"],["for","api_port",1,"cd-col-form-label"],Mi,["id","api_port","type","number","formControlName","api_port","min","1","max","65535",1,"form-control"],["for","api_user",1,"cd-col-form-label",3,"ngClass"],Yi,["id","api_user","type","text","formControlName","api_user",1,"form-control"],["for","api_password",1,"cd-col-form-label",3,"ngClass"],jr,[1,"input-group"],["id","api_password","type","password","autocomplete","new-password","formControlName","api_password",1,"form-control"],["type","button","cdPasswordButton","api_password",1,"btn","btn-light"],["source","api_password"],Nn,fn,Vr,xi,Ji,["for","virtual_ip",1,"cd-col-form-label",3,"ngClass"],Ho,Ao,["id","virtual_ip","type","text","formControlName","virtual_ip",1,"form-control"],["for","frontend_port",1,"cd-col-form-label",3,"ngClass"],Vs,Qs,["id","frontend_port","type","number","formControlName","frontend_port","min","1","max","65535",1,"form-control"],["for","monitor_port",1,"cd-col-form-label",3,"ngClass"],Ri,uo,["id","monitor_port","type","number","formControlName","monitor_port","min","1","max","65535",1,"form-control"],bo,Ye,Ct,bt,Vn,Mr,kr,Ni,Zs,["for","virtual_interface_networks",1,"cd-col-form-label"],Vo,il,["id","virtual_interface_networks","type","text","formControlName","virtual_interface_networks",1,"form-control"],["for","snmp_version",1,"cd-col-form-label","required"],_l,["id","snmp_version","name","snmp_version","formControlName","snmp_version",1,"form-select",3,"change"],zl,["for","snmp_destination",1,"cd-col-form-label","required"],Wu,Yf,["id","snmp_destination","type","text","formControlName","snmp_destination",1,"form-control"],xl,Zc,gp,Bh,["for","engine_id",1,"cd-col-form-label","required"],sh,Uh,["id","engine_id","type","text","formControlName","engine_id",1,"form-control"],Vl,Bc,["for","auth_protocol",1,"cd-col-form-label","required"],Lp,["id","auth_protocol","name","auth_protocol","formControlName","auth_protocol",1,"form-select"],ji,lr,["for","privacy_protocol",1,"cd-col-form-label"],yi,["id","privacy_protocol","name","privacy_protocol","formControlName","privacy_protocol",1,"form-select"],qi,["for","snmp_community",1,"cd-col-form-label","required"],Po,["id","snmp_community","type","text","formControlName","snmp_community",1,"form-control"],qo,["for","snmp_v3_auth_username",1,"cd-col-form-label","required"],os,["id","snmp_v3_auth_username","type","text","formControlName","snmp_v3_auth_username",1,"form-control"],fs,["for","snmp_v3_auth_password",1,"cd-col-form-label","required"],_a,["id","snmp_v3_auth_password","type","password","formControlName","snmp_v3_auth_password",1,"form-control"],el,["for","snmp_v3_priv_password",1,"cd-col-form-label","required"],gu,["id","snmp_v3_priv_password","type","password","formControlName","snmp_v3_priv_password",1,"form-control"],tr,["id","ssl","type","checkbox","formControlName","ssl",1,"custom-control-input"],["for","ssl",1,"custom-control-label"],ki,["for","ssl_cert",1,"cd-col-form-label"],us,Gi,["id","ssl_cert","formControlName","ssl_cert","rows","5",1,"form-control","resize-vertical","text-monospace","text-pre"],["type","file",3,"change"],ws,ss,["for","ssl_key",1,"cd-col-form-label"],eu,El,["id","ssl_key","formControlName","ssl_key","rows","5",1,"form-control","resize-vertical","text-monospace","text-pre"],dl,Ha]},template:function(t,o){if(1&t&&(e.TgZ(0,"cd-modal",0)(1,"span",1),e.SDv(2,2),e.ALo(3,"titlecase"),e.ALo(4,"upperFirst"),e.qZA(),e.ynx(5,3),e.TgZ(6,"form",4,5)(8,"div",6)(9,"div",7)(10,"label",8),e.SDv(11,9),e.qZA(),e.TgZ(12,"div",10)(13,"select",11),e.NdJ("change",function(_){return o.getServiceIds(_.target.value)}),e.TgZ(14,"option",12),e.SDv(15,13),e.qZA(),e.YNc(16,mg,2,2,"option",14),e.qZA(),e.YNc(17,pp,2,0,"span",15),e.qZA()(),e.YNc(18,b,10,9,"div",16),e.YNc(19,wr,12,8,"div",16),e.TgZ(20,"div",7)(21,"div",17)(22,"div",18),e._UZ(23,"input",19),e.TgZ(24,"label",20),e.SDv(25,21),e.qZA()()()(),e.YNc(26,ci,9,0,"div",16),e.YNc(27,ts,6,2,"div",16),e.YNc(28,Do,5,3,"div",16),e.YNc(29,ia,10,2,"div",16),e.YNc(30,ye,9,3,"ng-container",22),e.YNc(31,ti,10,5,"div",16),e.YNc(32,zr,37,13,"ng-container",22),e.YNc(33,og,38,22,"ng-container",22),e.YNc(34,Xc,31,13,"ng-container",22),e.YNc(35,A_,9,3,"ng-container",22),e.qZA(),e.TgZ(36,"div",23)(37,"div",24)(38,"cd-form-button-panel",25),e.NdJ("submitActionEvent",function(){return o.onSubmit()}),e.ALo(39,"titlecase"),e.ALo(40,"upperFirst"),e.qZA()()()(),e.BQk(),e.qZA()),2&t){const l=e.MAs(7);e.Q6J("pageURL",o.pageURL)("modalRef",o.activeModal),e.xp6(4),e.pQV(e.lcZ(3,22,o.action))(e.lcZ(4,24,o.resource)),e.QtT(2),e.xp6(2),e.Q6J("formGroup",o.serviceForm),e.xp6(8),e.Q6J("ngValue",null),e.xp6(2),e.Q6J("ngForOf",o.serviceTypes),e.xp6(1),e.Q6J("ngIf",o.serviceForm.showError("service_type",l,"required")),e.xp6(1),e.Q6J("ngIf","ingress"===o.serviceForm.controls.service_type.value),e.xp6(1),e.Q6J("ngIf","snmp-gateway"!==o.serviceForm.controls.service_type.value),e.xp6(7),e.Q6J("ngIf",!o.serviceForm.controls.unmanaged.value),e.xp6(1),e.Q6J("ngIf",!o.serviceForm.controls.unmanaged.value&&"label"===o.serviceForm.controls.placement.value),e.xp6(1),e.Q6J("ngIf",!o.serviceForm.controls.unmanaged.value&&"hosts"===o.serviceForm.controls.placement.value),e.xp6(1),e.Q6J("ngIf",!o.serviceForm.controls.unmanaged.value),e.xp6(1),e.Q6J("ngIf",!o.serviceForm.controls.unmanaged.value&&"rgw"===o.serviceForm.controls.service_type.value),e.xp6(1),e.Q6J("ngIf","iscsi"===o.serviceForm.controls.service_type.value),e.xp6(1),e.Q6J("ngIf",!o.serviceForm.controls.unmanaged.value&&"iscsi"===o.serviceForm.controls.service_type.value),e.xp6(1),e.Q6J("ngIf","ingress"===o.serviceForm.controls.service_type.value),e.xp6(1),e.Q6J("ngIf","snmp-gateway"===o.serviceForm.controls.service_type.value),e.xp6(1),e.Q6J("ngIf",!o.serviceForm.controls.unmanaged.value&&e.DdM(30,Eg).includes(o.serviceForm.controls.service_type.value)),e.xp6(3),e.Q6J("form",o.serviceForm)("submitText",e.lcZ(39,26,o.action)+" "+e.lcZ(40,28,o.resource))}},directives:[Fe.z,_n._Y,_n.JL,Ma.V,_n.sg,al.P,_e.o,_n.EJ,_n.JJ,_n.u,_n.YN,_n.Kr,p.sg,p.O5,p.mk,Oe.S,_n.Fj,Il.b,_n.Wl,Dr.dR,ht.m,_n.wV,_n.qQ,_n.Fd,pd.C,u_.s,Cl.p],pipes:[p.rS,gt.m],styles:[""]}),n})();function Y_(n,s){if(1&n&&(e.ynx(0),e._UZ(1,"cd-service-daemon-list",1),e.BQk()),2&n){const t=e.oxw();e.xp6(1),e.Q6J("serviceName",t.selection.service_name)}}let D_=(()=>{class n{}return n.\u0275fac=function(t){return new(t||n)},n.\u0275cmp=e.Xpm({type:n,selectors:[["cd-service-details"]],inputs:{permissions:"permissions",selection:"selection"},decls:1,vars:1,consts:[[4,"ngIf"],[3,"serviceName"]],template:function(t,o){1&t&&e.YNc(0,Y_,2,1,"ng-container",0),2&t&&e.Q6J("ngIf",o.selection)},directives:[p.O5,Yp],styles:[""]}),n})();function Sm(n,s){1&n&&e._UZ(0,"cd-orchestrator-doc-panel")}function Kg(n,s){if(1&n){const t=e.EpF();e.ynx(0),e.TgZ(1,"cd-table",2),e.NdJ("fetchData",function(l){return e.CHM(t),e.oxw().getServices(l)})("setExpandedRow",function(l){return e.CHM(t),e.oxw().setExpandedRow(l)})("updateSelection",function(l){return e.CHM(t),e.oxw().updateSelection(l)}),e._UZ(2,"cd-table-actions",3)(3,"cd-service-details",4),e.qZA(),e.BQk()}if(2&n){const t=e.oxw();e.xp6(1),e.Q6J("data",t.services)("columns",t.columns)("autoReload",5e3)("hasDetails",t.hasDetails)("serverSide",!0)("count",t.count),e.xp6(1),e.Q6J("permission",t.permissions.hosts)("selection",t.selection)("tableActions",t.tableActions),e.xp6(1),e.Q6J("permissions",t.permissions)("selection",t.expandedRow)}}const bg="services";let Sg=(()=>{class n extends Mt.o{constructor(t,o,l,_,M,w,N,V){super(),this.actionLabels=t,this.authStorageService=o,this.modalService=l,this.orchService=_,this.cephServiceService=M,this.relativeDatePipe=w,this.taskWrapperService=N,this.router=V,this.hiddenColumns=[],this.hiddenServices=[],this.hasDetails=!0,this.routedModal=!0,this.showDocPanel=!1,this.count=0,this.actionOrchFeatures={create:[x.SERVICE_CREATE],update:[x.SERVICE_EDIT],delete:[x.SERVICE_DELETE]},this.columns=[],this.services=[],this.isLoadingServices=!1,this.selection=new sn.r,this.permissions=this.authStorageService.getPermissions(),this.tableActions=[{permission:"create",icon:No.P.add,click:()=>this.openModal(),name:this.actionLabels.CREATE,canBePrimary:X=>!X.hasSelection,disable:X=>this.getDisable("create",X)},{permission:"update",icon:No.P.edit,click:()=>this.openModal(!0),name:this.actionLabels.EDIT,disable:X=>this.getDisable("update",X)},{permission:"delete",icon:No.P.destroy,click:()=>this.deleteAction(),name:this.actionLabels.DELETE,disable:X=>this.getDisable("delete",X)}]}openModal(t=!1){var o,l,_;if(this.routedModal)this.router.navigate(t?[bg,{outlets:{modal:[Mo.MQ.EDIT,this.selection.first().service_type,this.selection.first().service_name]}}]:[bg,{outlets:{modal:[Mo.MQ.CREATE]}}]);else{let M={};M=t?{serviceName:null===(o=this.selection.first())||void 0===o?void 0:o.service_name,serviceType:null===(_=null===(l=this.selection)||void 0===l?void 0:l.first())||void 0===_?void 0:_.service_type,hiddenServices:this.hiddenServices,editing:t}:{hiddenServices:this.hiddenServices,editing:t},this.bsModalRef=this.modalService.show(xp,M,{size:"lg"})}}ngOnInit(){const t=[{name:"Service",prop:"service_name",flexGrow:1},{name:"Placement",prop:"",pipe:new ep,flexGrow:2},{name:"Running",prop:"status.running",flexGrow:1},{name:"Size",prop:"status.size",flexGrow:1},{name:"Last Refreshed",prop:"status.last_refresh",pipe:this.relativeDatePipe,flexGrow:1}];this.columns=t.filter(o=>!this.hiddenColumns.includes(o.prop)),this.orchService.status().subscribe(o=>{this.orchStatus=o,this.showDocPanel=!o.available})}ngOnChanges(){var t;(null===(t=this.orchStatus)||void 0===t?void 0:t.available)&&(this.services=[],this.table.reloadData())}getDisable(t,o){var l;return"delete"===t&&!(null==o?void 0:o.hasSingleSelection)||"update"===t&&["osd","container"].indexOf(null===(l=this.selection.first())||void 0===l?void 0:l.service_type)>=0||this.orchService.getTableActionDisableDesc(this.orchStatus,this.actionOrchFeatures[t])}getServices(t){if(this.isLoadingServices)return;this.isLoadingServices=!0;const o=this.cephServiceService.list(t.toParams());o.observable.subscribe(l=>{this.services=l,this.count=o.count,this.services=this.services.filter(_=>!this.hiddenServices.includes(_.service_name)),this.isLoadingServices=!1},()=>{this.isLoadingServices=!1,this.services=[],t.error()})}updateSelection(t){this.selection=t}deleteAction(){const t=this.selection.first();this.modalService.show(Oc.M,{itemDescription:"Service",itemNames:[t.service_name],actionDescription:"delete",submitActionObservable:()=>this.taskWrapperService.wrapTaskAroundCall({task:new Jl.R(`service/${Mo.MQ.DELETE}`,{service_name:t.service_name}),call:this.cephServiceService.delete(t.service_name)}).pipe((0,C_.g)(5e3))})}}return n.\u0275fac=function(t){return new(t||n)(e.Y36(Mo.p4),e.Y36(zi.j),e.Y36(ru.Z),e.Y36(h),e.Y36(Kl),e.Y36(Ud.h),e.Y36(Sc.P),e.Y36(Bo.F0))},n.\u0275cmp=e.Xpm({type:n,selectors:[["cd-services"]],viewQuery:function(t,o){if(1&t&&e.Gf(_r.a,7),2&t){let l;e.iGM(l=e.CRH())&&(o.table=l.first)}},inputs:{hostname:"hostname",hiddenColumns:"hiddenColumns",hiddenServices:"hiddenServices",hasDetails:"hasDetails",routedModal:"routedModal"},features:[e._Bn([{provide:Q.F,useValue:new Q.F(bg)}]),e.qOj,e.TTD],decls:3,vars:2,consts:[[4,"ngIf"],["name","modal"],["identifier","service_name","forceIdentifier","true","columnMode","flex","selectionType","single",3,"data","columns","autoReload","hasDetails","serverSide","count","fetchData","setExpandedRow","updateSelection"],[1,"table-actions",3,"permission","selection","tableActions"],["cdTableDetail","",3,"permissions","selection"]],template:function(t,o){1&t&&(e.YNc(0,Sm,1,0,"cd-orchestrator-doc-panel",0),e.YNc(1,Kg,4,11,"ng-container",0),e._UZ(2,"router-outlet",1)),2&t&&(e.Q6J("ngIf",o.showDocPanel),e.xp6(1),e.Q6J("ngIf",null==o.orchStatus?null:o.orchStatus.available))},directives:[p.O5,ch,_r.a,bu.K,D_,Bo.lC],styles:[""]}),n})();const Xg=function(){return["services","status"]};let j_=(()=>{class n{constructor(t,o,l,_,M){this.wizardStepsService=t,this.cephServiceService=o,this.dimlessBinary=l,this.hostService=_,this.osdService=M,this.hosts=[],this.totalCapacity=0,this.services=[],this.totalCPUs=0,this.totalMemory=0}ngOnInit(){var t,o,l;let _=0,M=0,w=0,N=0,V=0,X=0;this.hostService.list("true").subscribe(re=>{this.hosts=re,this.hostsCount=this.hosts.length,Er().forEach(this.hosts,oe=>{this.totalCPUs=this.totalCPUs+oe.cpu_count,this.totalMemory=this.totalMemory+1024*oe.memory_total_kb}),this.totalMemory=this.dimlessBinary.transform(this.totalMemory)}),this.osdService.osdDevices.data&&(_=null===(t=this.osdService.osdDevices.data)||void 0===t?void 0:t.length,M=this.osdService.osdDevices.data.capacity),this.osdService.osdDevices.wal&&(w=null===(o=this.osdService.osdDevices.wal)||void 0===o?void 0:o.length,N=this.osdService.osdDevices.wal.capacity),this.osdService.osdDevices.db&&(V=null===(l=this.osdService.osdDevices.db)||void 0===l?void 0:l.length,X=this.osdService.osdDevices.db.capacity),this.totalDevices=_+w+V,this.osdService.osdDevices.totalDevices=this.totalDevices,this.totalCapacity=M+N+X}}return n.\u0275fac=function(t){return new(t||n)(e.Y36(fu),e.Y36(Kl),e.Y36(Ar.$),e.Y36(bc),e.Y36(cc))},n.\u0275cmp=e.Xpm({type:n,selectors:[["cd-create-cluster-review"]],decls:43,vars:12,consts:function(){let s,t,o,l,_,M,w,N;return s="Cluster Resources",t="Hosts",o="Storage Capacity",l="Number of devices",_="Raw capacity",M="CPUs",w="Memory",N="Host Details",[[1,"row"],[1,"col-lg-3"],[1,"cd-header"],s,[1,"table","table-striped"],[1,"bold"],t,o,l,_,[1,"pt-5"],M,w,[1,"col-lg-9"],N,[3,"hiddenColumns","hideToolHeader","hasTableDetails","showGeneralActionsOnly"]]},template:function(t,o){1&t&&(e.TgZ(0,"div",0)(1,"div",1)(2,"fieldset")(3,"legend",2),e.SDv(4,3),e.qZA(),e.TgZ(5,"table",4)(6,"tr")(7,"td",5),e.SDv(8,6),e.qZA(),e.TgZ(9,"td"),e._uU(10),e.qZA()(),e.TgZ(11,"tr")(12,"td")(13,"dl")(14,"dt")(15,"p"),e.SDv(16,7),e.qZA()(),e.TgZ(17,"dd")(18,"p"),e.SDv(19,8),e.qZA()(),e.TgZ(20,"dd")(21,"p"),e.SDv(22,9),e.qZA()()()(),e.TgZ(23,"td",10)(24,"p"),e._uU(25),e.qZA(),e.TgZ(26,"p"),e._uU(27),e.ALo(28,"dimlessBinary"),e.qZA()()(),e.TgZ(29,"tr")(30,"td",5),e.SDv(31,11),e.qZA(),e.TgZ(32,"td"),e._uU(33),e.qZA()(),e.TgZ(34,"tr")(35,"td",5),e.SDv(36,12),e.qZA(),e.TgZ(37,"td"),e._uU(38),e.qZA()()()()(),e.TgZ(39,"div",13)(40,"legend",2),e.SDv(41,14),e.qZA(),e._UZ(42,"cd-hosts",15),e.qZA()()),2&t&&(e.xp6(10),e.Oqu(o.hostsCount),e.xp6(15),e.Oqu(o.totalDevices),e.xp6(2),e.hij(" ",e.lcZ(28,9,o.totalCapacity),""),e.xp6(6),e.Oqu(o.totalCPUs),e.xp6(5),e.Oqu(o.totalMemory),e.xp6(4),e.Q6J("hiddenColumns",e.DdM(11,Xg))("hideToolHeader",!0)("hasTableDetails",!1)("showGeneralActionsOnly",!0))},directives:[If],pipes:[Ar.$],styles:["cd-hosts[_ngcontent-%COMP%]     .nav{display:none}"]}),n})();var qp=i(13472);const w_=["skipConfirmTpl"];function x_(n,s){if(1&n){const t=e.EpF();e.TgZ(0,"div",3)(1,"div",4)(2,"div",5),e._UZ(3,"img",6),e.TgZ(4,"h3",7),e.SDv(5,8),e.qZA(),e.TgZ(6,"div",9)(7,"h4",10),e.SDv(8,11),e.qZA(),e.TgZ(9,"div",10)(10,"button",12),e.NdJ("click",function(){return e.CHM(t),e.oxw().createCluster()}),e.SDv(11,13),e.qZA(),e.TgZ(12,"button",14),e.NdJ("click",function(){return e.CHM(t),e.oxw().skipClusterCreation()}),e.SDv(13,15),e.qZA()()()()()()}if(2&n){const t=e.oxw();e.xp6(3),e.Q6J("src",t.projectConstants.cephLogo,e.LSH),e.xp6(2),e.pQV(t.projectConstants.projectName),e.QtT(5)}}const Tm=function(){return["services"]};function qg(n,s){1&n&&(e.TgZ(0,"div",28)(1,"h4",29),e.SDv(2,30),e.qZA(),e._UZ(3,"br")(4,"cd-hosts",31),e.qZA()),2&n&&(e.xp6(4),e.Q6J("hiddenColumns",e.DdM(4,Tm))("hideMaintenance",!0)("hasTableDetails",!1)("showGeneralActionsOnly",!0))}function em(n,s){if(1&n){const t=e.EpF();e.TgZ(0,"div",28)(1,"h4",29),e.SDv(2,32),e.qZA(),e.TgZ(3,"div",33)(4,"cd-osd-form",34),e.NdJ("emitDriveGroup",function(l){return e.CHM(t),e.oxw(2).setDriveGroup(l)})("emitDeploymentOption",function(l){return e.CHM(t),e.oxw(2).setDeploymentOptions(l)})("emitMode",function(l){return e.CHM(t),e.oxw(2).setDeploymentMode(l)}),e.qZA()()()}2&n&&(e.xp6(4),e.Q6J("hideTitle",!0)("hideSubmitBtn",!0))}const Cm=function(){return["mon","mgr","crash","agent"]},tm=function(){return["status.running","status.size","status.last_refresh"]};function t1(n,s){1&n&&(e.TgZ(0,"div",28)(1,"h4",29),e.SDv(2,35),e.qZA(),e._UZ(3,"br")(4,"cd-services",36),e.qZA()),2&n&&(e.xp6(4),e.Q6J("hasDetails",!1)("hiddenServices",e.DdM(4,Cm))("hiddenColumns",e.DdM(5,tm))("routedModal",!1))}function av(n,s){1&n&&(e.TgZ(0,"div",28),e._UZ(1,"cd-create-cluster-review"),e.qZA())}function $f(n,s){if(1&n){const t=e.EpF();e.TgZ(0,"div",16)(1,"div",17),e.SDv(2,18),e.qZA(),e.TgZ(3,"div",19),e._UZ(4,"cd-wizard",20),e.TgZ(5,"div",21),e.ynx(6,22),e.YNc(7,qg,5,5,"div",23),e.YNc(8,em,5,2,"div",23),e.YNc(9,t1,5,6,"div",23),e.YNc(10,av,2,0,"div",23),e.BQk(),e.qZA()(),e.TgZ(11,"div",24)(12,"button",25),e.NdJ("click",function(){return e.CHM(t),e.oxw().onNextStep()}),e.SDv(13,26),e.qZA(),e.TgZ(14,"cd-back-button",27),e.NdJ("backAction",function(){return e.CHM(t),e.oxw().onPreviousStep()}),e.qZA()()()}if(2&n){const t=e.oxw();e.xp6(4),e.Q6J("stepsTitle",t.stepTitles),e.xp6(2),e.Q6J("ngSwitch",null==t.currentStep?null:t.currentStep.stepIndex),e.xp6(1),e.Q6J("ngSwitchCase","1"),e.xp6(1),e.Q6J("ngSwitchCase","2"),e.xp6(1),e.Q6J("ngSwitchCase","3"),e.xp6(1),e.Q6J("ngSwitchCase","4"),e.xp6(3),e.pQV(t.showSubmitButtonLabel()),e.QtT(13),e.xp6(1),e.Q6J("name",t.showCancelButtonLabel())}}function lv(n,s){1&n&&(e.TgZ(0,"span"),e.tHW(1,37),e._UZ(2,"strong"),e.N_p(),e.qZA(),e.TgZ(3,"div",38),e.SDv(4,39),e.qZA())}let uv=(()=>{class n{constructor(t,o,l,_,M,w,N,V,X,re){this.authStorageService=t,this.wizardStepsService=o,this.router=l,this.hostService=_,this.notificationService=M,this.actionLabels=w,this.clusterService=N,this.modalService=V,this.taskWrapper=X,this.osdService=re,this.projectConstants=Mo.$x,this.stepTitles=["Add Hosts","Create OSDs","Create Services","Review"],this.startClusterCreation=!1,this.observables=[],this.driveGroup=new dc,this.driveGroups=[],this.selectedOption={},this.simpleDeployment=!0,this.submitAction=new e.vpe,this.permissions=this.authStorageService.getPermissions(),this.currentStepSub=this.wizardStepsService.getCurrentStep().subscribe(oe=>{this.currentStep=oe}),this.currentStep.stepIndex=1}ngOnInit(){this.osdService.getDeploymentOptions().subscribe(t=>{this.deploymentOption=t,this.selectedOption={option:t.recommended_option}})}createCluster(){this.startClusterCreation=!0}skipClusterCreation(){const t={titleText:"Warning",buttonText:"Continue",warning:!0,bodyTpl:this.skipConfirmTpl,showSubmit:!0,onSubmit:()=>{this.clusterService.updateStatus("POST_INSTALLED").subscribe({error:()=>this.modalRef.close(),complete:()=>{this.notificationService.show(Sa.k.info,"Cluster expansion skipped by user"),this.router.navigate(["/dashboard"]),this.modalRef.close()}})}};this.modalRef=this.modalService.show(od.Y,t)}onSubmit(){var t;if(this.hostService.list("false").subscribe(o=>{o.forEach(l=>{const _=l.labels.indexOf("_no_schedule",0);_>-1&&(l.labels.splice(_,1),this.observables.push(this.hostService.update(l.hostname,!0,l.labels)))}),(0,Pu.D)(this.observables).pipe((0,ad.x)(()=>this.clusterService.updateStatus("POST_INSTALLED").subscribe(()=>{this.notificationService.show(Sa.k.success,"Cluster expansion was successful"),this.router.navigate(["/dashboard"])}))).subscribe({error:l=>l.preventDefault()})}),this.driveGroup){const o=this.authStorageService.getUsername();this.driveGroup.setName(`dashboard-${o}-${Er().now()}`),this.driveGroups.push(this.driveGroup.spec)}if(this.simpleDeployment){const o=null===(t=this.deploymentOption)||void 0===t?void 0:t.options[this.selectedOption.option].title,l="" + o + " deployment";this.taskWrapper.wrapTaskAroundCall({task:new Jl.R("osd/"+Mo.MQ.CREATE,{tracking_id:l}),call:this.osdService.create([this.selectedOption],l,"predefined")}).subscribe({error:_=>_.preventDefault(),complete:()=>{this.submitAction.emit()}})}else if(this.osdService.osdDevices.totalDevices>0){this.driveGroup.setFeature("encrypted",this.selectedOption.encrypted);const o=Er().join(Er().map(this.driveGroups,"service_id"),", ");this.taskWrapper.wrapTaskAroundCall({task:new Jl.R("osd/"+Mo.MQ.CREATE,{tracking_id:o}),call:this.osdService.create(this.driveGroups,o)}).subscribe({error:l=>l.preventDefault(),complete:()=>{this.submitAction.emit(),this.osdService.osdDevices=[]}})}}setDriveGroup(t){this.driveGroup=t}setDeploymentOptions(t){this.selectedOption=t}setDeploymentMode(t){this.simpleDeployment=t}onNextStep(){this.wizardStepsService.isLastStep()?this.onSubmit():(this.wizardStepsService.getCurrentStep().subscribe(t=>{this.currentStep=t}),this.wizardStepsService.moveToNextStep())}onPreviousStep(){this.wizardStepsService.isFirstStep()?this.router.navigate(["/dashboard"]):this.wizardStepsService.moveToPreviousStep()}showSubmitButtonLabel(){return this.wizardStepsService.isLastStep()?"Expand Cluster":this.actionLabels.NEXT}showCancelButtonLabel(){return this.wizardStepsService.isFirstStep()?this.actionLabels.CANCEL:this.actionLabels.BACK}ngOnDestroy(){this.currentStepSub.unsubscribe()}}return n.\u0275fac=function(t){return new(t||n)(e.Y36(zi.j),e.Y36(fu),e.Y36(Bo.F0),e.Y36(bc),e.Y36(Sl.g),e.Y36(Mo.p4),e.Y36(Zd),e.Y36(ru.Z),e.Y36(Sc.P),e.Y36(cc))},n.\u0275cmp=e.Xpm({type:n,selectors:[["cd-create-cluster"]],viewQuery:function(t,o){if(1&t&&e.Gf(w_,7),2&t){let l;e.iGM(l=e.CRH())&&(o.skipConfirmTpl=l.first)}},outputs:{submitAction:"submitAction"},decls:4,vars:2,consts:function(){let s,t,o,l,_,M,w,N,V,X,re;return s="Welcome to " + "\ufffd0\ufffd" + "",t="Please expand your cluster first",o="Expand Cluster",l="Skip",_="Expand Cluster",M="" + "\ufffd0\ufffd" + "",w="Add Hosts",N="Create OSDs",V="Create Services",X="You are about to skip the cluster expansion process. You\u2019ll need to " + "\ufffd#2\ufffd" + "navigate through the menu to add hosts and services." + "\ufffd/#2\ufffd" + "",re="Are you sure you want to continue?",[["class","container h-75",4,"ngIf"],["class","card",4,"ngIf"],["skipConfirmTpl",""],[1,"container","h-75"],[1,"row","h-100","justify-content-center","align-items-center"],[1,"blank-page"],["alt","Ceph",1,"img-fluid","mx-auto","d-block",3,"src"],[1,"text-center","m-2"],s,[1,"m-4"],[1,"text-center"],t,["name","expand-cluster","aria-label","Expand Cluster",1,"btn","btn-accent","m-2",3,"click"],o,["name","skip-cluster-creation","aria-label","Skip",1,"btn","btn-light",3,"click"],l,[1,"card"],[1,"card-header"],_,[1,"container-fluid"],[3,"stepsTitle"],[1,"card-body","vertical-line"],[3,"ngSwitch"],["class","ms-5",4,"ngSwitchCase"],[1,"card-footer"],["aria-label","Next",1,"btn","btn-accent","m-2","float-end",3,"click"],M,["aria-label","Close",1,"m-2","float-end",3,"name","backAction"],[1,"ms-5"],[1,"title"],w,[3,"hiddenColumns","hideMaintenance","hasTableDetails","showGeneralActionsOnly"],N,[1,"alignForm"],[3,"hideTitle","hideSubmitBtn","emitDriveGroup","emitDeploymentOption","emitMode"],V,[3,"hasDetails","hiddenServices","hiddenColumns","routedModal"],X,[1,"mt-4"],re]},template:function(t,o){1&t&&(e.YNc(0,x_,14,2,"div",0),e.YNc(1,$f,15,8,"div",1),e.YNc(2,lv,5,0,"ng-template",null,2,e.W1O)),2&t&&(e.Q6J("ngIf",!o.startClusterCreation),e.xp6(1),e.Q6J("ngIf",o.startClusterCreation))},directives:[p.O5,_e.o,jc,p.RF,p.n9,If,Qp,Sg,j_,qp.W],styles:[".container-fluid[_ngcontent-%COMP%]{align-items:flex-start;display:flex;padding-left:0;width:100%}cd-hosts[_ngcontent-%COMP%]     .nav{display:none}cd-osd-form[_ngcontent-%COMP%]     .card{border:0}cd-osd-form[_ngcontent-%COMP%]     .accordion{margin-left:-1.5rem}"]}),n})();var I=i(83608),Z=i(36848);const H=["tree"],Se=function(n,s,t){return[n,s,t]};function it(n,s){if(1&n&&e._UZ(0,"i",12),2&n){const t=e.oxw();e.Q6J("ngClass",e.kEZ(1,Se,t.icons.large,t.icons.spinner,t.icons.spin))}}const Ft=function(){return["in","up"]},Kn=function(){return["down","out","destroyed"]},Cr=function(n,s){return{"badge-success":n,"badge-danger":s}};function ai(n,s){if(1&n&&(e.TgZ(0,"span",15),e._uU(1),e.qZA()),2&n){const t=e.oxw().$implicit;e.Q6J("ngClass",e.WLB(4,Cr,e.DdM(2,Ft).includes(t.data.status),e.DdM(3,Kn).includes(t.data.status))),e.xp6(1),e.hij(" ",t.data.status," ")}}const ns=function(n){return{"type-osd":n}};function Jo(n,s){if(1&n&&(e.YNc(0,ai,2,7,"span",13),e.TgZ(1,"span"),e._uU(2,"\xa0"),e.qZA(),e._UZ(3,"span",14)),2&n){const t=s.$implicit;e.Q6J("ngIf",t.data.status),e.xp6(3),e.Q6J("ngClass",e.VKq(3,ns,"osd"===t.data.type))("innerHTML",t.data.name,e.oJD)}}function Ds(n,s){if(1&n&&(e.TgZ(0,"div",16)(1,"legend"),e._uU(2),e.qZA(),e._UZ(3,"cd-table-key-value",17),e.qZA()),2&n){const t=e.oxw();e.xp6(2),e.Oqu(t.metadataTitle),e.xp6(1),e.Q6J("data",t.metadata)}}let hl=(()=>{class n{constructor(t,o){this.crushRuleService=t,this.timerService=o,this.sub=new fc.w,this.icons=No.P,this.loadingIndicator=!0,this.nodes=[],this.treeOptions={useVirtualScroll:!0,nodeHeight:22,actionMapping:{mouse:{click:this.onNodeSelected.bind(this)}}},this.metadataKeyMap={}}ngOnInit(){this.sub=this.timerService.get(()=>this.crushRuleService.getInfo(),5e3).subscribe(t=>{this.loadingIndicator=!1,this.nodes=this.abstractTreeData(t)})}ngOnDestroy(){this.sub.unsubscribe()}abstractTreeData(t){const o=t.nodes||[],l=t.roots||[],_={};if(0===o.length)return[{name:"No nodes!"}];const M=[];return o.reverse().forEach(N=>{l.includes(N.id)&&M.push(N.id),_[N.id]=this.generateTreeLeaf(N,_)}),M.map(N=>_[N])}generateTreeLeaf(t,o){const l=t.id;this.metadataKeyMap[l]=t;const w=[],N={name:t.name+" ("+t.type+")",status:t.status,cdId:l,type:t.type};return t.children&&(t.children.sort().forEach(V=>{w.push(o[V])}),N.children=w),N}onNodeSelected(t,o){if(pa.iM.ACTIVATE(t,o,!0),void 0!==o.data.cdId){const l=this.metadataKeyMap[o.data.cdId],{name:_,type:M}=l,N=(0,j._T)(l,["name","type","status"]);this.metadata=N,this.metadataTitle=_+" ("+M+")"}else delete this.metadata,delete this.metadataTitle}onUpdateData(){this.tree.treeModel.expandAll()}}return n.\u0275fac=function(t){return new(t||n)(e.Y36(I.H),e.Y36(Z.f))},n.\u0275cmp=e.Xpm({type:n,selectors:[["cd-crushmap"]],viewQuery:function(t,o){if(1&t&&e.Gf(H,5),2&t){let l;e.iGM(l=e.CRH())&&(o.tree=l.first)}},decls:14,vars:4,consts:function(){let s;return s="CRUSH map viewer",[[1,"row"],[1,"col-sm-12","col-lg-12"],[1,"card"],[1,"card-header"],s,[1,"card-body"],[1,"col-sm-6","col-lg-6","tree-container"],[3,"ngClass",4,"ngIf"],[3,"nodes","options","updateData"],["tree",""],["treeNodeTemplate",""],["class","col-sm-6 col-lg-6 metadata",4,"ngIf"],[3,"ngClass"],["class","badge",3,"ngClass",4,"ngIf"],[1,"node-name",3,"ngClass","innerHTML"],[1,"badge",3,"ngClass"],[1,"col-sm-6","col-lg-6","metadata"],[3,"data"]]},template:function(t,o){1&t&&(e.TgZ(0,"div",0)(1,"div",1)(2,"div",2)(3,"div",3),e.SDv(4,4),e.qZA(),e.TgZ(5,"div",5)(6,"div",0)(7,"div",6),e.YNc(8,it,1,5,"i",7),e.TgZ(9,"tree-root",8,9),e.NdJ("updateData",function(){return o.onUpdateData()}),e.YNc(11,Jo,4,5,"ng-template",null,10,e.W1O),e.qZA()(),e.YNc(13,Ds,4,2,"div",11),e.qZA()()()()()),2&t&&(e.xp6(8),e.Q6J("ngIf",o.loadingIndicator),e.xp6(1),e.Q6J("nodes",o.nodes)("options",o.treeOptions),e.xp6(4),e.Q6J("ngIf",o.metadata))},directives:[p.O5,p.mk,pa.qr,fo.b],styles:[".tree-container[_ngcontent-%COMP%]{height:calc(100vh - 200px)}"]}),n})(),ou=(()=>{class n{constructor(t){this.http=t}getLogs(){return this.http.get("api/logs/all")}validateDashboardUrl(t){return this.http.get(`api/grafana/validation/${t}`)}}return n.\u0275fac=function(t){return new(t||n)(e.LFG(y.eN))},n.\u0275prov=e.Yz7({token:n,factory:n.\u0275fac,providedIn:"root"}),n})();var Ql=i(49457);let Au=(()=>{class n{download(t,o){(0,Ql.saveAs)(new Blob([t]),o)}}return n.\u0275fac=function(t){return new(t||n)},n.\u0275prov=e.Yz7({token:n,factory:n.\u0275fac,providedIn:"root"}),n})();const qc=function(n){return[n]};function sf(n,s){if(1&n){const t=e.EpF();e.TgZ(0,"button",5),e.NdJ("click",function(){return e.CHM(t),e.oxw().download("json")}),e._UZ(1,"i",2),e.TgZ(2,"span"),e._uU(3,"JSON"),e.qZA()()}if(2&n){const t=e.oxw();e.xp6(1),e.Q6J("ngClass",e.VKq(1,qc,t.icons.json))}}function hd(n,s){if(1&n){const t=e.EpF();e.TgZ(0,"button",5),e.NdJ("click",function(){return e.CHM(t),e.oxw().download()}),e._UZ(1,"i",2),e.TgZ(2,"span"),e._uU(3,"Text"),e.qZA()()}if(2&n){const t=e.oxw();e.xp6(1),e.Q6J("ngClass",e.VKq(1,qc,t.icons.text))}}let Ph=(()=>{class n{constructor(t){this.textToDownloadService=t,this.title="Download",this.icons=No.P}download(t){this.fileName=`${this.fileName}_${(new Date).toLocaleDateString()}`,"json"===t?this.textToDownloadService.download(JSON.stringify(this.objectItem,null,2),`${this.fileName}.json`):this.textToDownloadService.download(this.textItem,`${this.fileName}.txt`)}}return n.\u0275fac=function(t){return new(t||n)(e.Y36(Au))},n.\u0275cmp=e.Xpm({type:n,selectors:[["cd-download-button"]],inputs:{objectItem:"objectItem",textItem:"textItem",fileName:"fileName",title:"title"},decls:6,vars:6,consts:[["ngbDropdown","","placement","bottom-right"],["type","button","ngbDropdownToggle","",1,"btn","btn-light","dropdown-toggle-split",3,"title"],[3,"ngClass"],["ngbDropdownMenu",""],["ngbDropdownItem","",3,"click",4,"ngIf"],["ngbDropdownItem","",3,"click"]],template:function(t,o){1&t&&(e.TgZ(0,"div",0)(1,"button",1),e._UZ(2,"i",2),e.qZA(),e.TgZ(3,"div",3),e.YNc(4,sf,4,3,"button",4),e.YNc(5,hd,4,3,"button",4),e.qZA()()),2&t&&(e.xp6(1),e.Q6J("title",o.title),e.xp6(1),e.Q6J("ngClass",e.VKq(4,qc,o.icons.download)),e.xp6(2),e.Q6J("ngIf",o.objectItem),e.xp6(1),e.Q6J("ngIf",o.textItem))},directives:[Dr.jt,_e.o,Dr.iD,p.mk,Dr.Vi,p.O5,Dr.TH],styles:[""]}),n})();var G_=i(42746);let af=(()=>{class n{transform(t,o){if(!o)return t;o=this.escapeRegExp(o);const l=new RegExp(o,"gi");return t.match(l)?t.replace(l,"<mark>$&</mark>"):t}escapeRegExp(t){return t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}}return n.\u0275fac=function(t){return new(t||n)},n.\u0275pipe=e.Yjl({name:"searchHighlight",type:n,pure:!0}),n})();function _d(n,s){1&n&&e.GkF(0)}function hp(n,s){if(1&n&&(e.TgZ(0,"div",22),e._UZ(1,"cd-download-button",23)(2,"cd-copy-2-clipboard-button",24),e.qZA()),2&n){const t=e.oxw(4);e.xp6(1),e.Q6J("objectItem",t.clog)("textItem",t.clogText),e.xp6(1),e.Q6J("source",t.clogText)("byId",!1)}}function Vu(n,s){if(1&n&&(e.TgZ(0,"p")(1,"span",25),e._uU(2),e.ALo(3,"cdDate"),e.qZA(),e.TgZ(4,"span"),e.ALo(5,"logPriority"),e._uU(6),e.qZA(),e._UZ(7,"span",26),e.ALo(8,"searchHighlight"),e.qZA()),2&n){const t=s.$implicit,o=e.oxw(4);e.xp6(2),e.Oqu(e.lcZ(3,6,t.stamp)),e.xp6(2),e.Gre("priority ",e.lcZ(5,8,t.priority),""),e.xp6(2),e.Oqu(t.priority),e.xp6(1),e.Q6J("innerHTML",e.xi3(8,10,t.message,o.search),e.oJD)}}function Pc(n,s){1&n&&e.GkF(0)}function n1(n,s){if(1&n&&(e.TgZ(0,"div",17),e.YNc(1,hp,3,4,"div",18),e.TgZ(2,"div",19),e.YNc(3,Vu,9,13,"p",20),e.YNc(4,Pc,1,0,"ng-container",21),e.qZA()()),2&n){const t=e.oxw(3),o=e.MAs(4);e.xp6(1),e.Q6J("ngIf",t.clog.length),e.xp6(2),e.Q6J("ngForOf",t.clog),e.xp6(1),e.Q6J("ngIf",0!==t.clog.length)("ngIfElse",o)}}function cv(n,s){if(1&n&&e.YNc(0,n1,5,4,"div",16),2&n){const t=e.oxw(2);e.Q6J("ngIf",t.clog)}}function I0(n,s){if(1&n&&(e.TgZ(0,"div",22),e._UZ(1,"cd-download-button",27)(2,"cd-copy-2-clipboard-button",24),e.qZA()),2&n){const t=e.oxw(4);e.xp6(1),e.Q6J("objectItem",t.audit_log)("textItem",t.auditLogText),e.xp6(1),e.Q6J("source",t.auditLogText)("byId",!1)}}function L0(n,s){if(1&n&&(e.TgZ(0,"p")(1,"span",25),e._uU(2),e.ALo(3,"cdDate"),e.qZA(),e.TgZ(4,"span"),e.ALo(5,"logPriority"),e._uU(6),e.qZA(),e._UZ(7,"span",26),e.ALo(8,"searchHighlight"),e.qZA()),2&n){const t=s.$implicit,o=e.oxw(4);e.xp6(2),e.Oqu(e.lcZ(3,6,t.stamp)),e.xp6(2),e.Gre("priority ",e.lcZ(5,8,t.priority),""),e.xp6(2),e.Oqu(t.priority),e.xp6(1),e.Q6J("innerHTML",e.xi3(8,10,t.message,o.search),e.oJD)}}function Mm(n,s){1&n&&e.GkF(0)}function dv(n,s){if(1&n&&(e.TgZ(0,"div",17),e.YNc(1,I0,3,4,"div",18),e.TgZ(2,"div",19),e.YNc(3,L0,9,13,"p",20),e.YNc(4,Mm,1,0,"ng-container",21),e.qZA()()),2&n){const t=e.oxw(3),o=e.MAs(4);e.xp6(1),e.Q6J("ngIf",t.audit_log.length),e.xp6(2),e.Q6J("ngForOf",t.audit_log),e.xp6(1),e.Q6J("ngIf",0!==t.audit_log.length)("ngIfElse",o)}}function F0(n,s){if(1&n&&e.YNc(0,dv,5,4,"div",16),2&n){const t=e.oxw(2);e.Q6J("ngIf",t.audit_log)}}function Om(n,s){1&n&&(e.TgZ(0,"div"),e._UZ(1,"cd-grafana",28),e.qZA()),2&n&&(e.xp6(1),e.Q6J("grafanaPath","explore?")("type","logs"))}function cg(n,s){if(1&n&&(e.ynx(0),e.YNc(1,Om,2,2,"div",21),e.ALo(2,"async"),e.BQk()),2&n){const t=e.oxw(3),o=e.MAs(6);e.xp6(1),e.Q6J("ngIf",e.lcZ(2,2,t.promtailServiceStatus$))("ngIfElse",o)}}function Am(n,s){if(1&n&&(e.YNc(0,cg,3,4,"ng-container",21),e.ALo(1,"async")),2&n){const t=e.oxw(2),o=e.MAs(6);e.Q6J("ngIf",e.lcZ(1,2,t.lokiServiceStatus$))("ngIfElse",o)}}function tb(n,s){if(1&n&&(e.TgZ(0,"div"),e.YNc(1,_d,1,0,"ng-container",4),e.TgZ(2,"nav",5,6),e.ynx(4,7),e.TgZ(5,"a",8),e.SDv(6,9),e.qZA(),e.YNc(7,cv,1,1,"ng-template",10),e.BQk(),e.ynx(8,11),e.TgZ(9,"a",8),e.SDv(10,12),e.qZA(),e.YNc(11,F0,1,1,"ng-template",10),e.BQk(),e.ynx(12,13),e.TgZ(13,"a",8),e.SDv(14,14),e.qZA(),e.YNc(15,Am,2,4,"ng-template",10),e.BQk(),e.qZA(),e._UZ(16,"div",15),e.qZA()),2&n){const t=e.MAs(3);e.oxw();const o=e.MAs(2);e.xp6(1),e.Q6J("ngTemplateOutlet",o),e.xp6(15),e.Q6J("ngbNavOutlet",t)}}function k0(n,s){if(1&n&&(e.TgZ(0,"option",54),e._uU(1),e.qZA()),2&n){const t=s.$implicit;e.Q6J("value",t.value),e.xp6(1),e.Oqu(t.name)}}const Tg=function(n){return[n]};function eh(n,s){if(1&n){const t=e.EpF();e.TgZ(0,"div",29)(1,"div",30)(2,"div",31)(3,"label",32),e.SDv(4,33),e.qZA(),e.TgZ(5,"select",34),e.NdJ("ngModelChange",function(l){return e.CHM(t),e.oxw().priority=l})("ngModelChange",function(){return e.CHM(t),e.oxw().filterLogs()}),e.YNc(6,k0,2,2,"option",35),e.qZA()(),e.TgZ(7,"div",36)(8,"label",37),e.SDv(9,38),e.qZA(),e.TgZ(10,"div",39)(11,"span",40),e._UZ(12,"i",41),e.qZA(),e.TgZ(13,"input",42),e.NdJ("ngModelChange",function(l){return e.CHM(t),e.oxw().search=l})("keyup",function(){return e.CHM(t),e.oxw().filterLogs()}),e.qZA(),e.TgZ(14,"button",43),e.NdJ("click",function(){return e.CHM(t),e.oxw().clearSearchKey()}),e._UZ(15,"i"),e.qZA()()(),e.TgZ(16,"div",36)(17,"label",44),e.SDv(18,45),e.qZA(),e.TgZ(19,"div",39)(20,"input",46,47),e.NdJ("click",function(){return e.CHM(t),e.MAs(21).open()})("ngModelChange",function(l){return e.CHM(t),e.oxw().selectedDate=l})("ngModelChange",function(){return e.CHM(t),e.oxw().filterLogs()}),e.qZA(),e.TgZ(22,"button",43),e.NdJ("click",function(){return e.CHM(t),e.oxw().clearDate()}),e._UZ(23,"i"),e.qZA()()(),e.TgZ(24,"div",48)(25,"label",49),e.SDv(26,50),e.qZA(),e.TgZ(27,"div",51)(28,"ngb-timepicker",52),e.NdJ("ngModelChange",function(l){return e.CHM(t),e.oxw().startTime=l})("ngModelChange",function(){return e.CHM(t),e.oxw().filterLogs()}),e.qZA(),e.TgZ(29,"span",53),e._uU(30,"\xa0\u2014\xa0"),e.qZA(),e.TgZ(31,"ngb-timepicker",52),e.NdJ("ngModelChange",function(l){return e.CHM(t),e.oxw().endTime=l})("ngModelChange",function(){return e.CHM(t),e.oxw().filterLogs()}),e.qZA()()()()()}if(2&n){const t=e.oxw();e.xp6(5),e.Q6J("ngModel",t.priority),e.xp6(1),e.Q6J("ngForOf",t.priorities),e.xp6(6),e.Q6J("ngClass",e.VKq(16,Tg,t.icons.search)),e.xp6(1),e.Q6J("ngModel",t.search),e.xp6(2),e.Gre("icon-prepend ",t.icons.destroy,""),e.xp6(5),e.Q6J("maxDate",t.maxDate)("ngModel",t.selectedDate),e.xp6(3),e.Gre("icon-prepend ",t.icons.destroy,""),e.xp6(5),e.Q6J("spinners",!1)("ngModel",t.startTime),e.xp6(3),e.Q6J("spinners",!1)("ngModel",t.endTime)}}function Cg(n,s){if(1&n){const t=e.EpF();e.TgZ(0,"span"),e.SDv(1,55),e.qZA(),e.TgZ(2,"span"),e._uU(3,"\xa0"),e.qZA(),e.TgZ(4,"a",56),e.NdJ("click",function(){return e.CHM(t),e.oxw().resetFilter()}),e.SDv(5,57),e.qZA()}}function r1(n,s){1&n&&(e.TgZ(0,"cd-alert-panel",58),e.ynx(1),e.SDv(2,59),e.BQk(),e.qZA())}let i1=(()=>{class n{constructor(t,o,l,_){this.logsService=t,this.cephService=o,this.datePipe=l,this.ngZone=_,this.icons=No.P,this.priorities=[{name:"Debug",value:"[DBG]"},{name:"Info",value:"[INF]"},{name:"Warning",value:"[WRN]"},{name:"Error",value:"[ERR]"},{name:"All",value:"All"}],this.priority="All",this.search="",this.startTime={hour:0,minute:0},this.endTime={hour:23,minute:59},this.maxDate={year:(new Date).getFullYear(),month:(new Date).getMonth()+1,day:(new Date).getDate()}}ngOnInit(){this.getInfo(),this.ngZone.runOutsideAngular(()=>{this.getDaemonDetails(),this.interval=window.setInterval(()=>{this.ngZone.run(()=>{this.getInfo()})},5e3)})}ngOnDestroy(){clearInterval(this.interval)}getDaemonDetails(){this.lokiServiceStatus$=this.cephService.getDaemons("loki").pipe((0,Oa.U)(t=>t.length>0&&1===t[0].status)),this.promtailServiceStatus$=this.cephService.getDaemons("promtail").pipe((0,Oa.U)(t=>t.length>0&&1===t[0].status))}getInfo(){this.logsService.getLogs().subscribe(t=>{this.contentData=t,this.clogText=this.logToText(this.contentData.clog),this.auditLogText=this.logToText(this.contentData.audit_log),this.filterLogs()})}abstractFilters(){var t,o,l,_,M,w,N,V;const X=this.priority,re=this.search.toLowerCase();let oe;if(this.selectedDate){const Y=this.selectedDate.month,Et=this.selectedDate.day;oe=`${this.selectedDate.year}-${Y<=9?`0${Y}`:`${Y}`}-${Et<=9?`0${Et}`:`${Et}`}`}else oe="";return{priority:X,key:re,yearMonthDay:oe,sTime:60*(null!==(o=null===(t=this.startTime)||void 0===t?void 0:t.hour)&&void 0!==o?o:0)+(null!==(_=null===(l=this.startTime)||void 0===l?void 0:l.minute)&&void 0!==_?_:0),eTime:60*(null!==(w=null===(M=this.endTime)||void 0===M?void 0:M.hour)&&void 0!==w?w:23)+(null!==(V=null===(N=this.endTime)||void 0===N?void 0:N.minute)&&void 0!==V?V:59)}}filterExecutor(t,o){return t.filter(l=>{const _=this.datePipe.transform(l.stamp,"mediumTime"),M=parseInt(_.split(":")[0],10),w=parseInt(_.split(":")[1],10);let N,V,X;return N="All"===o.priority?l.priority:o.priority,V=o.yearMonthDay?o.yearMonthDay:l.stamp,X=60*M+w,l.priority===N&&-1!==l.message.toLowerCase().indexOf(o.key)&&-1!==l.stamp.indexOf(V)&&X>=o.sTime&&X<=o.eTime})}filterLogs(){const t=this.abstractFilters();this.clog=this.filterExecutor(this.contentData.clog,t),this.audit_log=this.filterExecutor(this.contentData.audit_log,t)}clearSearchKey(){this.search="",this.filterLogs()}clearDate(){this.selectedDate=null,this.filterLogs()}resetFilter(){return this.priority="All",this.search="",this.selectedDate=null,this.startTime={hour:0,minute:0},this.endTime={hour:23,minute:59},this.filterLogs(),!1}logToText(t){let o="";for(const l of Object.keys(t))o=o+this.datePipe.transform(t[l].stamp,"medium")+"\t"+t[l].priority+"\t"+t[l].message+"\n";return o}}return n.\u0275fac=function(t){return new(t||n)(e.Y36(ou),e.Y36(Kl),e.Y36(p.uU),e.Y36(e.R0b))},n.\u0275cmp=e.Xpm({type:n,selectors:[["cd-logs"]],decls:7,vars:1,consts:function(){let s,t,o,l,_,M,w,N,V,X,re,oe;return s="Cluster Logs",t="Audit Logs",o="Daemon Logs",l="Daemon logs",_="Priority:",M="Keyword:",w="Date:",N="Time range:",V="No log entries found. Please try to select different filter options.",X="Reset filter.",re="Loki/Promtail service not running",oe="Please start the loki and promtail service to see these logs.",[[4,"ngIf"],["logFiltersTpl",""],["noEntriesTpl",""],["daemonLogsTpl",""],[4,"ngTemplateOutlet"],["ngbNav","","cdStatefulTab","logs",1,"nav-tabs"],["nav","ngbNav"],["ngbNavItem","cluster-logs"],["ngbNavLink",""],s,["ngbNavContent",""],["ngbNavItem","audit-logs"],t,["ngbNavItem","daemon-logs"],o,[3,"ngbNavOutlet"],["class","card bg-light mb-3",4,"ngIf"],[1,"card","bg-light","mb-3"],["class","btn-group","role","group",4,"ngIf"],[1,"card-body"],[4,"ngFor","ngForOf"],[4,"ngIf","ngIfElse"],["role","group",1,"btn-group"],["fileName","cluster_log",3,"objectItem","textItem"],[3,"source","byId"],[1,"timestamp"],[1,"message",3,"innerHTML"],["fileName","audit_log",3,"objectItem","textItem"],["title",l,"uid","CrAHE0iZz","grafanaStyle","two",3,"grafanaPath","type"],[1,"row","mb-3"],[1,"col-lg-10","d-flex"],[1,"col-sm-1","me-3"],["for","logs-priority",1,"fw-bold"],_,["id","logs-priority",1,"form-select",3,"ngModel","ngModelChange"],[3,"value",4,"ngFor","ngForOf"],[1,"col-md-3","me-3"],["for","logs-keyword",1,"fw-bold"],M,[1,"input-group"],[1,"input-group-text"],[3,"ngClass"],["id","logs-keyword","type","text",1,"form-control",3,"ngModel","ngModelChange","keyup"],["type","button","title","Clear",1,"btn","btn-light",3,"click"],["for","logs-date",1,"fw-bold"],w,["id","logs-date","placeholder","YYYY-MM-DD","ngbDatepicker","",1,"form-control",3,"maxDate","ngModel","click","ngModelChange"],["d","ngbDatepicker"],[1,"col-md-5"],[1,"fw-bold"],N,[1,"d-flex"],[3,"spinners","ngModel","ngModelChange"],[1,"mt-2"],[3,"value"],V,["href","#",3,"click"],X,["type","info","title",re],oe]},template:function(t,o){1&t&&(e.YNc(0,tb,17,2,"div",0),e.YNc(1,eh,32,18,"ng-template",null,1,e.W1O),e.YNc(3,Cg,6,0,"ng-template",null,2,e.W1O),e.YNc(5,r1,3,0,"ng-template",null,3,e.W1O)),2&t&&e.Q6J("ngIf",o.contentData)},directives:[p.O5,p.tP,Dr.Pz,kn.m,Dr.nv,Dr.Vx,Dr.uN,Ph,u_.s,p.sg,ha.F,Dr.tO,_e.o,_n.EJ,_n.JJ,_n.On,_n.YN,_n.Kr,p.mk,_n.Fj,Il.b,Dr.J4,Dr.Pm,Eo.G],pipes:[Cn.N,G_.e,af,p.Ov],styles:["p[_ngcontent-%COMP%]{font-family:monospace}.card[_ngcontent-%COMP%]   .btn-group[_ngcontent-%COMP%]{margin-top:-45px;position:absolute;right:0}.card[_ngcontent-%COMP%]   div[_ngcontent-%COMP%]   p[_ngcontent-%COMP%]{display:flex}.card[_ngcontent-%COMP%]   div[_ngcontent-%COMP%]   p[_ngcontent-%COMP%]:last-child{margin-bottom:0}.card[_ngcontent-%COMP%]   .timestamp[_ngcontent-%COMP%]{flex-shrink:0;font-weight:700}.card[_ngcontent-%COMP%]   .priority[_ngcontent-%COMP%]{margin-left:.5rem}.card[_ngcontent-%COMP%]   .message[_ngcontent-%COMP%]{margin-left:1rem}.card[_ngcontent-%COMP%]   .err[_ngcontent-%COMP%]{color:#dc3545}.card[_ngcontent-%COMP%]   .warn[_ngcontent-%COMP%]{color:#d48200}.card[_ngcontent-%COMP%]   .info[_ngcontent-%COMP%]{color:#25828e}.card[_ngcontent-%COMP%]   .debug[_ngcontent-%COMP%]{color:#495057}  cd-logs ngb-timepicker input.ngb-tp-input{width:3.5rem!important}"]}),n})();var Mg=i(7273);function o1(n,s){if(1&n&&(e.TgZ(0,"cd-helper"),e._uU(1),e.ALo(2,"upperFirst"),e.qZA()),2&n){const t=e.oxw().$implicit;e.xp6(1),e.hij(" ",e.lcZ(2,1,t.value.long_desc||t.value.desc)," ")}}function s1(n,s){if(1&n&&(e.TgZ(0,"div",15)(1,"div",16),e._UZ(2,"input",17)(3,"label",18),e.qZA()()),2&n){const t=e.oxw().$implicit;e.xp6(2),e.s9C("id",t.value.name),e.s9C("formControlName",t.value.name),e.xp6(1),e.s9C("for",t.value.name)}}function d_(n,s){if(1&n&&e._UZ(0,"input",22),2&n){const t=e.oxw(2).$implicit;e.s9C("id",t.value.name),e.s9C("formControlName",t.value.name)}}function th(n,s){if(1&n&&(e.TgZ(0,"option",25),e._uU(1),e.qZA()),2&n){const t=s.$implicit;e.Q6J("ngValue",t),e.xp6(1),e.hij(" ",t," ")}}function Dl(n,s){if(1&n&&(e.TgZ(0,"select",23),e.YNc(1,th,2,2,"option",24),e.qZA()),2&n){const t=e.oxw(2).$implicit;e.s9C("id",t.value.name),e.s9C("formControlName",t.value.name),e.xp6(1),e.Q6J("ngForOf",t.value.enum_allowed)}}function a1(n,s){1&n&&(e.TgZ(0,"span",26),e.SDv(1,27),e.qZA())}function Ih(n,s){1&n&&(e.TgZ(0,"span",26),e.SDv(1,28),e.qZA())}function Dm(n,s){if(1&n&&(e.TgZ(0,"div",15),e.YNc(1,d_,1,2,"input",19),e.YNc(2,Dl,2,3,"select",20),e.YNc(3,a1,2,0,"span",21),e.YNc(4,Ih,2,0,"span",21),e.qZA()),2&n){const t=e.oxw().$implicit;e.oxw();const o=e.MAs(2),l=e.oxw();e.xp6(1),e.Q6J("ngIf",0===t.value.enum_allowed.length),e.xp6(1),e.Q6J("ngIf",t.value.enum_allowed.length>0),e.xp6(1),e.Q6J("ngIf",l.mgrModuleForm.showError(t.value.name,o,"invalidUuid")),e.xp6(1),e.Q6J("ngIf",l.mgrModuleForm.showError(t.value.name,o,"pattern"))}}function l1(n,s){1&n&&(e.TgZ(0,"span",26),e.SDv(1,30),e.qZA())}function _u(n,s){if(1&n&&(e.TgZ(0,"span",26),e.SDv(1,31),e.qZA()),2&n){const t=e.oxw(2).$implicit;e.xp6(1),e.pQV(t.value.max),e.QtT(1)}}function nm(n,s){if(1&n&&(e.TgZ(0,"span",26),e.SDv(1,32),e.qZA()),2&n){const t=e.oxw(2).$implicit;e.xp6(1),e.pQV(t.value.min),e.QtT(1)}}function u1(n,s){1&n&&(e.TgZ(0,"span",26),e.SDv(1,33),e.qZA())}function Og(n,s){if(1&n&&(e.TgZ(0,"div",15),e._UZ(1,"input",29),e.YNc(2,l1,2,0,"span",21),e.YNc(3,_u,2,1,"span",21),e.YNc(4,nm,2,1,"span",21),e.YNc(5,u1,2,0,"span",21),e.qZA()),2&n){const t=e.oxw().$implicit;e.oxw();const o=e.MAs(2),l=e.oxw();e.xp6(1),e.s9C("id",t.value.name),e.s9C("formControlName",t.value.name),e.s9C("min",t.value.min),e.s9C("max",t.value.max),e.xp6(1),e.Q6J("ngIf",l.mgrModuleForm.showError(t.value.name,o,"required")),e.xp6(1),e.Q6J("ngIf",l.mgrModuleForm.showError(t.value.name,o,"max")),e.xp6(1),e.Q6J("ngIf",l.mgrModuleForm.showError(t.value.name,o,"min")),e.xp6(1),e.Q6J("ngIf",l.mgrModuleForm.showError(t.value.name,o,"pattern"))}}function c1(n,s){1&n&&(e.TgZ(0,"span",26),e.SDv(1,35),e.qZA())}function d1(n,s){1&n&&(e.TgZ(0,"span",26),e.SDv(1,36),e.qZA())}function f1(n,s){if(1&n&&(e.TgZ(0,"div",15),e._UZ(1,"input",34),e.YNc(2,c1,2,0,"span",21),e.YNc(3,d1,2,0,"span",21),e.qZA()),2&n){const t=e.oxw().$implicit;e.oxw();const o=e.MAs(2),l=e.oxw();e.xp6(1),e.s9C("id",t.value.name),e.s9C("formControlName",t.value.name),e.xp6(1),e.Q6J("ngIf",l.mgrModuleForm.showError(t.value.name,o,"required")),e.xp6(1),e.Q6J("ngIf",l.mgrModuleForm.showError(t.value.name,o,"pattern"))}}const $0=function(){return["addr","str","uuid"]},fv=function(){return["uint","int","size","secs"]};function H0(n,s){if(1&n&&(e.TgZ(0,"div",11)(1,"label",12),e._uU(2),e.YNc(3,o1,3,3,"cd-helper",13),e.qZA(),e.YNc(4,s1,4,3,"div",14),e.YNc(5,Dm,5,4,"div",14),e.YNc(6,Og,6,8,"div",14),e.YNc(7,f1,4,4,"div",14),e.qZA()),2&n){const t=s.$implicit;e.xp6(1),e.s9C("for",t.value.name),e.xp6(1),e.hij(" ",t.value.name," "),e.xp6(1),e.Q6J("ngIf",t.value.long_desc||t.value.desc),e.xp6(1),e.Q6J("ngIf","bool"===t.value.type),e.xp6(1),e.Q6J("ngIf",e.DdM(7,$0).includes(t.value.type)),e.xp6(1),e.Q6J("ngIf",e.DdM(8,fv).includes(t.value.type)),e.xp6(1),e.Q6J("ngIf","float"===t.value.type)}}function B0(n,s){if(1&n){const t=e.EpF();e.TgZ(0,"div",1)(1,"form",2,3)(3,"div",4)(4,"div",5),e.SDv(5,6),e.qZA(),e.TgZ(6,"div",7),e.YNc(7,H0,8,9,"div",8),e.ALo(8,"keyvalue"),e.qZA(),e.TgZ(9,"div",9)(10,"cd-form-button-panel",10),e.NdJ("submitActionEvent",function(){return e.CHM(t),e.oxw().onSubmit()}),e.qZA()()()()()}if(2&n){const t=e.oxw();e.xp6(1),e.Q6J("formGroup",t.mgrModuleForm),e.xp6(6),e.Q6J("ngForOf",e.lcZ(8,4,t.moduleOptions)),e.xp6(3),e.Q6J("form",t.mgrModuleForm)("submitText",t.actionLabels.UPDATE)}}let p1=(()=>{class n extends Bl.E{constructor(t,o,l,_,M,w){super(),this.actionLabels=t,this.route=o,this.router=l,this.formBuilder=_,this.mgrModuleService=M,this.notificationService=w,this.moduleName="",this.moduleOptions=[]}ngOnInit(){this.route.params.subscribe(t=>{this.moduleName=decodeURIComponent(t.name);const o=[this.mgrModuleService.getOptions(this.moduleName),this.mgrModuleService.getConfig(this.moduleName)];(0,Pu.D)(o).subscribe(l=>{this.moduleOptions=l[0],this.createForm(),this.mgrModuleForm.setValue(l[1]),this.loadingReady()},l=>{this.loadingError()})})}getValidators(t){const o=[];switch(t.type){case"addr":o.push(Me.h.ip());break;case"uint":case"int":case"size":case"secs":o.push(_n.kI.required);break;case"str":Er().isNumber(t.min)&&o.push(_n.kI.minLength(t.min)),Er().isNumber(t.max)&&o.push(_n.kI.maxLength(t.max));break;case"float":o.push(_n.kI.required),o.push(Me.h.decimalNumber());break;case"uuid":o.push(Me.h.uuid())}return o}createForm(){const t={};Er().forEach(this.moduleOptions,o=>{t[o.name]=[o.default_value,this.getValidators(o)]}),this.mgrModuleForm=this.formBuilder.group(t)}goToListView(){this.router.navigate(["/mgr-modules"])}onSubmit(){if(this.mgrModuleForm.pristine)return void this.goToListView();const t={};Er().forEach(this.moduleOptions,o=>{const l=this.mgrModuleForm.get(o.name);l.dirty&&l.valid&&(t[o.name]=l.value)}),this.mgrModuleService.updateConfig(this.moduleName,t).subscribe(()=>{this.notificationService.show(Sa.k.success,"Updated options for module '" + this.moduleName + "'."),this.goToListView()},()=>{this.mgrModuleForm.setErrors({cdSubmitButton:!0})})}}return n.\u0275fac=function(t){return new(t||n)(e.Y36(Mo.p4),e.Y36(Bo.gz),e.Y36(Bo.F0),e.Y36(zu.O),e.Y36(Mg.N),e.Y36(Sl.g))},n.\u0275cmp=e.Xpm({type:n,selectors:[["cd-mgr-module-form"]],features:[e.qOj],decls:1,vars:1,consts:function(){let s,t,o,l,_,M,w,N,V;return s="Edit Manager module",t="The entered value is not a valid UUID, e.g.: 67dcac9f-2c03-4d6c-b7bd-1210b3a259a8",o="The entered value needs to be a valid IP address.",l="This field is required.",_="The entered value is too high! It must be lower or equal to " + "\ufffd0\ufffd" + ".",M="The entered value is too low! It must be greater or equal to " + "\ufffd0\ufffd" + ".",w="The entered value needs to be a number.",N="This field is required.",V="The entered value needs to be a number or decimal.",[["class","cd-col-form",4,"cdFormLoading"],[1,"cd-col-form"],["name","mgrModuleForm","novalidate","",3,"formGroup"],["frm","ngForm"],[1,"card"],[1,"card-header"],s,[1,"card-body"],["class","form-group row",4,"ngFor","ngForOf"],[1,"card-footer"],["wrappingClass","text-right",3,"form","submitText","submitActionEvent"],[1,"form-group","row"],[1,"cd-col-form-label",3,"for"],[4,"ngIf"],["class","cd-col-form-input",4,"ngIf"],[1,"cd-col-form-input"],[1,"custom-control","custom-checkbox"],["type","checkbox",1,"custom-control-input",3,"id","formControlName"],[1,"custom-control-label",3,"for"],["class","form-control","type","text",3,"id","formControlName",4,"ngIf"],["class","form-select",3,"id","formControlName",4,"ngIf"],["class","invalid-feedback",4,"ngIf"],["type","text",1,"form-control",3,"id","formControlName"],[1,"form-select",3,"id","formControlName"],[3,"ngValue",4,"ngFor","ngForOf"],[3,"ngValue"],[1,"invalid-feedback"],t,o,["type","number",1,"form-control",3,"id","formControlName","min","max"],l,_,M,w,["type","number",1,"form-control",3,"id","formControlName"],N,V]},template:function(t,o){1&t&&e.YNc(0,B0,11,6,"div",0),2&t&&e.Q6J("cdFormLoading",o.loading)},directives:[lu.y,_n._Y,_n.JL,_n.sg,Ma.V,p.sg,al.P,p.O5,Oe.S,_e.o,_n.Wl,Il.b,_n.JJ,_n.u,_n.Fj,_n.EJ,_n.YN,_n.Kr,_n.wV,_n.qQ,_n.Fd,Cl.p],pipes:[p.Nd,gt.m],styles:[""]}),n})();function gd(n,s,t,o){var M,l=arguments.length,_=l<3?s:null===o?o=Object.getOwnPropertyDescriptor(s,t):o;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)_=Reflect.decorate(n,s,t,o);else for(var w=n.length-1;w>=0;w--)(M=n[w])&&(_=(l<3?M(_):l>3?M(s,t,_):M(s,t))||_);return l>3&&_&&Object.defineProperty(s,t,_),_}var Z0=i(7357);const W0=["*"],pv=["templateOutlet"];function J0(n,s){if(1&n&&(e.TgZ(0,"div",6),e._uU(1),e.qZA()),2&n){const t=e.oxw(2);e.xp6(1),e.hij(" ",t.message||t.defaultMessage," ")}}function v1(n,s){if(1&n&&(e.TgZ(0,"div",3),e._UZ(1,"div",4),e.YNc(2,J0,2,1,"div",5),e.qZA()),2&n){const t=e.oxw();e.xp6(2),e.Q6J("ngIf",t.message||t.defaultMessage)}}function y1(n,s){}function rm(n,s){1&n&&e.YNc(0,y1,0,0,"ng-template",null,7,e.W1O)}const Lh=function(n){return{active:n}};let xd=(()=>{class n{}return n.START="start",n.STOP="stop",n.UPDATE="update",n.RESET="reset",n.RESET_GLOBAL="reset_global",n.UNSUBSCRIBE="unsubscribe",n})();const xm="block-ui-main";let dg=(()=>{let n=class{constructor(){this.blockUISettings={},this.blockUIInstances={},this.blockUISubject=new Z0.t(1),this.blockUIObservable=this.blockUISubject.asObservable(),this.blockUIObservable.subscribe(this.blockUIMiddleware.bind(this))}getSettings(){return this.blockUISettings}updateSettings(t={}){this.blockUISettings=Object.assign(Object.assign({},this.blockUISettings),t)}decorate(t=xm){const o={name:t,isActive:!1,blockCount:0,start:this.dispatch(this.blockUISubject,xd.START,t),update:this.dispatch(this.blockUISubject,xd.UPDATE,t),stop:this.dispatch(this.blockUISubject,xd.STOP,t),reset:this.dispatch(this.blockUISubject,xd.RESET,t),resetGlobal:this.dispatch(this.blockUISubject,xd.RESET_GLOBAL,t),unsubscribe:this.dispatch(this.blockUISubject,xd.UNSUBSCRIBE,t)};return this.blockUIInstances[t]=this.blockUIInstances[t]||o,o}observe(){return this.blockUIObservable}clearInstance(t){this.dispatch(this.blockUISubject,xd.RESET,t)}blockUIMiddleware({action:t,name:o}){let l=null;switch(t){case xd.START:l=!0;break;case xd.STOP:case xd.RESET:l=!1}null!==l&&(this.blockUIInstances[o].isActive=l)}dispatch(t,o,l=xm){return _=>{t.next({name:l,action:o,message:_})}}};return n.\u0275fac=function(t){return new(t||n)},n.\u0275prov=e.Yz7({token:n,factory:function(s){return n.\u0275fac(s)}}),n})(),E1=(()=>{let n=class{constructor(t){this.blockUI=t}ngOnInit(){this.name=this.name||xm,this.template=this.template||this.blockUI.blockUISettings.template}};return n.\u0275fac=function(t){return new(t||n)(e.Y36(dg))},n.\u0275cmp=e.Xpm({type:n,selectors:[["block-ui"]],inputs:{name:"name",template:"template",message:"message",delayStart:"delayStart",delayStop:"delayStop"},ngContentSelectors:W0,decls:2,vars:5,consts:[[3,"name","message","template","delayStart","delayStop"]],template:function(t,o){1&t&&(e.F$t(),e.Hsn(0),e._UZ(1,"block-ui-content",0)),2&t&&(e.xp6(1),e.Q6J("name",o.name)("message",o.message)("template",o.template)("delayStart",o.delayStart)("delayStop",o.delayStop))},directives:function(){return[K0]},encapsulation:2}),gd([(0,e.IIB)()],n.prototype,"name",void 0),gd([(0,e.IIB)()],n.prototype,"message",void 0),gd([(0,e.IIB)()],n.prototype,"delayStart",void 0),gd([(0,e.IIB)()],n.prototype,"delayStop",void 0),gd([(0,e.IIB)()],n.prototype,"template",void 0),n})(),K0=(()=>{let n=class{constructor(t,o,l){this.blockUI=t,this.resolver=o,this.changeDetectionRef=l,this.name=xm,this.defaultBlockState={startTimeouts:[],stopTimeouts:[],updateTimeouts:[],blockCount:0,startCallCount:0,stopCallCount:0},this.state=Object.assign({},this.defaultBlockState)}ngOnInit(){this.settings=this.blockUI.getSettings(),this.blockUISubscription=this.subscribeToBlockUI(this.blockUI.observe())}ngAfterViewInit(){try{if(!this.templateCmp)return!1;if(this.templateCmp instanceof e.Rgc)this.templateOutlet.createEmbeddedView(this.templateCmp);else{const t=this.resolver.resolveComponentFactory(this.templateCmp);this.templateCompRef=this.templateOutlet.createComponent(t),this.updateBlockTemplate(this.message)}}catch(t){console.error("ng-block-ui:",t)}}ngAfterViewChecked(){this.detectChanges()}subscribeToBlockUI(t){return t.subscribe(o=>this.onDispatchedEvent(o))}onDispatchedEvent(t){switch(t.action){case xd.START:this.onStart(t);break;case xd.STOP:this.onStop(t);break;case xd.UPDATE:this.onUpdate(t);break;case xd.RESET:this.onReset(t);break;case xd.RESET_GLOBAL:this.resetState();break;case xd.UNSUBSCRIBE:this.onStop(t),this.onUnsubscribe(t.name)}}onStart({name:t,message:o}){if(t===this.name){const l=this.delayStart||this.settings.delayStart||0;this.state.startCallCount+=1;const _=setTimeout(()=>{this.state.blockCount+=1,this.showBlock(o),this.updateInstanceBlockCount()},l);this.state.startTimeouts.push(_)}}onStop({name:t}){if(t===this.name){const o=this.state.stopCallCount+1;if(this.state.startCallCount-o>=0){const l=this.delayStop||this.settings.delayStop||0;this.state.stopCallCount=o;const _=setTimeout(()=>{this.state.blockCount-=1,this.updateInstanceBlockCount(),this.detectChanges()},l);this.state.stopTimeouts.push(_)}}}onUpdate({name:t,message:o}){if(t===this.name){const l=this.delayStart||this.settings.delayStart||0;clearTimeout(this.state.updateTimeouts[0]);const _=setTimeout(()=>{this.updateMessage(o)},l);this.state.updateTimeouts.push(_)}}onReset({name:t}){t===this.name&&this.resetState()}updateMessage(t){this.showBlock(t)}showBlock(t){this.message=t||this.defaultMessage||this.settings.message,this.updateBlockTemplate(this.message),this.detectChanges()}updateBlockTemplate(t){this.templateCompRef&&this.templateCompRef instanceof e.UuU&&(this.templateCompRef.instance.message=t)}resetState(){[...this.state.startTimeouts,...this.state.stopTimeouts,...this.state.updateTimeouts].forEach(clearTimeout),this.state=Object.assign({},this.defaultBlockState),this.updateInstanceBlockCount(),this.detectChanges()}onUnsubscribe(t){this.blockUISubscription&&t===this.name&&this.blockUISubscription.unsubscribe()}updateInstanceBlockCount(){if(this.blockUI.blockUIInstances[this.name]){const{blockCount:t}=this.state;this.blockUI.blockUIInstances[this.name].blockCount=t}}detectChanges(){this.changeDetectionRef.destroyed||this.changeDetectionRef.detectChanges()}ngOnDestroy(){this.resetState(),this.onUnsubscribe(this.name),this.blockUI.clearInstance(this.name)}};return n.\u0275fac=function(t){return new(t||n)(e.Y36(dg),e.Y36(e._Vd),e.Y36(e.sBO))},n.\u0275cmp=e.Xpm({type:n,selectors:[["block-ui-content"]],viewQuery:function(t,o){if(1&t&&e.Gf(pv,5,e.s_b),2&t){let l;e.iGM(l=e.CRH())&&(o.templateOutlet=l.first)}},inputs:{name:"name",delayStart:"delayStart",delayStop:"delayStop",defaultMessage:["message","defaultMessage"],templateCmp:["template","templateCmp"]},decls:3,vars:9,consts:[[3,"ngClass"],["class","block-ui-spinner",4,"ngIf"],[4,"ngIf"],[1,"block-ui-spinner"],[1,"loader"],["class","message",4,"ngIf"],[1,"message"],["templateOutlet",""]],template:function(t,o){1&t&&(e.TgZ(0,"div",0),e.YNc(1,v1,3,1,"div",1),e.YNc(2,rm,2,0,null,2),e.qZA()),2&t&&(e.MT6("block-ui-wrapper ",o.name," ",o.className,""),e.Q6J("ngClass",e.VKq(7,Lh,o.state.blockCount>0)),e.xp6(1),e.Q6J("ngIf",!o.templateCmp),e.xp6(1),e.Q6J("ngIf",o.templateCmp))},directives:[p.mk,p.O5],styles:["\n.block-ui-wrapper {\n  display: none;\n  position: fixed;\n  height: 100%;\n  width: 100%;\n  top: 0;\n  left: 0;\n  background: rgba(0, 0, 0, 0.70);\n  z-index: 30000;\n  cursor: wait;\n}\n\n.block-ui-wrapper.block-ui-wrapper--element {\n  position: absolute;\n}\n\n.block-ui-wrapper.active {\n  display: block;\n}\n\n.block-ui-wrapper.block-ui-main {\n  position: fixed;\n}\n\n.block-ui-spinner,\n.block-ui-template {\n  position: absolute;\n  top: 40%;\n  margin: 0 auto;\n  left: 0;\n  right: 0;\n  transform: translateY(-50%);\n}\n\n.block-ui-spinner > .message {\n  font-size: 1.3em;\n  text-align: center;\n  color: #fff;\n}\n\n.block-ui__element {\n  position: relative;\n}\n\n.loader,\n.loader:after {\n  border-radius: 50%;\n  width: 10em;\n  height: 10em;\n}\n.loader {\n  margin: 7px auto;\n  font-size: 5px;\n  position: relative;\n  text-indent: -9999em;\n  border-top: 1.1em solid rgba(255, 255, 255, 0.2);\n  border-right: 1.1em solid rgba(255, 255, 255, 0.2);\n  border-bottom: 1.1em solid rgba(255, 255, 255, 0.2);\n  border-left: 1.1em solid #ffffff;\n  -webkit-transform: translateZ(0);\n  -ms-transform: translateZ(0);\n  transform: translateZ(0);\n  -webkit-animation: load8 1.1s infinite linear;\n  animation: load8 1.1s infinite linear;\n}\n\n@-webkit-keyframes load8 {\n  0% {\n    -webkit-transform: rotate(0deg);\n    transform: rotate(0deg);\n  }\n  100% {\n    -webkit-transform: rotate(360deg);\n    transform: rotate(360deg);\n  }\n}\n\n@keyframes load8 {\n  0% {\n    -webkit-transform: rotate(0deg);\n    transform: rotate(0deg);\n  }\n  100% {\n    -webkit-transform: rotate(360deg);\n    transform: rotate(360deg);\n  }\n}\n"],encapsulation:2}),gd([(0,e.IIB)()],n.prototype,"name",void 0),gd([(0,e.IIB)()],n.prototype,"delayStart",void 0),gd([(0,e.IIB)()],n.prototype,"delayStop",void 0),gd([(0,e.IIB)("message")],n.prototype,"defaultMessage",void 0),gd([(0,e.IIB)("template")],n.prototype,"templateCmp",void 0),gd([(0,e.i9L)("templateOutlet",{read:e.s_b})],n.prototype,"templateOutlet",void 0),n})(),hv=(()=>{let n=class{constructor(t){this.blockUIInstance=t,this.globalDispatch=this.blockUIInstance.decorate()}start(t,o){this.dispatch(t,xd.START,o)}stop(t){this.dispatch(t,xd.STOP)}reset(t){this.dispatch(t,xd.RESET)}resetGlobal(){this.globalDispatch.resetGlobal()}update(t,o){this.dispatch(t,xd.UPDATE,o)}unsubscribe(t){this.dispatch(t,xd.UNSUBSCRIBE)}isActive(t=null){const o=t?this.toArray(t):null,l=this.blockUIInstance.blockUIInstances;return Object.keys(l).some(_=>o?o.indexOf(l[_].name)>=0&&l[_].isActive:l[_].isActive)}dispatch(t=[],o,l){this.toArray(t).forEach(M=>this.blockUIInstance.decorate(M)[o](l))}toArray(t=[]){return"string"==typeof t?[t]:t}};return n.\u0275fac=function(t){return new(t||n)(e.LFG(dg))},n.\u0275prov=e.Yz7({token:n,factory:function(s){return n.\u0275fac(s)}}),n})();var T1;const Ag=new dg,C1=new e.OlP("BlockUIModuleSettings");function X0(n){return Ag.updateSettings(n),Ag}let Dg=T1=class{static forRoot(s={}){return{ngModule:T1,providers:[{provide:C1,useValue:s},{provide:dg,useFactory:X0,deps:[C1]},hv]}}};Dg.\u0275fac=function(s){return new(s||Dg)},Dg.\u0275mod=e.oAB({type:Dg}),Dg.\u0275inj=e.cJS({imports:[[p.ez]]});let q0=1;function ty(n,s){if(1&n&&(e.ynx(0),e._UZ(1,"cd-table-key-value",1),e.BQk()),2&n){const t=e.oxw();e.xp6(1),e.Q6J("data",t.module_config)}}let Rm=(()=>{class n{constructor(t){this.mgrModuleService=t}ngOnChanges(){this.selection&&this.mgrModuleService.getConfig(this.selection.name).subscribe(t=>{this.module_config=t})}}return n.\u0275fac=function(t){return new(t||n)(e.Y36(Mg.N))},n.\u0275cmp=e.Xpm({type:n,selectors:[["cd-mgr-module-details"]],inputs:{selection:"selection"},features:[e.TTD],decls:1,vars:1,consts:[[4,"ngIf"],[3,"data"]],template:function(t,o){1&t&&e.YNc(0,ty,2,1,"ng-container",0),2&t&&e.Q6J("ngIf",o.selection)},directives:[p.O5,fo.b],styles:[""]}),n})();class Fh extends Mt.o{constructor(s,t,o){super(),this.authStorageService=s,this.mgrModuleService=t,this.notificationService=o,this.columns=[],this.modules=[],this.selection=new sn.r,this.permission=this.authStorageService.getPermissions().configOpt,this.columns=[{name:"Name",prop:"name",flexGrow:1},{name:"Enabled",prop:"enabled",flexGrow:1,cellClass:"text-center",cellTransformation:wt.e.checkIcon},{name:"Always-On",prop:"always_on",flexGrow:1,cellClass:"text-center",cellTransformation:wt.e.checkIcon}];const l=()=>this.selection.first()&&encodeURIComponent(this.selection.first().name);this.tableActions=[{name:"Edit",permission:"update",disable:()=>!this.selection.hasSelection||0===Object.values(this.selection.first().options).length,routerLink:()=>`/mgr-modules/edit/${l()}`,icon:No.P.edit},{name:"Enable",permission:"update",click:()=>this.updateModuleState(),disable:()=>this.isTableActionDisabled("enabled"),icon:No.P.start},{name:"Disable",permission:"update",click:()=>this.updateModuleState(),disable:()=>this.getTableActionDisabledDesc(),icon:No.P.stop}]}getModuleList(s){this.mgrModuleService.list().subscribe(t=>{this.modules=t},()=>{s.error()})}updateSelection(s){this.selection=s}isTableActionDisabled(s){if(!this.selection.hasSelection)return!0;const t=this.selection.first();if("dashboard"===t.name||t.always_on)return!0;switch(s){case"enabled":return t.enabled;case"disabled":return!t.enabled}}getTableActionDisabledDesc(){var s;return(null===(s=this.selection.first())||void 0===s?void 0:s.always_on)?"This Manager module is always on.":this.isTableActionDisabled("disabled")}updateModuleState(){if(!this.selection.hasSelection)return;let s;const t=()=>{(0,ni.H)(2e3).subscribe(()=>{this.mgrModuleService.list().subscribe(()=>{this.notificationService.suspendToasties(!1),this.blockUI.stop(),this.table.refreshBtn()},()=>{t()})})},o=this.selection.first();s=o.enabled?this.mgrModuleService.disable(o.name):this.mgrModuleService.enable(o.name),s.subscribe(()=>{},()=>{this.notificationService.suspendToasties(!0),this.blockUI.start("Reconnecting, please wait ..."),t()})}}Fh.\u0275fac=function(s){return new(s||Fh)(e.Y36(zi.j),e.Y36(Mg.N),e.Y36(Sl.g))},Fh.\u0275cmp=e.Xpm({type:Fh,selectors:[["cd-mgr-module-list"]],viewQuery:function(s,t){if(1&s&&e.Gf(_r.a,7),2&s){let o;e.iGM(o=e.CRH())&&(t.table=o.first)}},features:[e.qOj],decls:4,vars:8,consts:[["columnMode","flex","selectionType","single","identifier","module",3,"autoReload","data","columns","hasDetails","setExpandedRow","updateSelection","fetchData"],["table",""],[1,"table-actions",3,"permission","selection","tableActions"],["cdTableDetail","",3,"selection"]],template:function(s,t){1&s&&(e.TgZ(0,"cd-table",0,1),e.NdJ("setExpandedRow",function(l){return t.setExpandedRow(l)})("updateSelection",function(l){return t.updateSelection(l)})("fetchData",function(l){return t.getModuleList(l)}),e._UZ(2,"cd-table-actions",2)(3,"cd-mgr-module-details",3),e.qZA()),2&s&&(e.Q6J("autoReload",!1)("data",t.modules)("columns",t.columns)("hasDetails",!0),e.xp6(2),e.Q6J("permission",t.permission)("selection",t.selection)("tableActions",t.tableActions),e.xp6(1),e.Q6J("selection",t.expandedRow))},directives:[_r.a,bu.K,Rm],styles:[""]}),(0,j.gn)([function ey(n,s={}){return s.scopeToInstance?function(t,o){const l=`_${o}-block-ui`;Object.defineProperty(t,o,{get:function(){if(this[l])return this[l];const _=`${n}-${q0++}`;return this[l]=Ag.decorate(_),this[l]},set:function(_){this[l]=_}})}:function(t,o){t[o]=Ag.decorate(n)}}(),(0,j.w6)("design:type",Object)],Fh.prototype,"blockUI",void 0);let ny=(()=>{class n{constructor(t){this.http=t}getMonitor(){return this.http.get("api/monitor")}}return n.\u0275fac=function(t){return new(t||n)(e.LFG(y.eN))},n.\u0275prov=e.Yz7({token:n,factory:n.\u0275fac,providedIn:"root"}),n})();function im(n,s){if(1&n&&(e.TgZ(0,"table",11)(1,"tbody")(2,"tr")(3,"td",12),e.SDv(4,13),e.qZA(),e.TgZ(5,"td"),e._uU(6),e.qZA()(),e.TgZ(7,"tr")(8,"td",12),e.SDv(9,14),e.qZA(),e.TgZ(10,"td"),e._uU(11),e.ALo(12,"relativeDate"),e.qZA()(),e.TgZ(13,"tr")(14,"td",12),e.SDv(15,15),e.qZA(),e.TgZ(16,"td"),e._uU(17),e.qZA()(),e.TgZ(18,"tr")(19,"td",12),e.SDv(20,16),e.qZA(),e.TgZ(21,"td"),e._uU(22),e.qZA()(),e.TgZ(23,"tr")(24,"td",12),e.SDv(25,17),e.qZA(),e.TgZ(26,"td"),e._uU(27),e.qZA()(),e.TgZ(28,"tr")(29,"td",12),e.SDv(30,18),e.qZA(),e.TgZ(31,"td"),e._uU(32),e.qZA()(),e.TgZ(33,"tr")(34,"td",12),e.SDv(35,19),e.qZA(),e.TgZ(36,"td"),e._uU(37),e.qZA()()()()),2&n){const t=e.oxw();e.xp6(6),e.Oqu(t.mon_status.monmap.fsid),e.xp6(5),e.Oqu(e.lcZ(12,7,t.mon_status.monmap.modified)),e.xp6(6),e.Oqu(t.mon_status.monmap.epoch),e.xp6(5),e.Oqu(t.mon_status.features.quorum_con),e.xp6(5),e.Oqu(t.mon_status.features.quorum_mon),e.xp6(5),e.Oqu(t.mon_status.features.required_con),e.xp6(5),e.Oqu(t.mon_status.features.required_mon)}}let ry=(()=>{class n{constructor(t){this.monitorService=t,this.inQuorum={columns:[{prop:"name",name:"Name",cellTransformation:wt.e.routerLink},{prop:"rank",name:"Rank"},{prop:"public_addr",name:"Public Address"},{prop:"cdOpenSessions",name:"Open Sessions",cellTransformation:wt.e.sparkline,comparator:(o,l)=>{const _=Er().last(o),M=Er().last(l);return _&&M&&_!==M?_>M?1:-1:0}}]},this.notInQuorum={columns:[{prop:"name",name:"Name",cellTransformation:wt.e.routerLink},{prop:"rank",name:"Rank"},{prop:"public_addr",name:"Public Address"}]}}refresh(){this.monitorService.getMonitor().subscribe(t=>{t.in_quorum.map(o=>(o.cdOpenSessions=o.stats.num_sessions.map(l=>l[1]),o.cdLink="/perf_counters/mon/"+o.name,o.cdParams={fromLink:"/monitor"},o)),t.out_quorum.map(o=>(o.cdLink="/perf_counters/mon/"+o.name,o.cdParams={fromLink:"/monitor"},o)),this.inQuorum.data=[...t.in_quorum],this.notInQuorum.data=[...t.out_quorum],this.mon_status=t.mon_status})}}return n.\u0275fac=function(t){return new(t||n)(e.Y36(ny))},n.\u0275cmp=e.Xpm({type:n,selectors:[["cd-monitor"]],decls:15,vars:5,consts:function(){let s,t,o,l,_,M,w,N,V,X;return s="Status",t="In Quorum",o="Not In Quorum",l="Cluster ID",_="monmap modified",M="monmap epoch",w="quorum con",N="quorum mon",V="required con",X="required mon",[[1,"row"],[1,"col-lg-4"],[1,"cd-header"],s,["class","table table-striped",4,"ngIf"],[1,"col-lg-8"],[1,"in-quorum","cd-header"],t,[3,"data","columns"],o,[3,"data","columns","fetchData"],[1,"table","table-striped"],[1,"bold"],l,_,M,w,N,V,X]},template:function(t,o){1&t&&(e.TgZ(0,"div",0)(1,"div",1)(2,"fieldset")(3,"legend",2),e.SDv(4,3),e.qZA(),e.YNc(5,im,38,9,"table",4),e.qZA()(),e.TgZ(6,"div",5)(7,"legend",6),e.SDv(8,7),e.qZA(),e.TgZ(9,"div"),e._UZ(10,"cd-table",8),e.qZA(),e.TgZ(11,"legend",6),e.SDv(12,9),e.qZA(),e.TgZ(13,"div")(14,"cd-table",10),e.NdJ("fetchData",function(){return o.refresh()}),e.qZA()()()()),2&t&&(e.xp6(5),e.Q6J("ngIf",o.mon_status),e.xp6(5),e.Q6J("data",o.inQuorum.data)("columns",o.inQuorum.columns),e.xp6(4),e.Q6J("data",o.notInQuorum.data)("columns",o.notInQuorum.columns))},directives:[p.O5,_r.a],pipes:[Ud.h],styles:[""]}),n})();class M1{}function _v(n,s){if(1&n&&(e.TgZ(0,"span",18),e.SDv(1,19),e.qZA()),2&n){const t=e.oxw(2);e.Q6J("ngbTooltip",t.clusterWideTooltip)}}function f_(n,s){1&n&&e._UZ(0,"hr",20)}function om(n,s){if(1&n){const t=e.EpF();e.TgZ(0,"div",12)(1,"input",13),e.NdJ("change",function(){const _=e.CHM(t).$implicit;return e.oxw().changeValue(_)}),e.qZA(),e.TgZ(2,"label",14)(3,"strong"),e._uU(4),e.qZA(),e.YNc(5,_v,2,1,"span",15),e._UZ(6,"br"),e.TgZ(7,"span",16),e._uU(8),e.qZA()(),e.YNc(9,f_,1,0,"hr",17),e.qZA()}if(2&n){const t=s.$implicit,o=s.last;e.xp6(1),e.Q6J("checked",t.value)("indeterminate",t.indeterminate)("name",t.code)("id",t.code),e.xp6(1),e.Q6J("for",t.code),e.xp6(2),e.Oqu(t.name),e.xp6(1),e.Q6J("ngIf",t.clusterWide),e.xp6(3),e.Oqu(t.description),e.xp6(1),e.Q6J("ngIf",!o)}}let Hf=(()=>{class n{constructor(t,o,l,_,M){this.activeModal=t,this.actionLabels=o,this.authStorageService=l,this.osdService=_,this.notificationService=M,this.initialSelection=[],this.osdFlagsForm=new _n.cw({}),this.flags=[{code:"noup",name:"No Up",description:"OSDs are not allowed to start",value:!1,clusterWide:!1,indeterminate:!1},{code:"nodown",name:"No Down",description:"OSD failure reports are being ignored, such that the monitors will not mark OSDs down",value:!1,clusterWide:!1,indeterminate:!1},{code:"noin",name:"No In",description:"OSDs that were previously marked out will not be marked back in when they start",value:!1,clusterWide:!1,indeterminate:!1},{code:"noout",name:"No Out",description:"OSDs will not automatically be marked out after the configured interval",value:!1,clusterWide:!1,indeterminate:!1}],this.clusterWideTooltip="The flag has been enabled for the entire cluster.",this.permissions=this.authStorageService.getPermissions()}ngOnInit(){const t=this.selected.length;this.osdService.getFlags().subscribe(o=>{const l=this.getActivatedIndivFlags();this.flags.forEach(_=>{const M=l[_.code];o.includes(_.code)&&(_.clusterWide=!0),M===t?_.value=!0:M>0&&(_.indeterminate=!0)}),this.initialSelection=Er().cloneDeep(this.flags)})}getActivatedIndivFlags(){const t={};return this.flags.forEach(o=>{t[o.code]=0}),[].concat(...this.selected.map(o=>o.state)).map(o=>{Object.keys(t).includes(o)&&(t[o]=t[o]+1)}),t}changeValue(t){t.value=!t.value,t.indeterminate=!1}resetSelection(){this.flags=Er().cloneDeep(this.initialSelection)}submitAction(){const t={};this.flags.forEach(l=>{t[l.code]=l.indeterminate?null:l.value});const o=this.selected.map(l=>l.osd);this.osdService.updateIndividualFlags(t,o).subscribe(()=>{this.notificationService.show(Sa.k.success,"Updated OSD Flags"),this.activeModal.close()},()=>{this.activeModal.close()})}}return n.\u0275fac=function(t){return new(t||n)(e.Y36(Dr.Kz),e.Y36(Mo.p4),e.Y36(zi.j),e.Y36(cc),e.Y36(Sl.g))},n.\u0275cmp=e.Xpm({type:n,selectors:[["cd-osd-flags-indiv-modal"]],decls:12,vars:6,consts:function(){let s,t,o;return s="Individual OSD Flags",t="Restore previous selection",o="Cluster-wide",[[3,"modalRef"],[1,"modal-title"],s,[1,"modal-content"],["name","osdFlagsForm","novalidate","",3,"formGroup"],["formDir","ngForm"],[1,"modal-body","osd-modal"],["class","custom-control custom-checkbox",4,"ngFor","ngForOf"],[1,"modal-footer"],["type","button",1,"btn","btn-light",3,"click"],t,[3,"form","showSubmit","submitText","submitActionEvent"],[1,"custom-control","custom-checkbox"],["type","checkbox",1,"custom-control-input",3,"checked","indeterminate","name","id","change"],["ng-class","['tc_' + key]",1,"custom-control-label",3,"for"],["class","badge badge-hdd ms-2",3,"ngbTooltip",4,"ngIf"],[1,"form-text","text-muted"],["class","m-1",4,"ngIf"],[1,"badge","badge-hdd","ms-2",3,"ngbTooltip"],o,[1,"m-1"]]},template:function(t,o){1&t&&(e.TgZ(0,"cd-modal",0),e.ynx(1,1),e.SDv(2,2),e.BQk(),e.ynx(3,3),e.TgZ(4,"form",4,5)(6,"div",6),e.YNc(7,om,10,9,"div",7),e.qZA(),e.TgZ(8,"div",8)(9,"button",9),e.NdJ("click",function(){return o.resetSelection()}),e.SDv(10,10),e.qZA(),e.TgZ(11,"cd-form-button-panel",11),e.NdJ("submitActionEvent",function(){return o.submitAction()}),e.qZA()()(),e.BQk(),e.qZA()),2&t&&(e.Q6J("modalRef",o.activeModal),e.xp6(4),e.Q6J("formGroup",o.osdFlagsForm),e.xp6(3),e.Q6J("ngForOf",o.flags),e.xp6(4),e.Q6J("form",o.osdFlagsForm)("showSubmit",o.permissions.osd.update)("submitText",o.actionLabels.UPDATE))},directives:[Fe.z,_n._Y,_n.JL,Ma.V,_n.sg,p.sg,_e.o,Il.b,p.O5,Dr._L,Cl.p],styles:[""]}),n})();var N_=i(84333);function Nm(n,s){1&n&&e._UZ(0,"hr",15)}function nh(n,s){if(1&n){const t=e.EpF();e.TgZ(0,"div",10)(1,"input",11),e.NdJ("change",function(){const _=e.CHM(t).$implicit;return _.value=!_.value}),e.qZA(),e.TgZ(2,"label",12)(3,"strong"),e._uU(4),e.qZA(),e._UZ(5,"br"),e.TgZ(6,"span",13),e._uU(7),e.qZA()(),e.YNc(8,Nm,1,0,"hr",14),e.qZA()}if(2&n){const t=s.$implicit,o=s.last;e.xp6(1),e.Q6J("checked",t.value)("name",t.code)("id",t.code)("disabled",t.disabled),e.xp6(1),e.Q6J("for",t.code),e.xp6(2),e.Oqu(t.name),e.xp6(3),e.Oqu(t.description),e.xp6(1),e.Q6J("ngIf",!o)}}let gv=(()=>{class n{constructor(t,o,l,_,M){this.activeModal=t,this.actionLabels=o,this.authStorageService=l,this.osdService=_,this.notificationService=M,this.osdFlagsForm=new _n.cw({}),this.allFlags={noin:{code:"noin",name:"No In",value:!1,description:"OSDs that were previously marked out will not be marked back in when they start"},noout:{code:"noout",name:"No Out",value:!1,description:"OSDs will not automatically be marked out after the configured interval"},noup:{code:"noup",name:"No Up",value:!1,description:"OSDs are not allowed to start"},nodown:{code:"nodown",name:"No Down",value:!1,description:"OSD failure reports are being ignored, such that the monitors will not mark OSDs down"},pause:{code:"pause",name:"Pause",value:!1,description:"Pauses reads and writes"},noscrub:{code:"noscrub",name:"No Scrub",value:!1,description:"Scrubbing is disabled"},"nodeep-scrub":{code:"nodeep-scrub",name:"No Deep Scrub",value:!1,description:"Deep Scrubbing is disabled"},nobackfill:{code:"nobackfill",name:"No Backfill",value:!1,description:"Backfilling of PGs is suspended"},norebalance:{code:"norebalance",name:"No Rebalance",value:!1,description:"OSD will choose not to backfill unless PG is also degraded"},norecover:{code:"norecover",name:"No Recover",value:!1,description:"Recovery of PGs is suspended"},sortbitwise:{code:"sortbitwise",name:"Bitwise Sort",value:!1,description:"Use bitwise sort",disabled:!0},purged_snapdirs:{code:"purged_snapdirs",name:"Purged Snapdirs",value:!1,description:"OSDs have converted snapsets",disabled:!0},recovery_deletes:{code:"recovery_deletes",name:"Recovery Deletes",value:!1,description:"Deletes performed during recovery instead of peering",disabled:!0},pglog_hardlimit:{code:"pglog_hardlimit",name:"PG Log Hard Limit",value:!1,description:"Puts a hard limit on pg log length",disabled:!0}},this.unknownFlags=[],this.permissions=this.authStorageService.getPermissions()}ngOnInit(){this.osdService.getFlags().subscribe(t=>{t.forEach(o=>{this.allFlags[o]?this.allFlags[o].value=!0:this.unknownFlags.push(o)}),this.flags=Er().toArray(this.allFlags)})}submitAction(){const t=this.flags.filter(o=>o.value).map(o=>o.code).concat(this.unknownFlags);this.osdService.updateFlags(t).subscribe(()=>{this.notificationService.show(Sa.k.success,"Updated OSD Flags"),this.activeModal.close()},()=>{this.activeModal.close()})}}return n.\u0275fac=function(t){return new(t||n)(e.Y36(Dr.Kz),e.Y36(Mo.p4),e.Y36(zi.j),e.Y36(cc),e.Y36(Sl.g))},n.\u0275cmp=e.Xpm({type:n,selectors:[["cd-osd-flags-modal"]],decls:10,vars:6,consts:function(){let s;return s="Cluster-wide OSD Flags",[[3,"modalRef"],[1,"modal-title"],s,[1,"modal-content"],["name","osdFlagsForm","novalidate","","cdFormScope","osd",3,"formGroup"],["formDir","ngForm"],[1,"modal-body","osd-modal"],["class","custom-control custom-checkbox",4,"ngFor","ngForOf"],[1,"modal-footer"],[3,"form","showSubmit","submitText","submitActionEvent"],[1,"custom-control","custom-checkbox"],["type","checkbox",1,"custom-control-input",3,"checked","name","id","disabled","change"],["ng-class","['tc_' + key]",1,"custom-control-label",3,"for"],[1,"form-text","text-muted"],["class","m-1",4,"ngIf"],[1,"m-1"]]},template:function(t,o){1&t&&(e.TgZ(0,"cd-modal",0),e.ynx(1,1),e.SDv(2,2),e.BQk(),e.ynx(3,3),e.TgZ(4,"form",4,5)(6,"div",6),e.YNc(7,nh,9,8,"div",7),e.qZA(),e.TgZ(8,"div",8)(9,"cd-form-button-panel",9),e.NdJ("submitActionEvent",function(){return o.submitAction()}),e.qZA()()(),e.BQk(),e.qZA()),2&t&&(e.Q6J("modalRef",o.activeModal),e.xp6(4),e.Q6J("formGroup",o.osdFlagsForm),e.xp6(3),e.Q6J("ngForOf",o.flags),e.xp6(2),e.Q6J("form",o.osdFlagsForm)("showSubmit",o.permissions.osd.update)("submitText",o.actionLabels.UPDATE))},directives:[Fe.z,_n._Y,_n.JL,N_.T,Ma.V,_n.sg,p.sg,_e.o,Il.b,p.O5,Cl.p],styles:[""]}),n})();function V_(n,s){if(1&n&&(e.TgZ(0,"cd-helper"),e._uU(1),e.qZA()),2&n){const t=e.oxw(2).$implicit;e.xp6(1),e.hij(" ",t.long_desc,"")}}function fg(n,s){if(1&n&&(e.TgZ(0,"div",4)(1,"label",5)(2,"b"),e._uU(3),e.qZA(),e._UZ(4,"br"),e.TgZ(5,"span",6),e._uU(6),e.YNc(7,V_,2,1,"cd-helper",7),e.qZA()(),e.TgZ(8,"div",8)(9,"div",9),e._UZ(10,"input",10)(11,"label",11),e.qZA()()()),2&n){const t=e.oxw().$implicit;e.xp6(1),e.Q6J("for",t.name),e.xp6(2),e.Oqu(t.text),e.xp6(3),e.hij(" ",t.desc," "),e.xp6(1),e.Q6J("ngIf",t.long_desc),e.xp6(3),e.Q6J("id",t.name)("formControlName",t.name),e.xp6(1),e.Q6J("for",t.name)}}function pg(n,s){if(1&n&&(e.TgZ(0,"cd-helper"),e._uU(1),e.qZA()),2&n){const t=e.oxw(2).$implicit;e.xp6(1),e.hij(" ",t.long_desc,"")}}const wg=function(n){return[n]};function xg(n,s){if(1&n){const t=e.EpF();e.TgZ(0,"button",16),e.NdJ("click",function(){e.CHM(t);const l=e.oxw(2).$implicit;return e.oxw().resetValue(l.name)}),e._UZ(1,"i",17),e.qZA()}if(2&n){const t=e.oxw(3);e.xp6(1),e.Q6J("ngClass",e.VKq(1,wg,t.icons.erase))}}function Rg(n,s){if(1&n&&(e.TgZ(0,"span",18),e._uU(1),e.qZA()),2&n){const t=e.oxw(2).$implicit;e.xp6(1),e.hij(" ",t.additionalTypeInfo.patternHelpText,"")}}function Z_(n,s){if(1&n&&(e.TgZ(0,"span",18),e._uU(1),e.qZA()),2&n){const t=e.oxw(2).$implicit;e.xp6(1),e.hij(" ",t.additionalTypeInfo.patternHelpText,"")}}function Ng(n,s){if(1&n&&(e.TgZ(0,"span",18),e.SDv(1,19),e.qZA()),2&n){const t=e.oxw(2).$implicit;e.xp6(1),e.pQV(t.maxValue),e.QtT(1)}}function Pg(n,s){if(1&n&&(e.TgZ(0,"span",18),e.SDv(1,20),e.qZA()),2&n){const t=e.oxw(2).$implicit;e.xp6(1),e.pQV(t.minValue),e.QtT(1)}}function O1(n,s){if(1&n&&(e.TgZ(0,"div",4)(1,"label",5),e._uU(2),e._UZ(3,"br"),e.TgZ(4,"span",6),e._uU(5),e.YNc(6,pg,2,1,"cd-helper",7),e.qZA()(),e.TgZ(7,"div",8)(8,"div",12),e._UZ(9,"input",13),e.YNc(10,xg,2,3,"button",14),e.qZA(),e.YNc(11,Rg,2,1,"span",15),e.YNc(12,Z_,2,1,"span",15),e.YNc(13,Ng,2,1,"span",15),e.YNc(14,Pg,2,1,"span",15),e.qZA()()),2&n){const t=e.oxw().$implicit,o=e.oxw();e.xp6(1),e.Q6J("for",t.name),e.xp6(1),e.hij("",t.text," "),e.xp6(3),e.hij(" ",t.desc," "),e.xp6(1),e.Q6J("ngIf",t.long_desc),e.xp6(3),e.Q6J("type",t.additionalTypeInfo.inputType)("id",t.name)("placeholder",t.additionalTypeInfo.humanReadable)("formControlName",t.name)("step",o.getStep(t.type,o.optionsForm.getValue(t.name))),e.xp6(1),e.Q6J("ngIf",o.optionsFormShowReset),e.xp6(1),e.Q6J("ngIf",o.optionsForm.showError(t.name,o.optionsFormDir,"pattern")),e.xp6(1),e.Q6J("ngIf",o.optionsForm.showError(t.name,o.optionsFormDir,"invalidUuid")),e.xp6(1),e.Q6J("ngIf",o.optionsForm.showError(t.name,o.optionsFormDir,"max")),e.xp6(1),e.Q6J("ngIf",o.optionsForm.showError(t.name,o.optionsFormDir,"min"))}}function ip(n,s){1&n&&e._UZ(0,"hr",21)}function Pm(n,s){if(1&n&&(e.TgZ(0,"div"),e.YNc(1,fg,12,7,"div",2),e.YNc(2,O1,15,14,"div",2),e.YNc(3,ip,1,0,"hr",3),e.qZA()),2&n){const t=s.$implicit,o=s.last;e.xp6(1),e.Q6J("ngIf","bool"===t.type),e.xp6(1),e.Q6J("ngIf","bool"!==t.type),e.xp6(1),e.Q6J("ngIf",!o)}}let A1=(()=>{class n{constructor(t){this.configService=t,this.optionNames=[],this.optionsForm=new tc.d({}),this.optionsFormDir=new _n.F([],[]),this.optionsFormGroupName="",this.optionsFormShowReset=!0,this.icons=No.P,this.options=[],this.optionsFormGroup=new tc.d({})}static optionNameToText(t){const o=["mon","mgr","osd","mds","client"];return t.split("_").filter((l,_)=>0!==_||!o.includes(l)).map(l=>l.charAt(0).toUpperCase()+l.substring(1)).join(" ")}ngOnInit(){this.createForm(),this.loadStoredData()}createForm(){this.optionsForm.addControl(this.optionsFormGroupName,this.optionsFormGroup),this.optionNames.forEach(t=>{this.optionsFormGroup.addControl(t,new _n.NI(null))})}getStep(t,o){return Bu.getTypeStep(t,o)}loadStoredData(){this.configService.filter(this.optionNames).subscribe(t=>{this.options=t.map(o=>{const l=this.optionsForm.get(o.name),_=Bu.getTypeValidators(o);return o.additionalTypeInfo=Bu.getType(o.type),o.text=n.optionNameToText(o.name),o.value=Er().find(o.value,M=>"osd"===M.section),o.value&&l.setValue("bool"===o.additionalTypeInfo.name?"true"===o.value.value:o.value.value),_&&(o.patternHelpText=_.patternHelpText,"max"in _&&""!==_.max&&(o.maxValue=_.max),"min"in _&&""!==_.min&&(o.minValue=_.min),l.setValidators(_.validators)),o})})}saveValues(){const t={};return this.optionNames.forEach(o=>{const l=this.optionsForm.getValue(o);null!==l&&""!==l&&(t[o]={section:"osd",value:l})}),this.configService.bulkCreate({options:t})}resetValue(t){this.configService.delete(t,"osd").subscribe(()=>{this.optionsForm.get(t).reset()})}}return n.\u0275fac=function(t){return new(t||n)(e.Y36(kc.e))},n.\u0275cmp=e.Xpm({type:n,selectors:[["cd-config-option"]],inputs:{optionNames:"optionNames",optionsForm:"optionsForm",optionsFormDir:"optionsFormDir",optionsFormGroupName:"optionsFormGroupName",optionsFormShowReset:"optionsFormShowReset"},decls:2,vars:2,consts:function(){let s,t,o;return s="Remove the custom configuration value. The default configuration will be inherited and used instead.",t="The entered value is too high! It must not be greater than " + "\ufffd0\ufffd" + ".",o="The entered value is too low! It must not be lower than " + "\ufffd0\ufffd" + ".",[[3,"formGroup"],[4,"ngFor","ngForOf"],["class","form-group row pt-2",4,"ngIf"],["class","my-2",4,"ngIf"],[1,"form-group","row","pt-2"],[1,"cd-col-form-label",3,"for"],[1,"text-muted"],[4,"ngIf"],[1,"cd-col-form-input"],[1,"custom-control","custom-checkbox"],["type","checkbox",1,"custom-control-input",3,"id","formControlName"],[1,"custom-control-label",3,"for"],[1,"input-group"],[1,"form-control",3,"type","id","placeholder","formControlName","step"],["class","btn btn-light","type","button","data-toggle","button","title",s,3,"click",4,"ngIf"],["class","invalid-feedback",4,"ngIf"],["type","button","data-toggle","button","title",s,1,"btn","btn-light",3,"click"],["aria-hidden","true",3,"ngClass"],[1,"invalid-feedback"],t,o,[1,"my-2"]]},template:function(t,o){1&t&&(e.TgZ(0,"div",0),e.YNc(1,Pm,4,3,"div",1),e.qZA()),2&t&&(e.Q6J("formGroup",o.optionsFormGroup),e.xp6(1),e.Q6J("ngForOf",o.options))},directives:[_n.JL,_n.sg,Ma.V,p.sg,p.O5,al.P,Oe.S,_e.o,_n.Wl,Il.b,_n.JJ,_n.u,_n.Fj,p.mk],styles:[".custom-checkbox[_ngcontent-%COMP%]   label[_ngcontent-%COMP%], .custom-checkbox[_ngcontent-%COMP%]   input[_ngcontent-%COMP%]{cursor:pointer}.col-form-label[_ngcontent-%COMP%]{text-align:left}"]}),n})(),mv=(()=>{class n{}return n.basicOptions=["osd_scrub_during_recovery","osd_scrub_begin_hour","osd_scrub_end_hour","osd_scrub_begin_week_day","osd_scrub_end_week_day","osd_scrub_min_interval","osd_scrub_max_interval","osd_deep_scrub_interval","osd_scrub_auto_repair","osd_max_scrubs","osd_scrub_priority","osd_scrub_sleep"],n.advancedOptions=["osd_scrub_auto_repair_num_errors","osd_debug_deep_scrub_sleep","osd_deep_scrub_keys","osd_deep_scrub_large_omap_object_key_threshold","osd_deep_scrub_large_omap_object_value_sum_threshold","osd_deep_scrub_randomize_ratio","osd_deep_scrub_stride","osd_deep_scrub_update_digest_min_age","osd_requested_scrub_priority","osd_scrub_backoff_ratio","osd_scrub_chunk_max","osd_scrub_chunk_min","osd_scrub_cost","osd_scrub_interval_randomize_ratio","osd_scrub_invalid_stats","osd_scrub_load_threshold","osd_scrub_max_preemptions"],n})();const D1=["basicOptionsValues"],w1=["advancedOptionsValues"];function Im(n,s){if(1&n){const t=e.EpF();e.TgZ(0,"a",15),e.NdJ("click",function(){return e.CHM(t),e.oxw().advancedEnabled=!0}),e.SDv(1,16),e.qZA()}}function x1(n,s){if(1&n&&(e.TgZ(0,"div")(1,"h3",17),e.SDv(2,18),e.qZA(),e._UZ(3,"cd-config-option",7,19),e.qZA()),2&n){const t=e.oxw(),o=e.MAs(7);e.xp6(3),e.Q6J("optionNames",t.advancedOptions)("optionsForm",t.osdPgScrubForm)("optionsFormDir",o)("optionsFormGroupName","advancedFormGroup")}}let vv=(()=>{class n{constructor(t,o,l,_){this.activeModal=t,this.authStorageService=o,this.notificationService=l,this.actionLabels=_,this.basicOptions=mv.basicOptions,this.advancedOptions=mv.advancedOptions,this.advancedEnabled=!1,this.osdPgScrubForm=new tc.d({}),this.resource="PG scrub options",this.action=this.actionLabels.EDIT,this.permissions=this.authStorageService.getPermissions()}submitAction(){const t=[this.basicOptionsValues.saveValues()];this.advancedOptionsValues&&t.push(this.advancedOptionsValues.saveValues()),(0,Pu.D)(t).subscribe(()=>{this.notificationService.show(Sa.k.success,"Updated PG scrub options"),this.activeModal.close()},()=>{this.activeModal.close()})}}return n.\u0275fac=function(t){return new(t||n)(e.Y36(Dr.Kz),e.Y36(zi.j),e.Y36(Sl.g),e.Y36(Mo.p4))},n.\u0275cmp=e.Xpm({type:n,selectors:[["cd-osd-pg-scrub-modal"]],viewQuery:function(t,o){if(1&t&&(e.Gf(D1,7),e.Gf(w1,5)),2&t){let l;e.iGM(l=e.CRH())&&(o.basicOptionsValues=l.first),e.iGM(l=e.CRH())&&(o.advancedOptionsValues=l.first)}},decls:19,vars:21,consts:function(){let s,t,o;return s="" + "\ufffd0\ufffd" + " " + "\ufffd1\ufffd" + "",t="Advanced...",o="Advanced configuration options",[[3,"modalRef"],[1,"modal-title"],s,[1,"modal-content"],["novalidate","","cdFormScope","osd",3,"formGroup"],["formDir","ngForm"],[1,"modal-body","osd-modal"],[3,"optionNames","optionsForm","optionsFormDir","optionsFormGroupName"],["basicOptionsValues",""],[1,"row"],[1,"col-sm-12"],["class","pull-right margin-right-md",3,"click",4,"ngIf"],[4,"ngIf"],[1,"modal-footer"],[3,"form","showSubmit","submitText","submitActionEvent"],[1,"pull-right","margin-right-md",3,"click"],t,[1,"page-header"],o,["advancedOptionsValues",""]]},template:function(t,o){if(1&t&&(e.TgZ(0,"cd-modal",0),e.ynx(1,1),e.SDv(2,2),e.ALo(3,"titlecase"),e.ALo(4,"upperFirst"),e.BQk(),e.ynx(5,3),e.TgZ(6,"form",4,5)(8,"div",6),e._UZ(9,"cd-config-option",7,8),e.TgZ(11,"div",9)(12,"div",10),e.YNc(13,Im,2,0,"a",11),e.qZA()(),e.YNc(14,x1,5,4,"div",12),e.qZA(),e.TgZ(15,"div",13)(16,"cd-form-button-panel",14),e.NdJ("submitActionEvent",function(){return o.submitAction()}),e.ALo(17,"titlecase"),e.ALo(18,"upperFirst"),e.qZA()()(),e.BQk(),e.qZA()),2&t){const l=e.MAs(7);e.Q6J("modalRef",o.activeModal),e.xp6(4),e.pQV(e.lcZ(3,13,o.action))(e.lcZ(4,15,o.resource)),e.QtT(2),e.xp6(2),e.Q6J("formGroup",o.osdPgScrubForm),e.xp6(3),e.Q6J("optionNames",o.basicOptions)("optionsForm",o.osdPgScrubForm)("optionsFormDir",l)("optionsFormGroupName","basicFormGroup"),e.xp6(4),e.Q6J("ngIf",!o.advancedEnabled),e.xp6(1),e.Q6J("ngIf",o.advancedEnabled),e.xp6(2),e.Q6J("form",o.osdPgScrubForm)("showSubmit",o.permissions.configOpt.update)("submitText",e.lcZ(17,17,o.action)+" "+e.lcZ(18,19,o.resource))}},directives:[Fe.z,_n._Y,_n.JL,N_.T,Ma.V,_n.sg,A1,p.O5,Cl.p],pipes:[p.rS,gt.m],styles:[""]}),n})();function R1(n,s){if(1&n&&(e.TgZ(0,"option",22),e._uU(1),e.qZA()),2&n){const t=s.$implicit;e.Q6J("value",t.name),e.xp6(1),e.hij(" ",t.text," ")}}function iy(n,s){1&n&&(e.TgZ(0,"span",23),e.SDv(1,24),e.qZA())}function N1(n,s){if(1&n&&(e.TgZ(0,"cd-helper"),e._uU(1),e.qZA()),2&n){const t=e.oxw().$implicit;e.xp6(1),e.Oqu(t.value.desc)}}function P1(n,s){1&n&&(e.TgZ(0,"span",23),e.SDv(1,29),e.qZA())}function I1(n,s){if(1&n&&(e.TgZ(0,"span",23),e.SDv(1,30),e.qZA()),2&n){const t=e.oxw().$implicit;e.xp6(1),e.pQV(t.value.patternHelpText),e.QtT(1)}}function oy(n,s){if(1&n&&(e.TgZ(0,"span",23),e.SDv(1,31),e.qZA()),2&n){const t=e.oxw().$implicit;e.xp6(1),e.pQV(t.value.maxValue),e.QtT(1)}}function L1(n,s){if(1&n&&(e.TgZ(0,"span",23),e.SDv(1,32),e.qZA()),2&n){const t=e.oxw().$implicit;e.xp6(1),e.pQV(t.value.minValue),e.QtT(1)}}const sy=function(n){return{required:n}};function Lm(n,s){if(1&n&&(e.TgZ(0,"div",7)(1,"label",25)(2,"span",26),e._uU(3),e.qZA(),e.YNc(4,N1,2,1,"cd-helper",27),e.qZA(),e.TgZ(5,"div",10),e._UZ(6,"input",28),e.YNc(7,P1,2,0,"span",13),e.YNc(8,I1,2,1,"span",13),e.YNc(9,oy,2,1,"span",13),e.YNc(10,L1,2,1,"span",13),e.qZA()()),2&n){const t=s.$implicit,o=e.oxw(),l=e.MAs(5);e.xp6(1),e.Q6J("for",t.key),e.xp6(1),e.Q6J("ngClass",e.VKq(11,sy,o.osdRecvSpeedForm.getValue("customizePriority"))),e.xp6(1),e.hij(" ",t.value.text," "),e.xp6(1),e.Q6J("ngIf",t.value.desc),e.xp6(2),e.Q6J("id",t.key)("formControlName",t.key)("readonly",!o.osdRecvSpeedForm.getValue("customizePriority")),e.xp6(1),e.Q6J("ngIf",o.osdRecvSpeedForm.getValue("customizePriority")&&o.osdRecvSpeedForm.showError(t.key,l,"required")),e.xp6(1),e.Q6J("ngIf",o.osdRecvSpeedForm.getValue("customizePriority")&&o.osdRecvSpeedForm.showError(t.key,l,"pattern")),e.xp6(1),e.Q6J("ngIf",o.osdRecvSpeedForm.getValue("customizePriority")&&o.osdRecvSpeedForm.showError(t.key,l,"max")),e.xp6(1),e.Q6J("ngIf",o.osdRecvSpeedForm.getValue("customizePriority")&&o.osdRecvSpeedForm.showError(t.key,l,"min"))}}let yv=(()=>{class n{constructor(t,o,l,_,M,w){this.activeModal=t,this.actionLabels=o,this.authStorageService=l,this.configService=_,this.notificationService=M,this.osdService=w,this.priorities=[],this.priorityAttrs={},this.permissions=this.authStorageService.getPermissions(),this.priorities=this.osdService.osdRecvSpeedModalPriorities.KNOWN_PRIORITIES,this.osdRecvSpeedForm=new tc.d({priority:new _n.NI(null,{validators:[_n.kI.required]}),customizePriority:new _n.NI(!1)}),this.priorityAttrs={osd_max_backfills:{text:"Max Backfills",desc:"",patternHelpText:"",maxValue:void 0,minValue:void 0},osd_recovery_max_active:{text:"Recovery Max Active",desc:"",patternHelpText:"",maxValue:void 0,minValue:void 0},osd_recovery_max_single_start:{text:"Recovery Max Single Start",desc:"",patternHelpText:"",maxValue:void 0,minValue:void 0},osd_recovery_sleep:{text:"Recovery Sleep",desc:"",patternHelpText:"",maxValue:void 0,minValue:void 0}},Object.keys(this.priorityAttrs).forEach(N=>{this.osdRecvSpeedForm.addControl(N,new _n.NI(null,{validators:[_n.kI.required]}))})}ngOnInit(){this.configService.filter(Object.keys(this.priorityAttrs)).subscribe(t=>{const o=this.getCurrentValues(t);this.detectPriority(o.values,l=>{this.setPriority(l)}),this.setDescription(o.configOptions),this.setValidators(o.configOptions)})}detectPriority(t,o){const l=Er().find(this.priorities,_=>Er().isEqual(_.values,t));return this.osdRecvSpeedForm.controls.customizePriority.setValue(!1),l?o(l):4===Object.entries(t).length?(this.osdRecvSpeedForm.controls.customizePriority.setValue(!0),o(Object({name:"custom",text:"Custom",values:t}))):o(this.priorities[0])}getCurrentValues(t){const o={values:{},configOptions:[]};return t.forEach(l=>{o.configOptions.push(l),"value"in l?l.value.forEach(_=>{"osd"===_.section&&(o.values[l.name]=Number(_.value))}):"default"in l&&null!==l.default&&(o.values[l.name]=Number(l.default))}),o}setDescription(t){t.forEach(o=>{""!==o.desc&&(this.priorityAttrs[o.name].desc=o.desc)})}setPriority(t){const o=Er().find(this.priorities,l=>"custom"===l.name);"custom"===t.name?o||this.priorities.push(t):o&&this.priorities.splice(this.priorities.indexOf(o),1),this.osdRecvSpeedForm.controls.priority.setValue(t.name),Object.entries(t.values).forEach(([l,_])=>{this.osdRecvSpeedForm.controls[l].setValue(_)})}setValidators(t){t.forEach(o=>{const l=Bu.getTypeValidators(o);l?(l.validators.push(_n.kI.required),"max"in l&&""!==l.max&&(this.priorityAttrs[o.name].maxValue=l.max),"min"in l&&""!==l.min&&(this.priorityAttrs[o.name].minValue=l.min),this.priorityAttrs[o.name].patternHelpText=l.patternHelpText,this.osdRecvSpeedForm.controls[o.name].setValidators(l.validators)):this.osdRecvSpeedForm.controls[o.name].setValidators(_n.kI.required)})}onCustomizePriorityChange(){const t={};if(Object.keys(this.priorityAttrs).forEach(o=>{t[o]=this.osdRecvSpeedForm.getValue(o)}),this.osdRecvSpeedForm.getValue("customizePriority")){const o={name:"custom",text:"Custom",values:t};this.setPriority(o)}else this.detectPriority(t,o=>{this.setPriority(o)})}onPriorityChange(t){const o=Er().find(this.priorities,l=>l.name===t)||this.priorities[0];this.osdRecvSpeedForm.get("customizePriority").setValue(!1),this.setPriority(o)}submitAction(){const t={};Object.keys(this.priorityAttrs).forEach(o=>{t[o]={section:"osd",value:this.osdRecvSpeedForm.getValue(o)}}),this.configService.bulkCreate({options:t}).subscribe(()=>{this.notificationService.show(Sa.k.success,"Updated OSD recovery speed priority '" + this.osdRecvSpeedForm.getValue("priority") + "'"),this.activeModal.close()},()=>{this.activeModal.close()})}}return n.\u0275fac=function(t){return new(t||n)(e.Y36(Dr.Kz),e.Y36(Mo.p4),e.Y36(zi.j),e.Y36(kc.e),e.Y36(Sl.g),e.Y36(cc))},n.\u0275cmp=e.Xpm({type:n,selectors:[["cd-osd-recv-speed-modal"]],decls:24,vars:10,consts:function(){let s,t,o,l,_,M,w,N;return s="OSD Recovery Priority",t="Priority",o="Customize priority values",l="This field is required.",_="This field is required!",M="" + "\ufffd0\ufffd" + "",w="The entered value is too high! It must not be greater than " + "\ufffd0\ufffd" + ".",N="The entered value is too low! It must not be lower than " + "\ufffd0\ufffd" + ".",[[3,"modalRef"],[1,"modal-title"],s,[1,"modal-content"],["novalidate","","cdFormScope","osd",3,"formGroup"],["formDir","ngForm"],[1,"modal-body"],[1,"form-group","row"],["for","priority",1,"cd-col-form-label","required"],t,[1,"cd-col-form-input"],["formControlName","priority","id","priority",1,"form-select",3,"change"],[3,"value",4,"ngFor","ngForOf"],["class","invalid-feedback",4,"ngIf"],[1,"cd-col-form-offset"],[1,"custom-control","custom-checkbox"],["formControlName","customizePriority","id","customizePriority","name","customizePriority","type","checkbox",1,"custom-control-input",3,"change"],["for","customizePriority",1,"custom-control-label"],o,["class","form-group row",4,"ngFor","ngForOf"],[1,"modal-footer"],[3,"form","submitText","showSubmit","submitActionEvent"],[3,"value"],[1,"invalid-feedback"],l,[1,"cd-col-form-label",3,"for"],[3,"ngClass"],[4,"ngIf"],["type","number",1,"form-control",3,"id","formControlName","readonly"],_,M,w,N]},template:function(t,o){if(1&t&&(e.TgZ(0,"cd-modal",0),e.ynx(1,1),e.SDv(2,2),e.BQk(),e.ynx(3,3),e.TgZ(4,"form",4,5)(6,"div",6)(7,"div",7)(8,"label",8),e.SDv(9,9),e.qZA(),e.TgZ(10,"div",10)(11,"select",11),e.NdJ("change",function(_){return o.onPriorityChange(_.target.value)}),e.YNc(12,R1,2,2,"option",12),e.qZA(),e.YNc(13,iy,2,0,"span",13),e.qZA()(),e.TgZ(14,"div",7)(15,"div",14)(16,"div",15)(17,"input",16),e.NdJ("change",function(){return o.onCustomizePriorityChange()}),e.qZA(),e.TgZ(18,"label",17),e.SDv(19,18),e.qZA()()()(),e.YNc(20,Lm,11,13,"div",19),e.ALo(21,"keyvalue"),e.qZA(),e.TgZ(22,"div",20)(23,"cd-form-button-panel",21),e.NdJ("submitActionEvent",function(){return o.submitAction()}),e.qZA()()(),e.BQk(),e.qZA()),2&t){const l=e.MAs(5);e.Q6J("modalRef",o.activeModal),e.xp6(4),e.Q6J("formGroup",o.osdRecvSpeedForm),e.xp6(8),e.Q6J("ngForOf",o.priorities),e.xp6(1),e.Q6J("ngIf",o.osdRecvSpeedForm.showError("priority",l,"required")),e.xp6(7),e.Q6J("ngForOf",e.lcZ(21,8,o.priorityAttrs)),e.xp6(3),e.Q6J("form",o.osdRecvSpeedForm)("submitText",o.actionLabels.UPDATE)("showSubmit",o.permissions.configOpt.update)}},directives:[Fe.z,_n._Y,_n.JL,N_.T,Ma.V,_n.sg,al.P,_e.o,_n.EJ,_n.JJ,_n.u,p.sg,_n.YN,_n.Kr,p.O5,_n.Wl,Il.b,p.mk,Oe.S,_n.wV,_n.Fj,Cl.p],pipes:[p.Nd],styles:[""]}),n})();function ay(n,s){1&n&&(e.TgZ(0,"span"),e.SDv(1,15),e.qZA())}function cb(n,s){1&n&&(e.TgZ(0,"span"),e.SDv(1,16),e.qZA())}function ly(n,s){if(1&n&&(e.TgZ(0,"span",13),e.YNc(1,ay,2,0,"span",14),e.YNc(2,cb,2,0,"span",14),e.qZA()),2&n){const t=e.oxw();e.xp6(1),e.Q6J("ngIf",null==t.weight.errors?null:t.weight.errors.required),e.xp6(1),e.Q6J("ngIf",(null==t.weight.errors?null:t.weight.errors.max)||(null==t.weight.errors?null:t.weight.errors.min))}}let Ev=(()=>{class n{constructor(t,o,l,_){this.actionLabels=t,this.activeModal=o,this.osdService=l,this.fb=_,this.currentWeight=1}get weight(){return this.reweightForm.get("weight")}ngOnInit(){this.reweightForm=this.fb.group({weight:this.fb.control(this.currentWeight,[_n.kI.required])})}reweight(){this.osdService.reweight(this.osdId,this.reweightForm.value.weight).subscribe(()=>this.activeModal.close())}}return n.\u0275fac=function(t){return new(t||n)(e.Y36(Mo.p4),e.Y36(Dr.Kz),e.Y36(cc),e.Y36(zu.O))},n.\u0275cmp=e.Xpm({type:n,selectors:[["cd-osd-reweight-modal"]],decls:14,vars:7,consts:function(){let s,t,o;return s="Reweight OSD: " + "\ufffd0\ufffd" + "",t="This field is required.",o="The value needs to be between 0 and 1.",[[3,"modalRef"],[1,"modal-title"],s,[1,"modal-content"],[3,"formGroup"],[1,"modal-body"],[1,"row"],["for","weight",1,"cd-col-form-label"],[1,"cd-col-form-input"],["id","weight","type","number","step","0.1","formControlName","weight","min","0","max","1",1,"form-control",3,"value"],["class","invalid-feedback",4,"ngIf"],[1,"modal-footer"],[3,"form","submitText","submitActionEvent"],[1,"invalid-feedback"],[4,"ngIf"],t,o]},template:function(t,o){1&t&&(e.TgZ(0,"cd-modal",0),e.ynx(1,1),e.SDv(2,2),e.BQk(),e.ynx(3,3),e.TgZ(4,"form",4)(5,"div",5)(6,"div",6)(7,"label",7),e._uU(8,"Weight"),e.qZA(),e.TgZ(9,"div",8),e._UZ(10,"input",9),e.YNc(11,ly,3,2,"span",10),e.qZA()()(),e.TgZ(12,"div",11)(13,"cd-form-button-panel",12),e.NdJ("submitActionEvent",function(){return o.reweight()}),e.qZA()()(),e.BQk(),e.qZA()),2&t&&(e.Q6J("modalRef",o.activeModal),e.xp6(2),e.pQV(o.osdId),e.QtT(2),e.xp6(2),e.Q6J("formGroup",o.reweightForm),e.xp6(6),e.Q6J("value",o.currentWeight),e.xp6(1),e.Q6J("ngIf",o.weight.errors),e.xp6(2),e.Q6J("form",o.reweightForm)("submitText",o.actionLabels.REWEIGHT))},directives:[Fe.z,_n._Y,_n.JL,Ma.V,_n.sg,_e.o,_n.wV,_n.qQ,_n.Fd,_n.Fj,Il.b,_n.JJ,_n.u,p.O5,Cl.p],styles:[""]}),n})();var sm=i(86969);let uy=(()=>{class n{constructor(t,o,l,_,M){this.activeModal=t,this.actionLabels=o,this.osdService=l,this.notificationService=_,this.joinPipe=M,this.selected=[]}ngOnInit(){this.scrubForm=new _n.cw({})}scrub(){(0,Pu.D)(this.selected.map(t=>this.osdService.scrub(t,this.deep))).subscribe(()=>{this.notificationService.show(Sa.k.success,"" + (this.deep ? "Deep scrub" : "Scrub") + " was initialized in the following OSD(s): " + this.joinPipe.transform(this.selected) + ""),this.activeModal.close()},()=>this.activeModal.close())}}return n.\u0275fac=function(t){return new(t||n)(e.Y36(Dr.Kz),e.Y36(Mo.p4),e.Y36(cc),e.Y36(Sl.g),e.Y36(sm.A))},n.\u0275cmp=e.Xpm({type:n,selectors:[["cd-osd-scrub-modal"]],decls:13,vars:9,consts:function(){let s,t,o,l;return s="{VAR_SELECT, select, true {Deep } other {}}",s=e.Zx4(s,{VAR_SELECT:"\ufffd0\ufffd"}),t="OSDs " + s + "Scrub",o="{VAR_SELECT, select, true {deep } other {}}",o=e.Zx4(o,{VAR_SELECT:"\ufffd0\ufffd"}),l="You are about to apply a " + o + "scrub to the OSD(s): " + "\ufffd#9\ufffd" + "" + "\ufffd1\ufffd" + "" + "\ufffd/#9\ufffd" + ".",[[3,"modalRef"],[1,"modal-title"],t,[1,"modal-content"],["name","scrubForm","novalidate","",3,"formGroup"],["formDir","ngForm"],[1,"modal-body"],l,[1,"modal-footer"],[3,"form","submitText","submitActionEvent"]]},template:function(t,o){1&t&&(e.TgZ(0,"cd-modal",0)(1,"span",1),e.SDv(2,2),e.qZA(),e.ynx(3,3),e.TgZ(4,"form",4,5)(6,"div",6)(7,"p"),e.tHW(8,7),e._UZ(9,"strong"),e.ALo(10,"join"),e.N_p(),e.qZA()(),e.TgZ(11,"div",8)(12,"cd-form-button-panel",9),e.NdJ("submitActionEvent",function(){return o.scrub()}),e.qZA()()(),e.BQk(),e.qZA()),2&t&&(e.Q6J("modalRef",o.activeModal),e.xp6(2),e.pQV(o.deep),e.QtT(2),e.xp6(2),e.Q6J("formGroup",o.scrubForm),e.xp6(6),e.pQV(o.deep)(e.lcZ(10,7,o.selected)),e.QtT(8),e.xp6(2),e.Q6J("form",o.scrubForm)("submitText",o.actionLabels.UPDATE))},directives:[Fe.z,_n._Y,_n.JL,Ma.V,_n.sg,Cl.p],pipes:[sm.A],styles:[""]}),n})();var cy=i(60351);function db(n,s){if(1&n&&e._UZ(0,"cd-device-list",17),2&n){const t=e.oxw(2);e.Q6J("osdId",null==t.osd?null:t.osd.id)("hostname",null==t.selection?null:t.selection.host.name)("osdList",!0)}}function fb(n,s){if(1&n&&e._UZ(0,"cd-table-key-value",18),2&n){const t=e.oxw(2);e.Q6J("data",null==t.osd||null==t.osd.details?null:t.osd.details.osd_map)}}function dy(n,s){if(1&n){const t=e.EpF();e.TgZ(0,"cd-table-key-value",21),e.NdJ("fetchData",function(){return e.CHM(t),e.oxw(3).refresh()}),e.qZA()}if(2&n){const t=e.oxw(3);e.Q6J("data",null==t.osd||null==t.osd.details?null:t.osd.details.osd_metadata)}}function F1(n,s){1&n&&(e.TgZ(0,"cd-alert-panel",22),e.SDv(1,23),e.qZA())}function pb(n,s){if(1&n&&(e.YNc(0,dy,1,1,"cd-table-key-value",19),e.YNc(1,F1,2,0,"ng-template",null,20,e.W1O)),2&n){const t=e.MAs(2),o=e.oxw(2);e.Q6J("ngIf",null==o.osd||null==o.osd.details?null:o.osd.details.osd_metadata)("ngIfElse",t)}}function fy(n,s){if(1&n&&e._UZ(0,"cd-smart-list",24),2&n){const t=e.oxw(2);e.Q6J("osdId",null==t.osd?null:t.osd.id)}}function Ig(n,s){if(1&n&&e._UZ(0,"cd-table-performance-counter",26),2&n){const t=e.oxw(3);e.Q6J("serviceId",null==t.osd?null:t.osd.id)}}function py(n,s){if(1&n&&e.YNc(0,Ig,1,1,"cd-table-performance-counter",25),2&n){const t=e.oxw(2);e.Q6J("ngIf",null==t.osd?null:t.osd.details)}}function k1(n,s){if(1&n&&e._UZ(0,"cd-grafana",29),2&n){const t=e.oxw(3);e.Q6J("grafanaPath","osd-device-details?var-osd=osd."+t.osd.id)("type","metrics")}}function hy(n,s){1&n&&(e.ynx(0,27),e.TgZ(1,"a",4),e.SDv(2,28),e.qZA(),e.YNc(3,k1,1,2,"ng-template",6),e.BQk())}function $1(n,s){if(1&n&&(e.ynx(0),e.TgZ(1,"nav",1,2),e.ynx(3,3),e.TgZ(4,"a",4),e.SDv(5,5),e.qZA(),e.YNc(6,db,1,3,"ng-template",6),e.BQk(),e.ynx(7,7),e.TgZ(8,"a",4),e.SDv(9,8),e.qZA(),e.YNc(10,fb,1,1,"ng-template",6),e.BQk(),e.ynx(11,9),e.TgZ(12,"a",4),e.SDv(13,10),e.qZA(),e.YNc(14,pb,3,2,"ng-template",6),e.BQk(),e.ynx(15,11),e.TgZ(16,"a",4),e.SDv(17,12),e.qZA(),e.YNc(18,fy,1,1,"ng-template",6),e.BQk(),e.ynx(19,13),e.TgZ(20,"a",4),e.SDv(21,14),e.qZA(),e.YNc(22,py,1,1,"ng-template",6),e.BQk(),e.YNc(23,hy,4,0,"ng-container",15),e.qZA(),e._UZ(24,"div",16),e.BQk()),2&n){const t=e.MAs(2),o=e.oxw();e.xp6(23),e.Q6J("ngIf",o.grafanaPermission.read),e.xp6(1),e.Q6J("ngbNavOutlet",t)}}let Fm=(()=>{class n{constructor(t,o){this.osdService=t,this.authStorageService=o,this.grafanaPermission=this.authStorageService.getPermissions().grafana}ngOnChanges(){var t,o,l;(null===(t=this.osd)||void 0===t?void 0:t.id)!==(null===(o=this.selection)||void 0===o?void 0:o.id)&&(this.osd=this.selection),Er().isNumber(null===(l=this.osd)||void 0===l?void 0:l.id)&&this.refresh()}refresh(){this.osdService.getDetails(this.osd.id).subscribe(t=>{this.osd.details=t})}}return n.\u0275fac=function(t){return new(t||n)(e.Y36(cc),e.Y36(zi.j))},n.\u0275cmp=e.Xpm({type:n,selectors:[["cd-osd-details"]],inputs:{selection:"selection"},features:[e.TTD],decls:1,vars:1,consts:function(){let s,t,o,l,_,M,w,N;return s="Devices",t="Attributes (OSD map)",o="Metadata",l="Device health",_="Performance counter",M="Metadata not available",w="Performance Details",N="OSD details",[[4,"ngIf"],["ngbNav","","id","tabset-osd-details","cdStatefulTab","osd-details",1,"nav-tabs"],["nav","ngbNav"],["ngbNavItem","devices"],["ngbNavLink",""],s,["ngbNavContent",""],["ngbNavItem","attributes"],t,["ngbNavItem","metadata"],o,["ngbNavItem","device-health"],l,["ngbNavItem","performance-counter"],_,["ngbNavItem","performance-details",4,"ngIf"],[3,"ngbNavOutlet"],[3,"osdId","hostname","osdList"],[3,"data"],[3,"data","fetchData",4,"ngIf","ngIfElse"],["noMetaData",""],[3,"data","fetchData"],["type","warning"],M,[3,"osdId"],["serviceType","osd",3,"serviceId",4,"ngIf"],["serviceType","osd",3,"serviceId"],["ngbNavItem","performance-details"],w,["title",N,"uid","CrAHE0iZz","grafanaStyle","three",3,"grafanaPath","type"]]},template:function(t,o){1&t&&e.YNc(0,$1,25,2,"ng-container",0),2&t&&e.Q6J("ngIf",o.selection)},directives:[p.O5,Dr.Pz,kn.m,Dr.nv,Dr.Vx,Dr.uN,Gc,fo.b,Eo.G,Sp,cy.p,ha.F,Dr.tO],styles:[""]}),n})();const _y=["osdUsageTpl"],H1=["markOsdConfirmationTpl"],O=["criticalConfirmationTpl"],$=["reweightBodyTpl"],de=["safeToDestroyBodyTpl"],Ke=["deleteOsdExtraTpl"],$t=["flagsTpl"],mn=function(){return{read:!0}};function rr(n,s){if(1&n){const t=e.EpF();e.TgZ(0,"cd-table",13),e.NdJ("fetchData",function(){return e.CHM(t),e.oxw().getOsdList()})("setExpandedRow",function(l){return e.CHM(t),e.oxw().setExpandedRow(l)})("updateSelection",function(l){return e.CHM(t),e.oxw().updateSelection(l)}),e.TgZ(1,"div",14),e._UZ(2,"cd-table-actions",15)(3,"cd-table-actions",16),e.qZA(),e._UZ(4,"cd-osd-details",17),e.qZA()}if(2&n){const t=e.oxw();e.Q6J("data",t.osds)("columns",t.columns)("hasDetails",!0)("updateSelectionOnRefresh","never"),e.xp6(2),e.Q6J("permission",t.permissions.osd)("selection",t.selection)("tableActions",t.tableActions),e.xp6(1),e.Q6J("permission",e.DdM(11,mn))("selection",t.selection)("tableActions",t.clusterWideActions),e.xp6(1),e.Q6J("selection",t.expandedRow)}}function xr(n,s){1&n&&e._UZ(0,"cd-grafana",19),2&n&&e.Q6J("grafanaPath","osd-overview?")("type","metrics")}function Zr(n,s){1&n&&(e.ynx(0,2),e.TgZ(1,"a",3),e.SDv(2,18),e.qZA(),e.YNc(3,xr,1,2,"ng-template",5),e.BQk())}function io(n,s){if(1&n&&(e.ynx(0),e.tHW(1,20),e._UZ(2,"strong"),e.ALo(3,"join"),e._UZ(4,"strong"),e.N_p(),e.BQk()),2&n){const t=s.markActionDescription,o=s.osdIds;e.xp6(4),e.pQV(e.lcZ(3,2,o))(t),e.QtT(1)}}function ho(n,s){if(1&n&&(e.TgZ(0,"li"),e.SDv(1,28),e.ALo(2,"join"),e.qZA()),2&n){const t=e.oxw(2).active,o=e.oxw();e.xp6(2),e.pQV(o.selection.hasSingleSelection)(e.lcZ(2,3,t))(1===t.length),e.QtT(1)}}function So(n,s){if(1&n&&(e.TgZ(0,"li"),e.SDv(1,29),e.ALo(2,"join"),e.qZA()),2&n){const t=e.oxw(2).missingStats,o=e.oxw();e.xp6(2),e.pQV(o.selection.hasSingleSelection)(e.lcZ(2,2,t)),e.QtT(1)}}function bs(n,s){if(1&n&&(e.TgZ(0,"li"),e.SDv(1,30),e.ALo(2,"join"),e.qZA()),2&n){const t=e.oxw(2).storedPgs,o=e.oxw();e.xp6(2),e.pQV(o.selection.hasSingleSelection)(e.lcZ(2,2,t)),e.QtT(1)}}function aa(n,s){if(1&n&&(e.TgZ(0,"li"),e._uU(1),e.qZA()),2&n){const t=e.oxw(2).message;e.xp6(1),e.hij(" ",t," ")}}function Ea(n,s){if(1&n&&(e.TgZ(0,"div",23)(1,"cd-alert-panel",24)(2,"span"),e.SDv(3,25),e.qZA(),e._UZ(4,"br"),e.TgZ(5,"ul",26),e.YNc(6,ho,3,5,"li",27),e.YNc(7,So,3,4,"li",27),e.YNc(8,bs,3,4,"li",27),e.YNc(9,aa,2,1,"li",27),e.qZA()()()),2&n){const t=e.oxw(),o=t.actionDescription,l=t.active,_=t.missingStats,M=t.storedPgs,w=t.message,N=e.oxw();e.xp6(3),e.pQV(N.selection.hasSingleSelection)(o),e.QtT(3),e.xp6(3),e.Q6J("ngIf",l.length>0),e.xp6(1),e.Q6J("ngIf",_.length>0),e.xp6(1),e.Q6J("ngIf",M.length>0),e.xp6(1),e.Q6J("ngIf",w)}}function wl(n,s){if(1&n&&(e.TgZ(0,"div",23)(1,"cd-alert-panel",31)(2,"span"),e.SDv(3,32),e.qZA()()()),2&n){const t=e.oxw(2);e.xp6(3),e.pQV(t.selection.hasSingleSelection),e.QtT(3)}}function Ra(n,s){if(1&n&&(e.YNc(0,Ea,10,6,"div",21),e.YNc(1,wl,4,1,"div",21),e.ynx(2),e.tHW(3,22),e._UZ(4,"strong"),e.ALo(5,"join"),e._UZ(6,"strong"),e.N_p(),e.BQk()),2&n){const t=s.safeToPerform,o=s.actionDescription,l=s.osdIds;e.Q6J("ngIf",!t),e.xp6(1),e.Q6J("ngIf",t),e.xp6(5),e.pQV(e.lcZ(5,4,l))(o),e.QtT(3)}}function kl(n,s){if(1&n&&(e.TgZ(0,"span",35),e._uU(1),e.qZA()),2&n){const t=s.$implicit;e.xp6(1),e.Oqu(t)}}function Xl(n,s){if(1&n&&(e.TgZ(0,"span",36),e._uU(1),e.qZA()),2&n){const t=s.$implicit;e.xp6(1),e.Oqu(t)}}function Bf(n,s){if(1&n&&(e.YNc(0,kl,2,1,"span",33),e.YNc(1,Xl,2,1,"span",34)),2&n){const t=s.row;e.Q6J("ngForOf",t.cdClusterFlags),e.xp6(1),e.Q6J("ngForOf",t.cdIndivFlags)}}function lf(n,s){if(1&n&&e._UZ(0,"cd-usage-bar",37),2&n){const t=s.row,o=e.oxw();e.Q6J("title","osd "+t.osd)("total",t.stats.stat_bytes)("used",t.stats.stat_bytes_used)("warningThreshold",o.osdSettings.nearfull_ratio)("errorThreshold",o.osdSettings.full_ratio)}}function op(n,s){1&n&&(e.ynx(0,38)(1,39),e.TgZ(2,"div",40)(3,"div",41),e._UZ(4,"input",42),e.TgZ(5,"label",43),e.SDv(6,44),e.qZA()()(),e.BQk()()),2&n&&e.Q6J("formGroup",s.form)}let kh=(()=>{class n extends Mt.o{constructor(t,o,l,_,M,w,N,V,X,re){super(),this.authStorageService=t,this.osdService=o,this.dimlessBinaryPipe=l,this.modalService=_,this.urlBuilder=M,this.router=w,this.taskWrapper=N,this.actionLabels=V,this.notificationService=X,this.orchService=re,this.icons=No.P,this.osdSettings=new M1,this.selection=new sn.r,this.osds=[],this.disabledFlags=["sortbitwise","purged_snapdirs","recovery_deletes","pglog_hardlimit"],this.indivFlagNames=["noup","nodown","noin","noout"],this.actionOrchFeatures={create:[x.OSD_CREATE],delete:[x.OSD_DELETE]},this.permissions=this.authStorageService.getPermissions(),this.tableActions=[{name:this.actionLabels.CREATE,permission:"create",icon:No.P.add,click:()=>this.router.navigate([this.urlBuilder.getCreate()]),disable:oe=>this.getDisable("create",oe),canBePrimary:oe=>!oe.hasSelection},{name:this.actionLabels.EDIT,permission:"update",icon:No.P.edit,click:()=>this.editAction()},{name:this.actionLabels.FLAGS,permission:"update",icon:No.P.flag,click:()=>this.configureFlagsIndivAction(),disable:()=>!this.hasOsdSelected},{name:this.actionLabels.SCRUB,permission:"update",icon:No.P.analyse,click:()=>this.scrubAction(!1),disable:()=>!this.hasOsdSelected,canBePrimary:oe=>oe.hasSelection},{name:this.actionLabels.DEEP_SCRUB,permission:"update",icon:No.P.deepCheck,click:()=>this.scrubAction(!0),disable:()=>!this.hasOsdSelected},{name:this.actionLabels.REWEIGHT,permission:"update",click:()=>this.reweight(),disable:()=>!this.hasOsdSelected||!this.selection.hasSingleSelection,icon:No.P.reweight},{name:this.actionLabels.MARK_OUT,permission:"update",click:()=>this.showConfirmationModal("out",this.osdService.markOut),disable:()=>this.isNotSelectedOrInState("out"),icon:No.P.left},{name:this.actionLabels.MARK_IN,permission:"update",click:()=>this.showConfirmationModal("in",this.osdService.markIn),disable:()=>this.isNotSelectedOrInState("in"),icon:No.P.right},{name:this.actionLabels.MARK_DOWN,permission:"update",click:()=>this.showConfirmationModal("down",this.osdService.markDown),disable:()=>this.isNotSelectedOrInState("down"),icon:No.P.down},{name:this.actionLabels.MARK_LOST,permission:"delete",click:()=>this.showCriticalConfirmationModal("Mark","OSD lost","marked lost",oe=>this.osdService.safeToDestroy(JSON.stringify(oe)),"is_safe_to_destroy",this.osdService.markLost),disable:()=>this.isNotSelectedOrInState("up"),icon:No.P.flatten},{name:this.actionLabels.PURGE,permission:"delete",click:()=>this.showCriticalConfirmationModal("Purge","OSD","purged",oe=>this.osdService.safeToDestroy(JSON.stringify(oe)),"is_safe_to_destroy",oe=>(this.selection=new sn.r,this.osdService.purge(oe))),disable:()=>this.isNotSelectedOrInState("up"),icon:No.P.erase},{name:this.actionLabels.DESTROY,permission:"delete",click:()=>this.showCriticalConfirmationModal("destroy","OSD","destroyed",oe=>this.osdService.safeToDestroy(JSON.stringify(oe)),"is_safe_to_destroy",oe=>(this.selection=new sn.r,this.osdService.destroy(oe))),disable:()=>this.isNotSelectedOrInState("up"),icon:No.P.destroyCircle},{name:this.actionLabels.DELETE,permission:"delete",click:()=>this.delete(),disable:oe=>this.getDisable("delete",oe),icon:No.P.destroy}]}static collectStates(t){const o=[t.in?"in":"out"];return t.up?o.push("up"):t.state.includes("destroyed")?o.push("destroyed"):o.push("down"),o}ngOnInit(){this.clusterWideActions=[{name:"Flags",icon:No.P.flag,click:()=>this.configureFlagsAction(),permission:"read",visible:()=>this.permissions.osd.read},{name:"Recovery Priority",icon:No.P.deepCheck,click:()=>this.configureQosParamsAction(),permission:"read",visible:()=>this.permissions.configOpt.read},{name:"PG scrub",icon:No.P.analyse,click:()=>this.configurePgScrubAction(),permission:"read",visible:()=>this.permissions.configOpt.read}],this.columns=[{prop:"id",name:"ID",flexGrow:1,cellTransformation:wt.e.executing,customTemplateConfig:{valueClass:"bold"}},{prop:"host.name",name:"Host"},{prop:"collectedStates",name:"Status",flexGrow:1,cellTransformation:wt.e.badge,customTemplateConfig:{map:{in:{class:"badge-success"},up:{class:"badge-success"},down:{class:"badge-danger"},out:{class:"badge-danger"},destroyed:{class:"badge-danger"}}}},{prop:"tree.device_class",name:"Device class",flexGrow:1.2,cellTransformation:wt.e.badge,customTemplateConfig:{map:{hdd:{class:"badge-hdd"},ssd:{class:"badge-ssd"}}}},{prop:"stats.numpg",name:"PGs",flexGrow:1},{prop:"stats.stat_bytes",name:"Size",flexGrow:1,pipe:this.dimlessBinaryPipe},{prop:"state",name:"Flags",cellTemplate:this.flagsTpl},{prop:"stats.usage",name:"Usage",cellTemplate:this.osdUsageTpl},{prop:"stats_history.out_bytes",name:"Read bytes",cellTransformation:wt.e.sparkline},{prop:"stats_history.in_bytes",name:"Write bytes",cellTransformation:wt.e.sparkline},{prop:"stats.op_r",name:"Read ops",cellTransformation:wt.e.perSecond},{prop:"stats.op_w",name:"Write ops",cellTransformation:wt.e.perSecond}],this.orchService.status().subscribe(t=>this.orchStatus=t),this.osdService.getOsdSettings().pipe((0,g_.q)(1)).subscribe(t=>{this.osdSettings=t})}getDisable(t,o){if("delete"===t){if(!o.hasSelection)return!0;if(Er().some(this.getSelectedOsds(),_=>{const M=Er().get(_,"operational_status");return"deleting"===M||"unmanaged"===M}))return!0}return this.orchService.getTableActionDisableDesc(this.orchStatus,this.actionOrchFeatures[t])}getSelectedOsdIds(){const t=this.osds.map(o=>o.id);return this.selection.selected.map(o=>o.id).filter(o=>t.includes(o)).sort()}getSelectedOsds(){return this.osds.filter(t=>!Er().isUndefined(t)&&this.getSelectedOsdIds().includes(t.id))}get hasOsdSelected(){return this.getSelectedOsdIds().length>0}updateSelection(t){this.selection=t}isNotSelectedOrInState(t){const o=this.getSelectedOsds();if(0===o.length)return!0;switch(t){case"in":return o.some(l=>1===l.in);case"out":return o.some(l=>1!==l.in);case"down":return o.some(l=>1!==l.up);case"up":return o.some(l=>1===l.up)}}getOsdList(){const t=[this.osdService.getList(),this.osdService.getFlags()];(0,Pu.D)(t).subscribe(o=>{this.osds=o[0].map(l=>{l.collectedStates=n.collectStates(l),l.stats_history.out_bytes=l.stats_history.op_out_bytes.map(M=>M[1]),l.stats_history.in_bytes=l.stats_history.op_in_bytes.map(M=>M[1]),l.stats.usage=l.stats.stat_bytes_used/l.stats.stat_bytes,l.cdIsBinary=!0,l.cdIndivFlags=l.state.filter(M=>this.indivFlagNames.includes(M)),l.cdClusterFlags=o[1].filter(M=>!this.disabledFlags.includes(M));const _=Er().get(l,"operational_status","unmanaged");return"unmanaged"!==_&&"working"!==_&&(l.cdExecuting=_),l})})}editAction(){const t=Er().filter(this.osds,["id",this.selection.first().id]).pop();this.modalService.show($e.X,{titleText:"Edit OSD: " + t.id + "",fields:[{type:"text",name:"deviceClass",value:t.tree.device_class,label:"Device class",required:!0}],submitButtonText:"Edit OSD",onSubmit:o=>{this.osdService.update(t.id,o.deviceClass).subscribe(()=>{this.notificationService.show(Sa.k.success,"Updated OSD '" + t.id + "'"),this.getOsdList()})}})}scrubAction(t){if(!this.hasOsdSelected)return;const o={selected:this.getSelectedOsdIds(),deep:t};this.bsModalRef=this.modalService.show(uy,o)}configureFlagsAction(){this.bsModalRef=this.modalService.show(gv)}configureFlagsIndivAction(){const t={selected:this.getSelectedOsds()};this.bsModalRef=this.modalService.show(Hf,t)}showConfirmationModal(t,o){const l=this.getSelectedOsdIds();this.bsModalRef=this.modalService.show(od.Y,{titleText:"Mark OSD " + t + "",buttonText:"Mark " + t + "",bodyTpl:this.markOsdConfirmationTpl,bodyContext:{markActionDescription:t,osdIds:l},onSubmit:()=>{(0,Pu.D)(this.getSelectedOsdIds().map(_=>o.call(this.osdService,_))).subscribe(()=>this.bsModalRef.close())}})}reweight(){const t=this.osds.filter(o=>o.id===this.selection.first().id).pop();this.bsModalRef=this.modalService.show(Ev,{currentWeight:t.weight,osdId:t.id})}delete(){const t=new tc.d({preserve:new _n.NI(!1)});this.showCriticalConfirmationModal("delete","OSD","deleted",o=>this.osdService.safeToDelete(JSON.stringify(o)),"is_safe_to_delete",o=>(this.selection=new sn.r,this.taskWrapper.wrapTaskAroundCall({task:new Jl.R("osd/"+Mo.MQ.DELETE,{svc_id:o}),call:this.osdService.delete(o,t.value.preserve,!0)})),!0,t,this.deleteOsdExtraTpl)}showCriticalConfirmationModal(t,o,l,_,M,w,N=!1,V,X){_(this.getSelectedOsdIds()).subscribe(re=>{const oe=this.modalService.show(Oc.M,{actionDescription:t,itemDescription:o,bodyTemplate:this.criticalConfirmationTpl,bodyContext:{safeToPerform:re[M],message:re.message,active:re.active,missingStats:re.missing_stats,storedPgs:re.stored_pgs,actionDescription:l,osdIds:this.getSelectedOsdIds()},childFormGroup:V,childFormGroupTemplate:X,submitAction:()=>{const fe=(0,Pu.D)(this.getSelectedOsdIds().map(ve=>w.call(this.osdService,ve)));N?fe.subscribe({error:()=>{this.getOsdList(),oe.close()},complete:()=>oe.close()}):fe.subscribe(()=>{this.getOsdList(),oe.close()},()=>oe.close())}})})}configureQosParamsAction(){this.bsModalRef=this.modalService.show(yv)}configurePgScrubAction(){this.bsModalRef=this.modalService.show(vv,void 0,{size:"lg"})}}return n.\u0275fac=function(t){return new(t||n)(e.Y36(zi.j),e.Y36(cc),e.Y36(Ar.$),e.Y36(ru.Z),e.Y36(Q.F),e.Y36(Bo.F0),e.Y36(Sc.P),e.Y36(Mo.p4),e.Y36(Sl.g),e.Y36(h))},n.\u0275cmp=e.Xpm({type:n,selectors:[["cd-osd-list"]],viewQuery:function(t,o){if(1&t&&(e.Gf(_y,7),e.Gf(H1,7),e.Gf(O,7),e.Gf($,5),e.Gf(de,5),e.Gf(Ke,5),e.Gf($t,7)),2&t){let l;e.iGM(l=e.CRH())&&(o.osdUsageTpl=l.first),e.iGM(l=e.CRH())&&(o.markOsdConfirmationTpl=l.first),e.iGM(l=e.CRH())&&(o.criticalConfirmationTpl=l.first),e.iGM(l=e.CRH())&&(o.reweightBodyTpl=l.first),e.iGM(l=e.CRH())&&(o.safeToDestroyBodyTpl=l.first),e.iGM(l=e.CRH())&&(o.deleteOsdExtraTpl=l.first),e.iGM(l=e.CRH())&&(o.flagsTpl=l.first)}},features:[e._Bn([{provide:Q.F,useValue:new Q.F("osd")}]),e.qOj],decls:18,vars:2,consts:function(){let s,t,o,l,_,M,w,N,V,X,re,oe,fe,ve,Pe,De,Ie;return s="OSDs List",t="Overall Performance",o="OSD list",l="" + "[\ufffd#2\ufffd|\ufffd#4\ufffd]" + "OSD(s) " + "\ufffd0\ufffd" + "" + "[\ufffd/#2\ufffd|\ufffd/#4\ufffd]" + " will be marked " + "[\ufffd#2\ufffd|\ufffd#4\ufffd]" + "" + "\ufffd1\ufffd" + "" + "[\ufffd/#2\ufffd|\ufffd/#4\ufffd]" + " if you proceed.",l=e.Zx4(l),_="" + "[\ufffd#4\ufffd|\ufffd#6\ufffd]" + "OSD " + "\ufffd0\ufffd" + "" + "[\ufffd/#4\ufffd|\ufffd/#6\ufffd]" + " will be " + "[\ufffd#4\ufffd|\ufffd#6\ufffd]" + "" + "\ufffd1\ufffd" + "" + "[\ufffd/#4\ufffd|\ufffd/#6\ufffd]" + " if you proceed.",_=e.Zx4(_),M="{VAR_SELECT, select, true {OSD is} other {OSDs are}}",M=e.Zx4(M,{VAR_SELECT:"\ufffd0\ufffd"}),w=" The " + M + " not safe to be " + "\ufffd1\ufffd" + "! ",N="{VAR_SELECT, select, true {} other {{INTERPOLATION} : }}",N=e.Zx4(N,{VAR_SELECT:"\ufffd0\ufffd",INTERPOLATION:"\ufffd1\ufffd"}),V="{VAR_SELECT, select, true {it} other {them}}",V=e.Zx4(V,{VAR_SELECT:"\ufffd2\ufffd"}),X=" " + N + " Some PGs are currently mapped to " + V + ". ",re="{VAR_SELECT, select, true {} other {{INTERPOLATION} : }}",re=e.Zx4(re,{VAR_SELECT:"\ufffd0\ufffd",INTERPOLATION:"\ufffd1\ufffd"}),oe=" " + re + " There are no reported stats and not all PGs are active and clean. ",fe="{VAR_SELECT, select, true {OSD} other {{INTERPOLATION} : OSDs }}",fe=e.Zx4(fe,{VAR_SELECT:"\ufffd0\ufffd",INTERPOLATION:"\ufffd1\ufffd"}),ve=" " + fe + " still store some PG data and not all PGs are active and clean. ",Pe="{VAR_SELECT, select, true {OSD is} other {OSDs are}}",Pe=e.Zx4(Pe,{VAR_SELECT:"\ufffd0\ufffd"}),De=" The " + Pe + " safe to destroy without reducing data durability. ",Ie="Preserve OSD ID(s) for replacement.",[["ngbNav","",1,"nav-tabs"],["nav","ngbNav"],["ngbNavItem",""],["ngbNavLink",""],s,["ngbNavContent",""],["ngbNavItem","",4,"ngIf"],[3,"ngbNavOutlet"],["markOsdConfirmationTpl",""],["criticalConfirmationTpl",""],["flagsTpl",""],["osdUsageTpl",""],["deleteOsdExtraTpl",""],["selectionType","multiClick",3,"data","columns","hasDetails","updateSelectionOnRefresh","fetchData","setExpandedRow","updateSelection"],[1,"table-actions","btn-toolbar"],["id","osd-actions",1,"btn-group",3,"permission","selection","tableActions"],["dropDownOnly","Cluster-wide configuration","btnColor","light","id","cluster-wide-actions",1,"btn-group",3,"permission","selection","tableActions"],["cdTableDetail","",3,"selection"],t,["title",o,"uid","lo02I1Aiz","grafanaStyle","four",3,"grafanaPath","type"],l,["class","danger mb-3",4,"ngIf"],_,[1,"danger","mb-3"],["type","warning"],w,[1,"mb-0","ps-4"],[4,"ngIf"],X,oe,ve,["type","info"],De,["class","badge badge-hdd me-1",4,"ngFor","ngForOf"],["class","badge badge-info me-1",4,"ngFor","ngForOf"],[1,"badge","badge-hdd","me-1"],[1,"badge","badge-info","me-1"],[3,"title","total","used","warningThreshold","errorThreshold"],[3,"formGroup"],["formGroupName","child"],[1,"form-group"],[1,"custom-control","custom-checkbox"],["type","checkbox","name","preserve","id","preserve","formControlName","preserve",1,"custom-control-input"],["for","preserve",1,"custom-control-label"],Ie]},template:function(t,o){if(1&t&&(e.TgZ(0,"nav",0,1),e.ynx(2,2),e.TgZ(3,"a",3),e.SDv(4,4),e.qZA(),e.YNc(5,rr,5,12,"ng-template",5),e.BQk(),e.YNc(6,Zr,4,0,"ng-container",6),e.qZA(),e._UZ(7,"div",7),e.YNc(8,io,5,4,"ng-template",null,8,e.W1O),e.YNc(10,Ra,7,6,"ng-template",null,9,e.W1O),e.YNc(12,Bf,2,2,"ng-template",null,10,e.W1O),e.YNc(14,lf,1,5,"ng-template",null,11,e.W1O),e.YNc(16,op,7,1,"ng-template",null,12,e.W1O)),2&t){const l=e.MAs(1);e.xp6(6),e.Q6J("ngIf",o.permissions.grafana.read),e.xp6(1),e.Q6J("ngbNavOutlet",l)}},directives:[Dr.Pz,Dr.nv,Dr.Vx,Dr.uN,_r.a,bu.K,Fm,p.O5,ha.F,Dr.tO,Eo.G,p.sg,Eu.O,Ma.V,_n.JL,_n.sg,_n.x0,al.P,_e.o,_n.Wl,Il.b,_n.JJ,_n.u],pipes:[sm.A],styles:[""]}),n})();var Rp=i(9837);let rh=(()=>{class n{constructor(t,o){this.http=t,this.settingsService=o,this.baseURL="api/prometheus",this.settingsKey={alertmanager:"api/settings/alertmanager-api-host",prometheus:"api/settings/prometheus-api-host"}}ifAlertmanagerConfigured(t,o){this.settingsService.ifSettingConfigured(this.settingsKey.alertmanager,t,o)}disableAlertmanagerConfig(){this.settingsService.disableSetting(this.settingsKey.alertmanager)}ifPrometheusConfigured(t,o){this.settingsService.ifSettingConfigured(this.settingsKey.prometheus,t,o)}disablePrometheusConfig(){this.settingsService.disableSetting(this.settingsKey.prometheus)}getAlerts(t={}){return this.http.get(this.baseURL,{params:t})}getSilences(t={}){return this.http.get(`${this.baseURL}/silences`,{params:t})}getRules(t="all"){return this.http.get(`${this.baseURL}/rules`).pipe((0,Oa.U)(o=>(["alerting","rewrites"].includes(t)&&o.groups.map(l=>{l.rules=l.rules.filter(_=>_.type===t)}),o)))}setSilence(t){return this.http.post(`${this.baseURL}/silence`,t,{observe:"response"})}expireSilence(t){return this.http.delete(`${this.baseURL}/silence/${t}`,{observe:"response"})}getNotifications(t){return this.http.get(`${this.baseURL}/notifications?from=${t&&t.id?t.id:"last"}`)}}return n.\u0275fac=function(t){return new(t||n)(e.LFG(y.eN),e.LFG(Rp.g))},n.\u0275prov=e.Yz7({token:n,factory:n.\u0275fac,providedIn:"root"}),n})();var bv=i(61355);let gy=(()=>{class n{constructor(t){this.notificationService=t}sendNotifications(t){t.forEach(o=>this.notificationService.show(o))}convertToCustomAlerts(t){return Er().uniqWith(t.map(o=>({status:Er().isObject(o.status)?o.status.state:this.getPrometheusNotificationStatus(o),name:o.labels.alertname,url:o.generatorURL,description:o.annotations.description,fingerprint:Er().isObject(o.status)&&o.fingerprint})),Er().isEqual)}getPrometheusNotificationStatus(t){const o=t.status;return"firing"===o?"active":o}convertAlertToNotification(t){return new bv.T(this.formatType(t.status),`${t.name} (${t.status})`,this.appendSourceLink(t,t.description),void 0,"Prometheus")}formatType(t){return Sa.k[Er().findKey({error:["firing","active"],info:["suppressed","unprocessed"],success:["resolved"]},l=>l.includes(t))]}appendSourceLink(t,o){return`${o} <a href="${t.url}" target="_blank"><i class="${No.P.lineChart}"></i></a>`}}return n.\u0275fac=function(t){return new(t||n)(e.LFG(Sl.g))},n.\u0275prov=e.Yz7({token:n,factory:n.\u0275fac,providedIn:"root"}),n})(),am=(()=>{class n{constructor(t,o){this.alertFormatter=t,this.prometheusService=o,this.canAlertsBeNotified=!1,this.alerts=[],this.rules=[]}getAlerts(){this.prometheusService.ifAlertmanagerConfigured(()=>{this.prometheusService.getAlerts().subscribe(t=>this.handleAlerts(t),t=>{[404,504].includes(t.status)&&this.prometheusService.disableAlertmanagerConfig()})})}getRules(){this.prometheusService.ifPrometheusConfigured(()=>{this.prometheusService.getRules("alerting").subscribe(t=>{this.rules=t.groups.reduce((o,l)=>o.concat(l.rules.map(_=>(_.group=l.name,_))),[])})})}refresh(){this.getAlerts(),this.getRules()}handleAlerts(t){this.canAlertsBeNotified&&this.notifyOnAlertChanges(t,this.alerts),this.activeAlerts=Er().reduce(this.alerts,(o,l)=>"active"===l.status.state?++o:o,0),this.activeCriticalAlerts=Er().reduce(this.alerts,(o,l)=>"active"===l.status.state&&"critical"===l.labels.severity?++o:o,0),this.activeWarningAlerts=Er().reduce(this.alerts,(o,l)=>"active"===l.status.state&&"warning"===l.labels.severity?++o:o,0),this.alerts=t,this.canAlertsBeNotified=!0}notifyOnAlertChanges(t,o){const l=this.getChangedAlerts(this.alertFormatter.convertToCustomAlerts(t),this.alertFormatter.convertToCustomAlerts(o)),M=Er().filter(l,w=>"suppressed"!==w.status).map(w=>this.alertFormatter.convertAlertToNotification(w));this.alertFormatter.sendNotifications(M)}getChangedAlerts(t,o){return Er().differenceWith(t,o,Er().isEqual).concat(this.getVanishedAlerts(t,o))}getVanishedAlerts(t,o){return Er().differenceWith(o,t,(l,_)=>l.fingerprint===_.fingerprint).map(l=>(l.status="resolved",l))}}return n.\u0275fac=function(t){return new(t||n)(e.LFG(gy),e.LFG(rh))},n.\u0275prov=e.Yz7({token:n,factory:n.\u0275fac,providedIn:"root"}),n})(),B1=(()=>{class n extends Mt.o{constructor(t){super(),this.prometheusService=t,this.isPrometheusConfigured=!1,this.isAlertmanagerConfigured=!1}ngOnInit(){this.prometheusService.ifAlertmanagerConfigured(()=>{this.isAlertmanagerConfigured=!0}),this.prometheusService.ifPrometheusConfigured(()=>{this.isPrometheusConfigured=!0})}}return n.\u0275fac=function(t){return new(t||n)(e.Y36(rh))},n.\u0275dir=e.lG2({type:n,features:[e.qOj]}),n})();function hb(n,s){if(1&n&&(e.tHW(0,3,1),e._UZ(1,"small",10),e.N_p()),2&n){const t=e.oxw();e.xp6(1),e.pQV(t.prometheusAlertService.activeCriticalAlerts),e.QtT(0)}}function my(n,s){if(1&n&&(e.tHW(0,3,2),e._UZ(1,"small",11),e.N_p()),2&n){const t=e.oxw();e.xp6(1),e.pQV(t.prometheusAlertService.activeWarningAlerts),e.QtT(0)}}const U1=function(){return{exact:!0}};let vy=(()=>{class n{constructor(t){this.prometheusAlertService=t}}return n.\u0275fac=function(t){return new(t||n)(e.Y36(am))},n.\u0275cmp=e.Xpm({type:n,selectors:[["cd-prometheus-tabs"]],decls:12,vars:8,consts:function(){let s,t,o;return s="Alerts",t="Silences",o="Active Alerts " + "\ufffd*4:1\ufffd\ufffd#1:1\ufffd" + "" + "\ufffd0:1\ufffd" + "" + "[\ufffd/#1:1\ufffd\ufffd/*4:1\ufffd|\ufffd/#1:2\ufffd\ufffd/*5:2\ufffd]" + "" + "\ufffd*5:2\ufffd\ufffd#1:2\ufffd" + "" + "\ufffd0:2\ufffd" + "" + "[\ufffd/#1:1\ufffd\ufffd/*4:1\ufffd|\ufffd/#1:2\ufffd\ufffd/*5:2\ufffd]" + "",o=e.Zx4(o),[[1,"nav","nav-tabs"],[1,"nav-item"],["routerLink","/monitoring/active-alerts","routerLinkActive","active","ariaCurrentWhenActive","page",1,"nav-link",3,"routerLinkActiveOptions"],o,["class","badge badge-danger ms-1",4,"ngIf"],["class","badge badge-warning ms-1",4,"ngIf"],["routerLink","/monitoring/alerts","routerLinkActive","active","ariaCurrentWhenActive","page",1,"nav-link",3,"routerLinkActiveOptions"],s,["routerLink","/monitoring/silences","routerLinkActive","active","ariaCurrentWhenActive","page",1,"nav-link",3,"routerLinkActiveOptions"],t,[1,"badge","badge-danger","ms-1"],[1,"badge","badge-warning","ms-1"]]},template:function(t,o){1&t&&(e.TgZ(0,"ul",0)(1,"li",1)(2,"a",2),e.tHW(3,3),e.YNc(4,hb,2,1,"small",4),e.YNc(5,my,2,1,"small",5),e.N_p(),e.qZA()(),e.TgZ(6,"li",1)(7,"a",6),e.SDv(8,7),e.qZA()(),e.TgZ(9,"li",1)(10,"a",8),e.SDv(11,9),e.qZA()()()),2&t&&(e.xp6(2),e.Q6J("routerLinkActiveOptions",e.DdM(5,U1)),e.xp6(2),e.Q6J("ngIf",o.prometheusAlertService.activeCriticalAlerts>0),e.xp6(1),e.Q6J("ngIf",o.prometheusAlertService.activeWarningAlerts>0),e.xp6(2),e.Q6J("routerLinkActiveOptions",e.DdM(6,U1)),e.xp6(3),e.Q6J("routerLinkActiveOptions",e.DdM(7,U1)))},directives:[Bo.yS,Bo.Od,p.O5],styles:[""]}),n})();const _b=["externalLinkTpl"];function gb(n,s){1&n&&(e.TgZ(0,"cd-alert-panel",3),e.tHW(1,4),e._UZ(2,"cd-doc",5),e.N_p(),e.qZA())}function yy(n,s){if(1&n&&e._UZ(0,"cd-table-key-value",9),2&n){const t=e.oxw(2);e.Q6J("renderObjects",!0)("hideEmpty",!0)("appendParentKey",!1)("data",t.expandedRow)("customCss",t.customCss)("autoReload",!1)}}function mb(n,s){if(1&n){const t=e.EpF();e.TgZ(0,"cd-table",6),e.NdJ("setExpandedRow",function(l){return e.CHM(t),e.oxw().setExpandedRow(l)})("updateSelection",function(l){return e.CHM(t),e.oxw().updateSelection(l)}),e._UZ(1,"cd-table-actions",7),e.YNc(2,yy,1,6,"cd-table-key-value",8),e.qZA()}if(2&n){const t=e.oxw();e.Q6J("data",t.prometheusAlertService.alerts)("columns",t.columns)("forceIdentifier",!0)("customCss",t.customCss)("hasDetails",!0),e.xp6(1),e.Q6J("permission",t.permission)("selection",t.selection)("tableActions",t.tableActions),e.xp6(1),e.Q6J("ngIf",t.expandedRow)}}const IC=function(n){return[n]};function vb(n,s){if(1&n&&(e.TgZ(0,"a",10),e._UZ(1,"i",11),e._uU(2," Source"),e.qZA()),2&n){const t=s.value,o=e.oxw();e.Q6J("href",t,e.LSH),e.xp6(1),e.Q6J("ngClass",e.VKq(2,IC,o.icons.lineChart))}}let Ey=(()=>{class n extends B1{constructor(t,o,l,_){super(_),this.authStorageService=t,this.prometheusAlertService=o,this.urlBuilder=l,this.selection=new sn.r,this.icons=No.P,this.permission=this.authStorageService.getPermissions().prometheus,this.tableActions=[{permission:"create",canBePrimary:M=>M.hasSingleSelection,disable:M=>!M.hasSingleSelection||M.first().cdExecuting,icon:No.P.add,routerLink:()=>"/monitoring"+this.urlBuilder.getCreateFrom(this.selection.first().fingerprint),name:"Create Silence"}]}ngOnInit(){super.ngOnInit(),this.columns=[{name:"Name",prop:"labels.alertname",cellClass:"fw-bold",flexGrow:2},{name:"Summary",prop:"annotations.summary",flexGrow:3},{name:"Severity",prop:"labels.severity",flexGrow:1,cellTransformation:wt.e.badge,customTemplateConfig:{map:{critical:{class:"badge-danger"},warning:{class:"badge-warning"}}}},{name:"State",prop:"status.state",flexGrow:1,cellTransformation:wt.e.badge,customTemplateConfig:{map:{active:{class:"badge-info"},unprocessed:{class:"badge-warning"},suppressed:{class:"badge-dark"}}}},{name:"Started",prop:"startsAt",cellTransformation:wt.e.timeAgo,flexGrow:1},{name:"URL",prop:"generatorURL",flexGrow:1,sortable:!1,cellTemplate:this.externalLinkTpl}]}updateSelection(t){this.selection=t}}return n.\u0275fac=function(t){return new(t||n)(e.Y36(zi.j),e.Y36(am),e.Y36(Q.F),e.Y36(rh))},n.\u0275cmp=e.Xpm({type:n,selectors:[["cd-active-alert-list"]],viewQuery:function(t,o){if(1&t&&e.Gf(_b,7),2&t){let l;e.iGM(l=e.CRH())&&(o.externalLinkTpl=l.first)}},features:[e._Bn([{provide:Q.F,useValue:new Q.F("silences")}]),e.qOj],decls:5,vars:2,consts:function(){let s;return s="To see all active Prometheus alerts, please provide the URL to the API of Prometheus' Alertmanager as described in the " + "\ufffd#2\ufffd" + "" + "\ufffd/#2\ufffd" + ".",[["type","info",4,"ngIf"],["identifier","fingerprint","selectionType","single",3,"data","columns","forceIdentifier","customCss","hasDetails","setExpandedRow","updateSelection",4,"ngIf"],["externalLinkTpl",""],["type","info"],s,["section","prometheus"],["identifier","fingerprint","selectionType","single",3,"data","columns","forceIdentifier","customCss","hasDetails","setExpandedRow","updateSelection"],[1,"table-actions",3,"permission","selection","tableActions"],["cdTableDetail","",3,"renderObjects","hideEmpty","appendParentKey","data","customCss","autoReload",4,"ngIf"],["cdTableDetail","",3,"renderObjects","hideEmpty","appendParentKey","data","customCss","autoReload"],["target","_blank",3,"href"],[3,"ngClass"]]},template:function(t,o){1&t&&(e._UZ(0,"cd-prometheus-tabs"),e.YNc(1,gb,3,0,"cd-alert-panel",0),e.YNc(2,mb,3,9,"cd-table",1),e.YNc(3,vb,3,4,"ng-template",null,2,e.W1O)),2&t&&(e.xp6(1),e.Q6J("ngIf",!o.isAlertmanagerConfigured),e.xp6(1),e.Q6J("ngIf",o.isAlertmanagerConfigured))},directives:[vy,p.O5,Eo.G,gf.K,_r.a,bu.K,fo.b,p.mk],styles:[""]}),n})();var Sv=i(94088);function by(n,s){1&n&&(e.TgZ(0,"cd-alert-panel",2),e.tHW(1,3),e._UZ(2,"cd-doc",4),e.N_p(),e.qZA())}function Eb(n,s){if(1&n&&e._UZ(0,"cd-table-key-value",7),2&n){const t=e.oxw(2);e.Q6J("data",t.expandedRow)("renderObjects",!0)("hideKeys",t.hideKeys)}}function bb(n,s){if(1&n){const t=e.EpF();e.TgZ(0,"cd-table",5),e.NdJ("setExpandedRow",function(l){return e.CHM(t),e.oxw().setExpandedRow(l)})("updateSelection",function(l){return e.CHM(t),e.oxw().updateSelection(l)}),e.YNc(1,Eb,1,3,"cd-table-key-value",6),e.qZA()}if(2&n){const t=e.oxw();e.Q6J("data",t.prometheusAlertService.rules)("columns",t.columns)("selectionType","single")("hasDetails",!0),e.xp6(1),e.Q6J("ngIf",t.expandedRow)}}let Sb=(()=>{class n extends B1{constructor(t,o){super(o),this.prometheusAlertService=t,this.selection=new sn.r,this.hideKeys=["alerts","type"]}ngOnInit(){super.ngOnInit(),this.columns=[{prop:"name",name:"Name",cellClass:"fw-bold",flexGrow:2},{prop:"labels.severity",name:"Severity",flexGrow:1,cellTransformation:wt.e.badge,customTemplateConfig:{map:{critical:{class:"badge-danger"},warning:{class:"badge-warning"}}}},{prop:"group",name:"Group",flexGrow:1,cellTransformation:wt.e.badge},{prop:"duration",name:"Duration",pipe:new Sv.u,flexGrow:1},{prop:"query",name:"Query",isHidden:!0,flexGrow:1},{prop:"annotations.summary",name:"Summary",flexGrow:3}]}updateSelection(t){this.selection=t}}return n.\u0275fac=function(t){return new(t||n)(e.Y36(am),e.Y36(rh))},n.\u0275cmp=e.Xpm({type:n,selectors:[["cd-rules-list"]],features:[e.qOj],decls:3,vars:2,consts:function(){let s;return s="To see all configured Prometheus alerts, please provide the URL to the API of Prometheus as described in the " + "\ufffd#2\ufffd" + "" + "\ufffd/#2\ufffd" + ".",[["type","info",4,"ngIf"],[3,"data","columns","selectionType","hasDetails","setExpandedRow","updateSelection",4,"ngIf"],["type","info"],s,["section","prometheus"],[3,"data","columns","selectionType","hasDetails","setExpandedRow","updateSelection"],["cdTableDetail","",3,"data","renderObjects","hideKeys",4,"ngIf"],["cdTableDetail","",3,"data","renderObjects","hideKeys"]]},template:function(t,o){1&t&&(e._UZ(0,"cd-prometheus-tabs"),e.YNc(1,by,3,0,"cd-alert-panel",0),e.YNc(2,bb,2,5,"cd-table",1)),2&t&&(e.xp6(1),e.Q6J("ngIf",!o.isPrometheusConfigured),e.xp6(1),e.Q6J("ngIf",o.isPrometheusConfigured))},directives:[vy,p.O5,Eo.G,gf.K,_r.a,fo.b],styles:[""]}),n})();var Y1=i(26504);let j1=(()=>{class n{constructor(){this.valueAttributePath={alertname:"name",instance:"alerts.0.labels.instance",job:"alerts.0.labels.job",severity:"labels.severity"}}singleMatch(t,o){return this.multiMatch([t],o)}multiMatch(t,o){if(!t.some(l=>l.isRegex))return t.forEach(l=>{o=this.getMatchedRules(l,o)}),this.describeMatch(o)}getMatchedRules(t,o){const l=this.getAttributePath(t.name);return o.filter(_=>Er().get(_,l)===t.value)}describeMatch(t){let o=0;return t.forEach(l=>o+=l.alerts.length),{status:this.getMatchText(t.length,o),cssClass:o?"has-success":"has-warning"}}getAttributePath(t){return this.valueAttributePath[t]}getMatchText(t,o){const l={noRule:"Your matcher seems to match no currently defined rule or active alert.",noAlerts:"no active alerts",alert:"1 active alert",alerts:"" + o + " active alerts",rule:"Matches 1 rule",rules:"Matches " + t + " rules"};return t?"" + (t > 1 ? l.rules : l.rule) + " with " + (o ? o > 1 ? l.alerts : l.alert : l.noAlerts) + ".":l.noRule}}return n.\u0275fac=function(t){return new(t||n)},n.\u0275prov=e.Yz7({token:n,factory:n.\u0275fac,providedIn:"root"}),n})(),Tb=(()=>{class n{calculateDuration(t,o){const l=+t,_=+o,M=this.getDuration(Math.abs(l-_));return l>_?"-"+M:M}getDuration(t){const o=new Date(t),l=o.getUTCHours(),_=o.getUTCMinutes(),w=(N,V)=>N&&N+V;return[w(Math.floor(t/864e5),"d"),w(l,"h"),w(_,"m")].filter(N=>N).join(" ")}calculateDate(t,o,l){const _=+t;if(Er().isNaN(_))return;const M=this.getDurationMs(o)*(l?-1:1);return new Date(_+M)}getDurationMs(t){return 6e4*(60*(24*this.getNumbersFromString(t,"d")+this.getNumbersFromString(t,"h"))+this.getNumbersFromString(t,"m"))}getNumbersFromString(t,o){const l=t.match(new RegExp(`[0-9 ]+${o}`,"i"));return l?parseInt(l[0],10):0}}return n.\u0275fac=function(t){return new(t||n)},n.\u0275prov=e.Yz7({token:n,factory:n.\u0275fac,providedIn:"root"}),n})();function Cb(n,s){if(1&n&&(e.TgZ(0,"option",28),e._uU(1),e.qZA()),2&n){const t=s.$implicit;e.Q6J("value",t),e.xp6(1),e.hij(" ",t," ")}}function VA(n,s){1&n&&(e.TgZ(0,"span",29),e.SDv(1,30),e.qZA())}function LC(n,s){1&n&&(e.TgZ(0,"span",29),e.SDv(1,31),e.qZA())}function FC(n,s){if(1&n&&(e.TgZ(0,"div",32)(1,"span"),e._uU(2),e.qZA()()),2&n){const t=e.oxw();e.Gre("cd-col-form-offset ",t.matcherMatch.cssClass,""),e.xp6(1),e.Gre("text-muted ",t.matcherMatch.cssClass,""),e.xp6(1),e.hij(" ",t.matcherMatch.status," ")}}let Mb=(()=>{class n{constructor(t,o,l,_){this.formBuilder=t,this.silenceMatcher=o,this.activeModal=l,this.actionLabels=_,this.submitAction=new e.vpe,this.editMode=!1,this.nameAttributes=["alertname","instance","job","severity"],this.possibleValues=[],this.matcherMatch=void 0,this.valueClick=new xh.xQ,this.valueFocus=new xh.xQ,this.search=M=>(0,M_.T)(M.pipe(tp(200),(0,Rh.x)()),this.valueFocus,this.valueClick.pipe((0,np.h)(()=>!this.typeahead.isPopupOpen()))).pipe((0,Oa.U)(w=>(""===w?this.possibleValues:this.possibleValues.filter(N=>N.toLowerCase().indexOf(w.toLowerCase())>-1)).slice(0,10))),this.createForm(),this.subscribeToChanges()}createForm(){this.form=this.formBuilder.group({name:[null,[_n.kI.required]],value:[{value:"",disabled:!0},[_n.kI.required]],isRegex:new _n.NI(!1)})}subscribeToChanges(){this.form.get("name").valueChanges.subscribe(t=>{null!==t?(this.setPossibleValues(t),this.form.get("value").enable()):this.form.get("value").disable()}),this.form.get("value").valueChanges.subscribe(t=>{const o=this.form.value;o.value=t,this.matcherMatch=this.silenceMatcher.singleMatch(o,this.rules)})}setPossibleValues(t){this.possibleValues=Er().sortedUniq(this.rules.map(o=>Er().get(o,this.silenceMatcher.getAttributePath(t))).filter(o=>o))}getMode(){return this.editMode?this.actionLabels.EDIT:this.actionLabels.ADD}preFillControls(t){this.form.setValue(t)}onSubmit(){this.submitAction.emit(this.form.value),this.activeModal.close()}}return n.\u0275fac=function(t){return new(t||n)(e.Y36(zu.O),e.Y36(j1),e.Y36(Dr.Kz),e.Y36(Mo.p4))},n.\u0275cmp=e.Xpm({type:n,selectors:[["cd-silence-matcher-modal"]],viewQuery:function(t,o){if(1&t&&e.Gf(Dr.dR,7),2&t){let l;e.iGM(l=e.CRH())&&(o.typeahead=l.first)}},outputs:{submitAction:"submitAction"},decls:32,vars:11,consts:function(){let s,t,o,l,_,M,w,N;return s="{VAR_SELECT, select, true {Edit} other {Add}}",s=e.Zx4(s,{VAR_SELECT:"\ufffd0\ufffd"}),t="" + s + " Matcher",o="Name",l="-- Select an attribute to match against --",_="Value",M="Use regular expression",w="This field is required!",N="This field is required!",[[3,"modalRef"],[1,"modal-title"],t,[1,"modal-content"],["novalidate","",1,"form",3,"formGroup"],["formDir","ngForm"],[1,"modal-body"],[1,"form-group","row"],["for","name",1,"cd-col-form-label","required"],o,[1,"cd-col-form-input"],["id","name","formControlName","name","name","name",1,"form-select"],[3,"ngValue"],l,[3,"value",4,"ngFor","ngForOf"],["class","help-block",4,"ngIf"],["for","value",1,"cd-col-form-label","required"],_,["id","value","type","text","formControlName","value",1,"form-control",3,"ngbTypeahead","focus","click"],["instance","ngbTypeahead"],["id","match-state",3,"class",4,"ngIf"],[1,"cd-col-form-offset"],[1,"custom-control","custom-checkbox"],["type","checkbox","formControlName","isRegex","name","is-regex","id","is-regex",1,"custom-control-input"],["for","is-regex",1,"custom-control-label"],M,[1,"modal-footer"],[3,"form","submitText","submitActionEvent"],[3,"value"],[1,"help-block"],w,N,["id","match-state"]]},template:function(t,o){if(1&t&&(e.TgZ(0,"cd-modal",0)(1,"span",1),e.SDv(2,2),e.qZA(),e.ynx(3,3),e.TgZ(4,"form",4,5)(6,"div",6)(7,"div",7)(8,"label",8),e.SDv(9,9),e.qZA(),e.TgZ(10,"div",10)(11,"select",11)(12,"option",12),e.SDv(13,13),e.qZA(),e.YNc(14,Cb,2,2,"option",14),e.qZA(),e.YNc(15,VA,2,0,"span",15),e.qZA()(),e.TgZ(16,"div",7)(17,"label",16),e.SDv(18,17),e.qZA(),e.TgZ(19,"div",10)(20,"input",18,19),e.NdJ("focus",function(_){return o.valueFocus.next(_.target.value)})("click",function(_){return o.valueClick.next(_.target.value)}),e.qZA(),e.YNc(22,LC,2,0,"span",15),e.qZA(),e.YNc(23,FC,3,7,"div",20),e.qZA(),e.TgZ(24,"div",7)(25,"div",21)(26,"div",22),e._UZ(27,"input",23),e.TgZ(28,"label",24),e.SDv(29,25),e.qZA()()()()(),e.TgZ(30,"div",26)(31,"cd-form-button-panel",27),e.NdJ("submitActionEvent",function(){return o.onSubmit()}),e.qZA()()(),e.BQk(),e.qZA()),2&t){const l=e.MAs(5);e.Q6J("modalRef",o.activeModal),e.xp6(2),e.pQV(o.editMode),e.QtT(2),e.xp6(2),e.Q6J("formGroup",o.form),e.xp6(8),e.Q6J("ngValue",null),e.xp6(2),e.Q6J("ngForOf",o.nameAttributes),e.xp6(1),e.Q6J("ngIf",o.form.showError("name",l,"required")),e.xp6(5),e.Q6J("ngbTypeahead",o.search),e.xp6(2),e.Q6J("ngIf",o.form.showError("value",l,"required")),e.xp6(1),e.Q6J("ngIf",o.form.getValue("value")&&!o.form.getValue("isRegex")&&o.matcherMatch),e.xp6(8),e.Q6J("form",o.form)("submitText",o.getMode())}},directives:[Fe.z,_n._Y,_n.JL,Ma.V,_n.sg,al.P,_e.o,_n.EJ,_n.JJ,_n.u,_n.YN,_n.Kr,p.sg,p.O5,_n.Fj,Dr.dR,Il.b,_n.Wl,Cl.p],styles:[""]}),n})();var kC=i(52266);function Cf(n,s){1&n&&(e.TgZ(0,"i"),e._uU(1,"~"),e.qZA())}function Ob(n,s){1&n&&(e.TgZ(0,"i"),e._uU(1,"="),e.qZA())}function $C(n,s){if(1&n&&(e.TgZ(0,"span",51),e.YNc(1,Cf,2,0,"i",7),e.YNc(2,Ob,2,0,"i",7),e.qZA()),2&n){const t=e.oxw().$implicit,o=e.oxw().matcher;e.Q6J("ngbTooltip",t.tooltip),e.xp6(1),e.Q6J("ngIf",o[t.attribute]),e.xp6(1),e.Q6J("ngIf",!o[t.attribute])}}function HC(n,s){if(1&n&&(e.ynx(0),e._UZ(1,"input",52),e.BQk()),2&n){const t=e.oxw().$implicit,o=e.oxw(),l=o.index,_=o.matcher;e.xp6(1),e.hYB("id","matcher-",t.attribute,"-",l,""),e.Q6J("value",_[t.attribute])}}function Ab(n,s){if(1&n&&(e.ynx(0),e.YNc(1,$C,3,3,"span",50),e.YNc(2,HC,2,3,"ng-container",7),e.BQk()),2&n){const t=s.$implicit;e.xp6(1),e.Q6J("ngIf","isRegex"===t.attribute),e.xp6(1),e.Q6J("ngIf","isRegex"!==t.attribute)}}const Sy=function(n){return[n]};function Db(n,s){if(1&n){const t=e.EpF();e.TgZ(0,"div",46),e.YNc(1,Ab,3,2,"ng-container",34),e.TgZ(2,"button",47),e.NdJ("click",function(){const _=e.CHM(t).index;return e.oxw().showMatcherModal(_)}),e._UZ(3,"i",38),e.qZA(),e.TgZ(4,"button",48),e.NdJ("click",function(){const _=e.CHM(t).index;return e.oxw().deleteMatcher(_)}),e._UZ(5,"i",38),e.qZA()(),e._UZ(6,"span",49)}if(2&n){const t=s.index,o=e.oxw();e.xp6(1),e.Q6J("ngForOf",o.matcherConfig),e.xp6(1),e.MGl("id","matcher-edit-",t,""),e.xp6(1),e.Q6J("ngClass",e.VKq(5,Sy,o.icons.edit)),e.xp6(1),e.MGl("id","matcher-delete-",t,""),e.xp6(1),e.Q6J("ngClass",e.VKq(7,Sy,o.icons.trash))}}function wb(n,s){1&n&&(e.TgZ(0,"cd-helper"),e.SDv(1,53),e.qZA())}function km(n,s){1&n&&(e.TgZ(0,"span",54),e.SDv(1,55),e.qZA())}function BC(n,s){1&n&&(e.TgZ(0,"span",54),e.SDv(1,56),e.qZA())}function UC(n,s){1&n&&(e.TgZ(0,"span",54),e.SDv(1,57),e.qZA())}function xb(n,s){1&n&&(e.TgZ(0,"span",54),e.SDv(1,58),e.qZA())}function YC(n,s){1&n&&(e.TgZ(0,"span",54),e.SDv(1,59),e.qZA())}const Rb=function(n,s){return{"text-warning":n,"text-danger":s}};function ZA(n,s){if(1&n&&(e.TgZ(0,"h5",38)(1,"strong"),e.SDv(2,60),e.qZA()()),2&n){e.oxw();const t=e.MAs(4);e.Q6J("ngClass",e.WLB(1,Rb,!t.submitted,t.submitted))}}function Ty(n,s){1&n&&e.GkF(0)}const Cy=function(n,s){return{index:n,matcher:s}};function W_(n,s){if(1&n&&(e.TgZ(0,"span"),e.YNc(1,Ty,1,0,"ng-container",61),e.qZA()),2&n){const t=s.$implicit,o=s.index;e.oxw();const l=e.MAs(1);e.xp6(1),e.Q6J("ngTemplateOutlet",l)("ngTemplateOutletContext",e.WLB(2,Cy,o,t))}}function jC(n,s){if(1&n&&(e.TgZ(0,"div",62)(1,"span"),e._uU(2),e.qZA()()),2&n){const t=e.oxw();e.Gre("cd-col-form-offset ",t.matcherMatch.cssClass,""),e.xp6(1),e.Gre("text-muted ",t.matcherMatch.cssClass,""),e.xp6(1),e.hij(" ",t.matcherMatch.status," ")}}function Nb(n,s){if(1&n&&e._UZ(0,"cd-date-time-picker",63),2&n){const t=e.oxw();e.Q6J("control",t.form.get("startsAt"))("hasSeconds",!1)}}function J_(n,s){if(1&n&&e._UZ(0,"cd-date-time-picker",63),2&n){const t=e.oxw();e.Q6J("control",t.form.get("endsAt"))("hasSeconds",!1)}}const P_=function(n){return{"btn-warning":n}};let _p=(()=>{class n{constructor(t,o,l,_,M,w,N,V,X,re,oe){this.router=t,this.authStorageService=o,this.formBuilder=l,this.prometheusService=_,this.notificationService=M,this.route=w,this.timeDiff=N,this.modalService=V,this.silenceMatcher=X,this.actionLabels=re,this.succeededLabels=oe,this.icons=No.P,this.matchName="",this.matchValue="",this.recreate=!1,this.edit=!1,this.resource="silence",this.matchers=[],this.matcherMatch=void 0,this.matcherConfig=[{tooltip:"Attribute name",attribute:"name"},{tooltip:"Regular expression",attribute:"isRegex"},{tooltip:"Value",attribute:"value"}],this.datetimeFormat="YYYY-MM-DD HH:mm",this.isNavigate=!0,this.init()}init(){this.chooseMode(),this.authenticate(),this.createForm(),this.setupDates(),this.getData()}chooseMode(){this.edit=this.router.url.startsWith("/monitoring/silences/edit"),this.recreate=this.router.url.startsWith("/monitoring/silences/recreate"),this.action=this.edit?this.actionLabels.EDIT:this.recreate?this.actionLabels.RECREATE:this.actionLabels.CREATE}authenticate(){if(this.permission=this.authStorageService.getPermissions().prometheus,!this.permission.read||!(this.edit?this.permission.update:this.permission.create))throw new Y1._2}createForm(){const t=Me.h.custom("format",o=>!(""===o||Es()(o,this.datetimeFormat).isValid()));this.form=this.formBuilder.group({startsAt:["",[_n.kI.required,t]],duration:["2h",[_n.kI.min(1)]],endsAt:["",[_n.kI.required,t]],createdBy:[this.authStorageService.getUsername(),[_n.kI.required]],comment:[null,[_n.kI.required]]},{validators:Me.h.custom("matcherRequired",()=>0===this.matchers.length)})}setupDates(){const t=Es()().format(this.datetimeFormat);this.form.silentSet("startsAt",t),this.updateDate(),this.subscribeDateChanges()}updateDate(t){const o=Es()(this.form.getValue(t?"endsAt":"startsAt"),this.datetimeFormat).toDate(),l=this.timeDiff.calculateDate(o,this.form.getValue("duration"),t);if(l){const _=Es()(l).format(this.datetimeFormat);this.form.silentSet(t?"startsAt":"endsAt",_)}}subscribeDateChanges(){this.form.get("startsAt").valueChanges.subscribe(()=>{this.onDateChange()}),this.form.get("duration").valueChanges.subscribe(()=>{this.updateDate()}),this.form.get("endsAt").valueChanges.subscribe(()=>{this.onDateChange(!0)})}onDateChange(t){const o=Es()(this.form.getValue("startsAt"),this.datetimeFormat),l=Es()(this.form.getValue("endsAt"),this.datetimeFormat);o.isBefore(l)?this.updateDuration():this.updateDate(t)}updateDuration(){const t=Es()(this.form.getValue("startsAt"),this.datetimeFormat).toDate(),o=Es()(this.form.getValue("endsAt"),this.datetimeFormat).toDate();this.form.silentSet("duration",this.timeDiff.calculateDuration(t,o))}getData(){this.getRules(),this.getModeSpecificData()}getRules(){return this.prometheusService.ifPrometheusConfigured(()=>this.prometheusService.getRules().subscribe(t=>{this.rules=t.groups.reduce((o,l)=>Er().concat(o,l.rules),[])},()=>{this.prometheusService.disablePrometheusConfig(),this.rules=[]}),()=>{this.rules=[],this.notificationService.show(Sa.k.info,"Please add your Prometheus host to the dashboard configuration and refresh the page",void 0,void 0,"Prometheus")}),this.rules}getModeSpecificData(){this.route.params.subscribe(t=>{!t.id||(this.edit||this.recreate?this.prometheusService.getSilences().subscribe(o=>{const l=Er().find(o,["id",t.id]);Er().isUndefined(l)||this.fillFormWithSilence(l)}):this.prometheusService.getAlerts().subscribe(o=>{const l=Er().find(o,["fingerprint",t.id]);Er().isUndefined(l)||this.fillFormByAlert(l)}))})}fillFormWithSilence(t){this.id=t.id,this.edit&&(["startsAt","endsAt"].forEach(o=>this.form.silentSet(o,Es()(t[o]).format(this.datetimeFormat))),this.updateDuration()),["createdBy","comment"].forEach(o=>this.form.silentSet(o,t[o])),this.matchers=t.matchers,this.validateMatchers()}validateMatchers(){this.rules?(this.matcherMatch=this.silenceMatcher.multiMatch(this.matchers,this.rules),this.form.markAsDirty(),this.form.updateValueAndValidity()):window.setTimeout(()=>this.validateMatchers(),100)}fillFormByAlert(t){this.setMatcher({name:"alertname",value:t.labels.alertname,isRegex:!1})}setMatcher(t,o){Er().isNumber(o)?this.matchers[o]=t:this.matchers.push(t),this.validateMatchers()}showMatcherModal(t){const l=this.modalService.show(Mb).componentInstance;l.rules=this.rules,Er().isNumber(t)&&(l.editMode=!0,l.preFillControls(this.matchers[t])),l.submitAction.subscribe(_=>{this.setMatcher(_,t)})}deleteMatcher(t){this.matchers.splice(t,1),this.validateMatchers()}submit(t){this.form.invalid||this.prometheusService.setSilence(this.getSubmitData()).subscribe(o=>{t&&(t.silenceId=o.body.silenceId),this.isNavigate&&this.router.navigate(["/monitoring/silences"]),this.notificationService.show(Sa.k.success,this.getNotificationTile(this.matchers),void 0,void 0,"Prometheus"),this.matchers=[]},()=>this.form.setErrors({cdSubmitButton:!0}))}getSubmitData(){const t=this.form.value;return delete t.duration,t.startsAt=Es()(t.startsAt,this.datetimeFormat).toISOString(),t.endsAt=Es()(t.endsAt,this.datetimeFormat).toISOString(),t.matchers=this.matchers,this.edit&&(t.id=this.id),t}getNotificationTile(t){let o;o=this.edit?this.succeededLabels.EDITED:this.recreate?this.succeededLabels.RECREATED:this.succeededLabels.CREATED;let l="";for(const _ of t)l=l.concat(` ${_.name} - ${_.value},`);return`${o} ${this.resource} for ${l.slice(0,-1)}`}}return n.\u0275fac=function(t){return new(t||n)(e.Y36(Bo.F0),e.Y36(zi.j),e.Y36(zu.O),e.Y36(rh),e.Y36(Sl.g),e.Y36(Bo.gz),e.Y36(Tb),e.Y36(ru.Z),e.Y36(j1),e.Y36(Mo.p4),e.Y36(Mo.aX))},n.\u0275cmp=e.Xpm({type:n,selectors:[["cd-prometheus-form"]],decls:71,vars:30,consts:function(){let s,t,o,l,_,M,w,N,V,X,re,oe,fe,ve,Pe,De,Ie,Ae;return s="" + "\ufffd0\ufffd" + " " + "\ufffd1\ufffd" + "",t="Creator",o="Comment",l="Start time",_="If the start time lies in the past the creation time will be used",M="Duration",w="End time",N="Matchers",V="Add matcher",X="Edit",re="Delete",oe="Editing a silence will expire the old silence and recreate it as a new silence",fe="This field is required!",ve="This field is required!",Pe="This field is required!",De="This field is required!",Ie="This field is required!",Ae="A silence requires at least one matcher",[["matcherTpl",""],[1,"cd-col-form"],["name","form","novalidate","",1,"form",3,"formGroup"],["formDir","ngForm"],[1,"card"],[1,"card-header"],s,[4,"ngIf"],[1,"card-body"],[1,"form-group","row"],["for","created-by",1,"cd-col-form-label","required"],t,[1,"cd-col-form-input"],["formControlName","createdBy","id","created-by","name","created-by","type","text",1,"form-control"],["class","invalid-feedback",4,"ngIf"],["for","comment",1,"cd-col-form-label","required"],o,["formControlName","comment","id","comment","name","comment","type","text",1,"form-control"],["for","starts-at",1,"cd-col-form-label"],[1,"required"],l,_,["formControlName","startsAt","triggers","manual",1,"form-control",3,"ngbPopover","click","keypress"],["ps","ngbPopover"],["for","duration",1,"cd-col-form-label","required"],M,["formControlName","duration","id","duration","name","duration","type","text",1,"form-control"],["for","ends-at",1,"cd-col-form-label","required"],w,["formControlName","endsAt","triggers","manual",1,"form-control",3,"ngbPopover","click","keypress"],["pe","ngbPopover"],N,[1,"cd-col-form-offset"],[3,"ngClass",4,"ngIf"],[4,"ngFor","ngForOf"],[1,"row"],[1,"col-12"],["type","button","id","add-matcher",1,"btn","btn-light","float-end","my-3",3,"ngClass","click"],[3,"ngClass"],V,["id","match-state",3,"class",4,"ngIf"],[1,"card-footer"],[1,"text-right"],[3,"form","submitText","submitActionEvent"],["popStart",""],["popEnd",""],[1,"input-group","my-2"],["type","button","ngbTooltip",X,1,"btn","btn-light",3,"id","click"],["type","button","ngbTooltip",re,1,"btn","btn-light",3,"id","click"],[1,"help-block"],["class","input-group-text",3,"ngbTooltip",4,"ngIf"],[1,"input-group-text",3,"ngbTooltip"],["type","text","disabled","","readonly","",1,"form-control",3,"id","value"],oe,[1,"invalid-feedback"],fe,ve,Pe,De,Ie,Ae,[4,"ngTemplateOutlet","ngTemplateOutletContext"],["id","match-state"],[3,"control","hasSeconds"]]},template:function(t,o){if(1&t){const l=e.EpF();e.YNc(0,Db,7,9,"ng-template",null,0,e.W1O),e.TgZ(2,"div",1)(3,"form",2,3)(5,"div",4)(6,"div",5)(7,"span"),e.SDv(8,6),e.ALo(9,"titlecase"),e.ALo(10,"upperFirst"),e.qZA(),e.YNc(11,wb,2,0,"cd-helper",7),e.qZA(),e.TgZ(12,"div",8)(13,"div",9)(14,"label",10),e.SDv(15,11),e.qZA(),e.TgZ(16,"div",12),e._UZ(17,"input",13),e.YNc(18,km,2,0,"span",14),e.qZA()(),e.TgZ(19,"div",9)(20,"label",15),e.SDv(21,16),e.qZA(),e.TgZ(22,"div",12)(23,"textarea",17),e._uU(24,"            "),e.qZA(),e.YNc(25,BC,2,0,"span",14),e.qZA()(),e.TgZ(26,"div",9)(27,"label",18)(28,"span",19),e.SDv(29,20),e.qZA(),e.TgZ(30,"cd-helper"),e.SDv(31,21),e.qZA()(),e.TgZ(32,"div",12)(33,"input",22,23),e.NdJ("click",function(){return e.CHM(l),e.MAs(34).open()})("keypress",function(){return e.CHM(l),e.MAs(34).close()}),e.qZA(),e.YNc(35,UC,2,0,"span",14),e.qZA()(),e.TgZ(36,"div",9)(37,"label",24),e.SDv(38,25),e.qZA(),e.TgZ(39,"div",12),e._UZ(40,"input",26),e.YNc(41,xb,2,0,"span",14),e.qZA()(),e.TgZ(42,"div",9)(43,"label",27),e.SDv(44,28),e.qZA(),e.TgZ(45,"div",12)(46,"input",29,30),e.NdJ("click",function(){return e.CHM(l),e.MAs(47).open()})("keypress",function(){return e.CHM(l),e.MAs(47).close()}),e.qZA(),e.YNc(48,YC,2,0,"span",14),e.qZA()(),e.TgZ(49,"fieldset")(50,"legend",19),e.SDv(51,31),e.qZA(),e.TgZ(52,"div",32),e.YNc(53,ZA,3,4,"h5",33),e.YNc(54,W_,2,5,"span",34),e.TgZ(55,"div",35)(56,"div",36)(57,"button",37),e.NdJ("click",function(){return o.showMatcherModal()}),e._UZ(58,"i",38),e.ynx(59),e.SDv(60,39),e.BQk(),e.qZA()()()(),e.YNc(61,jC,3,7,"div",40),e.qZA()(),e.TgZ(62,"div",41)(63,"div",42)(64,"cd-form-button-panel",43),e.NdJ("submitActionEvent",function(){return o.submit()}),e.ALo(65,"titlecase"),e.ALo(66,"upperFirst"),e.qZA()()()()()(),e.YNc(67,Nb,1,2,"ng-template",null,44,e.W1O),e.YNc(69,J_,1,2,"ng-template",null,45,e.W1O)}if(2&t){const l=e.MAs(4),_=e.MAs(68),M=e.MAs(70);e.xp6(3),e.Q6J("formGroup",o.form),e.xp6(7),e.pQV(e.lcZ(9,18,o.action))(e.lcZ(10,20,o.resource)),e.QtT(8),e.xp6(1),e.Q6J("ngIf",o.edit),e.xp6(7),e.Q6J("ngIf",o.form.showError("createdBy",l,"required")),e.xp6(7),e.Q6J("ngIf",o.form.showError("comment",l,"required")),e.xp6(8),e.Q6J("ngbPopover",_),e.xp6(2),e.Q6J("ngIf",o.form.showError("startsAt",l,"required")),e.xp6(6),e.Q6J("ngIf",o.form.showError("duration",l,"required")),e.xp6(5),e.Q6J("ngbPopover",M),e.xp6(2),e.Q6J("ngIf",o.form.showError("endsAt",l,"required")),e.xp6(5),e.Q6J("ngIf",0===o.matchers.length),e.xp6(1),e.Q6J("ngForOf",o.matchers),e.xp6(3),e.Q6J("ngClass",e.VKq(26,P_,l.submitted&&0===o.matchers.length)),e.xp6(1),e.Q6J("ngClass",e.VKq(28,Sy,o.icons.add)),e.xp6(3),e.Q6J("ngIf",o.matchers.length&&o.matcherMatch),e.xp6(3),e.Q6J("form",o.form)("submitText",e.lcZ(65,22,o.action)+" "+e.lcZ(66,24,o.resource))}},directives:[p.sg,p.O5,Dr._L,_e.o,Il.b,p.mk,_n._Y,_n.JL,Ma.V,_n.sg,Oe.S,al.P,_n.Fj,_n.JJ,_n.u,Dr.o8,p.tP,Cl.p,kC.J],pipes:[p.rS,gt.m],styles:["textarea[_ngcontent-%COMP%]{resize:vertical}"]}),n})();var Pb=i(84051),G1=i(70882);function GC(n,s){1&n&&(e.TgZ(0,"cd-alert-panel",2),e.tHW(1,3),e._UZ(2,"cd-doc",4),e.N_p(),e.qZA())}function zC(n,s){if(1&n&&e._UZ(0,"cd-table-key-value",8),2&n){const t=e.oxw(2);e.Q6J("renderObjects",!0)("hideEmpty",!0)("appendParentKey",!1)("data",t.expandedRow)("customCss",t.customCss)("autoReload",!1)}}function VC(n,s){if(1&n){const t=e.EpF();e.TgZ(0,"cd-table",5),e.NdJ("setExpandedRow",function(l){return e.CHM(t),e.oxw().setExpandedRow(l)})("fetchData",function(){return e.CHM(t),e.oxw().refresh()})("updateSelection",function(l){return e.CHM(t),e.oxw().updateSelection(l)}),e._UZ(1,"cd-table-actions",6),e.YNc(2,zC,1,6,"cd-table-key-value",7),e.qZA()}if(2&n){const t=e.oxw();e.Q6J("data",t.silences)("columns",t.columns)("forceIdentifier",!0)("customCss",t.customCss)("sorts",t.sorts)("hasDetails",!0),e.xp6(1),e.Q6J("permission",t.permission)("selection",t.selection)("tableActions",t.tableActions),e.xp6(1),e.Q6J("ngIf",t.expandedRow)}}let My=(()=>{class n extends B1{constructor(t,o,l,_,M,w,N,V,X,re){super(re),this.authStorageService=t,this.cdDatePipe=o,this.modalService=l,this.notificationService=_,this.urlBuilder=M,this.actionLabels=w,this.succeededLabels=N,this.silenceFormComponent=V,this.silenceMatcher=X,this.silences=[],this.selection=new sn.r,this.customCss={"badge badge-danger":"active","badge badge-warning":"pending","badge badge-default":"expired"},this.sorts=[{prop:"endsAt",dir:Pb.Sr.desc}],this.permission=this.authStorageService.getPermissions().prometheus;const oe=fe=>fe.first()&&fe.first().status&&"expired"===fe.first().status.state;this.tableActions=[{permission:"create",icon:No.P.add,routerLink:()=>this.urlBuilder.getCreate(),canBePrimary:fe=>!fe.hasSingleSelection,name:this.actionLabels.CREATE},{permission:"create",canBePrimary:fe=>fe.hasSingleSelection&&oe(fe),disable:fe=>!fe.hasSingleSelection||fe.first().cdExecuting||fe.first().cdExecuting&&oe(fe)||!oe(fe),icon:No.P.copy,routerLink:()=>this.urlBuilder.getRecreate(this.selection.first().id),name:this.actionLabels.RECREATE},{permission:"update",icon:No.P.edit,canBePrimary:fe=>fe.hasSingleSelection&&!oe(fe),disable:fe=>!fe.hasSingleSelection||fe.first().cdExecuting||fe.first().cdExecuting&&!oe(fe)||oe(fe),routerLink:()=>this.urlBuilder.getEdit(this.selection.first().id),name:this.actionLabels.EDIT},{permission:"delete",icon:No.P.trash,canBePrimary:fe=>fe.hasSingleSelection&&!oe(fe),disable:fe=>!fe.hasSingleSelection||fe.first().cdExecuting||oe(fe),click:()=>this.expireSilence(),name:this.actionLabels.EXPIRE}],this.columns=[{name:"ID",prop:"id",flexGrow:3},{name:"Alerts Silenced",prop:"silencedAlerts",flexGrow:3,cellTransformation:wt.e.badge},{name:"Created by",prop:"createdBy",flexGrow:2},{name:"Started",prop:"startsAt",pipe:this.cdDatePipe},{name:"Updated",prop:"updatedAt",pipe:this.cdDatePipe},{name:"Ends",prop:"endsAt",pipe:this.cdDatePipe},{name:"Status",prop:"status.state",cellTransformation:wt.e.classAdding}]}refresh(){this.prometheusService.ifAlertmanagerConfigured(()=>{this.prometheusService.getSilences().subscribe(t=>{this.silences=t;const o=t.filter(l=>"expired"!==l.status.state);this.getAlerts(o)},()=>{this.prometheusService.disableAlertmanagerConfig()})})}updateSelection(t){this.selection=t}getAlerts(t){const o=this.silenceFormComponent.getRules();t.forEach(l=>{l.matchers.forEach(_=>{this.rules=this.silenceMatcher.getMatchedRules(_,o);const M=[];for(const w of this.rules)M.push(w.name);l.silencedAlerts=M})})}expireSilence(){const t=this.selection.first().id,o="Silence",l="Prometheus";this.modalRef=this.modalService.show(Oc.M,{itemDescription:o,itemNames:[t],actionDescription:this.actionLabels.EXPIRE,submitActionObservable:()=>new G1.y(_=>{this.prometheusService.expireSilence(t).subscribe(()=>{this.notificationService.show(Sa.k.success,`${this.succeededLabels.EXPIRED} ${o} ${t}`,void 0,void 0,l)},M=>{M.application=l,_.error(M)},()=>{_.complete(),this.refresh()})})})}}return n.\u0275fac=function(t){return new(t||n)(e.Y36(zi.j),e.Y36(Cn.N),e.Y36(ru.Z),e.Y36(Sl.g),e.Y36(Q.F),e.Y36(Mo.p4),e.Y36(Mo.aX),e.Y36(_p),e.Y36(j1),e.Y36(rh))},n.\u0275cmp=e.Xpm({type:n,selectors:[["cd-silences-list"]],features:[e._Bn([{provide:Q.F,useValue:new Q.F("monitoring/silences")},_p]),e.qOj],decls:3,vars:2,consts:function(){let s;return s="To enable Silences, please provide the URL to the API of the Prometheus' Alertmanager as described in the " + "\ufffd#2\ufffd" + "" + "\ufffd/#2\ufffd" + ".",[["type","info",4,"ngIf"],["selectionType","single",3,"data","columns","forceIdentifier","customCss","sorts","hasDetails","setExpandedRow","fetchData","updateSelection",4,"ngIf"],["type","info"],s,["section","prometheus"],["selectionType","single",3,"data","columns","forceIdentifier","customCss","sorts","hasDetails","setExpandedRow","fetchData","updateSelection"],[1,"table-actions",3,"permission","selection","tableActions"],["cdTableDetail","",3,"renderObjects","hideEmpty","appendParentKey","data","customCss","autoReload",4,"ngIf"],["cdTableDetail","",3,"renderObjects","hideEmpty","appendParentKey","data","customCss","autoReload"]]},template:function(t,o){1&t&&(e._UZ(0,"cd-prometheus-tabs"),e.YNc(1,GC,3,0,"cd-alert-panel",0),e.YNc(2,VC,3,10,"cd-table",1)),2&t&&(e.xp6(1),e.Q6J("ngIf",!o.isAlertmanagerConfigured),e.xp6(1),e.Q6J("ngIf",o.isAlertmanagerConfigured))},directives:[vy,p.O5,Eo.G,gf.K,_r.a,bu.K,fo.b],styles:[""]}),n})(),Tv=(()=>{class n{constructor(t){this.http=t,this.url="api/telemetry"}getReport(){return this.http.get(`${this.url}/report`)}enable(t=!0){const o={enable:t};return t&&(o.license_name="sharing-1-0"),this.http.put(`${this.url}`,o)}}return n.\u0275fac=function(t){return new(t||n)(e.LFG(y.eN))},n.\u0275prov=e.Yz7({token:n,factory:n.\u0275fac,providedIn:"root"}),n})(),Oy=(()=>{class n{constructor(){this.visible=!1,this.update=new e.vpe}setVisibility(t){this.visible=t,this.update.emit(t)}}return n.\u0275fac=function(t){return new(t||n)},n.\u0275prov=e.Yz7({token:n,factory:n.\u0275fac,providedIn:"root"}),n})();function Ib(n,s){if(1&n){const t=e.EpF();e.TgZ(0,"div"),e._uU(1," The plugin is already "),e.TgZ(2,"b"),e._uU(3,"enabled"),e.qZA(),e._uU(4,". Click "),e.TgZ(5,"b"),e._uU(6,"Deactivate"),e.qZA(),e._uU(7," to disable it.\xa0 "),e.TgZ(8,"button",66),e.NdJ("click",function(){return e.CHM(t),e.oxw(3).disableModule("The Telemetry module has been disabled successfully.")}),e.SDv(9,67),e.qZA()()}}function WC(n,s){1&n&&(e.ynx(0),e.TgZ(1,"legend"),e.ynx(2),e.SDv(3,68),e.BQk(),e.TgZ(4,"cd-helper"),e.SDv(5,69),e.qZA()(),e.TgZ(6,"div",15)(7,"label",70),e.SDv(8,71),e.qZA(),e.TgZ(9,"div",24),e._UZ(10,"input",72),e.qZA()(),e.TgZ(11,"div",15)(12,"label",73),e.SDv(13,74),e.qZA(),e.TgZ(14,"div",24),e._UZ(15,"input",75),e.qZA()(),e.TgZ(16,"div",15)(17,"label",76),e.SDv(18,77),e.qZA(),e.TgZ(19,"div",24),e._UZ(20,"input",78),e.qZA()(),e.BQk())}function Lb(n,s){1&n&&(e.TgZ(0,"span",79),e.SDv(1,80),e.qZA())}function Fb(n,s){if(1&n){const t=e.EpF();e.TgZ(0,"div")(1,"form",4,5)(3,"div",6)(4,"div",7),e.SDv(5,8),e.qZA(),e.TgZ(6,"div",9)(7,"p"),e.tHW(8,10),e._UZ(9,"br")(10,"a",11)(11,"br")(12,"br")(13,"b"),e.N_p(),e.qZA(),e.YNc(14,Ib,10,0,"div",12),e.TgZ(15,"legend"),e.SDv(16,13),e.qZA(),e.TgZ(17,"p"),e.SDv(18,14),e.qZA(),e.TgZ(19,"div",15)(20,"label",16),e.ynx(21),e.SDv(22,17),e.BQk(),e.TgZ(23,"cd-helper"),e.ynx(24),e.SDv(25,18),e.BQk(),e.TgZ(26,"ul")(27,"li"),e.SDv(28,19),e.qZA(),e.TgZ(29,"li"),e.SDv(30,20),e.qZA(),e.TgZ(31,"li"),e.SDv(32,21),e.qZA(),e.TgZ(33,"li"),e.SDv(34,22),e.qZA(),e.TgZ(35,"li"),e.SDv(36,23),e.qZA()()()(),e.TgZ(37,"div",24)(38,"div",25),e._UZ(39,"input",26)(40,"label",27),e.qZA()()(),e.TgZ(41,"div",15)(42,"label",28),e.ynx(43),e.SDv(44,29),e.BQk(),e.TgZ(45,"cd-helper"),e.ynx(46),e.SDv(47,30),e.BQk(),e.TgZ(48,"ul")(49,"li"),e.SDv(50,31),e.qZA(),e.TgZ(51,"li"),e.SDv(52,32),e.qZA(),e.TgZ(53,"li"),e.SDv(54,33),e.qZA(),e.TgZ(55,"li"),e.SDv(56,34),e.qZA()()()(),e.TgZ(57,"div",24)(58,"div",25),e._UZ(59,"input",35)(60,"label",36),e.qZA()()(),e.TgZ(61,"div",15)(62,"label",37),e.ynx(63),e.SDv(64,38),e.BQk(),e._UZ(65,"cd-helper",39),e.qZA(),e.TgZ(66,"div",24)(67,"div",25),e._UZ(68,"input",40)(69,"label",41),e.qZA()()(),e.TgZ(70,"div",15)(71,"label",42),e.ynx(72),e.SDv(73,43),e.BQk(),e.TgZ(74,"cd-helper"),e.ynx(75),e.SDv(76,44),e.BQk(),e.TgZ(77,"ul")(78,"li"),e._uU(79,"Cluster description"),e.qZA(),e.TgZ(80,"li"),e._uU(81,"Contact email address"),e.qZA()()()(),e.TgZ(82,"div",24)(83,"div",25)(84,"input",45),e.NdJ("click",function(){return e.CHM(t),e.oxw(2).toggleIdent()}),e.qZA(),e._UZ(85,"label",46),e.qZA()()(),e.TgZ(86,"div",15)(87,"label",47),e.ynx(88),e.SDv(89,48),e.BQk(),e.TgZ(90,"cd-helper"),e.ynx(91),e.SDv(92,49),e.BQk(),e.qZA()(),e.TgZ(93,"div",24)(94,"div",25),e._UZ(95,"input",50)(96,"label",51),e.qZA()()(),e.YNc(97,WC,21,0,"ng-container",12),e.TgZ(98,"legend"),e.SDv(99,52),e.qZA(),e.TgZ(100,"div",15)(101,"label",53),e.ynx(102),e.SDv(103,54),e.BQk(),e.TgZ(104,"cd-helper"),e.SDv(105,55),e.qZA()(),e.TgZ(106,"div",24),e._UZ(107,"input",56),e.YNc(108,Lb,2,0,"span",57),e.qZA()(),e.TgZ(109,"div",15)(110,"label",58),e.ynx(111),e.SDv(112,59),e.BQk(),e.TgZ(113,"cd-helper")(114,"p"),e.SDv(115,60),e.qZA(),e.TgZ(116,"p"),e.SDv(117,61),e.qZA()()(),e.TgZ(118,"div",24),e._UZ(119,"input",62),e.qZA()(),e._UZ(120,"br"),e.TgZ(121,"p"),e.tHW(122,63),e._UZ(123,"b"),e.N_p(),e.qZA()(),e.TgZ(124,"div",64)(125,"div",65)(126,"button",66),e.NdJ("click",function(){return e.CHM(t),e.oxw(2).next()}),e.ynx(127),e._uU(128),e.BQk(),e.qZA()()()()()()}if(2&n){const t=e.MAs(2),o=e.oxw(2);e.xp6(1),e.Q6J("formGroup",o.configForm),e.xp6(4),e.pQV(o.step),e.QtT(5),e.xp6(8),e.pQV(o.sendToUrl)(o.sendToDeviceUrl),e.QtT(8),e.xp6(1),e.Q6J("ngIf",o.moduleEnabled),e.xp6(83),e.Q6J("ngIf",o.showContactInfo),e.xp6(11),e.Q6J("ngIf",o.configForm.showError("interval",t,"min")),e.xp6(20),e.Oqu(o.actionLabels.NEXT)}}function z1(n,s){if(1&n){const t=e.EpF();e.TgZ(0,"div")(1,"form",81,82)(3,"div",6)(4,"div",7),e.SDv(5,83),e.qZA(),e.TgZ(6,"div",9)(7,"div",15)(8,"label",84),e.tHW(9,85),e._UZ(10,"cd-helper",86),e.N_p(),e.qZA(),e.TgZ(11,"div",24),e._UZ(12,"input",87),e.qZA()(),e.TgZ(13,"div",15)(14,"label",88),e.tHW(15,89),e.TgZ(16,"cd-helper",90),e._UZ(17,"em"),e.qZA(),e.N_p(),e.qZA(),e.TgZ(18,"div",24),e._UZ(19,"textarea",91),e.qZA()(),e.TgZ(20,"div",15)(21,"div",92)(22,"div",93),e._UZ(23,"cd-download-button",94)(24,"cd-copy-2-clipboard-button",95),e.qZA()()(),e.TgZ(25,"div",15)(26,"div",92)(27,"div",25),e._UZ(28,"input",96),e.TgZ(29,"label",97),e.tHW(30,98),e._UZ(31,"a",99),e.N_p(),e.qZA()()()()(),e.TgZ(32,"div",64)(33,"div",65)(34,"cd-form-button-panel",100),e.NdJ("submitActionEvent",function(){return e.CHM(t),e.oxw(2).onSubmit()})("backActionEvent",function(){return e.CHM(t),e.oxw(2).back()}),e.qZA()()()()()()}if(2&n){const t=e.oxw(2);e.xp6(1),e.Q6J("formGroup",t.previewForm),e.xp6(4),e.pQV(t.step),e.QtT(5),e.xp6(18),e.Q6J("objectItem",t.report),e.xp6(11),e.Q6J("form",t.previewForm)("submitText",t.actionLabels.UPDATE)("cancelText",t.actionLabels.BACK)}}function JC(n,s){if(1&n&&(e.TgZ(0,"div",1),e.ynx(1,2),e.YNc(2,Fb,129,8,"div",3),e.YNc(3,z1,35,6,"div",3),e.BQk(),e.qZA()),2&n){const t=e.oxw();e.xp6(1),e.Q6J("ngSwitch",t.step),e.xp6(1),e.Q6J("ngSwitchCase",1),e.xp6(1),e.Q6J("ngSwitchCase",2)}}let kb=(()=>{class n extends Bl.E{constructor(t,o,l,_,M,w,N){super(),this.actionLabels=t,this.formBuilder=o,this.mgrModuleService=l,this.notificationService=_,this.router=M,this.telemetryService=w,this.telemetryNotificationService=N,this.licenseAgrmt=!1,this.options={},this.newConfig={},this.configResp={},this.requiredFields=["channel_basic","channel_crash","channel_device","channel_ident","channel_perf","interval","proxy","contact","description","organization"],this.contactInfofields=["contact","description","organization"],this.report=void 0,this.reportId=void 0,this.sendToUrl="",this.sendToDeviceUrl="",this.step=1}ngOnInit(){const t=[this.mgrModuleService.getOptions("telemetry"),this.mgrModuleService.getConfig("telemetry")];(0,Pu.D)(t).subscribe(o=>{const l=o[1];this.moduleEnabled=l.enabled,this.sendToUrl=l.url,this.sendToDeviceUrl=l.device_url,this.showContactInfo=l.channel_ident,this.options=Er().pick(o[0],this.requiredFields),this.configResp=Er().pick(l,this.requiredFields),this.createConfigForm(),this.configForm.setValue(this.configResp),this.loadingReady()},o=>{this.loadingError()})}createConfigForm(){const t={};Er().forEach(Object.values(this.options),o=>{t[o.name]=[o.default_value,this.getValidators(o)]}),this.configForm=this.formBuilder.group(t)}replacer(t,o){if(("ranges"===t||"values"===t)&&Array.isArray(o)){const l=[];for(let _=0;_<o.length;_++)l.push(JSON.stringify(o[_]));return l}return o}replacerTest(t){return JSON.stringify(t,this.replacer,2)}formatReport(){let t={};t=JSON.parse(JSON.stringify(this.report));const o=["perf_counters","stats_per_pool","stats_per_pg","io_rate","osd_perf_histograms","mempool","heap_stats","rocksdb_stats"];for(let l=0;l<o.length;l++){const _=o[l];_ in t.report&&delete t.report[_]}return JSON.stringify(t,null,2)}formatReportTest(t){let o={};o=JSON.parse(JSON.stringify(t));const l=["perf_counters","stats_per_pool","stats_per_pg","io_rate","osd_perf_histograms","mempool","heap_stats","rocksdb_stats"];for(let _=0;_<l.length;_++){const M=l[_];M in o&&delete o[M]}return JSON.stringify(o,null,2)}createPreviewForm(){const t={report:this.formatReport(),reportId:this.reportId,licenseAgrmt:[this.licenseAgrmt,_n.kI.requiredTrue]};this.previewForm=this.formBuilder.group(t)}getValidators(t){const o=[];switch(t.type){case"int":o.push(_n.kI.required);break;case"str":Er().isNumber(t.min)&&o.push(_n.kI.minLength(t.min)),Er().isNumber(t.max)&&o.push(_n.kI.maxLength(t.max))}return o}updateReportFromConfig(t={}){const o=this.report.report.channels_available,l=[];for(const _ of o)t[`channel_${_}`]&&l.push(_);this.report.report.channels=l;for(const _ of this.contactInfofields)this.report.report[_]=t[_]}getReport(){this.loadingStart(),this.telemetryService.getReport().subscribe(t=>{this.report=t,this.reportId=t.report.report_id,this.updateReportFromConfig(this.newConfig),this.createPreviewForm(),this.loadingReady(),this.step++},t=>{this.loadingError()})}toggleIdent(){this.showContactInfo=!this.showContactInfo}buildReport(){this.newConfig={};for(const t of Object.values(this.options)){const o=this.configForm.get(t.name);if(!o.valid)return void this.configForm.setErrors({cdSubmitButton:!0});this.newConfig[t.name]=o.value}if(!this.newConfig.channel_ident)for(const t of this.contactInfofields)this.newConfig[t]="";this.getReport()}disableModule(t=null,o=null){this.telemetryService.enable(!1).subscribe(()=>{this.telemetryNotificationService.setVisibility(!0),t&&this.notificationService.show(Sa.k.success,t),o?o():this.router.navigate([""])})}next(){this.buildReport()}back(){this.step--}getChangedConfig(){const t={};return Er().forEach(this.requiredFields,o=>{Er().isEqual(this.configResp[o],this.newConfig[o])||(t[o]=this.newConfig[o])}),t}onSubmit(){const t=this.getChangedConfig(),o=[this.telemetryService.enable(),this.mgrModuleService.updateConfig("telemetry",t)];(0,Pu.D)(o).subscribe(()=>{this.telemetryNotificationService.setVisibility(!1),this.notificationService.show(Sa.k.success,"The Telemetry module has been configured and activated successfully.")},()=>{this.telemetryNotificationService.setVisibility(!1),this.notificationService.show(Sa.k.error,"An Error occurred while updating the Telemetry module configuration.             Please Try again"),this.previewForm.setErrors({cdSubmitButton:!0})},()=>{this.newConfig={},this.router.navigate([""])})}}return n.\u0275fac=function(t){return new(t||n)(e.Y36(Mo.p4),e.Y36(zu.O),e.Y36(Mg.N),e.Y36(Sl.g),e.Y36(Bo.F0),e.Y36(Tv),e.Y36(Oy))},n.\u0275cmp=e.Xpm({type:n,selectors:[["cd-telemetry"]],features:[e.qOj],decls:1,vars:1,consts:function(){let s,t,o,l,_,M,w,N,V,X,re,oe,fe,ve,Pe,De,Ie,Ae,Y,Et,ft,xt,Ht,yn,It,In,On,Yr,Ir,Hr,Wr,En,Un,Yn,ir,An,Lr,Wi,Mi,Yi,jr,Nn,fn,Vr,xi;return s="Step " + "\ufffd0\ufffd" + " of 2: Telemetry report configuration",t="The telemetry module sends anonymous data about this Ceph cluster back to the Ceph developers to help understand how Ceph is used and what problems users may be experiencing." + "[\ufffd#9\ufffd\ufffd/#9\ufffd|\ufffd#11\ufffd\ufffd/#11\ufffd|\ufffd#12\ufffd\ufffd/#12\ufffd]" + " This data is visualized on " + "\ufffd#10\ufffd" + "public dashboards" + "\ufffd/#10\ufffd" + " that allow the community to quickly see summary statistics on how many clusters are reporting, their total capacity and OSD count, and version distribution trends." + "[\ufffd#9\ufffd\ufffd/#9\ufffd|\ufffd#11\ufffd\ufffd/#11\ufffd|\ufffd#12\ufffd\ufffd/#12\ufffd]" + "" + "[\ufffd#9\ufffd\ufffd/#9\ufffd|\ufffd#11\ufffd\ufffd/#11\ufffd|\ufffd#12\ufffd\ufffd/#12\ufffd]" + " The data being reported does " + "\ufffd#13\ufffd" + "not" + "\ufffd/#13\ufffd" + " contain any sensitive data like pool names, object names, object contents, hostnames, or device serial numbers. It contains counters and statistics on how the cluster has been deployed, the version of Ceph, the distribution of the hosts and other parameters which help the project to gain a better understanding of the way Ceph is used. The data is sent secured to " + "\ufffd0\ufffd" + " and " + "\ufffd1\ufffd" + " (device report).",t=e.Zx4(t),o="Channels",l="The telemetry report is broken down into several \"channels\", each with a different type of information that can be configured below.",_="Basic",M="Includes basic information about the cluster:",w="Capacity of the cluster",N="Number of monitors, managers, OSDs, MDSs, object gateways, or other daemons",V="Software version currently being used",X="Number and types of RADOS pools and CephFS file systems",re="Names of configuration options that have been changed from their default (but not their values)",oe="Crash",fe="Includes information about daemon crashes:",ve="Type of daemon",Pe="Version of the daemon",De="Operating system (OS distribution, kernel version)",Ie="Stack trace identifying where in the Ceph code the crash occurred",Ae="Device",Y="Includes information about device metrics like anonymized SMART metrics.",Et="Ident",ft="Includes user-provided identifying information about the cluster:",xt="Perf",Ht="Includes various performance metrics of a cluster.",yn="Advanced Settings",It="Interval",In="The module compiles and sends a new report every 24 hours by default. You can adjust this interval by setting a different number of hours.",On="Proxy",Yr="If the cluster cannot directly connect to the configured telemetry endpoint (default telemetry.ceph.com), you can configure a HTTP/HTTPS proxy server by e.g. adding https://10.0.0.1:8080",Ir="You can also include a user:pass if needed e.g. https://ceph:telemetry@10.0.0.1:8080",Hr="" + "\ufffd#123\ufffd" + "Note:" + "\ufffd/#123\ufffd" + " By clicking 'Next' you will first see a preview of the report content before you can activate the automatic submission of your data.",Wr="Deactivate",En="Contact Information",Un="Submitting any contact information is completely optional and disabled by default.",Yn="Contact",ir="Description",An="My first Ceph cluster",Lr="Organization",Wi="Organization name",Mi="The entered value is too low! It must be greater or equal to 8.",Yi="Step " + "\ufffd0\ufffd" + " of 2: Telemetry report preview",jr="A randomized UUID to identify a particular cluster over the course of several telemetry reports.",Nn="Report ID " + "\ufffd#10\ufffd" + "" + "\ufffd/#10\ufffd" + "",fn="The actual telemetry data that will be submitted.",Vr="Report preview " + "\ufffd#16\ufffd" + "" + "\ufffd#17\ufffd" + "Note: Please select 'Download' to view the full report, including metrics from the perf channel." + "\ufffd/#17\ufffd" + "" + "\ufffd/#16\ufffd" + "",xi="I agree to my telemetry data being submitted under the " + "\ufffd#31\ufffd" + "Community Data License Agreement - Sharing - Version 1.0" + "\ufffd/#31\ufffd" + "",[["class","cd-col-form",4,"cdFormLoading"],[1,"cd-col-form"],[3,"ngSwitch"],[4,"ngSwitchCase"],["name","form","novalidate","",3,"formGroup"],["formDir","ngForm"],[1,"card"],[1,"card-header"],s,[1,"card-body"],t,["href","https://telemetry-public.ceph.com/"],[4,"ngIf"],o,l,[1,"form-group","row"],["for","channel_basic",1,"cd-col-form-label"],_,M,w,N,V,X,re,[1,"cd-col-form-input"],[1,"custom-control","custom-checkbox"],["type","checkbox","id","channel_basic","formControlName","channel_basic",1,"custom-control-input"],["for","channel_basic",1,"custom-control-label"],["for","channel_crash",1,"cd-col-form-label"],oe,fe,ve,Pe,De,Ie,["type","checkbox","id","channel_crash","formControlName","channel_crash",1,"custom-control-input"],["for","channel_crash",1,"custom-control-label"],["for","channel_device",1,"cd-col-form-label"],Ae,["html",Y],["type","checkbox","id","channel_device","formControlName","channel_device",1,"custom-control-input"],["for","channel_device",1,"custom-control-label"],["for","channel_ident",1,"cd-col-form-label"],Et,ft,["type","checkbox","id","channel_ident","formControlName","channel_ident",1,"custom-control-input",3,"click"],["for","channel_ident",1,"custom-control-label"],["for","channel_perf",1,"cd-col-form-label"],xt,Ht,["type","checkbox","id","channel_perf","formControlName","channel_perf",1,"custom-control-input"],["for","channel_perf",1,"custom-control-label"],yn,["for","interval",1,"cd-col-form-label"],It,In,["id","interval","type","number","formControlName","interval","min","8",1,"form-control"],["class","invalid-feedback",4,"ngIf"],["for","proxy",1,"cd-col-form-label"],On,Yr,Ir,["id","proxy","type","text","formControlName","proxy","placeholder","https://10.0.0.1:8080",1,"form-control"],Hr,[1,"card-footer"],[1,"button-group","text-right"],["type","button",1,"btn","btn-light",3,"click"],Wr,En,Un,["for","contact",1,"cd-col-form-label"],Yn,["id","contact","type","text","formControlName","contact","placeholder","Example User <user@example.com>",1,"form-control"],["for","description",1,"cd-col-form-label"],ir,["id","description","type","text","formControlName","description","placeholder",An,1,"form-control"],["for","organization",1,"cd-col-form-label"],Lr,["id","organization","type","text","formControlName","organization","placeholder",Wi,1,"form-control"],[1,"invalid-feedback"],Mi,["name","previewForm","novalidate","",3,"formGroup"],["frm","ngForm"],Yi,["for","reportId",1,"cd-col-form-label"],Nn,["html",jr],["type","text","id","reportId","formControlName","reportId","readonly","",1,"form-control"],["for","report",1,"cd-col-form-label"],Vr,["html",fn],["id","report","formControlName","report","rows","15","readonly","",1,"form-control"],[1,"cd-col-form-offset"],["role","group",1,"btn-group"],["fileName","telemetry_report",3,"objectItem"],["source","report"],["type","checkbox","id","licenseAgrmt","name","licenseAgrmt","formControlName","licenseAgrmt",1,"custom-control-input"],["for","licenseAgrmt",1,"custom-control-label"],xi,["href","https://cdla.io/sharing-1-0/"],[3,"form","submitText","cancelText","submitActionEvent","backActionEvent"]]},template:function(t,o){1&t&&e.YNc(0,JC,4,3,"div",0),2&t&&e.Q6J("cdFormLoading",o.loading)},directives:[lu.y,p.RF,p.n9,_n._Y,_n.JL,Ma.V,_n.sg,p.O5,_e.o,al.P,Oe.S,_n.Wl,Il.b,_n.JJ,_n.u,_n.Fj,_n.wV,_n.qQ,Ph,u_.s,Cl.p],styles:[""]}),n})();var $b=i(26561);function V1(n){const{subscriber:s,counter:t,period:o}=n;s.next(t),this.schedule({subscriber:s,counter:t+1,period:o},o)}let Z1=(()=>{class n{constructor(t){this.ngZone=t,this.intervalDataSource=new Tc.X(null),this.intervalData$=this.intervalDataSource.asObservable();const o=parseInt(sessionStorage.getItem("dashboard_interval"),10)||5e3;this.setRefreshInterval(o)}setRefreshInterval(t){this.intervalTime=t,sessionStorage.setItem("dashboard_interval",t.toString()),this.intervalSubscription&&this.intervalSubscription.unsubscribe(),this.ngZone.runOutsideAngular(()=>{this.intervalSubscription=function Ay(n=0,s=a_.P){return(!(0,$b.k)(n)||n<0)&&(n=0),(!s||"function"!=typeof s.schedule)&&(s=a_.P),new G1.y(t=>(t.add(s.schedule(V1,n,{subscriber:t,counter:0,period:n})),t))}(this.intervalTime).subscribe(()=>this.ngZone.run(()=>{this.intervalDataSource.next(this.intervalTime)}))})}getRefreshInterval(){return this.intervalTime}ngOnDestroy(){this.intervalSubscription&&this.intervalSubscription.unsubscribe()}}return n.\u0275fac=function(t){return new(t||n)(e.LFG(e.R0b))},n.\u0275prov=e.Yz7({token:n,factory:n.\u0275fac,providedIn:"root"}),n})();function Dy(n,s){if(1&n&&(e.TgZ(0,"option",7),e._uU(1),e.qZA()),2&n){const t=s.$implicit,o=e.oxw();e.Q6J("value",o.intervalList[t]),e.xp6(1),e.Oqu(t)}}let Hb=(()=>{class n{constructor(t){this.refreshIntervalService=t,this.intervalList={"5 s":5e3,"10 s":1e4,"15 s":15e3,"30 s":3e4,"1 min":6e4,"3 min":18e4,"5 min":3e5},this.intervalKeys=Object.keys(this.intervalList)}ngOnInit(){this.selectedInterval=this.refreshIntervalService.getRefreshInterval()||5e3}changeRefreshInterval(t){this.refreshIntervalService.setRefreshInterval(t)}}return n.\u0275fac=function(t){return new(t||n)(e.Y36(Z1))},n.\u0275cmp=e.Xpm({type:n,selectors:[["cd-refresh-selector"]],decls:8,vars:2,consts:function(){let s;return s="Refresh",[[1,"container-fluid"],[1,"row"],[1,"col-sm-1","d-flex","float-end"],["for","refreshInterval",1,"col-form-label","my-0","mx-2","float-end"],s,["id","refreshInterval","name","refreshInterval",1,"form-select","float-end",3,"ngModel","change","ngModelChange"],[3,"value",4,"ngFor","ngForOf"],[3,"value"]]},template:function(t,o){1&t&&(e.TgZ(0,"div",0)(1,"div",1)(2,"form")(3,"div",2)(4,"label",3),e.SDv(5,4),e.qZA(),e.TgZ(6,"select",5),e.NdJ("change",function(_){return o.changeRefreshInterval(_.target.value)})("ngModelChange",function(_){return o.selectedInterval=_}),e.YNc(7,Dy,2,2,"option",6),e.qZA()()()()()),2&t&&(e.xp6(6),e.Q6J("ngModel",o.selectedInterval),e.xp6(1),e.Q6J("ngForOf",o.intervalKeys))},directives:[_n._Y,_n.JL,_n.F,_e.o,_n.EJ,_n.JJ,_n.On,p.sg,_n.YN,_n.Kr],styles:[""]}),n})();var Bb=i(20687);let Ub=(()=>{class n{constructor(t){this.http=t}getFullHealth(){return this.http.get("api/health/full")}getMinimalHealth(){return this.http.get("api/health/minimal")}}return n.\u0275fac=function(t){return new(t||n)(e.LFG(y.eN))},n.\u0275prov=e.Yz7({token:n,factory:n.\u0275fac,providedIn:"root"}),n})();var W1=i(89154),$m=i(99475);const Yb=["*"];let jb=(()=>{class n{constructor(){this.icons=No.P}}return n.\u0275fac=function(t){return new(t||n)},n.\u0275cmp=e.Xpm({type:n,selectors:[["cd-info-group"]],inputs:{groupTitle:"groupTitle"},ngContentSelectors:Yb,decls:12,vars:7,consts:function(){let s,t;return s="here",t="For an overview of " + "\ufffd0\ufffd" + " widgets click " + "\ufffd#8\ufffd" + "" + "\ufffd/#8\ufffd" + "",[[1,"row"],[1,"info-group-title"],["iconClass","fa fa-info-circle fa-2xs"],[1,"text-center"],t,["docText",s,3,"section"]]},template:function(t,o){1&t&&(e.F$t(),e.TgZ(0,"div",0)(1,"div",1)(2,"span"),e._uU(3),e.qZA(),e.TgZ(4,"cd-helper",2)(5,"div",3),e.tHW(6,4),e.ALo(7,"lowercase"),e._UZ(8,"cd-doc",5),e.ALo(9,"lowercase"),e.N_p(),e.qZA()()()(),e.TgZ(10,"div",0),e.Hsn(11),e.qZA()),2&t&&(e.xp6(3),e.Oqu(o.groupTitle),e.xp6(5),e.MGl("section","dashboard-landing-page-",e.lcZ(9,5,o.groupTitle),""),e.xp6(1),e.pQV(e.lcZ(7,3,o.groupTitle)),e.QtT(6))},directives:[Oe.S,gf.K],pipes:[p.i8],styles:[".info-group-title[_ngcontent-%COMP%]{font-size:1.75rem;margin:0 0 .5vw}.popover-icon[_ngcontent-%COMP%]{color:#25828e}.popover-icon[_ngcontent-%COMP%]:focus{box-shadow:none}"]}),n})();function Gb(n,s){if(1&n&&(e.TgZ(0,"a",6),e._uU(1),e.qZA()),2&n){const t=e.oxw();e.Q6J("routerLink",t.link),e.xp6(1),e.Oqu(t.cardTitle)}}function QC(n,s){if(1&n&&e._uU(0),2&n){const t=e.oxw();e.hij(" ",t.cardTitle," ")}}const zb=["*"];let KC=(()=>{class n{constructor(){this.cardClass=""}}return n.\u0275fac=function(t){return new(t||n)},n.\u0275cmp=e.Xpm({type:n,selectors:[["cd-info-card"]],inputs:{cardTitle:"cardTitle",link:"link",cardClass:"cardClass",contentClass:"contentClass"},ngContentSelectors:zb,decls:8,vars:4,consts:[[1,"card","shadow-sm",3,"ngClass"],[1,"card-body","d-flex","align-items-center","justify-content-center"],[1,"card-title","m-4"],[3,"routerLink",4,"ngIf","ngIfElse"],["noLinkTitle",""],[1,"card-text","text-center",3,"ngClass"],[3,"routerLink"]],template:function(t,o){if(1&t&&(e.F$t(),e.TgZ(0,"div",0)(1,"div",1)(2,"h4",2),e.YNc(3,Gb,2,2,"a",3),e.YNc(4,QC,1,1,"ng-template",null,4,e.W1O),e.qZA(),e.TgZ(6,"div",5),e.Hsn(7),e.qZA()()()),2&t){const l=e.MAs(5);e.Q6J("ngClass",o.cardClass),e.xp6(3),e.Q6J("ngIf",o.link)("ngIfElse",l),e.xp6(3),e.Q6J("ngClass",o.contentClass)}},directives:[p.mk,p.O5,Bo.yS],styles:[".card[_ngcontent-%COMP%]{font-size:12px;border:.5px solid #dee2e6;border-radius:3px;height:100%}@media screen and (min-width: 320px){.card[_ngcontent-%COMP%]{font-size:calc(12px + 9 * ((100vw - 320px) / 1728))}}@media screen and (min-width: 2048px){.card[_ngcontent-%COMP%]{font-size:21px}}.card[_ngcontent-%COMP%]   .card-body[_ngcontent-%COMP%]{padding-top:40px!important}.card[_ngcontent-%COMP%]   .card-body[_ngcontent-%COMP%]   .card-title[_ngcontent-%COMP%]{left:-.6rem;position:absolute;top:-.3rem}.card[_ngcontent-%COMP%]   .card-body[_ngcontent-%COMP%]   .card-title[_ngcontent-%COMP%] > a[_ngcontent-%COMP%]{color:#25828e}.no-center[_ngcontent-%COMP%]{left:unset;position:unset;top:unset;transform:unset}.content-highlight[_ngcontent-%COMP%]{font-weight:700}"]}),n})();var XC=i(6823);const qC=["chartCanvas"],eM=["chartTooltip"];let tM=(()=>{class n{constructor(t,o,l){this.dimlessBinary=t,this.dimless=o,this.cssHelper=l,this.config={},this.isBytesData=!1,this.showLabelAsTooltip=!1,this.prepareFn=new e.vpe,this.chartConfig={chartType:"doughnut",dataset:[{label:null,borderWidth:0}],colors:[{backgroundColor:[this.cssHelper.propertyValue("chart-color-green"),this.cssHelper.propertyValue("chart-color-yellow"),this.cssHelper.propertyValue("chart-color-orange"),this.cssHelper.propertyValue("chart-color-red"),this.cssHelper.propertyValue("chart-color-blue")]}],options:{cutoutPercentage:90,events:["click","mouseout","touchstart"],legend:{display:!0,position:"right",labels:{boxWidth:10,usePointStyle:!1}},plugins:{center_text:!0},tooltips:{enabled:!0,displayColors:!1,backgroundColor:this.cssHelper.propertyValue("chart-color-tooltip-background"),cornerRadius:0,bodyFontSize:14,bodyFontStyle:"600",position:"nearest",xPadding:12,yPadding:12,callbacks:{label:(_,M)=>{let w=M.labels[_.index];return w.includes("%")||(w=`${w} (${M.datasets[_.datasetIndex].data[_.index]}%)`),w}}},title:{display:!1}}},this.doughnutChartPlugins=[{id:"center_text",beforeDraw(_){const M=new $m.P,w="Helvetica Neue, Helvetica, Arial, sans-serif";XC.defaults.global.defaultFontFamily=w;const N=_.ctx;if(!_.options.plugins.center_text||!_.data.datasets[0].label)return;N.save();const V=_.data.datasets[0].label.split("\n"),X=(_.chartArea.left+_.chartArea.right)/2,re=(_.chartArea.top+_.chartArea.bottom)/2;N.textAlign="center",N.textBaseline="middle",N.font=`24px ${w}`,N.fillStyle=M.propertyValue("chart-color-center-text"),N.fillText(V[0],X,re-10),V.length>1&&(N.font=`14px ${w}`,N.fillStyle=M.propertyValue("chart-color-center-text-description"),N.fillText(V[1],X,re+10)),N.restore()}}]}ngOnInit(){new pl.h(this.chartCanvasRef,this.chartTooltipRef,(_,M)=>M+_.caretX+"px",(_,M)=>M+_.caretY-_.height-10+"px").getBody=_=>this.getChartTooltipBody(_),Er().merge(this.chartConfig,this.config),this.prepareFn.emit([this.chartConfig,this.data])}ngOnChanges(){this.prepareFn.emit([this.chartConfig,this.data]),this.setChartSliceBorderWidth()}getChartTooltipBody(t){const o=t[0].split(": ");return this.showLabelAsTooltip?o[0]:(o[1]=this.isBytesData?this.dimlessBinary.transform(o[1]):this.dimless.transform(o[1]),o.join(": "))}setChartSliceBorderWidth(){let t=0;Er().forEach(this.chartConfig.dataset[0].data,function(o){o>0&&(t+=1)}),this.chartConfig.dataset[0].borderWidth=t>1?1:0}}return n.\u0275fac=function(t){return new(t||n)(e.Y36(Ar.$),e.Y36(gr.n),e.Y36($m.P))},n.\u0275cmp=e.Xpm({type:n,selectors:[["cd-health-pie"]],viewQuery:function(t,o){if(1&t&&(e.Gf(qC,7),e.Gf(eM,7)),2&t){let l;e.iGM(l=e.CRH())&&(o.chartCanvasRef=l.first),e.iGM(l=e.CRH())&&(o.chartTooltipRef=l.first)}},inputs:{data:"data",config:"config",isBytesData:"isBytesData",tooltipFn:"tooltipFn",showLabelAsTooltip:"showLabelAsTooltip"},outputs:{prepareFn:"prepareFn"},features:[e.TTD],decls:5,vars:6,consts:[[1,"chart-container"],["baseChart","",1,"chart-canvas",3,"datasets","chartType","options","labels","colors","plugins"],["chartCanvas",""],[1,"chartjs-tooltip"],["chartTooltip",""]],template:function(t,o){1&t&&(e.TgZ(0,"div",0),e._UZ(1,"canvas",1,2)(3,"div",3,4),e.qZA()),2&t&&(e.xp6(1),e.Q6J("datasets",o.chartConfig.dataset)("chartType",o.chartConfig.chartType)("options",o.chartConfig.options)("labels",o.chartConfig.labels)("colors",o.chartConfig.colors)("plugins",o.doughnutChartPlugins))},directives:[Ks.jh],styles:['.chart-container[_ngcontent-%COMP%]{cursor:pointer;margin:auto;overflow:visible;position:absolute}canvas[_ngcontent-%COMP%]{user-select:none}.chartjs-tooltip[_ngcontent-%COMP%]{background:rgba(0,0,0,.7);border-radius:3px;color:#fff;font-family:Helvetica Neue,Helvetica,Arial,sans-serif!important;opacity:0;pointer-events:none;position:absolute;transform:translate(-50%);transition:all .1s ease}.chartjs-tooltip.transform-left[_ngcontent-%COMP%]{transform:translate(-10%)}.chartjs-tooltip.transform-left[_ngcontent-%COMP%]:after{left:10%}.chartjs-tooltip.transform-right[_ngcontent-%COMP%]{transform:translate(-90%)}.chartjs-tooltip.transform-right[_ngcontent-%COMP%]:after{left:90%}.chartjs-tooltip[_ngcontent-%COMP%]:after{border-color:#000 transparent transparent transparent;border-style:solid;border-width:5px;content:" ";left:50%;margin-left:-5px;position:absolute;top:100%}  .chartjs-tooltip-key{display:inline-block;height:10px;margin-right:10px;width:10px}.chart-container[_ngcontent-%COMP%]{height:100%;margin-left:auto;margin-right:auto;position:unset;width:100%}.chart-canvas[_ngcontent-%COMP%]{height:100%;margin-left:auto;margin-right:auto;max-height:100%;max-width:100%;position:unset;width:100%}']}),n})();var lm=(()=>{return(n=lm||(lm={})).HEALTH_ERR="health-color-error",n.HEALTH_WARN="health-color-warning",n.HEALTH_OK="health-color-healthy",lm;var n})();let Vb=(()=>{class n{constructor(t){this.cssHelper=t}transform(t){return Object.keys(lm).includes(t)?{color:this.cssHelper.propertyValue(lm[t])}:null}}return n.\u0275fac=function(t){return new(t||n)(e.Y36($m.P,16))},n.\u0275pipe=e.Yjl({name:"healthColor",type:n,pure:!0}),n})();var Cv=(()=>{return(n=Cv||(Cv={})).HEALTH_ERR="error",n.HEALTH_WARN="warning",n.HEALTH_OK="ok",Cv;var n})();let nM=(()=>{class n{transform(t){return Object.keys(Cv).includes(t)?Cv[t]:null}}return n.\u0275fac=function(t){return new(t||n)},n.\u0275pipe=e.Yjl({name:"healthLabel",type:n,pure:!0}),n})(),rM=(()=>{class n{transform(t){return t?"" + t.monmap.mons.length.toString() + " (quorum " + t.quorum.join(", ") + ")":""}}return n.\u0275fac=function(t){return new(t||n)},n.\u0275pipe=e.Yjl({name:"monSummary",type:n,pure:!0}),n})(),iM=(()=>{class n{transform(t){if(!t)return"";let o=0,l=0,_=0,M=0;Er().each(t.osds,X=>{X.in&&o++,X.up&&l++,X.state.includes("nearfull")&&_++,X.state.includes("full")&&M++});const w=[{content:`${t.osds.length} ${"total"}`,class:""}];w.push({content:"",class:"card-text-line-break"}),w.push({content:`${l} ${"up"}, ${o} ${"in"}`,class:""});const N=t.osds.length-l,V=t.osds.length-o;if(N>0||V>0){w.push({content:"",class:"card-text-line-break"});const X=N>0?`${N} ${"down"}`:"",oe=V>0?`${V} ${"out"}`:"";w.push({content:`${X}${N>0&&V>0?", ":""}${oe}`,class:"card-text-error"})}return _>0&&w.push({content:"",class:"card-text-line-break"},{content:`${_} ${"near full"}`,class:"card-text-error"},{content:"",class:"card-text-line-break"}),M>0&&w.push({content:`${M} ${"full"}`,class:"card-text-error"}),w}}return n.\u0275fac=function(t){return new(t||n)},n.\u0275pipe=e.Yjl({name:"osdSummary",type:n,pure:!0}),n})(),oM=(()=>{class n{transform(t){if(!t)return"";let o="n/a";const l=Er().isUndefined(t.active_name)?"":`${"active daemon"}: ${t.active_name}`;l.length>0&&(o="1");const _=t.standbys.map(V=>V.name).join(", "),M=_?`${"standby daemons"}: ${_}`:"",w=t.standbys.length,N=[{content:`${o} ${"active"}`,class:"popover-info",titleText:l}];return N.push({content:"",class:"card-text-line-break",titleText:""}),N.push({content:`${w} ${"standby"}`,class:"popover-info",titleText:M}),N}}return n.\u0275fac=function(t){return new(t||n)},n.\u0275pipe=e.Yjl({name:"mgrSummary",type:n,pure:!0}),n})(),sM=(()=>{class n{transform(t){if(!t)return"";let o="",l="",_=0,M=0,w=0;Er().each(t.standbys,()=>{_+=1}),t.standbys&&!t.filesystems?(o=`${_} ${"up"}`,l="no filesystems"):0===t.filesystems.length?o="no filesystems":(Er().each(t.filesystems,Pe=>{Er().each(Pe.mdsmap.info,De=>{"up:standby-replay"===De.state?w+=1:M+=1})}),o=`${M} ${"active"}`,l=`${_+w} ${"standby"}`);const N=t.standbys.map(Pe=>Pe.name).join(", "),V=N?`${"standby daemons"}: ${N}`:"",X=t.filesystems?t.filesystems.length:0,oe=Object.values(X>0?t.filesystems[0].mdsmap.info:{}).map(Pe=>Pe.name).join(", ");let fe=oe?`${"active daemon"}: ${oe}`:"";!M&&X>0&&(fe=`${w} ${"standbyReplay"}`);const ve=[{content:o,class:"popover-info",titleText:fe}];return l&&(ve.push({content:"",class:"card-text-line-break",titleText:""}),ve.push({content:l,class:"popover-info",titleText:V})),ve}}return n.\u0275fac=function(t){return new(t||n)},n.\u0275pipe=e.Yjl({name:"mdsSummary",type:n,pure:!0}),n})();function aM(n,s){1&n&&e.GkF(0)}function Zb(n,s){if(1&n&&(e.TgZ(0,"li")(1,"span",22),e.ALo(2,"healthColor"),e._uU(3),e.qZA(),e._uU(4),e.qZA()),2&n){const t=s.$implicit;e.xp6(1),e.ekj("health-warn-description","HEALTH_WARN"===t.severity),e.Q6J("ngStyle",e.lcZ(2,5,t.severity)),e.xp6(2),e.hij(" ",t.type,""),e.xp6(1),e.hij(": ",t.summary.message," ")}}function Wb(n,s){if(1&n&&(e.YNc(0,aM,1,0,"ng-container",20),e.TgZ(1,"ul"),e.YNc(2,Zb,5,7,"li",21),e.qZA()),2&n){e.oxw(4);const t=e.MAs(5),o=e.oxw();e.Q6J("ngTemplateOutlet",t),e.xp6(2),e.Q6J("ngForOf",o.healthData.health.checks)}}function Jb(n,s){1&n&&e._UZ(0,"i",23)}function Qb(n,s){if(1&n&&(e.ynx(0),e.YNc(1,Wb,3,2,"ng-template",null,17,e.W1O),e.TgZ(3,"div",18),e.ALo(4,"healthColor"),e._uU(5),e.ALo(6,"uppercase"),e.ALo(7,"healthLabel"),e.YNc(8,Jb,1,0,"i",19),e.qZA(),e.BQk()),2&n){const t=e.MAs(2),o=e.oxw(4);e.xp6(3),e.Q6J("ngStyle",e.lcZ(4,4,o.healthData.health.status))("ngbPopover",t),e.xp6(2),e.hij(" ",e.lcZ(6,6,e.lcZ(7,8,o.healthData.health.status))," "),e.xp6(3),e.Q6J("ngIf","HEALTH_OK"!==(null==o.healthData.health?null:o.healthData.health.status))}}function Kb(n,s){if(1&n&&(e.ynx(0),e.TgZ(1,"div",22),e.ALo(2,"healthColor"),e._uU(3),e.ALo(4,"uppercase"),e.ALo(5,"healthLabel"),e.qZA(),e.BQk()),2&n){const t=e.oxw(4);e.xp6(1),e.Q6J("ngStyle",e.lcZ(2,2,t.healthData.health.status)),e.xp6(2),e.hij(" ",e.lcZ(4,4,e.lcZ(5,6,t.healthData.health.status))," ")}}function Xb(n,s){if(1&n&&(e.TgZ(0,"cd-info-card",15),e.YNc(1,Qb,9,10,"ng-container",16),e.YNc(2,Kb,6,8,"ng-container",16),e.qZA()),2&n){const t=e.oxw(3);e.xp6(1),e.Q6J("ngIf",(null==t.healthData.health||null==t.healthData.health.checks?null:t.healthData.health.checks.length)>0),e.xp6(1),e.Q6J("ngIf",!(null!=t.healthData.health&&null!=t.healthData.health.checks&&t.healthData.health.checks.length))}}function qb(n,s){if(1&n&&(e.TgZ(0,"cd-info-card",24),e._uU(1),e.qZA()),2&n){const t=e.oxw(3);e.xp6(1),e.hij(" ",t.healthData.hosts," total ")}}function eS(n,s){if(1&n&&(e.TgZ(0,"cd-info-card",25),e._uU(1),e.ALo(2,"monSummary"),e.qZA()),2&n){const t=e.oxw(3);e.xp6(1),e.hij(" ",e.lcZ(2,1,t.healthData.mon_status)," ")}}function tS(n,s){if(1&n&&(e.TgZ(0,"span",28),e._uU(1),e.qZA()),2&n){const t=s.$implicit;e.Q6J("ngClass",t.class),e.xp6(1),e.hij(" ",t.content," ")}}function wy(n,s){if(1&n&&(e.TgZ(0,"cd-info-card",26),e.YNc(1,tS,2,2,"span",27),e.qZA()),2&n){const t=s.ngIf;e.xp6(1),e.Q6J("ngForOf",t)}}function xy(n,s){if(1&n&&(e.TgZ(0,"span",31),e._uU(1),e.qZA()),2&n){const t=s.$implicit;e.Q6J("ngClass",t.class)("title",null!=t.titleText?t.titleText:""),e.xp6(1),e.hij(" ",t.content," ")}}function um(n,s){if(1&n&&(e.TgZ(0,"cd-info-card",29),e.YNc(1,xy,2,3,"span",30),e.ALo(2,"mgrSummary"),e.qZA()),2&n){const t=e.oxw(3);e.xp6(1),e.Q6J("ngForOf",e.lcZ(2,1,t.healthData.mgr_map))}}function lM(n,s){if(1&n&&(e.TgZ(0,"cd-info-card",32),e._uU(1),e.qZA()),2&n){const t=e.oxw(3);e.xp6(1),e.hij(" ",t.healthData.rgw," total ")}}function uM(n,s){if(1&n&&(e.TgZ(0,"span",31),e._uU(1),e.qZA()),2&n){const t=s.$implicit;e.Q6J("ngClass",t.class)("title",null!==t.titleText?t.titleText:""),e.xp6(1),e.hij(" ",t.content," ")}}function Hm(n,s){if(1&n&&(e.TgZ(0,"cd-info-card",33),e.YNc(1,uM,2,3,"span",30),e.qZA()),2&n){const t=s.ngIf;e.Q6J("contentClass",(t.length>1?"text-area-size-2":"")+" content-highlight"),e.xp6(1),e.Q6J("ngForOf",t)}}const WA=function(n){return{"card-text-error":n}};function Ry(n,s){if(1&n&&(e.TgZ(0,"cd-info-card",34),e._uU(1),e._UZ(2,"span",35),e._uU(3),e.TgZ(4,"span",28),e._uU(5),e.qZA()()),2&n){const t=e.oxw(3);e.xp6(1),e.hij(" ",t.healthData.iscsi_daemons.up+t.healthData.iscsi_daemons.down," total "),e.xp6(2),e.hij(" ",t.healthData.iscsi_daemons.up," up, "),e.xp6(1),e.Q6J("ngClass",e.VKq(4,WA,t.healthData.iscsi_daemons.down>0)),e.xp6(1),e.hij("",t.healthData.iscsi_daemons.down," down")}}function JA(n,s){if(1&n&&(e.TgZ(0,"cd-info-group",6),e.YNc(1,Xb,3,2,"cd-info-card",7),e.YNc(2,qb,2,1,"cd-info-card",8),e.YNc(3,eS,3,3,"cd-info-card",9),e.YNc(4,wy,2,1,"cd-info-card",10),e.ALo(5,"osdSummary"),e.YNc(6,um,3,3,"cd-info-card",11),e.YNc(7,lM,2,1,"cd-info-card",12),e.YNc(8,Hm,2,2,"cd-info-card",13),e.ALo(9,"mdsSummary"),e.YNc(10,Ry,6,6,"cd-info-card",14),e.qZA()),2&n){const t=e.oxw().ngIf,o=e.oxw();e.xp6(1),e.Q6J("ngIf",null==o.healthData.health?null:o.healthData.health.status),e.xp6(1),e.Q6J("ngIf",null!=o.healthData.hosts),e.xp6(1),e.Q6J("ngIf",o.healthData.mon_status),e.xp6(1),e.Q6J("ngIf",e.lcZ(5,8,o.healthData.osd_map)),e.xp6(2),e.Q6J("ngIf",o.healthData.mgr_map),e.xp6(1),e.Q6J("ngIf",t.rgw&&null!=(null==o.healthData?null:o.healthData.rgw)),e.xp6(1),e.Q6J("ngIf",e.lcZ(9,10,t.cephfs&&o.healthData.fs_map)),e.xp6(2),e.Q6J("ngIf",t.iscsi&&null!=(null==o.healthData?null:o.healthData.iscsi_daemons))}}function nS(n,s){if(1&n){const t=e.EpF();e.TgZ(0,"cd-info-card",42)(1,"cd-health-pie",43),e.NdJ("prepareFn",function(l){return e.CHM(t),e.oxw(3).prepareRawUsage(l[0],l[1])}),e.qZA()()}if(2&n){const t=e.oxw(3);e.xp6(1),e.Q6J("data",t.healthData)("config",t.rawCapacityChartConfig)("isBytesData",!0)}}function rS(n,s){if(1&n){const t=e.EpF();e.TgZ(0,"cd-info-card",44)(1,"cd-health-pie",45),e.NdJ("prepareFn",function(l){return e.CHM(t),e.oxw(3).prepareObjects(l[0],l[1])}),e.qZA()()}if(2&n){const t=e.oxw(3);e.xp6(1),e.Q6J("data",t.healthData)}}function QA(n,s){1&n&&e.GkF(0)}function Va(n,s){if(1&n&&(e.TgZ(0,"li"),e._uU(1),e.qZA()),2&n){const t=s.$implicit;e.xp6(1),e.AsE(" ",t.key,": ",t.value," ")}}function cM(n,s){if(1&n&&(e.YNc(0,QA,1,0,"ng-container",20),e.TgZ(1,"ul"),e.YNc(2,Va,2,2,"li",21),e.ALo(3,"keyvalue"),e.qZA()),2&n){e.oxw(3);const t=e.MAs(5),o=e.oxw();e.Q6J("ngTemplateOutlet",t),e.xp6(2),e.Q6J("ngForOf",e.lcZ(3,2,o.healthData.pg_info.statuses))}}function dM(n,s){if(1&n){const t=e.EpF();e.TgZ(0,"cd-info-card",46),e.YNc(1,cM,4,4,"ng-template",null,47,e.W1O),e.TgZ(3,"div",48)(4,"div",49)(5,"cd-health-pie",50),e.NdJ("prepareFn",function(l){return e.CHM(t),e.oxw(3).preparePgStatus(l[0],l[1])}),e.qZA()()()()}if(2&n){const t=e.MAs(2),o=e.oxw(3);e.xp6(4),e.Q6J("ngbPopover",t),e.xp6(1),e.Q6J("data",o.healthData)("config",o.pgStatusChartConfig)}}function fM(n,s){if(1&n&&(e.TgZ(0,"cd-info-card",51),e._uU(1),e.qZA()),2&n){const t=e.oxw(3);e.xp6(1),e.hij(" ",t.healthData.pools.length," ")}}function J1(n,s){if(1&n&&(e.TgZ(0,"cd-info-card",52),e._uU(1),e.ALo(2,"dimless"),e.qZA()),2&n){const t=e.oxw(3);e.xp6(1),e.hij(" ",e.lcZ(2,1,t.healthData.pg_info.pgs_per_osd)," ")}}function pM(n,s){if(1&n&&(e.TgZ(0,"cd-info-group",36),e.YNc(1,nS,2,3,"cd-info-card",37),e.YNc(2,rS,2,1,"cd-info-card",38),e.YNc(3,dM,6,3,"cd-info-card",39),e.YNc(4,fM,2,1,"cd-info-card",40),e.YNc(5,J1,3,3,"cd-info-card",41),e.qZA()),2&n){const t=e.oxw(2);e.xp6(1),e.Q6J("ngIf",t.healthData.df),e.xp6(1),e.Q6J("ngIf",null!=(null==t.healthData.pg_info||null==t.healthData.pg_info.object_stats?null:t.healthData.pg_info.object_stats.num_objects)),e.xp6(1),e.Q6J("ngIf",t.healthData.pg_info),e.xp6(1),e.Q6J("ngIf",t.healthData.pools),e.xp6(1),e.Q6J("ngIf",t.healthData.pg_info)}}function Q1(n,s){if(1&n){const t=e.EpF();e.TgZ(0,"cd-info-card",58)(1,"cd-health-pie",50),e.NdJ("prepareFn",function(l){return e.CHM(t),e.oxw(3).prepareReadWriteRatio(l[0],l[1])}),e.qZA()()}if(2&n){const t=e.oxw(3);e.xp6(1),e.Q6J("data",t.healthData)("config",t.clientStatsConfig)}}function K1(n,s){if(1&n){const t=e.EpF();e.TgZ(0,"cd-info-card",59)(1,"cd-health-pie",50),e.NdJ("prepareFn",function(l){return e.CHM(t),e.oxw(3).prepareClientThroughput(l[0],l[1])}),e.qZA()()}if(2&n){const t=e.oxw(3);e.xp6(1),e.Q6J("data",t.healthData)("config",t.clientStatsConfig)}}function Nd(n,s){if(1&n&&(e.TgZ(0,"cd-info-card",60),e._uU(1),e.ALo(2,"dimlessBinary"),e.qZA()),2&n){const t=e.oxw(3);e.xp6(1),e.hij(" ",e.lcZ(2,1,t.healthData.client_perf.recovering_bytes_per_sec)+"/s"," ")}}function KA(n,s){if(1&n&&(e.TgZ(0,"cd-info-card",61),e._uU(1),e.qZA()),2&n){const t=e.oxw(3);e.xp6(1),e.hij(" ",t.healthData.scrub_status," ")}}function iS(n,s){if(1&n&&(e.TgZ(0,"cd-info-group",53),e.YNc(1,Q1,2,2,"cd-info-card",54),e.YNc(2,K1,2,2,"cd-info-card",55),e.YNc(3,Nd,3,3,"cd-info-card",56),e.YNc(4,KA,2,1,"cd-info-card",57),e.qZA()),2&n){const t=e.oxw(2);e.xp6(1),e.Q6J("ngIf",t.healthData.client_perf),e.xp6(1),e.Q6J("ngIf",t.healthData.client_perf),e.xp6(1),e.Q6J("ngIf",t.healthData.client_perf),e.xp6(1),e.Q6J("ngIf",t.healthData.scrub_status)}}const hM=function(n){return[n]};function _M(n,s){if(1&n&&(e.ynx(0),e.TgZ(1,"p",62),e.tHW(2,63),e._UZ(3,"i",28)(4,"a",64),e.N_p(),e.qZA(),e.BQk()),2&n){const t=e.oxw(3);e.xp6(3),e.Q6J("ngClass",e.VKq(1,hM,t.icons.infoCircle))}}function oS(n,s){if(1&n&&e.YNc(0,_M,5,3,"ng-container",16),2&n){const t=e.oxw(2);e.Q6J("ngIf",t.permissions.log.read)}}function sS(n,s){if(1&n&&(e.TgZ(0,"div",1),e.YNc(1,JA,11,12,"cd-info-group",2),e.YNc(2,pM,6,5,"cd-info-group",3),e.YNc(3,iS,5,4,"cd-info-group",4),e.YNc(4,oS,1,1,"ng-template",null,5,e.W1O),e.qZA()),2&n){const t=e.oxw();e.xp6(1),e.Q6J("ngIf",(null==t.healthData.health?null:t.healthData.health.status)||t.healthData.mon_status||t.healthData.osd_map||t.healthData.mgr_map||null!=t.healthData.hosts||null!=t.healthData.rgw||t.healthData.fs_map||null!=t.healthData.iscsi_daemons),e.xp6(1),e.Q6J("ngIf",t.healthData.pools||t.healthData.df||t.healthData.pg_info),e.xp6(1),e.Q6J("ngIf",t.healthData.client_perf||t.healthData.scrub_status)}}let aS=(()=>{class n{constructor(t,o,l,_,M,w,N,V,X){this.healthService=t,this.osdService=o,this.authStorageService=l,this.pgCategoryService=_,this.featureToggles=M,this.refreshIntervalService=w,this.dimlessBinary=N,this.dimless=V,this.cssHelper=X,this.osdSettings=new M1,this.interval=new fc.w,this.icons=No.P,this.clientStatsConfig={colors:[{backgroundColor:[this.cssHelper.propertyValue("chart-color-cyan"),this.cssHelper.propertyValue("chart-color-purple")]}]},this.rawCapacityChartConfig={colors:[{backgroundColor:[this.cssHelper.propertyValue("chart-color-blue"),this.cssHelper.propertyValue("chart-color-gray")]}]},this.pgStatusChartConfig={options:{events:[""]}},this.permissions=this.authStorageService.getPermissions(),this.enabledFeature$=this.featureToggles.get()}ngOnInit(){this.interval=this.refreshIntervalService.intervalData$.subscribe(()=>{this.getHealth()}),this.osdService.getOsdSettings().pipe((0,g_.q)(1)).subscribe(t=>{this.osdSettings=t})}ngOnDestroy(){this.interval.unsubscribe()}getHealth(){this.healthService.getMinimalHealth().subscribe(t=>{this.healthData=t})}prepareReadWriteRatio(t){const o=[],l=[],_=this.healthData.client_perf.write_op_per_sec+this.healthData.client_perf.read_op_per_sec;o.push(`${"Reads"}: ${this.dimless.transform(this.healthData.client_perf.read_op_per_sec)} ${"/s"}`),l.push(this.calcPercentage(this.healthData.client_perf.read_op_per_sec,_)),o.push(`${"Writes"}: ${this.dimless.transform(this.healthData.client_perf.write_op_per_sec)} ${"/s"}`),l.push(this.calcPercentage(this.healthData.client_perf.write_op_per_sec,_)),t.labels=o,t.dataset[0].data=l,t.dataset[0].label=`${this.dimless.transform(_)}\n${"IOPS"}`}prepareClientThroughput(t){const o=[],l=[],_=this.healthData.client_perf.read_bytes_sec+this.healthData.client_perf.write_bytes_sec;o.push(`${"Reads"}: ${this.dimlessBinary.transform(this.healthData.client_perf.read_bytes_sec)}${"/s"}`),l.push(this.calcPercentage(this.healthData.client_perf.read_bytes_sec,_)),o.push(`${"Writes"}: ${this.dimlessBinary.transform(this.healthData.client_perf.write_bytes_sec)}${"/s"}`),l.push(this.calcPercentage(this.healthData.client_perf.write_bytes_sec,_)),t.labels=o,t.dataset[0].data=l,t.dataset[0].label=`${this.dimlessBinary.transform(_).replace(" ","\n")}${"/s"}`}prepareRawUsage(t,o){const l=this.calcPercentage(o.df.stats.total_bytes-o.df.stats.total_used_raw_bytes,o.df.stats.total_bytes),_=this.calcPercentage(o.df.stats.total_used_raw_bytes,o.df.stats.total_bytes);this.color=_/100>=this.osdSettings.nearfull_ratio?"chart-color-red":_/100>=this.osdSettings.full_ratio?"chart-color-yellow":"chart-color-blue",this.rawCapacityChartConfig.colors[0].backgroundColor[0]=this.cssHelper.propertyValue(this.color),t.dataset[0].data=[_,l],t.labels=[`${"Used"}: ${this.dimlessBinary.transform(o.df.stats.total_used_raw_bytes)}`,`${"Avail."}: ${this.dimlessBinary.transform(o.df.stats.total_bytes-o.df.stats.total_used_raw_bytes)}`],t.dataset[0].label=`${_}%\nof ${this.dimlessBinary.transform(o.df.stats.total_bytes)}`}preparePgStatus(t,o){const l={};let _=0;Er().forEach(o.pg_info.statuses,(M,w)=>{const N=this.pgCategoryService.getTypeByStates(w);Er().isUndefined(l[N])&&(l[N]=0),l[N]+=M,_+=M});for(const M of this.pgCategoryService.getAllTypes())Er().isUndefined(l[M])&&(l[M]=0);t.dataset[0].data=this.pgCategoryService.getAllTypes().map(M=>this.calcPercentage(l[M],_)),t.labels=[`${"Clean"}: ${this.dimless.transform(l.clean)}`,`${"Working"}: ${this.dimless.transform(l.working)}`,`${"Warning"}: ${this.dimless.transform(l.warning)}`,`${"Unknown"}: ${this.dimless.transform(l.unknown)}`],t.dataset[0].label=`${_}\n${"PGs"}`}prepareObjects(t,o){const l=o.pg_info.object_stats.num_object_copies,M=this.calcPercentage(l-o.pg_info.object_stats.num_objects_misplaced-o.pg_info.object_stats.num_objects_degraded-o.pg_info.object_stats.num_objects_unfound,l),w=this.calcPercentage(o.pg_info.object_stats.num_objects_misplaced,l),N=this.calcPercentage(o.pg_info.object_stats.num_objects_degraded,l),V=this.calcPercentage(o.pg_info.object_stats.num_objects_unfound,l);t.labels=[`${"Healthy"}: ${M}%`,`${"Misplaced"}: ${w}%`,`${"Degraded"}: ${N}%`,`${"Unfound"}: ${V}%`],t.dataset[0].data=[M,w,N,V],t.dataset[0].label=`${this.dimless.transform(o.pg_info.object_stats.num_objects)}\n${"objects"}`}isClientReadWriteChartShowable(){return(this.healthData.client_perf.read_op_per_sec||0)+(this.healthData.client_perf.write_op_per_sec||0)>0}calcPercentage(t,o){return Er().isNumber(t)&&Er().isNumber(o)&&0!==o?Math.ceil(t/o*100*100)/100:0}}return n.\u0275fac=function(t){return new(t||n)(e.Y36(Ub),e.Y36(cc),e.Y36(zi.j),e.Y36(Bb.j),e.Y36(W1.l),e.Y36(Z1),e.Y36(Ar.$),e.Y36(gr.n),e.Y36($m.P))},n.\u0275cmp=e.Xpm({type:n,selectors:[["cd-health"]],decls:2,vars:3,consts:function(){let s,t,o,l,_,M,w,N,V,X,re,oe,fe,ve,Pe,De,Ie,Ae,Y,Et,ft;return s="Status",t="Capacity",o="Performance",l="Cluster Status",_="Hosts",M="Monitors",w="OSDs",N="Managers",V="Object Gateways",X="Metadata Servers",re="iSCSI Gateways",oe="Raw Capacity",fe="Objects",ve="PG Status",Pe="Pools",De="PGs per OSD",Ie="Client Read/Write",Ae="Client Throughput",Y="Recovery Throughput",Et="Scrubbing",ft="" + "\ufffd#3\ufffd" + "" + "\ufffd/#3\ufffd" + " See " + "\ufffd#4\ufffd" + "Logs" + "\ufffd/#4\ufffd" + " for more details.",[["class","container-fluid",4,"ngIf"],[1,"container-fluid"],["groupTitle",s,4,"ngIf"],["groupTitle",t,4,"ngIf"],["groupTitle",o,4,"ngIf"],["logsLink",""],["groupTitle",s],["cardTitle",l,"class","cd-status-card","contentClass","content-highlight",4,"ngIf"],["cardTitle",_,"link","/hosts","class","cd-status-card","contentClass","content-highlight",4,"ngIf"],["cardTitle",M,"link","/monitor","class","cd-status-card","contentClass","content-highlight",4,"ngIf"],["cardTitle",w,"link","/osd","class","cd-status-card","contentClass","content-highlight",4,"ngIf"],["cardTitle",N,"class","cd-status-card","contentClass","content-highlight",4,"ngIf"],["cardTitle",V,"link","/rgw/daemon","class","cd-status-card","contentClass","content-highlight",4,"ngIf"],["cardTitle",X,"class","cd-status-card",3,"contentClass",4,"ngIf"],["cardTitle",re,"link","/block/iscsi","class","cd-status-card","contentClass","content-highlight",4,"ngIf"],["cardTitle",l,"contentClass","content-highlight",1,"cd-status-card"],[4,"ngIf"],["healthChecks",""],["popoverClass","info-card-popover-cluster-status",1,"info-card-content-clickable",3,"ngStyle","ngbPopover"],["class","fa fa-exclamation-triangle",4,"ngIf"],[4,"ngTemplateOutlet"],[4,"ngFor","ngForOf"],[3,"ngStyle"],[1,"fa","fa-exclamation-triangle"],["cardTitle",_,"link","/hosts","contentClass","content-highlight",1,"cd-status-card"],["cardTitle",M,"link","/monitor","contentClass","content-highlight",1,"cd-status-card"],["cardTitle",w,"link","/osd","contentClass","content-highlight",1,"cd-status-card"],[3,"ngClass",4,"ngFor","ngForOf"],[3,"ngClass"],["cardTitle",N,"contentClass","content-highlight",1,"cd-status-card"],[3,"ngClass","title",4,"ngFor","ngForOf"],[3,"ngClass","title"],["cardTitle",V,"link","/rgw/daemon","contentClass","content-highlight",1,"cd-status-card"],["cardTitle",X,1,"cd-status-card",3,"contentClass"],["cardTitle",re,"link","/block/iscsi","contentClass","content-highlight",1,"cd-status-card"],[1,"card-text-line-break"],["groupTitle",t],["cardTitle",oe,"class","cd-capacity-card cd-chart-card","contentClass","content-chart",4,"ngIf"],["cardTitle",fe,"class","cd-capacity-card cd-chart-card","contentClass","content-chart",4,"ngIf"],["cardTitle",ve,"class","cd-capacity-card cd-chart-card","contentClass","content-chart",4,"ngIf"],["cardTitle",Pe,"link","/pool","class","cd-capacity-card","contentClass","content-highlight",4,"ngIf"],["cardTitle",De,"class","cd-capacity-card","contentClass","content-highlight",4,"ngIf"],["cardTitle",oe,"contentClass","content-chart",1,"cd-capacity-card","cd-chart-card"],[3,"data","config","isBytesData","prepareFn"],["cardTitle",fe,"contentClass","content-chart",1,"cd-capacity-card","cd-chart-card"],[3,"data","prepareFn"],["cardTitle",ve,"contentClass","content-chart",1,"cd-capacity-card","cd-chart-card"],["pgStatus",""],[1,"pg-status-popover-wrapper"],[3,"ngbPopover"],[3,"data","config","prepareFn"],["cardTitle",Pe,"link","/pool","contentClass","content-highlight",1,"cd-capacity-card"],["cardTitle",De,"contentClass","content-highlight",1,"cd-capacity-card"],["groupTitle",o],["cardTitle",Ie,"class","cd-performance-card cd-chart-card","contentClass","content-chart",4,"ngIf"],["cardTitle",Ae,"class","cd-performance-card cd-chart-card","contentClass","content-chart",4,"ngIf"],["cardTitle",Y,"class","cd-performance-card","contentClass","content-highlight",4,"ngIf"],["cardTitle",Et,"class","cd-performance-card","contentClass","content-highlight",4,"ngIf"],["cardTitle",Ie,"contentClass","content-chart",1,"cd-performance-card","cd-chart-card"],["cardTitle",Ae,"contentClass","content-chart",1,"cd-performance-card","cd-chart-card"],["cardTitle",Y,"contentClass","content-highlight",1,"cd-performance-card"],["cardTitle",Et,"contentClass","content-highlight",1,"cd-performance-card"],[1,"logs-link"],ft,["routerLink","/logs"]]},template:function(t,o){1&t&&(e.YNc(0,sS,6,3,"div",0),e.ALo(1,"async")),2&t&&e.Q6J("ngIf",e.lcZ(1,1,o.healthData&&o.enabledFeature$))},directives:[p.O5,jb,KC,p.tP,p.sg,p.PC,Dr.o8,p.mk,tM,Bo.yS],pipes:[p.Ov,Vb,p.gd,nM,rM,iM,oM,sM,p.Nd,gr.n,Ar.$],styles:['cd-info-card[_ngcontent-%COMP%]{padding:0 .5vw}  cd-health .pg-status-popover-wrapper{position:relative}  cd-health .pg-status-popover-wrapper .popover{max-height:20vh;max-width:unset!important;min-width:unset!important;position:absolute;width:116%}  cd-health .pg-status-popover-wrapper .popover .popover-body{font-size:1rem;max-height:19vh;max-width:100%}.logs-link[_ngcontent-%COMP%]{text-align:center}.logs-link[_ngcontent-%COMP%]   a[_ngcontent-%COMP%]{color:#25828e}.card-text-error[_ngcontent-%COMP%]{color:#c9190b;display:inline}.card-text-line-break[_ngcontent-%COMP%]:after{content:"\\a";white-space:pre}.popover-info[_ngcontent-%COMP%]:hover{cursor:pointer}']}),n})();function lS(n,s){1&n&&e._UZ(0,"cd-health")}function gM(n,s){}function mM(n,s){if(1&n&&(e.ynx(0),e.TgZ(1,"nav",4,5),e.ynx(3,6),e.TgZ(4,"a",7),e.SDv(5,8),e.qZA(),e.YNc(6,lS,1,0,"ng-template",9),e.BQk(),e.ynx(7,6),e.TgZ(8,"a",7),e.SDv(9,10),e.qZA(),e.YNc(10,gM,0,0,"ng-template",9),e.BQk(),e.qZA(),e._UZ(11,"div",11),e.BQk()),2&n){const t=e.MAs(2);e.xp6(11),e.Q6J("ngbNavOutlet",t)}}function vM(n,s){1&n&&e._UZ(0,"cd-health",12)}let Mv=(()=>{class n{constructor(){this.hasGrafana=!1}}return n.\u0275fac=function(t){return new(t||n)},n.\u0275cmp=e.Xpm({type:n,selectors:[["cd-dashboard"]],decls:6,vars:2,consts:function(){let s,t;return s="Health",t="Statistics",[["aria-label","Dashboard"],["href","#main",1,"sr-only"],[4,"ngIf"],["id","main",4,"ngIf"],["ngbNav","",1,"nav-tabs"],["nav","ngbNav"],["ngbNavItem",""],["ngbNavLink",""],s,["ngbNavContent",""],t,[3,"ngbNavOutlet"],["id","main"]]},template:function(t,o){1&t&&(e.TgZ(0,"main",0)(1,"a",1),e._uU(2,"skip to content"),e.qZA(),e._UZ(3,"cd-refresh-selector"),e.YNc(4,mM,12,1,"ng-container",2),e.YNc(5,vM,1,0,"cd-health",3),e.qZA()),2&t&&(e.xp6(4),e.Q6J("ngIf",o.hasGrafana),e.xp6(1),e.Q6J("ngIf",!o.hasGrafana))},directives:[Hb,p.O5,Dr.Pz,Dr.nv,Dr.Vx,Dr.uN,aS,Dr.tO],styles:["main[_ngcontent-%COMP%]{padding-top:20px}"]}),n})();var Ov=i(5304),yM=i(95152),EM=i(33394),Av=i(40205);let X1=(()=>{class n extends ma.S{constructor(t){super(),this.http=t,this.apiPath="api/nfs-ganesha",this.uiApiPath="ui-api/nfs-ganesha",this.nfsAccessType=[{value:"RW",help:"Allows all operations"},{value:"RO",help:"Allows only operations that do not modify the server"},{value:"NONE",help:"Allows no access at all"}],this.nfsFsal=[{value:"CEPH",descr:"CephFS",disabled:!1},{value:"RGW",descr:"Object Gateway",disabled:!1}],this.nfsSquash={no_root_squash:["no_root_squash","noidsquash","none"],root_id_squash:["root_id_squash","rootidsquash","rootid"],root_squash:["root_squash","rootsquash","root"],all_squash:["all_squash","allsquash","all","allanonymous","all_anonymous"]}}list(){return this.http.get(`${this.apiPath}/export`)}get(t,o){return this.http.get(`${this.apiPath}/export/${t}/${o}`)}create(t){return this.http.post(`${this.apiPath}/export`,t,{headers:{Accept:this.getVersionHeaderValue(2,0)},observe:"response"})}update(t,o,l){return this.http.put(`${this.apiPath}/export/${t}/${o}`,l,{headers:{Accept:this.getVersionHeaderValue(2,0)},observe:"response"})}delete(t,o){return this.http.delete(`${this.apiPath}/export/${t}/${o}`,{headers:{Accept:this.getVersionHeaderValue(2,0)},observe:"response"})}listClusters(){return this.http.get(`${this.apiPath}/cluster`,{headers:{Accept:this.getVersionHeaderValue(0,1)}})}lsDir(t,o){return t?this.http.get(`${this.uiApiPath}/lsdir/${t}?root_dir=${o}`):(0,Av._)("Please specify a filesystem volume.")}fsals(){return this.http.get(`${this.uiApiPath}/fsals`)}filesystems(){return this.http.get(`${this.uiApiPath}/cephfs/filesystems`)}}return n.\u0275fac=function(t){return new(t||n)(e.LFG(y.eN))},n.\u0275prov=e.Yz7({token:n,factory:n.\u0275fac,providedIn:"root"}),n})();var uS=i(36569);const cS=["squashHelper"];function bM(n,s){1&n&&(e.TgZ(0,"span",14)(1,"span",15),e.SDv(2,16),e.qZA()())}function Dv(n,s){1&n&&(e.TgZ(0,"span"),e.SDv(1,37),e.qZA())}function wv(n,s){1&n&&(e.TgZ(0,"span"),e.ynx(1),e.SDv(2,38),e.BQk(),e._UZ(3,"br"),e.ynx(4),e.SDv(5,39),e.BQk(),e._uU(6," 192.168.0.10, 192.168.1.0/8 "),e.qZA())}function SM(n,s){if(1&n&&(e.TgZ(0,"option",40),e._uU(1),e.qZA()),2&n){const t=s.$implicit;e.Q6J("value",t.value),e.xp6(1),e.Oqu(t.value)}}function TM(n,s){if(1&n&&(e.TgZ(0,"span",15),e._uU(1),e.qZA()),2&n){const t=e.oxw().index,o=e.oxw();e.xp6(1),e.hij(" ",o.getAccessTypeHelp(t)," ")}}function CM(n,s){1&n&&e.GkF(0)}function dS(n,s){if(1&n&&(e.TgZ(0,"option",40),e._uU(1),e.qZA()),2&n){const t=s.$implicit;e.Q6J("value",t),e.xp6(1),e.Oqu(t)}}function fS(n,s){if(1&n){const t=e.EpF();e.TgZ(0,"div")(1,"div",17)(2,"div",18),e._uU(3),e.ALo(4,"ordinal"),e.TgZ(5,"span",19),e.NdJ("click",function(){const _=e.CHM(t).index;return e.oxw().removeClient(_)}),e._uU(6,"\xd7"),e.qZA()(),e.TgZ(7,"div",20)(8,"div",0)(9,"label",21),e.SDv(10,22),e.qZA(),e.TgZ(11,"div",23),e._UZ(12,"input",24),e.TgZ(13,"span",25),e.YNc(14,Dv,2,0,"span",26),e.YNc(15,wv,7,0,"span",26),e.qZA()()(),e.TgZ(16,"div",0)(17,"label",27),e.SDv(18,28),e.qZA(),e.TgZ(19,"div",23)(20,"select",29)(21,"option",30),e._uU(22),e.qZA(),e.YNc(23,SM,2,2,"option",31),e.qZA(),e.YNc(24,TM,2,1,"span",32),e.qZA()(),e.TgZ(25,"div",0)(26,"label",33)(27,"span"),e.SDv(28,34),e.qZA(),e.YNc(29,CM,1,0,"ng-container",35),e.qZA(),e.TgZ(30,"div",23)(31,"select",36)(32,"option",30),e._uU(33),e.qZA(),e.YNc(34,dS,2,2,"option",31),e.qZA()()()()()()}if(2&n){const t=s.$implicit,o=s.index,l=e.oxw(),_=e.MAs(4);e.xp6(1),e.Q6J("formGroup",t),e.xp6(2),e.hij(" ",e.lcZ(4,10,o+1)," "),e.xp6(11),e.Q6J("ngIf",l.showError(o,"addresses",_,"required")),e.xp6(1),e.Q6J("ngIf",l.showError(o,"addresses",_,"pattern")),e.xp6(7),e.Oqu(l.getNoAccessTypeDescr()),e.xp6(1),e.Q6J("ngForOf",l.nfsAccessType),e.xp6(1),e.Q6J("ngIf",l.getValue(o,"access_type")),e.xp6(5),e.Q6J("ngTemplateOutlet",l.squashHelperTpl),e.xp6(4),e.Oqu(l.getNoSquashDescr()),e.xp6(1),e.Q6J("ngForOf",l.nfsSquash)}}const pS=function(n){return[n]};let MM=(()=>{class n{constructor(t){this.nfsService=t,this.nfsSquash=Object.keys(this.nfsService.nfsSquash),this.nfsAccessType=this.nfsService.nfsAccessType,this.icons=No.P}ngOnInit(){Er().forEach(this.clients,t=>{this.addClient().patchValue(t)}),this.clientsFormArray=this.form.get("clients")}getNoAccessTypeDescr(){return this.form.getValue("access_type")?`${this.form.getValue("access_type")} ${"(inherited from global config)"}`:"-- Select the access type --"}getAccessTypeHelp(t){const o=this.nfsAccessType.find(l=>this.getValue(t,"access_type")===l.value);return Er().isObjectLike(o)?o.help:""}getNoSquashDescr(){return this.form.getValue("squash")?`${this.form.getValue("squash")} (${"inherited from global config"})`:"-- Select what kind of user id squashing is performed --"}addClient(){this.clientsFormArray=this.form.get("clients");const t="(([0-9]{1,3})\\.([0-9]{1,3})\\.([0-9]{1,3}).([0-9]{1,3})([/](\\d|[1-2]\\d|3[0-2]))?)",l=new tc.d({addresses:new _n.NI("",{validators:[_n.kI.required,_n.kI.pattern(`${t}([ ,]{1,2}${t})*`)]}),access_type:new _n.NI(""),squash:new _n.NI("")});return this.clientsFormArray.push(l),l}removeClient(t){this.clientsFormArray=this.form.get("clients"),this.clientsFormArray.removeAt(t)}showError(t,o,l,_){return this.form.controls.clients.controls[t].showError(o,l,_)}getValue(t,o){return this.clientsFormArray=this.form.get("clients"),this.clientsFormArray.at(t).getValue(o)}trackByFn(t){return t}}return n.\u0275fac=function(t){return new(t||n)(e.Y36(X1))},n.\u0275cmp=e.Xpm({type:n,selectors:[["cd-nfs-form-client"]],contentQueries:function(t,o,l){if(1&t&&e.Suo(l,cS,7),2&t){let _;e.iGM(_=e.CRH())&&(o.squashHelperTpl=_.first)}},inputs:{form:"form",clients:"clients"},decls:15,vars:7,consts:function(){let s,t,o,l,_,M,w,N,V;return s="Clients",t="Add clients",o="Any client can access",l="Addresses",_="Access Type",M="Squash",w="This field is required.",N="Must contain one or more comma-separated values",V="For example:",[[1,"form-group","row"],[1,"cd-col-form-label"],s,[1,"cd-col-form-input",3,"formGroup"],["formDir","ngForm"],["class","no-border text-muted",4,"ngIf"],["formArrayName","clients"],[4,"ngFor","ngForOf","ngForTrackBy"],[1,"row","my-2"],[1,"col-12"],[1,"float-end"],["name","add_client",1,"btn","btn-light",3,"click"],[3,"ngClass"],t,[1,"no-border","text-muted"],[1,"form-text","text-muted"],o,[1,"card",3,"formGroup"],[1,"card-header"],["name","remove_client","ngbTooltip","Remove",1,"float-end","clickable",3,"click"],[1,"card-body"],["for","addresses",1,"cd-col-form-label","required"],l,[1,"cd-col-form-input"],["type","text","name","addresses","id","addresses","formControlName","addresses","placeholder","192.168.0.10, 192.168.1.0/8",1,"form-control"],[1,"invalid-feedback"],[4,"ngIf"],["for","access_type",1,"cd-col-form-label"],_,["name","access_type","id","access_type","formControlName","access_type",1,"form-select"],["value",""],[3,"value",4,"ngFor","ngForOf"],["class","form-text text-muted",4,"ngIf"],["for","squash",1,"cd-col-form-label"],M,[4,"ngTemplateOutlet"],["name","squash","id","squash","formControlName","squash",1,"form-select"],w,N,V,[3,"value"]]},template:function(t,o){1&t&&(e.TgZ(0,"div",0)(1,"label",1),e.SDv(2,2),e.qZA(),e.TgZ(3,"div",3,4),e.YNc(5,bM,3,0,"span",5),e.ynx(6,6),e.YNc(7,fS,35,12,"div",7),e.BQk(),e.TgZ(8,"div",8)(9,"div",9)(10,"div",10)(11,"button",11),e.NdJ("click",function(){return o.addClient()}),e._UZ(12,"i",12),e.ynx(13),e.SDv(14,13),e.BQk(),e.qZA()()()()()()),2&t&&(e.xp6(3),e.Q6J("formGroup",o.form),e.xp6(2),e.Q6J("ngIf",0===o.form.get("clients").value.length),e.xp6(2),e.Q6J("ngForOf",o.clientsFormArray.controls)("ngForTrackBy",o.trackByFn),e.xp6(5),e.Q6J("ngClass",e.VKq(5,pS,o.icons.add)))},directives:[al.P,_n.JL,_n.sg,Ma.V,p.O5,_n.CE,p.sg,Dr._L,_e.o,_n.Fj,Il.b,_n.JJ,_n.u,_n.EJ,_n.YN,_n.Kr,p.tP,p.mk],pipes:[uS.f],styles:[""]}),n})();const hS=["nfsClients"];function OM(n,s){1&n&&(e.TgZ(0,"option",52),e.SDv(1,53),e.qZA())}function AM(n,s){1&n&&(e.TgZ(0,"option",52),e.SDv(1,54),e.qZA())}function XA(n,s){1&n&&(e.TgZ(0,"option",52),e.SDv(1,55),e.qZA())}function qA(n,s){if(1&n&&(e.TgZ(0,"option",56),e._uU(1),e.qZA()),2&n){const t=s.$implicit;e.Q6J("value",t.cluster_id),e.xp6(1),e.Oqu(t.cluster_id)}}const eD=function(){return["create"]},tD=function(n){return{modal:n}},_S=function(n){return{outlets:n}},q1=function(n){return["/services",n]};function DM(n,s){1&n&&(e.TgZ(0,"span",57),e.tHW(1,58),e._UZ(2,"a",59),e.N_p(),e.qZA()),2&n&&(e.xp6(2),e.Q6J("routerLink",e.VKq(6,q1,e.VKq(4,_S,e.VKq(2,tD,e.DdM(1,eD))))))}function wM(n,s){1&n&&(e.TgZ(0,"option",52),e.SDv(1,60),e.qZA())}function gS(n,s){1&n&&(e.TgZ(0,"option",52),e.SDv(1,61),e.qZA())}function xv(n,s){1&n&&(e.TgZ(0,"option",52),e.SDv(1,62),e.qZA())}function xM(n,s){if(1&n&&(e.TgZ(0,"option",63),e._uU(1),e.qZA()),2&n){const t=s.$implicit;e.Q6J("value",t.value)("disabled",t.disabled),e.xp6(1),e.Oqu(t.descr)}}function RM(n,s){1&n&&(e.TgZ(0,"span",57),e.SDv(1,64),e.qZA())}function NM(n,s){if(1&n&&(e.TgZ(0,"span",57),e.SDv(1,65),e.qZA()),2&n){const t=e.oxw(2);e.xp6(1),e.pQV(t.fsalAvailabilityError),e.QtT(1)}}function PM(n,s){1&n&&(e.TgZ(0,"option",52),e.SDv(1,69),e.qZA())}function IM(n,s){1&n&&(e.TgZ(0,"option",52),e.SDv(1,70),e.qZA())}function mS(n,s){1&n&&(e.TgZ(0,"option",52),e.SDv(1,71),e.qZA())}function LM(n,s){if(1&n&&(e.TgZ(0,"option",56),e._uU(1),e.qZA()),2&n){const t=s.$implicit;e.Q6J("value",t.name),e.xp6(1),e.Oqu(t.name)}}function FM(n,s){1&n&&(e.TgZ(0,"span",57),e.SDv(1,72),e.qZA())}function Bm(n,s){if(1&n){const t=e.EpF();e.TgZ(0,"div",8)(1,"label",66),e.SDv(2,67),e.qZA(),e.TgZ(3,"div",13)(4,"select",68),e.NdJ("change",function(){return e.CHM(t),e.oxw(2).pathChangeHandler()}),e.YNc(5,PM,2,0,"option",15),e.YNc(6,IM,2,0,"option",15),e.YNc(7,mS,2,0,"option",15),e.YNc(8,LM,2,2,"option",16),e.qZA(),e.YNc(9,FM,2,0,"span",17),e.qZA()()}if(2&n){e.oxw();const t=e.MAs(2),o=e.oxw();e.xp6(5),e.Q6J("ngIf",null===o.allFsNames),e.xp6(1),e.Q6J("ngIf",null!==o.allFsNames&&0===o.allFsNames.length),e.xp6(1),e.Q6J("ngIf",null!==o.allFsNames&&o.allFsNames.length>0),e.xp6(1),e.Q6J("ngForOf",o.allFsNames),e.xp6(1),e.Q6J("ngIf",o.nfsForm.showError("fs_name",t,"required"))}}function kM(n,s){1&n&&e._UZ(0,"input",79)}function vS(n,s){1&n&&(e.TgZ(0,"span",57),e.SDv(1,80),e.qZA())}const $M=function(n){return{required:n}};function yS(n,s){if(1&n&&(e.TgZ(0,"div",8)(1,"label",73),e.SDv(2,74),e.qZA(),e.TgZ(3,"div",13)(4,"div",26),e._UZ(5,"input",75),e.TgZ(6,"label",76),e.SDv(7,77),e.qZA()(),e._UZ(8,"br"),e.YNc(9,kM,1,0,"input",78),e.YNc(10,vS,2,0,"span",17),e.qZA()()),2&n){e.oxw();const t=e.MAs(2),o=e.oxw();e.xp6(1),e.Q6J("ngClass",e.VKq(3,$M,o.nfsForm.getValue("security_label"))),e.xp6(8),e.Q6J("ngIf",o.nfsForm.getValue("security_label")),e.xp6(1),e.Q6J("ngIf",o.nfsForm.showError("sec_label_xattr",t,"required"))}}function HM(n,s){1&n&&(e.TgZ(0,"span",57),e.SDv(1,85),e.qZA())}function ES(n,s){1&n&&(e.TgZ(0,"span",57),e.SDv(1,86),e.qZA())}function BM(n,s){1&n&&(e.TgZ(0,"span",57),e.SDv(1,87),e.qZA())}function Ny(n,s){if(1&n){const t=e.EpF();e.TgZ(0,"div",8)(1,"label",81)(2,"span",10),e.SDv(3,82),e.qZA(),e.TgZ(4,"cd-helper")(5,"p"),e.SDv(6,83),e.qZA()()(),e.TgZ(7,"div",13)(8,"input",84),e.NdJ("selectItem",function(){return e.CHM(t),e.oxw(2).pathChangeHandler()})("blur",function(){return e.CHM(t),e.oxw(2).pathChangeHandler()}),e.qZA(),e.YNc(9,HM,2,0,"span",17),e.YNc(10,ES,2,0,"span",17),e.YNc(11,BM,2,0,"span",17),e.qZA()()}if(2&n){e.oxw();const t=e.MAs(2),o=e.oxw();e.xp6(8),e.Q6J("ngbTypeahead",o.pathDataSource),e.xp6(1),e.Q6J("ngIf",o.nfsForm.showError("path",t,"required")),e.xp6(1),e.Q6J("ngIf",o.nfsForm.showError("path",t,"pattern")),e.xp6(1),e.Q6J("ngIf",o.nfsForm.showError("path",t,"pathNameNotAllowed"))}}function UM(n,s){1&n&&(e.TgZ(0,"span",57),e.SDv(1,90),e.qZA())}function bS(n,s){1&n&&(e.TgZ(0,"span",57),e.tHW(1,91),e._UZ(2,"a",92),e.N_p(),e.qZA())}function SS(n,s){if(1&n&&(e.TgZ(0,"div",8)(1,"label",81)(2,"span",10),e.SDv(3,88),e.qZA()(),e.TgZ(4,"div",13),e._UZ(5,"input",89),e.YNc(6,UM,2,0,"span",17),e.YNc(7,bS,3,0,"span",17),e.qZA()()),2&n){e.oxw();const t=e.MAs(2),o=e.oxw();e.xp6(5),e.Q6J("ngbTypeahead",o.bucketDataSource),e.xp6(1),e.Q6J("ngIf",o.nfsForm.showError("path",t,"required")),e.xp6(1),e.Q6J("ngIf",o.nfsForm.showError("path",t,"bucketNameNotAllowed"))}}function YM(n,s){1&n&&(e.TgZ(0,"span",57),e.SDv(1,93),e.qZA())}function jM(n,s){1&n&&(e.TgZ(0,"span",57),e.SDv(1,99),e.qZA())}function GM(n,s){1&n&&(e.TgZ(0,"span",57),e.SDv(1,100),e.qZA())}function Py(n,s){1&n&&(e.TgZ(0,"span",57),e.SDv(1,101),e.qZA())}function zM(n,s){if(1&n&&(e.TgZ(0,"div",8)(1,"label",94)(2,"span",10),e.SDv(3,95),e.qZA(),e.TgZ(4,"cd-helper")(5,"p"),e.tHW(6,96),e._UZ(7,"strong")(8,"strong"),e.N_p(),e.qZA(),e.TgZ(9,"p"),e.SDv(10,97),e.qZA()()(),e.TgZ(11,"div",13),e._UZ(12,"input",98),e.YNc(13,jM,2,0,"span",17),e.YNc(14,GM,2,0,"span",17),e.YNc(15,Py,2,0,"span",17),e.qZA()()),2&n){e.oxw();const t=e.MAs(2),o=e.oxw();e.xp6(13),e.Q6J("ngIf",o.nfsForm.showError("pseudo",t,"required")),e.xp6(1),e.Q6J("ngIf",o.nfsForm.showError("pseudo",t,"pseudoAlreadyExists")),e.xp6(1),e.Q6J("ngIf",o.nfsForm.showError("pseudo",t,"pattern"))}}function TS(n,s){1&n&&(e.TgZ(0,"option",52),e.SDv(1,102),e.qZA())}function VM(n,s){1&n&&(e.TgZ(0,"option",52),e.SDv(1,103),e.qZA())}function ZM(n,s){if(1&n&&(e.TgZ(0,"option",56),e._uU(1),e.qZA()),2&n){const t=s.$implicit;e.Q6J("value",t.value),e.xp6(1),e.Oqu(t.value)}}function WM(n,s){if(1&n&&(e.TgZ(0,"span",104),e._uU(1),e.qZA()),2&n){const t=e.oxw(2);e.xp6(1),e.hij(" ",t.getAccessTypeHelp(t.nfsForm.getValue("access_type"))," ")}}function JM(n,s){1&n&&(e.TgZ(0,"span",105),e.tHW(1,106),e._UZ(2,"cd-doc",107),e.N_p(),e.qZA())}function QM(n,s){1&n&&(e.TgZ(0,"span",57),e.SDv(1,108),e.qZA())}function KM(n,s){1&n&&e.GkF(0)}function XM(n,s){1&n&&(e.TgZ(0,"option",52),e.SDv(1,109),e.qZA())}function qM(n,s){1&n&&(e.TgZ(0,"option",52),e.SDv(1,110),e.qZA())}function Iy(n,s){if(1&n&&(e.TgZ(0,"option",56),e._uU(1),e.qZA()),2&n){const t=s.$implicit;e.Q6J("value",t),e.xp6(1),e.Oqu(t)}}function Ly(n,s){1&n&&(e.TgZ(0,"span",57),e.SDv(1,111),e.qZA())}function CS(n,s){1&n&&(e.TgZ(0,"span",57),e.SDv(1,112),e.qZA())}function MS(n,s){1&n&&(e.TgZ(0,"cd-helper")(1,"ul",113)(2,"li")(3,"span",114),e._uU(4,"no_root_squash: "),e.qZA(),e.TgZ(5,"span"),e.SDv(6,115),e.qZA()(),e.TgZ(7,"li")(8,"span",114),e._uU(9,"root_id_squash: "),e.qZA(),e.TgZ(10,"span"),e.SDv(11,116),e.qZA()(),e.TgZ(12,"li")(13,"span",114),e._uU(14,"root_squash: "),e.qZA(),e.TgZ(15,"span"),e.SDv(16,117),e.qZA()(),e.TgZ(17,"li")(18,"span",114),e._uU(19,"all_squash: "),e.qZA(),e.TgZ(20,"span"),e.SDv(21,118),e.qZA()()()())}function Fy(n,s){if(1&n){const t=e.EpF();e.TgZ(0,"div",1)(1,"form",2,3)(3,"div",4)(4,"div",5),e.SDv(5,6),e.ALo(6,"titlecase"),e.ALo(7,"upperFirst"),e.qZA(),e.TgZ(8,"div",7)(9,"div",8)(10,"label",9)(11,"span",10),e.SDv(12,11),e.qZA(),e.TgZ(13,"cd-helper")(14,"p"),e.SDv(15,12),e.qZA()()(),e.TgZ(16,"div",13)(17,"select",14),e.YNc(18,OM,2,0,"option",15),e.YNc(19,AM,2,0,"option",15),e.YNc(20,XA,2,0,"option",15),e.YNc(21,qA,2,2,"option",16),e.qZA(),e.YNc(22,DM,3,8,"span",17),e.qZA()(),e.TgZ(23,"div",18)(24,"div",8)(25,"label",19),e.SDv(26,20),e.qZA(),e.TgZ(27,"div",13)(28,"select",21),e.NdJ("change",function(){return e.CHM(t),e.oxw().fsalChangeHandler()}),e.YNc(29,wM,2,0,"option",15),e.YNc(30,gS,2,0,"option",15),e.YNc(31,xv,2,0,"option",15),e.YNc(32,xM,2,3,"option",22),e.qZA(),e.YNc(33,RM,2,0,"span",17),e.YNc(34,NM,2,1,"span",17),e.qZA()(),e.YNc(35,Bm,10,5,"div",23),e.qZA(),e.YNc(36,yS,11,5,"div",23),e.YNc(37,Ny,12,4,"div",23),e.YNc(38,SS,8,3,"div",23),e.TgZ(39,"div",8)(40,"label",24),e.SDv(41,25),e.qZA(),e.TgZ(42,"div",13)(43,"div",26),e._UZ(44,"input",27),e.TgZ(45,"label",28),e.SDv(46,29),e.qZA()(),e.YNc(47,YM,2,0,"span",17),e.qZA()(),e.YNc(48,zM,16,3,"div",23),e.TgZ(49,"div",8)(50,"label",30),e.SDv(51,31),e.qZA(),e.TgZ(52,"div",13)(53,"select",32),e.NdJ("change",function(){return e.CHM(t),e.oxw().accessTypeChangeHandler()}),e.YNc(54,TS,2,0,"option",15),e.YNc(55,VM,2,0,"option",15),e.YNc(56,ZM,2,2,"option",16),e.qZA(),e.YNc(57,WM,2,1,"span",33),e.YNc(58,JM,3,0,"span",34),e.YNc(59,QM,2,0,"span",17),e.qZA()(),e.TgZ(60,"div",8)(61,"label",35)(62,"span"),e.SDv(63,36),e.qZA(),e.YNc(64,KM,1,0,"ng-container",37),e.qZA(),e.TgZ(65,"div",13)(66,"select",38),e.YNc(67,XM,2,0,"option",15),e.YNc(68,qM,2,0,"option",15),e.YNc(69,Iy,2,2,"option",16),e.qZA(),e.YNc(70,Ly,2,0,"span",17),e.qZA()(),e.TgZ(71,"div",8)(72,"label",39),e.SDv(73,40),e.qZA(),e.TgZ(74,"div",13)(75,"div",26),e._UZ(76,"input",41),e.TgZ(77,"label",42),e.SDv(78,43),e.qZA()(),e.TgZ(79,"div",26),e._UZ(80,"input",44),e.TgZ(81,"label",45),e.SDv(82,46),e.qZA()(),e.YNc(83,CS,2,0,"span",17),e._UZ(84,"hr"),e.qZA()(),e.TgZ(85,"cd-nfs-form-client",47,48),e.YNc(87,MS,22,0,"ng-template",null,49,e.W1O),e.qZA()(),e.TgZ(89,"div",50)(90,"cd-form-button-panel",51),e.NdJ("submitActionEvent",function(){return e.CHM(t),e.oxw().submitAction()}),e.ALo(91,"titlecase"),e.ALo(92,"upperFirst"),e.qZA()()()()()}if(2&n){const t=e.MAs(2),o=e.MAs(88),l=e.oxw();e.xp6(1),e.Q6J("formGroup",l.nfsForm),e.xp6(6),e.pQV(e.lcZ(6,36,l.action))(e.lcZ(7,38,l.resource)),e.QtT(5),e.xp6(11),e.Q6J("ngIf",null===l.allClusters),e.xp6(1),e.Q6J("ngIf",null!==l.allClusters&&0===l.allClusters.length),e.xp6(1),e.Q6J("ngIf",null!==l.allClusters&&l.allClusters.length>0),e.xp6(1),e.Q6J("ngForOf",l.allClusters),e.xp6(1),e.Q6J("ngIf",l.nfsForm.showError("cluster_id",t,"required")||0===(null==l.allClusters?null:l.allClusters.length)),e.xp6(7),e.Q6J("ngIf",null===l.allFsals),e.xp6(1),e.Q6J("ngIf",null!==l.allFsals&&0===l.allFsals.length),e.xp6(1),e.Q6J("ngIf",null!==l.allFsals&&l.allFsals.length>0),e.xp6(1),e.Q6J("ngForOf",l.allFsals),e.xp6(1),e.Q6J("ngIf",l.nfsForm.showError("name",t,"required")),e.xp6(1),e.Q6J("ngIf",l.fsalAvailabilityError),e.xp6(1),e.Q6J("ngIf","CEPH"===l.nfsForm.getValue("name")),e.xp6(1),e.Q6J("ngIf","CEPH"===l.nfsForm.getValue("name")),e.xp6(1),e.Q6J("ngIf","CEPH"===l.nfsForm.getValue("name")),e.xp6(1),e.Q6J("ngIf","RGW"===l.nfsForm.getValue("name")),e.xp6(9),e.Q6J("ngIf",l.nfsForm.showError("protocolNfsv4",t,"required")),e.xp6(1),e.Q6J("ngIf",l.nfsForm.getValue("protocolNfsv4")),e.xp6(6),e.Q6J("ngIf",null===l.nfsAccessType),e.xp6(1),e.Q6J("ngIf",null!==l.nfsAccessType&&0===l.nfsAccessType.length),e.xp6(1),e.Q6J("ngForOf",l.nfsAccessType),e.xp6(1),e.Q6J("ngIf",l.nfsForm.getValue("access_type")),e.xp6(1),e.Q6J("ngIf","RW"===l.nfsForm.getValue("access_type")&&"RGW"===l.nfsForm.getValue("name")),e.xp6(1),e.Q6J("ngIf",l.nfsForm.showError("access_type",t,"required")),e.xp6(5),e.Q6J("ngTemplateOutlet",o),e.xp6(3),e.Q6J("ngIf",null===l.nfsSquash),e.xp6(1),e.Q6J("ngIf",null!==l.nfsSquash&&0===l.nfsSquash.length),e.xp6(1),e.Q6J("ngForOf",l.nfsSquash),e.xp6(1),e.Q6J("ngIf",l.nfsForm.showError("squash",t,"required")),e.xp6(13),e.Q6J("ngIf",l.nfsForm.showError("transportUDP",t,"required")||l.nfsForm.showError("transportTCP",t,"required")),e.xp6(2),e.Q6J("form",l.nfsForm)("clients",l.clients),e.xp6(5),e.Q6J("form",l.nfsForm)("submitText",e.lcZ(91,40,l.action)+" "+e.lcZ(92,42,l.resource))}}let ky=(()=>{class n extends Bl.E{constructor(t,o,l,_,M,w,N,V,X,re){super(),this.authStorageService=t,this.nfsService=o,this.route=l,this.router=_,this.rgwBucketService=M,this.rgwSiteService=w,this.formBuilder=N,this.taskWrapper=V,this.cdRef=X,this.actionLabels=re,this.clients=[],this.isEdit=!1,this.cluster_id=null,this.export_id=null,this.allClusters=null,this.icons=No.P,this.allFsals=[],this.allFsNames=null,this.fsalAvailabilityError=null,this.defaultAccessType={RGW:"RO"},this.nfsAccessType=this.nfsService.nfsAccessType,this.nfsSquash=Object.keys(this.nfsService.nfsSquash),this.pathDataSource=oe=>oe.pipe(tp(200),(0,Rh.x)(),(0,Ac.zg)(fe=>this.getPathTypeahead(fe)),(0,Oa.U)(fe=>fe)),this.bucketDataSource=oe=>oe.pipe(tp(200),(0,Rh.x)(),(0,Ac.zg)(fe=>this.getBucketTypeahead(fe))),this.permission=this.authStorageService.getPermissions().pool,this.resource="NFS export",this.createForm()}ngOnInit(){const t=[this.nfsService.listClusters(),this.nfsService.fsals(),this.nfsService.filesystems()];this.router.url.startsWith("/nfs/edit")&&(this.isEdit=!0),this.isEdit?(this.action=this.actionLabels.EDIT,this.route.params.subscribe(o=>{this.cluster_id=decodeURIComponent(o.cluster_id),this.export_id=decodeURIComponent(o.export_id),t.push(this.nfsService.get(this.cluster_id,this.export_id)),this.getData(t)}),this.nfsForm.get("cluster_id").disable()):(this.action=this.actionLabels.CREATE,this.getData(t))}getData(t){(0,Pu.D)(t).subscribe(o=>{this.resolveClusters(o[0]),this.resolveFsals(o[1]),this.resolveFilesystems(o[2]),o[3]&&this.resolveModel(o[3]),this.loadingReady()})}createForm(){this.nfsForm=new tc.d({cluster_id:new _n.NI("",{validators:[_n.kI.required]}),fsal:new tc.d({name:new _n.NI("",{validators:[_n.kI.required]}),fs_name:new _n.NI("",{validators:[Me.h.requiredIf({name:"CEPH"})]})}),path:new _n.NI("/"),protocolNfsv4:new _n.NI(!0),pseudo:new _n.NI("",{validators:[Me.h.requiredIf({protocolNfsv4:!0}),_n.kI.pattern("^/[^><|&()]*$")]}),access_type:new _n.NI("RW"),squash:new _n.NI(this.nfsSquash[0]),transportUDP:new _n.NI(!0,{validators:[Me.h.requiredIf({transportTCP:!1},t=>!t)]}),transportTCP:new _n.NI(!0,{validators:[Me.h.requiredIf({transportUDP:!1},t=>!t)]}),clients:this.formBuilder.array([]),security_label:new _n.NI(!1),sec_label_xattr:new _n.NI("security.selinux",Me.h.requiredIf({security_label:!0,"fsal.name":"CEPH"}))})}resolveModel(t){"CEPH"===t.fsal.name&&(t.sec_label_xattr=t.fsal.sec_label_xattr),t.protocolNfsv4=-1!==t.protocols.indexOf(4),delete t.protocols,t.transportTCP=-1!==t.transports.indexOf("TCP"),t.transportUDP=-1!==t.transports.indexOf("UDP"),delete t.transports,Object.entries(this.nfsService.nfsSquash).forEach(([o,l])=>{l.includes(t.squash)&&(t.squash=o)}),t.clients.forEach(o=>{let l="";o.addresses.forEach(_=>{l+=_+", "}),l.length>=2&&(l=l.substring(0,l.length-2)),o.addresses=l}),this.nfsForm.patchValue(t),this.setPathValidation(),this.clients=t.clients}resolveClusters(t){this.allClusters=[];for(const o of t)this.allClusters.push({cluster_id:o});!this.isEdit&&this.allClusters.length>0&&this.nfsForm.get("cluster_id").setValue(this.allClusters[0].cluster_id)}resolveFsals(t){t.forEach(o=>{const l=this.nfsService.nfsFsal.find(_=>o===_.value);Er().isObjectLike(l)&&this.allFsals.push(l)}),!this.isEdit&&this.allFsals.length>0&&this.nfsForm.patchValue({fsal:{name:this.allFsals[0].value}})}resolveFilesystems(t){this.allFsNames=t,!this.isEdit&&t.length>0&&this.nfsForm.patchValue({fsal:{fs_name:t[0].name}})}fsalChangeHandler(){this.setPathValidation();const t=this.nfsForm.getValue("name");("RGW"===t?this.rgwSiteService.get("realms").pipe((0,Ac.zg)(l=>0===l.length?(0,nc.of)(!0):this.rgwSiteService.isDefaultRealm().pipe((0,Ac.zg)(_=>{if(!_)throw new Error("Selected realm is not the default.");return(0,nc.of)(!0)})))):this.nfsService.filesystems()).subscribe({next:()=>{this.setFsalAvailability(t,!0),this.isEdit||this.nfsForm.patchValue({path:"RGW"===t?"":"/",pseudo:this.generatePseudo(),access_type:this.updateAccessType()}),this.cdRef.detectChanges()},error:l=>{this.setFsalAvailability(t,!1,l),this.nfsForm.get("name").setValue("")}})}setFsalAvailability(t,o,l=""){this.allFsals=this.allFsals.map(_=>(_.value===t&&(_.disabled=!o,this.fsalAvailabilityError=_.disabled?"" + _.descr + " backend is not available. " + l + "":null),_))}accessTypeChangeHandler(){const t=this.nfsForm.getValue("name"),o=this.nfsForm.getValue("access_type");this.defaultAccessType[t]=o}setPathValidation(){const t=this.nfsForm.get("path");t.setValidators([_n.kI.required]),"RGW"===this.nfsForm.getValue("name")?t.setAsyncValidators([Me.h.bucketExistence(!0,this.rgwBucketService)]):t.setAsyncValidators([this.pathExistence(!0)]),this.isEdit&&t.markAsDirty()}getAccessTypeHelp(t){const o=this.nfsAccessType.find(l=>{if(t===l.value)return l});return Er().isObjectLike(o)?o.help:""}getId(){return Er().isString(this.nfsForm.getValue("cluster_id"))&&Er().isString(this.nfsForm.getValue("path"))?this.nfsForm.getValue("cluster_id")+":"+this.nfsForm.getValue("path"):""}getPathTypeahead(t){if(!Er().isString(t)||"/"===t)return(0,nc.of)([]);const o=this.nfsForm.getValue("fsal").fs_name;return this.nfsService.lsDir(o,t).pipe((0,Oa.U)(l=>l.paths.filter(_=>_.toLowerCase().includes(t)).slice(0,15)),(0,Ov.K)(()=>(0,nc.of)(["Error while retrieving paths."])))}pathChangeHandler(){this.isEdit||this.nfsForm.patchValue({pseudo:this.generatePseudo()})}getBucketTypeahead(t){return Er().isString(t)&&"/"!==t&&""!==t?this.rgwBucketService.list().pipe((0,Oa.U)(o=>o.filter(l=>l.toLowerCase().includes(t)).slice(0,15)),(0,Ov.K)(()=>(0,nc.of)(["Error while retrieving bucket names."]))):(0,nc.of)([])}generatePseudo(){let t=this.nfsForm.getValue("pseudo");return this.nfsForm.get("pseudo")&&!this.nfsForm.get("pseudo").dirty&&(t=void 0,"CEPH"===this.nfsForm.getValue("fsal")&&(t="/cephfs",Er().isString(this.nfsForm.getValue("path"))&&(t+=this.nfsForm.getValue("path")))),t}updateAccessType(){const t=this.nfsForm.getValue("name");let o=this.defaultAccessType[t];return o||(o="RW"),o}submitAction(){let t;const o=this.buildRequest();t=this.taskWrapper.wrapTaskAroundCall(this.isEdit?{task:new Jl.R("nfs/edit",{cluster_id:this.cluster_id,export_id:Er().parseInt(this.export_id)}),call:this.nfsService.update(this.cluster_id,Er().parseInt(this.export_id),o)}:{task:new Jl.R("nfs/create",{path:o.path,fsal:o.fsal,cluster_id:o.cluster_id}),call:this.nfsService.create(o)}),t.subscribe({error:l=>this.setFormErrors(l),complete:()=>this.router.navigate(["/nfs"])})}setFormErrors(t){t.error.detail&&t.error.detail.toString().includes(`Pseudo ${this.nfsForm.getValue("pseudo")} is already in use`)&&this.nfsForm.get("pseudo").setErrors({pseudoAlreadyExists:!0}),this.nfsForm.setErrors({cdSubmitButton:!0})}buildRequest(){const t=Er().cloneDeep(this.nfsForm.value);return this.isEdit&&(t.export_id=Er().parseInt(this.export_id)),"RGW"===t.fsal.name&&delete t.fsal.fs_name,t.protocols=[],t.protocolNfsv4?t.protocols.push(4):t.pseudo=null,delete t.protocolNfsv4,t.transports=[],t.transportTCP&&t.transports.push("TCP"),delete t.transportTCP,t.transportUDP&&t.transports.push("UDP"),delete t.transportUDP,t.clients.forEach(o=>{o.addresses=Er().isString(o.addresses)?Er()(o.addresses).split(/[ ,]+/).uniq().filter(l=>""!==l).value():[],o.squash||(o.squash=t.squash),o.access_type||(o.access_type=t.access_type)}),t.fsal.sec_label_xattr=!1===t.security_label||"RGW"===t.fsal.name?null:t.sec_label_xattr,delete t.sec_label_xattr,t}pathExistence(t){return o=>{if(o.pristine||!o.value)return(0,nc.of)({required:!0});const l=this.nfsForm.getValue("fsal").fs_name;return this.nfsService.lsDir(l,o.value).pipe((0,Oa.U)(_=>_.paths.includes(o.value)===t?null:{pathNameNotAllowed:!0}),(0,Ov.K)(()=>(0,nc.of)({pathNameNotAllowed:!0})))}}}return n.\u0275fac=function(t){return new(t||n)(e.Y36(zi.j),e.Y36(X1),e.Y36(Bo.gz),e.Y36(Bo.F0),e.Y36(yM.o),e.Y36(EM.I),e.Y36(zu.O),e.Y36(Sc.P),e.Y36(e.sBO),e.Y36(Mo.p4))},n.\u0275cmp=e.Xpm({type:n,selectors:[["cd-nfs-form"]],viewQuery:function(t,o){if(1&t&&e.Gf(hS,7),2&t){let l;e.iGM(l=e.CRH())&&(o.nfsClients=l.first)}},features:[e.qOj],decls:1,vars:1,consts:function(){let s,t,o,l,_,M,w,N,V,X,re,oe,fe,ve,Pe,De,Ie,Ae,Y,Et,ft,xt,Ht,yn,It,In,On,Yr,Ir,Hr,Wr,En,Un,Yn,ir,An,Lr,Wi,Mi,Yi,jr,Nn,fn,Vr,xi,Ji,Ho,Ao,Vs,Qs,Ri,uo,bo,Ye,Ct;return s="" + "\ufffd0\ufffd" + " " + "\ufffd1\ufffd" + "",t="Cluster",o="This is the ID of an NFS Service.",l="Storage Backend",_="NFS Protocol",M="NFSv4",w="Access Type",N="Squash",V="Transport Protocol",X="UDP",re="TCP",oe="Loading...",fe="-- No cluster available --",ve="-- Select the cluster --",Pe="This field is required. To create a new NFS cluster, " + "\ufffd#2\ufffd" + "add a new NFS Service" + "\ufffd/#2\ufffd" + ".",De="Loading...",Ie="-- No data pools available --",Ae="-- Select the storage backend --",Y="This field is required.",Et="" + "\ufffd0\ufffd" + "",ft="Volume",xt="Loading...",Ht="-- No CephFS filesystem available --",yn="-- Select the CephFS filesystem --",It="This field is required.",In="Security Label",On="Enable security label",Yr="This field is required.",Ir="CephFS Path",Hr="A path in a CephFS file system.",Wr="This field is required.",En="Path need to start with a '/' and can be followed by a word",Un="The path does not exist in the selected volume.",Yn="Bucket",ir="This field is required.",An="The bucket does not exist or is not in the default realm (if multiple realms are configured). To continue, " + "\ufffd#2\ufffd" + "create a new bucket" + "\ufffd/#2\ufffd" + ".",Lr="This field is required.",Wi="Pseudo",Mi="The position that this " + "[\ufffd#7\ufffd|\ufffd#8\ufffd]" + "NFS v4" + "[\ufffd/#7\ufffd|\ufffd/#8\ufffd]" + " export occupies in the " + "[\ufffd#7\ufffd|\ufffd#8\ufffd]" + "Pseudo FS" + "[\ufffd/#7\ufffd|\ufffd/#8\ufffd]" + " (it must be unique).",Mi=e.Zx4(Mi),Yi="By using different Pseudo options, the same Path may be exported multiple times.",jr="This field is required.",Nn="The pseudo is already in use by another export.",fn="Pseudo needs to start with a '/' and can't contain any of the following: >, <, |, &, ( or ).",Vr="Loading...",xi="-- No access type available --",Ji="The Object Gateway NFS backend has a number of limitations which will seriously affect applications writing to the share. Please consult the " + "\ufffd#2\ufffd" + "" + "\ufffd/#2\ufffd" + " for details before enabling write access.",Ho="This field is required.",Ao="Loading...",Vs="-- No squash available --",Qs="This field is required.",Ri="This field is required.",uo="No user id squashing is performed.",bo="uid 0 and gid 0 are squashed to the Anonymous_Uid and Anonymous_Gid gid 0 in alt_groups lists is also squashed.",Ye="uid 0 and gid of any value are squashed to the Anonymous_Uid and Anonymous_Gid alt_groups lists is discarded.",Ct="All users are squashed.",[["class","cd-col-form",4,"cdFormLoading"],[1,"cd-col-form"],["name","nfsForm","novalidate","",3,"formGroup"],["formDir","ngForm"],[1,"card"],[1,"card-header"],s,[1,"card-body"],[1,"form-group","row"],["for","cluster_id",1,"cd-col-form-label"],[1,"required"],t,o,[1,"cd-col-form-input"],["formControlName","cluster_id","name","cluster_id","id","cluster_id",1,"form-select"],["value","",4,"ngIf"],[3,"value",4,"ngFor","ngForOf"],["class","invalid-feedback",4,"ngIf"],["formGroupName","fsal"],["for","name",1,"cd-col-form-label","required"],l,["formControlName","name","name","name","id","name",1,"form-select",3,"change"],[3,"value","disabled",4,"ngFor","ngForOf"],["class","form-group row",4,"ngIf"],["for","protocols",1,"cd-col-form-label","required"],_,[1,"custom-control","custom-checkbox"],["type","checkbox","formControlName","protocolNfsv4","name","protocolNfsv4","id","protocolNfsv4","disabled","",1,"custom-control-input"],["for","protocolNfsv4",1,"custom-control-label"],M,["for","access_type",1,"cd-col-form-label","required"],w,["formControlName","access_type","name","access_type","id","access_type",1,"form-select",3,"change"],["class","form-text text-muted",4,"ngIf"],["class","form-text text-warning",4,"ngIf"],["for","squash",1,"cd-col-form-label"],N,[4,"ngTemplateOutlet"],["name","squash","formControlName","squash","id","squash",1,"form-select"],["for","transports",1,"cd-col-form-label","required"],V,["type","checkbox","formControlName","transportUDP","name","transportUDP","id","transportUDP",1,"custom-control-input"],["for","transportUDP",1,"custom-control-label"],X,["type","checkbox","formControlName","transportTCP","name","transportTCP","id","transportTCP",1,"custom-control-input"],["for","transportTCP",1,"custom-control-label"],re,[3,"form","clients"],["nfsClients",""],["squashHelper",""],[1,"card-footer"],["wrappingClass","text-right",3,"form","submitText","submitActionEvent"],["value",""],oe,fe,ve,[3,"value"],[1,"invalid-feedback"],Pe,[1,"btn-link",3,"routerLink"],De,Ie,Ae,[3,"value","disabled"],Y,Et,["for","fs_name",1,"cd-col-form-label","required"],ft,["formControlName","fs_name","name","fs_name","id","fs_name",1,"form-select",3,"change"],xt,Ht,yn,It,["for","security_label",1,"cd-col-form-label",3,"ngClass"],In,["type","checkbox","formControlName","security_label","name","security_label","id","security_label",1,"custom-control-input"],["for","security_label",1,"custom-control-label"],On,["type","text","class","form-control","name","sec_label_xattr","id","sec_label_xattr","formControlName","sec_label_xattr",4,"ngIf"],["type","text","name","sec_label_xattr","id","sec_label_xattr","formControlName","sec_label_xattr",1,"form-control"],Yr,["for","path",1,"cd-col-form-label"],Ir,Hr,["type","text","name","path","id","path","data-testid","fs_path","formControlName","path",1,"form-control",3,"ngbTypeahead","selectItem","blur"],Wr,En,Un,Yn,["type","text","name","path","id","path","data-testid","rgw_path","formControlName","path",1,"form-control",3,"ngbTypeahead"],ir,An,["routerLink","/rgw/bucket/create",1,"btn-link"],Lr,["for","pseudo",1,"cd-col-form-label"],Wi,Mi,Yi,["type","text","name","pseudo","id","pseudo","formControlName","pseudo",1,"form-control"],jr,Nn,fn,Vr,xi,[1,"form-text","text-muted"],[1,"form-text","text-warning"],Ji,["section","rgw-nfs"],Ho,Ao,Vs,Qs,Ri,[1,"squash-helper"],[1,"squash-helper-item-value"],uo,bo,Ye,Ct]},template:function(t,o){1&t&&e.YNc(0,Fy,93,44,"div",0),2&t&&e.Q6J("cdFormLoading",o.loading)},directives:[lu.y,_n._Y,_n.JL,_n.sg,Ma.V,al.P,Oe.S,_e.o,_n.EJ,_n.JJ,_n.u,p.O5,_n.YN,_n.Kr,p.sg,Bo.yS,_n.x0,p.mk,_n.Wl,Il.b,_n.Fj,Dr.dR,gf.K,p.tP,MM,Cl.p],pipes:[p.rS,gt.m],styles:[".cd-mb[_ngcontent-%COMP%]{margin-bottom:10px}.squash-helper[_ngcontent-%COMP%]{padding-left:1rem}.squash-helper-item-value[_ngcontent-%COMP%]{font-weight:700}"]}),n})();var $y=i(38047);function e2(n,s){if(1&n&&e._UZ(0,"cd-table-key-value",10),2&n){const t=e.oxw(2);e.Q6J("data",t.data)}}function Hy(n,s){if(1&n&&e._UZ(0,"cd-table",11,12),2&n){const t=e.oxw(2);e.Q6J("data",t.clients)("columns",t.clientsColumns)}}function By(n,s){if(1&n&&(e.ynx(0),e.TgZ(1,"nav",1,2),e.ynx(3,3),e.TgZ(4,"a",4),e.SDv(5,5),e.qZA(),e.YNc(6,e2,1,1,"ng-template",6),e.BQk(),e.ynx(7,7),e.TgZ(8,"a",4),e.SDv(9,8),e.qZA(),e.YNc(10,Hy,2,2,"ng-template",6),e.BQk(),e.qZA(),e._UZ(11,"div",9),e.BQk()),2&n){const t=e.MAs(2),o=e.oxw();e.xp6(9),e.pQV(o.clients.length),e.QtT(9),e.xp6(2),e.Q6J("ngbNavOutlet",t)}}let OS=(()=>{class n{constructor(){this.clients=[],this.clientsColumns=[{name:"Addresses",prop:"addresses",flexGrow:2},{name:"Access Type",prop:"access_type",flexGrow:1},{name:"Squash",prop:"squash",flexGrow:1}]}ngOnChanges(){this.selection&&(this.selectedItem=this.selection,this.clients=this.selectedItem.clients,this.data={},this.data["Cluster"]=this.selectedItem.cluster_id,this.data["NFS Protocol"]=this.selectedItem.protocols.map(t=>"NFSv"+t),this.data["Pseudo"]=this.selectedItem.pseudo,this.data["Access Type"]=this.selectedItem.access_type,this.data["Squash"]=this.selectedItem.squash,this.data["Transport"]=this.selectedItem.transports,this.data["Path"]=this.selectedItem.path,"CEPH"===this.selectedItem.fsal.name?(this.data["Storage Backend"]="CephFS",this.data["CephFS User"]=this.selectedItem.fsal.user_id,this.data["CephFS Filesystem"]=this.selectedItem.fsal.fs_name,this.data["Security Label"]=this.selectedItem.fsal.sec_label_xattr):(this.data["Storage Backend"]="Object Gateway",this.data["Object Gateway User"]=this.selectedItem.fsal.user_id))}}return n.\u0275fac=function(t){return new(t||n)},n.\u0275cmp=e.Xpm({type:n,selectors:[["cd-nfs-details"]],inputs:{selection:"selection"},features:[e.TTD],decls:1,vars:1,consts:function(){let s,t;return s="Details",t="Clients (" + "\ufffd0\ufffd" + ")",[[4,"ngIf"],["ngbNav","","cdStatefulTab","nfs-details",1,"nav-tabs"],["nav","ngbNav"],["ngbNavItem","details"],["ngbNavLink",""],s,["ngbNavContent",""],["ngbNavItem","clients"],t,[3,"ngbNavOutlet"],[3,"data"],["columnMode","flex","identifier","addresses","forceIdentifier","true","selectionType","",3,"data","columns"],["table",""]]},template:function(t,o){1&t&&e.YNc(0,By,12,2,"ng-container",0),2&t&&e.Q6J("ngIf",o.selection)},directives:[p.O5,Dr.Pz,kn.m,Dr.nv,Dr.Vx,Dr.uN,fo.b,_r.a,Dr.tO],styles:[""]}),n})();const Uy=["nfsState"],t2=["nfsFsal"],n2=["table"];function Yy(n,s){1&n&&(e.ynx(0),e.SDv(1,7),e.BQk())}function r2(n,s){1&n&&(e.ynx(0),e.SDv(1,8),e.BQk())}function AS(n,s){if(1&n&&(e.YNc(0,Yy,2,0,"ng-container",6),e.YNc(1,r2,2,0,"ng-container",6)),2&n){const t=s.value;e.Q6J("ngIf","CEPH"===t.name),e.xp6(1),e.Q6J("ngIf","RGW"===t.name)}}let DS=(()=>{class n extends Mt.o{constructor(t,o,l,_,M,w){super(),this.authStorageService=t,this.modalService=o,this.nfsService=l,this.taskListService=_,this.taskWrapper=M,this.actionLabels=w,this.selection=new sn.r,this.isDefaultCluster=!1,this.builders={"nfs/create":oe=>({path:oe.path,cluster_id:oe.cluster_id,fsal:oe.fsal})},this.permission=this.authStorageService.getPermissions().nfs;const N=()=>this.selection.first()&&`${encodeURI(this.selection.first().cluster_id)}/${encodeURI(this.selection.first().export_id)}`;this.tableActions=[{permission:"create",icon:No.P.add,routerLink:()=>"/nfs/create",canBePrimary:oe=>!oe.hasSingleSelection,name:this.actionLabels.CREATE},{permission:"update",icon:No.P.edit,routerLink:()=>`/nfs/edit/${N()}`,name:this.actionLabels.EDIT},{permission:"delete",icon:No.P.destroy,click:()=>this.deleteNfsModal(),name:this.actionLabels.DELETE}]}ngOnInit(){this.columns=[{name:"Path",prop:"path",flexGrow:2,cellTransformation:wt.e.executing},{name:"Pseudo",prop:"pseudo",flexGrow:2},{name:"Cluster",prop:"cluster_id",flexGrow:2},{name:"Storage Backend",prop:"fsal",flexGrow:2,cellTemplate:this.nfsFsal},{name:"Access Type",prop:"access_type",flexGrow:2}],this.taskListService.init(()=>this.nfsService.list(),t=>this.prepareResponse(t),t=>this.exports=t,()=>this.onFetchError(),this.taskFilter,this.itemFilter,this.builders)}ngOnDestroy(){this.summaryDataSubscription&&this.summaryDataSubscription.unsubscribe()}prepareResponse(t){let o=[];return t.forEach(l=>{l.id=`${l.cluster_id}:${l.export_id}`,l.state="LOADING",o=o.concat(l)}),o}onFetchError(){this.table.reset(),this.viewCacheStatus={status:gi.T.ValueException}}itemFilter(t,o){return t.cluster_id===o.metadata.cluster_id&&t.export_id===o.metadata.export_id}taskFilter(t){return["nfs/create","nfs/delete","nfs/edit"].includes(t.name)}updateSelection(t){this.selection=t}deleteNfsModal(){const t=this.selection.first().cluster_id,o=this.selection.first().export_id;this.modalRef=this.modalService.show(Oc.M,{itemDescription:"NFS export",itemNames:[`${t}:${o}`],submitActionObservable:()=>this.taskWrapper.wrapTaskAroundCall({task:new Jl.R("nfs/delete",{cluster_id:t,export_id:o}),call:this.nfsService.delete(t,o)})})}}return n.\u0275fac=function(t){return new(t||n)(e.Y36(zi.j),e.Y36(ru.Z),e.Y36(X1),e.Y36($y.j),e.Y36(Sc.P),e.Y36(Mo.p4))},n.\u0275cmp=e.Xpm({type:n,selectors:[["cd-nfs-list"]],viewQuery:function(t,o){if(1&t&&(e.Gf(Uy,5),e.Gf(t2,7),e.Gf(n2,7)),2&t){let l;e.iGM(l=e.CRH())&&(o.nfsState=l.first),e.iGM(l=e.CRH())&&(o.nfsFsal=l.first),e.iGM(l=e.CRH())&&(o.table=l.first)}},features:[e._Bn([$y.j]),e.qOj],decls:7,vars:7,consts:function(){let s,t;return s="CephFS",t="Object Gateway",[["columnMode","flex","identifier","id","forceIdentifier","true","selectionType","single",3,"data","columns","hasDetails","setExpandedRow","updateSelection"],["table",""],[1,"table-actions","btn-toolbar"],[1,"btn-group",3,"permission","selection","tableActions"],["cdTableDetail","",3,"selection"],["nfsFsal",""],[4,"ngIf"],s,t]},template:function(t,o){1&t&&(e.TgZ(0,"cd-table",0,1),e.NdJ("setExpandedRow",function(_){return o.setExpandedRow(_)})("updateSelection",function(_){return o.updateSelection(_)}),e.TgZ(2,"div",2),e._UZ(3,"cd-table-actions",3),e.qZA(),e._UZ(4,"cd-nfs-details",4),e.qZA(),e.YNc(5,AS,2,2,"ng-template",null,5,e.W1O)),2&t&&(e.Q6J("data",o.exports)("columns",o.columns)("hasDetails",!0),e.xp6(3),e.Q6J("permission",o.permission)("selection",o.selection)("tableActions",o.tableActions),e.xp6(1),e.Q6J("selection",o.expandedRow))},directives:[_r.a,bu.K,OS,p.O5],styles:[""]}),n})(),wS=(()=>{class n{constructor(t){this.route=t,this.route.queryParams.subscribe(o=>{this.fromLink=o.fromLink||n.defaultFromLink}),this.route.params.subscribe(o=>{this.serviceId=decodeURIComponent(o.id),this.serviceType=o.type})}}return n.defaultFromLink="/hosts",n.\u0275fac=function(t){return new(t||n)(e.Y36(Bo.gz))},n.\u0275cmp=e.Xpm({type:n,selectors:[["cd-performance-counter"]],decls:3,vars:4,consts:[[3,"serviceType","serviceId"]],template:function(t,o){1&t&&(e.TgZ(0,"legend"),e._uU(1),e.qZA(),e._UZ(2,"cd-table-performance-counter",0)),2&t&&(e.xp6(1),e.AsE("",o.serviceType,".",o.serviceId,""),e.xp6(1),e.Q6J("serviceType",o.serviceType)("serviceId",o.serviceId))},directives:[cy.p],styles:[""]}),n})();var jy=i(39219),Gy=i(81354),xS=i(32057);function o2(n,s){1&n&&(e.TgZ(0,"span",29),e.SDv(1,30),e.qZA())}function e0(n,s){1&n&&(e.TgZ(0,"span",29),e.SDv(1,31),e.qZA())}function s2(n,s){if(1&n&&e._UZ(0,"cd-helper",32),2&n){const t=e.oxw();e.s9C("html",t.passwordPolicyHelpText)}}function Um(n,s){1&n&&(e.TgZ(0,"span",29),e.SDv(1,33),e.qZA())}function Rv(n,s){1&n&&(e.TgZ(0,"span",29),e.SDv(1,34),e.qZA())}function a2(n,s){if(1&n&&(e.TgZ(0,"span",29),e._uU(1),e.qZA()),2&n){const t=e.oxw();e.xp6(1),e.hij(" ",t.passwordValuation," ")}}function nD(n,s){1&n&&(e.TgZ(0,"span",29),e.SDv(1,35),e.qZA())}function RS(n,s){1&n&&(e.TgZ(0,"span",29),e.SDv(1,36),e.qZA())}let NS=(()=>{class n{constructor(t,o,l,_,M,w,N){this.actionLabels=t,this.notificationService=o,this.userService=l,this.authStorageService=_,this.formBuilder=M,this.router=w,this.passwordPolicyService=N,this.passwordPolicyHelpText="",this.icons=No.P,this.action=this.actionLabels.CHANGE,this.resource="password",this.createForm()}createForm(){this.passwordPolicyService.getHelpText().subscribe(t=>{this.passwordPolicyHelpText=t}),this.userForm=this.formBuilder.group({oldpassword:[null,[_n.kI.required,Me.h.custom("notmatch",()=>this.userForm&&this.userForm.getValue("newpassword")===this.userForm.getValue("oldpassword"))]],newpassword:[null,[_n.kI.required,Me.h.custom("notmatch",()=>this.userForm&&this.userForm.getValue("oldpassword")===this.userForm.getValue("newpassword"))],[Me.h.passwordPolicy(this.userService,()=>this.authStorageService.getUsername(),(t,o,l)=>{this.passwordStrengthLevelClass=this.passwordPolicyService.mapCreditsToCssClass(o),this.passwordValuation=Er().defaultTo(l,"")})]],confirmnewpassword:[null,[_n.kI.required]]},{validators:[Me.h.match("newpassword","confirmnewpassword")]})}onSubmit(){if(this.userForm.pristine)return;const t=this.authStorageService.getUsername(),o=this.userForm.getValue("oldpassword"),l=this.userForm.getValue("newpassword");this.userService.changePassword(t,o,l).subscribe(()=>this.onPasswordChange(),()=>{this.userForm.setErrors({cdSubmitButton:!0})})}onPasswordChange(){this.notificationService.show(Sa.k.success,"Updated user password\""),this.router.navigate(["/login"])}}return n.\u0275fac=function(t){return new(t||n)(e.Y36(Mo.p4),e.Y36(Sl.g),e.Y36(xS.K),e.Y36(zi.j),e.Y36(zu.O),e.Y36(Bo.F0),e.Y36(Gy.q))},n.\u0275cmp=e.Xpm({type:n,selectors:[["cd-user-password-form"]],decls:45,vars:25,consts:function(){let s,t,o,l,_,M,w,N,V,X;return s="" + "\ufffd0\ufffd" + " " + "\ufffd1\ufffd" + "",t="Old password",o="New password",l="Confirm new password",_="This field is required.",M="The old and new passwords must be different.",w="This field is required.",N="The old and new passwords must be different.",V="This field is required.",X="Password confirmation doesn't match the new password.",[[1,"cd-col-form"],["novalidate","",3,"formGroup"],["frm","ngForm"],[1,"card"],[1,"card-header"],s,[1,"card-body"],[1,"form-group","row"],["for","oldpassword",1,"cd-col-form-label","required"],t,[1,"cd-col-form-input"],[1,"input-group"],["type","password","placeholder","Old password...","id","oldpassword","formControlName","oldpassword","autocomplete","new-password","autofocus","",1,"form-control"],["cdPasswordButton","oldpassword",1,"btn","btn-light"],["class","invalid-feedback",4,"ngIf"],["for","newpassword",1,"cd-col-form-label"],[1,"required"],o,["class","text-pre-wrap",3,"html",4,"ngIf"],["type","password","placeholder","Password...","id","newpassword","autocomplete","new-password","formControlName","newpassword",1,"form-control"],["type","button","cdPasswordButton","newpassword",1,"btn","btn-light"],[1,"password-strength-level"],["data-toggle","tooltip",3,"title"],["for","confirmnewpassword",1,"cd-col-form-label","required"],l,["type","password","autocomplete","new-password","placeholder","Confirm new password...","id","confirmnewpassword","formControlName","confirmnewpassword",1,"form-control"],["cdPasswordButton","confirmnewpassword",1,"btn","btn-light"],[1,"card-footer"],["wrappingClass","text-right",3,"form","submitText","submitActionEvent"],[1,"invalid-feedback"],_,M,[1,"text-pre-wrap",3,"html"],w,N,V,X]},template:function(t,o){if(1&t&&(e.TgZ(0,"div",0)(1,"form",1,2)(3,"div",3)(4,"div",4),e.SDv(5,5),e.ALo(6,"titlecase"),e.ALo(7,"upperFirst"),e.qZA(),e.TgZ(8,"div",6)(9,"div",7)(10,"label",8),e.SDv(11,9),e.qZA(),e.TgZ(12,"div",10)(13,"div",11),e._UZ(14,"input",12)(15,"button",13),e.qZA(),e.YNc(16,o2,2,0,"span",14),e.YNc(17,e0,2,0,"span",14),e.qZA()(),e.TgZ(18,"div",7)(19,"label",15)(20,"span",16),e.SDv(21,17),e.qZA(),e.YNc(22,s2,1,1,"cd-helper",18),e.qZA(),e.TgZ(23,"div",10)(24,"div",11),e._UZ(25,"input",19)(26,"button",20),e.qZA(),e.TgZ(27,"div",21),e._UZ(28,"div",22),e.qZA(),e.YNc(29,Um,2,0,"span",14),e.YNc(30,Rv,2,0,"span",14),e.YNc(31,a2,2,1,"span",14),e.qZA()(),e.TgZ(32,"div",7)(33,"label",23),e.SDv(34,24),e.qZA(),e.TgZ(35,"div",10)(36,"div",11),e._UZ(37,"input",25)(38,"button",26),e.qZA(),e.YNc(39,nD,2,0,"span",14),e.YNc(40,RS,2,0,"span",14),e.qZA()()(),e.TgZ(41,"div",27)(42,"cd-form-button-panel",28),e.NdJ("submitActionEvent",function(){return o.onSubmit()}),e.ALo(43,"titlecase"),e.ALo(44,"upperFirst"),e.qZA()()()()()),2&t){const l=e.MAs(2);e.xp6(1),e.Q6J("formGroup",o.userForm),e.xp6(6),e.pQV(e.lcZ(6,17,o.action))(e.lcZ(7,19,o.resource)),e.QtT(5),e.xp6(9),e.Q6J("ngIf",o.userForm.showError("oldpassword",l,"required")),e.xp6(1),e.Q6J("ngIf",o.userForm.showError("oldpassword",l,"notmatch")),e.xp6(5),e.Q6J("ngIf",o.passwordPolicyHelpText.length>0),e.xp6(6),e.Tol(o.passwordStrengthLevelClass),e.s9C("title",o.passwordValuation),e.xp6(1),e.Q6J("ngIf",o.userForm.showError("newpassword",l,"required")),e.xp6(1),e.Q6J("ngIf",o.userForm.showError("newpassword",l,"notmatch")),e.xp6(1),e.Q6J("ngIf",o.userForm.showError("newpassword",l,"passwordPolicy")),e.xp6(8),e.Q6J("ngIf",o.userForm.showError("confirmnewpassword",l,"required")),e.xp6(1),e.Q6J("ngIf",o.userForm.showError("confirmnewpassword",l,"match")),e.xp6(2),e.Q6J("form",o.userForm)("submitText",e.lcZ(43,21,o.action)+" "+e.lcZ(44,23,o.resource))}},directives:[_n._Y,_n.JL,_n.sg,Ma.V,al.P,_e.o,_n.Fj,Il.b,_n.JJ,_n.u,Je.U,pd.C,p.O5,Oe.S,Cl.p],pipes:[p.rS,gt.m],styles:[""]}),n})();function l2(n,s){1&n&&(e.TgZ(0,"span",16),e.SDv(1,17),e.qZA())}function u2(n,s){1&n&&(e.TgZ(0,"span",16),e.SDv(1,18),e.qZA())}function c2(n,s){1&n&&(e.TgZ(0,"span",16),e.SDv(1,19),e.qZA())}function PS(n,s){1&n&&(e.TgZ(0,"span",16),e.SDv(1,20),e.qZA())}function d2(n,s){if(1&n&&(e.TgZ(0,"span",16),e._uU(1),e.qZA()),2&n){const t=e.oxw();e.xp6(1),e.hij(" ",t.passwordValuation," ")}}function zy(n,s){1&n&&(e.TgZ(0,"span",16),e.SDv(1,21),e.qZA())}function t0(n,s){1&n&&(e.TgZ(0,"span",16),e.SDv(1,22),e.qZA())}let Nv=(()=>{class n extends NS{constructor(t,o,l,_,M,w,N,V){super(t,o,l,_,M,w,N),this.actionLabels=t,this.notificationService=o,this.userService=l,this.authStorageService=_,this.formBuilder=M,this.router=w,this.passwordPolicyService=N,this.authService=V}onPasswordChange(){this.authService.logout()}onCancel(){this.authService.logout()}}return n.\u0275fac=function(t){return new(t||n)(e.Y36(Mo.p4),e.Y36(Sl.g),e.Y36(xS.K),e.Y36(zi.j),e.Y36(zu.O),e.Y36(Bo.F0),e.Y36(Gy.q),e.Y36(jy.e))},n.\u0275cmp=e.Xpm({type:n,selectors:[["cd-login-password-form"]],features:[e.qOj],decls:31,vars:19,consts:function(){let s,t,o,l,_,M,w,N;return s="Please set a new password.",t="You will be redirected to the login page afterwards.",o="This field is required.",l="The old and new passwords must be different.",_="This field is required.",M="The old and new passwords must be different.",w="This field is required.",N="Password confirmation doesn't match the new password.",[s,t,["novalidate","",3,"formGroup"],["frm","ngForm"],[1,"form-group","has-feedback"],[1,"input-group"],["type","password","placeholder","Old password...","id","oldpassword","formControlName","oldpassword","autocomplete","new-password","autofocus","",1,"form-control"],["cdPasswordButton","oldpassword",1,"btn","btn-outline-light","btn-password"],["class","invalid-feedback",4,"ngIf"],["type","password","placeholder","New password...","id","newpassword","autocomplete","new-password","formControlName","newpassword",1,"form-control"],["type","button","cdPasswordButton","newpassword",1,"btn","btn-outline-light","btn-password"],[1,"password-strength-level"],["data-toggle","tooltip",3,"title"],["type","password","autocomplete","new-password","placeholder","Confirm new password...","id","confirmnewpassword","formControlName","confirmnewpassword",1,"form-control"],["cdPasswordButton","confirmnewpassword",1,"btn","btn-outline-light","btn-password"],["wrappingClass","text-right",3,"form","disabled","submitText","submitActionEvent","backActionEvent"],[1,"invalid-feedback"],o,l,_,M,w,N]},template:function(t,o){if(1&t&&(e.TgZ(0,"div")(1,"h2"),e.SDv(2,0),e.qZA(),e.TgZ(3,"h4"),e.SDv(4,1),e.qZA(),e.TgZ(5,"form",2,3)(7,"div",4)(8,"div",5),e._UZ(9,"input",6)(10,"button",7),e.qZA(),e.YNc(11,l2,2,0,"span",8),e.YNc(12,u2,2,0,"span",8),e.qZA(),e.TgZ(13,"div",4)(14,"div",5),e._UZ(15,"input",9)(16,"button",10),e.qZA(),e.TgZ(17,"div",11),e._UZ(18,"div",12),e.qZA(),e.YNc(19,c2,2,0,"span",8),e.YNc(20,PS,2,0,"span",8),e.YNc(21,d2,2,1,"span",8),e.qZA(),e.TgZ(22,"div",4)(23,"div",5),e._UZ(24,"input",13)(25,"button",14),e.qZA(),e.YNc(26,zy,2,0,"span",8),e.YNc(27,t0,2,0,"span",8),e.qZA(),e.TgZ(28,"cd-form-button-panel",15),e.NdJ("submitActionEvent",function(){return o.onSubmit()})("backActionEvent",function(){return o.onCancel()}),e.ALo(29,"titlecase"),e.ALo(30,"upperFirst"),e.qZA()()()),2&t){const l=e.MAs(6);e.xp6(5),e.Q6J("formGroup",o.userForm),e.xp6(6),e.Q6J("ngIf",o.userForm.showError("oldpassword",l,"required")),e.xp6(1),e.Q6J("ngIf",o.userForm.showError("oldpassword",l,"notmatch")),e.xp6(6),e.Tol(o.passwordStrengthLevelClass),e.s9C("title",o.passwordValuation),e.xp6(1),e.Q6J("ngIf",o.userForm.showError("newpassword",l,"required")),e.xp6(1),e.Q6J("ngIf",o.userForm.showError("newpassword",l,"notmatch")),e.xp6(1),e.Q6J("ngIf",o.userForm.showError("newpassword",l,"passwordPolicy")),e.xp6(5),e.Q6J("ngIf",o.userForm.showError("confirmnewpassword",l,"required")),e.xp6(1),e.Q6J("ngIf",o.userForm.showError("confirmnewpassword",l,"match")),e.xp6(1),e.Q6J("form",o.userForm)("disabled",o.userForm.invalid)("submitText",e.lcZ(29,15,o.action)+" "+e.lcZ(30,17,o.resource))}},directives:[_n._Y,_n.JL,_n.sg,Ma.V,al.P,_e.o,_n.Fj,Il.b,_n.JJ,_n.u,Je.U,pd.C,p.O5,Cl.p],pipes:[p.rS,gt.m],styles:["cd-login-password-form h4{margin:0 0 30px}  cd-login-password-form .form-group{background-color:#2e373d;border-left:4px solid #fff}  cd-login-password-form .form-group:focus-within{border-left:4px solid #25828e}  cd-login-password-form .btn-password,   cd-login-password-form .btn-password:focus,   cd-login-password-form .form-control,   cd-login-password-form .form-control:focus{background-color:#2e373d;border:0;box-shadow:none;color:#f8f9fa;filter:none;outline:none}  cd-login-password-form .form-control::placeholder{color:#6c757d}  cd-login-password-form .btn-password:focus{outline-color:#25828e}  cd-login-password-form button.btn:not(:first-child){margin-left:5px}@keyframes autofill{to{background-color:#2e373d;color:#f8f9fa}}input[_ngcontent-%COMP%]:-webkit-autofill{animation-fill-mode:both;animation-name:autofill;border-radius:0;box-shadow:0 0 0 1000px #2e373d inset;-webkit-text-fill-color:#f8f9fa;-webkit-transition-property:none;transition-property:none}.invalid-feedback[_ngcontent-%COMP%]{padding-left:9px}.is-invalid.cd-form-control[_ngcontent-%COMP%]{border-color:transparent}"]}),n})();class f2{}function IS(n,s){1&n&&(e.TgZ(0,"div",21),e.SDv(1,22),e.qZA())}function LS(n,s){1&n&&(e.TgZ(0,"div",21),e.SDv(1,23),e.qZA())}function p2(n,s){if(1&n){const t=e.EpF();e.TgZ(0,"div",1)(1,"h1",2),e._uU(2,"Ceph login"),e.qZA(),e.TgZ(3,"form",3,4),e.NdJ("ngSubmit",function(){return e.CHM(t),e.oxw().login()}),e.TgZ(5,"div",5)(6,"label",6),e.SDv(7,7),e.qZA(),e.TgZ(8,"input",8,9),e.NdJ("ngModelChange",function(l){return e.CHM(t),e.oxw().model.username=l}),e.qZA(),e.YNc(10,IS,2,0,"div",10),e.qZA(),e.TgZ(11,"div",11)(12,"div",12)(13,"div",13)(14,"label",14),e.SDv(15,15),e.qZA(),e.TgZ(16,"input",16,17),e.NdJ("ngModelChange",function(l){return e.CHM(t),e.oxw().model.password=l}),e.qZA(),e.YNc(18,LS,2,0,"div",10),e.qZA(),e.TgZ(19,"span",18),e._UZ(20,"button",19),e.qZA()()(),e._UZ(21,"input",20),e.qZA()()}if(2&n){const t=e.MAs(4),o=e.MAs(9),l=e.MAs(17),_=e.oxw();e.xp6(8),e.Q6J("ngModel",_.model.username),e.uIk("aria-invalid",o.invalid),e.xp6(2),e.Q6J("ngIf",(t.submitted||o.dirty)&&o.invalid),e.xp6(6),e.Q6J("ngModel",_.model.password),e.uIk("aria-invalid",l.invalid),e.xp6(2),e.Q6J("ngIf",(t.submitted||l.dirty)&&l.invalid),e.xp6(3),e.Q6J("disabled",t.invalid)}}let h2=(()=>{class n{constructor(t,o,l,_,M){this.authService=t,this.authStorageService=o,this.modalService=l,this.route=_,this.router=M,this.model=new f2,this.isLoginActive=!1,this.postInstalled=!1}ngOnInit(){if(this.authStorageService.isLoggedIn())this.router.navigate([""]);else{this.modalService.dismissAll();let t=null;if(-1!==window.location.hash.indexOf("access_token=")){t=window.location.hash.split("access_token=")[1];const o=window.location.toString();window.history.replaceState({},document.title,o.split("?")[0])}this.authService.check(t).subscribe(o=>{o.login_url?(this.postInstalled="POST_INSTALLED"===o.cluster_status,"#/login"===o.login_url?this.isLoginActive=!0:window.location.replace(o.login_url)):(this.authStorageService.set(o.username,o.permissions,o.sso,o.pwdExpirationDate),this.router.navigate([""]))})}}login(){this.authService.login(this.model).subscribe(()=>{const t=this.postInstalled?"/":"/expand-cluster";let o=Er().get(this.route.snapshot.queryParams,"returnUrl",t);!this.postInstalled&&"/dashboard"===this.route.snapshot.queryParams.returnUrl&&(o="/expand-cluster"),this.router.navigate([o])})}}return n.\u0275fac=function(t){return new(t||n)(e.Y36(jy.e),e.Y36(zi.j),e.Y36(ru.Z),e.Y36(Bo.gz),e.Y36(Bo.F0))},n.\u0275cmp=e.Xpm({type:n,selectors:[["cd-login"]],decls:1,vars:1,consts:function(){let s,t,o,l,_;return s="Username",t="Password",o="Log in",l="Username is required",_="Password is required",[["class","container",4,"ngIf"],[1,"container"],[1,"sr-only"],["name","loginForm","novalidate","",3,"ngSubmit"],["loginForm","ngForm"],[1,"form-group","has-feedback","d-flex","flex-column","py-3"],["for","username",1,"placeholder","ps-3"],s,["id","username","name","username","type","text","aria-labelledby","username","required","","autofocus","",1,"form-control","ps-3",3,"ngModel","ngModelChange"],["username","ngModel"],["class","invalid-feedback ps-3",4,"ngIf"],["id","password-div",1,"form-group","has-feedback"],[1,"input-group","d-flex","flex-nowrap"],[1,"d-flex","flex-column","flex-grow-1","py-3"],["for","password",1,"placeholder","ps-3"],t,["id","password","name","password","type","password","aria-labelledby","password","required","",1,"form-control","ps-3",3,"ngModel","ngModelChange"],["password","ngModel"],[1,"form-group-append"],["type","button","cdPasswordButton","password","aria-label","toggle-password",1,"btn","btn-outline-light","btn-password","h-100","px-4"],["type","submit","value",o,1,"btn","btn-accent","px-5","py-2",3,"disabled"],[1,"invalid-feedback","ps-3"],l,_]},template:function(t,o){1&t&&e.YNc(0,p2,22,7,"div",0),2&t&&e.Q6J("ngIf",o.isLoginActive)},directives:[p.O5,_n._Y,_n.JL,_n.F,al.P,_e.o,_n.Fj,Il.b,_n.Q7,Je.U,_n.JJ,_n.On,pd.C],styles:["cd-login .form-group{background-color:#2e373d;border-left:4px solid #fff;height:auto;margin-bottom:2rem}  cd-login .form-group:focus-within{border-left:4px solid #25828e}  cd-login .btn-password,   cd-login .btn-password:focus,   cd-login .form-control,   cd-login .form-control:focus{background-color:#2e373d;border:0;box-shadow:none;color:#f8f9fa;filter:none;outline:none}  cd-login .placeholder{color:#adb5bd}  cd-login .btn-password:focus{outline-color:#25828e}@keyframes autofill{to{background-color:#2e373d;color:#f8f9fa}}input[_ngcontent-%COMP%]:-webkit-autofill{animation-fill-mode:both;animation-name:autofill;border-radius:0;box-shadow:0 0 0 1000px #2e373d inset;-webkit-text-fill-color:#f8f9fa;-webkit-transition-property:none;transition-property:none}"]}),n})();var n0=i(72625);function _2(n,s){if(1&n&&(e.TgZ(0,"h4",14),e._uU(1),e.qZA()),2&n){const t=e.oxw(2);e.xp6(1),e.Oqu(t.message)}}function rD(n,s){if(1&n&&(e.TgZ(0,"h4"),e.tHW(1,15),e._UZ(2,"a",16),e.N_p(),e.qZA()),2&n){const t=e.oxw(2);e.xp6(2),e.s9C("href",t.docUrl,e.LSH),e.pQV(t.sectionInfo),e.QtT(1)}}function g2(n,s){if(1&n&&(e.TgZ(0,"div"),e._UZ(1,"i",10),e.TgZ(2,"div",11)(3,"h3")(4,"b"),e._uU(5),e.qZA()(),e.YNc(6,_2,2,1,"h4",12),e.YNc(7,rD,3,2,"h4",13),e.qZA()()),2&n){const t=e.oxw();e.xp6(1),e.Q6J("ngClass",t.icon),e.xp6(4),e.Oqu(t.header),e.xp6(1),e.Q6J("ngIf",t.header!==t.message),e.xp6(1),e.Q6J("ngIf",t.section)}}function m2(n,s){if(1&n&&(e.TgZ(0,"button",19),e.SDv(1,20),e.qZA()),2&n){const t=e.oxw(2);e.Q6J("routerLink",t.buttonRoute),e.xp6(1),e.pQV(t.buttonName),e.QtT(1)}}function Ym(n,s){if(1&n&&(e.TgZ(0,"div",17),e.YNc(1,m2,2,2,"button",18),e.qZA()),2&n){const t=e.oxw(),o=e.MAs(11);e.xp6(1),e.Q6J("ngIf",!t.uiConfig)("ngIfElse",o)}}function FS(n,s){if(1&n){const t=e.EpF();e.TgZ(0,"button",22),e.NdJ("click",function(){return e.CHM(t),e.oxw(2).doConfigure()}),e.SDv(1,23),e.qZA()}if(2&n){const t=e.oxw(2);e.uIk("title",t.buttonTitle),e.xp6(1),e.pQV(t.buttonName),e.QtT(1)}}function jm(n,s){if(1&n&&e.YNc(0,FS,2,2,"button",21),2&n){const t=e.oxw();e.Q6J("ngIf",t.uiConfig)}}function iD(n,s){1&n&&(e._UZ(0,"i",24),e.TgZ(1,"div",11)(2,"h3"),e.tHW(3,25),e._UZ(4,"b"),e.N_p(),e.qZA(),e.TgZ(5,"h4",5),e.SDv(6,26),e.qZA()())}function kS(n,s){1&n&&(e.TgZ(0,"div",11)(1,"button",19),e.SDv(2,27),e.qZA()()),2&n&&(e.xp6(1),e.Q6J("routerLink","/dashboard"))}let v2=(()=>{class n{constructor(t,o,l,_){this.router=t,this.docService=o,this.http=l,this.notificationService=_}ngOnInit(){this.fetchData(),this.routerSubscription=this.router.events.pipe((0,np.h)(t=>t instanceof Bo.m2)).subscribe(()=>{this.fetchData()})}doConfigure(){this.http.post(`ui-api/${this.uiApiPath}/configure`,{}).subscribe({next:()=>{this.notificationService.show(Sa.k.info,`Configuring ${this.component}`)},error:t=>{this.notificationService.show(Sa.k.error,t)},complete:()=>{setTimeout(()=>{this.router.navigate([this.uiApiPath]),this.notificationService.show(Sa.k.success,`Configured ${this.component}`)},3e3)}})}unloadHandler(t){t.returnValue=!1}fetchData(){try{this.router.onSameUrlNavigation="reload",this.message=history.state.message,this.header=history.state.header,this.section=history.state.section,this.section_info=history.state.section_info,this.button_name=history.state.button_name,this.button_route=history.state.button_route,this.icon=history.state.icon,this.source=history.state.source,this.uiConfig=history.state.uiConfig,this.uiApiPath=history.state.uiApiPath,this.buttonRoute=history.state.button_route,this.buttonName=history.state.button_name,this.buttonTitle=history.state.button_title,this.component=history.state.component,this.docUrl=this.docService.urlGenerator(this.section)}catch(t){this.router.navigate(["/error"])}}ngOnDestroy(){this.routerSubscription&&this.routerSubscription.unsubscribe()}}return n.\u0275fac=function(t){return new(t||n)(e.Y36(Bo.F0),e.Y36(n0.R),e.Y36(y.eN),e.Y36(Sl.g))},n.\u0275cmp=e.Xpm({type:n,selectors:[["cd-error"]],hostBindings:function(t,o){1&t&&e.NdJ("beforeunload",function(_){return o.unloadHandler(_)},!1,e.Jf7)},decls:16,vars:4,consts:function(){let s,t,o,l,_,M;return s="Please consult the " + "\ufffd#2\ufffd" + "documentation" + "\ufffd/#2\ufffd" + " on how to configure and enable the " + "\ufffd0\ufffd" + " management functionality. ",t="" + "\ufffd0\ufffd" + "",o="" + "\ufffd0\ufffd" + "",l="" + "\ufffd#4\ufffd" + "Page not Found" + "\ufffd/#4\ufffd" + "",_="Sorry, we couldn\u2019t find what you were looking for. The page you requested may have been changed or moved.",M="Go To Dashboard",[["target","_blank"],[1,"container","h-75"],[1,"row","h-100","justify-content-center","align-items-center"],[1,"blank-page"],[4,"ngIf","ngIfElse"],[1,"mt-4"],["class","text-center",4,"ngIf","ngIfElse"],["configureButtonTpl",""],["elseBlock",""],["dashboardButton",""],[1,"mx-auto","d-block",3,"ngClass"],[1,"mt-4","text-center"],["class","mt-3",4,"ngIf"],[4,"ngIf"],[1,"mt-3"],s,[3,"href"],[1,"text-center"],["class","btn btn-primary",3,"routerLink",4,"ngIf","ngIfElse"],[1,"btn","btn-primary",3,"routerLink"],t,["class","btn btn-primary",3,"click",4,"ngIf"],[1,"btn","btn-primary",3,"click"],o,[1,"fa","fa-exclamation-triangle","mx-auto","d-block","text-danger"],l,_,M]},template:function(t,o){if(1&t&&(e.TgZ(0,"head")(1,"title"),e._uU(2,"Error Page"),e.qZA(),e._UZ(3,"base",0),e.qZA(),e.TgZ(4,"div",1)(5,"div",2)(6,"div",3),e.YNc(7,g2,8,4,"div",4),e.TgZ(8,"div",5),e.YNc(9,Ym,2,2,"div",6),e.qZA()()()(),e.YNc(10,jm,1,1,"ng-template",null,7,e.W1O),e.YNc(12,iD,7,0,"ng-template",null,8,e.W1O),e.YNc(14,kS,3,1,"ng-template",null,9,e.W1O)),2&t){const l=e.MAs(13),_=e.MAs(15);e.xp6(7),e.Q6J("ngIf",o.header&&o.message)("ngIfElse",l),e.xp6(2),e.Q6J("ngIf",o.buttonName&&o.buttonRoute||o.uiConfig)("ngIfElse",_)}},directives:[p.O5,p.mk,_e.o,Bo.rH],styles:["h4[_ngcontent-%COMP%]{color:#495057}i[_ngcontent-%COMP%]{font-size:6em;margin-top:120px}.fa-lock[_ngcontent-%COMP%]{color:#dc3545}.fa-wrench[_ngcontent-%COMP%]{color:#25828e}"]}),n})(),oD=(()=>{class n{}return n.\u0275fac=function(t){return new(t||n)},n.\u0275cmp=e.Xpm({type:n,selectors:[["cd-blank-layout"]],decls:1,vars:0,template:function(t,o){1&t&&e._UZ(0,"router-outlet")},directives:[Bo.lC],styles:[""]}),n})();var Vy=i(92340);let sD=(()=>{class n{constructor(t,o){this.http=t,this.localeId=o}getLocale(){return this.localeId||Vy.N.default_lang}setLocale(t){document.cookie=`cd-lang=${t}`}getLanguages(){return this.http.get("ui-api/langs")}}return n.\u0275fac=function(t){return new(t||n)(e.LFG(y.eN),e.LFG(e.soG))},n.\u0275prov=e.Yz7({token:n,factory:n.\u0275fac,providedIn:"root"}),n})();var Gm=(()=>{return(n=Gm||(Gm={})).cs="\u010ce\u0161tina",n.de="Deutsch",n["en-US"]="English",n.es="Espa\xf1ol",n.fr="Fran\xe7ais",n.id="Bahasa Indonesia",n.it="Italiano",n.ja="\u65e5\u672c\u8a9e",n.ko="\ud55c\uad6d\uc5b4",n.pl="Polski",n.pt="Portugu\xeas (brasileiro)",n["zh-Hans"]="\u4e2d\u6587 (\u7b80\u4f53)",n["zh-Hant"]="\u4e2d\u6587 (\u7e41\u9ad4\uff09",Gm;var n})();function Zy(n,s){if(1&n){const t=e.EpF();e.ynx(0),e.TgZ(1,"button",4),e.NdJ("click",function(){const _=e.CHM(t).$implicit;return e.oxw().changeLanguage(_.key)}),e._uU(2),e.qZA(),e.BQk()}if(2&n){const t=s.$implicit;e.xp6(2),e.hij(" ",t.value," ")}}let Wy=(()=>{class n{constructor(t){this.languageService=t,this.allLanguages=Gm,this.supportedLanguages={}}ngOnInit(){this.selectedLanguage=this.languageService.getLocale(),this.languageService.getLanguages().subscribe(t=>{this.supportedLanguages=Er().pick(Gm,t)})}reloadWindow(){window.location.reload()}changeLanguage(t){this.languageService.setLocale(t),this.reloadWindow()}}return n.\u0275fac=function(t){return new(t||n)(e.Y36(sD))},n.\u0275cmp=e.Xpm({type:n,selectors:[["cd-language-selector"]],decls:6,vars:4,consts:function(){let s;return s="Select a Language",[["ngbDropdown","","display","dynamic","placement","bottom-right"],["ngbDropdownToggle","","id","toggle-language-button","title",s,"role","button"],["ngbDropdownMenu","","role","listbox","aria-labelledby","toggle-language-button"],[4,"ngFor","ngForOf"],["ngbDropdownItem","","role","option",3,"click"]]},template:function(t,o){1&t&&(e.TgZ(0,"div",0)(1,"a",1),e._uU(2),e.qZA(),e.TgZ(3,"div",2),e.YNc(4,Zy,3,1,"ng-container",3),e.ALo(5,"keyvalue"),e.qZA()()),2&t&&(e.xp6(2),e.hij(" ",o.allLanguages[o.selectedLanguage]," "),e.xp6(2),e.Q6J("ngForOf",e.lcZ(5,2,o.supportedLanguages)))},directives:[Dr.jt,Dr.iD,Dr.Vi,p.sg,_e.o,Dr.TH],pipes:[p.Nd],styles:[""]}),n})(),$S=(()=>{class n{constructor(t){this.http=t,this.baseUiURL="ui-api/login/custom_banner"}getBannerText(){return this.http.get(this.baseUiURL)}}return n.\u0275fac=function(t){return new(t||n)(e.LFG(y.eN))},n.\u0275prov=e.Yz7({token:n,factory:n.\u0275fac,providedIn:"root"}),n})();function HS(n,s){if(1&n&&(e.TgZ(0,"p",1),e._uU(1),e.qZA()),2&n){const t=s.ngIf;e.xp6(1),e.Oqu(t)}}let BS=(()=>{class n{constructor(t){this.customLoginBannerService=t}ngOnInit(){this.bannerText$=this.customLoginBannerService.getBannerText()}}return n.\u0275fac=function(t){return new(t||n)(e.Y36($S))},n.\u0275cmp=e.Xpm({type:n,selectors:[["cd-custom-login-banner"]],decls:2,vars:3,consts:[["class","login-text",4,"ngIf"],[1,"login-text"]],template:function(t,o){1&t&&(e.YNc(0,HS,2,1,"p",0),e.ALo(1,"async")),2&t&&e.Q6J("ngIf",e.lcZ(1,1,o.bannerText$))},directives:[p.O5],pipes:[p.Ov],styles:[".login-text[_ngcontent-%COMP%]{font-weight:700;margin:0;padding:12px 20% 12px 12px}"]}),n})();function US(n,s){if(1&n&&(e.TgZ(0,"li",11)(1,"cd-doc",12),e.DtL(2,13),e.qZA()()),2&n){const t=s.$implicit;e.xp6(1),e.pQV(t.text),e.QtT(2),e.s9C("section",t.section)}}let YS=(()=>{class n{constructor(){this.docItems=[{section:"help",text:"Help"},{section:"security",text:"Security"},{section:"trademarks",text:"Trademarks"}]}}return n.\u0275fac=function(t){return new(t||n)},n.\u0275cmp=e.Xpm({type:n,selectors:[["cd-login-layout"]],decls:16,vars:1,consts:function(){let s;return s="" + "\ufffd0\ufffd" + "",[[1,"login","full-height"],[1,"navbar","p-4"],[1,"navbar-brand"],[1,"form-inline"],[1,"container"],[1,"row","full-height"],[1,"col-sm-12","col-md-6","d-sm-block","login-form"],[1,"col-sm-12","col-md-6","d-sm-block","branding-info"],["src","assets/Ceph_Ceph_Logo_with_text_white.svg","alt","Ceph",1,"img-fluid","pb-3"],[1,"list-inline"],["class","list-inline-item p-3",4,"ngFor","ngForOf"],[1,"list-inline-item","p-3"],["noSubscribe","true",3,"section",6,"docText"],["docText",s]]},template:function(t,o){1&t&&(e.TgZ(0,"main",0)(1,"header")(2,"nav",1),e._UZ(3,"a",2),e.TgZ(4,"div",3),e._UZ(5,"cd-language-selector"),e.qZA()()(),e.TgZ(6,"section")(7,"div",4)(8,"div",5)(9,"div",6),e._UZ(10,"router-outlet"),e.qZA(),e.TgZ(11,"div",7),e._UZ(12,"img",8),e.TgZ(13,"ul",9),e.YNc(14,US,3,2,"li",10),e.qZA(),e._UZ(15,"cd-custom-login-banner"),e.qZA()()()()()),2&t&&(e.xp6(14),e.Q6J("ngForOf",o.docItems))},directives:[Dr.M2,Wy,Bo.lC,p.sg,gf.K,BS],styles:["cd-login-layout .login{background-color:#374249;background-image:url(ceph_background.3fbdf95cd52530d7.gif);background-position:right bottom;background-repeat:no-repeat;color:#f8f9fa}  cd-login-layout .login header{position:absolute;width:100vw}  cd-login-layout .login header .navbar .dropdown-menu{margin-top:.2rem}  cd-login-layout .login header .navbar .dropdown-menu li a:hover{background-color:#25828e}  cd-login-layout .login section{display:inline-flex;min-height:100vh;width:100vw}  cd-login-layout .login .list-inline{margin-bottom:0;margin-left:17%}  cd-login-layout .login a{color:#fff}  cd-login-layout .login a:hover{color:#adb5bd}@media screen and (min-width: 576px){  cd-login-layout .login .login-form,   cd-login-layout .login .branding-info{padding-top:30vh}}@media screen and (max-width: 767px){  cd-login-layout .login .login-form{padding-top:10vh}  cd-login-layout .login .branding-info{padding-top:0}}"]}),n})();var zm=i(74255);let jS=(()=>{class n{constructor(t,o,l){this.document=t,this.summaryService=o,this.cssHelper=l}init(){var t;this.url=null===(t=this.document.getElementById("cdFavicon"))||void 0===t?void 0:t.getAttribute("href"),this.sub=this.summaryService.subscribe(o=>{this.changeIcon(o.health_status)})}changeIcon(t){if(t===this.oldStatus)return;this.oldStatus=t;const o=this.document.getElementById("cdFavicon"),M=this.document.createElement("canvas");M.width=16,M.height=16;const w=M.getContext("2d"),N=this.document.createElement("img");N.src=this.url,N.onload=()=>{w.drawImage(N,0,0,16,16),Object.keys(lm).includes(t)&&(w.save(),w.globalCompositeOperation="destination-out",w.beginPath(),w.arc(M.width-4,4,6,0,2*Math.PI),w.fill(),w.restore(),w.beginPath(),w.arc(M.width-4,4,4,0,2*Math.PI),w.fillStyle=this.cssHelper.propertyValue(lm[t]),w.fill()),o.setAttribute("href",M.toDataURL("image/png"))}}ngOnDestroy(){var t;this.changeIcon(),null===(t=this.sub)||void 0===t||t.unsubscribe()}}return n.\u0275fac=function(t){return new(t||n)(e.LFG(p.K0),e.LFG(zm.J),e.LFG($m.P))},n.\u0275prov=e.Yz7({token:n,factory:n.\u0275fac}),n})();var y2=i(71099),GS=i(59193),Pv=i(68307);class Jy{constructor(s,t){this.count=s,this.source=t}call(s,t){return t.subscribe(new VS(s,this.count,this.source))}}class VS extends Sf.L{constructor(s,t,o){super(s),this.count=t,this.source=o}complete(){if(!this.isStopped){const{source:s,count:t}=this;if(0===t)return super.complete();t>-1&&(this.count=t-1),s.subscribe(this._unsubscribeAndRecycle())}}}var ZS=i(2817);let WS=(()=>{class n{constructor(t){this.http=t,this.url="ui-api/motd"}get(){return this.http.get(this.url)}}return n.\u0275fac=function(t){return new(t||n)(e.LFG(y.eN))},n.\u0275prov=e.Yz7({token:n,factory:n.\u0275fac,providedIn:"root"}),n})(),Qy=(()=>{class n{constructor(t){this.motdService=t,this.motdSource=new Tc.X(null),this.localStorageKey="dashboard_motd_hidden",this.motd$=this.motdSource.asObservable(),this.subscription=(0,nc.of)(!0).pipe((0,Ac.zg)(()=>this.motdService.get()),(0,Ov.K)(o=>(cu.isFunction(o.preventDefault)&&o.preventDefault(),GS.E)),(0,Pv.b)(o=>this.processResponse(o)),(0,C_.g)(6e4),function zS(n=-1){return s=>0===n?(0,GS.c)():s.lift(new Jy(n<0?-1:n-1,s))}(),(0,ZS.r)()).subscribe()}ngOnDestroy(){this.subscription.unsubscribe()}hide(){const t=this.motdSource.getValue();if(t){const o=`${t.severity}:${t.md5}`;switch(t.severity){case"info":localStorage.setItem(this.localStorageKey,o),sessionStorage.removeItem(this.localStorageKey);break;case"warning":sessionStorage.setItem(this.localStorageKey,o),localStorage.removeItem(this.localStorageKey)}}this.motdSource.next(null)}processResponse(t){const o=sessionStorage.getItem(this.localStorageKey)||localStorage.getItem(this.localStorageKey);let l=cu.isNull(o);if(!l&&t){const[_,M]=o.split(":");(_!==t.severity||M!==t.md5)&&(l=!0,sessionStorage.removeItem(this.localStorageKey),localStorage.removeItem(this.localStorageKey))}l&&this.motdSource.next(t)}}return n.\u0275fac=function(t){return new(t||n)(e.LFG(WS))},n.\u0275prov=e.Yz7({token:n,factory:n.\u0275fac,providedIn:"root"}),n})();var E2=i(51907);function JS(n,s){1&n&&(e.TgZ(0,"div"),e.tHW(1,3),e._UZ(2,"strong")(3,"a",4),e.N_p(),e.qZA())}function QS(n,s){if(1&n&&(e.TgZ(0,"div"),e.tHW(1,5),e._UZ(2,"strong")(3,"a",4),e.N_p(),e.qZA()),2&n){const t=e.oxw(2);e.xp6(3),e.pQV(t.expirationDays),e.QtT(1)}}function KS(n,s){if(1&n){const t=e.EpF();e.TgZ(0,"cd-alert-panel",1),e.NdJ("dismissed",function(){return e.CHM(t),e.oxw().onDismissed()}),e.YNc(1,JS,4,0,"div",2),e.YNc(2,QS,4,1,"div",2),e.qZA()}if(2&n){const t=e.oxw();e.Q6J("type",t.alertType)("showTitle",!1)("dismissible","danger"!==t.alertType),e.xp6(1),e.Q6J("ngIf",0===t.expirationDays),e.xp6(1),e.Q6J("ngIf",t.expirationDays>0)}}let b2=(()=>{class n{constructor(t,o){this.settingsService=t,this.authStorageService=o,this.displayNotification=!1}ngOnInit(){this.settingsService.getStandardSettings().subscribe(t=>{this.pwdExpirationSettings=new E2.G(t);const o=this.authStorageService.getPwdExpirationDate();o&&(this.expirationDays=this.getExpirationDays(o),this.alertType=this.expirationDays<=this.pwdExpirationSettings.pwdExpirationWarning2?"danger":"warning",this.displayNotification=this.expirationDays<=this.pwdExpirationSettings.pwdExpirationWarning1,this.authStorageService.isPwdDisplayedSource.next(this.displayNotification))})}ngOnDestroy(){this.authStorageService.isPwdDisplayedSource.next(!1)}getExpirationDays(t){const o=new Date,l=new Date(1e3*t);return Math.floor((l.valueOf()-o.valueOf())/864e5)}onDismissed(){this.authStorageService.isPwdDisplayedSource.next(!1),this.displayNotification=!1}}return n.\u0275fac=function(t){return new(t||n)(e.Y36(Rp.g),e.Y36(zi.j))},n.\u0275cmp=e.Xpm({type:n,selectors:[["cd-pwd-expiration-notification"]],decls:1,vars:1,consts:function(){let s,t;return s="Your password will expire in " + "\ufffd#2\ufffd" + "less than 1" + "\ufffd/#2\ufffd" + " day. Click " + "\ufffd#3\ufffd" + "here" + "\ufffd/#3\ufffd" + " to change it now.",t="Your password will expire in " + "\ufffd#2\ufffd" + "" + "\ufffd0\ufffd" + "" + "\ufffd/#2\ufffd" + " day(s). Click " + "\ufffd#3\ufffd" + "here" + "\ufffd/#3\ufffd" + " to change it now.",[["class","no-margin-bottom","size","slim",3,"type","showTitle","dismissible","dismissed",4,"ngIf"],["size","slim",1,"no-margin-bottom",3,"type","showTitle","dismissible","dismissed"],[4,"ngIf"],s,["routerLink","/user-profile/edit",1,"alert-link"],t]},template:function(t,o){1&t&&e.YNc(0,KS,3,5,"cd-alert-panel",0),2&t&&e.Q6J("ngIf",o.displayNotification)},directives:[p.O5,Eo.G,Bo.yS],styles:[".no-margin-bottom[_ngcontent-%COMP%]{margin-bottom:0}"]}),n})();function S2(n,s){if(1&n){const t=e.EpF();e.TgZ(0,"cd-alert-panel",1),e.NdJ("dismissed",function(){return e.CHM(t),e.oxw().onDismissed()}),e.TgZ(1,"div"),e.tHW(2,2),e._UZ(3,"a",3)(4,"a",4),e.N_p(),e.qZA()()}if(2&n){const t=e.oxw();e.Q6J("showTitle",!1)("type",t.notificationSeverity)("dismissible","danger"!==t.notificationSeverity)}}let Iv=(()=>{class n{constructor(t,o,l,_){this.mgrModuleService=t,this.authStorageService=o,this.notificationService=l,this.telemetryNotificationService=_,this.displayNotification=!1,this.notificationSeverity="warning"}ngOnInit(){if(this.telemetryNotificationService.update.subscribe(t=>{this.displayNotification=t}),!this.isNotificationHidden()){const t=this.authStorageService.getPermissions().configOpt;Er().every(Object.values(t))&&this.mgrModuleService.getConfig("telemetry").subscribe(o=>{o.enabled||this.telemetryNotificationService.setVisibility(!0)})}}ngOnDestroy(){this.telemetryNotificationService.setVisibility(!1)}isNotificationHidden(){return"true"===localStorage.getItem("telemetry_notification_hidden")}onDismissed(){this.telemetryNotificationService.setVisibility(!1),localStorage.setItem("telemetry_notification_hidden","true"),this.notificationService.show(Sa.k.success,"Telemetry activation reminder muted","You can activate the module on the Telemetry configuration page (<b>Dashboard Settings</b> -> <b>Telemetry configuration</b>) at any time.")}}return n.\u0275fac=function(t){return new(t||n)(e.Y36(Mg.N),e.Y36(zi.j),e.Y36(Sl.g),e.Y36(Oy))},n.\u0275cmp=e.Xpm({type:n,selectors:[["cd-telemetry-notification"]],decls:1,vars:1,consts:function(){let s;return s="The Ceph community needs your help to continue improving: please " + "\ufffd#3\ufffd" + "Activate" + "[\ufffd/#3\ufffd|\ufffd/#4\ufffd]" + " the " + "\ufffd#4\ufffd" + "Telemetry" + "[\ufffd/#3\ufffd|\ufffd/#4\ufffd]" + " module.",s=e.Zx4(s),[["class","no-margin-bottom","size","slim",3,"showTitle","type","dismissible","dismissed",4,"ngIf"],["size","slim",1,"no-margin-bottom",3,"showTitle","type","dismissible","dismissed"],s,["routerLink","/telemetry",1,"btn","activate-button","alert-link","activate-text"],["href","https://docs.ceph.com/en/latest/mgr/telemetry/"]]},template:function(t,o){1&t&&e.YNc(0,S2,5,3,"cd-alert-panel",0),2&t&&e.Q6J("ngIf",o.displayNotification)},directives:[p.O5,Eo.G,Bo.yS],styles:[".no-margin-bottom[_ngcontent-%COMP%]{font-size:.875rem;margin-bottom:0}.activate-button[_ngcontent-%COMP%]{background-color:#fcecba;border:#495057 solid .5px;border-radius:10%;padding:.1rem .4rem}.activate-text[_ngcontent-%COMP%]{color:#495057;font-weight:700}a[_ngcontent-%COMP%]{color:#1a5d66;font-weight:700}"]}),n})();var T2=i(60793);function Ky(n,s){if(1&n){const t=e.EpF();e.TgZ(0,"cd-alert-panel",1),e.NdJ("dismissed",function(){return e.CHM(t),e.oxw().onDismissed()}),e._UZ(1,"span",2),e.ALo(2,"sanitizeHtml"),e.qZA()}if(2&n){const t=e.oxw();e.Q6J("showTitle",!1)("type",t.motd.severity)("dismissible","danger"!==t.motd.severity),e.xp6(1),e.Q6J("innerHTML",e.lcZ(2,4,t.motd.message),e.oJD)}}let Q_=(()=>{class n{constructor(t){this.motdNotificationService=t,this.motd=void 0}ngOnInit(){this.subscription=this.motdNotificationService.motd$.subscribe(t=>{this.motd=t})}ngOnDestroy(){this.subscription.unsubscribe()}onDismissed(){this.motdNotificationService.hide()}}return n.\u0275fac=function(t){return new(t||n)(e.Y36(Qy))},n.\u0275cmp=e.Xpm({type:n,selectors:[["cd-motd"]],decls:1,vars:1,consts:[["size","slim",3,"showTitle","type","dismissible","dismissed",4,"ngIf"],["size","slim",3,"showTitle","type","dismissible","dismissed"],[3,"innerHTML"]],template:function(t,o){1&t&&e.YNc(0,Ky,3,6,"cd-alert-panel",0),2&t&&e.Q6J("ngIf",o.motd)},directives:[p.O5,Eo.G],pipes:[T2.A],styles:[""]}),n})();class Xy{constructor(s){if(this._maxConcurrency=s,this._queue=[],s<=0)throw new Error("semaphore must be initialized to a positive value");this._value=s}acquire(){const s=this.isLocked(),t=new Promise(o=>this._queue.push(o));return s||this._dispatch(),t}runExclusive(s){return function(n,s,t,o){return new(t||(t=Promise))(function(_,M){function w(X){try{V(o.next(X))}catch(re){M(re)}}function N(X){try{V(o.throw(X))}catch(re){M(re)}}function V(X){X.done?_(X.value):function l(_){return _ instanceof t?_:new t(function(M){M(_)})}(X.value).then(w,N)}V((o=o.apply(n,s||[])).next())})}(this,void 0,void 0,function*(){const[t,o]=yield this.acquire();try{return yield s(t)}finally{o()}})}isLocked(){return this._value<=0}release(){if(this._maxConcurrency>1)throw new Error("this method is unavailabel on semaphores with concurrency > 1; use the scoped release returned by acquire instead");this._currentReleaser&&(this._currentReleaser(),this._currentReleaser=void 0)}_dispatch(){const s=this._queue.shift();if(!s)return;let t=!1;this._currentReleaser=()=>{t||(t=!0,this._value++,this._dispatch())},s([this._value--,this._currentReleaser])}}class M2{constructor(){this._semaphore=new Xy(1)}acquire(){return function(n,s,t,o){return new(t||(t=Promise))(function(_,M){function w(X){try{V(o.next(X))}catch(re){M(re)}}function N(X){try{V(o.throw(X))}catch(re){M(re)}}function V(X){X.done?_(X.value):function l(_){return _ instanceof t?_:new t(function(M){M(_)})}(X.value).then(w,N)}V((o=o.apply(n,s||[])).next())})}(this,void 0,void 0,function*(){const[,s]=yield this._semaphore.acquire();return s})}runExclusive(s){return this._semaphore.runExclusive(()=>s())}isLocked(){return this._semaphore.isLocked()}release(){this._semaphore.release()}}let r0=(()=>{class n{constructor(t,o){this.alertFormatter=t,this.prometheusService=o,this.backendFailure=!1,this.notifications=[]}refresh(){this.backendFailure||this.prometheusService.getNotifications(Er().last(this.notifications)).subscribe(t=>this.handleNotifications(t),()=>this.backendFailure=!0)}handleNotifications(t){0!==t.length&&(this.notifications.length>0&&this.alertFormatter.sendNotifications(Er().flatten(t.map(o=>this.formatNotification(o)))),this.notifications=this.notifications.concat(t))}formatNotification(t){return this.alertFormatter.convertToCustomAlerts(t.alerts).map(o=>this.alertFormatter.convertAlertToNotification(o))}}return n.\u0275fac=function(t){return new(t||n)(e.LFG(gy),e.LFG(rh))},n.\u0275prov=e.Yz7({token:n,factory:n.\u0275fac,providedIn:"root"}),n})();var o0=i(57924),O2=i(90504),qy=i(85770);const s0=function(n,s){return[n,s]},qS=function(n,s,t,o){return[n,s,t,o]};function eE(n,s){if(1&n&&(e.TgZ(0,"div")(1,"div",11)(2,"div",12)(3,"div",13)(4,"span",14),e._UZ(5,"i",15)(6,"i",15),e.qZA()(),e.TgZ(7,"div",16)(8,"div",17)(9,"h6",18),e._uU(10),e.qZA(),e.TgZ(11,"div",19),e._UZ(12,"ngb-progressbar",20),e.qZA(),e.TgZ(13,"p",21)(14,"small",22),e._uU(15),e.ALo(16,"cdDate"),e.qZA(),e.TgZ(17,"span",23),e._uU(18),e.qZA()()()()()(),e._UZ(19,"hr"),e.qZA()),2&n){const t=s.$implicit,o=e.oxw(2);e.xp6(4),e.Q6J("ngClass",e.WLB(11,s0,o.icons.stack,o.icons.large2x)),e.xp6(1),e.Q6J("ngClass",e.WLB(14,s0,o.icons.stack2x,o.icons.circle)),e.xp6(1),e.Q6J("ngClass",e.l5B(17,qS,o.icons.stack1x,o.icons.spinner,o.icons.spin,o.icons.inverse)),e.xp6(4),e.Oqu(t.description),e.xp6(2),e.Q6J("value",null==t?null:t.progress)("striped",!0)("animated",!0),e.xp6(3),e.hij(" ",e.lcZ(16,9,t.begin_time)," "),e.xp6(3),e.hij(" ",t.progress||0," % ")}}function eT(n,s){if(1&n&&e.YNc(0,eE,20,22,"div",10),2&n){const t=e.oxw();e.Q6J("ngForOf",t.executingTasks)("ngForTrackBy",t.trackByFn)}}const Fv=function(n){return[n]};function A2(n,s){if(1&n){const t=e.EpF();e.TgZ(0,"button",37),e.NdJ("click",function(){e.CHM(t);const l=e.oxw().$implicit;return e.oxw(3).silence(l)}),e._UZ(1,"i",15),e.qZA()}if(2&n){const t=e.oxw(4);e.xp6(1),e.Q6J("ngClass",e.VKq(1,Fv,t.icons.mute))}}function lD(n,s){if(1&n){const t=e.EpF();e.TgZ(0,"button",38),e.NdJ("click",function(){e.CHM(t);const l=e.oxw().$implicit;return e.oxw(3).expire(l)}),e._UZ(1,"i",15),e.qZA()}if(2&n){const t=e.oxw(4);e.xp6(1),e.Q6J("ngClass",e.VKq(1,Fv,t.icons.bell))}}function tE(n,s){if(1&n&&(e.ynx(0),e.TgZ(1,"small"),e.ynx(2),e.SDv(3,39),e.BQk(),e._uU(4),e.ALo(5,"duration"),e.qZA(),e._UZ(6,"br"),e.BQk()),2&n){const t=e.oxw().$implicit;e.xp6(4),e.hij(" ",e.lcZ(5,1,t.duration)," ")}}const a0=function(n,s,t){return[n,s,t]};function tT(n,s){if(1&n){const t=e.EpF();e.TgZ(0,"div",15)(1,"div",29)(2,"div",12)(3,"div",13)(4,"span",15),e._UZ(5,"i",15)(6,"i",15),e.qZA()(),e.TgZ(7,"div",30)(8,"div",17)(9,"button",31),e.NdJ("click",function(l){const M=e.CHM(t).index;return e.oxw(3).remove(M),l.stopPropagation()}),e._UZ(10,"i",15),e.qZA(),e.YNc(11,A2,2,3,"button",32),e.YNc(12,lD,2,3,"button",33),e.TgZ(13,"h6",18),e._uU(14),e.qZA(),e._UZ(15,"p",34),e.TgZ(16,"p",21),e.YNc(17,tE,7,3,"ng-container",24),e.TgZ(18,"small",35),e.ALo(19,"cdDate"),e._uU(20),e.ALo(21,"relativeDate"),e.qZA(),e._UZ(22,"i",36),e.qZA()()()()(),e._UZ(23,"hr"),e.qZA()}if(2&n){const t=s.$implicit,o=e.oxw(3);e.Q6J("ngClass",t.borderClass),e.xp6(4),e.Q6J("ngClass",e.kEZ(18,a0,o.icons.stack,o.icons.large2x,t.textClass)),e.xp6(1),e.Q6J("ngClass",e.WLB(22,s0,o.icons.circle,o.icons.stack2x)),e.xp6(1),e.Q6J("ngClass",e.kEZ(25,a0,o.icons.stack1x,o.icons.inverse,t.iconClass)),e.xp6(4),e.Q6J("ngClass",e.VKq(29,Fv,o.icons.trash)),e.xp6(1),e.Q6J("ngIf","Prometheus"===t.application&&2!==t.type&&!t.alertSilenced),e.xp6(1),e.Q6J("ngIf","Prometheus"===t.application&&2!==t.type&&t.alertSilenced),e.xp6(2),e.Oqu(t.title),e.xp6(1),e.Q6J("innerHtml",t.message,e.oJD),e.xp6(2),e.Q6J("ngIf",t.duration),e.xp6(1),e.Q6J("title",e.lcZ(19,14,t.timestamp)),e.xp6(2),e.Oqu(e.lcZ(21,16,t.timestamp)),e.xp6(2),e.Q6J("ngClass",e.VKq(31,Fv,t.applicationClass))("title",t.application)}}function nE(n,s){if(1&n){const t=e.EpF();e.ynx(0),e.TgZ(1,"button",25),e.NdJ("click",function(l){return e.CHM(t),e.oxw(2).removeAll(),l.stopPropagation()}),e._UZ(2,"i",26),e._uU(3," \xa0 "),e.ynx(4),e.SDv(5,27),e.BQk(),e.qZA(),e._UZ(6,"hr"),e.YNc(7,tT,24,33,"div",28),e.BQk()}if(2&n){const t=e.oxw(2);e.xp6(2),e.Q6J("ngClass",e.VKq(2,Fv,t.icons.trash)),e.xp6(5),e.Q6J("ngForOf",t.notifications)}}function rE(n,s){if(1&n&&e.YNc(0,nE,8,4,"ng-container",24),2&n){const t=e.oxw();e.Q6J("ngIf",t.notifications.length>0)}}function D2(n,s){1&n&&(e.TgZ(0,"div")(1,"div",40),e.SDv(2,41),e.qZA()())}function w2(n,s){if(1&n&&e.YNc(0,D2,3,0,"div",24),2&n){const t=e.oxw();e.Q6J("ngIf",0===t.notifications.length&&0===t.executingTasks.length)}}function x2(n,s){1&n&&e.GkF(0)}function R2(n,s){1&n&&e.GkF(0)}function nT(n,s){1&n&&e.GkF(0)}let iE=(()=>{class n{constructor(t,o,l,_,M,w,N,V,X,re){this.notificationService=t,this.summaryService=o,this.taskMessageService=l,this.prometheusNotificationService=_,this.succeededLabels=M,this.authStorageService=w,this.prometheusAlertService=N,this.prometheusService=V,this.ngZone=X,this.cdRef=re,this.isSidebarOpened=!1,this.executingTasks=[],this.subs=new fc.w,this.icons=No.P,this.last_task="",this.mutex=new M2,this.simplebar={autoHide:!1},this.notifications=[]}ngOnDestroy(){window.clearInterval(this.interval),window.clearTimeout(this.timeout),this.subs.unsubscribe()}ngOnInit(){this.last_task=window.localStorage.getItem("last_task");const t=this.authStorageService.getPermissions();t.prometheus.read&&t.configOpt.read&&(this.triggerPrometheusAlerts(),this.ngZone.runOutsideAngular(()=>{this.interval=window.setInterval(()=>{this.ngZone.run(()=>{this.triggerPrometheusAlerts()})},5e3)})),this.subs.add(this.notificationService.data$.subscribe(o=>{this.notifications=Er().orderBy(o,["timestamp"],["desc"]),this.cdRef.detectChanges()})),this.subs.add(this.notificationService.sidebarSubject.subscribe(o=>{this.isSidebarOpened=!o&&!this.isSidebarOpened,window.clearTimeout(this.timeout),this.timeout=window.setTimeout(()=>{this.cdRef.detectChanges()},0)})),this.subs.add(this.summaryService.subscribe(o=>{this._handleTasks(o.executing_tasks),this.mutex.acquire().then(l=>{Er().filter(o.finished_tasks,_=>!this.last_task||Es()(_.end_time).isAfter(this.last_task)).forEach(_=>{const M=this.notificationService.finishedTaskToNotification(_,_.success),w=new bv.e(M);w.timestamp=_.end_time,w.duration=_.duration,(!this.last_task||Es()(_.end_time).isAfter(this.last_task))&&(this.last_task=_.end_time,window.localStorage.setItem("last_task",this.last_task)),this.notificationService.save(w)}),this.cdRef.detectChanges(),l()})}))}_handleTasks(t){for(const o of t)o.description=this.taskMessageService.getRunningTitle(o);this.executingTasks=t}triggerPrometheusAlerts(){this.prometheusAlertService.refresh(),this.prometheusNotificationService.refresh()}removeAll(){this.notificationService.removeAll()}remove(t){this.notificationService.remove(t)}closeSidebar(){this.isSidebarOpened=!1}trackByFn(t){return t}silence(t){const o="YYYY-MM-DD HH:mm",l="silence",_={name:"alertname",value:t.title.split(" ")[0],isRegex:!1},M={matchers:[_],startsAt:Es()(Es()().format(o)).toISOString(),endsAt:Es()(Es()().add(2,"hours").format(o)).toISOString(),createdBy:this.authStorageService.getUsername(),comment:"Silence created from the alert notification"};let w="";t.alertSilenced=!0,w=w.concat(` ${_.name} - ${_.value},`);const N=`${this.succeededLabels.CREATED} ${l} for ${w.slice(0,-1)}`;this.prometheusService.setSilence(M).subscribe(V=>{t&&(t.silenceId=V.body.silenceId),this.notificationService.show(Sa.k.success,N,void 0,void 0,"Prometheus")})}expire(t){t.alertSilenced=!1,this.prometheusService.expireSilence(t.silenceId).subscribe(()=>{this.notificationService.show(Sa.k.success,`${this.succeededLabels.EXPIRED} ${t.silenceId}`,void 0,void 0,"Prometheus")},o=>{o.application="Prometheus"})}}return n.\u0275fac=function(t){return new(t||n)(e.Y36(Sl.g),e.Y36(zm.J),e.Y36(o0.p),e.Y36(r0),e.Y36(Mo.aX),e.Y36(zi.j),e.Y36(am),e.Y36(rh),e.Y36(e.R0b),e.Y36(e.sBO))},n.\u0275cmp=e.Xpm({type:n,selectors:[["cd-notifications-sidebar"]],hostVars:2,hostBindings:function(t,o){2&t&&e.ekj("active",o.isSidebarOpened)},decls:16,vars:5,consts:function(){let s,t,o,l,_,M,w;return s="Tasks and Notifications",t="Clear notifications",o="Remove notification",l="Silence Alert",_="Expire Silence",M="Duration:",w="There are no notifications.",[["tasksTpl",""],["notificationsTpl",""],["emptyTpl",""],[1,"card",3,"clickOutsideEnabled","clickOutside"],[1,"card-header"],s,["tabindex","-1","type","button","title","close",1,"btn-close","float-end",3,"click"],[3,"options"],[1,"card-body"],[4,"ngTemplateOutlet"],[4,"ngFor","ngForOf","ngForTrackBy"],[1,"card","tc_task","border-0"],[1,"row","no-gutters"],[1,"col-md-2","text-center"],[1,"text-info",3,"ngClass"],[3,"ngClass"],[1,"col-md-9"],[1,"card-body","p-1"],[1,"card-title","bold"],[1,"mb-1"],["type","info",3,"value","striped","animated"],[1,"card-text","text-muted"],[1,"date","float-start"],[1,"float-end"],[4,"ngIf"],["type","button",1,"btn","btn-light","btn-block",3,"click"],["aria-hidden","true",3,"ngClass"],t,[3,"ngClass",4,"ngFor","ngForOf"],[1,"card","tc_notification","border-0"],[1,"col-md-10"],["title",o,1,"btn","btn-link","float-end","mt-0","pt-0",3,"click"],["class","btn btn-link float-end text-muted mute m-0 p-0","title",l,3,"click",4,"ngIf"],["class","btn btn-link float-end text-muted mute m-0 p-0","title",_,3,"click",4,"ngIf"],[1,"card-text",3,"innerHtml"],[1,"date",3,"title"],[1,"float-end","custom-icon",3,"ngClass","title"],["title",l,1,"btn","btn-link","float-end","text-muted","mute","m-0","p-0",3,"click"],["title",_,1,"btn","btn-link","float-end","text-muted","mute","m-0","p-0",3,"click"],M,[1,"message","text-center"],w]},template:function(t,o){if(1&t&&(e.YNc(0,eT,1,2,"ng-template",null,0,e.W1O),e.YNc(2,rE,1,1,"ng-template",null,1,e.W1O),e.YNc(4,w2,1,1,"ng-template",null,2,e.W1O),e.TgZ(6,"div",3),e.NdJ("clickOutside",function(){return o.closeSidebar()}),e.TgZ(7,"div",4),e.ynx(8),e.SDv(9,5),e.BQk(),e.TgZ(10,"button",6),e.NdJ("click",function(){return o.closeSidebar()}),e.qZA()(),e.TgZ(11,"ngx-simplebar",7)(12,"div",8),e.YNc(13,x2,1,0,"ng-container",9),e.YNc(14,R2,1,0,"ng-container",9),e.YNc(15,nT,1,0,"ng-container",9),e.qZA()()()),2&t){const l=e.MAs(1),_=e.MAs(3),M=e.MAs(5);e.xp6(6),e.Q6J("clickOutsideEnabled",o.isSidebarOpened),e.xp6(5),e.Q6J("options",o.simplebar),e.xp6(2),e.Q6J("ngTemplateOutlet",l),e.xp6(1),e.Q6J("ngTemplateOutlet",_),e.xp6(1),e.Q6J("ngTemplateOutlet",M)}},directives:[p.sg,p.mk,Dr.Ly,p.O5,_e.o,O2._,qy.M,p.tP],pipes:[Cn.N,Sv.u,Ud.h],styles:["[_nghost-%COMP%]{bottom:10px;max-width:90vw;position:fixed;right:-350px;top:53px;transition:all .6s;width:350px;z-index:9}.active[_nghost-%COMP%]{right:20px}.card[_ngcontent-%COMP%]{height:100%}.card-body[_ngcontent-%COMP%]{padding-left:0;padding-right:5px;padding-top:3px}ngx-simplebar[_ngcontent-%COMP%]{height:calc(100% - 42.2px)}.separator[_ngcontent-%COMP%]{background-color:#e9ecef;color:#6c757d;font-size:1rem;padding:5px 12px}.btn-block[_ngcontent-%COMP%]{width:98%}.btn-link[_ngcontent-%COMP%]   .fa-trash-o[_ngcontent-%COMP%]{color:#000}table[_ngcontent-%COMP%]{width:100%}.row[_ngcontent-%COMP%]{margin-left:0;margin-right:0;padding-bottom:1rem;padding-top:1rem}hr[_ngcontent-%COMP%]{margin-bottom:2px;margin-top:2px}"],changeDetection:0}),n})();function rT(n,s){1&n&&e._UZ(0,"span",5)}const iT=function(n){return{running:n}},oT=function(n){return[n]};let sT=(()=>{class n{constructor(t,o){this.notificationService=t,this.summaryService=o,this.icons=No.P,this.hasRunningTasks=!1,this.hasNotifications=!1,this.subs=new fc.w}ngOnInit(){this.subs.add(this.summaryService.subscribe(t=>{this.hasRunningTasks=t.executing_tasks.length>0})),this.subs.add(this.notificationService.data$.subscribe(t=>{this.hasNotifications=t.length>0}))}ngOnDestroy(){this.subs.unsubscribe()}toggleSidebar(){this.notificationService.toggleSidebar()}}return n.\u0275fac=function(t){return new(t||n)(e.Y36(Sl.g),e.Y36(zm.J))},n.\u0275cmp=e.Xpm({type:n,selectors:[["cd-notifications"]],decls:5,vars:7,consts:function(){let s,t;return s="Tasks and Notifications",t="Tasks and Notifications",[["title",s,3,"ngClass","click"],[3,"ngClass"],["class","dot",4,"ngIf"],[1,"d-md-none"],t,[1,"dot"]]},template:function(t,o){1&t&&(e.TgZ(0,"a",0),e.NdJ("click",function(){return o.toggleSidebar()}),e._UZ(1,"i",1),e.YNc(2,rT,1,0,"span",2),e.TgZ(3,"span",3),e.SDv(4,4),e.qZA()()),2&t&&(e.Q6J("ngClass",e.VKq(3,iT,o.hasRunningTasks)),e.xp6(1),e.Q6J("ngClass",e.VKq(5,oT,o.icons.bell)),e.xp6(1),e.Q6J("ngIf",o.hasNotifications))},directives:[p.mk,p.O5],styles:[".running[_ngcontent-%COMP%]   i[_ngcontent-%COMP%]{color:#25828e}.running[_ngcontent-%COMP%]:hover   i[_ngcontent-%COMP%]{color:#fff}a[_ngcontent-%COMP%]   .dot[_ngcontent-%COMP%]{background-color:#2b99a8;border:2px solid #374249;border-radius:50%;height:11px;position:absolute;right:17px;top:10px;width:10px}a[_ngcontent-%COMP%]:hover   .dot[_ngcontent-%COMP%]{background-color:#fff;border-color:#2b99a8}"]}),n})(),N2=(()=>{class n{constructor(t){this.http=t,this.baseUIURL="api/feedback"}isKeyExist(){return this.http.get("ui-api/feedback/api_key/exist")}createIssue(t,o,l,_,M){return this.http.post("api/feedback",{project:t,tracker:o,subject:l,description:_,api_key:M},{headers:{Accept:"application/vnd.ceph.api.v0.1+json"}})}}return n.\u0275fac=function(t){return new(t||n)(e.LFG(y.eN))},n.\u0275prov=e.Yz7({token:n,factory:n.\u0275fac,providedIn:"root"}),n})();function aT(n,s){if(1&n){const t=e.EpF();e.TgZ(0,"cd-alert-panel",30),e.tHW(1,31),e.TgZ(2,"a",32),e.NdJ("click",function(){return e.CHM(t),e.oxw().redirect()}),e.qZA(),e.N_p(),e.qZA()}}function lT(n,s){1&n&&(e.TgZ(0,"span",37),e.SDv(1,38),e.qZA())}function P2(n,s){1&n&&(e.TgZ(0,"span",37),e.SDv(1,39),e.qZA())}function uT(n,s){if(1&n&&(e.TgZ(0,"div",33)(1,"label",34),e.SDv(2,35),e.qZA(),e.TgZ(3,"div",12),e._UZ(4,"input",36),e.YNc(5,lT,2,0,"span",17),e.YNc(6,P2,2,0,"span",17),e.qZA()()),2&n){const t=e.oxw(),o=e.MAs(5);e.xp6(5),e.Q6J("ngIf",t.feedbackForm.showError("api_key",o,"required")),e.xp6(1),e.Q6J("ngIf",t.feedbackForm.showError("api_key",o,"invalidApiKey"))}}function cT(n,s){if(1&n&&(e.TgZ(0,"option",40),e._uU(1),e.qZA()),2&n){const t=s.$implicit;e.Q6J("value",t),e.xp6(1),e.Oqu(t)}}function Np(n,s){1&n&&(e.TgZ(0,"span",37),e.SDv(1,41),e.qZA())}function Vm(n,s){if(1&n&&(e.TgZ(0,"option",40),e._uU(1),e.qZA()),2&n){const t=s.$implicit;e.Q6J("value",t),e.xp6(1),e.Oqu(t)}}function I2(n,s){1&n&&(e.TgZ(0,"span",37),e.SDv(1,42),e.qZA())}function L2(n,s){1&n&&(e.TgZ(0,"span",37),e.SDv(1,43),e.qZA())}function uD(n,s){1&n&&(e.TgZ(0,"span",37),e.SDv(1,44),e.qZA())}let kv=(()=>{class n{constructor(t,o,l,_,M,w){this.feedbackService=t,this.activeModal=o,this.actionLabels=l,this.secondaryModal=_,this.notificationService=M,this.router=w,this.title="Feedback",this.project=["dashboard","block","objects","file_system","ceph_manager","orchestrator","ceph_volume","core_ceph"],this.tracker=["bug","feature"],this.isAPIKeySet=!1,this.isFeedbackEnabled=!0}ngOnInit(){this.createForm(),this.keySub=this.feedbackService.isKeyExist().subscribe({next:t=>{this.isAPIKeySet=t,this.isAPIKeySet&&this.feedbackForm.get("api_key").clearValidators()},error:()=>{this.isFeedbackEnabled=!1,this.feedbackForm.disable()}})}createForm(){this.feedbackForm=new tc.d({project:new _n.NI("",_n.kI.required),tracker:new _n.NI("",_n.kI.required),subject:new _n.NI("",_n.kI.required),description:new _n.NI("",_n.kI.required),api_key:new _n.NI("",_n.kI.required)})}ngOnDestroy(){this.keySub.unsubscribe()}onSubmit(){this.feedbackService.createIssue(this.feedbackForm.controls.project.value,this.feedbackForm.controls.tracker.value,this.feedbackForm.controls.subject.value,this.feedbackForm.controls.description.value,this.feedbackForm.controls.api_key.value).subscribe({next:t=>{this.notificationService.show(Sa.k.success,"Issue successfully created on Ceph Issue tracker",`Go to the tracker: <a href="https://tracker.ceph.com/issues/${t.message.issue.id}" target="_blank"> ${t.message.issue.id} </a>`)},error:()=>{this.feedbackForm.get("api_key").setErrors({invalidApiKey:!0}),this.feedbackForm.setErrors({cdSubmitButton:!0})},complete:()=>{this.activeModal.close()}})}redirect(){this.activeModal.close(),this.router.navigate(["/mgr-modules"])}}return n.\u0275fac=function(t){return new(t||n)(e.Y36(N2),e.Y36(Dr.Kz),e.Y36(Mo.p4),e.Y36(Dr.FF),e.Y36(Sl.g),e.Y36(Bo.F0))},n.\u0275cmp=e.Xpm({type:n,selectors:[["cd-feedback"]],decls:42,vars:12,consts:function(){let s,t,o,l,_,M,w,N,V,X,re,oe,fe,ve,Pe;return s="Report an issue",t="Project name",o="-- Select a project --",l="Tracker",_="-- Select a tracker --",M="Subject",w="Description",N="Feedback module is not enabled. Please enable it from " + "\ufffd#2\ufffd" + "Cluster-> Manager Modules." + "\ufffd/#2\ufffd" + "",V="Ceph Tracker API Key",X="Ceph Tracker API key is required.",re="Ceph Tracker API key is invalid.",oe="Project name is required.",fe="Tracker name is required.",ve="Subject is required.",Pe="Description is required.",[[3,"modalRef"],[1,"modal-title"],s,[1,"modal-content"],["name","feedbackForm",3,"formGroup"],["formDir","ngForm"],[1,"modal-body"],["type","error",4,"ngIf"],["class","form-group row mt-3",4,"ngIf"],[1,"form-group","row"],["for","project",1,"cd-col-form-label","required"],t,[1,"cd-col-form-input"],["id","project","formControlName","project",1,"form-control"],["ngValue",""],o,[3,"value",4,"ngFor","ngForOf"],["class","invalid-feedback",4,"ngIf"],["for","tracker",1,"cd-col-form-label","required"],l,["id","tracker","formControlName","tracker",1,"form-control"],_,["for","subject",1,"cd-col-form-label","required"],M,["id","subject","type","text","formControlName","subject","placeholder","Add issue title",1,"form-control"],["for","description",1,"cd-col-form-label","required"],w,["id","description","type","text","formControlName","description","placeholder","Add issue description",1,"form-control"],[1,"modal-footer"],["wrappingClass","text-right",3,"form","submitText","submitActionEvent"],["type","error"],N,[3,"click"],[1,"form-group","row","mt-3"],["for","api_key",1,"cd-col-form-label","required"],V,["id","api_key","type","password","formControlName","api_key","placeholder","Add Ceph tracker API key",1,"form-control"],[1,"invalid-feedback"],X,re,[3,"value"],oe,fe,ve,Pe]},template:function(t,o){if(1&t&&(e.TgZ(0,"cd-modal",0)(1,"div",1),e.SDv(2,2),e.qZA(),e.TgZ(3,"div",3)(4,"form",4,5)(6,"div",6),e.YNc(7,aT,3,0,"cd-alert-panel",7),e.YNc(8,uT,7,2,"div",8),e.TgZ(9,"div",9)(10,"label",10),e.SDv(11,11),e.qZA(),e.TgZ(12,"div",12)(13,"select",13)(14,"option",14),e.SDv(15,15),e.qZA(),e.YNc(16,cT,2,2,"option",16),e.qZA(),e.YNc(17,Np,2,0,"span",17),e.qZA()(),e.TgZ(18,"div",9)(19,"label",18),e.SDv(20,19),e.qZA(),e.TgZ(21,"div",12)(22,"select",20)(23,"option",14),e.SDv(24,21),e.qZA(),e.YNc(25,Vm,2,2,"option",16),e.qZA(),e.YNc(26,I2,2,0,"span",17),e.qZA()(),e.TgZ(27,"div",9)(28,"label",22),e.SDv(29,23),e.qZA(),e.TgZ(30,"div",12),e._UZ(31,"input",24),e.YNc(32,L2,2,0,"span",17),e.qZA()(),e.TgZ(33,"div",9)(34,"label",25),e.SDv(35,26),e.qZA(),e.TgZ(36,"div",12)(37,"textarea",27),e._uU(38,"            "),e.qZA(),e.YNc(39,uD,2,0,"span",17),e.qZA()()(),e.TgZ(40,"div",28)(41,"cd-form-button-panel",29),e.NdJ("submitActionEvent",function(){return o.onSubmit()}),e.qZA()()()()()),2&t){const l=e.MAs(5);e.Q6J("modalRef",o.activeModal),e.xp6(4),e.Q6J("formGroup",o.feedbackForm),e.xp6(3),e.Q6J("ngIf",!o.isFeedbackEnabled),e.xp6(1),e.Q6J("ngIf",!o.isAPIKeySet),e.xp6(8),e.Q6J("ngForOf",o.project),e.xp6(1),e.Q6J("ngIf",o.feedbackForm.showError("project",l,"required")),e.xp6(8),e.Q6J("ngForOf",o.tracker),e.xp6(1),e.Q6J("ngIf",o.feedbackForm.showError("tracker",l,"required")),e.xp6(6),e.Q6J("ngIf",o.feedbackForm.showError("subject",l,"required")),e.xp6(7),e.Q6J("ngIf",o.feedbackForm.showError("description",l,"required")),e.xp6(2),e.Q6J("form",o.feedbackForm)("submitText",o.actionLabels.SUBMIT)}},directives:[Fe.z,_n._Y,_n.JL,Ma.V,_n.sg,p.O5,Eo.G,al.P,_e.o,_n.Fj,Il.b,_n.JJ,_n.u,_n.EJ,_n.YN,_n.Kr,p.sg,Cl.p],styles:[""]}),n})();var F2=i(97057);let oE=(()=>{class n{constructor(t,o,l,_){this.activeModal=t,this.summaryService=o,this.userService=l,this.authStorageService=_,this.userPermission=this.authStorageService.getPermissions().user}ngOnInit(){this.projectConstants=Mo.$x,this.hostAddr=window.location.hostname,this.modalVariables=this.setVariables(),this.subs=this.summaryService.subscribe(t=>{const o=t.version.replace("ceph version ","").split(" ");this.hostAddr=t.mgr_host.replace(/(^\w+:|^)\/\//,"").replace(/\/$/,""),this.versionNumber=o[0],this.versionHash=o[1],this.versionName=o.slice(2,o.length).join(" ")})}ngOnDestroy(){this.subs.unsubscribe()}setVariables(){const t={};t.user=localStorage.getItem("dashboard_username"),t.role="user",this.userPermission.read&&this.userService.get(t.user).subscribe(l=>{t.role=l.roles});const o=(0,F2.qY)();return t.browserName=o&&o.name?o.name:"Not detected",t.browserVersion=o&&o.version?o.version:"Not detected",t.browserOS=o&&o.os?o.os:"Not detected",t}}return n.\u0275fac=function(t){return new(t||n)(e.Y36(Dr.Kz),e.Y36(zm.J),e.Y36(xS.K),e.Y36(zi.j))},n.\u0275cmp=e.Xpm({type:n,selectors:[["cd-about"]],decls:44,vars:13,consts:[[1,"about-container"],[1,"modal-header"],["type","button","aria-label","Close",1,"btn-close","float-end",3,"click"],[1,"modal-body"],["src","assets/Ceph_Ceph_Logo_with_text_red_white.svg",1,"ceph-logo",3,"alt"],[1,"product-versions"],[1,"modal-footer"],[1,"text-left"]],template:function(t,o){1&t&&(e.TgZ(0,"div",0)(1,"div",1)(2,"button",2),e.NdJ("click",function(){return o.activeModal.close()}),e.qZA()(),e.TgZ(3,"div",3),e._UZ(4,"img",4),e.TgZ(5,"h3")(6,"strong"),e._uU(7),e.qZA()(),e.TgZ(8,"div",5)(9,"strong"),e._uU(10,"Version"),e.qZA(),e._UZ(11,"br"),e._uU(12),e._UZ(13,"br"),e._uU(14),e.qZA(),e._UZ(15,"br"),e.TgZ(16,"dl")(17,"dt"),e._uU(18,"Ceph Manager"),e.qZA(),e.TgZ(19,"dd"),e._uU(20),e.qZA(),e.TgZ(21,"dt"),e._uU(22,"User"),e.qZA(),e.TgZ(23,"dd"),e._uU(24),e.qZA(),e.TgZ(25,"dt"),e._uU(26,"User Role"),e.qZA(),e.TgZ(27,"dd"),e._uU(28),e.qZA(),e.TgZ(29,"dt"),e._uU(30,"Browser"),e.qZA(),e.TgZ(31,"dd"),e._uU(32),e.qZA(),e.TgZ(33,"dt"),e._uU(34,"Browser Version"),e.qZA(),e.TgZ(35,"dd"),e._uU(36),e.qZA(),e.TgZ(37,"dt"),e._uU(38,"Browser OS"),e.qZA(),e.TgZ(39,"dd"),e._uU(40),e.qZA()()(),e.TgZ(41,"div",6)(42,"div",7),e._uU(43),e.qZA()()()),2&t&&(e.xp6(4),e.s9C("alt",o.projectConstants.organization),e.xp6(3),e.Oqu(o.projectConstants.projectName),e.xp6(5),e.AsE(" ",o.versionNumber," ",o.versionHash," "),e.xp6(2),e.hij(" ",o.versionName," "),e.xp6(6),e.Oqu(o.hostAddr),e.xp6(4),e.Oqu(o.modalVariables.user),e.xp6(4),e.Oqu(o.modalVariables.role),e.xp6(4),e.Oqu(o.modalVariables.browserName),e.xp6(4),e.Oqu(o.modalVariables.browserVersion),e.xp6(4),e.Oqu(o.modalVariables.browserOS),e.xp6(3),e.AsE(" ",o.projectConstants.copyright," ",o.projectConstants.license," "))},directives:[_e.o],styles:[".about-container[_ngcontent-%COMP%]{background-color:#374249;background-image:url(ceph_background.3fbdf95cd52530d7.gif);background-position:right bottom;background-repeat:no-repeat;color:#fff;text-shadow:1px 1px #374249}.product-versions[_ngcontent-%COMP%]{margin-top:30px}.product-versions[_ngcontent-%COMP%]   strong[_ngcontent-%COMP%]{margin-right:10px}.modal-header[_ngcontent-%COMP%]{border-bottom:0}.modal-header[_ngcontent-%COMP%]   .close[_ngcontent-%COMP%]{color:#fff;font-size:2em}.modal-body[_ngcontent-%COMP%]{padding-left:80px;padding-right:80px}.ceph-logo[_ngcontent-%COMP%]{margin-bottom:30px;width:25%}.modal-footer[_ngcontent-%COMP%]{border-top:0;display:block;padding:15px 80px 35px}"]}),n})();const k2=function(n){return[n]},dT=function(n){return{disabled:n}};let $2=(()=>{class n{constructor(t,o){this.modalService=t,this.docService=o,this.icons=No.P}ngOnInit(){this.docService.subscribeOnce("dashboard",t=>{this.docsUrl=t})}openAboutModal(){this.modalRef=this.modalService.show(oE,null,{size:"lg"})}openFeedbackModal(){this.bsModalRef=this.modalService.show(kv,null,{size:"lg"})}}return n.\u0275fac=function(t){return new(t||n)(e.Y36(ru.Z),e.Y36(n0.R))},n.\u0275cmp=e.Xpm({type:n,selectors:[["cd-dashboard-help"]],decls:14,vars:7,consts:function(){let s,t,o,l,_,M;return s="Help",t="Help",o="documentation",l="API",_="About",M="Report an issue...",[["ngbDropdown","","placement","bottom-right"],["ngbDropdownToggle","","title",s,"role","button"],[3,"ngClass"],[1,"d-md-none"],t,["ngbDropdownMenu",""],["ngbDropdownItem","","target","_blank",1,"text-capitalize",3,"ngClass","href"],o,["ngbDropdownItem","","routerLink","/api-docs","target","_blank"],l,["ngbDropdownItem","",3,"click"],_,M]},template:function(t,o){1&t&&(e.TgZ(0,"div",0)(1,"a",1),e._UZ(2,"i",2),e.TgZ(3,"span",3),e.SDv(4,4),e.qZA()(),e.TgZ(5,"div",5)(6,"a",6),e.SDv(7,7),e.qZA(),e.TgZ(8,"button",8),e.SDv(9,9),e.qZA(),e.TgZ(10,"button",10),e.NdJ("click",function(){return o.openAboutModal()}),e.SDv(11,11),e.qZA(),e.TgZ(12,"button",10),e.NdJ("click",function(){return o.openFeedbackModal()}),e.SDv(13,12),e.qZA()()()),2&t&&(e.xp6(2),e.Q6J("ngClass",e.VKq(3,k2,o.icons.questionCircle)),e.xp6(4),e.s9C("href",o.docsUrl,e.LSH),e.Q6J("ngClass",e.VKq(5,dT,!o.docsUrl)))},directives:[Dr.jt,Dr.iD,p.mk,Dr.Vi,Dr.TH,_e.o,Bo.rH],styles:[""]}),n})();function H2(n,s){1&n&&(e.TgZ(0,"button",9),e.SDv(1,10),e.qZA())}function sE(n,s){1&n&&(e.TgZ(0,"button",11),e.SDv(1,12),e.qZA())}const fT=function(n){return[n]};function pT(n,s){if(1&n&&(e.TgZ(0,"div",1)(1,"a",2),e._UZ(2,"i",3),e.TgZ(3,"span",4),e.SDv(4,5),e.qZA()(),e.TgZ(5,"div",6),e.YNc(6,H2,2,0,"button",7),e.YNc(7,sE,2,0,"button",8),e.qZA()()),2&n){const t=e.oxw();e.xp6(2),e.Q6J("ngClass",e.VKq(3,fT,t.icons.deepCheck)),e.xp6(4),e.Q6J("ngIf",t.userPermission.read),e.xp6(1),e.Q6J("ngIf",t.configOptPermission.read)}}let l0=(()=>{class n{constructor(t){this.authStorageService=t,this.icons=No.P;const o=this.authStorageService.getPermissions();this.userPermission=o.user,this.configOptPermission=o.configOpt}}return n.\u0275fac=function(t){return new(t||n)(e.Y36(zi.j))},n.\u0275cmp=e.Xpm({type:n,selectors:[["cd-administration"]],decls:1,vars:1,consts:function(){let s,t,o,l;return s="Dashboard Settings",t="Dashboard Settings",o="User management",l="Telemetry configuration",[["ngbDropdown","","placement","bottom-right",4,"ngIf"],["ngbDropdown","","placement","bottom-right"],["ngbDropdownToggle","","title",s,"role","button",1,"dropdown-toggle"],[3,"ngClass"],[1,"d-md-none"],t,["ngbDropdownMenu",""],["ngbDropdownItem","","routerLink","/user-management",4,"ngIf"],["ngbDropdownItem","","routerLink","/telemetry",4,"ngIf"],["ngbDropdownItem","","routerLink","/user-management"],o,["ngbDropdownItem","","routerLink","/telemetry"],l]},template:function(t,o){1&t&&e.YNc(0,pT,8,5,"div",0),2&t&&e.Q6J("ngIf",o.userPermission.read)},directives:[p.O5,Dr.jt,Dr.iD,p.mk,Dr.Vi,_e.o,Dr.TH,Bo.rH],styles:[""]}),n})();const $v=function(n){return[n]};function cD(n,s){if(1&n&&(e.TgZ(0,"button",12),e._UZ(1,"i",2),e.TgZ(2,"span"),e.SDv(3,13),e.qZA()()),2&n){const t=e.oxw();e.xp6(1),e.Q6J("ngClass",e.VKq(1,$v,t.icons.lock))}}let hT=(()=>{class n{constructor(t,o){this.authStorageService=t,this.authService=o,this.icons=No.P}ngOnInit(){this.username=this.authStorageService.getUsername(),this.sso=this.authStorageService.isSSO()}logout(){this.authService.logout()}}return n.\u0275fac=function(t){return new(t||n)(e.Y36(zi.j),e.Y36(jy.e))},n.\u0275cmp=e.Xpm({type:n,selectors:[["cd-identity"]],decls:15,vars:8,consts:function(){let s,t,o,l,_;return s="Logged in user",t="Logged in user",o="Signed in as " + "\ufffd#8\ufffd" + "" + "\ufffd0\ufffd" + "" + "\ufffd/#8\ufffd" + "",l="Sign out",_="Change password",[["ngbDropdown","","placement","bottom-right"],["ngbDropdownToggle","","title",s,"role","button"],[3,"ngClass"],[1,"d-md-none"],t,["ngbDropdownMenu",""],["ngbDropdownItem","","disabled",""],o,[1,"dropdown-divider"],["ngbDropdownItem","","routerLink","/user-profile/edit",4,"ngIf"],["ngbDropdownItem","",3,"click"],l,["ngbDropdownItem","","routerLink","/user-profile/edit"],_]},template:function(t,o){1&t&&(e.TgZ(0,"div",0)(1,"a",1),e._UZ(2,"i",2),e.TgZ(3,"span",3),e.SDv(4,4),e.qZA()(),e.TgZ(5,"div",5)(6,"button",6),e.tHW(7,7),e._UZ(8,"strong"),e.N_p(),e.qZA(),e._UZ(9,"hr",8),e.YNc(10,cD,4,3,"button",9),e.TgZ(11,"button",10),e.NdJ("click",function(){return o.logout()}),e._UZ(12,"i",2),e.TgZ(13,"span"),e.SDv(14,11),e.qZA()()()()),2&t&&(e.xp6(2),e.Q6J("ngClass",e.VKq(4,$v,o.icons.user)),e.xp6(6),e.pQV(o.username),e.QtT(7),e.xp6(2),e.Q6J("ngIf",!o.sso),e.xp6(2),e.Q6J("ngClass",e.VKq(6,$v,o.icons.signOut)))},directives:[Dr.jt,Dr.iD,p.mk,Dr.Vi,_e.o,Dr.TH,p.O5,Bo.rH],styles:[""]}),n})();function B2(n,s){1&n&&e.GkF(0)}function _T(n,s){1&n&&e.GkF(0)}function u0(n,s){if(1&n){const t=e.EpF();e.TgZ(0,"li",22),e._UZ(1,"cd-language-selector",23),e.qZA(),e.TgZ(2,"li",22)(3,"cd-notifications",24),e.NdJ("click",function(){return e.CHM(t),e.oxw().toggleRightSidebar()}),e.qZA()(),e.TgZ(4,"li",22),e._UZ(5,"cd-dashboard-help",23),e.qZA(),e.TgZ(6,"li",22),e._UZ(7,"cd-administration",23),e.qZA(),e.TgZ(8,"li",22),e._UZ(9,"cd-identity",23),e.qZA()}}function gT(n,s){1&n&&(e.TgZ(0,"li",50)(1,"a",51),e.SDv(2,52),e.qZA()())}function U2(n,s){1&n&&(e.TgZ(0,"li",53)(1,"a",54),e.SDv(2,55),e.qZA()())}function aE(n,s){1&n&&(e.TgZ(0,"li",56)(1,"a",57),e.SDv(2,58),e.qZA()())}function lE(n,s){1&n&&(e.TgZ(0,"li",59)(1,"a",60),e.SDv(2,61),e.qZA()())}function dD(n,s){1&n&&(e.TgZ(0,"li",62)(1,"a",63),e.SDv(2,64),e.qZA()())}function Y2(n,s){1&n&&(e.TgZ(0,"li",65)(1,"a",66),e.SDv(2,67),e.qZA()())}function j2(n,s){1&n&&(e.TgZ(0,"li",68)(1,"a",69),e.SDv(2,70),e.qZA()())}function mT(n,s){1&n&&(e.TgZ(0,"li",71)(1,"a",72),e.SDv(2,73),e.qZA()())}function vT(n,s){1&n&&(e.TgZ(0,"li",74)(1,"a",75),e.SDv(2,76),e.qZA()())}function G2(n,s){if(1&n&&(e.TgZ(0,"small",82),e._uU(1),e.qZA()),2&n){const t=e.oxw(5);e.xp6(1),e.Oqu(t.prometheusAlertService.activeCriticalAlerts)}}function yT(n,s){if(1&n&&(e.TgZ(0,"small",83),e._uU(1),e.qZA()),2&n){const t=e.oxw(5);e.xp6(1),e.Oqu(t.prometheusAlertService.activeWarningAlerts)}}function ET(n,s){if(1&n&&(e.TgZ(0,"li",77)(1,"a",78),e.ynx(2),e.SDv(3,79),e.BQk(),e.YNc(4,G2,2,1,"small",80),e.YNc(5,yT,2,1,"small",81),e.qZA()()),2&n){const t=e.oxw(4);e.xp6(4),e.Q6J("ngIf",t.prometheusAlertService.activeCriticalAlerts>0),e.xp6(1),e.Q6J("ngIf",t.prometheusAlertService.activeWarningAlerts>0)}}function z2(n,s){if(1&n){const t=e.EpF();e.TgZ(0,"li",36)(1,"a",37),e.NdJ("click",function(){return e.CHM(t),e.oxw(3).toggleSubMenu("cluster")}),e.ynx(2),e.SDv(3,38),e.BQk(),e.qZA(),e.TgZ(4,"ul",39),e.YNc(5,gT,3,0,"li",40),e.YNc(6,U2,3,0,"li",41),e.YNc(7,aE,3,0,"li",42),e.YNc(8,lE,3,0,"li",43),e.YNc(9,dD,3,0,"li",44),e.YNc(10,Y2,3,0,"li",45),e.YNc(11,j2,3,0,"li",46),e.YNc(12,mT,3,0,"li",47),e.YNc(13,vT,3,0,"li",48),e.YNc(14,ET,6,2,"li",49),e.qZA()()}if(2&n){const t=e.oxw(3);e.xp6(1),e.uIk("aria-expanded","cluster"===t.displayedSubMenu),e.xp6(3),e.Q6J("ngbCollapse","cluster"!==t.displayedSubMenu),e.xp6(1),e.Q6J("ngIf",t.permissions.hosts.read),e.xp6(1),e.Q6J("ngIf",t.permissions.hosts.read),e.xp6(1),e.Q6J("ngIf",t.permissions.monitor.read),e.xp6(1),e.Q6J("ngIf",t.permissions.hosts.read),e.xp6(1),e.Q6J("ngIf",t.permissions.osd.read),e.xp6(1),e.Q6J("ngIf",t.permissions.configOpt.read),e.xp6(1),e.Q6J("ngIf",t.permissions.osd.read),e.xp6(1),e.Q6J("ngIf",t.permissions.configOpt.read),e.xp6(1),e.Q6J("ngIf",t.permissions.log.read),e.xp6(1),e.Q6J("ngIf",t.permissions.prometheus.read)}}function V2(n,s){1&n&&(e.TgZ(0,"li",84)(1,"a",85),e.SDv(2,86),e.qZA()())}function bT(n,s){1&n&&(e.TgZ(0,"li",94)(1,"a",95),e.SDv(2,96),e.qZA()())}function Z2(n,s){if(1&n&&(e.TgZ(0,"small",102),e._uU(1),e.qZA()),2&n){const t=e.oxw(5);e.xp6(1),e.Oqu(null==t.summaryData||null==t.summaryData.rbd_mirroring?null:t.summaryData.rbd_mirroring.warnings)}}function ST(n,s){if(1&n&&(e.TgZ(0,"small",103),e._uU(1),e.qZA()),2&n){const t=e.oxw(5);e.xp6(1),e.Oqu(null==t.summaryData||null==t.summaryData.rbd_mirroring?null:t.summaryData.rbd_mirroring.errors)}}function TT(n,s){if(1&n&&(e.TgZ(0,"li",97)(1,"a",98),e.ynx(2),e.SDv(3,99),e.BQk(),e.YNc(4,Z2,2,1,"small",100),e.YNc(5,ST,2,1,"small",101),e.qZA()()),2&n){const t=e.oxw(4);e.xp6(4),e.Q6J("ngIf",0!==(null==t.summaryData||null==t.summaryData.rbd_mirroring?null:t.summaryData.rbd_mirroring.warnings)),e.xp6(1),e.Q6J("ngIf",0!==(null==t.summaryData||null==t.summaryData.rbd_mirroring?null:t.summaryData.rbd_mirroring.errors))}}function CT(n,s){1&n&&(e.TgZ(0,"li",104)(1,"a",105),e.SDv(2,106),e.qZA()())}function MT(n,s){if(1&n){const t=e.EpF();e.TgZ(0,"li",87)(1,"a",88),e.NdJ("click",function(){return e.CHM(t),e.oxw(3).toggleSubMenu("block")}),e.ynx(2),e.SDv(3,89),e.BQk(),e.qZA(),e.TgZ(4,"ul",90),e.YNc(5,bT,3,0,"li",91),e.YNc(6,TT,6,2,"li",92),e.YNc(7,CT,3,0,"li",93),e.qZA()()}if(2&n){const t=e.oxw().ngIf,o=e.oxw(2);e.xp6(1),e.Q6J("ngStyle",o.blockHealthColor()),e.uIk("aria-expanded","block"===o.displayedSubMenu),e.xp6(3),e.Q6J("ngbCollapse","block"!==o.displayedSubMenu),e.xp6(1),e.Q6J("ngIf",o.permissions.rbdImage.read&&t.rbd),e.xp6(1),e.Q6J("ngIf",o.permissions.rbdMirroring.read&&t.mirroring),e.xp6(1),e.Q6J("ngIf",o.permissions.iscsi.read&&t.iscsi)}}function W2(n,s){1&n&&(e.TgZ(0,"li",107)(1,"a",108),e.SDv(2,109),e.qZA()())}function J2(n,s){1&n&&(e.TgZ(0,"li",110)(1,"a",111),e.SDv(2,112),e.qZA()())}function fD(n,s){if(1&n){const t=e.EpF();e.TgZ(0,"li",113)(1,"a",114),e.NdJ("click",function(){return e.CHM(t),e.oxw(3).toggleSubMenu("rgw")}),e.ynx(2),e.SDv(3,115),e.BQk(),e.qZA(),e.TgZ(4,"ul",116)(5,"li",117)(6,"a",118),e.SDv(7,119),e.qZA()(),e.TgZ(8,"li",120)(9,"a",121),e.SDv(10,122),e.qZA()(),e.TgZ(11,"li",123)(12,"a",124),e.SDv(13,125),e.qZA()()()()}if(2&n){const t=e.oxw(3);e.xp6(1),e.uIk("aria-expanded","rgw"===t.displayedSubMenu),e.xp6(3),e.Q6J("ngbCollapse","rgw"!==t.displayedSubMenu)}}const OT=function(n){return[n]};function pD(n,s){if(1&n&&(e.ynx(0),e.TgZ(1,"li",26)(2,"a",27)(3,"span"),e.SDv(4,28),e.qZA(),e._uU(5,"\xa0 "),e._UZ(6,"i",29),e.ALo(7,"healthColor"),e.qZA()(),e.YNc(8,z2,15,12,"li",30),e.YNc(9,V2,3,0,"li",31),e.YNc(10,MT,8,6,"li",32),e.YNc(11,W2,3,0,"li",33),e.YNc(12,J2,3,0,"li",34),e.YNc(13,fD,14,2,"li",35),e.BQk()),2&n){const t=s.ngIf,o=e.oxw(2);e.xp6(6),e.Q6J("ngClass",e.VKq(10,OT,o.icons.health))("ngStyle",e.lcZ(7,8,null==o.summaryData?null:o.summaryData.health_status)),e.xp6(2),e.Q6J("ngIf",o.permissions.hosts.read||o.permissions.monitor.read||o.permissions.osd.read||o.permissions.configOpt.read||o.permissions.log.read||o.permissions.prometheus.read),e.xp6(1),e.Q6J("ngIf",o.permissions.pool.read),e.xp6(1),e.Q6J("ngIf",(o.permissions.rbdImage.read||o.permissions.rbdMirroring.read||o.permissions.iscsi.read)&&(t.rbd||t.mirroring||t.iscsi)),e.xp6(1),e.Q6J("ngIf",o.permissions.nfs.read&&t.nfs),e.xp6(1),e.Q6J("ngIf",o.permissions.cephfs.read&&t.cephfs),e.xp6(1),e.Q6J("ngIf",o.permissions.rgw.read&&t.rgw)}}function hD(n,s){if(1&n&&(e.YNc(0,pD,14,12,"ng-container",25),e.ALo(1,"async")),2&n){const t=e.oxw();e.Q6J("ngIf",e.lcZ(1,1,t.enabledFeature$))}}const _D=function(n){return{show:n}},AT=function(n){return{active:n}},Q2=["*"];let gD=(()=>{class n{constructor(t,o,l,_,M,w){this.authStorageService=t,this.summaryService=o,this.featureToggles=l,this.telemetryNotificationService=_,this.prometheusAlertService=M,this.motdNotificationService=w,this.notifications=[],this.icons=No.P,this.rightSidebarOpen=!1,this.showMenuSidebar=!0,this.displayedSubMenu="",this.simplebar={autoHide:!1},this.subs=new fc.w,this.permissions=this.authStorageService.getPermissions(),this.enabledFeature$=this.featureToggles.get()}get class(){return"top-notification-"+this.notifications.length}ngOnInit(){this.subs.add(this.summaryService.subscribe(t=>{this.summaryData=t})),this.subs.add(this.authStorageService.isPwdDisplayed$.subscribe(t=>{this.showTopNotification("isPwdDisplayed",t)})),this.subs.add(this.telemetryNotificationService.update.subscribe(t=>{this.showTopNotification("telemetryNotificationEnabled",t)})),this.subs.add(this.motdNotificationService.motd$.subscribe(t=>{this.showTopNotification("motdNotificationEnabled",cu.isPlainObject(t))}))}ngOnDestroy(){this.subs.unsubscribe()}blockHealthColor(){if(this.summaryData&&this.summaryData.rbd_mirroring){if(this.summaryData.rbd_mirroring.errors>0)return{color:"#f4926c"};if(this.summaryData.rbd_mirroring.warnings>0)return{color:"#f0ad4e"}}}toggleSubMenu(t){this.displayedSubMenu=this.displayedSubMenu===t?"":t}toggleRightSidebar(){this.rightSidebarOpen=!this.rightSidebarOpen}showTopNotification(t,o){if(o)this.notifications.includes(t)||this.notifications.push(t);else{const l=this.notifications.indexOf(t);l>=0&&this.notifications.splice(l,1)}}}return n.\u0275fac=function(t){return new(t||n)(e.Y36(zi.j),e.Y36(zm.J),e.Y36(W1.l),e.Y36(Oy),e.Y36(am),e.Y36(Qy))},n.\u0275cmp=e.Xpm({type:n,selectors:[["cd-navigation"]],hostVars:2,hostBindings:function(t,o){2&t&&e.Tol(o.class)},ngContentSelectors:Q2,decls:30,vars:12,consts:function(){let s,t,o,l,_,M,w,N,V,X,re,oe,fe,ve,Pe,De,Ie,Ae,Y,Et,ft,xt,Ht,yn;return s="Toggle navigation",t="Dashboard",o="Cluster",l="Hosts",_="Physical Disks",M="Monitors",w="Services",N="OSDs",V="Configuration",X="CRUSH map",re="Manager Modules",oe="Logs",fe="Monitoring",ve="Pools",Pe="Block",De="Images",Ie="Mirroring",Ae="iSCSI",Y="NFS",Et="File Systems",ft="Object Gateway",xt="Daemons",Ht="Users",yn="Buckets",[[1,"cd-navbar-main"],[1,"cd-navbar-top"],[1,"navbar","navbar-expand-md","navbar-dark","cd-navbar-brand"],["aria-label","toggle sidebar visibility",1,"btn","btn-link","py-0","ms-3",3,"click"],["aria-hidden","true",1,"fa","fa-bars","fa-2x"],["href","#",1,"navbar-brand","ms-2"],["src","assets/Ceph_Ceph_Logo_with_text_white.svg","alt","Ceph"],["type","button",1,"navbar-toggler",3,"click"],[1,"sr-only"],s,[1,""],[1,"fa","fa-navicon","fa-lg"],[1,"collapse","navbar-collapse",3,"ngClass"],[1,"nav","navbar-nav","cd-navbar-utility","my-2","my-md-0"],[4,"ngTemplateOutlet"],[1,"wrapper"],["id","sidebar",3,"ngClass"],[3,"options"],[1,"list-unstyled","components","cd-navbar-primary"],["id","content",3,"ngClass"],["cd_utilities",""],["cd_menu",""],[1,"nav-item"],[1,"cd-navbar"],[1,"cd-navbar",3,"click"],[4,"ngIf"],["routerLinkActive","active",1,"nav-item","tc_menuitem_dashboard"],["routerLink","/dashboard",1,"nav-link"],t,[3,"ngClass","ngStyle"],["routerLinkActive","active","class","nav-item tc_menuitem_cluster",4,"ngIf"],["routerLinkActive","active","class","nav-item tc_menuitem_pool",4,"ngIf"],["routerLinkActive","active","class","nav-item tc_menuitem_block",4,"ngIf"],["routerLinkActive","active","class","nav-item tc_menuitem_nfs",4,"ngIf"],["routerLinkActive","active","class","nav-item tc_menuitem_cephfs",4,"ngIf"],["routerLinkActive","active","class","nav-item tc_menuitem_rgw",4,"ngIf"],["routerLinkActive","active",1,"nav-item","tc_menuitem_cluster"],["aria-controls","cluster-nav","role","button",1,"nav-link","dropdown-toggle",3,"click"],o,["id","cluster-nav",1,"list-unstyled",3,"ngbCollapse"],["routerLinkActive","active","class","tc_submenuitem tc_submenuitem_hosts",4,"ngIf"],["routerLinkActive","active","class","tc_submenuitem tc_submenuitem_cluster_inventory",4,"ngIf"],["routerLinkActive","active","class","tc_submenuitem tc_submenuitem_cluster_monitor",4,"ngIf"],["routerLinkActive","active","class","tc_submenuitem tc_submenuitem_cluster_services",4,"ngIf"],["routerLinkActive","active","class","tc_submenuitem tc_submenuitem_osds",4,"ngIf"],["routerLinkActive","active","class","tc_submenuitem tc_submenuitem_configuration",4,"ngIf"],["routerLinkActive","active","class","tc_submenuitem tc_submenuitem_crush",4,"ngIf"],["routerLinkActive","active","class","tc_submenuitem tc_submenuitem_modules",4,"ngIf"],["routerLinkActive","active","class","tc_submenuitem tc_submenuitem_log",4,"ngIf"],["routerLinkActive","active","class","tc_submenuitem tc_submenuitem_monitoring",4,"ngIf"],["routerLinkActive","active",1,"tc_submenuitem","tc_submenuitem_hosts"],["routerLink","/hosts"],l,["routerLinkActive","active",1,"tc_submenuitem","tc_submenuitem_cluster_inventory"],["routerLink","/inventory"],_,["routerLinkActive","active",1,"tc_submenuitem","tc_submenuitem_cluster_monitor"],["routerLink","/monitor/"],M,["routerLinkActive","active",1,"tc_submenuitem","tc_submenuitem_cluster_services"],["routerLink","/services/"],w,["routerLinkActive","active",1,"tc_submenuitem","tc_submenuitem_osds"],["routerLink","/osd"],N,["routerLinkActive","active",1,"tc_submenuitem","tc_submenuitem_configuration"],["routerLink","/configuration"],V,["routerLinkActive","active",1,"tc_submenuitem","tc_submenuitem_crush"],["routerLink","/crush-map"],X,["routerLinkActive","active",1,"tc_submenuitem","tc_submenuitem_modules"],["routerLink","/mgr-modules"],re,["routerLinkActive","active",1,"tc_submenuitem","tc_submenuitem_log"],["routerLink","/logs"],oe,["routerLinkActive","active",1,"tc_submenuitem","tc_submenuitem_monitoring"],["routerLink","/monitoring"],fe,["class","badge badge-danger ms-1",4,"ngIf"],["class","badge badge-warning ms-1",4,"ngIf"],[1,"badge","badge-danger","ms-1"],[1,"badge","badge-warning","ms-1"],["routerLinkActive","active",1,"nav-item","tc_menuitem_pool"],["routerLink","/pool",1,"nav-link"],ve,["routerLinkActive","active",1,"nav-item","tc_menuitem_block"],["aria-controls","block-nav","role","button",1,"nav-link","dropdown-toggle",3,"ngStyle","click"],Pe,["id","block-nav",1,"list-unstyled",3,"ngbCollapse"],["routerLinkActive","active","class","tc_submenuitem tc_submenuitem_block_images",4,"ngIf"],["routerLinkActive","active","class","tc_submenuitem tc_submenuitem_block_mirroring",4,"ngIf"],["routerLinkActive","active","class","tc_submenuitem tc_submenuitem_block_iscsi",4,"ngIf"],["routerLinkActive","active",1,"tc_submenuitem","tc_submenuitem_block_images"],["routerLink","/block/rbd"],De,["routerLinkActive","active",1,"tc_submenuitem","tc_submenuitem_block_mirroring"],["routerLink","/block/mirroring"],Ie,["class","badge badge-warning",4,"ngIf"],["class","badge badge-danger",4,"ngIf"],[1,"badge","badge-warning"],[1,"badge","badge-danger"],["routerLinkActive","active",1,"tc_submenuitem","tc_submenuitem_block_iscsi"],["routerLink","/block/iscsi"],Ae,["routerLinkActive","active",1,"nav-item","tc_menuitem_nfs"],["routerLink","/nfs",1,"nav-link"],Y,["routerLinkActive","active",1,"nav-item","tc_menuitem_cephfs"],["routerLink","/cephfs",1,"nav-link"],Et,["routerLinkActive","active",1,"nav-item","tc_menuitem_rgw"],["aria-controls","gateway-nav","role","button",1,"nav-link","dropdown-toggle",3,"click"],ft,["id","gateway-nav",1,"list-unstyled",3,"ngbCollapse"],["routerLinkActive","active",1,"tc_submenuitem","tc_submenuitem_rgw_daemons"],["routerLink","/rgw/daemon"],xt,["routerLinkActive","active",1,"tc_submenuitem","tc_submenuitem_rgw_users"],["routerLink","/rgw/user"],Ht,["routerLinkActive","active",1,"tc_submenuitem","tc_submenuitem_rgw_buckets"],["routerLink","/rgw/bucket"],yn]},template:function(t,o){if(1&t&&(e.F$t(),e.TgZ(0,"div",0),e._UZ(1,"cd-pwd-expiration-notification")(2,"cd-telemetry-notification")(3,"cd-motd")(4,"cd-notifications-sidebar"),e.TgZ(5,"div",1)(6,"nav",2)(7,"button",3),e.NdJ("click",function(){return o.showMenuSidebar=!o.showMenuSidebar}),e._UZ(8,"i",4),e.qZA(),e.TgZ(9,"a",5),e._UZ(10,"img",6),e.qZA(),e.TgZ(11,"button",7),e.NdJ("click",function(){return o.toggleRightSidebar()}),e.TgZ(12,"span",8),e.SDv(13,9),e.qZA(),e.TgZ(14,"span",10),e._UZ(15,"i",11),e.qZA()(),e.TgZ(16,"div",12)(17,"ul",13),e.YNc(18,B2,1,0,"ng-container",14),e.qZA()()()(),e.TgZ(19,"div",15)(20,"nav",16)(21,"ngx-simplebar",17)(22,"ul",18),e.YNc(23,_T,1,0,"ng-container",14),e.qZA()()(),e.TgZ(24,"div",19),e.Hsn(25),e.qZA()(),e.YNc(26,u0,10,0,"ng-template",null,20,e.W1O),e.YNc(28,hD,2,3,"ng-template",null,21,e.W1O),e.qZA()),2&t){const l=e.MAs(27),_=e.MAs(29);e.xp6(16),e.Q6J("ngClass",e.VKq(6,_D,o.rightSidebarOpen)),e.xp6(2),e.Q6J("ngTemplateOutlet",l),e.xp6(2),e.Q6J("ngClass",e.VKq(8,AT,!o.showMenuSidebar)),e.xp6(1),e.Q6J("options",o.simplebar),e.xp6(2),e.Q6J("ngTemplateOutlet",_),e.xp6(1),e.Q6J("ngClass",e.VKq(10,AT,!o.showMenuSidebar))}},directives:[b2,Iv,Q_,iE,Dr.M2,_e.o,p.mk,p.tP,qy.M,Wy,sT,$2,l0,hT,p.O5,Bo.Od,Bo.yS,p.PC,Dr._D],pipes:[p.Ov,Vb],styles:['.cd-navbar-main[_ngcontent-%COMP%]{display:flex;flex:1;flex-direction:column;height:100%}  cd-navigation .cd-navbar-top .cd-navbar-brand{background:#374249;border-top:4px solid #25828e}  cd-navigation .cd-navbar-top .cd-navbar-brand .navbar-brand,   cd-navigation .cd-navbar-top .cd-navbar-brand .navbar-brand:hover{color:#e9ecef;height:auto;padding:0}  cd-navigation .cd-navbar-top .cd-navbar-brand .navbar-brand>img{height:25px}  cd-navigation .cd-navbar-top .cd-navbar-brand .navbar-toggler{border:0}  cd-navigation .cd-navbar-top .cd-navbar-brand .navbar-toggler:focus,   cd-navigation .cd-navbar-top .cd-navbar-brand .navbar-toggler:hover{outline:0}  cd-navigation .cd-navbar-top .cd-navbar-brand .navbar-toggler .fa-navicon{color:#e9ecef}  cd-navigation .cd-navbar-top .cd-navbar-brand .navbar-collapse{padding:0}  cd-navigation .cd-navbar-top .cd-navbar-brand .cd-navbar-utility>.active>a{background-color:#25828e;color:#e9ecef}  cd-navigation .cd-navbar-top .cd-navbar-brand .cd-navbar-utility>li>.open>a,   cd-navigation .cd-navbar-top .cd-navbar-brand .cd-navbar-utility>li>.open>a:focus,   cd-navigation .cd-navbar-top .cd-navbar-brand .cd-navbar-utility>li>.open>a:hover{background-color:transparent;border-color:transparent;color:#e9ecef}  cd-navigation .cd-navbar-top .navbar-nav>li>.cd-navbar>[ngbDropdown]>a,   cd-navigation .cd-navbar-top .navbar-nav>li>.cd-navbar>a,   cd-navigation .cd-navbar-top .navbar-nav>li>a{color:#e9ecef;display:block;line-height:1;padding:13.5px 18px!important;position:relative;text-decoration:none}  cd-navigation .cd-navbar-top .navbar-nav .nav-link,   cd-navigation .cd-navbar-top .navbar-nav .nav-link:hover{color:#e9ecef}  cd-navigation .cd-navbar-top .navbar-nav>li>.cd-navbar>[ngbDropdown]>a:hover,   cd-navigation .cd-navbar-top .navbar-nav>li>.cd-navbar>[ngbDropdown].open>a,   cd-navigation .cd-navbar-top .navbar-nav>li>.cd-navbar>a:hover,   cd-navigation .cd-navbar-top .navbar-nav>li>a:hover,   cd-navigation .cd-navbar-top .navbar-nav>li:hover{background-color:#25828e}  cd-navigation .cd-navbar-top .navbar-nav>.open>.cd-navbar>[ngbDropdown]>a,   cd-navigation .cd-navbar-top .navbar-nav>.open>.cd-navbar>[ngbDropdown]>a:hover,   cd-navigation .cd-navbar-top .navbar-nav>.open>.cd-navbar>a,   cd-navigation .cd-navbar-top .navbar-nav>.open>.cd-navbar>a:focus,   cd-navigation .cd-navbar-top .navbar-nav>.open>.cd-navbar>a:hover,   cd-navigation .cd-navbar-top .navbar-nav>.open>.cd-navbar>li>a:focus,   cd-navigation .cd-navbar-top .navbar-nav>.open>a,   cd-navigation .cd-navbar-top .navbar-nav>.open>a:focus,   cd-navigation .cd-navbar-top .navbar-nav>.open>a:hover{background-color:transparent;border-color:transparent;color:#e9ecef}@media (min-width: 768px){  cd-navigation .cd-navbar-top .cd-navbar-utility{border-bottom:0;font-size:1.1rem;position:absolute;right:0;top:0}}@media (max-width: 767px){  cd-navigation .cd-navbar-top .navbar-nav{margin:0}  cd-navigation .cd-navbar-top .navbar-nav .fa{margin-right:.5em}  cd-navigation .cd-navbar-top .navbar-nav .open .dropdown-menu{background-color:#25828e;border:0;padding-bottom:0;padding-top:0}  cd-navigation .cd-navbar-top .navbar-nav .open .dropdown-menu>li>a{color:#e9ecef;padding:5px 15px 5px 35px}  cd-navigation .cd-navbar-top .navbar-nav .open .dropdown-menu>.active>a{background-color:#25828e}  cd-navigation .cd-navbar-top .navbar-nav>li>a:hover{background-color:#25828e}}.cd-navbar-primary[_ngcontent-%COMP%]   .active[_ngcontent-%COMP%] > a[_ngcontent-%COMP%], .cd-navbar-primary[_ngcontent-%COMP%] > .active[_ngcontent-%COMP%] > a[_ngcontent-%COMP%]:focus, .cd-navbar-primary[_ngcontent-%COMP%] > .active[_ngcontent-%COMP%] > a[_ngcontent-%COMP%]:hover{background-color:#25828e!important;border:0!important;color:#fff!important}.wrapper[_ngcontent-%COMP%]{display:flex;height:100%;width:100%}.wrapper[_ngcontent-%COMP%]   #sidebar[_ngcontent-%COMP%]{background:#374249;bottom:0;color:#fff;height:auto;left:0;overflow-y:auto;position:relative;transition:all .3s;width:200px;z-index:999}.wrapper[_ngcontent-%COMP%]   #sidebar.active[_ngcontent-%COMP%]{margin-left:-200px}.wrapper[_ngcontent-%COMP%]   #sidebar[_ngcontent-%COMP%]   ul.component[_ngcontent-%COMP%]{margin:0;padding:20px 0}.wrapper[_ngcontent-%COMP%]   #sidebar[_ngcontent-%COMP%]   ul[_ngcontent-%COMP%]   p[_ngcontent-%COMP%]{color:#fff;padding:10px}.wrapper[_ngcontent-%COMP%]   #sidebar[_ngcontent-%COMP%]   ul[_ngcontent-%COMP%]   li[_ngcontent-%COMP%]   a[_ngcontent-%COMP%]{color:#fff;display:block;font-size:1.3em;padding:10px 10px 10px 27px;text-decoration:none}.wrapper[_ngcontent-%COMP%]   #sidebar[_ngcontent-%COMP%]   ul[_ngcontent-%COMP%]   li[_ngcontent-%COMP%]   a[_ngcontent-%COMP%]:hover{background:#25828e;color:#fff}.wrapper[_ngcontent-%COMP%]   #sidebar[_ngcontent-%COMP%]   ul[_ngcontent-%COMP%]   li[_ngcontent-%COMP%]   a[_ngcontent-%COMP%] > .badge[_ngcontent-%COMP%]{margin-left:5px}.wrapper[_ngcontent-%COMP%]   #sidebar[_ngcontent-%COMP%]   ul[_ngcontent-%COMP%]   li.active[_ngcontent-%COMP%] > a[_ngcontent-%COMP%], .wrapper[_ngcontent-%COMP%]   #sidebar[_ngcontent-%COMP%]   ul[_ngcontent-%COMP%]   li[_ngcontent-%COMP%] > a[_ngcontent-%COMP%]   a[aria-expanded=true][_ngcontent-%COMP%]{color:#fff}.wrapper[_ngcontent-%COMP%]   a.dropdown-toggle[_ngcontent-%COMP%]{position:relative}.wrapper[_ngcontent-%COMP%]   a.dropdown-toggle[_ngcontent-%COMP%]:after{border:0;content:"\\f054";font-family:ForkAwesome;font-size:1rem;margin-top:2px;position:absolute;right:20px;transition:transform .3s ease-in-out}.wrapper[_ngcontent-%COMP%]   a.dropdown-toggle[aria-expanded=true][_ngcontent-%COMP%]:after{transform:rotate(90deg)}.wrapper[_ngcontent-%COMP%]   ul[_ngcontent-%COMP%]   ul[_ngcontent-%COMP%]   a[_ngcontent-%COMP%]{background:#4d5c66;font-size:1.1em!important;padding-left:40px!important}.wrapper[_ngcontent-%COMP%]   .cd-navbar-primary[_ngcontent-%COMP%]   a[_ngcontent-%COMP%]:focus{outline:none}.wrapper[_ngcontent-%COMP%]   ngx-simplebar[_ngcontent-%COMP%]{height:100%}#content[_ngcontent-%COMP%]{bottom:0;position:relative;right:0;transition:all .3s;width:calc(100% - 200px)}#content.active[_ngcontent-%COMP%]{width:100vw}']}),n})();var mD=i(17757),vD=i(20523);function c0(n,s){if(1&n){const t=e.EpF();e.ynx(0),e.TgZ(1,"button",8),e.NdJ("click",function(){const _=e.CHM(t).$implicit;return e.oxw(3).onDaemonSelection(_)}),e._uU(2),e.qZA(),e.BQk()}if(2&n){const t=s.$implicit;e.xp6(2),e.AsE(" ",t.id," ( ",t.zonegroup_name," ) ")}}function yD(n,s){if(1&n&&(e.ynx(0),e.TgZ(1,"div",1)(2,"span",2),e.SDv(3,3),e.qZA(),e.TgZ(4,"div",4)(5,"button",5),e._uU(6),e.qZA(),e.TgZ(7,"div",6),e.YNc(8,c0,3,2,"ng-container",7),e.qZA()()(),e.BQk()),2&n){const t=e.oxw().ngIf;e.xp6(6),e.AsE(" ",t.selectedDaemon.id," ( ",t.selectedDaemon.zonegroup_name," ) "),e.xp6(2),e.Q6J("ngForOf",t.daemons)}}function DT(n,s){if(1&n&&(e.ynx(0),e.YNc(1,yD,9,3,"ng-container",0),e.BQk()),2&n){const t=s.ngIf,o=e.oxw();e.xp6(1),e.Q6J("ngIf",t.ftMap&&t.ftMap.rgw&&o.permissions.rgw.read&&o.isRgwRoute&&t.daemons.length>1)}}const uE=function(n,s,t){return{ftMap:n,daemons:s,selectedDaemon:t}};let wT=(()=>{class n{constructor(t,o,l,_,M){this.authStorageService=t,this.featureToggles=o,this.router=l,this.timerService=_,this.rgwDaemonService=M,this.REFRESH_INTERVAL=5e3,this.subs=new fc.w,this.rgwUrlPrefix="/rgw",this.isRgwRoute=document.location.href.includes(this.rgwUrlPrefix)}ngOnInit(){this.permissions=this.authStorageService.getPermissions(),this.featureToggleMap$=this.featureToggles.get(),this.subs.add(this.router.events.pipe((0,np.h)(t=>t instanceof Bo.m2)).subscribe(()=>this.isRgwRoute=this.router.url.startsWith(this.rgwUrlPrefix))),this.subs.add(this.timerService.get(()=>this.isRgwRoute?this.rgwDaemonService.list():mD.C,this.REFRESH_INTERVAL).subscribe())}ngOnDestroy(){this.subs.unsubscribe()}onDaemonSelection(t){this.rgwDaemonService.selectDaemon(t),this.reloadData()}reloadData(){const t=this.router.url;this.router.navigateByUrl(this.rgwUrlPrefix,{skipLocationChange:!0}).finally(()=>{this.router.navigate([t])})}}return n.\u0275fac=function(t){return new(t||n)(e.Y36(zi.j),e.Y36(W1.l),e.Y36(Bo.F0),e.Y36(Z.f),e.Y36(vD.b))},n.\u0275cmp=e.Xpm({type:n,selectors:[["cd-context"]],decls:4,vars:11,consts:function(){let s,t;return s="Selected Object Gateway:",t="Select Object Gateway",[[4,"ngIf"],[1,"cd-context-bar","pt-3","pb-3"],[1,"me-1"],s,["ngbDropdown","","placement","bottom-left",1,"d-inline-block","ms-2"],["ngbDropdownToggle","","title",t,1,"btn","btn-outline-info","ctx-bar-selected-rgw-daemon"],["ngbDropdownMenu",""],[4,"ngFor","ngForOf"],["ngbDropdownItem","",1,"ctx-bar-available-rgw-daemon",3,"click"]]},template:function(t,o){1&t&&(e.YNc(0,DT,2,1,"ng-container",0),e.ALo(1,"async"),e.ALo(2,"async"),e.ALo(3,"async")),2&t&&e.Q6J("ngIf",e.kEZ(7,uE,e.lcZ(1,1,o.featureToggleMap$),e.lcZ(2,3,o.rgwDaemonService.daemons$),e.lcZ(3,5,o.rgwDaemonService.selectedDaemon$)))},directives:[p.O5,Dr.jt,_e.o,Dr.iD,Dr.Vi,p.sg,Dr.TH],pipes:[p.Ov],styles:[".cd-context-bar[_ngcontent-%COMP%]{border-bottom:1px solid #dee2e6}"]}),n})();var xT=i(6481),ED=i(76666),Hv=i(85345);class K2{constructor(s,t){this.keySelector=s,this.flushes=t}call(s,t){return t.subscribe(new NT(s,this.keySelector,this.flushes))}}class NT extends Hv.Ds{constructor(s,t,o){super(s),this.keySelector=t,this.values=new Set,o&&this.add((0,Hv.ft)(o,new Hv.IY(this)))}notifyNext(){this.values.clear()}notifyError(s){this._error(s)}_next(s){this.keySelector?this._useKeySelector(s):this._finalizeNext(s,s)}_useKeySelector(s){let t;const{destination:o}=this;try{t=this.keySelector(s)}catch(l){return void o.error(l)}this._finalizeNext(t,s)}_finalizeNext(s,t){const{values:o}=this;o.has(s)||(o.add(s),this.destination.next(t))}}var X2=i(28049);class d0{resolve(s){const t=s.routeConfig.data,o=null===t.path?null:this.getFullPath(s);return(0,nc.of)([{text:"string"==typeof t.breadcrumbs?t.breadcrumbs:t.breadcrumbs.text||t.text||o,path:o}])}getFullPath(s){return s.pathFromRoot.reduce((_,M)=>_+M.url.reduce((_,M)=>_+"/"+M.path,""),"")}}function q2(n,s){if(1&n&&(e.TgZ(0,"a",6),e._uU(1),e.qZA()),2&n){const t=e.oxw().$implicit;e.Q6J("routerLink",t.path),e.xp6(1),e.Oqu(t.text)}}function cE(n,s){if(1&n&&(e.TgZ(0,"span"),e._uU(1),e.qZA()),2&n){const t=e.oxw().$implicit;e.xp6(1),e.Oqu(t.text)}}const eO=function(n){return{active:n}};function bD(n,s){if(1&n&&(e.TgZ(0,"li",3),e.YNc(1,q2,2,2,"a",4),e.YNc(2,cE,2,1,"span",5),e.qZA()),2&n){const t=s.$implicit,o=s.last,l=e.oxw(2);e.Q6J("ngClass",e.VKq(3,eO,o&&l.finished)),e.xp6(1),e.Q6J("ngIf",!o&&null!==t.path),e.xp6(1),e.Q6J("ngIf",o||null===t.path)}}function SD(n,s){if(1&n&&(e.TgZ(0,"ol",1),e.YNc(1,bD,3,5,"li",2),e.qZA()),2&n){const t=e.oxw();e.xp6(1),e.Q6J("ngForOf",t.crumbs)}}let TD=(()=>{class n{constructor(t,o){this.router=t,this.injector=o,this.crumbs=[],this.finished=!1,this.defaultResolver=new d0,this.subscription=this.router.events.pipe((0,np.h)(l=>l instanceof Bo.OD)).subscribe(()=>{this.finished=!1}),this.subscription=this.router.events.pipe((0,np.h)(l=>l instanceof Bo.m2)).subscribe(()=>{this._resolveCrumbs(t.routerState.snapshot.root).pipe((0,Ac.zg)(_=>_),function RT(n,s){return t=>t.lift(new K2(n,s))}(_=>_.text),Fl(),(0,Ac.zg)(_=>{const M=this.postProcess(_);return this.wrapIntoObservable(M).pipe((0,X2.P)())})).subscribe(_=>{this.finished=!0,this.crumbs=_})})}ngOnDestroy(){this.subscription.unsubscribe()}_resolveCrumbs(t){let o;const l=t.routeConfig&&t.routeConfig.data;if(l&&l.breadcrumbs){let _;_=l.breadcrumbs.prototype instanceof d0?this.injector.get(l.breadcrumbs):this.defaultResolver;const M=_.resolve(t);o=this.wrapIntoObservable(M).pipe((0,X2.P)())}else o=(0,nc.of)([]);return t.firstChild&&(o=(0,xT.z)(o,this._resolveCrumbs(t.firstChild))),o}postProcess(t){const o=[];return t.forEach(l=>{const _=l.text.split("/");if(_.length>1){l.text=_[_.length-1];for(let M=0;M<_.length-1;M++)o.push({text:_[M],path:null})}o.push(l)}),o}isPromise(t){return t&&"function"==typeof t.then}wrapIntoObservable(t){return t instanceof G1.y?t:this.isPromise(t)?(0,ED.D)(Promise.resolve(t)):(0,nc.of)(t)}}return n.\u0275fac=function(t){return new(t||n)(e.Y36(Bo.F0),e.Y36(e.zs3))},n.\u0275cmp=e.Xpm({type:n,selectors:[["cd-breadcrumbs"]],decls:1,vars:1,consts:[["class","breadcrumb",4,"ngIf"],[1,"breadcrumb"],["class","breadcrumb-item",3,"ngClass",4,"ngFor","ngForOf"],[1,"breadcrumb-item",3,"ngClass"],["preserveFragment","",3,"routerLink",4,"ngIf"],[4,"ngIf"],["preserveFragment","",3,"routerLink"]],template:function(t,o){1&t&&e.YNc(0,SD,2,1,"ol",0),2&t&&e.Q6J("ngIf",o.crumbs.length)},directives:[p.O5,p.sg,p.mk,Bo.yS],styles:['.breadcrumb[_ngcontent-%COMP%]{background-color:transparent;border-radius:0;margin-top:8px;padding:8px 0}.breadcrumb[_ngcontent-%COMP%] > li[_ngcontent-%COMP%] + li[_ngcontent-%COMP%]:before{content:"\\f101";font-family:ForkAwesome;padding:0 5px 0 7px}']}),n})();const tO=function(n){return{dashboard:n}};let nO=(()=>{class n{constructor(t,o,l,_){this.router=t,this.summaryService=o,this.taskManagerService=l,this.faviconService=_,this.subs=new fc.w}ngOnInit(){this.subs.add(this.summaryService.startPolling()),this.subs.add(this.taskManagerService.init(this.summaryService)),this.faviconService.init()}ngOnDestroy(){this.subs.unsubscribe()}isDashboardPage(){return"/dashboard"===this.router.url}}return n.\u0275fac=function(t){return new(t||n)(e.Y36(Bo.F0),e.Y36(zm.J),e.Y36(y2.k),e.Y36(jS))},n.\u0275cmp=e.Xpm({type:n,selectors:[["cd-workbench-layout"]],features:[e._Bn([jS])],decls:6,vars:3,consts:[[1,"container-fluid","h-100",3,"ngClass"]],template:function(t,o){1&t&&(e.TgZ(0,"block-ui")(1,"cd-navigation")(2,"div",0),e._UZ(3,"cd-context")(4,"cd-breadcrumbs")(5,"router-outlet"),e.qZA()()()),2&t&&(e.xp6(2),e.Q6J("ngClass",e.VKq(1,tO,o.isDashboardPage())))},directives:[E1,gD,p.mk,wT,TD,Bo.lC],styles:[".dashboard[_ngcontent-%COMP%]{background-color:#e9ecef;margin:0;padding:0}.container-fluid[_ngcontent-%COMP%]{overflow:auto;position:absolute}"]}),n})();var $l=i(78139),Lg=i(16482),rO=i.n(Lg);function Zm(n){return(Zm="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(s){return typeof s}:function(s){return s&&"function"==typeof Symbol&&s.constructor===Symbol&&s!==Symbol.prototype?"symbol":typeof s})(n)}function iO(n,s){if(!(n instanceof s))throw new TypeError("Cannot call a class as a function")}function p_(n,s){for(var t=0;t<s.length;t++){var o=s[t];o.enumerable=o.enumerable||!1,o.configurable=!0,"value"in o&&(o.writable=!0),Object.defineProperty(n,o.key,o)}}function dE(n,s,t){return s in n?Object.defineProperty(n,s,{value:t,enumerable:!0,configurable:!0,writable:!0}):n[s]=t,n}function PT(n,s){var t=Object.keys(n);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(n);s&&(o=o.filter(function(l){return Object.getOwnPropertyDescriptor(n,l).enumerable})),t.push.apply(t,o)}return t}function sO(n){for(var s=1;s<arguments.length;s++){var t=null!=arguments[s]?arguments[s]:{};s%2?PT(t,!0).forEach(function(o){dE(n,o,t[o])}):Object.getOwnPropertyDescriptors?Object.defineProperties(n,Object.getOwnPropertyDescriptors(t)):PT(t).forEach(function(o){Object.defineProperty(n,o,Object.getOwnPropertyDescriptor(t,o))})}return n}function f0(n){return(f0=Object.setPrototypeOf?Object.getPrototypeOf:function(t){return t.__proto__||Object.getPrototypeOf(t)})(n)}function p0(n,s){return(p0=Object.setPrototypeOf||function(o,l){return o.__proto__=l,o})(n,s)}function IT(n,s){return!s||"object"!=typeof s&&"function"!=typeof s?function aO(n){if(void 0===n)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return n}(n):s}var LT={};function pE(n,s,t){return function uO(n){return null==n}(n)?t:function lO(n){return null!==n&&"object"===Zm(n)&&"function"==typeof n.get&&"function"==typeof n.has}(n)?n.has(s)?n.get(s):t:hasOwnProperty.call(n,s)?n[s]:t}function Fg(n,s,t){for(var o=0;o!==s.length;)if((n=pE(n,s[o++],LT))===LT)return t;return n}function h0(n){var s=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},t=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{},o=FT(s,t),l=n||Object.keys(sO({},t,{},s));return l.every(o)}function FT(n,s){return function(t){if("string"==typeof t)return(0,Lg.is)(s[t],n[t]);if(Array.isArray(t))return(0,Lg.is)(Fg(s,t),Fg(n,t));throw new TypeError("Invalid key: expected Array or string: "+t)}}var cO=function(n){function s(){return iO(this,s),IT(this,f0(s).apply(this,arguments))}return function fE(n,s){if("function"!=typeof s&&null!==s)throw new TypeError("Super expression must either be null or a function");n.prototype=Object.create(s&&s.prototype,{constructor:{value:n,writable:!0,configurable:!0}}),s&&p0(n,s)}(s,n),function oO(n,s,t){s&&p_(n.prototype,s),t&&p_(n,t)}(s,[{key:"shouldComponentUpdate",value:function(o){var l=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};return!h0(this.updateOnProps,this.props,o,"updateOnProps")||!h0(this.updateOnStates,this.state,l,"updateOnStates")}}]),s}($l.Component);const dO=cO;function $T(n,s){if(Array.prototype.indexOf)return n.indexOf(s);for(var t=0,o=n.length;t<o;t++)if(n[t]===s)return t;return-1}function cm(n,s){for(var t=n.length-1;t>=0;t--)!0===s(n[t])&&n.splice(t,1)}function Bv(n){throw new Error("Unhandled case for value: '".concat(n,"'"))}var t,_0=function(){function n(s){void 0===s&&(s={}),this.tagName="",this.attrs={},this.innerHTML="",this.whitespaceRegex=/\s+/,this.tagName=s.tagName||"",this.attrs=s.attrs||{},this.innerHTML=s.innerHtml||s.innerHTML||""}return n.prototype.setTagName=function(s){return this.tagName=s,this},n.prototype.getTagName=function(){return this.tagName||""},n.prototype.setAttr=function(s,t){return this.getAttrs()[s]=t,this},n.prototype.getAttr=function(s){return this.getAttrs()[s]},n.prototype.setAttrs=function(s){return Object.assign(this.getAttrs(),s),this},n.prototype.getAttrs=function(){return this.attrs||(this.attrs={})},n.prototype.setClass=function(s){return this.setAttr("class",s)},n.prototype.addClass=function(s){for(var M,t=this.getClass(),o=this.whitespaceRegex,l=t?t.split(o):[],_=s.split(o);M=_.shift();)-1===$T(l,M)&&l.push(M);return this.getAttrs().class=l.join(" "),this},n.prototype.removeClass=function(s){for(var M,t=this.getClass(),o=this.whitespaceRegex,l=t?t.split(o):[],_=s.split(o);l.length&&(M=_.shift());){var w=$T(l,M);-1!==w&&l.splice(w,1)}return this.getAttrs().class=l.join(" "),this},n.prototype.getClass=function(){return this.getAttrs().class||""},n.prototype.hasClass=function(s){return-1!==(" "+this.getClass()+" ").indexOf(" "+s+" ")},n.prototype.setInnerHTML=function(s){return this.innerHTML=s,this},n.prototype.setInnerHtml=function(s){return this.setInnerHTML(s)},n.prototype.getInnerHTML=function(){return this.innerHTML||""},n.prototype.getInnerHtml=function(){return this.getInnerHTML()},n.prototype.toAnchorString=function(){var s=this.getTagName(),t=this.buildAttrsStr();return["<",s,t=t?" "+t:"",">",this.getInnerHtml(),"</",s,">"].join("")},n.prototype.buildAttrsStr=function(){if(!this.attrs)return"";var s=this.getAttrs(),t=[];for(var o in s)s.hasOwnProperty(o)&&t.push(o+'="'+s[o]+'"');return t.join(" ")},n}(),g0=function(){function n(s){void 0===s&&(s={}),this.newWindow=!1,this.truncate={},this.className="",this.newWindow=s.newWindow||!1,this.truncate=s.truncate||{},this.className=s.className||""}return n.prototype.build=function(s){return new _0({tagName:"a",attrs:this.createAttrs(s),innerHtml:this.processAnchorText(s.getAnchorText())})},n.prototype.createAttrs=function(s){var t={href:s.getAnchorHref()},o=this.createCssClass(s);return o&&(t.class=o),this.newWindow&&(t.target="_blank",t.rel="noopener noreferrer"),this.truncate&&this.truncate.length&&this.truncate.length<s.getAnchorText().length&&(t.title=s.getAnchorHref()),t},n.prototype.createCssClass=function(s){var t=this.className;if(t){for(var o=[t],l=s.getCssClassSuffixes(),_=0,M=l.length;_<M;_++)o.push(t+"-"+l[_]);return o.join(" ")}return""},n.prototype.processAnchorText=function(s){return this.doTruncate(s)},n.prototype.doTruncate=function(s){var t=this.truncate;if(!t||!t.length)return s;var o=t.length,l=t.location;return"smart"===l?function hO(n,s,t){var o,l;null==t?(t="&hellip;",l=3,o=8):(l=t.length,o=t.length);var M=function(Ae){var Y="";return Ae.scheme&&Ae.host&&(Y+=Ae.scheme+"://"),Ae.host&&(Y+=Ae.host),Ae.path&&(Y+="/"+Ae.path),Ae.query&&(Y+="?"+Ae.query),Ae.fragment&&(Y+="#"+Ae.fragment),Y},w=function(Ae,Y){var Et=Y/2,ft=Math.ceil(Et),xt=-1*Math.floor(Et),Ht="";return xt<0&&(Ht=Ae.substr(xt)),Ae.substr(0,ft)+t+Ht};if(n.length<=s)return n;var Y,Et,ft,N=s-l,V=(Y={},(ft=(Et=n).match(/^([a-z]+):\/\//i))&&(Y.scheme=ft[1],Et=Et.substr(ft[0].length)),(ft=Et.match(/^(.*?)(?=(\?|#|\/|$))/i))&&(Y.host=ft[1],Et=Et.substr(ft[0].length)),(ft=Et.match(/^\/(.*?)(?=(\?|#|$))/i))&&(Y.path=ft[1],Et=Et.substr(ft[0].length)),(ft=Et.match(/^\?(.*?)(?=(#|$))/i))&&(Y.query=ft[1],Et=Et.substr(ft[0].length)),(ft=Et.match(/^#(.*?)$/i))&&(Y.fragment=ft[1]),Y);if(V.query){var X=V.query.match(/^(.*?)(?=(\?|\#))(.*?)$/i);X&&(V.query=V.query.substr(0,X[1].length),n=M(V))}if(n.length<=s||(V.host&&(V.host=V.host.replace(/^www\./,""),n=M(V)),n.length<=s))return n;var re="";if(V.host&&(re+=V.host),re.length>=N)return V.host.length==s?(V.host.substr(0,s-l)+t).substr(0,N+o):w(re,N).substr(0,N+o);var oe="";if(V.path&&(oe+="/"+V.path),V.query&&(oe+="?"+V.query),oe){if((re+oe).length>=N)return(re+oe).length==s?(re+oe).substr(0,s):(re+w(oe,N-re.length)).substr(0,N+o);re+=oe}if(V.fragment){var ve="#"+V.fragment;if((re+ve).length>=N)return(re+ve).length==s?(re+ve).substr(0,s):(re+w(ve,N-re.length)).substr(0,N+o);re+=ve}if(V.scheme&&V.host){var De=V.scheme+"://";if((re+De).length<N)return(De+re).substr(0,s)}if(re.length<=s)return re;var Ie="";return N>0&&(Ie=re.substr(-1*Math.floor(N/2))),(re.substr(0,Math.ceil(N/2))+t+Ie).substr(0,N+o)}(s,o):"middle"===l?function _O(n,s,t){if(n.length<=s)return n;var o,l;null==t?(t="&hellip;",o=8,l=3):(o=t.length,l=t.length);var _=s-l,M="";return _>0&&(M=n.substr(-1*Math.floor(_/2))),(n.substr(0,Math.ceil(_/2))+t+M).substr(0,_+o)}(s,o):function HT(n,s,t){return function kT(n,s,t){var o;return n.length>s&&(null==t?(t="&hellip;",o=3):o=t.length,n=n.substring(0,s-o)+t),n}(n,s,t)}(s,o)},n}(),kg=function(){function n(s){this.__jsduckDummyDocProp=null,this.matchedText="",this.offset=0,this.tagBuilder=s.tagBuilder,this.matchedText=s.matchedText,this.offset=s.offset}return n.prototype.getMatchedText=function(){return this.matchedText},n.prototype.setOffset=function(s){this.offset=s},n.prototype.getOffset=function(){return this.offset},n.prototype.getCssClassSuffixes=function(){return[this.getType()]},n.prototype.buildTag=function(){return this.tagBuilder.build(this)},n}(),hE=function(n){function s(t){var o=n.call(this,t)||this;return o.email="",o.email=t.email,o}return(0,j.ZT)(s,n),s.prototype.getType=function(){return"email"},s.prototype.getEmail=function(){return this.email},s.prototype.getAnchorHref=function(){return"mailto:"+this.email},s.prototype.getAnchorText=function(){return this.email},s}(kg),BT=function(n){function s(t){var o=n.call(this,t)||this;return o.serviceName="",o.hashtag="",o.serviceName=t.serviceName,o.hashtag=t.hashtag,o}return(0,j.ZT)(s,n),s.prototype.getType=function(){return"hashtag"},s.prototype.getServiceName=function(){return this.serviceName},s.prototype.getHashtag=function(){return this.hashtag},s.prototype.getAnchorHref=function(){var t=this.serviceName,o=this.hashtag;switch(t){case"twitter":return"https://twitter.com/hashtag/"+o;case"facebook":return"https://www.facebook.com/hashtag/"+o;case"instagram":return"https://instagram.com/explore/tags/"+o;case"tiktok":return"https://www.tiktok.com/tag/"+o;default:throw new Error("Unknown service name to point hashtag to: "+t)}},s.prototype.getAnchorText=function(){return"#"+this.hashtag},s}(kg),_E=function(n){function s(t){var o=n.call(this,t)||this;return o.serviceName="twitter",o.mention="",o.mention=t.mention,o.serviceName=t.serviceName,o}return(0,j.ZT)(s,n),s.prototype.getType=function(){return"mention"},s.prototype.getMention=function(){return this.mention},s.prototype.getServiceName=function(){return this.serviceName},s.prototype.getAnchorHref=function(){switch(this.serviceName){case"twitter":return"https://twitter.com/"+this.mention;case"instagram":return"https://instagram.com/"+this.mention;case"soundcloud":return"https://soundcloud.com/"+this.mention;case"tiktok":return"https://www.tiktok.com/@"+this.mention;default:throw new Error("Unknown service name to point mention to: "+this.serviceName)}},s.prototype.getAnchorText=function(){return"@"+this.mention},s.prototype.getCssClassSuffixes=function(){var t=n.prototype.getCssClassSuffixes.call(this),o=this.getServiceName();return o&&t.push(o),t},s}(kg),gE=function(n){function s(t){var o=n.call(this,t)||this;return o.number="",o.plusSign=!1,o.number=t.number,o.plusSign=t.plusSign,o}return(0,j.ZT)(s,n),s.prototype.getType=function(){return"phone"},s.prototype.getPhoneNumber=function(){return this.number},s.prototype.getNumber=function(){return this.getPhoneNumber()},s.prototype.getAnchorHref=function(){return"tel:"+(this.plusSign?"+":"")+this.number},s.prototype.getAnchorText=function(){return this.matchedText},s}(kg),UT=function(n){function s(t){var o=n.call(this,t)||this;return o.url="",o.urlMatchType="scheme",o.protocolUrlMatch=!1,o.protocolRelativeMatch=!1,o.stripPrefix={scheme:!0,www:!0},o.stripTrailingSlash=!0,o.decodePercentEncoding=!0,o.schemePrefixRegex=/^(https?:\/\/)?/i,o.wwwPrefixRegex=/^(https?:\/\/)?(www\.)?/i,o.protocolRelativeRegex=/^\/\//,o.protocolPrepended=!1,o.urlMatchType=t.urlMatchType,o.url=t.url,o.protocolUrlMatch=t.protocolUrlMatch,o.protocolRelativeMatch=t.protocolRelativeMatch,o.stripPrefix=t.stripPrefix,o.stripTrailingSlash=t.stripTrailingSlash,o.decodePercentEncoding=t.decodePercentEncoding,o}return(0,j.ZT)(s,n),s.prototype.getType=function(){return"url"},s.prototype.getUrlMatchType=function(){return this.urlMatchType},s.prototype.getUrl=function(){var t=this.url;return!this.protocolRelativeMatch&&!this.protocolUrlMatch&&!this.protocolPrepended&&(t=this.url="http://"+t,this.protocolPrepended=!0),t},s.prototype.getAnchorHref=function(){return this.getUrl().replace(/&amp;/g,"&")},s.prototype.getAnchorText=function(){var t=this.getMatchedText();return this.protocolRelativeMatch&&(t=this.stripProtocolRelativePrefix(t)),this.stripPrefix.scheme&&(t=this.stripSchemePrefix(t)),this.stripPrefix.www&&(t=this.stripWwwPrefix(t)),this.stripTrailingSlash&&(t=this.removeTrailingSlash(t)),this.decodePercentEncoding&&(t=this.removePercentEncoding(t)),t},s.prototype.stripSchemePrefix=function(t){return t.replace(this.schemePrefixRegex,"")},s.prototype.stripWwwPrefix=function(t){return t.replace(this.wwwPrefixRegex,"$1")},s.prototype.stripProtocolRelativePrefix=function(t){return t.replace(this.protocolRelativeRegex,"")},s.prototype.removeTrailingSlash=function(t){return"/"===t.charAt(t.length-1)&&(t=t.slice(0,-1)),t},s.prototype.removePercentEncoding=function(t){var o=t.replace(/%22/gi,"&quot;").replace(/%26/gi,"&amp;").replace(/%27/gi,"&#39;").replace(/%3C/gi,"&lt;").replace(/%3E/gi,"&gt;");try{return decodeURIComponent(o)}catch(l){return o}},s}(kg),Wm=function n(s){this.__jsduckDummyDocProp=null,this.tagBuilder=s.tagBuilder},YT=/[A-Za-z]/,MD=/[\d]/,jT=/[\D]/,dm=/\s/,mE=/['"]/,gO=/[\x00-\x1F\x7F]/,mO=/A-Za-z\xAA\xB5\xBA\xC0-\xD6\xD8-\xF6\xF8-\u02C1\u02C6-\u02D1\u02E0-\u02E4\u02EC\u02EE\u0370-\u0374\u0376\u0377\u037A-\u037D\u037F\u0386\u0388-\u038A\u038C\u038E-\u03A1\u03A3-\u03F5\u03F7-\u0481\u048A-\u052F\u0531-\u0556\u0559\u0561-\u0587\u05D0-\u05EA\u05F0-\u05F2\u0620-\u064A\u066E\u066F\u0671-\u06D3\u06D5\u06E5\u06E6\u06EE\u06EF\u06FA-\u06FC\u06FF\u0710\u0712-\u072F\u074D-\u07A5\u07B1\u07CA-\u07EA\u07F4\u07F5\u07FA\u0800-\u0815\u081A\u0824\u0828\u0840-\u0858\u08A0-\u08B4\u08B6-\u08BD\u0904-\u0939\u093D\u0950\u0958-\u0961\u0971-\u0980\u0985-\u098C\u098F\u0990\u0993-\u09A8\u09AA-\u09B0\u09B2\u09B6-\u09B9\u09BD\u09CE\u09DC\u09DD\u09DF-\u09E1\u09F0\u09F1\u0A05-\u0A0A\u0A0F\u0A10\u0A13-\u0A28\u0A2A-\u0A30\u0A32\u0A33\u0A35\u0A36\u0A38\u0A39\u0A59-\u0A5C\u0A5E\u0A72-\u0A74\u0A85-\u0A8D\u0A8F-\u0A91\u0A93-\u0AA8\u0AAA-\u0AB0\u0AB2\u0AB3\u0AB5-\u0AB9\u0ABD\u0AD0\u0AE0\u0AE1\u0AF9\u0B05-\u0B0C\u0B0F\u0B10\u0B13-\u0B28\u0B2A-\u0B30\u0B32\u0B33\u0B35-\u0B39\u0B3D\u0B5C\u0B5D\u0B5F-\u0B61\u0B71\u0B83\u0B85-\u0B8A\u0B8E-\u0B90\u0B92-\u0B95\u0B99\u0B9A\u0B9C\u0B9E\u0B9F\u0BA3\u0BA4\u0BA8-\u0BAA\u0BAE-\u0BB9\u0BD0\u0C05-\u0C0C\u0C0E-\u0C10\u0C12-\u0C28\u0C2A-\u0C39\u0C3D\u0C58-\u0C5A\u0C60\u0C61\u0C80\u0C85-\u0C8C\u0C8E-\u0C90\u0C92-\u0CA8\u0CAA-\u0CB3\u0CB5-\u0CB9\u0CBD\u0CDE\u0CE0\u0CE1\u0CF1\u0CF2\u0D05-\u0D0C\u0D0E-\u0D10\u0D12-\u0D3A\u0D3D\u0D4E\u0D54-\u0D56\u0D5F-\u0D61\u0D7A-\u0D7F\u0D85-\u0D96\u0D9A-\u0DB1\u0DB3-\u0DBB\u0DBD\u0DC0-\u0DC6\u0E01-\u0E30\u0E32\u0E33\u0E40-\u0E46\u0E81\u0E82\u0E84\u0E87\u0E88\u0E8A\u0E8D\u0E94-\u0E97\u0E99-\u0E9F\u0EA1-\u0EA3\u0EA5\u0EA7\u0EAA\u0EAB\u0EAD-\u0EB0\u0EB2\u0EB3\u0EBD\u0EC0-\u0EC4\u0EC6\u0EDC-\u0EDF\u0F00\u0F40-\u0F47\u0F49-\u0F6C\u0F88-\u0F8C\u1000-\u102A\u103F\u1050-\u1055\u105A-\u105D\u1061\u1065\u1066\u106E-\u1070\u1075-\u1081\u108E\u10A0-\u10C5\u10C7\u10CD\u10D0-\u10FA\u10FC-\u1248\u124A-\u124D\u1250-\u1256\u1258\u125A-\u125D\u1260-\u1288\u128A-\u128D\u1290-\u12B0\u12B2-\u12B5\u12B8-\u12BE\u12C0\u12C2-\u12C5\u12C8-\u12D6\u12D8-\u1310\u1312-\u1315\u1318-\u135A\u1380-\u138F\u13A0-\u13F5\u13F8-\u13FD\u1401-\u166C\u166F-\u167F\u1681-\u169A\u16A0-\u16EA\u16F1-\u16F8\u1700-\u170C\u170E-\u1711\u1720-\u1731\u1740-\u1751\u1760-\u176C\u176E-\u1770\u1780-\u17B3\u17D7\u17DC\u1820-\u1877\u1880-\u1884\u1887-\u18A8\u18AA\u18B0-\u18F5\u1900-\u191E\u1950-\u196D\u1970-\u1974\u1980-\u19AB\u19B0-\u19C9\u1A00-\u1A16\u1A20-\u1A54\u1AA7\u1B05-\u1B33\u1B45-\u1B4B\u1B83-\u1BA0\u1BAE\u1BAF\u1BBA-\u1BE5\u1C00-\u1C23\u1C4D-\u1C4F\u1C5A-\u1C7D\u1C80-\u1C88\u1CE9-\u1CEC\u1CEE-\u1CF1\u1CF5\u1CF6\u1D00-\u1DBF\u1E00-\u1F15\u1F18-\u1F1D\u1F20-\u1F45\u1F48-\u1F4D\u1F50-\u1F57\u1F59\u1F5B\u1F5D\u1F5F-\u1F7D\u1F80-\u1FB4\u1FB6-\u1FBC\u1FBE\u1FC2-\u1FC4\u1FC6-\u1FCC\u1FD0-\u1FD3\u1FD6-\u1FDB\u1FE0-\u1FEC\u1FF2-\u1FF4\u1FF6-\u1FFC\u2071\u207F\u2090-\u209C\u2102\u2107\u210A-\u2113\u2115\u2119-\u211D\u2124\u2126\u2128\u212A-\u212D\u212F-\u2139\u213C-\u213F\u2145-\u2149\u214E\u2183\u2184\u2C00-\u2C2E\u2C30-\u2C5E\u2C60-\u2CE4\u2CEB-\u2CEE\u2CF2\u2CF3\u2D00-\u2D25\u2D27\u2D2D\u2D30-\u2D67\u2D6F\u2D80-\u2D96\u2DA0-\u2DA6\u2DA8-\u2DAE\u2DB0-\u2DB6\u2DB8-\u2DBE\u2DC0-\u2DC6\u2DC8-\u2DCE\u2DD0-\u2DD6\u2DD8-\u2DDE\u2E2F\u3005\u3006\u3031-\u3035\u303B\u303C\u3041-\u3096\u309D-\u309F\u30A1-\u30FA\u30FC-\u30FF\u3105-\u312D\u3131-\u318E\u31A0-\u31BA\u31F0-\u31FF\u3400-\u4DB5\u4E00-\u9FD5\uA000-\uA48C\uA4D0-\uA4FD\uA500-\uA60C\uA610-\uA61F\uA62A\uA62B\uA640-\uA66E\uA67F-\uA69D\uA6A0-\uA6E5\uA717-\uA71F\uA722-\uA788\uA78B-\uA7AE\uA7B0-\uA7B7\uA7F7-\uA801\uA803-\uA805\uA807-\uA80A\uA80C-\uA822\uA840-\uA873\uA882-\uA8B3\uA8F2-\uA8F7\uA8FB\uA8FD\uA90A-\uA925\uA930-\uA946\uA960-\uA97C\uA984-\uA9B2\uA9CF\uA9E0-\uA9E4\uA9E6-\uA9EF\uA9FA-\uA9FE\uAA00-\uAA28\uAA40-\uAA42\uAA44-\uAA4B\uAA60-\uAA76\uAA7A\uAA7E-\uAAAF\uAAB1\uAAB5\uAAB6\uAAB9-\uAABD\uAAC0\uAAC2\uAADB-\uAADD\uAAE0-\uAAEA\uAAF2-\uAAF4\uAB01-\uAB06\uAB09-\uAB0E\uAB11-\uAB16\uAB20-\uAB26\uAB28-\uAB2E\uAB30-\uAB5A\uAB5C-\uAB65\uAB70-\uABE2\uAC00-\uD7A3\uD7B0-\uD7C6\uD7CB-\uD7FB\uF900-\uFA6D\uFA70-\uFAD9\uFB00-\uFB06\uFB13-\uFB17\uFB1D\uFB1F-\uFB28\uFB2A-\uFB36\uFB38-\uFB3C\uFB3E\uFB40\uFB41\uFB43\uFB44\uFB46-\uFBB1\uFBD3-\uFD3D\uFD50-\uFD8F\uFD92-\uFDC7\uFDF0-\uFDFB\uFE70-\uFE74\uFE76-\uFEFC\uFF21-\uFF3A\uFF41-\uFF5A\uFF66-\uFFBE\uFFC2-\uFFC7\uFFCA-\uFFCF\uFFD2-\uFFD7\uFFDA-\uFFDC/.source,vO=mO+/\u2700-\u27bf\udde6-\uddff\ud800-\udbff\udc00-\udfff\ufe0e\ufe0f\u0300-\u036f\ufe20-\ufe23\u20d0-\u20f0\ud83c\udffb-\udfff\u200d\u3299\u3297\u303d\u3030\u24c2\ud83c\udd70-\udd71\udd7e-\udd7f\udd8e\udd91-\udd9a\udde6-\uddff\ude01-\ude02\ude1a\ude2f\ude32-\ude3a\ude50-\ude51\u203c\u2049\u25aa-\u25ab\u25b6\u25c0\u25fb-\u25fe\u00a9\u00ae\u2122\u2139\udc04\u2600-\u26FF\u2b05\u2b06\u2b07\u2b1b\u2b1c\u2b50\u2b55\u231a\u231b\u2328\u23cf\u23e9-\u23f3\u23f8-\u23fa\udccf\u2935\u2934\u2190-\u21ff/.source+/\u0300-\u036F\u0483-\u0489\u0591-\u05BD\u05BF\u05C1\u05C2\u05C4\u05C5\u05C7\u0610-\u061A\u064B-\u065F\u0670\u06D6-\u06DC\u06DF-\u06E4\u06E7\u06E8\u06EA-\u06ED\u0711\u0730-\u074A\u07A6-\u07B0\u07EB-\u07F3\u0816-\u0819\u081B-\u0823\u0825-\u0827\u0829-\u082D\u0859-\u085B\u08D4-\u08E1\u08E3-\u0903\u093A-\u093C\u093E-\u094F\u0951-\u0957\u0962\u0963\u0981-\u0983\u09BC\u09BE-\u09C4\u09C7\u09C8\u09CB-\u09CD\u09D7\u09E2\u09E3\u0A01-\u0A03\u0A3C\u0A3E-\u0A42\u0A47\u0A48\u0A4B-\u0A4D\u0A51\u0A70\u0A71\u0A75\u0A81-\u0A83\u0ABC\u0ABE-\u0AC5\u0AC7-\u0AC9\u0ACB-\u0ACD\u0AE2\u0AE3\u0B01-\u0B03\u0B3C\u0B3E-\u0B44\u0B47\u0B48\u0B4B-\u0B4D\u0B56\u0B57\u0B62\u0B63\u0B82\u0BBE-\u0BC2\u0BC6-\u0BC8\u0BCA-\u0BCD\u0BD7\u0C00-\u0C03\u0C3E-\u0C44\u0C46-\u0C48\u0C4A-\u0C4D\u0C55\u0C56\u0C62\u0C63\u0C81-\u0C83\u0CBC\u0CBE-\u0CC4\u0CC6-\u0CC8\u0CCA-\u0CCD\u0CD5\u0CD6\u0CE2\u0CE3\u0D01-\u0D03\u0D3E-\u0D44\u0D46-\u0D48\u0D4A-\u0D4D\u0D57\u0D62\u0D63\u0D82\u0D83\u0DCA\u0DCF-\u0DD4\u0DD6\u0DD8-\u0DDF\u0DF2\u0DF3\u0E31\u0E34-\u0E3A\u0E47-\u0E4E\u0EB1\u0EB4-\u0EB9\u0EBB\u0EBC\u0EC8-\u0ECD\u0F18\u0F19\u0F35\u0F37\u0F39\u0F3E\u0F3F\u0F71-\u0F84\u0F86\u0F87\u0F8D-\u0F97\u0F99-\u0FBC\u0FC6\u102B-\u103E\u1056-\u1059\u105E-\u1060\u1062-\u1064\u1067-\u106D\u1071-\u1074\u1082-\u108D\u108F\u109A-\u109D\u135D-\u135F\u1712-\u1714\u1732-\u1734\u1752\u1753\u1772\u1773\u17B4-\u17D3\u17DD\u180B-\u180D\u1885\u1886\u18A9\u1920-\u192B\u1930-\u193B\u1A17-\u1A1B\u1A55-\u1A5E\u1A60-\u1A7C\u1A7F\u1AB0-\u1ABE\u1B00-\u1B04\u1B34-\u1B44\u1B6B-\u1B73\u1B80-\u1B82\u1BA1-\u1BAD\u1BE6-\u1BF3\u1C24-\u1C37\u1CD0-\u1CD2\u1CD4-\u1CE8\u1CED\u1CF2-\u1CF4\u1CF8\u1CF9\u1DC0-\u1DF5\u1DFB-\u1DFF\u20D0-\u20F0\u2CEF-\u2CF1\u2D7F\u2DE0-\u2DFF\u302A-\u302F\u3099\u309A\uA66F-\uA672\uA674-\uA67D\uA69E\uA69F\uA6F0\uA6F1\uA802\uA806\uA80B\uA823-\uA827\uA880\uA881\uA8B4-\uA8C5\uA8E0-\uA8F1\uA926-\uA92D\uA947-\uA953\uA980-\uA983\uA9B3-\uA9C0\uA9E5\uAA29-\uAA36\uAA43\uAA4C\uAA4D\uAA7B-\uAA7D\uAAB0\uAAB2-\uAAB4\uAAB7\uAAB8\uAABE\uAABF\uAAC1\uAAEB-\uAAEF\uAAF5\uAAF6\uABE3-\uABEA\uABEC\uABED\uFB1E\uFE00-\uFE0F\uFE20-\uFE2F/.source,vE=/0-9\u0660-\u0669\u06F0-\u06F9\u07C0-\u07C9\u0966-\u096F\u09E6-\u09EF\u0A66-\u0A6F\u0AE6-\u0AEF\u0B66-\u0B6F\u0BE6-\u0BEF\u0C66-\u0C6F\u0CE6-\u0CEF\u0D66-\u0D6F\u0DE6-\u0DEF\u0E50-\u0E59\u0ED0-\u0ED9\u0F20-\u0F29\u1040-\u1049\u1090-\u1099\u17E0-\u17E9\u1810-\u1819\u1946-\u194F\u19D0-\u19D9\u1A80-\u1A89\u1A90-\u1A99\u1B50-\u1B59\u1BB0-\u1BB9\u1C40-\u1C49\u1C50-\u1C59\uA620-\uA629\uA8D0-\uA8D9\uA900-\uA909\uA9D0-\uA9D9\uA9F0-\uA9F9\uAA50-\uAA59\uABF0-\uABF9\uFF10-\uFF19/.source,yO=vO+vE,Ic=vO+vE,Uv=new RegExp("[".concat(Ic,"]")),EO="(?:["+vE+"]{1,3}\\.){3}["+vE+"]{1,3}",GT="["+Ic+"](?:["+Ic+"\\-_]{0,61}["+Ic+"])?",$g=function(n){return"(?=("+GT+"))\\"+n},m0=function(n){return"(?:"+$g(n)+"(?:\\."+$g(n+1)+"){0,126}|"+EO+")"},Jm=(new RegExp("["+Ic+".\\-]*["+Ic+"\\-]"),Uv),VT=/(?:xn--vermgensberatung-pwb|xn--vermgensberater-ctb|xn--clchc0ea0b2g2a9gcd|xn--w4r85el8fhu5dnra|northwesternmutual|travelersinsurance|verm\xf6gensberatung|xn--5su34j936bgsg|xn--bck1b9a5dre4c|xn--mgbah1a3hjkrd|xn--mgbai9azgqp6j|xn--mgberp4a5d4ar|xn--xkc2dl3a5ee0h|verm\xf6gensberater|xn--fzys8d69uvgm|xn--mgba7c0bbn0a|xn--mgbcpq6gpa1a|xn--xkc2al3hye2a|americanexpress|kerryproperties|sandvikcoromant|xn--i1b6b1a6a2e|xn--kcrx77d1x4a|xn--lgbbat1ad8j|xn--mgba3a4f16a|xn--mgbaakc7dvf|xn--mgbc0a9azcg|xn--nqv7fs00ema|americanfamily|bananarepublic|cancerresearch|cookingchannel|kerrylogistics|weatherchannel|xn--54b7fta0cc|xn--6qq986b3xl|xn--80aqecdr1a|xn--b4w605ferd|xn--fiq228c5hs|xn--h2breg3eve|xn--jlq480n2rg|xn--jlq61u9w7b|xn--mgba3a3ejt|xn--mgbaam7a8h|xn--mgbayh7gpa|xn--mgbbh1a71e|xn--mgbca7dzdo|xn--mgbi4ecexp|xn--mgbx4cd0ab|xn--rvc1e0am3e|international|lifeinsurance|travelchannel|wolterskluwer|xn--cckwcxetd|xn--eckvdtc9d|xn--fpcrj9c3d|xn--fzc2c9e2c|xn--h2brj9c8c|xn--tiq49xqyj|xn--yfro4i67o|xn--ygbi2ammx|construction|lplfinancial|scholarships|versicherung|xn--3e0b707e|xn--45br5cyl|xn--4dbrk0ce|xn--80adxhks|xn--80asehdb|xn--8y0a063a|xn--gckr3f0f|xn--mgb9awbf|xn--mgbab2bd|xn--mgbgu82a|xn--mgbpl2fh|xn--mgbt3dhd|xn--mk1bu44c|xn--ngbc5azd|xn--ngbe9e0a|xn--ogbpf8fl|xn--qcka1pmc|accountants|barclaycard|blackfriday|blockbuster|bridgestone|calvinklein|contractors|creditunion|engineering|enterprises|foodnetwork|investments|kerryhotels|lamborghini|motorcycles|olayangroup|photography|playstation|productions|progressive|redumbrella|williamhill|xn--11b4c3d|xn--1ck2e1b|xn--1qqw23a|xn--2scrj9c|xn--3bst00m|xn--3ds443g|xn--3hcrj9c|xn--42c2d9a|xn--45brj9c|xn--55qw42g|xn--6frz82g|xn--80ao21a|xn--9krt00a|xn--cck2b3b|xn--czr694b|xn--d1acj3b|xn--efvy88h|xn--fct429k|xn--fjq720a|xn--flw351e|xn--g2xx48c|xn--gecrj9c|xn--gk3at1e|xn--h2brj9c|xn--hxt814e|xn--imr513n|xn--j6w193g|xn--jvr189m|xn--kprw13d|xn--kpry57d|xn--mgbbh1a|xn--mgbtx2b|xn--mix891f|xn--nyqy26a|xn--otu796d|xn--pgbs0dh|xn--q9jyb4c|xn--rhqv96g|xn--rovu88b|xn--s9brj9c|xn--ses554g|xn--t60b56a|xn--vuq861b|xn--w4rs40l|xn--xhq521b|xn--zfr164b|\u0b9a\u0bbf\u0b99\u0bcd\u0b95\u0baa\u0bcd\u0baa\u0bc2\u0bb0\u0bcd|accountant|apartments|associates|basketball|bnpparibas|boehringer|capitalone|consulting|creditcard|cuisinella|eurovision|extraspace|foundation|healthcare|immobilien|industries|management|mitsubishi|nextdirect|properties|protection|prudential|realestate|republican|restaurant|schaeffler|tatamotors|technology|university|vlaanderen|volkswagen|xn--30rr7y|xn--3pxu8k|xn--45q11c|xn--4gbrim|xn--55qx5d|xn--5tzm5g|xn--80aswg|xn--90a3ac|xn--9dbq2a|xn--9et52u|xn--c2br7g|xn--cg4bki|xn--czrs0t|xn--czru2d|xn--fiq64b|xn--fiqs8s|xn--fiqz9s|xn--io0a7i|xn--kput3i|xn--mxtq1m|xn--o3cw4h|xn--pssy2u|xn--q7ce6a|xn--unup4y|xn--wgbh1c|xn--wgbl6a|xn--y9a3aq|accenture|alfaromeo|allfinanz|amsterdam|analytics|aquarelle|barcelona|bloomberg|christmas|community|directory|education|equipment|fairwinds|financial|firestone|fresenius|frontdoor|furniture|goldpoint|hisamitsu|homedepot|homegoods|homesense|institute|insurance|kuokgroup|lancaster|landrover|lifestyle|marketing|marshalls|melbourne|microsoft|panasonic|passagens|pramerica|richardli|shangrila|solutions|statebank|statefarm|stockholm|travelers|vacations|xn--90ais|xn--c1avg|xn--d1alf|xn--e1a4c|xn--fhbei|xn--j1aef|xn--j1amh|xn--l1acc|xn--ngbrx|xn--nqv7f|xn--p1acf|xn--qxa6a|xn--tckwe|xn--vhquv|yodobashi|\u0645\u0648\u0631\u064a\u062a\u0627\u0646\u064a\u0627|abudhabi|airforce|allstate|attorney|barclays|barefoot|bargains|baseball|boutique|bradesco|broadway|brussels|builders|business|capetown|catering|catholic|cipriani|cityeats|cleaning|clinique|clothing|commbank|computer|delivery|deloitte|democrat|diamonds|discount|discover|download|engineer|ericsson|etisalat|exchange|feedback|fidelity|firmdale|football|frontier|goodyear|grainger|graphics|guardian|hdfcbank|helsinki|holdings|hospital|infiniti|ipiranga|istanbul|jpmorgan|lighting|lundbeck|marriott|maserati|mckinsey|memorial|merckmsd|mortgage|observer|partners|pharmacy|pictures|plumbing|property|redstone|reliance|saarland|samsclub|security|services|shopping|showtime|softbank|software|stcgroup|supplies|training|vanguard|ventures|verisign|woodside|xn--90ae|xn--node|xn--p1ai|xn--qxam|yokohama|\u0627\u0644\u0633\u0639\u0648\u062f\u064a\u0629|abogado|academy|agakhan|alibaba|android|athleta|auction|audible|auspost|avianca|banamex|bauhaus|bentley|bestbuy|booking|brother|bugatti|capital|caravan|careers|channel|charity|chintai|citadel|clubmed|college|cologne|comcast|company|compare|contact|cooking|corsica|country|coupons|courses|cricket|cruises|dentist|digital|domains|exposed|express|farmers|fashion|ferrari|ferrero|finance|fishing|fitness|flights|florist|flowers|forsale|frogans|fujitsu|gallery|genting|godaddy|grocery|guitars|hamburg|hangout|hitachi|holiday|hosting|hoteles|hotmail|hyundai|ismaili|jewelry|juniper|kitchen|komatsu|lacaixa|lanxess|lasalle|latrobe|leclerc|limited|lincoln|markets|monster|netbank|netflix|network|neustar|okinawa|oldnavy|organic|origins|philips|pioneer|politie|realtor|recipes|rentals|reviews|rexroth|samsung|sandvik|schmidt|schwarz|science|shiksha|singles|staples|storage|support|surgery|systems|temasek|theater|theatre|tickets|tiffany|toshiba|trading|walmart|wanggou|watches|weather|website|wedding|whoswho|windows|winners|xfinity|yamaxun|youtube|zuerich|\u043a\u0430\u0442\u043e\u043b\u0438\u043a|\u0627\u062a\u0635\u0627\u0644\u0627\u062a|\u0627\u0644\u0628\u062d\u0631\u064a\u0646|\u0627\u0644\u062c\u0632\u0627\u0626\u0631|\u0627\u0644\u0639\u0644\u064a\u0627\u0646|\u067e\u0627\u06a9\u0633\u062a\u0627\u0646|\u0643\u0627\u062b\u0648\u0644\u064a\u0643|\u0b87\u0ba8\u0bcd\u0ba4\u0bbf\u0baf\u0bbe|abarth|abbott|abbvie|africa|agency|airbus|airtel|alipay|alsace|alstom|amazon|anquan|aramco|author|bayern|beauty|berlin|bharti|bostik|boston|broker|camera|career|casino|center|chanel|chrome|church|circle|claims|clinic|coffee|comsec|condos|coupon|credit|cruise|dating|datsun|dealer|degree|dental|design|direct|doctor|dunlop|dupont|durban|emerck|energy|estate|events|expert|family|flickr|futbol|gallup|garden|george|giving|global|google|gratis|health|hermes|hiphop|hockey|hotels|hughes|imamat|insure|intuit|jaguar|joburg|juegos|kaufen|kinder|kindle|kosher|lancia|latino|lawyer|lefrak|living|locker|london|luxury|madrid|maison|makeup|market|mattel|mobile|monash|mormon|moscow|museum|mutual|nagoya|natura|nissan|nissay|norton|nowruz|office|olayan|online|oracle|orange|otsuka|pfizer|photos|physio|pictet|quebec|racing|realty|reisen|repair|report|review|rocher|rogers|ryukyu|safety|sakura|sanofi|school|schule|search|secure|select|shouji|soccer|social|stream|studio|supply|suzuki|swatch|sydney|taipei|taobao|target|tattoo|tennis|tienda|tjmaxx|tkmaxx|toyota|travel|unicom|viajes|viking|villas|virgin|vision|voting|voyage|vuelos|walter|webcam|xihuan|yachts|yandex|zappos|\u043c\u043e\u0441\u043a\u0432\u0430|\u043e\u043d\u043b\u0430\u0439\u043d|\u0627\u0628\u0648\u0638\u0628\u064a|\u0627\u0631\u0627\u0645\u0643\u0648|\u0627\u0644\u0627\u0631\u062f\u0646|\u0627\u0644\u0645\u063a\u0631\u0628|\u0627\u0645\u0627\u0631\u0627\u062a|\u0641\u0644\u0633\u0637\u064a\u0646|\u0645\u0644\u064a\u0633\u064a\u0627|\u092d\u093e\u0930\u0924\u092e\u094d|\u0b87\u0bb2\u0b99\u0bcd\u0b95\u0bc8|\u30d5\u30a1\u30c3\u30b7\u30e7\u30f3|actor|adult|aetna|amfam|amica|apple|archi|audio|autos|azure|baidu|beats|bible|bingo|black|boats|bosch|build|canon|cards|chase|cheap|cisco|citic|click|cloud|coach|codes|crown|cymru|dabur|dance|deals|delta|drive|dubai|earth|edeka|email|epson|faith|fedex|final|forex|forum|gallo|games|gifts|gives|glass|globo|gmail|green|gripe|group|gucci|guide|homes|honda|horse|house|hyatt|ikano|irish|jetzt|koeln|kyoto|lamer|lease|legal|lexus|lilly|linde|lipsy|loans|locus|lotte|lotto|macys|mango|media|miami|money|movie|music|nexus|nikon|ninja|nokia|nowtv|omega|osaka|paris|parts|party|phone|photo|pizza|place|poker|praxi|press|prime|promo|quest|radio|rehab|reise|ricoh|rocks|rodeo|rugby|salon|sener|seven|sharp|shell|shoes|skype|sling|smart|smile|solar|space|sport|stada|store|study|style|sucks|swiss|tatar|tires|tirol|tmall|today|tokyo|tools|toray|total|tours|trade|trust|tunes|tushu|ubank|vegas|video|vodka|volvo|wales|watch|weber|weibo|works|world|xerox|yahoo|\u05d9\u05e9\u05e8\u05d0\u05dc|\u0627\u06cc\u0631\u0627\u0646|\u0628\u0627\u0632\u0627\u0631|\u0628\u06be\u0627\u0631\u062a|\u0633\u0648\u062f\u0627\u0646|\u0633\u0648\u0631\u064a\u0629|\u0647\u0645\u0631\u0627\u0647|\u092d\u093e\u0930\u094b\u0924|\u0938\u0902\u0917\u0920\u0928|\u09ac\u09be\u0982\u09b2\u09be|\u0c2d\u0c3e\u0c30\u0c24\u0c4d|\u0d2d\u0d3e\u0d30\u0d24\u0d02|\u5609\u91cc\u5927\u9152\u5e97|aarp|able|adac|aero|akdn|ally|amex|arab|army|arpa|arte|asda|asia|audi|auto|baby|band|bank|bbva|beer|best|bike|bing|blog|blue|bofa|bond|book|buzz|cafe|call|camp|care|cars|casa|case|cash|cbre|cern|chat|citi|city|club|cool|coop|cyou|data|date|dclk|deal|dell|desi|diet|dish|docs|dvag|erni|fage|fail|fans|farm|fast|fiat|fido|film|fire|fish|flir|food|ford|free|fund|game|gbiz|gent|ggee|gift|gmbh|gold|golf|goog|guge|guru|hair|haus|hdfc|help|here|hgtv|host|hsbc|icbc|ieee|imdb|immo|info|itau|java|jeep|jobs|jprs|kddi|kids|kiwi|kpmg|kred|land|lego|lgbt|lidl|life|like|limo|link|live|loan|loft|love|ltda|luxe|maif|meet|meme|menu|mini|mint|mobi|moda|moto|name|navy|news|next|nico|nike|ollo|open|page|pars|pccw|pics|ping|pink|play|plus|pohl|porn|post|prod|prof|qpon|read|reit|rent|rest|rich|room|rsvp|ruhr|safe|sale|sarl|save|saxo|scot|seat|seek|sexy|shaw|shia|shop|show|silk|sina|site|skin|sncf|sohu|song|sony|spot|star|surf|talk|taxi|team|tech|teva|tiaa|tips|town|toys|tube|vana|visa|viva|vivo|vote|voto|wang|weir|wien|wiki|wine|work|xbox|yoga|zara|zero|zone|\u0434\u0435\u0442\u0438|\u0441\u0430\u0439\u0442|\u0628\u0627\u0631\u062a|\u0628\u064a\u062a\u0643|\u0680\u0627\u0631\u062a|\u062a\u0648\u0646\u0633|\u0634\u0628\u0643\u0629|\u0639\u0631\u0627\u0642|\u0639\u0645\u0627\u0646|\u0645\u0648\u0642\u0639|\u092d\u093e\u0930\u0924|\u09ad\u09be\u09b0\u09a4|\u09ad\u09be\u09f0\u09a4|\u0a2d\u0a3e\u0a30\u0a24|\u0aad\u0abe\u0ab0\u0aa4|\u0b2d\u0b3e\u0b30\u0b24|\u0cad\u0cbe\u0cb0\u0ca4|\u0dbd\u0d82\u0d9a\u0dcf|\u30a2\u30de\u30be\u30f3|\u30b0\u30fc\u30b0\u30eb|\u30af\u30e9\u30a6\u30c9|\u30dd\u30a4\u30f3\u30c8|\u7ec4\u7ec7\u673a\u6784|\u96fb\u8a0a\u76c8\u79d1|\u9999\u683c\u91cc\u62c9|aaa|abb|abc|aco|ads|aeg|afl|aig|anz|aol|app|art|aws|axa|bar|bbc|bbt|bcg|bcn|bet|bid|bio|biz|bms|bmw|bom|boo|bot|box|buy|bzh|cab|cal|cam|car|cat|cba|cbn|cbs|ceo|cfa|cfd|com|cpa|crs|dad|day|dds|dev|dhl|diy|dnp|dog|dot|dtv|dvr|eat|eco|edu|esq|eus|fan|fit|fly|foo|fox|frl|ftr|fun|fyi|gal|gap|gay|gdn|gea|gle|gmo|gmx|goo|gop|got|gov|hbo|hiv|hkt|hot|how|ibm|ice|icu|ifm|inc|ing|ink|int|ist|itv|jcb|jio|jll|jmp|jnj|jot|joy|kfh|kia|kim|kpn|krd|lat|law|lds|llc|llp|lol|lpl|ltd|man|map|mba|med|men|mil|mit|mlb|mls|mma|moe|moi|mom|mov|msd|mtn|mtr|nab|nba|nec|net|new|nfl|ngo|nhk|now|nra|nrw|ntt|nyc|obi|one|ong|onl|ooo|org|ott|ovh|pay|pet|phd|pid|pin|pnc|pro|pru|pub|pwc|red|ren|ril|rio|rip|run|rwe|sap|sas|sbi|sbs|sca|scb|ses|sew|sex|sfr|ski|sky|soy|spa|srl|stc|tab|tax|tci|tdk|tel|thd|tjx|top|trv|tui|tvs|ubs|uno|uol|ups|vet|vig|vin|vip|wed|win|wme|wow|wtc|wtf|xin|xxx|xyz|you|yun|zip|\u0431\u0435\u043b|\u043a\u043e\u043c|\u049b\u0430\u0437|\u043c\u043a\u0434|\u043c\u043e\u043d|\u043e\u0440\u0433|\u0440\u0443\u0441|\u0441\u0440\u0431|\u0443\u043a\u0440|\u0570\u0561\u0575|\u05e7\u05d5\u05dd|\u0639\u0631\u0628|\u0642\u0637\u0631|\u0643\u0648\u0645|\u0645\u0635\u0631|\u0915\u0949\u092e|\u0928\u0947\u091f|\u0e04\u0e2d\u0e21|\u0e44\u0e17\u0e22|\u0ea5\u0eb2\u0ea7|\u30b9\u30c8\u30a2|\u30bb\u30fc\u30eb|\u307f\u3093\u306a|\u4e2d\u6587\u7f51|\u4e9a\u9a6c\u900a|\u5929\u4e3b\u6559|\u6211\u7231\u4f60|\u65b0\u52a0\u5761|\u6de1\u9a6c\u9521|\u8bfa\u57fa\u4e9a|\u98de\u5229\u6d66|ac|ad|ae|af|ag|ai|al|am|ao|aq|ar|as|at|au|aw|ax|az|ba|bb|bd|be|bf|bg|bh|bi|bj|bm|bn|bo|br|bs|bt|bv|bw|by|bz|ca|cc|cd|cf|cg|ch|ci|ck|cl|cm|cn|co|cr|cu|cv|cw|cx|cy|cz|de|dj|dk|dm|do|dz|ec|ee|eg|er|es|et|eu|fi|fj|fk|fm|fo|fr|ga|gb|gd|ge|gf|gg|gh|gi|gl|gm|gn|gp|gq|gr|gs|gt|gu|gw|gy|hk|hm|hn|hr|ht|hu|id|ie|il|im|in|io|iq|ir|is|it|je|jm|jo|jp|ke|kg|kh|ki|km|kn|kp|kr|kw|ky|kz|la|lb|lc|li|lk|lr|ls|lt|lu|lv|ly|ma|mc|md|me|mg|mh|mk|ml|mm|mn|mo|mp|mq|mr|ms|mt|mu|mv|mw|mx|my|mz|na|nc|ne|nf|ng|ni|nl|no|np|nr|nu|nz|om|pa|pe|pf|pg|ph|pk|pl|pm|pn|pr|ps|pt|pw|py|qa|re|ro|rs|ru|rw|sa|sb|sc|sd|se|sg|sh|si|sj|sk|sl|sm|sn|so|sr|ss|st|su|sv|sx|sy|sz|tc|td|tf|tg|th|tj|tk|tl|tm|tn|to|tr|tt|tv|tw|tz|ua|ug|uk|us|uy|uz|va|vc|ve|vg|vi|vn|vu|wf|ws|ye|yt|za|zm|zw|\u03b5\u03bb|\u03b5\u03c5|\u0431\u0433|\u0435\u044e|\u0440\u0444|\u10d2\u10d4|\ub2f7\ub137|\ub2f7\ucef4|\uc0bc\uc131|\ud55c\uad6d|\u30b3\u30e0|\u4e16\u754c|\u4e2d\u4fe1|\u4e2d\u56fd|\u4e2d\u570b|\u4f01\u4e1a|\u4f5b\u5c71|\u4fe1\u606f|\u5065\u5eb7|\u516b\u5366|\u516c\u53f8|\u516c\u76ca|\u53f0\u6e7e|\u53f0\u7063|\u5546\u57ce|\u5546\u5e97|\u5546\u6807|\u5609\u91cc|\u5728\u7ebf|\u5927\u62ff|\u5a31\u4e50|\u5bb6\u96fb|\u5e7f\u4e1c|\u5fae\u535a|\u6148\u5584|\u624b\u673a|\u62db\u8058|\u653f\u52a1|\u653f\u5e9c|\u65b0\u95fb|\u65f6\u5c1a|\u66f8\u7c4d|\u673a\u6784|\u6e38\u620f|\u6fb3\u9580|\u70b9\u770b|\u79fb\u52a8|\u7f51\u5740|\u7f51\u5e97|\u7f51\u7ad9|\u7f51\u7edc|\u8054\u901a|\u8c37\u6b4c|\u8d2d\u7269|\u901a\u8ca9|\u96c6\u56e2|\u98df\u54c1|\u9910\u5385|\u9999\u6e2f)/,yE=new RegExp("[".concat(Ic,"!#$%&'*+/=?^_`{|}~-]")),EE=new RegExp("^".concat(VT.source,"$")),Yv=function(n){function s(){var t=null!==n&&n.apply(this,arguments)||this;return t.localPartCharRegex=yE,t.strictTldRegex=EE,t}return(0,j.ZT)(s,n),s.prototype.parseMatches=function(t){for(var o=this.tagBuilder,l=this.localPartCharRegex,_=this.strictTldRegex,M=[],w=t.length,N=new bE,V={m:"a",a:"i",i:"l",l:"t",t:"o",o:":"},X=0,re=0,oe=N;X<w;){var fe=t.charAt(X);switch(re){case 0:"m"===(It=fe)?xt(1):l.test(It)&&xt();break;case 1:Pe(t.charAt(X-1),fe);break;case 2:De(fe);break;case 3:Ie(fe);break;case 4:Ae(fe);break;case 5:Y(fe);break;case 6:Et(fe);break;case 7:ft(fe);break;default:Bv(re)}X++}var It;return yn(),M;function Pe(It,In){":"===It?l.test(In)?(re=2,oe=new bE((0,j.pi)((0,j.pi)({},oe),{hasMailtoPrefix:!0}))):Ht():V[It]===In||(l.test(In)?re=2:"."===In?re=3:"@"===In?re=4:Ht())}function De(It){"."===It?re=3:"@"===It?re=4:l.test(It)||Ht()}function Ie(It){"."===It||"@"===It?Ht():l.test(It)?re=2:Ht()}function Ae(It){Jm.test(It)?re=5:Ht()}function Y(It){"."===It?re=7:"-"===It?re=6:Jm.test(It)||yn()}function Et(It){"-"===It||"."===It?yn():Jm.test(It)?re=5:yn()}function ft(It){"."===It||"-"===It?yn():Jm.test(It)?(re=5,oe=new bE((0,j.pi)((0,j.pi)({},oe),{hasDomainDot:!0}))):yn()}function xt(It){void 0===It&&(It=2),re=It,oe=new bE({idx:X})}function Ht(){re=0,oe=N}function yn(){if(oe.hasDomainDot){var It=t.slice(oe.idx,X);/[-.]$/.test(It)&&(It=It.slice(0,-1));var In=oe.hasMailtoPrefix?It.slice(7):It;(function On(Yr){var Hr=(Yr.split(".").pop()||"").toLowerCase();return _.test(Hr)})(In)&&M.push(new hE({tagBuilder:o,matchedText:It,offset:oe.idx,email:In}))}Ht()}},s}(Wm),bE=function n(s){void 0===s&&(s={}),this.idx=void 0!==s.idx?s.idx:-1,this.hasMailtoPrefix=!!s.hasMailtoPrefix,this.hasDomainDot=!!s.hasDomainDot},DD=function(){function n(){}return n.isValid=function(s,t){return!(t&&!this.isValidUriScheme(t)||this.urlMatchDoesNotHaveProtocolOrDot(s,t)||this.urlMatchDoesNotHaveAtLeastOneWordChar(s,t)&&!this.isValidIpAddress(s)||this.containsMultipleDots(s))},n.isValidIpAddress=function(s){var t=new RegExp(this.hasFullProtocolRegex.source+this.ipRegex.source);return null!==s.match(t)},n.containsMultipleDots=function(s){var t=s;return this.hasFullProtocolRegex.test(s)&&(t=s.split("://")[1]),t.split("/")[0].indexOf("..")>-1},n.isValidUriScheme=function(s){var t=s.match(this.uriSchemeRegex),o=t&&t[0].toLowerCase();return"javascript:"!==o&&"vbscript:"!==o},n.urlMatchDoesNotHaveProtocolOrDot=function(s,t){return!(!s||t&&this.hasFullProtocolRegex.test(t)||-1!==s.indexOf("."))},n.urlMatchDoesNotHaveAtLeastOneWordChar=function(s,t){return!(!s||!t||this.hasFullProtocolRegex.test(t)||this.hasWordCharAfterProtocolRegex.test(s))},n.hasFullProtocolRegex=/^[A-Za-z][-.+A-Za-z0-9]*:\/\//,n.uriSchemeRegex=/^[A-Za-z][-.+A-Za-z0-9]*:/,n.hasWordCharAfterProtocolRegex=new RegExp(":[^\\s]*?["+mO+"]"),n.ipRegex=/[0-9][0-9]?[0-9]?\.[0-9][0-9]?[0-9]?\.[0-9][0-9]?[0-9]?\.[0-9][0-9]?[0-9]?(:[0-9]*)?\/?$/,n}(),wD=(t=new RegExp("[/?#](?:["+Ic+"\\-+&@#/%=~_()|'$*\\[\\]{}?!:,.;^\u2713]*["+Ic+"\\-+&@#/%=~_()|'$*\\[\\]{}\u2713])?"),new RegExp(["(?:","(",/(?:[A-Za-z][-.+A-Za-z0-9]{0,63}:(?![A-Za-z][-.+A-Za-z0-9]{0,63}:\/\/)(?!\d+\/?)(?:\/\/)?)/.source,m0(2),")","|","(","(//)?",/(?:www\.)/.source,m0(6),")","|","(","(//)?",m0(10)+"\\.",VT.source,"(?![-"+yO+"])",")",")","(?::[0-9]+)?","(?:"+t.source+")?"].join(""),"gi")),xD=new RegExp("["+Ic+"]"),SE=function(n){function s(t){var o=n.call(this,t)||this;return o.stripPrefix={scheme:!0,www:!0},o.stripTrailingSlash=!0,o.decodePercentEncoding=!0,o.matcherRegex=wD,o.wordCharRegExp=xD,o.stripPrefix=t.stripPrefix,o.stripTrailingSlash=t.stripTrailingSlash,o.decodePercentEncoding=t.decodePercentEncoding,o}return(0,j.ZT)(s,n),s.prototype.parseMatches=function(t){for(var V,o=this.matcherRegex,l=this.stripPrefix,_=this.stripTrailingSlash,M=this.decodePercentEncoding,w=this.tagBuilder,N=[],X=function(){var oe=V[0],fe=V[1],ve=V[4],Ie=V.index,Ae=V[5]||V[9],Y=t.charAt(Ie-1);if(!DD.isValid(oe,fe)||Ie>0&&"@"===Y||Ie>0&&Ae&&re.wordCharRegExp.test(Y))return"continue";if(/\?$/.test(oe)&&(oe=oe.substr(0,oe.length-1)),re.matchHasUnbalancedClosingParen(oe))oe=oe.substr(0,oe.length-1);else{var Et=re.matchHasInvalidCharAfterTld(oe,fe);Et>-1&&(oe=oe.substr(0,Et))}var ft=["http://","https://"].find(function(It){return!!fe&&-1!==fe.indexOf(It)});if(ft){var xt=oe.indexOf(ft);oe=oe.substr(xt),fe=fe.substr(xt),Ie+=xt}N.push(new UT({tagBuilder:w,matchedText:oe,offset:Ie,urlMatchType:fe?"scheme":ve?"www":"tld",url:oe,protocolUrlMatch:!!fe,protocolRelativeMatch:!!Ae,stripPrefix:l,stripTrailingSlash:_,decodePercentEncoding:M}))},re=this;null!==(V=o.exec(t));)X();return N},s.prototype.matchHasUnbalancedClosingParen=function(t){var l,o=t.charAt(t.length-1);if(")"===o)l="(";else if("]"===o)l="[";else{if("}"!==o)return!1;l="{"}for(var _=0,M=0,w=t.length-1;M<w;M++){var N=t.charAt(M);N===l?_++:N===o&&(_=Math.max(_-1,0))}return 0===_},s.prototype.matchHasInvalidCharAfterTld=function(t,o){if(!t)return-1;var l=0;o&&(l=t.indexOf(":"),t=t.slice(l));var M=new RegExp("^((.?//)?[-."+Ic+"]*[-"+Ic+"]\\.[-"+Ic+"]+)").exec(t);return null===M?-1:(l+=M[1].length,t=t.slice(M[1].length),/^[^-.A-Za-z0-9:\/?#]/.test(t)?l:-1)},s}(Wm),ZT=new RegExp("[_".concat(Ic,"]")),WT=function(n){function s(t){var o=n.call(this,t)||this;return o.serviceName="twitter",o.serviceName=t.serviceName,o}return(0,j.ZT)(s,n),s.prototype.parseMatches=function(t){for(var o=this.tagBuilder,l=this.serviceName,_=[],M=t.length,w=0,N=-1,V=0;w<M;){var X=t.charAt(w);switch(V){case 0:"#"===(De=X)?(V=2,N=w):Uv.test(De)&&(V=1);break;case 1:oe(X);break;case 2:fe(X);break;case 3:ve(X);break;default:Bv(V)}w++}var De;return Pe(),_;function oe(De){Uv.test(De)||(V=0)}function fe(De){V=ZT.test(De)?3:Uv.test(De)?1:0}function ve(De){ZT.test(De)||(Pe(),N=-1,V=Uv.test(De)?1:0)}function Pe(){if(N>-1&&w-N<=140){var De=t.slice(N,w),Ie=new BT({tagBuilder:o,matchedText:De,offset:N,serviceName:l,hashtag:De.slice(1)});_.push(Ie)}}},s}(Wm),bO=["twitter","facebook","instagram","tiktok"],QT=new RegExp("".concat(/(?:(?:(?:(\+)?\d{1,3}[-\040.]?)?\(?\d{3}\)?[-\040.]?\d{3}[-\040.]?\d{4})|(?:(\+)(?:9[976]\d|8[987530]\d|6[987]\d|5[90]\d|42\d|3[875]\d|2[98654321]\d|9[8543210]|8[6421]|6[6543210]|5[87654321]|4[987654310]|3[9643210]|2[70]|7|1)[-\040.]?(?:\d[-\040.]?){6,12}\d+))([,;]+[0-9]+#?)*/.source,"|").concat(/(0([1-9]{1}-?[1-9]\d{3}|[1-9]{2}-?\d{3}|[1-9]{2}\d{1}-?\d{2}|[1-9]{2}\d{2}-?\d{1})-?\d{4}|0[789]0-?\d{4}-?\d{4}|050-?\d{4}-?\d{4})/.source),"g"),TE=function(n){function s(){var t=null!==n&&n.apply(this,arguments)||this;return t.matcherRegex=QT,t}return(0,j.ZT)(s,n),s.prototype.parseMatches=function(t){for(var M,o=this.matcherRegex,l=this.tagBuilder,_=[];null!==(M=o.exec(t));){var w=M[0],N=w.replace(/[^0-9,;#]/g,""),V=!(!M[1]&&!M[2]),X=0==M.index?"":t.substr(M.index-1,1),re=t.substr(M.index+w.length,1),oe=!X.match(/\d/)&&!re.match(/\d/);this.testMatch(M[3])&&this.testMatch(w)&&oe&&_.push(new gE({tagBuilder:l,matchedText:w,offset:M.index,number:N,plusSign:V}))}return _},s.prototype.testMatch=function(t){return jT.test(t)},s}(Wm),TO=new RegExp("@[_".concat(Ic,"]{1,50}(?![_").concat(Ic,"])"),"g"),CO=new RegExp("@[_.".concat(Ic,"]{1,30}(?![_").concat(Ic,"])"),"g"),KT=new RegExp("@[-_.".concat(Ic,"]{1,50}(?![-_").concat(Ic,"])"),"g"),CE=new RegExp("@[_.".concat(Ic,"]{1,23}[_").concat(Ic,"](?![_").concat(Ic,"])"),"g"),RD=new RegExp("[^"+Ic+"]"),ME=function(n){function s(t){var o=n.call(this,t)||this;return o.serviceName="twitter",o.matcherRegexes={twitter:TO,instagram:CO,soundcloud:KT,tiktok:CE},o.nonWordCharRegex=RD,o.serviceName=t.serviceName,o}return(0,j.ZT)(s,n),s.prototype.parseMatches=function(t){var N,o=this.serviceName,l=this.matcherRegexes[this.serviceName],_=this.nonWordCharRegex,M=this.tagBuilder,w=[];if(!l)return w;for(;null!==(N=l.exec(t));){var V=N.index,X=t.charAt(V-1);if(0===V||_.test(X)){var re=N[0].replace(/\.+$/g,""),oe=re.slice(1);w.push(new _E({tagBuilder:M,matchedText:re,offset:V,serviceName:o,mention:oe}))}}return w},s}(Wm);var K_=function n(s){void 0===s&&(s={}),this.idx=void 0!==s.idx?s.idx:-1,this.type=s.type||"tag",this.name=s.name||"",this.isOpening=!!s.isOpening,this.isClosing=!!s.isClosing},MO=function(){function n(s){void 0===s&&(s={}),this.version=n.version,this.urls={},this.email=!0,this.phone=!0,this.hashtag=!1,this.mention=!1,this.newWindow=!0,this.stripPrefix={scheme:!0,www:!0},this.stripTrailingSlash=!0,this.decodePercentEncoding=!0,this.truncate={length:0,location:"end"},this.className="",this.replaceFn=null,this.context=void 0,this.sanitizeHtml=!1,this.matchers=null,this.tagBuilder=null,this.urls=this.normalizeUrlsCfg(s.urls),this.email="boolean"==typeof s.email?s.email:this.email,this.phone="boolean"==typeof s.phone?s.phone:this.phone,this.hashtag=s.hashtag||this.hashtag,this.mention=s.mention||this.mention,this.newWindow="boolean"==typeof s.newWindow?s.newWindow:this.newWindow,this.stripPrefix=this.normalizeStripPrefixCfg(s.stripPrefix),this.stripTrailingSlash="boolean"==typeof s.stripTrailingSlash?s.stripTrailingSlash:this.stripTrailingSlash,this.decodePercentEncoding="boolean"==typeof s.decodePercentEncoding?s.decodePercentEncoding:this.decodePercentEncoding,this.sanitizeHtml=s.sanitizeHtml||!1;var t=this.mention;if(!1!==t&&-1===["twitter","instagram","soundcloud","tiktok"].indexOf(t))throw new Error("invalid `mention` cfg '".concat(t,"' - see docs"));var o=this.hashtag;if(!1!==o&&-1===bO.indexOf(o))throw new Error("invalid `hashtag` cfg '".concat(o,"' - see docs"));this.truncate=this.normalizeTruncateCfg(s.truncate),this.className=s.className||this.className,this.replaceFn=s.replaceFn||this.replaceFn,this.context=s.context||this}return n.link=function(s,t){return new n(t).link(s)},n.parse=function(s,t){return new n(t).parse(s)},n.prototype.normalizeUrlsCfg=function(s){return null==s&&(s=!0),"boolean"==typeof s?{schemeMatches:s,wwwMatches:s,tldMatches:s}:{schemeMatches:"boolean"!=typeof s.schemeMatches||s.schemeMatches,wwwMatches:"boolean"!=typeof s.wwwMatches||s.wwwMatches,tldMatches:"boolean"!=typeof s.tldMatches||s.tldMatches}},n.prototype.normalizeStripPrefixCfg=function(s){return null==s&&(s=!0),"boolean"==typeof s?{scheme:s,www:s}:{scheme:"boolean"!=typeof s.scheme||s.scheme,www:"boolean"!=typeof s.www||s.www}},n.prototype.normalizeTruncateCfg=function(s){return"number"==typeof s?{length:s,location:"end"}:function pO(n,s){for(var t in s)s.hasOwnProperty(t)&&void 0===n[t]&&(n[t]=s[t]);return n}(s||{},{length:Number.POSITIVE_INFINITY,location:"end"})},n.prototype.parse=function(s){var t=this,o=["a","style","script"],l=0,_=[];return function OE(n,s){for(var t=s.onOpenTag,o=s.onCloseTag,l=s.onText,_=s.onComment,M=s.onDoctype,w=new K_,N=0,V=n.length,X=0,re=0,oe=w;N<V;){var fe=n.charAt(N);switch(X){case 0:"<"===fe&&An();break;case 1:"!"===(jr=fe)?X=13:"/"===jr?(X=2,oe=new K_((0,j.pi)((0,j.pi)({},oe),{isClosing:!0}))):"<"===jr?An():YT.test(jr)?(X=3,oe=new K_((0,j.pi)((0,j.pi)({},oe),{isOpening:!0}))):(X=0,oe=w);break;case 2:Ie(fe);break;case 3:De(fe);break;case 4:Ae(fe);break;case 5:Y(fe);break;case 6:Et(fe);break;case 7:ft(fe);break;case 8:xt(fe);break;case 9:Ht(fe);break;case 10:yn(fe);break;case 11:It(fe);break;case 12:In(fe);break;case 13:"--"===n.substr(N,2)?(N+=2,oe=new K_((0,j.pi)((0,j.pi)({},oe),{type:"comment"})),X=14):"DOCTYPE"===n.substr(N,7).toUpperCase()?(N+=7,oe=new K_((0,j.pi)((0,j.pi)({},oe),{type:"doctype"})),X=20):ir();break;case 14:Yr(fe);break;case 15:Ir(fe);break;case 16:Hr(fe);break;case 17:Wr(fe);break;case 18:En(fe);break;case 19:Un(fe);break;case 20:Yn(fe);break;default:Bv(X)}N++}var jr;function De(jr){dm.test(jr)?(oe=new K_((0,j.pi)((0,j.pi)({},oe),{name:Mi()})),X=4):"<"===jr?An():"/"===jr?(oe=new K_((0,j.pi)((0,j.pi)({},oe),{name:Mi()})),X=12):">"===jr?(oe=new K_((0,j.pi)((0,j.pi)({},oe),{name:Mi()})),Lr()):!YT.test(jr)&&!MD.test(jr)&&":"!==jr&&ir()}function Ie(jr){">"===jr?ir():YT.test(jr)?X=3:ir()}function Ae(jr){dm.test(jr)||("/"===jr?X=12:">"===jr?Lr():"<"===jr?An():"="===jr||mE.test(jr)||gO.test(jr)?ir():X=5)}function Y(jr){dm.test(jr)?X=6:"/"===jr?X=12:"="===jr?X=7:">"===jr?Lr():"<"===jr?An():mE.test(jr)&&ir()}function Et(jr){dm.test(jr)||("/"===jr?X=12:"="===jr?X=7:">"===jr?Lr():"<"===jr?An():mE.test(jr)?ir():X=5)}function ft(jr){dm.test(jr)||('"'===jr?X=8:"'"===jr?X=9:/[>=`]/.test(jr)?ir():"<"===jr?An():X=10)}function xt(jr){'"'===jr&&(X=11)}function Ht(jr){"'"===jr&&(X=11)}function yn(jr){dm.test(jr)?X=4:">"===jr?Lr():"<"===jr&&An()}function It(jr){dm.test(jr)?X=4:"/"===jr?X=12:">"===jr?Lr():"<"===jr?An():(X=4,function Yi(){N--}())}function In(jr){">"===jr?(oe=new K_((0,j.pi)((0,j.pi)({},oe),{isClosing:!0})),Lr()):X=4}function Yr(jr){"-"===jr?X=15:">"===jr?ir():X=16}function Ir(jr){"-"===jr?X=18:">"===jr?ir():X=16}function Hr(jr){"-"===jr&&(X=17)}function Wr(jr){X="-"===jr?18:16}function En(jr){">"===jr?Lr():"!"===jr?X=19:"-"===jr||(X=16)}function Un(jr){"-"===jr?X=17:">"===jr?Lr():X=16}function Yn(jr){">"===jr?Lr():"<"===jr&&An()}function ir(){X=0,oe=w}function An(){X=1,oe=new K_({idx:N})}function Lr(){var jr=n.slice(re,oe.idx);jr&&l(jr,re),"comment"===oe.type?_(oe.idx):"doctype"===oe.type?M(oe.idx):(oe.isOpening&&t(oe.name,oe.idx),oe.isClosing&&o(oe.name,oe.idx)),ir(),re=N+1}function Mi(){return n.slice(oe.idx+(oe.isClosing?2:1),N).toLowerCase()}re<N&&function Wi(){var jr=n.slice(re,N);l(jr,re),re=N+1}()}(s,{onOpenTag:function(M){o.indexOf(M)>=0&&l++},onText:function(M,w){if(0===l){var V=function CD(n,s){if(!s.global)throw new Error("`splitRegex` must have the 'g' flag set");for(var l,t=[],o=0;l=s.exec(n);)t.push(n.substring(o,l.index)),t.push(l[0]),o=l.index+l[0].length;return t.push(n.substring(o)),t}(M,/(&nbsp;|&#160;|&lt;|&#60;|&gt;|&#62;|&quot;|&#34;|&#39;)/gi),X=w;V.forEach(function(re,oe){if(oe%2==0){var fe=t.parseText(re,X);_.push.apply(_,fe)}X+=re.length})}},onCloseTag:function(M){o.indexOf(M)>=0&&(l=Math.max(l-1,0))},onComment:function(M){},onDoctype:function(M){}}),_=this.compactMatches(_),_=this.removeUnwantedMatches(_)},n.prototype.compactMatches=function(s){s.sort(function(N,V){return N.getOffset()-V.getOffset()});for(var t=0;t<s.length-1;){var o=s[t],l=o.getOffset(),_=o.getMatchedText().length,M=l+_;if(t+1<s.length){if(s[t+1].getOffset()===l){var w=s[t+1].getMatchedText().length>_?t:t+1;s.splice(w,1);continue}if(s[t+1].getOffset()<M){s.splice(t+1,1);continue}}t++}return s},n.prototype.removeUnwantedMatches=function(s){return this.hashtag||cm(s,function(t){return"hashtag"===t.getType()}),this.email||cm(s,function(t){return"email"===t.getType()}),this.phone||cm(s,function(t){return"phone"===t.getType()}),this.mention||cm(s,function(t){return"mention"===t.getType()}),this.urls.schemeMatches||cm(s,function(t){return"url"===t.getType()&&"scheme"===t.getUrlMatchType()}),this.urls.wwwMatches||cm(s,function(t){return"url"===t.getType()&&"www"===t.getUrlMatchType()}),this.urls.tldMatches||cm(s,function(t){return"url"===t.getType()&&"tld"===t.getUrlMatchType()}),s},n.prototype.parseText=function(s,t){void 0===t&&(t=0),t=t||0;for(var o=this.getMatchers(),l=[],_=0,M=o.length;_<M;_++){for(var w=o[_].parseMatches(s),N=0,V=w.length;N<V;N++)w[N].setOffset(t+w[N].getOffset());l.push.apply(l,w)}return l},n.prototype.link=function(s){if(!s)return"";this.sanitizeHtml&&(s=s.replace(/</g,"&lt;").replace(/>/g,"&gt;"));for(var t=this.parse(s),o=[],l=0,_=0,M=t.length;_<M;_++){var w=t[_];o.push(s.substring(l,w.getOffset())),o.push(this.createMatchReturnVal(w)),l=w.getOffset()+w.getMatchedText().length}return o.push(s.substring(l)),o.join("")},n.prototype.createMatchReturnVal=function(s){var t;return this.replaceFn&&(t=this.replaceFn.call(this.context,s)),"string"==typeof t?t:!1===t?s.getMatchedText():t instanceof _0?t.toAnchorString():s.buildTag().toAnchorString()},n.prototype.getMatchers=function(){if(this.matchers)return this.matchers;var s=this.getTagBuilder(),t=[new WT({tagBuilder:s,serviceName:this.hashtag}),new Yv({tagBuilder:s}),new TE({tagBuilder:s}),new ME({tagBuilder:s,serviceName:this.mention}),new SE({tagBuilder:s,stripPrefix:this.stripPrefix,stripTrailingSlash:this.stripTrailingSlash,decodePercentEncoding:this.decodePercentEncoding})];return this.matchers=t},n.prototype.getTagBuilder=function(){var s=this.tagBuilder;return s||(s=this.tagBuilder=new g0({newWindow:this.newWindow,truncate:this.truncate,className:this.className})),s},n.version="3.16.2",n.AnchorTagBuilder=g0,n.HtmlTag=_0,n.matcher={Email:Yv,Hashtag:WT,Matcher:Wm,Mention:ME,Phone:TE,Url:SE},n.match={Email:hE,Hashtag:BT,Match:kg,Mention:_E,Phone:gE,Url:UT},n}();const ND=MO;var OO=/www|@|\:\/\//;function AO(n){return/^<a[>\s]/i.test(n)}function PD(n){return/^<\/a\s*>/i.test(n)}function ID(){var n=[],s=new ND({stripPrefix:!1,url:!0,email:!0,replaceFn:function(t){switch(t.getType()){case"url":n.push({text:t.matchedText,url:t.getUrl()});break;case"email":n.push({text:t.matchedText,url:"mailto:"+t.getEmail().replace(/^mailto:/i,"")})}return!1}});return{links:n,autolinker:s}}function LD(n){var s,t,o,l,_,M,w,N,V,X,re,ve,Pe,oe=n.tokens,fe=null;for(t=0,o=oe.length;t<o;t++)if("inline"===oe[t].type)for(re=0,s=(l=oe[t].children).length-1;s>=0;s--)if("link_close"!==(_=l[s]).type){if("htmltag"===_.type&&(AO(_.content)&&re>0&&re--,PD(_.content)&&re++),!(re>0)&&"text"===_.type&&OO.test(_.content)){if(fe||(ve=(fe=ID()).links,Pe=fe.autolinker),M=_.content,ve.length=0,Pe.link(M),!ve.length)continue;for(w=[],X=_.level,N=0;N<ve.length;N++)!n.inline.validateLink(ve[N].url)||((V=M.indexOf(ve[N].text))&&w.push({type:"text",content:M.slice(0,V),level:X}),w.push({type:"link_open",href:ve[N].url,title:"",level:X++}),w.push({type:"text",content:ve[N].text,level:X}),w.push({type:"link_close",level:--X}),M=M.slice(V+ve[N].text.length));M.length&&w.push({type:"text",content:M,level:X}),oe[t].children=l=[].concat(l.slice(0,s),w,l.slice(s+1))}}else for(s--;l[s].level!==_.level&&"link_open"!==l[s].type;)s--}function FD(n){n.core.ruler.push("linkify",LD)}var kD=i(23358),DO=i.n(kD),$D=i(1653),HD=i.n($D),BD=i(86101),UD=i.n(BD),u=i(64975);function d(n){if(u(n))return n}var g=i(63380),A=i(66627),k=i(8225);function q(n){if(void 0!==g&&null!=A(n)||null!=n["@@iterator"])return k(n)}var pe=i(19621);function Re(n,s){(null==s||s>n.length)&&(s=n.length);for(var t=0,o=new Array(s);t<s;t++)o[t]=n[t];return o}function Ue(n,s){var t;if(n){if("string"==typeof n)return Re(n,s);var o=pe(t=Object.prototype.toString.call(n)).call(t,8,-1);if("Object"===o&&n.constructor&&(o=n.constructor.name),"Map"===o||"Set"===o)return k(n);if("Arguments"===o||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(o))return Re(n,s)}}function Dt(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}function Zt(n){return d(n)||q(n)||Ue(n)||Dt()}var Dn=i(53757),br=i.n(Dn),Jr=i(48129),Vi=i.n(Jr),jo=i(31507),ls=i.n(jo),zs=i(17346),_o=i.n(zs),Da=i(12232),ql=i.n(Da),Zu=i(69138);function ih(n,s,t,o,l,_,M){try{var w=n[_](M),N=w.value}catch(V){return void t(V)}w.done?s(N):Zu.resolve(N).then(o,l)}function fm(n){return function(){var s=this,t=arguments;return new Zu(function(o,l){var _=n.apply(s,t);function M(N){ih(_,o,l,M,w,"next",N)}function w(N){ih(_,o,l,M,w,"throw",N)}M(void 0)})}}var AE=i(33950),DE=i.n(AE),wE=i(86413),xE=i.n(wE),RE=i(14226),NE=i.n(RE),PE=i(64871),IE=i.n(PE),LE=i(41776),T3=i.n(LE),C3=i(12666),M3=i.n(C3);function YD(n,s,t,o,l,_,M){try{var w=n[_](M),N=w.value}catch(V){return void t(V)}w.done?s(N):Promise.resolve(N).then(o,l)}function X_(n){return function(){var s=this,t=arguments;return new Promise(function(o,l){var _=n.apply(s,t);function M(N){YD(_,o,l,M,w,"next",N)}function w(N){YD(_,o,l,M,w,"throw",N)}M(void 0)})}}var jD=i(22714),XT=i(23591),O3=i(14306),wO=i(45862),GD=i(6379),zD=i(51134),A3=i(70891),FE=i(77576),D3=i(66342);function jv(n){return(jv="function"==typeof g&&"symbol"==typeof D3?function(s){return typeof s}:function(s){return s&&"function"==typeof g&&s.constructor===g&&s!==g.prototype?"symbol":typeof s})(n)}var w3=i(71950);function VD(n){var s=function x3(n,s){if("object"!==jv(n)||null===n)return n;var t=n[w3];if(void 0!==t){var o=t.call(n,s||"default");if("object"!==jv(o))return o;throw new TypeError("@@toPrimitive must return a primitive value.")}return("string"===s?String:Number)(n)}(n,"string");return"symbol"===jv(s)?s:String(s)}function ZD(n,s,t){return(s=VD(s))in n?FE(n,s,{value:t,enumerable:!0,configurable:!0,writable:!0}):n[s]=t,n}function WD(n,s){var t=jD(n);if(XT){var o=XT(n);s&&(o=O3(o).call(o,function(l){return wO(n,l).enumerable})),t.push.apply(t,o)}return t}function Hc(n){for(var s=1;s<arguments.length;s++){var t,o,l=null!=arguments[s]?arguments[s]:{};s%2?GD(t=WD(Object(l),!0)).call(t,function(_){ZD(n,_,l[_])}):zD?A3(n,zD(l)):GD(o=WD(Object(l))).call(o,function(_){FE(n,_,wO(l,_))})}return n}const JD="application/json, application/yaml";function QD(n){let s=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};const{requestInterceptor:t,responseInterceptor:o}=s,l=n.withCredentials?"include":"same-origin";return _=>n({url:_,loadSpec:!0,requestInterceptor:t,responseInterceptor:o,headers:{Accept:JD},credentials:l}).then(M=>M.body)}i(71577);var R3=i(59009),xO=i.n(R3);function KD(n){return null==n}var sp={isNothing:KD,isObject:function N3(n){return"object"==typeof n&&null!==n},toArray:function P3(n){return Array.isArray(n)?n:KD(n)?[]:[n]},repeat:function L3(n,s){var o,t="";for(o=0;o<s;o+=1)t+=n;return t},isNegativeZero:function F3(n){return 0===n&&Number.NEGATIVE_INFINITY===1/n},extend:function I3(n,s){var t,o,l,_;if(s)for(t=0,o=(_=Object.keys(s)).length;t<o;t+=1)n[l=_[t]]=s[l];return n}};function XD(n,s){var t="",o=n.reason||"(unknown reason)";return n.mark?(n.mark.name&&(t+='in "'+n.mark.name+'" '),t+="("+(n.mark.line+1)+":"+(n.mark.column+1)+")",!s&&n.mark.snippet&&(t+="\n\n"+n.mark.snippet),o+" "+t):o}function kE(n,s){Error.call(this),this.name="YAMLException",this.reason=n,this.mark=s,this.message=XD(this,!1),Error.captureStackTrace?Error.captureStackTrace(this,this.constructor):this.stack=(new Error).stack||""}(kE.prototype=Object.create(Error.prototype)).constructor=kE,kE.prototype.toString=function(s){return this.name+": "+XD(this,s)};var $h=kE;function RO(n,s,t,o,l){var _="",M="",w=Math.floor(l/2)-1;return o-s>w&&(s=o-w+(_=" ... ").length),t-o>w&&(t=o+w-(M=" ...").length),{str:_+n.slice(s,t).replace(/\t/g,"\u2192")+M,pos:o-s+_.length}}function NO(n,s){return sp.repeat(" ",s-n.length)+n}var z3=["kind","multi","resolve","construct","instanceOf","predicate","represent","representName","defaultStyle","styleAliases"],V3=["scalar","sequence","mapping"],Pp=function W3(n,s){if(s=s||{},Object.keys(s).forEach(function(t){if(-1===z3.indexOf(t))throw new $h('Unknown option "'+t+'" is met in definition of "'+n+'" YAML type.')}),this.options=s,this.tag=n,this.kind=s.kind||null,this.resolve=s.resolve||function(){return!0},this.construct=s.construct||function(t){return t},this.instanceOf=s.instanceOf||null,this.predicate=s.predicate||null,this.represent=s.represent||null,this.representName=s.representName||null,this.defaultStyle=s.defaultStyle||null,this.multi=s.multi||!1,this.styleAliases=function Z3(n){var s={};return null!==n&&Object.keys(n).forEach(function(t){n[t].forEach(function(o){s[String(o)]=t})}),s}(s.styleAliases||null),-1===V3.indexOf(this.kind))throw new $h('Unknown kind "'+this.kind+'" is specified for "'+n+'" YAML type.')};function qD(n,s){var t=[];return n[s].forEach(function(o){var l=t.length;t.forEach(function(_,M){_.tag===o.tag&&_.kind===o.kind&&_.multi===o.multi&&(l=M)}),t[l]=o}),t}function PO(n){return this.extend(n)}PO.prototype.extend=function(s){var t=[],o=[];if(s instanceof Pp)o.push(s);else if(Array.isArray(s))o=o.concat(s);else{if(!s||!Array.isArray(s.implicit)&&!Array.isArray(s.explicit))throw new $h("Schema.extend argument should be a Type, [ Type ], or a schema definition ({ implicit: [...], explicit: [...] })");s.implicit&&(t=t.concat(s.implicit)),s.explicit&&(o=o.concat(s.explicit))}t.forEach(function(_){if(!(_ instanceof Pp))throw new $h("Specified list of YAML types (or a single Type object) contains a non-Type object.");if(_.loadKind&&"scalar"!==_.loadKind)throw new $h("There is a non-scalar type in the implicit list of a schema. Implicit resolving of such types is not supported.");if(_.multi)throw new $h("There is a multi type in the implicit list of a schema. Multi tags can only be listed as explicit.")}),o.forEach(function(_){if(!(_ instanceof Pp))throw new $h("Specified list of YAML types (or a single Type object) contains a non-Type object.")});var l=Object.create(PO.prototype);return l.implicit=(this.implicit||[]).concat(t),l.explicit=(this.explicit||[]).concat(o),l.compiledImplicit=qD(l,"implicit"),l.compiledExplicit=qD(l,"explicit"),l.compiledTypeMap=function J3(){var s,t,n={scalar:{},sequence:{},mapping:{},fallback:{},multi:{scalar:[],sequence:[],mapping:[],fallback:[]}};function o(l){l.multi?(n.multi[l.kind].push(l),n.multi.fallback.push(l)):n[l.kind][l.tag]=n.fallback[l.tag]=l}for(s=0,t=arguments.length;s<t;s+=1)arguments[s].forEach(o);return n}(l.compiledImplicit,l.compiledExplicit),l};var ew=PO,tw=new Pp("tag:yaml.org,2002:str",{kind:"scalar",construct:function(n){return null!==n?n:""}}),nw=new Pp("tag:yaml.org,2002:seq",{kind:"sequence",construct:function(n){return null!==n?n:[]}}),rw=new Pp("tag:yaml.org,2002:map",{kind:"mapping",construct:function(n){return null!==n?n:{}}}),iw=new ew({explicit:[tw,nw,rw]}),ow=new Pp("tag:yaml.org,2002:null",{kind:"scalar",resolve:function Q3(n){if(null===n)return!0;var s=n.length;return 1===s&&"~"===n||4===s&&("null"===n||"Null"===n||"NULL"===n)},construct:function K3(){return null},predicate:function X3(n){return null===n},represent:{canonical:function(){return"~"},lowercase:function(){return"null"},uppercase:function(){return"NULL"},camelcase:function(){return"Null"},empty:function(){return""}},defaultStyle:"lowercase"}),sw=new Pp("tag:yaml.org,2002:bool",{kind:"scalar",resolve:function q3(n){if(null===n)return!1;var s=n.length;return 4===s&&("true"===n||"True"===n||"TRUE"===n)||5===s&&("false"===n||"False"===n||"FALSE"===n)},construct:function eN(n){return"true"===n||"True"===n||"TRUE"===n},predicate:function tN(n){return"[object Boolean]"===Object.prototype.toString.call(n)},represent:{lowercase:function(n){return n?"true":"false"},uppercase:function(n){return n?"TRUE":"FALSE"},camelcase:function(n){return n?"True":"False"}},defaultStyle:"lowercase"});function nN(n){return 48<=n&&n<=57||65<=n&&n<=70||97<=n&&n<=102}function rN(n){return 48<=n&&n<=55}function iN(n){return 48<=n&&n<=57}var aw=new Pp("tag:yaml.org,2002:int",{kind:"scalar",resolve:function oN(n){if(null===n)return!1;var l,s=n.length,t=0,o=!1;if(!s)return!1;if(("-"===(l=n[t])||"+"===l)&&(l=n[++t]),"0"===l){if(t+1===s)return!0;if("b"===(l=n[++t])){for(t++;t<s;t++)if("_"!==(l=n[t])){if("0"!==l&&"1"!==l)return!1;o=!0}return o&&"_"!==l}if("x"===l){for(t++;t<s;t++)if("_"!==(l=n[t])){if(!nN(n.charCodeAt(t)))return!1;o=!0}return o&&"_"!==l}if("o"===l){for(t++;t<s;t++)if("_"!==(l=n[t])){if(!rN(n.charCodeAt(t)))return!1;o=!0}return o&&"_"!==l}}if("_"===l)return!1;for(;t<s;t++)if("_"!==(l=n[t])){if(!iN(n.charCodeAt(t)))return!1;o=!0}return!(!o||"_"===l)},construct:function sN(n){var o,s=n,t=1;if(-1!==s.indexOf("_")&&(s=s.replace(/_/g,"")),("-"===(o=s[0])||"+"===o)&&("-"===o&&(t=-1),o=(s=s.slice(1))[0]),"0"===s)return 0;if("0"===o){if("b"===s[1])return t*parseInt(s.slice(2),2);if("x"===s[1])return t*parseInt(s.slice(2),16);if("o"===s[1])return t*parseInt(s.slice(2),8)}return t*parseInt(s,10)},predicate:function aN(n){return"[object Number]"===Object.prototype.toString.call(n)&&n%1==0&&!sp.isNegativeZero(n)},represent:{binary:function(n){return n>=0?"0b"+n.toString(2):"-0b"+n.toString(2).slice(1)},octal:function(n){return n>=0?"0o"+n.toString(8):"-0o"+n.toString(8).slice(1)},decimal:function(n){return n.toString(10)},hexadecimal:function(n){return n>=0?"0x"+n.toString(16).toUpperCase():"-0x"+n.toString(16).toUpperCase().slice(1)}},defaultStyle:"decimal",styleAliases:{binary:[2,"bin"],octal:[8,"oct"],decimal:[10,"dec"],hexadecimal:[16,"hex"]}}),lN=new RegExp("^(?:[-+]?(?:[0-9][0-9_]*)(?:\\.[0-9_]*)?(?:[eE][-+]?[0-9]+)?|\\.[0-9_]+(?:[eE][-+]?[0-9]+)?|[-+]?\\.(?:inf|Inf|INF)|\\.(?:nan|NaN|NAN))$"),dN=/^[-+]?[0-9]+e/,lw=new Pp("tag:yaml.org,2002:float",{kind:"scalar",resolve:function uN(n){return!(null===n||!lN.test(n)||"_"===n[n.length-1])},construct:function cN(n){var s,t;return t="-"===(s=n.replace(/_/g,"").toLowerCase())[0]?-1:1,"+-".indexOf(s[0])>=0&&(s=s.slice(1)),".inf"===s?1===t?Number.POSITIVE_INFINITY:Number.NEGATIVE_INFINITY:".nan"===s?NaN:t*parseFloat(s,10)},predicate:function pN(n){return"[object Number]"===Object.prototype.toString.call(n)&&(n%1!=0||sp.isNegativeZero(n))},represent:function fN(n,s){var t;if(isNaN(n))switch(s){case"lowercase":return".nan";case"uppercase":return".NAN";case"camelcase":return".NaN"}else if(Number.POSITIVE_INFINITY===n)switch(s){case"lowercase":return".inf";case"uppercase":return".INF";case"camelcase":return".Inf"}else if(Number.NEGATIVE_INFINITY===n)switch(s){case"lowercase":return"-.inf";case"uppercase":return"-.INF";case"camelcase":return"-.Inf"}else if(sp.isNegativeZero(n))return"-0.0";return t=n.toString(10),dN.test(t)?t.replace("e",".e"):t},defaultStyle:"lowercase"}),uw=iw.extend({implicit:[ow,sw,aw,lw]}),cw=uw,dw=new RegExp("^([0-9][0-9][0-9][0-9])-([0-9][0-9])-([0-9][0-9])$"),fw=new RegExp("^([0-9][0-9][0-9][0-9])-([0-9][0-9]?)-([0-9][0-9]?)(?:[Tt]|[ \\t]+)([0-9][0-9]?):([0-9][0-9]):([0-9][0-9])(?:\\.([0-9]*))?(?:[ \\t]*(Z|([-+])([0-9][0-9]?)(?::([0-9][0-9]))?))?$"),pw=new Pp("tag:yaml.org,2002:timestamp",{kind:"scalar",resolve:function hN(n){return null!==n&&(null!==dw.exec(n)||null!==fw.exec(n))},construct:function _N(n){var s,t,o,l,_,M,w,oe,N=0,V=null;if(null===(s=dw.exec(n))&&(s=fw.exec(n)),null===s)throw new Error("Date resolve error");if(t=+s[1],o=+s[2]-1,l=+s[3],!s[4])return new Date(Date.UTC(t,o,l));if(_=+s[4],M=+s[5],w=+s[6],s[7]){for(N=s[7].slice(0,3);N.length<3;)N+="0";N=+N}return s[9]&&(V=6e4*(60*+s[10]+ +(s[11]||0)),"-"===s[9]&&(V=-V)),oe=new Date(Date.UTC(t,o,l,_,M,w,N)),V&&oe.setTime(oe.getTime()-V),oe},instanceOf:Date,represent:function gN(n){return n.toISOString()}}),hw=new Pp("tag:yaml.org,2002:merge",{kind:"scalar",resolve:function mN(n){return"<<"===n||null===n}}),IO="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=\n\r",_w=new Pp("tag:yaml.org,2002:binary",{kind:"scalar",resolve:function vN(n){if(null===n)return!1;var s,t,o=0,l=n.length,_=IO;for(t=0;t<l;t++)if(!((s=_.indexOf(n.charAt(t)))>64)){if(s<0)return!1;o+=6}return o%8==0},construct:function yN(n){var s,t,o=n.replace(/[\r\n=]/g,""),l=o.length,_=IO,M=0,w=[];for(s=0;s<l;s++)s%4==0&&s&&(w.push(M>>16&255),w.push(M>>8&255),w.push(255&M)),M=M<<6|_.indexOf(o.charAt(s));return 0==(t=l%4*6)?(w.push(M>>16&255),w.push(M>>8&255),w.push(255&M)):18===t?(w.push(M>>10&255),w.push(M>>2&255)):12===t&&w.push(M>>4&255),new Uint8Array(w)},predicate:function bN(n){return"[object Uint8Array]"===Object.prototype.toString.call(n)},represent:function EN(n){var o,l,s="",t=0,_=n.length,M=IO;for(o=0;o<_;o++)o%3==0&&o&&(s+=M[t>>18&63],s+=M[t>>12&63],s+=M[t>>6&63],s+=M[63&t]),t=(t<<8)+n[o];return 0==(l=_%3)?(s+=M[t>>18&63],s+=M[t>>12&63],s+=M[t>>6&63],s+=M[63&t]):2===l?(s+=M[t>>10&63],s+=M[t>>4&63],s+=M[t<<2&63],s+=M[64]):1===l&&(s+=M[t>>2&63],s+=M[t<<4&63],s+=M[64],s+=M[64]),s}}),SN=Object.prototype.hasOwnProperty,TN=Object.prototype.toString,gw=new Pp("tag:yaml.org,2002:omap",{kind:"sequence",resolve:function CN(n){if(null===n)return!0;var t,o,l,_,M,s=[],w=n;for(t=0,o=w.length;t<o;t+=1){if(M=!1,"[object Object]"!==TN.call(l=w[t]))return!1;for(_ in l)if(SN.call(l,_)){if(M)return!1;M=!0}if(!M)return!1;if(-1!==s.indexOf(_))return!1;s.push(_)}return!0},construct:function MN(n){return null!==n?n:[]}}),ON=Object.prototype.toString,mw=new Pp("tag:yaml.org,2002:pairs",{kind:"sequence",resolve:function AN(n){if(null===n)return!0;var s,t,o,l,_,M=n;for(_=new Array(M.length),s=0,t=M.length;s<t;s+=1){if("[object Object]"!==ON.call(o=M[s])||1!==(l=Object.keys(o)).length)return!1;_[s]=[l[0],o[l[0]]]}return!0},construct:function DN(n){if(null===n)return[];var s,t,o,l,_,M=n;for(_=new Array(M.length),s=0,t=M.length;s<t;s+=1)o=M[s],l=Object.keys(o),_[s]=[l[0],o[l[0]]];return _}}),wN=Object.prototype.hasOwnProperty,vw=new Pp("tag:yaml.org,2002:set",{kind:"mapping",resolve:function xN(n){if(null===n)return!0;var s,t=n;for(s in t)if(wN.call(t,s)&&null!==t[s])return!1;return!0},construct:function RN(n){return null!==n?n:{}}}),LO=cw.extend({implicit:[pw,hw],explicit:[_w,gw,mw,vw]}),Qm=Object.prototype.hasOwnProperty,PN=/[\x00-\x08\x0B\x0C\x0E-\x1F\x7F-\x84\x86-\x9F\uFFFE\uFFFF]|[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?:[^\uD800-\uDBFF]|^)[\uDC00-\uDFFF]/,IN=/[\x85\u2028\u2029]/,LN=/[,\[\]\{\}]/,Sw=/^(?:!|!!|![a-z\-]+!)$/i,Tw=/^(?:!|[^,\[\]\{\}])(?:%[0-9a-f]{2}|[0-9a-z\-#;\/\?:@&=\+\$,_\.!~\*'\(\)\[\]])*$/i;function Cw(n){return Object.prototype.toString.call(n)}function Hg(n){return 10===n||13===n}function Gv(n){return 9===n||32===n}function h_(n){return 9===n||32===n||10===n||13===n}function v0(n){return 44===n||91===n||93===n||123===n||125===n}function FN(n){var s;return 48<=n&&n<=57?n-48:97<=(s=32|n)&&s<=102?s-97+10:-1}function kN(n){return 120===n?2:117===n?4:85===n?8:0}function $N(n){return 48<=n&&n<=57?n-48:-1}function Mw(n){return 48===n?"\0":97===n?"\x07":98===n?"\b":116===n||9===n?"\t":110===n?"\n":118===n?"\v":102===n?"\f":114===n?"\r":101===n?"\x1b":32===n?" ":34===n?'"':47===n?"/":92===n?"\\":78===n?"\x85":95===n?"\xa0":76===n?"\u2028":80===n?"\u2029":""}function HN(n){return n<=65535?String.fromCharCode(n):String.fromCharCode(55296+(n-65536>>10),56320+(n-65536&1023))}for(var Ow=new Array(256),Aw=new Array(256),y0=0;y0<256;y0++)Ow[y0]=Mw(y0)?1:0,Aw[y0]=Mw(y0);function BN(n,s){this.input=n,this.filename=s.filename||null,this.schema=s.schema||LO,this.onWarning=s.onWarning||null,this.legacy=s.legacy||!1,this.json=s.json||!1,this.listener=s.listener||null,this.implicitTypes=this.schema.compiledImplicit,this.typeMap=this.schema.compiledTypeMap,this.length=n.length,this.position=0,this.line=0,this.lineStart=0,this.lineIndent=0,this.firstTabInLine=-1,this.documents=[]}function Dw(n,s){var t={name:n.filename,buffer:n.input.slice(0,-1),position:n.position,line:n.line,column:n.position-n.lineStart};return t.snippet=function j3(n,s){if(s=Object.create(s||null),!n.buffer)return null;s.maxLength||(s.maxLength=79),"number"!=typeof s.indent&&(s.indent=1),"number"!=typeof s.linesBefore&&(s.linesBefore=3),"number"!=typeof s.linesAfter&&(s.linesAfter=2);for(var _,t=/\r?\n|\r|\0/g,o=[0],l=[],M=-1;_=t.exec(n.buffer);)l.push(_.index),o.push(_.index+_[0].length),n.position<=_.index&&M<0&&(M=o.length-2);M<0&&(M=o.length-1);var N,V,w="",X=Math.min(n.line+s.linesAfter,l.length).toString().length,re=s.maxLength-(s.indent+X+3);for(N=1;N<=s.linesBefore&&!(M-N<0);N++)V=RO(n.buffer,o[M-N],l[M-N],n.position-(o[M]-o[M-N]),re),w=sp.repeat(" ",s.indent)+NO((n.line-N+1).toString(),X)+" | "+V.str+"\n"+w;for(V=RO(n.buffer,o[M],l[M],n.position,re),w+=sp.repeat(" ",s.indent)+NO((n.line+1).toString(),X)+" | "+V.str+"\n",w+=sp.repeat("-",s.indent+X+3+V.pos)+"^\n",N=1;N<=s.linesAfter&&!(M+N>=l.length);N++)V=RO(n.buffer,o[M+N],l[M+N],n.position-(o[M]-o[M+N]),re),w+=sp.repeat(" ",s.indent)+NO((n.line+N+1).toString(),X)+" | "+V.str+"\n";return w.replace(/\n$/,"")}(t),new $h(s,t)}function Na(n,s){throw Dw(n,s)}function tC(n,s){n.onWarning&&n.onWarning.call(null,Dw(n,s))}var ww={YAML:function(s,t,o){var l,_,M;null!==s.version&&Na(s,"duplication of %YAML directive"),1!==o.length&&Na(s,"YAML directive accepts exactly one argument"),null===(l=/^([0-9]+)\.([0-9]+)$/.exec(o[0]))&&Na(s,"ill-formed argument of the YAML directive"),_=parseInt(l[1],10),M=parseInt(l[2],10),1!==_&&Na(s,"unacceptable YAML version of the document"),s.version=o[0],s.checkLineBreaks=M<2,1!==M&&2!==M&&tC(s,"unsupported YAML version of the document")},TAG:function(s,t,o){var l,_;2!==o.length&&Na(s,"TAG directive accepts exactly two arguments"),_=o[1],Sw.test(l=o[0])||Na(s,"ill-formed tag handle (first argument) of the TAG directive"),Qm.call(s.tagMap,l)&&Na(s,'there is a previously declared suffix for "'+l+'" tag handle'),Tw.test(_)||Na(s,"ill-formed tag prefix (second argument) of the TAG directive");try{_=decodeURIComponent(_)}catch(M){Na(s,"tag prefix is malformed: "+_)}s.tagMap[l]=_}};function Km(n,s,t,o){var l,_,M,w;if(s<t){if(w=n.input.slice(s,t),o)for(l=0,_=w.length;l<_;l+=1)9===(M=w.charCodeAt(l))||32<=M&&M<=1114111||Na(n,"expected valid JSON character");else PN.test(w)&&Na(n,"the stream contains non-printable characters");n.result+=w}}function xw(n,s,t,o){var l,_,M,w;for(sp.isObject(t)||Na(n,"cannot merge mappings; the provided source object is unacceptable"),M=0,w=(l=Object.keys(t)).length;M<w;M+=1)Qm.call(s,_=l[M])||(s[_]=t[_],o[_]=!0)}function E0(n,s,t,o,l,_,M,w,N){var V,X;if(Array.isArray(l))for(V=0,X=(l=Array.prototype.slice.call(l)).length;V<X;V+=1)Array.isArray(l[V])&&Na(n,"nested arrays are not supported inside keys"),"object"==typeof l&&"[object Object]"===Cw(l[V])&&(l[V]="[object Object]");if("object"==typeof l&&"[object Object]"===Cw(l)&&(l="[object Object]"),l=String(l),null===s&&(s={}),"tag:yaml.org,2002:merge"===o)if(Array.isArray(_))for(V=0,X=_.length;V<X;V+=1)xw(n,s,_[V],t);else xw(n,s,_,t);else!n.json&&!Qm.call(t,l)&&Qm.call(s,l)&&(n.line=M||n.line,n.lineStart=w||n.lineStart,n.position=N||n.position,Na(n,"duplicated mapping key")),"__proto__"===l?Object.defineProperty(s,l,{configurable:!0,enumerable:!0,writable:!0,value:_}):s[l]=_,delete t[l];return s}function kO(n){var s;10===(s=n.input.charCodeAt(n.position))?n.position++:13===s?(n.position++,10===n.input.charCodeAt(n.position)&&n.position++):Na(n,"a line break is expected"),n.line+=1,n.lineStart=n.position,n.firstTabInLine=-1}function Uf(n,s,t){for(var o=0,l=n.input.charCodeAt(n.position);0!==l;){for(;Gv(l);)9===l&&-1===n.firstTabInLine&&(n.firstTabInLine=n.position),l=n.input.charCodeAt(++n.position);if(s&&35===l)do{l=n.input.charCodeAt(++n.position)}while(10!==l&&13!==l&&0!==l);if(!Hg(l))break;for(kO(n),l=n.input.charCodeAt(n.position),o++,n.lineIndent=0;32===l;)n.lineIndent++,l=n.input.charCodeAt(++n.position)}return-1!==t&&0!==o&&n.lineIndent<t&&tC(n,"deficient indentation"),o}function nC(n){var t,s=n.position;return!(45!==(t=n.input.charCodeAt(s))&&46!==t||t!==n.input.charCodeAt(s+1)||t!==n.input.charCodeAt(s+2)||(s+=3,t=n.input.charCodeAt(s),0!==t&&!h_(t)))}function $O(n,s){1===s?n.result+=" ":s>1&&(n.result+=sp.repeat("\n",s-1))}function Rw(n,s){var t,N,o=n.tag,l=n.anchor,_=[],w=!1;if(-1!==n.firstTabInLine)return!1;for(null!==n.anchor&&(n.anchorMap[n.anchor]=_),N=n.input.charCodeAt(n.position);0!==N&&(-1!==n.firstTabInLine&&(n.position=n.firstTabInLine,Na(n,"tab characters must not be used in indentation")),45===N&&h_(n.input.charCodeAt(n.position+1)));)if(w=!0,n.position++,Uf(n,!0,-1)&&n.lineIndent<=s)_.push(null),N=n.input.charCodeAt(n.position);else if(t=n.line,b0(n,s,3,!1,!0),_.push(n.result),Uf(n,!0,-1),N=n.input.charCodeAt(n.position),(n.line===t||n.lineIndent>s)&&0!==N)Na(n,"bad indentation of a sequence entry");else if(n.lineIndent<s)break;return!!w&&(n.tag=o,n.anchor=l,n.kind="sequence",n.result=_,!0)}function ZN(n){var s,l,_,M,t=!1,o=!1;if(33!==(M=n.input.charCodeAt(n.position)))return!1;if(null!==n.tag&&Na(n,"duplication of a tag property"),60===(M=n.input.charCodeAt(++n.position))?(t=!0,M=n.input.charCodeAt(++n.position)):33===M?(o=!0,l="!!",M=n.input.charCodeAt(++n.position)):l="!",s=n.position,t){do{M=n.input.charCodeAt(++n.position)}while(0!==M&&62!==M);n.position<n.length?(_=n.input.slice(s,n.position),M=n.input.charCodeAt(++n.position)):Na(n,"unexpected end of the stream within a verbatim tag")}else{for(;0!==M&&!h_(M);)33===M&&(o?Na(n,"tag suffix cannot contain exclamation marks"):(l=n.input.slice(s-1,n.position+1),Sw.test(l)||Na(n,"named tag handle cannot contain such characters"),o=!0,s=n.position+1)),M=n.input.charCodeAt(++n.position);_=n.input.slice(s,n.position),LN.test(_)&&Na(n,"tag suffix cannot contain flow indicator characters")}_&&!Tw.test(_)&&Na(n,"tag name cannot contain such characters: "+_);try{_=decodeURIComponent(_)}catch(w){Na(n,"tag name is malformed: "+_)}return t?n.tag=_:Qm.call(n.tagMap,l)?n.tag=n.tagMap[l]+_:"!"===l?n.tag="!"+_:"!!"===l?n.tag="tag:yaml.org,2002:"+_:Na(n,'undeclared tag handle "'+l+'"'),!0}function WN(n){var s,t;if(38!==(t=n.input.charCodeAt(n.position)))return!1;for(null!==n.anchor&&Na(n,"duplication of an anchor property"),t=n.input.charCodeAt(++n.position),s=n.position;0!==t&&!h_(t)&&!v0(t);)t=n.input.charCodeAt(++n.position);return n.position===s&&Na(n,"name of an anchor node must contain at least one character"),n.anchor=n.input.slice(s,n.position),!0}function b0(n,s,t,o,l){var _,M,w,re,oe,fe,ve,Pe,De,N=1,V=!1,X=!1;if(null!==n.listener&&n.listener("open",n),n.tag=null,n.anchor=null,n.kind=null,n.result=null,_=M=w=4===t||3===t,o&&Uf(n,!0,-1)&&(V=!0,n.lineIndent>s?N=1:n.lineIndent===s?N=0:n.lineIndent<s&&(N=-1)),1===N)for(;ZN(n)||WN(n);)Uf(n,!0,-1)?(V=!0,w=_,n.lineIndent>s?N=1:n.lineIndent===s?N=0:n.lineIndent<s&&(N=-1)):w=!1;if(w&&(w=V||l),(1===N||4===t)&&(Pe=1===t||2===t?s:s+1,De=n.position-n.lineStart,1===N?w&&(Rw(n,De)||function VN(n,s,t){var o,l,_,M,w,N,Ae,V=n.tag,X=n.anchor,re={},oe=Object.create(null),fe=null,ve=null,Pe=null,De=!1,Ie=!1;if(-1!==n.firstTabInLine)return!1;for(null!==n.anchor&&(n.anchorMap[n.anchor]=re),Ae=n.input.charCodeAt(n.position);0!==Ae;){if(!De&&-1!==n.firstTabInLine&&(n.position=n.firstTabInLine,Na(n,"tab characters must not be used in indentation")),o=n.input.charCodeAt(n.position+1),_=n.line,63!==Ae&&58!==Ae||!h_(o)){if(M=n.line,w=n.lineStart,N=n.position,!b0(n,t,2,!1,!0))break;if(n.line===_){for(Ae=n.input.charCodeAt(n.position);Gv(Ae);)Ae=n.input.charCodeAt(++n.position);if(58===Ae)h_(Ae=n.input.charCodeAt(++n.position))||Na(n,"a whitespace character is expected after the key-value separator within a block mapping"),De&&(E0(n,re,oe,fe,ve,null,M,w,N),fe=ve=Pe=null),Ie=!0,De=!1,l=!1,fe=n.tag,ve=n.result;else{if(!Ie)return n.tag=V,n.anchor=X,!0;Na(n,"can not read an implicit mapping pair; a colon is missed")}}else{if(!Ie)return n.tag=V,n.anchor=X,!0;Na(n,"can not read a block mapping entry; a multiline key may not be an implicit key")}}else 63===Ae?(De&&(E0(n,re,oe,fe,ve,null,M,w,N),fe=ve=Pe=null),Ie=!0,De=!0,l=!0):De?(De=!1,l=!0):Na(n,"incomplete explicit mapping pair; a key node is missed; or followed by a non-tabulated empty line"),n.position+=1,Ae=o;if((n.line===_||n.lineIndent>s)&&(De&&(M=n.line,w=n.lineStart,N=n.position),b0(n,s,4,!0,l)&&(De?ve=n.result:Pe=n.result),De||(E0(n,re,oe,fe,ve,Pe,M,w,N),fe=ve=Pe=null),Uf(n,!0,-1),Ae=n.input.charCodeAt(n.position)),(n.line===_||n.lineIndent>s)&&0!==Ae)Na(n,"bad indentation of a mapping entry");else if(n.lineIndent<s)break}return De&&E0(n,re,oe,fe,ve,null,M,w,N),Ie&&(n.tag=V,n.anchor=X,n.kind="mapping",n.result=re),Ie}(n,De,Pe))||function GN(n,s){var o,l,_,w,X,re,oe,fe,Pe,De,Ie,Ae,t=!0,M=n.tag,N=n.anchor,ve=Object.create(null);if(91===(Ae=n.input.charCodeAt(n.position)))X=93,fe=!1,w=[];else{if(123!==Ae)return!1;X=125,fe=!0,w={}}for(null!==n.anchor&&(n.anchorMap[n.anchor]=w),Ae=n.input.charCodeAt(++n.position);0!==Ae;){if(Uf(n,!0,s),(Ae=n.input.charCodeAt(n.position))===X)return n.position++,n.tag=M,n.anchor=N,n.kind=fe?"mapping":"sequence",n.result=w,!0;t?44===Ae&&Na(n,"expected the node content, but found ','"):Na(n,"missed comma between flow collection entries"),Ie=null,re=oe=!1,63===Ae&&h_(n.input.charCodeAt(n.position+1))&&(re=oe=!0,n.position++,Uf(n,!0,s)),o=n.line,l=n.lineStart,_=n.position,b0(n,s,1,!1,!0),De=n.tag,Pe=n.result,Uf(n,!0,s),Ae=n.input.charCodeAt(n.position),(oe||n.line===o)&&58===Ae&&(re=!0,Ae=n.input.charCodeAt(++n.position),Uf(n,!0,s),b0(n,s,1,!1,!0),Ie=n.result),fe?E0(n,w,ve,De,Pe,Ie,o,l,_):w.push(re?E0(n,null,ve,De,Pe,Ie,o,l,_):Pe),Uf(n,!0,s),44===(Ae=n.input.charCodeAt(n.position))?(t=!0,Ae=n.input.charCodeAt(++n.position)):t=!1}Na(n,"unexpected end of the stream within a flow collection")}(n,Pe)?X=!0:(M&&function zN(n,s){var t,o,X,re,l=1,_=!1,M=!1,w=s,N=0,V=!1;if(124===(re=n.input.charCodeAt(n.position)))o=!1;else{if(62!==re)return!1;o=!0}for(n.kind="scalar",n.result="";0!==re;)if(43===(re=n.input.charCodeAt(++n.position))||45===re)1===l?l=43===re?3:2:Na(n,"repeat of a chomping mode identifier");else{if(!((X=$N(re))>=0))break;0===X?Na(n,"bad explicit indentation width of a block scalar; it cannot be less than one"):M?Na(n,"repeat of an indentation width identifier"):(w=s+X-1,M=!0)}if(Gv(re)){do{re=n.input.charCodeAt(++n.position)}while(Gv(re));if(35===re)do{re=n.input.charCodeAt(++n.position)}while(!Hg(re)&&0!==re)}for(;0!==re;){for(kO(n),n.lineIndent=0,re=n.input.charCodeAt(n.position);(!M||n.lineIndent<w)&&32===re;)n.lineIndent++,re=n.input.charCodeAt(++n.position);if(!M&&n.lineIndent>w&&(w=n.lineIndent),Hg(re))N++;else{if(n.lineIndent<w){3===l?n.result+=sp.repeat("\n",_?1+N:N):1===l&&_&&(n.result+="\n");break}for(o?Gv(re)?(V=!0,n.result+=sp.repeat("\n",_?1+N:N)):V?(V=!1,n.result+=sp.repeat("\n",N+1)):0===N?_&&(n.result+=" "):n.result+=sp.repeat("\n",N):n.result+=sp.repeat("\n",_?1+N:N),_=!0,M=!0,N=0,t=n.position;!Hg(re)&&0!==re;)re=n.input.charCodeAt(++n.position);Km(n,t,n.position,!1)}}return!0}(n,Pe)||function YN(n,s){var t,o,l;if(39!==(t=n.input.charCodeAt(n.position)))return!1;for(n.kind="scalar",n.result="",n.position++,o=l=n.position;0!==(t=n.input.charCodeAt(n.position));)if(39===t){if(Km(n,o,n.position,!0),39!==(t=n.input.charCodeAt(++n.position)))return!0;o=n.position,n.position++,l=n.position}else Hg(t)?(Km(n,o,l,!0),$O(n,Uf(n,!1,s)),o=l=n.position):n.position===n.lineStart&&nC(n)?Na(n,"unexpected end of the document within a single quoted scalar"):(n.position++,l=n.position);Na(n,"unexpected end of the stream within a single quoted scalar")}(n,Pe)||function jN(n,s){var t,o,l,_,M,w;if(34!==(w=n.input.charCodeAt(n.position)))return!1;for(n.kind="scalar",n.result="",n.position++,t=o=n.position;0!==(w=n.input.charCodeAt(n.position));){if(34===w)return Km(n,t,n.position,!0),n.position++,!0;if(92===w){if(Km(n,t,n.position,!0),Hg(w=n.input.charCodeAt(++n.position)))Uf(n,!1,s);else if(w<256&&Ow[w])n.result+=Aw[w],n.position++;else if((M=kN(w))>0){for(l=M,_=0;l>0;l--)(M=FN(w=n.input.charCodeAt(++n.position)))>=0?_=(_<<4)+M:Na(n,"expected hexadecimal character");n.result+=HN(_),n.position++}else Na(n,"unknown escape sequence");t=o=n.position}else Hg(w)?(Km(n,t,o,!0),$O(n,Uf(n,!1,s)),t=o=n.position):n.position===n.lineStart&&nC(n)?Na(n,"unexpected end of the document within a double quoted scalar"):(n.position++,o=n.position)}Na(n,"unexpected end of the stream within a double quoted scalar")}(n,Pe)?X=!0:function JN(n){var s,t,o;if(42!==(o=n.input.charCodeAt(n.position)))return!1;for(o=n.input.charCodeAt(++n.position),s=n.position;0!==o&&!h_(o)&&!v0(o);)o=n.input.charCodeAt(++n.position);return n.position===s&&Na(n,"name of an alias node must contain at least one character"),t=n.input.slice(s,n.position),Qm.call(n.anchorMap,t)||Na(n,'unidentified alias "'+t+'"'),n.result=n.anchorMap[t],Uf(n,!0,-1),!0}(n)?(X=!0,(null!==n.tag||null!==n.anchor)&&Na(n,"alias node should not have any properties")):function UN(n,s,t){var l,_,M,w,N,V,X,fe,re=n.kind,oe=n.result;if(h_(fe=n.input.charCodeAt(n.position))||v0(fe)||35===fe||38===fe||42===fe||33===fe||124===fe||62===fe||39===fe||34===fe||37===fe||64===fe||96===fe||(63===fe||45===fe)&&(h_(l=n.input.charCodeAt(n.position+1))||t&&v0(l)))return!1;for(n.kind="scalar",n.result="",_=M=n.position,w=!1;0!==fe;){if(58===fe){if(h_(l=n.input.charCodeAt(n.position+1))||t&&v0(l))break}else if(35===fe){if(h_(n.input.charCodeAt(n.position-1)))break}else{if(n.position===n.lineStart&&nC(n)||t&&v0(fe))break;if(Hg(fe)){if(N=n.line,V=n.lineStart,X=n.lineIndent,Uf(n,!1,-1),n.lineIndent>=s){w=!0,fe=n.input.charCodeAt(n.position);continue}n.position=M,n.line=N,n.lineStart=V,n.lineIndent=X;break}}w&&(Km(n,_,M,!1),$O(n,n.line-N),_=M=n.position,w=!1),Gv(fe)||(M=n.position+1),fe=n.input.charCodeAt(++n.position)}return Km(n,_,M,!1),!!n.result||(n.kind=re,n.result=oe,!1)}(n,Pe,1===t)&&(X=!0,null===n.tag&&(n.tag="?")),null!==n.anchor&&(n.anchorMap[n.anchor]=n.result)):0===N&&(X=w&&Rw(n,De))),null===n.tag)null!==n.anchor&&(n.anchorMap[n.anchor]=n.result);else if("?"===n.tag){for(null!==n.result&&"scalar"!==n.kind&&Na(n,'unacceptable node kind for !<?> tag; it should be "scalar", not "'+n.kind+'"'),re=0,oe=n.implicitTypes.length;re<oe;re+=1)if((ve=n.implicitTypes[re]).resolve(n.result)){n.result=ve.construct(n.result),n.tag=ve.tag,null!==n.anchor&&(n.anchorMap[n.anchor]=n.result);break}}else if("!"!==n.tag){if(Qm.call(n.typeMap[n.kind||"fallback"],n.tag))ve=n.typeMap[n.kind||"fallback"][n.tag];else for(ve=null,re=0,oe=(fe=n.typeMap.multi[n.kind||"fallback"]).length;re<oe;re+=1)if(n.tag.slice(0,fe[re].tag.length)===fe[re].tag){ve=fe[re];break}ve||Na(n,"unknown tag !<"+n.tag+">"),null!==n.result&&ve.kind!==n.kind&&Na(n,"unacceptable node kind for !<"+n.tag+'> tag; it should be "'+ve.kind+'", not "'+n.kind+'"'),ve.resolve(n.result,n.tag)?(n.result=ve.construct(n.result,n.tag),null!==n.anchor&&(n.anchorMap[n.anchor]=n.result)):Na(n,"cannot resolve a node with !<"+n.tag+"> explicit tag")}return null!==n.listener&&n.listener("close",n),null!==n.tag||null!==n.anchor||X}function QN(n){var t,o,l,M,s=n.position,_=!1;for(n.version=null,n.checkLineBreaks=n.legacy,n.tagMap=Object.create(null),n.anchorMap=Object.create(null);0!==(M=n.input.charCodeAt(n.position))&&(Uf(n,!0,-1),M=n.input.charCodeAt(n.position),!(n.lineIndent>0||37!==M));){for(_=!0,M=n.input.charCodeAt(++n.position),t=n.position;0!==M&&!h_(M);)M=n.input.charCodeAt(++n.position);for(l=[],(o=n.input.slice(t,n.position)).length<1&&Na(n,"directive name must not be less than one character in length");0!==M;){for(;Gv(M);)M=n.input.charCodeAt(++n.position);if(35===M){do{M=n.input.charCodeAt(++n.position)}while(0!==M&&!Hg(M));break}if(Hg(M))break;for(t=n.position;0!==M&&!h_(M);)M=n.input.charCodeAt(++n.position);l.push(n.input.slice(t,n.position))}0!==M&&kO(n),Qm.call(ww,o)?ww[o](n,o,l):tC(n,'unknown document directive "'+o+'"')}Uf(n,!0,-1),0===n.lineIndent&&45===n.input.charCodeAt(n.position)&&45===n.input.charCodeAt(n.position+1)&&45===n.input.charCodeAt(n.position+2)?(n.position+=3,Uf(n,!0,-1)):_&&Na(n,"directives end mark is expected"),b0(n,n.lineIndent-1,4,!1,!0),Uf(n,!0,-1),n.checkLineBreaks&&IN.test(n.input.slice(s,n.position))&&tC(n,"non-ASCII line breaks are interpreted as content"),n.documents.push(n.result),n.position===n.lineStart&&nC(n)?46===n.input.charCodeAt(n.position)&&(n.position+=3,Uf(n,!0,-1)):n.position<n.length-1&&Na(n,"end of the stream or a document separator is expected")}function Nw(n,s){s=s||{},0!==(n=String(n)).length&&(10!==n.charCodeAt(n.length-1)&&13!==n.charCodeAt(n.length-1)&&(n+="\n"),65279===n.charCodeAt(0)&&(n=n.slice(1)));var t=new BN(n,s),o=n.indexOf("\0");for(-1!==o&&(t.position=o,Na(t,"null byte is not allowed in input")),t.input+="\0";32===t.input.charCodeAt(t.position);)t.lineIndent+=1,t.position+=1;for(;t.position<t.length-1;)QN(t);return t.documents}var Pw_loadAll=function KN(n,s,t){null!==s&&"object"==typeof s&&void 0===t&&(t=s,s=null);var o=Nw(n,t);if("function"!=typeof s)return o;for(var l=0,_=o.length;l<_;l+=1)s(o[l])},Pw_load=function XN(n,s){var t=Nw(n,s);if(0!==t.length){if(1===t.length)return t[0];throw new $h("expected a single document in the stream, but found more")}},Iw=Object.prototype.toString,Lw=Object.prototype.hasOwnProperty,oh={0:"\\0",7:"\\a",8:"\\b",9:"\\t",10:"\\n",11:"\\v",12:"\\f",13:"\\r",27:"\\e",34:'\\"',92:"\\\\",133:"\\N",160:"\\_",8232:"\\L",8233:"\\P"},mP=["y","Y","yes","Yes","YES","on","On","ON","n","N","no","No","NO","off","Off","OFF"],vP=/^[-+]?[0-9_]+(?::[0-9_]+)+(?:\.[0-9_]*)?$/;function EP(n){var s,t,o;if(s=n.toString(16).toUpperCase(),n<=255)t="x",o=2;else if(n<=65535)t="u",o=4;else{if(!(n<=4294967295))throw new $h("code point within a string may not be greater than 0xFFFFFFFF");t="U",o=8}return"\\"+t+sp.repeat("0",o-s.length)+s}function SP(n){this.schema=n.schema||LO,this.indent=Math.max(1,n.indent||2),this.noArrayIndent=n.noArrayIndent||!1,this.skipInvalid=n.skipInvalid||!1,this.flowLevel=sp.isNothing(n.flowLevel)?-1:n.flowLevel,this.styleMap=function yP(n,s){var t,o,l,_,M,w,N;if(null===s)return{};for(t={},l=0,_=(o=Object.keys(s)).length;l<_;l+=1)M=o[l],w=String(s[M]),"!!"===M.slice(0,2)&&(M="tag:yaml.org,2002:"+M.slice(2)),(N=n.compiledTypeMap.fallback[M])&&Lw.call(N.styleAliases,w)&&(w=N.styleAliases[w]),t[M]=w;return t}(this.schema,n.styles||null),this.sortKeys=n.sortKeys||!1,this.lineWidth=n.lineWidth||80,this.noRefs=n.noRefs||!1,this.noCompatMode=n.noCompatMode||!1,this.condenseFlow=n.condenseFlow||!1,this.quotingType='"'===n.quotingType?2:1,this.forceQuotes=n.forceQuotes||!1,this.replacer="function"==typeof n.replacer?n.replacer:null,this.implicitTypes=this.schema.compiledImplicit,this.explicitTypes=this.schema.compiledExplicit,this.tag=null,this.result="",this.duplicates=[],this.usedDuplicates=null}function Uw(n,s){for(var M,t=sp.repeat(" ",s),o=0,l=-1,_="",w=n.length;o<w;)-1===(l=n.indexOf("\n",o))?(M=n.slice(o),o=w):(M=n.slice(o,l+1),o=l+1),M.length&&"\n"!==M&&(_+=t),_+=M;return _}function UO(n,s){return"\n"+sp.repeat(" ",n.indent*s)}function iC(n){return 32===n||9===n}function BE(n){return 32<=n&&n<=126||161<=n&&n<=55295&&8232!==n&&8233!==n||57344<=n&&n<=65533&&65279!==n||65536<=n&&n<=1114111}function Yw(n){return BE(n)&&65279!==n&&13!==n&&10!==n}function jw(n,s,t){var o=Yw(n),l=o&&!iC(n);return(t?o:o&&44!==n&&91!==n&&93!==n&&123!==n&&125!==n)&&35!==n&&!(58===s&&!l)||Yw(s)&&!iC(s)&&35===n||58===s&&l}function UE(n,s){var o,t=n.charCodeAt(s);return t>=55296&&t<=56319&&s+1<n.length&&(o=n.charCodeAt(s+1))>=56320&&o<=57343?1024*(t-55296)+o-56320+65536:t}function Gw(n){return/^\n* /.test(n)}function AP(n,s,t,o,l){n.dump=function(){if(0===s.length)return 2===n.quotingType?'""':"''";if(!n.noCompatMode&&(-1!==mP.indexOf(s)||vP.test(s)))return 2===n.quotingType?'"'+s+'"':"'"+s+"'";var _=n.indent*Math.max(1,t),M=-1===n.lineWidth?-1:Math.max(Math.min(n.lineWidth,40),n.lineWidth-_);switch(function OP(n,s,t,o,l,_,M,w){var N,V=0,X=null,re=!1,oe=!1,fe=-1!==o,ve=-1,Pe=function CP(n){return BE(n)&&65279!==n&&!iC(n)&&45!==n&&63!==n&&58!==n&&44!==n&&91!==n&&93!==n&&123!==n&&125!==n&&35!==n&&38!==n&&42!==n&&33!==n&&124!==n&&61!==n&&62!==n&&39!==n&&34!==n&&37!==n&&64!==n&&96!==n}(UE(n,0))&&function MP(n){return!iC(n)&&58!==n}(UE(n,n.length-1));if(s||M)for(N=0;N<n.length;V>=65536?N+=2:N++){if(!BE(V=UE(n,N)))return 5;Pe=Pe&&jw(V,X,w),X=V}else{for(N=0;N<n.length;V>=65536?N+=2:N++){if(10===(V=UE(n,N)))re=!0,fe&&(oe=oe||N-ve-1>o&&" "!==n[ve+1],ve=N);else if(!BE(V))return 5;Pe=Pe&&jw(V,X,w),X=V}oe=oe||fe&&N-ve-1>o&&" "!==n[ve+1]}return re||oe?t>9&&Gw(n)?5:M?2===_?5:2:oe?4:3:!Pe||M||l(n)?2===_?5:2:1}(s,o||n.flowLevel>-1&&t>=n.flowLevel,n.indent,M,function N(V){return function TP(n,s){var t,o;for(t=0,o=n.implicitTypes.length;t<o;t+=1)if(n.implicitTypes[t].resolve(s))return!0;return!1}(n,V)},n.quotingType,n.forceQuotes&&!o,l)){case 1:return s;case 2:return"'"+s.replace(/'/g,"''")+"'";case 3:return"|"+Ww(s,n.indent)+Jw(Uw(s,_));case 4:return">"+Ww(s,n.indent)+Jw(Uw(function DP(n,s){for(var _,M,t=/(\n+)([^\n]*)/g,o=(V=void 0,V=n.indexOf("\n"),t.lastIndex=V=-1!==V?V:n.length,Qw(n.slice(0,V),s)),l="\n"===n[0]||" "===n[0];M=t.exec(n);){var N=M[2];_=" "===N[0],o+=M[1]+(l||_||""===N?"":"\n")+Qw(N,s),l=_}var V;return o}(s,M),_));case 5:return'"'+function wP(n){for(var o,s="",t=0,l=0;l<n.length;t>=65536?l+=2:l++)t=UE(n,l),!(o=oh[t])&&BE(t)?(s+=n[l],t>=65536&&(s+=n[l+1])):s+=o||EP(t);return s}(s)+'"';default:throw new $h("impossible error: invalid scalar style")}}()}function Ww(n,s){var t=Gw(n)?String(s):"",o="\n"===n[n.length-1];return t+(!o||"\n"!==n[n.length-2]&&"\n"!==n?o?"":"-":"+")+"\n"}function Jw(n){return"\n"===n[n.length-1]?n.slice(0,-1):n}function Qw(n,s){if(""===n||" "===n[0])return n;for(var o,_,t=/ [^ ]/g,l=0,M=0,w=0,N="";o=t.exec(n);)(w=o.index)-l>s&&(N+="\n"+n.slice(l,_=M>l?M:w),l=_+1),M=w;return N+="\n",(N+=n.length-l>s&&M>l?n.slice(l,M)+"\n"+n.slice(M+1):n.slice(l)).slice(1)}function Xw(n,s,t){var o,l,_,M,w,N;for(_=0,M=(l=t?n.explicitTypes:n.implicitTypes).length;_<M;_+=1)if(((w=l[_]).instanceOf||w.predicate)&&(!w.instanceOf||"object"==typeof s&&s instanceof w.instanceOf)&&(!w.predicate||w.predicate(s))){if(n.tag=t?w.multi&&w.representName?w.representName(s):w.tag:"?",w.represent){if(N=n.styleMap[w.tag]||w.defaultStyle,"[object Function]"===Iw.call(w.represent))o=w.represent(s,N);else{if(!Lw.call(w.represent,N))throw new $h("!<"+w.tag+'> tag resolver accepts not "'+N+'" style');o=w.represent[N](s,N)}n.dump=o}return!0}return!1}function pm(n,s,t,o,l,_,M){n.tag=null,n.dump=t,Xw(n,t,!1)||Xw(n,t,!0);var V,w=Iw.call(n.dump),N=o;o&&(o=n.flowLevel<0||n.flowLevel>s);var re,oe,X="[object Object]"===w||"[object Array]"===w;if(X&&(oe=-1!==(re=n.duplicates.indexOf(t))),(null!==n.tag&&"?"!==n.tag||oe||2!==n.indent&&s>0)&&(l=!1),oe&&n.usedDuplicates[re])n.dump="*ref_"+re;else{if(X&&oe&&!n.usedDuplicates[re]&&(n.usedDuplicates[re]=!0),"[object Object]"===w)o&&0!==Object.keys(n.dump).length?(function NP(n,s,t,o){var w,N,V,X,re,oe,l="",_=n.tag,M=Object.keys(t);if(!0===n.sortKeys)M.sort();else if("function"==typeof n.sortKeys)M.sort(n.sortKeys);else if(n.sortKeys)throw new $h("sortKeys must be a boolean or a function");for(w=0,N=M.length;w<N;w+=1)oe="",(!o||""!==l)&&(oe+=UO(n,s)),X=t[V=M[w]],n.replacer&&(X=n.replacer.call(t,V,X)),pm(n,s+1,V,!0,!0,!0)&&((re=null!==n.tag&&"?"!==n.tag||n.dump&&n.dump.length>1024)&&(n.dump&&10===n.dump.charCodeAt(0)?oe+="?":oe+="? "),oe+=n.dump,re&&(oe+=UO(n,s)),pm(n,s+1,X,!0,re)&&(n.dump&&10===n.dump.charCodeAt(0)?oe+=":":oe+=": ",l+=oe+=n.dump));n.tag=_,n.dump=l||"{}"}(n,s,n.dump,l),oe&&(n.dump="&ref_"+re+n.dump)):(function RP(n,s,t){var M,w,N,V,X,o="",l=n.tag,_=Object.keys(t);for(M=0,w=_.length;M<w;M+=1)X="",""!==o&&(X+=", "),n.condenseFlow&&(X+='"'),V=t[N=_[M]],n.replacer&&(V=n.replacer.call(t,N,V)),pm(n,s,N,!1,!1)&&(n.dump.length>1024&&(X+="? "),X+=n.dump+(n.condenseFlow?'"':"")+":"+(n.condenseFlow?"":" "),pm(n,s,V,!1,!1)&&(o+=X+=n.dump));n.tag=l,n.dump="{"+o+"}"}(n,s,n.dump),oe&&(n.dump="&ref_"+re+" "+n.dump));else if("[object Array]"===w)o&&0!==n.dump.length?(function Kw(n,s,t,o){var M,w,N,l="",_=n.tag;for(M=0,w=t.length;M<w;M+=1)N=t[M],n.replacer&&(N=n.replacer.call(t,String(M),N)),(pm(n,s+1,N,!0,!0,!1,!0)||void 0===N&&pm(n,s+1,null,!0,!0,!1,!0))&&((!o||""!==l)&&(l+=UO(n,s)),n.dump&&10===n.dump.charCodeAt(0)?l+="-":l+="- ",l+=n.dump);n.tag=_,n.dump=l||"[]"}(n,n.noArrayIndent&&!M&&s>0?s-1:s,n.dump,l),oe&&(n.dump="&ref_"+re+n.dump)):(function xP(n,s,t){var _,M,w,o="",l=n.tag;for(_=0,M=t.length;_<M;_+=1)w=t[_],n.replacer&&(w=n.replacer.call(t,String(_),w)),(pm(n,s,w,!1,!1)||void 0===w&&pm(n,s,null,!1,!1))&&(""!==o&&(o+=","+(n.condenseFlow?"":" ")),o+=n.dump);n.tag=l,n.dump="["+o+"]"}(n,s,n.dump),oe&&(n.dump="&ref_"+re+" "+n.dump));else{if("[object String]"!==w){if("[object Undefined]"===w)return!1;if(n.skipInvalid)return!1;throw new $h("unacceptable kind of an object to dump "+w)}"?"!==n.tag&&AP(n,n.dump,s,_,N)}null!==n.tag&&"?"!==n.tag&&(V=encodeURI("!"===n.tag[0]?n.tag.slice(1):n.tag).replace(/!/g,"%21"),V="!"===n.tag[0]?"!"+V:"tag:yaml.org,2002:"===V.slice(0,18)?"!!"+V.slice(18):"!<"+V+">",n.dump=V+" "+n.dump)}return!0}function PP(n,s){var l,_,t=[],o=[];for(jO(n,t,o),l=0,_=o.length;l<_;l+=1)s.duplicates.push(t[o[l]]);s.usedDuplicates=new Array(_)}function jO(n,s,t){var o,l,_;if(null!==n&&"object"==typeof n)if(-1!==(l=s.indexOf(n)))-1===t.indexOf(l)&&t.push(l);else if(s.push(n),Array.isArray(n))for(l=0,_=n.length;l<_;l+=1)jO(n[l],s,t);else for(l=0,_=(o=Object.keys(n)).length;l<_;l+=1)jO(n[o[l]],s,t)}function GO(n,s){return function(){throw new Error("Function yaml."+n+" is removed in js-yaml 4. Use yaml."+s+" instead, which is now safe by default.")}}var kP=Pp,$P=ew,HP=iw,qw=uw,BP=cw,UP=LO,YP=Pw_load,jP=Pw_loadAll,GP=function IP(n,s){var t=new SP(s=s||{});t.noRefs||PP(n,t);var o=n;return t.replacer&&(o=t.replacer.call({"":o},"",o)),pm(t,0,o,!0,!0)?t.dump+"\n":""},zP=$h,VP={binary:_w,float:lw,map:rw,null:ow,pairs:mw,set:vw,timestamp:pw,bool:sw,int:aw,merge:hw,omap:gw,seq:nw,str:tw},ZP=GO("safeLoad","load"),WP=GO("safeLoadAll","loadAll"),JP=GO("safeDump","dump");const zO={Type:kP,Schema:$P,FAILSAFE_SCHEMA:HP,JSON_SCHEMA:qw,CORE_SCHEMA:BP,DEFAULT_SCHEMA:UP,load:YP,loadAll:jP,dump:GP,YAMLException:zP,types:VP,safeLoad:ZP,safeLoadAll:WP,safeDump:JP},KP="undefined"!=typeof globalThis?globalThis:"undefined"!=typeof self?self:window,{FormData:ex,Blob:oC,File:tx}=KP,XP=n=>":/?#[]@!$&'()*+,;=".indexOf(n)>-1,qP=n=>/^[a-z0-9\-._~]+$/i.test(n);function T0(n){let{escape:s}=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},t=arguments.length>2?arguments[2]:void 0;return"number"==typeof n&&(n=n.toString()),"string"==typeof n&&n.length&&s?t?JSON.parse(n):[...n].map(o=>{if(qP(o)||XP(o)&&"unsafe"===s)return o;const l=new TextEncoder;return Array.from(l.encode(o)).map(M=>`0${M.toString(16).toUpperCase()}`.slice(-2)).map(M=>`%${M}`).join("")}).join(""):n}function VO(n){const{value:s}=n;return Array.isArray(s)?function e6(n){let{key:s,value:t,style:o,explode:l,escape:_}=n;const M=w=>T0(w,{escape:_});if("simple"===o)return t.map(w=>M(w)).join(",");if("label"===o)return`.${t.map(w=>M(w)).join(".")}`;if("matrix"===o)return t.map(w=>M(w)).reduce((w,N)=>!w||l?`${w||""};${s}=${N}`:`${w},${N}`,"");if("form"===o){const w=l?`&${s}=`:",";return t.map(N=>M(N)).join(w)}if("spaceDelimited"===o){const w=l?`${s}=`:"";return t.map(N=>M(N)).join(` ${w}`)}if("pipeDelimited"===o){const w=l?`${s}=`:"";return t.map(N=>M(N)).join(`|${w}`)}}(n):"object"==typeof s?function t6(n){let{key:s,value:t,style:o,explode:l,escape:_}=n;const M=N=>T0(N,{escape:_}),w=Object.keys(t);return"simple"===o?w.reduce((N,V)=>{const X=M(t[V]);return`${N?`${N},`:""}${V}${l?"=":","}${X}`},""):"label"===o?w.reduce((N,V)=>{const X=M(t[V]);return`${N?`${N}.`:"."}${V}${l?"=":"."}${X}`},""):"matrix"===o&&l?w.reduce((N,V)=>`${N?`${N};`:";"}${V}=${M(t[V])}`,""):"matrix"===o?w.reduce((N,V)=>{const X=M(t[V]);return`${N?`${N},`:`;${s}=`}${V},${X}`},""):"form"===o?w.reduce((N,V)=>{const X=M(t[V]);return`${N?`${N}${l?"&":","}`:""}${V}${l?"=":","}${X}`},""):void 0}(n):function n6(n){let{key:s,value:t,style:o,escape:l}=n;const _=M=>T0(M,{escape:l});return"simple"===o?_(t):"label"===o?`.${_(t)}`:"matrix"===o?`;${s}=${_(t)}`:"form"===o||"deepObject"===o?_(t):void 0}(n)}const r6=(n,s)=>{s.body=n},ZO={serializeRes:nx,mergeInQueryOrForm:ax};function WO(n){return JO.apply(this,arguments)}function JO(){return JO=X_(function*(n){let s=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};"object"==typeof n&&(s=n,n=s.url),s.headers=s.headers||{},ZO.mergeInQueryOrForm(s),s.headers&&Object.keys(s.headers).forEach(l=>{const _=s.headers[l];"string"==typeof _&&(s.headers[l]=_.replace(/\n+/g," "))}),s.requestInterceptor&&(s=(yield s.requestInterceptor(s))||s);const t=s.headers["content-type"]||s.headers["Content-Type"];let o;/multipart\/form-data/i.test(t)&&s.body instanceof ex&&(delete s.headers["content-type"],delete s.headers["Content-Type"]);try{o=yield(s.userFetch||fetch)(s.url,s),o=yield ZO.serializeRes(o,n,s),s.responseInterceptor&&(o=(yield s.responseInterceptor(o))||o)}catch(l){if(!o)throw l;const _=new Error(o.statusText||`response status is ${o.status}`);throw _.status=o.status,_.statusCode=o.status,_.responseError=l,_}if(!o.ok){const l=new Error(o.statusText||`response status is ${o.status}`);throw l.status=o.status,l.statusCode=o.status,l.response=o,l}return o}),JO.apply(this,arguments)}const i6=function(){let n=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"";return/(json|xml|yaml|text)\b/.test(n)};function o6(n,s){return s&&(0===s.indexOf("application/json")||s.indexOf("+json")>0)?JSON.parse(n):zO.load(n)}function nx(n,s){let{loadSpec:t=!1}=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{};const o={ok:n.ok,url:n.url||s,status:n.status,statusText:n.statusText,headers:a6(n.headers)},l=o.headers["content-type"],_=t||i6(l);return(_?n.text:n.blob||n.buffer).call(n).then(w=>{if(o.text=w,o.data=w,_)try{const N=o6(w,l);o.body=N,o.obj=N}catch(N){o.parseError=N}return o})}function s6(n){return n.includes(", ")?n.split(", "):n}function a6(){let n=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};return"function"!=typeof n.entries?{}:Array.from(n.entries()).reduce((s,t)=>{let[o,l]=t;return s[o]=s6(l),s},{})}function QO(n,s){return!s&&"undefined"!=typeof navigator&&(s=navigator),s&&"ReactNative"===s.product?!(!n||"object"!=typeof n||"string"!=typeof n.uri):!!(void 0!==tx&&n instanceof tx||void 0!==oC&&n instanceof oC||ArrayBuffer.isView(n))||null!==n&&"object"==typeof n&&"function"==typeof n.pipe}function rx(n,s){return Array.isArray(n)&&n.some(t=>QO(t,s))}const l6={form:",",spaceDelimited:"%20",pipeDelimited:"|"},u6={csv:",",ssv:"%20",tsv:"%09",pipes:"|"};function ix(n,s){let t=arguments.length>2&&void 0!==arguments[2]&&arguments[2];const{collectionFormat:o,allowEmptyValue:l,serializationOption:_,encoding:M}=s,w="object"!=typeof s||Array.isArray(s)?s:s.value,N=t?X=>X.toString():X=>encodeURIComponent(X),V=N(n);if(void 0===w&&l)return[[V,""]];if(QO(w)||rx(w))return[[V,w]];if(_)return ox(n,w,t,_);if(M){if([typeof M.style,typeof M.explode,typeof M.allowReserved].some(X=>"undefined"!==X)){const{style:X,explode:re,allowReserved:oe}=M;return ox(n,w,t,{style:X,explode:re,allowReserved:oe})}return M.contentType?"application/json"===M.contentType?[[V,N("string"==typeof w?w:JSON.stringify(w))]]:[[V,N(w.toString())]]:"object"!=typeof w?[[V,N(w)]]:Array.isArray(w)&&w.every(X=>"object"!=typeof X)?[[V,w.map(N).join(",")]]:[[V,N(JSON.stringify(w))]]}return"object"!=typeof w?[[V,N(w)]]:Array.isArray(w)?"multi"===o?[[V,w.map(N)]]:[[V,w.map(N).join(u6[o||"csv"])]]:[[V,""]]}function ox(n,s,t,o){const l=o.style||"form",_=void 0===o.explode?"form"===l:o.explode,M=!t&&(o&&o.allowReserved?"unsafe":"reserved"),w=V=>T0(V,{escape:M}),N=t?V=>V:V=>T0(V,{escape:M});return"object"!=typeof s?[[N(n),w(s)]]:Array.isArray(s)?_?[[N(n),s.map(w)]]:[[N(n),s.map(w).join(l6[l])]]:"deepObject"===l?Object.keys(s).map(V=>[N(`${n}[${V}]`),w(s[V])]):_?Object.keys(s).map(V=>[N(V),w(s[V])]):[[N(n),Object.keys(s).map(V=>[`${N(V)},${w(s[V])}`]).join(",")]]}function c6(n){return Object.entries(n).reduce((s,t)=>{let[o,l]=t;for(const[_,M]of ix(o,l,!0))if(Array.isArray(M))for(const w of M)if(ArrayBuffer.isView(w)){const N=new oC([w]);s.append(_,N)}else s.append(_,w);else if(ArrayBuffer.isView(M)){const w=new oC([M]);s.append(_,w)}else s.append(_,M);return s},new ex)}function sx(n){const s=Object.keys(n).reduce((t,o)=>{for(const[l,_]of ix(o,n[o]))t[l]=_;return t},{});return xO().stringify(s,{encode:!1,indices:!1})||""}function ax(){let n=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};const{url:s="",query:t,form:o}=n,l=function(){for(var _=arguments.length,M=new Array(_),w=0;w<_;w++)M[w]=arguments[w];const N=M.filter(V=>V).join("&");return N?`?${N}`:""};if(o){const _=Object.keys(o).some(w=>{const{value:N}=o[w];return QO(N)||rx(N)}),M=n.headers["content-type"]||n.headers["Content-Type"];if(_||/multipart\/form-data/i.test(M)){const w=c6(n.form);r6(w,n)}else n.body=sx(o);delete n.form}if(t){const[_,M]=s.split("?");let w="";if(M){const V=xO().parse(M);Object.keys(t).forEach(re=>delete V[re]),w=xO().stringify(V,{encode:!0})}const N=l(w,sx(t));n.url=_+N,delete n.query}return n}function d6(n,s,t){return t=t||(o=>o),s=s||(o=>o),o=>("string"==typeof o&&(o={url:o}),ZO.mergeInQueryOrForm(o),o=s(o),t(n(o)))}const lx=n=>{const{baseDoc:s,url:t}=n;return s||t},ux=n=>{const{fetch:s,http:t}=n;return s||t||WO};var n,f6=(n=function(s,t){return(n=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(o,l){o.__proto__=l}||function(o,l){for(var _ in l)l.hasOwnProperty(_)&&(o[_]=l[_])})(s,t)},function(s,t){function o(){this.constructor=s}n(s,t),s.prototype=null===t?Object.create(t):(o.prototype=t.prototype,new o)}),p6=Object.prototype.hasOwnProperty;function sC(n,s){return p6.call(n,s)}function KO(n){if(Array.isArray(n)){for(var s=new Array(n.length),t=0;t<s.length;t++)s[t]=""+t;return s}if(Object.keys)return Object.keys(n);var o=[];for(var l in n)sC(n,l)&&o.push(l);return o}function I_(n){switch(typeof n){case"object":return JSON.parse(JSON.stringify(n));case"undefined":return null;default:return n}}function XO(n){for(var o,s=0,t=n.length;s<t;){if(!((o=n.charCodeAt(s))>=48&&o<=57))return!1;s++}return!0}function hm(n){return-1===n.indexOf("/")&&-1===n.indexOf("~")?n:n.replace(/~/g,"~0").replace(/\//g,"~1")}function cx(n){return n.replace(/~1/g,"/").replace(/~0/g,"~")}function qO(n){if(void 0===n)return!0;if(n)if(Array.isArray(n)){for(var s=0,t=n.length;s<t;s++)if(qO(n[s]))return!0}else if("object"==typeof n)for(var o=KO(n),l=o.length,_=0;_<l;_++)if(qO(n[o[_]]))return!0;return!1}function fx(n,s){var t=[n];for(var o in s){var l="object"==typeof s[o]?JSON.stringify(s[o],null,2):s[o];void 0!==l&&t.push(o+": "+l)}return t.join("\n")}var px=function(n){function s(t,o,l,_,M){var w=this.constructor,N=n.call(this,fx(t,{name:o,index:l,operation:_,tree:M}))||this;return N.name=o,N.index=l,N.operation=_,N.tree=M,Object.setPrototypeOf(N,w.prototype),N.message=fx(t,{name:o,index:l,operation:_,tree:M}),N}return f6(s,n),s}(Error),uf=px,h6=I_,C0={add:function(n,s,t){return n[s]=this.value,{newDocument:t}},remove:function(n,s,t){var o=n[s];return delete n[s],{newDocument:t,removed:o}},replace:function(n,s,t){var o=n[s];return n[s]=this.value,{newDocument:t,removed:o}},move:function(n,s,t){var o=YE(t,this.path);o&&(o=I_(o));var l=zv(t,{op:"remove",path:this.from}).removed;return zv(t,{op:"add",path:this.path,value:l}),{newDocument:t,removed:o}},copy:function(n,s,t){var o=YE(t,this.from);return zv(t,{op:"add",path:this.path,value:I_(o)}),{newDocument:t}},test:function(n,s,t){return{newDocument:t,test:jE(n[s],this.value)}},_get:function(n,s,t){return this.value=n[s],{newDocument:t}}},_6={add:function(n,s,t){return XO(s)?n.splice(s,0,this.value):n[s]=this.value,{newDocument:t,index:s}},remove:function(n,s,t){return{newDocument:t,removed:n.splice(s,1)[0]}},replace:function(n,s,t){var o=n[s];return n[s]=this.value,{newDocument:t,removed:o}},move:C0.move,copy:C0.copy,test:C0.test,_get:C0._get};function YE(n,s){if(""==s)return n;var t={op:"_get",path:s};return zv(n,t),t.value}function zv(n,s,t,o,l,_){if(void 0===t&&(t=!1),void 0===o&&(o=!0),void 0===l&&(l=!0),void 0===_&&(_=0),t&&("function"==typeof t?t(s,0,n,s.path):aC(s,0)),""===s.path){var M={newDocument:n};if("add"===s.op)return M.newDocument=s.value,M;if("replace"===s.op)return M.newDocument=s.value,M.removed=n,M;if("move"===s.op||"copy"===s.op)return M.newDocument=YE(n,s.from),"move"===s.op&&(M.removed=n),M;if("test"===s.op){if(M.test=jE(n,s.value),!1===M.test)throw new uf("Test operation failed","TEST_OPERATION_FAILED",_,s,n);return M.newDocument=n,M}if("remove"===s.op)return M.removed=n,M.newDocument=null,M;if("_get"===s.op)return s.value=n,M;if(t)throw new uf("Operation `op` property is not one of operations defined in RFC-6902","OPERATION_OP_INVALID",_,s,n);return M}o||(n=I_(n));var N=(s.path||"").split("/"),V=n,X=1,re=N.length,oe=void 0,fe=void 0,ve=void 0;for(ve="function"==typeof t?t:aC;;){if((fe=N[X])&&-1!=fe.indexOf("~")&&(fe=cx(fe)),l&&("__proto__"==fe||"prototype"==fe&&X>0&&"constructor"==N[X-1]))throw new TypeError("JSON-Patch: modifying `__proto__` or `constructor/prototype` prop is banned for security reasons, if this was on purpose, please set `banPrototypeModifications` flag false and pass it to this function. More info in fast-json-patch README");if(t&&void 0===oe&&(void 0===V[fe]?oe=N.slice(0,X).join("/"):X==re-1&&(oe=s.path),void 0!==oe&&ve(s,0,n,oe)),X++,Array.isArray(V)){if("-"===fe)fe=V.length;else{if(t&&!XO(fe))throw new uf("Expected an unsigned base-10 integer value, making the new referenced value the array element with the zero-based index","OPERATION_PATH_ILLEGAL_ARRAY_INDEX",_,s,n);XO(fe)&&(fe=~~fe)}if(X>=re){if(t&&"add"===s.op&&fe>V.length)throw new uf("The specified index MUST NOT be greater than the number of elements in the array","OPERATION_VALUE_OUT_OF_BOUNDS",_,s,n);if(!1===(M=_6[s.op].call(s,V,fe,n)).test)throw new uf("Test operation failed","TEST_OPERATION_FAILED",_,s,n);return M}}else if(X>=re){if(!1===(M=C0[s.op].call(s,V,fe,n)).test)throw new uf("Test operation failed","TEST_OPERATION_FAILED",_,s,n);return M}if(V=V[fe],t&&X<re&&(!V||"object"!=typeof V))throw new uf("Cannot perform operation at the desired path","OPERATION_PATH_UNRESOLVABLE",_,s,n)}}function Xm(n,s,t,o,l){if(void 0===o&&(o=!0),void 0===l&&(l=!0),t&&!Array.isArray(s))throw new uf("Patch sequence must be an array","SEQUENCE_NOT_AN_ARRAY");o||(n=I_(n));for(var _=new Array(s.length),M=0,w=s.length;M<w;M++)_[M]=zv(n,s[M],t,!0,l,M),n=_[M].newDocument;return _.newDocument=n,_}function g6(n,s,t){var o=zv(n,s);if(!1===o.test)throw new uf("Test operation failed","TEST_OPERATION_FAILED",t,s,n);return o.newDocument}function aC(n,s,t,o){if("object"!=typeof n||null===n||Array.isArray(n))throw new uf("Operation is not an object","OPERATION_NOT_AN_OBJECT",s,n,t);if(!C0[n.op])throw new uf("Operation `op` property is not one of operations defined in RFC-6902","OPERATION_OP_INVALID",s,n,t);if("string"!=typeof n.path)throw new uf("Operation `path` property is not a string","OPERATION_PATH_INVALID",s,n,t);if(0!==n.path.indexOf("/")&&n.path.length>0)throw new uf('Operation `path` property must start with "/"',"OPERATION_PATH_INVALID",s,n,t);if(("move"===n.op||"copy"===n.op)&&"string"!=typeof n.from)throw new uf("Operation `from` property is not present (applicable in `move` and `copy` operations)","OPERATION_FROM_REQUIRED",s,n,t);if(("add"===n.op||"replace"===n.op||"test"===n.op)&&void 0===n.value)throw new uf("Operation `value` property is not present (applicable in `add`, `replace` and `test` operations)","OPERATION_VALUE_REQUIRED",s,n,t);if(("add"===n.op||"replace"===n.op||"test"===n.op)&&qO(n.value))throw new uf("Operation `value` property is not present (applicable in `add`, `replace` and `test` operations)","OPERATION_VALUE_CANNOT_CONTAIN_UNDEFINED",s,n,t);if(t)if("add"==n.op){var l=n.path.split("/").length,_=o.split("/").length;if(l!==_+1&&l!==_)throw new uf("Cannot perform an `add` operation at the desired path","OPERATION_PATH_CANNOT_ADD",s,n,t)}else if("replace"===n.op||"remove"===n.op||"_get"===n.op){if(n.path!==o)throw new uf("Cannot perform the operation at a path that does not exist","OPERATION_PATH_UNRESOLVABLE",s,n,t)}else if("move"===n.op||"copy"===n.op){var w=hx([{op:"_get",path:n.from,value:void 0}],t);if(w&&"OPERATION_PATH_UNRESOLVABLE"===w.name)throw new uf("Cannot perform the operation from a path that does not exist","OPERATION_FROM_UNRESOLVABLE",s,n,t)}}function hx(n,s,t){try{if(!Array.isArray(n))throw new uf("Patch sequence must be an array","SEQUENCE_NOT_AN_ARRAY");if(s)Xm(I_(s),I_(n),t||!0);else{t=t||aC;for(var o=0;o<n.length;o++)t(n[o],o,s,void 0)}}catch(l){if(l instanceof uf)return l;throw l}}function jE(n,s){if(n===s)return!0;if(n&&s&&"object"==typeof n&&"object"==typeof s){var l,_,M,t=Array.isArray(n),o=Array.isArray(s);if(t&&o){if((_=n.length)!=s.length)return!1;for(l=_;0!=l--;)if(!jE(n[l],s[l]))return!1;return!0}if(t!=o)return!1;var w=Object.keys(n);if((_=w.length)!==Object.keys(s).length)return!1;for(l=_;0!=l--;)if(!s.hasOwnProperty(w[l]))return!1;for(l=_;0!=l--;)if(!jE(n[M=w[l]],s[M]))return!1;return!0}return n!=n&&s!=s}var eA=new WeakMap,m6=function n(s){this.observers=new Map,this.obj=s},v6=function n(s,t){this.callback=s,this.observer=t};function S6(n,s){s.unobserve()}function T6(n,s){var o,l=function y6(n){return eA.get(n)}(n);if(l){var _=function E6(n,s){return n.observers.get(s)}(l,s);o=_&&_.observer}else l=new m6(n),eA.set(n,l);if(o)return o;if(o={},l.value=I_(n),s){o.callback=s,o.next=null;var M=function(){tA(o)},w=function(){clearTimeout(o.next),o.next=setTimeout(M)};"undefined"!=typeof window&&(window.addEventListener("mouseup",w),window.addEventListener("keyup",w),window.addEventListener("mousedown",w),window.addEventListener("keydown",w),window.addEventListener("change",w))}return o.patches=[],o.object=n,o.unobserve=function(){tA(o),clearTimeout(o.next),function b6(n,s){n.observers.delete(s.callback)}(l,o),"undefined"!=typeof window&&(window.removeEventListener("mouseup",w),window.removeEventListener("keyup",w),window.removeEventListener("mousedown",w),window.removeEventListener("keydown",w),window.removeEventListener("change",w))},l.observers.set(s,new v6(s,o)),o}function tA(n,s){void 0===s&&(s=!1);var t=eA.get(n.object);nA(t.value,n.object,n.patches,"",s),n.patches.length&&Xm(t.value,n.patches);var o=n.patches;return o.length>0&&(n.patches=[],n.callback&&n.callback(o)),o}function nA(n,s,t,o,l){if(s!==n){"function"==typeof s.toJSON&&(s=s.toJSON());for(var _=KO(s),M=KO(n),N=!1,V=M.length-1;V>=0;V--){var re=n[X=M[V]];if(!sC(s,X)||void 0===s[X]&&void 0!==re&&!1===Array.isArray(s))Array.isArray(n)===Array.isArray(s)?(l&&t.push({op:"test",path:o+"/"+hm(X),value:I_(re)}),t.push({op:"remove",path:o+"/"+hm(X)}),N=!0):(l&&t.push({op:"test",path:o,value:n}),t.push({op:"replace",path:o,value:s}));else{var oe=s[X];"object"==typeof re&&null!=re&&"object"==typeof oe&&null!=oe&&Array.isArray(re)===Array.isArray(oe)?nA(re,oe,t,o+"/"+hm(X),l):re!==oe&&(l&&t.push({op:"test",path:o+"/"+hm(X),value:I_(re)}),t.push({op:"replace",path:o+"/"+hm(X),value:I_(oe)}))}}if(N||_.length!=M.length)for(V=0;V<_.length;V++){var X;!sC(n,X=_[V])&&void 0!==s[X]&&t.push({op:"add",path:o+"/"+hm(X),value:I_(s[X])})}}}function C6(n,s,t){void 0===t&&(t=!1);var o=[];return nA(n,s,o,"",t),o}Object.assign({},r,a,{JsonPatchError:px,deepClone:I_,escapePathComponent:hm,unescapePathComponent:cx});var M6=i(89225),O6=i.n(M6);const Cc={add:function D6(n,s){return{op:"add",path:n,value:s}},replace:lC,remove:function w6(n){return{op:"remove",path:n}},merge:function x6(n,s){return{type:"mutation",op:"merge",path:n,value:s}},mergeDeep:function R6(n,s){return{type:"mutation",op:"mergeDeep",path:n,value:s}},context:function N6(n,s){return{type:"context",path:n,value:s}},getIn:function F6(n,s){return s.reduce((t,o)=>void 0!==o&&t?t[o]:t,n)},applyPatch:function A6(n,s,t){if(t=t||{},"merge"===(s=Hc(Hc({},s),{},{path:s.path&&_x(s.path)})).op){const o=oA(n,s.path);Object.assign(o,s.value),Xm(n,[lC(s.path,o)])}else if("mergeDeep"===s.op){const o=oA(n,s.path),l=O6()(o,s.value);n=Xm(n,[lC(s.path,l)]).newDocument}else if("add"===s.op&&""===s.path&&Vv(s.value)){Xm(n,Object.keys(s.value).reduce((l,_)=>(l.push({op:"add",path:`/${_x(_)}`,value:s.value[_]}),l),[]))}else if("replace"===s.op&&""===s.path){let{value:o}=s;t.allowMetaPatches&&s.meta&&uC(s)&&(Array.isArray(s.value)||Vv(s.value))&&(o=Hc(Hc({},o),s.meta)),n=o}else if(Xm(n,[s]),t.allowMetaPatches&&s.meta&&uC(s)&&(Array.isArray(s.value)||Vv(s.value))){const l=Hc(Hc({},oA(n,s.path)),s.meta);Xm(n,[lC(s.path,l)])}return n},parentPathMatch:function L6(n,s){if(!Array.isArray(s))return!1;for(let t=0,o=s.length;t<o;t+=1)if(s[t]!==n[t])return!1;return!0},flatten:GE,fullyNormalizeArray:function k6(n){return vx(GE(mx(n)))},normalizeArray:mx,isPromise:function $6(n){return Vv(n)&&yx(n.then)},forEachNew:function P6(n,s){try{return gx(n,iA,s)}catch(t){return t}},forEachNewPrimitive:function I6(n,s){try{return gx(n,rA,s)}catch(t){return t}},isJsonPatch:Ex,isContextPatch:function U6(n){return cC(n)&&"context"===n.type},isPatch:cC,isMutation:bx,isAdditiveMutation:uC,isGenerator:function B6(n){return"[object GeneratorFunction]"===Object.prototype.toString.call(n)},isFunction:yx,isObject:Vv,isError:function H6(n){return n instanceof Error}};function _x(n){return Array.isArray(n)?n.length<1?"":`/${n.map(s=>(s+"").replace(/~/g,"~0").replace(/\//g,"~1")).join("/")}`:n}function lC(n,s,t){return{op:"replace",path:n,value:s,meta:t}}function gx(n,s,t){return vx(GE(n.filter(uC).map(M=>s(M.value,t,M.path))||[]))}function rA(n,s,t){return t=t||[],Array.isArray(n)?n.map((o,l)=>rA(o,s,t.concat(l))):Vv(n)?Object.keys(n).map(o=>rA(n[o],s,t.concat(o))):s(n,t[t.length-1],t)}function iA(n,s,t){let o=[];if((t=t||[]).length>0){const l=s(n,t[t.length-1],t);l&&(o=o.concat(l))}if(Array.isArray(n)){const l=n.map((_,M)=>iA(_,s,t.concat(M)));l&&(o=o.concat(l))}else if(Vv(n)){const l=Object.keys(n).map(_=>iA(n[_],s,t.concat(_)));l&&(o=o.concat(l))}return o=GE(o),o}function mx(n){return Array.isArray(n)?n:[n]}function GE(n){return[].concat(...n.map(s=>Array.isArray(s)?GE(s):s))}function vx(n){return n.filter(s=>void 0!==s)}function Vv(n){return n&&"object"==typeof n}function yx(n){return n&&"function"==typeof n}function Ex(n){if(cC(n)){const{op:s}=n;return"add"===s||"remove"===s||"replace"===s}return!1}function bx(n){return Ex(n)||cC(n)&&"mutation"===n.type}function uC(n){return bx(n)&&("add"===n.op||"replace"===n.op||"merge"===n.op||"mergeDeep"===n.op)}function cC(n){return n&&"object"==typeof n}function oA(n,s){try{return YE(n,s)}catch(t){return console.error(t),{}}}var Zv=i(38505);function Sx(n,s){function t(){Error.captureStackTrace?Error.captureStackTrace(this,this.constructor):this.stack=(new Error).stack;for(var o=arguments.length,l=new Array(o),_=0;_<o;_++)l[_]=arguments[_];[this.message]=l,s&&s.apply(this,l)}return(t.prototype=new Error).name=n,t.prototype.constructor=t,t}var Y6=i(18807),j6=i.n(Y6);const G6=["properties"],z6=["properties"],V6=["definitions","parameters","responses","securityDefinitions","components/schemas","components/responses","components/parameters","components/securitySchemes"],Z6=["schema/example","items/example"];function Tx(n){const s=n[n.length-1],t=n[n.length-2],o=n.join("/");return G6.indexOf(s)>-1&&-1===z6.indexOf(t)||V6.indexOf(o)>-1||Z6.some(l=>o.indexOf(l)>-1)}function sA(n,s){const[t,o]=n.split("#"),l=Zv.resolve(t||"",s||"");return o?`${l}#${o}`:l}const J6=/^([a-z]+:\/\/|\/\/)/i,M0=Sx("JSONRefError",function(s,t,o){this.originalError=o,Object.assign(this,t||{})}),_m={},Cx=new WeakMap,Q6=[n=>"paths"===n[0]&&"responses"===n[3]&&"examples"===n[5],n=>"paths"===n[0]&&"responses"===n[3]&&"content"===n[5]&&"example"===n[7],n=>"paths"===n[0]&&"responses"===n[3]&&"content"===n[5]&&"examples"===n[7]&&"value"===n[9],n=>"paths"===n[0]&&"requestBody"===n[3]&&"content"===n[4]&&"example"===n[6],n=>"paths"===n[0]&&"requestBody"===n[3]&&"content"===n[4]&&"examples"===n[6]&&"value"===n[8],n=>"paths"===n[0]&&"parameters"===n[2]&&"example"===n[4],n=>"paths"===n[0]&&"parameters"===n[3]&&"example"===n[5],n=>"paths"===n[0]&&"parameters"===n[2]&&"examples"===n[4]&&"value"===n[6],n=>"paths"===n[0]&&"parameters"===n[3]&&"examples"===n[5]&&"value"===n[7],n=>"paths"===n[0]&&"parameters"===n[2]&&"content"===n[4]&&"example"===n[6],n=>"paths"===n[0]&&"parameters"===n[2]&&"content"===n[4]&&"examples"===n[6]&&"value"===n[8],n=>"paths"===n[0]&&"parameters"===n[3]&&"content"===n[4]&&"example"===n[7],n=>"paths"===n[0]&&"parameters"===n[3]&&"content"===n[5]&&"examples"===n[7]&&"value"===n[9]],Mx=Object.assign({key:"$ref",plugin:(n,s,t,o)=>{const l=o.getInstance(),_=t.slice(0,-1);if(Tx(_)||(n=>Q6.some(s=>s(n)))(_))return;const{baseDoc:M}=o.getContext(t);if("string"!=typeof n)return new M0("$ref: must be a string (JSON-Ref)",{$ref:n,baseDoc:M,fullPath:t});const w=Ax(n),N=w[0],V=w[1]||"";let X,re,oe;try{X=M||N?Ox(N,M):null}catch(Pe){return aA(Pe,{pointer:V,$ref:n,basePath:X,fullPath:t})}if(function r8(n,s,t,o){let l=Cx.get(o);l||(l={},Cx.set(o,l));const _=function t8(n){return 0===n.length?"":`/${n.map(Rx).join("/")}`}(t),M=`${s||"<specmap-base>"}#${n}`,w=_.replace(/allOf\/\d+\/?/g,"");if(s===o.contextTree.get([]).baseDoc&&cA(w,n))return!0;let V="";if(t.some(re=>(V=`${V}/${Rx(re)}`,l[V]&&l[V].some(oe=>cA(oe,M)||cA(M,oe)))))return!0;l[w]=(l[w]||[]).concat(M)}(V,X,_,o)&&!l.useCircularStructures){const Pe=sA(n,X);return n===Pe?null:Cc.replace(t,Pe)}if(null==X?(oe=uA(V),re=o.get(oe),void 0===re&&(re=new M0(`Could not resolve reference: ${n}`,{pointer:V,$ref:n,baseDoc:M,fullPath:t}))):(re=Dx(X,V),re=null!=re.__value?re.__value:re.catch(Pe=>{throw aA(Pe,{pointer:V,$ref:n,baseDoc:M,fullPath:t})})),re instanceof Error)return[Cc.remove(t),re];const fe=sA(n,X),ve=Cc.replace(_,re,{$$ref:fe});if(X&&X!==M)return[ve,Cc.context(_,{baseDoc:X})];try{if(!function i8(n,s){const t=[n];return s.path.reduce((l,_)=>(t.push(l[_]),l[_]),n),function o(l){return Cc.isObject(l)&&(t.indexOf(l)>=0||Object.keys(l).some(_=>o(l[_])))}(s.value)}(o.state,ve)||l.useCircularStructures)return ve}catch(Pe){return null}}},{docCache:_m,absoluteify:Ox,clearCache:function q6(n){void 0!==n?delete _m[n]:Object.keys(_m).forEach(s=>{delete _m[s]})},JSONRefError:M0,wrapError:aA,getDoc:wx,split:Ax,extractFromDoc:Dx,fetchJSON:function e8(n){return fetch(n,{headers:{Accept:JD},loadSpec:!0}).then(s=>s.text()).then(s=>zO.load(s))},extract:lA,jsonPointerToArray:uA,unescapeJsonPointerToken:xx}),X6=Mx;function Ox(n,s){if(!J6.test(n)){if(!s)throw new M0(`Tried to resolve a relative URL, without having a basePath. path: '${n}' basePath: '${s}'`);return Zv.resolve(s,n)}return n}function aA(n,s){let t;return t=n&&n.response&&n.response.body?`${n.response.body.code} ${n.response.body.message}`:n.message,new M0(`Could not resolve reference: ${t}`,s,n)}function Ax(n){return(n+"").split("#")}function Dx(n,s){const t=_m[n];if(t&&!Cc.isPromise(t))try{const o=lA(s,t);return Object.assign(Promise.resolve(o),{__value:o})}catch(o){return Promise.reject(o)}return wx(n).then(o=>lA(s,o))}function wx(n){const s=_m[n];return s?Cc.isPromise(s)?s:Promise.resolve(s):(_m[n]=Mx.fetchJSON(n).then(t=>(_m[n]=t,t)),_m[n])}function lA(n,s){const t=uA(n);if(t.length<1)return s;const o=Cc.getIn(s,t);if(void 0===o)throw new M0(`Could not resolve pointer: ${n} does not exist in document`,{pointer:n});return o}function uA(n){if("string"!=typeof n)throw new TypeError("Expected a string, got a "+typeof n);return"/"===n[0]&&(n=n.substr(1)),""===n?[]:n.split("/").map(xx)}function xx(n){return"string"!=typeof n?n:new URLSearchParams(`=${n.replace(/~1/g,"/").replace(/~0/g,"~")}`).get("")}function Rx(n){return new URLSearchParams([["",n.replace(/~/g,"~0").replace(/\//g,"~1")]]).toString().slice(1)}function cA(n,s){if((n=>!n||"/"===n||"#"===n)(s))return!0;const t=n.charAt(s.length),o=s.slice(-1);return 0===n.indexOf(s)&&(!t||"/"===t||"#"===t)&&"#"!==o}const o8={key:"allOf",plugin:(n,s,t,o,l)=>{if(l.meta&&l.meta.$$ref)return;const _=t.slice(0,-1);if(Tx(_))return;if(!Array.isArray(n)){const V=new TypeError("allOf must be an array");return V.fullPath=t,V}let M=!1,w=l.value;if(_.forEach(V=>{!w||(w=w[V])}),w=Hc({},w),0===Object.keys(w).length)return;delete w.allOf;const N=[];return N.push(o.replace(_,{})),n.forEach((V,X)=>{if(!o.isObject(V)){if(M)return null;M=!0;const fe=new TypeError("Elements in allOf must be objects");return fe.fullPath=t,N.push(fe)}N.push(o.mergeDeep(_,V));const oe=function W6(n,s){let{specmap:t,getBaseUrlForNodePath:o=(M=>t.getContext([...s,...M]).baseDoc),targetKeys:l=["$ref","$$ref"]}=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{};const _=[];return j6()(n).forEach(function(){if(l.includes(this.key)&&"string"==typeof this.node){const w=this.path,N=s.concat(this.path),V=sA(this.node,o(w));_.push(t.replace(N,V))}}),_}(V,t.slice(0,-1),{getBaseUrlForNodePath:fe=>o.getContext([...t,X,...fe]).baseDoc,specmap:o});N.push(...oe)}),w.example&&N.push(o.remove([].concat(_,"example"))),N.push(o.mergeDeep(_,w)),w.$$ref||N.push(o.remove([].concat(_,"$$ref"))),N}},s8={key:"parameters",plugin:(n,s,t,o)=>{if(Array.isArray(n)&&n.length){const l=Object.assign([],n),_=t.slice(0,-1),M=Hc({},Cc.getIn(o.spec,_));for(let w=0;w<n.length;w+=1){const N=n[w];try{l[w].default=o.parameterMacro(M,N)}catch(V){const X=new Error(V);return X.fullPath=t,X}}return Cc.replace(t,l)}return Cc.replace(t,n)}},a8={key:"properties",plugin:(n,s,t,o)=>{const l=Hc({},n);for(const M in n)try{l[M].default=o.modelPropertyMacro(l[M])}catch(w){const N=new Error(w);return N.fullPath=t,N}return Cc.replace(t,l)}};class l8{constructor(s){this.root=dA(s||{})}set(s,t){const o=this.getParent(s,!0);if(!o)return void dC(this.root,t,null);const l=s[s.length-1],{children:_}=o;_[l]?dC(_[l],t,o):_[l]=dA(t,o)}get(s){if((s=s||[]).length<1)return this.root.value;let o,l,t=this.root;for(let _=0;_<s.length&&(l=s[_],o=t.children,o[l]);_+=1)t=o[l];return t&&t.protoValue}getParent(s,t){return!s||s.length<1?null:s.length<2?this.root:s.slice(0,-1).reduce((o,l)=>{if(!o)return o;const{children:_}=o;return!_[l]&&t&&(_[l]=dA(null,o)),_[l]},this.root)}}function dA(n,s){return dC({children:{}},n,s)}function dC(n,s,t){return n.value=s||{},n.protoValue=t?Hc(Hc({},t.protoValue),n.value):n.value,Object.keys(n.children).forEach(o=>{const l=n.children[o];n.children[o]=dC(l,l.value,n)}),n}const Px=()=>{};class u8{static getPluginName(s){return s.pluginName}static getPatchesOfType(s,t){return s.filter(t)}constructor(s){Object.assign(this,{spec:"",debugLevel:"info",plugins:[],pluginHistory:{},errors:[],mutations:[],promisedPatches:[],state:{},patches:[],context:{},contextTree:new l8,showDebug:!1,allPatches:[],pluginProp:"specMap",libMethods:Object.assign(Object.create(this),Cc,{getInstance:()=>this}),allowMetaPatches:!1},s),this.get=this._get.bind(this),this.getContext=this._getContext.bind(this),this.hasRun=this._hasRun.bind(this),this.wrappedPlugins=this.plugins.map(this.wrapPlugin.bind(this)).filter(Cc.isFunction),this.patches.push(Cc.add([],this.spec)),this.patches.push(Cc.context([],this.context)),this.updatePatches(this.patches)}debug(s){if(this.debugLevel===s){for(var t=arguments.length,o=new Array(t>1?t-1:0),l=1;l<t;l++)o[l-1]=arguments[l];console.log(...o)}}verbose(s){if("verbose"===this.debugLevel){for(var t=arguments.length,o=new Array(t>1?t-1:0),l=1;l<t;l++)o[l-1]=arguments[l];console.log(`[${s}]   `,...o)}}wrapPlugin(s,t){const{pathDiscriminator:o}=this;let _,l=null;return s[this.pluginProp]?(l=s,_=s[this.pluginProp]):Cc.isFunction(s)?_=s:Cc.isObject(s)&&(_=function M(w){const N=(V,X)=>!Array.isArray(V)||V.every((re,oe)=>re===X[oe]);return function*(X,re){const oe={};for(const ve of X.filter(Cc.isAdditiveMutation))yield*fe(ve.value,ve.path,ve);function*fe(ve,Pe,De){if(Cc.isObject(ve)){const Ie=Pe.length-1,Ae=Pe[Ie],Y=Pe.indexOf("properties"),Et="properties"===Ae&&Ie===Y,ft=re.allowMetaPatches&&oe[ve.$$ref];for(const xt of Object.keys(ve)){const Ht=ve[xt],yn=Pe.concat(xt),It=Cc.isObject(Ht),In=ve.$$ref;if(ft||It&&(re.allowMetaPatches&&In&&(oe[In]=!0),yield*fe(Ht,yn,De)),!Et&&xt===w.key){const On=N(o,Pe);(!o||On)&&(yield w.plugin(Ht,xt,yn,re,De))}}}else w.key===Pe[Pe.length-1]&&(yield w.plugin(ve,w.key,Pe,re))}}}(s)),Object.assign(_.bind(l),{pluginName:s.name||t,isGenerator:Cc.isGenerator(_)})}nextPlugin(){return this.wrappedPlugins.find(s=>this.getMutationsForPlugin(s).length>0)}nextPromisedPatch(){if(this.promisedPatches.length>0)return Promise.race(this.promisedPatches.map(s=>s.value))}getPluginHistory(s){const t=this.constructor.getPluginName(s);return this.pluginHistory[t]||[]}getPluginRunCount(s){return this.getPluginHistory(s).length}getPluginHistoryTip(s){const t=this.getPluginHistory(s);return t&&t[t.length-1]||{}}getPluginMutationIndex(s){const t=this.getPluginHistoryTip(s).mutationIndex;return"number"!=typeof t?-1:t}updatePluginHistory(s,t){const o=this.constructor.getPluginName(s);this.pluginHistory[o]=this.pluginHistory[o]||[],this.pluginHistory[o].push(t)}updatePatches(s){Cc.normalizeArray(s).forEach(t=>{if(t instanceof Error)this.errors.push(t);else try{if(!Cc.isObject(t))return void this.debug("updatePatches","Got a non-object patch",t);if(this.showDebug&&this.allPatches.push(t),Cc.isPromise(t.value))return this.promisedPatches.push(t),void this.promisedPatchThen(t);if(Cc.isContextPatch(t))return void this.setContext(t.path,t.value);if(Cc.isMutation(t))return void this.updateMutations(t)}catch(o){console.error(o),this.errors.push(o)}})}updateMutations(s){"object"==typeof s.value&&!Array.isArray(s.value)&&this.allowMetaPatches&&(s.value=Hc({},s.value));const t=Cc.applyPatch(this.state,s,{allowMetaPatches:this.allowMetaPatches});t&&(this.mutations.push(s),this.state=t)}removePromisedPatch(s){const t=this.promisedPatches.indexOf(s);t<0?this.debug("Tried to remove a promisedPatch that isn't there!"):this.promisedPatches.splice(t,1)}promisedPatchThen(s){return s.value=s.value.then(t=>{const o=Hc(Hc({},s),{},{value:t});this.removePromisedPatch(s),this.updatePatches(o)}).catch(t=>{this.removePromisedPatch(s),this.updatePatches(t)}),s.value}getMutations(s,t){return"number"!=typeof t&&(t=this.mutations.length),this.mutations.slice(s=s||0,t)}getCurrentMutations(){return this.getMutationsForPlugin(this.getCurrentPlugin())}getMutationsForPlugin(s){const t=this.getPluginMutationIndex(s);return this.getMutations(t+1)}getCurrentPlugin(){return this.currentPlugin}getLib(){return this.libMethods}_get(s){return Cc.getIn(this.state,s)}_getContext(s){return this.contextTree.get(s)}setContext(s,t){return this.contextTree.set(s,t)}_hasRun(s){return this.getPluginRunCount(this.getCurrentPlugin())>(s||0)}dispatch(){const s=this,t=this.nextPlugin();if(!t){const _=this.nextPromisedPatch();if(_)return _.then(()=>this.dispatch()).catch(()=>this.dispatch());const M={spec:this.state,errors:this.errors};return this.showDebug&&(M.patches=this.allPatches),Promise.resolve(M)}if(s.pluginCount=s.pluginCount||{},s.pluginCount[t]=(s.pluginCount[t]||0)+1,s.pluginCount[t]>100)return Promise.resolve({spec:s.state,errors:s.errors.concat(new Error("We've reached a hard limit of 100 plugin runs"))});if(t!==this.currentPlugin&&this.promisedPatches.length){const _=this.promisedPatches.map(M=>M.value);return Promise.all(_.map(M=>M.then(Px,Px))).then(()=>this.dispatch())}return function o(){s.currentPlugin=t;const _=s.getCurrentMutations(),M=s.mutations.length-1;try{if(t.isGenerator)for(const w of t(_,s.getLib()))l(w);else l(t(_,s.getLib()))}catch(w){console.error(w),l([Object.assign(Object.create(w),{plugin:t})])}finally{s.updatePluginHistory(t,{mutationIndex:M})}return s.dispatch()}();function l(_){_&&(_=Cc.fullyNormalizeArray(_),s.updatePatches(_,t))}}}function c8(n){return new u8(n).dispatch()}const O0={refs:X6,allOf:o8,parameters:s8,properties:a8},Ix=n=>n.replace(/\W/gi,"_");function d8(n,s){let{v2OperationIdCompatibilityMode:t}=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{};if(t){let o=`${s.toLowerCase()}_${n}`.replace(/[\s!@#$%^&*()_+=[{\]};:<>|./?,\\'""-]/g,"_");return o=o||`${n.substring(1)}_${s}`,o.replace(/((_){2,})/g,"_").replace(/^(_)*/g,"").replace(/([_])*$/g,"")}return`${s.toLowerCase()}${Ix(n)}`}function fA(n,s){let t=arguments.length>2&&void 0!==arguments[2]?arguments[2]:"",{v2OperationIdCompatibilityMode:o}=arguments.length>3&&void 0!==arguments[3]?arguments[3]:{};return n&&"object"==typeof n?(n.operationId||"").replace(/\s/g,"").length?Ix(n.operationId):d8(s,t,{v2OperationIdCompatibilityMode:o}):null}function fC(n){const{spec:s}=n,{paths:t}=s,o={};if(!t||s.$$normalized)return n;for(const l in t){const _=t[l];if(null==_||!["object","function"].includes(typeof _))continue;const M=_.parameters;for(const w in _){const N=_[w];if(null==N||!["object","function"].includes(typeof N))continue;const V=fA(N,l,w);if(V){o[V]?o[V].push(N):o[V]=[N];const X=o[V];if(X.length>1)X.forEach((re,oe)=>{re.__originalOperationId=re.__originalOperationId||re.operationId,re.operationId=`${V}${oe+1}`});else if(void 0!==N.operationId){const re=X[0];re.__originalOperationId=re.__originalOperationId||N.operationId,re.operationId=V}}if("parameters"!==w){const X=[],re={};for(const oe in s)("produces"===oe||"consumes"===oe||"security"===oe)&&(re[oe]=s[oe],X.push(re));if(M&&(re.parameters=M,X.push(re)),X.length)for(const oe of X)for(const fe in oe)if(N[fe]){if("parameters"===fe)for(const ve of oe[fe])N[fe].some(De=>De.name&&De.name===ve.name||De.$ref&&De.$ref===ve.$ref||De.$$ref&&De.$$ref===ve.$$ref||De===ve)||N[fe].push(ve)}else N[fe]=oe[fe]}}}return s.$$normalized=!0,n}function pA(n){return hA.apply(this,arguments)}function hA(){return hA=X_(function*(n){const{spec:s,mode:t,allowMetaPatches:o=!0,pathDiscriminator:l,modelPropertyMacro:_,parameterMacro:M,requestInterceptor:w,responseInterceptor:N,skipNormalization:V,useCircularStructures:X}=n,re=lx(n),oe=ux(n);return function fe(ve){re&&(O0.refs.docCache[re]=ve),O0.refs.fetchJSON=QD(oe,{requestInterceptor:w,responseInterceptor:N});const Pe=[O0.refs];return"function"==typeof M&&Pe.push(O0.parameters),"function"==typeof _&&Pe.push(O0.properties),"strict"!==t&&Pe.push(O0.allOf),c8({spec:ve,context:{baseDoc:re},plugins:Pe,allowMetaPatches:o,pathDiscriminator:l,parameterMacro:M,modelPropertyMacro:_,useCircularStructures:X}).then(V?function(){var De=X_(function*(Ie){return Ie});return function(Ie){return De.apply(this,arguments)}}():fC)}(s)}),hA.apply(this,arguments)}const Lx={name:"generic",match:()=>!0,normalize(n){let{spec:s}=n;const{spec:t}=fC({spec:s});return t},resolve:n=>X_(function*(){return pA(n)})()};function _A(){return _A=X_(function*(n){return pA(n)}),_A.apply(this,arguments)}const Fx=n=>{try{const{openapi:s}=n;return"string"==typeof s&&s.startsWith("3.0")}catch(s){return!1}},kx=n=>Fx(n)||(n=>{try{const{openapi:s}=n;return"string"==typeof s&&s.startsWith("3.1")}catch(s){return!1}})(n),$x={name:"openapi-2",match(n){let{spec:s}=n;return(n=>{try{const{swagger:s}=n;return"2.0"===s}catch(s){return!1}})(s)},normalize(n){let{spec:s}=n;const{spec:t}=fC({spec:s});return t},resolve:n=>X_(function*(){return function f8(n){return _A.apply(this,arguments)}(n)})()};function gA(){return gA=X_(function*(n){return pA(n)}),gA.apply(this,arguments)}const Hx={name:"openapi-3-0",match(n){let{spec:s}=n;return Fx(s)},normalize(n){let{spec:s}=n;const{spec:t}=fC({spec:s});return t},resolve:n=>X_(function*(){return function _8(n){return gA.apply(this,arguments)}(n)})()},g8=function(){var n=X_(function*(s){const{spec:t,requestInterceptor:o,responseInterceptor:l}=s,_=lx(s),M=ux(s),w=t||(yield QD(M,{requestInterceptor:o,responseInterceptor:l})(_)),N=Hc(Hc({},s),{},{spec:w});return s.strategies.find(X=>X.match(N)).resolve(N)});return function(t){return n.apply(this,arguments)}}(),Bx=(n=>function(){var s=X_(function*(t){const o=Hc(Hc({},n),t);return g8(o)});return function(t){return s.apply(this,arguments)}}())({strategies:[Hx,$x,Lx]});var mA=i(72632);function Ux(n,s){if(null==n)return{};var o,l,t=function m8(n,s){if(null==n)return{};var l,_,t={},o=jD(n);for(_=0;_<o.length;_++)l=o[_],!(mA(s).call(s,l)>=0)&&(t[l]=n[l]);return t}(n,s);if(XT){var _=XT(n);for(l=0;l<_.length;l++)o=_[l],!(mA(s).call(s,o)>=0)&&(!Object.prototype.propertyIsEnumerable.call(n,o)||(t[o]=n[o]))}return t}var v8=i(58102),A0=i.n(v8),y8=i(7281);function Yx(n){return"[object Object]"===Object.prototype.toString.call(n)}function jx(n){var s,t;return!1!==Yx(n)&&(void 0===(s=n.constructor)||!(!1===Yx(t=s.prototype)||!1===t.hasOwnProperty("isPrototypeOf")))}const E8={body:function b8(n){let{req:s,value:t}=n;s.body=t},header:function T8(n){let{req:s,parameter:t,value:o}=n;s.headers=s.headers||{},void 0!==o&&(s.headers[t.name]=o)},query:function M8(n){let{req:s,value:t,parameter:o}=n;if(s.query=s.query||{},!1===t&&"boolean"===o.type&&(t="false"),0===t&&["number","integer"].indexOf(o.type)>-1&&(t="0"),t)s.query[o.name]={collectionFormat:o.collectionFormat,value:t};else if(o.allowEmptyValue&&void 0!==t){const l=o.name;s.query[l]=s.query[l]||{},s.query[l].allowEmptyValue=!0}},path:function C8(n){let{req:s,value:t,parameter:o}=n;s.url=s.url.split(`{${o.name}}`).join(encodeURIComponent(t))},formData:function S8(n){let{req:s,value:t,parameter:o}=n;(t||o.allowEmptyValue)&&(s.form=s.form||{},s.form[o.name]={value:t,allowEmptyValue:o.allowEmptyValue,collectionFormat:o.collectionFormat})}};function pC(n,s){return s.includes("application/json")?"string"==typeof n?n:JSON.stringify(n):n.toString()}function O8(n){let{req:s,value:t,parameter:o}=n;const{name:l,style:_,explode:M,content:w}=o;if(w){const V=Object.keys(w)[0];return void(s.url=s.url.split(`{${l}}`).join(T0(pC(t,V),{escape:!0})))}const N=VO({key:o.name,value:t,style:_||"simple",explode:M||!1,escape:!0});s.url=s.url.split(`{${l}}`).join(N)}function A8(n){let{req:s,value:t,parameter:o}=n;if(s.query=s.query||{},o.content){const l=Object.keys(o.content)[0];s.query[o.name]=pC(t,l)}else if(!1===t&&(t="false"),0===t&&(t="0"),t){const{style:l,explode:_,allowReserved:M}=o;s.query[o.name]={value:t,serializationOption:{style:l,explode:_,allowReserved:M}}}else if(o.allowEmptyValue&&void 0!==t){const l=o.name;s.query[l]=s.query[l]||{},s.query[l].allowEmptyValue=!0}}const D8=["accept","authorization","content-type"];function w8(n){let{req:s,parameter:t,value:o}=n;if(s.headers=s.headers||{},!(D8.indexOf(t.name.toLowerCase())>-1)){if(t.content){const l=Object.keys(t.content)[0];return void(s.headers[t.name]=pC(o,l))}void 0!==o&&(s.headers[t.name]=VO({key:t.name,value:o,style:t.style||"simple",explode:void 0!==t.explode&&t.explode,escape:!1}))}}function x8(n){let{req:s,parameter:t,value:o}=n;s.headers=s.headers||{};const l=typeof o;if(t.content){const _=Object.keys(t.content)[0];s.headers.Cookie=`${t.name}=${pC(o,_)}`}else if("undefined"!==l){const _="object"===l&&!Array.isArray(o)&&t.explode?"":`${t.name}=`;s.headers.Cookie=_+VO({key:t.name,value:o,escape:!1,style:t.style||"form",explode:void 0!==t.explode&&t.explode})}}const R8="undefined"!=typeof globalThis?globalThis:"undefined"!=typeof self?self:window,{btoa:N8}=R8,Gx=N8;function zx(n,s){return`${s.toLowerCase()}-${n}`}const B8=["http","fetch","spec","operationId","pathName","method","parameters","securities"],Vx=n=>Array.isArray(n)?n:[],U8=Sx("OperationNotFoundError",function(s,t,o){this.originalError=o,Object.assign(this,t||{})}),G8={buildRequest:Zx};function z8(n){let{http:s,fetch:t,spec:o,operationId:l,pathName:_,method:M,parameters:w,securities:N}=n,V=Ux(n,B8);const X=s||t||WO;_&&M&&!l&&(l=zx(_,M));const re=G8.buildRequest(Hc({spec:o,operationId:l,parameters:w,securities:N,http:X},V));return re.body&&(jx(re.body)||Array.isArray(re.body))&&(re.body=JSON.stringify(re.body)),X(re)}function Zx(n){const{spec:s,operationId:t,responseContentType:o,scheme:l,requestInterceptor:_,responseInterceptor:M,contextUrl:w,userFetch:N,server:V,serverVariables:X,http:re,signal:oe}=n;let{parameters:fe,parameterBuilders:ve}=n;const Pe=kx(s);ve||(ve=Pe?f:E8);let Ie={url:"",credentials:re&&re.withCredentials?"include":"same-origin",headers:{},cookies:{}};oe&&(Ie.signal=oe),_&&(Ie.requestInterceptor=_),M&&(Ie.responseInterceptor=M),N&&(Ie.userFetch=N);const Ae=function H8(n,s){return n&&n.paths?function $8(n,s){return function k8(n,s,t){if(!n||"object"!=typeof n||!n.paths||"object"!=typeof n.paths)return null;const{paths:o}=n;for(const l in o)for(const _ in o[l]){if("PARAMETERS"===_.toUpperCase())continue;const M=o[l][_];if(!M||"object"!=typeof M)continue;const w={spec:n,pathName:l,method:_.toUpperCase(),operation:M},N=s(w);if(t&&N)return w}}(n,s,!0)||null}(n,t=>{let{pathName:o,method:l,operation:_}=t;if(!_||"object"!=typeof _)return!1;const M=_.operationId;return[fA(_,o,l),zx(o,l),M].some(V=>V&&V===s)}):null}(s,t);if(!Ae)throw new U8(`Operation ${t} not found`);const{operation:Y={},method:Et,pathName:ft}=Ae;if(Ie.url+=function V8(n){return kx(n.spec)?function Z8(n){let{spec:s,pathName:t,method:o,server:l,contextUrl:_,serverVariables:M={}}=n;const w=A0()(s,["paths",t,(o||"").toLowerCase(),"servers"])||A0()(s,["paths",t,"servers"])||A0()(s,["servers"]);let N="",V=null;if(l&&w&&w.length){const X=w.map(re=>re.url);X.indexOf(l)>-1&&(N=l,V=w[X.indexOf(l)])}return!N&&w&&w.length&&(N=w[0].url,[V]=w),N.indexOf("{")>-1&&function J8(n){const s=[],t=/{([^}]+)}/g;let o;for(;o=t.exec(n);)s.push(o[1]);return s}(N).forEach(re=>{if(V.variables&&V.variables[re]){const oe=V.variables[re],fe=M[re]||oe.default,ve=new RegExp(`{${re}}`,"g");N=N.replace(ve,fe)}}),function W8(){let n=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"",s=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"";const t=Zv.parse(n&&s?Zv.resolve(s,n):n),o=Zv.parse(s),l=vA(t.protocol)||vA(o.protocol)||"",_=t.host||o.host,M=t.pathname||"";let w;return w=l&&_?`${l}://${_+M}`:M,"/"===w[w.length-1]?w.slice(0,-1):w}(N,_)}(n):function Q8(n){let{spec:s,scheme:t,contextUrl:o=""}=n;const l=Zv.parse(o),_=Array.isArray(s.schemes)?s.schemes[0]:null,M=t||_||vA(l.protocol)||"http",w=s.host||l.host||"",N=s.basePath||"";let V;return V=M&&w?`${M}://${w+N}`:N,"/"===V[V.length-1]?V.slice(0,-1):V}(n)}({spec:s,scheme:l,contextUrl:w,server:V,serverVariables:X,pathName:ft,method:Et}),!t)return delete Ie.cookies,Ie;Ie.url+=ft,Ie.method=`${Et}`.toUpperCase(),fe=fe||{};const xt=s.paths[ft]||{};o&&(Ie.headers.accept=o);const Ht=(n=>{const s={};n.forEach(o=>{s[o.in]||(s[o.in]={}),s[o.in][o.name]=o});const t=[];return Object.keys(s).forEach(o=>{Object.keys(s[o]).forEach(l=>{t.push(s[o][l])})}),t})([].concat(Vx(Y.parameters)).concat(Vx(xt.parameters)));Ht.forEach(It=>{const In=ve[It.in];let On;if("body"===It.in&&It.schema&&It.schema.properties&&(On=fe),On=It&&It.name&&fe[It.name],void 0===On?On=It&&It.name&&fe[`${It.in}.${It.name}`]:((n,s)=>s.filter(t=>t.name===n))(It.name,Ht).length>1&&console.warn(`Parameter '${It.name}' is ambiguous because the defined spec has more than one parameter with the name: '${It.name}' and the passed-in parameter values did not define an 'in' value.`),null!==On){if(void 0!==It.default&&void 0===On&&(On=It.default),void 0===On&&It.required&&!It.allowEmptyValue)throw new Error(`Required parameter ${It.name} is not provided`);if(Pe&&It.schema&&"object"===It.schema.type&&"string"==typeof On)try{On=JSON.parse(On)}catch(Yr){throw new Error("Could not parse object parameter value string as JSON")}In&&In({req:Ie,parameter:It,value:On,operation:Y,spec:s})}});const yn=Hc(Hc({},n),{},{operation:Y});if(Ie=Pe?function P8(n,s){const{operation:t,requestBody:o,securities:l,spec:_,attachContentTypeForEmptyPayload:M}=n;let{requestContentType:w}=n;s=function I8(n){let{request:s,securities:t={},operation:o={},spec:l}=n;const _=Hc({},s),{authorized:M={}}=t,w=o.security||l.security||[],N=M&&!!Object.keys(M).length,V=A0()(l,["components","securitySchemes"])||{};return _.headers=_.headers||{},_.query=_.query||{},Object.keys(t).length&&N&&w&&(!Array.isArray(o.security)||o.security.length)?(w.forEach(X=>{Object.keys(X).forEach(re=>{const oe=M[re],fe=V[re];if(!oe)return;const ve=oe.value||oe,{type:Pe}=fe;if(oe)if("apiKey"===Pe)"query"===fe.in&&(_.query[fe.name]=ve),"header"===fe.in&&(_.headers[fe.name]=ve),"cookie"===fe.in&&(_.cookies[fe.name]=ve);else if("http"===Pe){if(/^basic$/i.test(fe.scheme)){const Ae=Gx(`${ve.username||""}:${ve.password||""}`);_.headers.Authorization=`Basic ${Ae}`}/^bearer$/i.test(fe.scheme)&&(_.headers.Authorization=`Bearer ${ve}`)}else if("oauth2"===Pe||"openIdConnect"===Pe){const De=oe.token||{},Ae=De[fe["x-tokenName"]||"access_token"];let Y=De.token_type;(!Y||"bearer"===Y.toLowerCase())&&(Y="Bearer"),_.headers.Authorization=`${Y} ${Ae}`}})}),_):s}({request:s,securities:l,operation:t,spec:_});const N=t.requestBody||{},V=Object.keys(N.content||{}),X=w&&V.indexOf(w)>-1;if(o||M){if(w&&X)s.headers["Content-Type"]=w;else if(!w){const re=V[0];re&&(s.headers["Content-Type"]=re,w=re)}}else w&&X&&(s.headers["Content-Type"]=w);if(!n.responseContentType&&t.responses){const re=Object.entries(t.responses).filter(oe=>{let[fe,ve]=oe;const Pe=parseInt(fe,10);return Pe>=200&&Pe<300&&jx(ve.content)}).reduce((oe,fe)=>{let[,ve]=fe;return oe.concat(Object.keys(ve.content))},[]);re.length>0&&(s.headers.accept=re.join(", "))}if(o)if(w){if(V.indexOf(w)>-1)if("application/x-www-form-urlencoded"===w||"multipart/form-data"===w)if("object"==typeof o){const re=(N.content[w]||{}).encoding||{};s.form={},Object.keys(o).forEach(oe=>{s.form[oe]={value:o[oe],encoding:re[oe]||{}}})}else s.form=o;else s.body=o}else s.body=o;return s}(yn,Ie):function L8(n,s){const{spec:t,operation:o,securities:l,requestContentType:_,responseContentType:M,attachContentTypeForEmptyPayload:w}=n;if(s=function F8(n){let{request:s,securities:t={},operation:o={},spec:l}=n;const _=Hc({},s),{authorized:M={},specSecurity:w=[]}=t,N=o.security||w,V=M&&!!Object.keys(M).length,X=l.securityDefinitions;return _.headers=_.headers||{},_.query=_.query||{},Object.keys(t).length&&V&&N&&(!Array.isArray(o.security)||o.security.length)?(N.forEach(re=>{Object.keys(re).forEach(oe=>{const fe=M[oe];if(!fe)return;const{token:ve}=fe,Pe=fe.value||fe,De=X[oe],{type:Ie}=De,Y=ve&&ve[De["x-tokenName"]||"access_token"];let Et=ve&&ve.token_type;if(fe)if("apiKey"===Ie){const ft="query"===De.in?"query":"headers";_[ft]=_[ft]||{},_[ft][De.name]=Pe}else"basic"===Ie?Pe.header?_.headers.authorization=Pe.header:(Pe.base64=Gx(`${Pe.username||""}:${Pe.password||""}`),_.headers.authorization=`Basic ${Pe.base64}`):"oauth2"===Ie&&Y&&(Et=Et&&"bearer"!==Et.toLowerCase()?Et:"Bearer",_.headers.authorization=`${Et} ${Y}`)})}),_):s}({request:s,securities:l,operation:o,spec:t}),s.body||s.form||w)_?s.headers["Content-Type"]=_:Array.isArray(o.consumes)?[s.headers["Content-Type"]]=o.consumes:Array.isArray(t.consumes)?[s.headers["Content-Type"]]=t.consumes:o.parameters&&o.parameters.filter(N=>"file"===N.type).length?s.headers["Content-Type"]="multipart/form-data":o.parameters&&o.parameters.filter(N=>"formData"===N.in).length&&(s.headers["Content-Type"]="application/x-www-form-urlencoded");else if(_){const N=o.parameters&&o.parameters.filter(X=>"body"===X.in).length>0,V=o.parameters&&o.parameters.filter(X=>"formData"===X.in).length>0;(N||V)&&(s.headers["Content-Type"]=_)}return!M&&Array.isArray(o.produces)&&o.produces.length>0&&(s.headers.accept=o.produces.join(", ")),s}(yn,Ie),Ie.cookies&&Object.keys(Ie.cookies).length){const It=Object.keys(Ie.cookies).reduce((In,On)=>In+(In?"&":"")+y8.serialize(On,Ie.cookies[On]),"");Ie.headers.Cookie=It}return Ie.cookies&&delete Ie.cookies,ax(Ie),Ie}const vA=n=>n?n.replace(/\W/g,""):null,K8=function(){var n=X_(function*(s,t){let o=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{};const{returnEntireTree:l,baseDoc:_,requestInterceptor:M,responseInterceptor:w,parameterMacro:N,modelPropertyMacro:V,useCircularStructures:X,strategies:re}=o,oe={spec:s,pathDiscriminator:t,baseDoc:_,requestInterceptor:M,responseInterceptor:w,parameterMacro:N,modelPropertyMacro:V,useCircularStructures:X,strategies:re},ve=re.find(De=>De.match(oe)).normalize(oe),Pe=yield Bx(Hc(Hc({},oe),{},{spec:ve,allowMetaPatches:!0,skipNormalization:!0}));return!l&&Array.isArray(t)&&t.length&&(Pe.spec=A0()(Pe.spec,t)||null),Pe});return function(t,o){return n.apply(this,arguments)}}(),X8=(n=>function(){var s=X_(function*(t,o){let l=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{};const _=Hc(Hc({},n),l);return K8(t,o,_)});return function(t,o){return s.apply(this,arguments)}}())({strategies:[Hx,$x,Lx]});var Wx=i(88768),Jx=$l.createContext(null),Qx=function q8(n){n()};var Kx={notify:function(){},get:function(){return[]}};function Xx(n,s){var t,o=Kx;function M(){X.onStateChange&&X.onStateChange()}function N(){t||(t=s?s.addNestedSub(M):n.subscribe(M),o=function nI(){var n=Qx,s=null,t=null;return{clear:function(){s=null,t=null},notify:function(){n(function(){for(var l=s;l;)l.callback(),l=l.next})},get:function(){for(var l=[],_=s;_;)l.push(_),_=_.next;return l},subscribe:function(l){var _=!0,M=t={callback:l,next:null,prev:t};return M.prev?M.prev.next=M:s=M,function(){!_||null===s||(_=!1,M.next?M.next.prev=M.prev:t=M.prev,M.prev?M.prev.next=M.next:s=M.next)}}}}())}var X={addNestedSub:function l(re){return N(),o.subscribe(re)},notifyNestedSubs:function _(){o.notify()},handleChangeWrapper:M,isSubscribed:function w(){return Boolean(t)},trySubscribe:N,tryUnsubscribe:function V(){t&&(t(),t=void 0,o.clear(),o=Kx)},getListeners:function(){return o}};return X}var qx="undefined"!=typeof window&&void 0!==window.document&&void 0!==window.document.createElement?$l.useLayoutEffect:$l.useEffect;const iI=function rI(n){var s=n.store,t=n.context,o=n.children,l=(0,$l.useMemo)(function(){var w=Xx(s);return{store:s,subscription:w}},[s]),_=(0,$l.useMemo)(function(){return s.getState()},[s]);return qx(function(){var w=l.subscription;return w.onStateChange=w.notifyNestedSubs,w.trySubscribe(),_!==s.getState()&&w.notifyNestedSubs(),function(){w.tryUnsubscribe(),w.onStateChange=null}},[l,_]),$l.createElement((t||Jx).Provider,{value:l},o)};function gm(){return gm=Object.assign?Object.assign.bind():function(n){for(var s=1;s<arguments.length;s++){var t=arguments[s];for(var o in t)Object.prototype.hasOwnProperty.call(t,o)&&(n[o]=t[o])}return n},gm.apply(this,arguments)}function zE(n,s){if(null==n)return{};var l,_,t={},o=Object.keys(n);for(_=0;_<o.length;_++)!(s.indexOf(l=o[_])>=0)&&(t[l]=n[l]);return t}var oI=i(62568),eR=i.n(oI),sI=i(56261),aI=["getDisplayName","methodName","renderCountProp","shouldHandleStateChanges","storeKey","withRef","forwardRef","context"],lI=["reactReduxForwardedRef"],uI=[],cI=[null,null];function dI(n,s){return[s.payload,n[1]+1]}function tR(n,s,t){qx(function(){return n.apply(void 0,s)},t)}function fI(n,s,t,o,l,_,M){n.current=o,s.current=l,t.current=!1,_.current&&(_.current=null,M())}function pI(n,s,t,o,l,_,M,w,N,V){if(n){var X=!1,re=null,oe=function(){if(!X){var De,Ie,Pe=s.getState();try{De=o(Pe,l.current)}catch(Ae){Ie=Ae,re=Ae}Ie||(re=null),De===_.current?M.current||N():(_.current=De,w.current=De,M.current=!0,V({type:"STORE_UPDATED",payload:{error:Ie}}))}};return t.onStateChange=oe,t.trySubscribe(),oe(),function(){if(X=!0,t.tryUnsubscribe(),t.onStateChange=null,re)throw re}}}var hI=function(){return[null,0]};function _I(n,s){void 0===s&&(s={});var o=s.getDisplayName,l=void 0===o?function(xt){return"ConnectAdvanced("+xt+")"}:o,_=s.methodName,M=void 0===_?"connectAdvanced":_,w=s.renderCountProp,N=void 0===w?void 0:w,V=s.shouldHandleStateChanges,X=void 0===V||V,re=s.storeKey,oe=void 0===re?"store":re,Pe=s.forwardRef,De=void 0!==Pe&&Pe,Ie=s.context,Ae=void 0===Ie?Jx:Ie,Y=zE(s,aI),ft=Ae;return function(Ht){var yn=Ht.displayName||Ht.name||"Component",It=l(yn),In=gm({},Y,{getDisplayName:l,methodName:M,renderCountProp:N,shouldHandleStateChanges:X,storeKey:oe,displayName:It,wrappedComponentName:yn,WrappedComponent:Ht}),On=Y.pure,Ir=On?$l.useMemo:function(Un){return Un()};function Hr(Un){var Yn=(0,$l.useMemo)(function(){var kr=Un.reactReduxForwardedRef,Ni=zE(Un,lI);return[Un.context,kr,Ni]},[Un]),ir=Yn[0],An=Yn[1],Lr=Yn[2],Wi=(0,$l.useMemo)(function(){return ir&&ir.Consumer&&(0,sI.isContextConsumer)($l.createElement(ir.Consumer,null))?ir:ft},[ir,ft]),Mi=(0,$l.useContext)(Wi),Yi=Boolean(Un.store)&&Boolean(Un.store.getState)&&Boolean(Un.store.dispatch),Nn=(Boolean(Mi)&&Boolean(Mi.store),Yi?Un.store:Mi.store),fn=(0,$l.useMemo)(function(){return function Yr(Un){return n(Un.dispatch,In)}(Nn)},[Nn]),Vr=(0,$l.useMemo)(function(){if(!X)return cI;var kr=Xx(Nn,Yi?null:Mi.subscription),Ni=kr.notifyNestedSubs.bind(kr);return[kr,Ni]},[Nn,Yi,Mi]),xi=Vr[0],Ji=Vr[1],Ho=(0,$l.useMemo)(function(){return Yi?Mi:gm({},Mi,{subscription:xi})},[Yi,Mi,xi]),Ao=(0,$l.useReducer)(dI,uI,hI),Qs=Ao[0][0],Ri=Ao[1];if(Qs&&Qs.error)throw Qs.error;var uo=(0,$l.useRef)(),bo=(0,$l.useRef)(Lr),Ye=(0,$l.useRef)(),Ct=(0,$l.useRef)(!1),bt=Ir(function(){return Ye.current&&Lr===bo.current?Ye.current:fn(Nn.getState(),Lr)},[Nn,Qs,Lr]);tR(fI,[bo,uo,Ct,Lr,bt,Ye,Ji]),tR(pI,[X,Nn,xi,fn,bo,uo,Ct,Ye,Ji,Ri],[Nn,xi,fn]);var Vn=(0,$l.useMemo)(function(){return $l.createElement(Ht,gm({},bt,{ref:An}))},[An,Ht,bt]);return(0,$l.useMemo)(function(){return X?$l.createElement(Wi.Provider,{value:Ho},Vn):Vn},[Wi,Vn,Ho])}var Wr=On?$l.memo(Hr):Hr;if(Wr.WrappedComponent=Ht,Wr.displayName=Hr.displayName=It,De){var En=$l.forwardRef(function(Yn,ir){return $l.createElement(Wr,gm({},Yn,{reactReduxForwardedRef:ir}))});return En.displayName=It,En.WrappedComponent=Ht,eR()(En,Ht)}return eR()(Wr,Ht)}}function nR(n,s){return n===s?0!==n||0!==s||1/n==1/s:n!=n&&s!=s}function yA(n,s){if(nR(n,s))return!0;if("object"!=typeof n||null===n||"object"!=typeof s||null===s)return!1;var t=Object.keys(n),o=Object.keys(s);if(t.length!==o.length)return!1;for(var l=0;l<t.length;l++)if(!Object.prototype.hasOwnProperty.call(s,t[l])||!nR(n[t[l]],s[t[l]]))return!1;return!0}function EA(n){return function(t,o){var l=n(t,o);function _(){return l}return _.dependsOnOwnProps=!1,_}}function rR(n){return null!=n.dependsOnOwnProps?Boolean(n.dependsOnOwnProps):1!==n.length}function iR(n,s){return function(o,l){var M=function(N,V){return M.dependsOnOwnProps?M.mapToProps(N,V):M.mapToProps(N)};return M.dependsOnOwnProps=!0,M.mapToProps=function(N,V){M.mapToProps=n,M.dependsOnOwnProps=rR(n);var X=M(N,V);return"function"==typeof X&&(M.mapToProps=X,M.dependsOnOwnProps=rR(X),X=M(N,V)),X},M}}const EI=[function mI(n){return"function"==typeof n?iR(n):void 0},function vI(n){return n?void 0:EA(function(s){return{dispatch:s}})},function yI(n){return n&&"object"==typeof n?EA(function(s){return function gI(n,s){var t={},o=function(M){var w=n[M];"function"==typeof w&&(t[M]=function(){return s(w.apply(void 0,arguments))})};for(var l in n)o(l);return t}(n,s)}):void 0}],TI=[function bI(n){return"function"==typeof n?iR(n):void 0},function SI(n){return n?void 0:EA(function(){return{}})}];function CI(n,s,t){return gm({},t,n,s)}const DI=[function OI(n){return"function"==typeof n?function MI(n){return function(t,o){var N,_=o.pure,M=o.areMergedPropsEqual,w=!1;return function(X,re,oe){var fe=n(X,re,oe);return w?(!_||!M(fe,N))&&(N=fe):(w=!0,N=fe),N}}}(n):void 0},function AI(n){return n?void 0:function(){return CI}}];var wI=["initMapStateToProps","initMapDispatchToProps","initMergeProps"];function xI(n,s,t,o){return function(_,M){return t(n(_,M),s(o,M),M)}}function RI(n,s,t,o,l){var V,X,re,oe,fe,_=l.areStatesEqual,M=l.areOwnPropsEqual,w=l.areStatePropsEqual,N=!1;return function(Et,ft){return N?function Ae(Y,Et){var ft=!M(Et,X),xt=!_(Y,V,Et,X);return V=Y,X=Et,ft&&xt?function Pe(){return re=n(V,X),s.dependsOnOwnProps&&(oe=s(o,X)),fe=t(re,oe,X)}():ft?function De(){return n.dependsOnOwnProps&&(re=n(V,X)),s.dependsOnOwnProps&&(oe=s(o,X)),fe=t(re,oe,X)}():xt?function Ie(){var Y=n(V,X),Et=!w(Y,re);return re=Y,Et&&(fe=t(re,oe,X)),fe}():fe}(Et,ft):function ve(Y,Et){return re=n(V=Y,X=Et),oe=s(o,X),fe=t(re,oe,X),N=!0,fe}(Et,ft)}}function NI(n,s){var t=s.initMapStateToProps,o=s.initMapDispatchToProps,l=s.initMergeProps,_=zE(s,wI),M=t(n,_),w=o(n,_),N=l(n,_);return(_.pure?RI:xI)(M,w,N,n,_)}var PI=["pure","areStatesEqual","areOwnPropsEqual","areStatePropsEqual","areMergedPropsEqual"];function bA(n,s,t){for(var o=s.length-1;o>=0;o--){var l=s[o](n);if(l)return l}return function(_,M){throw new Error("Invalid value of type "+typeof n+" for "+t+" argument when connecting component "+M.wrappedComponentName+".")}}function II(n,s){return n===s}function LI(n){var s=void 0===n?{}:n,t=s.connectHOC,o=void 0===t?_I:t,l=s.mapStateToPropsFactories,_=void 0===l?TI:l,M=s.mapDispatchToPropsFactories,w=void 0===M?EI:M,N=s.mergePropsFactories,V=void 0===N?DI:N,X=s.selectorFactory,re=void 0===X?NI:X;return function(fe,ve,Pe,De){void 0===De&&(De={});var Ae=De.pure,Y=void 0===Ae||Ae,Et=De.areStatesEqual,ft=void 0===Et?II:Et,xt=De.areOwnPropsEqual,Ht=void 0===xt?yA:xt,yn=De.areStatePropsEqual,It=void 0===yn?yA:yn,In=De.areMergedPropsEqual,On=void 0===In?yA:In,Yr=zE(De,PI),Ir=bA(fe,_,"mapStateToProps"),Hr=bA(ve,w,"mapDispatchToProps"),Wr=bA(Pe,V,"mergeProps");return o(re,gm({methodName:"connect",getDisplayName:function(Un){return"Connect("+Un+")"},shouldHandleStateChanges:Boolean(fe),initMapStateToProps:Ir,initMapDispatchToProps:Hr,initMergeProps:Wr,pure:Y,areStatesEqual:ft,areOwnPropsEqual:Ht,areStatePropsEqual:It,areMergedPropsEqual:On},Yr))}}const FI=LI();Qx=Wx.unstable_batchedUpdates;var HI=i(12482),BI=i.n(HI),UI=i(80290),YI=i.n(UI);function SA(n,s){(null==s||s>n.length)&&(s=n.length);for(var t=0,o=new Array(s);t<s;t++)o[t]=n[t];return o}function WI(n){return function GI(n){if(Array.isArray(n))return SA(n)}(n)||function zI(n){if("undefined"!=typeof Symbol&&null!=n[Symbol.iterator]||null!=n["@@iterator"])return Array.from(n)}(n)||function VI(n,s){if(n){if("string"==typeof n)return SA(n,s);var t=Object.prototype.toString.call(n).slice(8,-1);if("Object"===t&&n.constructor&&(t=n.constructor.name),"Map"===t||"Set"===t)return Array.from(n);if("Arguments"===t||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t))return SA(n,s)}}(n)||function ZI(){throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}function VE(n){return(VE="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(s){return typeof s}:function(s){return s&&"function"==typeof Symbol&&s.constructor===Symbol&&s!==Symbol.prototype?"symbol":typeof s})(n)}function TA(n,s,t){return(s=function QI(n){var s=function JI(n,s){if("object"!==VE(n)||null===n)return n;var t=n[Symbol.toPrimitive];if(void 0!==t){var o=t.call(n,s||"default");if("object"!==VE(o))return o;throw new TypeError("@@toPrimitive must return a primitive value.")}return("string"===s?String:Number)(n)}(n,"string");return"symbol"===VE(s)?s:String(s)}(s))in n?Object.defineProperty(n,s,{value:t,enumerable:!0,configurable:!0,writable:!0}):n[s]=t,n}function oR(n,s){var t=Object.keys(n);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(n);s&&(o=o.filter(function(l){return Object.getOwnPropertyDescriptor(n,l).enumerable})),t.push.apply(t,o)}return t}function D0(n){for(var s=1;s<arguments.length;s++){var t=null!=arguments[s]?arguments[s]:{};s%2?oR(Object(t),!0).forEach(function(o){TA(n,o,t[o])}):Object.getOwnPropertyDescriptors?Object.defineProperties(n,Object.getOwnPropertyDescriptors(t)):oR(Object(t)).forEach(function(o){Object.defineProperty(n,o,Object.getOwnPropertyDescriptor(t,o))})}return n}var CA={};function XI(n){if(0===n.length||1===n.length)return n;var s=n.join(".");return CA[s]||(CA[s]=function KI(n){var s=n.length;return 0===s||1===s?n:2===s?[n[0],n[1],"".concat(n[0],".").concat(n[1]),"".concat(n[1],".").concat(n[0])]:3===s?[n[0],n[1],n[2],"".concat(n[0],".").concat(n[1]),"".concat(n[0],".").concat(n[2]),"".concat(n[1],".").concat(n[0]),"".concat(n[1],".").concat(n[2]),"".concat(n[2],".").concat(n[0]),"".concat(n[2],".").concat(n[1]),"".concat(n[0],".").concat(n[1],".").concat(n[2]),"".concat(n[0],".").concat(n[2],".").concat(n[1]),"".concat(n[1],".").concat(n[0],".").concat(n[2]),"".concat(n[1],".").concat(n[2],".").concat(n[0]),"".concat(n[2],".").concat(n[0],".").concat(n[1]),"".concat(n[2],".").concat(n[1],".").concat(n[0])]:s>=4?[n[0],n[1],n[2],n[3],"".concat(n[0],".").concat(n[1]),"".concat(n[0],".").concat(n[2]),"".concat(n[0],".").concat(n[3]),"".concat(n[1],".").concat(n[0]),"".concat(n[1],".").concat(n[2]),"".concat(n[1],".").concat(n[3]),"".concat(n[2],".").concat(n[0]),"".concat(n[2],".").concat(n[1]),"".concat(n[2],".").concat(n[3]),"".concat(n[3],".").concat(n[0]),"".concat(n[3],".").concat(n[1]),"".concat(n[3],".").concat(n[2]),"".concat(n[0],".").concat(n[1],".").concat(n[2]),"".concat(n[0],".").concat(n[1],".").concat(n[3]),"".concat(n[0],".").concat(n[2],".").concat(n[1]),"".concat(n[0],".").concat(n[2],".").concat(n[3]),"".concat(n[0],".").concat(n[3],".").concat(n[1]),"".concat(n[0],".").concat(n[3],".").concat(n[2]),"".concat(n[1],".").concat(n[0],".").concat(n[2]),"".concat(n[1],".").concat(n[0],".").concat(n[3]),"".concat(n[1],".").concat(n[2],".").concat(n[0]),"".concat(n[1],".").concat(n[2],".").concat(n[3]),"".concat(n[1],".").concat(n[3],".").concat(n[0]),"".concat(n[1],".").concat(n[3],".").concat(n[2]),"".concat(n[2],".").concat(n[0],".").concat(n[1]),"".concat(n[2],".").concat(n[0],".").concat(n[3]),"".concat(n[2],".").concat(n[1],".").concat(n[0]),"".concat(n[2],".").concat(n[1],".").concat(n[3]),"".concat(n[2],".").concat(n[3],".").concat(n[0]),"".concat(n[2],".").concat(n[3],".").concat(n[1]),"".concat(n[3],".").concat(n[0],".").concat(n[1]),"".concat(n[3],".").concat(n[0],".").concat(n[2]),"".concat(n[3],".").concat(n[1],".").concat(n[0]),"".concat(n[3],".").concat(n[1],".").concat(n[2]),"".concat(n[3],".").concat(n[2],".").concat(n[0]),"".concat(n[3],".").concat(n[2],".").concat(n[1]),"".concat(n[0],".").concat(n[1],".").concat(n[2],".").concat(n[3]),"".concat(n[0],".").concat(n[1],".").concat(n[3],".").concat(n[2]),"".concat(n[0],".").concat(n[2],".").concat(n[1],".").concat(n[3]),"".concat(n[0],".").concat(n[2],".").concat(n[3],".").concat(n[1]),"".concat(n[0],".").concat(n[3],".").concat(n[1],".").concat(n[2]),"".concat(n[0],".").concat(n[3],".").concat(n[2],".").concat(n[1]),"".concat(n[1],".").concat(n[0],".").concat(n[2],".").concat(n[3]),"".concat(n[1],".").concat(n[0],".").concat(n[3],".").concat(n[2]),"".concat(n[1],".").concat(n[2],".").concat(n[0],".").concat(n[3]),"".concat(n[1],".").concat(n[2],".").concat(n[3],".").concat(n[0]),"".concat(n[1],".").concat(n[3],".").concat(n[0],".").concat(n[2]),"".concat(n[1],".").concat(n[3],".").concat(n[2],".").concat(n[0]),"".concat(n[2],".").concat(n[0],".").concat(n[1],".").concat(n[3]),"".concat(n[2],".").concat(n[0],".").concat(n[3],".").concat(n[1]),"".concat(n[2],".").concat(n[1],".").concat(n[0],".").concat(n[3]),"".concat(n[2],".").concat(n[1],".").concat(n[3],".").concat(n[0]),"".concat(n[2],".").concat(n[3],".").concat(n[0],".").concat(n[1]),"".concat(n[2],".").concat(n[3],".").concat(n[1],".").concat(n[0]),"".concat(n[3],".").concat(n[0],".").concat(n[1],".").concat(n[2]),"".concat(n[3],".").concat(n[0],".").concat(n[2],".").concat(n[1]),"".concat(n[3],".").concat(n[1],".").concat(n[0],".").concat(n[2]),"".concat(n[3],".").concat(n[1],".").concat(n[2],".").concat(n[0]),"".concat(n[3],".").concat(n[2],".").concat(n[0],".").concat(n[1]),"".concat(n[3],".").concat(n[2],".").concat(n[1],".").concat(n[0])]:void 0}(n)),CA[s]}function qI(n){var s=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},t=arguments.length>2?arguments[2]:void 0,o=n.filter(function(_){return"token"!==_}),l=XI(o);return l.reduce(function(_,M){return D0(D0({},_),t[M])},s)}function sR(n){return n.join(" ")}function aR(n){var s=n.node,t=n.stylesheet,o=n.style,l=void 0===o?{}:o,_=n.useInlineStyles,M=n.key,w=s.properties,V=s.tagName;if("text"===s.type)return s.value;if(V){var oe,re=function e4(n,s){var t=0;return function(o){return t+=1,o.map(function(l,_){return aR({node:l,stylesheet:n,useInlineStyles:s,key:"code-segment-".concat(t,"-").concat(_)})})}}(t,_);if(_){var fe=Object.keys(t).reduce(function(Ie,Ae){return Ae.split(".").forEach(function(Y){Ie.includes(Y)||Ie.push(Y)}),Ie},[]),ve=w.className&&w.className.includes("token")?["token"]:[],Pe=w.className&&ve.concat(w.className.filter(function(Ie){return!fe.includes(Ie)}));oe=D0(D0({},w),{},{className:sR(Pe)||void 0,style:qI(w.className,Object.assign({},w.style,l),t)})}else oe=D0(D0({},w),{},{className:sR(w.className)});var De=re(s.children);return $l.createElement(V,gm({key:M},oe),De)}}var n4=["language","children","style","customStyle","codeTagProps","useInlineStyles","showLineNumbers","showInlineLineNumbers","startingLineNumber","lineNumberContainerStyle","lineNumberStyle","wrapLines","wrapLongLines","lineProps","renderer","PreTag","CodeTag","code","astGenerator"];function lR(n,s){var t=Object.keys(n);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(n);s&&(o=o.filter(function(l){return Object.getOwnPropertyDescriptor(n,l).enumerable})),t.push.apply(t,o)}return t}function Bg(n){for(var s=1;s<arguments.length;s++){var t=null!=arguments[s]?arguments[s]:{};s%2?lR(Object(t),!0).forEach(function(o){TA(n,o,t[o])}):Object.getOwnPropertyDescriptors?Object.defineProperties(n,Object.getOwnPropertyDescriptors(t)):lR(Object(t)).forEach(function(o){Object.defineProperty(n,o,Object.getOwnPropertyDescriptor(t,o))})}return n}var r4=/\n/g;function s4(n){var s=n.codeString,o=n.containerStyle,_=n.numberStyle,M=void 0===_?{}:_,w=n.startingLineNumber;return $l.createElement("code",{style:Object.assign({},n.codeStyle,void 0===o?{float:"left",paddingRight:"10px"}:o)},function o4(n){var t=n.startingLineNumber,o=n.style;return n.lines.map(function(l,_){var M=_+t;return $l.createElement("span",{key:"line-".concat(_),className:"react-syntax-highlighter-line-number",style:"function"==typeof o?o(M):o},"".concat(M,"\n"))})}({lines:s.replace(/\n$/,"").split("\n"),style:M,startingLineNumber:w}))}function a4(n){return"".concat(n.toString().length,".25em")}function uR(n,s){return{type:"element",tagName:"span",properties:{key:"line-number--".concat(n),className:["comment","linenumber","react-syntax-highlighter-line-number"],style:s},children:[{type:"text",value:n}]}}function cR(n,s,t){var o={display:"inline-block",minWidth:a4(t),paddingRight:"1em",textAlign:"right",userSelect:"none"},l="function"==typeof n?n(s):n;return Bg(Bg({},o),l)}function hC(n){var s=n.children,t=n.lineNumber,o=n.lineNumberStyle,l=n.largestLineNumber,_=n.showInlineLineNumbers,M=n.lineProps,w=void 0===M?{}:M,N=n.className,V=void 0===N?[]:N,X=n.showLineNumbers,re=n.wrapLongLines,oe="function"==typeof w?w(t):w;if(oe.className=V,t&&_){var fe=cR(o,t,l);s.unshift(uR(t,fe))}return re&X&&(oe.style=Bg(Bg({},oe.style),{},{display:"flex"})),{type:"element",tagName:"span",properties:oe,children:s}}function dR(n){for(var s=arguments.length>1&&void 0!==arguments[1]?arguments[1]:[],t=arguments.length>2&&void 0!==arguments[2]?arguments[2]:[],o=0;o<n.length;o++){var l=n[o];if("text"===l.type)t.push(hC({children:[l],className:WI(new Set(s))}));else if(l.children){var _=s.concat(l.properties.className);dR(l.children,_).forEach(function(M){return t.push(M)})}}return t}function l4(n,s,t,o,l,_,M,w,N){var V,X=dR(n.value),re=[],oe=-1,fe=0;function ve(ft,xt){var Ht=arguments.length>2&&void 0!==arguments[2]?arguments[2]:[];return hC({children:ft,lineNumber:xt,lineNumberStyle:w,largestLineNumber:M,showInlineLineNumbers:l,lineProps:t,className:Ht,showLineNumbers:o,wrapLongLines:N})}function Pe(ft,xt){if(o&&xt&&l){var Ht=cR(w,xt,M);ft.unshift(uR(xt,Ht))}return ft}function De(ft,xt){var Ht=arguments.length>2&&void 0!==arguments[2]?arguments[2]:[];return s||Ht.length>0?ve(ft,xt,Ht):Pe(ft,xt)}for(var Ie=function(){var xt=X[fe],Ht=xt.children[0].value,yn=function i4(n){return n.match(r4)}(Ht);if(yn){var It=Ht.split("\n");It.forEach(function(In,On){var Yr=o&&re.length+_,Ir={type:"text",value:"".concat(In,"\n")};if(0===On){var Wr=De(X.slice(oe+1,fe).concat(hC({children:[Ir],className:xt.properties.className})),Yr);re.push(Wr)}else if(On===It.length-1){var En=X[fe+1]&&X[fe+1].children&&X[fe+1].children[0],Un={type:"text",value:"".concat(In)};if(En){var Yn=hC({children:[Un],className:xt.properties.className});X.splice(fe+1,0,Yn)}else{var An=De([Un],Yr,xt.properties.className);re.push(An)}}else{var Wi=De([Ir],Yr,xt.properties.className);re.push(Wi)}}),oe=fe}fe++};fe<X.length;)Ie();if(oe!==X.length-1){var Ae=X.slice(oe+1,X.length);if(Ae&&Ae.length){var Et=De(Ae,o&&re.length+_);re.push(Et)}}return s?re:(V=[]).concat.apply(V,re)}function u4(n){var t=n.stylesheet,o=n.useInlineStyles;return n.rows.map(function(l,_){return aR({node:l,stylesheet:t,useInlineStyles:o,key:"code-segement".concat(_)})})}function fR(n){return n&&void 0!==n.highlightAuto}var pR=i(74538),hR=function d4(n,s){return function(o){var l=o.language,_=o.children,M=o.style,w=void 0===M?s:M,N=o.customStyle,V=void 0===N?{}:N,X=o.codeTagProps,re=void 0===X?{className:l?"language-".concat(l):void 0,style:Bg(Bg({},w['code[class*="language-"]']),w['code[class*="language-'.concat(l,'"]')])}:X,oe=o.useInlineStyles,fe=void 0===oe||oe,ve=o.showLineNumbers,Pe=void 0!==ve&&ve,De=o.showInlineLineNumbers,Ie=void 0===De||De,Ae=o.startingLineNumber,Y=void 0===Ae?1:Ae,Et=o.lineNumberContainerStyle,ft=o.lineNumberStyle,xt=void 0===ft?{}:ft,Ht=o.wrapLines,yn=o.wrapLongLines,It=void 0!==yn&&yn,In=o.lineProps,On=void 0===In?{}:In,Yr=o.renderer,Ir=o.PreTag,Hr=void 0===Ir?"pre":Ir,Wr=o.CodeTag,En=void 0===Wr?"code":Wr,Un=o.code,Yn=void 0===Un?(Array.isArray(_)?_[0]:_)||"":Un,ir=o.astGenerator,An=function jI(n,s){if(null==n)return{};var o,l,t=zE(n,s);if(Object.getOwnPropertySymbols){var _=Object.getOwnPropertySymbols(n);for(l=0;l<_.length;l++)!(s.indexOf(o=_[l])>=0)&&(!Object.prototype.propertyIsEnumerable.call(n,o)||(t[o]=n[o]))}return t}(o,n4);ir=ir||n;var Lr=Pe?$l.createElement(s4,{containerStyle:Et,codeStyle:re.style||{},numberStyle:xt,startingLineNumber:Y,codeString:Yn}):null,Wi=w.hljs||w['pre[class*="language-"]']||{backgroundColor:"#fff"},Mi=fR(ir)?"hljs":"prismjs",Yi=Object.assign({},An,fe?{style:Object.assign({},Wi,V)}:{className:An.className?"".concat(Mi," ").concat(An.className):Mi,style:Object.assign({},V)});if(re.style=Bg(Bg({},re.style),{},It?{whiteSpace:"pre-wrap"}:{whiteSpace:"pre"}),!ir)return $l.createElement(Hr,Yi,Lr,$l.createElement(En,re,Yn));(void 0===Ht&&Yr||It)&&(Ht=!0),Yr=Yr||u4;var jr=[{type:"text",value:Yn}],Nn=function c4(n){var s=n.astGenerator,t=n.language,o=n.code,l=n.defaultCodeValue;if(fR(s)){var _=function(n,s){return-1!==n.listLanguages().indexOf(s)}(s,t);return"text"===t?{value:l,language:"text"}:_?s.highlight(t,o):s.highlightAuto(o)}try{return t&&"text"!==t?{value:s.highlight(o,t)}:{value:l}}catch(M){return{value:l}}}({astGenerator:ir,language:l,code:Yn,defaultCodeValue:jr});null===Nn.language&&(Nn.value=jr);var Vr=l4(Nn,Ht,On,Pe,Ie,Y,Nn.value.length+Y,xt,It);return $l.createElement(Hr,Yi,$l.createElement(En,re,!Ie&&Lr,Yr({rows:Vr,stylesheet:w,useInlineStyles:fe})))}}(pR,{});hR.registerLanguage=pR.registerLanguage;const f4=hR;var p4=i(36147);const _4=i.n(p4)();var g4=i(92229);const v4=i.n(g4)();var y4=i(13546);const b4=i.n(y4)();var S4=i(4357);const C4=i.n(S4)();var M4=i(44776);const A4=i.n(M4)();var D4=i(28390);const x4=i.n(D4)();var R4=i(78932);const P4=i.n(R4)(),I4={hljs:{display:"block",overflowX:"auto",padding:"0.5em",background:"#333",color:"white"},"hljs-name":{fontWeight:"bold"},"hljs-strong":{fontWeight:"bold"},"hljs-code":{fontStyle:"italic",color:"#888"},"hljs-emphasis":{fontStyle:"italic"},"hljs-tag":{color:"#62c8f3"},"hljs-variable":{color:"#ade5fc"},"hljs-template-variable":{color:"#ade5fc"},"hljs-selector-id":{color:"#ade5fc"},"hljs-selector-class":{color:"#ade5fc"},"hljs-string":{color:"#a2fca2"},"hljs-bullet":{color:"#d36363"},"hljs-type":{color:"#ffa"},"hljs-title":{color:"#ffa"},"hljs-section":{color:"#ffa"},"hljs-attribute":{color:"#ffa"},"hljs-quote":{color:"#ffa"},"hljs-built_in":{color:"#ffa"},"hljs-builtin-name":{color:"#ffa"},"hljs-number":{color:"#d36363"},"hljs-symbol":{color:"#d36363"},"hljs-keyword":{color:"#fcc28c"},"hljs-selector-tag":{color:"#fcc28c"},"hljs-literal":{color:"#fcc28c"},"hljs-comment":{color:"#888"},"hljs-deletion":{color:"#333",backgroundColor:"#fc9b9b"},"hljs-regexp":{color:"#c6b4f0"},"hljs-link":{color:"#c6b4f0"},"hljs-meta":{color:"#fc9b9b"},"hljs-addition":{backgroundColor:"#a2fca2",color:"#333"}},L4={hljs:{display:"block",overflowX:"auto",padding:"0.5em",background:"#222",color:"#aaa"},"hljs-subst":{color:"#aaa"},"hljs-section":{color:"#fff",fontWeight:"bold"},"hljs-comment":{color:"#444"},"hljs-quote":{color:"#444"},"hljs-meta":{color:"#444"},"hljs-string":{color:"#ffcc33"},"hljs-symbol":{color:"#ffcc33"},"hljs-bullet":{color:"#ffcc33"},"hljs-regexp":{color:"#ffcc33"},"hljs-number":{color:"#00cc66"},"hljs-addition":{color:"#00cc66"},"hljs-built_in":{color:"#32aaee"},"hljs-builtin-name":{color:"#32aaee"},"hljs-literal":{color:"#32aaee"},"hljs-type":{color:"#32aaee"},"hljs-template-variable":{color:"#32aaee"},"hljs-attribute":{color:"#32aaee"},"hljs-link":{color:"#32aaee"},"hljs-keyword":{color:"#6644aa"},"hljs-selector-tag":{color:"#6644aa"},"hljs-name":{color:"#6644aa"},"hljs-selector-id":{color:"#6644aa"},"hljs-selector-class":{color:"#6644aa"},"hljs-title":{color:"#bb1166"},"hljs-variable":{color:"#bb1166"},"hljs-deletion":{color:"#bb1166"},"hljs-template-tag":{color:"#bb1166"},"hljs-doctag":{fontWeight:"bold"},"hljs-strong":{fontWeight:"bold"},"hljs-emphasis":{fontStyle:"italic"}},F4={hljs:{display:"block",overflowX:"auto",padding:"0.5em",background:"#272822",color:"#ddd"},"hljs-tag":{color:"#f92672"},"hljs-keyword":{color:"#f92672",fontWeight:"bold"},"hljs-selector-tag":{color:"#f92672",fontWeight:"bold"},"hljs-literal":{color:"#f92672",fontWeight:"bold"},"hljs-strong":{color:"#f92672"},"hljs-name":{color:"#f92672"},"hljs-code":{color:"#66d9ef"},"hljs-class .hljs-title":{color:"white"},"hljs-attribute":{color:"#bf79db"},"hljs-symbol":{color:"#bf79db"},"hljs-regexp":{color:"#bf79db"},"hljs-link":{color:"#bf79db"},"hljs-string":{color:"#a6e22e"},"hljs-bullet":{color:"#a6e22e"},"hljs-subst":{color:"#a6e22e"},"hljs-title":{color:"#a6e22e",fontWeight:"bold"},"hljs-section":{color:"#a6e22e",fontWeight:"bold"},"hljs-emphasis":{color:"#a6e22e"},"hljs-type":{color:"#a6e22e",fontWeight:"bold"},"hljs-built_in":{color:"#a6e22e"},"hljs-builtin-name":{color:"#a6e22e"},"hljs-selector-attr":{color:"#a6e22e"},"hljs-selector-pseudo":{color:"#a6e22e"},"hljs-addition":{color:"#a6e22e"},"hljs-variable":{color:"#a6e22e"},"hljs-template-tag":{color:"#a6e22e"},"hljs-template-variable":{color:"#a6e22e"},"hljs-comment":{color:"#75715e"},"hljs-quote":{color:"#75715e"},"hljs-deletion":{color:"#75715e"},"hljs-meta":{color:"#75715e"},"hljs-doctag":{fontWeight:"bold"},"hljs-selector-id":{fontWeight:"bold"}},k4={hljs:{display:"block",overflowX:"auto",padding:"0.5em",background:"#2E3440",color:"#D8DEE9"},"hljs-subst":{color:"#D8DEE9"},"hljs-selector-tag":{color:"#81A1C1"},"hljs-selector-id":{color:"#8FBCBB",fontWeight:"bold"},"hljs-selector-class":{color:"#8FBCBB"},"hljs-selector-attr":{color:"#8FBCBB"},"hljs-selector-pseudo":{color:"#88C0D0"},"hljs-addition":{backgroundColor:"rgba(163, 190, 140, 0.5)"},"hljs-deletion":{backgroundColor:"rgba(191, 97, 106, 0.5)"},"hljs-built_in":{color:"#8FBCBB"},"hljs-type":{color:"#8FBCBB"},"hljs-class":{color:"#8FBCBB"},"hljs-function":{color:"#88C0D0"},"hljs-function > .hljs-title":{color:"#88C0D0"},"hljs-keyword":{color:"#81A1C1"},"hljs-literal":{color:"#81A1C1"},"hljs-symbol":{color:"#81A1C1"},"hljs-number":{color:"#B48EAD"},"hljs-regexp":{color:"#EBCB8B"},"hljs-string":{color:"#A3BE8C"},"hljs-title":{color:"#8FBCBB"},"hljs-params":{color:"#D8DEE9"},"hljs-bullet":{color:"#81A1C1"},"hljs-code":{color:"#8FBCBB"},"hljs-emphasis":{fontStyle:"italic"},"hljs-formula":{color:"#8FBCBB"},"hljs-strong":{fontWeight:"bold"},"hljs-link:hover":{textDecoration:"underline"},"hljs-quote":{color:"#4C566A"},"hljs-comment":{color:"#4C566A"},"hljs-doctag":{color:"#8FBCBB"},"hljs-meta":{color:"#5E81AC"},"hljs-meta-keyword":{color:"#5E81AC"},"hljs-meta-string":{color:"#A3BE8C"},"hljs-attr":{color:"#8FBCBB"},"hljs-attribute":{color:"#D8DEE9"},"hljs-builtin-name":{color:"#81A1C1"},"hljs-name":{color:"#81A1C1"},"hljs-section":{color:"#88C0D0"},"hljs-tag":{color:"#81A1C1"},"hljs-variable":{color:"#D8DEE9"},"hljs-template-variable":{color:"#D8DEE9"},"hljs-template-tag":{color:"#5E81AC"},"abnf .hljs-attribute":{color:"#88C0D0"},"abnf .hljs-symbol":{color:"#EBCB8B"},"apache .hljs-attribute":{color:"#88C0D0"},"apache .hljs-section":{color:"#81A1C1"},"arduino .hljs-built_in":{color:"#88C0D0"},"aspectj .hljs-meta":{color:"#D08770"},"aspectj > .hljs-title":{color:"#88C0D0"},"bnf .hljs-attribute":{color:"#8FBCBB"},"clojure .hljs-name":{color:"#88C0D0"},"clojure .hljs-symbol":{color:"#EBCB8B"},"coq .hljs-built_in":{color:"#88C0D0"},"cpp .hljs-meta-string":{color:"#8FBCBB"},"css .hljs-built_in":{color:"#88C0D0"},"css .hljs-keyword":{color:"#D08770"},"diff .hljs-meta":{color:"#8FBCBB"},"ebnf .hljs-attribute":{color:"#8FBCBB"},"glsl .hljs-built_in":{color:"#88C0D0"},"groovy .hljs-meta:not(:first-child)":{color:"#D08770"},"haxe .hljs-meta":{color:"#D08770"},"java .hljs-meta":{color:"#D08770"},"ldif .hljs-attribute":{color:"#8FBCBB"},"lisp .hljs-name":{color:"#88C0D0"},"lua .hljs-built_in":{color:"#88C0D0"},"moonscript .hljs-built_in":{color:"#88C0D0"},"nginx .hljs-attribute":{color:"#88C0D0"},"nginx .hljs-section":{color:"#5E81AC"},"pf .hljs-built_in":{color:"#88C0D0"},"processing .hljs-built_in":{color:"#88C0D0"},"scss .hljs-keyword":{color:"#81A1C1"},"stylus .hljs-keyword":{color:"#81A1C1"},"swift .hljs-meta":{color:"#D08770"},"vim .hljs-built_in":{color:"#88C0D0",fontStyle:"italic"},"yaml .hljs-meta":{color:"#D08770"}},$4={hljs:{display:"block",overflowX:"auto",padding:"0.5em",background:"#282b2e",color:"#e0e2e4"},"hljs-keyword":{color:"#93c763",fontWeight:"bold"},"hljs-selector-tag":{color:"#93c763",fontWeight:"bold"},"hljs-literal":{color:"#93c763",fontWeight:"bold"},"hljs-selector-id":{color:"#93c763"},"hljs-number":{color:"#ffcd22"},"hljs-attribute":{color:"#668bb0"},"hljs-code":{color:"white"},"hljs-class .hljs-title":{color:"white"},"hljs-section":{color:"white",fontWeight:"bold"},"hljs-regexp":{color:"#d39745"},"hljs-link":{color:"#d39745"},"hljs-meta":{color:"#557182"},"hljs-tag":{color:"#8cbbad"},"hljs-name":{color:"#8cbbad",fontWeight:"bold"},"hljs-bullet":{color:"#8cbbad"},"hljs-subst":{color:"#8cbbad"},"hljs-emphasis":{color:"#8cbbad"},"hljs-type":{color:"#8cbbad",fontWeight:"bold"},"hljs-built_in":{color:"#8cbbad"},"hljs-selector-attr":{color:"#8cbbad"},"hljs-selector-pseudo":{color:"#8cbbad"},"hljs-addition":{color:"#8cbbad"},"hljs-variable":{color:"#8cbbad"},"hljs-template-tag":{color:"#8cbbad"},"hljs-template-variable":{color:"#8cbbad"},"hljs-string":{color:"#ec7600"},"hljs-symbol":{color:"#ec7600"},"hljs-comment":{color:"#818e96"},"hljs-quote":{color:"#818e96"},"hljs-deletion":{color:"#818e96"},"hljs-selector-class":{color:"#A082BD"},"hljs-doctag":{fontWeight:"bold"},"hljs-title":{fontWeight:"bold"},"hljs-strong":{fontWeight:"bold"}},H4={"hljs-comment":{color:"#969896"},"hljs-quote":{color:"#969896"},"hljs-variable":{color:"#cc6666"},"hljs-template-variable":{color:"#cc6666"},"hljs-tag":{color:"#cc6666"},"hljs-name":{color:"#cc6666"},"hljs-selector-id":{color:"#cc6666"},"hljs-selector-class":{color:"#cc6666"},"hljs-regexp":{color:"#cc6666"},"hljs-deletion":{color:"#cc6666"},"hljs-number":{color:"#de935f"},"hljs-built_in":{color:"#de935f"},"hljs-builtin-name":{color:"#de935f"},"hljs-literal":{color:"#de935f"},"hljs-type":{color:"#de935f"},"hljs-params":{color:"#de935f"},"hljs-meta":{color:"#de935f"},"hljs-link":{color:"#de935f"},"hljs-attribute":{color:"#f0c674"},"hljs-string":{color:"#b5bd68"},"hljs-symbol":{color:"#b5bd68"},"hljs-bullet":{color:"#b5bd68"},"hljs-addition":{color:"#b5bd68"},"hljs-title":{color:"#81a2be"},"hljs-section":{color:"#81a2be"},"hljs-keyword":{color:"#b294bb"},"hljs-selector-tag":{color:"#b294bb"},hljs:{display:"block",overflowX:"auto",background:"#1d1f21",color:"#c5c8c6",padding:"0.5em"},"hljs-emphasis":{fontStyle:"italic"},"hljs-strong":{fontWeight:"bold"}};var B4=i(43155),U4=i(35037),Y4=i.n(U4),j4=i(93890),G4=i.n(j4),z4=i(98990),V4=i.n(z4),Z4=i(52190),W4=i.n(Z4),J4=i(71166),Q4=i.n(J4),K4=i(52243),X4=i.n(K4),_R=i(15805),w0=i(68645),MA=i(62734),gR=i(76593);function Wv(n){var s;return(Wv=MA?w0(s=gR).call(s):function(o){return o.__proto__||gR(o)})(n)}function q4(n,s){for(;!Object.prototype.hasOwnProperty.call(n,s)&&null!==(n=Wv(n)););return n}function _C(){var n;return _C="undefined"!=typeof Reflect&&_R?w0(n=_R).call(n):function(t,o,l){var _=q4(t,o);if(_){var M=wO(_,o);return M.get?M.get.call(arguments.length<3?t:l):M.value}},_C.apply(this,arguments)}var mR=i(54839),vR=i(73921);function ZE(n,s){var t;return(ZE=MA?w0(t=MA).call(t):function(l,_){return l.__proto__=_,l})(n,s)}var WE=i(69244);function yR(){if("undefined"==typeof Reflect||!WE||WE.sham)return!1;if("function"==typeof Proxy)return!0;try{return Boolean.prototype.valueOf.call(WE(Boolean,[],function(){})),!0}catch(n){return!1}}function gC(n,s,t){var o;return(gC=yR()?w0(o=WE).call(o):function(_,M,w){var N=[null];N.push.apply(N,M);var X=new(w0(Function).apply(_,N));return w&&ZE(X,w.prototype),X}).apply(null,arguments)}function OA(n){var s="function"==typeof mR?new mR:void 0;return OA=function(o){if(null===o||!function e5(n){var s;return-1!==mA(s=Function.toString.call(n)).call(s,"[native code]")}(o))return o;if("function"!=typeof o)throw new TypeError("Super expression must either be null or a function");if(void 0!==s){if(s.has(o))return s.get(o);s.set(o,l)}function l(){return gC(o,arguments,Wv(this).constructor)}return l.prototype=vR(o.prototype,{constructor:{value:l,enumerable:!1,writable:!0,configurable:!0}}),ZE(l,o)},OA(n)}var t5=i(45163),n5=i.n(t5),r5=i(30071),i5=i.n(r5),o5=i(58711),s5=i.n(o5),a5=i(15886),l5=i.n(a5),u5=i(34377),c5=i.n(u5),d5=i(28086),f5=i.n(d5),p5=i(56166),h5=i.n(p5),_5=i(10068),g5=i.n(_5),m5=i(45819),v5=i.n(m5),y5=i(84901),E5=i.n(y5),b5=i(35524),S5=i.n(b5),T5=i(71851),C5=i.n(T5),M5=i(91465),O5=i.n(M5),A5=i(37940),D5=i.n(A5),w5=i(35431),x5=i.n(w5),R5=i(46558),N5=i.n(R5),P5=i(53625),I5=i.n(P5),L5=i(31978),F5=i.n(L5),k5=i(84220),$5=i.n(k5),H5=i(40984),B5=i.n(H5),U5=i(44859),Y5=i.n(U5),j5=i(54082),G5=i.n(j5),z5=i(30508),V5=i.n(z5),Z5=i(46245),W5=i.n(Z5),J5=i(69605),Q5=i.n(J5),K5=i(87513),X5=i.n(K5),q5=i(69253),eL=i.n(q5);function ER(n){if(void 0===n)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return n}function tL(n,s){if(!(n instanceof s))throw new TypeError("Cannot call a class as a function")}function bR(n,s){for(var t=0;t<s.length;t++){var o=s[t];o.enumerable=o.enumerable||!1,o.configurable=!0,"value"in o&&(o.writable=!0),FE(n,VD(o.key),o)}}function nL(n,s,t){return s&&bR(n.prototype,s),t&&bR(n,t),FE(n,"prototype",{writable:!1}),n}function rL(n,s){var t=void 0!==g&&A(n)||n["@@iterator"];if(!t){if(u(n)||(t=Ue(n))||s&&n&&"number"==typeof n.length){t&&(n=t);var o=0,l=function(){};return{s:l,n:function(){return o>=n.length?{done:!0}:{done:!1,value:n[o++]}},e:function(V){throw V},f:l}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}var w,_=!0,M=!1;return{s:function(){t=t.call(n)},n:function(){var V=t.next();return _=V.done,V},e:function(V){M=!0,w=V},f:function(){try{!_&&null!=t.return&&t.return()}finally{if(M)throw w}}}}function iL(n,s){if(s&&("object"===jv(s)||"function"==typeof s))return s;if(void 0!==s)throw new TypeError("Derived constructors may only return object or undefined");return ER(n)}function oL(n){var s=yR();return function(){var l,o=Wv(n);if(s){var _=Wv(this).constructor;l=WE(o,arguments,_)}else l=o.apply(this,arguments);return iL(this,l)}}var SR=i(95343);function AA(){var n;return AA=SR?w0(n=SR).call(n):function(s){for(var t=1;t<arguments.length;t++){var o=arguments[t];for(var l in o)Object.prototype.hasOwnProperty.call(o,l)&&(s[l]=o[l])}return s},AA.apply(this,arguments)}function sL(n,s){if("function"!=typeof s&&null!==s)throw new TypeError("Super expression must either be null or a function");n.prototype=vR(s&&s.prototype,{constructor:{value:n,writable:!0,configurable:!0}}),FE(n,"prototype",{writable:!1}),s&&ZE(n,s)}function lL(n,s){return d(n)||function aL(n,s){var t=null==n?null:void 0!==g&&A(n)||n["@@iterator"];if(null!=t){var o,l,_,M,w=[],N=!0,V=!1;try{if(_=(t=t.call(n)).next,0===s){if(Object(t)!==t)return;N=!1}else for(;!(N=(o=_.call(t)).done)&&(w.push(o.value),w.length!==s);N=!0);}catch(X){V=!0,l=X}finally{try{if(!N&&null!=t.return&&(M=t.return(),Object(M)!==M))return}finally{if(V)throw l}}return w}}(n,s)||Ue(n,s)||Dt()}function dL(n){return function uL(n){if(u(n))return Re(n)}(n)||q(n)||Ue(n)||function cL(){throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}var fL=i(96434),pL=i.t(fL,2),hL=i(82885),_L=i.n(hL),gL=i(12658),mL=i.t(gL,2),vL=i(55836),yL=i.n(vL),EL=i(97425),bL=i.n(EL),SL=i(76874),TL=i.n(SL),CL=i(43409),ML=i(14395),OL=i.n(ML);function TR(n,s){var t=Object.keys(n);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(n);s&&(o=o.filter(function(l){return Object.getOwnPropertyDescriptor(n,l).enumerable})),t.push.apply(t,o)}return t}function CR(n){for(var s=1;s<arguments.length;s++){var t=null!=arguments[s]?arguments[s]:{};s%2?TR(Object(t),!0).forEach(function(o){TA(n,o,t[o])}):Object.getOwnPropertyDescriptors?Object.defineProperties(n,Object.getOwnPropertyDescriptors(t)):TR(Object(t)).forEach(function(o){Object.defineProperty(n,o,Object.getOwnPropertyDescriptor(t,o))})}return n}function Ip(n){return"Minified Redux error #"+n+"; visit https://redux.js.org/Errors?code="+n+" for the full message or use the non-minified dev environment for full errors. "}var mC,MR="function"==typeof Symbol&&Symbol.observable||"@@observable",DA=function(){return Math.random().toString(36).substring(7).split("").join(".")},x0={INIT:"@@redux/INIT"+DA(),REPLACE:"@@redux/REPLACE"+DA(),PROBE_UNKNOWN_ACTION:function(){return"@@redux/PROBE_UNKNOWN_ACTION"+DA()}};function OR(n){if("object"!=typeof n||null===n)return!1;for(var s=n;null!==Object.getPrototypeOf(s);)s=Object.getPrototypeOf(s);return Object.getPrototypeOf(n)===s}function AR(n,s,t){var o;if("function"==typeof s&&"function"==typeof t||"function"==typeof t&&"function"==typeof arguments[3])throw new Error(Ip(0));if("function"==typeof s&&void 0===t&&(t=s,s=void 0),void 0!==t){if("function"!=typeof t)throw new Error(Ip(1));return t(AR)(n,s)}if("function"!=typeof n)throw new Error(Ip(2));var l=n,_=s,M=[],w=M,N=!1;function V(){w===M&&(w=M.slice())}function X(){if(N)throw new Error(Ip(3));return _}function re(Pe){if("function"!=typeof Pe)throw new Error(Ip(4));if(N)throw new Error(Ip(5));var De=!0;return V(),w.push(Pe),function(){if(De){if(N)throw new Error(Ip(6));De=!1,V();var Ae=w.indexOf(Pe);w.splice(Ae,1),M=null}}}function oe(Pe){if(!OR(Pe))throw new Error(Ip(7));if(void 0===Pe.type)throw new Error(Ip(8));if(N)throw new Error(Ip(9));try{N=!0,_=l(_,Pe)}finally{N=!1}for(var De=M=w,Ie=0;Ie<De.length;Ie++)(0,De[Ie])();return Pe}function fe(Pe){if("function"!=typeof Pe)throw new Error(Ip(10));l=Pe,oe({type:x0.REPLACE})}function ve(){var Pe,De=re;return(Pe={subscribe:function(Ae){if("object"!=typeof Ae||null===Ae)throw new Error(Ip(11));function Y(){Ae.next&&Ae.next(X())}return Y(),{unsubscribe:De(Y)}}})[MR]=function(){return this},Pe}return oe({type:x0.INIT}),(o={dispatch:oe,subscribe:re,getState:X,replaceReducer:fe})[MR]=ve,o}function DR(n,s){return function(){return s(n.apply(this,arguments))}}function NL(n,s){if("function"==typeof n)return DR(n,s);if("object"!=typeof n||null===n)throw new Error(Ip(16));var t={};for(var o in n){var l=n[o];"function"==typeof l&&(t[o]=DR(l,s))}return t}function wR(){for(var n=arguments.length,s=new Array(n),t=0;t<n;t++)s[t]=arguments[t];return 0===s.length?function(o){return o}:1===s.length?s[0]:s.reduce(function(o,l){return function(){return o(l.apply(void 0,arguments))}})}function PL(){for(var n=arguments.length,s=new Array(n),t=0;t<n;t++)s[t]=arguments[t];return function(o){return function(){var l=o.apply(void 0,arguments),_=function(){throw new Error(Ip(15))},M={getState:l.getState,dispatch:function(){return _.apply(void 0,arguments)}},w=s.map(function(N){return N(M)});return _=wR.apply(void 0,w)(l.dispatch),CR(CR({},l),{},{dispatch:_})}}}function xR(n){return(mC=mC||document.createElement("textarea")).innerHTML="&"+n+";",mC.value}var FL=Object.prototype.hasOwnProperty;function wA(n){var s=[].slice.call(arguments,1);return s.forEach(function(t){if(t){if("object"!=typeof t)throw new TypeError(t+"must be object");Object.keys(t).forEach(function(o){n[o]=t[o]})}}),n}var kL=/\\([\\!"#$%&'()*+,.\/:;<=>?@[\]^_`{|}~-])/g;function R0(n){return n.indexOf("\\")<0?n:n.replace(kL,"$1")}function xA(n){return!(n>=55296&&n<=57343||n>=64976&&n<=65007||65535==(65535&n)||65534==(65535&n)||n>=0&&n<=8||11===n||n>=14&&n<=31||n>=127&&n<=159||n>1114111)}function vC(n){return n>65535?(n-=65536,String.fromCharCode(55296+(n>>10),56320+(1023&n))):String.fromCharCode(n)}var $L=/&([a-z#][a-z0-9]{1,31});/gi,HL=/^#((?:x[a-f0-9]{1,8}|[0-9]{1,8}))/i;function BL(n,s){var t=0,o=xR(s);return s!==o?o:35===s.charCodeAt(0)&&HL.test(s)&&xA(t="x"===s[1].toLowerCase()?parseInt(s.slice(2),16):parseInt(s.slice(1),10))?vC(t):n}function qm(n){return n.indexOf("&")<0?n:n.replace($L,BL)}var UL=/[&<>"]/,YL=/[&<>"]/g,jL={"&":"&amp;","<":"&lt;",">":"&gt;",'"':"&quot;"};function GL(n){return jL[n]}function Hh(n){return UL.test(n)?n.replace(YL,GL):n}var ea={};function NR(n,s){return++s>=n.length-2?s:"paragraph_open"===n[s].type&&n[s].tight&&"inline"===n[s+1].type&&0===n[s+1].content.length&&"paragraph_close"===n[s+2].type&&n[s+2].tight?NR(n,s+2):s}ea.blockquote_open=function(){return"<blockquote>\n"},ea.blockquote_close=function(n,s){return"</blockquote>"+Jv(n,s)},ea.code=function(n,s){return n[s].block?"<pre><code>"+Hh(n[s].content)+"</code></pre>"+Jv(n,s):"<code>"+Hh(n[s].content)+"</code>"},ea.fence=function(n,s,t,o,l){var V,X,_=n[s],M="",w=t.langPrefix;if(_.params){if(X=(V=_.params.split(/\s+/g)).join(" "),function RR(n,s){return!!n&&FL.call(n,s)}(l.rules.fence_custom,V[0]))return l.rules.fence_custom[V[0]](n,s,t,o,l);M=' class="'+w+Hh(qm(R0(X)))+'"'}return"<pre><code"+M+">"+(t.highlight&&t.highlight.apply(t.highlight,[_.content].concat(V))||Hh(_.content))+"</code></pre>"+Jv(n,s)},ea.fence_custom={},ea.heading_open=function(n,s){return"<h"+n[s].hLevel+">"},ea.heading_close=function(n,s){return"</h"+n[s].hLevel+">\n"},ea.hr=function(n,s,t){return(t.xhtmlOut?"<hr />":"<hr>")+Jv(n,s)},ea.bullet_list_open=function(){return"<ul>\n"},ea.bullet_list_close=function(n,s){return"</ul>"+Jv(n,s)},ea.list_item_open=function(){return"<li>"},ea.list_item_close=function(){return"</li>\n"},ea.ordered_list_open=function(n,s){var t=n[s];return"<ol"+(t.order>1?' start="'+t.order+'"':"")+">\n"},ea.ordered_list_close=function(n,s){return"</ol>"+Jv(n,s)},ea.paragraph_open=function(n,s){return n[s].tight?"":"<p>"},ea.paragraph_close=function(n,s){return(n[s].tight?"":"</p>")+(n[s].tight&&s&&"inline"===n[s-1].type&&!n[s-1].content?"":Jv(n,s))},ea.link_open=function(n,s,t){var o=n[s].title?' title="'+Hh(qm(n[s].title))+'"':"",l=t.linkTarget?' target="'+t.linkTarget+'"':"";return'<a href="'+Hh(n[s].href)+'"'+o+l+">"},ea.link_close=function(){return"</a>"},ea.image=function(n,s,t){var o=' src="'+Hh(n[s].src)+'"',l=n[s].title?' title="'+Hh(qm(n[s].title))+'"':"";return"<img"+o+' alt="'+(n[s].alt?Hh(qm(R0(n[s].alt))):"")+'"'+l+(t.xhtmlOut?" /":"")+">"},ea.table_open=function(){return"<table>\n"},ea.table_close=function(){return"</table>\n"},ea.thead_open=function(){return"<thead>\n"},ea.thead_close=function(){return"</thead>\n"},ea.tbody_open=function(){return"<tbody>\n"},ea.tbody_close=function(){return"</tbody>\n"},ea.tr_open=function(){return"<tr>"},ea.tr_close=function(){return"</tr>\n"},ea.th_open=function(n,s){var t=n[s];return"<th"+(t.align?' style="text-align:'+t.align+'"':"")+">"},ea.th_close=function(){return"</th>"},ea.td_open=function(n,s){var t=n[s];return"<td"+(t.align?' style="text-align:'+t.align+'"':"")+">"},ea.td_close=function(){return"</td>"},ea.strong_open=function(){return"<strong>"},ea.strong_close=function(){return"</strong>"},ea.em_open=function(){return"<em>"},ea.em_close=function(){return"</em>"},ea.del_open=function(){return"<del>"},ea.del_close=function(){return"</del>"},ea.ins_open=function(){return"<ins>"},ea.ins_close=function(){return"</ins>"},ea.mark_open=function(){return"<mark>"},ea.mark_close=function(){return"</mark>"},ea.sub=function(n,s){return"<sub>"+Hh(n[s].content)+"</sub>"},ea.sup=function(n,s){return"<sup>"+Hh(n[s].content)+"</sup>"},ea.hardbreak=function(n,s,t){return t.xhtmlOut?"<br />\n":"<br>\n"},ea.softbreak=function(n,s,t){return t.breaks?t.xhtmlOut?"<br />\n":"<br>\n":"\n"},ea.text=function(n,s){return Hh(n[s].content)},ea.htmlblock=function(n,s){return n[s].content},ea.htmltag=function(n,s){return n[s].content},ea.abbr_open=function(n,s){return'<abbr title="'+Hh(qm(n[s].title))+'">'},ea.abbr_close=function(){return"</abbr>"},ea.footnote_ref=function(n,s){var t=Number(n[s].id+1).toString(),o="fnref"+t;return n[s].subId>0&&(o+=":"+n[s].subId),'<sup class="footnote-ref"><a href="#fn'+t+'" id="'+o+'">['+t+"]</a></sup>"},ea.footnote_block_open=function(n,s,t){return(t.xhtmlOut?'<hr class="footnotes-sep" />\n':'<hr class="footnotes-sep">\n')+'<section class="footnotes">\n<ol class="footnotes-list">\n'},ea.footnote_block_close=function(){return"</ol>\n</section>\n"},ea.footnote_open=function(n,s){return'<li id="fn'+Number(n[s].id+1).toString()+'"  class="footnote-item">'},ea.footnote_close=function(){return"</li>\n"},ea.footnote_anchor=function(n,s){var o="fnref"+Number(n[s].id+1).toString();return n[s].subId>0&&(o+=":"+n[s].subId),' <a href="#'+o+'" class="footnote-backref">\u21a9</a>'},ea.dl_open=function(){return"<dl>\n"},ea.dt_open=function(){return"<dt>"},ea.dd_open=function(){return"<dd>"},ea.dl_close=function(){return"</dl>\n"},ea.dt_close=function(){return"</dt>\n"},ea.dd_close=function(){return"</dd>\n"};var Jv=ea.getBreak=function(s,t){return(t=NR(s,t))<s.length&&"list_item_close"===s[t].type?"":"\n"};function RA(){this.rules=wA({},ea),this.getBreak=ea.getBreak}function L_(){this.__rules__=[],this.__cache__=null}function Qv(n,s,t,o,l){this.src=n,this.env=o,this.options=t,this.parser=s,this.tokens=l,this.pos=0,this.posMax=this.src.length,this.level=0,this.pending="",this.pendingLevel=0,this.cache=[],this.isInLabel=!1,this.linkLevel=0,this.linkContent="",this.labelUnmatchedScopes=0}function JE(n,s){var t,o,l,_=-1,M=n.posMax,w=n.pos,N=n.isInLabel;if(n.isInLabel)return-1;if(n.labelUnmatchedScopes)return n.labelUnmatchedScopes--,-1;for(n.pos=s+1,n.isInLabel=!0,t=1;n.pos<M;){if(91===(l=n.src.charCodeAt(n.pos)))t++;else if(93===l&&0==--t){o=!0;break}n.parser.skipToken(n)}return o?(_=n.pos,n.labelUnmatchedScopes=0):n.labelUnmatchedScopes=t-1,n.pos=w,n.isInLabel=N,_}function VL(n,s,t,o){var l,_,M,w,N,V;if(42!==n.charCodeAt(0)||91!==n.charCodeAt(1)||-1===n.indexOf("]:")||(_=JE(l=new Qv(n,s,t,o,[]),1))<0||58!==n.charCodeAt(_+1))return-1;for(w=l.posMax,M=_+2;M<w&&10!==l.src.charCodeAt(M);M++);return N=n.slice(2,_),0===(V=n.slice(_+2,M).trim()).length?-1:(o.abbreviations||(o.abbreviations={}),void 0===o.abbreviations[":"+N]&&(o.abbreviations[":"+N]=V),M)}function NA(n){var s=qm(n);try{s=decodeURI(s)}catch(t){}return encodeURI(s)}function PR(n,s){var t,o,l,_=s,M=n.posMax;if(60===n.src.charCodeAt(s)){for(s++;s<M;){if(10===(t=n.src.charCodeAt(s)))return!1;if(62===t)return l=NA(R0(n.src.slice(_+1,s))),!!n.parser.validateLink(l)&&(n.pos=s+1,n.linkContent=l,!0);92===t&&s+1<M?s+=2:s++}return!1}for(o=0;s<M&&!(32===(t=n.src.charCodeAt(s))||t<32||127===t);)if(92===t&&s+1<M)s+=2;else{if(40===t&&++o>1||41===t&&--o<0)break;s++}return!(_===s||(l=R0(n.src.slice(_,s)),!n.parser.validateLink(l))||(n.linkContent=l,n.pos=s,0))}function IR(n,s){var t,o=s,l=n.posMax,_=n.src.charCodeAt(s);if(34!==_&&39!==_&&40!==_)return!1;for(s++,40===_&&(_=41);s<l;){if((t=n.src.charCodeAt(s))===_)return n.pos=s+1,n.linkContent=R0(n.src.slice(o+1,s)),!0;92===t&&s+1<l?s+=2:s++}return!1}function LR(n){return n.trim().replace(/\s+/g," ").toUpperCase()}function WL(n,s,t,o){var l,_,M,w,N,V,X,re,oe;if(91!==n.charCodeAt(0)||-1===n.indexOf("]:")||(_=JE(l=new Qv(n,s,t,o,[]),0))<0||58!==n.charCodeAt(_+1))return-1;for(w=l.posMax,M=_+2;M<w&&(32===(N=l.src.charCodeAt(M))||10===N);M++);if(!PR(l,M))return-1;for(X=l.linkContent,V=M=l.pos,M+=1;M<w&&(32===(N=l.src.charCodeAt(M))||10===N);M++);for(M<w&&V!==M&&IR(l,M)?(re=l.linkContent,M=l.pos):(re="",M=V);M<w&&32===l.src.charCodeAt(M);)M++;return M<w&&10!==l.src.charCodeAt(M)?-1:(oe=LR(n.slice(1,_)),void 0===o.references[oe]&&(o.references[oe]={title:re,href:X}),M)}RA.prototype.renderInline=function(n,s,t){for(var o=this.rules,l=n.length,_=0,M="";l--;)M+=o[n[_].type](n,_++,s,t,this);return M},RA.prototype.render=function(n,s,t){for(var o=this.rules,l=n.length,_=-1,M="";++_<l;)M+="inline"===n[_].type?this.renderInline(n[_].children,s,t):o[n[_].type](n,_,s,t,this);return M},L_.prototype.__find__=function(n){for(var s=this.__rules__.length,t=-1;s--;)if(this.__rules__[++t].name===n)return t;return-1},L_.prototype.__compile__=function(){var n=this,s=[""];n.__rules__.forEach(function(t){!t.enabled||t.alt.forEach(function(o){s.indexOf(o)<0&&s.push(o)})}),n.__cache__={},s.forEach(function(t){n.__cache__[t]=[],n.__rules__.forEach(function(o){!o.enabled||t&&o.alt.indexOf(t)<0||n.__cache__[t].push(o.fn)})})},L_.prototype.at=function(n,s,t){var o=this.__find__(n),l=t||{};if(-1===o)throw new Error("Parser rule not found: "+n);this.__rules__[o].fn=s,this.__rules__[o].alt=l.alt||[],this.__cache__=null},L_.prototype.before=function(n,s,t,o){var l=this.__find__(n),_=o||{};if(-1===l)throw new Error("Parser rule not found: "+n);this.__rules__.splice(l,0,{name:s,enabled:!0,fn:t,alt:_.alt||[]}),this.__cache__=null},L_.prototype.after=function(n,s,t,o){var l=this.__find__(n),_=o||{};if(-1===l)throw new Error("Parser rule not found: "+n);this.__rules__.splice(l+1,0,{name:s,enabled:!0,fn:t,alt:_.alt||[]}),this.__cache__=null},L_.prototype.push=function(n,s,t){this.__rules__.push({name:n,enabled:!0,fn:s,alt:(t||{}).alt||[]}),this.__cache__=null},L_.prototype.enable=function(n,s){n=Array.isArray(n)?n:[n],s&&this.__rules__.forEach(function(t){t.enabled=!1}),n.forEach(function(t){var o=this.__find__(t);if(o<0)throw new Error("Rules manager: invalid rule name "+t);this.__rules__[o].enabled=!0},this),this.__cache__=null},L_.prototype.disable=function(n){(n=Array.isArray(n)?n:[n]).forEach(function(s){var t=this.__find__(s);if(t<0)throw new Error("Rules manager: invalid rule name "+s);this.__rules__[t].enabled=!1},this),this.__cache__=null},L_.prototype.getRules=function(n){return null===this.__cache__&&this.__compile__(),this.__cache__[n]||[]},Qv.prototype.pushPending=function(){this.tokens.push({type:"text",content:this.pending,level:this.pendingLevel}),this.pending=""},Qv.prototype.push=function(n){this.pending&&this.pushPending(),this.tokens.push(n),this.pendingLevel=this.level},Qv.prototype.cacheSet=function(n,s){for(var t=this.cache.length;t<=n;t++)this.cache.push(0);this.cache[n]=s},Qv.prototype.cacheGet=function(n){return n<this.cache.length?this.cache[n]:0};var FR=" \n()[]'\".,!?-";function PA(n){return n.replace(/([-()\[\]{}+?*.$\^|,:#<!\\])/g,"\\$1")}var qL=/\+-|\.\.|\?\?\?\?|!!!!|,,|--/,eF=/\((c|tm|r|p)\)/gi,tF={c:"\xa9",r:"\xae",p:"\xa7",tm:"\u2122"};function nF(n){return n.indexOf("(")<0?n:n.replace(eF,function(s,t){return tF[t.toLowerCase()]})}var iF=/['"]/,kR=/['"]/g,oF=/[-\s()\[\]]/;function HR(n,s){return!(s<0||s>=n.length||oF.test(n[s]))}function N0(n,s,t){return n.substr(0,s)+t+n.substr(s+1)}var IA=[["block",function zL(n){n.inlineMode?n.tokens.push({type:"inline",content:n.src.replace(/\n/g," ").trim(),level:0,lines:[0,1],children:[]}):n.block.parse(n.src,n.options,n.env,n.tokens)}],["abbr",function ZL(n){var t,o,l,_,s=n.tokens;if(!n.inlineMode)for(t=1,o=s.length-1;t<o;t++)if("paragraph_open"===s[t-1].type&&"inline"===s[t].type&&"paragraph_close"===s[t+1].type){for(l=s[t].content;l.length&&!((_=VL(l,n.inline,n.options,n.env))<0);)l=l.slice(_).trim();s[t].content=l,l.length||(s[t-1].tight=!0,s[t+1].tight=!0)}}],["references",function JL(n){var t,o,l,_,s=n.tokens;if(n.env.references=n.env.references||{},!n.inlineMode)for(t=1,o=s.length-1;t<o;t++)if("inline"===s[t].type&&"paragraph_open"===s[t-1].type&&"paragraph_close"===s[t+1].type){for(l=s[t].content;l.length&&!((_=WL(l,n.inline,n.options,n.env))<0);)l=l.slice(_).trim();s[t].content=l,l.length||(s[t-1].tight=!0,s[t+1].tight=!0)}}],["inline",function QL(n){var t,o,l,s=n.tokens;for(o=0,l=s.length;o<l;o++)"inline"===(t=s[o]).type&&n.inline.parse(t.content,n.options,n.env,t.children)}],["footnote_tail",function KL(n){var s,t,o,l,_,M,w,N,V,X=0,re=!1,oe={};if(n.env.footnotes&&(n.tokens=n.tokens.filter(function(fe){return"footnote_reference_open"===fe.type?(re=!0,N=[],V=fe.label,!1):"footnote_reference_close"===fe.type?(re=!1,oe[":"+V]=N,!1):(re&&N.push(fe),!re)}),n.env.footnotes.list)){for(M=n.env.footnotes.list,n.tokens.push({type:"footnote_block_open",level:X++}),s=0,t=M.length;s<t;s++){for(n.tokens.push({type:"footnote_open",id:s,level:X++}),M[s].tokens?((w=[]).push({type:"paragraph_open",tight:!1,level:X++}),w.push({type:"inline",content:"",level:X,children:M[s].tokens}),w.push({type:"paragraph_close",tight:!1,level:--X})):M[s].label&&(w=oe[":"+M[s].label]),n.tokens=n.tokens.concat(w),_="paragraph_close"===n.tokens[n.tokens.length-1].type?n.tokens.pop():null,l=M[s].count>0?M[s].count:1,o=0;o<l;o++)n.tokens.push({type:"footnote_anchor",id:s,subId:o,level:X});_&&n.tokens.push(_),n.tokens.push({type:"footnote_close",level:--X})}n.tokens.push({type:"footnote_block_close",level:--X})}}],["abbr2",function XL(n){var s,t,o,l,_,M,w,N,V,X,re,oe,fe=n.tokens;if(n.env.abbreviations)for(n.env.abbrRegExp||(oe="(^|["+FR.split("").map(PA).join("")+"])("+Object.keys(n.env.abbreviations).map(function(ve){return ve.substr(1)}).sort(function(ve,Pe){return Pe.length-ve.length}).map(PA).join("|")+")($|["+FR.split("").map(PA).join("")+"])",n.env.abbrRegExp=new RegExp(oe,"g")),X=n.env.abbrRegExp,t=0,o=fe.length;t<o;t++)if("inline"===fe[t].type)for(s=(l=fe[t].children).length-1;s>=0;s--)if("text"===(_=l[s]).type){for(N=0,M=_.content,X.lastIndex=0,V=_.level,w=[];re=X.exec(M);)X.lastIndex>N&&w.push({type:"text",content:M.slice(N,re.index+re[1].length),level:V}),w.push({type:"abbr_open",title:n.env.abbreviations[":"+re[2]],level:V++}),w.push({type:"text",content:re[2],level:V}),w.push({type:"abbr_close",level:--V}),N=X.lastIndex-re[3].length;!w.length||(N<M.length&&w.push({type:"text",content:M.slice(N),level:V}),fe[t].children=l=[].concat(l.slice(0,s),w,l.slice(s+1)))}}],["replacements",function rF(n){var s,t,o,l,_;if(n.options.typographer)for(_=n.tokens.length-1;_>=0;_--)if("inline"===n.tokens[_].type)for(s=(l=n.tokens[_].children).length-1;s>=0;s--)"text"===(t=l[s]).type&&(o=nF(o=t.content),qL.test(o)&&(o=o.replace(/\+-/g,"\xb1").replace(/\.{2,}/g,"\u2026").replace(/([?!])\u2026/g,"$1..").replace(/([?!]){4,}/g,"$1$1$1").replace(/,{2,}/g,",").replace(/(^|[^-])---([^-]|$)/gm,"$1\u2014$2").replace(/(^|\s)--(\s|$)/gm,"$1\u2013$2").replace(/(^|[^-\s])--([^-\s]|$)/gm,"$1\u2013$2")),t.content=o)}],["smartquotes",function sF(n){var s,t,o,l,_,M,w,N,V,X,re,oe,fe,ve,Pe,De,Ie;if(n.options.typographer)for(Ie=[],Pe=n.tokens.length-1;Pe>=0;Pe--)if("inline"===n.tokens[Pe].type)for(De=n.tokens[Pe].children,Ie.length=0,s=0;s<De.length;s++)if("text"===(t=De[s]).type&&!iF.test(t.text)){for(w=De[s].level,fe=Ie.length-1;fe>=0&&!(Ie[fe].level<=w);fe--);Ie.length=fe+1,_=0,M=(o=t.content).length;e:for(;_<M&&(kR.lastIndex=_,l=kR.exec(o),l);)if(N=!HR(o,l.index-1),ve="'"===l[0],(V=!HR(o,_=l.index+1))||N){if(re=!V,oe=!N)for(fe=Ie.length-1;fe>=0&&(X=Ie[fe],!(Ie[fe].level<w));fe--)if(X.single===ve&&Ie[fe].level===w){X=Ie[fe],ve?(De[X.token].content=N0(De[X.token].content,X.pos,n.options.quotes[2]),t.content=N0(t.content,l.index,n.options.quotes[3])):(De[X.token].content=N0(De[X.token].content,X.pos,n.options.quotes[0]),t.content=N0(t.content,l.index,n.options.quotes[1])),Ie.length=fe;continue e}re?Ie.push({token:s,pos:l.index,single:ve,level:w}):oe&&ve&&(t.content=N0(t.content,l.index,"\u2019"))}else ve&&(t.content=N0(t.content,l.index,"\u2019"))}}]];function BR(){this.options={},this.ruler=new L_;for(var n=0;n<IA.length;n++)this.ruler.push(IA[n][0],IA[n][1])}function Kv(n,s,t,o,l){var _,M,w,N,V,X,re;for(this.src=n,this.parser=s,this.options=t,this.env=o,this.tokens=l,this.bMarks=[],this.eMarks=[],this.tShift=[],this.blkIndent=0,this.line=0,this.lineMax=0,this.tight=!1,this.parentType="root",this.ddIndent=-1,this.level=0,this.result="",X=0,re=!1,w=N=X=0,V=(M=this.src).length;N<V;N++){if(_=M.charCodeAt(N),!re){if(32===_){X++;continue}re=!0}(10===_||N===V-1)&&(10!==_&&N++,this.bMarks.push(w),this.eMarks.push(N),this.tShift.push(X),re=!1,X=0,w=N+1)}this.bMarks.push(M.length),this.eMarks.push(M.length),this.tShift.push(0),this.lineMax=this.bMarks.length-1}function UR(n,s){var t,o,l;return(o=n.bMarks[s]+n.tShift[s])>=(l=n.eMarks[s])||42!==(t=n.src.charCodeAt(o++))&&45!==t&&43!==t||o<l&&32!==n.src.charCodeAt(o)?-1:o}function YR(n,s){var t,o=n.bMarks[s]+n.tShift[s],l=n.eMarks[s];if(o+1>=l||(t=n.src.charCodeAt(o++))<48||t>57)return-1;for(;;){if(o>=l)return-1;if(!((t=n.src.charCodeAt(o++))>=48&&t<=57)){if(41===t||46===t)break;return-1}}return o<l&&32!==n.src.charCodeAt(o)?-1:o}BR.prototype.process=function(n){var s,t,o;for(s=0,t=(o=this.ruler.getRules("")).length;s<t;s++)o[s](n)},Kv.prototype.isEmpty=function(s){return this.bMarks[s]+this.tShift[s]>=this.eMarks[s]},Kv.prototype.skipEmptyLines=function(s){for(var t=this.lineMax;s<t&&!(this.bMarks[s]+this.tShift[s]<this.eMarks[s]);s++);return s},Kv.prototype.skipSpaces=function(s){for(var t=this.src.length;s<t&&32===this.src.charCodeAt(s);s++);return s},Kv.prototype.skipChars=function(s,t){for(var o=this.src.length;s<o&&this.src.charCodeAt(s)===t;s++);return s},Kv.prototype.skipCharsBack=function(s,t,o){if(s<=o)return s;for(;s>o;)if(t!==this.src.charCodeAt(--s))return s+1;return s},Kv.prototype.getLines=function(s,t,o,l){var _,M,N,V,X=s;if(s>=t)return"";if(X+1===t)return M=this.bMarks[X]+Math.min(this.tShift[X],o),this.src.slice(M,l?this.eMarks[X]+1:this.eMarks[X]);for(N=new Array(t-s),_=0;X<t;X++,_++)(V=this.tShift[X])>o&&(V=o),V<0&&(V=0),N[_]=this.src.slice(M=this.bMarks[X]+V,X+1<t||l?this.eMarks[X]+1:this.eMarks[X]);return N.join("")};var jR={};["article","aside","button","blockquote","body","canvas","caption","col","colgroup","dd","div","dl","dt","embed","fieldset","figcaption","figure","footer","form","h1","h2","h3","h4","h5","h6","header","hgroup","hr","iframe","li","map","object","ol","output","p","pre","progress","script","section","style","table","tbody","td","textarea","tfoot","th","tr","thead","ul","video"].forEach(function(n){jR[n]=!0});var gF=/^<([a-zA-Z]{1,15})[\s\/>]/,mF=/^<\/([a-zA-Z]{1,15})[\s>]/;function LA(n,s){var t=n.bMarks[s]+n.blkIndent;return n.src.substr(t,n.eMarks[s]-t)}function yC(n,s){var t,o,l=n.bMarks[s]+n.tShift[s],_=n.eMarks[s];return l>=_||126!==(o=n.src.charCodeAt(l++))&&58!==o||l===(t=n.skipSpaces(l))||t>=_?-1:t}var EC=[["code",function aF(n,s,t){var o,l;if(n.tShift[s]-n.blkIndent<4)return!1;for(l=o=s+1;o<t;)if(n.isEmpty(o))o++;else{if(!(n.tShift[o]-n.blkIndent>=4))break;l=++o}return n.line=o,n.tokens.push({type:"code",content:n.getLines(s,l,4+n.blkIndent,!0),block:!0,lines:[s,n.line],level:n.level}),!0}],["fences",function lF(n,s,t,o){var l,_,M,w,N,V=!1,X=n.bMarks[s]+n.tShift[s],re=n.eMarks[s];if(X+3>re||126!==(l=n.src.charCodeAt(X))&&96!==l||(N=X,(_=(X=n.skipChars(X,l))-N)<3)||(M=n.src.slice(X,re).trim()).indexOf("`")>=0)return!1;if(o)return!0;for(w=s;!(++w>=t||(X=N=n.bMarks[w]+n.tShift[w],re=n.eMarks[w],X<re&&n.tShift[w]<n.blkIndent));)if(!(n.src.charCodeAt(X)!==l||n.tShift[w]-n.blkIndent>=4||(X=n.skipChars(X,l),X-N<_||(X=n.skipSpaces(X),X<re)))){V=!0;break}return _=n.tShift[s],n.line=w+(V?1:0),n.tokens.push({type:"fence",params:M,content:n.getLines(s+1,w,_,!0),lines:[s,n.line],level:n.level}),!0},["paragraph","blockquote","list"]],["blockquote",function uF(n,s,t,o){var l,_,M,w,N,V,X,re,oe,fe,ve,Pe=n.bMarks[s]+n.tShift[s],De=n.eMarks[s];if(Pe>De||62!==n.src.charCodeAt(Pe++)||n.level>=n.options.maxNesting)return!1;if(o)return!0;for(32===n.src.charCodeAt(Pe)&&Pe++,N=n.blkIndent,n.blkIndent=0,w=[n.bMarks[s]],n.bMarks[s]=Pe,_=(Pe=Pe<De?n.skipSpaces(Pe):Pe)>=De,M=[n.tShift[s]],n.tShift[s]=Pe-n.bMarks[s],re=n.parser.ruler.getRules("blockquote"),l=s+1;l<t&&!((Pe=n.bMarks[l]+n.tShift[l])>=(De=n.eMarks[l]));l++)if(62!==n.src.charCodeAt(Pe++)){if(_)break;for(ve=!1,oe=0,fe=re.length;oe<fe;oe++)if(re[oe](n,l,t,!0)){ve=!0;break}if(ve)break;w.push(n.bMarks[l]),M.push(n.tShift[l]),n.tShift[l]=-1337}else 32===n.src.charCodeAt(Pe)&&Pe++,w.push(n.bMarks[l]),n.bMarks[l]=Pe,_=(Pe=Pe<De?n.skipSpaces(Pe):Pe)>=De,M.push(n.tShift[l]),n.tShift[l]=Pe-n.bMarks[l];for(V=n.parentType,n.parentType="blockquote",n.tokens.push({type:"blockquote_open",lines:X=[s,0],level:n.level++}),n.parser.tokenize(n,s,l),n.tokens.push({type:"blockquote_close",level:--n.level}),n.parentType=V,X[1]=n.line,oe=0;oe<M.length;oe++)n.bMarks[oe+s]=w[oe],n.tShift[oe+s]=M[oe];return n.blkIndent=N,!0},["paragraph","blockquote","list"]],["hr",function cF(n,s,t,o){var l,_,M,w=n.bMarks[s],N=n.eMarks[s];if((w+=n.tShift[s])>N||42!==(l=n.src.charCodeAt(w++))&&45!==l&&95!==l)return!1;for(_=1;w<N;){if((M=n.src.charCodeAt(w++))!==l&&32!==M)return!1;M===l&&_++}return!(_<3||(o||(n.line=s+1,n.tokens.push({type:"hr",lines:[s,n.line],level:n.level})),0))},["paragraph","blockquote","list"]],["list",function fF(n,s,t,o){var l,_,M,w,N,V,X,re,fe,ve,Pe,De,Ie,Ae,Y,Et,ft,Ht,yn,It,In,xt=!0;if((re=YR(n,s))>=0)De=!0;else{if(!((re=UR(n,s))>=0))return!1;De=!1}if(n.level>=n.options.maxNesting)return!1;if(Pe=n.src.charCodeAt(re-1),o)return!0;for(Ae=n.tokens.length,De?(X=n.bMarks[s]+n.tShift[s],ve=Number(n.src.substr(X,re-X-1)),n.tokens.push({type:"ordered_list_open",order:ve,lines:Et=[s,0],level:n.level++})):n.tokens.push({type:"bullet_list_open",lines:Et=[s,0],level:n.level++}),l=s,Y=!1,Ht=n.parser.ruler.getRules("list");l<t&&((fe=(Ie=n.skipSpaces(re))>=n.eMarks[l]?1:Ie-re)>4&&(fe=1),fe<1&&(fe=1),_=re-n.bMarks[l]+fe,n.tokens.push({type:"list_item_open",lines:ft=[s,0],level:n.level++}),w=n.blkIndent,N=n.tight,M=n.tShift[s],V=n.parentType,n.tShift[s]=Ie-n.bMarks[s],n.blkIndent=_,n.tight=!0,n.parentType="list",n.parser.tokenize(n,s,t,!0),(!n.tight||Y)&&(xt=!1),Y=n.line-s>1&&n.isEmpty(n.line-1),n.blkIndent=w,n.tShift[s]=M,n.tight=N,n.parentType=V,n.tokens.push({type:"list_item_close",level:--n.level}),l=s=n.line,ft[1]=l,Ie=n.bMarks[s],!(l>=t||n.isEmpty(l)||n.tShift[l]<n.blkIndent));){for(In=!1,yn=0,It=Ht.length;yn<It;yn++)if(Ht[yn](n,l,t,!0)){In=!0;break}if(In)break;if(De){if((re=YR(n,l))<0)break}else if((re=UR(n,l))<0)break;if(Pe!==n.src.charCodeAt(re-1))break}return n.tokens.push({type:De?"ordered_list_close":"bullet_list_close",level:--n.level}),Et[1]=l,n.line=l,xt&&function dF(n,s){var t,o,l=n.level+2;for(t=s+2,o=n.tokens.length-2;t<o;t++)n.tokens[t].level===l&&"paragraph_open"===n.tokens[t].type&&(n.tokens[t+2].tight=!0,n.tokens[t].tight=!0,t+=2)}(n,Ae),!0},["paragraph","blockquote"]],["footnote",function pF(n,s,t,o){var l,_,M,w,N,V=n.bMarks[s]+n.tShift[s],X=n.eMarks[s];if(V+4>X||91!==n.src.charCodeAt(V)||94!==n.src.charCodeAt(V+1)||n.level>=n.options.maxNesting)return!1;for(w=V+2;w<X;w++){if(32===n.src.charCodeAt(w))return!1;if(93===n.src.charCodeAt(w))break}return!(w===V+2||w+1>=X||58!==n.src.charCodeAt(++w)||(o||(w++,n.env.footnotes||(n.env.footnotes={}),n.env.footnotes.refs||(n.env.footnotes.refs={}),N=n.src.slice(V+2,w-2),n.env.footnotes.refs[":"+N]=-1,n.tokens.push({type:"footnote_reference_open",label:N,level:n.level++}),l=n.bMarks[s],_=n.tShift[s],M=n.parentType,n.tShift[s]=n.skipSpaces(w)-w,n.bMarks[s]=w,n.blkIndent+=4,n.parentType="footnote",n.tShift[s]<n.blkIndent&&(n.tShift[s]+=n.blkIndent,n.bMarks[s]-=n.blkIndent),n.parser.tokenize(n,s,t,!0),n.parentType=M,n.blkIndent-=4,n.tShift[s]=_,n.bMarks[s]=l,n.tokens.push({type:"footnote_reference_close",level:--n.level})),0))},["paragraph"]],["heading",function hF(n,s,t,o){var l,_,M,w=n.bMarks[s]+n.tShift[s],N=n.eMarks[s];if(w>=N||35!==(l=n.src.charCodeAt(w))||w>=N)return!1;for(_=1,l=n.src.charCodeAt(++w);35===l&&w<N&&_<=6;)_++,l=n.src.charCodeAt(++w);return!(_>6||w<N&&32!==l||(o||(N=n.skipCharsBack(N,32,w),(M=n.skipCharsBack(N,35,w))>w&&32===n.src.charCodeAt(M-1)&&(N=M),n.line=s+1,n.tokens.push({type:"heading_open",hLevel:_,lines:[s,n.line],level:n.level}),w<N&&n.tokens.push({type:"inline",content:n.src.slice(w,N).trim(),level:n.level+1,lines:[s,n.line],children:[]}),n.tokens.push({type:"heading_close",hLevel:_,level:n.level})),0))},["paragraph","blockquote"]],["lheading",function _F(n,s,t){var o,l,_,M=s+1;return!(M>=t||n.tShift[M]<n.blkIndent||n.tShift[M]-n.blkIndent>3||(l=n.bMarks[M]+n.tShift[M],_=n.eMarks[M],l>=_)||(o=n.src.charCodeAt(l),45!==o&&61!==o)||(l=n.skipChars(l,o),l=n.skipSpaces(l),l<_)||(l=n.bMarks[s]+n.tShift[s],n.line=M+1,n.tokens.push({type:"heading_open",hLevel:61===o?1:2,lines:[s,n.line],level:n.level}),n.tokens.push({type:"inline",content:n.src.slice(l,n.eMarks[s]).trim(),level:n.level+1,lines:[s,n.line-1],children:[]}),n.tokens.push({type:"heading_close",hLevel:61===o?1:2,level:n.level}),0))}],["htmlblock",function yF(n,s,t,o){var l,_,M,w=n.bMarks[s],N=n.eMarks[s],V=n.tShift[s];if(w+=V,!n.options.html||V>3||w+2>=N||60!==n.src.charCodeAt(w))return!1;if(33===(l=n.src.charCodeAt(w+1))||63===l){if(o)return!0}else{if(47!==l&&!function vF(n){var s=32|n;return s>=97&&s<=122}(l))return!1;if(47===l){if(!(_=n.src.slice(w,N).match(mF)))return!1}else if(!(_=n.src.slice(w,N).match(gF)))return!1;if(!0!==jR[_[1].toLowerCase()])return!1;if(o)return!0}for(M=s+1;M<n.lineMax&&!n.isEmpty(M);)M++;return n.line=M,n.tokens.push({type:"htmlblock",level:n.level,lines:[s,n.line],content:n.getLines(s,M,0,!0)}),!0},["paragraph","blockquote"]],["table",function EF(n,s,t,o){var l,_,M,w,N,V,X,re,oe,fe,ve;if(s+2>t||n.tShift[N=s+1]<n.blkIndent||(M=n.bMarks[N]+n.tShift[N])>=n.eMarks[N]||124!==(l=n.src.charCodeAt(M))&&45!==l&&58!==l||(_=LA(n,s+1),!/^[-:| ]+$/.test(_))||(V=_.split("|"))<=2)return!1;for(re=[],w=0;w<V.length;w++){if(!(oe=V[w].trim())){if(0===w||w===V.length-1)continue;return!1}if(!/^:?-+:?$/.test(oe))return!1;58===oe.charCodeAt(oe.length-1)?re.push(58===oe.charCodeAt(0)?"center":"right"):58===oe.charCodeAt(0)?re.push("left"):re.push("")}if(-1===(_=LA(n,s).trim()).indexOf("|")||(V=_.replace(/^\||\|$/g,"").split("|"),re.length!==V.length))return!1;if(o)return!0;for(n.tokens.push({type:"table_open",lines:fe=[s,0],level:n.level++}),n.tokens.push({type:"thead_open",lines:[s,s+1],level:n.level++}),n.tokens.push({type:"tr_open",lines:[s,s+1],level:n.level++}),w=0;w<V.length;w++)n.tokens.push({type:"th_open",align:re[w],lines:[s,s+1],level:n.level++}),n.tokens.push({type:"inline",content:V[w].trim(),lines:[s,s+1],level:n.level,children:[]}),n.tokens.push({type:"th_close",level:--n.level});for(n.tokens.push({type:"tr_close",level:--n.level}),n.tokens.push({type:"thead_close",level:--n.level}),n.tokens.push({type:"tbody_open",lines:ve=[s+2,0],level:n.level++}),N=s+2;N<t&&!(n.tShift[N]<n.blkIndent||(_=LA(n,N).trim(),-1===_.indexOf("|")));N++){for(V=_.replace(/^\||\|$/g,"").split("|"),n.tokens.push({type:"tr_open",level:n.level++}),w=0;w<V.length;w++)n.tokens.push({type:"td_open",align:re[w],level:n.level++}),X=V[w].substring(124===V[w].charCodeAt(0)?1:0,124===V[w].charCodeAt(V[w].length-1)?V[w].length-1:V[w].length).trim(),n.tokens.push({type:"inline",content:X,level:n.level,children:[]}),n.tokens.push({type:"td_close",level:--n.level});n.tokens.push({type:"tr_close",level:--n.level})}return n.tokens.push({type:"tbody_close",level:--n.level}),n.tokens.push({type:"table_close",level:--n.level}),fe[1]=ve[1]=N,n.line=N,!0},["paragraph"]],["deflist",function SF(n,s,t,o){var l,_,M,w,N,V,X,re,oe,fe,ve,Pe,De,Ie;if(o)return!(n.ddIndent<0)&&yC(n,s)>=0;if(n.isEmpty(X=s+1)&&++X>t||n.tShift[X]<n.blkIndent||(l=yC(n,X))<0||n.level>=n.options.maxNesting)return!1;V=n.tokens.length,n.tokens.push({type:"dl_open",lines:N=[s,0],level:n.level++}),M=s,_=X;e:for(;;){for(Ie=!0,De=!1,n.tokens.push({type:"dt_open",lines:[M,M],level:n.level++}),n.tokens.push({type:"inline",content:n.getLines(M,M+1,n.blkIndent,!1).trim(),level:n.level+1,lines:[M,M],children:[]}),n.tokens.push({type:"dt_close",level:--n.level});;){if(n.tokens.push({type:"dd_open",lines:w=[X,0],level:n.level++}),Pe=n.tight,oe=n.ddIndent,re=n.blkIndent,ve=n.tShift[_],fe=n.parentType,n.blkIndent=n.ddIndent=n.tShift[_]+2,n.tShift[_]=l-n.bMarks[_],n.tight=!0,n.parentType="deflist",n.parser.tokenize(n,_,t,!0),(!n.tight||De)&&(Ie=!1),De=n.line-_>1&&n.isEmpty(n.line-1),n.tShift[_]=ve,n.tight=Pe,n.parentType=fe,n.blkIndent=re,n.ddIndent=oe,n.tokens.push({type:"dd_close",level:--n.level}),w[1]=X=n.line,X>=t||n.tShift[X]<n.blkIndent)break e;if((l=yC(n,X))<0)break;_=X}if(X>=t||n.isEmpty(M=X)||n.tShift[M]<n.blkIndent||(_=M+1)>=t||(n.isEmpty(_)&&_++,_>=t)||n.tShift[_]<n.blkIndent||(l=yC(n,_))<0)break}return n.tokens.push({type:"dl_close",level:--n.level}),N[1]=X,n.line=X,Ie&&function bF(n,s){var t,o,l=n.level+2;for(t=s+2,o=n.tokens.length-2;t<o;t++)n.tokens[t].level===l&&"paragraph_open"===n.tokens[t].type&&(n.tokens[t+2].tight=!0,n.tokens[t].tight=!0,t+=2)}(n,V),!0},["paragraph"]],["paragraph",function TF(n,s){var t,o,l,_,M,N,w=s+1;if(w<(t=n.lineMax)&&!n.isEmpty(w))for(N=n.parser.ruler.getRules("paragraph");w<t&&!n.isEmpty(w);w++)if(!(n.tShift[w]-n.blkIndent>3)){for(l=!1,_=0,M=N.length;_<M;_++)if(N[_](n,w,t,!0)){l=!0;break}if(l)break}return o=n.getLines(s,w,n.blkIndent,!1).trim(),n.line=w,o.length&&(n.tokens.push({type:"paragraph_open",tight:!1,lines:[s,n.line],level:n.level}),n.tokens.push({type:"inline",content:o,level:n.level+1,lines:[s,n.line],children:[]}),n.tokens.push({type:"paragraph_close",tight:!1,level:n.level})),!0}]];function FA(){this.ruler=new L_;for(var n=0;n<EC.length;n++)this.ruler.push(EC[n][0],EC[n][1],{alt:(EC[n][2]||[]).slice()})}FA.prototype.tokenize=function(n,s,t){for(var N,o=this.ruler.getRules(""),l=o.length,_=s,M=!1;_<t&&(n.line=_=n.skipEmptyLines(_),!(_>=t||n.tShift[_]<n.blkIndent));){for(N=0;N<l&&!o[N](n,_,t,!1);N++);if(n.tight=!M,n.isEmpty(n.line-1)&&(M=!0),(_=n.line)<t&&n.isEmpty(_)){if(M=!0,++_<t&&"list"===n.parentType&&n.isEmpty(_))break;n.line=_}}};var CF=/[\n\t]/g,MF=/\r[\n\u0085]|[\u2424\u2028\u0085]/g,OF=/\u00a0/g;function AF(n){switch(n){case 10:case 92:case 96:case 42:case 95:case 94:case 91:case 93:case 33:case 38:case 60:case 62:case 123:case 125:case 36:case 37:case 64:case 126:case 43:case 61:case 58:return!0;default:return!1}}FA.prototype.parse=function(n,s,t,o){var l,_=0,M=0;if(!n)return[];(n=(n=n.replace(OF," ")).replace(MF,"\n")).indexOf("\t")>=0&&(n=n.replace(CF,function(w,N){var V;return 10===n.charCodeAt(N)?(_=N+1,M=0,w):(V="    ".slice((N-_-M)%4),M=N-_+1,V)})),l=new Kv(n,this,s,t,o),this.tokenize(l,l.line,l.lineMax)};for(var kA=[],GR=0;GR<256;GR++)kA.push(0);function zR(n){return n>=48&&n<=57||n>=65&&n<=90||n>=97&&n<=122}function VR(n,s){var o,l,_,t=s,M=!0,w=!0,N=n.posMax,V=n.src.charCodeAt(s);for(o=s>0?n.src.charCodeAt(s-1):-1;t<N&&n.src.charCodeAt(t)===V;)t++;return t>=N&&(M=!1),(_=t-s)>=4?M=w=!1:((32===(l=t<N?n.src.charCodeAt(t):-1)||10===l)&&(M=!1),(32===o||10===o)&&(w=!1),95===V&&(zR(o)&&(M=!1),zR(l)&&(w=!1))),{can_open:M,can_close:w,delims:_}}"\\!\"#$%&'()*+,./:;<=>?@[]^_`{|}~-".split("").forEach(function(n){kA[n.charCodeAt(0)]=1});var FF=/\\([ \\!"#$%&'()*+,.\/:;<=>?@[\]^_`{|}~-])/g,$F=/\\([ \\!"#$%&'()*+,.\/:;<=>?@[\]^_`{|}~-])/g,jF=["coap","doi","javascript","aaa","aaas","about","acap","cap","cid","crid","data","dav","dict","dns","file","ftp","geo","go","gopher","h323","http","https","iax","icap","im","imap","info","ipp","iris","iris.beep","iris.xpc","iris.xpcs","iris.lwz","ldap","mailto","mid","msrp","msrps","mtqp","mupdate","news","nfs","ni","nih","nntp","opaquelocktoken","pop","pres","rtsp","service","session","shttp","sieve","sip","sips","sms","snmp","soap.beep","soap.beeps","tag","tel","telnet","tftp","thismessage","tn3270","tip","tv","urn","vemmi","ws","wss","xcon","xcon-userid","xmlrpc.beep","xmlrpc.beeps","xmpp","z39.50r","z39.50s","adiumxtra","afp","afs","aim","apt","attachment","aw","beshare","bitcoin","bolo","callto","chrome","chrome-extension","com-eventbrite-attendee","content","cvs","dlna-playsingle","dlna-playcontainer","dtn","dvb","ed2k","facetime","feed","finger","fish","gg","git","gizmoproject","gtalk","hcp","icon","ipn","irc","irc6","ircs","itms","jar","jms","keyparc","lastfm","ldaps","magnet","maps","market","message","mms","ms-help","msnim","mumble","mvn","notes","oid","palm","paparazzi","platform","proxy","psyc","query","res","resource","rmi","rsync","rtmp","secondlife","sftp","sgn","skype","smb","soldat","spotify","ssh","steam","svn","teamspeak","things","udp","unreal","ut2004","ventrilo","view-source","webcal","wtai","wyciwyg","xfire","xri","ymsgr"],GF=/^<([a-zA-Z0-9.!#$%&'*+\/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*)>/,zF=/^<([a-zA-Z.\-]{1,25}):([^<>\x00-\x20]*)>/;function bC(n,s){return n=n.source,s=s||"",function t(o,l){return o?(n=n.replace(o,l=l.source||l),t):new RegExp(n,s)}}var KF=bC(/(?:unquoted|single_quoted|double_quoted)/)("unquoted",/[^"'=<>`\x00-\x20]+/)("single_quoted",/'[^']*'/)("double_quoted",/"[^"]*"/)(),XF=bC(/(?:\s+attr_name(?:\s*=\s*attr_value)?)/)("attr_name",/[a-zA-Z_:][a-zA-Z0-9:._-]*/)("attr_value",KF)(),qF=bC(/<[A-Za-z][A-Za-z0-9]*attribute*\s*\/?>/)("attribute",XF)(),o7=bC(/^(?:open_tag|close_tag|comment|processing|declaration|cdata)/)("open_tag",qF)("close_tag",/<\/[A-Za-z][A-Za-z0-9]*\s*>/)("comment",/<!---->|<!--(?:-?[^>-])(?:-?[^-])*-->/)("processing",/<[?].*?[?]>/)("declaration",/<![A-Z]+\s+[^>]*>/)("cdata",/<!\[CDATA\[[\s\S]*?\]\]>/)(),l7=/^&#((?:x[a-f0-9]{1,8}|[0-9]{1,8}));/i,u7=/^&([a-z][a-z0-9]{1,31});/i,$A=[["text",function DF(n,s){for(var t=n.pos;t<n.posMax&&!AF(n.src.charCodeAt(t));)t++;return t!==n.pos&&(s||(n.pending+=n.src.slice(n.pos,t)),n.pos=t,!0)}],["newline",function wF(n,s){var t,o,l=n.pos;if(10!==n.src.charCodeAt(l))return!1;if(t=n.pending.length-1,o=n.posMax,!s)if(t>=0&&32===n.pending.charCodeAt(t))if(t>=1&&32===n.pending.charCodeAt(t-1)){for(var _=t-2;_>=0;_--)if(32!==n.pending.charCodeAt(_)){n.pending=n.pending.substring(0,_+1);break}n.push({type:"hardbreak",level:n.level})}else n.pending=n.pending.slice(0,-1),n.push({type:"softbreak",level:n.level});else n.push({type:"softbreak",level:n.level});for(l++;l<o&&32===n.src.charCodeAt(l);)l++;return n.pos=l,!0}],["escape",function xF(n,s){var t,o=n.pos,l=n.posMax;if(92!==n.src.charCodeAt(o))return!1;if(++o<l){if((t=n.src.charCodeAt(o))<256&&0!==kA[t])return s||(n.pending+=n.src[o]),n.pos+=2,!0;if(10===t){for(s||n.push({type:"hardbreak",level:n.level}),o++;o<l&&32===n.src.charCodeAt(o);)o++;return n.pos=o,!0}}return s||(n.pending+="\\"),n.pos++,!0}],["backticks",function RF(n,s){var t,o,l,_,M,w=n.pos;if(96!==n.src.charCodeAt(w))return!1;for(t=w,w++,o=n.posMax;w<o&&96===n.src.charCodeAt(w);)w++;for(l=n.src.slice(t,w),_=M=w;-1!==(_=n.src.indexOf("`",M));){for(M=_+1;M<o&&96===n.src.charCodeAt(M);)M++;if(M-_===l.length)return s||n.push({type:"code",content:n.src.slice(w,_).replace(/[ \n]+/g," ").trim(),block:!1,level:n.level}),n.pos=M,!0}return s||(n.pending+=l),n.pos+=l.length,!0}],["del",function NF(n,s){var t,o,l,w,N,_=n.posMax,M=n.pos;if(126!==n.src.charCodeAt(M)||s||M+4>=_||126!==n.src.charCodeAt(M+1)||n.level>=n.options.maxNesting||(w=M>0?n.src.charCodeAt(M-1):-1,N=n.src.charCodeAt(M+2),126===w)||126===N||32===N||10===N)return!1;for(o=M+2;o<_&&126===n.src.charCodeAt(o);)o++;if(o>M+3)return n.pos+=o-M,s||(n.pending+=n.src.slice(M,o)),!0;for(n.pos=M+2,l=1;n.pos+1<_;){if(126===n.src.charCodeAt(n.pos)&&126===n.src.charCodeAt(n.pos+1)&&(w=n.src.charCodeAt(n.pos-1),126!==(N=n.pos+2<_?n.src.charCodeAt(n.pos+2):-1)&&126!==w&&(32!==w&&10!==w?l--:32!==N&&10!==N&&l++,l<=0))){t=!0;break}n.parser.skipToken(n)}return t?(n.posMax=n.pos,n.pos=M+2,s||(n.push({type:"del_open",level:n.level++}),n.parser.tokenize(n),n.push({type:"del_close",level:--n.level})),n.pos=n.posMax+2,n.posMax=_,!0):(n.pos=M,!1)}],["ins",function PF(n,s){var t,o,l,w,N,_=n.posMax,M=n.pos;if(43!==n.src.charCodeAt(M)||s||M+4>=_||43!==n.src.charCodeAt(M+1)||n.level>=n.options.maxNesting||(w=M>0?n.src.charCodeAt(M-1):-1,N=n.src.charCodeAt(M+2),43===w)||43===N||32===N||10===N)return!1;for(o=M+2;o<_&&43===n.src.charCodeAt(o);)o++;if(o!==M+2)return n.pos+=o-M,s||(n.pending+=n.src.slice(M,o)),!0;for(n.pos=M+2,l=1;n.pos+1<_;){if(43===n.src.charCodeAt(n.pos)&&43===n.src.charCodeAt(n.pos+1)&&(w=n.src.charCodeAt(n.pos-1),43!==(N=n.pos+2<_?n.src.charCodeAt(n.pos+2):-1)&&43!==w&&(32!==w&&10!==w?l--:32!==N&&10!==N&&l++,l<=0))){t=!0;break}n.parser.skipToken(n)}return t?(n.posMax=n.pos,n.pos=M+2,s||(n.push({type:"ins_open",level:n.level++}),n.parser.tokenize(n),n.push({type:"ins_close",level:--n.level})),n.pos=n.posMax+2,n.posMax=_,!0):(n.pos=M,!1)}],["mark",function IF(n,s){var t,o,l,w,N,_=n.posMax,M=n.pos;if(61!==n.src.charCodeAt(M)||s||M+4>=_||61!==n.src.charCodeAt(M+1)||n.level>=n.options.maxNesting||(w=M>0?n.src.charCodeAt(M-1):-1,N=n.src.charCodeAt(M+2),61===w)||61===N||32===N||10===N)return!1;for(o=M+2;o<_&&61===n.src.charCodeAt(o);)o++;if(o!==M+2)return n.pos+=o-M,s||(n.pending+=n.src.slice(M,o)),!0;for(n.pos=M+2,l=1;n.pos+1<_;){if(61===n.src.charCodeAt(n.pos)&&61===n.src.charCodeAt(n.pos+1)&&(w=n.src.charCodeAt(n.pos-1),61!==(N=n.pos+2<_?n.src.charCodeAt(n.pos+2):-1)&&61!==w&&(32!==w&&10!==w?l--:32!==N&&10!==N&&l++,l<=0))){t=!0;break}n.parser.skipToken(n)}return t?(n.posMax=n.pos,n.pos=M+2,s||(n.push({type:"mark_open",level:n.level++}),n.parser.tokenize(n),n.push({type:"mark_close",level:--n.level})),n.pos=n.posMax+2,n.posMax=_,!0):(n.pos=M,!1)}],["emphasis",function LF(n,s){var t,o,l,_,M,w,N,V=n.posMax,X=n.pos,re=n.src.charCodeAt(X);if(95!==re&&42!==re||s)return!1;if(t=(N=VR(n,X)).delims,!N.can_open)return n.pos+=t,s||(n.pending+=n.src.slice(X,n.pos)),!0;if(n.level>=n.options.maxNesting)return!1;for(n.pos=X+t,w=[t];n.pos<V;)if(n.src.charCodeAt(n.pos)!==re)n.parser.skipToken(n);else{if(o=(N=VR(n,n.pos)).delims,N.can_close){for(_=w.pop(),M=o;_!==M;){if(M<_){w.push(_-M);break}if(M-=_,0===w.length)break;n.pos+=_,_=w.pop()}if(0===w.length){t=_,l=!0;break}n.pos+=o;continue}N.can_open&&w.push(o),n.pos+=o}return l?(n.posMax=n.pos,n.pos=X+t,s||((2===t||3===t)&&n.push({type:"strong_open",level:n.level++}),(1===t||3===t)&&n.push({type:"em_open",level:n.level++}),n.parser.tokenize(n),(1===t||3===t)&&n.push({type:"em_close",level:--n.level}),(2===t||3===t)&&n.push({type:"strong_close",level:--n.level})),n.pos=n.posMax+t,n.posMax=V,!0):(n.pos=X,!1)}],["sub",function kF(n,s){var t,o,l=n.posMax,_=n.pos;if(126!==n.src.charCodeAt(_)||s||_+2>=l||n.level>=n.options.maxNesting)return!1;for(n.pos=_+1;n.pos<l;){if(126===n.src.charCodeAt(n.pos)){t=!0;break}n.parser.skipToken(n)}return!t||_+1===n.pos||(o=n.src.slice(_+1,n.pos)).match(/(^|[^\\])(\\\\)*\s/)?(n.pos=_,!1):(n.posMax=n.pos,n.pos=_+1,s||n.push({type:"sub",level:n.level,content:o.replace(FF,"$1")}),n.pos=n.posMax+1,n.posMax=l,!0)}],["sup",function HF(n,s){var t,o,l=n.posMax,_=n.pos;if(94!==n.src.charCodeAt(_)||s||_+2>=l||n.level>=n.options.maxNesting)return!1;for(n.pos=_+1;n.pos<l;){if(94===n.src.charCodeAt(n.pos)){t=!0;break}n.parser.skipToken(n)}return!t||_+1===n.pos||(o=n.src.slice(_+1,n.pos)).match(/(^|[^\\])(\\\\)*\s/)?(n.pos=_,!1):(n.posMax=n.pos,n.pos=_+1,s||n.push({type:"sup",level:n.level,content:o.replace($F,"$1")}),n.pos=n.posMax+1,n.posMax=l,!0)}],["links",function BF(n,s){var t,o,l,_,M,w,N,V,X=!1,re=n.pos,oe=n.posMax,fe=n.pos,ve=n.src.charCodeAt(fe);if(33===ve&&(X=!0,ve=n.src.charCodeAt(++fe)),91!==ve||n.level>=n.options.maxNesting||(t=fe+1,(o=JE(n,fe))<0))return!1;if((w=o+1)<oe&&40===n.src.charCodeAt(w)){for(w++;w<oe&&(32===(V=n.src.charCodeAt(w))||10===V);w++);if(w>=oe)return!1;for(fe=w,PR(n,w)?(_=n.linkContent,w=n.pos):_="",fe=w;w<oe&&(32===(V=n.src.charCodeAt(w))||10===V);w++);if(w<oe&&fe!==w&&IR(n,w))for(M=n.linkContent,w=n.pos;w<oe&&(32===(V=n.src.charCodeAt(w))||10===V);w++);else M="";if(w>=oe||41!==n.src.charCodeAt(w))return n.pos=re,!1;w++}else{if(n.linkLevel>0)return!1;for(;w<oe&&(32===(V=n.src.charCodeAt(w))||10===V);w++);if(w<oe&&91===n.src.charCodeAt(w)&&(fe=w+1,(w=JE(n,w))>=0?l=n.src.slice(fe,w++):w=fe-1),l||(void 0===l&&(w=o+1),l=n.src.slice(t,o)),!(N=n.env.references[LR(l)]))return n.pos=re,!1;_=N.href,M=N.title}return s||(n.pos=t,n.posMax=o,X?n.push({type:"image",src:_,title:M,alt:n.src.substr(t,o-t),level:n.level}):(n.push({type:"link_open",href:_,title:M,level:n.level++}),n.linkLevel++,n.parser.tokenize(n),n.linkLevel--,n.push({type:"link_close",level:--n.level}))),n.pos=w,n.posMax=oe,!0}],["footnote_inline",function UF(n,s){var t,o,l,_,M=n.posMax,w=n.pos;return!(w+2>=M||94!==n.src.charCodeAt(w)||91!==n.src.charCodeAt(w+1)||n.level>=n.options.maxNesting||(t=w+2,o=JE(n,w+1),o<0)||(s||(n.env.footnotes||(n.env.footnotes={}),n.env.footnotes.list||(n.env.footnotes.list=[]),l=n.env.footnotes.list.length,n.pos=t,n.posMax=o,n.push({type:"footnote_ref",id:l,level:n.level}),n.linkLevel++,_=n.tokens.length,n.parser.tokenize(n),n.env.footnotes.list[l]={tokens:n.tokens.splice(_)},n.linkLevel--),n.pos=o+1,n.posMax=M,0))}],["footnote_ref",function YF(n,s){var t,o,l,_,M=n.posMax,w=n.pos;if(w+3>M||!n.env.footnotes||!n.env.footnotes.refs||91!==n.src.charCodeAt(w)||94!==n.src.charCodeAt(w+1)||n.level>=n.options.maxNesting)return!1;for(o=w+2;o<M;o++){if(32===n.src.charCodeAt(o)||10===n.src.charCodeAt(o))return!1;if(93===n.src.charCodeAt(o))break}return!(o===w+2||o>=M||(o++,t=n.src.slice(w+2,o-1),void 0===n.env.footnotes.refs[":"+t])||(s||(n.env.footnotes.list||(n.env.footnotes.list=[]),n.env.footnotes.refs[":"+t]<0?(n.env.footnotes.list[l=n.env.footnotes.list.length]={label:t,count:0},n.env.footnotes.refs[":"+t]=l):l=n.env.footnotes.refs[":"+t],_=n.env.footnotes.list[l].count,n.env.footnotes.list[l].count++,n.push({type:"footnote_ref",id:l,subId:_,level:n.level})),n.pos=o,n.posMax=M,0))}],["autolink",function VF(n,s){var t,o,l,_,M,w=n.pos;return!(60!==n.src.charCodeAt(w)||(t=n.src.slice(w),t.indexOf(">")<0)||((o=t.match(zF))?jF.indexOf(o[1].toLowerCase())<0||(_=o[0].slice(1,-1),M=NA(_),!n.parser.validateLink(_))||(s||(n.push({type:"link_open",href:M,level:n.level}),n.push({type:"text",content:_,level:n.level+1}),n.push({type:"link_close",level:n.level})),n.pos+=o[0].length,0):!(l=t.match(GF))||(M=NA("mailto:"+(_=l[0].slice(1,-1))),!n.parser.validateLink(M)||(s||(n.push({type:"link_open",href:M,level:n.level}),n.push({type:"text",content:_,level:n.level+1}),n.push({type:"link_close",level:n.level})),n.pos+=l[0].length,0))))}],["htmltag",function a7(n,s){var t,o,l,_=n.pos;return!(!n.options.html||(l=n.posMax,60!==n.src.charCodeAt(_)||_+2>=l)||(t=n.src.charCodeAt(_+1),33!==t&&63!==t&&47!==t&&!function s7(n){var s=32|n;return s>=97&&s<=122}(t))||(o=n.src.slice(_).match(o7),!o)||(s||n.push({type:"htmltag",content:n.src.slice(_,_+o[0].length),level:n.level}),n.pos+=o[0].length,0))}],["entity",function c7(n,s){var o,l,_=n.pos,M=n.posMax;if(38!==n.src.charCodeAt(_))return!1;if(_+1<M)if(35===n.src.charCodeAt(_+1)){if(l=n.src.slice(_).match(l7))return s||(o="x"===l[1][0].toLowerCase()?parseInt(l[1].slice(1),16):parseInt(l[1],10),n.pending+=xA(o)?vC(o):vC(65533)),n.pos+=l[0].length,!0}else if(l=n.src.slice(_).match(u7)){var w=xR(l[1]);if(l[1]!==w)return s||(n.pending+=w),n.pos+=l[0].length,!0}return s||(n.pending+="&"),n.pos++,!0}]];function SC(){this.ruler=new L_;for(var n=0;n<$A.length;n++)this.ruler.push($A[n][0],$A[n][1]);this.validateLink=d7}function d7(n){var t=n.trim().toLowerCase();return!(-1!==(t=qm(t)).indexOf(":")&&-1!==["vbscript","javascript","file","data"].indexOf(t.split(":")[0]))}SC.prototype.skipToken=function(n){var l,_,s=this.ruler.getRules(""),t=s.length,o=n.pos;if((_=n.cacheGet(o))>0)n.pos=_;else{for(l=0;l<t;l++)if(s[l](n,!0))return void n.cacheSet(o,n.pos);n.pos++,n.cacheSet(o,n.pos)}},SC.prototype.tokenize=function(n){for(var l,_,s=this.ruler.getRules(""),t=s.length,o=n.posMax;n.pos<o;){for(_=0;_<t&&!(l=s[_](n,!1));_++);if(l){if(n.pos>=o)break}else n.pending+=n.src[n.pos++]}n.pending&&n.pushPending()},SC.prototype.parse=function(n,s,t,o){var l=new Qv(n,this,s,t,o);this.tokenize(l)};var _7={default:{options:{html:!1,xhtmlOut:!1,breaks:!1,langPrefix:"language-",linkTarget:"",typographer:!1,quotes:"\u201c\u201d\u2018\u2019",highlight:null,maxNesting:20},components:{core:{rules:["block","inline","references","replacements","smartquotes","references","abbr2","footnote_tail"]},block:{rules:["blockquote","code","fences","footnote","heading","hr","htmlblock","lheading","list","paragraph","table"]},inline:{rules:["autolink","backticks","del","emphasis","entity","escape","footnote_ref","htmltag","links","newline","text"]}}},full:{options:{html:!1,xhtmlOut:!1,breaks:!1,langPrefix:"language-",linkTarget:"",typographer:!1,quotes:"\u201c\u201d\u2018\u2019",highlight:null,maxNesting:20},components:{core:{},block:{},inline:{}}},commonmark:{options:{html:!0,xhtmlOut:!0,breaks:!1,langPrefix:"language-",linkTarget:"",typographer:!1,quotes:"\u201c\u201d\u2018\u2019",highlight:null,maxNesting:20},components:{core:{rules:["block","inline","references","abbr2"]},block:{rules:["blockquote","code","fences","heading","hr","htmlblock","lheading","list","paragraph"]},inline:{rules:["autolink","backticks","emphasis","entity","escape","htmltag","links","newline","text"]}}}};function ZR(n,s,t){this.src=s,this.env=t,this.options=n.options,this.tokens=[],this.inlineMode=!1,this.inline=n.inline,this.block=n.block,this.renderer=n.renderer,this.typographer=n.typographer}function ev(n,s){"string"!=typeof n&&(s=n,n="default"),s&&null!=s.linkify&&console.warn("linkify option is removed. Use linkify plugin instead:\n\nimport Remarkable from 'remarkable';\nimport linkify from 'remarkable/linkify';\nnew Remarkable().use(linkify)\n"),this.inline=new SC,this.block=new FA,this.core=new BR,this.renderer=new RA,this.ruler=new L_,this.options={},this.configure(_7[n]),this.set(s||{})}ev.prototype.set=function(n){wA(this.options,n)},ev.prototype.configure=function(n){var s=this;if(!n)throw new Error("Wrong `remarkable` preset, check name/content");n.options&&s.set(n.options),n.components&&Object.keys(n.components).forEach(function(t){n.components[t].rules&&s[t].ruler.enable(n.components[t].rules,!0)})},ev.prototype.use=function(n,s){return n(this,s),this},ev.prototype.parse=function(n,s){var t=new ZR(this,n,s);return this.core.process(t),t.tokens},ev.prototype.render=function(n,s){return this.renderer.render(this.parse(n,s=s||{}),this.options,s)},ev.prototype.parseInline=function(n,s){var t=new ZR(this,n,s);return t.inlineMode=!0,this.core.process(t),t.tokens},ev.prototype.renderInline=function(n,s){return this.renderer.render(this.parseInline(n,s=s||{}),this.options,s)};var TC="NOT_FOUND",v7=function(s,t){return s===t};function E7(n,s){var t="object"==typeof s?s:{equalityCheck:s},o=t.equalityCheck,_=t.maxSize,M=void 0===_?1:_,w=t.resultEqualityCheck,N=function y7(n){return function(t,o){if(null===t||null===o||t.length!==o.length)return!1;for(var l=t.length,_=0;_<l;_++)if(!n(t[_],o[_]))return!1;return!0}}(void 0===o?v7:o),V=1===M?function g7(n){var s;return{get:function(o){return s&&n(s.key,o)?s.value:TC},put:function(o,l){s={key:o,value:l}},getEntries:function(){return s?[s]:[]},clear:function(){s=void 0}}}(N):function m7(n,s){var t=[];function o(w){var N=t.findIndex(function(X){return s(w,X.key)});if(N>-1){var V=t[N];return N>0&&(t.splice(N,1),t.unshift(V)),V.value}return TC}return{get:o,put:function l(w,N){o(w)===TC&&(t.unshift({key:w,value:N}),t.length>n&&t.pop())},getEntries:function _(){return t},clear:function M(){t=[]}}}(M,N);function X(){var re=V.get(arguments);if(re===TC){if(re=n.apply(null,arguments),w){var oe=V.getEntries(),fe=oe.find(function(ve){return w(ve.value,re)});fe&&(re=fe.value)}V.put(arguments,re)}return re}return X.clearCache=function(){return V.clear()},X}function b7(n){var s=Array.isArray(n[0])?n[0]:n;if(!s.every(function(o){return"function"==typeof o})){var t=s.map(function(o){return"function"==typeof o?"function "+(o.name||"unnamed")+"()":typeof o}).join(", ");throw new Error("createSelector expects all input-selectors to be functions, but received the following types: ["+t+"]")}return s}function S7(n){for(var s=arguments.length,t=new Array(s>1?s-1:0),o=1;o<s;o++)t[o-1]=arguments[o];var l=function(){for(var M=arguments.length,w=new Array(M),N=0;N<M;N++)w[N]=arguments[N];var X,V=0,re={memoizeOptions:void 0},oe=w.pop();if("object"==typeof oe&&(re=oe,oe=w.pop()),"function"!=typeof oe)throw new Error("createSelector expects an output function after the inputs, but received: ["+typeof oe+"]");var fe=re,ve=fe.memoizeOptions,Pe=void 0===ve?t:ve,De=Array.isArray(Pe)?Pe:[Pe],Ie=b7(w),Ae=n.apply(void 0,[function(){return V++,oe.apply(null,arguments)}].concat(De)),Y=n(function(){for(var ft=[],xt=Ie.length,Ht=0;Ht<xt;Ht++)ft.push(Ie[Ht].apply(null,arguments));return X=Ae.apply(null,ft)});return Object.assign(Y,{resultFunc:oe,memoizedResultFunc:Ae,dependencies:Ie,lastResult:function(){return X},recomputations:function(){return V},resetRecomputations:function(){return V=0}}),Y};return l}var WR=S7(E7),T7=i(4043),C7=i(2135),M7=i.n(C7),O7=i(95327),A7=i.n(O7),D7=i(31208),w7=i(3912),x7=i.n(w7),R7=i(41233),N7=i.n(R7),P7=i(33814),I7=i.n(P7),L7=i(74299),F7=i.n(L7),k7=i(32322),$7=i.n(k7),H7=i(58734),B7=i.n(H7),U7=i(69883),Y7=i.n(U7),j7=i(41205),G7=i.n(j7),z7={3978:(n,s,t)=>{n.exports=t(1910)},1543:(n,s,t)=>{t.d(s,{Z:()=>Ie});var o=t(863),l=t(7344),_=t(8656),M=t(6340),w=t(9972),N=t(5416),V=t(775),X=t(5171),re=t(8818),oe=t(2565),fe=t(810);const ve=(t.d(Y={},{default:()=>dO}),Y);var Y,Pe=t(9569),De=t(5053),Ie=function(Ae){(0,w.default)(Et,Ae);var Y=(0,N.default)(Et);function Et(){var ft,xt;(0,l.default)(this,Et);for(var Ht=arguments.length,yn=new Array(Ht),It=0;It<Ht;It++)yn[It]=arguments[It];return xt=Y.call.apply(Y,(0,X.default)(ft=[this]).call(ft,yn)),(0,V.default)((0,M.default)(xt),"getModelName",function(In){return-1!==(0,re.default)(In).call(In,"#/definitions/")?In.replace(/^.*#\/definitions\//,""):-1!==(0,re.default)(In).call(In,"#/components/schemas/")?In.replace(/^.*#\/components\/schemas\//,""):void 0}),(0,V.default)((0,M.default)(xt),"getRefSchema",function(In){return xt.props.specSelectors.findDefinition(In)}),xt}return(0,_.default)(Et,[{key:"render",value:function(){var ft=this.props,xt=ft.getComponent,Ht=ft.getConfigs,yn=ft.specSelectors,It=ft.schema,In=ft.required,On=ft.name,Yr=ft.isRef,Ir=ft.specPath,Hr=ft.displayName,Wr=ft.includeReadOnly,En=ft.includeWriteOnly,Un=xt("ObjectModel"),Yn=xt("ArrayModel"),ir=xt("PrimitiveModel"),An="object",Lr=It&&It.get("$$ref");if(!On&&Lr&&(On=this.getModelName(Lr)),!It&&Lr&&(It=this.getRefSchema(On)),!It)return fe.default.createElement("span",{className:"model model-title"},fe.default.createElement("span",{className:"model-title__text"},Hr||On),fe.default.createElement("img",{src:t(2517),height:"20px",width:"20px"}));var Wi=yn.isOAS3()&&It.get("deprecated");switch(Yr=void 0!==Yr?Yr:!!Lr,An=It&&It.get("type")||An){case"object":return fe.default.createElement(Un,(0,o.default)({className:"object"},this.props,{specPath:Ir,getConfigs:Ht,schema:It,name:On,deprecated:Wi,isRef:Yr,includeReadOnly:Wr,includeWriteOnly:En}));case"array":return fe.default.createElement(Yn,(0,o.default)({className:"array"},this.props,{getConfigs:Ht,schema:It,name:On,deprecated:Wi,required:In,includeReadOnly:Wr,includeWriteOnly:En}));default:return fe.default.createElement(ir,(0,o.default)({},this.props,{getComponent:xt,getConfigs:Ht,schema:It,name:On,deprecated:Wi,required:In}))}}}]),Et}(ve.default);(0,V.default)(Ie,"propTypes",{schema:(0,oe.default)(Pe.default).isRequired,getComponent:De.default.func.isRequired,getConfigs:De.default.func.isRequired,specSelectors:De.default.object.isRequired,name:De.default.string,displayName:De.default.string,isRef:De.default.bool,required:De.default.bool,expandDepth:De.default.number,depth:De.default.number,specPath:Pe.default.list.isRequired,includeReadOnly:De.default.bool,includeWriteOnly:De.default.bool})},5623:(n,s,t)=>{t.d(s,{Z:()=>De});var o=t(1581),l=t(7344),_=t(8656),M=t(6340),w=t(9972),N=t(5416),V=t(775),X=t(2740),re=t(5171),oe=t(810),fe=t(8900),ve=(t(5053),t(6298)),Pe=t(7504),De=function(Ae){(0,w.default)(Et,Ae);var Y=(0,N.default)(Et);function Et(ft,xt){var Ht;(0,l.default)(this,Et),Ht=Y.call(this,ft,xt),(0,V.default)((0,M.default)(Ht),"getDefinitionUrl",function(){return new fe.default(Ht.props.specSelectors.url(),Pe.Z.location).toString()});var yn=(0,ft.getConfigs)().validatorUrl;return Ht.state={url:Ht.getDefinitionUrl(),validatorUrl:void 0===yn?"https://validator.swagger.io/validator":yn},Ht}return(0,_.default)(Et,[{key:"UNSAFE_componentWillReceiveProps",value:function(ft){var xt=(0,ft.getConfigs)().validatorUrl;this.setState({url:this.getDefinitionUrl(),validatorUrl:void 0===xt?"https://validator.swagger.io/validator":xt})}},{key:"render",value:function(){var ft,xt,Ht=(0,this.props.getConfigs)().spec,yn=(0,ve.Nm)(this.state.validatorUrl);return"object"===(0,o.default)(Ht)&&(0,X.default)(Ht).length?null:this.state.url&&(0,ve.hW)(this.state.validatorUrl)&&(0,ve.hW)(this.state.url)?oe.default.createElement("span",{className:"float-right"},oe.default.createElement("a",{target:"_blank",rel:"noopener noreferrer",href:(0,re.default)(ft="".concat(yn,"/debug?url=")).call(ft,encodeURIComponent(this.state.url))},oe.default.createElement(Ie,{src:(0,re.default)(xt="".concat(yn,"?url=")).call(xt,encodeURIComponent(this.state.url)),alt:"Online validator badge"}))):null}}]),Et}(oe.default.Component),Ie=function(Ae){(0,w.default)(Et,Ae);var Y=(0,N.default)(Et);function Et(ft){var xt;return(0,l.default)(this,Et),(xt=Y.call(this,ft)).state={loaded:!1,error:!1},xt}return(0,_.default)(Et,[{key:"componentDidMount",value:function(){var ft=this,xt=new Image;xt.onload=function(){ft.setState({loaded:!0})},xt.onerror=function(){ft.setState({error:!0})},xt.src=this.props.src}},{key:"UNSAFE_componentWillReceiveProps",value:function(ft){var xt=this;if(ft.src!==this.props.src){var Ht=new Image;Ht.onload=function(){xt.setState({loaded:!0})},Ht.onerror=function(){xt.setState({error:!0})},Ht.src=ft.src}}},{key:"render",value:function(){return this.state.error?oe.default.createElement("img",{alt:"Error"}):this.state.loaded?oe.default.createElement("img",{src:this.props.src,alt:this.props.alt}):null}}]),Et}(oe.default.Component)},5466:(n,s,t)=>{t.d(s,{Z:()=>V,s:()=>X});var o=t(810),l=(t(5053),t(3952));const _=(t.d(oe={},{linkify:()=>FD}),oe),M=(re=>{var oe={};return t.d(oe,re),oe})({default:()=>DO()});var oe,w=t(8096);function N(re){var oe=re.source,fe=re.className,ve=void 0===fe?"":fe,Pe=re.getConfigs;if("string"!=typeof oe)return null;var De=new l.Remarkable({html:!0,typographer:!0,breaks:!0,linkTarget:"_blank"}).use(_.linkify);De.core.ruler.disable(["replacements","smartquotes"]);var Ie=Pe().useUnsafeMarkdown,Ae=De.render(oe),Y=X(Ae,{useUnsafeMarkdown:Ie});return oe&&Ae&&Y?o.default.createElement("div",{className:(0,w.default)(ve,"markdown"),dangerouslySetInnerHTML:{__html:Y}}):null}M.default.addHook&&M.default.addHook("beforeSanitizeElements",function(re){return re.href&&re.setAttribute("rel","noopener noreferrer"),re}),N.defaultProps={getConfigs:function(){return{useUnsafeMarkdown:!1}}};const V=N;function X(re){var oe=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},fe=oe.useUnsafeMarkdown,ve=void 0!==fe&&fe,Pe=ve,De=ve?[]:["style","class"];return ve&&!X.hasWarnedAboutDeprecation&&(console.warn("useUnsafeMarkdown display configuration parameter is deprecated since >3.26.0 and will be removed in v4.0.0."),X.hasWarnedAboutDeprecation=!0),M.default.sanitize(re,{ADD_ATTR:["target"],FORBID_TAGS:["style","form"],ALLOW_DATA_ATTR:Pe,FORBID_ATTR:De})}X.hasWarnedAboutDeprecation=!1},5308:(n,s,t)=>{t.r(s),t.d(s,{default:()=>X});var o,l=t(29),_=t(5487),M=t(6298),w=t(8102),N=t(5102),V={};const X=V;(0,l.default)(o=(0,_.default)(N).call(N)).call(o,function(re){if("./index.js"!==re){var oe=N(re);V[(0,M.Zl)(re)]=oe.default?oe.default:oe}}),V.SafeRender=w.default},5812:(n,s,t)=>{t.r(s),t.d(s,{SHOW_AUTH_POPUP:()=>V,AUTHORIZE:()=>X,LOGOUT:()=>re,PRE_AUTHORIZE_OAUTH2:()=>oe,AUTHORIZE_OAUTH2:()=>fe,VALIDATE:()=>ve,CONFIGURE_AUTH:()=>Pe,RESTORE_AUTHORIZATION:()=>De,showDefinitions:()=>Ie,authorize:()=>Ae,authorizeWithPersistOption:()=>Y,logout:()=>Et,logoutWithPersistOption:()=>ft,preAuthorizeImplicit:()=>xt,authorizeOauth2:()=>Ht,authorizeOauth2WithPersistOption:()=>yn,authorizePassword:()=>It,authorizeApplication:()=>In,authorizeAccessCodeWithFormParams:()=>On,authorizeAccessCodeWithBasicAuthentication:()=>Yr,authorizeRequest:()=>Ir,configureAuth:()=>Hr,restoreAuthorization:()=>Wr,persistAuthorizationIfNeeded:()=>En,authPopup:()=>Un});var o=t(1581),l=t(313),_=t(7512),M=t(8900),w=t(7504),N=t(6298),V="show_popup",X="authorize",re="logout",oe="pre_authorize_oauth2",fe="authorize_oauth2",ve="validate",Pe="configure_auth",De="restore_authorization";function Ie(Yn){return{type:V,payload:Yn}}function Ae(Yn){return{type:X,payload:Yn}}var Y=function(Yn){return function(ir){var An=ir.authActions;An.authorize(Yn),An.persistAuthorizationIfNeeded()}};function Et(Yn){return{type:re,payload:Yn}}var ft=function(Yn){return function(ir){var An=ir.authActions;An.logout(Yn),An.persistAuthorizationIfNeeded()}},xt=function(Yn){return function(ir){var An=ir.authActions,Lr=ir.errActions,Wi=Yn.auth,Mi=Yn.token,Yi=Yn.isValid,Nn=Wi.name,fn=Wi.schema.get("flow");delete w.Z.swaggerUIRedirectOauth2,"accessCode"===fn||Yi||Lr.newAuthErr({authId:Nn,source:"auth",level:"warning",message:"Authorization may be unsafe, passed state was changed in server Passed state wasn't returned from auth server"}),Mi.error?Lr.newAuthErr({authId:Nn,source:"auth",level:"error",message:(0,l.default)(Mi)}):An.authorizeOauth2WithPersistOption({auth:Wi,token:Mi})}};function Ht(Yn){return{type:fe,payload:Yn}}var yn=function(Yn){return function(ir){var An=ir.authActions;An.authorizeOauth2(Yn),An.persistAuthorizationIfNeeded()}},It=function(Yn){return function(ir){var Ji,Ho,Ao,An=ir.authActions,Lr=Yn.schema,Wi=Yn.name,Mi=Yn.username,Yi=Yn.password,jr=Yn.passwordType,Nn=Yn.clientId,fn=Yn.clientSecret,Vr={grant_type:"password",scope:Yn.scopes.join(" "),username:Mi,password:Yi},xi={};switch(jr){case"request-body":Ji=Vr,Ao=fn,(Ho=Nn)&&(0,_.default)(Ji,{client_id:Ho}),Ao&&(0,_.default)(Ji,{client_secret:Ao});break;case"basic":xi.Authorization="Basic "+(0,N.r3)(Nn+":"+fn);break;default:console.warn("Warning: invalid passwordType ".concat(jr," was passed, not including client id and secret"))}return An.authorizeRequest({body:(0,N.GZ)(Vr),url:Lr.get("tokenUrl"),name:Wi,headers:xi,query:{},auth:Yn})}},In=function(Yn){return function(ir){var An=ir.authActions,Lr=Yn.schema,Wi=Yn.scopes,Mi=Yn.name,Nn={Authorization:"Basic "+(0,N.r3)(Yn.clientId+":"+Yn.clientSecret)},fn={grant_type:"client_credentials",scope:Wi.join(" ")};return An.authorizeRequest({body:(0,N.GZ)(fn),name:Mi,url:Lr.get("tokenUrl"),auth:Yn,headers:Nn})}},On=function(Yn){var ir=Yn.auth,An=Yn.redirectUrl;return function(Lr){var Mi=ir.schema,Yi=ir.name;return Lr.authActions.authorizeRequest({body:(0,N.GZ)({grant_type:"authorization_code",code:ir.code,client_id:ir.clientId,client_secret:ir.clientSecret,redirect_uri:An,code_verifier:ir.codeVerifier}),name:Yi,url:Mi.get("tokenUrl"),auth:ir})}},Yr=function(Yn){var ir=Yn.auth,An=Yn.redirectUrl;return function(Lr){var Wi=Lr.authActions,Mi=ir.schema,Yi=ir.name,jr=ir.clientId,fn=ir.codeVerifier,Vr={Authorization:"Basic "+(0,N.r3)(jr+":"+ir.clientSecret)};return Wi.authorizeRequest({body:(0,N.GZ)({grant_type:"authorization_code",code:ir.code,client_id:jr,redirect_uri:An,code_verifier:fn}),name:Yi,url:Mi.get("tokenUrl"),auth:ir,headers:Vr})}},Ir=function(Yn){return function(ir){var An,Lr=ir.fn,Wi=ir.getConfigs,Mi=ir.authActions,Yi=ir.errActions,jr=ir.oas3Selectors,Nn=ir.specSelectors,Vr=Yn.body,xi=Yn.query,Ji=void 0===xi?{}:xi,Ho=Yn.headers,Ao=void 0===Ho?{}:Ho,Vs=Yn.name,Qs=Yn.url,Ri=Yn.auth,uo=(ir.authSelectors.getConfigs()||{}).additionalQueryStringParams;if(Nn.isOAS3()){var bo=jr.serverEffectiveValue(jr.selectedServer());An=(0,M.default)(Qs,bo,!0)}else An=(0,M.default)(Qs,Nn.url(),!0);"object"===(0,o.default)(uo)&&(An.query=(0,_.default)({},An.query,uo));var Ye=An.toString(),Ct=(0,_.default)({Accept:"application/json, text/plain, */*","Content-Type":"application/x-www-form-urlencoded","X-Requested-With":"XMLHttpRequest"},Ao);Lr.fetch({url:Ye,method:"post",headers:Ct,query:Ji,body:Vr,requestInterceptor:Wi().requestInterceptor,responseInterceptor:Wi().responseInterceptor}).then(function(bt){var Vn=JSON.parse(bt.data);bt.ok?Vn&&Vn.error||Vn&&Vn.parseError?Yi.newAuthErr({authId:Vs,level:"error",source:"auth",message:(0,l.default)(Vn)}):Mi.authorizeOauth2WithPersistOption({auth:Ri,token:Vn}):Yi.newAuthErr({authId:Vs,level:"error",source:"auth",message:bt.statusText})}).catch(function(bt){var Vn=new Error(bt).message;if(bt.response&&bt.response.data){var Mr=bt.response.data;try{var kr="string"==typeof Mr?JSON.parse(Mr):Mr;kr.error&&(Vn+=", error: ".concat(kr.error)),kr.error_description&&(Vn+=", description: ".concat(kr.error_description))}catch(Ni){}}Yi.newAuthErr({authId:Vs,level:"error",source:"auth",message:Vn})})}};function Hr(Yn){return{type:Pe,payload:Yn}}function Wr(Yn){return{type:De,payload:Yn}}var En=function(){return function(Yn){var ir=Yn.authSelectors;if((0,Yn.getConfigs)().persistAuthorization){var An=ir.authorized();localStorage.setItem("authorized",(0,l.default)(An.toJS()))}}},Un=function(Yn,ir){return function(){w.Z.swaggerUIRedirectOauth2=ir,w.Z.open(Yn)}}},3705:(n,s,t)=>{t.r(s),t.d(s,{default:()=>X,preauthorizeBasic:()=>re,preauthorizeApiKey:()=>oe});var o=t(775),l=t(5527),_=t(5171),M=t(3962),w=t(5812),N=t(35),V=t(8302);function X(){return{afterLoad:function(fe){this.rootInjects=this.rootInjects||{},this.rootInjects.initOAuth=fe.authActions.configureAuth,this.rootInjects.preauthorizeApiKey=(0,l.default)(oe).call(oe,null,fe),this.rootInjects.preauthorizeBasic=(0,l.default)(re).call(re,null,fe)},statePlugins:{auth:{reducers:M.default,actions:w,selectors:N},spec:{wrapActions:V}}}}function re(fe,ve,Pe,De){var Ie,Ae=fe.authActions.authorize,Y=fe.specSelectors,Et=Y.specJson,ft=(0,Y.isOAS3)()?["components","securitySchemes"]:["securityDefinitions"],xt=Et().getIn((0,_.default)(Ie=[]).call(Ie,ft,[ve]));return xt?Ae((0,o.default)({},ve,{value:{username:Pe,password:De},schema:xt.toJS()})):null}function oe(fe,ve,Pe){var De,Ie=fe.authActions.authorize,Ae=fe.specSelectors,Y=Ae.specJson,Et=(0,Ae.isOAS3)()?["components","securitySchemes"]:["securityDefinitions"],ft=Y().getIn((0,_.default)(De=[]).call(De,Et,[ve]));return ft?Ie((0,o.default)({},ve,{value:Pe,schema:ft.toJS()})):null}},3962:(n,s,t)=>{t.r(s),t.d(s,{default:()=>re});var o,l=t(775),_=t(9334),M=t(29),w=t(7512),N=t(9725),V=t(6298),X=t(5812);const re=((0,l.default)(o={},X.SHOW_AUTH_POPUP,function(oe,fe){return oe.set("showDefinitions",fe.payload)}),(0,l.default)(o,X.AUTHORIZE,function(oe,fe){var ve,De=(0,N.fromJS)(fe.payload),Ie=oe.get("authorized")||(0,N.Map)();return(0,M.default)(ve=De.entrySeq()).call(ve,function(Ae){var Y=(0,_.default)(Ae,2),Et=Y[0],ft=Y[1];if(!(0,V.Wl)(ft.getIn))return oe.set("authorized",Ie);var xt=ft.getIn(["schema","type"]);if("apiKey"===xt||"http"===xt)Ie=Ie.set(Et,ft);else if("basic"===xt){var Ht=ft.getIn(["value","username"]),yn=ft.getIn(["value","password"]);Ie=(Ie=Ie.setIn([Et,"value"],{username:Ht,header:"Basic "+(0,V.r3)(Ht+":"+yn)})).setIn([Et,"schema"],ft.get("schema"))}}),oe.set("authorized",Ie)}),(0,l.default)(o,X.AUTHORIZE_OAUTH2,function(oe,fe){var ve,Pe=fe.payload,De=Pe.auth;De.token=(0,w.default)({},Pe.token),ve=(0,N.fromJS)(De);var Ae=oe.get("authorized")||(0,N.Map)();return Ae=Ae.set(ve.get("name"),ve),oe.set("authorized",Ae)}),(0,l.default)(o,X.LOGOUT,function(oe,fe){var ve=fe.payload,Pe=oe.get("authorized").withMutations(function(De){(0,M.default)(ve).call(ve,function(Ie){De.delete(Ie)})});return oe.set("authorized",Pe)}),(0,l.default)(o,X.CONFIGURE_AUTH,function(oe,fe){return oe.set("configs",fe.payload)}),(0,l.default)(o,X.RESTORE_AUTHORIZATION,function(oe,fe){return oe.set("authorized",(0,N.fromJS)(fe.payload.authorized))}),o)},35:(n,s,t)=>{t.r(s),t.d(s,{shownDefinitions:()=>fe,definitionsToAuthorize:()=>ve,getDefinitionsByNames:()=>Pe,definitionsForRequirements:()=>De,authorized:()=>Ie,isAuthorized:()=>Ae,getConfigs:()=>Y});var o=t(9334),l=t(29),_=t(6145),M=t(9963),w=t(8818),N=t(2565),V=t(2740),X=t(8639),re=t(9725),oe=function(Et){return Et},fe=(0,X.createSelector)(oe,function(Et){return Et.get("showDefinitions")}),ve=(0,X.createSelector)(oe,function(){return function(Et){var ft,xt=Et.specSelectors.securityDefinitions()||(0,re.Map)({}),Ht=(0,re.List)();return(0,l.default)(ft=xt.entrySeq()).call(ft,function(yn){var It=(0,o.default)(yn,2),In=It[0],On=It[1],Yr=(0,re.Map)();Yr=Yr.set(In,On),Ht=Ht.push(Yr)}),Ht}}),Pe=function(Et,ft){return function(xt){var Ht,yn=xt.specSelectors;console.warn("WARNING: getDefinitionsByNames is deprecated and will be removed in the next major version.");var It=yn.securityDefinitions(),In=(0,re.List)();return(0,l.default)(Ht=ft.valueSeq()).call(Ht,function(On){var Yr,Ir=(0,re.Map)();(0,l.default)(Yr=On.entrySeq()).call(Yr,function(Hr){var Wr,En,Un=(0,o.default)(Hr,2),Yn=Un[0],ir=Un[1],An=It.get(Yn);"oauth2"===An.get("type")&&ir.size&&(Wr=An.get("scopes"),(0,l.default)(En=Wr.keySeq()).call(En,function(Lr){ir.contains(Lr)||(Wr=Wr.delete(Lr))}),An=An.set("allowedScopes",Wr)),Ir=Ir.set(Yn,An)}),In=In.push(Ir)}),In}},De=function(Et){var ft=arguments.length>1&&void 0!==arguments[1]?arguments[1]:(0,re.List)();return function(xt){var Ht=xt.authSelectors.definitionsToAuthorize()||(0,re.List)();return(0,_.default)(Ht).call(Ht,function(yn){return(0,M.default)(ft).call(ft,function(It){return It.get(yn.keySeq().first())})})}},Ie=(0,X.createSelector)(oe,function(Et){return Et.get("authorized")||(0,re.Map)()}),Ae=function(Et,ft){return function(xt){var Ht,yn=xt.authSelectors.authorized();return re.List.isList(ft)?!!(0,_.default)(Ht=ft.toJS()).call(Ht,function(It){var In,On;return-1===(0,w.default)(In=(0,N.default)(On=(0,V.default)(It)).call(On,function(Yr){return!!yn.get(Yr)})).call(In,!1)}).length:null}},Y=(0,X.createSelector)(oe,function(Et){return Et.get("configs")})},8302:(n,s,t)=>{t.r(s),t.d(s,{execute:()=>l});var o=t(1013),l=function(_,M){var w=M.authSelectors,N=M.specSelectors;return function(V){var X=V.path,re=V.method,oe=V.operation,fe=V.extras,ve={authorized:w.authorized()&&w.authorized().toJS(),definitions:N.securityDefinitions()&&N.securityDefinitions().toJS(),specSecurity:N.security()&&N.security().toJS()};return _((0,o.default)({path:X,method:re,operation:oe,securities:ve},fe))}}},714:(n,s,t)=>{t.r(s),t.d(s,{UPDATE_CONFIGS:()=>l,TOGGLE_CONFIGS:()=>_,update:()=>M,toggle:()=>w,loaded:()=>N});var o=t(775),l="configs_update",_="configs_toggle";function M(V,X){return{type:l,payload:(0,o.default)({},V,X)}}function w(V){return{type:_,payload:V}}var N=function(){return function(V){var re=V.authActions;if((0,V.getConfigs)().persistAuthorization){var oe=localStorage.getItem("authorized");oe&&re.restoreAuthorization({authorized:JSON.parse(oe)})}}}},2256:(n,s,t)=>{t.r(s),t.d(s,{parseYamlConfig:()=>l});var o=t(626),l=function(_,M){try{return o.default.load(_)}catch(w){return M&&M.errActions.newThrownErr(new Error(w)),{}}}},1661:(n,s,t)=>{t.r(s),t.d(s,{default:()=>X});var o=t(5163),l=t(2256),_=t(714),M=t(2698),w=t(9018),N=t(7743),V={getLocalConfig:function(){return(0,l.parseYamlConfig)(o)}};function X(){return{statePlugins:{spec:{actions:M,selectors:V},configs:{reducers:N.default,actions:_,selectors:w}}}}},7743:(n,s,t)=>{t.r(s),t.d(s,{default:()=>w});var o,l=t(775),_=t(9725),M=t(714);const w=((0,l.default)(o={},M.UPDATE_CONFIGS,function(N,V){return N.merge((0,_.fromJS)(V.payload))}),(0,l.default)(o,M.TOGGLE_CONFIGS,function(N,V){var X=V.payload,re=N.get(X);return N.set(X,!re)}),o)},9018:(n,s,t)=>{t.r(s),t.d(s,{get:()=>l});var o=t(4163),l=function(_,M){return _.getIn((0,o.default)(M)?M:[M])}},2698:(n,s,t)=>{t.r(s),t.d(s,{downloadConfig:()=>l,getConfigByUrl:()=>_});var o=t(2256),l=function(M){return function(w){return(0,w.fn.fetch)(M)}},_=function(M,w){return function(N){var V=N.specActions;if(M)return V.downloadConfig(M).then(X,X);function X(re){re instanceof Error||re.status>=400?(V.updateLoadingStatus("failedConfig"),V.updateLoadingStatus("failedConfig"),V.updateUrl(""),console.error(re.statusText+" "+M.url),w(null)):w((0,o.parseYamlConfig)(re.text))}}}},1970:(n,s,t)=>{t.r(s),t.d(s,{setHash:()=>o});var o=function(l){return l?history.pushState(null,null,"#".concat(l)):window.location.hash=""}},4980:(n,s,t)=>{t.r(s),t.d(s,{default:()=>M});var o=t(5858),l=t(877),_=t(4584);function M(){return[o.default,{statePlugins:{configs:{wrapActions:{loaded:function(w,N){return function(){w.apply(void 0,arguments);var V=decodeURIComponent(window.location.hash);N.layoutActions.parseDeepLinkHash(V)}}}}},wrapComponents:{operation:l.default,OperationTag:_.default}}]}},5858:(n,s,t)=>{t.r(s),t.d(s,{clearScrollTo:()=>xt,default:()=>Ht,parseDeepLinkHash:()=>Y,readyToScroll:()=>Et,scrollTo:()=>Ae,scrollToElement:()=>ft,show:()=>Ie});var o=t(775),l=t(9334),_=t(4163),M=t(5171),w=t(8136),N=t(2565),V=t(8818),X=t(1970);const re=(t.d(It={},{default:()=>HD()}),It);var It,oe,fe=t(6298),ve=t(9725),Pe="layout_scroll_to",De="layout_clear_scroll",Ie=function(yn,It){var In=It.getConfigs,On=It.layoutSelectors;return function(){for(var Yr=arguments.length,Ir=new Array(Yr),Hr=0;Hr<Yr;Hr++)Ir[Hr]=arguments[Hr];if(yn.apply(void 0,Ir),In().deepLinking)try{var Wr=Ir[0],En=Ir[1];Wr=(0,_.default)(Wr)?Wr:[Wr];var Un=On.urlHashArrayFromIsShownKey(Wr);if(!Un.length)return;var Yn,ir=(0,l.default)(Un,2),An=ir[0],Lr=ir[1];if(!En)return(0,X.setHash)("/");2===Un.length?(0,X.setHash)((0,fe.oJ)((0,M.default)(Yn="/".concat(encodeURIComponent(An),"/")).call(Yn,encodeURIComponent(Lr)))):1===Un.length&&(0,X.setHash)((0,fe.oJ)("/".concat(encodeURIComponent(An))))}catch(Wi){console.error(Wi)}}},Ae=function(yn){return{type:Pe,payload:(0,_.default)(yn)?yn:[yn]}},Y=function(yn){return function(It){var In=It.layoutActions,On=It.layoutSelectors;if((0,It.getConfigs)().deepLinking&&yn){var Yr,Ir=(0,w.default)(yn).call(yn,1);"!"===Ir[0]&&(Ir=(0,w.default)(Ir).call(Ir,1)),"/"===Ir[0]&&(Ir=(0,w.default)(Ir).call(Ir,1));var Hr=(0,N.default)(Yr=Ir.split("/")).call(Yr,function(Mi){return Mi||""}),Wr=On.isShownKeyFromUrlHashArray(Hr),En=(0,l.default)(Wr,3),Yn=En[1],ir=void 0===Yn?"":Yn,An=En[2],Lr=void 0===An?"":An;if("operations"===En[0]){var Wi=On.isShownKeyFromUrlHashArray([ir]);(0,V.default)(ir).call(ir,"_")>-1&&(console.warn("Warning: escaping deep link whitespace with `_` will be unsupported in v4.0, use `%20` instead."),In.show((0,N.default)(Wi).call(Wi,function(Mi){return Mi.replace(/_/g," ")}),!0)),In.show(Wi,!0)}((0,V.default)(ir).call(ir,"_")>-1||(0,V.default)(Lr).call(Lr,"_")>-1)&&(console.warn("Warning: escaping deep link whitespace with `_` will be unsupported in v4.0, use `%20` instead."),In.show((0,N.default)(Wr).call(Wr,function(Mi){return Mi.replace(/_/g," ")}),!0)),In.show(Wr,!0),In.scrollTo(Wr)}}},Et=function(yn,It){return function(In){var On=In.layoutSelectors.getScrollToKey();ve.default.is(On,(0,ve.fromJS)(yn))&&(In.layoutActions.scrollToElement(It),In.layoutActions.clearScrollTo())}},ft=function(yn,It){return function(In){try{It=It||In.fn.getScrollParent(yn),re.default.createScroller(It).to(yn)}catch(On){console.error(On)}}},xt=function(){return{type:De}};const Ht={fn:{getScrollParent:function(yn,It){var In=document.documentElement,On=getComputedStyle(yn),Yr="absolute"===On.position,Ir=It?/(auto|scroll|hidden)/:/(auto|scroll)/;if("fixed"===On.position)return In;for(var Hr=yn;Hr=Hr.parentElement;)if(On=getComputedStyle(Hr),(!Yr||"static"!==On.position)&&Ir.test(On.overflow+On.overflowY+On.overflowX))return Hr;return In}},statePlugins:{layout:{actions:{scrollToElement:ft,scrollTo:Ae,clearScrollTo:xt,readyToScroll:Et,parseDeepLinkHash:Y},selectors:{getScrollToKey:function(yn){return yn.get("scrollToKey")},isShownKeyFromUrlHashArray:function(yn,It){var In=(0,l.default)(It,2),On=In[0],Yr=In[1];return Yr?["operations",On,Yr]:On?["operations-tag",On]:[]},urlHashArrayFromIsShownKey:function(yn,It){var In=(0,l.default)(It,3),On=In[0],Yr=In[1];return"operations"==On?[Yr,In[2]]:"operations-tag"==On?[Yr]:[]}},reducers:(oe={},(0,o.default)(oe,Pe,function(yn,It){return yn.set("scrollToKey",ve.default.fromJS(It.payload))}),(0,o.default)(oe,De,function(yn){return yn.delete("scrollToKey")}),oe),wrapActions:{show:Ie}}}}},4584:(n,s,t)=>{t.r(s),t.d(s,{default:()=>re});var o=t(7344),l=t(8656),_=t(6340),M=t(9972),w=t(5416),N=t(775),V=t(5171),X=t(810);t(5053);const re=function(oe,fe){return function(ve){(0,M.default)(De,ve);var Pe=(0,w.default)(De);function De(){var Ie,Ae;(0,o.default)(this,De);for(var Y=arguments.length,Et=new Array(Y),ft=0;ft<Y;ft++)Et[ft]=arguments[ft];return Ae=Pe.call.apply(Pe,(0,V.default)(Ie=[this]).call(Ie,Et)),(0,N.default)((0,_.default)(Ae),"onLoad",function(xt){fe.layoutActions.readyToScroll(["operations-tag",Ae.props.tag],xt)}),Ae}return(0,l.default)(De,[{key:"render",value:function(){return X.default.createElement("span",{ref:this.onLoad},X.default.createElement(oe,this.props))}}]),De}(X.default.Component)}},877:(n,s,t)=>{t.r(s),t.d(s,{default:()=>re});var o=t(7344),l=t(8656),_=t(6340),M=t(9972),w=t(5416),N=t(775),V=t(5171),X=t(810);t(9569);const re=function(oe,fe){return function(ve){(0,M.default)(De,ve);var Pe=(0,w.default)(De);function De(){var Ie,Ae;(0,o.default)(this,De);for(var Y=arguments.length,Et=new Array(Y),ft=0;ft<Y;ft++)Et[ft]=arguments[ft];return Ae=Pe.call.apply(Pe,(0,V.default)(Ie=[this]).call(Ie,Et)),(0,N.default)((0,_.default)(Ae),"onLoad",function(xt){var Ht=Ae.props.operation,yn=Ht.toObject(),It=yn.tag,In=yn.operationId,On=Ht.toObject().isShownKey;fe.layoutActions.readyToScroll(On=On||["operations",It,In],xt)}),Ae}return(0,l.default)(De,[{key:"render",value:function(){return X.default.createElement("span",{ref:this.onLoad},X.default.createElement(oe,this.props))}}]),De}(X.default.Component)}},8011:(n,s,t)=>{t.r(s),t.d(s,{default:()=>re});var o=t(7512),l=t(3769),_=t(5171),M=t(8818),w=t(313),N=t(8639),V=t(9725),X=t(7504);function re(oe){var fe=oe.fn;return{statePlugins:{spec:{actions:{download:function(ve){return function(Pe){var De=Pe.errActions,Ie=Pe.specSelectors,Ae=Pe.specActions,Et=fe.fetch,ft=(0,Pe.getConfigs)();function xt(Ht){if(Ht instanceof Error||Ht.status>=400)return Ae.updateLoadingStatus("failed"),De.newThrownErr((0,o.default)(new Error((Ht.message||Ht.statusText)+" "+ve),{source:"fetch"})),void(!Ht.status&&Ht instanceof Error&&function(){try{var yn;if("URL"in X.Z?yn=new l.default(ve):(yn=document.createElement("a")).href=ve,"https:"!==yn.protocol&&"https:"===X.Z.location.protocol){var It=(0,o.default)(new Error("Possible mixed-content issue? The page was loaded over https:// but a ".concat(yn.protocol,"// URL was specified. Check that you are not attempting to load mixed content.")),{source:"fetch"});return void De.newThrownErr(It)}if(yn.origin!==X.Z.location.origin){var In,On=(0,o.default)(new Error((0,_.default)(In="Possible cross-origin (CORS) issue? The URL origin (".concat(yn.origin,") does not match the page (")).call(In,X.Z.location.origin,"). Check the server returns the correct 'Access-Control-Allow-*' headers.")),{source:"fetch"});De.newThrownErr(On)}}catch(Yr){return}}());Ae.updateLoadingStatus("success"),Ae.updateSpec(Ht.text),Ie.url()!==ve&&Ae.updateUrl(ve)}ve=ve||Ie.url(),Ae.updateLoadingStatus("loading"),De.clear({source:"fetch"}),Et({url:ve,loadSpec:!0,requestInterceptor:ft.requestInterceptor||function(Ht){return Ht},responseInterceptor:ft.responseInterceptor||function(Ht){return Ht},credentials:"same-origin",headers:{Accept:"application/json,*/*"}}).then(xt,xt)}},updateLoadingStatus:function(ve){var Pe,De=[null,"loading","failed","success","failedConfig"];return-1===(0,M.default)(De).call(De,ve)&&console.error((0,_.default)(Pe="Error: ".concat(ve," is not one of ")).call(Pe,(0,w.default)(De))),{type:"spec_update_loading_status",payload:ve}}},reducers:{spec_update_loading_status:function(ve,Pe){return"string"==typeof Pe.payload?ve.set("loadingStatus",Pe.payload):ve}},selectors:{loadingStatus:(0,N.createSelector)(function(ve){return ve||(0,V.Map)()},function(ve){return ve.get("loadingStatus")||null})}}}}}},4966:(n,s,t)=>{t.r(s),t.d(s,{NEW_THROWN_ERR:()=>l,NEW_THROWN_ERR_BATCH:()=>_,NEW_SPEC_ERR:()=>M,NEW_SPEC_ERR_BATCH:()=>w,NEW_AUTH_ERR:()=>N,CLEAR:()=>V,CLEAR_BY:()=>X,newThrownErr:()=>re,newThrownErrBatch:()=>oe,newSpecErr:()=>fe,newSpecErrBatch:()=>ve,newAuthErr:()=>Pe,clear:()=>De,clearBy:()=>Ie});var o=t(8518),l="err_new_thrown_err",_="err_new_thrown_err_batch",M="err_new_spec_err",w="err_new_spec_err_batch",N="err_new_auth_err",V="err_clear",X="err_clear_by";function re(Ae){return{type:l,payload:(0,o.serializeError)(Ae)}}function oe(Ae){return{type:_,payload:Ae}}function fe(Ae){return{type:M,payload:Ae}}function ve(Ae){return{type:w,payload:Ae}}function Pe(Ae){return{type:N,payload:Ae}}function De(){var Ae=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};return{type:V,payload:Ae}}function Ie(){var Ae=arguments.length>0&&void 0!==arguments[0]?arguments[0]:function(){return!0};return{type:X,payload:Ae}}},6808:(n,s,t)=>{t.r(s),t.d(s,{default:()=>w});var o=t(6145),l=t(2565);const _=(t.d(V={},{default:()=>UD()}),V);var V,M=[t(2392),t(1835)];function w(N){var V,X={jsSpec:{}},re=(0,_.default)(M,function(oe,fe){try{var ve=fe.transform(oe,X);return(0,o.default)(ve).call(ve,function(Pe){return!!Pe})}catch(Pe){return console.error("Transformer error:",Pe),oe}},N);return(0,l.default)(V=(0,o.default)(re).call(re,function(oe){return!!oe})).call(V,function(oe){return!oe.get("line")&&oe.get("path"),oe})}},2392:(n,s,t)=>{t.r(s),t.d(s,{transform:()=>w});var o=t(2565),l=t(8818),_=t(8136),M=t(6785);function w(N){return(0,o.default)(N).call(N,function(V){var X,De,re="is not of a type(s)",oe=(0,l.default)(X=V.get("message")).call(X,re);if(oe>-1){var fe,ve,Pe=(0,_.default)(fe=V.get("message")).call(fe,oe+re.length).split(",");return V.set("message",(0,_.default)(ve=V.get("message")).call(ve,0,oe)+(0,M.default)(De=Pe).call(De,function(Ie,Ae,Y,Et){return Y===Et.length-1&&Et.length>1?Ie+"or "+Ae:Et[Y+1]&&Et.length>2?Ie+Ae+", ":Et[Y+1]?Ie+Ae+" ":Ie+Ae},"should be a"))}return V})}},1835:(n,s,t)=>{function o(l,_){return l}t.r(s),t.d(s,{transform:()=>o}),t(2565),t(8818),t(9908),t(9725)},7793:(n,s,t)=>{t.r(s),t.d(s,{default:()=>M});var o=t(3527),l=t(4966),_=t(7667);function M(w){return{statePlugins:{err:{reducers:(0,o.default)(w),actions:l,selectors:_}}}}},3527:(n,s,t)=>{t.r(s),t.d(s,{default:()=>fe});var o=t(775),l=t(7512),_=t(2565),M=t(5171),w=t(6145),N=t(7930),V=t(4966),X=t(9725),re=t(6808),oe={line:0,level:"error",message:"Unknown error"};function fe(){var ve;return(0,o.default)(ve={},V.NEW_THROWN_ERR,function(Pe,De){var Ae=(0,l.default)(oe,De.payload,{type:"thrown"});return Pe.update("errors",function(Y){return(Y||(0,X.List)()).push((0,X.fromJS)(Ae))}).update("errors",function(Y){return(0,re.default)(Y)})}),(0,o.default)(ve,V.NEW_THROWN_ERR_BATCH,function(Pe,De){var Ie=De.payload;return Ie=(0,_.default)(Ie).call(Ie,function(Ae){return(0,X.fromJS)((0,l.default)(oe,Ae,{type:"thrown"}))}),Pe.update("errors",function(Ae){var Y;return(0,M.default)(Y=Ae||(0,X.List)()).call(Y,(0,X.fromJS)(Ie))}).update("errors",function(Ae){return(0,re.default)(Ae)})}),(0,o.default)(ve,V.NEW_SPEC_ERR,function(Pe,De){var Ae=(0,X.fromJS)(De.payload);return Ae=Ae.set("type","spec"),Pe.update("errors",function(Y){return(Y||(0,X.List)()).push((0,X.fromJS)(Ae)).sortBy(function(Et){return Et.get("line")})}).update("errors",function(Y){return(0,re.default)(Y)})}),(0,o.default)(ve,V.NEW_SPEC_ERR_BATCH,function(Pe,De){var Ie=De.payload;return Ie=(0,_.default)(Ie).call(Ie,function(Ae){return(0,X.fromJS)((0,l.default)(oe,Ae,{type:"spec"}))}),Pe.update("errors",function(Ae){var Y;return(0,M.default)(Y=Ae||(0,X.List)()).call(Y,(0,X.fromJS)(Ie))}).update("errors",function(Ae){return(0,re.default)(Ae)})}),(0,o.default)(ve,V.NEW_AUTH_ERR,function(Pe,De){var Ae=(0,X.fromJS)((0,l.default)({},De.payload));return Ae=Ae.set("type","auth"),Pe.update("errors",function(Y){return(Y||(0,X.List)()).push((0,X.fromJS)(Ae))}).update("errors",function(Y){return(0,re.default)(Y)})}),(0,o.default)(ve,V.CLEAR,function(Pe,De){var Ie,Ae=De.payload;if(!Ae||!Pe.get("errors"))return Pe;var Y=(0,w.default)(Ie=Pe.get("errors")).call(Ie,function(Et){var ft;return(0,N.default)(ft=Et.keySeq()).call(ft,function(xt){var Ht=Et.get(xt),yn=Ae[xt];return!yn||Ht!==yn})});return Pe.merge({errors:Y})}),(0,o.default)(ve,V.CLEAR_BY,function(Pe,De){var Ie,Ae=De.payload;if(!Ae||"function"!=typeof Ae)return Pe;var Y=(0,w.default)(Ie=Pe.get("errors")).call(Ie,function(Et){return Ae(Et)});return Pe.merge({errors:Y})}),ve}},7667:(n,s,t)=>{t.r(s),t.d(s,{allErrors:()=>_,lastError:()=>M});var o=t(9725),l=t(8639),_=(0,l.createSelector)(function(w){return w},function(w){return w.get("errors",(0,o.List)())}),M=(0,l.createSelector)(_,function(w){return w.last()})},9978:(n,s,t)=>{t.r(s),t.d(s,{default:()=>l});var o=t(4309);function l(){return{fn:{opsFilter:o.default}}}},4309:(n,s,t)=>{t.r(s),t.d(s,{default:()=>_});var o=t(6145),l=t(8818);function _(M,w){return(0,o.default)(M).call(M,function(N,V){return-1!==(0,l.default)(V).call(V,w)})}},5474:(n,s,t)=>{t.r(s),t.d(s,{UPDATE_LAYOUT:()=>l,UPDATE_FILTER:()=>_,UPDATE_MODE:()=>M,SHOW:()=>w,updateLayout:()=>N,updateFilter:()=>V,show:()=>X,changeMode:()=>re});var o=t(6298),l="layout_update_layout",_="layout_update_filter",M="layout_update_mode",w="layout_show";function N(oe){return{type:l,payload:oe}}function V(oe){return{type:_,payload:oe}}function X(oe){var fe=!(arguments.length>1&&void 0!==arguments[1])||arguments[1];return oe=(0,o.AF)(oe),{type:w,payload:{thing:oe,shown:fe}}}function re(oe){var fe=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"";return oe=(0,o.AF)(oe),{type:M,payload:{thing:oe,mode:fe}}}},6821:(n,s,t)=>{t.r(s),t.d(s,{default:()=>w});var o=t(5672),l=t(5474),_=t(4400),M=t(8989);function w(){return{statePlugins:{layout:{reducers:o.default,actions:l,selectors:_},spec:{wrapSelectors:M}}}}},5672:(n,s,t)=>{t.r(s),t.d(s,{default:()=>N});var o,l=t(775),_=t(5171),M=t(9725),w=t(5474);const N=((0,l.default)(o={},w.UPDATE_LAYOUT,function(V,X){return V.set("layout",X.payload)}),(0,l.default)(o,w.UPDATE_FILTER,function(V,X){return V.set("filter",X.payload)}),(0,l.default)(o,w.SHOW,function(V,X){var re=X.payload.shown,oe=(0,M.fromJS)(X.payload.thing);return V.update("shown",(0,M.fromJS)({}),function(fe){return fe.set(oe,re)})}),(0,l.default)(o,w.UPDATE_MODE,function(V,X){var re,oe=X.payload.thing,fe=X.payload.mode;return V.setIn((0,_.default)(re=["modes"]).call(re,oe),(fe||"")+"")}),o)},4400:(n,s,t)=>{t.r(s),t.d(s,{current:()=>N,currentFilter:()=>V,isShown:()=>X,whatMode:()=>re,showSummary:()=>oe});var o=t(2691),l=t(5171),_=t(8639),M=t(6298),w=t(9725),N=function(fe){return fe.get("layout")},V=function(fe){return fe.get("filter")},X=function(fe,ve,Pe){return ve=(0,M.AF)(ve),fe.get("shown",(0,w.fromJS)({})).get((0,w.fromJS)(ve),Pe)},re=function(fe,ve){var Pe,De=arguments.length>2&&void 0!==arguments[2]?arguments[2]:"";return ve=(0,M.AF)(ve),fe.getIn((0,l.default)(Pe=["modes"]).call(Pe,(0,o.default)(ve)),De)},oe=(0,_.createSelector)(function(fe){return fe},function(fe){return!X(fe,"editor")})},8989:(n,s,t)=>{t.r(s),t.d(s,{taggedOperations:()=>_});var o=t(5171),l=t(8136),_=function(M,w){return function(N){for(var V,X=arguments.length,re=new Array(X>1?X-1:0),oe=1;oe<X;oe++)re[oe-1]=arguments[oe];var fe=M.apply(void 0,(0,o.default)(V=[N]).call(V,re)),ve=w.getSystem(),Pe=ve.fn,De=ve.layoutSelectors,Ie=ve.getConfigs,Ae=Ie(),Y=Ae.maxDisplayedTags,Et=De.currentFilter();return Et&&!0!==Et&&"true"!==Et&&"false"!==Et&&(fe=Pe.opsFilter(fe,Et)),Y&&!isNaN(Y)&&Y>=0&&(fe=(0,l.default)(fe).call(fe,0,Y)),fe}}},9150:(n,s,t)=>{t.r(s),t.d(s,{default:()=>l});var o=t(5527);function l(_){var w={debug:0,info:1,log:2,warn:3,error:4},N=function(oe){return w[oe]||-1},X=N(_.configs.logLevel);function re(oe){for(var fe,ve=arguments.length,Pe=new Array(ve>1?ve-1:0),De=1;De<ve;De++)Pe[De-1]=arguments[De];N(oe)>=X&&(fe=console)[oe].apply(fe,Pe)}return re.warn=(0,o.default)(re).call(re,null,"warn"),re.error=(0,o.default)(re).call(re,null,"error"),re.info=(0,o.default)(re).call(re,null,"info"),re.debug=(0,o.default)(re).call(re,null,"debug"),{rootInjects:{log:re}}}},7002:(n,s,t)=>{t.r(s),t.d(s,{UPDATE_SELECTED_SERVER:()=>o,UPDATE_REQUEST_BODY_VALUE:()=>l,UPDATE_REQUEST_BODY_VALUE_RETAIN_FLAG:()=>_,UPDATE_REQUEST_BODY_INCLUSION:()=>M,UPDATE_ACTIVE_EXAMPLES_MEMBER:()=>w,UPDATE_REQUEST_CONTENT_TYPE:()=>N,UPDATE_RESPONSE_CONTENT_TYPE:()=>V,UPDATE_SERVER_VARIABLE_VALUE:()=>X,SET_REQUEST_BODY_VALIDATE_ERROR:()=>re,CLEAR_REQUEST_BODY_VALIDATE_ERROR:()=>oe,CLEAR_REQUEST_BODY_VALUE:()=>fe,setSelectedServer:()=>ve,setRequestBodyValue:()=>Pe,setRetainRequestBodyValueFlag:()=>De,setRequestBodyInclusion:()=>Ie,setActiveExamplesMember:()=>Ae,setRequestContentType:()=>Y,setResponseContentType:()=>Et,setServerVariableValue:()=>ft,setRequestBodyValidateError:()=>xt,clearRequestBodyValidateError:()=>Ht,initRequestBodyValidateError:()=>yn,clearRequestBodyValue:()=>It});var o="oas3_set_servers",l="oas3_set_request_body_value",_="oas3_set_request_body_retain_flag",M="oas3_set_request_body_inclusion",w="oas3_set_active_examples_member",N="oas3_set_request_content_type",V="oas3_set_response_content_type",X="oas3_set_server_variable_value",re="oas3_set_request_body_validate_error",oe="oas3_clear_request_body_validate_error",fe="oas3_clear_request_body_value";function ve(In,On){return{type:o,payload:{selectedServerUrl:In,namespace:On}}}function Pe(In){return{type:l,payload:{value:In.value,pathMethod:In.pathMethod}}}var De=function(In){return{type:_,payload:{value:In.value,pathMethod:In.pathMethod}}};function Ie(In){return{type:M,payload:{value:In.value,pathMethod:In.pathMethod,name:In.name}}}function Ae(In){return{type:w,payload:{name:In.name,pathMethod:In.pathMethod,contextType:In.contextType,contextName:In.contextName}}}function Y(In){return{type:N,payload:{value:In.value,pathMethod:In.pathMethod}}}function Et(In){return{type:V,payload:{value:In.value,path:In.path,method:In.method}}}function ft(In){return{type:X,payload:{server:In.server,namespace:In.namespace,key:In.key,val:In.val}}}var xt=function(In){return{type:re,payload:{path:In.path,method:In.method,validationErrors:In.validationErrors}}},Ht=function(In){return{type:oe,payload:{path:In.path,method:In.method}}},yn=function(In){var On=In.pathMethod;return{type:oe,payload:{path:On[0],method:On[1]}}},It=function(In){return{type:fe,payload:{pathMethod:In.pathMethod}}}},3723:(n,s,t)=>{t.r(s),t.d(s,{definitionsToAuthorize:()=>fe});var oe,o=t(775),l=t(9334),_=t(5171),M=t(29),w=t(6145),N=t(6785),V=t(8639),X=t(9725),re=t(7779),fe=(oe=(0,V.createSelector)(function(ve){return ve},function(ve){return ve.specSelectors.securityDefinitions()},function(ve,Pe){var De,Ie=(0,X.List)();return Pe&&(0,M.default)(De=Pe.entrySeq()).call(De,function(Ae){var Y,Et=(0,l.default)(Ae,2),ft=Et[0],xt=Et[1],Ht=xt.get("type");if("oauth2"===Ht&&(0,M.default)(Y=xt.get("flows").entrySeq()).call(Y,function(In){var On=(0,l.default)(In,2),Ir=On[1],Hr=(0,X.fromJS)({flow:On[0],authorizationUrl:Ir.get("authorizationUrl"),tokenUrl:Ir.get("tokenUrl"),scopes:Ir.get("scopes"),type:xt.get("type"),description:xt.get("description")});Ie=Ie.push(new X.Map((0,o.default)({},ft,(0,w.default)(Hr).call(Hr,function(Wr){return void 0!==Wr}))))}),"http"!==Ht&&"apiKey"!==Ht||(Ie=Ie.push(new X.Map((0,o.default)({},ft,xt)))),"openIdConnect"===Ht&&xt.get("openIdConnectData")){var yn=xt.get("openIdConnectData"),It=yn.get("grant_types_supported")||["authorization_code","implicit"];(0,M.default)(It).call(It,function(In){var On,Yr=yn.get("scopes_supported")&&(0,N.default)(On=yn.get("scopes_supported")).call(On,function(Hr,Wr){return Hr.set(Wr,"")},new X.Map),Ir=(0,X.fromJS)({flow:In,authorizationUrl:yn.get("authorization_endpoint"),tokenUrl:yn.get("token_endpoint"),scopes:Yr,type:"oauth2",openIdConnectUrl:xt.get("openIdConnectUrl")});Ie=Ie.push(new X.Map((0,o.default)({},ft,(0,w.default)(Ir).call(Ir,function(Hr){return void 0!==Hr}))))})}}),Ie}),function(ve,Pe){return function(){for(var De=Pe.getSystem().specSelectors.specJson(),Ie=arguments.length,Ae=new Array(Ie),Y=0;Y<Ie;Y++)Ae[Y]=arguments[Y];if((0,re.isOAS3)(De)){var Et,ft=Pe.getState().getIn(["spec","resolvedSubtrees","components","securitySchemes"]);return oe.apply(void 0,(0,_.default)(Et=[Pe,ft]).call(Et,Ae))}return ve.apply(void 0,Ae)}})},3427:(n,s,t)=>{t.r(s),t.d(s,{default:()=>N});var o=t(863),l=t(9334),_=t(2565),M=t(810),w=(t(5053),t(9569),t(9725));const N=function(V){var X,re=V.callbacks,fe=V.specPath,ve=(0,V.getComponent)("OperationContainer",!0);if(!re)return M.default.createElement("span",null,"No callbacks");var Pe=(0,_.default)(X=re.entrySeq()).call(X,function(De){var Ie,Ae=(0,l.default)(De,2),Y=Ae[0],Et=Ae[1];return M.default.createElement("div",{key:Y},M.default.createElement("h2",null,Y),(0,_.default)(Ie=Et.entrySeq()).call(Ie,function(ft){var xt,Ht=(0,l.default)(ft,2),yn=Ht[0];return"$$ref"===yn?null:M.default.createElement("div",{key:yn},(0,_.default)(xt=Ht[1].entrySeq()).call(xt,function(In){var On=(0,l.default)(In,2),Yr=On[0];if("$$ref"===Yr)return null;var Hr=(0,w.fromJS)({operation:On[1]});return M.default.createElement(ve,(0,o.default)({},V,{op:Hr,key:Yr,tag:"",method:Yr,path:yn,specPath:fe.push(Y,yn,Yr),allowTryItOut:!1}))}))}))});return M.default.createElement("div",null,Pe)}},6775:(n,s,t)=>{t.r(s),t.d(s,{default:()=>fe});var o=t(7344),l=t(8656),_=t(6340),M=t(9972),w=t(5416),N=t(775),V=t(7512),X=t(6145),re=t(2565),oe=t(810),fe=(t(5053),function(ve){(0,M.default)(De,ve);var Pe=(0,w.default)(De);function De(Ie,Ae){var Y;(0,o.default)(this,De),Y=Pe.call(this,Ie,Ae),(0,N.default)((0,_.default)(Y),"onChange",function(yn){var It=Y.props.onChange,In=yn.target,On=In.value,Yr=In.name,Ir=(0,V.default)({},Y.state.value);Yr?Ir[Yr]=On:Ir=On,Y.setState({value:Ir},function(){return It(Y.state)})});var Et=Y.props,ft=Et.name,xt=Et.schema,Ht=Y.getValue();return Y.state={name:ft,schema:xt,value:Ht},Y}return(0,l.default)(De,[{key:"getValue",value:function(){var Ie=this.props,Y=Ie.authorized;return Y&&Y.getIn([Ie.name,"value"])}},{key:"render",value:function(){var Ie,Ae,Y=this.props,Et=Y.schema,ft=Y.getComponent,xt=Y.errSelectors,Ht=Y.name,yn=ft("Input"),It=ft("Row"),In=ft("Col"),On=ft("authError"),Yr=ft("Markdown",!0),Ir=ft("JumpToPath",!0),Hr=(Et.get("scheme")||"").toLowerCase(),Wr=this.getValue(),En=(0,X.default)(Ie=xt.allErrors()).call(Ie,function(ir){return ir.get("authId")===Ht});if("basic"===Hr){var Un,Yn=Wr?Wr.get("username"):null;return oe.default.createElement("div",null,oe.default.createElement("h4",null,oe.default.createElement("code",null,Ht||Et.get("name")),"\xa0 (http, Basic)",oe.default.createElement(Ir,{path:["securityDefinitions",Ht]})),Yn&&oe.default.createElement("h6",null,"Authorized"),oe.default.createElement(It,null,oe.default.createElement(Yr,{source:Et.get("description")})),oe.default.createElement(It,null,oe.default.createElement("label",null,"Username:"),Yn?oe.default.createElement("code",null," ",Yn," "):oe.default.createElement(In,null,oe.default.createElement(yn,{type:"text",required:"required",name:"username","aria-label":"auth-basic-username",onChange:this.onChange,autoFocus:!0}))),oe.default.createElement(It,null,oe.default.createElement("label",null,"Password:"),Yn?oe.default.createElement("code",null," ****** "):oe.default.createElement(In,null,oe.default.createElement(yn,{autoComplete:"new-password",name:"password",type:"password","aria-label":"auth-basic-password",onChange:this.onChange}))),(0,re.default)(Un=En.valueSeq()).call(Un,function(ir,An){return oe.default.createElement(On,{error:ir,key:An})}))}return"bearer"===Hr?oe.default.createElement("div",null,oe.default.createElement("h4",null,oe.default.createElement("code",null,Ht||Et.get("name")),"\xa0 (http, Bearer)",oe.default.createElement(Ir,{path:["securityDefinitions",Ht]})),Wr&&oe.default.createElement("h6",null,"Authorized"),oe.default.createElement(It,null,oe.default.createElement(Yr,{source:Et.get("description")})),oe.default.createElement(It,null,oe.default.createElement("label",null,"Value:"),Wr?oe.default.createElement("code",null," ****** "):oe.default.createElement(In,null,oe.default.createElement(yn,{type:"text","aria-label":"auth-bearer-value",onChange:this.onChange,autoFocus:!0}))),(0,re.default)(Ae=En.valueSeq()).call(Ae,function(ir,An){return oe.default.createElement(On,{error:ir,key:An})})):oe.default.createElement("div",null,oe.default.createElement("em",null,oe.default.createElement("b",null,Ht)," HTTP authentication: unsupported scheme ","'".concat(Hr,"'")))}}]),De}(oe.default.Component))},6467:(n,s,t)=>{t.r(s),t.d(s,{default:()=>re});var o=t(3427),l=t(2458),_=t(5757),M=t(6617),w=t(9928),N=t(5327),V=t(6775),X=t(6796);const re={Callbacks:o.default,HttpAuth:V.default,RequestBody:l.default,Servers:M.default,ServersContainer:w.default,RequestBodyEditor:N.default,OperationServers:X.default,operationLink:_.default}},5757:(n,s,t)=>{t.r(s),t.d(s,{default:()=>X});var o=t(7344),l=t(8656),_=t(9972),M=t(5416),w=t(313),N=t(2565),V=t(810);t(5053),t(9569);const X=function(re){(0,_.default)(fe,re);var oe=(0,M.default)(fe);function fe(){return(0,o.default)(this,fe),oe.apply(this,arguments)}return(0,l.default)(fe,[{key:"render",value:function(){var xt,Ht,ve=this.props,Pe=ve.link,De=ve.name,Ie=(0,ve.getComponent)("Markdown",!0),Ae=Pe.get("operationId")||Pe.get("operationRef"),Y=Pe.get("parameters")&&Pe.get("parameters").toJS(),Et=Pe.get("description");return V.default.createElement("div",{className:"operation-link"},V.default.createElement("div",{className:"description"},V.default.createElement("b",null,V.default.createElement("code",null,De)),Et?V.default.createElement(Ie,{source:Et}):null),V.default.createElement("pre",null,"Operation `",Ae,"`",V.default.createElement("br",null),V.default.createElement("br",null),"Parameters ",("string"!=typeof(xt=(0,w.default)(Y,null,2))?"":(0,N.default)(Ht=xt.split("\n")).call(Ht,function(yn,It){return It>0?Array(1).join(" ")+yn:yn}).join("\n"))||"{}",V.default.createElement("br",null)))}}]),fe}(V.Component)},6796:(n,s,t)=>{t.r(s),t.d(s,{default:()=>oe});var o=t(1013),l=t(7344),_=t(8656),M=t(6340),w=t(9972),N=t(5416),V=t(775),X=t(5171),re=t(810),oe=(t(5053),t(9569),function(fe){(0,w.default)(Pe,fe);var ve=(0,N.default)(Pe);function Pe(){var De,Ie;(0,l.default)(this,Pe);for(var Ae=arguments.length,Y=new Array(Ae),Et=0;Et<Ae;Et++)Y[Et]=arguments[Et];return Ie=ve.call.apply(ve,(0,X.default)(De=[this]).call(De,Y)),(0,V.default)((0,M.default)(Ie),"setSelectedServer",function(ft){var xt,Ht=Ie.props,yn=Ht.path,It=Ht.method;return Ie.forceUpdate(),Ie.props.setSelectedServer(ft,(0,X.default)(xt="".concat(yn,":")).call(xt,It))}),(0,V.default)((0,M.default)(Ie),"setServerVariableValue",function(ft){var xt,Ht=Ie.props,yn=Ht.path,It=Ht.method;return Ie.forceUpdate(),Ie.props.setServerVariableValue((0,o.default)((0,o.default)({},ft),{},{namespace:(0,X.default)(xt="".concat(yn,":")).call(xt,It)}))}),(0,V.default)((0,M.default)(Ie),"getSelectedServer",function(){var ft,xt=Ie.props,yn=xt.method;return Ie.props.getSelectedServer((0,X.default)(ft="".concat(xt.path,":")).call(ft,yn))}),(0,V.default)((0,M.default)(Ie),"getServerVariable",function(ft,xt){var Ht,yn=Ie.props,In=yn.method;return Ie.props.getServerVariable({namespace:(0,X.default)(Ht="".concat(yn.path,":")).call(Ht,In),server:ft},xt)}),(0,V.default)((0,M.default)(Ie),"getEffectiveServerValue",function(ft){var xt,Ht=Ie.props,It=Ht.method;return Ie.props.getEffectiveServerValue({server:ft,namespace:(0,X.default)(xt="".concat(Ht.path,":")).call(xt,It)})}),Ie}return(0,_.default)(Pe,[{key:"render",value:function(){var De=this.props,Ie=De.operationServers,Ae=De.pathServers;if(!Ie&&!Ae)return null;var Et=(0,De.getComponent)("Servers"),ft=Ie||Ae,xt=Ie?"operation":"path";return re.default.createElement("div",{className:"opblock-section operation-servers"},re.default.createElement("div",{className:"opblock-section-header"},re.default.createElement("div",{className:"tab-header"},re.default.createElement("h4",{className:"opblock-title"},"Servers"))),re.default.createElement("div",{className:"opblock-description-wrapper"},re.default.createElement("h4",{className:"message"},"These ",xt,"-level options override the global server options."),re.default.createElement(Et,{servers:ft,currentServer:this.getSelectedServer(),setSelectedServer:this.setSelectedServer,setServerVariableValue:this.setServerVariableValue,getServerVariable:this.getServerVariable,getEffectiveServerValue:this.getEffectiveServerValue})))}}]),Pe}(re.default.Component))},5327:(n,s,t)=>{t.r(s),t.d(s,{default:()=>fe});var o=t(7344),l=t(8656),_=t(6340),M=t(9972),w=t(5416),N=t(775),V=t(810),X=(t(5053),t(8096)),re=t(6298),oe=Function.prototype,fe=function(ve){(0,M.default)(De,ve);var Pe=(0,w.default)(De);function De(Ie,Ae){var Y;return(0,o.default)(this,De),Y=Pe.call(this,Ie,Ae),(0,N.default)((0,_.default)(Y),"applyDefaultValue",function(Et){var ft=Et||Y.props,xt=ft.onChange,Ht=ft.defaultValue;return Y.setState({value:Ht}),xt(Ht)}),(0,N.default)((0,_.default)(Y),"onChange",function(Et){Y.props.onChange((0,re.Pz)(Et))}),(0,N.default)((0,_.default)(Y),"onDomChange",function(Et){var ft=Et.target.value;Y.setState({value:ft},function(){return Y.onChange(ft)})}),Y.state={value:(0,re.Pz)(Ie.value)||Ie.defaultValue},Ie.onChange(Ie.value),Y}return(0,l.default)(De,[{key:"UNSAFE_componentWillReceiveProps",value:function(Ie){this.props.value!==Ie.value&&Ie.value!==this.state.value&&this.setState({value:(0,re.Pz)(Ie.value)}),!Ie.value&&Ie.defaultValue&&this.state.value&&this.applyDefaultValue(Ie)}},{key:"render",value:function(){var Ie=this.props,Y=Ie.errors,Et=this.state.value,ft=Y.size>0,xt=(0,Ie.getComponent)("TextArea");return V.default.createElement("div",{className:"body-param"},V.default.createElement(xt,{className:(0,X.default)("body-param__text",{invalid:ft}),title:Y.size?Y.join(", "):"",value:Et,onChange:this.onDomChange}))}}]),De}(V.PureComponent);(0,N.default)(fe,"defaultProps",{onChange:oe,userHasEditedBody:!1})},2458:(n,s,t)=>{t.r(s),t.d(s,{getDefaultRequestBodyValue:()=>fe,default:()=>ve});var o=t(9334),l=t(2565),_=t(8818),M=t(2372),w=t(5171),N=t(4163),V=t(810),X=(t(5053),t(9569),t(9725)),re=t(6298),oe=t(2518),fe=function(Pe,De,Ie){var Ae=Pe.getIn(["content",De]),Y=Ae.get("schema").toJS(),Et=void 0!==Ae.get("examples"),ft=Ae.get("example"),xt=Et?Ae.getIn(["examples",Ie,"value"]):ft,Ht=(0,re.xi)(Y,De,{includeWriteOnly:!0},xt);return(0,re.Pz)(Ht)};const ve=function(Pe){var De=Pe.userHasEditedBody,Ie=Pe.requestBody,Ae=Pe.requestBodyValue,Y=Pe.requestBodyInclusionSetting,Et=Pe.requestBodyErrors,ft=Pe.getComponent,xt=Pe.getConfigs,Ht=Pe.specSelectors,yn=Pe.fn,It=Pe.contentType,In=Pe.isExecute,On=Pe.specPath,Yr=Pe.onChange,Ir=Pe.onChangeIncludeEmpty,Hr=Pe.activeExamplesKey,Wr=Pe.updateActiveExamplesKey,En=Pe.setRetainRequestBodyValueFlag,Un=function(Mr){var kr={key:Mr,shouldDispatchInit:!1,defaultValue:!0};return"no value"===Y.get(Mr,"no value")&&(kr.shouldDispatchInit=!0),kr},Yn=ft("Markdown",!0),ir=ft("modelExample"),An=ft("RequestBodyEditor"),Lr=ft("highlightCode"),Wi=ft("ExamplesSelectValueRetainer"),Mi=ft("Example"),Yi=ft("ParameterIncludeEmpty"),jr=xt().showCommonExtensions,Nn=Ie&&Ie.get("description")||null,fn=Ie&&Ie.get("content")||new X.OrderedMap;It=It||fn.keySeq().first()||"";var Vr=fn.get(It,(0,X.OrderedMap)()),xi=Vr.get("schema",(0,X.OrderedMap)()),Ji=Vr.get("examples",null),Ho=null==Ji?void 0:(0,l.default)(Ji).call(Ji,function(Mr,kr){var Ni,Zs=null===(Ni=Mr)||void 0===Ni?void 0:Ni.get("value",null);return Zs&&(Mr=Mr.set("value",fe(Ie,It,kr),Zs)),Mr});if(Et=X.List.isList(Et)?Et:(0,X.List)(),!Vr.size)return null;var Ao="object"===Vr.getIn(["schema","type"]),Vs="binary"===Vr.getIn(["schema","format"]),Qs="base64"===Vr.getIn(["schema","format"]);if("application/octet-stream"===It||0===(0,_.default)(It).call(It,"image/")||0===(0,_.default)(It).call(It,"audio/")||0===(0,_.default)(It).call(It,"video/")||Vs||Qs){var Ri=ft("Input");return In?V.default.createElement(Ri,{type:"file",onChange:function(Mr){Yr(Mr.target.files[0])}}):V.default.createElement("i",null,"Example values are not available for ",V.default.createElement("code",null,It)," media types.")}if(Ao&&("application/x-www-form-urlencoded"===It||0===(0,_.default)(It).call(It,"multipart/"))&&xi.get("properties",(0,X.OrderedMap)()).size>0){var uo,bo=ft("JsonSchemaForm"),Ye=ft("ParameterExt"),Ct=xi.get("properties",(0,X.OrderedMap)());return Ae=X.Map.isMap(Ae)?Ae:(0,X.OrderedMap)(),V.default.createElement("div",{className:"table-container"},Nn&&V.default.createElement(Yn,{source:Nn}),V.default.createElement("table",null,V.default.createElement("tbody",null,X.Map.isMap(Ct)&&(0,l.default)(uo=Ct.entrySeq()).call(uo,function(Mr){var kr,Ni,Zs=(0,o.default)(Mr,2),Vo=Zs[0],il=Zs[1];if(!il.get("readOnly")){var _l=jr?(0,re.po)(il):null,zl=(0,M.default)(kr=xi.get("required",(0,X.List)())).call(kr,Vo),Wu=il.get("type"),Yf=il.get("format"),xl=il.get("description"),Zc=Ae.getIn([Vo,"value"]),gp=Ae.getIn([Vo,"errors"])||Et,Bh=Y.get(Vo)||!1,sh=il.has("default")||il.has("example")||il.hasIn(["items","example"])||il.hasIn(["items","default"]),Uh=il.has("enum")&&(1===il.get("enum").size||zl),Vl=sh||Uh,Bc="";"array"!==Wu||Vl||(Bc=[]),("object"===Wu||Vl)&&(Bc=(0,re.xi)(il,!1,{includeWriteOnly:!0})),"string"!=typeof Bc&&"object"===Wu&&(Bc=(0,re.Pz)(Bc)),"string"==typeof Bc&&"array"===Wu&&(Bc=JSON.parse(Bc));var Lp="string"===Wu&&("binary"===Yf||"base64"===Yf);return V.default.createElement("tr",{key:Vo,className:"parameters","data-property-name":Vo},V.default.createElement("td",{className:"parameters-col_name"},V.default.createElement("div",{className:zl?"parameter__name required":"parameter__name"},Vo,zl?V.default.createElement("span",null,"\xa0*"):null),V.default.createElement("div",{className:"parameter__type"},Wu,Yf&&V.default.createElement("span",{className:"prop-format"},"($",Yf,")"),jr&&_l.size?(0,l.default)(Ni=_l.entrySeq()).call(Ni,function(ji){var lr,yi=(0,o.default)(ji,2),qi=yi[0],Po=yi[1];return V.default.createElement(Ye,{key:(0,w.default)(lr="".concat(qi,"-")).call(lr,Po),xKey:qi,xVal:Po})}):null),V.default.createElement("div",{className:"parameter__deprecated"},il.get("deprecated")?"deprecated":null)),V.default.createElement("td",{className:"parameters-col_description"},V.default.createElement(Yn,{source:xl}),In?V.default.createElement("div",null,V.default.createElement(bo,{fn:yn,dispatchInitialValue:!Lp,schema:il,description:Vo,getComponent:ft,value:void 0===Zc?Bc:Zc,required:zl,errors:gp,onChange:function(ji){Yr(ji,[Vo])}}),zl?null:V.default.createElement(Yi,{onChange:function(ji){return Ir(Vo,ji)},isIncluded:Bh,isIncludedOptions:Un(Vo),isDisabled:(0,N.default)(Zc)?0!==Zc.length:!(0,re.O2)(Zc)})):null))}}))))}var bt=fe(Ie,It,Hr),Vn=null;return(0,oe.O)(bt)&&(Vn="json"),V.default.createElement("div",null,Nn&&V.default.createElement(Yn,{source:Nn}),Ho?V.default.createElement(Wi,{userHasEditedBody:De,examples:Ho,currentKey:Hr,currentUserInputValue:Ae,onSelect:function(Mr){Wr(Mr)},updateValue:Yr,defaultToFirstExample:!0,getComponent:ft,setRetainRequestBodyValueFlag:En}):null,In?V.default.createElement("div",null,V.default.createElement(An,{value:Ae,errors:Et,defaultValue:bt,onChange:Yr,getComponent:ft})):V.default.createElement(ir,{getComponent:ft,getConfigs:xt,specSelectors:Ht,expandDepth:1,isExecute:In,schema:Vr.get("schema"),specPath:On.push("content",It),example:V.default.createElement(Lr,{className:"body-param__example",getConfigs:xt,language:Vn,value:(0,re.Pz)(Ae)||bt}),includeWriteOnly:!0}),Ho?V.default.createElement(Mi,{example:Ho.get(Hr),getComponent:ft,getConfigs:xt}):null)}},9928:(n,s,t)=>{t.r(s),t.d(s,{default:()=>N});var o=t(7344),l=t(8656),_=t(9972),M=t(5416),w=t(810),N=(t(5053),function(V){(0,_.default)(re,V);var X=(0,M.default)(re);function re(){return(0,o.default)(this,re),X.apply(this,arguments)}return(0,l.default)(re,[{key:"render",value:function(){var oe=this.props,ve=oe.oas3Selectors,Pe=oe.oas3Actions,De=oe.getComponent,Ie=oe.specSelectors.servers(),Ae=De("Servers");return Ie&&Ie.size?w.default.createElement("div",null,w.default.createElement("span",{className:"servers-title"},"Servers"),w.default.createElement(Ae,{servers:Ie,currentServer:ve.selectedServer(),setSelectedServer:Pe.setSelectedServer,setServerVariableValue:Pe.setServerVariableValue,getServerVariable:ve.serverVariableValue,getEffectiveServerValue:ve.serverEffectiveValue})):null}}]),re}(w.default.Component))},6617:(n,s,t)=>{t.r(s),t.d(s,{default:()=>Pe});var o=t(9334),l=t(7344),_=t(8656),M=t(6340),w=t(9972),N=t(5416),V=t(775),X=t(5171),re=t(1778),oe=t(2565),fe=t(810),ve=t(9725),Pe=(t(5053),t(9569),function(De){(0,w.default)(Ae,De);var Ie=(0,N.default)(Ae);function Ae(){var Y,Et;(0,l.default)(this,Ae);for(var ft=arguments.length,xt=new Array(ft),Ht=0;Ht<ft;Ht++)xt[Ht]=arguments[Ht];return Et=Ie.call.apply(Ie,(0,X.default)(Y=[this]).call(Y,xt)),(0,V.default)((0,M.default)(Et),"onServerChange",function(yn){Et.setServer(yn.target.value)}),(0,V.default)((0,M.default)(Et),"onServerVariableValueChange",function(yn){var It=Et.props,In=It.setServerVariableValue,On=It.currentServer,Yr=yn.target.getAttribute("data-variable");"function"==typeof In&&In({server:On,key:Yr,val:yn.target.value})}),(0,V.default)((0,M.default)(Et),"setServer",function(yn){(0,Et.props.setSelectedServer)(yn)}),Et}return(0,_.default)(Ae,[{key:"componentDidMount",value:function(){var Y,Et=this.props;Et.currentServer||this.setServer(null===(Y=Et.servers.first())||void 0===Y?void 0:Y.get("url"))}},{key:"UNSAFE_componentWillReceiveProps",value:function(Y){var Et=this,ft=Y.servers,xt=Y.setServerVariableValue,Ht=Y.getServerVariable;if(this.props.currentServer!==Y.currentServer||this.props.servers!==Y.servers){var yn,It=(0,re.default)(ft).call(ft,function(Wr){return Wr.get("url")===Y.currentServer}),In=(0,re.default)(yn=this.props.servers).call(yn,function(Wr){return Wr.get("url")===Et.props.currentServer})||(0,ve.OrderedMap)();if(!It)return this.setServer(ft.first().get("url"));var On=In.get("variables")||(0,ve.OrderedMap)(),Yr=((0,re.default)(On).call(On,function(Wr){return Wr.get("default")})||(0,ve.OrderedMap)()).get("default"),Ir=It.get("variables")||(0,ve.OrderedMap)(),Hr=((0,re.default)(Ir).call(Ir,function(Wr){return Wr.get("default")})||(0,ve.OrderedMap)()).get("default");(0,oe.default)(Ir).call(Ir,function(Wr,En){Ht(Y.currentServer,En)&&Yr===Hr||xt({server:Y.currentServer,key:En,val:Wr.get("default")||""})})}}},{key:"render",value:function(){var Y,Et,ft=this,xt=this.props,Ht=xt.servers,yn=xt.currentServer,It=xt.getServerVariable,In=xt.getEffectiveServerValue,On=((0,re.default)(Ht).call(Ht,function(Ir){return Ir.get("url")===yn})||(0,ve.OrderedMap)()).get("variables")||(0,ve.OrderedMap)(),Yr=0!==On.size;return fe.default.createElement("div",{className:"servers"},fe.default.createElement("label",{htmlFor:"servers"},fe.default.createElement("select",{onChange:this.onServerChange,value:yn},(0,oe.default)(Y=Ht.valueSeq()).call(Y,function(Ir){return fe.default.createElement("option",{value:Ir.get("url"),key:Ir.get("url")},Ir.get("url"),Ir.get("description")&&" - ".concat(Ir.get("description")))}).toArray())),Yr?fe.default.createElement("div",null,fe.default.createElement("div",{className:"computed-url"},"Computed URL:",fe.default.createElement("code",null,In(yn))),fe.default.createElement("h4",null,"Server variables"),fe.default.createElement("table",null,fe.default.createElement("tbody",null,(0,oe.default)(Et=On.entrySeq()).call(Et,function(Ir){var Hr,Wr=(0,o.default)(Ir,2),En=Wr[0],Un=Wr[1];return fe.default.createElement("tr",{key:En},fe.default.createElement("td",null,En),fe.default.createElement("td",null,Un.get("enum")?fe.default.createElement("select",{"data-variable":En,onChange:ft.onServerVariableValueChange},(0,oe.default)(Hr=Un.get("enum")).call(Hr,function(Yn){return fe.default.createElement("option",{selected:Yn===It(yn,En),key:Yn,value:Yn},Yn)})):fe.default.createElement("input",{type:"text",value:It(yn,En)||"",onChange:ft.onServerVariableValueChange,"data-variable":En})))})))):null)}}]),Ae}(fe.default.Component))},7779:(n,s,t)=>{t.r(s),t.d(s,{isOAS3:()=>M,isSwagger2:()=>w,OAS3ComponentWrapFactory:()=>N});var o=t(863),l=t(3590),_=t(810);function M(V){var X=V.get("openapi");return"string"==typeof X&&(0,l.default)(X).call(X,"3.0.")&&X.length>4}function w(V){var X=V.get("swagger");return"string"==typeof X&&(0,l.default)(X).call(X,"2.0")}function N(V){return function(X,re){return function(oe){return re&&re.specSelectors&&re.specSelectors.specJson?M(re.specSelectors.specJson())?_.default.createElement(V,(0,o.default)({},oe,re,{Ori:X})):_.default.createElement(X,oe):(console.warn("OAS3 wrapper: couldn't get spec"),null)}}}},7451:(n,s,t)=>{t.r(s),t.d(s,{default:()=>re});var o=t(2044),l=t(3723),_=t(1741),M=t(6467),w=t(7761),N=t(7002),V=t(5065),X=t(9666);function re(){return{components:M.default,wrapComponents:w.default,statePlugins:{spec:{wrapSelectors:o,selectors:_},auth:{wrapSelectors:l},oas3:{actions:N,reducers:X.default,selectors:V}}}}},9666:(n,s,t)=>{t.r(s),t.d(s,{default:()=>fe});var o=t(775);const l=(t.d(Pe={},{default:()=>Zt}),Pe);var Pe,_,M=t(9334),w=t(5487),N=t(8136),V=t(29),X=t(6785),re=t(9725),oe=t(7002);const fe=((0,o.default)(_={},oe.UPDATE_SELECTED_SERVER,function(ve,Pe){var De=Pe.payload,Ae=De.namespace;return ve.setIn(Ae?[Ae,"selectedServer"]:["selectedServer"],De.selectedServerUrl)}),(0,o.default)(_,oe.UPDATE_REQUEST_BODY_VALUE,function(ve,Pe){var De=Pe.payload,Ie=De.value,Y=(0,M.default)(De.pathMethod,2),Et=Y[0],ft=Y[1];if(!re.Map.isMap(Ie))return ve.setIn(["requestData",Et,ft,"bodyValue"],Ie);var xt,Ht=ve.getIn(["requestData",Et,ft,"bodyValue"])||(0,re.Map)();re.Map.isMap(Ht)||(Ht=(0,re.Map)());var yn=(0,w.default)(Ie).call(Ie),It=(0,l.default)(yn),In=(0,N.default)(It).call(It,0);return(0,V.default)(In).call(In,function(On){var Yr=Ie.getIn([On]);Ht.has(On)&&re.Map.isMap(Yr)||(xt=Ht.setIn([On,"value"],Yr))}),ve.setIn(["requestData",Et,ft,"bodyValue"],xt)}),(0,o.default)(_,oe.UPDATE_REQUEST_BODY_VALUE_RETAIN_FLAG,function(ve,Pe){var De=Pe.payload,Ie=De.value,Y=(0,M.default)(De.pathMethod,2);return ve.setIn(["requestData",Y[0],Y[1],"retainBodyValue"],Ie)}),(0,o.default)(_,oe.UPDATE_REQUEST_BODY_INCLUSION,function(ve,Pe){var De=Pe.payload,Ie=De.value,Y=De.name,Et=(0,M.default)(De.pathMethod,2);return ve.setIn(["requestData",Et[0],Et[1],"bodyInclusion",Y],Ie)}),(0,o.default)(_,oe.UPDATE_ACTIVE_EXAMPLES_MEMBER,function(ve,Pe){var De=Pe.payload,Ie=De.name,Y=De.contextType,Et=De.contextName,ft=(0,M.default)(De.pathMethod,2);return ve.setIn(["examples",ft[0],ft[1],Y,Et,"activeExample"],Ie)}),(0,o.default)(_,oe.UPDATE_REQUEST_CONTENT_TYPE,function(ve,Pe){var De=Pe.payload,Ie=De.value,Y=(0,M.default)(De.pathMethod,2);return ve.setIn(["requestData",Y[0],Y[1],"requestContentType"],Ie)}),(0,o.default)(_,oe.UPDATE_RESPONSE_CONTENT_TYPE,function(ve,Pe){var De=Pe.payload;return ve.setIn(["requestData",De.path,De.method,"responseContentType"],De.value)}),(0,o.default)(_,oe.UPDATE_SERVER_VARIABLE_VALUE,function(ve,Pe){var De=Pe.payload,Ie=De.server,Ae=De.namespace,Y=De.key;return ve.setIn(Ae?[Ae,"serverVariableValues",Ie,Y]:["serverVariableValues",Ie,Y],De.val)}),(0,o.default)(_,oe.SET_REQUEST_BODY_VALIDATE_ERROR,function(ve,Pe){var De=Pe.payload,Ie=De.path,Ae=De.method,Y=De.validationErrors,Et=[];if(Et.push("Required field is not provided"),Y.missingBodyValue)return ve.setIn(["requestData",Ie,Ae,"errors"],(0,re.fromJS)(Et));if(Y.missingRequiredKeys&&Y.missingRequiredKeys.length>0){var ft=Y.missingRequiredKeys;return ve.updateIn(["requestData",Ie,Ae,"bodyValue"],(0,re.fromJS)({}),function(xt){return(0,X.default)(ft).call(ft,function(Ht,yn){return Ht.setIn([yn,"errors"],(0,re.fromJS)(Et))},xt)})}return console.warn("unexpected result: SET_REQUEST_BODY_VALIDATE_ERROR"),ve}),(0,o.default)(_,oe.CLEAR_REQUEST_BODY_VALIDATE_ERROR,function(ve,Pe){var De=Pe.payload,Ie=De.path,Ae=De.method,Y=ve.getIn(["requestData",Ie,Ae,"bodyValue"]);if(!re.Map.isMap(Y))return ve.setIn(["requestData",Ie,Ae,"errors"],(0,re.fromJS)([]));var Et=(0,w.default)(Y).call(Y),ft=(0,l.default)(Et),xt=(0,N.default)(ft).call(ft,0);return xt?ve.updateIn(["requestData",Ie,Ae,"bodyValue"],(0,re.fromJS)({}),function(Ht){return(0,X.default)(xt).call(xt,function(yn,It){return yn.setIn([It,"errors"],(0,re.fromJS)([]))},Ht)}):ve}),(0,o.default)(_,oe.CLEAR_REQUEST_BODY_VALUE,function(ve,Pe){var Ie=(0,M.default)(Pe.payload.pathMethod,2),Ae=Ie[0],Y=Ie[1],Et=ve.getIn(["requestData",Ae,Y,"bodyValue"]);return Et?re.Map.isMap(Et)?ve.setIn(["requestData",Ae,Y,"bodyValue"],(0,re.Map)()):ve.setIn(["requestData",Ae,Y,"bodyValue"],""):ve}),_)},5065:(n,s,t)=>{t.r(s),t.d(s,{selectedServer:()=>Pe,requestBodyValue:()=>De,shouldRetainRequestBodyValue:()=>Ie,hasUserEditedBody:()=>Ae,requestBodyInclusionSetting:()=>Y,requestBodyErrors:()=>Et,activeExamplesMember:()=>ft,requestContentType:()=>xt,responseContentType:()=>Ht,serverVariableValue:()=>yn,serverVariables:()=>It,serverEffectiveValue:()=>In,validateBeforeExecute:()=>On,validateShallowRequired:()=>Yr});var o=t(2691),l=t(5171),_=t(2565),M=t(29),w=t(2740),N=t(8818),V=t(9725),X=t(7779),re=t(2458),oe=t(6298);function fe(Ir){return function(){for(var Hr=arguments.length,Wr=new Array(Hr),En=0;En<Hr;En++)Wr[En]=arguments[En];return function(Un){var Yn=Un.getSystem().specSelectors.specJson();return(0,X.isOAS3)(Yn)?Ir.apply(void 0,Wr):null}}}var ve,Pe=fe(function(Ir,Hr){return Ir.getIn(Hr?[Hr,"selectedServer"]:["selectedServer"])||""}),De=fe(function(Ir,Hr,Wr){return Ir.getIn(["requestData",Hr,Wr,"bodyValue"])||null}),Ie=fe(function(Ir,Hr,Wr){return Ir.getIn(["requestData",Hr,Wr,"retainBodyValue"])||!1}),Ae=function(Ir,Hr,Wr){return function(En){var Un=En.getSystem(),Yn=Un.oas3Selectors,ir=Un.specSelectors,An=ir.specJson();if((0,X.isOAS3)(An)){var Lr=!1,Wi=Yn.requestContentType(Hr,Wr),Mi=Yn.requestBodyValue(Hr,Wr);if(V.Map.isMap(Mi)&&(Mi=(0,oe.Pz)(Mi.mapEntries(function(jr){return V.Map.isMap(jr[1])?[jr[0],jr[1].get("value")]:jr}).toJS())),V.List.isList(Mi)&&(Mi=(0,oe.Pz)(Mi)),Wi){var Yi=(0,re.getDefaultRequestBodyValue)(ir.specResolvedSubtree(["paths",Hr,Wr,"requestBody"]),Wi,Yn.activeExamplesMember(Hr,Wr,"requestBody","requestBody"));Lr=!!Mi&&Mi!==Yi}return Lr}return null}},Y=fe(function(Ir,Hr,Wr){return Ir.getIn(["requestData",Hr,Wr,"bodyInclusion"])||(0,V.Map)()}),Et=fe(function(Ir,Hr,Wr){return Ir.getIn(["requestData",Hr,Wr,"errors"])||null}),ft=fe(function(Ir,Hr,Wr,En,Un){return Ir.getIn(["examples",Hr,Wr,En,Un,"activeExample"])||null}),xt=fe(function(Ir,Hr,Wr){return Ir.getIn(["requestData",Hr,Wr,"requestContentType"])||null}),Ht=fe(function(Ir,Hr,Wr){return Ir.getIn(["requestData",Hr,Wr,"responseContentType"])||null}),yn=fe(function(Ir,Hr,Wr){var En;if("string"!=typeof Hr){var Un=Hr.server,Yn=Hr.namespace;En=Yn?[Yn,"serverVariableValues",Un,Wr]:["serverVariableValues",Un,Wr]}else En=["serverVariableValues",Hr,Wr];return Ir.getIn(En)||null}),It=fe(function(Ir,Hr){var Wr;if("string"!=typeof Hr){var En=Hr.server,Un=Hr.namespace;Wr=Un?[Un,"serverVariableValues",En]:["serverVariableValues",En]}else Wr=["serverVariableValues",Hr];return Ir.getIn(Wr)||(0,V.OrderedMap)()}),In=fe(function(Ir,Hr){var Wr,En;if("string"!=typeof Hr){var Yn=Hr.namespace;En=Hr.server,Wr=Ir.getIn(Yn?[Yn,"serverVariableValues",En]:["serverVariableValues",En])}else Wr=Ir.getIn(["serverVariableValues",En=Hr]);Wr=Wr||(0,V.OrderedMap)();var ir=En;return(0,_.default)(Wr).call(Wr,function(An,Lr){ir=ir.replace(new RegExp("{".concat(Lr,"}"),"g"),An)}),ir}),On=(ve=function(Ir,Hr){return En=(En=Hr)||[],!!Ir.getIn((0,l.default)(Un=["requestData"]).call(Un,(0,o.default)(En),["bodyValue"]));var En,Un},function(){for(var Ir=arguments.length,Hr=new Array(Ir),Wr=0;Wr<Ir;Wr++)Hr[Wr]=arguments[Wr];return function(En){var Un,Yn,ir=En.getSystem().specSelectors.specJson(),An=(0,l.default)(Un=[]).call(Un,Hr)[1]||[];return!ir.getIn((0,l.default)(Yn=["paths"]).call(Yn,(0,o.default)(An),["requestBody","required"]))||ve.apply(void 0,Hr)}}),Yr=function(Ir,Hr){var Wr,En=Hr.oas3RequiredRequestBodyContentType,Un=Hr.oas3RequestContentType,Yn=Hr.oas3RequestBodyValue,ir=[];if(!V.Map.isMap(Yn))return ir;var An=[];return(0,M.default)(Wr=(0,w.default)(En.requestContentType)).call(Wr,function(Lr){if(Lr===Un){var Wi=En.requestContentType[Lr];(0,M.default)(Wi).call(Wi,function(Mi){(0,N.default)(An).call(An,Mi)<0&&An.push(Mi)})}}),(0,M.default)(An).call(An,function(Lr){Yn.getIn([Lr,"value"])||ir.push(Lr)}),ir}},1741:(n,s,t)=>{t.r(s),t.d(s,{servers:()=>X,isSwagger2:()=>re});var M,o=t(8639),l=t(9725),_=t(7779),w=function(oe){return oe||(0,l.Map)()},N=(0,o.createSelector)(w,function(oe){return oe.get("json",(0,l.Map)())}),V=(0,o.createSelector)(w,function(oe){return oe.get("resolved",(0,l.Map)())}),X=(M=(0,o.createSelector)(function(oe){var fe=V(oe);return fe.count()<1&&(fe=N(oe)),fe},function(oe){return oe.getIn(["servers"])||(0,l.Map)()}),function(){return function(oe){var fe=oe.getSystem().specSelectors.specJson();if((0,_.isOAS3)(fe)){for(var ve=arguments.length,Pe=new Array(ve>1?ve-1:0),De=1;De<ve;De++)Pe[De-1]=arguments[De];return M.apply(void 0,Pe)}return null}}),re=function(oe,fe){return function(){var ve=fe.getSystem().specSelectors.specJson();return(0,_.isSwagger2)(ve)}}},2044:(n,s,t)=>{t.r(s),t.d(s,{definitions:()=>fe,hasHost:()=>ve,securityDefinitions:()=>Pe,host:()=>De,basePath:()=>Ie,consumes:()=>Ae,produces:()=>Y,schemes:()=>Et,servers:()=>ft,isOAS3:()=>xt,isSwagger2:()=>Ht});var o=t(8639),l=t(3881),_=t(9725),M=t(7779);function w(yn){return function(It,In){return function(){var On=In.getSystem().specSelectors.specJson();return(0,M.isOAS3)(On)?yn.apply(void 0,arguments):It.apply(void 0,arguments)}}}var N=function(yn){return yn||(0,_.Map)()},V=w((0,o.createSelector)(function(){return null})),X=(0,o.createSelector)(N,function(yn){return yn.get("json",(0,_.Map)())}),re=(0,o.createSelector)(N,function(yn){return yn.get("resolved",(0,_.Map)())}),oe=function(yn){var It=re(yn);return It.count()<1&&(It=X(yn)),It},fe=w((0,o.createSelector)(oe,function(yn){var It=yn.getIn(["components","schemas"]);return _.Map.isMap(It)?It:(0,_.Map)()})),ve=w(function(yn){return oe(yn).hasIn(["servers",0])}),Pe=w((0,o.createSelector)(l.specJsonWithResolvedSubtrees,function(yn){return yn.getIn(["components","securitySchemes"])||null})),De=V,Ie=V,Ae=V,Y=V,Et=V,ft=w((0,o.createSelector)(oe,function(yn){return yn.getIn(["servers"])||(0,_.Map)()})),xt=function(yn,It){return function(){var In=It.getSystem().specSelectors.specJson();return(0,M.isOAS3)(_.Map.isMap(In)?In:(0,_.Map)())}},Ht=function(yn,It){return function(){var In=It.getSystem().specSelectors.specJson();return(0,M.isSwagger2)(_.Map.isMap(In)?In:(0,_.Map)())}}},356:(n,s,t)=>{t.r(s),t.d(s,{default:()=>w});var o=t(302),l=t(810),_=t(7779),M=["Ori"];const w=(0,_.OAS3ComponentWrapFactory)(function(N){var V=N.Ori,X=(0,o.default)(N,M),re=X.schema,oe=X.getComponent,fe=X.errSelectors,ve=X.authorized,Pe=X.onAuthChange,De=X.name,Ie=oe("HttpAuth");return"http"===re.get("type")?l.default.createElement(Ie,{key:De,schema:re,name:De,errSelectors:fe,authorized:ve,getComponent:oe,onChange:Pe}):l.default.createElement(V,X)})},7761:(n,s,t)=>{t.r(s),t.d(s,{default:()=>V});var o=t(2460),l=t(356),_=t(9487),M=t(58),w=t(3499),N=t(287);const V={Markdown:o.default,AuthItem:l.default,JsonSchema_string:N.default,VersionStamp:_.default,model:w.default,onlineValidatorBadge:M.default}},287:(n,s,t)=>{t.r(s),t.d(s,{default:()=>w});var o=t(302),l=t(810),_=t(7779),M=["Ori"];const w=(0,_.OAS3ComponentWrapFactory)(function(N){var V=N.Ori,X=(0,o.default)(N,M),re=X.schema,oe=X.getComponent,fe=X.errors,ve=X.onChange,Pe=re&&re.get?re.get("format"):null,De=re&&re.get?re.get("type"):null,Ie=oe("Input");return De&&"string"===De&&Pe&&("binary"===Pe||"base64"===Pe)?l.default.createElement(Ie,{type:"file",className:fe.length?"invalid":"",title:fe.length?fe:"",onChange:function(Ae){ve(Ae.target.files[0])},disabled:V.isDisabled}):l.default.createElement(V,X)})},2460:(n,s,t)=>{t.r(s),t.d(s,{Markdown:()=>X,default:()=>re});var o=t(5942),l=t(810),_=(t(5053),t(8096)),M=t(3952),w=t(7779),N=t(5466),V=new M.Remarkable("commonmark");V.block.ruler.enable(["table"]),V.set({linkTarget:"_blank"});var X=function(oe){var fe=oe.source,ve=oe.className,Pe=void 0===ve?"":ve;if("string"!=typeof fe)return null;if(fe){var Ie,Ae=(0,oe.getConfigs)().useUnsafeMarkdown,Y=V.render(fe),Et=(0,N.s)(Y,{useUnsafeMarkdown:Ae});return"string"==typeof Et&&(Ie=(0,o.default)(Et).call(Et)),l.default.createElement("div",{dangerouslySetInnerHTML:{__html:Ie},className:(0,_.default)(Pe,"renderedMarkdown")})}return null};X.defaultProps={getConfigs:function(){return{useUnsafeMarkdown:!1}}};const re=(0,w.OAS3ComponentWrapFactory)(X)},3499:(n,s,t)=>{t.r(s),t.d(s,{default:()=>oe});var o=t(863),l=t(7344),_=t(8656),M=t(9972),w=t(5416),N=t(810),V=(t(5053),t(7779)),X=t(1543),re=function(fe){(0,M.default)(Pe,fe);var ve=(0,w.default)(Pe);function Pe(){return(0,l.default)(this,Pe),ve.apply(this,arguments)}return(0,_.default)(Pe,[{key:"render",value:function(){var De=this.props,Ie=De.getConfigs,Ae=["model-box"],Y=null;return!0===De.schema.get("deprecated")&&(Ae.push("deprecated"),Y=N.default.createElement("span",{className:"model-deprecated-warning"},"Deprecated:")),N.default.createElement("div",{className:Ae.join(" ")},Y,N.default.createElement(X.Z,(0,o.default)({},this.props,{getConfigs:Ie,depth:1,expandDepth:this.props.expandDepth||0})))}}]),Pe}(N.Component);const oe=(0,V.OAS3ComponentWrapFactory)(re)},58:(n,s,t)=>{t.r(s),t.d(s,{default:()=>_});var o=t(7779),l=t(5623);const _=(0,o.OAS3ComponentWrapFactory)(l.Z)},9487:(n,s,t)=>{t.r(s),t.d(s,{default:()=>l});var o=t(810);const l=(0,t(7779).OAS3ComponentWrapFactory)(function(_){return o.default.createElement("span",null,o.default.createElement(_.Ori,_),o.default.createElement("small",{className:"version-stamp"},o.default.createElement("pre",{className:"version"},"OAS3")))})},8560:(n,s,t)=>{t.r(s),t.d(s,{default:()=>_});var o=t(6235),l=!1;function _(){return{statePlugins:{spec:{wrapActions:{updateSpec:function(M){return function(){return l=!0,M.apply(void 0,arguments)}},updateJsonSpec:function(M,w){return function(){var N=w.getConfigs().onComplete;return l&&"function"==typeof N&&((0,o.default)(N,0),l=!1),M.apply(void 0,arguments)}}}}}}}},4624:(n,s,t)=>{t.r(s),t.d(s,{requestSnippetGenerator_curl_bash:()=>Ht,requestSnippetGenerator_curl_cmd:()=>yn,requestSnippetGenerator_curl_powershell:()=>xt});var o=t(2691),l=t(9334),_=t(3248),M=t(8818),w=t(5942),N=t(5171),V=t(313),X=t(2565);const re=(t.d(In={},{default:()=>br()}),In);var In,oe=t(2954),fe=t(2372),ve=t(7504),Pe=t(9725),De=function(It){var In;return(0,M.default)(It).call(It,"_**[]")<0?It:(0,w.default)(In=It.split("_**[]")[0]).call(In)},Ie=function(It){return"-d "===It||/^[_\/-]/g.test(It)?It:"'"+It.replace(/'/g,"'\\''")+"'"},Ae=function(It){return"-d "===(It=It.replace(/\^/g,"^^").replace(/\\"/g,'\\\\"').replace(/"/g,'""').replace(/\n/g,"^\n"))?It.replace(/-d /g,"-d ^\n"):/^[_\/-]/g.test(It)?It:'"'+It+'"'},Y=function(It){return"-d "===It?It:/\n/.test(It)?'@"\n'+It.replace(/"/g,'\\"').replace(/`/g,"``").replace(/\$/,"`$")+'\n"@':/^[_\/-]/g.test(It)?It:"'"+It.replace(/"/g,'""').replace(/'/g,"''")+"'"};function Et(It){var In,On=[],Yr=(0,_.default)(It.get("body").entrySeq());try{for(Yr.s();!(In=Yr.n()).done;){var Ir,Hr,Wr,En=(0,l.default)(In.value,2),Yn=En[1],ir=De(En[0]);On.push(Yn instanceof ve.Z.File?(0,N.default)(Ir=(0,N.default)(Hr='  "'.concat(ir,'": {\n    "name": "')).call(Hr,Yn.name,'"')).call(Ir,Yn.type?',\n    "type": "'.concat(Yn.type,'"'):"","\n  }"):(0,N.default)(Wr='  "'.concat(ir,'": ')).call(Wr,(0,V.default)(Yn,null,2).replace(/(\r\n|\r|\n)/g,"\n  ")))}}catch(An){Yr.e(An)}finally{Yr.f()}return"{\n".concat(On.join(",\n"),"\n}")}var ft=function(It,In,On){var Yr=arguments.length>3&&void 0!==arguments[3]?arguments[3]:"",Ir=!1,Hr="",Wr=function(){for(var bt=arguments.length,Vn=new Array(bt),Mr=0;Mr<bt;Mr++)Vn[Mr]=arguments[Mr];return Hr+=" "+(0,X.default)(Vn).call(Vn,In).join(" ")},En=function(){for(var bt=arguments.length,Vn=new Array(bt),Mr=0;Mr<bt;Mr++)Vn[Mr]=arguments[Mr];return Hr+=(0,X.default)(Vn).call(Vn,In).join(" ")},Un=function(){return Hr+=" ".concat(On)},Yn=function(){var bt,Vn=arguments.length>0&&void 0!==arguments[0]?arguments[0]:1;return Hr+=(0,re.default)(bt="  ").call(bt,Vn)},ir=It.get("headers");if(Hr+="curl"+Yr,It.has("curlOptions")&&Wr.apply(void 0,(0,o.default)(It.get("curlOptions"))),Wr("-X",It.get("method")),Un(),Yn(),En("".concat(It.get("url"))),ir&&ir.size){var An,Lr,Wi=(0,_.default)((0,oe.default)(An=It.get("headers")).call(An));try{for(Wi.s();!(Lr=Wi.n()).done;){var Mi,Yi=Lr.value;Un(),Yn();var jr=(0,l.default)(Yi,2),Nn=jr[0],fn=jr[1];En("-H",(0,N.default)(Mi="".concat(Nn,": ")).call(Mi,fn)),Ir=Ir||/^content-type$/i.test(Nn)&&/^multipart\/form-data$/i.test(fn)}}catch(bt){Wi.e(bt)}finally{Wi.f()}}var Vr,xi=It.get("body");if(xi)if(Ir&&(0,fe.default)(Vr=["POST","PUT","PATCH"]).call(Vr,It.get("method"))){var Ji,Ho=(0,_.default)(xi.entrySeq());try{for(Ho.s();!(Ji=Ho.n()).done;){var Ao,Vs,Qs,Ri=(0,l.default)(Ji.value,2),uo=Ri[0],bo=Ri[1],Ye=De(uo);Un(),Yn(),En("-F"),Wr(bo instanceof ve.Z.File?(0,N.default)(Ao=(0,N.default)(Vs="".concat(Ye,"=@")).call(Vs,bo.name)).call(Ao,bo.type?";type=".concat(bo.type):""):(0,N.default)(Qs="".concat(Ye,"=")).call(Qs,bo))}}catch(bt){Ho.e(bt)}finally{Ho.f()}}else if(xi instanceof ve.Z.File)Un(),Yn(),En("--data-binary '@".concat(xi.name,"'"));else{Un(),Yn(),En("-d ");var Ct=xi;Pe.Map.isMap(Ct)?En(Et(It)):("string"!=typeof Ct&&(Ct=(0,V.default)(Ct)),En(Ct))}else xi||"POST"!==It.get("method")||(Un(),Yn(),En("-d ''"));return Hr},xt=function(It){return ft(It,Y,"`\n",".exe")},Ht=function(It){return ft(It,Ie,"\\\n")},yn=function(It){return ft(It,Ae,"^\n")}},6575:(n,s,t)=>{t.r(s),t.d(s,{default:()=>M});var o=t(4624),l=t(4669),_=t(4206);const M=function(){return{components:{RequestSnippets:_.default},fn:o,statePlugins:{requestSnippets:{selectors:l}}}}},4206:(n,s,t)=>{t.r(s),t.d(s,{default:()=>Pe});var o=t(9334),l=t(6145),_=t(8898),M=t(29),w=t(2565),N=t(810),V=(t(5053),t(9908)),X=t(7068),re=t(9874),oe=t(471),fe={cursor:"pointer",lineHeight:1,display:"inline-flex",backgroundColor:"rgb(250, 250, 250)",paddingBottom:"0",paddingTop:"0",border:"1px solid rgb(51, 51, 51)",borderRadius:"4px 4px 0 0",boxShadow:"none",borderBottom:"none"},ve={cursor:"pointer",lineHeight:1,display:"inline-flex",backgroundColor:"rgb(51, 51, 51)",boxShadow:"none",border:"1px solid rgb(51, 51, 51)",paddingBottom:"0",paddingTop:"0",borderRadius:"4px 4px 0 0",marginTop:"-5px",marginRight:"-5px",marginLeft:"-5px",zIndex:"9999",borderBottom:"none"};const Pe=function(De){var Ie,Ae,Y=De.request,Et=De.requestSnippetsSelectors,ft=De.getConfigs,xt=(0,X.default)(ft)?ft():null,Ht=!1!==(0,V.default)(xt,"syntaxHighlight")&&(0,V.default)(xt,"syntaxHighlight.activated",!0),yn=(0,N.useRef)(null),It=(0,N.useState)(null===(Ie=Et.getSnippetGenerators())||void 0===Ie?void 0:Ie.keySeq().first()),In=(0,o.default)(It,2),On=In[0],Yr=In[1],Ir=(0,N.useState)(null==Et?void 0:Et.getDefaultExpanded()),Hr=(0,o.default)(Ir,2),Wr=Hr[0],En=Hr[1];(0,N.useEffect)(function(){},[]),(0,N.useEffect)(function(){var Yi,jr=(0,l.default)(Yi=(0,_.default)(yn.current.childNodes)).call(Yi,function(Nn){var fn;return!!Nn.nodeType&&(null===(fn=Nn.classList)||void 0===fn?void 0:fn.contains("curl-command"))});return(0,M.default)(jr).call(jr,function(Nn){return Nn.addEventListener("mousewheel",Wi,{passive:!1})}),function(){(0,M.default)(jr).call(jr,function(Nn){return Nn.removeEventListener("mousewheel",Wi)})}},[Y]);var Un=Et.getSnippetGenerators(),Yn=Un.get(On),ir=Yn.get("fn")(Y),An=function(){En(!Wr)},Lr=function(Yi){return Yi===On?ve:fe},Wi=function(Yi){var jr=Yi.target,Nn=Yi.deltaY,fn=jr.scrollHeight,Vr=jr.offsetHeight,xi=jr.scrollTop;fn>Vr&&(0===xi&&Nn<0||Vr+xi>=fn&&Nn>0)&&Yi.preventDefault()},Mi=Ht?N.default.createElement(oe.d3,{language:Yn.get("syntax"),className:"curl microlight",style:(0,oe.C2)((0,V.default)(xt,"syntaxHighlight.theme"))},ir):N.default.createElement("textarea",{readOnly:!0,className:"curl",value:ir});return N.default.createElement("div",{className:"request-snippets",ref:yn},N.default.createElement("div",{style:{width:"100%",display:"flex",justifyContent:"flex-start",alignItems:"center",marginBottom:"15px"}},N.default.createElement("h4",{onClick:function(){return An()},style:{cursor:"pointer"}},"Snippets"),N.default.createElement("button",{onClick:function(){return An()},style:{border:"none",background:"none"},title:Wr?"Collapse operation":"Expand operation"},N.default.createElement("svg",{className:"arrow",width:"10",height:"10"},N.default.createElement("use",{href:Wr?"#large-arrow-down":"#large-arrow",xlinkHref:Wr?"#large-arrow-down":"#large-arrow"})))),Wr&&N.default.createElement("div",{className:"curl-command"},N.default.createElement("div",{style:{paddingLeft:"15px",paddingRight:"10px",width:"100%",display:"flex"}},(0,w.default)(Ae=Un.entrySeq()).call(Ae,function(Yi){var jr=(0,o.default)(Yi,2),Nn=jr[0],fn=jr[1];return N.default.createElement("div",{style:Lr(Nn),className:"btn",key:Nn,onClick:function(){var Vr;On!==(Vr=Nn)&&Yr(Vr)}},N.default.createElement("h4",{style:Nn===On?{color:"white"}:{}},fn.get("title")))})),N.default.createElement("div",{className:"copy-to-clipboard"},N.default.createElement(re.CopyToClipboard,{text:ir},N.default.createElement("button",null))),N.default.createElement("div",null,Mi)))}},4669:(n,s,t)=>{t.r(s),t.d(s,{getGenerators:()=>V,getSnippetGenerators:()=>X,getActiveLanguage:()=>re,getDefaultExpanded:()=>oe});var o=t(6145),l=t(2372),_=t(2565),M=t(8639),w=t(9725),N=function(fe){return fe||(0,w.Map)()},V=(0,M.createSelector)(N,function(fe){var ve=fe.get("languages"),Pe=fe.get("generators",(0,w.Map)());return!ve||ve.isEmpty()?Pe:(0,o.default)(Pe).call(Pe,function(De,Ie){return(0,l.default)(ve).call(ve,Ie)})}),X=function(fe){return function(ve){var Pe,De,Ie=ve.fn;return(0,o.default)(Pe=(0,_.default)(De=V(fe)).call(De,function(Ae,Y){var Et=Ie["requestSnippetGenerator_".concat(Y)];return"function"!=typeof Et?null:Ae.set("fn",Et)})).call(Pe,function(Ae){return Ae})}},re=(0,M.createSelector)(N,function(fe){return fe.get("activeLanguage")}),oe=(0,M.createSelector)(N,function(fe){return fe.get("defaultExpanded")})},6195:(n,s,t)=>{t.r(s),t.d(s,{ErrorBoundary:()=>re,default:()=>oe});var o=t(7344),l=t(8656),_=t(9972),M=t(5416),w=t(5171),N=(t(5053),t(810)),V=t(6189),X=t(9403),re=function(fe){(0,_.default)(Pe,fe);var ve=(0,M.default)(Pe);function Pe(){var De,Ie;(0,o.default)(this,Pe);for(var Ae=arguments.length,Y=new Array(Ae),Et=0;Et<Ae;Et++)Y[Et]=arguments[Et];return(Ie=ve.call.apply(ve,(0,w.default)(De=[this]).call(De,Y))).state={hasError:!1,error:null},Ie}return(0,l.default)(Pe,[{key:"componentDidCatch",value:function(De,Ie){this.props.fn.componentDidCatch(De,Ie)}},{key:"render",value:function(){var De=this.props,Ae=De.targetName,Y=De.children;if(this.state.hasError){var Et=(0,De.getComponent)("Fallback");return N.default.createElement(Et,{name:Ae})}return Y}}],[{key:"getDerivedStateFromError",value:function(De){return{hasError:!0,error:De}}}]),Pe}(N.Component);re.defaultProps={targetName:"this component",getComponent:function(){return X.default},fn:{componentDidCatch:V.componentDidCatch},children:null};const oe=re},9403:(n,s,t)=>{t.r(s),t.d(s,{default:()=>l});var o=t(810);t(5053);const l=function(_){var M=_.name;return o.default.createElement("div",{className:"fallback"},"\u{1f631} ",o.default.createElement("i",null,"Could not render ","t"===M?"this component":M,", see the console."))}},6189:(n,s,t)=>{t.r(s),t.d(s,{componentDidCatch:()=>V,withErrorBoundary:()=>X});var o=t(863),l=t(7344),_=t(8656),M=t(9972),w=t(5416),N=t(810),V=console.error,X=function(re){return function(oe){var fe,ve=re(),Pe=ve.getComponent,De=ve.fn,Ie=Pe("ErrorBoundary"),Ae=De.getDisplayName(oe),Y=function(Et){(0,M.default)(xt,Et);var ft=(0,w.default)(xt);function xt(){return(0,l.default)(this,xt),ft.apply(this,arguments)}return(0,_.default)(xt,[{key:"render",value:function(){return N.default.createElement(Ie,{targetName:Ae,getComponent:Pe,fn:De},N.default.createElement(oe,(0,o.default)({},this.props,this.context)))}}]),xt}(N.Component);return Y.displayName="WithErrorBoundary(".concat(Ae,")"),(fe=oe).prototype&&fe.prototype.isReactComponent&&(Y.prototype.mapStateToProps=oe.prototype.mapStateToProps),Y}}},8102:(n,s,t)=>{t.r(s),t.d(s,{default:()=>X});var o=t(2691),l=t(5171);const _=(t.d(oe={},{default:()=>Vi()}),oe),M=(re=>{var oe={};return t.d(oe,re),oe})({default:()=>ls()});var oe,w=t(6195),N=t(9403),V=t(6189);const X=function(){var re=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},oe=re.componentList,fe=void 0===oe?[]:oe,ve=re.fullOverride,Pe=void 0!==ve&&ve;return function(De){var Ie,Ae,Y=De.getSystem,Et=Pe?fe:(0,l.default)(Ie=[]).call(Ie,["App","BaseLayout","VersionPragmaFilter","InfoContainer","ServersContainer","SchemesContainer","AuthorizeBtnContainer","FilterContainer","Operations","OperationContainer","parameters","responses","OperationServers","Models","ModelWrapper"],(0,o.default)(fe)),ft=(0,M.default)(Et,(0,_.default)(Ae=Array(Et.length)).call(Ae,function(xt,Ht){return Ht.fn.withErrorBoundary(xt)}));return{fn:{componentDidCatch:V.componentDidCatch,withErrorBoundary:(0,V.withErrorBoundary)(Y)},components:{ErrorBoundary:w.default,Fallback:N.default},wrapComponents:ft}}}},2473:(n,s,t)=>{t.r(s),t.d(s,{createXMLExample:()=>Hr,inferSchema:()=>Ir,memoizedCreateXMLExample:()=>Un,memoizedSampleFromSchema:()=>Yn,sampleFromSchema:()=>Wr,sampleFromSchemaGeneric:()=>Yr});var o=t(1581),l=t(5171),_=t(8818),M=t(29),w=t(4163),N=t(2372),V=t(9963),X=t(8136),re=t(1778),oe=t(2565),fe=t(313),ve=t(3479),Pe=t.n(ve);const De=(t.d(An={},{default:()=>_o()}),An),Ie=(ir=>{var An={};return t.d(An,ir),An})({default:()=>ql()});var An,Ae=t(6298),Y=t(8287),Et={string:function(ir){return ir.pattern?function(An){try{return new De.default(An).gen()}catch(Lr){return"string"}}(ir.pattern):"string"},string_email:function(){return"user@example.com"},"string_date-time":function(){return(new Date).toISOString()},string_date:function(){return(new Date).toISOString().substring(0,10)},string_uuid:function(){return"3fa85f64-5717-4562-b3fc-2c963f66afa6"},string_hostname:function(){return"example.com"},string_ipv4:function(){return"198.51.100.42"},string_ipv6:function(){return"2001:0db8:5b96:0000:0000:426f:8e17:642a"},number:function(){return 0},number_float:function(){return 0},integer:function(){return 0},boolean:function(ir){return"boolean"!=typeof ir.default||ir.default}},ft=function(ir){var An,Lr=ir=(0,Ae.mz)(ir),Wi=Lr.type,Mi=Lr.format,Yi=Et[(0,l.default)(An="".concat(Wi,"_")).call(An,Mi)]||Et[Wi];return(0,Ae.Wl)(Yi)?Yi(ir):"Unknown Type: "+ir.type},xt=function(ir){return(0,Ae.XV)(ir,"$$ref",function(An){return"string"==typeof An&&(0,_.default)(An).call(An,"#")>-1})},Ht=["maxProperties","minProperties"],yn=["minItems","maxItems"],It=["minimum","maximum","exclusiveMinimum","exclusiveMaximum"],In=["minLength","maxLength"],On=function ir(An,Lr){var Wi,Mi,Yi,jr=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{},Nn=function(Ji){void 0===Lr[Ji]&&void 0!==An[Ji]&&(Lr[Ji]=An[Ji])};if((0,M.default)(Wi=(0,l.default)(Mi=["example","default","enum","xml","type"]).call(Mi,Ht,yn,It,In)).call(Wi,function(Ji){return Nn(Ji)}),void 0!==An.required&&(0,w.default)(An.required)&&(void 0!==Lr.required&&Lr.required.length||(Lr.required=[]),(0,M.default)(Yi=An.required).call(Yi,function(Ji){var Ho;(0,N.default)(Ho=Lr.required).call(Ho,Ji)||Lr.required.push(Ji)})),An.properties){Lr.properties||(Lr.properties={});var fn=(0,Ae.mz)(An.properties);for(var Vr in fn){var xi;Object.prototype.hasOwnProperty.call(fn,Vr)&&(!fn[Vr]||!fn[Vr].deprecated)&&(!fn[Vr]||!fn[Vr].readOnly||jr.includeReadOnly)&&(!fn[Vr]||!fn[Vr].writeOnly||jr.includeWriteOnly)&&(Lr.properties[Vr]||(Lr.properties[Vr]=fn[Vr],!An.required&&(0,w.default)(An.required)&&-1!==(0,_.default)(xi=An.required).call(xi,Vr)&&(Lr.required?Lr.required.push(Vr):Lr.required=[Vr])))}}return An.items&&(Lr.items||(Lr.items={}),Lr.items=ir(An.items,Lr.items,jr)),Lr},Yr=function ir(An){var Lr=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},Wi=arguments.length>2&&void 0!==arguments[2]?arguments[2]:void 0,Mi=arguments.length>3&&void 0!==arguments[3]&&arguments[3];An&&(0,Ae.Wl)(An.toJS)&&(An=An.toJS());var Yi=void 0!==Wi||An&&void 0!==An.example||An&&void 0!==An.default,jr=!Yi&&An&&An.oneOf&&An.oneOf.length>0,Nn=!Yi&&An&&An.anyOf&&An.anyOf.length>0;if(!Yi&&(jr||Nn)){var fn=(0,Ae.mz)(jr?An.oneOf[0]:An.anyOf[0]);if(On(fn,An,Lr),!An.xml&&fn.xml&&(An.xml=fn.xml),void 0!==An.example&&void 0!==fn.example)Yi=!0;else if(fn.properties){An.properties||(An.properties={});var Vr=(0,Ae.mz)(fn.properties);for(var xi in Vr){var Ji;Object.prototype.hasOwnProperty.call(Vr,xi)&&(!Vr[xi]||!Vr[xi].deprecated)&&(!Vr[xi]||!Vr[xi].readOnly||Lr.includeReadOnly)&&(!Vr[xi]||!Vr[xi].writeOnly||Lr.includeWriteOnly)&&(An.properties[xi]||(An.properties[xi]=Vr[xi],!fn.required&&(0,w.default)(fn.required)&&-1!==(0,_.default)(Ji=fn.required).call(Ji,xi)&&(An.required?An.required.push(xi):An.required=[xi])))}}}var Ho,Ao={},Vs=An||{},Qs=Vs.xml,Ri=Vs.type,uo=Vs.example,bo=Vs.properties,Ye=Vs.additionalProperties,Ct=Vs.items,bt=Lr.includeReadOnly,Vn=Lr.includeWriteOnly,Mr=Qs=Qs||{},kr=Mr.name,Ni=Mr.prefix,Zs=Mr.namespace,Vo={};if(Mi&&(Ho=(Ni?Ni+":":"")+(kr=kr||"notagname"),Zs)){var il=Ni?"xmlns:"+Ni:"xmlns";Ao[il]=Zs}Mi&&(Vo[Ho]=[]);var _l=function(Gi){return(0,V.default)(Gi).call(Gi,function(ws){return Object.prototype.hasOwnProperty.call(An,ws)})};An&&!Ri&&(bo||Ye||_l(Ht)?Ri="object":Ct||_l(yn)?Ri="array":_l(It)?(Ri="number",An.type="number"):Yi||An.enum||(Ri="string",An.type="string"));var zl,Wu,Yf=function(Gi){var ws,ss,eu,El,dl;if(null!==(null===(ws=An)||void 0===ws?void 0:ws.maxItems)&&void 0!==(null===(ss=An)||void 0===ss?void 0:ss.maxItems)&&(Gi=(0,X.default)(Gi).call(Gi,0,null===(dl=An)||void 0===dl?void 0:dl.maxItems)),null!==(null===(eu=An)||void 0===eu?void 0:eu.minItems)&&void 0!==(null===(El=An)||void 0===El?void 0:El.minItems))for(var Ha=0;Gi.length<(null===(Ti=An)||void 0===Ti?void 0:Ti.minItems);){var Ti;Gi.push(Gi[Ha++%Gi.length])}return Gi},xl=(0,Ae.mz)(bo),Zc=0,gp=function(){return An&&null!=An.maxProperties&&Zc>=An.maxProperties},Bh=function(){if(!An||!An.required)return 0;var Gi,ws,ss=0;return Mi?(0,M.default)(Gi=An.required).call(Gi,function(eu){return ss+=void 0===Vo[eu]?0:1}):(0,M.default)(ws=An.required).call(ws,function(eu){var El;return ss+=void 0===(null===(El=Vo[Ho])||void 0===El?void 0:(0,re.default)(El).call(El,function(dl){return void 0!==dl[eu]}))?0:1}),An.required.length-ss},sh=function(Gi){var ws;return!(An&&An.required&&An.required.length&&(0,N.default)(ws=An.required).call(ws,Gi))},Uh=function(Gi){return!An||null==An.maxProperties||!gp()&&(!sh(Gi)||An.maxProperties-Zc-Bh()>0)};if(zl=Mi?function(Gi){var ws=arguments.length>1&&void 0!==arguments[1]?arguments[1]:void 0;if(An&&xl[Gi]){if(xl[Gi].xml=xl[Gi].xml||{},xl[Gi].xml.attribute){var ss=(0,w.default)(xl[Gi].enum)?xl[Gi].enum[0]:void 0,eu=xl[Gi].example,El=xl[Gi].default;return void(Ao[xl[Gi].xml.name||Gi]=void 0!==eu?eu:void 0!==El?El:void 0!==ss?ss:ft(xl[Gi]))}xl[Gi].xml.name=xl[Gi].xml.name||Gi}else xl[Gi]||!1===Ye||(xl[Gi]={xml:{name:Gi}});var dl,Ha=ir(An&&xl[Gi]||void 0,Lr,ws,Mi);Uh(Gi)&&(Zc++,(0,w.default)(Ha)?Vo[Ho]=(0,l.default)(dl=Vo[Ho]).call(dl,Ha):Vo[Ho].push(Ha))}:function(Gi,ws){Uh(Gi)&&(Vo[Gi]=ir(xl[Gi],Lr,ws,Mi),Zc++)},Yi){var Vl;if(Vl=xt(void 0!==Wi?Wi:void 0!==uo?uo:An.default),!Mi){if("number"==typeof Vl&&"string"===Ri)return"".concat(Vl);if("string"!=typeof Vl||"string"===Ri)return Vl;try{return JSON.parse(Vl)}catch(Gi){return Vl}}if(An||(Ri=(0,w.default)(Vl)?"array":(0,o.default)(Vl)),"array"===Ri){if(!(0,w.default)(Vl)){if("string"==typeof Vl)return Vl;Vl=[Vl]}var Bc=An?An.items:void 0;Bc&&(Bc.xml=Bc.xml||Qs||{},Bc.xml.name=Bc.xml.name||Qs.name);var Lp=(0,oe.default)(Vl).call(Vl,function(Gi){return ir(Bc,Lr,Gi,Mi)});return Lp=Yf(Lp),Qs.wrapped?(Vo[Ho]=Lp,(0,Ie.default)(Ao)||Vo[Ho].push({_attr:Ao})):Vo=Lp,Vo}if("object"===Ri){if("string"==typeof Vl)return Vl;for(var ji in Vl)Object.prototype.hasOwnProperty.call(Vl,ji)&&(An&&xl[ji]&&xl[ji].readOnly&&!bt||An&&xl[ji]&&xl[ji].writeOnly&&!Vn||(An&&xl[ji]&&xl[ji].xml&&xl[ji].xml.attribute?Ao[xl[ji].xml.name||ji]=Vl[ji]:zl(ji,Vl[ji])));return(0,Ie.default)(Ao)||Vo[Ho].push({_attr:Ao}),Vo}return Vo[Ho]=(0,Ie.default)(Ao)?Vl:[{_attr:Ao},Vl],Vo}if("object"===Ri){for(var lr in xl)Object.prototype.hasOwnProperty.call(xl,lr)&&(xl[lr]&&xl[lr].deprecated||xl[lr]&&xl[lr].readOnly&&!bt||xl[lr]&&xl[lr].writeOnly&&!Vn||zl(lr));if(Mi&&Ao&&Vo[Ho].push({_attr:Ao}),gp())return Vo;if(!0===Ye)Mi?Vo[Ho].push({additionalProp:"Anything can be here"}):Vo.additionalProp1={},Zc++;else if(Ye){var yi=(0,Ae.mz)(Ye),qi=ir(yi,Lr,void 0,Mi);if(Mi&&yi.xml&&yi.xml.name&&"notagname"!==yi.xml.name)Vo[Ho].push(qi);else for(var Po=null!=An.minProperties&&Zc<An.minProperties?An.minProperties-Zc:3,qo=1;qo<=Po;qo++){if(gp())return Vo;if(Mi){var os={};os["additionalProp"+qo]=qi.notagname,Vo[Ho].push(os)}else Vo["additionalProp"+qo]=qi;Zc++}}return Vo}if("array"===Ri){if(!Ct)return;var fs,_a,el;if(Mi&&(Ct.xml=Ct.xml||(null===(_a=An)||void 0===_a?void 0:_a.xml)||{},Ct.xml.name=Ct.xml.name||Qs.name),(0,w.default)(Ct.anyOf))fs=(0,oe.default)(el=Ct.anyOf).call(el,function(Gi){return ir(On(Ct,Gi,Lr),Lr,void 0,Mi)});else if((0,w.default)(Ct.oneOf)){var gu;fs=(0,oe.default)(gu=Ct.oneOf).call(gu,function(Gi){return ir(On(Ct,Gi,Lr),Lr,void 0,Mi)})}else{if(!(!Mi||Mi&&Qs.wrapped))return ir(Ct,Lr,void 0,Mi);fs=[ir(Ct,Lr,void 0,Mi)]}return fs=Yf(fs),Mi&&Qs.wrapped?(Vo[Ho]=fs,(0,Ie.default)(Ao)||Vo[Ho].push({_attr:Ao}),Vo):fs}if(An&&(0,w.default)(An.enum))Wu=(0,Ae.AF)(An.enum)[0];else{if(!An)return;if("number"==typeof(Wu=ft(An))){var tr=An.minimum;null!=tr&&(An.exclusiveMinimum&&tr++,Wu=tr);var ki=An.maximum;null!=ki&&(An.exclusiveMaximum&&ki--,Wu=ki)}if("string"==typeof Wu&&(null!=An.maxLength&&(Wu=(0,X.default)(Wu).call(Wu,0,An.maxLength)),null!=An.minLength))for(var us=0;Wu.length<An.minLength;)Wu+=Wu[us++%Wu.length]}if("file"!==Ri)return Mi?(Vo[Ho]=(0,Ie.default)(Ao)?Wu:[{_attr:Ao},Wu],Vo):Wu},Ir=function(ir){return ir.schema&&(ir=ir.schema),ir.properties&&(ir.type="object"),ir},Hr=function(ir,An,Lr){var Wi=Yr(ir,An,Lr,!0);if(Wi)return"string"==typeof Wi?Wi:Pe()(Wi,{declaration:!0,indent:"\t"})},Wr=function(ir,An,Lr){return Yr(ir,An,Lr,!1)},En=function(ir,An,Lr){return[ir,(0,fe.default)(An),(0,fe.default)(Lr)]},Un=(0,Y.Z)(Hr,En),Yn=(0,Y.Z)(Wr,En)},8883:(n,s,t)=>{t.r(s),t.d(s,{default:()=>l});var o=t(2473);function l(){return{fn:o}}},1737:(n,s,t)=>{t.r(s),t.d(s,{CLEAR_REQUEST:()=>fn,CLEAR_RESPONSE:()=>Nn,CLEAR_VALIDATE_PARAMS:()=>Vr,LOG_REQUEST:()=>jr,SET_MUTATED_REQUEST:()=>Yi,SET_REQUEST:()=>Mi,SET_RESPONSE:()=>Wi,SET_SCHEME:()=>Ao,UPDATE_EMPTY_PARAM_INCLUSION:()=>An,UPDATE_JSON:()=>Yn,UPDATE_OPERATION_META_VALUE:()=>xi,UPDATE_PARAM:()=>ir,UPDATE_RESOLVED:()=>Ji,UPDATE_RESOLVED_SUBTREE:()=>Ho,UPDATE_SPEC:()=>En,UPDATE_URL:()=>Un,VALIDATE_PARAMS:()=>Lr,changeConsumesValue:()=>Wu,changeParam:()=>kr,changeParamByIdentity:()=>Ni,changeProducesValue:()=>Yf,clearRequest:()=>Bc,clearResponse:()=>Vl,clearValidateParams:()=>zl,execute:()=>Uh,executeRequest:()=>sh,invalidateResolvedSubtreeCache:()=>Vo,logRequest:()=>Bh,parseToJson:()=>bo,requestResolvedSubtree:()=>Mr,resolveSpec:()=>Ct,setMutatedRequest:()=>gp,setRequest:()=>Zc,setResponse:()=>xl,setScheme:()=>Lp,updateEmptyParamInclusion:()=>_l,updateJsonSpec:()=>uo,updateResolved:()=>Qs,updateResolvedSubtree:()=>Zs,updateSpec:()=>Vs,updateUrl:()=>Ri,validateParams:()=>il});var o=t(1013),l=t(302);const _=(t.d(lr={},{default:()=>fm}),lr);var lr,M=t(1581);const w=(ji=>{var lr={};return t.d(lr,ji),lr})({default:()=>DE()});var N=t(4163),V=t(2565),X=t(3978),re=t.n(X),oe=t(6785),fe=t(7930);const ve=(ji=>{var lr={};return t.d(lr,ji),lr})({default:()=>xE()});var Pe=t(6145),De=t(374),Ie=t(8818),Ae=t(29),Y=t(5171),Et=t(2740),ft=t(7512);const xt=(ji=>{var lr={};return t.d(lr,ji),lr})({default:()=>NE()});var Ht=t(626),yn=t(9725),It=t(8900),In=t(8518);const On=(ji=>{var lr={};return t.d(lr,ji),lr})({default:()=>IE()}),Yr=(ji=>{var lr={};return t.d(lr,ji),lr})({default:()=>T3()}),Ir=(ji=>{var lr={};return t.d(lr,ji),lr})({default:()=>M3()});var Hr=t(6298),Wr=["path","method"],En="spec_update_spec",Un="spec_update_url",Yn="spec_update_json",ir="spec_update_param",An="spec_update_empty_param_inclusion",Lr="spec_validate_param",Wi="spec_set_response",Mi="spec_set_request",Yi="spec_set_mutated_request",jr="spec_log_request",Nn="spec_clear_response",fn="spec_clear_request",Vr="spec_clear_validate_param",xi="spec_update_operation_meta_value",Ji="spec_update_resolved",Ho="spec_update_resolved_subtree",Ao="set_scheme";function Vs(ji){var lr,yi=(lr=ji,(0,On.default)(lr)?lr:"").replace(/\t/g,"  ");if("string"==typeof ji)return{type:En,payload:yi}}function Qs(ji){return{type:Ji,payload:ji}}function Ri(ji){return{type:Un,payload:ji}}function uo(ji){return{type:Yn,payload:ji}}var bo=function(ji){return function(lr){var yi=lr.specActions,Po=lr.errActions,qo=lr.specSelectors.specStr,os=null;try{ji=ji||qo(),Po.clear({source:"parser"}),os=Ht.default.load(ji,{schema:Ht.JSON_SCHEMA})}catch(fs){return console.error(fs),Po.newSpecErr({source:"parser",level:"error",message:fs.reason,line:fs.mark&&fs.mark.line?fs.mark.line+1:void 0})}return os&&"object"===(0,M.default)(os)?yi.updateJsonSpec(os):{}}},Ye=!1,Ct=function(ji,lr){return function(yi){var qi=yi.specActions,Po=yi.specSelectors,qo=yi.errActions,os=yi.fn,fs=os.fetch,_a=os.resolve,el=os.AST,gu=void 0===el?{}:el,tr=yi.getConfigs;Ye||(console.warn("specActions.resolveSpec is deprecated since v3.10.0 and will be removed in v4.0.0; use requestResolvedSubtree instead!"),Ye=!0);var ki=tr(),us=ki.modelPropertyMacro,Gi=ki.parameterMacro,ws=ki.requestInterceptor,ss=ki.responseInterceptor;void 0===ji&&(ji=Po.specJson()),void 0===lr&&(lr=Po.url());var eu=gu.getLineNumberForPath?gu.getLineNumberForPath:function(){},El=Po.specStr();return _a({fetch:fs,spec:ji,baseDoc:lr,modelPropertyMacro:us,parameterMacro:Gi,requestInterceptor:ws,responseInterceptor:ss}).then(function(dl){var Ha=dl.spec,Ti=dl.errors;if(qo.clear({type:"thrown"}),(0,N.default)(Ti)&&Ti.length>0){var Ju=(0,V.default)(Ti).call(Ti,function(mu){return console.error(mu),mu.line=mu.fullPath?eu(El,mu.fullPath):null,mu.path=mu.fullPath?mu.fullPath.join("."):null,mu.level="error",mu.type="thrown",mu.source="resolver",re()(mu,"message",{enumerable:!0,value:mu.message}),mu});qo.newThrownErrBatch(Ju)}return qi.updateResolved(Ha)})}},bt=[],Vn=(0,Yr.default)((0,_.default)(w.default.mark(function ji(){var lr,yi,qi,Po,qo,os,fs,_a,el,gu,tr,ki,us,Gi,ws,ss,eu,El;return w.default.wrap(function(dl){for(;;)switch(dl.prev=dl.next){case 0:if(lr=bt.system){dl.next=4;break}return console.error("debResolveSubtrees: don't have a system to operate on, aborting."),dl.abrupt("return");case 4:if(yi=lr.errActions,qi=lr.errSelectors,os=(Po=lr.fn).fetch,_a=void 0===(fs=Po.AST)?{}:fs,el=lr.specSelectors,gu=lr.specActions,qo=Po.resolveSubtree){dl.next=8;break}return console.error("Error: Swagger-Client did not provide a `resolveSubtree` method, doing nothing."),dl.abrupt("return");case 8:return tr=_a.getLineNumberForPath?_a.getLineNumberForPath:function(){},ki=el.specStr(),us=lr.getConfigs(),Gi=us.modelPropertyMacro,ws=us.parameterMacro,ss=us.requestInterceptor,eu=us.responseInterceptor,dl.prev=11,dl.next=14,(0,oe.default)(bt).call(bt,function(){var Ha=(0,_.default)(w.default.mark(function Ti(Ju,mu){var jf,ah,Yl,ap,q_,lh,hg,F_,tv;return w.default.wrap(function(uh){for(;;)switch(uh.prev=uh.next){case 0:return uh.next=2,Ju;case 2:return ah=(jf=uh.sent).resultMap,Yl=jf.specWithCurrentSubtrees,uh.next=7,qo(Yl,mu,{baseDoc:el.url(),modelPropertyMacro:Gi,parameterMacro:ws,requestInterceptor:ss,responseInterceptor:eu});case 7:if(q_=(ap=uh.sent).errors,lh=ap.spec,qi.allErrors().size&&yi.clearBy(function(md){var _g;return"thrown"!==md.get("type")||"resolver"!==md.get("source")||!(0,fe.default)(_g=md.get("fullPath")).call(_g,function(Yg,eg){return Yg===mu[eg]||void 0===mu[eg]})}),(0,N.default)(q_)&&q_.length>0&&(hg=(0,V.default)(q_).call(q_,function(md){return md.line=md.fullPath?tr(ki,md.fullPath):null,md.path=md.fullPath?md.fullPath.join("."):null,md.level="error",md.type="thrown",md.source="resolver",re()(md,"message",{enumerable:!0,value:md.message}),md}),yi.newThrownErrBatch(hg)),!lh||!el.isOAS3()||"components"!==mu[0]||"securitySchemes"!==mu[1]){uh.next=15;break}return uh.next=15,ve.default.all((0,V.default)(F_=(0,Pe.default)(tv=(0,De.default)(lh)).call(tv,function(md){return"openIdConnect"===md.type})).call(F_,function(){var md=(0,_.default)(w.default.mark(function _g(Yg){var eg,mm;return w.default.wrap(function(Fp){for(;;)switch(Fp.prev=Fp.next){case 0:return eg={url:Yg.openIdConnectUrl,requestInterceptor:ss,responseInterceptor:eu},Fp.prev=1,Fp.next=4,os(eg);case 4:(mm=Fp.sent)instanceof Error||mm.status>=400?console.error(mm.statusText+" "+eg.url):Yg.openIdConnectData=JSON.parse(mm.text),Fp.next=11;break;case 8:Fp.prev=8,Fp.t0=Fp.catch(1),console.error(Fp.t0);case 11:case"end":return Fp.stop()}},_g,null,[[1,8]])}));return function(_g){return md.apply(this,arguments)}}()));case 15:return(0,Ir.default)(ah,mu,lh),(0,Ir.default)(Yl,mu,lh),uh.abrupt("return",{resultMap:ah,specWithCurrentSubtrees:Yl});case 18:case"end":return uh.stop()}},Ti)}));return function(Ti,Ju){return Ha.apply(this,arguments)}}(),ve.default.resolve({resultMap:(el.specResolvedSubtree([])||(0,yn.Map)()).toJS(),specWithCurrentSubtrees:el.specJson().toJS()}));case 14:El=dl.sent,delete bt.system,bt=[],dl.next=22;break;case 19:dl.prev=19,dl.t0=dl.catch(11),console.error(dl.t0);case 22:gu.updateResolvedSubtree([],El.resultMap);case 23:case"end":return dl.stop()}},ji,null,[[11,19]])})),35),Mr=function(ji){return function(lr){var yi;(0,Ie.default)(yi=(0,V.default)(bt).call(bt,function(qi){return qi.join("@@")})).call(yi,ji.join("@@"))>-1||(bt.push(ji),bt.system=lr,Vn())}};function kr(ji,lr,yi,qi,Po){return{type:ir,payload:{path:ji,value:qi,paramName:lr,paramIn:yi,isXml:Po}}}function Ni(ji,lr,yi,qi){return{type:ir,payload:{path:ji,param:lr,value:yi,isXml:qi}}}var Zs=function(ji,lr){return{type:Ho,payload:{path:ji,value:lr}}},Vo=function(){return{type:Ho,payload:{path:[],value:(0,yn.Map)()}}},il=function(ji,lr){return{type:Lr,payload:{pathMethod:ji,isOAS3:lr}}},_l=function(ji,lr,yi,qi){return{type:An,payload:{pathMethod:ji,paramName:lr,paramIn:yi,includeEmptyValue:qi}}};function zl(ji){return{type:Vr,payload:{pathMethod:ji}}}function Wu(ji,lr){return{type:xi,payload:{path:ji,value:lr,key:"consumes_value"}}}function Yf(ji,lr){return{type:xi,payload:{path:ji,value:lr,key:"produces_value"}}}var xl=function(ji,lr,yi){return{payload:{path:ji,method:lr,res:yi},type:Wi}},Zc=function(ji,lr,yi){return{payload:{path:ji,method:lr,req:yi},type:Mi}},gp=function(ji,lr,yi){return{payload:{path:ji,method:lr,req:yi},type:Yi}},Bh=function(ji){return{payload:ji,type:jr}},sh=function(ji){return function(lr){var yi,qi,Po=lr.fn,qo=lr.specActions,os=lr.specSelectors,_a=lr.oas3Selectors,el=ji.pathName,gu=ji.method,tr=ji.operation,ki=(0,lr.getConfigs)(),us=ki.requestInterceptor,Gi=ki.responseInterceptor,ws=tr.toJS();if(tr&&tr.get("parameters")&&(0,Ae.default)(yi=(0,Pe.default)(qi=tr.get("parameters")).call(qi,function(Yl){return Yl&&!0===Yl.get("allowEmptyValue")})).call(yi,function(Yl){if(os.parameterInclusionSettingFor([el,gu],Yl.get("name"),Yl.get("in"))){ji.parameters=ji.parameters||{};var ap=(0,Hr.cz)(Yl,ji.parameters);(!ap||ap&&0===ap.size)&&(ji.parameters[Yl.get("name")]="")}}),ji.contextUrl=(0,It.default)(os.url()).toString(),ws&&ws.operationId?ji.operationId=ws.operationId:ws&&el&&gu&&(ji.operationId=Po.opId(ws,el,gu)),os.isOAS3()){var ss,eu=(0,Y.default)(ss="".concat(el,":")).call(ss,gu);ji.server=_a.selectedServer(eu)||_a.selectedServer();var El=_a.serverVariables({server:ji.server,namespace:eu}).toJS(),dl=_a.serverVariables({server:ji.server}).toJS();ji.serverVariables=(0,Et.default)(El).length?El:dl,ji.requestContentType=_a.requestContentType(el,gu),ji.responseContentType=_a.responseContentType(el,gu)||"*/*";var Ha,Ti=_a.requestBodyValue(el,gu),Ju=_a.requestBodyInclusionSetting(el,gu);ji.requestBody=Ti&&Ti.toJS?(0,Pe.default)(Ha=(0,V.default)(Ti).call(Ti,function(Yl){return yn.Map.isMap(Yl)?Yl.get("value"):Yl})).call(Ha,function(Yl,ap){return((0,N.default)(Yl)?0!==Yl.length:!(0,Hr.O2)(Yl))||Ju.get(ap)}).toJS():Ti}var mu=(0,ft.default)({},ji);mu=Po.buildRequest(mu),qo.setRequest(ji.pathName,ji.method,mu);var Yl,jf=(Yl=(0,_.default)(w.default.mark(function ap(q_){var lh,hg;return w.default.wrap(function(F_){for(;;)switch(F_.prev=F_.next){case 0:return F_.next=2,us.apply(void 0,[q_]);case 2:return hg=(0,ft.default)({},lh=F_.sent),qo.setMutatedRequest(ji.pathName,ji.method,hg),F_.abrupt("return",lh);case 6:case"end":return F_.stop()}},ap)})),function(ap){return Yl.apply(this,arguments)});ji.requestInterceptor=jf,ji.responseInterceptor=Gi;var ah=(0,xt.default)();return Po.execute(ji).then(function(Yl){Yl.duration=(0,xt.default)()-ah,qo.setResponse(ji.pathName,ji.method,Yl)}).catch(function(Yl){"Failed to fetch"===Yl.message&&(Yl.name="",Yl.message='**Failed to fetch.**  \n**Possible Reasons:** \n  - CORS \n  - Network Failure \n  - URL scheme must be "http" or "https" for CORS request.'),qo.setResponse(ji.pathName,ji.method,{error:!0,err:(0,In.serializeError)(Yl)})})}},Uh=function(){var ji=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},lr=ji.path,yi=ji.method,qi=(0,l.default)(ji,Wr);return function(Po){var qo=Po.fn.fetch,os=Po.specSelectors,fs=Po.specActions,_a=os.specJsonWithResolvedSubtrees().toJS(),el=os.operationScheme(lr,yi),gu=os.contentTypeValues([lr,yi]).toJS(),tr=gu.requestContentType,ki=gu.responseContentType,us=/xml/i.test(tr),Gi=os.parameterValues([lr,yi],us).toJS();return fs.executeRequest((0,o.default)((0,o.default)({},qi),{},{fetch:qo,spec:_a,pathName:lr,method:yi,parameters:Gi,requestContentType:tr,scheme:el,responseContentType:ki}))}};function Vl(ji,lr){return{type:Nn,payload:{path:ji,method:lr}}}function Bc(ji,lr){return{type:fn,payload:{path:ji,method:lr}}}function Lp(ji,lr,yi){return{type:Ao,payload:{scheme:ji,path:lr,method:yi}}}},7038:(n,s,t)=>{t.r(s),t.d(s,{default:()=>w});var o=t(32),l=t(1737),_=t(3881),M=t(7508);function w(){return{statePlugins:{spec:{wrapActions:M,reducers:o.default,actions:l,selectors:_}}}}},32:(n,s,t)=>{t.r(s),t.d(s,{default:()=>Pe});var o,l=t(775),_=t(2691),M=t(5171),w=t(6785),N=t(2565),V=t(7512),X=t(9725),re=t(6298),oe=t(7504),fe=t(3881),ve=t(1737);const Pe=((0,l.default)(o={},ve.UPDATE_SPEC,function(De,Ie){return"string"==typeof Ie.payload?De.set("spec",Ie.payload):De}),(0,l.default)(o,ve.UPDATE_URL,function(De,Ie){return De.set("url",Ie.payload+"")}),(0,l.default)(o,ve.UPDATE_JSON,function(De,Ie){return De.set("json",(0,re.oG)(Ie.payload))}),(0,l.default)(o,ve.UPDATE_RESOLVED,function(De,Ie){return De.setIn(["resolved"],(0,re.oG)(Ie.payload))}),(0,l.default)(o,ve.UPDATE_RESOLVED_SUBTREE,function(De,Ie){var Ae,Y=Ie.payload,Et=Y.value,ft=Y.path;return De.setIn((0,M.default)(Ae=["resolvedSubtrees"]).call(Ae,(0,_.default)(ft)),(0,re.oG)(Et))}),(0,l.default)(o,ve.UPDATE_PARAM,function(De,Ie){var Ae,Y,Et=Ie.payload,ft=Et.path,xt=Et.paramName,Ht=Et.paramIn,yn=Et.param,It=Et.value,In=Et.isXml,On=yn?(0,re.V9)(yn):(0,M.default)(Ae="".concat(Ht,".")).call(Ae,xt),Yr=In?"value_xml":"value";return De.setIn((0,M.default)(Y=["meta","paths"]).call(Y,(0,_.default)(ft),["parameters",On,Yr]),It)}),(0,l.default)(o,ve.UPDATE_EMPTY_PARAM_INCLUSION,function(De,Ie){var Ae,Y,Et=Ie.payload,ft=Et.pathMethod,xt=Et.paramName,Ht=Et.paramIn,yn=Et.includeEmptyValue;if(!xt||!Ht)return console.warn("Warning: UPDATE_EMPTY_PARAM_INCLUSION could not generate a paramKey."),De;var It=(0,M.default)(Ae="".concat(Ht,".")).call(Ae,xt);return De.setIn((0,M.default)(Y=["meta","paths"]).call(Y,(0,_.default)(ft),["parameter_inclusions",It]),yn)}),(0,l.default)(o,ve.VALIDATE_PARAMS,function(De,Ie){var Ae,Y,Et=Ie.payload,ft=Et.pathMethod,xt=Et.isOAS3,Ht=(0,fe.specJsonWithResolvedSubtrees)(De).getIn((0,M.default)(Ae=["paths"]).call(Ae,(0,_.default)(ft))),yn=(0,fe.parameterValues)(De,ft).toJS();return De.updateIn((0,M.default)(Y=["meta","paths"]).call(Y,(0,_.default)(ft),["parameters"]),(0,X.fromJS)({}),function(It){var In;return(0,w.default)(In=Ht.get("parameters",(0,X.List)())).call(In,function(On,Yr){var Ir=(0,re.cz)(Yr,yn),Hr=(0,fe.parameterInclusionSettingFor)(De,ft,Yr.get("name"),Yr.get("in")),Wr=(0,re.Ik)(Yr,Ir,{bypassRequiredCheck:Hr,isOAS3:xt});return On.setIn([(0,re.V9)(Yr),"errors"],(0,X.fromJS)(Wr))},It)})}),(0,l.default)(o,ve.CLEAR_VALIDATE_PARAMS,function(De,Ie){var Ae,Y=Ie.payload.pathMethod;return De.updateIn((0,M.default)(Ae=["meta","paths"]).call(Ae,(0,_.default)(Y),["parameters"]),(0,X.fromJS)([]),function(Et){return(0,N.default)(Et).call(Et,function(ft){return ft.set("errors",(0,X.fromJS)([]))})})}),(0,l.default)(o,ve.SET_RESPONSE,function(De,Ie){var Ae,Y=Ie.payload,Et=Y.res,ft=Y.path,xt=Y.method;(Ae=Et.error?(0,V.default)({error:!0,name:Et.err.name,message:Et.err.message,statusCode:Et.err.statusCode},Et.err.response):Et).headers=Ae.headers||{};var Ht=De.setIn(["responses",ft,xt],(0,re.oG)(Ae));return oe.Z.Blob&&Et.data instanceof oe.Z.Blob&&(Ht=Ht.setIn(["responses",ft,xt,"text"],Et.data)),Ht}),(0,l.default)(o,ve.SET_REQUEST,function(De,Ie){var Ae=Ie.payload;return De.setIn(["requests",Ae.path,Ae.method],(0,re.oG)(Ae.req))}),(0,l.default)(o,ve.SET_MUTATED_REQUEST,function(De,Ie){var Ae=Ie.payload;return De.setIn(["mutatedRequests",Ae.path,Ae.method],(0,re.oG)(Ae.req))}),(0,l.default)(o,ve.UPDATE_OPERATION_META_VALUE,function(De,Ie){var Ae,Y,Et,ft,xt,Ht,yn=Ie.payload,It=yn.path,In=yn.value,On=yn.key,Yr=(0,M.default)(Ae=["paths"]).call(Ae,(0,_.default)(It)),Ir=(0,M.default)(Y=["meta","paths"]).call(Y,(0,_.default)(It));return De.getIn((0,M.default)(Et=["json"]).call(Et,(0,_.default)(Yr)))||De.getIn((0,M.default)(ft=["resolved"]).call(ft,(0,_.default)(Yr)))||De.getIn((0,M.default)(xt=["resolvedSubtrees"]).call(xt,(0,_.default)(Yr)))?De.setIn((0,M.default)(Ht=[]).call(Ht,(0,_.default)(Ir),[On]),(0,X.fromJS)(In)):De}),(0,l.default)(o,ve.CLEAR_RESPONSE,function(De,Ie){var Ae=Ie.payload;return De.deleteIn(["responses",Ae.path,Ae.method])}),(0,l.default)(o,ve.CLEAR_REQUEST,function(De,Ie){var Ae=Ie.payload;return De.deleteIn(["requests",Ae.path,Ae.method])}),(0,l.default)(o,ve.SET_SCHEME,function(De,Ie){var Ae=Ie.payload,Y=Ae.scheme,Et=Ae.path,ft=Ae.method;return Et&&ft?De.setIn(["scheme",Et,ft],Y):Et||ft?void 0:De.setIn(["scheme","_defaultScheme"],Y)}),o)},3881:(n,s,t)=>{t.r(s),t.d(s,{lastError:()=>ft,url:()=>xt,specStr:()=>Ht,specSource:()=>yn,specJson:()=>It,specResolved:()=>In,specResolvedSubtree:()=>On,specJsonWithResolvedSubtrees:()=>Ir,spec:()=>Hr,isOAS3:()=>Wr,info:()=>En,externalDocs:()=>Un,version:()=>Yn,semver:()=>ir,paths:()=>An,operations:()=>Lr,consumes:()=>Wi,produces:()=>Mi,security:()=>Yi,securityDefinitions:()=>jr,findDefinition:()=>Nn,definitions:()=>fn,basePath:()=>Vr,host:()=>xi,schemes:()=>Ji,operationsWithRootInherited:()=>Ho,tags:()=>Ao,tagDetails:()=>Vs,operationsWithTags:()=>Qs,taggedOperations:()=>Ri,responses:()=>uo,requests:()=>bo,mutatedRequests:()=>Ye,responseFor:()=>Ct,requestFor:()=>bt,mutatedRequestFor:()=>Vn,allowTryItOutFor:()=>Mr,parameterWithMetaByIdentity:()=>kr,parameterInclusionSettingFor:()=>Ni,parameterWithMeta:()=>Zs,operationWithMeta:()=>Vo,getParameter:()=>il,hasHost:()=>_l,parameterValues:()=>zl,parametersIncludeIn:()=>Wu,parametersIncludeType:()=>Yf,contentTypeValues:()=>xl,currentProducesFor:()=>Zc,producesOptionsFor:()=>gp,consumesOptionsFor:()=>Bh,operationScheme:()=>sh,canExecuteScheme:()=>Uh,validateBeforeExecute:()=>Vl,getOAS3RequiredRequestBodyContentType:()=>Bc,isMediaTypeSchemaPropertiesEqual:()=>Lp});var o=t(9334),l=t(2691),_=t(5171),M=t(8136),w=t(29),N=t(8818),V=t(2565),X=t(6145),re=t(1778),oe=t(6785),fe=t(4350),ve=t(9963),Pe=t(4163),De=t(8639),Ie=t(6298),Ae=t(9725),Y=["get","put","post","delete","options","head","patch","trace"],Et=function(lr){return lr||(0,Ae.Map)()},ft=(0,De.createSelector)(Et,function(lr){return lr.get("lastError")}),xt=(0,De.createSelector)(Et,function(lr){return lr.get("url")}),Ht=(0,De.createSelector)(Et,function(lr){return lr.get("spec")||""}),yn=(0,De.createSelector)(Et,function(lr){return lr.get("specSource")||"not-editor"}),It=(0,De.createSelector)(Et,function(lr){return lr.get("json",(0,Ae.Map)())}),In=(0,De.createSelector)(Et,function(lr){return lr.get("resolved",(0,Ae.Map)())}),On=function(lr,yi){var qi;return lr.getIn((0,_.default)(qi=["resolvedSubtrees"]).call(qi,(0,l.default)(yi)),void 0)},Yr=function lr(yi,qi){return Ae.Map.isMap(yi)&&Ae.Map.isMap(qi)?qi.get("$$ref")?qi:(0,Ae.OrderedMap)().mergeWith(lr,yi,qi):qi},Ir=(0,De.createSelector)(Et,function(lr){return(0,Ae.OrderedMap)().mergeWith(Yr,lr.get("json"),lr.get("resolvedSubtrees"))}),Hr=function(lr){return It(lr)},Wr=(0,De.createSelector)(Hr,function(){return!1}),En=(0,De.createSelector)(Hr,function(lr){return ji(lr&&lr.get("info"))}),Un=(0,De.createSelector)(Hr,function(lr){return ji(lr&&lr.get("externalDocs"))}),Yn=(0,De.createSelector)(En,function(lr){return lr&&lr.get("version")}),ir=(0,De.createSelector)(Yn,function(lr){var yi;return(0,M.default)(yi=/v?([0-9]*)\.([0-9]*)\.([0-9]*)/i.exec(lr)).call(yi,1)}),An=(0,De.createSelector)(Ir,function(lr){return lr.get("paths")}),Lr=(0,De.createSelector)(An,function(lr){if(!lr||lr.size<1)return(0,Ae.List)();var yi=(0,Ae.List)();return lr&&(0,w.default)(lr)?((0,w.default)(lr).call(lr,function(qi,Po){if(!qi||!(0,w.default)(qi))return{};(0,w.default)(qi).call(qi,function(qo,os){var fs;(0,N.default)(Y).call(Y,os)<0||(yi=yi.push((0,Ae.fromJS)({path:Po,method:os,operation:qo,id:(0,_.default)(fs="".concat(os,"-")).call(fs,Po)})))})}),yi):(0,Ae.List)()}),Wi=(0,De.createSelector)(Hr,function(lr){return(0,Ae.Set)(lr.get("consumes"))}),Mi=(0,De.createSelector)(Hr,function(lr){return(0,Ae.Set)(lr.get("produces"))}),Yi=(0,De.createSelector)(Hr,function(lr){return lr.get("security",(0,Ae.List)())}),jr=(0,De.createSelector)(Hr,function(lr){return lr.get("securityDefinitions")}),Nn=function(lr,yi){var qi=lr.getIn(["resolvedSubtrees","definitions",yi],null),Po=lr.getIn(["json","definitions",yi],null);return qi||Po||null},fn=(0,De.createSelector)(Hr,function(lr){var yi=lr.get("definitions");return Ae.Map.isMap(yi)?yi:(0,Ae.Map)()}),Vr=(0,De.createSelector)(Hr,function(lr){return lr.get("basePath")}),xi=(0,De.createSelector)(Hr,function(lr){return lr.get("host")}),Ji=(0,De.createSelector)(Hr,function(lr){return lr.get("schemes",(0,Ae.Map)())}),Ho=(0,De.createSelector)(Lr,Wi,Mi,function(lr,yi,qi){return(0,V.default)(lr).call(lr,function(Po){return Po.update("operation",function(qo){return qo?Ae.Map.isMap(qo)?qo.withMutations(function(os){return os.get("consumes")||os.update("consumes",function(fs){return(0,Ae.Set)(fs).merge(yi)}),os.get("produces")||os.update("produces",function(fs){return(0,Ae.Set)(fs).merge(qi)}),os}):void 0:(0,Ae.Map)()})})}),Ao=(0,De.createSelector)(Hr,function(lr){var yi=lr.get("tags",(0,Ae.List)());return Ae.List.isList(yi)?(0,X.default)(yi).call(yi,function(qi){return Ae.Map.isMap(qi)}):(0,Ae.List)()}),Vs=function(lr,yi){var qi,Po=Ao(lr)||(0,Ae.List)();return(0,re.default)(qi=(0,X.default)(Po).call(Po,Ae.Map.isMap)).call(qi,function(qo){return qo.get("name")===yi},(0,Ae.Map)())},Qs=(0,De.createSelector)(Ho,Ao,function(lr,yi){return(0,oe.default)(lr).call(lr,function(qi,Po){var qo=(0,Ae.Set)(Po.getIn(["operation","tags"]));return qo.count()<1?qi.update("default",(0,Ae.List)(),function(os){return os.push(Po)}):(0,oe.default)(qo).call(qo,function(os,fs){return os.update(fs,(0,Ae.List)(),function(_a){return _a.push(Po)})},qi)},(0,oe.default)(yi).call(yi,function(qi,Po){return qi.set(Po.get("name"),(0,Ae.List)())},(0,Ae.OrderedMap)()))}),Ri=function(lr){return function(yi){var qi,Po=(0,yi.getConfigs)(),qo=Po.tagsSorter,os=Po.operationsSorter;return(0,V.default)(qi=Qs(lr).sortBy(function(fs,_a){return _a},function(fs,_a){var el="function"==typeof qo?qo:Ie.wh.tagsSorter[qo];return el?el(fs,_a):null})).call(qi,function(fs,_a){var el="function"==typeof os?os:Ie.wh.operationsSorter[os],gu=el?(0,fe.default)(fs).call(fs,el):fs;return(0,Ae.Map)({tagDetails:Vs(lr,_a),operations:gu})})}},uo=(0,De.createSelector)(Et,function(lr){return lr.get("responses",(0,Ae.Map)())}),bo=(0,De.createSelector)(Et,function(lr){return lr.get("requests",(0,Ae.Map)())}),Ye=(0,De.createSelector)(Et,function(lr){return lr.get("mutatedRequests",(0,Ae.Map)())}),Ct=function(lr,yi,qi){return uo(lr).getIn([yi,qi],null)},bt=function(lr,yi,qi){return bo(lr).getIn([yi,qi],null)},Vn=function(lr,yi,qi){return Ye(lr).getIn([yi,qi],null)},Mr=function(){return!0},kr=function(lr,yi,qi){var Po,qo,os=Ir(lr).getIn((0,_.default)(Po=["paths"]).call(Po,(0,l.default)(yi),["parameters"]),(0,Ae.OrderedMap)()),fs=lr.getIn((0,_.default)(qo=["meta","paths"]).call(qo,(0,l.default)(yi),["parameters"]),(0,Ae.OrderedMap)()),_a=(0,V.default)(os).call(os,function(el){var gu,tr,ki,us=fs.get((0,_.default)(gu="".concat(qi.get("in"),".")).call(gu,qi.get("name"))),Gi=fs.get((0,_.default)(tr=(0,_.default)(ki="".concat(qi.get("in"),".")).call(ki,qi.get("name"),".hash-")).call(tr,qi.hashCode()));return(0,Ae.OrderedMap)().merge(el,us,Gi)});return(0,re.default)(_a).call(_a,function(el){return el.get("in")===qi.get("in")&&el.get("name")===qi.get("name")},(0,Ae.OrderedMap)())},Ni=function(lr,yi,qi,Po){var qo,os,fs=(0,_.default)(qo="".concat(Po,".")).call(qo,qi);return lr.getIn((0,_.default)(os=["meta","paths"]).call(os,(0,l.default)(yi),["parameter_inclusions",fs]),!1)},Zs=function(lr,yi,qi,Po){var qo,os=Ir(lr).getIn((0,_.default)(qo=["paths"]).call(qo,(0,l.default)(yi),["parameters"]),(0,Ae.OrderedMap)()),fs=(0,re.default)(os).call(os,function(_a){return _a.get("in")===Po&&_a.get("name")===qi},(0,Ae.OrderedMap)());return kr(lr,yi,fs)},Vo=function(lr,yi,qi){var Po,qo=Ir(lr).getIn(["paths",yi,qi],(0,Ae.OrderedMap)()),os=lr.getIn(["meta","paths",yi,qi],(0,Ae.OrderedMap)()),fs=(0,V.default)(Po=qo.get("parameters",(0,Ae.List)())).call(Po,function(_a){return kr(lr,[yi,qi],_a)});return(0,Ae.OrderedMap)().merge(qo,os).set("parameters",fs)};function il(lr,yi,qi,Po){var qo;yi=yi||[];var os=lr.getIn((0,_.default)(qo=["meta","paths"]).call(qo,(0,l.default)(yi),["parameters"]),(0,Ae.fromJS)([]));return(0,re.default)(os).call(os,function(fs){return Ae.Map.isMap(fs)&&fs.get("name")===qi&&fs.get("in")===Po})||(0,Ae.Map)()}var _l=(0,De.createSelector)(Hr,function(lr){var yi=lr.get("host");return"string"==typeof yi&&yi.length>0&&"/"!==yi[0]});function zl(lr,yi,qi){var Po;yi=yi||[];var qo=Vo.apply(void 0,(0,_.default)(Po=[lr]).call(Po,(0,l.default)(yi))).get("parameters",(0,Ae.List)());return(0,oe.default)(qo).call(qo,function(os,fs){var _a=qi&&"body"===fs.get("in")?fs.get("value_xml"):fs.get("value");return os.set((0,Ie.V9)(fs,{allowHashes:!1}),_a)},(0,Ae.fromJS)({}))}function Wu(lr){var yi=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"";if(Ae.List.isList(lr))return(0,ve.default)(lr).call(lr,function(qi){return Ae.Map.isMap(qi)&&qi.get("in")===yi})}function Yf(lr){var yi=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"";if(Ae.List.isList(lr))return(0,ve.default)(lr).call(lr,function(qi){return Ae.Map.isMap(qi)&&qi.get("type")===yi})}function xl(lr,yi){var qi,Po;yi=yi||[];var qo=Ir(lr).getIn((0,_.default)(qi=["paths"]).call(qi,(0,l.default)(yi)),(0,Ae.fromJS)({})),os=lr.getIn((0,_.default)(Po=["meta","paths"]).call(Po,(0,l.default)(yi)),(0,Ae.fromJS)({})),fs=Zc(lr,yi),_a=qo.get("parameters")||new Ae.List,el=os.get("consumes_value")?os.get("consumes_value"):Yf(_a,"file")?"multipart/form-data":Yf(_a,"formData")?"application/x-www-form-urlencoded":void 0;return(0,Ae.fromJS)({requestContentType:el,responseContentType:fs})}function Zc(lr,yi){var qi,Po;yi=yi||[];var qo=Ir(lr).getIn((0,_.default)(qi=["paths"]).call(qi,(0,l.default)(yi)),null);if(null!==qo){var os=lr.getIn((0,_.default)(Po=["meta","paths"]).call(Po,(0,l.default)(yi),["produces_value"]),null),fs=qo.getIn(["produces",0],null);return os||fs||"application/json"}}function gp(lr,yi){var qi;yi=yi||[];var Po=Ir(lr),qo=Po.getIn((0,_.default)(qi=["paths"]).call(qi,(0,l.default)(yi)),null);if(null!==qo){var fs=(0,o.default)(yi,1)[0],_a=qo.get("produces",null),el=Po.getIn(["paths",fs,"produces"],null),gu=Po.getIn(["produces"],null);return _a||el||gu}}function Bh(lr,yi){var qi;yi=yi||[];var Po=Ir(lr),qo=Po.getIn((0,_.default)(qi=["paths"]).call(qi,(0,l.default)(yi)),null);if(null!==qo){var fs=(0,o.default)(yi,1)[0],_a=qo.get("consumes",null),el=Po.getIn(["paths",fs,"consumes"],null),gu=Po.getIn(["consumes"],null);return _a||el||gu}}var sh=function(lr,yi,qi){var Po=lr.get("url").match(/^([a-z][a-z0-9+\-.]*):/),qo=(0,Pe.default)(Po)?Po[1]:null;return lr.getIn(["scheme",yi,qi])||lr.getIn(["scheme","_defaultScheme"])||qo||""},Uh=function(lr,yi,qi){var Po;return(0,N.default)(Po=["http","https"]).call(Po,sh(lr,yi,qi))>-1},Vl=function(lr,yi){var qi;yi=yi||[];var Po=lr.getIn((0,_.default)(qi=["meta","paths"]).call(qi,(0,l.default)(yi),["parameters"]),(0,Ae.fromJS)([])),qo=!0;return(0,w.default)(Po).call(Po,function(os){var fs=os.get("errors");fs&&fs.count()&&(qo=!1)}),qo},Bc=function(lr,yi){var qi,Po,qo={requestBody:!1,requestContentType:{}},os=lr.getIn((0,_.default)(qi=["resolvedSubtrees","paths"]).call(qi,(0,l.default)(yi),["requestBody"]),(0,Ae.fromJS)([]));return os.size<1||(os.getIn(["required"])&&(qo.requestBody=os.getIn(["required"])),(0,w.default)(Po=os.getIn(["content"]).entrySeq()).call(Po,function(fs){var _a=fs[0];if(fs[1].getIn(["schema","required"])){var el=fs[1].getIn(["schema","required"]).toJS();qo.requestContentType[_a]=el}})),qo},Lp=function(lr,yi,qi,Po){var qo;if((qi||Po)&&qi===Po)return!0;var os=lr.getIn((0,_.default)(qo=["resolvedSubtrees","paths"]).call(qo,(0,l.default)(yi),["requestBody","content"]),(0,Ae.fromJS)([]));if(os.size<2||!qi||!Po)return!1;var fs=os.getIn([qi,"schema","properties"],(0,Ae.fromJS)([])),_a=os.getIn([Po,"schema","properties"],(0,Ae.fromJS)([]));return!!fs.equals(_a)};function ji(lr){return Ae.Map.isMap(lr)?lr:new Ae.Map}},7508:(n,s,t)=>{t.r(s),t.d(s,{updateSpec:()=>M,updateJsonSpec:()=>w,executeRequest:()=>N,validateParams:()=>V});var o=t(2740),l=t(29),_=t(9908),M=function(X,re){var oe=re.specActions;return function(){X.apply(void 0,arguments),oe.parseToJson.apply(oe,arguments)}},w=function(X,re){var oe=re.specActions;return function(){for(var fe=arguments.length,ve=new Array(fe),Pe=0;Pe<fe;Pe++)ve[Pe]=arguments[Pe];X.apply(void 0,ve),oe.invalidateResolvedSubtreeCache();var De=ve[0],Ie=(0,_.default)(De,["paths"])||{},Ae=(0,o.default)(Ie);(0,l.default)(Ae).call(Ae,function(Y){(0,_.default)(Ie,[Y]).$ref&&oe.requestResolvedSubtree(["paths",Y])}),oe.requestResolvedSubtree(["components","securitySchemes"])}},N=function(X,re){var oe=re.specActions;return function(fe){return oe.logRequest(fe),X(fe)}},V=function(X,re){var oe=re.specSelectors;return function(fe){return X(fe,oe.isOAS3())}}},4852:(n,s,t)=>{t.r(s),t.d(s,{loaded:()=>o});var o=function(l,_){return function(){l.apply(void 0,arguments);var M=_.getConfigs().withCredentials;void 0!==M&&(_.fn.fetch.withCredentials="string"==typeof M?"true"===M:!!M)}}},2990:(n,s,t)=>{t.r(s),t.d(s,{default:()=>X});var o=t(5171);const l=(t.d(oe={},{default:()=>Bx}),oe),_=(re=>{var oe={};return t.d(oe,re),oe})({buildRequest:()=>Zx,execute:()=>z8}),M=(re=>{var oe={};return t.d(oe,re),oe})({default:()=>WO,makeHttp:()=>d6,serializeRes:()=>nx}),w=(re=>{var oe={};return t.d(oe,re),oe})({default:()=>X8});var oe,N=t(5013),V=t(4852);function X(re){var oe=re.configs,fe=re.getConfigs;return{fn:{fetch:(0,M.makeHttp)(M.default,oe.preFetch,oe.postFetch),buildRequest:_.buildRequest,execute:_.execute,resolve:l.default,resolveSubtree:function(ve,Pe,De){var Ie;if(void 0===De){var Ae=fe();De={modelPropertyMacro:Ae.modelPropertyMacro,parameterMacro:Ae.parameterMacro,requestInterceptor:Ae.requestInterceptor,responseInterceptor:Ae.responseInterceptor}}for(var Y=arguments.length,Et=new Array(Y>3?Y-3:0),ft=3;ft<Y;ft++)Et[ft-3]=arguments[ft];return w.default.apply(void 0,(0,o.default)(Ie=[ve,Pe,De]).call(Ie,Et))},serializeRes:M.serializeRes,opId:N.opId},statePlugins:{configs:{wrapActions:{loaded:V.loaded}}}}}},8525:(n,s,t)=>{t.r(s),t.d(s,{default:()=>l});var o=t(6298);function l(){return{fn:{shallowEqualKeys:o.be}}}},8347:(n,s,t)=>{t.r(s),t.d(s,{getDisplayName:()=>o});var o=function(l){return l.displayName||l.name||"Component"}},3420:(n,s,t)=>{t.r(s),t.d(s,{default:()=>N});var o=t(313),l=t(6298),_=t(5005),M=t(8347),w=t(8287);const N=function(V){var X,De,re=V.getComponents,oe=V.getStore,fe=V.getSystem,ve=(X=(0,_.getComponent)(fe,oe,re),(0,l.HP)(X,function(){for(var De=arguments.length,Ie=new Array(De),Ae=0;Ae<De;Ae++)Ie[Ae]=arguments[Ae];return(0,o.default)(Ie)})),Pe=(De=(0,_.withMappedContainer)(fe,oe,ve),(0,w.Z)(De,function(){for(var Ie=arguments.length,Ae=new Array(Ie),Y=0;Y<Ie;Y++)Ae[Y]=arguments[Y];return Ae}));return{rootInjects:{getComponent:ve,makeMappedContainer:Pe,render:(0,_.render)(fe,oe,_.getComponent,re)},fn:{getDisplayName:M.getDisplayName}}}},5005:(n,s,t)=>{t.r(s),t.d(s,{getComponent:()=>ft,render:()=>Et,withMappedContainer:()=>Y});var o=t(1581),l=t(1013),_=t(863),M=t(7344),w=t(8656),N=t(9972),V=t(5416),X=t(2740),re=t(810);const oe=(t.d(Ht={},{default:()=>Wx}),Ht);var Ht,fe=t(9871);const ve=(xt=>{var Ht={};return t.d(Ht,xt),Ht})({Provider:()=>iI,connect:()=>FI}),Pe=(xt=>{var Ht={};return t.d(Ht,xt),Ht})({default:()=>BI()}),De=(xt=>{var Ht={};return t.d(Ht,xt),Ht})({default:()=>YI()});var Ie=function(xt,Ht,yn){return(0,fe.compose)(yn?(It=xt,In=yn,function(On){var Yr=It().fn,Ir=function(Hr){(0,N.default)(En,Hr);var Wr=(0,V.default)(En);function En(){return(0,M.default)(this,En),Wr.apply(this,arguments)}return(0,w.default)(En,[{key:"render",value:function(){return re.default.createElement(ve.Provider,{store:In},re.default.createElement(On,(0,_.default)({},this.props,this.context)))}}]),En}(re.Component);return Ir.displayName="WithRoot(".concat(Yr.getDisplayName(On),")"),Ir}):De.default,(0,ve.connect)(function(It,In){var On,Yr=(0,l.default)((0,l.default)({},In),xt());return((null===(On=Ht.prototype)||void 0===On?void 0:On.mapStateToProps)||function(Hr){return{state:Hr}})(It,Yr)}),function(It){return function(In){var On=It().fn,Yr=function(Ir){(0,N.default)(Wr,Ir);var Hr=(0,V.default)(Wr);function Wr(){return(0,M.default)(this,Wr),Hr.apply(this,arguments)}return(0,w.default)(Wr,[{key:"render",value:function(){return re.default.createElement(In,(0,_.default)({},It(),this.props,this.context))}}]),Wr}(re.Component);return Yr.displayName="WithSystem(".concat(On.getDisplayName(In),")"),Yr}}(xt))(Ht);var It,In},Ae=function(xt,Ht,yn,It){for(var In in Ht){var On=Ht[In];"function"==typeof On&&On(yn[In],It[In],xt())}},Y=function(xt,Ht,yn){return function(It,In){var On=xt().fn,Yr=yn(It,"root"),Ir=function(Hr){(0,N.default)(En,Hr);var Wr=(0,V.default)(En);function En(Un,Yn){var ir;return(0,M.default)(this,En),ir=Wr.call(this,Un,Yn),Ae(xt,In,Un,{}),ir}return(0,w.default)(En,[{key:"UNSAFE_componentWillReceiveProps",value:function(Un){Ae(xt,In,Un,this.props)}},{key:"render",value:function(){var Un=(0,Pe.default)(this.props,In?(0,X.default)(In):[]);return re.default.createElement(Yr,Un)}}]),En}(re.Component);return Ir.displayName="WithMappedContainer(".concat(On.getDisplayName(Yr),")"),Ir}},Et=function(xt,Ht,yn,It){return function(In){var On=yn(xt,Ht,It)("App","root");oe.default.render(re.default.createElement(On,null),In)}},ft=function(xt,Ht,yn){return function(It,In){var On=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{};if("string"!=typeof It)throw new TypeError("Need a string, to fetch a component. Was given a "+(0,o.default)(It));var Yr=yn(It);return Yr?In?"root"===In?Ie(xt,Yr,Ht()):Ie(xt,Yr):Yr:(On.failSilently||xt().log.warn("Could not find component:",It),null)}}},471:(n,s,t)=>{t.d(s,{d3:()=>_.default,C2:()=>ft});var o=t(2740),l=t(2372);const _=(t.d(Ht={},{default:()=>f4}),Ht),M=(xt=>{var Ht={};return t.d(Ht,xt),Ht})({default:()=>_4}),w=(xt=>{var Ht={};return t.d(Ht,xt),Ht})({default:()=>v4}),N=(xt=>{var Ht={};return t.d(Ht,xt),Ht})({default:()=>b4}),V=(xt=>{var Ht={};return t.d(Ht,xt),Ht})({default:()=>C4}),X=(xt=>{var Ht={};return t.d(Ht,xt),Ht})({default:()=>A4}),re=(xt=>{var Ht={};return t.d(Ht,xt),Ht})({default:()=>x4}),oe=(xt=>{var Ht={};return t.d(Ht,xt),Ht})({default:()=>P4}),fe=(xt=>{var Ht={};return t.d(Ht,xt),Ht})({default:()=>I4}),ve=(xt=>{var Ht={};return t.d(Ht,xt),Ht})({default:()=>L4}),Pe=(xt=>{var Ht={};return t.d(Ht,xt),Ht})({default:()=>F4}),De=(xt=>{var Ht={};return t.d(Ht,xt),Ht})({default:()=>k4}),Ie=(xt=>{var Ht={};return t.d(Ht,xt),Ht})({default:()=>$4}),Ae=(xt=>{var Ht={};return t.d(Ht,xt),Ht})({default:()=>H4});var Ht;_.default.registerLanguage("json",w.default),_.default.registerLanguage("js",M.default),_.default.registerLanguage("xml",N.default),_.default.registerLanguage("yaml",X.default),_.default.registerLanguage("http",re.default),_.default.registerLanguage("bash",V.default),_.default.registerLanguage("powershell",oe.default),_.default.registerLanguage("javascript",M.default);var Y={agate:fe.default,arta:ve.default,monokai:Pe.default,nord:De.default,obsidian:Ie.default,"tomorrow-night":Ae.default},Et=(0,o.default)(Y),ft=function(xt){return(0,l.default)(Et).call(Et,xt)?Y[xt]:(console.warn("Request style '".concat(xt,"' is not available, returning default instead")),fe.default)}},6298:(n,s,t)=>{t.d(s,{r3:()=>xl,GZ:()=>gp,Xb:()=>_a,oJ:()=>Bc,XV:()=>yi,iQ:()=>Ct,J6:()=>Lp,DR:()=>Vn,oG:()=>xi,Uj:()=>fs,QG:()=>Vl,po:()=>lr,nX:()=>ji,gp:()=>bt,xi:()=>Wu,kJ:()=>Qs,O2:()=>gu,LQ:()=>Ho,Wl:()=>Vs,Kn:()=>Ao,HP:()=>Ri,AF:()=>Ji,D$:()=>Po,Ay:()=>uo,Q2:()=>bo,mz:()=>Vr,V9:()=>qo,cz:()=>os,UG:()=>Yf,Zl:()=>Mr,hW:()=>Uh,Nm:()=>sh,be:()=>Bh,wh:()=>Zc,Pz:()=>qi,_5:()=>Ye,Ik:()=>Ni});var o=t(2691),l=(t(9334),t(1581)),_=t(3248),M=t(4163),w=t(2565),N=t(2954),V=t(5171),X=t(29),re=t(6145),oe=t(2740),fe=(t(5527),t(6785)),ve=t(7512),Pe=t(4350),De=t(8136),Ie=t(9963),Ae=(t(2372),t(313)),Y=t(8818),Et=t(1778),ft=t(3590),xt=t(5942),Ht=t(9725);const yn=(t.d(ki={},{sanitizeUrl:()=>B4.N}),ki),It=(tr=>{var ki={};return t.d(ki,tr),ki})({default:()=>Y4()}),In=(tr=>{var ki={};return t.d(ki,tr),ki})({default:()=>G4()});var ki,On=t(5476);const Yr=(tr=>{var ki={};return t.d(ki,tr),ki})({default:()=>V4()}),Ir=(tr=>{var ki={};return t.d(ki,tr),ki})({default:()=>W4()}),Hr=(tr=>{var ki={};return t.d(ki,tr),ki})({default:()=>Q4()});var Wr=t(7068),En=t(2473),Un=t(7504);const Yn=(tr=>{var ki={};return t.d(ki,tr),ki})({default:()=>X4()});var ir=t(9069),An=t(1798),Lr=t.n(An),Wi=t(9072),Mi=t.n(Wi),Yi=t(626),jr=t(8764).Buffer,Nn="default",fn=function(tr){return Ht.default.Iterable.isIterable(tr)};function Vr(tr){return Ao(tr)?fn(tr)?tr.toJS():tr:{}}function xi(tr){var ki,us;if(fn(tr)||tr instanceof Un.Z.File||!Ao(tr))return tr;if((0,M.default)(tr))return(0,w.default)(us=Ht.default.Seq(tr)).call(us,xi).toList();if((0,Wr.default)((0,N.default)(tr))){var Gi,ws=function(ss){if(!(0,Wr.default)((0,N.default)(ss)))return ss;var eu,El={},Ha={},Ti=(0,_.default)((0,N.default)(ss).call(ss));try{for(Ti.s();!(eu=Ti.n()).done;){var mu,jf,ah,Yl,Ju=eu.value;El[Ju[0]]||Ha[Ju[0]]&&Ha[Ju[0]].containsMultiple?(Ha[Ju[0]]||(Ha[Ju[0]]={containsMultiple:!0,length:1},El[(0,V.default)(ah=(0,V.default)(Yl="".concat(Ju[0])).call(Yl,"_**[]")).call(ah,Ha[Ju[0]].length)]=El[Ju[0]],delete El[Ju[0]]),Ha[Ju[0]].length+=1,El[(0,V.default)(mu=(0,V.default)(jf="".concat(Ju[0])).call(jf,"_**[]")).call(mu,Ha[Ju[0]].length)]=Ju[1]):El[Ju[0]]=Ju[1]}}catch(ap){Ti.e(ap)}finally{Ti.f()}return El}(tr);return(0,w.default)(Gi=Ht.default.OrderedMap(ws)).call(Gi,xi)}return(0,w.default)(ki=Ht.default.OrderedMap(tr)).call(ki,xi)}function Ji(tr){return(0,M.default)(tr)?tr:[tr]}function Ho(tr){return"function"==typeof tr}function Ao(tr){return!!tr&&"object"===(0,l.default)(tr)}function Vs(tr){return"function"==typeof tr}function Qs(tr){return(0,M.default)(tr)}var Ri=On.default;function uo(tr,ki){var us;return(0,fe.default)(us=(0,oe.default)(tr)).call(us,function(Gi,ws){return Gi[ws]=ki(tr[ws],ws),Gi},{})}function bo(tr,ki){var us;return(0,fe.default)(us=(0,oe.default)(tr)).call(us,function(Gi,ws){var ss=ki(tr[ws],ws);return ss&&"object"===(0,l.default)(ss)&&(0,ve.default)(Gi,ss),Gi},{})}function Ye(tr){return function(ki){return function(us){return function(Gi){return"function"==typeof Gi?Gi(tr()):us(Gi)}}}}function Ct(tr){var ki,us=tr.keySeq();return us.contains(Nn)?Nn:(0,Pe.default)(ki=(0,re.default)(us).call(us,function(Gi){return"2"===(Gi+"")[0]})).call(ki).first()}function bt(tr,ki){if(!Ht.default.Iterable.isIterable(tr))return Ht.default.List();var us=tr.getIn((0,M.default)(ki)?ki:[ki]);return Ht.default.List.isList(us)?us:Ht.default.List()}function Vn(tr){var ki,us=[/filename\*=[^']+'\w*'"([^"]+)";?/i,/filename\*=[^']+'\w*'([^;]+);?/i,/filename="([^;]*);?"/i,/filename=([^;]*);?/i];if((0,Ie.default)(us).call(us,function(Gi){return null!==(ki=Gi.exec(tr))}),null!==ki&&ki.length>1)try{return decodeURIComponent(ki[1])}catch(Gi){console.error(Gi)}return null}function Mr(tr){return ki=tr.replace(/\.[^./]*$/,""),(0,In.default)((0,It.default)(ki));var ki}function kr(tr,ki,us,Gi,ws){if(!ki)return[];var ss=[],eu=ki.get("nullable"),El=ki.get("required"),dl=ki.get("maximum"),Ha=ki.get("minimum"),Ti=ki.get("type"),Ju=ki.get("format"),mu=ki.get("maxLength"),jf=ki.get("minLength"),ah=ki.get("uniqueItems"),Yl=ki.get("maxItems"),ap=ki.get("minItems"),q_=ki.get("pattern"),lh=us||!0===El,hg=null!=tr;if(eu&&null===tr||!Ti||!(lh||hg&&"array"===Ti||lh||hg))return[];var F_="string"===Ti&&tr,tv="array"===Ti&&(0,M.default)(tr)&&tr.length,uh="array"===Ti&&Ht.default.List.isList(tr)&&tr.count(),md=[F_,tv,uh,"array"===Ti&&"string"==typeof tr&&tr,"file"===Ti&&tr instanceof Un.Z.File,"boolean"===Ti&&(tr||!1===tr),"number"===Ti&&(tr||0===tr),"integer"===Ti&&(tr||0===tr),"object"===Ti&&"object"===(0,l.default)(tr)&&null!==tr,"object"===Ti&&"string"==typeof tr&&tr],_g=(0,Ie.default)(md).call(md,function(Ja){return!!Ja});if(lh&&!_g&&!Gi)return ss.push("Required field is not provided"),ss;if("object"===Ti&&(null===ws||"application/json"===ws)){var Yg,eg=tr;if("string"==typeof tr)try{eg=JSON.parse(tr)}catch(Ja){return ss.push("Parameter string value must be valid JSON"),ss}ki&&ki.has("required")&&Vs(El.isList)&&El.isList()&&(0,X.default)(El).call(El,function(Ja){void 0===eg[Ja]&&ss.push({propKey:Ja,error:"Required property not found"})}),ki&&ki.has("properties")&&(0,X.default)(Yg=ki.get("properties")).call(Yg,function(Ja,Du){var ed=kr(eg[Du],Ja,!1,Gi,ws);ss.push.apply(ss,(0,o.default)((0,w.default)(ed).call(ed,function(Xv){return{propKey:Du,error:Xv}})))})}if(q_){var mm=function(Ja,Du){if(!new RegExp(Du).test(Ja))return"Value must follow pattern "+Du}(tr,q_);mm&&ss.push(mm)}if(ap&&"array"===Ti){var Fp=function(Ja,Du){var ed;if(!Ja&&Du>=1||Ja&&Ja.length<Du)return(0,V.default)(ed="Array must contain at least ".concat(Du," item")).call(ed,1===Du?"":"s")}(tr,ap);Fp&&ss.push(Fp)}if(Yl&&"array"===Ti){var MC=function(Ja,Du){var ed;if(Ja&&Ja.length>Du)return(0,V.default)(ed="Array must not contain more then ".concat(Du," item")).call(ed,1===Du?"":"s")}(tr,Yl);MC&&ss.push({needRemove:!0,error:MC})}if(ah&&"array"===Ti){var Pd=function(Ja,Du){if(Ja&&("true"===Du||!0===Du)){var ed=(0,Ht.fromJS)(Ja),Xv=ed.toSet();if(Ja.length>Xv.size){var nv=(0,Ht.Set)();if((0,X.default)(ed).call(ed,function(qv,kp){(0,re.default)(ed).call(ed,function(rv){return Vs(rv.equals)?rv.equals(qv):rv===qv}).size>1&&(nv=nv.add(kp))}),0!==nv.size)return(0,w.default)(nv).call(nv,function(qv){return{index:qv,error:"No duplicates allowed."}}).toArray()}}}(tr,ah);Pd&&ss.push.apply(ss,(0,o.default)(Pd))}if(mu||0===mu){var OC=function(Ja,Du){var ed;if(Ja.length>Du)return(0,V.default)(ed="Value must be no longer than ".concat(Du," character")).call(ed,1!==Du?"s":"")}(tr,mu);OC&&ss.push(OC)}if(jf){var KE=function(Ja,Du){var ed;if(Ja.length<Du)return(0,V.default)(ed="Value must be at least ".concat(Du," character")).call(ed,1!==Du?"s":"")}(tr,jf);KE&&ss.push(KE)}if(dl||0===dl){var AC=function(Ja,Du){if(Ja>Du)return"Value must be less than ".concat(Du)}(tr,dl);AC&&ss.push(AC)}if(Ha||0===Ha){var DC=function(Ja,Du){if(Ja<Du)return"Value must be greater than ".concat(Du)}(tr,Ha);DC&&ss.push(DC)}if("string"===Ti){var XE;if(!(XE="date-time"===Ju?function(Ja){if(isNaN(Date.parse(Ja)))return"Value must be a DateTime"}(tr):"uuid"===Ju?function(Ja){if(Ja=Ja.toString().toLowerCase(),!/^[{(]?[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}[)}]?$/.test(Ja))return"Value must be a Guid"}(tr):function(Ja){if(Ja&&"string"!=typeof Ja)return"Value must be a string"}(tr)))return ss;ss.push(XE)}else if("boolean"===Ti){var P0=function(Ja){if("true"!==Ja&&"false"!==Ja&&!0!==Ja&&!1!==Ja)return"Value must be a boolean"}(tr);if(!P0)return ss;ss.push(P0)}else if("number"===Ti){var wC=function(Ja){if(!/^-?\d+(\.?\d+)?$/.test(Ja))return"Value must be a number"}(tr);if(!wC)return ss;ss.push(wC)}else if("integer"===Ti){var xC=function(Ja){if(!/^-?\d+$/.test(Ja))return"Value must be an integer"}(tr);if(!xC)return ss;ss.push(xC)}else if("array"===Ti){if(!tv&&!uh)return ss;tr&&(0,X.default)(tr).call(tr,function(Ja,Du){var ed=kr(Ja,ki.get("items"),!1,Gi,ws);ss.push.apply(ss,(0,o.default)((0,w.default)(ed).call(ed,function(Xv){return{index:Du,error:Xv}})))})}else if("file"===Ti){var RC=function(Ja){if(Ja&&!(Ja instanceof Un.Z.File))return"Value must be a file"}(tr);if(!RC)return ss;ss.push(RC)}return ss}var Ni=function(tr,ki){var us=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{},Gi=us.isOAS3,ws=void 0!==Gi&&Gi,ss=us.bypassRequiredCheck,eu=void 0!==ss&&ss,El=tr.get("required"),dl=(0,ir.Z)(tr,{isOAS3:ws}),Ha=dl.schema,Ti=dl.parameterContentMediaType;return kr(ki,Ha,El,eu,Ti)},Zs=function(tr,ki,us){if(tr&&(!tr.xml||!tr.xml.name)){if(tr.xml=tr.xml||{},!tr.$$ref)return tr.type||tr.items||tr.properties||tr.additionalProperties?'<?xml version="1.0" encoding="UTF-8"?>\n\x3c!-- XML example cannot be generated; root element name is undefined --\x3e':null;var Gi=tr.$$ref.match(/\S*\/(\S+)$/);tr.xml.name=Gi[1]}return(0,En.memoizedCreateXMLExample)(tr,ki,us)},Vo=[{when:/json/,shouldStringifyTypes:["string"]}],il=["object"],_l=function(tr,ki,us,Gi){var ws=(0,En.memoizedSampleFromSchema)(tr,ki,Gi),ss=(0,l.default)(ws),eu=(0,fe.default)(Vo).call(Vo,function(El,dl){var Ha;return dl.when.test(us)?(0,V.default)(Ha=[]).call(Ha,(0,o.default)(El),(0,o.default)(dl.shouldStringifyTypes)):El},il);return(0,Ir.default)(eu,function(El){return El===ss})?(0,Ae.default)(ws,null,2):ws},zl=function(tr,ki,us,Gi){var ws,ss=_l(tr,ki,us,Gi);try{"\n"===(ws=Yi.default.dump(Yi.default.load(ss),{lineWidth:-1},{schema:Yi.JSON_SCHEMA}))[ws.length-1]&&(ws=(0,De.default)(ws).call(ws,0,ws.length-1))}catch(eu){return console.error(eu),"error: could not generate yaml example"}return ws.replace(/\t/g,"  ")},Wu=function(tr){var ki=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"",us=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{},Gi=arguments.length>3&&void 0!==arguments[3]?arguments[3]:void 0;return tr&&Vs(tr.toJS)&&(tr=tr.toJS()),Gi&&Vs(Gi.toJS)&&(Gi=Gi.toJS()),/xml/.test(ki)?Zs(tr,us,Gi):/(yaml|yml)/.test(ki)?zl(tr,us,ki,Gi):_l(tr,us,ki,Gi)},Yf=function(){var tr={},ki=Un.Z.location.search;if(!ki)return{};if(""!=ki){var us=ki.substr(1).split("&");for(var Gi in us)Object.prototype.hasOwnProperty.call(us,Gi)&&(Gi=us[Gi].split("="),tr[decodeURIComponent(Gi[0])]=Gi[1]&&decodeURIComponent(Gi[1])||"")}return tr},xl=function(tr){return(tr instanceof jr?tr:jr.from(tr.toString(),"utf-8")).toString("base64")},Zc={operationsSorter:{alpha:function(tr,ki){return tr.get("path").localeCompare(ki.get("path"))},method:function(tr,ki){return tr.get("method").localeCompare(ki.get("method"))}},tagsSorter:{alpha:function(tr,ki){return tr.localeCompare(ki)}}},gp=function(tr){var ki=[];for(var us in tr){var Gi=tr[us];void 0!==Gi&&""!==Gi&&ki.push([us,"=",encodeURIComponent(Gi).replace(/%20/g,"+")].join(""))}return ki.join("&")},Bh=function(tr,ki,us){return!!(0,Yr.default)(us,function(Gi){return(0,Hr.default)(tr[Gi],ki[Gi])})};function sh(tr){return"string"!=typeof tr||""===tr?"":(0,yn.sanitizeUrl)(tr)}function Uh(tr){return!(!tr||(0,Y.default)(tr).call(tr,"localhost")>=0||(0,Y.default)(tr).call(tr,"127.0.0.1")>=0||"none"===tr)}function Vl(tr){if(!Ht.default.OrderedMap.isOrderedMap(tr)||!tr.size)return null;var ki=(0,Et.default)(tr).call(tr,function(ws,ss){return(0,ft.default)(ss).call(ss,"2")&&(0,oe.default)(ws.get("content")||{}).length>0}),us=tr.get("default")||Ht.default.OrderedMap(),Gi=(us.get("content")||Ht.default.OrderedMap()).keySeq().toJS().length?us:null;return ki||Gi}var Bc=function(tr){return"string"==typeof tr||tr instanceof String?(0,xt.default)(tr).call(tr).replace(/\s/g,"%20"):""},Lp=function(tr){return(0,Yn.default)(Bc(tr).replace(/%20/g,"_"))},ji=function(tr){return(0,re.default)(tr).call(tr,function(ki,us){return/^x-/.test(us)})},lr=function(tr){return(0,re.default)(tr).call(tr,function(ki,us){return/^pattern|maxLength|minLength|maximum|minimum/.test(us)})};function yi(tr,ki){var us,Gi=arguments.length>2&&void 0!==arguments[2]?arguments[2]:function(){return!0};if("object"!==(0,l.default)(tr)||(0,M.default)(tr)||null===tr||!ki)return tr;var ws=(0,ve.default)({},tr);return(0,X.default)(us=(0,oe.default)(ws)).call(us,function(ss){ss===ki&&Gi(ws[ss],ss)?delete ws[ss]:ws[ss]=yi(ws[ss],ki,Gi)}),ws}function qi(tr){if("string"==typeof tr)return tr;if(tr&&tr.toJS&&(tr=tr.toJS()),"object"===(0,l.default)(tr)&&null!==tr)try{return(0,Ae.default)(tr,null,2)}catch(ki){return String(tr)}return null==tr?"":tr.toString()}function Po(tr){return"number"==typeof tr?tr.toString():tr}function qo(tr){var ki=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},us=ki.returnAll,Gi=void 0!==us&&us,ws=ki.allowHashes,ss=void 0===ws||ws;if(!Ht.default.Map.isMap(tr))throw new Error("paramToIdentifier: received a non-Im.Map parameter as input");var eu,El,dl,Ha=tr.get("name"),Ti=tr.get("in"),Ju=[];return tr&&tr.hashCode&&Ti&&Ha&&ss&&Ju.push((0,V.default)(eu=(0,V.default)(El="".concat(Ti,".")).call(El,Ha,".hash-")).call(eu,tr.hashCode())),Ti&&Ha&&Ju.push((0,V.default)(dl="".concat(Ti,".")).call(dl,Ha)),Ju.push(Ha),Gi?Ju:Ju[0]||""}function os(tr,ki){var us,Gi=qo(tr,{returnAll:!0});return(0,re.default)(us=(0,w.default)(Gi).call(Gi,function(ws){return ki[ws]})).call(us,function(ws){return void 0!==ws})[0]}function fs(){return el(Lr()(32).toString("base64"))}function _a(tr){return el(Mi()("sha256").update(tr).digest("base64"))}function el(tr){return tr.replace(/\+/g,"-").replace(/\//g,"_").replace(/=/g,"")}var gu=function(tr){return!tr||!(!fn(tr)||!tr.isEmpty())}},2518:(n,s,t)=>{function o(l){return function(_){try{return!!JSON.parse(_)}catch(M){return null}}(l)?"json":null}t.d(s,{O:()=>o})},7504:(n,s,t)=>{t.d(s,{Z:()=>o});const o=function(){var l={location:{},history:{},open:function(){},close:function(){},File:function(){}};if("undefined"==typeof window)return l;try{l=window;for(var _=0,M=["File","Blob","FormData"];_<M.length;_++){var w=M[_];w in window&&(l[w]=window[w])}}catch(N){console.error(N)}return l}()},9069:(n,s,t)=>{t.d(s,{Z:()=>w});var o=t(6145),l=t(2372),_=t(9725),M=_.default.Set.of("type","format","items","default","maximum","exclusiveMaximum","minimum","exclusiveMinimum","maxLength","minLength","pattern","maxItems","minItems","uniqueItems","enum","multipleOf");function w(N){var V=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},X=V.isOAS3;if(!_.default.Map.isMap(N))return{schema:_.default.Map(),parameterContentMediaType:null};if(!X)return"body"===N.get("in")?{schema:N.get("schema",_.default.Map()),parameterContentMediaType:null}:{schema:(0,o.default)(N).call(N,function(fe,ve){return(0,l.default)(M).call(M,ve)}),parameterContentMediaType:null};if(N.get("content")){var re=N.get("content",_.default.Map({})).keySeq(),oe=re.first();return{schema:N.getIn(["content",oe,"schema"],_.default.Map()),parameterContentMediaType:oe}}return{schema:N.get("schema",_.default.Map()),parameterContentMediaType:null}}},8287:(n,s,t)=>{t.d(s,{Z:()=>ft});var o=t(7344),l=t(8656);const _=(t.d(Ht={},{default:()=>_C}),Ht),M=(xt=>{var Ht={};return t.d(Ht,xt),Ht})({default:()=>Wv});var Ht,w=t(9972),N=t(5416);const V=(xt=>{var Ht={};return t.d(Ht,xt),Ht})({default:()=>OA});var X=t(4163),re=t(7930),oe=t(8898),fe=t(5487),ve=t(1778);const Pe=(xt=>{var Ht={};return t.d(Ht,xt),Ht})({default:()=>n5()});var De=t(6914),Ie=t(5476),Ae=function(xt){return function(Ht){return(0,X.default)(xt)&&(0,X.default)(Ht)&&xt.length===Ht.length&&(0,re.default)(xt).call(xt,function(yn,It){return yn===Ht[It]})}},Y=function(){for(var xt=arguments.length,Ht=new Array(xt),yn=0;yn<xt;yn++)Ht[yn]=arguments[yn];return Ht},Et=function(xt){(0,w.default)(yn,xt);var Ht=(0,N.default)(yn);function yn(){return(0,o.default)(this,yn),Ht.apply(this,arguments)}return(0,l.default)(yn,[{key:"delete",value:function(It){var In=(0,oe.default)((0,fe.default)(this).call(this)),On=(0,ve.default)(In).call(In,Ae(It));return(0,_.default)((0,M.default)(yn.prototype),"delete",this).call(this,On)}},{key:"get",value:function(It){var In=(0,oe.default)((0,fe.default)(this).call(this)),On=(0,ve.default)(In).call(In,Ae(It));return(0,_.default)((0,M.default)(yn.prototype),"get",this).call(this,On)}},{key:"has",value:function(It){var In=(0,oe.default)((0,fe.default)(this).call(this));return-1!==(0,Pe.default)(In).call(In,Ae(It))}}]),yn}((0,V.default)(De.default));const ft=function(xt){var Ht=arguments.length>1&&void 0!==arguments[1]?arguments[1]:Y,yn=Ie.default.Cache;Ie.default.Cache=Et;var It=(0,Ie.default)(xt,Ht);return Ie.default.Cache=yn,It}},8764:(n,s,t)=>{const o=t(4780),l=t(3294),_="function"==typeof Symbol&&"function"==typeof Symbol.for?Symbol.for("nodejs.util.inspect.custom"):null;s.Buffer=N,s.SlowBuffer=function(Ye){return+Ye!=Ye&&(Ye=0),N.alloc(+Ye)},s.INSPECT_MAX_BYTES=50;const M=2147483647;function w(Ye){if(Ye>M)throw new RangeError('The value "'+Ye+'" is invalid for option "size"');const Ct=new Uint8Array(Ye);return Object.setPrototypeOf(Ct,N.prototype),Ct}function N(Ye,Ct,bt){if("number"==typeof Ye){if("string"==typeof Ct)throw new TypeError('The "string" argument must be of type string. Received type number');return re(Ye)}return V(Ye,Ct,bt)}function V(Ye,Ct,bt){if("string"==typeof Ye)return function(kr,Ni){if("string"==typeof Ni&&""!==Ni||(Ni="utf8"),!N.isEncoding(Ni))throw new TypeError("Unknown encoding: "+Ni);const Zs=0|Pe(kr,Ni);let Vo=w(Zs);const il=Vo.write(kr,Ni);return il!==Zs&&(Vo=Vo.slice(0,il)),Vo}(Ye,Ct);if(ArrayBuffer.isView(Ye))return function(kr){if(Vs(kr,Uint8Array)){const Ni=new Uint8Array(kr);return fe(Ni.buffer,Ni.byteOffset,Ni.byteLength)}return oe(kr)}(Ye);if(null==Ye)throw new TypeError("The first argument must be one of type string, Buffer, ArrayBuffer, Array, or Array-like Object. Received type "+typeof Ye);if(Vs(Ye,ArrayBuffer)||Ye&&Vs(Ye.buffer,ArrayBuffer)||"undefined"!=typeof SharedArrayBuffer&&(Vs(Ye,SharedArrayBuffer)||Ye&&Vs(Ye.buffer,SharedArrayBuffer)))return fe(Ye,Ct,bt);if("number"==typeof Ye)throw new TypeError('The "value" argument must not be of type number. Received type number');const Vn=Ye.valueOf&&Ye.valueOf();if(null!=Vn&&Vn!==Ye)return N.from(Vn,Ct,bt);const Mr=function(kr){if(N.isBuffer(kr)){const Ni=0|ve(kr.length),Zs=w(Ni);return 0===Zs.length||kr.copy(Zs,0,0,Ni),Zs}return void 0!==kr.length?"number"!=typeof kr.length||Qs(kr.length)?w(0):oe(kr):"Buffer"===kr.type&&Array.isArray(kr.data)?oe(kr.data):void 0}(Ye);if(Mr)return Mr;if("undefined"!=typeof Symbol&&null!=Symbol.toPrimitive&&"function"==typeof Ye[Symbol.toPrimitive])return N.from(Ye[Symbol.toPrimitive]("string"),Ct,bt);throw new TypeError("The first argument must be one of type string, Buffer, ArrayBuffer, Array, or Array-like Object. Received type "+typeof Ye)}function X(Ye){if("number"!=typeof Ye)throw new TypeError('"size" argument must be of type number');if(Ye<0)throw new RangeError('The value "'+Ye+'" is invalid for option "size"')}function re(Ye){return X(Ye),w(Ye<0?0:0|ve(Ye))}function oe(Ye){const Ct=Ye.length<0?0:0|ve(Ye.length),bt=w(Ct);for(let Vn=0;Vn<Ct;Vn+=1)bt[Vn]=255&Ye[Vn];return bt}function fe(Ye,Ct,bt){if(Ct<0||Ye.byteLength<Ct)throw new RangeError('"offset" is outside of buffer bounds');if(Ye.byteLength<Ct+(bt||0))throw new RangeError('"length" is outside of buffer bounds');let Vn;return Vn=void 0===Ct&&void 0===bt?new Uint8Array(Ye):void 0===bt?new Uint8Array(Ye,Ct):new Uint8Array(Ye,Ct,bt),Object.setPrototypeOf(Vn,N.prototype),Vn}function ve(Ye){if(Ye>=M)throw new RangeError("Attempt to allocate Buffer larger than maximum size: 0x"+M.toString(16)+" bytes");return 0|Ye}function Pe(Ye,Ct){if(N.isBuffer(Ye))return Ye.length;if(ArrayBuffer.isView(Ye)||Vs(Ye,ArrayBuffer))return Ye.byteLength;if("string"!=typeof Ye)throw new TypeError('The "string" argument must be one of type string, Buffer, or ArrayBuffer. Received type '+typeof Ye);const bt=Ye.length,Vn=arguments.length>2&&!0===arguments[2];if(!Vn&&0===bt)return 0;let Mr=!1;for(;;)switch(Ct){case"ascii":case"latin1":case"binary":return bt;case"utf8":case"utf-8":return Ji(Ye).length;case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":return 2*bt;case"hex":return bt>>>1;case"base64":return Ho(Ye).length;default:if(Mr)return Vn?-1:Ji(Ye).length;Ct=(""+Ct).toLowerCase(),Mr=!0}}function De(Ye,Ct,bt){let Vn=!1;if((void 0===Ct||Ct<0)&&(Ct=0),Ct>this.length||((void 0===bt||bt>this.length)&&(bt=this.length),bt<=0)||(bt>>>=0)<=(Ct>>>=0))return"";for(Ye||(Ye="utf8");;)switch(Ye){case"hex":return Hr(this,Ct,bt);case"utf8":case"utf-8":return In(this,Ct,bt);case"ascii":return Yr(this,Ct,bt);case"latin1":case"binary":return Ir(this,Ct,bt);case"base64":return It(this,Ct,bt);case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":return Wr(this,Ct,bt);default:if(Vn)throw new TypeError("Unknown encoding: "+Ye);Ye=(Ye+"").toLowerCase(),Vn=!0}}function Ie(Ye,Ct,bt){const Vn=Ye[Ct];Ye[Ct]=Ye[bt],Ye[bt]=Vn}function Ae(Ye,Ct,bt,Vn,Mr){if(0===Ye.length)return-1;if("string"==typeof bt?(Vn=bt,bt=0):bt>2147483647?bt=2147483647:bt<-2147483648&&(bt=-2147483648),Qs(bt=+bt)&&(bt=Mr?0:Ye.length-1),bt<0&&(bt=Ye.length+bt),bt>=Ye.length){if(Mr)return-1;bt=Ye.length-1}else if(bt<0){if(!Mr)return-1;bt=0}if("string"==typeof Ct&&(Ct=N.from(Ct,Vn)),N.isBuffer(Ct))return 0===Ct.length?-1:Y(Ye,Ct,bt,Vn,Mr);if("number"==typeof Ct)return Ct&=255,"function"==typeof Uint8Array.prototype.indexOf?Mr?Uint8Array.prototype.indexOf.call(Ye,Ct,bt):Uint8Array.prototype.lastIndexOf.call(Ye,Ct,bt):Y(Ye,[Ct],bt,Vn,Mr);throw new TypeError("val must be string, number or Buffer")}function Y(Ye,Ct,bt,Vn,Mr){let kr,Ni=1,Zs=Ye.length,Vo=Ct.length;if(void 0!==Vn&&("ucs2"===(Vn=String(Vn).toLowerCase())||"ucs-2"===Vn||"utf16le"===Vn||"utf-16le"===Vn)){if(Ye.length<2||Ct.length<2)return-1;Ni=2,Zs/=2,Vo/=2,bt/=2}function il(_l,zl){return 1===Ni?_l[zl]:_l.readUInt16BE(zl*Ni)}if(Mr){let _l=-1;for(kr=bt;kr<Zs;kr++)if(il(Ye,kr)===il(Ct,-1===_l?0:kr-_l)){if(-1===_l&&(_l=kr),kr-_l+1===Vo)return _l*Ni}else-1!==_l&&(kr-=kr-_l),_l=-1}else for(bt+Vo>Zs&&(bt=Zs-Vo),kr=bt;kr>=0;kr--){let _l=!0;for(let zl=0;zl<Vo;zl++)if(il(Ye,kr+zl)!==il(Ct,zl)){_l=!1;break}if(_l)return kr}return-1}function Et(Ye,Ct,bt,Vn){bt=Number(bt)||0;const Mr=Ye.length-bt;Vn?(Vn=Number(Vn))>Mr&&(Vn=Mr):Vn=Mr;const kr=Ct.length;let Ni;for(Vn>kr/2&&(Vn=kr/2),Ni=0;Ni<Vn;++Ni){const Zs=parseInt(Ct.substr(2*Ni,2),16);if(Qs(Zs))return Ni;Ye[bt+Ni]=Zs}return Ni}function ft(Ye,Ct,bt,Vn){return Ao(Ji(Ct,Ye.length-bt),Ye,bt,Vn)}function xt(Ye,Ct,bt,Vn){return Ao(function(Mr){const kr=[];for(let Ni=0;Ni<Mr.length;++Ni)kr.push(255&Mr.charCodeAt(Ni));return kr}(Ct),Ye,bt,Vn)}function Ht(Ye,Ct,bt,Vn){return Ao(Ho(Ct),Ye,bt,Vn)}function yn(Ye,Ct,bt,Vn){return Ao(function(Mr,kr){let Ni,Zs,Vo;const il=[];for(let _l=0;_l<Mr.length&&!((kr-=2)<0);++_l)Ni=Mr.charCodeAt(_l),Zs=Ni>>8,Vo=Ni%256,il.push(Vo),il.push(Zs);return il}(Ct,Ye.length-bt),Ye,bt,Vn)}function It(Ye,Ct,bt){return o.fromByteArray(0===Ct&&bt===Ye.length?Ye:Ye.slice(Ct,bt))}function In(Ye,Ct,bt){bt=Math.min(Ye.length,bt);const Vn=[];let Mr=Ct;for(;Mr<bt;){const kr=Ye[Mr];let Ni=null,Zs=kr>239?4:kr>223?3:kr>191?2:1;if(Mr+Zs<=bt){let Vo,il,_l,zl;switch(Zs){case 1:kr<128&&(Ni=kr);break;case 2:Vo=Ye[Mr+1],128==(192&Vo)&&(zl=(31&kr)<<6|63&Vo,zl>127&&(Ni=zl));break;case 3:Vo=Ye[Mr+1],il=Ye[Mr+2],128==(192&Vo)&&128==(192&il)&&(zl=(15&kr)<<12|(63&Vo)<<6|63&il,zl>2047&&(zl<55296||zl>57343)&&(Ni=zl));break;case 4:Vo=Ye[Mr+1],il=Ye[Mr+2],_l=Ye[Mr+3],128==(192&Vo)&&128==(192&il)&&128==(192&_l)&&(zl=(15&kr)<<18|(63&Vo)<<12|(63&il)<<6|63&_l,zl>65535&&zl<1114112&&(Ni=zl))}}null===Ni?(Ni=65533,Zs=1):Ni>65535&&(Ni-=65536,Vn.push(Ni>>>10&1023|55296),Ni=56320|1023&Ni),Vn.push(Ni),Mr+=Zs}return function(kr){const Ni=kr.length;if(Ni<=On)return String.fromCharCode.apply(String,kr);let Zs="",Vo=0;for(;Vo<Ni;)Zs+=String.fromCharCode.apply(String,kr.slice(Vo,Vo+=On));return Zs}(Vn)}s.kMaxLength=M,(N.TYPED_ARRAY_SUPPORT=function(){try{const Ye=new Uint8Array(1),Ct={foo:function(){return 42}};return Object.setPrototypeOf(Ct,Uint8Array.prototype),Object.setPrototypeOf(Ye,Ct),42===Ye.foo()}catch(Ye){return!1}}())||"undefined"==typeof console||"function"!=typeof console.error||console.error("This browser lacks typed array (Uint8Array) support which is required by `buffer` v5.x. Use `buffer` v4.x if you require old browser support."),Object.defineProperty(N.prototype,"parent",{enumerable:!0,get:function(){if(N.isBuffer(this))return this.buffer}}),Object.defineProperty(N.prototype,"offset",{enumerable:!0,get:function(){if(N.isBuffer(this))return this.byteOffset}}),N.poolSize=8192,N.from=function(Ye,Ct,bt){return V(Ye,Ct,bt)},Object.setPrototypeOf(N.prototype,Uint8Array.prototype),Object.setPrototypeOf(N,Uint8Array),N.alloc=function(Ye,Ct,bt){return Mr=Ct,kr=bt,X(Vn=Ye),Vn<=0?w(Vn):void 0!==Mr?"string"==typeof kr?w(Vn).fill(Mr,kr):w(Vn).fill(Mr):w(Vn);var Vn,Mr,kr},N.allocUnsafe=function(Ye){return re(Ye)},N.allocUnsafeSlow=function(Ye){return re(Ye)},N.isBuffer=function(Ye){return null!=Ye&&!0===Ye._isBuffer&&Ye!==N.prototype},N.compare=function(Ye,Ct){if(Vs(Ye,Uint8Array)&&(Ye=N.from(Ye,Ye.offset,Ye.byteLength)),Vs(Ct,Uint8Array)&&(Ct=N.from(Ct,Ct.offset,Ct.byteLength)),!N.isBuffer(Ye)||!N.isBuffer(Ct))throw new TypeError('The "buf1", "buf2" arguments must be one of type Buffer or Uint8Array');if(Ye===Ct)return 0;let bt=Ye.length,Vn=Ct.length;for(let Mr=0,kr=Math.min(bt,Vn);Mr<kr;++Mr)if(Ye[Mr]!==Ct[Mr]){bt=Ye[Mr],Vn=Ct[Mr];break}return bt<Vn?-1:Vn<bt?1:0},N.isEncoding=function(Ye){switch(String(Ye).toLowerCase()){case"hex":case"utf8":case"utf-8":case"ascii":case"latin1":case"binary":case"base64":case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":return!0;default:return!1}},N.concat=function(Ye,Ct){if(!Array.isArray(Ye))throw new TypeError('"list" argument must be an Array of Buffers');if(0===Ye.length)return N.alloc(0);let bt;if(void 0===Ct)for(Ct=0,bt=0;bt<Ye.length;++bt)Ct+=Ye[bt].length;const Vn=N.allocUnsafe(Ct);let Mr=0;for(bt=0;bt<Ye.length;++bt){let kr=Ye[bt];if(Vs(kr,Uint8Array))Mr+kr.length>Vn.length?(N.isBuffer(kr)||(kr=N.from(kr)),kr.copy(Vn,Mr)):Uint8Array.prototype.set.call(Vn,kr,Mr);else{if(!N.isBuffer(kr))throw new TypeError('"list" argument must be an Array of Buffers');kr.copy(Vn,Mr)}Mr+=kr.length}return Vn},N.byteLength=Pe,N.prototype._isBuffer=!0,N.prototype.swap16=function(){const Ye=this.length;if(Ye%2!=0)throw new RangeError("Buffer size must be a multiple of 16-bits");for(let Ct=0;Ct<Ye;Ct+=2)Ie(this,Ct,Ct+1);return this},N.prototype.swap32=function(){const Ye=this.length;if(Ye%4!=0)throw new RangeError("Buffer size must be a multiple of 32-bits");for(let Ct=0;Ct<Ye;Ct+=4)Ie(this,Ct,Ct+3),Ie(this,Ct+1,Ct+2);return this},N.prototype.swap64=function(){const Ye=this.length;if(Ye%8!=0)throw new RangeError("Buffer size must be a multiple of 64-bits");for(let Ct=0;Ct<Ye;Ct+=8)Ie(this,Ct,Ct+7),Ie(this,Ct+1,Ct+6),Ie(this,Ct+2,Ct+5),Ie(this,Ct+3,Ct+4);return this},N.prototype.toLocaleString=N.prototype.toString=function(){const Ye=this.length;return 0===Ye?"":0===arguments.length?In(this,0,Ye):De.apply(this,arguments)},N.prototype.equals=function(Ye){if(!N.isBuffer(Ye))throw new TypeError("Argument must be a Buffer");return this===Ye||0===N.compare(this,Ye)},N.prototype.inspect=function(){let Ye="";const Ct=s.INSPECT_MAX_BYTES;return Ye=this.toString("hex",0,Ct).replace(/(.{2})/g,"$1 ").trim(),this.length>Ct&&(Ye+=" ... "),"<Buffer "+Ye+">"},_&&(N.prototype[_]=N.prototype.inspect),N.prototype.compare=function(Ye,Ct,bt,Vn,Mr){if(Vs(Ye,Uint8Array)&&(Ye=N.from(Ye,Ye.offset,Ye.byteLength)),!N.isBuffer(Ye))throw new TypeError('The "target" argument must be one of type Buffer or Uint8Array. Received type '+typeof Ye);if(void 0===Ct&&(Ct=0),void 0===bt&&(bt=Ye?Ye.length:0),void 0===Vn&&(Vn=0),void 0===Mr&&(Mr=this.length),Ct<0||bt>Ye.length||Vn<0||Mr>this.length)throw new RangeError("out of range index");if(Vn>=Mr&&Ct>=bt)return 0;if(Vn>=Mr)return-1;if(Ct>=bt)return 1;if(this===Ye)return 0;let kr=(Mr>>>=0)-(Vn>>>=0),Ni=(bt>>>=0)-(Ct>>>=0);const Zs=Math.min(kr,Ni),Vo=this.slice(Vn,Mr),il=Ye.slice(Ct,bt);for(let _l=0;_l<Zs;++_l)if(Vo[_l]!==il[_l]){kr=Vo[_l],Ni=il[_l];break}return kr<Ni?-1:Ni<kr?1:0},N.prototype.includes=function(Ye,Ct,bt){return-1!==this.indexOf(Ye,Ct,bt)},N.prototype.indexOf=function(Ye,Ct,bt){return Ae(this,Ye,Ct,bt,!0)},N.prototype.lastIndexOf=function(Ye,Ct,bt){return Ae(this,Ye,Ct,bt,!1)},N.prototype.write=function(Ye,Ct,bt,Vn){if(void 0===Ct)Vn="utf8",bt=this.length,Ct=0;else if(void 0===bt&&"string"==typeof Ct)Vn=Ct,bt=this.length,Ct=0;else{if(!isFinite(Ct))throw new Error("Buffer.write(string, encoding, offset[, length]) is no longer supported");Ct>>>=0,isFinite(bt)?(bt>>>=0,void 0===Vn&&(Vn="utf8")):(Vn=bt,bt=void 0)}const Mr=this.length-Ct;if((void 0===bt||bt>Mr)&&(bt=Mr),Ye.length>0&&(bt<0||Ct<0)||Ct>this.length)throw new RangeError("Attempt to write outside buffer bounds");Vn||(Vn="utf8");let kr=!1;for(;;)switch(Vn){case"hex":return Et(this,Ye,Ct,bt);case"utf8":case"utf-8":return ft(this,Ye,Ct,bt);case"ascii":case"latin1":case"binary":return xt(this,Ye,Ct,bt);case"base64":return Ht(this,Ye,Ct,bt);case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":return yn(this,Ye,Ct,bt);default:if(kr)throw new TypeError("Unknown encoding: "+Vn);Vn=(""+Vn).toLowerCase(),kr=!0}},N.prototype.toJSON=function(){return{type:"Buffer",data:Array.prototype.slice.call(this._arr||this,0)}};const On=4096;function Yr(Ye,Ct,bt){let Vn="";bt=Math.min(Ye.length,bt);for(let Mr=Ct;Mr<bt;++Mr)Vn+=String.fromCharCode(127&Ye[Mr]);return Vn}function Ir(Ye,Ct,bt){let Vn="";bt=Math.min(Ye.length,bt);for(let Mr=Ct;Mr<bt;++Mr)Vn+=String.fromCharCode(Ye[Mr]);return Vn}function Hr(Ye,Ct,bt){const Vn=Ye.length;(!Ct||Ct<0)&&(Ct=0),(!bt||bt<0||bt>Vn)&&(bt=Vn);let Mr="";for(let kr=Ct;kr<bt;++kr)Mr+=Ri[Ye[kr]];return Mr}function Wr(Ye,Ct,bt){const Vn=Ye.slice(Ct,bt);let Mr="";for(let kr=0;kr<Vn.length-1;kr+=2)Mr+=String.fromCharCode(Vn[kr]+256*Vn[kr+1]);return Mr}function En(Ye,Ct,bt){if(Ye%1!=0||Ye<0)throw new RangeError("offset is not uint");if(Ye+Ct>bt)throw new RangeError("Trying to access beyond buffer length")}function Un(Ye,Ct,bt,Vn,Mr,kr){if(!N.isBuffer(Ye))throw new TypeError('"buffer" argument must be a Buffer instance');if(Ct>Mr||Ct<kr)throw new RangeError('"value" argument is out of bounds');if(bt+Vn>Ye.length)throw new RangeError("Index out of range")}function Yn(Ye,Ct,bt,Vn,Mr){Nn(Ct,Vn,Mr,Ye,bt,7);let kr=Number(Ct&BigInt(4294967295));Ye[bt++]=kr,kr>>=8,Ye[bt++]=kr,kr>>=8,Ye[bt++]=kr,kr>>=8,Ye[bt++]=kr;let Ni=Number(Ct>>BigInt(32)&BigInt(4294967295));return Ye[bt++]=Ni,Ni>>=8,Ye[bt++]=Ni,Ni>>=8,Ye[bt++]=Ni,Ni>>=8,Ye[bt++]=Ni,bt}function ir(Ye,Ct,bt,Vn,Mr){Nn(Ct,Vn,Mr,Ye,bt,7);let kr=Number(Ct&BigInt(4294967295));Ye[bt+7]=kr,kr>>=8,Ye[bt+6]=kr,kr>>=8,Ye[bt+5]=kr,kr>>=8,Ye[bt+4]=kr;let Ni=Number(Ct>>BigInt(32)&BigInt(4294967295));return Ye[bt+3]=Ni,Ni>>=8,Ye[bt+2]=Ni,Ni>>=8,Ye[bt+1]=Ni,Ni>>=8,Ye[bt]=Ni,bt+8}function An(Ye,Ct,bt,Vn,Mr,kr){if(bt+Vn>Ye.length)throw new RangeError("Index out of range");if(bt<0)throw new RangeError("Index out of range")}function Lr(Ye,Ct,bt,Vn,Mr){return Ct=+Ct,bt>>>=0,Mr||An(Ye,0,bt,4),l.write(Ye,Ct,bt,Vn,23,4),bt+4}function Wi(Ye,Ct,bt,Vn,Mr){return Ct=+Ct,bt>>>=0,Mr||An(Ye,0,bt,8),l.write(Ye,Ct,bt,Vn,52,8),bt+8}N.prototype.slice=function(Ye,Ct){const bt=this.length;(Ye=~~Ye)<0?(Ye+=bt)<0&&(Ye=0):Ye>bt&&(Ye=bt),(Ct=void 0===Ct?bt:~~Ct)<0?(Ct+=bt)<0&&(Ct=0):Ct>bt&&(Ct=bt),Ct<Ye&&(Ct=Ye);const Vn=this.subarray(Ye,Ct);return Object.setPrototypeOf(Vn,N.prototype),Vn},N.prototype.readUintLE=N.prototype.readUIntLE=function(Ye,Ct,bt){Ye>>>=0,Ct>>>=0,bt||En(Ye,Ct,this.length);let Vn=this[Ye],Mr=1,kr=0;for(;++kr<Ct&&(Mr*=256);)Vn+=this[Ye+kr]*Mr;return Vn},N.prototype.readUintBE=N.prototype.readUIntBE=function(Ye,Ct,bt){Ye>>>=0,Ct>>>=0,bt||En(Ye,Ct,this.length);let Vn=this[Ye+--Ct],Mr=1;for(;Ct>0&&(Mr*=256);)Vn+=this[Ye+--Ct]*Mr;return Vn},N.prototype.readUint8=N.prototype.readUInt8=function(Ye,Ct){return Ye>>>=0,Ct||En(Ye,1,this.length),this[Ye]},N.prototype.readUint16LE=N.prototype.readUInt16LE=function(Ye,Ct){return Ye>>>=0,Ct||En(Ye,2,this.length),this[Ye]|this[Ye+1]<<8},N.prototype.readUint16BE=N.prototype.readUInt16BE=function(Ye,Ct){return Ye>>>=0,Ct||En(Ye,2,this.length),this[Ye]<<8|this[Ye+1]},N.prototype.readUint32LE=N.prototype.readUInt32LE=function(Ye,Ct){return Ye>>>=0,Ct||En(Ye,4,this.length),(this[Ye]|this[Ye+1]<<8|this[Ye+2]<<16)+16777216*this[Ye+3]},N.prototype.readUint32BE=N.prototype.readUInt32BE=function(Ye,Ct){return Ye>>>=0,Ct||En(Ye,4,this.length),16777216*this[Ye]+(this[Ye+1]<<16|this[Ye+2]<<8|this[Ye+3])},N.prototype.readBigUInt64LE=uo(function(Ye){fn(Ye>>>=0,"offset");const Ct=this[Ye],bt=this[Ye+7];void 0!==Ct&&void 0!==bt||Vr(Ye,this.length-8);const Vn=Ct+256*this[++Ye]+65536*this[++Ye]+this[++Ye]*Gg(2,24),Mr=this[++Ye]+256*this[++Ye]+65536*this[++Ye]+bt*Gg(2,24);return BigInt(Vn)+(BigInt(Mr)<<BigInt(32))}),N.prototype.readBigUInt64BE=uo(function(Ye){fn(Ye>>>=0,"offset");const Ct=this[Ye],bt=this[Ye+7];void 0!==Ct&&void 0!==bt||Vr(Ye,this.length-8);const Vn=Ct*Gg(2,24)+65536*this[++Ye]+256*this[++Ye]+this[++Ye],Mr=this[++Ye]*Gg(2,24)+65536*this[++Ye]+256*this[++Ye]+bt;return(BigInt(Vn)<<BigInt(32))+BigInt(Mr)}),N.prototype.readIntLE=function(Ye,Ct,bt){Ye>>>=0,Ct>>>=0,bt||En(Ye,Ct,this.length);let Vn=this[Ye],Mr=1,kr=0;for(;++kr<Ct&&(Mr*=256);)Vn+=this[Ye+kr]*Mr;return Mr*=128,Vn>=Mr&&(Vn-=Math.pow(2,8*Ct)),Vn},N.prototype.readIntBE=function(Ye,Ct,bt){Ye>>>=0,Ct>>>=0,bt||En(Ye,Ct,this.length);let Vn=Ct,Mr=1,kr=this[Ye+--Vn];for(;Vn>0&&(Mr*=256);)kr+=this[Ye+--Vn]*Mr;return Mr*=128,kr>=Mr&&(kr-=Math.pow(2,8*Ct)),kr},N.prototype.readInt8=function(Ye,Ct){return Ye>>>=0,Ct||En(Ye,1,this.length),128&this[Ye]?-1*(255-this[Ye]+1):this[Ye]},N.prototype.readInt16LE=function(Ye,Ct){Ye>>>=0,Ct||En(Ye,2,this.length);const bt=this[Ye]|this[Ye+1]<<8;return 32768&bt?4294901760|bt:bt},N.prototype.readInt16BE=function(Ye,Ct){Ye>>>=0,Ct||En(Ye,2,this.length);const bt=this[Ye+1]|this[Ye]<<8;return 32768&bt?4294901760|bt:bt},N.prototype.readInt32LE=function(Ye,Ct){return Ye>>>=0,Ct||En(Ye,4,this.length),this[Ye]|this[Ye+1]<<8|this[Ye+2]<<16|this[Ye+3]<<24},N.prototype.readInt32BE=function(Ye,Ct){return Ye>>>=0,Ct||En(Ye,4,this.length),this[Ye]<<24|this[Ye+1]<<16|this[Ye+2]<<8|this[Ye+3]},N.prototype.readBigInt64LE=uo(function(Ye){fn(Ye>>>=0,"offset");const Ct=this[Ye],bt=this[Ye+7];return void 0!==Ct&&void 0!==bt||Vr(Ye,this.length-8),(BigInt(this[Ye+4]+256*this[Ye+5]+65536*this[Ye+6]+(bt<<24))<<BigInt(32))+BigInt(Ct+256*this[++Ye]+65536*this[++Ye]+this[++Ye]*Gg(2,24))}),N.prototype.readBigInt64BE=uo(function(Ye){fn(Ye>>>=0,"offset");const Ct=this[Ye],bt=this[Ye+7];void 0!==Ct&&void 0!==bt||Vr(Ye,this.length-8);const Vn=(Ct<<24)+65536*this[++Ye]+256*this[++Ye]+this[++Ye];return(BigInt(Vn)<<BigInt(32))+BigInt(this[++Ye]*Gg(2,24)+65536*this[++Ye]+256*this[++Ye]+bt)}),N.prototype.readFloatLE=function(Ye,Ct){return Ye>>>=0,Ct||En(Ye,4,this.length),l.read(this,Ye,!0,23,4)},N.prototype.readFloatBE=function(Ye,Ct){return Ye>>>=0,Ct||En(Ye,4,this.length),l.read(this,Ye,!1,23,4)},N.prototype.readDoubleLE=function(Ye,Ct){return Ye>>>=0,Ct||En(Ye,8,this.length),l.read(this,Ye,!0,52,8)},N.prototype.readDoubleBE=function(Ye,Ct){return Ye>>>=0,Ct||En(Ye,8,this.length),l.read(this,Ye,!1,52,8)},N.prototype.writeUintLE=N.prototype.writeUIntLE=function(Ye,Ct,bt,Vn){Ye=+Ye,Ct>>>=0,bt>>>=0,!Vn&&Un(this,Ye,Ct,bt,Math.pow(2,8*bt)-1,0);let Mr=1,kr=0;for(this[Ct]=255&Ye;++kr<bt&&(Mr*=256);)this[Ct+kr]=Ye/Mr&255;return Ct+bt},N.prototype.writeUintBE=N.prototype.writeUIntBE=function(Ye,Ct,bt,Vn){Ye=+Ye,Ct>>>=0,bt>>>=0,!Vn&&Un(this,Ye,Ct,bt,Math.pow(2,8*bt)-1,0);let Mr=bt-1,kr=1;for(this[Ct+Mr]=255&Ye;--Mr>=0&&(kr*=256);)this[Ct+Mr]=Ye/kr&255;return Ct+bt},N.prototype.writeUint8=N.prototype.writeUInt8=function(Ye,Ct,bt){return Ye=+Ye,Ct>>>=0,bt||Un(this,Ye,Ct,1,255,0),this[Ct]=255&Ye,Ct+1},N.prototype.writeUint16LE=N.prototype.writeUInt16LE=function(Ye,Ct,bt){return Ye=+Ye,Ct>>>=0,bt||Un(this,Ye,Ct,2,65535,0),this[Ct]=255&Ye,this[Ct+1]=Ye>>>8,Ct+2},N.prototype.writeUint16BE=N.prototype.writeUInt16BE=function(Ye,Ct,bt){return Ye=+Ye,Ct>>>=0,bt||Un(this,Ye,Ct,2,65535,0),this[Ct]=Ye>>>8,this[Ct+1]=255&Ye,Ct+2},N.prototype.writeUint32LE=N.prototype.writeUInt32LE=function(Ye,Ct,bt){return Ye=+Ye,Ct>>>=0,bt||Un(this,Ye,Ct,4,4294967295,0),this[Ct+3]=Ye>>>24,this[Ct+2]=Ye>>>16,this[Ct+1]=Ye>>>8,this[Ct]=255&Ye,Ct+4},N.prototype.writeUint32BE=N.prototype.writeUInt32BE=function(Ye,Ct,bt){return Ye=+Ye,Ct>>>=0,bt||Un(this,Ye,Ct,4,4294967295,0),this[Ct]=Ye>>>24,this[Ct+1]=Ye>>>16,this[Ct+2]=Ye>>>8,this[Ct+3]=255&Ye,Ct+4},N.prototype.writeBigUInt64LE=uo(function(Ye,Ct=0){return Yn(this,Ye,Ct,BigInt(0),BigInt("0xffffffffffffffff"))}),N.prototype.writeBigUInt64BE=uo(function(Ye,Ct=0){return ir(this,Ye,Ct,BigInt(0),BigInt("0xffffffffffffffff"))}),N.prototype.writeIntLE=function(Ye,Ct,bt,Vn){if(Ye=+Ye,Ct>>>=0,!Vn){const Zs=Math.pow(2,8*bt-1);Un(this,Ye,Ct,bt,Zs-1,-Zs)}let Mr=0,kr=1,Ni=0;for(this[Ct]=255&Ye;++Mr<bt&&(kr*=256);)Ye<0&&0===Ni&&0!==this[Ct+Mr-1]&&(Ni=1),this[Ct+Mr]=(Ye/kr>>0)-Ni&255;return Ct+bt},N.prototype.writeIntBE=function(Ye,Ct,bt,Vn){if(Ye=+Ye,Ct>>>=0,!Vn){const Zs=Math.pow(2,8*bt-1);Un(this,Ye,Ct,bt,Zs-1,-Zs)}let Mr=bt-1,kr=1,Ni=0;for(this[Ct+Mr]=255&Ye;--Mr>=0&&(kr*=256);)Ye<0&&0===Ni&&0!==this[Ct+Mr+1]&&(Ni=1),this[Ct+Mr]=(Ye/kr>>0)-Ni&255;return Ct+bt},N.prototype.writeInt8=function(Ye,Ct,bt){return Ye=+Ye,Ct>>>=0,bt||Un(this,Ye,Ct,1,127,-128),Ye<0&&(Ye=255+Ye+1),this[Ct]=255&Ye,Ct+1},N.prototype.writeInt16LE=function(Ye,Ct,bt){return Ye=+Ye,Ct>>>=0,bt||Un(this,Ye,Ct,2,32767,-32768),this[Ct]=255&Ye,this[Ct+1]=Ye>>>8,Ct+2},N.prototype.writeInt16BE=function(Ye,Ct,bt){return Ye=+Ye,Ct>>>=0,bt||Un(this,Ye,Ct,2,32767,-32768),this[Ct]=Ye>>>8,this[Ct+1]=255&Ye,Ct+2},N.prototype.writeInt32LE=function(Ye,Ct,bt){return Ye=+Ye,Ct>>>=0,bt||Un(this,Ye,Ct,4,2147483647,-2147483648),this[Ct]=255&Ye,this[Ct+1]=Ye>>>8,this[Ct+2]=Ye>>>16,this[Ct+3]=Ye>>>24,Ct+4},N.prototype.writeInt32BE=function(Ye,Ct,bt){return Ye=+Ye,Ct>>>=0,bt||Un(this,Ye,Ct,4,2147483647,-2147483648),Ye<0&&(Ye=4294967295+Ye+1),this[Ct]=Ye>>>24,this[Ct+1]=Ye>>>16,this[Ct+2]=Ye>>>8,this[Ct+3]=255&Ye,Ct+4},N.prototype.writeBigInt64LE=uo(function(Ye,Ct=0){return Yn(this,Ye,Ct,-BigInt("0x8000000000000000"),BigInt("0x7fffffffffffffff"))}),N.prototype.writeBigInt64BE=uo(function(Ye,Ct=0){return ir(this,Ye,Ct,-BigInt("0x8000000000000000"),BigInt("0x7fffffffffffffff"))}),N.prototype.writeFloatLE=function(Ye,Ct,bt){return Lr(this,Ye,Ct,!0,bt)},N.prototype.writeFloatBE=function(Ye,Ct,bt){return Lr(this,Ye,Ct,!1,bt)},N.prototype.writeDoubleLE=function(Ye,Ct,bt){return Wi(this,Ye,Ct,!0,bt)},N.prototype.writeDoubleBE=function(Ye,Ct,bt){return Wi(this,Ye,Ct,!1,bt)},N.prototype.copy=function(Ye,Ct,bt,Vn){if(!N.isBuffer(Ye))throw new TypeError("argument should be a Buffer");if(bt||(bt=0),Vn||0===Vn||(Vn=this.length),Ct>=Ye.length&&(Ct=Ye.length),Ct||(Ct=0),Vn>0&&Vn<bt&&(Vn=bt),Vn===bt||0===Ye.length||0===this.length)return 0;if(Ct<0)throw new RangeError("targetStart out of bounds");if(bt<0||bt>=this.length)throw new RangeError("Index out of range");if(Vn<0)throw new RangeError("sourceEnd out of bounds");Vn>this.length&&(Vn=this.length),Ye.length-Ct<Vn-bt&&(Vn=Ye.length-Ct+bt);const Mr=Vn-bt;return this===Ye&&"function"==typeof Uint8Array.prototype.copyWithin?this.copyWithin(Ct,bt,Vn):Uint8Array.prototype.set.call(Ye,this.subarray(bt,Vn),Ct),Mr},N.prototype.fill=function(Ye,Ct,bt,Vn){if("string"==typeof Ye){if("string"==typeof Ct?(Vn=Ct,Ct=0,bt=this.length):"string"==typeof bt&&(Vn=bt,bt=this.length),void 0!==Vn&&"string"!=typeof Vn)throw new TypeError("encoding must be a string");if("string"==typeof Vn&&!N.isEncoding(Vn))throw new TypeError("Unknown encoding: "+Vn);if(1===Ye.length){const kr=Ye.charCodeAt(0);("utf8"===Vn&&kr<128||"latin1"===Vn)&&(Ye=kr)}}else"number"==typeof Ye?Ye&=255:"boolean"==typeof Ye&&(Ye=Number(Ye));if(Ct<0||this.length<Ct||this.length<bt)throw new RangeError("Out of range index");if(bt<=Ct)return this;let Mr;if(Ct>>>=0,bt=void 0===bt?this.length:bt>>>0,Ye||(Ye=0),"number"==typeof Ye)for(Mr=Ct;Mr<bt;++Mr)this[Mr]=Ye;else{const kr=N.isBuffer(Ye)?Ye:N.from(Ye,Vn),Ni=kr.length;if(0===Ni)throw new TypeError('The value "'+Ye+'" is invalid for argument "value"');for(Mr=0;Mr<bt-Ct;++Mr)this[Mr+Ct]=kr[Mr%Ni]}return this};const Mi={};function Yi(Ye,Ct,bt){Mi[Ye]=class extends bt{constructor(){super(),Object.defineProperty(this,"message",{value:Ct.apply(this,arguments),writable:!0,configurable:!0}),this.name=`${this.name} [${Ye}]`,delete this.name}get code(){return Ye}set code(Vn){Object.defineProperty(this,"code",{configurable:!0,enumerable:!0,value:Vn,writable:!0})}toString(){return`${this.name} [${Ye}]: ${this.message}`}}}function jr(Ye){let Ct="",bt=Ye.length;const Vn="-"===Ye[0]?1:0;for(;bt>=Vn+4;bt-=3)Ct=`_${Ye.slice(bt-3,bt)}${Ct}`;return`${Ye.slice(0,bt)}${Ct}`}function Nn(Ye,Ct,bt,Vn,Mr,kr){if(Ye>bt||Ye<Ct){const Ni="bigint"==typeof Ct?"n":"";let Zs;throw Zs=kr>3?0===Ct||Ct===BigInt(0)?`>= 0${Ni} and < 2${Ni} ** ${8*(kr+1)}${Ni}`:`>= -(2${Ni} ** ${8*(kr+1)-1}${Ni}) and < 2 ** ${8*(kr+1)-1}${Ni}`:`>= ${Ct}${Ni} and <= ${bt}${Ni}`,new Mi.ERR_OUT_OF_RANGE("value",Zs,Ye)}var Ni,Zs,Vo;Ni=Vn,Vo=kr,fn(Zs=Mr,"offset"),void 0!==Ni[Zs]&&void 0!==Ni[Zs+Vo]||Vr(Zs,Ni.length-(Vo+1))}function fn(Ye,Ct){if("number"!=typeof Ye)throw new Mi.ERR_INVALID_ARG_TYPE(Ct,"number",Ye)}function Vr(Ye,Ct,bt){throw Math.floor(Ye)!==Ye?(fn(Ye,bt),new Mi.ERR_OUT_OF_RANGE(bt||"offset","an integer",Ye)):Ct<0?new Mi.ERR_BUFFER_OUT_OF_BOUNDS:new Mi.ERR_OUT_OF_RANGE(bt||"offset",`>= ${bt?1:0} and <= ${Ct}`,Ye)}Yi("ERR_BUFFER_OUT_OF_BOUNDS",function(Ye){return Ye?`${Ye} is outside of buffer bounds`:"Attempt to access memory outside buffer bounds"},RangeError),Yi("ERR_INVALID_ARG_TYPE",function(Ye,Ct){return`The "${Ye}" argument must be of type number. Received type ${typeof Ct}`},TypeError),Yi("ERR_OUT_OF_RANGE",function(Ye,Ct,bt){let Vn=`The value of "${Ye}" is out of range.`,Mr=bt;return Number.isInteger(bt)&&Math.abs(bt)>Gg(2,32)?Mr=jr(String(bt)):"bigint"==typeof bt&&(Mr=String(bt),(bt>Gg(BigInt(2),BigInt(32))||bt<-Gg(BigInt(2),BigInt(32)))&&(Mr=jr(Mr)),Mr+="n"),Vn+=` It must be ${Ct}. Received ${Mr}`,Vn},RangeError);const xi=/[^+/0-9A-Za-z-_]/g;function Ji(Ye,Ct){let bt;Ct=Ct||1/0;const Vn=Ye.length;let Mr=null;const kr=[];for(let Ni=0;Ni<Vn;++Ni){if(bt=Ye.charCodeAt(Ni),bt>55295&&bt<57344){if(!Mr){if(bt>56319){(Ct-=3)>-1&&kr.push(239,191,189);continue}if(Ni+1===Vn){(Ct-=3)>-1&&kr.push(239,191,189);continue}Mr=bt;continue}if(bt<56320){(Ct-=3)>-1&&kr.push(239,191,189),Mr=bt;continue}bt=65536+(Mr-55296<<10|bt-56320)}else Mr&&(Ct-=3)>-1&&kr.push(239,191,189);if(Mr=null,bt<128){if((Ct-=1)<0)break;kr.push(bt)}else if(bt<2048){if((Ct-=2)<0)break;kr.push(bt>>6|192,63&bt|128)}else if(bt<65536){if((Ct-=3)<0)break;kr.push(bt>>12|224,bt>>6&63|128,63&bt|128)}else{if(!(bt<1114112))throw new Error("Invalid code point");if((Ct-=4)<0)break;kr.push(bt>>18|240,bt>>12&63|128,bt>>6&63|128,63&bt|128)}}return kr}function Ho(Ye){return o.toByteArray(function(Ct){if((Ct=(Ct=Ct.split("=")[0]).trim().replace(xi,"")).length<2)return"";for(;Ct.length%4!=0;)Ct+="=";return Ct}(Ye))}function Ao(Ye,Ct,bt,Vn){let Mr;for(Mr=0;Mr<Vn&&!(Mr+bt>=Ct.length||Mr>=Ye.length);++Mr)Ct[Mr+bt]=Ye[Mr];return Mr}function Vs(Ye,Ct){return Ye instanceof Ct||null!=Ye&&null!=Ye.constructor&&null!=Ye.constructor.name&&Ye.constructor.name===Ct.name}function Qs(Ye){return Ye!=Ye}const Ri=function(){const Ye="0123456789abcdef",Ct=new Array(256);for(let bt=0;bt<16;++bt){const Vn=16*bt;for(let Mr=0;Mr<16;++Mr)Ct[Vn+Mr]=Ye[bt]+Ye[Mr]}return Ct}();function uo(Ye){return"undefined"==typeof BigInt?bo:Ye}function bo(){throw new Error("BigInt not supported")}},8171:(n,s,t)=>{t(6450);var o=t(4058).Object,l=n.exports=function(_,M,w){return o.defineProperty(_,M,w)};o.defineProperty.sham&&(l.sham=!0)},4883:(n,s,t)=>{var o=t(1899),l=t(7475),_=t(9826),M=o.TypeError;n.exports=function(w){if(l(w))return w;throw M(_(w)+" is not a function")}},6059:(n,s,t)=>{var o=t(1899),l=t(941),_=o.String,M=o.TypeError;n.exports=function(w){if(l(w))return w;throw M(_(w)+" is not an object")}},2532:(n,s,t)=>{var o=t(5329),l=o({}.toString),_=o("".slice);n.exports=function(M){return _(l(M),8,-1)}},2029:(n,s,t)=>{var o=t(5746),l=t(5988),_=t(1887);n.exports=o?function(M,w,N){return l.f(M,w,_(1,N))}:function(M,w,N){return M[w]=N,M}},1887:n=>{n.exports=function(s,t){return{enumerable:!(1&s),configurable:!(2&s),writable:!(4&s),value:t}}},5746:(n,s,t)=>{var o=t(5981);n.exports=!o(function(){return 7!=Object.defineProperty({},1,{get:function(){return 7}})[1]})},1333:(n,s,t)=>{var o=t(1899),l=t(941),_=o.document,M=l(_)&&l(_.createElement);n.exports=function(w){return M?_.createElement(w):{}}},2861:(n,s,t)=>{var o=t(224);n.exports=o("navigator","userAgent")||""},3385:(n,s,t)=>{var o,l,_=t(1899),M=t(2861),w=_.process,N=_.Deno,V=w&&w.versions||N&&N.version,X=V&&V.v8;X&&(l=(o=X.split("."))[0]>0&&o[0]<4?1:+(o[0]+o[1])),!l&&M&&(!(o=M.match(/Edge\/(\d+)/))||o[1]>=74)&&(o=M.match(/Chrome\/(\d+)/))&&(l=+o[1]),n.exports=l},6887:(n,s,t)=>{var o=t(1899),l=t(9730),_=t(5329),M=t(7475),w=t(9677).f,N=t(7252),V=t(4058),X=t(6843),re=t(2029),oe=t(953),fe=function(ve){var Pe=function(De,Ie,Ae){if(this instanceof Pe){switch(arguments.length){case 0:return new ve;case 1:return new ve(De);case 2:return new ve(De,Ie)}return new ve(De,Ie,Ae)}return l(ve,this,arguments)};return Pe.prototype=ve.prototype,Pe};n.exports=function(ve,Pe){var De,Ie,Ae,Y,Et,ft,xt,Ht,yn=ve.target,It=ve.global,In=ve.stat,On=ve.proto,Yr=It?o:In?o[yn]:(o[yn]||{}).prototype,Ir=It?V:V[yn]||re(V,yn,{})[yn],Hr=Ir.prototype;for(Ae in Pe)De=!N(It?Ae:yn+(In?".":"#")+Ae,ve.forced)&&Yr&&oe(Yr,Ae),Et=Ir[Ae],De&&(ft=ve.noTargetGet?(Ht=w(Yr,Ae))&&Ht.value:Yr[Ae]),Y=De&&ft?ft:Pe[Ae],De&&typeof Et==typeof Y||(xt=ve.bind&&De?X(Y,o):ve.wrap&&De?fe(Y):On&&M(Y)?_(Y):Y,(ve.sham||Y&&Y.sham||Et&&Et.sham)&&re(xt,"sham",!0),re(Ir,Ae,xt),On&&(oe(V,Ie=yn+"Prototype")||re(V,Ie,{}),re(V[Ie],Ae,Y),ve.real&&Hr&&!Hr[Ae]&&re(Hr,Ae,Y)))}},5981:n=>{n.exports=function(s){try{return!!s()}catch(t){return!0}}},9730:(n,s,t)=>{var o=t(8285),l=Function.prototype,_=l.apply,M=l.call;n.exports="object"==typeof Reflect&&Reflect.apply||(o?M.bind(_):function(){return M.apply(_,arguments)})},6843:(n,s,t)=>{var o=t(5329),l=t(4883),_=t(8285),M=o(o.bind);n.exports=function(w,N){return l(w),void 0===N?w:_?M(w,N):function(){return w.apply(N,arguments)}}},8285:(n,s,t)=>{var o=t(5981);n.exports=!o(function(){var l=function(){}.bind();return"function"!=typeof l||l.hasOwnProperty("prototype")})},8834:(n,s,t)=>{var o=t(8285),l=Function.prototype.call;n.exports=o?l.bind(l):function(){return l.apply(l,arguments)}},5329:(n,s,t)=>{var o=t(8285),l=Function.prototype,M=l.call,w=o&&l.bind.bind(M,M);n.exports=o?function(N){return N&&w(N)}:function(N){return N&&function(){return M.apply(N,arguments)}}},224:(n,s,t)=>{var o=t(4058),l=t(1899),_=t(7475),M=function(w){return _(w)?w:void 0};n.exports=function(w,N){return arguments.length<2?M(o[w])||M(l[w]):o[w]&&o[w][N]||l[w]&&l[w][N]}},9733:(n,s,t)=>{var o=t(4883);n.exports=function(l,_){var M=l[_];return null==M?void 0:o(M)}},1899:(n,s,t)=>{var o=function(l){return l&&l.Math==Math&&l};n.exports=o("object"==typeof globalThis&&globalThis)||o("object"==typeof window&&window)||o("object"==typeof self&&self)||o("object"==typeof t.g&&t.g)||function(){return this}()||Function("return this")()},953:(n,s,t)=>{var o=t(5329),l=t(9678),_=o({}.hasOwnProperty);n.exports=Object.hasOwn||function(M,w){return _(l(M),w)}},2840:(n,s,t)=>{var o=t(5746),l=t(5981),_=t(1333);n.exports=!o&&!l(function(){return 7!=Object.defineProperty(_("div"),"a",{get:function(){return 7}}).a})},7026:(n,s,t)=>{var o=t(1899),l=t(5329),_=t(5981),M=t(2532),w=o.Object,N=l("".split);n.exports=_(function(){return!w("z").propertyIsEnumerable(0)})?function(V){return"String"==M(V)?N(V,""):w(V)}:w},7475:n=>{n.exports=function(s){return"function"==typeof s}},7252:(n,s,t)=>{var o=t(5981),l=t(7475),_=/#|\.prototype\./,M=function(re,oe){var fe=N[w(re)];return fe==X||fe!=V&&(l(oe)?o(oe):!!oe)},w=M.normalize=function(re){return String(re).replace(_,".").toLowerCase()},N=M.data={},V=M.NATIVE="N",X=M.POLYFILL="P";n.exports=M},941:(n,s,t)=>{var o=t(7475);n.exports=function(l){return"object"==typeof l?null!==l:o(l)}},2529:n=>{n.exports=!0},6664:(n,s,t)=>{var o=t(1899),l=t(224),_=t(7475),M=t(7046),w=t(2302),N=o.Object;n.exports=w?function(V){return"symbol"==typeof V}:function(V){var X=l("Symbol");return _(X)&&M(X.prototype,N(V))}},2497:(n,s,t)=>{var o=t(3385),l=t(5981);n.exports=!!Object.getOwnPropertySymbols&&!l(function(){var _=Symbol();return!String(_)||!(Object(_)instanceof Symbol)||!Symbol.sham&&o&&o<41})},5988:(n,s,t)=>{var o=t(1899),l=t(5746),_=t(2840),M=t(3937),w=t(6059),N=t(3894),V=o.TypeError,X=Object.defineProperty,re=Object.getOwnPropertyDescriptor;s.f=l?M?function(Pe,De,Ie){if(w(Pe),De=N(De),w(Ie),"function"==typeof Pe&&"prototype"===De&&"value"in Ie&&"writable"in Ie&&!Ie.writable){var Ae=re(Pe,De);Ae&&Ae.writable&&(Pe[De]=Ie.value,Ie={configurable:"configurable"in Ie?Ie.configurable:Ae.configurable,enumerable:"enumerable"in Ie?Ie.enumerable:Ae.enumerable,writable:!1})}return X(Pe,De,Ie)}:X:function(Pe,De,Ie){if(w(Pe),De=N(De),w(Ie),_)try{return X(Pe,De,Ie)}catch(Ae){}if("get"in Ie||"set"in Ie)throw V("Accessors not supported");return"value"in Ie&&(Pe[De]=Ie.value),Pe}},9677:(n,s,t)=>{var o=t(5746),l=t(8834),_=t(6760),M=t(1887),w=t(4529),N=t(3894),V=t(953),X=t(2840),re=Object.getOwnPropertyDescriptor;s.f=o?re:function(oe,fe){if(oe=w(oe),fe=N(fe),X)try{return re(oe,fe)}catch(ve){}if(V(oe,fe))return M(!l(_.f,oe,fe),oe[fe])}},7046:(n,s,t)=>{var o=t(5329);n.exports=o({}.isPrototypeOf)},6760:(n,s)=>{var t={}.propertyIsEnumerable,o=Object.getOwnPropertyDescriptor,l=o&&!t.call({1:2},1);s.f=l?function(_){var M=o(this,_);return!!M&&M.enumerable}:t},9811:(n,s,t)=>{var o=t(1899),l=t(8834),_=t(7475),M=t(941),w=o.TypeError;n.exports=function(N,V){var X,re;if("string"===V&&_(X=N.toString)&&!M(re=l(X,N))||_(X=N.valueOf)&&!M(re=l(X,N))||"string"!==V&&_(X=N.toString)&&!M(re=l(X,N)))return re;throw w("Can't convert object to primitive value")}},4058:n=>{n.exports={}},8219:(n,s,t)=>{var o=t(1899).TypeError;n.exports=function(l){if(null==l)throw o("Can't call method on "+l);return l}},4911:(n,s,t)=>{var o=t(1899),l=Object.defineProperty;n.exports=function(_,M){try{l(o,_,{value:M,configurable:!0,writable:!0})}catch(w){o[_]=M}return M}},3030:(n,s,t)=>{var o=t(1899),l=t(4911),_="__core-js_shared__",M=o[_]||l(_,{});n.exports=M},8726:(n,s,t)=>{var o=t(2529),l=t(3030);(n.exports=function(_,M){return l[_]||(l[_]=void 0!==M?M:{})})("versions",[]).push({version:"3.20.3",mode:o?"pure":"global",copyright:"\xa9 2014-2022 Denis Pushkarev (zloirock.ru)",license:"https://github.com/zloirock/core-js/blob/v3.20.3/LICENSE",source:"https://github.com/zloirock/core-js"})},4529:(n,s,t)=>{var o=t(7026),l=t(8219);n.exports=function(_){return o(l(_))}},9678:(n,s,t)=>{var o=t(1899),l=t(8219),_=o.Object;n.exports=function(M){return _(l(M))}},6935:(n,s,t)=>{var o=t(1899),l=t(8834),_=t(941),M=t(6664),w=t(9733),N=t(9811),V=t(9813),X=o.TypeError,re=V("toPrimitive");n.exports=function(oe,fe){if(!_(oe)||M(oe))return oe;var ve,Pe=w(oe,re);if(Pe){if(void 0===fe&&(fe="default"),ve=l(Pe,oe,fe),!_(ve)||M(ve))return ve;throw X("Can't convert object to primitive value")}return void 0===fe&&(fe="number"),N(oe,fe)}},3894:(n,s,t)=>{var o=t(6935),l=t(6664);n.exports=function(_){var M=o(_,"string");return l(M)?M:M+""}},9826:(n,s,t)=>{var o=t(1899).String;n.exports=function(l){try{return o(l)}catch(_){return"Object"}}},9418:(n,s,t)=>{var o=t(5329),l=0,_=Math.random(),M=o(1..toString);n.exports=function(w){return"Symbol("+(void 0===w?"":w)+")_"+M(++l+_,36)}},2302:(n,s,t)=>{var o=t(2497);n.exports=o&&!Symbol.sham&&"symbol"==typeof Symbol.iterator},3937:(n,s,t)=>{var o=t(5746),l=t(5981);n.exports=o&&l(function(){return 42!=Object.defineProperty(function(){},"prototype",{value:42,writable:!1}).prototype})},9813:(n,s,t)=>{var o=t(1899),l=t(8726),_=t(953),M=t(9418),w=t(2497),N=t(2302),V=l("wks"),X=o.Symbol,re=X&&X.for,oe=N?X:X&&X.withoutSetter||M;n.exports=function(fe){if(!_(V,fe)||!w&&"string"!=typeof V[fe]){var ve="Symbol."+fe;V[fe]=w&&_(X,fe)?X[fe]:N&&re?re(ve):oe(ve)}return V[fe]}},6450:(n,s,t)=>{var o=t(6887),l=t(5746),_=t(5988).f;o({target:"Object",stat:!0,forced:Object.defineProperty!==_,sham:!l},{defineProperty:_})},1910:(n,s,t)=>{var o=t(8171);n.exports=o},7698:(n,s,t)=>{var o=t(8764).Buffer;function l(V){return V instanceof o||V instanceof Date||V instanceof RegExp}function _(V){if(V instanceof o){var X=o.alloc?o.alloc(V.length):new o(V.length);return V.copy(X),X}if(V instanceof Date)return new Date(V.getTime());if(V instanceof RegExp)return new RegExp(V);throw new Error("Unexpected situation")}function M(V){var X=[];return V.forEach(function(re,oe){X[oe]="object"==typeof re&&null!==re?Array.isArray(re)?M(re):l(re)?_(re):N({},re):re}),X}function w(V,X){return"__proto__"===X?void 0:V[X]}var N=n.exports=function(){if(arguments.length<1||"object"!=typeof arguments[0])return!1;if(arguments.length<2)return arguments[0];var V,X,re=arguments[0],oe=Array.prototype.slice.call(arguments,1);return oe.forEach(function(fe){"object"!=typeof fe||null===fe||Array.isArray(fe)||Object.keys(fe).forEach(function(ve){return X=w(re,ve),(V=w(fe,ve))===re?void 0:"object"!=typeof V||null===V?void(re[ve]=V):Array.isArray(V)?void(re[ve]=M(V)):l(V)?void(re[ve]=_(V)):"object"!=typeof X||null===X||Array.isArray(X)?void(re[ve]=N({},V)):void(re[ve]=N(X,V))})}),re}},7187:n=>{var s,t="object"==typeof Reflect?Reflect:null,o=t&&"function"==typeof t.apply?t.apply:function(De,Ie,Ae){return Function.prototype.apply.call(De,Ie,Ae)};s=t&&"function"==typeof t.ownKeys?t.ownKeys:Object.getOwnPropertySymbols?function(De){return Object.getOwnPropertyNames(De).concat(Object.getOwnPropertySymbols(De))}:function(De){return Object.getOwnPropertyNames(De)};var l=Number.isNaN||function(De){return De!=De};function _(){_.init.call(this)}n.exports=_,n.exports.once=function(De,Ie){return new Promise(function(Ae,Y){function Et(xt){De.removeListener(Ie,ft),Y(xt)}function ft(){"function"==typeof De.removeListener&&De.removeListener("error",Et),Ae([].slice.call(arguments))}var xt;Pe(De,Ie,ft,{once:!0}),"error"!==Ie&&("function"==typeof(xt=De).on&&Pe(xt,"error",Et,{once:!0}))})},_.EventEmitter=_,_.prototype._events=void 0,_.prototype._eventsCount=0,_.prototype._maxListeners=void 0;var M=10;function w(De){if("function"!=typeof De)throw new TypeError('The "listener" argument must be of type Function. Received type '+typeof De)}function N(De){return void 0===De._maxListeners?_.defaultMaxListeners:De._maxListeners}function V(De,Ie,Ae,Y){var Et,ft,xt;if(w(Ae),void 0===(ft=De._events)?(ft=De._events=Object.create(null),De._eventsCount=0):(void 0!==ft.newListener&&(De.emit("newListener",Ie,Ae.listener?Ae.listener:Ae),ft=De._events),xt=ft[Ie]),void 0===xt)xt=ft[Ie]=Ae,++De._eventsCount;else if("function"==typeof xt?xt=ft[Ie]=Y?[Ae,xt]:[xt,Ae]:Y?xt.unshift(Ae):xt.push(Ae),(Et=N(De))>0&&xt.length>Et&&!xt.warned){xt.warned=!0;var yn=new Error("Possible EventEmitter memory leak detected. "+xt.length+" "+String(Ie)+" listeners added. Use emitter.setMaxListeners() to increase limit");yn.name="MaxListenersExceededWarning",yn.emitter=De,yn.type=Ie,yn.count=xt.length,console&&console.warn&&console.warn(yn)}return De}function X(){if(!this.fired)return this.target.removeListener(this.type,this.wrapFn),this.fired=!0,0===arguments.length?this.listener.call(this.target):this.listener.apply(this.target,arguments)}function re(De,Ie,Ae){var Y={fired:!1,wrapFn:void 0,target:De,type:Ie,listener:Ae},Et=X.bind(Y);return Et.listener=Ae,Y.wrapFn=Et,Et}function oe(De,Ie,Ae){var Y=De._events;if(void 0===Y)return[];var Et=Y[Ie];return void 0===Et?[]:"function"==typeof Et?Ae?[Et.listener||Et]:[Et]:Ae?function(ft){for(var xt=new Array(ft.length),Ht=0;Ht<xt.length;++Ht)xt[Ht]=ft[Ht].listener||ft[Ht];return xt}(Et):ve(Et,Et.length)}function fe(De){var Ie=this._events;if(void 0!==Ie){var Ae=Ie[De];if("function"==typeof Ae)return 1;if(void 0!==Ae)return Ae.length}return 0}function ve(De,Ie){for(var Ae=new Array(Ie),Y=0;Y<Ie;++Y)Ae[Y]=De[Y];return Ae}function Pe(De,Ie,Ae,Y){if("function"==typeof De.on)Y.once?De.once(Ie,Ae):De.on(Ie,Ae);else{if("function"!=typeof De.addEventListener)throw new TypeError('The "emitter" argument must be of type EventEmitter. Received type '+typeof De);De.addEventListener(Ie,function Et(ft){Y.once&&De.removeEventListener(Ie,Et),Ae(ft)})}}Object.defineProperty(_,"defaultMaxListeners",{enumerable:!0,get:function(){return M},set:function(De){if("number"!=typeof De||De<0||l(De))throw new RangeError('The value of "defaultMaxListeners" is out of range. It must be a non-negative number. Received '+De+".");M=De}}),_.init=function(){void 0!==this._events&&this._events!==Object.getPrototypeOf(this)._events||(this._events=Object.create(null),this._eventsCount=0),this._maxListeners=this._maxListeners||void 0},_.prototype.setMaxListeners=function(De){if("number"!=typeof De||De<0||l(De))throw new RangeError('The value of "n" is out of range. It must be a non-negative number. Received '+De+".");return this._maxListeners=De,this},_.prototype.getMaxListeners=function(){return N(this)},_.prototype.emit=function(De){for(var Ie=[],Ae=1;Ae<arguments.length;Ae++)Ie.push(arguments[Ae]);var Y="error"===De,Et=this._events;if(void 0!==Et)Y=Y&&void 0===Et.error;else if(!Y)return!1;if(Y){var ft;if(Ie.length>0&&(ft=Ie[0]),ft instanceof Error)throw ft;var xt=new Error("Unhandled error."+(ft?" ("+ft.message+")":""));throw xt.context=ft,xt}var Ht=Et[De];if(void 0===Ht)return!1;if("function"==typeof Ht)o(Ht,this,Ie);else{var yn=Ht.length,It=ve(Ht,yn);for(Ae=0;Ae<yn;++Ae)o(It[Ae],this,Ie)}return!0},_.prototype.on=_.prototype.addListener=function(De,Ie){return V(this,De,Ie,!1)},_.prototype.prependListener=function(De,Ie){return V(this,De,Ie,!0)},_.prototype.once=function(De,Ie){return w(Ie),this.on(De,re(this,De,Ie)),this},_.prototype.prependOnceListener=function(De,Ie){return w(Ie),this.prependListener(De,re(this,De,Ie)),this},_.prototype.off=_.prototype.removeListener=function(De,Ie){var Ae,Y,Et,ft,xt;if(w(Ie),void 0===(Y=this._events))return this;if(void 0===(Ae=Y[De]))return this;if(Ae===Ie||Ae.listener===Ie)0==--this._eventsCount?this._events=Object.create(null):(delete Y[De],Y.removeListener&&this.emit("removeListener",De,Ae.listener||Ie));else if("function"!=typeof Ae){for(Et=-1,ft=Ae.length-1;ft>=0;ft--)if(Ae[ft]===Ie||Ae[ft].listener===Ie){xt=Ae[ft].listener,Et=ft;break}if(Et<0)return this;0===Et?Ae.shift():function(Ht,yn){for(;yn+1<Ht.length;yn++)Ht[yn]=Ht[yn+1];Ht.pop()}(Ae,Et),1===Ae.length&&(Y[De]=Ae[0]),void 0!==Y.removeListener&&this.emit("removeListener",De,xt||Ie)}return this},_.prototype.removeAllListeners=function(De){var Ie,Ae,Y;if(void 0===(Ae=this._events))return this;if(void 0===Ae.removeListener)return 0===arguments.length?(this._events=Object.create(null),this._eventsCount=0):void 0!==Ae[De]&&(0==--this._eventsCount?this._events=Object.create(null):delete Ae[De]),this;if(0===arguments.length){var Et,ft=Object.keys(Ae);for(Y=0;Y<ft.length;++Y)"removeListener"!==(Et=ft[Y])&&this.removeAllListeners(Et);return this.removeAllListeners("removeListener"),this._events=Object.create(null),this._eventsCount=0,this}if("function"==typeof(Ie=Ae[De]))this.removeListener(De,Ie);else if(void 0!==Ie)for(Y=Ie.length-1;Y>=0;Y--)this.removeListener(De,Ie[Y]);return this},_.prototype.listeners=function(De){return oe(this,De,!0)},_.prototype.rawListeners=function(De){return oe(this,De,!1)},_.listenerCount=function(De,Ie){return"function"==typeof De.listenerCount?De.listenerCount(Ie):fe.call(De,Ie)},_.prototype.listenerCount=fe,_.prototype.eventNames=function(){return this._eventsCount>0?s(this._events):[]}},5717:n=>{n.exports="function"==typeof Object.create?function(s,t){t&&(s.super_=t,s.prototype=Object.create(t.prototype,{constructor:{value:s,enumerable:!1,writable:!0,configurable:!0}}))}:function(s,t){if(t){s.super_=t;var o=function(){};o.prototype=t.prototype,s.prototype=new o,s.prototype.constructor=s}}},4155:n=>{var s,t,o=n.exports={};function l(){throw new Error("setTimeout has not been defined")}function _(){throw new Error("clearTimeout has not been defined")}function M(Pe){if(s===setTimeout)return setTimeout(Pe,0);if((s===l||!s)&&setTimeout)return s=setTimeout,setTimeout(Pe,0);try{return s(Pe,0)}catch(De){try{return s.call(null,Pe,0)}catch(Ie){return s.call(this,Pe,0)}}}!function(){try{s="function"==typeof setTimeout?setTimeout:l}catch(Pe){s=l}try{t="function"==typeof clearTimeout?clearTimeout:_}catch(Pe){t=_}}();var w,N=[],V=!1,X=-1;function re(){V&&w&&(V=!1,w.length?N=w.concat(N):X=-1,N.length&&oe())}function oe(){if(!V){var Pe=M(re);V=!0;for(var De=N.length;De;){for(w=N,N=[];++X<De;)w&&w[X].run();X=-1,De=N.length}w=null,V=!1,function(Ie){if(t===clearTimeout)return clearTimeout(Ie);if((t===_||!t)&&clearTimeout)return t=clearTimeout,clearTimeout(Ie);try{t(Ie)}catch(Ae){try{return t.call(null,Ie)}catch(Y){return t.call(this,Ie)}}}(Pe)}}function fe(Pe,De){this.fun=Pe,this.array=De}function ve(){}o.nextTick=function(Pe){var De=new Array(arguments.length-1);if(arguments.length>1)for(var Ie=1;Ie<arguments.length;Ie++)De[Ie-1]=arguments[Ie];N.push(new fe(Pe,De)),1!==N.length||V||M(oe)},fe.prototype.run=function(){this.fun.apply(null,this.array)},o.title="browser",o.browser=!0,o.env={},o.argv=[],o.version="",o.versions={},o.on=ve,o.addListener=ve,o.once=ve,o.off=ve,o.removeListener=ve,o.removeAllListeners=ve,o.emit=ve,o.prependListener=ve,o.prependOnceListener=ve,o.listeners=function(Pe){return[]},o.binding=function(Pe){throw new Error("process.binding is not supported")},o.cwd=function(){return"/"},o.chdir=function(Pe){throw new Error("process.chdir is not supported")},o.umask=function(){return 0}},1798:(n,s,t)=>{var o=t(4155),l=65536,M=t(396).Buffer,w=t.g.crypto||t.g.msCrypto;n.exports=w&&w.getRandomValues?function(N,V){if(N>4294967295)throw new RangeError("requested too many random bytes");var X=M.allocUnsafe(N);if(N>0)if(N>l)for(var re=0;re<N;re+=l)w.getRandomValues(X.slice(re,re+l));else w.getRandomValues(X);return"function"==typeof V?o.nextTick(function(){V(null,X)}):X}:function(){throw new Error("Secure random number generation is not supported by this browser.\nUse Chrome, Firefox or Internet Explorer 11")}},4281:n=>{var s={};function t(l,_,M){M||(M=Error);var w=function(N){var V,X;function re(oe,fe,ve){return N.call(this,"string"==typeof _?_:_(oe,fe,ve))||this}return X=N,(V=re).prototype=Object.create(X.prototype),V.prototype.constructor=V,V.__proto__=X,re}(M);w.prototype.name=M.name,w.prototype.code=l,s[l]=w}function o(l,_){if(Array.isArray(l)){var M=l.length;return l=l.map(function(w){return String(w)}),M>2?"one of ".concat(_," ").concat(l.slice(0,M-1).join(", "),", or ")+l[M-1]:2===M?"one of ".concat(_," ").concat(l[0]," or ").concat(l[1]):"of ".concat(_," ").concat(l[0])}return"of ".concat(_," ").concat(String(l))}t("ERR_INVALID_OPT_VALUE",function(l,_){return'The value "'+_+'" is invalid for option "'+l+'"'},TypeError),t("ERR_INVALID_ARG_TYPE",function(l,_,M){var w,X,oe,ve;if("string"==typeof _&&"not "===_.substr(0,"not ".length)?(w="must not be",_=_.replace(/^not /,"")):w="must be",oe=l,(void 0===ve||ve>oe.length)&&(ve=oe.length)," argument"===oe.substring(ve-" argument".length,ve))X="The ".concat(l," ").concat(w," ").concat(o(_,"type"));else{var re=function(oe,fe,ve){return"number"!=typeof ve&&(ve=0),!(ve+".".length>oe.length)&&-1!==oe.indexOf(".",ve)}(l)?"property":"argument";X='The "'.concat(l,'" ').concat(re," ").concat(w," ").concat(o(_,"type"))}return X+". Received type ".concat(typeof M)},TypeError),t("ERR_STREAM_PUSH_AFTER_EOF","stream.push() after EOF"),t("ERR_METHOD_NOT_IMPLEMENTED",function(l){return"The "+l+" method is not implemented"}),t("ERR_STREAM_PREMATURE_CLOSE","Premature close"),t("ERR_STREAM_DESTROYED",function(l){return"Cannot call "+l+" after a stream was destroyed"}),t("ERR_MULTIPLE_CALLBACK","Callback called multiple times"),t("ERR_STREAM_CANNOT_PIPE","Cannot pipe, not readable"),t("ERR_STREAM_WRITE_AFTER_END","write after end"),t("ERR_STREAM_NULL_VALUES","May not write null values to stream",TypeError),t("ERR_UNKNOWN_ENCODING",function(l){return"Unknown encoding: "+l},TypeError),t("ERR_STREAM_UNSHIFT_AFTER_END_EVENT","stream.unshift() after end event"),n.exports.q=s},6753:(n,s,t)=>{var o=t(4155),l=Object.keys||function(fe){var ve=[];for(var Pe in fe)ve.push(Pe);return ve};n.exports=X;var _=t(9481),M=t(4229);t(5717)(X,_);for(var w=l(M.prototype),N=0;N<w.length;N++){var V=w[N];X.prototype[V]||(X.prototype[V]=M.prototype[V])}function X(fe){if(!(this instanceof X))return new X(fe);_.call(this,fe),M.call(this,fe),this.allowHalfOpen=!0,fe&&(!1===fe.readable&&(this.readable=!1),!1===fe.writable&&(this.writable=!1),!1===fe.allowHalfOpen&&(this.allowHalfOpen=!1,this.once("end",re)))}function re(){this._writableState.ended||o.nextTick(oe,this)}function oe(fe){fe.end()}Object.defineProperty(X.prototype,"writableHighWaterMark",{enumerable:!1,get:function(){return this._writableState.highWaterMark}}),Object.defineProperty(X.prototype,"writableBuffer",{enumerable:!1,get:function(){return this._writableState&&this._writableState.getBuffer()}}),Object.defineProperty(X.prototype,"writableLength",{enumerable:!1,get:function(){return this._writableState.length}}),Object.defineProperty(X.prototype,"destroyed",{enumerable:!1,get:function(){return void 0!==this._readableState&&void 0!==this._writableState&&this._readableState.destroyed&&this._writableState.destroyed},set:function(fe){void 0!==this._readableState&&void 0!==this._writableState&&(this._readableState.destroyed=fe,this._writableState.destroyed=fe)}})},2725:(n,s,t)=>{n.exports=l;var o=t(4605);function l(_){if(!(this instanceof l))return new l(_);o.call(this,_)}t(5717)(l,o),l.prototype._transform=function(_,M,w){w(null,_)}},9481:(n,s,t)=>{var o,l=t(4155);n.exports=It,It.ReadableState=yn,t(7187);var V,_=function(Nn,fn){return Nn.listeners(fn).length},M=t(2503),w=t(8764).Buffer,N=t.g.Uint8Array||function(){},X=t(4616);V=X&&X.debuglog?X.debuglog("stream"):function(){};var re,oe,fe,ve=t(7327),Pe=t(1195),De=t(2457).getHighWaterMark,Ie=t(4281).q,Ae=Ie.ERR_INVALID_ARG_TYPE,Y=Ie.ERR_STREAM_PUSH_AFTER_EOF,Et=Ie.ERR_METHOD_NOT_IMPLEMENTED,ft=Ie.ERR_STREAM_UNSHIFT_AFTER_END_EVENT;t(5717)(It,M);var xt=Pe.errorOrDestroy,Ht=["error","close","destroy","pause","resume"];function yn(Nn,fn,Vr){o=o||t(6753),"boolean"!=typeof Vr&&(Vr=fn instanceof o),this.objectMode=!!(Nn=Nn||{}).objectMode,Vr&&(this.objectMode=this.objectMode||!!Nn.readableObjectMode),this.highWaterMark=De(this,Nn,"readableHighWaterMark",Vr),this.buffer=new ve,this.length=0,this.pipes=null,this.pipesCount=0,this.flowing=null,this.ended=!1,this.endEmitted=!1,this.reading=!1,this.sync=!0,this.needReadable=!1,this.emittedReadable=!1,this.readableListening=!1,this.resumeScheduled=!1,this.paused=!0,this.emitClose=!1!==Nn.emitClose,this.autoDestroy=!!Nn.autoDestroy,this.destroyed=!1,this.defaultEncoding=Nn.defaultEncoding||"utf8",this.awaitDrain=0,this.readingMore=!1,this.decoder=null,this.encoding=null,Nn.encoding&&(re||(re=t(2553).s),this.decoder=new re(Nn.encoding),this.encoding=Nn.encoding)}function It(Nn){if(o=o||t(6753),!(this instanceof It))return new It(Nn);this._readableState=new yn(Nn,this,this instanceof o),this.readable=!0,Nn&&("function"==typeof Nn.read&&(this._read=Nn.read),"function"==typeof Nn.destroy&&(this._destroy=Nn.destroy)),M.call(this)}function In(Nn,fn,Vr,xi,Ji){V("readableAddChunk",fn);var Ho,Vs,Qs,Ri,uo,Ao=Nn._readableState;if(null===fn)Ao.reading=!1,function(Vs,Qs){if(V("onEofChunk"),!Qs.ended){if(Qs.decoder){var Ri=Qs.decoder.end();Ri&&Ri.length&&(Qs.buffer.push(Ri),Qs.length+=Qs.objectMode?1:Ri.length)}Qs.ended=!0,Qs.sync?Hr(Vs):(Qs.needReadable=!1,Qs.emittedReadable||(Qs.emittedReadable=!0,Wr(Vs)))}}(Nn,Ao);else if(Ji||(Vs=Ao,w.isBuffer(uo=Qs=fn)||uo instanceof N||"string"==typeof Qs||void 0===Qs||Vs.objectMode||(Ri=new Ae("chunk",["string","Buffer","Uint8Array"],Qs)),Ho=Ri),Ho)xt(Nn,Ho);else if(Ao.objectMode||fn&&fn.length>0)if("string"==typeof fn||Ao.objectMode||Object.getPrototypeOf(fn)===w.prototype||(fn=function(Vs){return w.from(Vs)}(fn)),xi)Ao.endEmitted?xt(Nn,new ft):On(Nn,Ao,fn,!0);else if(Ao.ended)xt(Nn,new Y);else{if(Ao.destroyed)return!1;Ao.reading=!1,Ao.decoder&&!Vr?(fn=Ao.decoder.write(fn),Ao.objectMode||0!==fn.length?On(Nn,Ao,fn,!1):En(Nn,Ao)):On(Nn,Ao,fn,!1)}else xi||(Ao.reading=!1,En(Nn,Ao));return!Ao.ended&&(Ao.length<Ao.highWaterMark||0===Ao.length)}function On(Nn,fn,Vr,xi){fn.flowing&&0===fn.length&&!fn.sync?(fn.awaitDrain=0,Nn.emit("data",Vr)):(fn.length+=fn.objectMode?1:Vr.length,xi?fn.buffer.unshift(Vr):fn.buffer.push(Vr),fn.needReadable&&Hr(Nn)),En(Nn,fn)}Object.defineProperty(It.prototype,"destroyed",{enumerable:!1,get:function(){return void 0!==this._readableState&&this._readableState.destroyed},set:function(Nn){this._readableState&&(this._readableState.destroyed=Nn)}}),It.prototype.destroy=Pe.destroy,It.prototype._undestroy=Pe.undestroy,It.prototype._destroy=function(Nn,fn){fn(Nn)},It.prototype.push=function(Nn,fn){var Vr,xi=this._readableState;return xi.objectMode?Vr=!0:"string"==typeof Nn&&((fn=fn||xi.defaultEncoding)!==xi.encoding&&(Nn=w.from(Nn,fn),fn=""),Vr=!0),In(this,Nn,fn,!1,Vr)},It.prototype.unshift=function(Nn){return In(this,Nn,null,!0,!1)},It.prototype.isPaused=function(){return!1===this._readableState.flowing},It.prototype.setEncoding=function(Nn){re||(re=t(2553).s);var fn=new re(Nn);this._readableState.decoder=fn,this._readableState.encoding=this._readableState.decoder.encoding;for(var Vr=this._readableState.buffer.head,xi="";null!==Vr;)xi+=fn.write(Vr.data),Vr=Vr.next;return this._readableState.buffer.clear(),""!==xi&&this._readableState.buffer.push(xi),this._readableState.length=xi.length,this};var Yr=1073741824;function Ir(Nn,fn){return Nn<=0||0===fn.length&&fn.ended?0:fn.objectMode?1:Nn!=Nn?fn.flowing&&fn.length?fn.buffer.head.data.length:fn.length:(Nn>fn.highWaterMark&&(fn.highWaterMark=((Vr=Nn)>=Yr?Vr=Yr:(Vr--,Vr|=Vr>>>1,Vr|=Vr>>>2,Vr|=Vr>>>4,Vr|=Vr>>>8,Vr|=Vr>>>16,Vr++),Vr)),Nn<=fn.length?Nn:fn.ended?fn.length:(fn.needReadable=!0,0));var Vr}function Hr(Nn){var fn=Nn._readableState;V("emitReadable",fn.needReadable,fn.emittedReadable),fn.needReadable=!1,fn.emittedReadable||(V("emitReadable",fn.flowing),fn.emittedReadable=!0,l.nextTick(Wr,Nn))}function Wr(Nn){var fn=Nn._readableState;V("emitReadable_",fn.destroyed,fn.length,fn.ended),fn.destroyed||!fn.length&&!fn.ended||(Nn.emit("readable"),fn.emittedReadable=!1),fn.needReadable=!fn.flowing&&!fn.ended&&fn.length<=fn.highWaterMark,Lr(Nn)}function En(Nn,fn){fn.readingMore||(fn.readingMore=!0,l.nextTick(Un,Nn,fn))}function Un(Nn,fn){for(;!fn.reading&&!fn.ended&&(fn.length<fn.highWaterMark||fn.flowing&&0===fn.length);){var Vr=fn.length;if(V("maybeReadMore read 0"),Nn.read(0),Vr===fn.length)break}fn.readingMore=!1}function Yn(Nn){var fn=Nn._readableState;fn.readableListening=Nn.listenerCount("readable")>0,fn.resumeScheduled&&!fn.paused?fn.flowing=!0:Nn.listenerCount("data")>0&&Nn.resume()}function ir(Nn){V("readable nexttick read 0"),Nn.read(0)}function An(Nn,fn){V("resume",fn.reading),fn.reading||Nn.read(0),fn.resumeScheduled=!1,Nn.emit("resume"),Lr(Nn),fn.flowing&&!fn.reading&&Nn.read(0)}function Lr(Nn){var fn=Nn._readableState;for(V("flow",fn.flowing);fn.flowing&&null!==Nn.read(););}function Wi(Nn,fn){return 0===fn.length?null:(fn.objectMode?Vr=fn.buffer.shift():!Nn||Nn>=fn.length?(Vr=fn.decoder?fn.buffer.join(""):1===fn.buffer.length?fn.buffer.first():fn.buffer.concat(fn.length),fn.buffer.clear()):Vr=fn.buffer.consume(Nn,fn.decoder),Vr);var Vr}function Mi(Nn){var fn=Nn._readableState;V("endReadable",fn.endEmitted),fn.endEmitted||(fn.ended=!0,l.nextTick(Yi,fn,Nn))}function Yi(Nn,fn){if(V("endReadableNT",Nn.endEmitted,Nn.length),!Nn.endEmitted&&0===Nn.length&&(Nn.endEmitted=!0,fn.readable=!1,fn.emit("end"),Nn.autoDestroy)){var Vr=fn._writableState;(!Vr||Vr.autoDestroy&&Vr.finished)&&fn.destroy()}}function jr(Nn,fn){for(var Vr=0,xi=Nn.length;Vr<xi;Vr++)if(Nn[Vr]===fn)return Vr;return-1}It.prototype.read=function(Nn){V("read",Nn),Nn=parseInt(Nn,10);var fn=this._readableState,Vr=Nn;if(0!==Nn&&(fn.emittedReadable=!1),0===Nn&&fn.needReadable&&((0!==fn.highWaterMark?fn.length>=fn.highWaterMark:fn.length>0)||fn.ended))return V("read: emitReadable",fn.length,fn.ended),0===fn.length&&fn.ended?Mi(this):Hr(this),null;if(0===(Nn=Ir(Nn,fn))&&fn.ended)return 0===fn.length&&Mi(this),null;var xi,Ji=fn.needReadable;return V("need readable",Ji),(0===fn.length||fn.length-Nn<fn.highWaterMark)&&V("length less than watermark",Ji=!0),fn.ended||fn.reading?V("reading or ended",Ji=!1):Ji&&(V("do read"),fn.reading=!0,fn.sync=!0,0===fn.length&&(fn.needReadable=!0),this._read(fn.highWaterMark),fn.sync=!1,fn.reading||(Nn=Ir(Vr,fn))),null===(xi=Nn>0?Wi(Nn,fn):null)?(fn.needReadable=fn.length<=fn.highWaterMark,Nn=0):(fn.length-=Nn,fn.awaitDrain=0),0===fn.length&&(fn.ended||(fn.needReadable=!0),Vr!==Nn&&fn.ended&&Mi(this)),null!==xi&&this.emit("data",xi),xi},It.prototype._read=function(Nn){xt(this,new Et("_read()"))},It.prototype.pipe=function(Nn,fn){var Vr=this,xi=this._readableState;switch(xi.pipesCount){case 0:xi.pipes=Nn;break;case 1:xi.pipes=[xi.pipes,Nn];break;default:xi.pipes.push(Nn)}xi.pipesCount+=1,V("pipe count=%d opts=%j",xi.pipesCount,fn);var Ji=fn&&!1===fn.end||Nn===l.stdout||Nn===l.stderr?Ct:Ao;function Ao(){V("onend"),Nn.end()}xi.endEmitted?l.nextTick(Ji):Vr.once("end",Ji),Nn.on("unpipe",function Ho(bt,Vn){V("onunpipe"),bt===Vr&&Vn&&!1===Vn.hasUnpiped&&(Vn.hasUnpiped=!0,V("cleanup"),Nn.removeListener("close",bo),Nn.removeListener("finish",Ye),Nn.removeListener("drain",Vs),Nn.removeListener("error",uo),Nn.removeListener("unpipe",Ho),Vr.removeListener("end",Ao),Vr.removeListener("end",Ct),Vr.removeListener("data",Ri),Qs=!0,!xi.awaitDrain||Nn._writableState&&!Nn._writableState.needDrain||Vs())});var bt,Vs=(bt=Vr,function(){var Vn=bt._readableState;V("pipeOnDrain",Vn.awaitDrain),Vn.awaitDrain&&Vn.awaitDrain--,0===Vn.awaitDrain&&_(bt,"data")&&(Vn.flowing=!0,Lr(bt))});Nn.on("drain",Vs);var Qs=!1;function Ri(bt){V("ondata");var Vn=Nn.write(bt);V("dest.write",Vn),!1===Vn&&((1===xi.pipesCount&&xi.pipes===Nn||xi.pipesCount>1&&-1!==jr(xi.pipes,Nn))&&!Qs&&(V("false write response, pause",xi.awaitDrain),xi.awaitDrain++),Vr.pause())}function uo(bt){V("onerror",bt),Ct(),Nn.removeListener("error",uo),0===_(Nn,"error")&&xt(Nn,bt)}function bo(){Nn.removeListener("finish",Ye),Ct()}function Ye(){V("onfinish"),Nn.removeListener("close",bo),Ct()}function Ct(){V("unpipe"),Vr.unpipe(Nn)}return Vr.on("data",Ri),function(bt,Vn,Mr){if("function"==typeof bt.prependListener)return bt.prependListener(Vn,Mr);bt._events&&bt._events[Vn]?Array.isArray(bt._events[Vn])?bt._events[Vn].unshift(Mr):bt._events[Vn]=[Mr,bt._events[Vn]]:bt.on(Vn,Mr)}(Nn,"error",uo),Nn.once("close",bo),Nn.once("finish",Ye),Nn.emit("pipe",Vr),xi.flowing||(V("pipe resume"),Vr.resume()),Nn},It.prototype.unpipe=function(Nn){var fn=this._readableState,Vr={hasUnpiped:!1};if(0===fn.pipesCount)return this;if(1===fn.pipesCount)return Nn&&Nn!==fn.pipes||(Nn||(Nn=fn.pipes),fn.pipes=null,fn.pipesCount=0,fn.flowing=!1,Nn&&Nn.emit("unpipe",this,Vr)),this;if(!Nn){var xi=fn.pipes,Ji=fn.pipesCount;fn.pipes=null,fn.pipesCount=0,fn.flowing=!1;for(var Ho=0;Ho<Ji;Ho++)xi[Ho].emit("unpipe",this,{hasUnpiped:!1});return this}var Ao=jr(fn.pipes,Nn);return-1===Ao||(fn.pipes.splice(Ao,1),fn.pipesCount-=1,1===fn.pipesCount&&(fn.pipes=fn.pipes[0]),Nn.emit("unpipe",this,Vr)),this},It.prototype.addListener=It.prototype.on=function(Nn,fn){var Vr=M.prototype.on.call(this,Nn,fn),xi=this._readableState;return"data"===Nn?(xi.readableListening=this.listenerCount("readable")>0,!1!==xi.flowing&&this.resume()):"readable"===Nn&&(xi.endEmitted||xi.readableListening||(xi.readableListening=xi.needReadable=!0,xi.flowing=!1,xi.emittedReadable=!1,V("on readable",xi.length,xi.reading),xi.length?Hr(this):xi.reading||l.nextTick(ir,this))),Vr},It.prototype.removeListener=function(Nn,fn){var Vr=M.prototype.removeListener.call(this,Nn,fn);return"readable"===Nn&&l.nextTick(Yn,this),Vr},It.prototype.removeAllListeners=function(Nn){var fn=M.prototype.removeAllListeners.apply(this,arguments);return"readable"!==Nn&&void 0!==Nn||l.nextTick(Yn,this),fn},It.prototype.resume=function(){var Vr,Nn=this._readableState;return Nn.flowing||(V("resume"),Nn.flowing=!Nn.readableListening,this,(Vr=Nn).resumeScheduled||(Vr.resumeScheduled=!0,l.nextTick(An,this,Vr))),Nn.paused=!1,this},It.prototype.pause=function(){return V("call pause flowing=%j",this._readableState.flowing),!1!==this._readableState.flowing&&(V("pause"),this._readableState.flowing=!1,this.emit("pause")),this._readableState.paused=!0,this},It.prototype.wrap=function(Nn){var fn=this,Vr=this._readableState,xi=!1;for(var Ji in Nn.on("end",function(){if(V("wrapped end"),Vr.decoder&&!Vr.ended){var Ao=Vr.decoder.end();Ao&&Ao.length&&fn.push(Ao)}fn.push(null)}),Nn.on("data",function(Ao){V("wrapped data"),Vr.decoder&&(Ao=Vr.decoder.write(Ao)),Vr.objectMode&&null==Ao||(Vr.objectMode||Ao&&Ao.length)&&(fn.push(Ao)||(xi=!0,Nn.pause()))}),Nn)void 0===this[Ji]&&"function"==typeof Nn[Ji]&&(this[Ji]=function(Ao){return function(){return Nn[Ao].apply(Nn,arguments)}}(Ji));for(var Ho=0;Ho<Ht.length;Ho++)Nn.on(Ht[Ho],this.emit.bind(this,Ht[Ho]));return this._read=function(Ao){V("wrapped _read",Ao),xi&&(xi=!1,Nn.resume())},this},"function"==typeof Symbol&&(It.prototype[Symbol.asyncIterator]=function(){return void 0===oe&&(oe=t(5850)),oe(this)}),Object.defineProperty(It.prototype,"readableHighWaterMark",{enumerable:!1,get:function(){return this._readableState.highWaterMark}}),Object.defineProperty(It.prototype,"readableBuffer",{enumerable:!1,get:function(){return this._readableState&&this._readableState.buffer}}),Object.defineProperty(It.prototype,"readableFlowing",{enumerable:!1,get:function(){return this._readableState.flowing},set:function(Nn){this._readableState&&(this._readableState.flowing=Nn)}}),It._fromList=Wi,Object.defineProperty(It.prototype,"readableLength",{enumerable:!1,get:function(){return this._readableState.length}}),"function"==typeof Symbol&&(It.from=function(Nn,fn){return void 0===fe&&(fe=t(5167)),fe(It,Nn,fn)})},4605:(n,s,t)=>{n.exports=X;var o=t(4281).q,l=o.ERR_METHOD_NOT_IMPLEMENTED,_=o.ERR_MULTIPLE_CALLBACK,M=o.ERR_TRANSFORM_ALREADY_TRANSFORMING,w=o.ERR_TRANSFORM_WITH_LENGTH_0,N=t(6753);function V(fe,ve){var Pe=this._transformState;Pe.transforming=!1;var De=Pe.writecb;if(null===De)return this.emit("error",new _);Pe.writechunk=null,Pe.writecb=null,null!=ve&&this.push(ve),De(fe);var Ie=this._readableState;Ie.reading=!1,(Ie.needReadable||Ie.length<Ie.highWaterMark)&&this._read(Ie.highWaterMark)}function X(fe){if(!(this instanceof X))return new X(fe);N.call(this,fe),this._transformState={afterTransform:V.bind(this),needTransform:!1,transforming:!1,writecb:null,writechunk:null,writeencoding:null},this._readableState.needReadable=!0,this._readableState.sync=!1,fe&&("function"==typeof fe.transform&&(this._transform=fe.transform),"function"==typeof fe.flush&&(this._flush=fe.flush)),this.on("prefinish",re)}function re(){var fe=this;"function"!=typeof this._flush||this._readableState.destroyed?oe(this,null,null):this._flush(function(ve,Pe){oe(fe,ve,Pe)})}function oe(fe,ve,Pe){if(ve)return fe.emit("error",ve);if(null!=Pe&&fe.push(Pe),fe._writableState.length)throw new w;if(fe._transformState.transforming)throw new M;return fe.push(null)}t(5717)(X,N),X.prototype.push=function(fe,ve){return this._transformState.needTransform=!1,N.prototype.push.call(this,fe,ve)},X.prototype._transform=function(fe,ve,Pe){Pe(new l("_transform()"))},X.prototype._write=function(fe,ve,Pe){var De=this._transformState;if(De.writecb=Pe,De.writechunk=fe,De.writeencoding=ve,!De.transforming){var Ie=this._readableState;(De.needTransform||Ie.needReadable||Ie.length<Ie.highWaterMark)&&this._read(Ie.highWaterMark)}},X.prototype._read=function(fe){var ve=this._transformState;null===ve.writechunk||ve.transforming?ve.needTransform=!0:(ve.transforming=!0,this._transform(ve.writechunk,ve.writeencoding,ve.afterTransform))},X.prototype._destroy=function(fe,ve){N.prototype._destroy.call(this,fe,function(Pe){ve(Pe)})}},4229:(n,s,t)=>{var o,l=t(4155);function _(En){var Un=this;this.next=null,this.entry=null,this.finish=function(){!function(Yn,ir,An){var Lr=Yn.entry;for(Yn.entry=null;Lr;){var Wi=Lr.callback;ir.pendingcb--,Wi(void 0),Lr=Lr.next}ir.corkedRequestsFree.next=Yn}(Un,En)}}n.exports=It,It.WritableState=yn;var X,M={deprecate:t(4927)},w=t(2503),N=t(8764).Buffer,V=t.g.Uint8Array||function(){},re=t(1195),oe=t(2457).getHighWaterMark,fe=t(4281).q,ve=fe.ERR_INVALID_ARG_TYPE,Pe=fe.ERR_METHOD_NOT_IMPLEMENTED,De=fe.ERR_MULTIPLE_CALLBACK,Ie=fe.ERR_STREAM_CANNOT_PIPE,Ae=fe.ERR_STREAM_DESTROYED,Y=fe.ERR_STREAM_NULL_VALUES,Et=fe.ERR_STREAM_WRITE_AFTER_END,ft=fe.ERR_UNKNOWN_ENCODING,xt=re.errorOrDestroy;function Ht(){}function yn(En,Un,Yn){o=o||t(6753),"boolean"!=typeof Yn&&(Yn=Un instanceof o),this.objectMode=!!(En=En||{}).objectMode,Yn&&(this.objectMode=this.objectMode||!!En.writableObjectMode),this.highWaterMark=oe(this,En,"writableHighWaterMark",Yn),this.finalCalled=!1,this.needDrain=!1,this.ending=!1,this.ended=!1,this.finished=!1,this.destroyed=!1,this.decodeStrings=!(!1===En.decodeStrings),this.defaultEncoding=En.defaultEncoding||"utf8",this.length=0,this.writing=!1,this.corked=0,this.sync=!0,this.bufferProcessing=!1,this.onwrite=function(An){!function(Lr,Wi){var fn,Mi=Lr._writableState,Yi=Mi.sync,jr=Mi.writecb;if("function"!=typeof jr)throw new De;if((fn=Mi).writing=!1,fn.writecb=null,fn.length-=fn.writelen,fn.writelen=0,Wi)!function(fn,Vr,xi,Ji,Ho){--Vr.pendingcb,xi?(l.nextTick(Ho,Ji),l.nextTick(Wr,fn,Vr),fn._writableState.errorEmitted=!0,xt(fn,Ji)):(Ho(Ji),fn._writableState.errorEmitted=!0,xt(fn,Ji),Wr(fn,Vr))}(Lr,Mi,Yi,Wi,jr);else{var Nn=Ir(Mi)||Lr.destroyed;Nn||Mi.corked||Mi.bufferProcessing||!Mi.bufferedRequest||Yr(Lr,Mi),Yi?l.nextTick(On,Lr,Mi,Nn,jr):On(Lr,Mi,Nn,jr)}}(Un,An)},this.writecb=null,this.writelen=0,this.bufferedRequest=null,this.lastBufferedRequest=null,this.pendingcb=0,this.prefinished=!1,this.errorEmitted=!1,this.emitClose=!1!==En.emitClose,this.autoDestroy=!!En.autoDestroy,this.bufferedRequestCount=0,this.corkedRequestsFree=new _(this)}function It(En){var Un=this instanceof(o=o||t(6753));if(!Un&&!X.call(It,this))return new It(En);this._writableState=new yn(En,this,Un),this.writable=!0,En&&("function"==typeof En.write&&(this._write=En.write),"function"==typeof En.writev&&(this._writev=En.writev),"function"==typeof En.destroy&&(this._destroy=En.destroy),"function"==typeof En.final&&(this._final=En.final)),w.call(this)}function In(En,Un,Yn,ir,An,Lr,Wi){Un.writelen=ir,Un.writecb=Wi,Un.writing=!0,Un.sync=!0,Un.destroyed?Un.onwrite(new Ae("write")):Yn?En._writev(An,Un.onwrite):En._write(An,Lr,Un.onwrite),Un.sync=!1}function On(En,Un,Yn,ir){var An,Lr;Yn||(An=En,0===(Lr=Un).length&&Lr.needDrain&&(Lr.needDrain=!1,An.emit("drain"))),Un.pendingcb--,ir(),Wr(En,Un)}function Yr(En,Un){Un.bufferProcessing=!0;var Yn=Un.bufferedRequest;if(En._writev&&Yn&&Yn.next){var An=new Array(Un.bufferedRequestCount),Lr=Un.corkedRequestsFree;Lr.entry=Yn;for(var Wi=0,Mi=!0;Yn;)An[Wi]=Yn,Yn.isBuf||(Mi=!1),Yn=Yn.next,Wi+=1;An.allBuffers=Mi,In(En,Un,!0,Un.length,An,"",Lr.finish),Un.pendingcb++,Un.lastBufferedRequest=null,Lr.next?(Un.corkedRequestsFree=Lr.next,Lr.next=null):Un.corkedRequestsFree=new _(Un),Un.bufferedRequestCount=0}else{for(;Yn;){var Yi=Yn.chunk;if(In(En,Un,!1,Un.objectMode?1:Yi.length,Yi,Yn.encoding,Yn.callback),Yn=Yn.next,Un.bufferedRequestCount--,Un.writing)break}null===Yn&&(Un.lastBufferedRequest=null)}Un.bufferedRequest=Yn,Un.bufferProcessing=!1}function Ir(En){return En.ending&&0===En.length&&null===En.bufferedRequest&&!En.finished&&!En.writing}function Hr(En,Un){En._final(function(Yn){Un.pendingcb--,Yn&&xt(En,Yn),Un.prefinished=!0,En.emit("prefinish"),Wr(En,Un)})}function Wr(En,Un){var An,Lr,Yn=Ir(Un);if(Yn&&(An=En,(Lr=Un).prefinished||Lr.finalCalled||("function"!=typeof An._final||Lr.destroyed?(Lr.prefinished=!0,An.emit("prefinish")):(Lr.pendingcb++,Lr.finalCalled=!0,l.nextTick(Hr,An,Lr))),0===Un.pendingcb&&(Un.finished=!0,En.emit("finish"),Un.autoDestroy))){var ir=En._readableState;(!ir||ir.autoDestroy&&ir.endEmitted)&&En.destroy()}return Yn}t(5717)(It,w),yn.prototype.getBuffer=function(){for(var En=this.bufferedRequest,Un=[];En;)Un.push(En),En=En.next;return Un},function(){try{Object.defineProperty(yn.prototype,"buffer",{get:M.deprecate(function(){return this.getBuffer()},"_writableState.buffer is deprecated. Use _writableState.getBuffer instead.","DEP0003")})}catch(En){}}(),"function"==typeof Symbol&&Symbol.hasInstance&&"function"==typeof Function.prototype[Symbol.hasInstance]?(X=Function.prototype[Symbol.hasInstance],Object.defineProperty(It,Symbol.hasInstance,{value:function(En){return!!X.call(this,En)||this===It&&En&&En._writableState instanceof yn}})):X=function(En){return En instanceof this},It.prototype.pipe=function(){xt(this,new Ie)},It.prototype.write=function(En,Un,Yn){var ir,Mi,Yi,jr,An=this._writableState,Lr=!1,Wi=!An.objectMode&&(N.isBuffer(ir=En)||ir instanceof V);return Wi&&!N.isBuffer(En)&&(En=N.from(En)),"function"==typeof Un&&(Yn=Un,Un=null),Wi?Un="buffer":Un||(Un=An.defaultEncoding),"function"!=typeof Yn&&(Yn=Ht),An.ending?(Mi=this,Yi=Yn,jr=new Et,xt(Mi,jr),l.nextTick(Yi,jr)):(Wi||function(Mi,Yi,jr,Nn){var fn;return null===jr?fn=new Y:"string"==typeof jr||Yi.objectMode||(fn=new ve("chunk",["string","Buffer"],jr)),!fn||(xt(Mi,fn),l.nextTick(Nn,fn),!1)}(this,An,En,Yn))&&(An.pendingcb++,Lr=function(Mi,Yi,jr,Nn,fn,Vr){if(!jr){var xi=(Qs=Nn,(Vs=Yi).objectMode||!1===Vs.decodeStrings||"string"!=typeof Qs||(Qs=N.from(Qs,fn)),Qs);Nn!==xi&&(jr=!0,fn="buffer",Nn=xi)}var Vs,Qs,Ji=Yi.objectMode?1:Nn.length;Yi.length+=Ji;var Ho=Yi.length<Yi.highWaterMark;if(Ho||(Yi.needDrain=!0),Yi.writing||Yi.corked){var Ao=Yi.lastBufferedRequest;Yi.lastBufferedRequest={chunk:Nn,encoding:fn,isBuf:jr,callback:Vr,next:null},Ao?Ao.next=Yi.lastBufferedRequest:Yi.bufferedRequest=Yi.lastBufferedRequest,Yi.bufferedRequestCount+=1}else In(Mi,Yi,!1,Ji,Nn,fn,Vr);return Ho}(this,An,Wi,En,Un,Yn)),Lr},It.prototype.cork=function(){this._writableState.corked++},It.prototype.uncork=function(){var En=this._writableState;En.corked&&(En.corked--,En.writing||En.corked||En.bufferProcessing||!En.bufferedRequest||Yr(this,En))},It.prototype.setDefaultEncoding=function(En){if("string"==typeof En&&(En=En.toLowerCase()),!(["hex","utf8","utf-8","ascii","binary","base64","ucs2","ucs-2","utf16le","utf-16le","raw"].indexOf((En+"").toLowerCase())>-1))throw new ft(En);return this._writableState.defaultEncoding=En,this},Object.defineProperty(It.prototype,"writableBuffer",{enumerable:!1,get:function(){return this._writableState&&this._writableState.getBuffer()}}),Object.defineProperty(It.prototype,"writableHighWaterMark",{enumerable:!1,get:function(){return this._writableState.highWaterMark}}),It.prototype._write=function(En,Un,Yn){Yn(new Pe("_write()"))},It.prototype._writev=null,It.prototype.end=function(En,Un,Yn){var Lr,Wi,ir=this._writableState;return"function"==typeof En?(Yn=En,En=null,Un=null):"function"==typeof Un&&(Yn=Un,Un=null),null!=En&&this.write(En,Un),ir.corked&&(ir.corked=1,this.uncork()),ir.ending||(this,Wi=Yn,(Lr=ir).ending=!0,Wr(this,Lr),Wi&&(Lr.finished?l.nextTick(Wi):this.once("finish",Wi)),Lr.ended=!0,this.writable=!1),this},Object.defineProperty(It.prototype,"writableLength",{enumerable:!1,get:function(){return this._writableState.length}}),Object.defineProperty(It.prototype,"destroyed",{enumerable:!1,get:function(){return void 0!==this._writableState&&this._writableState.destroyed},set:function(En){this._writableState&&(this._writableState.destroyed=En)}}),It.prototype.destroy=re.destroy,It.prototype._undestroy=re.undestroy,It.prototype._destroy=function(En,Un){Un(En)}},5850:(n,s,t)=>{var o,l=t(4155);function _(Y,Et,ft){return Et in Y?Object.defineProperty(Y,Et,{value:ft,enumerable:!0,configurable:!0,writable:!0}):Y[Et]=ft,Y}var M=t(8610),w=Symbol("lastResolve"),N=Symbol("lastReject"),V=Symbol("error"),X=Symbol("ended"),re=Symbol("lastPromise"),oe=Symbol("handlePromise"),fe=Symbol("stream");function ve(Y,Et){return{value:Y,done:Et}}function Pe(Y){var Et=Y[w];if(null!==Et){var ft=Y[fe].read();null!==ft&&(Y[re]=null,Y[w]=null,Y[N]=null,Et(ve(ft,!1)))}}function De(Y){l.nextTick(Pe,Y)}var Ie=Object.getPrototypeOf(function(){}),Ae=Object.setPrototypeOf((_(o={get stream(){return this[fe]},next:function(){var Y=this,Et=this[V];if(null!==Et)return Promise.reject(Et);if(this[X])return Promise.resolve(ve(void 0,!0));if(this[fe].destroyed)return new Promise(function(yn,It){l.nextTick(function(){Y[V]?It(Y[V]):yn(ve(void 0,!0))})});var ft,yn,It,xt=this[re];if(xt)ft=new Promise((yn=xt,It=this,function(In,On){yn.then(function(){It[X]?In(ve(void 0,!0)):It[oe](In,On)},On)}));else{var Ht=this[fe].read();if(null!==Ht)return Promise.resolve(ve(Ht,!1));ft=new Promise(this[oe])}return this[re]=ft,ft}},Symbol.asyncIterator,function(){return this}),_(o,"return",function(){var Y=this;return new Promise(function(Et,ft){Y[fe].destroy(null,function(xt){xt?ft(xt):Et(ve(void 0,!0))})})}),o),Ie);n.exports=function(Y){var Et,ft=Object.create(Ae,(_(Et={},fe,{value:Y,writable:!0}),_(Et,w,{value:null,writable:!0}),_(Et,N,{value:null,writable:!0}),_(Et,V,{value:null,writable:!0}),_(Et,X,{value:Y._readableState.endEmitted,writable:!0}),_(Et,oe,{value:function(xt,Ht){var yn=ft[fe].read();yn?(ft[re]=null,ft[w]=null,ft[N]=null,xt(ve(yn,!1))):(ft[w]=xt,ft[N]=Ht)},writable:!0}),Et));return ft[re]=null,M(Y,function(xt){if(xt&&"ERR_STREAM_PREMATURE_CLOSE"!==xt.code){var Ht=ft[N];return null!==Ht&&(ft[re]=null,ft[w]=null,ft[N]=null,Ht(xt)),void(ft[V]=xt)}var yn=ft[w];null!==yn&&(ft[re]=null,ft[w]=null,ft[N]=null,yn(ve(void 0,!0))),ft[X]=!0}),Y.on("readable",De.bind(null,ft)),ft}},7327:(n,s,t)=>{function o(V,X){var re=Object.keys(V);if(Object.getOwnPropertySymbols){var oe=Object.getOwnPropertySymbols(V);X&&(oe=oe.filter(function(fe){return Object.getOwnPropertyDescriptor(V,fe).enumerable})),re.push.apply(re,oe)}return re}function l(V,X,re){return X in V?Object.defineProperty(V,X,{value:re,enumerable:!0,configurable:!0,writable:!0}):V[X]=re,V}var M=t(8764).Buffer,w=t(2361).inspect,N=w&&w.custom||"inspect";n.exports=function(){function V(){(function(fe,ve){if(!(fe instanceof ve))throw new TypeError("Cannot call a class as a function")})(this,V),this.head=null,this.tail=null,this.length=0}var re;return re=[{key:"push",value:function(fe){var ve={data:fe,next:null};this.length>0?this.tail.next=ve:this.head=ve,this.tail=ve,++this.length}},{key:"unshift",value:function(fe){var ve={data:fe,next:this.head};0===this.length&&(this.tail=ve),this.head=ve,++this.length}},{key:"shift",value:function(){if(0!==this.length){var fe=this.head.data;return this.head=1===this.length?this.tail=null:this.head.next,--this.length,fe}}},{key:"clear",value:function(){this.head=this.tail=null,this.length=0}},{key:"join",value:function(fe){if(0===this.length)return"";for(var ve=this.head,Pe=""+ve.data;ve=ve.next;)Pe+=fe+ve.data;return Pe}},{key:"concat",value:function(fe){if(0===this.length)return M.alloc(0);for(var Ie=M.allocUnsafe(fe>>>0),Ae=this.head,Y=0;Ae;)M.prototype.copy.call(Ae.data,Ie,Y),Y+=Ae.data.length,Ae=Ae.next;return Ie}},{key:"consume",value:function(fe,ve){var Pe;return fe<this.head.data.length?(Pe=this.head.data.slice(0,fe),this.head.data=this.head.data.slice(fe)):Pe=fe===this.head.data.length?this.shift():ve?this._getString(fe):this._getBuffer(fe),Pe}},{key:"first",value:function(){return this.head.data}},{key:"_getString",value:function(fe){var ve=this.head,Pe=1,De=ve.data;for(fe-=De.length;ve=ve.next;){var Ie=ve.data,Ae=fe>Ie.length?Ie.length:fe;if(De+=Ae===Ie.length?Ie:Ie.slice(0,fe),0==(fe-=Ae)){Ae===Ie.length?(++Pe,this.head=ve.next?ve.next:this.tail=null):(this.head=ve,ve.data=Ie.slice(Ae));break}++Pe}return this.length-=Pe,De}},{key:"_getBuffer",value:function(fe){var ve=M.allocUnsafe(fe),Pe=this.head,De=1;for(Pe.data.copy(ve),fe-=Pe.data.length;Pe=Pe.next;){var Ie=Pe.data,Ae=fe>Ie.length?Ie.length:fe;if(Ie.copy(ve,ve.length-fe,0,Ae),0==(fe-=Ae)){Ae===Ie.length?(++De,this.head=Pe.next?Pe.next:this.tail=null):(this.head=Pe,Pe.data=Ie.slice(Ae));break}++De}return this.length-=De,ve}},{key:N,value:function(fe,ve){return w(this,function(Pe){for(var De=1;De<arguments.length;De++){var Ie=null!=arguments[De]?arguments[De]:{};De%2?o(Object(Ie),!0).forEach(function(Ae){l(Pe,Ae,Ie[Ae])}):Object.getOwnPropertyDescriptors?Object.defineProperties(Pe,Object.getOwnPropertyDescriptors(Ie)):o(Object(Ie)).forEach(function(Ae){Object.defineProperty(Pe,Ae,Object.getOwnPropertyDescriptor(Ie,Ae))})}return Pe}({},ve,{depth:0,customInspect:!1}))}}],re&&function _(V,X){for(var re=0;re<X.length;re++){var oe=X[re];oe.enumerable=oe.enumerable||!1,oe.configurable=!0,"value"in oe&&(oe.writable=!0),Object.defineProperty(V,oe.key,oe)}}(V.prototype,re),V}()},1195:(n,s,t)=>{var o=t(4155);function l(w,N){M(w,N),_(w)}function _(w){w._writableState&&!w._writableState.emitClose||w._readableState&&!w._readableState.emitClose||w.emit("close")}function M(w,N){w.emit("error",N)}n.exports={destroy:function(w,N){var V=this;return this._readableState&&this._readableState.destroyed||this._writableState&&this._writableState.destroyed?(N?N(w):w&&(this._writableState?this._writableState.errorEmitted||(this._writableState.errorEmitted=!0,o.nextTick(M,this,w)):o.nextTick(M,this,w)),this):(this._readableState&&(this._readableState.destroyed=!0),this._writableState&&(this._writableState.destroyed=!0),this._destroy(w||null,function(oe){!N&&oe?V._writableState?V._writableState.errorEmitted?o.nextTick(_,V):(V._writableState.errorEmitted=!0,o.nextTick(l,V,oe)):o.nextTick(l,V,oe):N?(o.nextTick(_,V),N(oe)):o.nextTick(_,V)}),this)},undestroy:function(){this._readableState&&(this._readableState.destroyed=!1,this._readableState.reading=!1,this._readableState.ended=!1,this._readableState.endEmitted=!1),this._writableState&&(this._writableState.destroyed=!1,this._writableState.ended=!1,this._writableState.ending=!1,this._writableState.finalCalled=!1,this._writableState.prefinished=!1,this._writableState.finished=!1,this._writableState.errorEmitted=!1)},errorOrDestroy:function(w,N){var V=w._readableState,X=w._writableState;V&&V.autoDestroy||X&&X.autoDestroy?w.destroy(N):w.emit("error",N)}}},8610:(n,s,t)=>{var o=t(4281).q.ERR_STREAM_PREMATURE_CLOSE;function l(){}n.exports=function _(M,w,N){if("function"==typeof w)return _(M,null,w);var Y,Et;w||(w={}),Y=N||l,Et=!1,N=function(){if(!Et){Et=!0;for(var ft=arguments.length,xt=new Array(ft),Ht=0;Ht<ft;Ht++)xt[Ht]=arguments[Ht];Y.apply(this,xt)}};var V=w.readable||!1!==w.readable&&M.readable,X=w.writable||!1!==w.writable&&M.writable,re=function(){M.writable||fe()},oe=M._writableState&&M._writableState.finished,fe=function(){X=!1,oe=!0,V||N.call(M)},ve=M._readableState&&M._readableState.endEmitted,Pe=function(){V=!1,ve=!0,X||N.call(M)},De=function(Y){N.call(M,Y)},Ie=function(){var Y;return V&&!ve?(M._readableState&&M._readableState.ended||(Y=new o),N.call(M,Y)):X&&!oe?(M._writableState&&M._writableState.ended||(Y=new o),N.call(M,Y)):void 0},Ae=function(){M.req.on("finish",fe)};return function(Y){return Y.setHeader&&"function"==typeof Y.abort}(M)?(M.on("complete",fe),M.on("abort",Ie),M.req?Ae():M.on("request",Ae)):X&&!M._writableState&&(M.on("end",re),M.on("close",re)),M.on("end",Pe),M.on("finish",fe),!1!==w.error&&M.on("error",De),M.on("close",Ie),function(){M.removeListener("complete",fe),M.removeListener("abort",Ie),M.removeListener("request",Ae),M.req&&M.req.removeListener("finish",fe),M.removeListener("end",re),M.removeListener("close",re),M.removeListener("finish",fe),M.removeListener("end",Pe),M.removeListener("error",De),M.removeListener("close",Ie)}}},5167:n=>{n.exports=function(){throw new Error("Readable.from is not available in the browser")}},9946:(n,s,t)=>{var o,l=t(4281).q,_=l.ERR_MISSING_ARGS,M=l.ERR_STREAM_DESTROYED;function w(oe){if(oe)throw oe}function N(oe,fe,ve,Pe){var Ae,Y;Ae=Pe,Y=!1,Pe=function(){Y||(Y=!0,Ae.apply(void 0,arguments))};var De=!1;oe.on("close",function(){De=!0}),void 0===o&&(o=t(8610)),o(oe,{readable:fe,writable:ve},function(Ae){if(Ae)return Pe(Ae);De=!0,Pe()});var Ie=!1;return function(Ae){if(!De&&!Ie)return Ie=!0,function(Y){return Y.setHeader&&"function"==typeof Y.abort}(oe)?oe.abort():"function"==typeof oe.destroy?oe.destroy():void Pe(Ae||new M("pipe"))}}function V(oe){oe()}function X(oe,fe){return oe.pipe(fe)}function re(oe){return oe.length?"function"!=typeof oe[oe.length-1]?w:oe.pop():w}n.exports=function(){for(var oe=arguments.length,fe=new Array(oe),ve=0;ve<oe;ve++)fe[ve]=arguments[ve];var Pe,De=re(fe);if(Array.isArray(fe[0])&&(fe=fe[0]),fe.length<2)throw new _("streams");var Ie=fe.map(function(Ae,Y){var Et=Y<fe.length-1;return N(Ae,Et,Y>0,function(ft){Pe||(Pe=ft),ft&&Ie.forEach(V),Et||(Ie.forEach(V),De(Pe))})});return fe.reduce(X)}},2457:(n,s,t)=>{var o=t(4281).q.ERR_INVALID_OPT_VALUE;n.exports={getHighWaterMark:function(l,_,M,w){var V,N=null!=(V=_).highWaterMark?V.highWaterMark:w?V[M]:null;if(null!=N){if(!isFinite(N)||Math.floor(N)!==N||N<0)throw new o(w?M:"highWaterMark",N);return Math.floor(N)}return l.objectMode?16:16384}}},2503:(n,s,t)=>{n.exports=t(7187).EventEmitter},4189:(n,s,t)=>{var o=t(396).Buffer;function l(_,M){this._block=o.alloc(_),this._finalSize=M,this._blockSize=_,this._len=0}l.prototype.update=function(_,M){"string"==typeof _&&(_=o.from(_,M=M||"utf8"));for(var w=this._block,N=this._blockSize,V=_.length,X=this._len,re=0;re<V;){for(var oe=X%N,fe=Math.min(V-re,N-oe),ve=0;ve<fe;ve++)w[oe+ve]=_[re+ve];re+=fe,(X+=fe)%N==0&&this._update(w)}return this._len+=V,this},l.prototype.digest=function(_){var M=this._len%this._blockSize;this._block[M]=128,this._block.fill(0,M+1),M>=this._finalSize&&(this._update(this._block),this._block.fill(0));var w=8*this._len;if(w<=4294967295)this._block.writeUInt32BE(w,this._blockSize-4);else{var N=(4294967295&w)>>>0;this._block.writeUInt32BE((w-N)/4294967296,this._blockSize-8),this._block.writeUInt32BE(N,this._blockSize-4)}this._update(this._block);var X=this._hash();return _?X.toString(_):X},l.prototype._update=function(){throw new Error("_update must be implemented by subclass")},n.exports=l},9072:(n,s,t)=>{var o=n.exports=function(l){l=l.toLowerCase();var _=o[l];if(!_)throw new Error(l+" is not supported (we accept pull requests)");return new _};o.sha=t(4448),o.sha1=t(8336),o.sha224=t(8432),o.sha256=t(7499),o.sha384=t(1686),o.sha512=t(7816)},4448:(n,s,t)=>{var o=t(5717),l=t(4189),_=t(396).Buffer,M=[1518500249,1859775393,-1894007588,-899497514],w=new Array(80);function N(){this.init(),this._w=w,l.call(this,64,56)}function V(re){return re<<30|re>>>2}function X(re,oe,fe,ve){return 0===re?oe&fe|~oe&ve:2===re?oe&fe|oe&ve|fe&ve:oe^fe^ve}o(N,l),N.prototype.init=function(){return this._a=1732584193,this._b=4023233417,this._c=2562383102,this._d=271733878,this._e=3285377520,this},N.prototype._update=function(re){for(var oe,fe=this._w,ve=0|this._a,Pe=0|this._b,De=0|this._c,Ie=0|this._d,Ae=0|this._e,Y=0;Y<16;++Y)fe[Y]=re.readInt32BE(4*Y);for(;Y<80;++Y)fe[Y]=fe[Y-3]^fe[Y-8]^fe[Y-14]^fe[Y-16];for(var Et=0;Et<80;++Et){var ft=~~(Et/20),xt=0|((oe=ve)<<5|oe>>>27)+X(ft,Pe,De,Ie)+Ae+fe[Et]+M[ft];Ae=Ie,Ie=De,De=V(Pe),Pe=ve,ve=xt}this._a=ve+this._a|0,this._b=Pe+this._b|0,this._c=De+this._c|0,this._d=Ie+this._d|0,this._e=Ae+this._e|0},N.prototype._hash=function(){var re=_.allocUnsafe(20);return re.writeInt32BE(0|this._a,0),re.writeInt32BE(0|this._b,4),re.writeInt32BE(0|this._c,8),re.writeInt32BE(0|this._d,12),re.writeInt32BE(0|this._e,16),re},n.exports=N},8336:(n,s,t)=>{var o=t(5717),l=t(4189),_=t(396).Buffer,M=[1518500249,1859775393,-1894007588,-899497514],w=new Array(80);function N(){this.init(),this._w=w,l.call(this,64,56)}function V(oe){return oe<<5|oe>>>27}function X(oe){return oe<<30|oe>>>2}function re(oe,fe,ve,Pe){return 0===oe?fe&ve|~fe&Pe:2===oe?fe&ve|fe&Pe|ve&Pe:fe^ve^Pe}o(N,l),N.prototype.init=function(){return this._a=1732584193,this._b=4023233417,this._c=2562383102,this._d=271733878,this._e=3285377520,this},N.prototype._update=function(oe){for(var fe,ve=this._w,Pe=0|this._a,De=0|this._b,Ie=0|this._c,Ae=0|this._d,Y=0|this._e,Et=0;Et<16;++Et)ve[Et]=oe.readInt32BE(4*Et);for(;Et<80;++Et)ve[Et]=(fe=ve[Et-3]^ve[Et-8]^ve[Et-14]^ve[Et-16])<<1|fe>>>31;for(var ft=0;ft<80;++ft){var xt=~~(ft/20),Ht=V(Pe)+re(xt,De,Ie,Ae)+Y+ve[ft]+M[xt]|0;Y=Ae,Ae=Ie,Ie=X(De),De=Pe,Pe=Ht}this._a=Pe+this._a|0,this._b=De+this._b|0,this._c=Ie+this._c|0,this._d=Ae+this._d|0,this._e=Y+this._e|0},N.prototype._hash=function(){var oe=_.allocUnsafe(20);return oe.writeInt32BE(0|this._a,0),oe.writeInt32BE(0|this._b,4),oe.writeInt32BE(0|this._c,8),oe.writeInt32BE(0|this._d,12),oe.writeInt32BE(0|this._e,16),oe},n.exports=N},8432:(n,s,t)=>{var o=t(5717),l=t(7499),_=t(4189),M=t(396).Buffer,w=new Array(64);function N(){this.init(),this._w=w,_.call(this,64,56)}o(N,l),N.prototype.init=function(){return this._a=3238371032,this._b=914150663,this._c=812702999,this._d=4144912697,this._e=4290775857,this._f=1750603025,this._g=1694076839,this._h=3204075428,this},N.prototype._hash=function(){var V=M.allocUnsafe(28);return V.writeInt32BE(this._a,0),V.writeInt32BE(this._b,4),V.writeInt32BE(this._c,8),V.writeInt32BE(this._d,12),V.writeInt32BE(this._e,16),V.writeInt32BE(this._f,20),V.writeInt32BE(this._g,24),V},n.exports=N},7499:(n,s,t)=>{var o=t(5717),l=t(4189),_=t(396).Buffer,M=[1116352408,1899447441,3049323471,3921009573,961987163,1508970993,2453635748,2870763221,3624381080,310598401,607225278,1426881987,1925078388,2162078206,2614888103,3248222580,3835390401,4022224774,264347078,604807628,770255983,1249150122,1555081692,1996064986,2554220882,2821834349,2952996808,3210313671,3336571891,3584528711,113926993,338241895,666307205,773529912,1294757372,1396182291,1695183700,1986661051,2177026350,2456956037,2730485921,2820302411,3259730800,3345764771,3516065817,3600352804,4094571909,275423344,430227734,506948616,659060556,883997877,958139571,1322822218,1537002063,1747873779,1955562222,2024104815,2227730452,2361852424,2428436474,2756734187,3204031479,3329325298],w=new Array(64);function N(){this.init(),this._w=w,l.call(this,64,56)}function V(ve,Pe,De){return De^ve&(Pe^De)}function X(ve,Pe,De){return ve&Pe|De&(ve|Pe)}function re(ve){return(ve>>>2|ve<<30)^(ve>>>13|ve<<19)^(ve>>>22|ve<<10)}function oe(ve){return(ve>>>6|ve<<26)^(ve>>>11|ve<<21)^(ve>>>25|ve<<7)}function fe(ve){return(ve>>>7|ve<<25)^(ve>>>18|ve<<14)^ve>>>3}o(N,l),N.prototype.init=function(){return this._a=1779033703,this._b=3144134277,this._c=1013904242,this._d=2773480762,this._e=1359893119,this._f=2600822924,this._g=528734635,this._h=1541459225,this},N.prototype._update=function(ve){for(var Pe,De=this._w,Ie=0|this._a,Ae=0|this._b,Y=0|this._c,Et=0|this._d,ft=0|this._e,xt=0|this._f,Ht=0|this._g,yn=0|this._h,It=0;It<16;++It)De[It]=ve.readInt32BE(4*It);for(;It<64;++It)De[It]=0|(((Pe=De[It-2])>>>17|Pe<<15)^(Pe>>>19|Pe<<13)^Pe>>>10)+De[It-7]+fe(De[It-15])+De[It-16];for(var In=0;In<64;++In){var On=yn+oe(ft)+V(ft,xt,Ht)+M[In]+De[In]|0,Yr=re(Ie)+X(Ie,Ae,Y)|0;yn=Ht,Ht=xt,xt=ft,ft=Et+On|0,Et=Y,Y=Ae,Ae=Ie,Ie=On+Yr|0}this._a=Ie+this._a|0,this._b=Ae+this._b|0,this._c=Y+this._c|0,this._d=Et+this._d|0,this._e=ft+this._e|0,this._f=xt+this._f|0,this._g=Ht+this._g|0,this._h=yn+this._h|0},N.prototype._hash=function(){var ve=_.allocUnsafe(32);return ve.writeInt32BE(this._a,0),ve.writeInt32BE(this._b,4),ve.writeInt32BE(this._c,8),ve.writeInt32BE(this._d,12),ve.writeInt32BE(this._e,16),ve.writeInt32BE(this._f,20),ve.writeInt32BE(this._g,24),ve.writeInt32BE(this._h,28),ve},n.exports=N},1686:(n,s,t)=>{var o=t(5717),l=t(7816),_=t(4189),M=t(396).Buffer,w=new Array(160);function N(){this.init(),this._w=w,_.call(this,128,112)}o(N,l),N.prototype.init=function(){return this._ah=3418070365,this._bh=1654270250,this._ch=2438529370,this._dh=355462360,this._eh=1731405415,this._fh=2394180231,this._gh=3675008525,this._hh=1203062813,this._al=3238371032,this._bl=914150663,this._cl=812702999,this._dl=4144912697,this._el=4290775857,this._fl=1750603025,this._gl=1694076839,this._hl=3204075428,this},N.prototype._hash=function(){var V=M.allocUnsafe(48);function X(re,oe,fe){V.writeInt32BE(re,fe),V.writeInt32BE(oe,fe+4)}return X(this._ah,this._al,0),X(this._bh,this._bl,8),X(this._ch,this._cl,16),X(this._dh,this._dl,24),X(this._eh,this._el,32),X(this._fh,this._fl,40),V},n.exports=N},7816:(n,s,t)=>{var o=t(5717),l=t(4189),_=t(396).Buffer,M=[1116352408,3609767458,1899447441,602891725,3049323471,3964484399,3921009573,2173295548,961987163,4081628472,1508970993,3053834265,2453635748,2937671579,2870763221,3664609560,3624381080,2734883394,310598401,1164996542,607225278,1323610764,1426881987,3590304994,1925078388,4068182383,2162078206,991336113,2614888103,633803317,3248222580,3479774868,3835390401,2666613458,4022224774,944711139,264347078,2341262773,604807628,2007800933,770255983,1495990901,1249150122,1856431235,1555081692,3175218132,1996064986,2198950837,2554220882,3999719339,2821834349,766784016,2952996808,2566594879,3210313671,3203337956,3336571891,1034457026,3584528711,2466948901,113926993,3758326383,338241895,168717936,666307205,1188179964,773529912,1546045734,1294757372,1522805485,1396182291,2643833823,1695183700,2343527390,1986661051,1014477480,2177026350,1206759142,2456956037,344077627,2730485921,1290863460,2820302411,3158454273,3259730800,3505952657,3345764771,106217008,3516065817,3606008344,3600352804,1432725776,4094571909,1467031594,275423344,851169720,430227734,3100823752,506948616,1363258195,659060556,3750685593,883997877,3785050280,958139571,3318307427,1322822218,3812723403,1537002063,2003034995,1747873779,3602036899,1955562222,1575990012,2024104815,1125592928,2227730452,2716904306,2361852424,442776044,2428436474,593698344,2756734187,3733110249,3204031479,2999351573,3329325298,3815920427,3391569614,3928383900,3515267271,566280711,3940187606,3454069534,4118630271,4000239992,116418474,1914138554,174292421,2731055270,289380356,3203993006,460393269,320620315,685471733,587496836,852142971,1086792851,1017036298,365543100,1126000580,2618297676,1288033470,3409855158,1501505948,4234509866,1607167915,987167468,1816402316,1246189591],w=new Array(160);function N(){this.init(),this._w=w,l.call(this,128,112)}function V(Ae,Y,Et){return Et^Ae&(Y^Et)}function X(Ae,Y,Et){return Ae&Y|Et&(Ae|Y)}function re(Ae,Y){return(Ae>>>28|Y<<4)^(Y>>>2|Ae<<30)^(Y>>>7|Ae<<25)}function oe(Ae,Y){return(Ae>>>14|Y<<18)^(Ae>>>18|Y<<14)^(Y>>>9|Ae<<23)}function fe(Ae,Y){return(Ae>>>1|Y<<31)^(Ae>>>8|Y<<24)^Ae>>>7}function ve(Ae,Y){return(Ae>>>1|Y<<31)^(Ae>>>8|Y<<24)^(Ae>>>7|Y<<25)}function Pe(Ae,Y){return(Ae>>>19|Y<<13)^(Y>>>29|Ae<<3)^Ae>>>6}function De(Ae,Y){return(Ae>>>19|Y<<13)^(Y>>>29|Ae<<3)^(Ae>>>6|Y<<26)}function Ie(Ae,Y){return Ae>>>0<Y>>>0?1:0}o(N,l),N.prototype.init=function(){return this._ah=1779033703,this._bh=3144134277,this._ch=1013904242,this._dh=2773480762,this._eh=1359893119,this._fh=2600822924,this._gh=528734635,this._hh=1541459225,this._al=4089235720,this._bl=2227873595,this._cl=4271175723,this._dl=1595750129,this._el=2917565137,this._fl=725511199,this._gl=4215389547,this._hl=327033209,this},N.prototype._update=function(Ae){for(var Y=this._w,Et=0|this._ah,ft=0|this._bh,xt=0|this._ch,Ht=0|this._dh,yn=0|this._eh,It=0|this._fh,In=0|this._gh,On=0|this._hh,Yr=0|this._al,Ir=0|this._bl,Hr=0|this._cl,Wr=0|this._dl,En=0|this._el,Un=0|this._fl,Yn=0|this._gl,ir=0|this._hl,An=0;An<32;An+=2)Y[An]=Ae.readInt32BE(4*An),Y[An+1]=Ae.readInt32BE(4*An+4);for(;An<160;An+=2){var Lr=Y[An-30],Wi=Y[An-30+1],Mi=fe(Lr,Wi),Yi=ve(Wi,Lr),jr=Pe(Lr=Y[An-4],Wi=Y[An-4+1]),Nn=De(Wi,Lr),xi=Y[An-32],Ji=Y[An-32+1],Ho=Yi+Y[An-14+1]|0,Ao=Mi+Y[An-14]+Ie(Ho,Yi)|0;Ao=(Ao=Ao+jr+Ie(Ho=Ho+Nn|0,Nn)|0)+xi+Ie(Ho=Ho+Ji|0,Ji)|0,Y[An]=Ao,Y[An+1]=Ho}for(var Vs=0;Vs<160;Vs+=2){Ao=Y[Vs],Ho=Y[Vs+1];var Qs=X(Et,ft,xt),Ri=X(Yr,Ir,Hr),uo=re(Et,Yr),bo=re(Yr,Et),Ye=oe(yn,En),Ct=oe(En,yn),bt=M[Vs],Vn=M[Vs+1],Mr=V(yn,It,In),kr=V(En,Un,Yn),Ni=ir+Ct|0,Zs=On+Ye+Ie(Ni,ir)|0;Zs=(Zs=(Zs=Zs+Mr+Ie(Ni=Ni+kr|0,kr)|0)+bt+Ie(Ni=Ni+Vn|0,Vn)|0)+Ao+Ie(Ni=Ni+Ho|0,Ho)|0;var Vo=bo+Ri|0,il=uo+Qs+Ie(Vo,bo)|0;On=In,ir=Yn,In=It,Yn=Un,It=yn,Un=En,yn=Ht+Zs+Ie(En=Wr+Ni|0,Wr)|0,Ht=xt,Wr=Hr,xt=ft,Hr=Ir,ft=Et,Ir=Yr,Et=Zs+il+Ie(Yr=Ni+Vo|0,Ni)|0}this._al=this._al+Yr|0,this._bl=this._bl+Ir|0,this._cl=this._cl+Hr|0,this._dl=this._dl+Wr|0,this._el=this._el+En|0,this._fl=this._fl+Un|0,this._gl=this._gl+Yn|0,this._hl=this._hl+ir|0,this._ah=this._ah+Et+Ie(this._al,Yr)|0,this._bh=this._bh+ft+Ie(this._bl,Ir)|0,this._ch=this._ch+xt+Ie(this._cl,Hr)|0,this._dh=this._dh+Ht+Ie(this._dl,Wr)|0,this._eh=this._eh+yn+Ie(this._el,En)|0,this._fh=this._fh+It+Ie(this._fl,Un)|0,this._gh=this._gh+In+Ie(this._gl,Yn)|0,this._hh=this._hh+On+Ie(this._hl,ir)|0},N.prototype._hash=function(){var Ae=_.allocUnsafe(64);function Y(Et,ft,xt){Ae.writeInt32BE(Et,xt),Ae.writeInt32BE(ft,xt+4)}return Y(this._ah,this._al,0),Y(this._bh,this._bl,8),Y(this._ch,this._cl,16),Y(this._dh,this._dl,24),Y(this._eh,this._el,32),Y(this._fh,this._fl,40),Y(this._gh,this._gl,48),Y(this._hh,this._hl,56),Ae},n.exports=N},2830:(n,s,t)=>{n.exports=l;var o=t(7187).EventEmitter;function l(){o.call(this)}t(5717)(l,o),l.Readable=t(9481),l.Writable=t(4229),l.Duplex=t(6753),l.Transform=t(4605),l.PassThrough=t(2725),l.finished=t(8610),l.pipeline=t(9946),l.Stream=l,l.prototype.pipe=function(_,M){var w=this;function N(Pe){_.writable&&!1===_.write(Pe)&&w.pause&&w.pause()}function V(){w.readable&&w.resume&&w.resume()}w.on("data",N),_.on("drain",V),_._isStdio||M&&!1===M.end||(w.on("end",re),w.on("close",oe));var X=!1;function re(){X||(X=!0,_.end())}function oe(){X||(X=!0,"function"==typeof _.destroy&&_.destroy())}function fe(Pe){if(ve(),0===o.listenerCount(this,"error"))throw Pe}function ve(){w.removeListener("data",N),_.removeListener("drain",V),w.removeListener("end",re),w.removeListener("close",oe),w.removeListener("error",fe),_.removeListener("error",fe),w.removeListener("end",ve),w.removeListener("close",ve),_.removeListener("close",ve)}return w.on("error",fe),_.on("error",fe),w.on("end",ve),w.on("close",ve),_.on("close",ve),_.emit("pipe",w),_}},2553:(n,s,t)=>{var o=t(396).Buffer,l=o.isEncoding||function(ve){switch((ve=""+ve)&&ve.toLowerCase()){case"hex":case"utf8":case"utf-8":case"ascii":case"binary":case"base64":case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":case"raw":return!0;default:return!1}};function _(ve){var Pe;switch(this.encoding=function(De){var Ie=function(Ae){if(!Ae)return"utf8";for(var Y;;)switch(Ae){case"utf8":case"utf-8":return"utf8";case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":return"utf16le";case"latin1":case"binary":return"latin1";case"base64":case"ascii":case"hex":return Ae;default:if(Y)return;Ae=(""+Ae).toLowerCase(),Y=!0}}(De);if("string"!=typeof Ie&&(o.isEncoding===l||!l(De)))throw new Error("Unknown encoding: "+De);return Ie||De}(ve),this.encoding){case"utf16le":this.text=N,this.end=V,Pe=4;break;case"utf8":this.fillLast=w,Pe=4;break;case"base64":this.text=X,this.end=re,Pe=3;break;default:return this.write=oe,void(this.end=fe)}this.lastNeed=0,this.lastTotal=0,this.lastChar=o.allocUnsafe(Pe)}function M(ve){return ve<=127?0:ve>>5==6?2:ve>>4==14?3:ve>>3==30?4:ve>>6==2?-1:-2}function w(ve){var Pe=this.lastTotal-this.lastNeed,De=function(Ie,Ae,Y){if(128!=(192&Ae[0]))return Ie.lastNeed=0,"\ufffd";if(Ie.lastNeed>1&&Ae.length>1){if(128!=(192&Ae[1]))return Ie.lastNeed=1,"\ufffd";if(Ie.lastNeed>2&&Ae.length>2&&128!=(192&Ae[2]))return Ie.lastNeed=2,"\ufffd"}}(this,ve);return void 0!==De?De:this.lastNeed<=ve.length?(ve.copy(this.lastChar,Pe,0,this.lastNeed),this.lastChar.toString(this.encoding,0,this.lastTotal)):(ve.copy(this.lastChar,Pe,0,ve.length),void(this.lastNeed-=ve.length))}function N(ve,Pe){if((ve.length-Pe)%2==0){var De=ve.toString("utf16le",Pe);if(De){var Ie=De.charCodeAt(De.length-1);if(Ie>=55296&&Ie<=56319)return this.lastNeed=2,this.lastTotal=4,this.lastChar[0]=ve[ve.length-2],this.lastChar[1]=ve[ve.length-1],De.slice(0,-1)}return De}return this.lastNeed=1,this.lastTotal=2,this.lastChar[0]=ve[ve.length-1],ve.toString("utf16le",Pe,ve.length-1)}function V(ve){var Pe=ve&&ve.length?this.write(ve):"";return this.lastNeed?Pe+this.lastChar.toString("utf16le",0,this.lastTotal-this.lastNeed):Pe}function X(ve,Pe){var De=(ve.length-Pe)%3;return 0===De?ve.toString("base64",Pe):(this.lastNeed=3-De,this.lastTotal=3,1===De?this.lastChar[0]=ve[ve.length-1]:(this.lastChar[0]=ve[ve.length-2],this.lastChar[1]=ve[ve.length-1]),ve.toString("base64",Pe,ve.length-De))}function re(ve){var Pe=ve&&ve.length?this.write(ve):"";return this.lastNeed?Pe+this.lastChar.toString("base64",0,3-this.lastNeed):Pe}function oe(ve){return ve.toString(this.encoding)}function fe(ve){return ve&&ve.length?this.write(ve):""}s.s=_,_.prototype.write=function(ve){if(0===ve.length)return"";var Pe,De;if(this.lastNeed){if(void 0===(Pe=this.fillLast(ve)))return"";De=this.lastNeed,this.lastNeed=0}else De=0;return De<ve.length?Pe?Pe+this.text(ve,De):this.text(ve,De):Pe||""},_.prototype.end=function(ve){var Pe=ve&&ve.length?this.write(ve):"";return this.lastNeed?Pe+"\ufffd":Pe},_.prototype.text=function(ve,Pe){var De=function(Ae,Y,Et){var ft=Y.length-1;if(ft<Et)return 0;var xt=M(Y[ft]);return xt>=0?(xt>0&&(Ae.lastNeed=xt-1),xt):--ft<Et||-2===xt?0:(xt=M(Y[ft]))>=0?(xt>0&&(Ae.lastNeed=xt-2),xt):--ft<Et||-2===xt?0:(xt=M(Y[ft]))>=0?(xt>0&&(2===xt?xt=0:Ae.lastNeed=xt-3),xt):0}(this,ve,Pe);if(!this.lastNeed)return ve.toString("utf8",Pe);this.lastTotal=De;var Ie=ve.length-(De-this.lastNeed);return ve.copy(this.lastChar,0,Ie),ve.toString("utf8",Pe,Ie)},_.prototype.fillLast=function(ve){if(this.lastNeed<=ve.length)return ve.copy(this.lastChar,this.lastTotal-this.lastNeed,0,this.lastNeed),this.lastChar.toString(this.encoding,0,this.lastTotal);ve.copy(this.lastChar,this.lastTotal-this.lastNeed,0,ve.length),this.lastNeed-=ve.length}},396:(n,s,t)=>{var o=t(8764),l=o.Buffer;function _(w,N){for(var V in w)N[V]=w[V]}function M(w,N,V){return l(w,N,V)}l.from&&l.alloc&&l.allocUnsafe&&l.allocUnsafeSlow?n.exports=o:(_(o,s),s.Buffer=M),M.prototype=Object.create(l.prototype),_(l,M),M.from=function(w,N,V){if("number"==typeof w)throw new TypeError("Argument must not be a number");return l(w,N,V)},M.alloc=function(w,N,V){if("number"!=typeof w)throw new TypeError("Argument must be a number");var X=l(w);return void 0!==N?"string"==typeof V?X.fill(N,V):X.fill(N):X.fill(0),X},M.allocUnsafe=function(w){if("number"!=typeof w)throw new TypeError("Argument must be a number");return l(w)},M.allocUnsafeSlow=function(w){if("number"!=typeof w)throw new TypeError("Argument must be a number");return o.SlowBuffer(w)}},4927:(n,s,t)=>{function o(l){try{if(!t.g.localStorage)return!1}catch(M){return!1}var _=t.g.localStorage[l];return null!=_&&"true"===String(_).toLowerCase()}n.exports=function(l,_){if(o("noDeprecation"))return l;var M=!1;return function(){if(!M){if(o("throwDeprecation"))throw new Error(_);o("traceDeprecation")?console.trace(_):console.warn(_),M=!0}return l.apply(this,arguments)}}},255:n=>{var s={"&":"&amp;",'"':"&quot;","'":"&apos;","<":"&lt;",">":"&gt;"};n.exports=function(t){return t&&t.replace?t.replace(/([&"<>'])/g,function(o,l){return s[l]}):t}},3479:(n,s,t)=>{var o=t(4155),l=t(255),_=t(2830).Stream;function M(N,V,X){X=X||0;var re,oe,fe=(re=V,new Array(X||0).join(re||"")),ve=N;if("object"==typeof N&&(ve=N[oe=Object.keys(N)[0]])&&ve._elem)return ve._elem.name=oe,ve._elem.icount=X,ve._elem.indent=V,ve._elem.indents=fe,ve._elem.interrupt=ve,ve._elem;var Pe,De=[],Ie=[];function Ae(Y){Object.keys(Y).forEach(function(Et){De.push(Et+'="'+l(Y[Et])+'"')})}switch(typeof ve){case"object":if(null===ve)break;ve._attr&&Ae(ve._attr),ve._cdata&&Ie.push(("<![CDATA["+ve._cdata).replace(/\]\]>/g,"]]]]><![CDATA[>")+"]]>"),ve.forEach&&(Pe=!1,Ie.push(""),ve.forEach(function(Y){"object"==typeof Y?"_attr"==Object.keys(Y)[0]?Ae(Y._attr):Ie.push(M(Y,V,X+1)):(Ie.pop(),Pe=!0,Ie.push(l(Y)))}),Pe||Ie.push(""));break;default:Ie.push(l(ve))}return{name:oe,interrupt:!1,attributes:De,content:Ie,icount:X,indents:fe,indent:V}}function w(N,V,X){if("object"!=typeof V)return N(!1,V);var re=V.interrupt?1:V.content.length;function oe(){for(;V.content.length;){var ve=V.content.shift();if(void 0!==ve){if(fe(ve))return;w(N,ve)}}N(!1,(re>1?V.indents:"")+(V.name?"</"+V.name+">":"")+(V.indent&&!X?"\n":"")),X&&X()}function fe(ve){return!!ve.interrupt&&(ve.interrupt.append=N,ve.interrupt.end=oe,ve.interrupt=!1,N(!0),!0)}if(N(!1,V.indents+(V.name?"<"+V.name:"")+(V.attributes.length?" "+V.attributes.join(" "):"")+(re?V.name?">":"":V.name?"/>":"")+(V.indent&&re>1?"\n":"")),!re)return N(!1,V.indent?"\n":"");fe(V)||oe()}n.exports=function(N,V){"object"!=typeof V&&(V={indent:V});var X,re,oe=V.stream?new _:null,fe="",ve=!1,Pe=V.indent?!0===V.indent?"    ":V.indent:"",De=!0;function Ie(ft){De?o.nextTick(ft):ft()}function Ae(ft,xt){if(void 0!==xt&&(fe+=xt),ft&&!ve&&(oe=oe||new _,ve=!0),ft&&ve){var Ht=fe;Ie(function(){oe.emit("data",Ht)}),fe=""}}function Y(ft,xt){w(Ae,M(ft,Pe,Pe?1:0),xt)}function Et(){if(oe){var ft=fe;Ie(function(){oe.emit("data",ft),oe.emit("end"),oe.readable=!1,oe.emit("close")})}}return Ie(function(){De=!1}),V.declaration&&(re={version:"1.0",encoding:(X=V.declaration).encoding||"UTF-8"},X.standalone&&(re.standalone=X.standalone),Y({"?xml":{_attr:re}}),fe=fe.replace("/>","?>")),N&&N.forEach?N.forEach(function(ft,xt){var Ht;xt+1===N.length&&(Ht=Et),Y(ft,Ht)}):Y(N,Et),oe?(oe.readable=!0,oe):fe},n.exports.element=n.exports.Element=function(){var N=Array.prototype.slice.call(arguments),V={_elem:M(N),push:function(X){if(!this.append)throw new Error("not assigned to a parent!");var re=this,oe=this._elem.indent;w(this.append,M(X,oe,this._elem.icount+(oe?1:0)),function(){re.append(!0)})},close:function(X){void 0!==X&&this.push(X),this.end&&this.end()}};return V}},5102:(n,s,t)=>{var o={"./all.js":5308,"./auth/actions.js":5812,"./auth/index.js":3705,"./auth/reducers.js":3962,"./auth/selectors.js":35,"./auth/spec-wrap-actions.js":8302,"./configs/actions.js":714,"./configs/helpers.js":2256,"./configs/index.js":1661,"./configs/reducers.js":7743,"./configs/selectors.js":9018,"./configs/spec-actions.js":2698,"./deep-linking/helpers.js":1970,"./deep-linking/index.js":4980,"./deep-linking/layout.js":5858,"./deep-linking/operation-tag-wrapper.jsx":4584,"./deep-linking/operation-wrapper.jsx":877,"./download-url.js":8011,"./err/actions.js":4966,"./err/error-transformers/hook.js":6808,"./err/error-transformers/transformers/not-of-type.js":2392,"./err/error-transformers/transformers/parameter-oneof.js":1835,"./err/index.js":7793,"./err/reducers.js":3527,"./err/selectors.js":7667,"./filter/index.js":9978,"./filter/opsFilter.js":4309,"./layout/actions.js":5474,"./layout/index.js":6821,"./layout/reducers.js":5672,"./layout/selectors.js":4400,"./layout/spec-extensions/wrap-selector.js":8989,"./logs/index.js":9150,"./oas3/actions.js":7002,"./oas3/auth-extensions/wrap-selectors.js":3723,"./oas3/components/callbacks.jsx":3427,"./oas3/components/http-auth.jsx":6775,"./oas3/components/index.js":6467,"./oas3/components/operation-link.jsx":5757,"./oas3/components/operation-servers.jsx":6796,"./oas3/components/request-body-editor.jsx":5327,"./oas3/components/request-body.jsx":2458,"./oas3/components/servers-container.jsx":9928,"./oas3/components/servers.jsx":6617,"./oas3/helpers.jsx":7779,"./oas3/index.js":7451,"./oas3/reducers.js":9666,"./oas3/selectors.js":5065,"./oas3/spec-extensions/selectors.js":1741,"./oas3/spec-extensions/wrap-selectors.js":2044,"./oas3/wrap-components/auth-item.jsx":356,"./oas3/wrap-components/index.js":7761,"./oas3/wrap-components/json-schema-string.jsx":287,"./oas3/wrap-components/markdown.jsx":2460,"./oas3/wrap-components/model.jsx":3499,"./oas3/wrap-components/online-validator-badge.js":58,"./oas3/wrap-components/version-stamp.jsx":9487,"./on-complete/index.js":8560,"./request-snippets/fn.js":4624,"./request-snippets/index.js":6575,"./request-snippets/request-snippets.jsx":4206,"./request-snippets/selectors.js":4669,"./safe-render/components/error-boundary.jsx":6195,"./safe-render/components/fallback.jsx":9403,"./safe-render/fn.jsx":6189,"./safe-render/index.js":8102,"./samples/fn.js":2473,"./samples/index.js":8883,"./spec/actions.js":1737,"./spec/index.js":7038,"./spec/reducers.js":32,"./spec/selectors.js":3881,"./spec/wrap-actions.js":7508,"./swagger-js/configs-wrap-actions.js":4852,"./swagger-js/index.js":2990,"./util/index.js":8525,"./view/fn.js":8347,"./view/index.js":3420,"./view/root-injects.jsx":5005,"core/plugins/all.js":5308,"core/plugins/auth/actions.js":5812,"core/plugins/auth/index.js":3705,"core/plugins/auth/reducers.js":3962,"core/plugins/auth/selectors.js":35,"core/plugins/auth/spec-wrap-actions.js":8302,"core/plugins/configs/actions.js":714,"core/plugins/configs/helpers.js":2256,"core/plugins/configs/index.js":1661,"core/plugins/configs/reducers.js":7743,"core/plugins/configs/selectors.js":9018,"core/plugins/configs/spec-actions.js":2698,"core/plugins/deep-linking/helpers.js":1970,"core/plugins/deep-linking/index.js":4980,"core/plugins/deep-linking/layout.js":5858,"core/plugins/deep-linking/operation-tag-wrapper.jsx":4584,"core/plugins/deep-linking/operation-wrapper.jsx":877,"core/plugins/download-url.js":8011,"core/plugins/err/actions.js":4966,"core/plugins/err/error-transformers/hook.js":6808,"core/plugins/err/error-transformers/transformers/not-of-type.js":2392,"core/plugins/err/error-transformers/transformers/parameter-oneof.js":1835,"core/plugins/err/index.js":7793,"core/plugins/err/reducers.js":3527,"core/plugins/err/selectors.js":7667,"core/plugins/filter/index.js":9978,"core/plugins/filter/opsFilter.js":4309,"core/plugins/layout/actions.js":5474,"core/plugins/layout/index.js":6821,"core/plugins/layout/reducers.js":5672,"core/plugins/layout/selectors.js":4400,"core/plugins/layout/spec-extensions/wrap-selector.js":8989,"core/plugins/logs/index.js":9150,"core/plugins/oas3/actions.js":7002,"core/plugins/oas3/auth-extensions/wrap-selectors.js":3723,"core/plugins/oas3/components/callbacks.jsx":3427,"core/plugins/oas3/components/http-auth.jsx":6775,"core/plugins/oas3/components/index.js":6467,"core/plugins/oas3/components/operation-link.jsx":5757,"core/plugins/oas3/components/operation-servers.jsx":6796,"core/plugins/oas3/components/request-body-editor.jsx":5327,"core/plugins/oas3/components/request-body.jsx":2458,"core/plugins/oas3/components/servers-container.jsx":9928,"core/plugins/oas3/components/servers.jsx":6617,"core/plugins/oas3/helpers.jsx":7779,"core/plugins/oas3/index.js":7451,"core/plugins/oas3/reducers.js":9666,"core/plugins/oas3/selectors.js":5065,"core/plugins/oas3/spec-extensions/selectors.js":1741,"core/plugins/oas3/spec-extensions/wrap-selectors.js":2044,"core/plugins/oas3/wrap-components/auth-item.jsx":356,"core/plugins/oas3/wrap-components/index.js":7761,"core/plugins/oas3/wrap-components/json-schema-string.jsx":287,"core/plugins/oas3/wrap-components/markdown.jsx":2460,"core/plugins/oas3/wrap-components/model.jsx":3499,"core/plugins/oas3/wrap-components/online-validator-badge.js":58,"core/plugins/oas3/wrap-components/version-stamp.jsx":9487,"core/plugins/on-complete/index.js":8560,"core/plugins/request-snippets/fn.js":4624,"core/plugins/request-snippets/index.js":6575,"core/plugins/request-snippets/request-snippets.jsx":4206,"core/plugins/request-snippets/selectors.js":4669,"core/plugins/safe-render/components/error-boundary.jsx":6195,"core/plugins/safe-render/components/fallback.jsx":9403,"core/plugins/safe-render/fn.jsx":6189,"core/plugins/safe-render/index.js":8102,"core/plugins/samples/fn.js":2473,"core/plugins/samples/index.js":8883,"core/plugins/spec/actions.js":1737,"core/plugins/spec/index.js":7038,"core/plugins/spec/reducers.js":32,"core/plugins/spec/selectors.js":3881,"core/plugins/spec/wrap-actions.js":7508,"core/plugins/swagger-js/configs-wrap-actions.js":4852,"core/plugins/swagger-js/index.js":2990,"core/plugins/util/index.js":8525,"core/plugins/view/fn.js":8347,"core/plugins/view/index.js":3420,"core/plugins/view/root-injects.jsx":5005};function l(M){var w=_(M);return t(w)}function _(M){if(!t.o(o,M)){var w=new Error("Cannot find module '"+M+"'");throw w.code="MODULE_NOT_FOUND",w}return o[M]}l.keys=function(){return Object.keys(o)},l.resolve=_,n.exports=l,l.id=5102},2517:n=>{n.exports="data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMjAwcHgiICBoZWlnaHQ9IjIwMHB4IiAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB2aWV3Qm94PSIwIDAgMTAwIDEwMCIgcHJlc2VydmVBc3BlY3RSYXRpbz0ieE1pZFlNaWQiIGNsYXNzPSJsZHMtcm9sbGluZyIgc3R5bGU9ImJhY2tncm91bmQtaW1hZ2U6IG5vbmU7IGJhY2tncm91bmQtcG9zaXRpb246IGluaXRpYWwgaW5pdGlhbDsgYmFja2dyb3VuZC1yZXBlYXQ6IGluaXRpYWwgaW5pdGlhbDsiPjxjaXJjbGUgY3g9IjUwIiBjeT0iNTAiIGZpbGw9Im5vbmUiIG5nLWF0dHItc3Ryb2tlPSJ7e2NvbmZpZy5jb2xvcn19IiBuZy1hdHRyLXN0cm9rZS13aWR0aD0ie3tjb25maWcud2lkdGh9fSIgbmctYXR0ci1yPSJ7e2NvbmZpZy5yYWRpdXN9fSIgbmctYXR0ci1zdHJva2UtZGFzaGFycmF5PSJ7e2NvbmZpZy5kYXNoYXJyYXl9fSIgc3Ryb2tlPSIjNTU1NTU1IiBzdHJva2Utd2lkdGg9IjEwIiByPSIzNSIgc3Ryb2tlLWRhc2hhcnJheT0iMTY0LjkzMzYxNDMxMzQ2NDE1IDU2Ljk3Nzg3MTQzNzgyMTM4Ij48YW5pbWF0ZVRyYW5zZm9ybSBhdHRyaWJ1dGVOYW1lPSJ0cmFuc2Zvcm0iIHR5cGU9InJvdGF0ZSIgY2FsY01vZGU9ImxpbmVhciIgdmFsdWVzPSIwIDUwIDUwOzM2MCA1MCA1MCIga2V5VGltZXM9IjA7MSIgZHVyPSIxcyIgYmVnaW49IjBzIiByZXBlYXRDb3VudD0iaW5kZWZpbml0ZSI+PC9hbmltYXRlVHJhbnNmb3JtPjwvY2lyY2xlPjwvc3ZnPgo="},5163:n=>{n.exports='---\nurl: "https://petstore.swagger.io/v2/swagger.json"\ndom_id: "#swagger-ui"\nvalidatorUrl: "https://validator.swagger.io/validator"\n'},8898:(n,s,t)=>{var l;n.exports=(t.d(l={},{default:()=>i5()}),l)},4163:(n,s,t)=>{var l;n.exports=(t.d(l={},{default:()=>s5()}),l)},5527:(n,s,t)=>{var l;n.exports=(t.d(l={},{default:()=>l5()}),l)},5171:(n,s,t)=>{var l;n.exports=(t.d(l={},{default:()=>c5()}),l)},2954:(n,s,t)=>{var l;n.exports=(t.d(l={},{default:()=>f5()}),l)},7930:(n,s,t)=>{var l;n.exports=(t.d(l={},{default:()=>h5()}),l)},6145:(n,s,t)=>{var l;n.exports=(t.d(l={},{default:()=>g5()}),l)},1778:(n,s,t)=>{var l;n.exports=(t.d(l={},{default:()=>v5()}),l)},29:(n,s,t)=>{var l;n.exports=(t.d(l={},{default:()=>E5()}),l)},2372:(n,s,t)=>{var l;n.exports=(t.d(l={},{default:()=>S5()}),l)},8818:(n,s,t)=>{var l;n.exports=(t.d(l={},{default:()=>C5()}),l)},5487:(n,s,t)=>{var l;n.exports=(t.d(l={},{default:()=>O5()}),l)},2565:(n,s,t)=>{var l;n.exports=(t.d(l={},{default:()=>D5()}),l)},6785:(n,s,t)=>{var l;n.exports=(t.d(l={},{default:()=>x5()}),l)},8136:(n,s,t)=>{var l;n.exports=(t.d(l={},{default:()=>N5()}),l)},9963:(n,s,t)=>{var l;n.exports=(t.d(l={},{default:()=>I5()}),l)},4350:(n,s,t)=>{var l;n.exports=(t.d(l={},{default:()=>F5()}),l)},3590:(n,s,t)=>{var l;n.exports=(t.d(l={},{default:()=>$5()}),l)},5942:(n,s,t)=>{var l;n.exports=(t.d(l={},{default:()=>B5()}),l)},313:(n,s,t)=>{var l;n.exports=(t.d(l={},{default:()=>Y5()}),l)},6914:(n,s,t)=>{var l;n.exports=(t.d(l={},{default:()=>G5()}),l)},7512:(n,s,t)=>{var l;n.exports=(t.d(l={},{default:()=>V5()}),l)},2740:(n,s,t)=>{var l;n.exports=(t.d(l={},{default:()=>W5()}),l)},374:(n,s,t)=>{var l;n.exports=(t.d(l={},{default:()=>Q5()}),l)},6235:(n,s,t)=>{var l;n.exports=(t.d(l={},{default:()=>X5()}),l)},3769:(n,s,t)=>{var l;n.exports=(t.d(l={},{default:()=>eL()}),l)},6340:(n,s,t)=>{var l;n.exports=(t.d(l={},{default:()=>ER}),l)},7344:(n,s,t)=>{var l;n.exports=(t.d(l={},{default:()=>tL}),l)},8656:(n,s,t)=>{var l;n.exports=(t.d(l={},{default:()=>nL}),l)},3248:(n,s,t)=>{var l;n.exports=(t.d(l={},{default:()=>rL}),l)},5416:(n,s,t)=>{var l;n.exports=(t.d(l={},{default:()=>oL}),l)},775:(n,s,t)=>{var l;n.exports=(t.d(l={},{default:()=>ZD}),l)},863:(n,s,t)=>{var l;n.exports=(t.d(l={},{default:()=>AA}),l)},9972:(n,s,t)=>{var l;n.exports=(t.d(l={},{default:()=>sL}),l)},1013:(n,s,t)=>{var l;n.exports=(t.d(l={},{default:()=>Hc}),l)},302:(n,s,t)=>{var l;n.exports=(t.d(l={},{default:()=>Ux}),l)},9334:(n,s,t)=>{var l;n.exports=(t.d(l={},{default:()=>lL}),l)},2691:(n,s,t)=>{var l;n.exports=(t.d(l={},{default:()=>dL}),l)},1581:(n,s,t)=>{var l;n.exports=(t.d(l={},{default:()=>jv}),l)},4780:n=>{n.exports=pL},8096:(n,s,t)=>{var l;n.exports=(t.d(l={},{default:()=>_L()}),l)},3294:n=>{n.exports=mL},9725:(n,s,t)=>{var l;n.exports=(t.d(l={},{List:()=>Lg.List,Map:()=>Lg.Map,OrderedMap:()=>Lg.OrderedMap,Seq:()=>Lg.Seq,Set:()=>Lg.Set,default:()=>rO(),fromJS:()=>Lg.fromJS}),l)},626:(n,s,t)=>{var l;n.exports=(t.d(l={},{JSON_SCHEMA:()=>qw,default:()=>zO}),l)},9908:(n,s,t)=>{var l;n.exports=(t.d(l={},{default:()=>A0()}),l)},7068:(n,s,t)=>{var l;n.exports=(t.d(l={},{default:()=>yL()}),l)},5476:(n,s,t)=>{var l;n.exports=(t.d(l={},{default:()=>bL()}),l)},5053:(n,s,t)=>{var l;n.exports=(t.d(l={},{default:()=>TL()}),l)},810:(n,s,t)=>{var l;n.exports=(t.d(l={},{Component:()=>$l.Component,PureComponent:()=>$l.PureComponent,default:()=>$l,useEffect:()=>$l.useEffect,useRef:()=>$l.useRef,useState:()=>$l.useState}),l)},9874:(n,s,t)=>{var l;n.exports=(t.d(l={},{CopyToClipboard:()=>CL.CopyToClipboard}),l)},9569:(n,s,t)=>{var l;n.exports=(t.d(l={},{default:()=>OL()}),l)},9871:(n,s,t)=>{var l;n.exports=(t.d(l={},{applyMiddleware:()=>PL,bindActionCreators:()=>NL,compose:()=>wR,createStore:()=>AR}),l)},3952:(n,s,t)=>{var l;n.exports=(t.d(l={},{Remarkable:()=>ev}),l)},8639:(n,s,t)=>{var l;n.exports=(t.d(l={},{createSelector:()=>WR}),l)},8518:(n,s,t)=>{var l;n.exports=(t.d(l={},{serializeError:()=>T7.serializeError}),l)},5013:(n,s,t)=>{var l;n.exports=(t.d(l={},{opId:()=>fA}),l)},8900:(n,s,t)=>{var l;n.exports=(t.d(l={},{default:()=>M7()}),l)},2361:()=>{},4616:()=>{}},JR={};function xo(n){var s=JR[n];if(void 0!==s)return s.exports;var t=JR[n]={exports:{}};return z7[n](t,t.exports,xo),t.exports}xo.n=n=>{var s=n&&n.__esModule?()=>n.default:()=>n;return xo.d(s,{a:s}),s},xo.d=(n,s)=>{for(var t in s)xo.o(s,t)&&!xo.o(n,t)&&Object.defineProperty(n,t,{enumerable:!0,get:s[t]})},xo.g=function(){if("object"==typeof globalThis)return globalThis;try{return this||new Function("return this")()}catch(n){if("object"==typeof window)return window}}(),xo.o=(n,s)=>Object.prototype.hasOwnProperty.call(n,s),xo.r=n=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(n,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(n,"__esModule",{value:!0})};var QR={};(()=>{xo.d(QR,{Z:()=>rk});var n={};xo.r(n),xo.d(n,{Button:()=>o3,Col:()=>f9,Collapse:()=>u3,Container:()=>d9,Input:()=>_9,Link:()=>a3,Row:()=>p9,Select:()=>s3,TextArea:()=>h9});var s={};xo.r(s),xo.d(s,{JsonSchemaArrayItemFile:()=>jA,JsonSchemaArrayItemText:()=>YA,JsonSchemaForm:()=>_3,JsonSchema_array:()=>m3,JsonSchema_boolean:()=>v3,JsonSchema_object:()=>y3,JsonSchema_string:()=>g3});var t=xo(1581),o=xo(5171);const l=(xo.d(qt={},{default:()=>A7()}),qt);var qt,_=xo(6145),M=xo(2740),w=xo(313),N=xo(7698),V=xo.n(N),X=xo(775),re=xo(7344),oe=xo(8656),fe=xo(5527),ve=xo(7512),Pe=xo(8136),De=xo(4163),Ie=xo(6785),Ae=xo(2565),Y=xo(810),Et=xo(9871),ft=xo(9725);const xt=(bn=>{var qt={};return xo.d(qt,bn),qt})({combineReducers:()=>D7.U});var Ht=xo(8518);const yn=(bn=>{var qt={};return xo.d(qt,bn),qt})({default:()=>x7()});var It=xo(4966),In=xo(7504),On=xo(6298),Yr=function(bn){return bn},Ir=function(){function bn(){var qt,ut=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};(0,re.default)(this,bn),V()(this,{state:{},plugins:[],pluginsOptions:{},system:{configs:{},fn:{},components:{},rootInjects:{},statePlugins:{}},boundSystem:{},toolbox:{}},ut),this.getSystem=(0,fe.default)(qt=this._getSystem).call(qt,this),this.store=Yn(Yr,(0,ft.fromJS)(this.state),this.getSystem),this.buildSystem(!1),this.register(this.plugins)}return(0,oe.default)(bn,[{key:"getStore",value:function(){return this.store}},{key:"register",value:function(qt){var ut=!(arguments.length>1&&void 0!==arguments[1])||arguments[1],ze=Hr(qt,this.getSystem(),this.pluginsOptions);En(this.system,ze),ut&&this.buildSystem();var Ze=Wr.call(this.system,qt,this.getSystem());Ze&&this.buildSystem()}},{key:"buildSystem",value:function(){var qt=!(arguments.length>0&&void 0!==arguments[0])||arguments[0],ut=this.getStore().dispatch,ze=this.getStore().getState;this.boundSystem=(0,ve.default)({},this.getRootInjects(),this.getWrappedAndBoundActions(ut),this.getWrappedAndBoundSelectors(ze,this.getSystem),this.getStateThunks(ze),this.getFn(),this.getConfigs()),qt&&this.rebuildReducer()}},{key:"_getSystem",value:function(){return this.boundSystem}},{key:"getRootInjects",value:function(){var qt,ut,ze;return(0,ve.default)({getSystem:this.getSystem,getStore:(0,fe.default)(qt=this.getStore).call(qt,this),getComponents:(0,fe.default)(ut=this.getComponents).call(ut,this),getState:this.getStore().getState,getConfigs:(0,fe.default)(ze=this._getConfigs).call(ze,this),Im:ft.default,React:Y.default},this.system.rootInjects||{})}},{key:"_getConfigs",value:function(){return this.system.configs}},{key:"getConfigs",value:function(){return{configs:this.system.configs}}},{key:"setConfigs",value:function(qt){this.system.configs=qt}},{key:"rebuildReducer",value:function(){var qt,ut,ze;this.store.replaceReducer((qt=(0,On.Ay)(this.system.statePlugins,function(qe){return qe.reducers}),ze=(0,Ie.default)(ut=(0,M.default)(qt)).call(ut,function(qe,Ot){return qe[Ot]=(At=qt[Ot],function(){var Jt=arguments.length>0&&void 0!==arguments[0]?arguments[0]:new ft.Map,Tn=arguments.length>1?arguments[1]:void 0;if(!At)return Jt;var Wn=At[Tn.type];if(Wn){var Hn=Un(Wn)(Jt,Tn);return null===Hn?Jt:Hn}return Jt}),qe;var At},{}),(0,M.default)(ze).length?(0,xt.combineReducers)(ze):Yr))}},{key:"getType",value:function(qt){var ut=qt[0].toUpperCase()+(0,Pe.default)(qt).call(qt,1);return(0,On.Q2)(this.system.statePlugins,function(ze,Ze){var qe=ze[qt];if(qe)return(0,X.default)({},Ze+ut,qe)})}},{key:"getSelectors",value:function(){return this.getType("selectors")}},{key:"getActions",value:function(){var qt=this.getType("actions");return(0,On.Ay)(qt,function(ut){return(0,On.Q2)(ut,function(ze,Ze){if((0,On.LQ)(ze))return(0,X.default)({},Ze,ze)})})}},{key:"getWrappedAndBoundActions",value:function(qt){var ut=this,ze=this.getBoundActions(qt);return(0,On.Ay)(ze,function(Ze,qe){var Ot=ut.system.statePlugins[(0,Pe.default)(qe).call(qe,0,-7)].wrapActions;return Ot?(0,On.Ay)(Ze,function(At,Jt){var Tn=Ot[Jt];return Tn?((0,De.default)(Tn)||(Tn=[Tn]),(0,Ie.default)(Tn).call(Tn,function(Wn,Hn){var sr=function(){return Hn(Wn,ut.getSystem()).apply(void 0,arguments)};if(!(0,On.LQ)(sr))throw new TypeError("wrapActions needs to return a function that returns a new function (ie the wrapped action)");return Un(sr)},At||Function.prototype)):At}):Ze})}},{key:"getWrappedAndBoundSelectors",value:function(qt,ut){var ze=this,Ze=this.getBoundSelectors(qt,ut);return(0,On.Ay)(Ze,function(qe,Ot){var At=[(0,Pe.default)(Ot).call(Ot,0,-9)],Jt=ze.system.statePlugins[At].wrapSelectors;return Jt?(0,On.Ay)(qe,function(Tn,Wn){var Hn=Jt[Wn];return Hn?((0,De.default)(Hn)||(Hn=[Hn]),(0,Ie.default)(Hn).call(Hn,function(sr,hi){var li=function(){for(var wi,Pi=arguments.length,co=new Array(Pi),Xi=0;Xi<Pi;Xi++)co[Xi]=arguments[Xi];return hi(sr,ze.getSystem()).apply(void 0,(0,o.default)(wi=[qt().getIn(At)]).call(wi,co))};if(!(0,On.LQ)(li))throw new TypeError("wrapSelector needs to return a function that returns a new function (ie the wrapped action)");return li},Tn||Function.prototype)):Tn}):qe})}},{key:"getStates",value:function(qt){var ut;return(0,Ie.default)(ut=(0,M.default)(this.system.statePlugins)).call(ut,function(ze,Ze){return ze[Ze]=qt.get(Ze),ze},{})}},{key:"getStateThunks",value:function(qt){var ut;return(0,Ie.default)(ut=(0,M.default)(this.system.statePlugins)).call(ut,function(ze,Ze){return ze[Ze]=function(){return qt().get(Ze)},ze},{})}},{key:"getFn",value:function(){return{fn:this.system.fn}}},{key:"getComponents",value:function(qt){var ut=this,ze=this.system.components[qt];return(0,De.default)(ze)?(0,Ie.default)(ze).call(ze,function(Ze,qe){return qe(Ze,ut.getSystem())}):void 0!==qt?this.system.components[qt]:this.system.components}},{key:"getBoundSelectors",value:function(qt,ut){return(0,On.Ay)(this.getSelectors(),function(ze,Ze){var qe=[(0,Pe.default)(Ze).call(Ze,0,-9)],Ot=function(){return qt().getIn(qe)};return(0,On.Ay)(ze,function(At){return function(){for(var Jt,Tn=arguments.length,Wn=new Array(Tn),Hn=0;Hn<Tn;Hn++)Wn[Hn]=arguments[Hn];var sr=Un(At).apply(null,(0,o.default)(Jt=[Ot()]).call(Jt,Wn));return"function"==typeof sr&&(sr=Un(sr)(ut())),sr}})})}},{key:"getBoundActions",value:function(qt){qt=qt||this.getStore().dispatch;var ut=this.getActions(),ze=function Ze(qe){return"function"!=typeof qe?(0,On.Ay)(qe,function(Ot){return Ze(Ot)}):function(){var Ot=null;try{Ot=qe.apply(void 0,arguments)}catch(At){Ot={type:It.NEW_THROWN_ERR,error:!0,payload:(0,Ht.serializeError)(At)}}finally{return Ot}}};return(0,On.Ay)(ut,function(Ze){return(0,Et.bindActionCreators)(ze(Ze),qt)})}},{key:"getMapStateToProps",value:function(){var qt=this;return function(){return(0,ve.default)({},qt.getSystem())}}},{key:"getMapDispatchToProps",value:function(qt){var ut=this;return function(ze){return V()({},ut.getWrappedAndBoundActions(ze),ut.getFn(),qt)}}}]),bn}();function Hr(bn,qt,ut){if((0,On.Kn)(bn)&&!(0,On.kJ)(bn))return(0,yn.default)({},bn);if((0,On.Wl)(bn))return Hr(bn(qt),qt,ut);if((0,On.kJ)(bn)){var ze,Ze="chain"===ut.pluginLoadType?qt.getComponents():{};return(0,Ie.default)(ze=(0,Ae.default)(bn).call(bn,function(qe){return Hr(qe,qt,ut)})).call(ze,En,Ze)}return{}}function Wr(bn,qt){var ut=this,ze=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{},Ze=ze.hasLoaded,qe=Ze;return(0,On.Kn)(bn)&&!(0,On.kJ)(bn)&&"function"==typeof bn.afterLoad&&(qe=!0,Un(bn.afterLoad).call(this,qt)),(0,On.Wl)(bn)?Wr.call(this,bn(qt),qt,{hasLoaded:qe}):(0,On.kJ)(bn)?(0,Ae.default)(bn).call(bn,function(Ot){return Wr.call(ut,Ot,qt,{hasLoaded:qe})}):qe}function En(){var bn=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},qt=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};if(!(0,On.Kn)(bn))return{};if(!(0,On.Kn)(qt))return bn;qt.wrapComponents&&((0,On.Ay)(qt.wrapComponents,function(hi,li){var wi=bn.components&&bn.components[li];wi&&(0,De.default)(wi)?(bn.components[li]=(0,o.default)(wi).call(wi,[hi]),delete qt.wrapComponents[li]):wi&&(bn.components[li]=[wi,hi],delete qt.wrapComponents[li])}),(0,M.default)(qt.wrapComponents).length||delete qt.wrapComponents);var ut=bn.statePlugins;if((0,On.Kn)(ut))for(var ze in ut){var Ze=ut[ze];if((0,On.Kn)(Ze)){var qe=Ze.wrapActions,Ot=Ze.wrapSelectors;if((0,On.Kn)(qe))for(var At in qe){var Jt,Tn=qe[At];(0,De.default)(Tn)||(qe[At]=Tn=[Tn]),qt&&qt.statePlugins&&qt.statePlugins[ze]&&qt.statePlugins[ze].wrapActions&&qt.statePlugins[ze].wrapActions[At]&&(qt.statePlugins[ze].wrapActions[At]=(0,o.default)(Jt=qe[At]).call(Jt,qt.statePlugins[ze].wrapActions[At]))}if((0,On.Kn)(Ot))for(var Wn in Ot){var Hn,sr=Ot[Wn];(0,De.default)(sr)||(Ot[Wn]=sr=[sr]),qt&&qt.statePlugins&&qt.statePlugins[ze]&&qt.statePlugins[ze].wrapSelectors&&qt.statePlugins[ze].wrapSelectors[Wn]&&(qt.statePlugins[ze].wrapSelectors[Wn]=(0,o.default)(Hn=Ot[Wn]).call(Hn,qt.statePlugins[ze].wrapSelectors[Wn]))}}}return V()(bn,qt)}function Un(bn){var qt=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},ut=qt.logErrors,ze=void 0===ut||ut;return"function"!=typeof bn?bn:function(){try{for(var Ze,qe=arguments.length,Ot=new Array(qe),At=0;At<qe;At++)Ot[At]=arguments[At];return bn.call.apply(bn,(0,o.default)(Ze=[this]).call(Ze,Ot))}catch(Jt){return ze&&console.error(Jt),null}}}function Yn(bn,qt,ut){var Ze,qe,At;return Ze=bn,qe=qt,At=[(0,On._5)(ut)],(0,Et.createStore)(Ze,qe,(In.Z.__REDUX_DEVTOOLS_EXTENSION_COMPOSE__||Et.compose)(Et.applyMiddleware.apply(void 0,At)))}var ir=xo(7793),An=xo(6821),Lr=xo(7038),Wi=xo(3420),Mi=xo(8883),Yi=xo(6575),jr=xo(9150),Nn=xo(2990),fn=xo(3705),Vr=xo(8525),xi=xo(8011),Ji=xo(1661),Ho=xo(4980),Ao=xo(9978),Vs=xo(8560),Qs=xo(8102),Ri=xo(6340),uo=xo(9972),bo=xo(5416),Ye=xo(8818),Ct=(xo(5053),xo(9569),xo(5013)),bt=function(bn){(0,uo.default)(ut,bn);var qt=(0,bo.default)(ut);function ut(ze,Ze){var qe;(0,re.default)(this,ut),qe=qt.call(this,ze,Ze),(0,X.default)((0,Ri.default)(qe),"toggleShown",function(){var At=qe.props,Jt=At.layoutActions,Tn=At.tag,Wn=At.operationId,Hn=At.isShown,sr=qe.getResolvedSubtree();Hn||void 0!==sr||qe.requestResolvedSubtree(),Jt.show(["operations",Tn,Wn],!Hn)}),(0,X.default)((0,Ri.default)(qe),"onCancelClick",function(){qe.setState({tryItOutEnabled:!qe.state.tryItOutEnabled})}),(0,X.default)((0,Ri.default)(qe),"onTryoutClick",function(){qe.setState({tryItOutEnabled:!qe.state.tryItOutEnabled})}),(0,X.default)((0,Ri.default)(qe),"onExecute",function(){qe.setState({executeInProgress:!0})}),(0,X.default)((0,Ri.default)(qe),"getResolvedSubtree",function(){var At=qe.props,Tn=At.path,Wn=At.method,Hn=At.specPath;return At.specSelectors.specResolvedSubtree(Hn?Hn.toJS():["paths",Tn,Wn])}),(0,X.default)((0,Ri.default)(qe),"requestResolvedSubtree",function(){var At=qe.props,Tn=At.path,Wn=At.method,Hn=At.specPath;return At.specActions.requestResolvedSubtree(Hn?Hn.toJS():["paths",Tn,Wn])});var Ot=ze.getConfigs().tryItOutEnabled;return qe.state={tryItOutEnabled:!0===Ot||"true"===Ot,executeInProgress:!1},qe}return(0,oe.default)(ut,[{key:"mapStateToProps",value:function(ze,Ze){var qe,Ot=Ze.op,At=Ze.layoutSelectors,Jt=(0,Ze.getConfigs)(),Tn=Jt.docExpansion,Wn=Jt.deepLinking,Hn=Jt.displayOperationId,sr=Jt.displayRequestDuration,hi=Jt.supportedSubmitMethods,li=At.showSummary(),wi=Ot.getIn(["operation","__originalOperationId"])||Ot.getIn(["operation","operationId"])||(0,Ct.opId)(Ot.get("operation"),Ze.path,Ze.method)||Ot.get("id"),Pi=["operations",Ze.tag,wi],co=Wn&&"false"!==Wn,Xi=(0,Ye.default)(hi).call(hi,Ze.method)>=0&&(void 0===Ze.allowTryItOut?Ze.specSelectors.allowTryItOutFor(Ze.path,Ze.method):Ze.allowTryItOut),eo=Ot.getIn(["operation","security"])||Ze.specSelectors.security();return{operationId:wi,isDeepLinkingEnabled:co,showSummary:li,displayOperationId:Hn,displayRequestDuration:sr,allowTryItOut:Xi,security:eo,isAuthorized:Ze.authSelectors.isAuthorized(eo),isShown:At.isShown(Pi,"full"===Tn),jumpToKey:(0,o.default)(qe="paths.".concat(Ze.path,".")).call(qe,Ze.method),response:Ze.specSelectors.responseFor(Ze.path,Ze.method),request:Ze.specSelectors.requestFor(Ze.path,Ze.method)}}},{key:"componentDidMount",value:function(){var ze=this.props.isShown,Ze=this.getResolvedSubtree();ze&&void 0===Ze&&this.requestResolvedSubtree()}},{key:"UNSAFE_componentWillReceiveProps",value:function(ze){var Ze=ze.response,qe=ze.isShown,Ot=this.getResolvedSubtree();Ze!==this.props.response&&this.setState({executeInProgress:!1}),qe&&void 0===Ot&&this.requestResolvedSubtree()}},{key:"render",value:function(){var ze=this.props,Ze=ze.op,qe=ze.tag,Ot=ze.path,At=ze.method,Jt=ze.security,Tn=ze.isAuthorized,Wn=ze.operationId,Hn=ze.showSummary,sr=ze.isShown,hi=ze.jumpToKey,li=ze.allowTryItOut,wi=ze.response,Pi=ze.request,co=ze.displayOperationId,Xi=ze.displayRequestDuration,eo=ze.isDeepLinkingEnabled,Ms=ze.specPath,Fs=ze.specSelectors,ta=ze.specActions,xs=ze.getComponent,Rs=ze.getConfigs,ks=ze.layoutSelectors,Os=ze.layoutActions,Ba=ze.authActions,Ws=ze.authSelectors,ba=ze.oas3Actions,rs=ze.oas3Selectors,na=ze.fn,gl=xs("operation"),td=this.getResolvedSubtree()||(0,ft.Map)(),cf=(0,ft.fromJS)({op:td,tag:qe,path:Ot,summary:Ze.getIn(["operation","summary"])||"",deprecated:td.get("deprecated")||Ze.getIn(["operation","deprecated"])||!1,method:At,security:Jt,isAuthorized:Tn,operationId:Wn,originalOperationId:td.getIn(["operation","__originalOperationId"]),showSummary:Hn,isShown:sr,jumpToKey:hi,allowTryItOut:li,request:Pi,displayOperationId:co,displayRequestDuration:Xi,isDeepLinkingEnabled:eo,executeInProgress:this.state.executeInProgress,tryItOutEnabled:this.state.tryItOutEnabled});return Y.default.createElement(gl,{operation:cf,response:wi,request:Pi,isShown:sr,toggleShown:this.toggleShown,onTryoutClick:this.onTryoutClick,onCancelClick:this.onCancelClick,onExecute:this.onExecute,specPath:Ms,specActions:ta,specSelectors:Fs,oas3Actions:ba,oas3Selectors:rs,layoutActions:Os,layoutSelectors:ks,authActions:Ba,authSelectors:Ws,getComponent:xs,getConfigs:Rs,fn:na})}}]),ut}(Y.PureComponent);(0,X.default)(bt,"defaultProps",{showSummary:!0,response:null,allowTryItOut:!0,displayOperationId:!1,displayRequestDuration:!1});var Vn=function(bn){(0,uo.default)(ut,bn);var qt=(0,bo.default)(ut);function ut(){return(0,re.default)(this,ut),qt.apply(this,arguments)}return(0,oe.default)(ut,[{key:"getLayout",value:function(){var ze=this.props,Ze=ze.getComponent,qe=ze.layoutSelectors.current();return Ze(qe,!0)||function(){return Y.default.createElement("h1",null,' No layout defined for "',qe,'" ')}}},{key:"render",value:function(){var ze=this.getLayout();return Y.default.createElement(ze,null)}}]),ut}(Y.default.Component);Vn.defaultProps={};var Mr=function(bn){(0,uo.default)(ut,bn);var qt=(0,bo.default)(ut);function ut(){var ze,Ze;(0,re.default)(this,ut);for(var qe=arguments.length,Ot=new Array(qe),At=0;At<qe;At++)Ot[At]=arguments[At];return Ze=qt.call.apply(qt,(0,o.default)(ze=[this]).call(ze,Ot)),(0,X.default)((0,Ri.default)(Ze),"close",function(){Ze.props.authActions.showDefinitions(!1)}),Ze}return(0,oe.default)(ut,[{key:"render",value:function(){var ze,Ze=this.props,qe=Ze.authSelectors,Ot=Ze.authActions,At=Ze.getComponent,Jt=Ze.errSelectors,Tn=Ze.specSelectors,Wn=Ze.fn.AST,Hn=void 0===Wn?{}:Wn,sr=qe.shownDefinitions(),hi=At("auths");return Y.default.createElement("div",{className:"dialog-ux"},Y.default.createElement("div",{className:"backdrop-ux"}),Y.default.createElement("div",{className:"modal-ux"},Y.default.createElement("div",{className:"modal-dialog-ux"},Y.default.createElement("div",{className:"modal-ux-inner"},Y.default.createElement("div",{className:"modal-ux-header"},Y.default.createElement("h3",null,"Available authorizations"),Y.default.createElement("button",{type:"button",className:"close-modal",onClick:this.close},Y.default.createElement("svg",{width:"20",height:"20"},Y.default.createElement("use",{href:"#close",xlinkHref:"#close"})))),Y.default.createElement("div",{className:"modal-ux-content"},(0,Ae.default)(ze=sr.valueSeq()).call(ze,function(li,wi){return Y.default.createElement(hi,{key:wi,AST:Hn,definitions:li,getComponent:At,errSelectors:Jt,authSelectors:qe,authActions:Ot,specSelectors:Tn})}))))))}}]),ut}(Y.default.Component),kr=function(bn){(0,uo.default)(ut,bn);var qt=(0,bo.default)(ut);function ut(){return(0,re.default)(this,ut),qt.apply(this,arguments)}return(0,oe.default)(ut,[{key:"render",value:function(){var ze=this.props,Ze=ze.isAuthorized,qe=ze.showPopup,Ot=ze.onClick,At=(0,ze.getComponent)("authorizationPopup",!0);return Y.default.createElement("div",{className:"auth-wrapper"},Y.default.createElement("button",{className:Ze?"btn authorize locked":"btn authorize unlocked",onClick:Ot},Y.default.createElement("span",null,"Authorize"),Y.default.createElement("svg",{width:"20",height:"20"},Y.default.createElement("use",{href:Ze?"#locked":"#unlocked",xlinkHref:Ze?"#locked":"#unlocked"}))),qe&&Y.default.createElement(At,null))}}]),ut}(Y.default.Component),Ni=function(bn){(0,uo.default)(ut,bn);var qt=(0,bo.default)(ut);function ut(){return(0,re.default)(this,ut),qt.apply(this,arguments)}return(0,oe.default)(ut,[{key:"render",value:function(){var ze=this.props,Ze=ze.authActions,qe=ze.authSelectors,At=ze.getComponent,Jt=ze.specSelectors.securityDefinitions(),Tn=qe.definitionsToAuthorize(),Wn=At("authorizeBtn");return Jt?Y.default.createElement(Wn,{onClick:function(){return Ze.showDefinitions(Tn)},isAuthorized:!!qe.authorized().size,showPopup:!!qe.shownDefinitions(),getComponent:At}):null}}]),ut}(Y.default.Component),Zs=function(bn){(0,uo.default)(ut,bn);var qt=(0,bo.default)(ut);function ut(){var ze,Ze;(0,re.default)(this,ut);for(var qe=arguments.length,Ot=new Array(qe),At=0;At<qe;At++)Ot[At]=arguments[At];return Ze=qt.call.apply(qt,(0,o.default)(ze=[this]).call(ze,Ot)),(0,X.default)((0,Ri.default)(Ze),"onClick",function(Jt){Jt.stopPropagation();var Tn=Ze.props.onClick;Tn&&Tn()}),Ze}return(0,oe.default)(ut,[{key:"render",value:function(){var ze=this.props.isAuthorized;return Y.default.createElement("button",{className:ze?"authorization__btn locked":"authorization__btn unlocked","aria-label":ze?"authorization button locked":"authorization button unlocked",onClick:this.onClick},Y.default.createElement("svg",{width:"20",height:"20"},Y.default.createElement("use",{href:ze?"#locked":"#unlocked",xlinkHref:ze?"#locked":"#unlocked"})))}}]),ut}(Y.default.Component),Vo=function(bn){(0,uo.default)(ut,bn);var qt=(0,bo.default)(ut);function ut(ze,Ze){var qe;return(0,re.default)(this,ut),qe=qt.call(this,ze,Ze),(0,X.default)((0,Ri.default)(qe),"onAuthChange",function(Ot){qe.setState((0,X.default)({},Ot.name,Ot))}),(0,X.default)((0,Ri.default)(qe),"submitAuth",function(Ot){Ot.preventDefault(),qe.props.authActions.authorizeWithPersistOption(qe.state)}),(0,X.default)((0,Ri.default)(qe),"logoutClick",function(Ot){Ot.preventDefault();var At=qe.props,Jt=At.authActions,Tn=At.definitions,Wn=(0,Ae.default)(Tn).call(Tn,function(Hn,sr){return sr}).toArray();qe.setState((0,Ie.default)(Wn).call(Wn,function(Hn,sr){return Hn[sr]="",Hn},{})),Jt.logoutWithPersistOption(Wn)}),(0,X.default)((0,Ri.default)(qe),"close",function(Ot){Ot.preventDefault(),qe.props.authActions.showDefinitions(!1)}),qe.state={},qe}return(0,oe.default)(ut,[{key:"render",value:function(){var ze,Ze=this,qe=this.props,Ot=qe.definitions,At=qe.getComponent,Jt=qe.authSelectors,Tn=qe.errSelectors,Wn=At("AuthItem"),Hn=At("oauth2",!0),sr=At("Button"),hi=Jt.authorized(),li=(0,_.default)(Ot).call(Ot,function(co,Xi){return!!hi.get(Xi)}),wi=(0,_.default)(Ot).call(Ot,function(co){return"oauth2"!==co.get("type")}),Pi=(0,_.default)(Ot).call(Ot,function(co){return"oauth2"===co.get("type")});return Y.default.createElement("div",{className:"auth-container"},!!wi.size&&Y.default.createElement("form",{onSubmit:this.submitAuth},(0,Ae.default)(wi).call(wi,function(co,Xi){return Y.default.createElement(Wn,{key:Xi,schema:co,name:Xi,getComponent:At,onAuthChange:Ze.onAuthChange,authorized:hi,errSelectors:Tn})}).toArray(),Y.default.createElement("div",{className:"auth-btn-wrapper"},wi.size===li.size?Y.default.createElement(sr,{className:"btn modal-btn auth",onClick:this.logoutClick},"Logout"):Y.default.createElement(sr,{type:"submit",className:"btn modal-btn auth authorize"},"Authorize"),Y.default.createElement(sr,{className:"btn modal-btn auth btn-done",onClick:this.close},"Close"))),Pi&&Pi.size?Y.default.createElement("div",null,Y.default.createElement("div",{className:"scope-def"},Y.default.createElement("p",null,"Scopes are used to grant an application different levels of access to data on behalf of the end user. Each API may declare one or more scopes."),Y.default.createElement("p",null,"API requires the following scopes. Select which ones you want to grant to Swagger UI.")),(0,Ae.default)(ze=(0,_.default)(Ot).call(Ot,function(co){return"oauth2"===co.get("type")})).call(ze,function(co,Xi){return Y.default.createElement("div",{key:Xi},Y.default.createElement(Hn,{authorized:hi,schema:co,name:Xi}))}).toArray()):null)}}]),ut}(Y.default.Component),il=function(bn){(0,uo.default)(ut,bn);var qt=(0,bo.default)(ut);function ut(){return(0,re.default)(this,ut),qt.apply(this,arguments)}return(0,oe.default)(ut,[{key:"render",value:function(){var ze,Ze=this.props,qe=Ze.schema,Ot=Ze.name,At=Ze.getComponent,Jt=Ze.onAuthChange,Tn=Ze.authorized,Wn=Ze.errSelectors,Hn=At("apiKeyAuth"),sr=At("basicAuth"),hi=qe.get("type");switch(hi){case"apiKey":ze=Y.default.createElement(Hn,{key:Ot,schema:qe,name:Ot,errSelectors:Wn,authorized:Tn,getComponent:At,onChange:Jt});break;case"basic":ze=Y.default.createElement(sr,{key:Ot,schema:qe,name:Ot,errSelectors:Wn,authorized:Tn,getComponent:At,onChange:Jt});break;default:ze=Y.default.createElement("div",{key:Ot},"Unknown security definition type ",hi)}return Y.default.createElement("div",{key:"".concat(Ot,"-jump")},ze)}}]),ut}(Y.default.Component),_l=function(bn){(0,uo.default)(ut,bn);var qt=(0,bo.default)(ut);function ut(){return(0,re.default)(this,ut),qt.apply(this,arguments)}return(0,oe.default)(ut,[{key:"render",value:function(){var ze=this.props.error,Ze=ze.get("level"),qe=ze.get("message"),Ot=ze.get("source");return Y.default.createElement("div",{className:"errors"},Y.default.createElement("b",null,Ot," ",Ze),Y.default.createElement("span",null,qe))}}]),ut}(Y.default.Component),zl=function(bn){(0,uo.default)(ut,bn);var qt=(0,bo.default)(ut);function ut(ze,Ze){var qe;(0,re.default)(this,ut),qe=qt.call(this,ze,Ze),(0,X.default)((0,Ri.default)(qe),"onChange",function(Wn){var Hn=qe.props.onChange,hi=(0,ve.default)({},qe.state,{value:Wn.target.value});qe.setState(hi),Hn(hi)});var Ot=qe.props,At=Ot.name,Jt=Ot.schema,Tn=qe.getValue();return qe.state={name:At,schema:Jt,value:Tn},qe}return(0,oe.default)(ut,[{key:"getValue",value:function(){var ze=this.props,qe=ze.authorized;return qe&&qe.getIn([ze.name,"value"])}},{key:"render",value:function(){var ze,Ze,qe=this.props,Ot=qe.schema,At=qe.getComponent,Jt=qe.errSelectors,Tn=qe.name,Wn=At("Input"),Hn=At("Row"),sr=At("Col"),hi=At("authError"),li=At("Markdown",!0),wi=At("JumpToPath",!0),Pi=this.getValue(),co=(0,_.default)(ze=Jt.allErrors()).call(ze,function(Xi){return Xi.get("authId")===Tn});return Y.default.createElement("div",null,Y.default.createElement("h4",null,Y.default.createElement("code",null,Tn||Ot.get("name")),"\xa0(apiKey)",Y.default.createElement(wi,{path:["securityDefinitions",Tn]})),Pi&&Y.default.createElement("h6",null,"Authorized"),Y.default.createElement(Hn,null,Y.default.createElement(li,{source:Ot.get("description")})),Y.default.createElement(Hn,null,Y.default.createElement("p",null,"Name: ",Y.default.createElement("code",null,Ot.get("name")))),Y.default.createElement(Hn,null,Y.default.createElement("p",null,"In: ",Y.default.createElement("code",null,Ot.get("in")))),Y.default.createElement(Hn,null,Y.default.createElement("label",null,"Value:"),Pi?Y.default.createElement("code",null," ****** "):Y.default.createElement(sr,null,Y.default.createElement(Wn,{type:"text",onChange:this.onChange,autoFocus:!0}))),(0,Ae.default)(Ze=co.valueSeq()).call(Ze,function(Xi,eo){return Y.default.createElement(hi,{error:Xi,key:eo})}))}}]),ut}(Y.default.Component),Wu=function(bn){(0,uo.default)(ut,bn);var qt=(0,bo.default)(ut);function ut(ze,Ze){var qe;(0,re.default)(this,ut),qe=qt.call(this,ze,Ze),(0,X.default)((0,Ri.default)(qe),"onChange",function(Wn){var Hn=qe.props.onChange,sr=Wn.target,wi=qe.state.value;wi[sr.name]=sr.value,qe.setState({value:wi}),Hn(qe.state)});var Ot=qe.props,At=Ot.schema,Jt=Ot.name,Tn=qe.getValue().username;return qe.state={name:Jt,schema:At,value:Tn?{username:Tn}:{}},qe}return(0,oe.default)(ut,[{key:"getValue",value:function(){var ze=this.props,Ze=ze.authorized;return Ze&&Ze.getIn([ze.name,"value"])||{}}},{key:"render",value:function(){var ze,Ze,qe=this.props,Ot=qe.schema,At=qe.getComponent,Jt=qe.name,Tn=qe.errSelectors,Wn=At("Input"),Hn=At("Row"),sr=At("Col"),hi=At("authError"),li=At("JumpToPath",!0),wi=At("Markdown",!0),Pi=this.getValue().username,co=(0,_.default)(ze=Tn.allErrors()).call(ze,function(Xi){return Xi.get("authId")===Jt});return Y.default.createElement("div",null,Y.default.createElement("h4",null,"Basic authorization",Y.default.createElement(li,{path:["securityDefinitions",Jt]})),Pi&&Y.default.createElement("h6",null,"Authorized"),Y.default.createElement(Hn,null,Y.default.createElement(wi,{source:Ot.get("description")})),Y.default.createElement(Hn,null,Y.default.createElement("label",null,"Username:"),Pi?Y.default.createElement("code",null," ",Pi," "):Y.default.createElement(sr,null,Y.default.createElement(Wn,{type:"text",required:"required",name:"username",onChange:this.onChange,autoFocus:!0}))),Y.default.createElement(Hn,null,Y.default.createElement("label",null,"Password:"),Pi?Y.default.createElement("code",null," ****** "):Y.default.createElement(sr,null,Y.default.createElement(Wn,{autoComplete:"new-password",name:"password",type:"password",onChange:this.onChange}))),(0,Ae.default)(Ze=co.valueSeq()).call(Ze,function(Xi,eo){return Y.default.createElement(hi,{error:Xi,key:eo})}))}}]),ut}(Y.default.Component);function Yf(bn){var qt=bn.example,ut=bn.showValue,ze=bn.getComponent,Ze=bn.getConfigs,qe=ze("Markdown",!0),Ot=ze("highlightCode");return qt?Y.default.createElement("div",{className:"example"},qt.get("description")?Y.default.createElement("section",{className:"example__section"},Y.default.createElement("div",{className:"example__section-header"},"Example Description"),Y.default.createElement("p",null,Y.default.createElement(qe,{source:qt.get("description")}))):null,ut&&qt.has("value")?Y.default.createElement("section",{className:"example__section"},Y.default.createElement("div",{className:"example__section-header"},"Example Value"),Y.default.createElement(Ot,{getConfigs:Ze,value:(0,On.Pz)(qt.get("value"))})):null):null}var xl=xo(6914),Zc=function(bn){(0,uo.default)(ut,bn);var qt=(0,bo.default)(ut);function ut(){var ze,Ze;(0,re.default)(this,ut);for(var qe=arguments.length,Ot=new Array(qe),At=0;At<qe;At++)Ot[At]=arguments[At];return Ze=qt.call.apply(qt,(0,o.default)(ze=[this]).call(ze,Ot)),(0,X.default)((0,Ri.default)(Ze),"_onSelect",function(Jt){var Tn=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},Wn=Tn.isSyntheticChange,Hn=void 0!==Wn&&Wn;"function"==typeof Ze.props.onSelect&&Ze.props.onSelect(Jt,{isSyntheticChange:Hn})}),(0,X.default)((0,Ri.default)(Ze),"_onDomSelect",function(Jt){if("function"==typeof Ze.props.onSelect){var Tn=Jt.target.selectedOptions[0].getAttribute("value");Ze._onSelect(Tn,{isSyntheticChange:!1})}}),(0,X.default)((0,Ri.default)(Ze),"getCurrentExample",function(){var Jt=Ze.props,Tn=Jt.examples,Hn=Tn.get(Jt.currentExampleKey),sr=Tn.keySeq().first(),hi=Tn.get(sr);return Hn||hi||(0,xl.default)({})}),Ze}return(0,oe.default)(ut,[{key:"componentDidMount",value:function(){var ze=this.props,qe=ze.examples;if("function"==typeof ze.onSelect){var Ot=qe.first(),At=qe.keyOf(Ot);this._onSelect(At,{isSyntheticChange:!0})}}},{key:"UNSAFE_componentWillReceiveProps",value:function(ze){var qe=ze.examples;if(qe!==this.props.examples&&!qe.has(ze.currentExampleKey)){var Ot=qe.first(),At=qe.keyOf(Ot);this._onSelect(At,{isSyntheticChange:!0})}}},{key:"render",value:function(){var ze=this.props,Ze=ze.examples,qe=ze.currentExampleKey,Ot=ze.isValueModified,At=ze.isModifiedValueAvailable;return Y.default.createElement("div",{className:"examples-select"},ze.showLabels?Y.default.createElement("span",{className:"examples-select__section-label"},"Examples: "):null,Y.default.createElement("select",{className:"examples-select-element",onChange:this._onDomSelect,value:At&&Ot?"__MODIFIED__VALUE__":qe||""},At?Y.default.createElement("option",{value:"__MODIFIED__VALUE__"},"[Modified value]"):null,(0,Ae.default)(Ze).call(Ze,function(Tn,Wn){return Y.default.createElement("option",{key:Wn,value:Wn},Tn.get("summary")||Wn)}).valueSeq()))}}]),ut}(Y.default.PureComponent);(0,X.default)(Zc,"defaultProps",{examples:ft.default.Map({}),onSelect:function(){for(var bn,qt,ut=arguments.length,ze=new Array(ut),Ze=0;Ze<ut;Ze++)ze[Ze]=arguments[Ze];return(bn=console).log.apply(bn,(0,o.default)(qt=["DEBUG: ExamplesSelect was not given an onSelect callback"]).call(qt,ze))},currentExampleKey:null,showLabels:!0});var gp=function(bn){return ft.List.isList(bn)?bn:(0,On.Pz)(bn)},Bh=function(bn){(0,uo.default)(ut,bn);var qt=(0,bo.default)(ut);function ut(ze){var Ze;(0,re.default)(this,ut),Ze=qt.call(this,ze),(0,X.default)((0,Ri.default)(Ze),"_getStateForCurrentNamespace",function(){return(Ze.state[Ze.props.currentNamespace]||(0,ft.Map)()).toObject()}),(0,X.default)((0,Ri.default)(Ze),"_setStateForCurrentNamespace",function(Ot){return Ze._setStateForNamespace(Ze.props.currentNamespace,Ot)}),(0,X.default)((0,Ri.default)(Ze),"_setStateForNamespace",function(Ot,At){var Jt=(Ze.state[Ot]||(0,ft.Map)()).mergeDeep(At);return Ze.setState((0,X.default)({},Ot,Jt))}),(0,X.default)((0,Ri.default)(Ze),"_isCurrentUserInputSameAsExampleValue",function(){var Ot=Ze.props.currentUserInputValue;return Ze._getCurrentExampleValue()===Ot}),(0,X.default)((0,Ri.default)(Ze),"_getValueForExample",function(Ot,At){return gp(((At||Ze.props).examples||(0,ft.Map)({})).getIn([Ot,"value"]))}),(0,X.default)((0,Ri.default)(Ze),"_getCurrentExampleValue",function(Ot){return Ze._getValueForExample((Ot||Ze.props).currentKey,Ot||Ze.props)}),(0,X.default)((0,Ri.default)(Ze),"_onExamplesSelect",function(Ot){var At=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},Jt=At.isSyntheticChange,Tn=Ze.props,Wn=Tn.onSelect,Hn=Tn.updateValue,sr=Tn.currentUserInputValue,hi=Tn.userHasEditedBody,li=Ze._getStateForCurrentNamespace(),wi=li.lastUserEditedValue,Pi=Ze._getValueForExample(Ot);if("__MODIFIED__VALUE__"===Ot)return Hn(gp(wi)),Ze._setStateForCurrentNamespace({isModifiedValueSelected:!0});if("function"==typeof Wn){for(var co,Xi=arguments.length,eo=new Array(Xi>2?Xi-2:0),Ms=2;Ms<Xi;Ms++)eo[Ms-2]=arguments[Ms];Wn.apply(void 0,(0,o.default)(co=[Ot,{isSyntheticChange:Jt}]).call(co,eo))}Ze._setStateForCurrentNamespace({lastDownstreamValue:Pi,isModifiedValueSelected:Jt&&hi||!!sr&&sr!==Pi}),Jt||"function"==typeof Hn&&Hn(gp(Pi))});var qe=Ze._getCurrentExampleValue();return Ze.state=(0,X.default)({},ze.currentNamespace,(0,ft.Map)({lastUserEditedValue:Ze.props.currentUserInputValue,lastDownstreamValue:qe,isModifiedValueSelected:Ze.props.userHasEditedBody||Ze.props.currentUserInputValue!==qe})),Ze}return(0,oe.default)(ut,[{key:"componentWillUnmount",value:function(){this.props.setRetainRequestBodyValueFlag(!1)}},{key:"UNSAFE_componentWillReceiveProps",value:function(ze){var Ze=ze.currentUserInputValue,qe=ze.examples,Ot=ze.onSelect,At=ze.userHasEditedBody,Jt=this._getStateForCurrentNamespace(),Tn=Jt.lastUserEditedValue,Wn=Jt.lastDownstreamValue,Hn=this._getValueForExample(ze.currentKey,ze),sr=(0,_.default)(qe).call(qe,function(hi){return hi.get("value")===Ze||(0,On.Pz)(hi.get("value"))===Ze});sr.size?Ot(sr.has(ze.currentKey)?ze.currentKey:sr.keySeq().first(),{isSyntheticChange:!0}):Ze!==this.props.currentUserInputValue&&Ze!==Tn&&Ze!==Wn&&(this.props.setRetainRequestBodyValueFlag(!0),this._setStateForNamespace(ze.currentNamespace,{lastUserEditedValue:ze.currentUserInputValue,isModifiedValueSelected:At||Ze!==Hn}))}},{key:"render",value:function(){var ze=this.props,Ze=ze.currentUserInputValue,qe=ze.examples,Ot=ze.currentKey,At=ze.getComponent,Jt=ze.userHasEditedBody,Tn=this._getStateForCurrentNamespace(),Wn=Tn.lastDownstreamValue,Hn=Tn.lastUserEditedValue,sr=Tn.isModifiedValueSelected,hi=At("ExamplesSelect");return Y.default.createElement(hi,{examples:qe,currentExampleKey:Ot,onSelect:this._onExamplesSelect,isModifiedValueAvailable:!!Hn&&Hn!==Wn,isValueModified:void 0!==Ze&&sr&&Ze!==this._getCurrentExampleValue()||Jt})}}]),ut}(Y.default.PureComponent);(0,X.default)(Bh,"defaultProps",{userHasEditedBody:!1,examples:(0,ft.Map)({}),currentNamespace:"__DEFAULT__NAMESPACE__",setRetainRequestBodyValueFlag:function(){},onSelect:function(){for(var bn,qt,ut=arguments.length,ze=new Array(ut),Ze=0;Ze<ut;Ze++)ze[Ze]=arguments[Ze];return(bn=console).log.apply(bn,(0,o.default)(qt=["ExamplesSelectValueRetainer: no `onSelect` function was provided"]).call(qt,ze))},updateValue:function(){for(var bn,qt,ut=arguments.length,ze=new Array(ut),Ze=0;Ze<ut;Ze++)ze[Ze]=arguments[Ze];return(bn=console).log.apply(bn,(0,o.default)(qt=["ExamplesSelectValueRetainer: no `updateValue` function was provided"]).call(qt,ze))}});var sh=xo(8898),Uh=xo(5487),Vl=xo(2372),Bc=xo(8900),Lp=function(bn){(0,uo.default)(ut,bn);var qt=(0,bo.default)(ut);function ut(ze,Ze){var qe;(0,re.default)(this,ut),qe=qt.call(this,ze,Ze),(0,X.default)((0,Ri.default)(qe),"close",function(Xi){Xi.preventDefault(),qe.props.authActions.showDefinitions(!1)}),(0,X.default)((0,Ri.default)(qe),"authorize",function(){var Xi=qe.props,eo=Xi.authActions,Ms=Xi.errActions,ta=Xi.authSelectors,xs=Xi.oas3Selectors,Rs=(0,Xi.getConfigs)(),ks=ta.getConfigs();Ms.clear({authId:name,type:"auth",source:"auth"}),function(Os){var Ba=Os.auth,Ws=Os.authActions,ba=Os.errActions,rs=Os.configs,na=Os.authConfigs,gl=void 0===na?{}:na,td=Os.currentServer,cf=Ba.schema,df=Ba.scopes,Gf=Ba.name,Zl=Ba.clientId,nd=cf.get("flow"),sc=[];switch(nd){case"password":return void Ws.authorizePassword(Ba);case"application":case"clientCredentials":case"client_credentials":return void Ws.authorizeApplication(Ba);case"accessCode":case"authorizationCode":case"authorization_code":sc.push("response_type=code");break;case"implicit":sc.push("response_type=token")}"string"==typeof Zl&&sc.push("client_id="+encodeURIComponent(Zl));var mp=rs.oauth2RedirectUrl;if(void 0!==mp){sc.push("redirect_uri="+encodeURIComponent(mp));var lp=[];(0,De.default)(df)?lp=df:ft.default.List.isList(df)&&(lp=df.toArray()),lp.length>0&&sc.push("scope="+encodeURIComponent(lp.join(gl.scopeSeparator||" ")));var Yd=(0,On.r3)(new Date);if(sc.push("state="+encodeURIComponent(Yd)),void 0!==gl.realm&&sc.push("realm="+encodeURIComponent(gl.realm)),("authorizationCode"===nd||"authorization_code"===nd||"accessCode"===nd)&&gl.usePkceWithAuthorizationCodeGrant){var ac=(0,On.Uj)(),jd=(0,On.Xb)(ac);sc.push("code_challenge="+jd),sc.push("code_challenge_method=S256"),Ba.codeVerifier=ac}var ff=gl.additionalQueryStringParams;for(var pf in ff){var Yh;void 0!==ff[pf]&&sc.push((0,Ae.default)(Yh=[pf,ff[pf]]).call(Yh,encodeURIComponent).join("="))}var Ld=cf.get("authorizationUrl"),Mf=[td?(0,Bc.default)((0,On.Nm)(Ld),td,!0).toString():(0,On.Nm)(Ld),sc.join("&")].join(-1===(0,Ye.default)(Ld).call(Ld,"?")?"?":"&");Ws.authPopup(Mf,{auth:Ba,state:Yd,redirectUrl:mp,callback:"implicit"===nd?Ws.preAuthorizeImplicit:gl.useBasicAuthenticationWithAccessCodeGrant?Ws.authorizeAccessCodeWithBasicAuthentication:Ws.authorizeAccessCodeWithFormParams,errCb:ba.newAuthErr})}else ba.newAuthErr({authId:Gf,source:"validation",level:"error",message:"oauth2RedirectUrl configuration is not passed. Oauth2 authorization cannot be performed."})}({auth:qe.state,currentServer:xs.serverEffectiveValue(xs.selectedServer()),authActions:eo,errActions:Ms,configs:Rs,authConfigs:ks})}),(0,X.default)((0,Ri.default)(qe),"onScopeChange",function(Xi){var eo,Ms,Fs=Xi.target,ta=Fs.checked,xs=Fs.dataset.value;if(ta&&-1===(0,Ye.default)(eo=qe.state.scopes).call(eo,xs)){var Rs,ks=(0,o.default)(Rs=qe.state.scopes).call(Rs,[xs]);qe.setState({scopes:ks})}else if(!ta&&(0,Ye.default)(Ms=qe.state.scopes).call(Ms,xs)>-1){var Os;qe.setState({scopes:(0,_.default)(Os=qe.state.scopes).call(Os,function(Ba){return Ba!==xs})})}}),(0,X.default)((0,Ri.default)(qe),"onInputChange",function(Xi){var eo=Xi.target,ta=(0,X.default)({},eo.dataset.name,eo.value);qe.setState(ta)}),(0,X.default)((0,Ri.default)(qe),"selectScopes",function(Xi){var eo;qe.setState(Xi.target.dataset.all?{scopes:(0,sh.default)((0,Uh.default)(eo=qe.props.schema.get("allowedScopes")||qe.props.schema.get("scopes")).call(eo))}:{scopes:[]})}),(0,X.default)((0,Ri.default)(qe),"logout",function(Xi){Xi.preventDefault();var eo=qe.props,Ms=eo.authActions,ta=eo.name;eo.errActions.clear({authId:ta,type:"auth",source:"auth"}),Ms.logoutWithPersistOption([ta])});var Ot=qe.props,At=Ot.name,Jt=Ot.schema,Tn=Ot.authorized,Wn=Ot.authSelectors,Hn=Tn&&Tn.get(At),sr=Wn.getConfigs()||{},hi=Hn&&Hn.get("username")||"",li=Hn&&Hn.get("clientId")||sr.clientId||"",wi=Hn&&Hn.get("clientSecret")||sr.clientSecret||"",Pi=Hn&&Hn.get("passwordType")||"basic",co=Hn&&Hn.get("scopes")||sr.scopes||[];return"string"==typeof co&&(co=co.split(sr.scopeSeparator||" ")),qe.state={appName:sr.appName,name:At,schema:Jt,scopes:co,clientId:li,clientSecret:wi,username:hi,password:"",passwordType:Pi},qe}return(0,oe.default)(ut,[{key:"render",value:function(){var ze,Ze,qe=this,Ot=this.props,At=Ot.schema,Jt=Ot.getComponent,Tn=Ot.authSelectors,Wn=Ot.errSelectors,Hn=Ot.name,sr=Ot.specSelectors,hi=Jt("Input"),li=Jt("Row"),wi=Jt("Col"),Pi=Jt("Button"),co=Jt("authError"),Xi=Jt("JumpToPath",!0),eo=Jt("Markdown",!0),Ms=Jt("InitializedInput"),Fs=sr.isOAS3,ta=Fs()?At.get("openIdConnectUrl"):null,xs="implicit",Rs="password",ks=Fs()?ta?"authorization_code":"authorizationCode":"accessCode",Os=Fs()?ta?"client_credentials":"clientCredentials":"application",Ba=!!(Tn.getConfigs()||{}).usePkceWithAuthorizationCodeGrant,Ws=At.get("flow"),ba=Ws===ks&&Ba?Ws+" with PKCE":Ws,rs=At.get("allowedScopes")||At.get("scopes"),na=!!Tn.authorized().get(Hn),gl=(0,_.default)(ze=Wn.allErrors()).call(ze,function(df){return df.get("authId")===Hn}),td=!(0,_.default)(gl).call(gl,function(df){return"validation"===df.get("source")}).size,cf=At.get("description");return Y.default.createElement("div",null,Y.default.createElement("h4",null,Hn," (OAuth2, ",ba,") ",Y.default.createElement(Xi,{path:["securityDefinitions",Hn]})),this.state.appName?Y.default.createElement("h5",null,"Application: ",this.state.appName," "):null,cf&&Y.default.createElement(eo,{source:At.get("description")}),na&&Y.default.createElement("h6",null,"Authorized"),ta&&Y.default.createElement("p",null,"OpenID Connect URL: ",Y.default.createElement("code",null,ta)),(Ws===xs||Ws===ks)&&Y.default.createElement("p",null,"Authorization URL: ",Y.default.createElement("code",null,At.get("authorizationUrl"))),(Ws===Rs||Ws===ks||Ws===Os)&&Y.default.createElement("p",null,"Token URL:",Y.default.createElement("code",null," ",At.get("tokenUrl"))),Y.default.createElement("p",{className:"flow"},"Flow: ",Y.default.createElement("code",null,ba)),Ws!==Rs?null:Y.default.createElement(li,null,Y.default.createElement(li,null,Y.default.createElement("label",{htmlFor:"oauth_username"},"username:"),na?Y.default.createElement("code",null," ",this.state.username," "):Y.default.createElement(wi,{tablet:10,desktop:10},Y.default.createElement("input",{id:"oauth_username",type:"text","data-name":"username",onChange:this.onInputChange,autoFocus:!0}))),Y.default.createElement(li,null,Y.default.createElement("label",{htmlFor:"oauth_password"},"password:"),na?Y.default.createElement("code",null," ****** "):Y.default.createElement(wi,{tablet:10,desktop:10},Y.default.createElement("input",{id:"oauth_password",type:"password","data-name":"password",onChange:this.onInputChange}))),Y.default.createElement(li,null,Y.default.createElement("label",{htmlFor:"password_type"},"Client credentials location:"),na?Y.default.createElement("code",null," ",this.state.passwordType," "):Y.default.createElement(wi,{tablet:10,desktop:10},Y.default.createElement("select",{id:"password_type","data-name":"passwordType",onChange:this.onInputChange},Y.default.createElement("option",{value:"basic"},"Authorization header"),Y.default.createElement("option",{value:"request-body"},"Request body"))))),(Ws===Os||Ws===xs||Ws===ks||Ws===Rs)&&(!na||na&&this.state.clientId)&&Y.default.createElement(li,null,Y.default.createElement("label",{htmlFor:"client_id"},"client_id:"),na?Y.default.createElement("code",null," ****** "):Y.default.createElement(wi,{tablet:10,desktop:10},Y.default.createElement(Ms,{id:"client_id",type:"text",required:Ws===Rs,initialValue:this.state.clientId,"data-name":"clientId",onChange:this.onInputChange}))),(Ws===Os||Ws===ks||Ws===Rs)&&!Ba&&Y.default.createElement(li,null,Y.default.createElement("label",{htmlFor:"client_secret"},"client_secret:"),na?Y.default.createElement("code",null," ****** "):Y.default.createElement(wi,{tablet:10,desktop:10},Y.default.createElement(Ms,{id:"client_secret",initialValue:this.state.clientSecret,type:"password","data-name":"clientSecret",onChange:this.onInputChange}))),!na&&rs&&rs.size?Y.default.createElement("div",{className:"scopes"},Y.default.createElement("h2",null,"Scopes:",Y.default.createElement("a",{onClick:this.selectScopes,"data-all":!0},"select all"),Y.default.createElement("a",{onClick:this.selectScopes},"select none")),(0,Ae.default)(rs).call(rs,function(df,Gf){var Zl,nd,sc,mp,lp;return Y.default.createElement(li,{key:Gf},Y.default.createElement("div",{className:"checkbox"},Y.default.createElement(hi,{"data-value":Gf,id:(0,o.default)(Zl=(0,o.default)(nd="".concat(Gf,"-")).call(nd,Ws,"-checkbox-")).call(Zl,qe.state.name),disabled:na,checked:(0,Vl.default)(sc=qe.state.scopes).call(sc,Gf),type:"checkbox",onChange:qe.onScopeChange}),Y.default.createElement("label",{htmlFor:(0,o.default)(mp=(0,o.default)(lp="".concat(Gf,"-")).call(lp,Ws,"-checkbox-")).call(mp,qe.state.name)},Y.default.createElement("span",{className:"item"}),Y.default.createElement("div",{className:"text"},Y.default.createElement("p",{className:"name"},Gf),Y.default.createElement("p",{className:"description"},df)))))}).toArray()):null,(0,Ae.default)(Ze=gl.valueSeq()).call(Ze,function(df,Gf){return Y.default.createElement(co,{error:df,key:Gf})}),Y.default.createElement("div",{className:"auth-btn-wrapper"},td&&(na?Y.default.createElement(Pi,{className:"btn modal-btn auth authorize",onClick:this.logout},"Logout"):Y.default.createElement(Pi,{className:"btn modal-btn auth authorize",onClick:this.authorize},"Authorize")),Y.default.createElement(Pi,{className:"btn modal-btn auth btn-done",onClick:this.close},"Close")))}}]),ut}(Y.default.Component),ji=function(bn){(0,uo.default)(ut,bn);var qt=(0,bo.default)(ut);function ut(){var ze,Ze;(0,re.default)(this,ut);for(var qe=arguments.length,Ot=new Array(qe),At=0;At<qe;At++)Ot[At]=arguments[At];return Ze=qt.call.apply(qt,(0,o.default)(ze=[this]).call(ze,Ot)),(0,X.default)((0,Ri.default)(Ze),"onClick",function(){var Jt=Ze.props,Tn=Jt.specActions,Wn=Jt.path,Hn=Jt.method;Tn.clearResponse(Wn,Hn),Tn.clearRequest(Wn,Hn)}),Ze}return(0,oe.default)(ut,[{key:"render",value:function(){return Y.default.createElement("button",{className:"btn btn-clear opblock-control__btn",onClick:this.onClick},"Clear")}}]),ut}(Y.Component),lr=function(bn){var qt=bn.headers;return Y.default.createElement("div",null,Y.default.createElement("h5",null,"Response headers"),Y.default.createElement("pre",{className:"microlight"},qt))},yi=function(bn){var qt=bn.duration;return Y.default.createElement("div",null,Y.default.createElement("h5",null,"Request duration"),Y.default.createElement("pre",{className:"microlight"},qt," ms"))},qi=function(bn){(0,uo.default)(ut,bn);var qt=(0,bo.default)(ut);function ut(){return(0,re.default)(this,ut),qt.apply(this,arguments)}return(0,oe.default)(ut,[{key:"shouldComponentUpdate",value:function(ze){return this.props.response!==ze.response||this.props.path!==ze.path||this.props.method!==ze.method||this.props.displayRequestDuration!==ze.displayRequestDuration}},{key:"render",value:function(){var ze,Ze=this.props,qe=Ze.response,Ot=Ze.getComponent,At=Ze.getConfigs,Jt=Ze.displayRequestDuration,Tn=Ze.specSelectors,Wn=Ze.path,Hn=Ze.method,sr=At(),li=sr.requestSnippetsEnabled,wi=sr.showMutatedRequest?Tn.mutatedRequestFor(Wn,Hn):Tn.requestFor(Wn,Hn),Pi=qe.get("status"),co=wi.get("url"),Xi=qe.get("headers").toJS(),eo=qe.get("notDocumented"),Ms=qe.get("error"),Fs=qe.get("text"),ta=qe.get("duration"),xs=(0,M.default)(Xi),Rs=Xi["content-type"]||Xi["Content-Type"],ks=Ot("responseBody"),Os=(0,Ae.default)(xs).call(xs,function(na){var gl=(0,De.default)(Xi[na])?Xi[na].join():Xi[na];return Y.default.createElement("span",{className:"headerline",key:na}," ",na,": ",gl," ")}),Ba=0!==Os.length,Ws=Ot("Markdown",!0),ba=Ot("RequestSnippets",!0),rs=Ot("curl");return Y.default.createElement("div",null,wi&&(!0===li||"true"===li?Y.default.createElement(ba,{request:wi}):Y.default.createElement(rs,{request:wi,getConfigs:At})),co&&Y.default.createElement("div",null,Y.default.createElement("div",{className:"request-url"},Y.default.createElement("h4",null,"Request URL"),Y.default.createElement("pre",{className:"microlight"},co))),Y.default.createElement("h4",null,"Server response"),Y.default.createElement("table",{className:"responses-table live-responses-table"},Y.default.createElement("thead",null,Y.default.createElement("tr",{className:"responses-header"},Y.default.createElement("td",{className:"col_header response-col_status"},"Code"),Y.default.createElement("td",{className:"col_header response-col_description"},"Details"))),Y.default.createElement("tbody",null,Y.default.createElement("tr",{className:"response"},Y.default.createElement("td",{className:"response-col_status"},Pi,eo?Y.default.createElement("div",{className:"response-undocumented"},Y.default.createElement("i",null," Undocumented ")):null),Y.default.createElement("td",{className:"response-col_description"},Ms?Y.default.createElement(Ws,{source:(0,o.default)(ze="".concat(""!==qe.get("name")?"".concat(qe.get("name"),": "):"")).call(ze,qe.get("message"))}):null,Fs?Y.default.createElement(ks,{content:Fs,contentType:Rs,url:co,headers:Xi,getConfigs:At,getComponent:Ot}):null,Ba?Y.default.createElement(lr,{headers:Os}):null,Jt&&ta?Y.default.createElement(yi,{duration:ta}):null)))))}}]),ut}(Y.default.Component),Po=xo(5623),qo=["get","put","post","delete","options","head","patch"],os=(0,o.default)(qo).call(qo,["trace"]),fs=function(bn){(0,uo.default)(ut,bn);var qt=(0,bo.default)(ut);function ut(){var ze,Ze;(0,re.default)(this,ut);for(var qe=arguments.length,Ot=new Array(qe),At=0;At<qe;At++)Ot[At]=arguments[At];return Ze=qt.call.apply(qt,(0,o.default)(ze=[this]).call(ze,Ot)),(0,X.default)((0,Ri.default)(Ze),"renderOperationTag",function(Jt,Tn){var Wn=Ze.props,Hn=Wn.specSelectors,sr=Wn.getComponent,hi=Wn.oas3Selectors,li=Wn.layoutSelectors,wi=Wn.layoutActions,Pi=Wn.getConfigs,co=sr("OperationContainer",!0),Xi=sr("OperationTag"),eo=Jt.get("operations");return Y.default.createElement(Xi,{key:"operation-"+Tn,tagObj:Jt,tag:Tn,oas3Selectors:hi,layoutSelectors:li,layoutActions:wi,getConfigs:Pi,getComponent:sr,specUrl:Hn.url()},Y.default.createElement("div",{className:"operation-tag-content"},(0,Ae.default)(eo).call(eo,function(Ms){var Fs,ta=Ms.get("path"),xs=Ms.get("method"),Rs=ft.default.List(["paths",ta,xs]),ks=Hn.isOAS3()?os:qo;return-1===(0,Ye.default)(ks).call(ks,xs)?null:Y.default.createElement(co,{key:(0,o.default)(Fs="".concat(ta,"-")).call(Fs,xs),specPath:Rs,op:Ms,path:ta,method:xs,tag:Tn})}).toArray()))}),Ze}return(0,oe.default)(ut,[{key:"render",value:function(){var ze=this.props.specSelectors.taggedOperations();return 0===ze.size?Y.default.createElement("h3",null," No operations defined in spec!"):Y.default.createElement("div",null,(0,Ae.default)(ze).call(ze,this.renderOperationTag).toArray(),ze.size<1?Y.default.createElement("h3",null," No operations defined in spec! "):null)}}]),ut}(Y.default.Component),_a=xo(3769);function el(bn){return bn.match(/^(?:[a-z]+:)?\/\//i)}function gu(bn,qt){return bn?el(bn)?(ut=bn).match(/^\/\//i)?(0,o.default)(ze="".concat(window.location.protocol)).call(ze,ut):ut:new _a.default(bn,qt).href:qt;var ut,ze}function tr(bn,qt){var ut=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{},ze=ut.selectedServer,Ze=void 0===ze?"":ze;if(bn){if(el(bn))return bn;var qe=gu(Ze,qt);return el(qe)?new _a.default(bn,qe).href:new _a.default(bn,window.location.href).href}}function ki(bn,qt){var ut=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{},ze=ut.selectedServer,Ze=void 0===ze?"":ze;try{return tr(bn,qt,{selectedServer:Ze})}catch(qe){return}}var us=function(bn){(0,uo.default)(ut,bn);var qt=(0,bo.default)(ut);function ut(){return(0,re.default)(this,ut),qt.apply(this,arguments)}return(0,oe.default)(ut,[{key:"render",value:function(){var ze,Ze=this.props,qe=Ze.tagObj,Ot=Ze.tag,At=Ze.children,Jt=Ze.oas3Selectors,Tn=Ze.layoutSelectors,Wn=Ze.layoutActions,sr=Ze.getComponent,hi=Ze.specUrl,li=(0,Ze.getConfigs)(),wi=li.docExpansion,Pi=li.deepLinking,co=Pi&&"false"!==Pi,Xi=sr("Collapse"),eo=sr("Markdown",!0),Ms=sr("DeepLink"),Fs=sr("Link"),ta=qe.getIn(["tagDetails","description"],null),xs=qe.getIn(["tagDetails","externalDocs","description"]),Rs=qe.getIn(["tagDetails","externalDocs","url"]);ze=(0,On.Wl)(Jt)&&(0,On.Wl)(Jt.selectedServer)?ki(Rs,hi,{selectedServer:Jt.selectedServer()}):Rs;var ks=["operations-tag",Ot],Os=Tn.isShown(ks,"full"===wi||"list"===wi);return Y.default.createElement("div",{className:Os?"opblock-tag-section is-open":"opblock-tag-section"},Y.default.createElement("h3",{onClick:function(){return Wn.show(ks,!Os)},className:ta?"opblock-tag":"opblock-tag no-desc",id:(0,Ae.default)(ks).call(ks,function(Ba){return(0,On.J6)(Ba)}).join("-"),"data-tag":Ot,"data-is-open":Os},Y.default.createElement(Ms,{enabled:co,isShown:Os,path:(0,On.oJ)(Ot),text:Ot}),ta?Y.default.createElement("small",null,Y.default.createElement(eo,{source:ta})):Y.default.createElement("small",null),xs?Y.default.createElement("div",{className:"info__externaldocs"},Y.default.createElement("small",null,xs,ze?": ":null,ze?Y.default.createElement(Fs,{href:(0,On.Nm)(ze),onClick:function(Ba){return Ba.stopPropagation()},target:"_blank"},ze):null)):null,Y.default.createElement("button",{"aria-expanded":Os,className:"expand-operation",title:Os?"Collapse operation":"Expand operation",onClick:function(){return Wn.show(ks,!Os)}},Y.default.createElement("svg",{className:"arrow",width:"20",height:"20","aria-hidden":"true",focusable:"false"},Y.default.createElement("use",{href:Os?"#large-arrow-up":"#large-arrow-down",xlinkHref:Os?"#large-arrow-up":"#large-arrow-down"})))),Y.default.createElement(Xi,{isOpened:Os},At))}}]),ut}(Y.default.Component);(0,X.default)(us,"defaultProps",{tagObj:ft.default.fromJS({}),tag:""});var Gi=function(bn){(0,uo.default)(ut,bn);var qt=(0,bo.default)(ut);function ut(){return(0,re.default)(this,ut),qt.apply(this,arguments)}return(0,oe.default)(ut,[{key:"render",value:function(){var ze=this.props,Ze=ze.specPath,qe=ze.response,Ot=ze.request,At=ze.toggleShown,Jt=ze.onTryoutClick,Tn=ze.onCancelClick,Wn=ze.onExecute,Hn=ze.fn,sr=ze.getComponent,hi=ze.getConfigs,li=ze.specActions,wi=ze.specSelectors,Pi=ze.authActions,co=ze.authSelectors,Xi=ze.oas3Actions,eo=ze.oas3Selectors,Ms=this.props.operation,Fs=Ms.toJS(),ta=Fs.deprecated,xs=Fs.isShown,Rs=Fs.path,ks=Fs.method,Os=Fs.op,Ba=Fs.tag,Ws=Fs.operationId,ba=Fs.allowTryItOut,rs=Fs.displayRequestDuration,na=Fs.tryItOutEnabled,gl=Fs.executeInProgress,td=Os.description,cf=Os.externalDocs,df=Os.schemes,Gf=cf?ki(cf.url,wi.url(),{selectedServer:eo.selectedServer()}):"",Zl=Ms.getIn(["op"]),nd=Zl.get("responses"),sc=(0,On.gp)(Zl,["parameters"]),mp=wi.operationScheme(Rs,ks),lp=["operations",Ba,Ws],k_=(0,On.nX)(Zl),Yd=sr("responses"),ac=sr("parameters"),jd=sr("execute"),ff=sr("clear"),pf=sr("Collapse"),Yh=sr("Markdown",!0),Id=sr("schemes"),Ld=sr("OperationServers"),Mf=sr("OperationExt"),jh=sr("OperationSummary"),jg=sr("Link"),ik=hi().showExtensions;if(nd&&qe&&qe.size>0){var ok=!nd.get(String(qe.get("status")))&&!nd.get("default");qe=qe.set("notDocumented",ok)}var sk=[Rs,ks];return Y.default.createElement("div",{className:ta?"opblock opblock-deprecated":xs?"opblock opblock-".concat(ks," is-open"):"opblock opblock-".concat(ks),id:(0,On.J6)(lp.join("-"))},Y.default.createElement(jh,{operationProps:Ms,isShown:xs,toggleShown:At,getComponent:sr,authActions:Pi,authSelectors:co,specPath:Ze}),Y.default.createElement(pf,{isOpened:xs},Y.default.createElement("div",{className:"opblock-body"},Zl&&Zl.size||null===Zl?null:Y.default.createElement("img",{height:"32px",width:"32px",src:xo(2517),className:"opblock-loading-animation"}),ta&&Y.default.createElement("h4",{className:"opblock-title_normal"}," Warning: Deprecated"),td&&Y.default.createElement("div",{className:"opblock-description-wrapper"},Y.default.createElement("div",{className:"opblock-description"},Y.default.createElement(Yh,{source:td}))),Gf?Y.default.createElement("div",{className:"opblock-external-docs-wrapper"},Y.default.createElement("h4",{className:"opblock-title_normal"},"Find more details"),Y.default.createElement("div",{className:"opblock-external-docs"},Y.default.createElement("span",{className:"opblock-external-docs__description"},Y.default.createElement(Yh,{source:cf.description})),Y.default.createElement(jg,{target:"_blank",className:"opblock-external-docs__link",href:(0,On.Nm)(Gf)},Gf))):null,Zl&&Zl.size?Y.default.createElement(ac,{parameters:sc,specPath:Ze.push("parameters"),operation:Zl,onChangeKey:sk,onTryoutClick:Jt,onCancelClick:Tn,tryItOutEnabled:na,allowTryItOut:ba,fn:Hn,getComponent:sr,specActions:li,specSelectors:wi,pathMethod:[Rs,ks],getConfigs:hi,oas3Actions:Xi,oas3Selectors:eo}):null,na?Y.default.createElement(Ld,{getComponent:sr,path:Rs,method:ks,operationServers:Zl.get("servers"),pathServers:wi.paths().getIn([Rs,"servers"]),getSelectedServer:eo.selectedServer,setSelectedServer:Xi.setSelectedServer,setServerVariableValue:Xi.setServerVariableValue,getServerVariable:eo.serverVariableValue,getEffectiveServerValue:eo.serverEffectiveValue}):null,na&&ba&&df&&df.size?Y.default.createElement("div",{className:"opblock-schemes"},Y.default.createElement(Id,{schemes:df,path:Rs,method:ks,specActions:li,currentScheme:mp})):null,Y.default.createElement("div",{className:na&&qe&&ba?"btn-group":"execute-wrapper"},na&&ba?Y.default.createElement(jd,{operation:Zl,specActions:li,specSelectors:wi,oas3Selectors:eo,oas3Actions:Xi,path:Rs,method:ks,onExecute:Wn,disabled:gl}):null,na&&qe&&ba?Y.default.createElement(ff,{specActions:li,path:Rs,method:ks}):null),gl?Y.default.createElement("div",{className:"loading-container"},Y.default.createElement("div",{className:"loading"})):null,nd?Y.default.createElement(Yd,{responses:nd,request:Ot,tryItOutResponse:qe,getComponent:sr,getConfigs:hi,specSelectors:wi,oas3Actions:Xi,oas3Selectors:eo,specActions:li,produces:wi.producesOptionsFor([Rs,ks]),producesValue:wi.currentProducesFor([Rs,ks]),specPath:Ze.push("responses"),path:Rs,method:ks,displayRequestDuration:rs,fn:Hn}):null,ik&&k_.size?Y.default.createElement(Mf,{extensions:k_,getComponent:sr}):null)))}}]),ut}(Y.PureComponent);(0,X.default)(Gi,"defaultProps",{operation:null,response:null,request:null,specPath:(0,ft.List)(),summary:""});const ws=(bn=>{var qt={};return xo.d(qt,bn),qt})({default:()=>N7()});var ss=function(bn){(0,uo.default)(ut,bn);var qt=(0,bo.default)(ut);function ut(){return(0,re.default)(this,ut),qt.apply(this,arguments)}return(0,oe.default)(ut,[{key:"render",value:function(){var ze,Ze=this.props,qe=Ze.isShown,Ot=Ze.toggleShown,At=Ze.getComponent,Jt=Ze.authActions,Tn=Ze.authSelectors,Wn=Ze.operationProps,Hn=Ze.specPath,sr=Wn.toJS(),hi=sr.summary,li=sr.isAuthorized,wi=sr.method,co=sr.showSummary,Xi=sr.path,eo=sr.operationId,Ms=sr.originalOperationId,Fs=sr.displayOperationId,ta=sr.op.summary,xs=Wn.get("security"),Rs=At("authorizeOperationBtn"),ks=At("OperationSummaryMethod"),Os=At("OperationSummaryPath"),Ba=At("JumpToPath",!0),Ws=xs&&!!xs.count(),ba=Ws&&1===xs.size&&xs.first().isEmpty(),rs=!Ws||ba;return Y.default.createElement("div",{className:"opblock-summary opblock-summary-".concat(wi)},Y.default.createElement("button",{"aria-label":(0,o.default)(ze="".concat(wi," ")).call(ze,Xi.replace(/\//g,"\u200b/")),"aria-expanded":qe,className:"opblock-summary-control",onClick:Ot},Y.default.createElement(ks,{method:wi}),Y.default.createElement(Os,{getComponent:At,operationProps:Wn,specPath:Hn}),co?Y.default.createElement("div",{className:"opblock-summary-description"},(0,ws.default)(ta||hi)):null,Fs&&(Ms||eo)?Y.default.createElement("span",{className:"opblock-summary-operation-id"},Ms||eo):null,Y.default.createElement("svg",{className:"arrow",width:"20",height:"20","aria-hidden":"true",focusable:"false"},Y.default.createElement("use",{href:qe?"#large-arrow-up":"#large-arrow-down",xlinkHref:qe?"#large-arrow-up":"#large-arrow-down"}))),rs?null:Y.default.createElement(Rs,{isAuthorized:li,onClick:function(){var na=Tn.definitionsForRequirements(xs);Jt.showDefinitions(na)}}),Y.default.createElement(Ba,{path:Hn}))}}]),ut}(Y.PureComponent);(0,X.default)(ss,"defaultProps",{operationProps:null,specPath:(0,ft.List)(),summary:""});var eu=function(bn){(0,uo.default)(ut,bn);var qt=(0,bo.default)(ut);function ut(){return(0,re.default)(this,ut),qt.apply(this,arguments)}return(0,oe.default)(ut,[{key:"render",value:function(){return Y.default.createElement("span",{className:"opblock-summary-method"},this.props.method.toUpperCase())}}]),ut}(Y.PureComponent);(0,X.default)(eu,"defaultProps",{operationProps:null});const El=(bn=>{var qt={};return xo.d(qt,bn),qt})({default:()=>I7()});var dl=function(bn){(0,uo.default)(ut,bn);var qt=(0,bo.default)(ut);function ut(){return(0,re.default)(this,ut),qt.apply(this,arguments)}return(0,oe.default)(ut,[{key:"render",value:function(){for(var ze,Ze=this.props,qe=Ze.getComponent,Ot=Ze.operationProps.toJS(),At=Ot.deprecated,Jt=Ot.isShown,Tn=Ot.path,Wn=Ot.tag,Hn=Ot.operationId,sr=Ot.isDeepLinkingEnabled,hi=Tn.split(/(?=\/)/g),li=1;li<hi.length;li+=2)(0,El.default)(hi).call(hi,li,0,Y.default.createElement("wbr",{key:li}));var wi=qe("DeepLink");return Y.default.createElement("span",{className:At?"opblock-summary-path__deprecated":"opblock-summary-path","data-path":Tn},Y.default.createElement(wi,{enabled:sr,isShown:Jt,path:(0,On.oJ)((0,o.default)(ze="".concat(Wn,"/")).call(ze,Hn)),text:hi}))}}]),ut}(Y.PureComponent),Ha=xo(9334);const Ti=function(bn){var qt,ut=bn.extensions,ze=(0,bn.getComponent)("OperationExtRow");return Y.default.createElement("div",{className:"opblock-section"},Y.default.createElement("div",{className:"opblock-section-header"},Y.default.createElement("h4",null,"Extensions")),Y.default.createElement("div",{className:"table-container"},Y.default.createElement("table",null,Y.default.createElement("thead",null,Y.default.createElement("tr",null,Y.default.createElement("td",{className:"col_header"},"Field"),Y.default.createElement("td",{className:"col_header"},"Value"))),Y.default.createElement("tbody",null,(0,Ae.default)(qt=ut.entrySeq()).call(qt,function(Ze){var qe,Ot=(0,Ha.default)(Ze,2),At=Ot[0],Jt=Ot[1];return Y.default.createElement(ze,{key:(0,o.default)(qe="".concat(At,"-")).call(qe,Jt),xKey:At,xVal:Jt})})))))},Ju=function(bn){var qt=bn.xKey,ut=bn.xVal,ze=ut?ut.toJS?ut.toJS():ut:null;return Y.default.createElement("tr",null,Y.default.createElement("td",null,qt),Y.default.createElement("td",null,(0,w.default)(ze)))};var mu=xo(29),jf=xo(8096),ah=xo(471),Yl=xo(9908),ap=xo(7068);const q_=(bn=>{var qt={};return xo.d(qt,bn),qt})({default:()=>F7()});var lh=xo(9874),hg=function(bn){var qt=bn.value,ut=bn.fileName,ze=bn.className,Ze=bn.downloadable,qe=bn.getConfigs,Ot=bn.canCopy,At=bn.language,Jt=(0,ap.default)(qe)?qe():null,Tn=!1!==(0,Yl.default)(Jt,"syntaxHighlight")&&(0,Yl.default)(Jt,"syntaxHighlight.activated",!0),Wn=(0,Y.useRef)(null);(0,Y.useEffect)(function(){var sr,hi=(0,_.default)(sr=(0,sh.default)(Wn.current.childNodes)).call(sr,function(li){return!!li.nodeType&&li.classList.contains("microlight")});return(0,mu.default)(hi).call(hi,function(li){return li.addEventListener("mousewheel",Hn,{passive:!1})}),function(){(0,mu.default)(hi).call(hi,function(li){return li.removeEventListener("mousewheel",Hn)})}},[qt,ze,At]);var Hn=function(sr){var hi=sr.target,li=sr.deltaY,wi=hi.scrollHeight,Pi=hi.offsetHeight,co=hi.scrollTop;wi>Pi&&(0===co&&li<0||Pi+co>=wi&&li>0)&&sr.preventDefault()};return Y.default.createElement("div",{className:"highlight-code",ref:Wn},Ze?Y.default.createElement("div",{className:"download-contents",onClick:function(){(0,q_.default)(qt,ut)}},"Download"):null,Ot&&Y.default.createElement("div",{className:"copy-to-clipboard"},Y.default.createElement(lh.CopyToClipboard,{text:qt},Y.default.createElement("button",null))),Tn?Y.default.createElement(ah.d3,{language:At,className:(0,jf.default)(ze,"microlight"),style:(0,ah.C2)((0,Yl.default)(Jt,"syntaxHighlight.theme","agate"))},qt):Y.default.createElement("pre",{className:(0,jf.default)(ze,"microlight")},qt))};hg.defaultProps={fileName:"response.txt"};const F_=hg;var tv=function(bn){(0,uo.default)(ut,bn);var qt=(0,bo.default)(ut);function ut(){var ze,Ze;(0,re.default)(this,ut);for(var qe=arguments.length,Ot=new Array(qe),At=0;At<qe;At++)Ot[At]=arguments[At];return Ze=qt.call.apply(qt,(0,o.default)(ze=[this]).call(ze,Ot)),(0,X.default)((0,Ri.default)(Ze),"onChangeProducesWrapper",function(Jt){return Ze.props.specActions.changeProducesValue([Ze.props.path,Ze.props.method],Jt)}),(0,X.default)((0,Ri.default)(Ze),"onResponseContentTypeChange",function(Jt){var Hn=Ze.props;Jt.controlsAcceptHeader&&Hn.oas3Actions.setResponseContentType({value:Jt.value,path:Hn.path,method:Hn.method})}),Ze}return(0,oe.default)(ut,[{key:"render",value:function(){var ze,Ze,qe=this,Ot=this.props,At=Ot.responses,Jt=Ot.tryItOutResponse,Tn=Ot.getComponent,Wn=Ot.getConfigs,Hn=Ot.specSelectors,sr=Ot.fn,hi=Ot.producesValue,li=Ot.displayRequestDuration,wi=Ot.specPath,Pi=Ot.path,co=Ot.method,Xi=Ot.oas3Selectors,eo=Ot.oas3Actions,Ms=(0,On.iQ)(At),Fs=Tn("contentType"),ta=Tn("liveResponse"),xs=Tn("response"),Rs=this.props.produces&&this.props.produces.size?this.props.produces:ut.defaultProps.produces,ks=Hn.isOAS3()?(0,On.QG)(At):null,Os=function(Ws){var ba=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"_";return Ws.replace(/[^\w-]/g,ba)}((0,o.default)(ze="".concat(co)).call(ze,Pi,"_responses")),Ba="".concat(Os,"_select");return Y.default.createElement("div",{className:"responses-wrapper"},Y.default.createElement("div",{className:"opblock-section-header"},Y.default.createElement("h4",null,"Responses"),Hn.isOAS3()?null:Y.default.createElement("label",{htmlFor:Ba},Y.default.createElement("span",null,"Response content type"),Y.default.createElement(Fs,{value:hi,ariaControls:Os,ariaLabel:"Response content type",className:"execute-content-type",contentTypes:Rs,controlId:Ba,onChange:this.onChangeProducesWrapper}))),Y.default.createElement("div",{className:"responses-inner"},Jt?Y.default.createElement("div",null,Y.default.createElement(ta,{response:Jt,getComponent:Tn,getConfigs:Wn,specSelectors:Hn,path:this.props.path,method:this.props.method,displayRequestDuration:li}),Y.default.createElement("h4",null,"Responses")):null,Y.default.createElement("table",{"aria-live":"polite",className:"responses-table",id:Os,role:"region"},Y.default.createElement("thead",null,Y.default.createElement("tr",{className:"responses-header"},Y.default.createElement("td",{className:"col_header response-col_status"},"Code"),Y.default.createElement("td",{className:"col_header response-col_description"},"Description"),Hn.isOAS3()?Y.default.createElement("td",{className:"col col_header response-col_links"},"Links"):null)),Y.default.createElement("tbody",null,(0,Ae.default)(Ze=At.entrySeq()).call(Ze,function(Ws){var ba=(0,Ha.default)(Ws,2),rs=ba[0],na=ba[1],gl=Jt&&Jt.get("status")==rs?"response_current":"";return Y.default.createElement(xs,{key:rs,path:Pi,method:co,specPath:wi.push(rs),isDefault:Ms===rs,fn:sr,className:gl,code:rs,response:na,specSelectors:Hn,controlsAcceptHeader:na===ks,onContentTypeChange:qe.onResponseContentTypeChange,contentType:hi,getConfigs:Wn,activeExamplesKey:Xi.activeExamplesMember(Pi,co,"responses",rs),oas3Actions:eo,getComponent:Tn})}).toArray()))))}}]),ut}(Y.default.Component);(0,X.default)(tv,"defaultProps",{tryItOutResponse:null,produces:(0,ft.fromJS)(["application/json"]),displayRequestDuration:!1});var uh=xo(1013);const md=(bn=>{var qt={};return xo.d(qt,bn),qt})({default:()=>$7()});var _g=xo(2518),Yg=function(bn){(0,uo.default)(ut,bn);var qt=(0,bo.default)(ut);function ut(ze,Ze){var qe;return(0,re.default)(this,ut),qe=qt.call(this,ze,Ze),(0,X.default)((0,Ri.default)(qe),"_onContentTypeChange",function(Ot){var At=qe.props,Jt=At.onContentTypeChange,Tn=At.controlsAcceptHeader;qe.setState({responseContentType:Ot}),Jt({value:Ot,controlsAcceptHeader:Tn})}),(0,X.default)((0,Ri.default)(qe),"getTargetExamplesKey",function(){var Ot=qe.props,Tn=Ot.activeExamplesKey,Hn=Ot.response.getIn(["content",qe.state.responseContentType||Ot.contentType],(0,ft.Map)({})).get("examples",null).keySeq().first();return Tn||Hn}),qe.state={responseContentType:""},qe}return(0,oe.default)(ut,[{key:"render",value:function(){var ze,Ze,qe,Ot,At,Jt=this.props,Tn=Jt.path,Wn=Jt.method,Hn=Jt.code,sr=Jt.response,hi=Jt.className,li=Jt.specPath,Pi=Jt.getComponent,co=Jt.getConfigs,Xi=Jt.specSelectors,eo=Jt.contentType,Ms=Jt.controlsAcceptHeader,Fs=Jt.oas3Actions,ta=Jt.fn.inferSchema,xs=Xi.isOAS3(),Rs=co().showExtensions,ks=Rs?(0,On.nX)(sr):null,Os=sr.get("headers"),Ba=sr.get("links"),Ws=Pi("ResponseExtension"),ba=Pi("headers"),rs=Pi("highlightCode"),na=Pi("modelExample"),gl=Pi("Markdown",!0),td=Pi("operationLink"),cf=Pi("contentType"),df=Pi("ExamplesSelect"),Gf=Pi("Example"),Zl=this.state.responseContentType||eo,nd=sr.getIn(["content",Zl],(0,ft.Map)({})),sc=nd.get("examples",null);if(xs){var mp=nd.get("schema");qe=mp?ta(mp.toJS()):null,Ot=mp?(0,ft.List)(["content",this.state.responseContentType,"schema"]):li}else qe=sr.get("schema"),Ot=sr.has("schema")?li.push("schema"):li;var lp,k_=!1,Yd={includeReadOnly:!0};if(xs){var ac;if(lp=null===(ac=nd.get("schema"))||void 0===ac?void 0:ac.toJS(),sc){var jd=this.getTargetExamplesKey(),ff=function(Id){return Id.get("value")};void 0===(At=ff(sc.get(jd,(0,ft.Map)({}))))&&(At=ff((0,md.default)(sc).call(sc).next().value)),k_=!0}else void 0!==nd.get("example")&&(At=nd.get("example"),k_=!0)}else{lp=qe,Yd=(0,uh.default)((0,uh.default)({},Yd),{},{includeWriteOnly:!0});var pf=sr.getIn(["examples",Zl]);pf&&(At=pf,k_=!0)}var Yh=function(Id,Ld,Mf){if(null!=Id){var jh=null;return(0,_g.O)(Id)&&(jh="json"),Y.default.createElement("div",null,Y.default.createElement(Ld,{className:"example",getConfigs:Mf,language:jh,value:(0,On.Pz)(Id)}))}return null}((0,On.xi)(lp,Zl,Yd,k_?At:void 0),rs,co);return Y.default.createElement("tr",{className:"response "+(hi||""),"data-code":Hn},Y.default.createElement("td",{className:"response-col_status"},Hn),Y.default.createElement("td",{className:"response-col_description"},Y.default.createElement("div",{className:"response-col_description__inner"},Y.default.createElement(gl,{source:sr.get("description")})),Rs&&ks.size?(0,Ae.default)(ze=ks.entrySeq()).call(ze,function(Id){var Ld,Mf=(0,Ha.default)(Id,2),jh=Mf[0],jg=Mf[1];return Y.default.createElement(Ws,{key:(0,o.default)(Ld="".concat(jh,"-")).call(Ld,jg),xKey:jh,xVal:jg})}):null,xs&&sr.get("content")?Y.default.createElement("section",{className:"response-controls"},Y.default.createElement("div",{className:(0,jf.default)("response-control-media-type",{"response-control-media-type--accept-controller":Ms})},Y.default.createElement("small",{className:"response-control-media-type__title"},"Media type"),Y.default.createElement(cf,{value:this.state.responseContentType,contentTypes:sr.get("content")?sr.get("content").keySeq():(0,ft.Seq)(),onChange:this._onContentTypeChange,ariaLabel:"Media Type"}),Ms?Y.default.createElement("small",{className:"response-control-media-type__accept-message"},"Controls ",Y.default.createElement("code",null,"Accept")," header."):null),sc?Y.default.createElement("div",{className:"response-control-examples"},Y.default.createElement("small",{className:"response-control-examples__title"},"Examples"),Y.default.createElement(df,{examples:sc,currentExampleKey:this.getTargetExamplesKey(),onSelect:function(Id){return Fs.setActiveExamplesMember({name:Id,pathMethod:[Tn,Wn],contextType:"responses",contextName:Hn})},showLabels:!1})):null):null,Yh||qe?Y.default.createElement(na,{specPath:Ot,getComponent:Pi,getConfigs:co,specSelectors:Xi,schema:(0,On.oG)(qe),example:Yh,includeReadOnly:!0}):null,xs&&sc?Y.default.createElement(Gf,{example:sc.get(this.getTargetExamplesKey(),(0,ft.Map)({})),getComponent:Pi,getConfigs:co,omitValue:!0}):null,Os?Y.default.createElement(ba,{headers:Os,getComponent:Pi}):null),xs?Y.default.createElement("td",{className:"response-col_links"},Ba?(0,Ae.default)(Ze=Ba.toSeq().entrySeq()).call(Ze,function(Id){var Ld=(0,Ha.default)(Id,2),Mf=Ld[0];return Y.default.createElement(td,{key:Mf,name:Mf,link:Ld[1],getComponent:Pi})}):Y.default.createElement("i",null,"No links")):null)}}]),ut}(Y.default.Component);(0,X.default)(Yg,"defaultProps",{response:(0,ft.fromJS)({}),onContentTypeChange:function(){}});const eg=function(bn){return Y.default.createElement("div",{className:"response__extension"},bn.xKey,": ",String(bn.xVal))},mm=(bn=>{var qt={};return xo.d(qt,bn),qt})({default:()=>B7()}),Fp=(bn=>{var qt={};return xo.d(qt,bn),qt})({default:()=>Y7()});var MC=function(bn){(0,uo.default)(ut,bn);var qt=(0,bo.default)(ut);function ut(){var ze,Ze;(0,re.default)(this,ut);for(var qe=arguments.length,Ot=new Array(qe),At=0;At<qe;At++)Ot[At]=arguments[At];return Ze=qt.call.apply(qt,(0,o.default)(ze=[this]).call(ze,Ot)),(0,X.default)((0,Ri.default)(Ze),"state",{parsedContent:null}),(0,X.default)((0,Ri.default)(Ze),"updateParsedContent",function(Jt){var Tn=Ze.props.content;if(Jt!==Tn)if(Tn&&Tn instanceof Blob){var Wn=new FileReader;Wn.onload=function(){Ze.setState({parsedContent:Wn.result})},Wn.readAsText(Tn)}else Ze.setState({parsedContent:Tn.toString()})}),Ze}return(0,oe.default)(ut,[{key:"componentDidMount",value:function(){this.updateParsedContent(null)}},{key:"componentDidUpdate",value:function(ze){this.updateParsedContent(ze.content)}},{key:"render",value:function(){var ze,Ze,qe=this.props,Ot=qe.content,At=qe.contentType,Jt=qe.url,Tn=qe.headers,Wn=void 0===Tn?{}:Tn,Hn=qe.getConfigs,hi=this.state.parsedContent,li=(0,qe.getComponent)("highlightCode"),wi="response_"+(new Date).getTime();if(Jt=Jt||"",/^application\/octet-stream/i.test(At)||Wn["Content-Disposition"]&&/attachment/i.test(Wn["Content-Disposition"])||Wn["content-disposition"]&&/attachment/i.test(Wn["content-disposition"])||Wn["Content-Description"]&&/File Transfer/i.test(Wn["Content-Description"])||Wn["content-description"]&&/File Transfer/i.test(Wn["content-description"]))if("Blob"in window){var Pi=At||"text/html",co=Ot instanceof Blob?Ot:new Blob([Ot],{type:Pi}),Xi=_a.default.createObjectURL(co),eo=[Pi,Jt.substr((0,l.default)(Jt).call(Jt,"/")+1),Xi].join(":"),Ms=Wn["content-disposition"]||Wn["Content-Disposition"];if(void 0!==Ms){var Fs=(0,On.DR)(Ms);null!==Fs&&(eo=Fs)}Ze=Y.default.createElement("div",null,Y.default.createElement("a",In.Z.navigator&&In.Z.navigator.msSaveOrOpenBlob?{href:Xi,onClick:function(){return In.Z.navigator.msSaveOrOpenBlob(co,eo)}}:{href:Xi,download:eo},"Download file"))}else Ze=Y.default.createElement("pre",{className:"microlight"},"Download headers detected but your browser does not support downloading binary via XHR (Blob).");else if(/json/i.test(At)){var ta=null;(0,_g.O)(Ot)&&(ta="json");try{ze=(0,w.default)(JSON.parse(Ot),null,"  ")}catch(xs){ze="can't parse JSON.  Raw result:\n\n"+Ot}Ze=Y.default.createElement(li,{language:ta,downloadable:!0,fileName:"".concat(wi,".json"),value:ze,getConfigs:Hn,canCopy:!0})}else/xml/i.test(At)?(ze=(0,mm.default)(Ot,{textNodesOnSameLine:!0,indentor:"  "}),Ze=Y.default.createElement(li,{downloadable:!0,fileName:"".concat(wi,".xml"),value:ze,getConfigs:Hn,canCopy:!0})):Ze="text/html"===(0,Fp.default)(At)||/text\/plain/.test(At)?Y.default.createElement(li,{downloadable:!0,fileName:"".concat(wi,".html"),value:Ot,getConfigs:Hn,canCopy:!0}):"text/csv"===(0,Fp.default)(At)||/text\/csv/.test(At)?Y.default.createElement(li,{downloadable:!0,fileName:"".concat(wi,".csv"),value:Ot,getConfigs:Hn,canCopy:!0}):/^image\//i.test(At)?(0,Vl.default)(At).call(At,"svg")?Y.default.createElement("div",null," ",Ot," "):Y.default.createElement("img",{src:_a.default.createObjectURL(Ot)}):/^audio\//i.test(At)?Y.default.createElement("pre",{className:"microlight"},Y.default.createElement("audio",{controls:!0},Y.default.createElement("source",{src:Jt,type:At}))):"string"==typeof Ot?Y.default.createElement(li,{downloadable:!0,fileName:"".concat(wi,".txt"),value:Ot,getConfigs:Hn,canCopy:!0}):Ot.size>0?hi?Y.default.createElement("div",null,Y.default.createElement("p",{className:"i"},"Unrecognized response type; displaying content as text."),Y.default.createElement(li,{downloadable:!0,fileName:"".concat(wi,".txt"),value:hi,getConfigs:Hn,canCopy:!0})):Y.default.createElement("p",{className:"i"},"Unrecognized response type; unable to display."):null;return Ze?Y.default.createElement("div",null,Y.default.createElement("h5",null,"Response body"),Ze):null}}]),ut}(Y.default.PureComponent),Pd=xo(2691),OC=xo(374),KE=function(bn){(0,uo.default)(ut,bn);var qt=(0,bo.default)(ut);function ut(ze){var Ze;return(0,re.default)(this,ut),Ze=qt.call(this,ze),(0,X.default)((0,Ri.default)(Ze),"onChange",function(qe,Ot,At){var Jt=Ze.props;(0,Jt.specActions.changeParamByIdentity)(Jt.onChangeKey,qe,Ot,At)}),(0,X.default)((0,Ri.default)(Ze),"onChangeConsumesWrapper",function(qe){var Ot=Ze.props;(0,Ot.specActions.changeConsumesValue)(Ot.onChangeKey,qe)}),(0,X.default)((0,Ri.default)(Ze),"toggleTab",function(qe){return"parameters"===qe?Ze.setState({parametersVisible:!0,callbackVisible:!1}):"callbacks"===qe?Ze.setState({callbackVisible:!0,parametersVisible:!1}):void 0}),(0,X.default)((0,Ri.default)(Ze),"onChangeMediaType",function(qe){var Ot=qe.value,At=qe.pathMethod,Jt=Ze.props,Tn=Jt.specActions,Wn=Jt.oas3Selectors,Hn=Jt.oas3Actions,sr=Wn.hasUserEditedBody.apply(Wn,(0,Pd.default)(At)),hi=Wn.shouldRetainRequestBodyValue.apply(Wn,(0,Pd.default)(At));Hn.setRequestContentType({value:Ot,pathMethod:At}),Hn.initRequestBodyValidateError({pathMethod:At}),sr||(hi||Hn.setRequestBodyValue({value:void 0,pathMethod:At}),Tn.clearResponse.apply(Tn,(0,Pd.default)(At)),Tn.clearRequest.apply(Tn,(0,Pd.default)(At)),Tn.clearValidateParams(At))}),Ze.state={callbackVisible:!1,parametersVisible:!0},Ze}return(0,oe.default)(ut,[{key:"render",value:function(){var ze,Ze,qe=this,Ot=this.props,At=Ot.onTryoutClick,Jt=Ot.parameters,Tn=Ot.allowTryItOut,Wn=Ot.tryItOutEnabled,Hn=Ot.specPath,sr=Ot.fn,hi=Ot.getComponent,li=Ot.getConfigs,wi=Ot.specSelectors,Pi=Ot.specActions,co=Ot.pathMethod,Xi=Ot.oas3Actions,eo=Ot.oas3Selectors,Ms=Ot.operation,Fs=hi("parameterRow"),ta=hi("TryItOutButton"),xs=hi("contentType"),Rs=hi("Callbacks",!0),ks=hi("RequestBody",!0),Os=Wn&&Tn,Ba=wi.isOAS3(),Ws=Ms.get("requestBody"),ba=(0,Ie.default)(ze=(0,OC.default)((0,Ie.default)(Jt).call(Jt,function(rs,na){var gl,td=na.get("in");return null!==(gl=rs[td])&&void 0!==gl||(rs[td]=[]),rs[td].push(na),rs},{}))).call(ze,function(rs,na){return(0,o.default)(rs).call(rs,na)},[]);return Y.default.createElement("div",{className:"opblock-section"},Y.default.createElement("div",{className:"opblock-section-header"},Ba?Y.default.createElement("div",{className:"tab-header"},Y.default.createElement("div",{onClick:function(){return qe.toggleTab("parameters")},className:"tab-item ".concat(this.state.parametersVisible&&"active")},Y.default.createElement("h4",{className:"opblock-title"},Y.default.createElement("span",null,"Parameters"))),Ms.get("callbacks")?Y.default.createElement("div",{onClick:function(){return qe.toggleTab("callbacks")},className:"tab-item ".concat(this.state.callbackVisible&&"active")},Y.default.createElement("h4",{className:"opblock-title"},Y.default.createElement("span",null,"Callbacks"))):null):Y.default.createElement("div",{className:"tab-header"},Y.default.createElement("h4",{className:"opblock-title"},"Parameters")),Tn?Y.default.createElement(ta,{isOAS3:wi.isOAS3(),hasUserEditedBody:eo.hasUserEditedBody.apply(eo,(0,Pd.default)(co)),enabled:Wn,onCancelClick:this.props.onCancelClick,onTryoutClick:At,onResetClick:function(){return Xi.setRequestBodyValue({value:void 0,pathMethod:co})}}):null),this.state.parametersVisible?Y.default.createElement("div",{className:"parameters-container"},ba.length?Y.default.createElement("div",{className:"table-container"},Y.default.createElement("table",{className:"parameters"},Y.default.createElement("thead",null,Y.default.createElement("tr",null,Y.default.createElement("th",{className:"col_header parameters-col_name"},"Name"),Y.default.createElement("th",{className:"col_header parameters-col_description"},"Description"))),Y.default.createElement("tbody",null,(0,Ae.default)(ba).call(ba,function(rs,na){var gl;return Y.default.createElement(Fs,{fn:sr,specPath:Hn.push(na.toString()),getComponent:hi,getConfigs:li,rawParam:rs,param:wi.parameterWithMetaByIdentity(co,rs),key:(0,o.default)(gl="".concat(rs.get("in"),".")).call(gl,rs.get("name")),onChange:qe.onChange,onChangeConsumes:qe.onChangeConsumesWrapper,specSelectors:wi,specActions:Pi,oas3Actions:Xi,oas3Selectors:eo,pathMethod:co,isExecute:Os})})))):Y.default.createElement("div",{className:"opblock-description-wrapper"},Y.default.createElement("p",null,"No parameters"))):null,this.state.callbackVisible?Y.default.createElement("div",{className:"callbacks-container opblock-description-wrapper"},Y.default.createElement(Rs,{callbacks:(0,ft.Map)(Ms.get("callbacks")),specPath:(0,Pe.default)(Hn).call(Hn,0,-1).push("callbacks")})):null,Ba&&Ws&&this.state.parametersVisible&&Y.default.createElement("div",{className:"opblock-section opblock-section-request-body"},Y.default.createElement("div",{className:"opblock-section-header"},Y.default.createElement("h4",{className:"opblock-title parameter__name ".concat(Ws.get("required")&&"required")},"Request body"),Y.default.createElement("label",null,Y.default.createElement(xs,{value:eo.requestContentType.apply(eo,(0,Pd.default)(co)),contentTypes:Ws.get("content",(0,ft.List)()).keySeq(),onChange:function(rs){qe.onChangeMediaType({value:rs,pathMethod:co})},className:"body-param-content-type",ariaLabel:"Request content type"}))),Y.default.createElement("div",{className:"opblock-description-wrapper"},Y.default.createElement(ks,{setRetainRequestBodyValueFlag:function(rs){return Xi.setRetainRequestBodyValueFlag({value:rs,pathMethod:co})},userHasEditedBody:eo.hasUserEditedBody.apply(eo,(0,Pd.default)(co)),specPath:(0,Pe.default)(Hn).call(Hn,0,-1).push("requestBody"),requestBody:Ws,requestBodyValue:eo.requestBodyValue.apply(eo,(0,Pd.default)(co)),requestBodyInclusionSetting:eo.requestBodyInclusionSetting.apply(eo,(0,Pd.default)(co)),requestBodyErrors:eo.requestBodyErrors.apply(eo,(0,Pd.default)(co)),isExecute:Os,getConfigs:li,activeExamplesKey:eo.activeExamplesMember.apply(eo,(0,o.default)(Ze=(0,Pd.default)(co)).call(Ze,["requestBody","requestBody"])),updateActiveExamplesKey:function(rs){qe.props.oas3Actions.setActiveExamplesMember({name:rs,pathMethod:qe.props.pathMethod,contextType:"requestBody",contextName:"requestBody"})},onChange:function(rs,na){if(na){var gl=eo.requestBodyValue.apply(eo,(0,Pd.default)(co)),td=ft.Map.isMap(gl)?gl:(0,ft.Map)();return Xi.setRequestBodyValue({pathMethod:co,value:td.setIn(na,rs)})}Xi.setRequestBodyValue({value:rs,pathMethod:co})},onChangeIncludeEmpty:function(rs,na){Xi.setRequestBodyInclusion({pathMethod:co,value:na,name:rs})},contentType:eo.requestContentType.apply(eo,(0,Pd.default)(co))}))))}}]),ut}(Y.Component);(0,X.default)(KE,"defaultProps",{onTryoutClick:Function.prototype,onCancelClick:Function.prototype,tryItOutEnabled:!1,allowTryItOut:!0,onChangeKey:[],specPath:[]});const AC=function(bn){return Y.default.createElement("div",{className:"parameter__extension"},bn.xKey,": ",String(bn.xVal))};var XE=function(bn){(0,uo.default)(ut,bn);var qt=(0,bo.default)(ut);function ut(){var ze,Ze;(0,re.default)(this,ut);for(var qe=arguments.length,Ot=new Array(qe),At=0;At<qe;At++)Ot[At]=arguments[At];return Ze=qt.call.apply(qt,(0,o.default)(ze=[this]).call(ze,Ot)),(0,X.default)((0,Ri.default)(Ze),"onCheckboxChange",function(Jt){(0,Ze.props.onChange)(Jt.target.checked)}),Ze}return(0,oe.default)(ut,[{key:"componentDidMount",value:function(){var ze=this.props,Ze=ze.isIncludedOptions;Ze.shouldDispatchInit&&(0,ze.onChange)(Ze.defaultValue)}},{key:"render",value:function(){var ze=this.props,Ze=ze.isIncluded,qe=ze.isDisabled;return Y.default.createElement("div",null,Y.default.createElement("label",{className:(0,jf.default)("parameter__empty_value_toggle",{disabled:qe})},Y.default.createElement("input",{type:"checkbox",disabled:qe,checked:!qe&&Ze,onChange:this.onCheckboxChange}),"Send empty value"))}}]),ut}(Y.Component);(0,X.default)(XE,"defaultProps",{onChange:function(){},isIncludedOptions:{}});var P0=xo(9069),wC=function(bn){(0,uo.default)(ut,bn);var qt=(0,bo.default)(ut);function ut(ze,Ze){var qe;return(0,re.default)(this,ut),qe=qt.call(this,ze,Ze),(0,X.default)((0,Ri.default)(qe),"onChangeWrapper",function(Ot){var At=arguments.length>1&&void 0!==arguments[1]&&arguments[1],Jt=qe.props,Tn=Jt.onChange,Wn=Jt.rawParam;return Tn(Wn,""===Ot||Ot&&0===Ot.size?null:Ot,At)}),(0,X.default)((0,Ri.default)(qe),"_onExampleSelect",function(Ot){qe.props.oas3Actions.setActiveExamplesMember({name:Ot,pathMethod:qe.props.pathMethod,contextType:"parameters",contextName:qe.getParamKey()})}),(0,X.default)((0,Ri.default)(qe),"onChangeIncludeEmpty",function(Ot){var At=qe.props,Jt=At.specActions,Tn=At.param,Wn=At.pathMethod,Hn=Tn.get("name"),sr=Tn.get("in");return Jt.updateEmptyParamInclusion(Wn,Hn,sr,Ot)}),(0,X.default)((0,Ri.default)(qe),"setDefaultValue",function(){var Ot=qe.props,At=Ot.specSelectors,Jt=Ot.pathMethod,Wn=Ot.oas3Selectors,Hn=At.parameterWithMetaByIdentity(Jt,Ot.rawParam)||(0,ft.Map)(),sr=(0,P0.Z)(Hn,{isOAS3:At.isOAS3()}).schema,hi=Hn.get("content",(0,ft.Map)()).keySeq().first(),li=sr?(0,On.xi)(sr.toJS(),hi,{includeWriteOnly:!0}):null;if(Hn&&void 0===Hn.get("value")&&"body"!==Hn.get("in")){var wi;if(At.isSwagger2())wi=void 0!==Hn.get("x-example")?Hn.get("x-example"):void 0!==Hn.getIn(["schema","example"])?Hn.getIn(["schema","example"]):sr&&sr.getIn(["default"]);else if(At.isOAS3()){var Pi,co=Wn.activeExamplesMember.apply(Wn,(0,o.default)(Pi=(0,Pd.default)(Jt)).call(Pi,["parameters",qe.getParamKey()]));wi=void 0!==Hn.getIn(["examples",co,"value"])?Hn.getIn(["examples",co,"value"]):void 0!==Hn.getIn(["content",hi,"example"])?Hn.getIn(["content",hi,"example"]):void 0!==Hn.get("example")?Hn.get("example"):void 0!==(sr&&sr.get("example"))?sr&&sr.get("example"):void 0!==(sr&&sr.get("default"))?sr&&sr.get("default"):Hn.get("default")}void 0===wi||ft.List.isList(wi)||(wi=(0,On.Pz)(wi)),void 0!==wi?qe.onChangeWrapper(wi):sr&&"object"===sr.get("type")&&li&&!Hn.get("examples")&&qe.onChangeWrapper(ft.List.isList(li)?li:(0,On.Pz)(li))}}),qe.setDefaultValue(),qe}return(0,oe.default)(ut,[{key:"UNSAFE_componentWillReceiveProps",value:function(ze){var Ze,qe=ze.specSelectors,Ot=ze.pathMethod,At=ze.rawParam,Jt=qe.isOAS3(),Tn=qe.parameterWithMetaByIdentity(Ot,At)||new ft.Map;if(Tn=Tn.isEmpty()?At:Tn,Jt){var Wn=(0,P0.Z)(Tn,{isOAS3:Jt}).schema;Ze=Wn?Wn.get("enum"):void 0}else Ze=Tn?Tn.get("enum"):void 0;var Hn,sr=Tn?Tn.get("value"):void 0;void 0!==sr?Hn=sr:At.get("required")&&Ze&&Ze.size&&(Hn=Ze.first()),void 0!==Hn&&Hn!==sr&&this.onChangeWrapper((0,On.D$)(Hn)),this.setDefaultValue()}},{key:"getParamKey",value:function(){var ze,Ze=this.props.param;return Ze?(0,o.default)(ze="".concat(Ze.get("name"),"-")).call(ze,Ze.get("in")):null}},{key:"render",value:function(){var ze,Ze,qe,Ot,At=this.props,Jt=At.param,Tn=At.rawParam,Wn=At.getComponent,Hn=At.getConfigs,sr=At.isExecute,hi=At.fn,li=At.onChangeConsumes,wi=At.specSelectors,Pi=At.pathMethod,co=At.specPath,Xi=At.oas3Selectors,eo=wi.isOAS3(),Ms=Hn(),Fs=Ms.showExtensions,ta=Ms.showCommonExtensions;if(Jt||(Jt=Tn),!Tn)return null;var xs,Rs,ks,Os,Ba=Wn("JsonSchemaForm"),Ws=Wn("ParamBody"),ba=Jt.get("in"),rs="body"!==ba?null:Y.default.createElement(Ws,{getComponent:Wn,getConfigs:Hn,fn:hi,param:Jt,consumes:wi.consumesOptionsFor(Pi),consumesValue:wi.contentTypeValues(Pi).get("requestContentType"),onChange:this.onChangeWrapper,onChangeConsumes:li,isExecute:sr,specSelectors:wi,pathMethod:Pi}),na=Wn("modelExample"),gl=Wn("Markdown",!0),td=Wn("ParameterExt"),cf=Wn("ParameterIncludeEmpty"),df=Wn("ExamplesSelectValueRetainer"),Gf=Wn("Example"),Zl=(0,P0.Z)(Jt,{isOAS3:eo}).schema,nd=wi.parameterWithMetaByIdentity(Pi,Tn)||(0,ft.Map)(),sc=Zl?Zl.get("format"):null,mp=Zl?Zl.get("type"):null,lp=Zl?Zl.getIn(["items","type"]):null,k_="formData"===ba,Yd="FormData"in In.Z,ac=Jt.get("required"),jd=nd?nd.get("value"):"",ff=ta?(0,On.po)(Zl):null,pf=Fs?(0,On.nX)(Jt):null,Yh=!1;return void 0!==Jt&&Zl&&(xs=Zl.get("items")),void 0!==xs?(Rs=xs.get("enum"),ks=xs.get("default")):Zl&&(Rs=Zl.get("enum")),Rs&&Rs.size&&Rs.size>0&&(Yh=!0),void 0!==Jt&&(Zl&&(ks=Zl.get("default")),void 0===ks&&(ks=Jt.get("default")),void 0===(Os=Jt.get("example"))&&(Os=Jt.get("x-example"))),Y.default.createElement("tr",{"data-param-name":Jt.get("name"),"data-param-in":Jt.get("in")},Y.default.createElement("td",{className:"parameters-col_name"},Y.default.createElement("div",{className:ac?"parameter__name required":"parameter__name"},Jt.get("name"),ac?Y.default.createElement("span",null,"\xa0*"):null),Y.default.createElement("div",{className:"parameter__type"},mp,lp&&"[".concat(lp,"]"),sc&&Y.default.createElement("span",{className:"prop-format"},"($",sc,")")),Y.default.createElement("div",{className:"parameter__deprecated"},eo&&Jt.get("deprecated")?"deprecated":null),Y.default.createElement("div",{className:"parameter__in"},"(",Jt.get("in"),")"),ta&&ff.size?(0,Ae.default)(ze=ff.entrySeq()).call(ze,function(Id){var Ld,Mf=(0,Ha.default)(Id,2),jh=Mf[0],jg=Mf[1];return Y.default.createElement(td,{key:(0,o.default)(Ld="".concat(jh,"-")).call(Ld,jg),xKey:jh,xVal:jg})}):null,Fs&&pf.size?(0,Ae.default)(Ze=pf.entrySeq()).call(Ze,function(Id){var Ld,Mf=(0,Ha.default)(Id,2),jh=Mf[0],jg=Mf[1];return Y.default.createElement(td,{key:(0,o.default)(Ld="".concat(jh,"-")).call(Ld,jg),xKey:jh,xVal:jg})}):null),Y.default.createElement("td",{className:"parameters-col_description"},Jt.get("description")?Y.default.createElement(gl,{source:Jt.get("description")}):null,!rs&&sr||!Yh?null:Y.default.createElement(gl,{className:"parameter__enum",source:"<i>Available values</i> : "+(0,Ae.default)(Rs).call(Rs,function(Id){return Id}).toArray().join(", ")}),!rs&&sr||void 0===ks?null:Y.default.createElement(gl,{className:"parameter__default",source:"<i>Default value</i> : "+ks}),!rs&&sr||void 0===Os?null:Y.default.createElement(gl,{source:"<i>Example</i> : "+Os}),k_&&!Yd&&Y.default.createElement("div",null,"Error: your browser does not support FormData"),eo&&Jt.get("examples")?Y.default.createElement("section",{className:"parameter-controls"},Y.default.createElement(df,{examples:Jt.get("examples"),onSelect:this._onExampleSelect,updateValue:this.onChangeWrapper,getComponent:Wn,defaultToFirstExample:!0,currentKey:Xi.activeExamplesMember.apply(Xi,(0,o.default)(qe=(0,Pd.default)(Pi)).call(qe,["parameters",this.getParamKey()])),currentUserInputValue:jd})):null,rs?null:Y.default.createElement(Ba,{fn:hi,getComponent:Wn,value:jd,required:ac,disabled:!sr,description:Jt.get("name"),onChange:this.onChangeWrapper,errors:nd.get("errors"),schema:Zl}),rs&&Zl?Y.default.createElement(na,{getComponent:Wn,specPath:co.push("schema"),getConfigs:Hn,isExecute:sr,specSelectors:wi,schema:Zl,example:rs,includeWriteOnly:!0}):null,!rs&&sr&&Jt.get("allowEmptyValue")?Y.default.createElement(cf,{onChange:this.onChangeIncludeEmpty,isIncluded:wi.parameterInclusionSettingFor(Pi,Jt.get("name"),Jt.get("in")),isDisabled:!(0,On.O2)(jd)}):null,eo&&Jt.get("examples")?Y.default.createElement(Gf,{example:Jt.getIn(["examples",Xi.activeExamplesMember.apply(Xi,(0,o.default)(Ot=(0,Pd.default)(Pi)).call(Ot,["parameters",this.getParamKey()]))]),getComponent:Wn,getConfigs:Hn}):null))}}]),ut}(Y.Component),xC=xo(6235),RC=function(bn){(0,uo.default)(ut,bn);var qt=(0,bo.default)(ut);function ut(){var ze,Ze;(0,re.default)(this,ut);for(var qe=arguments.length,Ot=new Array(qe),At=0;At<qe;At++)Ot[At]=arguments[At];return Ze=qt.call.apply(qt,(0,o.default)(ze=[this]).call(ze,Ot)),(0,X.default)((0,Ri.default)(Ze),"handleValidateParameters",function(){var Jt=Ze.props,Tn=Jt.specSelectors,Hn=Jt.path,sr=Jt.method;return Jt.specActions.validateParams([Hn,sr]),Tn.validateBeforeExecute([Hn,sr])}),(0,X.default)((0,Ri.default)(Ze),"handleValidateRequestBody",function(){var Jt=Ze.props,Tn=Jt.path,Wn=Jt.method,Hn=Jt.specSelectors,sr=Jt.oas3Selectors,hi=Jt.oas3Actions,li={missingBodyValue:!1,missingRequiredKeys:[]};hi.clearRequestBodyValidateError({path:Tn,method:Wn});var wi=Hn.getOAS3RequiredRequestBodyContentType([Tn,Wn]),Pi=sr.requestBodyValue(Tn,Wn),co=sr.validateBeforeExecute([Tn,Wn]),Xi=sr.requestContentType(Tn,Wn);if(!co)return li.missingBodyValue=!0,hi.setRequestBodyValidateError({path:Tn,method:Wn,validationErrors:li}),!1;if(!wi)return!0;var eo=sr.validateShallowRequired({oas3RequiredRequestBodyContentType:wi,oas3RequestContentType:Xi,oas3RequestBodyValue:Pi});return!eo||eo.length<1||((0,mu.default)(eo).call(eo,function(Ms){li.missingRequiredKeys.push(Ms)}),hi.setRequestBodyValidateError({path:Tn,method:Wn,validationErrors:li}),!1)}),(0,X.default)((0,Ri.default)(Ze),"handleValidationResultPass",function(){var Jt=Ze.props,Tn=Jt.specActions,Wn=Jt.operation,Hn=Jt.path,sr=Jt.method;Ze.props.onExecute&&Ze.props.onExecute(),Tn.execute({operation:Wn,path:Hn,method:sr})}),(0,X.default)((0,Ri.default)(Ze),"handleValidationResultFail",function(){var Jt=Ze.props,Tn=Jt.specActions,Wn=Jt.path,Hn=Jt.method;Tn.clearValidateParams([Wn,Hn]),(0,xC.default)(function(){Tn.validateParams([Wn,Hn])},40)}),(0,X.default)((0,Ri.default)(Ze),"handleValidationResult",function(Jt){Jt?Ze.handleValidationResultPass():Ze.handleValidationResultFail()}),(0,X.default)((0,Ri.default)(Ze),"onClick",function(){var Jt=Ze.handleValidateParameters(),Tn=Ze.handleValidateRequestBody();Ze.handleValidationResult(Jt&&Tn)}),(0,X.default)((0,Ri.default)(Ze),"onChangeProducesWrapper",function(Jt){return Ze.props.specActions.changeProducesValue([Ze.props.path,Ze.props.method],Jt)}),Ze}return(0,oe.default)(ut,[{key:"render",value:function(){return Y.default.createElement("button",{className:"btn execute opblock-control__btn",onClick:this.onClick,disabled:this.props.disabled},"Execute")}}]),ut}(Y.Component),Ja=function(bn){(0,uo.default)(ut,bn);var qt=(0,bo.default)(ut);function ut(){return(0,re.default)(this,ut),qt.apply(this,arguments)}return(0,oe.default)(ut,[{key:"render",value:function(){var ze,Ze=this.props,qe=Ze.headers,Ot=Ze.getComponent,At=Ot("Property"),Jt=Ot("Markdown",!0);return qe&&qe.size?Y.default.createElement("div",{className:"headers-wrapper"},Y.default.createElement("h4",{className:"headers__title"},"Headers:"),Y.default.createElement("table",{className:"headers"},Y.default.createElement("thead",null,Y.default.createElement("tr",{className:"header-row"},Y.default.createElement("th",{className:"header-col"},"Name"),Y.default.createElement("th",{className:"header-col"},"Description"),Y.default.createElement("th",{className:"header-col"},"Type"))),Y.default.createElement("tbody",null,(0,Ae.default)(ze=qe.entrySeq()).call(ze,function(Tn){var Wn=(0,Ha.default)(Tn,2),Hn=Wn[0],sr=Wn[1];if(!ft.default.Map.isMap(sr))return null;var hi=sr.get("description"),li=sr.getIn(["schema"])?sr.getIn(["schema","type"]):sr.getIn(["type"]),wi=sr.getIn(["schema","example"]);return Y.default.createElement("tr",{key:Hn},Y.default.createElement("td",{className:"header-col"},Hn),Y.default.createElement("td",{className:"header-col"},hi?Y.default.createElement(Jt,{source:hi}):null),Y.default.createElement("td",{className:"header-col"},li," ",wi?Y.default.createElement(At,{propKey:"Example",propVal:wi,propClass:"header-example"}):null))}).toArray()))):null}}]),ut}(Y.default.Component),Du=function(bn){(0,uo.default)(ut,bn);var qt=(0,bo.default)(ut);function ut(){return(0,re.default)(this,ut),qt.apply(this,arguments)}return(0,oe.default)(ut,[{key:"render",value:function(){var ze=this.props,Ze=ze.editorActions,qe=ze.errSelectors,Ot=ze.layoutSelectors,At=ze.layoutActions,Jt=(0,ze.getComponent)("Collapse");if(Ze&&Ze.jumpToLine)var Tn=Ze.jumpToLine;var Wn=qe.allErrors(),Hn=(0,_.default)(Wn).call(Wn,function(li){return"thrown"===li.get("type")||"error"===li.get("level")});if(!Hn||Hn.count()<1)return null;var sr=Ot.isShown(["errorPane"],!0),hi=Hn.sortBy(function(li){return li.get("line")});return Y.default.createElement("pre",{className:"errors-wrapper"},Y.default.createElement("hgroup",{className:"error"},Y.default.createElement("h4",{className:"errors__title"},"Errors"),Y.default.createElement("button",{className:"btn errors__clear-btn",onClick:function(){return At.show(["errorPane"],!sr)}},sr?"Hide":"Show")),Y.default.createElement(Jt,{isOpened:sr,animated:!0},Y.default.createElement("div",{className:"errors"},(0,Ae.default)(hi).call(hi,function(li,wi){var Pi=li.get("type");return"thrown"===Pi||"auth"===Pi?Y.default.createElement(ed,{key:wi,error:li.get("error")||li,jumpToLine:Tn}):"spec"===Pi?Y.default.createElement(Xv,{key:wi,error:li,jumpToLine:Tn}):void 0}))))}}]),ut}(Y.default.Component),ed=function(bn){var qt=bn.error,ut=bn.jumpToLine;if(!qt)return null;var ze=qt.get("line");return Y.default.createElement("div",{className:"error-wrapper"},qt?Y.default.createElement("div",null,Y.default.createElement("h4",null,qt.get("source")&&qt.get("level")?nv(qt.get("source"))+" "+qt.get("level"):"",qt.get("path")?Y.default.createElement("small",null," at ",qt.get("path")):null),Y.default.createElement("span",{className:"message thrown"},qt.get("message")),Y.default.createElement("div",{className:"error-line"},ze&&ut?Y.default.createElement("a",{onClick:(0,fe.default)(ut).call(ut,null,ze)},"Jump to line ",ze):null)):null)},Xv=function(bn){var qt=bn.error,ut=bn.jumpToLine,ze=null;return qt.get("path")?ze=ft.List.isList(qt.get("path"))?Y.default.createElement("small",null,"at ",qt.get("path").join(".")):Y.default.createElement("small",null,"at ",qt.get("path")):qt.get("line")&&!ut&&(ze=Y.default.createElement("small",null,"on line ",qt.get("line"))),Y.default.createElement("div",{className:"error-wrapper"},qt?Y.default.createElement("div",null,Y.default.createElement("h4",null,nv(qt.get("source"))+" "+qt.get("level"),"\xa0",ze),Y.default.createElement("span",{className:"message"},qt.get("message")),Y.default.createElement("div",{className:"error-line"},ut?Y.default.createElement("a",{onClick:(0,fe.default)(ut).call(ut,null,qt.get("line"))},"Jump to line ",qt.get("line")):null)):null)};function nv(bn){var qt;return(0,Ae.default)(qt=(bn||"").split(" ")).call(qt,function(ut){return ut[0].toUpperCase()+(0,Pe.default)(ut).call(ut,1)}).join(" ")}ed.defaultProps={jumpToLine:null};var qv=function(bn){(0,uo.default)(ut,bn);var qt=(0,bo.default)(ut);function ut(){var ze,Ze;(0,re.default)(this,ut);for(var qe=arguments.length,Ot=new Array(qe),At=0;At<qe;At++)Ot[At]=arguments[At];return Ze=qt.call.apply(qt,(0,o.default)(ze=[this]).call(ze,Ot)),(0,X.default)((0,Ri.default)(Ze),"onChangeWrapper",function(Jt){return Ze.props.onChange(Jt.target.value)}),Ze}return(0,oe.default)(ut,[{key:"componentDidMount",value:function(){this.props.contentTypes&&this.props.onChange(this.props.contentTypes.first())}},{key:"UNSAFE_componentWillReceiveProps",value:function(ze){var Ze;ze.contentTypes&&ze.contentTypes.size&&((0,Vl.default)(Ze=ze.contentTypes).call(Ze,ze.value)||ze.onChange(ze.contentTypes.first()))}},{key:"render",value:function(){var ze=this.props,At=ze.contentTypes;return At&&At.size?Y.default.createElement("div",{className:"content-type-wrapper "+(ze.className||"")},Y.default.createElement("select",{"aria-controls":ze.ariaControls,"aria-label":ze.ariaLabel,className:"content-type",id:ze.controlId,onChange:this.onChangeWrapper,value:ze.value||""},(0,Ae.default)(At).call(At,function(Wn){return Y.default.createElement("option",{key:Wn,value:Wn},Wn)}).toArray())):null}}]),ut}(Y.default.Component);(0,X.default)(qv,"defaultProps",{onChange:function(){},value:null,contentTypes:(0,ft.fromJS)(["application/json"])});var kp=xo(863),rv=xo(302),l9=xo(5942),u9=["fullscreen","full"],c9=["hide","keepContents","mobile","tablet","desktop","large"];function qE(){for(var bn,qt=arguments.length,ut=new Array(qt),ze=0;ze<qt;ze++)ut[ze]=arguments[ze];return(0,l9.default)(bn=(0,_.default)(ut).call(ut,function(Ze){return!!Ze}).join(" ")).call(bn)}var d9=function(bn){(0,uo.default)(ut,bn);var qt=(0,bo.default)(ut);function ut(){return(0,re.default)(this,ut),qt.apply(this,arguments)}return(0,oe.default)(ut,[{key:"render",value:function(){var ze=this.props,Ze=ze.fullscreen,qe=ze.full,Ot=(0,rv.default)(ze,u9);return Y.default.createElement("section",Ze?Ot:(0,kp.default)({},Ot,{className:qE(Ot.className,"swagger-container"+(qe?"-full":""))}))}}]),ut}(Y.default.Component),BA={mobile:"",tablet:"-tablet",desktop:"-desktop",large:"-hd"},f9=function(bn){(0,uo.default)(ut,bn);var qt=(0,bo.default)(ut);function ut(){return(0,re.default)(this,ut),qt.apply(this,arguments)}return(0,oe.default)(ut,[{key:"render",value:function(){var ze,Ze=this.props,qe=Ze.hide,Ot=Ze.keepContents,At=(0,rv.default)(Ze,c9);if(qe&&!Ot)return Y.default.createElement("span",null);var Jt=[];for(var Tn in BA)if(Object.prototype.hasOwnProperty.call(BA,Tn)){var Wn=BA[Tn];if(Tn in this.props){var Hn=this.props[Tn];if(Hn<1){Jt.push("none"+Wn);continue}Jt.push("block"+Wn),Jt.push("col-"+Hn+Wn)}}qe&&Jt.push("hidden");var sr=qE.apply(void 0,(0,o.default)(ze=[At.className]).call(ze,Jt));return Y.default.createElement("section",(0,kp.default)({},At,{className:sr}))}}]),ut}(Y.default.Component),p9=function(bn){(0,uo.default)(ut,bn);var qt=(0,bo.default)(ut);function ut(){return(0,re.default)(this,ut),qt.apply(this,arguments)}return(0,oe.default)(ut,[{key:"render",value:function(){return Y.default.createElement("div",(0,kp.default)({},this.props,{className:qE(this.props.className,"wrapper")}))}}]),ut}(Y.default.Component),o3=function(bn){(0,uo.default)(ut,bn);var qt=(0,bo.default)(ut);function ut(){return(0,re.default)(this,ut),qt.apply(this,arguments)}return(0,oe.default)(ut,[{key:"render",value:function(){return Y.default.createElement("button",(0,kp.default)({},this.props,{className:qE(this.props.className,"button")}))}}]),ut}(Y.default.Component);(0,X.default)(o3,"defaultProps",{className:""});var h9=function(bn){return Y.default.createElement("textarea",bn)},_9=function(bn){return Y.default.createElement("input",bn)},s3=function(bn){(0,uo.default)(ut,bn);var qt=(0,bo.default)(ut);function ut(ze,Ze){var qe;return(0,re.default)(this,ut),qe=qt.call(this,ze,Ze),(0,X.default)((0,Ri.default)(qe),"onChange",function(At){var Jt,Tn,Wn=qe.props,Hn=Wn.onChange,sr=Wn.multiple,hi=(0,Pe.default)([]).call(At.target.options);Jt=sr?(0,Ae.default)(Tn=(0,_.default)(hi).call(hi,function(li){return li.selected})).call(Tn,function(li){return li.value}):At.target.value,qe.setState({value:Jt}),Hn&&Hn(Jt)}),qe.state={value:ze.value?ze.value:ze.multiple?[""]:""},qe}return(0,oe.default)(ut,[{key:"UNSAFE_componentWillReceiveProps",value:function(ze){ze.value!==this.props.value&&this.setState({value:ze.value})}},{key:"render",value:function(){var ze,Ze,qe=this.props,Ot=qe.allowedValues,At=qe.multiple,Jt=qe.allowEmptyValue,Tn=qe.disabled,Wn=(null===(ze=this.state.value)||void 0===ze||null===(Ze=ze.toJS)||void 0===Ze?void 0:Ze.call(ze))||this.state.value;return Y.default.createElement("select",{className:this.props.className,multiple:At,value:Wn,onChange:this.onChange,disabled:Tn},Jt?Y.default.createElement("option",{value:""},"--"):null,(0,Ae.default)(Ot).call(Ot,function(Hn,sr){return Y.default.createElement("option",{key:sr,value:String(Hn)},String(Hn))}))}}]),ut}(Y.default.Component);(0,X.default)(s3,"defaultProps",{multiple:!1,allowEmptyValue:!0});var a3=function(bn){(0,uo.default)(ut,bn);var qt=(0,bo.default)(ut);function ut(){return(0,re.default)(this,ut),qt.apply(this,arguments)}return(0,oe.default)(ut,[{key:"render",value:function(){return Y.default.createElement("a",(0,kp.default)({},this.props,{rel:"noopener noreferrer",className:qE(this.props.className,"link")}))}}]),ut}(Y.default.Component),l3=function(bn){return Y.default.createElement("div",{className:"no-margin"}," ",bn.children," ")},u3=function(bn){(0,uo.default)(ut,bn);var qt=(0,bo.default)(ut);function ut(){return(0,re.default)(this,ut),qt.apply(this,arguments)}return(0,oe.default)(ut,[{key:"renderNotAnimated",value:function(){return this.props.isOpened?Y.default.createElement(l3,null,this.props.children):Y.default.createElement("noscript",null)}},{key:"render",value:function(){var ze=this.props,Ot=ze.children;return ze.animated?Y.default.createElement(l3,null,Ot=ze.isOpened?Ot:null):this.renderNotAnimated()}}]),ut}(Y.default.Component);(0,X.default)(u3,"defaultProps",{isOpened:!1,animated:!1});var g9=function(bn){(0,uo.default)(ut,bn);var qt=(0,bo.default)(ut);function ut(){var ze,Ze,qe;(0,re.default)(this,ut);for(var Ot=arguments.length,At=new Array(Ot),Jt=0;Jt<Ot;Jt++)At[Jt]=arguments[Jt];return(qe=qt.call.apply(qt,(0,o.default)(ze=[this]).call(ze,At))).setTagShown=(0,fe.default)(Ze=qe._setTagShown).call(Ze,(0,Ri.default)(qe)),qe}return(0,oe.default)(ut,[{key:"_setTagShown",value:function(ze,Ze){this.props.layoutActions.show(ze,Ze)}},{key:"showOp",value:function(ze,Ze){this.props.layoutActions.show(ze,Ze)}},{key:"render",value:function(){var ze=this.props,qe=ze.layoutSelectors,Ot=ze.layoutActions,At=ze.getComponent,Jt=ze.specSelectors.taggedOperations(),Tn=At("Collapse");return Y.default.createElement("div",null,Y.default.createElement("h4",{className:"overview-title"},"Overview"),(0,Ae.default)(Jt).call(Jt,function(Wn,Hn){var sr=Wn.get("operations"),hi=["overview-tags",Hn],li=qe.isShown(hi,!0);return Y.default.createElement("div",{key:"overview-"+Hn},Y.default.createElement("h4",{onClick:function(){return Ot.show(hi,!li)},className:"link overview-tag"}," ",li?"-":"+",Hn),Y.default.createElement(Tn,{isOpened:li,animated:!0},(0,Ae.default)(sr).call(sr,function(wi){var Pi=wi.toObject(),co=Pi.path,Xi=Pi.method,eo=Pi.id,Ms="operations",Fs=eo,ta=qe.isShown([Ms,Fs]);return Y.default.createElement(m9,{key:eo,path:co,method:Xi,id:co+"-"+Xi,shown:ta,showOpId:Fs,showOpIdPrefix:Ms,href:"#operation-".concat(Fs),onClick:Ot.show})}).toArray()))}).toArray(),Jt.size<1&&Y.default.createElement("h3",null," No operations defined in spec! "))}}]),ut}(Y.default.Component),m9=function(bn){(0,uo.default)(ut,bn);var qt=(0,bo.default)(ut);function ut(ze){var Ze,qe;return(0,re.default)(this,ut),(qe=qt.call(this,ze)).onClick=(0,fe.default)(Ze=qe._onClick).call(Ze,(0,Ri.default)(qe)),qe}return(0,oe.default)(ut,[{key:"_onClick",value:function(){var ze=this.props;(0,ze.onClick)([ze.showOpIdPrefix,ze.showOpId],!ze.shown)}},{key:"render",value:function(){var ze=this.props,Ze=ze.id,qe=ze.method;return Y.default.createElement(a3,{href:ze.href,onClick:this.onClick,className:"block opblock-link ".concat(ze.shown?"shown":"")},Y.default.createElement("div",null,Y.default.createElement("small",{className:"bold-label-".concat(qe)},qe.toUpperCase()),Y.default.createElement("span",{className:"bold-label"},Ze)))}}]),ut}(Y.default.Component),v9=["value","defaultValue","initialValue"],y9=function(bn){(0,uo.default)(ut,bn);var qt=(0,bo.default)(ut);function ut(){return(0,re.default)(this,ut),qt.apply(this,arguments)}return(0,oe.default)(ut,[{key:"componentDidMount",value:function(){this.props.initialValue&&(this.inputRef.value=this.props.initialValue)}},{key:"render",value:function(){var ze=this,qe=(0,rv.default)(this.props,v9);return Y.default.createElement("input",(0,kp.default)({},qe,{ref:function(Ot){return ze.inputRef=Ot}}))}}]),ut}(Y.default.Component),E9=function(bn){(0,uo.default)(ut,bn);var qt=(0,bo.default)(ut);function ut(){return(0,re.default)(this,ut),qt.apply(this,arguments)}return(0,oe.default)(ut,[{key:"render",value:function(){var ze=this.props;return Y.default.createElement("pre",{className:"base-url"},"[ Base URL: ",ze.host,ze.basePath," ]")}}]),ut}(Y.default.Component),b9=function(bn){(0,uo.default)(ut,bn);var qt=(0,bo.default)(ut);function ut(){return(0,re.default)(this,ut),qt.apply(this,arguments)}return(0,oe.default)(ut,[{key:"render",value:function(){var ze=this.props,Ze=ze.data,qe=ze.getComponent,Ot=ze.selectedServer,At=ze.url,Jt=Ze.get("name")||"the developer",Tn=ki(Ze.get("url"),At,{selectedServer:Ot}),Wn=Ze.get("email"),Hn=qe("Link");return Y.default.createElement("div",{className:"info__contact"},Tn&&Y.default.createElement("div",null,Y.default.createElement(Hn,{href:(0,On.Nm)(Tn),target:"_blank"},Jt," - Website")),Wn&&Y.default.createElement(Hn,{href:(0,On.Nm)("mailto:".concat(Wn))},Tn?"Send email to ".concat(Jt):"Contact ".concat(Jt)))}}]),ut}(Y.default.Component),S9=function(bn){(0,uo.default)(ut,bn);var qt=(0,bo.default)(ut);function ut(){return(0,re.default)(this,ut),qt.apply(this,arguments)}return(0,oe.default)(ut,[{key:"render",value:function(){var ze=this.props,Ze=ze.license,Ot=ze.selectedServer,At=ze.url,Jt=(0,ze.getComponent)("Link"),Tn=Ze.get("name")||"License",Wn=ki(Ze.get("url"),At,{selectedServer:Ot});return Y.default.createElement("div",{className:"info__license"},Wn?Y.default.createElement(Jt,{target:"_blank",href:(0,On.Nm)(Wn)},Tn):Y.default.createElement("span",null,Tn))}}]),ut}(Y.default.Component),T9=function(bn){(0,uo.default)(ut,bn);var qt=(0,bo.default)(ut);function ut(){return(0,re.default)(this,ut),qt.apply(this,arguments)}return(0,oe.default)(ut,[{key:"render",value:function(){var ze=this.props,Ze=ze.url,qe=(0,ze.getComponent)("Link");return Y.default.createElement(qe,{target:"_blank",href:(0,On.Nm)(Ze)},Y.default.createElement("span",{className:"url"}," ",Ze))}}]),ut}(Y.default.PureComponent),C9=function(bn){(0,uo.default)(ut,bn);var qt=(0,bo.default)(ut);function ut(){return(0,re.default)(this,ut),qt.apply(this,arguments)}return(0,oe.default)(ut,[{key:"render",value:function(){var ze=this.props,Ze=ze.info,qe=ze.url,Ot=ze.host,At=ze.basePath,Jt=ze.getComponent,Tn=ze.externalDocs,Wn=ze.selectedServer,Hn=ze.url,sr=Ze.get("version"),hi=Ze.get("description"),li=Ze.get("title"),wi=ki(Ze.get("termsOfService"),Hn,{selectedServer:Wn}),Pi=Ze.get("contact"),co=Ze.get("license"),Xi=ki(Tn&&Tn.get("url"),Hn,{selectedServer:Wn}),eo=Tn&&Tn.get("description"),Ms=Jt("Markdown",!0),Fs=Jt("Link"),ta=Jt("VersionStamp"),xs=Jt("InfoUrl"),Rs=Jt("InfoBasePath");return Y.default.createElement("div",{className:"info"},Y.default.createElement("hgroup",{className:"main"},Y.default.createElement("h2",{className:"title"},li,sr&&Y.default.createElement(ta,{version:sr})),Ot||At?Y.default.createElement(Rs,{host:Ot,basePath:At}):null,qe&&Y.default.createElement(xs,{getComponent:Jt,url:qe})),Y.default.createElement("div",{className:"description"},Y.default.createElement(Ms,{source:hi})),wi&&Y.default.createElement("div",{className:"info__tos"},Y.default.createElement(Fs,{target:"_blank",href:(0,On.Nm)(wi)},"Terms of service")),Pi&&Pi.size?Y.default.createElement(b9,{getComponent:Jt,data:Pi,selectedServer:Wn,url:qe}):null,co&&co.size?Y.default.createElement(S9,{getComponent:Jt,license:co,selectedServer:Wn,url:qe}):null,Xi?Y.default.createElement(Fs,{className:"info__extdocs",target:"_blank",href:(0,On.Nm)(Xi)},eo||Xi):null)}}]),ut}(Y.default.Component),M9=function(bn){(0,uo.default)(ut,bn);var qt=(0,bo.default)(ut);function ut(){return(0,re.default)(this,ut),qt.apply(this,arguments)}return(0,oe.default)(ut,[{key:"render",value:function(){var ze=this.props,Ze=ze.specSelectors,qe=ze.getComponent,Ot=ze.oas3Selectors,At=Ze.info(),Jt=Ze.url(),Tn=Ze.basePath(),Wn=Ze.host(),Hn=Ze.externalDocs(),sr=Ot.selectedServer(),hi=qe("info");return Y.default.createElement("div",null,At&&At.count()?Y.default.createElement(hi,{info:At,url:Jt,host:Wn,basePath:Tn,externalDocs:Hn,getComponent:qe,selectedServer:sr}):null)}}]),ut}(Y.default.Component),O9=function(bn){(0,uo.default)(ut,bn);var qt=(0,bo.default)(ut);function ut(){return(0,re.default)(this,ut),qt.apply(this,arguments)}return(0,oe.default)(ut,[{key:"render",value:function(){return null}}]),ut}(Y.default.Component),A9=function(bn){(0,uo.default)(ut,bn);var qt=(0,bo.default)(ut);function ut(){return(0,re.default)(this,ut),qt.apply(this,arguments)}return(0,oe.default)(ut,[{key:"render",value:function(){return Y.default.createElement("div",{className:"footer"})}}]),ut}(Y.default.Component),D9=function(bn){(0,uo.default)(ut,bn);var qt=(0,bo.default)(ut);function ut(){var ze,Ze;(0,re.default)(this,ut);for(var qe=arguments.length,Ot=new Array(qe),At=0;At<qe;At++)Ot[At]=arguments[At];return Ze=qt.call.apply(qt,(0,o.default)(ze=[this]).call(ze,Ot)),(0,X.default)((0,Ri.default)(Ze),"onFilterChange",function(Jt){Ze.props.layoutActions.updateFilter(Jt.target.value)}),Ze}return(0,oe.default)(ut,[{key:"render",value:function(){var ze=this.props,Ze=ze.specSelectors,qe=ze.layoutSelectors,Ot=(0,ze.getComponent)("Col"),At="loading"===Ze.loadingStatus(),Jt="failed"===Ze.loadingStatus(),Tn=qe.currentFilter(),Wn=["operation-filter-input"];return Jt&&Wn.push("failed"),At&&Wn.push("loading"),Y.default.createElement("div",null,null===Tn||!1===Tn||"false"===Tn?null:Y.default.createElement("div",{className:"filter-container"},Y.default.createElement(Ot,{className:"filter wrapper",mobile:12},Y.default.createElement("input",{className:Wn.join(" "),placeholder:"Filter by tag",type:"text",onChange:this.onFilterChange,value:!0===Tn||"true"===Tn?"":Tn,disabled:At}))))}}]),ut}(Y.default.Component),UA=Function.prototype,c3=function(bn){(0,uo.default)(ut,bn);var qt=(0,bo.default)(ut);function ut(ze,Ze){var qe;return(0,re.default)(this,ut),qe=qt.call(this,ze,Ze),(0,X.default)((0,Ri.default)(qe),"updateValues",function(Ot){var At=Ot.param,Jt=Ot.isExecute,Tn=Ot.consumesValue,Wn=void 0===Tn?"":Tn,Hn=/xml/i.test(Wn),sr=/json/i.test(Wn),hi=At.get(Hn?"value_xml":"value");if(void 0!==hi){var li=!hi&&sr?"{}":hi;qe.setState({value:li}),qe.onChange(li,{isXml:Hn,isEditBox:Jt})}else Hn?qe.onChange(qe.sample("xml"),{isXml:Hn,isEditBox:Jt}):qe.onChange(qe.sample(),{isEditBox:Jt})}),(0,X.default)((0,Ri.default)(qe),"sample",function(Ot){var At=qe.props,Tn=(0,At.fn.inferSchema)(At.param.toJS());return(0,On.xi)(Tn,Ot,{includeWriteOnly:!0})}),(0,X.default)((0,Ri.default)(qe),"onChange",function(Ot,At){var Tn=At.isXml;qe.setState({value:Ot,isEditBox:At.isEditBox}),qe._onChange(Ot,Tn)}),(0,X.default)((0,Ri.default)(qe),"_onChange",function(Ot,At){(qe.props.onChange||UA)(Ot,At)}),(0,X.default)((0,Ri.default)(qe),"handleOnChange",function(Ot){var Jt=/xml/i.test(qe.props.consumesValue);qe.onChange(Ot.target.value,{isXml:Jt,isEditBox:qe.state.isEditBox})}),(0,X.default)((0,Ri.default)(qe),"toggleIsEditBox",function(){return qe.setState(function(Ot){return{isEditBox:!Ot.isEditBox}})}),qe.state={isEditBox:!1,value:""},qe}return(0,oe.default)(ut,[{key:"componentDidMount",value:function(){this.updateValues.call(this,this.props)}},{key:"UNSAFE_componentWillReceiveProps",value:function(ze){this.updateValues.call(this,ze)}},{key:"render",value:function(){var ze=this.props,Ze=ze.onChangeConsumes,qe=ze.param,Ot=ze.isExecute,At=ze.specSelectors,Jt=ze.pathMethod,Tn=ze.getConfigs,Wn=ze.getComponent,Hn=Wn("Button"),sr=Wn("TextArea"),hi=Wn("highlightCode"),li=Wn("contentType"),wi=(At?At.parameterWithMetaByIdentity(Jt,qe):qe).get("errors",(0,ft.List)()),Pi=At.contentTypeValues(Jt).get("requestContentType"),co=this.props.consumes&&this.props.consumes.size?this.props.consumes:ut.defaultProp.consumes,Xi=this.state,eo=Xi.value,Ms=Xi.isEditBox,Fs=null;return(0,_g.O)(eo)&&(Fs="json"),Y.default.createElement("div",{className:"body-param","data-param-name":qe.get("name"),"data-param-in":qe.get("in")},Ms&&Ot?Y.default.createElement(sr,{className:"body-param__text"+(wi.count()?" invalid":""),value:eo,onChange:this.handleOnChange}):eo&&Y.default.createElement(hi,{className:"body-param__example",language:Fs,getConfigs:Tn,value:eo}),Y.default.createElement("div",{className:"body-param-options"},Ot?Y.default.createElement("div",{className:"body-param-edit"},Y.default.createElement(Hn,{className:Ms?"btn cancel body-param__example-edit":"btn edit body-param__example-edit",onClick:this.toggleIsEditBox},Ms?"Cancel":"Edit")):null,Y.default.createElement("label",{htmlFor:""},Y.default.createElement("span",null,"Parameter content type"),Y.default.createElement(li,{value:Pi,contentTypes:co,onChange:Ze,className:"body-param-content-type",ariaLabel:"Parameter content type"}))))}}]),ut}(Y.PureComponent);(0,X.default)(c3,"defaultProp",{consumes:(0,ft.fromJS)(["application/json"]),param:(0,ft.fromJS)({}),onChange:UA,onChangeConsumes:UA});var w9=xo(4624),x9=function(bn){(0,uo.default)(ut,bn);var qt=(0,bo.default)(ut);function ut(){return(0,re.default)(this,ut),qt.apply(this,arguments)}return(0,oe.default)(ut,[{key:"render",value:function(){var ze=this.props,qe=ze.getConfigs,Ot=(0,w9.requestSnippetGenerator_curl_bash)(ze.request),At=qe(),Jt=(0,Yl.default)(At,"syntaxHighlight.activated")?Y.default.createElement(ah.d3,{language:"bash",className:"curl microlight",style:(0,ah.C2)((0,Yl.default)(At,"syntaxHighlight.theme"))},Ot):Y.default.createElement("textarea",{readOnly:!0,className:"curl",value:Ot});return Y.default.createElement("div",{className:"curl-command"},Y.default.createElement("h4",null,"Curl"),Y.default.createElement("div",{className:"copy-to-clipboard"},Y.default.createElement(lh.CopyToClipboard,{text:Ot},Y.default.createElement("button",null))),Y.default.createElement("div",null,Jt))}}]),ut}(Y.default.Component),R9=function(bn){(0,uo.default)(ut,bn);var qt=(0,bo.default)(ut);function ut(){var ze,Ze;(0,re.default)(this,ut);for(var qe=arguments.length,Ot=new Array(qe),At=0;At<qe;At++)Ot[At]=arguments[At];return Ze=qt.call.apply(qt,(0,o.default)(ze=[this]).call(ze,Ot)),(0,X.default)((0,Ri.default)(Ze),"onChange",function(Jt){Ze.setScheme(Jt.target.value)}),(0,X.default)((0,Ri.default)(Ze),"setScheme",function(Jt){var Tn=Ze.props;Tn.specActions.setScheme(Jt,Tn.path,Tn.method)}),Ze}return(0,oe.default)(ut,[{key:"UNSAFE_componentWillMount",value:function(){this.setScheme(this.props.schemes.first())}},{key:"UNSAFE_componentWillReceiveProps",value:function(ze){var Ze;this.props.currentScheme&&(0,Vl.default)(Ze=ze.schemes).call(Ze,this.props.currentScheme)||this.setScheme(ze.schemes.first())}},{key:"render",value:function(){var ze,Ze=this.props,qe=Ze.schemes,Ot=Ze.currentScheme;return Y.default.createElement("label",{htmlFor:"schemes"},Y.default.createElement("span",{className:"schemes-title"},"Schemes"),Y.default.createElement("select",{onChange:this.onChange,value:Ot},(0,Ae.default)(ze=qe.valueSeq()).call(ze,function(At){return Y.default.createElement("option",{value:At,key:At},At)}).toArray()))}}]),ut}(Y.default.Component),N9=function(bn){(0,uo.default)(ut,bn);var qt=(0,bo.default)(ut);function ut(){return(0,re.default)(this,ut),qt.apply(this,arguments)}return(0,oe.default)(ut,[{key:"render",value:function(){var ze=this.props,Ze=ze.specActions,qe=ze.specSelectors,Ot=ze.getComponent,At=qe.operationScheme(),Jt=qe.schemes(),Tn=Ot("schemes");return Jt&&Jt.size?Y.default.createElement(Tn,{currentScheme:At,schemes:Jt,specActions:Ze}):null}}]),ut}(Y.default.Component),d3=function(bn){(0,uo.default)(ut,bn);var qt=(0,bo.default)(ut);function ut(ze,Ze){var qe;(0,re.default)(this,ut),qe=qt.call(this,ze,Ze),(0,X.default)((0,Ri.default)(qe),"toggleCollapsed",function(){qe.props.onToggle&&qe.props.onToggle(qe.props.modelName,!qe.state.expanded),qe.setState({expanded:!qe.state.expanded})}),(0,X.default)((0,Ri.default)(qe),"onLoad",function(Tn){if(Tn&&qe.props.layoutSelectors){var Wn=qe.props.layoutSelectors.getScrollToKey();ft.default.is(Wn,qe.props.specPath)&&qe.toggleCollapsed(),qe.props.layoutActions.readyToScroll(qe.props.specPath,Tn.parentElement)}});var Ot=qe.props;return qe.state={expanded:Ot.expanded,collapsedContent:Ot.collapsedContent||ut.defaultProps.collapsedContent},qe}return(0,oe.default)(ut,[{key:"componentDidMount",value:function(){var ze=this.props,qe=ze.expanded;ze.hideSelfOnExpand&&qe&&this.props.onToggle(ze.modelName,qe)}},{key:"UNSAFE_componentWillReceiveProps",value:function(ze){this.props.expanded!==ze.expanded&&this.setState({expanded:ze.expanded})}},{key:"render",value:function(){var ze=this.props,Ze=ze.title,qe=ze.classes;return this.state.expanded&&this.props.hideSelfOnExpand?Y.default.createElement("span",{className:qe||""},this.props.children):Y.default.createElement("span",{className:qe||"",ref:this.onLoad},Y.default.createElement("button",{"aria-expanded":this.state.expanded,className:"model-box-control",onClick:this.toggleCollapsed},Ze&&Y.default.createElement("span",{className:"pointer"},Ze),Y.default.createElement("span",{className:"model-toggle"+(this.state.expanded?"":" collapsed")}),!this.state.expanded&&Y.default.createElement("span",null,this.state.collapsedContent)),this.state.expanded&&this.props.children)}}]),ut}(Y.Component);(0,X.default)(d3,"defaultProps",{collapsedContent:"{...}",expanded:!1,title:null,onToggle:function(){},hideSelfOnExpand:!1,specPath:ft.default.List([])});var P9=xo(1798),NC=xo.n(P9),I9=function(bn){(0,uo.default)(ut,bn);var qt=(0,bo.default)(ut);function ut(ze,Ze){var qe;(0,re.default)(this,ut),qe=qt.call(this,ze,Ze),(0,X.default)((0,Ri.default)(qe),"activeTab",function(Hn){qe.setState({activeTab:Hn.target.dataset.name})});var Ot=qe.props,Jt=Ot.isExecute,Tn=(0,Ot.getConfigs)().defaultModelRendering,Wn=Tn;return"example"!==Tn&&"model"!==Tn&&(Wn="example"),Jt&&(Wn="example"),qe.state={activeTab:Wn},qe}return(0,oe.default)(ut,[{key:"UNSAFE_componentWillReceiveProps",value:function(ze){ze.isExecute&&!this.props.isExecute&&this.props.example&&this.setState({activeTab:"example"})}},{key:"render",value:function(){var ze=this.props,Ze=ze.getComponent,qe=ze.specSelectors,Ot=ze.schema,At=ze.example,Jt=ze.isExecute,Tn=ze.getConfigs,Wn=ze.specPath,Hn=ze.includeReadOnly,sr=ze.includeWriteOnly,hi=Tn().defaultModelExpandDepth,li=Ze("ModelWrapper"),wi=Ze("highlightCode"),Pi=NC()(5).toString("base64"),co=NC()(5).toString("base64"),Xi=NC()(5).toString("base64"),eo=NC()(5).toString("base64"),Ms=qe.isOAS3();return Y.default.createElement("div",{className:"model-example"},Y.default.createElement("ul",{className:"tab",role:"tablist"},Y.default.createElement("li",{className:(0,jf.default)("tabitem",{active:"example"===this.state.activeTab}),role:"presentation"},Y.default.createElement("button",{"aria-controls":co,"aria-selected":"example"===this.state.activeTab,className:"tablinks","data-name":"example",id:Pi,onClick:this.activeTab,role:"tab"},Jt?"Edit Value":"Example Value")),Ot&&Y.default.createElement("li",{className:(0,jf.default)("tabitem",{active:"model"===this.state.activeTab}),role:"presentation"},Y.default.createElement("button",{"aria-controls":eo,"aria-selected":"model"===this.state.activeTab,className:(0,jf.default)("tablinks",{inactive:Jt}),"data-name":"model",id:Xi,onClick:this.activeTab,role:"tab"},Ms?"Schema":"Model"))),"example"===this.state.activeTab&&Y.default.createElement("div",{"aria-hidden":"example"!==this.state.activeTab,"aria-labelledby":Pi,"data-name":"examplePanel",id:co,role:"tabpanel",tabIndex:"0"},At||Y.default.createElement(wi,{value:"(no example available)",getConfigs:Tn})),"model"===this.state.activeTab&&Y.default.createElement("div",{"aria-hidden":"example"===this.state.activeTab,"aria-labelledby":Xi,"data-name":"modelPanel",id:eo,role:"tabpanel",tabIndex:"0"},Y.default.createElement(li,{schema:Ot,getComponent:Ze,getConfigs:Tn,specSelectors:qe,expandDepth:hi,specPath:Wn,includeReadOnly:Hn,includeWriteOnly:sr})))}}]),ut}(Y.default.Component),L9=function(bn){(0,uo.default)(ut,bn);var qt=(0,bo.default)(ut);function ut(){var ze,Ze;(0,re.default)(this,ut);for(var qe=arguments.length,Ot=new Array(qe),At=0;At<qe;At++)Ot[At]=arguments[At];return Ze=qt.call.apply(qt,(0,o.default)(ze=[this]).call(ze,Ot)),(0,X.default)((0,Ri.default)(Ze),"onToggle",function(Jt,Tn){Ze.props.layoutActions&&Ze.props.layoutActions.show(Ze.props.fullPath,Tn)}),Ze}return(0,oe.default)(ut,[{key:"render",value:function(){var ze,Ze=this.props,Ot=Ze.getConfigs,At=(0,Ze.getComponent)("Model");return this.props.layoutSelectors&&(ze=this.props.layoutSelectors.isShown(this.props.fullPath)),Y.default.createElement("div",{className:"model-box"},Y.default.createElement(At,(0,kp.default)({},this.props,{getConfigs:Ot,expanded:ze,depth:1,onToggle:this.onToggle,expandDepth:this.props.expandDepth||0})))}}]),ut}(Y.Component),F9=xo(1543),k9=function(bn){(0,uo.default)(ut,bn);var qt=(0,bo.default)(ut);function ut(){var ze,Ze;(0,re.default)(this,ut);for(var qe=arguments.length,Ot=new Array(qe),At=0;At<qe;At++)Ot[At]=arguments[At];return Ze=qt.call.apply(qt,(0,o.default)(ze=[this]).call(ze,Ot)),(0,X.default)((0,Ri.default)(Ze),"getSchemaBasePath",function(){return Ze.props.specSelectors.isOAS3()?["components","schemas"]:["definitions"]}),(0,X.default)((0,Ri.default)(Ze),"getCollapsedContent",function(){return" "}),(0,X.default)((0,Ri.default)(Ze),"handleToggle",function(Jt,Tn){var Wn,Hn;Ze.props.layoutActions.show((0,o.default)(Wn=[]).call(Wn,(0,Pd.default)(Ze.getSchemaBasePath()),[Jt]),Tn),Tn&&Ze.props.specActions.requestResolvedSubtree((0,o.default)(Hn=[]).call(Hn,(0,Pd.default)(Ze.getSchemaBasePath()),[Jt]))}),(0,X.default)((0,Ri.default)(Ze),"onLoadModels",function(Jt){Jt&&Ze.props.layoutActions.readyToScroll(Ze.getSchemaBasePath(),Jt)}),(0,X.default)((0,Ri.default)(Ze),"onLoadModel",function(Jt){if(Jt){var Tn,Wn=Jt.getAttribute("data-name");Ze.props.layoutActions.readyToScroll((0,o.default)(Tn=[]).call(Tn,(0,Pd.default)(Ze.getSchemaBasePath()),[Wn]),Jt)}}),Ze}return(0,oe.default)(ut,[{key:"render",value:function(){var ze,Ze=this,qe=this.props,Ot=qe.specSelectors,At=qe.getComponent,Jt=qe.layoutSelectors,Tn=qe.layoutActions,Wn=qe.getConfigs,Hn=Ot.definitions(),sr=Wn(),hi=sr.docExpansion,li=sr.defaultModelsExpandDepth;if(!Hn.size||li<0)return null;var wi=this.getSchemaBasePath(),Pi=Jt.isShown(wi,li>0&&"none"!==hi),co=Ot.isOAS3(),Xi=At("ModelWrapper"),eo=At("Collapse"),Ms=At("ModelCollapse"),Fs=At("JumpToPath",!0);return Y.default.createElement("section",{className:Pi?"models is-open":"models",ref:this.onLoadModels},Y.default.createElement("h4",null,Y.default.createElement("button",{"aria-expanded":Pi,className:"models-control",onClick:function(){return Tn.show(wi,!Pi)}},Y.default.createElement("span",null,co?"Schemas":"Models"),Y.default.createElement("svg",{width:"20",height:"20","aria-hidden":"true",focusable:"false"},Y.default.createElement("use",{xlinkHref:Pi?"#large-arrow-up":"#large-arrow-down"})))),Y.default.createElement(eo,{isOpened:Pi},(0,Ae.default)(ze=Hn.entrySeq()).call(ze,function(ta){var xs,Rs=(0,Ha.default)(ta,1)[0],ks=(0,o.default)(xs=[]).call(xs,(0,Pd.default)(wi),[Rs]),Os=ft.default.List(ks),Ba=Ot.specResolvedSubtree(ks),Ws=Ot.specJson().getIn(ks),ba=ft.Map.isMap(Ba)?Ba:ft.default.Map(),rs=ft.Map.isMap(Ws)?Ws:ft.default.Map(),na=ba.get("title")||rs.get("title")||Rs,gl=Jt.isShown(ks,!1);gl&&0===ba.size&&rs.size>0&&Ze.props.specActions.requestResolvedSubtree(ks);var td=Y.default.createElement(Xi,{name:Rs,expandDepth:li,schema:ba||ft.default.Map(),displayName:na,fullPath:ks,specPath:Os,getComponent:At,specSelectors:Ot,getConfigs:Wn,layoutSelectors:Jt,layoutActions:Tn,includeReadOnly:!0,includeWriteOnly:!0}),cf=Y.default.createElement("span",{className:"model-box"},Y.default.createElement("span",{className:"model model-title"},na));return Y.default.createElement("div",{id:"model-".concat(Rs),className:"model-container",key:"models-section-".concat(Rs),"data-name":Rs,ref:Ze.onLoadModel},Y.default.createElement("span",{className:"models-jump-to-path"},Y.default.createElement(Fs,{specPath:Os})),Y.default.createElement(Ms,{classes:"model-box",collapsedContent:Ze.getCollapsedContent(Rs),onToggle:Ze.handleToggle,title:cf,displayName:na,modelName:Rs,specPath:Os,layoutSelectors:Jt,layoutActions:Tn,hideSelfOnExpand:!0,expanded:li>0&&gl},td))}).toArray()))}}]),ut}(Y.Component);const $9=function(bn){var qt=bn.value,ut=(0,bn.getComponent)("ModelCollapse"),ze=Y.default.createElement("span",null,"Array [ ",qt.count()," ]");return Y.default.createElement("span",{className:"prop-enum"},"Enum:",Y.default.createElement("br",null),Y.default.createElement(ut,{collapsedContent:ze},"[ ",qt.join(", ")," ]"))};var H9=["schema","name","displayName","isRef","getComponent","getConfigs","depth","onToggle","expanded","specPath"],B9=function(bn){(0,uo.default)(ut,bn);var qt=(0,bo.default)(ut);function ut(){return(0,re.default)(this,ut),qt.apply(this,arguments)}return(0,oe.default)(ut,[{key:"render",value:function(){var ze,Ze,qe,Ot,At=this.props,Jt=At.schema,Tn=At.name,Wn=At.displayName,Hn=At.isRef,sr=At.getComponent,hi=At.getConfigs,li=At.depth,wi=At.onToggle,Pi=At.expanded,co=At.specPath,Xi=(0,rv.default)(At,H9),eo=Xi.specSelectors,Ms=Xi.expandDepth,Fs=Xi.includeReadOnly,ta=Xi.includeWriteOnly,xs=eo.isOAS3;if(!Jt)return null;var Rs=hi().showExtensions,ks=Jt.get("description"),Os=Jt.get("properties"),Ba=Jt.get("additionalProperties"),Ws=Jt.get("title")||Wn||Tn,ba=Jt.get("required"),rs=(0,_.default)(Jt).call(Jt,function(Yd,ac){var jd;return-1!==(0,Ye.default)(jd=["maxProperties","minProperties","nullable","example"]).call(jd,ac)}),na=Jt.get("deprecated"),gl=sr("JumpToPath",!0),td=sr("Markdown",!0),cf=sr("Model"),df=sr("ModelCollapse"),Gf=sr("Property"),Zl=function(){return Y.default.createElement("span",{className:"model-jump-to-path"},Y.default.createElement(gl,{specPath:co}))},nd=Y.default.createElement("span",null,Y.default.createElement("span",null,"{"),"...",Y.default.createElement("span",null,"}"),Hn?Y.default.createElement(Zl,null):""),sc=eo.isOAS3()?Jt.get("anyOf"):null,mp=eo.isOAS3()?Jt.get("oneOf"):null,lp=eo.isOAS3()?Jt.get("not"):null,k_=Ws&&Y.default.createElement("span",{className:"model-title"},Hn&&Jt.get("$$ref")&&Y.default.createElement("span",{className:"model-hint"},Jt.get("$$ref")),Y.default.createElement("span",{className:"model-title__text"},Ws));return Y.default.createElement("span",{className:"model"},Y.default.createElement(df,{modelName:Tn,title:k_,onToggle:wi,expanded:!!Pi||li<=Ms,collapsedContent:nd},Y.default.createElement("span",{className:"brace-open object"},"{"),Hn?Y.default.createElement(Zl,null):null,Y.default.createElement("span",{className:"inner-object"},Y.default.createElement("table",{className:"model"},Y.default.createElement("tbody",null,ks?Y.default.createElement("tr",{className:"description"},Y.default.createElement("td",null,"description:"),Y.default.createElement("td",null,Y.default.createElement(td,{source:ks}))):null,na?Y.default.createElement("tr",{className:"property"},Y.default.createElement("td",null,"deprecated:"),Y.default.createElement("td",null,"true")):null,Os&&Os.size?(0,Ae.default)(ze=(0,_.default)(Ze=Os.entrySeq()).call(Ze,function(Yd){var ac=(0,Ha.default)(Yd,2)[1];return(!ac.get("readOnly")||Fs)&&(!ac.get("writeOnly")||ta)})).call(ze,function(Yd){var ac,jd,ff=(0,Ha.default)(Yd,2),pf=ff[0],Yh=ff[1],Id=xs()&&Yh.get("deprecated"),Ld=ft.List.isList(ba)&&ba.contains(pf),Mf=["property-row"];return Id&&Mf.push("deprecated"),Ld&&Mf.push("required"),Y.default.createElement("tr",{key:pf,className:Mf.join(" ")},Y.default.createElement("td",null,pf,Ld&&Y.default.createElement("span",{className:"star"},"*")),Y.default.createElement("td",null,Y.default.createElement(cf,(0,kp.default)({key:(0,o.default)(ac=(0,o.default)(jd="object-".concat(Tn,"-")).call(jd,pf,"_")).call(ac,Yh)},Xi,{required:Ld,getComponent:sr,specPath:co.push("properties",pf),getConfigs:hi,schema:Yh,depth:li+1}))))}).toArray():null,Rs?Y.default.createElement("tr",null,Y.default.createElement("td",null,"\xa0")):null,Rs?(0,Ae.default)(qe=Jt.entrySeq()).call(qe,function(Yd){var ac=(0,Ha.default)(Yd,2),jd=ac[0],ff=ac[1];if("x-"===(0,Pe.default)(jd).call(jd,0,2)){var pf=ff?ff.toJS?ff.toJS():ff:null;return Y.default.createElement("tr",{key:jd,className:"extension"},Y.default.createElement("td",null,jd),Y.default.createElement("td",null,(0,w.default)(pf)))}}).toArray():null,Ba&&Ba.size?Y.default.createElement("tr",null,Y.default.createElement("td",null,"< * >:"),Y.default.createElement("td",null,Y.default.createElement(cf,(0,kp.default)({},Xi,{required:!1,getComponent:sr,specPath:co.push("additionalProperties"),getConfigs:hi,schema:Ba,depth:li+1})))):null,sc?Y.default.createElement("tr",null,Y.default.createElement("td",null,"anyOf ->"),Y.default.createElement("td",null,(0,Ae.default)(sc).call(sc,function(Yd,ac){return Y.default.createElement("div",{key:ac},Y.default.createElement(cf,(0,kp.default)({},Xi,{required:!1,getComponent:sr,specPath:co.push("anyOf",ac),getConfigs:hi,schema:Yd,depth:li+1})))}))):null,mp?Y.default.createElement("tr",null,Y.default.createElement("td",null,"oneOf ->"),Y.default.createElement("td",null,(0,Ae.default)(mp).call(mp,function(Yd,ac){return Y.default.createElement("div",{key:ac},Y.default.createElement(cf,(0,kp.default)({},Xi,{required:!1,getComponent:sr,specPath:co.push("oneOf",ac),getConfigs:hi,schema:Yd,depth:li+1})))}))):null,lp?Y.default.createElement("tr",null,Y.default.createElement("td",null,"not ->"),Y.default.createElement("td",null,Y.default.createElement("div",null,Y.default.createElement(cf,(0,kp.default)({},Xi,{required:!1,getComponent:sr,specPath:co.push("not"),getConfigs:hi,schema:lp,depth:li+1}))))):null))),Y.default.createElement("span",{className:"brace-close"},"}")),rs.size?(0,Ae.default)(Ot=rs.entrySeq()).call(Ot,function(Yd){var ac,jd=(0,Ha.default)(Yd,2),ff=jd[0],pf=jd[1];return Y.default.createElement(Gf,{key:(0,o.default)(ac="".concat(ff,"-")).call(ac,pf),propKey:ff,propVal:pf,propClass:"property"})}):null)}}]),ut}(Y.Component),U9=function(bn){(0,uo.default)(ut,bn);var qt=(0,bo.default)(ut);function ut(){return(0,re.default)(this,ut),qt.apply(this,arguments)}return(0,oe.default)(ut,[{key:"render",value:function(){var ze,Ze=this.props,qe=Ze.getComponent,Ot=Ze.getConfigs,At=Ze.schema,Jt=Ze.depth,Tn=Ze.expandDepth,Wn=Ze.name,Hn=Ze.displayName,sr=Ze.specPath,hi=At.get("description"),li=At.get("items"),wi=At.get("title")||Hn||Wn,Pi=(0,_.default)(At).call(At,function(ta,xs){var Rs;return-1===(0,Ye.default)(Rs=["type","items","description","$$ref"]).call(Rs,xs)}),co=qe("Markdown",!0),Xi=qe("ModelCollapse"),eo=qe("Model"),Ms=qe("Property"),Fs=wi&&Y.default.createElement("span",{className:"model-title"},Y.default.createElement("span",{className:"model-title__text"},wi));return Y.default.createElement("span",{className:"model"},Y.default.createElement(Xi,{title:Fs,expanded:Jt<=Tn,collapsedContent:"[...]"},"[",Pi.size?(0,Ae.default)(ze=Pi.entrySeq()).call(ze,function(ta){var xs,Rs=(0,Ha.default)(ta,2),ks=Rs[0],Os=Rs[1];return Y.default.createElement(Ms,{key:(0,o.default)(xs="".concat(ks,"-")).call(xs,Os),propKey:ks,propVal:Os,propClass:"property"})}):null,hi?Y.default.createElement(co,{source:hi}):Pi.size?Y.default.createElement("div",{className:"markdown"}):null,Y.default.createElement("span",null,Y.default.createElement(eo,(0,kp.default)({},this.props,{getConfigs:Ot,specPath:sr.push("items"),name:null,schema:li,required:!1,depth:Jt+1}))),"]"))}}]),ut}(Y.Component),PC="property primitive",Y9=function(bn){(0,uo.default)(ut,bn);var qt=(0,bo.default)(ut);function ut(){return(0,re.default)(this,ut),qt.apply(this,arguments)}return(0,oe.default)(ut,[{key:"render",value:function(){var ze,Ze,qe,Ot=this.props,At=Ot.schema,Jt=Ot.getComponent,Wn=Ot.name,Hn=Ot.displayName,sr=Ot.depth,hi=Ot.expandDepth,li=(0,Ot.getConfigs)().showExtensions;if(!At||!At.get)return Y.default.createElement("div",null);var wi=At.get("type"),Pi=At.get("format"),co=At.get("xml"),Xi=At.get("enum"),eo=At.get("title")||Hn||Wn,Ms=At.get("description"),Fs=(0,On.nX)(At),ta=(0,_.default)(At).call(At,function(Ws,ba){var rs;return-1===(0,Ye.default)(rs=["enum","type","format","description","$$ref"]).call(rs,ba)}).filterNot(function(Ws,ba){return Fs.has(ba)}),xs=Jt("Markdown",!0),Rs=Jt("EnumModel"),ks=Jt("Property"),Os=Jt("ModelCollapse"),Ba=eo&&Y.default.createElement("span",{className:"model-title"},Y.default.createElement("span",{className:"model-title__text"},eo));return Y.default.createElement("span",{className:"model"},Y.default.createElement(Os,{title:Ba,expanded:sr>=hi,collapsedContent:" ",hideSelfOnExpand:hi!==sr},Y.default.createElement("span",{className:"prop"},Wn&&sr>1&&Y.default.createElement("span",{className:"prop-name"},eo),Y.default.createElement("span",{className:"prop-type"},wi),Pi&&Y.default.createElement("span",{className:"prop-format"},"($",Pi,")"),ta.size?(0,Ae.default)(ze=ta.entrySeq()).call(ze,function(Ws){var ba,rs=(0,Ha.default)(Ws,2),na=rs[0],gl=rs[1];return Y.default.createElement(ks,{key:(0,o.default)(ba="".concat(na,"-")).call(ba,gl),propKey:na,propVal:gl,propClass:PC})}):null,li&&Fs.size?(0,Ae.default)(Ze=Fs.entrySeq()).call(Ze,function(Ws){var ba,rs=(0,Ha.default)(Ws,2),na=rs[0],gl=rs[1];return Y.default.createElement(ks,{key:(0,o.default)(ba="".concat(na,"-")).call(ba,gl),propKey:na,propVal:gl,propClass:PC})}):null,Ms?Y.default.createElement(xs,{source:Ms}):null,co&&co.size?Y.default.createElement("span",null,Y.default.createElement("br",null),Y.default.createElement("span",{className:PC},"xml:"),(0,Ae.default)(qe=co.entrySeq()).call(qe,function(Ws){var ba,rs=(0,Ha.default)(Ws,2),na=rs[0],gl=rs[1];return Y.default.createElement("span",{key:(0,o.default)(ba="".concat(na,"-")).call(ba,gl),className:PC},Y.default.createElement("br",null),"\xa0\xa0\xa0",na,": ",String(gl))}).toArray()):null,Xi&&Y.default.createElement(Rs,{value:Xi,getComponent:Jt}))))}}]),ut}(Y.Component);const j9=function(bn){var qt=bn.propKey,ut=bn.propVal;return Y.default.createElement("span",{className:bn.propClass},Y.default.createElement("br",null),qt,": ",String(ut))};var f3=function(bn){(0,uo.default)(ut,bn);var qt=(0,bo.default)(ut);function ut(){return(0,re.default)(this,ut),qt.apply(this,arguments)}return(0,oe.default)(ut,[{key:"render",value:function(){var ze=this.props,Ze=ze.onTryoutClick,Ot=ze.onResetClick,Tn=ze.isOAS3&&ze.hasUserEditedBody;return Y.default.createElement("div",{className:Tn?"try-out btn-group":"try-out"},ze.enabled?Y.default.createElement("button",{className:"btn try-out__btn cancel",onClick:ze.onCancelClick},"Cancel"):Y.default.createElement("button",{className:"btn try-out__btn",onClick:Ze},"Try it out "),Tn&&Y.default.createElement("button",{className:"btn try-out__btn reset",onClick:Ot},"Reset"))}}]),ut}(Y.default.Component);(0,X.default)(f3,"defaultProps",{onTryoutClick:Function.prototype,onCancelClick:Function.prototype,onResetClick:Function.prototype,enabled:!1,hasUserEditedBody:!1,isOAS3:!1});var p3=function(bn){(0,uo.default)(ut,bn);var qt=(0,bo.default)(ut);function ut(){return(0,re.default)(this,ut),qt.apply(this,arguments)}return(0,oe.default)(ut,[{key:"render",value:function(){var ze=this.props,qe=ze.isSwagger2,Ot=ze.isOAS3,At=ze.alsoShow;return ze.bypass?Y.default.createElement("div",null,this.props.children):qe&&Ot?Y.default.createElement("div",{className:"version-pragma"},At,Y.default.createElement("div",{className:"version-pragma__message version-pragma__message--ambiguous"},Y.default.createElement("div",null,Y.default.createElement("h3",null,"Unable to render this definition"),Y.default.createElement("p",null,Y.default.createElement("code",null,"swagger")," and ",Y.default.createElement("code",null,"openapi")," fields cannot be present in the same Swagger or OpenAPI definition. Please remove one of the fields."),Y.default.createElement("p",null,"Supported version fields are ",Y.default.createElement("code",null,"swagger: ",'"2.0"')," and those that match ",Y.default.createElement("code",null,"openapi: 3.0.n")," (for example, ",Y.default.createElement("code",null,"openapi: 3.0.0"),").")))):qe||Ot?Y.default.createElement("div",null,this.props.children):Y.default.createElement("div",{className:"version-pragma"},At,Y.default.createElement("div",{className:"version-pragma__message version-pragma__message--missing"},Y.default.createElement("div",null,Y.default.createElement("h3",null,"Unable to render this definition"),Y.default.createElement("p",null,"The provided definition does not specify a valid version field."),Y.default.createElement("p",null,"Please indicate a valid Swagger or OpenAPI version field. Supported version fields are ",Y.default.createElement("code",null,"swagger: ",'"2.0"')," and those that match ",Y.default.createElement("code",null,"openapi: 3.0.n")," (for example, ",Y.default.createElement("code",null,"openapi: 3.0.0"),")."))))}}]),ut}(Y.default.PureComponent);(0,X.default)(p3,"defaultProps",{alsoShow:null,children:null,bypass:!1});const G9=function(bn){return Y.default.createElement("small",null,Y.default.createElement("pre",{className:"version"}," ",bn.version," "))},z9=function(bn){var qt=bn.enabled,ze=bn.text;return Y.default.createElement("a",{className:"nostyle",onClick:qt?function(Ze){return Ze.preventDefault()}:null,href:qt?"#/".concat(bn.path):null},Y.default.createElement("span",null,ze))},V9=function(){return Y.default.createElement("div",null,Y.default.createElement("svg",{xmlns:"http://www.w3.org/2000/svg",xmlnsXlink:"http://www.w3.org/1999/xlink",className:"svg-assets"},Y.default.createElement("defs",null,Y.default.createElement("symbol",{viewBox:"0 0 20 20",id:"unlocked"},Y.default.createElement("path",{d:"M15.8 8H14V5.6C14 2.703 12.665 1 10 1 7.334 1 6 2.703 6 5.6V6h2v-.801C8 3.754 8.797 3 10 3c1.203 0 2 .754 2 2.199V8H4c-.553 0-1 .646-1 1.199V17c0 .549.428 1.139.951 1.307l1.197.387C5.672 18.861 6.55 19 7.1 19h5.8c.549 0 1.428-.139 1.951-.307l1.196-.387c.524-.167.953-.757.953-1.306V9.199C17 8.646 16.352 8 15.8 8z"})),Y.default.createElement("symbol",{viewBox:"0 0 20 20",id:"locked"},Y.default.createElement("path",{d:"M15.8 8H14V5.6C14 2.703 12.665 1 10 1 7.334 1 6 2.703 6 5.6V8H4c-.553 0-1 .646-1 1.199V17c0 .549.428 1.139.951 1.307l1.197.387C5.672 18.861 6.55 19 7.1 19h5.8c.549 0 1.428-.139 1.951-.307l1.196-.387c.524-.167.953-.757.953-1.306V9.199C17 8.646 16.352 8 15.8 8zM12 8H8V5.199C8 3.754 8.797 3 10 3c1.203 0 2 .754 2 2.199V8z"})),Y.default.createElement("symbol",{viewBox:"0 0 20 20",id:"close"},Y.default.createElement("path",{d:"M14.348 14.849c-.469.469-1.229.469-1.697 0L10 11.819l-2.651 3.029c-.469.469-1.229.469-1.697 0-.469-.469-.469-1.229 0-1.697l2.758-3.15-2.759-3.152c-.469-.469-.469-1.228 0-1.697.469-.469 1.228-.469 1.697 0L10 8.183l2.651-3.031c.469-.469 1.228-.469 1.697 0 .469.469.469 1.229 0 1.697l-2.758 3.152 2.758 3.15c.469.469.469 1.229 0 1.698z"})),Y.default.createElement("symbol",{viewBox:"0 0 20 20",id:"large-arrow"},Y.default.createElement("path",{d:"M13.25 10L6.109 2.58c-.268-.27-.268-.707 0-.979.268-.27.701-.27.969 0l7.83 7.908c.268.271.268.709 0 .979l-7.83 7.908c-.268.271-.701.27-.969 0-.268-.269-.268-.707 0-.979L13.25 10z"})),Y.default.createElement("symbol",{viewBox:"0 0 20 20",id:"large-arrow-down"},Y.default.createElement("path",{d:"M17.418 6.109c.272-.268.709-.268.979 0s.271.701 0 .969l-7.908 7.83c-.27.268-.707.268-.979 0l-7.908-7.83c-.27-.268-.27-.701 0-.969.271-.268.709-.268.979 0L10 13.25l7.418-7.141z"})),Y.default.createElement("symbol",{viewBox:"0 0 20 20",id:"large-arrow-up"},Y.default.createElement("path",{d:"M 17.418 14.908 C 17.69 15.176 18.127 15.176 18.397 14.908 C 18.667 14.64 18.668 14.207 18.397 13.939 L 10.489 6.109 C 10.219 5.841 9.782 5.841 9.51 6.109 L 1.602 13.939 C 1.332 14.207 1.332 14.64 1.602 14.908 C 1.873 15.176 2.311 15.176 2.581 14.908 L 10 7.767 L 17.418 14.908 Z"})),Y.default.createElement("symbol",{viewBox:"0 0 24 24",id:"jump-to"},Y.default.createElement("path",{d:"M19 7v4H5.83l3.58-3.59L8 6l-6 6 6 6 1.41-1.41L5.83 13H21V7z"})),Y.default.createElement("symbol",{viewBox:"0 0 24 24",id:"expand"},Y.default.createElement("path",{d:"M10 18h4v-2h-4v2zM3 6v2h18V6H3zm3 7h12v-2H6v2z"})))))};var Z9=xo(5466),W9=function(bn){(0,uo.default)(ut,bn);var qt=(0,bo.default)(ut);function ut(){return(0,re.default)(this,ut),qt.apply(this,arguments)}return(0,oe.default)(ut,[{key:"render",value:function(){var ze=this.props,Ze=ze.errSelectors,qe=ze.specSelectors,Ot=ze.getComponent,At=Ot("SvgAssets"),Jt=Ot("InfoContainer",!0),Tn=Ot("VersionPragmaFilter"),Wn=Ot("operations",!0),Hn=Ot("Models",!0),sr=Ot("Row"),hi=Ot("Col"),li=Ot("errors",!0),wi=Ot("ServersContainer",!0),Pi=Ot("SchemesContainer",!0),co=Ot("AuthorizeBtnContainer",!0),Xi=Ot("FilterContainer",!0),eo=qe.isSwagger2(),Ms=qe.isOAS3(),Fs=!qe.specStr(),ta=qe.loadingStatus(),xs=null;if("loading"===ta&&(xs=Y.default.createElement("div",{className:"info"},Y.default.createElement("div",{className:"loading-container"},Y.default.createElement("div",{className:"loading"})))),"failed"===ta&&(xs=Y.default.createElement("div",{className:"info"},Y.default.createElement("div",{className:"loading-container"},Y.default.createElement("h4",{className:"title"},"Failed to load API definition."),Y.default.createElement(li,null)))),"failedConfig"===ta){var Rs=Ze.lastError(),ks=Rs?Rs.get("message"):"";xs=Y.default.createElement("div",{className:"info failed-config"},Y.default.createElement("div",{className:"loading-container"},Y.default.createElement("h4",{className:"title"},"Failed to load remote configuration."),Y.default.createElement("p",null,ks)))}if(!xs&&Fs&&(xs=Y.default.createElement("h4",null,"No API definition provided.")),xs)return Y.default.createElement("div",{className:"swagger-ui"},Y.default.createElement("div",{className:"loading-container"},xs));var Os=qe.servers(),Ba=qe.schemes(),Ws=Os&&Os.size,ba=Ba&&Ba.size,rs=!!qe.securityDefinitions();return Y.default.createElement("div",{className:"swagger-ui"},Y.default.createElement(At,null),Y.default.createElement(Tn,{isSwagger2:eo,isOAS3:Ms,alsoShow:Y.default.createElement(li,null)},Y.default.createElement(li,null),Y.default.createElement(sr,{className:"information-container"},Y.default.createElement(hi,{mobile:12},Y.default.createElement(Jt,null))),Ws||ba||rs?Y.default.createElement("div",{className:"scheme-container"},Y.default.createElement(hi,{className:"schemes wrapper",mobile:12},Ws?Y.default.createElement(wi,null):null,ba?Y.default.createElement(Pi,null):null,rs?Y.default.createElement(co,null):null)):null,Y.default.createElement(Xi,null),Y.default.createElement(sr,null,Y.default.createElement(hi,{mobile:12,desktop:12},Y.default.createElement(Wn,null))),Y.default.createElement(sr,null,Y.default.createElement(hi,{mobile:12,desktop:12},Y.default.createElement(Hn,null)))))}}]),ut}(Y.default.Component);const h3=(bn=>{var qt={};return xo.d(qt,bn),qt})({default:()=>G7()});var e1={value:"",onChange:function(){},schema:{},keyName:"",required:!1,errors:(0,ft.List)()},_3=function(bn){(0,uo.default)(ut,bn);var qt=(0,bo.default)(ut);function ut(){return(0,re.default)(this,ut),qt.apply(this,arguments)}return(0,oe.default)(ut,[{key:"componentDidMount",value:function(){var ze=this.props,Ze=ze.dispatchInitialValue,Ot=ze.onChange;Ze?Ot(ze.value):!1===Ze&&Ot("")}},{key:"render",value:function(){var ze,Ze=this.props,qe=Ze.schema,Ot=Ze.errors,At=Ze.value,Jt=Ze.onChange,Tn=Ze.getComponent,Wn=Ze.fn,Hn=Ze.disabled,sr=qe&&qe.get?qe.get("format"):null,hi=qe&&qe.get?qe.get("type"):null,wi=hi?Tn(sr?(0,o.default)(ze="JsonSchema_".concat(hi,"_")).call(ze,sr):"JsonSchema_".concat(hi),!1,{failSilently:!0}):Tn("JsonSchema_string");return wi||(wi=Tn("JsonSchema_string")),Y.default.createElement(wi,(0,kp.default)({},this.props,{errors:Ot,fn:Wn,getComponent:Tn,value:At,onChange:Jt,schema:qe,disabled:Hn}))}}]),ut}(Y.Component);(0,X.default)(_3,"defaultProps",e1);var g3=function(bn){(0,uo.default)(ut,bn);var qt=(0,bo.default)(ut);function ut(){var ze,Ze;(0,re.default)(this,ut);for(var qe=arguments.length,Ot=new Array(qe),At=0;At<qe;At++)Ot[At]=arguments[At];return Ze=qt.call.apply(qt,(0,o.default)(ze=[this]).call(ze,Ot)),(0,X.default)((0,Ri.default)(Ze),"onChange",function(Jt){var Tn=Ze.props.schema&&"file"===Ze.props.schema.get("type")?Jt.target.files[0]:Jt.target.value;Ze.props.onChange(Tn,Ze.props.keyName)}),(0,X.default)((0,Ri.default)(Ze),"onEnumChange",function(Jt){return Ze.props.onChange(Jt)}),Ze}return(0,oe.default)(ut,[{key:"render",value:function(){var ze=this.props,Ze=ze.getComponent,qe=ze.value,Ot=ze.schema,At=ze.errors,Jt=ze.required,Tn=ze.description,Wn=ze.disabled,Hn=Ot&&Ot.get?Ot.get("enum"):null,sr=Ot&&Ot.get?Ot.get("format"):null,hi=Ot&&Ot.get?Ot.get("type"):null,li=Ot&&Ot.get?Ot.get("in"):null;if(qe||(qe=""),At=At.toJS?At.toJS():[],Hn){var wi=Ze("Select");return Y.default.createElement(wi,{className:At.length?"invalid":"",title:At.length?At:"",allowedValues:Hn,value:qe,allowEmptyValue:!Jt,disabled:Wn,onChange:this.onEnumChange})}var Pi=Wn||li&&"formData"===li&&!("FormData"in window),co=Ze("Input");return hi&&"file"===hi?Y.default.createElement(co,{type:"file",className:At.length?"invalid":"",title:At.length?At:"",onChange:this.onChange,disabled:Pi}):Y.default.createElement(h3.default,{type:sr&&"password"===sr?"password":"text",className:At.length?"invalid":"",title:At.length?At:"",value:qe,minLength:0,debounceTimeout:350,placeholder:Tn,onChange:this.onChange,disabled:Pi})}}]),ut}(Y.Component);(0,X.default)(g3,"defaultProps",e1);var m3=function(bn){(0,uo.default)(ut,bn);var qt=(0,bo.default)(ut);function ut(ze,Ze){var qe;return(0,re.default)(this,ut),qe=qt.call(this,ze,Ze),(0,X.default)((0,Ri.default)(qe),"onChange",function(){qe.props.onChange(qe.state.value)}),(0,X.default)((0,Ri.default)(qe),"onItemChange",function(Ot,At){qe.setState(function(Jt){return{value:Jt.value.set(At,Ot)}},qe.onChange)}),(0,X.default)((0,Ri.default)(qe),"removeItem",function(Ot){qe.setState(function(At){return{value:At.value.delete(Ot)}},qe.onChange)}),(0,X.default)((0,Ri.default)(qe),"addItem",function(){var Ot=GA(qe.state.value);qe.setState(function(){return{value:Ot.push((0,On.xi)(qe.state.schema.get("items"),!1,{includeWriteOnly:!0}))}},qe.onChange)}),(0,X.default)((0,Ri.default)(qe),"onEnumChange",function(Ot){qe.setState(function(){return{value:Ot}},qe.onChange)}),qe.state={value:GA(ze.value),schema:ze.schema},qe}return(0,oe.default)(ut,[{key:"UNSAFE_componentWillReceiveProps",value:function(ze){var Ze=GA(ze.value);Ze!==this.state.value&&this.setState({value:Ze}),ze.schema!==this.state.schema&&this.setState({schema:ze.schema})}},{key:"render",value:function(){var ze,Ze=this,qe=this.props,Ot=qe.getComponent,At=qe.required,Jt=qe.schema,Tn=qe.errors,Wn=qe.fn,Hn=qe.disabled;Tn=Tn.toJS?Tn.toJS():(0,De.default)(Tn)?Tn:[];var sr,hi,li=(0,_.default)(Tn).call(Tn,function(Os){return"string"==typeof Os}),wi=(0,Ae.default)(ze=(0,_.default)(Tn).call(Tn,function(Os){return void 0!==Os.needRemove})).call(ze,function(Os){return Os.error}),Pi=this.state.value,co=!!(Pi&&Pi.count&&Pi.count()>0),Xi=Jt.getIn(["items","enum"]),eo=Jt.getIn(["items","type"]),Ms=Jt.getIn(["items","format"]),Fs=Jt.get("items"),ta=!1,xs="file"===eo||"string"===eo&&"binary"===Ms;if(eo&&Ms?sr=Ot((0,o.default)(hi="JsonSchema_".concat(eo,"_")).call(hi,Ms)):"boolean"!==eo&&"array"!==eo&&"object"!==eo||(sr=Ot("JsonSchema_".concat(eo))),sr||xs||(ta=!0),Xi){var Rs=Ot("Select");return Y.default.createElement(Rs,{className:Tn.length?"invalid":"",title:Tn.length?Tn:"",multiple:!0,value:Pi,disabled:Hn,allowedValues:Xi,allowEmptyValue:!At,onChange:this.onEnumChange})}var ks=Ot("Button");return Y.default.createElement("div",{className:"json-schema-array"},co?(0,Ae.default)(Pi).call(Pi,function(Os,Ba){var Ws,ba=(0,ft.fromJS)((0,Pd.default)((0,Ae.default)(Ws=(0,_.default)(Tn).call(Tn,function(rs){return rs.index===Ba})).call(Ws,function(rs){return rs.error})));return Y.default.createElement("div",{key:Ba,className:"json-schema-form-item"},xs?Y.default.createElement(jA,{value:Os,onChange:function(rs){return Ze.onItemChange(rs,Ba)},disabled:Hn,errors:ba,getComponent:Ot}):ta?Y.default.createElement(YA,{value:Os,onChange:function(rs){return Ze.onItemChange(rs,Ba)},disabled:Hn,errors:ba}):Y.default.createElement(sr,(0,kp.default)({},Ze.props,{value:Os,onChange:function(rs){return Ze.onItemChange(rs,Ba)},disabled:Hn,errors:ba,schema:Fs,getComponent:Ot,fn:Wn})),Hn?null:Y.default.createElement(ks,{className:"btn btn-sm json-schema-form-item-remove ".concat(wi.length?"invalid":null),title:wi.length?wi:"",onClick:function(){return Ze.removeItem(Ba)}}," - "))}):null,Hn?null:Y.default.createElement(ks,{className:"btn btn-sm json-schema-form-item-add ".concat(li.length?"invalid":null),title:li.length?li:"",onClick:this.addItem},"Add ",eo?"".concat(eo," "):"","item"))}}]),ut}(Y.PureComponent);(0,X.default)(m3,"defaultProps",e1);var YA=function(bn){(0,uo.default)(ut,bn);var qt=(0,bo.default)(ut);function ut(){var ze,Ze;(0,re.default)(this,ut);for(var qe=arguments.length,Ot=new Array(qe),At=0;At<qe;At++)Ot[At]=arguments[At];return Ze=qt.call.apply(qt,(0,o.default)(ze=[this]).call(ze,Ot)),(0,X.default)((0,Ri.default)(Ze),"onChange",function(Jt){Ze.props.onChange(Jt.target.value,Ze.props.keyName)}),Ze}return(0,oe.default)(ut,[{key:"render",value:function(){var ze=this.props,Ze=ze.value,qe=ze.errors,Ot=ze.description,At=ze.disabled;return Ze||(Ze=""),qe=qe.toJS?qe.toJS():[],Y.default.createElement(h3.default,{type:"text",className:qe.length?"invalid":"",title:qe.length?qe:"",value:Ze,minLength:0,debounceTimeout:350,placeholder:Ot,onChange:this.onChange,disabled:At})}}]),ut}(Y.Component);(0,X.default)(YA,"defaultProps",e1);var jA=function(bn){(0,uo.default)(ut,bn);var qt=(0,bo.default)(ut);function ut(){var ze,Ze;(0,re.default)(this,ut);for(var qe=arguments.length,Ot=new Array(qe),At=0;At<qe;At++)Ot[At]=arguments[At];return Ze=qt.call.apply(qt,(0,o.default)(ze=[this]).call(ze,Ot)),(0,X.default)((0,Ri.default)(Ze),"onFileChange",function(Jt){Ze.props.onChange(Jt.target.files[0],Ze.props.keyName)}),Ze}return(0,oe.default)(ut,[{key:"render",value:function(){var ze=this.props,qe=ze.errors,Ot=ze.disabled,At=(0,ze.getComponent)("Input"),Jt=Ot||!("FormData"in window);return Y.default.createElement(At,{type:"file",className:qe.length?"invalid":"",title:qe.length?qe:"",onChange:this.onFileChange,disabled:Jt})}}]),ut}(Y.Component);(0,X.default)(jA,"defaultProps",e1);var v3=function(bn){(0,uo.default)(ut,bn);var qt=(0,bo.default)(ut);function ut(){var ze,Ze;(0,re.default)(this,ut);for(var qe=arguments.length,Ot=new Array(qe),At=0;At<qe;At++)Ot[At]=arguments[At];return Ze=qt.call.apply(qt,(0,o.default)(ze=[this]).call(ze,Ot)),(0,X.default)((0,Ri.default)(Ze),"onEnumChange",function(Jt){return Ze.props.onChange(Jt)}),Ze}return(0,oe.default)(ut,[{key:"render",value:function(){var ze=this.props,Ze=ze.getComponent,qe=ze.value,Ot=ze.errors,At=ze.schema,Jt=ze.required,Tn=ze.disabled;Ot=Ot.toJS?Ot.toJS():[];var Wn=At&&At.get?At.get("enum"):null,Hn=!Wn||!Jt,sr=!Wn&&(0,ft.fromJS)(["true","false"]),hi=Ze("Select");return Y.default.createElement(hi,{className:Ot.length?"invalid":"",title:Ot.length?Ot:"",value:String(qe),disabled:Tn,allowedValues:Wn||sr,allowEmptyValue:Hn,onChange:this.onEnumChange})}}]),ut}(Y.Component);(0,X.default)(v3,"defaultProps",e1);var J9=function(bn){return(0,Ae.default)(bn).call(bn,function(qt){var ut,Ze="string"==typeof qt?qt:"string"==typeof qt.error?qt.error:null;if(!(void 0!==qt.propKey?qt.propKey:qt.index)&&Ze)return Ze;for(var qe=qt.error,Ot="/".concat(qt.propKey);"object"===(0,t.default)(qe);){var At=void 0!==qe.propKey?qe.propKey:qe.index;if(void 0===At||(Ot+="/".concat(At),!qe.error))break;qe=qe.error}return(0,o.default)(ut="".concat(Ot,": ")).call(ut,qe)})},y3=function(bn){(0,uo.default)(ut,bn);var qt=(0,bo.default)(ut);function ut(){var ze;return(0,re.default)(this,ut),ze=qt.call(this),(0,X.default)((0,Ri.default)(ze),"onChange",function(Ze){ze.props.onChange(Ze)}),(0,X.default)((0,Ri.default)(ze),"handleOnChange",function(Ze){ze.onChange(Ze.target.value)}),ze}return(0,oe.default)(ut,[{key:"render",value:function(){var ze=this.props,qe=ze.value,Ot=ze.errors,At=ze.disabled,Jt=(0,ze.getComponent)("TextArea");return Ot=Ot.toJS?Ot.toJS():(0,De.default)(Ot)?Ot:[],Y.default.createElement("div",null,Y.default.createElement(Jt,{className:(0,jf.default)({invalid:Ot.length}),title:Ot.length?J9(Ot).join(", "):"",value:(0,On.Pz)(qe),disabled:At,onChange:this.handleOnChange}))}}]),ut}(Y.PureComponent);function GA(bn){return ft.List.isList(bn)?bn:(0,De.default)(bn)?(0,ft.fromJS)(bn):(0,ft.List)()}function Q9(){return[Ji.default,Vr.default,jr.default,Wi.default,Lr.default,ir.default,An.default,Mi.default,{components:{App:Vn,authorizationPopup:Mr,authorizeBtn:kr,AuthorizeBtnContainer:Ni,authorizeOperationBtn:Zs,auths:Vo,AuthItem:il,authError:_l,oauth2:Lp,apiKeyAuth:zl,basicAuth:Wu,clear:ji,liveResponse:qi,InitializedInput:y9,info:C9,InfoContainer:M9,JumpToPath:O9,onlineValidatorBadge:Po.Z,operations:fs,operation:Gi,OperationSummary:ss,OperationSummaryMethod:eu,OperationSummaryPath:dl,highlightCode:F_,responses:tv,response:Yg,ResponseExtension:eg,responseBody:MC,parameters:KE,parameterRow:wC,execute:RC,headers:Ja,errors:Du,contentType:qv,overview:g9,footer:A9,FilterContainer:D9,ParamBody:c3,curl:x9,schemes:R9,SchemesContainer:N9,modelExample:I9,ModelWrapper:L9,ModelCollapse:d3,Model:F9.Z,Models:k9,EnumModel:$9,ObjectModel:B9,ArrayModel:U9,PrimitiveModel:Y9,Property:j9,TryItOutButton:f3,Markdown:Z9.Z,BaseLayout:W9,VersionPragmaFilter:p3,VersionStamp:G9,OperationExt:Ti,OperationExtRow:Ju,ParameterExt:AC,ParameterIncludeEmpty:XE,OperationTag:us,OperationContainer:bt,DeepLink:z9,InfoUrl:T9,InfoBasePath:E9,SvgAssets:V9,Example:Yf,ExamplesSelect:Zc,ExamplesSelectValueRetainer:Bh}},{components:n},Nn.default,{components:s},fn.default,xi.default,Ho.default,Ao.default,Vs.default,Yi.default,(0,Qs.default)()]}(0,X.default)(y3,"defaultProps",e1);var K9=xo(7451);function E3(){return[Q9,K9.default]}var X9=xo(5308);function zA(bn){var qt,ut,ze;In.Z.versions=In.Z.versions||{},In.Z.versions.swaggerUi={version:"4.12.0",gitRevision:"ga7e23b5",gitDirty:!0,buildTimestamp:"Fri, 03 Jun 2022 17:07:59 GMT"};var Ze={dom_id:null,domNode:null,spec:{},url:"",urls:null,layout:"BaseLayout",docExpansion:"list",maxDisplayedTags:null,filter:null,validatorUrl:"https://validator.swagger.io/validator",oauth2RedirectUrl:(0,o.default)(qt=(0,o.default)(ut="".concat(window.location.protocol,"//")).call(ut,window.location.host)).call(qt,window.location.pathname.substring(0,(0,l.default)(ze=window.location.pathname).call(ze,"/")),"/oauth2-redirect.html"),persistAuthorization:!1,configs:{},custom:{},displayOperationId:!1,displayRequestDuration:!1,deepLinking:!1,tryItOutEnabled:!1,requestInterceptor:function(li){return li},responseInterceptor:function(li){return li},showMutatedRequest:!0,defaultModelRendering:"example",defaultModelExpandDepth:1,defaultModelsExpandDepth:1,showExtensions:!1,showCommonExtensions:!1,withCredentials:void 0,requestSnippetsEnabled:!1,requestSnippets:{generators:{curl_bash:{title:"cURL (bash)",syntax:"bash"},curl_powershell:{title:"cURL (PowerShell)",syntax:"powershell"},curl_cmd:{title:"cURL (CMD)",syntax:"bash"}},defaultExpanded:!0,languages:null},supportedSubmitMethods:["get","put","post","delete","options","head","patch","trace"],queryConfigEnabled:!1,presets:[E3],plugins:[],pluginsOptions:{pluginLoadType:"legacy"},initialState:{},fn:{},components:{},syntaxHighlight:{activated:!0,theme:"agate"}},qe=bn.queryConfigEnabled?(0,On.UG)():{},Ot=bn.domNode;delete bn.domNode;var At=V()({},Ze,bn,qe),Jt={system:{configs:At.configs},plugins:At.presets,pluginsOptions:At.pluginsOptions,state:V()({layout:{layout:At.layout,filter:(0,_.default)(At)},spec:{spec:"",url:At.url},requestSnippets:At.requestSnippets},At.initialState)};if(At.initialState)for(var Tn in At.initialState)Object.prototype.hasOwnProperty.call(At.initialState,Tn)&&void 0===At.initialState[Tn]&&delete Jt.state[Tn];var Wn=new Ir(Jt);Wn.register([At.plugins,function(){return{fn:At.fn,components:At.components,state:At.state}}]);var Hn=Wn.getSystem(),sr=function(li){var wi=Hn.specSelectors.getLocalConfig?Hn.specSelectors.getLocalConfig():{},Pi=V()({},wi,At,li||{},qe);if(Ot&&(Pi.domNode=Ot),Wn.setConfigs(Pi),Hn.configsActions.loaded(),null!==li&&(!qe.url&&"object"===(0,t.default)(Pi.spec)&&(0,M.default)(Pi.spec).length?(Hn.specActions.updateUrl(""),Hn.specActions.updateLoadingStatus("success"),Hn.specActions.updateSpec((0,w.default)(Pi.spec))):Hn.specActions.download&&Pi.url&&!Pi.urls&&(Hn.specActions.updateUrl(Pi.url),Hn.specActions.download(Pi.url))),Pi.domNode)Hn.render(Pi.domNode,"App");else if(Pi.dom_id){var co=document.querySelector(Pi.dom_id);Hn.render(co,"App")}else null===Pi.dom_id||null===Pi.domNode||console.error("Skipped rendering: no `dom_id` or `domNode` was specified");return Hn},hi=qe.config||At.configUrl;return hi&&Hn.specActions&&Hn.specActions.getConfigByUrl?(Hn.specActions.getConfigByUrl({url:hi,loadRemoteConfig:!0,requestInterceptor:At.requestInterceptor,responseInterceptor:At.responseInterceptor},sr),Hn):sr()}zA.presets={apis:E3},zA.plugins=X9.default;const rk=zA})();var V7=QR.Z;let Z7=(()=>{class n{ngOnInit(){V7({url:window.location.origin+"/docs/openapi.json",dom_id:"#swagger-ui",layout:"BaseLayout"})}}return n.\u0275fac=function(t){return new(t||n)},n.\u0275cmp=e.Xpm({type:n,selectors:[["cd-api-docs"]],decls:1,vars:0,consts:[["id","swagger-ui",1,"apiDocs"]],template:function(t,o){1&t&&e._UZ(0,"div",0)},styles:[".apiDocs[_ngcontent-%COMP%]{background:#f8f9fa;font-size:18px!important;margin-top:-48px!important}"]}),n})();var KR=i(45510);let XR=(()=>{class n{constructor(t,o){this.router=t,this.authStorageService=o}canActivate(t,o){return!(this.authStorageService.isLoggedIn()&&!this.authStorageService.isSSO()&&this.authStorageService.getPwdUpdateRequired()&&(this.router.navigate(["/login-change-password"],{queryParams:{returnUrl:o.url}}),1))}canActivateChild(t,o){return this.canActivate(t,o)}}return n.\u0275fac=function(t){return new(t||n)(e.LFG(Bo.F0),e.LFG(zi.j))},n.\u0275prov=e.Yz7({token:n,factory:n.\u0275fac,providedIn:"root"}),n})();var HA=i(4222),QE=i(54462);let qR=(()=>{class n{constructor(t){this.authStorageService=t}canActivate(){if(!this.authStorageService.isSSO())return!0;throw new Y1.mM}canActivateChild(){return this.canActivate()}}return n.\u0275fac=function(t){return new(t||n)(e.LFG(zi.j))},n.\u0275prov=e.Yz7({token:n,factory:n.\u0275fac,providedIn:"root"}),n})(),e3=(()=>{class n extends d0{resolve(t){const o=[],l=t.queryParams.fromLink||null;let _="";switch(l){case"/monitor":_="Monitors";break;case"/hosts":_="Hosts"}return o.push({text:"Cluster",path:null}),o.push({text:_,path:l}),o.push({text:"Performance Counters",path:""}),o}}return n.\u0275fac=function(){let s;return function(o){return(s||(s=e.n5z(n)))(o||n)}}(),n.\u0275prov=e.Yz7({token:n,factory:n.\u0275fac}),n})(),t3=(()=>{class n extends d0{resolve(t){const o=t.params.name;return[{text:`${Er().startCase(o)}/Edit`,path:o}]}}return n.\u0275fac=function(){let s;return function(o){return(s||(s=e.n5z(n)))(o||n)}}(),n.\u0275prov=e.Yz7({token:n,factory:n.\u0275fac}),n})();const W7=[{path:"",redirectTo:"dashboard",pathMatch:"full"},{path:"api-docs",component:Z7},{path:"",component:nO,canActivate:[KR.P,XR],canActivateChild:[KR.P,XR],children:[{path:"dashboard",component:Mv},{path:"error",component:v2},{path:"expand-cluster",component:uv,canActivate:[QE.P],data:{moduleStatusGuardConfig:{uiApiPath:"orchestrator",redirectTo:"dashboard",backend:"cephadm"},breadcrumbs:"Expand Cluster"}},{path:"hosts",component:If,data:{breadcrumbs:"Cluster/Hosts"},children:[{path:Mo.MQ.ADD,component:is,outlet:"modal"}]},{path:"monitor",component:ry,data:{breadcrumbs:"Cluster/Monitors"}},{path:"services",component:Sg,canActivate:[QE.P],data:{moduleStatusGuardConfig:{uiApiPath:"orchestrator",redirectTo:"error",section:"orch",section_info:"Orchestrator",header:"Orchestrator is not available"},breadcrumbs:"Cluster/Services"},children:[{path:Mo.MQ.CREATE,component:xp,outlet:"modal"},{path:`${Mo.MQ.EDIT}/:type/:name`,component:xp,outlet:"modal"}]},{path:"inventory",canActivate:[QE.P],component:cl,data:{moduleStatusGuardConfig:{uiApiPath:"orchestrator",redirectTo:"error",section:"orch",section_info:"Orchestrator",header:"Orchestrator is not available"},breadcrumbs:"Cluster/Physical Disks"}},{path:"osd",data:{breadcrumbs:"Cluster/OSDs"},children:[{path:"",component:kh},{path:Mo.MQ.CREATE,component:Qp,data:{breadcrumbs:Mo.Qn.CREATE}}]},{path:"configuration",data:{breadcrumbs:"Cluster/Configuration"},children:[{path:"",component:$c},{path:"edit/:name",component:Yc,data:{breadcrumbs:Mo.Qn.EDIT}}]},{path:"crush-map",component:hl,data:{breadcrumbs:"Cluster/CRUSH map"}},{path:"logs",component:i1,data:{breadcrumbs:"Cluster/Logs"}},{path:"telemetry",component:kb,data:{breadcrumbs:"Telemetry configuration"}},{path:"monitoring",data:{breadcrumbs:"Cluster/Monitoring"},children:[{path:"",redirectTo:"active-alerts",pathMatch:"full"},{path:"active-alerts",data:{breadcrumbs:"Active Alerts"},component:Ey},{path:"alerts",data:{breadcrumbs:"Alerts"},component:Sb},{path:"silences",data:{breadcrumbs:"Silences"},children:[{path:"",component:My},{path:Mo.MQ.CREATE,component:_p,data:{breadcrumbs:`${Mo.Qn.CREATE} Silence`}},{path:`${Mo.MQ.CREATE}/:id`,component:_p,data:{breadcrumbs:Mo.Qn.CREATE}},{path:`${Mo.MQ.EDIT}/:id`,component:_p,data:{breadcrumbs:Mo.Qn.EDIT}},{path:`${Mo.MQ.RECREATE}/:id`,component:_p,data:{breadcrumbs:Mo.Qn.RECREATE}}]}]},{path:"perf_counters/:type/:id",component:wS,data:{breadcrumbs:e3}},{path:"mgr-modules",data:{breadcrumbs:"Cluster/Manager Modules"},children:[{path:"",component:Fh},{path:"edit/:name",component:p1,data:{breadcrumbs:t3}}]},{path:"pool",data:{breadcrumbs:"Pools"},loadChildren:()=>Promise.all([i.e(43),i.e(95)]).then(i.bind(i,38095)).then(n=>n.RoutedPoolModule)},{path:"block",data:{breadcrumbs:!0,text:"Block",path:null},loadChildren:()=>i.e(43).then(i.bind(i,21043)).then(n=>n.RoutedBlockModule)},{path:"cephfs",component:vc,canActivate:[HA.T],data:{breadcrumbs:"File Systems"}},{path:"rgw",canActivateChild:[HA.T,QE.P],data:{moduleStatusGuardConfig:{uiApiPath:"rgw",redirectTo:"error",section:"rgw",section_info:"Object Gateway",header:"The Object Gateway Service is not configured"},breadcrumbs:!0,text:"Object Gateway",path:null},loadChildren:()=>i.e(437).then(i.bind(i,34437)).then(n=>n.RoutedRgwModule)},{path:"user-management",data:{breadcrumbs:"User management",path:null},loadChildren:()=>Promise.resolve().then(i.bind(i,13140)).then(n=>n.RoutedAuthModule)},{path:"user-profile",data:{breadcrumbs:"User profile",path:null},children:[{path:Mo.MQ.EDIT,component:NS,canActivate:[qR],data:{breadcrumbs:Mo.Qn.EDIT}}]},{path:"nfs",canActivateChild:[HA.T,QE.P],data:{moduleStatusGuardConfig:{uiApiPath:"nfs-ganesha",redirectTo:"error",section:"nfs-ganesha",section_info:"NFS GANESHA",header:"NFS-Ganesha is not configured"},breadcrumbs:"NFS"},children:[{path:"",component:DS},{path:Mo.MQ.CREATE,component:ky,data:{breadcrumbs:Mo.Qn.CREATE}},{path:`${Mo.MQ.EDIT}/:cluster_id/:export_id`,component:ky,data:{breadcrumbs:Mo.Qn.EDIT}}]}]},{path:"",component:YS,children:[{path:"login",component:h2},{path:"login-change-password",component:Nv,canActivate:[qR]}]},{path:"",component:oD,children:[{path:"**",redirectTo:"/error"}]}];let CC=(()=>{class n{}return n.\u0275fac=function(t){return new(t||n)},n.\u0275mod=e.oAB({type:n}),n.\u0275inj=e.cJS({providers:[t3,e3],imports:[[Bo.Bz.forRoot(W7,{useHash:!0,preloadingStrategy:Bo.wm,relativeLinkResolution:"legacy"})],Bo.Bz]}),n})(),J7=(()=>{class n{constructor(t,o){t.autoClose="outside",t.container="body",t.placement="bottom",o.container="body"}}return n.\u0275fac=function(t){return new(t||n)(e.Y36(Dr.AX),e.Y36(Dr.xI))},n.\u0275cmp=e.Xpm({type:n,selectors:[["cd-root"]],decls:1,vars:0,template:function(t,o){1&t&&e._UZ(0,"router-outlet")},directives:[Bo.lC],styles:[""]}),n})();var Ug=i(44466);let Q7=(()=>{class n{}return n.\u0275fac=function(t){return new(t||n)},n.\u0275mod=e.oAB({type:n}),n.\u0275inj=e.cJS({imports:[[p.ez,Ug.m,CC,Ks.m9,pa.xc,Dr.Oz]]}),n})();var n3=i(66265),r3=i(370);let K7=(()=>{class n{}return n.\u0275fac=function(t){return new(t||n)},n.\u0275mod=e.oAB({type:n}),n.\u0275inj=e.cJS({imports:[[CC,p.ez,_n.UX,Ug.m,Dr.Oz]]}),n})(),X7=(()=>{class n{}return n.\u0275fac=function(t){return new(t||n)},n.\u0275mod=e.oAB({type:n}),n.\u0275inj=e.cJS({providers:[Dr.Kz],imports:[[p.ez,n3.B,Dr.Oz,Ug.m,Bo.Bz,_n.u5,_n.UX,Dr.HK,K7,Dr.ZS,Dr.UL,pa.xc,r3.t,Dr.M,Dr.dT,Dr.XC,dp.b]]}),n})(),q7=(()=>{class n{}return n.\u0275fac=function(t){return new(t||n)},n.\u0275mod=e.oAB({type:n}),n.\u0275inj=e.cJS({imports:[[r3.t,p.ez,Dr.Oz,Ug.m,Ks.m9,Bo.Bz,Dr.dT,_n.u5,_n.UX]]}),n})(),e9=(()=>{class n{}return n.\u0275fac=function(t){return new(t||n)},n.\u0275mod=e.oAB({type:n}),n.\u0275inj=e.cJS({imports:[[_n.UX,Bo.Bz,Ug.m,Dr.Oz,p.ez,Dr.ZS,Dr.HK]]}),n})(),t9=(()=>{class n{}return n.\u0275fac=function(t){return new(t||n)},n.\u0275mod=e.oAB({type:n}),n.\u0275inj=e.cJS({imports:[[p.ez,X7,q7,n3.B,Q7,e9,Ug.m]]}),n})();var n9=i(13140);let i3=(()=>{class n{}return n.\u0275fac=function(t){return new(t||n)},n.\u0275mod=e.oAB({type:n}),n.\u0275inj=e.cJS({imports:[[p.ez,n9.AuthModule,Dr.lQ,Dr.XC,CC,Ug.m,qy.t,Bo.Bz]]}),n})(),r9=(()=>{class n{}return n.\u0275fac=function(t){return new(t||n)},n.\u0275mod=e.oAB({type:n}),n.\u0275inj=e.cJS({imports:[[Dg.forRoot(),p.ez,i3,Dr.XC,Bo.Bz,Ug.m],i3]}),n})(),i9=(()=>{class n{constructor(t,o,l){this.router=t,this.authStorageService=o,this.notificationService=l}intercept(t,o){const l=t.headers.get("Accept");let _;return _=l&&l.startsWith("application/vnd.ceph.api.v")?t.clone():t.clone({setHeaders:{Accept:Dc.T.cdVersionHeader("1","0")}}),o.handle(_).pipe((0,Ov.K)(M=>{if(M instanceof y.UA){let w;switch(M.status){case 400:const N=new Jl.R,V=M.error.task;Er().isPlainObject(V)?(V.metadata.component=V.metadata.component||M.error.component,N.name=V.name,N.metadata=V.metadata):N.metadata=M.error,N.success=!1,N.exception=M.error,w=this.notificationService.notifyTask(N);break;case 401:this.authStorageService.remove(),this.router.navigate(["/login"]);break;case 403:this.router.navigate(["error"],{state:{message:"Sorry, you don\u2019t have permission to view this page or resource.",header:"Access Denied",icon:"fa fa-lock",source:"forbidden"}});break;default:w=this.prepareNotification(M)}M.preventDefault=()=>{this.notificationService.cancel(w)},M.ignoreStatusCode=function(N){this.status===N&&this.preventDefault()}}return(0,Av._)(M)}))}prepareNotification(t){return this.notificationService.show(()=>{let o="";return Er().isPlainObject(t.error)&&Er().isString(t.error.detail)?o=t.error.detail:Er().isString(t.error)?o=t.error:Er().isString(t.message)&&(o=t.message),new bv.T(Sa.k.error,`${t.status} - ${t.statusText}`,o,void 0,t.application)})}}return n.\u0275fac=function(t){return new(t||n)(e.LFG(Bo.F0),e.LFG(zi.j),e.LFG(Sl.g))},n.\u0275prov=e.Yz7({token:n,factory:n.\u0275fac,providedIn:"root"}),n})(),o9=(()=>{class n{constructor(t){this.http=t}jsError(t,o,l){return this.http.post("ui-api/logging/js-error",{url:t,message:o,stack:l})}}return n.\u0275fac=function(t){return new(t||n)(e.LFG(y.eN))},n.\u0275prov=e.Yz7({token:n,factory:n.\u0275fac,providedIn:"root"}),n})(),s9=(()=>{class n{constructor(t,o){this.injector=t,this.router=o}handleError(t){const o=this.injector.get(o9),l=window.location.href;if(o.jsError(l,t&&t.message,t&&t.stack).subscribe(),!(t.rejection instanceof Y1.s9))throw t;setTimeout(()=>this.router.navigate(["error"],{state:{message:t.rejection.message,header:t.rejection.header,icon:t.rejection.icon}}),50)}}return n.\u0275fac=function(t){return new(t||n)(e.LFG(e.zs3),e.LFG(Bo.F0))},n.\u0275prov=e.Yz7({token:n,factory:n.\u0275fac}),n})(),a9=(()=>{class n{}return n.\u0275fac=function(t){return new(t||n)},n.\u0275mod=e.oAB({type:n,bootstrap:[J7]}),n.\u0275inj=e.cJS({providers:[{provide:e.qLn,useClass:s9},{provide:y.TP,useClass:i9,multi:!0},{provide:p.mr,useValue:"/"+(window.location.pathname.split("/",1)[1]||"")}],imports:[[y.JF,c.b2,Hu,Fd.Rh.forRoot({positionClass:"toast-top-right",preventDuplicates:!0,enableHtml:!0}),CC,r9,Ug.m,t9],Ug.m]}),n})();Vy.N.production&&(0,e.G48)(),c.q6().bootstrapModule(a9).then(n=>{if((0,e.X6Q)()){const t=n.injector.get(e.z2F).components[0];(0,c.HJ)(t)}}).catch(n=>console.log(n))},77340:(m,S,i)=>{var r=i(25591),a=i(60802),f=TypeError;m.exports=function(c){if(r(c))return c;throw f(a(c)+" is not a function")}},95143:(m,S,i)=>{var r=i(25591),a=String,f=TypeError;m.exports=function(c){if("object"==typeof c||r(c))return c;throw f("Can't set "+a(c)+" as a prototype")}},24094:(m,S,i)=>{var r=i(84563),a=i(38724),f=i(52975).f,c=r("unscopables"),e=Array.prototype;null==e[c]&&f(e,c,{configurable:!0,value:a(null)}),m.exports=function(p){e[c][p]=!0}},27678:(m,S,i)=>{"use strict";var r=i(64487).charAt;m.exports=function(a,f,c){return f+(c?r(a,f).length:1)}},86063:(m,S,i)=>{var r=i(93290),a=TypeError;m.exports=function(f,c){if(r(c,f))return f;throw a("Incorrect invocation")}},21099:(m,S,i)=>{var r=i(60726),a=String,f=TypeError;m.exports=function(c){if(r(c))return c;throw f(a(c)+" is not an object")}},93241:(m,S,i)=>{var r=i(8597);m.exports=r(function(){if("function"==typeof ArrayBuffer){var a=new ArrayBuffer(8);Object.isExtensible(a)&&Object.defineProperty(a,"a",{value:8})}})},70452:(m,S,i)=>{var r=i(8643),a=i(20222),f=i(24196),c=function(e){return function(p,y,T){var z,C=r(p),R=f(C),L=a(T,R);if(e&&y!=y){for(;R>L;)if((z=C[L++])!=z)return!0}else for(;R>L;L++)if((e||L in C)&&C[L]===y)return e||L||0;return!e&&-1}};m.exports={includes:c(!0),indexOf:c(!1)}},94115:(m,S,i)=>{var r=i(29727),a=i(47964),f=i(56169),c=i(16174),e=i(24196),p=i(62889),y=a([].push),T=function(C){var R=1==C,L=2==C,z=3==C,W=4==C,J=6==C,ee=7==C,ce=5==C||J;return function(ie,U,se,ge){for(var Ve,Be,ae=c(ie),he=f(ae),be=r(U,se),we=e(he),ue=0,st=ge||p,We=R?st(ie,we):L||ee?st(ie,0):void 0;we>ue;ue++)if((ce||ue in he)&&(Be=be(Ve=he[ue],ue,ae),C))if(R)We[ue]=Be;else if(Be)switch(C){case 3:return!0;case 5:return Ve;case 6:return ue;case 2:y(We,Ve)}else switch(C){case 4:return!1;case 7:y(We,Ve)}return J?-1:z||W?W:We}};m.exports={forEach:T(0),map:T(1),filter:T(2),some:T(3),every:T(4),find:T(5),findIndex:T(6),filterReject:T(7)}},37394:(m,S,i)=>{var r=i(8597),a=i(84563),f=i(17189),c=a("species");m.exports=function(e){return f>=51||!r(function(){var p=[];return(p.constructor={})[c]=function(){return{foo:1}},1!==p[e](Boolean).foo})}},47051:(m,S,i)=>{"use strict";var r=i(8597);m.exports=function(a,f){var c=[][a];return!!c&&r(function(){c.call(null,f||function(){return 1},1)})}},14716:(m,S,i)=>{var r=i(77340),a=i(16174),f=i(56169),c=i(24196),e=TypeError,p=function(y){return function(T,C,R,L){r(C);var z=a(T),W=f(z),J=c(z),ee=y?J-1:0,ce=y?-1:1;if(R<2)for(;;){if(ee in W){L=W[ee],ee+=ce;break}if(ee+=ce,y?ee<0:J<=ee)throw e("Reduce of empty array with no initial value")}for(;y?ee>=0:J>ee;ee+=ce)ee in W&&(L=C(L,W[ee],ee,z));return L}};m.exports={left:p(!1),right:p(!0)}},32342:(m,S,i)=>{var r=i(20222),a=i(24196),f=i(45347),c=Array,e=Math.max;m.exports=function(p,y,T){for(var C=a(p),R=r(y,C),L=r(void 0===T?C:T,C),z=c(e(L-R,0)),W=0;R<L;R++,W++)f(z,W,p[R]);return z.length=W,z}},71497:(m,S,i)=>{var r=i(47883),a=i(57995),f=i(60726),e=i(84563)("species"),p=Array;m.exports=function(y){var T;return r(y)&&(a(T=y.constructor)&&(T===p||r(T.prototype))||f(T)&&null===(T=T[e]))&&(T=void 0),void 0===T?p:T}},62889:(m,S,i)=>{var r=i(71497);m.exports=function(a,f){return new(r(a))(0===f?0:f)}},56297:(m,S,i)=>{var a=i(84563)("iterator"),f=!1;try{var c=0,e={next:function(){return{done:!!c++}},return:function(){f=!0}};e[a]=function(){return this},Array.from(e,function(){throw 2})}catch(p){}m.exports=function(p,y){if(!y&&!f)return!1;var T=!1;try{var C={};C[a]=function(){return{next:function(){return{done:T=!0}}}},p(C)}catch(R){}return T}},96644:(m,S,i)=>{var r=i(47964),a=r({}.toString),f=r("".slice);m.exports=function(c){return f(a(c),8,-1)}},99420:(m,S,i)=>{var r=i(72900),a=i(25591),f=i(96644),e=i(84563)("toStringTag"),p=Object,y="Arguments"==f(function(){return arguments}());m.exports=r?f:function(C){var R,L,z;return void 0===C?"Undefined":null===C?"Null":"string"==typeof(L=function(C,R){try{return C[R]}catch(L){}}(R=p(C),e))?L:y?f(R):"Object"==(z=f(R))&&a(R.callee)?"Arguments":z}},96491:(m,S,i)=>{"use strict";var r=i(47964),a=i(41292),f=i(64238).getWeakData,c=i(86063),e=i(21099),p=i(37432),y=i(60726),T=i(53284),C=i(94115),R=i(62445),L=i(52493),z=L.set,W=L.getterFor,J=C.find,ee=C.findIndex,ce=r([].splice),ie=0,U=function(ae){return ae.frozen||(ae.frozen=new se)},se=function(){this.entries=[]},ge=function(ae,he){return J(ae.entries,function(be){return be[0]===he})};se.prototype={get:function(ae){var he=ge(this,ae);if(he)return he[1]},has:function(ae){return!!ge(this,ae)},set:function(ae,he){var be=ge(this,ae);be?be[1]=he:this.entries.push([ae,he])},delete:function(ae){var he=ee(this.entries,function(be){return be[0]===ae});return~he&&ce(this.entries,he,1),!!~he}},m.exports={getConstructor:function(ae,he,be,we){var ue=ae(function(Be,xe){c(Be,st),z(Be,{type:he,id:ie++,frozen:void 0}),p(xe)||T(xe,Be[we],{that:Be,AS_ENTRIES:be})}),st=ue.prototype,We=W(he),Ve=function(Be,xe,je){var Ne=We(Be),Bt=f(e(xe),!0);return!0===Bt?U(Ne).set(xe,je):Bt[Ne.id]=je,Be};return a(st,{delete:function(Be){var xe=We(this);if(!y(Be))return!1;var je=f(Be);return!0===je?U(xe).delete(Be):je&&R(je,xe.id)&&delete je[xe.id]},has:function(xe){var je=We(this);if(!y(xe))return!1;var Ne=f(xe);return!0===Ne?U(je).has(xe):Ne&&R(Ne,je.id)}}),a(st,be?{get:function(xe){var je=We(this);if(y(xe)){var Ne=f(xe);return!0===Ne?U(je).get(xe):Ne?Ne[je.id]:void 0}},set:function(xe,je){return Ve(this,xe,je)}}:{add:function(xe){return Ve(this,xe,!0)}}),ue}}},41603:(m,S,i)=>{"use strict";var r=i(51163),a=i(31864),f=i(47964),c=i(87215),e=i(70688),p=i(64238),y=i(53284),T=i(86063),C=i(25591),R=i(37432),L=i(60726),z=i(8597),W=i(56297),J=i(58242),ee=i(38267);m.exports=function(ce,ie,U){var se=-1!==ce.indexOf("Map"),ge=-1!==ce.indexOf("Weak"),ae=se?"set":"add",he=a[ce],be=he&&he.prototype,we=he,ue={},st=function(Bt){var rt=f(be[Bt]);e(be,Bt,"add"==Bt?function(Pt){return rt(this,0===Pt?0:Pt),this}:"delete"==Bt?function(en){return!(ge&&!L(en))&&rt(this,0===en?0:en)}:"get"==Bt?function(Pt){return ge&&!L(Pt)?void 0:rt(this,0===Pt?0:Pt)}:"has"==Bt?function(Pt){return!(ge&&!L(Pt))&&rt(this,0===Pt?0:Pt)}:function(Pt,Vt){return rt(this,0===Pt?0:Pt,Vt),this})};if(c(ce,!C(he)||!(ge||be.forEach&&!z(function(){(new he).entries().next()}))))we=U.getConstructor(ie,ce,se,ae),p.enable();else if(c(ce,!0)){var Ve=new we,Be=Ve[ae](ge?{}:-0,1)!=Ve,xe=z(function(){Ve.has(1)}),je=W(function(Bt){new he(Bt)}),Ne=!ge&&z(function(){for(var Bt=new he,rt=5;rt--;)Bt[ae](rt,rt);return!Bt.has(-0)});je||((we=ie(function(Bt,rt){T(Bt,be);var en=ee(new he,Bt,we);return R(rt)||y(rt,en[ae],{that:en,AS_ENTRIES:se}),en})).prototype=be,be.constructor=we),(xe||Ne)&&(st("delete"),st("has"),se&&st("get")),(Ne||Be)&&st(ae),ge&&be.clear&&delete be.clear}return ue[ce]=we,r({global:!0,constructor:!0,forced:we!=he},ue),J(we,ce),ge||U.setStrong(we,ce,se),we}},30009:(m,S,i)=>{var r=i(62445),a=i(99376),f=i(93099),c=i(52975);m.exports=function(e,p,y){for(var T=a(p),C=c.f,R=f.f,L=0;L<T.length;L++){var z=T[L];!r(e,z)&&(!y||!r(y,z))&&C(e,z,R(p,z))}}},51335:(m,S,i)=>{var r=i(8597);m.exports=!r(function(){function a(){}return a.prototype.constructor=null,Object.getPrototypeOf(new a)!==a.prototype})},15189:m=>{m.exports=function(S,i){return{value:S,done:i}}},815:(m,S,i)=>{var r=i(47012),a=i(52975),f=i(53203);m.exports=r?function(c,e,p){return a.f(c,e,f(1,p))}:function(c,e,p){return c[e]=p,c}},53203:m=>{m.exports=function(S,i){return{enumerable:!(1&S),configurable:!(2&S),writable:!(4&S),value:i}}},45347:(m,S,i)=>{"use strict";var r=i(16582),a=i(52975),f=i(53203);m.exports=function(c,e,p){var y=r(e);y in c?a.f(c,y,f(0,p)):c[y]=p}},48213:(m,S,i)=>{var r=i(74952),a=i(52975);m.exports=function(f,c,e){return e.get&&r(e.get,c,{getter:!0}),e.set&&r(e.set,c,{setter:!0}),a.f(f,c,e)}},70688:(m,S,i)=>{var r=i(25591),a=i(52975),f=i(74952),c=i(11996);m.exports=function(e,p,y,T){T||(T={});var C=T.enumerable,R=void 0!==T.name?T.name:p;if(r(y)&&f(y,R,T),T.global)C?e[p]=y:c(p,y);else{try{T.unsafe?e[p]&&(C=!0):delete e[p]}catch(L){}C?e[p]=y:a.f(e,p,{value:y,enumerable:!1,configurable:!T.nonConfigurable,writable:!T.nonWritable})}return e}},41292:(m,S,i)=>{var r=i(70688);m.exports=function(a,f,c){for(var e in f)r(a,e,f[e],c);return a}},11996:(m,S,i)=>{var r=i(31864),a=Object.defineProperty;m.exports=function(f,c){try{a(r,f,{value:c,configurable:!0,writable:!0})}catch(e){r[f]=c}return c}},47012:(m,S,i)=>{var r=i(8597);m.exports=!r(function(){return 7!=Object.defineProperty({},1,{get:function(){return 7}})[1]})},34550:m=>{var S="object"==typeof document&&document.all;m.exports={all:S,IS_HTMLDDA:void 0===S&&void 0!==S}},85815:(m,S,i)=>{var r=i(31864),a=i(60726),f=r.document,c=a(f)&&a(f.createElement);m.exports=function(e){return c?f.createElement(e):{}}},26877:m=>{m.exports={CSSRuleList:0,CSSStyleDeclaration:0,CSSValueList:0,ClientRectList:0,DOMRectList:0,DOMStringList:0,DOMTokenList:1,DataTransferItemList:0,FileList:0,HTMLAllCollection:0,HTMLCollection:0,HTMLFormElement:0,HTMLSelectElement:0,MediaList:0,MimeTypeArray:0,NamedNodeMap:0,NodeList:1,PaintRequestList:0,Plugin:0,PluginArray:0,SVGLengthList:0,SVGNumberList:0,SVGPathSegList:0,SVGPointList:0,SVGStringList:0,SVGTransformList:0,SourceBufferList:0,StyleSheetList:0,TextTrackCueList:0,TextTrackList:0,TouchList:0}},20713:(m,S,i)=>{var a=i(85815)("span").classList,f=a&&a.constructor&&a.constructor.prototype;m.exports=f===Object.prototype?void 0:f},32002:(m,S,i)=>{var r=i(96644);m.exports="undefined"!=typeof process&&"process"==r(process)},73792:m=>{m.exports="undefined"!=typeof navigator&&String(navigator.userAgent)||""},17189:(m,S,i)=>{var y,T,r=i(31864),a=i(73792),f=r.process,c=r.Deno,e=f&&f.versions||c&&c.version,p=e&&e.v8;p&&(T=(y=p.split("."))[0]>0&&y[0]<4?1:+(y[0]+y[1])),!T&&a&&(!(y=a.match(/Edge\/(\d+)/))||y[1]>=74)&&(y=a.match(/Chrome\/(\d+)/))&&(T=+y[1]),m.exports=T},71001:m=>{m.exports=["constructor","hasOwnProperty","isPrototypeOf","propertyIsEnumerable","toLocaleString","toString","valueOf"]},51163:(m,S,i)=>{var r=i(31864),a=i(93099).f,f=i(815),c=i(70688),e=i(11996),p=i(30009),y=i(87215);m.exports=function(T,C){var J,ee,ce,ie,U,R=T.target,L=T.global,z=T.stat;if(J=L?r:z?r[R]||e(R,{}):(r[R]||{}).prototype)for(ee in C){if(ie=C[ee],ce=T.dontCallGetSet?(U=a(J,ee))&&U.value:J[ee],!y(L?ee:R+(z?".":"#")+ee,T.forced)&&void 0!==ce){if(typeof ie==typeof ce)continue;p(ie,ce)}(T.sham||ce&&ce.sham)&&f(ie,"sham",!0),c(J,ee,ie,T)}}},8597:m=>{m.exports=function(S){try{return!!S()}catch(i){return!0}}},9357:(m,S,i)=>{"use strict";i(69665);var r=i(29263),a=i(70688),f=i(93084),c=i(8597),e=i(84563),p=i(815),y=e("species"),T=RegExp.prototype;m.exports=function(C,R,L,z){var W=e(C),J=!c(function(){var U={};return U[W]=function(){return 7},7!=""[C](U)}),ee=J&&!c(function(){var U=!1,se=/a/;return"split"===C&&((se={}).constructor={},se.constructor[y]=function(){return se},se.flags="",se[W]=/./[W]),se.exec=function(){return U=!0,null},se[W](""),!U});if(!J||!ee||L){var ce=r(/./[W]),ie=R(W,""[C],function(U,se,ge,ae,he){var be=r(U),we=se.exec;return we===f||we===T.exec?J&&!he?{done:!0,value:ce(se,ge,ae)}:{done:!0,value:be(ge,se,ae)}:{done:!1}});a(String.prototype,C,ie[0]),a(T,W,ie[1])}z&&p(T[W],"sham",!0)}},39352:(m,S,i)=>{var r=i(8597);m.exports=!r(function(){return Object.isExtensible(Object.preventExtensions({}))})},32328:(m,S,i)=>{var r=i(4459),a=Function.prototype,f=a.apply,c=a.call;m.exports="object"==typeof Reflect&&Reflect.apply||(r?c.bind(f):function(){return c.apply(f,arguments)})},29727:(m,S,i)=>{var r=i(29263),a=i(77340),f=i(4459),c=r(r.bind);m.exports=function(e,p){return a(e),void 0===p?e:f?c(e,p):function(){return e.apply(p,arguments)}}},4459:(m,S,i)=>{var r=i(8597);m.exports=!r(function(){var a=function(){}.bind();return"function"!=typeof a||a.hasOwnProperty("prototype")})},757:(m,S,i)=>{var r=i(4459),a=Function.prototype.call;m.exports=r?a.bind(a):function(){return a.apply(a,arguments)}},20538:(m,S,i)=>{var r=i(47012),a=i(62445),f=Function.prototype,c=r&&Object.getOwnPropertyDescriptor,e=a(f,"name"),p=e&&"something"===function(){}.name,y=e&&(!r||r&&c(f,"name").configurable);m.exports={EXISTS:e,PROPER:p,CONFIGURABLE:y}},56389:(m,S,i)=>{var r=i(47964),a=i(77340);m.exports=function(f,c,e){try{return r(a(Object.getOwnPropertyDescriptor(f,c)[e]))}catch(p){}}},29263:(m,S,i)=>{var r=i(96644),a=i(47964);m.exports=function(f){if("Function"===r(f))return a(f)}},47964:(m,S,i)=>{var r=i(4459),a=Function.prototype,f=a.call,c=r&&a.bind.bind(f,f);m.exports=r?c:function(e){return function(){return f.apply(e,arguments)}}},73626:(m,S,i)=>{var r=i(31864),a=i(25591),f=function(c){return a(c)?c:void 0};m.exports=function(c,e){return arguments.length<2?f(r[c]):r[c]&&r[c][e]}},63076:(m,S,i)=>{var r=i(99420),a=i(35642),f=i(37432),c=i(72339),p=i(84563)("iterator");m.exports=function(y){if(!f(y))return a(y,p)||a(y,"@@iterator")||c[r(y)]}},36414:(m,S,i)=>{var r=i(757),a=i(77340),f=i(21099),c=i(60802),e=i(63076),p=TypeError;m.exports=function(y,T){var C=arguments.length<2?e(y):T;if(a(C))return f(r(C,y));throw p(c(y)+" is not iterable")}},35642:(m,S,i)=>{var r=i(77340),a=i(37432);m.exports=function(f,c){var e=f[c];return a(e)?void 0:r(e)}},16162:(m,S,i)=>{var r=i(47964),a=i(16174),f=Math.floor,c=r("".charAt),e=r("".replace),p=r("".slice),y=/\$([$&'`]|\d{1,2}|<[^>]*>)/g,T=/\$([$&'`]|\d{1,2})/g;m.exports=function(C,R,L,z,W,J){var ee=L+C.length,ce=z.length,ie=T;return void 0!==W&&(W=a(W),ie=y),e(J,ie,function(U,se){var ge;switch(c(se,0)){case"$":return"$";case"&":return C;case"`":return p(R,0,L);case"'":return p(R,ee);case"<":ge=W[p(se,1,-1)];break;default:var ae=+se;if(0===ae)return U;if(ae>ce){var he=f(ae/10);return 0===he?U:he<=ce?void 0===z[he-1]?c(se,1):z[he-1]+c(se,1):U}ge=z[ae-1]}return void 0===ge?"":ge})}},31864:m=>{var S=function(i){return i&&i.Math==Math&&i};m.exports=S("object"==typeof globalThis&&globalThis)||S("object"==typeof window&&window)||S("object"==typeof self&&self)||S("object"==typeof global&&global)||function(){return this}()||Function("return this")()},62445:(m,S,i)=>{var r=i(47964),a=i(16174),f=r({}.hasOwnProperty);m.exports=Object.hasOwn||function(e,p){return f(a(e),p)}},3536:m=>{m.exports={}},67538:(m,S,i)=>{var r=i(73626);m.exports=r("document","documentElement")},27091:(m,S,i)=>{var r=i(47012),a=i(8597),f=i(85815);m.exports=!r&&!a(function(){return 7!=Object.defineProperty(f("div"),"a",{get:function(){return 7}}).a})},56169:(m,S,i)=>{var r=i(47964),a=i(8597),f=i(96644),c=Object,e=r("".split);m.exports=a(function(){return!c("z").propertyIsEnumerable(0)})?function(p){return"String"==f(p)?e(p,""):c(p)}:c},38267:(m,S,i)=>{var r=i(25591),a=i(60726),f=i(91464);m.exports=function(c,e,p){var y,T;return f&&r(y=e.constructor)&&y!==p&&a(T=y.prototype)&&T!==p.prototype&&f(c,T),c}},87720:(m,S,i)=>{var r=i(47964),a=i(25591),f=i(59941),c=r(Function.toString);a(f.inspectSource)||(f.inspectSource=function(e){return c(e)}),m.exports=f.inspectSource},64238:(m,S,i)=>{var r=i(51163),a=i(47964),f=i(3536),c=i(60726),e=i(62445),p=i(52975).f,y=i(94564),T=i(7388),C=i(67117),R=i(94295),L=i(39352),z=!1,W=R("meta"),J=0,ee=function(ae){p(ae,W,{value:{objectID:"O"+J++,weakData:{}}})},ge=m.exports={enable:function(){ge.enable=function(){},z=!0;var ae=y.f,he=a([].splice),be={};be[W]=1,ae(be).length&&(y.f=function(we){for(var ue=ae(we),st=0,We=ue.length;st<We;st++)if(ue[st]===W){he(ue,st,1);break}return ue},r({target:"Object",stat:!0,forced:!0},{getOwnPropertyNames:T.f}))},fastKey:function(ae,he){if(!c(ae))return"symbol"==typeof ae?ae:("string"==typeof ae?"S":"P")+ae;if(!e(ae,W)){if(!C(ae))return"F";if(!he)return"E";ee(ae)}return ae[W].objectID},getWeakData:function(ae,he){if(!e(ae,W)){if(!C(ae))return!0;if(!he)return!1;ee(ae)}return ae[W].weakData},onFreeze:function(ae){return L&&z&&C(ae)&&!e(ae,W)&&ee(ae),ae}};f[W]=!0},52493:(m,S,i)=>{var z,W,J,r=i(28095),a=i(31864),f=i(60726),c=i(815),e=i(62445),p=i(59941),y=i(42650),T=i(3536),C="Object already initialized",R=a.TypeError;if(r||p.state){var ie=p.state||(p.state=new(0,a.WeakMap));ie.get=ie.get,ie.has=ie.has,ie.set=ie.set,z=function(se,ge){if(ie.has(se))throw R(C);return ge.facade=se,ie.set(se,ge),ge},W=function(se){return ie.get(se)||{}},J=function(se){return ie.has(se)}}else{var U=y("state");T[U]=!0,z=function(se,ge){if(e(se,U))throw R(C);return ge.facade=se,c(se,U,ge),ge},W=function(se){return e(se,U)?se[U]:{}},J=function(se){return e(se,U)}}m.exports={set:z,get:W,has:J,enforce:function(se){return J(se)?W(se):z(se,{})},getterFor:function(se){return function(ge){var ae;if(!f(ge)||(ae=W(ge)).type!==se)throw R("Incompatible receiver, "+se+" required");return ae}}}},81643:(m,S,i)=>{var r=i(84563),a=i(72339),f=r("iterator"),c=Array.prototype;m.exports=function(e){return void 0!==e&&(a.Array===e||c[f]===e)}},47883:(m,S,i)=>{var r=i(96644);m.exports=Array.isArray||function(f){return"Array"==r(f)}},25591:(m,S,i)=>{var r=i(34550),a=r.all;m.exports=r.IS_HTMLDDA?function(f){return"function"==typeof f||f===a}:function(f){return"function"==typeof f}},57995:(m,S,i)=>{var r=i(47964),a=i(8597),f=i(25591),c=i(99420),e=i(73626),p=i(87720),y=function(){},T=[],C=e("Reflect","construct"),R=/^\s*(?:class|function)\b/,L=r(R.exec),z=!R.exec(y),W=function(ce){if(!f(ce))return!1;try{return C(y,T,ce),!0}catch(ie){return!1}},J=function(ce){if(!f(ce))return!1;switch(c(ce)){case"AsyncFunction":case"GeneratorFunction":case"AsyncGeneratorFunction":return!1}try{return z||!!L(R,p(ce))}catch(ie){return!0}};J.sham=!0,m.exports=!C||a(function(){var ee;return W(W.call)||!W(Object)||!W(function(){ee=!0})||ee})?J:W},87215:(m,S,i)=>{var r=i(8597),a=i(25591),f=/#|\.prototype\./,c=function(C,R){var L=p[e(C)];return L==T||L!=y&&(a(R)?r(R):!!R)},e=c.normalize=function(C){return String(C).replace(f,".").toLowerCase()},p=c.data={},y=c.NATIVE="N",T=c.POLYFILL="P";m.exports=c},37432:m=>{m.exports=function(S){return null==S}},60726:(m,S,i)=>{var r=i(25591),a=i(34550),f=a.all;m.exports=a.IS_HTMLDDA?function(c){return"object"==typeof c?null!==c:r(c)||c===f}:function(c){return"object"==typeof c?null!==c:r(c)}},97515:m=>{m.exports=!1},26186:(m,S,i)=>{var r=i(73626),a=i(25591),f=i(93290),c=i(24431),e=Object;m.exports=c?function(p){return"symbol"==typeof p}:function(p){var y=r("Symbol");return a(y)&&f(y.prototype,e(p))}},53284:(m,S,i)=>{var r=i(29727),a=i(757),f=i(21099),c=i(60802),e=i(81643),p=i(24196),y=i(93290),T=i(36414),C=i(63076),R=i(87883),L=TypeError,z=function(J,ee){this.stopped=J,this.result=ee},W=z.prototype;m.exports=function(J,ee,ce){var be,we,ue,st,We,Ve,Be,U=!(!ce||!ce.AS_ENTRIES),se=!(!ce||!ce.IS_RECORD),ge=!(!ce||!ce.IS_ITERATOR),ae=!(!ce||!ce.INTERRUPTED),he=r(ee,ce&&ce.that),xe=function(Ne){return be&&R(be,"normal",Ne),new z(!0,Ne)},je=function(Ne){return U?(f(Ne),ae?he(Ne[0],Ne[1],xe):he(Ne[0],Ne[1])):ae?he(Ne,xe):he(Ne)};if(se)be=J.iterator;else if(ge)be=J;else{if(!(we=C(J)))throw L(c(J)+" is not iterable");if(e(we)){for(ue=0,st=p(J);st>ue;ue++)if((We=je(J[ue]))&&y(W,We))return We;return new z(!1)}be=T(J,we)}for(Ve=se?J.next:be.next;!(Be=a(Ve,be)).done;){try{We=je(Be.value)}catch(Ne){R(be,"throw",Ne)}if("object"==typeof We&&We&&y(W,We))return We}return new z(!1)}},87883:(m,S,i)=>{var r=i(757),a=i(21099),f=i(35642);m.exports=function(c,e,p){var y,T;a(c);try{if(!(y=f(c,"return"))){if("throw"===e)throw p;return p}y=r(y,c)}catch(C){T=!0,y=C}if("throw"===e)throw p;if(T)throw y;return a(y),p}},30281:(m,S,i)=>{"use strict";var r=i(92053).IteratorPrototype,a=i(38724),f=i(53203),c=i(58242),e=i(72339),p=function(){return this};m.exports=function(y,T,C,R){var L=T+" Iterator";return y.prototype=a(r,{next:f(+!R,C)}),c(y,L,!1,!0),e[L]=p,y}},43291:(m,S,i)=>{"use strict";var r=i(51163),a=i(757),f=i(97515),c=i(20538),e=i(25591),p=i(30281),y=i(3963),T=i(91464),C=i(58242),R=i(815),L=i(70688),z=i(84563),W=i(72339),J=i(92053),ee=c.PROPER,ce=c.CONFIGURABLE,ie=J.IteratorPrototype,U=J.BUGGY_SAFARI_ITERATORS,se=z("iterator"),ae="values",he="entries",be=function(){return this};m.exports=function(we,ue,st,We,Ve,Be,xe){p(st,ue,We);var hn,vn,mt,je=function(Nt){if(Nt===Ve&&Pt)return Pt;if(!U&&Nt in rt)return rt[Nt];switch(Nt){case"keys":case ae:case he:return function(){return new st(this,Nt)}}return function(){return new st(this)}},Ne=ue+" Iterator",Bt=!1,rt=we.prototype,en=rt[se]||rt["@@iterator"]||Ve&&rt[Ve],Pt=!U&&en||je(Ve),Vt="Array"==ue&&rt.entries||en;if(Vt&&(hn=y(Vt.call(new we)))!==Object.prototype&&hn.next&&(!f&&y(hn)!==ie&&(T?T(hn,ie):e(hn[se])||L(hn,se,be)),C(hn,Ne,!0,!0),f&&(W[Ne]=be)),ee&&Ve==ae&&en&&en.name!==ae&&(!f&&ce?R(rt,"name",ae):(Bt=!0,Pt=function(){return a(en,this)})),Ve)if(vn={values:je(ae),keys:Be?Pt:je("keys"),entries:je(he)},xe)for(mt in vn)(U||Bt||!(mt in rt))&&L(rt,mt,vn[mt]);else r({target:ue,proto:!0,forced:U||Bt},vn);return(!f||xe)&&rt[se]!==Pt&&L(rt,se,Pt,{name:Ve}),W[ue]=Pt,vn}},92053:(m,S,i)=>{"use strict";var L,z,W,r=i(8597),a=i(25591),f=i(60726),c=i(38724),e=i(3963),p=i(70688),y=i(84563),T=i(97515),C=y("iterator"),R=!1;[].keys&&("next"in(W=[].keys())?(z=e(e(W)))!==Object.prototype&&(L=z):R=!0),!f(L)||r(function(){var ee={};return L[C].call(ee)!==ee})?L={}:T&&(L=c(L)),a(L[C])||p(L,C,function(){return this}),m.exports={IteratorPrototype:L,BUGGY_SAFARI_ITERATORS:R}},72339:m=>{m.exports={}},24196:(m,S,i)=>{var r=i(15902);m.exports=function(a){return r(a.length)}},74952:(m,S,i)=>{var r=i(47964),a=i(8597),f=i(25591),c=i(62445),e=i(47012),p=i(20538).CONFIGURABLE,y=i(87720),T=i(52493),C=T.enforce,R=T.get,L=String,z=Object.defineProperty,W=r("".slice),J=r("".replace),ee=r([].join),ce=e&&!a(function(){return 8!==z(function(){},"length",{value:8}).length}),ie=String(String).split("String"),U=m.exports=function(se,ge,ae){"Symbol("===W(L(ge),0,7)&&(ge="["+J(L(ge),/^Symbol\(([^)]*)\)/,"$1")+"]"),ae&&ae.getter&&(ge="get "+ge),ae&&ae.setter&&(ge="set "+ge),(!c(se,"name")||p&&se.name!==ge)&&(e?z(se,"name",{value:ge,configurable:!0}):se.name=ge),ce&&ae&&c(ae,"arity")&&se.length!==ae.arity&&z(se,"length",{value:ae.arity});try{ae&&c(ae,"constructor")&&ae.constructor?e&&z(se,"prototype",{writable:!1}):se.prototype&&(se.prototype=void 0)}catch(be){}var he=C(se);return c(he,"source")||(he.source=ee(ie,"string"==typeof ge?ge:"")),se};Function.prototype.toString=U(function(){return f(this)&&R(this).source||y(this)},"toString")},58194:m=>{var S=Math.ceil,i=Math.floor;m.exports=Math.trunc||function(a){var f=+a;return(f>0?i:S)(f)}},43656:(m,S,i)=>{var r=i(31864),a=i(8597),f=i(47964),c=i(73574),e=i(51664).trim,p=i(48004),y=r.parseInt,T=r.Symbol,C=T&&T.iterator,R=/^[+-]?0x/i,L=f(R.exec),z=8!==y(p+"08")||22!==y(p+"0x16")||C&&!a(function(){y(Object(C))});m.exports=z?function(J,ee){var ce=e(c(J));return y(ce,ee>>>0||(L(R,ce)?16:10))}:y},51746:(m,S,i)=>{"use strict";var r=i(47012),a=i(47964),f=i(757),c=i(8597),e=i(68032),p=i(77593),y=i(5600),T=i(16174),C=i(56169),R=Object.assign,L=Object.defineProperty,z=a([].concat);m.exports=!R||c(function(){if(r&&1!==R({b:1},R(L({},"a",{enumerable:!0,get:function(){L(this,"b",{value:3,enumerable:!1})}}),{b:2})).b)return!0;var W={},J={},ee=Symbol(),ce="abcdefghijklmnopqrst";return W[ee]=7,ce.split("").forEach(function(ie){J[ie]=ie}),7!=R({},W)[ee]||e(R({},J)).join("")!=ce})?function(J,ee){for(var ce=T(J),ie=arguments.length,U=1,se=p.f,ge=y.f;ie>U;)for(var ue,ae=C(arguments[U++]),he=se?z(e(ae),se(ae)):e(ae),be=he.length,we=0;be>we;)ue=he[we++],(!r||f(ge,ae,ue))&&(ce[ue]=ae[ue]);return ce}:R},38724:(m,S,i)=>{var ie,r=i(21099),a=i(10988),f=i(71001),c=i(3536),e=i(67538),p=i(85815),y=i(42650),R="prototype",L="script",z=y("IE_PROTO"),W=function(){},J=function(se){return"<"+L+">"+se+"</"+L+">"},ee=function(se){se.write(J("")),se.close();var ge=se.parentWindow.Object;return se=null,ge},U=function(){try{ie=new ActiveXObject("htmlfile")}catch(ge){}U="undefined"!=typeof document?document.domain&&ie?ee(ie):function(){var ae,se=p("iframe");return se.style.display="none",e.appendChild(se),se.src=String("javascript:"),(ae=se.contentWindow.document).open(),ae.write(J("document.F=Object")),ae.close(),ae.F}():ee(ie);for(var se=f.length;se--;)delete U[R][f[se]];return U()};c[z]=!0,m.exports=Object.create||function(ge,ae){var he;return null!==ge?(W[R]=r(ge),he=new W,W[R]=null,he[z]=ge):he=U(),void 0===ae?he:a.f(he,ae)}},10988:(m,S,i)=>{var r=i(47012),a=i(52339),f=i(52975),c=i(21099),e=i(8643),p=i(68032);S.f=r&&!a?Object.defineProperties:function(T,C){c(T);for(var J,R=e(C),L=p(C),z=L.length,W=0;z>W;)f.f(T,J=L[W++],R[J]);return T}},52975:(m,S,i)=>{var r=i(47012),a=i(27091),f=i(52339),c=i(21099),e=i(16582),p=TypeError,y=Object.defineProperty,T=Object.getOwnPropertyDescriptor,C="enumerable",R="configurable",L="writable";S.f=r?f?function(W,J,ee){if(c(W),J=e(J),c(ee),"function"==typeof W&&"prototype"===J&&"value"in ee&&L in ee&&!ee[L]){var ce=T(W,J);ce&&ce[L]&&(W[J]=ee.value,ee={configurable:R in ee?ee[R]:ce[R],enumerable:C in ee?ee[C]:ce[C],writable:!1})}return y(W,J,ee)}:y:function(W,J,ee){if(c(W),J=e(J),c(ee),a)try{return y(W,J,ee)}catch(ce){}if("get"in ee||"set"in ee)throw p("Accessors not supported");return"value"in ee&&(W[J]=ee.value),W}},93099:(m,S,i)=>{var r=i(47012),a=i(757),f=i(5600),c=i(53203),e=i(8643),p=i(16582),y=i(62445),T=i(27091),C=Object.getOwnPropertyDescriptor;S.f=r?C:function(L,z){if(L=e(L),z=p(z),T)try{return C(L,z)}catch(W){}if(y(L,z))return c(!a(f.f,L,z),L[z])}},7388:(m,S,i)=>{var r=i(96644),a=i(8643),f=i(94564).f,c=i(32342),e="object"==typeof window&&window&&Object.getOwnPropertyNames?Object.getOwnPropertyNames(window):[];m.exports.f=function(T){return e&&"Window"==r(T)?function(y){try{return f(y)}catch(T){return c(e)}}(T):f(a(T))}},94564:(m,S,i)=>{var r=i(77759),f=i(71001).concat("length","prototype");S.f=Object.getOwnPropertyNames||function(e){return r(e,f)}},77593:(m,S)=>{S.f=Object.getOwnPropertySymbols},3963:(m,S,i)=>{var r=i(62445),a=i(25591),f=i(16174),c=i(42650),e=i(51335),p=c("IE_PROTO"),y=Object,T=y.prototype;m.exports=e?y.getPrototypeOf:function(C){var R=f(C);if(r(R,p))return R[p];var L=R.constructor;return a(L)&&R instanceof L?L.prototype:R instanceof y?T:null}},67117:(m,S,i)=>{var r=i(8597),a=i(60726),f=i(96644),c=i(93241),e=Object.isExtensible,p=r(function(){e(1)});m.exports=p||c?function(T){return!(!a(T)||c&&"ArrayBuffer"==f(T))&&(!e||e(T))}:e},93290:(m,S,i)=>{var r=i(47964);m.exports=r({}.isPrototypeOf)},77759:(m,S,i)=>{var r=i(47964),a=i(62445),f=i(8643),c=i(70452).indexOf,e=i(3536),p=r([].push);m.exports=function(y,T){var z,C=f(y),R=0,L=[];for(z in C)!a(e,z)&&a(C,z)&&p(L,z);for(;T.length>R;)a(C,z=T[R++])&&(~c(L,z)||p(L,z));return L}},68032:(m,S,i)=>{var r=i(77759),a=i(71001);m.exports=Object.keys||function(c){return r(c,a)}},5600:(m,S)=>{"use strict";var i={}.propertyIsEnumerable,r=Object.getOwnPropertyDescriptor,a=r&&!i.call({1:2},1);S.f=a?function(c){var e=r(this,c);return!!e&&e.enumerable}:i},91464:(m,S,i)=>{var r=i(56389),a=i(21099),f=i(95143);m.exports=Object.setPrototypeOf||("__proto__"in{}?function(){var p,c=!1,e={};try{(p=r(Object.prototype,"__proto__","set"))(e,[]),c=e instanceof Array}catch(y){}return function(T,C){return a(T),f(C),c?p(T,C):T.__proto__=C,T}}():void 0)},83119:(m,S,i)=>{"use strict";var r=i(72900),a=i(99420);m.exports=r?{}.toString:function(){return"[object "+a(this)+"]"}},48297:(m,S,i)=>{var r=i(757),a=i(25591),f=i(60726),c=TypeError;m.exports=function(e,p){var y,T;if("string"===p&&a(y=e.toString)&&!f(T=r(y,e))||a(y=e.valueOf)&&!f(T=r(y,e))||"string"!==p&&a(y=e.toString)&&!f(T=r(y,e)))return T;throw c("Can't convert object to primitive value")}},99376:(m,S,i)=>{var r=i(73626),a=i(47964),f=i(94564),c=i(77593),e=i(21099),p=a([].concat);m.exports=r("Reflect","ownKeys")||function(T){var C=f.f(e(T)),R=c.f;return R?p(C,R(T)):C}},53793:(m,S,i)=>{var r=i(757),a=i(21099),f=i(25591),c=i(96644),e=i(93084),p=TypeError;m.exports=function(y,T){var C=y.exec;if(f(C)){var R=r(C,y,T);return null!==R&&a(R),R}if("RegExp"===c(y))return r(e,y,T);throw p("RegExp#exec called on incompatible receiver")}},93084:(m,S,i)=>{"use strict";var he,be,r=i(757),a=i(47964),f=i(73574),c=i(41891),e=i(29895),p=i(77719),y=i(38724),T=i(52493).get,C=i(38126),R=i(31053),L=p("native-string-replace",String.prototype.replace),z=RegExp.prototype.exec,W=z,J=a("".charAt),ee=a("".indexOf),ce=a("".replace),ie=a("".slice),U=(be=/b*/g,r(z,he=/a/,"a"),r(z,be,"a"),0!==he.lastIndex||0!==be.lastIndex),se=e.BROKEN_CARET,ge=void 0!==/()??/.exec("")[1];(U||ge||se||C||R)&&(W=function(be){var Ve,Be,xe,je,Ne,Bt,rt,we=this,ue=T(we),st=f(be),We=ue.raw;if(We)return We.lastIndex=we.lastIndex,Ve=r(W,We,st),we.lastIndex=We.lastIndex,Ve;var en=ue.groups,Pt=se&&we.sticky,Vt=r(c,we),hn=we.source,vn=0,mt=st;if(Pt&&(Vt=ce(Vt,"y",""),-1===ee(Vt,"g")&&(Vt+="g"),mt=ie(st,we.lastIndex),we.lastIndex>0&&(!we.multiline||we.multiline&&"\n"!==J(st,we.lastIndex-1))&&(hn="(?: "+hn+")",mt=" "+mt,vn++),Be=new RegExp("^(?:"+hn+")",Vt)),ge&&(Be=new RegExp("^"+hn+"$(?!\\s)",Vt)),U&&(xe=we.lastIndex),je=r(z,Pt?Be:we,mt),Pt?je?(je.input=ie(je.input,vn),je[0]=ie(je[0],vn),je.index=we.lastIndex,we.lastIndex+=je[0].length):we.lastIndex=0:U&&je&&(we.lastIndex=we.global?je.index+je[0].length:xe),ge&&je&&je.length>1&&r(L,je[0],Be,function(){for(Ne=1;Ne<arguments.length-2;Ne++)void 0===arguments[Ne]&&(je[Ne]=void 0)}),je&&en)for(je.groups=Bt=y(null),Ne=0;Ne<en.length;Ne++)Bt[(rt=en[Ne])[0]]=je[rt[1]];return je}),m.exports=W},41891:(m,S,i)=>{"use strict";var r=i(21099);m.exports=function(){var a=r(this),f="";return a.hasIndices&&(f+="d"),a.global&&(f+="g"),a.ignoreCase&&(f+="i"),a.multiline&&(f+="m"),a.dotAll&&(f+="s"),a.unicode&&(f+="u"),a.unicodeSets&&(f+="v"),a.sticky&&(f+="y"),f}},29895:(m,S,i)=>{var r=i(8597),f=i(31864).RegExp,c=r(function(){var y=f("a","y");return y.lastIndex=2,null!=y.exec("abcd")}),e=c||r(function(){return!f("a","y").sticky}),p=c||r(function(){var y=f("^r","gy");return y.lastIndex=2,null!=y.exec("str")});m.exports={BROKEN_CARET:p,MISSED_STICKY:e,UNSUPPORTED_Y:c}},38126:(m,S,i)=>{var r=i(8597),f=i(31864).RegExp;m.exports=r(function(){var c=f(".","s");return!(c.dotAll&&c.exec("\n")&&"s"===c.flags)})},31053:(m,S,i)=>{var r=i(8597),f=i(31864).RegExp;m.exports=r(function(){var c=f("(?<a>b)","g");return"b"!==c.exec("b").groups.a||"bc"!=="b".replace(c,"$<a>c")})},95025:(m,S,i)=>{var r=i(37432),a=TypeError;m.exports=function(f){if(r(f))throw a("Can't call method on "+f);return f}},58242:(m,S,i)=>{var r=i(52975).f,a=i(62445),c=i(84563)("toStringTag");m.exports=function(e,p,y){e&&!y&&(e=e.prototype),e&&!a(e,c)&&r(e,c,{configurable:!0,value:p})}},42650:(m,S,i)=>{var r=i(77719),a=i(94295),f=r("keys");m.exports=function(c){return f[c]||(f[c]=a(c))}},59941:(m,S,i)=>{var r=i(31864),a=i(11996),f="__core-js_shared__",c=r[f]||a(f,{});m.exports=c},77719:(m,S,i)=>{var r=i(97515),a=i(59941);(m.exports=function(f,c){return a[f]||(a[f]=void 0!==c?c:{})})("versions",[]).push({version:"3.29.0",mode:r?"pure":"global",copyright:"\xa9 2014-2023 Denis Pushkarev (zloirock.ru)",license:"https://github.com/zloirock/core-js/blob/v3.29.0/LICENSE",source:"https://github.com/zloirock/core-js"})},64487:(m,S,i)=>{var r=i(47964),a=i(22157),f=i(73574),c=i(95025),e=r("".charAt),p=r("".charCodeAt),y=r("".slice),T=function(C){return function(R,L){var ee,ce,z=f(c(R)),W=a(L),J=z.length;return W<0||W>=J?C?"":void 0:(ee=p(z,W))<55296||ee>56319||W+1===J||(ce=p(z,W+1))<56320||ce>57343?C?e(z,W):ee:C?y(z,W,W+2):ce-56320+(ee-55296<<10)+65536}};m.exports={codeAt:T(!1),charAt:T(!0)}},51664:(m,S,i)=>{var r=i(47964),a=i(95025),f=i(73574),c=i(48004),e=r("".replace),p=RegExp("^["+c+"]+"),y=RegExp("(^|[^"+c+"])["+c+"]+$"),T=function(C){return function(R){var L=f(a(R));return 1&C&&(L=e(L,p,"")),2&C&&(L=e(L,y,"$1")),L}};m.exports={start:T(1),end:T(2),trim:T(3)}},33021:(m,S,i)=>{var r=i(17189),a=i(8597);m.exports=!!Object.getOwnPropertySymbols&&!a(function(){var f=Symbol();return!String(f)||!(Object(f)instanceof Symbol)||!Symbol.sham&&r&&r<41})},20222:(m,S,i)=>{var r=i(22157),a=Math.max,f=Math.min;m.exports=function(c,e){var p=r(c);return p<0?a(p+e,0):f(p,e)}},8643:(m,S,i)=>{var r=i(56169),a=i(95025);m.exports=function(f){return r(a(f))}},22157:(m,S,i)=>{var r=i(58194);m.exports=function(a){var f=+a;return f!=f||0===f?0:r(f)}},15902:(m,S,i)=>{var r=i(22157),a=Math.min;m.exports=function(f){return f>0?a(r(f),9007199254740991):0}},16174:(m,S,i)=>{var r=i(95025),a=Object;m.exports=function(f){return a(r(f))}},28495:(m,S,i)=>{var r=i(757),a=i(60726),f=i(26186),c=i(35642),e=i(48297),p=i(84563),y=TypeError,T=p("toPrimitive");m.exports=function(C,R){if(!a(C)||f(C))return C;var z,L=c(C,T);if(L){if(void 0===R&&(R="default"),z=r(L,C,R),!a(z)||f(z))return z;throw y("Can't convert object to primitive value")}return void 0===R&&(R="number"),e(C,R)}},16582:(m,S,i)=>{var r=i(28495),a=i(26186);m.exports=function(f){var c=r(f,"string");return a(c)?c:c+""}},72900:(m,S,i)=>{var f={};f[i(84563)("toStringTag")]="z",m.exports="[object z]"===String(f)},73574:(m,S,i)=>{var r=i(99420),a=String;m.exports=function(f){if("Symbol"===r(f))throw TypeError("Cannot convert a Symbol value to a string");return a(f)}},60802:m=>{var S=String;m.exports=function(i){try{return S(i)}catch(r){return"Object"}}},94295:(m,S,i)=>{var r=i(47964),a=0,f=Math.random(),c=r(1..toString);m.exports=function(e){return"Symbol("+(void 0===e?"":e)+")_"+c(++a+f,36)}},24431:(m,S,i)=>{var r=i(33021);m.exports=r&&!Symbol.sham&&"symbol"==typeof Symbol.iterator},52339:(m,S,i)=>{var r=i(47012),a=i(8597);m.exports=r&&a(function(){return 42!=Object.defineProperty(function(){},"prototype",{value:42,writable:!1}).prototype})},28095:(m,S,i)=>{var r=i(31864),a=i(25591),f=r.WeakMap;m.exports=a(f)&&/native code/.test(String(f))},84563:(m,S,i)=>{var r=i(31864),a=i(77719),f=i(62445),c=i(94295),e=i(33021),p=i(24431),y=r.Symbol,T=a("wks"),C=p?y.for||y:y&&y.withoutSetter||c;m.exports=function(R){return f(T,R)||(T[R]=e&&f(y,R)?y[R]:C("Symbol."+R)),T[R]}},48004:m=>{m.exports="\t\n\v\f\r \xa0\u1680\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200a\u202f\u205f\u3000\u2028\u2029\ufeff"},85443:(m,S,i)=>{"use strict";var r=i(51163),a=i(94115).filter;r({target:"Array",proto:!0,forced:!i(37394)("filter")},{filter:function(p){return a(this,p,arguments.length>1?arguments[1]:void 0)}})},66837:(m,S,i)=>{"use strict";var r=i(8643),a=i(24094),f=i(72339),c=i(52493),e=i(52975).f,p=i(43291),y=i(15189),T=i(97515),C=i(47012),R="Array Iterator",L=c.set,z=c.getterFor(R);m.exports=p(Array,"Array",function(J,ee){L(this,{type:R,target:r(J),index:0,kind:ee})},function(){var J=z(this),ee=J.target,ce=J.kind,ie=J.index++;return!ee||ie>=ee.length?(J.target=void 0,y(void 0,!0)):y("keys"==ce?ie:"values"==ce?ee[ie]:[ie,ee[ie]],!1)},"values");var W=f.Arguments=f.Array;if(a("keys"),a("values"),a("entries"),!T&&C&&"values"!==W.name)try{e(W,"name",{value:"values"})}catch(J){}},35319:(m,S,i)=>{"use strict";var r=i(51163),a=i(14716).left,f=i(47051),c=i(17189);r({target:"Array",proto:!0,forced:!i(32002)&&c>79&&c<83||!f("reduce")},{reduce:function(C){var R=arguments.length;return a(this,C,R,R>1?arguments[1]:void 0)}})},80477:(m,S,i)=>{var r=i(47012),a=i(20538).EXISTS,f=i(47964),c=i(48213),e=Function.prototype,p=f(e.toString),y=/function\b(?:\s|\/\*[\S\s]*?\*\/|\/\/[^\n\r]*[\n\r]+)*([^\s(/]*)/,T=f(y.exec);r&&!a&&c(e,"name",{configurable:!0,get:function(){try{return T(y,p(this))[1]}catch(R){return""}}})},8868:(m,S,i)=>{var r=i(51163),a=i(51746);r({target:"Object",stat:!0,arity:2,forced:Object.assign!==a},{assign:a})},35704:(m,S,i)=>{var r=i(72900),a=i(70688),f=i(83119);r||a(Object.prototype,"toString",f,{unsafe:!0})},21581:(m,S,i)=>{var r=i(51163),a=i(43656);r({global:!0,forced:parseInt!=a},{parseInt:a})},69665:(m,S,i)=>{"use strict";var r=i(51163),a=i(93084);r({target:"RegExp",proto:!0,forced:/./.exec!==a},{exec:a})},13744:(m,S,i)=>{"use strict";var r=i(64487).charAt,a=i(73574),f=i(52493),c=i(43291),e=i(15189),p="String Iterator",y=f.set,T=f.getterFor(p);c(String,"String",function(C){y(this,{type:p,string:a(C),index:0})},function(){var W,R=T(this),L=R.string,z=R.index;return z>=L.length?e(void 0,!0):(W=r(L,z),R.index+=W.length,e(W,!1))})},26954:(m,S,i)=>{"use strict";var r=i(757),a=i(9357),f=i(21099),c=i(37432),e=i(15902),p=i(73574),y=i(95025),T=i(35642),C=i(27678),R=i(53793);a("match",function(L,z,W){return[function(ee){var ce=y(this),ie=c(ee)?void 0:T(ee,L);return ie?r(ie,ee,ce):new RegExp(ee)[L](p(ce))},function(J){var ee=f(this),ce=p(J),ie=W(z,ee,ce);if(ie.done)return ie.value;if(!ee.global)return R(ee,ce);var U=ee.unicode;ee.lastIndex=0;for(var ae,se=[],ge=0;null!==(ae=R(ee,ce));){var he=p(ae[0]);se[ge]=he,""===he&&(ee.lastIndex=C(ce,e(ee.lastIndex),U)),ge++}return 0===ge?null:se}]})},66262:(m,S,i)=>{"use strict";var r=i(32328),a=i(757),f=i(47964),c=i(9357),e=i(8597),p=i(21099),y=i(25591),T=i(37432),C=i(22157),R=i(15902),L=i(73574),z=i(95025),W=i(27678),J=i(35642),ee=i(16162),ce=i(53793),U=i(84563)("replace"),se=Math.max,ge=Math.min,ae=f([].concat),he=f([].push),be=f("".indexOf),we=f("".slice),ue=function(Be){return void 0===Be?Be:String(Be)},st="$0"==="a".replace(/./,"$0"),We=!!/./[U]&&""===/./[U]("a","$0");c("replace",function(Be,xe,je){var Ne=We?"$":"$0";return[function(rt,en){var Pt=z(this),Vt=T(rt)?void 0:J(rt,U);return Vt?a(Vt,rt,Pt,en):a(xe,L(Pt),rt,en)},function(Bt,rt){var en=p(this),Pt=L(Bt);if("string"==typeof rt&&-1===be(rt,Ne)&&-1===be(rt,"$<")){var Vt=je(xe,en,Pt,rt);if(Vt.done)return Vt.value}var hn=y(rt);hn||(rt=L(rt));var vn=en.global;if(vn){var mt=en.unicode;en.lastIndex=0}for(var Nt=[];;){var St=ce(en,Pt);if(null===St||(he(Nt,St),!vn))break;""===L(St[0])&&(en.lastIndex=W(Pt,R(en.lastIndex),mt))}for(var Fn="",pr=0,Ei=0;Ei<Nt.length;Ei++){for(var mi=L((St=Nt[Ei])[0]),ur=se(ge(C(St.index),Pt.length),0),$r=[],Br=1;Br<St.length;Br++)he($r,ue(St[Br]));var Pn=St.groups;if(hn){var Xn=ae([mi],$r,ur,Pt);void 0!==Pn&&he(Xn,Pn);var dr=L(r(rt,void 0,Xn))}else dr=ee(mi,Pt,ur,$r,Pn,rt);ur>=pr&&(Fn+=we(Pt,pr,ur)+dr,pr=ur+mi.length)}return Fn+we(Pt,pr)}]},!!e(function(){var Be=/./;return Be.exec=function(){var xe=[];return xe.groups={a:"7"},xe},"7"!=="".replace(Be,"$<a>")})||!st||We)},62913:(m,S,i)=>{"use strict";var he,r=i(39352),a=i(31864),f=i(47964),c=i(41292),e=i(64238),p=i(41603),y=i(96491),T=i(60726),C=i(52493).enforce,R=i(8597),L=i(28095),z=Object,W=Array.isArray,J=z.isExtensible,ee=z.isFrozen,ce=z.isSealed,ie=z.freeze,U=z.seal,se={},ge={},ae=!a.ActiveXObject&&"ActiveXObject"in a,be=function(je){return function(){return je(this,arguments.length?arguments[0]:void 0)}},we=p("WeakMap",be,y),ue=we.prototype,st=f(ue.set);if(L)if(ae){he=y.getConstructor(be,"WeakMap",!0),e.enable();var Ve=f(ue.delete),Be=f(ue.has),xe=f(ue.get);c(ue,{delete:function(je){if(T(je)&&!J(je)){var Ne=C(this);return Ne.frozen||(Ne.frozen=new he),Ve(this,je)||Ne.frozen.delete(je)}return Ve(this,je)},has:function(Ne){if(T(Ne)&&!J(Ne)){var Bt=C(this);return Bt.frozen||(Bt.frozen=new he),Be(this,Ne)||Bt.frozen.has(Ne)}return Be(this,Ne)},get:function(Ne){if(T(Ne)&&!J(Ne)){var Bt=C(this);return Bt.frozen||(Bt.frozen=new he),Be(this,Ne)?xe(this,Ne):Bt.frozen.get(Ne)}return xe(this,Ne)},set:function(Ne,Bt){if(T(Ne)&&!J(Ne)){var rt=C(this);rt.frozen||(rt.frozen=new he),Be(this,Ne)?st(this,Ne,Bt):rt.frozen.set(Ne,Bt)}else st(this,Ne,Bt);return this}})}else r&&R(function(){var je=ie([]);return st(new we,je,1),!ee(je)})&&c(ue,{set:function(Ne,Bt){var rt;return W(Ne)&&(ee(Ne)?rt=se:ce(Ne)&&(rt=ge)),st(this,Ne,Bt),rt==se&&ie(Ne),rt==ge&&U(Ne),this}})},63438:(m,S,i)=>{i(62913)},22603:(m,S,i)=>{var r=i(31864),a=i(26877),f=i(20713),c=i(66837),e=i(815),p=i(84563),y=p("iterator"),T=p("toStringTag"),C=c.values,R=function(z,W){if(z){if(z[y]!==C)try{e(z,y,C)}catch(ee){z[y]=C}if(z[T]||e(z,T,W),a[W])for(var J in c)if(z[J]!==c[J])try{e(z,J,c[J])}catch(ee){z[J]=c[J]}}};for(var L in a)R(r[L]&&r[L].prototype,L);R(f,"DOMTokenList")},64762:(m,S,i)=>{"use strict";i.d(S,{ZT:()=>a,_T:()=>c,fM:()=>p,gn:()=>e,pi:()=>f,w6:()=>y});var r=function(We,Ve){return(r=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(Be,xe){Be.__proto__=xe}||function(Be,xe){for(var je in xe)Object.prototype.hasOwnProperty.call(xe,je)&&(Be[je]=xe[je])})(We,Ve)};function a(We,Ve){if("function"!=typeof Ve&&null!==Ve)throw new TypeError("Class extends value "+String(Ve)+" is not a constructor or null");function Be(){this.constructor=We}r(We,Ve),We.prototype=null===Ve?Object.create(Ve):(Be.prototype=Ve.prototype,new Be)}var f=function(){return f=Object.assign||function(Ve){for(var Be,xe=1,je=arguments.length;xe<je;xe++)for(var Ne in Be=arguments[xe])Object.prototype.hasOwnProperty.call(Be,Ne)&&(Ve[Ne]=Be[Ne]);return Ve},f.apply(this,arguments)};function c(We,Ve){var Be={};for(var xe in We)Object.prototype.hasOwnProperty.call(We,xe)&&Ve.indexOf(xe)<0&&(Be[xe]=We[xe]);if(null!=We&&"function"==typeof Object.getOwnPropertySymbols){var je=0;for(xe=Object.getOwnPropertySymbols(We);je<xe.length;je++)Ve.indexOf(xe[je])<0&&Object.prototype.propertyIsEnumerable.call(We,xe[je])&&(Be[xe[je]]=We[xe[je]])}return Be}function e(We,Ve,Be,xe){var Bt,je=arguments.length,Ne=je<3?Ve:null===xe?xe=Object.getOwnPropertyDescriptor(Ve,Be):xe;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)Ne=Reflect.decorate(We,Ve,Be,xe);else for(var rt=We.length-1;rt>=0;rt--)(Bt=We[rt])&&(Ne=(je<3?Bt(Ne):je>3?Bt(Ve,Be,Ne):Bt(Ve,Be))||Ne);return je>3&&Ne&&Object.defineProperty(Ve,Be,Ne),Ne}function p(We,Ve){return function(Be,xe){Ve(Be,xe,We)}}function y(We,Ve){if("object"==typeof Reflect&&"function"==typeof Reflect.metadata)return Reflect.metadata(We,Ve)}},46700:(m,S,i)=>{var r={"./af":26431,"./af.js":26431,"./ar":81286,"./ar-dz":1616,"./ar-dz.js":1616,"./ar-kw":9759,"./ar-kw.js":9759,"./ar-ly":43160,"./ar-ly.js":43160,"./ar-ma":62551,"./ar-ma.js":62551,"./ar-sa":79989,"./ar-sa.js":79989,"./ar-tn":6962,"./ar-tn.js":6962,"./ar.js":81286,"./az":15887,"./az.js":15887,"./be":14572,"./be.js":14572,"./bg":3276,"./bg.js":3276,"./bm":93344,"./bm.js":93344,"./bn":58985,"./bn-bd":83990,"./bn-bd.js":83990,"./bn.js":58985,"./bo":94391,"./bo.js":94391,"./br":46728,"./br.js":46728,"./bs":5536,"./bs.js":5536,"./ca":41043,"./ca.js":41043,"./cs":70420,"./cs.js":70420,"./cv":33513,"./cv.js":33513,"./cy":6771,"./cy.js":6771,"./da":47978,"./da.js":47978,"./de":46061,"./de-at":25204,"./de-at.js":25204,"./de-ch":2653,"./de-ch.js":2653,"./de.js":46061,"./dv":85,"./dv.js":85,"./el":8579,"./el.js":8579,"./en-au":25724,"./en-au.js":25724,"./en-ca":10525,"./en-ca.js":10525,"./en-gb":52847,"./en-gb.js":52847,"./en-ie":67216,"./en-ie.js":67216,"./en-il":39305,"./en-il.js":39305,"./en-in":73364,"./en-in.js":73364,"./en-nz":79130,"./en-nz.js":79130,"./en-sg":11161,"./en-sg.js":11161,"./eo":50802,"./eo.js":50802,"./es":40328,"./es-do":45551,"./es-do.js":45551,"./es-mx":75615,"./es-mx.js":75615,"./es-us":64790,"./es-us.js":64790,"./es.js":40328,"./et":96389,"./et.js":96389,"./eu":52961,"./eu.js":52961,"./fa":26151,"./fa.js":26151,"./fi":7997,"./fi.js":7997,"./fil":58898,"./fil.js":58898,"./fo":37779,"./fo.js":37779,"./fr":28174,"./fr-ca":3287,"./fr-ca.js":3287,"./fr-ch":38867,"./fr-ch.js":38867,"./fr.js":28174,"./fy":50452,"./fy.js":50452,"./ga":45014,"./ga.js":45014,"./gd":74127,"./gd.js":74127,"./gl":72124,"./gl.js":72124,"./gom-deva":6444,"./gom-deva.js":6444,"./gom-latn":37953,"./gom-latn.js":37953,"./gu":76604,"./gu.js":76604,"./he":1222,"./he.js":1222,"./hi":74235,"./hi.js":74235,"./hr":622,"./hr.js":622,"./hu":37735,"./hu.js":37735,"./hy-am":90402,"./hy-am.js":90402,"./id":59187,"./id.js":59187,"./is":30536,"./is.js":30536,"./it":35007,"./it-ch":94667,"./it-ch.js":94667,"./it.js":35007,"./ja":62093,"./ja.js":62093,"./jv":80059,"./jv.js":80059,"./ka":66870,"./ka.js":66870,"./kk":80880,"./kk.js":80880,"./km":1083,"./km.js":1083,"./kn":68785,"./kn.js":68785,"./ko":21721,"./ko.js":21721,"./ku":37851,"./ku.js":37851,"./ky":1727,"./ky.js":1727,"./lb":40346,"./lb.js":40346,"./lo":93002,"./lo.js":93002,"./lt":64035,"./lt.js":64035,"./lv":56927,"./lv.js":56927,"./me":5634,"./me.js":5634,"./mi":94173,"./mi.js":94173,"./mk":86320,"./mk.js":86320,"./ml":11705,"./ml.js":11705,"./mn":31062,"./mn.js":31062,"./mr":92805,"./mr.js":92805,"./ms":11341,"./ms-my":59900,"./ms-my.js":59900,"./ms.js":11341,"./mt":37734,"./mt.js":37734,"./my":19034,"./my.js":19034,"./nb":9324,"./nb.js":9324,"./ne":46495,"./ne.js":46495,"./nl":70673,"./nl-be":76272,"./nl-be.js":76272,"./nl.js":70673,"./nn":72486,"./nn.js":72486,"./oc-lnc":46219,"./oc-lnc.js":46219,"./pa-in":2829,"./pa-in.js":2829,"./pl":78444,"./pl.js":78444,"./pt":53170,"./pt-br":66117,"./pt-br.js":66117,"./pt.js":53170,"./ro":96587,"./ro.js":96587,"./ru":39264,"./ru.js":39264,"./sd":42135,"./sd.js":42135,"./se":95366,"./se.js":95366,"./si":93379,"./si.js":93379,"./sk":46143,"./sk.js":46143,"./sl":196,"./sl.js":196,"./sq":21082,"./sq.js":21082,"./sr":91621,"./sr-cyrl":98963,"./sr-cyrl.js":98963,"./sr.js":91621,"./ss":41404,"./ss.js":41404,"./sv":55685,"./sv.js":55685,"./sw":3872,"./sw.js":3872,"./ta":54106,"./ta.js":54106,"./te":39204,"./te.js":39204,"./tet":83692,"./tet.js":83692,"./tg":86361,"./tg.js":86361,"./th":31735,"./th.js":31735,"./tk":1568,"./tk.js":1568,"./tl-ph":96129,"./tl-ph.js":96129,"./tlh":13759,"./tlh.js":13759,"./tr":81644,"./tr.js":81644,"./tzl":90875,"./tzl.js":90875,"./tzm":16878,"./tzm-latn":11041,"./tzm-latn.js":11041,"./tzm.js":16878,"./ug-cn":74357,"./ug-cn.js":74357,"./uk":74810,"./uk.js":74810,"./ur":86794,"./ur.js":86794,"./uz":28966,"./uz-latn":77959,"./uz-latn.js":77959,"./uz.js":28966,"./vi":35386,"./vi.js":35386,"./x-pseudo":23156,"./x-pseudo.js":23156,"./yo":68028,"./yo.js":68028,"./zh-cn":9330,"./zh-cn.js":9330,"./zh-hk":89380,"./zh-hk.js":89380,"./zh-mo":60874,"./zh-mo.js":60874,"./zh-tw":96508,"./zh-tw.js":96508};function a(c){var e=f(c);return i(e)}function f(c){if(!i.o(r,c)){var e=new Error("Cannot find module '"+c+"'");throw e.code="MODULE_NOT_FOUND",e}return r[c]}a.keys=function(){return Object.keys(r)},a.resolve=f,m.exports=a,a.id=46700},24654:()=>{},30071:(m,S,i)=>{m.exports=i(75242)},58711:(m,S,i)=>{m.exports=i(10323)},14226:(m,S,i)=>{m.exports=i(38762)},15886:(m,S,i)=>{m.exports=i(71873)},34377:(m,S,i)=>{m.exports=i(61599)},28086:(m,S,i)=>{m.exports=i(34097)},56166:(m,S,i)=>{m.exports=i(15149)},48129:(m,S,i)=>{m.exports=i(83361)},10068:(m,S,i)=>{m.exports=i(19095)},45163:(m,S,i)=>{m.exports=i(71420)},45819:(m,S,i)=>{m.exports=i(13178)},84901:(m,S,i)=>{m.exports=i(52049)},35524:(m,S,i)=>{m.exports=i(83655)},71851:(m,S,i)=>{m.exports=i(87054)},91465:(m,S,i)=>{m.exports=i(51946)},95327:(m,S,i)=>{m.exports=i(40764)},37940:(m,S,i)=>{m.exports=i(81214)},35431:(m,S,i)=>{m.exports=i(50881)},53757:(m,S,i)=>{m.exports=i(38813)},46558:(m,S,i)=>{m.exports=i(70157)},53625:(m,S,i)=>{m.exports=i(3502)},31978:(m,S,i)=>{m.exports=i(81610)},33814:(m,S,i)=>{m.exports=i(19543)},84220:(m,S,i)=>{m.exports=i(74046)},40984:(m,S,i)=>{m.exports=i(13731)},32322:(m,S,i)=>{m.exports=i(80129)},44859:(m,S,i)=>{m.exports=i(43720)},54082:(m,S,i)=>{m.exports=i(640)},30508:(m,S,i)=>{m.exports=i(50320)},46245:(m,S,i)=>{m.exports=i(1162)},69605:(m,S,i)=>{m.exports=i(70809)},86413:(m,S,i)=>{m.exports=i(26498)},87513:(m,S,i)=>{m.exports=i(12118)},69253:(m,S,i)=>{m.exports=i(70906)},8225:(m,S,i)=>{m.exports=i(56286)},64975:(m,S,i)=>{m.exports=i(54153)},66627:(m,S,i)=>{m.exports=i(90755)},68645:(m,S,i)=>{m.exports=i(98235)},14306:(m,S,i)=>{m.exports=i(78096)},6379:(m,S,i)=>{m.exports=i(31236)},72632:(m,S,i)=>{m.exports=i(15819)},28033:(m,S,i)=>{m.exports=i(44948)},19621:(m,S,i)=>{m.exports=i(96471)},54839:(m,S,i)=>{m.exports=i(5228)},95343:(m,S,i)=>{m.exports=i(50182)},73921:(m,S,i)=>{m.exports=i(41171)},70891:(m,S,i)=>{m.exports=i(54585)},77576:(m,S,i)=>{m.exports=i(62005)},45862:(m,S,i)=>{m.exports=i(39964)},51134:(m,S,i)=>{m.exports=i(70326)},23591:(m,S,i)=>{m.exports=i(98162)},76593:(m,S,i)=>{m.exports=i(42346)},22714:(m,S,i)=>{m.exports=i(4204)},62734:(m,S,i)=>{m.exports=i(24329)},69138:(m,S,i)=>{m.exports=i(2793)},69244:(m,S,i)=>{m.exports=i(42700)},15805:(m,S,i)=>{m.exports=i(70269)},63380:(m,S,i)=>{m.exports=i(88819)},66342:(m,S,i)=>{m.exports=i(55912)},71950:(m,S,i)=>{m.exports=i(91185)},12885:(m,S,i)=>{var r=i(79599).default,a=i(77576),f=i(63380),c=i(73921),e=i(76593),p=i(6379),y=i(62734),T=i(69138),C=i(28033),R=i(19621);function L(){"use strict";m.exports=L=function(){return z},m.exports.__esModule=!0,m.exports.default=m.exports;var z={},W=Object.prototype,J=W.hasOwnProperty,ee=a||function(mt,Nt,St){mt[Nt]=St.value},ce="function"==typeof f?f:{},ie=ce.iterator||"@@iterator",U=ce.asyncIterator||"@@asyncIterator",se=ce.toStringTag||"@@toStringTag";function ge(mt,Nt,St){return a(mt,Nt,{value:St,enumerable:!0,configurable:!0,writable:!0}),mt[Nt]}try{ge({},"")}catch(mt){ge=function(St,Yt,Fn){return St[Yt]=Fn}}function ae(mt,Nt,St,Yt){var pr=c((Nt&&Nt.prototype instanceof we?Nt:we).prototype),Ei=new Vt(Yt||[]);return ee(pr,"_invoke",{value:Bt(mt,St,Ei)}),pr}function he(mt,Nt,St){try{return{type:"normal",arg:mt.call(Nt,St)}}catch(Yt){return{type:"throw",arg:Yt}}}z.wrap=ae;var be={};function we(){}function ue(){}function st(){}var We={};ge(We,ie,function(){return this});var Be=e&&e(e(hn([])));Be&&Be!==W&&J.call(Be,ie)&&(We=Be);var xe=st.prototype=we.prototype=c(We);function je(mt){var Nt;p(Nt=["next","throw","return"]).call(Nt,function(St){ge(mt,St,function(Yt){return this._invoke(St,Yt)})})}function Ne(mt,Nt){function St(Fn,pr,Ei,mi){var ur=he(mt[Fn],mt,pr);if("throw"!==ur.type){var $r=ur.arg,Br=$r.value;return Br&&"object"==r(Br)&&J.call(Br,"__await")?Nt.resolve(Br.__await).then(function(Pn){St("next",Pn,Ei,mi)},function(Pn){St("throw",Pn,Ei,mi)}):Nt.resolve(Br).then(function(Pn){$r.value=Pn,Ei($r)},function(Pn){return St("throw",Pn,Ei,mi)})}mi(ur.arg)}var Yt;ee(this,"_invoke",{value:function(pr,Ei){function mi(){return new Nt(function(ur,$r){St(pr,Ei,ur,$r)})}return Yt=Yt?Yt.then(mi,mi):mi()}})}function Bt(mt,Nt,St){var Yt="suspendedStart";return function(Fn,pr){if("executing"===Yt)throw new Error("Generator is already running");if("completed"===Yt){if("throw"===Fn)throw pr;return{value:void 0,done:!0}}for(St.method=Fn,St.arg=pr;;){var Ei=St.delegate;if(Ei){var mi=rt(Ei,St);if(mi){if(mi===be)continue;return mi}}if("next"===St.method)St.sent=St._sent=St.arg;else if("throw"===St.method){if("suspendedStart"===Yt)throw Yt="completed",St.arg;St.dispatchException(St.arg)}else"return"===St.method&&St.abrupt("return",St.arg);Yt="executing";var ur=he(mt,Nt,St);if("normal"===ur.type){if(Yt=St.done?"completed":"suspendedYield",ur.arg===be)continue;return{value:ur.arg,done:St.done}}"throw"===ur.type&&(Yt="completed",St.method="throw",St.arg=ur.arg)}}}function rt(mt,Nt){var St=Nt.method,Yt=mt.iterator[St];if(void 0===Yt)return Nt.delegate=null,"throw"===St&&mt.iterator.return&&(Nt.method="return",Nt.arg=void 0,rt(mt,Nt),"throw"===Nt.method)||"return"!==St&&(Nt.method="throw",Nt.arg=new TypeError("The iterator does not provide a '"+St+"' method")),be;var Fn=he(Yt,mt.iterator,Nt.arg);if("throw"===Fn.type)return Nt.method="throw",Nt.arg=Fn.arg,Nt.delegate=null,be;var pr=Fn.arg;return pr?pr.done?(Nt[mt.resultName]=pr.value,Nt.next=mt.nextLoc,"return"!==Nt.method&&(Nt.method="next",Nt.arg=void 0),Nt.delegate=null,be):pr:(Nt.method="throw",Nt.arg=new TypeError("iterator result is not an object"),Nt.delegate=null,be)}function en(mt){var Nt={tryLoc:mt[0]};1 in mt&&(Nt.catchLoc=mt[1]),2 in mt&&(Nt.finallyLoc=mt[2],Nt.afterLoc=mt[3]),this.tryEntries.push(Nt)}function Pt(mt){var Nt=mt.completion||{};Nt.type="normal",delete Nt.arg,mt.completion=Nt}function Vt(mt){this.tryEntries=[{tryLoc:"root"}],p(mt).call(mt,en,this),this.reset(!0)}function hn(mt){if(mt){var Nt=mt[ie];if(Nt)return Nt.call(mt);if("function"==typeof mt.next)return mt;if(!isNaN(mt.length)){var St=-1,Yt=function Fn(){for(;++St<mt.length;)if(J.call(mt,St))return Fn.value=mt[St],Fn.done=!1,Fn;return Fn.value=void 0,Fn.done=!0,Fn};return Yt.next=Yt}}return{next:vn}}function vn(){return{value:void 0,done:!0}}return ue.prototype=st,ee(xe,"constructor",{value:st,configurable:!0}),ee(st,"constructor",{value:ue,configurable:!0}),ue.displayName=ge(st,se,"GeneratorFunction"),z.isGeneratorFunction=function(mt){var Nt="function"==typeof mt&&mt.constructor;return!!Nt&&(Nt===ue||"GeneratorFunction"===(Nt.displayName||Nt.name))},z.mark=function(mt){return y?y(mt,st):(mt.__proto__=st,ge(mt,se,"GeneratorFunction")),mt.prototype=c(xe),mt},z.awrap=function(mt){return{__await:mt}},je(Ne.prototype),ge(Ne.prototype,U,function(){return this}),z.AsyncIterator=Ne,z.async=function(mt,Nt,St,Yt,Fn){void 0===Fn&&(Fn=T);var pr=new Ne(ae(mt,Nt,St,Yt),Fn);return z.isGeneratorFunction(Nt)?pr:pr.next().then(function(Ei){return Ei.done?Ei.value:pr.next()})},je(xe),ge(xe,se,"Generator"),ge(xe,ie,function(){return this}),ge(xe,"toString",function(){return"[object Generator]"}),z.keys=function(mt){var Nt=Object(mt),St=[];for(var Yt in Nt)St.push(Yt);return C(St).call(St),function Fn(){for(;St.length;){var pr=St.pop();if(pr in Nt)return Fn.value=pr,Fn.done=!1,Fn}return Fn.done=!0,Fn}},z.values=hn,Vt.prototype={constructor:Vt,reset:function(Nt){var St;if(this.prev=0,this.next=0,this.sent=this._sent=void 0,this.done=!1,this.delegate=null,this.method="next",this.arg=void 0,p(St=this.tryEntries).call(St,Pt),!Nt)for(var Yt in this)"t"===Yt.charAt(0)&&J.call(this,Yt)&&!isNaN(+R(Yt).call(Yt,1))&&(this[Yt]=void 0)},stop:function(){this.done=!0;var Nt=this.tryEntries[0].completion;if("throw"===Nt.type)throw Nt.arg;return this.rval},dispatchException:function(Nt){if(this.done)throw Nt;var St=this;function Yt($r,Br){return Ei.type="throw",Ei.arg=Nt,St.next=$r,Br&&(St.method="next",St.arg=void 0),!!Br}for(var Fn=this.tryEntries.length-1;Fn>=0;--Fn){var pr=this.tryEntries[Fn],Ei=pr.completion;if("root"===pr.tryLoc)return Yt("end");if(pr.tryLoc<=this.prev){var mi=J.call(pr,"catchLoc"),ur=J.call(pr,"finallyLoc");if(mi&&ur){if(this.prev<pr.catchLoc)return Yt(pr.catchLoc,!0);if(this.prev<pr.finallyLoc)return Yt(pr.finallyLoc)}else if(mi){if(this.prev<pr.catchLoc)return Yt(pr.catchLoc,!0)}else{if(!ur)throw new Error("try statement without catch or finally");if(this.prev<pr.finallyLoc)return Yt(pr.finallyLoc)}}}},abrupt:function(Nt,St){for(var Yt=this.tryEntries.length-1;Yt>=0;--Yt){var Fn=this.tryEntries[Yt];if(Fn.tryLoc<=this.prev&&J.call(Fn,"finallyLoc")&&this.prev<Fn.finallyLoc){var pr=Fn;break}}pr&&("break"===Nt||"continue"===Nt)&&pr.tryLoc<=St&&St<=pr.finallyLoc&&(pr=null);var Ei=pr?pr.completion:{};return Ei.type=Nt,Ei.arg=St,pr?(this.method="next",this.next=pr.finallyLoc,be):this.complete(Ei)},complete:function(Nt,St){if("throw"===Nt.type)throw Nt.arg;return"break"===Nt.type||"continue"===Nt.type?this.next=Nt.arg:"return"===Nt.type?(this.rval=this.arg=Nt.arg,this.method="return",this.next="end"):"normal"===Nt.type&&St&&(this.next=St),be},finish:function(Nt){for(var St=this.tryEntries.length-1;St>=0;--St){var Yt=this.tryEntries[St];if(Yt.finallyLoc===Nt)return this.complete(Yt.completion,Yt.afterLoc),Pt(Yt),be}},catch:function(Nt){for(var St=this.tryEntries.length-1;St>=0;--St){var Yt=this.tryEntries[St];if(Yt.tryLoc===Nt){var Fn=Yt.completion;if("throw"===Fn.type){var pr=Fn.arg;Pt(Yt)}return pr}}throw new Error("illegal catch attempt")},delegateYield:function(Nt,St,Yt){return this.delegate={iterator:hn(Nt),resultName:St,nextLoc:Yt},"next"===this.method&&(this.arg=void 0),be}},z}m.exports=L,m.exports.__esModule=!0,m.exports.default=m.exports},79599:(m,S,i)=>{var r=i(63380),a=i(66342);function f(c){return m.exports=f="function"==typeof r&&"symbol"==typeof a?function(e){return typeof e}:function(e){return e&&"function"==typeof r&&e.constructor===r&&e!==r.prototype?"symbol":typeof e},m.exports.__esModule=!0,m.exports.default=m.exports,f(c)}m.exports=f,m.exports.__esModule=!0,m.exports.default=m.exports},33950:(m,S,i)=>{var r=i(12885)();m.exports=r;try{regeneratorRuntime=r}catch(a){"object"==typeof globalThis?globalThis.regeneratorRuntime=r:Function("r","regeneratorRuntime = r")(r)}},32019:(m,S,i)=>{"use strict";i.d(S,{LC:()=>a,SB:()=>C,X$:()=>c,ZE:()=>se,ZN:()=>U,_j:()=>r,eR:()=>L,jt:()=>e,k1:()=>ge,l3:()=>f,oB:()=>T,vP:()=>y});class r{}class a{}const f="*";function c(ae,he){return{type:7,name:ae,definitions:he,options:{}}}function e(ae,he=null){return{type:4,styles:he,timings:ae}}function y(ae,he=null){return{type:2,steps:ae,options:he}}function T(ae){return{type:6,styles:ae,offset:null}}function C(ae,he,be){return{type:0,name:ae,styles:he,options:be}}function L(ae,he,be=null){return{type:1,expr:ae,animation:he,options:be}}function ie(ae){Promise.resolve(null).then(ae)}class U{constructor(he=0,be=0){this._onDoneFns=[],this._onStartFns=[],this._onDestroyFns=[],this._started=!1,this._destroyed=!1,this._finished=!1,this._position=0,this.parentPlayer=null,this.totalTime=he+be}_onFinish(){this._finished||(this._finished=!0,this._onDoneFns.forEach(he=>he()),this._onDoneFns=[])}onStart(he){this._onStartFns.push(he)}onDone(he){this._onDoneFns.push(he)}onDestroy(he){this._onDestroyFns.push(he)}hasStarted(){return this._started}init(){}play(){this.hasStarted()||(this._onStart(),this.triggerMicrotask()),this._started=!0}triggerMicrotask(){ie(()=>this._onFinish())}_onStart(){this._onStartFns.forEach(he=>he()),this._onStartFns=[]}pause(){}restart(){}finish(){this._onFinish()}destroy(){this._destroyed||(this._destroyed=!0,this.hasStarted()||this._onStart(),this.finish(),this._onDestroyFns.forEach(he=>he()),this._onDestroyFns=[])}reset(){this._started=!1}setPosition(he){this._position=this.totalTime?he*this.totalTime:1}getPosition(){return this.totalTime?this._position/this.totalTime:1}triggerCallback(he){const be="start"==he?this._onStartFns:this._onDoneFns;be.forEach(we=>we()),be.length=0}}class se{constructor(he){this._onDoneFns=[],this._onStartFns=[],this._finished=!1,this._started=!1,this._destroyed=!1,this._onDestroyFns=[],this.parentPlayer=null,this.totalTime=0,this.players=he;let be=0,we=0,ue=0;const st=this.players.length;0==st?ie(()=>this._onFinish()):this.players.forEach(We=>{We.onDone(()=>{++be==st&&this._onFinish()}),We.onDestroy(()=>{++we==st&&this._onDestroy()}),We.onStart(()=>{++ue==st&&this._onStart()})}),this.totalTime=this.players.reduce((We,Ve)=>Math.max(We,Ve.totalTime),0)}_onFinish(){this._finished||(this._finished=!0,this._onDoneFns.forEach(he=>he()),this._onDoneFns=[])}init(){this.players.forEach(he=>he.init())}onStart(he){this._onStartFns.push(he)}_onStart(){this.hasStarted()||(this._started=!0,this._onStartFns.forEach(he=>he()),this._onStartFns=[])}onDone(he){this._onDoneFns.push(he)}onDestroy(he){this._onDestroyFns.push(he)}hasStarted(){return this._started}play(){this.parentPlayer||this.init(),this._onStart(),this.players.forEach(he=>he.play())}pause(){this.players.forEach(he=>he.pause())}restart(){this.players.forEach(he=>he.restart())}finish(){this._onFinish(),this.players.forEach(he=>he.finish())}destroy(){this._onDestroy()}_onDestroy(){this._destroyed||(this._destroyed=!0,this._onFinish(),this.players.forEach(he=>he.destroy()),this._onDestroyFns.forEach(he=>he()),this._onDestroyFns=[])}reset(){this.players.forEach(he=>he.reset()),this._destroyed=!1,this._finished=!1,this._started=!1}setPosition(he){const be=he*this.totalTime;this.players.forEach(we=>{const ue=we.totalTime?Math.min(1,be/we.totalTime):1;we.setPosition(ue)})}getPosition(){const he=this.players.reduce((be,we)=>null===be||we.totalTime>be.totalTime?we:be,null);return null!=he?he.getPosition():0}beforeDestroy(){this.players.forEach(he=>{he.beforeDestroy&&he.beforeDestroy()})}triggerCallback(he){const be="start"==he?this._onStartFns:this._onDoneFns;be.forEach(we=>we()),be.length=0}}const ge="!"},11048:(m,S,i)=>{"use strict";i.d(S,{Do:()=>ae,ED:()=>ya,EM:()=>Mc,Gx:()=>tt,HT:()=>e,JF:()=>Ua,JJ:()=>Kr,K0:()=>y,Mn:()=>Pt,Mx:()=>yr,NF:()=>Tl,Nd:()=>Lt,O5:()=>mo,Ov:()=>Ys,PC:()=>fl,RF:()=>es,S$:()=>ie,Tn:()=>xe,Ts:()=>ne,UT:()=>Vt,V_:()=>R,Ye:()=>he,Zx:()=>bi,b0:()=>ge,bD:()=>ol,ez:()=>vl,gd:()=>ps,i8:()=>ko,lw:()=>T,mk:()=>or,mr:()=>se,n9:()=>ga,ol:()=>en,p6:()=>Zi,q:()=>f,rS:()=>Ps,sg:()=>xn,tP:()=>To,uU:()=>Nr,w_:()=>p,x:()=>Be});var r=i(89724);let a=null;function f(){return a}function e(Qe){a||(a=Qe)}class p{}const y=new r.OlP("DocumentToken");let T=(()=>{class Qe{historyGo(ot){throw new Error("Not implemented")}}return Qe.\u0275fac=function(ot){return new(ot||Qe)},Qe.\u0275prov=r.Yz7({token:Qe,factory:function(){return function C(){return(0,r.LFG)(L)}()},providedIn:"platform"}),Qe})();const R=new r.OlP("Location Initialized");let L=(()=>{class Qe extends T{constructor(ot){super(),this._doc=ot,this._init()}_init(){this.location=window.location,this._history=window.history}getBaseHrefFromDOM(){return f().getBaseHref(this._doc)}onPopState(ot){const jt=f().getGlobalEventTarget(this._doc,"window");return jt.addEventListener("popstate",ot,!1),()=>jt.removeEventListener("popstate",ot)}onHashChange(ot){const jt=f().getGlobalEventTarget(this._doc,"window");return jt.addEventListener("hashchange",ot,!1),()=>jt.removeEventListener("hashchange",ot)}get href(){return this.location.href}get protocol(){return this.location.protocol}get hostname(){return this.location.hostname}get port(){return this.location.port}get pathname(){return this.location.pathname}get search(){return this.location.search}get hash(){return this.location.hash}set pathname(ot){this.location.pathname=ot}pushState(ot,jt,zn){z()?this._history.pushState(ot,jt,zn):this.location.hash=zn}replaceState(ot,jt,zn){z()?this._history.replaceState(ot,jt,zn):this.location.hash=zn}forward(){this._history.forward()}back(){this._history.back()}historyGo(ot=0){this._history.go(ot)}getState(){return this._history.state}}return Qe.\u0275fac=function(ot){return new(ot||Qe)(r.LFG(y))},Qe.\u0275prov=r.Yz7({token:Qe,factory:function(){return function W(){return new L((0,r.LFG)(y))}()},providedIn:"platform"}),Qe})();function z(){return!!window.history.pushState}function J(Qe,zt){if(0==Qe.length)return zt;if(0==zt.length)return Qe;let ot=0;return Qe.endsWith("/")&&ot++,zt.startsWith("/")&&ot++,2==ot?Qe+zt.substring(1):1==ot?Qe+zt:Qe+"/"+zt}function ee(Qe){const zt=Qe.match(/#|\?|$/),ot=zt&&zt.index||Qe.length;return Qe.slice(0,ot-("/"===Qe[ot-1]?1:0))+Qe.slice(ot)}function ce(Qe){return Qe&&"?"!==Qe[0]?"?"+Qe:Qe}let ie=(()=>{class Qe{historyGo(ot){throw new Error("Not implemented")}}return Qe.\u0275fac=function(ot){return new(ot||Qe)},Qe.\u0275prov=r.Yz7({token:Qe,factory:function(){return function U(Qe){const zt=(0,r.LFG)(y).location;return new ge((0,r.LFG)(T),zt&&zt.origin||"")}()},providedIn:"root"}),Qe})();const se=new r.OlP("appBaseHref");let ge=(()=>{class Qe extends ie{constructor(ot,jt){if(super(),this._platformLocation=ot,this._removeListenerFns=[],null==jt&&(jt=this._platformLocation.getBaseHrefFromDOM()),null==jt)throw new Error("No base href set. Please provide a value for the APP_BASE_HREF token or add a base element to the document.");this._baseHref=jt}ngOnDestroy(){for(;this._removeListenerFns.length;)this._removeListenerFns.pop()()}onPopState(ot){this._removeListenerFns.push(this._platformLocation.onPopState(ot),this._platformLocation.onHashChange(ot))}getBaseHref(){return this._baseHref}prepareExternalUrl(ot){return J(this._baseHref,ot)}path(ot=!1){const jt=this._platformLocation.pathname+ce(this._platformLocation.search),zn=this._platformLocation.hash;return zn&&ot?`${jt}${zn}`:jt}pushState(ot,jt,zn,qr){const Di=this.prepareExternalUrl(zn+ce(qr));this._platformLocation.pushState(ot,jt,Di)}replaceState(ot,jt,zn,qr){const Di=this.prepareExternalUrl(zn+ce(qr));this._platformLocation.replaceState(ot,jt,Di)}forward(){this._platformLocation.forward()}back(){this._platformLocation.back()}historyGo(ot=0){var jt,zn;null===(zn=(jt=this._platformLocation).historyGo)||void 0===zn||zn.call(jt,ot)}}return Qe.\u0275fac=function(ot){return new(ot||Qe)(r.LFG(T),r.LFG(se,8))},Qe.\u0275prov=r.Yz7({token:Qe,factory:Qe.\u0275fac}),Qe})(),ae=(()=>{class Qe extends ie{constructor(ot,jt){super(),this._platformLocation=ot,this._baseHref="",this._removeListenerFns=[],null!=jt&&(this._baseHref=jt)}ngOnDestroy(){for(;this._removeListenerFns.length;)this._removeListenerFns.pop()()}onPopState(ot){this._removeListenerFns.push(this._platformLocation.onPopState(ot),this._platformLocation.onHashChange(ot))}getBaseHref(){return this._baseHref}path(ot=!1){let jt=this._platformLocation.hash;return null==jt&&(jt="#"),jt.length>0?jt.substring(1):jt}prepareExternalUrl(ot){const jt=J(this._baseHref,ot);return jt.length>0?"#"+jt:jt}pushState(ot,jt,zn,qr){let Di=this.prepareExternalUrl(zn+ce(qr));0==Di.length&&(Di=this._platformLocation.pathname),this._platformLocation.pushState(ot,jt,Di)}replaceState(ot,jt,zn,qr){let Di=this.prepareExternalUrl(zn+ce(qr));0==Di.length&&(Di=this._platformLocation.pathname),this._platformLocation.replaceState(ot,jt,Di)}forward(){this._platformLocation.forward()}back(){this._platformLocation.back()}historyGo(ot=0){var jt,zn;null===(zn=(jt=this._platformLocation).historyGo)||void 0===zn||zn.call(jt,ot)}}return Qe.\u0275fac=function(ot){return new(ot||Qe)(r.LFG(T),r.LFG(se,8))},Qe.\u0275prov=r.Yz7({token:Qe,factory:Qe.\u0275fac}),Qe})(),he=(()=>{class Qe{constructor(ot,jt){this._subject=new r.vpe,this._urlChangeListeners=[],this._platformStrategy=ot;const zn=this._platformStrategy.getBaseHref();this._platformLocation=jt,this._baseHref=ee(ue(zn)),this._platformStrategy.onPopState(qr=>{this._subject.emit({url:this.path(!0),pop:!0,state:qr.state,type:qr.type})})}path(ot=!1){return this.normalize(this._platformStrategy.path(ot))}getState(){return this._platformLocation.getState()}isCurrentPathEqualTo(ot,jt=""){return this.path()==this.normalize(ot+ce(jt))}normalize(ot){return Qe.stripTrailingSlash(function we(Qe,zt){return Qe&&zt.startsWith(Qe)?zt.substring(Qe.length):zt}(this._baseHref,ue(ot)))}prepareExternalUrl(ot){return ot&&"/"!==ot[0]&&(ot="/"+ot),this._platformStrategy.prepareExternalUrl(ot)}go(ot,jt="",zn=null){this._platformStrategy.pushState(zn,"",ot,jt),this._notifyUrlChangeListeners(this.prepareExternalUrl(ot+ce(jt)),zn)}replaceState(ot,jt="",zn=null){this._platformStrategy.replaceState(zn,"",ot,jt),this._notifyUrlChangeListeners(this.prepareExternalUrl(ot+ce(jt)),zn)}forward(){this._platformStrategy.forward()}back(){this._platformStrategy.back()}historyGo(ot=0){var jt,zn;null===(zn=(jt=this._platformStrategy).historyGo)||void 0===zn||zn.call(jt,ot)}onUrlChange(ot){this._urlChangeListeners.push(ot),this._urlChangeSubscription||(this._urlChangeSubscription=this.subscribe(jt=>{this._notifyUrlChangeListeners(jt.url,jt.state)}))}_notifyUrlChangeListeners(ot="",jt){this._urlChangeListeners.forEach(zn=>zn(ot,jt))}subscribe(ot,jt,zn){return this._subject.subscribe({next:ot,error:jt,complete:zn})}}return Qe.normalizeQueryParams=ce,Qe.joinWithSlash=J,Qe.stripTrailingSlash=ee,Qe.\u0275fac=function(ot){return new(ot||Qe)(r.LFG(ie),r.LFG(T))},Qe.\u0275prov=r.Yz7({token:Qe,factory:function(){return function be(){return new he((0,r.LFG)(ie),(0,r.LFG)(T))}()},providedIn:"root"}),Qe})();function ue(Qe){return Qe.replace(/\/index.html$/,"")}var We=(()=>((We=We||{})[We.Decimal=0]="Decimal",We[We.Percent=1]="Percent",We[We.Currency=2]="Currency",We[We.Scientific=3]="Scientific",We))(),Ve=(()=>((Ve=Ve||{})[Ve.Zero=0]="Zero",Ve[Ve.One=1]="One",Ve[Ve.Two=2]="Two",Ve[Ve.Few=3]="Few",Ve[Ve.Many=4]="Many",Ve[Ve.Other=5]="Other",Ve))(),Be=(()=>((Be=Be||{})[Be.Format=0]="Format",Be[Be.Standalone=1]="Standalone",Be))(),xe=(()=>((xe=xe||{})[xe.Narrow=0]="Narrow",xe[xe.Abbreviated=1]="Abbreviated",xe[xe.Wide=2]="Wide",xe[xe.Short=3]="Short",xe))(),je=(()=>((je=je||{})[je.Short=0]="Short",je[je.Medium=1]="Medium",je[je.Long=2]="Long",je[je.Full=3]="Full",je))(),Ne=(()=>((Ne=Ne||{})[Ne.Decimal=0]="Decimal",Ne[Ne.Group=1]="Group",Ne[Ne.List=2]="List",Ne[Ne.PercentSign=3]="PercentSign",Ne[Ne.PlusSign=4]="PlusSign",Ne[Ne.MinusSign=5]="MinusSign",Ne[Ne.Exponential=6]="Exponential",Ne[Ne.SuperscriptingExponent=7]="SuperscriptingExponent",Ne[Ne.PerMille=8]="PerMille",Ne[Ne.Infinity=9]="Infinity",Ne[Ne.NaN=10]="NaN",Ne[Ne.TimeSeparator=11]="TimeSeparator",Ne[Ne.CurrencyDecimal=12]="CurrencyDecimal",Ne[Ne.CurrencyGroup=13]="CurrencyGroup",Ne))();function en(Qe,zt,ot){const jt=(0,r.cg1)(Qe),qr=Ci([jt[r.wAp.DayPeriodsFormat],jt[r.wAp.DayPeriodsStandalone]],zt);return Ci(qr,ot)}function Pt(Qe,zt,ot){const jt=(0,r.cg1)(Qe),qr=Ci([jt[r.wAp.DaysFormat],jt[r.wAp.DaysStandalone]],zt);return Ci(qr,ot)}function Vt(Qe,zt,ot){const jt=(0,r.cg1)(Qe),qr=Ci([jt[r.wAp.MonthsFormat],jt[r.wAp.MonthsStandalone]],zt);return Ci(qr,ot)}function Nt(Qe,zt){return Ci((0,r.cg1)(Qe)[r.wAp.DateFormat],zt)}function St(Qe,zt){return Ci((0,r.cg1)(Qe)[r.wAp.TimeFormat],zt)}function Yt(Qe,zt){return Ci((0,r.cg1)(Qe)[r.wAp.DateTimeFormat],zt)}function Fn(Qe,zt){const ot=(0,r.cg1)(Qe),jt=ot[r.wAp.NumberSymbols][zt];if(void 0===jt){if(zt===Ne.CurrencyDecimal)return ot[r.wAp.NumberSymbols][Ne.Decimal];if(zt===Ne.CurrencyGroup)return ot[r.wAp.NumberSymbols][Ne.Group]}return jt}function pr(Qe,zt){return(0,r.cg1)(Qe)[r.wAp.NumberFormats][zt]}const Br=r.kL8;function Pn(Qe){if(!Qe[r.wAp.ExtraData])throw new Error(`Missing extra locale data for the locale "${Qe[r.wAp.LocaleId]}". Use "registerLocaleData" to load new data. See the "I18n guide" on angular.io to know more.`)}function Ci(Qe,zt){for(let ot=zt;ot>-1;ot--)if(void 0!==Qe[ot])return Qe[ot];throw new Error("Locale data API: locale data undefined")}function _i(Qe){const[zt,ot]=Qe.split(":");return{hours:+zt,minutes:+ot}}const Kt=/^(\d{4})-?(\d\d)-?(\d\d)(?:T(\d\d)(?::?(\d\d)(?::?(\d\d)(?:\.(\d+))?)?)?(Z|([+-])(\d\d):?(\d\d))?)?$/,un={},jn=/((?:[^BEGHLMOSWYZabcdhmswyz']+)|(?:'(?:[^']|'')*')|(?:G{1,5}|y{1,4}|Y{1,4}|M{1,5}|L{1,5}|w{1,2}|W{1}|d{1,2}|E{1,6}|c{1,6}|a{1,5}|b{1,5}|B{1,5}|h{1,2}|H{1,2}|m{1,2}|s{1,2}|S{1,3}|z{1,4}|Z{1,5}|O{1,4}))([\s\S]*)/;var Jn=(()=>((Jn=Jn||{})[Jn.Short=0]="Short",Jn[Jn.ShortGMT=1]="ShortGMT",Jn[Jn.Long=2]="Long",Jn[Jn.Extended=3]="Extended",Jn))(),Gn=(()=>((Gn=Gn||{})[Gn.FullYear=0]="FullYear",Gn[Gn.Month=1]="Month",Gn[Gn.Date=2]="Date",Gn[Gn.Hours=3]="Hours",Gn[Gn.Minutes=4]="Minutes",Gn[Gn.Seconds=5]="Seconds",Gn[Gn.FractionalSeconds=6]="FractionalSeconds",Gn[Gn.Day=7]="Day",Gn))(),Xr=(()=>((Xr=Xr||{})[Xr.DayPeriods=0]="DayPeriods",Xr[Xr.Days=1]="Days",Xr[Xr.Months=2]="Months",Xr[Xr.Eras=3]="Eras",Xr))();function Zi(Qe,zt,ot,jt){let zn=function pt(Qe){if(dn(Qe))return Qe;if("number"==typeof Qe&&!isNaN(Qe))return new Date(Qe);if("string"==typeof Qe){if(Qe=Qe.trim(),/^(\d{4}(-\d{1,2}(-\d{1,2})?)?)$/.test(Qe)){const[zn,qr=1,Di=1]=Qe.split("-").map(as=>+as);return ii(zn,qr-1,Di)}const ot=parseFloat(Qe);if(!isNaN(Qe-ot))return new Date(ot);let jt;if(jt=Qe.match(Kt))return function kt(Qe){const zt=new Date(0);let ot=0,jt=0;const zn=Qe[8]?zt.setUTCFullYear:zt.setFullYear,qr=Qe[8]?zt.setUTCHours:zt.setHours;Qe[9]&&(ot=Number(Qe[9]+Qe[10]),jt=Number(Qe[9]+Qe[11])),zn.call(zt,Number(Qe[1]),Number(Qe[2])-1,Number(Qe[3]));const Di=Number(Qe[4]||0)-ot,as=Number(Qe[5]||0)-jt,js=Number(Qe[6]||0),As=Math.floor(1e3*parseFloat("0."+(Qe[7]||0)));return qr.call(zt,Di,as,js,As),zt}(jt)}const zt=new Date(Qe);if(!dn(zt))throw new Error(`Unable to convert "${Qe}" into a date`);return zt}(Qe);zt=hr(ot,zt)||zt;let as,Di=[];for(;zt;){if(as=jn.exec(zt),!as){Di.push(zt);break}{Di=Di.concat(as.slice(1));const Ns=Di.pop();if(!Ns)break;zt=Ns}}let js=zn.getTimezoneOffset();jt&&(js=_t(jt,js),zn=function ct(Qe,zt,ot){const jt=ot?-1:1,zn=Qe.getTimezoneOffset();return function Rt(Qe,zt){return(Qe=new Date(Qe.getTime())).setMinutes(Qe.getMinutes()+zt),Qe}(Qe,jt*(_t(zt,zn)-zn))}(zn,jt,!0));let As="";return Di.forEach(Ns=>{const Io=function Rn(Qe){if(Gt[Qe])return Gt[Qe];let zt;switch(Qe){case"G":case"GG":case"GGG":zt=Sn(Xr.Eras,xe.Abbreviated);break;case"GGGG":zt=Sn(Xr.Eras,xe.Wide);break;case"GGGGG":zt=Sn(Xr.Eras,xe.Narrow);break;case"y":zt=Zn(Gn.FullYear,1,0,!1,!0);break;case"yy":zt=Zn(Gn.FullYear,2,0,!0,!0);break;case"yyy":zt=Zn(Gn.FullYear,3,0,!1,!0);break;case"yyyy":zt=Zn(Gn.FullYear,4,0,!1,!0);break;case"Y":zt=to(1);break;case"YY":zt=to(2,!0);break;case"YYY":zt=to(3);break;case"YYYY":zt=to(4);break;case"M":case"L":zt=Zn(Gn.Month,1,1);break;case"MM":case"LL":zt=Zn(Gn.Month,2,1);break;case"MMM":zt=Sn(Xr.Months,xe.Abbreviated);break;case"MMMM":zt=Sn(Xr.Months,xe.Wide);break;case"MMMMM":zt=Sn(Xr.Months,xe.Narrow);break;case"LLL":zt=Sn(Xr.Months,xe.Abbreviated,Be.Standalone);break;case"LLLL":zt=Sn(Xr.Months,xe.Wide,Be.Standalone);break;case"LLLLL":zt=Sn(Xr.Months,xe.Narrow,Be.Standalone);break;case"w":zt=Bi(1);break;case"ww":zt=Bi(2);break;case"W":zt=Bi(1,!0);break;case"d":zt=Zn(Gn.Date,1);break;case"dd":zt=Zn(Gn.Date,2);break;case"c":case"cc":zt=Zn(Gn.Day,1);break;case"ccc":zt=Sn(Xr.Days,xe.Abbreviated,Be.Standalone);break;case"cccc":zt=Sn(Xr.Days,xe.Wide,Be.Standalone);break;case"ccccc":zt=Sn(Xr.Days,xe.Narrow,Be.Standalone);break;case"cccccc":zt=Sn(Xr.Days,xe.Short,Be.Standalone);break;case"E":case"EE":case"EEE":zt=Sn(Xr.Days,xe.Abbreviated);break;case"EEEE":zt=Sn(Xr.Days,xe.Wide);break;case"EEEEE":zt=Sn(Xr.Days,xe.Narrow);break;case"EEEEEE":zt=Sn(Xr.Days,xe.Short);break;case"a":case"aa":case"aaa":zt=Sn(Xr.DayPeriods,xe.Abbreviated);break;case"aaaa":zt=Sn(Xr.DayPeriods,xe.Wide);break;case"aaaaa":zt=Sn(Xr.DayPeriods,xe.Narrow);break;case"b":case"bb":case"bbb":zt=Sn(Xr.DayPeriods,xe.Abbreviated,Be.Standalone,!0);break;case"bbbb":zt=Sn(Xr.DayPeriods,xe.Wide,Be.Standalone,!0);break;case"bbbbb":zt=Sn(Xr.DayPeriods,xe.Narrow,Be.Standalone,!0);break;case"B":case"BB":case"BBB":zt=Sn(Xr.DayPeriods,xe.Abbreviated,Be.Format,!0);break;case"BBBB":zt=Sn(Xr.DayPeriods,xe.Wide,Be.Format,!0);break;case"BBBBB":zt=Sn(Xr.DayPeriods,xe.Narrow,Be.Format,!0);break;case"h":zt=Zn(Gn.Hours,1,-12);break;case"hh":zt=Zn(Gn.Hours,2,-12);break;case"H":zt=Zn(Gn.Hours,1);break;case"HH":zt=Zn(Gn.Hours,2);break;case"m":zt=Zn(Gn.Minutes,1);break;case"mm":zt=Zn(Gn.Minutes,2);break;case"s":zt=Zn(Gn.Seconds,1);break;case"ss":zt=Zn(Gn.Seconds,2);break;case"S":zt=Zn(Gn.FractionalSeconds,1);break;case"SS":zt=Zn(Gn.FractionalSeconds,2);break;case"SSS":zt=Zn(Gn.FractionalSeconds,3);break;case"Z":case"ZZ":case"ZZZ":zt=ri(Jn.Short);break;case"ZZZZZ":zt=ri(Jn.Extended);break;case"O":case"OO":case"OOO":case"z":case"zz":case"zzz":zt=ri(Jn.ShortGMT);break;case"OOOO":case"ZZZZ":case"zzzz":zt=ri(Jn.Long);break;default:return null}return Gt[Qe]=zt,zt}(Ns);As+=Io?Io(zn,ot,js):"''"===Ns?"'":Ns.replace(/(^'|'$)/g,"").replace(/''/g,"'")}),As}function ii(Qe,zt,ot){const jt=new Date(0);return jt.setFullYear(Qe,zt,ot),jt.setHours(0,0,0),jt}function hr(Qe,zt){const ot=function rt(Qe){return(0,r.cg1)(Qe)[r.wAp.LocaleId]}(Qe);if(un[ot]=un[ot]||{},un[ot][zt])return un[ot][zt];let jt="";switch(zt){case"shortDate":jt=Nt(Qe,je.Short);break;case"mediumDate":jt=Nt(Qe,je.Medium);break;case"longDate":jt=Nt(Qe,je.Long);break;case"fullDate":jt=Nt(Qe,je.Full);break;case"shortTime":jt=St(Qe,je.Short);break;case"mediumTime":jt=St(Qe,je.Medium);break;case"longTime":jt=St(Qe,je.Long);break;case"fullTime":jt=St(Qe,je.Full);break;case"short":const zn=hr(Qe,"shortTime"),qr=hr(Qe,"shortDate");jt=Ki(Yt(Qe,je.Short),[zn,qr]);break;case"medium":const Di=hr(Qe,"mediumTime"),as=hr(Qe,"mediumDate");jt=Ki(Yt(Qe,je.Medium),[Di,as]);break;case"long":const js=hr(Qe,"longTime"),As=hr(Qe,"longDate");jt=Ki(Yt(Qe,je.Long),[js,As]);break;case"full":const Ns=hr(Qe,"fullTime"),Io=hr(Qe,"fullDate");jt=Ki(Yt(Qe,je.Full),[Ns,Io])}return jt&&(un[ot][zt]=jt),jt}function Ki(Qe,zt){return zt&&(Qe=Qe.replace(/\{([^}]+)}/g,function(ot,jt){return null!=zt&&jt in zt?zt[jt]:ot})),Qe}function ln(Qe,zt,ot="-",jt,zn){let qr="";(Qe<0||zn&&Qe<=0)&&(zn?Qe=1-Qe:(Qe=-Qe,qr=ot));let Di=String(Qe);for(;Di.length<zt;)Di="0"+Di;return jt&&(Di=Di.substr(Di.length-zt)),qr+Di}function Zn(Qe,zt,ot=0,jt=!1,zn=!1){return function(qr,Di){let as=function cn(Qe,zt){switch(Qe){case Gn.FullYear:return zt.getFullYear();case Gn.Month:return zt.getMonth();case Gn.Date:return zt.getDate();case Gn.Hours:return zt.getHours();case Gn.Minutes:return zt.getMinutes();case Gn.Seconds:return zt.getSeconds();case Gn.FractionalSeconds:return zt.getMilliseconds();case Gn.Day:return zt.getDay();default:throw new Error(`Unknown DateType value "${Qe}".`)}}(Qe,qr);if((ot>0||as>-ot)&&(as+=ot),Qe===Gn.Hours)0===as&&-12===ot&&(as=12);else if(Qe===Gn.FractionalSeconds)return function Mn(Qe,zt){return ln(Qe,3).substr(0,zt)}(as,zt);const js=Fn(Di,Ne.MinusSign);return ln(as,zt,js,jt,zn)}}function Sn(Qe,zt,ot=Be.Format,jt=!1){return function(zn,qr){return function Or(Qe,zt,ot,jt,zn,qr){switch(ot){case Xr.Months:return Vt(zt,zn,jt)[Qe.getMonth()];case Xr.Days:return Pt(zt,zn,jt)[Qe.getDay()];case Xr.DayPeriods:const Di=Qe.getHours(),as=Qe.getMinutes();if(qr){const As=function Xn(Qe){const zt=(0,r.cg1)(Qe);return Pn(zt),(zt[r.wAp.ExtraData][2]||[]).map(jt=>"string"==typeof jt?_i(jt):[_i(jt[0]),_i(jt[1])])}(zt),Ns=function dr(Qe,zt,ot){const jt=(0,r.cg1)(Qe);Pn(jt);const qr=Ci([jt[r.wAp.ExtraData][0],jt[r.wAp.ExtraData][1]],zt)||[];return Ci(qr,ot)||[]}(zt,zn,jt),Io=As.findIndex(Ka=>{if(Array.isArray(Ka)){const[sl,Bs]=Ka,lt=Di>=sl.hours&&as>=sl.minutes,Xe=Di<Bs.hours||Di===Bs.hours&&as<Bs.minutes;if(sl.hours<Bs.hours){if(lt&&Xe)return!0}else if(lt||Xe)return!0}else if(Ka.hours===Di&&Ka.minutes===as)return!0;return!1});if(-1!==Io)return Ns[Io]}return en(zt,zn,jt)[Di<12?0:1];case Xr.Eras:return function hn(Qe,zt){return Ci((0,r.cg1)(Qe)[r.wAp.Eras],zt)}(zt,jt)[Qe.getFullYear()<=0?0:1];default:throw new Error(`unexpected translation type ${ot}`)}}(zn,qr,Qe,zt,ot,jt)}}function ri(Qe){return function(zt,ot,jt){const zn=-1*jt,qr=Fn(ot,Ne.MinusSign),Di=zn>0?Math.floor(zn/60):Math.ceil(zn/60);switch(Qe){case Jn.Short:return(zn>=0?"+":"")+ln(Di,2,qr)+ln(Math.abs(zn%60),2,qr);case Jn.ShortGMT:return"GMT"+(zn>=0?"+":"")+ln(Di,1,qr);case Jn.Long:return"GMT"+(zn>=0?"+":"")+ln(Di,2,qr)+":"+ln(Math.abs(zn%60),2,qr);case Jn.Extended:return 0===jt?"Z":(zn>=0?"+":"")+ln(Di,2,qr)+":"+ln(Math.abs(zn%60),2,qr);default:throw new Error(`Unknown zone width "${Qe}"`)}}}function dt(Qe){return ii(Qe.getFullYear(),Qe.getMonth(),Qe.getDate()+(4-Qe.getDay()))}function Bi(Qe,zt=!1){return function(ot,jt){let zn;if(zt){const qr=new Date(ot.getFullYear(),ot.getMonth(),1).getDay()-1,Di=ot.getDate();zn=1+Math.floor((Di+qr)/7)}else{const qr=dt(ot),Di=function ao(Qe){const zt=ii(Qe,0,1).getDay();return ii(Qe,0,1+(zt<=4?4:11)-zt)}(qr.getFullYear()),as=qr.getTime()-Di.getTime();zn=1+Math.round(as/6048e5)}return ln(zn,Qe,Fn(jt,Ne.MinusSign))}}function to(Qe,zt=!1){return function(ot,jt){return ln(dt(ot).getFullYear(),Qe,Fn(jt,Ne.MinusSign),zt)}}const Gt={};function _t(Qe,zt){Qe=Qe.replace(/:/g,"");const ot=Date.parse("Jan 01, 1970 00:00:00 "+Qe)/6e4;return isNaN(ot)?zt:ot}function dn(Qe){return Qe instanceof Date&&!isNaN(Qe.valueOf())}const mr=/^(\d+)?\.((\d+)(-(\d+))?)?$/;function qn(Qe,zt,ot,jt,zn,qr,Di=!1){let as="",js=!1;if(isFinite(Qe)){let As=function Li(Qe){let jt,zn,qr,Di,as,zt=Math.abs(Qe)+"",ot=0;for((zn=zt.indexOf("."))>-1&&(zt=zt.replace(".","")),(qr=zt.search(/e/i))>0?(zn<0&&(zn=qr),zn+=+zt.slice(qr+1),zt=zt.substring(0,qr)):zn<0&&(zn=zt.length),qr=0;"0"===zt.charAt(qr);qr++);if(qr===(as=zt.length))jt=[0],zn=1;else{for(as--;"0"===zt.charAt(as);)as--;for(zn-=qr,jt=[],Di=0;qr<=as;qr++,Di++)jt[Di]=Number(zt.charAt(qr))}return zn>22&&(jt=jt.splice(0,21),ot=zn-1,zn=1),{digits:jt,exponent:ot,integerLen:zn}}(Qe);Di&&(As=function oo(Qe){if(0===Qe.digits[0])return Qe;const zt=Qe.digits.length-Qe.integerLen;return Qe.exponent?Qe.exponent+=2:(0===zt?Qe.digits.push(0,0):1===zt&&Qe.digits.push(0),Qe.integerLen+=2),Qe}(As));let Ns=zt.minInt,Io=zt.minFrac,Ka=zt.maxFrac;if(qr){const Ut=qr.match(mr);if(null===Ut)throw new Error(`${qr} is not a valid digit info`);const pi=Ut[1],Wo=Ut[3],Ya=Ut[5];null!=pi&&(Ns=go(pi)),null!=Wo&&(Io=go(Wo)),null!=Ya?Ka=go(Ya):null!=Wo&&Io>Ka&&(Ka=Io)}!function yo(Qe,zt,ot){if(zt>ot)throw new Error(`The minimum number of digits after fraction (${zt}) is higher than the maximum (${ot}).`);let jt=Qe.digits,zn=jt.length-Qe.integerLen;const qr=Math.min(Math.max(zt,zn),ot);let Di=qr+Qe.integerLen,as=jt[Di];if(Di>0){jt.splice(Math.max(Qe.integerLen,Di));for(let Io=Di;Io<jt.length;Io++)jt[Io]=0}else{zn=Math.max(0,zn),Qe.integerLen=1,jt.length=Math.max(1,Di=qr+1),jt[0]=0;for(let Io=1;Io<Di;Io++)jt[Io]=0}if(as>=5)if(Di-1<0){for(let Io=0;Io>Di;Io--)jt.unshift(0),Qe.integerLen++;jt.unshift(1),Qe.integerLen++}else jt[Di-1]++;for(;zn<Math.max(0,qr);zn++)jt.push(0);let js=0!==qr;const As=zt+Qe.integerLen,Ns=jt.reduceRight(function(Io,Ka,sl,Bs){return Bs[sl]=(Ka+=Io)<10?Ka:Ka-10,js&&(0===Bs[sl]&&sl>=As?Bs.pop():js=!1),Ka>=10?1:0},0);Ns&&(jt.unshift(Ns),Qe.integerLen++)}(As,Io,Ka);let sl=As.digits,Bs=As.integerLen;const lt=As.exponent;let Xe=[];for(js=sl.every(Ut=>!Ut);Bs<Ns;Bs++)sl.unshift(0);for(;Bs<0;Bs++)sl.unshift(0);Bs>0?Xe=sl.splice(Bs,sl.length):(Xe=sl,sl=[0]);const ke=[];for(sl.length>=zt.lgSize&&ke.unshift(sl.splice(-zt.lgSize,sl.length).join(""));sl.length>zt.gSize;)ke.unshift(sl.splice(-zt.gSize,sl.length).join(""));sl.length&&ke.unshift(sl.join("")),as=ke.join(Fn(ot,jt)),Xe.length&&(as+=Fn(ot,zn)+Xe.join("")),lt&&(as+=Fn(ot,Ne.Exponential)+"+"+lt)}else as=Fn(ot,Ne.Infinity);return as=Qe<0&&!js?zt.negPre+as+zt.negSuf:zt.posPre+as+zt.posSuf,as}function Fr(Qe,zt="-"){const ot={minInt:1,minFrac:0,maxFrac:0,posPre:"",posSuf:"",negPre:"",negSuf:"",gSize:0,lgSize:0},jt=Qe.split(";"),zn=jt[0],qr=jt[1],Di=-1!==zn.indexOf(".")?zn.split("."):[zn.substring(0,zn.lastIndexOf("0")+1),zn.substring(zn.lastIndexOf("0")+1)],as=Di[0],js=Di[1]||"";ot.posPre=as.substr(0,as.indexOf("#"));for(let Ns=0;Ns<js.length;Ns++){const Io=js.charAt(Ns);"0"===Io?ot.minFrac=ot.maxFrac=Ns+1:"#"===Io?ot.maxFrac=Ns+1:ot.posSuf+=Io}const As=as.split(",");if(ot.gSize=As[1]?As[1].length:0,ot.lgSize=As[2]||As[1]?(As[2]||As[1]).length:0,qr){const Ns=zn.length-ot.posPre.length-ot.posSuf.length,Io=qr.indexOf("#");ot.negPre=qr.substr(0,Io).replace(/'/g,""),ot.negSuf=qr.substr(Io+Ns).replace(/'/g,"")}else ot.negPre=zt+ot.posPre,ot.negSuf=ot.posSuf;return ot}function go(Qe){const zt=parseInt(Qe);if(isNaN(zt))throw new Error("Invalid integer literal when parsing "+Qe);return zt}let Go=(()=>{class Qe{}return Qe.\u0275fac=function(ot){return new(ot||Qe)},Qe.\u0275prov=r.Yz7({token:Qe,factory:function(ot){let jt=null;return ot?jt=new ot:(zn=r.LFG(r.soG),jt=new er(zn)),jt;var zn},providedIn:"root"}),Qe})();let er=(()=>{class Qe extends Go{constructor(ot){super(),this.locale=ot}getPluralCategory(ot,jt){switch(Br(jt||this.locale)(ot)){case Ve.Zero:return"zero";case Ve.One:return"one";case Ve.Two:return"two";case Ve.Few:return"few";case Ve.Many:return"many";default:return"other"}}}return Qe.\u0275fac=function(ot){return new(ot||Qe)(r.LFG(r.soG))},Qe.\u0275prov=r.Yz7({token:Qe,factory:Qe.\u0275fac}),Qe})();function yr(Qe,zt){zt=encodeURIComponent(zt);for(const ot of Qe.split(";")){const jt=ot.indexOf("="),[zn,qr]=-1==jt?[ot,""]:[ot.slice(0,jt),ot.slice(jt+1)];if(zn.trim()===zt)return decodeURIComponent(qr)}return null}let or=(()=>{class Qe{constructor(ot,jt,zn,qr){this._iterableDiffers=ot,this._keyValueDiffers=jt,this._ngEl=zn,this._renderer=qr,this._iterableDiffer=null,this._keyValueDiffer=null,this._initialClasses=[],this._rawClass=null}set klass(ot){this._removeClasses(this._initialClasses),this._initialClasses="string"==typeof ot?ot.split(/\s+/):[],this._applyClasses(this._initialClasses),this._applyClasses(this._rawClass)}set ngClass(ot){this._removeClasses(this._rawClass),this._applyClasses(this._initialClasses),this._iterableDiffer=null,this._keyValueDiffer=null,this._rawClass="string"==typeof ot?ot.split(/\s+/):ot,this._rawClass&&((0,r.sIi)(this._rawClass)?this._iterableDiffer=this._iterableDiffers.find(this._rawClass).create():this._keyValueDiffer=this._keyValueDiffers.find(this._rawClass).create())}ngDoCheck(){if(this._iterableDiffer){const ot=this._iterableDiffer.diff(this._rawClass);ot&&this._applyIterableChanges(ot)}else if(this._keyValueDiffer){const ot=this._keyValueDiffer.diff(this._rawClass);ot&&this._applyKeyValueChanges(ot)}}_applyKeyValueChanges(ot){ot.forEachAddedItem(jt=>this._toggleClass(jt.key,jt.currentValue)),ot.forEachChangedItem(jt=>this._toggleClass(jt.key,jt.currentValue)),ot.forEachRemovedItem(jt=>{jt.previousValue&&this._toggleClass(jt.key,!1)})}_applyIterableChanges(ot){ot.forEachAddedItem(jt=>{if("string"!=typeof jt.item)throw new Error(`NgClass can only toggle CSS classes expressed as strings, got ${(0,r.AaK)(jt.item)}`);this._toggleClass(jt.item,!0)}),ot.forEachRemovedItem(jt=>this._toggleClass(jt.item,!1))}_applyClasses(ot){ot&&(Array.isArray(ot)||ot instanceof Set?ot.forEach(jt=>this._toggleClass(jt,!0)):Object.keys(ot).forEach(jt=>this._toggleClass(jt,!!ot[jt])))}_removeClasses(ot){ot&&(Array.isArray(ot)||ot instanceof Set?ot.forEach(jt=>this._toggleClass(jt,!1)):Object.keys(ot).forEach(jt=>this._toggleClass(jt,!1)))}_toggleClass(ot,jt){(ot=ot.trim())&&ot.split(/\s+/g).forEach(zn=>{jt?this._renderer.addClass(this._ngEl.nativeElement,zn):this._renderer.removeClass(this._ngEl.nativeElement,zn)})}}return Qe.\u0275fac=function(ot){return new(ot||Qe)(r.Y36(r.ZZ4),r.Y36(r.aQg),r.Y36(r.SBq),r.Y36(r.Qsj))},Qe.\u0275dir=r.lG2({type:Qe,selectors:[["","ngClass",""]],inputs:{klass:["class","klass"],ngClass:"ngClass"}}),Qe})();class pn{constructor(zt,ot,jt,zn){this.$implicit=zt,this.ngForOf=ot,this.index=jt,this.count=zn}get first(){return 0===this.index}get last(){return this.index===this.count-1}get even(){return this.index%2==0}get odd(){return!this.even}}let xn=(()=>{class Qe{constructor(ot,jt,zn){this._viewContainer=ot,this._template=jt,this._differs=zn,this._ngForOf=null,this._ngForOfDirty=!0,this._differ=null}set ngForOf(ot){this._ngForOf=ot,this._ngForOfDirty=!0}set ngForTrackBy(ot){this._trackByFn=ot}get ngForTrackBy(){return this._trackByFn}set ngForTemplate(ot){ot&&(this._template=ot)}ngDoCheck(){if(this._ngForOfDirty){this._ngForOfDirty=!1;const ot=this._ngForOf;!this._differ&&ot&&(this._differ=this._differs.find(ot).create(this.ngForTrackBy))}if(this._differ){const ot=this._differ.diff(this._ngForOf);ot&&this._applyChanges(ot)}}_applyChanges(ot){const jt=this._viewContainer;ot.forEachOperation((zn,qr,Di)=>{if(null==zn.previousIndex)jt.createEmbeddedView(this._template,new pn(zn.item,this._ngForOf,-1,-1),null===Di?void 0:Di);else if(null==Di)jt.remove(null===qr?void 0:qr);else if(null!==qr){const as=jt.get(qr);jt.move(as,Di),Gr(as,zn)}});for(let zn=0,qr=jt.length;zn<qr;zn++){const as=jt.get(zn).context;as.index=zn,as.count=qr,as.ngForOf=this._ngForOf}ot.forEachIdentityChange(zn=>{Gr(jt.get(zn.currentIndex),zn)})}static ngTemplateContextGuard(ot,jt){return!0}}return Qe.\u0275fac=function(ot){return new(ot||Qe)(r.Y36(r.s_b),r.Y36(r.Rgc),r.Y36(r.ZZ4))},Qe.\u0275dir=r.lG2({type:Qe,selectors:[["","ngFor","","ngForOf",""]],inputs:{ngForOf:"ngForOf",ngForTrackBy:"ngForTrackBy",ngForTemplate:"ngForTemplate"}}),Qe})();function Gr(Qe,zt){Qe.context.$implicit=zt.item}let mo=(()=>{class Qe{constructor(ot,jt){this._viewContainer=ot,this._context=new wo,this._thenTemplateRef=null,this._elseTemplateRef=null,this._thenViewRef=null,this._elseViewRef=null,this._thenTemplateRef=jt}set ngIf(ot){this._context.$implicit=this._context.ngIf=ot,this._updateView()}set ngIfThen(ot){Us("ngIfThen",ot),this._thenTemplateRef=ot,this._thenViewRef=null,this._updateView()}set ngIfElse(ot){Us("ngIfElse",ot),this._elseTemplateRef=ot,this._elseViewRef=null,this._updateView()}_updateView(){this._context.$implicit?this._thenViewRef||(this._viewContainer.clear(),this._elseViewRef=null,this._thenTemplateRef&&(this._thenViewRef=this._viewContainer.createEmbeddedView(this._thenTemplateRef,this._context))):this._elseViewRef||(this._viewContainer.clear(),this._thenViewRef=null,this._elseTemplateRef&&(this._elseViewRef=this._viewContainer.createEmbeddedView(this._elseTemplateRef,this._context)))}static ngTemplateContextGuard(ot,jt){return!0}}return Qe.\u0275fac=function(ot){return new(ot||Qe)(r.Y36(r.s_b),r.Y36(r.Rgc))},Qe.\u0275dir=r.lG2({type:Qe,selectors:[["","ngIf",""]],inputs:{ngIf:"ngIf",ngIfThen:"ngIfThen",ngIfElse:"ngIfElse"}}),Qe})();class wo{constructor(){this.$implicit=null,this.ngIf=null}}function Us(Qe,zt){if(zt&&!zt.createEmbeddedView)throw new Error(`${Qe} must be a TemplateRef, but received '${(0,r.AaK)(zt)}'.`)}class cs{constructor(zt,ot){this._viewContainerRef=zt,this._templateRef=ot,this._created=!1}create(){this._created=!0,this._viewContainerRef.createEmbeddedView(this._templateRef)}destroy(){this._created=!1,this._viewContainerRef.clear()}enforceState(zt){zt&&!this._created?this.create():!zt&&this._created&&this.destroy()}}let es=(()=>{class Qe{constructor(){this._defaultUsed=!1,this._caseCount=0,this._lastCaseCheckIndex=0,this._lastCasesMatched=!1}set ngSwitch(ot){this._ngSwitch=ot,0===this._caseCount&&this._updateDefaultCases(!0)}_addCase(){return this._caseCount++}_addDefault(ot){this._defaultViews||(this._defaultViews=[]),this._defaultViews.push(ot)}_matchCase(ot){const jt=ot==this._ngSwitch;return this._lastCasesMatched=this._lastCasesMatched||jt,this._lastCaseCheckIndex++,this._lastCaseCheckIndex===this._caseCount&&(this._updateDefaultCases(!this._lastCasesMatched),this._lastCaseCheckIndex=0,this._lastCasesMatched=!1),jt}_updateDefaultCases(ot){if(this._defaultViews&&ot!==this._defaultUsed){this._defaultUsed=ot;for(let jt=0;jt<this._defaultViews.length;jt++)this._defaultViews[jt].enforceState(ot)}}}return Qe.\u0275fac=function(ot){return new(ot||Qe)},Qe.\u0275dir=r.lG2({type:Qe,selectors:[["","ngSwitch",""]],inputs:{ngSwitch:"ngSwitch"}}),Qe})(),ga=(()=>{class Qe{constructor(ot,jt,zn){this.ngSwitch=zn,zn._addCase(),this._view=new cs(ot,jt)}ngDoCheck(){this._view.enforceState(this.ngSwitch._matchCase(this.ngSwitchCase))}}return Qe.\u0275fac=function(ot){return new(ot||Qe)(r.Y36(r.s_b),r.Y36(r.Rgc),r.Y36(es,9))},Qe.\u0275dir=r.lG2({type:Qe,selectors:[["","ngSwitchCase",""]],inputs:{ngSwitchCase:"ngSwitchCase"}}),Qe})(),ya=(()=>{class Qe{constructor(ot,jt,zn){zn._addDefault(new cs(ot,jt))}}return Qe.\u0275fac=function(ot){return new(ot||Qe)(r.Y36(r.s_b),r.Y36(r.Rgc),r.Y36(es,9))},Qe.\u0275dir=r.lG2({type:Qe,selectors:[["","ngSwitchDefault",""]]}),Qe})(),fl=(()=>{class Qe{constructor(ot,jt,zn){this._ngEl=ot,this._differs=jt,this._renderer=zn,this._ngStyle=null,this._differ=null}set ngStyle(ot){this._ngStyle=ot,!this._differ&&ot&&(this._differ=this._differs.find(ot).create())}ngDoCheck(){if(this._differ){const ot=this._differ.diff(this._ngStyle);ot&&this._applyChanges(ot)}}_setStyle(ot,jt){const[zn,qr]=ot.split(".");null!=(jt=null!=jt&&qr?`${jt}${qr}`:jt)?this._renderer.setStyle(this._ngEl.nativeElement,zn,jt):this._renderer.removeStyle(this._ngEl.nativeElement,zn)}_applyChanges(ot){ot.forEachRemovedItem(jt=>this._setStyle(jt.key,null)),ot.forEachAddedItem(jt=>this._setStyle(jt.key,jt.currentValue)),ot.forEachChangedItem(jt=>this._setStyle(jt.key,jt.currentValue))}}return Qe.\u0275fac=function(ot){return new(ot||Qe)(r.Y36(r.SBq),r.Y36(r.aQg),r.Y36(r.Qsj))},Qe.\u0275dir=r.lG2({type:Qe,selectors:[["","ngStyle",""]],inputs:{ngStyle:"ngStyle"}}),Qe})(),To=(()=>{class Qe{constructor(ot){this._viewContainerRef=ot,this._viewRef=null,this.ngTemplateOutletContext=null,this.ngTemplateOutlet=null}ngOnChanges(ot){if(ot.ngTemplateOutlet){const jt=this._viewContainerRef;this._viewRef&&jt.remove(jt.indexOf(this._viewRef)),this._viewRef=this.ngTemplateOutlet?jt.createEmbeddedView(this.ngTemplateOutlet,this.ngTemplateOutletContext):null}else this._viewRef&&ot.ngTemplateOutletContext&&this.ngTemplateOutletContext&&(this._viewRef.context=this.ngTemplateOutletContext)}}return Qe.\u0275fac=function(ot){return new(ot||Qe)(r.Y36(r.s_b))},Qe.\u0275dir=r.lG2({type:Qe,selectors:[["","ngTemplateOutlet",""]],inputs:{ngTemplateOutletContext:"ngTemplateOutletContext",ngTemplateOutlet:"ngTemplateOutlet"},features:[r.TTD]}),Qe})();function Zo(Qe,zt){return new r.vHH(2100,"")}class vs{createSubscription(zt,ot){return zt.subscribe({next:ot,error:jt=>{throw jt}})}dispose(zt){zt.unsubscribe()}onDestroy(zt){zt.unsubscribe()}}class Za{createSubscription(zt,ot){return zt.then(ot,jt=>{throw jt})}dispose(zt){}onDestroy(zt){}}const Is=new Za,tl=new vs;let Ys=(()=>{class Qe{constructor(ot){this._ref=ot,this._latestValue=null,this._subscription=null,this._obj=null,this._strategy=null}ngOnDestroy(){this._subscription&&this._dispose()}transform(ot){return this._obj?ot!==this._obj?(this._dispose(),this.transform(ot)):this._latestValue:(ot&&this._subscribe(ot),this._latestValue)}_subscribe(ot){this._obj=ot,this._strategy=this._selectStrategy(ot),this._subscription=this._strategy.createSubscription(ot,jt=>this._updateLatestValue(ot,jt))}_selectStrategy(ot){if((0,r.QGY)(ot))return Is;if((0,r.F4k)(ot))return tl;throw Zo()}_dispose(){this._strategy.dispose(this._subscription),this._latestValue=null,this._subscription=null,this._obj=null}_updateLatestValue(ot,jt){ot===this._obj&&(this._latestValue=jt,this._ref.markForCheck())}}return Qe.\u0275fac=function(ot){return new(ot||Qe)(r.Y36(r.sBO,16))},Qe.\u0275pipe=r.Yjl({name:"async",type:Qe,pure:!1}),Qe})(),ko=(()=>{class Qe{transform(ot){if(null==ot)return null;if("string"!=typeof ot)throw Zo();return ot.toLowerCase()}}return Qe.\u0275fac=function(ot){return new(ot||Qe)},Qe.\u0275pipe=r.Yjl({name:"lowercase",type:Qe,pure:!0}),Qe})();const Co=/(?:[0-9A-Za-z\xAA\xB5\xBA\xC0-\xD6\xD8-\xF6\xF8-\u02C1\u02C6-\u02D1\u02E0-\u02E4\u02EC\u02EE\u0370-\u0374\u0376\u0377\u037A-\u037D\u037F\u0386\u0388-\u038A\u038C\u038E-\u03A1\u03A3-\u03F5\u03F7-\u0481\u048A-\u052F\u0531-\u0556\u0559\u0560-\u0588\u05D0-\u05EA\u05EF-\u05F2\u0620-\u064A\u066E\u066F\u0671-\u06D3\u06D5\u06E5\u06E6\u06EE\u06EF\u06FA-\u06FC\u06FF\u0710\u0712-\u072F\u074D-\u07A5\u07B1\u07CA-\u07EA\u07F4\u07F5\u07FA\u0800-\u0815\u081A\u0824\u0828\u0840-\u0858\u0860-\u086A\u0870-\u0887\u0889-\u088E\u08A0-\u08C9\u0904-\u0939\u093D\u0950\u0958-\u0961\u0971-\u0980\u0985-\u098C\u098F\u0990\u0993-\u09A8\u09AA-\u09B0\u09B2\u09B6-\u09B9\u09BD\u09CE\u09DC\u09DD\u09DF-\u09E1\u09F0\u09F1\u09FC\u0A05-\u0A0A\u0A0F\u0A10\u0A13-\u0A28\u0A2A-\u0A30\u0A32\u0A33\u0A35\u0A36\u0A38\u0A39\u0A59-\u0A5C\u0A5E\u0A72-\u0A74\u0A85-\u0A8D\u0A8F-\u0A91\u0A93-\u0AA8\u0AAA-\u0AB0\u0AB2\u0AB3\u0AB5-\u0AB9\u0ABD\u0AD0\u0AE0\u0AE1\u0AF9\u0B05-\u0B0C\u0B0F\u0B10\u0B13-\u0B28\u0B2A-\u0B30\u0B32\u0B33\u0B35-\u0B39\u0B3D\u0B5C\u0B5D\u0B5F-\u0B61\u0B71\u0B83\u0B85-\u0B8A\u0B8E-\u0B90\u0B92-\u0B95\u0B99\u0B9A\u0B9C\u0B9E\u0B9F\u0BA3\u0BA4\u0BA8-\u0BAA\u0BAE-\u0BB9\u0BD0\u0C05-\u0C0C\u0C0E-\u0C10\u0C12-\u0C28\u0C2A-\u0C39\u0C3D\u0C58-\u0C5A\u0C5D\u0C60\u0C61\u0C80\u0C85-\u0C8C\u0C8E-\u0C90\u0C92-\u0CA8\u0CAA-\u0CB3\u0CB5-\u0CB9\u0CBD\u0CDD\u0CDE\u0CE0\u0CE1\u0CF1\u0CF2\u0D04-\u0D0C\u0D0E-\u0D10\u0D12-\u0D3A\u0D3D\u0D4E\u0D54-\u0D56\u0D5F-\u0D61\u0D7A-\u0D7F\u0D85-\u0D96\u0D9A-\u0DB1\u0DB3-\u0DBB\u0DBD\u0DC0-\u0DC6\u0E01-\u0E30\u0E32\u0E33\u0E40-\u0E46\u0E81\u0E82\u0E84\u0E86-\u0E8A\u0E8C-\u0EA3\u0EA5\u0EA7-\u0EB0\u0EB2\u0EB3\u0EBD\u0EC0-\u0EC4\u0EC6\u0EDC-\u0EDF\u0F00\u0F40-\u0F47\u0F49-\u0F6C\u0F88-\u0F8C\u1000-\u102A\u103F\u1050-\u1055\u105A-\u105D\u1061\u1065\u1066\u106E-\u1070\u1075-\u1081\u108E\u10A0-\u10C5\u10C7\u10CD\u10D0-\u10FA\u10FC-\u1248\u124A-\u124D\u1250-\u1256\u1258\u125A-\u125D\u1260-\u1288\u128A-\u128D\u1290-\u12B0\u12B2-\u12B5\u12B8-\u12BE\u12C0\u12C2-\u12C5\u12C8-\u12D6\u12D8-\u1310\u1312-\u1315\u1318-\u135A\u1380-\u138F\u13A0-\u13F5\u13F8-\u13FD\u1401-\u166C\u166F-\u167F\u1681-\u169A\u16A0-\u16EA\u16F1-\u16F8\u1700-\u1711\u171F-\u1731\u1740-\u1751\u1760-\u176C\u176E-\u1770\u1780-\u17B3\u17D7\u17DC\u1820-\u1878\u1880-\u1884\u1887-\u18A8\u18AA\u18B0-\u18F5\u1900-\u191E\u1950-\u196D\u1970-\u1974\u1980-\u19AB\u19B0-\u19C9\u1A00-\u1A16\u1A20-\u1A54\u1AA7\u1B05-\u1B33\u1B45-\u1B4C\u1B83-\u1BA0\u1BAE\u1BAF\u1BBA-\u1BE5\u1C00-\u1C23\u1C4D-\u1C4F\u1C5A-\u1C7D\u1C80-\u1C88\u1C90-\u1CBA\u1CBD-\u1CBF\u1CE9-\u1CEC\u1CEE-\u1CF3\u1CF5\u1CF6\u1CFA\u1D00-\u1DBF\u1E00-\u1F15\u1F18-\u1F1D\u1F20-\u1F45\u1F48-\u1F4D\u1F50-\u1F57\u1F59\u1F5B\u1F5D\u1F5F-\u1F7D\u1F80-\u1FB4\u1FB6-\u1FBC\u1FBE\u1FC2-\u1FC4\u1FC6-\u1FCC\u1FD0-\u1FD3\u1FD6-\u1FDB\u1FE0-\u1FEC\u1FF2-\u1FF4\u1FF6-\u1FFC\u2071\u207F\u2090-\u209C\u2102\u2107\u210A-\u2113\u2115\u2119-\u211D\u2124\u2126\u2128\u212A-\u212D\u212F-\u2139\u213C-\u213F\u2145-\u2149\u214E\u2183\u2184\u2C00-\u2CE4\u2CEB-\u2CEE\u2CF2\u2CF3\u2D00-\u2D25\u2D27\u2D2D\u2D30-\u2D67\u2D6F\u2D80-\u2D96\u2DA0-\u2DA6\u2DA8-\u2DAE\u2DB0-\u2DB6\u2DB8-\u2DBE\u2DC0-\u2DC6\u2DC8-\u2DCE\u2DD0-\u2DD6\u2DD8-\u2DDE\u2E2F\u3005\u3006\u3031-\u3035\u303B\u303C\u3041-\u3096\u309D-\u309F\u30A1-\u30FA\u30FC-\u30FF\u3105-\u312F\u3131-\u318E\u31A0-\u31BF\u31F0-\u31FF\u3400-\u4DBF\u4E00-\uA48C\uA4D0-\uA4FD\uA500-\uA60C\uA610-\uA61F\uA62A\uA62B\uA640-\uA66E\uA67F-\uA69D\uA6A0-\uA6E5\uA717-\uA71F\uA722-\uA788\uA78B-\uA7CA\uA7D0\uA7D1\uA7D3\uA7D5-\uA7D9\uA7F2-\uA801\uA803-\uA805\uA807-\uA80A\uA80C-\uA822\uA840-\uA873\uA882-\uA8B3\uA8F2-\uA8F7\uA8FB\uA8FD\uA8FE\uA90A-\uA925\uA930-\uA946\uA960-\uA97C\uA984-\uA9B2\uA9CF\uA9E0-\uA9E4\uA9E6-\uA9EF\uA9FA-\uA9FE\uAA00-\uAA28\uAA40-\uAA42\uAA44-\uAA4B\uAA60-\uAA76\uAA7A\uAA7E-\uAAAF\uAAB1\uAAB5\uAAB6\uAAB9-\uAABD\uAAC0\uAAC2\uAADB-\uAADD\uAAE0-\uAAEA\uAAF2-\uAAF4\uAB01-\uAB06\uAB09-\uAB0E\uAB11-\uAB16\uAB20-\uAB26\uAB28-\uAB2E\uAB30-\uAB5A\uAB5C-\uAB69\uAB70-\uABE2\uAC00-\uD7A3\uD7B0-\uD7C6\uD7CB-\uD7FB\uF900-\uFA6D\uFA70-\uFAD9\uFB00-\uFB06\uFB13-\uFB17\uFB1D\uFB1F-\uFB28\uFB2A-\uFB36\uFB38-\uFB3C\uFB3E\uFB40\uFB41\uFB43\uFB44\uFB46-\uFBB1\uFBD3-\uFD3D\uFD50-\uFD8F\uFD92-\uFDC7\uFDF0-\uFDFB\uFE70-\uFE74\uFE76-\uFEFC\uFF21-\uFF3A\uFF41-\uFF5A\uFF66-\uFFBE\uFFC2-\uFFC7\uFFCA-\uFFCF\uFFD2-\uFFD7\uFFDA-\uFFDC]|\uD800[\uDC00-\uDC0B\uDC0D-\uDC26\uDC28-\uDC3A\uDC3C\uDC3D\uDC3F-\uDC4D\uDC50-\uDC5D\uDC80-\uDCFA\uDE80-\uDE9C\uDEA0-\uDED0\uDF00-\uDF1F\uDF2D-\uDF40\uDF42-\uDF49\uDF50-\uDF75\uDF80-\uDF9D\uDFA0-\uDFC3\uDFC8-\uDFCF]|\uD801[\uDC00-\uDC9D\uDCB0-\uDCD3\uDCD8-\uDCFB\uDD00-\uDD27\uDD30-\uDD63\uDD70-\uDD7A\uDD7C-\uDD8A\uDD8C-\uDD92\uDD94\uDD95\uDD97-\uDDA1\uDDA3-\uDDB1\uDDB3-\uDDB9\uDDBB\uDDBC\uDE00-\uDF36\uDF40-\uDF55\uDF60-\uDF67\uDF80-\uDF85\uDF87-\uDFB0\uDFB2-\uDFBA]|\uD802[\uDC00-\uDC05\uDC08\uDC0A-\uDC35\uDC37\uDC38\uDC3C\uDC3F-\uDC55\uDC60-\uDC76\uDC80-\uDC9E\uDCE0-\uDCF2\uDCF4\uDCF5\uDD00-\uDD15\uDD20-\uDD39\uDD80-\uDDB7\uDDBE\uDDBF\uDE00\uDE10-\uDE13\uDE15-\uDE17\uDE19-\uDE35\uDE60-\uDE7C\uDE80-\uDE9C\uDEC0-\uDEC7\uDEC9-\uDEE4\uDF00-\uDF35\uDF40-\uDF55\uDF60-\uDF72\uDF80-\uDF91]|\uD803[\uDC00-\uDC48\uDC80-\uDCB2\uDCC0-\uDCF2\uDD00-\uDD23\uDE80-\uDEA9\uDEB0\uDEB1\uDF00-\uDF1C\uDF27\uDF30-\uDF45\uDF70-\uDF81\uDFB0-\uDFC4\uDFE0-\uDFF6]|\uD804[\uDC03-\uDC37\uDC71\uDC72\uDC75\uDC83-\uDCAF\uDCD0-\uDCE8\uDD03-\uDD26\uDD44\uDD47\uDD50-\uDD72\uDD76\uDD83-\uDDB2\uDDC1-\uDDC4\uDDDA\uDDDC\uDE00-\uDE11\uDE13-\uDE2B\uDE80-\uDE86\uDE88\uDE8A-\uDE8D\uDE8F-\uDE9D\uDE9F-\uDEA8\uDEB0-\uDEDE\uDF05-\uDF0C\uDF0F\uDF10\uDF13-\uDF28\uDF2A-\uDF30\uDF32\uDF33\uDF35-\uDF39\uDF3D\uDF50\uDF5D-\uDF61]|\uD805[\uDC00-\uDC34\uDC47-\uDC4A\uDC5F-\uDC61\uDC80-\uDCAF\uDCC4\uDCC5\uDCC7\uDD80-\uDDAE\uDDD8-\uDDDB\uDE00-\uDE2F\uDE44\uDE80-\uDEAA\uDEB8\uDF00-\uDF1A\uDF40-\uDF46]|\uD806[\uDC00-\uDC2B\uDCA0-\uDCDF\uDCFF-\uDD06\uDD09\uDD0C-\uDD13\uDD15\uDD16\uDD18-\uDD2F\uDD3F\uDD41\uDDA0-\uDDA7\uDDAA-\uDDD0\uDDE1\uDDE3\uDE00\uDE0B-\uDE32\uDE3A\uDE50\uDE5C-\uDE89\uDE9D\uDEB0-\uDEF8]|\uD807[\uDC00-\uDC08\uDC0A-\uDC2E\uDC40\uDC72-\uDC8F\uDD00-\uDD06\uDD08\uDD09\uDD0B-\uDD30\uDD46\uDD60-\uDD65\uDD67\uDD68\uDD6A-\uDD89\uDD98\uDEE0-\uDEF2\uDFB0]|\uD808[\uDC00-\uDF99]|\uD809[\uDC80-\uDD43]|\uD80B[\uDF90-\uDFF0]|[\uD80C\uD81C-\uD820\uD822\uD840-\uD868\uD86A-\uD86C\uD86F-\uD872\uD874-\uD879\uD880-\uD883][\uDC00-\uDFFF]|\uD80D[\uDC00-\uDC2E]|\uD811[\uDC00-\uDE46]|\uD81A[\uDC00-\uDE38\uDE40-\uDE5E\uDE70-\uDEBE\uDED0-\uDEED\uDF00-\uDF2F\uDF40-\uDF43\uDF63-\uDF77\uDF7D-\uDF8F]|\uD81B[\uDE40-\uDE7F\uDF00-\uDF4A\uDF50\uDF93-\uDF9F\uDFE0\uDFE1\uDFE3]|\uD821[\uDC00-\uDFF7]|\uD823[\uDC00-\uDCD5\uDD00-\uDD08]|\uD82B[\uDFF0-\uDFF3\uDFF5-\uDFFB\uDFFD\uDFFE]|\uD82C[\uDC00-\uDD22\uDD50-\uDD52\uDD64-\uDD67\uDD70-\uDEFB]|\uD82F[\uDC00-\uDC6A\uDC70-\uDC7C\uDC80-\uDC88\uDC90-\uDC99]|\uD835[\uDC00-\uDC54\uDC56-\uDC9C\uDC9E\uDC9F\uDCA2\uDCA5\uDCA6\uDCA9-\uDCAC\uDCAE-\uDCB9\uDCBB\uDCBD-\uDCC3\uDCC5-\uDD05\uDD07-\uDD0A\uDD0D-\uDD14\uDD16-\uDD1C\uDD1E-\uDD39\uDD3B-\uDD3E\uDD40-\uDD44\uDD46\uDD4A-\uDD50\uDD52-\uDEA5\uDEA8-\uDEC0\uDEC2-\uDEDA\uDEDC-\uDEFA\uDEFC-\uDF14\uDF16-\uDF34\uDF36-\uDF4E\uDF50-\uDF6E\uDF70-\uDF88\uDF8A-\uDFA8\uDFAA-\uDFC2\uDFC4-\uDFCB]|\uD837[\uDF00-\uDF1E]|\uD838[\uDD00-\uDD2C\uDD37-\uDD3D\uDD4E\uDE90-\uDEAD\uDEC0-\uDEEB]|\uD839[\uDFE0-\uDFE6\uDFE8-\uDFEB\uDFED\uDFEE\uDFF0-\uDFFE]|\uD83A[\uDC00-\uDCC4\uDD00-\uDD43\uDD4B]|\uD83B[\uDE00-\uDE03\uDE05-\uDE1F\uDE21\uDE22\uDE24\uDE27\uDE29-\uDE32\uDE34-\uDE37\uDE39\uDE3B\uDE42\uDE47\uDE49\uDE4B\uDE4D-\uDE4F\uDE51\uDE52\uDE54\uDE57\uDE59\uDE5B\uDE5D\uDE5F\uDE61\uDE62\uDE64\uDE67-\uDE6A\uDE6C-\uDE72\uDE74-\uDE77\uDE79-\uDE7C\uDE7E\uDE80-\uDE89\uDE8B-\uDE9B\uDEA1-\uDEA3\uDEA5-\uDEA9\uDEAB-\uDEBB]|\uD869[\uDC00-\uDEDF\uDF00-\uDFFF]|\uD86D[\uDC00-\uDF38\uDF40-\uDFFF]|\uD86E[\uDC00-\uDC1D\uDC20-\uDFFF]|\uD873[\uDC00-\uDEA1\uDEB0-\uDFFF]|\uD87A[\uDC00-\uDFE0]|\uD87E[\uDC00-\uDE1D]|\uD884[\uDC00-\uDF4A])\S*/g;let Ps=(()=>{class Qe{transform(ot){if(null==ot)return null;if("string"!=typeof ot)throw Zo();return ot.replace(Co,jt=>jt[0].toUpperCase()+jt.substr(1).toLowerCase())}}return Qe.\u0275fac=function(ot){return new(ot||Qe)},Qe.\u0275pipe=r.Yjl({name:"titlecase",type:Qe,pure:!0}),Qe})(),ps=(()=>{class Qe{transform(ot){if(null==ot)return null;if("string"!=typeof ot)throw Zo();return ot.toUpperCase()}}return Qe.\u0275fac=function(ot){return new(ot||Qe)},Qe.\u0275pipe=r.Yjl({name:"uppercase",type:Qe,pure:!0}),Qe})();const Oo=new r.OlP("DATE_PIPE_DEFAULT_TIMEZONE");let Nr=(()=>{class Qe{constructor(ot,jt){this.locale=ot,this.defaultTimezone=jt}transform(ot,jt="mediumDate",zn,qr){var Di;if(null==ot||""===ot||ot!=ot)return null;try{return Zi(ot,jt,qr||this.locale,null!==(Di=null!=zn?zn:this.defaultTimezone)&&void 0!==Di?Di:void 0)}catch(as){throw Zo()}}}return Qe.\u0275fac=function(ot){return new(ot||Qe)(r.Y36(r.soG,16),r.Y36(Oo,24))},Qe.\u0275pipe=r.Yjl({name:"date",type:Qe,pure:!0}),Qe})();const Qi=/#/g;let tt=(()=>{class Qe{constructor(ot){this._localization=ot}transform(ot,jt,zn){if(null==ot)return"";if("object"!=typeof jt||null===jt)throw Zo();return jt[function ua(Qe,zt,ot,jt){let zn=`=${Qe}`;if(zt.indexOf(zn)>-1||(zn=ot.getPluralCategory(Qe,jt),zt.indexOf(zn)>-1))return zn;if(zt.indexOf("other")>-1)return"other";throw new Error(`No plural message found for value "${Qe}"`)}(ot,Object.keys(jt),this._localization,zn)].replace(Qi,ot.toString())}}return Qe.\u0275fac=function(ot){return new(ot||Qe)(r.Y36(Go,16))},Qe.\u0275pipe=r.Yjl({name:"i18nPlural",type:Qe,pure:!0}),Qe})(),ne=(()=>{class Qe{transform(ot){return JSON.stringify(ot,null,2)}}return Qe.\u0275fac=function(ot){return new(ot||Qe)},Qe.\u0275pipe=r.Yjl({name:"json",type:Qe,pure:!1}),Qe})(),Lt=(()=>{class Qe{constructor(ot){this.differs=ot,this.keyValues=[],this.compareFn=on}transform(ot,jt=on){if(!ot||!(ot instanceof Map)&&"object"!=typeof ot)return null;this.differ||(this.differ=this.differs.find(ot).create());const zn=this.differ.diff(ot),qr=jt!==this.compareFn;return zn&&(this.keyValues=[],zn.forEachItem(Di=>{this.keyValues.push(function Le(Qe,zt){return{key:Qe,value:zt}}(Di.key,Di.currentValue))})),(zn||qr)&&(this.keyValues.sort(jt),this.compareFn=jt),this.keyValues}}return Qe.\u0275fac=function(ot){return new(ot||Qe)(r.Y36(r.aQg,16))},Qe.\u0275pipe=r.Yjl({name:"keyvalue",type:Qe,pure:!1}),Qe})();function on(Qe,zt){const ot=Qe.key,jt=zt.key;if(ot===jt)return 0;if(void 0===ot)return 1;if(void 0===jt)return-1;if(null===ot)return 1;if(null===jt)return-1;if("string"==typeof ot&&"string"==typeof jt)return ot<jt?-1:1;if("number"==typeof ot&&"number"==typeof jt)return ot-jt;if("boolean"==typeof ot&&"boolean"==typeof jt)return ot<jt?-1:1;const zn=String(ot),qr=String(jt);return zn==qr?0:zn<qr?-1:1}let Kr=(()=>{class Qe{constructor(ot){this._locale=ot}transform(ot,jt,zn){if(!hs(ot))return null;zn=zn||this._locale;try{return function Qn(Qe,zt,ot){return qn(Qe,Fr(pr(zt,We.Decimal),Fn(zt,Ne.MinusSign)),zt,Ne.Group,Ne.Decimal,ot)}(zo(ot),zn,jt)}catch(qr){throw Zo()}}}return Qe.\u0275fac=function(ot){return new(ot||Qe)(r.Y36(r.soG,16))},Qe.\u0275pipe=r.Yjl({name:"number",type:Qe,pure:!0}),Qe})(),bi=(()=>{class Qe{constructor(ot){this._locale=ot}transform(ot,jt,zn){if(!hs(ot))return null;zn=zn||this._locale;try{return function wn(Qe,zt,ot){return qn(Qe,Fr(pr(zt,We.Percent),Fn(zt,Ne.MinusSign)),zt,Ne.Group,Ne.Decimal,ot,!0).replace(new RegExp("%","g"),Fn(zt,Ne.PercentSign))}(zo(ot),zn,jt)}catch(qr){throw Zo()}}}return Qe.\u0275fac=function(ot){return new(ot||Qe)(r.Y36(r.soG,16))},Qe.\u0275pipe=r.Yjl({name:"percent",type:Qe,pure:!0}),Qe})();function hs(Qe){return!(null==Qe||""===Qe||Qe!=Qe)}function zo(Qe){if("string"==typeof Qe&&!isNaN(Number(Qe)-parseFloat(Qe)))return Number(Qe);if("number"!=typeof Qe)throw new Error(`${Qe} is not a number`);return Qe}let vl=(()=>{class Qe{}return Qe.\u0275fac=function(ot){return new(ot||Qe)},Qe.\u0275mod=r.oAB({type:Qe}),Qe.\u0275inj=r.cJS({}),Qe})();const ol="browser";function Tl(Qe){return Qe===ol}let Mc=(()=>{class Qe{}return Qe.\u0275prov=(0,r.Yz7)({token:Qe,providedIn:"root",factory:()=>new tu((0,r.LFG)(y),window)}),Qe})();class tu{constructor(zt,ot){this.document=zt,this.window=ot,this.offset=()=>[0,0]}setOffset(zt){this.offset=Array.isArray(zt)?()=>zt:zt}getScrollPosition(){return this.supportsScrolling()?[this.window.pageXOffset,this.window.pageYOffset]:[0,0]}scrollToPosition(zt){this.supportsScrolling()&&this.window.scrollTo(zt[0],zt[1])}scrollToAnchor(zt){if(!this.supportsScrolling())return;const ot=function Ml(Qe,zt){const ot=Qe.getElementById(zt)||Qe.getElementsByName(zt)[0];if(ot)return ot;if("function"==typeof Qe.createTreeWalker&&Qe.body&&(Qe.body.createShadowRoot||Qe.body.attachShadow)){const jt=Qe.createTreeWalker(Qe.body,NodeFilter.SHOW_ELEMENT);let zn=jt.currentNode;for(;zn;){const qr=zn.shadowRoot;if(qr){const Di=qr.getElementById(zt)||qr.querySelector(`[name="${zt}"]`);if(Di)return Di}zn=jt.nextNode()}}return null}(this.document,zt);ot&&(this.scrollToElement(ot),ot.focus())}setHistoryScrollRestoration(zt){if(this.supportScrollRestoration()){const ot=this.window.history;ot&&ot.scrollRestoration&&(ot.scrollRestoration=zt)}}scrollToElement(zt){const ot=zt.getBoundingClientRect(),jt=ot.left+this.window.pageXOffset,zn=ot.top+this.window.pageYOffset,qr=this.offset();this.window.scrollTo(jt-qr[0],zn-qr[1])}supportScrollRestoration(){try{if(!this.supportsScrolling())return!1;const zt=Wa(this.window.history)||Wa(Object.getPrototypeOf(this.window.history));return!(!zt||!zt.writable&&!zt.set)}catch(zt){return!1}}supportsScrolling(){try{return!!this.window&&!!this.window.scrollTo&&"pageXOffset"in this.window}catch(zt){return!1}}}function Wa(Qe){return Object.getOwnPropertyDescriptor(Qe,"scrollRestoration")}class Ua{}},19725:(m,S,i)=>{"use strict";i.d(S,{JF:()=>_i,LE:()=>ie,TP:()=>rt,UA:()=>xe,eN:()=>Ne});var r=i(11048),a=i(89724),f=i(25917),c=i(70882),e=i(94612),p=i(45435),y=i(88002);class T{}class C{}class R{constructor(Kt){this.normalizedNames=new Map,this.lazyUpdate=null,Kt?this.lazyInit="string"==typeof Kt?()=>{this.headers=new Map,Kt.split("\n").forEach(un=>{const jn=un.indexOf(":");if(jn>0){const Jn=un.slice(0,jn),Gn=Jn.toLowerCase(),Xr=un.slice(jn+1).trim();this.maybeSetNormalizedName(Jn,Gn),this.headers.has(Gn)?this.headers.get(Gn).push(Xr):this.headers.set(Gn,[Xr])}})}:()=>{this.headers=new Map,Object.keys(Kt).forEach(un=>{let jn=Kt[un];const Jn=un.toLowerCase();"string"==typeof jn&&(jn=[jn]),jn.length>0&&(this.headers.set(Jn,jn),this.maybeSetNormalizedName(un,Jn))})}:this.headers=new Map}has(Kt){return this.init(),this.headers.has(Kt.toLowerCase())}get(Kt){this.init();const un=this.headers.get(Kt.toLowerCase());return un&&un.length>0?un[0]:null}keys(){return this.init(),Array.from(this.normalizedNames.values())}getAll(Kt){return this.init(),this.headers.get(Kt.toLowerCase())||null}append(Kt,un){return this.clone({name:Kt,value:un,op:"a"})}set(Kt,un){return this.clone({name:Kt,value:un,op:"s"})}delete(Kt,un){return this.clone({name:Kt,value:un,op:"d"})}maybeSetNormalizedName(Kt,un){this.normalizedNames.has(un)||this.normalizedNames.set(un,Kt)}init(){this.lazyInit&&(this.lazyInit instanceof R?this.copyFrom(this.lazyInit):this.lazyInit(),this.lazyInit=null,this.lazyUpdate&&(this.lazyUpdate.forEach(Kt=>this.applyUpdate(Kt)),this.lazyUpdate=null))}copyFrom(Kt){Kt.init(),Array.from(Kt.headers.keys()).forEach(un=>{this.headers.set(un,Kt.headers.get(un)),this.normalizedNames.set(un,Kt.normalizedNames.get(un))})}clone(Kt){const un=new R;return un.lazyInit=this.lazyInit&&this.lazyInit instanceof R?this.lazyInit:this,un.lazyUpdate=(this.lazyUpdate||[]).concat([Kt]),un}applyUpdate(Kt){const un=Kt.name.toLowerCase();switch(Kt.op){case"a":case"s":let jn=Kt.value;if("string"==typeof jn&&(jn=[jn]),0===jn.length)return;this.maybeSetNormalizedName(Kt.name,un);const Jn=("a"===Kt.op?this.headers.get(un):void 0)||[];Jn.push(...jn),this.headers.set(un,Jn);break;case"d":const Gn=Kt.value;if(Gn){let Xr=this.headers.get(un);if(!Xr)return;Xr=Xr.filter(Zi=>-1===Gn.indexOf(Zi)),0===Xr.length?(this.headers.delete(un),this.normalizedNames.delete(un)):this.headers.set(un,Xr)}else this.headers.delete(un),this.normalizedNames.delete(un)}}forEach(Kt){this.init(),Array.from(this.normalizedNames.keys()).forEach(un=>Kt(this.normalizedNames.get(un),this.headers.get(un)))}}class L{encodeKey(Kt){return ee(Kt)}encodeValue(Kt){return ee(Kt)}decodeKey(Kt){return decodeURIComponent(Kt)}decodeValue(Kt){return decodeURIComponent(Kt)}}const W=/%(\d[a-f0-9])/gi,J={40:"@","3A":":",24:"$","2C":",","3B":";","2B":"+","3D":"=","3F":"?","2F":"/"};function ee(Sr){return encodeURIComponent(Sr).replace(W,(Kt,un)=>{var jn;return null!==(jn=J[un])&&void 0!==jn?jn:Kt})}function ce(Sr){return`${Sr}`}class ie{constructor(Kt={}){if(this.updates=null,this.cloneFrom=null,this.encoder=Kt.encoder||new L,Kt.fromString){if(Kt.fromObject)throw new Error("Cannot specify both fromString and fromObject.");this.map=function z(Sr,Kt){const un=new Map;return Sr.length>0&&Sr.replace(/^\?/,"").split("&").forEach(Jn=>{const Gn=Jn.indexOf("="),[Xr,Zi]=-1==Gn?[Kt.decodeKey(Jn),""]:[Kt.decodeKey(Jn.slice(0,Gn)),Kt.decodeValue(Jn.slice(Gn+1))],ii=un.get(Xr)||[];ii.push(Zi),un.set(Xr,ii)}),un}(Kt.fromString,this.encoder)}else Kt.fromObject?(this.map=new Map,Object.keys(Kt.fromObject).forEach(un=>{const jn=Kt.fromObject[un];this.map.set(un,Array.isArray(jn)?jn:[jn])})):this.map=null}has(Kt){return this.init(),this.map.has(Kt)}get(Kt){this.init();const un=this.map.get(Kt);return un?un[0]:null}getAll(Kt){return this.init(),this.map.get(Kt)||null}keys(){return this.init(),Array.from(this.map.keys())}append(Kt,un){return this.clone({param:Kt,value:un,op:"a"})}appendAll(Kt){const un=[];return Object.keys(Kt).forEach(jn=>{const Jn=Kt[jn];Array.isArray(Jn)?Jn.forEach(Gn=>{un.push({param:jn,value:Gn,op:"a"})}):un.push({param:jn,value:Jn,op:"a"})}),this.clone(un)}set(Kt,un){return this.clone({param:Kt,value:un,op:"s"})}delete(Kt,un){return this.clone({param:Kt,value:un,op:"d"})}toString(){return this.init(),this.keys().map(Kt=>{const un=this.encoder.encodeKey(Kt);return this.map.get(Kt).map(jn=>un+"="+this.encoder.encodeValue(jn)).join("&")}).filter(Kt=>""!==Kt).join("&")}clone(Kt){const un=new ie({encoder:this.encoder});return un.cloneFrom=this.cloneFrom||this,un.updates=(this.updates||[]).concat(Kt),un}init(){null===this.map&&(this.map=new Map),null!==this.cloneFrom&&(this.cloneFrom.init(),this.cloneFrom.keys().forEach(Kt=>this.map.set(Kt,this.cloneFrom.map.get(Kt))),this.updates.forEach(Kt=>{switch(Kt.op){case"a":case"s":const un=("a"===Kt.op?this.map.get(Kt.param):void 0)||[];un.push(ce(Kt.value)),this.map.set(Kt.param,un);break;case"d":if(void 0===Kt.value){this.map.delete(Kt.param);break}{let jn=this.map.get(Kt.param)||[];const Jn=jn.indexOf(ce(Kt.value));-1!==Jn&&jn.splice(Jn,1),jn.length>0?this.map.set(Kt.param,jn):this.map.delete(Kt.param)}}}),this.cloneFrom=this.updates=null)}}class se{constructor(){this.map=new Map}set(Kt,un){return this.map.set(Kt,un),this}get(Kt){return this.map.has(Kt)||this.map.set(Kt,Kt.defaultValue()),this.map.get(Kt)}delete(Kt){return this.map.delete(Kt),this}has(Kt){return this.map.has(Kt)}keys(){return this.map.keys()}}function ae(Sr){return"undefined"!=typeof ArrayBuffer&&Sr instanceof ArrayBuffer}function he(Sr){return"undefined"!=typeof Blob&&Sr instanceof Blob}function be(Sr){return"undefined"!=typeof FormData&&Sr instanceof FormData}class ue{constructor(Kt,un,jn,Jn){let Gn;if(this.url=un,this.body=null,this.reportProgress=!1,this.withCredentials=!1,this.responseType="json",this.method=Kt.toUpperCase(),function ge(Sr){switch(Sr){case"DELETE":case"GET":case"HEAD":case"OPTIONS":case"JSONP":return!1;default:return!0}}(this.method)||Jn?(this.body=void 0!==jn?jn:null,Gn=Jn):Gn=jn,Gn&&(this.reportProgress=!!Gn.reportProgress,this.withCredentials=!!Gn.withCredentials,Gn.responseType&&(this.responseType=Gn.responseType),Gn.headers&&(this.headers=Gn.headers),Gn.context&&(this.context=Gn.context),Gn.params&&(this.params=Gn.params)),this.headers||(this.headers=new R),this.context||(this.context=new se),this.params){const Xr=this.params.toString();if(0===Xr.length)this.urlWithParams=un;else{const Zi=un.indexOf("?");this.urlWithParams=un+(-1===Zi?"?":Zi<un.length-1?"&":"")+Xr}}else this.params=new ie,this.urlWithParams=un}serializeBody(){return null===this.body?null:ae(this.body)||he(this.body)||be(this.body)||function we(Sr){return"undefined"!=typeof URLSearchParams&&Sr instanceof URLSearchParams}(this.body)||"string"==typeof this.body?this.body:this.body instanceof ie?this.body.toString():"object"==typeof this.body||"boolean"==typeof this.body||Array.isArray(this.body)?JSON.stringify(this.body):this.body.toString()}detectContentTypeHeader(){return null===this.body||be(this.body)?null:he(this.body)?this.body.type||null:ae(this.body)?null:"string"==typeof this.body?"text/plain":this.body instanceof ie?"application/x-www-form-urlencoded;charset=UTF-8":"object"==typeof this.body||"number"==typeof this.body||"boolean"==typeof this.body?"application/json":null}clone(Kt={}){var un;const jn=Kt.method||this.method,Jn=Kt.url||this.url,Gn=Kt.responseType||this.responseType,Xr=void 0!==Kt.body?Kt.body:this.body,Zi=void 0!==Kt.withCredentials?Kt.withCredentials:this.withCredentials,ii=void 0!==Kt.reportProgress?Kt.reportProgress:this.reportProgress;let hr=Kt.headers||this.headers,Ki=Kt.params||this.params;const ln=null!==(un=Kt.context)&&void 0!==un?un:this.context;return void 0!==Kt.setHeaders&&(hr=Object.keys(Kt.setHeaders).reduce((Mn,Zn)=>Mn.set(Zn,Kt.setHeaders[Zn]),hr)),Kt.setParams&&(Ki=Object.keys(Kt.setParams).reduce((Mn,Zn)=>Mn.set(Zn,Kt.setParams[Zn]),Ki)),new ue(jn,Jn,Xr,{params:Ki,headers:hr,context:ln,reportProgress:ii,responseType:Gn,withCredentials:Zi})}}var st=(()=>((st=st||{})[st.Sent=0]="Sent",st[st.UploadProgress=1]="UploadProgress",st[st.ResponseHeader=2]="ResponseHeader",st[st.DownloadProgress=3]="DownloadProgress",st[st.Response=4]="Response",st[st.User=5]="User",st))();class We{constructor(Kt,un=200,jn="OK"){this.headers=Kt.headers||new R,this.status=void 0!==Kt.status?Kt.status:un,this.statusText=Kt.statusText||jn,this.url=Kt.url||null,this.ok=this.status>=200&&this.status<300}}class Ve extends We{constructor(Kt={}){super(Kt),this.type=st.ResponseHeader}clone(Kt={}){return new Ve({headers:Kt.headers||this.headers,status:void 0!==Kt.status?Kt.status:this.status,statusText:Kt.statusText||this.statusText,url:Kt.url||this.url||void 0})}}class Be extends We{constructor(Kt={}){super(Kt),this.type=st.Response,this.body=void 0!==Kt.body?Kt.body:null}clone(Kt={}){return new Be({body:void 0!==Kt.body?Kt.body:this.body,headers:Kt.headers||this.headers,status:void 0!==Kt.status?Kt.status:this.status,statusText:Kt.statusText||this.statusText,url:Kt.url||this.url||void 0})}}class xe extends We{constructor(Kt){super(Kt,0,"Unknown Error"),this.name="HttpErrorResponse",this.ok=!1,this.message=this.status>=200&&this.status<300?`Http failure during parsing for ${Kt.url||"(unknown url)"}`:`Http failure response for ${Kt.url||"(unknown url)"}: ${Kt.status} ${Kt.statusText}`,this.error=Kt.error||null}}function je(Sr,Kt){return{body:Kt,headers:Sr.headers,context:Sr.context,observe:Sr.observe,params:Sr.params,reportProgress:Sr.reportProgress,responseType:Sr.responseType,withCredentials:Sr.withCredentials}}let Ne=(()=>{class Sr{constructor(un){this.handler=un}request(un,jn,Jn={}){let Gn;if(un instanceof ue)Gn=un;else{let ii,hr;ii=Jn.headers instanceof R?Jn.headers:new R(Jn.headers),Jn.params&&(hr=Jn.params instanceof ie?Jn.params:new ie({fromObject:Jn.params})),Gn=new ue(un,jn,void 0!==Jn.body?Jn.body:null,{headers:ii,context:Jn.context,params:hr,reportProgress:Jn.reportProgress,responseType:Jn.responseType||"json",withCredentials:Jn.withCredentials})}const Xr=(0,f.of)(Gn).pipe((0,e.b)(ii=>this.handler.handle(ii)));if(un instanceof ue||"events"===Jn.observe)return Xr;const Zi=Xr.pipe((0,p.h)(ii=>ii instanceof Be));switch(Jn.observe||"body"){case"body":switch(Gn.responseType){case"arraybuffer":return Zi.pipe((0,y.U)(ii=>{if(null!==ii.body&&!(ii.body instanceof ArrayBuffer))throw new Error("Response is not an ArrayBuffer.");return ii.body}));case"blob":return Zi.pipe((0,y.U)(ii=>{if(null!==ii.body&&!(ii.body instanceof Blob))throw new Error("Response is not a Blob.");return ii.body}));case"text":return Zi.pipe((0,y.U)(ii=>{if(null!==ii.body&&"string"!=typeof ii.body)throw new Error("Response is not a string.");return ii.body}));default:return Zi.pipe((0,y.U)(ii=>ii.body))}case"response":return Zi;default:throw new Error(`Unreachable: unhandled observe type ${Jn.observe}}`)}}delete(un,jn={}){return this.request("DELETE",un,jn)}get(un,jn={}){return this.request("GET",un,jn)}head(un,jn={}){return this.request("HEAD",un,jn)}jsonp(un,jn){return this.request("JSONP",un,{params:(new ie).append(jn,"JSONP_CALLBACK"),observe:"body",responseType:"json"})}options(un,jn={}){return this.request("OPTIONS",un,jn)}patch(un,jn,Jn={}){return this.request("PATCH",un,je(Jn,jn))}post(un,jn,Jn={}){return this.request("POST",un,je(Jn,jn))}put(un,jn,Jn={}){return this.request("PUT",un,je(Jn,jn))}}return Sr.\u0275fac=function(un){return new(un||Sr)(a.LFG(T))},Sr.\u0275prov=a.Yz7({token:Sr,factory:Sr.\u0275fac}),Sr})();class Bt{constructor(Kt,un){this.next=Kt,this.interceptor=un}handle(Kt){return this.interceptor.intercept(Kt,this.next)}}const rt=new a.OlP("HTTP_INTERCEPTORS");let en=(()=>{class Sr{intercept(un,jn){return jn.handle(un)}}return Sr.\u0275fac=function(un){return new(un||Sr)},Sr.\u0275prov=a.Yz7({token:Sr,factory:Sr.\u0275fac}),Sr})();const Fn=/^\)\]\}',?\n/;let Ei=(()=>{class Sr{constructor(un){this.xhrFactory=un}handle(un){if("JSONP"===un.method)throw new Error("Attempted to construct Jsonp request without HttpClientJsonpModule installed.");return new c.y(jn=>{const Jn=this.xhrFactory.build();if(Jn.open(un.method,un.urlWithParams),un.withCredentials&&(Jn.withCredentials=!0),un.headers.forEach((Zn,cn)=>Jn.setRequestHeader(Zn,cn.join(","))),un.headers.has("Accept")||Jn.setRequestHeader("Accept","application/json, text/plain, */*"),!un.headers.has("Content-Type")){const Zn=un.detectContentTypeHeader();null!==Zn&&Jn.setRequestHeader("Content-Type",Zn)}if(un.responseType){const Zn=un.responseType.toLowerCase();Jn.responseType="json"!==Zn?Zn:"text"}const Gn=un.serializeBody();let Xr=null;const Zi=()=>{if(null!==Xr)return Xr;const Zn=Jn.statusText||"OK",cn=new R(Jn.getAllResponseHeaders()),Sn=function pr(Sr){return"responseURL"in Sr&&Sr.responseURL?Sr.responseURL:/^X-Request-URL:/m.test(Sr.getAllResponseHeaders())?Sr.getResponseHeader("X-Request-URL"):null}(Jn)||un.url;return Xr=new Ve({headers:cn,status:Jn.status,statusText:Zn,url:Sn}),Xr},ii=()=>{let{headers:Zn,status:cn,statusText:Sn,url:Or}=Zi(),ri=null;204!==cn&&(ri=void 0===Jn.response?Jn.responseText:Jn.response),0===cn&&(cn=ri?200:0);let vi=cn>=200&&cn<300;if("json"===un.responseType&&"string"==typeof ri){const Ui=ri;ri=ri.replace(Fn,"");try{ri=""!==ri?JSON.parse(ri):null}catch(ao){ri=Ui,vi&&(vi=!1,ri={error:ao,text:ri})}}vi?(jn.next(new Be({body:ri,headers:Zn,status:cn,statusText:Sn,url:Or||void 0})),jn.complete()):jn.error(new xe({error:ri,headers:Zn,status:cn,statusText:Sn,url:Or||void 0}))},hr=Zn=>{const{url:cn}=Zi(),Sn=new xe({error:Zn,status:Jn.status||0,statusText:Jn.statusText||"Unknown Error",url:cn||void 0});jn.error(Sn)};let Ki=!1;const ln=Zn=>{Ki||(jn.next(Zi()),Ki=!0);let cn={type:st.DownloadProgress,loaded:Zn.loaded};Zn.lengthComputable&&(cn.total=Zn.total),"text"===un.responseType&&!!Jn.responseText&&(cn.partialText=Jn.responseText),jn.next(cn)},Mn=Zn=>{let cn={type:st.UploadProgress,loaded:Zn.loaded};Zn.lengthComputable&&(cn.total=Zn.total),jn.next(cn)};return Jn.addEventListener("load",ii),Jn.addEventListener("error",hr),Jn.addEventListener("timeout",hr),Jn.addEventListener("abort",hr),un.reportProgress&&(Jn.addEventListener("progress",ln),null!==Gn&&Jn.upload&&Jn.upload.addEventListener("progress",Mn)),Jn.send(Gn),jn.next({type:st.Sent}),()=>{Jn.removeEventListener("error",hr),Jn.removeEventListener("abort",hr),Jn.removeEventListener("load",ii),Jn.removeEventListener("timeout",hr),un.reportProgress&&(Jn.removeEventListener("progress",ln),null!==Gn&&Jn.upload&&Jn.upload.removeEventListener("progress",Mn)),Jn.readyState!==Jn.DONE&&Jn.abort()}})}}return Sr.\u0275fac=function(un){return new(un||Sr)(a.LFG(r.JF))},Sr.\u0275prov=a.Yz7({token:Sr,factory:Sr.\u0275fac}),Sr})();const mi=new a.OlP("XSRF_COOKIE_NAME"),ur=new a.OlP("XSRF_HEADER_NAME");class $r{}let Br=(()=>{class Sr{constructor(un,jn,Jn){this.doc=un,this.platform=jn,this.cookieName=Jn,this.lastCookieString="",this.lastToken=null,this.parseCount=0}getToken(){if("server"===this.platform)return null;const un=this.doc.cookie||"";return un!==this.lastCookieString&&(this.parseCount++,this.lastToken=(0,r.Mx)(un,this.cookieName),this.lastCookieString=un),this.lastToken}}return Sr.\u0275fac=function(un){return new(un||Sr)(a.LFG(r.K0),a.LFG(a.Lbi),a.LFG(mi))},Sr.\u0275prov=a.Yz7({token:Sr,factory:Sr.\u0275fac}),Sr})(),Pn=(()=>{class Sr{constructor(un,jn){this.tokenService=un,this.headerName=jn}intercept(un,jn){const Jn=un.url.toLowerCase();if("GET"===un.method||"HEAD"===un.method||Jn.startsWith("http://")||Jn.startsWith("https://"))return jn.handle(un);const Gn=this.tokenService.getToken();return null!==Gn&&!un.headers.has(this.headerName)&&(un=un.clone({headers:un.headers.set(this.headerName,Gn)})),jn.handle(un)}}return Sr.\u0275fac=function(un){return new(un||Sr)(a.LFG($r),a.LFG(ur))},Sr.\u0275prov=a.Yz7({token:Sr,factory:Sr.\u0275fac}),Sr})(),Xn=(()=>{class Sr{constructor(un,jn){this.backend=un,this.injector=jn,this.chain=null}handle(un){if(null===this.chain){const jn=this.injector.get(rt,[]);this.chain=jn.reduceRight((Jn,Gn)=>new Bt(Jn,Gn),this.backend)}return this.chain.handle(un)}}return Sr.\u0275fac=function(un){return new(un||Sr)(a.LFG(C),a.LFG(a.zs3))},Sr.\u0275prov=a.Yz7({token:Sr,factory:Sr.\u0275fac}),Sr})(),Ci=(()=>{class Sr{static disable(){return{ngModule:Sr,providers:[{provide:Pn,useClass:en}]}}static withOptions(un={}){return{ngModule:Sr,providers:[un.cookieName?{provide:mi,useValue:un.cookieName}:[],un.headerName?{provide:ur,useValue:un.headerName}:[]]}}}return Sr.\u0275fac=function(un){return new(un||Sr)},Sr.\u0275mod=a.oAB({type:Sr}),Sr.\u0275inj=a.cJS({providers:[Pn,{provide:rt,useExisting:Pn,multi:!0},{provide:$r,useClass:Br},{provide:mi,useValue:"XSRF-TOKEN"},{provide:ur,useValue:"X-XSRF-TOKEN"}]}),Sr})(),_i=(()=>{class Sr{}return Sr.\u0275fac=function(un){return new(un||Sr)},Sr.\u0275mod=a.oAB({type:Sr}),Sr.\u0275inj=a.cJS({providers:[Ne,{provide:T,useClass:Xn},Ei,{provide:C,useExisting:Ei}],imports:[[Ci.withOptions({cookieName:"XSRF-TOKEN",headerName:"X-XSRF-TOKEN"})]]}),Sr})()},89724:(m,S,i)=>{"use strict";i.d(S,{$8M:()=>sd,$Z:()=>wl,AFp:()=>wT,ALo:()=>Qy,AaK:()=>T,AsE:()=>Z1,BQk:()=>rh,CHM:()=>Ia,CRH:()=>sT,CZH:()=>uE,CqO:()=>hb,DdM:()=>Wy,DjV:()=>zb,Dn7:()=>KS,DtL:()=>MS,EJc:()=>eO,EiD:()=>Zh,EpF:()=>gy,F$t:()=>vb,F4k:()=>B1,FYo:()=>RS,FiY:()=>ar,G48:()=>Wm,Gf:()=>iT,GfV:()=>PS,GkF:()=>bv,Gpc:()=>L,Gre:()=>jb,Hsn:()=>yb,IIB:()=>AT,Ikx:()=>wy,JOm:()=>zu,JVY:()=>dh,Jf7:()=>Pf,L6k:()=>Hp,LAX:()=>g_,LFG:()=>me,LSH:()=>Qd,Lbi:()=>K2,MAs:()=>N1,MGl:()=>Sv,MT6:()=>Gb,N_p:()=>Ly,NdJ:()=>my,OlP:()=>Xa,Oqu:()=>Ay,PXZ:()=>fO,Q6J:()=>Ra,QGY:()=>am,Qsj:()=>NS,QtT:()=>ky,R0b:()=>p_,RDi:()=>Wa,Rgc:()=>Lv,SBq:()=>Rv,SDv:()=>CS,Sil:()=>nO,Suo:()=>oT,TTD:()=>hs,TgZ:()=>Bf,Tol:()=>Nb,Udp:()=>Ty,UuU:()=>DS,VKq:()=>$S,VLi:()=>uO,W1O:()=>cT,WLB:()=>HS,X6Q:()=>UT,XFs:()=>dr,Xpm:()=>dt,Y36:()=>Ea,YKP:()=>FS,YNc:()=>R1,Yjl:()=>kt,Yz7:()=>Nt,ZZ4:()=>CE,Zx4:()=>$y,_Bn:()=>AS,_UZ:()=>op,_Vd:()=>e0,_c5:()=>OO,_uU:()=>$b,aQg:()=>OE,c2e:()=>d0,cJS:()=>Yt,cg1:()=>Ry,d8E:()=>xy,dDg:()=>IT,deG:()=>ul,dqk:()=>hr,eBb:()=>cl,eFA:()=>kT,ekj:()=>Cy,g9A:()=>RT,h0i:()=>Ym,hGG:()=>AO,hYB:()=>by,hij:()=>V1,i9L:()=>$p,iGM:()=>rT,ifc:()=>Jn,ip1:()=>DT,kEZ:()=>BS,kL8:()=>nS,kYT:()=>Rt,l5B:()=>US,lG2:()=>pt,lcZ:()=>JS,lnq:()=>Dy,mCW:()=>wf,n5z:()=>hf,oAB:()=>_t,oJD:()=>Wh,oxw:()=>mb,pB0:()=>Df,pQV:()=>Fy,pYS:()=>Gu,q3G:()=>Ou,qLn:()=>Tp,qOj:()=>S1,qZA:()=>lf,qbA:()=>YS,qzn:()=>Jd,r_U:()=>Q2,s9C:()=>Ey,sBO:()=>dm,sIi:()=>im,s_b:()=>o0,soG:()=>cE,tBr:()=>Bn,tHW:()=>Iy,tb:()=>NT,tp0:()=>$i,uIk:()=>gv,uOi:()=>y_,vHH:()=>ee,vpe:()=>Q_,wAp:()=>Va,xi3:()=>QS,xp6:()=>ia,yhl:()=>Bd,ynx:()=>Rp,z2F:()=>g0,z3N:()=>xc,zSh:()=>_u,zs3:()=>R_});var r=i(79765),a=i(13464),f=i(70882),c=i(66682),e=i(4121);function p(u){for(let d in u)if(u[d]===p)return d;throw Error("Could not find renamed property on target object.")}function y(u,d){for(const g in d)d.hasOwnProperty(g)&&!u.hasOwnProperty(g)&&(u[g]=d[g])}function T(u){if("string"==typeof u)return u;if(Array.isArray(u))return"["+u.map(T).join(", ")+"]";if(null==u)return""+u;if(u.overriddenName)return`${u.overriddenName}`;if(u.name)return`${u.name}`;const d=u.toString();if(null==d)return""+d;const g=d.indexOf("\n");return-1===g?d:d.substring(0,g)}function C(u,d){return null==u||""===u?null===d?"":d:null==d||""===d?u:u+" "+d}const R=p({__forward_ref__:p});function L(u){return u.__forward_ref__=L,u.toString=function(){return T(this())},u}function z(u){return W(u)?u():u}function W(u){return"function"==typeof u&&u.hasOwnProperty(R)&&u.__forward_ref__===L}class ee extends Error{constructor(d,g){super(function ce(u,d){return`NG0${Math.abs(u)}${d?": "+d:""}`}(d,g)),this.code=d}}function ie(u){return"string"==typeof u?u:null==u?"":String(u)}function U(u){return"function"==typeof u?u.name||u.toString():"object"==typeof u&&null!=u&&"function"==typeof u.type?u.type.name||u.type.toString():ie(u)}function he(u,d){const g=d?` in ${d}`:"";throw new ee(-201,`No provider for ${U(u)} found${g}`)}function Vt(u,d,g,A){throw new Error(`ASSERTION ERROR: ${u}`+(null==A?"":` [Expected=> ${g} ${A} ${d} <=Actual]`))}function Nt(u){return{token:u.token,providedIn:u.providedIn||null,factory:u.factory,value:void 0}}function Yt(u){return{providers:u.providers||[],imports:u.imports||[]}}function Fn(u){return pr(u,$r)||pr(u,Pn)}function pr(u,d){return u.hasOwnProperty(d)?u[d]:null}function ur(u){return u&&(u.hasOwnProperty(Br)||u.hasOwnProperty(Xn))?u[Br]:null}const $r=p({\u0275prov:p}),Br=p({\u0275inj:p}),Pn=p({ngInjectableDef:p}),Xn=p({ngInjectorDef:p});var dr=(()=>((dr=dr||{})[dr.Default=0]="Default",dr[dr.Host=1]="Host",dr[dr.Self=2]="Self",dr[dr.SkipSelf=4]="SkipSelf",dr[dr.Optional=8]="Optional",dr))();let Qr;function _i(u){const d=Qr;return Qr=u,d}function so(u,d,g){const A=Fn(u);return A&&"root"==A.providedIn?void 0===A.value?A.value=A.factory():A.value:g&dr.Optional?null:void 0!==d?d:void he(T(u),"Injector")}function Sr(u){return{toString:u}.toString()}var Kt=(()=>((Kt=Kt||{})[Kt.OnPush=0]="OnPush",Kt[Kt.Default=1]="Default",Kt))(),Jn=(()=>{return(u=Jn||(Jn={}))[u.Emulated=0]="Emulated",u[u.None=2]="None",u[u.ShadowDom=3]="ShadowDom",Jn;var u})();const Gn="undefined"!=typeof globalThis&&globalThis,Xr="undefined"!=typeof window&&window,Zi="undefined"!=typeof self&&"undefined"!=typeof WorkerGlobalScope&&self instanceof WorkerGlobalScope&&self,hr=Gn||"undefined"!=typeof global&&global||Xr||Zi,Mn={},Zn=[],cn=p({\u0275cmp:p}),Sn=p({\u0275dir:p}),Or=p({\u0275pipe:p}),ri=p({\u0275mod:p}),vi=p({\u0275fac:p}),Ui=p({__NG_ELEMENT_ID__:p});let ao=0;function dt(u){return Sr(()=>{const g={},A={type:u.type,providersResolver:null,decls:u.decls,vars:u.vars,factory:null,template:u.template||null,consts:u.consts||null,ngContentSelectors:u.ngContentSelectors,hostBindings:u.hostBindings||null,hostVars:u.hostVars||0,hostAttrs:u.hostAttrs||null,contentQueries:u.contentQueries||null,declaredInputs:g,inputs:null,outputs:null,exportAs:u.exportAs||null,onPush:u.changeDetection===Kt.OnPush,directiveDefs:null,pipeDefs:null,selectors:u.selectors||Zn,viewQuery:u.viewQuery||null,features:u.features||null,data:u.data||{},encapsulation:u.encapsulation||Jn.Emulated,id:"c",styles:u.styles||Zn,_:null,setInput:null,schemas:u.schemas||null,tView:null},k=u.directives,q=u.features,pe=u.pipes;return A.id+=ao++,A.inputs=ct(u.inputs,g),A.outputs=ct(u.outputs),q&&q.forEach(Re=>Re(A)),A.directiveDefs=k?()=>("function"==typeof k?k():k).map(to):null,A.pipeDefs=pe?()=>("function"==typeof pe?pe():pe).map(Gt):null,A})}function to(u){return dn(u)||function mr(u){return u[Sn]||null}(u)}function Gt(u){return function Oi(u){return u[Or]||null}(u)}const Rn={};function _t(u){return Sr(()=>{const d={type:u.type,bootstrap:u.bootstrap||Zn,declarations:u.declarations||Zn,imports:u.imports||Zn,exports:u.exports||Zn,transitiveCompileScopes:null,schemas:u.schemas||null,id:u.id||null};return null!=u.id&&(Rn[u.id]=u.type),d})}function Rt(u,d){return Sr(()=>{const g=di(u,!0);g.declarations=d.declarations||Zn,g.imports=d.imports||Zn,g.exports=d.exports||Zn})}function ct(u,d){if(null==u)return Mn;const g={};for(const A in u)if(u.hasOwnProperty(A)){let k=u[A],q=k;Array.isArray(k)&&(q=k[1],k=k[0]),g[k]=A,d&&(d[k]=q)}return g}const pt=dt;function kt(u){return{type:u.type,name:u.name,factory:null,pure:!1!==u.pure,onDestroy:u.type.prototype.ngOnDestroy||null}}function dn(u){return u[cn]||null}function di(u,d){const g=u[ri]||null;if(!g&&!0===d)throw new Error(`Type ${T(u)} does not have '\u0275mod' property.`);return g}function es(u){return Array.isArray(u)&&"object"==typeof u[1]}function ga(u){return Array.isArray(u)&&!0===u[1]}function ya(u){return 0!=(8&u.flags)}function fa(u){return 2==(2&u.flags)}function la(u){return 1==(1&u.flags)}function Pa(u){return null!==u.template}function fl(u){return 0!=(512&u[2])}function bi(u,d){return u.hasOwnProperty(vi)?u[vi]:null}class Ii{constructor(d,g,A){this.previousValue=d,this.currentValue=g,this.firstChange=A}isFirstChange(){return this.firstChange}}function hs(){return zo}function zo(u){return u.type.prototype.ngOnChanges&&(u.setInput=Xs),Ls}function Ls(){const u=ol(this),d=null==u?void 0:u.current;if(d){const g=u.previous;if(g===Mn)u.previous=d;else for(let A in d)g[A]=d[A];u.current=null,this.ngOnChanges(d)}}function Xs(u,d,g,A){const k=ol(u)||function Wl(u,d){return u[vl]=d}(u,{previous:Mn,current:null}),q=k.current||(k.current={}),pe=k.previous,Re=this.declaredInputs[g],Ue=pe[Re];q[Re]=new Ii(Ue&&Ue.currentValue,d,pe===Mn),u[A]=d}hs.ngInherit=!0;const vl="__ngSimpleChanges__";function ol(u){return u[vl]||null}let tu;function Wa(u){tu=u}function Ml(){return void 0!==tu?tu:"undefined"!=typeof document?document:void 0}function Ua(u){return!!u.listen}const Qe={createRenderer:(u,d)=>Ml()};function ot(u){for(;Array.isArray(u);)u=u[0];return u}function qr(u,d){return ot(d[u])}function Di(u,d){return ot(d[u.index])}function js(u,d){return u.data[d]}function As(u,d){return u[d]}function Ns(u,d){const g=d[u];return es(g)?g:g[0]}function Io(u){return 4==(4&u[2])}function Ka(u){return 128==(128&u[2])}function Bs(u,d){return null==d?null:u[d]}function lt(u){u[18]=0}function Xe(u,d){u[5]+=d;let g=u,A=u[3];for(;null!==A&&(1===d&&1===g[5]||-1===d&&0===g[5]);)A[5]+=d,g=A,A=A[3]}const ke={lFrame:_r(null),bindingsEnabled:!0};function Xu(){return ke.bindingsEnabled}function Hi(){return ke.lFrame.lView}function oa(){return ke.lFrame.tView}function Ia(u){return ke.lFrame.contextLView=u,u[8]}function ys(){let u=qu();for(;null!==u&&64===u.type;)u=u.parent;return u}function qu(){return ke.lFrame.currentTNode}function bl(){const u=ke.lFrame,d=u.currentTNode;return u.isParent?d:d.parent}function su(u,d){const g=ke.lFrame;g.currentTNode=u,g.isParent=d}function vu(){return ke.lFrame.isParent}function nu(){ke.lFrame.isParent=!1}function au(){const u=ke.lFrame;let d=u.bindingRootIndex;return-1===d&&(d=u.bindingRootIndex=u.tView.bindingStartIndex),d}function uu(){return ke.lFrame.bindingIndex}function $u(){return ke.lFrame.bindingIndex++}function Hu(u){const d=ke.lFrame,g=d.bindingIndex;return d.bindingIndex=d.bindingIndex+u,g}function Fd(u){ke.lFrame.inI18n=u}function Bo(u,d){const g=ke.lFrame;g.bindingIndex=g.bindingRootIndex=u,Er(d)}function Er(u){ke.lFrame.currentDirectiveIndex=u}function j(u){const d=ke.lFrame.currentDirectiveIndex;return-1===d?null:u[d]}function Ce(){return ke.lFrame.currentQueryIndex}function nt(u){ke.lFrame.currentQueryIndex=u}function Mt(u){const d=u[1];return 2===d.type?d.declTNode:1===d.type?u[6]:null}function wt(u,d,g){if(g&dr.SkipSelf){let k=d,q=u;for(;!(k=k.parent,null!==k||g&dr.Host||(k=Mt(q),null===k||(q=q[15],10&k.type))););if(null===k)return!1;d=k,u=q}const A=ke.lFrame=Cn();return A.currentTNode=d,A.lView=u,!0}function sn(u){const d=Cn(),g=u[1];ke.lFrame=d,d.currentTNode=g.firstChild,d.lView=u,d.tView=g,d.contextLView=u,d.bindingIndex=g.bindingStartIndex,d.inI18n=!1}function Cn(){const u=ke.lFrame,d=null===u?null:u.child;return null===d?_r(u):d}function _r(u){const d={currentTNode:null,isParent:!0,lView:null,tView:null,selectedIndex:-1,contextLView:null,elementDepthCount:0,currentNamespace:null,currentDirectiveIndex:-1,bindingRootIndex:-1,bindingIndex:-1,currentQueryIndex:0,parent:u,child:null,inI18n:!1};return null!==u&&(u.child=d),d}function ni(){const u=ke.lFrame;return ke.lFrame=u.parent,u.currentTNode=null,u.lView=null,u}const fi=ni;function gi(){const u=ni();u.isParent=!0,u.tView=null,u.selectedIndex=-1,u.contextLView=null,u.elementDepthCount=0,u.currentDirectiveIndex=-1,u.currentNamespace=null,u.bindingRootIndex=-1,u.bindingIndex=-1,u.currentQueryIndex=0}function kn(){return ke.lFrame.selectedIndex}function Ar(u){ke.lFrame.selectedIndex=u}function gr(){const u=ke.lFrame;return js(u.tView,u.selectedIndex)}function Fc(u,d){for(let g=d.directiveStart,A=d.directiveEnd;g<A;g++){const q=u.data[g].type.prototype,{ngAfterContentInit:pe,ngAfterContentChecked:Re,ngAfterViewInit:Ue,ngAfterViewChecked:Dt,ngOnDestroy:Zt}=q;pe&&(u.contentHooks||(u.contentHooks=[])).push(-g,pe),Re&&((u.contentHooks||(u.contentHooks=[])).push(g,Re),(u.contentCheckHooks||(u.contentCheckHooks=[])).push(g,Re)),Ue&&(u.viewHooks||(u.viewHooks=[])).push(-g,Ue),Dt&&((u.viewHooks||(u.viewHooks=[])).push(g,Dt),(u.viewCheckHooks||(u.viewCheckHooks=[])).push(g,Dt)),null!=Zt&&(u.destroyHooks||(u.destroyHooks=[])).push(g,Zt)}}function xu(u,d,g){yd(u,d,3,g)}function Eu(u,d,g,A){(3&u[2])===g&&yd(u,d,g,A)}function Gd(u,d){let g=u[2];(3&g)===d&&(g&=2047,g+=1,u[2]=g)}function yd(u,d,g,A){const q=null!=A?A:-1,pe=d.length-1;let Re=0;for(let Ue=void 0!==A?65535&u[18]:0;Ue<pe;Ue++)if("number"==typeof d[Ue+1]){if(Re=d[Ue],null!=A&&Re>=A)break}else d[Ue]<0&&(u[18]+=65536),(Re<q||-1==q)&&(Ed(u,g,d,Ue),u[18]=(4294901760&u[18])+Ue+2),Ue++}function Ed(u,d,g,A){const k=g[A]<0,q=g[A+1],Re=u[k?-g[A]:g[A]];if(k){if(u[2]>>11<u[18]>>16&&(3&u[2])===d){u[2]+=2048;try{q.call(Re)}finally{}}}else try{q.call(Re)}finally{}}class La{constructor(d,g,A){this.factory=d,this.resolving=!1,this.canSeeViewProviders=g,this.injectImpl=A}}function gc(u,d,g){const A=Ua(u);let k=0;for(;k<g.length;){const q=g[k];if("number"==typeof q){if(0!==q)break;k++;const pe=g[k++],Re=g[k++],Ue=g[k++];A?u.setAttribute(d,Re,Ue,pe):d.setAttributeNS(pe,Re,Ue)}else{const pe=q,Re=g[++k];pa(pe)?A&&u.setProperty(d,pe,Re):A?u.setAttribute(d,pe,Re):d.setAttribute(pe,Re),k++}}return k}function _n(u){return 3===u||4===u||6===u}function pa(u){return 64===u.charCodeAt(0)}function od(u,d){if(null!==d&&0!==d.length)if(null===u||0===u.length)u=d.slice();else{let g=-1;for(let A=0;A<d.length;A++){const k=d[A];"number"==typeof k?g=k:0===g||$e(u,g,k,null,-1===g||2===g?d[++A]:null)}}return u}function $e(u,d,g,A,k){let q=0,pe=u.length;if(-1===d)pe=-1;else for(;q<u.length;){const Re=u[q++];if("number"==typeof Re){if(Re===d){pe=-1;break}if(Re>d){pe=q-1;break}}}for(;q<u.length;){const Re=u[q];if("number"==typeof Re)break;if(Re===g){if(null===A)return void(null!==k&&(u[q+1]=k));if(A===u[q+1])return void(u[q+2]=k)}q++,null!==A&&q++,null!==k&&q++}-1!==pe&&(u.splice(pe,0,d),q=pe+1),u.splice(q++,0,g),null!==A&&u.splice(q++,0,A),null!==k&&u.splice(q++,0,k)}function Me(u){return-1!==u}function _e(u){return 32767&u}function vt(u,d){let g=function at(u){return u>>16}(u),A=d;for(;g>0;)A=A[15],g--;return A}let Qt=!0;function Ln(u){const d=Qt;return Qt=u,d}let Ta=0;function ha(u,d){const g=Ru(u,d);if(-1!==g)return g;const A=d[1];A.firstCreatePass&&(u.injectorIndex=d.length,Ca(A.data,u),Ca(d,null),Ca(A.blueprint,null));const k=lc(u,d),q=u.injectorIndex;if(Me(k)){const pe=_e(k),Re=vt(k,d),Ue=Re[1].data;for(let Dt=0;Dt<8;Dt++)d[q+Dt]=Re[pe+Dt]|Ue[pe+Dt]}return d[q+8]=k,q}function Ca(u,d){u.push(0,0,0,0,0,0,0,0,d)}function Ru(u,d){return-1===u.injectorIndex||u.parent&&u.parent.injectorIndex===u.injectorIndex||null===d[u.injectorIndex+8]?-1:u.injectorIndex}function lc(u,d){if(u.parent&&-1!==u.parent.injectorIndex)return u.parent.injectorIndex;let g=0,A=null,k=d;for(;null!==k;){const q=k[1],pe=q.type;if(A=2===pe?q.declTNode:1===pe?k[6]:null,null===A)return-1;if(g++,k=k[15],-1!==A.injectorIndex)return A.injectorIndex|g<<16}return-1}function Fa(u,d,g){!function _s(u,d,g){let A;"string"==typeof g?A=g.charCodeAt(0)||0:g.hasOwnProperty(Ui)&&(A=g[Ui]),null==A&&(A=g[Ui]=Ta++);const k=255&A;d.data[u+(k>>5)]|=1<<k}(u,d,g)}function mc(u,d,g){if(g&dr.Optional)return u;he(d,"NodeInjector")}function vc(u,d,g,A){if(g&dr.Optional&&void 0===A&&(A=null),0==(g&(dr.Self|dr.Host))){const k=u[9],q=_i(void 0);try{return k?k.get(d,A,g&dr.Optional):so(d,A,g&dr.Optional)}finally{_i(q)}}return mc(A,d,g)}function Bu(u,d,g,A=dr.Default,k){if(null!==u){const q=function Ma(u){if("string"==typeof u)return u.charCodeAt(0)||0;const d=u.hasOwnProperty(Ui)?u[Ui]:void 0;return"number"==typeof d?d>=0?255&d:tc:d}(g);if("function"==typeof q){if(!wt(d,u,A))return A&dr.Host?mc(k,g,A):vc(d,g,A,k);try{const pe=q(A);if(null!=pe||A&dr.Optional)return pe;he(g)}finally{fi()}}else if("number"==typeof q){let pe=null,Re=Ru(u,d),Ue=-1,Dt=A&dr.Host?d[16][6]:null;for((-1===Re||A&dr.SkipSelf)&&(Ue=-1===Re?lc(u,d):d[Re+8],-1!==Ue&&Il(A,!1)?(pe=d[1],Re=_e(Ue),d=vt(Ue,d)):Re=-1);-1!==Re;){const Zt=d[1];if(al(q,Re,Zt.data)){const Dn=bd(Re,d,g,pe,A,Dt);if(Dn!==Bl)return Dn}Ue=d[Re+8],-1!==Ue&&Il(A,d[1].data[Re+8]===Dt)&&al(q,Re,d)?(pe=Zt,Re=_e(Ue),d=vt(Ue,d)):Re=-1}}}return vc(d,g,A,k)}const Bl={};function tc(){return new Cl(ys(),Hi())}function bd(u,d,g,A,k,q){const pe=d[1],Re=pe.data[u+8],Zt=kc(Re,pe,g,null==A?fa(Re)&&Qt:A!=pe&&0!=(3&Re.type),k&dr.Host&&q===Re);return null!==Zt?lu(d,pe,Zt,Re):Bl}function kc(u,d,g,A,k){const q=u.providerIndexes,pe=d.data,Re=1048575&q,Ue=u.directiveStart,Zt=q>>20,br=k?Re+Zt:u.directiveEnd;for(let Jr=A?Re:Re+Zt;Jr<br;Jr++){const Vi=pe[Jr];if(Jr<Ue&&g===Vi||Jr>=Ue&&Vi.type===g)return Jr}if(k){const Jr=pe[Ue];if(Jr&&Pa(Jr)&&Jr.type===g)return Ue}return null}function lu(u,d,g,A){let k=u[g];const q=d.data;if(function kd(u){return u instanceof La}(k)){const pe=k;pe.resolving&&function se(u,d){const g=d?`. Dependency path: ${d.join(" > ")} > ${u}`:"";throw new ee(-200,`Circular dependency in DI detected for ${u}${g}`)}(U(q[g]));const Re=Ln(pe.canSeeViewProviders);pe.resolving=!0;const Ue=pe.injectImpl?_i(pe.injectImpl):null;wt(u,A,dr.Default);try{k=u[g]=pe.factory(void 0,q,u,A),d.firstCreatePass&&g>=A.directiveStart&&function Wc(u,d,g){const{ngOnChanges:A,ngOnInit:k,ngDoCheck:q}=d.type.prototype;if(A){const pe=zo(d);(g.preOrderHooks||(g.preOrderHooks=[])).push(u,pe),(g.preOrderCheckHooks||(g.preOrderCheckHooks=[])).push(u,pe)}k&&(g.preOrderHooks||(g.preOrderHooks=[])).push(0-u,k),q&&((g.preOrderHooks||(g.preOrderHooks=[])).push(u,q),(g.preOrderCheckHooks||(g.preOrderCheckHooks=[])).push(u,q))}(g,q[g],d)}finally{null!==Ue&&_i(Ue),Ln(Re),pe.resolving=!1,fi()}}return k}function al(u,d,g){return!!(g[d+(u>>5)]&1<<u)}function Il(u,d){return!(u&dr.Self||u&dr.Host&&d)}class Cl{constructor(d,g){this._tNode=d,this._lView=g}get(d,g,A){return Bu(this._tNode,this._lView,d,A,g)}}function hf(u){return Sr(()=>{const d=u.prototype.constructor,g=d[vi]||zd(d),A=Object.prototype;let k=Object.getPrototypeOf(u.prototype).constructor;for(;k&&k!==A;){const q=k[vi]||zd(k);if(q&&q!==g)return q;k=Object.getPrototypeOf(k)}return q=>new q})}function zd(u){return W(u)?()=>{const d=zd(z(u));return d&&d()}:bi(u)}function sd(u){return function nl(u,d){if("class"===d)return u.classes;if("style"===d)return u.styles;const g=u.attrs;if(g){const A=g.length;let k=0;for(;k<A;){const q=g[k];if(_n(q))break;if(0===q)k+=2;else if("number"==typeof q)for(k++;k<A&&"string"==typeof g[k];)k++;else{if(q===d)return g[k+1];k+=2}}}return null}(ys(),u)}const Ll="__parameters__",Uu="__prop__metadata__";function Su(u){return function(...g){if(u){const A=u(...g);for(const k in A)this[k]=A[k]}}}function tn(u,d,g){return Sr(()=>{const A=Su(d);function k(...q){if(this instanceof k)return A.apply(this,q),this;const pe=new k(...q);return Re.annotation=pe,Re;function Re(Ue,Dt,Zt){const Dn=Ue.hasOwnProperty(Ll)?Ue[Ll]:Object.defineProperty(Ue,Ll,{value:[]})[Ll];for(;Dn.length<=Zt;)Dn.push(null);return(Dn[Zt]=Dn[Zt]||[]).push(pe),Ue}}return g&&(k.prototype=Object.create(g.prototype)),k.prototype.ngMetadataName=u,k.annotationCls=k,k})}function yc(u,d,g,A){return Sr(()=>{const k=Su(d);function q(...pe){if(this instanceof q)return k.apply(this,pe),this;const Re=new q(...pe);return function Ue(Dt,Zt){const Dn=Dt.constructor,br=Dn.hasOwnProperty(Uu)?Dn[Uu]:Object.defineProperty(Dn,Uu,{value:{}})[Uu];br[Zt]=br.hasOwnProperty(Zt)&&br[Zt]||[],br[Zt].unshift(Re),A&&A(Dt,Zt,...pe)}}return g&&(q.prototype=Object.create(g.prototype)),q.prototype.ngMetadataName=u,q.annotationCls=q,q})}class Xa{constructor(d,g){this._desc=d,this.ngMetadataName="InjectionToken",this.\u0275prov=void 0,"number"==typeof g?this.__NG_ELEMENT_ID__=g:void 0!==g&&(this.\u0275prov=Nt({token:this,providedIn:g.providedIn||"root",factory:g.factory}))}toString(){return`InjectionToken ${this._desc}`}}const ul=new Xa("AnalyzeForEntryComponents");class Yc{}const $p=yc("ViewChild",(u,d)=>Object.assign({selector:u,first:!0,isViewQuery:!0,descendants:!0},d),Yc);function $c(u,d){void 0===d&&(d=u);for(let g=0;g<u.length;g++){let A=u[g];Array.isArray(A)?(d===u&&(d=u.slice(0,g)),$c(A,d)):d!==u&&d.push(A)}return d}function Pu(u,d){u.forEach(g=>Array.isArray(g)?Pu(g,d):d(g))}function ad(u,d,g){d>=u.length?u.push(g):u.splice(d,0,g)}function nc(u,d){return d>=u.length-1?u.pop():u.splice(d,1)[0]}function Oa(u,d){const g=[];for(let A=0;A<u;A++)g.push(d);return g}function Fl(u,d,g){let A=ma(u,d);return A>=0?u[1|A]=g:(A=~A,function cp(u,d,g,A){let k=u.length;if(k==d)u.push(g,A);else if(1===k)u.push(A,u[0]),u[0]=g;else{for(k--,u.push(u[k-1],u[k]);k>d;)u[k]=u[k-2],k--;u[d]=g,u[d+1]=A}}(u,A,d,g)),A}function Ac(u,d){const g=ma(u,d);if(g>=0)return u[1|g]}function ma(u,d){return function Iu(u,d,g){let A=0,k=u.length>>g;for(;k!==A;){const q=A+(k-A>>1),pe=u[q<<g];if(d===pe)return q<<g;pe>d?k=q:A=q+1}return~(k<<g)}(u,d,1)}const Zd={},Qc="__NG_DI_FLAG__",Rl="ngTempTokenPath",fc=/\n/gm,E="__source",x=p({provide:String,useValue:p});let F;function Q(u){const d=F;return F=u,d}function le(u,d=dr.Default){if(void 0===F)throw new ee(203,"");return null===F?so(u,void 0,d):F.get(u,d&dr.Optional?null:void 0,d)}function me(u,d=dr.Default){return(function Ci(){return Qr}()||le)(z(u),d)}const Oe=me;function Je(u){const d=[];for(let g=0;g<u.length;g++){const A=z(u[g]);if(Array.isArray(A)){if(0===A.length)throw new ee(900,"");let k,q=dr.Default;for(let pe=0;pe<A.length;pe++){const Re=A[pe],Ue=gt(Re);"number"==typeof Ue?-1===Ue?k=Re.token:q|=Ue:k=Re}d.push(me(k,q))}else d.push(me(A))}return d}function ht(u,d){return u[Qc]=d,u.prototype[Qc]=d,u}function gt(u){return u[Qc]}const Bn=ht(tn("Inject",u=>({token:u})),-1),ar=ht(tn("Optional"),8),$i=ht(tn("SkipSelf"),4);let K,Si;function et(u){var d;return(null===(d=function Ee(){if(void 0===K&&(K=null,hr.trustedTypes))try{K=hr.trustedTypes.createPolicy("angular",{createHTML:u=>u,createScript:u=>u,createScriptURL:u=>u})}catch(u){}return K}())||void 0===d?void 0:d.createHTML(u))||u}function gs(){if(void 0===Si&&(Si=null,hr.trustedTypes))try{Si=hr.trustedTypes.createPolicy("angular#unsafe-bypass",{createHTML:u=>u,createScript:u=>u,createScriptURL:u=>u})}catch(u){}return Si}function Aa(u){var d;return(null===(d=gs())||void 0===d?void 0:d.createHTML(u))||u}function Al(u){var d;return(null===(d=gs())||void 0===d?void 0:d.createScriptURL(u))||u}class Ul{constructor(d){this.changingThisBreaksApplicationSecurity=d}toString(){return`SafeValue must use [property]=binding: ${this.changingThisBreaksApplicationSecurity} (see https://g.co/ng/security#xss)`}}class Gc extends Ul{getTypeName(){return"HTML"}}class gf extends Ul{getTypeName(){return"Style"}}class Hd extends Ul{getTypeName(){return"Script"}}class __ extends Ul{getTypeName(){return"URL"}}class ch extends Ul{getTypeName(){return"ResourceURL"}}function xc(u){return u instanceof Ul?u.changingThisBreaksApplicationSecurity:u}function Jd(u,d){const g=Bd(u);if(null!=g&&g!==d){if("ResourceURL"===g&&"URL"===d)return!0;throw new Error(`Required a safe ${d}, got a ${g} (see https://g.co/ng/security#xss)`)}return g===d}function Bd(u){return u instanceof Ul&&u.getTypeName()||null}function dh(u){return new Gc(u)}function Hp(u){return new gf(u)}function cl(u){return new Hd(u)}function g_(u){return new __(u)}function Df(u){return new ch(u)}function Ud(u){const d=new Kl(u);return function dp(){try{return!!(new window.DOMParser).parseFromString(et(""),"text/html")}catch(u){return!1}}()?new cd(d):d}class cd{constructor(d){this.inertDocumentHelper=d}getInertBodyElement(d){d="<body><remove></remove>"+d;try{const g=(new window.DOMParser).parseFromString(et(d),"text/html").body;return null===g?this.inertDocumentHelper.getInertBodyElement(d):(g.removeChild(g.firstChild),g)}catch(g){return null}}}class Kl{constructor(d){if(this.defaultDoc=d,this.inertDocument=this.defaultDoc.implementation.createHTMLDocument("sanitization-inert"),null==this.inertDocument.body){const g=this.inertDocument.createElement("html");this.inertDocument.appendChild(g);const A=this.inertDocument.createElement("body");g.appendChild(A)}}getInertBodyElement(d){const g=this.inertDocument.createElement("template");if("content"in g)return g.innerHTML=et(d),g;const A=this.inertDocument.createElement("body");return A.innerHTML=et(d),this.defaultDoc.documentMode&&this.stripCustomNsAttrs(A),A}stripCustomNsAttrs(d){const g=d.attributes;for(let k=g.length-1;0<k;k--){const pe=g.item(k).name;("xmlns:ns1"===pe||0===pe.indexOf("ns1:"))&&d.removeAttribute(pe)}let A=d.firstChild;for(;A;)A.nodeType===Node.ELEMENT_NODE&&this.stripCustomNsAttrs(A),A=A.nextSibling}}const dd=/^(?:(?:https?|mailto|ftp|tel|file|sms):|[^&:/?#]*(?:[/?#]|$))/gi,fh=/^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 wf(u){return(u=String(u)).match(dd)||u.match(fh)?u:"unsafe:"+u}function Bp(u){return(u=String(u)).split(",").map(d=>wf(d.trim())).join(", ")}function mf(u){const d={};for(const g of u.split(","))d[g]=!0;return d}function rc(...u){const d={};for(const g of u)for(const A in g)g.hasOwnProperty(A)&&(d[A]=!0);return d}const Cd=mf("area,br,col,hr,img,wbr"),Up=mf("colgroup,dd,dt,li,p,tbody,td,tfoot,th,thead,tr"),ph=mf("rp,rt"),vf=rc(Cd,rc(Up,mf("address,article,aside,blockquote,caption,center,del,details,dialog,dir,div,dl,figure,figcaption,footer,h1,h2,h3,h4,h5,h6,header,hgroup,hr,ins,main,map,menu,nav,ol,pre,section,summary,table,ul")),rc(ph,mf("a,abbr,acronym,audio,b,bdi,bdo,big,br,cite,code,del,dfn,em,font,i,img,ins,kbd,label,map,mark,picture,q,ruby,rp,rt,s,samp,small,source,span,strike,strong,sub,sup,time,track,tt,u,var,video")),rc(ph,Up)),yf=mf("background,cite,href,itemtype,longdesc,poster,src,xlink:href"),zf=mf("srcset"),Mu=rc(yf,zf,mf("abbr,accesskey,align,alt,autoplay,axis,bgcolor,border,cellpadding,cellspacing,class,clear,color,cols,colspan,compact,controls,coords,datetime,default,dir,download,face,headers,height,hidden,hreflang,hspace,ismap,itemscope,itemprop,kind,label,lang,language,loop,media,muted,nohref,nowrap,open,preload,rel,rev,role,rows,rowspan,rules,scope,scrolling,shape,size,sizes,span,srclang,start,summary,tabindex,target,title,translate,type,usemap,valign,value,vspace,width"),mf("aria-activedescendant,aria-atomic,aria-autocomplete,aria-busy,aria-checked,aria-colcount,aria-colindex,aria-colspan,aria-controls,aria-current,aria-describedby,aria-details,aria-disabled,aria-dropeffect,aria-errormessage,aria-expanded,aria-flowto,aria-grabbed,aria-haspopup,aria-hidden,aria-invalid,aria-keyshortcuts,aria-label,aria-labelledby,aria-level,aria-live,aria-modal,aria-multiline,aria-multiselectable,aria-orientation,aria-owns,aria-placeholder,aria-posinset,aria-pressed,aria-readonly,aria-relevant,aria-required,aria-roledescription,aria-rowcount,aria-rowindex,aria-rowspan,aria-selected,aria-setsize,aria-sort,aria-valuemax,aria-valuemin,aria-valuenow,aria-valuetext")),Rf=mf("script,style,template");class zh{constructor(){this.sanitizedSomething=!1,this.buf=[]}sanitizeChildren(d){let g=d.firstChild,A=!0;for(;g;)if(g.nodeType===Node.ELEMENT_NODE?A=this.startElement(g):g.nodeType===Node.TEXT_NODE?this.chars(g.nodeValue):this.sanitizedSomething=!0,A&&g.firstChild)g=g.firstChild;else for(;g;){g.nodeType===Node.ELEMENT_NODE&&this.endElement(g);let k=this.checkClobberedElement(g,g.nextSibling);if(k){g=k;break}g=this.checkClobberedElement(g,g.parentNode)}return this.buf.join("")}startElement(d){const g=d.nodeName.toLowerCase();if(!vf.hasOwnProperty(g))return this.sanitizedSomething=!0,!Rf.hasOwnProperty(g);this.buf.push("<"),this.buf.push(g);const A=d.attributes;for(let k=0;k<A.length;k++){const q=A.item(k),pe=q.name,Re=pe.toLowerCase();if(!Mu.hasOwnProperty(Re)){this.sanitizedSomething=!0;continue}let Ue=q.value;yf[Re]&&(Ue=wf(Ue)),zf[Re]&&(Ue=Bp(Ue)),this.buf.push(" ",pe,'="',gh(Ue),'"')}return this.buf.push(">"),!0}endElement(d){const g=d.nodeName.toLowerCase();vf.hasOwnProperty(g)&&!Cd.hasOwnProperty(g)&&(this.buf.push("</"),this.buf.push(g),this.buf.push(">"))}chars(d){this.buf.push(gh(d))}checkClobberedElement(d,g){if(g&&(d.compareDocumentPosition(g)&Node.DOCUMENT_POSITION_CONTAINED_BY)===Node.DOCUMENT_POSITION_CONTAINED_BY)throw new Error(`Failed to sanitize html because the element is clobbered: ${d.outerHTML}`);return g}}const Vh=/[\uD800-\uDBFF][\uDC00-\uDFFF]/g,v_=/([^\#-~ |!])/g;function gh(u){return u.replace(/&/g,"&amp;").replace(Vh,function(d){return"&#"+(1024*(d.charCodeAt(0)-55296)+(d.charCodeAt(1)-56320)+65536)+";"}).replace(v_,function(d){return"&#"+d.charCodeAt(0)+";"}).replace(/</g,"&lt;").replace(/>/g,"&gt;")}let Yp;function Zh(u,d){let g=null;try{Yp=Yp||Ud(u);let A=d?String(d):"";g=Yp.getInertBodyElement(A);let k=5,q=A;do{if(0===k)throw new Error("Failed to sanitize html because the input is unstable");k--,A=q,q=g.innerHTML,g=Yp.getInertBodyElement(A)}while(A!==q);return et((new zh).sanitizeChildren(mh(g)||g))}finally{if(g){const A=mh(g)||g;for(;A.firstChild;)A.removeChild(A.firstChild)}}}function mh(u){return"content"in u&&function tg(u){return u.nodeType===Node.ELEMENT_NODE&&"TEMPLATE"===u.nodeName}(u)?u.content:null}var Ou=(()=>((Ou=Ou||{})[Ou.NONE=0]="NONE",Ou[Ou.HTML=1]="HTML",Ou[Ou.STYLE=2]="STYLE",Ou[Ou.SCRIPT=3]="SCRIPT",Ou[Ou.URL=4]="URL",Ou[Ou.RESOURCE_URL=5]="RESOURCE_URL",Ou))();function Wh(u){const d=Ad();return d?Aa(d.sanitize(Ou.HTML,u)||""):Jd(u,"HTML")?Aa(xc(u)):Zh(Ml(),ie(u))}function Qd(u){const d=Ad();return d?d.sanitize(Ou.URL,u)||"":Jd(u,"URL")?xc(u):wf(ie(u))}function y_(u){const d=Ad();if(d)return Al(d.sanitize(Ou.RESOURCE_URL,u)||"");if(Jd(u,"ResourceURL"))return Al(xc(u));throw new ee(904,"")}function Ad(){const u=Hi();return u&&u[12]}const Xh="__ngContext__";function ic(u,d){u[Xh]=d}function Vf(u){const d=function Kd(u){return u[Xh]||null}(u);return d?Array.isArray(d)?d:d.lView:null}function n_(u){return u.ngOriginalError}function Sh(u,...d){u.error(...d)}class Tp{constructor(){this._console=console}handleError(d){const g=this._findOriginalError(d),A=function Zf(u){return u&&u.ngErrorLogger||Sh}(d);A(this._console,"ERROR",d),g&&A(this._console,"ORIGINAL ERROR",g)}_findOriginalError(d){let g=d&&n_(d);for(;g&&n_(g);)g=n_(g);return g||null}}const Ch=/^>|^->|<!--|-->|--!>|<!-$/g,da=/(<|>)/;const Mh=(()=>("undefined"!=typeof requestAnimationFrame&&requestAnimationFrame||setTimeout).bind(hr))();function Pf(u){return u.ownerDocument.defaultView}function Gu(u){return u.ownerDocument.body}function qd(u){return u instanceof Function?u():u}var zu=(()=>((zu=zu||{})[zu.Important=1]="Important",zu[zu.DashCase=2]="DashCase",zu))();let zp;function pc(u,d){return zp(u,d)}function Lf(u){const d=u[3];return ga(d)?d[3]:d}function ef(u){return Oh(u[13])}function tf(u){return Oh(u[4])}function Oh(u){for(;null!==u&&!ga(u);)u=u[4];return u}function fd(u,d,g,A,k){if(null!=A){let q,pe=!1;ga(A)?q=A:es(A)&&(pe=!0,A=A[0]);const Re=ot(A);0===u&&null!==g?null==k?Dp(d,g,Re):qf(d,g,Re,k||null,!0):1===u&&null!==g?qf(d,g,Re,k||null,!0):2===u?Rh(d,Re,pe):3===u&&d.destroyNode(Re),null!=q&&function u_(u,d,g,A,k){const q=g[7];q!==ot(g)&&fd(d,u,A,q,k);for(let Re=10;Re<g.length;Re++){const Ue=g[Re];Xp(Ue[1],Ue,u,d,A,q)}}(d,u,q,g,k)}}function Dh(u,d){return Ua(u)?u.createText(d):u.createTextNode(d)}function Mp(u,d,g){Ua(u)?u.setValue(d,g):d.textContent=g}function wh(u,d){return u.createComment(function Fu(u){return u.replace(Ch,d=>d.replace(da,"\u200b$1\u200b"))}(d))}function zc(u,d,g){if(Ua(u))return u.createElement(d,g);{const A=null!==g?function Mc(u){const d=u.toLowerCase();return"svg"===d?"http://www.w3.org/2000/svg":"math"===d?"http://www.w3.org/1998/MathML/":null}(g):null;return null===A?u.createElement(d):u.createElementNS(A,d)}}function i_(u,d){const g=u[9],A=g.indexOf(d),k=d[3];1024&d[2]&&(d[2]&=-1025,Xe(k,-1)),g.splice(A,1)}function o_(u,d){if(u.length<=10)return;const g=10+d,A=u[g];if(A){const k=A[17];null!==k&&k!==u&&i_(k,A),d>0&&(u[g-1][4]=A[4]);const q=nc(u,10+d);!function Qf(u,d){Xp(u,d,d[11],2,null,null),d[0]=null,d[6]=null}(A[1],A);const pe=q[19];null!==pe&&pe.detachView(q[1]),A[3]=null,A[4]=null,A[2]&=-129}return A}function Ap(u,d){if(!(256&d[2])){const g=d[11];Ua(g)&&g.destroyNode&&Xp(u,d,g,3,null,null),function Dd(u){let d=u[13];if(!d)return Wp(u[1],u);for(;d;){let g=null;if(es(d))g=d[13];else{const A=d[10];A&&(g=A)}if(!g){for(;d&&!d[4]&&d!==u;)es(d)&&Wp(d[1],d),d=d[3];null===d&&(d=u),es(d)&&Wp(d[1],d),g=d&&d[4]}d=g}}(d)}}function Wp(u,d){if(!(256&d[2])){d[2]&=-129,d[2]|=256,function Xf(u,d){let g;if(null!=u&&null!=(g=u.destroyHooks))for(let A=0;A<g.length;A+=2){const k=d[g[A]];if(!(k instanceof La)){const q=g[A+1];if(Array.isArray(q))for(let pe=0;pe<q.length;pe+=2){const Re=k[q[pe]],Ue=q[pe+1];try{Ue.call(Re)}finally{}}else try{q.call(k)}finally{}}}}(u,d),function nf(u,d){const g=u.cleanup,A=d[7];let k=-1;if(null!==g)for(let q=0;q<g.length-1;q+=2)if("string"==typeof g[q]){const pe=g[q+1],Re="function"==typeof pe?pe(d):ot(d[pe]),Ue=A[k=g[q+2]],Dt=g[q+3];"boolean"==typeof Dt?Re.removeEventListener(g[q],Ue,Dt):Dt>=0?A[k=Dt]():A[k=-Dt].unsubscribe(),q+=2}else{const pe=A[k=g[q+1]];g[q].call(pe)}if(null!==A){for(let q=k+1;q<A.length;q++)A[q]();d[7]=null}}(u,d),1===d[1].type&&Ua(d[11])&&d[11].destroy();const g=d[17];if(null!==g&&ga(d[3])){g!==d[3]&&i_(g,d);const A=d[19];null!==A&&A.detachView(u)}}}function Jp(u,d,g){return T_(u,d.parent,g)}function T_(u,d,g){let A=d;for(;null!==A&&40&A.type;)A=(d=A).parent;if(null===A)return g[0];if(2&A.flags){const k=u.data[A.directiveStart].encapsulation;if(k===Jn.None||k===Jn.Emulated)return null}return Di(A,g)}function qf(u,d,g,A,k){Ua(u)?u.insertBefore(d,g,A,k):d.insertBefore(g,A,k)}function Dp(u,d,g){Ua(u)?u.appendChild(d,g):d.appendChild(g)}function s_(u,d,g,A,k){null!==A?qf(u,d,g,A,k):Dp(u,d,g)}function Qp(u,d){return Ua(u)?u.parentNode(d):d.parentNode}function ep(u,d,g){return M_(u,d,g)}function xh(u,d,g){return 40&u.type?Di(u,g):null}let Sf,M_=xh;function a_(u,d){M_=u,Sf=d}function tp(u,d,g,A){const k=Jp(u,A,d),q=d[11],Re=ep(A.parent||d[6],A,d);if(null!=k)if(Array.isArray(g))for(let Ue=0;Ue<g.length;Ue++)s_(q,k,g[Ue],Re,!1);else s_(q,k,g,Re,!1);void 0!==Sf&&Sf(q,A,d,g,k)}function Kp(u,d){if(null!==d){const g=d.type;if(3&g)return Di(d,u);if(4&g)return Ff(-1,u[d.index]);if(8&g){const A=d.child;if(null!==A)return Kp(u,A);{const k=u[d.index];return ga(k)?Ff(-1,k):ot(k)}}if(32&g)return pc(d,u)()||ot(u[d.index]);{const A=l_(u,d);return null!==A?Array.isArray(A)?A[0]:Kp(Lf(u[16]),A):Kp(u,d.next)}}return null}function l_(u,d){return null!==d?u[16][6].projection[d.projection]:null}function Ff(u,d){const g=10+u+1;if(g<d.length){const A=d[g],k=A[1].firstChild;if(null!==k)return Kp(A,k)}return d[7]}function Rh(u,d,g){const A=Qp(u,d);A&&function rg(u,d,g,A){Ua(u)?u.removeChild(d,g,A):d.removeChild(g)}(u,A,d,g)}function np(u,d,g,A,k,q,pe){for(;null!=g;){const Re=A[g.index],Ue=g.type;if(pe&&0===d&&(Re&&ic(ot(Re),A),g.flags|=4),64!=(64&g.flags))if(8&Ue)np(u,d,g.child,A,k,q,!1),fd(d,u,k,Re,q);else if(32&Ue){const Dt=pc(g,A);let Zt;for(;Zt=Dt();)fd(d,u,k,Zt,q);fd(d,u,k,Re,q)}else 16&Ue?pd(u,d,A,g,k,q):fd(d,u,k,Re,q);g=pe?g.projectionNext:g.next}}function Xp(u,d,g,A,k,q){np(g,A,u.firstChild,d,k,q,!1)}function pd(u,d,g,A,k,q){const pe=g[16],Ue=pe[6].projection[A.projection];if(Array.isArray(Ue))for(let Dt=0;Dt<Ue.length;Dt++)fd(d,u,k,Ue[Dt],q);else np(u,d,Ue,pe[3],k,q,!0)}function pp(u,d,g){Ua(u)?u.setAttribute(d,"style",g):d.style.cssText=g}function Nh(u,d,g){Ua(u)?""===g?u.removeAttribute(d,"class"):u.setAttribute(d,"class",g):d.className=g}function Vc(u,d,g){let A=u.length;for(;;){const k=u.indexOf(d,g);if(-1===k)return k;if(0===k||u.charCodeAt(k-1)<=32){const q=d.length;if(k+q===A||u.charCodeAt(k+q)<=32)return k}g=k+1}}const O_="ng-template";function B_(u,d,g){let A=0;for(;A<u.length;){let k=u[A++];if(g&&"class"===k){if(k=u[A],-1!==Vc(k.toLowerCase(),d,0))return!0}else if(1===k){for(;A<u.length&&"string"==typeof(k=u[A++]);)if(k.toLowerCase()===d)return!0;return!1}}return!1}function P(u){return 4===u.type&&u.value!==O_}function te(u,d,g){return d===(4!==u.type||g?u.value:O_)}function b(u,d,g){let A=4;const k=u.attrs||[],q=function fr(u){for(let d=0;d<u.length;d++)if(_n(u[d]))return d;return u.length}(k);let pe=!1;for(let Re=0;Re<d.length;Re++){const Ue=d[Re];if("number"!=typeof Ue){if(!pe)if(4&A){if(A=2|1&A,""!==Ue&&!te(u,Ue,g)||""===Ue&&1===d.length){if(G(A))return!1;pe=!0}}else{const Dt=8&A?Ue:d[++Re];if(8&A&&null!==u.attrs){if(!B_(u.attrs,Dt,g)){if(G(A))return!1;pe=!0}continue}const Dn=Te(8&A?"class":Ue,k,P(u),g);if(-1===Dn){if(G(A))return!1;pe=!0;continue}if(""!==Dt){let br;br=Dn>q?"":k[Dn+1].toLowerCase();const Jr=8&A?br:null;if(Jr&&-1!==Vc(Jr,Dt,0)||2&A&&Dt!==br){if(G(A))return!1;pe=!0}}}}else{if(!pe&&!G(A)&&!G(Ue))return!1;if(pe&&G(Ue))continue;pe=!1,A=Ue|1&A}}return G(A)||pe}function G(u){return 0==(1&u)}function Te(u,d,g,A){if(null===d)return-1;let k=0;if(A||!g){let q=!1;for(;k<d.length;){const pe=d[k];if(pe===u)return k;if(3===pe||6===pe)q=!0;else{if(1===pe||2===pe){let Re=d[++k];for(;"string"==typeof Re;)Re=d[++k];continue}if(4===pe)break;if(0===pe){k+=4;continue}}k+=q?1:2}return-1}return function wr(u,d){let g=u.indexOf(4);if(g>-1)for(g++;g<u.length;){const A=u[g];if("number"==typeof A)return-1;if(A===d)return g;g++}return-1}(d,u)}function Ge(u,d,g=!1){for(let A=0;A<d.length;A++)if(b(u,d[A],g))return!0;return!1}function ci(u,d){e:for(let g=0;g<d.length;g++){const A=d[g];if(u.length===A.length){for(let k=0;k<u.length;k++)if(u[k]!==A[k])continue e;return!0}}return!1}function oi(u,d){return u?":not("+d.trim()+")":d}function ts(u){let d=u[0],g=1,A=2,k="",q=!1;for(;g<u.length;){let pe=u[g];if("string"==typeof pe)if(2&A){const Re=u[++g];k+="["+pe+(Re.length>0?'="'+Re+'"':"")+"]"}else 8&A?k+="."+pe:4&A&&(k+=" "+pe);else""!==k&&!G(pe)&&(d+=oi(q,k),k=""),A=pe,q=q||!G(A);g++}return""!==k&&(d+=oi(q,k)),d}const Yo={};function ia(u){v(oa(),Hi(),kn()+u,!1)}function v(u,d,g,A){if(!A)if(3==(3&d[2])){const q=u.preOrderCheckHooks;null!==q&&xu(d,q,g)}else{const q=u.preOrderHooks;null!==q&&Eu(d,q,0,g)}Ar(g)}function B(u,d){return u<<17|d<<2}function ye(u){return u>>17&32767}function Wt(u){return 2|u}function gn(u){return(131068&u)>>2}function nr(u,d){return-131069&u|d<<2}function $o(u){return 1|u}function Qg(u,d){const g=u.contentQueries;if(null!==g)for(let A=0;A<g.length;A+=2){const k=g[A],q=g[A+1];if(-1!==q){const pe=u.data[q];nt(k),pe.contentQueries(2,d[q],q)}}}function ug(u,d,g,A,k,q,pe,Re,Ue,Dt){const Zt=d.blueprint.slice();return Zt[0]=k,Zt[2]=140|A,lt(Zt),Zt[3]=Zt[15]=u,Zt[8]=g,Zt[10]=pe||u&&u[10],Zt[11]=Re||u&&u[11],Zt[12]=Ue||u&&u[12]||null,Zt[9]=Dt||u&&u[9]||null,Zt[6]=q,Zt[16]=2==d.type?u[16]:Zt,Zt}function A_(u,d,g,A,k){let q=u.data[d];if(null===q)q=Eg(u,d,g,A,k),function wu(){return ke.lFrame.inI18n}()&&(q.flags|=64);else if(64&q.type){q.type=g,q.value=A,q.attrs=k;const pe=bl();q.injectorIndex=null===pe?-1:pe.injectorIndex}return su(q,!0),q}function Eg(u,d,g,A,k){const q=qu(),pe=vu(),Ue=u.data[d]=function Cm(u,d,g,A,k,q){return{type:g,index:A,insertBeforeIndex:null,injectorIndex:d?d.injectorIndex:-1,directiveStart:-1,directiveEnd:-1,directiveStylingLast:-1,propertyBindings:null,flags:0,providerIndexes:0,value:k,attrs:q,mergedAttrs:null,localNames:null,initialInputs:void 0,inputs:null,outputs:null,tViews:null,next:null,projectionNext:null,child:null,parent:d,projection:null,styles:null,stylesWithoutHost:null,residualStyles:void 0,classes:null,classesWithoutHost:null,residualClasses:void 0,classBindings:0,styleBindings:0}}(0,pe?q:q&&q.parent,g,d,A,k);return null===u.firstChild&&(u.firstChild=Ue),null!==q&&(pe?null==q.child&&null!==Ue.parent&&(q.child=Ue):null===q.next&&(q.next=Ue)),Ue}function xp(u,d,g,A){if(0===g)return-1;const k=d.length;for(let q=0;q<g;q++)d.push(A),u.blueprint.push(A),u.data.push(null);return k}function Y_(u,d,g){sn(d);try{const A=u.viewQuery;null!==A&&Tg(1,A,g);const k=u.template;null!==k&&Kg(u,d,k,1,g),u.firstCreatePass&&(u.firstCreatePass=!1),u.staticContentQueries&&Qg(u,d),u.staticViewQueries&&Tg(2,u.viewQuery,g);const q=u.components;null!==q&&function yg(u,d){for(let g=0;g<d.length;g++)I0(u,d[g])}(d,q)}catch(A){throw u.firstCreatePass&&(u.incompleteFirstPass=!0,u.firstCreatePass=!1),A}finally{d[2]&=-5,gi()}}function D_(u,d,g,A){const k=d[2];if(256!=(256&k)){sn(d);try{lt(d),function id(u){return ke.lFrame.bindingIndex=u}(u.bindingStartIndex),null!==g&&Kg(u,d,g,2,A);const pe=3==(3&k);if(pe){const Dt=u.preOrderCheckHooks;null!==Dt&&xu(d,Dt,null)}else{const Dt=u.preOrderHooks;null!==Dt&&Eu(d,Dt,0,null),Gd(d,0)}if(function Pc(u){for(let d=ef(u);null!==d;d=tf(d)){if(!d[2])continue;const g=d[9];for(let A=0;A<g.length;A++){const k=g[A],q=k[3];0==(1024&k[2])&&Xe(q,1),k[2]|=1024}}}(d),function Vu(u){for(let d=ef(u);null!==d;d=tf(d))for(let g=10;g<d.length;g++){const A=d[g],k=A[1];Ka(A)&&D_(k,A,k.template,A[8])}}(d),null!==u.contentQueries&&Qg(u,d),pe){const Dt=u.contentCheckHooks;null!==Dt&&xu(d,Dt)}else{const Dt=u.contentHooks;null!==Dt&&Eu(d,Dt,1),Gd(d,1)}!function wp(u,d){const g=u.hostBindingOpCodes;if(null!==g)try{for(let A=0;A<g.length;A++){const k=g[A];if(k<0)Ar(~k);else{const q=k,pe=g[++A],Re=g[++A];Bo(pe,q),Re(2,d[q])}}}finally{Ar(-1)}}(u,d);const Re=u.components;null!==Re&&function sv(u,d){for(let g=0;g<d.length;g++)n1(u,d[g])}(d,Re);const Ue=u.viewQuery;if(null!==Ue&&Tg(2,Ue,A),pe){const Dt=u.viewCheckHooks;null!==Dt&&xu(d,Dt)}else{const Dt=u.viewHooks;null!==Dt&&Eu(d,Dt,2),Gd(d,2)}!0===u.firstUpdatePass&&(u.firstUpdatePass=!1),d[2]&=-73,1024&d[2]&&(d[2]&=-1025,Xe(d[3],-1))}finally{gi()}}}function Sm(u,d,g,A){const k=d[10],pe=Io(d);try{!pe&&k.begin&&k.begin(),pe&&Y_(u,d,A),D_(u,d,g,A)}finally{!pe&&k.end&&k.end()}}function Kg(u,d,g,A,k){const q=kn(),pe=2&A;try{Ar(-1),pe&&d.length>20&&v(u,d,20,!1),g(A,k)}finally{Ar(q)}}function bg(u,d,g){if(ya(d)){const k=d.directiveEnd;for(let q=d.directiveStart;q<k;q++){const pe=u.data[q];pe.contentQueries&&pe.contentQueries(1,g[q],q)}}}function Sg(u,d,g){!Xu()||(function ai(u,d,g,A){const k=g.directiveStart,q=g.directiveEnd;u.firstCreatePass||ha(g,d),ic(A,d);const pe=g.initialInputs;for(let Re=k;Re<q;Re++){const Ue=u.data[Re],Dt=Pa(Ue);Dt&&sf(d,g,Ue);const Zt=lu(d,u,Re,g);ic(Zt,d),null!==pe&&G_(0,Re-k,Zt,Ue,0,pe),Dt&&(Ns(g.index,d)[8]=Zt)}}(u,d,g,Di(g,d)),128==(128&g.flags)&&function ns(u,d,g){const A=g.directiveStart,k=g.directiveEnd,pe=g.index,Re=function cu(){return ke.lFrame.currentDirectiveIndex}();try{Ar(pe);for(let Ue=A;Ue<k;Ue++){const Dt=u.data[Ue],Zt=d[Ue];Er(Ue),(null!==Dt.hostBindings||0!==Dt.hostVars||null!==Dt.hostAttrs)&&Jo(Dt,Zt)}}finally{Ar(-1),Er(Re)}}(u,d,g))}function Xg(u,d,g=Di){const A=d.localNames;if(null!==A){let k=d.index+1;for(let q=0;q<A.length;q+=2){const pe=A[q+1],Re=-1===pe?g(d,u):u[pe];u[k++]=Re}}}function j_(u){const d=u.tView;return null===d||d.incompleteFirstPass?u.tView=qp(1,null,u.template,u.decls,u.vars,u.directiveDefs,u.pipeDefs,u.viewQuery,u.schemas,u.consts):d}function qp(u,d,g,A,k,q,pe,Re,Ue,Dt){const Zt=20+A,Dn=Zt+k,br=function w_(u,d){const g=[];for(let A=0;A<d;A++)g.push(A<u?null:Yo);return g}(Zt,Dn),Jr="function"==typeof Dt?Dt():Dt;return br[1]={type:u,blueprint:br,template:g,queries:null,viewQuery:Re,declTNode:d,data:br.slice().fill(null,Zt),bindingStartIndex:Zt,expandoStartIndex:Dn,hostBindingOpCodes:null,firstCreatePass:!0,firstUpdatePass:!0,staticViewQueries:!1,staticContentQueries:!1,preOrderHooks:null,preOrderCheckHooks:null,contentHooks:null,contentCheckHooks:null,viewHooks:null,viewCheckHooks:null,destroyHooks:null,cleanup:null,contentQueries:null,components:null,directiveRegistry:"function"==typeof q?q():q,pipeRegistry:"function"==typeof pe?pe():pe,firstChild:null,schemas:Ue,consts:Jr,incompleteFirstPass:!1}}function em(u,d,g,A){const k=r1(d);null===g?k.push(A):(k.push(g),u.firstCreatePass&&i1(u).push(A,k.length-1))}function tm(u,d,g){for(let A in u)if(u.hasOwnProperty(A)){const k=u[A];(g=null===g?{}:g).hasOwnProperty(A)?g[A].push(d,k):g[A]=[d,k]}return g}function $f(u,d,g,A,k,q,pe,Re){const Ue=Di(d,g);let Zt,Dt=d.inputs;!Re&&null!=Dt&&(Zt=Dt[A])?(s1(u,g,Zt,A,k),fa(d)&&function lv(u,d){const g=Ns(d,u);16&g[2]||(g[2]|=64)}(g,d.index)):3&d.type&&(A=function av(u){return"class"===u?"className":"for"===u?"htmlFor":"formaction"===u?"formAction":"innerHtml"===u?"innerHTML":"readonly"===u?"readOnly":"tabindex"===u?"tabIndex":u}(A),k=null!=pe?pe(k,d.value||"",A):k,Ua(q)?q.setProperty(Ue,A,k):pa(A)||(Ue.setProperty?Ue.setProperty(A,k):Ue[A]=k))}function Ft(u,d,g,A){let k=!1;if(Xu()){const q=function Ds(u,d,g){const A=u.directiveRegistry;let k=null;if(A)for(let q=0;q<A.length;q++){const pe=A[q];Ge(g,pe.selectors,!1)&&(k||(k=[]),Fa(ha(g,d),u,pe.type),Pa(pe)?(hl(u,g),k.unshift(pe)):k.push(pe))}return k}(u,d,g),pe=null===A?null:{"":-1};if(null!==q){k=!0,Au(g,u.data.length,q.length);for(let Zt=0;Zt<q.length;Zt++){const Dn=q[Zt];Dn.providersResolver&&Dn.providersResolver(Dn)}let Re=!1,Ue=!1,Dt=xp(u,d,q.length,null);for(let Zt=0;Zt<q.length;Zt++){const Dn=q[Zt];g.mergedAttrs=od(g.mergedAttrs,Dn.hostAttrs),qc(u,g,d,Dt,Dn),Ql(Dt,Dn,pe),null!==Dn.contentQueries&&(g.flags|=8),(null!==Dn.hostBindings||null!==Dn.hostAttrs||0!==Dn.hostVars)&&(g.flags|=128);const br=Dn.type.prototype;!Re&&(br.ngOnChanges||br.ngOnInit||br.ngDoCheck)&&((u.preOrderHooks||(u.preOrderHooks=[])).push(g.index),Re=!0),!Ue&&(br.ngOnChanges||br.ngDoCheck)&&((u.preOrderCheckHooks||(u.preOrderCheckHooks=[])).push(g.index),Ue=!0),Dt++}!function t1(u,d){const A=d.directiveEnd,k=u.data,q=d.attrs,pe=[];let Re=null,Ue=null;for(let Dt=d.directiveStart;Dt<A;Dt++){const Zt=k[Dt],Dn=Zt.inputs,br=null===q||P(d)?null:af(Dn,q);pe.push(br),Re=tm(Dn,Dt,Re),Ue=tm(Zt.outputs,Dt,Ue)}null!==Re&&(Re.hasOwnProperty("class")&&(d.flags|=16),Re.hasOwnProperty("style")&&(d.flags|=32)),d.initialInputs=pe,d.inputs=Re,d.outputs=Ue}(u,g)}pe&&function ou(u,d,g){if(d){const A=u.localNames=[];for(let k=0;k<d.length;k+=2){const q=g[d[k+1]];if(null==q)throw new ee(-301,!1);A.push(d[k],q)}}}(g,A,pe)}return g.mergedAttrs=od(g.mergedAttrs,g.attrs),k}function Kn(u,d,g,A,k,q){const pe=q.hostBindings;if(pe){let Re=u.hostBindingOpCodes;null===Re&&(Re=u.hostBindingOpCodes=[]);const Ue=~d.index;(function Cr(u){let d=u.length;for(;d>0;){const g=u[--d];if("number"==typeof g&&g<0)return g}return 0})(Re)!=Ue&&Re.push(Ue),Re.push(A,k,pe)}}function Jo(u,d){null!==u.hostBindings&&u.hostBindings(1,d)}function hl(u,d){d.flags|=2,(u.components||(u.components=[])).push(d.index)}function Ql(u,d,g){if(g){if(d.exportAs)for(let A=0;A<d.exportAs.length;A++)g[d.exportAs[A]]=u;Pa(d)&&(g[""]=u)}}function Au(u,d,g){u.flags|=1,u.directiveStart=d,u.directiveEnd=d+g,u.providerIndexes=d}function qc(u,d,g,A,k){u.data[A]=k;const q=k.factory||(k.factory=bi(k.type)),pe=new La(q,Pa(k),null);u.blueprint[A]=pe,g[A]=pe,Kn(u,d,0,A,xp(u,g,k.hostVars,Yo),k)}function sf(u,d,g){const A=Di(d,u),k=j_(g),q=u[10],pe=Mm(u,ug(u,k,null,g.onPush?64:16,A,d,q,q.createRenderer(A,g),null,null));u[d.index]=pe}function Ph(u,d,g,A,k,q,pe){if(null==q)Ua(u)?u.removeAttribute(d,k,g):d.removeAttribute(k);else{const Re=null==pe?ie(q):pe(q,A||"",k);Ua(u)?u.setAttribute(d,k,Re,g):g?d.setAttributeNS(g,k,Re):d.setAttribute(k,Re)}}function G_(u,d,g,A,k,q){const pe=q[d];if(null!==pe){const Re=A.setInput;for(let Ue=0;Ue<pe.length;){const Dt=pe[Ue++],Zt=pe[Ue++],Dn=pe[Ue++];null!==Re?A.setInput(g,Dn,Dt,Zt):g[Zt]=Dn}}}function af(u,d){let g=null,A=0;for(;A<d.length;){const k=d[A];if(0!==k)if(5!==k){if("number"==typeof k)break;u.hasOwnProperty(k)&&(null===g&&(g=[]),g.push(k,u[k],d[A+1])),A+=2}else A+=2;else A+=4}return g}function hp(u,d,g,A){return new Array(u,!0,!1,d,null,0,A,g,null,null)}function n1(u,d){const g=Ns(d,u);if(Ka(g)){const A=g[1];80&g[2]?D_(A,g,A.template,g[8]):g[5]>0&&cv(g)}}function cv(u){for(let A=ef(u);null!==A;A=tf(A))for(let k=10;k<A.length;k++){const q=A[k];if(1024&q[2]){const pe=q[1];D_(pe,q,pe.template,q[8])}else q[5]>0&&cv(q)}const g=u[1].components;if(null!==g)for(let A=0;A<g.length;A++){const k=Ns(g[A],u);Ka(k)&&k[5]>0&&cv(k)}}function I0(u,d){const g=Ns(d,u),A=g[1];(function L0(u,d){for(let g=d.length;g<u.blueprint.length;g++)d.push(u.blueprint[g])})(A,g),Y_(A,g,g[8])}function Mm(u,d){return u[13]?u[14][4]=d:u[13]=d,u[14]=d,d}function dv(u){for(;u;){u[2]|=64;const d=Lf(u);if(fl(u)&&!d)return u;u=d}return null}function Am(u){!function Om(u){for(let d=0;d<u.components.length;d++){const g=u.components[d],A=Vf(g),k=A[1];Sm(k,A,k.template,g)}}(u[8])}function Tg(u,d,g){nt(0),d(u,g)}const Cg=(()=>Promise.resolve(null))();function r1(u){return u[7]||(u[7]=[])}function i1(u){return u.cleanup||(u.cleanup=[])}function o1(u,d){const g=u[9],A=g?g.get(Tp,null):null;A&&A.handleError(d)}function s1(u,d,g,A,k){for(let q=0;q<g.length;){const pe=g[q++],Re=g[q++],Ue=d[pe],Dt=u.data[pe];null!==Dt.setInput?Dt.setInput(Ue,k,A,Re):Ue[Re]=k}}function d_(u,d,g){const A=qr(d,u);Mp(u[11],A,g)}function th(u,d,g){let A=g?u.styles:null,k=g?u.classes:null,q=0;if(null!==d)for(let pe=0;pe<d.length;pe++){const Re=d[pe];"number"==typeof Re?q=Re:1==q?k=C(k,Re):2==q&&(A=C(A,Re+": "+d[++pe]+";"))}g?u.styles=A:u.stylesWithoutHost=A,g?u.classes=k:u.classesWithoutHost=k}const Dm=new Xa("INJECTOR",-1);class l1{get(d,g=Zd){if(g===Zd){const A=new Error(`NullInjectorError: No provider for ${T(d)}!`);throw A.name="NullInjectorError",A}return g}}const _u=new Xa("Set Injector scope."),nm={},u1={};let Og;function c1(){return void 0===Og&&(Og=new l1),Og}function d1(u,d=null,g=null,A){const k=f1(u,d,g,A);return k._resolveInjectorDefTypes(),k}function f1(u,d=null,g=null,A){return new $0(u,g,d||c1(),A)}class $0{constructor(d,g,A,k=null){this.parent=A,this.records=new Map,this.injectorDefTypes=new Set,this.onDestroy=new Set,this._destroyed=!1;const q=[];g&&Pu(g,Re=>this.processProvider(Re,d,g)),Pu([d],Re=>this.processInjectorType(Re,[],q)),this.records.set(Dm,z_(void 0,this));const pe=this.records.get(_u);this.scope=null!=pe?pe.value:null,this.source=k||("object"==typeof d?null:T(d))}get destroyed(){return this._destroyed}destroy(){this.assertNotDestroyed(),this._destroyed=!0;try{this.onDestroy.forEach(d=>d.ngOnDestroy())}finally{this.records.clear(),this.onDestroy.clear(),this.injectorDefTypes.clear()}}get(d,g=Zd,A=dr.Default){this.assertNotDestroyed();const k=Q(this),q=_i(void 0);try{if(!(A&dr.SkipSelf)){let Re=this.records.get(d);if(void 0===Re){const Ue=function ib(u){return"function"==typeof u||"object"==typeof u&&u instanceof Xa}(d)&&Fn(d);Re=Ue&&this.injectableDefInScope(Ue)?z_(fv(d),nm):null,this.records.set(d,Re)}if(null!=Re)return this.hydrate(d,Re)}return(A&dr.Self?c1():this.parent).get(d,g=A&dr.Optional&&g===Zd?null:g)}catch(pe){if("NullInjectorError"===pe.name){if((pe[Rl]=pe[Rl]||[]).unshift(T(d)),k)throw pe;return function nn(u,d,g,A){const k=u[Rl];throw d[E]&&k.unshift(d[E]),u.message=function $n(u,d,g,A=null){u=u&&"\n"===u.charAt(0)&&"\u0275"==u.charAt(1)?u.substr(2):u;let k=T(d);if(Array.isArray(d))k=d.map(T).join(" -> ");else if("object"==typeof d){let q=[];for(let pe in d)if(d.hasOwnProperty(pe)){let Re=d[pe];q.push(pe+":"+("string"==typeof Re?JSON.stringify(Re):T(Re)))}k=`{${q.join(", ")}}`}return`${g}${A?"("+A+")":""}[${k}]: ${u.replace(fc,"\n  ")}`}("\n"+u.message,k,g,A),u.ngTokenPath=k,u[Rl]=null,u}(pe,d,"R3InjectorError",this.source)}throw pe}finally{_i(q),Q(k)}}_resolveInjectorDefTypes(){this.injectorDefTypes.forEach(d=>this.get(d))}toString(){const d=[];return this.records.forEach((A,k)=>d.push(T(k))),`R3Injector[${d.join(", ")}]`}assertNotDestroyed(){if(this._destroyed)throw new ee(205,!1)}processInjectorType(d,g,A){if(!(d=z(d)))return!1;let k=ur(d);const q=null==k&&d.ngModule||void 0,pe=void 0===q?d:q,Re=-1!==A.indexOf(pe);if(void 0!==q&&(k=ur(q)),null==k)return!1;if(null!=k.imports&&!Re){let Zt;A.push(pe);try{Pu(k.imports,Dn=>{this.processInjectorType(Dn,g,A)&&(void 0===Zt&&(Zt=[]),Zt.push(Dn))})}finally{}if(void 0!==Zt)for(let Dn=0;Dn<Zt.length;Dn++){const{ngModule:br,providers:Jr}=Zt[Dn];Pu(Jr,Vi=>this.processProvider(Vi,br,Jr||Zn))}}this.injectorDefTypes.add(pe);const Ue=bi(pe)||(()=>new pe);this.records.set(pe,z_(Ue,nm));const Dt=k.providers;if(null!=Dt&&!Re){const Zt=d;Pu(Dt,Dn=>this.processProvider(Dn,Zt,Dt))}return void 0!==q&&void 0!==d.providers}processProvider(d,g,A){let k=gd(d=z(d))?d:z(d&&d.provide);const q=function B0(u,d,g){return U0(u)?z_(void 0,u.useValue):z_(p1(u),nm)}(d);if(gd(d)||!0!==d.multi)this.records.get(k);else{let pe=this.records.get(k);pe||(pe=z_(void 0,nm,!0),pe.factory=()=>Je(pe.multi),this.records.set(k,pe)),k=d,pe.multi.push(d)}this.records.set(k,q)}hydrate(d,g){return g.value===nm&&(g.value=u1,g.value=g.factory()),"object"==typeof g.value&&g.value&&function g1(u){return null!==u&&"object"==typeof u&&"function"==typeof u.ngOnDestroy}(g.value)&&this.onDestroy.add(g.value),g.value}injectableDefInScope(d){if(!d.providedIn)return!1;const g=z(d.providedIn);return"string"==typeof g?"any"===g||g===this.scope:this.injectorDefTypes.has(g)}}function fv(u){const d=Fn(u),g=null!==d?d.factory:bi(u);if(null!==g)return g;if(u instanceof Xa)throw new ee(204,!1);if(u instanceof Function)return function H0(u){const d=u.length;if(d>0)throw Oa(d,"?"),new ee(204,!1);const g=function Ei(u){const d=u&&(u[$r]||u[Pn]);if(d){const g=function mi(u){if(u.hasOwnProperty("name"))return u.name;const d=(""+u).match(/^function\s*([^\s(]+)/);return null===d?"":d[1]}(u);return console.warn(`DEPRECATED: DI is instantiating a token "${g}" that inherits its @Injectable decorator but does not provide one itself.\nThis will become an error in a future version of Angular. Please add @Injectable() to the "${g}" class.`),d}return null}(u);return null!==g?()=>g.factory(u):()=>new u}(u);throw new ee(204,!1)}function p1(u,d,g){let A;if(gd(u)){const k=z(u);return bi(k)||fv(k)}if(U0(u))A=()=>z(u.useValue);else if(function nb(u){return!(!u||!u.useFactory)}(u))A=()=>u.useFactory(...Je(u.deps||[]));else if(function h1(u){return!(!u||!u.useExisting)}(u))A=()=>me(z(u.useExisting));else{const k=z(u&&(u.useClass||u.provide));if(!function rb(u){return!!u.deps}(u))return bi(k)||fv(k);A=()=>new k(...Je(u.deps))}return A}function z_(u,d,g=!1){return{factory:u,value:d,multi:g?[]:void 0}}function U0(u){return null!==u&&"object"==typeof u&&x in u}function gd(u){return"function"==typeof u}let R_=(()=>{class u{static create(g,A){var k;if(Array.isArray(g))return d1({name:""},A,g,"");{const q=null!==(k=g.name)&&void 0!==k?k:"";return d1({name:q},g.parent,g.providers,q)}}}return u.THROW_IF_NOT_FOUND=Zd,u.NULL=new l1,u.\u0275prov=Nt({token:u,providedIn:"any",factory:()=>me(Dm)}),u.__NG_ELEMENT_ID__=-1,u})();function Q0(u,d){Fc(Vf(u)[1],ys())}function S1(u){let d=function hv(u){return Object.getPrototypeOf(u.prototype).constructor}(u.type),g=!0;const A=[u];for(;d;){let k;if(Pa(u))k=d.\u0275cmp||d.\u0275dir;else{if(d.\u0275cmp)throw new ee(903,"");k=d.\u0275dir}if(k){if(g){A.push(k);const pe=u;pe.inputs=Ag(u.inputs),pe.declaredInputs=Ag(u.declaredInputs),pe.outputs=Ag(u.outputs);const Re=k.hostBindings;Re&&Dg(u,Re);const Ue=k.viewQuery,Dt=k.contentQueries;if(Ue&&C1(u,Ue),Dt&&X0(u,Dt),y(u.inputs,k.inputs),y(u.declaredInputs,k.declaredInputs),y(u.outputs,k.outputs),Pa(k)&&k.data.animation){const Zt=u.data;Zt.animation=(Zt.animation||[]).concat(k.data.animation)}}const q=k.features;if(q)for(let pe=0;pe<q.length;pe++){const Re=q[pe];Re&&Re.ngInherit&&Re(u),Re===S1&&(g=!1)}}d=Object.getPrototypeOf(d)}!function T1(u){let d=0,g=null;for(let A=u.length-1;A>=0;A--){const k=u[A];k.hostVars=d+=k.hostVars,k.hostAttrs=od(k.hostAttrs,g=od(g,k.hostAttrs))}}(A)}function Ag(u){return u===Mn?{}:u===Zn?[]:u}function C1(u,d){const g=u.viewQuery;u.viewQuery=g?(A,k)=>{d(A,k),g(A,k)}:d}function X0(u,d){const g=u.contentQueries;u.contentQueries=g?(A,k,q)=>{d(A,k,q),g(A,k,q)}:d}function Dg(u,d){const g=u.hostBindings;u.hostBindings=g?(A,k)=>{d(A,k),g(A,k)}:d}let Rm=null;function Fh(){if(!Rm){const u=hr.Symbol;if(u&&u.iterator)Rm=u.iterator;else{const d=Object.getOwnPropertyNames(Map.prototype);for(let g=0;g<d.length;++g){const A=d[g];"entries"!==A&&"size"!==A&&Map.prototype[A]===Map.prototype.entries&&(Rm=A)}}}return Rm}function im(u){return!!_v(u)&&(Array.isArray(u)||!(u instanceof Map)&&Fh()in u)}function _v(u){return null!==u&&("function"==typeof u||"object"==typeof u)}function f_(u,d,g){return u[d]=g}function om(u,d){return u[d]}function Hf(u,d,g){return!Object.is(u[d],g)&&(u[d]=g,!0)}function N_(u,d,g,A){const k=Hf(u,d,g);return Hf(u,d+1,A)||k}function Nm(u,d,g,A,k){const q=N_(u,d,g,A);return Hf(u,d+2,k)||q}function nh(u,d,g,A,k,q){const pe=N_(u,d,g,A);return N_(u,d+2,k,q)||pe}function gv(u,d,g,A){const k=Hi();return Hf(k,$u(),d)&&(oa(),function hd(u,d,g,A,k,q){const pe=Di(u,d);Ph(d[11],pe,q,u.value,g,A,k)}(gr(),k,u,d,g,A)),gv}function fg(u,d,g,A){return Hf(u,$u(),g)?d+ie(g)+A:Yo}function pg(u,d,g,A,k,q){const Re=N_(u,uu(),g,k);return Hu(2),Re?d+ie(g)+A+ie(k)+q:Yo}function R1(u,d,g,A,k,q,pe,Re){const Ue=Hi(),Dt=oa(),Zt=u+20,Dn=Dt.firstCreatePass?function vv(u,d,g,A,k,q,pe,Re,Ue){const Dt=d.consts,Zt=A_(d,u,4,pe||null,Bs(Dt,Re));Ft(d,g,Zt,Bs(Dt,Ue)),Fc(d,Zt);const Dn=Zt.tViews=qp(2,Zt,A,k,q,d.directiveRegistry,d.pipeRegistry,null,d.schemas,Dt);return null!==d.queries&&(d.queries.template(d,Zt),Dn.queries=d.queries.embeddedTView(Zt)),Zt}(Zt,Dt,Ue,d,g,A,k,q,pe):Dt.data[Zt];su(Dn,!1);const br=Ue[11].createComment("");tp(Dt,Ue,br,Dn),ic(br,Ue),Mm(Ue,Ue[Zt]=hp(br,Ue,br,Dn)),la(Dn)&&Sg(Dt,Ue,Dn),null!=pe&&Xg(Ue,Dn,Re)}function N1(u){return As(function yu(){return ke.lFrame.contextLView}(),20+u)}function Ea(u,d=dr.Default){const g=Hi();return null===g?me(u,d):Bu(ys(),g,z(u),d)}function wl(){throw new Error("invalid")}function Ra(u,d,g){const A=Hi();return Hf(A,$u(),d)&&$f(oa(),gr(),A,u,d,A[11],g,!1),Ra}function kl(u,d,g,A,k){const pe=k?"class":"style";s1(u,g,d.inputs[pe],pe,A)}function Bf(u,d,g,A){const k=Hi(),q=oa(),pe=20+u,Re=k[11],Ue=k[pe]=zc(Re,d,function Ks(){return ke.lFrame.currentNamespace}()),Dt=q.firstCreatePass?function Xl(u,d,g,A,k,q,pe){const Re=d.consts,Dt=A_(d,u,2,k,Bs(Re,q));return Ft(d,g,Dt,Bs(Re,pe)),null!==Dt.attrs&&th(Dt,Dt.attrs,!1),null!==Dt.mergedAttrs&&th(Dt,Dt.mergedAttrs,!0),null!==d.queries&&d.queries.elementStart(d,Dt),Dt}(pe,q,k,0,d,g,A):q.data[pe];su(Dt,!0);const Zt=Dt.mergedAttrs;null!==Zt&&gc(Re,Ue,Zt);const Dn=Dt.classes;null!==Dn&&Nh(Re,Ue,Dn);const br=Dt.styles;return null!==br&&pp(Re,Ue,br),64!=(64&Dt.flags)&&tp(q,k,Ue,Dt),0===function Wo(){return ke.lFrame.elementDepthCount}()&&ic(Ue,k),function Ya(){ke.lFrame.elementDepthCount++}(),la(Dt)&&(Sg(q,k,Dt),bg(q,Dt,k)),null!==A&&Xg(k,Dt),Bf}function lf(){let u=ys();vu()?nu():(u=u.parent,su(u,!1));const d=u;!function yl(){ke.lFrame.elementDepthCount--}();const g=oa();return g.firstCreatePass&&(Fc(g,u),ya(u)&&g.queries.elementEnd(u)),null!=d.classesWithoutHost&&function Sa(u){return 0!=(16&u.flags)}(d)&&kl(g,d,Hi(),d.classesWithoutHost,!0),null!=d.stylesWithoutHost&&function Sl(u){return 0!=(32&u.flags)}(d)&&kl(g,d,Hi(),d.stylesWithoutHost,!1),lf}function op(u,d,g,A){return Bf(u,d,g,A),lf(),op}function Rp(u,d,g){const A=Hi(),k=oa(),q=u+20,pe=k.firstCreatePass?function kh(u,d,g,A,k){const q=d.consts,pe=Bs(q,A),Re=A_(d,u,8,"ng-container",pe);return null!==pe&&th(Re,pe,!0),Ft(d,g,Re,Bs(q,k)),null!==d.queries&&d.queries.elementStart(d,Re),Re}(q,k,A,d,g):k.data[q];su(pe,!0);const Re=A[q]=A[11].createComment("");return tp(k,A,Re,pe),ic(Re,A),la(pe)&&(Sg(k,A,pe),bg(k,pe,A)),null!=g&&Xg(A,pe),Rp}function rh(){let u=ys();const d=oa();return vu()?nu():(u=u.parent,su(u,!1)),d.firstCreatePass&&(Fc(d,u),ya(u)&&d.queries.elementEnd(u)),rh}function bv(u,d,g){return Rp(u,d,g),rh(),bv}function gy(){return Hi()}function am(u){return!!u&&"function"==typeof u.then}function B1(u){return!!u&&"function"==typeof u.subscribe}const hb=B1;function my(u,d,g,A){const k=Hi(),q=oa(),pe=ys();return function _b(u,d,g,A,k,q,pe,Re){const Ue=la(A),Zt=u.firstCreatePass&&i1(u),Dn=d[8],br=r1(d);let Jr=!0;if(3&A.type||Re){const ls=Di(A,d),zs=Re?Re(ls):ls,_o=br.length,Da=Re?ql=>Re(ot(ql[A.index])):A.index;if(Ua(g)){let ql=null;if(!Re&&Ue&&(ql=function vy(u,d,g,A){const k=u.cleanup;if(null!=k)for(let q=0;q<k.length-1;q+=2){const pe=k[q];if(pe===g&&k[q+1]===A){const Re=d[7],Ue=k[q+2];return Re.length>Ue?Re[Ue]:null}"string"==typeof pe&&(q+=2)}return null}(u,d,k,A.index)),null!==ql)(ql.__ngLastListenerFn__||ql).__ngNextListenerFn__=q,ql.__ngLastListenerFn__=q,Jr=!1;else{q=yy(A,d,Dn,q,!1);const Zu=g.listen(zs,k,q);br.push(q,Zu),Zt&&Zt.push(k,Da,_o,_o+1)}}else q=yy(A,d,Dn,q,!0),zs.addEventListener(k,q,pe),br.push(q),Zt&&Zt.push(k,Da,_o,pe)}else q=yy(A,d,Dn,q,!1);const Vi=A.outputs;let jo;if(Jr&&null!==Vi&&(jo=Vi[k])){const ls=jo.length;if(ls)for(let zs=0;zs<ls;zs+=2){const ih=d[jo[zs]][jo[zs+1]].subscribe(q),fm=br.length;br.push(q,ih),Zt&&Zt.push(k,A.index,fm,-(fm+1))}}}(q,k,k[11],pe,u,d,!!g,A),my}function gb(u,d,g,A){try{return!1!==g(A)}catch(k){return o1(u,k),!1}}function yy(u,d,g,A,k){return function q(pe){if(pe===Function)return A;const Re=2&u.flags?Ns(u.index,d):d;0==(32&d[2])&&dv(Re);let Ue=gb(d,0,A,pe),Dt=q.__ngNextListenerFn__;for(;Dt;)Ue=gb(d,0,Dt,pe)&&Ue,Dt=Dt.__ngNextListenerFn__;return k&&!1===Ue&&(pe.preventDefault(),pe.returnValue=!1),Ue}}function mb(u=1){return function zi(u){return(ke.lFrame.contextLView=function Dr(u,d){for(;u>0;)d=d[15],u--;return d}(u,ke.lFrame.contextLView))[8]}(u)}function IC(u,d){let g=null;const A=function an(u){const d=u.attrs;if(null!=d){const g=d.indexOf(5);if(0==(1&g))return d[g+1]}return null}(u);for(let k=0;k<d.length;k++){const q=d[k];if("*"!==q){if(null===A?Ge(u,q,!0):ci(A,q))return k}else g=k}return g}function vb(u){const d=Hi()[16][6];if(!d.projection){const A=d.projection=Oa(u?u.length:1,null),k=A.slice();let q=d.child;for(;null!==q;){const pe=u?IC(q,u):0;null!==pe&&(k[pe]?k[pe].projectionNext=q:A[pe]=q,k[pe]=q),q=q.next}}}function yb(u,d=0,g){const A=Hi(),k=oa(),q=A_(k,20+u,16,null,g||null);null===q.projection&&(q.projection=d),nu(),64!=(64&q.flags)&&function gg(u,d,g){pd(d[11],0,d,g,Jp(u,g,d),ep(g.parent||d[6],g,d))}(k,A,q)}function Ey(u,d,g){return Sv(u,"",d,"",g),Ey}function Sv(u,d,g,A,k){const q=Hi(),pe=fg(q,d,g,A);return pe!==Yo&&$f(oa(),gr(),q,u,pe,q[11],k,!1),Sv}function by(u,d,g,A,k,q,pe){const Re=Hi(),Ue=pg(Re,d,g,A,k,q);return Ue!==Yo&&$f(oa(),gr(),Re,u,Ue,Re[11],pe,!1),by}function Mb(u,d,g,A,k){const q=u[g+1],pe=null===d;let Re=A?ye(q):gn(q),Ue=!1;for(;0!==Re&&(!1===Ue||pe);){const Zt=u[Re+1];kC(u[Re],d)&&(Ue=!0,u[Re+1]=A?$o(Zt):Wt(Zt)),Re=A?ye(Zt):gn(Zt)}Ue&&(u[g+1]=A?Wt(q):$o(q))}function kC(u,d){return null===u||null==d||(Array.isArray(u)?u[1]:u)===d||!(!Array.isArray(u)||"string"!=typeof d)&&ma(u,d)>=0}const Cf={textEnd:0,key:0,keyEnd:0,value:0,valueEnd:0};function Ob(u){return u.substring(Cf.key,Cf.keyEnd)}function Ab(u,d){const g=Cf.textEnd;return g===d?-1:(d=Cf.keyEnd=function BC(u,d,g){for(;d<g&&u.charCodeAt(d)>32;)d++;return d}(u,Cf.key=d,g),km(u,d,g))}function km(u,d,g){for(;d<g&&u.charCodeAt(d)<=32;)d++;return d}function Ty(u,d,g){return P_(u,d,g,!1),Ty}function Cy(u,d){return P_(u,d,null,!0),Cy}function Nb(u){_p(Fl,J_,u,!0)}function J_(u,d){for(let g=function HC(u){return function wb(u){Cf.key=0,Cf.keyEnd=0,Cf.value=0,Cf.valueEnd=0,Cf.textEnd=u.length}(u),Ab(u,km(u,0,Cf.textEnd))}(d);g>=0;g=Ab(d,g))Fl(u,Ob(d),!0)}function P_(u,d,g,A){const k=Hi(),q=oa(),pe=Hu(2);q.firstUpdatePass&&G1(q,u,pe,A),d!==Yo&&Hf(k,pe,d)&&Lb(q,q.data[kn()],k,k[11],u,k[pe+1]=function JC(u,d){return null==u||("string"==typeof d?u+=d:"object"==typeof u&&(u=T(xc(u)))),u}(d,g),A,pe)}function _p(u,d,g,A){const k=oa(),q=Hu(2);k.firstUpdatePass&&G1(k,null,q,A);const pe=Hi();if(g!==Yo&&Hf(pe,q,g)){const Re=k.data[kn()];if(kb(Re,A)&&!Pb(k,q)){let Ue=A?Re.classesWithoutHost:Re.stylesWithoutHost;null!==Ue&&(g=C(Ue,g||"")),kl(k,Re,pe,g,A)}else!function WC(u,d,g,A,k,q,pe,Re){k===Yo&&(k=Zn);let Ue=0,Dt=0,Zt=0<k.length?k[0]:null,Dn=0<q.length?q[0]:null;for(;null!==Zt||null!==Dn;){const br=Ue<k.length?k[Ue+1]:void 0,Jr=Dt<q.length?q[Dt+1]:void 0;let jo,Vi=null;Zt===Dn?(Ue+=2,Dt+=2,br!==Jr&&(Vi=Dn,jo=Jr)):null===Dn||null!==Zt&&Zt<Dn?(Ue+=2,Vi=Zt):(Dt+=2,Vi=Dn,jo=Jr),null!==Vi&&Lb(u,d,g,A,Vi,jo,pe,Re),Zt=Ue<k.length?k[Ue]:null,Dn=Dt<q.length?q[Dt]:null}}(k,Re,pe,pe[11],pe[q+1],pe[q+1]=function Oy(u,d,g){if(null==g||""===g)return Zn;const A=[],k=xc(g);if(Array.isArray(k))for(let q=0;q<k.length;q++)u(A,k[q],!0);else if("object"==typeof k)for(const q in k)k.hasOwnProperty(q)&&u(A,q,k[q]);else"string"==typeof k&&d(A,k);return A}(u,d,g),A,q)}}function Pb(u,d){return d>=u.expandoStartIndex}function G1(u,d,g,A){const k=u.data;if(null===k[g+1]){const q=k[kn()],pe=Pb(u,g);kb(q,A)&&null===d&&!pe&&(d=!1),d=function GC(u,d,g,A){const k=j(u);let q=A?d.residualClasses:d.residualStyles;if(null===k)0===(A?d.classBindings:d.styleBindings)&&(g=Tv(g=My(null,u,d,g,A),d.attrs,A),q=null);else{const pe=d.directiveStylingLast;if(-1===pe||u[pe]!==k)if(g=My(k,u,d,g,A),null===q){let Ue=function zC(u,d,g){const A=g?d.classBindings:d.styleBindings;if(0!==gn(A))return u[ye(A)]}(u,d,A);void 0!==Ue&&Array.isArray(Ue)&&(Ue=My(null,u,d,Ue[1],A),Ue=Tv(Ue,d.attrs,A),function VC(u,d,g,A){u[ye(g?d.classBindings:d.styleBindings)]=A}(u,d,A,Ue))}else q=function ZC(u,d,g){let A;const k=d.directiveEnd;for(let q=1+d.directiveStylingLast;q<k;q++)A=Tv(A,u[q].hostAttrs,g);return Tv(A,d.attrs,g)}(u,d,A)}return void 0!==q&&(A?d.residualClasses=q:d.residualStyles=q),g}(k,q,d,A),function LC(u,d,g,A,k,q){let pe=q?d.classBindings:d.styleBindings,Re=ye(pe),Ue=gn(pe);u[A]=g;let Zt,Dt=!1;if(Array.isArray(g)){const Dn=g;Zt=Dn[1],(null===Zt||ma(Dn,Zt)>0)&&(Dt=!0)}else Zt=g;if(k)if(0!==Ue){const br=ye(u[Re+1]);u[A+1]=B(br,Re),0!==br&&(u[br+1]=nr(u[br+1],A)),u[Re+1]=function yt(u,d){return 131071&u|d<<17}(u[Re+1],A)}else u[A+1]=B(Re,0),0!==Re&&(u[Re+1]=nr(u[Re+1],A)),Re=A;else u[A+1]=B(Ue,0),0===Re?Re=A:u[Ue+1]=nr(u[Ue+1],A),Ue=A;Dt&&(u[A+1]=Wt(u[A+1])),Mb(u,Zt,A,!0),Mb(u,Zt,A,!1),function FC(u,d,g,A,k){const q=k?u.residualClasses:u.residualStyles;null!=q&&"string"==typeof d&&ma(q,d)>=0&&(g[A+1]=$o(g[A+1]))}(d,Zt,u,A,q),pe=B(Re,Ue),q?d.classBindings=pe:d.styleBindings=pe}(k,q,d,g,pe,A)}}function My(u,d,g,A,k){let q=null;const pe=g.directiveEnd;let Re=g.directiveStylingLast;for(-1===Re?Re=g.directiveStart:Re++;Re<pe&&(q=d[Re],A=Tv(A,q.hostAttrs,k),q!==u);)Re++;return null!==u&&(g.directiveStylingLast=Re),A}function Tv(u,d,g){const A=g?1:2;let k=-1;if(null!==d)for(let q=0;q<d.length;q++){const pe=d[q];"number"==typeof pe?k=pe:k===A&&(Array.isArray(u)||(u=void 0===u?[]:["",u]),Fl(u,pe,!!g||d[++q]))}return void 0===u?null:u}function Lb(u,d,g,A,k,q,pe,Re){if(!(3&d.type))return;const Ue=u.data,Dt=Ue[Re+1];z1(function ti(u){return 1==(1&u)}(Dt)?Fb(Ue,d,g,k,gn(Dt),pe):void 0)||(z1(q)||function He(u){return 2==(2&u)}(Dt)&&(q=Fb(Ue,null,g,k,Re,pe)),function mg(u,d,g,A,k){const q=Ua(u);if(d)k?q?u.addClass(g,A):g.classList.add(A):q?u.removeClass(g,A):g.classList.remove(A);else{let pe=-1===A.indexOf("-")?void 0:zu.DashCase;if(null==k)q?u.removeStyle(g,A,pe):g.style.removeProperty(A);else{const Re="string"==typeof k&&k.endsWith("!important");Re&&(k=k.slice(0,-10),pe|=zu.Important),q?u.setStyle(g,A,k,pe):g.style.setProperty(A,k,Re?"important":"")}}}(A,pe,qr(kn(),g),k,q))}function Fb(u,d,g,A,k,q){const pe=null===d;let Re;for(;k>0;){const Ue=u[k],Dt=Array.isArray(Ue),Zt=Dt?Ue[1]:Ue,Dn=null===Zt;let br=g[k+1];br===Yo&&(br=Dn?Zn:void 0);let Jr=Dn?Ac(br,A):Zt===A?br:void 0;if(Dt&&!z1(Jr)&&(Jr=Ac(Ue,A)),z1(Jr)&&(Re=Jr,pe))return Re;const Vi=u[k+1];k=pe?ye(Vi):gn(Vi)}if(null!==d){let Ue=q?d.residualClasses:d.residualStyles;null!=Ue&&(Re=Ac(Ue,A))}return Re}function z1(u){return void 0!==u}function kb(u,d){return 0!=(u.flags&(d?16:32))}function $b(u,d=""){const g=Hi(),A=oa(),k=u+20,q=A.firstCreatePass?A_(A,k,1,d,null):A.data[k],pe=g[k]=Dh(g[11],d);tp(A,g,pe,q),su(q,!1)}function Ay(u){return V1("",u,""),Ay}function V1(u,d,g){const A=Hi(),k=fg(A,u,d,g);return k!==Yo&&d_(A,kn(),k),V1}function Z1(u,d,g,A,k){const q=Hi(),pe=pg(q,u,d,g,A,k);return pe!==Yo&&d_(q,kn(),pe),Z1}function Dy(u,d,g,A,k,q,pe){const Re=Hi(),Ue=function wg(u,d,g,A,k,q,pe,Re){const Dt=Nm(u,uu(),g,k,pe);return Hu(3),Dt?d+ie(g)+A+ie(k)+q+ie(pe)+Re:Yo}(Re,u,d,g,A,k,q,pe);return Ue!==Yo&&d_(Re,kn(),Ue),Dy}function jb(u,d,g){_p(Fl,J_,fg(Hi(),u,d,g),!0)}function Gb(u,d,g,A,k){_p(Fl,J_,pg(Hi(),u,d,g,A,k),!0)}function zb(u,d,g,A,k,q,pe,Re,Ue){_p(Fl,J_,function xg(u,d,g,A,k,q,pe,Re,Ue,Dt){const Dn=nh(u,uu(),g,k,pe,Ue);return Hu(4),Dn?d+ie(g)+A+ie(k)+q+ie(pe)+Re+ie(Ue)+Dt:Yo}(Hi(),u,d,g,A,k,q,pe,Re,Ue),!0)}function wy(u,d,g){const A=Hi();return Hf(A,$u(),d)&&$f(oa(),gr(),A,u,d,A[11],g,!0),wy}function xy(u,d,g){const A=Hi();if(Hf(A,$u(),d)){const q=oa(),pe=gr();$f(q,pe,A,u,d,function Mg(u,d,g){return(null===u||Pa(u))&&(g=function jt(u){for(;Array.isArray(u);){if("object"==typeof u[1])return u;u=u[0]}return null}(g[d.index])),g[11]}(j(q.data),pe,A),g,!0)}return xy}const um=void 0;var uM=["en",[["a","p"],["AM","PM"],um],[["AM","PM"],um,um],[["S","M","T","W","T","F","S"],["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],["Su","Mo","Tu","We","Th","Fr","Sa"]],um,[["J","F","M","A","M","J","J","A","S","O","N","D"],["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"],["January","February","March","April","May","June","July","August","September","October","November","December"]],um,[["B","A"],["BC","AD"],["Before Christ","Anno Domini"]],0,[6,0],["M/d/yy","MMM d, y","MMMM d, y","EEEE, MMMM d, y"],["h:mm a","h:mm:ss a","h:mm:ss a z","h:mm:ss a zzzz"],["{1}, {0}",um,"{1} 'at' {0}",um],[".",",",";","%","+","-","E","\xd7","\u2030","\u221e","NaN",":"],["#,##0.###","#,##0%","\xa4#,##0.00","#E0"],"USD","$","US Dollar",{},"ltr",function lM(u){const g=Math.floor(Math.abs(u)),A=u.toString().replace(/^[^.]*\.?/,"").length;return 1===g&&0===A?1:5}];let Hm={};function Ry(u){const d=function cM(u){return u.toLowerCase().replace(/_/g,"-")}(u);let g=rS(d);if(g)return g;const A=d.split("-")[0];if(g=rS(A),g)return g;if("en"===A)return uM;throw new Error(`Missing locale data for the locale "${u}".`)}function nS(u){return Ry(u)[Va.PluralCase]}function rS(u){return u in Hm||(Hm[u]=hr.ng&&hr.ng.common&&hr.ng.common.locales&&hr.ng.common.locales[u]),Hm[u]}var Va=(()=>((Va=Va||{})[Va.LocaleId=0]="LocaleId",Va[Va.DayPeriodsFormat=1]="DayPeriodsFormat",Va[Va.DayPeriodsStandalone=2]="DayPeriodsStandalone",Va[Va.DaysFormat=3]="DaysFormat",Va[Va.DaysStandalone=4]="DaysStandalone",Va[Va.MonthsFormat=5]="MonthsFormat",Va[Va.MonthsStandalone=6]="MonthsStandalone",Va[Va.Eras=7]="Eras",Va[Va.FirstDayOfWeek=8]="FirstDayOfWeek",Va[Va.WeekendRange=9]="WeekendRange",Va[Va.DateFormat=10]="DateFormat",Va[Va.TimeFormat=11]="TimeFormat",Va[Va.DateTimeFormat=12]="DateTimeFormat",Va[Va.NumberSymbols=13]="NumberSymbols",Va[Va.NumberFormats=14]="NumberFormats",Va[Va.CurrencyCode=15]="CurrencyCode",Va[Va.CurrencySymbol=16]="CurrencySymbol",Va[Va.CurrencyName=17]="CurrencyName",Va[Va.Currencies=18]="Currencies",Va[Va.Directionality=19]="Directionality",Va[Va.PluralCase=20]="PluralCase",Va[Va.ExtraData=21]="ExtraData",Va))();const dM=["zero","one","two","few","many"],J1="en-US",Q1={marker:"element"},K1={marker:"ICU"};var Nd=(()=>((Nd=Nd||{})[Nd.SHIFT=2]="SHIFT",Nd[Nd.APPEND_EAGERLY=1]="APPEND_EAGERLY",Nd[Nd.COMMENT=2]="COMMENT",Nd))();let iS=J1;function oS(u,d,g){const A=d.insertBeforeIndex,k=Array.isArray(A)?A[0]:A;return null===k?xh(u,0,g):ot(g[k])}function sS(u,d,g,A,k){const q=d.insertBeforeIndex;if(Array.isArray(q)){let pe=A,Re=null;if(3&d.type||(Re=pe,pe=k),null!==pe&&0==(2&d.flags))for(let Ue=1;Ue<q.length;Ue++)qf(u,pe,g[q[Ue]],Re,!1)}}function aS(u,d){if(u.push(d),u.length>1)for(let g=u.length-2;g>=0;g--){const A=u[g];lS(A)||gM(A,d)&&null===mM(A)&&vM(A,d.index)}}function lS(u){return!(64&u.type)}function gM(u,d){return lS(d)||u.index>d.index}function mM(u){const d=u.insertBeforeIndex;return Array.isArray(d)?d[0]:d}function vM(u,d){const g=u.insertBeforeIndex;Array.isArray(g)?g[0]=d:(a_(oS,sS),u.insertBeforeIndex=d)}function Mv(u,d){const g=u.data[d];return null===g||"string"==typeof g?null:g.hasOwnProperty("currentCaseLViewIndex")?g:g.value}function EM(u,d,g){const A=Eg(u,g,64,null,null);return aS(d,A),A}function Av(u,d){const g=d[u.currentCaseLViewIndex];return null===g?g:g<0?~g:g}function X1(u){return u>>>17}function uS(u){return(131070&u)>>>1}let Dv=0,wv=0;function dS(u,d,g,A){const k=g[11];let pe,q=null;for(let Re=0;Re<d.length;Re++){const Ue=d[Re];if("string"==typeof Ue){const Dt=d[++Re];null===g[Dt]&&(g[Dt]=Dh(k,Ue))}else if("number"==typeof Ue)switch(1&Ue){case 0:const Dt=X1(Ue);let Zt,Dn;if(null===q&&(q=Dt,pe=Qp(k,A)),Dt===q?(Zt=A,Dn=pe):(Zt=null,Dn=ot(g[Dt])),null!==Dn){const jo=uS(Ue);qf(k,Dn,g[jo],Zt,!1);const zs=Mv(u,jo);if(null!==zs&&"object"==typeof zs){const _o=Av(zs,g);null!==_o&&dS(u,zs.create[_o],g,g[zs.anchorIdx])}}break;case 1:const Jr=d[++Re],Vi=d[++Re];Ph(k,qr(Ue>>>1,g),null,null,Jr,Vi,null)}else switch(Ue){case K1:const Dt=d[++Re],Zt=d[++Re];null===g[Zt]&&ic(g[Zt]=wh(k,Dt),g);break;case Q1:const Dn=d[++Re],br=d[++Re];null===g[br]&&ic(g[br]=zc(k,Dn,null),g)}}}function fS(u,d,g,A,k){for(let q=0;q<g.length;q++){const pe=g[q],Re=g[++q];if(pe&k){let Ue="";for(let Dt=q+1;Dt<=q+Re;Dt++){const Zt=g[Dt];if("string"==typeof Zt)Ue+=Zt;else if("number"==typeof Zt)if(Zt<0)Ue+=ie(d[A-Zt]);else{const Dn=Zt>>>2;switch(3&Zt){case 1:const br=g[++Dt],Jr=g[++Dt],Vi=u.data[Dn];"string"==typeof Vi?Ph(d[11],d[Dn],null,Vi,br,Ue,Jr):$f(u,Vi,d,br,Ue,d[11],Jr,!1);break;case 0:const jo=d[Dn];null!==jo&&Mp(d[11],jo,Ue);break;case 2:MM(u,Mv(u,Dn),d,Ue);break;case 3:pS(u,Mv(u,Dn),A,d)}}}}else{const Ue=g[q+1];if(Ue>0&&3==(3&Ue)){const Zt=Mv(u,Ue>>>2);d[Zt.currentCaseLViewIndex]<0&&pS(u,Zt,A,d)}}q+=Re}}function pS(u,d,g,A){let k=A[d.currentCaseLViewIndex];if(null!==k){let q=Dv;k<0&&(k=A[d.currentCaseLViewIndex]=~k,q=-1),fS(u,A,d.update[k],g,q)}}function MM(u,d,g,A){const k=function OM(u,d){let g=u.cases.indexOf(d);if(-1===g)switch(u.type){case 1:{const A=function fM(u,d){const g=nS(d)(parseInt(u,10)),A=dM[g];return void 0!==A?A:"other"}(d,function _M(){return iS}());g=u.cases.indexOf(A),-1===g&&"other"!==A&&(g=u.cases.indexOf("other"));break}case 0:g=u.cases.indexOf("other")}return-1===g?null:g}(d,A);if(Av(d,g)!==k&&(hS(u,d,g),g[d.currentCaseLViewIndex]=null===k?null:~k,null!==k)){const pe=g[d.anchorIdx];pe&&dS(u,d.create[k],g,pe)}}function hS(u,d,g){let A=Av(d,g);if(null!==A){const k=d.remove[A];for(let q=0;q<k.length;q++){const pe=k[q];if(pe>0){const Re=qr(pe,g);null!==Re&&Rh(g[11],Re)}else hS(u,Mv(u,~pe),g)}}}function AM(){const u=[];let g,A,d=-1;function q(Re,Ue){d=0;const Dt=Av(Re,Ue);A=null!==Dt?Re.remove[Dt]:Zn}function pe(){if(d<A.length){const Re=A[d++];return Re>0?g[Re]:(u.push(d,A),q(g[1].data[~Re],g),pe())}return 0===u.length?null:(A=u.pop(),d=u.pop(),pe())}return function k(Re,Ue){for(g=Ue;u.length;)u.pop();return q(Re.value,Ue),pe}}const q1=/\ufffd(\d+):?\d*\ufffd/gi,DM=/({\s*\ufffd\d+:?\d*\ufffd\s*,\s*\S{6}\s*,[\s\S]*})/gi,wM=/\ufffd(\d+)\ufffd/,gS=/^\s*(\ufffd\d+:?\d*\ufffd)\s*,\s*(select|plural)\s*,/,xM=/\ufffd\/?\*(\d+:\d+)\ufffd/gi,RM=/\ufffd(\/?[#*]\d+):?\d*\ufffd/gi,NM=/\uE500/g;function mS(u,d,g,A,k,q,pe){const Re=xp(u,A,1,null);let Ue=Re<<Nd.SHIFT,Dt=bl();d===Dt&&(Dt=null),null===Dt&&(Ue|=Nd.APPEND_EAGERLY),pe&&(Ue|=Nd.COMMENT,function oc(u){void 0===zp&&(zp=u())}(AM)),k.push(Ue,null===q?"":q);const Zt=Eg(u,Re,pe?32:1,null===q?"":q,null);aS(g,Zt);const Dn=Zt.index;return su(Zt,!1),null!==Dt&&d!==Dt&&function yM(u,d){let g=u.insertBeforeIndex;null===g?(a_(oS,sS),g=u.insertBeforeIndex=[null,d]):(function We(u,d,g){u!=d&&Vt(g,u,d,"==")}(Array.isArray(g),!0,"Expecting array here"),g.push(d))}(Dt,Dn),Zt}function LM(u,d,g,A,k,q,pe){const Re=pe.match(q1),Ue=mS(u,d,g,q,A,Re?null:pe,!1);Re&&Bm(k,pe,Ue.index,null,0,null)}function Bm(u,d,g,A,k,q){const pe=u.length,Re=pe+1;u.push(null,null);const Ue=pe+2,Dt=d.split(q1);let Zt=0;for(let Dn=0;Dn<Dt.length;Dn++){const br=Dt[Dn];if(1&Dn){const Jr=k+parseInt(br,10);u.push(-1-Jr),Zt|=vS(Jr)}else""!==br&&u.push(br)}return u.push(g<<2|(A?1:0)),A&&u.push(A,q),u[pe]=Zt,u[Re]=u.length-Ue,Zt}function kM(u){let d=0;for(let g=0;g<u.length;g++){const A=u[g];"number"==typeof A&&A<0&&d++}return d}function vS(u){return 1<<Math.min(u,31)}function yS(u){let d,q,g="",A=0,k=!1;for(;null!==(d=xM.exec(u));)k?d[0]===`\ufffd/*${q}\ufffd`&&(A=d.index,k=!1):(g+=u.substring(A,d.index+d[0].length),q=d[1],k=!0);return g+=u.substr(A),g}function ES(u,d,g,A,k,q){let pe=0;const Re={type:k.type,currentCaseLViewIndex:xp(u,d,1,null),anchorIdx:q,cases:[],create:[],remove:[],update:[]};(function jM(u,d,g){u.push(vS(d.mainBinding),2,-1-d.mainBinding,g<<2|2)})(g,k,q),function Ov(u,d,g){const A=u.data[d];null===A?u.data[d]=g:A.value=g}(u,q,Re);const Ue=k.values;for(let Dt=0;Dt<Ue.length;Dt++){const Zt=Ue[Dt],Dn=[];for(let br=0;br<Zt.length;br++){const Jr=Zt[br];if("string"!=typeof Jr){const Vi=Dn.push(Jr)-1;Zt[br]=`\x3c!--\ufffd${Vi}\ufffd--\x3e`}}pe=UM(u,Re,d,g,A,k.cases[Dt],Zt.join(""),Dn)|pe}pe&&function GM(u,d,g){u.push(d,1,g<<2|3)}(g,pe,q)}function BM(u){const d=[],g=[];let A=1,k=0;const q=Ny(u=u.replace(gS,function(pe,Re,Ue){return A="select"===Ue?0:1,k=parseInt(Re.substr(1),10),""}));for(let pe=0;pe<q.length;){let Re=q[pe++].trim();1===A&&(Re=Re.replace(/\s*(?:=)?(\w+)\s*/,"$1")),Re.length&&d.push(Re);const Ue=Ny(q[pe++]);d.length>g.length&&g.push(Ue)}return{type:A,mainBinding:k,cases:d,values:g}}function Ny(u){if(!u)return[];let d=0;const g=[],A=[],k=/[{}]/g;let q;for(k.lastIndex=0;q=k.exec(u);){const Re=q.index;if("}"==q[0]){if(g.pop(),0==g.length){const Ue=u.substring(d,Re);gS.test(Ue)?A.push(BM(Ue)):A.push(Ue),d=Re+1}}else{if(0==g.length){const Ue=u.substring(d,Re);A.push(Ue),d=Re+1}g.push("{")}}const pe=u.substring(d);return A.push(pe),A}function UM(u,d,g,A,k,q,pe,Re){const Ue=[],Dt=[],Zt=[];d.cases.push(q),d.create.push(Ue),d.remove.push(Dt),d.update.push(Zt);const br=Ud(Ml()).getInertBodyElement(pe),Jr=mh(br)||br;return Jr?bS(u,d,g,A,Ue,Dt,Zt,Jr,k,Re,0):0}function bS(u,d,g,A,k,q,pe,Re,Ue,Dt,Zt){let Dn=0,br=Re.firstChild;for(;br;){const Jr=xp(u,g,1,null);switch(br.nodeType){case Node.ELEMENT_NODE:const Vi=br,jo=Vi.tagName.toLowerCase();if(vf.hasOwnProperty(jo)){Py(k,Q1,jo,Ue,Jr),u.data[Jr]=jo;const Da=Vi.attributes;for(let ql=0;ql<Da.length;ql++){const Zu=Da.item(ql),ih=Zu.name.toLowerCase();Zu.value.match(q1)?Mu.hasOwnProperty(ih)&&Bm(pe,Zu.value,Jr,Zu.name,0,yf[ih]?wf:zf[ih]?Bp:null):zM(k,Jr,Zu)}Dn=bS(u,d,g,A,k,q,pe,br,Jr,Dt,Zt+1)|Dn,SS(q,Jr,Zt)}break;case Node.TEXT_NODE:const ls=br.textContent||"",zs=ls.match(q1);Py(k,null,zs?"":ls,Ue,Jr),SS(q,Jr,Zt),zs&&(Dn=Bm(pe,ls,Jr,null,0,null)|Dn);break;case Node.COMMENT_NODE:const _o=wM.exec(br.textContent||"");if(_o){const ql=Dt[parseInt(_o[1],10)];Py(k,K1,"",Ue,Jr),ES(u,g,A,Ue,ql,Jr),YM(q,Jr,Zt)}}br=br.nextSibling}return Dn}function SS(u,d,g){0===g&&u.push(d)}function YM(u,d,g){0===g&&(u.push(~d),u.push(d))}function Py(u,d,g,A,k){null!==d&&u.push(d),u.push(g,k,function bM(u,d,g){return u|d<<17|g<<1}(0,A,k))}function zM(u,d,g){u.push(d<<1|1,g.name,g.value)}const VM=/\[(\ufffd.+?\ufffd?)\]/,ZM=/\[(\ufffd.+?\ufffd?)\]|(\ufffd\/?\*\d+:\d+\ufffd)/g,WM=/({\s*)(VAR_(PLURAL|SELECT)(_\d+)?)(\s*,)/g,JM=/{([A-Z0-9_]+)}/g,QM=/\ufffdI18N_EXP_(ICU(_\d+)?)\ufffd/g,KM=/\/\*/,XM=/\d+\:(\d+)/;function Iy(u,d,g=-1){const A=oa(),k=Hi(),q=20+u,pe=Bs(A.consts,d),Re=bl();A.firstCreatePass&&function IM(u,d,g,A,k,q){const pe=bl(),Re=[],Ue=[],Dt=[[]];k=function HM(u,d){if(function $M(u){return-1===u}(d))return yS(u);{const g=u.indexOf(`:${d}\ufffd`)+2+d.toString().length,A=u.search(new RegExp(`\ufffd\\/\\*\\d+:${d}\ufffd`));return yS(u.substring(g,A))}}(k,q);const Zt=function PM(u){return u.replace(NM," ")}(k).split(RM);for(let Dn=0;Dn<Zt.length;Dn++){let br=Zt[Dn];if(0==(1&Dn)){const Jr=Ny(br);for(let Vi=0;Vi<Jr.length;Vi++){let jo=Jr[Vi];if(0==(1&Vi)){const ls=jo;""!==ls&&LM(u,pe,Dt[0],Re,Ue,g,ls)}else{const ls=jo;if("object"!=typeof ls)throw new Error(`Unable to parse ICU expression in "${k}" message.`);ES(u,g,Ue,d,ls,mS(u,pe,Dt[0],g,Re,"",!0).index)}}}else{const Jr=47===br.charCodeAt(0),jo=(br.charCodeAt(Jr?1:0),20+Number.parseInt(br.substring(Jr?2:1)));if(Jr)Dt.shift(),su(bl(),!1);else{const ls=EM(u,Dt[0],jo);Dt.unshift([]),su(ls,!0)}}}u.data[A]={create:Re,update:Ue}}(A,null===Re?0:Re.index,k,q,pe,g);const Ue=A.data[q],Zt=T_(A,Re===k[6]?null:Re,k);(function CM(u,d,g,A){const k=u[11];for(let q=0;q<d.length;q++){const pe=d[q++],Re=d[q],Ue=(pe&Nd.COMMENT)===Nd.COMMENT,Dt=(pe&Nd.APPEND_EAGERLY)===Nd.APPEND_EAGERLY,Zt=pe>>>Nd.SHIFT;let Dn=u[Zt];null===Dn&&(Dn=u[Zt]=Ue?k.createComment(Re):Dh(k,Re)),Dt&&null!==g&&qf(k,g,Dn,A,!1)}})(k,Ue.create,Zt,Re&&8&Re.type?k[Re.index]:null),Fd(!0)}function Ly(){Fd(!1)}function CS(u,d,g){Iy(u,d,g),Ly()}function MS(u,d){const g=oa();!function FM(u,d,g){const k=ys().index,q=[];if(u.firstCreatePass&&null===u.data[d]){for(let pe=0;pe<g.length;pe+=2){const Re=g[pe],Ue=g[pe+1];if(""!==Ue){if(DM.test(Ue))throw new Error(`ICU expressions are not supported in attributes. Message: "${Ue}".`);Bm(q,Ue,k,Re,kM(q),null)}}u.data[d]=q}}(g,u+20,Bs(g.consts,d))}function Fy(u){return function SM(u){u&&(Dv|=1<<Math.min(wv,31)),wv++}(Hf(Hi(),$u(),u)),Fy}function ky(u){!function TM(u,d,g){if(wv>0){const A=u.data[g];fS(u,d,Array.isArray(A)?A:A.update,uu()-wv-1,Dv)}Dv=0,wv=0}(oa(),Hi(),u+20)}function $y(u,d={}){return function qM(u,d={}){let g=u;if(VM.test(u)){const A={},k=[0];g=g.replace(ZM,(q,pe,Re)=>{const Ue=pe||Re,Dt=A[Ue]||[];if(Dt.length||(Ue.split("|").forEach(jo=>{const ls=jo.match(XM),zs=ls?parseInt(ls[1],10):0,_o=KM.test(jo);Dt.push([zs,_o,jo])}),A[Ue]=Dt),!Dt.length)throw new Error(`i18n postprocess: unmatched placeholder - ${Ue}`);const Zt=k[k.length-1];let Dn=0;for(let jo=0;jo<Dt.length;jo++)if(Dt[jo][0]===Zt){Dn=jo;break}const[br,Jr,Vi]=Dt[Dn];return Jr?k.pop():Zt!==br&&k.push(br),Dt.splice(Dn,1),Vi})}return Object.keys(d).length&&(g=g.replace(WM,(A,k,q,pe,Re,Ue)=>d.hasOwnProperty(q)?`${k}${d[q]}${Ue}`:A),g=g.replace(JM,(A,k)=>d.hasOwnProperty(k)?d[k]:A),g=g.replace(QM,(A,k)=>{if(d.hasOwnProperty(k)){const q=d[k];if(!q.length)throw new Error(`i18n postprocess: unmatched ICU - ${A} with key: ${k}`);return q.shift()}return A})),g}(u,d)}function Hy(u,d,g,A,k){if(u=z(u),Array.isArray(u))for(let q=0;q<u.length;q++)Hy(u[q],d,g,A,k);else{const q=oa(),pe=Hi();let Re=gd(u)?u:z(u.provide),Ue=p1(u);const Dt=ys(),Zt=1048575&Dt.providerIndexes,Dn=Dt.directiveStart,br=Dt.providerIndexes>>20;if(gd(u)||!u.multi){const Jr=new La(Ue,k,Ea),Vi=Uy(Re,d,k?Zt:Zt+br,Dn);-1===Vi?(Fa(ha(Dt,pe),q,Re),By(q,u,d.length),d.push(Re),Dt.directiveStart++,Dt.directiveEnd++,k&&(Dt.providerIndexes+=1048576),g.push(Jr),pe.push(Jr)):(g[Vi]=Jr,pe[Vi]=Jr)}else{const Jr=Uy(Re,d,Zt+br,Dn),Vi=Uy(Re,d,Zt,Zt+br),jo=Jr>=0&&g[Jr],ls=Vi>=0&&g[Vi];if(k&&!ls||!k&&!jo){Fa(ha(Dt,pe),q,Re);const zs=function r2(u,d,g,A,k){const q=new La(u,g,Ea);return q.multi=[],q.index=d,q.componentProviders=0,OS(q,k,A&&!g),q}(k?n2:t2,g.length,k,A,Ue);!k&&ls&&(g[Vi].providerFactory=zs),By(q,u,d.length,0),d.push(Re),Dt.directiveStart++,Dt.directiveEnd++,k&&(Dt.providerIndexes+=1048576),g.push(zs),pe.push(zs)}else By(q,u,Jr>-1?Jr:Vi,OS(g[k?Vi:Jr],Ue,!k&&A));!k&&A&&ls&&g[Vi].componentProviders++}}}function By(u,d,g,A){const k=gd(d),q=function _1(u){return!!u.useClass}(d);if(k||q){const Ue=(q?z(d.useClass):d).prototype.ngOnDestroy;if(Ue){const Dt=u.destroyHooks||(u.destroyHooks=[]);if(!k&&d.multi){const Zt=Dt.indexOf(g);-1===Zt?Dt.push(g,[A,Ue]):Dt[Zt+1].push(A,Ue)}else Dt.push(g,Ue)}}}function OS(u,d,g){return g&&u.componentProviders++,u.multi.push(d)-1}function Uy(u,d,g,A){for(let k=g;k<A;k++)if(d[k]===u)return k;return-1}function t2(u,d,g,A){return Yy(this.multi,[])}function n2(u,d,g,A){const k=this.multi;let q;if(this.providerFactory){const pe=this.providerFactory.componentProviders,Re=lu(g,g[1],this.providerFactory.index,A);q=Re.slice(0,pe),Yy(k,q);for(let Ue=pe;Ue<Re.length;Ue++)q.push(Re[Ue])}else q=[],Yy(k,q);return q}function Yy(u,d){for(let g=0;g<u.length;g++)d.push((0,u[g])());return d}function AS(u,d=[]){return g=>{g.providersResolver=(A,k)=>function e2(u,d,g){const A=oa();if(A.firstCreatePass){const k=Pa(u);Hy(g,A.data,A.blueprint,k,!0),Hy(d,A.data,A.blueprint,k,!1)}}(A,k?k(u):u,d)}}class DS{}class wS{}class o2{resolveComponentFactory(d){throw function jy(u){const d=Error(`No component factory found for ${T(u)}. Did you add it to @NgModule.entryComponents?`);return d.ngComponent=u,d}(d)}}let e0=(()=>{class u{}return u.NULL=new o2,u})();function s2(){return Um(ys(),Hi())}function Um(u,d){return new Rv(Di(u,d))}let Rv=(()=>{class u{constructor(g){this.nativeElement=g}}return u.__NG_ELEMENT_ID__=s2,u})();function a2(u){return u instanceof Rv?u.nativeElement:u}class RS{}let NS=(()=>{class u{}return u.__NG_ELEMENT_ID__=()=>function u2(){const u=Hi(),g=Ns(ys().index,u);return function l2(u){return u[11]}(es(g)?g:u)}(),u})(),c2=(()=>{class u{}return u.\u0275prov=Nt({token:u,providedIn:"root",factory:()=>null}),u})();class PS{constructor(d){this.full=d,this.major=d.split(".")[0],this.minor=d.split(".")[1],this.patch=d.split(".").slice(2).join(".")}}const d2=new PS("13.3.11"),zy={};function t0(u,d,g,A,k=!1){for(;null!==g;){const q=d[g.index];if(null!==q&&A.push(ot(q)),ga(q))for(let Re=10;Re<q.length;Re++){const Ue=q[Re],Dt=Ue[1].firstChild;null!==Dt&&t0(Ue[1],Ue,Dt,A)}const pe=g.type;if(8&pe)t0(u,d,g.child,A);else if(32&pe){const Re=pc(g,d);let Ue;for(;Ue=Re();)A.push(Ue)}else if(16&pe){const Re=l_(d,g);if(Array.isArray(Re))A.push(...Re);else{const Ue=Lf(d[16]);t0(Ue[1],Ue,Re,A,!0)}}g=k?g.projectionNext:g.next}return A}class Nv{constructor(d,g){this._lView=d,this._cdRefInjectingView=g,this._appRef=null,this._attachedToViewContainer=!1}get rootNodes(){const d=this._lView,g=d[1];return t0(g,d,g.firstChild,[])}get context(){return this._lView[8]}set context(d){this._lView[8]=d}get destroyed(){return 256==(256&this._lView[2])}destroy(){if(this._appRef)this._appRef.detachView(this);else if(this._attachedToViewContainer){const d=this._lView[3];if(ga(d)){const g=d[8],A=g?g.indexOf(this):-1;A>-1&&(o_(d,A),nc(g,A))}this._attachedToViewContainer=!1}Ap(this._lView[1],this._lView)}onDestroy(d){em(this._lView[1],this._lView,null,d)}markForCheck(){dv(this._cdRefInjectingView||this._lView)}detach(){this._lView[2]&=-129}reattach(){this._lView[2]|=128}detectChanges(){!function cg(u,d,g){const A=d[10];A.begin&&A.begin();try{D_(u,d,u.template,g)}catch(k){throw o1(d,k),k}finally{A.end&&A.end()}}(this._lView[1],this._lView,this.context)}checkNoChanges(){}attachToViewContainerRef(){if(this._appRef)throw new ee(902,"");this._attachedToViewContainer=!0}detachFromAppRef(){this._appRef=null,function Op(u,d){Xp(u,d,d[11],2,null,null)}(this._lView[1],this._lView)}attachToAppRef(d){if(this._attachedToViewContainer)throw new ee(902,"");this._appRef=d}}class f2 extends Nv{constructor(d){super(d),this._view=d}detectChanges(){Am(this._view)}checkNoChanges(){}get context(){return null}}class IS extends e0{constructor(d){super(),this.ngModule=d}resolveComponentFactory(d){const g=dn(d);return new n0(g,this.ngModule)}}function LS(u){const d=[];for(let g in u)u.hasOwnProperty(g)&&d.push({propName:u[g],templateName:g});return d}class n0 extends wS{constructor(d,g){super(),this.componentDef=d,this.ngModule=g,this.componentType=d.type,this.selector=function Do(u){return u.map(ts).join(",")}(d.selectors),this.ngContentSelectors=d.ngContentSelectors?d.ngContentSelectors:[],this.isBoundToModule=!!g}get inputs(){return LS(this.componentDef.inputs)}get outputs(){return LS(this.componentDef.outputs)}create(d,g,A,k){const q=(k=k||this.ngModule)?function h2(u,d){return{get:(g,A,k)=>{const q=u.get(g,zy,k);return q!==zy||A===zy?q:d.get(g,A,k)}}}(d,k.injector):d,pe=q.get(RS,Qe),Re=q.get(c2,null),Ue=pe.createRenderer(null,this.componentDef),Dt=this.componentDef.selectors[0][0]||"div",Zt=A?function qg(u,d,g){if(Ua(u))return u.selectRootElement(d,g===Jn.ShadowDom);let A="string"==typeof d?u.querySelector(d):d;return A.textContent="",A}(Ue,A,this.componentDef.encapsulation):zc(pe.createRenderer(null,this.componentDef),Dt,function p2(u){const d=u.toLowerCase();return"svg"===d?"svg":"math"===d?"math":null}(Dt)),Dn=this.componentDef.onPush?576:528,br=function b1(u,d){return{components:[],scheduler:u||Mh,clean:Cg,playerHandler:d||null,flags:0}}(),Jr=qp(0,null,null,1,0,null,null,null,null,null),Vi=ug(null,Jr,br,Dn,null,null,pe,Ue,Re,q);let jo,ls;sn(Vi);try{const zs=function dg(u,d,g,A,k,q){const pe=g[1];g[20]=u;const Ue=A_(pe,20,2,"#host",null),Dt=Ue.mergedAttrs=d.hostAttrs;null!==Dt&&(th(Ue,Dt,!0),null!==u&&(gc(k,u,Dt),null!==Ue.classes&&Nh(k,u,Ue.classes),null!==Ue.styles&&pp(k,u,Ue.styles)));const Zt=A.createRenderer(u,d),Dn=ug(g,j_(d),null,d.onPush?64:16,g[20],Ue,A,Zt,q||null,null);return pe.firstCreatePass&&(Fa(ha(Ue,g),pe,d.type),hl(pe,Ue),Au(Ue,g.length,1)),Mm(g,Dn),g[20]=Dn}(Zt,this.componentDef,Vi,pe,Ue);if(Zt)if(A)gc(Ue,Zt,["ng-version",d2.full]);else{const{attrs:_o,classes:Da}=function Ss(u){const d=[],g=[];let A=1,k=2;for(;A<u.length;){let q=u[A];if("string"==typeof q)2===k?""!==q&&d.push(q,u[++A]):8===k&&g.push(q);else{if(!G(k))break;k=q}A++}return{attrs:d,classes:g}}(this.componentDef.selectors[0]);_o&&gc(Ue,Zt,_o),Da&&Da.length>0&&Nh(Ue,Zt,Da.join(" "))}if(ls=js(Jr,20),void 0!==g){const _o=ls.projection=[];for(let Da=0;Da<this.ngContentSelectors.length;Da++){const ql=g[Da];_o.push(null!=ql?Array.from(ql):null)}}jo=function E1(u,d,g,A,k){const q=g[1],pe=function it(u,d,g){const A=ys();u.firstCreatePass&&(g.providersResolver&&g.providersResolver(g),qc(u,A,d,xp(u,d,1,null),g));const k=lu(d,u,A.directiveStart,A);ic(k,d);const q=Di(A,d);return q&&ic(q,d),k}(q,g,d);if(A.components.push(pe),u[8]=pe,k&&k.forEach(Ue=>Ue(pe,d)),d.contentQueries){const Ue=ys();d.contentQueries(1,pe,Ue.directiveStart)}const Re=ys();return!q.firstCreatePass||null===d.hostBindings&&null===d.hostAttrs||(Ar(Re.index),Kn(g[1],Re,0,Re.directiveStart,Re.directiveEnd,d),Jo(d,pe)),pe}(zs,this.componentDef,Vi,br,[Q0]),Y_(Jr,Vi,null)}finally{gi()}return new g2(this.componentType,jo,Um(ls,Vi),Vi,ls)}}class g2 extends DS{constructor(d,g,A,k,q){super(),this.location=A,this._rootLView=k,this._tNode=q,this.instance=g,this.hostView=this.changeDetectorRef=new f2(k),this.componentType=d}get injector(){return new Cl(this._tNode,this._rootLView)}destroy(){this.hostView.destroy()}onDestroy(d){this.hostView.onDestroy(d)}}class Ym{}class FS{}const jm=new Map;class Gm extends Ym{constructor(d,g){super(),this._parent=g,this._bootstrapComponents=[],this.injector=this,this.destroyCbs=[],this.componentFactoryResolver=new IS(this);const A=di(d);this._bootstrapComponents=qd(A.bootstrap),this._r3Injector=f1(d,g,[{provide:Ym,useValue:this},{provide:e0,useValue:this.componentFactoryResolver}],T(d)),this._r3Injector._resolveInjectorDefTypes(),this.instance=this.get(d)}get(d,g=R_.THROW_IF_NOT_FOUND,A=dr.Default){return d===R_||d===Ym||d===Dm?this:this._r3Injector.get(d,g,A)}destroy(){const d=this._r3Injector;!d.destroyed&&d.destroy(),this.destroyCbs.forEach(g=>g()),this.destroyCbs=null}onDestroy(d){this.destroyCbs.push(d)}}class Zy extends FS{constructor(d){super(),this.moduleType=d,null!==di(d)&&function v2(u){const d=new Set;!function g(A){const k=di(A,!0),q=k.id;null!==q&&(function kS(u,d,g){if(d&&d!==g)throw new Error(`Duplicate module registered for ${u} - ${T(d)} vs ${T(d.name)}`)}(q,jm.get(q),A),jm.set(q,A));const pe=qd(k.imports);for(const Re of pe)d.has(Re)||(d.add(Re),g(Re))}(u)}(d)}create(d){return new Gm(this.moduleType,d)}}function Wy(u,d,g){const A=au()+u,k=Hi();return k[A]===Yo?f_(k,A,g?d.call(g):d()):om(k,A)}function $S(u,d,g,A){return zS(Hi(),au(),u,d,g,A)}function HS(u,d,g,A,k){return Jy(Hi(),au(),u,d,g,A,k)}function BS(u,d,g,A,k,q){return VS(Hi(),au(),u,d,g,A,k,q)}function US(u,d,g,A,k,q,pe){return function ZS(u,d,g,A,k,q,pe,Re,Ue){const Dt=d+g;return nh(u,Dt,k,q,pe,Re)?f_(u,Dt+4,Ue?A.call(Ue,k,q,pe,Re):A(k,q,pe,Re)):Pv(u,Dt+4)}(Hi(),au(),u,d,g,A,k,q,pe)}function YS(u,d,g,A,k,q,pe,Re){const Ue=au()+u,Dt=Hi(),Zt=nh(Dt,Ue,g,A,k,q);return Hf(Dt,Ue+4,pe)||Zt?f_(Dt,Ue+5,Re?d.call(Re,g,A,k,q,pe):d(g,A,k,q,pe)):om(Dt,Ue+5)}function Pv(u,d){const g=u[d];return g===Yo?void 0:g}function zS(u,d,g,A,k,q){const pe=d+g;return Hf(u,pe,k)?f_(u,pe+1,q?A.call(q,k):A(k)):Pv(u,pe+1)}function Jy(u,d,g,A,k,q,pe){const Re=d+g;return N_(u,Re,k,q)?f_(u,Re+2,pe?A.call(pe,k,q):A(k,q)):Pv(u,Re+2)}function VS(u,d,g,A,k,q,pe,Re){const Ue=d+g;return Nm(u,Ue,k,q,pe)?f_(u,Ue+3,Re?A.call(Re,k,q,pe):A(k,q,pe)):Pv(u,Ue+3)}function Qy(u,d){const g=oa();let A;const k=u+20;g.firstCreatePass?(A=function E2(u,d){if(d)for(let g=d.length-1;g>=0;g--){const A=d[g];if(u===A.name)return A}}(d,g.pipeRegistry),g.data[k]=A,A.onDestroy&&(g.destroyHooks||(g.destroyHooks=[])).push(k,A.onDestroy)):A=g.data[k];const q=A.factory||(A.factory=bi(A.type)),pe=_i(Ea);try{const Re=Ln(!1),Ue=q();return Ln(Re),function iy(u,d,g,A){g>=u.data.length&&(u.data[g]=null,u.blueprint[g]=null),d[g]=A}(g,Hi(),k,Ue),Ue}finally{_i(pe)}}function JS(u,d,g){const A=u+20,k=Hi(),q=As(k,A);return Iv(k,A)?zS(k,au(),d,q.transform,g,q):q.transform(g)}function QS(u,d,g,A){const k=u+20,q=Hi(),pe=As(q,k);return Iv(q,k)?Jy(q,au(),d,pe.transform,g,A,pe):pe.transform(g,A)}function KS(u,d,g,A,k){const q=u+20,pe=Hi(),Re=As(pe,q);return Iv(pe,q)?VS(pe,au(),d,Re.transform,g,A,k,Re):Re.transform(g,A,k)}function Iv(u,d){return u[1].data[d].pure}function Ky(u){return d=>{setTimeout(u,void 0,d)}}const Q_=class T2 extends r.xQ{constructor(d=!1){super(),this.__isAsync=d}emit(d){super.next(d)}subscribe(d,g,A){var k,q,pe;let Re=d,Ue=g||(()=>null),Dt=A;if(d&&"object"==typeof d){const Dn=d;Re=null===(k=Dn.next)||void 0===k?void 0:k.bind(Dn),Ue=null===(q=Dn.error)||void 0===q?void 0:q.bind(Dn),Dt=null===(pe=Dn.complete)||void 0===pe?void 0:pe.bind(Dn)}this.__isAsync&&(Ue=Ky(Ue),Re&&(Re=Ky(Re)),Dt&&(Dt=Ky(Dt)));const Zt=super.subscribe({next:Re,error:Ue,complete:Dt});return d instanceof a.w&&d.add(Zt),Zt}};function C2(){return this._results[Fh()]()}class Xy{constructor(d=!1){this._emitDistinctChangesOnly=d,this.dirty=!0,this._results=[],this._changesDetected=!1,this._changes=null,this.length=0,this.first=void 0,this.last=void 0;const g=Fh(),A=Xy.prototype;A[g]||(A[g]=C2)}get changes(){return this._changes||(this._changes=new Q_)}get(d){return this._results[d]}map(d){return this._results.map(d)}filter(d){return this._results.filter(d)}find(d){return this._results.find(d)}reduce(d,g){return this._results.reduce(d,g)}forEach(d){this._results.forEach(d)}some(d){return this._results.some(d)}toArray(){return this._results.slice()}toString(){return this._results.toString()}reset(d,g){const A=this;A.dirty=!1;const k=$c(d);(this._changesDetected=!function vp(u,d,g){if(u.length!==d.length)return!1;for(let A=0;A<u.length;A++){let k=u[A],q=d[A];if(g&&(k=g(k),q=g(q)),q!==k)return!1}return!0}(A._results,k,g))&&(A._results=k,A.length=k.length,A.last=k[this.length-1],A.first=k[0])}notifyOnChanges(){this._changes&&(this._changesDetected||!this._emitDistinctChangesOnly)&&this._changes.emit(this)}setDirty(){this.dirty=!0}destroy(){this.changes.complete(),this.changes.unsubscribe()}}Symbol;let Lv=(()=>{class u{}return u.__NG_ELEMENT_ID__=aD,u})();const M2=Lv,XS=class extends M2{constructor(d,g,A){super(),this._declarationLView=d,this._declarationTContainer=g,this.elementRef=A}createEmbeddedView(d){const g=this._declarationTContainer.tViews,A=ug(this._declarationLView,g,d,16,null,g.declTNode,null,null,null,null);A[17]=this._declarationLView[this._declarationTContainer.index];const q=this._declarationLView[19];return null!==q&&(A[19]=q.createEmbeddedView(g)),Y_(g,A,d),new Nv(A)}};function aD(){return r0(ys(),Hi())}function r0(u,d){return 4&u.type?new XS(d,u,Um(u,d)):null}let o0=(()=>{class u{}return u.__NG_ELEMENT_ID__=O2,u})();function O2(){return eT(ys(),Hi())}const qy=o0,s0=class extends qy{constructor(d,g,A){super(),this._lContainer=d,this._hostTNode=g,this._hostLView=A}get element(){return Um(this._hostTNode,this._hostLView)}get injector(){return new Cl(this._hostTNode,this._hostLView)}get parentInjector(){const d=lc(this._hostTNode,this._hostLView);if(Me(d)){const g=vt(d,this._hostLView),A=_e(d);return new Cl(g[1].data[A+8],g)}return new Cl(null,this._hostLView)}clear(){for(;this.length>0;)this.remove(this.length-1)}get(d){const g=qS(this._lContainer);return null!==g&&g[d]||null}get length(){return this._lContainer.length-10}createEmbeddedView(d,g,A){const k=d.createEmbeddedView(g||{});return this.insert(k,A),k}createComponent(d,g,A,k,q){const pe=d&&!function Vd(u){return"function"==typeof u}(d);let Re;if(pe)Re=g;else{const Dn=g||{};Re=Dn.index,A=Dn.injector,k=Dn.projectableNodes,q=Dn.ngModuleRef}const Ue=pe?d:new n0(dn(d)),Dt=A||this.parentInjector;if(!q&&null==Ue.ngModule){const br=(pe?Dt:this.parentInjector).get(Ym,null);br&&(q=br)}const Zt=Ue.create(Dt,k,void 0,q);return this.insert(Zt.hostView,Re),Zt}insert(d,g){const A=d._lView,k=A[1];if(function sl(u){return ga(u[3])}(A)){const Zt=this.indexOf(d);if(-1!==Zt)this.detach(Zt);else{const Dn=A[3],br=new s0(Dn,Dn[6],Dn[3]);br.detach(br.indexOf(d))}}const q=this._adjustIndex(g),pe=this._lContainer;!function Zp(u,d,g,A){const k=10+A,q=g.length;A>0&&(g[k-1][4]=d),A<q-10?(d[4]=g[k],ad(g,10+A,d)):(g.push(d),d[4]=null),d[3]=g;const pe=d[17];null!==pe&&g!==pe&&function Kf(u,d){const g=u[9];d[16]!==d[3][3][16]&&(u[2]=!0),null===g?u[9]=[d]:g.push(d)}(pe,d);const Re=d[19];null!==Re&&Re.insertView(u),d[2]|=128}(k,A,pe,q);const Re=Ff(q,pe),Ue=A[11],Dt=Qp(Ue,pe[7]);return null!==Dt&&function fp(u,d,g,A,k,q){A[0]=k,A[6]=d,Xp(u,A,g,1,k,q)}(k,pe[6],Ue,A,Dt,Re),d.attachToViewContainerRef(),ad(eE(pe),q,d),d}move(d,g){return this.insert(d,g)}indexOf(d){const g=qS(this._lContainer);return null!==g?g.indexOf(d):-1}remove(d){const g=this._adjustIndex(d,-1),A=o_(this._lContainer,g);A&&(nc(eE(this._lContainer),g),Ap(A[1],A))}detach(d){const g=this._adjustIndex(d,-1),A=o_(this._lContainer,g);return A&&null!=nc(eE(this._lContainer),g)?new Nv(A):null}_adjustIndex(d,g=0){return null==d?this.length+g:d}};function qS(u){return u[8]}function eE(u){return u[8]||(u[8]=[])}function eT(u,d){let g;const A=d[u.index];if(ga(A))g=A;else{let k;if(8&u.type)k=ot(A);else{const q=d[11];k=q.createComment("");const pe=Di(u,d);qf(q,Qp(q,pe),k,function C_(u,d){return Ua(u)?u.nextSibling(d):d.nextSibling}(q,pe),!1)}d[u.index]=g=hp(A,d,k,u),Mm(d,g)}return new s0(g,u,d)}class tE{constructor(d){this.queryList=d,this.matches=null}clone(){return new tE(this.queryList)}setDirty(){this.queryList.setDirty()}}class a0{constructor(d=[]){this.queries=d}createEmbeddedView(d){const g=d.queries;if(null!==g){const A=null!==d.contentQueries?d.contentQueries[0]:g.length,k=[];for(let q=0;q<A;q++){const pe=g.getByIndex(q);k.push(this.queries[pe.indexInDeclarationView].clone())}return new a0(k)}return null}insertView(d){this.dirtyQueriesWithMatches(d)}detachView(d){this.dirtyQueriesWithMatches(d)}dirtyQueriesWithMatches(d){for(let g=0;g<this.queries.length;g++)null!==uT(d,g).matches&&this.queries[g].setDirty()}}class tT{constructor(d,g,A=null){this.predicate=d,this.flags=g,this.read=A}}class nE{constructor(d=[]){this.queries=d}elementStart(d,g){for(let A=0;A<this.queries.length;A++)this.queries[A].elementStart(d,g)}elementEnd(d){for(let g=0;g<this.queries.length;g++)this.queries[g].elementEnd(d)}embeddedTView(d){let g=null;for(let A=0;A<this.length;A++){const k=null!==g?g.length:0,q=this.getByIndex(A).embeddedTView(d,k);q&&(q.indexInDeclarationView=A,null!==g?g.push(q):g=[q])}return null!==g?new nE(g):null}template(d,g){for(let A=0;A<this.queries.length;A++)this.queries[A].template(d,g)}getByIndex(d){return this.queries[d]}get length(){return this.queries.length}track(d){this.queries.push(d)}}class rE{constructor(d,g=-1){this.metadata=d,this.matches=null,this.indexInDeclarationView=-1,this.crossesNgTemplate=!1,this._appliesToNextNode=!0,this._declarationNodeIndex=g}elementStart(d,g){this.isApplyingToNode(g)&&this.matchTNode(d,g)}elementEnd(d){this._declarationNodeIndex===d.index&&(this._appliesToNextNode=!1)}template(d,g){this.elementStart(d,g)}embeddedTView(d,g){return this.isApplyingToNode(d)?(this.crossesNgTemplate=!0,this.addMatch(-d.index,g),new rE(this.metadata)):null}isApplyingToNode(d){if(this._appliesToNextNode&&1!=(1&this.metadata.flags)){const g=this._declarationNodeIndex;let A=d.parent;for(;null!==A&&8&A.type&&A.index!==g;)A=A.parent;return g===(null!==A?A.index:-1)}return this._appliesToNextNode}matchTNode(d,g){const A=this.metadata.predicate;if(Array.isArray(A))for(let k=0;k<A.length;k++){const q=A[k];this.matchTNodeWithReadOption(d,g,D2(g,q)),this.matchTNodeWithReadOption(d,g,kc(g,d,q,!1,!1))}else A===Lv?4&g.type&&this.matchTNodeWithReadOption(d,g,-1):this.matchTNodeWithReadOption(d,g,kc(g,d,A,!1,!1))}matchTNodeWithReadOption(d,g,A){if(null!==A){const k=this.metadata.read;if(null!==k)if(k===Rv||k===o0||k===Lv&&4&g.type)this.addMatch(g.index,-2);else{const q=kc(g,d,k,!1,!1);null!==q&&this.addMatch(g.index,q)}else this.addMatch(g.index,A)}}addMatch(d,g){null===this.matches?this.matches=[d,g]:this.matches.push(d,g)}}function D2(u,d){const g=u.localNames;if(null!==g)for(let A=0;A<g.length;A+=2)if(g[A]===d)return g[A+1];return null}function x2(u,d,g,A){return-1===g?function w2(u,d){return 11&u.type?Um(u,d):4&u.type?r0(u,d):null}(d,u):-2===g?function R2(u,d,g){return g===Rv?Um(d,u):g===Lv?r0(d,u):g===o0?eT(d,u):void 0}(u,d,A):lu(u,u[1],g,d)}function nT(u,d,g,A){const k=d[19].queries[A];if(null===k.matches){const q=u.data,pe=g.matches,Re=[];for(let Ue=0;Ue<pe.length;Ue+=2){const Dt=pe[Ue];Re.push(Dt<0?null:x2(d,q[Dt],pe[Ue+1],g.metadata.read))}k.matches=Re}return k.matches}function iE(u,d,g,A){const k=u.queries.getByIndex(g),q=k.matches;if(null!==q){const pe=nT(u,d,k,g);for(let Re=0;Re<q.length;Re+=2){const Ue=q[Re];if(Ue>0)A.push(pe[Re/2]);else{const Dt=q[Re+1],Zt=d[-Ue];for(let Dn=10;Dn<Zt.length;Dn++){const br=Zt[Dn];br[17]===br[3]&&iE(br[1],br,Dt,A)}if(null!==Zt[9]){const Dn=Zt[9];for(let br=0;br<Dn.length;br++){const Jr=Dn[br];iE(Jr[1],Jr,Dt,A)}}}}}return A}function rT(u){const d=Hi(),g=oa(),A=Ce();nt(A+1);const k=uT(g,A);if(u.dirty&&Io(d)===(2==(2&k.metadata.flags))){if(null===k.matches)u.reset([]);else{const q=k.crossesNgTemplate?iE(g,d,A,[]):nT(g,d,k,A);u.reset(q,a2),u.notifyOnChanges()}return!0}return!1}function iT(u,d,g){const A=oa();A.firstCreatePass&&(lT(A,new tT(u,d,g),-1),2==(2&d)&&(A.staticViewQueries=!0)),aT(A,Hi(),d)}function oT(u,d,g,A){const k=oa();if(k.firstCreatePass){const q=ys();lT(k,new tT(d,g,A),q.index),function P2(u,d){const g=u.contentQueries||(u.contentQueries=[]);d!==(g.length?g[g.length-1]:-1)&&g.push(u.queries.length-1,d)}(k,u),2==(2&g)&&(k.staticContentQueries=!0)}aT(k,Hi(),g)}function sT(){return function N2(u,d){return u[19].queries[d].queryList}(Hi(),Ce())}function aT(u,d,g){const A=new Xy(4==(4&g));em(u,d,A,A.destroy),null===d[19]&&(d[19]=new a0),d[19].queries.push(new tE(A))}function lT(u,d,g){null===u.queries&&(u.queries=new nE),u.queries.track(new rE(d,g))}function uT(u,d){return u.queries.getByIndex(d)}function cT(u,d){return r0(u,d)}const AT=yc("Input",u=>({bindingPropertyName:u})),Q2=yc("Output",u=>({bindingPropertyName:u}));function c0(...u){}const DT=new Xa("Application Initializer");let uE=(()=>{class u{constructor(g){this.appInits=g,this.resolve=c0,this.reject=c0,this.initialized=!1,this.done=!1,this.donePromise=new Promise((A,k)=>{this.resolve=A,this.reject=k})}runInitializers(){if(this.initialized)return;const g=[],A=()=>{this.done=!0,this.resolve()};if(this.appInits)for(let k=0;k<this.appInits.length;k++){const q=this.appInits[k]();if(am(q))g.push(q);else if(hb(q)){const pe=new Promise((Re,Ue)=>{q.subscribe({complete:Re,error:Ue})});g.push(pe)}}Promise.all(g).then(()=>{A()}).catch(k=>{this.reject(k)}),0===g.length&&A(),this.initialized=!0}}return u.\u0275fac=function(g){return new(g||u)(me(DT,8))},u.\u0275prov=Nt({token:u,factory:u.\u0275fac,providedIn:"root"}),u})();const wT=new Xa("AppId",{providedIn:"root",factory:function xT(){return`${Hv()}${Hv()}${Hv()}`}});function Hv(){return String.fromCharCode(97+Math.floor(25*Math.random()))}const RT=new Xa("Platform Initializer"),K2=new Xa("Platform ID",{providedIn:"platform",factory:()=>"unknown"}),NT=new Xa("appBootstrapListener");let d0=(()=>{class u{log(g){console.log(g)}warn(g){console.warn(g)}}return u.\u0275fac=function(g){return new(g||u)},u.\u0275prov=Nt({token:u,factory:u.\u0275fac,providedIn:"platform"}),u})();const cE=new Xa("LocaleId",{providedIn:"root",factory:()=>Oe(cE,dr.Optional|dr.SkipSelf)||function q2(){return"undefined"!=typeof $localize&&$localize.locale||J1}()}),eO=new Xa("DefaultCurrencyCode",{providedIn:"root",factory:()=>"USD"});class tO{constructor(d,g){this.ngModuleFactory=d,this.componentFactories=g}}let nO=(()=>{class u{compileModuleSync(g){return new Zy(g)}compileModuleAsync(g){return Promise.resolve(this.compileModuleSync(g))}compileModuleAndAllComponentsSync(g){const A=this.compileModuleSync(g),q=qd(di(g).declarations).reduce((pe,Re)=>{const Ue=dn(Re);return Ue&&pe.push(new n0(Ue)),pe},[]);return new tO(A,q)}compileModuleAndAllComponentsAsync(g){return Promise.resolve(this.compileModuleAndAllComponentsSync(g))}clearCache(){}clearCacheFor(g){}getModuleId(g){}}return u.\u0275fac=function(g){return new(g||u)},u.\u0275prov=Nt({token:u,factory:u.\u0275fac,providedIn:"root"}),u})();const rO=(()=>Promise.resolve(0))();function Zm(u){"undefined"==typeof Zone?rO.then(()=>{u&&u.apply(null,null)}):Zone.current.scheduleMicroTask("scheduleMicrotask",u)}class p_{constructor({enableLongStackTrace:d=!1,shouldCoalesceEventChangeDetection:g=!1,shouldCoalesceRunChangeDetection:A=!1}){if(this.hasPendingMacrotasks=!1,this.hasPendingMicrotasks=!1,this.isStable=!0,this.onUnstable=new Q_(!1),this.onMicrotaskEmpty=new Q_(!1),this.onStable=new Q_(!1),this.onError=new Q_(!1),"undefined"==typeof Zone)throw new Error("In this configuration Angular requires Zone.js");Zone.assertZonePatched();const k=this;k._nesting=0,k._outer=k._inner=Zone.current,Zone.TaskTrackingZoneSpec&&(k._inner=k._inner.fork(new Zone.TaskTrackingZoneSpec)),d&&Zone.longStackTraceZoneSpec&&(k._inner=k._inner.fork(Zone.longStackTraceZoneSpec)),k.shouldCoalesceEventChangeDetection=!A&&g,k.shouldCoalesceRunChangeDetection=A,k.lastRequestAnimationFrameId=-1,k.nativeRequestAnimationFrame=function iO(){let u=hr.requestAnimationFrame,d=hr.cancelAnimationFrame;if("undefined"!=typeof Zone&&u&&d){const g=u[Zone.__symbol__("OriginalDelegate")];g&&(u=g);const A=d[Zone.__symbol__("OriginalDelegate")];A&&(d=A)}return{nativeRequestAnimationFrame:u,nativeCancelAnimationFrame:d}}().nativeRequestAnimationFrame,function sO(u){const d=()=>{!function PT(u){u.isCheckStableRunning||-1!==u.lastRequestAnimationFrameId||(u.lastRequestAnimationFrameId=u.nativeRequestAnimationFrame.call(hr,()=>{u.fakeTopEventTask||(u.fakeTopEventTask=Zone.root.scheduleEventTask("fakeTopEventTask",()=>{u.lastRequestAnimationFrameId=-1,fE(u),u.isCheckStableRunning=!0,dE(u),u.isCheckStableRunning=!1},void 0,()=>{},()=>{})),u.fakeTopEventTask.invoke()}),fE(u))}(u)};u._inner=u._inner.fork({name:"angular",properties:{isAngularZone:!0},onInvokeTask:(g,A,k,q,pe,Re)=>{try{return f0(u),g.invokeTask(k,q,pe,Re)}finally{(u.shouldCoalesceEventChangeDetection&&"eventTask"===q.type||u.shouldCoalesceRunChangeDetection)&&d(),p0(u)}},onInvoke:(g,A,k,q,pe,Re,Ue)=>{try{return f0(u),g.invoke(k,q,pe,Re,Ue)}finally{u.shouldCoalesceRunChangeDetection&&d(),p0(u)}},onHasTask:(g,A,k,q)=>{g.hasTask(k,q),A===k&&("microTask"==q.change?(u._hasPendingMicrotasks=q.microTask,fE(u),dE(u)):"macroTask"==q.change&&(u.hasPendingMacrotasks=q.macroTask))},onHandleError:(g,A,k,q)=>(g.handleError(k,q),u.runOutsideAngular(()=>u.onError.emit(q)),!1)})}(k)}static isInAngularZone(){return"undefined"!=typeof Zone&&!0===Zone.current.get("isAngularZone")}static assertInAngularZone(){if(!p_.isInAngularZone())throw new Error("Expected to be in Angular Zone, but it is not!")}static assertNotInAngularZone(){if(p_.isInAngularZone())throw new Error("Expected to not be in Angular Zone, but it is!")}run(d,g,A){return this._inner.run(d,g,A)}runTask(d,g,A,k){const q=this._inner,pe=q.scheduleEventTask("NgZoneEvent: "+k,d,oO,c0,c0);try{return q.runTask(pe,g,A)}finally{q.cancelTask(pe)}}runGuarded(d,g,A){return this._inner.runGuarded(d,g,A)}runOutsideAngular(d){return this._outer.run(d)}}const oO={};function dE(u){if(0==u._nesting&&!u.hasPendingMicrotasks&&!u.isStable)try{u._nesting++,u.onMicrotaskEmpty.emit(null)}finally{if(u._nesting--,!u.hasPendingMicrotasks)try{u.runOutsideAngular(()=>u.onStable.emit(null))}finally{u.isStable=!0}}}function fE(u){u.hasPendingMicrotasks=!!(u._hasPendingMicrotasks||(u.shouldCoalesceEventChangeDetection||u.shouldCoalesceRunChangeDetection)&&-1!==u.lastRequestAnimationFrameId)}function f0(u){u._nesting++,u.isStable&&(u.isStable=!1,u.onUnstable.emit(null))}function p0(u){u._nesting--,dE(u)}class aO{constructor(){this.hasPendingMicrotasks=!1,this.hasPendingMacrotasks=!1,this.isStable=!0,this.onUnstable=new Q_,this.onMicrotaskEmpty=new Q_,this.onStable=new Q_,this.onError=new Q_}run(d,g,A){return d.apply(g,A)}runGuarded(d,g,A){return d.apply(g,A)}runOutsideAngular(d){return d()}runTask(d,g,A,k){return d.apply(g,A)}}let IT=(()=>{class u{constructor(g){this._ngZone=g,this._pendingCount=0,this._isZoneStable=!0,this._didWork=!1,this._callbacks=[],this.taskTrackingZone=null,this._watchAngularEvents(),g.run(()=>{this.taskTrackingZone="undefined"==typeof Zone?null:Zone.current.get("TaskTrackingZone")})}_watchAngularEvents(){this._ngZone.onUnstable.subscribe({next:()=>{this._didWork=!0,this._isZoneStable=!1}}),this._ngZone.runOutsideAngular(()=>{this._ngZone.onStable.subscribe({next:()=>{p_.assertNotInAngularZone(),Zm(()=>{this._isZoneStable=!0,this._runCallbacksIfReady()})}})})}increasePendingRequestCount(){return this._pendingCount+=1,this._didWork=!0,this._pendingCount}decreasePendingRequestCount(){if(this._pendingCount-=1,this._pendingCount<0)throw new Error("pending async requests below zero");return this._runCallbacksIfReady(),this._pendingCount}isStable(){return this._isZoneStable&&0===this._pendingCount&&!this._ngZone.hasPendingMacrotasks}_runCallbacksIfReady(){if(this.isStable())Zm(()=>{for(;0!==this._callbacks.length;){let g=this._callbacks.pop();clearTimeout(g.timeoutId),g.doneCb(this._didWork)}this._didWork=!1});else{let g=this.getPendingTasks();this._callbacks=this._callbacks.filter(A=>!A.updateCb||!A.updateCb(g)||(clearTimeout(A.timeoutId),!1)),this._didWork=!0}}getPendingTasks(){return this.taskTrackingZone?this.taskTrackingZone.macroTasks.map(g=>({source:g.source,creationLocation:g.creationLocation,data:g.data})):[]}addCallback(g,A,k){let q=-1;A&&A>0&&(q=setTimeout(()=>{this._callbacks=this._callbacks.filter(pe=>pe.timeoutId!==q),g(this._didWork,this.getPendingTasks())},A)),this._callbacks.push({doneCb:g,timeoutId:q,updateCb:k})}whenStable(g,A,k){if(k&&!this.taskTrackingZone)throw new Error('Task tracking zone is required when passing an update callback to whenStable(). Is "zone.js/plugins/task-tracking" loaded?');this.addCallback(g,A,k),this._runCallbacksIfReady()}getPendingRequestCount(){return this._pendingCount}findProviders(g,A,k){return[]}}return u.\u0275fac=function(g){return new(g||u)(me(p_))},u.\u0275prov=Nt({token:u,factory:u.\u0275fac}),u})(),LT=(()=>{class u{constructor(){this._applications=new Map,pE.addToWindow(this)}registerApplication(g,A){this._applications.set(g,A)}unregisterApplication(g){this._applications.delete(g)}unregisterAllApplications(){this._applications.clear()}getTestability(g){return this._applications.get(g)||null}getAllTestabilities(){return Array.from(this._applications.values())}getAllRootElements(){return Array.from(this._applications.keys())}findTestabilityInTree(g,A=!0){return pE.findTestabilityInTree(this,g,A)}}return u.\u0275fac=function(g){return new(g||u)},u.\u0275prov=Nt({token:u,factory:u.\u0275fac,providedIn:"platform"}),u})();class lO{addToWindow(d){}findTestabilityInTree(d,g,A){return null}}function uO(u){pE=u}let pE=new lO,Fg=null;const h0=new Xa("AllowMultipleToken"),FT=new Xa("PlatformOnDestroy");class fO{constructor(d,g){this.name=d,this.token=g}}function kT(u,d,g=[]){const A=`Platform: ${d}`,k=new Xa(A);return(q=[])=>{let pe=Bv();if(!pe||pe.injector.get(h0,!1)){const Re=[...g,...q,{provide:k,useValue:!0}];u?u(Re):function pO(u){if(Fg&&!Fg.get(h0,!1))throw new ee(400,"");Fg=u;const d=u.get(_0),g=u.get(RT,null);g&&g.forEach(A=>A())}(function cm(u=[],d){return R_.create({name:d,providers:[{provide:_u,useValue:"platform"},{provide:FT,useValue:()=>Fg=null},...u]})}(Re,A))}return function $T(u){const d=Bv();if(!d)throw new ee(401,"");return d}()}}function Bv(){var u;return null!==(u=null==Fg?void 0:Fg.get(_0))&&void 0!==u?u:null}let _0=(()=>{class u{constructor(g){this._injector=g,this._modules=[],this._destroyListeners=[],this._destroyed=!1}bootstrapModuleFactory(g,A){const Re=function hO(u,d){let g;return g="noop"===u?new aO:("zone.js"===u?void 0:u)||new p_({enableLongStackTrace:!1,shouldCoalesceEventChangeDetection:!!(null==d?void 0:d.ngZoneEventCoalescing),shouldCoalesceRunChangeDetection:!!(null==d?void 0:d.ngZoneRunCoalescing)}),g}(A?A.ngZone:void 0,{ngZoneEventCoalescing:A&&A.ngZoneEventCoalescing||!1,ngZoneRunCoalescing:A&&A.ngZoneRunCoalescing||!1}),Ue=[{provide:p_,useValue:Re}];return Re.run(()=>{const Dt=R_.create({providers:Ue,parent:this.injector,name:g.moduleType.name}),Zt=g.create(Dt),Dn=Zt.injector.get(Tp,null);if(!Dn)throw new ee(402,"");return Re.runOutsideAngular(()=>{const br=Re.onError.subscribe({next:Jr=>{Dn.handleError(Jr)}});Zt.onDestroy(()=>{kg(this._modules,Zt),br.unsubscribe()})}),function _O(u,d,g){try{const A=g();return am(A)?A.catch(k=>{throw d.runOutsideAngular(()=>u.handleError(k)),k}):A}catch(A){throw d.runOutsideAngular(()=>u.handleError(A)),A}}(Dn,Re,()=>{const br=Zt.injector.get(uE);return br.runInitializers(),br.donePromise.then(()=>(function hM(u){(function Pt(u,d){null==u&&Vt(d,u,null,"!=")})(u,"Expected localeId to be defined"),"string"==typeof u&&(iS=u.toLowerCase().replace(/_/g,"-"))}(Zt.injector.get(cE,J1)||J1),this._moduleDoBootstrap(Zt),Zt))})})}bootstrapModule(g,A=[]){const k=HT({},A);return function cO(u,d,g){const A=new Zy(g);return Promise.resolve(A)}(0,0,g).then(q=>this.bootstrapModuleFactory(q,k))}_moduleDoBootstrap(g){const A=g.injector.get(g0);if(g._bootstrapComponents.length>0)g._bootstrapComponents.forEach(k=>A.bootstrap(k));else{if(!g.instance.ngDoBootstrap)throw new ee(403,"");g.instance.ngDoBootstrap(A)}this._modules.push(g)}onDestroy(g){this._destroyListeners.push(g)}get injector(){return this._injector}destroy(){if(this._destroyed)throw new ee(404,"");this._modules.slice().forEach(A=>A.destroy()),this._destroyListeners.forEach(A=>A());const g=this._injector.get(FT,null);null==g||g(),this._destroyed=!0}get destroyed(){return this._destroyed}}return u.\u0275fac=function(g){return new(g||u)(me(R_))},u.\u0275prov=Nt({token:u,factory:u.\u0275fac,providedIn:"platform"}),u})();function HT(u,d){return Array.isArray(d)?d.reduce(HT,u):Object.assign(Object.assign({},u),d)}let g0=(()=>{class u{constructor(g,A,k,q){this._zone=g,this._injector=A,this._exceptionHandler=k,this._initStatus=q,this._bootstrapListeners=[],this._views=[],this._runningTick=!1,this._stable=!0,this.componentTypes=[],this.components=[],this._onMicrotaskEmptySubscription=this._zone.onMicrotaskEmpty.subscribe({next:()=>{this._zone.run(()=>{this.tick()})}});const pe=new f.y(Ue=>{this._stable=this._zone.isStable&&!this._zone.hasPendingMacrotasks&&!this._zone.hasPendingMicrotasks,this._zone.runOutsideAngular(()=>{Ue.next(this._stable),Ue.complete()})}),Re=new f.y(Ue=>{let Dt;this._zone.runOutsideAngular(()=>{Dt=this._zone.onStable.subscribe(()=>{p_.assertNotInAngularZone(),Zm(()=>{!this._stable&&!this._zone.hasPendingMacrotasks&&!this._zone.hasPendingMicrotasks&&(this._stable=!0,Ue.next(!0))})})});const Zt=this._zone.onUnstable.subscribe(()=>{p_.assertInAngularZone(),this._stable&&(this._stable=!1,this._zone.runOutsideAngular(()=>{Ue.next(!1)}))});return()=>{Dt.unsubscribe(),Zt.unsubscribe()}});this.isStable=(0,c.T)(pe,Re.pipe((0,e.B)()))}bootstrap(g,A){if(!this._initStatus.done)throw new ee(405,"");let k;k=g instanceof wS?g:this._injector.get(e0).resolveComponentFactory(g),this.componentTypes.push(k.componentType);const q=function dO(u){return u.isBoundToModule}(k)?void 0:this._injector.get(Ym),Re=k.create(R_.NULL,[],A||k.selector,q),Ue=Re.location.nativeElement,Dt=Re.injector.get(IT,null),Zt=Dt&&Re.injector.get(LT);return Dt&&Zt&&Zt.registerApplication(Ue,Dt),Re.onDestroy(()=>{this.detachView(Re.hostView),kg(this.components,Re),Zt&&Zt.unregisterApplication(Ue)}),this._loadComponent(Re),Re}tick(){if(this._runningTick)throw new ee(101,"");try{this._runningTick=!0;for(let g of this._views)g.detectChanges()}catch(g){this._zone.runOutsideAngular(()=>this._exceptionHandler.handleError(g))}finally{this._runningTick=!1}}attachView(g){const A=g;this._views.push(A),A.attachToAppRef(this)}detachView(g){const A=g;kg(this._views,A),A.detachFromAppRef()}_loadComponent(g){this.attachView(g.hostView),this.tick(),this.components.push(g),this._injector.get(NT,[]).concat(this._bootstrapListeners).forEach(k=>k(g))}ngOnDestroy(){this._views.slice().forEach(g=>g.destroy()),this._onMicrotaskEmptySubscription.unsubscribe()}get viewCount(){return this._views.length}}return u.\u0275fac=function(g){return new(g||u)(me(p_),me(R_),me(Tp),me(uE))},u.\u0275prov=Nt({token:u,factory:u.\u0275fac,providedIn:"root"}),u})();function kg(u,d){const g=u.indexOf(d);g>-1&&u.splice(g,1)}let _E=!0,gE=!1;function UT(){return gE=!0,_E}function Wm(){if(gE)throw new Error("Cannot enable prod mode after platform setup.");_E=!1}let dm=(()=>{class u{}return u.__NG_ELEMENT_ID__=mE,u})();function mE(u){return function gO(u,d,g){if(fa(u)&&!g){const A=Ns(u.index,d);return new Nv(A,A)}return 47&u.type?new Nv(d[16],d):null}(ys(),Hi(),16==(16&u))}class SE{constructor(){}supports(d){return im(d)}create(d){return new WT(d)}}const ZT=(u,d)=>d;class WT{constructor(d){this.length=0,this._linkedRecords=null,this._unlinkedRecords=null,this._previousItHead=null,this._itHead=null,this._itTail=null,this._additionsHead=null,this._additionsTail=null,this._movesHead=null,this._movesTail=null,this._removalsHead=null,this._removalsTail=null,this._identityChangesHead=null,this._identityChangesTail=null,this._trackByFn=d||ZT}forEachItem(d){let g;for(g=this._itHead;null!==g;g=g._next)d(g)}forEachOperation(d){let g=this._itHead,A=this._removalsHead,k=0,q=null;for(;g||A;){const pe=!A||g&&g.currentIndex<QT(A,k,q)?g:A,Re=QT(pe,k,q),Ue=pe.currentIndex;if(pe===A)k--,A=A._nextRemoved;else if(g=g._next,null==pe.previousIndex)k++;else{q||(q=[]);const Dt=Re-k,Zt=Ue-k;if(Dt!=Zt){for(let br=0;br<Dt;br++){const Jr=br<q.length?q[br]:q[br]=0,Vi=Jr+br;Zt<=Vi&&Vi<Dt&&(q[br]=Jr+1)}q[pe.previousIndex]=Zt-Dt}}Re!==Ue&&d(pe,Re,Ue)}}forEachPreviousItem(d){let g;for(g=this._previousItHead;null!==g;g=g._nextPrevious)d(g)}forEachAddedItem(d){let g;for(g=this._additionsHead;null!==g;g=g._nextAdded)d(g)}forEachMovedItem(d){let g;for(g=this._movesHead;null!==g;g=g._nextMoved)d(g)}forEachRemovedItem(d){let g;for(g=this._removalsHead;null!==g;g=g._nextRemoved)d(g)}forEachIdentityChange(d){let g;for(g=this._identityChangesHead;null!==g;g=g._nextIdentityChange)d(g)}diff(d){if(null==d&&(d=[]),!im(d))throw new ee(900,"");return this.check(d)?this:null}onDestroy(){}check(d){this._reset();let k,q,pe,g=this._itHead,A=!1;if(Array.isArray(d)){this.length=d.length;for(let Re=0;Re<this.length;Re++)q=d[Re],pe=this._trackByFn(Re,q),null!==g&&Object.is(g.trackById,pe)?(A&&(g=this._verifyReinsertion(g,q,pe,Re)),Object.is(g.item,q)||this._addIdentityChange(g,q)):(g=this._mismatch(g,q,pe,Re),A=!0),g=g._next}else k=0,function M1(u,d){if(Array.isArray(u))for(let g=0;g<u.length;g++)d(u[g]);else{const g=u[Fh()]();let A;for(;!(A=g.next()).done;)d(A.value)}}(d,Re=>{pe=this._trackByFn(k,Re),null!==g&&Object.is(g.trackById,pe)?(A&&(g=this._verifyReinsertion(g,Re,pe,k)),Object.is(g.item,Re)||this._addIdentityChange(g,Re)):(g=this._mismatch(g,Re,pe,k),A=!0),g=g._next,k++}),this.length=k;return this._truncate(g),this.collection=d,this.isDirty}get isDirty(){return null!==this._additionsHead||null!==this._movesHead||null!==this._removalsHead||null!==this._identityChangesHead}_reset(){if(this.isDirty){let d;for(d=this._previousItHead=this._itHead;null!==d;d=d._next)d._nextPrevious=d._next;for(d=this._additionsHead;null!==d;d=d._nextAdded)d.previousIndex=d.currentIndex;for(this._additionsHead=this._additionsTail=null,d=this._movesHead;null!==d;d=d._nextMoved)d.previousIndex=d.currentIndex;this._movesHead=this._movesTail=null,this._removalsHead=this._removalsTail=null,this._identityChangesHead=this._identityChangesTail=null}}_mismatch(d,g,A,k){let q;return null===d?q=this._itTail:(q=d._prev,this._remove(d)),null!==(d=null===this._unlinkedRecords?null:this._unlinkedRecords.get(A,null))?(Object.is(d.item,g)||this._addIdentityChange(d,g),this._reinsertAfter(d,q,k)):null!==(d=null===this._linkedRecords?null:this._linkedRecords.get(A,k))?(Object.is(d.item,g)||this._addIdentityChange(d,g),this._moveAfter(d,q,k)):d=this._addAfter(new bO(g,A),q,k),d}_verifyReinsertion(d,g,A,k){let q=null===this._unlinkedRecords?null:this._unlinkedRecords.get(A,null);return null!==q?d=this._reinsertAfter(q,d._prev,k):d.currentIndex!=k&&(d.currentIndex=k,this._addToMoves(d,k)),d}_truncate(d){for(;null!==d;){const g=d._next;this._addToRemovals(this._unlink(d)),d=g}null!==this._unlinkedRecords&&this._unlinkedRecords.clear(),null!==this._additionsTail&&(this._additionsTail._nextAdded=null),null!==this._movesTail&&(this._movesTail._nextMoved=null),null!==this._itTail&&(this._itTail._next=null),null!==this._removalsTail&&(this._removalsTail._nextRemoved=null),null!==this._identityChangesTail&&(this._identityChangesTail._nextIdentityChange=null)}_reinsertAfter(d,g,A){null!==this._unlinkedRecords&&this._unlinkedRecords.remove(d);const k=d._prevRemoved,q=d._nextRemoved;return null===k?this._removalsHead=q:k._nextRemoved=q,null===q?this._removalsTail=k:q._prevRemoved=k,this._insertAfter(d,g,A),this._addToMoves(d,A),d}_moveAfter(d,g,A){return this._unlink(d),this._insertAfter(d,g,A),this._addToMoves(d,A),d}_addAfter(d,g,A){return this._insertAfter(d,g,A),this._additionsTail=null===this._additionsTail?this._additionsHead=d:this._additionsTail._nextAdded=d,d}_insertAfter(d,g,A){const k=null===g?this._itHead:g._next;return d._next=k,d._prev=g,null===k?this._itTail=d:k._prev=d,null===g?this._itHead=d:g._next=d,null===this._linkedRecords&&(this._linkedRecords=new JT),this._linkedRecords.put(d),d.currentIndex=A,d}_remove(d){return this._addToRemovals(this._unlink(d))}_unlink(d){null!==this._linkedRecords&&this._linkedRecords.remove(d);const g=d._prev,A=d._next;return null===g?this._itHead=A:g._next=A,null===A?this._itTail=g:A._prev=g,d}_addToMoves(d,g){return d.previousIndex===g||(this._movesTail=null===this._movesTail?this._movesHead=d:this._movesTail._nextMoved=d),d}_addToRemovals(d){return null===this._unlinkedRecords&&(this._unlinkedRecords=new JT),this._unlinkedRecords.put(d),d.currentIndex=null,d._nextRemoved=null,null===this._removalsTail?(this._removalsTail=this._removalsHead=d,d._prevRemoved=null):(d._prevRemoved=this._removalsTail,this._removalsTail=this._removalsTail._nextRemoved=d),d}_addIdentityChange(d,g){return d.item=g,this._identityChangesTail=null===this._identityChangesTail?this._identityChangesHead=d:this._identityChangesTail._nextIdentityChange=d,d}}class bO{constructor(d,g){this.item=d,this.trackById=g,this.currentIndex=null,this.previousIndex=null,this._nextPrevious=null,this._prev=null,this._next=null,this._prevDup=null,this._nextDup=null,this._prevRemoved=null,this._nextRemoved=null,this._nextAdded=null,this._nextMoved=null,this._nextIdentityChange=null}}class SO{constructor(){this._head=null,this._tail=null}add(d){null===this._head?(this._head=this._tail=d,d._nextDup=null,d._prevDup=null):(this._tail._nextDup=d,d._prevDup=this._tail,d._nextDup=null,this._tail=d)}get(d,g){let A;for(A=this._head;null!==A;A=A._nextDup)if((null===g||g<=A.currentIndex)&&Object.is(A.trackById,d))return A;return null}remove(d){const g=d._prevDup,A=d._nextDup;return null===g?this._head=A:g._nextDup=A,null===A?this._tail=g:A._prevDup=g,null===this._head}}class JT{constructor(){this.map=new Map}put(d){const g=d.trackById;let A=this.map.get(g);A||(A=new SO,this.map.set(g,A)),A.add(d)}get(d,g){const k=this.map.get(d);return k?k.get(d,g):null}remove(d){const g=d.trackById;return this.map.get(g).remove(d)&&this.map.delete(g),d}get isEmpty(){return 0===this.map.size}clear(){this.map.clear()}}function QT(u,d,g){const A=u.previousIndex;if(null===A)return A;let k=0;return g&&A<g.length&&(k=g[A]),A+d+k}class TE{constructor(){}supports(d){return d instanceof Map||_v(d)}create(){return new TO}}class TO{constructor(){this._records=new Map,this._mapHead=null,this._appendAfter=null,this._previousMapHead=null,this._changesHead=null,this._changesTail=null,this._additionsHead=null,this._additionsTail=null,this._removalsHead=null,this._removalsTail=null}get isDirty(){return null!==this._additionsHead||null!==this._changesHead||null!==this._removalsHead}forEachItem(d){let g;for(g=this._mapHead;null!==g;g=g._next)d(g)}forEachPreviousItem(d){let g;for(g=this._previousMapHead;null!==g;g=g._nextPrevious)d(g)}forEachChangedItem(d){let g;for(g=this._changesHead;null!==g;g=g._nextChanged)d(g)}forEachAddedItem(d){let g;for(g=this._additionsHead;null!==g;g=g._nextAdded)d(g)}forEachRemovedItem(d){let g;for(g=this._removalsHead;null!==g;g=g._nextRemoved)d(g)}diff(d){if(d){if(!(d instanceof Map||_v(d)))throw new ee(900,"")}else d=new Map;return this.check(d)?this:null}onDestroy(){}check(d){this._reset();let g=this._mapHead;if(this._appendAfter=null,this._forEach(d,(A,k)=>{if(g&&g.key===k)this._maybeAddToChanges(g,A),this._appendAfter=g,g=g._next;else{const q=this._getOrCreateRecordForKey(k,A);g=this._insertBeforeOrAppend(g,q)}}),g){g._prev&&(g._prev._next=null),this._removalsHead=g;for(let A=g;null!==A;A=A._nextRemoved)A===this._mapHead&&(this._mapHead=null),this._records.delete(A.key),A._nextRemoved=A._next,A.previousValue=A.currentValue,A.currentValue=null,A._prev=null,A._next=null}return this._changesTail&&(this._changesTail._nextChanged=null),this._additionsTail&&(this._additionsTail._nextAdded=null),this.isDirty}_insertBeforeOrAppend(d,g){if(d){const A=d._prev;return g._next=d,g._prev=A,d._prev=g,A&&(A._next=g),d===this._mapHead&&(this._mapHead=g),this._appendAfter=d,d}return this._appendAfter?(this._appendAfter._next=g,g._prev=this._appendAfter):this._mapHead=g,this._appendAfter=g,null}_getOrCreateRecordForKey(d,g){if(this._records.has(d)){const k=this._records.get(d);this._maybeAddToChanges(k,g);const q=k._prev,pe=k._next;return q&&(q._next=pe),pe&&(pe._prev=q),k._next=null,k._prev=null,k}const A=new CO(d);return this._records.set(d,A),A.currentValue=g,this._addToAdditions(A),A}_reset(){if(this.isDirty){let d;for(this._previousMapHead=this._mapHead,d=this._previousMapHead;null!==d;d=d._next)d._nextPrevious=d._next;for(d=this._changesHead;null!==d;d=d._nextChanged)d.previousValue=d.currentValue;for(d=this._additionsHead;null!=d;d=d._nextAdded)d.previousValue=d.currentValue;this._changesHead=this._changesTail=null,this._additionsHead=this._additionsTail=null,this._removalsHead=null}}_maybeAddToChanges(d,g){Object.is(g,d.currentValue)||(d.previousValue=d.currentValue,d.currentValue=g,this._addToChanges(d))}_addToAdditions(d){null===this._additionsHead?this._additionsHead=this._additionsTail=d:(this._additionsTail._nextAdded=d,this._additionsTail=d)}_addToChanges(d){null===this._changesHead?this._changesHead=this._changesTail=d:(this._changesTail._nextChanged=d,this._changesTail=d)}_forEach(d,g){d instanceof Map?d.forEach(g):Object.keys(d).forEach(A=>g(d[A],A))}}class CO{constructor(d){this.key=d,this.previousValue=null,this.currentValue=null,this._nextPrevious=null,this._next=null,this._prev=null,this._nextAdded=null,this._nextRemoved=null,this._nextChanged=null}}function KT(){return new CE([new SE])}let CE=(()=>{class u{constructor(g){this.factories=g}static create(g,A){if(null!=A){const k=A.factories.slice();g=g.concat(k)}return new u(g)}static extend(g){return{provide:u,useFactory:A=>u.create(g,A||KT()),deps:[[u,new $i,new ar]]}}find(g){const A=this.factories.find(k=>k.supports(g));if(null!=A)return A;throw new ee(901,"")}}return u.\u0275prov=Nt({token:u,providedIn:"root",factory:KT}),u})();function ME(){return new OE([new TE])}let OE=(()=>{class u{constructor(g){this.factories=g}static create(g,A){if(A){const k=A.factories.slice();g=g.concat(k)}return new u(g)}static extend(g){return{provide:u,useFactory:A=>u.create(g,A||ME()),deps:[[u,new $i,new ar]]}}find(g){const A=this.factories.find(q=>q.supports(g));if(A)return A;throw new ee(901,"")}}return u.\u0275prov=Nt({token:u,providedIn:"root",factory:ME}),u})();const OO=kT(null,"core",[]);let AO=(()=>{class u{constructor(g){}}return u.\u0275fac=function(g){return new(g||u)(me(g0))},u.\u0275mod=_t({type:u}),u.\u0275inj=Yt({}),u})()},1659:(m,S,i)=>{"use strict";i.d(S,{CE:()=>tt,Cf:()=>ie,EJ:()=>bi,F:()=>xn,Fd:()=>Pl,Fj:()=>J,JJ:()=>dr,JL:()=>Qr,JU:()=>T,Kr:()=>ol,NI:()=>vr,Oe:()=>or,On:()=>fa,Q7:()=>Wa,TO:()=>er,UX:()=>Io,Wl:()=>R,YN:()=>Ii,_:()=>Za,_Y:()=>la,a5:()=>ur,cw:()=>yr,gN:()=>$r,kI:()=>ge,qQ:()=>Qa,qu:()=>sl,sg:()=>ps,u:()=>Le,u5:()=>Ns,wV:()=>fl,x0:()=>Nr});var r=i(89724),a=i(11048),f=i(76666),c=i(35758),e=i(88002);let p=(()=>{class lt{constructor(ke,Ut){this._renderer=ke,this._elementRef=Ut,this.onChange=pi=>{},this.onTouched=()=>{}}setProperty(ke,Ut){this._renderer.setProperty(this._elementRef.nativeElement,ke,Ut)}registerOnTouched(ke){this.onTouched=ke}registerOnChange(ke){this.onChange=ke}setDisabledState(ke){this.setProperty("disabled",ke)}}return lt.\u0275fac=function(ke){return new(ke||lt)(r.Y36(r.Qsj),r.Y36(r.SBq))},lt.\u0275dir=r.lG2({type:lt}),lt})(),y=(()=>{class lt extends p{}return lt.\u0275fac=function(){let Xe;return function(Ut){return(Xe||(Xe=r.n5z(lt)))(Ut||lt)}}(),lt.\u0275dir=r.lG2({type:lt,features:[r.qOj]}),lt})();const T=new r.OlP("NgValueAccessor"),C={provide:T,useExisting:(0,r.Gpc)(()=>R),multi:!0};let R=(()=>{class lt extends y{writeValue(ke){this.setProperty("checked",ke)}}return lt.\u0275fac=function(){let Xe;return function(Ut){return(Xe||(Xe=r.n5z(lt)))(Ut||lt)}}(),lt.\u0275dir=r.lG2({type:lt,selectors:[["input","type","checkbox","formControlName",""],["input","type","checkbox","formControl",""],["input","type","checkbox","ngModel",""]],hostBindings:function(ke,Ut){1&ke&&r.NdJ("change",function(Wo){return Ut.onChange(Wo.target.checked)})("blur",function(){return Ut.onTouched()})},features:[r._Bn([C]),r.qOj]}),lt})();const L={provide:T,useExisting:(0,r.Gpc)(()=>J),multi:!0},W=new r.OlP("CompositionEventMode");let J=(()=>{class lt extends p{constructor(ke,Ut,pi){super(ke,Ut),this._compositionMode=pi,this._composing=!1,null==this._compositionMode&&(this._compositionMode=!function z(){const lt=(0,a.q)()?(0,a.q)().getUserAgent():"";return/android (\d+)/.test(lt.toLowerCase())}())}writeValue(ke){this.setProperty("value",null==ke?"":ke)}_handleInput(ke){(!this._compositionMode||this._compositionMode&&!this._composing)&&this.onChange(ke)}_compositionStart(){this._composing=!0}_compositionEnd(ke){this._composing=!1,this._compositionMode&&this.onChange(ke)}}return lt.\u0275fac=function(ke){return new(ke||lt)(r.Y36(r.Qsj),r.Y36(r.SBq),r.Y36(W,8))},lt.\u0275dir=r.lG2({type:lt,selectors:[["input","formControlName","",3,"type","checkbox"],["textarea","formControlName",""],["input","formControl","",3,"type","checkbox"],["textarea","formControl",""],["input","ngModel","",3,"type","checkbox"],["textarea","ngModel",""],["","ngDefaultControl",""]],hostBindings:function(ke,Ut){1&ke&&r.NdJ("input",function(Wo){return Ut._handleInput(Wo.target.value)})("blur",function(){return Ut.onTouched()})("compositionstart",function(){return Ut._compositionStart()})("compositionend",function(Wo){return Ut._compositionEnd(Wo.target.value)})},features:[r._Bn([L]),r.qOj]}),lt})();function ee(lt){return null==lt||0===lt.length}function ce(lt){return null!=lt&&"number"==typeof lt.length}const ie=new r.OlP("NgValidators"),U=new r.OlP("NgAsyncValidators"),se=/^(?=.{1,254}$)(?=.{1,64}@)[a-zA-Z0-9!#$%&'*+/=?^_`{|}~-]+(?:\.[a-zA-Z0-9!#$%&'*+/=?^_`{|}~-]+)*@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*$/;class ge{static min(Xe){return ae(Xe)}static max(Xe){return he(Xe)}static required(Xe){return be(Xe)}static requiredTrue(Xe){return function we(lt){return!0===lt.value?null:{required:!0}}(Xe)}static email(Xe){return function ue(lt){return ee(lt.value)||se.test(lt.value)?null:{email:!0}}(Xe)}static minLength(Xe){return function st(lt){return Xe=>ee(Xe.value)||!ce(Xe.value)?null:Xe.value.length<lt?{minlength:{requiredLength:lt,actualLength:Xe.value.length}}:null}(Xe)}static maxLength(Xe){return function We(lt){return Xe=>ce(Xe.value)&&Xe.value.length>lt?{maxlength:{requiredLength:lt,actualLength:Xe.value.length}}:null}(Xe)}static pattern(Xe){return function Ve(lt){if(!lt)return Be;let Xe,ke;return"string"==typeof lt?(ke="","^"!==lt.charAt(0)&&(ke+="^"),ke+=lt,"$"!==lt.charAt(lt.length-1)&&(ke+="$"),Xe=new RegExp(ke)):(ke=lt.toString(),Xe=lt),Ut=>{if(ee(Ut.value))return null;const pi=Ut.value;return Xe.test(pi)?null:{pattern:{requiredPattern:ke,actualValue:pi}}}}(Xe)}static nullValidator(Xe){return null}static compose(Xe){return Pt(Xe)}static composeAsync(Xe){return hn(Xe)}}function ae(lt){return Xe=>{if(ee(Xe.value)||ee(lt))return null;const ke=parseFloat(Xe.value);return!isNaN(ke)&&ke<lt?{min:{min:lt,actual:Xe.value}}:null}}function he(lt){return Xe=>{if(ee(Xe.value)||ee(lt))return null;const ke=parseFloat(Xe.value);return!isNaN(ke)&&ke>lt?{max:{max:lt,actual:Xe.value}}:null}}function be(lt){return ee(lt.value)?{required:!0}:null}function Be(lt){return null}function xe(lt){return null!=lt}function je(lt){const Xe=(0,r.QGY)(lt)?(0,f.D)(lt):lt;return(0,r.CqO)(Xe),Xe}function Ne(lt){let Xe={};return lt.forEach(ke=>{Xe=null!=ke?Object.assign(Object.assign({},Xe),ke):Xe}),0===Object.keys(Xe).length?null:Xe}function Bt(lt,Xe){return Xe.map(ke=>ke(lt))}function en(lt){return lt.map(Xe=>function rt(lt){return!lt.validate}(Xe)?Xe:ke=>Xe.validate(ke))}function Pt(lt){if(!lt)return null;const Xe=lt.filter(xe);return 0==Xe.length?null:function(ke){return Ne(Bt(ke,Xe))}}function Vt(lt){return null!=lt?Pt(en(lt)):null}function hn(lt){if(!lt)return null;const Xe=lt.filter(xe);return 0==Xe.length?null:function(ke){const Ut=Bt(ke,Xe).map(je);return(0,c.D)(Ut).pipe((0,e.U)(Ne))}}function vn(lt){return null!=lt?hn(en(lt)):null}function mt(lt,Xe){return null===lt?[Xe]:Array.isArray(lt)?[...lt,Xe]:[lt,Xe]}function Nt(lt){return lt._rawValidators}function St(lt){return lt._rawAsyncValidators}function Yt(lt){return lt?Array.isArray(lt)?lt:[lt]:[]}function Fn(lt,Xe){return Array.isArray(lt)?lt.includes(Xe):lt===Xe}function pr(lt,Xe){const ke=Yt(Xe);return Yt(lt).forEach(pi=>{Fn(ke,pi)||ke.push(pi)}),ke}function Ei(lt,Xe){return Yt(Xe).filter(ke=>!Fn(lt,ke))}class mi{constructor(){this._rawValidators=[],this._rawAsyncValidators=[],this._onDestroyCallbacks=[]}get value(){return this.control?this.control.value:null}get valid(){return this.control?this.control.valid:null}get invalid(){return this.control?this.control.invalid:null}get pending(){return this.control?this.control.pending:null}get disabled(){return this.control?this.control.disabled:null}get enabled(){return this.control?this.control.enabled:null}get errors(){return this.control?this.control.errors:null}get pristine(){return this.control?this.control.pristine:null}get dirty(){return this.control?this.control.dirty:null}get touched(){return this.control?this.control.touched:null}get status(){return this.control?this.control.status:null}get untouched(){return this.control?this.control.untouched:null}get statusChanges(){return this.control?this.control.statusChanges:null}get valueChanges(){return this.control?this.control.valueChanges:null}get path(){return null}_setValidators(Xe){this._rawValidators=Xe||[],this._composedValidatorFn=Vt(this._rawValidators)}_setAsyncValidators(Xe){this._rawAsyncValidators=Xe||[],this._composedAsyncValidatorFn=vn(this._rawAsyncValidators)}get validator(){return this._composedValidatorFn||null}get asyncValidator(){return this._composedAsyncValidatorFn||null}_registerOnDestroy(Xe){this._onDestroyCallbacks.push(Xe)}_invokeOnDestroyCallbacks(){this._onDestroyCallbacks.forEach(Xe=>Xe()),this._onDestroyCallbacks=[]}reset(Xe){this.control&&this.control.reset(Xe)}hasError(Xe,ke){return!!this.control&&this.control.hasError(Xe,ke)}getError(Xe,ke){return this.control?this.control.getError(Xe,ke):null}}class ur extends mi{constructor(){super(...arguments),this._parent=null,this.name=null,this.valueAccessor=null}}class $r extends mi{get formDirective(){return null}get path(){return null}}class Br{constructor(Xe){this._cd=Xe}is(Xe){var ke,Ut,pi;return"submitted"===Xe?!!(null===(ke=this._cd)||void 0===ke?void 0:ke.submitted):!!(null===(pi=null===(Ut=this._cd)||void 0===Ut?void 0:Ut.control)||void 0===pi?void 0:pi[Xe])}}let dr=(()=>{class lt extends Br{constructor(ke){super(ke)}}return lt.\u0275fac=function(ke){return new(ke||lt)(r.Y36(ur,2))},lt.\u0275dir=r.lG2({type:lt,selectors:[["","formControlName",""],["","ngModel",""],["","formControl",""]],hostVars:14,hostBindings:function(ke,Ut){2&ke&&r.ekj("ng-untouched",Ut.is("untouched"))("ng-touched",Ut.is("touched"))("ng-pristine",Ut.is("pristine"))("ng-dirty",Ut.is("dirty"))("ng-valid",Ut.is("valid"))("ng-invalid",Ut.is("invalid"))("ng-pending",Ut.is("pending"))},features:[r.qOj]}),lt})(),Qr=(()=>{class lt extends Br{constructor(ke){super(ke)}}return lt.\u0275fac=function(ke){return new(ke||lt)(r.Y36($r,10))},lt.\u0275dir=r.lG2({type:lt,selectors:[["","formGroupName",""],["","formArrayName",""],["","ngModelGroup",""],["","formGroup",""],["form",3,"ngNoForm",""],["","ngForm",""]],hostVars:16,hostBindings:function(ke,Ut){2&ke&&r.ekj("ng-untouched",Ut.is("untouched"))("ng-touched",Ut.is("touched"))("ng-pristine",Ut.is("pristine"))("ng-dirty",Ut.is("dirty"))("ng-valid",Ut.is("valid"))("ng-invalid",Ut.is("invalid"))("ng-pending",Ut.is("pending"))("ng-submitted",Ut.is("submitted"))},features:[r.qOj]}),lt})();function Mn(lt,Xe){return[...Xe.path,lt]}function Zn(lt,Xe){ri(lt,Xe),Xe.valueAccessor.writeValue(lt.value),function Ui(lt,Xe){Xe.valueAccessor.registerOnChange(ke=>{lt._pendingValue=ke,lt._pendingChange=!0,lt._pendingDirty=!0,"change"===lt.updateOn&&dt(lt,Xe)})}(lt,Xe),function Bi(lt,Xe){const ke=(Ut,pi)=>{Xe.valueAccessor.writeValue(Ut),pi&&Xe.viewToModelUpdate(Ut)};lt.registerOnChange(ke),Xe._registerOnDestroy(()=>{lt._unregisterOnChange(ke)})}(lt,Xe),function ao(lt,Xe){Xe.valueAccessor.registerOnTouched(()=>{lt._pendingTouched=!0,"blur"===lt.updateOn&&lt._pendingChange&&dt(lt,Xe),"submit"!==lt.updateOn&&lt.markAsTouched()})}(lt,Xe),function Or(lt,Xe){if(Xe.valueAccessor.setDisabledState){const ke=Ut=>{Xe.valueAccessor.setDisabledState(Ut)};lt.registerOnDisabledChange(ke),Xe._registerOnDestroy(()=>{lt._unregisterOnDisabledChange(ke)})}}(lt,Xe)}function cn(lt,Xe,ke=!0){const Ut=()=>{};Xe.valueAccessor&&(Xe.valueAccessor.registerOnChange(Ut),Xe.valueAccessor.registerOnTouched(Ut)),vi(lt,Xe),lt&&(Xe._invokeOnDestroyCallbacks(),lt._registerOnCollectionChange(()=>{}))}function Sn(lt,Xe){lt.forEach(ke=>{ke.registerOnValidatorChange&&ke.registerOnValidatorChange(Xe)})}function ri(lt,Xe){const ke=Nt(lt);null!==Xe.validator?lt.setValidators(mt(ke,Xe.validator)):"function"==typeof ke&&lt.setValidators([ke]);const Ut=St(lt);null!==Xe.asyncValidator?lt.setAsyncValidators(mt(Ut,Xe.asyncValidator)):"function"==typeof Ut&&lt.setAsyncValidators([Ut]);const pi=()=>lt.updateValueAndValidity();Sn(Xe._rawValidators,pi),Sn(Xe._rawAsyncValidators,pi)}function vi(lt,Xe){let ke=!1;if(null!==lt){if(null!==Xe.validator){const pi=Nt(lt);if(Array.isArray(pi)&&pi.length>0){const Wo=pi.filter(Ya=>Ya!==Xe.validator);Wo.length!==pi.length&&(ke=!0,lt.setValidators(Wo))}}if(null!==Xe.asyncValidator){const pi=St(lt);if(Array.isArray(pi)&&pi.length>0){const Wo=pi.filter(Ya=>Ya!==Xe.asyncValidator);Wo.length!==pi.length&&(ke=!0,lt.setAsyncValidators(Wo))}}}const Ut=()=>{};return Sn(Xe._rawValidators,Ut),Sn(Xe._rawAsyncValidators,Ut),ke}function dt(lt,Xe){lt._pendingDirty&&lt.markAsDirty(),lt.setValue(lt._pendingValue,{emitModelToViewChange:!1}),Xe.viewToModelUpdate(lt._pendingValue),lt._pendingChange=!1}function to(lt,Xe){ri(lt,Xe)}function pt(lt,Xe){if(!lt.hasOwnProperty("model"))return!1;const ke=lt.model;return!!ke.isFirstChange()||!Object.is(Xe,ke.currentValue)}function dn(lt,Xe){lt._syncPendingControls(),Xe.forEach(ke=>{const Ut=ke.control;"submit"===Ut.updateOn&&Ut._pendingChange&&(ke.viewToModelUpdate(Ut._pendingValue),Ut._pendingChange=!1)})}function mr(lt,Xe){if(!Xe)return null;let ke,Ut,pi;return Array.isArray(Xe),Xe.forEach(Wo=>{Wo.constructor===J?ke=Wo:function kt(lt){return Object.getPrototypeOf(lt.constructor)===y}(Wo)?Ut=Wo:pi=Wo}),pi||Ut||ke||null}function Oi(lt,Xe){const ke=lt.indexOf(Xe);ke>-1&&lt.splice(ke,1)}const Qo="VALID",lo="INVALID",Ai="PENDING",Fo="DISABLED";function qn(lt){return(Fr(lt)?lt.validators:lt)||null}function ei(lt){return Array.isArray(lt)?Vt(lt):lt||null}function wn(lt,Xe){return(Fr(Xe)?Xe.asyncValidators:lt)||null}function Qn(lt){return Array.isArray(lt)?vn(lt):lt||null}function Fr(lt){return null!=lt&&!Array.isArray(lt)&&"object"==typeof lt}const oo=lt=>lt instanceof vr,Li=lt=>lt instanceof yr,yo=lt=>lt instanceof or;function go(lt){return oo(lt)?lt.value:lt.getRawValue()}function Go(lt,Xe){const ke=Li(lt),Ut=lt.controls;if(!(ke?Object.keys(Ut):Ut).length)throw new r.vHH(1e3,"");if(!Ut[Xe])throw new r.vHH(1001,"")}function ua(lt,Xe){Li(lt),lt._forEachChild((Ut,pi)=>{if(void 0===Xe[pi])throw new r.vHH(1002,"")})}class er{constructor(Xe,ke){this._pendingDirty=!1,this._hasOwnPendingAsyncValidator=!1,this._pendingTouched=!1,this._onCollectionChange=()=>{},this._parent=null,this.pristine=!0,this.touched=!1,this._onDisabledChange=[],this._rawValidators=Xe,this._rawAsyncValidators=ke,this._composedValidatorFn=ei(this._rawValidators),this._composedAsyncValidatorFn=Qn(this._rawAsyncValidators)}get validator(){return this._composedValidatorFn}set validator(Xe){this._rawValidators=this._composedValidatorFn=Xe}get asyncValidator(){return this._composedAsyncValidatorFn}set asyncValidator(Xe){this._rawAsyncValidators=this._composedAsyncValidatorFn=Xe}get parent(){return this._parent}get valid(){return this.status===Qo}get invalid(){return this.status===lo}get pending(){return this.status==Ai}get disabled(){return this.status===Fo}get enabled(){return this.status!==Fo}get dirty(){return!this.pristine}get untouched(){return!this.touched}get updateOn(){return this._updateOn?this._updateOn:this.parent?this.parent.updateOn:"change"}setValidators(Xe){this._rawValidators=Xe,this._composedValidatorFn=ei(Xe)}setAsyncValidators(Xe){this._rawAsyncValidators=Xe,this._composedAsyncValidatorFn=Qn(Xe)}addValidators(Xe){this.setValidators(pr(Xe,this._rawValidators))}addAsyncValidators(Xe){this.setAsyncValidators(pr(Xe,this._rawAsyncValidators))}removeValidators(Xe){this.setValidators(Ei(Xe,this._rawValidators))}removeAsyncValidators(Xe){this.setAsyncValidators(Ei(Xe,this._rawAsyncValidators))}hasValidator(Xe){return Fn(this._rawValidators,Xe)}hasAsyncValidator(Xe){return Fn(this._rawAsyncValidators,Xe)}clearValidators(){this.validator=null}clearAsyncValidators(){this.asyncValidator=null}markAsTouched(Xe={}){this.touched=!0,this._parent&&!Xe.onlySelf&&this._parent.markAsTouched(Xe)}markAllAsTouched(){this.markAsTouched({onlySelf:!0}),this._forEachChild(Xe=>Xe.markAllAsTouched())}markAsUntouched(Xe={}){this.touched=!1,this._pendingTouched=!1,this._forEachChild(ke=>{ke.markAsUntouched({onlySelf:!0})}),this._parent&&!Xe.onlySelf&&this._parent._updateTouched(Xe)}markAsDirty(Xe={}){this.pristine=!1,this._parent&&!Xe.onlySelf&&this._parent.markAsDirty(Xe)}markAsPristine(Xe={}){this.pristine=!0,this._pendingDirty=!1,this._forEachChild(ke=>{ke.markAsPristine({onlySelf:!0})}),this._parent&&!Xe.onlySelf&&this._parent._updatePristine(Xe)}markAsPending(Xe={}){this.status=Ai,!1!==Xe.emitEvent&&this.statusChanges.emit(this.status),this._parent&&!Xe.onlySelf&&this._parent.markAsPending(Xe)}disable(Xe={}){const ke=this._parentMarkedDirty(Xe.onlySelf);this.status=Fo,this.errors=null,this._forEachChild(Ut=>{Ut.disable(Object.assign(Object.assign({},Xe),{onlySelf:!0}))}),this._updateValue(),!1!==Xe.emitEvent&&(this.valueChanges.emit(this.value),this.statusChanges.emit(this.status)),this._updateAncestors(Object.assign(Object.assign({},Xe),{skipPristineCheck:ke})),this._onDisabledChange.forEach(Ut=>Ut(!0))}enable(Xe={}){const ke=this._parentMarkedDirty(Xe.onlySelf);this.status=Qo,this._forEachChild(Ut=>{Ut.enable(Object.assign(Object.assign({},Xe),{onlySelf:!0}))}),this.updateValueAndValidity({onlySelf:!0,emitEvent:Xe.emitEvent}),this._updateAncestors(Object.assign(Object.assign({},Xe),{skipPristineCheck:ke})),this._onDisabledChange.forEach(Ut=>Ut(!1))}_updateAncestors(Xe){this._parent&&!Xe.onlySelf&&(this._parent.updateValueAndValidity(Xe),Xe.skipPristineCheck||this._parent._updatePristine(),this._parent._updateTouched())}setParent(Xe){this._parent=Xe}updateValueAndValidity(Xe={}){this._setInitialStatus(),this._updateValue(),this.enabled&&(this._cancelExistingSubscription(),this.errors=this._runValidator(),this.status=this._calculateStatus(),(this.status===Qo||this.status===Ai)&&this._runAsyncValidator(Xe.emitEvent)),!1!==Xe.emitEvent&&(this.valueChanges.emit(this.value),this.statusChanges.emit(this.status)),this._parent&&!Xe.onlySelf&&this._parent.updateValueAndValidity(Xe)}_updateTreeValidity(Xe={emitEvent:!0}){this._forEachChild(ke=>ke._updateTreeValidity(Xe)),this.updateValueAndValidity({onlySelf:!0,emitEvent:Xe.emitEvent})}_setInitialStatus(){this.status=this._allControlsDisabled()?Fo:Qo}_runValidator(){return this.validator?this.validator(this):null}_runAsyncValidator(Xe){if(this.asyncValidator){this.status=Ai,this._hasOwnPendingAsyncValidator=!0;const ke=je(this.asyncValidator(this));this._asyncValidationSubscription=ke.subscribe(Ut=>{this._hasOwnPendingAsyncValidator=!1,this.setErrors(Ut,{emitEvent:Xe})})}}_cancelExistingSubscription(){this._asyncValidationSubscription&&(this._asyncValidationSubscription.unsubscribe(),this._hasOwnPendingAsyncValidator=!1)}setErrors(Xe,ke={}){this.errors=Xe,this._updateControlsErrors(!1!==ke.emitEvent)}get(Xe){return function Ko(lt,Xe,ke){if(null==Xe||(Array.isArray(Xe)||(Xe=Xe.split(ke)),Array.isArray(Xe)&&0===Xe.length))return null;let Ut=lt;return Xe.forEach(pi=>{Ut=Li(Ut)?Ut.controls.hasOwnProperty(pi)?Ut.controls[pi]:null:yo(Ut)&&Ut.at(pi)||null}),Ut}(this,Xe,".")}getError(Xe,ke){const Ut=ke?this.get(ke):this;return Ut&&Ut.errors?Ut.errors[Xe]:null}hasError(Xe,ke){return!!this.getError(Xe,ke)}get root(){let Xe=this;for(;Xe._parent;)Xe=Xe._parent;return Xe}_updateControlsErrors(Xe){this.status=this._calculateStatus(),Xe&&this.statusChanges.emit(this.status),this._parent&&this._parent._updateControlsErrors(Xe)}_initObservables(){this.valueChanges=new r.vpe,this.statusChanges=new r.vpe}_calculateStatus(){return this._allControlsDisabled()?Fo:this.errors?lo:this._hasOwnPendingAsyncValidator||this._anyControlsHaveStatus(Ai)?Ai:this._anyControlsHaveStatus(lo)?lo:Qo}_anyControlsHaveStatus(Xe){return this._anyControls(ke=>ke.status===Xe)}_anyControlsDirty(){return this._anyControls(Xe=>Xe.dirty)}_anyControlsTouched(){return this._anyControls(Xe=>Xe.touched)}_updatePristine(Xe={}){this.pristine=!this._anyControlsDirty(),this._parent&&!Xe.onlySelf&&this._parent._updatePristine(Xe)}_updateTouched(Xe={}){this.touched=this._anyControlsTouched(),this._parent&&!Xe.onlySelf&&this._parent._updateTouched(Xe)}_isBoxedValue(Xe){return"object"==typeof Xe&&null!==Xe&&2===Object.keys(Xe).length&&"value"in Xe&&"disabled"in Xe}_registerOnCollectionChange(Xe){this._onCollectionChange=Xe}_setUpdateStrategy(Xe){Fr(Xe)&&null!=Xe.updateOn&&(this._updateOn=Xe.updateOn)}_parentMarkedDirty(Xe){return!Xe&&!(!this._parent||!this._parent.dirty)&&!this._parent._anyControlsDirty()}}class vr extends er{constructor(Xe=null,ke,Ut){super(qn(ke),wn(Ut,ke)),this.defaultValue=null,this._onChange=[],this._pendingChange=!1,this._applyFormState(Xe),this._setUpdateStrategy(ke),this._initObservables(),this.updateValueAndValidity({onlySelf:!0,emitEvent:!!this.asyncValidator}),Fr(ke)&&ke.initialValueIsDefault&&(this.defaultValue=this._isBoxedValue(Xe)?Xe.value:Xe)}setValue(Xe,ke={}){this.value=this._pendingValue=Xe,this._onChange.length&&!1!==ke.emitModelToViewChange&&this._onChange.forEach(Ut=>Ut(this.value,!1!==ke.emitViewToModelChange)),this.updateValueAndValidity(ke)}patchValue(Xe,ke={}){this.setValue(Xe,ke)}reset(Xe=this.defaultValue,ke={}){this._applyFormState(Xe),this.markAsPristine(ke),this.markAsUntouched(ke),this.setValue(this.value,ke),this._pendingChange=!1}_updateValue(){}_anyControls(Xe){return!1}_allControlsDisabled(){return this.disabled}registerOnChange(Xe){this._onChange.push(Xe)}_unregisterOnChange(Xe){Oi(this._onChange,Xe)}registerOnDisabledChange(Xe){this._onDisabledChange.push(Xe)}_unregisterOnDisabledChange(Xe){Oi(this._onDisabledChange,Xe)}_forEachChild(Xe){}_syncPendingControls(){return!("submit"!==this.updateOn||(this._pendingDirty&&this.markAsDirty(),this._pendingTouched&&this.markAsTouched(),!this._pendingChange)||(this.setValue(this._pendingValue,{onlySelf:!0,emitModelToViewChange:!1}),0))}_applyFormState(Xe){this._isBoxedValue(Xe)?(this.value=this._pendingValue=Xe.value,Xe.disabled?this.disable({onlySelf:!0,emitEvent:!1}):this.enable({onlySelf:!0,emitEvent:!1})):this.value=this._pendingValue=Xe}}class yr extends er{constructor(Xe,ke,Ut){super(qn(ke),wn(Ut,ke)),this.controls=Xe,this._initObservables(),this._setUpdateStrategy(ke),this._setUpControls(),this.updateValueAndValidity({onlySelf:!0,emitEvent:!!this.asyncValidator})}registerControl(Xe,ke){return this.controls[Xe]?this.controls[Xe]:(this.controls[Xe]=ke,ke.setParent(this),ke._registerOnCollectionChange(this._onCollectionChange),ke)}addControl(Xe,ke,Ut={}){this.registerControl(Xe,ke),this.updateValueAndValidity({emitEvent:Ut.emitEvent}),this._onCollectionChange()}removeControl(Xe,ke={}){this.controls[Xe]&&this.controls[Xe]._registerOnCollectionChange(()=>{}),delete this.controls[Xe],this.updateValueAndValidity({emitEvent:ke.emitEvent}),this._onCollectionChange()}setControl(Xe,ke,Ut={}){this.controls[Xe]&&this.controls[Xe]._registerOnCollectionChange(()=>{}),delete this.controls[Xe],ke&&this.registerControl(Xe,ke),this.updateValueAndValidity({emitEvent:Ut.emitEvent}),this._onCollectionChange()}contains(Xe){return this.controls.hasOwnProperty(Xe)&&this.controls[Xe].enabled}setValue(Xe,ke={}){ua(this,Xe),Object.keys(Xe).forEach(Ut=>{Go(this,Ut),this.controls[Ut].setValue(Xe[Ut],{onlySelf:!0,emitEvent:ke.emitEvent})}),this.updateValueAndValidity(ke)}patchValue(Xe,ke={}){null!=Xe&&(Object.keys(Xe).forEach(Ut=>{this.controls[Ut]&&this.controls[Ut].patchValue(Xe[Ut],{onlySelf:!0,emitEvent:ke.emitEvent})}),this.updateValueAndValidity(ke))}reset(Xe={},ke={}){this._forEachChild((Ut,pi)=>{Ut.reset(Xe[pi],{onlySelf:!0,emitEvent:ke.emitEvent})}),this._updatePristine(ke),this._updateTouched(ke),this.updateValueAndValidity(ke)}getRawValue(){return this._reduceChildren({},(Xe,ke,Ut)=>(Xe[Ut]=go(ke),Xe))}_syncPendingControls(){let Xe=this._reduceChildren(!1,(ke,Ut)=>!!Ut._syncPendingControls()||ke);return Xe&&this.updateValueAndValidity({onlySelf:!0}),Xe}_forEachChild(Xe){Object.keys(this.controls).forEach(ke=>{const Ut=this.controls[ke];Ut&&Xe(Ut,ke)})}_setUpControls(){this._forEachChild(Xe=>{Xe.setParent(this),Xe._registerOnCollectionChange(this._onCollectionChange)})}_updateValue(){this.value=this._reduceValue()}_anyControls(Xe){for(const ke of Object.keys(this.controls)){const Ut=this.controls[ke];if(this.contains(ke)&&Xe(Ut))return!0}return!1}_reduceValue(){return this._reduceChildren({},(Xe,ke,Ut)=>((ke.enabled||this.disabled)&&(Xe[Ut]=ke.value),Xe))}_reduceChildren(Xe,ke){let Ut=Xe;return this._forEachChild((pi,Wo)=>{Ut=ke(Ut,pi,Wo)}),Ut}_allControlsDisabled(){for(const Xe of Object.keys(this.controls))if(this.controls[Xe].enabled)return!1;return Object.keys(this.controls).length>0||this.disabled}}class or extends er{constructor(Xe,ke,Ut){super(qn(ke),wn(Ut,ke)),this.controls=Xe,this._initObservables(),this._setUpdateStrategy(ke),this._setUpControls(),this.updateValueAndValidity({onlySelf:!0,emitEvent:!!this.asyncValidator})}at(Xe){return this.controls[Xe]}push(Xe,ke={}){this.controls.push(Xe),this._registerControl(Xe),this.updateValueAndValidity({emitEvent:ke.emitEvent}),this._onCollectionChange()}insert(Xe,ke,Ut={}){this.controls.splice(Xe,0,ke),this._registerControl(ke),this.updateValueAndValidity({emitEvent:Ut.emitEvent})}removeAt(Xe,ke={}){this.controls[Xe]&&this.controls[Xe]._registerOnCollectionChange(()=>{}),this.controls.splice(Xe,1),this.updateValueAndValidity({emitEvent:ke.emitEvent})}setControl(Xe,ke,Ut={}){this.controls[Xe]&&this.controls[Xe]._registerOnCollectionChange(()=>{}),this.controls.splice(Xe,1),ke&&(this.controls.splice(Xe,0,ke),this._registerControl(ke)),this.updateValueAndValidity({emitEvent:Ut.emitEvent}),this._onCollectionChange()}get length(){return this.controls.length}setValue(Xe,ke={}){ua(this,Xe),Xe.forEach((Ut,pi)=>{Go(this,pi),this.at(pi).setValue(Ut,{onlySelf:!0,emitEvent:ke.emitEvent})}),this.updateValueAndValidity(ke)}patchValue(Xe,ke={}){null!=Xe&&(Xe.forEach((Ut,pi)=>{this.at(pi)&&this.at(pi).patchValue(Ut,{onlySelf:!0,emitEvent:ke.emitEvent})}),this.updateValueAndValidity(ke))}reset(Xe=[],ke={}){this._forEachChild((Ut,pi)=>{Ut.reset(Xe[pi],{onlySelf:!0,emitEvent:ke.emitEvent})}),this._updatePristine(ke),this._updateTouched(ke),this.updateValueAndValidity(ke)}getRawValue(){return this.controls.map(Xe=>go(Xe))}clear(Xe={}){this.controls.length<1||(this._forEachChild(ke=>ke._registerOnCollectionChange(()=>{})),this.controls.splice(0),this.updateValueAndValidity({emitEvent:Xe.emitEvent}))}_syncPendingControls(){let Xe=this.controls.reduce((ke,Ut)=>!!Ut._syncPendingControls()||ke,!1);return Xe&&this.updateValueAndValidity({onlySelf:!0}),Xe}_forEachChild(Xe){this.controls.forEach((ke,Ut)=>{Xe(ke,Ut)})}_updateValue(){this.value=this.controls.filter(Xe=>Xe.enabled||this.disabled).map(Xe=>Xe.value)}_anyControls(Xe){return this.controls.some(ke=>ke.enabled&&Xe(ke))}_setUpControls(){this._forEachChild(Xe=>this._registerControl(Xe))}_allControlsDisabled(){for(const Xe of this.controls)if(Xe.enabled)return!1;return this.controls.length>0||this.disabled}_registerControl(Xe){Xe.setParent(this),Xe._registerOnCollectionChange(this._onCollectionChange)}}const si={provide:$r,useExisting:(0,r.Gpc)(()=>xn)},pn=(()=>Promise.resolve(null))();let xn=(()=>{class lt extends $r{constructor(ke,Ut){super(),this.submitted=!1,this._directives=new Set,this.ngSubmit=new r.vpe,this.form=new yr({},Vt(ke),vn(Ut))}ngAfterViewInit(){this._setUpdateStrategy()}get formDirective(){return this}get control(){return this.form}get path(){return[]}get controls(){return this.form.controls}addControl(ke){pn.then(()=>{const Ut=this._findContainer(ke.path);ke.control=Ut.registerControl(ke.name,ke.control),Zn(ke.control,ke),ke.control.updateValueAndValidity({emitEvent:!1}),this._directives.add(ke)})}getControl(ke){return this.form.get(ke.path)}removeControl(ke){pn.then(()=>{const Ut=this._findContainer(ke.path);Ut&&Ut.removeControl(ke.name),this._directives.delete(ke)})}addFormGroup(ke){pn.then(()=>{const Ut=this._findContainer(ke.path),pi=new yr({});to(pi,ke),Ut.registerControl(ke.name,pi),pi.updateValueAndValidity({emitEvent:!1})})}removeFormGroup(ke){pn.then(()=>{const Ut=this._findContainer(ke.path);Ut&&Ut.removeControl(ke.name)})}getFormGroup(ke){return this.form.get(ke.path)}updateModel(ke,Ut){pn.then(()=>{this.form.get(ke.path).setValue(Ut)})}setValue(ke){this.control.setValue(ke)}onSubmit(ke){return this.submitted=!0,dn(this.form,this._directives),this.ngSubmit.emit(ke),!1}onReset(){this.resetForm()}resetForm(ke){this.form.reset(ke),this.submitted=!1}_setUpdateStrategy(){this.options&&null!=this.options.updateOn&&(this.form._updateOn=this.options.updateOn)}_findContainer(ke){return ke.pop(),ke.length?this.form.get(ke):this.form}}return lt.\u0275fac=function(ke){return new(ke||lt)(r.Y36(ie,10),r.Y36(U,10))},lt.\u0275dir=r.lG2({type:lt,selectors:[["form",3,"ngNoForm","",3,"formGroup",""],["ng-form"],["","ngForm",""]],hostBindings:function(ke,Ut){1&ke&&r.NdJ("submit",function(Wo){return Ut.onSubmit(Wo)})("reset",function(){return Ut.onReset()})},inputs:{options:["ngFormOptions","options"]},outputs:{ngSubmit:"ngSubmit"},exportAs:["ngForm"],features:[r._Bn([si]),r.qOj]}),lt})(),Gr=(()=>{class lt extends $r{ngOnInit(){this._checkParentType(),this.formDirective.addFormGroup(this)}ngOnDestroy(){this.formDirective&&this.formDirective.removeFormGroup(this)}get control(){return this.formDirective.getFormGroup(this)}get path(){return Mn(null==this.name?this.name:this.name.toString(),this._parent)}get formDirective(){return this._parent?this._parent.formDirective:null}_checkParentType(){}}return lt.\u0275fac=function(){let Xe;return function(Ut){return(Xe||(Xe=r.n5z(lt)))(Ut||lt)}}(),lt.\u0275dir=r.lG2({type:lt,features:[r.qOj]}),lt})();const ga={provide:ur,useExisting:(0,r.Gpc)(()=>fa)},ya=(()=>Promise.resolve(null))();let fa=(()=>{class lt extends ur{constructor(ke,Ut,pi,Wo,Ya){super(),this._changeDetectorRef=Ya,this.control=new vr,this._registered=!1,this.update=new r.vpe,this._parent=ke,this._setValidators(Ut),this._setAsyncValidators(pi),this.valueAccessor=mr(0,Wo)}ngOnChanges(ke){if(this._checkForErrors(),!this._registered||"name"in ke){if(this._registered&&(this._checkName(),this.formDirective)){const Ut=ke.name.previousValue;this.formDirective.removeControl({name:Ut,path:this._getPath(Ut)})}this._setUpControl()}"isDisabled"in ke&&this._updateDisabled(ke),pt(ke,this.viewModel)&&(this._updateValue(this.model),this.viewModel=this.model)}ngOnDestroy(){this.formDirective&&this.formDirective.removeControl(this)}get path(){return this._getPath(this.name)}get formDirective(){return this._parent?this._parent.formDirective:null}viewToModelUpdate(ke){this.viewModel=ke,this.update.emit(ke)}_setUpControl(){this._setUpdateStrategy(),this._isStandalone()?this._setUpStandalone():this.formDirective.addControl(this),this._registered=!0}_setUpdateStrategy(){this.options&&null!=this.options.updateOn&&(this.control._updateOn=this.options.updateOn)}_isStandalone(){return!this._parent||!(!this.options||!this.options.standalone)}_setUpStandalone(){Zn(this.control,this),this.control.updateValueAndValidity({emitEvent:!1})}_checkForErrors(){this._isStandalone()||this._checkParentType(),this._checkName()}_checkParentType(){}_checkName(){this.options&&this.options.name&&(this.name=this.options.name),this._isStandalone()}_updateValue(ke){ya.then(()=>{var Ut;this.control.setValue(ke,{emitViewToModelChange:!1}),null===(Ut=this._changeDetectorRef)||void 0===Ut||Ut.markForCheck()})}_updateDisabled(ke){const Ut=ke.isDisabled.currentValue,pi=""===Ut||Ut&&"false"!==Ut;ya.then(()=>{var Wo;pi&&!this.control.disabled?this.control.disable():!pi&&this.control.disabled&&this.control.enable(),null===(Wo=this._changeDetectorRef)||void 0===Wo||Wo.markForCheck()})}_getPath(ke){return this._parent?Mn(ke,this._parent):[ke]}}return lt.\u0275fac=function(ke){return new(ke||lt)(r.Y36($r,9),r.Y36(ie,10),r.Y36(U,10),r.Y36(T,10),r.Y36(r.sBO,8))},lt.\u0275dir=r.lG2({type:lt,selectors:[["","ngModel","",3,"formControlName","",3,"formControl",""]],inputs:{name:"name",isDisabled:["disabled","isDisabled"],model:["ngModel","model"],options:["ngModelOptions","options"]},outputs:{update:"ngModelChange"},exportAs:["ngModel"],features:[r._Bn([ga]),r.qOj,r.TTD]}),lt})(),la=(()=>{class lt{}return lt.\u0275fac=function(ke){return new(ke||lt)},lt.\u0275dir=r.lG2({type:lt,selectors:[["form",3,"ngNoForm","",3,"ngNativeValidate",""]],hostAttrs:["novalidate",""]}),lt})();const Pa={provide:T,useExisting:(0,r.Gpc)(()=>fl),multi:!0};let fl=(()=>{class lt extends y{writeValue(ke){this.setProperty("value",null==ke?"":ke)}registerOnChange(ke){this.onChange=Ut=>{ke(""==Ut?null:parseFloat(Ut))}}}return lt.\u0275fac=function(){let Xe;return function(Ut){return(Xe||(Xe=r.n5z(lt)))(Ut||lt)}}(),lt.\u0275dir=r.lG2({type:lt,selectors:[["input","type","number","formControlName",""],["input","type","number","formControl",""],["input","type","number","ngModel",""]],hostBindings:function(ke,Ut){1&ke&&r.NdJ("input",function(Wo){return Ut.onChange(Wo.target.value)})("blur",function(){return Ut.onTouched()})},features:[r._Bn([Pa]),r.qOj]}),lt})();const To={provide:T,useExisting:(0,r.Gpc)(()=>Za),multi:!0};let Zo=(()=>{class lt{}return lt.\u0275fac=function(ke){return new(ke||lt)},lt.\u0275mod=r.oAB({type:lt}),lt.\u0275inj=r.cJS({}),lt})(),vs=(()=>{class lt{constructor(){this._accessors=[]}add(ke,Ut){this._accessors.push([ke,Ut])}remove(ke){for(let Ut=this._accessors.length-1;Ut>=0;--Ut)if(this._accessors[Ut][1]===ke)return void this._accessors.splice(Ut,1)}select(ke){this._accessors.forEach(Ut=>{this._isSameGroup(Ut,ke)&&Ut[1]!==ke&&Ut[1].fireUncheck(ke.value)})}_isSameGroup(ke,Ut){return!!ke[0].control&&ke[0]._parent===Ut._control._parent&&ke[1].name===Ut.name}}return lt.\u0275fac=function(ke){return new(ke||lt)},lt.\u0275prov=r.Yz7({token:lt,factory:lt.\u0275fac,providedIn:Zo}),lt})(),Za=(()=>{class lt extends y{constructor(ke,Ut,pi,Wo){super(ke,Ut),this._registry=pi,this._injector=Wo,this.onChange=()=>{}}ngOnInit(){this._control=this._injector.get(ur),this._checkName(),this._registry.add(this._control,this)}ngOnDestroy(){this._registry.remove(this)}writeValue(ke){this._state=ke===this.value,this.setProperty("checked",this._state)}registerOnChange(ke){this._fn=ke,this.onChange=()=>{ke(this.value),this._registry.select(this)}}fireUncheck(ke){this.writeValue(ke)}_checkName(){!this.name&&this.formControlName&&(this.name=this.formControlName)}}return lt.\u0275fac=function(ke){return new(ke||lt)(r.Y36(r.Qsj),r.Y36(r.SBq),r.Y36(vs),r.Y36(r.zs3))},lt.\u0275dir=r.lG2({type:lt,selectors:[["input","type","radio","formControlName",""],["input","type","radio","formControl",""],["input","type","radio","ngModel",""]],hostBindings:function(ke,Ut){1&ke&&r.NdJ("change",function(){return Ut.onChange()})("blur",function(){return Ut.onTouched()})},inputs:{name:"name",formControlName:"formControlName",value:"value"},features:[r._Bn([To]),r.qOj]}),lt})();const Ys=new r.OlP("NgModelWithFormControlWarning"),Ps={provide:$r,useExisting:(0,r.Gpc)(()=>ps)};let ps=(()=>{class lt extends $r{constructor(ke,Ut){super(),this.validators=ke,this.asyncValidators=Ut,this.submitted=!1,this._onCollectionChange=()=>this._updateDomValue(),this.directives=[],this.form=null,this.ngSubmit=new r.vpe,this._setValidators(ke),this._setAsyncValidators(Ut)}ngOnChanges(ke){this._checkFormPresent(),ke.hasOwnProperty("form")&&(this._updateValidators(),this._updateDomValue(),this._updateRegistrations(),this._oldForm=this.form)}ngOnDestroy(){this.form&&(vi(this.form,this),this.form._onCollectionChange===this._onCollectionChange&&this.form._registerOnCollectionChange(()=>{}))}get formDirective(){return this}get control(){return this.form}get path(){return[]}addControl(ke){const Ut=this.form.get(ke.path);return Zn(Ut,ke),Ut.updateValueAndValidity({emitEvent:!1}),this.directives.push(ke),Ut}getControl(ke){return this.form.get(ke.path)}removeControl(ke){cn(ke.control||null,ke,!1),Oi(this.directives,ke)}addFormGroup(ke){this._setUpFormContainer(ke)}removeFormGroup(ke){this._cleanUpFormContainer(ke)}getFormGroup(ke){return this.form.get(ke.path)}addFormArray(ke){this._setUpFormContainer(ke)}removeFormArray(ke){this._cleanUpFormContainer(ke)}getFormArray(ke){return this.form.get(ke.path)}updateModel(ke,Ut){this.form.get(ke.path).setValue(Ut)}onSubmit(ke){return this.submitted=!0,dn(this.form,this.directives),this.ngSubmit.emit(ke),!1}onReset(){this.resetForm()}resetForm(ke){this.form.reset(ke),this.submitted=!1}_updateDomValue(){this.directives.forEach(ke=>{const Ut=ke.control,pi=this.form.get(ke.path);Ut!==pi&&(cn(Ut||null,ke),oo(pi)&&(Zn(pi,ke),ke.control=pi))}),this.form._updateTreeValidity({emitEvent:!1})}_setUpFormContainer(ke){const Ut=this.form.get(ke.path);to(Ut,ke),Ut.updateValueAndValidity({emitEvent:!1})}_cleanUpFormContainer(ke){if(this.form){const Ut=this.form.get(ke.path);Ut&&function Gt(lt,Xe){return vi(lt,Xe)}(Ut,ke)&&Ut.updateValueAndValidity({emitEvent:!1})}}_updateRegistrations(){this.form._registerOnCollectionChange(this._onCollectionChange),this._oldForm&&this._oldForm._registerOnCollectionChange(()=>{})}_updateValidators(){ri(this.form,this),this._oldForm&&vi(this._oldForm,this)}_checkFormPresent(){}}return lt.\u0275fac=function(ke){return new(ke||lt)(r.Y36(ie,10),r.Y36(U,10))},lt.\u0275dir=r.lG2({type:lt,selectors:[["","formGroup",""]],hostBindings:function(ke,Ut){1&ke&&r.NdJ("submit",function(Wo){return Ut.onSubmit(Wo)})("reset",function(){return Ut.onReset()})},inputs:{form:["formGroup","form"]},outputs:{ngSubmit:"ngSubmit"},exportAs:["ngForm"],features:[r._Bn([Ps]),r.qOj,r.TTD]}),lt})();const Oo={provide:$r,useExisting:(0,r.Gpc)(()=>Nr)};let Nr=(()=>{class lt extends Gr{constructor(ke,Ut,pi){super(),this._parent=ke,this._setValidators(Ut),this._setAsyncValidators(pi)}_checkParentType(){rn(this._parent)}}return lt.\u0275fac=function(ke){return new(ke||lt)(r.Y36($r,13),r.Y36(ie,10),r.Y36(U,10))},lt.\u0275dir=r.lG2({type:lt,selectors:[["","formGroupName",""]],inputs:{name:["formGroupName","name"]},features:[r._Bn([Oo]),r.qOj]}),lt})();const Qi={provide:$r,useExisting:(0,r.Gpc)(()=>tt)};let tt=(()=>{class lt extends $r{constructor(ke,Ut,pi){super(),this._parent=ke,this._setValidators(Ut),this._setAsyncValidators(pi)}ngOnInit(){this._checkParentType(),this.formDirective.addFormArray(this)}ngOnDestroy(){this.formDirective&&this.formDirective.removeFormArray(this)}get control(){return this.formDirective.getFormArray(this)}get formDirective(){return this._parent?this._parent.formDirective:null}get path(){return Mn(null==this.name?this.name:this.name.toString(),this._parent)}_checkParentType(){rn(this._parent)}}return lt.\u0275fac=function(ke){return new(ke||lt)(r.Y36($r,13),r.Y36(ie,10),r.Y36(U,10))},lt.\u0275dir=r.lG2({type:lt,selectors:[["","formArrayName",""]],inputs:{name:["formArrayName","name"]},features:[r._Bn([Qi]),r.qOj]}),lt})();function rn(lt){return!(lt instanceof Nr||lt instanceof ps||lt instanceof tt)}const ne={provide:ur,useExisting:(0,r.Gpc)(()=>Le)};let Le=(()=>{class lt extends ur{constructor(ke,Ut,pi,Wo,Ya){super(),this._ngModelWarningConfig=Ya,this._added=!1,this.update=new r.vpe,this._ngModelWarningSent=!1,this._parent=ke,this._setValidators(Ut),this._setAsyncValidators(pi),this.valueAccessor=mr(0,Wo)}set isDisabled(ke){}ngOnChanges(ke){this._added||this._setUpControl(),pt(ke,this.viewModel)&&(this.viewModel=this.model,this.formDirective.updateModel(this,this.model))}ngOnDestroy(){this.formDirective&&this.formDirective.removeControl(this)}viewToModelUpdate(ke){this.viewModel=ke,this.update.emit(ke)}get path(){return Mn(null==this.name?this.name:this.name.toString(),this._parent)}get formDirective(){return this._parent?this._parent.formDirective:null}_checkParentType(){}_setUpControl(){this._checkParentType(),this.control=this.formDirective.addControl(this),this.control.disabled&&this.valueAccessor.setDisabledState&&this.valueAccessor.setDisabledState(!0),this._added=!0}}return lt._ngModelWarningSentOnce=!1,lt.\u0275fac=function(ke){return new(ke||lt)(r.Y36($r,13),r.Y36(ie,10),r.Y36(U,10),r.Y36(T,10),r.Y36(Ys,8))},lt.\u0275dir=r.lG2({type:lt,selectors:[["","formControlName",""]],inputs:{name:["formControlName","name"],isDisabled:["disabled","isDisabled"],model:["ngModel","model"]},outputs:{update:"ngModelChange"},features:[r._Bn([ne]),r.qOj,r.TTD]}),lt})();const Lt={provide:T,useExisting:(0,r.Gpc)(()=>bi),multi:!0};function on(lt,Xe){return null==lt?`${Xe}`:(Xe&&"object"==typeof Xe&&(Xe="Object"),`${lt}: ${Xe}`.slice(0,50))}let bi=(()=>{class lt extends y{constructor(){super(...arguments),this._optionMap=new Map,this._idCounter=0,this._compareWith=Object.is}set compareWith(ke){this._compareWith=ke}writeValue(ke){this.value=ke;const pi=on(this._getOptionId(ke),ke);this.setProperty("value",pi)}registerOnChange(ke){this.onChange=Ut=>{this.value=this._getOptionValue(Ut),ke(this.value)}}_registerOption(){return(this._idCounter++).toString()}_getOptionId(ke){for(const Ut of Array.from(this._optionMap.keys()))if(this._compareWith(this._optionMap.get(Ut),ke))return Ut;return null}_getOptionValue(ke){const Ut=function Kr(lt){return lt.split(":")[0]}(ke);return this._optionMap.has(Ut)?this._optionMap.get(Ut):ke}}return lt.\u0275fac=function(){let Xe;return function(Ut){return(Xe||(Xe=r.n5z(lt)))(Ut||lt)}}(),lt.\u0275dir=r.lG2({type:lt,selectors:[["select","formControlName","",3,"multiple",""],["select","formControl","",3,"multiple",""],["select","ngModel","",3,"multiple",""]],hostBindings:function(ke,Ut){1&ke&&r.NdJ("change",function(Wo){return Ut.onChange(Wo.target.value)})("blur",function(){return Ut.onTouched()})},inputs:{compareWith:"compareWith"},features:[r._Bn([Lt]),r.qOj]}),lt})(),Ii=(()=>{class lt{constructor(ke,Ut,pi){this._element=ke,this._renderer=Ut,this._select=pi,this._select&&(this.id=this._select._registerOption())}set ngValue(ke){null!=this._select&&(this._select._optionMap.set(this.id,ke),this._setElementValue(on(this.id,ke)),this._select.writeValue(this._select.value))}set value(ke){this._setElementValue(ke),this._select&&this._select.writeValue(this._select.value)}_setElementValue(ke){this._renderer.setProperty(this._element.nativeElement,"value",ke)}ngOnDestroy(){this._select&&(this._select._optionMap.delete(this.id),this._select.writeValue(this._select.value))}}return lt.\u0275fac=function(ke){return new(ke||lt)(r.Y36(r.SBq),r.Y36(r.Qsj),r.Y36(bi,9))},lt.\u0275dir=r.lG2({type:lt,selectors:[["option"]],inputs:{ngValue:"ngValue",value:"value"}}),lt})();const hs={provide:T,useExisting:(0,r.Gpc)(()=>vl),multi:!0};function zo(lt,Xe){return null==lt?`${Xe}`:("string"==typeof Xe&&(Xe=`'${Xe}'`),Xe&&"object"==typeof Xe&&(Xe="Object"),`${lt}: ${Xe}`.slice(0,50))}let vl=(()=>{class lt extends y{constructor(){super(...arguments),this._optionMap=new Map,this._idCounter=0,this._compareWith=Object.is}set compareWith(ke){this._compareWith=ke}writeValue(ke){let Ut;if(this.value=ke,Array.isArray(ke)){const pi=ke.map(Wo=>this._getOptionId(Wo));Ut=(Wo,Ya)=>{Wo._setSelected(pi.indexOf(Ya.toString())>-1)}}else Ut=(pi,Wo)=>{pi._setSelected(!1)};this._optionMap.forEach(Ut)}registerOnChange(ke){this.onChange=Ut=>{const pi=[],Wo=Ut.selectedOptions;if(void 0!==Wo){const Ya=Wo;for(let yl=0;yl<Ya.length;yl++){const Lc=this._getOptionValue(Ya[yl].value);pi.push(Lc)}}else{const Ya=Ut.options;for(let yl=0;yl<Ya.length;yl++){const Xu=Ya[yl];if(Xu.selected){const Lc=this._getOptionValue(Xu.value);pi.push(Lc)}}}this.value=pi,ke(pi)}}_registerOption(ke){const Ut=(this._idCounter++).toString();return this._optionMap.set(Ut,ke),Ut}_getOptionId(ke){for(const Ut of Array.from(this._optionMap.keys()))if(this._compareWith(this._optionMap.get(Ut)._value,ke))return Ut;return null}_getOptionValue(ke){const Ut=function Ls(lt){return lt.split(":")[0]}(ke);return this._optionMap.has(Ut)?this._optionMap.get(Ut)._value:ke}}return lt.\u0275fac=function(){let Xe;return function(Ut){return(Xe||(Xe=r.n5z(lt)))(Ut||lt)}}(),lt.\u0275dir=r.lG2({type:lt,selectors:[["select","multiple","","formControlName",""],["select","multiple","","formControl",""],["select","multiple","","ngModel",""]],hostBindings:function(ke,Ut){1&ke&&r.NdJ("change",function(Wo){return Ut.onChange(Wo.target)})("blur",function(){return Ut.onTouched()})},inputs:{compareWith:"compareWith"},features:[r._Bn([hs]),r.qOj]}),lt})(),ol=(()=>{class lt{constructor(ke,Ut,pi){this._element=ke,this._renderer=Ut,this._select=pi,this._select&&(this.id=this._select._registerOption(this))}set ngValue(ke){null!=this._select&&(this._value=ke,this._setElementValue(zo(this.id,ke)),this._select.writeValue(this._select.value))}set value(ke){this._select?(this._value=ke,this._setElementValue(zo(this.id,ke)),this._select.writeValue(this._select.value)):this._setElementValue(ke)}_setElementValue(ke){this._renderer.setProperty(this._element.nativeElement,"value",ke)}_setSelected(ke){this._renderer.setProperty(this._element.nativeElement,"selected",ke)}ngOnDestroy(){this._select&&(this._select._optionMap.delete(this.id),this._select.writeValue(this._select.value))}}return lt.\u0275fac=function(ke){return new(ke||lt)(r.Y36(r.SBq),r.Y36(r.Qsj),r.Y36(vl,9))},lt.\u0275dir=r.lG2({type:lt,selectors:[["option"]],inputs:{ngValue:"ngValue",value:"value"}}),lt})();function hc(lt){return"number"==typeof lt?lt:parseFloat(lt)}let Tl=(()=>{class lt{constructor(){this._validator=Be}ngOnChanges(ke){if(this.inputName in ke){const Ut=this.normalizeInput(ke[this.inputName].currentValue);this._enabled=this.enabled(Ut),this._validator=this._enabled?this.createValidator(Ut):Be,this._onChange&&this._onChange()}}validate(ke){return this._validator(ke)}registerOnValidatorChange(ke){this._onChange=ke}enabled(ke){return null!=ke}}return lt.\u0275fac=function(ke){return new(ke||lt)},lt.\u0275dir=r.lG2({type:lt,features:[r.TTD]}),lt})();const _c={provide:ie,useExisting:(0,r.Gpc)(()=>Pl),multi:!0};let Pl=(()=>{class lt extends Tl{constructor(){super(...arguments),this.inputName="max",this.normalizeInput=ke=>hc(ke),this.createValidator=ke=>he(ke)}}return lt.\u0275fac=function(){let Xe;return function(Ut){return(Xe||(Xe=r.n5z(lt)))(Ut||lt)}}(),lt.\u0275dir=r.lG2({type:lt,selectors:[["input","type","number","max","","formControlName",""],["input","type","number","max","","formControl",""],["input","type","number","max","","ngModel",""]],hostVars:1,hostBindings:function(ke,Ut){2&ke&&r.uIk("max",Ut._enabled?Ut.max:null)},inputs:{max:"max"},features:[r._Bn([_c]),r.qOj]}),lt})();const Ku={provide:ie,useExisting:(0,r.Gpc)(()=>Qa),multi:!0};let Qa=(()=>{class lt extends Tl{constructor(){super(...arguments),this.inputName="min",this.normalizeInput=ke=>hc(ke),this.createValidator=ke=>ae(ke)}}return lt.\u0275fac=function(){let Xe;return function(Ut){return(Xe||(Xe=r.n5z(lt)))(Ut||lt)}}(),lt.\u0275dir=r.lG2({type:lt,selectors:[["input","type","number","min","","formControlName",""],["input","type","number","min","","formControl",""],["input","type","number","min","","ngModel",""]],hostVars:1,hostBindings:function(ke,Ut){2&ke&&r.uIk("min",Ut._enabled?Ut.min:null)},inputs:{min:"min"},features:[r._Bn([Ku]),r.qOj]}),lt})();const Mc={provide:ie,useExisting:(0,r.Gpc)(()=>Wa),multi:!0};let Wa=(()=>{class lt extends Tl{constructor(){super(...arguments),this.inputName="required",this.normalizeInput=ke=>function Qu(lt){return null!=lt&&!1!==lt&&"false"!=`${lt}`}(ke),this.createValidator=ke=>be}enabled(ke){return ke}}return lt.\u0275fac=function(){let Xe;return function(Ut){return(Xe||(Xe=r.n5z(lt)))(Ut||lt)}}(),lt.\u0275dir=r.lG2({type:lt,selectors:[["","required","","formControlName","",3,"type","checkbox"],["","required","","formControl","",3,"type","checkbox"],["","required","","ngModel","",3,"type","checkbox"]],hostVars:1,hostBindings:function(ke,Ut){2&ke&&r.uIk("required",Ut._enabled?"":null)},inputs:{required:"required"},features:[r._Bn([Mc]),r.qOj]}),lt})(),As=(()=>{class lt{}return lt.\u0275fac=function(ke){return new(ke||lt)},lt.\u0275mod=r.oAB({type:lt}),lt.\u0275inj=r.cJS({imports:[[Zo]]}),lt})(),Ns=(()=>{class lt{}return lt.\u0275fac=function(ke){return new(ke||lt)},lt.\u0275mod=r.oAB({type:lt}),lt.\u0275inj=r.cJS({imports:[As]}),lt})(),Io=(()=>{class lt{static withConfig(ke){return{ngModule:lt,providers:[{provide:Ys,useValue:ke.warnOnNgModelWithFormControl}]}}}return lt.\u0275fac=function(ke){return new(ke||lt)},lt.\u0275mod=r.oAB({type:lt}),lt.\u0275inj=r.cJS({imports:[As]}),lt})(),sl=(()=>{class lt{group(ke,Ut=null){const pi=this._reduceControls(ke);let yl,Wo=null,Ya=null;return null!=Ut&&(function Ka(lt){return void 0!==lt.asyncValidators||void 0!==lt.validators||void 0!==lt.updateOn}(Ut)?(Wo=null!=Ut.validators?Ut.validators:null,Ya=null!=Ut.asyncValidators?Ut.asyncValidators:null,yl=null!=Ut.updateOn?Ut.updateOn:void 0):(Wo=null!=Ut.validator?Ut.validator:null,Ya=null!=Ut.asyncValidator?Ut.asyncValidator:null)),new yr(pi,{asyncValidators:Ya,updateOn:yl,validators:Wo})}control(ke,Ut,pi){return new vr(ke,Ut,pi)}array(ke,Ut,pi){const Wo=ke.map(Ya=>this._createControl(Ya));return new or(Wo,Ut,pi)}_reduceControls(ke){const Ut={};return Object.keys(ke).forEach(pi=>{Ut[pi]=this._createControl(ke[pi])}),Ut}_createControl(ke){return oo(ke)||Li(ke)||yo(ke)?ke:Array.isArray(ke)?this.control(ke[0],ke.length>1?ke[1]:null,ke.length>2?ke[2]:null):this.control(ke)}}return lt.\u0275fac=function(ke){return new(ke||lt)},lt.\u0275prov=r.Yz7({token:lt,factory:lt.\u0275fac,providedIn:Io}),lt})()},14800:(m,S,i)=>{"use strict";i.d(S,{H7:()=>Gt,HJ:()=>ii,b2:()=>Pn,q6:()=>$r,se:()=>je});var r=i(11048),a=i(89724);class f extends r.w_{constructor(){super(...arguments),this.supportsDOMEvents=!0}}class c extends f{static makeCurrent(){(0,r.HT)(new c)}onAndCancel(pt,kt,dn){return pt.addEventListener(kt,dn,!1),()=>{pt.removeEventListener(kt,dn,!1)}}dispatchEvent(pt,kt){pt.dispatchEvent(kt)}remove(pt){pt.parentNode&&pt.parentNode.removeChild(pt)}createElement(pt,kt){return(kt=kt||this.getDefaultDocument()).createElement(pt)}createHtmlDocument(){return document.implementation.createHTMLDocument("fakeTitle")}getDefaultDocument(){return document}isElementNode(pt){return pt.nodeType===Node.ELEMENT_NODE}isShadowRoot(pt){return pt instanceof DocumentFragment}getGlobalEventTarget(pt,kt){return"window"===kt?window:"document"===kt?pt:"body"===kt?pt.body:null}getBaseHref(pt){const kt=function p(){return e=e||document.querySelector("base"),e?e.getAttribute("href"):null}();return null==kt?null:function T(ct){y=y||document.createElement("a"),y.setAttribute("href",ct);const pt=y.pathname;return"/"===pt.charAt(0)?pt:`/${pt}`}(kt)}resetBaseElement(){e=null}getUserAgent(){return window.navigator.userAgent}getCookie(pt){return(0,r.Mx)(document.cookie,pt)}}let y,e=null;const C=new a.OlP("TRANSITION_ID"),L=[{provide:a.ip1,useFactory:function R(ct,pt,kt){return()=>{kt.get(a.CZH).donePromise.then(()=>{const dn=(0,r.q)(),mr=pt.querySelectorAll(`style[ng-transition="${ct}"]`);for(let Oi=0;Oi<mr.length;Oi++)dn.remove(mr[Oi])})}},deps:[C,r.K0,a.zs3],multi:!0}];class z{static init(){(0,a.VLi)(new z)}addToWindow(pt){a.dqk.getAngularTestability=(dn,mr=!0)=>{const Oi=pt.findTestabilityInTree(dn,mr);if(null==Oi)throw new Error("Could not find testability for element.");return Oi},a.dqk.getAllAngularTestabilities=()=>pt.getAllTestabilities(),a.dqk.getAllAngularRootElements=()=>pt.getAllRootElements(),a.dqk.frameworkStabilizers||(a.dqk.frameworkStabilizers=[]),a.dqk.frameworkStabilizers.push(dn=>{const mr=a.dqk.getAllAngularTestabilities();let Oi=mr.length,di=!1;const Uo=function(Qo){di=di||Qo,Oi--,0==Oi&&dn(di)};mr.forEach(function(Qo){Qo.whenStable(Uo)})})}findTestabilityInTree(pt,kt,dn){if(null==kt)return null;const mr=pt.getTestability(kt);return null!=mr?mr:dn?(0,r.q)().isShadowRoot(kt)?this.findTestabilityInTree(pt,kt.host,!0):this.findTestabilityInTree(pt,kt.parentElement,!0):null}}let W=(()=>{class ct{build(){return new XMLHttpRequest}}return ct.\u0275fac=function(kt){return new(kt||ct)},ct.\u0275prov=a.Yz7({token:ct,factory:ct.\u0275fac}),ct})();const J=new a.OlP("EventManagerPlugins");let ee=(()=>{class ct{constructor(kt,dn){this._zone=dn,this._eventNameToPlugin=new Map,kt.forEach(mr=>mr.manager=this),this._plugins=kt.slice().reverse()}addEventListener(kt,dn,mr){return this._findPluginFor(dn).addEventListener(kt,dn,mr)}addGlobalEventListener(kt,dn,mr){return this._findPluginFor(dn).addGlobalEventListener(kt,dn,mr)}getZone(){return this._zone}_findPluginFor(kt){const dn=this._eventNameToPlugin.get(kt);if(dn)return dn;const mr=this._plugins;for(let Oi=0;Oi<mr.length;Oi++){const di=mr[Oi];if(di.supports(kt))return this._eventNameToPlugin.set(kt,di),di}throw new Error(`No event manager plugin found for event ${kt}`)}}return ct.\u0275fac=function(kt){return new(kt||ct)(a.LFG(J),a.LFG(a.R0b))},ct.\u0275prov=a.Yz7({token:ct,factory:ct.\u0275fac}),ct})();class ce{constructor(pt){this._doc=pt}addGlobalEventListener(pt,kt,dn){const mr=(0,r.q)().getGlobalEventTarget(this._doc,pt);if(!mr)throw new Error(`Unsupported event target ${mr} for event ${kt}`);return this.addEventListener(mr,kt,dn)}}let ie=(()=>{class ct{constructor(){this._stylesSet=new Set}addStyles(kt){const dn=new Set;kt.forEach(mr=>{this._stylesSet.has(mr)||(this._stylesSet.add(mr),dn.add(mr))}),this.onStylesAdded(dn)}onStylesAdded(kt){}getAllStyles(){return Array.from(this._stylesSet)}}return ct.\u0275fac=function(kt){return new(kt||ct)},ct.\u0275prov=a.Yz7({token:ct,factory:ct.\u0275fac}),ct})(),U=(()=>{class ct extends ie{constructor(kt){super(),this._doc=kt,this._hostNodes=new Map,this._hostNodes.set(kt.head,[])}_addStylesToHost(kt,dn,mr){kt.forEach(Oi=>{const di=this._doc.createElement("style");di.textContent=Oi,mr.push(dn.appendChild(di))})}addHost(kt){const dn=[];this._addStylesToHost(this._stylesSet,kt,dn),this._hostNodes.set(kt,dn)}removeHost(kt){const dn=this._hostNodes.get(kt);dn&&dn.forEach(se),this._hostNodes.delete(kt)}onStylesAdded(kt){this._hostNodes.forEach((dn,mr)=>{this._addStylesToHost(kt,mr,dn)})}ngOnDestroy(){this._hostNodes.forEach(kt=>kt.forEach(se))}}return ct.\u0275fac=function(kt){return new(kt||ct)(a.LFG(r.K0))},ct.\u0275prov=a.Yz7({token:ct,factory:ct.\u0275fac}),ct})();function se(ct){(0,r.q)().remove(ct)}const ge={svg:"http://www.w3.org/2000/svg",xhtml:"http://www.w3.org/1999/xhtml",xlink:"http://www.w3.org/1999/xlink",xml:"http://www.w3.org/XML/1998/namespace",xmlns:"http://www.w3.org/2000/xmlns/",math:"http://www.w3.org/1998/MathML/"},ae=/%COMP%/g;function Ve(ct,pt,kt){for(let dn=0;dn<pt.length;dn++){let mr=pt[dn];Array.isArray(mr)?Ve(ct,mr,kt):(mr=mr.replace(ae,ct),kt.push(mr))}return kt}function Be(ct){return pt=>{if("__ngUnwrap__"===pt)return ct;!1===ct(pt)&&(pt.preventDefault(),pt.returnValue=!1)}}let je=(()=>{class ct{constructor(kt,dn,mr){this.eventManager=kt,this.sharedStylesHost=dn,this.appId=mr,this.rendererByCompId=new Map,this.defaultRenderer=new Ne(kt)}createRenderer(kt,dn){if(!kt||!dn)return this.defaultRenderer;switch(dn.encapsulation){case a.ifc.Emulated:{let mr=this.rendererByCompId.get(dn.id);return mr||(mr=new en(this.eventManager,this.sharedStylesHost,dn,this.appId),this.rendererByCompId.set(dn.id,mr)),mr.applyToHost(kt),mr}case 1:case a.ifc.ShadowDom:return new Pt(this.eventManager,this.sharedStylesHost,kt,dn);default:if(!this.rendererByCompId.has(dn.id)){const mr=Ve(dn.id,dn.styles,[]);this.sharedStylesHost.addStyles(mr),this.rendererByCompId.set(dn.id,this.defaultRenderer)}return this.defaultRenderer}}begin(){}end(){}}return ct.\u0275fac=function(kt){return new(kt||ct)(a.LFG(ee),a.LFG(U),a.LFG(a.AFp))},ct.\u0275prov=a.Yz7({token:ct,factory:ct.\u0275fac}),ct})();class Ne{constructor(pt){this.eventManager=pt,this.data=Object.create(null),this.destroyNode=null}destroy(){}createElement(pt,kt){return kt?document.createElementNS(ge[kt]||kt,pt):document.createElement(pt)}createComment(pt){return document.createComment(pt)}createText(pt){return document.createTextNode(pt)}appendChild(pt,kt){pt.appendChild(kt)}insertBefore(pt,kt,dn){pt&&pt.insertBefore(kt,dn)}removeChild(pt,kt){pt&&pt.removeChild(kt)}selectRootElement(pt,kt){let dn="string"==typeof pt?document.querySelector(pt):pt;if(!dn)throw new Error(`The selector "${pt}" did not match any elements`);return kt||(dn.textContent=""),dn}parentNode(pt){return pt.parentNode}nextSibling(pt){return pt.nextSibling}setAttribute(pt,kt,dn,mr){if(mr){kt=mr+":"+kt;const Oi=ge[mr];Oi?pt.setAttributeNS(Oi,kt,dn):pt.setAttribute(kt,dn)}else pt.setAttribute(kt,dn)}removeAttribute(pt,kt,dn){if(dn){const mr=ge[dn];mr?pt.removeAttributeNS(mr,kt):pt.removeAttribute(`${dn}:${kt}`)}else pt.removeAttribute(kt)}addClass(pt,kt){pt.classList.add(kt)}removeClass(pt,kt){pt.classList.remove(kt)}setStyle(pt,kt,dn,mr){mr&(a.JOm.DashCase|a.JOm.Important)?pt.style.setProperty(kt,dn,mr&a.JOm.Important?"important":""):pt.style[kt]=dn}removeStyle(pt,kt,dn){dn&a.JOm.DashCase?pt.style.removeProperty(kt):pt.style[kt]=""}setProperty(pt,kt,dn){pt[kt]=dn}setValue(pt,kt){pt.nodeValue=kt}listen(pt,kt,dn){return"string"==typeof pt?this.eventManager.addGlobalEventListener(pt,kt,Be(dn)):this.eventManager.addEventListener(pt,kt,Be(dn))}}class en extends Ne{constructor(pt,kt,dn,mr){super(pt),this.component=dn;const Oi=Ve(mr+"-"+dn.id,dn.styles,[]);kt.addStyles(Oi),this.contentAttr=function st(ct){return"_ngcontent-%COMP%".replace(ae,ct)}(mr+"-"+dn.id),this.hostAttr=function We(ct){return"_nghost-%COMP%".replace(ae,ct)}(mr+"-"+dn.id)}applyToHost(pt){super.setAttribute(pt,this.hostAttr,"")}createElement(pt,kt){const dn=super.createElement(pt,kt);return super.setAttribute(dn,this.contentAttr,""),dn}}class Pt extends Ne{constructor(pt,kt,dn,mr){super(pt),this.sharedStylesHost=kt,this.hostEl=dn,this.shadowRoot=dn.attachShadow({mode:"open"}),this.sharedStylesHost.addHost(this.shadowRoot);const Oi=Ve(mr.id,mr.styles,[]);for(let di=0;di<Oi.length;di++){const Uo=document.createElement("style");Uo.textContent=Oi[di],this.shadowRoot.appendChild(Uo)}}nodeOrShadowRoot(pt){return pt===this.hostEl?this.shadowRoot:pt}destroy(){this.sharedStylesHost.removeHost(this.shadowRoot)}appendChild(pt,kt){return super.appendChild(this.nodeOrShadowRoot(pt),kt)}insertBefore(pt,kt,dn){return super.insertBefore(this.nodeOrShadowRoot(pt),kt,dn)}removeChild(pt,kt){return super.removeChild(this.nodeOrShadowRoot(pt),kt)}parentNode(pt){return this.nodeOrShadowRoot(super.parentNode(this.nodeOrShadowRoot(pt)))}}let Vt=(()=>{class ct extends ce{constructor(kt){super(kt)}supports(kt){return!0}addEventListener(kt,dn,mr){return kt.addEventListener(dn,mr,!1),()=>this.removeEventListener(kt,dn,mr)}removeEventListener(kt,dn,mr){return kt.removeEventListener(dn,mr)}}return ct.\u0275fac=function(kt){return new(kt||ct)(a.LFG(r.K0))},ct.\u0275prov=a.Yz7({token:ct,factory:ct.\u0275fac}),ct})();const hn=["alt","control","meta","shift"],mt={"\b":"Backspace","\t":"Tab","\x7f":"Delete","\x1b":"Escape",Del:"Delete",Esc:"Escape",Left:"ArrowLeft",Right:"ArrowRight",Up:"ArrowUp",Down:"ArrowDown",Menu:"ContextMenu",Scroll:"ScrollLock",Win:"OS"},Nt={A:"1",B:"2",C:"3",D:"4",E:"5",F:"6",G:"7",H:"8",I:"9",J:"*",K:"+",M:"-",N:".",O:"/","`":"0","\x90":"NumLock"},St={alt:ct=>ct.altKey,control:ct=>ct.ctrlKey,meta:ct=>ct.metaKey,shift:ct=>ct.shiftKey};let Yt=(()=>{class ct extends ce{constructor(kt){super(kt)}supports(kt){return null!=ct.parseEventName(kt)}addEventListener(kt,dn,mr){const Oi=ct.parseEventName(dn),di=ct.eventCallback(Oi.fullKey,mr,this.manager.getZone());return this.manager.getZone().runOutsideAngular(()=>(0,r.q)().onAndCancel(kt,Oi.domEventName,di))}static parseEventName(kt){const dn=kt.toLowerCase().split("."),mr=dn.shift();if(0===dn.length||"keydown"!==mr&&"keyup"!==mr)return null;const Oi=ct._normalizeKey(dn.pop());let di="";if(hn.forEach(Qo=>{const lo=dn.indexOf(Qo);lo>-1&&(dn.splice(lo,1),di+=Qo+".")}),di+=Oi,0!=dn.length||0===Oi.length)return null;const Uo={};return Uo.domEventName=mr,Uo.fullKey=di,Uo}static getEventFullKey(kt){let dn="",mr=function Fn(ct){let pt=ct.key;if(null==pt){if(pt=ct.keyIdentifier,null==pt)return"Unidentified";pt.startsWith("U+")&&(pt=String.fromCharCode(parseInt(pt.substring(2),16)),3===ct.location&&Nt.hasOwnProperty(pt)&&(pt=Nt[pt]))}return mt[pt]||pt}(kt);return mr=mr.toLowerCase()," "===mr?mr="space":"."===mr&&(mr="dot"),hn.forEach(Oi=>{Oi!=mr&&St[Oi](kt)&&(dn+=Oi+".")}),dn+=mr,dn}static eventCallback(kt,dn,mr){return Oi=>{ct.getEventFullKey(Oi)===kt&&mr.runGuarded(()=>dn(Oi))}}static _normalizeKey(kt){return"esc"===kt?"escape":kt}}return ct.\u0275fac=function(kt){return new(kt||ct)(a.LFG(r.K0))},ct.\u0275prov=a.Yz7({token:ct,factory:ct.\u0275fac}),ct})();const $r=(0,a.eFA)(a._c5,"browser",[{provide:a.Lbi,useValue:r.bD},{provide:a.g9A,useValue:function pr(){c.makeCurrent(),z.init()},multi:!0},{provide:r.K0,useFactory:function mi(){return(0,a.RDi)(document),document},deps:[]}]),Br=[{provide:a.zSh,useValue:"root"},{provide:a.qLn,useFactory:function Ei(){return new a.qLn},deps:[]},{provide:J,useClass:Vt,multi:!0,deps:[r.K0,a.R0b,a.Lbi]},{provide:J,useClass:Yt,multi:!0,deps:[r.K0]},{provide:je,useClass:je,deps:[ee,U,a.AFp]},{provide:a.FYo,useExisting:je},{provide:ie,useExisting:U},{provide:U,useClass:U,deps:[r.K0]},{provide:a.dDg,useClass:a.dDg,deps:[a.R0b]},{provide:ee,useClass:ee,deps:[J,a.R0b]},{provide:r.JF,useClass:W,deps:[]}];let Pn=(()=>{class ct{constructor(kt){if(kt)throw new Error("BrowserModule has already been loaded. If you need access to common directives such as NgIf and NgFor from a lazy loaded module, import CommonModule instead.")}static withServerTransition(kt){return{ngModule:ct,providers:[{provide:a.AFp,useValue:kt.appId},{provide:C,useExisting:a.AFp},L]}}}return ct.\u0275fac=function(kt){return new(kt||ct)(a.LFG(ct,12))},ct.\u0275mod=a.oAB({type:ct}),ct.\u0275inj=a.cJS({providers:Br,imports:[r.ez,a.hGG]}),ct})();const jn="undefined"!=typeof window&&window||{};class Jn{constructor(pt,kt){this.msPerTick=pt,this.numTicks=kt}}class Gn{constructor(pt){this.appRef=pt.injector.get(a.z2F)}timeChangeDetection(pt){const kt=pt&&pt.record,dn="Change Detection",mr=null!=jn.console.profile;kt&&mr&&jn.console.profile(dn);const Oi=Xr();let di=0;for(;di<5||Xr()-Oi<500;)this.appRef.tick(),di++;const Uo=Xr();kt&&mr&&jn.console.profileEnd(dn);const Qo=(Uo-Oi)/di;return jn.console.log(`ran ${di} change detection cycles`),jn.console.log(`${Qo.toFixed(2)} ms per check`),new Jn(Qo,di)}}function Xr(){return jn.performance&&jn.performance.now?jn.performance.now():(new Date).getTime()}function ii(ct){return function un(ct,pt){"undefined"!=typeof COMPILED&&COMPILED||((a.dqk.ng=a.dqk.ng||{})[ct]=pt)}("profiler",new Gn(ct)),ct}let Gt=(()=>{class ct{}return ct.\u0275fac=function(kt){return new(kt||ct)},ct.\u0275prov=a.Yz7({token:ct,factory:function(kt){let dn=null;return dn=kt?new(kt||ct):a.LFG(_t),dn},providedIn:"root"}),ct})(),_t=(()=>{class ct extends Gt{constructor(kt){super(),this._doc=kt}sanitize(kt,dn){if(null==dn)return null;switch(kt){case a.q3G.NONE:return dn;case a.q3G.HTML:return(0,a.qzn)(dn,"HTML")?(0,a.z3N)(dn):(0,a.EiD)(this._doc,String(dn)).toString();case a.q3G.STYLE:return(0,a.qzn)(dn,"Style")?(0,a.z3N)(dn):dn;case a.q3G.SCRIPT:if((0,a.qzn)(dn,"Script"))return(0,a.z3N)(dn);throw new Error("unsafe value used in a script context");case a.q3G.URL:return(0,a.yhl)(dn),(0,a.qzn)(dn,"URL")?(0,a.z3N)(dn):(0,a.mCW)(String(dn));case a.q3G.RESOURCE_URL:if((0,a.qzn)(dn,"ResourceURL"))return(0,a.z3N)(dn);throw new Error("unsafe value used in a resource URL context (see https://g.co/ng/security#xss)");default:throw new Error(`Unexpected SecurityContext ${kt} (see https://g.co/ng/security#xss)`)}}bypassSecurityTrustHtml(kt){return(0,a.JVY)(kt)}bypassSecurityTrustStyle(kt){return(0,a.L6k)(kt)}bypassSecurityTrustScript(kt){return(0,a.eBb)(kt)}bypassSecurityTrustUrl(kt){return(0,a.LAX)(kt)}bypassSecurityTrustResourceUrl(kt){return(0,a.pB0)(kt)}}return ct.\u0275fac=function(kt){return new(kt||ct)(a.LFG(r.K0))},ct.\u0275prov=a.Yz7({token:ct,factory:function(kt){let dn=null;return dn=kt?new kt:function Rn(ct){return new _t(ct.get(r.K0))}(a.LFG(a.zs3)),dn},providedIn:"root"}),ct})()},55860:(m,S,i)=>{"use strict";i.d(S,{gz:()=>go,m2:()=>Bt,OD:()=>Ne,wm:()=>pl,F0:()=>gi,rH:()=>kn,Od:()=>fo,yS:()=>Ar,Bz:()=>Uc,lC:()=>Ii});var r=i(89724),a=i(70882),f=i(76666),c=i(59193);function e($e){return new a.y(Me=>{let _e;try{_e=$e()}catch(vt){return void Me.error(vt)}return(_e?(0,f.D)(_e):(0,c.c)()).subscribe(Me)})}var p=i(25917),y=i(26215),T=i(9112),C=i(40205),R=i(13410),L=i(6481),z=i(52441),W=i(79765),J=i(88002),ee=i(43190),ce=i(15257),ie=i(39761),U=i(42145),se=i(45435),ge=i(5304),ae=i(94612),he=i(12627),be=i(28049),we=i(19773),ue=i(68307),st=i(548),We=i(51307),Ve=i(68939),Be=i(63282),xe=i(11048);class je{constructor(Me,_e){this.id=Me,this.url=_e}}class Ne extends je{constructor(Me,_e,at="imperative",vt=null){super(Me,_e),this.navigationTrigger=at,this.restoredState=vt}toString(){return`NavigationStart(id: ${this.id}, url: '${this.url}')`}}class Bt extends je{constructor(Me,_e,at){super(Me,_e),this.urlAfterRedirects=at}toString(){return`NavigationEnd(id: ${this.id}, url: '${this.url}', urlAfterRedirects: '${this.urlAfterRedirects}')`}}class rt extends je{constructor(Me,_e,at){super(Me,_e),this.reason=at}toString(){return`NavigationCancel(id: ${this.id}, url: '${this.url}')`}}class en extends je{constructor(Me,_e,at){super(Me,_e),this.error=at}toString(){return`NavigationError(id: ${this.id}, url: '${this.url}', error: ${this.error})`}}class Pt extends je{constructor(Me,_e,at,vt){super(Me,_e),this.urlAfterRedirects=at,this.state=vt}toString(){return`RoutesRecognized(id: ${this.id}, url: '${this.url}', urlAfterRedirects: '${this.urlAfterRedirects}', state: ${this.state})`}}class Vt extends je{constructor(Me,_e,at,vt){super(Me,_e),this.urlAfterRedirects=at,this.state=vt}toString(){return`GuardsCheckStart(id: ${this.id}, url: '${this.url}', urlAfterRedirects: '${this.urlAfterRedirects}', state: ${this.state})`}}class hn extends je{constructor(Me,_e,at,vt,Qt){super(Me,_e),this.urlAfterRedirects=at,this.state=vt,this.shouldActivate=Qt}toString(){return`GuardsCheckEnd(id: ${this.id}, url: '${this.url}', urlAfterRedirects: '${this.urlAfterRedirects}', state: ${this.state}, shouldActivate: ${this.shouldActivate})`}}class vn extends je{constructor(Me,_e,at,vt){super(Me,_e),this.urlAfterRedirects=at,this.state=vt}toString(){return`ResolveStart(id: ${this.id}, url: '${this.url}', urlAfterRedirects: '${this.urlAfterRedirects}', state: ${this.state})`}}class mt extends je{constructor(Me,_e,at,vt){super(Me,_e),this.urlAfterRedirects=at,this.state=vt}toString(){return`ResolveEnd(id: ${this.id}, url: '${this.url}', urlAfterRedirects: '${this.urlAfterRedirects}', state: ${this.state})`}}class Nt{constructor(Me){this.route=Me}toString(){return`RouteConfigLoadStart(path: ${this.route.path})`}}class St{constructor(Me){this.route=Me}toString(){return`RouteConfigLoadEnd(path: ${this.route.path})`}}class Yt{constructor(Me){this.snapshot=Me}toString(){return`ChildActivationStart(path: '${this.snapshot.routeConfig&&this.snapshot.routeConfig.path||""}')`}}class Fn{constructor(Me){this.snapshot=Me}toString(){return`ChildActivationEnd(path: '${this.snapshot.routeConfig&&this.snapshot.routeConfig.path||""}')`}}class pr{constructor(Me){this.snapshot=Me}toString(){return`ActivationStart(path: '${this.snapshot.routeConfig&&this.snapshot.routeConfig.path||""}')`}}class Ei{constructor(Me){this.snapshot=Me}toString(){return`ActivationEnd(path: '${this.snapshot.routeConfig&&this.snapshot.routeConfig.path||""}')`}}class mi{constructor(Me,_e,at){this.routerEvent=Me,this.position=_e,this.anchor=at}toString(){return`Scroll(anchor: '${this.anchor}', position: '${this.position?`${this.position[0]}, ${this.position[1]}`:null}')`}}const ur="primary";class $r{constructor(Me){this.params=Me||{}}has(Me){return Object.prototype.hasOwnProperty.call(this.params,Me)}get(Me){if(this.has(Me)){const _e=this.params[Me];return Array.isArray(_e)?_e[0]:_e}return null}getAll(Me){if(this.has(Me)){const _e=this.params[Me];return Array.isArray(_e)?_e:[_e]}return[]}get keys(){return Object.keys(this.params)}}function Br($e){return new $r($e)}const Pn="ngNavigationCancelingError";function Xn($e){const Me=Error("NavigationCancelingError: "+$e);return Me[Pn]=!0,Me}function Qr($e,Me,_e){const at=_e.path.split("/");if(at.length>$e.length||"full"===_e.pathMatch&&(Me.hasChildren()||at.length<$e.length))return null;const vt={};for(let Qt=0;Qt<at.length;Qt++){const Ln=at[Qt],cr=$e[Qt];if(Ln.startsWith(":"))vt[Ln.substring(1)]=cr;else if(Ln!==cr.path)return null}return{consumed:$e.slice(0,at.length),posParams:vt}}function _i($e,Me){const _e=$e?Object.keys($e):void 0,at=Me?Object.keys(Me):void 0;if(!_e||!at||_e.length!=at.length)return!1;let vt;for(let Qt=0;Qt<_e.length;Qt++)if(vt=_e[Qt],!so($e[vt],Me[vt]))return!1;return!0}function so($e,Me){if(Array.isArray($e)&&Array.isArray(Me)){if($e.length!==Me.length)return!1;const _e=[...$e].sort(),at=[...Me].sort();return _e.every((vt,Qt)=>at[Qt]===vt)}return $e===Me}function Ro($e){return Array.prototype.concat.apply([],$e)}function Sr($e){return $e.length>0?$e[$e.length-1]:null}function un($e,Me){for(const _e in $e)$e.hasOwnProperty(_e)&&Me($e[_e],_e)}function jn($e){return(0,r.CqO)($e)?$e:(0,r.QGY)($e)?(0,f.D)(Promise.resolve($e)):(0,p.of)($e)}const Gn={exact:function hr($e,Me,_e){if(!vi($e.segments,Me.segments)||!Zn($e.segments,Me.segments,_e)||$e.numberOfChildren!==Me.numberOfChildren)return!1;for(const at in Me.children)if(!$e.children[at]||!hr($e.children[at],Me.children[at],_e))return!1;return!0},subset:ln},Xr={exact:function ii($e,Me){return _i($e,Me)},subset:function Ki($e,Me){return Object.keys(Me).length<=Object.keys($e).length&&Object.keys(Me).every(_e=>so($e[_e],Me[_e]))},ignored:()=>!0};function Zi($e,Me,_e){return Gn[_e.paths]($e.root,Me.root,_e.matrixParams)&&Xr[_e.queryParams]($e.queryParams,Me.queryParams)&&!("exact"===_e.fragment&&$e.fragment!==Me.fragment)}function ln($e,Me,_e){return Mn($e,Me,Me.segments,_e)}function Mn($e,Me,_e,at){if($e.segments.length>_e.length){const vt=$e.segments.slice(0,_e.length);return!(!vi(vt,_e)||Me.hasChildren()||!Zn(vt,_e,at))}if($e.segments.length===_e.length){if(!vi($e.segments,_e)||!Zn($e.segments,_e,at))return!1;for(const vt in Me.children)if(!$e.children[vt]||!ln($e.children[vt],Me.children[vt],at))return!1;return!0}{const vt=_e.slice(0,$e.segments.length),Qt=_e.slice($e.segments.length);return!!(vi($e.segments,vt)&&Zn($e.segments,vt,at)&&$e.children[ur])&&Mn($e.children[ur],Me,Qt,at)}}function Zn($e,Me,_e){return Me.every((at,vt)=>Xr[_e]($e[vt].parameters,at.parameters))}class cn{constructor(Me,_e,at){this.root=Me,this.queryParams=_e,this.fragment=at}get queryParamMap(){return this._queryParamMap||(this._queryParamMap=Br(this.queryParams)),this._queryParamMap}toString(){return Bi.serialize(this)}}class Sn{constructor(Me,_e){this.segments=Me,this.children=_e,this.parent=null,un(_e,(at,vt)=>at.parent=this)}hasChildren(){return this.numberOfChildren>0}get numberOfChildren(){return Object.keys(this.children).length}toString(){return to(this)}}class Or{constructor(Me,_e){this.path=Me,this.parameters=_e}get parameterMap(){return this._parameterMap||(this._parameterMap=Br(this.parameters)),this._parameterMap}toString(){return dn(this)}}function vi($e,Me){return $e.length===Me.length&&$e.every((_e,at)=>_e.path===Me[at].path)}class ao{}class dt{parse(Me){const _e=new Ko(Me);return new cn(_e.parseRootSegment(),_e.parseQueryParams(),_e.parseFragment())}serialize(Me){const _e=`/${Gt(Me.root,!0)}`,at=function Oi($e){const Me=Object.keys($e).map(_e=>{const at=$e[_e];return Array.isArray(at)?at.map(vt=>`${_t(_e)}=${_t(vt)}`).join("&"):`${_t(_e)}=${_t(at)}`}).filter(_e=>!!_e);return Me.length?`?${Me.join("&")}`:""}(Me.queryParams);return`${_e}${at}${"string"==typeof Me.fragment?`#${function Rt($e){return encodeURI($e)}(Me.fragment)}`:""}`}}const Bi=new dt;function to($e){return $e.segments.map(Me=>dn(Me)).join("/")}function Gt($e,Me){if(!$e.hasChildren())return to($e);if(Me){const _e=$e.children[ur]?Gt($e.children[ur],!1):"",at=[];return un($e.children,(vt,Qt)=>{Qt!==ur&&at.push(`${Qt}:${Gt(vt,!1)}`)}),at.length>0?`${_e}(${at.join("//")})`:_e}{const _e=function Ui($e,Me){let _e=[];return un($e.children,(at,vt)=>{vt===ur&&(_e=_e.concat(Me(at,vt)))}),un($e.children,(at,vt)=>{vt!==ur&&(_e=_e.concat(Me(at,vt)))}),_e}($e,(at,vt)=>vt===ur?[Gt($e.children[ur],!1)]:[`${vt}:${Gt(at,!1)}`]);return 1===Object.keys($e.children).length&&null!=$e.children[ur]?`${to($e)}/${_e[0]}`:`${to($e)}/(${_e.join("//")})`}}function Rn($e){return encodeURIComponent($e).replace(/%40/g,"@").replace(/%3A/gi,":").replace(/%24/g,"$").replace(/%2C/gi,",")}function _t($e){return Rn($e).replace(/%3B/gi,";")}function ct($e){return Rn($e).replace(/\(/g,"%28").replace(/\)/g,"%29").replace(/%26/gi,"&")}function pt($e){return decodeURIComponent($e)}function kt($e){return pt($e.replace(/\+/g,"%20"))}function dn($e){return`${ct($e.path)}${function mr($e){return Object.keys($e).map(Me=>`;${ct(Me)}=${ct($e[Me])}`).join("")}($e.parameters)}`}const di=/^[^\/()?;=#]+/;function Uo($e){const Me=$e.match(di);return Me?Me[0]:""}const Qo=/^[^=?&#]+/,Ai=/^[^&#]+/;class Ko{constructor(Me){this.url=Me,this.remaining=Me}parseRootSegment(){return this.consumeOptional("/"),""===this.remaining||this.peekStartsWith("?")||this.peekStartsWith("#")?new Sn([],{}):new Sn([],this.parseChildren())}parseQueryParams(){const Me={};if(this.consumeOptional("?"))do{this.parseQueryParam(Me)}while(this.consumeOptional("&"));return Me}parseFragment(){return this.consumeOptional("#")?decodeURIComponent(this.remaining):null}parseChildren(){if(""===this.remaining)return{};this.consumeOptional("/");const Me=[];for(this.peekStartsWith("(")||Me.push(this.parseSegment());this.peekStartsWith("/")&&!this.peekStartsWith("//")&&!this.peekStartsWith("/(");)this.capture("/"),Me.push(this.parseSegment());let _e={};this.peekStartsWith("/(")&&(this.capture("/"),_e=this.parseParens(!0));let at={};return this.peekStartsWith("(")&&(at=this.parseParens(!1)),(Me.length>0||Object.keys(_e).length>0)&&(at[ur]=new Sn(Me,_e)),at}parseSegment(){const Me=Uo(this.remaining);if(""===Me&&this.peekStartsWith(";"))throw new Error(`Empty path url segment cannot have parameters: '${this.remaining}'.`);return this.capture(Me),new Or(pt(Me),this.parseMatrixParams())}parseMatrixParams(){const Me={};for(;this.consumeOptional(";");)this.parseParam(Me);return Me}parseParam(Me){const _e=Uo(this.remaining);if(!_e)return;this.capture(_e);let at="";if(this.consumeOptional("=")){const vt=Uo(this.remaining);vt&&(at=vt,this.capture(at))}Me[pt(_e)]=pt(at)}parseQueryParam(Me){const _e=function lo($e){const Me=$e.match(Qo);return Me?Me[0]:""}(this.remaining);if(!_e)return;this.capture(_e);let at="";if(this.consumeOptional("=")){const Ln=function Fo($e){const Me=$e.match(Ai);return Me?Me[0]:""}(this.remaining);Ln&&(at=Ln,this.capture(at))}const vt=kt(_e),Qt=kt(at);if(Me.hasOwnProperty(vt)){let Ln=Me[vt];Array.isArray(Ln)||(Ln=[Ln],Me[vt]=Ln),Ln.push(Qt)}else Me[vt]=Qt}parseParens(Me){const _e={};for(this.capture("(");!this.consumeOptional(")")&&this.remaining.length>0;){const at=Uo(this.remaining),vt=this.remaining[at.length];if("/"!==vt&&")"!==vt&&";"!==vt)throw new Error(`Cannot parse url '${this.url}'`);let Qt;at.indexOf(":")>-1?(Qt=at.substr(0,at.indexOf(":")),this.capture(Qt),this.capture(":")):Me&&(Qt=ur);const Ln=this.parseChildren();_e[Qt]=1===Object.keys(Ln).length?Ln[ur]:new Sn([],Ln),this.consumeOptional("//")}return _e}peekStartsWith(Me){return this.remaining.startsWith(Me)}consumeOptional(Me){return!!this.peekStartsWith(Me)&&(this.remaining=this.remaining.substring(Me.length),!0)}capture(Me){if(!this.consumeOptional(Me))throw new Error(`Expected "${Me}".`)}}class qn{constructor(Me){this._root=Me}get root(){return this._root.value}parent(Me){const _e=this.pathFromRoot(Me);return _e.length>1?_e[_e.length-2]:null}children(Me){const _e=ei(Me,this._root);return _e?_e.children.map(at=>at.value):[]}firstChild(Me){const _e=ei(Me,this._root);return _e&&_e.children.length>0?_e.children[0].value:null}siblings(Me){const _e=wn(Me,this._root);return _e.length<2?[]:_e[_e.length-2].children.map(vt=>vt.value).filter(vt=>vt!==Me)}pathFromRoot(Me){return wn(Me,this._root).map(_e=>_e.value)}}function ei($e,Me){if($e===Me.value)return Me;for(const _e of Me.children){const at=ei($e,_e);if(at)return at}return null}function wn($e,Me){if($e===Me.value)return[Me];for(const _e of Me.children){const at=wn($e,_e);if(at.length)return at.unshift(Me),at}return[]}class Qn{constructor(Me,_e){this.value=Me,this.children=_e}toString(){return`TreeNode(${this.value})`}}function Fr($e){const Me={};return $e&&$e.children.forEach(_e=>Me[_e.value.outlet]=_e),Me}class oo extends qn{constructor(Me,_e){super(Me),this.snapshot=_e,yr(this,Me)}toString(){return this.snapshot.toString()}}function Li($e,Me){const _e=function yo($e,Me){const Ln=new er([],{},{},"",{},ur,Me,null,$e.root,-1,{});return new vr("",new Qn(Ln,[]))}($e,Me),at=new y.X([new Or("",{})]),vt=new y.X({}),Qt=new y.X({}),Ln=new y.X({}),cr=new y.X(""),ui=new go(at,vt,Ln,cr,Qt,ur,Me,_e.root);return ui.snapshot=_e.root,new oo(new Qn(ui,[]),_e)}class go{constructor(Me,_e,at,vt,Qt,Ln,cr,ui){this.url=Me,this.params=_e,this.queryParams=at,this.fragment=vt,this.data=Qt,this.outlet=Ln,this.component=cr,this._futureSnapshot=ui}get routeConfig(){return this._futureSnapshot.routeConfig}get root(){return this._routerState.root}get parent(){return this._routerState.parent(this)}get firstChild(){return this._routerState.firstChild(this)}get children(){return this._routerState.children(this)}get pathFromRoot(){return this._routerState.pathFromRoot(this)}get paramMap(){return this._paramMap||(this._paramMap=this.params.pipe((0,J.U)(Me=>Br(Me)))),this._paramMap}get queryParamMap(){return this._queryParamMap||(this._queryParamMap=this.queryParams.pipe((0,J.U)(Me=>Br(Me)))),this._queryParamMap}toString(){return this.snapshot?this.snapshot.toString():`Future(${this._futureSnapshot})`}}function Go($e,Me="emptyOnly"){const _e=$e.pathFromRoot;let at=0;if("always"!==Me)for(at=_e.length-1;at>=1;){const vt=_e[at],Qt=_e[at-1];if(vt.routeConfig&&""===vt.routeConfig.path)at--;else{if(Qt.component)break;at--}}return function ua($e){return $e.reduce((Me,_e)=>({params:Object.assign(Object.assign({},Me.params),_e.params),data:Object.assign(Object.assign({},Me.data),_e.data),resolve:Object.assign(Object.assign({},Me.resolve),_e._resolvedData)}),{params:{},data:{},resolve:{}})}(_e.slice(at))}class er{constructor(Me,_e,at,vt,Qt,Ln,cr,ui,Lo,Ta,_s){this.url=Me,this.params=_e,this.queryParams=at,this.fragment=vt,this.data=Qt,this.outlet=Ln,this.component=cr,this.routeConfig=ui,this._urlSegment=Lo,this._lastPathIndex=Ta,this._resolve=_s}get root(){return this._routerState.root}get parent(){return this._routerState.parent(this)}get firstChild(){return this._routerState.firstChild(this)}get children(){return this._routerState.children(this)}get pathFromRoot(){return this._routerState.pathFromRoot(this)}get paramMap(){return this._paramMap||(this._paramMap=Br(this.params)),this._paramMap}get queryParamMap(){return this._queryParamMap||(this._queryParamMap=Br(this.queryParams)),this._queryParamMap}toString(){return`Route(url:'${this.url.map(at=>at.toString()).join("/")}', path:'${this.routeConfig?this.routeConfig.path:""}')`}}class vr extends qn{constructor(Me,_e){super(_e),this.url=Me,yr(this,_e)}toString(){return or(this._root)}}function yr($e,Me){Me.value._routerState=$e,Me.children.forEach(_e=>yr($e,_e))}function or($e){const Me=$e.children.length>0?` { ${$e.children.map(or).join(", ")} } `:"";return`${$e.value}${Me}`}function si($e){if($e.snapshot){const Me=$e.snapshot,_e=$e._futureSnapshot;$e.snapshot=_e,_i(Me.queryParams,_e.queryParams)||$e.queryParams.next(_e.queryParams),Me.fragment!==_e.fragment&&$e.fragment.next(_e.fragment),_i(Me.params,_e.params)||$e.params.next(_e.params),function Ci($e,Me){if($e.length!==Me.length)return!1;for(let _e=0;_e<$e.length;++_e)if(!_i($e[_e],Me[_e]))return!1;return!0}(Me.url,_e.url)||$e.url.next(_e.url),_i(Me.data,_e.data)||$e.data.next(_e.data)}else $e.snapshot=$e._futureSnapshot,$e.data.next($e._futureSnapshot.data)}function pn($e,Me){const _e=_i($e.params,Me.params)&&function ri($e,Me){return vi($e,Me)&&$e.every((_e,at)=>_i(_e.parameters,Me[at].parameters))}($e.url,Me.url);return _e&&!(!$e.parent!=!Me.parent)&&(!$e.parent||pn($e.parent,Me.parent))}function Gr($e,Me,_e){if(_e&&$e.shouldReuseRoute(Me.value,_e.value.snapshot)){const at=_e.value;at._futureSnapshot=Me.value;const vt=function no($e,Me,_e){return Me.children.map(at=>{for(const vt of _e.children)if($e.shouldReuseRoute(at.value,vt.value.snapshot))return Gr($e,at,vt);return Gr($e,at)})}($e,Me,_e);return new Qn(at,vt)}{if($e.shouldAttach(Me.value)){const Qt=$e.retrieve(Me.value);if(null!==Qt){const Ln=Qt.route;return Ln.value._futureSnapshot=Me.value,Ln.children=Me.children.map(cr=>Gr($e,cr)),Ln}}const at=function mo($e){return new go(new y.X($e.url),new y.X($e.params),new y.X($e.queryParams),new y.X($e.fragment),new y.X($e.data),$e.outlet,$e.component,$e)}(Me.value),vt=Me.children.map(Qt=>Gr($e,Qt));return new Qn(at,vt)}}function Us($e){return"object"==typeof $e&&null!=$e&&!$e.outlets&&!$e.segmentPath}function cs($e){return"object"==typeof $e&&null!=$e&&$e.outlets}function es($e,Me,_e,at,vt){let Qt={};if(at&&un(at,(cr,ui)=>{Qt[ui]=Array.isArray(cr)?cr.map(Lo=>`${Lo}`):`${cr}`}),$e===Me)return new cn(_e,Qt,vt);const Ln=ga($e,Me,_e);return new cn(Ln,Qt,vt)}function ga($e,Me,_e){const at={};return un($e.children,(vt,Qt)=>{at[Qt]=vt===Me?_e:ga(vt,Me,_e)}),new Sn($e.segments,at)}class ya{constructor(Me,_e,at){if(this.isAbsolute=Me,this.numberOfDoubleDots=_e,this.commands=at,Me&&at.length>0&&Us(at[0]))throw new Error("Root segment cannot have matrix parameters");const vt=at.find(cs);if(vt&&vt!==Sr(at))throw new Error("{outlets:{}} has to be the last command")}toRoot(){return this.isAbsolute&&1===this.commands.length&&"/"==this.commands[0]}}class la{constructor(Me,_e,at){this.segmentGroup=Me,this.processChildren=_e,this.index=at}}function ml($e,Me,_e){if($e||($e=new Sn([],{})),0===$e.segments.length&&$e.hasChildren())return Zo($e,Me,_e);const at=function vs($e,Me,_e){let at=0,vt=Me;const Qt={match:!1,pathIndex:0,commandIndex:0};for(;vt<$e.segments.length;){if(at>=_e.length)return Qt;const Ln=$e.segments[vt],cr=_e[at];if(cs(cr))break;const ui=`${cr}`,Lo=at<_e.length-1?_e[at+1]:null;if(vt>0&&void 0===ui)break;if(ui&&Lo&&"object"==typeof Lo&&void 0===Lo.outlets){if(!Ys(ui,Lo,Ln))return Qt;at+=2}else{if(!Ys(ui,{},Ln))return Qt;at++}vt++}return{match:!0,pathIndex:vt,commandIndex:at}}($e,Me,_e),vt=_e.slice(at.commandIndex);if(at.match&&at.pathIndex<$e.segments.length){const Qt=new Sn($e.segments.slice(0,at.pathIndex),{});return Qt.children[ur]=new Sn($e.segments.slice(at.pathIndex),$e.children),Zo(Qt,0,vt)}return at.match&&0===vt.length?new Sn($e.segments,{}):at.match&&!$e.hasChildren()?Za($e,Me,_e):at.match?Zo($e,0,vt):Za($e,Me,_e)}function Zo($e,Me,_e){if(0===_e.length)return new Sn($e.segments,{});{const at=function To($e){return cs($e[0])?$e[0].outlets:{[ur]:$e}}(_e),vt={};return un(at,(Qt,Ln)=>{"string"==typeof Qt&&(Qt=[Qt]),null!==Qt&&(vt[Ln]=ml($e.children[Ln],Me,Qt))}),un($e.children,(Qt,Ln)=>{void 0===at[Ln]&&(vt[Ln]=Qt)}),new Sn($e.segments,vt)}}function Za($e,Me,_e){const at=$e.segments.slice(0,Me);let vt=0;for(;vt<_e.length;){const Qt=_e[vt];if(cs(Qt)){const ui=Is(Qt.outlets);return new Sn(at,ui)}if(0===vt&&Us(_e[0])){at.push(new Or($e.segments[Me].path,tl(_e[0]))),vt++;continue}const Ln=cs(Qt)?Qt.outlets[ur]:`${Qt}`,cr=vt<_e.length-1?_e[vt+1]:null;Ln&&cr&&Us(cr)?(at.push(new Or(Ln,tl(cr))),vt+=2):(at.push(new Or(Ln,{})),vt++)}return new Sn(at,{})}function Is($e){const Me={};return un($e,(_e,at)=>{"string"==typeof _e&&(_e=[_e]),null!==_e&&(Me[at]=Za(new Sn([],{}),0,_e))}),Me}function tl($e){const Me={};return un($e,(_e,at)=>Me[at]=`${_e}`),Me}function Ys($e,Me,_e){return $e==_e.path&&_i(Me,_e.parameters)}class Co{constructor(Me,_e,at,vt){this.routeReuseStrategy=Me,this.futureState=_e,this.currState=at,this.forwardEvent=vt}activate(Me){const _e=this.futureState._root,at=this.currState?this.currState._root:null;this.deactivateChildRoutes(_e,at,Me),si(this.futureState.root),this.activateChildRoutes(_e,at,Me)}deactivateChildRoutes(Me,_e,at){const vt=Fr(_e);Me.children.forEach(Qt=>{const Ln=Qt.value.outlet;this.deactivateRoutes(Qt,vt[Ln],at),delete vt[Ln]}),un(vt,(Qt,Ln)=>{this.deactivateRouteAndItsChildren(Qt,at)})}deactivateRoutes(Me,_e,at){const vt=Me.value,Qt=_e?_e.value:null;if(vt===Qt)if(vt.component){const Ln=at.getContext(vt.outlet);Ln&&this.deactivateChildRoutes(Me,_e,Ln.children)}else this.deactivateChildRoutes(Me,_e,at);else Qt&&this.deactivateRouteAndItsChildren(_e,at)}deactivateRouteAndItsChildren(Me,_e){Me.value.component&&this.routeReuseStrategy.shouldDetach(Me.value.snapshot)?this.detachAndStoreRouteSubtree(Me,_e):this.deactivateRouteAndOutlet(Me,_e)}detachAndStoreRouteSubtree(Me,_e){const at=_e.getContext(Me.value.outlet),vt=at&&Me.value.component?at.children:_e,Qt=Fr(Me);for(const Ln of Object.keys(Qt))this.deactivateRouteAndItsChildren(Qt[Ln],vt);if(at&&at.outlet){const Ln=at.outlet.detach(),cr=at.children.onOutletDeactivated();this.routeReuseStrategy.store(Me.value.snapshot,{componentRef:Ln,route:Me,contexts:cr})}}deactivateRouteAndOutlet(Me,_e){const at=_e.getContext(Me.value.outlet),vt=at&&Me.value.component?at.children:_e,Qt=Fr(Me);for(const Ln of Object.keys(Qt))this.deactivateRouteAndItsChildren(Qt[Ln],vt);at&&at.outlet&&(at.outlet.deactivate(),at.children.onOutletDeactivated(),at.attachRef=null,at.resolver=null,at.route=null)}activateChildRoutes(Me,_e,at){const vt=Fr(_e);Me.children.forEach(Qt=>{this.activateRoutes(Qt,vt[Qt.value.outlet],at),this.forwardEvent(new Ei(Qt.value.snapshot))}),Me.children.length&&this.forwardEvent(new Fn(Me.value.snapshot))}activateRoutes(Me,_e,at){const vt=Me.value,Qt=_e?_e.value:null;if(si(vt),vt===Qt)if(vt.component){const Ln=at.getOrCreateContext(vt.outlet);this.activateChildRoutes(Me,_e,Ln.children)}else this.activateChildRoutes(Me,_e,at);else if(vt.component){const Ln=at.getOrCreateContext(vt.outlet);if(this.routeReuseStrategy.shouldAttach(vt.snapshot)){const cr=this.routeReuseStrategy.retrieve(vt.snapshot);this.routeReuseStrategy.store(vt.snapshot,null),Ln.children.onOutletReAttached(cr.contexts),Ln.attachRef=cr.componentRef,Ln.route=cr.route.value,Ln.outlet&&Ln.outlet.attach(cr.componentRef,cr.route.value),si(cr.route.value),this.activateChildRoutes(Me,null,Ln.children)}else{const cr=function Ps($e){for(let Me=$e.parent;Me;Me=Me.parent){const _e=Me.routeConfig;if(_e&&_e._loadedConfig)return _e._loadedConfig;if(_e&&_e.component)return null}return null}(vt.snapshot),ui=cr?cr.module.componentFactoryResolver:null;Ln.attachRef=null,Ln.route=vt,Ln.resolver=ui,Ln.outlet&&Ln.outlet.activateWith(vt,ui),this.activateChildRoutes(Me,null,Ln.children)}}else this.activateChildRoutes(Me,null,at)}}class ps{constructor(Me,_e){this.routes=Me,this.module=_e}}function Oo($e){return"function"==typeof $e}function Qi($e){return $e instanceof cn}const Lt=Symbol("INITIAL_VALUE");function on(){return(0,ee.w)($e=>(0,T.aj)($e.map(Me=>Me.pipe((0,ce.q)(1),(0,ie.O)(Lt)))).pipe((0,U.R)((Me,_e)=>{let at=!1;return _e.reduce((vt,Qt,Ln)=>vt!==Lt?vt:(Qt===Lt&&(at=!0),at||!1!==Qt&&Ln!==_e.length-1&&!Qi(Qt)?vt:Qt),Me)},Lt),(0,se.h)(Me=>Me!==Lt),(0,J.U)(Me=>Qi(Me)?Me:!0===Me),(0,ce.q)(1)))}class Kr{constructor(){this.outlet=null,this.route=null,this.resolver=null,this.children=new bi,this.attachRef=null}}class bi{constructor(){this.contexts=new Map}onChildOutletCreated(Me,_e){const at=this.getOrCreateContext(Me);at.outlet=_e,this.contexts.set(Me,at)}onChildOutletDestroyed(Me){const _e=this.getContext(Me);_e&&(_e.outlet=null,_e.attachRef=null)}onOutletDeactivated(){const Me=this.contexts;return this.contexts=new Map,Me}onOutletReAttached(Me){this.contexts=Me}getOrCreateContext(Me){let _e=this.getContext(Me);return _e||(_e=new Kr,this.contexts.set(Me,_e)),_e}getContext(Me){return this.contexts.get(Me)||null}}let Ii=(()=>{class $e{constructor(_e,at,vt,Qt,Ln){this.parentContexts=_e,this.location=at,this.resolver=vt,this.changeDetector=Ln,this.activated=null,this._activatedRoute=null,this.activateEvents=new r.vpe,this.deactivateEvents=new r.vpe,this.attachEvents=new r.vpe,this.detachEvents=new r.vpe,this.name=Qt||ur,_e.onChildOutletCreated(this.name,this)}ngOnDestroy(){this.parentContexts.onChildOutletDestroyed(this.name)}ngOnInit(){if(!this.activated){const _e=this.parentContexts.getContext(this.name);_e&&_e.route&&(_e.attachRef?this.attach(_e.attachRef,_e.route):this.activateWith(_e.route,_e.resolver||null))}}get isActivated(){return!!this.activated}get component(){if(!this.activated)throw new Error("Outlet is not activated");return this.activated.instance}get activatedRoute(){if(!this.activated)throw new Error("Outlet is not activated");return this._activatedRoute}get activatedRouteData(){return this._activatedRoute?this._activatedRoute.snapshot.data:{}}detach(){if(!this.activated)throw new Error("Outlet is not activated");this.location.detach();const _e=this.activated;return this.activated=null,this._activatedRoute=null,this.detachEvents.emit(_e.instance),_e}attach(_e,at){this.activated=_e,this._activatedRoute=at,this.location.insert(_e.hostView),this.attachEvents.emit(_e.instance)}deactivate(){if(this.activated){const _e=this.component;this.activated.destroy(),this.activated=null,this._activatedRoute=null,this.deactivateEvents.emit(_e)}}activateWith(_e,at){if(this.isActivated)throw new Error("Cannot activate an already activated outlet");this._activatedRoute=_e;const Ln=(at=at||this.resolver).resolveComponentFactory(_e._futureSnapshot.routeConfig.component),cr=this.parentContexts.getOrCreateContext(this.name).children,ui=new hs(_e,cr,this.location.injector);this.activated=this.location.createComponent(Ln,this.location.length,ui),this.changeDetector.markForCheck(),this.activateEvents.emit(this.activated.instance)}}return $e.\u0275fac=function(_e){return new(_e||$e)(r.Y36(bi),r.Y36(r.s_b),r.Y36(r._Vd),r.$8M("name"),r.Y36(r.sBO))},$e.\u0275dir=r.lG2({type:$e,selectors:[["router-outlet"]],outputs:{activateEvents:"activate",deactivateEvents:"deactivate",attachEvents:"attach",detachEvents:"detach"},exportAs:["outlet"]}),$e})();class hs{constructor(Me,_e,at){this.route=Me,this.childContexts=_e,this.parent=at}get(Me,_e){return Me===go?this.route:Me===bi?this.childContexts:this.parent.get(Me,_e)}}let zo=(()=>{class $e{}return $e.\u0275fac=function(_e){return new(_e||$e)},$e.\u0275cmp=r.Xpm({type:$e,selectors:[["ng-component"]],decls:1,vars:0,template:function(_e,at){1&_e&&r._UZ(0,"router-outlet")},directives:[Ii],encapsulation:2}),$e})();function Ls($e,Me=""){for(let _e=0;_e<$e.length;_e++){const at=$e[_e];Xs(at,vl(Me,at))}}function Xs($e,Me){$e.children&&Ls($e.children,Me)}function vl($e,Me){return Me?$e||Me.path?$e&&!Me.path?`${$e}/`:!$e&&Me.path?Me.path:`${$e}/${Me.path}`:"":$e}function ol($e){const Me=$e.children&&$e.children.map(ol),_e=Me?Object.assign(Object.assign({},$e),{children:Me}):Object.assign({},$e);return!_e.component&&(Me||_e.loadChildren)&&_e.outlet&&_e.outlet!==ur&&(_e.component=zo),_e}function Wl($e){return $e.outlet||ur}function Qu($e,Me){const _e=$e.filter(at=>Wl(at)===Me);return _e.push(...$e.filter(at=>Wl(at)!==Me)),_e}const hc={matched:!1,consumedSegments:[],remainingSegments:[],parameters:{},positionalParamSegments:{}};function Tl($e,Me,_e){var at;if(""===Me.path)return"full"===Me.pathMatch&&($e.hasChildren()||_e.length>0)?Object.assign({},hc):{matched:!0,consumedSegments:[],remainingSegments:_e,parameters:{},positionalParamSegments:{}};const Qt=(Me.matcher||Qr)(_e,$e,Me);if(!Qt)return Object.assign({},hc);const Ln={};un(Qt.posParams,(ui,Lo)=>{Ln[Lo]=ui.path});const cr=Qt.consumed.length>0?Object.assign(Object.assign({},Ln),Qt.consumed[Qt.consumed.length-1].parameters):Ln;return{matched:!0,consumedSegments:Qt.consumed,remainingSegments:_e.slice(Qt.consumed.length),parameters:cr,positionalParamSegments:null!==(at=Qt.posParams)&&void 0!==at?at:{}}}function _c($e,Me,_e,at,vt="corrected"){if(_e.length>0&&function Qa($e,Me,_e){return _e.some(at=>tu($e,Me,at)&&Wl(at)!==ur)}($e,_e,at)){const Ln=new Sn(Me,function Ku($e,Me,_e,at){const vt={};vt[ur]=at,at._sourceSegment=$e,at._segmentIndexShift=Me.length;for(const Qt of _e)if(""===Qt.path&&Wl(Qt)!==ur){const Ln=new Sn([],{});Ln._sourceSegment=$e,Ln._segmentIndexShift=Me.length,vt[Wl(Qt)]=Ln}return vt}($e,Me,at,new Sn(_e,$e.children)));return Ln._sourceSegment=$e,Ln._segmentIndexShift=Me.length,{segmentGroup:Ln,slicedSegments:[]}}if(0===_e.length&&function Mc($e,Me,_e){return _e.some(at=>tu($e,Me,at))}($e,_e,at)){const Ln=new Sn($e.segments,function Pl($e,Me,_e,at,vt,Qt){const Ln={};for(const cr of at)if(tu($e,_e,cr)&&!vt[Wl(cr)]){const ui=new Sn([],{});ui._sourceSegment=$e,ui._segmentIndexShift="legacy"===Qt?$e.segments.length:Me.length,Ln[Wl(cr)]=ui}return Object.assign(Object.assign({},vt),Ln)}($e,Me,_e,at,$e.children,vt));return Ln._sourceSegment=$e,Ln._segmentIndexShift=Me.length,{segmentGroup:Ln,slicedSegments:_e}}const Qt=new Sn($e.segments,$e.children);return Qt._sourceSegment=$e,Qt._segmentIndexShift=Me.length,{segmentGroup:Qt,slicedSegments:_e}}function tu($e,Me,_e){return(!($e.hasChildren()||Me.length>0)||"full"!==_e.pathMatch)&&""===_e.path}function Wa($e,Me,_e,at){return!!(Wl($e)===at||at!==ur&&tu(Me,_e,$e))&&("**"===$e.path||Tl(Me,$e,_e).matched)}function Ml($e,Me,_e){return 0===Me.length&&!$e.children[_e]}class Hl{constructor(Me){this.segmentGroup=Me||null}}class Ua{constructor(Me){this.urlTree=Me}}function Qe($e){return(0,C._)(new Hl($e))}function zt($e){return(0,C._)(new Ua($e))}class qr{constructor(Me,_e,at,vt,Qt){this.configLoader=_e,this.urlSerializer=at,this.urlTree=vt,this.config=Qt,this.allowRedirects=!0,this.ngModule=Me.get(r.h0i)}apply(){const Me=_c(this.urlTree.root,[],[],this.config).segmentGroup,_e=new Sn(Me.segments,Me.children);return this.expandSegmentGroup(this.ngModule,this.config,_e,ur).pipe((0,J.U)(Qt=>this.createUrlTree(as(Qt),this.urlTree.queryParams,this.urlTree.fragment))).pipe((0,ge.K)(Qt=>{if(Qt instanceof Ua)return this.allowRedirects=!1,this.match(Qt.urlTree);throw Qt instanceof Hl?this.noMatchError(Qt):Qt}))}match(Me){return this.expandSegmentGroup(this.ngModule,this.config,Me.root,ur).pipe((0,J.U)(vt=>this.createUrlTree(as(vt),Me.queryParams,Me.fragment))).pipe((0,ge.K)(vt=>{throw vt instanceof Hl?this.noMatchError(vt):vt}))}noMatchError(Me){return new Error(`Cannot match any routes. URL Segment: '${Me.segmentGroup}'`)}createUrlTree(Me,_e,at){const vt=Me.segments.length>0?new Sn([],{[ur]:Me}):Me;return new cn(vt,_e,at)}expandSegmentGroup(Me,_e,at,vt){return 0===at.segments.length&&at.hasChildren()?this.expandChildren(Me,_e,at).pipe((0,J.U)(Qt=>new Sn([],Qt))):this.expandSegment(Me,at,_e,at.segments,vt,!0)}expandChildren(Me,_e,at){const vt=[];for(const Qt of Object.keys(at.children))"primary"===Qt?vt.unshift(Qt):vt.push(Qt);return(0,f.D)(vt).pipe((0,ae.b)(Qt=>{const Ln=at.children[Qt],cr=Qu(_e,Qt);return this.expandSegmentGroup(Me,cr,Ln,Qt).pipe((0,J.U)(ui=>({segment:ui,outlet:Qt})))}),(0,U.R)((Qt,Ln)=>(Qt[Ln.outlet]=Ln.segment,Qt),{}),(0,he.Z)())}expandSegment(Me,_e,at,vt,Qt,Ln){return(0,f.D)(at).pipe((0,ae.b)(cr=>this.expandSegmentAgainstRoute(Me,_e,at,cr,vt,Qt,Ln).pipe((0,ge.K)(Lo=>{if(Lo instanceof Hl)return(0,p.of)(null);throw Lo}))),(0,be.P)(cr=>!!cr),(0,ge.K)((cr,ui)=>{if(cr instanceof R.K||"EmptyError"===cr.name)return Ml(_e,vt,Qt)?(0,p.of)(new Sn([],{})):Qe(_e);throw cr}))}expandSegmentAgainstRoute(Me,_e,at,vt,Qt,Ln,cr){return Wa(vt,_e,Qt,Ln)?void 0===vt.redirectTo?this.matchSegmentAgainstRoute(Me,_e,vt,Qt,Ln):cr&&this.allowRedirects?this.expandSegmentAgainstRouteUsingRedirect(Me,_e,at,vt,Qt,Ln):Qe(_e):Qe(_e)}expandSegmentAgainstRouteUsingRedirect(Me,_e,at,vt,Qt,Ln){return"**"===vt.path?this.expandWildCardWithParamsAgainstRouteUsingRedirect(Me,at,vt,Ln):this.expandRegularSegmentAgainstRouteUsingRedirect(Me,_e,at,vt,Qt,Ln)}expandWildCardWithParamsAgainstRouteUsingRedirect(Me,_e,at,vt){const Qt=this.applyRedirectCommands([],at.redirectTo,{});return at.redirectTo.startsWith("/")?zt(Qt):this.lineralizeSegments(at,Qt).pipe((0,we.zg)(Ln=>{const cr=new Sn(Ln,{});return this.expandSegment(Me,cr,_e,Ln,vt,!1)}))}expandRegularSegmentAgainstRouteUsingRedirect(Me,_e,at,vt,Qt,Ln){const{matched:cr,consumedSegments:ui,remainingSegments:Lo,positionalParamSegments:Ta}=Tl(_e,vt,Qt);if(!cr)return Qe(_e);const _s=this.applyRedirectCommands(ui,vt.redirectTo,Ta);return vt.redirectTo.startsWith("/")?zt(_s):this.lineralizeSegments(vt,_s).pipe((0,we.zg)(ha=>this.expandSegment(Me,_e,at,ha.concat(Lo),Ln,!1)))}matchSegmentAgainstRoute(Me,_e,at,vt,Qt){if("**"===at.path)return at.loadChildren?(at._loadedConfig?(0,p.of)(at._loadedConfig):this.configLoader.load(Me.injector,at)).pipe((0,J.U)(_s=>(at._loadedConfig=_s,new Sn(vt,{})))):(0,p.of)(new Sn(vt,{}));const{matched:Ln,consumedSegments:cr,remainingSegments:ui}=Tl(_e,at,vt);return Ln?this.getChildConfig(Me,at,vt).pipe((0,we.zg)(Ta=>{const _s=Ta.module,ha=Ta.routes,{segmentGroup:Ca,slicedSegments:Ru}=_c(_e,cr,ui,ha),lc=new Sn(Ca.segments,Ca.children);if(0===Ru.length&&lc.hasChildren())return this.expandChildren(_s,ha,lc).pipe((0,J.U)(vc=>new Sn(cr,vc)));if(0===ha.length&&0===Ru.length)return(0,p.of)(new Sn(cr,{}));const Fa=Wl(at)===Qt;return this.expandSegment(_s,lc,ha,Ru,Fa?ur:Qt,!0).pipe((0,J.U)(mc=>new Sn(cr.concat(mc.segments),mc.children)))})):Qe(_e)}getChildConfig(Me,_e,at){return _e.children?(0,p.of)(new ps(_e.children,Me)):_e.loadChildren?void 0!==_e._loadedConfig?(0,p.of)(_e._loadedConfig):this.runCanLoadGuards(Me.injector,_e,at).pipe((0,we.zg)(vt=>vt?this.configLoader.load(Me.injector,_e).pipe((0,J.U)(Qt=>(_e._loadedConfig=Qt,Qt))):function jt($e){return(0,C._)(Xn(`Cannot load children because the guard of the route "path: '${$e.path}'" returned false`))}(_e))):(0,p.of)(new ps([],Me))}runCanLoadGuards(Me,_e,at){const vt=_e.canLoad;if(!vt||0===vt.length)return(0,p.of)(!0);const Qt=vt.map(Ln=>{const cr=Me.get(Ln);let ui;if(function tt($e){return $e&&Oo($e.canLoad)}(cr))ui=cr.canLoad(_e,at);else{if(!Oo(cr))throw new Error("Invalid CanLoad guard");ui=cr(_e,at)}return jn(ui)});return(0,p.of)(Qt).pipe(on(),(0,ue.b)(Ln=>{if(!Qi(Ln))return;const cr=Xn(`Redirecting to "${this.urlSerializer.serialize(Ln)}"`);throw cr.url=Ln,cr}),(0,J.U)(Ln=>!0===Ln))}lineralizeSegments(Me,_e){let at=[],vt=_e.root;for(;;){if(at=at.concat(vt.segments),0===vt.numberOfChildren)return(0,p.of)(at);if(vt.numberOfChildren>1||!vt.children[ur])return(0,C._)(new Error(`Only absolute redirects can have named outlets. redirectTo: '${Me.redirectTo}'`));vt=vt.children[ur]}}applyRedirectCommands(Me,_e,at){return this.applyRedirectCreatreUrlTree(_e,this.urlSerializer.parse(_e),Me,at)}applyRedirectCreatreUrlTree(Me,_e,at,vt){const Qt=this.createSegmentGroup(Me,_e.root,at,vt);return new cn(Qt,this.createQueryParams(_e.queryParams,this.urlTree.queryParams),_e.fragment)}createQueryParams(Me,_e){const at={};return un(Me,(vt,Qt)=>{if("string"==typeof vt&&vt.startsWith(":")){const cr=vt.substring(1);at[Qt]=_e[cr]}else at[Qt]=vt}),at}createSegmentGroup(Me,_e,at,vt){const Qt=this.createSegments(Me,_e.segments,at,vt);let Ln={};return un(_e.children,(cr,ui)=>{Ln[ui]=this.createSegmentGroup(Me,cr,at,vt)}),new Sn(Qt,Ln)}createSegments(Me,_e,at,vt){return _e.map(Qt=>Qt.path.startsWith(":")?this.findPosParam(Me,Qt,vt):this.findOrReturn(Qt,at))}findPosParam(Me,_e,at){const vt=at[_e.path.substring(1)];if(!vt)throw new Error(`Cannot redirect to '${Me}'. Cannot find '${_e.path}'.`);return vt}findOrReturn(Me,_e){let at=0;for(const vt of _e){if(vt.path===Me.path)return _e.splice(at),vt;at++}return Me}}function as($e){const Me={};for(const at of Object.keys($e.children)){const Qt=as($e.children[at]);(Qt.segments.length>0||Qt.hasChildren())&&(Me[at]=Qt)}return function Di($e){if(1===$e.numberOfChildren&&$e.children[ur]){const Me=$e.children[ur];return new Sn($e.segments.concat(Me.segments),Me.children)}return $e}(new Sn($e.segments,Me))}class As{constructor(Me){this.path=Me,this.route=this.path[this.path.length-1]}}class Ns{constructor(Me,_e){this.component=Me,this.route=_e}}function Io($e,Me,_e){const at=$e._root;return lt(at,Me?Me._root:null,_e,[at.value])}function sl($e,Me,_e){const at=function Bs($e){if(!$e)return null;for(let Me=$e.parent;Me;Me=Me.parent){const _e=Me.routeConfig;if(_e&&_e._loadedConfig)return _e._loadedConfig}return null}(Me);return(at?at.module.injector:_e).get($e)}function lt($e,Me,_e,at,vt={canDeactivateChecks:[],canActivateChecks:[]}){const Qt=Fr(Me);return $e.children.forEach(Ln=>{(function Xe($e,Me,_e,at,vt={canDeactivateChecks:[],canActivateChecks:[]}){const Qt=$e.value,Ln=Me?Me.value:null,cr=_e?_e.getContext($e.value.outlet):null;if(Ln&&Qt.routeConfig===Ln.routeConfig){const ui=function ke($e,Me,_e){if("function"==typeof _e)return _e($e,Me);switch(_e){case"pathParamsChange":return!vi($e.url,Me.url);case"pathParamsOrQueryParamsChange":return!vi($e.url,Me.url)||!_i($e.queryParams,Me.queryParams);case"always":return!0;case"paramsOrQueryParamsChange":return!pn($e,Me)||!_i($e.queryParams,Me.queryParams);default:return!pn($e,Me)}}(Ln,Qt,Qt.routeConfig.runGuardsAndResolvers);ui?vt.canActivateChecks.push(new As(at)):(Qt.data=Ln.data,Qt._resolvedData=Ln._resolvedData),lt($e,Me,Qt.component?cr?cr.children:null:_e,at,vt),ui&&cr&&cr.outlet&&cr.outlet.isActivated&&vt.canDeactivateChecks.push(new Ns(cr.outlet.component,Ln))}else Ln&&Ut(Me,cr,vt),vt.canActivateChecks.push(new As(at)),lt($e,null,Qt.component?cr?cr.children:null:_e,at,vt)})(Ln,Qt[Ln.value.outlet],_e,at.concat([Ln.value]),vt),delete Qt[Ln.value.outlet]}),un(Qt,(Ln,cr)=>Ut(Ln,_e.getContext(cr),vt)),vt}function Ut($e,Me,_e){const at=Fr($e),vt=$e.value;un(at,(Qt,Ln)=>{Ut(Qt,vt.component?Me?Me.children.getContext(Ln):null:Me,_e)}),_e.canDeactivateChecks.push(new Ns(vt.component&&Me&&Me.outlet&&Me.outlet.isActivated?Me.outlet.component:null,vt))}class oa{}function Ia($e){return new a.y(Me=>Me.error($e))}class qu{constructor(Me,_e,at,vt,Qt,Ln){this.rootComponentType=Me,this.config=_e,this.urlTree=at,this.url=vt,this.paramsInheritanceStrategy=Qt,this.relativeLinkResolution=Ln}recognize(){const Me=_c(this.urlTree.root,[],[],this.config.filter(Ln=>void 0===Ln.redirectTo),this.relativeLinkResolution).segmentGroup,_e=this.processSegmentGroup(this.config,Me,ur);if(null===_e)return null;const at=new er([],Object.freeze({}),Object.freeze(Object.assign({},this.urlTree.queryParams)),this.urlTree.fragment,{},ur,this.rootComponentType,null,this.urlTree.root,-1,{}),vt=new Qn(at,_e),Qt=new vr(this.url,vt);return this.inheritParamsAndData(Qt._root),Qt}inheritParamsAndData(Me){const _e=Me.value,at=Go(_e,this.paramsInheritanceStrategy);_e.params=Object.freeze(at.params),_e.data=Object.freeze(at.data),Me.children.forEach(vt=>this.inheritParamsAndData(vt))}processSegmentGroup(Me,_e,at){return 0===_e.segments.length&&_e.hasChildren()?this.processChildren(Me,_e):this.processSegment(Me,_e,_e.segments,at)}processChildren(Me,_e){const at=[];for(const Qt of Object.keys(_e.children)){const Ln=_e.children[Qt],cr=Qu(Me,Qt),ui=this.processSegmentGroup(cr,Ln,Qt);if(null===ui)return null;at.push(...ui)}const vt=nu(at);return function bl($e){$e.sort((Me,_e)=>Me.value.outlet===ur?-1:_e.value.outlet===ur?1:Me.value.outlet.localeCompare(_e.value.outlet))}(vt),vt}processSegment(Me,_e,at,vt){for(const Qt of Me){const Ln=this.processSegmentAgainstRoute(Qt,_e,at,vt);if(null!==Ln)return Ln}return Ml(_e,at,vt)?[]:null}processSegmentAgainstRoute(Me,_e,at,vt){if(Me.redirectTo||!Wa(Me,_e,at,vt))return null;let Qt,Ln=[],cr=[];if("**"===Me.path){const Ca=at.length>0?Sr(at).parameters:{};Qt=new er(at,Ca,Object.freeze(Object.assign({},this.urlTree.queryParams)),this.urlTree.fragment,ec(Me),Wl(Me),Me.component,Me,yu(_e),rd(_e)+at.length,au(Me))}else{const Ca=Tl(_e,Me,at);if(!Ca.matched)return null;Ln=Ca.consumedSegments,cr=Ca.remainingSegments,Qt=new er(Ln,Ca.parameters,Object.freeze(Object.assign({},this.urlTree.queryParams)),this.urlTree.fragment,ec(Me),Wl(Me),Me.component,Me,yu(_e),rd(_e)+Ln.length,au(Me))}const ui=function su($e){return $e.children?$e.children:$e.loadChildren?$e._loadedConfig.routes:[]}(Me),{segmentGroup:Lo,slicedSegments:Ta}=_c(_e,Ln,cr,ui.filter(Ca=>void 0===Ca.redirectTo),this.relativeLinkResolution);if(0===Ta.length&&Lo.hasChildren()){const Ca=this.processChildren(ui,Lo);return null===Ca?null:[new Qn(Qt,Ca)]}if(0===ui.length&&0===Ta.length)return[new Qn(Qt,[])];const _s=Wl(Me)===vt,ha=this.processSegment(ui,Lo,Ta,_s?ur:vt);return null===ha?null:[new Qn(Qt,ha)]}}function vu($e){const Me=$e.value.routeConfig;return Me&&""===Me.path&&void 0===Me.redirectTo}function nu($e){const Me=[],_e=new Set;for(const at of $e){if(!vu(at)){Me.push(at);continue}const vt=Me.find(Qt=>at.value.routeConfig===Qt.value.routeConfig);void 0!==vt?(vt.children.push(...at.children),_e.add(vt)):Me.push(at)}for(const at of _e){const vt=nu(at.children);Me.push(new Qn(at.value,vt))}return Me.filter(at=>!_e.has(at))}function yu($e){let Me=$e;for(;Me._sourceSegment;)Me=Me._sourceSegment;return Me}function rd($e){let Me=$e,_e=Me._segmentIndexShift?Me._segmentIndexShift:0;for(;Me._sourceSegment;)Me=Me._sourceSegment,_e+=Me._segmentIndexShift?Me._segmentIndexShift:0;return _e-1}function ec($e){return $e.data||{}}function au($e){return $e.resolve||{}}function wu($e){return[...Object.keys($e),...Object.getOwnPropertySymbols($e)]}function Bo($e){return(0,ee.w)(Me=>{const _e=$e(Me);return _e?(0,f.D)(_e).pipe((0,J.U)(()=>Me)):(0,p.of)(Me)})}class j extends class Er{shouldDetach(Me){return!1}store(Me,_e){}shouldAttach(Me){return!1}retrieve(Me){return null}shouldReuseRoute(Me,_e){return Me.routeConfig===_e.routeConfig}}{}const Ce=new r.OlP("ROUTES");class nt{constructor(Me,_e,at,vt){this.injector=Me,this.compiler=_e,this.onLoadStartListener=at,this.onLoadEndListener=vt}load(Me,_e){if(_e._loader$)return _e._loader$;this.onLoadStartListener&&this.onLoadStartListener(_e);const vt=this.loadModuleFactory(_e.loadChildren).pipe((0,J.U)(Qt=>{this.onLoadEndListener&&this.onLoadEndListener(_e);const Ln=Qt.create(Me);return new ps(Ro(Ln.injector.get(Ce,void 0,r.XFs.Self|r.XFs.Optional)).map(ol),Ln)}),(0,ge.K)(Qt=>{throw _e._loader$=void 0,Qt}));return _e._loader$=new z.c(vt,()=>new W.xQ).pipe((0,We.x)()),_e._loader$}loadModuleFactory(Me){return jn(Me()).pipe((0,we.zg)(_e=>_e instanceof r.YKP?(0,p.of)(_e):(0,f.D)(this.compiler.compileModuleAsync(_e))))}}class wt{shouldProcessUrl(Me){return!0}extract(Me){return Me}merge(Me,_e){return Me}}function sn($e){throw $e}function Cn($e,Me,_e){return Me.parse("/")}function _r($e,Me){return(0,p.of)(null)}const ni={paths:"exact",fragment:"ignored",matrixParams:"ignored",queryParams:"exact"},fi={paths:"subset",fragment:"ignored",matrixParams:"ignored",queryParams:"subset"};let gi=(()=>{class $e{constructor(_e,at,vt,Qt,Ln,cr,ui){this.rootComponentType=_e,this.urlSerializer=at,this.rootContexts=vt,this.location=Qt,this.config=ui,this.lastSuccessfulNavigation=null,this.currentNavigation=null,this.disposed=!1,this.navigationId=0,this.currentPageId=0,this.isNgZoneEnabled=!1,this.events=new W.xQ,this.errorHandler=sn,this.malformedUriErrorHandler=Cn,this.navigated=!1,this.lastSuccessfulId=-1,this.hooks={beforePreactivation:_r,afterPreactivation:_r},this.urlHandlingStrategy=new wt,this.routeReuseStrategy=new j,this.onSameUrlNavigation="ignore",this.paramsInheritanceStrategy="emptyOnly",this.urlUpdateStrategy="deferred",this.relativeLinkResolution="corrected",this.canceledNavigationResolution="replace",this.ngModule=Ln.get(r.h0i),this.console=Ln.get(r.c2e);const _s=Ln.get(r.R0b);this.isNgZoneEnabled=_s instanceof r.R0b&&r.R0b.isInAngularZone(),this.resetConfig(ui),this.currentUrlTree=function Jn(){return new cn(new Sn([],{}),{},null)}(),this.rawUrlTree=this.currentUrlTree,this.browserUrlTree=this.currentUrlTree,this.configLoader=new nt(Ln,cr,ha=>this.triggerEvent(new Nt(ha)),ha=>this.triggerEvent(new St(ha))),this.routerState=Li(this.currentUrlTree,this.rootComponentType),this.transitions=new y.X({id:0,targetPageId:0,currentUrlTree:this.currentUrlTree,currentRawUrl:this.currentUrlTree,extractedUrl:this.urlHandlingStrategy.extract(this.currentUrlTree),urlAfterRedirects:this.urlHandlingStrategy.extract(this.currentUrlTree),rawUrl:this.currentUrlTree,extras:{},resolve:null,reject:null,promise:Promise.resolve(!0),source:"imperative",restoredState:null,currentSnapshot:this.routerState.snapshot,targetSnapshot:null,currentRouterState:this.routerState,targetRouterState:null,guards:{canActivateChecks:[],canDeactivateChecks:[]},guardsResult:null}),this.navigations=this.setupNavigations(this.transitions),this.processNavigations()}get browserPageId(){var _e;return null===(_e=this.location.getState())||void 0===_e?void 0:_e.\u0275routerPageId}setupNavigations(_e){const at=this.events;return _e.pipe((0,se.h)(vt=>0!==vt.id),(0,J.U)(vt=>Object.assign(Object.assign({},vt),{extractedUrl:this.urlHandlingStrategy.extract(vt.rawUrl)})),(0,ee.w)(vt=>{let Qt=!1,Ln=!1;return(0,p.of)(vt).pipe((0,ue.b)(cr=>{this.currentNavigation={id:cr.id,initialUrl:cr.currentRawUrl,extractedUrl:cr.extractedUrl,trigger:cr.source,extras:cr.extras,previousNavigation:this.lastSuccessfulNavigation?Object.assign(Object.assign({},this.lastSuccessfulNavigation),{previousNavigation:null}):null}}),(0,ee.w)(cr=>{const ui=this.browserUrlTree.toString(),Lo=!this.navigated||cr.extractedUrl.toString()!==ui||ui!==this.currentUrlTree.toString();if(("reload"===this.onSameUrlNavigation||Lo)&&this.urlHandlingStrategy.shouldProcessUrl(cr.rawUrl))return Dr(cr.source)&&(this.browserUrlTree=cr.extractedUrl),(0,p.of)(cr).pipe((0,ee.w)(_s=>{const ha=this.transitions.getValue();return at.next(new Ne(_s.id,this.serializeUrl(_s.extractedUrl),_s.source,_s.restoredState)),ha!==this.transitions.getValue()?c.E:Promise.resolve(_s)}),function js($e,Me,_e,at){return(0,ee.w)(vt=>function zn($e,Me,_e,at,vt){return new qr($e,Me,_e,at,vt).apply()}($e,Me,_e,vt.extractedUrl,at).pipe((0,J.U)(Qt=>Object.assign(Object.assign({},vt),{urlAfterRedirects:Qt}))))}(this.ngModule.injector,this.configLoader,this.urlSerializer,this.config),(0,ue.b)(_s=>{this.currentNavigation=Object.assign(Object.assign({},this.currentNavigation),{finalUrl:_s.urlAfterRedirects})}),function uu($e,Me,_e,at,vt){return(0,we.zg)(Qt=>function ys($e,Me,_e,at,vt="emptyOnly",Qt="legacy"){try{const Ln=new qu($e,Me,_e,at,vt,Qt).recognize();return null===Ln?Ia(new oa):(0,p.of)(Ln)}catch(Ln){return Ia(Ln)}}($e,Me,Qt.urlAfterRedirects,_e(Qt.urlAfterRedirects),at,vt).pipe((0,J.U)(Ln=>Object.assign(Object.assign({},Qt),{targetSnapshot:Ln}))))}(this.rootComponentType,this.config,_s=>this.serializeUrl(_s),this.paramsInheritanceStrategy,this.relativeLinkResolution),(0,ue.b)(_s=>{if("eager"===this.urlUpdateStrategy){if(!_s.extras.skipLocationChange){const Ca=this.urlHandlingStrategy.merge(_s.urlAfterRedirects,_s.rawUrl);this.setBrowserUrl(Ca,_s)}this.browserUrlTree=_s.urlAfterRedirects}const ha=new Pt(_s.id,this.serializeUrl(_s.extractedUrl),this.serializeUrl(_s.urlAfterRedirects),_s.targetSnapshot);at.next(ha)}));if(Lo&&this.rawUrlTree&&this.urlHandlingStrategy.shouldProcessUrl(this.rawUrlTree)){const{id:ha,extractedUrl:Ca,source:Ru,restoredState:lc,extras:Fa}=cr,nl=new Ne(ha,this.serializeUrl(Ca),Ru,lc);at.next(nl);const mc=Li(Ca,this.rootComponentType).snapshot;return(0,p.of)(Object.assign(Object.assign({},cr),{targetSnapshot:mc,urlAfterRedirects:Ca,extras:Object.assign(Object.assign({},Fa),{skipLocationChange:!1,replaceUrl:!1})}))}return this.rawUrlTree=cr.rawUrl,cr.resolve(null),c.E}),Bo(cr=>{const{targetSnapshot:ui,id:Lo,extractedUrl:Ta,rawUrl:_s,extras:{skipLocationChange:ha,replaceUrl:Ca}}=cr;return this.hooks.beforePreactivation(ui,{navigationId:Lo,appliedUrlTree:Ta,rawUrlTree:_s,skipLocationChange:!!ha,replaceUrl:!!Ca})}),(0,ue.b)(cr=>{const ui=new Vt(cr.id,this.serializeUrl(cr.extractedUrl),this.serializeUrl(cr.urlAfterRedirects),cr.targetSnapshot);this.triggerEvent(ui)}),(0,J.U)(cr=>Object.assign(Object.assign({},cr),{guards:Io(cr.targetSnapshot,cr.currentSnapshot,this.rootContexts)})),function pi($e,Me){return(0,we.zg)(_e=>{const{targetSnapshot:at,currentSnapshot:vt,guards:{canActivateChecks:Qt,canDeactivateChecks:Ln}}=_e;return 0===Ln.length&&0===Qt.length?(0,p.of)(Object.assign(Object.assign({},_e),{guardsResult:!0})):function Wo($e,Me,_e,at){return(0,f.D)($e).pipe((0,we.zg)(vt=>function Hi($e,Me,_e,at,vt){const Qt=Me&&Me.routeConfig?Me.routeConfig.canDeactivate:null;if(!Qt||0===Qt.length)return(0,p.of)(!0);const Ln=Qt.map(cr=>{const ui=sl(cr,Me,vt);let Lo;if(function Le($e){return $e&&Oo($e.canDeactivate)}(ui))Lo=jn(ui.canDeactivate($e,Me,_e,at));else{if(!Oo(ui))throw new Error("Invalid CanDeactivate guard");Lo=jn(ui($e,Me,_e,at))}return Lo.pipe((0,be.P)())});return(0,p.of)(Ln).pipe(on())}(vt.component,vt.route,_e,Me,at)),(0,be.P)(vt=>!0!==vt,!0))}(Ln,at,vt,$e).pipe((0,we.zg)(cr=>cr&&function Nr($e){return"boolean"==typeof $e}(cr)?function Ya($e,Me,_e,at){return(0,f.D)(Me).pipe((0,ae.b)(vt=>(0,L.z)(function Xu($e,Me){return null!==$e&&Me&&Me(new Yt($e)),(0,p.of)(!0)}(vt.route.parent,at),function yl($e,Me){return null!==$e&&Me&&Me(new pr($e)),(0,p.of)(!0)}(vt.route,at),function vd($e,Me,_e){const at=Me[Me.length-1],Qt=Me.slice(0,Me.length-1).reverse().map(Ln=>function Ka($e){const Me=$e.routeConfig?$e.routeConfig.canActivateChild:null;return Me&&0!==Me.length?{node:$e,guards:Me}:null}(Ln)).filter(Ln=>null!==Ln).map(Ln=>e(()=>{const cr=Ln.guards.map(ui=>{const Lo=sl(ui,Ln.node,_e);let Ta;if(function ne($e){return $e&&Oo($e.canActivateChild)}(Lo))Ta=jn(Lo.canActivateChild(at,$e));else{if(!Oo(Lo))throw new Error("Invalid CanActivateChild guard");Ta=jn(Lo(at,$e))}return Ta.pipe((0,be.P)())});return(0,p.of)(cr).pipe(on())}));return(0,p.of)(Qt).pipe(on())}($e,vt.path,_e),function Lc($e,Me,_e){const at=Me.routeConfig?Me.routeConfig.canActivate:null;if(!at||0===at.length)return(0,p.of)(!0);const vt=at.map(Qt=>e(()=>{const Ln=sl(Qt,Me,_e);let cr;if(function rn($e){return $e&&Oo($e.canActivate)}(Ln))cr=jn(Ln.canActivate(Me,$e));else{if(!Oo(Ln))throw new Error("Invalid CanActivate guard");cr=jn(Ln(Me,$e))}return cr.pipe((0,be.P)())}));return(0,p.of)(vt).pipe(on())}($e,vt.route,_e))),(0,be.P)(vt=>!0!==vt,!0))}(at,Qt,$e,Me):(0,p.of)(cr)),(0,J.U)(cr=>Object.assign(Object.assign({},_e),{guardsResult:cr})))})}(this.ngModule.injector,cr=>this.triggerEvent(cr)),(0,ue.b)(cr=>{if(Qi(cr.guardsResult)){const Lo=Xn(`Redirecting to "${this.serializeUrl(cr.guardsResult)}"`);throw Lo.url=cr.guardsResult,Lo}const ui=new hn(cr.id,this.serializeUrl(cr.extractedUrl),this.serializeUrl(cr.urlAfterRedirects),cr.targetSnapshot,!!cr.guardsResult);this.triggerEvent(ui)}),(0,se.h)(cr=>!!cr.guardsResult||(this.restoreHistory(cr),this.cancelNavigationTransition(cr,""),!1)),Bo(cr=>{if(cr.guards.canActivateChecks.length)return(0,p.of)(cr).pipe((0,ue.b)(ui=>{const Lo=new vn(ui.id,this.serializeUrl(ui.extractedUrl),this.serializeUrl(ui.urlAfterRedirects),ui.targetSnapshot);this.triggerEvent(Lo)}),(0,ee.w)(ui=>{let Lo=!1;return(0,p.of)(ui).pipe(function id($e,Me){return(0,we.zg)(_e=>{const{targetSnapshot:at,guards:{canActivateChecks:vt}}=_e;if(!vt.length)return(0,p.of)(_e);let Qt=0;return(0,f.D)(vt).pipe((0,ae.b)(Ln=>function $u($e,Me,_e,at){return function Hu($e,Me,_e,at){const vt=wu($e);if(0===vt.length)return(0,p.of)({});const Qt={};return(0,f.D)(vt).pipe((0,we.zg)(Ln=>function Fd($e,Me,_e,at){const vt=sl($e,Me,at);return jn(vt.resolve?vt.resolve(Me,_e):vt(Me,_e))}($e[Ln],Me,_e,at).pipe((0,ue.b)(cr=>{Qt[Ln]=cr}))),(0,st.h)(1),(0,we.zg)(()=>wu(Qt).length===vt.length?(0,p.of)(Qt):c.E))}($e._resolve,$e,Me,at).pipe((0,J.U)(Qt=>($e._resolvedData=Qt,$e.data=Object.assign(Object.assign({},$e.data),Go($e,_e).resolve),null)))}(Ln.route,at,$e,Me)),(0,ue.b)(()=>Qt++),(0,st.h)(1),(0,we.zg)(Ln=>Qt===vt.length?(0,p.of)(_e):c.E))})}(this.paramsInheritanceStrategy,this.ngModule.injector),(0,ue.b)({next:()=>Lo=!0,complete:()=>{Lo||(this.restoreHistory(ui),this.cancelNavigationTransition(ui,"At least one route resolver didn't emit any value."))}}))}),(0,ue.b)(ui=>{const Lo=new mt(ui.id,this.serializeUrl(ui.extractedUrl),this.serializeUrl(ui.urlAfterRedirects),ui.targetSnapshot);this.triggerEvent(Lo)}))}),Bo(cr=>{const{targetSnapshot:ui,id:Lo,extractedUrl:Ta,rawUrl:_s,extras:{skipLocationChange:ha,replaceUrl:Ca}}=cr;return this.hooks.afterPreactivation(ui,{navigationId:Lo,appliedUrlTree:Ta,rawUrlTree:_s,skipLocationChange:!!ha,replaceUrl:!!Ca})}),(0,J.U)(cr=>{const ui=function xn($e,Me,_e){const at=Gr($e,Me._root,_e?_e._root:void 0);return new oo(at,Me)}(this.routeReuseStrategy,cr.targetSnapshot,cr.currentRouterState);return Object.assign(Object.assign({},cr),{targetRouterState:ui})}),(0,ue.b)(cr=>{this.currentUrlTree=cr.urlAfterRedirects,this.rawUrlTree=this.urlHandlingStrategy.merge(cr.urlAfterRedirects,cr.rawUrl),this.routerState=cr.targetRouterState,"deferred"===this.urlUpdateStrategy&&(cr.extras.skipLocationChange||this.setBrowserUrl(this.rawUrlTree,cr),this.browserUrlTree=cr.urlAfterRedirects)}),(($e,Me,_e)=>(0,J.U)(at=>(new Co(Me,at.targetRouterState,at.currentRouterState,_e).activate($e),at)))(this.rootContexts,this.routeReuseStrategy,cr=>this.triggerEvent(cr)),(0,ue.b)({next(){Qt=!0},complete(){Qt=!0}}),(0,Ve.x)(()=>{var cr;Qt||Ln||this.cancelNavigationTransition(vt,`Navigation ID ${vt.id} is not equal to the current navigation id ${this.navigationId}`),(null===(cr=this.currentNavigation)||void 0===cr?void 0:cr.id)===vt.id&&(this.currentNavigation=null)}),(0,ge.K)(cr=>{if(Ln=!0,function dr($e){return $e&&$e[Pn]}(cr)){const ui=Qi(cr.url);ui||(this.navigated=!0,this.restoreHistory(vt,!0));const Lo=new rt(vt.id,this.serializeUrl(vt.extractedUrl),cr.message);at.next(Lo),ui?setTimeout(()=>{const Ta=this.urlHandlingStrategy.merge(cr.url,this.rawUrlTree),_s={skipLocationChange:vt.extras.skipLocationChange,replaceUrl:"eager"===this.urlUpdateStrategy||Dr(vt.source)};this.scheduleNavigation(Ta,"imperative",null,_s,{resolve:vt.resolve,reject:vt.reject,promise:vt.promise})},0):vt.resolve(!1)}else{this.restoreHistory(vt,!0);const ui=new en(vt.id,this.serializeUrl(vt.extractedUrl),cr);at.next(ui);try{vt.resolve(this.errorHandler(cr))}catch(Lo){vt.reject(Lo)}}return c.E}))}))}resetRootComponentType(_e){this.rootComponentType=_e,this.routerState.root.component=this.rootComponentType}setTransition(_e){this.transitions.next(Object.assign(Object.assign({},this.transitions.value),_e))}initialNavigation(){this.setUpLocationChangeListener(),0===this.navigationId&&this.navigateByUrl(this.location.path(!0),{replaceUrl:!0})}setUpLocationChangeListener(){this.locationSubscription||(this.locationSubscription=this.location.subscribe(_e=>{const at="popstate"===_e.type?"popstate":"hashchange";"popstate"===at&&setTimeout(()=>{var vt;const Qt={replaceUrl:!0},Ln=(null===(vt=_e.state)||void 0===vt?void 0:vt.navigationId)?_e.state:null;if(Ln){const ui=Object.assign({},Ln);delete ui.navigationId,delete ui.\u0275routerPageId,0!==Object.keys(ui).length&&(Qt.state=ui)}const cr=this.parseUrl(_e.url);this.scheduleNavigation(cr,at,Ln,Qt)},0)}))}get url(){return this.serializeUrl(this.currentUrlTree)}getCurrentNavigation(){return this.currentNavigation}triggerEvent(_e){this.events.next(_e)}resetConfig(_e){Ls(_e),this.config=_e.map(ol),this.navigated=!1,this.lastSuccessfulId=-1}ngOnDestroy(){this.dispose()}dispose(){this.transitions.complete(),this.locationSubscription&&(this.locationSubscription.unsubscribe(),this.locationSubscription=void 0),this.disposed=!0}createUrlTree(_e,at={}){const{relativeTo:vt,queryParams:Qt,fragment:Ln,queryParamsHandling:cr,preserveFragment:ui}=at,Lo=vt||this.routerState.root,Ta=ui?this.currentUrlTree.fragment:Ln;let _s=null;switch(cr){case"merge":_s=Object.assign(Object.assign({},this.currentUrlTree.queryParams),Qt);break;case"preserve":_s=this.currentUrlTree.queryParams;break;default:_s=Qt||null}return null!==_s&&(_s=this.removeEmptyProps(_s)),function wo($e,Me,_e,at,vt){if(0===_e.length)return es(Me.root,Me.root,Me.root,at,vt);const Qt=function fa($e){if("string"==typeof $e[0]&&1===$e.length&&"/"===$e[0])return new ya(!0,0,$e);let Me=0,_e=!1;const at=$e.reduce((vt,Qt,Ln)=>{if("object"==typeof Qt&&null!=Qt){if(Qt.outlets){const cr={};return un(Qt.outlets,(ui,Lo)=>{cr[Lo]="string"==typeof ui?ui.split("/"):ui}),[...vt,{outlets:cr}]}if(Qt.segmentPath)return[...vt,Qt.segmentPath]}return"string"!=typeof Qt?[...vt,Qt]:0===Ln?(Qt.split("/").forEach((cr,ui)=>{0==ui&&"."===cr||(0==ui&&""===cr?_e=!0:".."===cr?Me++:""!=cr&&vt.push(cr))}),vt):[...vt,Qt]},[]);return new ya(_e,Me,at)}(_e);if(Qt.toRoot())return es(Me.root,Me.root,new Sn([],{}),at,vt);const Ln=function Pa($e,Me,_e){if($e.isAbsolute)return new la(Me.root,!0,0);if(-1===_e.snapshot._lastPathIndex){const Qt=_e.snapshot._urlSegment;return new la(Qt,Qt===Me.root,0)}const at=Us($e.commands[0])?0:1;return function fl($e,Me,_e){let at=$e,vt=Me,Qt=_e;for(;Qt>vt;){if(Qt-=vt,at=at.parent,!at)throw new Error("Invalid number of '../'");vt=at.segments.length}return new la(at,!1,vt-Qt)}(_e.snapshot._urlSegment,_e.snapshot._lastPathIndex+at,$e.numberOfDoubleDots)}(Qt,Me,$e),cr=Ln.processChildren?Zo(Ln.segmentGroup,Ln.index,Qt.commands):ml(Ln.segmentGroup,Ln.index,Qt.commands);return es(Me.root,Ln.segmentGroup,cr,at,vt)}(Lo,this.currentUrlTree,_e,_s,null!=Ta?Ta:null)}navigateByUrl(_e,at={skipLocationChange:!1}){const vt=Qi(_e)?_e:this.parseUrl(_e),Qt=this.urlHandlingStrategy.merge(vt,this.rawUrlTree);return this.scheduleNavigation(Qt,"imperative",null,at)}navigate(_e,at={skipLocationChange:!1}){return function zi($e){for(let Me=0;Me<$e.length;Me++){const _e=$e[Me];if(null==_e)throw new Error(`The requested path contains ${_e} segment at index ${Me}`)}}(_e),this.navigateByUrl(this.createUrlTree(_e,at),at)}serializeUrl(_e){return this.urlSerializer.serialize(_e)}parseUrl(_e){let at;try{at=this.urlSerializer.parse(_e)}catch(vt){at=this.malformedUriErrorHandler(vt,this.urlSerializer,_e)}return at}isActive(_e,at){let vt;if(vt=!0===at?Object.assign({},ni):!1===at?Object.assign({},fi):at,Qi(_e))return Zi(this.currentUrlTree,_e,vt);const Qt=this.parseUrl(_e);return Zi(this.currentUrlTree,Qt,vt)}removeEmptyProps(_e){return Object.keys(_e).reduce((at,vt)=>{const Qt=_e[vt];return null!=Qt&&(at[vt]=Qt),at},{})}processNavigations(){this.navigations.subscribe(_e=>{this.navigated=!0,this.lastSuccessfulId=_e.id,this.currentPageId=_e.targetPageId,this.events.next(new Bt(_e.id,this.serializeUrl(_e.extractedUrl),this.serializeUrl(this.currentUrlTree))),this.lastSuccessfulNavigation=this.currentNavigation,_e.resolve(!0)},_e=>{this.console.warn(`Unhandled Navigation Error: ${_e}`)})}scheduleNavigation(_e,at,vt,Qt,Ln){var cr,ui;if(this.disposed)return Promise.resolve(!1);let Lo,Ta,_s;Ln?(Lo=Ln.resolve,Ta=Ln.reject,_s=Ln.promise):_s=new Promise((Ru,lc)=>{Lo=Ru,Ta=lc});const ha=++this.navigationId;let Ca;return"computed"===this.canceledNavigationResolution?(0===this.currentPageId&&(vt=this.location.getState()),Ca=vt&&vt.\u0275routerPageId?vt.\u0275routerPageId:Qt.replaceUrl||Qt.skipLocationChange?null!==(cr=this.browserPageId)&&void 0!==cr?cr:0:(null!==(ui=this.browserPageId)&&void 0!==ui?ui:0)+1):Ca=0,this.setTransition({id:ha,targetPageId:Ca,source:at,restoredState:vt,currentUrlTree:this.currentUrlTree,currentRawUrl:this.rawUrlTree,rawUrl:_e,extras:Qt,resolve:Lo,reject:Ta,promise:_s,currentSnapshot:this.routerState.snapshot,currentRouterState:this.routerState}),_s.catch(Ru=>Promise.reject(Ru))}setBrowserUrl(_e,at){const vt=this.urlSerializer.serialize(_e),Qt=Object.assign(Object.assign({},at.extras.state),this.generateNgRouterState(at.id,at.targetPageId));this.location.isCurrentPathEqualTo(vt)||at.extras.replaceUrl?this.location.replaceState(vt,"",Qt):this.location.go(vt,"",Qt)}restoreHistory(_e,at=!1){var vt,Qt;if("computed"===this.canceledNavigationResolution){const Ln=this.currentPageId-_e.targetPageId;"popstate"!==_e.source&&"eager"!==this.urlUpdateStrategy&&this.currentUrlTree!==(null===(vt=this.currentNavigation)||void 0===vt?void 0:vt.finalUrl)||0===Ln?this.currentUrlTree===(null===(Qt=this.currentNavigation)||void 0===Qt?void 0:Qt.finalUrl)&&0===Ln&&(this.resetState(_e),this.browserUrlTree=_e.currentUrlTree,this.resetUrlToCurrentUrlTree()):this.location.historyGo(Ln)}else"replace"===this.canceledNavigationResolution&&(at&&this.resetState(_e),this.resetUrlToCurrentUrlTree())}resetState(_e){this.routerState=_e.currentRouterState,this.currentUrlTree=_e.currentUrlTree,this.rawUrlTree=this.urlHandlingStrategy.merge(this.currentUrlTree,_e.rawUrl)}resetUrlToCurrentUrlTree(){this.location.replaceState(this.urlSerializer.serialize(this.rawUrlTree),"",this.generateNgRouterState(this.lastSuccessfulId,this.currentPageId))}cancelNavigationTransition(_e,at){const vt=new rt(_e.id,this.serializeUrl(_e.extractedUrl),at);this.triggerEvent(vt),_e.resolve(!1)}generateNgRouterState(_e,at){return"computed"===this.canceledNavigationResolution?{navigationId:_e,\u0275routerPageId:at}:{navigationId:_e}}}return $e.\u0275fac=function(_e){r.$Z()},$e.\u0275prov=r.Yz7({token:$e,factory:$e.\u0275fac}),$e})();function Dr($e){return"imperative"!==$e}let kn=(()=>{class $e{constructor(_e,at,vt,Qt,Ln){this.router=_e,this.route=at,this.tabIndexAttribute=vt,this.renderer=Qt,this.el=Ln,this.commands=null,this.onChanges=new W.xQ,this.setTabIndexIfNotOnNativeEl("0")}setTabIndexIfNotOnNativeEl(_e){if(null!=this.tabIndexAttribute)return;const at=this.renderer,vt=this.el.nativeElement;null!==_e?at.setAttribute(vt,"tabindex",_e):at.removeAttribute(vt,"tabindex")}ngOnChanges(_e){this.onChanges.next(this)}set routerLink(_e){null!=_e?(this.commands=Array.isArray(_e)?_e:[_e],this.setTabIndexIfNotOnNativeEl("0")):(this.commands=null,this.setTabIndexIfNotOnNativeEl(null))}onClick(){if(null===this.urlTree)return!0;const _e={skipLocationChange:gr(this.skipLocationChange),replaceUrl:gr(this.replaceUrl),state:this.state};return this.router.navigateByUrl(this.urlTree,_e),!0}get urlTree(){return null===this.commands?null:this.router.createUrlTree(this.commands,{relativeTo:void 0!==this.relativeTo?this.relativeTo:this.route,queryParams:this.queryParams,fragment:this.fragment,queryParamsHandling:this.queryParamsHandling,preserveFragment:gr(this.preserveFragment)})}}return $e.\u0275fac=function(_e){return new(_e||$e)(r.Y36(gi),r.Y36(go),r.$8M("tabindex"),r.Y36(r.Qsj),r.Y36(r.SBq))},$e.\u0275dir=r.lG2({type:$e,selectors:[["","routerLink","",5,"a",5,"area"]],hostBindings:function(_e,at){1&_e&&r.NdJ("click",function(){return at.onClick()})},inputs:{queryParams:"queryParams",fragment:"fragment",queryParamsHandling:"queryParamsHandling",preserveFragment:"preserveFragment",skipLocationChange:"skipLocationChange",replaceUrl:"replaceUrl",state:"state",relativeTo:"relativeTo",routerLink:"routerLink"},features:[r.TTD]}),$e})(),Ar=(()=>{class $e{constructor(_e,at,vt){this.router=_e,this.route=at,this.locationStrategy=vt,this.commands=null,this.href=null,this.onChanges=new W.xQ,this.subscription=_e.events.subscribe(Qt=>{Qt instanceof Bt&&this.updateTargetUrlAndHref()})}set routerLink(_e){this.commands=null!=_e?Array.isArray(_e)?_e:[_e]:null}ngOnChanges(_e){this.updateTargetUrlAndHref(),this.onChanges.next(this)}ngOnDestroy(){this.subscription.unsubscribe()}onClick(_e,at,vt,Qt,Ln){if(0!==_e||at||vt||Qt||Ln||"string"==typeof this.target&&"_self"!=this.target||null===this.urlTree)return!0;const cr={skipLocationChange:gr(this.skipLocationChange),replaceUrl:gr(this.replaceUrl),state:this.state};return this.router.navigateByUrl(this.urlTree,cr),!1}updateTargetUrlAndHref(){this.href=null!==this.urlTree?this.locationStrategy.prepareExternalUrl(this.router.serializeUrl(this.urlTree)):null}get urlTree(){return null===this.commands?null:this.router.createUrlTree(this.commands,{relativeTo:void 0!==this.relativeTo?this.relativeTo:this.route,queryParams:this.queryParams,fragment:this.fragment,queryParamsHandling:this.queryParamsHandling,preserveFragment:gr(this.preserveFragment)})}}return $e.\u0275fac=function(_e){return new(_e||$e)(r.Y36(gi),r.Y36(go),r.Y36(xe.S$))},$e.\u0275dir=r.lG2({type:$e,selectors:[["a","routerLink",""],["area","routerLink",""]],hostVars:2,hostBindings:function(_e,at){1&_e&&r.NdJ("click",function(Qt){return at.onClick(Qt.button,Qt.ctrlKey,Qt.shiftKey,Qt.altKey,Qt.metaKey)}),2&_e&&r.uIk("target",at.target)("href",at.href,r.LSH)},inputs:{target:"target",queryParams:"queryParams",fragment:"fragment",queryParamsHandling:"queryParamsHandling",preserveFragment:"preserveFragment",skipLocationChange:"skipLocationChange",replaceUrl:"replaceUrl",state:"state",relativeTo:"relativeTo",routerLink:"routerLink"},features:[r.TTD]}),$e})();function gr($e){return""===$e||!!$e}let fo=(()=>{class $e{constructor(_e,at,vt,Qt,Ln,cr){this.router=_e,this.element=at,this.renderer=vt,this.cdr=Qt,this.link=Ln,this.linkWithHref=cr,this.classes=[],this.isActive=!1,this.routerLinkActiveOptions={exact:!1},this.isActiveChange=new r.vpe,this.routerEventsSubscription=_e.events.subscribe(ui=>{ui instanceof Bt&&this.update()})}ngAfterContentInit(){(0,p.of)(this.links.changes,this.linksWithHrefs.changes,(0,p.of)(null)).pipe((0,Be.J)()).subscribe(_e=>{this.update(),this.subscribeToEachLinkOnChanges()})}subscribeToEachLinkOnChanges(){var _e;null===(_e=this.linkInputChangesSubscription)||void 0===_e||_e.unsubscribe();const at=[...this.links.toArray(),...this.linksWithHrefs.toArray(),this.link,this.linkWithHref].filter(vt=>!!vt).map(vt=>vt.onChanges);this.linkInputChangesSubscription=(0,f.D)(at).pipe((0,Be.J)()).subscribe(vt=>{this.isActive!==this.isLinkActive(this.router)(vt)&&this.update()})}set routerLinkActive(_e){const at=Array.isArray(_e)?_e:_e.split(" ");this.classes=at.filter(vt=>!!vt)}ngOnChanges(_e){this.update()}ngOnDestroy(){var _e;this.routerEventsSubscription.unsubscribe(),null===(_e=this.linkInputChangesSubscription)||void 0===_e||_e.unsubscribe()}update(){!this.links||!this.linksWithHrefs||!this.router.navigated||Promise.resolve().then(()=>{const _e=this.hasActiveLinks();this.isActive!==_e&&(this.isActive=_e,this.cdr.markForCheck(),this.classes.forEach(at=>{_e?this.renderer.addClass(this.element.nativeElement,at):this.renderer.removeClass(this.element.nativeElement,at)}),this.isActiveChange.emit(_e))})}isLinkActive(_e){const at=function $s($e){return!!$e.paths}(this.routerLinkActiveOptions)?this.routerLinkActiveOptions:this.routerLinkActiveOptions.exact||!1;return vt=>!!vt.urlTree&&_e.isActive(vt.urlTree,at)}hasActiveLinks(){const _e=this.isLinkActive(this.router);return this.link&&_e(this.link)||this.linkWithHref&&_e(this.linkWithHref)||this.links.some(_e)||this.linksWithHrefs.some(_e)}}return $e.\u0275fac=function(_e){return new(_e||$e)(r.Y36(gi),r.Y36(r.SBq),r.Y36(r.Qsj),r.Y36(r.sBO),r.Y36(kn,8),r.Y36(Ar,8))},$e.\u0275dir=r.lG2({type:$e,selectors:[["","routerLinkActive",""]],contentQueries:function(_e,at,vt){if(1&_e&&(r.Suo(vt,kn,5),r.Suo(vt,Ar,5)),2&_e){let Qt;r.iGM(Qt=r.CRH())&&(at.links=Qt),r.iGM(Qt=r.CRH())&&(at.linksWithHrefs=Qt)}},inputs:{routerLinkActiveOptions:"routerLinkActiveOptions",routerLinkActive:"routerLinkActive"},outputs:{isActiveChange:"isActiveChange"},exportAs:["routerLinkActive"],features:[r.TTD]}),$e})();class Es{}class pl{preload(Me,_e){return _e().pipe((0,ge.K)(()=>(0,p.of)(null)))}}class Ks{preload(Me,_e){return(0,p.of)(null)}}let Wc=(()=>{class $e{constructor(_e,at,vt,Qt){this.router=_e,this.injector=vt,this.preloadingStrategy=Qt,this.loader=new nt(vt,at,ui=>_e.triggerEvent(new Nt(ui)),ui=>_e.triggerEvent(new St(ui)))}setUpPreloading(){this.subscription=this.router.events.pipe((0,se.h)(_e=>_e instanceof Bt),(0,ae.b)(()=>this.preload())).subscribe(()=>{})}preload(){const _e=this.injector.get(r.h0i);return this.processRoutes(_e,this.router.config)}ngOnDestroy(){this.subscription&&this.subscription.unsubscribe()}processRoutes(_e,at){const vt=[];for(const Qt of at)if(Qt.loadChildren&&!Qt.canLoad&&Qt._loadedConfig){const Ln=Qt._loadedConfig;vt.push(this.processRoutes(Ln.module,Ln.routes))}else Qt.loadChildren&&!Qt.canLoad?vt.push(this.preloadConfig(_e,Qt)):Qt.children&&vt.push(this.processRoutes(_e,Qt.children));return(0,f.D)(vt).pipe((0,Be.J)(),(0,J.U)(Qt=>{}))}preloadConfig(_e,at){return this.preloadingStrategy.preload(at,()=>(at._loadedConfig?(0,p.of)(at._loadedConfig):this.loader.load(_e.injector,at)).pipe((0,we.zg)(Qt=>(at._loadedConfig=Qt,this.processRoutes(Qt.module,Qt.routes)))))}}return $e.\u0275fac=function(_e){return new(_e||$e)(r.LFG(gi),r.LFG(r.Sil),r.LFG(r.zs3),r.LFG(Es))},$e.\u0275prov=r.Yz7({token:$e,factory:$e.\u0275fac}),$e})(),Fc=(()=>{class $e{constructor(_e,at,vt={}){this.router=_e,this.viewportScroller=at,this.options=vt,this.lastId=0,this.lastSource="imperative",this.restoredId=0,this.store={},vt.scrollPositionRestoration=vt.scrollPositionRestoration||"disabled",vt.anchorScrolling=vt.anchorScrolling||"disabled"}init(){"disabled"!==this.options.scrollPositionRestoration&&this.viewportScroller.setHistoryScrollRestoration("manual"),this.routerEventsSubscription=this.createScrollEvents(),this.scrollEventsSubscription=this.consumeScrollEvents()}createScrollEvents(){return this.router.events.subscribe(_e=>{_e instanceof Ne?(this.store[this.lastId]=this.viewportScroller.getScrollPosition(),this.lastSource=_e.navigationTrigger,this.restoredId=_e.restoredState?_e.restoredState.navigationId:0):_e instanceof Bt&&(this.lastId=_e.id,this.scheduleScrollEvent(_e,this.router.parseUrl(_e.urlAfterRedirects).fragment))})}consumeScrollEvents(){return this.router.events.subscribe(_e=>{_e instanceof mi&&(_e.position?"top"===this.options.scrollPositionRestoration?this.viewportScroller.scrollToPosition([0,0]):"enabled"===this.options.scrollPositionRestoration&&this.viewportScroller.scrollToPosition(_e.position):_e.anchor&&"enabled"===this.options.anchorScrolling?this.viewportScroller.scrollToAnchor(_e.anchor):"disabled"!==this.options.scrollPositionRestoration&&this.viewportScroller.scrollToPosition([0,0]))})}scheduleScrollEvent(_e,at){this.router.triggerEvent(new mi(_e,"popstate"===this.lastSource?this.store[this.restoredId]:null,at))}ngOnDestroy(){this.routerEventsSubscription&&this.routerEventsSubscription.unsubscribe(),this.scrollEventsSubscription&&this.scrollEventsSubscription.unsubscribe()}}return $e.\u0275fac=function(_e){r.$Z()},$e.\u0275prov=r.Yz7({token:$e,factory:$e.\u0275fac}),$e})();const Eu=new r.OlP("ROUTER_CONFIGURATION"),Gd=new r.OlP("ROUTER_FORROOT_GUARD"),yd=[xe.Ye,{provide:ao,useClass:dt},{provide:gi,useFactory:function No($e,Me,_e,at,vt,Qt,Ln={},cr,ui){const Lo=new gi(null,$e,Me,_e,at,vt,Ro(Qt));return cr&&(Lo.urlHandlingStrategy=cr),ui&&(Lo.routeReuseStrategy=ui),function Sa($e,Me){$e.errorHandler&&(Me.errorHandler=$e.errorHandler),$e.malformedUriErrorHandler&&(Me.malformedUriErrorHandler=$e.malformedUriErrorHandler),$e.onSameUrlNavigation&&(Me.onSameUrlNavigation=$e.onSameUrlNavigation),$e.paramsInheritanceStrategy&&(Me.paramsInheritanceStrategy=$e.paramsInheritanceStrategy),$e.relativeLinkResolution&&(Me.relativeLinkResolution=$e.relativeLinkResolution),$e.urlUpdateStrategy&&(Me.urlUpdateStrategy=$e.urlUpdateStrategy),$e.canceledNavigationResolution&&(Me.canceledNavigationResolution=$e.canceledNavigationResolution)}(Ln,Lo),Ln.enableTracing&&Lo.events.subscribe(Ta=>{var _s,ha;null===(_s=console.group)||void 0===_s||_s.call(console,`Router Event: ${Ta.constructor.name}`),console.log(Ta.toString()),console.log(Ta),null===(ha=console.groupEnd)||void 0===ha||ha.call(console)}),Lo},deps:[ao,bi,xe.Ye,r.zs3,r.Sil,Ce,Eu,[class Mt{},new r.FiY],[class cu{},new r.FiY]]},bi,{provide:go,useFactory:function Sl($e){return $e.routerState.root},deps:[gi]},Wc,Ks,pl,{provide:Eu,useValue:{enableTracing:!1}}];function Ed(){return new r.PXZ("Router",gi)}let Uc=(()=>{class $e{constructor(_e,at){}static forRoot(_e,at){return{ngModule:$e,providers:[yd,Mo(_e),{provide:Gd,useFactory:Oc,deps:[[gi,new r.FiY,new r.tp0]]},{provide:Eu,useValue:at||{}},{provide:xe.S$,useFactory:kd,deps:[xe.lw,[new r.tBr(xe.mr),new r.FiY],Eu]},{provide:Fc,useFactory:La,deps:[gi,xe.EM,Eu]},{provide:Es,useExisting:at&&at.preloadingStrategy?at.preloadingStrategy:Ks},{provide:r.PXZ,multi:!0,useFactory:Ed},[ru,{provide:r.ip1,multi:!0,useFactory:bu,deps:[ru]},{provide:_n,useFactory:gc,deps:[ru]},{provide:r.tb,multi:!0,useExisting:_n}]]}}static forChild(_e){return{ngModule:$e,providers:[Mo(_e)]}}}return $e.\u0275fac=function(_e){return new(_e||$e)(r.LFG(Gd,8),r.LFG(gi,8))},$e.\u0275mod=r.oAB({type:$e}),$e.\u0275inj=r.cJS({}),$e})();function La($e,Me,_e){return _e.scrollOffset&&Me.setOffset(_e.scrollOffset),new Fc($e,Me,_e)}function kd($e,Me,_e={}){return _e.useHash?new xe.Do($e,Me):new xe.b0($e,Me)}function Oc($e){return"guarded"}function Mo($e){return[{provide:r.deG,multi:!0,useValue:$e},{provide:Ce,multi:!0,useValue:$e}]}let ru=(()=>{class $e{constructor(_e){this.injector=_e,this.initNavigation=!1,this.destroyed=!1,this.resultOfPreactivationDone=new W.xQ}appInitializer(){return this.injector.get(xe.V_,Promise.resolve(null)).then(()=>{if(this.destroyed)return Promise.resolve(!0);let at=null;const vt=new Promise(cr=>at=cr),Qt=this.injector.get(gi),Ln=this.injector.get(Eu);return"disabled"===Ln.initialNavigation?(Qt.setUpLocationChangeListener(),at(!0)):"enabled"===Ln.initialNavigation||"enabledBlocking"===Ln.initialNavigation?(Qt.hooks.afterPreactivation=()=>this.initNavigation?(0,p.of)(null):(this.initNavigation=!0,at(!0),this.resultOfPreactivationDone),Qt.initialNavigation()):at(!0),vt})}bootstrapListener(_e){const at=this.injector.get(Eu),vt=this.injector.get(Wc),Qt=this.injector.get(Fc),Ln=this.injector.get(gi),cr=this.injector.get(r.z2F);_e===cr.components[0]&&(("enabledNonBlocking"===at.initialNavigation||void 0===at.initialNavigation)&&Ln.initialNavigation(),vt.setUpPreloading(),Qt.init(),Ln.resetRootComponentType(cr.componentTypes[0]),this.resultOfPreactivationDone.next(null),this.resultOfPreactivationDone.complete())}ngOnDestroy(){this.destroyed=!0}}return $e.\u0275fac=function(_e){return new(_e||$e)(r.LFG(r.zs3))},$e.\u0275prov=r.Yz7({token:$e,factory:$e.\u0275fac}),$e})();function bu($e){return $e.appInitializer.bind($e)}function gc($e){return $e.bootstrapListener.bind($e)}const _n=new r.OlP("Router Initializer")},71334:(m,S,i)=>{"use strict";i.d(S,{Kz:()=>bp,xm:()=>Uu,_A:()=>ll,vL:()=>ju,_D:()=>ad,lQ:()=>nc,VL:()=>Oe,M:()=>Od,jt:()=>Ep,TH:()=>Qh,Vi:()=>Ad,XC:()=>ic,iD:()=>Kh,J4:()=>Tt,FF:()=>e_,Pz:()=>Tp,uN:()=>Zf,nv:()=>Sh,Vx:()=>bf,Oz:()=>Ts,tO:()=>Rc,M2:()=>Jh,o8:()=>ef,AX:()=>Lf,dT:()=>tf,Ly:()=>Ah,ZQ:()=>fd,Pm:()=>Ap,UL:()=>Wp,_L:()=>C_,xI:()=>s_,HK:()=>ep,dR:()=>Rh,ZS:()=>np});var r=i(89724),a=i(11048),f=i(59796),c=i(56693),e=i(55197),p=i(53960);function y(...P){if(1===P.length){if(!(0,f.k)(P[0]))return P[0];P=P[0]}return(0,c.n)(P,void 0).lift(new T)}class T{call(te,b){return b.subscribe(new C(te))}}class C extends e.L{constructor(te){super(te),this.hasFirst=!1,this.observables=[],this.subscriptions=[]}_next(te){this.observables.push(te)}_complete(){const te=this.observables,b=te.length;if(0===b)this.destination.complete();else{for(let G=0;G<b&&!this.hasFirst;G++){const Ge=(0,p.D)(this,te[G],void 0,G);this.subscriptions&&this.subscriptions.push(Ge),this.add(Ge)}this.observables=null}}notifyNext(te,b,G){if(!this.hasFirst){this.hasFirst=!0;for(let Te=0;Te<this.subscriptions.length;Te++)if(Te!==G){let Ge=this.subscriptions[Te];Ge.unsubscribe(),this.remove(Ge)}this.subscriptions=null}this.destination.next(b)}}var R=i(77393),L=i(20377),z=i(85345);function W(...P){const te=P[P.length-1];return"function"==typeof te&&P.pop(),(0,c.n)(P,void 0).lift(new J(te))}class J{constructor(te){this.resultSelector=te}call(te,b){return b.subscribe(new ee(te,this.resultSelector))}}class ee extends R.L{constructor(te,b,G=Object.create(null)){super(te),this.resultSelector=b,this.iterators=[],this.active=0,this.resultSelector="function"==typeof b?b:void 0}_next(te){const b=this.iterators;(0,f.k)(te)?b.push(new ie(te)):b.push("function"==typeof te[L.hZ]?new ce(te[L.hZ]()):new U(this.destination,this,te))}_complete(){const te=this.iterators,b=te.length;if(this.unsubscribe(),0!==b){this.active=b;for(let G=0;G<b;G++){let Te=te[G];Te.stillUnsubscribed?this.destination.add(Te.subscribe()):this.active--}}else this.destination.complete()}notifyInactive(){this.active--,0===this.active&&this.destination.complete()}checkIterators(){const te=this.iterators,b=te.length,G=this.destination;for(let an=0;an<b;an++){let fr=te[an];if("function"==typeof fr.hasValue&&!fr.hasValue())return}let Te=!1;const Ge=[];for(let an=0;an<b;an++){let fr=te[an],wr=fr.next();if(fr.hasCompleted()&&(Te=!0),wr.done)return void G.complete();Ge.push(wr.value)}this.resultSelector?this._tryresultSelector(Ge):G.next(Ge),Te&&G.complete()}_tryresultSelector(te){let b;try{b=this.resultSelector.apply(this,te)}catch(G){return void this.destination.error(G)}this.destination.next(b)}}class ce{constructor(te){this.iterator=te,this.nextResult=te.next()}hasValue(){return!0}next(){const te=this.nextResult;return this.nextResult=this.iterator.next(),te}hasCompleted(){const te=this.nextResult;return Boolean(te&&te.done)}}class ie{constructor(te){this.array=te,this.index=0,this.length=0,this.length=te.length}[L.hZ](){return this}next(te){const b=this.index++;return b<this.length?{value:this.array[b],done:!1}:{value:null,done:!0}}hasValue(){return this.array.length>this.index}hasCompleted(){return this.array.length===this.index}}class U extends z.Ds{constructor(te,b,G){super(te),this.parent=b,this.observable=G,this.stillUnsubscribed=!0,this.buffer=[],this.isComplete=!1}[L.hZ](){return this}next(){const te=this.buffer;return 0===te.length&&this.isComplete?{value:null,done:!0}:{value:te.shift(),done:!1}}hasValue(){return this.buffer.length>0}hasCompleted(){return 0===this.buffer.length&&this.isComplete}notifyComplete(){this.buffer.length>0?(this.isComplete=!0,this.parent.notifyInactive()):this.destination.complete()}notifyNext(te){this.buffer.push(te),this.parent.checkIterators()}subscribe(){return(0,z.ft)(this.observable,new z.IY(this))}}var se=i(70882),ge=i(59193),ae=i(25917),he=i(79765),be=i(22759),we=i(46797),ue=i(26215),Ve=(i(9112),i(17757),i(66682)),Be=i(6481);function je(...P){return te=>{let b;return"function"==typeof P[P.length-1]&&(b=P.pop()),te.lift(new Ne(P,b))}}class Ne{constructor(te,b){this.observables=te,this.project=b}call(te,b){return b.subscribe(new Bt(te,this.observables,this.project))}}class Bt extends e.L{constructor(te,b,G){super(te),this.observables=b,this.project=G,this.toRespond=[];const Te=b.length;this.values=new Array(Te);for(let Ge=0;Ge<Te;Ge++)this.toRespond.push(Ge);for(let Ge=0;Ge<Te;Ge++)this.add((0,p.D)(this,b[Ge],void 0,Ge))}notifyNext(te,b,G){this.values[G]=b;const Te=this.toRespond;if(Te.length>0){const Ge=Te.indexOf(G);-1!==Ge&&Te.splice(Ge,1)}}notifyComplete(){}_next(te){if(0===this.toRespond.length){const b=[te,...this.values];this.project?this._tryProject(b):this.destination.next(b)}}_tryProject(te){let b;try{b=this.project.apply(this,te)}catch(G){return void this.destination.error(G)}this.destination.next(b)}}class en{constructor(te){this.total=te}call(te,b){return b.subscribe(new Pt(te,this.total))}}class Pt extends R.L{constructor(te,b){super(te),this.total=b,this.count=0}_next(te){++this.count>this.total&&this.destination.next(te)}}var Vt=i(46782),hn=i(45435),vn=i(15257),mt=i(88002),Nt=i(39761),St=i(87519),Yt=i(43190),Fn=i(68307),pr=i(67460),Ei=i(19773),mi=i(4121),ur=i(1659),$r={left:"right",right:"left",bottom:"top",top:"bottom"};function Br(P){return P.replace(/left|right|bottom|top/g,function(te){return $r[te]})}function Pn(P){return P.split("-")[0]}var Xn={start:"end",end:"start"};function dr(P){return P.replace(/start|end/g,function(te){return Xn[te]})}var Qr="top",Ci="bottom",_i="right",so="left",Ro="auto",Sr=[Qr,Ci,_i,so],Kt="start",un="end",Jn="viewport",Gn="popper",Zi=Sr.reduce(function(P,te){return P.concat([te+"-"+Kt,te+"-"+un])},[]),ii=[].concat(Sr,[Ro]).reduce(function(P,te){return P.concat([te,te+"-"+Kt,te+"-"+un])},[]),vi=["beforeRead","read","afterRead","beforeMain","main","afterMain","beforeWrite","write","afterWrite"];function Ui(P){if(null==P)return window;if("[object Window]"!==P.toString()){var te=P.ownerDocument;return te&&te.defaultView||window}return P}function ao(P){return P instanceof Ui(P).Element||P instanceof Element}function dt(P){return P instanceof Ui(P).HTMLElement||P instanceof HTMLElement}function Bi(P){return"undefined"!=typeof ShadowRoot&&(P instanceof Ui(P).ShadowRoot||P instanceof ShadowRoot)}function to(P){return((ao(P)?P.ownerDocument:P.document)||window.document).documentElement}function Gt(P,te){void 0===te&&(te=!1);var b=P.getBoundingClientRect();return{width:b.width/1,height:b.height/1,top:b.top/1,right:b.right/1,bottom:b.bottom/1,left:b.left/1,x:b.left/1,y:b.top/1}}function Rn(P){var te=Ui(P);return{scrollLeft:te.pageXOffset,scrollTop:te.pageYOffset}}function _t(P){return Gt(to(P)).left+Rn(P).scrollLeft}function ct(P){return Ui(P).getComputedStyle(P)}var pt=Math.max,kt=Math.min,dn=Math.round;function Oi(P){return P?(P.nodeName||"").toLowerCase():null}function di(P){return"html"===Oi(P)?P:P.assignedSlot||P.parentNode||(Bi(P)?P.host:null)||to(P)}function Uo(P){var te=ct(P);return/auto|scroll|overlay|hidden/.test(te.overflow+te.overflowY+te.overflowX)}function Qo(P){return["html","body","#document"].indexOf(Oi(P))>=0?P.ownerDocument.body:dt(P)&&Uo(P)?P:Qo(di(P))}function lo(P,te){var b;void 0===te&&(te=[]);var G=Qo(P),Te=G===(null==(b=P.ownerDocument)?void 0:b.body),Ge=Ui(G),an=Te?[Ge].concat(Ge.visualViewport||[],Uo(G)?G:[]):G,fr=te.concat(an);return Te?fr:fr.concat(lo(di(an)))}function Ai(P){return["table","td","th"].indexOf(Oi(P))>=0}function Fo(P){return dt(P)&&"fixed"!==ct(P).position?P.offsetParent:null}function qn(P){for(var te=Ui(P),b=Fo(P);b&&Ai(b)&&"static"===ct(b).position;)b=Fo(b);return b&&("html"===Oi(b)||"body"===Oi(b)&&"static"===ct(b).position)?te:b||function Ko(P){var te=-1!==navigator.userAgent.toLowerCase().indexOf("firefox");if(-1!==navigator.userAgent.indexOf("Trident")&&dt(P)&&"fixed"===ct(P).position)return null;for(var Te=di(P);dt(Te)&&["html","body"].indexOf(Oi(Te))<0;){var Ge=ct(Te);if("none"!==Ge.transform||"none"!==Ge.perspective||"paint"===Ge.contain||-1!==["transform","perspective"].indexOf(Ge.willChange)||te&&"filter"===Ge.willChange||te&&Ge.filter&&"none"!==Ge.filter)return Te;Te=Te.parentNode}return null}(P)||te}function ei(P,te){var b=te.getRootNode&&te.getRootNode();if(P.contains(te))return!0;if(b&&Bi(b)){var G=te;do{if(G&&P.isSameNode(G))return!0;G=G.parentNode||G.host}while(G)}return!1}function wn(P){return Object.assign({},P,{left:P.x,top:P.y,right:P.x+P.width,bottom:P.y+P.height})}function Fr(P,te){return te===Jn?wn(function Rt(P){var te=Ui(P),b=to(P),G=te.visualViewport,Te=b.clientWidth,Ge=b.clientHeight,an=0,fr=0;return G&&(Te=G.width,Ge=G.height,/^((?!chrome|android).)*safari/i.test(navigator.userAgent)||(an=G.offsetLeft,fr=G.offsetTop)),{width:Te,height:Ge,x:an+_t(P),y:fr}}(P)):dt(te)?function Qn(P){var te=Gt(P);return te.top=te.top+P.clientTop,te.left=te.left+P.clientLeft,te.bottom=te.top+P.clientHeight,te.right=te.left+P.clientWidth,te.width=P.clientWidth,te.height=P.clientHeight,te.x=te.left,te.y=te.top,te}(te):wn(function mr(P){var te,b=to(P),G=Rn(P),Te=null==(te=P.ownerDocument)?void 0:te.body,Ge=pt(b.scrollWidth,b.clientWidth,Te?Te.scrollWidth:0,Te?Te.clientWidth:0),an=pt(b.scrollHeight,b.clientHeight,Te?Te.scrollHeight:0,Te?Te.clientHeight:0),fr=-G.scrollLeft+_t(P),wr=-G.scrollTop;return"rtl"===ct(Te||b).direction&&(fr+=pt(b.clientWidth,Te?Te.clientWidth:0)-Ge),{width:Ge,height:an,x:fr,y:wr}}(to(P)))}function yo(P){return P.split("-")[1]}function go(P){return["top","bottom"].indexOf(P)>=0?"x":"y"}function Go(P){var wr,te=P.reference,b=P.element,G=P.placement,Te=G?Pn(G):null,Ge=G?yo(G):null,an=te.x+te.width/2-b.width/2,fr=te.y+te.height/2-b.height/2;switch(Te){case Qr:wr={x:an,y:te.y-b.height};break;case Ci:wr={x:an,y:te.y+te.height};break;case _i:wr={x:te.x+te.width,y:fr};break;case so:wr={x:te.x-b.width,y:fr};break;default:wr={x:te.x,y:te.y}}var ci=Te?go(Te):null;if(null!=ci){var oi="y"===ci?"height":"width";switch(Ge){case Kt:wr[ci]=wr[ci]-(te[oi]/2-b[oi]/2);break;case un:wr[ci]=wr[ci]+(te[oi]/2-b[oi]/2)}}return wr}function er(P){return Object.assign({},{top:0,right:0,bottom:0,left:0},P)}function vr(P,te){return te.reduce(function(b,G){return b[G]=P,b},{})}function yr(P,te){void 0===te&&(te={});var G=te.placement,Te=void 0===G?P.placement:G,Ge=te.boundary,an=void 0===Ge?"clippingParents":Ge,fr=te.rootBoundary,wr=void 0===fr?Jn:fr,ci=te.elementContext,oi=void 0===ci?Gn:ci,ts=te.altBoundary,Do=void 0!==ts&&ts,Ss=te.padding,Yo=void 0===Ss?0:Ss,ia=er("number"!=typeof Yo?Yo:vr(Yo,Sr)),D=P.rects.popper,B=P.elements[Do?oi===Gn?"reference":Gn:oi],ye=function Li(P,te,b){var G="clippingParents"===te?function oo(P){var te=lo(di(P)),G=["absolute","fixed"].indexOf(ct(P).position)>=0&&dt(P)?qn(P):P;return ao(G)?te.filter(function(Te){return ao(Te)&&ei(Te,G)&&"body"!==Oi(Te)}):[]}(P):[].concat(te),Te=[].concat(G,[b]),an=Te.reduce(function(fr,wr){var ci=Fr(P,wr);return fr.top=pt(ci.top,fr.top),fr.right=kt(ci.right,fr.right),fr.bottom=kt(ci.bottom,fr.bottom),fr.left=pt(ci.left,fr.left),fr},Fr(P,Te[0]));return an.width=an.right-an.left,an.height=an.bottom-an.top,an.x=an.left,an.y=an.top,an}(ao(B)?B:B.contextElement||to(P.elements.popper),an,wr),He=Gt(P.elements.reference),yt=Go({reference:He,element:D,strategy:"absolute",placement:Te}),Wt=wn(Object.assign({},D,yt)),gn=oi===Gn?Wt:He,nr={top:ye.top-gn.top+ia.top,bottom:gn.bottom-ye.bottom+ia.bottom,left:ye.left-gn.left+ia.left,right:gn.right-ye.right+ia.right},ti=P.modifiersData.offset;if(oi===Gn&&ti){var $o=ti[Te];Object.keys(nr).forEach(function(Hs){var po=[_i,Ci].indexOf(Hs)>=0?1:-1,ds=[Qr,Ci].indexOf(Hs)>=0?"y":"x";nr[Hs]+=$o[ds]*po})}return nr}const xn={name:"flip",enabled:!0,phase:"main",fn:function pn(P){var te=P.state,b=P.options,G=P.name;if(!te.modifiersData[G]._skip){for(var Te=b.mainAxis,Ge=void 0===Te||Te,an=b.altAxis,fr=void 0===an||an,wr=b.fallbackPlacements,ci=b.padding,oi=b.boundary,ts=b.rootBoundary,Do=b.altBoundary,Ss=b.flipVariations,Yo=void 0===Ss||Ss,ia=b.allowedAutoPlacements,v=te.options.placement,D=Pn(v),ye=wr||(D!==v&&Yo?function si(P){if(Pn(P)===Ro)return[];var te=Br(P);return[dr(P),te,dr(te)]}(v):[Br(v)]),He=[v].concat(ye).reduce(function(za,va){return za.concat(Pn(va)===Ro?function or(P,te){void 0===te&&(te={});var Te=te.boundary,Ge=te.rootBoundary,an=te.padding,fr=te.flipVariations,wr=te.allowedAutoPlacements,ci=void 0===wr?ii:wr,oi=yo(te.placement),ts=oi?fr?Zi:Zi.filter(function(Yo){return yo(Yo)===oi}):Sr,Do=ts.filter(function(Yo){return ci.indexOf(Yo)>=0});0===Do.length&&(Do=ts);var Ss=Do.reduce(function(Yo,ia){return Yo[ia]=yr(P,{placement:ia,boundary:Te,rootBoundary:Ge,padding:an})[Pn(ia)],Yo},{});return Object.keys(Ss).sort(function(Yo,ia){return Ss[Yo]-Ss[ia]})}(te,{placement:va,boundary:oi,rootBoundary:ts,padding:ci,flipVariations:Yo,allowedAutoPlacements:ia}):va)},[]),yt=te.rects.reference,Wt=te.rects.popper,gn=new Map,nr=!0,ti=He[0],$o=0;$o<He.length;$o++){var Hs=He[$o],po=Pn(Hs),ds=yo(Hs)===Kt,sa=[Qr,Ci].indexOf(po)>=0,Js=sa?"width":"height",zr=yr(te,{placement:Hs,boundary:oi,rootBoundary:ts,altBoundary:Do,padding:ci}),Rr=sa?ds?_i:so:ds?Ci:Qr;yt[Js]>Wt[Js]&&(Rr=Br(Rr));var Ur=Br(Rr),Fi=[];if(Ge&&Fi.push(zr[po]<=0),fr&&Fi.push(zr[Rr]<=0,zr[Ur]<=0),Fi.every(function(za){return za})){ti=Hs,nr=!1;break}gn.set(Hs,Fi)}if(nr)for(var $a=function(va){var kf=He.find(function(og){var c_=gn.get(og);if(c_)return c_.slice(0,va).every(function(sg){return sg})});if(kf)return ti=kf,"break"},ms=Yo?3:1;ms>0&&"break"!==$a(ms);ms--);te.placement!==ti&&(te.modifiersData[G]._skip=!0,te.placement=ti,te.reset=!0)}},requiresIfExists:["offset"],data:{_skip:!1}};function no(P,te,b){return pt(P,kt(te,b))}function mo(P){var te=Gt(P),b=P.offsetWidth,G=P.offsetHeight;return Math.abs(te.width-b)<=1&&(b=te.width),Math.abs(te.height-G)<=1&&(G=te.height),{x:P.offsetLeft,y:P.offsetTop,width:b,height:G}}const Us={name:"preventOverflow",enabled:!0,phase:"main",fn:function wo(P){var te=P.state,b=P.options,G=P.name,Te=b.mainAxis,Ge=void 0===Te||Te,an=b.altAxis,fr=void 0!==an&&an,Do=b.tether,Ss=void 0===Do||Do,Yo=b.tetherOffset,ia=void 0===Yo?0:Yo,v=yr(te,{boundary:b.boundary,rootBoundary:b.rootBoundary,padding:b.padding,altBoundary:b.altBoundary}),D=Pn(te.placement),B=yo(te.placement),ye=!B,He=go(D),yt=function Gr(P){return"x"===P?"y":"x"}(He),Wt=te.modifiersData.popperOffsets,gn=te.rects.reference,nr=te.rects.popper,ti="function"==typeof ia?ia(Object.assign({},te.rects,{placement:te.placement})):ia,$o={x:0,y:0};if(Wt){if(Ge||fr){var Hs="y"===He?Qr:so,po="y"===He?Ci:_i,ds="y"===He?"height":"width",sa=Wt[He],Js=Wt[He]+v[Hs],zr=Wt[He]-v[po],Rr=Ss?-nr[ds]/2:0,Ur=B===Kt?gn[ds]:nr[ds],Fi=B===Kt?-nr[ds]:-gn[ds],ro=te.elements.arrow,$a=Ss&&ro?mo(ro):{width:0,height:0},ms=te.modifiersData["arrow#persistent"]?te.modifiersData["arrow#persistent"].padding:{top:0,right:0,bottom:0,left:0},xa=ms[Hs],za=ms[po],va=no(0,gn[ds],$a[ds]),kf=ye?gn[ds]/2-Rr-va-xa-ti:Ur-va-xa-ti,og=ye?-gn[ds]/2+Rr+va+za+ti:Fi+va+za+ti,c_=te.elements.arrow&&qn(te.elements.arrow),zg=te.modifiersData.offset?te.modifiersData.offset[te.placement][He]:0,ag=Wt[He]+kf-zg-(c_?"y"===He?c_.clientTop||0:c_.clientLeft||0:0),vm=Wt[He]+og-zg;if(Ge){var ym=no(Ss?kt(Js,ag):Js,sa,Ss?pt(zr,vm):zr);Wt[He]=ym,$o[He]=ym-sa}if(fr){var vg=Wt[yt],Tf=vg+v["x"===He?Qr:so],Vg=vg-v["x"===He?Ci:_i],Zg=no(Ss?kt(Tf,ag):Tf,vg,Ss?pt(Vg,vm):Vg);Wt[yt]=Zg,$o[yt]=Zg-vg}}te.modifiersData[G]=$o}},requiresIfExists:["offset"]},ya={name:"arrow",enabled:!0,phase:"main",fn:function es(P){var te,b=P.state,G=P.name,Te=P.options,Ge=b.elements.arrow,an=b.modifiersData.popperOffsets,fr=Pn(b.placement),wr=go(fr),oi=[so,_i].indexOf(fr)>=0?"height":"width";if(Ge&&an){var ts=function(te,b){return er("number"!=typeof(te="function"==typeof te?te(Object.assign({},b.rects,{placement:b.placement})):te)?te:vr(te,Sr))}(Te.padding,b),Do=mo(Ge),Ss="y"===wr?Qr:so,Yo="y"===wr?Ci:_i,ia=b.rects.reference[oi]+b.rects.reference[wr]-an[wr]-b.rects.popper[oi],v=an[wr]-b.rects.reference[wr],D=qn(Ge),B=D?"y"===wr?D.clientHeight||0:D.clientWidth||0:0,Wt=B/2-Do[oi]/2+(ia/2-v/2),gn=no(ts[Ss],Wt,B-Do[oi]-ts[Yo]);b.modifiersData[G]=((te={})[wr]=gn,te.centerOffset=gn-Wt,te)}},effect:function ga(P){var te=P.state,G=P.options.element,Te=void 0===G?"[data-popper-arrow]":G;null!=Te&&("string"==typeof Te&&!(Te=te.elements.popper.querySelector(Te))||!ei(te.elements.popper,Te)||(te.elements.arrow=Te))},requires:["popperOffsets"],requiresIfExists:["preventOverflow"]};function fl(P,te,b){void 0===b&&(b=!1);var G=dt(te),Te=dt(te)&&function Pa(P){var te=P.getBoundingClientRect();return 1!==(te.width/P.offsetWidth||1)||1!==(te.height/P.offsetHeight||1)}(te),Ge=to(te),an=Gt(P,Te),fr={scrollLeft:0,scrollTop:0},wr={x:0,y:0};return(G||!G&&!b)&&(("body"!==Oi(te)||Uo(Ge))&&(fr=function la(P){return P!==Ui(P)&&dt(P)?function fa(P){return{scrollLeft:P.scrollLeft,scrollTop:P.scrollTop}}(P):Rn(P)}(te)),dt(te)?((wr=Gt(te,!0)).x+=te.clientLeft,wr.y+=te.clientTop):Ge&&(wr.x=_t(Ge))),{x:an.left+fr.scrollLeft-wr.x,y:an.top+fr.scrollTop-wr.y,width:an.width,height:an.height}}function To(P){var te=new Map,b=new Set,G=[];function Te(Ge){b.add(Ge.name),[].concat(Ge.requires||[],Ge.requiresIfExists||[]).forEach(function(fr){if(!b.has(fr)){var wr=te.get(fr);wr&&Te(wr)}}),G.push(Ge)}return P.forEach(function(Ge){te.set(Ge.name,Ge)}),P.forEach(function(Ge){b.has(Ge.name)||Te(Ge)}),G}function Zo(P){var te;return function(){return te||(te=new Promise(function(b){Promise.resolve().then(function(){te=void 0,b(P())})})),te}}var tl={placement:"bottom",modifiers:[],strategy:"absolute"};function Ys(){for(var P=arguments.length,te=new Array(P),b=0;b<P;b++)te[b]=arguments[b];return!te.some(function(G){return!(G&&"function"==typeof G.getBoundingClientRect)})}function ko(P){void 0===P&&(P={});var b=P.defaultModifiers,G=void 0===b?[]:b,Te=P.defaultOptions,Ge=void 0===Te?tl:Te;return function(fr,wr,ci){void 0===ci&&(ci=Ge);var oi={placement:"bottom",orderedModifiers:[],options:Object.assign({},tl,Ge),modifiersData:{},elements:{reference:fr,popper:wr},attributes:{},styles:{}},ts=[],Do=!1,Ss={state:oi,setOptions:function(D){var B="function"==typeof D?D(oi.options):D;ia(),oi.options=Object.assign({},Ge,oi.options,B),oi.scrollParents={reference:ao(fr)?lo(fr):fr.contextElement?lo(fr.contextElement):[],popper:lo(wr)};var ye=function ml(P){var te=To(P);return vi.reduce(function(b,G){return b.concat(te.filter(function(Te){return Te.phase===G}))},[])}(function vs(P){var te=P.reduce(function(b,G){var Te=b[G.name];return b[G.name]=Te?Object.assign({},Te,G,{options:Object.assign({},Te.options,G.options),data:Object.assign({},Te.data,G.data)}):G,b},{});return Object.keys(te).map(function(b){return te[b]})}([].concat(G,oi.options.modifiers)));return oi.orderedModifiers=ye.filter(function(Hs){return Hs.enabled}),function Yo(){oi.orderedModifiers.forEach(function(v){var B=v.options,He=v.effect;if("function"==typeof He){var yt=He({state:oi,name:v.name,instance:Ss,options:void 0===B?{}:B});ts.push(yt||function(){})}})}(),Ss.update()},forceUpdate:function(){if(!Do){var D=oi.elements,B=D.reference,ye=D.popper;if(Ys(B,ye)){oi.rects={reference:fl(B,qn(ye),"fixed"===oi.options.strategy),popper:mo(ye)},oi.reset=!1,oi.placement=oi.options.placement,oi.orderedModifiers.forEach(function(Hs){return oi.modifiersData[Hs.name]=Object.assign({},Hs.data)});for(var yt=0;yt<oi.orderedModifiers.length;yt++)if(!0!==oi.reset){var Wt=oi.orderedModifiers[yt],gn=Wt.fn,nr=Wt.options;"function"==typeof gn&&(oi=gn({state:oi,options:void 0===nr?{}:nr,name:Wt.name,instance:Ss})||oi)}else oi.reset=!1,yt=-1}}},update:Zo(function(){return new Promise(function(v){Ss.forceUpdate(),v(oi)})}),destroy:function(){ia(),Do=!0}};if(!Ys(fr,wr))return Ss;function ia(){ts.forEach(function(v){return v()}),ts=[]}return Ss.setOptions(ci).then(function(v){!Do&&ci.onFirstUpdate&&ci.onFirstUpdate(v)}),Ss}}var Ps={passive:!0},tt={top:"auto",right:"auto",bottom:"auto",left:"auto"};function ne(P){var te,b=P.popper,G=P.popperRect,Te=P.placement,Ge=P.variation,an=P.offsets,fr=P.position,wr=P.gpuAcceleration,ci=P.adaptive,oi=P.roundOffsets,ts=!0===oi?function rn(P){var b=P.y,Te=window.devicePixelRatio||1;return{x:dn(dn(P.x*Te)/Te)||0,y:dn(dn(b*Te)/Te)||0}}(an):"function"==typeof oi?oi(an):an,Do=ts.x,Ss=void 0===Do?0:Do,Yo=ts.y,ia=void 0===Yo?0:Yo,v=an.hasOwnProperty("x"),D=an.hasOwnProperty("y"),B=so,ye=Qr,He=window;if(ci){var yt=qn(b),Wt="clientHeight",gn="clientWidth";yt===Ui(b)&&"static"!==ct(yt=to(b)).position&&"absolute"===fr&&(Wt="scrollHeight",gn="scrollWidth"),(Te===Qr||(Te===so||Te===_i)&&Ge===un)&&(ye=Ci,ia-=yt[Wt]-G.height,ia*=wr?1:-1),(Te===so||(Te===Qr||Te===Ci)&&Ge===un)&&(B=_i,Ss-=yt[gn]-G.width,Ss*=wr?1:-1)}var ti,nr=Object.assign({position:fr},ci&&tt);return Object.assign({},nr,wr?((ti={})[ye]=D?"0":"",ti[B]=v?"0":"",ti.transform=(He.devicePixelRatio||1)<=1?"translate("+Ss+"px, "+ia+"px)":"translate3d("+Ss+"px, "+ia+"px, 0)",ti):((te={})[ye]=D?ia+"px":"",te[B]=v?Ss+"px":"",te.transform="",te))}var hs=ko({defaultModifiers:[{name:"eventListeners",enabled:!0,phase:"write",fn:function(){},effect:function ps(P){var te=P.state,b=P.instance,G=P.options,Te=G.scroll,Ge=void 0===Te||Te,an=G.resize,fr=void 0===an||an,wr=Ui(te.elements.popper),ci=[].concat(te.scrollParents.reference,te.scrollParents.popper);return Ge&&ci.forEach(function(oi){oi.addEventListener("scroll",b.update,Ps)}),fr&&wr.addEventListener("resize",b.update,Ps),function(){Ge&&ci.forEach(function(oi){oi.removeEventListener("scroll",b.update,Ps)}),fr&&wr.removeEventListener("resize",b.update,Ps)}},data:{}},{name:"popperOffsets",enabled:!0,phase:"read",fn:function Nr(P){var te=P.state;te.modifiersData[P.name]=Go({reference:te.rects.reference,element:te.rects.popper,strategy:"absolute",placement:te.placement})},data:{}},{name:"computeStyles",enabled:!0,phase:"beforeWrite",fn:function Le(P){var te=P.state,b=P.options,G=b.gpuAcceleration,Te=void 0===G||G,Ge=b.adaptive,an=void 0===Ge||Ge,fr=b.roundOffsets,wr=void 0===fr||fr,oi={placement:Pn(te.placement),variation:yo(te.placement),popper:te.elements.popper,popperRect:te.rects.popper,gpuAcceleration:Te};null!=te.modifiersData.popperOffsets&&(te.styles.popper=Object.assign({},te.styles.popper,ne(Object.assign({},oi,{offsets:te.modifiersData.popperOffsets,position:te.options.strategy,adaptive:an,roundOffsets:wr})))),null!=te.modifiersData.arrow&&(te.styles.arrow=Object.assign({},te.styles.arrow,ne(Object.assign({},oi,{offsets:te.modifiersData.arrow,position:"absolute",adaptive:!1,roundOffsets:wr})))),te.attributes.popper=Object.assign({},te.attributes.popper,{"data-popper-placement":te.placement})},data:{}},{name:"applyStyles",enabled:!0,phase:"write",fn:function on(P){var te=P.state;Object.keys(te.elements).forEach(function(b){var G=te.styles[b]||{},Te=te.attributes[b]||{},Ge=te.elements[b];!dt(Ge)||!Oi(Ge)||(Object.assign(Ge.style,G),Object.keys(Te).forEach(function(an){var fr=Te[an];!1===fr?Ge.removeAttribute(an):Ge.setAttribute(an,!0===fr?"":fr)}))})},effect:function Kr(P){var te=P.state,b={popper:{position:te.options.strategy,left:"0",top:"0",margin:"0"},arrow:{position:"absolute"},reference:{}};return Object.assign(te.elements.popper.style,b.popper),te.styles=b,te.elements.arrow&&Object.assign(te.elements.arrow.style,b.arrow),function(){Object.keys(te.elements).forEach(function(G){var Te=te.elements[G],Ge=te.attributes[G]||{},fr=Object.keys(te.styles.hasOwnProperty(G)?te.styles[G]:b[G]).reduce(function(wr,ci){return wr[ci]="",wr},{});!dt(Te)||!Oi(Te)||(Object.assign(Te.style,fr),Object.keys(Ge).forEach(function(wr){Te.removeAttribute(wr)}))})}},requires:["computeStyles"]}]});const Xs={name:"offset",enabled:!0,phase:"main",requires:["popperOffsets"],fn:function Ls(P){var te=P.state,G=P.name,Te=P.options.offset,Ge=void 0===Te?[0,0]:Te,an=ii.reduce(function(oi,ts){return oi[ts]=function zo(P,te,b){var G=Pn(P),Te=[so,Qr].indexOf(G)>=0?-1:1,Ge="function"==typeof b?b(Object.assign({},te,{placement:P})):b,an=Ge[0],fr=Ge[1];return an=an||0,fr=(fr||0)*Te,[so,_i].indexOf(G)>=0?{x:fr,y:an}:{x:an,y:fr}}(ts,te.rects,Ge),oi},{}),fr=an[te.placement],ci=fr.y;null!=te.modifiersData.popperOffsets&&(te.modifiersData.popperOffsets.x+=fr.x,te.modifiersData.popperOffsets.y+=ci),te.modifiersData[G]=an}};function Pl(P,te){if(1&P){const b=r.EpF();r.TgZ(0,"button",1),r.NdJ("click",function(){return r.CHM(b),r.oxw().close()}),r.qZA()}}const Ku=["*"],Hl=["ngbDatepickerDayView",""],Ua=["month"],Qe=["year"];function zt(P,te){if(1&P&&(r.TgZ(0,"option",5),r._uU(1),r.qZA()),2&P){const b=te.$implicit,G=r.oxw();r.Q6J("value",b),r.uIk("aria-label",G.i18n.getMonthFullName(b,null==G.date?null:G.date.year)),r.xp6(1),r.Oqu(G.i18n.getMonthShortName(b,null==G.date?null:G.date.year))}}function ot(P,te){if(1&P&&(r.TgZ(0,"option",5),r._uU(1),r.qZA()),2&P){const b=te.$implicit,G=r.oxw();r.Q6J("value",b),r.xp6(1),r.Oqu(G.i18n.getYearNumerals(b))}}function jt(P,te){if(1&P){const b=r.EpF();r.TgZ(0,"ngb-datepicker-navigation-select",7),r.NdJ("select",function(Te){return r.CHM(b),r.oxw().select.emit(Te)}),r.qZA()}if(2&P){const b=r.oxw();r.Q6J("date",b.date)("disabled",b.disabled)("months",b.selectBoxes.months)("years",b.selectBoxes.years)}}function zn(P,te){1&P&&r._UZ(0,"div",0)}function qr(P,te){1&P&&r._UZ(0,"div",0)}function Di(P,te){if(1&P&&(r.YNc(0,zn,1,0,"div",9),r.TgZ(1,"div",10),r._uU(2),r.qZA(),r.YNc(3,qr,1,0,"div",9)),2&P){const b=te.$implicit,G=te.index,Te=r.oxw(2);r.Q6J("ngIf",G>0),r.xp6(2),r.hij(" ",Te.i18n.getMonthLabel(b.firstDate)," "),r.xp6(1),r.Q6J("ngIf",G!==Te.months.length-1)}}function as(P,te){if(1&P&&r.YNc(0,Di,4,3,"ng-template",8),2&P){const b=r.oxw();r.Q6J("ngForOf",b.months)}}const js=["defaultDayTemplate"],As=["content"];function Ns(P,te){if(1&P&&r._UZ(0,"div",7),2&P){const G=te.currentMonth,Te=te.selected,Ge=te.disabled,an=te.focused;r.Q6J("date",te.date)("currentMonth",G)("selected",Te)("disabled",Ge)("focused",an)}}function Io(P,te){if(1&P&&(r.TgZ(0,"div",12),r._uU(1),r.qZA()),2&P){const b=r.oxw().$implicit,G=r.oxw(2);r.xp6(1),r.hij(" ",G.i18n.getMonthLabel(b.firstDate)," ")}}function Ka(P,te){if(1&P&&(r.TgZ(0,"div",9),r.YNc(1,Io,2,1,"div",10),r._UZ(2,"ngb-datepicker-month",11),r.qZA()),2&P){const b=te.$implicit,G=r.oxw(2);r.xp6(1),r.Q6J("ngIf","none"===G.navigation||G.displayMonths>1&&"select"===G.navigation),r.xp6(1),r.Q6J("month",b.firstDate)}}function sl(P,te){if(1&P&&r.YNc(0,Ka,3,2,"div",8),2&P){const b=r.oxw();r.Q6J("ngForOf",b.model.months)}}function Bs(P,te){if(1&P){const b=r.EpF();r.TgZ(0,"ngb-datepicker-navigation",13),r.NdJ("navigate",function(Te){return r.CHM(b),r.oxw().onNavigateEvent(Te)})("select",function(Te){return r.CHM(b),r.oxw().onNavigateDateSelect(Te)}),r.qZA()}if(2&P){const b=r.oxw();r.Q6J("date",b.model.firstDate)("months",b.model.months)("disabled",b.model.disabled)("showSelect","select"===b.model.navigation)("prevDisabled",b.model.prevDisabled)("nextDisabled",b.model.nextDisabled)("selectBoxes",b.model.selectBoxes)}}function lt(P,te){}function Xe(P,te){}function ke(P,te){if(1&P&&(r.TgZ(0,"div",5),r._uU(1),r.qZA()),2&P){const b=r.oxw(2);r.xp6(1),r.Oqu(b.i18n.getWeekLabel())}}function Ut(P,te){if(1&P&&(r.TgZ(0,"div",6),r._uU(1),r.qZA()),2&P){const b=te.$implicit;r.xp6(1),r.Oqu(b)}}function pi(P,te){if(1&P&&(r.TgZ(0,"div",2),r.YNc(1,ke,2,1,"div",3),r.YNc(2,Ut,2,1,"div",4),r.qZA()),2&P){const b=r.oxw();r.xp6(1),r.Q6J("ngIf",b.datepicker.showWeekNumbers),r.xp6(1),r.Q6J("ngForOf",b.viewModel.weekdays)}}function Wo(P,te){if(1&P&&(r.TgZ(0,"div",11),r._uU(1),r.qZA()),2&P){const b=r.oxw(2).$implicit,G=r.oxw();r.xp6(1),r.Oqu(G.i18n.getWeekNumerals(b.number))}}function Ya(P,te){}function yl(P,te){if(1&P&&r.YNc(0,Ya,0,0,"ng-template",14),2&P){const b=r.oxw().$implicit,G=r.oxw(3);r.Q6J("ngTemplateOutlet",G.datepicker.dayTemplate)("ngTemplateOutletContext",b.context)}}function Xu(P,te){if(1&P){const b=r.EpF();r.TgZ(0,"div",12),r.NdJ("click",function(Te){const an=r.CHM(b).$implicit;return r.oxw(3).doSelect(an),Te.preventDefault()}),r.YNc(1,yl,1,2,"ng-template",13),r.qZA()}if(2&P){const b=te.$implicit;r.ekj("disabled",b.context.disabled)("hidden",b.hidden)("ngb-dp-today",b.context.today),r.Q6J("tabindex",b.tabindex),r.uIk("aria-label",b.ariaLabel),r.xp6(1),r.Q6J("ngIf",!b.hidden)}}function Lc(P,te){if(1&P&&(r.TgZ(0,"div",8),r.YNc(1,Wo,2,1,"div",9),r.YNc(2,Xu,2,9,"div",10),r.qZA()),2&P){const b=r.oxw().$implicit,G=r.oxw();r.xp6(1),r.Q6J("ngIf",G.datepicker.showWeekNumbers),r.xp6(1),r.Q6J("ngForOf",b.days)}}function vd(P,te){1&P&&r.YNc(0,Lc,3,2,"div",7),2&P&&r.Q6J("ngIf",!te.$implicit.collapsed)}const Hi=["dialog"],oa=["ngbNavOutlet",""];function Ia(P,te){}const ys=function(P){return{$implicit:P}};function qu(P,te){if(1&P&&(r.TgZ(0,"div",2),r.YNc(1,Ia,0,0,"ng-template",3),r.qZA()),2&P){const b=r.oxw().$implicit,G=r.oxw();r.Q6J("item",b)("nav",G.nav)("role",G.paneRole),r.xp6(1),r.Q6J("ngTemplateOutlet",(null==b.contentTpl?null:b.contentTpl.templateRef)||null)("ngTemplateOutletContext",r.VKq(5,ys,b.active||G.isPanelTransitioning(b)))}}function bl(P,te){if(1&P&&r.YNc(0,qu,2,7,"div",1),2&P){const b=te.$implicit,G=r.oxw();r.Q6J("ngIf",b.isPanelInDom()||G.isPanelTransitioning(b))}}function gi(P,te){if(1&P&&r._uU(0),2&P){const b=r.oxw(2);r.Oqu(b.title)}}function zi(P,te){}function Dr(P,te){if(1&P&&(r.TgZ(0,"h3",3),r.YNc(1,gi,1,1,"ng-template",null,4,r.W1O),r.YNc(3,zi,0,0,"ng-template",5),r.qZA()),2&P){const b=r.MAs(2),G=r.oxw();r.xp6(3),r.Q6J("ngTemplateOutlet",G.isTitleTemplate()?G.title:b)("ngTemplateOutletContext",G.context)}}function kn(P,te){if(1&P&&(r.TgZ(0,"span"),r.SDv(1,2),r.ALo(2,"percent"),r.qZA()),2&P){const b=r.oxw();r.xp6(2),r.pQV(r.lcZ(2,1,b.getValue()/b.max)),r.QtT(1)}}function $s(P,te){if(1&P){const b=r.EpF();r.TgZ(0,"button",11),r.NdJ("click",function(){r.CHM(b);const Te=r.oxw();return Te.changeHour(Te.hourStep)}),r._UZ(1,"span",12),r.TgZ(2,"span",13),r.SDv(3,14),r.qZA()()}if(2&P){const b=r.oxw();r.ekj("btn-sm",b.isSmallSize)("btn-lg",b.isLargeSize)("disabled",b.disabled),r.Q6J("disabled",b.disabled)}}function Es(P,te){if(1&P){const b=r.EpF();r.TgZ(0,"button",11),r.NdJ("click",function(){r.CHM(b);const Te=r.oxw();return Te.changeHour(-Te.hourStep)}),r._UZ(1,"span",15),r.TgZ(2,"span",13),r.SDv(3,16),r.qZA()()}if(2&P){const b=r.oxw();r.ekj("btn-sm",b.isSmallSize)("btn-lg",b.isLargeSize)("disabled",b.disabled),r.Q6J("disabled",b.disabled)}}function pl(P,te){if(1&P){const b=r.EpF();r.TgZ(0,"button",11),r.NdJ("click",function(){r.CHM(b);const Te=r.oxw();return Te.changeMinute(Te.minuteStep)}),r._UZ(1,"span",12),r.TgZ(2,"span",13),r.SDv(3,17),r.qZA()()}if(2&P){const b=r.oxw();r.ekj("btn-sm",b.isSmallSize)("btn-lg",b.isLargeSize)("disabled",b.disabled),r.Q6J("disabled",b.disabled)}}function Ks(P,te){if(1&P){const b=r.EpF();r.TgZ(0,"button",11),r.NdJ("click",function(){r.CHM(b);const Te=r.oxw();return Te.changeMinute(-Te.minuteStep)}),r._UZ(1,"span",15),r.TgZ(2,"span",13),r.SDv(3,18),r.qZA()()}if(2&P){const b=r.oxw();r.ekj("btn-sm",b.isSmallSize)("btn-lg",b.isLargeSize)("disabled",b.disabled),r.Q6J("disabled",b.disabled)}}function Wc(P,te){1&P&&(r.TgZ(0,"div",5),r._uU(1,":"),r.qZA())}function Fc(P,te){if(1&P){const b=r.EpF();r.TgZ(0,"button",11),r.NdJ("click",function(){r.CHM(b);const Te=r.oxw(2);return Te.changeSecond(Te.secondStep)}),r._UZ(1,"span",12),r.TgZ(2,"span",13),r.SDv(3,21),r.qZA()()}if(2&P){const b=r.oxw(2);r.ekj("btn-sm",b.isSmallSize)("btn-lg",b.isLargeSize)("disabled",b.disabled),r.Q6J("disabled",b.disabled)}}function xu(P,te){if(1&P){const b=r.EpF();r.TgZ(0,"button",11),r.NdJ("click",function(){r.CHM(b);const Te=r.oxw(2);return Te.changeSecond(-Te.secondStep)}),r._UZ(1,"span",15),r.TgZ(2,"span",13),r.SDv(3,22),r.qZA()()}if(2&P){const b=r.oxw(2);r.ekj("btn-sm",b.isSmallSize)("btn-lg",b.isLargeSize)("disabled",b.disabled),r.Q6J("disabled",b.disabled)}}function Eu(P,te){if(1&P){const b=r.EpF();r.TgZ(0,"div",19),r.YNc(1,Fc,4,7,"button",3),r.TgZ(2,"input",20),r.NdJ("change",function(Te){return r.CHM(b),r.oxw().updateSecond(Te.target.value)})("blur",function(){return r.CHM(b),r.oxw().handleBlur()})("input",function(Te){return r.CHM(b),r.oxw().formatInput(Te.target)})("keydown.ArrowUp",function(Te){r.CHM(b);const Ge=r.oxw();return Ge.changeSecond(Ge.secondStep),Te.preventDefault()})("keydown.ArrowDown",function(Te){r.CHM(b);const Ge=r.oxw();return Ge.changeSecond(-Ge.secondStep),Te.preventDefault()}),r.qZA(),r.YNc(3,xu,4,7,"button",3),r.qZA()}if(2&P){const b=r.oxw();r.xp6(1),r.Q6J("ngIf",b.spinners),r.xp6(1),r.ekj("form-control-sm",b.isSmallSize)("form-control-lg",b.isLargeSize),r.Q6J("value",b.formatMinSec(null==b.model?null:b.model.second))("readOnly",b.readonlyInputs)("disabled",b.disabled),r.xp6(1),r.Q6J("ngIf",b.spinners)}}function Gd(P,te){1&P&&r._UZ(0,"div",5)}function yd(P,te){if(1&P&&(r.ynx(0),r.SDv(1,27),r.BQk()),2&P){const b=r.oxw(2);r.xp6(1),r.pQV(b.i18n.getAfternoonPeriod()),r.QtT(1)}}function Ed(P,te){if(1&P&&r.SDv(0,28),2&P){const b=r.oxw(2);r.pQV(b.i18n.getMorningPeriod()),r.QtT(0)}}function Uc(P,te){if(1&P){const b=r.EpF();r.TgZ(0,"div",23)(1,"button",24),r.NdJ("click",function(){return r.CHM(b),r.oxw().toggleMeridian()}),r.YNc(2,yd,2,1,"ng-container",25),r.YNc(3,Ed,1,1,"ng-template",null,26,r.W1O),r.qZA()()}if(2&P){const b=r.MAs(4),G=r.oxw();r.xp6(1),r.ekj("btn-sm",G.isSmallSize)("btn-lg",G.isLargeSize)("disabled",G.disabled),r.Q6J("disabled",G.disabled),r.xp6(1),r.Q6J("ngIf",G.model&&G.model.hour>=12)("ngIfElse",b)}}function Mo(P,te){if(1&P&&(r.TgZ(0,"span"),r._uU(1),r.qZA()),2&P){const b=r.oxw().$implicit,G=r.oxw();r.Tol(G.highlightClass),r.xp6(1),r.Oqu(b)}}function No(P,te){if(1&P&&r._uU(0),2&P){const b=r.oxw().$implicit;r.Oqu(b)}}function Sa(P,te){if(1&P&&(r.YNc(0,Mo,2,3,"span",1),r.YNc(1,No,1,1,"ng-template",null,2,r.W1O)),2&P){const b=te.odd,G=r.MAs(2);r.Q6J("ngIf",b)("ngIfElse",G)}}function Sl(P,te){if(1&P&&r._UZ(0,"ngb-highlight",2),2&P){const G=te.term;r.Q6J("result",(0,te.formatter)(te.result))("term",G)}}function ru(P,te){}const bu=function(P,te,b){return{result:P,term:te,formatter:b}};function gc(P,te){if(1&P){const b=r.EpF();r.TgZ(0,"button",3),r.NdJ("mouseenter",function(){const Ge=r.CHM(b).index;return r.oxw().markActive(Ge)})("click",function(){const Ge=r.CHM(b).$implicit;return r.oxw().select(Ge)}),r.YNc(1,ru,0,0,"ng-template",4),r.qZA()}if(2&P){const b=te.$implicit,G=te.index,Te=r.oxw(),Ge=r.MAs(1);r.ekj("active",G===Te.activeIdx),r.Q6J("id",Te.id+"-"+G),r.xp6(1),r.Q6J("ngTemplateOutlet",Te.resultTemplate||Ge)("ngTemplateOutletContext",r.kEZ(5,bu,b,Te.term,Te.formatter))}}function _n(P){return parseInt(`${P}`,10)}function pa(P){return null!=P?`${P}`:""}function $e(P){return"string"==typeof P}function Me(P){return!isNaN(_n(P))}function _e(P){return"number"==typeof P&&isFinite(P)&&Math.floor(P)===P}function at(P){return null!=P}function Qt(P){return Me(P)?`0${P}`.slice(-2):""}function cr(P,te){return P&&P.className&&P.className.split&&P.className.split(/\s+/).indexOf(te)>=0}function Lo(P){return(P||document.body).getBoundingClientRect()}function _s(P){return P.normalize("NFD").replace(/[\u0300-\u036f]/g,"")}const Ca={animation:!0,transitionTimerDelayMs:5},Ru=()=>{},{transitionTimerDelayMs:lc}=Ca,Fa=new Map,nl=(P,te,b,G)=>{let Te=G.context||{};const Ge=Fa.get(te);if(Ge)switch(G.runningTransition){case"continue":return ge.E;case"stop":P.run(()=>Ge.transition$.complete()),Te=Object.assign(Ge.context,Te),Fa.delete(te)}const an=b(te,G.animation,Te)||Ru;if(!G.animation||"none"===window.getComputedStyle(te).transitionProperty)return P.run(()=>an()),(0,ae.of)(void 0).pipe(function Ta(P){return te=>new se.y(b=>te.subscribe({next:an=>P.run(()=>b.next(an)),error:an=>P.run(()=>b.error(an)),complete:()=>P.run(()=>b.complete())}))}(P));const fr=new he.xQ,wr=new he.xQ,ci=fr.pipe(function xe(...P){return te=>(0,Be.z)(te,(0,ae.of)(...P))}(!0));Fa.set(te,{transition$:fr,complete:()=>{wr.next(),wr.complete()},context:Te});const oi=function ha(P){const{transitionDelay:te,transitionDuration:b}=window.getComputedStyle(P);return 1e3*(parseFloat(te)+parseFloat(b))}(te);return P.runOutsideAngular(()=>{const ts=(0,be.R)(te,"transitionend").pipe((0,Vt.R)(ci),(0,hn.h)(({target:Ss})=>Ss===te));y((0,we.H)(oi+lc).pipe((0,Vt.R)(ci)),ts,wr).pipe((0,Vt.R)(ci)).subscribe(()=>{Fa.delete(te),P.run(()=>{an(),fr.next(),fr.complete()})})}),fr.asObservable()},Bu=(P,te,b)=>{let{direction:G,maxHeight:Te}=b;const{classList:Ge}=P;function an(){Ge.add("collapse"),"show"===G?Ge.add("show"):Ge.remove("show")}if(te)return Te||(Te=function vc(P){if("undefined"==typeof navigator)return"0px";const{classList:te}=P,b=te.contains("show");b||te.add("show"),P.style.height="";const G=P.getBoundingClientRect().height+"px";return b||te.remove("show"),G}(P),b.maxHeight=Te,P.style.height="show"!==G?Te:"0px",Ge.remove("collapse"),Ge.remove("collapsing"),Ge.remove("show"),Lo(P),Ge.add("collapsing")),P.style.height="show"===G?Te:"0px",()=>{an(),Ge.remove("collapsing"),P.style.height=""};an()};let Bl=(()=>{class P{constructor(){this.animation=Ca.animation}}return P.\u0275fac=function(b){return new(b||P)},P.\u0275prov=r.Yz7({token:P,factory:P.\u0275fac,providedIn:"root"}),P})();const Ol=({classList:P})=>{P.remove("show")};let Ll=(()=>{class P{constructor(b){this._ngbConfig=b,this.dismissible=!0,this.type="warning"}get animation(){return void 0===this._animation?this._ngbConfig.animation:this._animation}set animation(b){this._animation=b}}return P.\u0275fac=function(b){return new(b||P)(r.LFG(Bl))},P.\u0275prov=r.Yz7({token:P,factory:P.\u0275fac,providedIn:"root"}),P})(),Uu=(()=>{class P{constructor(b,G,Te,Ge){this._renderer=G,this._element=Te,this._zone=Ge,this.closed=new r.vpe,this.dismissible=b.dismissible,this.type=b.type,this.animation=b.animation}close(){const b=nl(this._zone,this._element.nativeElement,Ol,{animation:this.animation,runningTransition:"continue"});return b.subscribe(()=>this.closed.emit()),b}ngOnChanges(b){const G=b.type;G&&!G.firstChange&&(this._renderer.removeClass(this._element.nativeElement,`alert-${G.previousValue}`),this._renderer.addClass(this._element.nativeElement,`alert-${G.currentValue}`))}ngOnInit(){this._renderer.addClass(this._element.nativeElement,`alert-${this.type}`)}}return P.\u0275fac=function(b){return new(b||P)(r.Y36(Ll),r.Y36(r.Qsj),r.Y36(r.SBq),r.Y36(r.R0b))},P.\u0275cmp=r.Xpm({type:P,selectors:[["ngb-alert"]],hostAttrs:["role","alert",1,"alert","show"],hostVars:4,hostBindings:function(b,G){2&b&&r.ekj("fade",G.animation)("alert-dismissible",G.dismissible)},inputs:{animation:"animation",dismissible:"dismissible",type:"type"},outputs:{closed:"closed"},exportAs:["ngbAlert"],features:[r.TTD],ngContentSelectors:Ku,decls:2,vars:1,consts:function(){let te;return te="Close",[["type","button","class","btn-close","aria-label",te,3,"click",4,"ngIf"],["type","button","aria-label",te,1,"btn-close",3,"click"]]},template:function(b,G){1&b&&(r.F$t(),r.Hsn(0),r.YNc(1,Pl,1,0,"button",0)),2&b&&(r.xp6(1),r.Q6J("ngIf",G.dismissible))},directives:[a.O5],styles:["ngb-alert{display:block}\n"],encapsulation:2,changeDetection:0}),P})(),ll=(()=>{class P{}return P.\u0275fac=function(b){return new(b||P)},P.\u0275mod=r.oAB({type:P}),P.\u0275inj=r.cJS({imports:[[a.ez]]}),P})(),Pu=(()=>{class P{constructor(b){this._ngbConfig=b}get animation(){return void 0===this._animation?this._ngbConfig.animation:this._animation}set animation(b){this._animation=b}}return P.\u0275fac=function(b){return new(b||P)(r.LFG(Bl))},P.\u0275prov=r.Yz7({token:P,factory:P.\u0275fac,providedIn:"root"}),P})(),ad=(()=>{class P{constructor(b,G,Te){this._element=b,this._zone=Te,this.collapsed=!1,this.ngbCollapseChange=new r.vpe,this.shown=new r.vpe,this.hidden=new r.vpe,this.animation=G.animation}ngOnInit(){this._runTransition(this.collapsed,!1)}ngOnChanges({collapsed:b}){b.firstChange||this._runTransitionWithEvents(this.collapsed,this.animation)}toggle(b=this.collapsed){this.collapsed=!b,this.ngbCollapseChange.next(this.collapsed),this._runTransitionWithEvents(this.collapsed,this.animation)}_runTransition(b,G){return nl(this._zone,this._element.nativeElement,Bu,{animation:G,runningTransition:"stop",context:{direction:b?"hide":"show"}})}_runTransitionWithEvents(b,G){this._runTransition(b,G).subscribe(()=>{b?this.hidden.emit():this.shown.emit()})}}return P.\u0275fac=function(b){return new(b||P)(r.Y36(r.SBq),r.Y36(Pu),r.Y36(r.R0b))},P.\u0275dir=r.lG2({type:P,selectors:[["","ngbCollapse",""]],inputs:{animation:"animation",collapsed:["ngbCollapse","collapsed"]},outputs:{ngbCollapseChange:"ngbCollapseChange",shown:"shown",hidden:"hidden"},exportAs:["ngbCollapse"],features:[r.TTD]}),P})(),nc=(()=>{class P{}return P.\u0275fac=function(b){return new(b||P)},P.\u0275mod=r.oAB({type:P}),P.\u0275inj=r.cJS({}),P})();class Oa{constructor(te,b,G){this.year=_e(te)?te:null,this.month=_e(b)?b:null,this.day=_e(G)?G:null}static from(te){return te instanceof Oa?te:te?new Oa(te.year,te.month,te.day):null}equals(te){return null!=te&&this.year===te.year&&this.month===te.month&&this.day===te.day}before(te){return!!te&&(this.year===te.year?this.month===te.month?this.day!==te.day&&this.day<te.day:this.month<te.month:this.year<te.year)}after(te){return!!te&&(this.year===te.year?this.month===te.month?this.day!==te.day&&this.day>te.day:this.month>te.month:this.year>te.year)}}function Jc(P,te){return!function cp(P,te){return!P&&!te||!!P&&!!te&&P.equals(te)}(P,te)}function ld(P,te){return!(!P&&!te||P&&te&&P.year===te.year&&P.month===te.month)}function vo(P,te,b){return P&&te&&P.before(te)?te:P&&b&&P.after(b)?b:P||null}function du(P,te){const{minDate:b,maxDate:G,disabled:Te,markDisabled:Ge}=te;return!(null==P||Te||Ge&&Ge(P,{year:P.year,month:P.month})||b&&P.before(b)||G&&P.after(G))}function Jl(P){return new Oa(P.getFullYear(),P.getMonth()+1,P.getDate())}function Sc(P){const te=new Date(P.year,P.month-1,P.day,12);return isNaN(te.getTime())||te.setFullYear(P.year),te}let ju=(()=>{class P{}return P.\u0275fac=function(b){return new(b||P)},P.\u0275prov=r.Yz7({token:P,factory:function(){return function Tc(){return new fu}()},providedIn:"root"}),P})(),fu=(()=>{class P extends ju{getDaysPerWeek(){return 7}getMonths(){return[1,2,3,4,5,6,7,8,9,10,11,12]}getWeeksPerMonth(){return 6}getNext(b,G="d",Te=1){let Ge=Sc(b),an=!0,fr=Ge.getMonth();switch(G){case"y":Ge.setFullYear(Ge.getFullYear()+Te);break;case"m":fr+=Te,Ge.setMonth(fr),fr%=12,fr<0&&(fr+=12);break;case"d":Ge.setDate(Ge.getDate()+Te),an=!1;break;default:return b}return an&&Ge.getMonth()!==fr&&Ge.setDate(0),Jl(Ge)}getPrev(b,G="d",Te=1){return this.getNext(b,G,-Te)}getWeekday(b){let Te=Sc(b).getDay();return 0===Te?7:Te}getWeekNumber(b,G){7===G&&(G=0);const an=Sc(b[(11-G)%7]);an.setDate(an.getDate()+4-(an.getDay()||7));const fr=an.getTime();return an.setMonth(0),an.setDate(1),Math.floor(Math.round((fr-an.getTime())/864e5)/7)+1}getToday(){return Jl(new Date)}isValid(b){if(!(b&&_e(b.year)&&_e(b.month)&&_e(b.day)&&0!==b.year))return!1;const G=Sc(b);return!isNaN(G.getTime())&&G.getFullYear()===b.year&&G.getMonth()+1===b.month&&G.getDate()===b.day}}return P.\u0275fac=function(){let te;return function(G){return(te||(te=r.n5z(P)))(G||P)}}(),P.\u0275prov=r.Yz7({token:P,factory:P.\u0275fac}),P})(),dc=(()=>{class P{getMonthLabel(b){return`${this.getMonthFullName(b.month,b.year)} ${this.getYearNumerals(b.year)}`}getDayNumerals(b){return`${b.day}`}getWeekNumerals(b){return`${b}`}getYearNumerals(b){return`${b}`}getWeekLabel(){return""}}return P.\u0275fac=function(b){return new(b||P)},P.\u0275prov=r.Yz7({token:P,factory:function(b){let G=null;return G=b?new b:function ud(P){return new Zd(P)}(r.LFG(r.soG)),G},providedIn:"root"}),P})(),Zd=(()=>{class P extends dc{constructor(b){super(),this._locale=b,this._monthsShort=(0,a.UT)(b,a.x.Standalone,a.Tn.Abbreviated),this._monthsFull=(0,a.UT)(b,a.x.Standalone,a.Tn.Wide)}getWeekdayLabel(b,G){const Te=(0,a.Mn)(this._locale,a.x.Standalone,void 0===G?a.Tn.Short:G);return Te.map((an,fr)=>Te[(fr+1)%7])[b-1]||""}getMonthShortName(b){return this._monthsShort[b-1]||""}getMonthFullName(b){return this._monthsFull[b-1]||""}getDayAriaLabel(b){const G=new Date(b.year,b.month-1,b.day);return(0,a.p6)(G,"fullDate",this._locale)}}return P.\u0275fac=function(b){return new(b||P)(r.LFG(r.soG))},P.\u0275prov=r.Yz7({token:P,factory:P.\u0275fac}),P})(),Qc=(()=>{class P{constructor(b,G){this._calendar=b,this._i18n=G,this._VALIDATORS={dayTemplateData:Te=>{if(this._state.dayTemplateData!==Te)return{dayTemplateData:Te}},displayMonths:Te=>{if(_e(Te=_n(Te))&&Te>0&&this._state.displayMonths!==Te)return{displayMonths:Te}},disabled:Te=>{if(this._state.disabled!==Te)return{disabled:Te}},firstDayOfWeek:Te=>{if(_e(Te=_n(Te))&&Te>=0&&this._state.firstDayOfWeek!==Te)return{firstDayOfWeek:Te}},focusVisible:Te=>{if(this._state.focusVisible!==Te&&!this._state.disabled)return{focusVisible:Te}},markDisabled:Te=>{if(this._state.markDisabled!==Te)return{markDisabled:Te}},maxDate:Te=>{const Ge=this.toValidDate(Te,null);if(Jc(this._state.maxDate,Ge))return{maxDate:Ge}},minDate:Te=>{const Ge=this.toValidDate(Te,null);if(Jc(this._state.minDate,Ge))return{minDate:Ge}},navigation:Te=>{if(this._state.navigation!==Te)return{navigation:Te}},outsideDays:Te=>{if(this._state.outsideDays!==Te)return{outsideDays:Te}},weekdays:Te=>{const Ge=!0===Te||!1===Te?a.Tn.Short:Te,an=!0!==Te&&!1!==Te||Te;if(this._state.weekdayWidth!==Ge||this._state.weekdaysVisible!==an)return{weekdayWidth:Ge,weekdaysVisible:an}}},this._model$=new he.xQ,this._dateSelect$=new he.xQ,this._state={dayTemplateData:null,markDisabled:null,maxDate:null,minDate:null,disabled:!1,displayMonths:1,firstDate:null,firstDayOfWeek:1,lastDate:null,focusDate:null,focusVisible:!1,months:[],navigation:"select",outsideDays:"visible",prevDisabled:!1,nextDisabled:!1,selectedDate:null,selectBoxes:{years:[],months:[]},weekdayWidth:a.Tn.Short,weekdaysVisible:!0}}get model$(){return this._model$.pipe((0,hn.h)(b=>b.months.length>0))}get dateSelect$(){return this._dateSelect$.pipe((0,hn.h)(b=>null!==b))}set(b){let G=Object.keys(b).map(Te=>this._VALIDATORS[Te](b[Te])).reduce((Te,Ge)=>Object.assign(Object.assign({},Te),Ge),{});Object.keys(G).length>0&&this._nextState(G)}focus(b){const G=this.toValidDate(b,null);null!=G&&!this._state.disabled&&Jc(this._state.focusDate,G)&&this._nextState({focusDate:b})}focusSelect(){du(this._state.focusDate,this._state)&&this.select(this._state.focusDate,{emitEvent:!0})}open(b){const G=this.toValidDate(b,this._calendar.getToday());null!=G&&!this._state.disabled&&(!this._state.firstDate||ld(this._state.firstDate,G))&&this._nextState({firstDate:G})}select(b,G={}){const Te=this.toValidDate(b,null);null!=Te&&!this._state.disabled&&(Jc(this._state.selectedDate,Te)&&this._nextState({selectedDate:Te}),G.emitEvent&&du(Te,this._state)&&this._dateSelect$.next(Te))}toValidDate(b,G){const Te=Oa.from(b);return void 0===G&&(G=this._calendar.getToday()),this._calendar.isValid(Te)?Te:G}getMonth(b){for(let G of this._state.months)if(b.month===G.number&&b.year===G.year)return G;throw new Error(`month ${b.month} of year ${b.year} not found`)}_nextState(b){const G=this._updateState(b);this._patchContexts(G),this._state=G,this._model$.next(this._state)}_patchContexts(b){const{months:G,displayMonths:Te,selectedDate:Ge,focusDate:an,focusVisible:fr,disabled:wr,outsideDays:ci}=b;b.months.forEach(oi=>{oi.weeks.forEach(ts=>{ts.days.forEach(Do=>{an&&(Do.context.focused=an.equals(Do.date)&&fr),Do.tabindex=!wr&&an&&Do.date.equals(an)&&an.month===oi.number?0:-1,!0===wr&&(Do.context.disabled=!0),void 0!==Ge&&(Do.context.selected=null!==Ge&&Ge.equals(Do.date)),oi.number!==Do.date.month&&(Do.hidden="hidden"===ci||"collapsed"===ci||Te>1&&Do.date.after(G[0].firstDate)&&Do.date.before(G[Te-1].lastDate))})})})}_updateState(b){const G=Object.assign({},this._state,b);let Te=G.firstDate;if(("minDate"in b||"maxDate"in b)&&(function $d(P,te){if(te&&P&&te.before(P))throw new Error(`'maxDate' ${te} should be greater than 'minDate' ${P}`)}(G.minDate,G.maxDate),G.focusDate=vo(G.focusDate,G.minDate,G.maxDate),G.firstDate=vo(G.firstDate,G.minDate,G.maxDate),Te=G.focusDate),"disabled"in b&&(G.focusVisible=!1),"selectedDate"in b&&0===this._state.months.length&&(Te=G.selectedDate),"focusVisible"in b||"focusDate"in b&&(G.focusDate=vo(G.focusDate,G.minDate,G.maxDate),Te=G.focusDate,0!==G.months.length&&G.focusDate&&!G.focusDate.before(G.firstDate)&&!G.focusDate.after(G.lastDate)))return G;if("firstDate"in b&&(G.firstDate=vo(G.firstDate,G.minDate,G.maxDate),Te=G.firstDate),Te){const an=function Iu(P,te,b,G,Te){const{displayMonths:Ge,months:an}=b,fr=an.splice(0,an.length);return Array.from({length:Ge},(ci,oi)=>{const ts=Object.assign(P.getNext(te,"m",oi),{day:1});if(an[oi]=null,!Te){const Do=fr.findIndex(Ss=>Ss.firstDate.equals(ts));-1!==Do&&(an[oi]=fr.splice(Do,1)[0])}return ts}).forEach((ci,oi)=>{null===an[oi]&&(an[oi]=function bc(P,te,b,G,Te={}){const{dayTemplateData:Ge,minDate:an,maxDate:fr,firstDayOfWeek:wr,markDisabled:ci,outsideDays:oi,weekdayWidth:ts,weekdaysVisible:Do}=b,Ss=P.getToday();Te.firstDate=null,Te.lastDate=null,Te.number=te.month,Te.year=te.year,Te.weeks=Te.weeks||[],Te.weekdays=Te.weekdays||[],te=function cc(P,te,b){const G=P.getDaysPerWeek(),Te=new Oa(te.year,te.month,1),Ge=P.getWeekday(Te)%G;return P.getPrev(Te,"d",(G+Ge-b)%G)}(P,te,wr),Do||(Te.weekdays.length=0);for(let Yo=0;Yo<P.getWeeksPerMonth();Yo++){let ia=Te.weeks[Yo];ia||(ia=Te.weeks[Yo]={number:0,days:[],collapsed:!0});const v=ia.days;for(let D=0;D<P.getDaysPerWeek();D++){0===Yo&&Do&&(Te.weekdays[D]=G.getWeekdayLabel(P.getWeekday(te),ts));const B=new Oa(te.year,te.month,te.day),ye=P.getNext(B),He=G.getDayAriaLabel(B);let yt=!!(an&&B.before(an)||fr&&B.after(fr));!yt&&ci&&(yt=ci(B,{month:Te.number,year:Te.year}));let Wt=B.equals(Ss),gn=Ge?Ge(B,{month:Te.number,year:Te.year}):void 0;null===Te.firstDate&&B.month===Te.number&&(Te.firstDate=B),B.month===Te.number&&ye.month!==Te.number&&(Te.lastDate=B);let nr=v[D];nr||(nr=v[D]={}),nr.date=B,nr.context=Object.assign(nr.context||{},{$implicit:B,date:B,data:gn,currentMonth:Te.number,currentYear:Te.year,disabled:yt,focused:!1,selected:!1,today:Wt}),nr.tabindex=-1,nr.ariaLabel=He,nr.hidden=!1,te=ye}ia.number=P.getWeekNumber(v.map(D=>D.date),wr),ia.collapsed="collapsed"===oi&&v[0].date.month!==Te.number&&v[v.length-1].date.month!==Te.number}return Te}(P,ci,b,G,fr.shift()||{}))}),an}(this._calendar,Te,G,this._i18n,"dayTemplateData"in b||"firstDayOfWeek"in b||"markDisabled"in b||"minDate"in b||"maxDate"in b||"disabled"in b||"outsideDays"in b||"weekdaysVisible"in b);G.months=an,G.firstDate=an[0].firstDate,G.lastDate=an[an.length-1].lastDate,"selectedDate"in b&&!du(G.selectedDate,G)&&(G.selectedDate=null),"firstDate"in b&&(!G.focusDate||G.focusDate.before(G.firstDate)||G.focusDate.after(G.lastDate))&&(G.focusDate=Te);const fr=!this._state.firstDate||this._state.firstDate.year!==G.firstDate.year,wr=!this._state.firstDate||this._state.firstDate.month!==G.firstDate.month;"select"===G.navigation?(("minDate"in b||"maxDate"in b||0===G.selectBoxes.years.length||fr)&&(G.selectBoxes.years=function Ac(P,te,b){if(!P)return[];const G=te?Math.max(te.year,P.year-500):P.year-10,Ge=(b?Math.min(b.year,P.year+500):P.year+10)-G+1,an=Array(Ge);for(let fr=0;fr<Ge;fr++)an[fr]=G+fr;return an}(G.firstDate,G.minDate,G.maxDate)),("minDate"in b||"maxDate"in b||0===G.selectBoxes.months.length||fr)&&(G.selectBoxes.months=function Fl(P,te,b,G){if(!te)return[];let Te=P.getMonths(te.year);if(b&&te.year===b.year){const Ge=Te.findIndex(an=>an===b.month);Te=Te.slice(Ge)}if(G&&te.year===G.year){const Ge=Te.findIndex(an=>an===G.month);Te=Te.slice(0,Ge+1)}return Te}(this._calendar,G.firstDate,G.minDate,G.maxDate))):G.selectBoxes={years:[],months:[]},("arrows"===G.navigation||"select"===G.navigation)&&(wr||fr||"minDate"in b||"maxDate"in b||"disabled"in b)&&(G.prevDisabled=G.disabled||function Dc(P,te,b){const G=Object.assign(P.getPrev(te,"m"),{day:1});return null!=b&&(G.year===b.year&&G.month<b.month||G.year<b.year&&1===b.month)}(this._calendar,G.firstDate,G.minDate),G.nextDisabled=G.disabled||function ma(P,te,b){const G=Object.assign(P.getNext(te,"m"),{day:1});return null!=b&&G.after(b)}(this._calendar,G.lastDate,G.maxDate))}return G}}return P.\u0275fac=function(b){return new(b||P)(r.LFG(ju),r.LFG(dc))},P.\u0275prov=r.Yz7({token:P,factory:P.\u0275fac}),P})();var Rl=(()=>{return(P=Rl||(Rl={}))[P.PREV=0]="PREV",P[P.NEXT=1]="NEXT",Rl;var P})();let jc=(()=>{class P{constructor(){this.displayMonths=1,this.firstDayOfWeek=1,this.navigation="select",this.outsideDays="visible",this.showWeekNumbers=!1,this.weekdays=a.Tn.Short}}return P.\u0275fac=function(b){return new(b||P)},P.\u0275prov=r.Yz7({token:P,factory:P.\u0275fac,providedIn:"root"}),P})(),h=(()=>{class P{}return P.\u0275fac=function(b){return new(b||P)},P.\u0275prov=r.Yz7({token:P,factory:function(){return function fc(){return new E}()},providedIn:"root"}),P})(),E=(()=>{class P extends h{fromModel(b){return b&&_e(b.year)&&_e(b.month)&&_e(b.day)?{year:b.year,month:b.month,day:b.day}:null}toModel(b){return b&&_e(b.year)&&_e(b.month)&&_e(b.day)?{year:b.year,month:b.month,day:b.day}:null}}return P.\u0275fac=function(){let te;return function(G){return(te||(te=r.n5z(P)))(G||P)}}(),P.\u0275prov=r.Yz7({token:P,factory:P.\u0275fac}),P})(),x=(()=>{class P{constructor(b){this.i18n=b}isMuted(){return!this.selected&&(this.date.month!==this.currentMonth||this.disabled)}}return P.\u0275fac=function(b){return new(b||P)(r.Y36(dc))},P.\u0275cmp=r.Xpm({type:P,selectors:[["","ngbDatepickerDayView",""]],hostAttrs:[1,"btn-light"],hostVars:10,hostBindings:function(b,G){2&b&&r.ekj("bg-primary",G.selected)("text-white",G.selected)("text-muted",G.isMuted())("outside",G.isMuted())("active",G.focused)},inputs:{currentMonth:"currentMonth",date:"date",disabled:"disabled",focused:"focused",selected:"selected"},attrs:Hl,decls:1,vars:1,template:function(b,G){1&b&&r._uU(0),2&b&&r.Oqu(G.i18n.getDayNumerals(G.date))},styles:["[ngbDatepickerDayView]{text-align:center;width:2rem;height:2rem;line-height:2rem;border-radius:.25rem;background:transparent}[ngbDatepickerDayView].outside{opacity:.5}\n"],encapsulation:2,changeDetection:0}),P})(),F=(()=>{class P{constructor(b,G){this.i18n=b,this._renderer=G,this.select=new r.vpe,this._month=-1,this._year=-1}changeMonth(b){this.select.emit(new Oa(this.date.year,_n(b),1))}changeYear(b){this.select.emit(new Oa(_n(b),this.date.month,1))}ngAfterViewChecked(){this.date&&(this.date.month!==this._month&&(this._month=this.date.month,this._renderer.setProperty(this.monthSelect.nativeElement,"value",this._month)),this.date.year!==this._year&&(this._year=this.date.year,this._renderer.setProperty(this.yearSelect.nativeElement,"value",this._year)))}}return P.\u0275fac=function(b){return new(b||P)(r.Y36(dc),r.Y36(r.Qsj))},P.\u0275cmp=r.Xpm({type:P,selectors:[["ngb-datepicker-navigation-select"]],viewQuery:function(b,G){if(1&b&&(r.Gf(Ua,7,r.SBq),r.Gf(Qe,7,r.SBq)),2&b){let Te;r.iGM(Te=r.CRH())&&(G.monthSelect=Te.first),r.iGM(Te=r.CRH())&&(G.yearSelect=Te.first)}},inputs:{date:"date",disabled:"disabled",months:"months",years:"years"},outputs:{select:"select"},decls:6,vars:4,consts:function(){let te,b,G,Te;return te="Select month",b="Select month",G="Select year",Te="Select year",[["aria-label",te,"title",b,1,"form-select",3,"disabled","change"],["month",""],[3,"value",4,"ngFor","ngForOf"],["aria-label",G,"title",Te,1,"form-select",3,"disabled","change"],["year",""],[3,"value"]]},template:function(b,G){1&b&&(r.TgZ(0,"select",0,1),r.NdJ("change",function(Ge){return G.changeMonth(Ge.target.value)}),r.YNc(2,zt,2,3,"option",2),r.qZA(),r.TgZ(3,"select",3,4),r.NdJ("change",function(Ge){return G.changeYear(Ge.target.value)}),r.YNc(5,ot,2,2,"option",2),r.qZA()),2&b&&(r.Q6J("disabled",G.disabled),r.xp6(2),r.Q6J("ngForOf",G.months),r.xp6(1),r.Q6J("disabled",G.disabled),r.xp6(2),r.Q6J("ngForOf",G.years))},directives:[a.sg,ur.YN,ur.Kr],styles:["ngb-datepicker-navigation-select>.form-select{flex:1 1 auto;padding:0 .5rem;font-size:.875rem;height:1.85rem}ngb-datepicker-navigation-select>.form-select:focus{z-index:1}ngb-datepicker-navigation-select>.form-select::-ms-value{background-color:transparent!important}\n"],encapsulation:2,changeDetection:0}),P})(),Q=(()=>{class P{constructor(b){this.i18n=b,this.navigation=Rl,this.months=[],this.navigate=new r.vpe,this.select=new r.vpe}onClickPrev(b){b.currentTarget.focus(),this.navigate.emit(this.navigation.PREV)}onClickNext(b){b.currentTarget.focus(),this.navigate.emit(this.navigation.NEXT)}}return P.\u0275fac=function(b){return new(b||P)(r.Y36(dc))},P.\u0275cmp=r.Xpm({type:P,selectors:[["ngb-datepicker-navigation"]],inputs:{date:"date",disabled:"disabled",months:"months",showSelect:"showSelect",prevDisabled:"prevDisabled",nextDisabled:"nextDisabled",selectBoxes:"selectBoxes"},outputs:{navigate:"navigate",select:"select"},decls:8,vars:4,consts:function(){let te,b,G,Te;return te="Previous month",b="Previous month",G="Next month",Te="Next month",[[1,"ngb-dp-arrow"],["type","button","aria-label",te,"title",b,1,"btn","btn-link","ngb-dp-arrow-btn",3,"disabled","click"],[1,"ngb-dp-navigation-chevron"],["class","ngb-dp-navigation-select",3,"date","disabled","months","years","select",4,"ngIf"],[4,"ngIf"],[1,"ngb-dp-arrow","right"],["type","button","aria-label",G,"title",Te,1,"btn","btn-link","ngb-dp-arrow-btn",3,"disabled","click"],[1,"ngb-dp-navigation-select",3,"date","disabled","months","years","select"],["ngFor","",3,"ngForOf"],["class","ngb-dp-arrow",4,"ngIf"],[1,"ngb-dp-month-name"]]},template:function(b,G){1&b&&(r.TgZ(0,"div",0)(1,"button",1),r.NdJ("click",function(Ge){return G.onClickPrev(Ge)}),r._UZ(2,"span",2),r.qZA()(),r.YNc(3,jt,1,4,"ngb-datepicker-navigation-select",3),r.YNc(4,as,1,1,null,4),r.TgZ(5,"div",5)(6,"button",6),r.NdJ("click",function(Ge){return G.onClickNext(Ge)}),r._UZ(7,"span",2),r.qZA()()),2&b&&(r.xp6(1),r.Q6J("disabled",G.prevDisabled),r.xp6(2),r.Q6J("ngIf",G.showSelect),r.xp6(1),r.Q6J("ngIf",!G.showSelect),r.xp6(2),r.Q6J("disabled",G.nextDisabled))},directives:[F,a.O5,a.sg],styles:["ngb-datepicker-navigation{display:flex;align-items:center}.ngb-dp-navigation-chevron{border-style:solid;border-width:.2em .2em 0 0;display:inline-block;width:.75em;height:.75em;margin-left:.25em;margin-right:.15em;transform:rotate(-135deg)}.ngb-dp-arrow{display:flex;flex:1 1 auto;padding-right:0;padding-left:0;margin:0;width:2rem;height:2rem}.ngb-dp-arrow.right{justify-content:flex-end}.ngb-dp-arrow.right .ngb-dp-navigation-chevron{transform:rotate(45deg);margin-left:.15em;margin-right:.25em}.ngb-dp-arrow-btn{padding:0 .25rem;margin:0 .5rem;border:none;background-color:transparent;z-index:1}.ngb-dp-arrow-btn:focus{outline-width:1px;outline-style:auto}@media all and (-ms-high-contrast: none),(-ms-high-contrast: active){.ngb-dp-arrow-btn:focus{outline-style:solid}}.ngb-dp-month-name{font-size:larger;height:2rem;line-height:2rem;text-align:center}.ngb-dp-navigation-select{display:flex;flex:1 1 9rem}\n"],encapsulation:2,changeDetection:0}),P})();var le=(()=>{return(P=le||(le={}))[P.Tab=9]="Tab",P[P.Enter=13]="Enter",P[P.Escape=27]="Escape",P[P.Space=32]="Space",P[P.PageUp=33]="PageUp",P[P.PageDown=34]="PageDown",P[P.End=35]="End",P[P.Home=36]="Home",P[P.ArrowLeft=37]="ArrowLeft",P[P.ArrowUp=38]="ArrowUp",P[P.ArrowRight=39]="ArrowRight",P[P.ArrowDown=40]="ArrowDown",le;var P})();let me=(()=>{class P{processKey(b,G){const{state:Te,calendar:Ge}=G;switch(b.which){case le.PageUp:G.focusDate(Ge.getPrev(Te.focusedDate,b.shiftKey?"y":"m",1));break;case le.PageDown:G.focusDate(Ge.getNext(Te.focusedDate,b.shiftKey?"y":"m",1));break;case le.End:G.focusDate(b.shiftKey?Te.maxDate:Te.lastDate);break;case le.Home:G.focusDate(b.shiftKey?Te.minDate:Te.firstDate);break;case le.ArrowLeft:G.focusDate(Ge.getPrev(Te.focusedDate,"d",1));break;case le.ArrowUp:G.focusDate(Ge.getPrev(Te.focusedDate,"d",Ge.getDaysPerWeek()));break;case le.ArrowRight:G.focusDate(Ge.getNext(Te.focusedDate,"d",1));break;case le.ArrowDown:G.focusDate(Ge.getNext(Te.focusedDate,"d",Ge.getDaysPerWeek()));break;case le.Enter:case le.Space:G.focusSelect();break;default:return}b.preventDefault(),b.stopPropagation()}}return P.\u0275fac=function(b){return new(b||P)},P.\u0275prov=r.Yz7({token:P,factory:P.\u0275fac,providedIn:"root"}),P})(),Fe=(()=>{class P{constructor(b){this.templateRef=b}}return P.\u0275fac=function(b){return new(b||P)(r.Y36(r.Rgc))},P.\u0275dir=r.lG2({type:P,selectors:[["ng-template","ngbDatepickerContent",""]]}),P})(),Oe=(()=>{class P{constructor(b,G,Te,Ge,an,fr,wr,ci){this._service=b,this._calendar=G,this.i18n=Te,this._elementRef=fr,this._ngbDateAdapter=wr,this._ngZone=ci,this._controlValue=null,this._destroyed$=new he.xQ,this._publicState={},this.navigate=new r.vpe,this.dateSelect=new r.vpe,this.onChange=oi=>{},this.onTouched=()=>{},["dayTemplate","dayTemplateData","displayMonths","firstDayOfWeek","footerTemplate","markDisabled","minDate","maxDate","navigation","outsideDays","showWeekNumbers","startDate","weekdays"].forEach(oi=>this[oi]=Ge[oi]),b.dateSelect$.pipe((0,Vt.R)(this._destroyed$)).subscribe(oi=>{this.dateSelect.emit(oi)}),b.model$.pipe((0,Vt.R)(this._destroyed$)).subscribe(oi=>{const ts=oi.firstDate,Do=this.model?this.model.firstDate:null;this._publicState={maxDate:oi.maxDate,minDate:oi.minDate,firstDate:oi.firstDate,lastDate:oi.lastDate,focusedDate:oi.focusDate,months:oi.months.map(D=>D.firstDate)};let Ss=!1;if(!ts.equals(Do)&&(this.navigate.emit({current:Do?{year:Do.year,month:Do.month}:null,next:{year:ts.year,month:ts.month},preventDefault:()=>Ss=!0}),Ss&&null!==Do))return void this._service.open(Do);const Yo=oi.selectedDate,ia=oi.focusDate,v=this.model?this.model.focusDate:null;this.model=oi,Jc(Yo,this._controlValue)&&(this._controlValue=Yo,this.onTouched(),this.onChange(this._ngbDateAdapter.toModel(Yo))),Jc(ia,v)&&v&&oi.focusVisible&&this.focus(),an.markForCheck()})}get state(){return this._publicState}get calendar(){return this._calendar}focusDate(b){this._service.focus(Oa.from(b))}focusSelect(){this._service.focusSelect()}focus(){this._ngZone.onStable.asObservable().pipe((0,vn.q)(1)).subscribe(()=>{const b=this._elementRef.nativeElement.querySelector('div.ngb-dp-day[tabindex="0"]');b&&b.focus()})}navigateTo(b){this._service.open(Oa.from(b?b.day?b:Object.assign(Object.assign({},b),{day:1}):null))}ngAfterViewInit(){this._ngZone.runOutsideAngular(()=>{const b=(0,be.R)(this._contentEl.nativeElement,"focusin"),G=(0,be.R)(this._contentEl.nativeElement,"focusout"),{nativeElement:Te}=this._elementRef;(0,Ve.T)(b,G).pipe((0,hn.h)(({target:Ge,relatedTarget:an})=>!(cr(Ge,"ngb-dp-day")&&cr(an,"ngb-dp-day")&&Te.contains(Ge)&&Te.contains(an))),(0,Vt.R)(this._destroyed$)).subscribe(({type:Ge})=>this._ngZone.run(()=>this._service.set({focusVisible:"focusin"===Ge})))})}ngOnDestroy(){this._destroyed$.next()}ngOnInit(){if(void 0===this.model){const b={};["dayTemplateData","displayMonths","markDisabled","firstDayOfWeek","navigation","minDate","maxDate","outsideDays","weekdays"].forEach(G=>b[G]=this[G]),this._service.set(b),this.navigateTo(this.startDate)}this.dayTemplate||(this.dayTemplate=this._defaultDayTemplate)}ngOnChanges(b){const G={};if(["dayTemplateData","displayMonths","markDisabled","firstDayOfWeek","navigation","minDate","maxDate","outsideDays","weekdays"].filter(Te=>Te in b).forEach(Te=>G[Te]=this[Te]),this._service.set(G),"startDate"in b){const{currentValue:Te,previousValue:Ge}=b.startDate;ld(Ge,Te)&&this.navigateTo(this.startDate)}}onDateSelect(b){this._service.focus(b),this._service.select(b,{emitEvent:!0})}onNavigateDateSelect(b){this._service.open(b)}onNavigateEvent(b){switch(b){case Rl.PREV:this._service.open(this._calendar.getPrev(this.model.firstDate,"m",1));break;case Rl.NEXT:this._service.open(this._calendar.getNext(this.model.firstDate,"m",1))}}registerOnChange(b){this.onChange=b}registerOnTouched(b){this.onTouched=b}setDisabledState(b){this._service.set({disabled:b})}writeValue(b){this._controlValue=Oa.from(this._ngbDateAdapter.fromModel(b)),this._service.select(this._controlValue)}}return P.\u0275fac=function(b){return new(b||P)(r.Y36(Qc),r.Y36(ju),r.Y36(dc),r.Y36(jc),r.Y36(r.sBO),r.Y36(r.SBq),r.Y36(h),r.Y36(r.R0b))},P.\u0275cmp=r.Xpm({type:P,selectors:[["ngb-datepicker"]],contentQueries:function(b,G,Te){if(1&b&&r.Suo(Te,Fe,7),2&b){let Ge;r.iGM(Ge=r.CRH())&&(G.contentTemplate=Ge.first)}},viewQuery:function(b,G){if(1&b&&(r.Gf(js,7),r.Gf(As,7)),2&b){let Te;r.iGM(Te=r.CRH())&&(G._defaultDayTemplate=Te.first),r.iGM(Te=r.CRH())&&(G._contentEl=Te.first)}},inputs:{dayTemplate:"dayTemplate",dayTemplateData:"dayTemplateData",displayMonths:"displayMonths",firstDayOfWeek:"firstDayOfWeek",footerTemplate:"footerTemplate",markDisabled:"markDisabled",maxDate:"maxDate",minDate:"minDate",navigation:"navigation",outsideDays:"outsideDays",showWeekNumbers:"showWeekNumbers",startDate:"startDate",weekdays:"weekdays"},outputs:{navigate:"navigate",dateSelect:"dateSelect"},exportAs:["ngbDatepicker"],features:[r._Bn([{provide:ur.JU,useExisting:(0,r.Gpc)(()=>P),multi:!0},Qc]),r.TTD],decls:10,vars:5,consts:[["defaultDayTemplate",""],["defaultContentTemplate",""],[1,"ngb-dp-header"],[3,"date","months","disabled","showSelect","prevDisabled","nextDisabled","selectBoxes","navigate","select",4,"ngIf"],[1,"ngb-dp-content"],["content",""],[3,"ngTemplateOutlet"],["ngbDatepickerDayView","",3,"date","currentMonth","selected","disabled","focused"],["class","ngb-dp-month",4,"ngFor","ngForOf"],[1,"ngb-dp-month"],["class","ngb-dp-month-name",4,"ngIf"],[3,"month"],[1,"ngb-dp-month-name"],[3,"date","months","disabled","showSelect","prevDisabled","nextDisabled","selectBoxes","navigate","select"]],template:function(b,G){if(1&b&&(r.YNc(0,Ns,1,5,"ng-template",null,0,r.W1O),r.YNc(2,sl,1,1,"ng-template",null,1,r.W1O),r.TgZ(4,"div",2),r.YNc(5,Bs,1,7,"ngb-datepicker-navigation",3),r.qZA(),r.TgZ(6,"div",4,5),r.YNc(8,lt,0,0,"ng-template",6),r.qZA(),r.YNc(9,Xe,0,0,"ng-template",6)),2&b){const Te=r.MAs(3);r.xp6(5),r.Q6J("ngIf","none"!==G.navigation),r.xp6(1),r.ekj("ngb-dp-months",!G.contentTemplate),r.xp6(2),r.Q6J("ngTemplateOutlet",(null==G.contentTemplate?null:G.contentTemplate.templateRef)||Te),r.xp6(1),r.Q6J("ngTemplateOutlet",G.footerTemplate)}},directives:function(){return[x,Je,Q,a.sg,a.O5,a.tP]},styles:["ngb-datepicker{border:1px solid #dfdfdf;border-radius:.25rem;display:inline-block}ngb-datepicker-month{pointer-events:auto}ngb-datepicker.dropdown-menu{padding:0}.ngb-dp-body{z-index:1055}.ngb-dp-header{border-bottom:0;border-radius:.25rem .25rem 0 0;padding-top:.25rem;background-color:#f8f9fa;background-color:var(--bs-light)}.ngb-dp-months{display:flex}.ngb-dp-month{pointer-events:none}.ngb-dp-month-name{font-size:larger;height:2rem;line-height:2rem;text-align:center;background-color:#f8f9fa;background-color:var(--bs-light)}.ngb-dp-month+.ngb-dp-month .ngb-dp-month-name,.ngb-dp-month+.ngb-dp-month .ngb-dp-week{padding-left:1rem}.ngb-dp-month:last-child .ngb-dp-week{padding-right:.25rem}.ngb-dp-month:first-child .ngb-dp-week{padding-left:.25rem}.ngb-dp-month .ngb-dp-week:last-child{padding-bottom:.25rem}\n"],encapsulation:2,changeDetection:0}),P})(),Je=(()=>{class P{constructor(b,G,Te,Ge){this.i18n=b,this.datepicker=G,this._keyboardService=Te,this._service=Ge}set month(b){this.viewModel=this._service.getMonth(b)}onKeyDown(b){this._keyboardService.processKey(b,this.datepicker)}doSelect(b){!b.context.disabled&&!b.hidden&&this.datepicker.onDateSelect(b.date)}}return P.\u0275fac=function(b){return new(b||P)(r.Y36(dc),r.Y36(Oe),r.Y36(me),r.Y36(Qc))},P.\u0275cmp=r.Xpm({type:P,selectors:[["ngb-datepicker-month"]],hostAttrs:["role","grid"],hostBindings:function(b,G){1&b&&r.NdJ("keydown",function(Ge){return G.onKeyDown(Ge)})},inputs:{month:"month"},decls:2,vars:2,consts:[["class","ngb-dp-week ngb-dp-weekdays","role","row",4,"ngIf"],["ngFor","",3,"ngForOf"],["role","row",1,"ngb-dp-week","ngb-dp-weekdays"],["class","ngb-dp-weekday ngb-dp-showweek small",4,"ngIf"],["class","ngb-dp-weekday small","role","columnheader",4,"ngFor","ngForOf"],[1,"ngb-dp-weekday","ngb-dp-showweek","small"],["role","columnheader",1,"ngb-dp-weekday","small"],["class","ngb-dp-week","role","row",4,"ngIf"],["role","row",1,"ngb-dp-week"],["class","ngb-dp-week-number small text-muted",4,"ngIf"],["class","ngb-dp-day","role","gridcell",3,"disabled","tabindex","hidden","ngb-dp-today","click",4,"ngFor","ngForOf"],[1,"ngb-dp-week-number","small","text-muted"],["role","gridcell",1,"ngb-dp-day",3,"tabindex","click"],[3,"ngIf"],[3,"ngTemplateOutlet","ngTemplateOutletContext"]],template:function(b,G){1&b&&(r.YNc(0,pi,3,2,"div",0),r.YNc(1,vd,1,1,"ng-template",1)),2&b&&(r.Q6J("ngIf",G.viewModel.weekdays.length>0),r.xp6(1),r.Q6J("ngForOf",G.viewModel.weeks))},directives:[a.O5,a.sg,a.tP],styles:['ngb-datepicker-month{display:block}.ngb-dp-weekday,.ngb-dp-week-number{line-height:2rem;text-align:center;font-style:italic}.ngb-dp-weekday{color:#0dcaf0;color:var(--bs-info)}.ngb-dp-week{border-radius:.25rem;display:flex}.ngb-dp-weekdays{border-bottom:1px solid rgba(0,0,0,.125);border-radius:0;background-color:#f8f9fa;background-color:var(--bs-light)}.ngb-dp-day,.ngb-dp-weekday,.ngb-dp-week-number{width:2rem;height:2rem}.ngb-dp-day{cursor:pointer}.ngb-dp-day.disabled,.ngb-dp-day.hidden{cursor:default;pointer-events:none}.ngb-dp-day[tabindex="0"]{z-index:1}\n'],encapsulation:2}),P})();const ht=(P,te)=>!!te&&te.some(b=>b.contains(P)),gt=(P,te)=>!te||null!=function ui(P,te){return te&&void 0!==P.closest?P.closest(te):null}(P,te),nn="undefined"!=typeof navigator&&!!navigator.userAgent&&(/iPad|iPhone|iPod/.test(navigator.userAgent)||/Macintosh/.test(navigator.userAgent)&&navigator.maxTouchPoints&&navigator.maxTouchPoints>2||/Android/.test(navigator.userAgent));function Bn(P,te,b,G,Te,Ge,an,fr){b&&P.runOutsideAngular((P=>nn?()=>setTimeout(()=>P(),100):P)(()=>{const ci=(0,be.R)(te,"keydown").pipe((0,Vt.R)(Te),(0,hn.h)(Do=>Do.which===le.Escape),(0,Fn.b)(Do=>Do.preventDefault())),oi=(0,be.R)(te,"mousedown").pipe((0,mt.U)(Do=>{const Ss=Do.target;return 2!==Do.button&&!ht(Ss,an)&&("inside"===b?ht(Ss,Ge)&&gt(Ss,fr):"outside"===b?!ht(Ss,Ge):gt(Ss,fr)||!ht(Ss,Ge))}),(0,Vt.R)(Te)),ts=(0,be.R)(te,"mouseup").pipe(je(oi),(0,hn.h)(([Do,Ss])=>Ss),(0,pr.g)(0),(0,Vt.R)(Te));y([ci.pipe((0,mt.U)(Do=>0)),ts.pipe((0,mt.U)(Do=>1))]).subscribe(Do=>P.run(()=>G(Do)))}))}const ar=["a[href]","button:not([disabled])",'input:not([disabled]):not([type="hidden"])',"select:not([disabled])","textarea:not([disabled])","[contenteditable]",'[tabindex]:not([tabindex="-1"])'].join(", ");function Pr(P){const te=Array.from(P.querySelectorAll(ar)).filter(b=>-1!==b.tabIndex);return[te[0],te[te.length-1]]}const $i=(P,te,b,G=!1)=>{P.runOutsideAngular(()=>{const Te=(0,be.R)(te,"focusin").pipe((0,Vt.R)(b),(0,mt.U)(Ge=>Ge.target));(0,be.R)(te,"keydown").pipe((0,Vt.R)(b),(0,hn.h)(Ge=>Ge.which===le.Tab),je(Te)).subscribe(([Ge,an])=>{const[fr,wr]=Pr(te);(an===fr||an===te)&&Ge.shiftKey&&(wr.focus(),Ge.preventDefault()),an===wr&&!Ge.shiftKey&&(fr.focus(),Ge.preventDefault())}),G&&(0,be.R)(te,"click").pipe((0,Vt.R)(b),je(Te),(0,mt.U)(Ge=>Ge[1])).subscribe(Ge=>Ge.focus())})},is=/\s+/,Eo=/  +/gi,Gs=/^start/,qs=/^end/,qa=/-(top|left)$/,ka=/-(bottom|right)$/,wa=/^left/,jl=/^right/,pu=/^start/,Ga=/^end/;function Lu({placement:P,baseClass:te}){let b=Array.isArray(P)?P:P.split(is),Te=b.findIndex(wr=>"auto"===wr);Te>=0&&["top","bottom","start","end","top-start","top-end","bottom-start","bottom-end","start-top","start-bottom","end-top","end-bottom"].forEach(function(wr){null==b.find(ci=>-1!==ci.search("^"+wr))&&b.splice(Te++,1,wr)});const Ge=b.map(wr=>function ja(P){return P.replace(Gs,"left").replace(qs,"right").replace(qa,"-start").replace(ka,"-end")}(wr));return{placement:Ge.shift(),modifiers:[{name:"bootstrapClasses",enabled:!!te,phase:"write",fn({state:wr}){const ci=new RegExp(te+"(-[a-z]+)*","gi"),oi=wr.elements.popper,ts=wr.placement;let Do=oi.className;Do=Do.replace(ci,""),Do+=` ${function Tu(P,te){let[b,G]=te.split("-");const Te=b.replace(wa,"start").replace(jl,"end");let Ge=[Te];if(G){let an=G;("left"===b||"right"===b)&&(an=an.replace(pu,"top").replace(Ga,"bottom")),Ge.push(`${Te}-${an}`)}return P&&(Ge=Ge.map(an=>`${P}-${an}`)),Ge.join(" ")}(te,ts)}`,Do=Do.trim().replace(Eo," "),oi.className=Do}},xn,Us,ya,{enabled:!0,name:"flip",options:{fallbackPlacements:Ge}},{enabled:!0,name:"preventOverflow",phase:"main",fn:function(){}}]}}function wc(P){return P}function Cu(){let P=null;return{createPopper(te){if(!P){let G=(te.updatePopperOptions||wc)(Lu(te));P=hs(te.hostElement,te.targetElement,G)}},update(){P&&P.update()},setOptions(te){if(P){let G=(te.updatePopperOptions||wc)(Lu(te));P.setOptions(G)}},destroy(){P&&(P.destroy(),P=null)}}}let Wd=(()=>{class P extends jc{constructor(){super(...arguments),this.autoClose=!0,this.placement=["bottom-start","bottom-end","top-start","top-end"],this.restoreFocus=!0}}return P.\u0275fac=function(){let te;return function(G){return(te||(te=r.n5z(P)))(G||P)}}(),P.\u0275prov=r.Yz7({token:P,factory:P.\u0275fac,providedIn:"root"}),P})();function rl(P){return te=>(te.modifiers.push(Xs,{name:"offset",options:{offset:()=>P}}),te)}let Ee=(()=>{class P{}return P.\u0275fac=function(b){return new(b||P)},P.\u0275prov=r.Yz7({token:P,factory:function(){return function K(){return new et}()},providedIn:"root"}),P})(),et=(()=>{class P extends Ee{parse(b){if(null!=b){const G=b.trim().split("-");if(1===G.length&&Me(G[0]))return{year:_n(G[0]),month:null,day:null};if(2===G.length&&Me(G[0])&&Me(G[1]))return{year:_n(G[0]),month:_n(G[1]),day:null};if(3===G.length&&Me(G[0])&&Me(G[1])&&Me(G[2]))return{year:_n(G[0]),month:_n(G[1]),day:_n(G[2])}}return null}format(b){return b?`${b.year}-${Me(b.month)?Qt(b.month):""}-${Me(b.day)?Qt(b.day):""}`:""}}return P.\u0275fac=function(){let te;return function(G){return(te||(te=r.n5z(P)))(G||P)}}(),P.\u0275prov=r.Yz7({token:P,factory:P.\u0275fac}),P})(),Tt=(()=>{class P{constructor(b,G,Te,Ge,an,fr,wr,ci,oi,ts){this._parserFormatter=b,this._elRef=G,this._vcRef=Te,this._renderer=Ge,this._ngZone=an,this._calendar=fr,this._dateAdapter=wr,this._document=ci,this._changeDetector=oi,this._cRef=null,this._disabled=!1,this._elWithFocus=null,this._model=null,this._positioning=Cu(),this._destroyCloseHandlers$=new he.xQ,this.dateSelect=new r.vpe,this.navigate=new r.vpe,this.closed=new r.vpe,this._onChange=Do=>{},this._onTouched=()=>{},this._validatorChange=()=>{},["autoClose","container","positionTarget","placement"].forEach(Do=>this[Do]=ts[Do])}get disabled(){return this._disabled}set disabled(b){this._disabled=""===b||b&&"false"!==b,this.isOpen()&&this._cRef.instance.setDisabledState(this._disabled)}registerOnChange(b){this._onChange=b}registerOnTouched(b){this._onTouched=b}registerOnValidatorChange(b){this._validatorChange=b}setDisabledState(b){this.disabled=b}validate(b){const{value:G}=b;if(null!=G){const Te=this._fromDateStruct(this._dateAdapter.fromModel(G));if(!Te)return{ngbDate:{invalid:G}};if(this.minDate&&Te.before(Oa.from(this.minDate)))return{ngbDate:{minDate:{minDate:this.minDate,actual:G}}};if(this.maxDate&&Te.after(Oa.from(this.maxDate)))return{ngbDate:{maxDate:{maxDate:this.maxDate,actual:G}}}}return null}writeValue(b){this._model=this._fromDateStruct(this._dateAdapter.fromModel(b)),this._writeModelValue(this._model)}manualDateChange(b,G=!1){const Te=b!==this._inputValue;Te&&(this._inputValue=b,this._model=this._fromDateStruct(this._parserFormatter.parse(b))),(Te||!G)&&this._onChange(this._model?this._dateAdapter.toModel(this._model):""===b?null:b),G&&this._model&&this._writeModelValue(this._model)}isOpen(){return!!this._cRef}open(){if(!this.isOpen()){let b;if(this._cRef=this._vcRef.createComponent(Oe),this._applyPopupStyling(this._cRef.location.nativeElement),this._applyDatepickerInputs(this._cRef.instance),this._subscribeForDatepickerOutputs(this._cRef.instance),this._cRef.instance.ngOnInit(),this._cRef.instance.writeValue(this._dateAdapter.toModel(this._model)),this._cRef.instance.registerOnChange(G=>{this.writeValue(G),this._onChange(G),this._onTouched()}),this._cRef.changeDetectorRef.detectChanges(),this._cRef.instance.setDisabledState(this.disabled),"body"===this.container&&this._document.querySelector(this.container).appendChild(this._cRef.location.nativeElement),this._elWithFocus=this._document.activeElement,$i(this._ngZone,this._cRef.location.nativeElement,this.closed,!0),setTimeout(()=>{var G;return null===(G=this._cRef)||void 0===G?void 0:G.instance.focus()}),b=$e(this.positionTarget)?this._document.querySelector(this.positionTarget):this.positionTarget instanceof HTMLElement?this.positionTarget:this._elRef.nativeElement,this._ngZone.runOutsideAngular(()=>{this._cRef&&(this._positioning.createPopper({hostElement:b,targetElement:this._cRef.location.nativeElement,placement:this.placement,appendToBody:"body"===this.container,updatePopperOptions:rl([0,2])}),this._zoneSubscription=this._ngZone.onStable.subscribe(()=>this._positioning.update()))}),this.positionTarget&&!b)throw new Error("ngbDatepicker could not find element declared in [positionTarget] to position against.");this._setCloseHandlers()}}close(){var b;if(this.isOpen()){this._vcRef.remove(this._vcRef.indexOf(this._cRef.hostView)),this._cRef=null,this._positioning.destroy(),null===(b=this._zoneSubscription)||void 0===b||b.unsubscribe(),this._destroyCloseHandlers$.next(),this.closed.emit(),this._changeDetector.markForCheck();let G=this._elWithFocus;$e(this.restoreFocus)?G=this._document.querySelector(this.restoreFocus):void 0!==this.restoreFocus&&(G=this.restoreFocus),G&&G.focus?G.focus():this._document.body.focus()}}toggle(){this.isOpen()?this.close():this.open()}navigateTo(b){this.isOpen()&&this._cRef.instance.navigateTo(b)}onBlur(){this._onTouched()}onFocus(){this._elWithFocus=this._elRef.nativeElement}ngOnChanges(b){if((b.minDate||b.maxDate)&&(this._validatorChange(),this.isOpen()&&(b.minDate&&(this._cRef.instance.minDate=this.minDate),b.maxDate&&(this._cRef.instance.maxDate=this.maxDate),this._cRef.instance.ngOnChanges(b))),b.datepickerClass){const{currentValue:G,previousValue:Te}=b.datepickerClass;this._applyPopupClass(G,Te)}b.autoClose&&this.isOpen()&&this._setCloseHandlers()}ngOnDestroy(){this.close()}_applyDatepickerInputs(b){["dayTemplate","dayTemplateData","displayMonths","firstDayOfWeek","footerTemplate","markDisabled","minDate","maxDate","navigation","outsideDays","showNavigation","showWeekNumbers","weekdays"].forEach(G=>{void 0!==this[G]&&(b[G]=this[G])}),b.startDate=this.startDate||this._model}_applyPopupClass(b,G){var Te;const Ge=null===(Te=this._cRef)||void 0===Te?void 0:Te.location.nativeElement;Ge&&(b&&this._renderer.addClass(Ge,b),G&&this._renderer.removeClass(Ge,G))}_applyPopupStyling(b){this._renderer.addClass(b,"dropdown-menu"),this._renderer.addClass(b,"show"),"body"===this.container&&this._renderer.addClass(b,"ngb-dp-body"),this._applyPopupClass(this.datepickerClass)}_subscribeForDatepickerOutputs(b){b.navigate.subscribe(G=>this.navigate.emit(G)),b.dateSelect.subscribe(G=>{this.dateSelect.emit(G),(!0===this.autoClose||"inside"===this.autoClose)&&this.close()})}_writeModelValue(b){const G=this._parserFormatter.format(b);this._inputValue=G,this._renderer.setProperty(this._elRef.nativeElement,"value",G),this.isOpen()&&(this._cRef.instance.writeValue(this._dateAdapter.toModel(b)),this._onTouched())}_fromDateStruct(b){const G=b?new Oa(b.year,b.month,b.day):null;return this._calendar.isValid(G)?G:null}_setCloseHandlers(){this._destroyCloseHandlers$.next(),Bn(this._ngZone,this._document,this.autoClose,()=>this.close(),this._destroyCloseHandlers$,[],[this._elRef.nativeElement,this._cRef.location.nativeElement])}}return P.\u0275fac=function(b){return new(b||P)(r.Y36(Ee),r.Y36(r.SBq),r.Y36(r.s_b),r.Y36(r.Qsj),r.Y36(r.R0b),r.Y36(ju),r.Y36(h),r.Y36(a.K0),r.Y36(r.sBO),r.Y36(Wd))},P.\u0275dir=r.lG2({type:P,selectors:[["input","ngbDatepicker",""]],hostVars:1,hostBindings:function(b,G){1&b&&r.NdJ("input",function(Ge){return G.manualDateChange(Ge.target.value)})("change",function(Ge){return G.manualDateChange(Ge.target.value,!0)})("focus",function(){return G.onFocus()})("blur",function(){return G.onBlur()}),2&b&&r.Ikx("disabled",G.disabled)},inputs:{autoClose:"autoClose",datepickerClass:"datepickerClass",dayTemplate:"dayTemplate",dayTemplateData:"dayTemplateData",displayMonths:"displayMonths",firstDayOfWeek:"firstDayOfWeek",footerTemplate:"footerTemplate",markDisabled:"markDisabled",minDate:"minDate",maxDate:"maxDate",navigation:"navigation",outsideDays:"outsideDays",placement:"placement",restoreFocus:"restoreFocus",showWeekNumbers:"showWeekNumbers",startDate:"startDate",container:"container",positionTarget:"positionTarget",weekdays:"weekdays",disabled:"disabled"},outputs:{dateSelect:"dateSelect",navigate:"navigate",closed:"closed"},exportAs:["ngbDatepicker"],features:[r._Bn([{provide:ur.JU,useExisting:(0,r.Gpc)(()=>P),multi:!0},{provide:ur.Cf,useExisting:(0,r.Gpc)(()=>P),multi:!0},{provide:jc,useExisting:Wd}]),r.TTD]}),P})();new Date(1882,10,12),new Date(2174,10,25);let Od=(()=>{class P{}return P.\u0275fac=function(b){return new(b||P)},P.\u0275mod=r.oAB({type:P}),P.\u0275inj=r.cJS({imports:[[a.ez,ur.u5]]}),P})(),E_=(()=>{class P{constructor(){this.autoClose=!0,this.placement=["bottom-start","bottom-end","top-start","top-end"]}}return P.\u0275fac=function(b){return new(b||P)},P.\u0275prov=r.Yz7({token:P,factory:P.\u0275fac,providedIn:"root"}),P})(),Jh=(()=>{class P{}return P.\u0275fac=function(b){return new(b||P)},P.\u0275dir=r.lG2({type:P,selectors:[["",8,"navbar"]]}),P})(),Qh=(()=>{class P{constructor(b,G){this.elementRef=b,this._renderer=G,this._disabled=!1}set disabled(b){this._disabled=""===b||!0===b,this._renderer.setProperty(this.elementRef.nativeElement,"disabled",this._disabled)}get disabled(){return this._disabled}}return P.\u0275fac=function(b){return new(b||P)(r.Y36(r.SBq),r.Y36(r.Qsj))},P.\u0275dir=r.lG2({type:P,selectors:[["","ngbDropdownItem",""]],hostAttrs:[1,"dropdown-item"],hostVars:3,hostBindings:function(b,G){2&b&&(r.Ikx("tabIndex",G.disabled?-1:0),r.ekj("disabled",G.disabled))},inputs:{disabled:"disabled"}}),P})(),Ad=(()=>{class P{constructor(b,G){this.dropdown=b,this.placement="bottom",this.isOpen=!1,this.nativeElement=G.nativeElement}}return P.\u0275fac=function(b){return new(b||P)(r.Y36((0,r.Gpc)(()=>Ep)),r.Y36(r.SBq))},P.\u0275dir=r.lG2({type:P,selectors:[["","ngbDropdownMenu",""]],contentQueries:function(b,G,Te){if(1&b&&r.Suo(Te,Qh,4),2&b){let Ge;r.iGM(Ge=r.CRH())&&(G.menuItems=Ge)}},hostVars:4,hostBindings:function(b,G){1&b&&r.NdJ("keydown.ArrowUp",function(Ge){return G.dropdown.onKeyDown(Ge)})("keydown.ArrowDown",function(Ge){return G.dropdown.onKeyDown(Ge)})("keydown.Home",function(Ge){return G.dropdown.onKeyDown(Ge)})("keydown.End",function(Ge){return G.dropdown.onKeyDown(Ge)})("keydown.Enter",function(Ge){return G.dropdown.onKeyDown(Ge)})("keydown.Space",function(Ge){return G.dropdown.onKeyDown(Ge)})("keydown.Tab",function(Ge){return G.dropdown.onKeyDown(Ge)})("keydown.Shift.Tab",function(Ge){return G.dropdown.onKeyDown(Ge)}),2&b&&r.ekj("dropdown-menu",!0)("show",G.dropdown.isOpen())}}),P})(),hu=(()=>{class P{constructor(b,G){this.dropdown=b,this.nativeElement=G.nativeElement}}return P.\u0275fac=function(b){return new(b||P)(r.Y36((0,r.Gpc)(()=>Ep)),r.Y36(r.SBq))},P.\u0275dir=r.lG2({type:P,selectors:[["","ngbDropdownAnchor",""]],hostAttrs:[1,"dropdown-toggle"],hostVars:1,hostBindings:function(b,G){2&b&&r.uIk("aria-expanded",G.dropdown.isOpen())}}),P})(),Kh=(()=>{class P extends hu{constructor(b,G){super(b,G)}}return P.\u0275fac=function(b){return new(b||P)(r.Y36((0,r.Gpc)(()=>Ep)),r.Y36(r.SBq))},P.\u0275dir=r.lG2({type:P,selectors:[["","ngbDropdownToggle",""]],hostAttrs:[1,"dropdown-toggle"],hostVars:1,hostBindings:function(b,G){1&b&&r.NdJ("click",function(){return G.dropdown.toggle()})("keydown.ArrowUp",function(Ge){return G.dropdown.onKeyDown(Ge)})("keydown.ArrowDown",function(Ge){return G.dropdown.onKeyDown(Ge)})("keydown.Home",function(Ge){return G.dropdown.onKeyDown(Ge)})("keydown.End",function(Ge){return G.dropdown.onKeyDown(Ge)})("keydown.Tab",function(Ge){return G.dropdown.onKeyDown(Ge)})("keydown.Shift.Tab",function(Ge){return G.dropdown.onKeyDown(Ge)}),2&b&&r.uIk("aria-expanded",G.dropdown.isOpen())},features:[r._Bn([{provide:hu,useExisting:(0,r.Gpc)(()=>P)}]),r.qOj]}),P})(),Ep=(()=>{class P{constructor(b,G,Te,Ge,an,fr,wr){this._changeDetector=b,this._document=Te,this._ngZone=Ge,this._elementRef=an,this._renderer=fr,this._destroyCloseHandlers$=new he.xQ,this._bodyContainer=null,this._positioning=Cu(),this._open=!1,this.openChange=new r.vpe,this.placement=G.placement,this.container=G.container,this.autoClose=G.autoClose,this.display=wr?"static":"dynamic"}ngAfterContentInit(){this._ngZone.onStable.pipe((0,vn.q)(1)).subscribe(()=>{this._applyPlacementClasses(),this._open&&this._setCloseHandlers()})}ngOnChanges(b){if(b.container&&this._open&&this._applyContainer(this.container),b.placement&&!b.placement.firstChange&&(this._positioning.setOptions({hostElement:this._anchor.nativeElement,targetElement:this._bodyContainer||this._menu.nativeElement,placement:this.placement,appendToBody:"body"===this.container}),this._applyPlacementClasses()),b.dropdownClass){const{currentValue:G,previousValue:Te}=b.dropdownClass;this._applyCustomDropdownClass(G,Te)}b.autoClose&&this._open&&(this.autoClose=b.autoClose.currentValue,this._setCloseHandlers())}isOpen(){return this._open}open(){this._open||(this._open=!0,this._applyContainer(this.container),this.openChange.emit(!0),this._setCloseHandlers(),this._anchor&&(this._anchor.nativeElement.focus(),"dynamic"===this.display&&this._ngZone.runOutsideAngular(()=>{this._positioning.createPopper({hostElement:this._anchor.nativeElement,targetElement:this._bodyContainer||this._menu.nativeElement,placement:this.placement,appendToBody:"body"===this.container,updatePopperOptions:rl([0,2])}),this._applyPlacementClasses(),this._zoneSubscription=this._ngZone.onStable.subscribe(()=>this._positionMenu())})))}_setCloseHandlers(){this._destroyCloseHandlers$.next(),Bn(this._ngZone,this._document,this.autoClose,b=>{this.close(),0===b&&this._anchor.nativeElement.focus()},this._destroyCloseHandlers$,this._menu?[this._menu.nativeElement]:[],this._anchor?[this._anchor.nativeElement]:[],".dropdown-item,.dropdown-divider")}close(){var b;this._open&&(this._open=!1,this._resetContainer(),this._positioning.destroy(),null===(b=this._zoneSubscription)||void 0===b||b.unsubscribe(),this._destroyCloseHandlers$.next(),this.openChange.emit(!1),this._changeDetector.markForCheck())}toggle(){this.isOpen()?this.close():this.open()}ngOnDestroy(){this.close()}onKeyDown(b){const G=b.which,Te=this._getMenuElements();let Ge=-1,an=null;const fr=this._isEventFromToggle(b);if(!fr&&Te.length&&Te.forEach((wr,ci)=>{wr.contains(b.target)&&(an=wr),wr===this._document.activeElement&&(Ge=ci)}),G!==le.Space&&G!==le.Enter){if(G!==le.Tab){if(fr||an){if(this.open(),Te.length){switch(G){case le.ArrowDown:Ge=Math.min(Ge+1,Te.length-1);break;case le.ArrowUp:if(this._isDropup()&&-1===Ge){Ge=Te.length-1;break}Ge=Math.max(Ge-1,0);break;case le.Home:Ge=0;break;case le.End:Ge=Te.length-1}Te[Ge].focus()}b.preventDefault()}}else if(b.target&&this.isOpen()&&this.autoClose){if(this._anchor.nativeElement===b.target)return void("body"!==this.container||b.shiftKey?b.shiftKey&&this.close():(this._renderer.setAttribute(this._menu.nativeElement,"tabindex","0"),this._menu.nativeElement.focus(),this._renderer.removeAttribute(this._menu.nativeElement,"tabindex")));if("body"===this.container){const wr=this._menu.nativeElement.querySelectorAll(ar);b.shiftKey&&b.target===wr[0]?(this._anchor.nativeElement.focus(),b.preventDefault()):!b.shiftKey&&b.target===wr[wr.length-1]&&(this._anchor.nativeElement.focus(),this.close())}else(0,be.R)(b.target,"focusout").pipe((0,vn.q)(1)).subscribe(({relatedTarget:wr})=>{this._elementRef.nativeElement.contains(wr)||this.close()})}}else an&&(!0===this.autoClose||"inside"===this.autoClose)&&(0,be.R)(an,"click").pipe((0,vn.q)(1)).subscribe(()=>this.close())}_isDropup(){return this._elementRef.nativeElement.classList.contains("dropup")}_isEventFromToggle(b){return this._anchor.nativeElement.contains(b.target)}_getMenuElements(){const b=this._menu;return null==b?[]:b.menuItems.filter(G=>!G.disabled).map(G=>G.elementRef.nativeElement)}_positionMenu(){const b=this._menu;this.isOpen()&&b&&("dynamic"===this.display?(this._positioning.update(),this._applyPlacementClasses()):this._applyPlacementClasses(this._getFirstPlacement(this.placement)))}_getFirstPlacement(b){return Array.isArray(b)?b[0]:b.split(" ")[0]}_resetContainer(){const b=this._renderer;this._menu&&b.appendChild(this._elementRef.nativeElement,this._menu.nativeElement),this._bodyContainer&&(b.removeChild(this._document.body,this._bodyContainer),this._bodyContainer=null)}_applyContainer(b=null){if(this._resetContainer(),"body"===b){const G=this._renderer,Te=this._menu.nativeElement,Ge=this._bodyContainer=this._bodyContainer||G.createElement("div");G.setStyle(Ge,"position","absolute"),G.setStyle(Te,"position","static"),G.setStyle(Ge,"z-index","1055"),G.appendChild(Ge,Te),G.appendChild(this._document.body,Ge)}this._applyCustomDropdownClass(this.dropdownClass)}_applyCustomDropdownClass(b,G){const Te="body"===this.container?this._bodyContainer:this._elementRef.nativeElement;Te&&(G&&this._renderer.removeClass(Te,G),b&&this._renderer.addClass(Te,b))}_applyPlacementClasses(b){const G=this._menu;if(G){b||(b=this._getFirstPlacement(this.placement));const Te=this._renderer,Ge=this._elementRef.nativeElement;Te.removeClass(Ge,"dropup"),Te.removeClass(Ge,"dropdown");const{nativeElement:an}=G;"static"===this.display?(G.placement=null,Te.setAttribute(an,"data-bs-popper","static")):(G.placement=b,Te.removeAttribute(an,"data-bs-popper"));const fr=-1!==b.search("^top")?"dropup":"dropdown";Te.addClass(Ge,fr);const wr=this._bodyContainer;wr&&(Te.removeClass(wr,"dropup"),Te.removeClass(wr,"dropdown"),Te.addClass(wr,fr))}}}return P.\u0275fac=function(b){return new(b||P)(r.Y36(r.sBO),r.Y36(E_),r.Y36(a.K0),r.Y36(r.R0b),r.Y36(r.SBq),r.Y36(r.Qsj),r.Y36(Jh,8))},P.\u0275dir=r.lG2({type:P,selectors:[["","ngbDropdown",""]],contentQueries:function(b,G,Te){if(1&b&&(r.Suo(Te,Ad,5),r.Suo(Te,hu,5)),2&b){let Ge;r.iGM(Ge=r.CRH())&&(G._menu=Ge.first),r.iGM(Ge=r.CRH())&&(G._anchor=Ge.first)}},hostVars:2,hostBindings:function(b,G){2&b&&r.ekj("show",G.isOpen())},inputs:{autoClose:"autoClose",dropdownClass:"dropdownClass",_open:["open","_open"],placement:"placement",container:"container",display:"display"},outputs:{openChange:"openChange"},exportAs:["ngbDropdown"],features:[r.TTD]}),P})(),ic=(()=>{class P{}return P.\u0275fac=function(b){return new(b||P)},P.\u0275mod=r.oAB({type:P}),P.\u0275inj=r.cJS({}),P})();class Kd{constructor(te,b,G){this.nodes=te,this.viewRef=b,this.componentRef=G}}class Vf{constructor(te,b,G,Te,Ge,an){this._type=te,this._injector=b,this._viewContainerRef=G,this._renderer=Te,this._ngZone=Ge,this._applicationRef=an,this._windowRef=null,this._contentRef=null}open(te,b,G=!1){this._windowRef||(this._contentRef=this._getContentRef(te,b),this._windowRef=this._viewContainerRef.createComponent(this._type,{index:this._viewContainerRef.length,injector:this._injector,projectableNodes:this._contentRef.nodes}));const{nativeElement:Te}=this._windowRef.location,Ge=this._ngZone.onStable.pipe((0,vn.q)(1),(0,Ei.zg)(()=>nl(this._ngZone,Te,({classList:an})=>an.add("show"),{animation:G,runningTransition:"continue"})));return{windowRef:this._windowRef,transition$:Ge}}close(te=!1){return this._windowRef?nl(this._ngZone,this._windowRef.location.nativeElement,({classList:b})=>b.remove("show"),{animation:te,runningTransition:"stop"}).pipe((0,Fn.b)(()=>{var b;this._windowRef&&(this._viewContainerRef.remove(this._viewContainerRef.indexOf(this._windowRef.hostView)),this._windowRef=null),(null===(b=this._contentRef)||void 0===b?void 0:b.viewRef)&&(this._applicationRef.detachView(this._contentRef.viewRef),this._contentRef.viewRef.destroy(),this._contentRef=null)})):(0,ae.of)(void 0)}_getContentRef(te,b){if(te){if(te instanceof r.Rgc){const G=te.createEmbeddedView(b);return this._applicationRef.attachView(G),new Kd([G.rootNodes],G)}return new Kd([[this._renderer.createText(`${te}`)]])}return new Kd([])}}let qh=(()=>{class P{constructor(b,G){this._el=b,this._zone=G}ngOnInit(){this._zone.onStable.asObservable().pipe((0,vn.q)(1)).subscribe(()=>{nl(this._zone,this._el.nativeElement,(b,G)=>{G&&Lo(b),b.classList.add("show")},{animation:this.animation,runningTransition:"continue"})})}hide(){return nl(this._zone,this._el.nativeElement,({classList:b})=>b.remove("show"),{animation:this.animation,runningTransition:"stop"})}}return P.\u0275fac=function(b){return new(b||P)(r.Y36(r.SBq),r.Y36(r.R0b))},P.\u0275cmp=r.Xpm({type:P,selectors:[["ngb-modal-backdrop"]],hostAttrs:[2,"z-index","1055"],hostVars:6,hostBindings:function(b,G){2&b&&(r.Tol("modal-backdrop"+(G.backdropClass?" "+G.backdropClass:"")),r.ekj("show",!G.animation)("fade",G.animation))},inputs:{animation:"animation",backdropClass:"backdropClass"},decls:0,vars:0,template:function(b,G){},encapsulation:2}),P})();class bp{close(te){}dismiss(te){}}class b_{constructor(te,b,G,Te){this._windowCmptRef=te,this._contentRef=b,this._backdropCmptRef=G,this._beforeDismiss=Te,this._closed=new he.xQ,this._dismissed=new he.xQ,this._hidden=new he.xQ,te.instance.dismissEvent.subscribe(Ge=>{this.dismiss(Ge)}),this.result=new Promise((Ge,an)=>{this._resolve=Ge,this._reject=an}),this.result.then(null,()=>{})}get componentInstance(){if(this._contentRef&&this._contentRef.componentRef)return this._contentRef.componentRef.instance}get closed(){return this._closed.asObservable().pipe((0,Vt.R)(this._hidden))}get dismissed(){return this._dismissed.asObservable().pipe((0,Vt.R)(this._hidden))}get hidden(){return this._hidden.asObservable()}get shown(){return this._windowCmptRef.instance.shown.asObservable()}close(te){this._windowCmptRef&&(this._closed.next(te),this._resolve(te),this._removeModalElements())}_dismiss(te){this._dismissed.next(te),this._reject(te),this._removeModalElements()}dismiss(te){if(this._windowCmptRef)if(this._beforeDismiss){const b=this._beforeDismiss();!function vt(P){return P&&P.then}(b)?!1!==b&&this._dismiss(te):b.then(G=>{!1!==G&&this._dismiss(te)},()=>{})}else this._dismiss(te)}_removeModalElements(){const te=this._windowCmptRef.instance.hide(),b=this._backdropCmptRef?this._backdropCmptRef.instance.hide():(0,ae.of)(void 0);te.subscribe(()=>{const{nativeElement:G}=this._windowCmptRef.location;G.parentNode.removeChild(G),this._windowCmptRef.destroy(),this._contentRef&&this._contentRef.viewRef&&this._contentRef.viewRef.destroy(),this._windowCmptRef=null,this._contentRef=null}),b.subscribe(()=>{if(this._backdropCmptRef){const{nativeElement:G}=this._backdropCmptRef.location;G.parentNode.removeChild(G),this._backdropCmptRef.destroy(),this._backdropCmptRef=null}}),W(te,b).subscribe(()=>{this._hidden.next(),this._hidden.complete()})}}var Sp=(()=>{return(P=Sp||(Sp={}))[P.BACKDROP_CLICK=0]="BACKDROP_CLICK",P[P.ESC=1]="ESC",Sp;var P})();let yh=(()=>{class P{constructor(b,G,Te){this._document=b,this._elRef=G,this._zone=Te,this._closed$=new he.xQ,this._elWithFocus=null,this.backdrop=!0,this.keyboard=!0,this.dismissEvent=new r.vpe,this.shown=new he.xQ,this.hidden=new he.xQ}get fullscreenClass(){return!0===this.fullscreen?" modal-fullscreen":$e(this.fullscreen)?` modal-fullscreen-${this.fullscreen}-down`:""}dismiss(b){this.dismissEvent.emit(b)}ngOnInit(){this._elWithFocus=this._document.activeElement,this._zone.onStable.asObservable().pipe((0,vn.q)(1)).subscribe(()=>{this._show()})}ngOnDestroy(){this._disableEventHandling()}hide(){const{nativeElement:b}=this._elRef,G={animation:this.animation,runningTransition:"stop"},an=W(nl(this._zone,b,()=>b.classList.remove("show"),G),nl(this._zone,this._dialogEl.nativeElement,()=>{},G));return an.subscribe(()=>{this.hidden.next(),this.hidden.complete()}),this._disableEventHandling(),this._restoreFocus(),an}_show(){const b={animation:this.animation,runningTransition:"continue"};W(nl(this._zone,this._elRef.nativeElement,(Ge,an)=>{an&&Lo(Ge),Ge.classList.add("show")},b),nl(this._zone,this._dialogEl.nativeElement,()=>{},b)).subscribe(()=>{this.shown.next(),this.shown.complete()}),this._enableEventHandling(),this._setFocus()}_enableEventHandling(){const{nativeElement:b}=this._elRef;this._zone.runOutsideAngular(()=>{(0,be.R)(b,"keydown").pipe((0,Vt.R)(this._closed$),(0,hn.h)(Te=>Te.which===le.Escape)).subscribe(Te=>{this.keyboard?requestAnimationFrame(()=>{Te.defaultPrevented||this._zone.run(()=>this.dismiss(Sp.ESC))}):"static"===this.backdrop&&this._bumpBackdrop()});let G=!1;(0,be.R)(this._dialogEl.nativeElement,"mousedown").pipe((0,Vt.R)(this._closed$),(0,Fn.b)(()=>G=!1),(0,Yt.w)(()=>(0,be.R)(b,"mouseup").pipe((0,Vt.R)(this._closed$),(0,vn.q)(1))),(0,hn.h)(({target:Te})=>b===Te)).subscribe(()=>{G=!0}),(0,be.R)(b,"click").pipe((0,Vt.R)(this._closed$)).subscribe(({target:Te})=>{b===Te&&("static"===this.backdrop?this._bumpBackdrop():!0===this.backdrop&&!G&&this._zone.run(()=>this.dismiss(Sp.BACKDROP_CLICK))),G=!1})})}_disableEventHandling(){this._closed$.next()}_setFocus(){const{nativeElement:b}=this._elRef;if(!b.contains(document.activeElement)){const G=b.querySelector("[ngbAutofocus]"),Te=Pr(b)[0];(G||Te||b).focus()}}_restoreFocus(){const b=this._document.body,G=this._elWithFocus;let Te;Te=G&&G.focus&&b.contains(G)?G:b,this._zone.runOutsideAngular(()=>{setTimeout(()=>Te.focus()),this._elWithFocus=null})}_bumpBackdrop(){"static"===this.backdrop&&nl(this._zone,this._elRef.nativeElement,({classList:b})=>(b.add("modal-static"),()=>b.remove("modal-static")),{animation:this.animation,runningTransition:"continue"})}}return P.\u0275fac=function(b){return new(b||P)(r.Y36(a.K0),r.Y36(r.SBq),r.Y36(r.R0b))},P.\u0275cmp=r.Xpm({type:P,selectors:[["ngb-modal-window"]],viewQuery:function(b,G){if(1&b&&r.Gf(Hi,7),2&b){let Te;r.iGM(Te=r.CRH())&&(G._dialogEl=Te.first)}},hostAttrs:["role","dialog","tabindex","-1"],hostVars:7,hostBindings:function(b,G){2&b&&(r.uIk("aria-modal",!0)("aria-labelledby",G.ariaLabelledBy)("aria-describedby",G.ariaDescribedBy),r.Tol("modal d-block"+(G.windowClass?" "+G.windowClass:"")),r.ekj("fade",G.animation))},inputs:{animation:"animation",ariaLabelledBy:"ariaLabelledBy",ariaDescribedBy:"ariaDescribedBy",backdrop:"backdrop",centered:"centered",fullscreen:"fullscreen",keyboard:"keyboard",scrollable:"scrollable",size:"size",windowClass:"windowClass",modalDialogClass:"modalDialogClass"},outputs:{dismissEvent:"dismiss"},ngContentSelectors:Ku,decls:4,vars:2,consts:[["role","document"],["dialog",""],[1,"modal-content"]],template:function(b,G){1&b&&(r.F$t(),r.TgZ(0,"div",0,1)(2,"div",2),r.Hsn(3),r.qZA()()),2&b&&r.Tol("modal-dialog"+(G.size?" modal-"+G.size:"")+(G.centered?" modal-dialog-centered":"")+G.fullscreenClass+(G.scrollable?" modal-dialog-scrollable":"")+(G.modalDialogClass?" "+G.modalDialogClass:""))},styles:["ngb-modal-window .component-host-scrollable{display:flex;flex-direction:column;overflow:hidden}\n"],encapsulation:2}),P})(),S_=(()=>{class P{constructor(b){this._document=b}hide(){const b=Math.abs(window.innerWidth-this._document.documentElement.clientWidth),G=this._document.body,Te=G.style,{overflow:Ge,paddingRight:an}=Te;if(b>0){const fr=parseFloat(window.getComputedStyle(G).paddingRight);Te.paddingRight=`${fr+b}px`}return Te.overflow="hidden",()=>{b>0&&(Te.paddingRight=an),Te.overflow=Ge}}}return P.\u0275fac=function(b){return new(b||P)(r.LFG(a.K0))},P.\u0275prov=r.Yz7({token:P,factory:P.\u0275fac,providedIn:"root"}),P})(),Eh=(()=>{class P{constructor(b,G,Te,Ge,an,fr){this._applicationRef=b,this._injector=G,this._document=Te,this._scrollBar=Ge,this._rendererFactory=an,this._ngZone=fr,this._activeWindowCmptHasChanged=new he.xQ,this._ariaHiddenValues=new Map,this._scrollBarRestoreFn=null,this._backdropAttributes=["animation","backdropClass"],this._modalRefs=[],this._windowAttributes=["animation","ariaLabelledBy","ariaDescribedBy","backdrop","centered","fullscreen","keyboard","scrollable","size","windowClass","modalDialogClass"],this._windowCmpts=[],this._activeInstances=new r.vpe,this._activeWindowCmptHasChanged.subscribe(()=>{if(this._windowCmpts.length){const wr=this._windowCmpts[this._windowCmpts.length-1];$i(this._ngZone,wr.location.nativeElement,this._activeWindowCmptHasChanged),this._revertAriaHidden(),this._setAriaHidden(wr.location.nativeElement)}})}_restoreScrollBar(){const b=this._scrollBarRestoreFn;b&&(this._scrollBarRestoreFn=null,b())}_hideScrollBar(){this._scrollBarRestoreFn||(this._scrollBarRestoreFn=this._scrollBar.hide())}open(b,G,Te,Ge){const an=Ge.container instanceof HTMLElement?Ge.container:at(Ge.container)?this._document.querySelector(Ge.container):this._document.body,fr=this._rendererFactory.createRenderer(null,null);if(!an)throw new Error(`The specified modal container "${Ge.container||"body"}" was not found in the DOM.`);this._hideScrollBar();const wr=new bp,ci=this._getContentRef(b,Ge.injector||G,Te,wr,Ge);let oi=!1!==Ge.backdrop?this._attachBackdrop(b,an):void 0,ts=this._attachWindowComponent(b,an,ci),Do=new b_(ts,ci,oi,Ge.beforeDismiss);return this._registerModalRef(Do),this._registerWindowCmpt(ts),Do.hidden.pipe((0,vn.q)(1)).subscribe(()=>Promise.resolve(!0).then(()=>{this._modalRefs.length||(fr.removeClass(this._document.body,"modal-open"),this._restoreScrollBar(),this._revertAriaHidden())})),wr.close=Ss=>{Do.close(Ss)},wr.dismiss=Ss=>{Do.dismiss(Ss)},this._applyWindowOptions(ts.instance,Ge),1===this._modalRefs.length&&fr.addClass(this._document.body,"modal-open"),oi&&oi.instance&&(this._applyBackdropOptions(oi.instance,Ge),oi.changeDetectorRef.detectChanges()),ts.changeDetectorRef.detectChanges(),Do}get activeInstances(){return this._activeInstances}dismissAll(b){this._modalRefs.forEach(G=>G.dismiss(b))}hasOpenModals(){return this._modalRefs.length>0}_attachBackdrop(b,G){let Ge=b.resolveComponentFactory(qh).create(this._injector);return this._applicationRef.attachView(Ge.hostView),G.appendChild(Ge.location.nativeElement),Ge}_attachWindowComponent(b,G,Te){let an=b.resolveComponentFactory(yh).create(this._injector,Te.nodes);return this._applicationRef.attachView(an.hostView),G.appendChild(an.location.nativeElement),an}_applyWindowOptions(b,G){this._windowAttributes.forEach(Te=>{at(G[Te])&&(b[Te]=G[Te])})}_applyBackdropOptions(b,G){this._backdropAttributes.forEach(Te=>{at(G[Te])&&(b[Te]=G[Te])})}_getContentRef(b,G,Te,Ge,an){return Te?Te instanceof r.Rgc?this._createFromTemplateRef(Te,Ge):$e(Te)?this._createFromString(Te):this._createFromComponent(b,G,Te,Ge,an):new Kd([])}_createFromTemplateRef(b,G){const Ge=b.createEmbeddedView({$implicit:G,close(an){G.close(an)},dismiss(an){G.dismiss(an)}});return this._applicationRef.attachView(Ge),new Kd([Ge.rootNodes],Ge)}_createFromString(b){const G=this._document.createTextNode(`${b}`);return new Kd([[G]])}_createFromComponent(b,G,Te,Ge,an){const fr=b.resolveComponentFactory(Te),wr=r.zs3.create({providers:[{provide:bp,useValue:Ge}],parent:G}),ci=fr.create(wr),oi=ci.location.nativeElement;return an.scrollable&&oi.classList.add("component-host-scrollable"),this._applicationRef.attachView(ci.hostView),new Kd([[oi]],ci.hostView,ci)}_setAriaHidden(b){const G=b.parentElement;G&&b!==this._document.body&&(Array.from(G.children).forEach(Te=>{Te!==b&&"SCRIPT"!==Te.nodeName&&(this._ariaHiddenValues.set(Te,Te.getAttribute("aria-hidden")),Te.setAttribute("aria-hidden","true"))}),this._setAriaHidden(G))}_revertAriaHidden(){this._ariaHiddenValues.forEach((b,G)=>{b?G.setAttribute("aria-hidden",b):G.removeAttribute("aria-hidden")}),this._ariaHiddenValues.clear()}_registerModalRef(b){const G=()=>{const Te=this._modalRefs.indexOf(b);Te>-1&&(this._modalRefs.splice(Te,1),this._activeInstances.emit(this._modalRefs))};this._modalRefs.push(b),this._activeInstances.emit(this._modalRefs),b.result.then(G,G)}_registerWindowCmpt(b){this._windowCmpts.push(b),this._activeWindowCmptHasChanged.next(),b.onDestroy(()=>{const G=this._windowCmpts.indexOf(b);G>-1&&(this._windowCmpts.splice(G,1),this._activeWindowCmptHasChanged.next())})}}return P.\u0275fac=function(b){return new(b||P)(r.LFG(r.z2F),r.LFG(r.zs3),r.LFG(a.K0),r.LFG(S_),r.LFG(r.FYo),r.LFG(r.R0b))},P.\u0275prov=r.Yz7({token:P,factory:P.\u0275fac,providedIn:"root"}),P})(),$_=(()=>{class P{constructor(b){this._ngbConfig=b,this.backdrop=!0,this.fullscreen=!1,this.keyboard=!0}get animation(){return void 0===this._animation?this._ngbConfig.animation:this._animation}set animation(b){this._animation=b}}return P.\u0275fac=function(b){return new(b||P)(r.LFG(Bl))},P.\u0275prov=r.Yz7({token:P,factory:P.\u0275fac,providedIn:"root"}),P})(),e_=(()=>{class P{constructor(b,G,Te,Ge){this._moduleCFR=b,this._injector=G,this._modalStack=Te,this._config=Ge}open(b,G={}){const Te=Object.assign(Object.assign(Object.assign({},this._config),{animation:this._config.animation}),G);return this._modalStack.open(this._moduleCFR,this._injector,b,Te)}get activeInstances(){return this._modalStack.activeInstances}dismissAll(b){this._modalStack.dismissAll(b)}hasOpenModals(){return this._modalStack.hasOpenModals()}}return P.\u0275fac=function(b){return new(b||P)(r.LFG(r._Vd),r.LFG(r.zs3),r.LFG(Eh),r.LFG($_))},P.\u0275prov=r.Yz7({token:P,factory:P.\u0275fac,providedIn:"root"}),P})(),t_=(()=>{class P{constructor(b){this._ngbConfig=b,this.destroyOnHide=!0,this.orientation="horizontal",this.roles="tablist",this.keyboard=!1}get animation(){return void 0===this._animation?this._ngbConfig.animation:this._animation}set animation(b){this._animation=b}}return P.\u0275fac=function(b){return new(b||P)(r.LFG(Bl))},P.\u0275prov=r.Yz7({token:P,factory:P.\u0275fac,providedIn:"root"}),P})();const bh=P=>at(P)&&""!==P;let n_=0,Zf=(()=>{class P{constructor(b){this.templateRef=b}}return P.\u0275fac=function(b){return new(b||P)(r.Y36(r.Rgc))},P.\u0275dir=r.lG2({type:P,selectors:[["ng-template","ngbNavContent",""]]}),P})(),Sh=(()=>{class P{constructor(b,G){this.elementRef=G,this.disabled=!1,this.shown=new r.vpe,this.hidden=new r.vpe,this._nav=b}ngAfterContentChecked(){this.contentTpl=this.contentTpls.first}ngOnInit(){at(this.domId)||(this.domId="ngb-nav-"+n_++)}get active(){return this._nav.activeId===this.id}get id(){return bh(this._id)?this._id:this.domId}get panelDomId(){return`${this.domId}-panel`}isPanelInDom(){return(at(this.destroyOnHide)?!this.destroyOnHide:!this._nav.destroyOnHide)||this.active}}return P.\u0275fac=function(b){return new(b||P)(r.Y36((0,r.Gpc)(()=>Tp)),r.Y36(r.SBq))},P.\u0275dir=r.lG2({type:P,selectors:[["","ngbNavItem",""]],contentQueries:function(b,G,Te){if(1&b&&r.Suo(Te,Zf,4),2&b){let Ge;r.iGM(Ge=r.CRH())&&(G.contentTpls=Ge)}},hostVars:2,hostBindings:function(b,G){2&b&&r.ekj("nav-item",!0)},inputs:{destroyOnHide:"destroyOnHide",disabled:"disabled",domId:"domId",_id:["ngbNavItem","_id"]},outputs:{shown:"shown",hidden:"hidden"},exportAs:["ngbNavItem"]}),P})(),Tp=(()=>{class P{constructor(b,G,Te,Ge){this.role=b,this._cd=Te,this._document=Ge,this.activeIdChange=new r.vpe,this.shown=new r.vpe,this.hidden=new r.vpe,this.destroy$=new he.xQ,this.navItemChange$=new he.xQ,this.navChange=new r.vpe,this.animation=G.animation,this.destroyOnHide=G.destroyOnHide,this.orientation=G.orientation,this.roles=G.roles,this.keyboard=G.keyboard}click(b){b.disabled||this._updateActiveId(b.id)}onKeyDown(b){if("tablist"!==this.roles||!this.keyboard)return;const G=b.which,Te=this.links.filter(fr=>!fr.navItem.disabled),{length:Ge}=Te;let an=-1;if(Te.forEach((fr,wr)=>{fr.elRef.nativeElement===this._document.activeElement&&(an=wr)}),Ge){switch(G){case le.ArrowLeft:if("vertical"===this.orientation)return;an=(an-1+Ge)%Ge;break;case le.ArrowRight:if("vertical"===this.orientation)return;an=(an+1)%Ge;break;case le.ArrowDown:if("horizontal"===this.orientation)return;an=(an+1)%Ge;break;case le.ArrowUp:if("horizontal"===this.orientation)return;an=(an-1+Ge)%Ge;break;case le.Home:an=0;break;case le.End:an=Ge-1}"changeWithArrows"===this.keyboard&&this.select(Te[an].navItem.id),Te[an].elRef.nativeElement.focus(),b.preventDefault()}}select(b){this._updateActiveId(b,!1)}ngAfterContentInit(){if(!at(this.activeId)){const b=this.items.first?this.items.first.id:null;bh(b)&&(this._updateActiveId(b,!1),this._cd.detectChanges())}this.items.changes.pipe((0,Vt.R)(this.destroy$)).subscribe(()=>this._notifyItemChanged(this.activeId))}ngOnChanges({activeId:b}){b&&!b.firstChange&&this._notifyItemChanged(b.currentValue)}ngOnDestroy(){this.destroy$.next()}_updateActiveId(b,G=!0){if(this.activeId!==b){let Te=!1;G&&this.navChange.emit({activeId:this.activeId,nextId:b,preventDefault:()=>{Te=!0}}),Te||(this.activeId=b,this.activeIdChange.emit(b),this._notifyItemChanged(b))}}_notifyItemChanged(b){this.navItemChange$.next(this._getItemById(b))}_getItemById(b){return this.items&&this.items.find(G=>G.id===b)||null}}return P.\u0275fac=function(b){return new(b||P)(r.$8M("role"),r.Y36(t_),r.Y36(r.sBO),r.Y36(a.K0))},P.\u0275dir=r.lG2({type:P,selectors:[["","ngbNav",""]],contentQueries:function(b,G,Te){if(1&b&&(r.Suo(Te,Sh,4),r.Suo(Te,bf,5)),2&b){let Ge;r.iGM(Ge=r.CRH())&&(G.items=Ge),r.iGM(Ge=r.CRH())&&(G.links=Ge)}},hostVars:6,hostBindings:function(b,G){1&b&&r.NdJ("keydown.arrowLeft",function(Ge){return G.onKeyDown(Ge)})("keydown.arrowRight",function(Ge){return G.onKeyDown(Ge)})("keydown.arrowDown",function(Ge){return G.onKeyDown(Ge)})("keydown.arrowUp",function(Ge){return G.onKeyDown(Ge)})("keydown.Home",function(Ge){return G.onKeyDown(Ge)})("keydown.End",function(Ge){return G.onKeyDown(Ge)}),2&b&&(r.uIk("aria-orientation","vertical"===G.orientation&&"tablist"===G.roles?"vertical":void 0)("role",G.role?G.role:G.roles?"tablist":void 0),r.ekj("nav",!0)("flex-column","vertical"===G.orientation))},inputs:{activeId:"activeId",animation:"animation",destroyOnHide:"destroyOnHide",orientation:"orientation",roles:"roles",keyboard:"keyboard"},outputs:{activeIdChange:"activeIdChange",shown:"shown",hidden:"hidden",navChange:"navChange"},exportAs:["ngbNav"],features:[r.TTD]}),P})(),bf=(()=>{class P{constructor(b,G,Te,Ge){this.role=b,this.navItem=G,this.nav=Te,this.elRef=Ge}hasNavItemClass(){return this.navItem.elementRef.nativeElement.nodeType===Node.COMMENT_NODE}}return P.\u0275fac=function(b){return new(b||P)(r.$8M("role"),r.Y36(Sh),r.Y36(Tp),r.Y36(r.SBq))},P.\u0275dir=r.lG2({type:P,selectors:[["a","ngbNavLink",""]],hostAttrs:["href",""],hostVars:14,hostBindings:function(b,G){1&b&&r.NdJ("click",function(Ge){return G.nav.click(G.navItem),Ge.preventDefault()}),2&b&&(r.Ikx("id",G.navItem.domId),r.uIk("role",G.role?G.role:G.nav.roles?"tab":void 0)("tabindex",G.navItem.disabled?-1:void 0)("aria-controls",G.navItem.isPanelInDom()?G.navItem.panelDomId:null)("aria-selected",G.navItem.active)("aria-disabled",G.navItem.disabled),r.ekj("nav-link",!0)("nav-item",G.hasNavItemClass())("active",G.navItem.active)("disabled",G.navItem.disabled))}}),P})();const Th=({classList:P})=>(P.remove("show"),()=>P.remove("active")),Ch=(P,te)=>{te&&Lo(P),P.classList.add("show")};let da=(()=>{class P{constructor(b){this.elRef=b}}return P.\u0275fac=function(b){return new(b||P)(r.Y36(r.SBq))},P.\u0275dir=r.lG2({type:P,selectors:[["","ngbNavPane",""]],hostAttrs:[1,"tab-pane"],hostVars:5,hostBindings:function(b,G){2&b&&(r.Ikx("id",G.item.panelDomId),r.uIk("role",G.role?G.role:G.nav.roles?"tabpanel":void 0)("aria-labelledby",G.item.domId),r.ekj("fade",G.nav.animation))},inputs:{item:"item",nav:"nav",role:"role"}}),P})(),Rc=(()=>{class P{constructor(b,G){this._cd=b,this._ngZone=G,this._activePane=null}isPanelTransitioning(b){var G;return(null===(G=this._activePane)||void 0===G?void 0:G.item)===b}ngAfterViewInit(){var b;this._updateActivePane(),this.nav.navItemChange$.pipe((0,Vt.R)(this.nav.destroy$),(0,Nt.O)((null===(b=this._activePane)||void 0===b?void 0:b.item)||null),(0,St.x)(),function rt(P){return te=>te.lift(new en(P))}(1)).subscribe(G=>{const Te={animation:this.nav.animation,runningTransition:"stop"};this._cd.detectChanges(),this._activePane?nl(this._ngZone,this._activePane.elRef.nativeElement,Th,Te).subscribe(()=>{var Ge;const an=null===(Ge=this._activePane)||void 0===Ge?void 0:Ge.item;this._activePane=this._getPaneForItem(G),this._cd.markForCheck(),this._activePane&&(this._activePane.elRef.nativeElement.classList.add("active"),nl(this._ngZone,this._activePane.elRef.nativeElement,Ch,Te).subscribe(()=>{G&&(G.shown.emit(),this.nav.shown.emit(G.id))})),an&&(an.hidden.emit(),this.nav.hidden.emit(an.id))}):this._updateActivePane()})}_updateActivePane(){var b,G;this._activePane=this._getActivePane(),null===(b=this._activePane)||void 0===b||b.elRef.nativeElement.classList.add("show"),null===(G=this._activePane)||void 0===G||G.elRef.nativeElement.classList.add("active")}_getPaneForItem(b){return this._panes&&this._panes.find(G=>G.item===b)||null}_getActivePane(){return this._panes&&this._panes.find(b=>b.item.active)||null}}return P.\u0275fac=function(b){return new(b||P)(r.Y36(r.sBO),r.Y36(r.R0b))},P.\u0275cmp=r.Xpm({type:P,selectors:[["","ngbNavOutlet",""]],viewQuery:function(b,G){if(1&b&&r.Gf(da,5),2&b){let Te;r.iGM(Te=r.CRH())&&(G._panes=Te)}},hostVars:2,hostBindings:function(b,G){2&b&&r.ekj("tab-content",!0)},inputs:{paneRole:"paneRole",nav:["ngbNavOutlet","nav"]},attrs:oa,decls:1,vars:1,consts:[["ngFor","",3,"ngForOf"],["ngbNavPane","",3,"item","nav","role",4,"ngIf"],["ngbNavPane","",3,"item","nav","role"],[3,"ngTemplateOutlet","ngTemplateOutletContext"]],template:function(b,G){1&b&&r.YNc(0,bl,1,1,"ng-template",0),2&b&&r.Q6J("ngForOf",G.nav.items)},directives:[a.sg,a.O5,da,a.tP],encapsulation:2,changeDetection:0}),P})(),Ts=(()=>{class P{}return P.\u0275fac=function(b){return new(b||P)},P.\u0275mod=r.oAB({type:P}),P.\u0275inj=r.cJS({imports:[[a.ez]]}),P})();class If{constructor(te,b){this.open=te,this.close=b,b||(this.close=te)}isManual(){return"manual"===this.open||"manual"===this.close}}const Cs={hover:["mouseenter","mouseleave"],focus:["focusin","focusout"]},pc=P=>P>0?(0,pr.g)(P):te=>te;function Jf(P,te,b,G,Te,Ge,an=0,fr=0){const wr=function zu(P,te=Cs){const b=(P||"").trim();if(0===b.length)return[];const G=b.split(/\s+/).map(Ge=>Ge.split(":")).map(Ge=>{let an=te[Ge[0]]||Ge;return new If(an[0],an[1])}),Te=G.filter(Ge=>Ge.isManual());if(Te.length>1)throw"Triggers parse error: only one manual trigger is allowed";if(1===Te.length&&G.length>1)throw"Triggers parse error: manual trigger can't be mixed with other triggers";return G}(b);if(1===wr.length&&wr[0].isManual())return()=>{};const ci=function zp(P,te,b,G){return new se.y(Te=>{const Ge=[],an=()=>Te.next(!0),fr=()=>Te.next(!1),wr=()=>Te.next(!G());return b.forEach(ci=>{ci.open===ci.close?Ge.push(P.listen(te,ci.open,wr)):Ge.push(P.listen(te,ci.open,an),P.listen(te,ci.close,fr))}),()=>{Ge.forEach(ci=>ci())}})}(P,te,wr,G).pipe(function oc(P,te,b){return G=>{let Te=null;const Ge=G.pipe((0,mt.U)(wr=>({open:wr})),(0,hn.h)(wr=>{const ci=b();return ci===wr.open||Te&&Te.open!==ci?(Te&&Te.open!==wr.open&&(Te=null),!1):(Te=wr,!0)}),(0,mi.B)()),an=Ge.pipe((0,hn.h)(wr=>wr.open),pc(P)),fr=Ge.pipe((0,hn.h)(wr=>!wr.open),pc(te));return(0,Ve.T)(an,fr).pipe((0,hn.h)(wr=>wr===Te&&(Te=null,wr.open!==b())),(0,mt.U)(wr=>wr.open))}}(an,fr,G)).subscribe(oi=>oi?Te():Ge());return()=>ci.unsubscribe()}let Lf=(()=>{class P{constructor(b){this._ngbConfig=b,this.autoClose=!0,this.placement="auto",this.triggers="click",this.disablePopover=!1,this.openDelay=0,this.closeDelay=0}get animation(){return void 0===this._animation?this._ngbConfig.animation:this._animation}set animation(b){this._animation=b}}return P.\u0275fac=function(b){return new(b||P)(r.LFG(Bl))},P.\u0275prov=r.Yz7({token:P,factory:P.\u0275fac,providedIn:"root"}),P})(),Vp=0,r_=(()=>{class P{isTitleTemplate(){return this.title instanceof r.Rgc}}return P.\u0275fac=function(b){return new(b||P)},P.\u0275cmp=r.Xpm({type:P,selectors:[["ngb-popover-window"]],hostAttrs:["role","tooltip"],hostVars:5,hostBindings:function(b,G){2&b&&(r.Ikx("id",G.id),r.Tol("popover"+(G.popoverClass?" "+G.popoverClass:"")),r.ekj("fade",G.animation))},inputs:{animation:"animation",title:"title",id:"id",popoverClass:"popoverClass",context:"context"},ngContentSelectors:Ku,decls:4,vars:1,consts:[["data-popper-arrow","",1,"popover-arrow"],["class","popover-header",4,"ngIf"],[1,"popover-body"],[1,"popover-header"],["simpleTitle",""],[3,"ngTemplateOutlet","ngTemplateOutletContext"]],template:function(b,G){1&b&&(r.F$t(),r._UZ(0,"div",0),r.YNc(1,Dr,4,2,"h3",1),r.TgZ(2,"div",2),r.Hsn(3),r.qZA()),2&b&&(r.xp6(1),r.Q6J("ngIf",G.title))},directives:[a.O5,a.tP],encapsulation:2,changeDetection:0}),P})(),ef=(()=>{class P{constructor(b,G,Te,Ge,an,fr,wr,ci,oi){this._elementRef=b,this._renderer=G,this._ngZone=fr,this._document=wr,this._changeDetector=ci,this.shown=new r.vpe,this.hidden=new r.vpe,this._ngbPopoverWindowId="ngb-popover-"+Vp++,this._windowRef=null,this._positioning=Cu(),this.animation=an.animation,this.autoClose=an.autoClose,this.placement=an.placement,this.triggers=an.triggers,this.container=an.container,this.disablePopover=an.disablePopover,this.popoverClass=an.popoverClass,this.openDelay=an.openDelay,this.closeDelay=an.closeDelay,this._popupService=new Vf(r_,Te,Ge,G,this._ngZone,oi)}_isDisabled(){return!(!this.disablePopover&&(this.ngbPopover||this.popoverTitle))}open(b){if(!this._windowRef&&!this._isDisabled()){const{windowRef:G,transition$:Te}=this._popupService.open(this.ngbPopover,b,this.animation);this._windowRef=G,this._windowRef.instance.animation=this.animation,this._windowRef.instance.title=this.popoverTitle,this._windowRef.instance.context=b,this._windowRef.instance.popoverClass=this.popoverClass,this._windowRef.instance.id=this._ngbPopoverWindowId,this._renderer.setAttribute(this._elementRef.nativeElement,"aria-describedby",this._ngbPopoverWindowId),"body"===this.container&&this._document.querySelector(this.container).appendChild(this._windowRef.location.nativeElement),this._windowRef.changeDetectorRef.detectChanges(),this._windowRef.changeDetectorRef.markForCheck(),this._ngZone.runOutsideAngular(()=>{this._positioning.createPopper({hostElement:this._elementRef.nativeElement,targetElement:this._windowRef.location.nativeElement,placement:this.placement,appendToBody:"body"===this.container,baseClass:"bs-popover",updatePopperOptions:rl([0,8])}),Promise.resolve().then(()=>{this._positioning.update(),this._zoneSubscription=this._ngZone.onStable.subscribe(()=>this._positioning.update())})}),Bn(this._ngZone,this._document,this.autoClose,()=>this.close(),this.hidden,[this._windowRef.location.nativeElement]),Te.subscribe(()=>this.shown.emit())}}close(b=this.animation){this._windowRef&&(this._renderer.removeAttribute(this._elementRef.nativeElement,"aria-describedby"),this._popupService.close(b).subscribe(()=>{var G;this._windowRef=null,this._positioning.destroy(),null===(G=this._zoneSubscription)||void 0===G||G.unsubscribe(),this.hidden.emit(),this._changeDetector.markForCheck()}))}toggle(){this._windowRef?this.close():this.open()}isOpen(){return null!=this._windowRef}ngOnInit(){this._unregisterListenersFn=Jf(this._renderer,this._elementRef.nativeElement,this.triggers,this.isOpen.bind(this),this.open.bind(this),this.close.bind(this),+this.openDelay,+this.closeDelay)}ngOnChanges({ngbPopover:b,popoverTitle:G,disablePopover:Te,popoverClass:Ge}){Ge&&this.isOpen()&&(this._windowRef.instance.popoverClass=Ge.currentValue),(b||G||Te)&&this._isDisabled()&&this.close()}ngOnDestroy(){var b;this.close(!1),null===(b=this._unregisterListenersFn)||void 0===b||b.call(this)}}return P.\u0275fac=function(b){return new(b||P)(r.Y36(r.SBq),r.Y36(r.Qsj),r.Y36(r.zs3),r.Y36(r.s_b),r.Y36(Lf),r.Y36(r.R0b),r.Y36(a.K0),r.Y36(r.sBO),r.Y36(r.z2F))},P.\u0275dir=r.lG2({type:P,selectors:[["","ngbPopover",""]],inputs:{animation:"animation",autoClose:"autoClose",ngbPopover:"ngbPopover",popoverTitle:"popoverTitle",placement:"placement",triggers:"triggers",container:"container",disablePopover:"disablePopover",popoverClass:"popoverClass",openDelay:"openDelay",closeDelay:"closeDelay"},outputs:{shown:"shown",hidden:"hidden"},exportAs:["ngbPopover"],features:[r.TTD]}),P})(),tf=(()=>{class P{}return P.\u0275fac=function(b){return new(b||P)},P.\u0275mod=r.oAB({type:P}),P.\u0275inj=r.cJS({imports:[[a.ez]]}),P})(),Oh=(()=>{class P{constructor(){this.max=100,this.animated=!1,this.striped=!1,this.showValue=!1}}return P.\u0275fac=function(b){return new(b||P)},P.\u0275prov=r.Yz7({token:P,factory:P.\u0275fac,providedIn:"root"}),P})(),Ah=(()=>{class P{constructor(b){this.value=0,this.max=b.max,this.animated=b.animated,this.striped=b.striped,this.textType=b.textType,this.type=b.type,this.showValue=b.showValue,this.height=b.height}set max(b){this._max=!Me(b)||b<=0?100:b}get max(){return this._max}getValue(){return function od(P,te,b=0){return Math.max(Math.min(P,te),b)}(this.value,this.max)}getPercentValue(){return 100*this.getValue()/this.max}}return P.\u0275fac=function(b){return new(b||P)(r.Y36(Oh))},P.\u0275cmp=r.Xpm({type:P,selectors:[["ngb-progressbar"]],hostAttrs:[1,"progress"],hostVars:2,hostBindings:function(b,G){2&b&&r.Udp("height",G.height)},inputs:{max:"max",animated:"animated",striped:"striped",showValue:"showValue",textType:"textType",type:"type",value:"value",height:"height"},ngContentSelectors:Ku,decls:3,vars:11,consts:function(){let te;return te="" + "\ufffd0\ufffd" + "",[["role","progressbar","aria-valuemin","0"],[4,"ngIf"],te]},template:function(b,G){1&b&&(r.F$t(),r.TgZ(0,"div",0),r.YNc(1,kn,3,3,"span",1),r.Hsn(2),r.qZA()),2&b&&(r.DjV("progress-bar",G.type?" bg-"+G.type:"","",G.textType?" text-"+G.textType:"","\n    ",G.animated?" progress-bar-animated":"","",G.striped?" progress-bar-striped":"",""),r.Udp("width",G.getPercentValue(),"%"),r.uIk("aria-valuenow",G.getValue())("aria-valuemax",G.max),r.xp6(1),r.Q6J("ngIf",G.showValue))},directives:[a.O5],pipes:[a.Zx],encapsulation:2,changeDetection:0}),P})(),fd=(()=>{class P{}return P.\u0275fac=function(b){return new(b||P)},P.\u0275mod=r.oAB({type:P}),P.\u0275inj=r.cJS({imports:[[a.ez]]}),P})();class zc{constructor(te,b,G){this.hour=_n(te),this.minute=_n(b),this.second=_n(G)}changeHour(te=1){this.updateHour((isNaN(this.hour)?0:this.hour)+te)}updateHour(te){this.hour=Me(te)?(te<0?24+te:te)%24:NaN}changeMinute(te=1){this.updateMinute((isNaN(this.minute)?0:this.minute)+te)}updateMinute(te){Me(te)?(this.minute=te%60<0?60+te%60:te%60,this.changeHour(Math.floor(te/60))):this.minute=NaN}changeSecond(te=1){this.updateSecond((isNaN(this.second)?0:this.second)+te)}updateSecond(te){Me(te)?(this.second=te<0?60+te%60:te%60,this.changeMinute(Math.floor(te/60))):this.second=NaN}isValid(te=!0){return Me(this.hour)&&Me(this.minute)&&(!te||Me(this.second))}toString(){return`${this.hour||0}:${this.minute||0}:${this.second||0}`}}let Qf=(()=>{class P{constructor(){this.meridian=!1,this.spinners=!0,this.seconds=!1,this.hourStep=1,this.minuteStep=1,this.secondStep=1,this.disabled=!1,this.readonlyInputs=!1,this.size="medium"}}return P.\u0275fac=function(b){return new(b||P)},P.\u0275prov=r.Yz7({token:P,factory:P.\u0275fac,providedIn:"root"}),P})(),Op=(()=>{class P{}return P.\u0275fac=function(b){return new(b||P)},P.\u0275prov=r.Yz7({token:P,factory:function(){return function fp(){return new Dd}()},providedIn:"root"}),P})(),Dd=(()=>{class P extends Op{fromModel(b){return b&&_e(b.hour)&&_e(b.minute)?{hour:b.hour,minute:b.minute,second:_e(b.second)?b.second:null}:null}toModel(b){return b&&_e(b.hour)&&_e(b.minute)?{hour:b.hour,minute:b.minute,second:_e(b.second)?b.second:null}:null}}return P.\u0275fac=function(){let te;return function(G){return(te||(te=r.n5z(P)))(G||P)}}(),P.\u0275prov=r.Yz7({token:P,factory:P.\u0275fac}),P})(),Kf=(()=>{class P{}return P.\u0275fac=function(b){return new(b||P)},P.\u0275prov=r.Yz7({token:P,factory:function(b){let G=null;return G=b?new b:function Zp(P){return new i_(P)}(r.LFG(r.soG)),G},providedIn:"root"}),P})(),i_=(()=>{class P extends Kf{constructor(b){super(),this._periods=(0,a.ol)(b,a.x.Standalone,a.Tn.Narrow)}getMorningPeriod(){return this._periods[0]}getAfternoonPeriod(){return this._periods[1]}}return P.\u0275fac=function(b){return new(b||P)(r.LFG(r.soG))},P.\u0275prov=r.Yz7({token:P,factory:P.\u0275fac}),P})();const o_=/[^0-9]/g;let Ap=(()=>{class P{constructor(b,G,Te,Ge){this._config=b,this._ngbTimeAdapter=G,this._cd=Te,this.i18n=Ge,this.onChange=an=>{},this.onTouched=()=>{},this.meridian=b.meridian,this.spinners=b.spinners,this.seconds=b.seconds,this.hourStep=b.hourStep,this.minuteStep=b.minuteStep,this.secondStep=b.secondStep,this.disabled=b.disabled,this.readonlyInputs=b.readonlyInputs,this.size=b.size}set hourStep(b){this._hourStep=_e(b)?b:this._config.hourStep}get hourStep(){return this._hourStep}set minuteStep(b){this._minuteStep=_e(b)?b:this._config.minuteStep}get minuteStep(){return this._minuteStep}set secondStep(b){this._secondStep=_e(b)?b:this._config.secondStep}get secondStep(){return this._secondStep}writeValue(b){const G=this._ngbTimeAdapter.fromModel(b);this.model=G?new zc(G.hour,G.minute,G.second):new zc,!this.seconds&&(!G||!Me(G.second))&&(this.model.second=0),this._cd.markForCheck()}registerOnChange(b){this.onChange=b}registerOnTouched(b){this.onTouched=b}setDisabledState(b){this.disabled=b}changeHour(b){this.model.changeHour(b),this.propagateModelChange()}changeMinute(b){this.model.changeMinute(b),this.propagateModelChange()}changeSecond(b){this.model.changeSecond(b),this.propagateModelChange()}updateHour(b){const G=this.model.hour>=12,Te=_n(b);this.model.updateHour(this.meridian&&(G&&Te<12||!G&&12===Te)?Te+12:Te),this.propagateModelChange()}updateMinute(b){this.model.updateMinute(_n(b)),this.propagateModelChange()}updateSecond(b){this.model.updateSecond(_n(b)),this.propagateModelChange()}toggleMeridian(){this.meridian&&this.changeHour(12)}formatInput(b){b.value=b.value.replace(o_,"")}formatHour(b){return Me(b)?Qt(this.meridian?b%12==0?12:b%12:b%24):Qt(NaN)}formatMinSec(b){return Qt(Me(b)?b:NaN)}handleBlur(){this.onTouched()}get isSmallSize(){return"small"===this.size}get isLargeSize(){return"large"===this.size}ngOnChanges(b){b.seconds&&!this.seconds&&this.model&&!Me(this.model.second)&&(this.model.second=0,this.propagateModelChange(!1))}propagateModelChange(b=!0){b&&this.onTouched(),this.model.isValid(this.seconds)?this.onChange(this._ngbTimeAdapter.toModel({hour:this.model.hour,minute:this.model.minute,second:this.model.second})):this.onChange(this._ngbTimeAdapter.toModel(null))}}return P.\u0275fac=function(b){return new(b||P)(r.Y36(Qf),r.Y36(Op),r.Y36(r.sBO),r.Y36(Kf))},P.\u0275cmp=r.Xpm({type:P,selectors:[["ngb-timepicker"]],inputs:{meridian:"meridian",spinners:"spinners",seconds:"seconds",hourStep:"hourStep",minuteStep:"minuteStep",secondStep:"secondStep",readonlyInputs:"readonlyInputs",size:"size"},features:[r._Bn([{provide:ur.JU,useExisting:(0,r.Gpc)(()=>P),multi:!0}]),r.TTD],decls:16,vars:25,consts:function(){let te,b,G,Te,Ge,an,fr,wr,ci,oi,ts,Do,Ss,Yo;return te="HH",b="Hours",G="MM",Te="Minutes",Ge="Increment hours",an="Decrement hours",fr="Increment minutes",wr="Decrement minutes",ci="SS",oi="Seconds",ts="Increment seconds",Do="Decrement seconds",Ss="" + "\ufffd0\ufffd" + "",Yo="" + "\ufffd0\ufffd" + "",[[3,"disabled"],[1,"ngb-tp"],[1,"ngb-tp-input-container","ngb-tp-hour"],["tabindex","-1","type","button","class","btn btn-link",3,"btn-sm","btn-lg","disabled","click",4,"ngIf"],["type","text","maxlength","2","inputmode","numeric","placeholder",te,"aria-label",b,1,"ngb-tp-input","form-control",3,"value","readOnly","disabled","change","blur","input","keydown.ArrowUp","keydown.ArrowDown"],[1,"ngb-tp-spacer"],[1,"ngb-tp-input-container","ngb-tp-minute"],["type","text","maxlength","2","inputmode","numeric","placeholder",G,"aria-label",Te,1,"ngb-tp-input","form-control",3,"value","readOnly","disabled","change","blur","input","keydown.ArrowUp","keydown.ArrowDown"],["class","ngb-tp-spacer",4,"ngIf"],["class","ngb-tp-input-container ngb-tp-second",4,"ngIf"],["class","ngb-tp-meridian",4,"ngIf"],["tabindex","-1","type","button",1,"btn","btn-link",3,"disabled","click"],[1,"chevron","ngb-tp-chevron"],[1,"visually-hidden"],Ge,[1,"chevron","ngb-tp-chevron","bottom"],an,fr,wr,[1,"ngb-tp-input-container","ngb-tp-second"],["type","text","maxlength","2","inputmode","numeric","placeholder",ci,"aria-label",oi,1,"ngb-tp-input","form-control",3,"value","readOnly","disabled","change","blur","input","keydown.ArrowUp","keydown.ArrowDown"],ts,Do,[1,"ngb-tp-meridian"],["type","button",1,"btn","btn-outline-primary",3,"disabled","click"],[4,"ngIf","ngIfElse"],["am",""],Ss,Yo]},template:function(b,G){1&b&&(r.TgZ(0,"fieldset",0)(1,"div",1)(2,"div",2),r.YNc(3,$s,4,7,"button",3),r.TgZ(4,"input",4),r.NdJ("change",function(Ge){return G.updateHour(Ge.target.value)})("blur",function(){return G.handleBlur()})("input",function(Ge){return G.formatInput(Ge.target)})("keydown.ArrowUp",function(Ge){return G.changeHour(G.hourStep),Ge.preventDefault()})("keydown.ArrowDown",function(Ge){return G.changeHour(-G.hourStep),Ge.preventDefault()}),r.qZA(),r.YNc(5,Es,4,7,"button",3),r.qZA(),r.TgZ(6,"div",5),r._uU(7,":"),r.qZA(),r.TgZ(8,"div",6),r.YNc(9,pl,4,7,"button",3),r.TgZ(10,"input",7),r.NdJ("change",function(Ge){return G.updateMinute(Ge.target.value)})("blur",function(){return G.handleBlur()})("input",function(Ge){return G.formatInput(Ge.target)})("keydown.ArrowUp",function(Ge){return G.changeMinute(G.minuteStep),Ge.preventDefault()})("keydown.ArrowDown",function(Ge){return G.changeMinute(-G.minuteStep),Ge.preventDefault()}),r.qZA(),r.YNc(11,Ks,4,7,"button",3),r.qZA(),r.YNc(12,Wc,2,0,"div",8),r.YNc(13,Eu,4,9,"div",9),r.YNc(14,Gd,1,0,"div",8),r.YNc(15,Uc,5,9,"div",10),r.qZA()()),2&b&&(r.ekj("disabled",G.disabled),r.Q6J("disabled",G.disabled),r.xp6(3),r.Q6J("ngIf",G.spinners),r.xp6(1),r.ekj("form-control-sm",G.isSmallSize)("form-control-lg",G.isLargeSize),r.Q6J("value",G.formatHour(null==G.model?null:G.model.hour))("readOnly",G.readonlyInputs)("disabled",G.disabled),r.xp6(1),r.Q6J("ngIf",G.spinners),r.xp6(4),r.Q6J("ngIf",G.spinners),r.xp6(1),r.ekj("form-control-sm",G.isSmallSize)("form-control-lg",G.isLargeSize),r.Q6J("value",G.formatMinSec(null==G.model?null:G.model.minute))("readOnly",G.readonlyInputs)("disabled",G.disabled),r.xp6(1),r.Q6J("ngIf",G.spinners),r.xp6(1),r.Q6J("ngIf",G.seconds),r.xp6(1),r.Q6J("ngIf",G.seconds),r.xp6(1),r.Q6J("ngIf",G.meridian),r.xp6(1),r.Q6J("ngIf",G.meridian))},directives:[a.O5],styles:['ngb-timepicker{font-size:1rem}.ngb-tp{display:flex;align-items:center}.ngb-tp-input-container{width:4em}.ngb-tp-chevron:before{border-style:solid;border-width:.29em .29em 0 0;content:"";display:inline-block;height:.69em;left:.05em;position:relative;top:.15em;transform:rotate(-45deg);vertical-align:middle;width:.69em}.ngb-tp-chevron.bottom:before{top:-.3em;transform:rotate(135deg)}.ngb-tp-input{text-align:center}.ngb-tp-hour,.ngb-tp-minute,.ngb-tp-second,.ngb-tp-meridian{display:flex;flex-direction:column;align-items:center;justify-content:space-around}.ngb-tp-spacer{width:1em;text-align:center}\n'],encapsulation:2}),P})(),Wp=(()=>{class P{}return P.\u0275fac=function(b){return new(b||P)},P.\u0275mod=r.oAB({type:P}),P.\u0275inj=r.cJS({imports:[[a.ez]]}),P})(),s_=(()=>{class P{constructor(b){this._ngbConfig=b,this.autoClose=!0,this.placement="auto",this.triggers="hover focus",this.disableTooltip=!1,this.openDelay=0,this.closeDelay=0}get animation(){return void 0===this._animation?this._ngbConfig.animation:this._animation}set animation(b){this._animation=b}}return P.\u0275fac=function(b){return new(b||P)(r.LFG(Bl))},P.\u0275prov=r.Yz7({token:P,factory:P.\u0275fac,providedIn:"root"}),P})(),rg=0,Qp=(()=>{class P{}return P.\u0275fac=function(b){return new(b||P)},P.\u0275cmp=r.Xpm({type:P,selectors:[["ngb-tooltip-window"]],hostAttrs:["role","tooltip"],hostVars:5,hostBindings:function(b,G){2&b&&(r.Ikx("id",G.id),r.Tol("tooltip"+(G.tooltipClass?" "+G.tooltipClass:"")),r.ekj("fade",G.animation))},inputs:{animation:"animation",id:"id",tooltipClass:"tooltipClass"},ngContentSelectors:Ku,decls:3,vars:0,consts:[["data-popper-arrow","",1,"tooltip-arrow"],[1,"tooltip-inner"]],template:function(b,G){1&b&&(r.F$t(),r._UZ(0,"div",0),r.TgZ(1,"div",1),r.Hsn(2),r.qZA())},encapsulation:2,changeDetection:0}),P})(),C_=(()=>{class P{constructor(b,G,Te,Ge,an,fr,wr,ci,oi){this._elementRef=b,this._renderer=G,this._ngZone=fr,this._document=wr,this._changeDetector=ci,this.shown=new r.vpe,this.hidden=new r.vpe,this._ngbTooltipWindowId="ngb-tooltip-"+rg++,this._windowRef=null,this._positioning=Cu(),this.animation=an.animation,this.autoClose=an.autoClose,this.placement=an.placement,this.triggers=an.triggers,this.container=an.container,this.disableTooltip=an.disableTooltip,this.tooltipClass=an.tooltipClass,this.openDelay=an.openDelay,this.closeDelay=an.closeDelay,this._popupService=new Vf(Qp,Te,Ge,G,this._ngZone,oi)}set ngbTooltip(b){this._ngbTooltip=b,!b&&this._windowRef&&this.close()}get ngbTooltip(){return this._ngbTooltip}open(b){if(!this._windowRef&&this._ngbTooltip&&!this.disableTooltip){const{windowRef:G,transition$:Te}=this._popupService.open(this._ngbTooltip,b,this.animation);this._windowRef=G,this._windowRef.instance.animation=this.animation,this._windowRef.instance.tooltipClass=this.tooltipClass,this._windowRef.instance.id=this._ngbTooltipWindowId,this._renderer.setAttribute(this._elementRef.nativeElement,"aria-describedby",this._ngbTooltipWindowId),"body"===this.container&&this._document.querySelector(this.container).appendChild(this._windowRef.location.nativeElement),this._windowRef.changeDetectorRef.detectChanges(),this._windowRef.changeDetectorRef.markForCheck(),this._ngZone.runOutsideAngular(()=>{this._positioning.createPopper({hostElement:this._elementRef.nativeElement,targetElement:this._windowRef.location.nativeElement,placement:this.placement,appendToBody:"body"===this.container,baseClass:"bs-tooltip"}),Promise.resolve().then(()=>{this._positioning.update(),this._zoneSubscription=this._ngZone.onStable.subscribe(()=>this._positioning.update())})}),Bn(this._ngZone,this._document,this.autoClose,()=>this.close(),this.hidden,[this._windowRef.location.nativeElement]),Te.subscribe(()=>this.shown.emit())}}close(b=this.animation){null!=this._windowRef&&(this._renderer.removeAttribute(this._elementRef.nativeElement,"aria-describedby"),this._popupService.close(b).subscribe(()=>{var G;this._windowRef=null,this._positioning.destroy(),null===(G=this._zoneSubscription)||void 0===G||G.unsubscribe(),this.hidden.emit(),this._changeDetector.markForCheck()}))}toggle(){this._windowRef?this.close():this.open()}isOpen(){return null!=this._windowRef}ngOnInit(){this._unregisterListenersFn=Jf(this._renderer,this._elementRef.nativeElement,this.triggers,this.isOpen.bind(this),this.open.bind(this),this.close.bind(this),+this.openDelay,+this.closeDelay)}ngOnChanges({tooltipClass:b}){b&&this.isOpen()&&(this._windowRef.instance.tooltipClass=b.currentValue)}ngOnDestroy(){var b;this.close(!1),null===(b=this._unregisterListenersFn)||void 0===b||b.call(this)}}return P.\u0275fac=function(b){return new(b||P)(r.Y36(r.SBq),r.Y36(r.Qsj),r.Y36(r.zs3),r.Y36(r.s_b),r.Y36(s_),r.Y36(r.R0b),r.Y36(a.K0),r.Y36(r.sBO),r.Y36(r.z2F))},P.\u0275dir=r.lG2({type:P,selectors:[["","ngbTooltip",""]],inputs:{animation:"animation",autoClose:"autoClose",placement:"placement",triggers:"triggers",container:"container",disableTooltip:"disableTooltip",tooltipClass:"tooltipClass",openDelay:"openDelay",closeDelay:"closeDelay",ngbTooltip:"ngbTooltip"},outputs:{shown:"shown",hidden:"hidden"},exportAs:["ngbTooltip"],features:[r.TTD]}),P})(),ep=(()=>{class P{}return P.\u0275fac=function(b){return new(b||P)},P.\u0275mod=r.oAB({type:P}),P.\u0275inj=r.cJS({}),P})(),xh=(()=>{class P{constructor(){this.highlightClass="ngb-highlight",this.accentSensitive=!0}ngOnChanges(b){!this.accentSensitive&&!String.prototype.normalize&&(console.warn("The `accentSensitive` input in `ngb-highlight` cannot be set to `false` in a browser that does not implement the `String.normalize` function. You will have to include a polyfill in your application to use this feature in the current browser."),this.accentSensitive=!0);const G=pa(this.result),Te=Array.isArray(this.term)?this.term:[this.term],Ge=ci=>this.accentSensitive?ci:_s(ci),an=Te.map(ci=>function Ln(P){return P.replace(/[-[\]{}()*+?.,\\^$|#\s]/g,"\\$&")}(Ge(pa(ci)))).filter(ci=>ci),fr=this.accentSensitive?G:_s(G),wr=an.length?fr.split(new RegExp(`(${an.join("|")})`,"gmi")):[G];if(this.accentSensitive)this.parts=wr;else{let ci=0;this.parts=wr.map(oi=>G.substring(ci,ci+=oi.length))}}}return P.\u0275fac=function(b){return new(b||P)},P.\u0275cmp=r.Xpm({type:P,selectors:[["ngb-highlight"]],inputs:{highlightClass:"highlightClass",result:"result",term:"term",accentSensitive:"accentSensitive"},features:[r.TTD],decls:1,vars:1,consts:[["ngFor","",3,"ngForOf"],[3,"class",4,"ngIf","ngIfElse"],["even",""]],template:function(b,G){1&b&&r.YNc(0,Sa,3,2,"ng-template",0),2&b&&r.Q6J("ngForOf",G.parts)},directives:[a.sg,a.O5],styles:[".ngb-highlight{font-weight:700}\n"],encapsulation:2,changeDetection:0}),P})(),M_=(()=>{class P{constructor(){this.activeIdx=0,this.focusFirst=!0,this.formatter=pa,this.selectEvent=new r.vpe,this.activeChangeEvent=new r.vpe}hasActive(){return this.activeIdx>-1&&this.activeIdx<this.results.length}getActive(){return this.results[this.activeIdx]}markActive(b){this.activeIdx=b,this._activeChanged()}next(){this.activeIdx===this.results.length-1?this.activeIdx=this.focusFirst?(this.activeIdx+1)%this.results.length:-1:this.activeIdx++,this._activeChanged()}prev(){this.activeIdx<0?this.activeIdx=this.results.length-1:0===this.activeIdx?this.activeIdx=this.focusFirst?this.results.length-1:-1:this.activeIdx--,this._activeChanged()}resetActive(){this.activeIdx=this.focusFirst?0:-1,this._activeChanged()}select(b){this.selectEvent.emit(b)}ngOnInit(){this.resetActive()}_activeChanged(){this.activeChangeEvent.emit(this.activeIdx>=0?this.id+"-"+this.activeIdx:void 0)}}return P.\u0275fac=function(b){return new(b||P)},P.\u0275cmp=r.Xpm({type:P,selectors:[["ngb-typeahead-window"]],hostAttrs:["role","listbox"],hostVars:3,hostBindings:function(b,G){1&b&&r.NdJ("mousedown",function(Ge){return Ge.preventDefault()}),2&b&&(r.Ikx("id",G.id),r.Tol("dropdown-menu show"+(G.popupClass?" "+G.popupClass:"")))},inputs:{id:"id",focusFirst:"focusFirst",results:"results",term:"term",formatter:"formatter",resultTemplate:"resultTemplate",popupClass:"popupClass"},outputs:{selectEvent:"select",activeChangeEvent:"activeChange"},exportAs:["ngbTypeaheadWindow"],decls:3,vars:1,consts:[["rt",""],["ngFor","",3,"ngForOf"],[3,"result","term"],["type","button","role","option",1,"dropdown-item",3,"id","mouseenter","click"],[3,"ngTemplateOutlet","ngTemplateOutletContext"]],template:function(b,G){1&b&&(r.YNc(0,Sl,1,2,"ng-template",null,0,r.W1O),r.YNc(2,gc,2,9,"ng-template",1)),2&b&&(r.xp6(2),r.Q6J("ngForOf",G.results))},directives:[xh,a.sg,a.tP],encapsulation:2}),P})(),Sf=(()=>{class P{constructor(){this.editable=!0,this.focusFirst=!0,this.showHint=!1,this.placement=["bottom-start","bottom-end","top-start","top-end"]}}return P.\u0275fac=function(b){return new(b||P)},P.\u0275prov=r.Yz7({token:P,factory:P.\u0275fac,providedIn:"root"}),P})();const a_=new r.OlP("live announcer delay",{providedIn:"root",factory:function tp(){return 100}});function Kp(P,te=!1){let b=P.body.querySelector("#ngb-live");return null==b&&te&&(b=P.createElement("div"),b.setAttribute("id","ngb-live"),b.setAttribute("aria-live","polite"),b.setAttribute("aria-atomic","true"),b.classList.add("visually-hidden"),P.body.appendChild(b)),b}let l_=(()=>{class P{constructor(b,G){this._document=b,this._delay=G}ngOnDestroy(){const b=Kp(this._document);b&&b.parentElement.removeChild(b)}say(b){const G=Kp(this._document,!0),Te=this._delay;if(null!=G){G.textContent="";const Ge=()=>G.textContent=b;null===Te?Ge():setTimeout(Ge,Te)}}}return P.\u0275fac=function(b){return new(b||P)(r.LFG(a.K0),r.LFG(a_))},P.\u0275prov=r.Yz7({token:P,factory:P.\u0275fac,providedIn:"root"}),P})(),Ff=0,Rh=(()=>{class P{constructor(b,G,Te,Ge,an,fr,wr,ci,oi,ts,Do){this._elementRef=b,this._renderer=Te,this._live=wr,this._document=ci,this._ngZone=oi,this._changeDetector=ts,this._subscription=null,this._closed$=new he.xQ,this._inputValueBackup=null,this._windowRef=null,this._positioning=Cu(),this.autocomplete="off",this.placement="bottom-start",this.selectItem=new r.vpe,this.activeDescendant=null,this.popupId="ngb-typeahead-"+Ff++,this._onTouched=()=>{},this._onChange=Ss=>{},this.container=an.container,this.editable=an.editable,this.focusFirst=an.focusFirst,this.showHint=an.showHint,this.placement=an.placement,this._valueChanges=(0,be.R)(b.nativeElement,"input").pipe((0,mt.U)(Ss=>Ss.target.value)),this._resubscribeTypeahead=new ue.X(null),this._popupService=new Vf(M_,Ge,G,Te,this._ngZone,Do)}ngOnInit(){this._subscribeToUserInput()}ngOnChanges({ngbTypeahead:b}){b&&!b.firstChange&&(this._unsubscribeFromUserInput(),this._subscribeToUserInput())}ngOnDestroy(){this._closePopup(),this._unsubscribeFromUserInput()}registerOnChange(b){this._onChange=b}registerOnTouched(b){this._onTouched=b}writeValue(b){this._writeInputValue(this._formatItemForInput(b)),this.showHint&&(this._inputValueBackup=b)}setDisabledState(b){this._renderer.setProperty(this._elementRef.nativeElement,"disabled",b)}dismissPopup(){this.isPopupOpen()&&(this._resubscribeTypeahead.next(null),this._closePopup(),this.showHint&&null!==this._inputValueBackup&&this._writeInputValue(this._inputValueBackup),this._changeDetector.markForCheck())}isPopupOpen(){return null!=this._windowRef}handleBlur(){this._resubscribeTypeahead.next(null),this._onTouched()}handleKeyDown(b){if(this.isPopupOpen())switch(b.which){case le.ArrowDown:b.preventDefault(),this._windowRef.instance.next(),this._showHint();break;case le.ArrowUp:b.preventDefault(),this._windowRef.instance.prev(),this._showHint();break;case le.Enter:case le.Tab:{const G=this._windowRef.instance.getActive();at(G)&&(b.preventDefault(),b.stopPropagation(),this._selectResult(G)),this._closePopup();break}}}_openPopup(){if(!this.isPopupOpen()){this._inputValueBackup=this._elementRef.nativeElement.value;const{windowRef:b}=this._popupService.open();this._windowRef=b,this._windowRef.instance.id=this.popupId,this._windowRef.instance.selectEvent.subscribe(G=>this._selectResultClosePopup(G)),this._windowRef.instance.activeChangeEvent.subscribe(G=>this.activeDescendant=G),this._windowRef.instance.popupClass=this.popupClass,"body"===this.container&&(this._renderer.setStyle(this._windowRef.location.nativeElement,"z-index","1055"),this._document.querySelector(this.container).appendChild(this._windowRef.location.nativeElement)),this._changeDetector.markForCheck(),this._ngZone.runOutsideAngular(()=>{this._windowRef&&(this._positioning.createPopper({hostElement:this._elementRef.nativeElement,targetElement:this._windowRef.location.nativeElement,placement:this.placement,appendToBody:"body"===this.container,updatePopperOptions:rl([0,2])}),this._zoneSubscription=this._ngZone.onStable.subscribe(()=>this._positioning.update()))}),Bn(this._ngZone,this._document,"outside",()=>this.dismissPopup(),this._closed$,[this._elementRef.nativeElement,this._windowRef.location.nativeElement])}}_closePopup(){this._popupService.close().subscribe(()=>{var b;this._positioning.destroy(),null===(b=this._zoneSubscription)||void 0===b||b.unsubscribe(),this._closed$.next(),this._windowRef=null,this.activeDescendant=null})}_selectResult(b){let G=!1;this.selectItem.emit({item:b,preventDefault:()=>{G=!0}}),this._resubscribeTypeahead.next(null),G||(this.writeValue(b),this._onChange(b))}_selectResultClosePopup(b){this._selectResult(b),this._closePopup()}_showHint(){var b;if(this.showHint&&(null===(b=this._windowRef)||void 0===b?void 0:b.instance.hasActive())&&null!=this._inputValueBackup){const G=this._inputValueBackup.toLowerCase(),Te=this._formatItemForInput(this._windowRef.instance.getActive());G===Te.substr(0,this._inputValueBackup.length).toLowerCase()?(this._writeInputValue(this._inputValueBackup+Te.substr(this._inputValueBackup.length)),this._elementRef.nativeElement.setSelectionRange.apply(this._elementRef.nativeElement,[this._inputValueBackup.length,Te.length])):this._writeInputValue(Te)}}_formatItemForInput(b){return null!=b&&this.inputFormatter?this.inputFormatter(b):pa(b)}_writeInputValue(b){this._renderer.setProperty(this._elementRef.nativeElement,"value",pa(b))}_subscribeToUserInput(){const b=this._valueChanges.pipe((0,Fn.b)(G=>{this._inputValueBackup=this.showHint?G:null,this._onChange(this.editable?G:void 0)}),this.ngbTypeahead?this.ngbTypeahead:()=>(0,ae.of)([]));this._subscription=this._resubscribeTypeahead.pipe((0,Yt.w)(()=>b)).subscribe(G=>{G&&0!==G.length?(this._openPopup(),this._windowRef.instance.focusFirst=this.focusFirst,this._windowRef.instance.results=G,this._windowRef.instance.term=this._elementRef.nativeElement.value,this.resultFormatter&&(this._windowRef.instance.formatter=this.resultFormatter),this.resultTemplate&&(this._windowRef.instance.resultTemplate=this.resultTemplate),this._windowRef.instance.resetActive(),this._windowRef.changeDetectorRef.detectChanges(),this._showHint()):this._closePopup();const Te=G?G.length:0;this._live.say(0===Te?"No results available":`${Te} result${1===Te?"":"s"} available`)})}_unsubscribeFromUserInput(){this._subscription&&this._subscription.unsubscribe(),this._subscription=null}}return P.\u0275fac=function(b){return new(b||P)(r.Y36(r.SBq),r.Y36(r.s_b),r.Y36(r.Qsj),r.Y36(r.zs3),r.Y36(Sf),r.Y36(r.R0b),r.Y36(l_),r.Y36(a.K0),r.Y36(r.R0b),r.Y36(r.sBO),r.Y36(r.z2F))},P.\u0275dir=r.lG2({type:P,selectors:[["input","ngbTypeahead",""]],hostAttrs:["autocapitalize","off","autocorrect","off","role","combobox","aria-multiline","false"],hostVars:7,hostBindings:function(b,G){1&b&&r.NdJ("blur",function(){return G.handleBlur()})("keydown",function(Ge){return G.handleKeyDown(Ge)}),2&b&&(r.Ikx("autocomplete",G.autocomplete),r.uIk("aria-autocomplete",G.showHint?"both":"list")("aria-activedescendant",G.activeDescendant)("aria-owns",G.isPopupOpen()?G.popupId:null)("aria-expanded",G.isPopupOpen()),r.ekj("open",G.isPopupOpen()))},inputs:{autocomplete:"autocomplete",container:"container",editable:"editable",focusFirst:"focusFirst",inputFormatter:"inputFormatter",ngbTypeahead:"ngbTypeahead",resultFormatter:"resultFormatter",resultTemplate:"resultTemplate",showHint:"showHint",placement:"placement",popupClass:"popupClass"},outputs:{selectItem:"selectItem"},exportAs:["ngbTypeahead"],features:[r._Bn([{provide:ur.JU,useExisting:(0,r.Gpc)(()=>P),multi:!0}]),r.TTD]}),P})(),np=(()=>{class P{}return P.\u0275fac=function(b){return new(b||P)},P.\u0275mod=r.oAB({type:P}),P.\u0275inj=r.cJS({imports:[[a.ez]]}),P})()},78160:(m,S,i)=>{"use strict";i.d(S,{Z:()=>ie});var f=i(66224);const e=function c(U,se){for(var ge=U.length;ge--;)if((0,f.Z)(U[ge][0],se))return ge;return-1};var y=Array.prototype.splice;function ce(U){var se=-1,ge=null==U?0:U.length;for(this.clear();++se<ge;){var ae=U[se];this.set(ae[0],ae[1])}}ce.prototype.clear=function r(){this.__data__=[],this.size=0},ce.prototype.delete=function T(U){var se=this.__data__,ge=e(se,U);return!(ge<0||(ge==se.length-1?se.pop():y.call(se,ge,1),--this.size,0))},ce.prototype.get=function R(U){var se=this.__data__,ge=e(se,U);return ge<0?void 0:se[ge][1]},ce.prototype.has=function z(U){return e(this.__data__,U)>-1},ce.prototype.set=function J(U,se){var ge=this.__data__,ae=e(ge,U);return ae<0?(++this.size,ge.push([U,se])):ge[ae][1]=se,this};const ie=ce},54673:(m,S,i)=>{"use strict";i.d(S,{Z:()=>c});var r=i(10259),a=i(40309);const c=(0,r.Z)(a.Z,"Map")},94013:(m,S,i)=>{"use strict";i.d(S,{Z:()=>vn});const f=(0,i(10259).Z)(Object,"create");var R=Object.prototype.hasOwnProperty;var J=Object.prototype.hasOwnProperty;function ge(mt){var Nt=-1,St=null==mt?0:mt.length;for(this.clear();++Nt<St;){var Yt=mt[Nt];this.set(Yt[0],Yt[1])}}ge.prototype.clear=function c(){this.__data__=f?f(null):{},this.size=0},ge.prototype.delete=function p(mt){var Nt=this.has(mt)&&delete this.__data__[mt];return this.size-=Nt?1:0,Nt},ge.prototype.get=function L(mt){var Nt=this.__data__;if(f){var St=Nt[mt];return"__lodash_hash_undefined__"===St?void 0:St}return R.call(Nt,mt)?Nt[mt]:void 0},ge.prototype.has=function ee(mt){var Nt=this.__data__;return f?void 0!==Nt[mt]:J.call(Nt,mt)},ge.prototype.set=function U(mt,Nt){var St=this.__data__;return this.size+=this.has(mt)?0:1,St[mt]=f&&void 0===Nt?"__lodash_hash_undefined__":Nt,this};const ae=ge;var he=i(78160),be=i(54673);const Be=function Ve(mt,Nt){var St=mt.__data__;return function st(mt){var Nt=typeof mt;return"string"==Nt||"number"==Nt||"symbol"==Nt||"boolean"==Nt?"__proto__"!==mt:null===mt}(Nt)?St["string"==typeof Nt?"string":"hash"]:St.map};function hn(mt){var Nt=-1,St=null==mt?0:mt.length;for(this.clear();++Nt<St;){var Yt=mt[Nt];this.set(Yt[0],Yt[1])}}hn.prototype.clear=function we(){this.size=0,this.__data__={hash:new ae,map:new(be.Z||he.Z),string:new ae}},hn.prototype.delete=function xe(mt){var Nt=Be(this,mt).delete(mt);return this.size-=Nt?1:0,Nt},hn.prototype.get=function Ne(mt){return Be(this,mt).get(mt)},hn.prototype.has=function rt(mt){return Be(this,mt).has(mt)},hn.prototype.set=function Pt(mt,Nt){var St=Be(this,mt),Yt=St.size;return St.set(mt,Nt),this.size+=St.size==Yt?0:1,this};const vn=hn},15131:(m,S,i)=>{"use strict";i.d(S,{Z:()=>ce});var r=i(78160);var R=i(54673),L=i(94013);function ee(ie){var U=this.__data__=new r.Z(ie);this.size=U.size}ee.prototype.clear=function a(){this.__data__=new r.Z,this.size=0},ee.prototype.delete=function c(ie){var U=this.__data__,se=U.delete(ie);return this.size=U.size,se},ee.prototype.get=function p(ie){return this.__data__.get(ie)},ee.prototype.has=function T(ie){return this.__data__.has(ie)},ee.prototype.set=function W(ie,U){var se=this.__data__;if(se instanceof r.Z){var ge=se.__data__;if(!R.Z||ge.length<199)return ge.push([ie,U]),this.size=++se.size,this;se=this.__data__=new L.Z(ge)}return se.set(ie,U),this.size=se.size,this};const ce=ee},35770:(m,S,i)=>{"use strict";i.d(S,{Z:()=>f});const f=i(40309).Z.Symbol},83345:(m,S,i)=>{"use strict";i.d(S,{Z:()=>f});const f=i(40309).Z.Uint8Array},26438:(m,S,i)=>{"use strict";i.d(S,{Z:()=>L});var f=i(40591),c=i(34654),e=i(25014),p=i(28078),y=i(14803),C=Object.prototype.hasOwnProperty;const L=function R(z,W){var J=(0,c.Z)(z),ee=!J&&(0,f.Z)(z),ce=!J&&!ee&&(0,e.Z)(z),ie=!J&&!ee&&!ce&&(0,y.Z)(z),U=J||ee||ce||ie,se=U?function r(z,W){for(var J=-1,ee=Array(z);++J<z;)ee[J]=W(J);return ee}(z.length,String):[],ge=se.length;for(var ae in z)(W||C.call(z,ae))&&(!U||!("length"==ae||ce&&("offset"==ae||"parent"==ae)||ie&&("buffer"==ae||"byteLength"==ae||"byteOffset"==ae)||(0,p.Z)(ae,ge)))&&se.push(ae);return se}},57052:(m,S,i)=>{"use strict";i.d(S,{Z:()=>a});const a=function r(f,c){for(var e=-1,p=c.length,y=f.length;++e<p;)f[y+e]=c[e];return f}},15427:(m,S,i)=>{"use strict";i.d(S,{Z:()=>p});var r=i(2951),a=i(66224),c=Object.prototype.hasOwnProperty;const p=function e(y,T,C){var R=y[T];(!c.call(y,T)||!(0,a.Z)(R,C)||void 0===C&&!(T in y))&&(0,r.Z)(y,T,C)}},2951:(m,S,i)=>{"use strict";i.d(S,{Z:()=>f});var r=i(99567);const f=function a(c,e,p){"__proto__"==e&&r.Z?(0,r.Z)(c,e,{configurable:!0,enumerable:!0,value:p,writable:!0}):c[e]=p}},65252:(m,S,i)=>{"use strict";i.d(S,{Z:()=>ua});var r=i(15131);var c=i(15427),e=i(57640),p=i(44409);var C=i(34673);var z=i(27672),W=i(36889),J=i(75694);var ie=i(74202);var ge=i(22018),ae=i(23359),he=i(17507),we=Object.prototype.hasOwnProperty;var We=i(80609);var xe=/\w*$/;var Bt=i(35770),rt=Bt.Z?Bt.Z.prototype:void 0,en=rt?rt.valueOf:void 0;var hn=i(1044);const Sr=function Ro(er,vr,yr){var or=er.constructor;switch(vr){case"[object ArrayBuffer]":return(0,We.Z)(er);case"[object Boolean]":case"[object Date]":return new or(+er);case"[object DataView]":return function Ve(er,vr){var yr=vr?(0,We.Z)(er.buffer):er.buffer;return new er.constructor(yr,er.byteOffset,er.byteLength)}(er,yr);case"[object Float32Array]":case"[object Float64Array]":case"[object Int8Array]":case"[object Int16Array]":case"[object Int32Array]":case"[object Uint8Array]":case"[object Uint8ClampedArray]":case"[object Uint16Array]":case"[object Uint32Array]":return(0,hn.Z)(er,yr);case"[object Map]":case"[object Set]":return new or;case"[object Number]":case"[object String]":return new or(er);case"[object RegExp]":return function je(er){var vr=new er.constructor(er.source,xe.exec(er));return vr.lastIndex=er.lastIndex,vr}(er);case"[object Symbol]":return function Pt(er){return en?Object(en.call(er)):{}}(er)}};var Kt=i(42542),un=i(34654),jn=i(25014),Jn=i(6539);var ii=i(21162),hr=i(48514),Ki=hr.Z&&hr.Z.isMap;const Mn=Ki?(0,ii.Z)(Ki):function Xr(er){return(0,Jn.Z)(er)&&"[object Map]"==(0,he.Z)(er)};var Zn=i(4214);var ri=hr.Z&&hr.Z.isSet;const Ui=ri?(0,ii.Z)(ri):function Sn(er){return(0,Jn.Z)(er)&&"[object Set]"==(0,he.Z)(er)};var to="[object Arguments]",ct="[object Function]",mr="[object Object]",go={};go[to]=go["[object Array]"]=go["[object ArrayBuffer]"]=go["[object DataView]"]=go["[object Boolean]"]=go["[object Date]"]=go["[object Float32Array]"]=go["[object Float64Array]"]=go["[object Int8Array]"]=go["[object Int16Array]"]=go["[object Int32Array]"]=go["[object Map]"]=go["[object Number]"]=go[mr]=go["[object RegExp]"]=go["[object Set]"]=go["[object String]"]=go["[object Symbol]"]=go["[object Uint8Array]"]=go["[object Uint8ClampedArray]"]=go["[object Uint16Array]"]=go["[object Uint32Array]"]=!0,go["[object Error]"]=go[ct]=go["[object WeakMap]"]=!1;const ua=function Go(er,vr,yr,or,si,pn){var xn,Gr=1&vr,no=2&vr,mo=4&vr;if(yr&&(xn=si?yr(er,or,si,pn):yr(er)),void 0!==xn)return xn;if(!(0,Zn.Z)(er))return er;var wo=(0,un.Z)(er);if(wo){if(xn=function ue(er){var vr=er.length,yr=new er.constructor(vr);return vr&&"string"==typeof er[0]&&we.call(er,"index")&&(yr.index=er.index,yr.input=er.input),yr}(er),!Gr)return(0,W.Z)(er,xn)}else{var Us=(0,he.Z)(er),cs=Us==ct||"[object GeneratorFunction]"==Us;if((0,jn.Z)(er))return(0,z.Z)(er,Gr);if(Us==mr||Us==to||cs&&!si){if(xn=no||cs?{}:(0,Kt.Z)(er),!Gr)return no?function U(er,vr){return(0,e.Z)(er,(0,ie.Z)(er),vr)}(er,function R(er,vr){return er&&(0,e.Z)(vr,(0,C.Z)(vr),er)}(xn,er)):function ee(er,vr){return(0,e.Z)(er,(0,J.Z)(er),vr)}(er,function y(er,vr){return er&&(0,e.Z)(vr,(0,p.Z)(vr),er)}(xn,er))}else{if(!go[Us])return si?er:{};xn=Sr(er,Us,Gr)}}pn||(pn=new r.Z);var es=pn.get(er);if(es)return es;pn.set(er,xn),Ui(er)?er.forEach(function(fa){xn.add(Go(fa,vr,yr,fa,er,pn))}):Mn(er)&&er.forEach(function(fa,la){xn.set(la,Go(fa,vr,yr,la,er,pn))});var ya=wo?void 0:(mo?no?ae.Z:ge.Z:no?C.Z:p.Z)(er);return function a(er,vr){for(var yr=-1,or=null==er?0:er.length;++yr<or&&!1!==vr(er[yr],yr,er););}(ya||er,function(fa,la){ya&&(fa=er[la=fa]),(0,c.Z)(xn,la,Go(fa,vr,yr,la,er,pn))}),xn}},49137:(m,S,i)=>{"use strict";i.d(S,{Z:()=>c});var r=i(57052),a=i(34654);const c=function f(e,p,y){var T=p(e);return(0,a.Z)(e)?T:(0,r.Z)(T,y(e))}},98286:(m,S,i)=>{"use strict";i.d(S,{Z:()=>ce});var r=i(35770),a=Object.prototype,f=a.hasOwnProperty,c=a.toString,e=r.Z?r.Z.toStringTag:void 0;var C=Object.prototype.toString;var J=r.Z?r.Z.toStringTag:void 0;const ce=function ee(ie){return null==ie?void 0===ie?"[object Undefined]":"[object Null]":J&&J in Object(ie)?function p(ie){var U=f.call(ie,e),se=ie[e];try{ie[e]=void 0;var ge=!0}catch(he){}var ae=c.call(ie);return ge&&(U?ie[e]=se:delete ie[e]),ae}(ie):function R(ie){return C.call(ie)}(ie)}},21162:(m,S,i)=>{"use strict";i.d(S,{Z:()=>a});const a=function r(f){return function(c){return f(c)}}},80609:(m,S,i)=>{"use strict";i.d(S,{Z:()=>f});var r=i(83345);const f=function a(c){var e=new c.constructor(c.byteLength);return new r.Z(e).set(new r.Z(c)),e}},27672:(m,S,i)=>{"use strict";i.d(S,{Z:()=>T});var r=i(40309),a="object"==typeof exports&&exports&&!exports.nodeType&&exports,f=a&&"object"==typeof module&&module&&!module.nodeType&&module,e=f&&f.exports===a?r.Z.Buffer:void 0,p=e?e.allocUnsafe:void 0;const T=function y(C,R){if(R)return C.slice();var L=C.length,z=p?p(L):new C.constructor(L);return C.copy(z),z}},1044:(m,S,i)=>{"use strict";i.d(S,{Z:()=>f});var r=i(80609);const f=function a(c,e){var p=e?(0,r.Z)(c.buffer):c.buffer;return new c.constructor(p,c.byteOffset,c.length)}},36889:(m,S,i)=>{"use strict";i.d(S,{Z:()=>a});const a=function r(f,c){var e=-1,p=f.length;for(c||(c=Array(p));++e<p;)c[e]=f[e];return c}},57640:(m,S,i)=>{"use strict";i.d(S,{Z:()=>c});var r=i(15427),a=i(2951);const c=function f(e,p,y,T){var C=!y;y||(y={});for(var R=-1,L=p.length;++R<L;){var z=p[R],W=T?T(y[z],e[z],z,y,e):void 0;void 0===W&&(W=e[z]),C?(0,a.Z)(y,z,W):(0,r.Z)(y,z,W)}return y}},99567:(m,S,i)=>{"use strict";i.d(S,{Z:()=>f});var r=i(10259);const f=function(){try{var c=(0,r.Z)(Object,"defineProperty");return c({},"",{}),c}catch(e){}}()},7746:(m,S,i)=>{"use strict";i.d(S,{Z:()=>a});const a="object"==typeof global&&global&&global.Object===Object&&global},22018:(m,S,i)=>{"use strict";i.d(S,{Z:()=>e});var r=i(49137),a=i(75694),f=i(44409);const e=function c(p){return(0,r.Z)(p,f.Z,a.Z)}},23359:(m,S,i)=>{"use strict";i.d(S,{Z:()=>e});var r=i(49137),a=i(74202),f=i(34673);const e=function c(p){return(0,r.Z)(p,f.Z,a.Z)}},10259:(m,S,i)=>{"use strict";i.d(S,{Z:()=>he});var be,r=i(58209),f=i(40309).Z["__core-js_shared__"],e=(be=/[^.]+$/.exec(f&&f.keys&&f.keys.IE_PROTO||""))?"Symbol(src)_1."+be:"";var T=i(4214),C=i(22035),L=/^\[object .+?Constructor\]$/,ce=RegExp("^"+Function.prototype.toString.call(Object.prototype.hasOwnProperty).replace(/[\\^$.*+?()[\]{}|]/g,"\\$&").replace(/hasOwnProperty|(function).*?(?=\\\()| for .+?(?=\\\])/g,"$1.*?")+"$");const U=function ie(be){return!(!(0,T.Z)(be)||function p(be){return!!e&&e in be}(be))&&((0,r.Z)(be)?ce:L).test((0,C.Z)(be))},he=function ae(be,we){var ue=function se(be,we){return null==be?void 0:be[we]}(be,we);return U(ue)?ue:void 0}},11595:(m,S,i)=>{"use strict";i.d(S,{Z:()=>f});const f=(0,i(24184).Z)(Object.getPrototypeOf,Object)},75694:(m,S,i)=>{"use strict";i.d(S,{Z:()=>T});var f=i(38387),e=Object.prototype.propertyIsEnumerable,p=Object.getOwnPropertySymbols;const T=p?function(C){return null==C?[]:(C=Object(C),function r(C,R){for(var L=-1,z=null==C?0:C.length,W=0,J=[];++L<z;){var ee=C[L];R(ee,L,C)&&(J[W++]=ee)}return J}(p(C),function(R){return e.call(C,R)}))}:f.Z},74202:(m,S,i)=>{"use strict";i.d(S,{Z:()=>y});var r=i(57052),a=i(11595),f=i(75694),c=i(38387);const y=Object.getOwnPropertySymbols?function(T){for(var C=[];T;)(0,r.Z)(C,(0,f.Z)(T)),T=(0,a.Z)(T);return C}:c.Z},17507:(m,S,i)=>{"use strict";i.d(S,{Z:()=>st});var r=i(10259),a=i(40309);const c=(0,r.Z)(a.Z,"DataView");var e=i(54673);const y=(0,r.Z)(a.Z,"Promise"),C=(0,r.Z)(a.Z,"Set"),L=(0,r.Z)(a.Z,"WeakMap");var z=i(98286),W=i(22035),J="[object Map]",ce="[object Promise]",ie="[object Set]",U="[object WeakMap]",se="[object DataView]",ge=(0,W.Z)(c),ae=(0,W.Z)(e.Z),he=(0,W.Z)(y),be=(0,W.Z)(C),we=(0,W.Z)(L),ue=z.Z;(c&&ue(new c(new ArrayBuffer(1)))!=se||e.Z&&ue(new e.Z)!=J||y&&ue(y.resolve())!=ce||C&&ue(new C)!=ie||L&&ue(new L)!=U)&&(ue=function(We){var Ve=(0,z.Z)(We),Be="[object Object]"==Ve?We.constructor:void 0,xe=Be?(0,W.Z)(Be):"";if(xe)switch(xe){case ge:return se;case ae:return J;case he:return ce;case be:return ie;case we:return U}return Ve});const st=ue},42542:(m,S,i)=>{"use strict";i.d(S,{Z:()=>T});var r=i(4214),a=Object.create;const c=function(){function C(){}return function(R){if(!(0,r.Z)(R))return{};if(a)return a(R);C.prototype=R;var L=new C;return C.prototype=void 0,L}}();var e=i(11595),p=i(31550);const T=function y(C){return"function"!=typeof C.constructor||(0,p.Z)(C)?{}:c((0,e.Z)(C))}},28078:(m,S,i)=>{"use strict";i.d(S,{Z:()=>c});var a=/^(?:0|[1-9]\d*)$/;const c=function f(e,p){var y=typeof e;return!!(p=null==p?9007199254740991:p)&&("number"==y||"symbol"!=y&&a.test(e))&&e>-1&&e%1==0&&e<p}},31550:(m,S,i)=>{"use strict";i.d(S,{Z:()=>f});var r=Object.prototype;const f=function a(c){var e=c&&c.constructor;return c===("function"==typeof e&&e.prototype||r)}},48514:(m,S,i)=>{"use strict";i.d(S,{Z:()=>y});var r=i(7746),a="object"==typeof exports&&exports&&!exports.nodeType&&exports,f=a&&"object"==typeof module&&module&&!module.nodeType&&module,e=f&&f.exports===a&&r.Z.process;const y=function(){try{return f&&f.require&&f.require("util").types||e&&e.binding&&e.binding("util")}catch(C){}}()},24184:(m,S,i)=>{"use strict";i.d(S,{Z:()=>a});const a=function r(f,c){return function(e){return f(c(e))}}},40309:(m,S,i)=>{"use strict";i.d(S,{Z:()=>c});var r=i(7746),a="object"==typeof self&&self&&self.Object===Object&&self;const c=r.Z||a||Function("return this")()},22035:(m,S,i)=>{"use strict";i.d(S,{Z:()=>c});var a=Function.prototype.toString;const c=function f(e){if(null!=e){try{return a.call(e)}catch(p){}try{return e+""}catch(p){}}return""}},66224:(m,S,i)=>{"use strict";i.d(S,{Z:()=>a});const a=function r(f,c){return f===c||f!=f&&c!=c}},40591:(m,S,i)=>{"use strict";i.d(S,{Z:()=>R});var r=i(98286),a=i(6539);const e=function c(L){return(0,a.Z)(L)&&"[object Arguments]"==(0,r.Z)(L)};var p=Object.prototype,y=p.hasOwnProperty,T=p.propertyIsEnumerable;const R=e(function(){return arguments}())?e:function(L){return(0,a.Z)(L)&&y.call(L,"callee")&&!T.call(L,"callee")}},34654:(m,S,i)=>{"use strict";i.d(S,{Z:()=>a});const a=Array.isArray},18402:(m,S,i)=>{"use strict";i.d(S,{Z:()=>c});var r=i(58209),a=i(19238);const c=function f(e){return null!=e&&(0,a.Z)(e.length)&&!(0,r.Z)(e)}},25014:(m,S,i)=>{"use strict";i.d(S,{Z:()=>R});var r=i(40309),c="object"==typeof exports&&exports&&!exports.nodeType&&exports,e=c&&"object"==typeof module&&module&&!module.nodeType&&module,y=e&&e.exports===c?r.Z.Buffer:void 0;const R=(y?y.isBuffer:void 0)||function a(){return!1}},58209:(m,S,i)=>{"use strict";i.d(S,{Z:()=>T});var r=i(98286),a=i(4214);const T=function y(C){if(!(0,a.Z)(C))return!1;var R=(0,r.Z)(C);return"[object Function]"==R||"[object GeneratorFunction]"==R||"[object AsyncFunction]"==R||"[object Proxy]"==R}},19238:(m,S,i)=>{"use strict";i.d(S,{Z:()=>f});const f=function a(c){return"number"==typeof c&&c>-1&&c%1==0&&c<=9007199254740991}},4214:(m,S,i)=>{"use strict";i.d(S,{Z:()=>a});const a=function r(f){var c=typeof f;return null!=f&&("object"==c||"function"==c)}},6539:(m,S,i)=>{"use strict";i.d(S,{Z:()=>a});const a=function r(f){return null!=f&&"object"==typeof f}},14803:(m,S,i)=>{"use strict";i.d(S,{Z:()=>en});var r=i(98286),a=i(19238),f=i(6539),Ve={};Ve["[object Float32Array]"]=Ve["[object Float64Array]"]=Ve["[object Int8Array]"]=Ve["[object Int16Array]"]=Ve["[object Int32Array]"]=Ve["[object Uint8Array]"]=Ve["[object Uint8ClampedArray]"]=Ve["[object Uint16Array]"]=Ve["[object Uint32Array]"]=!0,Ve["[object Arguments]"]=Ve["[object Array]"]=Ve["[object ArrayBuffer]"]=Ve["[object Boolean]"]=Ve["[object DataView]"]=Ve["[object Date]"]=Ve["[object Error]"]=Ve["[object Function]"]=Ve["[object Map]"]=Ve["[object Number]"]=Ve["[object Object]"]=Ve["[object RegExp]"]=Ve["[object Set]"]=Ve["[object String]"]=Ve["[object WeakMap]"]=!1;var je=i(21162),Ne=i(48514),Bt=Ne.Z&&Ne.Z.isTypedArray;const en=Bt?(0,je.Z)(Bt):function Be(Pt){return(0,f.Z)(Pt)&&(0,a.Z)(Pt.length)&&!!Ve[(0,r.Z)(Pt)]}},44409:(m,S,i)=>{"use strict";i.d(S,{Z:()=>z});var r=i(26438),a=i(31550);const e=(0,i(24184).Z)(Object.keys,Object);var y=Object.prototype.hasOwnProperty;var R=i(18402);const z=function L(W){return(0,R.Z)(W)?(0,r.Z)(W):function T(W){if(!(0,a.Z)(W))return e(W);var J=[];for(var ee in Object(W))y.call(W,ee)&&"constructor"!=ee&&J.push(ee);return J}(W)}},34673:(m,S,i)=>{"use strict";i.d(S,{Z:()=>z});var r=i(26438),a=i(4214),f=i(31550);var y=Object.prototype.hasOwnProperty;const C=function T(W){if(!(0,a.Z)(W))return function c(W){var J=[];if(null!=W)for(var ee in Object(W))J.push(ee);return J}(W);var J=(0,f.Z)(W),ee=[];for(var ce in W)"constructor"==ce&&(J||!y.call(W,ce))||ee.push(ce);return ee};var R=i(18402);const z=function L(W){return(0,R.Z)(W)?(0,r.Z)(W,!0):C(W)}},38387:(m,S,i)=>{"use strict";i.d(S,{Z:()=>a});const a=function r(){return[]}},92870:(m,S,i)=>{"use strict";i.d(S,{Rh:()=>en,_W:()=>Ne});var r=i(89724),a=i(32019),f=i(79765),c=i(11048),e=i(14800);const p=["toast-component",""];function y(mt,Nt){if(1&mt){const St=r.EpF();r.TgZ(0,"button",5),r.NdJ("click",function(){return r.CHM(St),r.oxw().remove()}),r.TgZ(1,"span",6),r._uU(2,"\xd7"),r.qZA()()}}function T(mt,Nt){if(1&mt&&(r.ynx(0),r._uU(1),r.BQk()),2&mt){const St=r.oxw(2);r.xp6(1),r.hij("[",St.duplicatesCount+1,"]")}}function C(mt,Nt){if(1&mt&&(r.TgZ(0,"div"),r._uU(1),r.YNc(2,T,2,1,"ng-container",4),r.qZA()),2&mt){const St=r.oxw();r.Tol(St.options.titleClass),r.uIk("aria-label",St.title),r.xp6(1),r.hij(" ",St.title," "),r.xp6(1),r.Q6J("ngIf",St.duplicatesCount)}}function R(mt,Nt){if(1&mt&&r._UZ(0,"div",7),2&mt){const St=r.oxw();r.Tol(St.options.messageClass),r.Q6J("innerHTML",St.message,r.oJD)}}function L(mt,Nt){if(1&mt&&(r.TgZ(0,"div",8),r._uU(1),r.qZA()),2&mt){const St=r.oxw();r.Tol(St.options.messageClass),r.uIk("aria-label",St.message),r.xp6(1),r.hij(" ",St.message," ")}}function z(mt,Nt){if(1&mt&&(r.TgZ(0,"div"),r._UZ(1,"div",9),r.qZA()),2&mt){const St=r.oxw();r.xp6(1),r.Udp("width",St.width+"%")}}function W(mt,Nt){if(1&mt){const St=r.EpF();r.TgZ(0,"button",5),r.NdJ("click",function(){return r.CHM(St),r.oxw().remove()}),r.TgZ(1,"span",6),r._uU(2,"\xd7"),r.qZA()()}}function J(mt,Nt){if(1&mt&&(r.ynx(0),r._uU(1),r.BQk()),2&mt){const St=r.oxw(2);r.xp6(1),r.hij("[",St.duplicatesCount+1,"]")}}function ee(mt,Nt){if(1&mt&&(r.TgZ(0,"div"),r._uU(1),r.YNc(2,J,2,1,"ng-container",4),r.qZA()),2&mt){const St=r.oxw();r.Tol(St.options.titleClass),r.uIk("aria-label",St.title),r.xp6(1),r.hij(" ",St.title," "),r.xp6(1),r.Q6J("ngIf",St.duplicatesCount)}}function ce(mt,Nt){if(1&mt&&r._UZ(0,"div",7),2&mt){const St=r.oxw();r.Tol(St.options.messageClass),r.Q6J("innerHTML",St.message,r.oJD)}}function ie(mt,Nt){if(1&mt&&(r.TgZ(0,"div",8),r._uU(1),r.qZA()),2&mt){const St=r.oxw();r.Tol(St.options.messageClass),r.uIk("aria-label",St.message),r.xp6(1),r.hij(" ",St.message," ")}}function U(mt,Nt){if(1&mt&&(r.TgZ(0,"div"),r._UZ(1,"div",9),r.qZA()),2&mt){const St=r.oxw();r.xp6(1),r.Udp("width",St.width+"%")}}class ae{constructor(Nt,St){this.component=Nt,this.injector=St}attach(Nt,St){return this._attachedHost=Nt,Nt.attach(this,St)}detach(){const Nt=this._attachedHost;if(Nt)return this._attachedHost=void 0,Nt.detach()}get isAttached(){return null!=this._attachedHost}setAttachedHost(Nt){this._attachedHost=Nt}}class be{constructor(Nt,St,Yt,Fn,pr,Ei){this.toastId=Nt,this.config=St,this.message=Yt,this.title=Fn,this.toastType=pr,this.toastRef=Ei,this._onTap=new f.xQ,this._onAction=new f.xQ,this.toastRef.afterClosed().subscribe(()=>{this._onAction.complete(),this._onTap.complete()})}triggerTap(){this._onTap.next(),this.config.tapToDismiss&&this._onTap.complete()}onTap(){return this._onTap.asObservable()}triggerAction(Nt){this._onAction.next(Nt)}onAction(){return this._onAction.asObservable()}}const we={maxOpened:0,autoDismiss:!1,newestOnTop:!0,preventDuplicates:!1,countDuplicates:!1,resetTimeoutOnDuplicate:!1,includeTitleDuplicates:!1,iconClasses:{error:"toast-error",info:"toast-info",success:"toast-success",warning:"toast-warning"},closeButton:!1,disableTimeOut:!1,timeOut:5e3,extendedTimeOut:1e3,enableHtml:!1,progressBar:!1,toastClass:"ngx-toastr",positionClass:"toast-top-right",titleClass:"toast-title",messageClass:"toast-message",easing:"ease-in",easeTime:300,tapToDismiss:!0,onActivateTick:!1,progressAnimation:"decreasing",payload:null},ue=new r.OlP("ToastConfig");class st{constructor(Nt){this._overlayRef=Nt,this.duplicatesCount=0,this._afterClosed=new f.xQ,this._activate=new f.xQ,this._manualClose=new f.xQ,this._resetTimeout=new f.xQ,this._countDuplicate=new f.xQ}manualClose(){this._manualClose.next(),this._manualClose.complete()}manualClosed(){return this._manualClose.asObservable()}timeoutReset(){return this._resetTimeout.asObservable()}countDuplicate(){return this._countDuplicate.asObservable()}close(){this._overlayRef.detach(),this._afterClosed.next(),this._manualClose.next(),this._afterClosed.complete(),this._manualClose.complete(),this._activate.complete(),this._resetTimeout.complete(),this._countDuplicate.complete()}afterClosed(){return this._afterClosed.asObservable()}isInactive(){return this._activate.isStopped}activate(){this._activate.next(),this._activate.complete()}afterActivate(){return this._activate.asObservable()}onDuplicate(Nt,St){Nt&&this._resetTimeout.next(),St&&this._countDuplicate.next(++this.duplicatesCount)}}class We{constructor(Nt,St){this._toastPackage=Nt,this._parentInjector=St}get(Nt,St,Yt){return Nt===be?this._toastPackage:this._parentInjector.get(Nt,St,Yt)}}class Ve extends class he{attach(Nt,St){return this._attachedPortal=Nt,this.attachComponentPortal(Nt,St)}detach(){this._attachedPortal&&this._attachedPortal.setAttachedHost(),this._attachedPortal=void 0,this._disposeFn&&(this._disposeFn(),this._disposeFn=void 0)}setDisposeFn(Nt){this._disposeFn=Nt}}{constructor(Nt,St,Yt){super(),this._hostDomElement=Nt,this._componentFactoryResolver=St,this._appRef=Yt}attachComponentPortal(Nt,St){const Yt=this._componentFactoryResolver.resolveComponentFactory(Nt.component);let Fn;return Fn=Yt.create(Nt.injector),this._appRef.attachView(Fn.hostView),this.setDisposeFn(()=>{this._appRef.detachView(Fn.hostView),Fn.destroy()}),St?this._hostDomElement.insertBefore(this._getComponentRootNode(Fn),this._hostDomElement.firstChild):this._hostDomElement.appendChild(this._getComponentRootNode(Fn)),Fn}_getComponentRootNode(Nt){return Nt.hostView.rootNodes[0]}}class Be{constructor(Nt){this._portalHost=Nt}attach(Nt,St=!0){return this._portalHost.attach(Nt,St)}detach(){return this._portalHost.detach()}}let xe=(()=>{class mt{constructor(St){this._document=St}ngOnDestroy(){this._containerElement&&this._containerElement.parentNode&&this._containerElement.parentNode.removeChild(this._containerElement)}getContainerElement(){return this._containerElement||this._createContainer(),this._containerElement}_createContainer(){const St=this._document.createElement("div");St.classList.add("overlay-container"),St.setAttribute("aria-live","polite"),this._document.body.appendChild(St),this._containerElement=St}}return mt.\u0275fac=function(St){return new(St||mt)(r.LFG(c.K0))},mt.\u0275prov=r.Yz7({token:mt,factory:mt.\u0275fac,providedIn:"root"}),mt})(),je=(()=>{class mt{constructor(St,Yt,Fn,pr){this._overlayContainer=St,this._componentFactoryResolver=Yt,this._appRef=Fn,this._document=pr,this._paneElements=new Map}create(St,Yt){return this._createOverlayRef(this.getPaneElement(St,Yt))}getPaneElement(St="",Yt){return this._paneElements.get(Yt)||this._paneElements.set(Yt,{}),this._paneElements.get(Yt)[St]||(this._paneElements.get(Yt)[St]=this._createPaneElement(St,Yt)),this._paneElements.get(Yt)[St]}_createPaneElement(St,Yt){const Fn=this._document.createElement("div");return Fn.id="toast-container",Fn.classList.add(St),Fn.classList.add("toast-container"),Yt?Yt.getContainerElement().appendChild(Fn):this._overlayContainer.getContainerElement().appendChild(Fn),Fn}_createPortalHost(St){return new Ve(St,this._componentFactoryResolver,this._appRef)}_createOverlayRef(St){return new Be(this._createPortalHost(St))}}return mt.\u0275fac=function(St){return new(St||mt)(r.LFG(xe),r.LFG(r._Vd),r.LFG(r.z2F),r.LFG(c.K0))},mt.\u0275prov=r.Yz7({token:mt,factory:mt.\u0275fac,providedIn:"root"}),mt})(),Ne=(()=>{class mt{constructor(St,Yt,Fn,pr,Ei){this.overlay=Yt,this._injector=Fn,this.sanitizer=pr,this.ngZone=Ei,this.currentlyActive=0,this.toasts=[],this.index=0,this.toastrConfig=Object.assign(Object.assign({},St.default),St.config),St.config.iconClasses&&(this.toastrConfig.iconClasses=Object.assign(Object.assign({},St.default.iconClasses),St.config.iconClasses))}show(St,Yt,Fn={},pr=""){return this._preBuildNotification(pr,St,Yt,this.applyConfig(Fn))}success(St,Yt,Fn={}){return this._preBuildNotification(this.toastrConfig.iconClasses.success||"",St,Yt,this.applyConfig(Fn))}error(St,Yt,Fn={}){return this._preBuildNotification(this.toastrConfig.iconClasses.error||"",St,Yt,this.applyConfig(Fn))}info(St,Yt,Fn={}){return this._preBuildNotification(this.toastrConfig.iconClasses.info||"",St,Yt,this.applyConfig(Fn))}warning(St,Yt,Fn={}){return this._preBuildNotification(this.toastrConfig.iconClasses.warning||"",St,Yt,this.applyConfig(Fn))}clear(St){for(const Yt of this.toasts)if(void 0!==St){if(Yt.toastId===St)return void Yt.toastRef.manualClose()}else Yt.toastRef.manualClose()}remove(St){const Yt=this._findToast(St);if(!Yt||(Yt.activeToast.toastRef.close(),this.toasts.splice(Yt.index,1),this.currentlyActive=this.currentlyActive-1,!this.toastrConfig.maxOpened||!this.toasts.length))return!1;if(this.currentlyActive<this.toastrConfig.maxOpened&&this.toasts[this.currentlyActive]){const Fn=this.toasts[this.currentlyActive].toastRef;Fn.isInactive()||(this.currentlyActive=this.currentlyActive+1,Fn.activate())}return!0}findDuplicate(St="",Yt="",Fn,pr){const{includeTitleDuplicates:Ei}=this.toastrConfig;for(const mi of this.toasts){const ur=Ei&&mi.title===St;if((!Ei||ur)&&mi.message===Yt)return mi.toastRef.onDuplicate(Fn,pr),mi}return null}applyConfig(St={}){return Object.assign(Object.assign({},this.toastrConfig),St)}_findToast(St){for(let Yt=0;Yt<this.toasts.length;Yt++)if(this.toasts[Yt].toastId===St)return{index:Yt,activeToast:this.toasts[Yt]};return null}_preBuildNotification(St,Yt,Fn,pr){return pr.onActivateTick?this.ngZone.run(()=>this._buildNotification(St,Yt,Fn,pr)):this._buildNotification(St,Yt,Fn,pr)}_buildNotification(St,Yt,Fn,pr){if(!pr.toastComponent)throw new Error("toastComponent required");const Ei=this.findDuplicate(Fn,Yt,this.toastrConfig.resetTimeoutOnDuplicate&&pr.timeOut>0,this.toastrConfig.countDuplicates);if((this.toastrConfig.includeTitleDuplicates&&Fn||Yt)&&this.toastrConfig.preventDuplicates&&null!==Ei)return Ei;this.previousToastMessage=Yt;let mi=!1;this.toastrConfig.maxOpened&&this.currentlyActive>=this.toastrConfig.maxOpened&&(mi=!0,this.toastrConfig.autoDismiss&&this.clear(this.toasts[0].toastId));const ur=this.overlay.create(pr.positionClass,this.overlayContainer);this.index=this.index+1;let $r=Yt;Yt&&pr.enableHtml&&($r=this.sanitizer.sanitize(r.q3G.HTML,Yt));const Br=new st(ur),Pn=new be(this.index,pr,$r,Fn,St,Br),Xn=new We(Pn,this._injector),dr=new ae(pr.toastComponent,Xn),Qr=ur.attach(dr,this.toastrConfig.newestOnTop);Br.componentInstance=Qr.instance;const Ci={toastId:this.index,title:Fn||"",message:Yt||"",toastRef:Br,onShown:Br.afterActivate(),onHidden:Br.afterClosed(),onTap:Pn.onTap(),onAction:Pn.onAction(),portal:Qr};return mi||(this.currentlyActive=this.currentlyActive+1,setTimeout(()=>{Ci.toastRef.activate()})),this.toasts.push(Ci),Ci}}return mt.\u0275fac=function(St){return new(St||mt)(r.LFG(ue),r.LFG(je),r.LFG(r.zs3),r.LFG(e.H7),r.LFG(r.R0b))},mt.\u0275prov=r.Yz7({token:mt,factory:mt.\u0275fac,providedIn:"root"}),mt})(),Bt=(()=>{class mt{constructor(St,Yt,Fn){this.toastrService=St,this.toastPackage=Yt,this.ngZone=Fn,this.width=-1,this.toastClasses="",this.state={value:"inactive",params:{easeTime:this.toastPackage.config.easeTime,easing:"ease-in"}},this.message=Yt.message,this.title=Yt.title,this.options=Yt.config,this.originalTimeout=Yt.config.timeOut,this.toastClasses=`${Yt.toastType} ${Yt.config.toastClass}`,this.sub=Yt.toastRef.afterActivate().subscribe(()=>{this.activateToast()}),this.sub1=Yt.toastRef.manualClosed().subscribe(()=>{this.remove()}),this.sub2=Yt.toastRef.timeoutReset().subscribe(()=>{this.resetTimeout()}),this.sub3=Yt.toastRef.countDuplicate().subscribe(pr=>{this.duplicatesCount=pr})}get displayStyle(){if("inactive"===this.state.value)return"none"}ngOnDestroy(){this.sub.unsubscribe(),this.sub1.unsubscribe(),this.sub2.unsubscribe(),this.sub3.unsubscribe(),clearInterval(this.intervalId),clearTimeout(this.timeout)}activateToast(){this.state=Object.assign(Object.assign({},this.state),{value:"active"}),!0!==this.options.disableTimeOut&&"timeOut"!==this.options.disableTimeOut&&this.options.timeOut&&(this.outsideTimeout(()=>this.remove(),this.options.timeOut),this.hideTime=(new Date).getTime()+this.options.timeOut,this.options.progressBar&&this.outsideInterval(()=>this.updateProgress(),10))}updateProgress(){if(0===this.width||100===this.width||!this.options.timeOut)return;const St=(new Date).getTime();this.width=(this.hideTime-St)/this.options.timeOut*100,"increasing"===this.options.progressAnimation&&(this.width=100-this.width),this.width<=0&&(this.width=0),this.width>=100&&(this.width=100)}resetTimeout(){clearTimeout(this.timeout),clearInterval(this.intervalId),this.state=Object.assign(Object.assign({},this.state),{value:"active"}),this.outsideTimeout(()=>this.remove(),this.originalTimeout),this.options.timeOut=this.originalTimeout,this.hideTime=(new Date).getTime()+(this.options.timeOut||0),this.width=-1,this.options.progressBar&&this.outsideInterval(()=>this.updateProgress(),10)}remove(){"removed"!==this.state.value&&(clearTimeout(this.timeout),this.state=Object.assign(Object.assign({},this.state),{value:"removed"}),this.outsideTimeout(()=>this.toastrService.remove(this.toastPackage.toastId),+this.toastPackage.config.easeTime))}tapToast(){"removed"!==this.state.value&&(this.toastPackage.triggerTap(),this.options.tapToDismiss&&this.remove())}stickAround(){"removed"!==this.state.value&&(clearTimeout(this.timeout),this.options.timeOut=0,this.hideTime=0,clearInterval(this.intervalId),this.width=0)}delayedHideToast(){!0===this.options.disableTimeOut||"extendedTimeOut"===this.options.disableTimeOut||0===this.options.extendedTimeOut||"removed"===this.state.value||(this.outsideTimeout(()=>this.remove(),this.options.extendedTimeOut),this.options.timeOut=this.options.extendedTimeOut,this.hideTime=(new Date).getTime()+(this.options.timeOut||0),this.width=-1,this.options.progressBar&&this.outsideInterval(()=>this.updateProgress(),10))}outsideTimeout(St,Yt){this.ngZone?this.ngZone.runOutsideAngular(()=>this.timeout=setTimeout(()=>this.runInsideAngular(St),Yt)):this.timeout=setTimeout(()=>St(),Yt)}outsideInterval(St,Yt){this.ngZone?this.ngZone.runOutsideAngular(()=>this.intervalId=setInterval(()=>this.runInsideAngular(St),Yt)):this.intervalId=setInterval(()=>St(),Yt)}runInsideAngular(St){this.ngZone?this.ngZone.run(()=>St()):St()}}return mt.\u0275fac=function(St){return new(St||mt)(r.Y36(Ne),r.Y36(be),r.Y36(r.R0b))},mt.\u0275cmp=r.Xpm({type:mt,selectors:[["","toast-component",""]],hostVars:5,hostBindings:function(St,Yt){1&St&&r.NdJ("click",function(){return Yt.tapToast()})("mouseenter",function(){return Yt.stickAround()})("mouseleave",function(){return Yt.delayedHideToast()}),2&St&&(r.d8E("@flyInOut",Yt.state),r.Tol(Yt.toastClasses),r.Udp("display",Yt.displayStyle))},attrs:p,decls:5,vars:5,consts:[["type","button","class","toast-close-button","aria-label","Close",3,"click",4,"ngIf"],[3,"class",4,"ngIf"],["role","alert",3,"class","innerHTML",4,"ngIf"],["role","alert",3,"class",4,"ngIf"],[4,"ngIf"],["type","button","aria-label","Close",1,"toast-close-button",3,"click"],["aria-hidden","true"],["role","alert",3,"innerHTML"],["role","alert"],[1,"toast-progress"]],template:function(St,Yt){1&St&&(r.YNc(0,y,3,0,"button",0),r.YNc(1,C,3,5,"div",1),r.YNc(2,R,1,3,"div",2),r.YNc(3,L,2,4,"div",3),r.YNc(4,z,2,2,"div",4)),2&St&&(r.Q6J("ngIf",Yt.options.closeButton),r.xp6(1),r.Q6J("ngIf",Yt.title),r.xp6(1),r.Q6J("ngIf",Yt.message&&Yt.options.enableHtml),r.xp6(1),r.Q6J("ngIf",Yt.message&&!Yt.options.enableHtml),r.xp6(1),r.Q6J("ngIf",Yt.options.progressBar))},directives:[c.O5],encapsulation:2,data:{animation:[(0,a.X$)("flyInOut",[(0,a.SB)("inactive",(0,a.oB)({opacity:0})),(0,a.SB)("active",(0,a.oB)({opacity:1})),(0,a.SB)("removed",(0,a.oB)({opacity:0})),(0,a.eR)("inactive => active",(0,a.jt)("{{ easeTime }}ms {{ easing }}")),(0,a.eR)("active => removed",(0,a.jt)("{{ easeTime }}ms {{ easing }}"))])]}}),mt})();const rt=Object.assign(Object.assign({},we),{toastComponent:Bt});let en=(()=>{class mt{static forRoot(St={}){return{ngModule:mt,providers:[{provide:ue,useValue:{default:rt,config:St}}]}}}return mt.\u0275fac=function(St){return new(St||mt)},mt.\u0275mod=r.oAB({type:mt}),mt.\u0275inj=r.cJS({imports:[[c.ez]]}),mt})(),Vt=(()=>{class mt{constructor(St,Yt,Fn){this.toastrService=St,this.toastPackage=Yt,this.appRef=Fn,this.width=-1,this.toastClasses="",this.state="inactive",this.message=Yt.message,this.title=Yt.title,this.options=Yt.config,this.originalTimeout=Yt.config.timeOut,this.toastClasses=`${Yt.toastType} ${Yt.config.toastClass}`,this.sub=Yt.toastRef.afterActivate().subscribe(()=>{this.activateToast()}),this.sub1=Yt.toastRef.manualClosed().subscribe(()=>{this.remove()}),this.sub2=Yt.toastRef.timeoutReset().subscribe(()=>{this.resetTimeout()}),this.sub3=Yt.toastRef.countDuplicate().subscribe(pr=>{this.duplicatesCount=pr})}get displayStyle(){if("inactive"===this.state)return"none"}ngOnDestroy(){this.sub.unsubscribe(),this.sub1.unsubscribe(),this.sub2.unsubscribe(),this.sub3.unsubscribe(),clearInterval(this.intervalId),clearTimeout(this.timeout)}activateToast(){this.state="active",!(!0===this.options.disableTimeOut||"timeOut"===this.options.disableTimeOut)&&this.options.timeOut&&(this.timeout=setTimeout(()=>{this.remove()},this.options.timeOut),this.hideTime=(new Date).getTime()+this.options.timeOut,this.options.progressBar&&(this.intervalId=setInterval(()=>this.updateProgress(),10))),this.options.onActivateTick&&this.appRef.tick()}updateProgress(){if(0===this.width||100===this.width||!this.options.timeOut)return;const St=(new Date).getTime();this.width=(this.hideTime-St)/this.options.timeOut*100,"increasing"===this.options.progressAnimation&&(this.width=100-this.width),this.width<=0&&(this.width=0),this.width>=100&&(this.width=100)}resetTimeout(){clearTimeout(this.timeout),clearInterval(this.intervalId),this.state="active",this.options.timeOut=this.originalTimeout,this.timeout=setTimeout(()=>this.remove(),this.originalTimeout),this.hideTime=(new Date).getTime()+(this.originalTimeout||0),this.width=-1,this.options.progressBar&&(this.intervalId=setInterval(()=>this.updateProgress(),10))}remove(){"removed"!==this.state&&(clearTimeout(this.timeout),this.state="removed",this.timeout=setTimeout(()=>this.toastrService.remove(this.toastPackage.toastId)))}tapToast(){"removed"!==this.state&&(this.toastPackage.triggerTap(),this.options.tapToDismiss&&this.remove())}stickAround(){"removed"!==this.state&&(clearTimeout(this.timeout),this.options.timeOut=0,this.hideTime=0,clearInterval(this.intervalId),this.width=0)}delayedHideToast(){!0===this.options.disableTimeOut||"extendedTimeOut"===this.options.disableTimeOut||0===this.options.extendedTimeOut||"removed"===this.state||(this.timeout=setTimeout(()=>this.remove(),this.options.extendedTimeOut),this.options.timeOut=this.options.extendedTimeOut,this.hideTime=(new Date).getTime()+(this.options.timeOut||0),this.width=-1,this.options.progressBar&&(this.intervalId=setInterval(()=>this.updateProgress(),10)))}}return mt.\u0275fac=function(St){return new(St||mt)(r.Y36(Ne),r.Y36(be),r.Y36(r.z2F))},mt.\u0275cmp=r.Xpm({type:mt,selectors:[["","toast-component",""]],hostVars:4,hostBindings:function(St,Yt){1&St&&r.NdJ("click",function(){return Yt.tapToast()})("mouseenter",function(){return Yt.stickAround()})("mouseleave",function(){return Yt.delayedHideToast()}),2&St&&(r.Tol(Yt.toastClasses),r.Udp("display",Yt.displayStyle))},attrs:p,decls:5,vars:5,consts:[["type","button","class","toast-close-button","aria-label","Close",3,"click",4,"ngIf"],[3,"class",4,"ngIf"],["role","alert",3,"class","innerHTML",4,"ngIf"],["role","alert",3,"class",4,"ngIf"],[4,"ngIf"],["type","button","aria-label","Close",1,"toast-close-button",3,"click"],["aria-hidden","true"],["role","alert",3,"innerHTML"],["role","alert"],[1,"toast-progress"]],template:function(St,Yt){1&St&&(r.YNc(0,W,3,0,"button",0),r.YNc(1,ee,3,5,"div",1),r.YNc(2,ce,1,3,"div",2),r.YNc(3,ie,2,4,"div",3),r.YNc(4,U,2,2,"div",4)),2&St&&(r.Q6J("ngIf",Yt.options.closeButton),r.xp6(1),r.Q6J("ngIf",Yt.title),r.xp6(1),r.Q6J("ngIf",Yt.message&&Yt.options.enableHtml),r.xp6(1),r.Q6J("ngIf",Yt.message&&!Yt.options.enableHtml),r.xp6(1),r.Q6J("ngIf",Yt.options.progressBar))},directives:[c.O5],encapsulation:2}),mt})();Object.assign(Object.assign({},we),{toastComponent:Vt})}},m=>{m(m.s=88480)}]);
\ No newline at end of file
diff --git a/ceph/src/pybind/mgr/dashboard/frontend/dist/en-US/polyfills.2068f3f22a496426465b.js b/ceph/src/pybind/mgr/dashboard/frontend/dist/en-US/polyfills.2068f3f22a496426465b.js
deleted file mode 100644 (file)
index db37e39..0000000
+++ /dev/null
@@ -1 +0,0 @@
-(self.webpackChunkceph_dashboard=self.webpackChunkceph_dashboard||[]).push([[429],{99140:(me,Se,we)=>{var ve,Le;void 0!==(Le="function"==typeof(ve=function(){"use strict";!function(e){var r=e.performance;function t(h){r&&r.mark&&r.mark(h)}function n(h,a){r&&r.measure&&r.measure(h,a)}t("Zone");var i=e.__Zone_symbol_prefix||"__zone_symbol__";function c(h){return i+h}var l=!0===e[c("forceDuplicateZoneCheck")];if(e.Zone){if(l||"function"!=typeof e.Zone.__symbol__)throw new Error("Zone already loaded.");return e.Zone}var _=function(){function h(a,o){this._parent=a,this._name=o?o.name||"unnamed":"<root>",this._properties=o&&o.properties||{},this._zoneDelegate=new d(this,this._parent&&this._parent._zoneDelegate,o)}return h.assertZonePatched=function(){if(e.Promise!==F.ZoneAwarePromise)throw new Error("Zone.js has detected that ZoneAwarePromise `(window|global).Promise` has been overwritten.\nMost likely cause is that a Promise polyfill has been loaded after Zone.js (Polyfilling Promise api is not necessary when zone.js is loaded. If you must load one, do so before loading zone.js.)")},Object.defineProperty(h,"root",{get:function(){for(var a=h.current;a.parent;)a=a.parent;return a},enumerable:!0,configurable:!0}),Object.defineProperty(h,"current",{get:function(){return M.zone},enumerable:!0,configurable:!0}),Object.defineProperty(h,"currentTask",{get:function(){return oe},enumerable:!0,configurable:!0}),h.__load_patch=function(a,o){if(F.hasOwnProperty(a)){if(l)throw Error("Already loaded patch: "+a)}else if(!e["__Zone_disable_"+a]){var s="Zone:"+a;t(s),F[a]=o(e,h,R),n(s,s)}},Object.defineProperty(h.prototype,"parent",{get:function(){return this._parent},enumerable:!0,configurable:!0}),Object.defineProperty(h.prototype,"name",{get:function(){return this._name},enumerable:!0,configurable:!0}),h.prototype.get=function(a){var o=this.getZoneWith(a);if(o)return o._properties[a]},h.prototype.getZoneWith=function(a){for(var o=this;o;){if(o._properties.hasOwnProperty(a))return o;o=o._parent}return null},h.prototype.fork=function(a){if(!a)throw new Error("ZoneSpec required!");return this._zoneDelegate.fork(this,a)},h.prototype.wrap=function(a,o){if("function"!=typeof a)throw new Error("Expecting function got: "+a);var s=this._zoneDelegate.intercept(this,a,o),w=this;return function(){return w.runGuarded(s,this,arguments,o)}},h.prototype.run=function(a,o,s,w){M={parent:M,zone:this};try{return this._zoneDelegate.invoke(this,a,o,s,w)}finally{M=M.parent}},h.prototype.runGuarded=function(a,o,s,w){void 0===o&&(o=null),M={parent:M,zone:this};try{try{return this._zoneDelegate.invoke(this,a,o,s,w)}catch(N){if(this._zoneDelegate.handleError(this,N))throw N}}finally{M=M.parent}},h.prototype.runTask=function(a,o,s){if(a.zone!=this)throw new Error("A task can only be run in the zone of creation! (Creation: "+(a.zone||x).name+"; Execution: "+this.name+")");if(a.state!==A||a.type!==C&&a.type!==Y){var w=a.state!=P;w&&a._transitionTo(P,U),a.runCount++;var N=oe;oe=a,M={parent:M,zone:this};try{a.type==Y&&a.data&&!a.data.isPeriodic&&(a.cancelFn=void 0);try{return this._zoneDelegate.invokeTask(this,a,o,s)}catch(ae){if(this._zoneDelegate.handleError(this,ae))throw ae}}finally{a.state!==A&&a.state!==I&&(a.type==C||a.data&&a.data.isPeriodic?w&&a._transitionTo(U,P):(a.runCount=0,this._updateTaskCount(a,-1),w&&a._transitionTo(A,P,A))),M=M.parent,oe=N}}},h.prototype.scheduleTask=function(a){if(a.zone&&a.zone!==this)for(var o=this;o;){if(o===a.zone)throw Error("can not reschedule task to "+this.name+" which is descendants of the original zone "+a.zone.name);o=o.parent}a._transitionTo(V,A);var s=[];a._zoneDelegates=s,a._zone=this;try{a=this._zoneDelegate.scheduleTask(this,a)}catch(w){throw a._transitionTo(I,V,A),this._zoneDelegate.handleError(this,w),w}return a._zoneDelegates===s&&this._updateTaskCount(a,1),a.state==V&&a._transitionTo(U,V),a},h.prototype.scheduleMicroTask=function(a,o,s,w){return this.scheduleTask(new p(ee,a,o,s,w,void 0))},h.prototype.scheduleMacroTask=function(a,o,s,w,N){return this.scheduleTask(new p(Y,a,o,s,w,N))},h.prototype.scheduleEventTask=function(a,o,s,w,N){return this.scheduleTask(new p(C,a,o,s,w,N))},h.prototype.cancelTask=function(a){if(a.zone!=this)throw new Error("A task can only be cancelled in the zone of creation! (Creation: "+(a.zone||x).name+"; Execution: "+this.name+")");a._transitionTo($,U,P);try{this._zoneDelegate.cancelTask(this,a)}catch(o){throw a._transitionTo(I,$),this._zoneDelegate.handleError(this,o),o}return this._updateTaskCount(a,-1),a._transitionTo(A,$),a.runCount=0,a},h.prototype._updateTaskCount=function(a,o){var s=a._zoneDelegates;-1==o&&(a._zoneDelegates=null);for(var w=0;w<s.length;w++)s[w]._updateTaskCount(a.type,o)},h}();_.__symbol__=c;var z,T={name:"",onHasTask:function(h,a,o,s){return h.hasTask(o,s)},onScheduleTask:function(h,a,o,s){return h.scheduleTask(o,s)},onInvokeTask:function(h,a,o,s,w,N){return h.invokeTask(o,s,w,N)},onCancelTask:function(h,a,o,s){return h.cancelTask(o,s)}},d=function(){function h(a,o,s){this._taskCounts={microTask:0,macroTask:0,eventTask:0},this.zone=a,this._parentDelegate=o,this._forkZS=s&&(s&&s.onFork?s:o._forkZS),this._forkDlgt=s&&(s.onFork?o:o._forkDlgt),this._forkCurrZone=s&&(s.onFork?this.zone:o._forkCurrZone),this._interceptZS=s&&(s.onIntercept?s:o._interceptZS),this._interceptDlgt=s&&(s.onIntercept?o:o._interceptDlgt),this._interceptCurrZone=s&&(s.onIntercept?this.zone:o._interceptCurrZone),this._invokeZS=s&&(s.onInvoke?s:o._invokeZS),this._invokeDlgt=s&&(s.onInvoke?o:o._invokeDlgt),this._invokeCurrZone=s&&(s.onInvoke?this.zone:o._invokeCurrZone),this._handleErrorZS=s&&(s.onHandleError?s:o._handleErrorZS),this._handleErrorDlgt=s&&(s.onHandleError?o:o._handleErrorDlgt),this._handleErrorCurrZone=s&&(s.onHandleError?this.zone:o._handleErrorCurrZone),this._scheduleTaskZS=s&&(s.onScheduleTask?s:o._scheduleTaskZS),this._scheduleTaskDlgt=s&&(s.onScheduleTask?o:o._scheduleTaskDlgt),this._scheduleTaskCurrZone=s&&(s.onScheduleTask?this.zone:o._scheduleTaskCurrZone),this._invokeTaskZS=s&&(s.onInvokeTask?s:o._invokeTaskZS),this._invokeTaskDlgt=s&&(s.onInvokeTask?o:o._invokeTaskDlgt),this._invokeTaskCurrZone=s&&(s.onInvokeTask?this.zone:o._invokeTaskCurrZone),this._cancelTaskZS=s&&(s.onCancelTask?s:o._cancelTaskZS),this._cancelTaskDlgt=s&&(s.onCancelTask?o:o._cancelTaskDlgt),this._cancelTaskCurrZone=s&&(s.onCancelTask?this.zone:o._cancelTaskCurrZone),this._hasTaskZS=null,this._hasTaskDlgt=null,this._hasTaskDlgtOwner=null,this._hasTaskCurrZone=null;var w=s&&s.onHasTask;(w||o&&o._hasTaskZS)&&(this._hasTaskZS=w?s:T,this._hasTaskDlgt=o,this._hasTaskDlgtOwner=this,this._hasTaskCurrZone=a,s.onScheduleTask||(this._scheduleTaskZS=T,this._scheduleTaskDlgt=o,this._scheduleTaskCurrZone=this.zone),s.onInvokeTask||(this._invokeTaskZS=T,this._invokeTaskDlgt=o,this._invokeTaskCurrZone=this.zone),s.onCancelTask||(this._cancelTaskZS=T,this._cancelTaskDlgt=o,this._cancelTaskCurrZone=this.zone))}return h.prototype.fork=function(a,o){return this._forkZS?this._forkZS.onFork(this._forkDlgt,this.zone,a,o):new _(a,o)},h.prototype.intercept=function(a,o,s){return this._interceptZS?this._interceptZS.onIntercept(this._interceptDlgt,this._interceptCurrZone,a,o,s):o},h.prototype.invoke=function(a,o,s,w,N){return this._invokeZS?this._invokeZS.onInvoke(this._invokeDlgt,this._invokeCurrZone,a,o,s,w,N):o.apply(s,w)},h.prototype.handleError=function(a,o){return!this._handleErrorZS||this._handleErrorZS.onHandleError(this._handleErrorDlgt,this._handleErrorCurrZone,a,o)},h.prototype.scheduleTask=function(a,o){var s=o;if(this._scheduleTaskZS)this._hasTaskZS&&s._zoneDelegates.push(this._hasTaskDlgtOwner),(s=this._scheduleTaskZS.onScheduleTask(this._scheduleTaskDlgt,this._scheduleTaskCurrZone,a,o))||(s=o);else if(o.scheduleFn)o.scheduleFn(o);else{if(o.type!=ee)throw new Error("Task is missing scheduleFn.");m(o)}return s},h.prototype.invokeTask=function(a,o,s,w){return this._invokeTaskZS?this._invokeTaskZS.onInvokeTask(this._invokeTaskDlgt,this._invokeTaskCurrZone,a,o,s,w):o.callback.apply(s,w)},h.prototype.cancelTask=function(a,o){var s;if(this._cancelTaskZS)s=this._cancelTaskZS.onCancelTask(this._cancelTaskDlgt,this._cancelTaskCurrZone,a,o);else{if(!o.cancelFn)throw Error("Task is not cancelable");s=o.cancelFn(o)}return s},h.prototype.hasTask=function(a,o){try{this._hasTaskZS&&this._hasTaskZS.onHasTask(this._hasTaskDlgt,this._hasTaskCurrZone,a,o)}catch(s){this.handleError(a,s)}},h.prototype._updateTaskCount=function(a,o){var s=this._taskCounts,w=s[a],N=s[a]=w+o;if(N<0)throw new Error("More tasks executed then were scheduled.");0!=w&&0!=N||this.hasTask(this.zone,{microTask:s.microTask>0,macroTask:s.macroTask>0,eventTask:s.eventTask>0,change:a})},h}(),p=function(){function h(a,o,s,w,N,ae){if(this._zone=null,this.runCount=0,this._zoneDelegates=null,this._state="notScheduled",this.type=a,this.source=o,this.data=w,this.scheduleFn=N,this.cancelFn=ae,!s)throw new Error("callback is not defined");this.callback=s;var le=this;this.invoke=a===C&&w&&w.useG?h.invokeTask:function(){return h.invokeTask.call(e,le,this,arguments)}}return h.invokeTask=function(a,o,s){a||(a=this),te++;try{return a.runCount++,a.zone.runTask(a,o,s)}finally{1==te&&y(),te--}},Object.defineProperty(h.prototype,"zone",{get:function(){return this._zone},enumerable:!0,configurable:!0}),Object.defineProperty(h.prototype,"state",{get:function(){return this._state},enumerable:!0,configurable:!0}),h.prototype.cancelScheduleRequest=function(){this._transitionTo(A,V)},h.prototype._transitionTo=function(a,o,s){if(this._state!==o&&this._state!==s)throw new Error(this.type+" '"+this.source+"': can not transition to '"+a+"', expecting state '"+o+"'"+(s?" or '"+s+"'":"")+", was '"+this._state+"'.");this._state=a,a==A&&(this._zoneDelegates=null)},h.prototype.toString=function(){return this.data&&void 0!==this.data.handleId?this.data.handleId.toString():Object.prototype.toString.call(this)},h.prototype.toJSON=function(){return{type:this.type,state:this.state,source:this.source,zone:this.zone.name,runCount:this.runCount}},h}(),E=c("setTimeout"),k=c("Promise"),O=c("then"),S=[],Q=!1;function m(h){if(0===te&&0===S.length)if(z||e[k]&&(z=e[k].resolve(0)),z){var a=z[O];a||(a=z.then),a.call(z,y)}else e[E](y,0);h&&S.push(h)}function y(){if(!Q){for(Q=!0;S.length;){var h=S;S=[];for(var a=0;a<h.length;a++){var o=h[a];try{o.zone.runTask(o,null,null)}catch(s){R.onUnhandledError(s)}}}R.microtaskDrainDone(),Q=!1}}var x={name:"NO ZONE"},A="notScheduled",V="scheduling",U="scheduled",P="running",$="canceling",I="unknown",ee="microTask",Y="macroTask",C="eventTask",F={},R={symbol:c,currentZoneFrame:function(){return M},onUnhandledError:j,microtaskDrainDone:j,scheduleMicroTask:m,showUncaughtError:function(){return!_[c("ignoreConsoleErrorUncaughtError")]},patchEventTarget:function(){return[]},patchOnProperties:j,patchMethod:function(){return j},bindArguments:function(){return[]},patchThen:function(){return j},patchMacroTask:function(){return j},setNativePromise:function(h){h&&"function"==typeof h.resolve&&(z=h.resolve(0))},patchEventPrototype:function(){return j},isIEOrEdge:function(){return!1},getGlobalObjects:function(){},ObjectDefineProperty:function(){return j},ObjectGetOwnPropertyDescriptor:function(){},ObjectCreate:function(){},ArraySlice:function(){return[]},patchClass:function(){return j},wrapWithCurrentZone:function(){return j},filterProperties:function(){return[]},attachOriginToPatched:function(){return j},_redefineProperty:function(){return j},patchCallbacks:function(){return j}},M={parent:null,zone:new _(null,null)},oe=null,te=0;function j(){}n("Zone","Zone"),e.Zone=_}("undefined"!=typeof window&&window||"undefined"!=typeof self&&self||global),Zone.__load_patch("ZoneAwarePromise",function(e,r,t){var n=Object.getOwnPropertyDescriptor,i=Object.defineProperty;var l=t.symbol,_=[],T=!0===e[l("DISABLE_WRAPPING_UNCAUGHT_PROMISE_REJECTION")],d=l("Promise"),p=l("then");t.onUnhandledError=function(u){if(t.showUncaughtError()){var v=u&&u.rejection;v?console.error("Unhandled Promise rejection:",v instanceof Error?v.message:v,"; Zone:",u.zone.name,"; Task:",u.task&&u.task.source,"; Value:",v,v instanceof Error?v.stack:void 0):console.error(u)}},t.microtaskDrainDone=function(){for(var u=function(){var v=_.shift();try{v.zone.runGuarded(function(){throw v})}catch(f){!function(u){t.onUnhandledError(u);try{var v=r[k];"function"==typeof v&&v.call(this,u)}catch(f){}}(f)}};_.length;)u()};var k=l("unhandledPromiseRejectionHandler");function S(u){return u&&u.then}function Q(u){return u}function z(u){return o.reject(u)}var m=l("state"),y=l("value"),x=l("finally"),A=l("parentPromiseValue"),V=l("parentPromiseState"),P=null,$=!0,I=!1;function Y(u,v){return function(f){try{M(u,v,f)}catch(b){M(u,!1,b)}}}var R=l("currentTaskTrace");function M(u,v,f){var b=function(){var u=!1;return function(f){return function(){u||(u=!0,f.apply(null,arguments))}}}();if(u===f)throw new TypeError("Promise resolved with itself");if(u[m]===P){var L=null;try{("object"==typeof f||"function"==typeof f)&&(L=f&&f.then)}catch(W){return b(function(){M(u,!1,W)})(),u}if(v!==I&&f instanceof o&&f.hasOwnProperty(m)&&f.hasOwnProperty(y)&&f[m]!==P)te(f),M(u,f[m],f[y]);else if(v!==I&&"function"==typeof L)try{L.call(f,b(Y(u,v)),b(Y(u,!1)))}catch(W){b(function(){M(u,!1,W)})()}else{u[m]=v;var Z=u[y];if(u[y]=f,u[x]===x&&v===$&&(u[m]=u[V],u[y]=u[A]),v===I&&f instanceof Error){var D=r.currentTask&&r.currentTask.data&&r.currentTask.data.__creationTrace__;D&&i(f,R,{configurable:!0,enumerable:!1,writable:!0,value:D})}for(var H=0;H<Z.length;)j(u,Z[H++],Z[H++],Z[H++],Z[H++]);if(0==Z.length&&v==I){u[m]=0;var B=f;if(!T)try{throw new Error("Uncaught (in promise): "+function(u){return u&&u.toString===Object.prototype.toString?(u.constructor&&u.constructor.name||"")+": "+JSON.stringify(u):u?u.toString():Object.prototype.toString.call(u)}(f)+(f&&f.stack?"\n"+f.stack:""))}catch(W){B=W}B.rejection=f,B.promise=u,B.zone=r.current,B.task=r.currentTask,_.push(B),t.scheduleMicroTask()}}}return u}var oe=l("rejectionHandledHandler");function te(u){if(0===u[m]){try{var v=r[oe];v&&"function"==typeof v&&v.call(this,{rejection:u[y],promise:u})}catch(b){}u[m]=I;for(var f=0;f<_.length;f++)u===_[f].promise&&_.splice(f,1)}}function j(u,v,f,b,L){te(u);var Z=u[m],D=Z?"function"==typeof b?b:Q:"function"==typeof L?L:z;v.scheduleMicroTask("Promise.then",function(){try{var H=u[y],B=!!f&&x===f[x];B&&(f[A]=H,f[V]=Z);var W=v.run(D,void 0,B&&D!==z&&D!==Q?[]:[H]);M(f,!0,W)}catch(X){M(f,!1,X)}},f)}var a=function(){},o=function(){function u(v){var f=this;if(!(f instanceof u))throw new Error("Must be an instanceof Promise.");f[m]=P,f[y]=[];try{v&&v(Y(f,$),Y(f,I))}catch(b){M(f,!1,b)}}return u.toString=function(){return"function ZoneAwarePromise() { [native code] }"},u.resolve=function(v){return M(new this(null),$,v)},u.reject=function(v){return M(new this(null),I,v)},u.race=function(v){var f,b,L=new this(function(X,K){f=X,b=K});function Z(X){f(X)}function D(X){b(X)}for(var H=0,B=v;H<B.length;H++){var W=B[H];S(W)||(W=this.resolve(W)),W.then(Z,D)}return L},u.all=function(v){return u.allWithCallback(v)},u.allSettled=function(v){return(this&&this.prototype instanceof u?this:u).allWithCallback(v,{thenCallback:function(b){return{status:"fulfilled",value:b}},errorCallback:function(b){return{status:"rejected",reason:b}}})},u.allWithCallback=function(v,f){for(var b,L,Z=new this(function(_e,pe){b=_e,L=pe}),D=2,H=0,B=[],W=function(_e){S(_e)||(_e=X.resolve(_e));var pe=H;try{_e.then(function(se){B[pe]=f?f.thenCallback(se):se,0==--D&&b(B)},function(se){f?(B[pe]=f.errorCallback(se),0==--D&&b(B)):L(se)})}catch(se){L(se)}D++,H++},X=this,K=0,re=v;K<re.length;K++)W(re[K]);return 0==(D-=2)&&b(B),Z},Object.defineProperty(u.prototype,Symbol.toStringTag,{get:function(){return"Promise"},enumerable:!0,configurable:!0}),Object.defineProperty(u.prototype,Symbol.species,{get:function(){return u},enumerable:!0,configurable:!0}),u.prototype.then=function(v,f){var b=this.constructor[Symbol.species];(!b||"function"!=typeof b)&&(b=this.constructor||u);var L=new b(a),Z=r.current;return this[m]==P?this[y].push(Z,L,v,f):j(this,Z,L,v,f),L},u.prototype.catch=function(v){return this.then(null,v)},u.prototype.finally=function(v){var f=this.constructor[Symbol.species];(!f||"function"!=typeof f)&&(f=u);var b=new f(a);b[x]=x;var L=r.current;return this[m]==P?this[y].push(L,b,v,v):j(this,L,b,v,v),b},u}();o.resolve=o.resolve,o.reject=o.reject,o.race=o.race,o.all=o.all;var s=e[d]=e.Promise,w=r.__symbol__("ZoneAwarePromise"),N=n(e,"Promise");(!N||N.configurable)&&(N&&delete N.writable,N&&delete N.value,N||(N={configurable:!0,enumerable:!0}),N.get=function(){return e[w]?e[w]:e[d]},N.set=function(u){u===o?e[w]=u:(e[d]=u,u.prototype[p]||le(u),t.setNativePromise(u))},i(e,"Promise",N)),e.Promise=o;var u,ae=l("thenPatched");function le(u){var v=u.prototype,f=n(v,"then");if(!f||!1!==f.writable&&f.configurable){var b=v.then;v[p]=b,u.prototype.then=function(L,Z){var D=this;return new o(function(B,W){b.call(D,B,W)}).then(L,Z)},u[ae]=!0}}if(t.patchThen=le,s){le(s);var g=e.fetch;"function"==typeof g&&(e[t.symbol("fetch")]=g,e.fetch=(u=g,function(){var v=u.apply(this,arguments);if(v instanceof o)return v;var f=v.constructor;return f[ae]||le(f),v}))}return Promise[r.__symbol__("uncaughtPromiseErrors")]=_,o});var Re=Object.getOwnPropertyDescriptor,Ge=Object.defineProperty,Ve=Object.getPrototypeOf,Or=Object.create,Sr=Array.prototype.slice,Ue="addEventListener",ze="removeEventListener",We=Zone.__symbol__(Ue),Xe=Zone.__symbol__(ze),ue="true",ce="false",Ce=Zone.__symbol__("");function qe(e,r){return Zone.current.wrap(e,r)}function Ye(e,r,t,n,i){return Zone.current.scheduleMacroTask(e,r,t,n,i)}var G=Zone.__symbol__,Ie="undefined"!=typeof window,Te=Ie?window:void 0,J=Ie&&Te||"object"==typeof self&&self||global,Rr=[null];function Ke(e,r){for(var t=e.length-1;t>=0;t--)"function"==typeof e[t]&&(e[t]=qe(e[t],r+"_"+t));return e}function nr(e){return!e||!1!==e.writable&&!("function"==typeof e.get&&void 0===e.set)}var or="undefined"!=typeof WorkerGlobalScope&&self instanceof WorkerGlobalScope,Me=!("nw"in J)&&void 0!==J.process&&"[object process]"==={}.toString.call(J.process),Je=!Me&&!or&&!(!Ie||!Te.HTMLElement),ar=void 0!==J.process&&"[object process]"==={}.toString.call(J.process)&&!or&&!(!Ie||!Te.HTMLElement),Ne={},ir=function(e){if(e=e||J.event){var r=Ne[e.type];r||(r=Ne[e.type]=G("ON_PROPERTY"+e.type));var i,t=this||e.target||J,n=t[r];return Je&&t===Te&&"error"===e.type?!0===(i=n&&n.call(this,e.message,e.filename,e.lineno,e.colno,e.error))&&e.preventDefault():null!=(i=n&&n.apply(this,arguments))&&!i&&e.preventDefault(),i}};function sr(e,r,t){var n=Re(e,r);if(!n&&t&&Re(t,r)&&(n={enumerable:!0,configurable:!0}),n&&n.configurable){var c=G("on"+r+"patched");if(!e.hasOwnProperty(c)||!e[c]){delete n.writable,delete n.value;var l=n.get,_=n.set,T=r.substr(2),d=Ne[T];d||(d=Ne[T]=G("ON_PROPERTY"+T)),n.set=function(p){var E=this;!E&&e===J&&(E=J),E&&(E[d]&&E.removeEventListener(T,ir),_&&_.apply(E,Rr),"function"==typeof p?(E[d]=p,E.addEventListener(T,ir,!1)):E[d]=null)},n.get=function(){var p=this;if(!p&&e===J&&(p=J),!p)return null;var E=p[d];if(E)return E;if(l){var k=l&&l.call(this);if(k)return n.set.call(this,k),"function"==typeof p.removeAttribute&&p.removeAttribute(r),k}return null},Ge(e,r,n),e[c]=!0}}}function ur(e,r,t){if(r)for(var n=0;n<r.length;n++)sr(e,"on"+r[n],t);else{var i=[];for(var c in e)"on"==c.substr(0,2)&&i.push(c);for(var l=0;l<i.length;l++)sr(e,i[l],t)}}var ie=G("originalInstance");function De(e){var r=J[e];if(r){J[G(e)]=r,J[e]=function(){var i=Ke(arguments,e);switch(i.length){case 0:this[ie]=new r;break;case 1:this[ie]=new r(i[0]);break;case 2:this[ie]=new r(i[0],i[1]);break;case 3:this[ie]=new r(i[0],i[1],i[2]);break;case 4:this[ie]=new r(i[0],i[1],i[2],i[3]);break;default:throw new Error("Arg list too long.")}},fe(J[e],r);var n,t=new r(function(){});for(n in t)"XMLHttpRequest"===e&&"responseBlob"===n||function(i){"function"==typeof t[i]?J[e].prototype[i]=function(){return this[ie][i].apply(this[ie],arguments)}:Ge(J[e].prototype,i,{set:function(c){"function"==typeof c?(this[ie][i]=qe(c,e+"."+i),fe(this[ie][i],c)):this[ie][i]=c},get:function(){return this[ie][i]}})}(n);for(n in r)"prototype"!==n&&r.hasOwnProperty(n)&&(J[e][n]=r[n])}}function he(e,r,t){for(var n=e;n&&!n.hasOwnProperty(r);)n=Ve(n);!n&&e[r]&&(n=e);var i=G(r),c=null;if(n&&!(c=n[i])&&(c=n[i]=n[r],nr(n&&Re(n,r)))){var _=t(c,i,r);n[r]=function(){return _(this,arguments)},fe(n[r],c)}return c}function Lr(e,r,t){var n=null;function i(c){var l=c.data;return l.args[l.cbIdx]=function(){c.invoke.apply(this,arguments)},n.apply(l.target,l.args),c}n=he(e,r,function(c){return function(l,_){var T=t(l,_);return T.cbIdx>=0&&"function"==typeof _[T.cbIdx]?Ye(T.name,_[T.cbIdx],T,i):c.apply(l,_)}})}function fe(e,r){e[G("OriginalDelegate")]=r}var cr=!1,Qe=!1;function Ir(){try{var e=Te.navigator.userAgent;if(-1!==e.indexOf("MSIE ")||-1!==e.indexOf("Trident/"))return!0}catch(r){}return!1}function Mr(){if(cr)return Qe;cr=!0;try{var e=Te.navigator.userAgent;(-1!==e.indexOf("MSIE ")||-1!==e.indexOf("Trident/")||-1!==e.indexOf("Edge/"))&&(Qe=!0)}catch(r){}return Qe}Zone.__load_patch("toString",function(e){var r=Function.prototype.toString,t=G("OriginalDelegate"),n=G("Promise"),i=G("Error"),c=function(){if("function"==typeof this){var d=this[t];if(d)return"function"==typeof d?r.call(d):Object.prototype.toString.call(d);if(this===Promise){var p=e[n];if(p)return r.call(p)}if(this===Error){var E=e[i];if(E)return r.call(E)}}return r.call(this)};c[t]=r,Function.prototype.toString=c;var l=Object.prototype.toString;Object.prototype.toString=function(){return this instanceof Promise?"[object Promise]":l.call(this)}});var ge=!1;if("undefined"!=typeof window)try{var Ae=Object.defineProperty({},"passive",{get:function(){ge=!0}});window.addEventListener("test",Ae,Ae),window.removeEventListener("test",Ae,Ae)}catch(e){ge=!1}var Nr={useG:!0},ne={},fr={},lr=new RegExp("^"+Ce+"(\\w+)(true|false)$"),$e=G("propagationStopped");function vr(e,r){var t=(r?r(e):e)+ce,n=(r?r(e):e)+ue,i=Ce+t,c=Ce+n;ne[e]={},ne[e][ce]=i,ne[e][ue]=c}function Ar(e,r,t){var n=t&&t.add||Ue,i=t&&t.rm||ze,c=t&&t.listeners||"eventListeners",l=t&&t.rmAll||"removeAllListeners",_=G(n),T="."+n+":",d="prependListener",E=function(m,y,x){if(!m.isRemoved){var A=m.callback;"object"==typeof A&&A.handleEvent&&(m.callback=function(P){return A.handleEvent(P)},m.originalDelegate=A),m.invoke(m,y,[x]);var V=m.options;V&&"object"==typeof V&&V.once&&y[i].call(y,x.type,m.originalDelegate?m.originalDelegate:m.callback,V)}},k=function(m){if(m=m||e.event){var y=this||m.target||e,x=y[ne[m.type][ce]];if(x)if(1===x.length)E(x[0],y,m);else for(var A=x.slice(),V=0;V<A.length&&(!m||!0!==m[$e]);V++)E(A[V],y,m)}},O=function(m){if(m=m||e.event){var y=this||m.target||e,x=y[ne[m.type][ue]];if(x)if(1===x.length)E(x[0],y,m);else for(var A=x.slice(),V=0;V<A.length&&(!m||!0!==m[$e]);V++)E(A[V],y,m)}};function S(m,y){if(!m)return!1;var x=!0;y&&void 0!==y.useG&&(x=y.useG);var A=y&&y.vh,V=!0;y&&void 0!==y.chkDup&&(V=y.chkDup);var U=!1;y&&void 0!==y.rt&&(U=y.rt);for(var P=m;P&&!P.hasOwnProperty(n);)P=Ve(P);if(!P&&m[n]&&(P=m),!P||P[_])return!1;var R,$=y&&y.eventNameToString,I={},ee=P[_]=P[n],Y=P[G(i)]=P[i],C=P[G(c)]=P[c],F=P[G(l)]=P[l];function M(g,u){return!ge&&"object"==typeof g&&g?!!g.capture:ge&&u?"boolean"==typeof g?{capture:g,passive:!0}:g?"object"==typeof g&&!1!==g.passive?Object.assign(Object.assign({},g),{passive:!0}):g:{passive:!0}:g}y&&y.prepend&&(R=P[G(y.prepend)]=P[y.prepend]);var o=x?function(g){if(!I.isExisting)return ee.call(I.target,I.eventName,I.capture?O:k,I.options)}:function(g){return ee.call(I.target,I.eventName,g.invoke,I.options)},s=x?function(g){if(!g.isRemoved){var u=ne[g.eventName],v=void 0;u&&(v=u[g.capture?ue:ce]);var f=v&&g.target[v];if(f)for(var b=0;b<f.length;b++)if(f[b]===g){f.splice(b,1),g.isRemoved=!0,0===f.length&&(g.allRemoved=!0,g.target[v]=null);break}}if(g.allRemoved)return Y.call(g.target,g.eventName,g.capture?O:k,g.options)}:function(g){return Y.call(g.target,g.eventName,g.invoke,g.options)},N=y&&y.diff?y.diff:function(g,u){var v=typeof u;return"function"===v&&g.callback===u||"object"===v&&g.originalDelegate===u},ae=Zone[G("BLACK_LISTED_EVENTS")],le=e[G("PASSIVE_EVENTS")],Be=function(g,u,v,f,b,L){return void 0===b&&(b=!1),void 0===L&&(L=!1),function(){var Z=this||e,D=arguments[0];y&&y.transferEventName&&(D=y.transferEventName(D));var H=arguments[1];if(!H)return g.apply(this,arguments);if(Me&&"uncaughtException"===D)return g.apply(this,arguments);var B=!1;if("function"!=typeof H){if(!H.handleEvent)return g.apply(this,arguments);B=!0}if(!A||A(g,H,Z,arguments)){var W=ge&&!!le&&-1!==le.indexOf(D),X=M(arguments[2],W);if(ae)for(var K=0;K<ae.length;K++)if(D===ae[K])return W?g.call(Z,D,H,X):g.apply(this,arguments);var re=!!X&&("boolean"==typeof X||X.capture),de=!(!X||"object"!=typeof X)&&X.once,_e=Zone.current,pe=ne[D];pe||(vr(D,$),pe=ne[D]);var se=pe[re?ue:ce],Oe=Z[se],br=!1;if(Oe){if(br=!0,V)for(K=0;K<Oe.length;K++)if(N(Oe[K],H))return}else Oe=Z[se]=[];var Fe,kr=Z.constructor.name,Pr=fr[kr];Pr&&(Fe=Pr[D]),Fe||(Fe=kr+u+($?$(D):D)),I.options=X,de&&(I.options.once=!1),I.target=Z,I.capture=re,I.eventName=D,I.isExisting=br;var Ze=x?Nr:void 0;Ze&&(Ze.taskData=I);var Ee=_e.scheduleEventTask(Fe,H,Ze,v,f);if(I.target=null,Ze&&(Ze.taskData=null),de&&(X.once=!0),!ge&&"boolean"==typeof Ee.options||(Ee.options=X),Ee.target=Z,Ee.capture=re,Ee.eventName=D,B&&(Ee.originalDelegate=H),L?Oe.unshift(Ee):Oe.push(Ee),b)return Z}}};return P[n]=Be(ee,T,o,s,U),R&&(P[d]=Be(R,".prependListener:",function(g){return R.call(I.target,I.eventName,g.invoke,I.options)},s,U,!0)),P[i]=function(){var g=this||e,u=arguments[0];y&&y.transferEventName&&(u=y.transferEventName(u));var v=arguments[2],f=!!v&&("boolean"==typeof v||v.capture),b=arguments[1];if(!b)return Y.apply(this,arguments);if(!A||A(Y,b,g,arguments)){var Z,L=ne[u];L&&(Z=L[f?ue:ce]);var D=Z&&g[Z];if(D)for(var H=0;H<D.length;H++){var B=D[H];if(N(B,b))return D.splice(H,1),B.isRemoved=!0,0===D.length&&(B.allRemoved=!0,g[Z]=null,"string"==typeof u)&&(g[Ce+"ON_PROPERTY"+u]=null),B.zone.cancelTask(B),U?g:void 0}return Y.apply(this,arguments)}},P[c]=function(){var g=this||e,u=arguments[0];y&&y.transferEventName&&(u=y.transferEventName(u));for(var v=[],f=hr(g,$?$(u):u),b=0;b<f.length;b++){var L=f[b];v.push(L.originalDelegate?L.originalDelegate:L.callback)}return v},P[l]=function(){var g=this||e,u=arguments[0];if(u){y&&y.transferEventName&&(u=y.transferEventName(u));var D=ne[u];if(D){var W=g[D[ce]],X=g[D[ue]];if(W)for(var K=W.slice(),f=0;f<K.length;f++)this[i].call(this,u,(re=K[f]).originalDelegate?re.originalDelegate:re.callback,re.options);if(X)for(K=X.slice(),f=0;f<K.length;f++){var re;this[i].call(this,u,(re=K[f]).originalDelegate?re.originalDelegate:re.callback,re.options)}}}else{var v=Object.keys(g);for(f=0;f<v.length;f++){var L=lr.exec(v[f]),Z=L&&L[1];Z&&"removeListener"!==Z&&this[l].call(this,Z)}this[l].call(this,"removeListener")}if(U)return this},fe(P[n],ee),fe(P[i],Y),F&&fe(P[l],F),C&&fe(P[c],C),!0}for(var Q=[],z=0;z<r.length;z++)Q[z]=S(r[z],t);return Q}function hr(e,r){if(!r){var t=[];for(var n in e){var i=lr.exec(n),c=i&&i[1];if(c&&(!r||c===r)){var l=e[n];if(l)for(var _=0;_<l.length;_++)t.push(l[_])}}return t}var T=ne[r];T||(vr(r),T=ne[r]);var d=e[T[ce]],p=e[T[ue]];return d?p?d.concat(p):d.slice():p?p.slice():[]}function jr(e,r){var t=e.Event;t&&t.prototype&&r.patchMethod(t.prototype,"stopImmediatePropagation",function(n){return function(i,c){i[$e]=!0,n&&n.apply(i,c)}})}function Hr(e,r,t,n,i){var c=Zone.__symbol__(n);if(!r[c]){var l=r[c]=r[n];r[n]=function(_,T,d){return T&&T.prototype&&i.forEach(function(p){var E=t+"."+n+"::"+p,k=T.prototype;if(k.hasOwnProperty(p)){var O=e.ObjectGetOwnPropertyDescriptor(k,p);O&&O.value?(O.value=e.wrapWithCurrentZone(O.value,E),e._redefineProperty(T.prototype,p,O)):k[p]&&(k[p]=e.wrapWithCurrentZone(k[p],E))}else k[p]&&(k[p]=e.wrapWithCurrentZone(k[p],E))}),l.call(r,_,T,d)},e.attachOriginToPatched(r[n],l)}}var je,He,yr,mr,ye,e,n,er=["absolutedeviceorientation","afterinput","afterprint","appinstalled","beforeinstallprompt","beforeprint","beforeunload","devicelight","devicemotion","deviceorientation","deviceorientationabsolute","deviceproximity","hashchange","languagechange","message","mozbeforepaint","offline","online","paint","pageshow","pagehide","popstate","rejectionhandled","storage","unhandledrejection","unload","userproximity","vrdisplayconnected","vrdisplaydisconnected","vrdisplaypresentchange"],Gr=["encrypted","waitingforkey","msneedkey","mozinterruptbegin","mozinterruptend"],dr=["load"],_r=["blur","error","focus","load","resize","scroll","messageerror"],Xr=["bounce","finish","start"],pr=["loadstart","progress","abort","error","load","progress","timeout","loadend","readystatechange"],be=["upgradeneeded","complete","abort","success","error","blocked","versionchange","close"],qr=["close","error","open","message"],Yr=["error","message"],ke=["abort","animationcancel","animationend","animationiteration","auxclick","beforeinput","blur","cancel","canplay","canplaythrough","change","compositionstart","compositionupdate","compositionend","cuechange","click","close","contextmenu","curechange","dblclick","drag","dragend","dragenter","dragexit","dragleave","dragover","drop","durationchange","emptied","ended","error","focus","focusin","focusout","gotpointercapture","input","invalid","keydown","keypress","keyup","load","loadstart","loadeddata","loadedmetadata","lostpointercapture","mousedown","mouseenter","mouseleave","mousemove","mouseout","mouseover","mouseup","mousewheel","orientationchange","pause","play","playing","pointercancel","pointerdown","pointerenter","pointerleave","pointerlockchange","mozpointerlockchange","webkitpointerlockerchange","pointerlockerror","mozpointerlockerror","webkitpointerlockerror","pointermove","pointout","pointerover","pointerup","progress","ratechange","reset","resize","scroll","seeked","seeking","select","selectionchange","selectstart","show","sort","stalled","submit","suspend","timeupdate","volumechange","touchcancel","touchmove","touchstart","touchend","transitioncancel","transitionend","waiting","wheel"].concat(["webglcontextrestored","webglcontextlost","webglcontextcreationerror"],["autocomplete","autocompleteerror"],["toggle"],["afterscriptexecute","beforescriptexecute","DOMContentLoaded","freeze","fullscreenchange","mozfullscreenchange","webkitfullscreenchange","msfullscreenchange","fullscreenerror","mozfullscreenerror","webkitfullscreenerror","msfullscreenerror","readystatechange","visibilitychange","resume"],er,["beforecopy","beforecut","beforepaste","copy","cut","paste","dragstart","loadend","animationstart","search","transitionrun","transitionstart","webkitanimationend","webkitanimationiteration","webkitanimationstart","webkittransitionend"],["activate","afterupdate","ariarequest","beforeactivate","beforedeactivate","beforeeditfocus","beforeupdate","cellchange","controlselect","dataavailable","datasetchanged","datasetcomplete","errorupdate","filterchange","layoutcomplete","losecapture","move","moveend","movestart","propertychange","resizeend","resizestart","rowenter","rowexit","rowsdelete","rowsinserted","command","compassneedscalibration","deactivate","help","mscontentzoom","msmanipulationstatechanged","msgesturechange","msgesturedoubletap","msgestureend","msgesturehold","msgesturestart","msgesturetap","msgotpointercapture","msinertiastart","mslostpointercapture","mspointercancel","mspointerdown","mspointerenter","mspointerhover","mspointerleave","mspointermove","mspointerout","mspointerover","mspointerup","pointerout","mssitemodejumplistitemremoved","msthumbnailclick","stop","storagecommit"]);function Er(e,r,t){if(!t||0===t.length)return r;var n=t.filter(function(c){return c.target===e});if(!n||0===n.length)return r;var i=n[0].ignoreProperties;return r.filter(function(c){return-1===i.indexOf(c)})}function q(e,r,t,n){e&&ur(e,Er(e,r,t),n)}function Kr(e,r){if((!Me||ar)&&!Zone[e.symbol("patchEvents")]){var t="undefined"!=typeof WebSocket,n=r.__Zone_ignore_on_properties;if(Je){var i=window,c=Ir?[{target:i,ignoreProperties:["error"]}]:[];q(i,ke.concat(["messageerror"]),n&&n.concat(c),Ve(i)),q(Document.prototype,ke,n),void 0!==i.SVGElement&&q(i.SVGElement.prototype,ke,n),q(Element.prototype,ke,n),q(HTMLElement.prototype,ke,n),q(HTMLMediaElement.prototype,Gr,n),q(HTMLFrameSetElement.prototype,er.concat(_r),n),q(HTMLBodyElement.prototype,er.concat(_r),n),q(HTMLFrameElement.prototype,dr,n),q(HTMLIFrameElement.prototype,dr,n);var l=i.HTMLMarqueeElement;l&&q(l.prototype,Xr,n);var _=i.Worker;_&&q(_.prototype,Yr,n)}var T=r.XMLHttpRequest;T&&q(T.prototype,pr,n);var d=r.XMLHttpRequestEventTarget;d&&q(d&&d.prototype,pr,n),"undefined"!=typeof IDBIndex&&(q(IDBIndex.prototype,be,n),q(IDBRequest.prototype,be,n),q(IDBOpenDBRequest.prototype,be,n),q(IDBDatabase.prototype,be,n),q(IDBTransaction.prototype,be,n),q(IDBCursor.prototype,be,n)),t&&q(WebSocket.prototype,qr,n)}}function Qr(e,r,t){var n=t.configurable;return gr(e,r,t=rr(e,r,t),n)}function Tr(e,r){return e&&e[ye]&&e[ye][r]}function rr(e,r,t){return Object.isFrozen(t)||(t.configurable=!0),t.configurable||(!e[ye]&&!Object.isFrozen(e)&&He(e,ye,{writable:!0,value:{}}),e[ye]&&(e[ye][r]=!0)),t}function gr(e,r,t,n){try{return He(e,r,t)}catch(c){if(!t.configurable)throw c;void 0===n?delete t.configurable:t.configurable=n;try{return He(e,r,t)}catch(l){var i=null;try{i=JSON.stringify(t)}catch(_){i=t.toString()}console.log("Attempting to configure '"+r+"' with descriptor '"+i+"' on object '"+e+"' and got error, giving up: "+l)}}}function rt(e,r){var t=e.getGlobalObjects();if((!t.isNode||t.isMix)&&!function(e,r){var t=e.getGlobalObjects();if((t.isBrowser||t.isMix)&&!e.ObjectGetOwnPropertyDescriptor(HTMLElement.prototype,"onclick")&&"undefined"!=typeof Element){var c=e.ObjectGetOwnPropertyDescriptor(Element.prototype,"onclick");if(c&&!c.configurable)return!1;if(c){e.ObjectDefineProperty(Element.prototype,"onclick",{enumerable:!0,configurable:!0,get:function(){return!0}});var _=!!document.createElement("div").onclick;return e.ObjectDefineProperty(Element.prototype,"onclick",c),_}}var T=r.XMLHttpRequest;if(!T)return!1;var d="onreadystatechange",p=T.prototype,E=e.ObjectGetOwnPropertyDescriptor(p,d);if(E)return e.ObjectDefineProperty(p,d,{enumerable:!0,configurable:!0,get:function(){return!0}}),_=!!(k=new T).onreadystatechange,e.ObjectDefineProperty(p,d,E||{}),_;var O=e.symbol("fake");e.ObjectDefineProperty(p,d,{enumerable:!0,configurable:!0,get:function(){return this[O]},set:function(m){this[O]=m}});var k,S=function(){};return(k=new T).onreadystatechange=S,_=k[O]===S,k.onreadystatechange=null,_}(e,r)){var c="undefined"!=typeof WebSocket;(function(e){for(var r=e.getGlobalObjects().eventNames,t=e.symbol("unbound"),n=function(c){var l=r[c],_="on"+l;self.addEventListener(l,function(T){var p,E,d=T.target;for(E=d?d.constructor.name+"."+_:"unknown."+_;d;)d[_]&&!d[_][t]&&((p=e.wrapWithCurrentZone(d[_],E))[t]=d[_],d[_]=p),d=d.parentElement},!0)},i=0;i<r.length;i++)n(i)})(e),e.patchClass("XMLHttpRequest"),c&&function(e,r){var t=e.getGlobalObjects(),n=t.ADD_EVENT_LISTENER_STR,i=t.REMOVE_EVENT_LISTENER_STR,c=r.WebSocket;r.EventTarget||e.patchEventTarget(r,[c.prototype]),r.WebSocket=function(T,d){var E,k,p=arguments.length>1?new c(T,d):new c(T),O=e.ObjectGetOwnPropertyDescriptor(p,"onmessage");return O&&!1===O.configurable?(E=e.ObjectCreate(p),k=p,[n,i,"send","close"].forEach(function(S){E[S]=function(){var Q=e.ArraySlice.call(arguments);if(S===n||S===i){var z=Q.length>0?Q[0]:void 0;if(z){var m=Zone.__symbol__("ON_PROPERTY"+z);p[m]=E[m]}}return p[S].apply(p,Q)}})):E=p,e.patchOnProperties(E,["close","error","message","open"],k),E};var l=r.WebSocket;for(var _ in c)l[_]=c[_]}(e,r),Zone[e.symbol("patchEvents")]=!0}}Zone.__load_patch("util",function(e,r,t){t.patchOnProperties=ur,t.patchMethod=he,t.bindArguments=Ke,t.patchMacroTask=Lr;var n=r.__symbol__("BLACK_LISTED_EVENTS"),i=r.__symbol__("UNPATCHED_EVENTS");e[i]&&(e[n]=e[i]),e[n]&&(r[n]=r[i]=e[n]),t.patchEventPrototype=jr,t.patchEventTarget=Ar,t.isIEOrEdge=Mr,t.ObjectDefineProperty=Ge,t.ObjectGetOwnPropertyDescriptor=Re,t.ObjectCreate=Or,t.ArraySlice=Sr,t.patchClass=De,t.wrapWithCurrentZone=qe,t.filterProperties=Er,t.attachOriginToPatched=fe,t._redefineProperty=Object.defineProperty,t.patchCallbacks=Hr,t.getGlobalObjects=function(){return{globalSources:fr,zoneSymbolEventNames:ne,eventNames:ke,isBrowser:Je,isMix:ar,isNode:Me,TRUE_STR:ue,FALSE_STR:ce,ZONE_SYMBOL_PREFIX:Ce,ADD_EVENT_LISTENER_STR:Ue,REMOVE_EVENT_LISTENER_STR:ze}}}),(e="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof self?self:{})[(n="legacyPatch",(e.__Zone_symbol_prefix||"__zone_symbol__")+n)]=function(){var n=e.Zone;n.__load_patch("defineProperty",function(i,c,l){l._redefineProperty=Qr,je=Zone.__symbol__,He=Object[je("defineProperty")]=Object.defineProperty,yr=Object[je("getOwnPropertyDescriptor")]=Object.getOwnPropertyDescriptor,mr=Object.create,ye=je("unconfigurables"),Object.defineProperty=function(e,r,t){if(Tr(e,r))throw new TypeError("Cannot assign to read only property '"+r+"' of "+e);var n=t.configurable;return"prototype"!==r&&(t=rr(e,r,t)),gr(e,r,t,n)},Object.defineProperties=function(e,r){return Object.keys(r).forEach(function(t){Object.defineProperty(e,t,r[t])}),e},Object.create=function(e,r){return"object"==typeof r&&!Object.isFrozen(r)&&Object.keys(r).forEach(function(t){r[t]=rr(e,t,r[t])}),mr(e,r)},Object.getOwnPropertyDescriptor=function(e,r){var t=yr(e,r);return t&&Tr(e,r)&&(t.configurable=!1),t}}),n.__load_patch("registerElement",function(i,c,l){!function(e,r){var t=r.getGlobalObjects();(t.isBrowser||t.isMix)&&"registerElement"in e.document&&r.patchCallbacks(r,document,"Document","registerElement",["createdCallback","attachedCallback","detachedCallback","attributeChangedCallback"])}(i,l)}),n.__load_patch("EventTargetLegacy",function(i,c,l){(function(e,r){var t=r.getGlobalObjects(),n=t.eventNames,i=t.globalSources,c=t.zoneSymbolEventNames,l=t.TRUE_STR,_=t.FALSE_STR,T=t.ZONE_SYMBOL_PREFIX,p="ApplicationCache,EventSource,FileReader,InputMethodContext,MediaController,MessagePort,Node,Performance,SVGElementInstance,SharedWorker,TextTrack,TextTrackCue,TextTrackList,WebKitNamedFlow,Window,Worker,WorkerGlobalScope,XMLHttpRequest,XMLHttpRequestEventTarget,XMLHttpRequestUpload,IDBRequest,IDBOpenDBRequest,IDBDatabase,IDBTransaction,IDBCursor,DBIndex,WebSocket".split(","),E="EventTarget",k=[],O=e.wtf,S="Anchor,Area,Audio,BR,Base,BaseFont,Body,Button,Canvas,Content,DList,Directory,Div,Embed,FieldSet,Font,Form,Frame,FrameSet,HR,Head,Heading,Html,IFrame,Image,Input,Keygen,LI,Label,Legend,Link,Map,Marquee,Media,Menu,Meta,Meter,Mod,OList,Object,OptGroup,Option,Output,Paragraph,Pre,Progress,Quote,Script,Select,Source,Span,Style,TableCaption,TableCell,TableCol,Table,TableRow,TableSection,TextArea,Title,Track,UList,Unknown,Video".split(",");O?k=S.map(function(j){return"HTML"+j+"Element"}).concat(p):e[E]?k.push(E):k=p;for(var Q=e.__Zone_disable_IE_check||!1,z=e.__Zone_enable_cross_context_check||!1,m=r.isIEOrEdge(),x="[object FunctionWrapper]",A="function __BROWSERTOOLS_CONSOLE_SAFEFUNC() { [native code] }",V={MSPointerCancel:"pointercancel",MSPointerDown:"pointerdown",MSPointerEnter:"pointerenter",MSPointerHover:"pointerhover",MSPointerLeave:"pointerleave",MSPointerMove:"pointermove",MSPointerOut:"pointerout",MSPointerOver:"pointerover",MSPointerUp:"pointerup"},U=0;U<n.length;U++){var ee=T+((P=n[U])+_),Y=T+(P+l);c[P]={},c[P][_]=ee,c[P][l]=Y}for(U=0;U<S.length;U++)for(var C=S[U],F=i[C]={},R=0;R<n.length;R++){var P;F[P=n[R]]=C+".addEventListener:"+P}var oe=[];for(U=0;U<k.length;U++){var te=e[k[U]];oe.push(te&&te.prototype)}r.patchEventTarget(e,oe,{vh:function(j,h,a,o){if(!Q&&m)if(z)try{if((s=h.toString())===x||s==A)return j.apply(a,o),!1}catch(w){return j.apply(a,o),!1}else{var s;if((s=h.toString())===x||s==A)return j.apply(a,o),!1}else if(z)try{h.toString()}catch(w){return j.apply(a,o),!1}return!0},transferEventName:function(j){return V[j]||j}}),Zone[r.symbol("patchEventTarget")]=!!e[E]})(i,l),rt(l,i)})};var xe=G("zoneTask");function Pe(e,r,t,n){var i=null,c=null;t+=n;var l={};function _(d){var p=d.data;return p.args[0]=function(){try{d.invoke.apply(this,arguments)}finally{d.data&&d.data.isPeriodic||("number"==typeof p.handleId?delete l[p.handleId]:p.handleId&&(p.handleId[xe]=null))}},p.handleId=i.apply(e,p.args),d}function T(d){return c(d.data.handleId)}i=he(e,r+=n,function(d){return function(p,E){if("function"==typeof E[0]){var O=Ye(r,E[0],{isPeriodic:"Interval"===n,delay:"Timeout"===n||"Interval"===n?E[1]||0:void 0,args:E},_,T);if(!O)return O;var S=O.data.handleId;return"number"==typeof S?l[S]=O:S&&(S[xe]=O),S&&S.ref&&S.unref&&"function"==typeof S.ref&&"function"==typeof S.unref&&(O.ref=S.ref.bind(S),O.unref=S.unref.bind(S)),"number"==typeof S||S?S:O}return d.apply(e,E)}}),c=he(e,t,function(d){return function(p,E){var O,k=E[0];"number"==typeof k?O=l[k]:(O=k&&k[xe])||(O=k),O&&"string"==typeof O.type?"notScheduled"!==O.state&&(O.cancelFn&&O.data.isPeriodic||0===O.runCount)&&("number"==typeof k?delete l[k]:k&&(k[xe]=null),O.zone.cancelTask(O)):d.apply(e,E)}})}Zone.__load_patch("legacy",function(e){var r=e[Zone.__symbol__("legacyPatch")];r&&r()}),Zone.__load_patch("timers",function(e){var r="set",t="clear";Pe(e,r,t,"Timeout"),Pe(e,r,t,"Interval"),Pe(e,r,t,"Immediate")}),Zone.__load_patch("requestAnimationFrame",function(e){Pe(e,"request","cancel","AnimationFrame"),Pe(e,"mozRequest","mozCancel","AnimationFrame"),Pe(e,"webkitRequest","webkitCancel","AnimationFrame")}),Zone.__load_patch("blocking",function(e,r){for(var t=["alert","prompt","confirm"],n=0;n<t.length;n++)he(e,t[n],function(c,l,_){return function(T,d){return r.current.run(c,e,d,_)}})}),Zone.__load_patch("EventTarget",function(e,r,t){(function(e,r){r.patchEventPrototype(e,r)})(e,t),function(e,r){if(!Zone[r.symbol("patchEventTarget")]){for(var t=r.getGlobalObjects(),n=t.eventNames,i=t.zoneSymbolEventNames,c=t.TRUE_STR,l=t.FALSE_STR,_=t.ZONE_SYMBOL_PREFIX,T=0;T<n.length;T++){var d=n[T],k=_+(d+l),O=_+(d+c);i[d]={},i[d][l]=k,i[d][c]=O}var S=e.EventTarget;if(S&&S.prototype)r.patchEventTarget(e,[S&&S.prototype])}}(e,t);var n=e.XMLHttpRequestEventTarget;n&&n.prototype&&t.patchEventTarget(e,[n.prototype]),De("MutationObserver"),De("WebKitMutationObserver"),De("IntersectionObserver"),De("FileReader")}),Zone.__load_patch("on_property",function(e,r,t){Kr(t,e)}),Zone.__load_patch("customElements",function(e,r,t){!function(e,r){var t=r.getGlobalObjects();(t.isBrowser||t.isMix)&&e.customElements&&"customElements"in e&&r.patchCallbacks(r,e.customElements,"customElements","define",["connectedCallback","disconnectedCallback","adoptedCallback","attributeChangedCallback"])}(e,t)}),Zone.__load_patch("XHR",function(e,r){!function(d){var p=d.XMLHttpRequest;if(p){var E=p.prototype,O=E[We],S=E[Xe];if(!O){var Q=d.XMLHttpRequestEventTarget;if(Q){var z=Q.prototype;O=z[We],S=z[Xe]}}var m="readystatechange",y="scheduled",U=he(E,"open",function(){return function(C,F){return C[n]=0==F[2],C[l]=F[1],U.apply(C,F)}}),$=G("fetchTaskAborting"),I=G("fetchTaskScheduling"),ee=he(E,"send",function(){return function(C,F){if(!0===r.current[I]||C[n])return ee.apply(C,F);var R={target:C,url:C[l],isPeriodic:!1,args:F,aborted:!1},M=Ye("XMLHttpRequest.send",A,R,x,V);C&&!0===C[_]&&!R.aborted&&M.state===y&&M.invoke()}}),Y=he(E,"abort",function(){return function(C,F){var R=function(C){return C[t]}(C);if(R&&"string"==typeof R.type){if(null==R.cancelFn||R.data&&R.data.aborted)return;R.zone.cancelTask(R)}else if(!0===r.current[$])return Y.apply(C,F)}})}function x(C){var F=C.data,R=F.target;R[c]=!1,R[_]=!1;var M=R[i];O||(O=R[We],S=R[Xe]),M&&S.call(R,m,M);var oe=R[i]=function(){if(R.readyState===R.DONE)if(!F.aborted&&R[c]&&C.state===y){var j=R[r.__symbol__("loadfalse")];if(j&&j.length>0){var h=C.invoke;C.invoke=function(){for(var a=R[r.__symbol__("loadfalse")],o=0;o<a.length;o++)a[o]===C&&a.splice(o,1);!F.aborted&&C.state===y&&h.call(C)},j.push(C)}else C.invoke()}else!F.aborted&&!1===R[c]&&(R[_]=!0)};return O.call(R,m,oe),R[t]||(R[t]=C),ee.apply(R,F.args),R[c]=!0,C}function A(){}function V(C){var F=C.data;return F.aborted=!0,Y.apply(F.target,F.args)}}(e);var t=G("xhrTask"),n=G("xhrSync"),i=G("xhrListener"),c=G("xhrScheduled"),l=G("xhrURL"),_=G("xhrErrorBeforeScheduled")}),Zone.__load_patch("geolocation",function(e){e.navigator&&e.navigator.geolocation&&function(e,r){for(var t=e.constructor.name,n=function(c){var d,p,l=r[c],_=e[l];if(_){if(!nr(Re(e,l)))return"continue";e[l]=(fe(p=function(){return d.apply(this,Ke(arguments,t+"."+l))},d=_),p)}},i=0;i<r.length;i++)n(i)}(e.navigator.geolocation,["getCurrentPosition","watchPosition"])}),Zone.__load_patch("PromiseRejectionEvent",function(e,r){function t(n){return function(i){hr(e,n).forEach(function(l){var _=e.PromiseRejectionEvent;if(_){var T=new _(n,{promise:i.promise,reason:i.rejection});l.invoke(T)}})}}e.PromiseRejectionEvent&&(r[G("unhandledPromiseRejectionHandler")]=t("unhandledrejection"),r[G("rejectionHandledHandler")]=t("rejectionhandled"))})})?ve.call(Se,we,Se,me):ve)&&(me.exports=Le)},7435:(me,Se,we)=>{"use strict";we(99140)}},me=>{me(me.s=7435)}]);
\ No newline at end of file
diff --git a/ceph/src/pybind/mgr/dashboard/frontend/dist/en-US/polyfills.4b60b22744014b0b.js b/ceph/src/pybind/mgr/dashboard/frontend/dist/en-US/polyfills.4b60b22744014b0b.js
new file mode 100644 (file)
index 0000000..66e5d2e
--- /dev/null
@@ -0,0 +1 @@
+(self.webpackChunkceph_dashboard=self.webpackChunkceph_dashboard||[]).push([[429],{99140:function(ke,Ce,me){"use strict";var ye,Le,se=this&&this.__spreadArray||function(le,fe,De){if(De||2===arguments.length)for(var ve,Te=0,Ve=fe.length;Te<Ve;Te++)(ve||!(Te in fe))&&(ve||(ve=Array.prototype.slice.call(fe,0,Te)),ve[Te]=fe[Te]);return le.concat(ve||Array.prototype.slice.call(fe))};ye=function(){!function(e){var r=e.performance;function t(v){r&&r.mark&&r.mark(v)}function n(v,o){r&&r.measure&&r.measure(v,o)}t("Zone");var u=e.__Zone_symbol_prefix||"__zone_symbol__";function c(v){return u+v}var f=!0===e[c("forceDuplicateZoneCheck")];if(e.Zone){if(f||"function"!=typeof e.Zone.__symbol__)throw new Error("Zone already loaded.");return e.Zone}var d=function(){function v(o,a){this._parent=o,this._name=a?a.name||"unnamed":"<root>",this._properties=a&&a.properties||{},this._zoneDelegate=new T(this,this._parent&&this._parent._zoneDelegate,a)}return v.assertZonePatched=function(){if(e.Promise!==S.ZoneAwarePromise)throw new Error("Zone.js has detected that ZoneAwarePromise `(window|global).Promise` has been overwritten.\nMost likely cause is that a Promise polyfill has been loaded after Zone.js (Polyfilling Promise api is not necessary when zone.js is loaded. If you must load one, do so before loading zone.js.)")},Object.defineProperty(v,"root",{get:function(){for(var o=v.current;o.parent;)o=o.parent;return o},enumerable:!1,configurable:!0}),Object.defineProperty(v,"current",{get:function(){return W.zone},enumerable:!1,configurable:!0}),Object.defineProperty(v,"currentTask",{get:function(){return ae},enumerable:!1,configurable:!0}),v.__load_patch=function(o,a,i){if(void 0===i&&(i=!1),S.hasOwnProperty(o)){if(!i&&f)throw Error("Already loaded patch: "+o)}else if(!e["__Zone_disable_"+o]){var P="Zone:"+o;t(P),S[o]=a(e,v,X),n(P,P)}},Object.defineProperty(v.prototype,"parent",{get:function(){return this._parent},enumerable:!1,configurable:!0}),Object.defineProperty(v.prototype,"name",{get:function(){return this._name},enumerable:!1,configurable:!0}),v.prototype.get=function(o){var a=this.getZoneWith(o);if(a)return a._properties[o]},v.prototype.getZoneWith=function(o){for(var a=this;a;){if(a._properties.hasOwnProperty(o))return a;a=a._parent}return null},v.prototype.fork=function(o){if(!o)throw new Error("ZoneSpec required!");return this._zoneDelegate.fork(this,o)},v.prototype.wrap=function(o,a){if("function"!=typeof o)throw new Error("Expecting function got: "+o);var i=this._zoneDelegate.intercept(this,o,a),P=this;return function(){return P.runGuarded(i,this,arguments,a)}},v.prototype.run=function(o,a,i,P){W={parent:W,zone:this};try{return this._zoneDelegate.invoke(this,o,a,i,P)}finally{W=W.parent}},v.prototype.runGuarded=function(o,a,i,P){void 0===a&&(a=null),W={parent:W,zone:this};try{try{return this._zoneDelegate.invoke(this,o,a,i,P)}catch(q){if(this._zoneDelegate.handleError(this,q))throw q}}finally{W=W.parent}},v.prototype.runTask=function(o,a,i){if(o.zone!=this)throw new Error("A task can only be run in the zone of creation! (Creation: "+(o.zone||b).name+"; Execution: "+this.name+")");if(o.state!==U||o.type!==N&&o.type!==O){var P=o.state!=F;P&&o._transitionTo(F,B),o.runCount++;var q=ae;ae=o,W={parent:W,zone:this};try{o.type==O&&o.data&&!o.data.isPeriodic&&(o.cancelFn=void 0);try{return this._zoneDelegate.invokeTask(this,o,a,i)}catch(ce){if(this._zoneDelegate.handleError(this,ce))throw ce}}finally{o.state!==U&&o.state!==z&&(o.type==N||o.data&&o.data.isPeriodic?P&&o._transitionTo(B,F):(o.runCount=0,this._updateTaskCount(o,-1),P&&o._transitionTo(U,F,U))),W=W.parent,ae=q}}},v.prototype.scheduleTask=function(o){if(o.zone&&o.zone!==this)for(var a=this;a;){if(a===o.zone)throw Error("can not reschedule task to ".concat(this.name," which is descendants of the original zone ").concat(o.zone.name));a=a.parent}o._transitionTo(x,U);var i=[];o._zoneDelegates=i,o._zone=this;try{o=this._zoneDelegate.scheduleTask(this,o)}catch(P){throw o._transitionTo(z,x,U),this._zoneDelegate.handleError(this,P),P}return o._zoneDelegates===i&&this._updateTaskCount(o,1),o.state==x&&o._transitionTo(B,x),o},v.prototype.scheduleMicroTask=function(o,a,i,P){return this.scheduleTask(new p(Z,o,a,i,P,void 0))},v.prototype.scheduleMacroTask=function(o,a,i,P,q){return this.scheduleTask(new p(O,o,a,i,P,q))},v.prototype.scheduleEventTask=function(o,a,i,P,q){return this.scheduleTask(new p(N,o,a,i,P,q))},v.prototype.cancelTask=function(o){if(o.zone!=this)throw new Error("A task can only be cancelled in the zone of creation! (Creation: "+(o.zone||b).name+"; Execution: "+this.name+")");o._transitionTo(k,B,F);try{this._zoneDelegate.cancelTask(this,o)}catch(a){throw o._transitionTo(z,k),this._zoneDelegate.handleError(this,a),a}return this._updateTaskCount(o,-1),o._transitionTo(U,k),o.runCount=0,o},v.prototype._updateTaskCount=function(o,a){var i=o._zoneDelegates;-1==a&&(o._zoneDelegates=null);for(var P=0;P<i.length;P++)i[P]._updateTaskCount(o.type,a)},v}();d.__symbol__=c;var $,E={name:"",onHasTask:function(v,o,a,i){return v.hasTask(a,i)},onScheduleTask:function(v,o,a,i){return v.scheduleTask(a,i)},onInvokeTask:function(v,o,a,i,P,q){return v.invokeTask(a,i,P,q)},onCancelTask:function(v,o,a,i){return v.cancelTask(a,i)}},T=function(){function v(o,a,i){this._taskCounts={microTask:0,macroTask:0,eventTask:0},this.zone=o,this._parentDelegate=a,this._forkZS=i&&(i&&i.onFork?i:a._forkZS),this._forkDlgt=i&&(i.onFork?a:a._forkDlgt),this._forkCurrZone=i&&(i.onFork?this.zone:a._forkCurrZone),this._interceptZS=i&&(i.onIntercept?i:a._interceptZS),this._interceptDlgt=i&&(i.onIntercept?a:a._interceptDlgt),this._interceptCurrZone=i&&(i.onIntercept?this.zone:a._interceptCurrZone),this._invokeZS=i&&(i.onInvoke?i:a._invokeZS),this._invokeDlgt=i&&(i.onInvoke?a:a._invokeDlgt),this._invokeCurrZone=i&&(i.onInvoke?this.zone:a._invokeCurrZone),this._handleErrorZS=i&&(i.onHandleError?i:a._handleErrorZS),this._handleErrorDlgt=i&&(i.onHandleError?a:a._handleErrorDlgt),this._handleErrorCurrZone=i&&(i.onHandleError?this.zone:a._handleErrorCurrZone),this._scheduleTaskZS=i&&(i.onScheduleTask?i:a._scheduleTaskZS),this._scheduleTaskDlgt=i&&(i.onScheduleTask?a:a._scheduleTaskDlgt),this._scheduleTaskCurrZone=i&&(i.onScheduleTask?this.zone:a._scheduleTaskCurrZone),this._invokeTaskZS=i&&(i.onInvokeTask?i:a._invokeTaskZS),this._invokeTaskDlgt=i&&(i.onInvokeTask?a:a._invokeTaskDlgt),this._invokeTaskCurrZone=i&&(i.onInvokeTask?this.zone:a._invokeTaskCurrZone),this._cancelTaskZS=i&&(i.onCancelTask?i:a._cancelTaskZS),this._cancelTaskDlgt=i&&(i.onCancelTask?a:a._cancelTaskDlgt),this._cancelTaskCurrZone=i&&(i.onCancelTask?this.zone:a._cancelTaskCurrZone),this._hasTaskZS=null,this._hasTaskDlgt=null,this._hasTaskDlgtOwner=null,this._hasTaskCurrZone=null;var P=i&&i.onHasTask;(P||a&&a._hasTaskZS)&&(this._hasTaskZS=P?i:E,this._hasTaskDlgt=a,this._hasTaskDlgtOwner=this,this._hasTaskCurrZone=o,i.onScheduleTask||(this._scheduleTaskZS=E,this._scheduleTaskDlgt=a,this._scheduleTaskCurrZone=this.zone),i.onInvokeTask||(this._invokeTaskZS=E,this._invokeTaskDlgt=a,this._invokeTaskCurrZone=this.zone),i.onCancelTask||(this._cancelTaskZS=E,this._cancelTaskDlgt=a,this._cancelTaskCurrZone=this.zone))}return v.prototype.fork=function(o,a){return this._forkZS?this._forkZS.onFork(this._forkDlgt,this.zone,o,a):new d(o,a)},v.prototype.intercept=function(o,a,i){return this._interceptZS?this._interceptZS.onIntercept(this._interceptDlgt,this._interceptCurrZone,o,a,i):a},v.prototype.invoke=function(o,a,i,P,q){return this._invokeZS?this._invokeZS.onInvoke(this._invokeDlgt,this._invokeCurrZone,o,a,i,P,q):a.apply(i,P)},v.prototype.handleError=function(o,a){return!this._handleErrorZS||this._handleErrorZS.onHandleError(this._handleErrorDlgt,this._handleErrorCurrZone,o,a)},v.prototype.scheduleTask=function(o,a){var i=a;if(this._scheduleTaskZS)this._hasTaskZS&&i._zoneDelegates.push(this._hasTaskDlgtOwner),(i=this._scheduleTaskZS.onScheduleTask(this._scheduleTaskDlgt,this._scheduleTaskCurrZone,o,a))||(i=a);else if(a.scheduleFn)a.scheduleFn(a);else{if(a.type!=Z)throw new Error("Task is missing scheduleFn.");J(a)}return i},v.prototype.invokeTask=function(o,a,i,P){return this._invokeTaskZS?this._invokeTaskZS.onInvokeTask(this._invokeTaskDlgt,this._invokeTaskCurrZone,o,a,i,P):a.callback.apply(i,P)},v.prototype.cancelTask=function(o,a){var i;if(this._cancelTaskZS)i=this._cancelTaskZS.onCancelTask(this._cancelTaskDlgt,this._cancelTaskCurrZone,o,a);else{if(!a.cancelFn)throw Error("Task is not cancelable");i=a.cancelFn(a)}return i},v.prototype.hasTask=function(o,a){try{this._hasTaskZS&&this._hasTaskZS.onHasTask(this._hasTaskDlgt,this._hasTaskCurrZone,o,a)}catch(i){this.handleError(o,i)}},v.prototype._updateTaskCount=function(o,a){var i=this._taskCounts,P=i[o],q=i[o]=P+a;if(q<0)throw new Error("More tasks executed then were scheduled.");0!=P&&0!=q||this.hasTask(this.zone,{microTask:i.microTask>0,macroTask:i.macroTask>0,eventTask:i.eventTask>0,change:o})},v}(),p=function(){function v(o,a,i,P,q,ce){if(this._zone=null,this.runCount=0,this._zoneDelegates=null,this._state="notScheduled",this.type=o,this.source=a,this.data=P,this.scheduleFn=q,this.cancelFn=ce,!i)throw new Error("callback is not defined");this.callback=i;var l=this;this.invoke=o===N&&P&&P.useG?v.invokeTask:function(){return v.invokeTask.call(e,l,this,arguments)}}return v.invokeTask=function(o,a,i){o||(o=this),Q++;try{return o.runCount++,o.zone.runTask(o,a,i)}finally{1==Q&&A(),Q--}},Object.defineProperty(v.prototype,"zone",{get:function(){return this._zone},enumerable:!1,configurable:!0}),Object.defineProperty(v.prototype,"state",{get:function(){return this._state},enumerable:!1,configurable:!0}),v.prototype.cancelScheduleRequest=function(){this._transitionTo(U,x)},v.prototype._transitionTo=function(o,a,i){if(this._state!==a&&this._state!==i)throw new Error("".concat(this.type," '").concat(this.source,"': can not transition to '").concat(o,"', expecting state '").concat(a,"'").concat(i?" or '"+i+"'":"",", was '").concat(this._state,"'."));this._state=o,o==U&&(this._zoneDelegates=null)},v.prototype.toString=function(){return this.data&&void 0!==this.data.handleId?this.data.handleId.toString():Object.prototype.toString.call(this)},v.prototype.toJSON=function(){return{type:this.type,state:this.state,source:this.source,zone:this.zone.name,runCount:this.runCount}},v}(),m=c("setTimeout"),g=c("Promise"),C=c("then"),D=[],H=!1;function V(v){if($||e[g]&&($=e[g].resolve(0)),$){var o=$[C];o||(o=$.then),o.call($,v)}else e[m](v,0)}function J(v){0===Q&&0===D.length&&V(A),v&&D.push(v)}function A(){if(!H){for(H=!0;D.length;){var v=D;D=[];for(var o=0;o<v.length;o++){var a=v[o];try{a.zone.runTask(a,null,null)}catch(i){X.onUnhandledError(i)}}}X.microtaskDrainDone(),H=!1}}var b={name:"NO ZONE"},U="notScheduled",x="scheduling",B="scheduled",F="running",k="canceling",z="unknown",Z="microTask",O="macroTask",N="eventTask",S={},X={symbol:c,currentZoneFrame:function(){return W},onUnhandledError:Y,microtaskDrainDone:Y,scheduleMicroTask:J,showUncaughtError:function(){return!d[c("ignoreConsoleErrorUncaughtError")]},patchEventTarget:function(){return[]},patchOnProperties:Y,patchMethod:function(){return Y},bindArguments:function(){return[]},patchThen:function(){return Y},patchMacroTask:function(){return Y},patchEventPrototype:function(){return Y},isIEOrEdge:function(){return!1},getGlobalObjects:function(){},ObjectDefineProperty:function(){return Y},ObjectGetOwnPropertyDescriptor:function(){},ObjectCreate:function(){},ArraySlice:function(){return[]},patchClass:function(){return Y},wrapWithCurrentZone:function(){return Y},filterProperties:function(){return[]},attachOriginToPatched:function(){return Y},_redefineProperty:function(){return Y},patchCallbacks:function(){return Y},nativeScheduleMicroTask:V},W={parent:null,zone:new d(null,null)},ae=null,Q=0;function Y(){}n("Zone","Zone"),e.Zone=d}("undefined"!=typeof window&&window||"undefined"!=typeof self&&self||global);var le=Object.getOwnPropertyDescriptor,fe=Object.defineProperty,De=Object.getPrototypeOf,Te=Object.create,Ve=Array.prototype.slice,ve="addEventListener",Ue="removeEventListener",We=Zone.__symbol__(ve),ze=Zone.__symbol__(Ue),he="true",de="false",Ze=Zone.__symbol__("");function Xe(e,r){return Zone.current.wrap(e,r)}function Ye(e,r,t,n,u){return Zone.current.scheduleMacroTask(e,r,t,n,u)}var G=Zone.__symbol__,Ne="undefined"!=typeof window,Pe=Ne?window:void 0,te=Ne&&Pe||"object"==typeof self&&self||global;function qe(e,r){for(var t=e.length-1;t>=0;t--)"function"==typeof e[t]&&(e[t]=Xe(e[t],r+"_"+t));return e}function rr(e){return!e||!1!==e.writable&&!("function"==typeof e.get&&void 0===e.set)}var tr="undefined"!=typeof WorkerGlobalScope&&self instanceof WorkerGlobalScope,Ae=!("nw"in te)&&void 0!==te.process&&"[object process]"==={}.toString.call(te.process),Ke=!Ae&&!tr&&!(!Ne||!Pe.HTMLElement),nr=void 0!==te.process&&"[object process]"==={}.toString.call(te.process)&&!tr&&!(!Ne||!Pe.HTMLElement),je={},or=function(e){if(e=e||te.event){var r=je[e.type];r||(r=je[e.type]=G("ON_PROPERTY"+e.type));var u,t=this||e.target||te,n=t[r];return Ke&&t===Pe&&"error"===e.type?!0===(u=n&&n.call(this,e.message,e.filename,e.lineno,e.colno,e.error))&&e.preventDefault():null!=(u=n&&n.apply(this,arguments))&&!u&&e.preventDefault(),u}};function ar(e,r,t){var n=le(e,r);if(!n&&t&&le(t,r)&&(n={enumerable:!0,configurable:!0}),n&&n.configurable){var c=G("on"+r+"patched");if(!e.hasOwnProperty(c)||!e[c]){delete n.writable,delete n.value;var f=n.get,d=n.set,E=r.slice(2),T=je[E];T||(T=je[E]=G("ON_PROPERTY"+E)),n.set=function(p){var m=this;!m&&e===te&&(m=te),m&&("function"==typeof m[T]&&m.removeEventListener(E,or),d&&d.call(m,null),m[T]=p,"function"==typeof p&&m.addEventListener(E,or,!1))},n.get=function(){var p=this;if(!p&&e===te&&(p=te),!p)return null;var m=p[T];if(m)return m;if(f){var g=f.call(this);if(g)return n.set.call(this,g),"function"==typeof p.removeAttribute&&p.removeAttribute(r),g}return null},fe(e,r,n),e[c]=!0}}}function ir(e,r,t){if(r)for(var n=0;n<r.length;n++)ar(e,"on"+r[n],t);else{var u=[];for(var c in e)"on"==c.slice(0,2)&&u.push(c);for(var f=0;f<u.length;f++)ar(e,u[f],t)}}var ue=G("originalInstance");function Me(e){var r=te[e];if(r){te[G(e)]=r,te[e]=function(){var u=qe(arguments,e);switch(u.length){case 0:this[ue]=new r;break;case 1:this[ue]=new r(u[0]);break;case 2:this[ue]=new r(u[0],u[1]);break;case 3:this[ue]=new r(u[0],u[1],u[2]);break;case 4:this[ue]=new r(u[0],u[1],u[2],u[3]);break;default:throw new Error("Arg list too long.")}},pe(te[e],r);var n,t=new r(function(){});for(n in t)"XMLHttpRequest"===e&&"responseBlob"===n||function(u){"function"==typeof t[u]?te[e].prototype[u]=function(){return this[ue][u].apply(this[ue],arguments)}:fe(te[e].prototype,u,{set:function(c){"function"==typeof c?(this[ue][u]=Xe(c,e+"."+u),pe(this[ue][u],c)):this[ue][u]=c},get:function(){return this[ue][u]}})}(n);for(n in r)"prototype"!==n&&r.hasOwnProperty(n)&&(te[e][n]=r[n])}}function _e(e,r,t){for(var n=e;n&&!n.hasOwnProperty(r);)n=De(n);!n&&e[r]&&(n=e);var u=G(r),c=null;if(n&&(!(c=n[u])||!n.hasOwnProperty(u))&&(c=n[u]=n[r],rr(n&&le(n,r)))){var d=t(c,u,r);n[r]=function(){return d(this,arguments)},pe(n[r],c)}return c}function Or(e,r,t){var n=null;function u(c){var f=c.data;return f.args[f.cbIdx]=function(){c.invoke.apply(this,arguments)},n.apply(f.target,f.args),c}n=_e(e,r,function(c){return function(f,d){var E=t(f,d);return E.cbIdx>=0&&"function"==typeof d[E.cbIdx]?Ye(E.name,d[E.cbIdx],E,u):c.apply(f,d)}})}function pe(e,r){e[G("OriginalDelegate")]=r}var ur=!1,Je=!1;function Rr(){if(ur)return Je;ur=!0;try{var e=Pe.navigator.userAgent;(-1!==e.indexOf("MSIE ")||-1!==e.indexOf("Trident/")||-1!==e.indexOf("Edge/"))&&(Je=!0)}catch(r){}return Je}Zone.__load_patch("ZoneAwarePromise",function(e,r,t){var n=Object.getOwnPropertyDescriptor,u=Object.defineProperty;var f=t.symbol,d=[],E=!0===e[f("DISABLE_WRAPPING_UNCAUGHT_PROMISE_REJECTION")],T=f("Promise"),p=f("then");t.onUnhandledError=function(l){if(t.showUncaughtError()){var _=l&&l.rejection;_?console.error("Unhandled Promise rejection:",_ instanceof Error?_.message:_,"; Zone:",l.zone.name,"; Task:",l.task&&l.task.source,"; Value:",_,_ instanceof Error?_.stack:void 0):console.error(l)}},t.microtaskDrainDone=function(){for(var l=function(){var _=d.shift();try{_.zone.runGuarded(function(){throw _.throwOriginal?_.rejection:_})}catch(h){!function C(l){t.onUnhandledError(l);try{var _=r[g];"function"==typeof _&&_.call(this,l)}catch(h){}}(h)}};d.length;)l()};var g=f("unhandledPromiseRejectionHandler");function D(l){return l&&l.then}function H(l){return l}function $(l){return a.reject(l)}var V=f("state"),J=f("value"),A=f("finally"),b=f("parentPromiseValue"),U=f("parentPromiseState"),B=null,F=!0,k=!1;function Z(l,_){return function(h){try{X(l,_,h)}catch(s){X(l,!1,s)}}}var O=function(){var l=!1;return function(h){return function(){l||(l=!0,h.apply(null,arguments))}}},S=f("currentTaskTrace");function X(l,_,h){var s=O();if(l===h)throw new TypeError("Promise resolved with itself");if(l[V]===B){var y=null;try{("object"==typeof h||"function"==typeof h)&&(y=h&&h.then)}catch(L){return s(function(){X(l,!1,L)})(),l}if(_!==k&&h instanceof a&&h.hasOwnProperty(V)&&h.hasOwnProperty(J)&&h[V]!==B)ae(h),X(l,h[V],h[J]);else if(_!==k&&"function"==typeof y)try{y.call(h,s(Z(l,_)),s(Z(l,!1)))}catch(L){s(function(){X(l,!1,L)})()}else{l[V]=_;var R=l[J];if(l[J]=h,l[A]===A&&_===F&&(l[V]=l[U],l[J]=l[b]),_===k&&h instanceof Error){var w=r.currentTask&&r.currentTask.data&&r.currentTask.data.__creationTrace__;w&&u(h,S,{configurable:!0,enumerable:!1,writable:!0,value:w})}for(var M=0;M<R.length;)Q(l,R[M++],R[M++],R[M++],R[M++]);if(0==R.length&&_==k){l[V]=0;var I=h;try{throw new Error("Uncaught (in promise): "+function c(l){return l&&l.toString===Object.prototype.toString?(l.constructor&&l.constructor.name||"")+": "+JSON.stringify(l):l?l.toString():Object.prototype.toString.call(l)}(h)+(h&&h.stack?"\n"+h.stack:""))}catch(L){I=L}E&&(I.throwOriginal=!0),I.rejection=h,I.promise=l,I.zone=r.current,I.task=r.currentTask,d.push(I),t.scheduleMicroTask()}}}return l}var W=f("rejectionHandledHandler");function ae(l){if(0===l[V]){try{var _=r[W];_&&"function"==typeof _&&_.call(this,{rejection:l[J],promise:l})}catch(s){}l[V]=k;for(var h=0;h<d.length;h++)l===d[h].promise&&d.splice(h,1)}}function Q(l,_,h,s,y){ae(l);var R=l[V],w=R?"function"==typeof s?s:H:"function"==typeof y?y:$;_.scheduleMicroTask("Promise.then",function(){try{var M=l[J],I=!!h&&A===h[A];I&&(h[b]=M,h[U]=R);var L=_.run(w,void 0,I&&w!==$&&w!==H?[]:[M]);X(h,!0,L)}catch(j){X(h,!1,j)}},h)}var v=function(){},o=e.AggregateError,a=function(){function l(_){var h=this;if(!(h instanceof l))throw new Error("Must be an instanceof Promise.");h[V]=B,h[J]=[];try{var s=O();_&&_(s(Z(h,F)),s(Z(h,k)))}catch(y){X(h,!1,y)}}return l.toString=function(){return"function ZoneAwarePromise() { [native code] }"},l.resolve=function(_){return X(new this(null),F,_)},l.reject=function(_){return X(new this(null),k,_)},l.any=function(_){if(!_||"function"!=typeof _[Symbol.iterator])return Promise.reject(new o([],"All promises were rejected"));var h=[],s=0;try{for(var y=0,R=_;y<R.length;y++)s++,h.push(l.resolve(R[y]))}catch(L){return Promise.reject(new o([],"All promises were rejected"))}if(0===s)return Promise.reject(new o([],"All promises were rejected"));var M=!1,I=[];return new l(function(L,j){for(var K=0;K<h.length;K++)h[K].then(function(oe){M||(M=!0,L(oe))},function(oe){I.push(oe),0==--s&&(M=!0,j(new o(I,"All promises were rejected")))})})},l.race=function(_){var h,s,y=new this(function(j,K){h=j,s=K});function R(j){h(j)}function w(j){s(j)}for(var M=0,I=_;M<I.length;M++){var L=I[M];D(L)||(L=this.resolve(L)),L.then(R,w)}return y},l.all=function(_){return l.allWithCallback(_)},l.allSettled=function(_){return(this&&this.prototype instanceof l?this:l).allWithCallback(_,{thenCallback:function(s){return{status:"fulfilled",value:s}},errorCallback:function(s){return{status:"rejected",reason:s}}})},l.allWithCallback=function(_,h){for(var s,y,R=new this(function(re,ne){s=re,y=ne}),w=2,M=0,I=[],L=function(re){D(re)||(re=j.resolve(re));var ne=M;try{re.then(function(ee){I[ne]=h?h.thenCallback(ee):ee,0==--w&&s(I)},function(ee){h?(I[ne]=h.errorCallback(ee),0==--w&&s(I)):y(ee)})}catch(ee){y(ee)}w++,M++},j=this,K=0,oe=_;K<oe.length;K++)L(oe[K]);return 0==(w-=2)&&s(I),R},Object.defineProperty(l.prototype,Symbol.toStringTag,{get:function(){return"Promise"},enumerable:!1,configurable:!0}),Object.defineProperty(l.prototype,Symbol.species,{get:function(){return l},enumerable:!1,configurable:!0}),l.prototype.then=function(_,h){var s,y=null===(s=this.constructor)||void 0===s?void 0:s[Symbol.species];(!y||"function"!=typeof y)&&(y=this.constructor||l);var R=new y(v),w=r.current;return this[V]==B?this[J].push(w,R,_,h):Q(this,w,R,_,h),R},l.prototype.catch=function(_){return this.then(null,_)},l.prototype.finally=function(_){var h,s=null===(h=this.constructor)||void 0===h?void 0:h[Symbol.species];(!s||"function"!=typeof s)&&(s=l);var y=new s(v);y[A]=A;var R=r.current;return this[V]==B?this[J].push(R,y,_,_):Q(this,R,y,_,_),y},l}();a.resolve=a.resolve,a.reject=a.reject,a.race=a.race,a.all=a.all;var i=e[T]=e.Promise;e.Promise=a;var P=f("thenPatched");function q(l){var _=l.prototype,h=n(_,"then");if(!h||!1!==h.writable&&h.configurable){var s=_.then;_[p]=s,l.prototype.then=function(y,R){var w=this;return new a(function(I,L){s.call(w,I,L)}).then(y,R)},l[P]=!0}}return t.patchThen=q,i&&(q(i),_e(e,"fetch",function(l){return function ce(l){return function(_,h){var s=l.apply(_,h);if(s instanceof a)return s;var y=s.constructor;return y[P]||q(y),s}}(l)})),Promise[r.__symbol__("uncaughtPromiseErrors")]=d,a}),Zone.__load_patch("toString",function(e){var r=Function.prototype.toString,t=G("OriginalDelegate"),n=G("Promise"),u=G("Error"),c=function(){if("function"==typeof this){var T=this[t];if(T)return"function"==typeof T?r.call(T):Object.prototype.toString.call(T);if(this===Promise){var p=e[n];if(p)return r.call(p)}if(this===Error){var m=e[u];if(m)return r.call(m)}}return r.call(this)};c[t]=r,Function.prototype.toString=c;var f=Object.prototype.toString;Object.prototype.toString=function(){return"function"==typeof Promise&&this instanceof Promise?"[object Promise]":f.call(this)}});var we=!1;if("undefined"!=typeof window)try{var He=Object.defineProperty({},"passive",{get:function(){we=!0}});window.addEventListener("test",He,He),window.removeEventListener("test",He,He)}catch(e){we=!1}var xe,Be,_r,pr,be,Cr={useG:!0},ie={},cr={},sr=new RegExp("^"+Ze+"(\\w+)(true|false)$"),lr=G("propagationStopped");function fr(e,r){var t=(r?r(e):e)+de,n=(r?r(e):e)+he,u=Ze+t,c=Ze+n;ie[e]={},ie[e][de]=u,ie[e][he]=c}function Dr(e,r,t,n){var u=n&&n.add||ve,c=n&&n.rm||Ue,f=n&&n.listeners||"eventListeners",d=n&&n.rmAll||"removeAllListeners",E=G(u),T="."+u+":",p="prependListener",g=function(A,b,U){if(!A.isRemoved){var B,x=A.callback;"object"==typeof x&&x.handleEvent&&(A.callback=function(z){return x.handleEvent(z)},A.originalDelegate=x);try{A.invoke(A,b,[U])}catch(z){B=z}var F=A.options;return F&&"object"==typeof F&&F.once&&b[c].call(b,U.type,A.originalDelegate?A.originalDelegate:A.callback,F),B}};function C(A,b,U){if(b=b||e.event){var x=A||b.target||e,B=x[ie[b.type][U?he:de]];if(B){var F=[];if(1===B.length)(k=g(B[0],x,b))&&F.push(k);else for(var z=B.slice(),Z=0;Z<z.length&&(!b||!0!==b[lr]);Z++){var k;(k=g(z[Z],x,b))&&F.push(k)}if(1===F.length)throw F[0];var O=function(N){var S=F[N];r.nativeScheduleMicroTask(function(){throw S})};for(Z=0;Z<F.length;Z++)O(Z)}}}var D=function(A){return C(this,A,!1)},H=function(A){return C(this,A,!0)};function $(A,b){if(!A)return!1;var U=!0;b&&void 0!==b.useG&&(U=b.useG);var x=b&&b.vh,B=!0;b&&void 0!==b.chkDup&&(B=b.chkDup);var F=!1;b&&void 0!==b.rt&&(F=b.rt);for(var k=A;k&&!k.hasOwnProperty(u);)k=De(k);if(!k&&A[u]&&(k=A),!k||k[E])return!1;var W,z=b&&b.eventNameToString,Z={},O=k[E]=k[u],N=k[G(c)]=k[c],S=k[G(f)]=k[f],X=k[G(d)]=k[d];function ae(s,y){return!we&&"object"==typeof s&&s?!!s.capture:we&&y?"boolean"==typeof s?{capture:s,passive:!0}:s?"object"==typeof s&&!1!==s.passive?Object.assign(Object.assign({},s),{passive:!0}):s:{passive:!0}:s}b&&b.prepend&&(W=k[G(b.prepend)]=k[b.prepend]);var i=U?function(s){if(!Z.isExisting)return O.call(Z.target,Z.eventName,Z.capture?H:D,Z.options)}:function(s){return O.call(Z.target,Z.eventName,s.invoke,Z.options)},P=U?function(s){if(!s.isRemoved){var y=ie[s.eventName],R=void 0;y&&(R=y[s.capture?he:de]);var w=R&&s.target[R];if(w)for(var M=0;M<w.length;M++)if(w[M]===s){w.splice(M,1),s.isRemoved=!0,0===w.length&&(s.allRemoved=!0,s.target[R]=null);break}}if(s.allRemoved)return N.call(s.target,s.eventName,s.capture?H:D,s.options)}:function(s){return N.call(s.target,s.eventName,s.invoke,s.options)},ce=b&&b.diff?b.diff:function(s,y){var R=typeof y;return"function"===R&&s.callback===y||"object"===R&&s.originalDelegate===y},l=Zone[G("UNPATCHED_EVENTS")],_=e[G("PASSIVE_EVENTS")],h=function(s,y,R,w,M,I){return void 0===M&&(M=!1),void 0===I&&(I=!1),function(){var L=this||e,j=arguments[0];b&&b.transferEventName&&(j=b.transferEventName(j));var K=arguments[1];if(!K)return s.apply(this,arguments);if(Ae&&"uncaughtException"===j)return s.apply(this,arguments);var oe=!1;if("function"!=typeof K){if(!K.handleEvent)return s.apply(this,arguments);oe=!0}if(!x||x(s,K,L,arguments)){var Ee=we&&!!_&&-1!==_.indexOf(j),re=ae(arguments[2],Ee);if(l)for(var ne=0;ne<l.length;ne++)if(j===l[ne])return Ee?s.call(L,j,K,re):s.apply(this,arguments);var ee=!!re&&("boolean"==typeof re||re.capture),Se=!(!re||"object"!=typeof re)&&re.once,$r=Zone.current,er=ie[j];er||(fr(j,z),er=ie[j]);var gr=er[ee?he:de],Re=L[gr],mr=!1;if(Re){if(mr=!0,B)for(ne=0;ne<Re.length;ne++)if(ce(Re[ne],K))return}else Re=L[gr]=[];var Ge,br=L.constructor.name,kr=cr[br];kr&&(Ge=kr[j]),Ge||(Ge=br+y+(z?z(j):j)),Z.options=re,Se&&(Z.options.once=!1),Z.target=L,Z.capture=ee,Z.eventName=j,Z.isExisting=mr;var Ie=U?Cr:void 0;Ie&&(Ie.taskData=Z);var ge=$r.scheduleEventTask(Ge,K,Ie,R,w);if(Z.target=null,Ie&&(Ie.taskData=null),Se&&(re.once=!0),!we&&"boolean"==typeof ge.options||(ge.options=re),ge.target=L,ge.capture=ee,ge.eventName=j,oe&&(ge.originalDelegate=K),I?Re.unshift(ge):Re.push(ge),M)return L}}};return k[u]=h(O,T,i,P,F),W&&(k[p]=h(W,".prependListener:",function(s){return W.call(Z.target,Z.eventName,s.invoke,Z.options)},P,F,!0)),k[c]=function(){var s=this||e,y=arguments[0];b&&b.transferEventName&&(y=b.transferEventName(y));var R=arguments[2],w=!!R&&("boolean"==typeof R||R.capture),M=arguments[1];if(!M)return N.apply(this,arguments);if(!x||x(N,M,s,arguments)){var L,I=ie[y];I&&(L=I[w?he:de]);var j=L&&s[L];if(j)for(var K=0;K<j.length;K++){var oe=j[K];if(ce(oe,M))return j.splice(K,1),oe.isRemoved=!0,0===j.length&&(oe.allRemoved=!0,s[L]=null,"string"==typeof y)&&(s[Ze+"ON_PROPERTY"+y]=null),oe.zone.cancelTask(oe),F?s:void 0}return N.apply(this,arguments)}},k[f]=function(){var s=this||e,y=arguments[0];b&&b.transferEventName&&(y=b.transferEventName(y));for(var R=[],w=vr(s,z?z(y):y),M=0;M<w.length;M++){var I=w[M];R.push(I.originalDelegate?I.originalDelegate:I.callback)}return R},k[d]=function(){var s=this||e,y=arguments[0];if(y){b&&b.transferEventName&&(y=b.transferEventName(y));var j=ie[y];if(j){var Ee=s[j[de]],re=s[j[he]];if(Ee)for(var ne=Ee.slice(),w=0;w<ne.length;w++)this[c].call(this,y,(ee=ne[w]).originalDelegate?ee.originalDelegate:ee.callback,ee.options);if(re)for(ne=re.slice(),w=0;w<ne.length;w++){var ee;this[c].call(this,y,(ee=ne[w]).originalDelegate?ee.originalDelegate:ee.callback,ee.options)}}}else{var R=Object.keys(s);for(w=0;w<R.length;w++){var I=sr.exec(R[w]),L=I&&I[1];L&&"removeListener"!==L&&this[d].call(this,L)}this[d].call(this,"removeListener")}if(F)return this},pe(k[u],O),pe(k[c],N),X&&pe(k[d],X),S&&pe(k[f],S),!0}for(var V=[],J=0;J<t.length;J++)V[J]=$(t[J],n);return V}function vr(e,r){if(!r){var t=[];for(var n in e){var u=sr.exec(n),c=u&&u[1];if(c&&(!r||c===r)){var f=e[n];if(f)for(var d=0;d<f.length;d++)t.push(f[d])}}return t}var E=ie[r];E||(fr(r),E=ie[r]);var T=e[E[de]],p=e[E[he]];return T?p?T.concat(p):T.slice():p?p.slice():[]}function Zr(e,r){var t=e.Event;t&&t.prototype&&r.patchMethod(t.prototype,"stopImmediatePropagation",function(n){return function(u,c){u[lr]=!0,n&&n.apply(u,c)}})}function Mr(e,r,t,n,u){var c=Zone.__symbol__(n);if(!r[c]){var f=r[c]=r[n];r[n]=function(d,E,T){return E&&E.prototype&&u.forEach(function(p){var m="".concat(t,".").concat(n,"::")+p,g=E.prototype;try{if(g.hasOwnProperty(p)){var C=e.ObjectGetOwnPropertyDescriptor(g,p);C&&C.value?(C.value=e.wrapWithCurrentZone(C.value,m),e._redefineProperty(E.prototype,p,C)):g[p]&&(g[p]=e.wrapWithCurrentZone(g[p],m))}else g[p]&&(g[p]=e.wrapWithCurrentZone(g[p],m))}catch(D){}}),f.call(r,d,E,T)},e.attachOriginToPatched(r[n],f)}}function hr(e,r,t){if(!t||0===t.length)return r;var n=t.filter(function(c){return c.target===e});if(!n||0===n.length)return r;var u=n[0].ignoreProperties;return r.filter(function(c){return-1===u.indexOf(c)})}function dr(e,r,t,n){e&&ir(e,hr(e,r,t),n)}function Qe(e){return Object.getOwnPropertyNames(e).filter(function(r){return r.startsWith("on")&&r.length>2}).map(function(r){return r.substring(2)})}function Ir(e,r){if((!Ae||nr)&&!Zone[e.symbol("patchEvents")]){var t=r.__Zone_ignore_on_properties,n=[];if(Ke){var u=window;n=n.concat(["Document","SVGElement","Element","HTMLElement","HTMLBodyElement","HTMLMediaElement","HTMLFrameSetElement","HTMLFrameElement","HTMLIFrameElement","HTMLMarqueeElement","Worker"]);var c=function Sr(){try{var e=Pe.navigator.userAgent;if(-1!==e.indexOf("MSIE ")||-1!==e.indexOf("Trident/"))return!0}catch(r){}return!1}()?[{target:u,ignoreProperties:["error"]}]:[];dr(u,Qe(u),t&&t.concat(c),De(u))}n=n.concat(["XMLHttpRequest","XMLHttpRequestEventTarget","IDBIndex","IDBRequest","IDBOpenDBRequest","IDBDatabase","IDBTransaction","IDBCursor","WebSocket"]);for(var f=0;f<n.length;f++){var d=r[n[f]];d&&d.prototype&&dr(d.prototype,Qe(d.prototype),t)}}}function Nr(e,r,t){var n=t.configurable;return yr(e,r,t=$e(e,r,t),n)}function Er(e,r){return e&&e[be]&&e[be][r]}function $e(e,r,t){return Object.isFrozen(t)||(t.configurable=!0),t.configurable||(!e[be]&&!Object.isFrozen(e)&&Be(e,be,{writable:!0,value:{}}),e[be]&&(e[be][r]=!0)),t}function yr(e,r,t,n){try{return Be(e,r,t)}catch(f){if(!t.configurable)throw f;void 0===n?delete t.configurable:t.configurable=n;try{return Be(e,r,t)}catch(d){var u=!1;if(("createdCallback"===r||"attachedCallback"===r||"detachedCallback"===r||"attributeChangedCallback"===r)&&(u=!0),!u)throw d;var c=null;try{c=JSON.stringify(t)}catch(E){c=t.toString()}console.log("Attempting to configure '".concat(r,"' with descriptor '").concat(c,"' on object '").concat(e,"' and got error, giving up: ").concat(d))}}}function Hr(e,r){var t=e.getGlobalObjects();if((!t.isNode||t.isMix)&&!function xr(e,r){var t=e.getGlobalObjects();if((t.isBrowser||t.isMix)&&!e.ObjectGetOwnPropertyDescriptor(HTMLElement.prototype,"onclick")&&"undefined"!=typeof Element){var c=e.ObjectGetOwnPropertyDescriptor(Element.prototype,"onclick");if(c&&!c.configurable)return!1;if(c){e.ObjectDefineProperty(Element.prototype,"onclick",{enumerable:!0,configurable:!0,get:function(){return!0}});var d=!!document.createElement("div").onclick;return e.ObjectDefineProperty(Element.prototype,"onclick",c),d}}var E=r.XMLHttpRequest;if(!E)return!1;var T="onreadystatechange",p=E.prototype,m=e.ObjectGetOwnPropertyDescriptor(p,T);if(m)return e.ObjectDefineProperty(p,T,{enumerable:!0,configurable:!0,get:function(){return!0}}),d=!!(g=new E).onreadystatechange,e.ObjectDefineProperty(p,T,m||{}),d;var C=e.symbol("fake");e.ObjectDefineProperty(p,T,{enumerable:!0,configurable:!0,get:function(){return this[C]},set:function(V){this[C]=V}});var g,D=function(){};return(g=new E).onreadystatechange=D,d=g[C]===D,g.onreadystatechange=null,d}(e,r)){var c="undefined"!=typeof WebSocket;(function Yr(e){for(var r=e.symbol("unbound"),t=function(u){var c=Tr[u],f="on"+c;self.addEventListener(c,function(d){var T,p,E=d.target;for(p=E?E.constructor.name+"."+f:"unknown."+f;E;)E[f]&&!E[f][r]&&((T=e.wrapWithCurrentZone(E[f],p))[r]=E[f],E[f]=T),E=E.parentElement},!0)},n=0;n<Tr.length;n++)t(n)})(e),e.patchClass("XMLHttpRequest"),c&&function jr(e,r){var t=e.getGlobalObjects(),n=t.ADD_EVENT_LISTENER_STR,u=t.REMOVE_EVENT_LISTENER_STR,c=r.WebSocket;r.EventTarget||e.patchEventTarget(r,e,[c.prototype]),r.WebSocket=function(E,T){var m,g,p=arguments.length>1?new c(E,T):new c(E),C=e.ObjectGetOwnPropertyDescriptor(p,"onmessage");return C&&!1===C.configurable?(m=e.ObjectCreate(p),g=p,[n,u,"send","close"].forEach(function(D){m[D]=function(){var H=e.ArraySlice.call(arguments);if(D===n||D===u){var $=H.length>0?H[0]:void 0;if($){var V=Zone.__symbol__("ON_PROPERTY"+$);p[V]=m[V]}}return p[D].apply(p,H)}})):m=p,e.patchOnProperties(m,["close","error","message","open"],g),m};var f=r.WebSocket;for(var d in c)f[d]=c[d]}(e,r),Zone[e.symbol("patchEvents")]=!0}}Zone.__load_patch("util",function(e,r,t){var n=Qe(e);t.patchOnProperties=ir,t.patchMethod=_e,t.bindArguments=qe,t.patchMacroTask=Or;var u=r.__symbol__("BLACK_LISTED_EVENTS"),c=r.__symbol__("UNPATCHED_EVENTS");e[c]&&(e[u]=e[c]),e[u]&&(r[u]=r[c]=e[u]),t.patchEventPrototype=Zr,t.patchEventTarget=Dr,t.isIEOrEdge=Rr,t.ObjectDefineProperty=fe,t.ObjectGetOwnPropertyDescriptor=le,t.ObjectCreate=Te,t.ArraySlice=Ve,t.patchClass=Me,t.wrapWithCurrentZone=Xe,t.filterProperties=hr,t.attachOriginToPatched=pe,t._redefineProperty=Object.defineProperty,t.patchCallbacks=Mr,t.getGlobalObjects=function(){return{globalSources:cr,zoneSymbolEventNames:ie,eventNames:n,isBrowser:Ke,isMix:nr,isNode:Ae,TRUE_STR:he,FALSE_STR:de,ZONE_SYMBOL_PREFIX:Ze,ADD_EVENT_LISTENER_STR:ve,REMOVE_EVENT_LISTENER_STR:Ue}}});var e,r,Tr=se(se(se(se(se(se(se(se([],["abort","animationcancel","animationend","animationiteration","auxclick","beforeinput","blur","cancel","canplay","canplaythrough","change","compositionstart","compositionupdate","compositionend","cuechange","click","close","contextmenu","curechange","dblclick","drag","dragend","dragenter","dragexit","dragleave","dragover","drop","durationchange","emptied","ended","error","focus","focusin","focusout","gotpointercapture","input","invalid","keydown","keypress","keyup","load","loadstart","loadeddata","loadedmetadata","lostpointercapture","mousedown","mouseenter","mouseleave","mousemove","mouseout","mouseover","mouseup","mousewheel","orientationchange","pause","play","playing","pointercancel","pointerdown","pointerenter","pointerleave","pointerlockchange","mozpointerlockchange","webkitpointerlockerchange","pointerlockerror","mozpointerlockerror","webkitpointerlockerror","pointermove","pointout","pointerover","pointerup","progress","ratechange","reset","resize","scroll","seeked","seeking","select","selectionchange","selectstart","show","sort","stalled","submit","suspend","timeupdate","volumechange","touchcancel","touchmove","touchstart","touchend","transitioncancel","transitionend","waiting","wheel"],!0),["webglcontextrestored","webglcontextlost","webglcontextcreationerror"],!0),["autocomplete","autocompleteerror"],!0),["toggle"],!0),["afterscriptexecute","beforescriptexecute","DOMContentLoaded","freeze","fullscreenchange","mozfullscreenchange","webkitfullscreenchange","msfullscreenchange","fullscreenerror","mozfullscreenerror","webkitfullscreenerror","msfullscreenerror","readystatechange","visibilitychange","resume"],!0),["absolutedeviceorientation","afterinput","afterprint","appinstalled","beforeinstallprompt","beforeprint","beforeunload","devicelight","devicemotion","deviceorientation","deviceorientationabsolute","deviceproximity","hashchange","languagechange","message","mozbeforepaint","offline","online","paint","pageshow","pagehide","popstate","rejectionhandled","storage","unhandledrejection","unload","userproximity","vrdisplayconnected","vrdisplaydisconnected","vrdisplaypresentchange"],!0),["beforecopy","beforecut","beforepaste","copy","cut","paste","dragstart","loadend","animationstart","search","transitionrun","transitionstart","webkitanimationend","webkitanimationiteration","webkitanimationstart","webkittransitionend"],!0),["activate","afterupdate","ariarequest","beforeactivate","beforedeactivate","beforeeditfocus","beforeupdate","cellchange","controlselect","dataavailable","datasetchanged","datasetcomplete","errorupdate","filterchange","layoutcomplete","losecapture","move","moveend","movestart","propertychange","resizeend","resizestart","rowenter","rowexit","rowsdelete","rowsinserted","command","compassneedscalibration","deactivate","help","mscontentzoom","msmanipulationstatechanged","msgesturechange","msgesturedoubletap","msgestureend","msgesturehold","msgesturestart","msgesturetap","msgotpointercapture","msinertiastart","mslostpointercapture","mspointercancel","mspointerdown","mspointerenter","mspointerhover","mspointerleave","mspointermove","mspointerout","mspointerover","mspointerup","pointerout","mssitemodejumplistitemremoved","msthumbnailclick","stop","storagecommit"],!0);e="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof self?self:{},r=e.__Zone_symbol_prefix||"__zone_symbol__",e[function t(n){return r+n}("legacyPatch")]=function(){var n=e.Zone;n.__load_patch("defineProperty",function(u,c,f){f._redefineProperty=Nr,function Lr(){xe=Zone.__symbol__,Be=Object[xe("defineProperty")]=Object.defineProperty,_r=Object[xe("getOwnPropertyDescriptor")]=Object.getOwnPropertyDescriptor,pr=Object.create,be=xe("unconfigurables"),Object.defineProperty=function(e,r,t){if(Er(e,r))throw new TypeError("Cannot assign to read only property '"+r+"' of "+e);var n=t.configurable;return"prototype"!==r&&(t=$e(e,r,t)),yr(e,r,t,n)},Object.defineProperties=function(e,r){Object.keys(r).forEach(function(f){Object.defineProperty(e,f,r[f])});for(var t=0,n=Object.getOwnPropertySymbols(r);t<n.length;t++){var u=n[t],c=Object.getOwnPropertyDescriptor(r,u);(null==c?void 0:c.enumerable)&&Object.defineProperty(e,u,r[u])}return e},Object.create=function(e,r){return"object"==typeof r&&!Object.isFrozen(r)&&Object.keys(r).forEach(function(t){r[t]=$e(e,t,r[t])}),pr(e,r)},Object.getOwnPropertyDescriptor=function(e,r){var t=_r(e,r);return t&&Er(e,r)&&(t.configurable=!1),t}}()}),n.__load_patch("registerElement",function(u,c,f){!function qr(e,r){var t=r.getGlobalObjects();(t.isBrowser||t.isMix)&&"registerElement"in e.document&&r.patchCallbacks(r,document,"Document","registerElement",["createdCallback","attachedCallback","detachedCallback","attributeChangedCallback"])}(u,f)}),n.__load_patch("EventTargetLegacy",function(u,c,f){(function Ar(e,r){var t=r.getGlobalObjects(),n=t.eventNames,u=t.globalSources,c=t.zoneSymbolEventNames,f=t.TRUE_STR,d=t.FALSE_STR,E=t.ZONE_SYMBOL_PREFIX,p="ApplicationCache,EventSource,FileReader,InputMethodContext,MediaController,MessagePort,Node,Performance,SVGElementInstance,SharedWorker,TextTrack,TextTrackCue,TextTrackList,WebKitNamedFlow,Window,Worker,WorkerGlobalScope,XMLHttpRequest,XMLHttpRequestEventTarget,XMLHttpRequestUpload,IDBRequest,IDBOpenDBRequest,IDBDatabase,IDBTransaction,IDBCursor,DBIndex,WebSocket".split(","),m="EventTarget",g=[],C=e.wtf,D="Anchor,Area,Audio,BR,Base,BaseFont,Body,Button,Canvas,Content,DList,Directory,Div,Embed,FieldSet,Font,Form,Frame,FrameSet,HR,Head,Heading,Html,IFrame,Image,Input,Keygen,LI,Label,Legend,Link,Map,Marquee,Media,Menu,Meta,Meter,Mod,OList,Object,OptGroup,Option,Output,Paragraph,Pre,Progress,Quote,Script,Select,Source,Span,Style,TableCaption,TableCell,TableCol,Table,TableRow,TableSection,TextArea,Title,Track,UList,Unknown,Video".split(",");C?g=D.map(function(Q){return"HTML"+Q+"Element"}).concat(p):e[m]?g.push(m):g=p;for(var H=e.__Zone_disable_IE_check||!1,$=e.__Zone_enable_cross_context_check||!1,V=r.isIEOrEdge(),A="[object FunctionWrapper]",b="function __BROWSERTOOLS_CONSOLE_SAFEFUNC() { [native code] }",U={MSPointerCancel:"pointercancel",MSPointerDown:"pointerdown",MSPointerEnter:"pointerenter",MSPointerHover:"pointerhover",MSPointerLeave:"pointerleave",MSPointerMove:"pointermove",MSPointerOut:"pointerout",MSPointerOver:"pointerover",MSPointerUp:"pointerup"},x=0;x<n.length;x++){var z=E+((B=n[x])+d),Z=E+(B+f);c[B]={},c[B][d]=z,c[B][f]=Z}for(x=0;x<D.length;x++)for(var O=D[x],N=u[O]={},S=0;S<n.length;S++){var B;N[B=n[S]]=O+".addEventListener:"+B}var W=[];for(x=0;x<g.length;x++){var ae=e[g[x]];W.push(ae&&ae.prototype)}return r.patchEventTarget(e,r,W,{vh:function(Q,Y,v,o){if(!H&&V)if($)try{if((a=Y.toString())===A||a==b)return Q.apply(v,o),!1}catch(i){return Q.apply(v,o),!1}else{var a;if((a=Y.toString())===A||a==b)return Q.apply(v,o),!1}else if($)try{Y.toString()}catch(i){return Q.apply(v,o),!1}return!0},transferEventName:function(Q){return U[Q]||Q}}),Zone[r.symbol("patchEventTarget")]=!!e[m],!0})(u,f),Hr(f,u)})};var Fe=G("zoneTask");function Oe(e,r,t,n){var u=null,c=null;t+=n;var f={};function d(T){var p=T.data;return p.args[0]=function(){return T.invoke.apply(this,arguments)},p.handleId=u.apply(e,p.args),T}function E(T){return c.call(e,T.data.handleId)}u=_e(e,r+=n,function(T){return function(p,m){if("function"==typeof m[0]){var g={isPeriodic:"Interval"===n,delay:"Timeout"===n||"Interval"===n?m[1]||0:void 0,args:m},C=m[0];m[0]=function(){try{return C.apply(this,arguments)}finally{g.isPeriodic||("number"==typeof g.handleId?delete f[g.handleId]:g.handleId&&(g.handleId[Fe]=null))}};var D=Ye(r,m[0],g,d,E);if(!D)return D;var H=D.data.handleId;return"number"==typeof H?f[H]=D:H&&(H[Fe]=D),H&&H.ref&&H.unref&&"function"==typeof H.ref&&"function"==typeof H.unref&&(D.ref=H.ref.bind(H),D.unref=H.unref.bind(H)),"number"==typeof H||H?H:D}return T.apply(e,m)}}),c=_e(e,t,function(T){return function(p,m){var C,g=m[0];"number"==typeof g?C=f[g]:(C=g&&g[Fe])||(C=g),C&&"string"==typeof C.type?"notScheduled"!==C.state&&(C.cancelFn&&C.data.isPeriodic||0===C.runCount)&&("number"==typeof g?delete f[g]:g&&(g[Fe]=null),C.zone.cancelTask(C)):T.apply(e,m)}})}Zone.__load_patch("legacy",function(e){var r=e[Zone.__symbol__("legacyPatch")];r&&r()}),Zone.__load_patch("queueMicrotask",function(e,r,t){t.patchMethod(e,"queueMicrotask",function(n){return function(u,c){r.current.scheduleMicroTask("queueMicrotask",c[0])}})}),Zone.__load_patch("timers",function(e){var r="set",t="clear";Oe(e,r,t,"Timeout"),Oe(e,r,t,"Interval"),Oe(e,r,t,"Immediate")}),Zone.__load_patch("requestAnimationFrame",function(e){Oe(e,"request","cancel","AnimationFrame"),Oe(e,"mozRequest","mozCancel","AnimationFrame"),Oe(e,"webkitRequest","webkitCancel","AnimationFrame")}),Zone.__load_patch("blocking",function(e,r){for(var t=["alert","prompt","confirm"],n=0;n<t.length;n++)_e(e,t[n],function(c,f,d){return function(E,T){return r.current.run(c,e,T,d)}})}),Zone.__load_patch("EventTarget",function(e,r,t){(function Qr(e,r){r.patchEventPrototype(e,r)})(e,t),function Jr(e,r){if(!Zone[r.symbol("patchEventTarget")]){for(var t=r.getGlobalObjects(),n=t.eventNames,u=t.zoneSymbolEventNames,c=t.TRUE_STR,f=t.FALSE_STR,d=t.ZONE_SYMBOL_PREFIX,E=0;E<n.length;E++){var T=n[E],g=d+(T+f),C=d+(T+c);u[T]={},u[T][f]=g,u[T][c]=C}var D=e.EventTarget;if(D&&D.prototype)return r.patchEventTarget(e,r,[D&&D.prototype]),!0}}(e,t);var n=e.XMLHttpRequestEventTarget;n&&n.prototype&&t.patchEventTarget(e,t,[n.prototype])}),Zone.__load_patch("MutationObserver",function(e,r,t){Me("MutationObserver"),Me("WebKitMutationObserver")}),Zone.__load_patch("IntersectionObserver",function(e,r,t){Me("IntersectionObserver")}),Zone.__load_patch("FileReader",function(e,r,t){Me("FileReader")}),Zone.__load_patch("on_property",function(e,r,t){Ir(t,e)}),Zone.__load_patch("customElements",function(e,r,t){!function Kr(e,r){var t=r.getGlobalObjects();(t.isBrowser||t.isMix)&&e.customElements&&"customElements"in e&&r.patchCallbacks(r,e.customElements,"customElements","define",["connectedCallback","disconnectedCallback","adoptedCallback","attributeChangedCallback"])}(e,t)}),Zone.__load_patch("XHR",function(e,r){!function E(T){var p=T.XMLHttpRequest;if(p){var m=p.prototype,C=m[We],D=m[ze];if(!C){var H=T.XMLHttpRequestEventTarget;if(H){var $=H.prototype;C=$[We],D=$[ze]}}var V="readystatechange",J="scheduled",x=_e(m,"open",function(){return function(O,N){return O[n]=0==N[2],O[f]=N[1],x.apply(O,N)}}),F=G("fetchTaskAborting"),k=G("fetchTaskScheduling"),z=_e(m,"send",function(){return function(O,N){if(!0===r.current[k]||O[n])return z.apply(O,N);var S={target:O,url:O[f],isPeriodic:!1,args:N,aborted:!1},X=Ye("XMLHttpRequest.send",b,S,A,U);O&&!0===O[d]&&!S.aborted&&X.state===J&&X.invoke()}}),Z=_e(m,"abort",function(){return function(O,N){var S=function g(O){return O[t]}(O);if(S&&"string"==typeof S.type){if(null==S.cancelFn||S.data&&S.data.aborted)return;S.zone.cancelTask(S)}else if(!0===r.current[F])return Z.apply(O,N)}})}function A(O){var N=O.data,S=N.target;S[c]=!1,S[d]=!1;var X=S[u];C||(C=S[We],D=S[ze]),X&&D.call(S,V,X);var W=S[u]=function(){if(S.readyState===S.DONE)if(!N.aborted&&S[c]&&O.state===J){var Q=S[r.__symbol__("loadfalse")];if(0!==S.status&&Q&&Q.length>0){var Y=O.invoke;O.invoke=function(){for(var v=S[r.__symbol__("loadfalse")],o=0;o<v.length;o++)v[o]===O&&v.splice(o,1);!N.aborted&&O.state===J&&Y.call(O)},Q.push(O)}else O.invoke()}else!N.aborted&&!1===S[c]&&(S[d]=!0)};return C.call(S,V,W),S[t]||(S[t]=O),z.apply(S,N.args),S[c]=!0,O}function b(){}function U(O){var N=O.data;return N.aborted=!0,Z.apply(N.target,N.args)}}(e);var t=G("xhrTask"),n=G("xhrSync"),u=G("xhrListener"),c=G("xhrScheduled"),f=G("xhrURL"),d=G("xhrErrorBeforeScheduled")}),Zone.__load_patch("geolocation",function(e){e.navigator&&e.navigator.geolocation&&function wr(e,r){for(var t=e.constructor.name,n=function(c){var T,p,f=r[c],d=e[f];if(d){if(!rr(le(e,f)))return"continue";e[f]=(p=function(){return T.apply(this,qe(arguments,t+"."+f))},pe(p,T=d),p)}},u=0;u<r.length;u++)n(u)}(e.navigator.geolocation,["getCurrentPosition","watchPosition"])}),Zone.__load_patch("PromiseRejectionEvent",function(e,r){function t(n){return function(u){vr(e,n).forEach(function(f){var d=e.PromiseRejectionEvent;if(d){var E=new d(n,{promise:u.promise,reason:u.rejection});f.invoke(E)}})}}e.PromiseRejectionEvent&&(r[G("unhandledPromiseRejectionHandler")]=t("unhandledrejection"),r[G("rejectionHandledHandler")]=t("rejectionhandled"))})},void 0!==(Le=ye.call(Ce,me,Ce,ke))&&(ke.exports=Le)},7435:(ke,Ce,me)=>{"use strict";me(16350),me(99140)},16350:()=>{}},ke=>{ke(ke.s=7435)}]);
\ No newline at end of file
diff --git a/ceph/src/pybind/mgr/dashboard/frontend/dist/en-US/prometheus_logo.8057911d27be9bb1.svg b/ceph/src/pybind/mgr/dashboard/frontend/dist/en-US/prometheus_logo.8057911d27be9bb1.svg
new file mode 100644 (file)
index 0000000..5c51f66
--- /dev/null
@@ -0,0 +1,50 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Generator: Adobe Illustrator 16.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
+
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   version="1.1"
+   id="Layer_1"
+   x="0px"
+   y="0px"
+   width="115.333px"
+   height="114px"
+   viewBox="0 0 115.333 114"
+   enable-background="new 0 0 115.333 114"
+   xml:space="preserve"
+   sodipodi:docname="prometheus_logo_orange.svg"
+   inkscape:version="0.92.1 r15371"><metadata
+     id="metadata4495"><rdf:RDF><cc:Work
+         rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" /><dc:title></dc:title></cc:Work></rdf:RDF></metadata><defs
+     id="defs4493" /><sodipodi:namedview
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1"
+     objecttolerance="10"
+     gridtolerance="10"
+     guidetolerance="10"
+     inkscape:pageopacity="0"
+     inkscape:pageshadow="2"
+     inkscape:window-width="1484"
+     inkscape:window-height="886"
+     id="namedview4491"
+     showgrid="false"
+     inkscape:zoom="5.2784901"
+     inkscape:cx="60.603667"
+     inkscape:cy="60.329656"
+     inkscape:window-x="54"
+     inkscape:window-y="7"
+     inkscape:window-maximized="0"
+     inkscape:current-layer="Layer_1" /><g
+     id="Layer_2" /><path
+     style="fill:#e6522c;fill-opacity:1"
+     inkscape:connector-curvature="0"
+     id="path4486"
+     d="M 56.667,0.667 C 25.372,0.667 0,26.036 0,57.332 c 0,31.295 25.372,56.666 56.667,56.666 31.295,0 56.666,-25.371 56.666,-56.666 0,-31.296 -25.372,-56.665 -56.666,-56.665 z m 0,106.055 c -8.904,0 -16.123,-5.948 -16.123,-13.283 H 72.79 c 0,7.334 -7.219,13.283 -16.123,13.283 z M 83.297,89.04 H 30.034 V 79.382 H 83.298 V 89.04 Z M 83.106,74.411 H 30.186 C 30.01,74.208 29.83,74.008 29.66,73.802 24.208,67.182 22.924,63.726 21.677,60.204 c -0.021,-0.116 6.611,1.355 11.314,2.413 0,0 2.42,0.56 5.958,1.205 -3.397,-3.982 -5.414,-9.044 -5.414,-14.218 0,-11.359 8.712,-21.285 5.569,-29.308 3.059,0.249 6.331,6.456 6.552,16.161 3.252,-4.494 4.613,-12.701 4.613,-17.733 0,-5.21 3.433,-11.262 6.867,-11.469 -3.061,5.045 0.793,9.37 4.219,20.099 1.285,4.03 1.121,10.812 2.113,15.113 C 63.797,33.534 65.333,20.5 71,16 c -2.5,5.667 0.37,12.758 2.333,16.167 3.167,5.5 5.087,9.667 5.087,17.548 0,5.284 -1.951,10.259 -5.242,14.148 3.742,-0.702 6.326,-1.335 6.326,-1.335 l 12.152,-2.371 c 10e-4,-10e-4 -1.765,7.261 -8.55,14.254 z" /></svg>
\ No newline at end of file
diff --git a/ceph/src/pybind/mgr/dashboard/frontend/dist/en-US/prometheus_logo.8b3183e5a2db0e87bb2b.svg b/ceph/src/pybind/mgr/dashboard/frontend/dist/en-US/prometheus_logo.8b3183e5a2db0e87bb2b.svg
deleted file mode 100644 (file)
index 5c51f66..0000000
+++ /dev/null
@@ -1,50 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<!-- Generator: Adobe Illustrator 16.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
-
-<svg
-   xmlns:dc="http://purl.org/dc/elements/1.1/"
-   xmlns:cc="http://creativecommons.org/ns#"
-   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
-   xmlns:svg="http://www.w3.org/2000/svg"
-   xmlns="http://www.w3.org/2000/svg"
-   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
-   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
-   version="1.1"
-   id="Layer_1"
-   x="0px"
-   y="0px"
-   width="115.333px"
-   height="114px"
-   viewBox="0 0 115.333 114"
-   enable-background="new 0 0 115.333 114"
-   xml:space="preserve"
-   sodipodi:docname="prometheus_logo_orange.svg"
-   inkscape:version="0.92.1 r15371"><metadata
-     id="metadata4495"><rdf:RDF><cc:Work
-         rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type
-           rdf:resource="http://purl.org/dc/dcmitype/StillImage" /><dc:title></dc:title></cc:Work></rdf:RDF></metadata><defs
-     id="defs4493" /><sodipodi:namedview
-     pagecolor="#ffffff"
-     bordercolor="#666666"
-     borderopacity="1"
-     objecttolerance="10"
-     gridtolerance="10"
-     guidetolerance="10"
-     inkscape:pageopacity="0"
-     inkscape:pageshadow="2"
-     inkscape:window-width="1484"
-     inkscape:window-height="886"
-     id="namedview4491"
-     showgrid="false"
-     inkscape:zoom="5.2784901"
-     inkscape:cx="60.603667"
-     inkscape:cy="60.329656"
-     inkscape:window-x="54"
-     inkscape:window-y="7"
-     inkscape:window-maximized="0"
-     inkscape:current-layer="Layer_1" /><g
-     id="Layer_2" /><path
-     style="fill:#e6522c;fill-opacity:1"
-     inkscape:connector-curvature="0"
-     id="path4486"
-     d="M 56.667,0.667 C 25.372,0.667 0,26.036 0,57.332 c 0,31.295 25.372,56.666 56.667,56.666 31.295,0 56.666,-25.371 56.666,-56.666 0,-31.296 -25.372,-56.665 -56.666,-56.665 z m 0,106.055 c -8.904,0 -16.123,-5.948 -16.123,-13.283 H 72.79 c 0,7.334 -7.219,13.283 -16.123,13.283 z M 83.297,89.04 H 30.034 V 79.382 H 83.298 V 89.04 Z M 83.106,74.411 H 30.186 C 30.01,74.208 29.83,74.008 29.66,73.802 24.208,67.182 22.924,63.726 21.677,60.204 c -0.021,-0.116 6.611,1.355 11.314,2.413 0,0 2.42,0.56 5.958,1.205 -3.397,-3.982 -5.414,-9.044 -5.414,-14.218 0,-11.359 8.712,-21.285 5.569,-29.308 3.059,0.249 6.331,6.456 6.552,16.161 3.252,-4.494 4.613,-12.701 4.613,-17.733 0,-5.21 3.433,-11.262 6.867,-11.469 -3.061,5.045 0.793,9.37 4.219,20.099 1.285,4.03 1.121,10.812 2.113,15.113 C 63.797,33.534 65.333,20.5 71,16 c -2.5,5.667 0.37,12.758 2.333,16.167 3.167,5.5 5.087,9.667 5.087,17.548 0,5.284 -1.951,10.259 -5.242,14.148 3.742,-0.702 6.326,-1.335 6.326,-1.335 l 12.152,-2.371 c 10e-4,-10e-4 -1.765,7.261 -8.55,14.254 z" /></svg>
\ No newline at end of file
diff --git a/ceph/src/pybind/mgr/dashboard/frontend/dist/en-US/runtime.4fd39655e7ea619b.js b/ceph/src/pybind/mgr/dashboard/frontend/dist/en-US/runtime.4fd39655e7ea619b.js
new file mode 100644 (file)
index 0000000..952e39d
--- /dev/null
@@ -0,0 +1 @@
+(()=>{"use strict";var e,h={},v={};function r(e){var n=v[e];if(void 0!==n)return n.exports;var t=v[e]={id:e,loaded:!1,exports:{}};return h[e].call(t.exports,t,t.exports,r),t.loaded=!0,t.exports}r.m=h,e=[],r.O=(n,t,o,i)=>{if(!t){var a=1/0;for(f=0;f<e.length;f++){for(var[t,o,i]=e[f],l=!0,d=0;d<t.length;d++)(!1&i||a>=i)&&Object.keys(r.O).every(b=>r.O[b](t[d]))?t.splice(d--,1):(l=!1,i<a&&(a=i));if(l){e.splice(f--,1);var s=o();void 0!==s&&(n=s)}}return n}i=i||0;for(var f=e.length;f>0&&e[f-1][2]>i;f--)e[f]=e[f-1];e[f]=[t,o,i]},r.n=e=>{var n=e&&e.__esModule?()=>e.default:()=>e;return r.d(n,{a:n}),n},(()=>{var n,e=Object.getPrototypeOf?t=>Object.getPrototypeOf(t):t=>t.__proto__;r.t=function(t,o){if(1&o&&(t=this(t)),8&o||"object"==typeof t&&t&&(4&o&&t.__esModule||16&o&&"function"==typeof t.then))return t;var i=Object.create(null);r.r(i);var f={};n=n||[null,e({}),e([]),e(e)];for(var a=2&o&&t;"object"==typeof a&&!~n.indexOf(a);a=e(a))Object.getOwnPropertyNames(a).forEach(l=>f[l]=()=>t[l]);return f.default=()=>t,r.d(i,f),i}})(),r.d=(e,n)=>{for(var t in n)r.o(n,t)&&!r.o(e,t)&&Object.defineProperty(e,t,{enumerable:!0,get:n[t]})},r.f={},r.e=e=>Promise.all(Object.keys(r.f).reduce((n,t)=>(r.f[t](e,n),n),[])),r.u=e=>e+"."+{43:"819b1fed46aadf1b",95:"1ae8f43a396d3fea",437:"7720eaff4a1def1b"}[e]+".js",r.miniCssF=e=>{},r.o=(e,n)=>Object.prototype.hasOwnProperty.call(e,n),(()=>{var e={},n="ceph-dashboard:";r.l=(t,o,i,f)=>{if(e[t])e[t].push(o);else{var a,l;if(void 0!==i)for(var d=document.getElementsByTagName("script"),s=0;s<d.length;s++){var c=d[s];if(c.getAttribute("src")==t||c.getAttribute("data-webpack")==n+i){a=c;break}}a||(l=!0,(a=document.createElement("script")).type="module",a.charset="utf-8",a.timeout=120,r.nc&&a.setAttribute("nonce",r.nc),a.setAttribute("data-webpack",n+i),a.src=r.tu(t)),e[t]=[o];var u=(_,b)=>{a.onerror=a.onload=null,clearTimeout(p);var g=e[t];if(delete e[t],a.parentNode&&a.parentNode.removeChild(a),g&&g.forEach(y=>y(b)),_)return _(b)},p=setTimeout(u.bind(null,void 0,{type:"timeout",target:a}),12e4);a.onerror=u.bind(null,a.onerror),a.onload=u.bind(null,a.onload),l&&document.head.appendChild(a)}}})(),r.r=e=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},r.nmd=e=>(e.paths=[],e.children||(e.children=[]),e),(()=>{var e;r.tt=()=>(void 0===e&&(e={createScriptURL:n=>n},"undefined"!=typeof trustedTypes&&trustedTypes.createPolicy&&(e=trustedTypes.createPolicy("angular#bundler",e))),e)})(),r.tu=e=>r.tt().createScriptURL(e),r.p="",(()=>{var e={666:0};r.f.j=(o,i)=>{var f=r.o(e,o)?e[o]:void 0;if(0!==f)if(f)i.push(f[2]);else if(666!=o){var a=new Promise((c,u)=>f=e[o]=[c,u]);i.push(f[2]=a);var l=r.p+r.u(o),d=new Error;r.l(l,c=>{if(r.o(e,o)&&(0!==(f=e[o])&&(e[o]=void 0),f)){var u=c&&("load"===c.type?"missing":c.type),p=c&&c.target&&c.target.src;d.message="Loading chunk "+o+" failed.\n("+u+": "+p+")",d.name="ChunkLoadError",d.type=u,d.request=p,f[1](d)}},"chunk-"+o,o)}else e[o]=0},r.O.j=o=>0===e[o];var n=(o,i)=>{var d,s,[f,a,l]=i,c=0;if(f.some(p=>0!==e[p])){for(d in a)r.o(a,d)&&(r.m[d]=a[d]);if(l)var u=l(r)}for(o&&o(i);c<f.length;c++)r.o(e,s=f[c])&&e[s]&&e[s][0](),e[s]=0;return r.O(u)},t=self.webpackChunkceph_dashboard=self.webpackChunkceph_dashboard||[];t.forEach(n.bind(null,0)),t.push=n.bind(null,t.push.bind(t))})()})();
\ No newline at end of file
diff --git a/ceph/src/pybind/mgr/dashboard/frontend/dist/en-US/runtime.ab6c27cac6d7501e18e8.js b/ceph/src/pybind/mgr/dashboard/frontend/dist/en-US/runtime.ab6c27cac6d7501e18e8.js
deleted file mode 100644 (file)
index e395e4a..0000000
+++ /dev/null
@@ -1 +0,0 @@
-(()=>{"use strict";var e,h={},v={};function r(e){var n=v[e];if(void 0!==n)return n.exports;var t=v[e]={id:e,loaded:!1,exports:{}};return h[e].call(t.exports,t,t.exports,r),t.loaded=!0,t.exports}r.m=h,e=[],r.O=(n,t,f,i)=>{if(!t){var a=1/0;for(o=0;o<e.length;o++){for(var[t,f,i]=e[o],s=!0,c=0;c<t.length;c++)(!1&i||a>=i)&&Object.keys(r.O).every(b=>r.O[b](t[c]))?t.splice(c--,1):(s=!1,i<a&&(a=i));if(s){e.splice(o--,1);var l=f();void 0!==l&&(n=l)}}return n}i=i||0;for(var o=e.length;o>0&&e[o-1][2]>i;o--)e[o]=e[o-1];e[o]=[t,f,i]},r.n=e=>{var n=e&&e.__esModule?()=>e.default:()=>e;return r.d(n,{a:n}),n},(()=>{var n,e=Object.getPrototypeOf?t=>Object.getPrototypeOf(t):t=>t.__proto__;r.t=function(t,f){if(1&f&&(t=this(t)),8&f||"object"==typeof t&&t&&(4&f&&t.__esModule||16&f&&"function"==typeof t.then))return t;var i=Object.create(null);r.r(i);var o={};n=n||[null,e({}),e([]),e(e)];for(var a=2&f&&t;"object"==typeof a&&!~n.indexOf(a);a=e(a))Object.getOwnPropertyNames(a).forEach(s=>o[s]=()=>t[s]);return o.default=()=>t,r.d(i,o),i}})(),r.d=(e,n)=>{for(var t in n)r.o(n,t)&&!r.o(e,t)&&Object.defineProperty(e,t,{enumerable:!0,get:n[t]})},r.f={},r.e=e=>Promise.all(Object.keys(r.f).reduce((n,t)=>(r.f[t](e,n),n),[])),r.u=e=>e+"."+{281:"7c1918629ff8b413cc76",483:"43ef92bcd845cb24eae3",585:"7d0bcf3a0ac0c40fef3b"}[e]+".js",r.miniCssF=e=>"styles.ffb7f665775e3c191fa3.css",r.o=(e,n)=>Object.prototype.hasOwnProperty.call(e,n),(()=>{var e={},n="ceph-dashboard:";r.l=(t,f,i,o)=>{if(e[t])e[t].push(f);else{var a,s;if(void 0!==i)for(var c=document.getElementsByTagName("script"),l=0;l<c.length;l++){var d=c[l];if(d.getAttribute("src")==t||d.getAttribute("data-webpack")==n+i){a=d;break}}a||(s=!0,(a=document.createElement("script")).charset="utf-8",a.timeout=120,r.nc&&a.setAttribute("nonce",r.nc),a.setAttribute("data-webpack",n+i),a.src=r.tu(t)),e[t]=[f];var u=(_,b)=>{a.onerror=a.onload=null,clearTimeout(p);var g=e[t];if(delete e[t],a.parentNode&&a.parentNode.removeChild(a),g&&g.forEach(y=>y(b)),_)return _(b)},p=setTimeout(u.bind(null,void 0,{type:"timeout",target:a}),12e4);a.onerror=u.bind(null,a.onerror),a.onload=u.bind(null,a.onload),s&&document.head.appendChild(a)}}})(),r.r=e=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},r.nmd=e=>(e.paths=[],e.children||(e.children=[]),e),(()=>{var e;r.tu=n=>(void 0===e&&(e={createScriptURL:t=>t},"undefined"!=typeof trustedTypes&&trustedTypes.createPolicy&&(e=trustedTypes.createPolicy("angular#bundler",e))),e.createScriptURL(n))})(),r.p="",(()=>{var e={666:0};r.f.j=(f,i)=>{var o=r.o(e,f)?e[f]:void 0;if(0!==o)if(o)i.push(o[2]);else if(666!=f){var a=new Promise((d,u)=>o=e[f]=[d,u]);i.push(o[2]=a);var s=r.p+r.u(f),c=new Error;r.l(s,d=>{if(r.o(e,f)&&(0!==(o=e[f])&&(e[f]=void 0),o)){var u=d&&("load"===d.type?"missing":d.type),p=d&&d.target&&d.target.src;c.message="Loading chunk "+f+" failed.\n("+u+": "+p+")",c.name="ChunkLoadError",c.type=u,c.request=p,o[1](c)}},"chunk-"+f,f)}else e[f]=0},r.O.j=f=>0===e[f];var n=(f,i)=>{var c,l,[o,a,s]=i,d=0;for(c in a)r.o(a,c)&&(r.m[c]=a[c]);if(s)var u=s(r);for(f&&f(i);d<o.length;d++)r.o(e,l=o[d])&&e[l]&&e[l][0](),e[o[d]]=0;return r.O(u)},t=self.webpackChunkceph_dashboard=self.webpackChunkceph_dashboard||[];t.forEach(n.bind(null,0)),t.push=n.bind(null,t.push.bind(t))})()})();
\ No newline at end of file
diff --git a/ceph/src/pybind/mgr/dashboard/frontend/dist/en-US/scripts.6bda3fa7e09a87cd4228.js b/ceph/src/pybind/mgr/dashboard/frontend/dist/en-US/scripts.6bda3fa7e09a87cd4228.js
deleted file mode 100644 (file)
index cdf19c7..0000000
+++ /dev/null
@@ -1,7 +0,0 @@
-/*!
- * Chart.js v2.9.4
- * https://www.chartjs.org
- * (c) 2020 Chart.js Contributors
- * Released under the MIT License
- */
-!function(t,e){"object"==typeof exports&&"undefined"!=typeof module?module.exports=e():"function"==typeof define&&define.amd?define(e):(t=t||self).Chart=e()}(this,function(){"use strict";"undefined"!=typeof globalThis?globalThis:"undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof self&&self;function t(){throw new Error("Dynamic requires are not currently supported by rollup-plugin-commonjs")}function e(t,e){return t(e={exports:{}},e.exports),e.exports}var n={aliceblue:[240,248,255],antiquewhite:[250,235,215],aqua:[0,255,255],aquamarine:[127,255,212],azure:[240,255,255],beige:[245,245,220],bisque:[255,228,196],black:[0,0,0],blanchedalmond:[255,235,205],blue:[0,0,255],blueviolet:[138,43,226],brown:[165,42,42],burlywood:[222,184,135],cadetblue:[95,158,160],chartreuse:[127,255,0],chocolate:[210,105,30],coral:[255,127,80],cornflowerblue:[100,149,237],cornsilk:[255,248,220],crimson:[220,20,60],cyan:[0,255,255],darkblue:[0,0,139],darkcyan:[0,139,139],darkgoldenrod:[184,134,11],darkgray:[169,169,169],darkgreen:[0,100,0],darkgrey:[169,169,169],darkkhaki:[189,183,107],darkmagenta:[139,0,139],darkolivegreen:[85,107,47],darkorange:[255,140,0],darkorchid:[153,50,204],darkred:[139,0,0],darksalmon:[233,150,122],darkseagreen:[143,188,143],darkslateblue:[72,61,139],darkslategray:[47,79,79],darkslategrey:[47,79,79],darkturquoise:[0,206,209],darkviolet:[148,0,211],deeppink:[255,20,147],deepskyblue:[0,191,255],dimgray:[105,105,105],dimgrey:[105,105,105],dodgerblue:[30,144,255],firebrick:[178,34,34],floralwhite:[255,250,240],forestgreen:[34,139,34],fuchsia:[255,0,255],gainsboro:[220,220,220],ghostwhite:[248,248,255],gold:[255,215,0],goldenrod:[218,165,32],gray:[128,128,128],green:[0,128,0],greenyellow:[173,255,47],grey:[128,128,128],honeydew:[240,255,240],hotpink:[255,105,180],indianred:[205,92,92],indigo:[75,0,130],ivory:[255,255,240],khaki:[240,230,140],lavender:[230,230,250],lavenderblush:[255,240,245],lawngreen:[124,252,0],lemonchiffon:[255,250,205],lightblue:[173,216,230],lightcoral:[240,128,128],lightcyan:[224,255,255],lightgoldenrodyellow:[250,250,210],lightgray:[211,211,211],lightgreen:[144,238,144],lightgrey:[211,211,211],lightpink:[255,182,193],lightsalmon:[255,160,122],lightseagreen:[32,178,170],lightskyblue:[135,206,250],lightslategray:[119,136,153],lightslategrey:[119,136,153],lightsteelblue:[176,196,222],lightyellow:[255,255,224],lime:[0,255,0],limegreen:[50,205,50],linen:[250,240,230],magenta:[255,0,255],maroon:[128,0,0],mediumaquamarine:[102,205,170],mediumblue:[0,0,205],mediumorchid:[186,85,211],mediumpurple:[147,112,219],mediumseagreen:[60,179,113],mediumslateblue:[123,104,238],mediumspringgreen:[0,250,154],mediumturquoise:[72,209,204],mediumvioletred:[199,21,133],midnightblue:[25,25,112],mintcream:[245,255,250],mistyrose:[255,228,225],moccasin:[255,228,181],navajowhite:[255,222,173],navy:[0,0,128],oldlace:[253,245,230],olive:[128,128,0],olivedrab:[107,142,35],orange:[255,165,0],orangered:[255,69,0],orchid:[218,112,214],palegoldenrod:[238,232,170],palegreen:[152,251,152],paleturquoise:[175,238,238],palevioletred:[219,112,147],papayawhip:[255,239,213],peachpuff:[255,218,185],peru:[205,133,63],pink:[255,192,203],plum:[221,160,221],powderblue:[176,224,230],purple:[128,0,128],rebeccapurple:[102,51,153],red:[255,0,0],rosybrown:[188,143,143],royalblue:[65,105,225],saddlebrown:[139,69,19],salmon:[250,128,114],sandybrown:[244,164,96],seagreen:[46,139,87],seashell:[255,245,238],sienna:[160,82,45],silver:[192,192,192],skyblue:[135,206,235],slateblue:[106,90,205],slategray:[112,128,144],slategrey:[112,128,144],snow:[255,250,250],springgreen:[0,255,127],steelblue:[70,130,180],tan:[210,180,140],teal:[0,128,128],thistle:[216,191,216],tomato:[255,99,71],turquoise:[64,224,208],violet:[238,130,238],wheat:[245,222,179],white:[255,255,255],whitesmoke:[245,245,245],yellow:[255,255,0],yellowgreen:[154,205,50]},i=e(function(t){var e={};for(var i in n)n.hasOwnProperty(i)&&(e[n[i]]=i);var a=t.exports={rgb:{channels:3,labels:"rgb"},hsl:{channels:3,labels:"hsl"},hsv:{channels:3,labels:"hsv"},hwb:{channels:3,labels:"hwb"},cmyk:{channels:4,labels:"cmyk"},xyz:{channels:3,labels:"xyz"},lab:{channels:3,labels:"lab"},lch:{channels:3,labels:"lch"},hex:{channels:1,labels:["hex"]},keyword:{channels:1,labels:["keyword"]},ansi16:{channels:1,labels:["ansi16"]},ansi256:{channels:1,labels:["ansi256"]},hcg:{channels:3,labels:["h","c","g"]},apple:{channels:3,labels:["r16","g16","b16"]},gray:{channels:1,labels:["gray"]}};for(var r in a)if(a.hasOwnProperty(r)){if(!("channels"in a[r]))throw new Error("missing channels property: "+r);if(!("labels"in a[r]))throw new Error("missing channel labels property: "+r);if(a[r].labels.length!==a[r].channels)throw new Error("channel and label counts mismatch: "+r);var o=a[r].channels,s=a[r].labels;delete a[r].channels,delete a[r].labels,Object.defineProperty(a[r],"channels",{value:o}),Object.defineProperty(a[r],"labels",{value:s})}a.rgb.hsl=function(t){var e,n,i=t[0]/255,a=t[1]/255,r=t[2]/255,o=Math.min(i,a,r),s=Math.max(i,a,r),l=s-o;return s===o?e=0:i===s?e=(a-r)/l:a===s?e=2+(r-i)/l:r===s&&(e=4+(i-a)/l),(e=Math.min(60*e,360))<0&&(e+=360),n=(o+s)/2,[e,100*(s===o?0:n<=.5?l/(s+o):l/(2-s-o)),100*n]},a.rgb.hsv=function(t){var e,n,i,a,r,o=t[0]/255,s=t[1]/255,l=t[2]/255,u=Math.max(o,s,l),d=u-Math.min(o,s,l),h=function(t){return(u-t)/6/d+.5};return 0===d?a=r=0:(r=d/u,e=h(o),n=h(s),i=h(l),o===u?a=i-n:s===u?a=1/3+e-i:l===u&&(a=2/3+n-e),a<0?a+=1:a>1&&(a-=1)),[360*a,100*r,100*u]},a.rgb.hwb=function(t){var e=t[0],n=t[1],i=t[2];return[a.rgb.hsl(t)[0],100*(1/255*Math.min(e,Math.min(n,i))),100*(i=1-1/255*Math.max(e,Math.max(n,i)))]},a.rgb.cmyk=function(t){var e,n=t[0]/255,i=t[1]/255,a=t[2]/255;return[100*((1-n-(e=Math.min(1-n,1-i,1-a)))/(1-e)||0),100*((1-i-e)/(1-e)||0),100*((1-a-e)/(1-e)||0),100*e]},a.rgb.keyword=function(t){var i=e[t];if(i)return i;var a,r,o,s=1/0;for(var l in n)if(n.hasOwnProperty(l)){var u=n[l],d=(r=t,o=u,Math.pow(r[0]-o[0],2)+Math.pow(r[1]-o[1],2)+Math.pow(r[2]-o[2],2));d<s&&(s=d,a=l)}return a},a.keyword.rgb=function(t){return n[t]},a.rgb.xyz=function(t){var e=t[0]/255,n=t[1]/255,i=t[2]/255;return[100*(.4124*(e=e>.04045?Math.pow((e+.055)/1.055,2.4):e/12.92)+.3576*(n=n>.04045?Math.pow((n+.055)/1.055,2.4):n/12.92)+.1805*(i=i>.04045?Math.pow((i+.055)/1.055,2.4):i/12.92)),100*(.2126*e+.7152*n+.0722*i),100*(.0193*e+.1192*n+.9505*i)]},a.rgb.lab=function(t){var e=a.rgb.xyz(t),n=e[0],i=e[1],r=e[2];return i/=100,r/=108.883,n=(n/=95.047)>.008856?Math.pow(n,1/3):7.787*n+16/116,[116*(i=i>.008856?Math.pow(i,1/3):7.787*i+16/116)-16,500*(n-i),200*(i-(r=r>.008856?Math.pow(r,1/3):7.787*r+16/116))]},a.hsl.rgb=function(t){var e,n,i,a,r,o=t[0]/360,s=t[1]/100,l=t[2]/100;if(0===s)return[r=255*l,r,r];e=2*l-(n=l<.5?l*(1+s):l+s-l*s),a=[0,0,0];for(var u=0;u<3;u++)(i=o+1/3*-(u-1))<0&&i++,i>1&&i--,r=6*i<1?e+6*(n-e)*i:2*i<1?n:3*i<2?e+(n-e)*(2/3-i)*6:e,a[u]=255*r;return a},a.hsl.hsv=function(t){var e=t[0],n=t[1]/100,i=t[2]/100,a=n,r=Math.max(i,.01);return n*=(i*=2)<=1?i:2-i,a*=r<=1?r:2-r,[e,100*(0===i?2*a/(r+a):2*n/(i+n)),100*((i+n)/2)]},a.hsv.rgb=function(t){var e=t[0]/60,n=t[1]/100,i=t[2]/100,a=Math.floor(e)%6,r=e-Math.floor(e),o=255*i*(1-n),s=255*i*(1-n*r),l=255*i*(1-n*(1-r));switch(i*=255,a){case 0:return[i,l,o];case 1:return[s,i,o];case 2:return[o,i,l];case 3:return[o,s,i];case 4:return[l,o,i];case 5:return[i,o,s]}},a.hsv.hsl=function(t){var e,n,i,a=t[0],r=t[1]/100,o=t[2]/100,s=Math.max(o,.01);return i=(2-r)*o,n=r*s,[a,100*(n=(n/=(e=(2-r)*s)<=1?e:2-e)||0),100*(i/=2)]},a.hwb.rgb=function(t){var e,n,i,a,r,o,s,l=t[0]/360,u=t[1]/100,d=t[2]/100,h=u+d;switch(h>1&&(u/=h,d/=h),i=6*l-(e=Math.floor(6*l)),0!=(1&e)&&(i=1-i),a=u+i*((n=1-d)-u),e){default:case 6:case 0:r=n,o=a,s=u;break;case 1:r=a,o=n,s=u;break;case 2:r=u,o=n,s=a;break;case 3:r=u,o=a,s=n;break;case 4:r=a,o=u,s=n;break;case 5:r=n,o=u,s=a}return[255*r,255*o,255*s]},a.cmyk.rgb=function(t){var e=t[0]/100,n=t[1]/100,i=t[2]/100,a=t[3]/100;return[255*(1-Math.min(1,e*(1-a)+a)),255*(1-Math.min(1,n*(1-a)+a)),255*(1-Math.min(1,i*(1-a)+a))]},a.xyz.rgb=function(t){var e,n,i,a=t[0]/100,r=t[1]/100,o=t[2]/100;return n=-.9689*a+1.8758*r+.0415*o,i=.0557*a+-.204*r+1.057*o,e=(e=3.2406*a+-1.5372*r+-.4986*o)>.0031308?1.055*Math.pow(e,1/2.4)-.055:12.92*e,n=n>.0031308?1.055*Math.pow(n,1/2.4)-.055:12.92*n,i=i>.0031308?1.055*Math.pow(i,1/2.4)-.055:12.92*i,[255*(e=Math.min(Math.max(0,e),1)),255*(n=Math.min(Math.max(0,n),1)),255*(i=Math.min(Math.max(0,i),1))]},a.xyz.lab=function(t){var e=t[0],n=t[1],i=t[2];return n/=100,i/=108.883,e=(e/=95.047)>.008856?Math.pow(e,1/3):7.787*e+16/116,[116*(n=n>.008856?Math.pow(n,1/3):7.787*n+16/116)-16,500*(e-n),200*(n-(i=i>.008856?Math.pow(i,1/3):7.787*i+16/116))]},a.lab.xyz=function(t){var e,n,i,a=t[0];e=t[1]/500+(n=(a+16)/116),i=n-t[2]/200;var r=Math.pow(n,3),o=Math.pow(e,3),s=Math.pow(i,3);return n=r>.008856?r:(n-16/116)/7.787,e=o>.008856?o:(e-16/116)/7.787,i=s>.008856?s:(i-16/116)/7.787,[e*=95.047,n*=100,i*=108.883]},a.lab.lch=function(t){var e,n=t[0],i=t[1],a=t[2];return(e=360*Math.atan2(a,i)/2/Math.PI)<0&&(e+=360),[n,Math.sqrt(i*i+a*a),e]},a.lch.lab=function(t){var e,n=t[0],i=t[1];return e=t[2]/360*2*Math.PI,[n,i*Math.cos(e),i*Math.sin(e)]},a.rgb.ansi16=function(t){var e=t[0],n=t[1],i=t[2],r=1 in arguments?arguments[1]:a.rgb.hsv(t)[2];if(0===(r=Math.round(r/50)))return 30;var o=30+(Math.round(i/255)<<2|Math.round(n/255)<<1|Math.round(e/255));return 2===r&&(o+=60),o},a.hsv.ansi16=function(t){return a.rgb.ansi16(a.hsv.rgb(t),t[2])},a.rgb.ansi256=function(t){var e=t[0],n=t[1],i=t[2];return e===n&&n===i?e<8?16:e>248?231:Math.round((e-8)/247*24)+232:16+36*Math.round(e/255*5)+6*Math.round(n/255*5)+Math.round(i/255*5)},a.ansi16.rgb=function(t){var e=t%10;if(0===e||7===e)return t>50&&(e+=3.5),[e=e/10.5*255,e,e];var n=.5*(1+~~(t>50));return[(1&e)*n*255,(e>>1&1)*n*255,(e>>2&1)*n*255]},a.ansi256.rgb=function(t){if(t>=232){var e=10*(t-232)+8;return[e,e,e]}var n;return t-=16,[Math.floor(t/36)/5*255,Math.floor((n=t%36)/6)/5*255,n%6/5*255]},a.rgb.hex=function(t){var e=(((255&Math.round(t[0]))<<16)+((255&Math.round(t[1]))<<8)+(255&Math.round(t[2]))).toString(16).toUpperCase();return"000000".substring(e.length)+e},a.hex.rgb=function(t){var e=t.toString(16).match(/[a-f0-9]{6}|[a-f0-9]{3}/i);if(!e)return[0,0,0];var n=e[0];3===e[0].length&&(n=n.split("").map(function(t){return t+t}).join(""));var i=parseInt(n,16);return[i>>16&255,i>>8&255,255&i]},a.rgb.hcg=function(t){var e,n=t[0]/255,i=t[1]/255,a=t[2]/255,r=Math.max(Math.max(n,i),a),o=Math.min(Math.min(n,i),a),s=r-o;return e=s<=0?0:r===n?(i-a)/s%6:r===i?2+(a-n)/s:4+(n-i)/s+4,e/=6,[360*(e%=1),100*s,100*(s<1?o/(1-s):0)]},a.hsl.hcg=function(t){var e=t[1]/100,n=t[2]/100,i=1,a=0;return(i=n<.5?2*e*n:2*e*(1-n))<1&&(a=(n-.5*i)/(1-i)),[t[0],100*i,100*a]},a.hsv.hcg=function(t){var e=t[1]/100,n=t[2]/100,i=e*n,a=0;return i<1&&(a=(n-i)/(1-i)),[t[0],100*i,100*a]},a.hcg.rgb=function(t){var e=t[0]/360,n=t[1]/100,i=t[2]/100;if(0===n)return[255*i,255*i,255*i];var a,r=[0,0,0],o=e%1*6,s=o%1,l=1-s;switch(Math.floor(o)){case 0:r[0]=1,r[1]=s,r[2]=0;break;case 1:r[0]=l,r[1]=1,r[2]=0;break;case 2:r[0]=0,r[1]=1,r[2]=s;break;case 3:r[0]=0,r[1]=l,r[2]=1;break;case 4:r[0]=s,r[1]=0,r[2]=1;break;default:r[0]=1,r[1]=0,r[2]=l}return a=(1-n)*i,[255*(n*r[0]+a),255*(n*r[1]+a),255*(n*r[2]+a)]},a.hcg.hsv=function(t){var e=t[1]/100,n=e+t[2]/100*(1-e),i=0;return n>0&&(i=e/n),[t[0],100*i,100*n]},a.hcg.hsl=function(t){var e=t[1]/100,n=t[2]/100*(1-e)+.5*e,i=0;return n>0&&n<.5?i=e/(2*n):n>=.5&&n<1&&(i=e/(2*(1-n))),[t[0],100*i,100*n]},a.hcg.hwb=function(t){var e=t[1]/100,n=e+t[2]/100*(1-e);return[t[0],100*(n-e),100*(1-n)]},a.hwb.hcg=function(t){var e=t[1]/100,n=1-t[2]/100,i=n-e,a=0;return i<1&&(a=(n-i)/(1-i)),[t[0],100*i,100*a]},a.apple.rgb=function(t){return[t[0]/65535*255,t[1]/65535*255,t[2]/65535*255]},a.rgb.apple=function(t){return[t[0]/255*65535,t[1]/255*65535,t[2]/255*65535]},a.gray.rgb=function(t){return[t[0]/100*255,t[0]/100*255,t[0]/100*255]},a.gray.hsl=a.gray.hsv=function(t){return[0,0,t[0]]},a.gray.hwb=function(t){return[0,100,t[0]]},a.gray.cmyk=function(t){return[0,0,0,t[0]]},a.gray.lab=function(t){return[t[0],0,0]},a.gray.hex=function(t){var e=255&Math.round(t[0]/100*255),n=((e<<16)+(e<<8)+e).toString(16).toUpperCase();return"000000".substring(n.length)+n},a.rgb.gray=function(t){return[(t[0]+t[1]+t[2])/3/255*100]}});i.rgb,i.hsl,i.hsv,i.hwb,i.cmyk,i.xyz,i.lab,i.lch,i.hex,i.keyword,i.ansi16,i.ansi256,i.hcg,i.apple,i.gray;function a(t){var e=function(){for(var t={},e=Object.keys(i),n=e.length,a=0;a<n;a++)t[e[a]]={distance:-1,parent:null};return t}(),n=[t];for(e[t].distance=0;n.length;)for(var a=n.pop(),r=Object.keys(i[a]),o=r.length,s=0;s<o;s++){var l=r[s],u=e[l];-1===u.distance&&(u.distance=e[a].distance+1,u.parent=a,n.unshift(l))}return e}function r(t,e){return function(n){return e(t(n))}}function o(t,e){for(var n=[e[t].parent,t],a=i[e[t].parent][t],o=e[t].parent;e[o].parent;)n.unshift(e[o].parent),a=r(i[e[o].parent][o],a),o=e[o].parent;return a.conversion=n,a}var s={};Object.keys(i).forEach(function(t){s[t]={},Object.defineProperty(s[t],"channels",{value:i[t].channels}),Object.defineProperty(s[t],"labels",{value:i[t].labels});var e=function(t){for(var e=a(t),n={},i=Object.keys(e),r=i.length,s=0;s<r;s++){var l=i[s];null!==e[l].parent&&(n[l]=o(l,e))}return n}(t);Object.keys(e).forEach(function(n){var i=e[n];s[t][n]=function(t){var e=function(e){if(null==e)return e;arguments.length>1&&(e=Array.prototype.slice.call(arguments));var n=t(e);if("object"==typeof n)for(var i=n.length,a=0;a<i;a++)n[a]=Math.round(n[a]);return n};return"conversion"in t&&(e.conversion=t.conversion),e}(i),s[t][n].raw=function(t){var e=function(e){return null==e?e:(arguments.length>1&&(e=Array.prototype.slice.call(arguments)),t(e))};return"conversion"in t&&(e.conversion=t.conversion),e}(i)})});var l=s,u={aliceblue:[240,248,255],antiquewhite:[250,235,215],aqua:[0,255,255],aquamarine:[127,255,212],azure:[240,255,255],beige:[245,245,220],bisque:[255,228,196],black:[0,0,0],blanchedalmond:[255,235,205],blue:[0,0,255],blueviolet:[138,43,226],brown:[165,42,42],burlywood:[222,184,135],cadetblue:[95,158,160],chartreuse:[127,255,0],chocolate:[210,105,30],coral:[255,127,80],cornflowerblue:[100,149,237],cornsilk:[255,248,220],crimson:[220,20,60],cyan:[0,255,255],darkblue:[0,0,139],darkcyan:[0,139,139],darkgoldenrod:[184,134,11],darkgray:[169,169,169],darkgreen:[0,100,0],darkgrey:[169,169,169],darkkhaki:[189,183,107],darkmagenta:[139,0,139],darkolivegreen:[85,107,47],darkorange:[255,140,0],darkorchid:[153,50,204],darkred:[139,0,0],darksalmon:[233,150,122],darkseagreen:[143,188,143],darkslateblue:[72,61,139],darkslategray:[47,79,79],darkslategrey:[47,79,79],darkturquoise:[0,206,209],darkviolet:[148,0,211],deeppink:[255,20,147],deepskyblue:[0,191,255],dimgray:[105,105,105],dimgrey:[105,105,105],dodgerblue:[30,144,255],firebrick:[178,34,34],floralwhite:[255,250,240],forestgreen:[34,139,34],fuchsia:[255,0,255],gainsboro:[220,220,220],ghostwhite:[248,248,255],gold:[255,215,0],goldenrod:[218,165,32],gray:[128,128,128],green:[0,128,0],greenyellow:[173,255,47],grey:[128,128,128],honeydew:[240,255,240],hotpink:[255,105,180],indianred:[205,92,92],indigo:[75,0,130],ivory:[255,255,240],khaki:[240,230,140],lavender:[230,230,250],lavenderblush:[255,240,245],lawngreen:[124,252,0],lemonchiffon:[255,250,205],lightblue:[173,216,230],lightcoral:[240,128,128],lightcyan:[224,255,255],lightgoldenrodyellow:[250,250,210],lightgray:[211,211,211],lightgreen:[144,238,144],lightgrey:[211,211,211],lightpink:[255,182,193],lightsalmon:[255,160,122],lightseagreen:[32,178,170],lightskyblue:[135,206,250],lightslategray:[119,136,153],lightslategrey:[119,136,153],lightsteelblue:[176,196,222],lightyellow:[255,255,224],lime:[0,255,0],limegreen:[50,205,50],linen:[250,240,230],magenta:[255,0,255],maroon:[128,0,0],mediumaquamarine:[102,205,170],mediumblue:[0,0,205],mediumorchid:[186,85,211],mediumpurple:[147,112,219],mediumseagreen:[60,179,113],mediumslateblue:[123,104,238],mediumspringgreen:[0,250,154],mediumturquoise:[72,209,204],mediumvioletred:[199,21,133],midnightblue:[25,25,112],mintcream:[245,255,250],mistyrose:[255,228,225],moccasin:[255,228,181],navajowhite:[255,222,173],navy:[0,0,128],oldlace:[253,245,230],olive:[128,128,0],olivedrab:[107,142,35],orange:[255,165,0],orangered:[255,69,0],orchid:[218,112,214],palegoldenrod:[238,232,170],palegreen:[152,251,152],paleturquoise:[175,238,238],palevioletred:[219,112,147],papayawhip:[255,239,213],peachpuff:[255,218,185],peru:[205,133,63],pink:[255,192,203],plum:[221,160,221],powderblue:[176,224,230],purple:[128,0,128],rebeccapurple:[102,51,153],red:[255,0,0],rosybrown:[188,143,143],royalblue:[65,105,225],saddlebrown:[139,69,19],salmon:[250,128,114],sandybrown:[244,164,96],seagreen:[46,139,87],seashell:[255,245,238],sienna:[160,82,45],silver:[192,192,192],skyblue:[135,206,235],slateblue:[106,90,205],slategray:[112,128,144],slategrey:[112,128,144],snow:[255,250,250],springgreen:[0,255,127],steelblue:[70,130,180],tan:[210,180,140],teal:[0,128,128],thistle:[216,191,216],tomato:[255,99,71],turquoise:[64,224,208],violet:[238,130,238],wheat:[245,222,179],white:[255,255,255],whitesmoke:[245,245,245],yellow:[255,255,0],yellowgreen:[154,205,50]},d={getRgba:h,getHsla:c,getRgb:function(t){var e=h(t);return e&&e.slice(0,3)},getHsl:function(t){var e=c(t);return e&&e.slice(0,3)},getHwb:f,getAlpha:function(t){var e=h(t);if(e)return e[3];if(e=c(t))return e[3];if(e=f(t))return e[3]},hexString:function(t,e){e=void 0!==e&&3===t.length?e:t[3];return"#"+b(t[0])+b(t[1])+b(t[2])+(e>=0&&e<1?b(Math.round(255*e)):"")},rgbString:function(t,e){if(e<1||t[3]&&t[3]<1)return g(t,e);return"rgb("+t[0]+", "+t[1]+", "+t[2]+")"},rgbaString:g,percentString:function(t,e){if(e<1||t[3]&&t[3]<1)return m(t,e);var n=Math.round(t[0]/255*100),i=Math.round(t[1]/255*100),a=Math.round(t[2]/255*100);return"rgb("+n+"%, "+i+"%, "+a+"%)"},percentaString:m,hslString:function(t,e){if(e<1||t[3]&&t[3]<1)return p(t,e);return"hsl("+t[0]+", "+t[1]+"%, "+t[2]+"%)"},hslaString:p,hwbString:function(t,e){void 0===e&&(e=void 0!==t[3]?t[3]:1);return"hwb("+t[0]+", "+t[1]+"%, "+t[2]+"%"+(void 0!==e&&1!==e?", "+e:"")+")"},keyword:function(t){return y[t.slice(0,3)]}};function h(t){if(t){var e=[0,0,0],n=1,i=t.match(/^#([a-fA-F0-9]{3,4})$/i),a="";if(i){a=(i=i[1])[3];for(var r=0;r<e.length;r++)e[r]=parseInt(i[r]+i[r],16);a&&(n=Math.round(parseInt(a+a,16)/255*100)/100)}else if(i=t.match(/^#([a-fA-F0-9]{6}([a-fA-F0-9]{2})?)$/i)){a=i[2],i=i[1];for(r=0;r<e.length;r++)e[r]=parseInt(i.slice(2*r,2*r+2),16);a&&(n=Math.round(parseInt(a,16)/255*100)/100)}else if(i=t.match(/^rgba?\(\s*([+-]?\d+)\s*,\s*([+-]?\d+)\s*,\s*([+-]?\d+)\s*(?:,\s*([+-]?[\d\.]+)\s*)?\)$/i)){for(r=0;r<e.length;r++)e[r]=parseInt(i[r+1]);n=parseFloat(i[4])}else if(i=t.match(/^rgba?\(\s*([+-]?[\d\.]+)\%\s*,\s*([+-]?[\d\.]+)\%\s*,\s*([+-]?[\d\.]+)\%\s*(?:,\s*([+-]?[\d\.]+)\s*)?\)$/i)){for(r=0;r<e.length;r++)e[r]=Math.round(2.55*parseFloat(i[r+1]));n=parseFloat(i[4])}else if(i=t.match(/(\w+)/)){if("transparent"==i[1])return[0,0,0,0];if(!(e=u[i[1]]))return}for(r=0;r<e.length;r++)e[r]=v(e[r],0,255);return n=n||0==n?v(n,0,1):1,e[3]=n,e}}function c(t){if(t){var e=t.match(/^hsla?\(\s*([+-]?\d+)(?:deg)?\s*,\s*([+-]?[\d\.]+)%\s*,\s*([+-]?[\d\.]+)%\s*(?:,\s*([+-]?[\d\.]+)\s*)?\)/);if(e){var n=parseFloat(e[4]);return[v(parseInt(e[1]),0,360),v(parseFloat(e[2]),0,100),v(parseFloat(e[3]),0,100),v(isNaN(n)?1:n,0,1)]}}}function f(t){if(t){var e=t.match(/^hwb\(\s*([+-]?\d+)(?:deg)?\s*,\s*([+-]?[\d\.]+)%\s*,\s*([+-]?[\d\.]+)%\s*(?:,\s*([+-]?[\d\.]+)\s*)?\)/);if(e){var n=parseFloat(e[4]);return[v(parseInt(e[1]),0,360),v(parseFloat(e[2]),0,100),v(parseFloat(e[3]),0,100),v(isNaN(n)?1:n,0,1)]}}}function g(t,e){return void 0===e&&(e=void 0!==t[3]?t[3]:1),"rgba("+t[0]+", "+t[1]+", "+t[2]+", "+e+")"}function m(t,e){return"rgba("+Math.round(t[0]/255*100)+"%, "+Math.round(t[1]/255*100)+"%, "+Math.round(t[2]/255*100)+"%, "+(e||t[3]||1)+")"}function p(t,e){return void 0===e&&(e=void 0!==t[3]?t[3]:1),"hsla("+t[0]+", "+t[1]+"%, "+t[2]+"%, "+e+")"}function v(t,e,n){return Math.min(Math.max(e,t),n)}function b(t){var e=t.toString(16).toUpperCase();return e.length<2?"0"+e:e}var y={};for(var x in u)y[u[x]]=x;var _=function(t){return t instanceof _?t:this instanceof _?(this.valid=!1,this.values={rgb:[0,0,0],hsl:[0,0,0],hsv:[0,0,0],hwb:[0,0,0],cmyk:[0,0,0,0],alpha:1},void("string"==typeof t?(e=d.getRgba(t))?this.setValues("rgb",e):(e=d.getHsla(t))?this.setValues("hsl",e):(e=d.getHwb(t))&&this.setValues("hwb",e):"object"==typeof t&&(void 0!==(e=t).r||void 0!==e.red?this.setValues("rgb",e):void 0!==e.l||void 0!==e.lightness?this.setValues("hsl",e):void 0!==e.v||void 0!==e.value?this.setValues("hsv",e):void 0!==e.w||void 0!==e.whiteness?this.setValues("hwb",e):void 0===e.c&&void 0===e.cyan||this.setValues("cmyk",e)))):new _(t);var e};_.prototype={isValid:function(){return this.valid},rgb:function(){return this.setSpace("rgb",arguments)},hsl:function(){return this.setSpace("hsl",arguments)},hsv:function(){return this.setSpace("hsv",arguments)},hwb:function(){return this.setSpace("hwb",arguments)},cmyk:function(){return this.setSpace("cmyk",arguments)},rgbArray:function(){return this.values.rgb},hslArray:function(){return this.values.hsl},hsvArray:function(){return this.values.hsv},hwbArray:function(){var t=this.values;return 1!==t.alpha?t.hwb.concat([t.alpha]):t.hwb},cmykArray:function(){return this.values.cmyk},rgbaArray:function(){var t=this.values;return t.rgb.concat([t.alpha])},hslaArray:function(){var t=this.values;return t.hsl.concat([t.alpha])},alpha:function(t){return void 0===t?this.values.alpha:(this.setValues("alpha",t),this)},red:function(t){return this.setChannel("rgb",0,t)},green:function(t){return this.setChannel("rgb",1,t)},blue:function(t){return this.setChannel("rgb",2,t)},hue:function(t){return t&&(t=(t%=360)<0?360+t:t),this.setChannel("hsl",0,t)},saturation:function(t){return this.setChannel("hsl",1,t)},lightness:function(t){return this.setChannel("hsl",2,t)},saturationv:function(t){return this.setChannel("hsv",1,t)},whiteness:function(t){return this.setChannel("hwb",1,t)},blackness:function(t){return this.setChannel("hwb",2,t)},value:function(t){return this.setChannel("hsv",2,t)},cyan:function(t){return this.setChannel("cmyk",0,t)},magenta:function(t){return this.setChannel("cmyk",1,t)},yellow:function(t){return this.setChannel("cmyk",2,t)},black:function(t){return this.setChannel("cmyk",3,t)},hexString:function(){return d.hexString(this.values.rgb)},rgbString:function(){return d.rgbString(this.values.rgb,this.values.alpha)},rgbaString:function(){return d.rgbaString(this.values.rgb,this.values.alpha)},percentString:function(){return d.percentString(this.values.rgb,this.values.alpha)},hslString:function(){return d.hslString(this.values.hsl,this.values.alpha)},hslaString:function(){return d.hslaString(this.values.hsl,this.values.alpha)},hwbString:function(){return d.hwbString(this.values.hwb,this.values.alpha)},keyword:function(){return d.keyword(this.values.rgb,this.values.alpha)},rgbNumber:function(){var t=this.values.rgb;return t[0]<<16|t[1]<<8|t[2]},luminosity:function(){for(var t=this.values.rgb,e=[],n=0;n<t.length;n++){var i=t[n]/255;e[n]=i<=.03928?i/12.92:Math.pow((i+.055)/1.055,2.4)}return.2126*e[0]+.7152*e[1]+.0722*e[2]},contrast:function(t){var e=this.luminosity(),n=t.luminosity();return e>n?(e+.05)/(n+.05):(n+.05)/(e+.05)},level:function(t){var e=this.contrast(t);return e>=7.1?"AAA":e>=4.5?"AA":""},dark:function(){var t=this.values.rgb;return(299*t[0]+587*t[1]+114*t[2])/1e3<128},light:function(){return!this.dark()},negate:function(){for(var t=[],e=0;e<3;e++)t[e]=255-this.values.rgb[e];return this.setValues("rgb",t),this},lighten:function(t){var e=this.values.hsl;return e[2]+=e[2]*t,this.setValues("hsl",e),this},darken:function(t){var e=this.values.hsl;return e[2]-=e[2]*t,this.setValues("hsl",e),this},saturate:function(t){var e=this.values.hsl;return e[1]+=e[1]*t,this.setValues("hsl",e),this},desaturate:function(t){var e=this.values.hsl;return e[1]-=e[1]*t,this.setValues("hsl",e),this},whiten:function(t){var e=this.values.hwb;return e[1]+=e[1]*t,this.setValues("hwb",e),this},blacken:function(t){var e=this.values.hwb;return e[2]+=e[2]*t,this.setValues("hwb",e),this},greyscale:function(){var t=this.values.rgb,e=.3*t[0]+.59*t[1]+.11*t[2];return this.setValues("rgb",[e,e,e]),this},clearer:function(t){var e=this.values.alpha;return this.setValues("alpha",e-e*t),this},opaquer:function(t){var e=this.values.alpha;return this.setValues("alpha",e+e*t),this},rotate:function(t){var e=this.values.hsl,n=(e[0]+t)%360;return e[0]=n<0?360+n:n,this.setValues("hsl",e),this},mix:function(t,e){var n=this,i=t,a=void 0===e?.5:e,r=2*a-1,o=n.alpha()-i.alpha(),s=((r*o==-1?r:(r+o)/(1+r*o))+1)/2,l=1-s;return this.rgb(s*n.red()+l*i.red(),s*n.green()+l*i.green(),s*n.blue()+l*i.blue()).alpha(n.alpha()*a+i.alpha()*(1-a))},toJSON:function(){return this.rgb()},clone:function(){var t,e,n=new _,i=this.values,a=n.values;for(var r in i)i.hasOwnProperty(r)&&(t=i[r],"[object Array]"===(e={}.toString.call(t))?a[r]=t.slice(0):"[object Number]"===e?a[r]=t:console.error("unexpected color value:",t));return n}},_.prototype.spaces={rgb:["red","green","blue"],hsl:["hue","saturation","lightness"],hsv:["hue","saturation","value"],hwb:["hue","whiteness","blackness"],cmyk:["cyan","magenta","yellow","black"]},_.prototype.maxes={rgb:[255,255,255],hsl:[360,100,100],hsv:[360,100,100],hwb:[360,100,100],cmyk:[100,100,100,100]},_.prototype.getValues=function(t){for(var e=this.values,n={},i=0;i<t.length;i++)n[t.charAt(i)]=e[t][i];return 1!==e.alpha&&(n.a=e.alpha),n},_.prototype.setValues=function(t,e){var n,i,a=this.values,r=this.spaces,o=this.maxes,s=1;if(this.valid=!0,"alpha"===t)s=e;else if(e.length)a[t]=e.slice(0,t.length),s=e[t.length];else if(void 0!==e[t.charAt(0)]){for(n=0;n<t.length;n++)a[t][n]=e[t.charAt(n)];s=e.a}else if(void 0!==e[r[t][0]]){var u=r[t];for(n=0;n<t.length;n++)a[t][n]=e[u[n]];s=e.alpha}if(a.alpha=Math.max(0,Math.min(1,void 0===s?a.alpha:s)),"alpha"===t)return!1;for(n=0;n<t.length;n++)i=Math.max(0,Math.min(o[t][n],a[t][n])),a[t][n]=Math.round(i);for(var d in r)d!==t&&(a[d]=l[t][d](a[t]));return!0},_.prototype.setSpace=function(t,e){var n=e[0];return void 0===n?this.getValues(t):("number"==typeof n&&(n=Array.prototype.slice.call(e)),this.setValues(t,n),this)},_.prototype.setChannel=function(t,e,n){var i=this.values[t];return void 0===n?i[e]:(n===i[e]||(i[e]=n,this.setValues(t,i)),this)},"undefined"!=typeof window&&(window.Color=_);var w=_;function k(t){return-1===["__proto__","prototype","constructor"].indexOf(t)}var M,S={noop:function(){},uid:(M=0,function(){return M++}),isNullOrUndef:function(t){return null==t},isArray:function(t){if(Array.isArray&&Array.isArray(t))return!0;var e=Object.prototype.toString.call(t);return"[object"===e.substr(0,7)&&"Array]"===e.substr(-6)},isObject:function(t){return null!==t&&"[object Object]"===Object.prototype.toString.call(t)},isFinite:function(t){return("number"==typeof t||t instanceof Number)&&isFinite(t)},valueOrDefault:function(t,e){return void 0===t?e:t},valueAtIndexOrDefault:function(t,e,n){return S.valueOrDefault(S.isArray(t)?t[e]:t,n)},callback:function(t,e,n){if(t&&"function"==typeof t.call)return t.apply(n,e)},each:function(t,e,n,i){var a,r,o;if(S.isArray(t))if(r=t.length,i)for(a=r-1;a>=0;a--)e.call(n,t[a],a);else for(a=0;a<r;a++)e.call(n,t[a],a);else if(S.isObject(t))for(r=(o=Object.keys(t)).length,a=0;a<r;a++)e.call(n,t[o[a]],o[a])},arrayEquals:function(t,e){var n,i,a,r;if(!t||!e||t.length!==e.length)return!1;for(n=0,i=t.length;n<i;++n)if(a=t[n],r=e[n],a instanceof Array&&r instanceof Array){if(!S.arrayEquals(a,r))return!1}else if(a!==r)return!1;return!0},clone:function(t){if(S.isArray(t))return t.map(S.clone);if(S.isObject(t)){for(var e=Object.create(t),n=Object.keys(t),i=n.length,a=0;a<i;++a)e[n[a]]=S.clone(t[n[a]]);return e}return t},_merger:function(t,e,n,i){if(k(t)){var a=e[t],r=n[t];S.isObject(a)&&S.isObject(r)?S.merge(a,r,i):e[t]=S.clone(r)}},_mergerIf:function(t,e,n){if(k(t)){var i=e[t],a=n[t];S.isObject(i)&&S.isObject(a)?S.mergeIf(i,a):e.hasOwnProperty(t)||(e[t]=S.clone(a))}},merge:function(t,e,n){var i,a,r,o,s,l=S.isArray(e)?e:[e],u=l.length;if(!S.isObject(t))return t;for(i=(n=n||{}).merger||S._merger,a=0;a<u;++a)if(e=l[a],S.isObject(e))for(s=0,o=(r=Object.keys(e)).length;s<o;++s)i(r[s],t,e,n);return t},mergeIf:function(t,e){return S.merge(t,e,{merger:S._mergerIf})},extend:Object.assign||function(t){return S.merge(t,[].slice.call(arguments,1),{merger:function(t,e,n){e[t]=n[t]}})},inherits:function(t){var e=this,n=t&&t.hasOwnProperty("constructor")?t.constructor:function(){return e.apply(this,arguments)},i=function(){this.constructor=n};return i.prototype=e.prototype,n.prototype=new i,n.extend=S.inherits,t&&S.extend(n.prototype,t),n.__super__=e.prototype,n},_deprecated:function(t,e,n,i){void 0!==e&&console.warn(t+': "'+n+'" is deprecated. Please use "'+i+'" instead')}},D=S;S.callCallback=S.callback,S.indexOf=function(t,e,n){return Array.prototype.indexOf.call(t,e,n)},S.getValueOrDefault=S.valueOrDefault,S.getValueAtIndexOrDefault=S.valueAtIndexOrDefault;var C={linear:function(t){return t},easeInQuad:function(t){return t*t},easeOutQuad:function(t){return-t*(t-2)},easeInOutQuad:function(t){return(t/=.5)<1?.5*t*t:-.5*(--t*(t-2)-1)},easeInCubic:function(t){return t*t*t},easeOutCubic:function(t){return(t-=1)*t*t+1},easeInOutCubic:function(t){return(t/=.5)<1?.5*t*t*t:.5*((t-=2)*t*t+2)},easeInQuart:function(t){return t*t*t*t},easeOutQuart:function(t){return-((t-=1)*t*t*t-1)},easeInOutQuart:function(t){return(t/=.5)<1?.5*t*t*t*t:-.5*((t-=2)*t*t*t-2)},easeInQuint:function(t){return t*t*t*t*t},easeOutQuint:function(t){return(t-=1)*t*t*t*t+1},easeInOutQuint:function(t){return(t/=.5)<1?.5*t*t*t*t*t:.5*((t-=2)*t*t*t*t+2)},easeInSine:function(t){return 1-Math.cos(t*(Math.PI/2))},easeOutSine:function(t){return Math.sin(t*(Math.PI/2))},easeInOutSine:function(t){return-.5*(Math.cos(Math.PI*t)-1)},easeInExpo:function(t){return 0===t?0:Math.pow(2,10*(t-1))},easeOutExpo:function(t){return 1===t?1:1-Math.pow(2,-10*t)},easeInOutExpo:function(t){return 0===t?0:1===t?1:(t/=.5)<1?.5*Math.pow(2,10*(t-1)):.5*(2-Math.pow(2,-10*--t))},easeInCirc:function(t){return t>=1?t:-(Math.sqrt(1-t*t)-1)},easeOutCirc:function(t){return Math.sqrt(1-(t-=1)*t)},easeInOutCirc:function(t){return(t/=.5)<1?-.5*(Math.sqrt(1-t*t)-1):.5*(Math.sqrt(1-(t-=2)*t)+1)},easeInElastic:function(t){var e=1.70158,n=0,i=1;return 0===t?0:1===t?1:(n||(n=.3),i<1?(i=1,e=n/4):e=n/(2*Math.PI)*Math.asin(1/i),-i*Math.pow(2,10*(t-=1))*Math.sin((t-e)*(2*Math.PI)/n))},easeOutElastic:function(t){var e=1.70158,n=0,i=1;return 0===t?0:1===t?1:(n||(n=.3),i<1?(i=1,e=n/4):e=n/(2*Math.PI)*Math.asin(1/i),i*Math.pow(2,-10*t)*Math.sin((t-e)*(2*Math.PI)/n)+1)},easeInOutElastic:function(t){var e=1.70158,n=0,i=1;return 0===t?0:2==(t/=.5)?1:(n||(n=.45),i<1?(i=1,e=n/4):e=n/(2*Math.PI)*Math.asin(1/i),t<1?i*Math.pow(2,10*(t-=1))*Math.sin((t-e)*(2*Math.PI)/n)*-.5:i*Math.pow(2,-10*(t-=1))*Math.sin((t-e)*(2*Math.PI)/n)*.5+1)},easeInBack:function(t){var e=1.70158;return t*t*((e+1)*t-e)},easeOutBack:function(t){var e=1.70158;return(t-=1)*t*((e+1)*t+e)+1},easeInOutBack:function(t){var e=1.70158;return(t/=.5)<1?t*t*((1+(e*=1.525))*t-e)*.5:.5*((t-=2)*t*((1+(e*=1.525))*t+e)+2)},easeInBounce:function(t){return 1-C.easeOutBounce(1-t)},easeOutBounce:function(t){return t<1/2.75?7.5625*t*t:t<2/2.75?7.5625*(t-=1.5/2.75)*t+.75:t<2.5/2.75?7.5625*(t-=2.25/2.75)*t+.9375:7.5625*(t-=2.625/2.75)*t+.984375},easeInOutBounce:function(t){return t<.5?.5*C.easeInBounce(2*t):.5*C.easeOutBounce(2*t-1)+.5}},P={effects:C};D.easingEffects=C;var T=Math.PI,O=T/180,A=2*T,F=T/2,I=T/4,L=2*T/3,R={clear:function(t){t.ctx.clearRect(0,0,t.width,t.height)},roundedRect:function(t,e,n,i,a,r){if(r){var o=Math.min(r,a/2,i/2),s=e+o,l=n+o,u=e+i-o,d=n+a-o;t.moveTo(e,l),s<u&&l<d?(t.arc(s,l,o,-T,-F),t.arc(u,l,o,-F,0),t.arc(u,d,o,0,F),t.arc(s,d,o,F,T)):s<u?(t.moveTo(s,n),t.arc(u,l,o,-F,F),t.arc(s,l,o,F,T+F)):l<d?(t.arc(s,l,o,-T,0),t.arc(s,d,o,0,T)):t.arc(s,l,o,-T,T),t.closePath(),t.moveTo(e,n)}else t.rect(e,n,i,a)},drawPoint:function(t,e,n,i,a,r){var o,s,l,u,d,h=(r||0)*O;if(e&&"object"==typeof e&&("[object HTMLImageElement]"===(o=e.toString())||"[object HTMLCanvasElement]"===o))return t.save(),t.translate(i,a),t.rotate(h),t.drawImage(e,-e.width/2,-e.height/2,e.width,e.height),void t.restore();if(!(isNaN(n)||n<=0)){switch(t.beginPath(),e){default:t.arc(i,a,n,0,A),t.closePath();break;case"triangle":t.moveTo(i+Math.sin(h)*n,a-Math.cos(h)*n),h+=L,t.lineTo(i+Math.sin(h)*n,a-Math.cos(h)*n),h+=L,t.lineTo(i+Math.sin(h)*n,a-Math.cos(h)*n),t.closePath();break;case"rectRounded":u=n-(d=.516*n),s=Math.cos(h+I)*u,l=Math.sin(h+I)*u,t.arc(i-s,a-l,d,h-T,h-F),t.arc(i+l,a-s,d,h-F,h),t.arc(i+s,a+l,d,h,h+F),t.arc(i-l,a+s,d,h+F,h+T),t.closePath();break;case"rect":if(!r){u=Math.SQRT1_2*n,t.rect(i-u,a-u,2*u,2*u);break}h+=I;case"rectRot":s=Math.cos(h)*n,l=Math.sin(h)*n,t.moveTo(i-s,a-l),t.lineTo(i+l,a-s),t.lineTo(i+s,a+l),t.lineTo(i-l,a+s),t.closePath();break;case"crossRot":h+=I;case"cross":s=Math.cos(h)*n,l=Math.sin(h)*n,t.moveTo(i-s,a-l),t.lineTo(i+s,a+l),t.moveTo(i+l,a-s),t.lineTo(i-l,a+s);break;case"star":s=Math.cos(h)*n,l=Math.sin(h)*n,t.moveTo(i-s,a-l),t.lineTo(i+s,a+l),t.moveTo(i+l,a-s),t.lineTo(i-l,a+s),h+=I,s=Math.cos(h)*n,l=Math.sin(h)*n,t.moveTo(i-s,a-l),t.lineTo(i+s,a+l),t.moveTo(i+l,a-s),t.lineTo(i-l,a+s);break;case"line":s=Math.cos(h)*n,l=Math.sin(h)*n,t.moveTo(i-s,a-l),t.lineTo(i+s,a+l);break;case"dash":t.moveTo(i,a),t.lineTo(i+Math.cos(h)*n,a+Math.sin(h)*n)}t.fill(),t.stroke()}},_isPointInArea:function(t,e){var n=1e-6;return t.x>e.left-n&&t.x<e.right+n&&t.y>e.top-n&&t.y<e.bottom+n},clipArea:function(t,e){t.save(),t.beginPath(),t.rect(e.left,e.top,e.right-e.left,e.bottom-e.top),t.clip()},unclipArea:function(t){t.restore()},lineTo:function(t,e,n,i){var a=n.steppedLine;if(a){if("middle"===a){var r=(e.x+n.x)/2;t.lineTo(r,i?n.y:e.y),t.lineTo(r,i?e.y:n.y)}else"after"===a&&!i||"after"!==a&&i?t.lineTo(e.x,n.y):t.lineTo(n.x,e.y);t.lineTo(n.x,n.y)}else n.tension?t.bezierCurveTo(i?e.controlPointPreviousX:e.controlPointNextX,i?e.controlPointPreviousY:e.controlPointNextY,i?n.controlPointNextX:n.controlPointPreviousX,i?n.controlPointNextY:n.controlPointPreviousY,n.x,n.y):t.lineTo(n.x,n.y)}},N=R;D.clear=R.clear,D.drawRoundedRectangle=function(t){t.beginPath(),R.roundedRect.apply(R,arguments)};var W={_set:function(t,e){return D.merge(this[t]||(this[t]={}),e)}};W._set("global",{defaultColor:"rgba(0,0,0,0.1)",defaultFontColor:"#666",defaultFontFamily:"'Helvetica Neue', 'Helvetica', 'Arial', sans-serif",defaultFontSize:12,defaultFontStyle:"normal",defaultLineHeight:1.2,showLines:!0});var Y=W,z=D.valueOrDefault;var E={toLineHeight:function(t,e){var n=(""+t).match(/^(normal|(\d+(?:\.\d+)?)(px|em|%)?)$/);if(!n||"normal"===n[1])return 1.2*e;switch(t=+n[2],n[3]){case"px":return t;case"%":t/=100}return e*t},toPadding:function(t){var e,n,i,a;return D.isObject(t)?(e=+t.top||0,n=+t.right||0,i=+t.bottom||0,a=+t.left||0):e=n=i=a=+t||0,{top:e,right:n,bottom:i,left:a,height:e+i,width:a+n}},_parseFont:function(t){var e=Y.global,n=z(t.fontSize,e.defaultFontSize),i={family:z(t.fontFamily,e.defaultFontFamily),lineHeight:D.options.toLineHeight(z(t.lineHeight,e.defaultLineHeight),n),size:n,style:z(t.fontStyle,e.defaultFontStyle),weight:null,string:""};return i.string=function(t){return!t||D.isNullOrUndef(t.size)||D.isNullOrUndef(t.family)?null:(t.style?t.style+" ":"")+(t.weight?t.weight+" ":"")+t.size+"px "+t.family}(i),i},resolve:function(t,e,n,i){var a,r,o,s=!0;for(a=0,r=t.length;a<r;++a)if(void 0!==(o=t[a])&&(void 0!==e&&"function"==typeof o&&(o=o(e),s=!1),void 0!==n&&D.isArray(o)&&(o=o[n],s=!1),void 0!==o))return i&&!s&&(i.cacheable=!1),o}},V={_factorize:function(t){var e,n=[],i=Math.sqrt(t);for(e=1;e<i;e++)t%e==0&&(n.push(e),n.push(t/e));return i===(0|i)&&n.push(i),n.sort(function(t,e){return t-e}).pop(),n},log10:Math.log10||function(t){var e=Math.log(t)*Math.LOG10E,n=Math.round(e);return t===Math.pow(10,n)?n:e}},H=V;D.log10=V.log10;var B=D,j=P,U=N,G=E,q=H,Z={getRtlAdapter:function(t,e,n){return t?function(t,e){return{x:function(n){return t+t+e-n},setWidth:function(t){e=t},textAlign:function(t){return"center"===t?t:"right"===t?"left":"right"},xPlus:function(t,e){return t-e},leftForLtr:function(t,e){return t-e}}}(e,n):{x:function(t){return t},setWidth:function(t){},textAlign:function(t){return t},xPlus:function(t,e){return t+e},leftForLtr:function(t,e){return t}}},overrideTextDirection:function(t,e){var n,i;"ltr"!==e&&"rtl"!==e||(i=[(n=t.canvas.style).getPropertyValue("direction"),n.getPropertyPriority("direction")],n.setProperty("direction",e,"important"),t.prevTextDirection=i)},restoreTextDirection:function(t){var e=t.prevTextDirection;void 0!==e&&(delete t.prevTextDirection,t.canvas.style.setProperty("direction",e[0],e[1]))}};B.easing=j,B.canvas=U,B.options=G,B.math=q,B.rtl=Z;var $=function(t){B.extend(this,t),this.initialize.apply(this,arguments)};B.extend($.prototype,{_type:void 0,initialize:function(){this.hidden=!1},pivot:function(){var t=this;return t._view||(t._view=B.extend({},t._model)),t._start={},t},transition:function(t){var e=this,n=e._model,i=e._start,a=e._view;return n&&1!==t?(a||(a=e._view={}),i||(i=e._start={}),function(t,e,n,i){var a,r,o,s,l,u,d,h,c,f=Object.keys(n);for(a=0,r=f.length;a<r;++a)if(u=n[o=f[a]],e.hasOwnProperty(o)||(e[o]=u),(s=e[o])!==u&&"_"!==o[0]){if(t.hasOwnProperty(o)||(t[o]=s),(d=typeof u)==typeof(l=t[o]))if("string"===d){if((h=w(l)).valid&&(c=w(u)).valid){e[o]=c.mix(h,i).rgbString();continue}}else if(B.isFinite(l)&&B.isFinite(u)){e[o]=l+(u-l)*i;continue}e[o]=u}}(i,a,n,t),e):(e._view=B.extend({},n),e._start=null,e)},tooltipPosition:function(){return{x:this._model.x,y:this._model.y}},hasValue:function(){return B.isNumber(this._model.x)&&B.isNumber(this._model.y)}}),$.extend=B.inherits;var X=$,K=X.extend({chart:null,currentStep:0,numSteps:60,easing:"",render:null,onAnimationProgress:null,onAnimationComplete:null}),J=K;Object.defineProperty(K.prototype,"animationObject",{get:function(){return this}}),Object.defineProperty(K.prototype,"chartInstance",{get:function(){return this.chart},set:function(t){this.chart=t}}),Y._set("global",{animation:{duration:1e3,easing:"easeOutQuart",onProgress:B.noop,onComplete:B.noop}});var Q={animations:[],request:null,addAnimation:function(t,e,n,i){var a,r,o=this.animations;for(e.chart=t,e.startTime=Date.now(),e.duration=n,i||(t.animating=!0),a=0,r=o.length;a<r;++a)if(o[a].chart===t)return void(o[a]=e);o.push(e),1===o.length&&this.requestAnimationFrame()},cancelAnimation:function(t){var e=B.findIndex(this.animations,function(e){return e.chart===t});-1!==e&&(this.animations.splice(e,1),t.animating=!1)},requestAnimationFrame:function(){var t=this;null===t.request&&(t.request=B.requestAnimFrame.call(window,function(){t.request=null,t.startDigest()}))},startDigest:function(){var t=this;t.advance(),t.animations.length>0&&t.requestAnimationFrame()},advance:function(){for(var t,e,n,i,a=this.animations,r=0;r<a.length;)e=(t=a[r]).chart,n=t.numSteps,i=Math.floor((Date.now()-t.startTime)/t.duration*n)+1,t.currentStep=Math.min(i,n),B.callback(t.render,[e,t],e),B.callback(t.onAnimationProgress,[t],e),t.currentStep>=n?(B.callback(t.onAnimationComplete,[t],e),e.animating=!1,a.splice(r,1)):++r}},tt=B.options.resolve,et=["push","pop","shift","splice","unshift"];function nt(t,e){var n=t._chartjs;if(n){var i=n.listeners,a=i.indexOf(e);-1!==a&&i.splice(a,1),i.length>0||(et.forEach(function(e){delete t[e]}),delete t._chartjs)}}var it=function(t,e){this.initialize(t,e)};B.extend(it.prototype,{datasetElementType:null,dataElementType:null,_datasetElementOptions:["backgroundColor","borderCapStyle","borderColor","borderDash","borderDashOffset","borderJoinStyle","borderWidth"],_dataElementOptions:["backgroundColor","borderColor","borderWidth","pointStyle"],initialize:function(t,e){var n=this;n.chart=t,n.index=e,n.linkScales(),n.addElements(),n._type=n.getMeta().type},updateIndex:function(t){this.index=t},linkScales:function(){var t=this,e=t.getMeta(),n=t.chart,i=n.scales,a=t.getDataset(),r=n.options.scales;null!==e.xAxisID&&e.xAxisID in i&&!a.xAxisID||(e.xAxisID=a.xAxisID||r.xAxes[0].id),null!==e.yAxisID&&e.yAxisID in i&&!a.yAxisID||(e.yAxisID=a.yAxisID||r.yAxes[0].id)},getDataset:function(){return this.chart.data.datasets[this.index]},getMeta:function(){return this.chart.getDatasetMeta(this.index)},getScaleForId:function(t){return this.chart.scales[t]},_getValueScaleId:function(){return this.getMeta().yAxisID},_getIndexScaleId:function(){return this.getMeta().xAxisID},_getValueScale:function(){return this.getScaleForId(this._getValueScaleId())},_getIndexScale:function(){return this.getScaleForId(this._getIndexScaleId())},reset:function(){this._update(!0)},destroy:function(){this._data&&nt(this._data,this)},createMetaDataset:function(){var t=this,e=t.datasetElementType;return e&&new e({_chart:t.chart,_datasetIndex:t.index})},createMetaData:function(t){var e=this,n=e.dataElementType;return n&&new n({_chart:e.chart,_datasetIndex:e.index,_index:t})},addElements:function(){var t,e,n=this,i=n.getMeta(),a=n.getDataset().data||[],r=i.data;for(t=0,e=a.length;t<e;++t)r[t]=r[t]||n.createMetaData(t);i.dataset=i.dataset||n.createMetaDataset()},addElementAndReset:function(t){var e=this.createMetaData(t);this.getMeta().data.splice(t,0,e),this.updateElement(e,t,!0)},buildOrUpdateElements:function(){var t,e,n=this,i=n.getDataset(),a=i.data||(i.data=[]);n._data!==a&&(n._data&&nt(n._data,n),a&&Object.isExtensible(a)&&(e=n,(t=a)._chartjs?t._chartjs.listeners.push(e):(Object.defineProperty(t,"_chartjs",{configurable:!0,enumerable:!1,value:{listeners:[e]}}),et.forEach(function(e){var n="onData"+e.charAt(0).toUpperCase()+e.slice(1),i=t[e];Object.defineProperty(t,e,{configurable:!0,enumerable:!1,value:function(){var e=Array.prototype.slice.call(arguments),a=i.apply(this,e);return B.each(t._chartjs.listeners,function(t){"function"==typeof t[n]&&t[n].apply(t,e)}),a}})}))),n._data=a),n.resyncElements()},_configure:function(){var t=this;t._config=B.merge(Object.create(null),[t.chart.options.datasets[t._type],t.getDataset()],{merger:function(t,e,n){"_meta"!==t&&"data"!==t&&B._merger(t,e,n)}})},_update:function(t){var e=this;e._configure(),e._cachedDataOpts=null,e.update(t)},update:B.noop,transition:function(t){for(var e=this.getMeta(),n=e.data||[],i=n.length,a=0;a<i;++a)n[a].transition(t);e.dataset&&e.dataset.transition(t)},draw:function(){var t=this.getMeta(),e=t.data||[],n=e.length,i=0;for(t.dataset&&t.dataset.draw();i<n;++i)e[i].draw()},getStyle:function(t){var e,n=this,i=n.getMeta(),a=i.dataset;return n._configure(),a&&void 0===t?e=n._resolveDatasetElementOptions(a||{}):(t=t||0,e=n._resolveDataElementOptions(i.data[t]||{},t)),!1!==e.fill&&null!==e.fill||(e.backgroundColor=e.borderColor),e},_resolveDatasetElementOptions:function(t,e){var n,i,a,r,o=this,s=o.chart,l=o._config,u=t.custom||{},d=s.options.elements[o.datasetElementType.prototype._type]||{},h=o._datasetElementOptions,c={},f={chart:s,dataset:o.getDataset(),datasetIndex:o.index,hover:e};for(n=0,i=h.length;n<i;++n)a=h[n],r=e?"hover"+a.charAt(0).toUpperCase()+a.slice(1):a,c[a]=tt([u[r],l[r],d[r]],f);return c},_resolveDataElementOptions:function(t,e){var n=this,i=t&&t.custom,a=n._cachedDataOpts;if(a&&!i)return a;var r,o,s,l,u=n.chart,d=n._config,h=u.options.elements[n.dataElementType.prototype._type]||{},c=n._dataElementOptions,f={},g={chart:u,dataIndex:e,dataset:n.getDataset(),datasetIndex:n.index},m={cacheable:!i};if(i=i||{},B.isArray(c))for(o=0,s=c.length;o<s;++o)f[l=c[o]]=tt([i[l],d[l],h[l]],g,e,m);else for(o=0,s=(r=Object.keys(c)).length;o<s;++o)f[l=r[o]]=tt([i[l],d[c[l]],d[l],h[l]],g,e,m);return m.cacheable&&(n._cachedDataOpts=Object.freeze(f)),f},removeHoverStyle:function(t){B.merge(t._model,t.$previousStyle||{}),delete t.$previousStyle},setHoverStyle:function(t){var e=this.chart.data.datasets[t._datasetIndex],n=t._index,i=t.custom||{},a=t._model,r=B.getHoverColor;t.$previousStyle={backgroundColor:a.backgroundColor,borderColor:a.borderColor,borderWidth:a.borderWidth},a.backgroundColor=tt([i.hoverBackgroundColor,e.hoverBackgroundColor,r(a.backgroundColor)],void 0,n),a.borderColor=tt([i.hoverBorderColor,e.hoverBorderColor,r(a.borderColor)],void 0,n),a.borderWidth=tt([i.hoverBorderWidth,e.hoverBorderWidth,a.borderWidth],void 0,n)},_removeDatasetHoverStyle:function(){var t=this.getMeta().dataset;t&&this.removeHoverStyle(t)},_setDatasetHoverStyle:function(){var t,e,n,i,a,r,o=this.getMeta().dataset,s={};if(o){for(r=o._model,a=this._resolveDatasetElementOptions(o,!0),t=0,e=(i=Object.keys(a)).length;t<e;++t)s[n=i[t]]=r[n],r[n]=a[n];o.$previousStyle=s}},resyncElements:function(){var t=this,e=t.getMeta(),n=t.getDataset().data,i=e.data.length,a=n.length;a<i?e.data.splice(a,i-a):a>i&&t.insertElements(i,a-i)},insertElements:function(t,e){for(var n=0;n<e;++n)this.addElementAndReset(t+n)},onDataPush:function(){var t=arguments.length;this.insertElements(this.getDataset().data.length-t,t)},onDataPop:function(){this.getMeta().data.pop()},onDataShift:function(){this.getMeta().data.shift()},onDataSplice:function(t,e){this.getMeta().data.splice(t,e),this.insertElements(t,arguments.length-2)},onDataUnshift:function(){this.insertElements(0,arguments.length)}}),it.extend=B.inherits;var at=it,rt=2*Math.PI;function ot(t,e){var n=e.startAngle,i=e.endAngle,a=e.pixelMargin,r=a/e.outerRadius,o=e.x,s=e.y;t.beginPath(),t.arc(o,s,e.outerRadius,n-r,i+r),e.innerRadius>a?(r=a/e.innerRadius,t.arc(o,s,e.innerRadius-a,i+r,n-r,!0)):t.arc(o,s,a,i+Math.PI/2,n-Math.PI/2),t.closePath(),t.clip()}function st(t,e,n){var i="inner"===e.borderAlign;i?(t.lineWidth=2*e.borderWidth,t.lineJoin="round"):(t.lineWidth=e.borderWidth,t.lineJoin="bevel"),n.fullCircles&&function(t,e,n,i){var a,r=n.endAngle;for(i&&(n.endAngle=n.startAngle+rt,ot(t,n),n.endAngle=r,n.endAngle===n.startAngle&&n.fullCircles&&(n.endAngle+=rt,n.fullCircles--)),t.beginPath(),t.arc(n.x,n.y,n.innerRadius,n.startAngle+rt,n.startAngle,!0),a=0;a<n.fullCircles;++a)t.stroke();for(t.beginPath(),t.arc(n.x,n.y,e.outerRadius,n.startAngle,n.startAngle+rt),a=0;a<n.fullCircles;++a)t.stroke()}(t,e,n,i),i&&ot(t,n),t.beginPath(),t.arc(n.x,n.y,e.outerRadius,n.startAngle,n.endAngle),t.arc(n.x,n.y,n.innerRadius,n.endAngle,n.startAngle,!0),t.closePath(),t.stroke()}Y._set("global",{elements:{arc:{backgroundColor:Y.global.defaultColor,borderColor:"#fff",borderWidth:2,borderAlign:"center"}}});var lt=X.extend({_type:"arc",inLabelRange:function(t){var e=this._view;return!!e&&Math.pow(t-e.x,2)<Math.pow(e.radius+e.hoverRadius,2)},inRange:function(t,e){var n=this._view;if(n){for(var i=B.getAngleFromPoint(n,{x:t,y:e}),a=i.angle,r=i.distance,o=n.startAngle,s=n.endAngle;s<o;)s+=rt;for(;a>s;)a-=rt;for(;a<o;)a+=rt;var l=a>=o&&a<=s,u=r>=n.innerRadius&&r<=n.outerRadius;return l&&u}return!1},getCenterPoint:function(){var t=this._view,e=(t.startAngle+t.endAngle)/2,n=(t.innerRadius+t.outerRadius)/2;return{x:t.x+Math.cos(e)*n,y:t.y+Math.sin(e)*n}},getArea:function(){var t=this._view;return Math.PI*((t.endAngle-t.startAngle)/(2*Math.PI))*(Math.pow(t.outerRadius,2)-Math.pow(t.innerRadius,2))},tooltipPosition:function(){var t=this._view,e=t.startAngle+(t.endAngle-t.startAngle)/2,n=(t.outerRadius-t.innerRadius)/2+t.innerRadius;return{x:t.x+Math.cos(e)*n,y:t.y+Math.sin(e)*n}},draw:function(){var t,e=this._chart.ctx,n=this._view,i="inner"===n.borderAlign?.33:0,a={x:n.x,y:n.y,innerRadius:n.innerRadius,outerRadius:Math.max(n.outerRadius-i,0),pixelMargin:i,startAngle:n.startAngle,endAngle:n.endAngle,fullCircles:Math.floor(n.circumference/rt)};if(e.save(),e.fillStyle=n.backgroundColor,e.strokeStyle=n.borderColor,a.fullCircles){for(a.endAngle=a.startAngle+rt,e.beginPath(),e.arc(a.x,a.y,a.outerRadius,a.startAngle,a.endAngle),e.arc(a.x,a.y,a.innerRadius,a.endAngle,a.startAngle,!0),e.closePath(),t=0;t<a.fullCircles;++t)e.fill();a.endAngle=a.startAngle+n.circumference%rt}e.beginPath(),e.arc(a.x,a.y,a.outerRadius,a.startAngle,a.endAngle),e.arc(a.x,a.y,a.innerRadius,a.endAngle,a.startAngle,!0),e.closePath(),e.fill(),n.borderWidth&&st(e,n,a),e.restore()}}),ut=B.valueOrDefault,dt=Y.global.defaultColor;Y._set("global",{elements:{line:{tension:.4,backgroundColor:dt,borderWidth:3,borderColor:dt,borderCapStyle:"butt",borderDash:[],borderDashOffset:0,borderJoinStyle:"miter",capBezierPoints:!0,fill:!0}}});var ht=X.extend({_type:"line",draw:function(){var t,e,n,i=this,a=i._view,r=i._chart.ctx,o=a.spanGaps,s=i._children.slice(),l=Y.global,u=l.elements.line,d=-1,h=i._loop;if(s.length){if(i._loop){for(t=0;t<s.length;++t)if(e=B.previousItem(s,t),!s[t]._view.skip&&e._view.skip){s=s.slice(t).concat(s.slice(0,t)),h=o;break}h&&s.push(s[0])}for(r.save(),r.lineCap=a.borderCapStyle||u.borderCapStyle,r.setLineDash&&r.setLineDash(a.borderDash||u.borderDash),r.lineDashOffset=ut(a.borderDashOffset,u.borderDashOffset),r.lineJoin=a.borderJoinStyle||u.borderJoinStyle,r.lineWidth=ut(a.borderWidth,u.borderWidth),r.strokeStyle=a.borderColor||l.defaultColor,r.beginPath(),(n=s[0]._view).skip||(r.moveTo(n.x,n.y),d=0),t=1;t<s.length;++t)n=s[t]._view,e=-1===d?B.previousItem(s,t):s[d],n.skip||(d!==t-1&&!o||-1===d?r.moveTo(n.x,n.y):B.canvas.lineTo(r,e._view,n),d=t);h&&r.closePath(),r.stroke(),r.restore()}}}),ct=B.valueOrDefault,ft=Y.global.defaultColor;function gt(t){var e=this._view;return!!e&&Math.abs(t-e.x)<e.radius+e.hitRadius}Y._set("global",{elements:{point:{radius:3,pointStyle:"circle",backgroundColor:ft,borderColor:ft,borderWidth:1,hitRadius:1,hoverRadius:4,hoverBorderWidth:1}}});var mt=X.extend({_type:"point",inRange:function(t,e){var n=this._view;return!!n&&Math.pow(t-n.x,2)+Math.pow(e-n.y,2)<Math.pow(n.hitRadius+n.radius,2)},inLabelRange:gt,inXRange:gt,inYRange:function(t){var e=this._view;return!!e&&Math.abs(t-e.y)<e.radius+e.hitRadius},getCenterPoint:function(){var t=this._view;return{x:t.x,y:t.y}},getArea:function(){return Math.PI*Math.pow(this._view.radius,2)},tooltipPosition:function(){var t=this._view;return{x:t.x,y:t.y,padding:t.radius+t.borderWidth}},draw:function(t){var e=this._view,n=this._chart.ctx,i=e.pointStyle,a=e.rotation,r=e.radius,o=e.x,s=e.y,l=Y.global,u=l.defaultColor;e.skip||(void 0===t||B.canvas._isPointInArea(e,t))&&(n.strokeStyle=e.borderColor||u,n.lineWidth=ct(e.borderWidth,l.elements.point.borderWidth),n.fillStyle=e.backgroundColor||u,B.canvas.drawPoint(n,i,r,o,s,a))}}),pt=Y.global.defaultColor;function vt(t){return t&&void 0!==t.width}function bt(t){var e,n,i,a,r;return vt(t)?(r=t.width/2,e=t.x-r,n=t.x+r,i=Math.min(t.y,t.base),a=Math.max(t.y,t.base)):(r=t.height/2,e=Math.min(t.x,t.base),n=Math.max(t.x,t.base),i=t.y-r,a=t.y+r),{left:e,top:i,right:n,bottom:a}}function yt(t,e,n){return t===e?n:t===n?e:t}function xt(t,e,n){var i,a,r,o,s=t.borderWidth,l=function(t){var e=t.borderSkipped,n={};return e?(t.horizontal?t.base>t.x&&(e=yt(e,"left","right")):t.base<t.y&&(e=yt(e,"bottom","top")),n[e]=!0,n):n}(t);return B.isObject(s)?(i=+s.top||0,a=+s.right||0,r=+s.bottom||0,o=+s.left||0):i=a=r=o=+s||0,{t:l.top||i<0?0:i>n?n:i,r:l.right||a<0?0:a>e?e:a,b:l.bottom||r<0?0:r>n?n:r,l:l.left||o<0?0:o>e?e:o}}function _t(t,e,n){var i=null===e,a=null===n,r=!(!t||i&&a)&&bt(t);return r&&(i||e>=r.left&&e<=r.right)&&(a||n>=r.top&&n<=r.bottom)}Y._set("global",{elements:{rectangle:{backgroundColor:pt,borderColor:pt,borderSkipped:"bottom",borderWidth:0}}});var wt=X.extend({_type:"rectangle",draw:function(){var t=this._chart.ctx,e=this._view,n=function(t){var e=bt(t),n=e.right-e.left,i=e.bottom-e.top,a=xt(t,n/2,i/2);return{outer:{x:e.left,y:e.top,w:n,h:i},inner:{x:e.left+a.l,y:e.top+a.t,w:n-a.l-a.r,h:i-a.t-a.b}}}(e),i=n.outer,a=n.inner;t.fillStyle=e.backgroundColor,t.fillRect(i.x,i.y,i.w,i.h),i.w===a.w&&i.h===a.h||(t.save(),t.beginPath(),t.rect(i.x,i.y,i.w,i.h),t.clip(),t.fillStyle=e.borderColor,t.rect(a.x,a.y,a.w,a.h),t.fill("evenodd"),t.restore())},height:function(){var t=this._view;return t.base-t.y},inRange:function(t,e){return _t(this._view,t,e)},inLabelRange:function(t,e){var n=this._view;return vt(n)?_t(n,t,null):_t(n,null,e)},inXRange:function(t){return _t(this._view,t,null)},inYRange:function(t){return _t(this._view,null,t)},getCenterPoint:function(){var t,e,n=this._view;return vt(n)?(t=n.x,e=(n.y+n.base)/2):(t=(n.x+n.base)/2,e=n.y),{x:t,y:e}},getArea:function(){var t=this._view;return vt(t)?t.width*Math.abs(t.y-t.base):t.height*Math.abs(t.x-t.base)},tooltipPosition:function(){var t=this._view;return{x:t.x,y:t.y}}}),kt={},Mt=lt,St=ht,Dt=mt,Ct=wt;kt.Arc=Mt,kt.Line=St,kt.Point=Dt,kt.Rectangle=Ct;var Pt=B._deprecated,Tt=B.valueOrDefault;function Ot(t,e,n){var i,a,r=n.barThickness,o=e.stackCount,s=e.pixels[t],l=B.isNullOrUndef(r)?function(t,e){var n,i,a,r,o=t._length;for(a=1,r=e.length;a<r;++a)o=Math.min(o,Math.abs(e[a]-e[a-1]));for(a=0,r=t.getTicks().length;a<r;++a)i=t.getPixelForTick(a),o=a>0?Math.min(o,Math.abs(i-n)):o,n=i;return o}(e.scale,e.pixels):-1;return B.isNullOrUndef(r)?(i=l*n.categoryPercentage,a=n.barPercentage):(i=r*o,a=1),{chunk:i/o,ratio:a,start:s-i/2}}Y._set("bar",{hover:{mode:"label"},scales:{xAxes:[{type:"category",offset:!0,gridLines:{offsetGridLines:!0}}],yAxes:[{type:"linear"}]}}),Y._set("global",{datasets:{bar:{categoryPercentage:.8,barPercentage:.9}}});var At=at.extend({dataElementType:kt.Rectangle,_dataElementOptions:["backgroundColor","borderColor","borderSkipped","borderWidth","barPercentage","barThickness","categoryPercentage","maxBarThickness","minBarLength"],initialize:function(){var t,e,n=this;at.prototype.initialize.apply(n,arguments),(t=n.getMeta()).stack=n.getDataset().stack,t.bar=!0,e=n._getIndexScale().options,Pt("bar chart",e.barPercentage,"scales.[x/y]Axes.barPercentage","dataset.barPercentage"),Pt("bar chart",e.barThickness,"scales.[x/y]Axes.barThickness","dataset.barThickness"),Pt("bar chart",e.categoryPercentage,"scales.[x/y]Axes.categoryPercentage","dataset.categoryPercentage"),Pt("bar chart",n._getValueScale().options.minBarLength,"scales.[x/y]Axes.minBarLength","dataset.minBarLength"),Pt("bar chart",e.maxBarThickness,"scales.[x/y]Axes.maxBarThickness","dataset.maxBarThickness")},update:function(t){var e,n,i=this,a=i.getMeta().data;for(i._ruler=i.getRuler(),e=0,n=a.length;e<n;++e)i.updateElement(a[e],e,t)},updateElement:function(t,e,n){var i=this,a=i.getMeta(),r=i.getDataset(),o=i._resolveDataElementOptions(t,e);t._xScale=i.getScaleForId(a.xAxisID),t._yScale=i.getScaleForId(a.yAxisID),t._datasetIndex=i.index,t._index=e,t._model={backgroundColor:o.backgroundColor,borderColor:o.borderColor,borderSkipped:o.borderSkipped,borderWidth:o.borderWidth,datasetLabel:r.label,label:i.chart.data.labels[e]},B.isArray(r.data[e])&&(t._model.borderSkipped=null),i._updateElementGeometry(t,e,n,o),t.pivot()},_updateElementGeometry:function(t,e,n,i){var a=this,r=t._model,o=a._getValueScale(),s=o.getBasePixel(),l=o.isHorizontal(),u=a._ruler||a.getRuler(),d=a.calculateBarValuePixels(a.index,e,i),h=a.calculateBarIndexPixels(a.index,e,u,i);r.horizontal=l,r.base=n?s:d.base,r.x=l?n?s:d.head:h.center,r.y=l?h.center:n?s:d.head,r.height=l?h.size:void 0,r.width=l?void 0:h.size},_getStacks:function(t){var e,n,i=this._getIndexScale(),a=i._getMatchingVisibleMetas(this._type),r=i.options.stacked,o=a.length,s=[];for(e=0;e<o&&(n=a[e],(!1===r||-1===s.indexOf(n.stack)||void 0===r&&void 0===n.stack)&&s.push(n.stack),n.index!==t);++e);return s},getStackCount:function(){return this._getStacks().length},getStackIndex:function(t,e){var n=this._getStacks(t),i=void 0!==e?n.indexOf(e):-1;return-1===i?n.length-1:i},getRuler:function(){var t,e,n=this,i=n._getIndexScale(),a=[];for(t=0,e=n.getMeta().data.length;t<e;++t)a.push(i.getPixelForValue(null,t,n.index));return{pixels:a,start:i._startPixel,end:i._endPixel,stackCount:n.getStackCount(),scale:i}},calculateBarValuePixels:function(t,e,n){var i,a,r,o,s,l,u,d=this,h=d.chart,c=d._getValueScale(),f=c.isHorizontal(),g=h.data.datasets,m=c._getMatchingVisibleMetas(d._type),p=c._parseValue(g[t].data[e]),v=n.minBarLength,b=c.options.stacked,y=d.getMeta().stack,x=void 0===p.start?0:p.max>=0&&p.min>=0?p.min:p.max,_=void 0===p.start?p.end:p.max>=0&&p.min>=0?p.max-p.min:p.min-p.max,w=m.length;if(b||void 0===b&&void 0!==y)for(i=0;i<w&&(a=m[i]).index!==t;++i)a.stack===y&&(r=void 0===(u=c._parseValue(g[a.index].data[e])).start?u.end:u.min>=0&&u.max>=0?u.max:u.min,(p.min<0&&r<0||p.max>=0&&r>0)&&(x+=r));return o=c.getPixelForValue(x),l=(s=c.getPixelForValue(x+_))-o,void 0!==v&&Math.abs(l)<v&&(l=v,s=_>=0&&!f||_<0&&f?o-v:o+v),{size:l,base:o,head:s,center:s+l/2}},calculateBarIndexPixels:function(t,e,n,i){var a="flex"===i.barThickness?function(t,e,n){var i,a=e.pixels,r=a[t],o=t>0?a[t-1]:null,s=t<a.length-1?a[t+1]:null,l=n.categoryPercentage;return null===o&&(o=r-(null===s?e.end-e.start:s-r)),null===s&&(s=r+r-o),i=r-(r-Math.min(o,s))/2*l,{chunk:Math.abs(s-o)/2*l/e.stackCount,ratio:n.barPercentage,start:i}}(e,n,i):Ot(e,n,i),r=this.getStackIndex(t,this.getMeta().stack),o=a.start+a.chunk*r+a.chunk/2,s=Math.min(Tt(i.maxBarThickness,1/0),a.chunk*a.ratio);return{base:o-s/2,head:o+s/2,center:o,size:s}},draw:function(){var t=this,e=t.chart,n=t._getValueScale(),i=t.getMeta().data,a=t.getDataset(),r=i.length,o=0;for(B.canvas.clipArea(e.ctx,e.chartArea);o<r;++o){var s=n._parseValue(a.data[o]);isNaN(s.min)||isNaN(s.max)||i[o].draw()}B.canvas.unclipArea(e.ctx)},_resolveDataElementOptions:function(){var t=this,e=B.extend({},at.prototype._resolveDataElementOptions.apply(t,arguments)),n=t._getIndexScale().options,i=t._getValueScale().options;return e.barPercentage=Tt(n.barPercentage,e.barPercentage),e.barThickness=Tt(n.barThickness,e.barThickness),e.categoryPercentage=Tt(n.categoryPercentage,e.categoryPercentage),e.maxBarThickness=Tt(n.maxBarThickness,e.maxBarThickness),e.minBarLength=Tt(i.minBarLength,e.minBarLength),e}}),Ft=B.valueOrDefault,It=B.options.resolve;Y._set("bubble",{hover:{mode:"single"},scales:{xAxes:[{type:"linear",position:"bottom",id:"x-axis-0"}],yAxes:[{type:"linear",position:"left",id:"y-axis-0"}]},tooltips:{callbacks:{title:function(){return""},label:function(t,e){var n=e.datasets[t.datasetIndex].label||"",i=e.datasets[t.datasetIndex].data[t.index];return n+": ("+t.xLabel+", "+t.yLabel+", "+i.r+")"}}}});var Lt=at.extend({dataElementType:kt.Point,_dataElementOptions:["backgroundColor","borderColor","borderWidth","hoverBackgroundColor","hoverBorderColor","hoverBorderWidth","hoverRadius","hitRadius","pointStyle","rotation"],update:function(t){var e=this,n=e.getMeta().data;B.each(n,function(n,i){e.updateElement(n,i,t)})},updateElement:function(t,e,n){var i=this,a=i.getMeta(),r=t.custom||{},o=i.getScaleForId(a.xAxisID),s=i.getScaleForId(a.yAxisID),l=i._resolveDataElementOptions(t,e),u=i.getDataset().data[e],d=i.index,h=n?o.getPixelForDecimal(.5):o.getPixelForValue("object"==typeof u?u:NaN,e,d),c=n?s.getBasePixel():s.getPixelForValue(u,e,d);t._xScale=o,t._yScale=s,t._options=l,t._datasetIndex=d,t._index=e,t._model={backgroundColor:l.backgroundColor,borderColor:l.borderColor,borderWidth:l.borderWidth,hitRadius:l.hitRadius,pointStyle:l.pointStyle,rotation:l.rotation,radius:n?0:l.radius,skip:r.skip||isNaN(h)||isNaN(c),x:h,y:c},t.pivot()},setHoverStyle:function(t){var e=t._model,n=t._options,i=B.getHoverColor;t.$previousStyle={backgroundColor:e.backgroundColor,borderColor:e.borderColor,borderWidth:e.borderWidth,radius:e.radius},e.backgroundColor=Ft(n.hoverBackgroundColor,i(n.backgroundColor)),e.borderColor=Ft(n.hoverBorderColor,i(n.borderColor)),e.borderWidth=Ft(n.hoverBorderWidth,n.borderWidth),e.radius=n.radius+n.hoverRadius},_resolveDataElementOptions:function(t,e){var n=this,i=n.chart,a=n.getDataset(),r=t.custom||{},o=a.data[e]||{},s=at.prototype._resolveDataElementOptions.apply(n,arguments),l={chart:i,dataIndex:e,dataset:a,datasetIndex:n.index};return n._cachedDataOpts===s&&(s=B.extend({},s)),s.radius=It([r.radius,o.r,n._config.radius,i.options.elements.point.radius],l,e),s}}),Rt=B.valueOrDefault,Nt=Math.PI,Wt=2*Nt,Yt=Nt/2;Y._set("doughnut",{animation:{animateRotate:!0,animateScale:!1},hover:{mode:"single"},legendCallback:function(t){var e,n,i,a=document.createElement("ul"),r=t.data,o=r.datasets,s=r.labels;if(a.setAttribute("class",t.id+"-legend"),o.length)for(e=0,n=o[0].data.length;e<n;++e)(i=a.appendChild(document.createElement("li"))).appendChild(document.createElement("span")).style.backgroundColor=o[0].backgroundColor[e],s[e]&&i.appendChild(document.createTextNode(s[e]));return a.outerHTML},legend:{labels:{generateLabels:function(t){var e=t.data;return e.labels.length&&e.datasets.length?e.labels.map(function(n,i){var a=t.getDatasetMeta(0),r=a.controller.getStyle(i);return{text:n,fillStyle:r.backgroundColor,strokeStyle:r.borderColor,lineWidth:r.borderWidth,hidden:isNaN(e.datasets[0].data[i])||a.data[i].hidden,index:i}}):[]}},onClick:function(t,e){var n,i,a,r=e.index,o=this.chart;for(n=0,i=(o.data.datasets||[]).length;n<i;++n)(a=o.getDatasetMeta(n)).data[r]&&(a.data[r].hidden=!a.data[r].hidden);o.update()}},cutoutPercentage:50,rotation:-Yt,circumference:Wt,tooltips:{callbacks:{title:function(){return""},label:function(t,e){var n=e.labels[t.index],i=": "+e.datasets[t.datasetIndex].data[t.index];return B.isArray(n)?(n=n.slice())[0]+=i:n+=i,n}}}});var zt=at.extend({dataElementType:kt.Arc,linkScales:B.noop,_dataElementOptions:["backgroundColor","borderColor","borderWidth","borderAlign","hoverBackgroundColor","hoverBorderColor","hoverBorderWidth"],getRingIndex:function(t){for(var e=0,n=0;n<t;++n)this.chart.isDatasetVisible(n)&&++e;return e},update:function(t){var e,n,i,a,r=this,o=r.chart,s=o.chartArea,l=o.options,u=1,d=1,h=0,c=0,f=r.getMeta(),g=f.data,m=l.cutoutPercentage/100||0,p=l.circumference,v=r._getRingWeight(r.index);if(p<Wt){var b=l.rotation%Wt,y=(b+=b>=Nt?-Wt:b<-Nt?Wt:0)+p,x=Math.cos(b),_=Math.sin(b),w=Math.cos(y),k=Math.sin(y),M=b<=0&&y>=0||y>=Wt,S=b<=Yt&&y>=Yt||y>=Wt+Yt,D=b<=-Yt&&y>=-Yt||y>=Nt+Yt,C=b===-Nt||y>=Nt?-1:Math.min(x,x*m,w,w*m),P=D?-1:Math.min(_,_*m,k,k*m),T=M?1:Math.max(x,x*m,w,w*m),O=S?1:Math.max(_,_*m,k,k*m);u=(T-C)/2,d=(O-P)/2,h=-(T+C)/2,c=-(O+P)/2}for(i=0,a=g.length;i<a;++i)g[i]._options=r._resolveDataElementOptions(g[i],i);for(o.borderWidth=r.getMaxBorderWidth(),e=(s.right-s.left-o.borderWidth)/u,n=(s.bottom-s.top-o.borderWidth)/d,o.outerRadius=Math.max(Math.min(e,n)/2,0),o.innerRadius=Math.max(o.outerRadius*m,0),o.radiusLength=(o.outerRadius-o.innerRadius)/(r._getVisibleDatasetWeightTotal()||1),o.offsetX=h*o.outerRadius,o.offsetY=c*o.outerRadius,f.total=r.calculateTotal(),r.outerRadius=o.outerRadius-o.radiusLength*r._getRingWeightOffset(r.index),r.innerRadius=Math.max(r.outerRadius-o.radiusLength*v,0),i=0,a=g.length;i<a;++i)r.updateElement(g[i],i,t)},updateElement:function(t,e,n){var i=this,a=i.chart,r=a.chartArea,o=a.options,s=o.animation,l=(r.left+r.right)/2,u=(r.top+r.bottom)/2,d=o.rotation,h=o.rotation,c=i.getDataset(),f=n&&s.animateRotate||t.hidden?0:i.calculateCircumference(c.data[e])*(o.circumference/Wt),g=n&&s.animateScale?0:i.innerRadius,m=n&&s.animateScale?0:i.outerRadius,p=t._options||{};B.extend(t,{_datasetIndex:i.index,_index:e,_model:{backgroundColor:p.backgroundColor,borderColor:p.borderColor,borderWidth:p.borderWidth,borderAlign:p.borderAlign,x:l+a.offsetX,y:u+a.offsetY,startAngle:d,endAngle:h,circumference:f,outerRadius:m,innerRadius:g,label:B.valueAtIndexOrDefault(c.label,e,a.data.labels[e])}});var v=t._model;n&&s.animateRotate||(v.startAngle=0===e?o.rotation:i.getMeta().data[e-1]._model.endAngle,v.endAngle=v.startAngle+v.circumference),t.pivot()},calculateTotal:function(){var t,e=this.getDataset(),n=this.getMeta(),i=0;return B.each(n.data,function(n,a){t=e.data[a],isNaN(t)||n.hidden||(i+=Math.abs(t))}),i},calculateCircumference:function(t){var e=this.getMeta().total;return e>0&&!isNaN(t)?Wt*(Math.abs(t)/e):0},getMaxBorderWidth:function(t){var e,n,i,a,r,o,s,l,u=0,d=this.chart;if(!t)for(e=0,n=d.data.datasets.length;e<n;++e)if(d.isDatasetVisible(e)){t=(i=d.getDatasetMeta(e)).data,e!==this.index&&(r=i.controller);break}if(!t)return 0;for(e=0,n=t.length;e<n;++e)a=t[e],r?(r._configure(),o=r._resolveDataElementOptions(a,e)):o=a._options,"inner"!==o.borderAlign&&(s=o.borderWidth,u=(l=o.hoverBorderWidth)>(u=s>u?s:u)?l:u);return u},setHoverStyle:function(t){var e=t._model,n=t._options,i=B.getHoverColor;t.$previousStyle={backgroundColor:e.backgroundColor,borderColor:e.borderColor,borderWidth:e.borderWidth},e.backgroundColor=Rt(n.hoverBackgroundColor,i(n.backgroundColor)),e.borderColor=Rt(n.hoverBorderColor,i(n.borderColor)),e.borderWidth=Rt(n.hoverBorderWidth,n.borderWidth)},_getRingWeightOffset:function(t){for(var e=0,n=0;n<t;++n)this.chart.isDatasetVisible(n)&&(e+=this._getRingWeight(n));return e},_getRingWeight:function(t){return Math.max(Rt(this.chart.data.datasets[t].weight,1),0)},_getVisibleDatasetWeightTotal:function(){return this._getRingWeightOffset(this.chart.data.datasets.length)}});Y._set("horizontalBar",{hover:{mode:"index",axis:"y"},scales:{xAxes:[{type:"linear",position:"bottom"}],yAxes:[{type:"category",position:"left",offset:!0,gridLines:{offsetGridLines:!0}}]},elements:{rectangle:{borderSkipped:"left"}},tooltips:{mode:"index",axis:"y"}}),Y._set("global",{datasets:{horizontalBar:{categoryPercentage:.8,barPercentage:.9}}});var Et=At.extend({_getValueScaleId:function(){return this.getMeta().xAxisID},_getIndexScaleId:function(){return this.getMeta().yAxisID}}),Vt=B.valueOrDefault,Ht=B.options.resolve,Bt=B.canvas._isPointInArea;function jt(t,e){var n=t&&t.options.ticks||{},i=n.reverse,a=void 0===n.min?e:0,r=void 0===n.max?e:0;return{start:i?r:a,end:i?a:r}}function Ut(t,e,n){var i=n/2,a=jt(t,i),r=jt(e,i);return{top:r.end,right:a.end,bottom:r.start,left:a.start}}function Gt(t){var e,n,i,a;return B.isObject(t)?(e=t.top,n=t.right,i=t.bottom,a=t.left):e=n=i=a=t,{top:e,right:n,bottom:i,left:a}}Y._set("line",{showLines:!0,spanGaps:!1,hover:{mode:"label"},scales:{xAxes:[{type:"category",id:"x-axis-0"}],yAxes:[{type:"linear",id:"y-axis-0"}]}});var qt=at.extend({datasetElementType:kt.Line,dataElementType:kt.Point,_datasetElementOptions:["backgroundColor","borderCapStyle","borderColor","borderDash","borderDashOffset","borderJoinStyle","borderWidth","cubicInterpolationMode","fill"],_dataElementOptions:{backgroundColor:"pointBackgroundColor",borderColor:"pointBorderColor",borderWidth:"pointBorderWidth",hitRadius:"pointHitRadius",hoverBackgroundColor:"pointHoverBackgroundColor",hoverBorderColor:"pointHoverBorderColor",hoverBorderWidth:"pointHoverBorderWidth",hoverRadius:"pointHoverRadius",pointStyle:"pointStyle",radius:"pointRadius",rotation:"pointRotation"},update:function(t){var e,n,i=this,a=i.getMeta(),r=a.dataset,o=a.data||[],s=i.chart.options,l=i._config,u=i._showLine=Vt(l.showLine,s.showLines);for(i._xScale=i.getScaleForId(a.xAxisID),i._yScale=i.getScaleForId(a.yAxisID),u&&(void 0!==l.tension&&void 0===l.lineTension&&(l.lineTension=l.tension),r._scale=i._yScale,r._datasetIndex=i.index,r._children=o,r._model=i._resolveDatasetElementOptions(r),r.pivot()),e=0,n=o.length;e<n;++e)i.updateElement(o[e],e,t);for(u&&0!==r._model.tension&&i.updateBezierControlPoints(),e=0,n=o.length;e<n;++e)o[e].pivot()},updateElement:function(t,e,n){var i,a,r=this,o=r.getMeta(),s=t.custom||{},l=r.getDataset(),u=r.index,d=l.data[e],h=r._xScale,c=r._yScale,f=o.dataset._model,g=r._resolveDataElementOptions(t,e);i=h.getPixelForValue("object"==typeof d?d:NaN,e,u),a=n?c.getBasePixel():r.calculatePointY(d,e,u),t._xScale=h,t._yScale=c,t._options=g,t._datasetIndex=u,t._index=e,t._model={x:i,y:a,skip:s.skip||isNaN(i)||isNaN(a),radius:g.radius,pointStyle:g.pointStyle,rotation:g.rotation,backgroundColor:g.backgroundColor,borderColor:g.borderColor,borderWidth:g.borderWidth,tension:Vt(s.tension,f?f.tension:0),steppedLine:!!f&&f.steppedLine,hitRadius:g.hitRadius}},_resolveDatasetElementOptions:function(t){var e=this,n=e._config,i=t.custom||{},a=e.chart.options,r=a.elements.line,o=at.prototype._resolveDatasetElementOptions.apply(e,arguments);return o.spanGaps=Vt(n.spanGaps,a.spanGaps),o.tension=Vt(n.lineTension,r.tension),o.steppedLine=Ht([i.steppedLine,n.steppedLine,r.stepped]),o.clip=Gt(Vt(n.clip,Ut(e._xScale,e._yScale,o.borderWidth))),o},calculatePointY:function(t,e,n){var i,a,r,o,s,l,u,d=this.chart,h=this._yScale,c=0,f=0;if(h.options.stacked){for(s=+h.getRightValue(t),u=(l=d._getSortedVisibleDatasetMetas()).length,i=0;i<u&&(r=l[i]).index!==n;++i)a=d.data.datasets[r.index],"line"===r.type&&r.yAxisID===h.id&&((o=+h.getRightValue(a.data[e]))<0?f+=o||0:c+=o||0);return s<0?h.getPixelForValue(f+s):h.getPixelForValue(c+s)}return h.getPixelForValue(t)},updateBezierControlPoints:function(){var t,e,n,i,a=this.chart,r=this.getMeta(),o=r.dataset._model,s=a.chartArea,l=r.data||[];function u(t,e,n){return Math.max(Math.min(t,n),e)}if(o.spanGaps&&(l=l.filter(function(t){return!t._model.skip})),"monotone"===o.cubicInterpolationMode)B.splineCurveMonotone(l);else for(t=0,e=l.length;t<e;++t)n=l[t]._model,i=B.splineCurve(B.previousItem(l,t)._model,n,B.nextItem(l,t)._model,o.tension),n.controlPointPreviousX=i.previous.x,n.controlPointPreviousY=i.previous.y,n.controlPointNextX=i.next.x,n.controlPointNextY=i.next.y;if(a.options.elements.line.capBezierPoints)for(t=0,e=l.length;t<e;++t)n=l[t]._model,Bt(n,s)&&(t>0&&Bt(l[t-1]._model,s)&&(n.controlPointPreviousX=u(n.controlPointPreviousX,s.left,s.right),n.controlPointPreviousY=u(n.controlPointPreviousY,s.top,s.bottom)),t<l.length-1&&Bt(l[t+1]._model,s)&&(n.controlPointNextX=u(n.controlPointNextX,s.left,s.right),n.controlPointNextY=u(n.controlPointNextY,s.top,s.bottom)))},draw:function(){var t,e=this,n=e.chart,i=e.getMeta(),a=i.data||[],r=n.chartArea,o=n.canvas,s=0,l=a.length;for(e._showLine&&(t=i.dataset._model.clip,B.canvas.clipArea(n.ctx,{left:!1===t.left?0:r.left-t.left,right:!1===t.right?o.width:r.right+t.right,top:!1===t.top?0:r.top-t.top,bottom:!1===t.bottom?o.height:r.bottom+t.bottom}),i.dataset.draw(),B.canvas.unclipArea(n.ctx));s<l;++s)a[s].draw(r)},setHoverStyle:function(t){var e=t._model,n=t._options,i=B.getHoverColor;t.$previousStyle={backgroundColor:e.backgroundColor,borderColor:e.borderColor,borderWidth:e.borderWidth,radius:e.radius},e.backgroundColor=Vt(n.hoverBackgroundColor,i(n.backgroundColor)),e.borderColor=Vt(n.hoverBorderColor,i(n.borderColor)),e.borderWidth=Vt(n.hoverBorderWidth,n.borderWidth),e.radius=Vt(n.hoverRadius,n.radius)}}),Zt=B.options.resolve;Y._set("polarArea",{scale:{type:"radialLinear",angleLines:{display:!1},gridLines:{circular:!0},pointLabels:{display:!1},ticks:{beginAtZero:!0}},animation:{animateRotate:!0,animateScale:!0},startAngle:-.5*Math.PI,legendCallback:function(t){var e,n,i,a=document.createElement("ul"),r=t.data,o=r.datasets,s=r.labels;if(a.setAttribute("class",t.id+"-legend"),o.length)for(e=0,n=o[0].data.length;e<n;++e)(i=a.appendChild(document.createElement("li"))).appendChild(document.createElement("span")).style.backgroundColor=o[0].backgroundColor[e],s[e]&&i.appendChild(document.createTextNode(s[e]));return a.outerHTML},legend:{labels:{generateLabels:function(t){var e=t.data;return e.labels.length&&e.datasets.length?e.labels.map(function(n,i){var a=t.getDatasetMeta(0),r=a.controller.getStyle(i);return{text:n,fillStyle:r.backgroundColor,strokeStyle:r.borderColor,lineWidth:r.borderWidth,hidden:isNaN(e.datasets[0].data[i])||a.data[i].hidden,index:i}}):[]}},onClick:function(t,e){var n,i,a,r=e.index,o=this.chart;for(n=0,i=(o.data.datasets||[]).length;n<i;++n)(a=o.getDatasetMeta(n)).data[r].hidden=!a.data[r].hidden;o.update()}},tooltips:{callbacks:{title:function(){return""},label:function(t,e){return e.labels[t.index]+": "+t.yLabel}}}});var $t=at.extend({dataElementType:kt.Arc,linkScales:B.noop,_dataElementOptions:["backgroundColor","borderColor","borderWidth","borderAlign","hoverBackgroundColor","hoverBorderColor","hoverBorderWidth"],_getIndexScaleId:function(){return this.chart.scale.id},_getValueScaleId:function(){return this.chart.scale.id},update:function(t){var e,n,i,a=this,r=a.getDataset(),o=a.getMeta(),s=a.chart.options.startAngle||0,l=a._starts=[],u=a._angles=[],d=o.data;for(a._updateRadius(),o.count=a.countVisibleElements(),e=0,n=r.data.length;e<n;e++)l[e]=s,i=a._computeAngle(e),u[e]=i,s+=i;for(e=0,n=d.length;e<n;++e)d[e]._options=a._resolveDataElementOptions(d[e],e),a.updateElement(d[e],e,t)},_updateRadius:function(){var t=this,e=t.chart,n=e.chartArea,i=e.options,a=Math.min(n.right-n.left,n.bottom-n.top);e.outerRadius=Math.max(a/2,0),e.innerRadius=Math.max(i.cutoutPercentage?e.outerRadius/100*i.cutoutPercentage:1,0),e.radiusLength=(e.outerRadius-e.innerRadius)/e.getVisibleDatasetCount(),t.outerRadius=e.outerRadius-e.radiusLength*t.index,t.innerRadius=t.outerRadius-e.radiusLength},updateElement:function(t,e,n){var i=this,a=i.chart,r=i.getDataset(),o=a.options,s=o.animation,l=a.scale,u=a.data.labels,d=l.xCenter,h=l.yCenter,c=o.startAngle,f=t.hidden?0:l.getDistanceFromCenterForValue(r.data[e]),g=i._starts[e],m=g+(t.hidden?0:i._angles[e]),p=s.animateScale?0:l.getDistanceFromCenterForValue(r.data[e]),v=t._options||{};B.extend(t,{_datasetIndex:i.index,_index:e,_scale:l,_model:{backgroundColor:v.backgroundColor,borderColor:v.borderColor,borderWidth:v.borderWidth,borderAlign:v.borderAlign,x:d,y:h,innerRadius:0,outerRadius:n?p:f,startAngle:n&&s.animateRotate?c:g,endAngle:n&&s.animateRotate?c:m,label:B.valueAtIndexOrDefault(u,e,u[e])}}),t.pivot()},countVisibleElements:function(){var t=this.getDataset(),e=this.getMeta(),n=0;return B.each(e.data,function(e,i){isNaN(t.data[i])||e.hidden||n++}),n},setHoverStyle:function(t){var e=t._model,n=t._options,i=B.getHoverColor,a=B.valueOrDefault;t.$previousStyle={backgroundColor:e.backgroundColor,borderColor:e.borderColor,borderWidth:e.borderWidth},e.backgroundColor=a(n.hoverBackgroundColor,i(n.backgroundColor)),e.borderColor=a(n.hoverBorderColor,i(n.borderColor)),e.borderWidth=a(n.hoverBorderWidth,n.borderWidth)},_computeAngle:function(t){var e=this,n=this.getMeta().count,i=e.getDataset(),a=e.getMeta();if(isNaN(i.data[t])||a.data[t].hidden)return 0;var r={chart:e.chart,dataIndex:t,dataset:i,datasetIndex:e.index};return Zt([e.chart.options.elements.arc.angle,2*Math.PI/n],r,t)}});Y._set("pie",B.clone(Y.doughnut)),Y._set("pie",{cutoutPercentage:0});var Xt=zt,Kt=B.valueOrDefault;Y._set("radar",{spanGaps:!1,scale:{type:"radialLinear"},elements:{line:{fill:"start",tension:0}}});var Jt=at.extend({datasetElementType:kt.Line,dataElementType:kt.Point,linkScales:B.noop,_datasetElementOptions:["backgroundColor","borderWidth","borderColor","borderCapStyle","borderDash","borderDashOffset","borderJoinStyle","fill"],_dataElementOptions:{backgroundColor:"pointBackgroundColor",borderColor:"pointBorderColor",borderWidth:"pointBorderWidth",hitRadius:"pointHitRadius",hoverBackgroundColor:"pointHoverBackgroundColor",hoverBorderColor:"pointHoverBorderColor",hoverBorderWidth:"pointHoverBorderWidth",hoverRadius:"pointHoverRadius",pointStyle:"pointStyle",radius:"pointRadius",rotation:"pointRotation"},_getIndexScaleId:function(){return this.chart.scale.id},_getValueScaleId:function(){return this.chart.scale.id},update:function(t){var e,n,i=this,a=i.getMeta(),r=a.dataset,o=a.data||[],s=i.chart.scale,l=i._config;for(void 0!==l.tension&&void 0===l.lineTension&&(l.lineTension=l.tension),r._scale=s,r._datasetIndex=i.index,r._children=o,r._loop=!0,r._model=i._resolveDatasetElementOptions(r),r.pivot(),e=0,n=o.length;e<n;++e)i.updateElement(o[e],e,t);for(i.updateBezierControlPoints(),e=0,n=o.length;e<n;++e)o[e].pivot()},updateElement:function(t,e,n){var i=this,a=t.custom||{},r=i.getDataset(),o=i.chart.scale,s=o.getPointPositionForValue(e,r.data[e]),l=i._resolveDataElementOptions(t,e),u=i.getMeta().dataset._model,d=n?o.xCenter:s.x,h=n?o.yCenter:s.y;t._scale=o,t._options=l,t._datasetIndex=i.index,t._index=e,t._model={x:d,y:h,skip:a.skip||isNaN(d)||isNaN(h),radius:l.radius,pointStyle:l.pointStyle,rotation:l.rotation,backgroundColor:l.backgroundColor,borderColor:l.borderColor,borderWidth:l.borderWidth,tension:Kt(a.tension,u?u.tension:0),hitRadius:l.hitRadius}},_resolveDatasetElementOptions:function(){var t=this,e=t._config,n=t.chart.options,i=at.prototype._resolveDatasetElementOptions.apply(t,arguments);return i.spanGaps=Kt(e.spanGaps,n.spanGaps),i.tension=Kt(e.lineTension,n.elements.line.tension),i},updateBezierControlPoints:function(){var t,e,n,i,a=this.getMeta(),r=this.chart.chartArea,o=a.data||[];function s(t,e,n){return Math.max(Math.min(t,n),e)}for(a.dataset._model.spanGaps&&(o=o.filter(function(t){return!t._model.skip})),t=0,e=o.length;t<e;++t)n=o[t]._model,i=B.splineCurve(B.previousItem(o,t,!0)._model,n,B.nextItem(o,t,!0)._model,n.tension),n.controlPointPreviousX=s(i.previous.x,r.left,r.right),n.controlPointPreviousY=s(i.previous.y,r.top,r.bottom),n.controlPointNextX=s(i.next.x,r.left,r.right),n.controlPointNextY=s(i.next.y,r.top,r.bottom)},setHoverStyle:function(t){var e=t._model,n=t._options,i=B.getHoverColor;t.$previousStyle={backgroundColor:e.backgroundColor,borderColor:e.borderColor,borderWidth:e.borderWidth,radius:e.radius},e.backgroundColor=Kt(n.hoverBackgroundColor,i(n.backgroundColor)),e.borderColor=Kt(n.hoverBorderColor,i(n.borderColor)),e.borderWidth=Kt(n.hoverBorderWidth,n.borderWidth),e.radius=Kt(n.hoverRadius,n.radius)}});Y._set("scatter",{hover:{mode:"single"},scales:{xAxes:[{id:"x-axis-1",type:"linear",position:"bottom"}],yAxes:[{id:"y-axis-1",type:"linear",position:"left"}]},tooltips:{callbacks:{title:function(){return""},label:function(t){return"("+t.xLabel+", "+t.yLabel+")"}}}}),Y._set("global",{datasets:{scatter:{showLine:!1}}});var Qt={bar:At,bubble:Lt,doughnut:zt,horizontalBar:Et,line:qt,polarArea:$t,pie:Xt,radar:Jt,scatter:qt};function te(t,e){return t.native?{x:t.x,y:t.y}:B.getRelativePosition(t,e)}function ee(t,e){var n,i,a,r,o,s,l=t._getSortedVisibleDatasetMetas();for(i=0,r=l.length;i<r;++i)for(a=0,o=(n=l[i].data).length;a<o;++a)(s=n[a])._view.skip||e(s)}function ne(t,e){var n=[];return ee(t,function(t){t.inRange(e.x,e.y)&&n.push(t)}),n}function ie(t,e,n,i){var a=Number.POSITIVE_INFINITY,r=[];return ee(t,function(t){if(!n||t.inRange(e.x,e.y)){var o=t.getCenterPoint(),s=i(e,o);s<a?(r=[t],a=s):s===a&&r.push(t)}}),r}function ae(t){var e=-1!==t.indexOf("x"),n=-1!==t.indexOf("y");return function(t,i){var a=e?Math.abs(t.x-i.x):0,r=n?Math.abs(t.y-i.y):0;return Math.sqrt(Math.pow(a,2)+Math.pow(r,2))}}function re(t,e,n){var i=te(e,t);n.axis=n.axis||"x";var a=ae(n.axis),r=n.intersect?ne(t,i):ie(t,i,!1,a),o=[];return r.length?(t._getSortedVisibleDatasetMetas().forEach(function(t){var e=t.data[r[0]._index];e&&!e._view.skip&&o.push(e)}),o):[]}var oe={modes:{single:function(t,e){var n=te(e,t),i=[];return ee(t,function(t){if(t.inRange(n.x,n.y))return i.push(t),i}),i.slice(0,1)},label:re,index:re,dataset:function(t,e,n){var i=te(e,t);n.axis=n.axis||"xy";var a=ae(n.axis),r=n.intersect?ne(t,i):ie(t,i,!1,a);return r.length>0&&(r=t.getDatasetMeta(r[0]._datasetIndex).data),r},"x-axis":function(t,e){return re(t,e,{intersect:!1})},point:function(t,e){return ne(t,te(e,t))},nearest:function(t,e,n){var i=te(e,t);n.axis=n.axis||"xy";var a=ae(n.axis);return ie(t,i,n.intersect,a)},x:function(t,e,n){var i=te(e,t),a=[],r=!1;return ee(t,function(t){t.inXRange(i.x)&&a.push(t),t.inRange(i.x,i.y)&&(r=!0)}),n.intersect&&!r&&(a=[]),a},y:function(t,e,n){var i=te(e,t),a=[],r=!1;return ee(t,function(t){t.inYRange(i.y)&&a.push(t),t.inRange(i.x,i.y)&&(r=!0)}),n.intersect&&!r&&(a=[]),a}}},se=B.extend;function le(t,e){return B.where(t,function(t){return t.pos===e})}function ue(t,e){return t.sort(function(t,n){var i=e?n:t,a=e?t:n;return i.weight===a.weight?i.index-a.index:i.weight-a.weight})}function de(t,e,n,i){return Math.max(t[n],e[n])+Math.max(t[i],e[i])}function he(t,e,n){var i,a,r=n.box,o=t.maxPadding;if(n.size&&(t[n.pos]-=n.size),n.size=n.horizontal?r.height:r.width,t[n.pos]+=n.size,r.getPadding){var s=r.getPadding();o.top=Math.max(o.top,s.top),o.left=Math.max(o.left,s.left),o.bottom=Math.max(o.bottom,s.bottom),o.right=Math.max(o.right,s.right)}if(i=e.outerWidth-de(o,t,"left","right"),a=e.outerHeight-de(o,t,"top","bottom"),i!==t.w||a!==t.h){t.w=i,t.h=a;var l=n.horizontal?[i,t.w]:[a,t.h];return!(l[0]===l[1]||isNaN(l[0])&&isNaN(l[1]))}}function ce(t,e){var n=e.maxPadding;function i(t){var i={left:0,top:0,right:0,bottom:0};return t.forEach(function(t){i[t]=Math.max(e[t],n[t])}),i}return i(t?["left","right"]:["top","bottom"])}function fe(t,e,n){var i,a,r,o,s,l,u=[];for(i=0,a=t.length;i<a;++i)(o=(r=t[i]).box).update(r.width||e.w,r.height||e.h,ce(r.horizontal,e)),he(e,n,r)&&(l=!0,u.length&&(s=!0)),o.fullWidth||u.push(r);return s&&fe(u,e,n)||l}function ge(t,e,n){var i,a,r,o,s=n.padding,l=e.x,u=e.y;for(i=0,a=t.length;i<a;++i)o=(r=t[i]).box,r.horizontal?(o.left=o.fullWidth?s.left:e.left,o.right=o.fullWidth?n.outerWidth-s.right:e.left+e.w,o.top=u,o.bottom=u+o.height,o.width=o.right-o.left,u=o.bottom):(o.left=l,o.right=l+o.width,o.top=e.top,o.bottom=e.top+e.h,o.height=o.bottom-o.top,l=o.right);e.x=l,e.y=u}Y._set("global",{layout:{padding:{top:0,right:0,bottom:0,left:0}}});var me,pe={defaults:{},addBox:function(t,e){t.boxes||(t.boxes=[]),e.fullWidth=e.fullWidth||!1,e.position=e.position||"top",e.weight=e.weight||0,e._layers=e._layers||function(){return[{z:0,draw:function(){e.draw.apply(e,arguments)}}]},t.boxes.push(e)},removeBox:function(t,e){var n=t.boxes?t.boxes.indexOf(e):-1;-1!==n&&t.boxes.splice(n,1)},configure:function(t,e,n){for(var i,a=["fullWidth","position","weight"],r=a.length,o=0;o<r;++o)i=a[o],n.hasOwnProperty(i)&&(e[i]=n[i])},update:function(t,e,n){if(t){var i=t.options.layout||{},a=B.options.toPadding(i.padding),r=e-a.width,o=n-a.height,s=function(t){var e=function(t){var e,n,i,a=[];for(e=0,n=(t||[]).length;e<n;++e)i=t[e],a.push({index:e,box:i,pos:i.position,horizontal:i.isHorizontal(),weight:i.weight});return a}(t),n=ue(le(e,"left"),!0),i=ue(le(e,"right")),a=ue(le(e,"top"),!0),r=ue(le(e,"bottom"));return{leftAndTop:n.concat(a),rightAndBottom:i.concat(r),chartArea:le(e,"chartArea"),vertical:n.concat(i),horizontal:a.concat(r)}}(t.boxes),l=s.vertical,u=s.horizontal,d=Object.freeze({outerWidth:e,outerHeight:n,padding:a,availableWidth:r,vBoxMaxWidth:r/2/l.length,hBoxMaxHeight:o/2}),h=se({maxPadding:se({},a),w:r,h:o,x:a.left,y:a.top},a);!function(t,e){var n,i,a;for(n=0,i=t.length;n<i;++n)(a=t[n]).width=a.horizontal?a.box.fullWidth&&e.availableWidth:e.vBoxMaxWidth,a.height=a.horizontal&&e.hBoxMaxHeight}(l.concat(u),d),fe(l,h,d),fe(u,h,d)&&fe(l,h,d),function(t){var e=t.maxPadding;function n(n){var i=Math.max(e[n]-t[n],0);return t[n]+=i,i}t.y+=n("top"),t.x+=n("left"),n("right"),n("bottom")}(h),ge(s.leftAndTop,h,d),h.x+=h.w,h.y+=h.h,ge(s.rightAndBottom,h,d),t.chartArea={left:h.left,top:h.top,right:h.left+h.w,bottom:h.top+h.h},B.each(s.chartArea,function(e){var n=e.box;se(n,t.chartArea),n.update(h.w,h.h)})}}},ve=(me=Object.freeze({__proto__:null,default:"/*\r\n * DOM element rendering detection\r\n * https://davidwalsh.name/detect-node-insertion\r\n */\r\n@keyframes chartjs-render-animation {\r\n\tfrom { opacity: 0.99; }\r\n\tto { opacity: 1; }\r\n}\r\n\r\n.chartjs-render-monitor {\r\n\tanimation: chartjs-render-animation 0.001s;\r\n}\r\n\r\n/*\r\n * DOM element resizing detection\r\n * https://github.com/marcj/css-element-queries\r\n */\r\n.chartjs-size-monitor,\r\n.chartjs-size-monitor-expand,\r\n.chartjs-size-monitor-shrink {\r\n\tposition: absolute;\r\n\tdirection: ltr;\r\n\tleft: 0;\r\n\ttop: 0;\r\n\tright: 0;\r\n\tbottom: 0;\r\n\toverflow: hidden;\r\n\tpointer-events: none;\r\n\tvisibility: hidden;\r\n\tz-index: -1;\r\n}\r\n\r\n.chartjs-size-monitor-expand > div {\r\n\tposition: absolute;\r\n\twidth: 1000000px;\r\n\theight: 1000000px;\r\n\tleft: 0;\r\n\ttop: 0;\r\n}\r\n\r\n.chartjs-size-monitor-shrink > div {\r\n\tposition: absolute;\r\n\twidth: 200%;\r\n\theight: 200%;\r\n\tleft: 0;\r\n\ttop: 0;\r\n}\r\n"}))&&me.default||me,be="chartjs-size-monitor",ye="chartjs-render-monitor",xe=["animationstart","webkitAnimationStart"],_e={touchstart:"mousedown",touchmove:"mousemove",touchend:"mouseup",pointerenter:"mouseenter",pointerdown:"mousedown",pointermove:"mousemove",pointerup:"mouseup",pointerleave:"mouseout",pointerout:"mouseout"};function we(t,e){var n=B.getStyle(t,e),i=n&&n.match(/^(\d+)(\.\d+)?px$/);return i?Number(i[1]):void 0}var ke=!!function(){var t=!1;try{var e=Object.defineProperty({},"passive",{get:function(){t=!0}});window.addEventListener("e",null,e)}catch(t){}return t}()&&{passive:!0};function Me(t,e,n){t.addEventListener(e,n,ke)}function Se(t,e,n){t.removeEventListener(e,n,ke)}function De(t,e,n,i,a){return{type:t,chart:e,native:a||null,x:void 0!==n?n:null,y:void 0!==i?i:null}}function Ce(t){var e=document.createElement("div");return e.className=t||"",e}function Pe(t,e,n){var i,a,r,o,s=t.$chartjs||(t.$chartjs={}),l=s.resizer=function(t){var e=1e6,n=Ce(be),i=Ce(be+"-expand"),a=Ce(be+"-shrink");i.appendChild(Ce()),a.appendChild(Ce()),n.appendChild(i),n.appendChild(a),n._reset=function(){i.scrollLeft=e,i.scrollTop=e,a.scrollLeft=e,a.scrollTop=e};var r=function(){n._reset(),t()};return Me(i,"scroll",r.bind(i,"expand")),Me(a,"scroll",r.bind(a,"shrink")),n}((i=function(){if(s.resizer){var i=n.options.maintainAspectRatio&&t.parentNode,a=i?i.clientWidth:0;e(De("resize",n)),i&&i.clientWidth<a&&n.canvas&&e(De("resize",n))}},r=!1,o=[],function(){o=Array.prototype.slice.call(arguments),a=a||this,r||(r=!0,B.requestAnimFrame.call(window,function(){r=!1,i.apply(a,o)}))}));!function(t,e){var n=t.$chartjs||(t.$chartjs={}),i=n.renderProxy=function(t){"chartjs-render-animation"===t.animationName&&e()};B.each(xe,function(e){Me(t,e,i)}),n.reflow=!!t.offsetParent,t.classList.add(ye)}(t,function(){if(s.resizer){var e=t.parentNode;e&&e!==l.parentNode&&e.insertBefore(l,e.firstChild),l._reset()}})}function Te(t){var e=t.$chartjs||{},n=e.resizer;delete e.resizer,function(t){var e=t.$chartjs||{},n=e.renderProxy;n&&(B.each(xe,function(e){Se(t,e,n)}),delete e.renderProxy),t.classList.remove(ye)}(t),n&&n.parentNode&&n.parentNode.removeChild(n)}var Oe={disableCSSInjection:!1,_enabled:"undefined"!=typeof window&&"undefined"!=typeof document,_ensureLoaded:function(t){if(!this.disableCSSInjection){var e=t.getRootNode?t.getRootNode():document;!function(t,e){var n=t.$chartjs||(t.$chartjs={});if(!n.containsStyles){n.containsStyles=!0,e="/* Chart.js */\n"+e;var i=document.createElement("style");i.setAttribute("type","text/css"),i.appendChild(document.createTextNode(e)),t.appendChild(i)}}(e.host?e:document.head,ve)}},acquireContext:function(t,e){"string"==typeof t?t=document.getElementById(t):t.length&&(t=t[0]),t&&t.canvas&&(t=t.canvas);var n=t&&t.getContext&&t.getContext("2d");return n&&n.canvas===t?(this._ensureLoaded(t),function(t,e){var n=t.style,i=t.getAttribute("height"),a=t.getAttribute("width");if(t.$chartjs={initial:{height:i,width:a,style:{display:n.display,height:n.height,width:n.width}}},n.display=n.display||"block",null===a||""===a){var r=we(t,"width");void 0!==r&&(t.width=r)}if(null===i||""===i)if(""===t.style.height)t.height=t.width/(e.options.aspectRatio||2);else{var o=we(t,"height");void 0!==r&&(t.height=o)}}(t,e),n):null},releaseContext:function(t){var e=t.canvas;if(e.$chartjs){var n=e.$chartjs.initial;["height","width"].forEach(function(t){var i=n[t];B.isNullOrUndef(i)?e.removeAttribute(t):e.setAttribute(t,i)}),B.each(n.style||{},function(t,n){e.style[n]=t}),e.width=e.width,delete e.$chartjs}},addEventListener:function(t,e,n){var i=t.canvas;if("resize"!==e){var a=n.$chartjs||(n.$chartjs={});Me(i,e,(a.proxies||(a.proxies={}))[t.id+"_"+e]=function(e){n(function(t,e){var n=_e[t.type]||t.type,i=B.getRelativePosition(t,e);return De(n,e,i.x,i.y,t)}(e,t))})}else Pe(i,n,t)},removeEventListener:function(t,e,n){var i=t.canvas;if("resize"!==e){var a=((n.$chartjs||{}).proxies||{})[t.id+"_"+e];a&&Se(i,e,a)}else Te(i)}};B.addEvent=Me,B.removeEvent=Se;var Ae=Oe._enabled?Oe:{acquireContext:function(t){return t&&t.canvas&&(t=t.canvas),t&&t.getContext("2d")||null}},Fe=B.extend({initialize:function(){},acquireContext:function(){},releaseContext:function(){},addEventListener:function(){},removeEventListener:function(){}},Ae);Y._set("global",{plugins:{}});var Ie={_plugins:[],_cacheId:0,register:function(t){var e=this._plugins;[].concat(t).forEach(function(t){-1===e.indexOf(t)&&e.push(t)}),this._cacheId++},unregister:function(t){var e=this._plugins;[].concat(t).forEach(function(t){var n=e.indexOf(t);-1!==n&&e.splice(n,1)}),this._cacheId++},clear:function(){this._plugins=[],this._cacheId++},count:function(){return this._plugins.length},getAll:function(){return this._plugins},notify:function(t,e,n){var i,a,r,o,s,l=this.descriptors(t),u=l.length;for(i=0;i<u;++i)if("function"==typeof(s=(r=(a=l[i]).plugin)[e])&&((o=[t].concat(n||[])).push(a.options),!1===s.apply(r,o)))return!1;return!0},descriptors:function(t){var e=t.$plugins||(t.$plugins={});if(e.id===this._cacheId)return e.descriptors;var n=[],i=[],a=t&&t.config||{},r=a.options&&a.options.plugins||{};return this._plugins.concat(a.plugins||[]).forEach(function(t){if(-1===n.indexOf(t)){var e=t.id,a=r[e];!1!==a&&(!0===a&&(a=B.clone(Y.global.plugins[e])),n.push(t),i.push({plugin:t,options:a||{}}))}}),e.descriptors=i,e.id=this._cacheId,i},_invalidate:function(t){delete t.$plugins}},Le={constructors:{},defaults:{},registerScaleType:function(t,e,n){this.constructors[t]=e,this.defaults[t]=B.clone(n)},getScaleConstructor:function(t){return this.constructors.hasOwnProperty(t)?this.constructors[t]:void 0},getScaleDefaults:function(t){return this.defaults.hasOwnProperty(t)?B.merge(Object.create(null),[Y.scale,this.defaults[t]]):{}},updateScaleDefaults:function(t,e){var n=this;n.defaults.hasOwnProperty(t)&&(n.defaults[t]=B.extend(n.defaults[t],e))},addScalesToLayout:function(t){B.each(t.scales,function(e){e.fullWidth=e.options.fullWidth,e.position=e.options.position,e.weight=e.options.weight,pe.addBox(t,e)})}},Re=B.valueOrDefault,Ne=B.rtl.getRtlAdapter;Y._set("global",{tooltips:{enabled:!0,custom:null,mode:"nearest",position:"average",intersect:!0,backgroundColor:"rgba(0,0,0,0.8)",titleFontStyle:"bold",titleSpacing:2,titleMarginBottom:6,titleFontColor:"#fff",titleAlign:"left",bodySpacing:2,bodyFontColor:"#fff",bodyAlign:"left",footerFontStyle:"bold",footerSpacing:2,footerMarginTop:6,footerFontColor:"#fff",footerAlign:"left",yPadding:6,xPadding:6,caretPadding:2,caretSize:5,cornerRadius:6,multiKeyBackground:"#fff",displayColors:!0,borderColor:"rgba(0,0,0,0)",borderWidth:0,callbacks:{beforeTitle:B.noop,title:function(t,e){var n="",i=e.labels,a=i?i.length:0;if(t.length>0){var r=t[0];r.label?n=r.label:r.xLabel?n=r.xLabel:a>0&&r.index<a&&(n=i[r.index])}return n},afterTitle:B.noop,beforeBody:B.noop,beforeLabel:B.noop,label:function(t,e){var n=e.datasets[t.datasetIndex].label||"";return n&&(n+=": "),B.isNullOrUndef(t.value)?n+=t.yLabel:n+=t.value,n},labelColor:function(t,e){var n=e.getDatasetMeta(t.datasetIndex).data[t.index]._view;return{borderColor:n.borderColor,backgroundColor:n.backgroundColor}},labelTextColor:function(){return this._options.bodyFontColor},afterLabel:B.noop,afterBody:B.noop,beforeFooter:B.noop,footer:B.noop,afterFooter:B.noop}}});var We={average:function(t){if(!t.length)return!1;var e,n,i=0,a=0,r=0;for(e=0,n=t.length;e<n;++e){var o=t[e];if(o&&o.hasValue()){var s=o.tooltipPosition();i+=s.x,a+=s.y,++r}}return{x:i/r,y:a/r}},nearest:function(t,e){var n,i,a,r=e.x,o=e.y,s=Number.POSITIVE_INFINITY;for(n=0,i=t.length;n<i;++n){var l=t[n];if(l&&l.hasValue()){var u=l.getCenterPoint(),d=B.distanceBetweenPoints(e,u);d<s&&(s=d,a=l)}}if(a){var h=a.tooltipPosition();r=h.x,o=h.y}return{x:r,y:o}}};function Ye(t,e){return e&&(B.isArray(e)?Array.prototype.push.apply(t,e):t.push(e)),t}function ze(t){return("string"==typeof t||t instanceof String)&&t.indexOf("\n")>-1?t.split("\n"):t}function Ee(t){var e=Y.global;return{xPadding:t.xPadding,yPadding:t.yPadding,xAlign:t.xAlign,yAlign:t.yAlign,rtl:t.rtl,textDirection:t.textDirection,bodyFontColor:t.bodyFontColor,_bodyFontFamily:Re(t.bodyFontFamily,e.defaultFontFamily),_bodyFontStyle:Re(t.bodyFontStyle,e.defaultFontStyle),_bodyAlign:t.bodyAlign,bodyFontSize:Re(t.bodyFontSize,e.defaultFontSize),bodySpacing:t.bodySpacing,titleFontColor:t.titleFontColor,_titleFontFamily:Re(t.titleFontFamily,e.defaultFontFamily),_titleFontStyle:Re(t.titleFontStyle,e.defaultFontStyle),titleFontSize:Re(t.titleFontSize,e.defaultFontSize),_titleAlign:t.titleAlign,titleSpacing:t.titleSpacing,titleMarginBottom:t.titleMarginBottom,footerFontColor:t.footerFontColor,_footerFontFamily:Re(t.footerFontFamily,e.defaultFontFamily),_footerFontStyle:Re(t.footerFontStyle,e.defaultFontStyle),footerFontSize:Re(t.footerFontSize,e.defaultFontSize),_footerAlign:t.footerAlign,footerSpacing:t.footerSpacing,footerMarginTop:t.footerMarginTop,caretSize:t.caretSize,cornerRadius:t.cornerRadius,backgroundColor:t.backgroundColor,opacity:0,legendColorBackground:t.multiKeyBackground,displayColors:t.displayColors,borderColor:t.borderColor,borderWidth:t.borderWidth}}function Ve(t,e){return"center"===e?t.x+t.width/2:"right"===e?t.x+t.width-t.xPadding:t.x+t.xPadding}function He(t){return Ye([],ze(t))}var Be=X.extend({initialize:function(){this._model=Ee(this._options),this._lastActive=[]},getTitle:function(){var t=this,e=t._options,n=e.callbacks,i=n.beforeTitle.apply(t,arguments),a=n.title.apply(t,arguments),r=n.afterTitle.apply(t,arguments),o=[];return o=Ye(o,ze(i)),o=Ye(o,ze(a)),o=Ye(o,ze(r))},getBeforeBody:function(){return He(this._options.callbacks.beforeBody.apply(this,arguments))},getBody:function(t,e){var n=this,i=n._options.callbacks,a=[];return B.each(t,function(t){var r={before:[],lines:[],after:[]};Ye(r.before,ze(i.beforeLabel.call(n,t,e))),Ye(r.lines,i.label.call(n,t,e)),Ye(r.after,ze(i.afterLabel.call(n,t,e))),a.push(r)}),a},getAfterBody:function(){return He(this._options.callbacks.afterBody.apply(this,arguments))},getFooter:function(){var t=this,e=t._options.callbacks,n=e.beforeFooter.apply(t,arguments),i=e.footer.apply(t,arguments),a=e.afterFooter.apply(t,arguments),r=[];return r=Ye(r,ze(n)),r=Ye(r,ze(i)),r=Ye(r,ze(a))},update:function(t){var e,n,i,a,r,o,s,l,u,d,h=this,c=h._options,f=h._model,g=h._model=Ee(c),m=h._active,p=h._data,v={xAlign:f.xAlign,yAlign:f.yAlign},b={x:f.x,y:f.y},y={width:f.width,height:f.height},x={x:f.caretX,y:f.caretY};if(m.length){g.opacity=1;var _=[],w=[];x=We[c.position].call(h,m,h._eventPosition);var k=[];for(e=0,n=m.length;e<n;++e)k.push((i=m[e],a=void 0,r=void 0,o=void 0,s=void 0,l=void 0,u=void 0,d=void 0,a=i._xScale,r=i._yScale||i._scale,o=i._index,s=i._datasetIndex,l=i._chart.getDatasetMeta(s).controller,u=l._getIndexScale(),d=l._getValueScale(),{xLabel:a?a.getLabelForIndex(o,s):"",yLabel:r?r.getLabelForIndex(o,s):"",label:u?""+u.getLabelForIndex(o,s):"",value:d?""+d.getLabelForIndex(o,s):"",index:o,datasetIndex:s,x:i._model.x,y:i._model.y}));c.filter&&(k=k.filter(function(t){return c.filter(t,p)})),c.itemSort&&(k=k.sort(function(t,e){return c.itemSort(t,e,p)})),B.each(k,function(t){_.push(c.callbacks.labelColor.call(h,t,h._chart)),w.push(c.callbacks.labelTextColor.call(h,t,h._chart))}),g.title=h.getTitle(k,p),g.beforeBody=h.getBeforeBody(k,p),g.body=h.getBody(k,p),g.afterBody=h.getAfterBody(k,p),g.footer=h.getFooter(k,p),g.x=x.x,g.y=x.y,g.caretPadding=c.caretPadding,g.labelColors=_,g.labelTextColors=w,g.dataPoints=k,y=function(t,e){var n=t._chart.ctx,i=2*e.yPadding,a=0,r=e.body,o=r.reduce(function(t,e){return t+e.before.length+e.lines.length+e.after.length},0);o+=e.beforeBody.length+e.afterBody.length;var s=e.title.length,l=e.footer.length,u=e.titleFontSize,d=e.bodyFontSize,h=e.footerFontSize;i+=s*u,i+=s?(s-1)*e.titleSpacing:0,i+=s?e.titleMarginBottom:0,i+=o*d,i+=o?(o-1)*e.bodySpacing:0,i+=l?e.footerMarginTop:0,i+=l*h,i+=l?(l-1)*e.footerSpacing:0;var c=0,f=function(t){a=Math.max(a,n.measureText(t).width+c)};return n.font=B.fontString(u,e._titleFontStyle,e._titleFontFamily),B.each(e.title,f),n.font=B.fontString(d,e._bodyFontStyle,e._bodyFontFamily),B.each(e.beforeBody.concat(e.afterBody),f),c=e.displayColors?d+2:0,B.each(r,function(t){B.each(t.before,f),B.each(t.lines,f),B.each(t.after,f)}),c=0,n.font=B.fontString(h,e._footerFontStyle,e._footerFontFamily),B.each(e.footer,f),{width:a+=2*e.xPadding,height:i}}(this,g),b=function(t,e,n,i){var a=t.x,r=t.y,o=t.caretSize,s=t.caretPadding,l=t.cornerRadius,u=n.xAlign,d=n.yAlign,h=o+s,c=l+s;return"right"===u?a-=e.width:"center"===u&&((a-=e.width/2)+e.width>i.width&&(a=i.width-e.width),a<0&&(a=0)),"top"===d?r+=h:r-="bottom"===d?e.height+h:e.height/2,"center"===d?"left"===u?a+=h:"right"===u&&(a-=h):"left"===u?a-=c:"right"===u&&(a+=c),{x:a,y:r}}(g,y,v=function(t,e){var n,i,a,r,o,s=t._model,l=t._chart,u=t._chart.chartArea,d="center",h="center";s.y<e.height?h="top":s.y>l.height-e.height&&(h="bottom");var c=(u.left+u.right)/2,f=(u.top+u.bottom)/2;"center"===h?(n=function(t){return t<=c},i=function(t){return t>c}):(n=function(t){return t<=e.width/2},i=function(t){return t>=l.width-e.width/2}),a=function(t){return t+e.width+s.caretSize+s.caretPadding>l.width},r=function(t){return t-e.width-s.caretSize-s.caretPadding<0},o=function(t){return t<=f?"top":"bottom"},n(s.x)?(d="left",a(s.x)&&(d="center",h=o(s.y))):i(s.x)&&(d="right",r(s.x)&&(d="center",h=o(s.y)));var g=t._options;return{xAlign:g.xAlign?g.xAlign:d,yAlign:g.yAlign?g.yAlign:h}}(this,y),h._chart)}else g.opacity=0;return g.xAlign=v.xAlign,g.yAlign=v.yAlign,g.x=b.x,g.y=b.y,g.width=y.width,g.height=y.height,g.caretX=x.x,g.caretY=x.y,h._model=g,t&&c.custom&&c.custom.call(h,g),h},drawCaret:function(t,e){var n=this._chart.ctx,i=this._view,a=this.getCaretPosition(t,e,i);n.lineTo(a.x1,a.y1),n.lineTo(a.x2,a.y2),n.lineTo(a.x3,a.y3)},getCaretPosition:function(t,e,n){var i,a,r,o,s,l,u=n.caretSize,d=n.cornerRadius,h=n.xAlign,c=n.yAlign,f=t.x,g=t.y,m=e.width,p=e.height;if("center"===c)s=g+p/2,"left"===h?(a=(i=f)-u,r=i,o=s+u,l=s-u):(a=(i=f+m)+u,r=i,o=s-u,l=s+u);else if("left"===h?(i=(a=f+d+u)-u,r=a+u):"right"===h?(i=(a=f+m-d-u)-u,r=a+u):(i=(a=n.caretX)-u,r=a+u),"top"===c)s=(o=g)-u,l=o;else{s=(o=g+p)+u,l=o;var v=r;r=i,i=v}return{x1:i,x2:a,x3:r,y1:o,y2:s,y3:l}},drawTitle:function(t,e,n){var i,a,r,o=e.title,s=o.length;if(s){var l=Ne(e.rtl,e.x,e.width);for(t.x=Ve(e,e._titleAlign),n.textAlign=l.textAlign(e._titleAlign),n.textBaseline="middle",i=e.titleFontSize,a=e.titleSpacing,n.fillStyle=e.titleFontColor,n.font=B.fontString(i,e._titleFontStyle,e._titleFontFamily),r=0;r<s;++r)n.fillText(o[r],l.x(t.x),t.y+i/2),t.y+=i+a,r+1===s&&(t.y+=e.titleMarginBottom-a)}},drawBody:function(t,e,n){var i,a,r,o,s,l,u,d,h=e.bodyFontSize,c=e.bodySpacing,f=e._bodyAlign,g=e.body,m=e.displayColors,p=0,v=m?Ve(e,"left"):0,b=Ne(e.rtl,e.x,e.width),y=function(e){n.fillText(e,b.x(t.x+p),t.y+h/2),t.y+=h+c},x=b.textAlign(f);for(n.textAlign=f,n.textBaseline="middle",n.font=B.fontString(h,e._bodyFontStyle,e._bodyFontFamily),t.x=Ve(e,x),n.fillStyle=e.bodyFontColor,B.each(e.beforeBody,y),p=m&&"right"!==x?"center"===f?h/2+1:h+2:0,s=0,u=g.length;s<u;++s){for(i=g[s],a=e.labelTextColors[s],r=e.labelColors[s],n.fillStyle=a,B.each(i.before,y),l=0,d=(o=i.lines).length;l<d;++l){if(m){var _=b.x(v);n.fillStyle=e.legendColorBackground,n.fillRect(b.leftForLtr(_,h),t.y,h,h),n.lineWidth=1,n.strokeStyle=r.borderColor,n.strokeRect(b.leftForLtr(_,h),t.y,h,h),n.fillStyle=r.backgroundColor,n.fillRect(b.leftForLtr(b.xPlus(_,1),h-2),t.y+1,h-2,h-2),n.fillStyle=a}y(o[l])}B.each(i.after,y)}p=0,B.each(e.afterBody,y),t.y-=c},drawFooter:function(t,e,n){var i,a,r=e.footer,o=r.length;if(o){var s=Ne(e.rtl,e.x,e.width);for(t.x=Ve(e,e._footerAlign),t.y+=e.footerMarginTop,n.textAlign=s.textAlign(e._footerAlign),n.textBaseline="middle",i=e.footerFontSize,n.fillStyle=e.footerFontColor,n.font=B.fontString(i,e._footerFontStyle,e._footerFontFamily),a=0;a<o;++a)n.fillText(r[a],s.x(t.x),t.y+i/2),t.y+=i+e.footerSpacing}},drawBackground:function(t,e,n,i){n.fillStyle=e.backgroundColor,n.strokeStyle=e.borderColor,n.lineWidth=e.borderWidth;var a=e.xAlign,r=e.yAlign,o=t.x,s=t.y,l=i.width,u=i.height,d=e.cornerRadius;n.beginPath(),n.moveTo(o+d,s),"top"===r&&this.drawCaret(t,i),n.lineTo(o+l-d,s),n.quadraticCurveTo(o+l,s,o+l,s+d),"center"===r&&"right"===a&&this.drawCaret(t,i),n.lineTo(o+l,s+u-d),n.quadraticCurveTo(o+l,s+u,o+l-d,s+u),"bottom"===r&&this.drawCaret(t,i),n.lineTo(o+d,s+u),n.quadraticCurveTo(o,s+u,o,s+u-d),"center"===r&&"left"===a&&this.drawCaret(t,i),n.lineTo(o,s+d),n.quadraticCurveTo(o,s,o+d,s),n.closePath(),n.fill(),e.borderWidth>0&&n.stroke()},draw:function(){var t=this._chart.ctx,e=this._view;if(0!==e.opacity){var n={width:e.width,height:e.height},i={x:e.x,y:e.y},a=Math.abs(e.opacity<.001)?0:e.opacity,r=e.title.length||e.beforeBody.length||e.body.length||e.afterBody.length||e.footer.length;this._options.enabled&&r&&(t.save(),t.globalAlpha=a,this.drawBackground(i,e,t,n),i.y+=e.yPadding,B.rtl.overrideTextDirection(t,e.textDirection),this.drawTitle(i,e,t),this.drawBody(i,e,t),this.drawFooter(i,e,t),B.rtl.restoreTextDirection(t,e.textDirection),t.restore())}},handleEvent:function(t){var e,n=this,i=n._options;return n._lastActive=n._lastActive||[],"mouseout"===t.type?n._active=[]:(n._active=n._chart.getElementsAtEventForMode(t,i.mode,i),i.reverse&&n._active.reverse()),(e=!B.arrayEquals(n._active,n._lastActive))&&(n._lastActive=n._active,(i.enabled||i.custom)&&(n._eventPosition={x:t.x,y:t.y},n.update(!0),n.pivot())),e}}),je=We,Ue=Be;Ue.positioners=je;var Ge=B.valueOrDefault;function qe(){return B.merge(Object.create(null),[].slice.call(arguments),{merger:function(t,e,n,i){if("xAxes"===t||"yAxes"===t){var a,r,o,s=n[t].length;for(e[t]||(e[t]=[]),a=0;a<s;++a)o=n[t][a],r=Ge(o.type,"xAxes"===t?"category":"linear"),a>=e[t].length&&e[t].push({}),!e[t][a].type||o.type&&o.type!==e[t][a].type?B.merge(e[t][a],[Le.getScaleDefaults(r),o]):B.merge(e[t][a],o)}else B._merger(t,e,n,i)}})}function Ze(){return B.merge(Object.create(null),[].slice.call(arguments),{merger:function(t,e,n,i){var a=e[t]||Object.create(null),r=n[t];"scales"===t?e[t]=qe(a,r):"scale"===t?e[t]=B.merge(a,[Le.getScaleDefaults(r.type),r]):B._merger(t,e,n,i)}})}function $e(t){var e=t.options;B.each(t.scales,function(e){pe.removeBox(t,e)}),e=Ze(Y.global,Y[t.config.type],e),t.options=t.config.options=e,t.ensureScalesHaveIDs(),t.buildOrUpdateScales(),t.tooltip._options=e.tooltips,t.tooltip.initialize()}function Xe(t,e,n){var i,a=function(t){return t.id===i};do{i=e+n++}while(B.findIndex(t,a)>=0);return i}function Ke(t){return"top"===t||"bottom"===t}function Je(t,e){return function(n,i){return n[t]===i[t]?n[e]-i[e]:n[t]-i[t]}}Y._set("global",{elements:{},events:["mousemove","mouseout","click","touchstart","touchmove"],hover:{onHover:null,mode:"nearest",intersect:!0,animationDuration:400},onClick:null,maintainAspectRatio:!0,responsive:!0,responsiveAnimationDuration:0});var Qe=function(t,e){return this.construct(t,e),this};B.extend(Qe.prototype,{construct:function(t,e){var n=this;e=function(t){var e=(t=t||Object.create(null)).data=t.data||{};return e.datasets=e.datasets||[],e.labels=e.labels||[],t.options=Ze(Y.global,Y[t.type],t.options||{}),t}(e);var i=Fe.acquireContext(t,e),a=i&&i.canvas,r=a&&a.height,o=a&&a.width;n.id=B.uid(),n.ctx=i,n.canvas=a,n.config=e,n.width=o,n.height=r,n.aspectRatio=r?o/r:null,n.options=e.options,n._bufferedRender=!1,n._layers=[],n.chart=n,n.controller=n,Qe.instances[n.id]=n,Object.defineProperty(n,"data",{get:function(){return n.config.data},set:function(t){n.config.data=t}}),i&&a?(n.initialize(),n.update()):console.error("Failed to create chart: can't acquire context from the given item")},initialize:function(){var t=this;return Ie.notify(t,"beforeInit"),B.retinaScale(t,t.options.devicePixelRatio),t.bindEvents(),t.options.responsive&&t.resize(!0),t.initToolTip(),Ie.notify(t,"afterInit"),t},clear:function(){return B.canvas.clear(this),this},stop:function(){return Q.cancelAnimation(this),this},resize:function(t){var e=this,n=e.options,i=e.canvas,a=n.maintainAspectRatio&&e.aspectRatio||null,r=Math.max(0,Math.floor(B.getMaximumWidth(i))),o=Math.max(0,Math.floor(a?r/a:B.getMaximumHeight(i)));if((e.width!==r||e.height!==o)&&(i.width=e.width=r,i.height=e.height=o,i.style.width=r+"px",i.style.height=o+"px",B.retinaScale(e,n.devicePixelRatio),!t)){var s={width:r,height:o};Ie.notify(e,"resize",[s]),n.onResize&&n.onResize(e,s),e.stop(),e.update({duration:n.responsiveAnimationDuration})}},ensureScalesHaveIDs:function(){var t=this.options,e=t.scales||{},n=t.scale;B.each(e.xAxes,function(t,n){t.id||(t.id=Xe(e.xAxes,"x-axis-",n))}),B.each(e.yAxes,function(t,n){t.id||(t.id=Xe(e.yAxes,"y-axis-",n))}),n&&(n.id=n.id||"scale")},buildOrUpdateScales:function(){var t=this,e=t.options,n=t.scales||{},i=[],a=Object.keys(n).reduce(function(t,e){return t[e]=!1,t},{});e.scales&&(i=i.concat((e.scales.xAxes||[]).map(function(t){return{options:t,dtype:"category",dposition:"bottom"}}),(e.scales.yAxes||[]).map(function(t){return{options:t,dtype:"linear",dposition:"left"}}))),e.scale&&i.push({options:e.scale,dtype:"radialLinear",isDefault:!0,dposition:"chartArea"}),B.each(i,function(e){var i=e.options,r=i.id,o=Ge(i.type,e.dtype);Ke(i.position)!==Ke(e.dposition)&&(i.position=e.dposition),a[r]=!0;var s=null;if(r in n&&n[r].type===o)(s=n[r]).options=i,s.ctx=t.ctx,s.chart=t;else{var l=Le.getScaleConstructor(o);if(!l)return;s=new l({id:r,type:o,options:i,ctx:t.ctx,chart:t}),n[s.id]=s}s.mergeTicksOptions(),e.isDefault&&(t.scale=s)}),B.each(a,function(t,e){t||delete n[e]}),t.scales=n,Le.addScalesToLayout(this)},buildOrUpdateControllers:function(){var t,e,n=this,i=[],a=n.data.datasets;for(t=0,e=a.length;t<e;t++){var r=a[t],o=n.getDatasetMeta(t),s=r.type||n.config.type;if(o.type&&o.type!==s&&(n.destroyDatasetMeta(t),o=n.getDatasetMeta(t)),o.type=s,o.order=r.order||0,o.index=t,o.controller)o.controller.updateIndex(t),o.controller.linkScales();else{var l=Qt[o.type];if(void 0===l)throw new Error('"'+o.type+'" is not a chart type.');o.controller=new l(n,t),i.push(o.controller)}}return i},resetElements:function(){var t=this;B.each(t.data.datasets,function(e,n){t.getDatasetMeta(n).controller.reset()},t)},reset:function(){this.resetElements(),this.tooltip.initialize()},update:function(t){var e,n,i=this;if(t&&"object"==typeof t||(t={duration:t,lazy:arguments[1]}),$e(i),Ie._invalidate(i),!1!==Ie.notify(i,"beforeUpdate")){i.tooltip._data=i.data;var a=i.buildOrUpdateControllers();for(e=0,n=i.data.datasets.length;e<n;e++)i.getDatasetMeta(e).controller.buildOrUpdateElements();i.updateLayout(),i.options.animation&&i.options.animation.duration&&B.each(a,function(t){t.reset()}),i.updateDatasets(),i.tooltip.initialize(),i.lastActive=[],Ie.notify(i,"afterUpdate"),i._layers.sort(Je("z","_idx")),i._bufferedRender?i._bufferedRequest={duration:t.duration,easing:t.easing,lazy:t.lazy}:i.render(t)}},updateLayout:function(){var t=this;!1!==Ie.notify(t,"beforeLayout")&&(pe.update(this,this.width,this.height),t._layers=[],B.each(t.boxes,function(e){e._configure&&e._configure(),t._layers.push.apply(t._layers,e._layers())},t),t._layers.forEach(function(t,e){t._idx=e}),Ie.notify(t,"afterScaleUpdate"),Ie.notify(t,"afterLayout"))},updateDatasets:function(){var t=this;if(!1!==Ie.notify(t,"beforeDatasetsUpdate")){for(var e=0,n=t.data.datasets.length;e<n;++e)t.updateDataset(e);Ie.notify(t,"afterDatasetsUpdate")}},updateDataset:function(t){var e=this,n=e.getDatasetMeta(t),i={meta:n,index:t};!1!==Ie.notify(e,"beforeDatasetUpdate",[i])&&(n.controller._update(),Ie.notify(e,"afterDatasetUpdate",[i]))},render:function(t){var e=this;t&&"object"==typeof t||(t={duration:t,lazy:arguments[1]});var n=e.options.animation,i=Ge(t.duration,n&&n.duration),a=t.lazy;if(!1!==Ie.notify(e,"beforeRender")){var r=function(t){Ie.notify(e,"afterRender"),B.callback(n&&n.onComplete,[t],e)};if(n&&i){var o=new J({numSteps:i/16.66,easing:t.easing||n.easing,render:function(t,e){var n=B.easing.effects[e.easing],i=e.currentStep,a=i/e.numSteps;t.draw(n(a),a,i)},onAnimationProgress:n.onProgress,onAnimationComplete:r});Q.addAnimation(e,o,i,a)}else e.draw(),r(new J({numSteps:0,chart:e}));return e}},draw:function(t){var e,n,i=this;if(i.clear(),B.isNullOrUndef(t)&&(t=1),i.transition(t),!(i.width<=0||i.height<=0)&&!1!==Ie.notify(i,"beforeDraw",[t])){for(n=i._layers,e=0;e<n.length&&n[e].z<=0;++e)n[e].draw(i.chartArea);for(i.drawDatasets(t);e<n.length;++e)n[e].draw(i.chartArea);i._drawTooltip(t),Ie.notify(i,"afterDraw",[t])}},transition:function(t){for(var e=this,n=0,i=(e.data.datasets||[]).length;n<i;++n)e.isDatasetVisible(n)&&e.getDatasetMeta(n).controller.transition(t);e.tooltip.transition(t)},_getSortedDatasetMetas:function(t){var e,n,i=this,a=[];for(e=0,n=(i.data.datasets||[]).length;e<n;++e)t&&!i.isDatasetVisible(e)||a.push(i.getDatasetMeta(e));return a.sort(Je("order","index")),a},_getSortedVisibleDatasetMetas:function(){return this._getSortedDatasetMetas(!0)},drawDatasets:function(t){var e,n,i=this;if(!1!==Ie.notify(i,"beforeDatasetsDraw",[t])){for(n=(e=i._getSortedVisibleDatasetMetas()).length-1;n>=0;--n)i.drawDataset(e[n],t);Ie.notify(i,"afterDatasetsDraw",[t])}},drawDataset:function(t,e){var n={meta:t,index:t.index,easingValue:e};!1!==Ie.notify(this,"beforeDatasetDraw",[n])&&(t.controller.draw(e),Ie.notify(this,"afterDatasetDraw",[n]))},_drawTooltip:function(t){var e=this,n=e.tooltip,i={tooltip:n,easingValue:t};!1!==Ie.notify(e,"beforeTooltipDraw",[i])&&(n.draw(),Ie.notify(e,"afterTooltipDraw",[i]))},getElementAtEvent:function(t){return oe.modes.single(this,t)},getElementsAtEvent:function(t){return oe.modes.label(this,t,{intersect:!0})},getElementsAtXAxis:function(t){return oe.modes["x-axis"](this,t,{intersect:!0})},getElementsAtEventForMode:function(t,e,n){var i=oe.modes[e];return"function"==typeof i?i(this,t,n):[]},getDatasetAtEvent:function(t){return oe.modes.dataset(this,t,{intersect:!0})},getDatasetMeta:function(t){var e=this,n=e.data.datasets[t];n._meta||(n._meta={});var i=n._meta[e.id];return i||(i=n._meta[e.id]={type:null,data:[],dataset:null,controller:null,hidden:null,xAxisID:null,yAxisID:null,order:n.order||0,index:t}),i},getVisibleDatasetCount:function(){for(var t=0,e=0,n=this.data.datasets.length;e<n;++e)this.isDatasetVisible(e)&&t++;return t},isDatasetVisible:function(t){var e=this.getDatasetMeta(t);return"boolean"==typeof e.hidden?!e.hidden:!this.data.datasets[t].hidden},generateLegend:function(){return this.options.legendCallback(this)},destroyDatasetMeta:function(t){var e=this.id,n=this.data.datasets[t],i=n._meta&&n._meta[e];i&&(i.controller.destroy(),delete n._meta[e])},destroy:function(){var t,e,n=this,i=n.canvas;for(n.stop(),t=0,e=n.data.datasets.length;t<e;++t)n.destroyDatasetMeta(t);i&&(n.unbindEvents(),B.canvas.clear(n),Fe.releaseContext(n.ctx),n.canvas=null,n.ctx=null),Ie.notify(n,"destroy"),delete Qe.instances[n.id]},toBase64Image:function(){return this.canvas.toDataURL.apply(this.canvas,arguments)},initToolTip:function(){var t=this;t.tooltip=new Ue({_chart:t,_chartInstance:t,_data:t.data,_options:t.options.tooltips},t)},bindEvents:function(){var t=this,e=t._listeners={},n=function(){t.eventHandler.apply(t,arguments)};B.each(t.options.events,function(i){Fe.addEventListener(t,i,n),e[i]=n}),t.options.responsive&&(n=function(){t.resize()},Fe.addEventListener(t,"resize",n),e.resize=n)},unbindEvents:function(){var t=this,e=t._listeners;e&&(delete t._listeners,B.each(e,function(e,n){Fe.removeEventListener(t,n,e)}))},updateHoverStyle:function(t,e,n){var i,a,r,o=n?"set":"remove";for(a=0,r=t.length;a<r;++a)(i=t[a])&&this.getDatasetMeta(i._datasetIndex).controller[o+"HoverStyle"](i);"dataset"===e&&this.getDatasetMeta(t[0]._datasetIndex).controller["_"+o+"DatasetHoverStyle"]()},eventHandler:function(t){var e=this,n=e.tooltip;if(!1!==Ie.notify(e,"beforeEvent",[t])){e._bufferedRender=!0,e._bufferedRequest=null;var i=e.handleEvent(t);n&&(i=n._start?n.handleEvent(t):i|n.handleEvent(t)),Ie.notify(e,"afterEvent",[t]);var a=e._bufferedRequest;return a?e.render(a):i&&!e.animating&&(e.stop(),e.render({duration:e.options.hover.animationDuration,lazy:!0})),e._bufferedRender=!1,e._bufferedRequest=null,e}},handleEvent:function(t){var e,n=this,i=n.options||{},a=i.hover;return n.lastActive=n.lastActive||[],"mouseout"===t.type?n.active=[]:n.active=n.getElementsAtEventForMode(t,a.mode,a),B.callback(i.onHover||i.hover.onHover,[t.native,n.active],n),"mouseup"!==t.type&&"click"!==t.type||i.onClick&&i.onClick.call(n,t.native,n.active),n.lastActive.length&&n.updateHoverStyle(n.lastActive,a.mode,!1),n.active.length&&a.mode&&n.updateHoverStyle(n.active,a.mode,!0),e=!B.arrayEquals(n.active,n.lastActive),n.lastActive=n.active,e}}),Qe.instances={};var tn=Qe;Qe.Controller=Qe,Qe.types={},B.configMerge=Ze,B.scaleMerge=qe;function en(){throw new Error("This method is not implemented: either no adapter can be found or an incomplete integration was provided.")}function nn(t){this.options=t||{}}B.extend(nn.prototype,{formats:en,parse:en,format:en,add:en,diff:en,startOf:en,endOf:en,_create:function(t){return t}}),nn.override=function(t){B.extend(nn.prototype,t)};var an={_date:nn},rn={formatters:{values:function(t){return B.isArray(t)?t:""+t},linear:function(t,e,n){var i=n.length>3?n[2]-n[1]:n[1]-n[0];Math.abs(i)>1&&t!==Math.floor(t)&&(i=t-Math.floor(t));var a=B.log10(Math.abs(i)),r="";if(0!==t)if(Math.max(Math.abs(n[0]),Math.abs(n[n.length-1]))<1e-4){var o=B.log10(Math.abs(t)),s=Math.floor(o)-Math.floor(a);s=Math.max(Math.min(s,20),0),r=t.toExponential(s)}else{var l=-1*Math.floor(a);l=Math.max(Math.min(l,20),0),r=t.toFixed(l)}else r="0";return r},logarithmic:function(t,e,n){var i=t/Math.pow(10,Math.floor(B.log10(t)));return 0===t?"0":1===i||2===i||5===i||0===e||e===n.length-1?t.toExponential():""}}},on=B.isArray,sn=B.isNullOrUndef,ln=B.valueOrDefault,un=B.valueAtIndexOrDefault;function dn(t,e,n){var i,a=t.getTicks().length,r=Math.min(e,a-1),o=t.getPixelForTick(r),s=t._startPixel,l=t._endPixel,u=1e-6;if(!(n&&(i=1===a?Math.max(o-s,l-o):0===e?(t.getPixelForTick(1)-o)/2:(o-t.getPixelForTick(r-1))/2,(o+=r<e?i:-i)<s-u||o>l+u)))return o}function hn(t,e,n,i){var a,r,o,s,l,u,d,h,c,f,g,m,p,v=n.length,b=[],y=[],x=[],_=0,w=0;for(a=0;a<v;++a){if(s=n[a].label,l=n[a].major?e.major:e.minor,t.font=u=l.string,d=i[u]=i[u]||{data:{},gc:[]},h=l.lineHeight,c=f=0,sn(s)||on(s)){if(on(s))for(r=0,o=s.length;r<o;++r)g=s[r],sn(g)||on(g)||(c=B.measureText(t,d.data,d.gc,c,g),f+=h)}else c=B.measureText(t,d.data,d.gc,c,s),f=h;b.push(c),y.push(f),x.push(h/2),_=Math.max(c,_),w=Math.max(f,w)}function k(t){return{width:b[t]||0,height:y[t]||0,offset:x[t]||0}}return function(t,e){B.each(t,function(t){var n,i=t.gc,a=i.length/2;if(a>e){for(n=0;n<a;++n)delete t.data[i[n]];i.splice(0,a)}})}(i,v),m=b.indexOf(_),p=y.indexOf(w),{first:k(0),last:k(v-1),widest:k(m),highest:k(p)}}function cn(t){return t.drawTicks?t.tickMarkLength:0}function fn(t){var e,n;return t.display?(e=B.options._parseFont(t),n=B.options.toPadding(t.padding),e.lineHeight+n.height):0}function gn(t,e){return B.extend(B.options._parseFont({fontFamily:ln(e.fontFamily,t.fontFamily),fontSize:ln(e.fontSize,t.fontSize),fontStyle:ln(e.fontStyle,t.fontStyle),lineHeight:ln(e.lineHeight,t.lineHeight)}),{color:B.options.resolve([e.fontColor,t.fontColor,Y.global.defaultFontColor])})}function mn(t){var e=gn(t,t.minor);return{minor:e,major:t.major.enabled?gn(t,t.major):e}}function pn(t){var e,n,i,a=[];for(n=0,i=t.length;n<i;++n)void 0!==(e=t[n])._index&&a.push(e);return a}function vn(t,e,n,i){var a,r,o,s,l=ln(n,0),u=Math.min(ln(i,t.length),t.length),d=0;for(e=Math.ceil(e),i&&(e=(a=i-n)/Math.floor(a/e)),s=l;s<0;)d++,s=Math.round(l+d*e);for(r=Math.max(l,0);r<u;r++)o=t[r],r===s?(o._index=r,d++,s=Math.round(l+d*e)):delete o.label}Y._set("scale",{display:!0,position:"left",offset:!1,gridLines:{display:!0,color:"rgba(0,0,0,0.1)",lineWidth:1,drawBorder:!0,drawOnChartArea:!0,drawTicks:!0,tickMarkLength:10,zeroLineWidth:1,zeroLineColor:"rgba(0,0,0,0.25)",zeroLineBorderDash:[],zeroLineBorderDashOffset:0,offsetGridLines:!1,borderDash:[],borderDashOffset:0},scaleLabel:{display:!1,labelString:"",padding:{top:4,bottom:4}},ticks:{beginAtZero:!1,minRotation:0,maxRotation:50,mirror:!1,padding:0,reverse:!1,display:!0,autoSkip:!0,autoSkipPadding:0,labelOffset:0,callback:rn.formatters.values,minor:{},major:{}}});var bn=X.extend({zeroLineIndex:0,getPadding:function(){var t=this;return{left:t.paddingLeft||0,top:t.paddingTop||0,right:t.paddingRight||0,bottom:t.paddingBottom||0}},getTicks:function(){return this._ticks},_getLabels:function(){var t=this.chart.data;return this.options.labels||(this.isHorizontal()?t.xLabels:t.yLabels)||t.labels||[]},mergeTicksOptions:function(){},beforeUpdate:function(){B.callback(this.options.beforeUpdate,[this])},update:function(t,e,n){var i,a,r,o,s,l=this,u=l.options.ticks,d=u.sampleSize;if(l.beforeUpdate(),l.maxWidth=t,l.maxHeight=e,l.margins=B.extend({left:0,right:0,top:0,bottom:0},n),l._ticks=null,l.ticks=null,l._labelSizes=null,l._maxLabelLines=0,l.longestLabelWidth=0,l.longestTextCache=l.longestTextCache||{},l._gridLineItems=null,l._labelItems=null,l.beforeSetDimensions(),l.setDimensions(),l.afterSetDimensions(),l.beforeDataLimits(),l.determineDataLimits(),l.afterDataLimits(),l.beforeBuildTicks(),o=l.buildTicks()||[],(!(o=l.afterBuildTicks(o)||o)||!o.length)&&l.ticks)for(o=[],i=0,a=l.ticks.length;i<a;++i)o.push({value:l.ticks[i],major:!1});return l._ticks=o,s=d<o.length,r=l._convertTicksToLabels(s?function(t,e){for(var n=[],i=t.length/e,a=0,r=t.length;a<r;a+=i)n.push(t[Math.floor(a)]);return n}(o,d):o),l._configure(),l.beforeCalculateTickRotation(),l.calculateTickRotation(),l.afterCalculateTickRotation(),l.beforeFit(),l.fit(),l.afterFit(),l._ticksToDraw=u.display&&(u.autoSkip||"auto"===u.source)?l._autoSkip(o):o,s&&(r=l._convertTicksToLabels(l._ticksToDraw)),l.ticks=r,l.afterUpdate(),l.minSize},_configure:function(){var t,e,n=this,i=n.options.ticks.reverse;n.isHorizontal()?(t=n.left,e=n.right):(t=n.top,e=n.bottom,i=!i),n._startPixel=t,n._endPixel=e,n._reversePixels=i,n._length=e-t},afterUpdate:function(){B.callback(this.options.afterUpdate,[this])},beforeSetDimensions:function(){B.callback(this.options.beforeSetDimensions,[this])},setDimensions:function(){var t=this;t.isHorizontal()?(t.width=t.maxWidth,t.left=0,t.right=t.width):(t.height=t.maxHeight,t.top=0,t.bottom=t.height),t.paddingLeft=0,t.paddingTop=0,t.paddingRight=0,t.paddingBottom=0},afterSetDimensions:function(){B.callback(this.options.afterSetDimensions,[this])},beforeDataLimits:function(){B.callback(this.options.beforeDataLimits,[this])},determineDataLimits:B.noop,afterDataLimits:function(){B.callback(this.options.afterDataLimits,[this])},beforeBuildTicks:function(){B.callback(this.options.beforeBuildTicks,[this])},buildTicks:B.noop,afterBuildTicks:function(t){var e=this;return on(t)&&t.length?B.callback(e.options.afterBuildTicks,[e,t]):(e.ticks=B.callback(e.options.afterBuildTicks,[e,e.ticks])||e.ticks,t)},beforeTickToLabelConversion:function(){B.callback(this.options.beforeTickToLabelConversion,[this])},convertTicksToLabels:function(){var t=this,e=t.options.ticks;t.ticks=t.ticks.map(e.userCallback||e.callback,this)},afterTickToLabelConversion:function(){B.callback(this.options.afterTickToLabelConversion,[this])},beforeCalculateTickRotation:function(){B.callback(this.options.beforeCalculateTickRotation,[this])},calculateTickRotation:function(){var t,e,n,i,a,r,o,s=this,l=s.options,u=l.ticks,d=s.getTicks().length,h=u.minRotation||0,c=u.maxRotation,f=h;!s._isVisible()||!u.display||h>=c||d<=1||!s.isHorizontal()?s.labelRotation=h:(e=(t=s._getLabelSizes()).widest.width,n=t.highest.height-t.highest.offset,i=Math.min(s.maxWidth,s.chart.width-e),e+6>(a=l.offset?s.maxWidth/d:i/(d-1))&&(a=i/(d-(l.offset?.5:1)),r=s.maxHeight-cn(l.gridLines)-u.padding-fn(l.scaleLabel),o=Math.sqrt(e*e+n*n),f=B.toDegrees(Math.min(Math.asin(Math.min((t.highest.height+6)/a,1)),Math.asin(Math.min(r/o,1))-Math.asin(n/o))),f=Math.max(h,Math.min(c,f))),s.labelRotation=f)},afterCalculateTickRotation:function(){B.callback(this.options.afterCalculateTickRotation,[this])},beforeFit:function(){B.callback(this.options.beforeFit,[this])},fit:function(){var t=this,e=t.minSize={width:0,height:0},n=t.chart,i=t.options,a=i.ticks,r=i.scaleLabel,o=i.gridLines,s=t._isVisible(),l="bottom"===i.position,u=t.isHorizontal();if(u?e.width=t.maxWidth:s&&(e.width=cn(o)+fn(r)),u?s&&(e.height=cn(o)+fn(r)):e.height=t.maxHeight,a.display&&s){var d=mn(a),h=t._getLabelSizes(),c=h.first,f=h.last,g=h.widest,m=h.highest,p=.4*d.minor.lineHeight,v=a.padding;if(u){var b=0!==t.labelRotation,y=B.toRadians(t.labelRotation),x=Math.cos(y),_=Math.sin(y),w=_*g.width+x*(m.height-(b?m.offset:0))+(b?0:p);e.height=Math.min(t.maxHeight,e.height+w+v);var k,M,S=t.getPixelForTick(0)-t.left,D=t.right-t.getPixelForTick(t.getTicks().length-1);b?(k=l?x*c.width+_*c.offset:_*(c.height-c.offset),M=l?_*(f.height-f.offset):x*f.width+_*f.offset):(k=c.width/2,M=f.width/2),t.paddingLeft=Math.max((k-S)*t.width/(t.width-S),0)+3,t.paddingRight=Math.max((M-D)*t.width/(t.width-D),0)+3}else{var C=a.mirror?0:g.width+v+p;e.width=Math.min(t.maxWidth,e.width+C),t.paddingTop=c.height/2,t.paddingBottom=f.height/2}}t.handleMargins(),u?(t.width=t._length=n.width-t.margins.left-t.margins.right,t.height=e.height):(t.width=e.width,t.height=t._length=n.height-t.margins.top-t.margins.bottom)},handleMargins:function(){var t=this;t.margins&&(t.margins.left=Math.max(t.paddingLeft,t.margins.left),t.margins.top=Math.max(t.paddingTop,t.margins.top),t.margins.right=Math.max(t.paddingRight,t.margins.right),t.margins.bottom=Math.max(t.paddingBottom,t.margins.bottom))},afterFit:function(){B.callback(this.options.afterFit,[this])},isHorizontal:function(){var t=this.options.position;return"top"===t||"bottom"===t},isFullWidth:function(){return this.options.fullWidth},getRightValue:function(t){if(sn(t))return NaN;if(("number"==typeof t||t instanceof Number)&&!isFinite(t))return NaN;if(t)if(this.isHorizontal()){if(void 0!==t.x)return this.getRightValue(t.x)}else if(void 0!==t.y)return this.getRightValue(t.y);return t},_convertTicksToLabels:function(t){var e,n,i,a=this;for(a.ticks=t.map(function(t){return t.value}),a.beforeTickToLabelConversion(),e=a.convertTicksToLabels(t)||a.ticks,a.afterTickToLabelConversion(),n=0,i=t.length;n<i;++n)t[n].label=e[n];return e},_getLabelSizes:function(){var t=this,e=t._labelSizes;return e||(t._labelSizes=e=hn(t.ctx,mn(t.options.ticks),t.getTicks(),t.longestTextCache),t.longestLabelWidth=e.widest.width),e},_parseValue:function(t){var e,n,i,a;return on(t)?(e=+this.getRightValue(t[0]),n=+this.getRightValue(t[1]),i=Math.min(e,n),a=Math.max(e,n)):(e=void 0,n=t=+this.getRightValue(t),i=t,a=t),{min:i,max:a,start:e,end:n}},_getScaleLabel:function(t){var e=this._parseValue(t);return void 0!==e.start?"["+e.start+", "+e.end+"]":+this.getRightValue(t)},getLabelForIndex:B.noop,getPixelForValue:B.noop,getValueForPixel:B.noop,getPixelForTick:function(t){var e=this,n=e.options.offset,i=e._ticks.length,a=1/Math.max(i-(n?0:1),1);return t<0||t>i-1?null:e.getPixelForDecimal(t*a+(n?a/2:0))},getPixelForDecimal:function(t){var e=this;return e._reversePixels&&(t=1-t),e._startPixel+t*e._length},getDecimalForPixel:function(t){var e=(t-this._startPixel)/this._length;return this._reversePixels?1-e:e},getBasePixel:function(){return this.getPixelForValue(this.getBaseValue())},getBaseValue:function(){var t=this,e=t.min,n=t.max;return t.beginAtZero?0:e<0&&n<0?n:e>0&&n>0?e:0},_autoSkip:function(t){var e,n,i,a,r=this,o=r.options.ticks,s=r._length,l=o.maxTicksLimit||s/r._tickSize()+1,u=o.major.enabled?function(t){var e,n,i=[];for(e=0,n=t.length;e<n;e++)t[e].major&&i.push(e);return i}(t):[],d=u.length,h=u[0],c=u[d-1];if(d>l)return function(t,e,n){var i,a,r=0,o=e[0];for(n=Math.ceil(n),i=0;i<t.length;i++)a=t[i],i===o?(a._index=i,o=e[++r*n]):delete a.label}(t,u,d/l),pn(t);if(i=function(t,e,n,i){var a,r,o,s,l=function(t){var e,n,i=t.length;if(i<2)return!1;for(n=t[0],e=1;e<i;++e)if(t[e]-t[e-1]!==n)return!1;return n}(t),u=(e.length-1)/i;if(!l)return Math.max(u,1);for(o=0,s=(a=B.math._factorize(l)).length-1;o<s;o++)if((r=a[o])>u)return r;return Math.max(u,1)}(u,t,0,l),d>0){for(e=0,n=d-1;e<n;e++)vn(t,i,u[e],u[e+1]);return a=d>1?(c-h)/(d-1):null,vn(t,i,B.isNullOrUndef(a)?0:h-a,h),vn(t,i,c,B.isNullOrUndef(a)?t.length:c+a),pn(t)}return vn(t,i),pn(t)},_tickSize:function(){var t=this,e=t.options.ticks,n=B.toRadians(t.labelRotation),i=Math.abs(Math.cos(n)),a=Math.abs(Math.sin(n)),r=t._getLabelSizes(),o=e.autoSkipPadding||0,s=r?r.widest.width+o:0,l=r?r.highest.height+o:0;return t.isHorizontal()?l*i>s*a?s/i:l/a:l*a<s*i?l/i:s/a},_isVisible:function(){var t,e,n,i=this,a=i.chart,r=i.options.display;if("auto"!==r)return!!r;for(t=0,e=a.data.datasets.length;t<e;++t)if(a.isDatasetVisible(t)&&((n=a.getDatasetMeta(t)).xAxisID===i.id||n.yAxisID===i.id))return!0;return!1},_computeGridLineItems:function(t){var e,n,i,a,r,o,s,l,u,d,h,c,f,g,m,p,v,b=this,y=b.chart,x=b.options,_=x.gridLines,w=x.position,k=_.offsetGridLines,M=b.isHorizontal(),S=b._ticksToDraw,D=S.length+(k?1:0),C=cn(_),P=[],T=_.drawBorder?un(_.lineWidth,0,0):0,O=T/2,A=B._alignPixel,F=function(t){return A(y,t,T)};for("top"===w?(e=F(b.bottom),s=b.bottom-C,u=e-O,h=F(t.top)+O,f=t.bottom):"bottom"===w?(e=F(b.top),h=t.top,f=F(t.bottom)-O,s=e+O,u=b.top+C):"left"===w?(e=F(b.right),o=b.right-C,l=e-O,d=F(t.left)+O,c=t.right):(e=F(b.left),d=t.left,c=F(t.right)-O,o=e+O,l=b.left+C),n=0;n<D;++n)i=S[n]||{},sn(i.label)&&n<S.length||(n===b.zeroLineIndex&&x.offset===k?(g=_.zeroLineWidth,m=_.zeroLineColor,p=_.zeroLineBorderDash||[],v=_.zeroLineBorderDashOffset||0):(g=un(_.lineWidth,n,1),m=un(_.color,n,"rgba(0,0,0,0.1)"),p=_.borderDash||[],v=_.borderDashOffset||0),void 0!==(a=dn(b,i._index||n,k))&&(r=A(y,a,g),M?o=l=d=c=r:s=u=h=f=r,P.push({tx1:o,ty1:s,tx2:l,ty2:u,x1:d,y1:h,x2:c,y2:f,width:g,color:m,borderDash:p,borderDashOffset:v})));return P.ticksLength=D,P.borderValue=e,P},_computeLabelItems:function(){var t,e,n,i,a,r,o,s,l,u,d,h,c=this,f=c.options,g=f.ticks,m=f.position,p=g.mirror,v=c.isHorizontal(),b=c._ticksToDraw,y=mn(g),x=g.padding,_=cn(f.gridLines),w=-B.toRadians(c.labelRotation),k=[];for("top"===m?(r=c.bottom-_-x,o=w?"left":"center"):"bottom"===m?(r=c.top+_+x,o=w?"right":"center"):"left"===m?(a=c.right-(p?0:_)-x,o=p?"left":"right"):(a=c.left+(p?0:_)+x,o=p?"right":"left"),t=0,e=b.length;t<e;++t)i=(n=b[t]).label,sn(i)||(s=c.getPixelForTick(n._index||t)+g.labelOffset,u=(l=n.major?y.major:y.minor).lineHeight,d=on(i)?i.length:1,v?(a=s,h="top"===m?((w?1:.5)-d)*u:(w?0:.5)*u):(r=s,h=(1-d)*u/2),k.push({x:a,y:r,rotation:w,label:i,font:l,textOffset:h,textAlign:o}));return k},_drawGrid:function(t){var e=this,n=e.options.gridLines;if(n.display){var i,a,r,o,s,l=e.ctx,u=e.chart,d=B._alignPixel,h=n.drawBorder?un(n.lineWidth,0,0):0,c=e._gridLineItems||(e._gridLineItems=e._computeGridLineItems(t));for(r=0,o=c.length;r<o;++r)i=(s=c[r]).width,a=s.color,i&&a&&(l.save(),l.lineWidth=i,l.strokeStyle=a,l.setLineDash&&(l.setLineDash(s.borderDash),l.lineDashOffset=s.borderDashOffset),l.beginPath(),n.drawTicks&&(l.moveTo(s.tx1,s.ty1),l.lineTo(s.tx2,s.ty2)),n.drawOnChartArea&&(l.moveTo(s.x1,s.y1),l.lineTo(s.x2,s.y2)),l.stroke(),l.restore());if(h){var f,g,m,p,v=h,b=un(n.lineWidth,c.ticksLength-1,1),y=c.borderValue;e.isHorizontal()?(f=d(u,e.left,v)-v/2,g=d(u,e.right,b)+b/2,m=p=y):(m=d(u,e.top,v)-v/2,p=d(u,e.bottom,b)+b/2,f=g=y),l.lineWidth=h,l.strokeStyle=un(n.color,0),l.beginPath(),l.moveTo(f,m),l.lineTo(g,p),l.stroke()}}},_drawLabels:function(){var t=this;if(t.options.ticks.display){var e,n,i,a,r,o,s,l,u=t.ctx,d=t._labelItems||(t._labelItems=t._computeLabelItems());for(e=0,i=d.length;e<i;++e){if(o=(r=d[e]).font,u.save(),u.translate(r.x,r.y),u.rotate(r.rotation),u.font=o.string,u.fillStyle=o.color,u.textBaseline="middle",u.textAlign=r.textAlign,s=r.label,l=r.textOffset,on(s))for(n=0,a=s.length;n<a;++n)u.fillText(""+s[n],0,l),l+=o.lineHeight;else u.fillText(s,0,l);u.restore()}}},_drawTitle:function(){var t=this,e=t.ctx,n=t.options,i=n.scaleLabel;if(i.display){var a,r,o=ln(i.fontColor,Y.global.defaultFontColor),s=B.options._parseFont(i),l=B.options.toPadding(i.padding),u=s.lineHeight/2,d=n.position,h=0;if(t.isHorizontal())a=t.left+t.width/2,r="bottom"===d?t.bottom-u-l.bottom:t.top+u+l.top;else{var c="left"===d;a=c?t.left+u+l.top:t.right-u-l.top,r=t.top+t.height/2,h=c?-.5*Math.PI:.5*Math.PI}e.save(),e.translate(a,r),e.rotate(h),e.textAlign="center",e.textBaseline="middle",e.fillStyle=o,e.font=s.string,e.fillText(i.labelString,0,0),e.restore()}},draw:function(t){var e=this;e._isVisible()&&(e._drawGrid(t),e._drawTitle(),e._drawLabels())},_layers:function(){var t=this,e=t.options,n=e.ticks&&e.ticks.z||0,i=e.gridLines&&e.gridLines.z||0;return t._isVisible()&&n!==i&&t.draw===t._draw?[{z:i,draw:function(){t._drawGrid.apply(t,arguments),t._drawTitle.apply(t,arguments)}},{z:n,draw:function(){t._drawLabels.apply(t,arguments)}}]:[{z:n,draw:function(){t.draw.apply(t,arguments)}}]},_getMatchingVisibleMetas:function(t){var e=this,n=e.isHorizontal();return e.chart._getSortedVisibleDatasetMetas().filter(function(i){return(!t||i.type===t)&&(n?i.xAxisID===e.id:i.yAxisID===e.id)})}});bn.prototype._draw=bn.prototype.draw;var yn=bn,xn=B.isNullOrUndef,_n=yn.extend({determineDataLimits:function(){var t,e=this,n=e._getLabels(),i=e.options.ticks,a=i.min,r=i.max,o=0,s=n.length-1;void 0!==a&&(t=n.indexOf(a))>=0&&(o=t),void 0!==r&&(t=n.indexOf(r))>=0&&(s=t),e.minIndex=o,e.maxIndex=s,e.min=n[o],e.max=n[s]},buildTicks:function(){var t=this,e=t._getLabels(),n=t.minIndex,i=t.maxIndex;t.ticks=0===n&&i===e.length-1?e:e.slice(n,i+1)},getLabelForIndex:function(t,e){var n=this,i=n.chart;return i.getDatasetMeta(e).controller._getValueScaleId()===n.id?n.getRightValue(i.data.datasets[e].data[t]):n._getLabels()[t]},_configure:function(){var t=this,e=t.options.offset,n=t.ticks;yn.prototype._configure.call(t),t.isHorizontal()||(t._reversePixels=!t._reversePixels),n&&(t._startValue=t.minIndex-(e?.5:0),t._valueRange=Math.max(n.length-(e?0:1),1))},getPixelForValue:function(t,e,n){var i,a,r,o=this;return xn(e)||xn(n)||(t=o.chart.data.datasets[n].data[e]),xn(t)||(i=o.isHorizontal()?t.x:t.y),(void 0!==i||void 0!==t&&isNaN(e))&&(a=o._getLabels(),t=B.valueOrDefault(i,t),e=-1!==(r=a.indexOf(t))?r:e,isNaN(e)&&(e=t)),o.getPixelForDecimal((e-o._startValue)/o._valueRange)},getPixelForTick:function(t){var e=this.ticks;return t<0||t>e.length-1?null:this.getPixelForValue(e[t],t+this.minIndex)},getValueForPixel:function(t){var e=this,n=Math.round(e._startValue+e.getDecimalForPixel(t)*e._valueRange);return Math.min(Math.max(n,0),e.ticks.length-1)},getBasePixel:function(){return this.bottom}}),wn={position:"bottom"};_n._defaults=wn;var kn=B.noop,Mn=B.isNullOrUndef;var Sn=yn.extend({getRightValue:function(t){return"string"==typeof t?+t:yn.prototype.getRightValue.call(this,t)},handleTickRangeOptions:function(){var t=this,e=t.options.ticks;if(e.beginAtZero){var n=B.sign(t.min),i=B.sign(t.max);n<0&&i<0?t.max=0:n>0&&i>0&&(t.min=0)}var a=void 0!==e.min||void 0!==e.suggestedMin,r=void 0!==e.max||void 0!==e.suggestedMax;void 0!==e.min?t.min=e.min:void 0!==e.suggestedMin&&(null===t.min?t.min=e.suggestedMin:t.min=Math.min(t.min,e.suggestedMin)),void 0!==e.max?t.max=e.max:void 0!==e.suggestedMax&&(null===t.max?t.max=e.suggestedMax:t.max=Math.max(t.max,e.suggestedMax)),a!==r&&t.min>=t.max&&(a?t.max=t.min+1:t.min=t.max-1),t.min===t.max&&(t.max++,e.beginAtZero||t.min--)},getTickLimit:function(){var t,e=this,n=e.options.ticks,i=n.stepSize,a=n.maxTicksLimit;return i?t=Math.ceil(e.max/i)-Math.floor(e.min/i)+1:(t=e._computeTickLimit(),a=a||11),a&&(t=Math.min(a,t)),t},_computeTickLimit:function(){return Number.POSITIVE_INFINITY},handleDirectionalChanges:kn,buildTicks:function(){var t=this,e=t.options.ticks,n=t.getTickLimit(),i={maxTicks:n=Math.max(2,n),min:e.min,max:e.max,precision:e.precision,stepSize:B.valueOrDefault(e.fixedStepSize,e.stepSize)},a=t.ticks=function(t,e){var n,i,a,r,o=[],s=t.stepSize,l=s||1,u=t.maxTicks-1,d=t.min,h=t.max,c=t.precision,f=e.min,g=e.max,m=B.niceNum((g-f)/u/l)*l;if(m<1e-14&&Mn(d)&&Mn(h))return[f,g];(r=Math.ceil(g/m)-Math.floor(f/m))>u&&(m=B.niceNum(r*m/u/l)*l),s||Mn(c)?n=Math.pow(10,B._decimalPlaces(m)):(n=Math.pow(10,c),m=Math.ceil(m*n)/n),i=Math.floor(f/m)*m,a=Math.ceil(g/m)*m,s&&(!Mn(d)&&B.almostWhole(d/m,m/1e3)&&(i=d),!Mn(h)&&B.almostWhole(h/m,m/1e3)&&(a=h)),r=(a-i)/m,r=B.almostEquals(r,Math.round(r),m/1e3)?Math.round(r):Math.ceil(r),i=Math.round(i*n)/n,a=Math.round(a*n)/n,o.push(Mn(d)?i:d);for(var p=1;p<r;++p)o.push(Math.round((i+p*m)*n)/n);return o.push(Mn(h)?a:h),o}(i,t);t.handleDirectionalChanges(),t.max=B.max(a),t.min=B.min(a),e.reverse?(a.reverse(),t.start=t.max,t.end=t.min):(t.start=t.min,t.end=t.max)},convertTicksToLabels:function(){var t=this;t.ticksAsNumbers=t.ticks.slice(),t.zeroLineIndex=t.ticks.indexOf(0),yn.prototype.convertTicksToLabels.call(t)},_configure:function(){var t,e=this,n=e.getTicks(),i=e.min,a=e.max;yn.prototype._configure.call(e),e.options.offset&&n.length&&(i-=t=(a-i)/Math.max(n.length-1,1)/2,a+=t),e._startValue=i,e._endValue=a,e._valueRange=a-i}}),Dn={position:"left",ticks:{callback:rn.formatters.linear}};function Cn(t,e,n,i){var a,r,o=t.options,s=function(t,e,n){var i=[n.type,void 0===e&&void 0===n.stack?n.index:"",n.stack].join(".");return void 0===t[i]&&(t[i]={pos:[],neg:[]}),t[i]}(e,o.stacked,n),l=s.pos,u=s.neg,d=i.length;for(a=0;a<d;++a)r=t._parseValue(i[a]),isNaN(r.min)||isNaN(r.max)||n.data[a].hidden||(l[a]=l[a]||0,u[a]=u[a]||0,o.relativePoints?l[a]=100:r.min<0||r.max<0?u[a]+=r.min:l[a]+=r.max)}function Pn(t,e,n){var i,a,r=n.length;for(i=0;i<r;++i)a=t._parseValue(n[i]),isNaN(a.min)||isNaN(a.max)||e.data[i].hidden||(t.min=Math.min(t.min,a.min),t.max=Math.max(t.max,a.max))}var Tn=Sn.extend({determineDataLimits:function(){var t,e,n,i,a=this,r=a.options,o=a.chart.data.datasets,s=a._getMatchingVisibleMetas(),l=r.stacked,u={},d=s.length;if(a.min=Number.POSITIVE_INFINITY,a.max=Number.NEGATIVE_INFINITY,void 0===l)for(t=0;!l&&t<d;++t)l=void 0!==(e=s[t]).stack;for(t=0;t<d;++t)n=o[(e=s[t]).index].data,l?Cn(a,u,e,n):Pn(a,e,n);B.each(u,function(t){i=t.pos.concat(t.neg),a.min=Math.min(a.min,B.min(i)),a.max=Math.max(a.max,B.max(i))}),a.min=B.isFinite(a.min)&&!isNaN(a.min)?a.min:0,a.max=B.isFinite(a.max)&&!isNaN(a.max)?a.max:1,a.handleTickRangeOptions()},_computeTickLimit:function(){var t,e=this;return e.isHorizontal()?Math.ceil(e.width/40):(t=B.options._parseFont(e.options.ticks),Math.ceil(e.height/t.lineHeight))},handleDirectionalChanges:function(){this.isHorizontal()||this.ticks.reverse()},getLabelForIndex:function(t,e){return this._getScaleLabel(this.chart.data.datasets[e].data[t])},getPixelForValue:function(t){var e=this;return e.getPixelForDecimal((+e.getRightValue(t)-e._startValue)/e._valueRange)},getValueForPixel:function(t){return this._startValue+this.getDecimalForPixel(t)*this._valueRange},getPixelForTick:function(t){var e=this.ticksAsNumbers;return t<0||t>e.length-1?null:this.getPixelForValue(e[t])}}),On=Dn;Tn._defaults=On;var An=B.valueOrDefault,Fn=B.math.log10;var In={position:"left",ticks:{callback:rn.formatters.logarithmic}};function Ln(t,e){return B.isFinite(t)&&t>=0?t:e}var Rn=yn.extend({determineDataLimits:function(){var t,e,n,i,a,r,o=this,s=o.options,l=o.chart,u=l.data.datasets,d=o.isHorizontal();function h(t){return d?t.xAxisID===o.id:t.yAxisID===o.id}o.min=Number.POSITIVE_INFINITY,o.max=Number.NEGATIVE_INFINITY,o.minNotZero=Number.POSITIVE_INFINITY;var c=s.stacked;if(void 0===c)for(t=0;t<u.length;t++)if(e=l.getDatasetMeta(t),l.isDatasetVisible(t)&&h(e)&&void 0!==e.stack){c=!0;break}if(s.stacked||c){var f={};for(t=0;t<u.length;t++){var g=[(e=l.getDatasetMeta(t)).type,void 0===s.stacked&&void 0===e.stack?t:"",e.stack].join(".");if(l.isDatasetVisible(t)&&h(e))for(void 0===f[g]&&(f[g]=[]),a=0,r=(i=u[t].data).length;a<r;a++){var m=f[g];n=o._parseValue(i[a]),isNaN(n.min)||isNaN(n.max)||e.data[a].hidden||n.min<0||n.max<0||(m[a]=m[a]||0,m[a]+=n.max)}}B.each(f,function(t){if(t.length>0){var e=B.min(t),n=B.max(t);o.min=Math.min(o.min,e),o.max=Math.max(o.max,n)}})}else for(t=0;t<u.length;t++)if(e=l.getDatasetMeta(t),l.isDatasetVisible(t)&&h(e))for(a=0,r=(i=u[t].data).length;a<r;a++)n=o._parseValue(i[a]),isNaN(n.min)||isNaN(n.max)||e.data[a].hidden||n.min<0||n.max<0||(o.min=Math.min(n.min,o.min),o.max=Math.max(n.max,o.max),0!==n.min&&(o.minNotZero=Math.min(n.min,o.minNotZero)));o.min=B.isFinite(o.min)?o.min:null,o.max=B.isFinite(o.max)?o.max:null,o.minNotZero=B.isFinite(o.minNotZero)?o.minNotZero:null,this.handleTickRangeOptions()},handleTickRangeOptions:function(){var t=this,e=t.options.ticks;t.min=Ln(e.min,t.min),t.max=Ln(e.max,t.max),t.min===t.max&&(0!==t.min&&null!==t.min?(t.min=Math.pow(10,Math.floor(Fn(t.min))-1),t.max=Math.pow(10,Math.floor(Fn(t.max))+1)):(t.min=1,t.max=10)),null===t.min&&(t.min=Math.pow(10,Math.floor(Fn(t.max))-1)),null===t.max&&(t.max=0!==t.min?Math.pow(10,Math.floor(Fn(t.min))+1):10),null===t.minNotZero&&(t.min>0?t.minNotZero=t.min:t.max<1?t.minNotZero=Math.pow(10,Math.floor(Fn(t.max))):t.minNotZero=1)},buildTicks:function(){var t=this,e=t.options.ticks,n=!t.isHorizontal(),i={min:Ln(e.min),max:Ln(e.max)},a=t.ticks=function(t,e){var n,i,a=[],r=An(t.min,Math.pow(10,Math.floor(Fn(e.min)))),o=Math.floor(Fn(e.max)),s=Math.ceil(e.max/Math.pow(10,o));0===r?(n=Math.floor(Fn(e.minNotZero)),i=Math.floor(e.minNotZero/Math.pow(10,n)),a.push(r),r=i*Math.pow(10,n)):(n=Math.floor(Fn(r)),i=Math.floor(r/Math.pow(10,n)));var l=n<0?Math.pow(10,Math.abs(n)):1;do{a.push(r),10==++i&&(i=1,l=++n>=0?1:l),r=Math.round(i*Math.pow(10,n)*l)/l}while(n<o||n===o&&i<s);var u=An(t.max,r);return a.push(u),a}(i,t);t.max=B.max(a),t.min=B.min(a),e.reverse?(n=!n,t.start=t.max,t.end=t.min):(t.start=t.min,t.end=t.max),n&&a.reverse()},convertTicksToLabels:function(){this.tickValues=this.ticks.slice(),yn.prototype.convertTicksToLabels.call(this)},getLabelForIndex:function(t,e){return this._getScaleLabel(this.chart.data.datasets[e].data[t])},getPixelForTick:function(t){var e=this.tickValues;return t<0||t>e.length-1?null:this.getPixelForValue(e[t])},_getFirstTickValue:function(t){var e=Math.floor(Fn(t));return Math.floor(t/Math.pow(10,e))*Math.pow(10,e)},_configure:function(){var t=this,e=t.min,n=0;yn.prototype._configure.call(t),0===e&&(e=t._getFirstTickValue(t.minNotZero),n=An(t.options.ticks.fontSize,Y.global.defaultFontSize)/t._length),t._startValue=Fn(e),t._valueOffset=n,t._valueRange=(Fn(t.max)-Fn(e))/(1-n)},getPixelForValue:function(t){var e=this,n=0;return(t=+e.getRightValue(t))>e.min&&t>0&&(n=(Fn(t)-e._startValue)/e._valueRange+e._valueOffset),e.getPixelForDecimal(n)},getValueForPixel:function(t){var e=this,n=e.getDecimalForPixel(t);return 0===n&&0===e.min?0:Math.pow(10,e._startValue+(n-e._valueOffset)*e._valueRange)}}),Nn=In;Rn._defaults=Nn;var Wn=B.valueOrDefault,Yn=B.valueAtIndexOrDefault,zn=B.options.resolve,En={display:!0,animate:!0,position:"chartArea",angleLines:{display:!0,color:"rgba(0,0,0,0.1)",lineWidth:1,borderDash:[],borderDashOffset:0},gridLines:{circular:!1},ticks:{showLabelBackdrop:!0,backdropColor:"rgba(255,255,255,0.75)",backdropPaddingY:2,backdropPaddingX:2,callback:rn.formatters.linear},pointLabels:{display:!0,fontSize:10,callback:function(t){return t}}};function Vn(t){var e=t.ticks;return e.display&&t.display?Wn(e.fontSize,Y.global.defaultFontSize)+2*e.backdropPaddingY:0}function Hn(t,e,n,i,a){return t===i||t===a?{start:e-n/2,end:e+n/2}:t<i||t>a?{start:e-n,end:e}:{start:e,end:e+n}}function Bn(t){return 0===t||180===t?"center":t<180?"left":"right"}function jn(t,e,n,i){var a,r,o=n.y+i/2;if(B.isArray(e))for(a=0,r=e.length;a<r;++a)t.fillText(e[a],n.x,o),o+=i;else t.fillText(e,n.x,o)}function Un(t,e,n){90===t||270===t?n.y-=e.h/2:(t>270||t<90)&&(n.y-=e.h)}function Gn(t){return B.isNumber(t)?t:0}var qn=Sn.extend({setDimensions:function(){var t=this;t.width=t.maxWidth,t.height=t.maxHeight,t.paddingTop=Vn(t.options)/2,t.xCenter=Math.floor(t.width/2),t.yCenter=Math.floor((t.height-t.paddingTop)/2),t.drawingArea=Math.min(t.height-t.paddingTop,t.width)/2},determineDataLimits:function(){var t=this,e=t.chart,n=Number.POSITIVE_INFINITY,i=Number.NEGATIVE_INFINITY;B.each(e.data.datasets,function(a,r){if(e.isDatasetVisible(r)){var o=e.getDatasetMeta(r);B.each(a.data,function(e,a){var r=+t.getRightValue(e);isNaN(r)||o.data[a].hidden||(n=Math.min(r,n),i=Math.max(r,i))})}}),t.min=n===Number.POSITIVE_INFINITY?0:n,t.max=i===Number.NEGATIVE_INFINITY?0:i,t.handleTickRangeOptions()},_computeTickLimit:function(){return Math.ceil(this.drawingArea/Vn(this.options))},convertTicksToLabels:function(){var t=this;Sn.prototype.convertTicksToLabels.call(t),t.pointLabels=t.chart.data.labels.map(function(){var e=B.callback(t.options.pointLabels.callback,arguments,t);return e||0===e?e:""})},getLabelForIndex:function(t,e){return+this.getRightValue(this.chart.data.datasets[e].data[t])},fit:function(){var t=this,e=t.options;e.display&&e.pointLabels.display?function(t){var e,n,i,a=B.options._parseFont(t.options.pointLabels),r={l:0,r:t.width,t:0,b:t.height-t.paddingTop},o={};t.ctx.font=a.string,t._pointLabelSizes=[];var s,l,u,d=t.chart.data.labels.length;for(e=0;e<d;e++){i=t.getPointPosition(e,t.drawingArea+5),s=t.ctx,l=a.lineHeight,u=t.pointLabels[e],n=B.isArray(u)?{w:B.longestText(s,s.font,u),h:u.length*l}:{w:s.measureText(u).width,h:l},t._pointLabelSizes[e]=n;var h=t.getIndexAngle(e),c=B.toDegrees(h)%360,f=Hn(c,i.x,n.w,0,180),g=Hn(c,i.y,n.h,90,270);f.start<r.l&&(r.l=f.start,o.l=h),f.end>r.r&&(r.r=f.end,o.r=h),g.start<r.t&&(r.t=g.start,o.t=h),g.end>r.b&&(r.b=g.end,o.b=h)}t.setReductions(t.drawingArea,r,o)}(t):t.setCenterPoint(0,0,0,0)},setReductions:function(t,e,n){var i=this,a=e.l/Math.sin(n.l),r=Math.max(e.r-i.width,0)/Math.sin(n.r),o=-e.t/Math.cos(n.t),s=-Math.max(e.b-(i.height-i.paddingTop),0)/Math.cos(n.b);a=Gn(a),r=Gn(r),o=Gn(o),s=Gn(s),i.drawingArea=Math.min(Math.floor(t-(a+r)/2),Math.floor(t-(o+s)/2)),i.setCenterPoint(a,r,o,s)},setCenterPoint:function(t,e,n,i){var a=this,r=a.width-e-a.drawingArea,o=t+a.drawingArea,s=n+a.drawingArea,l=a.height-a.paddingTop-i-a.drawingArea;a.xCenter=Math.floor((o+r)/2+a.left),a.yCenter=Math.floor((s+l)/2+a.top+a.paddingTop)},getIndexAngle:function(t){var e=this.chart,n=(t*(360/e.data.labels.length)+((e.options||{}).startAngle||0))%360;return(n<0?n+360:n)*Math.PI*2/360},getDistanceFromCenterForValue:function(t){var e=this;if(B.isNullOrUndef(t))return NaN;var n=e.drawingArea/(e.max-e.min);return e.options.ticks.reverse?(e.max-t)*n:(t-e.min)*n},getPointPosition:function(t,e){var n=this,i=n.getIndexAngle(t)-Math.PI/2;return{x:Math.cos(i)*e+n.xCenter,y:Math.sin(i)*e+n.yCenter}},getPointPositionForValue:function(t,e){return this.getPointPosition(t,this.getDistanceFromCenterForValue(e))},getBasePosition:function(t){var e=this,n=e.min,i=e.max;return e.getPointPositionForValue(t||0,e.beginAtZero?0:n<0&&i<0?i:n>0&&i>0?n:0)},_drawGrid:function(){var t,e,n,i=this,a=i.ctx,r=i.options,o=r.gridLines,s=r.angleLines,l=Wn(s.lineWidth,o.lineWidth),u=Wn(s.color,o.color);if(r.pointLabels.display&&function(t){var e=t.ctx,n=t.options,i=n.pointLabels,a=Vn(n),r=t.getDistanceFromCenterForValue(n.ticks.reverse?t.min:t.max),o=B.options._parseFont(i);e.save(),e.font=o.string,e.textBaseline="middle";for(var s=t.chart.data.labels.length-1;s>=0;s--){var l=0===s?a/2:0,u=t.getPointPosition(s,r+l+5),d=Yn(i.fontColor,s,Y.global.defaultFontColor);e.fillStyle=d;var h=t.getIndexAngle(s),c=B.toDegrees(h);e.textAlign=Bn(c),Un(c,t._pointLabelSizes[s],u),jn(e,t.pointLabels[s],u,o.lineHeight)}e.restore()}(i),o.display&&B.each(i.ticks,function(t,n){0!==n&&(e=i.getDistanceFromCenterForValue(i.ticksAsNumbers[n]),function(t,e,n,i){var a,r=t.ctx,o=e.circular,s=t.chart.data.labels.length,l=Yn(e.color,i-1),u=Yn(e.lineWidth,i-1);if((o||s)&&l&&u){if(r.save(),r.strokeStyle=l,r.lineWidth=u,r.setLineDash&&(r.setLineDash(e.borderDash||[]),r.lineDashOffset=e.borderDashOffset||0),r.beginPath(),o)r.arc(t.xCenter,t.yCenter,n,0,2*Math.PI);else{a=t.getPointPosition(0,n),r.moveTo(a.x,a.y);for(var d=1;d<s;d++)a=t.getPointPosition(d,n),r.lineTo(a.x,a.y)}r.closePath(),r.stroke(),r.restore()}}(i,o,e,n))}),s.display&&l&&u){for(a.save(),a.lineWidth=l,a.strokeStyle=u,a.setLineDash&&(a.setLineDash(zn([s.borderDash,o.borderDash,[]])),a.lineDashOffset=zn([s.borderDashOffset,o.borderDashOffset,0])),t=i.chart.data.labels.length-1;t>=0;t--)e=i.getDistanceFromCenterForValue(r.ticks.reverse?i.min:i.max),n=i.getPointPosition(t,e),a.beginPath(),a.moveTo(i.xCenter,i.yCenter),a.lineTo(n.x,n.y),a.stroke();a.restore()}},_drawLabels:function(){var t=this,e=t.ctx,n=t.options.ticks;if(n.display){var i,a,r=t.getIndexAngle(0),o=B.options._parseFont(n),s=Wn(n.fontColor,Y.global.defaultFontColor);e.save(),e.font=o.string,e.translate(t.xCenter,t.yCenter),e.rotate(r),e.textAlign="center",e.textBaseline="middle",B.each(t.ticks,function(r,l){(0!==l||n.reverse)&&(i=t.getDistanceFromCenterForValue(t.ticksAsNumbers[l]),n.showLabelBackdrop&&(a=e.measureText(r).width,e.fillStyle=n.backdropColor,e.fillRect(-a/2-n.backdropPaddingX,-i-o.size/2-n.backdropPaddingY,a+2*n.backdropPaddingX,o.size+2*n.backdropPaddingY)),e.fillStyle=s,e.fillText(r,0,-i))}),e.restore()}},_drawTitle:B.noop}),Zn=En;qn._defaults=Zn;var $n=B._deprecated,Xn=B.options.resolve,Kn=B.valueOrDefault,Jn=Number.MIN_SAFE_INTEGER||-9007199254740991,Qn=Number.MAX_SAFE_INTEGER||9007199254740991,ti={millisecond:{common:!0,size:1,steps:1e3},second:{common:!0,size:1e3,steps:60},minute:{common:!0,size:6e4,steps:60},hour:{common:!0,size:36e5,steps:24},day:{common:!0,size:864e5,steps:30},week:{common:!1,size:6048e5,steps:4},month:{common:!0,size:2628e6,steps:12},quarter:{common:!1,size:7884e6,steps:4},year:{common:!0,size:3154e7}},ei=Object.keys(ti);function ni(t,e){return t-e}function ii(t){return B.valueOrDefault(t.time.min,t.ticks.min)}function ai(t){return B.valueOrDefault(t.time.max,t.ticks.max)}function ri(t,e,n,i){var a=function(t,e,n){for(var i,a,r,o=0,s=t.length-1;o>=0&&o<=s;){if(a=t[(i=o+s>>1)-1]||null,r=t[i],!a)return{lo:null,hi:r};if(r[e]<n)o=i+1;else{if(!(a[e]>n))return{lo:a,hi:r};s=i-1}}return{lo:r,hi:null}}(t,e,n),r=a.lo?a.hi?a.lo:t[t.length-2]:t[0],o=a.lo?a.hi?a.hi:t[t.length-1]:t[1],s=o[e]-r[e],l=s?(n-r[e])/s:0,u=(o[i]-r[i])*l;return r[i]+u}function oi(t,e){var n=t._adapter,i=t.options.time,a=i.parser,r=a||i.format,o=e;return"function"==typeof a&&(o=a(o)),B.isFinite(o)||(o="string"==typeof r?n.parse(o,r):n.parse(o)),null!==o?+o:(a||"function"!=typeof r||(o=r(e),B.isFinite(o)||(o=n.parse(o))),o)}function si(t,e){if(B.isNullOrUndef(e))return null;var n=t.options.time,i=oi(t,t.getRightValue(e));return null===i||n.round&&(i=+t._adapter.startOf(i,n.round)),i}function li(t,e,n,i){var a,r,o,s=ei.length;for(a=ei.indexOf(t);a<s-1;++a)if(o=(r=ti[ei[a]]).steps?r.steps:Qn,r.common&&Math.ceil((n-e)/(o*r.size))<=i)return ei[a];return ei[s-1]}function ui(t,e,n){var i,a,r=[],o={},s=e.length;for(i=0;i<s;++i)o[a=e[i]]=i,r.push({value:a,major:!1});return 0!==s&&n?function(t,e,n,i){var a,r,o=t._adapter,s=+o.startOf(e[0].value,i),l=e[e.length-1].value;for(a=s;a<=l;a=+o.add(a,1,i))(r=n[a])>=0&&(e[r].major=!0);return e}(t,r,o,n):r}var di=yn.extend({initialize:function(){this.mergeTicksOptions(),yn.prototype.initialize.call(this)},update:function(){var t=this,e=t.options,n=e.time||(e.time={}),i=t._adapter=new an._date(e.adapters.date);return $n("time scale",n.format,"time.format","time.parser"),$n("time scale",n.min,"time.min","ticks.min"),$n("time scale",n.max,"time.max","ticks.max"),B.mergeIf(n.displayFormats,i.formats()),yn.prototype.update.apply(t,arguments)},getRightValue:function(t){return t&&void 0!==t.t&&(t=t.t),yn.prototype.getRightValue.call(this,t)},determineDataLimits:function(){var t,e,n,i,a,r,o,s=this,l=s.chart,u=s._adapter,d=s.options,h=d.time.unit||"day",c=Qn,f=Jn,g=[],m=[],p=[],v=s._getLabels();for(t=0,n=v.length;t<n;++t)p.push(si(s,v[t]));for(t=0,n=(l.data.datasets||[]).length;t<n;++t)if(l.isDatasetVisible(t))if(a=l.data.datasets[t].data,B.isObject(a[0]))for(m[t]=[],e=0,i=a.length;e<i;++e)r=si(s,a[e]),g.push(r),m[t][e]=r;else m[t]=p.slice(0),o||(g=g.concat(p),o=!0);else m[t]=[];p.length&&(c=Math.min(c,p[0]),f=Math.max(f,p[p.length-1])),g.length&&(g=n>1?function(t){var e,n,i,a={},r=[];for(e=0,n=t.length;e<n;++e)a[i=t[e]]||(a[i]=!0,r.push(i));return r}(g).sort(ni):g.sort(ni),c=Math.min(c,g[0]),f=Math.max(f,g[g.length-1])),c=si(s,ii(d))||c,f=si(s,ai(d))||f,c=c===Qn?+u.startOf(Date.now(),h):c,f=f===Jn?+u.endOf(Date.now(),h)+1:f,s.min=Math.min(c,f),s.max=Math.max(c+1,f),s._table=[],s._timestamps={data:g,datasets:m,labels:p}},buildTicks:function(){var t,e,n,i=this,a=i.min,r=i.max,o=i.options,s=o.ticks,l=o.time,u=i._timestamps,d=[],h=i.getLabelCapacity(a),c=s.source,f=o.distribution;for(u="data"===c||"auto"===c&&"series"===f?u.data:"labels"===c?u.labels:function(t,e,n,i){var a,r=t._adapter,o=t.options,s=o.time,l=s.unit||li(s.minUnit,e,n,i),u=Xn([s.stepSize,s.unitStepSize,1]),d="week"===l&&s.isoWeekday,h=e,c=[];if(d&&(h=+r.startOf(h,"isoWeek",d)),h=+r.startOf(h,d?"day":l),r.diff(n,e,l)>1e5*u)throw e+" and "+n+" are too far apart with stepSize of "+u+" "+l;for(a=h;a<n;a=+r.add(a,u,l))c.push(a);return a!==n&&"ticks"!==o.bounds||c.push(a),c}(i,a,r,h),"ticks"===o.bounds&&u.length&&(a=u[0],r=u[u.length-1]),a=si(i,ii(o))||a,r=si(i,ai(o))||r,t=0,e=u.length;t<e;++t)(n=u[t])>=a&&n<=r&&d.push(n);return i.min=a,i.max=r,i._unit=l.unit||(s.autoSkip?li(l.minUnit,i.min,i.max,h):function(t,e,n,i,a){var r,o;for(r=ei.length-1;r>=ei.indexOf(n);r--)if(o=ei[r],ti[o].common&&t._adapter.diff(a,i,o)>=e-1)return o;return ei[n?ei.indexOf(n):0]}(i,d.length,l.minUnit,i.min,i.max)),i._majorUnit=s.major.enabled&&"year"!==i._unit?function(t){for(var e=ei.indexOf(t)+1,n=ei.length;e<n;++e)if(ti[ei[e]].common)return ei[e]}(i._unit):void 0,i._table=function(t,e,n,i){if("linear"===i||!t.length)return[{time:e,pos:0},{time:n,pos:1}];var a,r,o,s,l,u=[],d=[e];for(a=0,r=t.length;a<r;++a)(s=t[a])>e&&s<n&&d.push(s);for(d.push(n),a=0,r=d.length;a<r;++a)l=d[a+1],o=d[a-1],s=d[a],void 0!==o&&void 0!==l&&Math.round((l+o)/2)===s||u.push({time:s,pos:a/(r-1)});return u}(i._timestamps.data,a,r,f),i._offsets=function(t,e,n,i,a){var r,o,s=0,l=0;return a.offset&&e.length&&(r=ri(t,"time",e[0],"pos"),s=1===e.length?1-r:(ri(t,"time",e[1],"pos")-r)/2,o=ri(t,"time",e[e.length-1],"pos"),l=1===e.length?o:(o-ri(t,"time",e[e.length-2],"pos"))/2),{start:s,end:l,factor:1/(s+1+l)}}(i._table,d,0,0,o),s.reverse&&d.reverse(),ui(i,d,i._majorUnit)},getLabelForIndex:function(t,e){var n=this,i=n._adapter,a=n.chart.data,r=n.options.time,o=a.labels&&t<a.labels.length?a.labels[t]:"",s=a.datasets[e].data[t];return B.isObject(s)&&(o=n.getRightValue(s)),r.tooltipFormat?i.format(oi(n,o),r.tooltipFormat):"string"==typeof o?o:i.format(oi(n,o),r.displayFormats.datetime)},tickFormatFunction:function(t,e,n,i){var a=this,r=a._adapter,o=a.options,s=o.time.displayFormats,l=s[a._unit],u=a._majorUnit,d=s[u],h=n[e],c=o.ticks,f=u&&d&&h&&h.major,g=r.format(t,i||(f?d:l)),m=f?c.major:c.minor,p=Xn([m.callback,m.userCallback,c.callback,c.userCallback]);return p?p(g,e,n):g},convertTicksToLabels:function(t){var e,n,i=[];for(e=0,n=t.length;e<n;++e)i.push(this.tickFormatFunction(t[e].value,e,t));return i},getPixelForOffset:function(t){var e=this,n=e._offsets,i=ri(e._table,"time",t,"pos");return e.getPixelForDecimal((n.start+i)*n.factor)},getPixelForValue:function(t,e,n){var i=this,a=null;if(void 0!==e&&void 0!==n&&(a=i._timestamps.datasets[n][e]),null===a&&(a=si(i,t)),null!==a)return i.getPixelForOffset(a)},getPixelForTick:function(t){var e=this.getTicks();return t>=0&&t<e.length?this.getPixelForOffset(e[t].value):null},getValueForPixel:function(t){var e=this,n=e._offsets,i=e.getDecimalForPixel(t)/n.factor-n.end,a=ri(e._table,"pos",i,"time");return e._adapter._create(a)},_getLabelSize:function(t){var e=this,n=e.options.ticks,i=e.ctx.measureText(t).width,a=B.toRadians(e.isHorizontal()?n.maxRotation:n.minRotation),r=Math.cos(a),o=Math.sin(a),s=Kn(n.fontSize,Y.global.defaultFontSize);return{w:i*r+s*o,h:i*o+s*r}},getLabelWidth:function(t){return this._getLabelSize(t).w},getLabelCapacity:function(t){var e=this,n=e.options.time,i=n.displayFormats,a=i[n.unit]||i.millisecond,r=e.tickFormatFunction(t,0,ui(e,[t],e._majorUnit),a),o=e._getLabelSize(r),s=Math.floor(e.isHorizontal()?e.width/o.w:e.height/o.h);return e.options.offset&&s--,s>0?s:1}}),hi={position:"bottom",distribution:"linear",bounds:"data",adapters:{},time:{parser:!1,unit:!1,round:!1,displayFormat:!1,isoWeekday:!1,minUnit:"millisecond",displayFormats:{}},ticks:{autoSkip:!1,source:"auto",major:{enabled:!1}}};di._defaults=hi;var ci={category:_n,linear:Tn,logarithmic:Rn,radialLinear:qn,time:di},fi=e(function(e,n){e.exports=function(){var n,i;function a(){return n.apply(null,arguments)}function r(t){n=t}function o(t){return t instanceof Array||"[object Array]"===Object.prototype.toString.call(t)}function s(t){return null!=t&&"[object Object]"===Object.prototype.toString.call(t)}function l(t){if(Object.getOwnPropertyNames)return 0===Object.getOwnPropertyNames(t).length;var e;for(e in t)if(t.hasOwnProperty(e))return!1;return!0}function u(t){return void 0===t}function d(t){return"number"==typeof t||"[object Number]"===Object.prototype.toString.call(t)}function h(t){return t instanceof Date||"[object Date]"===Object.prototype.toString.call(t)}function c(t,e){var n,i=[];for(n=0;n<t.length;++n)i.push(e(t[n],n));return i}function f(t,e){return Object.prototype.hasOwnProperty.call(t,e)}function g(t,e){for(var n in e)f(e,n)&&(t[n]=e[n]);return f(e,"toString")&&(t.toString=e.toString),f(e,"valueOf")&&(t.valueOf=e.valueOf),t}function m(t,e,n,i){return Zn(t,e,n,i,!0).utc()}function p(){return{empty:!1,unusedTokens:[],unusedInput:[],overflow:-2,charsLeftOver:0,nullInput:!1,invalidMonth:null,invalidFormat:!1,userInvalidated:!1,iso:!1,parsedDateParts:[],meridiem:null,rfc2822:!1,weekdayMismatch:!1}}function v(t){return null==t._pf&&(t._pf=p()),t._pf}function b(t){if(null==t._isValid){var e=v(t),n=i.call(e.parsedDateParts,function(t){return null!=t}),a=!isNaN(t._d.getTime())&&e.overflow<0&&!e.empty&&!e.invalidMonth&&!e.invalidWeekday&&!e.weekdayMismatch&&!e.nullInput&&!e.invalidFormat&&!e.userInvalidated&&(!e.meridiem||e.meridiem&&n);if(t._strict&&(a=a&&0===e.charsLeftOver&&0===e.unusedTokens.length&&void 0===e.bigHour),null!=Object.isFrozen&&Object.isFrozen(t))return a;t._isValid=a}return t._isValid}function y(t){var e=m(NaN);return null!=t?g(v(e),t):v(e).userInvalidated=!0,e}i=Array.prototype.some?Array.prototype.some:function(t){for(var e=Object(this),n=e.length>>>0,i=0;i<n;i++)if(i in e&&t.call(this,e[i],i,e))return!0;return!1};var x=a.momentProperties=[];function _(t,e){var n,i,a;if(u(e._isAMomentObject)||(t._isAMomentObject=e._isAMomentObject),u(e._i)||(t._i=e._i),u(e._f)||(t._f=e._f),u(e._l)||(t._l=e._l),u(e._strict)||(t._strict=e._strict),u(e._tzm)||(t._tzm=e._tzm),u(e._isUTC)||(t._isUTC=e._isUTC),u(e._offset)||(t._offset=e._offset),u(e._pf)||(t._pf=v(e)),u(e._locale)||(t._locale=e._locale),x.length>0)for(n=0;n<x.length;n++)u(a=e[i=x[n]])||(t[i]=a);return t}var w=!1;function k(t){_(this,t),this._d=new Date(null!=t._d?t._d.getTime():NaN),this.isValid()||(this._d=new Date(NaN)),!1===w&&(w=!0,a.updateOffset(this),w=!1)}function M(t){return t instanceof k||null!=t&&null!=t._isAMomentObject}function S(t){return t<0?Math.ceil(t)||0:Math.floor(t)}function D(t){var e=+t,n=0;return 0!==e&&isFinite(e)&&(n=S(e)),n}function C(t,e,n){var i,a=Math.min(t.length,e.length),r=Math.abs(t.length-e.length),o=0;for(i=0;i<a;i++)(n&&t[i]!==e[i]||!n&&D(t[i])!==D(e[i]))&&o++;return o+r}function P(t){!1===a.suppressDeprecationWarnings&&"undefined"!=typeof console&&console.warn&&console.warn("Deprecation warning: "+t)}function T(t,e){var n=!0;return g(function(){if(null!=a.deprecationHandler&&a.deprecationHandler(null,t),n){for(var i,r=[],o=0;o<arguments.length;o++){if(i="","object"==typeof arguments[o]){for(var s in i+="\n["+o+"] ",arguments[0])i+=s+": "+arguments[0][s]+", ";i=i.slice(0,-2)}else i=arguments[o];r.push(i)}P(t+"\nArguments: "+Array.prototype.slice.call(r).join("")+"\n"+(new Error).stack),n=!1}return e.apply(this,arguments)},e)}var O,A={};function F(t,e){null!=a.deprecationHandler&&a.deprecationHandler(t,e),A[t]||(P(e),A[t]=!0)}function I(t){return t instanceof Function||"[object Function]"===Object.prototype.toString.call(t)}function L(t){var e,n;for(n in t)I(e=t[n])?this[n]=e:this["_"+n]=e;this._config=t,this._dayOfMonthOrdinalParseLenient=new RegExp((this._dayOfMonthOrdinalParse.source||this._ordinalParse.source)+"|"+/\d{1,2}/.source)}function R(t,e){var n,i=g({},t);for(n in e)f(e,n)&&(s(t[n])&&s(e[n])?(i[n]={},g(i[n],t[n]),g(i[n],e[n])):null!=e[n]?i[n]=e[n]:delete i[n]);for(n in t)f(t,n)&&!f(e,n)&&s(t[n])&&(i[n]=g({},i[n]));return i}function N(t){null!=t&&this.set(t)}a.suppressDeprecationWarnings=!1,a.deprecationHandler=null,O=Object.keys?Object.keys:function(t){var e,n=[];for(e in t)f(t,e)&&n.push(e);return n};var W={sameDay:"[Today at] LT",nextDay:"[Tomorrow at] LT",nextWeek:"dddd [at] LT",lastDay:"[Yesterday at] LT",lastWeek:"[Last] dddd [at] LT",sameElse:"L"};function Y(t,e,n){var i=this._calendar[t]||this._calendar.sameElse;return I(i)?i.call(e,n):i}var z={LTS:"h:mm:ss A",LT:"h:mm A",L:"MM/DD/YYYY",LL:"MMMM D, YYYY",LLL:"MMMM D, YYYY h:mm A",LLLL:"dddd, MMMM D, YYYY h:mm A"};function E(t){var e=this._longDateFormat[t],n=this._longDateFormat[t.toUpperCase()];return e||!n?e:(this._longDateFormat[t]=n.replace(/MMMM|MM|DD|dddd/g,function(t){return t.slice(1)}),this._longDateFormat[t])}var V="Invalid date";function H(){return this._invalidDate}var B="%d",j=/\d{1,2}/;function U(t){return this._ordinal.replace("%d",t)}var G={future:"in %s",past:"%s ago",s:"a few seconds",ss:"%d seconds",m:"a minute",mm:"%d minutes",h:"an hour",hh:"%d hours",d:"a day",dd:"%d days",M:"a month",MM:"%d months",y:"a year",yy:"%d years"};function q(t,e,n,i){var a=this._relativeTime[n];return I(a)?a(t,e,n,i):a.replace(/%d/i,t)}function Z(t,e){var n=this._relativeTime[t>0?"future":"past"];return I(n)?n(e):n.replace(/%s/i,e)}var $={};function X(t,e){var n=t.toLowerCase();$[n]=$[n+"s"]=$[e]=t}function K(t){return"string"==typeof t?$[t]||$[t.toLowerCase()]:void 0}function J(t){var e,n,i={};for(n in t)f(t,n)&&(e=K(n))&&(i[e]=t[n]);return i}var Q={};function tt(t,e){Q[t]=e}function et(t){var e=[];for(var n in t)e.push({unit:n,priority:Q[n]});return e.sort(function(t,e){return t.priority-e.priority}),e}function nt(t,e,n){var i=""+Math.abs(t),a=e-i.length;return(t>=0?n?"+":"":"-")+Math.pow(10,Math.max(0,a)).toString().substr(1)+i}var it=/(\[[^\[]*\])|(\\)?([Hh]mm(ss)?|Mo|MM?M?M?|Do|DDDo|DD?D?D?|ddd?d?|do?|w[o|w]?|W[o|W]?|Qo?|YYYYYY|YYYYY|YYYY|YY|gg(ggg?)?|GG(GGG?)?|e|E|a|A|hh?|HH?|kk?|mm?|ss?|S{1,9}|x|X|zz?|ZZ?|.)/g,at=/(\[[^\[]*\])|(\\)?(LTS|LT|LL?L?L?|l{1,4})/g,rt={},ot={};function st(t,e,n,i){var a=i;"string"==typeof i&&(a=function(){return this[i]()}),t&&(ot[t]=a),e&&(ot[e[0]]=function(){return nt(a.apply(this,arguments),e[1],e[2])}),n&&(ot[n]=function(){return this.localeData().ordinal(a.apply(this,arguments),t)})}function lt(t){return t.match(/\[[\s\S]/)?t.replace(/^\[|\]$/g,""):t.replace(/\\/g,"")}function ut(t){var e,n,i=t.match(it);for(e=0,n=i.length;e<n;e++)ot[i[e]]?i[e]=ot[i[e]]:i[e]=lt(i[e]);return function(e){var a,r="";for(a=0;a<n;a++)r+=I(i[a])?i[a].call(e,t):i[a];return r}}function dt(t,e){return t.isValid()?(e=ht(e,t.localeData()),rt[e]=rt[e]||ut(e),rt[e](t)):t.localeData().invalidDate()}function ht(t,e){var n=5;function i(t){return e.longDateFormat(t)||t}for(at.lastIndex=0;n>=0&&at.test(t);)t=t.replace(at,i),at.lastIndex=0,n-=1;return t}var ct=/\d/,ft=/\d\d/,gt=/\d{3}/,mt=/\d{4}/,pt=/[+-]?\d{6}/,vt=/\d\d?/,bt=/\d\d\d\d?/,yt=/\d\d\d\d\d\d?/,xt=/\d{1,3}/,_t=/\d{1,4}/,wt=/[+-]?\d{1,6}/,kt=/\d+/,Mt=/[+-]?\d+/,St=/Z|[+-]\d\d:?\d\d/gi,Dt=/Z|[+-]\d\d(?::?\d\d)?/gi,Ct=/[+-]?\d+(\.\d{1,3})?/,Pt=/[0-9]{0,256}['a-z\u00A0-\u05FF\u0700-\uD7FF\uF900-\uFDCF\uFDF0-\uFF07\uFF10-\uFFEF]{1,256}|[\u0600-\u06FF\/]{1,256}(\s*?[\u0600-\u06FF]{1,256}){1,2}/i,Tt={};function Ot(t,e,n){Tt[t]=I(e)?e:function(t,i){return t&&n?n:e}}function At(t,e){return f(Tt,t)?Tt[t](e._strict,e._locale):new RegExp(Ft(t))}function Ft(t){return It(t.replace("\\","").replace(/\\(\[)|\\(\])|\[([^\]\[]*)\]|\\(.)/g,function(t,e,n,i,a){return e||n||i||a}))}function It(t){return t.replace(/[-\/\\^$*+?.()|[\]{}]/g,"\\$&")}var Lt={};function Rt(t,e){var n,i=e;for("string"==typeof t&&(t=[t]),d(e)&&(i=function(t,n){n[e]=D(t)}),n=0;n<t.length;n++)Lt[t[n]]=i}function Nt(t,e){Rt(t,function(t,n,i,a){i._w=i._w||{},e(t,i._w,i,a)})}function Wt(t,e,n){null!=e&&f(Lt,t)&&Lt[t](e,n._a,n,t)}var Yt=0,zt=1,Et=2,Vt=3,Ht=4,Bt=5,jt=6,Ut=7,Gt=8;function qt(t){return Zt(t)?366:365}function Zt(t){return t%4==0&&t%100!=0||t%400==0}st("Y",0,0,function(){var t=this.year();return t<=9999?""+t:"+"+t}),st(0,["YY",2],0,function(){return this.year()%100}),st(0,["YYYY",4],0,"year"),st(0,["YYYYY",5],0,"year"),st(0,["YYYYYY",6,!0],0,"year"),X("year","y"),tt("year",1),Ot("Y",Mt),Ot("YY",vt,ft),Ot("YYYY",_t,mt),Ot("YYYYY",wt,pt),Ot("YYYYYY",wt,pt),Rt(["YYYYY","YYYYYY"],Yt),Rt("YYYY",function(t,e){e[Yt]=2===t.length?a.parseTwoDigitYear(t):D(t)}),Rt("YY",function(t,e){e[Yt]=a.parseTwoDigitYear(t)}),Rt("Y",function(t,e){e[Yt]=parseInt(t,10)}),a.parseTwoDigitYear=function(t){return D(t)+(D(t)>68?1900:2e3)};var $t,Xt=Jt("FullYear",!0);function Kt(){return Zt(this.year())}function Jt(t,e){return function(n){return null!=n?(te(this,t,n),a.updateOffset(this,e),this):Qt(this,t)}}function Qt(t,e){return t.isValid()?t._d["get"+(t._isUTC?"UTC":"")+e]():NaN}function te(t,e,n){t.isValid()&&!isNaN(n)&&("FullYear"===e&&Zt(t.year())&&1===t.month()&&29===t.date()?t._d["set"+(t._isUTC?"UTC":"")+e](n,t.month(),ae(n,t.month())):t._d["set"+(t._isUTC?"UTC":"")+e](n))}function ee(t){return I(this[t=K(t)])?this[t]():this}function ne(t,e){if("object"==typeof t)for(var n=et(t=J(t)),i=0;i<n.length;i++)this[n[i].unit](t[n[i].unit]);else if(I(this[t=K(t)]))return this[t](e);return this}function ie(t,e){return(t%e+e)%e}function ae(t,e){if(isNaN(t)||isNaN(e))return NaN;var n=ie(e,12);return t+=(e-n)/12,1===n?Zt(t)?29:28:31-n%7%2}$t=Array.prototype.indexOf?Array.prototype.indexOf:function(t){var e;for(e=0;e<this.length;++e)if(this[e]===t)return e;return-1},st("M",["MM",2],"Mo",function(){return this.month()+1}),st("MMM",0,0,function(t){return this.localeData().monthsShort(this,t)}),st("MMMM",0,0,function(t){return this.localeData().months(this,t)}),X("month","M"),tt("month",8),Ot("M",vt),Ot("MM",vt,ft),Ot("MMM",function(t,e){return e.monthsShortRegex(t)}),Ot("MMMM",function(t,e){return e.monthsRegex(t)}),Rt(["M","MM"],function(t,e){e[zt]=D(t)-1}),Rt(["MMM","MMMM"],function(t,e,n,i){var a=n._locale.monthsParse(t,i,n._strict);null!=a?e[zt]=a:v(n).invalidMonth=t});var re=/D[oD]?(\[[^\[\]]*\]|\s)+MMMM?/,oe="January_February_March_April_May_June_July_August_September_October_November_December".split("_");function se(t,e){return t?o(this._months)?this._months[t.month()]:this._months[(this._months.isFormat||re).test(e)?"format":"standalone"][t.month()]:o(this._months)?this._months:this._months.standalone}var le="Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec".split("_");function ue(t,e){return t?o(this._monthsShort)?this._monthsShort[t.month()]:this._monthsShort[re.test(e)?"format":"standalone"][t.month()]:o(this._monthsShort)?this._monthsShort:this._monthsShort.standalone}function de(t,e,n){var i,a,r,o=t.toLocaleLowerCase();if(!this._monthsParse)for(this._monthsParse=[],this._longMonthsParse=[],this._shortMonthsParse=[],i=0;i<12;++i)r=m([2e3,i]),this._shortMonthsParse[i]=this.monthsShort(r,"").toLocaleLowerCase(),this._longMonthsParse[i]=this.months(r,"").toLocaleLowerCase();return n?"MMM"===e?-1!==(a=$t.call(this._shortMonthsParse,o))?a:null:-1!==(a=$t.call(this._longMonthsParse,o))?a:null:"MMM"===e?-1!==(a=$t.call(this._shortMonthsParse,o))||-1!==(a=$t.call(this._longMonthsParse,o))?a:null:-1!==(a=$t.call(this._longMonthsParse,o))||-1!==(a=$t.call(this._shortMonthsParse,o))?a:null}function he(t,e,n){var i,a,r;if(this._monthsParseExact)return de.call(this,t,e,n);for(this._monthsParse||(this._monthsParse=[],this._longMonthsParse=[],this._shortMonthsParse=[]),i=0;i<12;i++){if(a=m([2e3,i]),n&&!this._longMonthsParse[i]&&(this._longMonthsParse[i]=new RegExp("^"+this.months(a,"").replace(".","")+"$","i"),this._shortMonthsParse[i]=new RegExp("^"+this.monthsShort(a,"").replace(".","")+"$","i")),n||this._monthsParse[i]||(r="^"+this.months(a,"")+"|^"+this.monthsShort(a,""),this._monthsParse[i]=new RegExp(r.replace(".",""),"i")),n&&"MMMM"===e&&this._longMonthsParse[i].test(t))return i;if(n&&"MMM"===e&&this._shortMonthsParse[i].test(t))return i;if(!n&&this._monthsParse[i].test(t))return i}}function ce(t,e){var n;if(!t.isValid())return t;if("string"==typeof e)if(/^\d+$/.test(e))e=D(e);else if(!d(e=t.localeData().monthsParse(e)))return t;return n=Math.min(t.date(),ae(t.year(),e)),t._d["set"+(t._isUTC?"UTC":"")+"Month"](e,n),t}function fe(t){return null!=t?(ce(this,t),a.updateOffset(this,!0),this):Qt(this,"Month")}function ge(){return ae(this.year(),this.month())}var me=Pt;function pe(t){return this._monthsParseExact?(f(this,"_monthsRegex")||ye.call(this),t?this._monthsShortStrictRegex:this._monthsShortRegex):(f(this,"_monthsShortRegex")||(this._monthsShortRegex=me),this._monthsShortStrictRegex&&t?this._monthsShortStrictRegex:this._monthsShortRegex)}var ve=Pt;function be(t){return this._monthsParseExact?(f(this,"_monthsRegex")||ye.call(this),t?this._monthsStrictRegex:this._monthsRegex):(f(this,"_monthsRegex")||(this._monthsRegex=ve),this._monthsStrictRegex&&t?this._monthsStrictRegex:this._monthsRegex)}function ye(){function t(t,e){return e.length-t.length}var e,n,i=[],a=[],r=[];for(e=0;e<12;e++)n=m([2e3,e]),i.push(this.monthsShort(n,"")),a.push(this.months(n,"")),r.push(this.months(n,"")),r.push(this.monthsShort(n,""));for(i.sort(t),a.sort(t),r.sort(t),e=0;e<12;e++)i[e]=It(i[e]),a[e]=It(a[e]);for(e=0;e<24;e++)r[e]=It(r[e]);this._monthsRegex=new RegExp("^("+r.join("|")+")","i"),this._monthsShortRegex=this._monthsRegex,this._monthsStrictRegex=new RegExp("^("+a.join("|")+")","i"),this._monthsShortStrictRegex=new RegExp("^("+i.join("|")+")","i")}function xe(t,e,n,i,a,r,o){var s;return t<100&&t>=0?(s=new Date(t+400,e,n,i,a,r,o),isFinite(s.getFullYear())&&s.setFullYear(t)):s=new Date(t,e,n,i,a,r,o),s}function _e(t){var e;if(t<100&&t>=0){var n=Array.prototype.slice.call(arguments);n[0]=t+400,e=new Date(Date.UTC.apply(null,n)),isFinite(e.getUTCFullYear())&&e.setUTCFullYear(t)}else e=new Date(Date.UTC.apply(null,arguments));return e}function we(t,e,n){var i=7+e-n;return-(7+_e(t,0,i).getUTCDay()-e)%7+i-1}function ke(t,e,n,i,a){var r,o,s=1+7*(e-1)+(7+n-i)%7+we(t,i,a);return s<=0?o=qt(r=t-1)+s:s>qt(t)?(r=t+1,o=s-qt(t)):(r=t,o=s),{year:r,dayOfYear:o}}function Me(t,e,n){var i,a,r=we(t.year(),e,n),o=Math.floor((t.dayOfYear()-r-1)/7)+1;return o<1?i=o+Se(a=t.year()-1,e,n):o>Se(t.year(),e,n)?(i=o-Se(t.year(),e,n),a=t.year()+1):(a=t.year(),i=o),{week:i,year:a}}function Se(t,e,n){var i=we(t,e,n),a=we(t+1,e,n);return(qt(t)-i+a)/7}function De(t){return Me(t,this._week.dow,this._week.doy).week}st("w",["ww",2],"wo","week"),st("W",["WW",2],"Wo","isoWeek"),X("week","w"),X("isoWeek","W"),tt("week",5),tt("isoWeek",5),Ot("w",vt),Ot("ww",vt,ft),Ot("W",vt),Ot("WW",vt,ft),Nt(["w","ww","W","WW"],function(t,e,n,i){e[i.substr(0,1)]=D(t)});var Ce={dow:0,doy:6};function Pe(){return this._week.dow}function Te(){return this._week.doy}function Oe(t){var e=this.localeData().week(this);return null==t?e:this.add(7*(t-e),"d")}function Ae(t){var e=Me(this,1,4).week;return null==t?e:this.add(7*(t-e),"d")}function Fe(t,e){return"string"!=typeof t?t:isNaN(t)?"number"==typeof(t=e.weekdaysParse(t))?t:null:parseInt(t,10)}function Ie(t,e){return"string"==typeof t?e.weekdaysParse(t)%7||7:isNaN(t)?null:t}function Le(t,e){return t.slice(e,7).concat(t.slice(0,e))}st("d",0,"do","day"),st("dd",0,0,function(t){return this.localeData().weekdaysMin(this,t)}),st("ddd",0,0,function(t){return this.localeData().weekdaysShort(this,t)}),st("dddd",0,0,function(t){return this.localeData().weekdays(this,t)}),st("e",0,0,"weekday"),st("E",0,0,"isoWeekday"),X("day","d"),X("weekday","e"),X("isoWeekday","E"),tt("day",11),tt("weekday",11),tt("isoWeekday",11),Ot("d",vt),Ot("e",vt),Ot("E",vt),Ot("dd",function(t,e){return e.weekdaysMinRegex(t)}),Ot("ddd",function(t,e){return e.weekdaysShortRegex(t)}),Ot("dddd",function(t,e){return e.weekdaysRegex(t)}),Nt(["dd","ddd","dddd"],function(t,e,n,i){var a=n._locale.weekdaysParse(t,i,n._strict);null!=a?e.d=a:v(n).invalidWeekday=t}),Nt(["d","e","E"],function(t,e,n,i){e[i]=D(t)});var Re="Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday".split("_");function Ne(t,e){var n=o(this._weekdays)?this._weekdays:this._weekdays[t&&!0!==t&&this._weekdays.isFormat.test(e)?"format":"standalone"];return!0===t?Le(n,this._week.dow):t?n[t.day()]:n}var We="Sun_Mon_Tue_Wed_Thu_Fri_Sat".split("_");function Ye(t){return!0===t?Le(this._weekdaysShort,this._week.dow):t?this._weekdaysShort[t.day()]:this._weekdaysShort}var ze="Su_Mo_Tu_We_Th_Fr_Sa".split("_");function Ee(t){return!0===t?Le(this._weekdaysMin,this._week.dow):t?this._weekdaysMin[t.day()]:this._weekdaysMin}function Ve(t,e,n){var i,a,r,o=t.toLocaleLowerCase();if(!this._weekdaysParse)for(this._weekdaysParse=[],this._shortWeekdaysParse=[],this._minWeekdaysParse=[],i=0;i<7;++i)r=m([2e3,1]).day(i),this._minWeekdaysParse[i]=this.weekdaysMin(r,"").toLocaleLowerCase(),this._shortWeekdaysParse[i]=this.weekdaysShort(r,"").toLocaleLowerCase(),this._weekdaysParse[i]=this.weekdays(r,"").toLocaleLowerCase();return n?"dddd"===e?-1!==(a=$t.call(this._weekdaysParse,o))?a:null:"ddd"===e?-1!==(a=$t.call(this._shortWeekdaysParse,o))?a:null:-1!==(a=$t.call(this._minWeekdaysParse,o))?a:null:"dddd"===e?-1!==(a=$t.call(this._weekdaysParse,o))||-1!==(a=$t.call(this._shortWeekdaysParse,o))||-1!==(a=$t.call(this._minWeekdaysParse,o))?a:null:"ddd"===e?-1!==(a=$t.call(this._shortWeekdaysParse,o))||-1!==(a=$t.call(this._weekdaysParse,o))||-1!==(a=$t.call(this._minWeekdaysParse,o))?a:null:-1!==(a=$t.call(this._minWeekdaysParse,o))||-1!==(a=$t.call(this._weekdaysParse,o))||-1!==(a=$t.call(this._shortWeekdaysParse,o))?a:null}function He(t,e,n){var i,a,r;if(this._weekdaysParseExact)return Ve.call(this,t,e,n);for(this._weekdaysParse||(this._weekdaysParse=[],this._minWeekdaysParse=[],this._shortWeekdaysParse=[],this._fullWeekdaysParse=[]),i=0;i<7;i++){if(a=m([2e3,1]).day(i),n&&!this._fullWeekdaysParse[i]&&(this._fullWeekdaysParse[i]=new RegExp("^"+this.weekdays(a,"").replace(".","\\.?")+"$","i"),this._shortWeekdaysParse[i]=new RegExp("^"+this.weekdaysShort(a,"").replace(".","\\.?")+"$","i"),this._minWeekdaysParse[i]=new RegExp("^"+this.weekdaysMin(a,"").replace(".","\\.?")+"$","i")),this._weekdaysParse[i]||(r="^"+this.weekdays(a,"")+"|^"+this.weekdaysShort(a,"")+"|^"+this.weekdaysMin(a,""),this._weekdaysParse[i]=new RegExp(r.replace(".",""),"i")),n&&"dddd"===e&&this._fullWeekdaysParse[i].test(t))return i;if(n&&"ddd"===e&&this._shortWeekdaysParse[i].test(t))return i;if(n&&"dd"===e&&this._minWeekdaysParse[i].test(t))return i;if(!n&&this._weekdaysParse[i].test(t))return i}}function Be(t){if(!this.isValid())return null!=t?this:NaN;var e=this._isUTC?this._d.getUTCDay():this._d.getDay();return null!=t?(t=Fe(t,this.localeData()),this.add(t-e,"d")):e}function je(t){if(!this.isValid())return null!=t?this:NaN;var e=(this.day()+7-this.localeData()._week.dow)%7;return null==t?e:this.add(t-e,"d")}function Ue(t){if(!this.isValid())return null!=t?this:NaN;if(null!=t){var e=Ie(t,this.localeData());return this.day(this.day()%7?e:e-7)}return this.day()||7}var Ge=Pt;function qe(t){return this._weekdaysParseExact?(f(this,"_weekdaysRegex")||Je.call(this),t?this._weekdaysStrictRegex:this._weekdaysRegex):(f(this,"_weekdaysRegex")||(this._weekdaysRegex=Ge),this._weekdaysStrictRegex&&t?this._weekdaysStrictRegex:this._weekdaysRegex)}var Ze=Pt;function $e(t){return this._weekdaysParseExact?(f(this,"_weekdaysRegex")||Je.call(this),t?this._weekdaysShortStrictRegex:this._weekdaysShortRegex):(f(this,"_weekdaysShortRegex")||(this._weekdaysShortRegex=Ze),this._weekdaysShortStrictRegex&&t?this._weekdaysShortStrictRegex:this._weekdaysShortRegex)}var Xe=Pt;function Ke(t){return this._weekdaysParseExact?(f(this,"_weekdaysRegex")||Je.call(this),t?this._weekdaysMinStrictRegex:this._weekdaysMinRegex):(f(this,"_weekdaysMinRegex")||(this._weekdaysMinRegex=Xe),this._weekdaysMinStrictRegex&&t?this._weekdaysMinStrictRegex:this._weekdaysMinRegex)}function Je(){function t(t,e){return e.length-t.length}var e,n,i,a,r,o=[],s=[],l=[],u=[];for(e=0;e<7;e++)n=m([2e3,1]).day(e),i=this.weekdaysMin(n,""),a=this.weekdaysShort(n,""),r=this.weekdays(n,""),o.push(i),s.push(a),l.push(r),u.push(i),u.push(a),u.push(r);for(o.sort(t),s.sort(t),l.sort(t),u.sort(t),e=0;e<7;e++)s[e]=It(s[e]),l[e]=It(l[e]),u[e]=It(u[e]);this._weekdaysRegex=new RegExp("^("+u.join("|")+")","i"),this._weekdaysShortRegex=this._weekdaysRegex,this._weekdaysMinRegex=this._weekdaysRegex,this._weekdaysStrictRegex=new RegExp("^("+l.join("|")+")","i"),this._weekdaysShortStrictRegex=new RegExp("^("+s.join("|")+")","i"),this._weekdaysMinStrictRegex=new RegExp("^("+o.join("|")+")","i")}function Qe(){return this.hours()%12||12}function tn(){return this.hours()||24}function en(t,e){st(t,0,0,function(){return this.localeData().meridiem(this.hours(),this.minutes(),e)})}function nn(t,e){return e._meridiemParse}function an(t){return"p"===(t+"").toLowerCase().charAt(0)}st("H",["HH",2],0,"hour"),st("h",["hh",2],0,Qe),st("k",["kk",2],0,tn),st("hmm",0,0,function(){return""+Qe.apply(this)+nt(this.minutes(),2)}),st("hmmss",0,0,function(){return""+Qe.apply(this)+nt(this.minutes(),2)+nt(this.seconds(),2)}),st("Hmm",0,0,function(){return""+this.hours()+nt(this.minutes(),2)}),st("Hmmss",0,0,function(){return""+this.hours()+nt(this.minutes(),2)+nt(this.seconds(),2)}),en("a",!0),en("A",!1),X("hour","h"),tt("hour",13),Ot("a",nn),Ot("A",nn),Ot("H",vt),Ot("h",vt),Ot("k",vt),Ot("HH",vt,ft),Ot("hh",vt,ft),Ot("kk",vt,ft),Ot("hmm",bt),Ot("hmmss",yt),Ot("Hmm",bt),Ot("Hmmss",yt),Rt(["H","HH"],Vt),Rt(["k","kk"],function(t,e,n){var i=D(t);e[Vt]=24===i?0:i}),Rt(["a","A"],function(t,e,n){n._isPm=n._locale.isPM(t),n._meridiem=t}),Rt(["h","hh"],function(t,e,n){e[Vt]=D(t),v(n).bigHour=!0}),Rt("hmm",function(t,e,n){var i=t.length-2;e[Vt]=D(t.substr(0,i)),e[Ht]=D(t.substr(i)),v(n).bigHour=!0}),Rt("hmmss",function(t,e,n){var i=t.length-4,a=t.length-2;e[Vt]=D(t.substr(0,i)),e[Ht]=D(t.substr(i,2)),e[Bt]=D(t.substr(a)),v(n).bigHour=!0}),Rt("Hmm",function(t,e,n){var i=t.length-2;e[Vt]=D(t.substr(0,i)),e[Ht]=D(t.substr(i))}),Rt("Hmmss",function(t,e,n){var i=t.length-4,a=t.length-2;e[Vt]=D(t.substr(0,i)),e[Ht]=D(t.substr(i,2)),e[Bt]=D(t.substr(a))});var rn=/[ap]\.?m?\.?/i;function on(t,e,n){return t>11?n?"pm":"PM":n?"am":"AM"}var sn,ln=Jt("Hours",!0),un={calendar:W,longDateFormat:z,invalidDate:V,ordinal:B,dayOfMonthOrdinalParse:j,relativeTime:G,months:oe,monthsShort:le,week:Ce,weekdays:Re,weekdaysMin:ze,weekdaysShort:We,meridiemParse:rn},dn={},hn={};function cn(t){return t?t.toLowerCase().replace("_","-"):t}function fn(t){for(var e,n,i,a,r=0;r<t.length;){for(e=(a=cn(t[r]).split("-")).length,n=(n=cn(t[r+1]))?n.split("-"):null;e>0;){if(i=gn(a.slice(0,e).join("-")))return i;if(n&&n.length>=e&&C(a,n,!0)>=e-1)break;e--}r++}return sn}function gn(n){var i=null;if(!dn[n]&&e&&e.exports)try{i=sn._abbr,t(),mn(i)}catch(t){}return dn[n]}function mn(t,e){var n;return t&&((n=u(e)?bn(t):pn(t,e))?sn=n:"undefined"!=typeof console&&console.warn&&console.warn("Locale "+t+" not found. Did you forget to load it?")),sn._abbr}function pn(t,e){if(null!==e){var n,i=un;if(e.abbr=t,null!=dn[t])F("defineLocaleOverride","use moment.updateLocale(localeName, config) to change an existing locale. moment.defineLocale(localeName, config) should only be used for creating a new locale See http://momentjs.com/guides/#/warnings/define-locale/ for more info."),i=dn[t]._config;else if(null!=e.parentLocale)if(null!=dn[e.parentLocale])i=dn[e.parentLocale]._config;else{if(null==(n=gn(e.parentLocale)))return hn[e.parentLocale]||(hn[e.parentLocale]=[]),hn[e.parentLocale].push({name:t,config:e}),null;i=n._config}return dn[t]=new N(R(i,e)),hn[t]&&hn[t].forEach(function(t){pn(t.name,t.config)}),mn(t),dn[t]}return delete dn[t],null}function vn(t,e){if(null!=e){var n,i,a=un;null!=(i=gn(t))&&(a=i._config),(n=new N(e=R(a,e))).parentLocale=dn[t],dn[t]=n,mn(t)}else null!=dn[t]&&(null!=dn[t].parentLocale?dn[t]=dn[t].parentLocale:null!=dn[t]&&delete dn[t]);return dn[t]}function bn(t){var e;if(t&&t._locale&&t._locale._abbr&&(t=t._locale._abbr),!t)return sn;if(!o(t)){if(e=gn(t))return e;t=[t]}return fn(t)}function yn(){return O(dn)}function xn(t){var e,n=t._a;return n&&-2===v(t).overflow&&(e=n[zt]<0||n[zt]>11?zt:n[Et]<1||n[Et]>ae(n[Yt],n[zt])?Et:n[Vt]<0||n[Vt]>24||24===n[Vt]&&(0!==n[Ht]||0!==n[Bt]||0!==n[jt])?Vt:n[Ht]<0||n[Ht]>59?Ht:n[Bt]<0||n[Bt]>59?Bt:n[jt]<0||n[jt]>999?jt:-1,v(t)._overflowDayOfYear&&(e<Yt||e>Et)&&(e=Et),v(t)._overflowWeeks&&-1===e&&(e=Ut),v(t)._overflowWeekday&&-1===e&&(e=Gt),v(t).overflow=e),t}function _n(t,e,n){return null!=t?t:null!=e?e:n}function wn(t){var e=new Date(a.now());return t._useUTC?[e.getUTCFullYear(),e.getUTCMonth(),e.getUTCDate()]:[e.getFullYear(),e.getMonth(),e.getDate()]}function kn(t){var e,n,i,a,r,o=[];if(!t._d){for(i=wn(t),t._w&&null==t._a[Et]&&null==t._a[zt]&&Mn(t),null!=t._dayOfYear&&(r=_n(t._a[Yt],i[Yt]),(t._dayOfYear>qt(r)||0===t._dayOfYear)&&(v(t)._overflowDayOfYear=!0),n=_e(r,0,t._dayOfYear),t._a[zt]=n.getUTCMonth(),t._a[Et]=n.getUTCDate()),e=0;e<3&&null==t._a[e];++e)t._a[e]=o[e]=i[e];for(;e<7;e++)t._a[e]=o[e]=null==t._a[e]?2===e?1:0:t._a[e];24===t._a[Vt]&&0===t._a[Ht]&&0===t._a[Bt]&&0===t._a[jt]&&(t._nextDay=!0,t._a[Vt]=0),t._d=(t._useUTC?_e:xe).apply(null,o),a=t._useUTC?t._d.getUTCDay():t._d.getDay(),null!=t._tzm&&t._d.setUTCMinutes(t._d.getUTCMinutes()-t._tzm),t._nextDay&&(t._a[Vt]=24),t._w&&void 0!==t._w.d&&t._w.d!==a&&(v(t).weekdayMismatch=!0)}}function Mn(t){var e,n,i,a,r,o,s,l;if(null!=(e=t._w).GG||null!=e.W||null!=e.E)r=1,o=4,n=_n(e.GG,t._a[Yt],Me($n(),1,4).year),i=_n(e.W,1),((a=_n(e.E,1))<1||a>7)&&(l=!0);else{r=t._locale._week.dow,o=t._locale._week.doy;var u=Me($n(),r,o);n=_n(e.gg,t._a[Yt],u.year),i=_n(e.w,u.week),null!=e.d?((a=e.d)<0||a>6)&&(l=!0):null!=e.e?(a=e.e+r,(e.e<0||e.e>6)&&(l=!0)):a=r}i<1||i>Se(n,r,o)?v(t)._overflowWeeks=!0:null!=l?v(t)._overflowWeekday=!0:(s=ke(n,i,a,r,o),t._a[Yt]=s.year,t._dayOfYear=s.dayOfYear)}var Sn=/^\s*((?:[+-]\d{6}|\d{4})-(?:\d\d-\d\d|W\d\d-\d|W\d\d|\d\d\d|\d\d))(?:(T| )(\d\d(?::\d\d(?::\d\d(?:[.,]\d+)?)?)?)([\+\-]\d\d(?::?\d\d)?|\s*Z)?)?$/,Dn=/^\s*((?:[+-]\d{6}|\d{4})(?:\d\d\d\d|W\d\d\d|W\d\d|\d\d\d|\d\d))(?:(T| )(\d\d(?:\d\d(?:\d\d(?:[.,]\d+)?)?)?)([\+\-]\d\d(?::?\d\d)?|\s*Z)?)?$/,Cn=/Z|[+-]\d\d(?::?\d\d)?/,Pn=[["YYYYYY-MM-DD",/[+-]\d{6}-\d\d-\d\d/],["YYYY-MM-DD",/\d{4}-\d\d-\d\d/],["GGGG-[W]WW-E",/\d{4}-W\d\d-\d/],["GGGG-[W]WW",/\d{4}-W\d\d/,!1],["YYYY-DDD",/\d{4}-\d{3}/],["YYYY-MM",/\d{4}-\d\d/,!1],["YYYYYYMMDD",/[+-]\d{10}/],["YYYYMMDD",/\d{8}/],["GGGG[W]WWE",/\d{4}W\d{3}/],["GGGG[W]WW",/\d{4}W\d{2}/,!1],["YYYYDDD",/\d{7}/]],Tn=[["HH:mm:ss.SSSS",/\d\d:\d\d:\d\d\.\d+/],["HH:mm:ss,SSSS",/\d\d:\d\d:\d\d,\d+/],["HH:mm:ss",/\d\d:\d\d:\d\d/],["HH:mm",/\d\d:\d\d/],["HHmmss.SSSS",/\d\d\d\d\d\d\.\d+/],["HHmmss,SSSS",/\d\d\d\d\d\d,\d+/],["HHmmss",/\d\d\d\d\d\d/],["HHmm",/\d\d\d\d/],["HH",/\d\d/]],On=/^\/?Date\((\-?\d+)/i;function An(t){var e,n,i,a,r,o,s=t._i,l=Sn.exec(s)||Dn.exec(s);if(l){for(v(t).iso=!0,e=0,n=Pn.length;e<n;e++)if(Pn[e][1].exec(l[1])){a=Pn[e][0],i=!1!==Pn[e][2];break}if(null==a)return void(t._isValid=!1);if(l[3]){for(e=0,n=Tn.length;e<n;e++)if(Tn[e][1].exec(l[3])){r=(l[2]||" ")+Tn[e][0];break}if(null==r)return void(t._isValid=!1)}if(!i&&null!=r)return void(t._isValid=!1);if(l[4]){if(!Cn.exec(l[4]))return void(t._isValid=!1);o="Z"}t._f=a+(r||"")+(o||""),Vn(t)}else t._isValid=!1}var Fn=/^(?:(Mon|Tue|Wed|Thu|Fri|Sat|Sun),?\s)?(\d{1,2})\s(Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)\s(\d{2,4})\s(\d\d):(\d\d)(?::(\d\d))?\s(?:(UT|GMT|[ECMP][SD]T)|([Zz])|([+-]\d{4}))$/;function In(t,e,n,i,a,r){var o=[Ln(t),le.indexOf(e),parseInt(n,10),parseInt(i,10),parseInt(a,10)];return r&&o.push(parseInt(r,10)),o}function Ln(t){var e=parseInt(t,10);return e<=49?2e3+e:e<=999?1900+e:e}function Rn(t){return t.replace(/\([^)]*\)|[\n\t]/g," ").replace(/(\s\s+)/g," ").replace(/^\s\s*/,"").replace(/\s\s*$/,"")}function Nn(t,e,n){return!t||We.indexOf(t)===new Date(e[0],e[1],e[2]).getDay()||(v(n).weekdayMismatch=!0,n._isValid=!1,!1)}var Wn={UT:0,GMT:0,EDT:-240,EST:-300,CDT:-300,CST:-360,MDT:-360,MST:-420,PDT:-420,PST:-480};function Yn(t,e,n){if(t)return Wn[t];if(e)return 0;var i=parseInt(n,10),a=i%100;return(i-a)/100*60+a}function zn(t){var e=Fn.exec(Rn(t._i));if(e){var n=In(e[4],e[3],e[2],e[5],e[6],e[7]);if(!Nn(e[1],n,t))return;t._a=n,t._tzm=Yn(e[8],e[9],e[10]),t._d=_e.apply(null,t._a),t._d.setUTCMinutes(t._d.getUTCMinutes()-t._tzm),v(t).rfc2822=!0}else t._isValid=!1}function En(t){var e=On.exec(t._i);null===e?(An(t),!1===t._isValid&&(delete t._isValid,zn(t),!1===t._isValid&&(delete t._isValid,a.createFromInputFallback(t)))):t._d=new Date(+e[1])}function Vn(t){if(t._f!==a.ISO_8601)if(t._f!==a.RFC_2822){t._a=[],v(t).empty=!0;var e,n,i,r,o,s=""+t._i,l=s.length,u=0;for(i=ht(t._f,t._locale).match(it)||[],e=0;e<i.length;e++)r=i[e],(n=(s.match(At(r,t))||[])[0])&&((o=s.substr(0,s.indexOf(n))).length>0&&v(t).unusedInput.push(o),s=s.slice(s.indexOf(n)+n.length),u+=n.length),ot[r]?(n?v(t).empty=!1:v(t).unusedTokens.push(r),Wt(r,n,t)):t._strict&&!n&&v(t).unusedTokens.push(r);v(t).charsLeftOver=l-u,s.length>0&&v(t).unusedInput.push(s),t._a[Vt]<=12&&!0===v(t).bigHour&&t._a[Vt]>0&&(v(t).bigHour=void 0),v(t).parsedDateParts=t._a.slice(0),v(t).meridiem=t._meridiem,t._a[Vt]=Hn(t._locale,t._a[Vt],t._meridiem),kn(t),xn(t)}else zn(t);else An(t)}function Hn(t,e,n){var i;return null==n?e:null!=t.meridiemHour?t.meridiemHour(e,n):null!=t.isPM?((i=t.isPM(n))&&e<12&&(e+=12),i||12!==e||(e=0),e):e}function Bn(t){var e,n,i,a,r;if(0===t._f.length)return v(t).invalidFormat=!0,void(t._d=new Date(NaN));for(a=0;a<t._f.length;a++)r=0,e=_({},t),null!=t._useUTC&&(e._useUTC=t._useUTC),e._f=t._f[a],Vn(e),b(e)&&(r+=v(e).charsLeftOver,r+=10*v(e).unusedTokens.length,v(e).score=r,(null==i||r<i)&&(i=r,n=e));g(t,n||e)}function jn(t){if(!t._d){var e=J(t._i);t._a=c([e.year,e.month,e.day||e.date,e.hour,e.minute,e.second,e.millisecond],function(t){return t&&parseInt(t,10)}),kn(t)}}function Un(t){var e=new k(xn(Gn(t)));return e._nextDay&&(e.add(1,"d"),e._nextDay=void 0),e}function Gn(t){var e=t._i,n=t._f;return t._locale=t._locale||bn(t._l),null===e||void 0===n&&""===e?y({nullInput:!0}):("string"==typeof e&&(t._i=e=t._locale.preparse(e)),M(e)?new k(xn(e)):(h(e)?t._d=e:o(n)?Bn(t):n?Vn(t):qn(t),b(t)||(t._d=null),t))}function qn(t){var e=t._i;u(e)?t._d=new Date(a.now()):h(e)?t._d=new Date(e.valueOf()):"string"==typeof e?En(t):o(e)?(t._a=c(e.slice(0),function(t){return parseInt(t,10)}),kn(t)):s(e)?jn(t):d(e)?t._d=new Date(e):a.createFromInputFallback(t)}function Zn(t,e,n,i,a){var r={};return!0!==n&&!1!==n||(i=n,n=void 0),(s(t)&&l(t)||o(t)&&0===t.length)&&(t=void 0),r._isAMomentObject=!0,r._useUTC=r._isUTC=a,r._l=n,r._i=t,r._f=e,r._strict=i,Un(r)}function $n(t,e,n,i){return Zn(t,e,n,i,!1)}a.createFromInputFallback=T("value provided is not in a recognized RFC2822 or ISO format. moment construction falls back to js Date(), which is not reliable across all browsers and versions. Non RFC2822/ISO date formats are discouraged and will be removed in an upcoming major release. Please refer to http://momentjs.com/guides/#/warnings/js-date/ for more info.",function(t){t._d=new Date(t._i+(t._useUTC?" UTC":""))}),a.ISO_8601=function(){},a.RFC_2822=function(){};var Xn=T("moment().min is deprecated, use moment.max instead. http://momentjs.com/guides/#/warnings/min-max/",function(){var t=$n.apply(null,arguments);return this.isValid()&&t.isValid()?t<this?this:t:y()}),Kn=T("moment().max is deprecated, use moment.min instead. http://momentjs.com/guides/#/warnings/min-max/",function(){var t=$n.apply(null,arguments);return this.isValid()&&t.isValid()?t>this?this:t:y()});function Jn(t,e){var n,i;if(1===e.length&&o(e[0])&&(e=e[0]),!e.length)return $n();for(n=e[0],i=1;i<e.length;++i)e[i].isValid()&&!e[i][t](n)||(n=e[i]);return n}function Qn(){return Jn("isBefore",[].slice.call(arguments,0))}function ti(){return Jn("isAfter",[].slice.call(arguments,0))}var ei=function(){return Date.now?Date.now():+new Date},ni=["year","quarter","month","week","day","hour","minute","second","millisecond"];function ii(t){for(var e in t)if(-1===$t.call(ni,e)||null!=t[e]&&isNaN(t[e]))return!1;for(var n=!1,i=0;i<ni.length;++i)if(t[ni[i]]){if(n)return!1;parseFloat(t[ni[i]])!==D(t[ni[i]])&&(n=!0)}return!0}function ai(){return this._isValid}function ri(){return Ci(NaN)}function oi(t){var e=J(t),n=e.year||0,i=e.quarter||0,a=e.month||0,r=e.week||e.isoWeek||0,o=e.day||0,s=e.hour||0,l=e.minute||0,u=e.second||0,d=e.millisecond||0;this._isValid=ii(e),this._milliseconds=+d+1e3*u+6e4*l+1e3*s*60*60,this._days=+o+7*r,this._months=+a+3*i+12*n,this._data={},this._locale=bn(),this._bubble()}function si(t){return t instanceof oi}function li(t){return t<0?-1*Math.round(-1*t):Math.round(t)}function ui(t,e){st(t,0,0,function(){var t=this.utcOffset(),n="+";return t<0&&(t=-t,n="-"),n+nt(~~(t/60),2)+e+nt(~~t%60,2)})}ui("Z",":"),ui("ZZ",""),Ot("Z",Dt),Ot("ZZ",Dt),Rt(["Z","ZZ"],function(t,e,n){n._useUTC=!0,n._tzm=hi(Dt,t)});var di=/([\+\-]|\d\d)/gi;function hi(t,e){var n=(e||"").match(t);if(null===n)return null;var i=((n[n.length-1]||[])+"").match(di)||["-",0,0],a=60*i[1]+D(i[2]);return 0===a?0:"+"===i[0]?a:-a}function ci(t,e){var n,i;return e._isUTC?(n=e.clone(),i=(M(t)||h(t)?t.valueOf():$n(t).valueOf())-n.valueOf(),n._d.setTime(n._d.valueOf()+i),a.updateOffset(n,!1),n):$n(t).local()}function fi(t){return 15*-Math.round(t._d.getTimezoneOffset()/15)}function gi(t,e,n){var i,r=this._offset||0;if(!this.isValid())return null!=t?this:NaN;if(null!=t){if("string"==typeof t){if(null===(t=hi(Dt,t)))return this}else Math.abs(t)<16&&!n&&(t*=60);return!this._isUTC&&e&&(i=fi(this)),this._offset=t,this._isUTC=!0,null!=i&&this.add(i,"m"),r!==t&&(!e||this._changeInProgress?Fi(this,Ci(t-r,"m"),1,!1):this._changeInProgress||(this._changeInProgress=!0,a.updateOffset(this,!0),this._changeInProgress=null)),this}return this._isUTC?r:fi(this)}function mi(t,e){return null!=t?("string"!=typeof t&&(t=-t),this.utcOffset(t,e),this):-this.utcOffset()}function pi(t){return this.utcOffset(0,t)}function vi(t){return this._isUTC&&(this.utcOffset(0,t),this._isUTC=!1,t&&this.subtract(fi(this),"m")),this}function bi(){if(null!=this._tzm)this.utcOffset(this._tzm,!1,!0);else if("string"==typeof this._i){var t=hi(St,this._i);null!=t?this.utcOffset(t):this.utcOffset(0,!0)}return this}function yi(t){return!!this.isValid()&&(t=t?$n(t).utcOffset():0,(this.utcOffset()-t)%60==0)}function xi(){return this.utcOffset()>this.clone().month(0).utcOffset()||this.utcOffset()>this.clone().month(5).utcOffset()}function _i(){if(!u(this._isDSTShifted))return this._isDSTShifted;var t={};if(_(t,this),(t=Gn(t))._a){var e=t._isUTC?m(t._a):$n(t._a);this._isDSTShifted=this.isValid()&&C(t._a,e.toArray())>0}else this._isDSTShifted=!1;return this._isDSTShifted}function wi(){return!!this.isValid()&&!this._isUTC}function ki(){return!!this.isValid()&&this._isUTC}function Mi(){return!!this.isValid()&&this._isUTC&&0===this._offset}a.updateOffset=function(){};var Si=/^(\-|\+)?(?:(\d*)[. ])?(\d+)\:(\d+)(?:\:(\d+)(\.\d*)?)?$/,Di=/^(-|\+)?P(?:([-+]?[0-9,.]*)Y)?(?:([-+]?[0-9,.]*)M)?(?:([-+]?[0-9,.]*)W)?(?:([-+]?[0-9,.]*)D)?(?:T(?:([-+]?[0-9,.]*)H)?(?:([-+]?[0-9,.]*)M)?(?:([-+]?[0-9,.]*)S)?)?$/;function Ci(t,e){var n,i,a,r=t,o=null;return si(t)?r={ms:t._milliseconds,d:t._days,M:t._months}:d(t)?(r={},e?r[e]=t:r.milliseconds=t):(o=Si.exec(t))?(n="-"===o[1]?-1:1,r={y:0,d:D(o[Et])*n,h:D(o[Vt])*n,m:D(o[Ht])*n,s:D(o[Bt])*n,ms:D(li(1e3*o[jt]))*n}):(o=Di.exec(t))?(n="-"===o[1]?-1:1,r={y:Pi(o[2],n),M:Pi(o[3],n),w:Pi(o[4],n),d:Pi(o[5],n),h:Pi(o[6],n),m:Pi(o[7],n),s:Pi(o[8],n)}):null==r?r={}:"object"==typeof r&&("from"in r||"to"in r)&&(a=Oi($n(r.from),$n(r.to)),(r={}).ms=a.milliseconds,r.M=a.months),i=new oi(r),si(t)&&f(t,"_locale")&&(i._locale=t._locale),i}function Pi(t,e){var n=t&&parseFloat(t.replace(",","."));return(isNaN(n)?0:n)*e}function Ti(t,e){var n={};return n.months=e.month()-t.month()+12*(e.year()-t.year()),t.clone().add(n.months,"M").isAfter(e)&&--n.months,n.milliseconds=+e-+t.clone().add(n.months,"M"),n}function Oi(t,e){var n;return t.isValid()&&e.isValid()?(e=ci(e,t),t.isBefore(e)?n=Ti(t,e):((n=Ti(e,t)).milliseconds=-n.milliseconds,n.months=-n.months),n):{milliseconds:0,months:0}}function Ai(t,e){return function(n,i){var a;return null===i||isNaN(+i)||(F(e,"moment()."+e+"(period, number) is deprecated. Please use moment()."+e+"(number, period). See http://momentjs.com/guides/#/warnings/add-inverted-param/ for more info."),a=n,n=i,i=a),Fi(this,Ci(n="string"==typeof n?+n:n,i),t),this}}function Fi(t,e,n,i){var r=e._milliseconds,o=li(e._days),s=li(e._months);t.isValid()&&(i=null==i||i,s&&ce(t,Qt(t,"Month")+s*n),o&&te(t,"Date",Qt(t,"Date")+o*n),r&&t._d.setTime(t._d.valueOf()+r*n),i&&a.updateOffset(t,o||s))}Ci.fn=oi.prototype,Ci.invalid=ri;var Ii=Ai(1,"add"),Li=Ai(-1,"subtract");function Ri(t,e){var n=t.diff(e,"days",!0);return n<-6?"sameElse":n<-1?"lastWeek":n<0?"lastDay":n<1?"sameDay":n<2?"nextDay":n<7?"nextWeek":"sameElse"}function Ni(t,e){var n=t||$n(),i=ci(n,this).startOf("day"),r=a.calendarFormat(this,i)||"sameElse",o=e&&(I(e[r])?e[r].call(this,n):e[r]);return this.format(o||this.localeData().calendar(r,this,$n(n)))}function Wi(){return new k(this)}function Yi(t,e){var n=M(t)?t:$n(t);return!(!this.isValid()||!n.isValid())&&("millisecond"===(e=K(e)||"millisecond")?this.valueOf()>n.valueOf():n.valueOf()<this.clone().startOf(e).valueOf())}function zi(t,e){var n=M(t)?t:$n(t);return!(!this.isValid()||!n.isValid())&&("millisecond"===(e=K(e)||"millisecond")?this.valueOf()<n.valueOf():this.clone().endOf(e).valueOf()<n.valueOf())}function Ei(t,e,n,i){var a=M(t)?t:$n(t),r=M(e)?e:$n(e);return!!(this.isValid()&&a.isValid()&&r.isValid())&&("("===(i=i||"()")[0]?this.isAfter(a,n):!this.isBefore(a,n))&&(")"===i[1]?this.isBefore(r,n):!this.isAfter(r,n))}function Vi(t,e){var n,i=M(t)?t:$n(t);return!(!this.isValid()||!i.isValid())&&("millisecond"===(e=K(e)||"millisecond")?this.valueOf()===i.valueOf():(n=i.valueOf(),this.clone().startOf(e).valueOf()<=n&&n<=this.clone().endOf(e).valueOf()))}function Hi(t,e){return this.isSame(t,e)||this.isAfter(t,e)}function Bi(t,e){return this.isSame(t,e)||this.isBefore(t,e)}function ji(t,e,n){var i,a,r;if(!this.isValid())return NaN;if(!(i=ci(t,this)).isValid())return NaN;switch(a=6e4*(i.utcOffset()-this.utcOffset()),e=K(e)){case"year":r=Ui(this,i)/12;break;case"month":r=Ui(this,i);break;case"quarter":r=Ui(this,i)/3;break;case"second":r=(this-i)/1e3;break;case"minute":r=(this-i)/6e4;break;case"hour":r=(this-i)/36e5;break;case"day":r=(this-i-a)/864e5;break;case"week":r=(this-i-a)/6048e5;break;default:r=this-i}return n?r:S(r)}function Ui(t,e){var n=12*(e.year()-t.year())+(e.month()-t.month()),i=t.clone().add(n,"months");return-(n+(e-i<0?(e-i)/(i-t.clone().add(n-1,"months")):(e-i)/(t.clone().add(n+1,"months")-i)))||0}function Gi(){return this.clone().locale("en").format("ddd MMM DD YYYY HH:mm:ss [GMT]ZZ")}function qi(t){if(!this.isValid())return null;var e=!0!==t,n=e?this.clone().utc():this;return n.year()<0||n.year()>9999?dt(n,e?"YYYYYY-MM-DD[T]HH:mm:ss.SSS[Z]":"YYYYYY-MM-DD[T]HH:mm:ss.SSSZ"):I(Date.prototype.toISOString)?e?this.toDate().toISOString():new Date(this.valueOf()+60*this.utcOffset()*1e3).toISOString().replace("Z",dt(n,"Z")):dt(n,e?"YYYY-MM-DD[T]HH:mm:ss.SSS[Z]":"YYYY-MM-DD[T]HH:mm:ss.SSSZ")}function Zi(){if(!this.isValid())return"moment.invalid(/* "+this._i+" */)";var t="moment",e="";this.isLocal()||(t=0===this.utcOffset()?"moment.utc":"moment.parseZone",e="Z");var n="["+t+'("]',i=0<=this.year()&&this.year()<=9999?"YYYY":"YYYYYY",a="-MM-DD[T]HH:mm:ss.SSS",r=e+'[")]';return this.format(n+i+a+r)}function $i(t){t||(t=this.isUtc()?a.defaultFormatUtc:a.defaultFormat);var e=dt(this,t);return this.localeData().postformat(e)}function Xi(t,e){return this.isValid()&&(M(t)&&t.isValid()||$n(t).isValid())?Ci({to:this,from:t}).locale(this.locale()).humanize(!e):this.localeData().invalidDate()}function Ki(t){return this.from($n(),t)}function Ji(t,e){return this.isValid()&&(M(t)&&t.isValid()||$n(t).isValid())?Ci({from:this,to:t}).locale(this.locale()).humanize(!e):this.localeData().invalidDate()}function Qi(t){return this.to($n(),t)}function ta(t){var e;return void 0===t?this._locale._abbr:(null!=(e=bn(t))&&(this._locale=e),this)}a.defaultFormat="YYYY-MM-DDTHH:mm:ssZ",a.defaultFormatUtc="YYYY-MM-DDTHH:mm:ss[Z]";var ea=T("moment().lang() is deprecated. Instead, use moment().localeData() to get the language configuration. Use moment().locale() to change languages.",function(t){return void 0===t?this.localeData():this.locale(t)});function na(){return this._locale}var ia=1e3,aa=60*ia,ra=60*aa,oa=3506328*ra;function sa(t,e){return(t%e+e)%e}function la(t,e,n){return t<100&&t>=0?new Date(t+400,e,n)-oa:new Date(t,e,n).valueOf()}function ua(t,e,n){return t<100&&t>=0?Date.UTC(t+400,e,n)-oa:Date.UTC(t,e,n)}function da(t){var e;if(void 0===(t=K(t))||"millisecond"===t||!this.isValid())return this;var n=this._isUTC?ua:la;switch(t){case"year":e=n(this.year(),0,1);break;case"quarter":e=n(this.year(),this.month()-this.month()%3,1);break;case"month":e=n(this.year(),this.month(),1);break;case"week":e=n(this.year(),this.month(),this.date()-this.weekday());break;case"isoWeek":e=n(this.year(),this.month(),this.date()-(this.isoWeekday()-1));break;case"day":case"date":e=n(this.year(),this.month(),this.date());break;case"hour":e=this._d.valueOf(),e-=sa(e+(this._isUTC?0:this.utcOffset()*aa),ra);break;case"minute":e=this._d.valueOf(),e-=sa(e,aa);break;case"second":e=this._d.valueOf(),e-=sa(e,ia)}return this._d.setTime(e),a.updateOffset(this,!0),this}function ha(t){var e;if(void 0===(t=K(t))||"millisecond"===t||!this.isValid())return this;var n=this._isUTC?ua:la;switch(t){case"year":e=n(this.year()+1,0,1)-1;break;case"quarter":e=n(this.year(),this.month()-this.month()%3+3,1)-1;break;case"month":e=n(this.year(),this.month()+1,1)-1;break;case"week":e=n(this.year(),this.month(),this.date()-this.weekday()+7)-1;break;case"isoWeek":e=n(this.year(),this.month(),this.date()-(this.isoWeekday()-1)+7)-1;break;case"day":case"date":e=n(this.year(),this.month(),this.date()+1)-1;break;case"hour":e=this._d.valueOf(),e+=ra-sa(e+(this._isUTC?0:this.utcOffset()*aa),ra)-1;break;case"minute":e=this._d.valueOf(),e+=aa-sa(e,aa)-1;break;case"second":e=this._d.valueOf(),e+=ia-sa(e,ia)-1}return this._d.setTime(e),a.updateOffset(this,!0),this}function ca(){return this._d.valueOf()-6e4*(this._offset||0)}function fa(){return Math.floor(this.valueOf()/1e3)}function ga(){return new Date(this.valueOf())}function ma(){var t=this;return[t.year(),t.month(),t.date(),t.hour(),t.minute(),t.second(),t.millisecond()]}function pa(){var t=this;return{years:t.year(),months:t.month(),date:t.date(),hours:t.hours(),minutes:t.minutes(),seconds:t.seconds(),milliseconds:t.milliseconds()}}function va(){return this.isValid()?this.toISOString():null}function ba(){return b(this)}function ya(){return g({},v(this))}function xa(){return v(this).overflow}function _a(){return{input:this._i,format:this._f,locale:this._locale,isUTC:this._isUTC,strict:this._strict}}function wa(t,e){st(0,[t,t.length],0,e)}function ka(t){return Ca.call(this,t,this.week(),this.weekday(),this.localeData()._week.dow,this.localeData()._week.doy)}function Ma(t){return Ca.call(this,t,this.isoWeek(),this.isoWeekday(),1,4)}function Sa(){return Se(this.year(),1,4)}function Da(){var t=this.localeData()._week;return Se(this.year(),t.dow,t.doy)}function Ca(t,e,n,i,a){var r;return null==t?Me(this,i,a).year:(e>(r=Se(t,i,a))&&(e=r),Pa.call(this,t,e,n,i,a))}function Pa(t,e,n,i,a){var r=ke(t,e,n,i,a),o=_e(r.year,0,r.dayOfYear);return this.year(o.getUTCFullYear()),this.month(o.getUTCMonth()),this.date(o.getUTCDate()),this}function Ta(t){return null==t?Math.ceil((this.month()+1)/3):this.month(3*(t-1)+this.month()%3)}st(0,["gg",2],0,function(){return this.weekYear()%100}),st(0,["GG",2],0,function(){return this.isoWeekYear()%100}),wa("gggg","weekYear"),wa("ggggg","weekYear"),wa("GGGG","isoWeekYear"),wa("GGGGG","isoWeekYear"),X("weekYear","gg"),X("isoWeekYear","GG"),tt("weekYear",1),tt("isoWeekYear",1),Ot("G",Mt),Ot("g",Mt),Ot("GG",vt,ft),Ot("gg",vt,ft),Ot("GGGG",_t,mt),Ot("gggg",_t,mt),Ot("GGGGG",wt,pt),Ot("ggggg",wt,pt),Nt(["gggg","ggggg","GGGG","GGGGG"],function(t,e,n,i){e[i.substr(0,2)]=D(t)}),Nt(["gg","GG"],function(t,e,n,i){e[i]=a.parseTwoDigitYear(t)}),st("Q",0,"Qo","quarter"),X("quarter","Q"),tt("quarter",7),Ot("Q",ct),Rt("Q",function(t,e){e[zt]=3*(D(t)-1)}),st("D",["DD",2],"Do","date"),X("date","D"),tt("date",9),Ot("D",vt),Ot("DD",vt,ft),Ot("Do",function(t,e){return t?e._dayOfMonthOrdinalParse||e._ordinalParse:e._dayOfMonthOrdinalParseLenient}),Rt(["D","DD"],Et),Rt("Do",function(t,e){e[Et]=D(t.match(vt)[0])});var Oa=Jt("Date",!0);function Aa(t){var e=Math.round((this.clone().startOf("day")-this.clone().startOf("year"))/864e5)+1;return null==t?e:this.add(t-e,"d")}st("DDD",["DDDD",3],"DDDo","dayOfYear"),X("dayOfYear","DDD"),tt("dayOfYear",4),Ot("DDD",xt),Ot("DDDD",gt),Rt(["DDD","DDDD"],function(t,e,n){n._dayOfYear=D(t)}),st("m",["mm",2],0,"minute"),X("minute","m"),tt("minute",14),Ot("m",vt),Ot("mm",vt,ft),Rt(["m","mm"],Ht);var Fa=Jt("Minutes",!1);st("s",["ss",2],0,"second"),X("second","s"),tt("second",15),Ot("s",vt),Ot("ss",vt,ft),Rt(["s","ss"],Bt);var Ia,La=Jt("Seconds",!1);for(st("S",0,0,function(){return~~(this.millisecond()/100)}),st(0,["SS",2],0,function(){return~~(this.millisecond()/10)}),st(0,["SSS",3],0,"millisecond"),st(0,["SSSS",4],0,function(){return 10*this.millisecond()}),st(0,["SSSSS",5],0,function(){return 100*this.millisecond()}),st(0,["SSSSSS",6],0,function(){return 1e3*this.millisecond()}),st(0,["SSSSSSS",7],0,function(){return 1e4*this.millisecond()}),st(0,["SSSSSSSS",8],0,function(){return 1e5*this.millisecond()}),st(0,["SSSSSSSSS",9],0,function(){return 1e6*this.millisecond()}),X("millisecond","ms"),tt("millisecond",16),Ot("S",xt,ct),Ot("SS",xt,ft),Ot("SSS",xt,gt),Ia="SSSS";Ia.length<=9;Ia+="S")Ot(Ia,kt);function Ra(t,e){e[jt]=D(1e3*("0."+t))}for(Ia="S";Ia.length<=9;Ia+="S")Rt(Ia,Ra);var Na=Jt("Milliseconds",!1);function Wa(){return this._isUTC?"UTC":""}function Ya(){return this._isUTC?"Coordinated Universal Time":""}st("z",0,0,"zoneAbbr"),st("zz",0,0,"zoneName");var za=k.prototype;function Ea(t){return $n(1e3*t)}function Va(){return $n.apply(null,arguments).parseZone()}function Ha(t){return t}za.add=Ii,za.calendar=Ni,za.clone=Wi,za.diff=ji,za.endOf=ha,za.format=$i,za.from=Xi,za.fromNow=Ki,za.to=Ji,za.toNow=Qi,za.get=ee,za.invalidAt=xa,za.isAfter=Yi,za.isBefore=zi,za.isBetween=Ei,za.isSame=Vi,za.isSameOrAfter=Hi,za.isSameOrBefore=Bi,za.isValid=ba,za.lang=ea,za.locale=ta,za.localeData=na,za.max=Kn,za.min=Xn,za.parsingFlags=ya,za.set=ne,za.startOf=da,za.subtract=Li,za.toArray=ma,za.toObject=pa,za.toDate=ga,za.toISOString=qi,za.inspect=Zi,za.toJSON=va,za.toString=Gi,za.unix=fa,za.valueOf=ca,za.creationData=_a,za.year=Xt,za.isLeapYear=Kt,za.weekYear=ka,za.isoWeekYear=Ma,za.quarter=za.quarters=Ta,za.month=fe,za.daysInMonth=ge,za.week=za.weeks=Oe,za.isoWeek=za.isoWeeks=Ae,za.weeksInYear=Da,za.isoWeeksInYear=Sa,za.date=Oa,za.day=za.days=Be,za.weekday=je,za.isoWeekday=Ue,za.dayOfYear=Aa,za.hour=za.hours=ln,za.minute=za.minutes=Fa,za.second=za.seconds=La,za.millisecond=za.milliseconds=Na,za.utcOffset=gi,za.utc=pi,za.local=vi,za.parseZone=bi,za.hasAlignedHourOffset=yi,za.isDST=xi,za.isLocal=wi,za.isUtcOffset=ki,za.isUtc=Mi,za.isUTC=Mi,za.zoneAbbr=Wa,za.zoneName=Ya,za.dates=T("dates accessor is deprecated. Use date instead.",Oa),za.months=T("months accessor is deprecated. Use month instead",fe),za.years=T("years accessor is deprecated. Use year instead",Xt),za.zone=T("moment().zone is deprecated, use moment().utcOffset instead. http://momentjs.com/guides/#/warnings/zone/",mi),za.isDSTShifted=T("isDSTShifted is deprecated. See http://momentjs.com/guides/#/warnings/dst-shifted/ for more information",_i);var Ba=N.prototype;function ja(t,e,n,i){var a=bn(),r=m().set(i,e);return a[n](r,t)}function Ua(t,e,n){if(d(t)&&(e=t,t=void 0),t=t||"",null!=e)return ja(t,e,n,"month");var i,a=[];for(i=0;i<12;i++)a[i]=ja(t,i,n,"month");return a}function Ga(t,e,n,i){"boolean"==typeof t?(d(e)&&(n=e,e=void 0),e=e||""):(n=e=t,t=!1,d(e)&&(n=e,e=void 0),e=e||"");var a,r=bn(),o=t?r._week.dow:0;if(null!=n)return ja(e,(n+o)%7,i,"day");var s=[];for(a=0;a<7;a++)s[a]=ja(e,(a+o)%7,i,"day");return s}function qa(t,e){return Ua(t,e,"months")}function Za(t,e){return Ua(t,e,"monthsShort")}function $a(t,e,n){return Ga(t,e,n,"weekdays")}function Xa(t,e,n){return Ga(t,e,n,"weekdaysShort")}function Ka(t,e,n){return Ga(t,e,n,"weekdaysMin")}Ba.calendar=Y,Ba.longDateFormat=E,Ba.invalidDate=H,Ba.ordinal=U,Ba.preparse=Ha,Ba.postformat=Ha,Ba.relativeTime=q,Ba.pastFuture=Z,Ba.set=L,Ba.months=se,Ba.monthsShort=ue,Ba.monthsParse=he,Ba.monthsRegex=be,Ba.monthsShortRegex=pe,Ba.week=De,Ba.firstDayOfYear=Te,Ba.firstDayOfWeek=Pe,Ba.weekdays=Ne,Ba.weekdaysMin=Ee,Ba.weekdaysShort=Ye,Ba.weekdaysParse=He,Ba.weekdaysRegex=qe,Ba.weekdaysShortRegex=$e,Ba.weekdaysMinRegex=Ke,Ba.isPM=an,Ba.meridiem=on,mn("en",{dayOfMonthOrdinalParse:/\d{1,2}(th|st|nd|rd)/,ordinal:function(t){var e=t%10;return t+(1===D(t%100/10)?"th":1===e?"st":2===e?"nd":3===e?"rd":"th")}}),a.lang=T("moment.lang is deprecated. Use moment.locale instead.",mn),a.langData=T("moment.langData is deprecated. Use moment.localeData instead.",bn);var Ja=Math.abs;function Qa(){var t=this._data;return this._milliseconds=Ja(this._milliseconds),this._days=Ja(this._days),this._months=Ja(this._months),t.milliseconds=Ja(t.milliseconds),t.seconds=Ja(t.seconds),t.minutes=Ja(t.minutes),t.hours=Ja(t.hours),t.months=Ja(t.months),t.years=Ja(t.years),this}function tr(t,e,n,i){var a=Ci(e,n);return t._milliseconds+=i*a._milliseconds,t._days+=i*a._days,t._months+=i*a._months,t._bubble()}function er(t,e){return tr(this,t,e,1)}function nr(t,e){return tr(this,t,e,-1)}function ir(t){return t<0?Math.floor(t):Math.ceil(t)}function ar(){var t,e,n,i,a,r=this._milliseconds,o=this._days,s=this._months,l=this._data;return r>=0&&o>=0&&s>=0||r<=0&&o<=0&&s<=0||(r+=864e5*ir(or(s)+o),o=0,s=0),l.milliseconds=r%1e3,t=S(r/1e3),l.seconds=t%60,e=S(t/60),l.minutes=e%60,n=S(e/60),l.hours=n%24,o+=S(n/24),s+=a=S(rr(o)),o-=ir(or(a)),i=S(s/12),s%=12,l.days=o,l.months=s,l.years=i,this}function rr(t){return 4800*t/146097}function or(t){return 146097*t/4800}function sr(t){if(!this.isValid())return NaN;var e,n,i=this._milliseconds;if("month"===(t=K(t))||"quarter"===t||"year"===t)switch(e=this._days+i/864e5,n=this._months+rr(e),t){case"month":return n;case"quarter":return n/3;case"year":return n/12}else switch(e=this._days+Math.round(or(this._months)),t){case"week":return e/7+i/6048e5;case"day":return e+i/864e5;case"hour":return 24*e+i/36e5;case"minute":return 1440*e+i/6e4;case"second":return 86400*e+i/1e3;case"millisecond":return Math.floor(864e5*e)+i;default:throw new Error("Unknown unit "+t)}}function lr(){return this.isValid()?this._milliseconds+864e5*this._days+this._months%12*2592e6+31536e6*D(this._months/12):NaN}function ur(t){return function(){return this.as(t)}}var dr=ur("ms"),hr=ur("s"),cr=ur("m"),fr=ur("h"),gr=ur("d"),mr=ur("w"),pr=ur("M"),vr=ur("Q"),br=ur("y");function yr(){return Ci(this)}function xr(t){return t=K(t),this.isValid()?this[t+"s"]():NaN}function _r(t){return function(){return this.isValid()?this._data[t]:NaN}}var wr=_r("milliseconds"),kr=_r("seconds"),Mr=_r("minutes"),Sr=_r("hours"),Dr=_r("days"),Cr=_r("months"),Pr=_r("years");function Tr(){return S(this.days()/7)}var Or=Math.round,Ar={ss:44,s:45,m:45,h:22,d:26,M:11};function Fr(t,e,n,i,a){return a.relativeTime(e||1,!!n,t,i)}function Ir(t,e,n){var i=Ci(t).abs(),a=Or(i.as("s")),r=Or(i.as("m")),o=Or(i.as("h")),s=Or(i.as("d")),l=Or(i.as("M")),u=Or(i.as("y")),d=a<=Ar.ss&&["s",a]||a<Ar.s&&["ss",a]||r<=1&&["m"]||r<Ar.m&&["mm",r]||o<=1&&["h"]||o<Ar.h&&["hh",o]||s<=1&&["d"]||s<Ar.d&&["dd",s]||l<=1&&["M"]||l<Ar.M&&["MM",l]||u<=1&&["y"]||["yy",u];return d[2]=e,d[3]=+t>0,d[4]=n,Fr.apply(null,d)}function Lr(t){return void 0===t?Or:"function"==typeof t&&(Or=t,!0)}function Rr(t,e){return void 0!==Ar[t]&&(void 0===e?Ar[t]:(Ar[t]=e,"s"===t&&(Ar.ss=e-1),!0))}function Nr(t){if(!this.isValid())return this.localeData().invalidDate();var e=this.localeData(),n=Ir(this,!t,e);return t&&(n=e.pastFuture(+this,n)),e.postformat(n)}var Wr=Math.abs;function Yr(t){return(t>0)-(t<0)||+t}function zr(){if(!this.isValid())return this.localeData().invalidDate();var t,e,n=Wr(this._milliseconds)/1e3,i=Wr(this._days),a=Wr(this._months);t=S(n/60),e=S(t/60),n%=60,t%=60;var r=S(a/12),o=a%=12,s=i,l=e,u=t,d=n?n.toFixed(3).replace(/\.?0+$/,""):"",h=this.asSeconds();if(!h)return"P0D";var c=h<0?"-":"",f=Yr(this._months)!==Yr(h)?"-":"",g=Yr(this._days)!==Yr(h)?"-":"",m=Yr(this._milliseconds)!==Yr(h)?"-":"";return c+"P"+(r?f+r+"Y":"")+(o?f+o+"M":"")+(s?g+s+"D":"")+(l||u||d?"T":"")+(l?m+l+"H":"")+(u?m+u+"M":"")+(d?m+d+"S":"")}var Er=oi.prototype;return Er.isValid=ai,Er.abs=Qa,Er.add=er,Er.subtract=nr,Er.as=sr,Er.asMilliseconds=dr,Er.asSeconds=hr,Er.asMinutes=cr,Er.asHours=fr,Er.asDays=gr,Er.asWeeks=mr,Er.asMonths=pr,Er.asQuarters=vr,Er.asYears=br,Er.valueOf=lr,Er._bubble=ar,Er.clone=yr,Er.get=xr,Er.milliseconds=wr,Er.seconds=kr,Er.minutes=Mr,Er.hours=Sr,Er.days=Dr,Er.weeks=Tr,Er.months=Cr,Er.years=Pr,Er.humanize=Nr,Er.toISOString=zr,Er.toString=zr,Er.toJSON=zr,Er.locale=ta,Er.localeData=na,Er.toIsoString=T("toIsoString() is deprecated. Please use toISOString() instead (notice the capitals)",zr),Er.lang=ea,st("X",0,0,"unix"),st("x",0,0,"valueOf"),Ot("x",Mt),Ot("X",Ct),Rt("X",function(t,e,n){n._d=new Date(1e3*parseFloat(t,10))}),Rt("x",function(t,e,n){n._d=new Date(D(t))}),a.version="2.24.0",r($n),a.fn=za,a.min=Qn,a.max=ti,a.now=ei,a.utc=m,a.unix=Ea,a.months=qa,a.isDate=h,a.locale=mn,a.invalid=y,a.duration=Ci,a.isMoment=M,a.weekdays=$a,a.parseZone=Va,a.localeData=bn,a.isDuration=si,a.monthsShort=Za,a.weekdaysMin=Ka,a.defineLocale=pn,a.updateLocale=vn,a.locales=yn,a.weekdaysShort=Xa,a.normalizeUnits=K,a.relativeTimeRounding=Lr,a.relativeTimeThreshold=Rr,a.calendarFormat=Ri,a.prototype=za,a.HTML5_FMT={DATETIME_LOCAL:"YYYY-MM-DDTHH:mm",DATETIME_LOCAL_SECONDS:"YYYY-MM-DDTHH:mm:ss",DATETIME_LOCAL_MS:"YYYY-MM-DDTHH:mm:ss.SSS",DATE:"YYYY-MM-DD",TIME:"HH:mm",TIME_SECONDS:"HH:mm:ss",TIME_MS:"HH:mm:ss.SSS",WEEK:"GGGG-[W]WW",MONTH:"YYYY-MM"},a}()}),gi={datetime:"MMM D, YYYY, h:mm:ss a",millisecond:"h:mm:ss.SSS a",second:"h:mm:ss a",minute:"h:mm a",hour:"hA",day:"MMM D",week:"ll",month:"MMM YYYY",quarter:"[Q]Q - YYYY",year:"YYYY"};an._date.override("function"==typeof fi?{_id:"moment",formats:function(){return gi},parse:function(t,e){return"string"==typeof t&&"string"==typeof e?t=fi(t,e):t instanceof fi||(t=fi(t)),t.isValid()?t.valueOf():null},format:function(t,e){return fi(t).format(e)},add:function(t,e,n){return fi(t).add(e,n).valueOf()},diff:function(t,e,n){return fi(t).diff(fi(e),n)},startOf:function(t,e,n){return t=fi(t),"isoWeek"===e?t.isoWeekday(n).valueOf():t.startOf(e).valueOf()},endOf:function(t,e){return fi(t).endOf(e).valueOf()},_create:function(t){return fi(t)}}:{}),Y._set("global",{plugins:{filler:{propagate:!0}}});var mi={dataset:function(t){var e=t.fill,n=t.chart,i=n.getDatasetMeta(e),a=i&&n.isDatasetVisible(e)&&i.dataset._children||[],r=a.length||0;return r?function(t,e){return e<r&&a[e]._view||null}:null},boundary:function(t){var e=t.boundary,n=e?e.x:null,i=e?e.y:null;return B.isArray(e)?function(t,n){return e[n]}:function(t){return{x:null===n?t.x:n,y:null===i?t.y:i}}}};function pi(t,e,n){var i,a=t._model||{},r=a.fill;if(void 0===r&&(r=!!a.backgroundColor),!1===r||null===r)return!1;if(!0===r)return"origin";if(i=parseFloat(r,10),isFinite(i)&&Math.floor(i)===i)return"-"!==r[0]&&"+"!==r[0]||(i=e+i),!(i===e||i<0||i>=n)&&i;switch(r){case"bottom":return"start";case"top":return"end";case"zero":return"origin";case"origin":case"start":case"end":return r;default:return!1}}function vi(t){return(t.el._scale||{}).getPointPositionForValue?function(t){var e,n,i,a,r,o=t.el._scale,s=o.options,l=o.chart.data.labels.length,u=t.fill,d=[];if(!l)return null;for(e=s.ticks.reverse?o.max:o.min,n=s.ticks.reverse?o.min:o.max,i=o.getPointPositionForValue(0,e),a=0;a<l;++a)r="start"===u||"end"===u?o.getPointPositionForValue(a,"start"===u?e:n):o.getBasePosition(a),s.gridLines.circular&&(r.cx=i.x,r.cy=i.y,r.angle=o.getIndexAngle(a)-Math.PI/2),d.push(r);return d}(t):function(t){var e,n=t.el._model||{},i=t.el._scale||{},a=t.fill,r=null;if(isFinite(a))return null;if("start"===a?r=void 0===n.scaleBottom?i.bottom:n.scaleBottom:"end"===a?r=void 0===n.scaleTop?i.top:n.scaleTop:void 0!==n.scaleZero?r=n.scaleZero:i.getBasePixel&&(r=i.getBasePixel()),null!=r){if(void 0!==r.x&&void 0!==r.y)return r;if(B.isFinite(r))return{x:(e=i.isHorizontal())?r:null,y:e?null:r}}return null}(t)}function bi(t,e,n){var i,a=t[e].fill,r=[e];if(!n)return a;for(;!1!==a&&-1===r.indexOf(a);){if(!isFinite(a))return a;if(!(i=t[a]))return!1;if(i.visible)return a;r.push(a),a=i.fill}return!1}function yi(t){var e=t.fill,n="dataset";return!1===e?null:(isFinite(e)||(n="boundary"),mi[n](t))}function xi(t){return t&&!t.skip}function _i(t,e,n,i,a){var r,o,s,l;if(i&&a){for(t.moveTo(e[0].x,e[0].y),r=1;r<i;++r)B.canvas.lineTo(t,e[r-1],e[r]);if(void 0===n[0].angle)for(t.lineTo(n[a-1].x,n[a-1].y),r=a-1;r>0;--r)B.canvas.lineTo(t,n[r],n[r-1],!0);else for(o=n[0].cx,s=n[0].cy,l=Math.sqrt(Math.pow(n[0].x-o,2)+Math.pow(n[0].y-s,2)),r=a-1;r>0;--r)t.arc(o,s,l,n[r].angle,n[r-1].angle,!0)}}function wi(t,e,n,i,a,r){var o,s,l,u,d,h,c,f,g=e.length,m=i.spanGaps,p=[],v=[],b=0,y=0;for(t.beginPath(),o=0,s=g;o<s;++o)d=n(u=e[l=o%g]._view,l,i),h=xi(u),c=xi(d),r&&void 0===f&&h&&(s=g+(f=o+1)),h&&c?(b=p.push(u),y=v.push(d)):b&&y&&(m?(h&&p.push(u),c&&v.push(d)):(_i(t,p,v,b,y),b=y=0,p=[],v=[]));_i(t,p,v,b,y),t.closePath(),t.fillStyle=a,t.fill()}var ki={id:"filler",afterDatasetsUpdate:function(t,e){var n,i,a,r,o=(t.data.datasets||[]).length,s=e.propagate,l=[];for(i=0;i<o;++i)r=null,(a=(n=t.getDatasetMeta(i)).dataset)&&a._model&&a instanceof kt.Line&&(r={visible:t.isDatasetVisible(i),fill:pi(a,i,o),chart:t,el:a}),n.$filler=r,l.push(r);for(i=0;i<o;++i)(r=l[i])&&(r.fill=bi(l,i,s),r.boundary=vi(r),r.mapper=yi(r))},beforeDatasetsDraw:function(t){var e,n,i,a,r,o,s,l=t._getSortedVisibleDatasetMetas(),u=t.ctx;for(n=l.length-1;n>=0;--n)(e=l[n].$filler)&&e.visible&&(a=(i=e.el)._view,r=i._children||[],o=e.mapper,s=a.backgroundColor||Y.global.defaultColor,o&&s&&r.length&&(B.canvas.clipArea(u,t.chartArea),wi(u,r,o,a,s,i._loop),B.canvas.unclipArea(u)))}},Mi=B.rtl.getRtlAdapter,Si=B.noop,Di=B.valueOrDefault;function Ci(t,e){return t.usePointStyle&&t.boxWidth>e?e:t.boxWidth}Y._set("global",{legend:{display:!0,position:"top",align:"center",fullWidth:!0,reverse:!1,weight:1e3,onClick:function(t,e){var n=e.datasetIndex,i=this.chart,a=i.getDatasetMeta(n);a.hidden=null===a.hidden?!i.data.datasets[n].hidden:null,i.update()},onHover:null,onLeave:null,labels:{boxWidth:40,padding:10,generateLabels:function(t){var e=t.data.datasets,n=t.options.legend||{},i=n.labels&&n.labels.usePointStyle;return t._getSortedDatasetMetas().map(function(n){var a=n.controller.getStyle(i?0:void 0);return{text:e[n.index].label,fillStyle:a.backgroundColor,hidden:!t.isDatasetVisible(n.index),lineCap:a.borderCapStyle,lineDash:a.borderDash,lineDashOffset:a.borderDashOffset,lineJoin:a.borderJoinStyle,lineWidth:a.borderWidth,strokeStyle:a.borderColor,pointStyle:a.pointStyle,rotation:a.rotation,datasetIndex:n.index}},this)}}},legendCallback:function(t){var e,n,i,a=document.createElement("ul"),r=t.data.datasets;for(a.setAttribute("class",t.id+"-legend"),e=0,n=r.length;e<n;e++)(i=a.appendChild(document.createElement("li"))).appendChild(document.createElement("span")).style.backgroundColor=r[e].backgroundColor,r[e].label&&i.appendChild(document.createTextNode(r[e].label));return a.outerHTML}});var Pi=X.extend({initialize:function(t){var e=this;B.extend(e,t),e.legendHitBoxes=[],e._hoveredItem=null,e.doughnutMode=!1},beforeUpdate:Si,update:function(t,e,n){var i=this;return i.beforeUpdate(),i.maxWidth=t,i.maxHeight=e,i.margins=n,i.beforeSetDimensions(),i.setDimensions(),i.afterSetDimensions(),i.beforeBuildLabels(),i.buildLabels(),i.afterBuildLabels(),i.beforeFit(),i.fit(),i.afterFit(),i.afterUpdate(),i.minSize},afterUpdate:Si,beforeSetDimensions:Si,setDimensions:function(){var t=this;t.isHorizontal()?(t.width=t.maxWidth,t.left=0,t.right=t.width):(t.height=t.maxHeight,t.top=0,t.bottom=t.height),t.paddingLeft=0,t.paddingTop=0,t.paddingRight=0,t.paddingBottom=0,t.minSize={width:0,height:0}},afterSetDimensions:Si,beforeBuildLabels:Si,buildLabels:function(){var t=this,e=t.options.labels||{},n=B.callback(e.generateLabels,[t.chart],t)||[];e.filter&&(n=n.filter(function(n){return e.filter(n,t.chart.data)})),t.options.reverse&&n.reverse(),t.legendItems=n},afterBuildLabels:Si,beforeFit:Si,fit:function(){var t=this,e=t.options,n=e.labels,i=e.display,a=t.ctx,r=B.options._parseFont(n),o=r.size,s=t.legendHitBoxes=[],l=t.minSize,u=t.isHorizontal();if(u?(l.width=t.maxWidth,l.height=i?10:0):(l.width=i?10:0,l.height=t.maxHeight),i){if(a.font=r.string,u){var d=t.lineWidths=[0],h=0;a.textAlign="left",a.textBaseline="middle",B.each(t.legendItems,function(t,e){var i=Ci(n,o)+o/2+a.measureText(t.text).width;(0===e||d[d.length-1]+i+2*n.padding>l.width)&&(h+=o+n.padding,d[d.length-(e>0?0:1)]=0),s[e]={left:0,top:0,width:i,height:o},d[d.length-1]+=i+n.padding}),l.height+=h}else{var c=n.padding,f=t.columnWidths=[],g=t.columnHeights=[],m=n.padding,p=0,v=0;B.each(t.legendItems,function(t,e){var i=Ci(n,o)+o/2+a.measureText(t.text).width;e>0&&v+o+2*c>l.height&&(m+=p+n.padding,f.push(p),g.push(v),p=0,v=0),p=Math.max(p,i),v+=o+c,s[e]={left:0,top:0,width:i,height:o}}),m+=p,f.push(p),g.push(v),l.width+=m}t.width=l.width,t.height=l.height}else t.width=l.width=t.height=l.height=0},afterFit:Si,isHorizontal:function(){return"top"===this.options.position||"bottom"===this.options.position},draw:function(){var t=this,e=t.options,n=e.labels,i=Y.global,a=i.defaultColor,r=i.elements.line,o=t.height,s=t.columnHeights,l=t.width,u=t.lineWidths;if(e.display){var d,h=Mi(e.rtl,t.left,t.minSize.width),c=t.ctx,f=Di(n.fontColor,i.defaultFontColor),g=B.options._parseFont(n),m=g.size;c.textAlign=h.textAlign("left"),c.textBaseline="middle",c.lineWidth=.5,c.strokeStyle=f,c.fillStyle=f,c.font=g.string;var p=Ci(n,m),v=t.legendHitBoxes,b=function(t,i){switch(e.align){case"start":return n.padding;case"end":return t-i;default:return(t-i+n.padding)/2}},y=t.isHorizontal();d=y?{x:t.left+b(l,u[0]),y:t.top+n.padding,line:0}:{x:t.left+n.padding,y:t.top+b(o,s[0]),line:0},B.rtl.overrideTextDirection(t.ctx,e.textDirection);var x=m+n.padding;B.each(t.legendItems,function(e,i){var f=c.measureText(e.text).width,g=p+m/2+f,_=d.x,w=d.y;h.setWidth(t.minSize.width),y?i>0&&_+g+n.padding>t.left+t.minSize.width&&(w=d.y+=x,d.line++,_=d.x=t.left+b(l,u[d.line])):i>0&&w+x>t.top+t.minSize.height&&(_=d.x=_+t.columnWidths[d.line]+n.padding,d.line++,w=d.y=t.top+b(o,s[d.line]));var k=h.x(_);!function(t,e,i){if(!(isNaN(p)||p<=0)){c.save();var o=Di(i.lineWidth,r.borderWidth);if(c.fillStyle=Di(i.fillStyle,a),c.lineCap=Di(i.lineCap,r.borderCapStyle),c.lineDashOffset=Di(i.lineDashOffset,r.borderDashOffset),c.lineJoin=Di(i.lineJoin,r.borderJoinStyle),c.lineWidth=o,c.strokeStyle=Di(i.strokeStyle,a),c.setLineDash&&c.setLineDash(Di(i.lineDash,r.borderDash)),n&&n.usePointStyle){var s=p*Math.SQRT2/2,l=h.xPlus(t,p/2),u=e+m/2;B.canvas.drawPoint(c,i.pointStyle,s,l,u,i.rotation)}else c.fillRect(h.leftForLtr(t,p),e,p,m),0!==o&&c.strokeRect(h.leftForLtr(t,p),e,p,m);c.restore()}}(k,w,e),v[i].left=h.leftForLtr(k,v[i].width),v[i].top=w,function(t,e,n,i){var a=m/2,r=h.xPlus(t,p+a),o=e+a;c.fillText(n.text,r,o),n.hidden&&(c.beginPath(),c.lineWidth=2,c.moveTo(r,o),c.lineTo(h.xPlus(r,i),o),c.stroke())}(k,w,e,f),y?d.x+=g+n.padding:d.y+=x}),B.rtl.restoreTextDirection(t.ctx,e.textDirection)}},_getLegendItemAt:function(t,e){var n,i,a,r=this;if(t>=r.left&&t<=r.right&&e>=r.top&&e<=r.bottom)for(a=r.legendHitBoxes,n=0;n<a.length;++n)if(t>=(i=a[n]).left&&t<=i.left+i.width&&e>=i.top&&e<=i.top+i.height)return r.legendItems[n];return null},handleEvent:function(t){var e,n=this,i=n.options,a="mouseup"===t.type?"click":t.type;if("mousemove"===a){if(!i.onHover&&!i.onLeave)return}else{if("click"!==a)return;if(!i.onClick)return}e=n._getLegendItemAt(t.x,t.y),"click"===a?e&&i.onClick&&i.onClick.call(n,t.native,e):(i.onLeave&&e!==n._hoveredItem&&(n._hoveredItem&&i.onLeave.call(n,t.native,n._hoveredItem),n._hoveredItem=e),i.onHover&&e&&i.onHover.call(n,t.native,e))}});function Ti(t,e){var n=new Pi({ctx:t.ctx,options:e,chart:t});pe.configure(t,n,e),pe.addBox(t,n),t.legend=n}var Oi={id:"legend",_element:Pi,beforeInit:function(t){var e=t.options.legend;e&&Ti(t,e)},beforeUpdate:function(t){var e=t.options.legend,n=t.legend;e?(B.mergeIf(e,Y.global.legend),n?(pe.configure(t,n,e),n.options=e):Ti(t,e)):n&&(pe.removeBox(t,n),delete t.legend)},afterEvent:function(t,e){var n=t.legend;n&&n.handleEvent(e)}},Ai=B.noop;Y._set("global",{title:{display:!1,fontStyle:"bold",fullWidth:!0,padding:10,position:"top",text:"",weight:2e3}});var Fi=X.extend({initialize:function(t){B.extend(this,t),this.legendHitBoxes=[]},beforeUpdate:Ai,update:function(t,e,n){var i=this;return i.beforeUpdate(),i.maxWidth=t,i.maxHeight=e,i.margins=n,i.beforeSetDimensions(),i.setDimensions(),i.afterSetDimensions(),i.beforeBuildLabels(),i.buildLabels(),i.afterBuildLabels(),i.beforeFit(),i.fit(),i.afterFit(),i.afterUpdate(),i.minSize},afterUpdate:Ai,beforeSetDimensions:Ai,setDimensions:function(){var t=this;t.isHorizontal()?(t.width=t.maxWidth,t.left=0,t.right=t.width):(t.height=t.maxHeight,t.top=0,t.bottom=t.height),t.paddingLeft=0,t.paddingTop=0,t.paddingRight=0,t.paddingBottom=0,t.minSize={width:0,height:0}},afterSetDimensions:Ai,beforeBuildLabels:Ai,buildLabels:Ai,afterBuildLabels:Ai,beforeFit:Ai,fit:function(){var t,e=this,n=e.options,i=e.minSize={},a=e.isHorizontal();n.display?(t=(B.isArray(n.text)?n.text.length:1)*B.options._parseFont(n).lineHeight+2*n.padding,e.width=i.width=a?e.maxWidth:t,e.height=i.height=a?t:e.maxHeight):e.width=i.width=e.height=i.height=0},afterFit:Ai,isHorizontal:function(){var t=this.options.position;return"top"===t||"bottom"===t},draw:function(){var t=this,e=t.ctx,n=t.options;if(n.display){var i,a,r,o=B.options._parseFont(n),s=o.lineHeight,l=s/2+n.padding,u=0,d=t.top,h=t.left,c=t.bottom,f=t.right;e.fillStyle=B.valueOrDefault(n.fontColor,Y.global.defaultFontColor),e.font=o.string,t.isHorizontal()?(a=h+(f-h)/2,r=d+l,i=f-h):(a="left"===n.position?h+l:f-l,r=d+(c-d)/2,i=c-d,u=Math.PI*("left"===n.position?-.5:.5)),e.save(),e.translate(a,r),e.rotate(u),e.textAlign="center",e.textBaseline="middle";var g=n.text;if(B.isArray(g))for(var m=0,p=0;p<g.length;++p)e.fillText(g[p],0,m,i),m+=s;else e.fillText(g,0,0,i);e.restore()}}});function Ii(t,e){var n=new Fi({ctx:t.ctx,options:e,chart:t});pe.configure(t,n,e),pe.addBox(t,n),t.titleBlock=n}var Li={},Ri=ki,Ni=Oi,Wi={id:"title",_element:Fi,beforeInit:function(t){var e=t.options.title;e&&Ii(t,e)},beforeUpdate:function(t){var e=t.options.title,n=t.titleBlock;e?(B.mergeIf(e,Y.global.title),n?(pe.configure(t,n,e),n.options=e):Ii(t,e)):n&&(pe.removeBox(t,n),delete t.titleBlock)}};for(var Yi in Li.filler=Ri,Li.legend=Ni,Li.title=Wi,tn.helpers=B,function(){function t(t,e,n){var i;return"string"==typeof t?(i=parseInt(t,10),-1!==t.indexOf("%")&&(i=i/100*e.parentNode[n])):i=t,i}function e(t){return null!=t&&"none"!==t}function n(n,i,a){var r=document.defaultView,o=B._getParentNode(n),s=r.getComputedStyle(n)[i],l=r.getComputedStyle(o)[i],u=e(s),d=e(l),h=Number.POSITIVE_INFINITY;return u||d?Math.min(u?t(s,n,a):h,d?t(l,o,a):h):"none"}B.where=function(t,e){if(B.isArray(t)&&Array.prototype.filter)return t.filter(e);var n=[];return B.each(t,function(t){e(t)&&n.push(t)}),n},B.findIndex=Array.prototype.findIndex?function(t,e,n){return t.findIndex(e,n)}:function(t,e,n){n=void 0===n?t:n;for(var i=0,a=t.length;i<a;++i)if(e.call(n,t[i],i,t))return i;return-1},B.findNextWhere=function(t,e,n){B.isNullOrUndef(n)&&(n=-1);for(var i=n+1;i<t.length;i++){var a=t[i];if(e(a))return a}},B.findPreviousWhere=function(t,e,n){B.isNullOrUndef(n)&&(n=t.length);for(var i=n-1;i>=0;i--){var a=t[i];if(e(a))return a}},B.isNumber=function(t){return!isNaN(parseFloat(t))&&isFinite(t)},B.almostEquals=function(t,e,n){return Math.abs(t-e)<n},B.almostWhole=function(t,e){var n=Math.round(t);return n-e<=t&&n+e>=t},B.max=function(t){return t.reduce(function(t,e){return isNaN(e)?t:Math.max(t,e)},Number.NEGATIVE_INFINITY)},B.min=function(t){return t.reduce(function(t,e){return isNaN(e)?t:Math.min(t,e)},Number.POSITIVE_INFINITY)},B.sign=Math.sign?function(t){return Math.sign(t)}:function(t){return 0===(t=+t)||isNaN(t)?t:t>0?1:-1},B.toRadians=function(t){return t*(Math.PI/180)},B.toDegrees=function(t){return t*(180/Math.PI)},B._decimalPlaces=function(t){if(B.isFinite(t)){for(var e=1,n=0;Math.round(t*e)/e!==t;)e*=10,n++;return n}},B.getAngleFromPoint=function(t,e){var n=e.x-t.x,i=e.y-t.y,a=Math.sqrt(n*n+i*i),r=Math.atan2(i,n);return r<-.5*Math.PI&&(r+=2*Math.PI),{angle:r,distance:a}},B.distanceBetweenPoints=function(t,e){return Math.sqrt(Math.pow(e.x-t.x,2)+Math.pow(e.y-t.y,2))},B.aliasPixel=function(t){return t%2==0?0:.5},B._alignPixel=function(t,e,n){var i=t.currentDevicePixelRatio,a=n/2;return Math.round((e-a)*i)/i+a},B.splineCurve=function(t,e,n,i){var a=t.skip?e:t,r=e,o=n.skip?e:n,s=Math.sqrt(Math.pow(r.x-a.x,2)+Math.pow(r.y-a.y,2)),l=Math.sqrt(Math.pow(o.x-r.x,2)+Math.pow(o.y-r.y,2)),u=s/(s+l),d=l/(s+l),h=i*(u=isNaN(u)?0:u),c=i*(d=isNaN(d)?0:d);return{previous:{x:r.x-h*(o.x-a.x),y:r.y-h*(o.y-a.y)},next:{x:r.x+c*(o.x-a.x),y:r.y+c*(o.y-a.y)}}},B.EPSILON=Number.EPSILON||1e-14,B.splineCurveMonotone=function(t){var e,n,i,a,r,o,s,l,u,d=(t||[]).map(function(t){return{model:t._model,deltaK:0,mK:0}}),h=d.length;for(e=0;e<h;++e)if(!(i=d[e]).model.skip){if(n=e>0?d[e-1]:null,(a=e<h-1?d[e+1]:null)&&!a.model.skip){var c=a.model.x-i.model.x;i.deltaK=0!==c?(a.model.y-i.model.y)/c:0}!n||n.model.skip?i.mK=i.deltaK:!a||a.model.skip?i.mK=n.deltaK:this.sign(n.deltaK)!==this.sign(i.deltaK)?i.mK=0:i.mK=(n.deltaK+i.deltaK)/2}for(e=0;e<h-1;++e)i=d[e],a=d[e+1],i.model.skip||a.model.skip||(B.almostEquals(i.deltaK,0,this.EPSILON)?i.mK=a.mK=0:(r=i.mK/i.deltaK,o=a.mK/i.deltaK,(l=Math.pow(r,2)+Math.pow(o,2))<=9||(s=3/Math.sqrt(l),i.mK=r*s*i.deltaK,a.mK=o*s*i.deltaK)));for(e=0;e<h;++e)(i=d[e]).model.skip||(n=e>0?d[e-1]:null,a=e<h-1?d[e+1]:null,n&&!n.model.skip&&(u=(i.model.x-n.model.x)/3,i.model.controlPointPreviousX=i.model.x-u,i.model.controlPointPreviousY=i.model.y-u*i.mK),a&&!a.model.skip&&(u=(a.model.x-i.model.x)/3,i.model.controlPointNextX=i.model.x+u,i.model.controlPointNextY=i.model.y+u*i.mK))},B.nextItem=function(t,e,n){return n?e>=t.length-1?t[0]:t[e+1]:e>=t.length-1?t[t.length-1]:t[e+1]},B.previousItem=function(t,e,n){return n?e<=0?t[t.length-1]:t[e-1]:e<=0?t[0]:t[e-1]},B.niceNum=function(t,e){var n=Math.floor(B.log10(t)),i=t/Math.pow(10,n);return(e?i<1.5?1:i<3?2:i<7?5:10:i<=1?1:i<=2?2:i<=5?5:10)*Math.pow(10,n)},B.requestAnimFrame="undefined"==typeof window?function(t){t()}:window.requestAnimationFrame||window.webkitRequestAnimationFrame||window.mozRequestAnimationFrame||window.oRequestAnimationFrame||window.msRequestAnimationFrame||function(t){return window.setTimeout(t,1e3/60)},B.getRelativePosition=function(t,e){var n,i,a=t.originalEvent||t,r=t.target||t.srcElement,o=r.getBoundingClientRect(),s=a.touches;s&&s.length>0?(n=s[0].clientX,i=s[0].clientY):(n=a.clientX,i=a.clientY);var l=parseFloat(B.getStyle(r,"padding-left")),u=parseFloat(B.getStyle(r,"padding-top")),d=parseFloat(B.getStyle(r,"padding-right")),h=parseFloat(B.getStyle(r,"padding-bottom")),c=o.right-o.left-l-d,f=o.bottom-o.top-u-h;return{x:n=Math.round((n-o.left-l)/c*r.width/e.currentDevicePixelRatio),y:i=Math.round((i-o.top-u)/f*r.height/e.currentDevicePixelRatio)}},B.getConstraintWidth=function(t){return n(t,"max-width","clientWidth")},B.getConstraintHeight=function(t){return n(t,"max-height","clientHeight")},B._calculatePadding=function(t,e,n){return(e=B.getStyle(t,e)).indexOf("%")>-1?n*parseInt(e,10)/100:parseInt(e,10)},B._getParentNode=function(t){var e=t.parentNode;return e&&"[object ShadowRoot]"===e.toString()&&(e=e.host),e},B.getMaximumWidth=function(t){var e=B._getParentNode(t);if(!e)return t.clientWidth;var n=e.clientWidth,i=n-B._calculatePadding(e,"padding-left",n)-B._calculatePadding(e,"padding-right",n),a=B.getConstraintWidth(t);return isNaN(a)?i:Math.min(i,a)},B.getMaximumHeight=function(t){var e=B._getParentNode(t);if(!e)return t.clientHeight;var n=e.clientHeight,i=n-B._calculatePadding(e,"padding-top",n)-B._calculatePadding(e,"padding-bottom",n),a=B.getConstraintHeight(t);return isNaN(a)?i:Math.min(i,a)},B.getStyle=function(t,e){return t.currentStyle?t.currentStyle[e]:document.defaultView.getComputedStyle(t,null).getPropertyValue(e)},B.retinaScale=function(t,e){var n=t.currentDevicePixelRatio=e||"undefined"!=typeof window&&window.devicePixelRatio||1;if(1!==n){var i=t.canvas,a=t.height,r=t.width;i.height=a*n,i.width=r*n,t.ctx.scale(n,n),i.style.height||i.style.width||(i.style.height=a+"px",i.style.width=r+"px")}},B.fontString=function(t,e,n){return e+" "+t+"px "+n},B.longestText=function(t,e,n,i){var a=(i=i||{}).data=i.data||{},r=i.garbageCollect=i.garbageCollect||[];i.font!==e&&(a=i.data={},r=i.garbageCollect=[],i.font=e),t.font=e;var o,s,l,u,d,h=0,c=n.length;for(o=0;o<c;o++)if(null!=(u=n[o])&&!0!==B.isArray(u))h=B.measureText(t,a,r,h,u);else if(B.isArray(u))for(s=0,l=u.length;s<l;s++)null==(d=u[s])||B.isArray(d)||(h=B.measureText(t,a,r,h,d));var f=r.length/2;if(f>n.length){for(o=0;o<f;o++)delete a[r[o]];r.splice(0,f)}return h},B.measureText=function(t,e,n,i,a){var r=e[a];return r||(r=e[a]=t.measureText(a).width,n.push(a)),r>i&&(i=r),i},B.numberOfLabelLines=function(t){var e=1;return B.each(t,function(t){B.isArray(t)&&t.length>e&&(e=t.length)}),e},B.color=w?function(t){return t instanceof CanvasGradient&&(t=Y.global.defaultColor),w(t)}:function(t){return console.error("Color.js not found!"),t},B.getHoverColor=function(t){return t instanceof CanvasPattern||t instanceof CanvasGradient?t:B.color(t).saturate(.5).darken(.1).rgbString()}}(),tn._adapters=an,tn.Animation=J,tn.animationService=Q,tn.controllers=Qt,tn.DatasetController=at,tn.defaults=Y,tn.Element=X,tn.elements=kt,tn.Interaction=oe,tn.layouts=pe,tn.platform=Fe,tn.plugins=Ie,tn.Scale=yn,tn.scaleService=Le,tn.Ticks=rn,tn.Tooltip=Ue,tn.helpers.each(ci,function(t,e){tn.scaleService.registerScaleType(e,t,t._defaults)}),Li)Li.hasOwnProperty(Yi)&&tn.plugins.register(Li[Yi]);tn.platform.initialize();var zi=tn;return"undefined"!=typeof window&&(window.Chart=tn),tn.Chart=tn,tn.Legend=Li.legend._element,tn.Title=Li.title._element,tn.pluginService=tn.plugins,tn.PluginBase=tn.Element.extend({}),tn.canvasHelpers=tn.helpers.canvas,tn.layoutService=tn.layouts,tn.LinearScaleBase=Sn,tn.helpers.each(["Bar","Bubble","Doughnut","Line","PolarArea","Radar","Scatter"],function(t){tn[t]=function(e,n){return new tn(e,tn.helpers.merge(n||{},{type:t.charAt(0).toLowerCase()+t.slice(1)}))}}),zi});
\ No newline at end of file
diff --git a/ceph/src/pybind/mgr/dashboard/frontend/dist/en-US/scripts.cfd741a72b67f696.js b/ceph/src/pybind/mgr/dashboard/frontend/dist/en-US/scripts.cfd741a72b67f696.js
new file mode 100644 (file)
index 0000000..91c6ea3
--- /dev/null
@@ -0,0 +1 @@
+!function(St,Dt){"object"==typeof exports&&"undefined"!=typeof module?module.exports=Dt():"function"==typeof define&&define.amd?define(Dt):(St=St||self).Chart=Dt()}(this,function(){"use strict";function za(e,t){return e(t={exports:{}},t.exports),t.exports}"undefined"!=typeof globalThis?globalThis:"undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof self&&self;var Xe={aliceblue:[240,248,255],antiquewhite:[250,235,215],aqua:[0,255,255],aquamarine:[127,255,212],azure:[240,255,255],beige:[245,245,220],bisque:[255,228,196],black:[0,0,0],blanchedalmond:[255,235,205],blue:[0,0,255],blueviolet:[138,43,226],brown:[165,42,42],burlywood:[222,184,135],cadetblue:[95,158,160],chartreuse:[127,255,0],chocolate:[210,105,30],coral:[255,127,80],cornflowerblue:[100,149,237],cornsilk:[255,248,220],crimson:[220,20,60],cyan:[0,255,255],darkblue:[0,0,139],darkcyan:[0,139,139],darkgoldenrod:[184,134,11],darkgray:[169,169,169],darkgreen:[0,100,0],darkgrey:[169,169,169],darkkhaki:[189,183,107],darkmagenta:[139,0,139],darkolivegreen:[85,107,47],darkorange:[255,140,0],darkorchid:[153,50,204],darkred:[139,0,0],darksalmon:[233,150,122],darkseagreen:[143,188,143],darkslateblue:[72,61,139],darkslategray:[47,79,79],darkslategrey:[47,79,79],darkturquoise:[0,206,209],darkviolet:[148,0,211],deeppink:[255,20,147],deepskyblue:[0,191,255],dimgray:[105,105,105],dimgrey:[105,105,105],dodgerblue:[30,144,255],firebrick:[178,34,34],floralwhite:[255,250,240],forestgreen:[34,139,34],fuchsia:[255,0,255],gainsboro:[220,220,220],ghostwhite:[248,248,255],gold:[255,215,0],goldenrod:[218,165,32],gray:[128,128,128],green:[0,128,0],greenyellow:[173,255,47],grey:[128,128,128],honeydew:[240,255,240],hotpink:[255,105,180],indianred:[205,92,92],indigo:[75,0,130],ivory:[255,255,240],khaki:[240,230,140],lavender:[230,230,250],lavenderblush:[255,240,245],lawngreen:[124,252,0],lemonchiffon:[255,250,205],lightblue:[173,216,230],lightcoral:[240,128,128],lightcyan:[224,255,255],lightgoldenrodyellow:[250,250,210],lightgray:[211,211,211],lightgreen:[144,238,144],lightgrey:[211,211,211],lightpink:[255,182,193],lightsalmon:[255,160,122],lightseagreen:[32,178,170],lightskyblue:[135,206,250],lightslategray:[119,136,153],lightslategrey:[119,136,153],lightsteelblue:[176,196,222],lightyellow:[255,255,224],lime:[0,255,0],limegreen:[50,205,50],linen:[250,240,230],magenta:[255,0,255],maroon:[128,0,0],mediumaquamarine:[102,205,170],mediumblue:[0,0,205],mediumorchid:[186,85,211],mediumpurple:[147,112,219],mediumseagreen:[60,179,113],mediumslateblue:[123,104,238],mediumspringgreen:[0,250,154],mediumturquoise:[72,209,204],mediumvioletred:[199,21,133],midnightblue:[25,25,112],mintcream:[245,255,250],mistyrose:[255,228,225],moccasin:[255,228,181],navajowhite:[255,222,173],navy:[0,0,128],oldlace:[253,245,230],olive:[128,128,0],olivedrab:[107,142,35],orange:[255,165,0],orangered:[255,69,0],orchid:[218,112,214],palegoldenrod:[238,232,170],palegreen:[152,251,152],paleturquoise:[175,238,238],palevioletred:[219,112,147],papayawhip:[255,239,213],peachpuff:[255,218,185],peru:[205,133,63],pink:[255,192,203],plum:[221,160,221],powderblue:[176,224,230],purple:[128,0,128],rebeccapurple:[102,51,153],red:[255,0,0],rosybrown:[188,143,143],royalblue:[65,105,225],saddlebrown:[139,69,19],salmon:[250,128,114],sandybrown:[244,164,96],seagreen:[46,139,87],seashell:[255,245,238],sienna:[160,82,45],silver:[192,192,192],skyblue:[135,206,235],slateblue:[106,90,205],slategray:[112,128,144],slategrey:[112,128,144],snow:[255,250,250],springgreen:[0,255,127],steelblue:[70,130,180],tan:[210,180,140],teal:[0,128,128],thistle:[216,191,216],tomato:[255,99,71],turquoise:[64,224,208],violet:[238,130,238],wheat:[245,222,179],white:[255,255,255],whitesmoke:[245,245,245],yellow:[255,255,0],yellowgreen:[154,205,50]},K=za(function(e){var t={};for(var r in Xe)Xe.hasOwnProperty(r)&&(t[Xe[r]]=r);var a=e.exports={rgb:{channels:3,labels:"rgb"},hsl:{channels:3,labels:"hsl"},hsv:{channels:3,labels:"hsv"},hwb:{channels:3,labels:"hwb"},cmyk:{channels:4,labels:"cmyk"},xyz:{channels:3,labels:"xyz"},lab:{channels:3,labels:"lab"},lch:{channels:3,labels:"lch"},hex:{channels:1,labels:["hex"]},keyword:{channels:1,labels:["keyword"]},ansi16:{channels:1,labels:["ansi16"]},ansi256:{channels:1,labels:["ansi256"]},hcg:{channels:3,labels:["h","c","g"]},apple:{channels:3,labels:["r16","g16","b16"]},gray:{channels:1,labels:["gray"]}};for(var n in a)if(a.hasOwnProperty(n)){if(!("channels"in a[n]))throw new Error("missing channels property: "+n);if(!("labels"in a[n]))throw new Error("missing channel labels property: "+n);if(a[n].labels.length!==a[n].channels)throw new Error("channel and label counts mismatch: "+n);var o=a[n].channels,s=a[n].labels;delete a[n].channels,delete a[n].labels,Object.defineProperty(a[n],"channels",{value:o}),Object.defineProperty(a[n],"labels",{value:s})}function d(l,f){return Math.pow(l[0]-f[0],2)+Math.pow(l[1]-f[1],2)+Math.pow(l[2]-f[2],2)}a.rgb.hsl=function(l){var w,M,f=l[0]/255,c=l[1]/255,v=l[2]/255,p=Math.min(f,c,v),y=Math.max(f,c,v),_=y-p;return y===p?w=0:f===y?w=(c-v)/_:c===y?w=2+(v-f)/_:v===y&&(w=4+(f-c)/_),(w=Math.min(60*w,360))<0&&(w+=360),M=(p+y)/2,[w,100*(y===p?0:M<=.5?_/(y+p):_/(2-y-p)),100*M]},a.rgb.hsv=function(l){var f,c,v,p,y,_=l[0]/255,w=l[1]/255,x=l[2]/255,M=Math.max(_,w,x),T=M-Math.min(_,w,x),C=function(I){return(M-I)/6/T+.5};return 0===T?p=y=0:(y=T/M,f=C(_),c=C(w),v=C(x),_===M?p=v-c:w===M?p=1/3+f-v:x===M&&(p=2/3+c-f),p<0?p+=1:p>1&&(p-=1)),[360*p,100*y,100*M]},a.rgb.hwb=function(l){var f=l[0],c=l[1],v=l[2];return[a.rgb.hsl(l)[0],1/255*Math.min(f,Math.min(c,v))*100,100*(v=1-1/255*Math.max(f,Math.max(c,v)))]},a.rgb.cmyk=function(l){var w,f=l[0]/255,c=l[1]/255,v=l[2]/255;return[100*((1-f-(w=Math.min(1-f,1-c,1-v)))/(1-w)||0),100*((1-c-w)/(1-w)||0),100*((1-v-w)/(1-w)||0),100*w]},a.rgb.keyword=function(l){var f=t[l];if(f)return f;var v,c=1/0;for(var p in Xe)if(Xe.hasOwnProperty(p)){var _=d(l,Xe[p]);_<c&&(c=_,v=p)}return v},a.keyword.rgb=function(l){return Xe[l]},a.rgb.xyz=function(l){var f=l[0]/255,c=l[1]/255,v=l[2]/255;return[100*(.4124*(f=f>.04045?Math.pow((f+.055)/1.055,2.4):f/12.92)+.3576*(c=c>.04045?Math.pow((c+.055)/1.055,2.4):c/12.92)+.1805*(v=v>.04045?Math.pow((v+.055)/1.055,2.4):v/12.92)),100*(.2126*f+.7152*c+.0722*v),100*(.0193*f+.1192*c+.9505*v)]},a.rgb.lab=function(l){var f=a.rgb.xyz(l),c=f[0],v=f[1],p=f[2];return v/=100,p/=108.883,c=(c/=95.047)>.008856?Math.pow(c,1/3):7.787*c+16/116,[116*(v=v>.008856?Math.pow(v,1/3):7.787*v+16/116)-16,500*(c-v),200*(v-(p=p>.008856?Math.pow(p,1/3):7.787*p+16/116))]},a.hsl.rgb=function(l){var p,y,_,w,x,f=l[0]/360,c=l[1]/100,v=l[2]/100;if(0===c)return[x=255*v,x,x];p=2*v-(y=v<.5?v*(1+c):v+c-v*c),w=[0,0,0];for(var M=0;M<3;M++)(_=f+1/3*-(M-1))<0&&_++,_>1&&_--,w[M]=255*(x=6*_<1?p+6*(y-p)*_:2*_<1?y:3*_<2?p+(y-p)*(2/3-_)*6:p);return w},a.hsl.hsv=function(l){var f=l[0],c=l[1]/100,v=l[2]/100,p=c,y=Math.max(v,.01);return c*=(v*=2)<=1?v:2-v,p*=y<=1?y:2-y,[f,100*(0===v?2*p/(y+p):2*c/(v+c)),(v+c)/2*100]},a.hsv.rgb=function(l){var f=l[0]/60,c=l[1]/100,v=l[2]/100,p=Math.floor(f)%6,y=f-Math.floor(f),_=255*v*(1-c),w=255*v*(1-c*y),x=255*v*(1-c*(1-y));switch(v*=255,p){case 0:return[v,x,_];case 1:return[w,v,_];case 2:return[_,v,x];case 3:return[_,w,v];case 4:return[x,_,v];case 5:return[v,_,w]}},a.hsv.hsl=function(l){var y,_,w,f=l[0],c=l[1]/100,v=l[2]/100,p=Math.max(v,.01);return w=(2-c)*v,_=c*p,[f,100*(_=(_/=(y=(2-c)*p)<=1?y:2-y)||0),100*(w/=2)]},a.hwb.rgb=function(l){var y,_,w,x,M,T,C,f=l[0]/360,c=l[1]/100,v=l[2]/100,p=c+v;switch(p>1&&(c/=p,v/=p),w=6*f-(y=Math.floor(6*f)),0!=(1&y)&&(w=1-w),x=c+w*((_=1-v)-c),y){default:case 6:case 0:M=_,T=x,C=c;break;case 1:M=x,T=_,C=c;break;case 2:M=c,T=_,C=x;break;case 3:M=c,T=x,C=_;break;case 4:M=x,T=c,C=_;break;case 5:M=_,T=c,C=x}return[255*M,255*T,255*C]},a.cmyk.rgb=function(l){var c=l[1]/100,v=l[2]/100,p=l[3]/100;return[255*(1-Math.min(1,l[0]/100*(1-p)+p)),255*(1-Math.min(1,c*(1-p)+p)),255*(1-Math.min(1,v*(1-p)+p))]},a.xyz.rgb=function(l){var p,y,_,f=l[0]/100,c=l[1]/100,v=l[2]/100;return y=-.9689*f+1.8758*c+.0415*v,_=.0557*f+-.204*c+1.057*v,p=(p=3.2406*f+-1.5372*c+-.4986*v)>.0031308?1.055*Math.pow(p,1/2.4)-.055:12.92*p,y=y>.0031308?1.055*Math.pow(y,1/2.4)-.055:12.92*y,_=_>.0031308?1.055*Math.pow(_,1/2.4)-.055:12.92*_,[255*(p=Math.min(Math.max(0,p),1)),255*(y=Math.min(Math.max(0,y),1)),255*(_=Math.min(Math.max(0,_),1))]},a.xyz.lab=function(l){var f=l[0],c=l[1],v=l[2];return c/=100,v/=108.883,f=(f/=95.047)>.008856?Math.pow(f,1/3):7.787*f+16/116,[116*(c=c>.008856?Math.pow(c,1/3):7.787*c+16/116)-16,500*(f-c),200*(c-(v=v>.008856?Math.pow(v,1/3):7.787*v+16/116))]},a.lab.xyz=function(l){var p,y,_;p=l[1]/500+(y=(l[0]+16)/116),_=y-l[2]/200;var w=Math.pow(y,3),x=Math.pow(p,3),M=Math.pow(_,3);return y=w>.008856?w:(y-16/116)/7.787,p=x>.008856?x:(p-16/116)/7.787,_=M>.008856?M:(_-16/116)/7.787,[p*=95.047,y*=100,_*=108.883]},a.lab.lch=function(l){var y,f=l[0],c=l[1],v=l[2];return(y=360*Math.atan2(v,c)/2/Math.PI)<0&&(y+=360),[f,Math.sqrt(c*c+v*v),y]},a.lch.lab=function(l){var _,c=l[1];return _=l[2]/360*2*Math.PI,[l[0],c*Math.cos(_),c*Math.sin(_)]},a.rgb.ansi16=function(l){var f=l[0],c=l[1],v=l[2],p=1 in arguments?arguments[1]:a.rgb.hsv(l)[2];if(0===(p=Math.round(p/50)))return 30;var y=30+(Math.round(v/255)<<2|Math.round(c/255)<<1|Math.round(f/255));return 2===p&&(y+=60),y},a.hsv.ansi16=function(l){return a.rgb.ansi16(a.hsv.rgb(l),l[2])},a.rgb.ansi256=function(l){var f=l[0],c=l[1],v=l[2];return f===c&&c===v?f<8?16:f>248?231:Math.round((f-8)/247*24)+232:16+36*Math.round(f/255*5)+6*Math.round(c/255*5)+Math.round(v/255*5)},a.ansi16.rgb=function(l){var f=l%10;if(0===f||7===f)return l>50&&(f+=3.5),[f=f/10.5*255,f,f];var c=.5*(1+~~(l>50));return[(1&f)*c*255,(f>>1&1)*c*255,(f>>2&1)*c*255]},a.ansi256.rgb=function(l){if(l>=232){var f=10*(l-232)+8;return[f,f,f]}var c;return l-=16,[Math.floor(l/36)/5*255,Math.floor((c=l%36)/6)/5*255,c%6/5*255]},a.rgb.hex=function(l){var c=(((255&Math.round(l[0]))<<16)+((255&Math.round(l[1]))<<8)+(255&Math.round(l[2]))).toString(16).toUpperCase();return"000000".substring(c.length)+c},a.hex.rgb=function(l){var f=l.toString(16).match(/[a-f0-9]{6}|[a-f0-9]{3}/i);if(!f)return[0,0,0];var c=f[0];3===f[0].length&&(c=c.split("").map(function(w){return w+w}).join(""));var v=parseInt(c,16);return[v>>16&255,v>>8&255,255&v]},a.rgb.hcg=function(l){var x,f=l[0]/255,c=l[1]/255,v=l[2]/255,p=Math.max(Math.max(f,c),v),y=Math.min(Math.min(f,c),v),_=p-y;return x=_<=0?0:p===f?(c-v)/_%6:p===c?2+(v-f)/_:4+(f-c)/_+4,x/=6,[360*(x%=1),100*_,100*(_<1?y/(1-_):0)]},a.hsl.hcg=function(l){var v,f=l[1]/100,c=l[2]/100,p=0;return(v=c<.5?2*f*c:2*f*(1-c))<1&&(p=(c-.5*v)/(1-v)),[l[0],100*v,100*p]},a.hsv.hcg=function(l){var c=l[2]/100,v=l[1]/100*c,p=0;return v<1&&(p=(c-v)/(1-v)),[l[0],100*v,100*p]},a.hcg.rgb=function(l){var c=l[1]/100,v=l[2]/100;if(0===c)return[255*v,255*v,255*v];var x,p=[0,0,0],y=l[0]/360%1*6,_=y%1,w=1-_;switch(Math.floor(y)){case 0:p[0]=1,p[1]=_,p[2]=0;break;case 1:p[0]=w,p[1]=1,p[2]=0;break;case 2:p[0]=0,p[1]=1,p[2]=_;break;case 3:p[0]=0,p[1]=w,p[2]=1;break;case 4:p[0]=_,p[1]=0,p[2]=1;break;default:p[0]=1,p[1]=0,p[2]=w}return[255*(c*p[0]+(x=(1-c)*v)),255*(c*p[1]+x),255*(c*p[2]+x)]},a.hcg.hsv=function(l){var f=l[1]/100,v=f+l[2]/100*(1-f),p=0;return v>0&&(p=f/v),[l[0],100*p,100*v]},a.hcg.hsl=function(l){var f=l[1]/100,v=l[2]/100*(1-f)+.5*f,p=0;return v>0&&v<.5?p=f/(2*v):v>=.5&&v<1&&(p=f/(2*(1-v))),[l[0],100*p,100*v]},a.hcg.hwb=function(l){var f=l[1]/100,v=f+l[2]/100*(1-f);return[l[0],100*(v-f),100*(1-v)]},a.hwb.hcg=function(l){var v=1-l[2]/100,p=v-l[1]/100,y=0;return p<1&&(y=(v-p)/(1-p)),[l[0],100*p,100*y]},a.apple.rgb=function(l){return[l[0]/65535*255,l[1]/65535*255,l[2]/65535*255]},a.rgb.apple=function(l){return[l[0]/255*65535,l[1]/255*65535,l[2]/255*65535]},a.gray.rgb=function(l){return[l[0]/100*255,l[0]/100*255,l[0]/100*255]},a.gray.hsl=a.gray.hsv=function(l){return[0,0,l[0]]},a.gray.hwb=function(l){return[0,100,l[0]]},a.gray.cmyk=function(l){return[0,0,0,l[0]]},a.gray.lab=function(l){return[l[0],0,0]},a.gray.hex=function(l){var f=255&Math.round(l[0]/100*255),v=((f<<16)+(f<<8)+f).toString(16).toUpperCase();return"000000".substring(v.length)+v},a.rgb.gray=function(l){return[(l[0]+l[1]+l[2])/3/255*100]}});function Vi(e,t){return function(r){return t(e(r))}}function Ui(e,t){for(var r=[t[e].parent,e],a=K[t[e].parent][e],n=t[e].parent;t[n].parent;)r.unshift(t[n].parent),a=Vi(K[t[n].parent][n],a),n=t[n].parent;return a.conversion=r,a}var ft={};Object.keys(K).forEach(function(e){ft[e]={},Object.defineProperty(ft[e],"channels",{value:K[e].channels}),Object.defineProperty(ft[e],"labels",{value:K[e].labels});var t=function(e){for(var t=function Hi(e){var t=function Bi(){for(var e={},t=Object.keys(K),r=t.length,a=0;a<r;a++)e[t[a]]={distance:-1,parent:null};return e}(),r=[e];for(t[e].distance=0;r.length;)for(var a=r.pop(),n=Object.keys(K[a]),o=n.length,s=0;s<o;s++){var d=n[s],l=t[d];-1===l.distance&&(l.distance=t[a].distance+1,l.parent=a,r.unshift(d))}return t}(e),r={},a=Object.keys(t),n=a.length,o=0;o<n;o++){var s=a[o];null!==t[s].parent&&(r[s]=Ui(s,t))}return r}(e);Object.keys(t).forEach(function(a){var n=t[a];ft[e][a]=function qi(e){var t=function(r){if(null==r)return r;arguments.length>1&&(r=Array.prototype.slice.call(arguments));var a=e(r);if("object"==typeof a)for(var n=a.length,o=0;o<n;o++)a[o]=Math.round(a[o]);return a};return"conversion"in e&&(t.conversion=e.conversion),t}(n),ft[e][a].raw=function $i(e){var t=function(r){return null==r?r:(arguments.length>1&&(r=Array.prototype.slice.call(arguments)),e(r))};return"conversion"in e&&(t.conversion=e.conversion),t}(n)})});var Zi=ft,Fr={aliceblue:[240,248,255],antiquewhite:[250,235,215],aqua:[0,255,255],aquamarine:[127,255,212],azure:[240,255,255],beige:[245,245,220],bisque:[255,228,196],black:[0,0,0],blanchedalmond:[255,235,205],blue:[0,0,255],blueviolet:[138,43,226],brown:[165,42,42],burlywood:[222,184,135],cadetblue:[95,158,160],chartreuse:[127,255,0],chocolate:[210,105,30],coral:[255,127,80],cornflowerblue:[100,149,237],cornsilk:[255,248,220],crimson:[220,20,60],cyan:[0,255,255],darkblue:[0,0,139],darkcyan:[0,139,139],darkgoldenrod:[184,134,11],darkgray:[169,169,169],darkgreen:[0,100,0],darkgrey:[169,169,169],darkkhaki:[189,183,107],darkmagenta:[139,0,139],darkolivegreen:[85,107,47],darkorange:[255,140,0],darkorchid:[153,50,204],darkred:[139,0,0],darksalmon:[233,150,122],darkseagreen:[143,188,143],darkslateblue:[72,61,139],darkslategray:[47,79,79],darkslategrey:[47,79,79],darkturquoise:[0,206,209],darkviolet:[148,0,211],deeppink:[255,20,147],deepskyblue:[0,191,255],dimgray:[105,105,105],dimgrey:[105,105,105],dodgerblue:[30,144,255],firebrick:[178,34,34],floralwhite:[255,250,240],forestgreen:[34,139,34],fuchsia:[255,0,255],gainsboro:[220,220,220],ghostwhite:[248,248,255],gold:[255,215,0],goldenrod:[218,165,32],gray:[128,128,128],green:[0,128,0],greenyellow:[173,255,47],grey:[128,128,128],honeydew:[240,255,240],hotpink:[255,105,180],indianred:[205,92,92],indigo:[75,0,130],ivory:[255,255,240],khaki:[240,230,140],lavender:[230,230,250],lavenderblush:[255,240,245],lawngreen:[124,252,0],lemonchiffon:[255,250,205],lightblue:[173,216,230],lightcoral:[240,128,128],lightcyan:[224,255,255],lightgoldenrodyellow:[250,250,210],lightgray:[211,211,211],lightgreen:[144,238,144],lightgrey:[211,211,211],lightpink:[255,182,193],lightsalmon:[255,160,122],lightseagreen:[32,178,170],lightskyblue:[135,206,250],lightslategray:[119,136,153],lightslategrey:[119,136,153],lightsteelblue:[176,196,222],lightyellow:[255,255,224],lime:[0,255,0],limegreen:[50,205,50],linen:[250,240,230],magenta:[255,0,255],maroon:[128,0,0],mediumaquamarine:[102,205,170],mediumblue:[0,0,205],mediumorchid:[186,85,211],mediumpurple:[147,112,219],mediumseagreen:[60,179,113],mediumslateblue:[123,104,238],mediumspringgreen:[0,250,154],mediumturquoise:[72,209,204],mediumvioletred:[199,21,133],midnightblue:[25,25,112],mintcream:[245,255,250],mistyrose:[255,228,225],moccasin:[255,228,181],navajowhite:[255,222,173],navy:[0,0,128],oldlace:[253,245,230],olive:[128,128,0],olivedrab:[107,142,35],orange:[255,165,0],orangered:[255,69,0],orchid:[218,112,214],palegoldenrod:[238,232,170],palegreen:[152,251,152],paleturquoise:[175,238,238],palevioletred:[219,112,147],papayawhip:[255,239,213],peachpuff:[255,218,185],peru:[205,133,63],pink:[255,192,203],plum:[221,160,221],powderblue:[176,224,230],purple:[128,0,128],rebeccapurple:[102,51,153],red:[255,0,0],rosybrown:[188,143,143],royalblue:[65,105,225],saddlebrown:[139,69,19],salmon:[250,128,114],sandybrown:[244,164,96],seagreen:[46,139,87],seashell:[255,245,238],sienna:[160,82,45],silver:[192,192,192],skyblue:[135,206,235],slateblue:[106,90,205],slategray:[112,128,144],slategrey:[112,128,144],snow:[255,250,250],springgreen:[0,255,127],steelblue:[70,130,180],tan:[210,180,140],teal:[0,128,128],thistle:[216,191,216],tomato:[255,99,71],turquoise:[64,224,208],violet:[238,130,238],wheat:[245,222,179],white:[255,255,255],whitesmoke:[245,245,245],yellow:[255,255,0],yellowgreen:[154,205,50]},_e={getRgba:Ar,getHsla:Ir,getRgb:function Xi(e){var t=Ar(e);return t&&t.slice(0,3)},getHsl:function Ki(e){var t=Ir(e);return t&&t.slice(0,3)},getHwb:Ba,getAlpha:function Ji(e){var t=Ar(e);return t||(t=Ir(e))||(t=Ba(e))?t[3]:void 0},hexString:function Qi(e,r){return r=void 0!==r&&3===e.length?r:e[3],"#"+Xt(e[0])+Xt(e[1])+Xt(e[2])+(r>=0&&r<1?Xt(Math.round(255*r)):"")},rgbString:function eo(e,t){return t<1||e[3]&&e[3]<1?Ha(e,t):"rgb("+e[0]+", "+e[1]+", "+e[2]+")"},rgbaString:Ha,percentString:function to(e,t){return t<1||e[3]&&e[3]<1?Va(e,t):"rgb("+Math.round(e[0]/255*100)+"%, "+Math.round(e[1]/255*100)+"%, "+Math.round(e[2]/255*100)+"%)"},percentaString:Va,hslString:function ro(e,t){return t<1||e[3]&&e[3]<1?Ua(e,t):"hsl("+e[0]+", "+e[1]+"%, "+e[2]+"%)"},hslaString:Ua,hwbString:function ao(e,t){return void 0===t&&(t=void 0!==e[3]?e[3]:1),"hwb("+e[0]+", "+e[1]+"%, "+e[2]+"%"+(void 0!==t&&1!==t?", "+t:"")+")"},keyword:function no(e){return ja[e.slice(0,3)]}};function Ar(e){if(e){var s=[0,0,0],d=1,l=e.match(/^#([a-fA-F0-9]{3,4})$/i),f="";if(l){f=(l=l[1])[3];for(var c=0;c<s.length;c++)s[c]=parseInt(l[c]+l[c],16);f&&(d=Math.round(parseInt(f+f,16)/255*100)/100)}else if(l=e.match(/^#([a-fA-F0-9]{6}([a-fA-F0-9]{2})?)$/i)){for(f=l[2],l=l[1],c=0;c<s.length;c++)s[c]=parseInt(l.slice(2*c,2*c+2),16);f&&(d=Math.round(parseInt(f,16)/255*100)/100)}else if(l=e.match(/^rgba?\(\s*([+-]?\d+)\s*,\s*([+-]?\d+)\s*,\s*([+-]?\d+)\s*(?:,\s*([+-]?[\d\.]+)\s*)?\)$/i)){for(c=0;c<s.length;c++)s[c]=parseInt(l[c+1]);d=parseFloat(l[4])}else if(l=e.match(/^rgba?\(\s*([+-]?[\d\.]+)\%\s*,\s*([+-]?[\d\.]+)\%\s*,\s*([+-]?[\d\.]+)\%\s*(?:,\s*([+-]?[\d\.]+)\s*)?\)$/i)){for(c=0;c<s.length;c++)s[c]=Math.round(2.55*parseFloat(l[c+1]));d=parseFloat(l[4])}else if(l=e.match(/(\w+)/)){if("transparent"==l[1])return[0,0,0,0];if(!(s=Fr[l[1]]))return}for(c=0;c<s.length;c++)s[c]=Se(s[c],0,255);return d=d||0==d?Se(d,0,1):1,s[3]=d,s}}function Ir(e){if(e){var r=e.match(/^hsla?\(\s*([+-]?\d+)(?:deg)?\s*,\s*([+-]?[\d\.]+)%\s*,\s*([+-]?[\d\.]+)%\s*(?:,\s*([+-]?[\d\.]+)\s*)?\)/);if(r){var a=parseFloat(r[4]);return[Se(parseInt(r[1]),0,360),Se(parseFloat(r[2]),0,100),Se(parseFloat(r[3]),0,100),Se(isNaN(a)?1:a,0,1)]}}}function Ba(e){if(e){var r=e.match(/^hwb\(\s*([+-]?\d+)(?:deg)?\s*,\s*([+-]?[\d\.]+)%\s*,\s*([+-]?[\d\.]+)%\s*(?:,\s*([+-]?[\d\.]+)\s*)?\)/);if(r){var a=parseFloat(r[4]);return[Se(parseInt(r[1]),0,360),Se(parseFloat(r[2]),0,100),Se(parseFloat(r[3]),0,100),Se(isNaN(a)?1:a,0,1)]}}}function Ha(e,t){return void 0===t&&(t=void 0!==e[3]?e[3]:1),"rgba("+e[0]+", "+e[1]+", "+e[2]+", "+t+")"}function Va(e,t){return"rgba("+Math.round(e[0]/255*100)+"%, "+Math.round(e[1]/255*100)+"%, "+Math.round(e[2]/255*100)+"%, "+(t||e[3]||1)+")"}function Ua(e,t){return void 0===t&&(t=void 0!==e[3]?e[3]:1),"hsla("+e[0]+", "+e[1]+"%, "+e[2]+"%, "+t+")"}function Se(e,t,r){return Math.min(Math.max(t,e),r)}function Xt(e){var t=e.toString(16).toUpperCase();return t.length<2?"0"+t:t}var ja={};for(var Ga in Fr)ja[Fr[Ga]]=Ga;var he=function(e){return e instanceof he?e:this instanceof he?(this.valid=!1,this.values={rgb:[0,0,0],hsl:[0,0,0],hsv:[0,0,0],hwb:[0,0,0],cmyk:[0,0,0,0],alpha:1},void("string"==typeof e?(t=_e.getRgba(e))?this.setValues("rgb",t):(t=_e.getHsla(e))?this.setValues("hsl",t):(t=_e.getHwb(e))&&this.setValues("hwb",t):"object"==typeof e&&(void 0!==(t=e).r||void 0!==t.red?this.setValues("rgb",t):void 0!==t.l||void 0!==t.lightness?this.setValues("hsl",t):void 0!==t.v||void 0!==t.value?this.setValues("hsv",t):void 0!==t.w||void 0!==t.whiteness?this.setValues("hwb",t):(void 0!==t.c||void 0!==t.cyan)&&this.setValues("cmyk",t)))):new he(e);var t};he.prototype={isValid:function(){return this.valid},rgb:function(){return this.setSpace("rgb",arguments)},hsl:function(){return this.setSpace("hsl",arguments)},hsv:function(){return this.setSpace("hsv",arguments)},hwb:function(){return this.setSpace("hwb",arguments)},cmyk:function(){return this.setSpace("cmyk",arguments)},rgbArray:function(){return this.values.rgb},hslArray:function(){return this.values.hsl},hsvArray:function(){return this.values.hsv},hwbArray:function(){var e=this.values;return 1!==e.alpha?e.hwb.concat([e.alpha]):e.hwb},cmykArray:function(){return this.values.cmyk},rgbaArray:function(){var e=this.values;return e.rgb.concat([e.alpha])},hslaArray:function(){var e=this.values;return e.hsl.concat([e.alpha])},alpha:function(e){return void 0===e?this.values.alpha:(this.setValues("alpha",e),this)},red:function(e){return this.setChannel("rgb",0,e)},green:function(e){return this.setChannel("rgb",1,e)},blue:function(e){return this.setChannel("rgb",2,e)},hue:function(e){return e&&(e=(e%=360)<0?360+e:e),this.setChannel("hsl",0,e)},saturation:function(e){return this.setChannel("hsl",1,e)},lightness:function(e){return this.setChannel("hsl",2,e)},saturationv:function(e){return this.setChannel("hsv",1,e)},whiteness:function(e){return this.setChannel("hwb",1,e)},blackness:function(e){return this.setChannel("hwb",2,e)},value:function(e){return this.setChannel("hsv",2,e)},cyan:function(e){return this.setChannel("cmyk",0,e)},magenta:function(e){return this.setChannel("cmyk",1,e)},yellow:function(e){return this.setChannel("cmyk",2,e)},black:function(e){return this.setChannel("cmyk",3,e)},hexString:function(){return _e.hexString(this.values.rgb)},rgbString:function(){return _e.rgbString(this.values.rgb,this.values.alpha)},rgbaString:function(){return _e.rgbaString(this.values.rgb,this.values.alpha)},percentString:function(){return _e.percentString(this.values.rgb,this.values.alpha)},hslString:function(){return _e.hslString(this.values.hsl,this.values.alpha)},hslaString:function(){return _e.hslaString(this.values.hsl,this.values.alpha)},hwbString:function(){return _e.hwbString(this.values.hwb,this.values.alpha)},keyword:function(){return _e.keyword(this.values.rgb,this.values.alpha)},rgbNumber:function(){var e=this.values.rgb;return e[0]<<16|e[1]<<8|e[2]},luminosity:function(){for(var e=this.values.rgb,t=[],r=0;r<e.length;r++){var a=e[r]/255;t[r]=a<=.03928?a/12.92:Math.pow((a+.055)/1.055,2.4)}return.2126*t[0]+.7152*t[1]+.0722*t[2]},contrast:function(e){var t=this.luminosity(),r=e.luminosity();return t>r?(t+.05)/(r+.05):(r+.05)/(t+.05)},level:function(e){var t=this.contrast(e);return t>=7.1?"AAA":t>=4.5?"AA":""},dark:function(){var e=this.values.rgb;return(299*e[0]+587*e[1]+114*e[2])/1e3<128},light:function(){return!this.dark()},negate:function(){for(var e=[],t=0;t<3;t++)e[t]=255-this.values.rgb[t];return this.setValues("rgb",e),this},lighten:function(e){var t=this.values.hsl;return t[2]+=t[2]*e,this.setValues("hsl",t),this},darken:function(e){var t=this.values.hsl;return t[2]-=t[2]*e,this.setValues("hsl",t),this},saturate:function(e){var t=this.values.hsl;return t[1]+=t[1]*e,this.setValues("hsl",t),this},desaturate:function(e){var t=this.values.hsl;return t[1]-=t[1]*e,this.setValues("hsl",t),this},whiten:function(e){var t=this.values.hwb;return t[1]+=t[1]*e,this.setValues("hwb",t),this},blacken:function(e){var t=this.values.hwb;return t[2]+=t[2]*e,this.setValues("hwb",t),this},greyscale:function(){var e=this.values.rgb,t=.3*e[0]+.59*e[1]+.11*e[2];return this.setValues("rgb",[t,t,t]),this},clearer:function(e){var t=this.values.alpha;return this.setValues("alpha",t-t*e),this},opaquer:function(e){var t=this.values.alpha;return this.setValues("alpha",t+t*e),this},rotate:function(e){var t=this.values.hsl,r=(t[0]+e)%360;return t[0]=r<0?360+r:r,this.setValues("hsl",t),this},mix:function(e,t){var r=this,a=e,n=void 0===t?.5:t,o=2*n-1,s=r.alpha()-a.alpha(),d=((o*s==-1?o:(o+s)/(1+o*s))+1)/2,l=1-d;return this.rgb(d*r.red()+l*a.red(),d*r.green()+l*a.green(),d*r.blue()+l*a.blue()).alpha(r.alpha()*n+a.alpha()*(1-n))},toJSON:function(){return this.rgb()},clone:function(){var a,n,e=new he,t=this.values,r=e.values;for(var o in t)t.hasOwnProperty(o)&&("[object Array]"===(n={}.toString.call(a=t[o]))?r[o]=a.slice(0):"[object Number]"===n?r[o]=a:console.error("unexpected color value:",a));return e}},he.prototype.spaces={rgb:["red","green","blue"],hsl:["hue","saturation","lightness"],hsv:["hue","saturation","value"],hwb:["hue","whiteness","blackness"],cmyk:["cyan","magenta","yellow","black"]},he.prototype.maxes={rgb:[255,255,255],hsl:[360,100,100],hsv:[360,100,100],hwb:[360,100,100],cmyk:[100,100,100,100]},he.prototype.getValues=function(e){for(var t=this.values,r={},a=0;a<e.length;a++)r[e.charAt(a)]=t[e][a];return 1!==t.alpha&&(r.a=t.alpha),r},he.prototype.setValues=function(e,t){var s,l,r=this.values,a=this.spaces,n=this.maxes,o=1;if(this.valid=!0,"alpha"===e)o=t;else if(t.length)r[e]=t.slice(0,e.length),o=t[e.length];else if(void 0!==t[e.charAt(0)]){for(s=0;s<e.length;s++)r[e][s]=t[e.charAt(s)];o=t.a}else if(void 0!==t[a[e][0]]){var d=a[e];for(s=0;s<e.length;s++)r[e][s]=t[d[s]];o=t.alpha}if(r.alpha=Math.max(0,Math.min(1,void 0===o?r.alpha:o)),"alpha"===e)return!1;for(s=0;s<e.length;s++)l=Math.max(0,Math.min(n[e][s],r[e][s])),r[e][s]=Math.round(l);for(var f in a)f!==e&&(r[f]=Zi[e][f](r[e]));return!0},he.prototype.setSpace=function(e,t){var r=t[0];return void 0===r?this.getValues(e):("number"==typeof r&&(r=Array.prototype.slice.call(t)),this.setValues(e,r),this)},he.prototype.setChannel=function(e,t,r){var a=this.values[e];return void 0===r?a[t]:(r===a[t]||(a[t]=r,this.setValues(e,a)),this)},"undefined"!=typeof window&&(window.Color=he);var Kt=he;function $a(e){return-1===["__proto__","prototype","constructor"].indexOf(e)}var e,B={noop:function(){},uid:(e=0,function(){return e++}),isNullOrUndef:function(e){return null==e},isArray:function(e){if(Array.isArray&&Array.isArray(e))return!0;var t=Object.prototype.toString.call(e);return"[object"===t.substr(0,7)&&"Array]"===t.substr(-6)},isObject:function(e){return null!==e&&"[object Object]"===Object.prototype.toString.call(e)},isFinite:function(e){return("number"==typeof e||e instanceof Number)&&isFinite(e)},valueOrDefault:function(e,t){return void 0===e?t:e},valueAtIndexOrDefault:function(e,t,r){return B.valueOrDefault(B.isArray(e)?e[t]:e,r)},callback:function(e,t,r){if(e&&"function"==typeof e.call)return e.apply(r,t)},each:function(e,t,r,a){var n,o,s;if(B.isArray(e))if(o=e.length,a)for(n=o-1;n>=0;n--)t.call(r,e[n],n);else for(n=0;n<o;n++)t.call(r,e[n],n);else if(B.isObject(e))for(o=(s=Object.keys(e)).length,n=0;n<o;n++)t.call(r,e[s[n]],s[n])},arrayEquals:function(e,t){var r,a,n,o;if(!e||!t||e.length!==t.length)return!1;for(r=0,a=e.length;r<a;++r)if(o=t[r],(n=e[r])instanceof Array&&o instanceof Array){if(!B.arrayEquals(n,o))return!1}else if(n!==o)return!1;return!0},clone:function(e){if(B.isArray(e))return e.map(B.clone);if(B.isObject(e)){for(var t=Object.create(e),r=Object.keys(e),a=r.length,n=0;n<a;++n)t[r[n]]=B.clone(e[r[n]]);return t}return e},_merger:function(e,t,r,a){if($a(e)){var n=t[e],o=r[e];B.isObject(n)&&B.isObject(o)?B.merge(n,o,a):t[e]=B.clone(o)}},_mergerIf:function(e,t,r){if($a(e)){var a=t[e],n=r[e];B.isObject(a)&&B.isObject(n)?B.mergeIf(a,n):t.hasOwnProperty(e)||(t[e]=B.clone(n))}},merge:function(e,t,r){var o,s,d,l,f,a=B.isArray(t)?t:[t],n=a.length;if(!B.isObject(e))return e;for(o=(r=r||{}).merger||B._merger,s=0;s<n;++s)if(B.isObject(t=a[s]))for(f=0,l=(d=Object.keys(t)).length;f<l;++f)o(d[f],e,t,r);return e},mergeIf:function(e,t){return B.merge(e,t,{merger:B._mergerIf})},extend:Object.assign||function(e){return B.merge(e,[].slice.call(arguments,1),{merger:function(t,r,a){r[t]=a[t]}})},inherits:function(e){var t=this,r=e&&e.hasOwnProperty("constructor")?e.constructor:function(){return t.apply(this,arguments)},a=function(){this.constructor=r};return a.prototype=t.prototype,r.prototype=new a,r.extend=B.inherits,e&&B.extend(r.prototype,e),r.__super__=t.prototype,r},_deprecated:function(e,t,r,a){void 0!==t&&console.warn(e+': "'+r+'" is deprecated. Please use "'+a+'" instead')}},ve=B;B.callCallback=B.callback,B.indexOf=function(e,t,r){return Array.prototype.indexOf.call(e,t,r)},B.getValueOrDefault=B.valueOrDefault,B.getValueAtIndexOrDefault=B.valueAtIndexOrDefault;var Tt={linear:function(e){return e},easeInQuad:function(e){return e*e},easeOutQuad:function(e){return-e*(e-2)},easeInOutQuad:function(e){return(e/=.5)<1?.5*e*e:-.5*(--e*(e-2)-1)},easeInCubic:function(e){return e*e*e},easeOutCubic:function(e){return(e-=1)*e*e+1},easeInOutCubic:function(e){return(e/=.5)<1?.5*e*e*e:.5*((e-=2)*e*e+2)},easeInQuart:function(e){return e*e*e*e},easeOutQuart:function(e){return-((e-=1)*e*e*e-1)},easeInOutQuart:function(e){return(e/=.5)<1?.5*e*e*e*e:-.5*((e-=2)*e*e*e-2)},easeInQuint:function(e){return e*e*e*e*e},easeOutQuint:function(e){return(e-=1)*e*e*e*e+1},easeInOutQuint:function(e){return(e/=.5)<1?.5*e*e*e*e*e:.5*((e-=2)*e*e*e*e+2)},easeInSine:function(e){return 1-Math.cos(e*(Math.PI/2))},easeOutSine:function(e){return Math.sin(e*(Math.PI/2))},easeInOutSine:function(e){return-.5*(Math.cos(Math.PI*e)-1)},easeInExpo:function(e){return 0===e?0:Math.pow(2,10*(e-1))},easeOutExpo:function(e){return 1===e?1:1-Math.pow(2,-10*e)},easeInOutExpo:function(e){return 0===e?0:1===e?1:(e/=.5)<1?.5*Math.pow(2,10*(e-1)):.5*(2-Math.pow(2,-10*--e))},easeInCirc:function(e){return e>=1?e:-(Math.sqrt(1-e*e)-1)},easeOutCirc:function(e){return Math.sqrt(1-(e-=1)*e)},easeInOutCirc:function(e){return(e/=.5)<1?-.5*(Math.sqrt(1-e*e)-1):.5*(Math.sqrt(1-(e-=2)*e)+1)},easeInElastic:function(e){var t=1.70158,r=0,a=1;return 0===e?0:1===e?1:(r||(r=.3),a<1?(a=1,t=r/4):t=r/(2*Math.PI)*Math.asin(1/a),-a*Math.pow(2,10*(e-=1))*Math.sin((e-t)*(2*Math.PI)/r))},easeOutElastic:function(e){var t=1.70158,r=0,a=1;return 0===e?0:1===e?1:(r||(r=.3),a<1?(a=1,t=r/4):t=r/(2*Math.PI)*Math.asin(1/a),a*Math.pow(2,-10*e)*Math.sin((e-t)*(2*Math.PI)/r)+1)},easeInOutElastic:function(e){var t=1.70158,r=0,a=1;return 0===e?0:2==(e/=.5)?1:(r||(r=.45),a<1?(a=1,t=r/4):t=r/(2*Math.PI)*Math.asin(1/a),e<1?a*Math.pow(2,10*(e-=1))*Math.sin((e-t)*(2*Math.PI)/r)*-.5:a*Math.pow(2,-10*(e-=1))*Math.sin((e-t)*(2*Math.PI)/r)*.5+1)},easeInBack:function(e){var t=1.70158;return e*e*((t+1)*e-t)},easeOutBack:function(e){var t=1.70158;return(e-=1)*e*((t+1)*e+t)+1},easeInOutBack:function(e){var t=1.70158;return(e/=.5)<1?e*e*((1+(t*=1.525))*e-t)*.5:.5*((e-=2)*e*((1+(t*=1.525))*e+t)+2)},easeInBounce:function(e){return 1-Tt.easeOutBounce(1-e)},easeOutBounce:function(e){return e<1/2.75?7.5625*e*e:e<2/2.75?7.5625*(e-=1.5/2.75)*e+.75:e<2.5/2.75?7.5625*(e-=2.25/2.75)*e+.9375:7.5625*(e-=2.625/2.75)*e+.984375},easeInOutBounce:function(e){return e<.5?.5*Tt.easeInBounce(2*e):.5*Tt.easeOutBounce(2*e-1)+.5}},io={effects:Tt};ve.easingEffects=Tt;var oe=Math.PI,oo=oe/180,so=2*oe,ge=oe/2,Ct=oe/4,qa=2*oe/3,Jt={clear:function(e){e.ctx.clearRect(0,0,e.width,e.height)},roundedRect:function(e,t,r,a,n,o){if(o){var s=Math.min(o,n/2,a/2),d=t+s,l=r+s,f=t+a-s,c=r+n-s;e.moveTo(t,l),d<f&&l<c?(e.arc(d,l,s,-oe,-ge),e.arc(f,l,s,-ge,0),e.arc(f,c,s,0,ge),e.arc(d,c,s,ge,oe)):d<f?(e.moveTo(d,r),e.arc(f,l,s,-ge,ge),e.arc(d,l,s,ge,oe+ge)):l<c?(e.arc(d,l,s,-oe,0),e.arc(d,c,s,0,oe)):e.arc(d,l,s,-oe,oe),e.closePath(),e.moveTo(t,r)}else e.rect(t,r,a,n)},drawPoint:function(e,t,r,a,n,o){var s,d,l,f,c,v=(o||0)*oo;if(t&&"object"==typeof t&&("[object HTMLImageElement]"===(s=t.toString())||"[object HTMLCanvasElement]"===s))return e.save(),e.translate(a,n),e.rotate(v),e.drawImage(t,-t.width/2,-t.height/2,t.width,t.height),void e.restore();if(!(isNaN(r)||r<=0)){switch(e.beginPath(),t){default:e.arc(a,n,r,0,so),e.closePath();break;case"triangle":e.moveTo(a+Math.sin(v)*r,n-Math.cos(v)*r),v+=qa,e.lineTo(a+Math.sin(v)*r,n-Math.cos(v)*r),v+=qa,e.lineTo(a+Math.sin(v)*r,n-Math.cos(v)*r),e.closePath();break;case"rectRounded":f=r-(c=.516*r),d=Math.cos(v+Ct)*f,l=Math.sin(v+Ct)*f,e.arc(a-d,n-l,c,v-oe,v-ge),e.arc(a+l,n-d,c,v-ge,v),e.arc(a+d,n+l,c,v,v+ge),e.arc(a-l,n+d,c,v+ge,v+oe),e.closePath();break;case"rect":if(!o){f=Math.SQRT1_2*r,e.rect(a-f,n-f,2*f,2*f);break}v+=Ct;case"rectRot":d=Math.cos(v)*r,l=Math.sin(v)*r,e.moveTo(a-d,n-l),e.lineTo(a+l,n-d),e.lineTo(a+d,n+l),e.lineTo(a-l,n+d),e.closePath();break;case"crossRot":v+=Ct;case"cross":d=Math.cos(v)*r,l=Math.sin(v)*r,e.moveTo(a-d,n-l),e.lineTo(a+d,n+l),e.moveTo(a+l,n-d),e.lineTo(a-l,n+d);break;case"star":d=Math.cos(v)*r,l=Math.sin(v)*r,e.moveTo(a-d,n-l),e.lineTo(a+d,n+l),e.moveTo(a+l,n-d),e.lineTo(a-l,n+d),v+=Ct,d=Math.cos(v)*r,l=Math.sin(v)*r,e.moveTo(a-d,n-l),e.lineTo(a+d,n+l),e.moveTo(a+l,n-d),e.lineTo(a-l,n+d);break;case"line":d=Math.cos(v)*r,l=Math.sin(v)*r,e.moveTo(a-d,n-l),e.lineTo(a+d,n+l);break;case"dash":e.moveTo(a,n),e.lineTo(a+Math.cos(v)*r,n+Math.sin(v)*r)}e.fill(),e.stroke()}},_isPointInArea:function(e,t){var r=1e-6;return e.x>t.left-r&&e.x<t.right+r&&e.y>t.top-r&&e.y<t.bottom+r},clipArea:function(e,t){e.save(),e.beginPath(),e.rect(t.left,t.top,t.right-t.left,t.bottom-t.top),e.clip()},unclipArea:function(e){e.restore()},lineTo:function(e,t,r,a){var n=r.steppedLine;if(n){if("middle"===n){var o=(t.x+r.x)/2;e.lineTo(o,a?r.y:t.y),e.lineTo(o,a?t.y:r.y)}else"after"===n&&!a||"after"!==n&&a?e.lineTo(t.x,r.y):e.lineTo(r.x,t.y);e.lineTo(r.x,r.y)}else r.tension?e.bezierCurveTo(a?t.controlPointPreviousX:t.controlPointNextX,a?t.controlPointPreviousY:t.controlPointNextY,a?r.controlPointNextX:r.controlPointPreviousX,a?r.controlPointNextY:r.controlPointPreviousY,r.x,r.y):e.lineTo(r.x,r.y)}},lo=Jt;ve.clear=Jt.clear,ve.drawRoundedRectangle=function(e){e.beginPath(),Jt.roundedRect.apply(Jt,arguments)};var Za={_set:function(e,t){return ve.merge(this[e]||(this[e]={}),t)}};Za._set("global",{defaultColor:"rgba(0,0,0,0.1)",defaultFontColor:"#666",defaultFontFamily:"'Helvetica Neue', 'Helvetica', 'Arial', sans-serif",defaultFontSize:12,defaultFontStyle:"normal",defaultLineHeight:1.2,showLines:!0});var F=Za,Qt=ve.valueOrDefault,fo={toLineHeight:function(e,t){var r=(""+e).match(/^(normal|(\d+(?:\.\d+)?)(px|em|%)?)$/);if(!r||"normal"===r[1])return 1.2*t;switch(e=+r[2],r[3]){case"px":return e;case"%":e/=100}return t*e},toPadding:function(e){var t,r,a,n;return ve.isObject(e)?(t=+e.top||0,r=+e.right||0,a=+e.bottom||0,n=+e.left||0):t=r=a=n=+e||0,{top:t,right:r,bottom:a,left:n,height:t+a,width:n+r}},_parseFont:function(e){var t=F.global,r=Qt(e.fontSize,t.defaultFontSize),a={family:Qt(e.fontFamily,t.defaultFontFamily),lineHeight:ve.options.toLineHeight(Qt(e.lineHeight,t.defaultLineHeight),r),size:r,style:Qt(e.fontStyle,t.defaultFontStyle),weight:null,string:""};return a.string=function uo(e){return!e||ve.isNullOrUndef(e.size)||ve.isNullOrUndef(e.family)?null:(e.style?e.style+" ":"")+(e.weight?e.weight+" ":"")+e.size+"px "+e.family}(a),a},resolve:function(e,t,r,a){var o,s,d,n=!0;for(o=0,s=e.length;o<s;++o)if(void 0!==(d=e[o])&&(void 0!==t&&"function"==typeof d&&(d=d(t),n=!1),void 0!==r&&ve.isArray(d)&&(d=d[r],n=!1),void 0!==d))return a&&!n&&(a.cacheable=!1),d}},Xa={_factorize:function(e){var a,t=[],r=Math.sqrt(e);for(a=1;a<r;a++)e%a==0&&(t.push(a),t.push(e/a));return r===(0|r)&&t.push(r),t.sort(function(n,o){return n-o}).pop(),t},log10:Math.log10||function(e){var t=Math.log(e)*Math.LOG10E,r=Math.round(t);return e===Math.pow(10,r)?r:t}},ho=Xa;ve.log10=Xa.log10;var m=ve,_o=lo,xo=fo,wo=ho,ko={getRtlAdapter:function(e,t,r){return e?function(e,t){return{x:function(r){return e+e+t-r},setWidth:function(r){t=r},textAlign:function(r){return"center"===r?r:"right"===r?"left":"right"},xPlus:function(r,a){return r-a},leftForLtr:function(r,a){return r-a}}}(t,r):{x:function(e){return e},setWidth:function(e){},textAlign:function(e){return e},xPlus:function(e,t){return e+t},leftForLtr:function(e,t){return e}}},overrideTextDirection:function(e,t){var r,a;("ltr"===t||"rtl"===t)&&(a=[(r=e.canvas.style).getPropertyValue("direction"),r.getPropertyPriority("direction")],r.setProperty("direction",t,"important"),e.prevTextDirection=a)},restoreTextDirection:function(e){var t=e.prevTextDirection;void 0!==t&&(delete e.prevTextDirection,e.canvas.style.setProperty("direction",t[0],t[1]))}};m.easing=io,m.canvas=_o,m.options=xo,m.math=wo,m.rtl=ko;var Lr=function(e){m.extend(this,e),this.initialize.apply(this,arguments)};m.extend(Lr.prototype,{_type:void 0,initialize:function(){this.hidden=!1},pivot:function(){var e=this;return e._view||(e._view=m.extend({},e._model)),e._start={},e},transition:function(e){var t=this,r=t._model,a=t._start,n=t._view;return r&&1!==e?(n||(n=t._view={}),a||(a=t._start={}),function Mo(e,t,r,a){var o,s,d,l,f,c,v,p,y,n=Object.keys(r);for(o=0,s=n.length;o<s;++o)if(c=r[d=n[o]],t.hasOwnProperty(d)||(t[d]=c),(l=t[d])!==c&&"_"!==d[0]){if(e.hasOwnProperty(d)||(e[d]=l),(v=typeof c)==typeof(f=e[d]))if("string"===v){if((p=Kt(f)).valid&&(y=Kt(c)).valid){t[d]=y.mix(p,a).rgbString();continue}}else if(m.isFinite(f)&&m.isFinite(c)){t[d]=f+(c-f)*a;continue}t[d]=c}}(a,n,r,e),t):(t._view=m.extend({},r),t._start=null,t)},tooltipPosition:function(){return{x:this._model.x,y:this._model.y}},hasValue:function(){return m.isNumber(this._model.x)&&m.isNumber(this._model.y)}}),Lr.extend=m.inherits;var De=Lr,Rr=De.extend({chart:null,currentStep:0,numSteps:60,easing:"",render:null,onAnimationProgress:null,onAnimationComplete:null}),Wr=Rr;Object.defineProperty(Rr.prototype,"animationObject",{get:function(){return this}}),Object.defineProperty(Rr.prototype,"chartInstance",{get:function(){return this.chart},set:function(e){this.chart=e}}),F._set("global",{animation:{duration:1e3,easing:"easeOutQuart",onProgress:m.noop,onComplete:m.noop}});var Nr={animations:[],request:null,addAnimation:function(e,t,r,a){var o,s,n=this.animations;for(t.chart=e,t.startTime=Date.now(),t.duration=r,a||(e.animating=!0),o=0,s=n.length;o<s;++o)if(n[o].chart===e)return void(n[o]=t);n.push(t),1===n.length&&this.requestAnimationFrame()},cancelAnimation:function(e){var t=m.findIndex(this.animations,function(r){return r.chart===e});-1!==t&&(this.animations.splice(t,1),e.animating=!1)},requestAnimationFrame:function(){var e=this;null===e.request&&(e.request=m.requestAnimFrame.call(window,function(){e.request=null,e.startDigest()}))},startDigest:function(){var e=this;e.advance(),e.animations.length>0&&e.requestAnimationFrame()},advance:function(){for(var t,r,a,n,e=this.animations,o=0;o<e.length;)r=(t=e[o]).chart,a=t.numSteps,n=Math.floor((Date.now()-t.startTime)/t.duration*a)+1,t.currentStep=Math.min(n,a),m.callback(t.render,[r,t],r),m.callback(t.onAnimationProgress,[t],r),t.currentStep>=a?(m.callback(t.onAnimationComplete,[t],r),r.animating=!1,e.splice(o,1)):++o}},ht=m.options.resolve,Ka=["push","pop","shift","splice","unshift"];function Ja(e,t){var r=e._chartjs;if(r){var a=r.listeners,n=a.indexOf(t);-1!==n&&a.splice(n,1),!(a.length>0)&&(Ka.forEach(function(o){delete e[o]}),delete e._chartjs)}}var Yr=function(e,t){this.initialize(e,t)};m.extend(Yr.prototype,{datasetElementType:null,dataElementType:null,_datasetElementOptions:["backgroundColor","borderCapStyle","borderColor","borderDash","borderDashOffset","borderJoinStyle","borderWidth"],_dataElementOptions:["backgroundColor","borderColor","borderWidth","pointStyle"],initialize:function(e,t){var r=this;r.chart=e,r.index=t,r.linkScales(),r.addElements(),r._type=r.getMeta().type},updateIndex:function(e){this.index=e},linkScales:function(){var e=this,t=e.getMeta(),r=e.chart,a=r.scales,n=e.getDataset(),o=r.options.scales;(null===t.xAxisID||!(t.xAxisID in a)||n.xAxisID)&&(t.xAxisID=n.xAxisID||o.xAxes[0].id),(null===t.yAxisID||!(t.yAxisID in a)||n.yAxisID)&&(t.yAxisID=n.yAxisID||o.yAxes[0].id)},getDataset:function(){return this.chart.data.datasets[this.index]},getMeta:function(){return this.chart.getDatasetMeta(this.index)},getScaleForId:function(e){return this.chart.scales[e]},_getValueScaleId:function(){return this.getMeta().yAxisID},_getIndexScaleId:function(){return this.getMeta().xAxisID},_getValueScale:function(){return this.getScaleForId(this._getValueScaleId())},_getIndexScale:function(){return this.getScaleForId(this._getIndexScaleId())},reset:function(){this._update(!0)},destroy:function(){this._data&&Ja(this._data,this)},createMetaDataset:function(){var e=this,t=e.datasetElementType;return t&&new t({_chart:e.chart,_datasetIndex:e.index})},createMetaData:function(e){var t=this,r=t.dataElementType;return r&&new r({_chart:t.chart,_datasetIndex:t.index,_index:e})},addElements:function(){var n,o,e=this,t=e.getMeta(),r=e.getDataset().data||[],a=t.data;for(n=0,o=r.length;n<o;++n)a[n]=a[n]||e.createMetaData(n);t.dataset=t.dataset||e.createMetaDataset()},addElementAndReset:function(e){var t=this.createMetaData(e);this.getMeta().data.splice(e,0,t),this.updateElement(t,e,!0)},buildOrUpdateElements:function(){var e=this,t=e.getDataset(),r=t.data||(t.data=[]);e._data!==r&&(e._data&&Ja(e._data,e),r&&Object.isExtensible(r)&&function So(e,t){e._chartjs?e._chartjs.listeners.push(t):(Object.defineProperty(e,"_chartjs",{configurable:!0,enumerable:!1,value:{listeners:[t]}}),Ka.forEach(function(r){var a="onData"+r.charAt(0).toUpperCase()+r.slice(1),n=e[r];Object.defineProperty(e,r,{configurable:!0,enumerable:!1,value:function(){var o=Array.prototype.slice.call(arguments),s=n.apply(this,o);return m.each(e._chartjs.listeners,function(d){"function"==typeof d[a]&&d[a].apply(d,o)}),s}})}))}(r,e),e._data=r),e.resyncElements()},_configure:function(){var e=this;e._config=m.merge(Object.create(null),[e.chart.options.datasets[e._type],e.getDataset()],{merger:function(t,r,a){"_meta"!==t&&"data"!==t&&m._merger(t,r,a)}})},_update:function(e){var t=this;t._configure(),t._cachedDataOpts=null,t.update(e)},update:m.noop,transition:function(e){for(var t=this.getMeta(),r=t.data||[],a=r.length,n=0;n<a;++n)r[n].transition(e);t.dataset&&t.dataset.transition(e)},draw:function(){var e=this.getMeta(),t=e.data||[],r=t.length,a=0;for(e.dataset&&e.dataset.draw();a<r;++a)t[a].draw()},getStyle:function(e){var n,t=this,r=t.getMeta(),a=r.dataset;return t._configure(),(!1===(n=a&&void 0===e?t._resolveDatasetElementOptions(a||{}):t._resolveDataElementOptions(r.data[e=e||0]||{},e)).fill||null===n.fill)&&(n.backgroundColor=n.borderColor),n},_resolveDatasetElementOptions:function(e,t){var f,c,v,p,r=this,a=r.chart,n=r._config,o=e.custom||{},s=a.options.elements[r.datasetElementType.prototype._type]||{},d=r._datasetElementOptions,l={},y={chart:a,dataset:r.getDataset(),datasetIndex:r.index,hover:t};for(f=0,c=d.length;f<c;++f)v=d[f],p=t?"hover"+v.charAt(0).toUpperCase()+v.slice(1):v,l[v]=ht([o[p],n[p],s[p]],y);return l},_resolveDataElementOptions:function(e,t){var r=this,a=e&&e.custom,n=r._cachedDataOpts;if(n&&!a)return n;var p,y,_,w,o=r.chart,s=r._config,d=o.options.elements[r.dataElementType.prototype._type]||{},l=r._dataElementOptions,f={},c={chart:o,dataIndex:t,dataset:r.getDataset(),datasetIndex:r.index},v={cacheable:!a};if(a=a||{},m.isArray(l))for(y=0,_=l.length;y<_;++y)f[w=l[y]]=ht([a[w],s[w],d[w]],c,t,v);else for(y=0,_=(p=Object.keys(l)).length;y<_;++y)f[w=p[y]]=ht([a[w],s[l[w]],s[w],d[w]],c,t,v);return v.cacheable&&(r._cachedDataOpts=Object.freeze(f)),f},removeHoverStyle:function(e){m.merge(e._model,e.$previousStyle||{}),delete e.$previousStyle},setHoverStyle:function(e){var t=this.chart.data.datasets[e._datasetIndex],r=e._index,a=e.custom||{},n=e._model,o=m.getHoverColor;e.$previousStyle={backgroundColor:n.backgroundColor,borderColor:n.borderColor,borderWidth:n.borderWidth},n.backgroundColor=ht([a.hoverBackgroundColor,t.hoverBackgroundColor,o(n.backgroundColor)],void 0,r),n.borderColor=ht([a.hoverBorderColor,t.hoverBorderColor,o(n.borderColor)],void 0,r),n.borderWidth=ht([a.hoverBorderWidth,t.hoverBorderWidth,n.borderWidth],void 0,r)},_removeDatasetHoverStyle:function(){var e=this.getMeta().dataset;e&&this.removeHoverStyle(e)},_setDatasetHoverStyle:function(){var r,a,n,o,s,d,e=this.getMeta().dataset,t={};if(e){for(d=e._model,s=this._resolveDatasetElementOptions(e,!0),r=0,a=(o=Object.keys(s)).length;r<a;++r)t[n=o[r]]=d[n],d[n]=s[n];e.$previousStyle=t}},resyncElements:function(){var e=this,t=e.getMeta(),r=e.getDataset().data,a=t.data.length,n=r.length;n<a?t.data.splice(n,a-n):n>a&&e.insertElements(a,n-a)},insertElements:function(e,t){for(var r=0;r<t;++r)this.addElementAndReset(e+r)},onDataPush:function(){var e=arguments.length;this.insertElements(this.getDataset().data.length-e,e)},onDataPop:function(){this.getMeta().data.pop()},onDataShift:function(){this.getMeta().data.shift()},onDataSplice:function(e,t){this.getMeta().data.splice(e,t),this.insertElements(e,arguments.length-2)},onDataUnshift:function(){this.insertElements(0,arguments.length)}}),Yr.extend=m.inherits;var me=Yr,Te=2*Math.PI;function Qa(e,t){var r=t.startAngle,a=t.endAngle,n=t.pixelMargin,o=n/t.outerRadius,s=t.x,d=t.y;e.beginPath(),e.arc(s,d,t.outerRadius,r-o,a+o),t.innerRadius>n?e.arc(s,d,t.innerRadius-n,a+(o=n/t.innerRadius),r-o,!0):e.arc(s,d,n,a+Math.PI/2,r-Math.PI/2),e.closePath(),e.clip()}F._set("global",{elements:{arc:{backgroundColor:F.global.defaultColor,borderColor:"#fff",borderWidth:2,borderAlign:"center"}}});var Co=De.extend({_type:"arc",inLabelRange:function(e){var t=this._view;return!!t&&Math.pow(e-t.x,2)<Math.pow(t.radius+t.hoverRadius,2)},inRange:function(e,t){var r=this._view;if(r){for(var a=m.getAngleFromPoint(r,{x:e,y:t}),n=a.angle,o=a.distance,s=r.startAngle,d=r.endAngle;d<s;)d+=Te;for(;n>d;)n-=Te;for(;n<s;)n+=Te;return n>=s&&n<=d&&o>=r.innerRadius&&o<=r.outerRadius}return!1},getCenterPoint:function(){var e=this._view,t=(e.startAngle+e.endAngle)/2,r=(e.innerRadius+e.outerRadius)/2;return{x:e.x+Math.cos(t)*r,y:e.y+Math.sin(t)*r}},getArea:function(){var e=this._view;return Math.PI*((e.endAngle-e.startAngle)/(2*Math.PI))*(Math.pow(e.outerRadius,2)-Math.pow(e.innerRadius,2))},tooltipPosition:function(){var e=this._view,t=e.startAngle+(e.endAngle-e.startAngle)/2,r=(e.outerRadius-e.innerRadius)/2+e.innerRadius;return{x:e.x+Math.cos(t)*r,y:e.y+Math.sin(t)*r}},draw:function(){var n,e=this._chart.ctx,t=this._view,r="inner"===t.borderAlign?.33:0,a={x:t.x,y:t.y,innerRadius:t.innerRadius,outerRadius:Math.max(t.outerRadius-r,0),pixelMargin:r,startAngle:t.startAngle,endAngle:t.endAngle,fullCircles:Math.floor(t.circumference/Te)};if(e.save(),e.fillStyle=t.backgroundColor,e.strokeStyle=t.borderColor,a.fullCircles){for(a.endAngle=a.startAngle+Te,e.beginPath(),e.arc(a.x,a.y,a.outerRadius,a.startAngle,a.endAngle),e.arc(a.x,a.y,a.innerRadius,a.endAngle,a.startAngle,!0),e.closePath(),n=0;n<a.fullCircles;++n)e.fill();a.endAngle=a.startAngle+t.circumference%Te}e.beginPath(),e.arc(a.x,a.y,a.outerRadius,a.startAngle,a.endAngle),e.arc(a.x,a.y,a.innerRadius,a.endAngle,a.startAngle,!0),e.closePath(),e.fill(),t.borderWidth&&function To(e,t,r){var a="inner"===t.borderAlign;a?(e.lineWidth=2*t.borderWidth,e.lineJoin="round"):(e.lineWidth=t.borderWidth,e.lineJoin="bevel"),r.fullCircles&&function Do(e,t,r,a){var o,n=r.endAngle;for(a&&(r.endAngle=r.startAngle+Te,Qa(e,r),r.endAngle=n,r.endAngle===r.startAngle&&r.fullCircles&&(r.endAngle+=Te,r.fullCircles--)),e.beginPath(),e.arc(r.x,r.y,r.innerRadius,r.startAngle+Te,r.startAngle,!0),o=0;o<r.fullCircles;++o)e.stroke();for(e.beginPath(),e.arc(r.x,r.y,t.outerRadius,r.startAngle,r.startAngle+Te),o=0;o<r.fullCircles;++o)e.stroke()}(e,t,r,a),a&&Qa(e,r),e.beginPath(),e.arc(r.x,r.y,t.outerRadius,r.startAngle,r.endAngle),e.arc(r.x,r.y,r.innerRadius,r.endAngle,r.startAngle,!0),e.closePath(),e.stroke()}(e,t,a),e.restore()}}),en=m.valueOrDefault,tn=F.global.defaultColor;F._set("global",{elements:{line:{tension:.4,backgroundColor:tn,borderWidth:3,borderColor:tn,borderCapStyle:"butt",borderDash:[],borderDashOffset:0,borderJoinStyle:"miter",capBezierPoints:!0,fill:!0}}});var Po=De.extend({_type:"line",draw:function(){var f,c,v,e=this,t=e._view,r=e._chart.ctx,a=t.spanGaps,n=e._children.slice(),o=F.global,s=o.elements.line,d=-1,l=e._loop;if(n.length){if(e._loop){for(f=0;f<n.length;++f)if(c=m.previousItem(n,f),!n[f]._view.skip&&c._view.skip){n=n.slice(f).concat(n.slice(0,f)),l=a;break}l&&n.push(n[0])}for(r.save(),r.lineCap=t.borderCapStyle||s.borderCapStyle,r.setLineDash&&r.setLineDash(t.borderDash||s.borderDash),r.lineDashOffset=en(t.borderDashOffset,s.borderDashOffset),r.lineJoin=t.borderJoinStyle||s.borderJoinStyle,r.lineWidth=en(t.borderWidth,s.borderWidth),r.strokeStyle=t.borderColor||o.defaultColor,r.beginPath(),(v=n[0]._view).skip||(r.moveTo(v.x,v.y),d=0),f=1;f<n.length;++f)v=n[f]._view,c=-1===d?m.previousItem(n,f):n[d],v.skip||(d!==f-1&&!a||-1===d?r.moveTo(v.x,v.y):m.canvas.lineTo(r,c._view,v),d=f);l&&r.closePath(),r.stroke(),r.restore()}}}),Oo=m.valueOrDefault,rn=F.global.defaultColor;function an(e){var t=this._view;return!!t&&Math.abs(e-t.x)<t.radius+t.hitRadius}F._set("global",{elements:{point:{radius:3,pointStyle:"circle",backgroundColor:rn,borderColor:rn,borderWidth:1,hitRadius:1,hoverRadius:4,hoverBorderWidth:1}}});var Ao=De.extend({_type:"point",inRange:function(e,t){var r=this._view;return!!r&&Math.pow(e-r.x,2)+Math.pow(t-r.y,2)<Math.pow(r.hitRadius+r.radius,2)},inLabelRange:an,inXRange:an,inYRange:function Fo(e){var t=this._view;return!!t&&Math.abs(e-t.y)<t.radius+t.hitRadius},getCenterPoint:function(){var e=this._view;return{x:e.x,y:e.y}},getArea:function(){return Math.PI*Math.pow(this._view.radius,2)},tooltipPosition:function(){var e=this._view;return{x:e.x,y:e.y,padding:e.radius+e.borderWidth}},draw:function(e){var t=this._view,r=this._chart.ctx,a=t.pointStyle,n=t.rotation,o=t.radius,s=t.x,d=t.y,l=F.global,f=l.defaultColor;t.skip||(void 0===e||m.canvas._isPointInArea(t,e))&&(r.strokeStyle=t.borderColor||f,r.lineWidth=Oo(t.borderWidth,l.elements.point.borderWidth),r.fillStyle=t.backgroundColor||f,m.canvas.drawPoint(r,a,o,s,d,n))}}),nn=F.global.defaultColor;function er(e){return e&&void 0!==e.width}function on(e){var t,r,a,n,o;return er(e)?(t=e.x-(o=e.width/2),r=e.x+o,a=Math.min(e.y,e.base),n=Math.max(e.y,e.base)):(o=e.height/2,t=Math.min(e.x,e.base),r=Math.max(e.x,e.base),a=e.y-o,n=e.y+o),{left:t,top:a,right:r,bottom:n}}function sn(e,t,r){return e===t?r:e===r?t:e}function Pt(e,t,r){var a=null===t,n=null===r,o=!(!e||a&&n)&&on(e);return o&&(a||t>=o.left&&t<=o.right)&&(n||r>=o.top&&r<=o.bottom)}F._set("global",{elements:{rectangle:{backgroundColor:nn,borderColor:nn,borderSkipped:"bottom",borderWidth:0}}});var Wo=De.extend({_type:"rectangle",draw:function(){var e=this._chart.ctx,t=this._view,r=function Ro(e){var t=on(e),r=t.right-t.left,a=t.bottom-t.top,n=function Lo(e,t,r){var o,s,d,l,a=e.borderWidth,n=function Io(e){var t=e.borderSkipped,r={};return t&&(e.horizontal?e.base>e.x&&(t=sn(t,"left","right")):e.base<e.y&&(t=sn(t,"bottom","top")),r[t]=!0),r}(e);return m.isObject(a)?(o=+a.top||0,s=+a.right||0,d=+a.bottom||0,l=+a.left||0):o=s=d=l=+a||0,{t:n.top||o<0?0:o>r?r:o,r:n.right||s<0?0:s>t?t:s,b:n.bottom||d<0?0:d>r?r:d,l:n.left||l<0?0:l>t?t:l}}(e,r/2,a/2);return{outer:{x:t.left,y:t.top,w:r,h:a},inner:{x:t.left+n.l,y:t.top+n.t,w:r-n.l-n.r,h:a-n.t-n.b}}}(t),a=r.outer,n=r.inner;e.fillStyle=t.backgroundColor,e.fillRect(a.x,a.y,a.w,a.h),(a.w!==n.w||a.h!==n.h)&&(e.save(),e.beginPath(),e.rect(a.x,a.y,a.w,a.h),e.clip(),e.fillStyle=t.borderColor,e.rect(n.x,n.y,n.w,n.h),e.fill("evenodd"),e.restore())},height:function(){var e=this._view;return e.base-e.y},inRange:function(e,t){return Pt(this._view,e,t)},inLabelRange:function(e,t){var r=this._view;return er(r)?Pt(r,e,null):Pt(r,null,t)},inXRange:function(e){return Pt(this._view,e,null)},inYRange:function(e){return Pt(this._view,null,e)},getCenterPoint:function(){var t,r,e=this._view;return er(e)?(t=e.x,r=(e.y+e.base)/2):(t=(e.x+e.base)/2,r=e.y),{x:t,y:r}},getArea:function(){var e=this._view;return er(e)?e.width*Math.abs(e.y-e.base):e.height*Math.abs(e.x-e.base)},tooltipPosition:function(){var e=this._view;return{x:e.x,y:e.y}}}),se={},Yo=Po,Eo=Ao,zo=Wo;se.Arc=Co,se.Line=Yo,se.Point=Eo,se.Rectangle=zo;var Ot=m._deprecated,ct=m.valueOrDefault;F._set("bar",{hover:{mode:"label"},scales:{xAxes:[{type:"category",offset:!0,gridLines:{offsetGridLines:!0}}],yAxes:[{type:"linear"}]}}),F._set("global",{datasets:{bar:{categoryPercentage:.8,barPercentage:.9}}});var ln=me.extend({dataElementType:se.Rectangle,_dataElementOptions:["backgroundColor","borderColor","borderSkipped","borderWidth","barPercentage","barThickness","categoryPercentage","maxBarThickness","minBarLength"],initialize:function(){var t,r,e=this;me.prototype.initialize.apply(e,arguments),(t=e.getMeta()).stack=e.getDataset().stack,t.bar=!0,r=e._getIndexScale().options,Ot("bar chart",r.barPercentage,"scales.[x/y]Axes.barPercentage","dataset.barPercentage"),Ot("bar chart",r.barThickness,"scales.[x/y]Axes.barThickness","dataset.barThickness"),Ot("bar chart",r.categoryPercentage,"scales.[x/y]Axes.categoryPercentage","dataset.categoryPercentage"),Ot("bar chart",e._getValueScale().options.minBarLength,"scales.[x/y]Axes.minBarLength","dataset.minBarLength"),Ot("bar chart",r.maxBarThickness,"scales.[x/y]Axes.maxBarThickness","dataset.maxBarThickness")},update:function(e){var a,n,t=this,r=t.getMeta().data;for(t._ruler=t.getRuler(),a=0,n=r.length;a<n;++a)t.updateElement(r[a],a,e)},updateElement:function(e,t,r){var a=this,n=a.getMeta(),o=a.getDataset(),s=a._resolveDataElementOptions(e,t);e._xScale=a.getScaleForId(n.xAxisID),e._yScale=a.getScaleForId(n.yAxisID),e._datasetIndex=a.index,e._index=t,e._model={backgroundColor:s.backgroundColor,borderColor:s.borderColor,borderSkipped:s.borderSkipped,borderWidth:s.borderWidth,datasetLabel:o.label,label:a.chart.data.labels[t]},m.isArray(o.data[t])&&(e._model.borderSkipped=null),a._updateElementGeometry(e,t,r,s),e.pivot()},_updateElementGeometry:function(e,t,r,a){var n=this,o=e._model,s=n._getValueScale(),d=s.getBasePixel(),l=s.isHorizontal(),f=n._ruler||n.getRuler(),c=n.calculateBarValuePixels(n.index,t,a),v=n.calculateBarIndexPixels(n.index,t,f,a);o.horizontal=l,o.base=r?d:c.base,o.x=l?r?d:c.head:v.center,o.y=l?v.center:r?d:c.head,o.height=l?v.size:void 0,o.width=l?void 0:v.size},_getStacks:function(e){var d,l,r=this._getIndexScale(),a=r._getMatchingVisibleMetas(this._type),n=r.options.stacked,o=a.length,s=[];for(d=0;d<o&&(l=a[d],(!1===n||-1===s.indexOf(l.stack)||void 0===n&&void 0===l.stack)&&s.push(l.stack),l.index!==e);++d);return s},getStackCount:function(){return this._getStacks().length},getStackIndex:function(e,t){var r=this._getStacks(e),a=void 0!==t?r.indexOf(t):-1;return-1===a?r.length-1:a},getRuler:function(){var a,n,e=this,t=e._getIndexScale(),r=[];for(a=0,n=e.getMeta().data.length;a<n;++a)r.push(t.getPixelForValue(null,a,e.index));return{pixels:r,start:t._startPixel,end:t._endPixel,stackCount:e.getStackCount(),scale:t}},calculateBarValuePixels:function(e,t,r){var x,M,T,C,I,A,z,a=this,n=a.chart,o=a._getValueScale(),s=o.isHorizontal(),d=n.data.datasets,l=o._getMatchingVisibleMetas(a._type),f=o._parseValue(d[e].data[t]),c=r.minBarLength,v=o.options.stacked,p=a.getMeta().stack,y=void 0===f.start?0:f.max>=0&&f.min>=0?f.min:f.max,_=void 0===f.start?f.end:f.max>=0&&f.min>=0?f.max-f.min:f.min-f.max,w=l.length;if(v||void 0===v&&void 0!==p)for(x=0;x<w&&(M=l[x]).index!==e;++x)M.stack===p&&(T=void 0===(z=o._parseValue(d[M.index].data[t])).start?z.end:z.min>=0&&z.max>=0?z.max:z.min,(f.min<0&&T<0||f.max>=0&&T>0)&&(y+=T));return C=o.getPixelForValue(y),A=(I=o.getPixelForValue(y+_))-C,void 0!==c&&Math.abs(A)<c&&(A=c,I=_>=0&&!s||_<0&&s?C-c:C+c),{size:A,base:C,head:I,center:I+A/2}},calculateBarIndexPixels:function(e,t,r,a){var o="flex"===a.barThickness?function Vo(e,t,r){var l,a=t.pixels,n=a[e],o=e>0?a[e-1]:null,s=e<a.length-1?a[e+1]:null,d=r.categoryPercentage;return null===o&&(o=n-(null===s?t.end-t.start:s-n)),null===s&&(s=n+n-o),l=n-(n-Math.min(o,s))/2*d,{chunk:Math.abs(s-o)/2*d/t.stackCount,ratio:r.barPercentage,start:l}}(t,r,a):function Ho(e,t,r){var d,l,a=r.barThickness,n=t.stackCount,o=t.pixels[e],s=m.isNullOrUndef(a)?function Bo(e,t){var a,n,o,s,r=e._length;for(o=1,s=t.length;o<s;++o)r=Math.min(r,Math.abs(t[o]-t[o-1]));for(o=0,s=e.getTicks().length;o<s;++o)n=e.getPixelForTick(o),r=o>0?Math.min(r,Math.abs(n-a)):r,a=n;return r}(t.scale,t.pixels):-1;return m.isNullOrUndef(a)?(d=s*r.categoryPercentage,l=r.barPercentage):(d=a*n,l=1),{chunk:d/n,ratio:l,start:o-d/2}}(t,r,a),s=this.getStackIndex(e,this.getMeta().stack),d=o.start+o.chunk*s+o.chunk/2,l=Math.min(ct(a.maxBarThickness,1/0),o.chunk*o.ratio);return{base:d-l/2,head:d+l/2,center:d,size:l}},draw:function(){var e=this,t=e.chart,r=e._getValueScale(),a=e.getMeta().data,n=e.getDataset(),o=a.length,s=0;for(m.canvas.clipArea(t.ctx,t.chartArea);s<o;++s){var d=r._parseValue(n.data[s]);!isNaN(d.min)&&!isNaN(d.max)&&a[s].draw()}m.canvas.unclipArea(t.ctx)},_resolveDataElementOptions:function(){var e=this,t=m.extend({},me.prototype._resolveDataElementOptions.apply(e,arguments)),r=e._getIndexScale().options,a=e._getValueScale().options;return t.barPercentage=ct(r.barPercentage,t.barPercentage),t.barThickness=ct(r.barThickness,t.barThickness),t.categoryPercentage=ct(r.categoryPercentage,t.categoryPercentage),t.maxBarThickness=ct(r.maxBarThickness,t.maxBarThickness),t.minBarLength=ct(a.minBarLength,t.minBarLength),t}}),Er=m.valueOrDefault,Uo=m.options.resolve;F._set("bubble",{hover:{mode:"single"},scales:{xAxes:[{type:"linear",position:"bottom",id:"x-axis-0"}],yAxes:[{type:"linear",position:"left",id:"y-axis-0"}]},tooltips:{callbacks:{title:function(){return""},label:function(e,t){return(t.datasets[e.datasetIndex].label||"")+": ("+e.xLabel+", "+e.yLabel+", "+t.datasets[e.datasetIndex].data[e.index].r+")"}}}});var jo=me.extend({dataElementType:se.Point,_dataElementOptions:["backgroundColor","borderColor","borderWidth","hoverBackgroundColor","hoverBorderColor","hoverBorderWidth","hoverRadius","hitRadius","pointStyle","rotation"],update:function(e){var t=this,r=t.getMeta();m.each(r.data,function(n,o){t.updateElement(n,o,e)})},updateElement:function(e,t,r){var a=this,n=a.getMeta(),o=e.custom||{},s=a.getScaleForId(n.xAxisID),d=a.getScaleForId(n.yAxisID),l=a._resolveDataElementOptions(e,t),f=a.getDataset().data[t],c=a.index,v=r?s.getPixelForDecimal(.5):s.getPixelForValue("object"==typeof f?f:NaN,t,c),p=r?d.getBasePixel():d.getPixelForValue(f,t,c);e._xScale=s,e._yScale=d,e._options=l,e._datasetIndex=c,e._index=t,e._model={backgroundColor:l.backgroundColor,borderColor:l.borderColor,borderWidth:l.borderWidth,hitRadius:l.hitRadius,pointStyle:l.pointStyle,rotation:l.rotation,radius:r?0:l.radius,skip:o.skip||isNaN(v)||isNaN(p),x:v,y:p},e.pivot()},setHoverStyle:function(e){var t=e._model,r=e._options,a=m.getHoverColor;e.$previousStyle={backgroundColor:t.backgroundColor,borderColor:t.borderColor,borderWidth:t.borderWidth,radius:t.radius},t.backgroundColor=Er(r.hoverBackgroundColor,a(r.backgroundColor)),t.borderColor=Er(r.hoverBorderColor,a(r.borderColor)),t.borderWidth=Er(r.hoverBorderWidth,r.borderWidth),t.radius=r.radius+r.hoverRadius},_resolveDataElementOptions:function(e,t){var r=this,a=r.chart,n=r.getDataset(),o=e.custom||{},s=n.data[t]||{},d=me.prototype._resolveDataElementOptions.apply(r,arguments),l={chart:a,dataIndex:t,dataset:n,datasetIndex:r.index};return r._cachedDataOpts===d&&(d=m.extend({},d)),d.radius=Uo([o.radius,s.r,r._config.radius,a.options.elements.point.radius],l,t),d}}),tr=m.valueOrDefault,Ke=Math.PI,Fe=2*Ke,Je=Ke/2;F._set("doughnut",{animation:{animateRotate:!0,animateScale:!1},hover:{mode:"single"},legendCallback:function(e){var o,s,d,t=document.createElement("ul"),r=e.data,a=r.datasets,n=r.labels;if(t.setAttribute("class",e.id+"-legend"),a.length)for(o=0,s=a[0].data.length;o<s;++o)(d=t.appendChild(document.createElement("li"))).appendChild(document.createElement("span")).style.backgroundColor=a[0].backgroundColor[o],n[o]&&d.appendChild(document.createTextNode(n[o]));return t.outerHTML},legend:{labels:{generateLabels:function(e){var t=e.data;return t.labels.length&&t.datasets.length?t.labels.map(function(r,a){var n=e.getDatasetMeta(0),o=n.controller.getStyle(a);return{text:r,fillStyle:o.backgroundColor,strokeStyle:o.borderColor,lineWidth:o.borderWidth,hidden:isNaN(t.datasets[0].data[a])||n.data[a].hidden,index:a}}):[]}},onClick:function(e,t){var n,o,s,r=t.index,a=this.chart;for(n=0,o=(a.data.datasets||[]).length;n<o;++n)(s=a.getDatasetMeta(n)).data[r]&&(s.data[r].hidden=!s.data[r].hidden);a.update()}},cutoutPercentage:50,rotation:-Je,circumference:Fe,tooltips:{callbacks:{title:function(){return""},label:function(e,t){var r=t.labels[e.index],a=": "+t.datasets[e.datasetIndex].data[e.index];return m.isArray(r)?(r=r.slice())[0]+=a:r+=a,r}}}});var un=me.extend({dataElementType:se.Arc,linkScales:m.noop,_dataElementOptions:["backgroundColor","borderColor","borderWidth","borderAlign","hoverBackgroundColor","hoverBorderColor","hoverBorderWidth"],getRingIndex:function(e){for(var t=0,r=0;r<e;++r)this.chart.isDatasetVisible(r)&&++t;return t},update:function(e){var x,M,t=this,r=t.chart,a=r.chartArea,n=r.options,o=1,s=1,d=0,l=0,f=t.getMeta(),c=f.data,v=n.cutoutPercentage/100||0,p=n.circumference,y=t._getRingWeight(t.index);if(p<Fe){var T=n.rotation%Fe,C=(T+=T>=Ke?-Fe:T<-Ke?Fe:0)+p,I=Math.cos(T),A=Math.sin(T),z=Math.cos(C),N=Math.sin(C),Y=T<=0&&C>=0||C>=Fe,E=T<=Je&&C>=Je||C>=Fe+Je,J=T<=-Je&&C>=-Je||C>=Ke+Je,X=T===-Ke||C>=Ke?-1:Math.min(I,I*v,z,z*v),U=J?-1:Math.min(A,A*v,N,N*v),We=Y?1:Math.max(I,I*v,z,z*v),Ne=E?1:Math.max(A,A*v,N,N*v);o=(We-X)/2,s=(Ne-U)/2,d=-(We+X)/2,l=-(Ne+U)/2}for(x=0,M=c.length;x<M;++x)c[x]._options=t._resolveDataElementOptions(c[x],x);for(r.borderWidth=t.getMaxBorderWidth(),r.outerRadius=Math.max(Math.min((a.right-a.left-r.borderWidth)/o,(a.bottom-a.top-r.borderWidth)/s)/2,0),r.innerRadius=Math.max(r.outerRadius*v,0),r.radiusLength=(r.outerRadius-r.innerRadius)/(t._getVisibleDatasetWeightTotal()||1),r.offsetX=d*r.outerRadius,r.offsetY=l*r.outerRadius,f.total=t.calculateTotal(),t.outerRadius=r.outerRadius-r.radiusLength*t._getRingWeightOffset(t.index),t.innerRadius=Math.max(t.outerRadius-r.radiusLength*y,0),x=0,M=c.length;x<M;++x)t.updateElement(c[x],x,e)},updateElement:function(e,t,r){var a=this,n=a.chart,o=n.chartArea,s=n.options,d=s.animation,l=(o.left+o.right)/2,f=(o.top+o.bottom)/2,c=s.rotation,v=s.rotation,p=a.getDataset(),y=r&&d.animateRotate||e.hidden?0:a.calculateCircumference(p.data[t])*(s.circumference/Fe),x=e._options||{};m.extend(e,{_datasetIndex:a.index,_index:t,_model:{backgroundColor:x.backgroundColor,borderColor:x.borderColor,borderWidth:x.borderWidth,borderAlign:x.borderAlign,x:l+n.offsetX,y:f+n.offsetY,startAngle:c,endAngle:v,circumference:y,outerRadius:r&&d.animateScale?0:a.outerRadius,innerRadius:r&&d.animateScale?0:a.innerRadius,label:m.valueAtIndexOrDefault(p.label,t,n.data.labels[t])}});var M=e._model;(!r||!d.animateRotate)&&(M.startAngle=0===t?s.rotation:a.getMeta().data[t-1]._model.endAngle,M.endAngle=M.startAngle+M.circumference),e.pivot()},calculateTotal:function(){var a,e=this.getDataset(),t=this.getMeta(),r=0;return m.each(t.data,function(n,o){a=e.data[o],!isNaN(a)&&!n.hidden&&(r+=Math.abs(a))}),r},calculateCircumference:function(e){var t=this.getMeta().total;return t>0&&!isNaN(e)?Fe*(Math.abs(e)/t):0},getMaxBorderWidth:function(e){var n,o,s,d,l,f,c,v,r=0,a=this.chart;if(!e)for(n=0,o=a.data.datasets.length;n<o;++n)if(a.isDatasetVisible(n)){e=(s=a.getDatasetMeta(n)).data,n!==this.index&&(l=s.controller);break}if(!e)return 0;for(n=0,o=e.length;n<o;++n)d=e[n],l?(l._configure(),f=l._resolveDataElementOptions(d,n)):f=d._options,"inner"!==f.borderAlign&&(r=(v=f.hoverBorderWidth)>(r=(c=f.borderWidth)>r?c:r)?v:r);return r},setHoverStyle:function(e){var t=e._model,r=e._options,a=m.getHoverColor;e.$previousStyle={backgroundColor:t.backgroundColor,borderColor:t.borderColor,borderWidth:t.borderWidth},t.backgroundColor=tr(r.hoverBackgroundColor,a(r.backgroundColor)),t.borderColor=tr(r.hoverBorderColor,a(r.borderColor)),t.borderWidth=tr(r.hoverBorderWidth,r.borderWidth)},_getRingWeightOffset:function(e){for(var t=0,r=0;r<e;++r)this.chart.isDatasetVisible(r)&&(t+=this._getRingWeight(r));return t},_getRingWeight:function(e){return Math.max(tr(this.chart.data.datasets[e].weight,1),0)},_getVisibleDatasetWeightTotal:function(){return this._getRingWeightOffset(this.chart.data.datasets.length)}});F._set("horizontalBar",{hover:{mode:"index",axis:"y"},scales:{xAxes:[{type:"linear",position:"bottom"}],yAxes:[{type:"category",position:"left",offset:!0,gridLines:{offsetGridLines:!0}}]},elements:{rectangle:{borderSkipped:"left"}},tooltips:{mode:"index",axis:"y"}}),F._set("global",{datasets:{horizontalBar:{categoryPercentage:.8,barPercentage:.9}}});var Go=ln.extend({_getValueScaleId:function(){return this.getMeta().xAxisID},_getIndexScaleId:function(){return this.getMeta().yAxisID}}),Ae=m.valueOrDefault,$o=m.options.resolve,zr=m.canvas._isPointInArea;function dn(e,t){var r=e&&e.options.ticks||{},a=r.reverse,n=void 0===r.min?t:0,o=void 0===r.max?t:0;return{start:a?o:n,end:a?n:o}}function qo(e,t,r){var a=r/2,n=dn(e,a),o=dn(t,a);return{top:o.end,right:n.end,bottom:o.start,left:n.start}}function Zo(e){var t,r,a,n;return m.isObject(e)?(t=e.top,r=e.right,a=e.bottom,n=e.left):t=r=a=n=e,{top:t,right:r,bottom:a,left:n}}F._set("line",{showLines:!0,spanGaps:!1,hover:{mode:"label"},scales:{xAxes:[{type:"category",id:"x-axis-0"}],yAxes:[{type:"linear",id:"y-axis-0"}]}});var fn=me.extend({datasetElementType:se.Line,dataElementType:se.Point,_datasetElementOptions:["backgroundColor","borderCapStyle","borderColor","borderDash","borderDashOffset","borderJoinStyle","borderWidth","cubicInterpolationMode","fill"],_dataElementOptions:{backgroundColor:"pointBackgroundColor",borderColor:"pointBorderColor",borderWidth:"pointBorderWidth",hitRadius:"pointHitRadius",hoverBackgroundColor:"pointHoverBackgroundColor",hoverBorderColor:"pointHoverBorderColor",hoverBorderWidth:"pointHoverBorderWidth",hoverRadius:"pointHoverRadius",pointStyle:"pointStyle",radius:"pointRadius",rotation:"pointRotation"},update:function(e){var l,f,t=this,r=t.getMeta(),a=r.dataset,n=r.data||[],s=t._config,d=t._showLine=Ae(s.showLine,t.chart.options.showLines);for(t._xScale=t.getScaleForId(r.xAxisID),t._yScale=t.getScaleForId(r.yAxisID),d&&(void 0!==s.tension&&void 0===s.lineTension&&(s.lineTension=s.tension),a._scale=t._yScale,a._datasetIndex=t.index,a._children=n,a._model=t._resolveDatasetElementOptions(a),a.pivot()),l=0,f=n.length;l<f;++l)t.updateElement(n[l],l,e);for(d&&0!==a._model.tension&&t.updateBezierControlPoints(),l=0,f=n.length;l<f;++l)n[l].pivot()},updateElement:function(e,t,r){var p,y,a=this,n=a.getMeta(),o=e.custom||{},s=a.getDataset(),d=a.index,l=s.data[t],f=a._xScale,c=a._yScale,v=n.dataset._model,_=a._resolveDataElementOptions(e,t);p=f.getPixelForValue("object"==typeof l?l:NaN,t,d),y=r?c.getBasePixel():a.calculatePointY(l,t,d),e._xScale=f,e._yScale=c,e._options=_,e._datasetIndex=d,e._index=t,e._model={x:p,y,skip:o.skip||isNaN(p)||isNaN(y),radius:_.radius,pointStyle:_.pointStyle,rotation:_.rotation,backgroundColor:_.backgroundColor,borderColor:_.borderColor,borderWidth:_.borderWidth,tension:Ae(o.tension,v?v.tension:0),steppedLine:!!v&&v.steppedLine,hitRadius:_.hitRadius}},_resolveDatasetElementOptions:function(e){var t=this,r=t._config,a=e.custom||{},n=t.chart.options,o=n.elements.line,s=me.prototype._resolveDatasetElementOptions.apply(t,arguments);return s.spanGaps=Ae(r.spanGaps,n.spanGaps),s.tension=Ae(r.lineTension,o.tension),s.steppedLine=$o([a.steppedLine,r.steppedLine,o.stepped]),s.clip=Zo(Ae(r.clip,qo(t._xScale,t._yScale,s.borderWidth))),s},calculatePointY:function(e,t,r){var l,c,v,p,y,_,n=this.chart,o=this._yScale,s=0,d=0;if(o.options.stacked){for(p=+o.getRightValue(e),_=(y=n._getSortedVisibleDatasetMetas()).length,l=0;l<_&&(c=y[l]).index!==r;++l)"line"===c.type&&c.yAxisID===o.id&&((v=+o.getRightValue(n.data.datasets[c.index].data[t]))<0?d+=v||0:s+=v||0);return o.getPixelForValue(p<0?d+p:s+p)}return o.getPixelForValue(e)},updateBezierControlPoints:function(){var s,d,l,f,t=this.chart,r=this.getMeta(),a=r.dataset._model,n=t.chartArea,o=r.data||[];function c(v,p,y){return Math.max(Math.min(v,y),p)}if(a.spanGaps&&(o=o.filter(function(v){return!v._model.skip})),"monotone"===a.cubicInterpolationMode)m.splineCurveMonotone(o);else for(s=0,d=o.length;s<d;++s)l=o[s]._model,f=m.splineCurve(m.previousItem(o,s)._model,l,m.nextItem(o,s)._model,a.tension),l.controlPointPreviousX=f.previous.x,l.controlPointPreviousY=f.previous.y,l.controlPointNextX=f.next.x,l.controlPointNextY=f.next.y;if(t.options.elements.line.capBezierPoints)for(s=0,d=o.length;s<d;++s)zr(l=o[s]._model,n)&&(s>0&&zr(o[s-1]._model,n)&&(l.controlPointPreviousX=c(l.controlPointPreviousX,n.left,n.right),l.controlPointPreviousY=c(l.controlPointPreviousY,n.top,n.bottom)),s<o.length-1&&zr(o[s+1]._model,n)&&(l.controlPointNextX=c(l.controlPointNextX,n.left,n.right),l.controlPointNextY=c(l.controlPointNextY,n.top,n.bottom)))},draw:function(){var l,e=this,t=e.chart,r=e.getMeta(),a=r.data||[],n=t.chartArea,o=t.canvas,s=0,d=a.length;for(e._showLine&&(m.canvas.clipArea(t.ctx,{left:!1===(l=r.dataset._model.clip).left?0:n.left-l.left,right:!1===l.right?o.width:n.right+l.right,top:!1===l.top?0:n.top-l.top,bottom:!1===l.bottom?o.height:n.bottom+l.bottom}),r.dataset.draw(),m.canvas.unclipArea(t.ctx));s<d;++s)a[s].draw(n)},setHoverStyle:function(e){var t=e._model,r=e._options,a=m.getHoverColor;e.$previousStyle={backgroundColor:t.backgroundColor,borderColor:t.borderColor,borderWidth:t.borderWidth,radius:t.radius},t.backgroundColor=Ae(r.hoverBackgroundColor,a(r.backgroundColor)),t.borderColor=Ae(r.hoverBorderColor,a(r.borderColor)),t.borderWidth=Ae(r.hoverBorderWidth,r.borderWidth),t.radius=Ae(r.hoverRadius,r.radius)}}),Xo=m.options.resolve;F._set("polarArea",{scale:{type:"radialLinear",angleLines:{display:!1},gridLines:{circular:!0},pointLabels:{display:!1},ticks:{beginAtZero:!0}},animation:{animateRotate:!0,animateScale:!0},startAngle:-.5*Math.PI,legendCallback:function(e){var o,s,d,t=document.createElement("ul"),r=e.data,a=r.datasets,n=r.labels;if(t.setAttribute("class",e.id+"-legend"),a.length)for(o=0,s=a[0].data.length;o<s;++o)(d=t.appendChild(document.createElement("li"))).appendChild(document.createElement("span")).style.backgroundColor=a[0].backgroundColor[o],n[o]&&d.appendChild(document.createTextNode(n[o]));return t.outerHTML},legend:{labels:{generateLabels:function(e){var t=e.data;return t.labels.length&&t.datasets.length?t.labels.map(function(r,a){var n=e.getDatasetMeta(0),o=n.controller.getStyle(a);return{text:r,fillStyle:o.backgroundColor,strokeStyle:o.borderColor,lineWidth:o.borderWidth,hidden:isNaN(t.datasets[0].data[a])||n.data[a].hidden,index:a}}):[]}},onClick:function(e,t){var n,o,s,r=t.index,a=this.chart;for(n=0,o=(a.data.datasets||[]).length;n<o;++n)(s=a.getDatasetMeta(n)).data[r].hidden=!s.data[r].hidden;a.update()}},tooltips:{callbacks:{title:function(){return""},label:function(e,t){return t.labels[e.index]+": "+e.yLabel}}}});var Ko=me.extend({dataElementType:se.Arc,linkScales:m.noop,_dataElementOptions:["backgroundColor","borderColor","borderWidth","borderAlign","hoverBackgroundColor","hoverBorderColor","hoverBorderWidth"],_getIndexScaleId:function(){return this.chart.scale.id},_getValueScaleId:function(){return this.chart.scale.id},update:function(e){var l,f,c,t=this,r=t.getDataset(),a=t.getMeta(),n=t.chart.options.startAngle||0,o=t._starts=[],s=t._angles=[],d=a.data;for(t._updateRadius(),a.count=t.countVisibleElements(),l=0,f=r.data.length;l<f;l++)o[l]=n,c=t._computeAngle(l),s[l]=c,n+=c;for(l=0,f=d.length;l<f;++l)d[l]._options=t._resolveDataElementOptions(d[l],l),t.updateElement(d[l],l,e)},_updateRadius:function(){var e=this,t=e.chart,r=t.chartArea,a=t.options,n=Math.min(r.right-r.left,r.bottom-r.top);t.outerRadius=Math.max(n/2,0),t.innerRadius=Math.max(a.cutoutPercentage?t.outerRadius/100*a.cutoutPercentage:1,0),t.radiusLength=(t.outerRadius-t.innerRadius)/t.getVisibleDatasetCount(),e.outerRadius=t.outerRadius-t.radiusLength*e.index,e.innerRadius=e.outerRadius-t.radiusLength},updateElement:function(e,t,r){var a=this,n=a.chart,o=a.getDataset(),s=n.options,d=s.animation,l=n.scale,f=n.data.labels,c=l.xCenter,v=l.yCenter,p=s.startAngle,y=e.hidden?0:l.getDistanceFromCenterForValue(o.data[t]),_=a._starts[t],w=_+(e.hidden?0:a._angles[t]),x=d.animateScale?0:l.getDistanceFromCenterForValue(o.data[t]),M=e._options||{};m.extend(e,{_datasetIndex:a.index,_index:t,_scale:l,_model:{backgroundColor:M.backgroundColor,borderColor:M.borderColor,borderWidth:M.borderWidth,borderAlign:M.borderAlign,x:c,y:v,innerRadius:0,outerRadius:r?x:y,startAngle:r&&d.animateRotate?p:_,endAngle:r&&d.animateRotate?p:w,label:m.valueAtIndexOrDefault(f,t,f[t])}}),e.pivot()},countVisibleElements:function(){var e=this.getDataset(),t=this.getMeta(),r=0;return m.each(t.data,function(a,n){!isNaN(e.data[n])&&!a.hidden&&r++}),r},setHoverStyle:function(e){var t=e._model,r=e._options,a=m.getHoverColor,n=m.valueOrDefault;e.$previousStyle={backgroundColor:t.backgroundColor,borderColor:t.borderColor,borderWidth:t.borderWidth},t.backgroundColor=n(r.hoverBackgroundColor,a(r.backgroundColor)),t.borderColor=n(r.hoverBorderColor,a(r.borderColor)),t.borderWidth=n(r.hoverBorderWidth,r.borderWidth)},_computeAngle:function(e){var t=this,r=this.getMeta().count,a=t.getDataset(),n=t.getMeta();return isNaN(a.data[e])||n.data[e].hidden?0:Xo([t.chart.options.elements.arc.angle,2*Math.PI/r],{chart:t.chart,dataIndex:e,dataset:a,datasetIndex:t.index},e)}});F._set("pie",m.clone(F.doughnut)),F._set("pie",{cutoutPercentage:0});var Jo=un,Qe=m.valueOrDefault;F._set("radar",{spanGaps:!1,scale:{type:"radialLinear"},elements:{line:{fill:"start",tension:0}}});var Qo=me.extend({datasetElementType:se.Line,dataElementType:se.Point,linkScales:m.noop,_datasetElementOptions:["backgroundColor","borderWidth","borderColor","borderCapStyle","borderDash","borderDashOffset","borderJoinStyle","fill"],_dataElementOptions:{backgroundColor:"pointBackgroundColor",borderColor:"pointBorderColor",borderWidth:"pointBorderWidth",hitRadius:"pointHitRadius",hoverBackgroundColor:"pointHoverBackgroundColor",hoverBorderColor:"pointHoverBorderColor",hoverBorderWidth:"pointHoverBorderWidth",hoverRadius:"pointHoverRadius",pointStyle:"pointStyle",radius:"pointRadius",rotation:"pointRotation"},_getIndexScaleId:function(){return this.chart.scale.id},_getValueScaleId:function(){return this.chart.scale.id},update:function(e){var d,l,t=this,r=t.getMeta(),a=r.dataset,n=r.data||[],o=t.chart.scale,s=t._config;for(void 0!==s.tension&&void 0===s.lineTension&&(s.lineTension=s.tension),a._scale=o,a._datasetIndex=t.index,a._children=n,a._loop=!0,a._model=t._resolveDatasetElementOptions(a),a.pivot(),d=0,l=n.length;d<l;++d)t.updateElement(n[d],d,e);for(t.updateBezierControlPoints(),d=0,l=n.length;d<l;++d)n[d].pivot()},updateElement:function(e,t,r){var a=this,n=e.custom||{},o=a.getDataset(),s=a.chart.scale,d=s.getPointPositionForValue(t,o.data[t]),l=a._resolveDataElementOptions(e,t),f=a.getMeta().dataset._model,c=r?s.xCenter:d.x,v=r?s.yCenter:d.y;e._scale=s,e._options=l,e._datasetIndex=a.index,e._index=t,e._model={x:c,y:v,skip:n.skip||isNaN(c)||isNaN(v),radius:l.radius,pointStyle:l.pointStyle,rotation:l.rotation,backgroundColor:l.backgroundColor,borderColor:l.borderColor,borderWidth:l.borderWidth,tension:Qe(n.tension,f?f.tension:0),hitRadius:l.hitRadius}},_resolveDatasetElementOptions:function(){var e=this,t=e._config,r=e.chart.options,a=me.prototype._resolveDatasetElementOptions.apply(e,arguments);return a.spanGaps=Qe(t.spanGaps,r.spanGaps),a.tension=Qe(t.lineTension,r.elements.line.tension),a},updateBezierControlPoints:function(){var n,o,s,d,t=this.getMeta(),r=this.chart.chartArea,a=t.data||[];function l(f,c,v){return Math.max(Math.min(f,v),c)}for(t.dataset._model.spanGaps&&(a=a.filter(function(f){return!f._model.skip})),n=0,o=a.length;n<o;++n)s=a[n]._model,d=m.splineCurve(m.previousItem(a,n,!0)._model,s,m.nextItem(a,n,!0)._model,s.tension),s.controlPointPreviousX=l(d.previous.x,r.left,r.right),s.controlPointPreviousY=l(d.previous.y,r.top,r.bottom),s.controlPointNextX=l(d.next.x,r.left,r.right),s.controlPointNextY=l(d.next.y,r.top,r.bottom)},setHoverStyle:function(e){var t=e._model,r=e._options,a=m.getHoverColor;e.$previousStyle={backgroundColor:t.backgroundColor,borderColor:t.borderColor,borderWidth:t.borderWidth,radius:t.radius},t.backgroundColor=Qe(r.hoverBackgroundColor,a(r.backgroundColor)),t.borderColor=Qe(r.hoverBorderColor,a(r.borderColor)),t.borderWidth=Qe(r.hoverBorderWidth,r.borderWidth),t.radius=Qe(r.hoverRadius,r.radius)}});F._set("scatter",{hover:{mode:"single"},scales:{xAxes:[{id:"x-axis-1",type:"linear",position:"bottom"}],yAxes:[{id:"y-axis-1",type:"linear",position:"left"}]},tooltips:{callbacks:{title:function(){return""},label:function(e){return"("+e.xLabel+", "+e.yLabel+")"}}}}),F._set("global",{datasets:{scatter:{showLine:!1}}});var hn={bar:ln,bubble:jo,doughnut:un,horizontalBar:Go,line:fn,polarArea:Ko,pie:Jo,radar:Qo,scatter:fn};function et(e,t){return e.native?{x:e.x,y:e.y}:m.getRelativePosition(e,t)}function Ft(e,t){var a,n,o,s,d,l,r=e._getSortedVisibleDatasetMetas();for(n=0,s=r.length;n<s;++n)for(o=0,d=(a=r[n].data).length;o<d;++o)(l=a[o])._view.skip||t(l)}function Br(e,t){var r=[];return Ft(e,function(a){a.inRange(t.x,t.y)&&r.push(a)}),r}function Hr(e,t,r,a){var n=Number.POSITIVE_INFINITY,o=[];return Ft(e,function(s){if(!r||s.inRange(t.x,t.y)){var d=s.getCenterPoint(),l=a(t,d);l<n?(o=[s],n=l):l===n&&o.push(s)}}),o}function Vr(e){var t=-1!==e.indexOf("x"),r=-1!==e.indexOf("y");return function(a,n){var o=t?Math.abs(a.x-n.x):0,s=r?Math.abs(a.y-n.y):0;return Math.sqrt(Math.pow(o,2)+Math.pow(s,2))}}function Ur(e,t,r){var a=et(t,e);r.axis=r.axis||"x";var n=Vr(r.axis),o=r.intersect?Br(e,a):Hr(e,a,!1,n),s=[];return o.length?(e._getSortedVisibleDatasetMetas().forEach(function(d){var l=d.data[o[0]._index];l&&!l._view.skip&&s.push(l)}),s):[]}var vt={modes:{single:function(e,t){var r=et(t,e),a=[];return Ft(e,function(n){if(n.inRange(r.x,r.y))return a.push(n),a}),a.slice(0,1)},label:Ur,index:Ur,dataset:function(e,t,r){var a=et(t,e);r.axis=r.axis||"xy";var n=Vr(r.axis),o=r.intersect?Br(e,a):Hr(e,a,!1,n);return o.length>0&&(o=e.getDatasetMeta(o[0]._datasetIndex).data),o},"x-axis":function(e,t){return Ur(e,t,{intersect:!1})},point:function(e,t){return Br(e,et(t,e))},nearest:function(e,t,r){var a=et(t,e);r.axis=r.axis||"xy";var n=Vr(r.axis);return Hr(e,a,r.intersect,n)},x:function(e,t,r){var a=et(t,e),n=[],o=!1;return Ft(e,function(s){s.inXRange(a.x)&&n.push(s),s.inRange(a.x,a.y)&&(o=!0)}),r.intersect&&!o&&(n=[]),n},y:function(e,t,r){var a=et(t,e),n=[],o=!1;return Ft(e,function(s){s.inYRange(a.y)&&n.push(s),s.inRange(a.x,a.y)&&(o=!0)}),r.intersect&&!o&&(n=[]),n}}},jr=m.extend;function At(e,t){return m.where(e,function(r){return r.pos===t})}function rr(e,t){return e.sort(function(r,a){var n=t?a:r,o=t?r:a;return n.weight===o.weight?n.index-o.index:n.weight-o.weight})}function cn(e,t,r,a){return Math.max(e[r],t[r])+Math.max(e[a],t[a])}function ns(e,t,r){var o,s,a=r.box,n=e.maxPadding;if(r.size&&(e[r.pos]-=r.size),r.size=r.horizontal?a.height:a.width,e[r.pos]+=r.size,a.getPadding){var d=a.getPadding();n.top=Math.max(n.top,d.top),n.left=Math.max(n.left,d.left),n.bottom=Math.max(n.bottom,d.bottom),n.right=Math.max(n.right,d.right)}if(o=t.outerWidth-cn(n,e,"left","right"),s=t.outerHeight-cn(n,e,"top","bottom"),o!==e.w||s!==e.h){e.w=o,e.h=s;var l=r.horizontal?[o,e.w]:[s,e.h];return!(l[0]===l[1]||isNaN(l[0])&&isNaN(l[1]))}}function os(e,t){var r=t.maxPadding;return function a(n){var o={left:0,top:0,right:0,bottom:0};return n.forEach(function(s){o[s]=Math.max(t[s],r[s])}),o}(e?["left","right"]:["top","bottom"])}function ar(e,t,r){var n,o,s,d,l,f,a=[];for(n=0,o=e.length;n<o;++n)(d=(s=e[n]).box).update(s.width||t.w,s.height||t.h,os(s.horizontal,t)),ns(t,r,s)&&(f=!0,a.length&&(l=!0)),d.fullWidth||a.push(s);return l&&ar(a,t,r)||f}function vn(e,t,r){var s,d,l,f,a=r.padding,n=t.x,o=t.y;for(s=0,d=e.length;s<d;++s)f=(l=e[s]).box,l.horizontal?(f.left=f.fullWidth?a.left:t.left,f.right=f.fullWidth?r.outerWidth-a.right:t.left+t.w,f.top=o,f.bottom=o+f.height,f.width=f.right-f.left,o=f.bottom):(f.left=n,f.right=n+f.width,f.top=t.top,f.bottom=t.top+t.h,f.height=f.bottom-f.top,n=f.right);t.x=n,t.y=o}F._set("global",{layout:{padding:{top:0,right:0,bottom:0,left:0}}});var pe={defaults:{},addBox:function(e,t){e.boxes||(e.boxes=[]),t.fullWidth=t.fullWidth||!1,t.position=t.position||"top",t.weight=t.weight||0,t._layers=t._layers||function(){return[{z:0,draw:function(){t.draw.apply(t,arguments)}}]},e.boxes.push(t)},removeBox:function(e,t){var r=e.boxes?e.boxes.indexOf(t):-1;-1!==r&&e.boxes.splice(r,1)},configure:function(e,t,r){for(var s,a=["fullWidth","position","weight"],n=a.length,o=0;o<n;++o)r.hasOwnProperty(s=a[o])&&(t[s]=r[s])},update:function(e,t,r){if(e){var n=m.options.toPadding((e.options.layout||{}).padding),o=t-n.width,s=r-n.height,d=function as(e){var t=function ts(e){var r,a,n,t=[];for(r=0,a=(e||[]).length;r<a;++r)t.push({index:r,box:n=e[r],pos:n.position,horizontal:n.isHorizontal(),weight:n.weight});return t}(e),r=rr(At(t,"left"),!0),a=rr(At(t,"right")),n=rr(At(t,"top"),!0),o=rr(At(t,"bottom"));return{leftAndTop:r.concat(n),rightAndBottom:a.concat(o),chartArea:At(t,"chartArea"),vertical:r.concat(a),horizontal:n.concat(o)}}(e.boxes),l=d.vertical,f=d.horizontal,c=Object.freeze({outerWidth:t,outerHeight:r,padding:n,availableWidth:o,vBoxMaxWidth:o/2/l.length,hBoxMaxHeight:s/2}),v=jr({maxPadding:jr({},n),w:o,h:s,x:n.left,y:n.top},n);(function rs(e,t){var r,a,n;for(r=0,a=e.length;r<a;++r)(n=e[r]).width=n.horizontal?n.box.fullWidth&&t.availableWidth:t.vBoxMaxWidth,n.height=n.horizontal&&t.hBoxMaxHeight})(l.concat(f),c),ar(l,v,c),ar(f,v,c)&&ar(l,v,c),function is(e){var t=e.maxPadding;function r(a){var n=Math.max(t[a]-e[a],0);return e[a]+=n,n}e.y+=r("top"),e.x+=r("left"),r("right"),r("bottom")}(v),vn(d.leftAndTop,v,c),v.x+=v.w,v.y+=v.h,vn(d.rightAndBottom,v,c),e.chartArea={left:v.left,top:v.top,right:v.left+v.w,bottom:v.top+v.h},m.each(d.chartArea,function(p){var y=p.box;jr(y,e.chartArea),y.update(v.w,v.h)})}}},ds=function zi(e){return e&&e.default||e}(Object.freeze({__proto__:null,default:"/*\r\n * DOM element rendering detection\r\n * https://davidwalsh.name/detect-node-insertion\r\n */\r\n@keyframes chartjs-render-animation {\r\n\tfrom { opacity: 0.99; }\r\n\tto { opacity: 1; }\r\n}\r\n\r\n.chartjs-render-monitor {\r\n\tanimation: chartjs-render-animation 0.001s;\r\n}\r\n\r\n/*\r\n * DOM element resizing detection\r\n * https://github.com/marcj/css-element-queries\r\n */\r\n.chartjs-size-monitor,\r\n.chartjs-size-monitor-expand,\r\n.chartjs-size-monitor-shrink {\r\n\tposition: absolute;\r\n\tdirection: ltr;\r\n\tleft: 0;\r\n\ttop: 0;\r\n\tright: 0;\r\n\tbottom: 0;\r\n\toverflow: hidden;\r\n\tpointer-events: none;\r\n\tvisibility: hidden;\r\n\tz-index: -1;\r\n}\r\n\r\n.chartjs-size-monitor-expand > div {\r\n\tposition: absolute;\r\n\twidth: 1000000px;\r\n\theight: 1000000px;\r\n\tleft: 0;\r\n\ttop: 0;\r\n}\r\n\r\n.chartjs-size-monitor-shrink > div {\r\n\tposition: absolute;\r\n\twidth: 200%;\r\n\theight: 200%;\r\n\tleft: 0;\r\n\ttop: 0;\r\n}\r\n"})),ie="$chartjs",Gr="chartjs-",$r=Gr+"size-monitor",gn=Gr+"render-monitor",mn=["animationstart","webkitAnimationStart"],hs={touchstart:"mousedown",touchmove:"mousemove",touchend:"mouseup",pointerenter:"mouseenter",pointerdown:"mousedown",pointermove:"mousemove",pointerup:"mouseup",pointerleave:"mouseout",pointerout:"mouseout"};function pn(e,t){var r=m.getStyle(e,t),a=r&&r.match(/^(\d+)(\.\d+)?px$/);return a?Number(a[1]):void 0}var vs=function(){var e=!1;try{var t=Object.defineProperty({},"passive",{get:function(){e=!0}});window.addEventListener("e",null,t)}catch(r){}return e}(),bn=!!vs&&{passive:!0};function It(e,t,r){e.addEventListener(t,r,bn)}function qr(e,t,r){e.removeEventListener(t,r,bn)}function Zr(e,t,r,a,n){return{type:e,chart:t,native:n||null,x:void 0!==r?r:null,y:void 0!==a?a:null}}function Lt(e){var t=document.createElement("div");return t.className=e||"",t}var yn={disableCSSInjection:!1,_enabled:"undefined"!=typeof window&&"undefined"!=typeof document,_ensureLoaded:function(e){if(!this.disableCSSInjection){var t=e.getRootNode?e.getRootNode():document;!function ws(e,t){var r=e[ie]||(e[ie]={});if(!r.containsStyles){r.containsStyles=!0,t="/* Chart.js */\n"+t;var a=document.createElement("style");a.setAttribute("type","text/css"),a.appendChild(document.createTextNode(t)),e.appendChild(a)}}(t.host?t:document.head,ds)}},acquireContext:function(e,t){"string"==typeof e?e=document.getElementById(e):e.length&&(e=e[0]),e&&e.canvas&&(e=e.canvas);var r=e&&e.getContext&&e.getContext("2d");return r&&r.canvas===e?(this._ensureLoaded(e),function cs(e,t){var r=e.style,a=e.getAttribute("height"),n=e.getAttribute("width");if(e[ie]={initial:{height:a,width:n,style:{display:r.display,height:r.height,width:r.width}}},r.display=r.display||"block",null===n||""===n){var o=pn(e,"width");void 0!==o&&(e.width=o)}if(null===a||""===a)if(""===e.style.height)e.height=e.width/(t.options.aspectRatio||2);else{var s=pn(e,"height");void 0!==o&&(e.height=s)}}(e,t),r):null},releaseContext:function(e){var t=e.canvas;if(t[ie]){var r=t[ie].initial;["height","width"].forEach(function(a){var n=r[a];m.isNullOrUndef(n)?t.removeAttribute(a):t.setAttribute(a,n)}),m.each(r.style||{},function(a,n){t.style[n]=a}),t.width=t.width,delete t[ie]}},addEventListener:function(e,t,r){var a=e.canvas;if("resize"!==t){var n=r[ie]||(r[ie]={}),s=(n.proxies||(n.proxies={}))[e.id+"_"+t]=function(d){r(function gs(e,t){var r=hs[e.type]||e.type,a=m.getRelativePosition(e,t);return Zr(r,t,a.x,a.y,e)}(d,e))};It(a,t,s)}else!function _s(e,t,r){var a=e[ie]||(e[ie]={}),n=a.resizer=function ps(e){var t=1e6,r=Lt($r),a=Lt($r+"-expand"),n=Lt($r+"-shrink");a.appendChild(Lt()),n.appendChild(Lt()),r.appendChild(a),r.appendChild(n),r._reset=function(){a.scrollLeft=t,a.scrollTop=t,n.scrollLeft=t,n.scrollTop=t};var o=function(){r._reset(),e()};return It(a,"scroll",o.bind(a,"expand")),It(n,"scroll",o.bind(n,"shrink")),r}(function ms(e,t){var r=!1,a=[];return function(){a=Array.prototype.slice.call(arguments),t=t||this,r||(r=!0,m.requestAnimFrame.call(window,function(){r=!1,e.apply(t,a)}))}}(function(){if(a.resizer){var o=r.options.maintainAspectRatio&&e.parentNode,s=o?o.clientWidth:0;t(Zr("resize",r)),o&&o.clientWidth<s&&r.canvas&&t(Zr("resize",r))}}));!function bs(e,t){var r=e[ie]||(e[ie]={}),a=r.renderProxy=function(n){"chartjs-render-animation"===n.animationName&&t()};m.each(mn,function(n){It(e,n,a)}),r.reflow=!!e.offsetParent,e.classList.add(gn)}(e,function(){if(a.resizer){var o=e.parentNode;o&&o!==n.parentNode&&o.insertBefore(n,o.firstChild),n._reset()}})}(a,r,e)},removeEventListener:function(e,t,r){var a=e.canvas;if("resize"!==t){var s=((r[ie]||{}).proxies||{})[e.id+"_"+t];!s||qr(a,t,s)}else!function xs(e){var t=e[ie]||{},r=t.resizer;delete t.resizer,function ys(e){var t=e[ie]||{},r=t.renderProxy;r&&(m.each(mn,function(a){qr(e,a,r)}),delete t.renderProxy),e.classList.remove(gn)}(e),r&&r.parentNode&&r.parentNode.removeChild(r)}(a)}};m.addEvent=It,m.removeEvent=qr;var ks=yn._enabled?yn:{acquireContext:function(e){return e&&e.canvas&&(e=e.canvas),e&&e.getContext("2d")||null}},gt=m.extend({initialize:function(){},acquireContext:function(){},releaseContext:function(){},addEventListener:function(){},removeEventListener:function(){}},ks);F._set("global",{plugins:{}});var j={_plugins:[],_cacheId:0,register:function(e){var t=this._plugins;[].concat(e).forEach(function(r){-1===t.indexOf(r)&&t.push(r)}),this._cacheId++},unregister:function(e){var t=this._plugins;[].concat(e).forEach(function(r){var a=t.indexOf(r);-1!==a&&t.splice(a,1)}),this._cacheId++},clear:function(){this._plugins=[],this._cacheId++},count:function(){return this._plugins.length},getAll:function(){return this._plugins},notify:function(e,t,r){var o,s,d,l,f,a=this.descriptors(e),n=a.length;for(o=0;o<n;++o)if("function"==typeof(f=(d=(s=a[o]).plugin)[t])&&((l=[e].concat(r||[])).push(s.options),!1===f.apply(d,l)))return!1;return!0},descriptors:function(e){var t=e.$plugins||(e.$plugins={});if(t.id===this._cacheId)return t.descriptors;var r=[],a=[],n=e&&e.config||{},o=n.options&&n.options.plugins||{};return this._plugins.concat(n.plugins||[]).forEach(function(s){if(-1===r.indexOf(s)){var l=s.id,f=o[l];!1!==f&&(!0===f&&(f=m.clone(F.global.plugins[l])),r.push(s),a.push({plugin:s,options:f||{}}))}}),t.descriptors=a,t.id=this._cacheId,a},_invalidate:function(e){delete e.$plugins}},Rt={constructors:{},defaults:{},registerScaleType:function(e,t,r){this.constructors[e]=t,this.defaults[e]=m.clone(r)},getScaleConstructor:function(e){return this.constructors.hasOwnProperty(e)?this.constructors[e]:void 0},getScaleDefaults:function(e){return this.defaults.hasOwnProperty(e)?m.merge(Object.create(null),[F.scale,this.defaults[e]]):{}},updateScaleDefaults:function(e,t){var r=this;r.defaults.hasOwnProperty(e)&&(r.defaults[e]=m.extend(r.defaults[e],t))},addScalesToLayout:function(e){m.each(e.scales,function(t){t.fullWidth=t.options.fullWidth,t.position=t.options.position,t.weight=t.options.weight,pe.addBox(e,t)})}},Ie=m.valueOrDefault,Xr=m.rtl.getRtlAdapter;F._set("global",{tooltips:{enabled:!0,custom:null,mode:"nearest",position:"average",intersect:!0,backgroundColor:"rgba(0,0,0,0.8)",titleFontStyle:"bold",titleSpacing:2,titleMarginBottom:6,titleFontColor:"#fff",titleAlign:"left",bodySpacing:2,bodyFontColor:"#fff",bodyAlign:"left",footerFontStyle:"bold",footerSpacing:2,footerMarginTop:6,footerFontColor:"#fff",footerAlign:"left",yPadding:6,xPadding:6,caretPadding:2,caretSize:5,cornerRadius:6,multiKeyBackground:"#fff",displayColors:!0,borderColor:"rgba(0,0,0,0)",borderWidth:0,callbacks:{beforeTitle:m.noop,title:function(e,t){var r="",a=t.labels,n=a?a.length:0;if(e.length>0){var o=e[0];o.label?r=o.label:o.xLabel?r=o.xLabel:n>0&&o.index<n&&(r=a[o.index])}return r},afterTitle:m.noop,beforeBody:m.noop,beforeLabel:m.noop,label:function(e,t){var r=t.datasets[e.datasetIndex].label||"";return r&&(r+=": "),m.isNullOrUndef(e.value)?r+=e.yLabel:r+=e.value,r},labelColor:function(e,t){var n=t.getDatasetMeta(e.datasetIndex).data[e.index]._view;return{borderColor:n.borderColor,backgroundColor:n.backgroundColor}},labelTextColor:function(){return this._options.bodyFontColor},afterLabel:m.noop,afterBody:m.noop,beforeFooter:m.noop,footer:m.noop,afterFooter:m.noop}}});var _n={average:function(e){if(!e.length)return!1;var t,r,a=0,n=0,o=0;for(t=0,r=e.length;t<r;++t){var s=e[t];if(s&&s.hasValue()){var d=s.tooltipPosition();a+=d.x,n+=d.y,++o}}return{x:a/o,y:n/o}},nearest:function(e,t){var o,s,d,r=t.x,a=t.y,n=Number.POSITIVE_INFINITY;for(o=0,s=e.length;o<s;++o){var l=e[o];if(l&&l.hasValue()){var f=l.getCenterPoint(),c=m.distanceBetweenPoints(t,f);c<n&&(n=c,d=l)}}if(d){var v=d.tooltipPosition();r=v.x,a=v.y}return{x:r,y:a}}};function Ce(e,t){return t&&(m.isArray(t)?Array.prototype.push.apply(e,t):e.push(t)),e}function Le(e){return("string"==typeof e||e instanceof String)&&e.indexOf("\n")>-1?e.split("\n"):e}function Ms(e){var t=e._xScale,r=e._yScale||e._scale,a=e._index,n=e._datasetIndex,o=e._chart.getDatasetMeta(n).controller,s=o._getIndexScale(),d=o._getValueScale();return{xLabel:t?t.getLabelForIndex(a,n):"",yLabel:r?r.getLabelForIndex(a,n):"",label:s?""+s.getLabelForIndex(a,n):"",value:d?""+d.getLabelForIndex(a,n):"",index:a,datasetIndex:n,x:e._model.x,y:e._model.y}}function xn(e){var t=F.global;return{xPadding:e.xPadding,yPadding:e.yPadding,xAlign:e.xAlign,yAlign:e.yAlign,rtl:e.rtl,textDirection:e.textDirection,bodyFontColor:e.bodyFontColor,_bodyFontFamily:Ie(e.bodyFontFamily,t.defaultFontFamily),_bodyFontStyle:Ie(e.bodyFontStyle,t.defaultFontStyle),_bodyAlign:e.bodyAlign,bodyFontSize:Ie(e.bodyFontSize,t.defaultFontSize),bodySpacing:e.bodySpacing,titleFontColor:e.titleFontColor,_titleFontFamily:Ie(e.titleFontFamily,t.defaultFontFamily),_titleFontStyle:Ie(e.titleFontStyle,t.defaultFontStyle),titleFontSize:Ie(e.titleFontSize,t.defaultFontSize),_titleAlign:e.titleAlign,titleSpacing:e.titleSpacing,titleMarginBottom:e.titleMarginBottom,footerFontColor:e.footerFontColor,_footerFontFamily:Ie(e.footerFontFamily,t.defaultFontFamily),_footerFontStyle:Ie(e.footerFontStyle,t.defaultFontStyle),footerFontSize:Ie(e.footerFontSize,t.defaultFontSize),_footerAlign:e.footerAlign,footerSpacing:e.footerSpacing,footerMarginTop:e.footerMarginTop,caretSize:e.caretSize,cornerRadius:e.cornerRadius,backgroundColor:e.backgroundColor,opacity:0,legendColorBackground:e.multiKeyBackground,displayColors:e.displayColors,borderColor:e.borderColor,borderWidth:e.borderWidth}}function nr(e,t){return"center"===t?e.x+e.width/2:"right"===t?e.x+e.width-e.xPadding:e.x+e.xPadding}function wn(e){return Ce([],Le(e))}var Cs=De.extend({initialize:function(){this._model=xn(this._options),this._lastActive=[]},getTitle:function(){var e=this,t=e._options,r=t.callbacks,a=r.beforeTitle.apply(e,arguments),n=r.title.apply(e,arguments),o=r.afterTitle.apply(e,arguments),s=[];return s=Ce(s,Le(a)),s=Ce(s,Le(n)),Ce(s,Le(o))},getBeforeBody:function(){return wn(this._options.callbacks.beforeBody.apply(this,arguments))},getBody:function(e,t){var r=this,a=r._options.callbacks,n=[];return m.each(e,function(o){var s={before:[],lines:[],after:[]};Ce(s.before,Le(a.beforeLabel.call(r,o,t))),Ce(s.lines,a.label.call(r,o,t)),Ce(s.after,Le(a.afterLabel.call(r,o,t))),n.push(s)}),n},getAfterBody:function(){return wn(this._options.callbacks.afterBody.apply(this,arguments))},getFooter:function(){var e=this,t=e._options.callbacks,r=t.beforeFooter.apply(e,arguments),a=t.footer.apply(e,arguments),n=t.afterFooter.apply(e,arguments),o=[];return o=Ce(o,Le(r)),o=Ce(o,Le(a)),Ce(o,Le(n))},update:function(e){var v,p,t=this,r=t._options,a=t._model,n=t._model=xn(r),o=t._active,s=t._data,d={xAlign:a.xAlign,yAlign:a.yAlign},l={x:a.x,y:a.y},f={width:a.width,height:a.height},c={x:a.caretX,y:a.caretY};if(o.length){n.opacity=1;var y=[],_=[];c=_n[r.position].call(t,o,t._eventPosition);var w=[];for(v=0,p=o.length;v<p;++v)w.push(Ms(o[v]));r.filter&&(w=w.filter(function(x){return r.filter(x,s)})),r.itemSort&&(w=w.sort(function(x,M){return r.itemSort(x,M,s)})),m.each(w,function(x){y.push(r.callbacks.labelColor.call(t,x,t._chart)),_.push(r.callbacks.labelTextColor.call(t,x,t._chart))}),n.title=t.getTitle(w,s),n.beforeBody=t.getBeforeBody(w,s),n.body=t.getBody(w,s),n.afterBody=t.getAfterBody(w,s),n.footer=t.getFooter(w,s),n.x=c.x,n.y=c.y,n.caretPadding=r.caretPadding,n.labelColors=y,n.labelTextColors=_,n.dataPoints=w,f=function Ss(e,t){var r=e._chart.ctx,a=2*t.yPadding,n=0,o=t.body,s=o.reduce(function(_,w){return _+w.before.length+w.lines.length+w.after.length},0),d=t.title.length,l=t.footer.length,f=t.titleFontSize,c=t.bodyFontSize,v=t.footerFontSize;a+=d*f,a+=d?(d-1)*t.titleSpacing:0,a+=d?t.titleMarginBottom:0,a+=(s+=t.beforeBody.length+t.afterBody.length)*c,a+=s?(s-1)*t.bodySpacing:0,a+=l?t.footerMarginTop:0,a+=l*v,a+=l?(l-1)*t.footerSpacing:0;var p=0,y=function(_){n=Math.max(n,r.measureText(_).width+p)};return r.font=m.fontString(f,t._titleFontStyle,t._titleFontFamily),m.each(t.title,y),r.font=m.fontString(c,t._bodyFontStyle,t._bodyFontFamily),m.each(t.beforeBody.concat(t.afterBody),y),p=t.displayColors?c+2:0,m.each(o,function(_){m.each(_.before,y),m.each(_.lines,y),m.each(_.after,y)}),p=0,r.font=m.fontString(v,t._footerFontStyle,t._footerFontFamily),m.each(t.footer,y),{width:n+=2*t.xPadding,height:a}}(this,n),d=function Ds(e,t){var r=e._model,a=e._chart,n=e._chart.chartArea,o="center",s="center";r.y<t.height?s="top":r.y>a.height-t.height&&(s="bottom");var d,l,f,c,v,p=(n.left+n.right)/2,y=(n.top+n.bottom)/2;"center"===s?(d=function(w){return w<=p},l=function(w){return w>p}):(d=function(w){return w<=t.width/2},l=function(w){return w>=a.width-t.width/2}),f=function(w){return w+t.width+r.caretSize+r.caretPadding>a.width},c=function(w){return w-t.width-r.caretSize-r.caretPadding<0},v=function(w){return w<=y?"top":"bottom"},d(r.x)?(o="left",f(r.x)&&(o="center",s=v(r.y))):l(r.x)&&(o="right",c(r.x)&&(o="center",s=v(r.y)));var _=e._options;return{xAlign:_.xAlign?_.xAlign:o,yAlign:_.yAlign?_.yAlign:s}}(this,f),l=function Ts(e,t,r,a){var n=e.x,o=e.y,d=e.caretPadding,f=r.xAlign,c=r.yAlign,v=e.caretSize+d,p=e.cornerRadius+d;return"right"===f?n-=t.width:"center"===f&&((n-=t.width/2)+t.width>a.width&&(n=a.width-t.width),n<0&&(n=0)),"top"===c?o+=v:o-="bottom"===c?t.height+v:t.height/2,"center"===c?"left"===f?n+=v:"right"===f&&(n-=v):"left"===f?n-=p:"right"===f&&(n+=p),{x:n,y:o}}(n,f,d,t._chart)}else n.opacity=0;return n.xAlign=d.xAlign,n.yAlign=d.yAlign,n.x=l.x,n.y=l.y,n.width=f.width,n.height=f.height,n.caretX=c.x,n.caretY=c.y,t._model=n,e&&r.custom&&r.custom.call(t,n),t},drawCaret:function(e,t){var r=this._chart.ctx,n=this.getCaretPosition(e,t,this._view);r.lineTo(n.x1,n.y1),r.lineTo(n.x2,n.y2),r.lineTo(n.x3,n.y3)},getCaretPosition:function(e,t,r){var a,n,o,s,d,l,f=r.caretSize,c=r.cornerRadius,v=r.xAlign,p=r.yAlign,y=e.x,_=e.y,w=t.width,x=t.height;if("center"===p)d=_+x/2,"left"===v?(n=(a=y)-f,o=a,s=d+f,l=d-f):(n=(a=y+w)+f,o=a,s=d-f,l=d+f);else if("left"===v?(a=(n=y+c+f)-f,o=n+f):"right"===v?(a=(n=y+w-c-f)-f,o=n+f):(a=(n=r.caretX)-f,o=n+f),"top"===p)d=(s=_)-f,l=s;else{d=(s=_+x)+f,l=s;var M=o;o=a,a=M}return{x1:a,x2:n,x3:o,y1:s,y2:d,y3:l}},drawTitle:function(e,t,r){var o,s,d,a=t.title,n=a.length;if(n){var l=Xr(t.rtl,t.x,t.width);for(e.x=nr(t,t._titleAlign),r.textAlign=l.textAlign(t._titleAlign),r.textBaseline="middle",o=t.titleFontSize,s=t.titleSpacing,r.fillStyle=t.titleFontColor,r.font=m.fontString(o,t._titleFontStyle,t._titleFontFamily),d=0;d<n;++d)r.fillText(a[d],l.x(e.x),e.y+o/2),e.y+=o+s,d+1===n&&(e.y+=t.titleMarginBottom-s)}},drawBody:function(e,t,r){var p,y,_,w,x,M,T,C,a=t.bodyFontSize,n=t.bodySpacing,o=t._bodyAlign,s=t.body,d=t.displayColors,l=0,f=d?nr(t,"left"):0,c=Xr(t.rtl,t.x,t.width),v=function(z){r.fillText(z,c.x(e.x+l),e.y+a/2),e.y+=a+n},I=c.textAlign(o);for(r.textAlign=o,r.textBaseline="middle",r.font=m.fontString(a,t._bodyFontStyle,t._bodyFontFamily),e.x=nr(t,I),r.fillStyle=t.bodyFontColor,m.each(t.beforeBody,v),l=d&&"right"!==I?"center"===o?a/2+1:a+2:0,x=0,T=s.length;x<T;++x){for(p=s[x],_=t.labelColors[x],r.fillStyle=y=t.labelTextColors[x],m.each(p.before,v),M=0,C=(w=p.lines).length;M<C;++M){if(d){var A=c.x(f);r.fillStyle=t.legendColorBackground,r.fillRect(c.leftForLtr(A,a),e.y,a,a),r.lineWidth=1,r.strokeStyle=_.borderColor,r.strokeRect(c.leftForLtr(A,a),e.y,a,a),r.fillStyle=_.backgroundColor,r.fillRect(c.leftForLtr(c.xPlus(A,1),a-2),e.y+1,a-2,a-2),r.fillStyle=y}v(w[M])}m.each(p.after,v)}l=0,m.each(t.afterBody,v),e.y-=n},drawFooter:function(e,t,r){var o,s,a=t.footer,n=a.length;if(n){var d=Xr(t.rtl,t.x,t.width);for(e.x=nr(t,t._footerAlign),e.y+=t.footerMarginTop,r.textAlign=d.textAlign(t._footerAlign),r.textBaseline="middle",o=t.footerFontSize,r.fillStyle=t.footerFontColor,r.font=m.fontString(o,t._footerFontStyle,t._footerFontFamily),s=0;s<n;++s)r.fillText(a[s],d.x(e.x),e.y+o/2),e.y+=o+t.footerSpacing}},drawBackground:function(e,t,r,a){r.fillStyle=t.backgroundColor,r.strokeStyle=t.borderColor,r.lineWidth=t.borderWidth;var n=t.xAlign,o=t.yAlign,s=e.x,d=e.y,l=a.width,f=a.height,c=t.cornerRadius;r.beginPath(),r.moveTo(s+c,d),"top"===o&&this.drawCaret(e,a),r.lineTo(s+l-c,d),r.quadraticCurveTo(s+l,d,s+l,d+c),"center"===o&&"right"===n&&this.drawCaret(e,a),r.lineTo(s+l,d+f-c),r.quadraticCurveTo(s+l,d+f,s+l-c,d+f),"bottom"===o&&this.drawCaret(e,a),r.lineTo(s+c,d+f),r.quadraticCurveTo(s,d+f,s,d+f-c),"center"===o&&"left"===n&&this.drawCaret(e,a),r.lineTo(s,d+c),r.quadraticCurveTo(s,d,s+c,d),r.closePath(),r.fill(),t.borderWidth>0&&r.stroke()},draw:function(){var e=this._chart.ctx,t=this._view;if(0!==t.opacity){var r={width:t.width,height:t.height},a={x:t.x,y:t.y},n=Math.abs(t.opacity<.001)?0:t.opacity;this._options.enabled&&(t.title.length||t.beforeBody.length||t.body.length||t.afterBody.length||t.footer.length)&&(e.save(),e.globalAlpha=n,this.drawBackground(a,t,e,r),a.y+=t.yPadding,m.rtl.overrideTextDirection(e,t.textDirection),this.drawTitle(a,t,e),this.drawBody(a,t,e),this.drawFooter(a,t,e),m.rtl.restoreTextDirection(e,t.textDirection),e.restore())}},handleEvent:function(e){var a,t=this,r=t._options;return t._lastActive=t._lastActive||[],"mouseout"===e.type?t._active=[]:(t._active=t._chart.getElementsAtEventForMode(e,r.mode,r),r.reverse&&t._active.reverse()),(a=!m.arrayEquals(t._active,t._lastActive))&&(t._lastActive=t._active,(r.enabled||r.custom)&&(t._eventPosition={x:e.x,y:e.y},t.update(!0),t.pivot())),a}}),Kr=Cs;Kr.positioners=_n;var Jr=m.valueOrDefault;function kn(){return m.merge(Object.create(null),[].slice.call(arguments),{merger:function(e,t,r,a){if("xAxes"===e||"yAxes"===e){var o,s,d,n=r[e].length;for(t[e]||(t[e]=[]),o=0;o<n;++o)s=Jr((d=r[e][o]).type,"xAxes"===e?"category":"linear"),o>=t[e].length&&t[e].push({}),m.merge(t[e][o],!t[e][o].type||d.type&&d.type!==t[e][o].type?[Rt.getScaleDefaults(s),d]:d)}else m._merger(e,t,r,a)}})}function Qr(){return m.merge(Object.create(null),[].slice.call(arguments),{merger:function(e,t,r,a){var n=t[e]||Object.create(null),o=r[e];"scales"===e?t[e]=kn(n,o):"scale"===e?t[e]=m.merge(n,[Rt.getScaleDefaults(o.type),o]):m._merger(e,t,r,a)}})}function Fs(e){var t=e.options;m.each(e.scales,function(r){pe.removeBox(e,r)}),t=Qr(F.global,F[e.config.type],t),e.options=e.config.options=t,e.ensureScalesHaveIDs(),e.buildOrUpdateScales(),e.tooltip._options=t.tooltips,e.tooltip.initialize()}function Mn(e,t,r){var a,n=function(o){return o.id===a};do{a=t+r++}while(m.findIndex(e,n)>=0);return a}function Sn(e){return"top"===e||"bottom"===e}function Dn(e,t){return function(r,a){return r[e]===a[e]?r[t]-a[t]:r[e]-a[e]}}F._set("global",{elements:{},events:["mousemove","mouseout","click","touchstart","touchmove"],hover:{onHover:null,mode:"nearest",intersect:!0,animationDuration:400},onClick:null,maintainAspectRatio:!0,responsive:!0,responsiveAnimationDuration:0});var Ve=function(e,t){return this.construct(e,t),this};m.extend(Ve.prototype,{construct:function(e,t){var r=this;t=function Os(e){var t=(e=e||Object.create(null)).data=e.data||{};return t.datasets=t.datasets||[],t.labels=t.labels||[],e.options=Qr(F.global,F[e.type],e.options||{}),e}(t);var a=gt.acquireContext(e,t),n=a&&a.canvas,o=n&&n.height,s=n&&n.width;r.id=m.uid(),r.ctx=a,r.canvas=n,r.config=t,r.width=s,r.height=o,r.aspectRatio=o?s/o:null,r.options=t.options,r._bufferedRender=!1,r._layers=[],r.chart=r,r.controller=r,Ve.instances[r.id]=r,Object.defineProperty(r,"data",{get:function(){return r.config.data},set:function(d){r.config.data=d}}),a&&n?(r.initialize(),r.update()):console.error("Failed to create chart: can't acquire context from the given item")},initialize:function(){var e=this;return j.notify(e,"beforeInit"),m.retinaScale(e,e.options.devicePixelRatio),e.bindEvents(),e.options.responsive&&e.resize(!0),e.initToolTip(),j.notify(e,"afterInit"),e},clear:function(){return m.canvas.clear(this),this},stop:function(){return Nr.cancelAnimation(this),this},resize:function(e){var t=this,r=t.options,a=t.canvas,n=r.maintainAspectRatio&&t.aspectRatio||null,o=Math.max(0,Math.floor(m.getMaximumWidth(a))),s=Math.max(0,Math.floor(n?o/n:m.getMaximumHeight(a)));if((t.width!==o||t.height!==s)&&(a.width=t.width=o,a.height=t.height=s,a.style.width=o+"px",a.style.height=s+"px",m.retinaScale(t,r.devicePixelRatio),!e)){var d={width:o,height:s};j.notify(t,"resize",[d]),r.onResize&&r.onResize(t,d),t.stop(),t.update({duration:r.responsiveAnimationDuration})}},ensureScalesHaveIDs:function(){var e=this.options,t=e.scales||{},r=e.scale;m.each(t.xAxes,function(a,n){a.id||(a.id=Mn(t.xAxes,"x-axis-",n))}),m.each(t.yAxes,function(a,n){a.id||(a.id=Mn(t.yAxes,"y-axis-",n))}),r&&(r.id=r.id||"scale")},buildOrUpdateScales:function(){var e=this,t=e.options,r=e.scales||{},a=[],n=Object.keys(r).reduce(function(o,s){return o[s]=!1,o},{});t.scales&&(a=a.concat((t.scales.xAxes||[]).map(function(o){return{options:o,dtype:"category",dposition:"bottom"}}),(t.scales.yAxes||[]).map(function(o){return{options:o,dtype:"linear",dposition:"left"}}))),t.scale&&a.push({options:t.scale,dtype:"radialLinear",isDefault:!0,dposition:"chartArea"}),m.each(a,function(o){var s=o.options,d=s.id,l=Jr(s.type,o.dtype);Sn(s.position)!==Sn(o.dposition)&&(s.position=o.dposition),n[d]=!0;var f=null;if(d in r&&r[d].type===l)(f=r[d]).options=s,f.ctx=e.ctx,f.chart=e;else{var c=Rt.getScaleConstructor(l);if(!c)return;f=new c({id:d,type:l,options:s,ctx:e.ctx,chart:e}),r[f.id]=f}f.mergeTicksOptions(),o.isDefault&&(e.scale=f)}),m.each(n,function(o,s){o||delete r[s]}),e.scales=r,Rt.addScalesToLayout(this)},buildOrUpdateControllers:function(){var a,n,e=this,t=[],r=e.data.datasets;for(a=0,n=r.length;a<n;a++){var o=r[a],s=e.getDatasetMeta(a),d=o.type||e.config.type;if(s.type&&s.type!==d&&(e.destroyDatasetMeta(a),s=e.getDatasetMeta(a)),s.type=d,s.order=o.order||0,s.index=a,s.controller)s.controller.updateIndex(a),s.controller.linkScales();else{var l=hn[s.type];if(void 0===l)throw new Error('"'+s.type+'" is not a chart type.');s.controller=new l(e,a),t.push(s.controller)}}return t},resetElements:function(){var e=this;m.each(e.data.datasets,function(t,r){e.getDatasetMeta(r).controller.reset()},e)},reset:function(){this.resetElements(),this.tooltip.initialize()},update:function(e){var r,a,t=this;if((!e||"object"!=typeof e)&&(e={duration:e,lazy:arguments[1]}),Fs(t),j._invalidate(t),!1!==j.notify(t,"beforeUpdate")){t.tooltip._data=t.data;var n=t.buildOrUpdateControllers();for(r=0,a=t.data.datasets.length;r<a;r++)t.getDatasetMeta(r).controller.buildOrUpdateElements();t.updateLayout(),t.options.animation&&t.options.animation.duration&&m.each(n,function(o){o.reset()}),t.updateDatasets(),t.tooltip.initialize(),t.lastActive=[],j.notify(t,"afterUpdate"),t._layers.sort(Dn("z","_idx")),t._bufferedRender?t._bufferedRequest={duration:e.duration,easing:e.easing,lazy:e.lazy}:t.render(e)}},updateLayout:function(){var e=this;!1!==j.notify(e,"beforeLayout")&&(pe.update(this,this.width,this.height),e._layers=[],m.each(e.boxes,function(t){t._configure&&t._configure(),e._layers.push.apply(e._layers,t._layers())},e),e._layers.forEach(function(t,r){t._idx=r}),j.notify(e,"afterScaleUpdate"),j.notify(e,"afterLayout"))},updateDatasets:function(){var e=this;if(!1!==j.notify(e,"beforeDatasetsUpdate")){for(var t=0,r=e.data.datasets.length;t<r;++t)e.updateDataset(t);j.notify(e,"afterDatasetsUpdate")}},updateDataset:function(e){var t=this,r=t.getDatasetMeta(e),a={meta:r,index:e};!1!==j.notify(t,"beforeDatasetUpdate",[a])&&(r.controller._update(),j.notify(t,"afterDatasetUpdate",[a]))},render:function(e){var t=this;(!e||"object"!=typeof e)&&(e={duration:e,lazy:arguments[1]});var r=t.options.animation,a=Jr(e.duration,r&&r.duration),n=e.lazy;if(!1!==j.notify(t,"beforeRender")){var o=function(d){j.notify(t,"afterRender"),m.callback(r&&r.onComplete,[d],t)};if(r&&a){var s=new Wr({numSteps:a/16.66,easing:e.easing||r.easing,render:function(d,l){var c=l.currentStep,v=c/l.numSteps;d.draw((0,m.easing.effects[l.easing])(v),v,c)},onAnimationProgress:r.onProgress,onAnimationComplete:o});Nr.addAnimation(t,s,a,n)}else t.draw(),o(new Wr({numSteps:0,chart:t}));return t}},draw:function(e){var r,a,t=this;if(t.clear(),m.isNullOrUndef(e)&&(e=1),t.transition(e),!(t.width<=0||t.height<=0)&&!1!==j.notify(t,"beforeDraw",[e])){for(a=t._layers,r=0;r<a.length&&a[r].z<=0;++r)a[r].draw(t.chartArea);for(t.drawDatasets(e);r<a.length;++r)a[r].draw(t.chartArea);t._drawTooltip(e),j.notify(t,"afterDraw",[e])}},transition:function(e){for(var t=this,r=0,a=(t.data.datasets||[]).length;r<a;++r)t.isDatasetVisible(r)&&t.getDatasetMeta(r).controller.transition(e);t.tooltip.transition(e)},_getSortedDatasetMetas:function(e){var n,o,t=this,a=[];for(n=0,o=(t.data.datasets||[]).length;n<o;++n)(!e||t.isDatasetVisible(n))&&a.push(t.getDatasetMeta(n));return a.sort(Dn("order","index")),a},_getSortedVisibleDatasetMetas:function(){return this._getSortedDatasetMetas(!0)},drawDatasets:function(e){var r,a,t=this;if(!1!==j.notify(t,"beforeDatasetsDraw",[e])){for(a=(r=t._getSortedVisibleDatasetMetas()).length-1;a>=0;--a)t.drawDataset(r[a],e);j.notify(t,"afterDatasetsDraw",[e])}},drawDataset:function(e,t){var a={meta:e,index:e.index,easingValue:t};!1!==j.notify(this,"beforeDatasetDraw",[a])&&(e.controller.draw(t),j.notify(this,"afterDatasetDraw",[a]))},_drawTooltip:function(e){var t=this,r=t.tooltip,a={tooltip:r,easingValue:e};!1!==j.notify(t,"beforeTooltipDraw",[a])&&(r.draw(),j.notify(t,"afterTooltipDraw",[a]))},getElementAtEvent:function(e){return vt.modes.single(this,e)},getElementsAtEvent:function(e){return vt.modes.label(this,e,{intersect:!0})},getElementsAtXAxis:function(e){return vt.modes["x-axis"](this,e,{intersect:!0})},getElementsAtEventForMode:function(e,t,r){var a=vt.modes[t];return"function"==typeof a?a(this,e,r):[]},getDatasetAtEvent:function(e){return vt.modes.dataset(this,e,{intersect:!0})},getDatasetMeta:function(e){var t=this,r=t.data.datasets[e];r._meta||(r._meta={});var a=r._meta[t.id];return a||(a=r._meta[t.id]={type:null,data:[],dataset:null,controller:null,hidden:null,xAxisID:null,yAxisID:null,order:r.order||0,index:e}),a},getVisibleDatasetCount:function(){for(var e=0,t=0,r=this.data.datasets.length;t<r;++t)this.isDatasetVisible(t)&&e++;return e},isDatasetVisible:function(e){var t=this.getDatasetMeta(e);return"boolean"==typeof t.hidden?!t.hidden:!this.data.datasets[e].hidden},generateLegend:function(){return this.options.legendCallback(this)},destroyDatasetMeta:function(e){var t=this.id,r=this.data.datasets[e],a=r._meta&&r._meta[t];a&&(a.controller.destroy(),delete r._meta[t])},destroy:function(){var r,a,e=this,t=e.canvas;for(e.stop(),r=0,a=e.data.datasets.length;r<a;++r)e.destroyDatasetMeta(r);t&&(e.unbindEvents(),m.canvas.clear(e),gt.releaseContext(e.ctx),e.canvas=null,e.ctx=null),j.notify(e,"destroy"),delete Ve.instances[e.id]},toBase64Image:function(){return this.canvas.toDataURL.apply(this.canvas,arguments)},initToolTip:function(){var e=this;e.tooltip=new Kr({_chart:e,_chartInstance:e,_data:e.data,_options:e.options.tooltips},e)},bindEvents:function(){var e=this,t=e._listeners={},r=function(){e.eventHandler.apply(e,arguments)};m.each(e.options.events,function(a){gt.addEventListener(e,a,r),t[a]=r}),e.options.responsive&&(r=function(){e.resize()},gt.addEventListener(e,"resize",r),t.resize=r)},unbindEvents:function(){var e=this,t=e._listeners;!t||(delete e._listeners,m.each(t,function(r,a){gt.removeEventListener(e,a,r)}))},updateHoverStyle:function(e,t,r){var n,o,s,a=r?"set":"remove";for(o=0,s=e.length;o<s;++o)(n=e[o])&&this.getDatasetMeta(n._datasetIndex).controller[a+"HoverStyle"](n);"dataset"===t&&this.getDatasetMeta(e[0]._datasetIndex).controller["_"+a+"DatasetHoverStyle"]()},eventHandler:function(e){var t=this,r=t.tooltip;if(!1!==j.notify(t,"beforeEvent",[e])){t._bufferedRender=!0,t._bufferedRequest=null;var a=t.handleEvent(e);r&&(a=r._start?r.handleEvent(e):a|r.handleEvent(e)),j.notify(t,"afterEvent",[e]);var n=t._bufferedRequest;return n?t.render(n):a&&!t.animating&&(t.stop(),t.render({duration:t.options.hover.animationDuration,lazy:!0})),t._bufferedRender=!1,t._bufferedRequest=null,t}},handleEvent:function(e){var n,t=this,r=t.options||{},a=r.hover;return t.lastActive=t.lastActive||[],t.active="mouseout"===e.type?[]:t.getElementsAtEventForMode(e,a.mode,a),m.callback(r.onHover||r.hover.onHover,[e.native,t.active],t),("mouseup"===e.type||"click"===e.type)&&r.onClick&&r.onClick.call(t,e.native,t.active),t.lastActive.length&&t.updateHoverStyle(t.lastActive,a.mode,!1),t.active.length&&a.mode&&t.updateHoverStyle(t.active,a.mode,!0),n=!m.arrayEquals(t.active,t.lastActive),t.lastActive=t.active,n}}),Ve.instances={};var W=Ve;function tt(){throw new Error("This method is not implemented: either no adapter can be found or an incomplete integration was provided.")}function ir(e){this.options=e||{}}Ve.Controller=Ve,Ve.types={},m.configMerge=Qr,m.scaleMerge=kn,m.extend(ir.prototype,{formats:tt,parse:tt,format:tt,add:tt,diff:tt,startOf:tt,endOf:tt,_create:function(e){return e}}),ir.override=function(e){m.extend(ir.prototype,e)};var ea={_date:ir},Wt={formatters:{values:function(e){return m.isArray(e)?e:""+e},linear:function(e,t,r){var a=r.length>3?r[2]-r[1]:r[1]-r[0];Math.abs(a)>1&&e!==Math.floor(e)&&(a=e-Math.floor(e));var n=m.log10(Math.abs(a)),o="";if(0!==e)if(Math.max(Math.abs(r[0]),Math.abs(r[r.length-1]))<1e-4){var d=m.log10(Math.abs(e)),l=Math.floor(d)-Math.floor(n);l=Math.max(Math.min(l,20),0),o=e.toExponential(l)}else{var f=-1*Math.floor(n);f=Math.max(Math.min(f,20),0),o=e.toFixed(f)}else o="0";return o},logarithmic:function(e,t,r){var a=e/Math.pow(10,Math.floor(m.log10(e)));return 0===e?"0":1===a||2===a||5===a||0===t||t===r.length-1?e.toExponential():""}}},rt=m.isArray,Nt=m.isNullOrUndef,at=m.valueOrDefault,mt=m.valueAtIndexOrDefault;function Rs(e,t,r){var f,a=e.getTicks().length,n=Math.min(t,a-1),o=e.getPixelForTick(n),s=e._startPixel,d=e._endPixel,l=1e-6;if(!(r&&(f=1===a?Math.max(o-s,d-o):0===t?(e.getPixelForTick(1)-o)/2:(o-e.getPixelForTick(n-1))/2,o+=n<t?f:-f,o<s-l||o>d+l)))return o}function Yt(e){return e.drawTicks?e.tickMarkLength:0}function ta(e){var t,r;return e.display?(t=m.options._parseFont(e),r=m.options.toPadding(e.padding),t.lineHeight+r.height):0}function Tn(e,t){return m.extend(m.options._parseFont({fontFamily:at(t.fontFamily,e.fontFamily),fontSize:at(t.fontSize,e.fontSize),fontStyle:at(t.fontStyle,e.fontStyle),lineHeight:at(t.lineHeight,e.lineHeight)}),{color:m.options.resolve([t.fontColor,e.fontColor,F.global.defaultFontColor])})}function ra(e){var t=Tn(e,e.minor);return{minor:t,major:e.major.enabled?Tn(e,e.major):t}}function aa(e){var r,a,n,t=[];for(a=0,n=e.length;a<n;++a)void 0!==(r=e[a])._index&&t.push(r);return t}function or(e,t,r,a){var d,l,f,c,n=at(r,0),o=Math.min(at(a,e.length),e.length),s=0;for(t=Math.ceil(t),a&&(t=(d=a-r)/Math.floor(d/t)),c=n;c<0;)s++,c=Math.round(n+s*t);for(l=Math.max(n,0);l<o;l++)f=e[l],l===c?(f._index=l,s++,c=Math.round(n+s*t)):delete f.label}F._set("scale",{display:!0,position:"left",offset:!1,gridLines:{display:!0,color:"rgba(0,0,0,0.1)",lineWidth:1,drawBorder:!0,drawOnChartArea:!0,drawTicks:!0,tickMarkLength:10,zeroLineWidth:1,zeroLineColor:"rgba(0,0,0,0.25)",zeroLineBorderDash:[],zeroLineBorderDashOffset:0,offsetGridLines:!1,borderDash:[],borderDashOffset:0},scaleLabel:{display:!1,labelString:"",padding:{top:4,bottom:4}},ticks:{beginAtZero:!1,minRotation:0,maxRotation:50,mirror:!1,padding:0,reverse:!1,display:!0,autoSkip:!0,autoSkipPadding:0,labelOffset:0,callback:Wt.formatters.values,minor:{},major:{}}});var na=De.extend({zeroLineIndex:0,getPadding:function(){var e=this;return{left:e.paddingLeft||0,top:e.paddingTop||0,right:e.paddingRight||0,bottom:e.paddingBottom||0}},getTicks:function(){return this._ticks},_getLabels:function(){var e=this.chart.data;return this.options.labels||(this.isHorizontal()?e.xLabels:e.yLabels)||e.labels||[]},mergeTicksOptions:function(){},beforeUpdate:function(){m.callback(this.options.beforeUpdate,[this])},update:function(e,t,r){var s,d,l,f,c,a=this,n=a.options.ticks,o=n.sampleSize;if(a.beforeUpdate(),a.maxWidth=e,a.maxHeight=t,a.margins=m.extend({left:0,right:0,top:0,bottom:0},r),a._ticks=null,a.ticks=null,a._labelSizes=null,a._maxLabelLines=0,a.longestLabelWidth=0,a.longestTextCache=a.longestTextCache||{},a._gridLineItems=null,a._labelItems=null,a.beforeSetDimensions(),a.setDimensions(),a.afterSetDimensions(),a.beforeDataLimits(),a.determineDataLimits(),a.afterDataLimits(),a.beforeBuildTicks(),f=a.buildTicks()||[],(!(f=a.afterBuildTicks(f)||f)||!f.length)&&a.ticks)for(f=[],s=0,d=a.ticks.length;s<d;++s)f.push({value:a.ticks[s],major:!1});return a._ticks=f,l=a._convertTicksToLabels((c=o<f.length)?function Ls(e,t){for(var r=[],a=e.length/t,n=0,o=e.length;n<o;n+=a)r.push(e[Math.floor(n)]);return r}(f,o):f),a._configure(),a.beforeCalculateTickRotation(),a.calculateTickRotation(),a.afterCalculateTickRotation(),a.beforeFit(),a.fit(),a.afterFit(),a._ticksToDraw=n.display&&(n.autoSkip||"auto"===n.source)?a._autoSkip(f):f,c&&(l=a._convertTicksToLabels(a._ticksToDraw)),a.ticks=l,a.afterUpdate(),a.minSize},_configure:function(){var r,a,e=this,t=e.options.ticks.reverse;e.isHorizontal()?(r=e.left,a=e.right):(r=e.top,a=e.bottom,t=!t),e._startPixel=r,e._endPixel=a,e._reversePixels=t,e._length=a-r},afterUpdate:function(){m.callback(this.options.afterUpdate,[this])},beforeSetDimensions:function(){m.callback(this.options.beforeSetDimensions,[this])},setDimensions:function(){var e=this;e.isHorizontal()?(e.width=e.maxWidth,e.left=0,e.right=e.width):(e.height=e.maxHeight,e.top=0,e.bottom=e.height),e.paddingLeft=0,e.paddingTop=0,e.paddingRight=0,e.paddingBottom=0},afterSetDimensions:function(){m.callback(this.options.afterSetDimensions,[this])},beforeDataLimits:function(){m.callback(this.options.beforeDataLimits,[this])},determineDataLimits:m.noop,afterDataLimits:function(){m.callback(this.options.afterDataLimits,[this])},beforeBuildTicks:function(){m.callback(this.options.beforeBuildTicks,[this])},buildTicks:m.noop,afterBuildTicks:function(e){var t=this;return rt(e)&&e.length?m.callback(t.options.afterBuildTicks,[t,e]):(t.ticks=m.callback(t.options.afterBuildTicks,[t,t.ticks])||t.ticks,e)},beforeTickToLabelConversion:function(){m.callback(this.options.beforeTickToLabelConversion,[this])},convertTicksToLabels:function(){var e=this,t=e.options.ticks;e.ticks=e.ticks.map(t.userCallback||t.callback,this)},afterTickToLabelConversion:function(){m.callback(this.options.afterTickToLabelConversion,[this])},beforeCalculateTickRotation:function(){m.callback(this.options.beforeCalculateTickRotation,[this])},calculateTickRotation:function(){var d,l,f,c,v,p,y,e=this,t=e.options,r=t.ticks,a=e.getTicks().length,n=r.minRotation||0,o=r.maxRotation,s=n;!e._isVisible()||!r.display||n>=o||a<=1||!e.isHorizontal()?e.labelRotation=n:(l=(d=e._getLabelSizes()).widest.width,f=d.highest.height-d.highest.offset,c=Math.min(e.maxWidth,e.chart.width-l),l+6>(v=t.offset?e.maxWidth/a:c/(a-1))&&(v=c/(a-(t.offset?.5:1)),p=e.maxHeight-Yt(t.gridLines)-r.padding-ta(t.scaleLabel),y=Math.sqrt(l*l+f*f),s=m.toDegrees(Math.min(Math.asin(Math.min((d.highest.height+6)/v,1)),Math.asin(Math.min(p/y,1))-Math.asin(f/y))),s=Math.max(n,Math.min(o,s))),e.labelRotation=s)},afterCalculateTickRotation:function(){m.callback(this.options.afterCalculateTickRotation,[this])},beforeFit:function(){m.callback(this.options.beforeFit,[this])},fit:function(){var e=this,t=e.minSize={width:0,height:0},r=e.chart,a=e.options,n=a.ticks,o=a.scaleLabel,s=a.gridLines,d=e._isVisible(),l="bottom"===a.position,f=e.isHorizontal();if(f?t.width=e.maxWidth:d&&(t.width=Yt(s)+ta(o)),f?d&&(t.height=Yt(s)+ta(o)):t.height=e.maxHeight,n.display&&d){var c=ra(n),v=e._getLabelSizes(),p=v.first,y=v.last,_=v.widest,w=v.highest,x=.4*c.minor.lineHeight,M=n.padding;if(f){var T=0!==e.labelRotation,C=m.toRadians(e.labelRotation),I=Math.cos(C),A=Math.sin(C);t.height=Math.min(e.maxHeight,t.height+(A*_.width+I*(w.height-(T?w.offset:0))+(T?0:x))+M);var E,O,N=e.getPixelForTick(0)-e.left,Y=e.right-e.getPixelForTick(e.getTicks().length-1);T?(E=l?I*p.width+A*p.offset:A*(p.height-p.offset),O=l?A*(y.height-y.offset):I*y.width+A*y.offset):(E=p.width/2,O=y.width/2),e.paddingLeft=Math.max((E-N)*e.width/(e.width-N),0)+3,e.paddingRight=Math.max((O-Y)*e.width/(e.width-Y),0)+3}else t.width=Math.min(e.maxWidth,t.width+(n.mirror?0:_.width+M+x)),e.paddingTop=p.height/2,e.paddingBottom=y.height/2}e.handleMargins(),f?(e.width=e._length=r.width-e.margins.left-e.margins.right,e.height=t.height):(e.width=t.width,e.height=e._length=r.height-e.margins.top-e.margins.bottom)},handleMargins:function(){var e=this;e.margins&&(e.margins.left=Math.max(e.paddingLeft,e.margins.left),e.margins.top=Math.max(e.paddingTop,e.margins.top),e.margins.right=Math.max(e.paddingRight,e.margins.right),e.margins.bottom=Math.max(e.paddingBottom,e.margins.bottom))},afterFit:function(){m.callback(this.options.afterFit,[this])},isHorizontal:function(){var e=this.options.position;return"top"===e||"bottom"===e},isFullWidth:function(){return this.options.fullWidth},getRightValue:function(e){if(Nt(e))return NaN;if(("number"==typeof e||e instanceof Number)&&!isFinite(e))return NaN;if(e)if(this.isHorizontal()){if(void 0!==e.x)return this.getRightValue(e.x)}else if(void 0!==e.y)return this.getRightValue(e.y);return e},_convertTicksToLabels:function(e){var r,a,n,t=this;for(t.ticks=e.map(function(o){return o.value}),t.beforeTickToLabelConversion(),r=t.convertTicksToLabels(e)||t.ticks,t.afterTickToLabelConversion(),a=0,n=e.length;a<n;++a)e[a].label=r[a];return r},_getLabelSizes:function(){var e=this,t=e._labelSizes;return t||(e._labelSizes=t=function Ns(e,t,r,a){var c,v,p,y,_,w,x,M,T,C,I,A,z,n=r.length,o=[],s=[],d=[],l=0,f=0;for(c=0;c<n;++c){if(y=r[c].label,e.font=w=(_=r[c].major?t.major:t.minor).string,x=a[w]=a[w]||{data:{},gc:[]},M=_.lineHeight,T=C=0,Nt(y)||rt(y)){if(rt(y))for(v=0,p=y.length;v<p;++v)!Nt(I=y[v])&&!rt(I)&&(T=m.measureText(e,x.data,x.gc,T,I),C+=M)}else T=m.measureText(e,x.data,x.gc,T,y),C=M;o.push(T),s.push(C),d.push(M/2),l=Math.max(T,l),f=Math.max(C,f)}function N(Y){return{width:o[Y]||0,height:s[Y]||0,offset:d[Y]||0}}return function Ws(e,t){m.each(e,function(r){var o,a=r.gc,n=a.length/2;if(n>t){for(o=0;o<n;++o)delete r.data[a[o]];a.splice(0,n)}})}(a,n),A=o.indexOf(l),z=s.indexOf(f),{first:N(0),last:N(n-1),widest:N(A),highest:N(z)}}(e.ctx,ra(e.options.ticks),e.getTicks(),e.longestTextCache),e.longestLabelWidth=t.widest.width),t},_parseValue:function(e){var t,r,a,n;return rt(e)?(t=+this.getRightValue(e[0]),r=+this.getRightValue(e[1]),a=Math.min(t,r),n=Math.max(t,r)):(t=void 0,r=e=+this.getRightValue(e),a=e,n=e),{min:a,max:n,start:t,end:r}},_getScaleLabel:function(e){var t=this._parseValue(e);return void 0!==t.start?"["+t.start+", "+t.end+"]":+this.getRightValue(e)},getLabelForIndex:m.noop,getPixelForValue:m.noop,getValueForPixel:m.noop,getPixelForTick:function(e){var t=this,r=t.options.offset,a=t._ticks.length,n=1/Math.max(a-(r?0:1),1);return e<0||e>a-1?null:t.getPixelForDecimal(e*n+(r?n/2:0))},getPixelForDecimal:function(e){var t=this;return t._reversePixels&&(e=1-e),t._startPixel+e*t._length},getDecimalForPixel:function(e){var t=(e-this._startPixel)/this._length;return this._reversePixels?1-t:t},getBasePixel:function(){return this.getPixelForValue(this.getBaseValue())},getBaseValue:function(){var e=this,t=e.min,r=e.max;return e.beginAtZero?0:t<0&&r<0?r:t>0&&r>0?t:0},_autoSkip:function(e){var f,c,v,p,t=this,r=t.options.ticks,n=r.maxTicksLimit||t._length/t._tickSize()+1,o=r.major.enabled?function zs(e){var r,a,t=[];for(r=0,a=e.length;r<a;r++)e[r].major&&t.push(r);return t}(e):[],s=o.length,d=o[0],l=o[s-1];if(s>n)return function Bs(e,t,r){var o,s,a=0,n=t[0];for(r=Math.ceil(r),o=0;o<e.length;o++)s=e[o],o===n?(s._index=o,n=t[++a*r]):delete s.label}(e,o,s/n),aa(e);if(v=function Es(e,t,r,a){var s,d,l,f,n=function Ys(e){var r,a,t=e.length;if(t<2)return!1;for(a=e[0],r=1;r<t;++r)if(e[r]-e[r-1]!==a)return!1;return a}(e),o=(t.length-1)/a;if(!n)return Math.max(o,1);for(l=0,f=(s=m.math._factorize(n)).length-1;l<f;l++)if((d=s[l])>o)return d;return Math.max(o,1)}(o,e,0,n),s>0){for(f=0,c=s-1;f<c;f++)or(e,v,o[f],o[f+1]);return or(e,v,m.isNullOrUndef(p=s>1?(l-d)/(s-1):null)?0:d-p,d),or(e,v,l,m.isNullOrUndef(p)?e.length:l+p),aa(e)}return or(e,v),aa(e)},_tickSize:function(){var e=this,t=e.options.ticks,r=m.toRadians(e.labelRotation),a=Math.abs(Math.cos(r)),n=Math.abs(Math.sin(r)),o=e._getLabelSizes(),s=t.autoSkipPadding||0,d=o?o.widest.width+s:0,l=o?o.highest.height+s:0;return e.isHorizontal()?l*a>d*n?d/a:l/n:l*n<d*a?l/a:d/n},_isVisible:function(){var a,n,o,e=this,t=e.chart,r=e.options.display;if("auto"!==r)return!!r;for(a=0,n=t.data.datasets.length;a<n;++a)if(t.isDatasetVisible(a)&&((o=t.getDatasetMeta(a)).xAxisID===e.id||o.yAxisID===e.id))return!0;return!1},_computeGridLineItems:function(e){var x,M,T,C,I,A,z,N,Y,E,O,J,X,U,We,Ne,fe,t=this,r=t.chart,a=t.options,n=a.gridLines,o=a.position,s=n.offsetGridLines,d=t.isHorizontal(),l=t._ticksToDraw,f=l.length+(s?1:0),c=Yt(n),v=[],p=n.drawBorder?mt(n.lineWidth,0,0):0,y=p/2,_=m._alignPixel,w=function(ca){return _(r,ca,p)};for("top"===o?(x=w(t.bottom),z=t.bottom-c,Y=x-y,O=w(e.top)+y,X=e.bottom):"bottom"===o?(x=w(t.top),O=e.top,X=w(e.bottom)-y,z=x+y,Y=t.top+c):"left"===o?(x=w(t.right),A=t.right-c,N=x-y,E=w(e.left)+y,J=e.right):(x=w(t.left),E=e.left,J=w(e.right)-y,A=x+y,N=t.left+c),M=0;M<f;++M)!(Nt((T=l[M]||{}).label)&&M<l.length)&&(M===t.zeroLineIndex&&a.offset===s?(U=n.zeroLineWidth,We=n.zeroLineColor,Ne=n.zeroLineBorderDash||[],fe=n.zeroLineBorderDashOffset||0):(U=mt(n.lineWidth,M,1),We=mt(n.color,M,"rgba(0,0,0,0.1)"),Ne=n.borderDash||[],fe=n.borderDashOffset||0),void 0!==(C=Rs(t,T._index||M,s))&&(I=_(r,C,U),d?A=N=E=J=I:z=Y=O=X=I,v.push({tx1:A,ty1:z,tx2:N,ty2:Y,x1:E,y1:O,x2:J,y2:X,width:U,color:We,borderDash:Ne,borderDashOffset:fe})));return v.ticksLength=f,v.borderValue=x,v},_computeLabelItems:function(){var p,y,_,w,x,M,T,C,I,A,z,N,e=this,t=e.options,r=t.ticks,a=t.position,n=r.mirror,o=e.isHorizontal(),s=e._ticksToDraw,d=ra(r),l=r.padding,f=Yt(t.gridLines),c=-m.toRadians(e.labelRotation),v=[];for("top"===a?(M=e.bottom-f-l,T=c?"left":"center"):"bottom"===a?(M=e.top+f+l,T=c?"right":"center"):"left"===a?(x=e.right-(n?0:f)-l,T=n?"left":"right"):(x=e.left+(n?0:f)+l,T=n?"right":"left"),p=0,y=s.length;p<y;++p)!Nt(w=(_=s[p]).label)&&(C=e.getPixelForTick(_._index||p)+r.labelOffset,A=(I=_.major?d.major:d.minor).lineHeight,z=rt(w)?w.length:1,o?(x=C,N="top"===a?((c?1:.5)-z)*A:(c?0:.5)*A):(M=C,N=(1-z)*A/2),v.push({x,y:M,rotation:c,label:w,font:I,textOffset:N,textAlign:T}));return v},_drawGrid:function(e){var t=this,r=t.options.gridLines;if(r.display){var l,f,c,v,p,a=t.ctx,n=t.chart,o=m._alignPixel,s=r.drawBorder?mt(r.lineWidth,0,0):0,d=t._gridLineItems||(t._gridLineItems=t._computeGridLineItems(e));for(c=0,v=d.length;c<v;++c)f=(p=d[c]).color,(l=p.width)&&f&&(a.save(),a.lineWidth=l,a.strokeStyle=f,a.setLineDash&&(a.setLineDash(p.borderDash),a.lineDashOffset=p.borderDashOffset),a.beginPath(),r.drawTicks&&(a.moveTo(p.tx1,p.ty1),a.lineTo(p.tx2,p.ty2)),r.drawOnChartArea&&(a.moveTo(p.x1,p.y1),a.lineTo(p.x2,p.y2)),a.stroke(),a.restore());if(s){var x,M,T,C,y=s,_=mt(r.lineWidth,d.ticksLength-1,1),w=d.borderValue;t.isHorizontal()?(x=o(n,t.left,y)-y/2,M=o(n,t.right,_)+_/2,T=C=w):(T=o(n,t.top,y)-y/2,C=o(n,t.bottom,_)+_/2,x=M=w),a.lineWidth=s,a.strokeStyle=mt(r.color,0),a.beginPath(),a.moveTo(x,T),a.lineTo(M,C),a.stroke()}}},_drawLabels:function(){var e=this;if(e.options.ticks.display){var n,o,s,d,l,f,c,v,r=e.ctx,a=e._labelItems||(e._labelItems=e._computeLabelItems());for(n=0,s=a.length;n<s;++n){if(f=(l=a[n]).font,r.save(),r.translate(l.x,l.y),r.rotate(l.rotation),r.font=f.string,r.fillStyle=f.color,r.textBaseline="middle",r.textAlign=l.textAlign,v=l.textOffset,rt(c=l.label))for(o=0,d=c.length;o<d;++o)r.fillText(""+c[o],0,v),v+=f.lineHeight;else r.fillText(c,0,v);r.restore()}}},_drawTitle:function(){var e=this,t=e.ctx,r=e.options,a=r.scaleLabel;if(a.display){var c,v,n=at(a.fontColor,F.global.defaultFontColor),o=m.options._parseFont(a),s=m.options.toPadding(a.padding),d=o.lineHeight/2,l=r.position,f=0;if(e.isHorizontal())c=e.left+e.width/2,v="bottom"===l?e.bottom-d-s.bottom:e.top+d+s.top;else{var p="left"===l;c=p?e.left+d+s.top:e.right-d-s.top,v=e.top+e.height/2,f=p?-.5*Math.PI:.5*Math.PI}t.save(),t.translate(c,v),t.rotate(f),t.textAlign="center",t.textBaseline="middle",t.fillStyle=n,t.font=o.string,t.fillText(a.labelString,0,0),t.restore()}},draw:function(e){var t=this;!t._isVisible()||(t._drawGrid(e),t._drawTitle(),t._drawLabels())},_layers:function(){var e=this,t=e.options,r=t.ticks&&t.ticks.z||0,a=t.gridLines&&t.gridLines.z||0;return e._isVisible()&&r!==a&&e.draw===e._draw?[{z:a,draw:function(){e._drawGrid.apply(e,arguments),e._drawTitle.apply(e,arguments)}},{z:r,draw:function(){e._drawLabels.apply(e,arguments)}}]:[{z:r,draw:function(){e.draw.apply(e,arguments)}}]},_getMatchingVisibleMetas:function(e){var t=this,r=t.isHorizontal();return t.chart._getSortedVisibleDatasetMetas().filter(function(a){return(!e||a.type===e)&&(r?a.xAxisID===t.id:a.yAxisID===t.id)})}});na.prototype._draw=na.prototype.draw;var le=na,ia=m.isNullOrUndef,Cn=le.extend({determineDataLimits:function(){var d,e=this,t=e._getLabels(),r=e.options.ticks,a=r.min,n=r.max,o=0,s=t.length-1;void 0!==a&&(d=t.indexOf(a))>=0&&(o=d),void 0!==n&&(d=t.indexOf(n))>=0&&(s=d),e.minIndex=o,e.maxIndex=s,e.min=t[o],e.max=t[s]},buildTicks:function(){var e=this,t=e._getLabels(),r=e.minIndex,a=e.maxIndex;e.ticks=0===r&&a===t.length-1?t:t.slice(r,a+1)},getLabelForIndex:function(e,t){var r=this,a=r.chart;return a.getDatasetMeta(t).controller._getValueScaleId()===r.id?r.getRightValue(a.data.datasets[t].data[e]):r._getLabels()[e]},_configure:function(){var e=this,t=e.options.offset,r=e.ticks;le.prototype._configure.call(e),e.isHorizontal()||(e._reversePixels=!e._reversePixels),r&&(e._startValue=e.minIndex-(t?.5:0),e._valueRange=Math.max(r.length-(t?0:1),1))},getPixelForValue:function(e,t,r){var n,o,s,a=this;return!ia(t)&&!ia(r)&&(e=a.chart.data.datasets[r].data[t]),ia(e)||(n=a.isHorizontal()?e.x:e.y),(void 0!==n||void 0!==e&&isNaN(t))&&(o=a._getLabels(),e=m.valueOrDefault(n,e),t=-1!==(s=o.indexOf(e))?s:t,isNaN(t)&&(t=e)),a.getPixelForDecimal((t-a._startValue)/a._valueRange)},getPixelForTick:function(e){var t=this.ticks;return e<0||e>t.length-1?null:this.getPixelForValue(t[e],e+this.minIndex)},getValueForPixel:function(e){var t=this,r=Math.round(t._startValue+t.getDecimalForPixel(e)*t._valueRange);return Math.min(Math.max(r,0),t.ticks.length-1)},getBasePixel:function(){return this.bottom}});Cn._defaults={position:"bottom"};var nt=m.isNullOrUndef,sr=le.extend({getRightValue:function(e){return"string"==typeof e?+e:le.prototype.getRightValue.call(this,e)},handleTickRangeOptions:function(){var e=this,r=e.options.ticks;if(r.beginAtZero){var a=m.sign(e.min),n=m.sign(e.max);a<0&&n<0?e.max=0:a>0&&n>0&&(e.min=0)}var o=void 0!==r.min||void 0!==r.suggestedMin,s=void 0!==r.max||void 0!==r.suggestedMax;void 0!==r.min?e.min=r.min:void 0!==r.suggestedMin&&(e.min=null===e.min?r.suggestedMin:Math.min(e.min,r.suggestedMin)),void 0!==r.max?e.max=r.max:void 0!==r.suggestedMax&&(e.max=null===e.max?r.suggestedMax:Math.max(e.max,r.suggestedMax)),o!==s&&e.min>=e.max&&(o?e.max=e.min+1:e.min=e.max-1),e.min===e.max&&(e.max++,r.beginAtZero||e.min--)},getTickLimit:function(){var n,e=this,t=e.options.ticks,r=t.stepSize,a=t.maxTicksLimit;return r?n=Math.ceil(e.max/r)-Math.floor(e.min/r)+1:(n=e._computeTickLimit(),a=a||11),a&&(n=Math.min(a,n)),n},_computeTickLimit:function(){return Number.POSITIVE_INFINITY},handleDirectionalChanges:m.noop,buildTicks:function(){var e=this,r=e.options.ticks,a=e.getTickLimit(),n={maxTicks:a=Math.max(2,a),min:r.min,max:r.max,precision:r.precision,stepSize:m.valueOrDefault(r.fixedStepSize,r.stepSize)},o=e.ticks=function js(e,t){var y,_,w,x,r=[],n=e.stepSize,o=n||1,s=e.maxTicks-1,d=e.min,l=e.max,f=e.precision,c=t.min,v=t.max,p=m.niceNum((v-c)/s/o)*o;if(p<1e-14&&nt(d)&&nt(l))return[c,v];(x=Math.ceil(v/p)-Math.floor(c/p))>s&&(p=m.niceNum(x*p/s/o)*o),n||nt(f)?y=Math.pow(10,m._decimalPlaces(p)):(y=Math.pow(10,f),p=Math.ceil(p*y)/y),_=Math.floor(c/p)*p,w=Math.ceil(v/p)*p,n&&(!nt(d)&&m.almostWhole(d/p,p/1e3)&&(_=d),!nt(l)&&m.almostWhole(l/p,p/1e3)&&(w=l)),x=m.almostEquals(x=(w-_)/p,Math.round(x),p/1e3)?Math.round(x):Math.ceil(x),_=Math.round(_*y)/y,w=Math.round(w*y)/y,r.push(nt(d)?_:d);for(var M=1;M<x;++M)r.push(Math.round((_+M*p)*y)/y);return r.push(nt(l)?w:l),r}(n,e);e.handleDirectionalChanges(),e.max=m.max(o),e.min=m.min(o),r.reverse?(o.reverse(),e.start=e.max,e.end=e.min):(e.start=e.min,e.end=e.max)},convertTicksToLabels:function(){var e=this;e.ticksAsNumbers=e.ticks.slice(),e.zeroLineIndex=e.ticks.indexOf(0),le.prototype.convertTicksToLabels.call(e)},_configure:function(){var n,e=this,t=e.getTicks(),r=e.min,a=e.max;le.prototype._configure.call(e),e.options.offset&&t.length&&(r-=n=(a-r)/Math.max(t.length-1,1)/2,a+=n),e._startValue=r,e._endValue=a,e._valueRange=a-r}}),Gs={position:"left",ticks:{callback:Wt.formatters.linear}};function Xs(e,t,r,a){var c,v,n=e.options,s=function Zs(e,t,r){var a=[r.type,void 0===t&&void 0===r.stack?r.index:"",r.stack].join(".");return void 0===e[a]&&(e[a]={pos:[],neg:[]}),e[a]}(t,n.stacked,r),d=s.pos,l=s.neg,f=a.length;for(c=0;c<f;++c)v=e._parseValue(a[c]),!(isNaN(v.min)||isNaN(v.max)||r.data[c].hidden)&&(d[c]=d[c]||0,l[c]=l[c]||0,n.relativePoints?d[c]=100:v.min<0||v.max<0?l[c]+=v.min:d[c]+=v.max)}function Ks(e,t,r){var n,o,a=r.length;for(n=0;n<a;++n)o=e._parseValue(r[n]),!(isNaN(o.min)||isNaN(o.max)||t.data[n].hidden)&&(e.min=Math.min(e.min,o.min),e.max=Math.max(e.max,o.max))}var Pn=sr.extend({determineDataLimits:function(){var l,f,c,v,e=this,t=e.options,a=e.chart.data.datasets,n=e._getMatchingVisibleMetas(),o=t.stacked,s={},d=n.length;if(e.min=Number.POSITIVE_INFINITY,e.max=Number.NEGATIVE_INFINITY,void 0===o)for(l=0;!o&&l<d;++l)o=void 0!==(f=n[l]).stack;for(l=0;l<d;++l)c=a[(f=n[l]).index].data,o?Xs(e,s,f,c):Ks(e,f,c);m.each(s,function(p){v=p.pos.concat(p.neg),e.min=Math.min(e.min,m.min(v)),e.max=Math.max(e.max,m.max(v))}),e.min=m.isFinite(e.min)&&!isNaN(e.min)?e.min:0,e.max=m.isFinite(e.max)&&!isNaN(e.max)?e.max:1,e.handleTickRangeOptions()},_computeTickLimit:function(){var t,e=this;return e.isHorizontal()?Math.ceil(e.width/40):(t=m.options._parseFont(e.options.ticks),Math.ceil(e.height/t.lineHeight))},handleDirectionalChanges:function(){this.isHorizontal()||this.ticks.reverse()},getLabelForIndex:function(e,t){return this._getScaleLabel(this.chart.data.datasets[t].data[e])},getPixelForValue:function(e){var t=this;return t.getPixelForDecimal((+t.getRightValue(e)-t._startValue)/t._valueRange)},getValueForPixel:function(e){return this._startValue+this.getDecimalForPixel(e)*this._valueRange},getPixelForTick:function(e){var t=this.ticksAsNumbers;return e<0||e>t.length-1?null:this.getPixelForValue(t[e])}});Pn._defaults=Gs;var oa=m.valueOrDefault,ue=m.math.log10,el={position:"left",ticks:{callback:Wt.formatters.logarithmic}};function lr(e,t){return m.isFinite(e)&&e>=0?e:t}var On=le.extend({determineDataLimits:function(){var s,d,l,f,c,v,e=this,t=e.options,r=e.chart,a=r.data.datasets,n=e.isHorizontal();function o(x){return n?x.xAxisID===e.id:x.yAxisID===e.id}e.min=Number.POSITIVE_INFINITY,e.max=Number.NEGATIVE_INFINITY,e.minNotZero=Number.POSITIVE_INFINITY;var p=t.stacked;if(void 0===p)for(s=0;s<a.length;s++)if(d=r.getDatasetMeta(s),r.isDatasetVisible(s)&&o(d)&&void 0!==d.stack){p=!0;break}if(t.stacked||p){var y={};for(s=0;s<a.length;s++){var _=[(d=r.getDatasetMeta(s)).type,void 0===t.stacked&&void 0===d.stack?s:"",d.stack].join(".");if(r.isDatasetVisible(s)&&o(d))for(void 0===y[_]&&(y[_]=[]),c=0,v=(f=a[s].data).length;c<v;c++){var w=y[_];l=e._parseValue(f[c]),!(isNaN(l.min)||isNaN(l.max)||d.data[c].hidden||l.min<0||l.max<0)&&(w[c]=w[c]||0,w[c]+=l.max)}}m.each(y,function(x){if(x.length>0){var M=m.min(x),T=m.max(x);e.min=Math.min(e.min,M),e.max=Math.max(e.max,T)}})}else for(s=0;s<a.length;s++)if(d=r.getDatasetMeta(s),r.isDatasetVisible(s)&&o(d))for(c=0,v=(f=a[s].data).length;c<v;c++)l=e._parseValue(f[c]),!(isNaN(l.min)||isNaN(l.max)||d.data[c].hidden||l.min<0||l.max<0)&&(e.min=Math.min(l.min,e.min),e.max=Math.max(l.max,e.max),0!==l.min&&(e.minNotZero=Math.min(l.min,e.minNotZero)));e.min=m.isFinite(e.min)?e.min:null,e.max=m.isFinite(e.max)?e.max:null,e.minNotZero=m.isFinite(e.minNotZero)?e.minNotZero:null,this.handleTickRangeOptions()},handleTickRangeOptions:function(){var e=this,t=e.options.ticks;e.min=lr(t.min,e.min),e.max=lr(t.max,e.max),e.min===e.max&&(0!==e.min&&null!==e.min?(e.min=Math.pow(10,Math.floor(ue(e.min))-1),e.max=Math.pow(10,Math.floor(ue(e.max))+1)):(e.min=1,e.max=10)),null===e.min&&(e.min=Math.pow(10,Math.floor(ue(e.max))-1)),null===e.max&&(e.max=0!==e.min?Math.pow(10,Math.floor(ue(e.min))+1):10),null===e.minNotZero&&(e.minNotZero=e.min>0?e.min:e.max<1?Math.pow(10,Math.floor(ue(e.max))):1)},buildTicks:function(){var e=this,t=e.options.ticks,r=!e.isHorizontal(),a={min:lr(t.min),max:lr(t.max)},n=e.ticks=function Qs(e,t){var s,d,r=[],a=oa(e.min,Math.pow(10,Math.floor(ue(t.min)))),n=Math.floor(ue(t.max)),o=Math.ceil(t.max/Math.pow(10,n));0===a?(s=Math.floor(ue(t.minNotZero)),d=Math.floor(t.minNotZero/Math.pow(10,s)),r.push(a),a=d*Math.pow(10,s)):(s=Math.floor(ue(a)),d=Math.floor(a/Math.pow(10,s)));var l=s<0?Math.pow(10,Math.abs(s)):1;do{r.push(a),10==++d&&(d=1,l=++s>=0?1:l),a=Math.round(d*Math.pow(10,s)*l)/l}while(s<n||s===n&&d<o);var f=oa(e.max,a);return r.push(f),r}(a,e);e.max=m.max(n),e.min=m.min(n),t.reverse?(r=!r,e.start=e.max,e.end=e.min):(e.start=e.min,e.end=e.max),r&&n.reverse()},convertTicksToLabels:function(){this.tickValues=this.ticks.slice(),le.prototype.convertTicksToLabels.call(this)},getLabelForIndex:function(e,t){return this._getScaleLabel(this.chart.data.datasets[t].data[e])},getPixelForTick:function(e){var t=this.tickValues;return e<0||e>t.length-1?null:this.getPixelForValue(t[e])},_getFirstTickValue:function(e){var t=Math.floor(ue(e));return Math.floor(e/Math.pow(10,t))*Math.pow(10,t)},_configure:function(){var e=this,t=e.min,r=0;le.prototype._configure.call(e),0===t&&(t=e._getFirstTickValue(e.minNotZero),r=oa(e.options.ticks.fontSize,F.global.defaultFontSize)/e._length),e._startValue=ue(t),e._valueOffset=r,e._valueRange=(ue(e.max)-ue(t))/(1-r)},getPixelForValue:function(e){var t=this,r=0;return(e=+t.getRightValue(e))>t.min&&e>0&&(r=(ue(e)-t._startValue)/t._valueRange+t._valueOffset),t.getPixelForDecimal(r)},getValueForPixel:function(e){var t=this,r=t.getDecimalForPixel(e);return 0===r&&0===t.min?0:Math.pow(10,t._startValue+(r-t._valueOffset)*t._valueRange)}});On._defaults=el;var ur=m.valueOrDefault,sa=m.valueAtIndexOrDefault,Fn=m.options.resolve,rl={display:!0,animate:!0,position:"chartArea",angleLines:{display:!0,color:"rgba(0,0,0,0.1)",lineWidth:1,borderDash:[],borderDashOffset:0},gridLines:{circular:!1},ticks:{showLabelBackdrop:!0,backdropColor:"rgba(255,255,255,0.75)",backdropPaddingY:2,backdropPaddingX:2,callback:Wt.formatters.linear},pointLabels:{display:!0,fontSize:10,callback:function(e){return e}}};function la(e){var t=e.ticks;return t.display&&e.display?ur(t.fontSize,F.global.defaultFontSize)+2*t.backdropPaddingY:0}function al(e,t,r){return m.isArray(r)?{w:m.longestText(e,e.font,r),h:r.length*t}:{w:e.measureText(r).width,h:t}}function An(e,t,r,a,n){return e===a||e===n?{start:t-r/2,end:t+r/2}:e<a||e>n?{start:t-r,end:t}:{start:t,end:t+r}}function il(e){return 0===e||180===e?"center":e<180?"left":"right"}function ol(e,t,r,a){var o,s,n=r.y+a/2;if(m.isArray(t))for(o=0,s=t.length;o<s;++o)e.fillText(t[o],r.x,n),n+=a;else e.fillText(t,r.x,n)}function sl(e,t,r){90===e||270===e?r.y-=t.h/2:(e>270||e<90)&&(r.y-=t.h)}function dr(e){return m.isNumber(e)?e:0}var In=sr.extend({setDimensions:function(){var e=this;e.width=e.maxWidth,e.height=e.maxHeight,e.paddingTop=la(e.options)/2,e.xCenter=Math.floor(e.width/2),e.yCenter=Math.floor((e.height-e.paddingTop)/2),e.drawingArea=Math.min(e.height-e.paddingTop,e.width)/2},determineDataLimits:function(){var e=this,t=e.chart,r=Number.POSITIVE_INFINITY,a=Number.NEGATIVE_INFINITY;m.each(t.data.datasets,function(n,o){if(t.isDatasetVisible(o)){var s=t.getDatasetMeta(o);m.each(n.data,function(d,l){var f=+e.getRightValue(d);isNaN(f)||s.data[l].hidden||(r=Math.min(f,r),a=Math.max(f,a))})}}),e.min=r===Number.POSITIVE_INFINITY?0:r,e.max=a===Number.NEGATIVE_INFINITY?0:a,e.handleTickRangeOptions()},_computeTickLimit:function(){return Math.ceil(this.drawingArea/la(this.options))},convertTicksToLabels:function(){var e=this;sr.prototype.convertTicksToLabels.call(e),e.pointLabels=e.chart.data.labels.map(function(){var t=m.callback(e.options.pointLabels.callback,arguments,e);return t||0===t?t:""})},getLabelForIndex:function(e,t){return+this.getRightValue(this.chart.data.datasets[t].data[e])},fit:function(){var e=this,t=e.options;t.display&&t.pointLabels.display?function nl(e){var n,o,s,t=m.options._parseFont(e.options.pointLabels),r={l:0,r:e.width,t:0,b:e.height-e.paddingTop},a={};e.ctx.font=t.string,e._pointLabelSizes=[];var d=e.chart.data.labels.length;for(n=0;n<d;n++){s=e.getPointPosition(n,e.drawingArea+5),o=al(e.ctx,t.lineHeight,e.pointLabels[n]),e._pointLabelSizes[n]=o;var l=e.getIndexAngle(n),f=m.toDegrees(l)%360,c=An(f,s.x,o.w,0,180),v=An(f,s.y,o.h,90,270);c.start<r.l&&(r.l=c.start,a.l=l),c.end>r.r&&(r.r=c.end,a.r=l),v.start<r.t&&(r.t=v.start,a.t=l),v.end>r.b&&(r.b=v.end,a.b=l)}e.setReductions(e.drawingArea,r,a)}(e):e.setCenterPoint(0,0,0,0)},setReductions:function(e,t,r){var a=this,n=t.l/Math.sin(r.l),o=Math.max(t.r-a.width,0)/Math.sin(r.r),s=-t.t/Math.cos(r.t),d=-Math.max(t.b-(a.height-a.paddingTop),0)/Math.cos(r.b);n=dr(n),o=dr(o),s=dr(s),d=dr(d),a.drawingArea=Math.min(Math.floor(e-(n+o)/2),Math.floor(e-(s+d)/2)),a.setCenterPoint(n,o,s,d)},setCenterPoint:function(e,t,r,a){var n=this,d=r+n.drawingArea,l=n.height-n.paddingTop-a-n.drawingArea;n.xCenter=Math.floor((e+n.drawingArea+(n.width-t-n.drawingArea))/2+n.left),n.yCenter=Math.floor((d+l)/2+n.top+n.paddingTop)},getIndexAngle:function(e){var t=this.chart,o=(e*(360/t.data.labels.length)+((t.options||{}).startAngle||0))%360;return(o<0?o+360:o)*Math.PI*2/360},getDistanceFromCenterForValue:function(e){var t=this;if(m.isNullOrUndef(e))return NaN;var r=t.drawingArea/(t.max-t.min);return t.options.ticks.reverse?(t.max-e)*r:(e-t.min)*r},getPointPosition:function(e,t){var r=this,a=r.getIndexAngle(e)-Math.PI/2;return{x:Math.cos(a)*t+r.xCenter,y:Math.sin(a)*t+r.yCenter}},getPointPositionForValue:function(e,t){return this.getPointPosition(e,this.getDistanceFromCenterForValue(t))},getBasePosition:function(e){var t=this,r=t.min,a=t.max;return t.getPointPositionForValue(e||0,t.beginAtZero?0:r<0&&a<0?a:r>0&&a>0?r:0)},_drawGrid:function(){var d,l,f,e=this,t=e.ctx,r=e.options,a=r.gridLines,n=r.angleLines,o=ur(n.lineWidth,a.lineWidth),s=ur(n.color,a.color);if(r.pointLabels.display&&function ll(e){var t=e.ctx,r=e.options,a=r.pointLabels,n=la(r),o=e.getDistanceFromCenterForValue(r.ticks.reverse?e.min:e.max),s=m.options._parseFont(a);t.save(),t.font=s.string,t.textBaseline="middle";for(var d=e.chart.data.labels.length-1;d>=0;d--){var f=e.getPointPosition(d,o+(0===d?n/2:0)+5),c=sa(a.fontColor,d,F.global.defaultFontColor);t.fillStyle=c;var v=e.getIndexAngle(d),p=m.toDegrees(v);t.textAlign=il(p),sl(p,e._pointLabelSizes[d],f),ol(t,e.pointLabels[d],f,s.lineHeight)}t.restore()}(e),a.display&&m.each(e.ticks,function(c,v){0!==v&&(l=e.getDistanceFromCenterForValue(e.ticksAsNumbers[v]),function ul(e,t,r,a){var f,n=e.ctx,o=t.circular,s=e.chart.data.labels.length,d=sa(t.color,a-1),l=sa(t.lineWidth,a-1);if((o||s)&&d&&l){if(n.save(),n.strokeStyle=d,n.lineWidth=l,n.setLineDash&&(n.setLineDash(t.borderDash||[]),n.lineDashOffset=t.borderDashOffset||0),n.beginPath(),o)n.arc(e.xCenter,e.yCenter,r,0,2*Math.PI);else{f=e.getPointPosition(0,r),n.moveTo(f.x,f.y);for(var c=1;c<s;c++)f=e.getPointPosition(c,r),n.lineTo(f.x,f.y)}n.closePath(),n.stroke(),n.restore()}}(e,a,l,v))}),n.display&&o&&s){for(t.save(),t.lineWidth=o,t.strokeStyle=s,t.setLineDash&&(t.setLineDash(Fn([n.borderDash,a.borderDash,[]])),t.lineDashOffset=Fn([n.borderDashOffset,a.borderDashOffset,0])),d=e.chart.data.labels.length-1;d>=0;d--)l=e.getDistanceFromCenterForValue(r.ticks.reverse?e.min:e.max),f=e.getPointPosition(d,l),t.beginPath(),t.moveTo(e.xCenter,e.yCenter),t.lineTo(f.x,f.y),t.stroke();t.restore()}},_drawLabels:function(){var e=this,t=e.ctx,a=e.options.ticks;if(a.display){var d,l,n=e.getIndexAngle(0),o=m.options._parseFont(a),s=ur(a.fontColor,F.global.defaultFontColor);t.save(),t.font=o.string,t.translate(e.xCenter,e.yCenter),t.rotate(n),t.textAlign="center",t.textBaseline="middle",m.each(e.ticks,function(f,c){0===c&&!a.reverse||(d=e.getDistanceFromCenterForValue(e.ticksAsNumbers[c]),a.showLabelBackdrop&&(l=t.measureText(f).width,t.fillStyle=a.backdropColor,t.fillRect(-l/2-a.backdropPaddingX,-d-o.size/2-a.backdropPaddingY,l+2*a.backdropPaddingX,o.size+2*a.backdropPaddingY)),t.fillStyle=s,t.fillText(f,0,-d))}),t.restore()}},_drawTitle:m.noop});In._defaults=rl;var ua=m._deprecated,Ln=m.options.resolve,fl=m.valueOrDefault,Rn=Number.MIN_SAFE_INTEGER||-9007199254740991,da=Number.MAX_SAFE_INTEGER||9007199254740991,fr={millisecond:{common:!0,size:1,steps:1e3},second:{common:!0,size:1e3,steps:60},minute:{common:!0,size:6e4,steps:60},hour:{common:!0,size:36e5,steps:24},day:{common:!0,size:864e5,steps:30},week:{common:!1,size:6048e5,steps:4},month:{common:!0,size:2628e6,steps:12},quarter:{common:!1,size:7884e6,steps:4},year:{common:!0,size:3154e7}},de=Object.keys(fr);function Wn(e,t){return e-t}function Nn(e){return m.valueOrDefault(e.time.min,e.ticks.min)}function Yn(e){return m.valueOrDefault(e.time.max,e.ticks.max)}function pt(e,t,r,a){var n=function vl(e,t,r){for(var o,s,d,a=0,n=e.length-1;a>=0&&a<=n;){if(d=e[o=a+n>>1],!(s=e[o-1]||null))return{lo:null,hi:d};if(d[t]<r)a=o+1;else{if(!(s[t]>r))return{lo:s,hi:d};n=o-1}}return{lo:d,hi:null}}(e,t,r),o=n.lo?n.hi?n.lo:e[e.length-2]:e[0],s=n.lo?n.hi?n.hi:e[e.length-1]:e[1],d=s[t]-o[t];return o[a]+(s[a]-o[a])*(d?(r-o[t])/d:0)}function fa(e,t){var r=e._adapter,a=e.options.time,n=a.parser,o=n||a.format,s=t;return"function"==typeof n&&(s=n(s)),m.isFinite(s)||(s="string"==typeof o?r.parse(s,o):r.parse(s)),null!==s?+s:(!n&&"function"==typeof o&&(s=o(t),m.isFinite(s)||(s=r.parse(s))),s)}function it(e,t){if(m.isNullOrUndef(t))return null;var r=e.options.time,a=fa(e,e.getRightValue(t));return null===a||r.round&&(a=+e._adapter.startOf(a,r.round)),a}function En(e,t,r,a){var o,s,n=de.length;for(o=de.indexOf(e);o<n-1;++o)if((s=fr[de[o]]).common&&Math.ceil((r-t)/((s.steps?s.steps:da)*s.size))<=a)return de[o];return de[n-1]}function zn(e,t,r){var s,d,a=[],n={},o=t.length;for(s=0;s<o;++s)n[d=t[s]]=s,a.push({value:d,major:!1});return 0!==o&&r?function yl(e,t,r,a){var d,l,n=e._adapter,o=+n.startOf(t[0].value,a),s=t[t.length-1].value;for(d=o;d<=s;d=+n.add(d,1,a))(l=r[d])>=0&&(t[l].major=!0);return t}(e,a,n,r):a}var Bn=le.extend({initialize:function(){this.mergeTicksOptions(),le.prototype.initialize.call(this)},update:function(){var e=this,t=e.options,r=t.time||(t.time={}),a=e._adapter=new ea._date(t.adapters.date);return ua("time scale",r.format,"time.format","time.parser"),ua("time scale",r.min,"time.min","ticks.min"),ua("time scale",r.max,"time.max","ticks.max"),m.mergeIf(r.displayFormats,a.formats()),le.prototype.update.apply(e,arguments)},getRightValue:function(e){return e&&void 0!==e.t&&(e=e.t),le.prototype.getRightValue.call(this,e)},determineDataLimits:function(){var c,v,p,y,_,w,x,e=this,t=e.chart,r=e._adapter,a=e.options,n=a.time.unit||"day",o=da,s=Rn,d=[],l=[],f=[],M=e._getLabels();for(c=0,p=M.length;c<p;++c)f.push(it(e,M[c]));for(c=0,p=(t.data.datasets||[]).length;c<p;++c)if(t.isDatasetVisible(c))if(m.isObject((_=t.data.datasets[c].data)[0]))for(l[c]=[],v=0,y=_.length;v<y;++v)w=it(e,_[v]),d.push(w),l[c][v]=w;else l[c]=f.slice(0),x||(d=d.concat(f),x=!0);else l[c]=[];f.length&&(o=Math.min(o,f[0]),s=Math.max(s,f[f.length-1])),d.length&&(d=p>1?function hl(e){var a,n,o,t={},r=[];for(a=0,n=e.length;a<n;++a)t[o=e[a]]||(t[o]=!0,r.push(o));return r}(d).sort(Wn):d.sort(Wn),o=Math.min(o,d[0]),s=Math.max(s,d[d.length-1])),o=it(e,Nn(a))||o,s=it(e,Yn(a))||s,o=o===da?+r.startOf(Date.now(),n):o,s=s===Rn?+r.endOf(Date.now(),n)+1:s,e.min=Math.min(o,s),e.max=Math.max(o+1,s),e._table=[],e._timestamps={data:d,datasets:l,labels:f}},buildTicks:function(){var v,p,y,e=this,t=e.min,r=e.max,a=e.options,n=a.ticks,o=a.time,s=e._timestamps,d=[],l=e.getLabelCapacity(t),f=n.source,c=a.distribution;for(s="data"===f||"auto"===f&&"series"===c?s.data:"labels"===f?s.labels:function pl(e,t,r,a){var p,n=e._adapter,o=e.options,s=o.time,d=s.unit||En(s.minUnit,t,r,a),l=Ln([s.stepSize,s.unitStepSize,1]),f="week"===d&&s.isoWeekday,c=t,v=[];if(f&&(c=+n.startOf(c,"isoWeek",f)),c=+n.startOf(c,f?"day":d),n.diff(r,t,d)>1e5*l)throw t+" and "+r+" are too far apart with stepSize of "+l+" "+d;for(p=c;p<r;p=+n.add(p,l,d))v.push(p);return(p===r||"ticks"===o.bounds)&&v.push(p),v}(e,t,r,l),"ticks"===a.bounds&&s.length&&(t=s[0],r=s[s.length-1]),t=it(e,Nn(a))||t,r=it(e,Yn(a))||r,v=0,p=s.length;v<p;++v)(y=s[v])>=t&&y<=r&&d.push(y);return e.min=t,e.max=r,e._unit=o.unit||(n.autoSkip?En(o.minUnit,e.min,e.max,l):function gl(e,t,r,a,n){var o,s;for(o=de.length-1;o>=de.indexOf(r);o--)if(fr[s=de[o]].common&&e._adapter.diff(n,a,s)>=t-1)return s;return de[r?de.indexOf(r):0]}(e,d.length,o.minUnit,e.min,e.max)),e._majorUnit=n.major.enabled&&"year"!==e._unit?function ml(e){for(var t=de.indexOf(e)+1,r=de.length;t<r;++t)if(fr[de[t]].common)return de[t]}(e._unit):void 0,e._table=function cl(e,t,r,a){if("linear"===a||!e.length)return[{time:t,pos:0},{time:r,pos:1}];var s,d,l,f,c,n=[],o=[t];for(s=0,d=e.length;s<d;++s)(f=e[s])>t&&f<r&&o.push(f);for(o.push(r),s=0,d=o.length;s<d;++s)c=o[s+1],f=o[s],(void 0===(l=o[s-1])||void 0===c||Math.round((c+l)/2)!==f)&&n.push({time:f,pos:s/(d-1)});return n}(e._timestamps.data,t,r,c),e._offsets=function bl(e,t,r,a,n){var d,l,o=0,s=0;return n.offset&&t.length&&(d=pt(e,"time",t[0],"pos"),o=1===t.length?1-d:(pt(e,"time",t[1],"pos")-d)/2,l=pt(e,"time",t[t.length-1],"pos"),s=1===t.length?l:(l-pt(e,"time",t[t.length-2],"pos"))/2),{start:o,end:s,factor:1/(o+1+s)}}(e._table,d,0,0,a),n.reverse&&d.reverse(),zn(e,d,e._majorUnit)},getLabelForIndex:function(e,t){var r=this,a=r._adapter,n=r.chart.data,o=r.options.time,s=n.labels&&e<n.labels.length?n.labels[e]:"",d=n.datasets[t].data[e];return m.isObject(d)&&(s=r.getRightValue(d)),o.tooltipFormat?a.format(fa(r,s),o.tooltipFormat):"string"==typeof s?s:a.format(fa(r,s),o.displayFormats.datetime)},tickFormatFunction:function(e,t,r,a){var n=this,s=n.options,d=s.time.displayFormats,f=n._majorUnit,c=d[f],v=r[t],p=s.ticks,y=f&&c&&v&&v.major,_=n._adapter.format(e,a||(y?c:d[n._unit])),w=y?p.major:p.minor,x=Ln([w.callback,w.userCallback,p.callback,p.userCallback]);return x?x(_,t,r):_},convertTicksToLabels:function(e){var r,a,t=[];for(r=0,a=e.length;r<a;++r)t.push(this.tickFormatFunction(e[r].value,r,e));return t},getPixelForOffset:function(e){var t=this,r=t._offsets,a=pt(t._table,"time",e,"pos");return t.getPixelForDecimal((r.start+a)*r.factor)},getPixelForValue:function(e,t,r){var a=this,n=null;if(void 0!==t&&void 0!==r&&(n=a._timestamps.datasets[r][t]),null===n&&(n=it(a,e)),null!==n)return a.getPixelForOffset(n)},getPixelForTick:function(e){var t=this.getTicks();return e>=0&&e<t.length?this.getPixelForOffset(t[e].value):null},getValueForPixel:function(e){var t=this,r=t._offsets,a=t.getDecimalForPixel(e)/r.factor-r.end,n=pt(t._table,"pos",a,"time");return t._adapter._create(n)},_getLabelSize:function(e){var t=this,r=t.options.ticks,a=t.ctx.measureText(e).width,n=m.toRadians(t.isHorizontal()?r.maxRotation:r.minRotation),o=Math.cos(n),s=Math.sin(n),d=fl(r.fontSize,F.global.defaultFontSize);return{w:a*o+d*s,h:a*s+d*o}},getLabelWidth:function(e){return this._getLabelSize(e).w},getLabelCapacity:function(e){var t=this,r=t.options.time,a=r.displayFormats,n=a[r.unit]||a.millisecond,o=t.tickFormatFunction(e,0,zn(t,[e],t._majorUnit),n),s=t._getLabelSize(o),d=Math.floor(t.isHorizontal()?t.width/s.w:t.height/s.h);return t.options.offset&&d--,d>0?d:1}});Bn._defaults={position:"bottom",distribution:"linear",bounds:"data",adapters:{},time:{parser:!1,unit:!1,round:!1,displayFormat:!1,isoWeekday:!1,minUnit:"millisecond",displayFormats:{}},ticks:{autoSkip:!1,source:"auto",major:{enabled:!1}}};var wl={category:Cn,linear:Pn,logarithmic:On,radialLinear:In,time:Bn},xe=za(function(e,t){e.exports=function(){var r,M;function a(){return r.apply(null,arguments)}function o(i){return i instanceof Array||"[object Array]"===Object.prototype.toString.call(i)}function s(i){return null!=i&&"[object Object]"===Object.prototype.toString.call(i)}function l(i){return void 0===i}function f(i){return"number"==typeof i||"[object Number]"===Object.prototype.toString.call(i)}function c(i){return i instanceof Date||"[object Date]"===Object.prototype.toString.call(i)}function v(i,u){var g,h=[];for(g=0;g<i.length;++g)h.push(u(i[g],g));return h}function p(i,u){return Object.prototype.hasOwnProperty.call(i,u)}function y(i,u){for(var h in u)p(u,h)&&(i[h]=u[h]);return p(u,"toString")&&(i.toString=u.toString),p(u,"valueOf")&&(i.valueOf=u.valueOf),i}function _(i,u,h,g){return yi(i,u,h,g,!0).utc()}function x(i){return null==i._pf&&(i._pf={empty:!1,unusedTokens:[],unusedInput:[],overflow:-2,charsLeftOver:0,nullInput:!1,invalidMonth:null,invalidFormat:!1,userInvalidated:!1,iso:!1,parsedDateParts:[],meridiem:null,rfc2822:!1,weekdayMismatch:!1}),i._pf}function T(i){if(null==i._isValid){var u=x(i),h=M.call(u.parsedDateParts,function(b){return null!=b}),g=!isNaN(i._d.getTime())&&u.overflow<0&&!u.empty&&!u.invalidMonth&&!u.invalidWeekday&&!u.weekdayMismatch&&!u.nullInput&&!u.invalidFormat&&!u.userInvalidated&&(!u.meridiem||u.meridiem&&h);if(i._strict&&(g=g&&0===u.charsLeftOver&&0===u.unusedTokens.length&&void 0===u.bigHour),null!=Object.isFrozen&&Object.isFrozen(i))return g;i._isValid=g}return i._isValid}function C(i){var u=_(NaN);return null!=i?y(x(u),i):x(u).userInvalidated=!0,u}M=Array.prototype.some?Array.prototype.some:function(i){for(var u=Object(this),h=u.length>>>0,g=0;g<h;g++)if(g in u&&i.call(this,u[g],g,u))return!0;return!1};var I=a.momentProperties=[];function A(i,u){var h,g,b;if(l(u._isAMomentObject)||(i._isAMomentObject=u._isAMomentObject),l(u._i)||(i._i=u._i),l(u._f)||(i._f=u._f),l(u._l)||(i._l=u._l),l(u._strict)||(i._strict=u._strict),l(u._tzm)||(i._tzm=u._tzm),l(u._isUTC)||(i._isUTC=u._isUTC),l(u._offset)||(i._offset=u._offset),l(u._pf)||(i._pf=x(u)),l(u._locale)||(i._locale=u._locale),I.length>0)for(h=0;h<I.length;h++)l(b=u[g=I[h]])||(i[g]=b);return i}var z=!1;function N(i){A(this,i),this._d=new Date(null!=i._d?i._d.getTime():NaN),this.isValid()||(this._d=new Date(NaN)),!1===z&&(z=!0,a.updateOffset(this),z=!1)}function Y(i){return i instanceof N||null!=i&&null!=i._isAMomentObject}function E(i){return i<0?Math.ceil(i)||0:Math.floor(i)}function O(i){var u=+i,h=0;return 0!==u&&isFinite(u)&&(h=E(u)),h}function J(i,u,h){var S,g=Math.min(i.length,u.length),b=Math.abs(i.length-u.length),k=0;for(S=0;S<g;S++)(h&&i[S]!==u[S]||!h&&O(i[S])!==O(u[S]))&&k++;return k+b}function X(i){!1===a.suppressDeprecationWarnings&&"undefined"!=typeof console&&console.warn&&console.warn("Deprecation warning: "+i)}function U(i,u){var h=!0;return y(function(){if(null!=a.deprecationHandler&&a.deprecationHandler(null,i),h){for(var b,g=[],k=0;k<arguments.length;k++){if(b="","object"==typeof arguments[k]){for(var S in b+="\n["+k+"] ",arguments[0])b+=S+": "+arguments[0][S]+", ";b=b.slice(0,-2)}else b=arguments[k];g.push(b)}X(i+"\nArguments: "+Array.prototype.slice.call(g).join("")+"\n"+(new Error).stack),h=!1}return u.apply(this,arguments)},u)}var ga,We={};function Ne(i,u){null!=a.deprecationHandler&&a.deprecationHandler(i,u),We[i]||(X(u),We[i]=!0)}function fe(i){return i instanceof Function||"[object Function]"===Object.prototype.toString.call(i)}function Zn(i,u){var g,h=y({},i);for(g in u)p(u,g)&&(s(i[g])&&s(u[g])?(h[g]={},y(h[g],i[g]),y(h[g],u[g])):null!=u[g]?h[g]=u[g]:delete h[g]);for(g in i)p(i,g)&&!p(u,g)&&s(i[g])&&(h[g]=y({},h[g]));return h}function va(i){null!=i&&this.set(i)}a.suppressDeprecationWarnings=!1,a.deprecationHandler=null,ga=Object.keys?Object.keys:function(i){var u,h=[];for(u in i)p(i,u)&&h.push(u);return h};var Et={};function ae(i,u){var h=i.toLowerCase();Et[h]=Et[h+"s"]=Et[u]=i}function be(i){return"string"==typeof i?Et[i]||Et[i.toLowerCase()]:void 0}function ma(i){var h,g,u={};for(g in i)p(i,g)&&(h=be(g))&&(u[h]=i[g]);return u}var Xn={};function ne(i,u){Xn[i]=u}function Ye(i,u,h){var g=""+Math.abs(i);return(i>=0?h?"+":"":"-")+Math.pow(10,Math.max(0,u-g.length)).toString().substr(1)+g}var Kn=/(\[[^\[]*\])|(\\)?([Hh]mm(ss)?|Mo|MM?M?M?|Do|DDDo|DD?D?D?|ddd?d?|do?|w[o|w]?|W[o|W]?|Qo?|YYYYYY|YYYYY|YYYY|YY|gg(ggg?)?|GG(GGG?)?|e|E|a|A|hh?|HH?|kk?|mm?|ss?|S{1,9}|x|X|zz?|ZZ?|.)/g,hr=/(\[[^\[]*\])|(\\)?(LTS|LT|LL?L?L?|l{1,4})/g,pa={},bt={};function L(i,u,h,g){var b=g;"string"==typeof g&&(b=function(){return this[g]()}),i&&(bt[i]=b),u&&(bt[u[0]]=function(){return Ye(b.apply(this,arguments),u[1],u[2])}),h&&(bt[h]=function(){return this.localeData().ordinal(b.apply(this,arguments),i)})}function Ql(i){return i.match(/\[[\s\S]/)?i.replace(/^\[|\]$/g,""):i.replace(/\\/g,"")}function cr(i,u){return i.isValid()?(u=Jn(u,i.localeData()),pa[u]=pa[u]||function eu(i){var h,g,u=i.match(Kn);for(h=0,g=u.length;h<g;h++)u[h]=bt[u[h]]?bt[u[h]]:Ql(u[h]);return function(b){var S,k="";for(S=0;S<g;S++)k+=fe(u[S])?u[S].call(b,i):u[S];return k}}(u),pa[u](i)):i.localeData().invalidDate()}function Jn(i,u){var h=5;function g(b){return u.longDateFormat(b)||b}for(hr.lastIndex=0;h>=0&&hr.test(i);)i=i.replace(hr,g),hr.lastIndex=0,h-=1;return i}var Qn=/\d/,ce=/\d\d/,ei=/\d{3}/,ba=/\d{4}/,vr=/[+-]?\d{6}/,$=/\d\d?/,ti=/\d\d\d\d?/,ri=/\d\d\d\d\d\d?/,gr=/\d{1,3}/,ya=/\d{1,4}/,mr=/[+-]?\d{1,6}/,tu=/\d+/,pr=/[+-]?\d+/,ru=/Z|[+-]\d\d:?\d\d/gi,br=/Z|[+-]\d\d(?::?\d\d)?/gi,zt=/[0-9]{0,256}['a-z\u00A0-\u05FF\u0700-\uD7FF\uF900-\uFDCF\uFDF0-\uFF07\uFF10-\uFFEF]{1,256}|[\u0600-\u06FF\/]{1,256}(\s*?[\u0600-\u06FF]{1,256}){1,2}/i,_a={};function P(i,u,h){_a[i]=fe(u)?u:function(g,b){return g&&h?h:u}}function nu(i,u){return p(_a,i)?_a[i](u._strict,u._locale):new RegExp(function iu(i){return ot(i.replace("\\","").replace(/\\(\[)|\\(\])|\[([^\]\[]*)\]|\\(.)/g,function(u,h,g,b,k){return h||g||b||k}))}(i))}function ot(i){return i.replace(/[-\/\\^$*+?.()|[\]{}]/g,"\\$&")}var xa={};function q(i,u){var h,g=u;for("string"==typeof i&&(i=[i]),f(u)&&(g=function(b,k){k[u]=O(b)}),h=0;h<i.length;h++)xa[i[h]]=g}function Bt(i,u){q(i,function(h,g,b,k){b._w=b._w||{},u(h,b._w,b,k)})}function ou(i,u,h){null!=u&&p(xa,i)&&xa[i](u,h._a,h,i)}function Ht(i){return yr(i)?366:365}function yr(i){return i%4==0&&i%100!=0||i%400==0}L("Y",0,0,function(){var i=this.year();return i<=9999?""+i:"+"+i}),L(0,["YY",2],0,function(){return this.year()%100}),L(0,["YYYY",4],0,"year"),L(0,["YYYYY",5],0,"year"),L(0,["YYYYYY",6,!0],0,"year"),ae("year","y"),ne("year",1),P("Y",pr),P("YY",$,ce),P("YYYY",ya,ba),P("YYYYY",mr,vr),P("YYYYYY",mr,vr),q(["YYYYY","YYYYYY"],0),q("YYYY",function(i,u){u[0]=2===i.length?a.parseTwoDigitYear(i):O(i)}),q("YY",function(i,u){u[0]=a.parseTwoDigitYear(i)}),q("Y",function(i,u){u[0]=parseInt(i,10)}),a.parseTwoDigitYear=function(i){return O(i)+(O(i)>68?1900:2e3)};var Q,ai=yt("FullYear",!0);function yt(i,u){return function(h){return null!=h?(ni(this,i,h),a.updateOffset(this,u),this):_r(this,i)}}function _r(i,u){return i.isValid()?i._d["get"+(i._isUTC?"UTC":"")+u]():NaN}function ni(i,u,h){i.isValid()&&!isNaN(h)&&("FullYear"===u&&yr(i.year())&&1===i.month()&&29===i.date()?i._d["set"+(i._isUTC?"UTC":"")+u](h,i.month(),xr(h,i.month())):i._d["set"+(i._isUTC?"UTC":"")+u](h))}function xr(i,u){if(isNaN(i)||isNaN(u))return NaN;var h=function hu(i,u){return(i%u+u)%u}(u,12);return i+=(u-h)/12,1===h?yr(i)?29:28:31-h%7%2}Q=Array.prototype.indexOf?Array.prototype.indexOf:function(i){var u;for(u=0;u<this.length;++u)if(this[u]===i)return u;return-1},L("M",["MM",2],"Mo",function(){return this.month()+1}),L("MMM",0,0,function(i){return this.localeData().monthsShort(this,i)}),L("MMMM",0,0,function(i){return this.localeData().months(this,i)}),ae("month","M"),ne("month",8),P("M",$),P("MM",$,ce),P("MMM",function(i,u){return u.monthsShortRegex(i)}),P("MMMM",function(i,u){return u.monthsRegex(i)}),q(["M","MM"],function(i,u){u[1]=O(i)-1}),q(["MMM","MMMM"],function(i,u,h,g){var b=h._locale.monthsParse(i,g,h._strict);null!=b?u[1]=b:x(h).invalidMonth=i});var ii=/D[oD]?(\[[^\[\]]*\]|\s)+MMMM?/,cu="January_February_March_April_May_June_July_August_September_October_November_December".split("_");var oi="Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec".split("_");function mu(i,u,h){var g,b,k,S=i.toLocaleLowerCase();if(!this._monthsParse)for(this._monthsParse=[],this._longMonthsParse=[],this._shortMonthsParse=[],g=0;g<12;++g)k=_([2e3,g]),this._shortMonthsParse[g]=this.monthsShort(k,"").toLocaleLowerCase(),this._longMonthsParse[g]=this.months(k,"").toLocaleLowerCase();return h?"MMM"===u?-1!==(b=Q.call(this._shortMonthsParse,S))?b:null:-1!==(b=Q.call(this._longMonthsParse,S))?b:null:"MMM"===u?-1!==(b=Q.call(this._shortMonthsParse,S))||-1!==(b=Q.call(this._longMonthsParse,S))?b:null:-1!==(b=Q.call(this._longMonthsParse,S))||-1!==(b=Q.call(this._shortMonthsParse,S))?b:null}function si(i,u){var h;if(!i.isValid())return i;if("string"==typeof u)if(/^\d+$/.test(u))u=O(u);else if(!f(u=i.localeData().monthsParse(u)))return i;return h=Math.min(i.date(),xr(i.year(),u)),i._d["set"+(i._isUTC?"UTC":"")+"Month"](u,h),i}function li(i){return null!=i?(si(this,i),a.updateOffset(this,!0),this):_r(this,"Month")}var yu=zt;var xu=zt;function ui(){function i(S,R){return R.length-S.length}var b,k,u=[],h=[],g=[];for(b=0;b<12;b++)k=_([2e3,b]),u.push(this.monthsShort(k,"")),h.push(this.months(k,"")),g.push(this.months(k,"")),g.push(this.monthsShort(k,""));for(u.sort(i),h.sort(i),g.sort(i),b=0;b<12;b++)u[b]=ot(u[b]),h[b]=ot(h[b]);for(b=0;b<24;b++)g[b]=ot(g[b]);this._monthsRegex=new RegExp("^("+g.join("|")+")","i"),this._monthsShortRegex=this._monthsRegex,this._monthsStrictRegex=new RegExp("^("+h.join("|")+")","i"),this._monthsShortStrictRegex=new RegExp("^("+u.join("|")+")","i")}function ku(i,u,h,g,b,k,S){var R;return i<100&&i>=0?(R=new Date(i+400,u,h,g,b,k,S),isFinite(R.getFullYear())&&R.setFullYear(i)):R=new Date(i,u,h,g,b,k,S),R}function Vt(i){var u;if(i<100&&i>=0){var h=Array.prototype.slice.call(arguments);h[0]=i+400,u=new Date(Date.UTC.apply(null,h)),isFinite(u.getUTCFullYear())&&u.setUTCFullYear(i)}else u=new Date(Date.UTC.apply(null,arguments));return u}function wr(i,u,h){var g=7+u-h;return-(7+Vt(i,0,g).getUTCDay()-u)%7+g-1}function di(i,u,h,g,b){var V,ee,R=1+7*(u-1)+(7+h-g)%7+wr(i,g,b);return R<=0?ee=Ht(V=i-1)+R:R>Ht(i)?(V=i+1,ee=R-Ht(i)):(V=i,ee=R),{year:V,dayOfYear:ee}}function Ut(i,u,h){var k,S,g=wr(i.year(),u,h),b=Math.floor((i.dayOfYear()-g-1)/7)+1;return b<1?k=b+lt(S=i.year()-1,u,h):b>lt(i.year(),u,h)?(k=b-lt(i.year(),u,h),S=i.year()+1):(S=i.year(),k=b),{week:k,year:S}}function lt(i,u,h){var g=wr(i,u,h),b=wr(i+1,u,h);return(Ht(i)-g+b)/7}L("w",["ww",2],"wo","week"),L("W",["WW",2],"Wo","isoWeek"),ae("week","w"),ae("isoWeek","W"),ne("week",5),ne("isoWeek",5),P("w",$),P("ww",$,ce),P("W",$),P("WW",$,ce),Bt(["w","ww","W","WW"],function(i,u,h,g){u[g.substr(0,1)]=O(i)});function wa(i,u){return i.slice(u,7).concat(i.slice(0,u))}L("d",0,"do","day"),L("dd",0,0,function(i){return this.localeData().weekdaysMin(this,i)}),L("ddd",0,0,function(i){return this.localeData().weekdaysShort(this,i)}),L("dddd",0,0,function(i){return this.localeData().weekdays(this,i)}),L("e",0,0,"weekday"),L("E",0,0,"isoWeekday"),ae("day","d"),ae("weekday","e"),ae("isoWeekday","E"),ne("day",11),ne("weekday",11),ne("isoWeekday",11),P("d",$),P("e",$),P("E",$),P("dd",function(i,u){return u.weekdaysMinRegex(i)}),P("ddd",function(i,u){return u.weekdaysShortRegex(i)}),P("dddd",function(i,u){return u.weekdaysRegex(i)}),Bt(["dd","ddd","dddd"],function(i,u,h,g){var b=h._locale.weekdaysParse(i,g,h._strict);null!=b?u.d=b:x(h).invalidWeekday=i}),Bt(["d","e","E"],function(i,u,h,g){u[g]=O(i)});var Au="Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday".split("_");var fi="Sun_Mon_Tue_Wed_Thu_Fri_Sat".split("_");var Ru="Su_Mo_Tu_We_Th_Fr_Sa".split("_");function Nu(i,u,h){var g,b,k,S=i.toLocaleLowerCase();if(!this._weekdaysParse)for(this._weekdaysParse=[],this._shortWeekdaysParse=[],this._minWeekdaysParse=[],g=0;g<7;++g)k=_([2e3,1]).day(g),this._minWeekdaysParse[g]=this.weekdaysMin(k,"").toLocaleLowerCase(),this._shortWeekdaysParse[g]=this.weekdaysShort(k,"").toLocaleLowerCase(),this._weekdaysParse[g]=this.weekdays(k,"").toLocaleLowerCase();return h?"dddd"===u?-1!==(b=Q.call(this._weekdaysParse,S))?b:null:"ddd"===u?-1!==(b=Q.call(this._shortWeekdaysParse,S))?b:null:-1!==(b=Q.call(this._minWeekdaysParse,S))?b:null:"dddd"===u?-1!==(b=Q.call(this._weekdaysParse,S))||-1!==(b=Q.call(this._shortWeekdaysParse,S))||-1!==(b=Q.call(this._minWeekdaysParse,S))?b:null:"ddd"===u?-1!==(b=Q.call(this._shortWeekdaysParse,S))||-1!==(b=Q.call(this._weekdaysParse,S))||-1!==(b=Q.call(this._minWeekdaysParse,S))?b:null:-1!==(b=Q.call(this._minWeekdaysParse,S))||-1!==(b=Q.call(this._weekdaysParse,S))||-1!==(b=Q.call(this._shortWeekdaysParse,S))?b:null}var Hu=zt;var Uu=zt;var Gu=zt;function ka(){function i(ye,qt){return qt.length-ye.length}var k,S,R,V,ee,u=[],h=[],g=[],b=[];for(k=0;k<7;k++)S=_([2e3,1]).day(k),R=this.weekdaysMin(S,""),V=this.weekdaysShort(S,""),ee=this.weekdays(S,""),u.push(R),h.push(V),g.push(ee),b.push(R),b.push(V),b.push(ee);for(u.sort(i),h.sort(i),g.sort(i),b.sort(i),k=0;k<7;k++)h[k]=ot(h[k]),g[k]=ot(g[k]),b[k]=ot(b[k]);this._weekdaysRegex=new RegExp("^("+b.join("|")+")","i"),this._weekdaysShortRegex=this._weekdaysRegex,this._weekdaysMinRegex=this._weekdaysRegex,this._weekdaysStrictRegex=new RegExp("^("+g.join("|")+")","i"),this._weekdaysShortStrictRegex=new RegExp("^("+h.join("|")+")","i"),this._weekdaysMinStrictRegex=new RegExp("^("+u.join("|")+")","i")}function Ma(){return this.hours()%12||12}function hi(i,u){L(i,0,0,function(){return this.localeData().meridiem(this.hours(),this.minutes(),u)})}function ci(i,u){return u._meridiemParse}L("H",["HH",2],0,"hour"),L("h",["hh",2],0,Ma),L("k",["kk",2],0,function qu(){return this.hours()||24}),L("hmm",0,0,function(){return""+Ma.apply(this)+Ye(this.minutes(),2)}),L("hmmss",0,0,function(){return""+Ma.apply(this)+Ye(this.minutes(),2)+Ye(this.seconds(),2)}),L("Hmm",0,0,function(){return""+this.hours()+Ye(this.minutes(),2)}),L("Hmmss",0,0,function(){return""+this.hours()+Ye(this.minutes(),2)+Ye(this.seconds(),2)}),hi("a",!0),hi("A",!1),ae("hour","h"),ne("hour",13),P("a",ci),P("A",ci),P("H",$),P("h",$),P("k",$),P("HH",$,ce),P("hh",$,ce),P("kk",$,ce),P("hmm",ti),P("hmmss",ri),P("Hmm",ti),P("Hmmss",ri),q(["H","HH"],3),q(["k","kk"],function(i,u,h){var g=O(i);u[3]=24===g?0:g}),q(["a","A"],function(i,u,h){h._isPm=h._locale.isPM(i),h._meridiem=i}),q(["h","hh"],function(i,u,h){u[3]=O(i),x(h).bigHour=!0}),q("hmm",function(i,u,h){var g=i.length-2;u[3]=O(i.substr(0,g)),u[4]=O(i.substr(g)),x(h).bigHour=!0}),q("hmmss",function(i,u,h){var g=i.length-4,b=i.length-2;u[3]=O(i.substr(0,g)),u[4]=O(i.substr(g,2)),u[5]=O(i.substr(b)),x(h).bigHour=!0}),q("Hmm",function(i,u,h){var g=i.length-2;u[3]=O(i.substr(0,g)),u[4]=O(i.substr(g))}),q("Hmmss",function(i,u,h){var g=i.length-4,b=i.length-2;u[3]=O(i.substr(0,g)),u[4]=O(i.substr(g,2)),u[5]=O(i.substr(b))});var Gt,Ju=yt("Hours",!0),vi={calendar:{sameDay:"[Today at] LT",nextDay:"[Tomorrow at] LT",nextWeek:"dddd [at] LT",lastDay:"[Yesterday at] LT",lastWeek:"[Last] dddd [at] LT",sameElse:"L"},longDateFormat:{LTS:"h:mm:ss A",LT:"h:mm A",L:"MM/DD/YYYY",LL:"MMMM D, YYYY",LLL:"MMMM D, YYYY h:mm A",LLLL:"dddd, MMMM D, YYYY h:mm A"},invalidDate:"Invalid date",ordinal:"%d",dayOfMonthOrdinalParse:/\d{1,2}/,relativeTime:{future:"in %s",past:"%s ago",s:"a few seconds",ss:"%d seconds",m:"a minute",mm:"%d minutes",h:"an hour",hh:"%d hours",d:"a day",dd:"%d days",M:"a month",MM:"%d months",y:"a year",yy:"%d years"},months:cu,monthsShort:oi,week:{dow:0,doy:6},weekdays:Au,weekdaysMin:Ru,weekdaysShort:fi,meridiemParse:/[ap]\.?m?\.?/i},re={},jt={};function gi(i){return i&&i.toLowerCase().replace("_","-")}function kr(i){var u=null;if(!re[i]&&e&&e.exports)try{u=Gt._abbr,function Dt(){throw new Error("Dynamic requires are not currently supported by rollup-plugin-commonjs")}(),_t(u)}catch(g){}return re[i]}function _t(i,u){var h;return i&&((h=l(u)?$e(i):Sa(i,u))?Gt=h:"undefined"!=typeof console&&console.warn&&console.warn("Locale "+i+" not found. Did you forget to load it?")),Gt._abbr}function Sa(i,u){if(null!==u){var h,g=vi;if(u.abbr=i,null!=re[i])Ne("defineLocaleOverride","use moment.updateLocale(localeName, config) to change an existing locale. moment.defineLocale(localeName, config) should only be used for creating a new locale See http://momentjs.com/guides/#/warnings/define-locale/ for more info."),g=re[i]._config;else if(null!=u.parentLocale)if(null!=re[u.parentLocale])g=re[u.parentLocale]._config;else{if(null==(h=kr(u.parentLocale)))return jt[u.parentLocale]||(jt[u.parentLocale]=[]),jt[u.parentLocale].push({name:i,config:u}),null;g=h._config}return re[i]=new va(Zn(g,u)),jt[i]&&jt[i].forEach(function(b){Sa(b.name,b.config)}),_t(i),re[i]}return delete re[i],null}function $e(i){var u;if(i&&i._locale&&i._locale._abbr&&(i=i._locale._abbr),!i)return Gt;if(!o(i)){if(u=kr(i))return u;i=[i]}return function Qu(i){for(var h,g,b,k,u=0;u<i.length;){for(h=(k=gi(i[u]).split("-")).length,g=(g=gi(i[u+1]))?g.split("-"):null;h>0;){if(b=kr(k.slice(0,h).join("-")))return b;if(g&&g.length>=h&&J(k,g,!0)>=h-1)break;h--}u++}return Gt}(i)}function Da(i){var u,h=i._a;return h&&-2===x(i).overflow&&(u=h[1]<0||h[1]>11?1:h[2]<1||h[2]>xr(h[0],h[1])?2:h[3]<0||h[3]>24||24===h[3]&&(0!==h[4]||0!==h[5]||0!==h[6])?3:h[4]<0||h[4]>59?4:h[5]<0||h[5]>59?5:h[6]<0||h[6]>999?6:-1,x(i)._overflowDayOfYear&&(u<0||u>2)&&(u=2),x(i)._overflowWeeks&&-1===u&&(u=7),x(i)._overflowWeekday&&-1===u&&(u=8),x(i).overflow=u),i}function xt(i,u,h){return null!=i?i:null!=u?u:h}function Ta(i){var u,h,b,k,S,g=[];if(!i._d){for(b=function rd(i){var u=new Date(a.now());return i._useUTC?[u.getUTCFullYear(),u.getUTCMonth(),u.getUTCDate()]:[u.getFullYear(),u.getMonth(),u.getDate()]}(i),i._w&&null==i._a[2]&&null==i._a[1]&&function ad(i){var u,h,g,b,k,S,R,V;if(null!=(u=i._w).GG||null!=u.W||null!=u.E)k=1,S=4,h=xt(u.GG,i._a[0],Ut(Z(),1,4).year),g=xt(u.W,1),((b=xt(u.E,1))<1||b>7)&&(V=!0);else{k=i._locale._week.dow,S=i._locale._week.doy;var ee=Ut(Z(),k,S);h=xt(u.gg,i._a[0],ee.year),g=xt(u.w,ee.week),null!=u.d?((b=u.d)<0||b>6)&&(V=!0):null!=u.e?(b=u.e+k,(u.e<0||u.e>6)&&(V=!0)):b=k}g<1||g>lt(h,k,S)?x(i)._overflowWeeks=!0:null!=V?x(i)._overflowWeekday=!0:(R=di(h,g,b,k,S),i._a[0]=R.year,i._dayOfYear=R.dayOfYear)}(i),null!=i._dayOfYear&&(S=xt(i._a[0],b[0]),(i._dayOfYear>Ht(S)||0===i._dayOfYear)&&(x(i)._overflowDayOfYear=!0),h=Vt(S,0,i._dayOfYear),i._a[1]=h.getUTCMonth(),i._a[2]=h.getUTCDate()),u=0;u<3&&null==i._a[u];++u)i._a[u]=g[u]=b[u];for(;u<7;u++)i._a[u]=g[u]=null==i._a[u]?2===u?1:0:i._a[u];24===i._a[3]&&0===i._a[4]&&0===i._a[5]&&0===i._a[6]&&(i._nextDay=!0,i._a[3]=0),i._d=(i._useUTC?Vt:ku).apply(null,g),k=i._useUTC?i._d.getUTCDay():i._d.getDay(),null!=i._tzm&&i._d.setUTCMinutes(i._d.getUTCMinutes()-i._tzm),i._nextDay&&(i._a[3]=24),i._w&&void 0!==i._w.d&&i._w.d!==k&&(x(i).weekdayMismatch=!0)}}var nd=/^\s*((?:[+-]\d{6}|\d{4})-(?:\d\d-\d\d|W\d\d-\d|W\d\d|\d\d\d|\d\d))(?:(T| )(\d\d(?::\d\d(?::\d\d(?:[.,]\d+)?)?)?)([\+\-]\d\d(?::?\d\d)?|\s*Z)?)?$/,id=/^\s*((?:[+-]\d{6}|\d{4})(?:\d\d\d\d|W\d\d\d|W\d\d|\d\d\d|\d\d))(?:(T| )(\d\d(?:\d\d(?:\d\d(?:[.,]\d+)?)?)?)([\+\-]\d\d(?::?\d\d)?|\s*Z)?)?$/,od=/Z|[+-]\d\d(?::?\d\d)?/,Mr=[["YYYYYY-MM-DD",/[+-]\d{6}-\d\d-\d\d/],["YYYY-MM-DD",/\d{4}-\d\d-\d\d/],["GGGG-[W]WW-E",/\d{4}-W\d\d-\d/],["GGGG-[W]WW",/\d{4}-W\d\d/,!1],["YYYY-DDD",/\d{4}-\d{3}/],["YYYY-MM",/\d{4}-\d\d/,!1],["YYYYYYMMDD",/[+-]\d{10}/],["YYYYMMDD",/\d{8}/],["GGGG[W]WWE",/\d{4}W\d{3}/],["GGGG[W]WW",/\d{4}W\d{2}/,!1],["YYYYDDD",/\d{7}/]],Ca=[["HH:mm:ss.SSSS",/\d\d:\d\d:\d\d\.\d+/],["HH:mm:ss,SSSS",/\d\d:\d\d:\d\d,\d+/],["HH:mm:ss",/\d\d:\d\d:\d\d/],["HH:mm",/\d\d:\d\d/],["HHmmss.SSSS",/\d\d\d\d\d\d\.\d+/],["HHmmss,SSSS",/\d\d\d\d\d\d,\d+/],["HHmmss",/\d\d\d\d\d\d/],["HHmm",/\d\d\d\d/],["HH",/\d\d/]],sd=/^\/?Date\((\-?\d+)/i;function mi(i){var u,h,k,S,R,V,g=i._i,b=nd.exec(g)||id.exec(g);if(b){for(x(i).iso=!0,u=0,h=Mr.length;u<h;u++)if(Mr[u][1].exec(b[1])){S=Mr[u][0],k=!1!==Mr[u][2];break}if(null==S)return void(i._isValid=!1);if(b[3]){for(u=0,h=Ca.length;u<h;u++)if(Ca[u][1].exec(b[3])){R=(b[2]||" ")+Ca[u][0];break}if(null==R)return void(i._isValid=!1)}if(!k&&null!=R)return void(i._isValid=!1);if(b[4]){if(!od.exec(b[4]))return void(i._isValid=!1);V="Z"}i._f=S+(R||"")+(V||""),Pa(i)}else i._isValid=!1}var ld=/^(?:(Mon|Tue|Wed|Thu|Fri|Sat|Sun),?\s)?(\d{1,2})\s(Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)\s(\d{2,4})\s(\d\d):(\d\d)(?::(\d\d))?\s(?:(UT|GMT|[ECMP][SD]T)|([Zz])|([+-]\d{4}))$/;function dd(i){var u=parseInt(i,10);return u<=49?2e3+u:u<=999?1900+u:u}var cd={UT:0,GMT:0,EDT:-240,EST:-300,CDT:-300,CST:-360,MDT:-360,MST:-420,PDT:-420,PST:-480};function pi(i){var u=ld.exec(function fd(i){return i.replace(/\([^)]*\)|[\n\t]/g," ").replace(/(\s\s+)/g," ").replace(/^\s\s*/,"").replace(/\s\s*$/,"")}(i._i));if(u){var h=function ud(i,u,h,g,b,k){var S=[dd(i),oi.indexOf(u),parseInt(h,10),parseInt(g,10),parseInt(b,10)];return k&&S.push(parseInt(k,10)),S}(u[4],u[3],u[2],u[5],u[6],u[7]);if(!function hd(i,u,h){return!i||fi.indexOf(i)===new Date(u[0],u[1],u[2]).getDay()||(x(h).weekdayMismatch=!0,h._isValid=!1,!1)}(u[1],h,i))return;i._a=h,i._tzm=function vd(i,u,h){if(i)return cd[i];if(u)return 0;var g=parseInt(h,10),b=g%100;return(g-b)/100*60+b}(u[8],u[9],u[10]),i._d=Vt.apply(null,i._a),i._d.setUTCMinutes(i._d.getUTCMinutes()-i._tzm),x(i).rfc2822=!0}else i._isValid=!1}function Pa(i){if(i._f!==a.ISO_8601)if(i._f!==a.RFC_2822){i._a=[],x(i).empty=!0;var h,g,b,k,S,u=""+i._i,R=u.length,V=0;for(b=Jn(i._f,i._locale).match(Kn)||[],h=0;h<b.length;h++)(g=(u.match(nu(k=b[h],i))||[])[0])&&((S=u.substr(0,u.indexOf(g))).length>0&&x(i).unusedInput.push(S),u=u.slice(u.indexOf(g)+g.length),V+=g.length),bt[k]?(g?x(i).empty=!1:x(i).unusedTokens.push(k),ou(k,g,i)):i._strict&&!g&&x(i).unusedTokens.push(k);x(i).charsLeftOver=R-V,u.length>0&&x(i).unusedInput.push(u),i._a[3]<=12&&!0===x(i).bigHour&&i._a[3]>0&&(x(i).bigHour=void 0),x(i).parsedDateParts=i._a.slice(0),x(i).meridiem=i._meridiem,i._a[3]=function md(i,u,h){var g;return null==h?u:null!=i.meridiemHour?i.meridiemHour(u,h):(null!=i.isPM&&((g=i.isPM(h))&&u<12&&(u+=12),!g&&12===u&&(u=0)),u)}(i._locale,i._a[3],i._meridiem),Ta(i),Da(i)}else pi(i);else mi(i)}function bi(i){var u=i._i,h=i._f;return i._locale=i._locale||$e(i._l),null===u||void 0===h&&""===u?C({nullInput:!0}):("string"==typeof u&&(i._i=u=i._locale.preparse(u)),Y(u)?new N(Da(u)):(c(u)?i._d=u:o(h)?function pd(i){var u,h,g,b,k;if(0===i._f.length)return x(i).invalidFormat=!0,void(i._d=new Date(NaN));for(b=0;b<i._f.length;b++)k=0,u=A({},i),null!=i._useUTC&&(u._useUTC=i._useUTC),u._f=i._f[b],Pa(u),T(u)&&(k+=x(u).charsLeftOver,k+=10*x(u).unusedTokens.length,x(u).score=k,(null==g||k<g)&&(g=k,h=u));y(i,h||u)}(i):h?Pa(i):function _d(i){var u=i._i;l(u)?i._d=new Date(a.now()):c(u)?i._d=new Date(u.valueOf()):"string"==typeof u?function gd(i){var u=sd.exec(i._i);null===u?(mi(i),!1===i._isValid&&(delete i._isValid,pi(i),!1===i._isValid&&(delete i._isValid,a.createFromInputFallback(i)))):i._d=new Date(+u[1])}(i):o(u)?(i._a=v(u.slice(0),function(h){return parseInt(h,10)}),Ta(i)):s(u)?function bd(i){if(!i._d){var u=ma(i._i);i._a=v([u.year,u.month,u.day||u.date,u.hour,u.minute,u.second,u.millisecond],function(h){return h&&parseInt(h,10)}),Ta(i)}}(i):f(u)?i._d=new Date(u):a.createFromInputFallback(i)}(i),T(i)||(i._d=null),i))}function yi(i,u,h,g,b){var k={};return(!0===h||!1===h)&&(g=h,h=void 0),(s(i)&&function d(i){if(Object.getOwnPropertyNames)return 0===Object.getOwnPropertyNames(i).length;var u;for(u in i)if(i.hasOwnProperty(u))return!1;return!0}(i)||o(i)&&0===i.length)&&(i=void 0),k._isAMomentObject=!0,k._useUTC=k._isUTC=b,k._l=h,k._i=i,k._f=u,k._strict=g,function yd(i){var u=new N(Da(bi(i)));return u._nextDay&&(u.add(1,"d"),u._nextDay=void 0),u}(k)}function Z(i,u,h,g){return yi(i,u,h,g,!1)}a.createFromInputFallback=U("value provided is not in a recognized RFC2822 or ISO format. moment construction falls back to js Date(), which is not reliable across all browsers and versions. Non RFC2822/ISO date formats are discouraged and will be removed in an upcoming major release. Please refer to http://momentjs.com/guides/#/warnings/js-date/ for more info.",function(i){i._d=new Date(i._i+(i._useUTC?" UTC":""))}),a.ISO_8601=function(){},a.RFC_2822=function(){};var xd=U("moment().min is deprecated, use moment.max instead. http://momentjs.com/guides/#/warnings/min-max/",function(){var i=Z.apply(null,arguments);return this.isValid()&&i.isValid()?i<this?this:i:C()}),wd=U("moment().max is deprecated, use moment.min instead. http://momentjs.com/guides/#/warnings/min-max/",function(){var i=Z.apply(null,arguments);return this.isValid()&&i.isValid()?i>this?this:i:C()});function _i(i,u){var h,g;if(1===u.length&&o(u[0])&&(u=u[0]),!u.length)return Z();for(h=u[0],g=1;g<u.length;++g)(!u[g].isValid()||u[g][i](h))&&(h=u[g]);return h}var $t=["year","quarter","month","week","day","hour","minute","second","millisecond"];function Sr(i){var u=ma(i),h=u.year||0,g=u.quarter||0,b=u.month||0,k=u.week||u.isoWeek||0,S=u.day||0,R=u.hour||0,V=u.minute||0,ee=u.second||0,ye=u.millisecond||0;this._isValid=function Dd(i){for(var u in i)if(-1===Q.call($t,u)||null!=i[u]&&isNaN(i[u]))return!1;for(var h=!1,g=0;g<$t.length;++g)if(i[$t[g]]){if(h)return!1;parseFloat(i[$t[g]])!==O(i[$t[g]])&&(h=!0)}return!0}(u),this._milliseconds=+ye+1e3*ee+6e4*V+1e3*R*60*60,this._days=+S+7*k,this._months=+b+3*g+12*h,this._data={},this._locale=$e(),this._bubble()}function Oa(i){return i instanceof Sr}function Fa(i){return i<0?-1*Math.round(-1*i):Math.round(i)}function xi(i,u){L(i,0,0,function(){var h=this.utcOffset(),g="+";return h<0&&(h=-h,g="-"),g+Ye(~~(h/60),2)+u+Ye(~~h%60,2)})}xi("Z",":"),xi("ZZ",""),P("Z",br),P("ZZ",br),q(["Z","ZZ"],function(i,u,h){h._useUTC=!0,h._tzm=Aa(br,i)});var Pd=/([\+\-]|\d\d)/gi;function Aa(i,u){var h=(u||"").match(i);if(null===h)return null;var b=((h[h.length-1]||[])+"").match(Pd)||["-",0,0],k=60*b[1]+O(b[2]);return 0===k?0:"+"===b[0]?k:-k}function Ia(i,u){var h,g;return u._isUTC?(h=u.clone(),g=(Y(i)||c(i)?i.valueOf():Z(i).valueOf())-h.valueOf(),h._d.setTime(h._d.valueOf()+g),a.updateOffset(h,!1),h):Z(i).local()}function La(i){return 15*-Math.round(i._d.getTimezoneOffset()/15)}function wi(){return!!this.isValid()&&this._isUTC&&0===this._offset}a.updateOffset=function(){};var zd=/^(\-|\+)?(?:(\d*)[. ])?(\d+)\:(\d+)(?:\:(\d+)(\.\d*)?)?$/,Bd=/^(-|\+)?P(?:([-+]?[0-9,.]*)Y)?(?:([-+]?[0-9,.]*)M)?(?:([-+]?[0-9,.]*)W)?(?:([-+]?[0-9,.]*)D)?(?:T(?:([-+]?[0-9,.]*)H)?(?:([-+]?[0-9,.]*)M)?(?:([-+]?[0-9,.]*)S)?)?$/;function Me(i,u){var b,k,S,h=i,g=null;return Oa(i)?h={ms:i._milliseconds,d:i._days,M:i._months}:f(i)?(h={},u?h[u]=i:h.milliseconds=i):(g=zd.exec(i))?(b="-"===g[1]?-1:1,h={y:0,d:O(g[2])*b,h:O(g[3])*b,m:O(g[4])*b,s:O(g[5])*b,ms:O(Fa(1e3*g[6]))*b}):(g=Bd.exec(i))?h={y:ut(g[2],b="-"===g[1]?-1:1),M:ut(g[3],b),w:ut(g[4],b),d:ut(g[5],b),h:ut(g[6],b),m:ut(g[7],b),s:ut(g[8],b)}:null==h?h={}:"object"==typeof h&&("from"in h||"to"in h)&&(S=function Hd(i,u){var h;return i.isValid()&&u.isValid()?(u=Ia(u,i),i.isBefore(u)?h=ki(i,u):((h=ki(u,i)).milliseconds=-h.milliseconds,h.months=-h.months),h):{milliseconds:0,months:0}}(Z(h.from),Z(h.to)),(h={}).ms=S.milliseconds,h.M=S.months),k=new Sr(h),Oa(i)&&p(i,"_locale")&&(k._locale=i._locale),k}function ut(i,u){var h=i&&parseFloat(i.replace(",","."));return(isNaN(h)?0:h)*u}function ki(i,u){var h={};return h.months=u.month()-i.month()+12*(u.year()-i.year()),i.clone().add(h.months,"M").isAfter(u)&&--h.months,h.milliseconds=+u-+i.clone().add(h.months,"M"),h}function Mi(i,u){return function(h,g){var k;return null!==g&&!isNaN(+g)&&(Ne(u,"moment()."+u+"(period, number) is deprecated. Please use moment()."+u+"(number, period). See http://momentjs.com/guides/#/warnings/add-inverted-param/ for more info."),k=h,h=g,g=k),Si(this,Me(h="string"==typeof h?+h:h,g),i),this}}function Si(i,u,h,g){var b=u._milliseconds,k=Fa(u._days),S=Fa(u._months);!i.isValid()||(g=null==g||g,S&&si(i,_r(i,"Month")+S*h),k&&ni(i,"Date",_r(i,"Date")+k*h),b&&i._d.setTime(i._d.valueOf()+b*h),g&&a.updateOffset(i,k||S))}Me.fn=Sr.prototype,Me.invalid=function Cd(){return Me(NaN)};var Vd=Mi(1,"add"),Ud=Mi(-1,"subtract");function Ra(i,u){var h=12*(u.year()-i.year())+(u.month()-i.month()),g=i.clone().add(h,"months");return-(h+(u-g<0?(u-g)/(g-i.clone().add(h-1,"months")):(u-g)/(i.clone().add(h+1,"months")-g)))||0}function Di(i){var u;return void 0===i?this._locale._abbr:(null!=(u=$e(i))&&(this._locale=u),this)}a.defaultFormat="YYYY-MM-DDTHH:mm:ssZ",a.defaultFormatUtc="YYYY-MM-DDTHH:mm:ss[Z]";var Ti=U("moment().lang() is deprecated. Instead, use moment().localeData() to get the language configuration. Use moment().locale() to change languages.",function(i){return void 0===i?this.localeData():this.locale(i)});function Ci(){return this._locale}var wt=6e4,Tr=60*wt,Pi=3506328*Tr;function kt(i,u){return(i%u+u)%u}function Oi(i,u,h){return i<100&&i>=0?new Date(i+400,u,h)-Pi:new Date(i,u,h).valueOf()}function Fi(i,u,h){return i<100&&i>=0?Date.UTC(i+400,u,h)-Pi:Date.UTC(i,u,h)}function Cr(i,u){L(0,[i,i.length],0,u)}function Ai(i,u,h,g,b){var k;return null==i?Ut(this,g,b).year:(u>(k=lt(i,g,b))&&(u=k),Df.call(this,i,u,h,g,b))}function Df(i,u,h,g,b){var k=di(i,u,h,g,b),S=Vt(k.year,0,k.dayOfYear);return this.year(S.getUTCFullYear()),this.month(S.getUTCMonth()),this.date(S.getUTCDate()),this}L(0,["gg",2],0,function(){return this.weekYear()%100}),L(0,["GG",2],0,function(){return this.isoWeekYear()%100}),Cr("gggg","weekYear"),Cr("ggggg","weekYear"),Cr("GGGG","isoWeekYear"),Cr("GGGGG","isoWeekYear"),ae("weekYear","gg"),ae("isoWeekYear","GG"),ne("weekYear",1),ne("isoWeekYear",1),P("G",pr),P("g",pr),P("GG",$,ce),P("gg",$,ce),P("GGGG",ya,ba),P("gggg",ya,ba),P("GGGGG",mr,vr),P("ggggg",mr,vr),Bt(["gggg","ggggg","GGGG","GGGGG"],function(i,u,h,g){u[g.substr(0,2)]=O(i)}),Bt(["gg","GG"],function(i,u,h,g){u[g]=a.parseTwoDigitYear(i)}),L("Q",0,"Qo","quarter"),ae("quarter","Q"),ne("quarter",7),P("Q",Qn),q("Q",function(i,u){u[1]=3*(O(i)-1)}),L("D",["DD",2],"Do","date"),ae("date","D"),ne("date",9),P("D",$),P("DD",$,ce),P("Do",function(i,u){return i?u._dayOfMonthOrdinalParse||u._ordinalParse:u._dayOfMonthOrdinalParseLenient}),q(["D","DD"],2),q("Do",function(i,u){u[2]=O(i.match($)[0])});var Ii=yt("Date",!0);L("DDD",["DDDD",3],"DDDo","dayOfYear"),ae("dayOfYear","DDD"),ne("dayOfYear",4),P("DDD",gr),P("DDDD",ei),q(["DDD","DDDD"],function(i,u,h){h._dayOfYear=O(i)}),L("m",["mm",2],0,"minute"),ae("minute","m"),ne("minute",14),P("m",$),P("mm",$,ce),q(["m","mm"],4);var Pf=yt("Minutes",!1);L("s",["ss",2],0,"second"),ae("second","s"),ne("second",15),P("s",$),P("ss",$,ce),q(["s","ss"],5);var qe,Of=yt("Seconds",!1);for(L("S",0,0,function(){return~~(this.millisecond()/100)}),L(0,["SS",2],0,function(){return~~(this.millisecond()/10)}),L(0,["SSS",3],0,"millisecond"),L(0,["SSSS",4],0,function(){return 10*this.millisecond()}),L(0,["SSSSS",5],0,function(){return 100*this.millisecond()}),L(0,["SSSSSS",6],0,function(){return 1e3*this.millisecond()}),L(0,["SSSSSSS",7],0,function(){return 1e4*this.millisecond()}),L(0,["SSSSSSSS",8],0,function(){return 1e5*this.millisecond()}),L(0,["SSSSSSSSS",9],0,function(){return 1e6*this.millisecond()}),ae("millisecond","ms"),ne("millisecond",16),P("S",gr,Qn),P("SS",gr,ce),P("SSS",gr,ei),qe="SSSS";qe.length<=9;qe+="S")P(qe,tu);function Ff(i,u){u[6]=O(1e3*("0."+i))}for(qe="S";qe.length<=9;qe+="S")q(qe,Ff);var Af=yt("Milliseconds",!1);L("z",0,0,"zoneAbbr"),L("zz",0,0,"zoneName");var D=N.prototype;function Li(i){return i}D.add=Vd,D.calendar=function Gd(i,u){var h=i||Z(),g=Ia(h,this).startOf("day"),b=a.calendarFormat(this,g)||"sameElse",k=u&&(fe(u[b])?u[b].call(this,h):u[b]);return this.format(k||this.localeData().calendar(b,this,Z(h)))},D.clone=function $d(){return new N(this)},D.diff=function ef(i,u,h){var g,b,k;if(!this.isValid())return NaN;if(!(g=Ia(i,this)).isValid())return NaN;switch(b=6e4*(g.utcOffset()-this.utcOffset()),u=be(u)){case"year":k=Ra(this,g)/12;break;case"month":k=Ra(this,g);break;case"quarter":k=Ra(this,g)/3;break;case"second":k=(this-g)/1e3;break;case"minute":k=(this-g)/6e4;break;case"hour":k=(this-g)/36e5;break;case"day":k=(this-g-b)/864e5;break;case"week":k=(this-g-b)/6048e5;break;default:k=this-g}return h?k:E(k)},D.endOf=function ff(i){var u;if(void 0===(i=be(i))||"millisecond"===i||!this.isValid())return this;var h=this._isUTC?Fi:Oi;switch(i){case"year":u=h(this.year()+1,0,1)-1;break;case"quarter":u=h(this.year(),this.month()-this.month()%3+3,1)-1;break;case"month":u=h(this.year(),this.month()+1,1)-1;break;case"week":u=h(this.year(),this.month(),this.date()-this.weekday()+7)-1;break;case"isoWeek":u=h(this.year(),this.month(),this.date()-(this.isoWeekday()-1)+7)-1;break;case"day":case"date":u=h(this.year(),this.month(),this.date()+1)-1;break;case"hour":u=this._d.valueOf(),u+=Tr-kt(u+(this._isUTC?0:this.utcOffset()*wt),Tr)-1;break;case"minute":u=this._d.valueOf(),u+=wt-kt(u,wt)-1;break;case"second":u=this._d.valueOf(),u+=1e3-kt(u,1e3)-1}return this._d.setTime(u),a.updateOffset(this,!0),this},D.format=function nf(i){i||(i=this.isUtc()?a.defaultFormatUtc:a.defaultFormat);var u=cr(this,i);return this.localeData().postformat(u)},D.from=function of(i,u){return this.isValid()&&(Y(i)&&i.isValid()||Z(i).isValid())?Me({to:this,from:i}).locale(this.locale()).humanize(!u):this.localeData().invalidDate()},D.fromNow=function sf(i){return this.from(Z(),i)},D.to=function lf(i,u){return this.isValid()&&(Y(i)&&i.isValid()||Z(i).isValid())?Me({from:this,to:i}).locale(this.locale()).humanize(!u):this.localeData().invalidDate()},D.toNow=function uf(i){return this.to(Z(),i)},D.get=function du(i){return fe(this[i=be(i)])?this[i]():this},D.invalidAt=function _f(){return x(this).overflow},D.isAfter=function qd(i,u){var h=Y(i)?i:Z(i);return!(!this.isValid()||!h.isValid())&&("millisecond"===(u=be(u)||"millisecond")?this.valueOf()>h.valueOf():h.valueOf()<this.clone().startOf(u).valueOf())},D.isBefore=function Zd(i,u){var h=Y(i)?i:Z(i);return!(!this.isValid()||!h.isValid())&&("millisecond"===(u=be(u)||"millisecond")?this.valueOf()<h.valueOf():this.clone().endOf(u).valueOf()<h.valueOf())},D.isBetween=function Xd(i,u,h,g){var b=Y(i)?i:Z(i),k=Y(u)?u:Z(u);return!!(this.isValid()&&b.isValid()&&k.isValid())&&("("===(g=g||"()")[0]?this.isAfter(b,h):!this.isBefore(b,h))&&(")"===g[1]?this.isBefore(k,h):!this.isAfter(k,h))},D.isSame=function Kd(i,u){var g,h=Y(i)?i:Z(i);return!(!this.isValid()||!h.isValid())&&("millisecond"===(u=be(u)||"millisecond")?this.valueOf()===h.valueOf():(g=h.valueOf(),this.clone().startOf(u).valueOf()<=g&&g<=this.clone().endOf(u).valueOf()))},D.isSameOrAfter=function Jd(i,u){return this.isSame(i,u)||this.isAfter(i,u)},D.isSameOrBefore=function Qd(i,u){return this.isSame(i,u)||this.isBefore(i,u)},D.isValid=function bf(){return T(this)},D.lang=Ti,D.locale=Di,D.localeData=Ci,D.max=wd,D.min=xd,D.parsingFlags=function yf(){return y({},x(this))},D.set=function fu(i,u){if("object"==typeof i)for(var h=function Jl(i){var u=[];for(var h in i)u.push({unit:h,priority:Xn[h]});return u.sort(function(g,b){return g.priority-b.priority}),u}(i=ma(i)),g=0;g<h.length;g++)this[h[g].unit](i[h[g].unit]);else if(fe(this[i=be(i)]))return this[i](u);return this},D.startOf=function df(i){var u;if(void 0===(i=be(i))||"millisecond"===i||!this.isValid())return this;var h=this._isUTC?Fi:Oi;switch(i){case"year":u=h(this.year(),0,1);break;case"quarter":u=h(this.year(),this.month()-this.month()%3,1);break;case"month":u=h(this.year(),this.month(),1);break;case"week":u=h(this.year(),this.month(),this.date()-this.weekday());break;case"isoWeek":u=h(this.year(),this.month(),this.date()-(this.isoWeekday()-1));break;case"day":case"date":u=h(this.year(),this.month(),this.date());break;case"hour":u=this._d.valueOf(),u-=kt(u+(this._isUTC?0:this.utcOffset()*wt),Tr);break;case"minute":u=this._d.valueOf(),u-=kt(u,wt);break;case"second":u=this._d.valueOf(),u-=kt(u,1e3)}return this._d.setTime(u),a.updateOffset(this,!0),this},D.subtract=Ud,D.toArray=function gf(){var i=this;return[i.year(),i.month(),i.date(),i.hour(),i.minute(),i.second(),i.millisecond()]},D.toObject=function mf(){var i=this;return{years:i.year(),months:i.month(),date:i.date(),hours:i.hours(),minutes:i.minutes(),seconds:i.seconds(),milliseconds:i.milliseconds()}},D.toDate=function vf(){return new Date(this.valueOf())},D.toISOString=function rf(i){if(!this.isValid())return null;var u=!0!==i,h=u?this.clone().utc():this;return h.year()<0||h.year()>9999?cr(h,u?"YYYYYY-MM-DD[T]HH:mm:ss.SSS[Z]":"YYYYYY-MM-DD[T]HH:mm:ss.SSSZ"):fe(Date.prototype.toISOString)?u?this.toDate().toISOString():new Date(this.valueOf()+60*this.utcOffset()*1e3).toISOString().replace("Z",cr(h,"Z")):cr(h,u?"YYYY-MM-DD[T]HH:mm:ss.SSS[Z]":"YYYY-MM-DD[T]HH:mm:ss.SSSZ")},D.inspect=function af(){if(!this.isValid())return"moment.invalid(/* "+this._i+" */)";var i="moment",u="";this.isLocal()||(i=0===this.utcOffset()?"moment.utc":"moment.parseZone",u="Z");var h="["+i+'("]',g=0<=this.year()&&this.year()<=9999?"YYYY":"YYYYYY";return this.format(h+g+"-MM-DD[T]HH:mm:ss.SSS"+u+'[")]')},D.toJSON=function pf(){return this.isValid()?this.toISOString():null},D.toString=function tf(){return this.clone().locale("en").format("ddd MMM DD YYYY HH:mm:ss [GMT]ZZ")},D.unix=function cf(){return Math.floor(this.valueOf()/1e3)},D.valueOf=function hf(){return this._d.valueOf()-6e4*(this._offset||0)},D.creationData=function xf(){return{input:this._i,format:this._f,locale:this._locale,isUTC:this._isUTC,strict:this._strict}},D.year=ai,D.isLeapYear=function uu(){return yr(this.year())},D.weekYear=function wf(i){return Ai.call(this,i,this.week(),this.weekday(),this.localeData()._week.dow,this.localeData()._week.doy)},D.isoWeekYear=function kf(i){return Ai.call(this,i,this.isoWeek(),this.isoWeekday(),1,4)},D.quarter=D.quarters=function Tf(i){return null==i?Math.ceil((this.month()+1)/3):this.month(3*(i-1)+this.month()%3)},D.month=li,D.daysInMonth=function bu(){return xr(this.year(),this.month())},D.week=D.weeks=function Cu(i){var u=this.localeData().week(this);return null==i?u:this.add(7*(i-u),"d")},D.isoWeek=D.isoWeeks=function Pu(i){var u=Ut(this,1,4).week;return null==i?u:this.add(7*(i-u),"d")},D.weeksInYear=function Sf(){var i=this.localeData()._week;return lt(this.year(),i.dow,i.doy)},D.isoWeeksInYear=function Mf(){return lt(this.year(),1,4)},D.date=Ii,D.day=D.days=function Eu(i){if(!this.isValid())return null!=i?this:NaN;var u=this._isUTC?this._d.getUTCDay():this._d.getDay();return null!=i?(i=function Ou(i,u){return"string"!=typeof i?i:isNaN(i)?"number"==typeof(i=u.weekdaysParse(i))?i:null:parseInt(i,10)}(i,this.localeData()),this.add(i-u,"d")):u},D.weekday=function zu(i){if(!this.isValid())return null!=i?this:NaN;var u=(this.day()+7-this.localeData()._week.dow)%7;return null==i?u:this.add(i-u,"d")},D.isoWeekday=function Bu(i){if(!this.isValid())return null!=i?this:NaN;if(null!=i){var u=function Fu(i,u){return"string"==typeof i?u.weekdaysParse(i)%7||7:isNaN(i)?null:i}(i,this.localeData());return this.day(this.day()%7?u:u-7)}return this.day()||7},D.dayOfYear=function Cf(i){var u=Math.round((this.clone().startOf("day")-this.clone().startOf("year"))/864e5)+1;return null==i?u:this.add(i-u,"d")},D.hour=D.hours=Ju,D.minute=D.minutes=Pf,D.second=D.seconds=Of,D.millisecond=D.milliseconds=Af,D.utcOffset=function Od(i,u,h){var b,g=this._offset||0;if(!this.isValid())return null!=i?this:NaN;if(null!=i){if("string"==typeof i){if(null===(i=Aa(br,i)))return this}else Math.abs(i)<16&&!h&&(i*=60);return!this._isUTC&&u&&(b=La(this)),this._offset=i,this._isUTC=!0,null!=b&&this.add(b,"m"),g!==i&&(!u||this._changeInProgress?Si(this,Me(i-g,"m"),1,!1):this._changeInProgress||(this._changeInProgress=!0,a.updateOffset(this,!0),this._changeInProgress=null)),this}return this._isUTC?g:La(this)},D.utc=function Ad(i){return this.utcOffset(0,i)},D.local=function Id(i){return this._isUTC&&(this.utcOffset(0,i),this._isUTC=!1,i&&this.subtract(La(this),"m")),this},D.parseZone=function Ld(){if(null!=this._tzm)this.utcOffset(this._tzm,!1,!0);else if("string"==typeof this._i){var i=Aa(ru,this._i);null!=i?this.utcOffset(i):this.utcOffset(0,!0)}return this},D.hasAlignedHourOffset=function Rd(i){return!!this.isValid()&&(i=i?Z(i).utcOffset():0,(this.utcOffset()-i)%60==0)},D.isDST=function Wd(){return this.utcOffset()>this.clone().month(0).utcOffset()||this.utcOffset()>this.clone().month(5).utcOffset()},D.isLocal=function Yd(){return!!this.isValid()&&!this._isUTC},D.isUtcOffset=function Ed(){return!!this.isValid()&&this._isUTC},D.isUtc=wi,D.isUTC=wi,D.zoneAbbr=function If(){return this._isUTC?"UTC":""},D.zoneName=function Lf(){return this._isUTC?"Coordinated Universal Time":""},D.dates=U("dates accessor is deprecated. Use date instead.",Ii),D.months=U("months accessor is deprecated. Use month instead",li),D.years=U("years accessor is deprecated. Use year instead",ai),D.zone=U("moment().zone is deprecated, use moment().utcOffset instead. http://momentjs.com/guides/#/warnings/zone/",function Fd(i,u){return null!=i?("string"!=typeof i&&(i=-i),this.utcOffset(i,u),this):-this.utcOffset()}),D.isDSTShifted=U("isDSTShifted is deprecated. See http://momentjs.com/guides/#/warnings/dst-shifted/ for more information",function Nd(){if(!l(this._isDSTShifted))return this._isDSTShifted;var i={};if(A(i,this),(i=bi(i))._a){var u=i._isUTC?_(i._a):Z(i._a);this._isDSTShifted=this.isValid()&&J(i._a,u.toArray())>0}else this._isDSTShifted=!1;return this._isDSTShifted});var G=va.prototype;function Pr(i,u,h,g){var b=$e(),k=_().set(g,u);return b[h](k,i)}function Ri(i,u,h){if(f(i)&&(u=i,i=void 0),i=i||"",null!=u)return Pr(i,u,h,"month");var g,b=[];for(g=0;g<12;g++)b[g]=Pr(i,g,h,"month");return b}function Wa(i,u,h,g){"boolean"==typeof i?(f(u)&&(h=u,u=void 0),u=u||""):(h=u=i,i=!1,f(u)&&(h=u,u=void 0),u=u||"");var b=$e(),k=i?b._week.dow:0;if(null!=h)return Pr(u,(h+k)%7,g,"day");var S,R=[];for(S=0;S<7;S++)R[S]=Pr(u,(S+k)%7,g,"day");return R}G.calendar=function Bl(i,u,h){var g=this._calendar[i]||this._calendar.sameElse;return fe(g)?g.call(u,h):g},G.longDateFormat=function Vl(i){var u=this._longDateFormat[i],h=this._longDateFormat[i.toUpperCase()];return u||!h?u:(this._longDateFormat[i]=h.replace(/MMMM|MM|DD|dddd/g,function(g){return g.slice(1)}),this._longDateFormat[i])},G.invalidDate=function jl(){return this._invalidDate},G.ordinal=function ql(i){return this._ordinal.replace("%d",i)},G.preparse=Li,G.postformat=Li,G.relativeTime=function Xl(i,u,h,g){var b=this._relativeTime[h];return fe(b)?b(i,u,h,g):b.replace(/%d/i,i)},G.pastFuture=function Kl(i,u){var h=this._relativeTime[i>0?"future":"past"];return fe(h)?h(u):h.replace(/%s/i,u)},G.set=function ca(i){var u,h;for(h in i)fe(u=i[h])?this[h]=u:this["_"+h]=u;this._config=i,this._dayOfMonthOrdinalParseLenient=new RegExp((this._dayOfMonthOrdinalParse.source||this._ordinalParse.source)+"|"+/\d{1,2}/.source)},G.months=function vu(i,u){return i?o(this._months)?this._months[i.month()]:this._months[(this._months.isFormat||ii).test(u)?"format":"standalone"][i.month()]:o(this._months)?this._months:this._months.standalone},G.monthsShort=function gu(i,u){return i?o(this._monthsShort)?this._monthsShort[i.month()]:this._monthsShort[ii.test(u)?"format":"standalone"][i.month()]:o(this._monthsShort)?this._monthsShort:this._monthsShort.standalone},G.monthsParse=function pu(i,u,h){var g,b,k;if(this._monthsParseExact)return mu.call(this,i,u,h);for(this._monthsParse||(this._monthsParse=[],this._longMonthsParse=[],this._shortMonthsParse=[]),g=0;g<12;g++){if(b=_([2e3,g]),h&&!this._longMonthsParse[g]&&(this._longMonthsParse[g]=new RegExp("^"+this.months(b,"").replace(".","")+"$","i"),this._shortMonthsParse[g]=new RegExp("^"+this.monthsShort(b,"").replace(".","")+"$","i")),!h&&!this._monthsParse[g]&&(k="^"+this.months(b,"")+"|^"+this.monthsShort(b,""),this._monthsParse[g]=new RegExp(k.replace(".",""),"i")),h&&"MMMM"===u&&this._longMonthsParse[g].test(i))return g;if(h&&"MMM"===u&&this._shortMonthsParse[g].test(i))return g;if(!h&&this._monthsParse[g].test(i))return g}},G.monthsRegex=function wu(i){return this._monthsParseExact?(p(this,"_monthsRegex")||ui.call(this),i?this._monthsStrictRegex:this._monthsRegex):(p(this,"_monthsRegex")||(this._monthsRegex=xu),this._monthsStrictRegex&&i?this._monthsStrictRegex:this._monthsRegex)},G.monthsShortRegex=function _u(i){return this._monthsParseExact?(p(this,"_monthsRegex")||ui.call(this),i?this._monthsShortStrictRegex:this._monthsShortRegex):(p(this,"_monthsShortRegex")||(this._monthsShortRegex=yu),this._monthsShortStrictRegex&&i?this._monthsShortStrictRegex:this._monthsShortRegex)},G.week=function Mu(i){return Ut(i,this._week.dow,this._week.doy).week},G.firstDayOfYear=function Tu(){return this._week.doy},G.firstDayOfWeek=function Du(){return this._week.dow},G.weekdays=function Iu(i,u){var h=o(this._weekdays)?this._weekdays:this._weekdays[i&&!0!==i&&this._weekdays.isFormat.test(u)?"format":"standalone"];return!0===i?wa(h,this._week.dow):i?h[i.day()]:h},G.weekdaysMin=function Wu(i){return!0===i?wa(this._weekdaysMin,this._week.dow):i?this._weekdaysMin[i.day()]:this._weekdaysMin},G.weekdaysShort=function Lu(i){return!0===i?wa(this._weekdaysShort,this._week.dow):i?this._weekdaysShort[i.day()]:this._weekdaysShort},G.weekdaysParse=function Yu(i,u,h){var g,b,k;if(this._weekdaysParseExact)return Nu.call(this,i,u,h);for(this._weekdaysParse||(this._weekdaysParse=[],this._minWeekdaysParse=[],this._shortWeekdaysParse=[],this._fullWeekdaysParse=[]),g=0;g<7;g++){if(b=_([2e3,1]).day(g),h&&!this._fullWeekdaysParse[g]&&(this._fullWeekdaysParse[g]=new RegExp("^"+this.weekdays(b,"").replace(".","\\.?")+"$","i"),this._shortWeekdaysParse[g]=new RegExp("^"+this.weekdaysShort(b,"").replace(".","\\.?")+"$","i"),this._minWeekdaysParse[g]=new RegExp("^"+this.weekdaysMin(b,"").replace(".","\\.?")+"$","i")),this._weekdaysParse[g]||(k="^"+this.weekdays(b,"")+"|^"+this.weekdaysShort(b,"")+"|^"+this.weekdaysMin(b,""),this._weekdaysParse[g]=new RegExp(k.replace(".",""),"i")),h&&"dddd"===u&&this._fullWeekdaysParse[g].test(i))return g;if(h&&"ddd"===u&&this._shortWeekdaysParse[g].test(i))return g;if(h&&"dd"===u&&this._minWeekdaysParse[g].test(i))return g;if(!h&&this._weekdaysParse[g].test(i))return g}},G.weekdaysRegex=function Vu(i){return this._weekdaysParseExact?(p(this,"_weekdaysRegex")||ka.call(this),i?this._weekdaysStrictRegex:this._weekdaysRegex):(p(this,"_weekdaysRegex")||(this._weekdaysRegex=Hu),this._weekdaysStrictRegex&&i?this._weekdaysStrictRegex:this._weekdaysRegex)},G.weekdaysShortRegex=function ju(i){return this._weekdaysParseExact?(p(this,"_weekdaysRegex")||ka.call(this),i?this._weekdaysShortStrictRegex:this._weekdaysShortRegex):(p(this,"_weekdaysShortRegex")||(this._weekdaysShortRegex=Uu),this._weekdaysShortStrictRegex&&i?this._weekdaysShortStrictRegex:this._weekdaysShortRegex)},G.weekdaysMinRegex=function $u(i){return this._weekdaysParseExact?(p(this,"_weekdaysRegex")||ka.call(this),i?this._weekdaysMinStrictRegex:this._weekdaysMinRegex):(p(this,"_weekdaysMinRegex")||(this._weekdaysMinRegex=Gu),this._weekdaysMinStrictRegex&&i?this._weekdaysMinStrictRegex:this._weekdaysMinRegex)},G.isPM=function Zu(i){return"p"===(i+"").toLowerCase().charAt(0)},G.meridiem=function Ku(i,u,h){return i>11?h?"pm":"PM":h?"am":"AM"},_t("en",{dayOfMonthOrdinalParse:/\d{1,2}(th|st|nd|rd)/,ordinal:function(i){var u=i%10;return i+(1===O(i%100/10)?"th":1===u?"st":2===u?"nd":3===u?"rd":"th")}}),a.lang=U("moment.lang is deprecated. Use moment.locale instead.",_t),a.langData=U("moment.langData is deprecated. Use moment.localeData instead.",$e);var Be=Math.abs;function Wi(i,u,h,g){var b=Me(u,h);return i._milliseconds+=g*b._milliseconds,i._days+=g*b._days,i._months+=g*b._months,i._bubble()}function Ni(i){return i<0?Math.floor(i):Math.ceil(i)}function Yi(i){return 4800*i/146097}function Na(i){return 146097*i/4800}function He(i){return function(){return this.as(i)}}var qf=He("ms"),Zf=He("s"),Xf=He("m"),Kf=He("h"),Jf=He("d"),Qf=He("w"),eh=He("M"),th=He("Q"),rh=He("y");function dt(i){return function(){return this.isValid()?this._data[i]:NaN}}var ih=dt("milliseconds"),oh=dt("seconds"),sh=dt("minutes"),lh=dt("hours"),uh=dt("days"),dh=dt("months"),fh=dt("years");var Ze=Math.round,Oe={ss:44,s:45,m:45,h:22,d:26,M:11};function ch(i,u,h,g,b){return b.relativeTime(u||1,!!h,i,g)}var Ya=Math.abs;function Mt(i){return(i>0)-(i<0)||+i}function Or(){if(!this.isValid())return this.localeData().invalidDate();var g,b,i=Ya(this._milliseconds)/1e3,u=Ya(this._days),h=Ya(this._months);g=E(i/60),b=E(g/60),i%=60,g%=60;var S=E(h/12),R=h%=12,V=u,ee=b,ye=g,qt=i?i.toFixed(3).replace(/\.?0+$/,""):"",Zt=this.asSeconds();if(!Zt)return"P0D";var bh=Zt<0?"-":"",Ei=Mt(this._months)!==Mt(Zt)?"-":"",yh=Mt(this._days)!==Mt(Zt)?"-":"",Ea=Mt(this._milliseconds)!==Mt(Zt)?"-":"";return bh+"P"+(S?Ei+S+"Y":"")+(R?Ei+R+"M":"")+(V?yh+V+"D":"")+(ee||ye||qt?"T":"")+(ee?Ea+ee+"H":"")+(ye?Ea+ye+"M":"")+(qt?Ea+qt+"S":"")}var H=Sr.prototype;return H.isValid=function Td(){return this._isValid},H.abs=function Hf(){var i=this._data;return this._milliseconds=Be(this._milliseconds),this._days=Be(this._days),this._months=Be(this._months),i.milliseconds=Be(i.milliseconds),i.seconds=Be(i.seconds),i.minutes=Be(i.minutes),i.hours=Be(i.hours),i.months=Be(i.months),i.years=Be(i.years),this},H.add=function Vf(i,u){return Wi(this,i,u,1)},H.subtract=function Uf(i,u){return Wi(this,i,u,-1)},H.as=function Gf(i){if(!this.isValid())return NaN;var u,h,g=this._milliseconds;if("month"===(i=be(i))||"quarter"===i||"year"===i)switch(u=this._days+g/864e5,h=this._months+Yi(u),i){case"month":return h;case"quarter":return h/3;case"year":return h/12}else switch(u=this._days+Math.round(Na(this._months)),i){case"week":return u/7+g/6048e5;case"day":return u+g/864e5;case"hour":return 24*u+g/36e5;case"minute":return 1440*u+g/6e4;case"second":return 86400*u+g/1e3;case"millisecond":return Math.floor(864e5*u)+g;default:throw new Error("Unknown unit "+i)}},H.asMilliseconds=qf,H.asSeconds=Zf,H.asMinutes=Xf,H.asHours=Kf,H.asDays=Jf,H.asWeeks=Qf,H.asMonths=eh,H.asQuarters=th,H.asYears=rh,H.valueOf=function $f(){return this.isValid()?this._milliseconds+864e5*this._days+this._months%12*2592e6+31536e6*O(this._months/12):NaN},H._bubble=function jf(){var b,k,S,R,V,i=this._milliseconds,u=this._days,h=this._months,g=this._data;return i>=0&&u>=0&&h>=0||i<=0&&u<=0&&h<=0||(i+=864e5*Ni(Na(h)+u),u=0,h=0),g.milliseconds=i%1e3,b=E(i/1e3),g.seconds=b%60,k=E(b/60),g.minutes=k%60,S=E(k/60),g.hours=S%24,u+=E(S/24),h+=V=E(Yi(u)),u-=Ni(Na(V)),R=E(h/12),h%=12,g.days=u,g.months=h,g.years=R,this},H.clone=function ah(){return Me(this)},H.get=function nh(i){return i=be(i),this.isValid()?this[i+"s"]():NaN},H.milliseconds=ih,H.seconds=oh,H.minutes=sh,H.hours=lh,H.days=uh,H.weeks=function hh(){return E(this.days()/7)},H.months=dh,H.years=fh,H.humanize=function ph(i){if(!this.isValid())return this.localeData().invalidDate();var u=this.localeData(),h=function vh(i,u,h){var g=Me(i).abs(),b=Ze(g.as("s")),k=Ze(g.as("m")),S=Ze(g.as("h")),R=Ze(g.as("d")),V=Ze(g.as("M")),ee=Ze(g.as("y")),ye=b<=Oe.ss&&["s",b]||b<Oe.s&&["ss",b]||k<=1&&["m"]||k<Oe.m&&["mm",k]||S<=1&&["h"]||S<Oe.h&&["hh",S]||R<=1&&["d"]||R<Oe.d&&["dd",R]||V<=1&&["M"]||V<Oe.M&&["MM",V]||ee<=1&&["y"]||["yy",ee];return ye[2]=u,ye[3]=+i>0,ye[4]=h,ch.apply(null,ye)}(this,!i,u);return i&&(h=u.pastFuture(+this,h)),u.postformat(h)},H.toISOString=Or,H.toString=Or,H.toJSON=Or,H.locale=Di,H.localeData=Ci,H.toIsoString=U("toIsoString() is deprecated. Please use toISOString() instead (notice the capitals)",Or),H.lang=Ti,L("X",0,0,"unix"),L("x",0,0,"valueOf"),P("x",pr),P("X",/[+-]?\d+(\.\d{1,3})?/),q("X",function(i,u,h){h._d=new Date(1e3*parseFloat(i,10))}),q("x",function(i,u,h){h._d=new Date(O(i))}),a.version="2.24.0",function n(i){r=i}(Z),a.fn=D,a.min=function kd(){return _i("isBefore",[].slice.call(arguments,0))},a.max=function Md(){return _i("isAfter",[].slice.call(arguments,0))},a.now=function(){return Date.now?Date.now():+new Date},a.utc=_,a.unix=function Rf(i){return Z(1e3*i)},a.months=function Nf(i,u){return Ri(i,u,"months")},a.isDate=c,a.locale=_t,a.invalid=C,a.duration=Me,a.isMoment=Y,a.weekdays=function Ef(i,u,h){return Wa(i,u,h,"weekdays")},a.parseZone=function Wf(){return Z.apply(null,arguments).parseZone()},a.localeData=$e,a.isDuration=Oa,a.monthsShort=function Yf(i,u){return Ri(i,u,"monthsShort")},a.weekdaysMin=function Bf(i,u,h){return Wa(i,u,h,"weekdaysMin")},a.defineLocale=Sa,a.updateLocale=function ed(i,u){if(null!=u){var h,g,b=vi;null!=(g=kr(i))&&(b=g._config),(h=new va(u=Zn(b,u))).parentLocale=re[i],re[i]=h,_t(i)}else null!=re[i]&&(null!=re[i].parentLocale?re[i]=re[i].parentLocale:null!=re[i]&&delete re[i]);return re[i]},a.locales=function td(){return ga(re)},a.weekdaysShort=function zf(i,u,h){return Wa(i,u,h,"weekdaysShort")},a.normalizeUnits=be,a.relativeTimeRounding=function gh(i){return void 0===i?Ze:"function"==typeof i&&(Ze=i,!0)},a.relativeTimeThreshold=function mh(i,u){return void 0!==Oe[i]&&(void 0===u?Oe[i]:(Oe[i]=u,"s"===i&&(Oe.ss=u-1),!0))},a.calendarFormat=function jd(i,u){var h=i.diff(u,"days",!0);return h<-6?"sameElse":h<-1?"lastWeek":h<0?"lastDay":h<1?"sameDay":h<2?"nextDay":h<7?"nextWeek":"sameElse"},a.prototype=D,a.HTML5_FMT={DATETIME_LOCAL:"YYYY-MM-DDTHH:mm",DATETIME_LOCAL_SECONDS:"YYYY-MM-DDTHH:mm:ss",DATETIME_LOCAL_MS:"YYYY-MM-DDTHH:mm:ss.SSS",DATE:"YYYY-MM-DD",TIME:"HH:mm",TIME_SECONDS:"HH:mm:ss",TIME_MS:"HH:mm:ss.SSS",WEEK:"GGGG-[W]WW",MONTH:"YYYY-MM"},a}()}),kl={datetime:"MMM D, YYYY, h:mm:ss a",millisecond:"h:mm:ss.SSS a",second:"h:mm:ss a",minute:"h:mm a",hour:"hA",day:"MMM D",week:"ll",month:"MMM YYYY",quarter:"[Q]Q - YYYY",year:"YYYY"};ea._date.override("function"==typeof xe?{_id:"moment",formats:function(){return kl},parse:function(e,t){return"string"==typeof e&&"string"==typeof t?e=xe(e,t):e instanceof xe||(e=xe(e)),e.isValid()?e.valueOf():null},format:function(e,t){return xe(e).format(t)},add:function(e,t,r){return xe(e).add(t,r).valueOf()},diff:function(e,t,r){return xe(e).diff(xe(t),r)},startOf:function(e,t,r){return e=xe(e),"isoWeek"===t?e.isoWeekday(r).valueOf():e.startOf(t).valueOf()},endOf:function(e,t){return xe(e).endOf(t).valueOf()},_create:function(e){return xe(e)}}:{}),F._set("global",{plugins:{filler:{propagate:!0}}});var Ml={dataset:function(e){var t=e.fill,r=e.chart,a=r.getDatasetMeta(t),o=a&&r.isDatasetVisible(t)&&a.dataset._children||[],s=o.length||0;return s?function(d,l){return l<s&&o[l]._view||null}:null},boundary:function(e){var t=e.boundary,r=t?t.x:null,a=t?t.y:null;return m.isArray(t)?function(n,o){return t[o]}:function(n){return{x:null===r?n.x:r,y:null===a?n.y:a}}}};function Sl(e,t,r){var o,a=e._model||{},n=a.fill;if(void 0===n&&(n=!!a.backgroundColor),!1===n||null===n)return!1;if(!0===n)return"origin";if(o=parseFloat(n,10),isFinite(o)&&Math.floor(o)===o)return("-"===n[0]||"+"===n[0])&&(o=t+o),!(o===t||o<0||o>=r)&&o;switch(n){case"bottom":return"start";case"top":return"end";case"zero":return"origin";case"origin":case"start":case"end":return n;default:return!1}}function Cl(e){return(e.el._scale||{}).getPointPositionForValue?function Tl(e){var s,d,l,f,c,t=e.el._scale,r=t.options,a=t.chart.data.labels.length,n=e.fill,o=[];if(!a)return null;for(d=r.ticks.reverse?t.min:t.max,l=t.getPointPositionForValue(0,s=r.ticks.reverse?t.max:t.min),f=0;f<a;++f)c="start"===n||"end"===n?t.getPointPositionForValue(f,"start"===n?s:d):t.getBasePosition(f),r.gridLines.circular&&(c.cx=l.x,c.cy=l.y,c.angle=t.getIndexAngle(f)-Math.PI/2),o.push(c);return o}(e):function Dl(e){var o,t=e.el._model||{},r=e.el._scale||{},a=e.fill,n=null;if(isFinite(a))return null;if("start"===a?n=void 0===t.scaleBottom?r.bottom:t.scaleBottom:"end"===a?n=void 0===t.scaleTop?r.top:t.scaleTop:void 0!==t.scaleZero?n=t.scaleZero:r.getBasePixel&&(n=r.getBasePixel()),null!=n){if(void 0!==n.x&&void 0!==n.y)return n;if(m.isFinite(n))return{x:(o=r.isHorizontal())?n:null,y:o?null:n}}return null}(e)}function Pl(e,t,r){var s,n=e[t].fill,o=[t];if(!r)return n;for(;!1!==n&&-1===o.indexOf(n);){if(!isFinite(n))return n;if(!(s=e[n]))return!1;if(s.visible)return n;o.push(n),n=s.fill}return!1}function Ol(e){var t=e.fill,r="dataset";return!1===t?null:(isFinite(t)||(r="boundary"),Ml[r](e))}function Hn(e){return e&&!e.skip}function Vn(e,t,r,a,n){var o,s,d,l;if(a&&n){for(e.moveTo(t[0].x,t[0].y),o=1;o<a;++o)m.canvas.lineTo(e,t[o-1],t[o]);if(void 0!==r[0].angle){for(s=r[0].cx,d=r[0].cy,l=Math.sqrt(Math.pow(r[0].x-s,2)+Math.pow(r[0].y-d,2)),o=n-1;o>0;--o)e.arc(s,d,l,r[o].angle,r[o-1].angle,!0);return}for(e.lineTo(r[n-1].x,r[n-1].y),o=n-1;o>0;--o)m.canvas.lineTo(e,r[o],r[o-1],!0)}}function Fl(e,t,r,a,n,o){var p,y,_,w,x,M,T,C,s=t.length,d=a.spanGaps,l=[],f=[],c=0,v=0;for(e.beginPath(),p=0,y=s;p<y;++p)x=r(w=t[_=p%s]._view,_,a),M=Hn(w),T=Hn(x),o&&void 0===C&&M&&(y=s+(C=p+1)),M&&T?(c=l.push(w),v=f.push(x)):c&&v&&(d?(M&&l.push(w),T&&f.push(x)):(Vn(e,l,f,c,v),c=v=0,l=[],f=[]));Vn(e,l,f,c,v),e.closePath(),e.fillStyle=n,e.fill()}var Al={id:"filler",afterDatasetsUpdate:function(e,t){var o,s,d,l,r=(e.data.datasets||[]).length,a=t.propagate,n=[];for(s=0;s<r;++s)l=null,(d=(o=e.getDatasetMeta(s)).dataset)&&d._model&&d instanceof se.Line&&(l={visible:e.isDatasetVisible(s),fill:Sl(d,s,r),chart:e,el:d}),o.$filler=l,n.push(l);for(s=0;s<r;++s)(l=n[s])&&(l.fill=Pl(n,s,a),l.boundary=Cl(l),l.mapper=Ol(l))},beforeDatasetsDraw:function(e){var a,n,o,s,d,l,f,t=e._getSortedVisibleDatasetMetas(),r=e.ctx;for(n=t.length-1;n>=0;--n)(a=t[n].$filler)&&a.visible&&(d=(o=a.el)._children||[],f=(s=o._view).backgroundColor||F.global.defaultColor,(l=a.mapper)&&f&&d.length&&(m.canvas.clipArea(r,e.chartArea),Fl(r,d,l,s,f,o._loop),m.canvas.unclipArea(r)))}},Il=m.rtl.getRtlAdapter,Ue=m.noop,je=m.valueOrDefault;function ha(e,t){return e.usePointStyle&&e.boxWidth>t?t:e.boxWidth}F._set("global",{legend:{display:!0,position:"top",align:"center",fullWidth:!0,reverse:!1,weight:1e3,onClick:function(e,t){var r=t.datasetIndex,a=this.chart,n=a.getDatasetMeta(r);n.hidden=null===n.hidden?!a.data.datasets[r].hidden:null,a.update()},onHover:null,onLeave:null,labels:{boxWidth:40,padding:10,generateLabels:function(e){var t=e.data.datasets,r=e.options.legend||{},a=r.labels&&r.labels.usePointStyle;return e._getSortedDatasetMetas().map(function(n){var o=n.controller.getStyle(a?0:void 0);return{text:t[n.index].label,fillStyle:o.backgroundColor,hidden:!e.isDatasetVisible(n.index),lineCap:o.borderCapStyle,lineDash:o.borderDash,lineDashOffset:o.borderDashOffset,lineJoin:o.borderJoinStyle,lineWidth:o.borderWidth,strokeStyle:o.borderColor,pointStyle:o.pointStyle,rotation:o.rotation,datasetIndex:n.index}},this)}}},legendCallback:function(e){var a,n,o,t=document.createElement("ul"),r=e.data.datasets;for(t.setAttribute("class",e.id+"-legend"),a=0,n=r.length;a<n;a++)(o=t.appendChild(document.createElement("li"))).appendChild(document.createElement("span")).style.backgroundColor=r[a].backgroundColor,r[a].label&&o.appendChild(document.createTextNode(r[a].label));return t.outerHTML}});var Un=De.extend({initialize:function(e){var t=this;m.extend(t,e),t.legendHitBoxes=[],t._hoveredItem=null,t.doughnutMode=!1},beforeUpdate:Ue,update:function(e,t,r){var a=this;return a.beforeUpdate(),a.maxWidth=e,a.maxHeight=t,a.margins=r,a.beforeSetDimensions(),a.setDimensions(),a.afterSetDimensions(),a.beforeBuildLabels(),a.buildLabels(),a.afterBuildLabels(),a.beforeFit(),a.fit(),a.afterFit(),a.afterUpdate(),a.minSize},afterUpdate:Ue,beforeSetDimensions:Ue,setDimensions:function(){var e=this;e.isHorizontal()?(e.width=e.maxWidth,e.left=0,e.right=e.width):(e.height=e.maxHeight,e.top=0,e.bottom=e.height),e.paddingLeft=0,e.paddingTop=0,e.paddingRight=0,e.paddingBottom=0,e.minSize={width:0,height:0}},afterSetDimensions:Ue,beforeBuildLabels:Ue,buildLabels:function(){var e=this,t=e.options.labels||{},r=m.callback(t.generateLabels,[e.chart],e)||[];t.filter&&(r=r.filter(function(a){return t.filter(a,e.chart.data)})),e.options.reverse&&r.reverse(),e.legendItems=r},afterBuildLabels:Ue,beforeFit:Ue,fit:function(){var e=this,t=e.options,r=t.labels,a=t.display,n=e.ctx,o=m.options._parseFont(r),s=o.size,d=e.legendHitBoxes=[],l=e.minSize,f=e.isHorizontal();if(f?(l.width=e.maxWidth,l.height=a?10:0):(l.width=a?10:0,l.height=e.maxHeight),a){if(n.font=o.string,f){var c=e.lineWidths=[0],v=0;n.textAlign="left",n.textBaseline="middle",m.each(e.legendItems,function(T,C){var A=ha(r,s)+s/2+n.measureText(T.text).width;(0===C||c[c.length-1]+A+2*r.padding>l.width)&&(v+=s+r.padding,c[c.length-(C>0?0:1)]=0),d[C]={left:0,top:0,width:A,height:s},c[c.length-1]+=A+r.padding}),l.height+=v}else{var p=r.padding,y=e.columnWidths=[],_=e.columnHeights=[],w=r.padding,x=0,M=0;m.each(e.legendItems,function(T,C){var A=ha(r,s)+s/2+n.measureText(T.text).width;C>0&&M+s+2*p>l.height&&(w+=x+r.padding,y.push(x),_.push(M),x=0,M=0),x=Math.max(x,A),M+=s+p,d[C]={left:0,top:0,width:A,height:s}}),w+=x,y.push(x),_.push(M),l.width+=w}e.width=l.width,e.height=l.height}else e.width=l.width=e.height=l.height=0},afterFit:Ue,isHorizontal:function(){return"top"===this.options.position||"bottom"===this.options.position},draw:function(){var e=this,t=e.options,r=t.labels,a=F.global,n=a.defaultColor,o=a.elements.line,s=e.height,d=e.columnHeights,l=e.width,f=e.lineWidths;if(t.display){var w,c=Il(t.rtl,e.left,e.minSize.width),v=e.ctx,p=je(r.fontColor,a.defaultFontColor),y=m.options._parseFont(r),_=y.size;v.textAlign=c.textAlign("left"),v.textBaseline="middle",v.lineWidth=.5,v.strokeStyle=p,v.fillStyle=p,v.font=y.string;var x=ha(r,_),M=e.legendHitBoxes,I=function(N,Y){switch(t.align){case"start":return r.padding;case"end":return N-Y;default:return(N-Y+r.padding)/2}},A=e.isHorizontal();w=A?{x:e.left+I(l,f[0]),y:e.top+r.padding,line:0}:{x:e.left+r.padding,y:e.top+I(s,d[0]),line:0},m.rtl.overrideTextDirection(e.ctx,t.textDirection);var z=_+r.padding;m.each(e.legendItems,function(N,Y){var E=v.measureText(N.text).width,O=x+_/2+E,J=w.x,X=w.y;c.setWidth(e.minSize.width),A?Y>0&&J+O+r.padding>e.left+e.minSize.width&&(X=w.y+=z,w.line++,J=w.x=e.left+I(l,f[w.line])):Y>0&&X+z>e.top+e.minSize.height&&(J=w.x=J+e.columnWidths[w.line]+r.padding,w.line++,X=w.y=e.top+I(s,d[w.line]));var U=c.x(J);(function(N,Y,E){if(!(isNaN(x)||x<=0)){v.save();var O=je(E.lineWidth,o.borderWidth);if(v.fillStyle=je(E.fillStyle,n),v.lineCap=je(E.lineCap,o.borderCapStyle),v.lineDashOffset=je(E.lineDashOffset,o.borderDashOffset),v.lineJoin=je(E.lineJoin,o.borderJoinStyle),v.lineWidth=O,v.strokeStyle=je(E.strokeStyle,n),v.setLineDash&&v.setLineDash(je(E.lineDash,o.borderDash)),r&&r.usePointStyle){var J=x*Math.SQRT2/2,X=c.xPlus(N,x/2);m.canvas.drawPoint(v,E.pointStyle,J,X,Y+_/2,E.rotation)}else v.fillRect(c.leftForLtr(N,x),Y,x,_),0!==O&&v.strokeRect(c.leftForLtr(N,x),Y,x,_);v.restore()}})(U,X,N),M[Y].left=c.leftForLtr(U,M[Y].width),M[Y].top=X,function(N,Y,E,O){var J=_/2,X=c.xPlus(N,x+J),U=Y+J;v.fillText(E.text,X,U),E.hidden&&(v.beginPath(),v.lineWidth=2,v.moveTo(X,U),v.lineTo(c.xPlus(X,O),U),v.stroke())}(U,X,N,E),A?w.x+=O+r.padding:w.y+=z}),m.rtl.restoreTextDirection(e.ctx,t.textDirection)}},_getLegendItemAt:function(e,t){var a,n,o,r=this;if(e>=r.left&&e<=r.right&&t>=r.top&&t<=r.bottom)for(o=r.legendHitBoxes,a=0;a<o.length;++a)if(e>=(n=o[a]).left&&e<=n.left+n.width&&t>=n.top&&t<=n.top+n.height)return r.legendItems[a];return null},handleEvent:function(e){var n,t=this,r=t.options,a="mouseup"===e.type?"click":e.type;if("mousemove"===a){if(!r.onHover&&!r.onLeave)return}else{if("click"!==a)return;if(!r.onClick)return}n=t._getLegendItemAt(e.x,e.y),"click"===a?n&&r.onClick&&r.onClick.call(t,e.native,n):(r.onLeave&&n!==t._hoveredItem&&(t._hoveredItem&&r.onLeave.call(t,e.native,t._hoveredItem),t._hoveredItem=n),r.onHover&&n&&r.onHover.call(t,e.native,n))}});function jn(e,t){var r=new Un({ctx:e.ctx,options:t,chart:e});pe.configure(e,r,t),pe.addBox(e,r),e.legend=r}var Ll={id:"legend",_element:Un,beforeInit:function(e){var t=e.options.legend;t&&jn(e,t)},beforeUpdate:function(e){var t=e.options.legend,r=e.legend;t?(m.mergeIf(t,F.global.legend),r?(pe.configure(e,r,t),r.options=t):jn(e,t)):r&&(pe.removeBox(e,r),delete e.legend)},afterEvent:function(e,t){var r=e.legend;r&&r.handleEvent(t)}},Re=m.noop;F._set("global",{title:{display:!1,fontStyle:"bold",fullWidth:!0,padding:10,position:"top",text:"",weight:2e3}});var Gn=De.extend({initialize:function(e){m.extend(this,e),this.legendHitBoxes=[]},beforeUpdate:Re,update:function(e,t,r){var a=this;return a.beforeUpdate(),a.maxWidth=e,a.maxHeight=t,a.margins=r,a.beforeSetDimensions(),a.setDimensions(),a.afterSetDimensions(),a.beforeBuildLabels(),a.buildLabels(),a.afterBuildLabels(),a.beforeFit(),a.fit(),a.afterFit(),a.afterUpdate(),a.minSize},afterUpdate:Re,beforeSetDimensions:Re,setDimensions:function(){var e=this;e.isHorizontal()?(e.width=e.maxWidth,e.left=0,e.right=e.width):(e.height=e.maxHeight,e.top=0,e.bottom=e.height),e.paddingLeft=0,e.paddingTop=0,e.paddingRight=0,e.paddingBottom=0,e.minSize={width:0,height:0}},afterSetDimensions:Re,beforeBuildLabels:Re,buildLabels:Re,afterBuildLabels:Re,beforeFit:Re,fit:function(){var o,e=this,t=e.options,r=e.minSize={},a=e.isHorizontal();t.display?(o=(m.isArray(t.text)?t.text.length:1)*m.options._parseFont(t).lineHeight+2*t.padding,e.width=r.width=a?e.maxWidth:o,e.height=r.height=a?o:e.maxHeight):e.width=r.width=e.height=r.height=0},afterFit:Re,isHorizontal:function(){var e=this.options.position;return"top"===e||"bottom"===e},draw:function(){var e=this,t=e.ctx,r=e.options;if(r.display){var v,p,y,a=m.options._parseFont(r),n=a.lineHeight,o=n/2+r.padding,s=0,d=e.top,l=e.left,f=e.bottom,c=e.right;t.fillStyle=m.valueOrDefault(r.fontColor,F.global.defaultFontColor),t.font=a.string,e.isHorizontal()?(p=l+(c-l)/2,y=d+o,v=c-l):(p="left"===r.position?l+o:c-o,y=d+(f-d)/2,v=f-d,s=Math.PI*("left"===r.position?-.5:.5)),t.save(),t.translate(p,y),t.rotate(s),t.textAlign="center",t.textBaseline="middle";var _=r.text;if(m.isArray(_))for(var w=0,x=0;x<_.length;++x)t.fillText(_[x],0,w,v),w+=n;else t.fillText(_,0,0,v);t.restore()}}});function $n(e,t){var r=new Gn({ctx:e.ctx,options:t,chart:e});pe.configure(e,r,t),pe.addBox(e,r),e.titleBlock=r}var Rl={id:"title",_element:Gn,beforeInit:function(e){var t=e.options.title;t&&$n(e,t)},beforeUpdate:function(e){var t=e.options.title,r=e.titleBlock;t?(m.mergeIf(t,F.global.title),r?(pe.configure(e,r,t),r.options=t):$n(e,t)):r&&(pe.removeBox(e,r),delete e.titleBlock)}},Ge={},Wl=Al,Nl=Ll,Yl=Rl;for(var qn in Ge.filler=Wl,Ge.legend=Nl,Ge.title=Yl,W.helpers=m,function(){function e(a,n,o){var s;return"string"==typeof a?(s=parseInt(a,10),-1!==a.indexOf("%")&&(s=s/100*n.parentNode[o])):s=a,s}function t(a){return null!=a&&"none"!==a}function r(a,n,o){var s=document.defaultView,d=m._getParentNode(a),l=s.getComputedStyle(a)[n],f=s.getComputedStyle(d)[n],c=t(l),v=t(f),p=Number.POSITIVE_INFINITY;return c||v?Math.min(c?e(l,a,o):p,v?e(f,d,o):p):"none"}m.where=function(a,n){if(m.isArray(a)&&Array.prototype.filter)return a.filter(n);var o=[];return m.each(a,function(s){n(s)&&o.push(s)}),o},m.findIndex=Array.prototype.findIndex?function(a,n,o){return a.findIndex(n,o)}:function(a,n,o){o=void 0===o?a:o;for(var s=0,d=a.length;s<d;++s)if(n.call(o,a[s],s,a))return s;return-1},m.findNextWhere=function(a,n,o){m.isNullOrUndef(o)&&(o=-1);for(var s=o+1;s<a.length;s++){var d=a[s];if(n(d))return d}},m.findPreviousWhere=function(a,n,o){m.isNullOrUndef(o)&&(o=a.length);for(var s=o-1;s>=0;s--){var d=a[s];if(n(d))return d}},m.isNumber=function(a){return!isNaN(parseFloat(a))&&isFinite(a)},m.almostEquals=function(a,n,o){return Math.abs(a-n)<o},m.almostWhole=function(a,n){var o=Math.round(a);return o-n<=a&&o+n>=a},m.max=function(a){return a.reduce(function(n,o){return isNaN(o)?n:Math.max(n,o)},Number.NEGATIVE_INFINITY)},m.min=function(a){return a.reduce(function(n,o){return isNaN(o)?n:Math.min(n,o)},Number.POSITIVE_INFINITY)},m.sign=Math.sign?function(a){return Math.sign(a)}:function(a){return 0==(a=+a)||isNaN(a)?a:a>0?1:-1},m.toRadians=function(a){return a*(Math.PI/180)},m.toDegrees=function(a){return a*(180/Math.PI)},m._decimalPlaces=function(a){if(m.isFinite(a)){for(var n=1,o=0;Math.round(a*n)/n!==a;)n*=10,o++;return o}},m.getAngleFromPoint=function(a,n){var o=n.x-a.x,s=n.y-a.y,d=Math.sqrt(o*o+s*s),l=Math.atan2(s,o);return l<-.5*Math.PI&&(l+=2*Math.PI),{angle:l,distance:d}},m.distanceBetweenPoints=function(a,n){return Math.sqrt(Math.pow(n.x-a.x,2)+Math.pow(n.y-a.y,2))},m.aliasPixel=function(a){return a%2==0?0:.5},m._alignPixel=function(a,n,o){var s=a.currentDevicePixelRatio,d=o/2;return Math.round((n-d)*s)/s+d},m.splineCurve=function(a,n,o,s){var d=a.skip?n:a,l=n,f=o.skip?n:o,c=Math.sqrt(Math.pow(l.x-d.x,2)+Math.pow(l.y-d.y,2)),v=Math.sqrt(Math.pow(f.x-l.x,2)+Math.pow(f.y-l.y,2)),p=c/(c+v),y=v/(c+v),_=s*(p=isNaN(p)?0:p),w=s*(y=isNaN(y)?0:y);return{previous:{x:l.x-_*(f.x-d.x),y:l.y-_*(f.y-d.y)},next:{x:l.x+w*(f.x-d.x),y:l.y+w*(f.y-d.y)}}},m.EPSILON=Number.EPSILON||1e-14,m.splineCurveMonotone=function(a){var s,d,l,f,v,p,y,_,w,n=(a||[]).map(function(x){return{model:x._model,deltaK:0,mK:0}}),o=n.length;for(s=0;s<o;++s)if(!(l=n[s]).model.skip){if(d=s>0?n[s-1]:null,(f=s<o-1?n[s+1]:null)&&!f.model.skip){var c=f.model.x-l.model.x;l.deltaK=0!==c?(f.model.y-l.model.y)/c:0}l.mK=!d||d.model.skip?l.deltaK:!f||f.model.skip?d.deltaK:this.sign(d.deltaK)!==this.sign(l.deltaK)?0:(d.deltaK+l.deltaK)/2}for(s=0;s<o-1;++s)if(f=n[s+1],!(l=n[s]).model.skip&&!f.model.skip){if(m.almostEquals(l.deltaK,0,this.EPSILON)){l.mK=f.mK=0;continue}v=l.mK/l.deltaK,p=f.mK/l.deltaK,!((_=Math.pow(v,2)+Math.pow(p,2))<=9)&&(y=3/Math.sqrt(_),l.mK=v*y*l.deltaK,f.mK=p*y*l.deltaK)}for(s=0;s<o;++s)!(l=n[s]).model.skip&&(f=s<o-1?n[s+1]:null,(d=s>0?n[s-1]:null)&&!d.model.skip&&(l.model.controlPointPreviousX=l.model.x-(w=(l.model.x-d.model.x)/3),l.model.controlPointPreviousY=l.model.y-w*l.mK),f&&!f.model.skip&&(l.model.controlPointNextX=l.model.x+(w=(f.model.x-l.model.x)/3),l.model.controlPointNextY=l.model.y+w*l.mK))},m.nextItem=function(a,n,o){return o?n>=a.length-1?a[0]:a[n+1]:n>=a.length-1?a[a.length-1]:a[n+1]},m.previousItem=function(a,n,o){return o?n<=0?a[a.length-1]:a[n-1]:n<=0?a[0]:a[n-1]},m.niceNum=function(a,n){var o=Math.floor(m.log10(a)),s=a/Math.pow(10,o);return(n?s<1.5?1:s<3?2:s<7?5:10:s<=1?1:s<=2?2:s<=5?5:10)*Math.pow(10,o)},m.requestAnimFrame="undefined"==typeof window?function(a){a()}:window.requestAnimationFrame||window.webkitRequestAnimationFrame||window.mozRequestAnimationFrame||window.oRequestAnimationFrame||window.msRequestAnimationFrame||function(a){return window.setTimeout(a,1e3/60)},m.getRelativePosition=function(a,n){var o,s,d=a.originalEvent||a,l=a.target||a.srcElement,f=l.getBoundingClientRect(),c=d.touches;c&&c.length>0?(o=c[0].clientX,s=c[0].clientY):(o=d.clientX,s=d.clientY);var v=parseFloat(m.getStyle(l,"padding-left")),p=parseFloat(m.getStyle(l,"padding-top")),y=parseFloat(m.getStyle(l,"padding-right")),_=parseFloat(m.getStyle(l,"padding-bottom")),x=f.bottom-f.top-p-_;return{x:o=Math.round((o-f.left-v)/(f.right-f.left-v-y)*l.width/n.currentDevicePixelRatio),y:s=Math.round((s-f.top-p)/x*l.height/n.currentDevicePixelRatio)}},m.getConstraintWidth=function(a){return r(a,"max-width","clientWidth")},m.getConstraintHeight=function(a){return r(a,"max-height","clientHeight")},m._calculatePadding=function(a,n,o){return(n=m.getStyle(a,n)).indexOf("%")>-1?o*parseInt(n,10)/100:parseInt(n,10)},m._getParentNode=function(a){var n=a.parentNode;return n&&"[object ShadowRoot]"===n.toString()&&(n=n.host),n},m.getMaximumWidth=function(a){var n=m._getParentNode(a);if(!n)return a.clientWidth;var o=n.clientWidth,l=o-m._calculatePadding(n,"padding-left",o)-m._calculatePadding(n,"padding-right",o),f=m.getConstraintWidth(a);return isNaN(f)?l:Math.min(l,f)},m.getMaximumHeight=function(a){var n=m._getParentNode(a);if(!n)return a.clientHeight;var o=n.clientHeight,l=o-m._calculatePadding(n,"padding-top",o)-m._calculatePadding(n,"padding-bottom",o),f=m.getConstraintHeight(a);return isNaN(f)?l:Math.min(l,f)},m.getStyle=function(a,n){return a.currentStyle?a.currentStyle[n]:document.defaultView.getComputedStyle(a,null).getPropertyValue(n)},m.retinaScale=function(a,n){var o=a.currentDevicePixelRatio=n||"undefined"!=typeof window&&window.devicePixelRatio||1;if(1!==o){var s=a.canvas,d=a.height,l=a.width;s.height=d*o,s.width=l*o,a.ctx.scale(o,o),!s.style.height&&!s.style.width&&(s.style.height=d+"px",s.style.width=l+"px")}},m.fontString=function(a,n,o){return n+" "+a+"px "+o},m.longestText=function(a,n,o,s){var d=(s=s||{}).data=s.data||{},l=s.garbageCollect=s.garbageCollect||[];s.font!==n&&(d=s.data={},l=s.garbageCollect=[],s.font=n),a.font=n;var v,p,y,_,w,f=0,c=o.length;for(v=0;v<c;v++)if(null!=(_=o[v])&&!0!==m.isArray(_))f=m.measureText(a,d,l,f,_);else if(m.isArray(_))for(p=0,y=_.length;p<y;p++)null!=(w=_[p])&&!m.isArray(w)&&(f=m.measureText(a,d,l,f,w));var x=l.length/2;if(x>o.length){for(v=0;v<x;v++)delete d[l[v]];l.splice(0,x)}return f},m.measureText=function(a,n,o,s,d){var l=n[d];return l||(l=n[d]=a.measureText(d).width,o.push(d)),l>s&&(s=l),s},m.numberOfLabelLines=function(a){var n=1;return m.each(a,function(o){m.isArray(o)&&o.length>n&&(n=o.length)}),n},m.color=Kt?function(a){return a instanceof CanvasGradient&&(a=F.global.defaultColor),Kt(a)}:function(a){return console.error("Color.js not found!"),a},m.getHoverColor=function(a){return a instanceof CanvasPattern||a instanceof CanvasGradient?a:m.color(a).saturate(.5).darken(.1).rgbString()}}(),W._adapters=ea,W.Animation=Wr,W.animationService=Nr,W.controllers=hn,W.DatasetController=me,W.defaults=F,W.Element=De,W.elements=se,W.Interaction=vt,W.layouts=pe,W.platform=gt,W.plugins=j,W.Scale=le,W.scaleService=Rt,W.Ticks=Wt,W.Tooltip=Kr,W.helpers.each(wl,function(e,t){W.scaleService.registerScaleType(t,e,e._defaults)}),Ge)Ge.hasOwnProperty(qn)&&W.plugins.register(Ge[qn]);W.platform.initialize();var El=W;return"undefined"!=typeof window&&(window.Chart=W),W.Chart=W,W.Legend=Ge.legend._element,W.Title=Ge.title._element,W.pluginService=W.plugins,W.PluginBase=W.Element.extend({}),W.canvasHelpers=W.helpers.canvas,W.layoutService=W.layouts,W.LinearScaleBase=sr,W.helpers.each(["Bar","Bubble","Doughnut","Line","PolarArea","Radar","Scatter"],function(e){W[e]=function(t,r){return new W(t,W.helpers.merge(r||{},{type:e.charAt(0).toLowerCase()+e.slice(1)}))}}),El});
\ No newline at end of file
diff --git a/ceph/src/pybind/mgr/dashboard/frontend/dist/en-US/styles.8b6796664b673424.css b/ceph/src/pybind/mgr/dashboard/frontend/dist/en-US/styles.8b6796664b673424.css
new file mode 100644 (file)
index 0000000..585ae6a
--- /dev/null
@@ -0,0 +1,17 @@
+.swagger-ui{color:#3b4151;font-family:sans-serif}.swagger-ui html{-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%;line-height:1.15}.swagger-ui body{margin:0}.swagger-ui article,.swagger-ui aside,.swagger-ui footer,.swagger-ui header,.swagger-ui nav,.swagger-ui section{display:block}.swagger-ui h1{font-size:2em;margin:.67em 0}.swagger-ui figcaption,.swagger-ui figure,.swagger-ui main{display:block}.swagger-ui figure{margin:1em 40px}.swagger-ui hr{box-sizing:content-box;height:0;overflow:visible}.swagger-ui pre{font-family:monospace,monospace;font-size:1em}.swagger-ui a{-webkit-text-decoration-skip:objects;background-color:transparent}.swagger-ui abbr[title]{border-bottom:none;text-decoration:underline;text-decoration:underline dotted}.swagger-ui b,.swagger-ui strong{font-weight:inherit;font-weight:bolder}.swagger-ui code,.swagger-ui kbd,.swagger-ui samp{font-family:monospace,monospace;font-size:1em}.swagger-ui dfn{font-style:italic}.swagger-ui mark{background-color:#ff0;color:#000}.swagger-ui small{font-size:80%}.swagger-ui sub,.swagger-ui sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}.swagger-ui sub{bottom:-.25em}.swagger-ui sup{top:-.5em}.swagger-ui audio,.swagger-ui video{display:inline-block}.swagger-ui audio:not([controls]){display:none;height:0}.swagger-ui img{border-style:none}.swagger-ui svg:not(:root){overflow:hidden}.swagger-ui button,.swagger-ui input,.swagger-ui optgroup,.swagger-ui select,.swagger-ui textarea{font-family:sans-serif;font-size:100%;line-height:1.15;margin:0}.swagger-ui button,.swagger-ui input{overflow:visible}.swagger-ui button,.swagger-ui select{text-transform:none}.swagger-ui [type=reset],.swagger-ui [type=submit],.swagger-ui button,.swagger-ui html [type=button]{-webkit-appearance:button}.swagger-ui [type=button]::-moz-focus-inner,.swagger-ui [type=reset]::-moz-focus-inner,.swagger-ui [type=submit]::-moz-focus-inner,.swagger-ui button::-moz-focus-inner{border-style:none;padding:0}.swagger-ui [type=button]:-moz-focusring,.swagger-ui [type=reset]:-moz-focusring,.swagger-ui [type=submit]:-moz-focusring,.swagger-ui button:-moz-focusring{outline:1px dotted ButtonText}.swagger-ui fieldset{padding:.35em .75em .625em}.swagger-ui legend{box-sizing:border-box;color:inherit;display:table;max-width:100%;padding:0;white-space:normal}.swagger-ui progress{display:inline-block;vertical-align:baseline}.swagger-ui textarea{overflow:auto}.swagger-ui [type=checkbox],.swagger-ui [type=radio]{box-sizing:border-box;padding:0}.swagger-ui [type=number]::-webkit-inner-spin-button,.swagger-ui [type=number]::-webkit-outer-spin-button{height:auto}.swagger-ui [type=search]{-webkit-appearance:textfield;outline-offset:-2px}.swagger-ui [type=search]::-webkit-search-cancel-button,.swagger-ui [type=search]::-webkit-search-decoration{-webkit-appearance:none}.swagger-ui ::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}.swagger-ui details,.swagger-ui menu{display:block}.swagger-ui summary{display:list-item}.swagger-ui canvas{display:inline-block}.swagger-ui [hidden],.swagger-ui template{display:none}.swagger-ui .debug *{outline:1px solid gold}.swagger-ui .debug-white *{outline:1px solid #fff}.swagger-ui .debug-black *{outline:1px solid #000}.swagger-ui .debug-grid{background:transparent url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAYAAADED76LAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyhpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuNi1jMTExIDc5LjE1ODMyNSwgMjAxNS8wOS8xMC0wMToxMDoyMCAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wTU09Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9tbS8iIHhtbG5zOnN0UmVmPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvc1R5cGUvUmVzb3VyY2VSZWYjIiB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6MTRDOTY4N0U2N0VFMTFFNjg2MzZDQjkwNkQ4MjgwMEIiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6MTRDOTY4N0Q2N0VFMTFFNjg2MzZDQjkwNkQ4MjgwMEIiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENDIDIwMTUgKE1hY2ludG9zaCkiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDo3NjcyQkQ3NjY3QzUxMUU2QjJCQ0UyNDA4MTAwMjE3MSIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDo3NjcyQkQ3NzY3QzUxMUU2QjJCQ0UyNDA4MTAwMjE3MSIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/PsBS+GMAAAAjSURBVHjaYvz//z8DLsD4gcGXiYEAGBIKGBne//fFpwAgwAB98AaF2pjlUQAAAABJRU5ErkJggg==) repeat 0 0}.swagger-ui .debug-grid-16{background:transparent url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyhpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuNi1jMTExIDc5LjE1ODMyNSwgMjAxNS8wOS8xMC0wMToxMDoyMCAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wTU09Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9tbS8iIHhtbG5zOnN0UmVmPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvc1R5cGUvUmVzb3VyY2VSZWYjIiB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6ODYyRjhERDU2N0YyMTFFNjg2MzZDQjkwNkQ4MjgwMEIiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6ODYyRjhERDQ2N0YyMTFFNjg2MzZDQjkwNkQ4MjgwMEIiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENDIDIwMTUgKE1hY2ludG9zaCkiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDo3NjcyQkQ3QTY3QzUxMUU2QjJCQ0UyNDA4MTAwMjE3MSIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDo3NjcyQkQ3QjY3QzUxMUU2QjJCQ0UyNDA4MTAwMjE3MSIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/PvCS01IAAABMSURBVHjaYmR4/5+BFPBfAMFm/MBgx8RAGWCn1AAmSg34Q6kBDKMGMDCwICeMIemF/5QawEipAWwUhwEjMDvbAWlWkvVBwu8vQIABAEwBCph8U6c0AAAAAElFTkSuQmCC) repeat 0 0}.swagger-ui .debug-grid-8-solid{background:#fff url(data:image/jpeg;base64,/9j/4QAYRXhpZgAASUkqAAgAAAAAAAAAAAAAAP/sABFEdWNreQABAAQAAAAAAAD/4QMxaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wLwA8P3hwYWNrZXQgYmVnaW49Iu+7vyIgaWQ9Ilc1TTBNcENlaGlIenJlU3pOVGN6a2M5ZCI/PiA8eDp4bXBtZXRhIHhtbG5zOng9ImFkb2JlOm5zOm1ldGEvIiB4OnhtcHRrPSJBZG9iZSBYTVAgQ29yZSA1LjYtYzExMSA3OS4xNTgzMjUsIDIwMTUvMDkvMTAtMDE6MTA6MjAgICAgICAgICI+IDxyZGY6UkRGIHhtbG5zOnJkZj0iaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zIyI+IDxyZGY6RGVzY3JpcHRpb24gcmRmOmFib3V0PSIiIHhtbG5zOnhtcD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wLyIgeG1sbnM6eG1wTU09Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9tbS8iIHhtbG5zOnN0UmVmPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvc1R5cGUvUmVzb3VyY2VSZWYjIiB4bXA6Q3JlYXRvclRvb2w9IkFkb2JlIFBob3Rvc2hvcCBDQyAyMDE1IChNYWNpbnRvc2gpIiB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOkIxMjI0OTczNjdCMzExRTZCMkJDRTI0MDgxMDAyMTcxIiB4bXBNTTpEb2N1bWVudElEPSJ4bXAuZGlkOkIxMjI0OTc0NjdCMzExRTZCMkJDRTI0MDgxMDAyMTcxIj4gPHhtcE1NOkRlcml2ZWRGcm9tIHN0UmVmOmluc3RhbmNlSUQ9InhtcC5paWQ6QjEyMjQ5NzE2N0IzMTFFNkIyQkNFMjQwODEwMDIxNzEiIHN0UmVmOmRvY3VtZW50SUQ9InhtcC5kaWQ6QjEyMjQ5NzI2N0IzMTFFNkIyQkNFMjQwODEwMDIxNzEiLz4gPC9yZGY6RGVzY3JpcHRpb24+IDwvcmRmOlJERj4gPC94OnhtcG1ldGE+IDw/eHBhY2tldCBlbmQ9InIiPz7/7gAOQWRvYmUAZMAAAAAB/9sAhAAbGhopHSlBJiZBQi8vL0JHPz4+P0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHAR0pKTQmND8oKD9HPzU/R0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0f/wAARCAAIAAgDASIAAhEBAxEB/8QAWQABAQAAAAAAAAAAAAAAAAAAAAYBAQEAAAAAAAAAAAAAAAAAAAIEEAEBAAMBAAAAAAAAAAAAAAABADECA0ERAAEDBQAAAAAAAAAAAAAAAAARITFBUWESIv/aAAwDAQACEQMRAD8AoOnTV1QTD7JJshP3vSM3P//Z) repeat 0 0}.swagger-ui .debug-grid-16-solid{background:#fff url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAIAAACQkWg2AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyhpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuNi1jMTExIDc5LjE1ODMyNSwgMjAxNS8wOS8xMC0wMToxMDoyMCAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENDIDIwMTUgKE1hY2ludG9zaCkiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6NzY3MkJEN0U2N0M1MTFFNkIyQkNFMjQwODEwMDIxNzEiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6NzY3MkJEN0Y2N0M1MTFFNkIyQkNFMjQwODEwMDIxNzEiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDo3NjcyQkQ3QzY3QzUxMUU2QjJCQ0UyNDA4MTAwMjE3MSIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDo3NjcyQkQ3RDY3QzUxMUU2QjJCQ0UyNDA4MTAwMjE3MSIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/Pve6J3kAAAAzSURBVHjaYvz//z8D0UDsMwMjSRoYP5Gq4SPNbRjVMEQ1fCRDg+in/6+J1AJUxsgAEGAA31BAJMS0GYEAAAAASUVORK5CYII=) repeat 0 0}.swagger-ui .border-box,.swagger-ui a,.swagger-ui article,.swagger-ui body,.swagger-ui code,.swagger-ui dd,.swagger-ui div,.swagger-ui dl,.swagger-ui dt,.swagger-ui fieldset,.swagger-ui footer,.swagger-ui form,.swagger-ui h1,.swagger-ui h2,.swagger-ui h3,.swagger-ui h4,.swagger-ui h5,.swagger-ui h6,.swagger-ui header,.swagger-ui html,.swagger-ui input[type=email],.swagger-ui input[type=number],.swagger-ui input[type=password],.swagger-ui input[type=tel],.swagger-ui input[type=text],.swagger-ui input[type=url],.swagger-ui legend,.swagger-ui li,.swagger-ui main,.swagger-ui ol,.swagger-ui p,.swagger-ui pre,.swagger-ui section,.swagger-ui table,.swagger-ui td,.swagger-ui textarea,.swagger-ui th,.swagger-ui tr,.swagger-ui ul{box-sizing:border-box}.swagger-ui .aspect-ratio{height:0;position:relative}.swagger-ui .aspect-ratio--16x9{padding-bottom:56.25%}.swagger-ui .aspect-ratio--9x16{padding-bottom:177.77%}.swagger-ui .aspect-ratio--4x3{padding-bottom:75%}.swagger-ui .aspect-ratio--3x4{padding-bottom:133.33%}.swagger-ui .aspect-ratio--6x4{padding-bottom:66.6%}.swagger-ui .aspect-ratio--4x6{padding-bottom:150%}.swagger-ui .aspect-ratio--8x5{padding-bottom:62.5%}.swagger-ui .aspect-ratio--5x8{padding-bottom:160%}.swagger-ui .aspect-ratio--7x5{padding-bottom:71.42%}.swagger-ui .aspect-ratio--5x7{padding-bottom:140%}.swagger-ui .aspect-ratio--1x1{padding-bottom:100%}.swagger-ui .aspect-ratio--object{height:100%;inset:0;position:absolute;width:100%;z-index:100}@media screen and (min-width:30em){.swagger-ui .aspect-ratio-ns{height:0;position:relative}.swagger-ui .aspect-ratio--16x9-ns{padding-bottom:56.25%}.swagger-ui .aspect-ratio--9x16-ns{padding-bottom:177.77%}.swagger-ui .aspect-ratio--4x3-ns{padding-bottom:75%}.swagger-ui .aspect-ratio--3x4-ns{padding-bottom:133.33%}.swagger-ui .aspect-ratio--6x4-ns{padding-bottom:66.6%}.swagger-ui .aspect-ratio--4x6-ns{padding-bottom:150%}.swagger-ui .aspect-ratio--8x5-ns{padding-bottom:62.5%}.swagger-ui .aspect-ratio--5x8-ns{padding-bottom:160%}.swagger-ui .aspect-ratio--7x5-ns{padding-bottom:71.42%}.swagger-ui .aspect-ratio--5x7-ns{padding-bottom:140%}.swagger-ui .aspect-ratio--1x1-ns{padding-bottom:100%}.swagger-ui .aspect-ratio--object-ns{height:100%;inset:0;position:absolute;width:100%;z-index:100}}@media screen and (min-width:30em) and (max-width:60em){.swagger-ui .aspect-ratio-m{height:0;position:relative}.swagger-ui .aspect-ratio--16x9-m{padding-bottom:56.25%}.swagger-ui .aspect-ratio--9x16-m{padding-bottom:177.77%}.swagger-ui .aspect-ratio--4x3-m{padding-bottom:75%}.swagger-ui .aspect-ratio--3x4-m{padding-bottom:133.33%}.swagger-ui .aspect-ratio--6x4-m{padding-bottom:66.6%}.swagger-ui .aspect-ratio--4x6-m{padding-bottom:150%}.swagger-ui .aspect-ratio--8x5-m{padding-bottom:62.5%}.swagger-ui .aspect-ratio--5x8-m{padding-bottom:160%}.swagger-ui .aspect-ratio--7x5-m{padding-bottom:71.42%}.swagger-ui .aspect-ratio--5x7-m{padding-bottom:140%}.swagger-ui .aspect-ratio--1x1-m{padding-bottom:100%}.swagger-ui .aspect-ratio--object-m{height:100%;inset:0;position:absolute;width:100%;z-index:100}}@media screen and (min-width:60em){.swagger-ui .aspect-ratio-l{height:0;position:relative}.swagger-ui .aspect-ratio--16x9-l{padding-bottom:56.25%}.swagger-ui .aspect-ratio--9x16-l{padding-bottom:177.77%}.swagger-ui .aspect-ratio--4x3-l{padding-bottom:75%}.swagger-ui .aspect-ratio--3x4-l{padding-bottom:133.33%}.swagger-ui .aspect-ratio--6x4-l{padding-bottom:66.6%}.swagger-ui .aspect-ratio--4x6-l{padding-bottom:150%}.swagger-ui .aspect-ratio--8x5-l{padding-bottom:62.5%}.swagger-ui .aspect-ratio--5x8-l{padding-bottom:160%}.swagger-ui .aspect-ratio--7x5-l{padding-bottom:71.42%}.swagger-ui .aspect-ratio--5x7-l{padding-bottom:140%}.swagger-ui .aspect-ratio--1x1-l{padding-bottom:100%}.swagger-ui .aspect-ratio--object-l{height:100%;inset:0;position:absolute;width:100%;z-index:100}}.swagger-ui img{max-width:100%}.swagger-ui .cover{background-size:cover!important}.swagger-ui .contain{background-size:contain!important}@media screen and (min-width:30em){.swagger-ui .cover-ns{background-size:cover!important}.swagger-ui .contain-ns{background-size:contain!important}}@media screen and (min-width:30em) and (max-width:60em){.swagger-ui .cover-m{background-size:cover!important}.swagger-ui .contain-m{background-size:contain!important}}@media screen and (min-width:60em){.swagger-ui .cover-l{background-size:cover!important}.swagger-ui .contain-l{background-size:contain!important}}.swagger-ui .bg-center{background-position:50%;background-repeat:no-repeat}.swagger-ui .bg-top{background-position:top;background-repeat:no-repeat}.swagger-ui .bg-right{background-position:100%;background-repeat:no-repeat}.swagger-ui .bg-bottom{background-position:bottom;background-repeat:no-repeat}.swagger-ui .bg-left{background-position:0;background-repeat:no-repeat}@media screen and (min-width:30em){.swagger-ui .bg-center-ns{background-position:50%;background-repeat:no-repeat}.swagger-ui .bg-top-ns{background-position:top;background-repeat:no-repeat}.swagger-ui .bg-right-ns{background-position:100%;background-repeat:no-repeat}.swagger-ui .bg-bottom-ns{background-position:bottom;background-repeat:no-repeat}.swagger-ui .bg-left-ns{background-position:0;background-repeat:no-repeat}}@media screen and (min-width:30em) and (max-width:60em){.swagger-ui .bg-center-m{background-position:50%;background-repeat:no-repeat}.swagger-ui .bg-top-m{background-position:top;background-repeat:no-repeat}.swagger-ui .bg-right-m{background-position:100%;background-repeat:no-repeat}.swagger-ui .bg-bottom-m{background-position:bottom;background-repeat:no-repeat}.swagger-ui .bg-left-m{background-position:0;background-repeat:no-repeat}}@media screen and (min-width:60em){.swagger-ui .bg-center-l{background-position:50%;background-repeat:no-repeat}.swagger-ui .bg-top-l{background-position:top;background-repeat:no-repeat}.swagger-ui .bg-right-l{background-position:100%;background-repeat:no-repeat}.swagger-ui .bg-bottom-l{background-position:bottom;background-repeat:no-repeat}.swagger-ui .bg-left-l{background-position:0;background-repeat:no-repeat}}.swagger-ui .outline{outline:1px solid}.swagger-ui .outline-transparent{outline:1px solid transparent}.swagger-ui .outline-0{outline:0}@media screen and (min-width:30em){.swagger-ui .outline-ns{outline:1px solid}.swagger-ui .outline-transparent-ns{outline:1px solid transparent}.swagger-ui .outline-0-ns{outline:0}}@media screen and (min-width:30em) and (max-width:60em){.swagger-ui .outline-m{outline:1px solid}.swagger-ui .outline-transparent-m{outline:1px solid transparent}.swagger-ui .outline-0-m{outline:0}}@media screen and (min-width:60em){.swagger-ui .outline-l{outline:1px solid}.swagger-ui .outline-transparent-l{outline:1px solid transparent}.swagger-ui .outline-0-l{outline:0}}.swagger-ui .ba{border-style:solid;border-width:1px}.swagger-ui .bt{border-top-style:solid;border-top-width:1px}.swagger-ui .br{border-right-style:solid;border-right-width:1px}.swagger-ui .bb{border-bottom-style:solid;border-bottom-width:1px}.swagger-ui .bl{border-left-style:solid;border-left-width:1px}.swagger-ui .bn{border-style:none;border-width:0}@media screen and (min-width:30em){.swagger-ui .ba-ns{border-style:solid;border-width:1px}.swagger-ui .bt-ns{border-top-style:solid;border-top-width:1px}.swagger-ui .br-ns{border-right-style:solid;border-right-width:1px}.swagger-ui .bb-ns{border-bottom-style:solid;border-bottom-width:1px}.swagger-ui .bl-ns{border-left-style:solid;border-left-width:1px}.swagger-ui .bn-ns{border-style:none;border-width:0}}@media screen and (min-width:30em) and (max-width:60em){.swagger-ui .ba-m{border-style:solid;border-width:1px}.swagger-ui .bt-m{border-top-style:solid;border-top-width:1px}.swagger-ui .br-m{border-right-style:solid;border-right-width:1px}.swagger-ui .bb-m{border-bottom-style:solid;border-bottom-width:1px}.swagger-ui .bl-m{border-left-style:solid;border-left-width:1px}.swagger-ui .bn-m{border-style:none;border-width:0}}@media screen and (min-width:60em){.swagger-ui .ba-l{border-style:solid;border-width:1px}.swagger-ui .bt-l{border-top-style:solid;border-top-width:1px}.swagger-ui .br-l{border-right-style:solid;border-right-width:1px}.swagger-ui .bb-l{border-bottom-style:solid;border-bottom-width:1px}.swagger-ui .bl-l{border-left-style:solid;border-left-width:1px}.swagger-ui .bn-l{border-style:none;border-width:0}}.swagger-ui .b--black{border-color:#000}.swagger-ui .b--near-black{border-color:#111}.swagger-ui .b--dark-gray{border-color:#333}.swagger-ui .b--mid-gray{border-color:#555}.swagger-ui .b--gray{border-color:#777}.swagger-ui .b--silver{border-color:#999}.swagger-ui .b--light-silver{border-color:#aaa}.swagger-ui .b--moon-gray{border-color:#ccc}.swagger-ui .b--light-gray{border-color:#eee}.swagger-ui .b--near-white{border-color:#f4f4f4}.swagger-ui .b--white{border-color:#fff}.swagger-ui .b--white-90{border-color:#ffffffe6}.swagger-ui .b--white-80{border-color:#fffc}.swagger-ui .b--white-70{border-color:#ffffffb3}.swagger-ui .b--white-60{border-color:#fff9}.swagger-ui .b--white-50{border-color:#ffffff80}.swagger-ui .b--white-40{border-color:#fff6}.swagger-ui .b--white-30{border-color:#ffffff4d}.swagger-ui .b--white-20{border-color:#fff3}.swagger-ui .b--white-10{border-color:#ffffff1a}.swagger-ui .b--white-05{border-color:#ffffff0d}.swagger-ui .b--white-025{border-color:#ffffff06}.swagger-ui .b--white-0125{border-color:#ffffff03}.swagger-ui .b--black-90{border-color:#000000e6}.swagger-ui .b--black-80{border-color:#000c}.swagger-ui .b--black-70{border-color:#000000b3}.swagger-ui .b--black-60{border-color:#0009}.swagger-ui .b--black-50{border-color:#00000080}.swagger-ui .b--black-40{border-color:#0006}.swagger-ui .b--black-30{border-color:#0000004d}.swagger-ui .b--black-20{border-color:#0003}.swagger-ui .b--black-10{border-color:#0000001a}.swagger-ui .b--black-05{border-color:#0000000d}.swagger-ui .b--black-025{border-color:#00000006}.swagger-ui .b--black-0125{border-color:#00000003}.swagger-ui .b--dark-red{border-color:#e7040f}.swagger-ui .b--red{border-color:#ff4136}.swagger-ui .b--light-red{border-color:#ff725c}.swagger-ui .b--orange{border-color:#ff6300}.swagger-ui .b--gold{border-color:#ffb700}.swagger-ui .b--yellow{border-color:gold}.swagger-ui .b--light-yellow{border-color:#fbf1a9}.swagger-ui .b--purple{border-color:#5e2ca5}.swagger-ui .b--light-purple{border-color:#a463f2}.swagger-ui .b--dark-pink{border-color:#d5008f}.swagger-ui .b--hot-pink{border-color:#ff41b4}.swagger-ui .b--pink{border-color:#ff80cc}.swagger-ui .b--light-pink{border-color:#ffa3d7}.swagger-ui .b--dark-green{border-color:#137752}.swagger-ui .b--green{border-color:#19a974}.swagger-ui .b--light-green{border-color:#9eebcf}.swagger-ui .b--navy{border-color:#001b44}.swagger-ui .b--dark-blue{border-color:#00449e}.swagger-ui .b--blue{border-color:#357edd}.swagger-ui .b--light-blue{border-color:#96ccff}.swagger-ui .b--lightest-blue{border-color:#cdecff}.swagger-ui .b--washed-blue{border-color:#f6fffe}.swagger-ui .b--washed-green{border-color:#e8fdf5}.swagger-ui .b--washed-yellow{border-color:#fffceb}.swagger-ui .b--washed-red{border-color:#ffdfdf}.swagger-ui .b--transparent{border-color:transparent}.swagger-ui .b--inherit{border-color:inherit}.swagger-ui .br0{border-radius:0}.swagger-ui .br1{border-radius:.125rem}.swagger-ui .br2{border-radius:.25rem}.swagger-ui .br3{border-radius:.5rem}.swagger-ui .br4{border-radius:1rem}.swagger-ui .br-100{border-radius:100%}.swagger-ui .br-pill{border-radius:9999px}.swagger-ui .br--bottom{border-top-left-radius:0;border-top-right-radius:0}.swagger-ui .br--top{border-bottom-left-radius:0;border-bottom-right-radius:0}.swagger-ui .br--right{border-bottom-left-radius:0;border-top-left-radius:0}.swagger-ui .br--left{border-bottom-right-radius:0;border-top-right-radius:0}@media screen and (min-width:30em){.swagger-ui .br0-ns{border-radius:0}.swagger-ui .br1-ns{border-radius:.125rem}.swagger-ui .br2-ns{border-radius:.25rem}.swagger-ui .br3-ns{border-radius:.5rem}.swagger-ui .br4-ns{border-radius:1rem}.swagger-ui .br-100-ns{border-radius:100%}.swagger-ui .br-pill-ns{border-radius:9999px}.swagger-ui .br--bottom-ns{border-top-left-radius:0;border-top-right-radius:0}.swagger-ui .br--top-ns{border-bottom-left-radius:0;border-bottom-right-radius:0}.swagger-ui .br--right-ns{border-bottom-left-radius:0;border-top-left-radius:0}.swagger-ui .br--left-ns{border-bottom-right-radius:0;border-top-right-radius:0}}@media screen and (min-width:30em) and (max-width:60em){.swagger-ui .br0-m{border-radius:0}.swagger-ui .br1-m{border-radius:.125rem}.swagger-ui .br2-m{border-radius:.25rem}.swagger-ui .br3-m{border-radius:.5rem}.swagger-ui .br4-m{border-radius:1rem}.swagger-ui .br-100-m{border-radius:100%}.swagger-ui .br-pill-m{border-radius:9999px}.swagger-ui .br--bottom-m{border-top-left-radius:0;border-top-right-radius:0}.swagger-ui .br--top-m{border-bottom-left-radius:0;border-bottom-right-radius:0}.swagger-ui .br--right-m{border-bottom-left-radius:0;border-top-left-radius:0}.swagger-ui .br--left-m{border-bottom-right-radius:0;border-top-right-radius:0}}@media screen and (min-width:60em){.swagger-ui .br0-l{border-radius:0}.swagger-ui .br1-l{border-radius:.125rem}.swagger-ui .br2-l{border-radius:.25rem}.swagger-ui .br3-l{border-radius:.5rem}.swagger-ui .br4-l{border-radius:1rem}.swagger-ui .br-100-l{border-radius:100%}.swagger-ui .br-pill-l{border-radius:9999px}.swagger-ui .br--bottom-l{border-top-left-radius:0;border-top-right-radius:0}.swagger-ui .br--top-l{border-bottom-left-radius:0;border-bottom-right-radius:0}.swagger-ui .br--right-l{border-bottom-left-radius:0;border-top-left-radius:0}.swagger-ui .br--left-l{border-bottom-right-radius:0;border-top-right-radius:0}}.swagger-ui .b--dotted{border-style:dotted}.swagger-ui .b--dashed{border-style:dashed}.swagger-ui .b--solid{border-style:solid}.swagger-ui .b--none{border-style:none}@media screen and (min-width:30em){.swagger-ui .b--dotted-ns{border-style:dotted}.swagger-ui .b--dashed-ns{border-style:dashed}.swagger-ui .b--solid-ns{border-style:solid}.swagger-ui .b--none-ns{border-style:none}}@media screen and (min-width:30em) and (max-width:60em){.swagger-ui .b--dotted-m{border-style:dotted}.swagger-ui .b--dashed-m{border-style:dashed}.swagger-ui .b--solid-m{border-style:solid}.swagger-ui .b--none-m{border-style:none}}@media screen and (min-width:60em){.swagger-ui .b--dotted-l{border-style:dotted}.swagger-ui .b--dashed-l{border-style:dashed}.swagger-ui .b--solid-l{border-style:solid}.swagger-ui .b--none-l{border-style:none}}.swagger-ui .bw0{border-width:0}.swagger-ui .bw1{border-width:.125rem}.swagger-ui .bw2{border-width:.25rem}.swagger-ui .bw3{border-width:.5rem}.swagger-ui .bw4{border-width:1rem}.swagger-ui .bw5{border-width:2rem}.swagger-ui .bt-0{border-top-width:0}.swagger-ui .br-0{border-right-width:0}.swagger-ui .bb-0{border-bottom-width:0}.swagger-ui .bl-0{border-left-width:0}@media screen and (min-width:30em){.swagger-ui .bw0-ns{border-width:0}.swagger-ui .bw1-ns{border-width:.125rem}.swagger-ui .bw2-ns{border-width:.25rem}.swagger-ui .bw3-ns{border-width:.5rem}.swagger-ui .bw4-ns{border-width:1rem}.swagger-ui .bw5-ns{border-width:2rem}.swagger-ui .bt-0-ns{border-top-width:0}.swagger-ui .br-0-ns{border-right-width:0}.swagger-ui .bb-0-ns{border-bottom-width:0}.swagger-ui .bl-0-ns{border-left-width:0}}@media screen and (min-width:30em) and (max-width:60em){.swagger-ui .bw0-m{border-width:0}.swagger-ui .bw1-m{border-width:.125rem}.swagger-ui .bw2-m{border-width:.25rem}.swagger-ui .bw3-m{border-width:.5rem}.swagger-ui .bw4-m{border-width:1rem}.swagger-ui .bw5-m{border-width:2rem}.swagger-ui .bt-0-m{border-top-width:0}.swagger-ui .br-0-m{border-right-width:0}.swagger-ui .bb-0-m{border-bottom-width:0}.swagger-ui .bl-0-m{border-left-width:0}}@media screen and (min-width:60em){.swagger-ui .bw0-l{border-width:0}.swagger-ui .bw1-l{border-width:.125rem}.swagger-ui .bw2-l{border-width:.25rem}.swagger-ui .bw3-l{border-width:.5rem}.swagger-ui .bw4-l{border-width:1rem}.swagger-ui .bw5-l{border-width:2rem}.swagger-ui .bt-0-l{border-top-width:0}.swagger-ui .br-0-l{border-right-width:0}.swagger-ui .bb-0-l{border-bottom-width:0}.swagger-ui .bl-0-l{border-left-width:0}}.swagger-ui .shadow-1{box-shadow:0 0 4px 2px #0003}.swagger-ui .shadow-2{box-shadow:0 0 8px 2px #0003}.swagger-ui .shadow-3{box-shadow:2px 2px 4px 2px #0003}.swagger-ui .shadow-4{box-shadow:2px 2px 8px #0003}.swagger-ui .shadow-5{box-shadow:4px 4px 8px #0003}@media screen and (min-width:30em){.swagger-ui .shadow-1-ns{box-shadow:0 0 4px 2px #0003}.swagger-ui .shadow-2-ns{box-shadow:0 0 8px 2px #0003}.swagger-ui .shadow-3-ns{box-shadow:2px 2px 4px 2px #0003}.swagger-ui .shadow-4-ns{box-shadow:2px 2px 8px #0003}.swagger-ui .shadow-5-ns{box-shadow:4px 4px 8px #0003}}@media screen and (min-width:30em) and (max-width:60em){.swagger-ui .shadow-1-m{box-shadow:0 0 4px 2px #0003}.swagger-ui .shadow-2-m{box-shadow:0 0 8px 2px #0003}.swagger-ui .shadow-3-m{box-shadow:2px 2px 4px 2px #0003}.swagger-ui .shadow-4-m{box-shadow:2px 2px 8px #0003}.swagger-ui .shadow-5-m{box-shadow:4px 4px 8px #0003}}@media screen and (min-width:60em){.swagger-ui .shadow-1-l{box-shadow:0 0 4px 2px #0003}.swagger-ui .shadow-2-l{box-shadow:0 0 8px 2px #0003}.swagger-ui .shadow-3-l{box-shadow:2px 2px 4px 2px #0003}.swagger-ui .shadow-4-l{box-shadow:2px 2px 8px #0003}.swagger-ui .shadow-5-l{box-shadow:4px 4px 8px #0003}}.swagger-ui .pre{overflow-x:auto;overflow-y:hidden;overflow:scroll}.swagger-ui .top-0{top:0}.swagger-ui .right-0{right:0}.swagger-ui .bottom-0{bottom:0}.swagger-ui .left-0{left:0}.swagger-ui .top-1{top:1rem}.swagger-ui .right-1{right:1rem}.swagger-ui .bottom-1{bottom:1rem}.swagger-ui .left-1{left:1rem}.swagger-ui .top-2{top:2rem}.swagger-ui .right-2{right:2rem}.swagger-ui .bottom-2{bottom:2rem}.swagger-ui .left-2{left:2rem}.swagger-ui .top--1{top:-1rem}.swagger-ui .right--1{right:-1rem}.swagger-ui .bottom--1{bottom:-1rem}.swagger-ui .left--1{left:-1rem}.swagger-ui .top--2{top:-2rem}.swagger-ui .right--2{right:-2rem}.swagger-ui .bottom--2{bottom:-2rem}.swagger-ui .left--2{left:-2rem}.swagger-ui .absolute--fill{inset:0}@media screen and (min-width:30em){.swagger-ui .top-0-ns{top:0}.swagger-ui .left-0-ns{left:0}.swagger-ui .right-0-ns{right:0}.swagger-ui .bottom-0-ns{bottom:0}.swagger-ui .top-1-ns{top:1rem}.swagger-ui .left-1-ns{left:1rem}.swagger-ui .right-1-ns{right:1rem}.swagger-ui .bottom-1-ns{bottom:1rem}.swagger-ui .top-2-ns{top:2rem}.swagger-ui .left-2-ns{left:2rem}.swagger-ui .right-2-ns{right:2rem}.swagger-ui .bottom-2-ns{bottom:2rem}.swagger-ui .top--1-ns{top:-1rem}.swagger-ui .right--1-ns{right:-1rem}.swagger-ui .bottom--1-ns{bottom:-1rem}.swagger-ui .left--1-ns{left:-1rem}.swagger-ui .top--2-ns{top:-2rem}.swagger-ui .right--2-ns{right:-2rem}.swagger-ui .bottom--2-ns{bottom:-2rem}.swagger-ui .left--2-ns{left:-2rem}.swagger-ui .absolute--fill-ns{inset:0}}@media screen and (min-width:30em) and (max-width:60em){.swagger-ui .top-0-m{top:0}.swagger-ui .left-0-m{left:0}.swagger-ui .right-0-m{right:0}.swagger-ui .bottom-0-m{bottom:0}.swagger-ui .top-1-m{top:1rem}.swagger-ui .left-1-m{left:1rem}.swagger-ui .right-1-m{right:1rem}.swagger-ui .bottom-1-m{bottom:1rem}.swagger-ui .top-2-m{top:2rem}.swagger-ui .left-2-m{left:2rem}.swagger-ui .right-2-m{right:2rem}.swagger-ui .bottom-2-m{bottom:2rem}.swagger-ui .top--1-m{top:-1rem}.swagger-ui .right--1-m{right:-1rem}.swagger-ui .bottom--1-m{bottom:-1rem}.swagger-ui .left--1-m{left:-1rem}.swagger-ui .top--2-m{top:-2rem}.swagger-ui .right--2-m{right:-2rem}.swagger-ui .bottom--2-m{bottom:-2rem}.swagger-ui .left--2-m{left:-2rem}.swagger-ui .absolute--fill-m{inset:0}}@media screen and (min-width:60em){.swagger-ui .top-0-l{top:0}.swagger-ui .left-0-l{left:0}.swagger-ui .right-0-l{right:0}.swagger-ui .bottom-0-l{bottom:0}.swagger-ui .top-1-l{top:1rem}.swagger-ui .left-1-l{left:1rem}.swagger-ui .right-1-l{right:1rem}.swagger-ui .bottom-1-l{bottom:1rem}.swagger-ui .top-2-l{top:2rem}.swagger-ui .left-2-l{left:2rem}.swagger-ui .right-2-l{right:2rem}.swagger-ui .bottom-2-l{bottom:2rem}.swagger-ui .top--1-l{top:-1rem}.swagger-ui .right--1-l{right:-1rem}.swagger-ui .bottom--1-l{bottom:-1rem}.swagger-ui .left--1-l{left:-1rem}.swagger-ui .top--2-l{top:-2rem}.swagger-ui .right--2-l{right:-2rem}.swagger-ui .bottom--2-l{bottom:-2rem}.swagger-ui .left--2-l{left:-2rem}.swagger-ui .absolute--fill-l{inset:0}}.swagger-ui .cf:after,.swagger-ui .cf:before{content:" ";display:table}.swagger-ui .cf:after{clear:both}.swagger-ui .cf{*zoom:1}.swagger-ui .cl{clear:left}.swagger-ui .cr{clear:right}.swagger-ui .cb{clear:both}.swagger-ui .cn{clear:none}@media screen and (min-width:30em){.swagger-ui .cl-ns{clear:left}.swagger-ui .cr-ns{clear:right}.swagger-ui .cb-ns{clear:both}.swagger-ui .cn-ns{clear:none}}@media screen and (min-width:30em) and (max-width:60em){.swagger-ui .cl-m{clear:left}.swagger-ui .cr-m{clear:right}.swagger-ui .cb-m{clear:both}.swagger-ui .cn-m{clear:none}}@media screen and (min-width:60em){.swagger-ui .cl-l{clear:left}.swagger-ui .cr-l{clear:right}.swagger-ui .cb-l{clear:both}.swagger-ui .cn-l{clear:none}}.swagger-ui .flex{display:flex}.swagger-ui .inline-flex{display:inline-flex}.swagger-ui .flex-auto{flex:1 1 auto;min-height:0;min-width:0}.swagger-ui .flex-none{flex:none}.swagger-ui .flex-column{flex-direction:column}.swagger-ui .flex-row{flex-direction:row}.swagger-ui .flex-wrap{flex-wrap:wrap}.swagger-ui .flex-nowrap{flex-wrap:nowrap}.swagger-ui .flex-wrap-reverse{flex-wrap:wrap-reverse}.swagger-ui .flex-column-reverse{flex-direction:column-reverse}.swagger-ui .flex-row-reverse{flex-direction:row-reverse}.swagger-ui .items-start{align-items:flex-start}.swagger-ui .items-end{align-items:flex-end}.swagger-ui .items-center{align-items:center}.swagger-ui .items-baseline{align-items:baseline}.swagger-ui .items-stretch{align-items:stretch}.swagger-ui .self-start{align-self:flex-start}.swagger-ui .self-end{align-self:flex-end}.swagger-ui .self-center{align-self:center}.swagger-ui .self-baseline{align-self:baseline}.swagger-ui .self-stretch{align-self:stretch}.swagger-ui .justify-start{justify-content:flex-start}.swagger-ui .justify-end{justify-content:flex-end}.swagger-ui .justify-center{justify-content:center}.swagger-ui .justify-between{justify-content:space-between}.swagger-ui .justify-around{justify-content:space-around}.swagger-ui .content-start{align-content:flex-start}.swagger-ui .content-end{align-content:flex-end}.swagger-ui .content-center{align-content:center}.swagger-ui .content-between{align-content:space-between}.swagger-ui .content-around{align-content:space-around}.swagger-ui .content-stretch{align-content:stretch}.swagger-ui .order-0{order:0}.swagger-ui .order-1{order:1}.swagger-ui .order-2{order:2}.swagger-ui .order-3{order:3}.swagger-ui .order-4{order:4}.swagger-ui .order-5{order:5}.swagger-ui .order-6{order:6}.swagger-ui .order-7{order:7}.swagger-ui .order-8{order:8}.swagger-ui .order-last{order:99999}.swagger-ui .flex-grow-0{flex-grow:0}.swagger-ui .flex-grow-1{flex-grow:1}.swagger-ui .flex-shrink-0{flex-shrink:0}.swagger-ui .flex-shrink-1{flex-shrink:1}@media screen and (min-width:30em){.swagger-ui .flex-ns{display:flex}.swagger-ui .inline-flex-ns{display:inline-flex}.swagger-ui .flex-auto-ns{flex:1 1 auto;min-height:0;min-width:0}.swagger-ui .flex-none-ns{flex:none}.swagger-ui .flex-column-ns{flex-direction:column}.swagger-ui .flex-row-ns{flex-direction:row}.swagger-ui .flex-wrap-ns{flex-wrap:wrap}.swagger-ui .flex-nowrap-ns{flex-wrap:nowrap}.swagger-ui .flex-wrap-reverse-ns{flex-wrap:wrap-reverse}.swagger-ui .flex-column-reverse-ns{flex-direction:column-reverse}.swagger-ui .flex-row-reverse-ns{flex-direction:row-reverse}.swagger-ui .items-start-ns{align-items:flex-start}.swagger-ui .items-end-ns{align-items:flex-end}.swagger-ui .items-center-ns{align-items:center}.swagger-ui .items-baseline-ns{align-items:baseline}.swagger-ui .items-stretch-ns{align-items:stretch}.swagger-ui .self-start-ns{align-self:flex-start}.swagger-ui .self-end-ns{align-self:flex-end}.swagger-ui .self-center-ns{align-self:center}.swagger-ui .self-baseline-ns{align-self:baseline}.swagger-ui .self-stretch-ns{align-self:stretch}.swagger-ui .justify-start-ns{justify-content:flex-start}.swagger-ui .justify-end-ns{justify-content:flex-end}.swagger-ui .justify-center-ns{justify-content:center}.swagger-ui .justify-between-ns{justify-content:space-between}.swagger-ui .justify-around-ns{justify-content:space-around}.swagger-ui .content-start-ns{align-content:flex-start}.swagger-ui .content-end-ns{align-content:flex-end}.swagger-ui .content-center-ns{align-content:center}.swagger-ui .content-between-ns{align-content:space-between}.swagger-ui .content-around-ns{align-content:space-around}.swagger-ui .content-stretch-ns{align-content:stretch}.swagger-ui .order-0-ns{order:0}.swagger-ui .order-1-ns{order:1}.swagger-ui .order-2-ns{order:2}.swagger-ui .order-3-ns{order:3}.swagger-ui .order-4-ns{order:4}.swagger-ui .order-5-ns{order:5}.swagger-ui .order-6-ns{order:6}.swagger-ui .order-7-ns{order:7}.swagger-ui .order-8-ns{order:8}.swagger-ui .order-last-ns{order:99999}.swagger-ui .flex-grow-0-ns{flex-grow:0}.swagger-ui .flex-grow-1-ns{flex-grow:1}.swagger-ui .flex-shrink-0-ns{flex-shrink:0}.swagger-ui .flex-shrink-1-ns{flex-shrink:1}}@media screen and (min-width:30em) and (max-width:60em){.swagger-ui .flex-m{display:flex}.swagger-ui .inline-flex-m{display:inline-flex}.swagger-ui .flex-auto-m{flex:1 1 auto;min-height:0;min-width:0}.swagger-ui .flex-none-m{flex:none}.swagger-ui .flex-column-m{flex-direction:column}.swagger-ui .flex-row-m{flex-direction:row}.swagger-ui .flex-wrap-m{flex-wrap:wrap}.swagger-ui .flex-nowrap-m{flex-wrap:nowrap}.swagger-ui .flex-wrap-reverse-m{flex-wrap:wrap-reverse}.swagger-ui .flex-column-reverse-m{flex-direction:column-reverse}.swagger-ui .flex-row-reverse-m{flex-direction:row-reverse}.swagger-ui .items-start-m{align-items:flex-start}.swagger-ui .items-end-m{align-items:flex-end}.swagger-ui .items-center-m{align-items:center}.swagger-ui .items-baseline-m{align-items:baseline}.swagger-ui .items-stretch-m{align-items:stretch}.swagger-ui .self-start-m{align-self:flex-start}.swagger-ui .self-end-m{align-self:flex-end}.swagger-ui .self-center-m{align-self:center}.swagger-ui .self-baseline-m{align-self:baseline}.swagger-ui .self-stretch-m{align-self:stretch}.swagger-ui .justify-start-m{justify-content:flex-start}.swagger-ui .justify-end-m{justify-content:flex-end}.swagger-ui .justify-center-m{justify-content:center}.swagger-ui .justify-between-m{justify-content:space-between}.swagger-ui .justify-around-m{justify-content:space-around}.swagger-ui .content-start-m{align-content:flex-start}.swagger-ui .content-end-m{align-content:flex-end}.swagger-ui .content-center-m{align-content:center}.swagger-ui .content-between-m{align-content:space-between}.swagger-ui .content-around-m{align-content:space-around}.swagger-ui .content-stretch-m{align-content:stretch}.swagger-ui .order-0-m{order:0}.swagger-ui .order-1-m{order:1}.swagger-ui .order-2-m{order:2}.swagger-ui .order-3-m{order:3}.swagger-ui .order-4-m{order:4}.swagger-ui .order-5-m{order:5}.swagger-ui .order-6-m{order:6}.swagger-ui .order-7-m{order:7}.swagger-ui .order-8-m{order:8}.swagger-ui .order-last-m{order:99999}.swagger-ui .flex-grow-0-m{flex-grow:0}.swagger-ui .flex-grow-1-m{flex-grow:1}.swagger-ui .flex-shrink-0-m{flex-shrink:0}.swagger-ui .flex-shrink-1-m{flex-shrink:1}}@media screen and (min-width:60em){.swagger-ui .flex-l{display:flex}.swagger-ui .inline-flex-l{display:inline-flex}.swagger-ui .flex-auto-l{flex:1 1 auto;min-height:0;min-width:0}.swagger-ui .flex-none-l{flex:none}.swagger-ui .flex-column-l{flex-direction:column}.swagger-ui .flex-row-l{flex-direction:row}.swagger-ui .flex-wrap-l{flex-wrap:wrap}.swagger-ui .flex-nowrap-l{flex-wrap:nowrap}.swagger-ui .flex-wrap-reverse-l{flex-wrap:wrap-reverse}.swagger-ui .flex-column-reverse-l{flex-direction:column-reverse}.swagger-ui .flex-row-reverse-l{flex-direction:row-reverse}.swagger-ui .items-start-l{align-items:flex-start}.swagger-ui .items-end-l{align-items:flex-end}.swagger-ui .items-center-l{align-items:center}.swagger-ui .items-baseline-l{align-items:baseline}.swagger-ui .items-stretch-l{align-items:stretch}.swagger-ui .self-start-l{align-self:flex-start}.swagger-ui .self-end-l{align-self:flex-end}.swagger-ui .self-center-l{align-self:center}.swagger-ui .self-baseline-l{align-self:baseline}.swagger-ui .self-stretch-l{align-self:stretch}.swagger-ui .justify-start-l{justify-content:flex-start}.swagger-ui .justify-end-l{justify-content:flex-end}.swagger-ui .justify-center-l{justify-content:center}.swagger-ui .justify-between-l{justify-content:space-between}.swagger-ui .justify-around-l{justify-content:space-around}.swagger-ui .content-start-l{align-content:flex-start}.swagger-ui .content-end-l{align-content:flex-end}.swagger-ui .content-center-l{align-content:center}.swagger-ui .content-between-l{align-content:space-between}.swagger-ui .content-around-l{align-content:space-around}.swagger-ui .content-stretch-l{align-content:stretch}.swagger-ui .order-0-l{order:0}.swagger-ui .order-1-l{order:1}.swagger-ui .order-2-l{order:2}.swagger-ui .order-3-l{order:3}.swagger-ui .order-4-l{order:4}.swagger-ui .order-5-l{order:5}.swagger-ui .order-6-l{order:6}.swagger-ui .order-7-l{order:7}.swagger-ui .order-8-l{order:8}.swagger-ui .order-last-l{order:99999}.swagger-ui .flex-grow-0-l{flex-grow:0}.swagger-ui .flex-grow-1-l{flex-grow:1}.swagger-ui .flex-shrink-0-l{flex-shrink:0}.swagger-ui .flex-shrink-1-l{flex-shrink:1}}.swagger-ui .dn{display:none}.swagger-ui .di{display:inline}.swagger-ui .db{display:block}.swagger-ui .dib{display:inline-block}.swagger-ui .dit{display:inline-table}.swagger-ui .dt{display:table}.swagger-ui .dtc{display:table-cell}.swagger-ui .dt-row{display:table-row}.swagger-ui .dt-row-group{display:table-row-group}.swagger-ui .dt-column{display:table-column}.swagger-ui .dt-column-group{display:table-column-group}.swagger-ui .dt--fixed{table-layout:fixed;width:100%}@media screen and (min-width:30em){.swagger-ui .dn-ns{display:none}.swagger-ui .di-ns{display:inline}.swagger-ui .db-ns{display:block}.swagger-ui .dib-ns{display:inline-block}.swagger-ui .dit-ns{display:inline-table}.swagger-ui .dt-ns{display:table}.swagger-ui .dtc-ns{display:table-cell}.swagger-ui .dt-row-ns{display:table-row}.swagger-ui .dt-row-group-ns{display:table-row-group}.swagger-ui .dt-column-ns{display:table-column}.swagger-ui .dt-column-group-ns{display:table-column-group}.swagger-ui .dt--fixed-ns{table-layout:fixed;width:100%}}@media screen and (min-width:30em) and (max-width:60em){.swagger-ui .dn-m{display:none}.swagger-ui .di-m{display:inline}.swagger-ui .db-m{display:block}.swagger-ui .dib-m{display:inline-block}.swagger-ui .dit-m{display:inline-table}.swagger-ui .dt-m{display:table}.swagger-ui .dtc-m{display:table-cell}.swagger-ui .dt-row-m{display:table-row}.swagger-ui .dt-row-group-m{display:table-row-group}.swagger-ui .dt-column-m{display:table-column}.swagger-ui .dt-column-group-m{display:table-column-group}.swagger-ui .dt--fixed-m{table-layout:fixed;width:100%}}@media screen and (min-width:60em){.swagger-ui .dn-l{display:none}.swagger-ui .di-l{display:inline}.swagger-ui .db-l{display:block}.swagger-ui .dib-l{display:inline-block}.swagger-ui .dit-l{display:inline-table}.swagger-ui .dt-l{display:table}.swagger-ui .dtc-l{display:table-cell}.swagger-ui .dt-row-l{display:table-row}.swagger-ui .dt-row-group-l{display:table-row-group}.swagger-ui .dt-column-l{display:table-column}.swagger-ui .dt-column-group-l{display:table-column-group}.swagger-ui .dt--fixed-l{table-layout:fixed;width:100%}}.swagger-ui .fl{_display:inline;float:left}.swagger-ui .fr{_display:inline;float:right}.swagger-ui .fn{float:none}@media screen and (min-width:30em){.swagger-ui .fl-ns{_display:inline;float:left}.swagger-ui .fr-ns{_display:inline;float:right}.swagger-ui .fn-ns{float:none}}@media screen and (min-width:30em) and (max-width:60em){.swagger-ui .fl-m{_display:inline;float:left}.swagger-ui .fr-m{_display:inline;float:right}.swagger-ui .fn-m{float:none}}@media screen and (min-width:60em){.swagger-ui .fl-l{_display:inline;float:left}.swagger-ui .fr-l{_display:inline;float:right}.swagger-ui .fn-l{float:none}}.swagger-ui .sans-serif{font-family:-apple-system,BlinkMacSystemFont,avenir next,avenir,helvetica,helvetica neue,ubuntu,roboto,noto,segoe ui,arial,sans-serif}.swagger-ui .serif{font-family:georgia,serif}.swagger-ui .system-sans-serif{font-family:sans-serif}.swagger-ui .system-serif{font-family:serif}.swagger-ui .code,.swagger-ui code{font-family:Consolas,monaco,monospace}.swagger-ui .courier{font-family:Courier Next,courier,monospace}.swagger-ui .helvetica{font-family:helvetica neue,helvetica,sans-serif}.swagger-ui .avenir{font-family:avenir next,avenir,sans-serif}.swagger-ui .athelas{font-family:athelas,georgia,serif}.swagger-ui .georgia{font-family:georgia,serif}.swagger-ui .times{font-family:times,serif}.swagger-ui .bodoni{font-family:Bodoni MT,serif}.swagger-ui .calisto{font-family:Calisto MT,serif}.swagger-ui .garamond{font-family:garamond,serif}.swagger-ui .baskerville{font-family:baskerville,serif}.swagger-ui .i{font-style:italic}.swagger-ui .fs-normal{font-style:normal}@media screen and (min-width:30em){.swagger-ui .i-ns{font-style:italic}.swagger-ui .fs-normal-ns{font-style:normal}}@media screen and (min-width:30em) and (max-width:60em){.swagger-ui .i-m{font-style:italic}.swagger-ui .fs-normal-m{font-style:normal}}@media screen and (min-width:60em){.swagger-ui .i-l{font-style:italic}.swagger-ui .fs-normal-l{font-style:normal}}.swagger-ui .normal{font-weight:400}.swagger-ui .b{font-weight:700}.swagger-ui .fw1{font-weight:100}.swagger-ui .fw2{font-weight:200}.swagger-ui .fw3{font-weight:300}.swagger-ui .fw4{font-weight:400}.swagger-ui .fw5{font-weight:500}.swagger-ui .fw6{font-weight:600}.swagger-ui .fw7{font-weight:700}.swagger-ui .fw8{font-weight:800}.swagger-ui .fw9{font-weight:900}@media screen and (min-width:30em){.swagger-ui .normal-ns{font-weight:400}.swagger-ui .b-ns{font-weight:700}.swagger-ui .fw1-ns{font-weight:100}.swagger-ui .fw2-ns{font-weight:200}.swagger-ui .fw3-ns{font-weight:300}.swagger-ui .fw4-ns{font-weight:400}.swagger-ui .fw5-ns{font-weight:500}.swagger-ui .fw6-ns{font-weight:600}.swagger-ui .fw7-ns{font-weight:700}.swagger-ui .fw8-ns{font-weight:800}.swagger-ui .fw9-ns{font-weight:900}}@media screen and (min-width:30em) and (max-width:60em){.swagger-ui .normal-m{font-weight:400}.swagger-ui .b-m{font-weight:700}.swagger-ui .fw1-m{font-weight:100}.swagger-ui .fw2-m{font-weight:200}.swagger-ui .fw3-m{font-weight:300}.swagger-ui .fw4-m{font-weight:400}.swagger-ui .fw5-m{font-weight:500}.swagger-ui .fw6-m{font-weight:600}.swagger-ui .fw7-m{font-weight:700}.swagger-ui .fw8-m{font-weight:800}.swagger-ui .fw9-m{font-weight:900}}@media screen and (min-width:60em){.swagger-ui .normal-l{font-weight:400}.swagger-ui .b-l{font-weight:700}.swagger-ui .fw1-l{font-weight:100}.swagger-ui .fw2-l{font-weight:200}.swagger-ui .fw3-l{font-weight:300}.swagger-ui .fw4-l{font-weight:400}.swagger-ui .fw5-l{font-weight:500}.swagger-ui .fw6-l{font-weight:600}.swagger-ui .fw7-l{font-weight:700}.swagger-ui .fw8-l{font-weight:800}.swagger-ui .fw9-l{font-weight:900}}.swagger-ui .input-reset{-webkit-appearance:none;-moz-appearance:none}.swagger-ui .button-reset::-moz-focus-inner,.swagger-ui .input-reset::-moz-focus-inner{border:0;padding:0}.swagger-ui .h1{height:1rem}.swagger-ui .h2{height:2rem}.swagger-ui .h3{height:4rem}.swagger-ui .h4{height:8rem}.swagger-ui .h5{height:16rem}.swagger-ui .h-25{height:25%}.swagger-ui .h-50{height:50%}.swagger-ui .h-75{height:75%}.swagger-ui .h-100{height:100%}.swagger-ui .min-h-100{min-height:100%}.swagger-ui .vh-25{height:25vh}.swagger-ui .vh-50{height:50vh}.swagger-ui .vh-75{height:75vh}.swagger-ui .vh-100{height:100vh}.swagger-ui .min-vh-100{min-height:100vh}.swagger-ui .h-auto{height:auto}.swagger-ui .h-inherit{height:inherit}@media screen and (min-width:30em){.swagger-ui .h1-ns{height:1rem}.swagger-ui .h2-ns{height:2rem}.swagger-ui .h3-ns{height:4rem}.swagger-ui .h4-ns{height:8rem}.swagger-ui .h5-ns{height:16rem}.swagger-ui .h-25-ns{height:25%}.swagger-ui .h-50-ns{height:50%}.swagger-ui .h-75-ns{height:75%}.swagger-ui .h-100-ns{height:100%}.swagger-ui .min-h-100-ns{min-height:100%}.swagger-ui .vh-25-ns{height:25vh}.swagger-ui .vh-50-ns{height:50vh}.swagger-ui .vh-75-ns{height:75vh}.swagger-ui .vh-100-ns{height:100vh}.swagger-ui .min-vh-100-ns{min-height:100vh}.swagger-ui .h-auto-ns{height:auto}.swagger-ui .h-inherit-ns{height:inherit}}@media screen and (min-width:30em) and (max-width:60em){.swagger-ui .h1-m{height:1rem}.swagger-ui .h2-m{height:2rem}.swagger-ui .h3-m{height:4rem}.swagger-ui .h4-m{height:8rem}.swagger-ui .h5-m{height:16rem}.swagger-ui .h-25-m{height:25%}.swagger-ui .h-50-m{height:50%}.swagger-ui .h-75-m{height:75%}.swagger-ui .h-100-m{height:100%}.swagger-ui .min-h-100-m{min-height:100%}.swagger-ui .vh-25-m{height:25vh}.swagger-ui .vh-50-m{height:50vh}.swagger-ui .vh-75-m{height:75vh}.swagger-ui .vh-100-m{height:100vh}.swagger-ui .min-vh-100-m{min-height:100vh}.swagger-ui .h-auto-m{height:auto}.swagger-ui .h-inherit-m{height:inherit}}@media screen and (min-width:60em){.swagger-ui .h1-l{height:1rem}.swagger-ui .h2-l{height:2rem}.swagger-ui .h3-l{height:4rem}.swagger-ui .h4-l{height:8rem}.swagger-ui .h5-l{height:16rem}.swagger-ui .h-25-l{height:25%}.swagger-ui .h-50-l{height:50%}.swagger-ui .h-75-l{height:75%}.swagger-ui .h-100-l{height:100%}.swagger-ui .min-h-100-l{min-height:100%}.swagger-ui .vh-25-l{height:25vh}.swagger-ui .vh-50-l{height:50vh}.swagger-ui .vh-75-l{height:75vh}.swagger-ui .vh-100-l{height:100vh}.swagger-ui .min-vh-100-l{min-height:100vh}.swagger-ui .h-auto-l{height:auto}.swagger-ui .h-inherit-l{height:inherit}}.swagger-ui .tracked{letter-spacing:.1em}.swagger-ui .tracked-tight{letter-spacing:-.05em}.swagger-ui .tracked-mega{letter-spacing:.25em}@media screen and (min-width:30em){.swagger-ui .tracked-ns{letter-spacing:.1em}.swagger-ui .tracked-tight-ns{letter-spacing:-.05em}.swagger-ui .tracked-mega-ns{letter-spacing:.25em}}@media screen and (min-width:30em) and (max-width:60em){.swagger-ui .tracked-m{letter-spacing:.1em}.swagger-ui .tracked-tight-m{letter-spacing:-.05em}.swagger-ui .tracked-mega-m{letter-spacing:.25em}}@media screen and (min-width:60em){.swagger-ui .tracked-l{letter-spacing:.1em}.swagger-ui .tracked-tight-l{letter-spacing:-.05em}.swagger-ui .tracked-mega-l{letter-spacing:.25em}}.swagger-ui .lh-solid{line-height:1}.swagger-ui .lh-title{line-height:1.25}.swagger-ui .lh-copy{line-height:1.5}@media screen and (min-width:30em){.swagger-ui .lh-solid-ns{line-height:1}.swagger-ui .lh-title-ns{line-height:1.25}.swagger-ui .lh-copy-ns{line-height:1.5}}@media screen and (min-width:30em) and (max-width:60em){.swagger-ui .lh-solid-m{line-height:1}.swagger-ui .lh-title-m{line-height:1.25}.swagger-ui .lh-copy-m{line-height:1.5}}@media screen and (min-width:60em){.swagger-ui .lh-solid-l{line-height:1}.swagger-ui .lh-title-l{line-height:1.25}.swagger-ui .lh-copy-l{line-height:1.5}}.swagger-ui .link{text-decoration:none}.swagger-ui .link,.swagger-ui .link:active,.swagger-ui .link:focus,.swagger-ui .link:hover,.swagger-ui .link:link,.swagger-ui .link:visited{transition:color .15s ease-in}.swagger-ui .link:focus{outline:1px dotted currentColor}.swagger-ui .list{list-style-type:none}.swagger-ui .mw-100{max-width:100%}.swagger-ui .mw1{max-width:1rem}.swagger-ui .mw2{max-width:2rem}.swagger-ui .mw3{max-width:4rem}.swagger-ui .mw4{max-width:8rem}.swagger-ui .mw5{max-width:16rem}.swagger-ui .mw6{max-width:32rem}.swagger-ui .mw7{max-width:48rem}.swagger-ui .mw8{max-width:64rem}.swagger-ui .mw9{max-width:96rem}.swagger-ui .mw-none{max-width:none}@media screen and (min-width:30em){.swagger-ui .mw-100-ns{max-width:100%}.swagger-ui .mw1-ns{max-width:1rem}.swagger-ui .mw2-ns{max-width:2rem}.swagger-ui .mw3-ns{max-width:4rem}.swagger-ui .mw4-ns{max-width:8rem}.swagger-ui .mw5-ns{max-width:16rem}.swagger-ui .mw6-ns{max-width:32rem}.swagger-ui .mw7-ns{max-width:48rem}.swagger-ui .mw8-ns{max-width:64rem}.swagger-ui .mw9-ns{max-width:96rem}.swagger-ui .mw-none-ns{max-width:none}}@media screen and (min-width:30em) and (max-width:60em){.swagger-ui .mw-100-m{max-width:100%}.swagger-ui .mw1-m{max-width:1rem}.swagger-ui .mw2-m{max-width:2rem}.swagger-ui .mw3-m{max-width:4rem}.swagger-ui .mw4-m{max-width:8rem}.swagger-ui .mw5-m{max-width:16rem}.swagger-ui .mw6-m{max-width:32rem}.swagger-ui .mw7-m{max-width:48rem}.swagger-ui .mw8-m{max-width:64rem}.swagger-ui .mw9-m{max-width:96rem}.swagger-ui .mw-none-m{max-width:none}}@media screen and (min-width:60em){.swagger-ui .mw-100-l{max-width:100%}.swagger-ui .mw1-l{max-width:1rem}.swagger-ui .mw2-l{max-width:2rem}.swagger-ui .mw3-l{max-width:4rem}.swagger-ui .mw4-l{max-width:8rem}.swagger-ui .mw5-l{max-width:16rem}.swagger-ui .mw6-l{max-width:32rem}.swagger-ui .mw7-l{max-width:48rem}.swagger-ui .mw8-l{max-width:64rem}.swagger-ui .mw9-l{max-width:96rem}.swagger-ui .mw-none-l{max-width:none}}.swagger-ui .w1{width:1rem}.swagger-ui .w2{width:2rem}.swagger-ui .w3{width:4rem}.swagger-ui .w4{width:8rem}.swagger-ui .w5{width:16rem}.swagger-ui .w-10{width:10%}.swagger-ui .w-20{width:20%}.swagger-ui .w-25{width:25%}.swagger-ui .w-30{width:30%}.swagger-ui .w-33{width:33%}.swagger-ui .w-34{width:34%}.swagger-ui .w-40{width:40%}.swagger-ui .w-50{width:50%}.swagger-ui .w-60{width:60%}.swagger-ui .w-70{width:70%}.swagger-ui .w-75{width:75%}.swagger-ui .w-80{width:80%}.swagger-ui .w-90{width:90%}.swagger-ui .w-100{width:100%}.swagger-ui .w-third{width:33.3333333333%}.swagger-ui .w-two-thirds{width:66.6666666667%}.swagger-ui .w-auto{width:auto}@media screen and (min-width:30em){.swagger-ui .w1-ns{width:1rem}.swagger-ui .w2-ns{width:2rem}.swagger-ui .w3-ns{width:4rem}.swagger-ui .w4-ns{width:8rem}.swagger-ui .w5-ns{width:16rem}.swagger-ui .w-10-ns{width:10%}.swagger-ui .w-20-ns{width:20%}.swagger-ui .w-25-ns{width:25%}.swagger-ui .w-30-ns{width:30%}.swagger-ui .w-33-ns{width:33%}.swagger-ui .w-34-ns{width:34%}.swagger-ui .w-40-ns{width:40%}.swagger-ui .w-50-ns{width:50%}.swagger-ui .w-60-ns{width:60%}.swagger-ui .w-70-ns{width:70%}.swagger-ui .w-75-ns{width:75%}.swagger-ui .w-80-ns{width:80%}.swagger-ui .w-90-ns{width:90%}.swagger-ui .w-100-ns{width:100%}.swagger-ui .w-third-ns{width:33.3333333333%}.swagger-ui .w-two-thirds-ns{width:66.6666666667%}.swagger-ui .w-auto-ns{width:auto}}@media screen and (min-width:30em) and (max-width:60em){.swagger-ui .w1-m{width:1rem}.swagger-ui .w2-m{width:2rem}.swagger-ui .w3-m{width:4rem}.swagger-ui .w4-m{width:8rem}.swagger-ui .w5-m{width:16rem}.swagger-ui .w-10-m{width:10%}.swagger-ui .w-20-m{width:20%}.swagger-ui .w-25-m{width:25%}.swagger-ui .w-30-m{width:30%}.swagger-ui .w-33-m{width:33%}.swagger-ui .w-34-m{width:34%}.swagger-ui .w-40-m{width:40%}.swagger-ui .w-50-m{width:50%}.swagger-ui .w-60-m{width:60%}.swagger-ui .w-70-m{width:70%}.swagger-ui .w-75-m{width:75%}.swagger-ui .w-80-m{width:80%}.swagger-ui .w-90-m{width:90%}.swagger-ui .w-100-m{width:100%}.swagger-ui .w-third-m{width:33.3333333333%}.swagger-ui .w-two-thirds-m{width:66.6666666667%}.swagger-ui .w-auto-m{width:auto}}@media screen and (min-width:60em){.swagger-ui .w1-l{width:1rem}.swagger-ui .w2-l{width:2rem}.swagger-ui .w3-l{width:4rem}.swagger-ui .w4-l{width:8rem}.swagger-ui .w5-l{width:16rem}.swagger-ui .w-10-l{width:10%}.swagger-ui .w-20-l{width:20%}.swagger-ui .w-25-l{width:25%}.swagger-ui .w-30-l{width:30%}.swagger-ui .w-33-l{width:33%}.swagger-ui .w-34-l{width:34%}.swagger-ui .w-40-l{width:40%}.swagger-ui .w-50-l{width:50%}.swagger-ui .w-60-l{width:60%}.swagger-ui .w-70-l{width:70%}.swagger-ui .w-75-l{width:75%}.swagger-ui .w-80-l{width:80%}.swagger-ui .w-90-l{width:90%}.swagger-ui .w-100-l{width:100%}.swagger-ui .w-third-l{width:33.3333333333%}.swagger-ui .w-two-thirds-l{width:66.6666666667%}.swagger-ui .w-auto-l{width:auto}}.swagger-ui .overflow-visible{overflow:visible}.swagger-ui .overflow-hidden{overflow:hidden}.swagger-ui .overflow-scroll{overflow:scroll}.swagger-ui .overflow-auto{overflow:auto}.swagger-ui .overflow-x-visible{overflow-x:visible}.swagger-ui .overflow-x-hidden{overflow-x:hidden}.swagger-ui .overflow-x-scroll{overflow-x:scroll}.swagger-ui .overflow-x-auto{overflow-x:auto}.swagger-ui .overflow-y-visible{overflow-y:visible}.swagger-ui .overflow-y-hidden{overflow-y:hidden}.swagger-ui .overflow-y-scroll{overflow-y:scroll}.swagger-ui .overflow-y-auto{overflow-y:auto}@media screen and (min-width:30em){.swagger-ui .overflow-visible-ns{overflow:visible}.swagger-ui .overflow-hidden-ns{overflow:hidden}.swagger-ui .overflow-scroll-ns{overflow:scroll}.swagger-ui .overflow-auto-ns{overflow:auto}.swagger-ui .overflow-x-visible-ns{overflow-x:visible}.swagger-ui .overflow-x-hidden-ns{overflow-x:hidden}.swagger-ui .overflow-x-scroll-ns{overflow-x:scroll}.swagger-ui .overflow-x-auto-ns{overflow-x:auto}.swagger-ui .overflow-y-visible-ns{overflow-y:visible}.swagger-ui .overflow-y-hidden-ns{overflow-y:hidden}.swagger-ui .overflow-y-scroll-ns{overflow-y:scroll}.swagger-ui .overflow-y-auto-ns{overflow-y:auto}}@media screen and (min-width:30em) and (max-width:60em){.swagger-ui .overflow-visible-m{overflow:visible}.swagger-ui .overflow-hidden-m{overflow:hidden}.swagger-ui .overflow-scroll-m{overflow:scroll}.swagger-ui .overflow-auto-m{overflow:auto}.swagger-ui .overflow-x-visible-m{overflow-x:visible}.swagger-ui .overflow-x-hidden-m{overflow-x:hidden}.swagger-ui .overflow-x-scroll-m{overflow-x:scroll}.swagger-ui .overflow-x-auto-m{overflow-x:auto}.swagger-ui .overflow-y-visible-m{overflow-y:visible}.swagger-ui .overflow-y-hidden-m{overflow-y:hidden}.swagger-ui .overflow-y-scroll-m{overflow-y:scroll}.swagger-ui .overflow-y-auto-m{overflow-y:auto}}@media screen and (min-width:60em){.swagger-ui .overflow-visible-l{overflow:visible}.swagger-ui .overflow-hidden-l{overflow:hidden}.swagger-ui .overflow-scroll-l{overflow:scroll}.swagger-ui .overflow-auto-l{overflow:auto}.swagger-ui .overflow-x-visible-l{overflow-x:visible}.swagger-ui .overflow-x-hidden-l{overflow-x:hidden}.swagger-ui .overflow-x-scroll-l{overflow-x:scroll}.swagger-ui .overflow-x-auto-l{overflow-x:auto}.swagger-ui .overflow-y-visible-l{overflow-y:visible}.swagger-ui .overflow-y-hidden-l{overflow-y:hidden}.swagger-ui .overflow-y-scroll-l{overflow-y:scroll}.swagger-ui .overflow-y-auto-l{overflow-y:auto}}.swagger-ui .static{position:static}.swagger-ui .relative{position:relative}.swagger-ui .absolute{position:absolute}.swagger-ui .fixed{position:fixed}@media screen and (min-width:30em){.swagger-ui .static-ns{position:static}.swagger-ui .relative-ns{position:relative}.swagger-ui .absolute-ns{position:absolute}.swagger-ui .fixed-ns{position:fixed}}@media screen and (min-width:30em) and (max-width:60em){.swagger-ui .static-m{position:static}.swagger-ui .relative-m{position:relative}.swagger-ui .absolute-m{position:absolute}.swagger-ui .fixed-m{position:fixed}}@media screen and (min-width:60em){.swagger-ui .static-l{position:static}.swagger-ui .relative-l{position:relative}.swagger-ui .absolute-l{position:absolute}.swagger-ui .fixed-l{position:fixed}}.swagger-ui .o-100{opacity:1}.swagger-ui .o-90{opacity:.9}.swagger-ui .o-80{opacity:.8}.swagger-ui .o-70{opacity:.7}.swagger-ui .o-60{opacity:.6}.swagger-ui .o-50{opacity:.5}.swagger-ui .o-40{opacity:.4}.swagger-ui .o-30{opacity:.3}.swagger-ui .o-20{opacity:.2}.swagger-ui .o-10{opacity:.1}.swagger-ui .o-05{opacity:.05}.swagger-ui .o-025{opacity:.025}.swagger-ui .o-0{opacity:0}.swagger-ui .rotate-45{transform:rotate(45deg)}.swagger-ui .rotate-90{transform:rotate(90deg)}.swagger-ui .rotate-135{transform:rotate(135deg)}.swagger-ui .rotate-180{transform:rotate(180deg)}.swagger-ui .rotate-225{transform:rotate(225deg)}.swagger-ui .rotate-270{transform:rotate(270deg)}.swagger-ui .rotate-315{transform:rotate(315deg)}@media screen and (min-width:30em){.swagger-ui .rotate-45-ns{transform:rotate(45deg)}.swagger-ui .rotate-90-ns{transform:rotate(90deg)}.swagger-ui .rotate-135-ns{transform:rotate(135deg)}.swagger-ui .rotate-180-ns{transform:rotate(180deg)}.swagger-ui .rotate-225-ns{transform:rotate(225deg)}.swagger-ui .rotate-270-ns{transform:rotate(270deg)}.swagger-ui .rotate-315-ns{transform:rotate(315deg)}}@media screen and (min-width:30em) and (max-width:60em){.swagger-ui .rotate-45-m{transform:rotate(45deg)}.swagger-ui .rotate-90-m{transform:rotate(90deg)}.swagger-ui .rotate-135-m{transform:rotate(135deg)}.swagger-ui .rotate-180-m{transform:rotate(180deg)}.swagger-ui .rotate-225-m{transform:rotate(225deg)}.swagger-ui .rotate-270-m{transform:rotate(270deg)}.swagger-ui .rotate-315-m{transform:rotate(315deg)}}@media screen and (min-width:60em){.swagger-ui .rotate-45-l{transform:rotate(45deg)}.swagger-ui .rotate-90-l{transform:rotate(90deg)}.swagger-ui .rotate-135-l{transform:rotate(135deg)}.swagger-ui .rotate-180-l{transform:rotate(180deg)}.swagger-ui .rotate-225-l{transform:rotate(225deg)}.swagger-ui .rotate-270-l{transform:rotate(270deg)}.swagger-ui .rotate-315-l{transform:rotate(315deg)}}.swagger-ui .black-90{color:#000000e6}.swagger-ui .black-80{color:#000c}.swagger-ui .black-70{color:#000000b3}.swagger-ui .black-60{color:#0009}.swagger-ui .black-50{color:#00000080}.swagger-ui .black-40{color:#0006}.swagger-ui .black-30{color:#0000004d}.swagger-ui .black-20{color:#0003}.swagger-ui .black-10{color:#0000001a}.swagger-ui .black-05{color:#0000000d}.swagger-ui .white-90{color:#ffffffe6}.swagger-ui .white-80{color:#fffc}.swagger-ui .white-70{color:#ffffffb3}.swagger-ui .white-60{color:#fff9}.swagger-ui .white-50{color:#ffffff80}.swagger-ui .white-40{color:#fff6}.swagger-ui .white-30{color:#ffffff4d}.swagger-ui .white-20{color:#fff3}.swagger-ui .white-10{color:#ffffff1a}.swagger-ui .black{color:#000}.swagger-ui .near-black{color:#111}.swagger-ui .dark-gray{color:#333}.swagger-ui .mid-gray{color:#555}.swagger-ui .gray{color:#777}.swagger-ui .silver{color:#999}.swagger-ui .light-silver{color:#aaa}.swagger-ui .moon-gray{color:#ccc}.swagger-ui .light-gray{color:#eee}.swagger-ui .near-white{color:#f4f4f4}.swagger-ui .white{color:#fff}.swagger-ui .dark-red{color:#e7040f}.swagger-ui .red{color:#ff4136}.swagger-ui .light-red{color:#ff725c}.swagger-ui .orange{color:#ff6300}.swagger-ui .gold{color:#ffb700}.swagger-ui .yellow{color:gold}.swagger-ui .light-yellow{color:#fbf1a9}.swagger-ui .purple{color:#5e2ca5}.swagger-ui .light-purple{color:#a463f2}.swagger-ui .dark-pink{color:#d5008f}.swagger-ui .hot-pink{color:#ff41b4}.swagger-ui .pink{color:#ff80cc}.swagger-ui .light-pink{color:#ffa3d7}.swagger-ui .dark-green{color:#137752}.swagger-ui .green{color:#19a974}.swagger-ui .light-green{color:#9eebcf}.swagger-ui .navy{color:#001b44}.swagger-ui .dark-blue{color:#00449e}.swagger-ui .blue{color:#357edd}.swagger-ui .light-blue{color:#96ccff}.swagger-ui .lightest-blue{color:#cdecff}.swagger-ui .washed-blue{color:#f6fffe}.swagger-ui .washed-green{color:#e8fdf5}.swagger-ui .washed-yellow{color:#fffceb}.swagger-ui .washed-red{color:#ffdfdf}.swagger-ui .color-inherit{color:inherit}.swagger-ui .bg-black-90{background-color:#000000e6}.swagger-ui .bg-black-80{background-color:#000c}.swagger-ui .bg-black-70{background-color:#000000b3}.swagger-ui .bg-black-60{background-color:#0009}.swagger-ui .bg-black-50{background-color:#00000080}.swagger-ui .bg-black-40{background-color:#0006}.swagger-ui .bg-black-30{background-color:#0000004d}.swagger-ui .bg-black-20{background-color:#0003}.swagger-ui .bg-black-10{background-color:#0000001a}.swagger-ui .bg-black-05{background-color:#0000000d}.swagger-ui .bg-white-90{background-color:#ffffffe6}.swagger-ui .bg-white-80{background-color:#fffc}.swagger-ui .bg-white-70{background-color:#ffffffb3}.swagger-ui .bg-white-60{background-color:#fff9}.swagger-ui .bg-white-50{background-color:#ffffff80}.swagger-ui .bg-white-40{background-color:#fff6}.swagger-ui .bg-white-30{background-color:#ffffff4d}.swagger-ui .bg-white-20{background-color:#fff3}.swagger-ui .bg-white-10{background-color:#ffffff1a}.swagger-ui .bg-black{background-color:#000}.swagger-ui .bg-near-black{background-color:#111}.swagger-ui .bg-dark-gray{background-color:#333}.swagger-ui .bg-mid-gray{background-color:#555}.swagger-ui .bg-gray{background-color:#777}.swagger-ui .bg-silver{background-color:#999}.swagger-ui .bg-light-silver{background-color:#aaa}.swagger-ui .bg-moon-gray{background-color:#ccc}.swagger-ui .bg-light-gray{background-color:#eee}.swagger-ui .bg-near-white{background-color:#f4f4f4}.swagger-ui .bg-white{background-color:#fff}.swagger-ui .bg-transparent{background-color:transparent}.swagger-ui .bg-dark-red{background-color:#e7040f}.swagger-ui .bg-red{background-color:#ff4136}.swagger-ui .bg-light-red{background-color:#ff725c}.swagger-ui .bg-orange{background-color:#ff6300}.swagger-ui .bg-gold{background-color:#ffb700}.swagger-ui .bg-yellow{background-color:gold}.swagger-ui .bg-light-yellow{background-color:#fbf1a9}.swagger-ui .bg-purple{background-color:#5e2ca5}.swagger-ui .bg-light-purple{background-color:#a463f2}.swagger-ui .bg-dark-pink{background-color:#d5008f}.swagger-ui .bg-hot-pink{background-color:#ff41b4}.swagger-ui .bg-pink{background-color:#ff80cc}.swagger-ui .bg-light-pink{background-color:#ffa3d7}.swagger-ui .bg-dark-green{background-color:#137752}.swagger-ui .bg-green{background-color:#19a974}.swagger-ui .bg-light-green{background-color:#9eebcf}.swagger-ui .bg-navy{background-color:#001b44}.swagger-ui .bg-dark-blue{background-color:#00449e}.swagger-ui .bg-blue{background-color:#357edd}.swagger-ui .bg-light-blue{background-color:#96ccff}.swagger-ui .bg-lightest-blue{background-color:#cdecff}.swagger-ui .bg-washed-blue{background-color:#f6fffe}.swagger-ui .bg-washed-green{background-color:#e8fdf5}.swagger-ui .bg-washed-yellow{background-color:#fffceb}.swagger-ui .bg-washed-red{background-color:#ffdfdf}.swagger-ui .bg-inherit{background-color:inherit}.swagger-ui .hover-black:focus,.swagger-ui .hover-black:hover{color:#000}.swagger-ui .hover-near-black:focus,.swagger-ui .hover-near-black:hover{color:#111}.swagger-ui .hover-dark-gray:focus,.swagger-ui .hover-dark-gray:hover{color:#333}.swagger-ui .hover-mid-gray:focus,.swagger-ui .hover-mid-gray:hover{color:#555}.swagger-ui .hover-gray:focus,.swagger-ui .hover-gray:hover{color:#777}.swagger-ui .hover-silver:focus,.swagger-ui .hover-silver:hover{color:#999}.swagger-ui .hover-light-silver:focus,.swagger-ui .hover-light-silver:hover{color:#aaa}.swagger-ui .hover-moon-gray:focus,.swagger-ui .hover-moon-gray:hover{color:#ccc}.swagger-ui .hover-light-gray:focus,.swagger-ui .hover-light-gray:hover{color:#eee}.swagger-ui .hover-near-white:focus,.swagger-ui .hover-near-white:hover{color:#f4f4f4}.swagger-ui .hover-white:focus,.swagger-ui .hover-white:hover{color:#fff}.swagger-ui .hover-black-90:focus,.swagger-ui .hover-black-90:hover{color:#000000e6}.swagger-ui .hover-black-80:focus,.swagger-ui .hover-black-80:hover{color:#000c}.swagger-ui .hover-black-70:focus,.swagger-ui .hover-black-70:hover{color:#000000b3}.swagger-ui .hover-black-60:focus,.swagger-ui .hover-black-60:hover{color:#0009}.swagger-ui .hover-black-50:focus,.swagger-ui .hover-black-50:hover{color:#00000080}.swagger-ui .hover-black-40:focus,.swagger-ui .hover-black-40:hover{color:#0006}.swagger-ui .hover-black-30:focus,.swagger-ui .hover-black-30:hover{color:#0000004d}.swagger-ui .hover-black-20:focus,.swagger-ui .hover-black-20:hover{color:#0003}.swagger-ui .hover-black-10:focus,.swagger-ui .hover-black-10:hover{color:#0000001a}.swagger-ui .hover-white-90:focus,.swagger-ui .hover-white-90:hover{color:#ffffffe6}.swagger-ui .hover-white-80:focus,.swagger-ui .hover-white-80:hover{color:#fffc}.swagger-ui .hover-white-70:focus,.swagger-ui .hover-white-70:hover{color:#ffffffb3}.swagger-ui .hover-white-60:focus,.swagger-ui .hover-white-60:hover{color:#fff9}.swagger-ui .hover-white-50:focus,.swagger-ui .hover-white-50:hover{color:#ffffff80}.swagger-ui .hover-white-40:focus,.swagger-ui .hover-white-40:hover{color:#fff6}.swagger-ui .hover-white-30:focus,.swagger-ui .hover-white-30:hover{color:#ffffff4d}.swagger-ui .hover-white-20:focus,.swagger-ui .hover-white-20:hover{color:#fff3}.swagger-ui .hover-white-10:focus,.swagger-ui .hover-white-10:hover{color:#ffffff1a}.swagger-ui .hover-inherit:focus,.swagger-ui .hover-inherit:hover{color:inherit}.swagger-ui .hover-bg-black:focus,.swagger-ui .hover-bg-black:hover{background-color:#000}.swagger-ui .hover-bg-near-black:focus,.swagger-ui .hover-bg-near-black:hover{background-color:#111}.swagger-ui .hover-bg-dark-gray:focus,.swagger-ui .hover-bg-dark-gray:hover{background-color:#333}.swagger-ui .hover-bg-mid-gray:focus,.swagger-ui .hover-bg-mid-gray:hover{background-color:#555}.swagger-ui .hover-bg-gray:focus,.swagger-ui .hover-bg-gray:hover{background-color:#777}.swagger-ui .hover-bg-silver:focus,.swagger-ui .hover-bg-silver:hover{background-color:#999}.swagger-ui .hover-bg-light-silver:focus,.swagger-ui .hover-bg-light-silver:hover{background-color:#aaa}.swagger-ui .hover-bg-moon-gray:focus,.swagger-ui .hover-bg-moon-gray:hover{background-color:#ccc}.swagger-ui .hover-bg-light-gray:focus,.swagger-ui .hover-bg-light-gray:hover{background-color:#eee}.swagger-ui .hover-bg-near-white:focus,.swagger-ui .hover-bg-near-white:hover{background-color:#f4f4f4}.swagger-ui .hover-bg-white:focus,.swagger-ui .hover-bg-white:hover{background-color:#fff}.swagger-ui .hover-bg-transparent:focus,.swagger-ui .hover-bg-transparent:hover{background-color:transparent}.swagger-ui .hover-bg-black-90:focus,.swagger-ui .hover-bg-black-90:hover{background-color:#000000e6}.swagger-ui .hover-bg-black-80:focus,.swagger-ui .hover-bg-black-80:hover{background-color:#000c}.swagger-ui .hover-bg-black-70:focus,.swagger-ui .hover-bg-black-70:hover{background-color:#000000b3}.swagger-ui .hover-bg-black-60:focus,.swagger-ui .hover-bg-black-60:hover{background-color:#0009}.swagger-ui .hover-bg-black-50:focus,.swagger-ui .hover-bg-black-50:hover{background-color:#00000080}.swagger-ui .hover-bg-black-40:focus,.swagger-ui .hover-bg-black-40:hover{background-color:#0006}.swagger-ui .hover-bg-black-30:focus,.swagger-ui .hover-bg-black-30:hover{background-color:#0000004d}.swagger-ui .hover-bg-black-20:focus,.swagger-ui .hover-bg-black-20:hover{background-color:#0003}.swagger-ui .hover-bg-black-10:focus,.swagger-ui .hover-bg-black-10:hover{background-color:#0000001a}.swagger-ui .hover-bg-white-90:focus,.swagger-ui .hover-bg-white-90:hover{background-color:#ffffffe6}.swagger-ui .hover-bg-white-80:focus,.swagger-ui .hover-bg-white-80:hover{background-color:#fffc}.swagger-ui .hover-bg-white-70:focus,.swagger-ui .hover-bg-white-70:hover{background-color:#ffffffb3}.swagger-ui .hover-bg-white-60:focus,.swagger-ui .hover-bg-white-60:hover{background-color:#fff9}.swagger-ui .hover-bg-white-50:focus,.swagger-ui .hover-bg-white-50:hover{background-color:#ffffff80}.swagger-ui .hover-bg-white-40:focus,.swagger-ui .hover-bg-white-40:hover{background-color:#fff6}.swagger-ui .hover-bg-white-30:focus,.swagger-ui .hover-bg-white-30:hover{background-color:#ffffff4d}.swagger-ui .hover-bg-white-20:focus,.swagger-ui .hover-bg-white-20:hover{background-color:#fff3}.swagger-ui .hover-bg-white-10:focus,.swagger-ui .hover-bg-white-10:hover{background-color:#ffffff1a}.swagger-ui .hover-dark-red:focus,.swagger-ui .hover-dark-red:hover{color:#e7040f}.swagger-ui .hover-red:focus,.swagger-ui .hover-red:hover{color:#ff4136}.swagger-ui .hover-light-red:focus,.swagger-ui .hover-light-red:hover{color:#ff725c}.swagger-ui .hover-orange:focus,.swagger-ui .hover-orange:hover{color:#ff6300}.swagger-ui .hover-gold:focus,.swagger-ui .hover-gold:hover{color:#ffb700}.swagger-ui .hover-yellow:focus,.swagger-ui .hover-yellow:hover{color:gold}.swagger-ui .hover-light-yellow:focus,.swagger-ui .hover-light-yellow:hover{color:#fbf1a9}.swagger-ui .hover-purple:focus,.swagger-ui .hover-purple:hover{color:#5e2ca5}.swagger-ui .hover-light-purple:focus,.swagger-ui .hover-light-purple:hover{color:#a463f2}.swagger-ui .hover-dark-pink:focus,.swagger-ui .hover-dark-pink:hover{color:#d5008f}.swagger-ui .hover-hot-pink:focus,.swagger-ui .hover-hot-pink:hover{color:#ff41b4}.swagger-ui .hover-pink:focus,.swagger-ui .hover-pink:hover{color:#ff80cc}.swagger-ui .hover-light-pink:focus,.swagger-ui .hover-light-pink:hover{color:#ffa3d7}.swagger-ui .hover-dark-green:focus,.swagger-ui .hover-dark-green:hover{color:#137752}.swagger-ui .hover-green:focus,.swagger-ui .hover-green:hover{color:#19a974}.swagger-ui .hover-light-green:focus,.swagger-ui .hover-light-green:hover{color:#9eebcf}.swagger-ui .hover-navy:focus,.swagger-ui .hover-navy:hover{color:#001b44}.swagger-ui .hover-dark-blue:focus,.swagger-ui .hover-dark-blue:hover{color:#00449e}.swagger-ui .hover-blue:focus,.swagger-ui .hover-blue:hover{color:#357edd}.swagger-ui .hover-light-blue:focus,.swagger-ui .hover-light-blue:hover{color:#96ccff}.swagger-ui .hover-lightest-blue:focus,.swagger-ui .hover-lightest-blue:hover{color:#cdecff}.swagger-ui .hover-washed-blue:focus,.swagger-ui .hover-washed-blue:hover{color:#f6fffe}.swagger-ui .hover-washed-green:focus,.swagger-ui .hover-washed-green:hover{color:#e8fdf5}.swagger-ui .hover-washed-yellow:focus,.swagger-ui .hover-washed-yellow:hover{color:#fffceb}.swagger-ui .hover-washed-red:focus,.swagger-ui .hover-washed-red:hover{color:#ffdfdf}.swagger-ui .hover-bg-dark-red:focus,.swagger-ui .hover-bg-dark-red:hover{background-color:#e7040f}.swagger-ui .hover-bg-red:focus,.swagger-ui .hover-bg-red:hover{background-color:#ff4136}.swagger-ui .hover-bg-light-red:focus,.swagger-ui .hover-bg-light-red:hover{background-color:#ff725c}.swagger-ui .hover-bg-orange:focus,.swagger-ui .hover-bg-orange:hover{background-color:#ff6300}.swagger-ui .hover-bg-gold:focus,.swagger-ui .hover-bg-gold:hover{background-color:#ffb700}.swagger-ui .hover-bg-yellow:focus,.swagger-ui .hover-bg-yellow:hover{background-color:gold}.swagger-ui .hover-bg-light-yellow:focus,.swagger-ui .hover-bg-light-yellow:hover{background-color:#fbf1a9}.swagger-ui .hover-bg-purple:focus,.swagger-ui .hover-bg-purple:hover{background-color:#5e2ca5}.swagger-ui .hover-bg-light-purple:focus,.swagger-ui .hover-bg-light-purple:hover{background-color:#a463f2}.swagger-ui .hover-bg-dark-pink:focus,.swagger-ui .hover-bg-dark-pink:hover{background-color:#d5008f}.swagger-ui .hover-bg-hot-pink:focus,.swagger-ui .hover-bg-hot-pink:hover{background-color:#ff41b4}.swagger-ui .hover-bg-pink:focus,.swagger-ui .hover-bg-pink:hover{background-color:#ff80cc}.swagger-ui .hover-bg-light-pink:focus,.swagger-ui .hover-bg-light-pink:hover{background-color:#ffa3d7}.swagger-ui .hover-bg-dark-green:focus,.swagger-ui .hover-bg-dark-green:hover{background-color:#137752}.swagger-ui .hover-bg-green:focus,.swagger-ui .hover-bg-green:hover{background-color:#19a974}.swagger-ui .hover-bg-light-green:focus,.swagger-ui .hover-bg-light-green:hover{background-color:#9eebcf}.swagger-ui .hover-bg-navy:focus,.swagger-ui .hover-bg-navy:hover{background-color:#001b44}.swagger-ui .hover-bg-dark-blue:focus,.swagger-ui .hover-bg-dark-blue:hover{background-color:#00449e}.swagger-ui .hover-bg-blue:focus,.swagger-ui .hover-bg-blue:hover{background-color:#357edd}.swagger-ui .hover-bg-light-blue:focus,.swagger-ui .hover-bg-light-blue:hover{background-color:#96ccff}.swagger-ui .hover-bg-lightest-blue:focus,.swagger-ui .hover-bg-lightest-blue:hover{background-color:#cdecff}.swagger-ui .hover-bg-washed-blue:focus,.swagger-ui .hover-bg-washed-blue:hover{background-color:#f6fffe}.swagger-ui .hover-bg-washed-green:focus,.swagger-ui .hover-bg-washed-green:hover{background-color:#e8fdf5}.swagger-ui .hover-bg-washed-yellow:focus,.swagger-ui .hover-bg-washed-yellow:hover{background-color:#fffceb}.swagger-ui .hover-bg-washed-red:focus,.swagger-ui .hover-bg-washed-red:hover{background-color:#ffdfdf}.swagger-ui .hover-bg-inherit:focus,.swagger-ui .hover-bg-inherit:hover{background-color:inherit}.swagger-ui .pa0{padding:0}.swagger-ui .pa1{padding:.25rem}.swagger-ui .pa2{padding:.5rem}.swagger-ui .pa3{padding:1rem}.swagger-ui .pa4{padding:2rem}.swagger-ui .pa5{padding:4rem}.swagger-ui .pa6{padding:8rem}.swagger-ui .pa7{padding:16rem}.swagger-ui .pl0{padding-left:0}.swagger-ui .pl1{padding-left:.25rem}.swagger-ui .pl2{padding-left:.5rem}.swagger-ui .pl3{padding-left:1rem}.swagger-ui .pl4{padding-left:2rem}.swagger-ui .pl5{padding-left:4rem}.swagger-ui .pl6{padding-left:8rem}.swagger-ui .pl7{padding-left:16rem}.swagger-ui .pr0{padding-right:0}.swagger-ui .pr1{padding-right:.25rem}.swagger-ui .pr2{padding-right:.5rem}.swagger-ui .pr3{padding-right:1rem}.swagger-ui .pr4{padding-right:2rem}.swagger-ui .pr5{padding-right:4rem}.swagger-ui .pr6{padding-right:8rem}.swagger-ui .pr7{padding-right:16rem}.swagger-ui .pb0{padding-bottom:0}.swagger-ui .pb1{padding-bottom:.25rem}.swagger-ui .pb2{padding-bottom:.5rem}.swagger-ui .pb3{padding-bottom:1rem}.swagger-ui .pb4{padding-bottom:2rem}.swagger-ui .pb5{padding-bottom:4rem}.swagger-ui .pb6{padding-bottom:8rem}.swagger-ui .pb7{padding-bottom:16rem}.swagger-ui .pt0{padding-top:0}.swagger-ui .pt1{padding-top:.25rem}.swagger-ui .pt2{padding-top:.5rem}.swagger-ui .pt3{padding-top:1rem}.swagger-ui .pt4{padding-top:2rem}.swagger-ui .pt5{padding-top:4rem}.swagger-ui .pt6{padding-top:8rem}.swagger-ui .pt7{padding-top:16rem}.swagger-ui .pv0{padding-bottom:0;padding-top:0}.swagger-ui .pv1{padding-bottom:.25rem;padding-top:.25rem}.swagger-ui .pv2{padding-bottom:.5rem;padding-top:.5rem}.swagger-ui .pv3{padding-bottom:1rem;padding-top:1rem}.swagger-ui .pv4{padding-bottom:2rem;padding-top:2rem}.swagger-ui .pv5{padding-bottom:4rem;padding-top:4rem}.swagger-ui .pv6{padding-bottom:8rem;padding-top:8rem}.swagger-ui .pv7{padding-bottom:16rem;padding-top:16rem}.swagger-ui .ph0{padding-left:0;padding-right:0}.swagger-ui .ph1{padding-left:.25rem;padding-right:.25rem}.swagger-ui .ph2{padding-left:.5rem;padding-right:.5rem}.swagger-ui .ph3{padding-left:1rem;padding-right:1rem}.swagger-ui .ph4{padding-left:2rem;padding-right:2rem}.swagger-ui .ph5{padding-left:4rem;padding-right:4rem}.swagger-ui .ph6{padding-left:8rem;padding-right:8rem}.swagger-ui .ph7{padding-left:16rem;padding-right:16rem}.swagger-ui .ma0{margin:0}.swagger-ui .ma1{margin:.25rem}.swagger-ui .ma2{margin:.5rem}.swagger-ui .ma3{margin:1rem}.swagger-ui .ma4{margin:2rem}.swagger-ui .ma5{margin:4rem}.swagger-ui .ma6{margin:8rem}.swagger-ui .ma7{margin:16rem}.swagger-ui .ml0{margin-left:0}.swagger-ui .ml1{margin-left:.25rem}.swagger-ui .ml2{margin-left:.5rem}.swagger-ui .ml3{margin-left:1rem}.swagger-ui .ml4{margin-left:2rem}.swagger-ui .ml5{margin-left:4rem}.swagger-ui .ml6{margin-left:8rem}.swagger-ui .ml7{margin-left:16rem}.swagger-ui .mr0{margin-right:0}.swagger-ui .mr1{margin-right:.25rem}.swagger-ui .mr2{margin-right:.5rem}.swagger-ui .mr3{margin-right:1rem}.swagger-ui .mr4{margin-right:2rem}.swagger-ui .mr5{margin-right:4rem}.swagger-ui .mr6{margin-right:8rem}.swagger-ui .mr7{margin-right:16rem}.swagger-ui .mb0{margin-bottom:0}.swagger-ui .mb1{margin-bottom:.25rem}.swagger-ui .mb2{margin-bottom:.5rem}.swagger-ui .mb3{margin-bottom:1rem}.swagger-ui .mb4{margin-bottom:2rem}.swagger-ui .mb5{margin-bottom:4rem}.swagger-ui .mb6{margin-bottom:8rem}.swagger-ui .mb7{margin-bottom:16rem}.swagger-ui .mt0{margin-top:0}.swagger-ui .mt1{margin-top:.25rem}.swagger-ui .mt2{margin-top:.5rem}.swagger-ui .mt3{margin-top:1rem}.swagger-ui .mt4{margin-top:2rem}.swagger-ui .mt5{margin-top:4rem}.swagger-ui .mt6{margin-top:8rem}.swagger-ui .mt7{margin-top:16rem}.swagger-ui .mv0{margin-bottom:0;margin-top:0}.swagger-ui .mv1{margin-bottom:.25rem;margin-top:.25rem}.swagger-ui .mv2{margin-bottom:.5rem;margin-top:.5rem}.swagger-ui .mv3{margin-bottom:1rem;margin-top:1rem}.swagger-ui .mv4{margin-bottom:2rem;margin-top:2rem}.swagger-ui .mv5{margin-bottom:4rem;margin-top:4rem}.swagger-ui .mv6{margin-bottom:8rem;margin-top:8rem}.swagger-ui .mv7{margin-bottom:16rem;margin-top:16rem}.swagger-ui .mh0{margin-left:0;margin-right:0}.swagger-ui .mh1{margin-left:.25rem;margin-right:.25rem}.swagger-ui .mh2{margin-left:.5rem;margin-right:.5rem}.swagger-ui .mh3{margin-left:1rem;margin-right:1rem}.swagger-ui .mh4{margin-left:2rem;margin-right:2rem}.swagger-ui .mh5{margin-left:4rem;margin-right:4rem}.swagger-ui .mh6{margin-left:8rem;margin-right:8rem}.swagger-ui .mh7{margin-left:16rem;margin-right:16rem}@media screen and (min-width:30em){.swagger-ui .pa0-ns{padding:0}.swagger-ui .pa1-ns{padding:.25rem}.swagger-ui .pa2-ns{padding:.5rem}.swagger-ui .pa3-ns{padding:1rem}.swagger-ui .pa4-ns{padding:2rem}.swagger-ui .pa5-ns{padding:4rem}.swagger-ui .pa6-ns{padding:8rem}.swagger-ui .pa7-ns{padding:16rem}.swagger-ui .pl0-ns{padding-left:0}.swagger-ui .pl1-ns{padding-left:.25rem}.swagger-ui .pl2-ns{padding-left:.5rem}.swagger-ui .pl3-ns{padding-left:1rem}.swagger-ui .pl4-ns{padding-left:2rem}.swagger-ui .pl5-ns{padding-left:4rem}.swagger-ui .pl6-ns{padding-left:8rem}.swagger-ui .pl7-ns{padding-left:16rem}.swagger-ui .pr0-ns{padding-right:0}.swagger-ui .pr1-ns{padding-right:.25rem}.swagger-ui .pr2-ns{padding-right:.5rem}.swagger-ui .pr3-ns{padding-right:1rem}.swagger-ui .pr4-ns{padding-right:2rem}.swagger-ui .pr5-ns{padding-right:4rem}.swagger-ui .pr6-ns{padding-right:8rem}.swagger-ui .pr7-ns{padding-right:16rem}.swagger-ui .pb0-ns{padding-bottom:0}.swagger-ui .pb1-ns{padding-bottom:.25rem}.swagger-ui .pb2-ns{padding-bottom:.5rem}.swagger-ui .pb3-ns{padding-bottom:1rem}.swagger-ui .pb4-ns{padding-bottom:2rem}.swagger-ui .pb5-ns{padding-bottom:4rem}.swagger-ui .pb6-ns{padding-bottom:8rem}.swagger-ui .pb7-ns{padding-bottom:16rem}.swagger-ui .pt0-ns{padding-top:0}.swagger-ui .pt1-ns{padding-top:.25rem}.swagger-ui .pt2-ns{padding-top:.5rem}.swagger-ui .pt3-ns{padding-top:1rem}.swagger-ui .pt4-ns{padding-top:2rem}.swagger-ui .pt5-ns{padding-top:4rem}.swagger-ui .pt6-ns{padding-top:8rem}.swagger-ui .pt7-ns{padding-top:16rem}.swagger-ui .pv0-ns{padding-bottom:0;padding-top:0}.swagger-ui .pv1-ns{padding-bottom:.25rem;padding-top:.25rem}.swagger-ui .pv2-ns{padding-bottom:.5rem;padding-top:.5rem}.swagger-ui .pv3-ns{padding-bottom:1rem;padding-top:1rem}.swagger-ui .pv4-ns{padding-bottom:2rem;padding-top:2rem}.swagger-ui .pv5-ns{padding-bottom:4rem;padding-top:4rem}.swagger-ui .pv6-ns{padding-bottom:8rem;padding-top:8rem}.swagger-ui .pv7-ns{padding-bottom:16rem;padding-top:16rem}.swagger-ui .ph0-ns{padding-left:0;padding-right:0}.swagger-ui .ph1-ns{padding-left:.25rem;padding-right:.25rem}.swagger-ui .ph2-ns{padding-left:.5rem;padding-right:.5rem}.swagger-ui .ph3-ns{padding-left:1rem;padding-right:1rem}.swagger-ui .ph4-ns{padding-left:2rem;padding-right:2rem}.swagger-ui .ph5-ns{padding-left:4rem;padding-right:4rem}.swagger-ui .ph6-ns{padding-left:8rem;padding-right:8rem}.swagger-ui .ph7-ns{padding-left:16rem;padding-right:16rem}.swagger-ui .ma0-ns{margin:0}.swagger-ui .ma1-ns{margin:.25rem}.swagger-ui .ma2-ns{margin:.5rem}.swagger-ui .ma3-ns{margin:1rem}.swagger-ui .ma4-ns{margin:2rem}.swagger-ui .ma5-ns{margin:4rem}.swagger-ui .ma6-ns{margin:8rem}.swagger-ui .ma7-ns{margin:16rem}.swagger-ui .ml0-ns{margin-left:0}.swagger-ui .ml1-ns{margin-left:.25rem}.swagger-ui .ml2-ns{margin-left:.5rem}.swagger-ui .ml3-ns{margin-left:1rem}.swagger-ui .ml4-ns{margin-left:2rem}.swagger-ui .ml5-ns{margin-left:4rem}.swagger-ui .ml6-ns{margin-left:8rem}.swagger-ui .ml7-ns{margin-left:16rem}.swagger-ui .mr0-ns{margin-right:0}.swagger-ui .mr1-ns{margin-right:.25rem}.swagger-ui .mr2-ns{margin-right:.5rem}.swagger-ui .mr3-ns{margin-right:1rem}.swagger-ui .mr4-ns{margin-right:2rem}.swagger-ui .mr5-ns{margin-right:4rem}.swagger-ui .mr6-ns{margin-right:8rem}.swagger-ui .mr7-ns{margin-right:16rem}.swagger-ui .mb0-ns{margin-bottom:0}.swagger-ui .mb1-ns{margin-bottom:.25rem}.swagger-ui .mb2-ns{margin-bottom:.5rem}.swagger-ui .mb3-ns{margin-bottom:1rem}.swagger-ui .mb4-ns{margin-bottom:2rem}.swagger-ui .mb5-ns{margin-bottom:4rem}.swagger-ui .mb6-ns{margin-bottom:8rem}.swagger-ui .mb7-ns{margin-bottom:16rem}.swagger-ui .mt0-ns{margin-top:0}.swagger-ui .mt1-ns{margin-top:.25rem}.swagger-ui .mt2-ns{margin-top:.5rem}.swagger-ui .mt3-ns{margin-top:1rem}.swagger-ui .mt4-ns{margin-top:2rem}.swagger-ui .mt5-ns{margin-top:4rem}.swagger-ui .mt6-ns{margin-top:8rem}.swagger-ui .mt7-ns{margin-top:16rem}.swagger-ui .mv0-ns{margin-bottom:0;margin-top:0}.swagger-ui .mv1-ns{margin-bottom:.25rem;margin-top:.25rem}.swagger-ui .mv2-ns{margin-bottom:.5rem;margin-top:.5rem}.swagger-ui .mv3-ns{margin-bottom:1rem;margin-top:1rem}.swagger-ui .mv4-ns{margin-bottom:2rem;margin-top:2rem}.swagger-ui .mv5-ns{margin-bottom:4rem;margin-top:4rem}.swagger-ui .mv6-ns{margin-bottom:8rem;margin-top:8rem}.swagger-ui .mv7-ns{margin-bottom:16rem;margin-top:16rem}.swagger-ui .mh0-ns{margin-left:0;margin-right:0}.swagger-ui .mh1-ns{margin-left:.25rem;margin-right:.25rem}.swagger-ui .mh2-ns{margin-left:.5rem;margin-right:.5rem}.swagger-ui .mh3-ns{margin-left:1rem;margin-right:1rem}.swagger-ui .mh4-ns{margin-left:2rem;margin-right:2rem}.swagger-ui .mh5-ns{margin-left:4rem;margin-right:4rem}.swagger-ui .mh6-ns{margin-left:8rem;margin-right:8rem}.swagger-ui .mh7-ns{margin-left:16rem;margin-right:16rem}}@media screen and (min-width:30em) and (max-width:60em){.swagger-ui .pa0-m{padding:0}.swagger-ui .pa1-m{padding:.25rem}.swagger-ui .pa2-m{padding:.5rem}.swagger-ui .pa3-m{padding:1rem}.swagger-ui .pa4-m{padding:2rem}.swagger-ui .pa5-m{padding:4rem}.swagger-ui .pa6-m{padding:8rem}.swagger-ui .pa7-m{padding:16rem}.swagger-ui .pl0-m{padding-left:0}.swagger-ui .pl1-m{padding-left:.25rem}.swagger-ui .pl2-m{padding-left:.5rem}.swagger-ui .pl3-m{padding-left:1rem}.swagger-ui .pl4-m{padding-left:2rem}.swagger-ui .pl5-m{padding-left:4rem}.swagger-ui .pl6-m{padding-left:8rem}.swagger-ui .pl7-m{padding-left:16rem}.swagger-ui .pr0-m{padding-right:0}.swagger-ui .pr1-m{padding-right:.25rem}.swagger-ui .pr2-m{padding-right:.5rem}.swagger-ui .pr3-m{padding-right:1rem}.swagger-ui .pr4-m{padding-right:2rem}.swagger-ui .pr5-m{padding-right:4rem}.swagger-ui .pr6-m{padding-right:8rem}.swagger-ui .pr7-m{padding-right:16rem}.swagger-ui .pb0-m{padding-bottom:0}.swagger-ui .pb1-m{padding-bottom:.25rem}.swagger-ui .pb2-m{padding-bottom:.5rem}.swagger-ui .pb3-m{padding-bottom:1rem}.swagger-ui .pb4-m{padding-bottom:2rem}.swagger-ui .pb5-m{padding-bottom:4rem}.swagger-ui .pb6-m{padding-bottom:8rem}.swagger-ui .pb7-m{padding-bottom:16rem}.swagger-ui .pt0-m{padding-top:0}.swagger-ui .pt1-m{padding-top:.25rem}.swagger-ui .pt2-m{padding-top:.5rem}.swagger-ui .pt3-m{padding-top:1rem}.swagger-ui .pt4-m{padding-top:2rem}.swagger-ui .pt5-m{padding-top:4rem}.swagger-ui .pt6-m{padding-top:8rem}.swagger-ui .pt7-m{padding-top:16rem}.swagger-ui .pv0-m{padding-bottom:0;padding-top:0}.swagger-ui .pv1-m{padding-bottom:.25rem;padding-top:.25rem}.swagger-ui .pv2-m{padding-bottom:.5rem;padding-top:.5rem}.swagger-ui .pv3-m{padding-bottom:1rem;padding-top:1rem}.swagger-ui .pv4-m{padding-bottom:2rem;padding-top:2rem}.swagger-ui .pv5-m{padding-bottom:4rem;padding-top:4rem}.swagger-ui .pv6-m{padding-bottom:8rem;padding-top:8rem}.swagger-ui .pv7-m{padding-bottom:16rem;padding-top:16rem}.swagger-ui .ph0-m{padding-left:0;padding-right:0}.swagger-ui .ph1-m{padding-left:.25rem;padding-right:.25rem}.swagger-ui .ph2-m{padding-left:.5rem;padding-right:.5rem}.swagger-ui .ph3-m{padding-left:1rem;padding-right:1rem}.swagger-ui .ph4-m{padding-left:2rem;padding-right:2rem}.swagger-ui .ph5-m{padding-left:4rem;padding-right:4rem}.swagger-ui .ph6-m{padding-left:8rem;padding-right:8rem}.swagger-ui .ph7-m{padding-left:16rem;padding-right:16rem}.swagger-ui .ma0-m{margin:0}.swagger-ui .ma1-m{margin:.25rem}.swagger-ui .ma2-m{margin:.5rem}.swagger-ui .ma3-m{margin:1rem}.swagger-ui .ma4-m{margin:2rem}.swagger-ui .ma5-m{margin:4rem}.swagger-ui .ma6-m{margin:8rem}.swagger-ui .ma7-m{margin:16rem}.swagger-ui .ml0-m{margin-left:0}.swagger-ui .ml1-m{margin-left:.25rem}.swagger-ui .ml2-m{margin-left:.5rem}.swagger-ui .ml3-m{margin-left:1rem}.swagger-ui .ml4-m{margin-left:2rem}.swagger-ui .ml5-m{margin-left:4rem}.swagger-ui .ml6-m{margin-left:8rem}.swagger-ui .ml7-m{margin-left:16rem}.swagger-ui .mr0-m{margin-right:0}.swagger-ui .mr1-m{margin-right:.25rem}.swagger-ui .mr2-m{margin-right:.5rem}.swagger-ui .mr3-m{margin-right:1rem}.swagger-ui .mr4-m{margin-right:2rem}.swagger-ui .mr5-m{margin-right:4rem}.swagger-ui .mr6-m{margin-right:8rem}.swagger-ui .mr7-m{margin-right:16rem}.swagger-ui .mb0-m{margin-bottom:0}.swagger-ui .mb1-m{margin-bottom:.25rem}.swagger-ui .mb2-m{margin-bottom:.5rem}.swagger-ui .mb3-m{margin-bottom:1rem}.swagger-ui .mb4-m{margin-bottom:2rem}.swagger-ui .mb5-m{margin-bottom:4rem}.swagger-ui .mb6-m{margin-bottom:8rem}.swagger-ui .mb7-m{margin-bottom:16rem}.swagger-ui .mt0-m{margin-top:0}.swagger-ui .mt1-m{margin-top:.25rem}.swagger-ui .mt2-m{margin-top:.5rem}.swagger-ui .mt3-m{margin-top:1rem}.swagger-ui .mt4-m{margin-top:2rem}.swagger-ui .mt5-m{margin-top:4rem}.swagger-ui .mt6-m{margin-top:8rem}.swagger-ui .mt7-m{margin-top:16rem}.swagger-ui .mv0-m{margin-bottom:0;margin-top:0}.swagger-ui .mv1-m{margin-bottom:.25rem;margin-top:.25rem}.swagger-ui .mv2-m{margin-bottom:.5rem;margin-top:.5rem}.swagger-ui .mv3-m{margin-bottom:1rem;margin-top:1rem}.swagger-ui .mv4-m{margin-bottom:2rem;margin-top:2rem}.swagger-ui .mv5-m{margin-bottom:4rem;margin-top:4rem}.swagger-ui .mv6-m{margin-bottom:8rem;margin-top:8rem}.swagger-ui .mv7-m{margin-bottom:16rem;margin-top:16rem}.swagger-ui .mh0-m{margin-left:0;margin-right:0}.swagger-ui .mh1-m{margin-left:.25rem;margin-right:.25rem}.swagger-ui .mh2-m{margin-left:.5rem;margin-right:.5rem}.swagger-ui .mh3-m{margin-left:1rem;margin-right:1rem}.swagger-ui .mh4-m{margin-left:2rem;margin-right:2rem}.swagger-ui .mh5-m{margin-left:4rem;margin-right:4rem}.swagger-ui .mh6-m{margin-left:8rem;margin-right:8rem}.swagger-ui .mh7-m{margin-left:16rem;margin-right:16rem}}@media screen and (min-width:60em){.swagger-ui .pa0-l{padding:0}.swagger-ui .pa1-l{padding:.25rem}.swagger-ui .pa2-l{padding:.5rem}.swagger-ui .pa3-l{padding:1rem}.swagger-ui .pa4-l{padding:2rem}.swagger-ui .pa5-l{padding:4rem}.swagger-ui .pa6-l{padding:8rem}.swagger-ui .pa7-l{padding:16rem}.swagger-ui .pl0-l{padding-left:0}.swagger-ui .pl1-l{padding-left:.25rem}.swagger-ui .pl2-l{padding-left:.5rem}.swagger-ui .pl3-l{padding-left:1rem}.swagger-ui .pl4-l{padding-left:2rem}.swagger-ui .pl5-l{padding-left:4rem}.swagger-ui .pl6-l{padding-left:8rem}.swagger-ui .pl7-l{padding-left:16rem}.swagger-ui .pr0-l{padding-right:0}.swagger-ui .pr1-l{padding-right:.25rem}.swagger-ui .pr2-l{padding-right:.5rem}.swagger-ui .pr3-l{padding-right:1rem}.swagger-ui .pr4-l{padding-right:2rem}.swagger-ui .pr5-l{padding-right:4rem}.swagger-ui .pr6-l{padding-right:8rem}.swagger-ui .pr7-l{padding-right:16rem}.swagger-ui .pb0-l{padding-bottom:0}.swagger-ui .pb1-l{padding-bottom:.25rem}.swagger-ui .pb2-l{padding-bottom:.5rem}.swagger-ui .pb3-l{padding-bottom:1rem}.swagger-ui .pb4-l{padding-bottom:2rem}.swagger-ui .pb5-l{padding-bottom:4rem}.swagger-ui .pb6-l{padding-bottom:8rem}.swagger-ui .pb7-l{padding-bottom:16rem}.swagger-ui .pt0-l{padding-top:0}.swagger-ui .pt1-l{padding-top:.25rem}.swagger-ui .pt2-l{padding-top:.5rem}.swagger-ui .pt3-l{padding-top:1rem}.swagger-ui .pt4-l{padding-top:2rem}.swagger-ui .pt5-l{padding-top:4rem}.swagger-ui .pt6-l{padding-top:8rem}.swagger-ui .pt7-l{padding-top:16rem}.swagger-ui .pv0-l{padding-bottom:0;padding-top:0}.swagger-ui .pv1-l{padding-bottom:.25rem;padding-top:.25rem}.swagger-ui .pv2-l{padding-bottom:.5rem;padding-top:.5rem}.swagger-ui .pv3-l{padding-bottom:1rem;padding-top:1rem}.swagger-ui .pv4-l{padding-bottom:2rem;padding-top:2rem}.swagger-ui .pv5-l{padding-bottom:4rem;padding-top:4rem}.swagger-ui .pv6-l{padding-bottom:8rem;padding-top:8rem}.swagger-ui .pv7-l{padding-bottom:16rem;padding-top:16rem}.swagger-ui .ph0-l{padding-left:0;padding-right:0}.swagger-ui .ph1-l{padding-left:.25rem;padding-right:.25rem}.swagger-ui .ph2-l{padding-left:.5rem;padding-right:.5rem}.swagger-ui .ph3-l{padding-left:1rem;padding-right:1rem}.swagger-ui .ph4-l{padding-left:2rem;padding-right:2rem}.swagger-ui .ph5-l{padding-left:4rem;padding-right:4rem}.swagger-ui .ph6-l{padding-left:8rem;padding-right:8rem}.swagger-ui .ph7-l{padding-left:16rem;padding-right:16rem}.swagger-ui .ma0-l{margin:0}.swagger-ui .ma1-l{margin:.25rem}.swagger-ui .ma2-l{margin:.5rem}.swagger-ui .ma3-l{margin:1rem}.swagger-ui .ma4-l{margin:2rem}.swagger-ui .ma5-l{margin:4rem}.swagger-ui .ma6-l{margin:8rem}.swagger-ui .ma7-l{margin:16rem}.swagger-ui .ml0-l{margin-left:0}.swagger-ui .ml1-l{margin-left:.25rem}.swagger-ui .ml2-l{margin-left:.5rem}.swagger-ui .ml3-l{margin-left:1rem}.swagger-ui .ml4-l{margin-left:2rem}.swagger-ui .ml5-l{margin-left:4rem}.swagger-ui .ml6-l{margin-left:8rem}.swagger-ui .ml7-l{margin-left:16rem}.swagger-ui .mr0-l{margin-right:0}.swagger-ui .mr1-l{margin-right:.25rem}.swagger-ui .mr2-l{margin-right:.5rem}.swagger-ui .mr3-l{margin-right:1rem}.swagger-ui .mr4-l{margin-right:2rem}.swagger-ui .mr5-l{margin-right:4rem}.swagger-ui .mr6-l{margin-right:8rem}.swagger-ui .mr7-l{margin-right:16rem}.swagger-ui .mb0-l{margin-bottom:0}.swagger-ui .mb1-l{margin-bottom:.25rem}.swagger-ui .mb2-l{margin-bottom:.5rem}.swagger-ui .mb3-l{margin-bottom:1rem}.swagger-ui .mb4-l{margin-bottom:2rem}.swagger-ui .mb5-l{margin-bottom:4rem}.swagger-ui .mb6-l{margin-bottom:8rem}.swagger-ui .mb7-l{margin-bottom:16rem}.swagger-ui .mt0-l{margin-top:0}.swagger-ui .mt1-l{margin-top:.25rem}.swagger-ui .mt2-l{margin-top:.5rem}.swagger-ui .mt3-l{margin-top:1rem}.swagger-ui .mt4-l{margin-top:2rem}.swagger-ui .mt5-l{margin-top:4rem}.swagger-ui .mt6-l{margin-top:8rem}.swagger-ui .mt7-l{margin-top:16rem}.swagger-ui .mv0-l{margin-bottom:0;margin-top:0}.swagger-ui .mv1-l{margin-bottom:.25rem;margin-top:.25rem}.swagger-ui .mv2-l{margin-bottom:.5rem;margin-top:.5rem}.swagger-ui .mv3-l{margin-bottom:1rem;margin-top:1rem}.swagger-ui .mv4-l{margin-bottom:2rem;margin-top:2rem}.swagger-ui .mv5-l{margin-bottom:4rem;margin-top:4rem}.swagger-ui .mv6-l{margin-bottom:8rem;margin-top:8rem}.swagger-ui .mv7-l{margin-bottom:16rem;margin-top:16rem}.swagger-ui .mh0-l{margin-left:0;margin-right:0}.swagger-ui .mh1-l{margin-left:.25rem;margin-right:.25rem}.swagger-ui .mh2-l{margin-left:.5rem;margin-right:.5rem}.swagger-ui .mh3-l{margin-left:1rem;margin-right:1rem}.swagger-ui .mh4-l{margin-left:2rem;margin-right:2rem}.swagger-ui .mh5-l{margin-left:4rem;margin-right:4rem}.swagger-ui .mh6-l{margin-left:8rem;margin-right:8rem}.swagger-ui .mh7-l{margin-left:16rem;margin-right:16rem}}.swagger-ui .na1{margin:-.25rem}.swagger-ui .na2{margin:-.5rem}.swagger-ui .na3{margin:-1rem}.swagger-ui .na4{margin:-2rem}.swagger-ui .na5{margin:-4rem}.swagger-ui .na6{margin:-8rem}.swagger-ui .na7{margin:-16rem}.swagger-ui .nl1{margin-left:-.25rem}.swagger-ui .nl2{margin-left:-.5rem}.swagger-ui .nl3{margin-left:-1rem}.swagger-ui .nl4{margin-left:-2rem}.swagger-ui .nl5{margin-left:-4rem}.swagger-ui .nl6{margin-left:-8rem}.swagger-ui .nl7{margin-left:-16rem}.swagger-ui .nr1{margin-right:-.25rem}.swagger-ui .nr2{margin-right:-.5rem}.swagger-ui .nr3{margin-right:-1rem}.swagger-ui .nr4{margin-right:-2rem}.swagger-ui .nr5{margin-right:-4rem}.swagger-ui .nr6{margin-right:-8rem}.swagger-ui .nr7{margin-right:-16rem}.swagger-ui .nb1{margin-bottom:-.25rem}.swagger-ui .nb2{margin-bottom:-.5rem}.swagger-ui .nb3{margin-bottom:-1rem}.swagger-ui .nb4{margin-bottom:-2rem}.swagger-ui .nb5{margin-bottom:-4rem}.swagger-ui .nb6{margin-bottom:-8rem}.swagger-ui .nb7{margin-bottom:-16rem}.swagger-ui .nt1{margin-top:-.25rem}.swagger-ui .nt2{margin-top:-.5rem}.swagger-ui .nt3{margin-top:-1rem}.swagger-ui .nt4{margin-top:-2rem}.swagger-ui .nt5{margin-top:-4rem}.swagger-ui .nt6{margin-top:-8rem}.swagger-ui .nt7{margin-top:-16rem}@media screen and (min-width:30em){.swagger-ui .na1-ns{margin:-.25rem}.swagger-ui .na2-ns{margin:-.5rem}.swagger-ui .na3-ns{margin:-1rem}.swagger-ui .na4-ns{margin:-2rem}.swagger-ui .na5-ns{margin:-4rem}.swagger-ui .na6-ns{margin:-8rem}.swagger-ui .na7-ns{margin:-16rem}.swagger-ui .nl1-ns{margin-left:-.25rem}.swagger-ui .nl2-ns{margin-left:-.5rem}.swagger-ui .nl3-ns{margin-left:-1rem}.swagger-ui .nl4-ns{margin-left:-2rem}.swagger-ui .nl5-ns{margin-left:-4rem}.swagger-ui .nl6-ns{margin-left:-8rem}.swagger-ui .nl7-ns{margin-left:-16rem}.swagger-ui .nr1-ns{margin-right:-.25rem}.swagger-ui .nr2-ns{margin-right:-.5rem}.swagger-ui .nr3-ns{margin-right:-1rem}.swagger-ui .nr4-ns{margin-right:-2rem}.swagger-ui .nr5-ns{margin-right:-4rem}.swagger-ui .nr6-ns{margin-right:-8rem}.swagger-ui .nr7-ns{margin-right:-16rem}.swagger-ui .nb1-ns{margin-bottom:-.25rem}.swagger-ui .nb2-ns{margin-bottom:-.5rem}.swagger-ui .nb3-ns{margin-bottom:-1rem}.swagger-ui .nb4-ns{margin-bottom:-2rem}.swagger-ui .nb5-ns{margin-bottom:-4rem}.swagger-ui .nb6-ns{margin-bottom:-8rem}.swagger-ui .nb7-ns{margin-bottom:-16rem}.swagger-ui .nt1-ns{margin-top:-.25rem}.swagger-ui .nt2-ns{margin-top:-.5rem}.swagger-ui .nt3-ns{margin-top:-1rem}.swagger-ui .nt4-ns{margin-top:-2rem}.swagger-ui .nt5-ns{margin-top:-4rem}.swagger-ui .nt6-ns{margin-top:-8rem}.swagger-ui .nt7-ns{margin-top:-16rem}}@media screen and (min-width:30em) and (max-width:60em){.swagger-ui .na1-m{margin:-.25rem}.swagger-ui .na2-m{margin:-.5rem}.swagger-ui .na3-m{margin:-1rem}.swagger-ui .na4-m{margin:-2rem}.swagger-ui .na5-m{margin:-4rem}.swagger-ui .na6-m{margin:-8rem}.swagger-ui .na7-m{margin:-16rem}.swagger-ui .nl1-m{margin-left:-.25rem}.swagger-ui .nl2-m{margin-left:-.5rem}.swagger-ui .nl3-m{margin-left:-1rem}.swagger-ui .nl4-m{margin-left:-2rem}.swagger-ui .nl5-m{margin-left:-4rem}.swagger-ui .nl6-m{margin-left:-8rem}.swagger-ui .nl7-m{margin-left:-16rem}.swagger-ui .nr1-m{margin-right:-.25rem}.swagger-ui .nr2-m{margin-right:-.5rem}.swagger-ui .nr3-m{margin-right:-1rem}.swagger-ui .nr4-m{margin-right:-2rem}.swagger-ui .nr5-m{margin-right:-4rem}.swagger-ui .nr6-m{margin-right:-8rem}.swagger-ui .nr7-m{margin-right:-16rem}.swagger-ui .nb1-m{margin-bottom:-.25rem}.swagger-ui .nb2-m{margin-bottom:-.5rem}.swagger-ui .nb3-m{margin-bottom:-1rem}.swagger-ui .nb4-m{margin-bottom:-2rem}.swagger-ui .nb5-m{margin-bottom:-4rem}.swagger-ui .nb6-m{margin-bottom:-8rem}.swagger-ui .nb7-m{margin-bottom:-16rem}.swagger-ui .nt1-m{margin-top:-.25rem}.swagger-ui .nt2-m{margin-top:-.5rem}.swagger-ui .nt3-m{margin-top:-1rem}.swagger-ui .nt4-m{margin-top:-2rem}.swagger-ui .nt5-m{margin-top:-4rem}.swagger-ui .nt6-m{margin-top:-8rem}.swagger-ui .nt7-m{margin-top:-16rem}}@media screen and (min-width:60em){.swagger-ui .na1-l{margin:-.25rem}.swagger-ui .na2-l{margin:-.5rem}.swagger-ui .na3-l{margin:-1rem}.swagger-ui .na4-l{margin:-2rem}.swagger-ui .na5-l{margin:-4rem}.swagger-ui .na6-l{margin:-8rem}.swagger-ui .na7-l{margin:-16rem}.swagger-ui .nl1-l{margin-left:-.25rem}.swagger-ui .nl2-l{margin-left:-.5rem}.swagger-ui .nl3-l{margin-left:-1rem}.swagger-ui .nl4-l{margin-left:-2rem}.swagger-ui .nl5-l{margin-left:-4rem}.swagger-ui .nl6-l{margin-left:-8rem}.swagger-ui .nl7-l{margin-left:-16rem}.swagger-ui .nr1-l{margin-right:-.25rem}.swagger-ui .nr2-l{margin-right:-.5rem}.swagger-ui .nr3-l{margin-right:-1rem}.swagger-ui .nr4-l{margin-right:-2rem}.swagger-ui .nr5-l{margin-right:-4rem}.swagger-ui .nr6-l{margin-right:-8rem}.swagger-ui .nr7-l{margin-right:-16rem}.swagger-ui .nb1-l{margin-bottom:-.25rem}.swagger-ui .nb2-l{margin-bottom:-.5rem}.swagger-ui .nb3-l{margin-bottom:-1rem}.swagger-ui .nb4-l{margin-bottom:-2rem}.swagger-ui .nb5-l{margin-bottom:-4rem}.swagger-ui .nb6-l{margin-bottom:-8rem}.swagger-ui .nb7-l{margin-bottom:-16rem}.swagger-ui .nt1-l{margin-top:-.25rem}.swagger-ui .nt2-l{margin-top:-.5rem}.swagger-ui .nt3-l{margin-top:-1rem}.swagger-ui .nt4-l{margin-top:-2rem}.swagger-ui .nt5-l{margin-top:-4rem}.swagger-ui .nt6-l{margin-top:-8rem}.swagger-ui .nt7-l{margin-top:-16rem}}.swagger-ui .collapse{border-collapse:collapse;border-spacing:0}.swagger-ui .striped--light-silver:nth-child(odd){background-color:#aaa}.swagger-ui .striped--moon-gray:nth-child(odd){background-color:#ccc}.swagger-ui .striped--light-gray:nth-child(odd){background-color:#eee}.swagger-ui .striped--near-white:nth-child(odd){background-color:#f4f4f4}.swagger-ui .stripe-light:nth-child(odd){background-color:#ffffff1a}.swagger-ui .stripe-dark:nth-child(odd){background-color:#0000001a}.swagger-ui .strike{text-decoration:line-through}.swagger-ui .underline{text-decoration:underline}.swagger-ui .no-underline{text-decoration:none}@media screen and (min-width:30em){.swagger-ui .strike-ns{text-decoration:line-through}.swagger-ui .underline-ns{text-decoration:underline}.swagger-ui .no-underline-ns{text-decoration:none}}@media screen and (min-width:30em) and (max-width:60em){.swagger-ui .strike-m{text-decoration:line-through}.swagger-ui .underline-m{text-decoration:underline}.swagger-ui .no-underline-m{text-decoration:none}}@media screen and (min-width:60em){.swagger-ui .strike-l{text-decoration:line-through}.swagger-ui .underline-l{text-decoration:underline}.swagger-ui .no-underline-l{text-decoration:none}}.swagger-ui .tl{text-align:left}.swagger-ui .tr{text-align:right}.swagger-ui .tc{text-align:center}.swagger-ui .tj{text-align:justify}@media screen and (min-width:30em){.swagger-ui .tl-ns{text-align:left}.swagger-ui .tr-ns{text-align:right}.swagger-ui .tc-ns{text-align:center}.swagger-ui .tj-ns{text-align:justify}}@media screen and (min-width:30em) and (max-width:60em){.swagger-ui .tl-m{text-align:left}.swagger-ui .tr-m{text-align:right}.swagger-ui .tc-m{text-align:center}.swagger-ui .tj-m{text-align:justify}}@media screen and (min-width:60em){.swagger-ui .tl-l{text-align:left}.swagger-ui .tr-l{text-align:right}.swagger-ui .tc-l{text-align:center}.swagger-ui .tj-l{text-align:justify}}.swagger-ui .ttc{text-transform:capitalize}.swagger-ui .ttl{text-transform:lowercase}.swagger-ui .ttu{text-transform:uppercase}.swagger-ui .ttn{text-transform:none}@media screen and (min-width:30em){.swagger-ui .ttc-ns{text-transform:capitalize}.swagger-ui .ttl-ns{text-transform:lowercase}.swagger-ui .ttu-ns{text-transform:uppercase}.swagger-ui .ttn-ns{text-transform:none}}@media screen and (min-width:30em) and (max-width:60em){.swagger-ui .ttc-m{text-transform:capitalize}.swagger-ui .ttl-m{text-transform:lowercase}.swagger-ui .ttu-m{text-transform:uppercase}.swagger-ui .ttn-m{text-transform:none}}@media screen and (min-width:60em){.swagger-ui .ttc-l{text-transform:capitalize}.swagger-ui .ttl-l{text-transform:lowercase}.swagger-ui .ttu-l{text-transform:uppercase}.swagger-ui .ttn-l{text-transform:none}}.swagger-ui .f-6,.swagger-ui .f-headline{font-size:6rem}.swagger-ui .f-5,.swagger-ui .f-subheadline{font-size:5rem}.swagger-ui .f1{font-size:3rem}.swagger-ui .f2{font-size:2.25rem}.swagger-ui .f3{font-size:1.5rem}.swagger-ui .f4{font-size:1.25rem}.swagger-ui .f5{font-size:1rem}.swagger-ui .f6{font-size:.875rem}.swagger-ui .f7{font-size:.75rem}@media screen and (min-width:30em){.swagger-ui .f-6-ns,.swagger-ui .f-headline-ns{font-size:6rem}.swagger-ui .f-5-ns,.swagger-ui .f-subheadline-ns{font-size:5rem}.swagger-ui .f1-ns{font-size:3rem}.swagger-ui .f2-ns{font-size:2.25rem}.swagger-ui .f3-ns{font-size:1.5rem}.swagger-ui .f4-ns{font-size:1.25rem}.swagger-ui .f5-ns{font-size:1rem}.swagger-ui .f6-ns{font-size:.875rem}.swagger-ui .f7-ns{font-size:.75rem}}@media screen and (min-width:30em) and (max-width:60em){.swagger-ui .f-6-m,.swagger-ui .f-headline-m{font-size:6rem}.swagger-ui .f-5-m,.swagger-ui .f-subheadline-m{font-size:5rem}.swagger-ui .f1-m{font-size:3rem}.swagger-ui .f2-m{font-size:2.25rem}.swagger-ui .f3-m{font-size:1.5rem}.swagger-ui .f4-m{font-size:1.25rem}.swagger-ui .f5-m{font-size:1rem}.swagger-ui .f6-m{font-size:.875rem}.swagger-ui .f7-m{font-size:.75rem}}@media screen and (min-width:60em){.swagger-ui .f-6-l,.swagger-ui .f-headline-l{font-size:6rem}.swagger-ui .f-5-l,.swagger-ui .f-subheadline-l{font-size:5rem}.swagger-ui .f1-l{font-size:3rem}.swagger-ui .f2-l{font-size:2.25rem}.swagger-ui .f3-l{font-size:1.5rem}.swagger-ui .f4-l{font-size:1.25rem}.swagger-ui .f5-l{font-size:1rem}.swagger-ui .f6-l{font-size:.875rem}.swagger-ui .f7-l{font-size:.75rem}}.swagger-ui .measure{max-width:30em}.swagger-ui .measure-wide{max-width:34em}.swagger-ui .measure-narrow{max-width:20em}.swagger-ui .indent{margin-bottom:0;margin-top:0;text-indent:1em}.swagger-ui .small-caps{font-feature-settings:"smcp";font-variant:small-caps}.swagger-ui .truncate{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}@media screen and (min-width:30em){.swagger-ui .measure-ns{max-width:30em}.swagger-ui .measure-wide-ns{max-width:34em}.swagger-ui .measure-narrow-ns{max-width:20em}.swagger-ui .indent-ns{margin-bottom:0;margin-top:0;text-indent:1em}.swagger-ui .small-caps-ns{font-feature-settings:"smcp";font-variant:small-caps}.swagger-ui .truncate-ns{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}}@media screen and (min-width:30em) and (max-width:60em){.swagger-ui .measure-m{max-width:30em}.swagger-ui .measure-wide-m{max-width:34em}.swagger-ui .measure-narrow-m{max-width:20em}.swagger-ui .indent-m{margin-bottom:0;margin-top:0;text-indent:1em}.swagger-ui .small-caps-m{font-feature-settings:"smcp";font-variant:small-caps}.swagger-ui .truncate-m{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}}@media screen and (min-width:60em){.swagger-ui .measure-l{max-width:30em}.swagger-ui .measure-wide-l{max-width:34em}.swagger-ui .measure-narrow-l{max-width:20em}.swagger-ui .indent-l{margin-bottom:0;margin-top:0;text-indent:1em}.swagger-ui .small-caps-l{font-feature-settings:"smcp";font-variant:small-caps}.swagger-ui .truncate-l{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}}.swagger-ui .overflow-container{overflow-y:scroll}.swagger-ui .center{margin-left:auto;margin-right:auto}.swagger-ui .mr-auto{margin-right:auto}.swagger-ui .ml-auto{margin-left:auto}@media screen and (min-width:30em){.swagger-ui .center-ns{margin-left:auto;margin-right:auto}.swagger-ui .mr-auto-ns{margin-right:auto}.swagger-ui .ml-auto-ns{margin-left:auto}}@media screen and (min-width:30em) and (max-width:60em){.swagger-ui .center-m{margin-left:auto;margin-right:auto}.swagger-ui .mr-auto-m{margin-right:auto}.swagger-ui .ml-auto-m{margin-left:auto}}@media screen and (min-width:60em){.swagger-ui .center-l{margin-left:auto;margin-right:auto}.swagger-ui .mr-auto-l{margin-right:auto}.swagger-ui .ml-auto-l{margin-left:auto}}.swagger-ui .clip{clip:rect(1px 1px 1px 1px);clip:rect(1px,1px,1px,1px);position:fixed!important;_position:absolute!important}@media screen and (min-width:30em){.swagger-ui .clip-ns{clip:rect(1px 1px 1px 1px);clip:rect(1px,1px,1px,1px);position:fixed!important;_position:absolute!important}}@media screen and (min-width:30em) and (max-width:60em){.swagger-ui .clip-m{clip:rect(1px 1px 1px 1px);clip:rect(1px,1px,1px,1px);position:fixed!important;_position:absolute!important}}@media screen and (min-width:60em){.swagger-ui .clip-l{clip:rect(1px 1px 1px 1px);clip:rect(1px,1px,1px,1px);position:fixed!important;_position:absolute!important}}.swagger-ui .ws-normal{white-space:normal}.swagger-ui .nowrap{white-space:nowrap}.swagger-ui .pre{white-space:pre}@media screen and (min-width:30em){.swagger-ui .ws-normal-ns{white-space:normal}.swagger-ui .nowrap-ns{white-space:nowrap}.swagger-ui .pre-ns{white-space:pre}}@media screen and (min-width:30em) and (max-width:60em){.swagger-ui .ws-normal-m{white-space:normal}.swagger-ui .nowrap-m{white-space:nowrap}.swagger-ui .pre-m{white-space:pre}}@media screen and (min-width:60em){.swagger-ui .ws-normal-l{white-space:normal}.swagger-ui .nowrap-l{white-space:nowrap}.swagger-ui .pre-l{white-space:pre}}.swagger-ui .v-base{vertical-align:baseline}.swagger-ui .v-mid{vertical-align:middle}.swagger-ui .v-top{vertical-align:top}.swagger-ui .v-btm{vertical-align:bottom}@media screen and (min-width:30em){.swagger-ui .v-base-ns{vertical-align:baseline}.swagger-ui .v-mid-ns{vertical-align:middle}.swagger-ui .v-top-ns{vertical-align:top}.swagger-ui .v-btm-ns{vertical-align:bottom}}@media screen and (min-width:30em) and (max-width:60em){.swagger-ui .v-base-m{vertical-align:baseline}.swagger-ui .v-mid-m{vertical-align:middle}.swagger-ui .v-top-m{vertical-align:top}.swagger-ui .v-btm-m{vertical-align:bottom}}@media screen and (min-width:60em){.swagger-ui .v-base-l{vertical-align:baseline}.swagger-ui .v-mid-l{vertical-align:middle}.swagger-ui .v-top-l{vertical-align:top}.swagger-ui .v-btm-l{vertical-align:bottom}}.swagger-ui .dim{opacity:1;transition:opacity .15s ease-in}.swagger-ui .dim:focus,.swagger-ui .dim:hover{opacity:.5;transition:opacity .15s ease-in}.swagger-ui .dim:active{opacity:.8;transition:opacity .15s ease-out}.swagger-ui .glow{transition:opacity .15s ease-in}.swagger-ui .glow:focus,.swagger-ui .glow:hover{opacity:1;transition:opacity .15s ease-in}.swagger-ui .hide-child .child{opacity:0;transition:opacity .15s ease-in}.swagger-ui .hide-child:active .child,.swagger-ui .hide-child:focus .child,.swagger-ui .hide-child:hover .child{opacity:1;transition:opacity .15s ease-in}.swagger-ui .underline-hover:focus,.swagger-ui .underline-hover:hover{text-decoration:underline}.swagger-ui .grow{-moz-osx-font-smoothing:grayscale;backface-visibility:hidden;transform:translateZ(0);transition:transform .25s ease-out}.swagger-ui .grow:focus,.swagger-ui .grow:hover{transform:scale(1.05)}.swagger-ui .grow:active{transform:scale(.9)}.swagger-ui .grow-large{-moz-osx-font-smoothing:grayscale;backface-visibility:hidden;transform:translateZ(0);transition:transform .25s ease-in-out}.swagger-ui .grow-large:focus,.swagger-ui .grow-large:hover{transform:scale(1.2)}.swagger-ui .grow-large:active{transform:scale(.95)}.swagger-ui .pointer:hover{cursor:pointer}.swagger-ui .shadow-hover{cursor:pointer;position:relative;transition:all .5s cubic-bezier(.165,.84,.44,1)}.swagger-ui .shadow-hover:after{border-radius:inherit;box-shadow:0 0 16px 2px #0003;content:"";height:100%;left:0;opacity:0;position:absolute;top:0;transition:opacity .5s cubic-bezier(.165,.84,.44,1);width:100%;z-index:-1}.swagger-ui .shadow-hover:focus:after,.swagger-ui .shadow-hover:hover:after{opacity:1}.swagger-ui .bg-animate,.swagger-ui .bg-animate:focus,.swagger-ui .bg-animate:hover{transition:background-color .15s ease-in-out}.swagger-ui .z-0{z-index:0}.swagger-ui .z-1{z-index:1}.swagger-ui .z-2{z-index:2}.swagger-ui .z-3{z-index:3}.swagger-ui .z-4{z-index:4}.swagger-ui .z-5{z-index:5}.swagger-ui .z-999{z-index:999}.swagger-ui .z-9999{z-index:9999}.swagger-ui .z-max{z-index:2147483647}.swagger-ui .z-inherit{z-index:inherit}.swagger-ui .z-initial{z-index:auto}.swagger-ui .z-unset{z-index:unset}.swagger-ui .nested-copy-line-height ol,.swagger-ui .nested-copy-line-height p,.swagger-ui .nested-copy-line-height ul{line-height:1.5}.swagger-ui .nested-headline-line-height h1,.swagger-ui .nested-headline-line-height h2,.swagger-ui .nested-headline-line-height h3,.swagger-ui .nested-headline-line-height h4,.swagger-ui .nested-headline-line-height h5,.swagger-ui .nested-headline-line-height h6{line-height:1.25}.swagger-ui .nested-list-reset ol,.swagger-ui .nested-list-reset ul{list-style-type:none;margin-left:0;padding-left:0}.swagger-ui .nested-copy-indent p+p{margin-bottom:0;margin-top:0;text-indent:.1em}.swagger-ui .nested-copy-seperator p+p{margin-top:1.5em}.swagger-ui .nested-img img{display:block;max-width:100%;width:100%}.swagger-ui .nested-links a{color:#357edd;transition:color .15s ease-in}.swagger-ui .nested-links a:focus,.swagger-ui .nested-links a:hover{color:#96ccff;transition:color .15s ease-in}.swagger-ui .wrapper{box-sizing:border-box;margin:0 auto;max-width:1460px;padding:0 20px;width:100%}.swagger-ui .opblock-tag-section{display:flex;flex-direction:column}.swagger-ui .try-out.btn-group{display:flex;flex:.1 2 auto;padding:0}.swagger-ui .try-out__btn{margin-left:1.25rem}.swagger-ui .opblock-tag{align-items:center;border-bottom:1px solid rgba(59,65,81,.3);cursor:pointer;display:flex;padding:10px 20px 10px 10px;transition:all .2s}.swagger-ui .opblock-tag:hover{background:rgba(0,0,0,.02)}.swagger-ui .opblock-tag{color:#3b4151;font-family:sans-serif;font-size:24px;margin:0 0 5px}.swagger-ui .opblock-tag.no-desc span{flex:1}.swagger-ui .opblock-tag svg{transition:all .4s}.swagger-ui .opblock-tag small{color:#3b4151;flex:2;font-family:sans-serif;font-size:14px;font-weight:400;padding:0 10px}.swagger-ui .opblock-tag>div{flex:1 1 150px;font-weight:400;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.swagger-ui .parameter__type{color:#3b4151;font-family:monospace;font-size:12px;font-weight:600;padding:5px 0}.swagger-ui .parameter-controls{margin-top:.75em}.swagger-ui .examples__title{display:block;font-size:1.1em;font-weight:700;margin-bottom:.75em}.swagger-ui .examples__section{margin-top:1.5em}.swagger-ui .examples__section-header{font-size:.9rem;font-weight:700;margin-bottom:.5rem}.swagger-ui .examples-select{display:inline-block;margin-bottom:.75em}.swagger-ui .examples-select .examples-select-element{width:100%}.swagger-ui .examples-select__section-label{font-size:.9rem;font-weight:700;margin-right:.5rem}.swagger-ui .example__section{margin-top:1.5em}.swagger-ui .example__section-header{font-size:.9rem;font-weight:700;margin-bottom:.5rem}.swagger-ui .view-line-link{cursor:pointer;margin:0 5px;position:relative;top:3px;transition:all .5s;width:20px}.swagger-ui .opblock{border:1px solid #000;border-radius:4px;box-shadow:0 0 3px #00000030;margin:0 0 15px}.swagger-ui .opblock .tab-header{display:flex;flex:1}.swagger-ui .opblock .tab-header .tab-item{cursor:pointer;padding:0 40px}.swagger-ui .opblock .tab-header .tab-item:first-of-type{padding:0 40px 0 0}.swagger-ui .opblock .tab-header .tab-item.active h4 span{position:relative}.swagger-ui .opblock .tab-header .tab-item.active h4 span:after{background:gray;bottom:-15px;content:"";height:4px;left:50%;position:absolute;transform:translate(-50%);width:120%}.swagger-ui .opblock.is-open .opblock-summary{border-bottom:1px solid #000}.swagger-ui .opblock .opblock-section-header{align-items:center;background:hsla(0,0%,100%,.8);box-shadow:0 1px 2px #0000001a;display:flex;min-height:50px;padding:8px 20px}.swagger-ui .opblock .opblock-section-header>label{align-items:center;color:#3b4151;display:flex;font-family:sans-serif;font-size:12px;font-weight:700;margin:0 0 0 auto}.swagger-ui .opblock .opblock-section-header>label>span{padding:0 10px 0 0}.swagger-ui .opblock .opblock-section-header h4{color:#3b4151;flex:1;font-family:sans-serif;font-size:14px;margin:0}.swagger-ui .opblock .opblock-summary-method{background:#000;border-radius:3px;color:#fff;font-family:sans-serif;font-size:14px;font-weight:700;min-width:80px;padding:6px 0;text-align:center;text-shadow:0 1px 0 rgba(0,0,0,.1)}.swagger-ui .opblock .opblock-summary-operation-id,.swagger-ui .opblock .opblock-summary-path,.swagger-ui .opblock .opblock-summary-path__deprecated{align-items:center;color:#3b4151;display:flex;font-family:monospace;font-size:16px;font-weight:600;padding:0 10px;word-break:break-word}@media (max-width:768px){.swagger-ui .opblock .opblock-summary-operation-id,.swagger-ui .opblock .opblock-summary-path,.swagger-ui .opblock .opblock-summary-path__deprecated{font-size:12px}}.swagger-ui .opblock .opblock-summary-path{flex-shrink:0;max-width:calc(100% - 110px - 15rem)}.swagger-ui .opblock .opblock-summary-path__deprecated{text-decoration:line-through}.swagger-ui .opblock .opblock-summary-operation-id{font-size:14px}.swagger-ui .opblock .opblock-summary-description{color:#3b4151;flex:1 1 auto;font-family:sans-serif;font-size:13px;word-break:break-word}.swagger-ui .opblock .opblock-summary{align-items:center;cursor:pointer;display:flex;padding:5px}.swagger-ui .opblock .opblock-summary .view-line-link{cursor:pointer;margin:0;position:relative;top:2px;transition:all .5s;width:0}.swagger-ui .opblock .opblock-summary:hover .view-line-link{margin:0 5px;width:18px}.swagger-ui .opblock.opblock-post{background:rgba(73,204,144,.1);border-color:#49cc90}.swagger-ui .opblock.opblock-post .opblock-summary-method{background:#49cc90}.swagger-ui .opblock.opblock-post .opblock-summary{border-color:#49cc90}.swagger-ui .opblock.opblock-post .tab-header .tab-item.active h4 span:after{background:#49cc90}.swagger-ui .opblock.opblock-put{background:rgba(252,161,48,.1);border-color:#fca130}.swagger-ui .opblock.opblock-put .opblock-summary-method{background:#fca130}.swagger-ui .opblock.opblock-put .opblock-summary{border-color:#fca130}.swagger-ui .opblock.opblock-put .tab-header .tab-item.active h4 span:after{background:#fca130}.swagger-ui .opblock.opblock-delete{background:rgba(249,62,62,.1);border-color:#f93e3e}.swagger-ui .opblock.opblock-delete .opblock-summary-method{background:#f93e3e}.swagger-ui .opblock.opblock-delete .opblock-summary{border-color:#f93e3e}.swagger-ui .opblock.opblock-delete .tab-header .tab-item.active h4 span:after{background:#f93e3e}.swagger-ui .opblock.opblock-get{background:rgba(97,175,254,.1);border-color:#61affe}.swagger-ui .opblock.opblock-get .opblock-summary-method{background:#61affe}.swagger-ui .opblock.opblock-get .opblock-summary{border-color:#61affe}.swagger-ui .opblock.opblock-get .tab-header .tab-item.active h4 span:after{background:#61affe}.swagger-ui .opblock.opblock-patch{background:rgba(80,227,194,.1);border-color:#50e3c2}.swagger-ui .opblock.opblock-patch .opblock-summary-method{background:#50e3c2}.swagger-ui .opblock.opblock-patch .opblock-summary{border-color:#50e3c2}.swagger-ui .opblock.opblock-patch .tab-header .tab-item.active h4 span:after{background:#50e3c2}.swagger-ui .opblock.opblock-head{background:rgba(144,18,254,.1);border-color:#9012fe}.swagger-ui .opblock.opblock-head .opblock-summary-method{background:#9012fe}.swagger-ui .opblock.opblock-head .opblock-summary{border-color:#9012fe}.swagger-ui .opblock.opblock-head .tab-header .tab-item.active h4 span:after{background:#9012fe}.swagger-ui .opblock.opblock-options{background:rgba(13,90,167,.1);border-color:#0d5aa7}.swagger-ui .opblock.opblock-options .opblock-summary-method{background:#0d5aa7}.swagger-ui .opblock.opblock-options .opblock-summary{border-color:#0d5aa7}.swagger-ui .opblock.opblock-options .tab-header .tab-item.active h4 span:after{background:#0d5aa7}.swagger-ui .opblock.opblock-deprecated{background:hsla(0,0%,92%,.1);border-color:#ebebeb;opacity:.6}.swagger-ui .opblock.opblock-deprecated .opblock-summary-method{background:#ebebeb}.swagger-ui .opblock.opblock-deprecated .opblock-summary{border-color:#ebebeb}.swagger-ui .opblock.opblock-deprecated .tab-header .tab-item.active h4 span:after{background:#ebebeb}.swagger-ui .opblock .opblock-schemes{padding:8px 20px}.swagger-ui .opblock .opblock-schemes .schemes-title{padding:0 10px 0 0}.swagger-ui .filter .operation-filter-input{border:2px solid #d8dde7;margin:20px 0;padding:10px;width:100%}.swagger-ui .download-url-wrapper .failed,.swagger-ui .filter .failed{color:red}.swagger-ui .download-url-wrapper .loading,.swagger-ui .filter .loading{color:#aaa}.swagger-ui .model-example{margin-top:1em}.swagger-ui .tab{display:flex;list-style:none;padding:0}.swagger-ui .tab li{color:#3b4151;cursor:pointer;font-family:sans-serif;font-size:12px;min-width:60px;padding:0}.swagger-ui .tab li:first-of-type{padding-left:0;padding-right:12px;position:relative}.swagger-ui .tab li:first-of-type:after{background:rgba(0,0,0,.2);content:"";height:100%;position:absolute;right:6px;top:0;width:1px}.swagger-ui .tab li.active{font-weight:700}.swagger-ui .tab li button.tablinks{background:none;border:0;color:inherit;font-family:inherit;font-weight:inherit;padding:0}.swagger-ui .opblock-description-wrapper,.swagger-ui .opblock-external-docs-wrapper,.swagger-ui .opblock-title_normal{color:#3b4151;font-family:sans-serif;font-size:12px;margin:0 0 5px;padding:15px 20px}.swagger-ui .opblock-description-wrapper h4,.swagger-ui .opblock-external-docs-wrapper h4,.swagger-ui .opblock-title_normal h4{color:#3b4151;font-family:sans-serif;font-size:12px;margin:0 0 5px}.swagger-ui .opblock-description-wrapper p,.swagger-ui .opblock-external-docs-wrapper p,.swagger-ui .opblock-title_normal p{color:#3b4151;font-family:sans-serif;font-size:14px;margin:0}.swagger-ui .opblock-external-docs-wrapper h4{padding-left:0}.swagger-ui .execute-wrapper{padding:20px;text-align:right}.swagger-ui .execute-wrapper .btn{padding:8px 40px;width:100%}.swagger-ui .body-param-options{display:flex;flex-direction:column}.swagger-ui .body-param-options .body-param-edit{padding:10px 0}.swagger-ui .body-param-options label{padding:8px 0}.swagger-ui .body-param-options label select{margin:3px 0 0}.swagger-ui .responses-inner{padding:20px}.swagger-ui .responses-inner h4,.swagger-ui .responses-inner h5{color:#3b4151;font-family:sans-serif;font-size:12px;margin:10px 0 5px}.swagger-ui .responses-inner .curl{white-space:normal}.swagger-ui .response-col_status{color:#3b4151;font-family:sans-serif;font-size:14px}.swagger-ui .response-col_status .response-undocumented{color:#909090;font-family:monospace;font-size:11px;font-weight:600}.swagger-ui .response-col_links{color:#3b4151;font-family:sans-serif;font-size:14px;max-width:40em;padding-left:2em}.swagger-ui .response-col_links .response-undocumented{color:#909090;font-family:monospace;font-size:11px;font-weight:600}.swagger-ui .response-col_links .operation-link{margin-bottom:1.5em}.swagger-ui .response-col_links .operation-link .description{margin-bottom:.5em}.swagger-ui .opblock-body .opblock-loading-animation{display:block;margin:3em auto}.swagger-ui .opblock-body pre.microlight{word-wrap:break-word;background:#333;border-radius:4px;color:#fff;font-family:monospace;font-size:12px;font-weight:600;hyphens:auto;margin:0;padding:10px;white-space:pre-wrap;word-break:break-all;word-break:break-word}.swagger-ui .opblock-body pre.microlight .headerline{display:block}.swagger-ui .highlight-code{position:relative}.swagger-ui .highlight-code>.microlight{max-height:400px;min-height:6em;overflow-y:auto}.swagger-ui .highlight-code>.microlight code{white-space:pre-wrap!important;word-break:break-all}.swagger-ui .curl-command{position:relative}.swagger-ui .download-contents{align-items:center;background:#7d8293;border-radius:4px;bottom:10px;color:#fff;cursor:pointer;display:flex;font-family:sans-serif;font-size:14px;font-weight:600;height:30px;justify-content:center;padding:5px;position:absolute;right:10px;text-align:center}.swagger-ui .scheme-container{background:#fff;box-shadow:0 1px 2px #00000026;margin:0 0 20px;padding:30px 0}.swagger-ui .scheme-container .schemes{align-items:flex-end;display:flex}.swagger-ui .scheme-container .schemes>label{color:#3b4151;display:flex;flex-direction:column;font-family:sans-serif;font-size:12px;font-weight:700;margin:-20px 15px 0 0}.swagger-ui .scheme-container .schemes>label select{min-width:130px;text-transform:uppercase}.swagger-ui .loading-container{align-items:center;display:flex;flex-direction:column;justify-content:center;margin-top:1em;min-height:1px;padding:40px 0 60px}.swagger-ui .loading-container .loading{position:relative}.swagger-ui .loading-container .loading:after{color:#3b4151;content:"loading";font-family:sans-serif;font-size:10px;font-weight:700;left:50%;position:absolute;text-transform:uppercase;top:50%;transform:translate(-50%,-50%)}.swagger-ui .loading-container .loading:before{animation:rotation 1s linear infinite,opacity .5s;backface-visibility:hidden;border:2px solid rgba(85,85,85,.1);border-radius:100%;border-top-color:#0009;content:"";display:block;height:60px;left:50%;margin:-30px;opacity:1;position:absolute;top:50%;width:60px}@keyframes rotation{to{transform:rotate(1turn)}}.swagger-ui .response-controls{display:flex;padding-top:1em}.swagger-ui .response-control-media-type{margin-right:1em}.swagger-ui .response-control-media-type--accept-controller select{border-color:green}.swagger-ui .response-control-media-type__accept-message{color:green;font-size:.7em}.swagger-ui .response-control-examples__title,.swagger-ui .response-control-media-type__title{display:block;font-size:.7em;margin-bottom:.2em}@keyframes blinker{50%{opacity:0}}.swagger-ui .hidden{display:none}.swagger-ui .no-margin{border:none;height:auto;margin:0;padding:0}.swagger-ui .float-right{float:right}.swagger-ui .svg-assets{height:0;position:absolute;width:0}.swagger-ui section h3{color:#3b4151;font-family:sans-serif}.swagger-ui a.nostyle{display:inline}.swagger-ui a.nostyle,.swagger-ui a.nostyle:visited{color:inherit;cursor:pointer;text-decoration:inherit}.swagger-ui .fallback{color:#aaa;padding:1em}.swagger-ui .version-pragma{height:100%;padding:5em 0}.swagger-ui .version-pragma__message{display:flex;font-size:1.2em;height:100%;justify-content:center;line-height:1.5em;padding:0 .6em;text-align:center}.swagger-ui .version-pragma__message>div{flex:1;max-width:55ch}.swagger-ui .version-pragma__message code{background-color:#dedede;padding:4px 4px 2px;white-space:pre}.swagger-ui .opblock-link{font-weight:400}.swagger-ui .opblock-link.shown{font-weight:700}.swagger-ui span.token-string{color:#555}.swagger-ui span.token-not-formatted{color:#555;font-weight:700}.swagger-ui .btn{background:transparent;border:2px solid gray;border-radius:4px;box-shadow:0 1px 2px #0000001a;color:#3b4151;font-family:sans-serif;font-size:14px;font-weight:700;padding:5px 23px;transition:all .3s}.swagger-ui .btn.btn-sm{font-size:12px;padding:4px 23px}.swagger-ui .btn[disabled]{cursor:not-allowed;opacity:.3}.swagger-ui .btn:hover{box-shadow:0 0 5px #0000004d}.swagger-ui .btn.cancel{background-color:transparent;border-color:#ff6060;color:#ff6060;font-family:sans-serif}.swagger-ui .btn.authorize{background-color:transparent;border-color:#49cc90;color:#49cc90;display:inline;line-height:1}.swagger-ui .btn.authorize span{float:left;padding:4px 20px 0 0}.swagger-ui .btn.authorize svg{fill:#49cc90}.swagger-ui .btn.execute{background-color:#4990e2;border-color:#4990e2;color:#fff}.swagger-ui .btn-group{display:flex;padding:30px}.swagger-ui .btn-group .btn{flex:1}.swagger-ui .btn-group .btn:first-child{border-radius:4px 0 0 4px}.swagger-ui .btn-group .btn:last-child{border-radius:0 4px 4px 0}.swagger-ui .authorization__btn{background:none;border:none;padding:0 0 0 10px}.swagger-ui .authorization__btn.locked{opacity:1}.swagger-ui .authorization__btn.unlocked{opacity:.4}.swagger-ui .model-box-control,.swagger-ui .models-control,.swagger-ui .opblock-summary-control{all:inherit;border-bottom:0;cursor:pointer;flex:1;padding:0}.swagger-ui .model-box-control:focus,.swagger-ui .models-control:focus,.swagger-ui .opblock-summary-control:focus{outline:auto}.swagger-ui .expand-methods,.swagger-ui .expand-operation{background:none;border:none}.swagger-ui .expand-methods svg,.swagger-ui .expand-operation svg{height:20px;width:20px}.swagger-ui .expand-methods{padding:0 10px}.swagger-ui .expand-methods:hover svg{fill:#404040}.swagger-ui .expand-methods svg{fill:#707070;transition:all .3s}.swagger-ui button{cursor:pointer}.swagger-ui button.invalid{animation:shake .4s 1;background:#feebeb;border-color:#f93e3e}.swagger-ui .copy-to-clipboard{align-items:center;background:#7d8293;border:none;border-radius:4px;bottom:10px;display:flex;height:30px;justify-content:center;position:absolute;right:100px;width:30px}.swagger-ui .copy-to-clipboard button{background:url('data:image/svg+xml;charset=utf-8,<svg xmlns="http://www.w3.org/2000/svg" width="16" height="15" aria-hidden="true"><path fill="%23fff" fill-rule="evenodd" d="M4 12h4v1H4v-1zm5-6H4v1h5V6zm2 3V7l-3 3 3 3v-2h5V9h-5zM6.5 8H4v1h2.5V8zM4 11h2.5v-1H4v1zm9 1h1v2c-.02.28-.11.52-.3.7-.19.18-.42.28-.7.3H3c-.55 0-1-.45-1-1V3c0-.55.45-1 1-1h3c0-1.11.89-2 2-2 1.11 0 2 .89 2 2h3c.55 0 1 .45 1 1v5h-1V5H3v9h10v-2zM4 4h8c0-.55-.45-1-1-1h-1c-.55 0-1-.45-1-1s-.45-1-1-1-1 .45-1 1-.45 1-1 1H5c-.55 0-1 .45-1 1z"/></svg>') 50% no-repeat;border:none;flex-grow:1;flex-shrink:1;height:25px}.swagger-ui .curl-command .copy-to-clipboard{bottom:5px;height:20px;right:10px;width:20px}.swagger-ui .curl-command .copy-to-clipboard button{height:18px}.swagger-ui select{appearance:none;background:#f7f7f7 url('data:image/svg+xml;charset=utf-8,<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 20 20"><path d="M13.418 7.859a.695.695 0 0 1 .978 0 .68.68 0 0 1 0 .969l-3.908 3.83a.697.697 0 0 1-.979 0l-3.908-3.83a.68.68 0 0 1 0-.969.695.695 0 0 1 .978 0L10 11l3.418-3.141z"/></svg>') right 10px center no-repeat;background-size:20px;border:2px solid #41444e;border-radius:4px;box-shadow:0 1px 2px #00000040;color:#3b4151;font-family:sans-serif;font-size:14px;font-weight:700;padding:5px 40px 5px 10px}.swagger-ui select[multiple]{background:#f7f7f7;margin:5px 0;padding:5px}.swagger-ui select.invalid{animation:shake .4s 1;background:#feebeb;border-color:#f93e3e}.swagger-ui .opblock-body select{min-width:230px}@media (max-width:768px){.swagger-ui .opblock-body select{min-width:180px}}.swagger-ui label{color:#3b4151;font-family:sans-serif;font-size:12px;font-weight:700;margin:0 0 5px}@media (max-width:768px){.swagger-ui input[type=email],.swagger-ui input[type=file],.swagger-ui input[type=password],.swagger-ui input[type=search],.swagger-ui input[type=text]{max-width:175px}}.swagger-ui input[type=email],.swagger-ui input[type=file],.swagger-ui input[type=password],.swagger-ui input[type=search],.swagger-ui input[type=text],.swagger-ui textarea{background:#fff;border:1px solid #d9d9d9;border-radius:4px;margin:5px 0;min-width:100px;padding:8px 10px}.swagger-ui input[type=email].invalid,.swagger-ui input[type=file].invalid,.swagger-ui input[type=password].invalid,.swagger-ui input[type=search].invalid,.swagger-ui input[type=text].invalid,.swagger-ui textarea.invalid{animation:shake .4s 1;background:#feebeb;border-color:#f93e3e}.swagger-ui input[disabled],.swagger-ui select[disabled],.swagger-ui textarea[disabled]{background-color:#fafafa;color:#888;cursor:not-allowed}.swagger-ui select[disabled]{border-color:#888}.swagger-ui textarea[disabled]{background-color:#41444e;color:#fff}@keyframes shake{10%,90%{transform:translate(-1px)}20%,80%{transform:translate(2px)}30%,50%,70%{transform:translate(-4px)}40%,60%{transform:translate(4px)}}.swagger-ui textarea{background:hsla(0,0%,100%,.8);border:none;border-radius:4px;color:#3b4151;font-family:monospace;font-size:12px;font-weight:600;min-height:280px;outline:none;padding:10px;width:100%}.swagger-ui textarea:focus{border:2px solid #61affe}.swagger-ui textarea.curl{background:#41444e;border-radius:4px;color:#fff;font-family:monospace;font-size:12px;font-weight:600;margin:0;min-height:100px;padding:10px;resize:none}.swagger-ui .checkbox{color:#303030;padding:5px 0 10px;transition:opacity .5s}.swagger-ui .checkbox label{display:flex}.swagger-ui .checkbox p{color:#3b4151;font-family:monospace;font-style:italic;font-weight:400!important;font-weight:600;margin:0!important}.swagger-ui .checkbox input[type=checkbox]{display:none}.swagger-ui .checkbox input[type=checkbox]+label>.item{background:#e8e8e8;border-radius:1px;box-shadow:0 0 0 2px #e8e8e8;cursor:pointer;display:inline-block;flex:none;height:16px;margin:0 8px 0 0;padding:5px;position:relative;top:3px;width:16px}.swagger-ui .checkbox input[type=checkbox]+label>.item:active{transform:scale(.9)}.swagger-ui .checkbox input[type=checkbox]:checked+label>.item{background:#e8e8e8 url('data:image/svg+xml;charset=utf-8,<svg width="10" height="8" viewBox="3 7 10 8" xmlns="http://www.w3.org/2000/svg"><path fill="%2341474E" fill-rule="evenodd" d="M6.333 15 3 11.667l1.333-1.334 2 2L11.667 7 13 8.333z"/></svg>') 50% no-repeat}.swagger-ui .dialog-ux{inset:0;position:fixed;z-index:9999}.swagger-ui .dialog-ux .backdrop-ux{background:rgba(0,0,0,.8);inset:0;position:fixed}.swagger-ui .dialog-ux .modal-ux{background:#fff;border:1px solid #ebebeb;border-radius:4px;box-shadow:0 10px 30px #0003;left:50%;max-width:650px;min-width:300px;position:absolute;top:50%;transform:translate(-50%,-50%);width:100%;z-index:9999}.swagger-ui .dialog-ux .modal-ux-content{max-height:540px;overflow-y:auto;padding:20px}.swagger-ui .dialog-ux .modal-ux-content p{color:#41444e;color:#3b4151;font-family:sans-serif;font-size:12px;margin:0 0 5px}.swagger-ui .dialog-ux .modal-ux-content h4{color:#3b4151;font-family:sans-serif;font-size:18px;font-weight:600;margin:15px 0 0}.swagger-ui .dialog-ux .modal-ux-header{align-items:center;border-bottom:1px solid #ebebeb;display:flex;padding:12px 0}.swagger-ui .dialog-ux .modal-ux-header .close-modal{appearance:none;background:none;border:none;padding:0 10px}.swagger-ui .dialog-ux .modal-ux-header h3{color:#3b4151;flex:1;font-family:sans-serif;font-size:20px;font-weight:600;margin:0;padding:0 20px}.swagger-ui .model{color:#3b4151;font-family:monospace;font-size:12px;font-weight:300;font-weight:600}.swagger-ui .model .deprecated span,.swagger-ui .model .deprecated td{color:#a0a0a0!important}.swagger-ui .model .deprecated>td:first-of-type{text-decoration:line-through}.swagger-ui .model-toggle{cursor:pointer;display:inline-block;font-size:10px;margin:auto .3em;position:relative;top:6px;transform:rotate(90deg);transform-origin:50% 50%;transition:transform .15s ease-in}.swagger-ui .model-toggle.collapsed{transform:rotate(0)}.swagger-ui .model-toggle:after{background:url('data:image/svg+xml;charset=utf-8,<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24"><path d="M10 6 8.59 7.41 13.17 12l-4.58 4.59L10 18l6-6z"/></svg>') 50% no-repeat;background-size:100%;content:"";display:block;height:20px;width:20px}.swagger-ui .model-jump-to-path{cursor:pointer;position:relative}.swagger-ui .model-jump-to-path .view-line-link{cursor:pointer;position:absolute;top:-.4em}.swagger-ui .model-title{position:relative}.swagger-ui .model-title:hover .model-hint{visibility:visible}.swagger-ui .model-hint{background:rgba(0,0,0,.7);border-radius:4px;color:#ebebeb;padding:.1em .5em;position:absolute;top:-1.8em;visibility:hidden;white-space:nowrap}.swagger-ui .model p{margin:0 0 1em}.swagger-ui .model .property{color:#999;font-style:italic}.swagger-ui .model .property.primitive{color:#6b6b6b}.swagger-ui table.model tr.description{color:#666;font-weight:400}.swagger-ui table.model tr.description td:first-child,.swagger-ui table.model tr.property-row.required td:first-child{font-weight:700}.swagger-ui table.model tr.property-row td{vertical-align:top}.swagger-ui table.model tr.property-row td:first-child{padding-right:.2em}.swagger-ui table.model tr.property-row .star{color:red}.swagger-ui table.model tr.extension{color:#777}.swagger-ui table.model tr.extension td:last-child{vertical-align:top}.swagger-ui section.models{border:1px solid rgba(59,65,81,.3);border-radius:4px;margin:30px 0}.swagger-ui section.models .pointer{cursor:pointer}.swagger-ui section.models.is-open{padding:0 0 20px}.swagger-ui section.models.is-open h4{border-bottom:1px solid rgba(59,65,81,.3);margin:0 0 5px}.swagger-ui section.models h4{align-items:center;color:#606060;cursor:pointer;display:flex;font-family:sans-serif;font-size:16px;margin:0;padding:10px 20px 10px 10px;transition:all .2s}.swagger-ui section.models h4 svg{transition:all .4s}.swagger-ui section.models h4 span{flex:1}.swagger-ui section.models h4:hover{background:rgba(0,0,0,.02)}.swagger-ui section.models h5{color:#707070;font-family:sans-serif;font-size:16px;margin:0 0 10px}.swagger-ui section.models .model-jump-to-path{position:relative;top:5px}.swagger-ui section.models .model-container{background:rgba(0,0,0,.05);border-radius:4px;margin:0 20px 15px;position:relative;transition:all .5s}.swagger-ui section.models .model-container:hover{background:rgba(0,0,0,.07)}.swagger-ui section.models .model-container:first-of-type{margin:20px}.swagger-ui section.models .model-container:last-of-type{margin:0 20px}.swagger-ui section.models .model-container .models-jump-to-path{opacity:.65;position:absolute;right:5px;top:8px}.swagger-ui section.models .model-box{background:none}.swagger-ui .model-box{background:rgba(0,0,0,.1);border-radius:4px;display:inline-block;padding:10px}.swagger-ui .model-box .model-jump-to-path{position:relative;top:4px}.swagger-ui .model-box.deprecated{opacity:.5}.swagger-ui .model-title{color:#505050;font-family:sans-serif;font-size:16px}.swagger-ui .model-title img{bottom:0;margin-left:1em;position:relative}.swagger-ui .model-deprecated-warning{color:#f93e3e;font-family:sans-serif;font-size:16px;font-weight:600;margin-right:1em}.swagger-ui span>span.model .brace-close{padding:0 0 0 10px}.swagger-ui .prop-name{display:inline-block;margin-right:1em}.swagger-ui .prop-type{color:#55a}.swagger-ui .prop-enum{display:block}.swagger-ui .prop-format{color:#606060}.swagger-ui .servers>label{color:#3b4151;font-family:sans-serif;font-size:12px;margin:-20px 15px 0 0}.swagger-ui .servers>label select{max-width:100%;min-width:130px}.swagger-ui .servers h4.message{padding-bottom:2em}.swagger-ui .servers table tr{width:30em}.swagger-ui .servers table td{display:inline-block;max-width:15em;padding-bottom:10px;padding-top:10px;vertical-align:middle}.swagger-ui .servers table td:first-of-type{padding-right:1em}.swagger-ui .servers table td input{height:100%;width:100%}.swagger-ui .servers .computed-url{margin:2em 0}.swagger-ui .servers .computed-url code{display:inline-block;font-size:16px;margin:0 1em;padding:4px}.swagger-ui .servers-title{font-size:12px;font-weight:700}.swagger-ui .operation-servers h4.message{margin-bottom:2em}.swagger-ui table{border-collapse:collapse;padding:0 10px;width:100%}.swagger-ui table.model tbody tr td{padding:0;vertical-align:top}.swagger-ui table.model tbody tr td:first-of-type{padding:0 0 0 2em;width:174px}.swagger-ui table.headers td{color:#3b4151;font-family:monospace;font-size:12px;font-weight:300;font-weight:600;vertical-align:middle}.swagger-ui table.headers .header-example{color:#999;font-style:italic}.swagger-ui table tbody tr td{padding:10px 0 0;vertical-align:top}.swagger-ui table tbody tr td:first-of-type{min-width:6em;padding:10px 0}.swagger-ui table thead tr td,.swagger-ui table thead tr th{border-bottom:1px solid rgba(59,65,81,.2);color:#3b4151;font-family:sans-serif;font-size:12px;font-weight:700;padding:12px 0;text-align:left}.swagger-ui .parameters-col_description{margin-bottom:2em;width:99%}.swagger-ui .parameters-col_description input[type=text]{max-width:340px;width:100%}.swagger-ui .parameters-col_description select{border-width:1px}.swagger-ui .parameter__name{color:#3b4151;font-family:sans-serif;font-size:16px;font-weight:400;margin-right:.75em}.swagger-ui .parameter__name.required{font-weight:700}.swagger-ui .parameter__name.required span{color:red}.swagger-ui .parameter__name.required:after{color:#f009;content:"required";font-size:10px;padding:5px;position:relative;top:-6px}.swagger-ui .parameter__extension,.swagger-ui .parameter__in{color:gray;font-family:monospace;font-size:12px;font-style:italic;font-weight:600}.swagger-ui .parameter__deprecated{color:red;font-family:monospace;font-size:12px;font-style:italic;font-weight:600}.swagger-ui .parameter__empty_value_toggle{display:block;font-size:13px;padding-bottom:12px;padding-top:5px}.swagger-ui .parameter__empty_value_toggle input{margin-right:7px}.swagger-ui .parameter__empty_value_toggle.disabled{opacity:.7}.swagger-ui .table-container{padding:20px}.swagger-ui .response-col_description{width:99%}.swagger-ui .response-col_links{min-width:6em}.swagger-ui .response__extension{color:gray;font-family:monospace;font-size:12px;font-style:italic;font-weight:600}.swagger-ui .topbar{background-color:#1b1b1b;padding:10px 0}.swagger-ui .topbar .topbar-wrapper,.swagger-ui .topbar a{align-items:center;display:flex}.swagger-ui .topbar a{color:#fff;flex:1;font-family:sans-serif;font-size:1.5em;font-weight:700;max-width:300px;text-decoration:none}.swagger-ui .topbar a span{margin:0;padding:0 10px}.swagger-ui .topbar .download-url-wrapper{display:flex;flex:3;justify-content:flex-end}.swagger-ui .topbar .download-url-wrapper input[type=text]{border:2px solid #62a03f;border-radius:4px 0 0 4px;margin:0;outline:none;width:100%}.swagger-ui .topbar .download-url-wrapper .select-label{align-items:center;color:#f0f0f0;display:flex;margin:0;max-width:600px;width:100%}.swagger-ui .topbar .download-url-wrapper .select-label span{flex:1;font-size:16px;padding:0 10px 0 0;text-align:right}.swagger-ui .topbar .download-url-wrapper .select-label select{border:2px solid #62a03f;box-shadow:none;flex:2;outline:none;width:100%}.swagger-ui .topbar .download-url-wrapper .download-url-button{background:#62a03f;border:none;border-radius:0 4px 4px 0;color:#fff;font-family:sans-serif;font-size:16px;font-weight:700;padding:4px 30px}.swagger-ui .info{margin:50px 0}.swagger-ui .info.failed-config{margin-left:auto;margin-right:auto;max-width:880px;text-align:center}.swagger-ui .info hgroup.main{margin:0 0 20px}.swagger-ui .info hgroup.main a{font-size:12px}.swagger-ui .info pre{font-size:14px}.swagger-ui .info li,.swagger-ui .info p,.swagger-ui .info table{color:#3b4151;font-family:sans-serif;font-size:14px}.swagger-ui .info h1,.swagger-ui .info h2,.swagger-ui .info h3,.swagger-ui .info h4,.swagger-ui .info h5{color:#3b4151;font-family:sans-serif}.swagger-ui .info a{color:#4990e2;font-family:sans-serif;font-size:14px;transition:all .4s}.swagger-ui .info a:hover{color:#1f69c0}.swagger-ui .info>div{margin:0 0 5px}.swagger-ui .info .base-url{color:#3b4151;font-family:monospace;font-size:12px;font-weight:300!important;font-weight:600;margin:0}.swagger-ui .info .title{color:#3b4151;font-family:sans-serif;font-size:36px;margin:0}.swagger-ui .info .title small{background:#7d8492;border-radius:57px;display:inline-block;font-size:10px;margin:0 0 0 5px;padding:2px 4px;position:relative;top:-5px;vertical-align:super}.swagger-ui .info .title small.version-stamp{background-color:#89bf04}.swagger-ui .info .title small pre{color:#fff;font-family:sans-serif;margin:0;padding:0}.swagger-ui .auth-btn-wrapper{display:flex;justify-content:center;padding:10px 0}.swagger-ui .auth-btn-wrapper .btn-done{margin-right:1em}.swagger-ui .auth-wrapper{display:flex;flex:1;justify-content:flex-end}.swagger-ui .auth-wrapper .authorize{margin-right:10px;padding-right:20px}.swagger-ui .auth-container{border-bottom:1px solid #ebebeb;margin:0 0 10px;padding:10px 20px}.swagger-ui .auth-container:last-of-type{border:0;margin:0;padding:10px 20px}.swagger-ui .auth-container h4{margin:5px 0 15px!important}.swagger-ui .auth-container .wrapper{margin:0;padding:0}.swagger-ui .auth-container input[type=password],.swagger-ui .auth-container input[type=text]{min-width:230px}.swagger-ui .auth-container .errors{background-color:#fee;border-radius:4px;color:red;color:#3b4151;font-family:monospace;font-size:12px;font-weight:600;margin:1em;padding:10px}.swagger-ui .auth-container .errors b{margin-right:1em;text-transform:capitalize}.swagger-ui .scopes h2{color:#3b4151;font-family:sans-serif;font-size:14px}.swagger-ui .scopes h2 a{color:#4990e2;cursor:pointer;font-size:12px;padding-left:10px;text-decoration:underline}.swagger-ui .scope-def{padding:0 0 20px}.swagger-ui .errors-wrapper{animation:scaleUp .5s;background:rgba(249,62,62,.1);border:2px solid #f93e3e;border-radius:4px;margin:20px;padding:10px 20px}.swagger-ui .errors-wrapper .error-wrapper{margin:0 0 10px}.swagger-ui .errors-wrapper .errors h4{color:#3b4151;font-family:monospace;font-size:14px;font-weight:600;margin:0}.swagger-ui .errors-wrapper .errors small{color:#606060}.swagger-ui .errors-wrapper .errors .message{white-space:pre-line}.swagger-ui .errors-wrapper .errors .message.thrown{max-width:100%}.swagger-ui .errors-wrapper .errors .error-line{cursor:pointer;text-decoration:underline}.swagger-ui .errors-wrapper hgroup{align-items:center;display:flex}.swagger-ui .errors-wrapper hgroup h4{color:#3b4151;flex:1;font-family:sans-serif;font-size:20px;margin:0}@keyframes scaleUp{0%{opacity:0;transform:scale(.8)}to{opacity:1;transform:scale(1)}}.swagger-ui .Resizer.vertical.disabled{display:none}.swagger-ui .markdown p,.swagger-ui .markdown pre,.swagger-ui .renderedMarkdown p,.swagger-ui .renderedMarkdown pre{margin:1em auto;word-break:break-all;word-break:break-word}.swagger-ui .markdown pre,.swagger-ui .renderedMarkdown pre{background:none;color:#000;font-weight:400;padding:0;white-space:pre-wrap}.swagger-ui .markdown code,.swagger-ui .renderedMarkdown code{background:rgba(0,0,0,.05);border-radius:4px;color:#9012fe;font-family:monospace;font-size:14px;font-weight:600;padding:5px 7px}.swagger-ui .markdown pre>code,.swagger-ui .renderedMarkdown pre>code{display:block}.toast-center-center{top:50%;left:50%;transform:translate(-50%,-50%)}.toast-top-center{top:0;right:0;width:100%}.toast-bottom-center{bottom:0;right:0;width:100%}.toast-top-full-width{top:0;right:0;width:100%}.toast-bottom-full-width{bottom:0;right:0;width:100%}.toast-top-left{top:12px;left:12px}.toast-top-right{top:12px;right:12px}.toast-bottom-right{right:12px;bottom:12px}.toast-bottom-left{bottom:12px;left:12px}.toast-title{font-weight:700}.toast-message{word-wrap:break-word}.toast-message a,.toast-message label{color:#fff}.toast-message a:hover{color:#ccc;text-decoration:none}.toast-close-button{position:relative;right:-.3em;top:-.3em;float:right;font-size:20px;font-weight:700;color:#fff;text-shadow:0 1px 0 #ffffff}.toast-close-button:hover,.toast-close-button:focus{color:#000;text-decoration:none;cursor:pointer;opacity:.4}button.toast-close-button{padding:0;cursor:pointer;background:transparent;border:0}.toast-container{pointer-events:none;position:fixed;z-index:999999}.toast-container *{box-sizing:border-box}.toast-container .ngx-toastr{position:relative;overflow:hidden;margin:0 0 6px;padding:15px 15px 15px 50px;width:300px;border-radius:3px;background-position:15px center;background-repeat:no-repeat;background-size:24px;box-shadow:0 0 12px #999;color:#fff}.toast-container .ngx-toastr:hover{box-shadow:0 0 12px #000;opacity:1;cursor:pointer}.toast-info{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0naHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmcnIHZpZXdCb3g9JzAgMCA1MTIgNTEyJyB3aWR0aD0nNTEyJyBoZWlnaHQ9JzUxMic+PHBhdGggZmlsbD0ncmdiKDI1NSwyNTUsMjU1KScgZD0nTTI1NiA4QzExOS4wNDMgOCA4IDExOS4wODMgOCAyNTZjMCAxMzYuOTk3IDExMS4wNDMgMjQ4IDI0OCAyNDhzMjQ4LTExMS4wMDMgMjQ4LTI0OEM1MDQgMTE5LjA4MyAzOTIuOTU3IDggMjU2IDh6bTAgMTEwYzIzLjE5NiAwIDQyIDE4LjgwNCA0MiA0MnMtMTguODA0IDQyLTQyIDQyLTQyLTE4LjgwNC00Mi00MiAxOC44MDQtNDIgNDItNDJ6bTU2IDI1NGMwIDYuNjI3LTUuMzczIDEyLTEyIDEyaC04OGMtNi42MjcgMC0xMi01LjM3My0xMi0xMnYtMjRjMC02LjYyNyA1LjM3My0xMiAxMi0xMmgxMnYtNjRoLTEyYy02LjYyNyAwLTEyLTUuMzczLTEyLTEydi0yNGMwLTYuNjI3IDUuMzczLTEyIDEyLTEyaDY0YzYuNjI3IDAgMTIgNS4zNzMgMTIgMTJ2MTAwaDEyYzYuNjI3IDAgMTIgNS4zNzMgMTIgMTJ2MjR6Jy8+PC9zdmc+)}.toast-error{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0naHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmcnIHZpZXdCb3g9JzAgMCA1MTIgNTEyJyB3aWR0aD0nNTEyJyBoZWlnaHQ9JzUxMic+PHBhdGggZmlsbD0ncmdiKDI1NSwyNTUsMjU1KScgZD0nTTI1NiA4QzExOSA4IDggMTE5IDggMjU2czExMSAyNDggMjQ4IDI0OCAyNDgtMTExIDI0OC0yNDhTMzkzIDggMjU2IDh6bTEyMS42IDMxMy4xYzQuNyA0LjcgNC43IDEyLjMgMCAxN0wzMzggMzc3LjZjLTQuNyA0LjctMTIuMyA0LjctMTcgMEwyNTYgMzEybC02NS4xIDY1LjZjLTQuNyA0LjctMTIuMyA0LjctMTcgMEwxMzQuNCAzMzhjLTQuNy00LjctNC43LTEyLjMgMC0xN2w2NS42LTY1LTY1LjYtNjUuMWMtNC43LTQuNy00LjctMTIuMyAwLTE3bDM5LjYtMzkuNmM0LjctNC43IDEyLjMtNC43IDE3IDBsNjUgNjUuNyA2NS4xLTY1LjZjNC43LTQuNyAxMi4zLTQuNyAxNyAwbDM5LjYgMzkuNmM0LjcgNC43IDQuNyAxMi4zIDAgMTdMMzEyIDI1Nmw2NS42IDY1LjF6Jy8+PC9zdmc+)}.toast-success{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0naHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmcnIHZpZXdCb3g9JzAgMCA1MTIgNTEyJyB3aWR0aD0nNTEyJyBoZWlnaHQ9JzUxMic+PHBhdGggZmlsbD0ncmdiKDI1NSwyNTUsMjU1KScgZD0nTTE3My44OTggNDM5LjQwNGwtMTY2LjQtMTY2LjRjLTkuOTk3LTkuOTk3LTkuOTk3LTI2LjIwNiAwLTM2LjIwNGwzNi4yMDMtMzYuMjA0YzkuOTk3LTkuOTk4IDI2LjIwNy05Ljk5OCAzNi4yMDQgMEwxOTIgMzEyLjY5IDQzMi4wOTUgNzIuNTk2YzkuOTk3LTkuOTk3IDI2LjIwNy05Ljk5NyAzNi4yMDQgMGwzNi4yMDMgMzYuMjA0YzkuOTk3IDkuOTk3IDkuOTk3IDI2LjIwNiAwIDM2LjIwNGwtMjk0LjQgMjk0LjQwMWMtOS45OTggOS45OTctMjYuMjA3IDkuOTk3LTM2LjIwNC0uMDAxeicvPjwvc3ZnPg==)}.toast-warning{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0naHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmcnIHZpZXdCb3g9JzAgMCA1NzYgNTEyJyB3aWR0aD0nNTc2JyBoZWlnaHQ9JzUxMic+PHBhdGggZmlsbD0ncmdiKDI1NSwyNTUsMjU1KScgZD0nTTU2OS41MTcgNDQwLjAxM0M1ODcuOTc1IDQ3Mi4wMDcgNTY0LjgwNiA1MTIgNTI3Ljk0IDUxMkg0OC4wNTRjLTM2LjkzNyAwLTU5Ljk5OS00MC4wNTUtNDEuNTc3LTcxLjk4N0wyNDYuNDIzIDIzLjk4NWMxOC40NjctMzIuMDA5IDY0LjcyLTMxLjk1MSA4My4xNTQgMGwyMzkuOTQgNDE2LjAyOHpNMjg4IDM1NGMtMjUuNDA1IDAtNDYgMjAuNTk1LTQ2IDQ2czIwLjU5NSA0NiA0NiA0NiA0Ni0yMC41OTUgNDYtNDYtMjAuNTk1LTQ2LTQ2LTQ2em0tNDMuNjczLTE2NS4zNDZsNy40MTggMTM2Yy4zNDcgNi4zNjQgNS42MDkgMTEuMzQ2IDExLjk4MiAxMS4zNDZoNDguNTQ2YzYuMzczIDAgMTEuNjM1LTQuOTgyIDExLjk4Mi0xMS4zNDZsNy40MTgtMTM2Yy4zNzUtNi44NzQtNS4wOTgtMTIuNjU0LTExLjk4Mi0xMi42NTRoLTYzLjM4M2MtNi44ODQgMC0xMi4zNTYgNS43OC0xMS45ODEgMTIuNjU0eicvPjwvc3ZnPg==)}.toast-container.toast-top-center .ngx-toastr,.toast-container.toast-bottom-center .ngx-toastr{width:300px;margin-left:auto;margin-right:auto}.toast-container.toast-top-full-width .ngx-toastr,.toast-container.toast-bottom-full-width .ngx-toastr{width:96%;margin-left:auto;margin-right:auto}.ngx-toastr{background-color:#030303;pointer-events:auto}.toast-success{background-color:#51a351}.toast-error{background-color:#bd362f}.toast-info{background-color:#2f96b4}.toast-warning{background-color:#f89406}.toast-progress{position:absolute;left:0;bottom:0;height:4px;background-color:#000;opacity:.4}@media all and (max-width: 240px){.toast-container .ngx-toastr.div{padding:8px 8px 8px 50px;width:11em}.toast-container .toast-close-button{right:-.2em;top:-.2em}}@media all and (min-width: 241px) and (max-width: 480px){.toast-container .ngx-toastr.div{padding:8px 8px 8px 50px;width:18em}.toast-container .toast-close-button{right:-.2em;top:-.2em}}@media all and (min-width: 481px) and (max-width: 768px){.toast-container .ngx-toastr.div{padding:15px 15px 15px 50px;width:25em}}@charset "UTF-8";.tree-children.tree-children-no-padding{padding-left:0}.tree-children{padding-left:20px;overflow:hidden}.node-drop-slot{display:block;height:2px}.node-drop-slot.is-dragging-over{background:#ddffee;height:20px;border:2px dotted #888}.toggle-children-wrapper-expanded .toggle-children{transform:rotate(90deg)}.toggle-children-wrapper-collapsed .toggle-children{transform:rotate(0)}.toggle-children-wrapper{padding:2px 3px 5px 1px}.toggle-children{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAASCAYAAABSO15qAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAABAhpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuNi1jMDY3IDc5LjE1Nzc0NywgMjAxNS8wMy8zMC0yMzo0MDo0MiAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wTU09Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9tbS8iIHhtbG5zOnN0UmVmPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvc1R5cGUvUmVzb3VyY2VSZWYjIiB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iIHhtbG5zOmRjPSJodHRwOi8vcHVybC5vcmcvZGMvZWxlbWVudHMvMS4xLyIgeG1wTU06T3JpZ2luYWxEb2N1bWVudElEPSJ1dWlkOjY1RTYzOTA2ODZDRjExREJBNkUyRDg4N0NFQUNCNDA3IiB4bXBNTTpEb2N1bWVudElEPSJ4bXAuZGlkOkYzRkRFQjcxODUzNTExRTU4RTQwRkQwODFEOUZEMEE3IiB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOkYzRkRFQjcwODUzNTExRTU4RTQwRkQwODFEOUZEMEE3IiB4bXA6Q3JlYXRvclRvb2w9IkFkb2JlIFBob3Rvc2hvcCBDQyAyMDE1IChNYWNpbnRvc2gpIj4gPHhtcE1NOkRlcml2ZWRGcm9tIHN0UmVmOmluc3RhbmNlSUQ9InhtcC5paWQ6MTk5NzA1OGEtZDI3OC00NDZkLWE4ODgtNGM4MGQ4YWI1NzNmIiBzdFJlZjpkb2N1bWVudElEPSJhZG9iZTpkb2NpZDpwaG90b3Nob3A6YzRkZmQxMGMtY2NlNS0xMTc4LWE5OGQtY2NkZmM5ODk5YWYwIi8+IDxkYzp0aXRsZT4gPHJkZjpBbHQ+IDxyZGY6bGkgeG1sOmxhbmc9IngtZGVmYXVsdCI+Z2x5cGhpY29uczwvcmRmOmxpPiA8L3JkZjpBbHQ+IDwvZGM6dGl0bGU+IDwvcmRmOkRlc2NyaXB0aW9uPiA8L3JkZjpSREY+IDwveDp4bXBtZXRhPiA8P3hwYWNrZXQgZW5kPSJyIj8+5iogFwAAAGhJREFUeNpiYGBgKABigf///zOQg0EARH4A4gZyDIIZ8B/JoAJKDIDhB0CcQIkBRBtEyABkgxwoMQCGD6AbRKoBGAYxQgXIBRuZGKgAKPIC3QLxArnRSHZCIjspk52ZKMrOFBUoAAEGAKnq593MQAZtAAAAAElFTkSuQmCC);height:8px;width:9px;background-size:contain;display:inline-block;position:relative;top:1px;background-repeat:no-repeat;background-position:center}.toggle-children-placeholder{display:inline-block;height:10px;width:10px;position:relative;top:1px;padding-right:3px}.node-content-wrapper{display:inline-block;padding:2px 5px;border-radius:2px;transition:background-color .15s,box-shadow .15s}.node-wrapper{display:flex;align-items:flex-start}.node-content-wrapper-active,.node-content-wrapper.node-content-wrapper-active:hover,.node-content-wrapper-active.node-content-wrapper-focused{background:#beebff}.node-content-wrapper-focused{background:#e7f4f9}.node-content-wrapper:hover{background:#f7fbff}.node-content-wrapper-active,.node-content-wrapper-focused,.node-content-wrapper:hover{box-shadow:inset 0 0 1px #999}.node-content-wrapper.is-dragging-over{background:#ddffee;box-shadow:inset 0 0 1px #999}.node-content-wrapper.is-dragging-over-disabled{opacity:.5}tree-viewport{-webkit-tap-highlight-color:transparent;height:100%;overflow:auto;display:block}.tree-children{padding-left:20px}.empty-tree-drop-slot .node-drop-slot{height:20px;min-width:100px}.angular-tree-component{width:100%;position:relative;display:inline-block;cursor:pointer;-webkit-touch-callout:none;user-select:none}tree-root .angular-tree-component-rtl{direction:rtl}tree-root .angular-tree-component-rtl .toggle-children-wrapper-collapsed .toggle-children{transform:rotate(180deg)!important}tree-root .angular-tree-component-rtl .tree-children{padding-right:20px;padding-left:0}tree-node-checkbox{padding:1px}:root{--white: #fff;--gray-100: #f8f9fa;--gray-200: #e9ecef;--gray-300: #dee2e6;--gray-400: #ced4da;--gray-500: #adb5bd;--gray-600: #6c757d;--gray-700: #495057;--gray-800: #343a40;--gray-900: #212529;--black: #000;--blue: #007bff;--indigo: #6610f2;--purple: #6f42c1;--pink: #a94442;--red: #dc3545;--orange: #fd7e14;--yellow: #d48200;--green: #008a00;--teal: #20c997;--cyan: #17a2b8;--barley-white: #fcecba;--primary: #25828e;--primary-500: #2b99a8;--secondary: #374249;--success: #008a00;--info: #25828e;--warning: #d48200;--danger: #dc3545;--light: #f8f9fa;--dark: #343a40;--green-300: #6ec664;--cyan-300: #009596;--purple-300: #a18fff;--light-blue-300: #35caed;--gold-300: #f4c145;--light-green-300: #ace12e;--accent: #25828e;--warning-dark: #fd7e14;--fg-color-over-dark-bg: #fff;--fg-hover-color-over-dark-bg: #adb5bd;--body-color-bright: #f8f9fa;--body-bg: #fff;--body-color: #212529;--body-bg-alt: #e9ecef;--health-color-error: #dc3545;--health-color-healthy: #008a00;--health-color-warning: #d48200;--health-color-warning-800: #9d6d10;--chart-color-red: #dc3545;--chart-color-blue: #06c;--chart-color-orange: #ef9234;--chart-color-yellow: #f6d173;--chart-color-green: #008a00;--chart-color-gray: #ededed;--chart-color-cyan: #2b99a8;--chart-color-purple: #3c3d99;--chart-color-center-text: #151515;--chart-color-center-text-description: #72767b;--chart-color-tooltip-background: #000;--chart-danger: #c9190b;--font-family-sans-serif: "Helvetica Neue", Helvetica, Arial, "Noto Sans", sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji";--card-cap-bg: #f8f9fa;--grid-gutter-width: 30px;--datatable-divider-color: rgba(0, 0, 0, .09);--nav-tabs-margin-bottom: 1rem;--tooltip-color: #fff;--tooltip-bg: #212529;--tooltip-opacity: 1;--screen-sm-min: 576px;--screen-md-min: 768px;--screen-lg-min: 992px;--screen-xl-min: 1200px;--screen-xs-max:575px;--screen-sm-max:767px;--screen-md-max:991px;--screen-lg-max:1199px;--navbar-height: 43px}/*!
+ * Bootstrap v5.0.0 (https://getbootstrap.com/)
+ * Copyright 2011-2021 The Bootstrap Authors
+ * Copyright 2011-2021 Twitter, Inc.
+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
+ */:root{--bs-blue: #007bff;--bs-indigo: #6610f2;--bs-purple: #6f42c1;--bs-pink: #a94442;--bs-red: #dc3545;--bs-orange: #fd7e14;--bs-yellow: #d48200;--bs-green: #008a00;--bs-teal: #20c997;--bs-cyan: #17a2b8;--bs-white: #fff;--bs-gray: #6c757d;--bs-gray-dark: #343a40;--bs-accent: #25828e;--bs-warning-dark: #fd7e14;--bs-primary: #25828e;--bs-secondary: #374249;--bs-success: #008a00;--bs-info: #25828e;--bs-warning: #d48200;--bs-danger: #dc3545;--bs-light: #f8f9fa;--bs-dark: #343a40;--bs-font-sans-serif: "Helvetica Neue", Helvetica, Arial, "Noto Sans", sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji";--bs-font-monospace: SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace;--bs-gradient: linear-gradient(180deg, rgba(255, 255, 255, .15), rgba(255, 255, 255, 0))}*,*:before,*:after{box-sizing:border-box}@media (prefers-reduced-motion: no-preference){:root{scroll-behavior:smooth}}body{margin:0;font-family:var(--bs-font-sans-serif);font-size:1rem;font-weight:400;line-height:1.5;color:#212529;background-color:#fff;-webkit-text-size-adjust:100%;-webkit-tap-highlight-color:rgba(0,0,0,0)}hr{margin:1rem 0;color:inherit;background-color:currentColor;border:0;opacity:.25}hr:not([size]){height:1px}h6,.h6,h5,.h5,h4,.h4,h3,.h3,h2,.h2,h1,.h1{margin-top:0;margin-bottom:.5rem;font-weight:500;line-height:1.2}h1,.h1{font-size:calc(1.375rem + 1.5vw)}@media (min-width: 1200px){h1,.h1{font-size:2.5rem}}h2,.h2{font-size:calc(1.325rem + .9vw)}@media (min-width: 1200px){h2,.h2{font-size:2rem}}h3,.h3{font-size:calc(1.3rem + .6vw)}@media (min-width: 1200px){h3,.h3{font-size:1.75rem}}h4,.h4{font-size:calc(1.275rem + .3vw)}@media (min-width: 1200px){h4,.h4{font-size:1.5rem}}h5,.h5{font-size:1.25rem}h6,.h6{font-size:1rem}p{margin-top:0;margin-bottom:1rem}abbr[title],abbr[data-bs-original-title]{text-decoration:underline dotted;cursor:help;text-decoration-skip-ink:none}address{margin-bottom:1rem;font-style:normal;line-height:inherit}ol,ul{padding-left:2rem}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,.small{font-size:.875em}mark,.mark{padding:.2em;background-color:#fcf8e3}sub,sup{position:relative;font-size:.75em;line-height:0;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}a{color:#25828e;text-decoration:underline}a:hover{color:#1e6872}a:not([href]):not([class]),a:not([href]):not([class]):hover{color:inherit;text-decoration:none}pre,code,kbd,samp{font-family:var(--bs-font-monospace);font-size:1em;direction:ltr;unicode-bidi:bidi-override}pre{display:block;margin-top:0;margin-bottom:1rem;overflow:auto;font-size:.875em}pre code{font-size:inherit;color:inherit;word-break:normal}code{font-size:.875em;color:#a94442;word-wrap:break-word}a>code{color:inherit}kbd{padding:.2rem .4rem;font-size:.875em;color:#fff;background-color:#212529;border-radius:.2rem}kbd kbd{padding:0;font-size:1em;font-weight:700}figure{margin:0 0 1rem}img,svg{vertical-align:middle}table{caption-side:bottom;border-collapse:collapse}caption{padding-top:.5rem;padding-bottom:.5rem;color:#6c757d;text-align:left}th{text-align:inherit;text-align:-webkit-match-parent}thead,tbody,tfoot,tr,td,th{border-color:inherit;border-style:solid;border-width:0}label{display:inline-block}button{border-radius:0}button:focus:not(:focus-visible){outline:0}input,button,select,optgroup,textarea{margin:0;font-family:inherit;font-size:inherit;line-height:inherit}button,select{text-transform:none}[role=button]{cursor:pointer}select{word-wrap:normal}select:disabled{opacity:1}[list]::-webkit-calendar-picker-indicator{display:none}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}::-moz-focus-inner{padding:0;border-style:none}textarea{resize:vertical}fieldset{min-width:0;padding:0;margin:0;border:0}legend{float:left;width:100%;padding:0;margin-bottom:.5rem;font-size:calc(1.275rem + .3vw);line-height:inherit}@media (min-width: 1200px){legend{font-size:1.5rem}}legend+*{clear:left}::-webkit-datetime-edit-fields-wrapper,::-webkit-datetime-edit-text,::-webkit-datetime-edit-minute,::-webkit-datetime-edit-hour-field,::-webkit-datetime-edit-day-field,::-webkit-datetime-edit-month-field,::-webkit-datetime-edit-year-field{padding:0}::-webkit-inner-spin-button{height:auto}[type=search]{outline-offset:-2px;-webkit-appearance:textfield}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-color-swatch-wrapper{padding:0}::file-selector-button{font:inherit}::-webkit-file-upload-button{font:inherit;-webkit-appearance:button}output{display:inline-block}iframe{border:0}summary{display:list-item;cursor:pointer}progress{vertical-align:baseline}[hidden]{display:none!important}.lead{font-size:1.25rem;font-weight:300}.display-1{font-size:calc(1.625rem + 4.5vw);font-weight:300;line-height:1.2}@media (min-width: 1200px){.display-1{font-size:5rem}}.display-2{font-size:calc(1.575rem + 3.9vw);font-weight:300;line-height:1.2}@media (min-width: 1200px){.display-2{font-size:4.5rem}}.display-3{font-size:calc(1.525rem + 3.3vw);font-weight:300;line-height:1.2}@media (min-width: 1200px){.display-3{font-size:4rem}}.display-4{font-size:calc(1.475rem + 2.7vw);font-weight:300;line-height:1.2}@media (min-width: 1200px){.display-4{font-size:3.5rem}}.display-5{font-size:calc(1.425rem + 2.1vw);font-weight:300;line-height:1.2}@media (min-width: 1200px){.display-5{font-size:3rem}}.display-6{font-size:calc(1.375rem + 1.5vw);font-weight:300;line-height:1.2}@media (min-width: 1200px){.display-6{font-size:2.5rem}}.list-unstyled,.list-inline{padding-left:0;list-style:none}.list-inline-item{display:inline-block}.list-inline-item:not(:last-child){margin-right:.5rem}.initialism{font-size:.875em;text-transform:uppercase}.blockquote{margin-bottom:1rem;font-size:1.25rem}.blockquote>:last-child{margin-bottom:0}.blockquote-footer{margin-top:-1rem;margin-bottom:1rem;font-size:.875em;color:#6c757d}.blockquote-footer:before{content:"\2014\a0"}.img-fluid{max-width:100%;height:auto}.img-thumbnail{padding:.25rem;background-color:#fff;border:1px solid #dee2e6;border-radius:.25rem;max-width:100%;height:auto}.figure{display:inline-block}.figure-img{margin-bottom:.5rem;line-height:1}.figure-caption{font-size:.875em;color:#6c757d}.container,.container-fluid,.container-xxl,.container-xl,.container-lg,.container-md,.container-sm{width:100%;padding-right:var(--bs-gutter-x, 15px);padding-left:var(--bs-gutter-x, 15px);margin-right:auto;margin-left:auto}@media (min-width: 576px){.container-sm,.container{max-width:540px}}@media (min-width: 768px){.container-md,.container-sm,.container{max-width:720px}}@media (min-width: 992px){.container-lg,.container-md,.container-sm,.container{max-width:960px}}@media (min-width: 1200px){.container-xl,.container-lg,.container-md,.container-sm,.container{max-width:1140px}}.container-2xl,.container-xl,.container-lg,.container-md,.container-sm,.container{max-width:1320px}.row,cd-about dl{--bs-gutter-x: 30px;--bs-gutter-y: 0;display:flex;flex-wrap:wrap;margin-top:calc(var(--bs-gutter-y) * -1);margin-right:calc(var(--bs-gutter-x) / -2);margin-left:calc(var(--bs-gutter-x) / -2)}.row>*,cd-about dl>*{flex-shrink:0;width:100%;max-width:100%;padding-right:calc(var(--bs-gutter-x) / 2);padding-left:calc(var(--bs-gutter-x) / 2);margin-top:var(--bs-gutter-y)}.col{flex:1 0 0%}.row-cols-auto>*{flex:0 0 auto;width:auto}.row-cols-1>*{flex:0 0 auto;width:100%}.row-cols-2>*{flex:0 0 auto;width:50%}.row-cols-3>*{flex:0 0 auto;width:33.3333333333%}.row-cols-4>*{flex:0 0 auto;width:25%}.row-cols-5>*{flex:0 0 auto;width:20%}.row-cols-6>*{flex:0 0 auto;width:16.6666666667%}.col-auto{flex:0 0 auto;width:auto}.col-1{flex:0 0 auto;width:8.3333333333%}.col-2{flex:0 0 auto;width:16.6666666667%}.col-3{flex:0 0 auto;width:25%}.col-4,cd-about dt{flex:0 0 auto;width:33.3333333333%}.col-5{flex:0 0 auto;width:41.6666666667%}.col-6{flex:0 0 auto;width:50%}.col-7{flex:0 0 auto;width:58.3333333333%}.col-8,cd-about dd{flex:0 0 auto;width:66.6666666667%}.col-9{flex:0 0 auto;width:75%}.col-10{flex:0 0 auto;width:83.3333333333%}.col-11{flex:0 0 auto;width:91.6666666667%}.col-12,.cd-col-form,cd-health cd-info-card{flex:0 0 auto;width:100%}.offset-1{margin-left:8.3333333333%}.offset-2{margin-left:16.6666666667%}.offset-3{margin-left:25%}.offset-4{margin-left:33.3333333333%}.offset-5{margin-left:41.6666666667%}.offset-6{margin-left:50%}.offset-7{margin-left:58.3333333333%}.offset-8{margin-left:66.6666666667%}.offset-9{margin-left:75%}.offset-10{margin-left:83.3333333333%}.offset-11{margin-left:91.6666666667%}.g-0,.gx-0{--bs-gutter-x: 0}.g-0,.gy-0{--bs-gutter-y: 0}.g-1,.gx-1{--bs-gutter-x: .25rem}.g-1,.gy-1{--bs-gutter-y: .25rem}.g-2,.gx-2{--bs-gutter-x: .5rem}.g-2,.gy-2{--bs-gutter-y: .5rem}.g-3,.gx-3{--bs-gutter-x: 1rem}.g-3,.gy-3{--bs-gutter-y: 1rem}.g-4,.gx-4{--bs-gutter-x: 1.5rem}.g-4,.gy-4{--bs-gutter-y: 1.5rem}.g-5,.gx-5{--bs-gutter-x: 3rem}.g-5,.gy-5{--bs-gutter-y: 3rem}@media (min-width: 576px){.col-sm{flex:1 0 0%}.row-cols-sm-auto>*{flex:0 0 auto;width:auto}.row-cols-sm-1>*{flex:0 0 auto;width:100%}.row-cols-sm-2>*{flex:0 0 auto;width:50%}.row-cols-sm-3>*{flex:0 0 auto;width:33.3333333333%}.row-cols-sm-4>*{flex:0 0 auto;width:25%}.row-cols-sm-5>*{flex:0 0 auto;width:20%}.row-cols-sm-6>*{flex:0 0 auto;width:16.6666666667%}.col-sm-auto{flex:0 0 auto;width:auto}.col-sm-1{flex:0 0 auto;width:8.3333333333%}.col-sm-2{flex:0 0 auto;width:16.6666666667%}.col-sm-3{flex:0 0 auto;width:25%}.col-sm-4,.cd-col-form-label{flex:0 0 auto;width:33.3333333333%}.col-sm-5{flex:0 0 auto;width:41.6666666667%}.col-sm-6{flex:0 0 auto;width:50%}.col-sm-7{flex:0 0 auto;width:58.3333333333%}.col-sm-8,.cd-col-form-input,.cd-col-form-offset{flex:0 0 auto;width:66.6666666667%}.col-sm-9{flex:0 0 auto;width:75%}.col-sm-10{flex:0 0 auto;width:83.3333333333%}.col-sm-11{flex:0 0 auto;width:91.6666666667%}.col-sm-12,cd-health cd-info-card{flex:0 0 auto;width:100%}.offset-sm-0{margin-left:0}.offset-sm-1{margin-left:8.3333333333%}.offset-sm-2{margin-left:16.6666666667%}.offset-sm-3{margin-left:25%}.offset-sm-4,.cd-col-form-offset{margin-left:33.3333333333%}.offset-sm-5{margin-left:41.6666666667%}.offset-sm-6{margin-left:50%}.offset-sm-7{margin-left:58.3333333333%}.offset-sm-8{margin-left:66.6666666667%}.offset-sm-9{margin-left:75%}.offset-sm-10{margin-left:83.3333333333%}.offset-sm-11{margin-left:91.6666666667%}.g-sm-0,.gx-sm-0{--bs-gutter-x: 0}.g-sm-0,.gy-sm-0{--bs-gutter-y: 0}.g-sm-1,.gx-sm-1{--bs-gutter-x: .25rem}.g-sm-1,.gy-sm-1{--bs-gutter-y: .25rem}.g-sm-2,.gx-sm-2{--bs-gutter-x: .5rem}.g-sm-2,.gy-sm-2{--bs-gutter-y: .5rem}.g-sm-3,.gx-sm-3{--bs-gutter-x: 1rem}.g-sm-3,.gy-sm-3{--bs-gutter-y: 1rem}.g-sm-4,.gx-sm-4{--bs-gutter-x: 1.5rem}.g-sm-4,.gy-sm-4{--bs-gutter-y: 1.5rem}.g-sm-5,.gx-sm-5{--bs-gutter-x: 3rem}.g-sm-5,.gy-sm-5{--bs-gutter-y: 3rem}}@media (min-width: 768px){.col-md{flex:1 0 0%}.row-cols-md-auto>*{flex:0 0 auto;width:auto}.row-cols-md-1>*{flex:0 0 auto;width:100%}.row-cols-md-2>*{flex:0 0 auto;width:50%}.row-cols-md-3>*{flex:0 0 auto;width:33.3333333333%}.row-cols-md-4>*{flex:0 0 auto;width:25%}.row-cols-md-5>*{flex:0 0 auto;width:20%}.row-cols-md-6>*{flex:0 0 auto;width:16.6666666667%}.col-md-auto{flex:0 0 auto;width:auto}.col-md-1{flex:0 0 auto;width:8.3333333333%}.col-md-2{flex:0 0 auto;width:16.6666666667%}.col-md-3{flex:0 0 auto;width:25%}.col-md-4,.cd-col-form-label{flex:0 0 auto;width:33.3333333333%}.col-md-5{flex:0 0 auto;width:41.6666666667%}.col-md-6,cd-health cd-info-card{flex:0 0 auto;width:50%}.col-md-7{flex:0 0 auto;width:58.3333333333%}.col-md-8,.cd-col-form-input,.cd-col-form-offset{flex:0 0 auto;width:66.6666666667%}.col-md-9{flex:0 0 auto;width:75%}.col-md-10{flex:0 0 auto;width:83.3333333333%}.col-md-11{flex:0 0 auto;width:91.6666666667%}.col-md-12,cd-health cd-info-card.cd-chart-card{flex:0 0 auto;width:100%}.offset-md-0{margin-left:0}.offset-md-1{margin-left:8.3333333333%}.offset-md-2{margin-left:16.6666666667%}.offset-md-3{margin-left:25%}.offset-md-4{margin-left:33.3333333333%}.offset-md-5{margin-left:41.6666666667%}.offset-md-6{margin-left:50%}.offset-md-7{margin-left:58.3333333333%}.offset-md-8{margin-left:66.6666666667%}.offset-md-9{margin-left:75%}.offset-md-10{margin-left:83.3333333333%}.offset-md-11{margin-left:91.6666666667%}.g-md-0,.gx-md-0{--bs-gutter-x: 0}.g-md-0,.gy-md-0{--bs-gutter-y: 0}.g-md-1,.gx-md-1{--bs-gutter-x: .25rem}.g-md-1,.gy-md-1{--bs-gutter-y: .25rem}.g-md-2,.gx-md-2{--bs-gutter-x: .5rem}.g-md-2,.gy-md-2{--bs-gutter-y: .5rem}.g-md-3,.gx-md-3{--bs-gutter-x: 1rem}.g-md-3,.gy-md-3{--bs-gutter-y: 1rem}.g-md-4,.gx-md-4{--bs-gutter-x: 1.5rem}.g-md-4,.gy-md-4{--bs-gutter-y: 1.5rem}.g-md-5,.gx-md-5{--bs-gutter-x: 3rem}.g-md-5,.gy-md-5{--bs-gutter-y: 3rem}}@media (min-width: 992px){.col-lg{flex:1 0 0%}.row-cols-lg-auto>*{flex:0 0 auto;width:auto}.row-cols-lg-1>*{flex:0 0 auto;width:100%}.row-cols-lg-2>*{flex:0 0 auto;width:50%}.row-cols-lg-3>*{flex:0 0 auto;width:33.3333333333%}.row-cols-lg-4>*{flex:0 0 auto;width:25%}.row-cols-lg-5>*{flex:0 0 auto;width:20%}.row-cols-lg-6>*{flex:0 0 auto;width:16.6666666667%}.col-lg-auto{flex:0 0 auto;width:auto}.col-lg-1{flex:0 0 auto;width:8.3333333333%}.col-lg-2{flex:0 0 auto;width:16.6666666667%}.col-lg-3,.cd-col-form-label,cd-health cd-info-card.cd-capacity-card{flex:0 0 auto;width:25%}.col-lg-4,cd-modal .cd-col-form-label,cd-health cd-info-card{flex:0 0 auto;width:33.3333333333%}.col-lg-5{flex:0 0 auto;width:41.6666666667%}.col-lg-6,cd-health cd-info-card.cd-chart-card,cd-health cd-info-card.cd-performance-card{flex:0 0 auto;width:50%}.col-lg-7{flex:0 0 auto;width:58.3333333333%}.col-lg-8,cd-modal .cd-col-form-input,cd-modal .cd-col-form-offset,.cd-col-form{flex:0 0 auto;width:66.6666666667%}.col-lg-9,.cd-col-form-input,.cd-col-form-offset{flex:0 0 auto;width:75%}.col-lg-10{flex:0 0 auto;width:83.3333333333%}.col-lg-11{flex:0 0 auto;width:91.6666666667%}.col-lg-12{flex:0 0 auto;width:100%}.offset-lg-0{margin-left:0}.offset-lg-1{margin-left:8.3333333333%}.offset-lg-2{margin-left:16.6666666667%}.offset-lg-3,.cd-col-form-offset{margin-left:25%}.offset-lg-4,cd-modal .cd-col-form-offset{margin-left:33.3333333333%}.offset-lg-5{margin-left:41.6666666667%}.offset-lg-6{margin-left:50%}.offset-lg-7{margin-left:58.3333333333%}.offset-lg-8{margin-left:66.6666666667%}.offset-lg-9{margin-left:75%}.offset-lg-10{margin-left:83.3333333333%}.offset-lg-11{margin-left:91.6666666667%}.g-lg-0,.gx-lg-0{--bs-gutter-x: 0}.g-lg-0,.gy-lg-0{--bs-gutter-y: 0}.g-lg-1,.gx-lg-1{--bs-gutter-x: .25rem}.g-lg-1,.gy-lg-1{--bs-gutter-y: .25rem}.g-lg-2,.gx-lg-2{--bs-gutter-x: .5rem}.g-lg-2,.gy-lg-2{--bs-gutter-y: .5rem}.g-lg-3,.gx-lg-3{--bs-gutter-x: 1rem}.g-lg-3,.gy-lg-3{--bs-gutter-y: 1rem}.g-lg-4,.gx-lg-4{--bs-gutter-x: 1.5rem}.g-lg-4,.gy-lg-4{--bs-gutter-y: 1.5rem}.g-lg-5,.gx-lg-5{--bs-gutter-x: 3rem}.g-lg-5,.gy-lg-5{--bs-gutter-y: 3rem}}@media (min-width: 1200px){.col-xl,cd-health cd-info-card.cd-performance-card,cd-health cd-info-card.cd-capacity-card{flex:1 0 0%}.row-cols-xl-auto>*{flex:0 0 auto;width:auto}.row-cols-xl-1>*{flex:0 0 auto;width:100%}.row-cols-xl-2>*{flex:0 0 auto;width:50%}.row-cols-xl-3>*{flex:0 0 auto;width:33.3333333333%}.row-cols-xl-4>*{flex:0 0 auto;width:25%}.row-cols-xl-5>*{flex:0 0 auto;width:20%}.row-cols-xl-6>*{flex:0 0 auto;width:16.6666666667%}.col-xl-auto{flex:0 0 auto;width:auto}.col-xl-1{flex:0 0 auto;width:8.3333333333%}.col-xl-2{flex:0 0 auto;width:16.6666666667%}.col-xl-3,cd-health cd-info-card.cd-status-card{flex:0 0 auto;width:25%}.col-xl-4,cd-health cd-info-card.cd-chart-card{flex:0 0 auto;width:33.3333333333%}.col-xl-5{flex:0 0 auto;width:41.6666666667%}.col-xl-6,.cd-col-form{flex:0 0 auto;width:50%}.col-xl-7{flex:0 0 auto;width:58.3333333333%}.col-xl-8{flex:0 0 auto;width:66.6666666667%}.col-xl-9{flex:0 0 auto;width:75%}.col-xl-10{flex:0 0 auto;width:83.3333333333%}.col-xl-11{flex:0 0 auto;width:91.6666666667%}.col-xl-12{flex:0 0 auto;width:100%}.offset-xl-0{margin-left:0}.offset-xl-1{margin-left:8.3333333333%}.offset-xl-2{margin-left:16.6666666667%}.offset-xl-3{margin-left:25%}.offset-xl-4{margin-left:33.3333333333%}.offset-xl-5{margin-left:41.6666666667%}.offset-xl-6{margin-left:50%}.offset-xl-7{margin-left:58.3333333333%}.offset-xl-8{margin-left:66.6666666667%}.offset-xl-9{margin-left:75%}.offset-xl-10{margin-left:83.3333333333%}.offset-xl-11{margin-left:91.6666666667%}.g-xl-0,.gx-xl-0{--bs-gutter-x: 0}.g-xl-0,.gy-xl-0{--bs-gutter-y: 0}.g-xl-1,.gx-xl-1{--bs-gutter-x: .25rem}.g-xl-1,.gy-xl-1{--bs-gutter-y: .25rem}.g-xl-2,.gx-xl-2{--bs-gutter-x: .5rem}.g-xl-2,.gy-xl-2{--bs-gutter-y: .5rem}.g-xl-3,.gx-xl-3{--bs-gutter-x: 1rem}.g-xl-3,.gy-xl-3{--bs-gutter-y: 1rem}.g-xl-4,.gx-xl-4{--bs-gutter-x: 1.5rem}.g-xl-4,.gy-xl-4{--bs-gutter-y: 1.5rem}.g-xl-5,.gx-xl-5{--bs-gutter-x: 3rem}.g-xl-5,.gy-xl-5{--bs-gutter-y: 3rem}}@media (min-width: 1450px){.col-2xl{flex:1 0 0%}.row-cols-2xl-auto>*{flex:0 0 auto;width:auto}.row-cols-2xl-1>*{flex:0 0 auto;width:100%}.row-cols-2xl-2>*{flex:0 0 auto;width:50%}.row-cols-2xl-3>*{flex:0 0 auto;width:33.3333333333%}.row-cols-2xl-4>*{flex:0 0 auto;width:25%}.row-cols-2xl-5>*{flex:0 0 auto;width:20%}.row-cols-2xl-6>*{flex:0 0 auto;width:16.6666666667%}.col-2xl-auto{flex:0 0 auto;width:auto}.col-2xl-1{flex:0 0 auto;width:8.3333333333%}.col-2xl-2{flex:0 0 auto;width:16.6666666667%}.col-2xl-3,cd-health cd-info-card.cd-chart-card{flex:0 0 auto;width:25%}.col-2xl-4{flex:0 0 auto;width:33.3333333333%}.col-2xl-5{flex:0 0 auto;width:41.6666666667%}.col-2xl-6{flex:0 0 auto;width:50%}.col-2xl-7{flex:0 0 auto;width:58.3333333333%}.col-2xl-8{flex:0 0 auto;width:66.6666666667%}.col-2xl-9{flex:0 0 auto;width:75%}.col-2xl-10{flex:0 0 auto;width:83.3333333333%}.col-2xl-11{flex:0 0 auto;width:91.6666666667%}.col-2xl-12{flex:0 0 auto;width:100%}.offset-2xl-0{margin-left:0}.offset-2xl-1{margin-left:8.3333333333%}.offset-2xl-2{margin-left:16.6666666667%}.offset-2xl-3{margin-left:25%}.offset-2xl-4{margin-left:33.3333333333%}.offset-2xl-5{margin-left:41.6666666667%}.offset-2xl-6{margin-left:50%}.offset-2xl-7{margin-left:58.3333333333%}.offset-2xl-8{margin-left:66.6666666667%}.offset-2xl-9{margin-left:75%}.offset-2xl-10{margin-left:83.3333333333%}.offset-2xl-11{margin-left:91.6666666667%}.g-2xl-0,.gx-2xl-0{--bs-gutter-x: 0}.g-2xl-0,.gy-2xl-0{--bs-gutter-y: 0}.g-2xl-1,.gx-2xl-1{--bs-gutter-x: .25rem}.g-2xl-1,.gy-2xl-1{--bs-gutter-y: .25rem}.g-2xl-2,.gx-2xl-2{--bs-gutter-x: .5rem}.g-2xl-2,.gy-2xl-2{--bs-gutter-y: .5rem}.g-2xl-3,.gx-2xl-3{--bs-gutter-x: 1rem}.g-2xl-3,.gy-2xl-3{--bs-gutter-y: 1rem}.g-2xl-4,.gx-2xl-4{--bs-gutter-x: 1.5rem}.g-2xl-4,.gy-2xl-4{--bs-gutter-y: 1.5rem}.g-2xl-5,.gx-2xl-5{--bs-gutter-x: 3rem}.g-2xl-5,.gy-2xl-5{--bs-gutter-y: 3rem}}.table{--bs-table-bg: transparent;--bs-table-striped-color: #212529;--bs-table-striped-bg: rgba(0, 0, 0, .05);--bs-table-active-color: #212529;--bs-table-active-bg: rgba(0, 0, 0, .1);--bs-table-hover-color: #212529;--bs-table-hover-bg: rgba(0, 0, 0, .075);width:100%;margin-bottom:1rem;color:#212529;vertical-align:top;border-color:#dee2e6}.table>:not(caption)>*>*{padding:.5rem;background-color:var(--bs-table-bg);border-bottom-width:1px;box-shadow:inset 0 0 0 9999px var(--bs-table-accent-bg)}.table>tbody{vertical-align:inherit}.table>thead{vertical-align:bottom}.table>:not(:last-child)>:last-child>*{border-bottom-color:currentColor}.caption-top{caption-side:top}.table-sm>:not(caption)>*>*{padding:.25rem}.table-bordered>:not(caption)>*{border-width:1px 0}.table-bordered>:not(caption)>*>*{border-width:0 1px}.table-borderless>:not(caption)>*>*{border-bottom-width:0}.table-striped>tbody>tr:nth-of-type(odd){--bs-table-accent-bg: var(--bs-table-striped-bg);color:var(--bs-table-striped-color)}.table-active{--bs-table-accent-bg: var(--bs-table-active-bg);color:var(--bs-table-active-color)}.table-hover>tbody>tr:hover{--bs-table-accent-bg: var(--bs-table-hover-bg);color:var(--bs-table-hover-color)}.table-primary{--bs-table-bg: #d3e6e8;--bs-table-striped-bg: #c8dbdc;--bs-table-striped-color: #000;--bs-table-active-bg: #becfd1;--bs-table-active-color: #000;--bs-table-hover-bg: #c3d5d7;--bs-table-hover-color: #000;color:#000;border-color:#becfd1}.table-secondary{--bs-table-bg: #d7d9db;--bs-table-striped-bg: #ccced0;--bs-table-striped-color: #000;--bs-table-active-bg: #c2c3c5;--bs-table-active-color: #000;--bs-table-hover-bg: #c7c9cb;--bs-table-hover-color: #000;color:#000;border-color:#c2c3c5}.table-success{--bs-table-bg: #cce8cc;--bs-table-striped-bg: #c2dcc2;--bs-table-striped-color: #000;--bs-table-active-bg: #b8d1b8;--bs-table-active-color: #000;--bs-table-hover-bg: #bdd7bd;--bs-table-hover-color: #000;color:#000;border-color:#b8d1b8}.table-info{--bs-table-bg: #d3e6e8;--bs-table-striped-bg: #c8dbdc;--bs-table-striped-color: #000;--bs-table-active-bg: #becfd1;--bs-table-active-color: #000;--bs-table-hover-bg: #c3d5d7;--bs-table-hover-color: #000;color:#000;border-color:#becfd1}.table-warning{--bs-table-bg: #f6e6cc;--bs-table-striped-bg: #eadbc2;--bs-table-striped-color: #000;--bs-table-active-bg: #ddcfb8;--bs-table-active-color: #000;--bs-table-hover-bg: #e4d5bd;--bs-table-hover-color: #000;color:#000;border-color:#ddcfb8}.table-danger{--bs-table-bg: #f8d7da;--bs-table-striped-bg: #eccccf;--bs-table-striped-color: #000;--bs-table-active-bg: #dfc2c4;--bs-table-active-color: #000;--bs-table-hover-bg: #e5c7ca;--bs-table-hover-color: #000;color:#000;border-color:#dfc2c4}.table-light{--bs-table-bg: #f8f9fa;--bs-table-striped-bg: #ecedee;--bs-table-striped-color: #000;--bs-table-active-bg: #dfe0e1;--bs-table-active-color: #000;--bs-table-hover-bg: #e5e6e7;--bs-table-hover-color: #000;color:#000;border-color:#dfe0e1}.table-dark{--bs-table-bg: #343a40;--bs-table-striped-bg: #3e444a;--bs-table-striped-color: #fff;--bs-table-active-bg: #484e53;--bs-table-active-color: #fff;--bs-table-hover-bg: #43494e;--bs-table-hover-color: #fff;color:#fff;border-color:#484e53}.table-responsive{overflow-x:auto;-webkit-overflow-scrolling:touch}@media (max-width: 575.98px){.table-responsive-sm{overflow-x:auto;-webkit-overflow-scrolling:touch}}@media (max-width: 767.98px){.table-responsive-md{overflow-x:auto;-webkit-overflow-scrolling:touch}}@media (max-width: 991.98px){.table-responsive-lg{overflow-x:auto;-webkit-overflow-scrolling:touch}}@media (max-width: 1199.98px){.table-responsive-xl{overflow-x:auto;-webkit-overflow-scrolling:touch}}@media (max-width: 1449.98px){.table-responsive-2xl{overflow-x:auto;-webkit-overflow-scrolling:touch}}.form-label,.custom-control-label{margin-bottom:.5rem}.col-form-label,.cd-col-form-label{padding-top:calc(.375rem + 1px);padding-bottom:calc(.375rem + 1px);margin-bottom:0;font-size:inherit;line-height:1.5}.col-form-label-lg{padding-top:calc(.5rem + 1px);padding-bottom:calc(.5rem + 1px);font-size:1.25rem}.col-form-label-sm{padding-top:calc(.25rem + 1px);padding-bottom:calc(.25rem + 1px);font-size:.875rem}.form-text{margin-top:.25rem;font-size:.875em;color:#6c757d}.form-control,.cd-form-control{display:block;width:100%;padding:.375rem .75rem;font-size:1rem;font-weight:400;line-height:1.5;color:#212529;background-color:#fff;background-clip:padding-box;border:1px solid #ced4da;appearance:none;border-radius:.25rem;transition:border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media (prefers-reduced-motion: reduce){.form-control,.cd-form-control{transition:none}}.form-control[type=file],[type=file].cd-form-control{overflow:hidden}.form-control[type=file]:not(:disabled):not(:read-only),[type=file].cd-form-control:not(:disabled):not(:read-only){cursor:pointer}.form-control:focus,.cd-form-control:focus{color:#212529;background-color:#fff;border-color:#92c1c7;outline:0;box-shadow:0 0 0 .25rem #25828e40}.form-control::-webkit-date-and-time-value,.cd-form-control::-webkit-date-and-time-value{height:1.5em}.form-control::placeholder,.cd-form-control::placeholder{color:#6c757d;opacity:1}.form-control:disabled,.cd-form-control:disabled,.form-control:read-only,.cd-form-control:read-only{background-color:#e9ecef;opacity:1}.form-control::file-selector-button,.cd-form-control::file-selector-button{padding:.375rem .75rem;margin:-.375rem -.75rem;margin-inline-end:.75rem;color:#212529;background-color:#e9ecef;pointer-events:none;border-color:inherit;border-style:solid;border-width:0;border-inline-end-width:1px;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){.form-control::file-selector-button,.cd-form-control::file-selector-button{transition:none}}.form-control:hover:not(:disabled):not(:read-only)::file-selector-button,.cd-form-control:hover:not(:disabled):not(:read-only)::file-selector-button{background-color:#dde0e3}.form-control::-webkit-file-upload-button,.cd-form-control::-webkit-file-upload-button{padding:.375rem .75rem;margin:-.375rem -.75rem;margin-inline-end:.75rem;color:#212529;background-color:#e9ecef;pointer-events:none;border-color:inherit;border-style:solid;border-width:0;border-inline-end-width:1px;border-radius:0;-webkit-transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;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){.form-control::-webkit-file-upload-button,.cd-form-control::-webkit-file-upload-button{-webkit-transition:none;transition:none}}.form-control:hover:not(:disabled):not(:read-only)::-webkit-file-upload-button,.cd-form-control:hover:not(:disabled):not(:read-only)::-webkit-file-upload-button{background-color:#dde0e3}.form-control-plaintext{display:block;width:100%;padding:.375rem 0;margin-bottom:0;line-height:1.5;color:#212529;background-color:transparent;border:solid transparent;border-width:1px 0}.form-control-plaintext.form-control-sm,.form-control-plaintext.form-control-lg{padding-right:0;padding-left:0}.form-control-sm{min-height:calc(1.5em + .5rem + 2px);padding:.25rem .5rem;font-size:.875rem;border-radius:.2rem}.form-control-sm::file-selector-button{padding:.25rem .5rem;margin:-.25rem -.5rem;margin-inline-end:.5rem}.form-control-sm::-webkit-file-upload-button{padding:.25rem .5rem;margin:-.25rem -.5rem;margin-inline-end:.5rem}.form-control-lg{min-height:calc(1.5em + 1rem + 2px);padding:.5rem 1rem;font-size:1.25rem;border-radius:.3rem}.form-control-lg::file-selector-button{padding:.5rem 1rem;margin:-.5rem -1rem;margin-inline-end:1rem}.form-control-lg::-webkit-file-upload-button{padding:.5rem 1rem;margin:-.5rem -1rem;margin-inline-end:1rem}textarea.form-control,textarea.cd-form-control{min-height:calc(1.5em + .75rem + 2px)}textarea.form-control-sm{min-height:calc(1.5em + .5rem + 2px)}textarea.form-control-lg{min-height:calc(1.5em + 1rem + 2px)}.form-control-color{max-width:3rem;height:auto;padding:.375rem}.form-control-color:not(:disabled):not(:read-only){cursor:pointer}.form-control-color::-moz-color-swatch{height:1.5em;border-radius:.25rem}.form-control-color::-webkit-color-swatch{height:1.5em;border-radius:.25rem}.form-select{display:block;width:100%;padding:.375rem 2.25rem .375rem .75rem;font-size:1rem;font-weight:400;line-height:1.5;color:#212529;background-color:#fff;background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3e%3cpath fill='none' stroke='%23343a40' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='M2 5l6 6 6-6'/%3e%3c/svg%3e");background-repeat:no-repeat;background-position:right .75rem center;background-size:16px 12px;border:1px solid #ced4da;border-radius:.25rem;appearance:none}.form-select:focus{border-color:#92c1c7;outline:0;box-shadow:0 0 0 .25rem #25828e40}.form-select[multiple],.form-select[size]:not([size="1"]){padding-right:.75rem;background-image:none}.form-select:disabled{background-color:#e9ecef}.form-select:-moz-focusring{color:transparent;text-shadow:0 0 0 #212529}.form-select-sm{padding-top:.25rem;padding-bottom:.25rem;padding-left:.5rem;font-size:.875rem}.form-select-lg{padding-top:.5rem;padding-bottom:.5rem;padding-left:1rem;font-size:1.25rem}.form-check,.custom-radio,.custom-checkbox{display:block;min-height:1.5rem;padding-left:1.5em;margin-bottom:.125rem}.form-check .form-check-input,.custom-radio .form-check-input,.custom-checkbox .form-check-input,.custom-checkbox .custom-control-input{float:left;margin-left:-1.5em}.form-check-input,.custom-checkbox .custom-control-input{width:1em;height:1em;margin-top:.25em;vertical-align:top;background-color:#fff;background-repeat:no-repeat;background-position:center;background-size:contain;border:1px solid rgba(0,0,0,.25);appearance:none;-webkit-print-color-adjust:exact;color-adjust:exact}.form-check-input[type=checkbox],.custom-checkbox [type=checkbox].custom-control-input{border-radius:.25em}.form-check-input[type=radio],.custom-checkbox [type=radio].custom-control-input{border-radius:50%}.form-check-input:active,.custom-checkbox .custom-control-input:active{filter:brightness(90%)}.form-check-input:focus,.custom-checkbox .custom-control-input:focus{border-color:#92c1c7;outline:0;box-shadow:0 0 0 .25rem #25828e40}.form-check-input:checked,.custom-checkbox .custom-control-input:checked{background-color:#25828e;border-color:#25828e}.form-check-input:checked[type=checkbox],.custom-checkbox .custom-control-input:checked[type=checkbox]{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 20 20'%3e%3cpath fill='none' stroke='%23fff' stroke-linecap='round' stroke-linejoin='round' stroke-width='3' d='M6 10l3 3l6-6'/%3e%3c/svg%3e")}.form-check-input:checked[type=radio],.custom-checkbox .custom-control-input:checked[type=radio]{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='2' fill='%23fff'/%3e%3c/svg%3e")}.form-check-input[type=checkbox]:indeterminate,.custom-checkbox [type=checkbox].custom-control-input:indeterminate{background-color:#25828e;border-color:#25828e;background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 20 20'%3e%3cpath fill='none' stroke='%23fff' stroke-linecap='round' stroke-linejoin='round' stroke-width='3' d='M6 10h8'/%3e%3c/svg%3e")}.form-check-input:disabled,.custom-checkbox .custom-control-input:disabled{pointer-events:none;filter:none;opacity:.5}.form-check-input[disabled]~.form-check-label,.custom-checkbox .form-check-input[disabled]~.custom-control-label,.custom-checkbox [disabled].custom-control-input~.form-check-label,.custom-checkbox [disabled].custom-control-input~.custom-control-label,.form-check-input:disabled~.form-check-label,.custom-checkbox .form-check-input:disabled~.custom-control-label,.custom-checkbox .custom-control-input:disabled~.form-check-label,.custom-checkbox .custom-control-input:disabled~.custom-control-label{opacity:.5}.form-switch{padding-left:2.5em}.form-switch .form-check-input,.form-switch .custom-checkbox .custom-control-input,.custom-checkbox .form-switch .custom-control-input{width:2em;margin-left:-2.5em;background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='3' fill='rgba%280, 0, 0, 0.25%29'/%3e%3c/svg%3e");background-position:left center;border-radius:2em;transition:background-position .15s ease-in-out}@media (prefers-reduced-motion: reduce){.form-switch .form-check-input,.form-switch .custom-checkbox .custom-control-input,.custom-checkbox .form-switch .custom-control-input{transition:none}}.form-switch .form-check-input:focus,.form-switch .custom-checkbox .custom-control-input:focus,.custom-checkbox .form-switch .custom-control-input:focus{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='3' fill='%2392c1c7'/%3e%3c/svg%3e")}.form-switch .form-check-input:checked,.form-switch .custom-checkbox .custom-control-input:checked,.custom-checkbox .form-switch .custom-control-input:checked{background-position:right center;background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='3' fill='%23fff'/%3e%3c/svg%3e")}.form-check-inline{display:inline-block;margin-right:1rem}.btn-check{position:absolute;clip:rect(0,0,0,0);pointer-events:none}.btn-check[disabled]+.btn,.btn-check:disabled+.btn{pointer-events:none;filter:none;opacity:.65}.form-range{width:100%;height:1.5rem;padding:0;background-color:transparent;appearance:none}.form-range:focus{outline:0}.form-range:focus::-webkit-slider-thumb{box-shadow:0 0 0 1px #fff,0 0 0 .25rem #25828e40}.form-range:focus::-moz-range-thumb{box-shadow:0 0 0 1px #fff,0 0 0 .25rem #25828e40}.form-range::-moz-focus-outer{border:0}.form-range::-webkit-slider-thumb{width:1rem;height:1rem;margin-top:-.25rem;background-color:#25828e;border:0;border-radius:1rem;-webkit-transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;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){.form-range::-webkit-slider-thumb{-webkit-transition:none;transition:none}}.form-range::-webkit-slider-thumb:active{background-color:#bedadd}.form-range::-webkit-slider-runnable-track{width:100%;height:.5rem;color:transparent;cursor:pointer;background-color:#dee2e6;border-color:transparent;border-radius:1rem}.form-range::-moz-range-thumb{width:1rem;height:1rem;background-color:#25828e;border:0;border-radius:1rem;-moz-transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;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){.form-range::-moz-range-thumb{-moz-transition:none;transition:none}}.form-range::-moz-range-thumb:active{background-color:#bedadd}.form-range::-moz-range-track{width:100%;height:.5rem;color:transparent;cursor:pointer;background-color:#dee2e6;border-color:transparent;border-radius:1rem}.form-range:disabled{pointer-events:none}.form-range:disabled::-webkit-slider-thumb{background-color:#adb5bd}.form-range:disabled::-moz-range-thumb{background-color:#adb5bd}.form-floating{position:relative}.form-floating>.form-control,.form-floating>.cd-form-control,.form-floating>.form-select{height:calc(3.5rem + 2px);padding:1rem .75rem}.form-floating>label{position:absolute;top:0;left:0;height:100%;padding:1rem .75rem;pointer-events:none;border:1px solid transparent;transform-origin:0 0;transition:opacity .1s ease-in-out,transform .1s ease-in-out}@media (prefers-reduced-motion: reduce){.form-floating>label{transition:none}}.form-floating>.form-control::placeholder,.form-floating>.cd-form-control::placeholder{color:transparent}.form-floating>.form-control:focus,.form-floating>.cd-form-control:focus,.form-floating>.form-control:not(:placeholder-shown),.form-floating>.cd-form-control:not(:placeholder-shown){padding-top:1.625rem;padding-bottom:.625rem}.form-floating>.form-control:-webkit-autofill,.form-floating>.cd-form-control:-webkit-autofill{padding-top:1.625rem;padding-bottom:.625rem}.form-floating>.form-select{padding-top:1.625rem;padding-bottom:.625rem}.form-floating>.form-control:focus~label,.form-floating>.cd-form-control:focus~label,.form-floating>.form-control:not(:placeholder-shown)~label,.form-floating>.cd-form-control:not(:placeholder-shown)~label,.form-floating>.form-select~label{opacity:.65;transform:scale(.85) translateY(-.5rem) translate(.15rem)}.form-floating>.form-control:-webkit-autofill~label,.form-floating>.cd-form-control:-webkit-autofill~label{opacity:.65;transform:scale(.85) translateY(-.5rem) translate(.15rem)}.input-group{position:relative;display:flex;flex-wrap:wrap;align-items:stretch;width:100%}.input-group>.form-control,.input-group>.cd-form-control,.input-group>.form-select{position:relative;flex:1 1 auto;width:1%;min-width:0}.input-group>.form-control:focus,.input-group>.cd-form-control:focus,.input-group>.form-select:focus{z-index:3}.input-group .btn{position:relative;z-index:2}.input-group .btn:focus{z-index:3}.input-group-text{display:flex;align-items:center;padding:.375rem .75rem;font-size:1rem;font-weight:400;line-height:1.5;color:#212529;text-align:center;white-space:nowrap;background-color:#e9ecef;border:1px solid #ced4da;border-radius:.25rem}.input-group-lg>.form-control,.input-group-lg>.cd-form-control,.input-group-lg>.form-select,.input-group-lg>.input-group-text,.input-group-lg>.btn{padding:.5rem 1rem;font-size:1.25rem;border-radius:.3rem}.input-group-sm>.form-control,.input-group-sm>.cd-form-control,.input-group-sm>.form-select,.input-group-sm>.input-group-text,.input-group-sm>.btn{padding:.25rem .5rem;font-size:.875rem;border-radius:.2rem}.input-group-lg>.form-select,.input-group-sm>.form-select{padding-right:3rem}.input-group:not(.has-validation)>:not(:last-child):not(.dropdown-toggle):not(.dropdown-menu),.input-group:not(.has-validation)>.dropdown-toggle:nth-last-child(n+3){border-top-right-radius:0;border-bottom-right-radius:0}.input-group.has-validation>:nth-last-child(n+3):not(.dropdown-toggle):not(.dropdown-menu),.input-group.has-validation>.dropdown-toggle:nth-last-child(n+4){border-top-right-radius:0;border-bottom-right-radius:0}.input-group>:not(:first-child):not(.dropdown-menu):not(.valid-tooltip):not(.valid-feedback):not(.invalid-tooltip):not(.invalid-feedback){margin-left:-1px;border-top-left-radius:0;border-bottom-left-radius:0}.valid-feedback{display:none;width:100%;margin-top:.25rem;font-size:100%;color:#008a00}.valid-tooltip{position:absolute;top:100%;z-index:5;display:none;max-width:100%;padding:.25rem .5rem;margin-top:.1rem;font-size:.875rem;color:#fff;background-color:#008a00;border-radius:.25rem}.was-validated :valid~.valid-feedback,.was-validated :valid~.valid-tooltip,.is-valid~.valid-feedback,.is-valid~.valid-tooltip{display:block}.was-validated .form-control:valid,.was-validated .cd-form-control:valid,.form-control.is-valid,.is-valid.cd-form-control{border-color:#008a00;padding-right:calc(1.5em + .75rem);background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3e%3cpath fill='%23008a00' 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");background-repeat:no-repeat;background-position:right calc(.375em + .1875rem) center;background-size:calc(.75em + .375rem) calc(.75em + .375rem)}.was-validated .form-control:valid:focus,.was-validated .cd-form-control:valid:focus,.form-control.is-valid:focus,.is-valid.cd-form-control:focus{border-color:#008a00;box-shadow:0 0 0 .25rem #008a0040}.was-validated textarea.form-control:valid,.was-validated textarea.cd-form-control:valid,textarea.form-control.is-valid,textarea.is-valid.cd-form-control{padding-right:calc(1.5em + .75rem);background-position:top calc(.375em + .1875rem) right calc(.375em + .1875rem)}.was-validated .form-select:valid,.form-select.is-valid{border-color:#008a00}.was-validated .form-select:valid:not([multiple]):not([size]),.was-validated .form-select:valid:not([multiple])[size="1"],.form-select.is-valid:not([multiple]):not([size]),.form-select.is-valid:not([multiple])[size="1"]{padding-right:4.125rem;background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3e%3cpath fill='none' stroke='%23343a40' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='M2 5l6 6 6-6'/%3e%3c/svg%3e"),url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3e%3cpath fill='%23008a00' 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");background-position:right .75rem center,center right 2.25rem;background-size:16px 12px,calc(.75em + .375rem) calc(.75em + .375rem)}.was-validated .form-select:valid:focus,.form-select.is-valid:focus{border-color:#008a00;box-shadow:0 0 0 .25rem #008a0040}.was-validated .form-check-input:valid,.was-validated .custom-checkbox .custom-control-input:valid,.custom-checkbox .was-validated .custom-control-input:valid,.form-check-input.is-valid,.custom-checkbox .is-valid.custom-control-input{border-color:#008a00}.was-validated .form-check-input:valid:checked,.was-validated .custom-checkbox .custom-control-input:valid:checked,.custom-checkbox .was-validated .custom-control-input:valid:checked,.form-check-input.is-valid:checked,.custom-checkbox .is-valid.custom-control-input:checked{background-color:#008a00}.was-validated .form-check-input:valid:focus,.was-validated .custom-checkbox .custom-control-input:valid:focus,.custom-checkbox .was-validated .custom-control-input:valid:focus,.form-check-input.is-valid:focus,.custom-checkbox .is-valid.custom-control-input:focus{box-shadow:0 0 0 .25rem #008a0040}.was-validated .form-check-input:valid~.form-check-label,.was-validated .custom-checkbox .form-check-input:valid~.custom-control-label,.custom-checkbox .was-validated .form-check-input:valid~.custom-control-label,.was-validated .custom-checkbox .custom-control-input:valid~.form-check-label,.was-validated .custom-checkbox .custom-control-input:valid~.custom-control-label,.custom-checkbox .was-validated .custom-control-input:valid~.form-check-label,.custom-checkbox .was-validated .custom-control-input:valid~.custom-control-label,.form-check-input.is-valid~.form-check-label,.custom-checkbox .form-check-input.is-valid~.custom-control-label,.custom-checkbox .is-valid.custom-control-input~.form-check-label,.custom-checkbox .is-valid.custom-control-input~.custom-control-label{color:#008a00}.form-check-inline .form-check-input~.valid-feedback,.form-check-inline .custom-checkbox .custom-control-input~.valid-feedback,.custom-checkbox .form-check-inline .custom-control-input~.valid-feedback{margin-left:.5em}.was-validated .input-group .form-control:valid,.was-validated .input-group .cd-form-control:valid,.input-group .form-control.is-valid,.input-group .is-valid.cd-form-control,.was-validated .input-group .form-select:valid,.input-group .form-select.is-valid{z-index:3}.invalid-feedback{display:none;width:100%;margin-top:.25rem;font-size:100%;color:#dc3545}.invalid-tooltip{position:absolute;top:100%;z-index:5;display:none;max-width:100%;padding:.25rem .5rem;margin-top:.1rem;font-size:.875rem;color:#fff;background-color:#dc3545;border-radius:.25rem}.was-validated :invalid~.invalid-feedback,.was-validated :invalid~.invalid-tooltip,.is-invalid~.invalid-feedback,.is-invalid~.invalid-tooltip{display:block}.was-validated .form-control:invalid,.was-validated .cd-form-control:invalid,.form-control.is-invalid,.is-invalid.cd-form-control{border-color:#dc3545;padding-right:calc(1.5em + .75rem);background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 12 12' width='12' height='12' fill='none' stroke='%23dc3545'%3e%3ccircle cx='6' cy='6' r='4.5'/%3e%3cpath stroke-linejoin='round' d='M5.8 3.6h.4L6 6.5z'/%3e%3ccircle cx='6' cy='8.2' r='.6' fill='%23dc3545' stroke='none'/%3e%3c/svg%3e");background-repeat:no-repeat;background-position:right calc(.375em + .1875rem) center;background-size:calc(.75em + .375rem) calc(.75em + .375rem)}.was-validated .form-control:invalid:focus,.was-validated .cd-form-control:invalid:focus,.form-control.is-invalid:focus,.is-invalid.cd-form-control:focus{border-color:#dc3545;box-shadow:0 0 0 .25rem #dc354540}.was-validated textarea.form-control:invalid,.was-validated textarea.cd-form-control:invalid,textarea.form-control.is-invalid,textarea.is-invalid.cd-form-control{padding-right:calc(1.5em + .75rem);background-position:top calc(.375em + .1875rem) right calc(.375em + .1875rem)}.was-validated .form-select:invalid,.form-select.is-invalid{border-color:#dc3545}.was-validated .form-select:invalid:not([multiple]):not([size]),.was-validated .form-select:invalid:not([multiple])[size="1"],.form-select.is-invalid:not([multiple]):not([size]),.form-select.is-invalid:not([multiple])[size="1"]{padding-right:4.125rem;background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3e%3cpath fill='none' stroke='%23343a40' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='M2 5l6 6 6-6'/%3e%3c/svg%3e"),url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 12 12' width='12' height='12' fill='none' stroke='%23dc3545'%3e%3ccircle cx='6' cy='6' r='4.5'/%3e%3cpath stroke-linejoin='round' d='M5.8 3.6h.4L6 6.5z'/%3e%3ccircle cx='6' cy='8.2' r='.6' fill='%23dc3545' stroke='none'/%3e%3c/svg%3e");background-position:right .75rem center,center right 2.25rem;background-size:16px 12px,calc(.75em + .375rem) calc(.75em + .375rem)}.was-validated .form-select:invalid:focus,.form-select.is-invalid:focus{border-color:#dc3545;box-shadow:0 0 0 .25rem #dc354540}.was-validated .form-check-input:invalid,.was-validated .custom-checkbox .custom-control-input:invalid,.custom-checkbox .was-validated .custom-control-input:invalid,.form-check-input.is-invalid,.custom-checkbox .is-invalid.custom-control-input{border-color:#dc3545}.was-validated .form-check-input:invalid:checked,.was-validated .custom-checkbox .custom-control-input:invalid:checked,.custom-checkbox .was-validated .custom-control-input:invalid:checked,.form-check-input.is-invalid:checked,.custom-checkbox .is-invalid.custom-control-input:checked{background-color:#dc3545}.was-validated .form-check-input:invalid:focus,.was-validated .custom-checkbox .custom-control-input:invalid:focus,.custom-checkbox .was-validated .custom-control-input:invalid:focus,.form-check-input.is-invalid:focus,.custom-checkbox .is-invalid.custom-control-input:focus{box-shadow:0 0 0 .25rem #dc354540}.was-validated .form-check-input:invalid~.form-check-label,.was-validated .custom-checkbox .form-check-input:invalid~.custom-control-label,.custom-checkbox .was-validated .form-check-input:invalid~.custom-control-label,.was-validated .custom-checkbox .custom-control-input:invalid~.form-check-label,.was-validated .custom-checkbox .custom-control-input:invalid~.custom-control-label,.custom-checkbox .was-validated .custom-control-input:invalid~.form-check-label,.custom-checkbox .was-validated .custom-control-input:invalid~.custom-control-label,.form-check-input.is-invalid~.form-check-label,.custom-checkbox .form-check-input.is-invalid~.custom-control-label,.custom-checkbox .is-invalid.custom-control-input~.form-check-label,.custom-checkbox .is-invalid.custom-control-input~.custom-control-label{color:#dc3545}.form-check-inline .form-check-input~.invalid-feedback,.form-check-inline .custom-checkbox .custom-control-input~.invalid-feedback,.custom-checkbox .form-check-inline .custom-control-input~.invalid-feedback{margin-left:.5em}.was-validated .input-group .form-control:invalid,.was-validated .input-group .cd-form-control:invalid,.input-group .form-control.is-invalid,.input-group .is-invalid.cd-form-control,.was-validated .input-group .form-select:invalid,.input-group .form-select.is-invalid{z-index:3}.btn{display:inline-block;font-weight:400;line-height:1.5;color:#212529;text-align:center;text-decoration:none;vertical-align:middle;cursor:pointer;user-select:none;background-color:transparent;border:1px solid transparent;padding:.375rem .75rem;font-size:1rem;border-radius:.25rem;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:#212529}.btn-check:focus+.btn,.btn:focus{outline:0;box-shadow:0 0 0 .25rem #25828e40}.btn:disabled,.btn.disabled,fieldset:disabled .btn{pointer-events:none;opacity:.65}.btn-accent,.btn-primary{color:#fff;background-color:#25828e;border-color:#25828e}.btn-accent:hover,.btn-primary:hover{color:#fff;background-color:#1f6f79;border-color:#1e6872}.btn-check:focus+.btn-accent,.btn-check:focus+.btn-primary,.btn-accent:focus,.btn-primary:focus{color:#fff;background-color:#1f6f79;border-color:#1e6872;box-shadow:0 0 0 .25rem #46959f80}.btn-check:checked+.btn-accent,.btn-check:checked+.btn-primary,.btn-check:active+.btn-accent,.btn-check:active+.btn-primary,.btn-accent:active,.btn-primary:active,.btn-accent.active,.active.btn-primary,.show>.btn-accent.dropdown-toggle,.show>.dropdown-toggle.btn-primary{color:#fff;background-color:#1e6872;border-color:#1c626b}.btn-check:checked+.btn-accent:focus,.btn-check:checked+.btn-primary:focus,.btn-check:active+.btn-accent:focus,.btn-check:active+.btn-primary:focus,.btn-accent:active:focus,.btn-primary:active:focus,.btn-accent.active:focus,.active.btn-primary:focus,.show>.btn-accent.dropdown-toggle:focus,.show>.dropdown-toggle.btn-primary:focus{box-shadow:0 0 0 .25rem #46959f80}.btn-accent:disabled,.btn-primary:disabled,.btn-accent.disabled,.disabled.btn-primary{color:#fff;background-color:#25828e;border-color:#25828e}.btn-warning-dark{color:#000;background-color:#fd7e14;border-color:#fd7e14}.btn-warning-dark:hover{color:#000;background-color:#fd9137;border-color:#fd8b2c}.btn-check:focus+.btn-warning-dark,.btn-warning-dark:focus{color:#000;background-color:#fd9137;border-color:#fd8b2c;box-shadow:0 0 0 .25rem #d76b1180}.btn-check:checked+.btn-warning-dark,.btn-check:active+.btn-warning-dark,.btn-warning-dark:active,.btn-warning-dark.active,.show>.btn-warning-dark.dropdown-toggle{color:#000;background-color:#fd9843;border-color:#fd8b2c}.btn-check:checked+.btn-warning-dark:focus,.btn-check:active+.btn-warning-dark:focus,.btn-warning-dark:active:focus,.btn-warning-dark.active:focus,.show>.btn-warning-dark.dropdown-toggle:focus{box-shadow:0 0 0 .25rem #d76b1180}.btn-warning-dark:disabled,.btn-warning-dark.disabled{color:#000;background-color:#fd7e14;border-color:#fd7e14}.btn-primary{color:#fff;background-color:#25828e;border-color:#25828e}.btn-primary:hover{color:#fff;background-color:#1f6f79;border-color:#1e6872}.btn-check:focus+.btn-primary,.btn-primary:focus{color:#fff;background-color:#1f6f79;border-color:#1e6872;box-shadow:0 0 0 .25rem #46959f80}.btn-check:checked+.btn-primary,.btn-check:active+.btn-primary,.btn-primary:active,.btn-primary.active,.show>.btn-primary.dropdown-toggle{color:#fff;background-color:#1e6872;border-color:#1c626b}.btn-check:checked+.btn-primary:focus,.btn-check:active+.btn-primary:focus,.btn-primary:active:focus,.btn-primary.active:focus,.show>.btn-primary.dropdown-toggle:focus{box-shadow:0 0 0 .25rem #46959f80}.btn-primary:disabled,.btn-primary.disabled{color:#fff;background-color:#25828e;border-color:#25828e}.btn-secondary{color:#fff;background-color:#374249;border-color:#374249}.btn-secondary:hover{color:#fff;background-color:#2f383e;border-color:#2c353a}.btn-check:focus+.btn-secondary,.btn-secondary:focus{color:#fff;background-color:#2f383e;border-color:#2c353a;box-shadow:0 0 0 .25rem #555e6480}.btn-check:checked+.btn-secondary,.btn-check:active+.btn-secondary,.btn-secondary:active,.btn-secondary.active,.show>.btn-secondary.dropdown-toggle{color:#fff;background-color:#2c353a;border-color:#293237}.btn-check:checked+.btn-secondary:focus,.btn-check:active+.btn-secondary:focus,.btn-secondary:active:focus,.btn-secondary.active:focus,.show>.btn-secondary.dropdown-toggle:focus{box-shadow:0 0 0 .25rem #555e6480}.btn-secondary:disabled,.btn-secondary.disabled{color:#fff;background-color:#374249;border-color:#374249}.btn-success{color:#fff;background-color:#008a00;border-color:#008a00}.btn-success:hover{color:#fff;background-color:#007500;border-color:#006e00}.btn-check:focus+.btn-success,.btn-success:focus{color:#fff;background-color:#007500;border-color:#006e00;box-shadow:0 0 0 .25rem #269c2680}.btn-check:checked+.btn-success,.btn-check:active+.btn-success,.btn-success:active,.btn-success.active,.show>.btn-success.dropdown-toggle{color:#fff;background-color:#006e00;border-color:#006800}.btn-check:checked+.btn-success:focus,.btn-check:active+.btn-success:focus,.btn-success:active:focus,.btn-success.active:focus,.show>.btn-success.dropdown-toggle:focus{box-shadow:0 0 0 .25rem #269c2680}.btn-success:disabled,.btn-success.disabled{color:#fff;background-color:#008a00;border-color:#008a00}.btn-info{color:#fff;background-color:#25828e;border-color:#25828e}.btn-info:hover{color:#fff;background-color:#1f6f79;border-color:#1e6872}.btn-check:focus+.btn-info,.btn-info:focus{color:#fff;background-color:#1f6f79;border-color:#1e6872;box-shadow:0 0 0 .25rem #46959f80}.btn-check:checked+.btn-info,.btn-check:active+.btn-info,.btn-info:active,.btn-info.active,.show>.btn-info.dropdown-toggle{color:#fff;background-color:#1e6872;border-color:#1c626b}.btn-check:checked+.btn-info:focus,.btn-check:active+.btn-info:focus,.btn-info:active:focus,.btn-info.active:focus,.show>.btn-info.dropdown-toggle:focus{box-shadow:0 0 0 .25rem #46959f80}.btn-info:disabled,.btn-info.disabled{color:#fff;background-color:#25828e;border-color:#25828e}.btn-warning{color:#000;background-color:#d48200;border-color:#d48200}.btn-warning:hover{color:#000;background-color:#da9526;border-color:#d88f1a}.btn-check:focus+.btn-warning,.btn-warning:focus{color:#000;background-color:#da9526;border-color:#d88f1a;box-shadow:0 0 0 .25rem #b46f0080}.btn-check:checked+.btn-warning,.btn-check:active+.btn-warning,.btn-warning:active,.btn-warning.active,.show>.btn-warning.dropdown-toggle{color:#000;background-color:#dd9b33;border-color:#d88f1a}.btn-check:checked+.btn-warning:focus,.btn-check:active+.btn-warning:focus,.btn-warning:active:focus,.btn-warning.active:focus,.show>.btn-warning.dropdown-toggle:focus{box-shadow:0 0 0 .25rem #b46f0080}.btn-warning:disabled,.btn-warning.disabled{color:#000;background-color:#d48200;border-color:#d48200}.btn-danger{color:#fff;background-color:#dc3545;border-color:#dc3545}.btn-danger:hover{color:#fff;background-color:#bb2d3b;border-color:#b02a37}.btn-check:focus+.btn-danger,.btn-danger:focus{color:#fff;background-color:#bb2d3b;border-color:#b02a37;box-shadow:0 0 0 .25rem #e1536180}.btn-check:checked+.btn-danger,.btn-check:active+.btn-danger,.btn-danger:active,.btn-danger.active,.show>.btn-danger.dropdown-toggle{color:#fff;background-color:#b02a37;border-color:#a52834}.btn-check:checked+.btn-danger:focus,.btn-check:active+.btn-danger:focus,.btn-danger:active:focus,.btn-danger.active:focus,.show>.btn-danger.dropdown-toggle:focus{box-shadow:0 0 0 .25rem #e1536180}.btn-danger:disabled,.btn-danger.disabled{color:#fff;background-color:#dc3545;border-color:#dc3545}.btn-light{color:#000;background-color:#f8f9fa;border-color:#f8f9fa}.btn-light:hover{color:#000;background-color:#f9fafb;border-color:#f9fafb}.btn-check:focus+.btn-light,.btn-light:focus{color:#000;background-color:#f9fafb;border-color:#f9fafb;box-shadow:0 0 0 .25rem #d3d4d580}.btn-check:checked+.btn-light,.btn-check:active+.btn-light,.btn-light:active,.btn-light.active,.show>.btn-light.dropdown-toggle{color:#000;background-color:#f9fafb;border-color:#f9fafb}.btn-check:checked+.btn-light:focus,.btn-check:active+.btn-light:focus,.btn-light:active:focus,.btn-light.active:focus,.show>.btn-light.dropdown-toggle:focus{box-shadow:0 0 0 .25rem #d3d4d580}.btn-light:disabled,.btn-light.disabled{color:#000;background-color:#f8f9fa;border-color:#f8f9fa}.btn-dark{color:#fff;background-color:#343a40;border-color:#343a40}.btn-dark:hover{color:#fff;background-color:#2c3136;border-color:#2a2e33}.btn-check:focus+.btn-dark,.btn-dark:focus{color:#fff;background-color:#2c3136;border-color:#2a2e33;box-shadow:0 0 0 .25rem #52585d80}.btn-check:checked+.btn-dark,.btn-check:active+.btn-dark,.btn-dark:active,.btn-dark.active,.show>.btn-dark.dropdown-toggle{color:#fff;background-color:#2a2e33;border-color:#272c30}.btn-check:checked+.btn-dark:focus,.btn-check:active+.btn-dark:focus,.btn-dark:active:focus,.btn-dark.active:focus,.show>.btn-dark.dropdown-toggle:focus{box-shadow:0 0 0 .25rem #52585d80}.btn-dark:disabled,.btn-dark.disabled{color:#fff;background-color:#343a40;border-color:#343a40}.btn-outline-accent{color:#25828e;border-color:#25828e}.btn-outline-accent:hover{color:#fff;background-color:#25828e;border-color:#25828e}.btn-check:focus+.btn-outline-accent,.btn-outline-accent:focus{box-shadow:0 0 0 .25rem #25828e80}.btn-check:checked+.btn-outline-accent,.btn-check:active+.btn-outline-accent,.btn-outline-accent:active,.btn-outline-accent.active,.btn-outline-accent.dropdown-toggle.show{color:#fff;background-color:#25828e;border-color:#25828e}.btn-check:checked+.btn-outline-accent:focus,.btn-check:active+.btn-outline-accent:focus,.btn-outline-accent:active:focus,.btn-outline-accent.active:focus,.btn-outline-accent.dropdown-toggle.show:focus{box-shadow:0 0 0 .25rem #25828e80}.btn-outline-accent:disabled,.btn-outline-accent.disabled{color:#25828e;background-color:transparent}.btn-outline-warning-dark{color:#fd7e14;border-color:#fd7e14}.btn-outline-warning-dark:hover{color:#000;background-color:#fd7e14;border-color:#fd7e14}.btn-check:focus+.btn-outline-warning-dark,.btn-outline-warning-dark:focus{box-shadow:0 0 0 .25rem #fd7e1480}.btn-check:checked+.btn-outline-warning-dark,.btn-check:active+.btn-outline-warning-dark,.btn-outline-warning-dark:active,.btn-outline-warning-dark.active,.btn-outline-warning-dark.dropdown-toggle.show{color:#000;background-color:#fd7e14;border-color:#fd7e14}.btn-check:checked+.btn-outline-warning-dark:focus,.btn-check:active+.btn-outline-warning-dark:focus,.btn-outline-warning-dark:active:focus,.btn-outline-warning-dark.active:focus,.btn-outline-warning-dark.dropdown-toggle.show:focus{box-shadow:0 0 0 .25rem #fd7e1480}.btn-outline-warning-dark:disabled,.btn-outline-warning-dark.disabled{color:#fd7e14;background-color:transparent}.btn-outline-primary{color:#25828e;border-color:#25828e}.btn-outline-primary:hover{color:#fff;background-color:#25828e;border-color:#25828e}.btn-check:focus+.btn-outline-primary,.btn-outline-primary:focus{box-shadow:0 0 0 .25rem #25828e80}.btn-check:checked+.btn-outline-primary,.btn-check:active+.btn-outline-primary,.btn-outline-primary:active,.btn-outline-primary.active,.btn-outline-primary.dropdown-toggle.show{color:#fff;background-color:#25828e;border-color:#25828e}.btn-check:checked+.btn-outline-primary:focus,.btn-check:active+.btn-outline-primary:focus,.btn-outline-primary:active:focus,.btn-outline-primary.active:focus,.btn-outline-primary.dropdown-toggle.show:focus{box-shadow:0 0 0 .25rem #25828e80}.btn-outline-primary:disabled,.btn-outline-primary.disabled{color:#25828e;background-color:transparent}.btn-outline-secondary{color:#374249;border-color:#374249}.btn-outline-secondary:hover{color:#fff;background-color:#374249;border-color:#374249}.btn-check:focus+.btn-outline-secondary,.btn-outline-secondary:focus{box-shadow:0 0 0 .25rem #37424980}.btn-check:checked+.btn-outline-secondary,.btn-check:active+.btn-outline-secondary,.btn-outline-secondary:active,.btn-outline-secondary.active,.btn-outline-secondary.dropdown-toggle.show{color:#fff;background-color:#374249;border-color:#374249}.btn-check:checked+.btn-outline-secondary:focus,.btn-check:active+.btn-outline-secondary:focus,.btn-outline-secondary:active:focus,.btn-outline-secondary.active:focus,.btn-outline-secondary.dropdown-toggle.show:focus{box-shadow:0 0 0 .25rem #37424980}.btn-outline-secondary:disabled,.btn-outline-secondary.disabled{color:#374249;background-color:transparent}.btn-outline-success{color:#008a00;border-color:#008a00}.btn-outline-success:hover{color:#fff;background-color:#008a00;border-color:#008a00}.btn-check:focus+.btn-outline-success,.btn-outline-success:focus{box-shadow:0 0 0 .25rem #008a0080}.btn-check:checked+.btn-outline-success,.btn-check:active+.btn-outline-success,.btn-outline-success:active,.btn-outline-success.active,.btn-outline-success.dropdown-toggle.show{color:#fff;background-color:#008a00;border-color:#008a00}.btn-check:checked+.btn-outline-success:focus,.btn-check:active+.btn-outline-success:focus,.btn-outline-success:active:focus,.btn-outline-success.active:focus,.btn-outline-success.dropdown-toggle.show:focus{box-shadow:0 0 0 .25rem #008a0080}.btn-outline-success:disabled,.btn-outline-success.disabled{color:#008a00;background-color:transparent}.btn-outline-info{color:#25828e;border-color:#25828e}.btn-outline-info:hover{color:#fff;background-color:#25828e;border-color:#25828e}.btn-check:focus+.btn-outline-info,.btn-outline-info:focus{box-shadow:0 0 0 .25rem #25828e80}.btn-check:checked+.btn-outline-info,.btn-check:active+.btn-outline-info,.btn-outline-info:active,.btn-outline-info.active,.btn-outline-info.dropdown-toggle.show{color:#fff;background-color:#25828e;border-color:#25828e}.btn-check:checked+.btn-outline-info:focus,.btn-check:active+.btn-outline-info:focus,.btn-outline-info:active:focus,.btn-outline-info.active:focus,.btn-outline-info.dropdown-toggle.show:focus{box-shadow:0 0 0 .25rem #25828e80}.btn-outline-info:disabled,.btn-outline-info.disabled{color:#25828e;background-color:transparent}.btn-outline-warning{color:#d48200;border-color:#d48200}.btn-outline-warning:hover{color:#000;background-color:#d48200;border-color:#d48200}.btn-check:focus+.btn-outline-warning,.btn-outline-warning:focus{box-shadow:0 0 0 .25rem #d4820080}.btn-check:checked+.btn-outline-warning,.btn-check:active+.btn-outline-warning,.btn-outline-warning:active,.btn-outline-warning.active,.btn-outline-warning.dropdown-toggle.show{color:#000;background-color:#d48200;border-color:#d48200}.btn-check:checked+.btn-outline-warning:focus,.btn-check:active+.btn-outline-warning:focus,.btn-outline-warning:active:focus,.btn-outline-warning.active:focus,.btn-outline-warning.dropdown-toggle.show:focus{box-shadow:0 0 0 .25rem #d4820080}.btn-outline-warning:disabled,.btn-outline-warning.disabled{color:#d48200;background-color:transparent}.btn-outline-danger{color:#dc3545;border-color:#dc3545}.btn-outline-danger:hover{color:#fff;background-color:#dc3545;border-color:#dc3545}.btn-check:focus+.btn-outline-danger,.btn-outline-danger:focus{box-shadow:0 0 0 .25rem #dc354580}.btn-check:checked+.btn-outline-danger,.btn-check:active+.btn-outline-danger,.btn-outline-danger:active,.btn-outline-danger.active,.btn-outline-danger.dropdown-toggle.show{color:#fff;background-color:#dc3545;border-color:#dc3545}.btn-check:checked+.btn-outline-danger:focus,.btn-check:active+.btn-outline-danger:focus,.btn-outline-danger:active:focus,.btn-outline-danger.active:focus,.btn-outline-danger.dropdown-toggle.show:focus{box-shadow:0 0 0 .25rem #dc354580}.btn-outline-danger:disabled,.btn-outline-danger.disabled{color:#dc3545;background-color:transparent}.btn-outline-light{color:#f8f9fa;border-color:#f8f9fa}.btn-outline-light:hover{color:#000;background-color:#f8f9fa;border-color:#f8f9fa}.btn-check:focus+.btn-outline-light,.btn-outline-light:focus{box-shadow:0 0 0 .25rem #f8f9fa80}.btn-check:checked+.btn-outline-light,.btn-check:active+.btn-outline-light,.btn-outline-light:active,.btn-outline-light.active,.btn-outline-light.dropdown-toggle.show{color:#000;background-color:#f8f9fa;border-color:#f8f9fa}.btn-check:checked+.btn-outline-light:focus,.btn-check:active+.btn-outline-light:focus,.btn-outline-light:active:focus,.btn-outline-light.active:focus,.btn-outline-light.dropdown-toggle.show:focus{box-shadow:0 0 0 .25rem #f8f9fa80}.btn-outline-light:disabled,.btn-outline-light.disabled{color:#f8f9fa;background-color:transparent}.btn-outline-dark{color:#343a40;border-color:#343a40}.btn-outline-dark:hover{color:#fff;background-color:#343a40;border-color:#343a40}.btn-check:focus+.btn-outline-dark,.btn-outline-dark:focus{box-shadow:0 0 0 .25rem #343a4080}.btn-check:checked+.btn-outline-dark,.btn-check:active+.btn-outline-dark,.btn-outline-dark:active,.btn-outline-dark.active,.btn-outline-dark.dropdown-toggle.show{color:#fff;background-color:#343a40;border-color:#343a40}.btn-check:checked+.btn-outline-dark:focus,.btn-check:active+.btn-outline-dark:focus,.btn-outline-dark:active:focus,.btn-outline-dark.active:focus,.btn-outline-dark.dropdown-toggle.show:focus{box-shadow:0 0 0 .25rem #343a4080}.btn-outline-dark:disabled,.btn-outline-dark.disabled{color:#343a40;background-color:transparent}.btn-link{font-weight:400;color:#25828e;text-decoration:underline}.btn-link:hover{color:#1e6872}.btn-link:disabled,.btn-link.disabled{color:#6c757d}.btn-lg,.btn-group-lg>.btn{padding:.5rem 1rem;font-size:1.25rem;border-radius:.3rem}.btn-sm,.btn-group-sm>.btn{padding:.25rem .5rem;font-size:.875rem;border-radius:.2rem}.fade{transition:opacity .15s linear}@media (prefers-reduced-motion: reduce){.fade{transition:none}}.fade:not(.show){opacity:0}.collapse:not(.show){display:none}.collapsing{height:0;overflow:hidden;transition:height .35s ease}@media (prefers-reduced-motion: reduce){.collapsing{transition:none}}.dropup,.dropend,.dropdown,.dropstart{position:relative}.dropdown-toggle{white-space:nowrap}.dropdown-toggle:after{display:inline-block;margin-left:.255em;vertical-align:.255em;content:"";border-top:.3em solid;border-right:.3em solid transparent;border-bottom:0;border-left:.3em solid transparent}.dropdown-toggle:empty:after{margin-left:0}.dropdown-menu{position:absolute;z-index:1000;display:none;min-width:10rem;padding:.5rem 0;margin:0;font-size:1rem;color:#212529;text-align:left;list-style:none;background-color:#fff;background-clip:padding-box;border:1px solid rgba(0,0,0,.15);border-radius:.25rem}.dropdown-menu[data-bs-popper]{top:100%;left:0;margin-top:.125rem}.dropdown-menu-start{--bs-position: start}.dropdown-menu-start[data-bs-popper]{right:auto;left:0}.dropdown-menu-end{--bs-position: end}.dropdown-menu-end[data-bs-popper]{right:0;left:auto}@media (min-width: 576px){.dropdown-menu-sm-start{--bs-position: start}.dropdown-menu-sm-start[data-bs-popper]{right:auto;left:0}.dropdown-menu-sm-end{--bs-position: end}.dropdown-menu-sm-end[data-bs-popper]{right:0;left:auto}}@media (min-width: 768px){.dropdown-menu-md-start{--bs-position: start}.dropdown-menu-md-start[data-bs-popper]{right:auto;left:0}.dropdown-menu-md-end{--bs-position: end}.dropdown-menu-md-end[data-bs-popper]{right:0;left:auto}}@media (min-width: 992px){.dropdown-menu-lg-start{--bs-position: start}.dropdown-menu-lg-start[data-bs-popper]{right:auto;left:0}.dropdown-menu-lg-end{--bs-position: end}.dropdown-menu-lg-end[data-bs-popper]{right:0;left:auto}}@media (min-width: 1200px){.dropdown-menu-xl-start{--bs-position: start}.dropdown-menu-xl-start[data-bs-popper]{right:auto;left:0}.dropdown-menu-xl-end{--bs-position: end}.dropdown-menu-xl-end[data-bs-popper]{right:0;left:auto}}@media (min-width: 1450px){.dropdown-menu-2xl-start{--bs-position: start}.dropdown-menu-2xl-start[data-bs-popper]{right:auto;left:0}.dropdown-menu-2xl-end{--bs-position: end}.dropdown-menu-2xl-end[data-bs-popper]{right:0;left:auto}}.dropup .dropdown-menu[data-bs-popper]{top:auto;bottom:100%;margin-top:0;margin-bottom:.125rem}.dropup .dropdown-toggle:after{display:inline-block;margin-left:.255em;vertical-align:.255em;content:"";border-top:0;border-right:.3em solid transparent;border-bottom:.3em solid;border-left:.3em solid transparent}.dropup .dropdown-toggle:empty:after{margin-left:0}.dropend .dropdown-menu[data-bs-popper]{top:0;right:auto;left:100%;margin-top:0;margin-left:.125rem}.dropend .dropdown-toggle:after{display:inline-block;margin-left:.255em;vertical-align:.255em;content:"";border-top:.3em solid transparent;border-right:0;border-bottom:.3em solid transparent;border-left:.3em solid}.dropend .dropdown-toggle:empty:after{margin-left:0}.dropend .dropdown-toggle:after{vertical-align:0}.dropstart .dropdown-menu[data-bs-popper]{top:0;right:100%;left:auto;margin-top:0;margin-right:.125rem}.dropstart .dropdown-toggle:after{display:inline-block;margin-left:.255em;vertical-align:.255em;content:""}.dropstart .dropdown-toggle:after{display:none}.dropstart .dropdown-toggle:before{display:inline-block;margin-right:.255em;vertical-align:.255em;content:"";border-top:.3em solid transparent;border-right:.3em solid;border-bottom:.3em solid transparent}.dropstart .dropdown-toggle:empty:after{margin-left:0}.dropstart .dropdown-toggle:before{vertical-align:0}.dropdown-divider{height:0;margin:.5rem 0;overflow:hidden;border-top:1px solid rgba(0,0,0,.15)}.dropdown-item{display:block;width:100%;padding:.25rem 1rem;clear:both;font-weight:400;color:#212529;text-align:inherit;text-decoration:none;white-space:nowrap;background-color:transparent;border:0}.dropdown-item:hover,.dropdown-item:focus{color:#1e2125;background-color:#e9ecef}.dropdown-item.active,.dropdown-item:active{color:#fff;text-decoration:none;background-color:#25828e}.dropdown-item.disabled,.dropdown-item:disabled{color:#adb5bd;pointer-events:none;background-color:transparent}.dropdown-menu.show{display:block}.dropdown-header{display:block;padding:.5rem 1rem;margin-bottom:0;font-size:.875rem;color:#6c757d;white-space:nowrap}.dropdown-item-text{display:block;padding:.25rem 1rem;color:#212529}.dropdown-menu-dark{color:#dee2e6;background-color:#343a40;border-color:#00000026}.dropdown-menu-dark .dropdown-item{color:#dee2e6}.dropdown-menu-dark .dropdown-item:hover,.dropdown-menu-dark .dropdown-item:focus{color:#fff;background-color:#ffffff26}.dropdown-menu-dark .dropdown-item.active,.dropdown-menu-dark .dropdown-item:active{color:#fff;background-color:#25828e}.dropdown-menu-dark .dropdown-item.disabled,.dropdown-menu-dark .dropdown-item:disabled{color:#adb5bd}.dropdown-menu-dark .dropdown-divider{border-color:#00000026}.dropdown-menu-dark .dropdown-item-text{color:#dee2e6}.dropdown-menu-dark .dropdown-header{color:#adb5bd}.btn-group,.btn-group-vertical{position:relative;display:inline-flex;vertical-align:middle}.btn-group>.btn,.btn-group-vertical>.btn{position:relative;flex:1 1 auto}.btn-group>.btn-check:checked+.btn,.btn-group>.btn-check:focus+.btn,.btn-group>.btn:hover,.btn-group>.btn:focus,.btn-group>.btn:active,.btn-group>.btn.active,.btn-group-vertical>.btn-check:checked+.btn,.btn-group-vertical>.btn-check:focus+.btn,.btn-group-vertical>.btn:hover,.btn-group-vertical>.btn:focus,.btn-group-vertical>.btn:active,.btn-group-vertical>.btn.active{z-index:1}.btn-toolbar{display:flex;flex-wrap:wrap;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:-1px}.btn-group>.btn:not(:last-child):not(.dropdown-toggle),.btn-group>.btn-group:not(:last-child)>.btn{border-top-right-radius:0;border-bottom-right-radius:0}.btn-group>.btn:nth-child(n+3),.btn-group>:not(.btn-check)+.btn,.btn-group>.btn-group:not(:first-child)>.btn{border-top-left-radius:0;border-bottom-left-radius:0}.dropdown-toggle-split{padding-right:.5625rem;padding-left:.5625rem}.dropdown-toggle-split:after,.dropup .dropdown-toggle-split:after,.dropend .dropdown-toggle-split:after{margin-left:0}.dropstart .dropdown-toggle-split:before{margin-right:0}.btn-sm+.dropdown-toggle-split,.btn-group-sm>.btn+.dropdown-toggle-split{padding-right:.375rem;padding-left:.375rem}.btn-lg+.dropdown-toggle-split,.btn-group-lg>.btn+.dropdown-toggle-split{padding-right:.75rem;padding-left:.75rem}.btn-group-vertical{flex-direction:column;align-items:flex-start;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:-1px}.btn-group-vertical>.btn:not(:last-child):not(.dropdown-toggle),.btn-group-vertical>.btn-group:not(:last-child)>.btn{border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn~.btn,.btn-group-vertical>.btn-group:not(:first-child)>.btn{border-top-left-radius:0;border-top-right-radius:0}.nav{display:flex;flex-wrap:wrap;padding-left:0;margin-bottom:0;list-style:none}.nav-link{display:block;padding:.5rem 1rem;color:#25828e;text-decoration:none;transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out}@media (prefers-reduced-motion: reduce){.nav-link{transition:none}}.nav-link:hover,.nav-link:focus{color:#1e6872}.nav-link.disabled{color:#6c757d;pointer-events:none;cursor:default}.nav-tabs{border-bottom:1px solid #dee2e6}.nav-tabs .nav-link{margin-bottom:-1px;background:none;border:1px solid transparent;border-top-left-radius:.25rem;border-top-right-radius:.25rem}.nav-tabs .nav-link:hover,.nav-tabs .nav-link:focus{border-color:#e9ecef #e9ecef #dee2e6;isolation:isolate}.nav-tabs .nav-link.disabled{color:#6c757d;background-color:transparent;border-color:transparent}.nav-tabs .nav-link.active,.nav-tabs .nav-item.show .nav-link{color:#495057;background-color:#fff;border-color:#dee2e6 #dee2e6 #fff}.nav-tabs .dropdown-menu{margin-top:-1px;border-top-left-radius:0;border-top-right-radius:0}.nav-pills .nav-link{background:none;border:0;border-radius:.25rem}.nav-pills .nav-link.active,.nav-pills .show>.nav-link{color:#fff;background-color:#25828e}.nav-fill>.nav-link,.nav-fill .nav-item{flex:1 1 auto;text-align:center}.nav-justified>.nav-link,.nav-justified .nav-item{flex-basis:0;flex-grow:1;text-align:center}.nav-fill .nav-item .nav-link,.nav-justified .nav-item .nav-link{width:100%}.tab-content>.tab-pane{display:none}.tab-content>.active{display:block}.navbar{position:relative;display:flex;flex-wrap:wrap;align-items:center;justify-content:space-between;padding-top:.5rem;padding-bottom:.5rem}.navbar>.container,.navbar>.container-fluid,.navbar>.container-sm,.navbar>.container-md,.navbar>.container-lg,.navbar>.container-xl,.navbar>.container-xxl{display:flex;flex-wrap:inherit;align-items:center;justify-content:space-between}.navbar-brand{padding-top:.3125rem;padding-bottom:.3125rem;margin-right:1rem;font-size:1.25rem;text-decoration:none;white-space:nowrap}.navbar-nav{display:flex;flex-direction:column;padding-left:0;margin-bottom:0;list-style:none}.navbar-nav .nav-link{padding-right:0;padding-left:0}.navbar-nav .dropdown-menu{position:static}.navbar-text{padding-top:.5rem;padding-bottom:.5rem}.navbar-collapse{flex-basis:100%;flex-grow:1;align-items:center}.navbar-toggler{padding:.25rem .75rem;font-size:1.25rem;line-height:1;background-color:transparent;border:1px solid transparent;border-radius:.25rem;transition:box-shadow .15s ease-in-out}@media (prefers-reduced-motion: reduce){.navbar-toggler{transition:none}}.navbar-toggler:hover{text-decoration:none}.navbar-toggler:focus{text-decoration:none;outline:0;box-shadow:0 0 0 .25rem}.navbar-toggler-icon{display:inline-block;width:1.5em;height:1.5em;vertical-align:middle;background-repeat:no-repeat;background-position:center;background-size:100%}.navbar-nav-scroll{max-height:var(--bs-scroll-height, 75vh);overflow-y:auto}@media (min-width: 576px){.navbar-expand-sm{flex-wrap:nowrap;justify-content:flex-start}.navbar-expand-sm .navbar-nav{flex-direction:row}.navbar-expand-sm .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-sm .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}.navbar-expand-sm .navbar-nav-scroll{overflow:visible}.navbar-expand-sm .navbar-collapse{display:flex!important;flex-basis:auto}.navbar-expand-sm .navbar-toggler{display:none}}@media (min-width: 768px){.navbar-expand-md{flex-wrap:nowrap;justify-content:flex-start}.navbar-expand-md .navbar-nav{flex-direction:row}.navbar-expand-md .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-md .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}.navbar-expand-md .navbar-nav-scroll{overflow:visible}.navbar-expand-md .navbar-collapse{display:flex!important;flex-basis:auto}.navbar-expand-md .navbar-toggler{display:none}}@media (min-width: 992px){.navbar-expand-lg{flex-wrap:nowrap;justify-content:flex-start}.navbar-expand-lg .navbar-nav{flex-direction:row}.navbar-expand-lg .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-lg .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}.navbar-expand-lg .navbar-nav-scroll{overflow:visible}.navbar-expand-lg .navbar-collapse{display:flex!important;flex-basis:auto}.navbar-expand-lg .navbar-toggler{display:none}}@media (min-width: 1200px){.navbar-expand-xl{flex-wrap:nowrap;justify-content:flex-start}.navbar-expand-xl .navbar-nav{flex-direction:row}.navbar-expand-xl .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-xl .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}.navbar-expand-xl .navbar-nav-scroll{overflow:visible}.navbar-expand-xl .navbar-collapse{display:flex!important;flex-basis:auto}.navbar-expand-xl .navbar-toggler{display:none}}@media (min-width: 1450px){.navbar-expand-2xl{flex-wrap:nowrap;justify-content:flex-start}.navbar-expand-2xl .navbar-nav{flex-direction:row}.navbar-expand-2xl .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-2xl .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}.navbar-expand-2xl .navbar-nav-scroll{overflow:visible}.navbar-expand-2xl .navbar-collapse{display:flex!important;flex-basis:auto}.navbar-expand-2xl .navbar-toggler{display:none}}.navbar-expand{flex-wrap:nowrap;justify-content:flex-start}.navbar-expand .navbar-nav{flex-direction:row}.navbar-expand .navbar-nav .dropdown-menu{position:absolute}.navbar-expand .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}.navbar-expand .navbar-nav-scroll{overflow:visible}.navbar-expand .navbar-collapse{display:flex!important;flex-basis:auto}.navbar-expand .navbar-toggler{display:none}.navbar-light .navbar-brand{color:#000000e6}.navbar-light .navbar-brand:hover,.navbar-light .navbar-brand:focus{color:#000000e6}.navbar-light .navbar-nav .nav-link{color:#0000008c}.navbar-light .navbar-nav .nav-link:hover,.navbar-light .navbar-nav .nav-link:focus{color:#000000b3}.navbar-light .navbar-nav .nav-link.disabled{color:#0000004d}.navbar-light .navbar-nav .show>.nav-link,.navbar-light .navbar-nav .nav-link.active{color:#000000e6}.navbar-light .navbar-toggler{color:#0000008c;border-color:#0000001a}.navbar-light .navbar-toggler-icon{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 30 30'%3e%3cpath stroke='rgba%280, 0, 0, 0.55%29' stroke-linecap='round' stroke-miterlimit='10' stroke-width='2' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e")}.navbar-light .navbar-text{color:#0000008c}.navbar-light .navbar-text a,.navbar-light .navbar-text a:hover,.navbar-light .navbar-text a:focus{color:#000000e6}.navbar-dark .navbar-brand{color:#fff}.navbar-dark .navbar-brand:hover,.navbar-dark .navbar-brand:focus{color:#fff}.navbar-dark .navbar-nav .nav-link{color:#ffffff8c}.navbar-dark .navbar-nav .nav-link:hover,.navbar-dark .navbar-nav .nav-link:focus{color:#ffffffbf}.navbar-dark .navbar-nav .nav-link.disabled{color:#ffffff40}.navbar-dark .navbar-nav .show>.nav-link,.navbar-dark .navbar-nav .nav-link.active{color:#fff}.navbar-dark .navbar-toggler{color:#ffffff8c;border-color:#ffffff1a}.navbar-dark .navbar-toggler-icon{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 30 30'%3e%3cpath stroke='rgba%28255, 255, 255, 0.55%29' stroke-linecap='round' stroke-miterlimit='10' stroke-width='2' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e")}.navbar-dark .navbar-text{color:#ffffff8c}.navbar-dark .navbar-text a,.navbar-dark .navbar-text a:hover,.navbar-dark .navbar-text a:focus{color:#fff}.card{position:relative;display:flex;flex-direction:column;min-width:0;word-wrap:break-word;background-color:#fff;background-clip:border-box;border:1px solid rgba(0,0,0,.125);border-radius:.25rem}.card>hr{margin-right:0;margin-left:0}.card>.list-group{border-top:inherit;border-bottom:inherit}.card>.list-group:first-child{border-top-width:0;border-top-left-radius:calc(.25rem - 1px);border-top-right-radius:calc(.25rem - 1px)}.card>.list-group:last-child{border-bottom-width:0;border-bottom-right-radius:calc(.25rem - 1px);border-bottom-left-radius:calc(.25rem - 1px)}.card>.card-header+.list-group,.card>.list-group+.card-footer{border-top:0}.card-body{flex:1 1 auto;padding:1rem}.card-title{margin-bottom:.5rem}.card-subtitle{margin-top:-.25rem;margin-bottom:0}.card-text:last-child{margin-bottom:0}.card-link:hover{text-decoration:none}.card-link+.card-link{margin-left:1rem}.card-header{padding:.5rem 1rem;margin-bottom:0;background-color:#f8f9fa;border-bottom:1px solid rgba(0,0,0,.125)}.card-header:first-child{border-radius:calc(.25rem - 1px) calc(.25rem - 1px) 0 0}.card-footer{padding:.5rem 1rem;background-color:#f8f9fa;border-top:1px solid rgba(0,0,0,.125)}.card-footer:last-child{border-radius:0 0 calc(.25rem - 1px) calc(.25rem - 1px)}.card-header-tabs{margin-right:-.5rem;margin-bottom:-.5rem;margin-left:-.5rem;border-bottom:0}.card-header-pills{margin-right:-.5rem;margin-left:-.5rem}.card-img-overlay{position:absolute;inset:0;padding:1rem;border-radius:calc(.25rem - 1px)}.card-img,.card-img-top,.card-img-bottom{width:100%}.card-img,.card-img-top{border-top-left-radius:calc(.25rem - 1px);border-top-right-radius:calc(.25rem - 1px)}.card-img,.card-img-bottom{border-bottom-right-radius:calc(.25rem - 1px);border-bottom-left-radius:calc(.25rem - 1px)}.card-group>.card{margin-bottom:15px}@media (min-width: 576px){.card-group{display:flex;flex-flow:row wrap}.card-group>.card{flex:1 0 0%;margin-bottom:0}.card-group>.card+.card{margin-left:0;border-left:0}.card-group>.card:not(:last-child){border-top-right-radius:0;border-bottom-right-radius:0}.card-group>.card:not(:last-child) .card-img-top,.card-group>.card:not(:last-child) .card-header{border-top-right-radius:0}.card-group>.card:not(:last-child) .card-img-bottom,.card-group>.card:not(:last-child) .card-footer{border-bottom-right-radius:0}.card-group>.card:not(:first-child){border-top-left-radius:0;border-bottom-left-radius:0}.card-group>.card:not(:first-child) .card-img-top,.card-group>.card:not(:first-child) .card-header{border-top-left-radius:0}.card-group>.card:not(:first-child) .card-img-bottom,.card-group>.card:not(:first-child) .card-footer{border-bottom-left-radius:0}}.accordion-button{position:relative;display:flex;align-items:center;width:100%;padding:1rem 1.25rem;font-size:1rem;color:#212529;text-align:left;background-color:#fff;border:0;border-radius:0;overflow-anchor:none;transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out,border-radius .15s ease}@media (prefers-reduced-motion: reduce){.accordion-button{transition:none}}.accordion-button:not(.collapsed){color:#217580;background-color:#e9f3f4;box-shadow:inset 0 -1px #00000020}.accordion-button:not(.collapsed):after{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23217580'%3e%3cpath fill-rule='evenodd' d='M1.646 4.646a.5.5 0 0 1 .708 0L8 10.293l5.646-5.647a.5.5 0 0 1 .708.708l-6 6a.5.5 0 0 1-.708 0l-6-6a.5.5 0 0 1 0-.708z'/%3e%3c/svg%3e");transform:rotate(-180deg)}.accordion-button:after{flex-shrink:0;width:1.25rem;height:1.25rem;margin-left:auto;content:"";background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23212529'%3e%3cpath fill-rule='evenodd' d='M1.646 4.646a.5.5 0 0 1 .708 0L8 10.293l5.646-5.647a.5.5 0 0 1 .708.708l-6 6a.5.5 0 0 1-.708 0l-6-6a.5.5 0 0 1 0-.708z'/%3e%3c/svg%3e");background-repeat:no-repeat;background-size:1.25rem;transition:transform .2s ease-in-out}@media (prefers-reduced-motion: reduce){.accordion-button:after{transition:none}}.accordion-button:hover{z-index:2}.accordion-button:focus{z-index:3;border-color:#92c1c7;outline:0;box-shadow:0 0 0 .25rem #25828e40}.accordion-header{margin-bottom:0}.accordion-item{background-color:#fff;border:1px solid rgba(0,0,0,.125)}.accordion-item:first-of-type{border-top-left-radius:.25rem;border-top-right-radius:.25rem}.accordion-item:first-of-type .accordion-button{border-top-left-radius:calc(.25rem - 1px);border-top-right-radius:calc(.25rem - 1px)}.accordion-item:not(:first-of-type){border-top:0}.accordion-item:last-of-type{border-bottom-right-radius:.25rem;border-bottom-left-radius:.25rem}.accordion-item:last-of-type .accordion-button.collapsed{border-bottom-right-radius:calc(.25rem - 1px);border-bottom-left-radius:calc(.25rem - 1px)}.accordion-item:last-of-type .accordion-collapse{border-bottom-right-radius:.25rem;border-bottom-left-radius:.25rem}.accordion-body{padding:1rem 1.25rem}.accordion-flush .accordion-collapse{border-width:0}.accordion-flush .accordion-item{border-right:0;border-left:0;border-radius:0}.accordion-flush .accordion-item:first-child{border-top:0}.accordion-flush .accordion-item:last-child{border-bottom:0}.accordion-flush .accordion-item .accordion-button{border-radius:0}.breadcrumb{display:flex;flex-wrap:wrap;padding:0;margin-bottom:1rem;list-style:none}.breadcrumb-item+.breadcrumb-item{padding-left:.5rem}.breadcrumb-item+.breadcrumb-item:before{float:left;padding-right:.5rem;color:#6c757d;content:var(--bs-breadcrumb-divider, "/")}.breadcrumb-item.active{color:#6c757d}.pagination,cd-table .cd-datatable .datatable-footer .datatable-pager ul{display:flex;padding-left:0;list-style:none}.page-link,cd-table .cd-datatable .datatable-footer .datatable-pager ul li a{position:relative;display:block;color:#25828e;text-decoration:none;background-color:#fff;border:1px solid #dee2e6;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){.page-link,cd-table .cd-datatable .datatable-footer .datatable-pager ul li a{transition:none}}.page-link:hover,cd-table .cd-datatable .datatable-footer .datatable-pager ul li a:hover{z-index:2;color:#1e6872;background-color:#e9ecef;border-color:#dee2e6}.page-link:focus,cd-table .cd-datatable .datatable-footer .datatable-pager ul li a:focus{z-index:3;color:#1e6872;background-color:#e9ecef;outline:0;box-shadow:0 0 0 .25rem #25828e40}.page-item:not(:first-child) .page-link,.page-item:not(:first-child) cd-table .cd-datatable .datatable-footer .datatable-pager ul li a,cd-table .cd-datatable .datatable-footer .datatable-pager ul li .page-item:not(:first-child) a,cd-table .cd-datatable .datatable-footer .datatable-pager ul li:not(:first-child) .page-link,cd-table .cd-datatable .datatable-footer .datatable-pager ul li:not(:first-child) a{margin-left:-1px}.page-item.active .page-link,.page-item.active cd-table .cd-datatable .datatable-footer .datatable-pager ul li a,cd-table .cd-datatable .datatable-footer .datatable-pager ul li .page-item.active a,cd-table .cd-datatable .datatable-footer .datatable-pager ul li.active .page-link,cd-table .cd-datatable .datatable-footer .datatable-pager ul li.active a{z-index:3;color:#fff;background-color:#25828e;border-color:#25828e}.page-item.disabled .page-link,.page-item.disabled cd-table .cd-datatable .datatable-footer .datatable-pager ul li a,cd-table .cd-datatable .datatable-footer .datatable-pager ul li .page-item.disabled a,cd-table .cd-datatable .datatable-footer .datatable-pager ul li.disabled .page-link,cd-table .cd-datatable .datatable-footer .datatable-pager ul li.disabled a{color:#6c757d;pointer-events:none;background-color:#fff;border-color:#dee2e6}.page-link,cd-table .cd-datatable .datatable-footer .datatable-pager ul li a{padding:.375rem .75rem}.page-item:first-child .page-link,.page-item:first-child cd-table .cd-datatable .datatable-footer .datatable-pager ul li a,cd-table .cd-datatable .datatable-footer .datatable-pager ul li .page-item:first-child a,cd-table .cd-datatable .datatable-footer .datatable-pager ul li:first-child .page-link,cd-table .cd-datatable .datatable-footer .datatable-pager ul li:first-child a{border-top-left-radius:.25rem;border-bottom-left-radius:.25rem}.page-item:last-child .page-link,.page-item:last-child cd-table .cd-datatable .datatable-footer .datatable-pager ul li a,cd-table .cd-datatable .datatable-footer .datatable-pager ul li .page-item:last-child a,cd-table .cd-datatable .datatable-footer .datatable-pager ul li:last-child .page-link,cd-table .cd-datatable .datatable-footer .datatable-pager ul li:last-child a{border-top-right-radius:.25rem;border-bottom-right-radius:.25rem}.pagination-lg .page-link,.pagination-lg cd-table .cd-datatable .datatable-footer .datatable-pager ul li a,cd-table .cd-datatable .datatable-footer .datatable-pager ul li .pagination-lg a{padding:.75rem 1.5rem;font-size:1.25rem}.pagination-lg .page-item:first-child .page-link,.pagination-lg .page-item:first-child cd-table .cd-datatable .datatable-footer .datatable-pager ul li a,cd-table .cd-datatable .datatable-footer .datatable-pager ul li .pagination-lg .page-item:first-child a,.pagination-lg cd-table .cd-datatable .datatable-footer .datatable-pager ul li:first-child .page-link,.pagination-lg cd-table .cd-datatable .datatable-footer .datatable-pager ul li:first-child a,cd-table .cd-datatable .datatable-footer .datatable-pager ul .pagination-lg li:first-child .page-link,cd-table .cd-datatable .datatable-footer .datatable-pager ul .pagination-lg li:first-child a{border-top-left-radius:.3rem;border-bottom-left-radius:.3rem}.pagination-lg .page-item:last-child .page-link,.pagination-lg .page-item:last-child cd-table .cd-datatable .datatable-footer .datatable-pager ul li a,cd-table .cd-datatable .datatable-footer .datatable-pager ul li .pagination-lg .page-item:last-child a,.pagination-lg cd-table .cd-datatable .datatable-footer .datatable-pager ul li:last-child .page-link,.pagination-lg cd-table .cd-datatable .datatable-footer .datatable-pager ul li:last-child a,cd-table .cd-datatable .datatable-footer .datatable-pager ul .pagination-lg li:last-child .page-link,cd-table .cd-datatable .datatable-footer .datatable-pager ul .pagination-lg li:last-child a{border-top-right-radius:.3rem;border-bottom-right-radius:.3rem}.pagination-sm .page-link,.pagination-sm cd-table .cd-datatable .datatable-footer .datatable-pager ul li a,cd-table .cd-datatable .datatable-footer .datatable-pager ul li .pagination-sm a{padding:.25rem .5rem;font-size:.875rem}.pagination-sm .page-item:first-child .page-link,.pagination-sm .page-item:first-child cd-table .cd-datatable .datatable-footer .datatable-pager ul li a,cd-table .cd-datatable .datatable-footer .datatable-pager ul li .pagination-sm .page-item:first-child a,.pagination-sm cd-table .cd-datatable .datatable-footer .datatable-pager ul li:first-child .page-link,.pagination-sm cd-table .cd-datatable .datatable-footer .datatable-pager ul li:first-child a,cd-table .cd-datatable .datatable-footer .datatable-pager ul .pagination-sm li:first-child .page-link,cd-table .cd-datatable .datatable-footer .datatable-pager ul .pagination-sm li:first-child a{border-top-left-radius:.2rem;border-bottom-left-radius:.2rem}.pagination-sm .page-item:last-child .page-link,.pagination-sm .page-item:last-child cd-table .cd-datatable .datatable-footer .datatable-pager ul li a,cd-table .cd-datatable .datatable-footer .datatable-pager ul li .pagination-sm .page-item:last-child a,.pagination-sm cd-table .cd-datatable .datatable-footer .datatable-pager ul li:last-child .page-link,.pagination-sm cd-table .cd-datatable .datatable-footer .datatable-pager ul li:last-child a,cd-table .cd-datatable .datatable-footer .datatable-pager ul .pagination-sm li:last-child .page-link,cd-table .cd-datatable .datatable-footer .datatable-pager ul .pagination-sm li:last-child a{border-top-right-radius:.2rem;border-bottom-right-radius:.2rem}.badge,.badge-dark,.badge-light,.badge-warning,.badge-info,.badge-danger,.badge-success,.badge-secondary,.badge-primary{display:inline-block;padding:.35em .65em;font-size:1rem;font-weight:700;line-height:1;color:#fff;text-align:center;white-space:nowrap;vertical-align:baseline;border-radius:.25rem}.badge:empty,.badge-dark:empty,.badge-light:empty,.badge-warning:empty,.badge-info:empty,.badge-danger:empty,.badge-success:empty,.badge-secondary:empty,.badge-primary:empty{display:none}.btn .badge,.btn .badge-dark,.btn .badge-light,.btn .badge-warning,.btn .badge-info,.btn .badge-danger,.btn .badge-success,.btn .badge-secondary,.btn .badge-primary{position:relative;top:-1px}.alert{position:relative;padding:1rem;margin-bottom:1rem;border:1px solid transparent;border-radius:.25rem}.alert-heading{color:inherit}.alert-link{font-weight:700}.alert-dismissible{padding-right:3rem}.alert-dismissible .btn-close{position:absolute;top:0;right:0;z-index:2;padding:1.25rem 1rem}.alert-accent{color:#164e55;background-color:#d3e6e8;border-color:#bedadd}.alert-accent .alert-link{color:#123e44}.alert-warning-dark{color:#984c0c;background-color:#ffe5d0;border-color:#fed8b9}.alert-warning-dark .alert-link{color:#7a3d0a}.alert-primary{color:#164e55;background-color:#d3e6e8;border-color:#bedadd}.alert-primary .alert-link{color:#123e44}.alert-secondary{color:#21282c;background-color:#d7d9db;border-color:#c3c6c8}.alert-secondary .alert-link{color:#1a2023}.alert-success{color:#005300;background-color:#cce8cc;border-color:#b3dcb3}.alert-success .alert-link{color:#004200}.alert-info{color:#164e55;background-color:#d3e6e8;border-color:#bedadd}.alert-info .alert-link{color:#123e44}.alert-warning{color:#7f4e00;background-color:#f6e6cc;border-color:#f2dab3}.alert-warning .alert-link{color:#663e00}.alert-danger{color:#842029;background-color:#f8d7da;border-color:#f5c2c7}.alert-danger .alert-link{color:#6a1a21}.alert-light{color:#636464;background-color:#fefefe;border-color:#fdfdfe}.alert-light .alert-link{color:#4f5050}.alert-dark{color:#1f2326;background-color:#d6d8d9;border-color:#c2c4c6}.alert-dark .alert-link{color:#191c1e}@keyframes progress-bar-stripes{0%{background-position-x:1rem}}.progress{display:flex;height:1rem;overflow:hidden;font-size:.75rem;background-color:#e9ecef;border-radius:.25rem}.progress-bar{display:flex;flex-direction:column;justify-content:center;overflow:hidden;color:#fff;text-align:center;white-space:nowrap;background-color:#25828e;transition:width .6s ease}@media (prefers-reduced-motion: reduce){.progress-bar{transition:none}}.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:1rem 1rem}.progress-bar-animated{animation:1s linear infinite progress-bar-stripes}@media (prefers-reduced-motion: reduce){.progress-bar-animated{animation:none}}.list-group{display:flex;flex-direction:column;padding-left:0;margin-bottom:0;border-radius:.25rem}.list-group-numbered{list-style-type:none;counter-reset:section}.list-group-numbered>li:before{content:counters(section,".") ". ";counter-increment:section}.list-group-item-action{width:100%;color:#495057;text-align:inherit}.list-group-item-action:hover,.list-group-item-action:focus{z-index:1;color:#495057;text-decoration:none;background-color:#f8f9fa}.list-group-item-action:active{color:#212529;background-color:#e9ecef}.list-group-item{position:relative;display:block;padding:.5rem 1rem;color:#212529;text-decoration:none;background-color:#fff;border:1px solid rgba(0,0,0,.125)}.list-group-item:first-child{border-top-left-radius:inherit;border-top-right-radius:inherit}.list-group-item:last-child{border-bottom-right-radius:inherit;border-bottom-left-radius:inherit}.list-group-item.disabled,.list-group-item:disabled{color:#6c757d;pointer-events:none;background-color:#fff}.list-group-item.active{z-index:2;color:#fff;background-color:#25828e;border-color:#25828e}.list-group-item+.list-group-item{border-top-width:0}.list-group-item+.list-group-item.active{margin-top:-1px;border-top-width:1px}.list-group-horizontal{flex-direction:row}.list-group-horizontal>.list-group-item:first-child{border-bottom-left-radius:.25rem;border-top-right-radius:0}.list-group-horizontal>.list-group-item:last-child{border-top-right-radius:.25rem;border-bottom-left-radius:0}.list-group-horizontal>.list-group-item.active{margin-top:0}.list-group-horizontal>.list-group-item+.list-group-item{border-top-width:1px;border-left-width:0}.list-group-horizontal>.list-group-item+.list-group-item.active{margin-left:-1px;border-left-width:1px}@media (min-width: 576px){.list-group-horizontal-sm{flex-direction:row}.list-group-horizontal-sm>.list-group-item:first-child{border-bottom-left-radius:.25rem;border-top-right-radius:0}.list-group-horizontal-sm>.list-group-item:last-child{border-top-right-radius:.25rem;border-bottom-left-radius:0}.list-group-horizontal-sm>.list-group-item.active{margin-top:0}.list-group-horizontal-sm>.list-group-item+.list-group-item{border-top-width:1px;border-left-width:0}.list-group-horizontal-sm>.list-group-item+.list-group-item.active{margin-left:-1px;border-left-width:1px}}@media (min-width: 768px){.list-group-horizontal-md{flex-direction:row}.list-group-horizontal-md>.list-group-item:first-child{border-bottom-left-radius:.25rem;border-top-right-radius:0}.list-group-horizontal-md>.list-group-item:last-child{border-top-right-radius:.25rem;border-bottom-left-radius:0}.list-group-horizontal-md>.list-group-item.active{margin-top:0}.list-group-horizontal-md>.list-group-item+.list-group-item{border-top-width:1px;border-left-width:0}.list-group-horizontal-md>.list-group-item+.list-group-item.active{margin-left:-1px;border-left-width:1px}}@media (min-width: 992px){.list-group-horizontal-lg{flex-direction:row}.list-group-horizontal-lg>.list-group-item:first-child{border-bottom-left-radius:.25rem;border-top-right-radius:0}.list-group-horizontal-lg>.list-group-item:last-child{border-top-right-radius:.25rem;border-bottom-left-radius:0}.list-group-horizontal-lg>.list-group-item.active{margin-top:0}.list-group-horizontal-lg>.list-group-item+.list-group-item{border-top-width:1px;border-left-width:0}.list-group-horizontal-lg>.list-group-item+.list-group-item.active{margin-left:-1px;border-left-width:1px}}@media (min-width: 1200px){.list-group-horizontal-xl{flex-direction:row}.list-group-horizontal-xl>.list-group-item:first-child{border-bottom-left-radius:.25rem;border-top-right-radius:0}.list-group-horizontal-xl>.list-group-item:last-child{border-top-right-radius:.25rem;border-bottom-left-radius:0}.list-group-horizontal-xl>.list-group-item.active{margin-top:0}.list-group-horizontal-xl>.list-group-item+.list-group-item{border-top-width:1px;border-left-width:0}.list-group-horizontal-xl>.list-group-item+.list-group-item.active{margin-left:-1px;border-left-width:1px}}@media (min-width: 1450px){.list-group-horizontal-2xl{flex-direction:row}.list-group-horizontal-2xl>.list-group-item:first-child{border-bottom-left-radius:.25rem;border-top-right-radius:0}.list-group-horizontal-2xl>.list-group-item:last-child{border-top-right-radius:.25rem;border-bottom-left-radius:0}.list-group-horizontal-2xl>.list-group-item.active{margin-top:0}.list-group-horizontal-2xl>.list-group-item+.list-group-item{border-top-width:1px;border-left-width:0}.list-group-horizontal-2xl>.list-group-item+.list-group-item.active{margin-left:-1px;border-left-width:1px}}.list-group-flush{border-radius:0}.list-group-flush>.list-group-item{border-width:0 0 1px}.list-group-flush>.list-group-item:last-child{border-bottom-width:0}.list-group-item-accent{color:#164e55;background-color:#d3e6e8}.list-group-item-accent.list-group-item-action:hover,.list-group-item-accent.list-group-item-action:focus{color:#164e55;background-color:#becfd1}.list-group-item-accent.list-group-item-action.active{color:#fff;background-color:#164e55;border-color:#164e55}.list-group-item-warning-dark{color:#984c0c;background-color:#ffe5d0}.list-group-item-warning-dark.list-group-item-action:hover,.list-group-item-warning-dark.list-group-item-action:focus{color:#984c0c;background-color:#e6cebb}.list-group-item-warning-dark.list-group-item-action.active{color:#fff;background-color:#984c0c;border-color:#984c0c}.list-group-item-primary{color:#164e55;background-color:#d3e6e8}.list-group-item-primary.list-group-item-action:hover,.list-group-item-primary.list-group-item-action:focus{color:#164e55;background-color:#becfd1}.list-group-item-primary.list-group-item-action.active{color:#fff;background-color:#164e55;border-color:#164e55}.list-group-item-secondary{color:#21282c;background-color:#d7d9db}.list-group-item-secondary.list-group-item-action:hover,.list-group-item-secondary.list-group-item-action:focus{color:#21282c;background-color:#c2c3c5}.list-group-item-secondary.list-group-item-action.active{color:#fff;background-color:#21282c;border-color:#21282c}.list-group-item-success{color:#005300;background-color:#cce8cc}.list-group-item-success.list-group-item-action:hover,.list-group-item-success.list-group-item-action:focus{color:#005300;background-color:#b8d1b8}.list-group-item-success.list-group-item-action.active{color:#fff;background-color:#005300;border-color:#005300}.list-group-item-info{color:#164e55;background-color:#d3e6e8}.list-group-item-info.list-group-item-action:hover,.list-group-item-info.list-group-item-action:focus{color:#164e55;background-color:#becfd1}.list-group-item-info.list-group-item-action.active{color:#fff;background-color:#164e55;border-color:#164e55}.list-group-item-warning{color:#7f4e00;background-color:#f6e6cc}.list-group-item-warning.list-group-item-action:hover,.list-group-item-warning.list-group-item-action:focus{color:#7f4e00;background-color:#ddcfb8}.list-group-item-warning.list-group-item-action.active{color:#fff;background-color:#7f4e00;border-color:#7f4e00}.list-group-item-danger{color:#842029;background-color:#f8d7da}.list-group-item-danger.list-group-item-action:hover,.list-group-item-danger.list-group-item-action:focus{color:#842029;background-color:#dfc2c4}.list-group-item-danger.list-group-item-action.active{color:#fff;background-color:#842029;border-color:#842029}.list-group-item-light{color:#636464;background-color:#fefefe}.list-group-item-light.list-group-item-action:hover,.list-group-item-light.list-group-item-action:focus{color:#636464;background-color:#e5e5e5}.list-group-item-light.list-group-item-action.active{color:#fff;background-color:#636464;border-color:#636464}.list-group-item-dark{color:#1f2326;background-color:#d6d8d9}.list-group-item-dark.list-group-item-action:hover,.list-group-item-dark.list-group-item-action:focus{color:#1f2326;background-color:#c1c2c3}.list-group-item-dark.list-group-item-action.active{color:#fff;background-color:#1f2326;border-color:#1f2326}.btn-close{box-sizing:content-box;width:1em;height:1em;padding:.25em;color:#000;background:transparent url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23000'%3e%3cpath d='M.293.293a1 1 0 011.414 0L8 6.586 14.293.293a1 1 0 111.414 1.414L9.414 8l6.293 6.293a1 1 0 01-1.414 1.414L8 9.414l-6.293 6.293a1 1 0 01-1.414-1.414L6.586 8 .293 1.707a1 1 0 010-1.414z'/%3e%3c/svg%3e") center/1em auto no-repeat;border:0;border-radius:.25rem;opacity:.5}.btn-close:hover{color:#000;text-decoration:none;opacity:.75}.btn-close:focus{outline:0;box-shadow:0 0 0 .25rem #25828e40;opacity:1}.btn-close:disabled,.btn-close.disabled{pointer-events:none;user-select:none;opacity:.25}.btn-close-white{filter:invert(1) grayscale(100%) brightness(200%)}.toast{width:350px;max-width:100%;font-size:.875rem;pointer-events:auto;background-color:#ffffffd9;background-clip:padding-box;border:1px solid rgba(0,0,0,.1);box-shadow:0 .5rem 1rem #00000026;border-radius:.25rem}.toast:not(.showing):not(.show){opacity:0}.toast.hide{display:none}.toast-container{width:max-content;max-width:100%;pointer-events:none}.toast-container>:not(:last-child){margin-bottom:15px}.toast-header{display:flex;align-items:center;padding:.5rem .75rem;color:#6c757d;background-color:#ffffffd9;background-clip:padding-box;border-bottom:1px solid rgba(0,0,0,.05);border-top-left-radius:calc(.25rem - 1px);border-top-right-radius:calc(.25rem - 1px)}.toast-header .btn-close{margin-right:-.375rem;margin-left:.75rem}.toast-body{padding:.75rem;word-wrap:break-word}.modal-open{overflow:hidden}.modal-open .modal{overflow-x:hidden;overflow-y:auto}.modal{position:fixed;top:0;left:0;z-index:1060;display:none;width:100%;height:100%;overflow:hidden;outline:0}.modal-dialog{position:relative;width:auto;margin:.5rem;pointer-events:none}.modal.fade .modal-dialog{transition:transform .3s ease-out;transform:translateY(-50px)}@media (prefers-reduced-motion: reduce){.modal.fade .modal-dialog{transition:none}}.modal.show .modal-dialog{transform:none}.modal.modal-static .modal-dialog{transform:scale(1.02)}.modal-dialog-scrollable{height:calc(100% - 1rem)}.modal-dialog-scrollable .modal-content{max-height:100%;overflow:hidden}.modal-dialog-scrollable .modal-body{overflow-y:auto}.modal-dialog-centered{display:flex;align-items:center;min-height:calc(100% - 1rem)}.modal-content{position:relative;display:flex;flex-direction:column;width:100%;pointer-events:auto;background-color:#fff;background-clip:padding-box;border:1px solid rgba(0,0,0,.2);border-radius:.3rem;outline:0}.modal-backdrop{position:fixed;top:0;left:0;z-index:1040;width:100vw;height:100vh;background-color:#000}.modal-backdrop.fade{opacity:0}.modal-backdrop.show{opacity:.5}.modal-header{display:flex;flex-shrink:0;align-items:center;justify-content:space-between;padding:1rem;border-bottom:1px solid #dee2e6;border-top-left-radius:calc(.3rem - 1px);border-top-right-radius:calc(.3rem - 1px)}.modal-header .btn-close{padding:.5rem;margin:-.5rem -.5rem -.5rem auto}.modal-title{margin-bottom:0;line-height:1.5}.modal-body{position:relative;flex:1 1 auto;padding:1rem}.modal-footer{display:flex;flex-wrap:wrap;flex-shrink:0;align-items:center;justify-content:flex-end;padding:.75rem;border-top:1px solid #dee2e6;border-bottom-right-radius:calc(.3rem - 1px);border-bottom-left-radius:calc(.3rem - 1px)}.modal-footer>*{margin:.25rem}@media (min-width: 576px){.modal-dialog{max-width:500px;margin:1.75rem auto}.modal-dialog-scrollable{height:calc(100% - 3.5rem)}.modal-dialog-centered{min-height:calc(100% - 3.5rem)}.modal-sm{max-width:300px}}@media (min-width: 992px){.modal-lg,.modal-xl{max-width:800px}}@media (min-width: 1200px){.modal-xl{max-width:1140px}}.modal-fullscreen{width:100vw;max-width:none;height:100%;margin:0}.modal-fullscreen .modal-content{height:100%;border:0;border-radius:0}.modal-fullscreen .modal-header{border-radius:0}.modal-fullscreen .modal-body{overflow-y:auto}.modal-fullscreen .modal-footer{border-radius:0}@media (max-width: 575.98px){.modal-fullscreen-sm-down{width:100vw;max-width:none;height:100%;margin:0}.modal-fullscreen-sm-down .modal-content{height:100%;border:0;border-radius:0}.modal-fullscreen-sm-down .modal-header{border-radius:0}.modal-fullscreen-sm-down .modal-body{overflow-y:auto}.modal-fullscreen-sm-down .modal-footer{border-radius:0}}@media (max-width: 767.98px){.modal-fullscreen-md-down{width:100vw;max-width:none;height:100%;margin:0}.modal-fullscreen-md-down .modal-content{height:100%;border:0;border-radius:0}.modal-fullscreen-md-down .modal-header{border-radius:0}.modal-fullscreen-md-down .modal-body{overflow-y:auto}.modal-fullscreen-md-down .modal-footer{border-radius:0}}@media (max-width: 991.98px){.modal-fullscreen-lg-down{width:100vw;max-width:none;height:100%;margin:0}.modal-fullscreen-lg-down .modal-content{height:100%;border:0;border-radius:0}.modal-fullscreen-lg-down .modal-header{border-radius:0}.modal-fullscreen-lg-down .modal-body{overflow-y:auto}.modal-fullscreen-lg-down .modal-footer{border-radius:0}}@media (max-width: 1199.98px){.modal-fullscreen-xl-down{width:100vw;max-width:none;height:100%;margin:0}.modal-fullscreen-xl-down .modal-content{height:100%;border:0;border-radius:0}.modal-fullscreen-xl-down .modal-header{border-radius:0}.modal-fullscreen-xl-down .modal-body{overflow-y:auto}.modal-fullscreen-xl-down .modal-footer{border-radius:0}}@media (max-width: 1449.98px){.modal-fullscreen-2xl-down{width:100vw;max-width:none;height:100%;margin:0}.modal-fullscreen-2xl-down .modal-content{height:100%;border:0;border-radius:0}.modal-fullscreen-2xl-down .modal-header{border-radius:0}.modal-fullscreen-2xl-down .modal-body{overflow-y:auto}.modal-fullscreen-2xl-down .modal-footer{border-radius:0}}.tooltip{position:absolute;z-index:1080;display:block;margin:0;font-family:var(--bs-font-sans-serif);font-style:normal;font-weight:400;line-height:1.5;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;word-wrap:break-word;opacity:0}.tooltip.show{opacity:1}.tooltip .tooltip-arrow{position:absolute;display:block;width:.8rem;height:.4rem}.tooltip .tooltip-arrow:before{position:absolute;content:"";border-color:transparent;border-style:solid}.bs-tooltip-top,.bs-tooltip-auto[data-popper-placement^=top]{padding:.4rem 0}.bs-tooltip-top .tooltip-arrow,.bs-tooltip-auto[data-popper-placement^=top] .tooltip-arrow{bottom:0}.bs-tooltip-top .tooltip-arrow:before,.bs-tooltip-auto[data-popper-placement^=top] .tooltip-arrow:before{top:-1px;border-width:.4rem .4rem 0;border-top-color:#212529}.bs-tooltip-end,.bs-tooltip-auto[data-popper-placement^=right]{padding:0 .4rem}.bs-tooltip-end .tooltip-arrow,.bs-tooltip-auto[data-popper-placement^=right] .tooltip-arrow{left:0;width:.4rem;height:.8rem}.bs-tooltip-end .tooltip-arrow:before,.bs-tooltip-auto[data-popper-placement^=right] .tooltip-arrow:before{right:-1px;border-width:.4rem .4rem .4rem 0;border-right-color:#212529}.bs-tooltip-bottom,.bs-tooltip-auto[data-popper-placement^=bottom]{padding:.4rem 0}.bs-tooltip-bottom .tooltip-arrow,.bs-tooltip-auto[data-popper-placement^=bottom] .tooltip-arrow{top:0}.bs-tooltip-bottom .tooltip-arrow:before,.bs-tooltip-auto[data-popper-placement^=bottom] .tooltip-arrow:before{bottom:-1px;border-width:0 .4rem .4rem;border-bottom-color:#212529}.bs-tooltip-start,.bs-tooltip-auto[data-popper-placement^=left]{padding:0 .4rem}.bs-tooltip-start .tooltip-arrow,.bs-tooltip-auto[data-popper-placement^=left] .tooltip-arrow{right:0;width:.4rem;height:.8rem}.bs-tooltip-start .tooltip-arrow:before,.bs-tooltip-auto[data-popper-placement^=left] .tooltip-arrow:before{left:-1px;border-width:.4rem 0 .4rem .4rem;border-left-color:#212529}.tooltip-inner{max-width:200px;padding:.25rem .5rem;color:#fff;text-align:center;background-color:#212529;border-radius:.25rem}.popover{position:absolute;top:0;left:0;z-index:1070;display:block;max-width:350px;font-family:var(--bs-font-sans-serif);font-style:normal;font-weight:400;line-height:1.5;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:1rem;word-wrap:break-word;background-color:#fff;background-clip:padding-box;border:1px solid rgba(0,0,0,.2);border-radius:.3rem}.popover .popover-arrow{position:absolute;display:block;width:1rem;height:.5rem}.popover .popover-arrow:before,.popover .popover-arrow:after{position:absolute;display:block;content:"";border-color:transparent;border-style:solid}.bs-popover-top>.popover-arrow,.bs-popover-auto[data-popper-placement^=top]>.popover-arrow{bottom:calc(-.5rem - 1px)}.bs-popover-top>.popover-arrow:before,.bs-popover-auto[data-popper-placement^=top]>.popover-arrow:before{bottom:0;border-width:.5rem .5rem 0;border-top-color:#00000040}.bs-popover-top>.popover-arrow:after,.bs-popover-auto[data-popper-placement^=top]>.popover-arrow:after{bottom:1px;border-width:.5rem .5rem 0;border-top-color:#fff}.bs-popover-end>.popover-arrow,.bs-popover-auto[data-popper-placement^=right]>.popover-arrow{left:calc(-.5rem - 1px);width:.5rem;height:1rem}.bs-popover-end>.popover-arrow:before,.bs-popover-auto[data-popper-placement^=right]>.popover-arrow:before{left:0;border-width:.5rem .5rem .5rem 0;border-right-color:#00000040}.bs-popover-end>.popover-arrow:after,.bs-popover-auto[data-popper-placement^=right]>.popover-arrow:after{left:1px;border-width:.5rem .5rem .5rem 0;border-right-color:#fff}.bs-popover-bottom>.popover-arrow,.bs-popover-auto[data-popper-placement^=bottom]>.popover-arrow{top:calc(-.5rem - 1px)}.bs-popover-bottom>.popover-arrow:before,.bs-popover-auto[data-popper-placement^=bottom]>.popover-arrow:before{top:0;border-width:0 .5rem .5rem .5rem;border-bottom-color:#00000040}.bs-popover-bottom>.popover-arrow:after,.bs-popover-auto[data-popper-placement^=bottom]>.popover-arrow:after{top:1px;border-width:0 .5rem .5rem .5rem;border-bottom-color:#fff}.bs-popover-bottom .popover-header:before,.bs-popover-auto[data-popper-placement^=bottom] .popover-header:before{position:absolute;top:0;left:50%;display:block;width:1rem;margin-left:-.5rem;content:"";border-bottom:1px solid #f0f0f0}.bs-popover-start>.popover-arrow,.bs-popover-auto[data-popper-placement^=left]>.popover-arrow{right:calc(-.5rem - 1px);width:.5rem;height:1rem}.bs-popover-start>.popover-arrow:before,.bs-popover-auto[data-popper-placement^=left]>.popover-arrow:before{right:0;border-width:.5rem 0 .5rem .5rem;border-left-color:#00000040}.bs-popover-start>.popover-arrow:after,.bs-popover-auto[data-popper-placement^=left]>.popover-arrow:after{right:1px;border-width:.5rem 0 .5rem .5rem;border-left-color:#fff}.popover-header{padding:.5rem 1rem;margin-bottom:0;font-size:1rem;background-color:#f0f0f0;border-bottom:1px solid #d8d8d8;border-top-left-radius:calc(.3rem - 1px);border-top-right-radius:calc(.3rem - 1px)}.popover-header:empty{display:none}.popover-body{padding:1rem;color:#212529}.carousel{position:relative}.carousel.pointer-event{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%;backface-visibility:hidden;transition:transform .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-start),.active.carousel-item-end{transform:translate(100%)}.carousel-item-prev:not(.carousel-item-end),.active.carousel-item-start{transform:translate(-100%)}.carousel-fade .carousel-item{opacity:0;transition-property:opacity;transform:none}.carousel-fade .carousel-item.active,.carousel-fade .carousel-item-next.carousel-item-start,.carousel-fade .carousel-item-prev.carousel-item-end{z-index:1;opacity:1}.carousel-fade .active.carousel-item-start,.carousel-fade .active.carousel-item-end{z-index:0;opacity:0;transition:opacity 0s .6s}@media (prefers-reduced-motion: reduce){.carousel-fade .active.carousel-item-start,.carousel-fade .active.carousel-item-end{transition:none}}.carousel-control-prev,.carousel-control-next{position:absolute;top:0;bottom:0;z-index:1;display:flex;align-items:center;justify-content:center;width:15%;padding:0;color:#fff;text-align:center;background:none;border:0;opacity:.5;transition:opacity .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:#fff;text-decoration:none;outline:0;opacity:.9}.carousel-control-prev{left:0}.carousel-control-next{right:0}.carousel-control-prev-icon,.carousel-control-next-icon{display:inline-block;width:2rem;height:2rem;background-repeat:no-repeat;background-position:50%;background-size:100% 100%}.carousel-control-prev-icon{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23fff'%3e%3cpath d='M11.354 1.646a.5.5 0 0 1 0 .708L5.707 8l5.647 5.646a.5.5 0 0 1-.708.708l-6-6a.5.5 0 0 1 0-.708l6-6a.5.5 0 0 1 .708 0z'/%3e%3c/svg%3e")}.carousel-control-next-icon{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23fff'%3e%3cpath d='M4.646 1.646a.5.5 0 0 1 .708 0l6 6a.5.5 0 0 1 0 .708l-6 6a.5.5 0 0 1-.708-.708L10.293 8 4.646 2.354a.5.5 0 0 1 0-.708z'/%3e%3c/svg%3e")}.carousel-indicators{position:absolute;right:0;bottom:0;left:0;z-index:2;display:flex;justify-content:center;padding:0;margin-right:15%;margin-bottom:1rem;margin-left:15%;list-style:none}.carousel-indicators [data-bs-target]{box-sizing:content-box;flex:0 1 auto;width:30px;height:3px;padding:0;margin-right:3px;margin-left:3px;text-indent:-999px;cursor:pointer;background-color:#fff;background-clip:padding-box;border:0;border-top:10px solid transparent;border-bottom:10px solid transparent;opacity:.5;transition:opacity .6s ease}@media (prefers-reduced-motion: reduce){.carousel-indicators [data-bs-target]{transition:none}}.carousel-indicators .active{opacity:1}.carousel-caption{position:absolute;right:15%;bottom:1.25rem;left:15%;padding-top:1.25rem;padding-bottom:1.25rem;color:#fff;text-align:center}.carousel-dark .carousel-control-prev-icon,.carousel-dark .carousel-control-next-icon{filter:invert(1) grayscale(100)}.carousel-dark .carousel-indicators [data-bs-target]{background-color:#000}.carousel-dark .carousel-caption{color:#000}@keyframes spinner-border{to{transform:rotate(360deg)}}.spinner-border{display:inline-block;width:2rem;height:2rem;vertical-align:-.125em;border:.25em solid currentColor;border-right-color:transparent;border-radius:50%;animation:.75s linear infinite spinner-border}.spinner-border-sm{width:1rem;height:1rem;border-width:.2em}@keyframes spinner-grow{0%{transform:scale(0)}50%{opacity:1;transform:none}}.spinner-grow{display:inline-block;width:2rem;height:2rem;vertical-align:-.125em;background-color:currentColor;border-radius:50%;opacity:0;animation:.75s linear infinite spinner-grow}.spinner-grow-sm{width:1rem;height:1rem}@media (prefers-reduced-motion: reduce){.spinner-border,.spinner-grow{animation-duration:1.5s}}.offcanvas{position:fixed;bottom:0;z-index:1050;display:flex;flex-direction:column;max-width:100%;visibility:hidden;background-color:#fff;background-clip:padding-box;outline:0;transition:transform .3s ease-in-out}@media (prefers-reduced-motion: reduce){.offcanvas{transition:none}}.offcanvas-header{display:flex;align-items:center;justify-content:space-between;padding:1rem}.offcanvas-header .btn-close{padding:.5rem;margin:-.5rem -.5rem -.5rem auto}.offcanvas-title{margin-bottom:0;line-height:1.5}.offcanvas-body{flex-grow:1;padding:1rem;overflow-y:auto}.offcanvas-start{top:0;left:0;width:400px;border-right:1px solid rgba(0,0,0,.2);transform:translate(-100%)}.offcanvas-end{top:0;right:0;width:400px;border-left:1px solid rgba(0,0,0,.2);transform:translate(100%)}.offcanvas-top{top:0;right:0;left:0;height:30vh;max-height:100%;border-bottom:1px solid rgba(0,0,0,.2);transform:translateY(-100%)}.offcanvas-bottom{right:0;left:0;height:30vh;max-height:100%;border-top:1px solid rgba(0,0,0,.2);transform:translateY(100%)}.offcanvas.show{transform:none}.clearfix:after{display:block;clear:both;content:""}.link-accent{color:#25828e}.link-accent:hover,.link-accent:focus{color:#1e6872}.link-warning-dark{color:#fd7e14}.link-warning-dark:hover,.link-warning-dark:focus{color:#fd9843}.link-primary{color:#25828e}.link-primary:hover,.link-primary:focus{color:#1e6872}.link-secondary{color:#374249}.link-secondary:hover,.link-secondary:focus{color:#2c353a}.link-success{color:#008a00}.link-success:hover,.link-success:focus{color:#006e00}.link-info{color:#25828e}.link-info:hover,.link-info:focus{color:#1e6872}.link-warning{color:#d48200}.link-warning:hover,.link-warning:focus{color:#dd9b33}.link-danger{color:#dc3545}.link-danger:hover,.link-danger:focus{color:#b02a37}.link-light{color:#f8f9fa}.link-light:hover,.link-light:focus{color:#f9fafb}.link-dark{color:#343a40}.link-dark:hover,.link-dark:focus{color:#2a2e33}.ratio{position:relative;width:100%}.ratio:before{display:block;padding-top:var(--bs-aspect-ratio);content:""}.ratio>*{position:absolute;top:0;left:0;width:100%;height:100%}.ratio-1x1{--bs-aspect-ratio: 100%}.ratio-4x3{--bs-aspect-ratio: 75%}.ratio-16x9{--bs-aspect-ratio: 56.25%}.ratio-21x9{--bs-aspect-ratio: 42.8571428571%}.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}.sticky-top{position:sticky;top:0;z-index:1020}@media (min-width: 576px){.sticky-sm-top{position:sticky;top:0;z-index:1020}}@media (min-width: 768px){.sticky-md-top{position:sticky;top:0;z-index:1020}}@media (min-width: 992px){.sticky-lg-top{position:sticky;top:0;z-index:1020}}@media (min-width: 1200px){.sticky-xl-top{position:sticky;top:0;z-index:1020}}@media (min-width: 1450px){.sticky-2xl-top{position:sticky;top:0;z-index:1020}}.visually-hidden,.visually-hidden-focusable:not(:focus):not(:focus-within){position:absolute!important;width:1px!important;height:1px!important;padding:0!important;margin:-1px!important;overflow:hidden!important;clip:rect(0,0,0,0)!important;white-space:nowrap!important;border:0!important}.stretched-link:after{position:absolute;inset:0;z-index:1;content:""}.text-truncate{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.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}.float-start{float:left!important}.float-end{float:right!important}.float-none{float:none!important}.overflow-auto{overflow:auto!important}.overflow-hidden{overflow:hidden!important}.overflow-visible{overflow:visible!important}.overflow-scroll{overflow:scroll!important}.d-inline{display:inline!important}.d-inline-block{display:inline-block!important}.d-block{display:block!important}.d-grid{display:grid!important}.d-table{display:table!important}.d-table-row{display:table-row!important}.d-table-cell{display:table-cell!important}.d-flex,cd-health cd-info-card{display:flex!important}.d-inline-flex{display:inline-flex!important}.d-none{display:none!important}.shadow{box-shadow:0 .5rem 1rem #00000026!important}.shadow-sm{box-shadow:0 .125rem .25rem #00000013!important}.shadow-lg{box-shadow:0 1rem 3rem #0000002d!important}.shadow-none{box-shadow:none!important}.position-static{position:static!important}.position-relative{position:relative!important}.position-absolute{position:absolute!important}.position-fixed{position:fixed!important}.position-sticky{position:sticky!important}.top-0{top:0!important}.top-50{top:50%!important}.top-100{top:100%!important}.bottom-0{bottom:0!important}.bottom-50{bottom:50%!important}.bottom-100{bottom:100%!important}.start-0{left:0!important}.start-50{left:50%!important}.start-100{left:100%!important}.end-0{right:0!important}.end-50{right:50%!important}.end-100{right:100%!important}.translate-middle{transform:translate(-50%,-50%)!important}.translate-middle-x{transform:translate(-50%)!important}.translate-middle-y{transform:translateY(-50%)!important}.border{border:1px solid #dee2e6!important}.border-0{border:0!important}.border-top{border-top:1px solid #dee2e6!important}.border-top-0{border-top:0!important}.border-end{border-right:1px solid #dee2e6!important}.border-end-0{border-right:0!important}.border-bottom,.cd-header,legend{border-bottom:1px solid #dee2e6!important}.border-bottom-0{border-bottom:0!important}.border-start{border-left:1px solid #dee2e6!important}.border-start-0{border-left:0!important}.border-accent{border-color:#25828e!important}.border-warning-dark{border-color:#fd7e14!important}.border-primary{border-color:#25828e!important}.border-secondary{border-color:#374249!important}.border-success{border-color:#008a00!important}.border-info{border-color:#25828e!important}.border-warning{border-color:#d48200!important}.border-danger{border-color:#dc3545!important}.border-light{border-color:#f8f9fa!important}.border-dark{border-color:#343a40!important}.border-white{border-color:#fff!important}.border-1{border-width:1px!important}.border-2{border-width:2px!important}.border-3{border-width:3px!important}.border-4{border-width:4px!important}.border-5{border-width:5px!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}.mw-100{max-width:100%!important}.vw-100{width:100vw!important}.min-vw-100{min-width:100vw!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}.mh-100{max-height:100%!important}.vh-100{height:100vh!important}.min-vh-100{min-height:100vh!important}.flex-fill{flex:1 1 auto!important}.flex-row{flex-direction:row!important}.flex-column,cd-health cd-info-card{flex-direction:column!important}.flex-row-reverse{flex-direction:row-reverse!important}.flex-column-reverse{flex-direction:column-reverse!important}.flex-grow-0{flex-grow:0!important}.flex-grow-1{flex-grow:1!important}.flex-shrink-0{flex-shrink:0!important}.flex-shrink-1{flex-shrink:1!important}.flex-wrap{flex-wrap:wrap!important}.flex-nowrap{flex-wrap:nowrap!important}.flex-wrap-reverse{flex-wrap:wrap-reverse!important}.gap-0{gap:0!important}.gap-1{gap:.25rem!important}.gap-2{gap:.5rem!important}.gap-3{gap:1rem!important}.gap-4{gap:1.5rem!important}.gap-5{gap:3rem!important}.justify-content-start{justify-content:flex-start!important}.justify-content-end{justify-content:flex-end!important}.justify-content-center{justify-content:center!important}.justify-content-between{justify-content:space-between!important}.justify-content-around{justify-content:space-around!important}.justify-content-evenly{justify-content:space-evenly!important}.align-items-start{align-items:flex-start!important}.align-items-end{align-items:flex-end!important}.align-items-center{align-items:center!important}.align-items-baseline{align-items:baseline!important}.align-items-stretch{align-items:stretch!important}.align-content-start{align-content:flex-start!important}.align-content-end{align-content:flex-end!important}.align-content-center{align-content:center!important}.align-content-between{align-content:space-between!important}.align-content-around{align-content:space-around!important}.align-content-stretch{align-content:stretch!important}.align-self-auto{align-self:auto!important}.align-self-start{align-self:flex-start!important}.align-self-end{align-self:flex-end!important}.align-self-center{align-self:center!important}.align-self-baseline{align-self:baseline!important}.align-self-stretch{align-self:stretch!important}.order-first{order:-1!important}.order-0{order:0!important}.order-1{order:1!important}.order-2{order:2!important}.order-3{order:3!important}.order-4{order:4!important}.order-5{order:5!important}.order-last{order:6!important}.m-0{margin:0!important}.m-1{margin:.25rem!important}.m-2{margin:.5rem!important}.m-3{margin:1rem!important}.m-4{margin:1.5rem!important}.m-5{margin:3rem!important}.m-auto{margin:auto!important}.mx-0{margin-right:0!important;margin-left:0!important}.mx-1{margin-right:.25rem!important;margin-left:.25rem!important}.mx-2{margin-right:.5rem!important;margin-left:.5rem!important}.mx-3{margin-right:1rem!important;margin-left:1rem!important}.mx-4{margin-right:1.5rem!important;margin-left:1.5rem!important}.mx-5{margin-right:3rem!important;margin-left:3rem!important}.mx-auto{margin-right:auto!important;margin-left:auto!important}.my-0{margin-top:0!important;margin-bottom:0!important}.my-1{margin-top:.25rem!important;margin-bottom:.25rem!important}.my-2{margin-top:.5rem!important;margin-bottom:.5rem!important}.my-3{margin-top:1rem!important;margin-bottom:1rem!important}.my-4{margin-top:1.5rem!important;margin-bottom:1.5rem!important}.my-5{margin-top:3rem!important;margin-bottom:3rem!important}.my-auto{margin-top:auto!important;margin-bottom:auto!important}.mt-0{margin-top:0!important}.mt-1{margin-top:.25rem!important}.mt-2{margin-top:.5rem!important}.mt-3{margin-top:1rem!important}.mt-4,.cd-header,legend{margin-top:1.5rem!important}.mt-5{margin-top:3rem!important}.mt-auto{margin-top:auto!important}.me-0{margin-right:0!important}.me-1{margin-right:.25rem!important}.me-2,cd-logs label,.btn-toolbar cd-table-actions.btn-group{margin-right:.5rem!important}.me-3,cd-logs .form-inline>.form-group{margin-right:1rem!important}.me-4{margin-right:1.5rem!important}.me-5{margin-right:3rem!important}.me-auto{margin-right:auto!important}.mb-0{margin-bottom:0!important}.mb-1,.badge,.badge-dark,.badge-light,.badge-warning,.badge-info,.badge-danger,.badge-success,.badge-secondary,.badge-primary{margin-bottom:.25rem!important}.mb-2{margin-bottom:.5rem!important}.mb-3,.form-group,cd-logs .form-inline>.form-group{margin-bottom:1rem!important}.mb-4,.cd-header,legend,cd-health cd-info-card{margin-bottom:1.5rem!important}.mb-5{margin-bottom:3rem!important}.mb-auto{margin-bottom:auto!important}.ms-0{margin-left:0!important}.ms-1{margin-left:.25rem!important}.ms-2{margin-left:.5rem!important}.ms-3{margin-left:1rem!important}.ms-4{margin-left:1.5rem!important}.ms-5{margin-left:3rem!important}.ms-auto{margin-left:auto!important}.p-0{padding:0!important}.p-1{padding:.25rem!important}.p-2,cd-table .cd-datatable .datatable-footer{padding:.5rem!important}.p-3{padding:1rem!important}.p-4{padding:1.5rem!important}.p-5{padding:3rem!important}.px-0{padding-right:0!important;padding-left:0!important}.px-1{padding-right:.25rem!important;padding-left:.25rem!important}.px-2{padding-right:.5rem!important;padding-left:.5rem!important}.px-3{padding-right:1rem!important;padding-left:1rem!important}.px-4{padding-right:1.5rem!important;padding-left:1.5rem!important}.px-5{padding-right:3rem!important;padding-left:3rem!important}.py-0{padding-top:0!important;padding-bottom:0!important}.py-1{padding-top:.25rem!important;padding-bottom:.25rem!important}.py-2{padding-top:.5rem!important;padding-bottom:.5rem!important}.py-3{padding-top:1rem!important;padding-bottom:1rem!important}.py-4{padding-top:1.5rem!important;padding-bottom:1.5rem!important}.py-5{padding-top:3rem!important;padding-bottom:3rem!important}.pt-0{padding-top:0!important}.pt-1{padding-top:.25rem!important}.pt-2,cd-info-card .card .card-body .card-text{padding-top:.5rem!important}.pt-3{padding-top:1rem!important}.pt-4{padding-top:1.5rem!important}.pt-5{padding-top:3rem!important}.pe-0{padding-right:0!important}.pe-1{padding-right:.25rem!important}.pe-2{padding-right:.5rem!important}.pe-3{padding-right:1rem!important}.pe-4{padding-right:1.5rem!important}.pe-5{padding-right:3rem!important}.pb-0{padding-bottom:0!important}.pb-1,.cd-header,legend{padding-bottom:.25rem!important}.pb-2,cd-info-card .card{padding-bottom:.5rem!important}.pb-3{padding-bottom:1rem!important}.pb-4{padding-bottom:1.5rem!important}.pb-5{padding-bottom:3rem!important}.ps-0{padding-left:0!important}.ps-1{padding-left:.25rem!important}.ps-2,cd-info-card .card .card-body .card-title{padding-left:.5rem!important}.ps-3{padding-left:1rem!important}.ps-4{padding-left:1.5rem!important}.ps-5{padding-left:3rem!important}.font-monospace{font-family:var(--bs-font-monospace)!important}.fs-1{font-size:calc(1.375rem + 1.5vw)!important}.fs-2{font-size:calc(1.325rem + .9vw)!important}.fs-3{font-size:calc(1.3rem + .6vw)!important}.fs-4{font-size:calc(1.275rem + .3vw)!important}.fs-5{font-size:1.25rem!important}.fs-6{font-size:1rem!important}.fst-italic{font-style:italic!important}.fst-normal{font-style:normal!important}.fw-light{font-weight:300!important}.fw-lighter{font-weight:lighter!important}.fw-normal{font-weight:400!important}.fw-bold,cd-about dt{font-weight:700!important}.fw-bolder{font-weight:bolder!important}.lh-1{line-height:1!important}.lh-sm{line-height:1.25!important}.lh-base{line-height:1.5!important}.lh-lg{line-height:2!important}.text-start{text-align:left!important}.text-end{text-align:right!important}.text-center{text-align:center!important}.text-decoration-none{text-decoration:none!important}.text-decoration-underline{text-decoration:underline!important}.text-decoration-line-through{text-decoration:line-through!important}.text-lowercase{text-transform:lowercase!important}.text-uppercase{text-transform:uppercase!important}.text-capitalize{text-transform:capitalize!important}.text-wrap{white-space:normal!important}.text-nowrap{white-space:nowrap!important}.text-break{word-wrap:break-word!important;word-break:break-word!important}.text-accent{color:#25828e!important}.text-warning-dark{color:#fd7e14!important}.text-primary{color:#25828e!important}.text-secondary{color:#374249!important}.text-success{color:#008a00!important}.text-info{color:#25828e!important}.text-warning{color:#d48200!important}.text-danger{color:#dc3545!important}.text-light{color:#f8f9fa!important}.text-dark,.badge-light,.badge-warning{color:#343a40!important}.text-white{color:#fff!important}.text-body{color:#212529!important}.text-muted{color:#6c757d!important}.text-black-50{color:#00000080!important}.text-white-50{color:#ffffff80!important}.text-reset{color:inherit!important}.bg-accent{background-color:#25828e!important}.bg-warning-dark{background-color:#fd7e14!important}.bg-primary,.badge-info,.badge-primary{background-color:#25828e!important}.bg-secondary,.badge-secondary{background-color:#374249!important}.bg-success,.badge-success{background-color:#008a00!important}.bg-info{background-color:#25828e!important}.bg-warning,.badge-warning{background-color:#d48200!important}.bg-danger,.badge-danger{background-color:#dc3545!important}.bg-light,.badge-light{background-color:#f8f9fa!important}.bg-dark,.badge-dark{background-color:#343a40!important}.bg-body,.bg-white{background-color:#fff!important}.bg-transparent{background-color:transparent!important}.bg-gradient{background-image:var(--bs-gradient)!important}.user-select-all{user-select:all!important}.user-select-auto{user-select:auto!important}.user-select-none{user-select:none!important}.pe-none{pointer-events:none!important}.pe-auto{pointer-events:auto!important}.rounded{border-radius:.25rem!important}.rounded-0{border-radius:0!important}.rounded-1{border-radius:.2rem!important}.rounded-2{border-radius:.25rem!important}.rounded-3{border-radius:.3rem!important}.rounded-circle{border-radius:50%!important}.rounded-pill,.badge,.badge-dark,.badge-light,.badge-warning,.badge-info,.badge-danger,.badge-success,.badge-secondary,.badge-primary{border-radius:50rem!important}.rounded-top{border-top-left-radius:.25rem!important;border-top-right-radius:.25rem!important}.rounded-end{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-start{border-bottom-left-radius:.25rem!important;border-top-left-radius:.25rem!important}.visible{visibility:visible!important}.invisible{visibility:hidden!important}@media (min-width: 576px){.float-sm-start{float:left!important}.float-sm-end{float:right!important}.float-sm-none{float:none!important}.d-sm-inline{display:inline!important}.d-sm-inline-block{display:inline-block!important}.d-sm-block{display:block!important}.d-sm-grid{display:grid!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:flex!important}.d-sm-inline-flex{display:inline-flex!important}.d-sm-none{display:none!important}.flex-sm-fill{flex:1 1 auto!important}.flex-sm-row{flex-direction:row!important}.flex-sm-column{flex-direction:column!important}.flex-sm-row-reverse{flex-direction:row-reverse!important}.flex-sm-column-reverse{flex-direction:column-reverse!important}.flex-sm-grow-0{flex-grow:0!important}.flex-sm-grow-1{flex-grow:1!important}.flex-sm-shrink-0{flex-shrink:0!important}.flex-sm-shrink-1{flex-shrink:1!important}.flex-sm-wrap{flex-wrap:wrap!important}.flex-sm-nowrap{flex-wrap:nowrap!important}.flex-sm-wrap-reverse{flex-wrap:wrap-reverse!important}.gap-sm-0{gap:0!important}.gap-sm-1{gap:.25rem!important}.gap-sm-2{gap:.5rem!important}.gap-sm-3{gap:1rem!important}.gap-sm-4{gap:1.5rem!important}.gap-sm-5{gap:3rem!important}.justify-content-sm-start{justify-content:flex-start!important}.justify-content-sm-end{justify-content:flex-end!important}.justify-content-sm-center{justify-content:center!important}.justify-content-sm-between{justify-content:space-between!important}.justify-content-sm-around{justify-content:space-around!important}.justify-content-sm-evenly{justify-content:space-evenly!important}.align-items-sm-start{align-items:flex-start!important}.align-items-sm-end{align-items:flex-end!important}.align-items-sm-center{align-items:center!important}.align-items-sm-baseline{align-items:baseline!important}.align-items-sm-stretch{align-items:stretch!important}.align-content-sm-start{align-content:flex-start!important}.align-content-sm-end{align-content:flex-end!important}.align-content-sm-center{align-content:center!important}.align-content-sm-between{align-content:space-between!important}.align-content-sm-around{align-content:space-around!important}.align-content-sm-stretch{align-content:stretch!important}.align-self-sm-auto{align-self:auto!important}.align-self-sm-start{align-self:flex-start!important}.align-self-sm-end{align-self:flex-end!important}.align-self-sm-center{align-self:center!important}.align-self-sm-baseline{align-self:baseline!important}.align-self-sm-stretch{align-self:stretch!important}.order-sm-first{order:-1!important}.order-sm-0{order:0!important}.order-sm-1{order:1!important}.order-sm-2{order:2!important}.order-sm-3{order:3!important}.order-sm-4{order:4!important}.order-sm-5{order:5!important}.order-sm-last{order:6!important}.m-sm-0{margin:0!important}.m-sm-1{margin:.25rem!important}.m-sm-2{margin:.5rem!important}.m-sm-3{margin:1rem!important}.m-sm-4{margin:1.5rem!important}.m-sm-5{margin:3rem!important}.m-sm-auto{margin:auto!important}.mx-sm-0{margin-right:0!important;margin-left:0!important}.mx-sm-1{margin-right:.25rem!important;margin-left:.25rem!important}.mx-sm-2{margin-right:.5rem!important;margin-left:.5rem!important}.mx-sm-3{margin-right:1rem!important;margin-left:1rem!important}.mx-sm-4{margin-right:1.5rem!important;margin-left:1.5rem!important}.mx-sm-5{margin-right:3rem!important;margin-left:3rem!important}.mx-sm-auto{margin-right:auto!important;margin-left:auto!important}.my-sm-0{margin-top:0!important;margin-bottom:0!important}.my-sm-1{margin-top:.25rem!important;margin-bottom:.25rem!important}.my-sm-2{margin-top:.5rem!important;margin-bottom:.5rem!important}.my-sm-3{margin-top:1rem!important;margin-bottom:1rem!important}.my-sm-4{margin-top:1.5rem!important;margin-bottom:1.5rem!important}.my-sm-5{margin-top:3rem!important;margin-bottom:3rem!important}.my-sm-auto{margin-top:auto!important;margin-bottom:auto!important}.mt-sm-0{margin-top:0!important}.mt-sm-1{margin-top:.25rem!important}.mt-sm-2{margin-top:.5rem!important}.mt-sm-3{margin-top:1rem!important}.mt-sm-4{margin-top:1.5rem!important}.mt-sm-5{margin-top:3rem!important}.mt-sm-auto{margin-top:auto!important}.me-sm-0{margin-right:0!important}.me-sm-1{margin-right:.25rem!important}.me-sm-2{margin-right:.5rem!important}.me-sm-3{margin-right:1rem!important}.me-sm-4{margin-right:1.5rem!important}.me-sm-5{margin-right:3rem!important}.me-sm-auto{margin-right:auto!important}.mb-sm-0{margin-bottom:0!important}.mb-sm-1{margin-bottom:.25rem!important}.mb-sm-2{margin-bottom:.5rem!important}.mb-sm-3{margin-bottom:1rem!important}.mb-sm-4{margin-bottom:1.5rem!important}.mb-sm-5{margin-bottom:3rem!important}.mb-sm-auto{margin-bottom:auto!important}.ms-sm-0{margin-left:0!important}.ms-sm-1{margin-left:.25rem!important}.ms-sm-2{margin-left:.5rem!important}.ms-sm-3{margin-left:1rem!important}.ms-sm-4{margin-left:1.5rem!important}.ms-sm-5{margin-left:3rem!important}.ms-sm-auto{margin-left:auto!important}.p-sm-0{padding:0!important}.p-sm-1{padding:.25rem!important}.p-sm-2{padding:.5rem!important}.p-sm-3{padding:1rem!important}.p-sm-4{padding:1.5rem!important}.p-sm-5{padding:3rem!important}.px-sm-0{padding-right:0!important;padding-left:0!important}.px-sm-1{padding-right:.25rem!important;padding-left:.25rem!important}.px-sm-2{padding-right:.5rem!important;padding-left:.5rem!important}.px-sm-3{padding-right:1rem!important;padding-left:1rem!important}.px-sm-4{padding-right:1.5rem!important;padding-left:1.5rem!important}.px-sm-5{padding-right:3rem!important;padding-left:3rem!important}.py-sm-0{padding-top:0!important;padding-bottom:0!important}.py-sm-1{padding-top:.25rem!important;padding-bottom:.25rem!important}.py-sm-2{padding-top:.5rem!important;padding-bottom:.5rem!important}.py-sm-3{padding-top:1rem!important;padding-bottom:1rem!important}.py-sm-4{padding-top:1.5rem!important;padding-bottom:1.5rem!important}.py-sm-5{padding-top:3rem!important;padding-bottom:3rem!important}.pt-sm-0{padding-top:0!important}.pt-sm-1{padding-top:.25rem!important}.pt-sm-2{padding-top:.5rem!important}.pt-sm-3{padding-top:1rem!important}.pt-sm-4{padding-top:1.5rem!important}.pt-sm-5{padding-top:3rem!important}.pe-sm-0{padding-right:0!important}.pe-sm-1{padding-right:.25rem!important}.pe-sm-2{padding-right:.5rem!important}.pe-sm-3{padding-right:1rem!important}.pe-sm-4{padding-right:1.5rem!important}.pe-sm-5{padding-right:3rem!important}.pb-sm-0{padding-bottom:0!important}.pb-sm-1{padding-bottom:.25rem!important}.pb-sm-2{padding-bottom:.5rem!important}.pb-sm-3{padding-bottom:1rem!important}.pb-sm-4{padding-bottom:1.5rem!important}.pb-sm-5{padding-bottom:3rem!important}.ps-sm-0{padding-left:0!important}.ps-sm-1{padding-left:.25rem!important}.ps-sm-2{padding-left:.5rem!important}.ps-sm-3{padding-left:1rem!important}.ps-sm-4{padding-left:1.5rem!important}.ps-sm-5{padding-left:3rem!important}.text-sm-start{text-align:left!important}.text-sm-end{text-align:right!important}.text-sm-center{text-align:center!important}}@media (min-width: 768px){.float-md-start{float:left!important}.float-md-end{float:right!important}.float-md-none{float:none!important}.d-md-inline{display:inline!important}.d-md-inline-block{display:inline-block!important}.d-md-block{display:block!important}.d-md-grid{display:grid!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:flex!important}.d-md-inline-flex{display:inline-flex!important}.d-md-none{display:none!important}.flex-md-fill{flex:1 1 auto!important}.flex-md-row{flex-direction:row!important}.flex-md-column{flex-direction:column!important}.flex-md-row-reverse{flex-direction:row-reverse!important}.flex-md-column-reverse{flex-direction:column-reverse!important}.flex-md-grow-0{flex-grow:0!important}.flex-md-grow-1{flex-grow:1!important}.flex-md-shrink-0{flex-shrink:0!important}.flex-md-shrink-1{flex-shrink:1!important}.flex-md-wrap{flex-wrap:wrap!important}.flex-md-nowrap{flex-wrap:nowrap!important}.flex-md-wrap-reverse{flex-wrap:wrap-reverse!important}.gap-md-0{gap:0!important}.gap-md-1{gap:.25rem!important}.gap-md-2{gap:.5rem!important}.gap-md-3{gap:1rem!important}.gap-md-4{gap:1.5rem!important}.gap-md-5{gap:3rem!important}.justify-content-md-start{justify-content:flex-start!important}.justify-content-md-end{justify-content:flex-end!important}.justify-content-md-center{justify-content:center!important}.justify-content-md-between{justify-content:space-between!important}.justify-content-md-around{justify-content:space-around!important}.justify-content-md-evenly{justify-content:space-evenly!important}.align-items-md-start{align-items:flex-start!important}.align-items-md-end{align-items:flex-end!important}.align-items-md-center{align-items:center!important}.align-items-md-baseline{align-items:baseline!important}.align-items-md-stretch{align-items:stretch!important}.align-content-md-start{align-content:flex-start!important}.align-content-md-end{align-content:flex-end!important}.align-content-md-center{align-content:center!important}.align-content-md-between{align-content:space-between!important}.align-content-md-around{align-content:space-around!important}.align-content-md-stretch{align-content:stretch!important}.align-self-md-auto{align-self:auto!important}.align-self-md-start{align-self:flex-start!important}.align-self-md-end{align-self:flex-end!important}.align-self-md-center{align-self:center!important}.align-self-md-baseline{align-self:baseline!important}.align-self-md-stretch{align-self:stretch!important}.order-md-first{order:-1!important}.order-md-0{order:0!important}.order-md-1{order:1!important}.order-md-2{order:2!important}.order-md-3{order:3!important}.order-md-4{order:4!important}.order-md-5{order:5!important}.order-md-last{order:6!important}.m-md-0{margin:0!important}.m-md-1{margin:.25rem!important}.m-md-2{margin:.5rem!important}.m-md-3{margin:1rem!important}.m-md-4{margin:1.5rem!important}.m-md-5{margin:3rem!important}.m-md-auto{margin:auto!important}.mx-md-0{margin-right:0!important;margin-left:0!important}.mx-md-1{margin-right:.25rem!important;margin-left:.25rem!important}.mx-md-2{margin-right:.5rem!important;margin-left:.5rem!important}.mx-md-3{margin-right:1rem!important;margin-left:1rem!important}.mx-md-4{margin-right:1.5rem!important;margin-left:1.5rem!important}.mx-md-5{margin-right:3rem!important;margin-left:3rem!important}.mx-md-auto{margin-right:auto!important;margin-left:auto!important}.my-md-0{margin-top:0!important;margin-bottom:0!important}.my-md-1{margin-top:.25rem!important;margin-bottom:.25rem!important}.my-md-2{margin-top:.5rem!important;margin-bottom:.5rem!important}.my-md-3{margin-top:1rem!important;margin-bottom:1rem!important}.my-md-4{margin-top:1.5rem!important;margin-bottom:1.5rem!important}.my-md-5{margin-top:3rem!important;margin-bottom:3rem!important}.my-md-auto{margin-top:auto!important;margin-bottom:auto!important}.mt-md-0{margin-top:0!important}.mt-md-1{margin-top:.25rem!important}.mt-md-2{margin-top:.5rem!important}.mt-md-3{margin-top:1rem!important}.mt-md-4{margin-top:1.5rem!important}.mt-md-5{margin-top:3rem!important}.mt-md-auto{margin-top:auto!important}.me-md-0{margin-right:0!important}.me-md-1{margin-right:.25rem!important}.me-md-2{margin-right:.5rem!important}.me-md-3{margin-right:1rem!important}.me-md-4{margin-right:1.5rem!important}.me-md-5{margin-right:3rem!important}.me-md-auto{margin-right:auto!important}.mb-md-0{margin-bottom:0!important}.mb-md-1{margin-bottom:.25rem!important}.mb-md-2{margin-bottom:.5rem!important}.mb-md-3{margin-bottom:1rem!important}.mb-md-4{margin-bottom:1.5rem!important}.mb-md-5{margin-bottom:3rem!important}.mb-md-auto{margin-bottom:auto!important}.ms-md-0{margin-left:0!important}.ms-md-1{margin-left:.25rem!important}.ms-md-2{margin-left:.5rem!important}.ms-md-3{margin-left:1rem!important}.ms-md-4{margin-left:1.5rem!important}.ms-md-5{margin-left:3rem!important}.ms-md-auto{margin-left:auto!important}.p-md-0{padding:0!important}.p-md-1{padding:.25rem!important}.p-md-2{padding:.5rem!important}.p-md-3{padding:1rem!important}.p-md-4{padding:1.5rem!important}.p-md-5{padding:3rem!important}.px-md-0{padding-right:0!important;padding-left:0!important}.px-md-1{padding-right:.25rem!important;padding-left:.25rem!important}.px-md-2{padding-right:.5rem!important;padding-left:.5rem!important}.px-md-3{padding-right:1rem!important;padding-left:1rem!important}.px-md-4{padding-right:1.5rem!important;padding-left:1.5rem!important}.px-md-5{padding-right:3rem!important;padding-left:3rem!important}.py-md-0{padding-top:0!important;padding-bottom:0!important}.py-md-1{padding-top:.25rem!important;padding-bottom:.25rem!important}.py-md-2{padding-top:.5rem!important;padding-bottom:.5rem!important}.py-md-3{padding-top:1rem!important;padding-bottom:1rem!important}.py-md-4{padding-top:1.5rem!important;padding-bottom:1.5rem!important}.py-md-5{padding-top:3rem!important;padding-bottom:3rem!important}.pt-md-0{padding-top:0!important}.pt-md-1{padding-top:.25rem!important}.pt-md-2{padding-top:.5rem!important}.pt-md-3{padding-top:1rem!important}.pt-md-4{padding-top:1.5rem!important}.pt-md-5{padding-top:3rem!important}.pe-md-0{padding-right:0!important}.pe-md-1{padding-right:.25rem!important}.pe-md-2{padding-right:.5rem!important}.pe-md-3{padding-right:1rem!important}.pe-md-4{padding-right:1.5rem!important}.pe-md-5{padding-right:3rem!important}.pb-md-0{padding-bottom:0!important}.pb-md-1{padding-bottom:.25rem!important}.pb-md-2{padding-bottom:.5rem!important}.pb-md-3{padding-bottom:1rem!important}.pb-md-4{padding-bottom:1.5rem!important}.pb-md-5{padding-bottom:3rem!important}.ps-md-0{padding-left:0!important}.ps-md-1{padding-left:.25rem!important}.ps-md-2{padding-left:.5rem!important}.ps-md-3{padding-left:1rem!important}.ps-md-4{padding-left:1.5rem!important}.ps-md-5{padding-left:3rem!important}.text-md-start{text-align:left!important}.text-md-end{text-align:right!important}.text-md-center{text-align:center!important}}@media (min-width: 992px){.float-lg-start{float:left!important}.float-lg-end{float:right!important}.float-lg-none{float:none!important}.d-lg-inline{display:inline!important}.d-lg-inline-block{display:inline-block!important}.d-lg-block{display:block!important}.d-lg-grid{display:grid!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:flex!important}.d-lg-inline-flex{display:inline-flex!important}.d-lg-none{display:none!important}.flex-lg-fill{flex:1 1 auto!important}.flex-lg-row{flex-direction:row!important}.flex-lg-column{flex-direction:column!important}.flex-lg-row-reverse{flex-direction:row-reverse!important}.flex-lg-column-reverse{flex-direction:column-reverse!important}.flex-lg-grow-0{flex-grow:0!important}.flex-lg-grow-1{flex-grow:1!important}.flex-lg-shrink-0{flex-shrink:0!important}.flex-lg-shrink-1{flex-shrink:1!important}.flex-lg-wrap{flex-wrap:wrap!important}.flex-lg-nowrap{flex-wrap:nowrap!important}.flex-lg-wrap-reverse{flex-wrap:wrap-reverse!important}.gap-lg-0{gap:0!important}.gap-lg-1{gap:.25rem!important}.gap-lg-2{gap:.5rem!important}.gap-lg-3{gap:1rem!important}.gap-lg-4{gap:1.5rem!important}.gap-lg-5{gap:3rem!important}.justify-content-lg-start{justify-content:flex-start!important}.justify-content-lg-end{justify-content:flex-end!important}.justify-content-lg-center{justify-content:center!important}.justify-content-lg-between{justify-content:space-between!important}.justify-content-lg-around{justify-content:space-around!important}.justify-content-lg-evenly{justify-content:space-evenly!important}.align-items-lg-start{align-items:flex-start!important}.align-items-lg-end{align-items:flex-end!important}.align-items-lg-center{align-items:center!important}.align-items-lg-baseline{align-items:baseline!important}.align-items-lg-stretch{align-items:stretch!important}.align-content-lg-start{align-content:flex-start!important}.align-content-lg-end{align-content:flex-end!important}.align-content-lg-center{align-content:center!important}.align-content-lg-between{align-content:space-between!important}.align-content-lg-around{align-content:space-around!important}.align-content-lg-stretch{align-content:stretch!important}.align-self-lg-auto{align-self:auto!important}.align-self-lg-start{align-self:flex-start!important}.align-self-lg-end{align-self:flex-end!important}.align-self-lg-center{align-self:center!important}.align-self-lg-baseline{align-self:baseline!important}.align-self-lg-stretch{align-self:stretch!important}.order-lg-first{order:-1!important}.order-lg-0{order:0!important}.order-lg-1{order:1!important}.order-lg-2{order:2!important}.order-lg-3{order:3!important}.order-lg-4{order:4!important}.order-lg-5{order:5!important}.order-lg-last{order:6!important}.m-lg-0{margin:0!important}.m-lg-1{margin:.25rem!important}.m-lg-2{margin:.5rem!important}.m-lg-3{margin:1rem!important}.m-lg-4{margin:1.5rem!important}.m-lg-5{margin:3rem!important}.m-lg-auto{margin:auto!important}.mx-lg-0{margin-right:0!important;margin-left:0!important}.mx-lg-1{margin-right:.25rem!important;margin-left:.25rem!important}.mx-lg-2{margin-right:.5rem!important;margin-left:.5rem!important}.mx-lg-3{margin-right:1rem!important;margin-left:1rem!important}.mx-lg-4{margin-right:1.5rem!important;margin-left:1.5rem!important}.mx-lg-5{margin-right:3rem!important;margin-left:3rem!important}.mx-lg-auto{margin-right:auto!important;margin-left:auto!important}.my-lg-0{margin-top:0!important;margin-bottom:0!important}.my-lg-1{margin-top:.25rem!important;margin-bottom:.25rem!important}.my-lg-2{margin-top:.5rem!important;margin-bottom:.5rem!important}.my-lg-3{margin-top:1rem!important;margin-bottom:1rem!important}.my-lg-4{margin-top:1.5rem!important;margin-bottom:1.5rem!important}.my-lg-5{margin-top:3rem!important;margin-bottom:3rem!important}.my-lg-auto{margin-top:auto!important;margin-bottom:auto!important}.mt-lg-0{margin-top:0!important}.mt-lg-1{margin-top:.25rem!important}.mt-lg-2{margin-top:.5rem!important}.mt-lg-3{margin-top:1rem!important}.mt-lg-4{margin-top:1.5rem!important}.mt-lg-5{margin-top:3rem!important}.mt-lg-auto{margin-top:auto!important}.me-lg-0{margin-right:0!important}.me-lg-1{margin-right:.25rem!important}.me-lg-2{margin-right:.5rem!important}.me-lg-3{margin-right:1rem!important}.me-lg-4{margin-right:1.5rem!important}.me-lg-5{margin-right:3rem!important}.me-lg-auto{margin-right:auto!important}.mb-lg-0{margin-bottom:0!important}.mb-lg-1{margin-bottom:.25rem!important}.mb-lg-2{margin-bottom:.5rem!important}.mb-lg-3{margin-bottom:1rem!important}.mb-lg-4{margin-bottom:1.5rem!important}.mb-lg-5{margin-bottom:3rem!important}.mb-lg-auto{margin-bottom:auto!important}.ms-lg-0{margin-left:0!important}.ms-lg-1{margin-left:.25rem!important}.ms-lg-2{margin-left:.5rem!important}.ms-lg-3{margin-left:1rem!important}.ms-lg-4{margin-left:1.5rem!important}.ms-lg-5{margin-left:3rem!important}.ms-lg-auto{margin-left:auto!important}.p-lg-0{padding:0!important}.p-lg-1{padding:.25rem!important}.p-lg-2{padding:.5rem!important}.p-lg-3{padding:1rem!important}.p-lg-4{padding:1.5rem!important}.p-lg-5{padding:3rem!important}.px-lg-0{padding-right:0!important;padding-left:0!important}.px-lg-1{padding-right:.25rem!important;padding-left:.25rem!important}.px-lg-2{padding-right:.5rem!important;padding-left:.5rem!important}.px-lg-3{padding-right:1rem!important;padding-left:1rem!important}.px-lg-4{padding-right:1.5rem!important;padding-left:1.5rem!important}.px-lg-5{padding-right:3rem!important;padding-left:3rem!important}.py-lg-0{padding-top:0!important;padding-bottom:0!important}.py-lg-1{padding-top:.25rem!important;padding-bottom:.25rem!important}.py-lg-2{padding-top:.5rem!important;padding-bottom:.5rem!important}.py-lg-3{padding-top:1rem!important;padding-bottom:1rem!important}.py-lg-4{padding-top:1.5rem!important;padding-bottom:1.5rem!important}.py-lg-5{padding-top:3rem!important;padding-bottom:3rem!important}.pt-lg-0{padding-top:0!important}.pt-lg-1{padding-top:.25rem!important}.pt-lg-2{padding-top:.5rem!important}.pt-lg-3{padding-top:1rem!important}.pt-lg-4{padding-top:1.5rem!important}.pt-lg-5{padding-top:3rem!important}.pe-lg-0{padding-right:0!important}.pe-lg-1{padding-right:.25rem!important}.pe-lg-2{padding-right:.5rem!important}.pe-lg-3{padding-right:1rem!important}.pe-lg-4{padding-right:1.5rem!important}.pe-lg-5{padding-right:3rem!important}.pb-lg-0{padding-bottom:0!important}.pb-lg-1{padding-bottom:.25rem!important}.pb-lg-2{padding-bottom:.5rem!important}.pb-lg-3{padding-bottom:1rem!important}.pb-lg-4{padding-bottom:1.5rem!important}.pb-lg-5{padding-bottom:3rem!important}.ps-lg-0{padding-left:0!important}.ps-lg-1{padding-left:.25rem!important}.ps-lg-2{padding-left:.5rem!important}.ps-lg-3{padding-left:1rem!important}.ps-lg-4{padding-left:1.5rem!important}.ps-lg-5{padding-left:3rem!important}.text-lg-start{text-align:left!important}.text-lg-end{text-align:right!important}.text-lg-center{text-align:center!important}}@media (min-width: 1200px){.float-xl-start{float:left!important}.float-xl-end{float:right!important}.float-xl-none{float:none!important}.d-xl-inline{display:inline!important}.d-xl-inline-block{display:inline-block!important}.d-xl-block{display:block!important}.d-xl-grid{display:grid!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:flex!important}.d-xl-inline-flex{display:inline-flex!important}.d-xl-none{display:none!important}.flex-xl-fill{flex:1 1 auto!important}.flex-xl-row{flex-direction:row!important}.flex-xl-column{flex-direction:column!important}.flex-xl-row-reverse{flex-direction:row-reverse!important}.flex-xl-column-reverse{flex-direction:column-reverse!important}.flex-xl-grow-0{flex-grow:0!important}.flex-xl-grow-1{flex-grow:1!important}.flex-xl-shrink-0{flex-shrink:0!important}.flex-xl-shrink-1{flex-shrink:1!important}.flex-xl-wrap{flex-wrap:wrap!important}.flex-xl-nowrap{flex-wrap:nowrap!important}.flex-xl-wrap-reverse{flex-wrap:wrap-reverse!important}.gap-xl-0{gap:0!important}.gap-xl-1{gap:.25rem!important}.gap-xl-2{gap:.5rem!important}.gap-xl-3{gap:1rem!important}.gap-xl-4{gap:1.5rem!important}.gap-xl-5{gap:3rem!important}.justify-content-xl-start{justify-content:flex-start!important}.justify-content-xl-end{justify-content:flex-end!important}.justify-content-xl-center{justify-content:center!important}.justify-content-xl-between{justify-content:space-between!important}.justify-content-xl-around{justify-content:space-around!important}.justify-content-xl-evenly{justify-content:space-evenly!important}.align-items-xl-start{align-items:flex-start!important}.align-items-xl-end{align-items:flex-end!important}.align-items-xl-center{align-items:center!important}.align-items-xl-baseline{align-items:baseline!important}.align-items-xl-stretch{align-items:stretch!important}.align-content-xl-start{align-content:flex-start!important}.align-content-xl-end{align-content:flex-end!important}.align-content-xl-center{align-content:center!important}.align-content-xl-between{align-content:space-between!important}.align-content-xl-around{align-content:space-around!important}.align-content-xl-stretch{align-content:stretch!important}.align-self-xl-auto{align-self:auto!important}.align-self-xl-start{align-self:flex-start!important}.align-self-xl-end{align-self:flex-end!important}.align-self-xl-center{align-self:center!important}.align-self-xl-baseline{align-self:baseline!important}.align-self-xl-stretch{align-self:stretch!important}.order-xl-first{order:-1!important}.order-xl-0{order:0!important}.order-xl-1{order:1!important}.order-xl-2{order:2!important}.order-xl-3{order:3!important}.order-xl-4{order:4!important}.order-xl-5{order:5!important}.order-xl-last{order:6!important}.m-xl-0{margin:0!important}.m-xl-1{margin:.25rem!important}.m-xl-2{margin:.5rem!important}.m-xl-3{margin:1rem!important}.m-xl-4{margin:1.5rem!important}.m-xl-5{margin:3rem!important}.m-xl-auto{margin:auto!important}.mx-xl-0{margin-right:0!important;margin-left:0!important}.mx-xl-1{margin-right:.25rem!important;margin-left:.25rem!important}.mx-xl-2{margin-right:.5rem!important;margin-left:.5rem!important}.mx-xl-3{margin-right:1rem!important;margin-left:1rem!important}.mx-xl-4{margin-right:1.5rem!important;margin-left:1.5rem!important}.mx-xl-5{margin-right:3rem!important;margin-left:3rem!important}.mx-xl-auto{margin-right:auto!important;margin-left:auto!important}.my-xl-0{margin-top:0!important;margin-bottom:0!important}.my-xl-1{margin-top:.25rem!important;margin-bottom:.25rem!important}.my-xl-2{margin-top:.5rem!important;margin-bottom:.5rem!important}.my-xl-3{margin-top:1rem!important;margin-bottom:1rem!important}.my-xl-4{margin-top:1.5rem!important;margin-bottom:1.5rem!important}.my-xl-5{margin-top:3rem!important;margin-bottom:3rem!important}.my-xl-auto{margin-top:auto!important;margin-bottom:auto!important}.mt-xl-0{margin-top:0!important}.mt-xl-1{margin-top:.25rem!important}.mt-xl-2{margin-top:.5rem!important}.mt-xl-3{margin-top:1rem!important}.mt-xl-4{margin-top:1.5rem!important}.mt-xl-5{margin-top:3rem!important}.mt-xl-auto{margin-top:auto!important}.me-xl-0{margin-right:0!important}.me-xl-1{margin-right:.25rem!important}.me-xl-2{margin-right:.5rem!important}.me-xl-3{margin-right:1rem!important}.me-xl-4{margin-right:1.5rem!important}.me-xl-5{margin-right:3rem!important}.me-xl-auto{margin-right:auto!important}.mb-xl-0{margin-bottom:0!important}.mb-xl-1{margin-bottom:.25rem!important}.mb-xl-2{margin-bottom:.5rem!important}.mb-xl-3{margin-bottom:1rem!important}.mb-xl-4{margin-bottom:1.5rem!important}.mb-xl-5{margin-bottom:3rem!important}.mb-xl-auto{margin-bottom:auto!important}.ms-xl-0{margin-left:0!important}.ms-xl-1{margin-left:.25rem!important}.ms-xl-2{margin-left:.5rem!important}.ms-xl-3{margin-left:1rem!important}.ms-xl-4{margin-left:1.5rem!important}.ms-xl-5{margin-left:3rem!important}.ms-xl-auto{margin-left:auto!important}.p-xl-0{padding:0!important}.p-xl-1{padding:.25rem!important}.p-xl-2{padding:.5rem!important}.p-xl-3{padding:1rem!important}.p-xl-4{padding:1.5rem!important}.p-xl-5{padding:3rem!important}.px-xl-0{padding-right:0!important;padding-left:0!important}.px-xl-1{padding-right:.25rem!important;padding-left:.25rem!important}.px-xl-2{padding-right:.5rem!important;padding-left:.5rem!important}.px-xl-3{padding-right:1rem!important;padding-left:1rem!important}.px-xl-4{padding-right:1.5rem!important;padding-left:1.5rem!important}.px-xl-5{padding-right:3rem!important;padding-left:3rem!important}.py-xl-0{padding-top:0!important;padding-bottom:0!important}.py-xl-1{padding-top:.25rem!important;padding-bottom:.25rem!important}.py-xl-2{padding-top:.5rem!important;padding-bottom:.5rem!important}.py-xl-3{padding-top:1rem!important;padding-bottom:1rem!important}.py-xl-4{padding-top:1.5rem!important;padding-bottom:1.5rem!important}.py-xl-5{padding-top:3rem!important;padding-bottom:3rem!important}.pt-xl-0{padding-top:0!important}.pt-xl-1{padding-top:.25rem!important}.pt-xl-2{padding-top:.5rem!important}.pt-xl-3{padding-top:1rem!important}.pt-xl-4{padding-top:1.5rem!important}.pt-xl-5{padding-top:3rem!important}.pe-xl-0{padding-right:0!important}.pe-xl-1{padding-right:.25rem!important}.pe-xl-2{padding-right:.5rem!important}.pe-xl-3{padding-right:1rem!important}.pe-xl-4{padding-right:1.5rem!important}.pe-xl-5{padding-right:3rem!important}.pb-xl-0{padding-bottom:0!important}.pb-xl-1{padding-bottom:.25rem!important}.pb-xl-2{padding-bottom:.5rem!important}.pb-xl-3{padding-bottom:1rem!important}.pb-xl-4{padding-bottom:1.5rem!important}.pb-xl-5{padding-bottom:3rem!important}.ps-xl-0{padding-left:0!important}.ps-xl-1{padding-left:.25rem!important}.ps-xl-2{padding-left:.5rem!important}.ps-xl-3{padding-left:1rem!important}.ps-xl-4{padding-left:1.5rem!important}.ps-xl-5{padding-left:3rem!important}.text-xl-start{text-align:left!important}.text-xl-end{text-align:right!important}.text-xl-center{text-align:center!important}}@media (min-width: 1450px){.float-2xl-start{float:left!important}.float-2xl-end{float:right!important}.float-2xl-none{float:none!important}.d-2xl-inline{display:inline!important}.d-2xl-inline-block{display:inline-block!important}.d-2xl-block{display:block!important}.d-2xl-grid{display:grid!important}.d-2xl-table{display:table!important}.d-2xl-table-row{display:table-row!important}.d-2xl-table-cell{display:table-cell!important}.d-2xl-flex{display:flex!important}.d-2xl-inline-flex{display:inline-flex!important}.d-2xl-none{display:none!important}.flex-2xl-fill{flex:1 1 auto!important}.flex-2xl-row{flex-direction:row!important}.flex-2xl-column{flex-direction:column!important}.flex-2xl-row-reverse{flex-direction:row-reverse!important}.flex-2xl-column-reverse{flex-direction:column-reverse!important}.flex-2xl-grow-0{flex-grow:0!important}.flex-2xl-grow-1{flex-grow:1!important}.flex-2xl-shrink-0{flex-shrink:0!important}.flex-2xl-shrink-1{flex-shrink:1!important}.flex-2xl-wrap{flex-wrap:wrap!important}.flex-2xl-nowrap{flex-wrap:nowrap!important}.flex-2xl-wrap-reverse{flex-wrap:wrap-reverse!important}.gap-2xl-0{gap:0!important}.gap-2xl-1{gap:.25rem!important}.gap-2xl-2{gap:.5rem!important}.gap-2xl-3{gap:1rem!important}.gap-2xl-4{gap:1.5rem!important}.gap-2xl-5{gap:3rem!important}.justify-content-2xl-start{justify-content:flex-start!important}.justify-content-2xl-end{justify-content:flex-end!important}.justify-content-2xl-center{justify-content:center!important}.justify-content-2xl-between{justify-content:space-between!important}.justify-content-2xl-around{justify-content:space-around!important}.justify-content-2xl-evenly{justify-content:space-evenly!important}.align-items-2xl-start{align-items:flex-start!important}.align-items-2xl-end{align-items:flex-end!important}.align-items-2xl-center{align-items:center!important}.align-items-2xl-baseline{align-items:baseline!important}.align-items-2xl-stretch{align-items:stretch!important}.align-content-2xl-start{align-content:flex-start!important}.align-content-2xl-end{align-content:flex-end!important}.align-content-2xl-center{align-content:center!important}.align-content-2xl-between{align-content:space-between!important}.align-content-2xl-around{align-content:space-around!important}.align-content-2xl-stretch{align-content:stretch!important}.align-self-2xl-auto{align-self:auto!important}.align-self-2xl-start{align-self:flex-start!important}.align-self-2xl-end{align-self:flex-end!important}.align-self-2xl-center{align-self:center!important}.align-self-2xl-baseline{align-self:baseline!important}.align-self-2xl-stretch{align-self:stretch!important}.order-2xl-first{order:-1!important}.order-2xl-0{order:0!important}.order-2xl-1{order:1!important}.order-2xl-2{order:2!important}.order-2xl-3{order:3!important}.order-2xl-4{order:4!important}.order-2xl-5{order:5!important}.order-2xl-last{order:6!important}.m-2xl-0{margin:0!important}.m-2xl-1{margin:.25rem!important}.m-2xl-2{margin:.5rem!important}.m-2xl-3{margin:1rem!important}.m-2xl-4{margin:1.5rem!important}.m-2xl-5{margin:3rem!important}.m-2xl-auto{margin:auto!important}.mx-2xl-0{margin-right:0!important;margin-left:0!important}.mx-2xl-1{margin-right:.25rem!important;margin-left:.25rem!important}.mx-2xl-2{margin-right:.5rem!important;margin-left:.5rem!important}.mx-2xl-3{margin-right:1rem!important;margin-left:1rem!important}.mx-2xl-4{margin-right:1.5rem!important;margin-left:1.5rem!important}.mx-2xl-5{margin-right:3rem!important;margin-left:3rem!important}.mx-2xl-auto{margin-right:auto!important;margin-left:auto!important}.my-2xl-0{margin-top:0!important;margin-bottom:0!important}.my-2xl-1{margin-top:.25rem!important;margin-bottom:.25rem!important}.my-2xl-2{margin-top:.5rem!important;margin-bottom:.5rem!important}.my-2xl-3{margin-top:1rem!important;margin-bottom:1rem!important}.my-2xl-4{margin-top:1.5rem!important;margin-bottom:1.5rem!important}.my-2xl-5{margin-top:3rem!important;margin-bottom:3rem!important}.my-2xl-auto{margin-top:auto!important;margin-bottom:auto!important}.mt-2xl-0{margin-top:0!important}.mt-2xl-1{margin-top:.25rem!important}.mt-2xl-2{margin-top:.5rem!important}.mt-2xl-3{margin-top:1rem!important}.mt-2xl-4{margin-top:1.5rem!important}.mt-2xl-5{margin-top:3rem!important}.mt-2xl-auto{margin-top:auto!important}.me-2xl-0{margin-right:0!important}.me-2xl-1{margin-right:.25rem!important}.me-2xl-2{margin-right:.5rem!important}.me-2xl-3{margin-right:1rem!important}.me-2xl-4{margin-right:1.5rem!important}.me-2xl-5{margin-right:3rem!important}.me-2xl-auto{margin-right:auto!important}.mb-2xl-0{margin-bottom:0!important}.mb-2xl-1{margin-bottom:.25rem!important}.mb-2xl-2{margin-bottom:.5rem!important}.mb-2xl-3{margin-bottom:1rem!important}.mb-2xl-4{margin-bottom:1.5rem!important}.mb-2xl-5{margin-bottom:3rem!important}.mb-2xl-auto{margin-bottom:auto!important}.ms-2xl-0{margin-left:0!important}.ms-2xl-1{margin-left:.25rem!important}.ms-2xl-2{margin-left:.5rem!important}.ms-2xl-3{margin-left:1rem!important}.ms-2xl-4{margin-left:1.5rem!important}.ms-2xl-5{margin-left:3rem!important}.ms-2xl-auto{margin-left:auto!important}.p-2xl-0{padding:0!important}.p-2xl-1{padding:.25rem!important}.p-2xl-2{padding:.5rem!important}.p-2xl-3{padding:1rem!important}.p-2xl-4{padding:1.5rem!important}.p-2xl-5{padding:3rem!important}.px-2xl-0{padding-right:0!important;padding-left:0!important}.px-2xl-1{padding-right:.25rem!important;padding-left:.25rem!important}.px-2xl-2{padding-right:.5rem!important;padding-left:.5rem!important}.px-2xl-3{padding-right:1rem!important;padding-left:1rem!important}.px-2xl-4{padding-right:1.5rem!important;padding-left:1.5rem!important}.px-2xl-5{padding-right:3rem!important;padding-left:3rem!important}.py-2xl-0{padding-top:0!important;padding-bottom:0!important}.py-2xl-1{padding-top:.25rem!important;padding-bottom:.25rem!important}.py-2xl-2{padding-top:.5rem!important;padding-bottom:.5rem!important}.py-2xl-3{padding-top:1rem!important;padding-bottom:1rem!important}.py-2xl-4{padding-top:1.5rem!important;padding-bottom:1.5rem!important}.py-2xl-5{padding-top:3rem!important;padding-bottom:3rem!important}.pt-2xl-0{padding-top:0!important}.pt-2xl-1{padding-top:.25rem!important}.pt-2xl-2{padding-top:.5rem!important}.pt-2xl-3{padding-top:1rem!important}.pt-2xl-4{padding-top:1.5rem!important}.pt-2xl-5{padding-top:3rem!important}.pe-2xl-0{padding-right:0!important}.pe-2xl-1{padding-right:.25rem!important}.pe-2xl-2{padding-right:.5rem!important}.pe-2xl-3{padding-right:1rem!important}.pe-2xl-4{padding-right:1.5rem!important}.pe-2xl-5{padding-right:3rem!important}.pb-2xl-0{padding-bottom:0!important}.pb-2xl-1{padding-bottom:.25rem!important}.pb-2xl-2{padding-bottom:.5rem!important}.pb-2xl-3{padding-bottom:1rem!important}.pb-2xl-4{padding-bottom:1.5rem!important}.pb-2xl-5{padding-bottom:3rem!important}.ps-2xl-0{padding-left:0!important}.ps-2xl-1{padding-left:.25rem!important}.ps-2xl-2{padding-left:.5rem!important}.ps-2xl-3{padding-left:1rem!important}.ps-2xl-4{padding-left:1.5rem!important}.ps-2xl-5{padding-left:3rem!important}.text-2xl-start{text-align:left!important}.text-2xl-end{text-align:right!important}.text-2xl-center{text-align:center!important}}@media (min-width: 1200px){.fs-1{font-size:2.5rem!important}.fs-2{font-size:2rem!important}.fs-3{font-size:1.75rem!important}.fs-4{font-size:1.5rem!important}}@media print{.d-print-inline{display:inline!important}.d-print-inline-block{display:inline-block!important}.d-print-block{display:block!important}.d-print-grid{display:grid!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:flex!important}.d-print-inline-flex{display:inline-flex!important}.d-print-none{display:none!important}}/*!
+Fork Awesome 1.1.7
+License - https://forkaweso.me/Fork-Awesome/license
+
+Copyright 2018 Dave Gandy & Fork Awesome
+
+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.
+ */@font-face{font-family:ForkAwesome;src:url(forkawesome-webfont.c0fee260bb6fd5fd.eot?v=1.1.7);src:url(forkawesome-webfont.c0fee260bb6fd5fd.eot?#iefix&v=1.1.7) format("embedded-opentype"),url(forkawesome-webfont.d0a4ad9e6369d510.woff2?v=1.1.7) format("woff2"),url(forkawesome-webfont.23671bdbd055fa7b.woff?v=1.1.7) format("woff"),url(forkawesome-webfont.3b3951dce6cf5d60.ttf?v=1.1.7) format("truetype"),url(forkawesome-webfont.3217b1b06e001045.svg?v=1.1.7#forkawesomeregular) format("svg");font-weight:400;font-style:normal}.fa{display:inline-block;font: 14px/1 ForkAwesome;font-size:inherit;text-rendering:auto;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.fa-lg{font-size:1.3333333333em;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,.fa{width:1.2857142857em;text-align:center}.fa-ul{padding-left:0;margin-left:2.1428571429em;list-style-type:none}.fa-ul>li{position:relative}.fa-li{position:absolute;left:-2.1428571429em;width:2.1428571429em;top:.1428571429em;text-align:center}.fa-li.fa-lg{left:-1.8571428571em}.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{animation:fa-spin 2s infinite linear}.fa-pulse{animation:fa-spin 1s infinite steps(8)}@keyframes fa-spin{0%{transform:rotate(0)}to{transform:rotate(359deg)}}.fa-rotate-90{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=1)";transform:rotate(90deg)}.fa-rotate-180{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2)";transform:rotate(180deg)}.fa-rotate-270{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=3)";transform:rotate(270deg)}.fa-flip-horizontal{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=0, mirror=1)";transform:scaleX(-1)}.fa-flip-vertical{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1)";transform:scaleY(-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-sync:before,.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:before,.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-o: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-globe-e:before{content:"\f304"}.fa-globe-w:before{content:"\f305"}.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-community:before,.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-g:before,.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:before{content:"\f0a2"}.fa-coffee:before{content:"\f0f4"}.fa-utensils:before,.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-pound:before,.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-down:before,.fa-sort-alpha-asc:before{content:"\f15d"}.fa-sort-alpha-up:before,.fa-sort-alpha-desc:before{content:"\f15e"}.fa-sort-amount-down:before,.fa-sort-amount-asc:before{content:"\f160"}.fa-sort-amount-up:before,.fa-sort-amount-desc:before{content:"\f161"}.fa-sort-numeric-down:before,.fa-sort-numeric-asc:before{content:"\f162"}.fa-sort-numeric-up:before,.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-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-utensil-spoon:before,.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-heading:before,.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-closed-captioning:before,.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-gem:before,.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-medium-square:before{content:"\f2f8"}.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-v:before,.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-phone-volume:before,.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-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"}.fa-mastodon:before{content:"\f2e1"}.fa-mastodon-alt:before{content:"\f2e2"}.fa-fork-circle:before,.fa-fork-awesome:before{content:"\f2e3"}.fa-peertube:before{content:"\f2e4"}.fa-diaspora:before{content:"\f2e5"}.fa-friendica:before{content:"\f2e6"}.fa-gnu-social:before{content:"\f2e7"}.fa-liberapay-square:before{content:"\f2e8"}.fa-liberapay:before{content:"\f2e9"}.fa-ssb:before,.fa-scuttlebutt:before{content:"\f2ea"}.fa-hubzilla:before{content:"\f2eb"}.fa-social-home:before{content:"\f2ec"}.fa-artstation:before{content:"\f2ed"}.fa-discord:before{content:"\f2ee"}.fa-discord-alt:before{content:"\f2ef"}.fa-patreon:before{content:"\f2f0"}.fa-snowdrift:before{content:"\f2f1"}.fa-activitypub:before{content:"\f2f2"}.fa-ethereum:before{content:"\f2f3"}.fa-keybase:before{content:"\f2f4"}.fa-shaarli:before{content:"\f2f5"}.fa-shaarli-o:before{content:"\f2f6"}.fa-cut-key:before,.fa-key-modern:before{content:"\f2f7"}.fa-xmpp:before{content:"\f2f9"}.fa-archive-org:before{content:"\f2fc"}.fa-freedombox:before{content:"\f2fd"}.fa-facebook-messenger:before{content:"\f2fe"}.fa-debian:before{content:"\f2ff"}.fa-mastodon-square:before{content:"\f300"}.fa-tipeee:before{content:"\f301"}.fa-react:before{content:"\f302"}.fa-dogmazic:before{content:"\f303"}.fa-zotero:before{content:"\f309"}.fa-nodejs:before{content:"\f308"}.fa-nextcloud:before{content:"\f306"}.fa-nextcloud-square:before{content:"\f307"}.fa-hackaday:before{content:"\f30a"}.fa-laravel:before{content:"\f30b"}.fa-signalapp:before{content:"\f30c"}.fa-gnupg:before{content:"\f30d"}.fa-php:before{content:"\f30e"}.fa-ffmpeg:before{content:"\f30f"}.fa-joplin:before{content:"\f310"}.fa-syncthing:before{content:"\f311"}.fa-inkscape:before{content:"\f312"}.fa-matrix-org:before{content:"\f313"}.fa-pixelfed:before{content:"\f314"}.fa-bootstrap:before{content:"\f315"}.fa-dev-to:before{content:"\f316"}.fa-hashnode:before{content:"\f317"}.fa-jirafeau:before{content:"\f318"}.fa-emby:before{content:"\f319"}.fa-wikidata:before{content:"\f31a"}.fa-gimp:before{content:"\f31b"}.fa-c:before{content:"\f31c"}.fa-digitalocean:before{content:"\f31d"}.fa-att:before{content:"\f31e"}.fa-gitea:before{content:"\f31f"}.fa-file-epub:before{content:"\f321"}.fa-python:before{content:"\f322"}.fa-archlinux:before{content:"\f323"}.fa-pleroma:before{content:"\f324"}.fa-unsplash:before{content:"\f325"}.fa-hackster:before{content:"\f326"}.fa-spell-check:before{content:"\f327"}.fa-moon:before{content:"\f328"}.fa-sun:before{content:"\f329"}.fa-f-droid:before{content:"\f32a"}.fa-biometric:before{content:"\f32b"}.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}.info-card-popover-cluster-status{max-height:20vh;max-width:23vw}.info-card-popover-cluster-status .popover-body{font-size:1rem;max-height:19vh;max-width:100%;overflow:auto}.info-card-popover-cluster-status .popover-body li span{font-size:1.1em;font-weight:700}.info-card-popover-cluster-status .popover-body li span.health-warn-description{color:#9d6d10!important}@media (max-width: 1199px){.info-card-popover-cluster-status{max-width:31vw}}@media (max-width: 991px){.info-card-popover-cluster-status{max-width:46vw}}@media (max-width: 767px){.info-card-popover-cluster-status{max-width:83vw}}.info-card-content-clickable{border:1px solid #e9ecef;border-radius:3px;cursor:pointer;font-size:1.25em;padding:7px}.info-card-content-clickable:hover{background-color:#e9ecef;border-color:#ced4da}html{background-color:#fff}html,body{font-size:12px;height:100%;width:100%}option{font-style:normal;font-weight:400}mark,.mark{background-color:#d48200;padding:0}.full-height{height:100vh}.full-width{width:100vw}.vertical-align{align-items:center;display:flex}.horizontal-align{display:flex;justify-content:center}.loading:not(cd-api-docs *){left:50%;position:absolute;top:50%}.margin-right-md{margin-right:15px}.no-border{border:0;box-shadow:0 0!important}.italic{font-style:italic}.bold{font-weight:700}.text-right{text-align:right}.text-monospace{font-family:monospace}.text-pre-wrap{white-space:pre-wrap}.text-pre{white-space:pre}.icon-danger-color{color:#dc3545}.icon-warning-color{color:#d48200}.border-warning{border-left:4px solid #d48200}.border-danger{border-left:4px solid #dc3545}.border-info{border-left:4px solid #25828e}.border-success{border-left:4px solid #008a00}.vertical-line{border-left:1px solid #ced4da}a.nav-link{color:#25828e}.was-validated .form-check-input:valid,.was-validated .custom-checkbox .custom-control-input:valid,.custom-checkbox .was-validated .custom-control-input:valid,.form-check-input.is-valid,.custom-checkbox .is-valid.custom-control-input{border-color:#25828ecc}.was-validated .form-check-input:valid:checked,.was-validated .custom-checkbox .custom-control-input:valid:checked,.custom-checkbox .was-validated .custom-control-input:valid:checked,.form-check-input.is-valid:checked,.custom-checkbox .is-valid.custom-control-input:checked{background-color:#25828e;border-color:#25828ecc;box-shadow:0 0 3px 2px #25828e80}.was-validated .form-check-input:valid:focus,.was-validated .custom-checkbox .custom-control-input:valid:focus,.custom-checkbox .was-validated .custom-control-input:valid:focus,.form-check-input.is-valid:focus,.custom-checkbox .is-valid.custom-control-input:focus{border-color:#25828ecc;box-shadow:0 0 3px 2px #25828e80}.was-validated .form-check-input:valid~.form-check-label,.was-validated .custom-checkbox .form-check-input:valid~.custom-control-label,.custom-checkbox .was-validated .form-check-input:valid~.custom-control-label,.was-validated .custom-checkbox .custom-control-input:valid~.form-check-label,.was-validated .custom-checkbox .custom-control-input:valid~.custom-control-label,.custom-checkbox .was-validated .custom-control-input:valid~.form-check-label,.custom-checkbox .was-validated .custom-control-input:valid~.custom-control-label,.form-check-input.is-valid~.form-check-label,.custom-checkbox .form-check-input.is-valid~.custom-control-label,.custom-checkbox .is-valid.custom-control-input~.form-check-label,.custom-checkbox .is-valid.custom-control-input~.custom-control-label{color:initial}.was-validated .form-check-input:valid:checked~.form-check-label:before,.was-validated .custom-checkbox .form-check-input:valid:checked~.custom-control-label:before,.custom-checkbox .was-validated .form-check-input:valid:checked~.custom-control-label:before,.was-validated .custom-checkbox .custom-control-input:valid:checked~.form-check-label:before,.was-validated .custom-checkbox .custom-control-input:valid:checked~.custom-control-label:before,.custom-checkbox .was-validated .custom-control-input:valid:checked~.form-check-label:before,.custom-checkbox .was-validated .custom-control-input:valid:checked~.custom-control-label:before,.form-check-input.is-valid:checked~.form-check-label:before,.custom-checkbox .form-check-input.is-valid:checked~.custom-control-label:before,.custom-checkbox .is-valid.custom-control-input:checked~.form-check-label:before,.custom-checkbox .is-valid.custom-control-input:checked~.custom-control-label:before{background-color:#25828e}.was-validated .form-check-input:valid~.form-check-label:before,.was-validated .custom-checkbox .form-check-input:valid~.custom-control-label:before,.custom-checkbox .was-validated .form-check-input:valid~.custom-control-label:before,.was-validated .custom-checkbox .custom-control-input:valid~.form-check-label:before,.was-validated .custom-checkbox .custom-control-input:valid~.custom-control-label:before,.custom-checkbox .was-validated .custom-control-input:valid~.form-check-label:before,.custom-checkbox .was-validated .custom-control-input:valid~.custom-control-label:before,.form-check-input.is-valid~.form-check-label:before,.custom-checkbox .form-check-input.is-valid~.custom-control-label:before,.custom-checkbox .is-valid.custom-control-input~.form-check-label:before,.custom-checkbox .is-valid.custom-control-input~.custom-control-label:before{border-color:#25828ecc}.was-validated .form-check-input:valid:focus~.custom-control-label:before,.was-validated .custom-checkbox .custom-control-input:valid:focus~.custom-control-label:before,.custom-checkbox .was-validated .custom-control-input:valid:focus~.custom-control-label:before,.form-check-input.is-valid:focus~.custom-control-label:before,.custom-checkbox .is-valid.custom-control-input:focus~.custom-control-label:before{box-shadow:0 0 3px 2px #25828e80}.was-validated .form-check-input:valid:focus:not(:checked)~.custom-control-label:before,.was-validated .custom-checkbox .custom-control-input:valid:focus:not(:checked)~.custom-control-label:before,.custom-checkbox .was-validated .custom-control-input:valid:focus:not(:checked)~.custom-control-label:before,.form-check-input.is-valid:focus:not(:checked)~.custom-control-label:before,.custom-checkbox .is-valid.custom-control-input:focus:not(:checked)~.custom-control-label:before{border-color:#25828ecc}.btn-light{background-color:#fff;border-color:#ced4da!important}.btn-light:hover{background-color:#dee2e6;border-color:#6c757d!important}.btn-light:disabled{background-color:#e9ecef;border-color:#ced4da!important}.btn:focus,.btn.focus,.btn:active:focus,.btn:active.focus,.btn.active:focus,.btn.active.focus{outline:0}.btn.disabled{border:0;box-shadow:none}.btn-primary .badge,.btn-primary .badge-dark,.btn-primary .badge-light,.btn-primary .badge-warning,.btn-primary .badge-info,.btn-primary .badge-danger,.btn-primary .badge-success,.btn-primary .badge-secondary,.btn-primary .badge-primary{background-color:#e9ecef;color:#25828e}.btn-group>.btn>i.fa,.cd-datatable-actions button.btn i.fa{margin-right:5px}.card-footer button.btn:not(:first-child){margin-left:5px}.dropdown-menu{min-width:50px;z-index:999999}.dropdown-menu button.dropdown-item:focus{outline:none}.dropdown-menu>li>a{cursor:pointer}.dropdown-menu>li>a>i.fa{margin-right:5px}.dropdown-menu>.active>a{background-color:#25828e;color:#e9ecef}.dropdown-menu>.active>a,.dropdown-menu>.active>a:hover,.dropdown-menu>.active>a:focus{background-color:#1a5d66}.dataTables_wrapper .dropdown-menu>li.dropdown-divider{cursor:auto}.required:after{color:#dc3545;content:"*";font-size:1.167rem;padding-left:4px}.form-footer{display:flex;width:100%}.form-control,.cd-form-control,.form-select{display:table-cell}.form-control:focus,.cd-form-control:focus,.form-select:focus{border-color:#25828ecc;box-shadow:0 0 3px 2px #25828e80;outline:0}.custom-checkbox{padding-top:7px}.custom-radio{padding-top:5px}cd-modal .modal{background-color:#0006;display:block}cd-modal .modal-dialog{max-width:70vh}.invalid-feedback{display:block}.container-fluid,.container-sm,.container-md,.container-lg,.container-xl,.container-xxl{padding:0 30px}.ceph-icon{background:url(Ceph_Logo.beb815b55d2e7363.svg)}.prometheus-icon{background:url(prometheus_logo.8057911d27be9bb1.svg)}.custom-icon{background-clip:padding-box;background-repeat:no-repeat;background-size:contain;margin-right:8px;padding:10px}.nav-tabs{margin-bottom:1rem}#toast-container{margin-top:2vw}@media (max-width: 1600px){#toast-container{margin-top:2.5vw}}@media (max-width: 991px){#toast-container{margin-top:9vw}}@media (max-width: 900px){#toast-container{margin-top:10vw}}@media (max-width: 319px){#toast-container{margin-top:11vw}}@media (max-width: 260px){#toast-container{margin-top:14vw}}.toast-message>ul{margin:0;padding-left:1rem}.noscript{padding-top:5em}@media (min-width: 576px){.col-form-label,.cd-col-form-label{text-align:right}}.col-form-label,.cd-col-form-label{font-weight:700}.password-strength-level{flex:100%;margin-top:2px}.password-strength-level .weak,.password-strength-level .ok,.password-strength-level .strong,.password-strength-level .very-strong{border-radius:.25rem;height:13px}.password-strength-level .weak{background:#dc3545;width:25%}.password-strength-level .ok{background:#d48200;width:50%}.password-strength-level .strong{background:#008a00;width:75%}.password-strength-level .very-strong{background:#003e00;width:100%}.badge-background-gray,.badge-hdd{background-color:#6c757d;color:#fff}.badge-background-primary,.badge-ssd{background-color:#25828e;color:#fff}.badge-tab{background-color:#e9ecef;color:#495057}.badge-cd-label-green{background-color:#6ec664;color:#fff}.badge-cd-label-cyan{background-color:#009596;color:#fff}.badge-cd-label-purple{background-color:#a18fff;color:#fff}.badge-cd-label-light-blue{background-color:#35caed;color:#fff}.badge-cd-label-gold{background-color:#f4c145;color:#fff}.badge-cd-label-light-green{background-color:#ace12e;color:#fff;font-weight:bolder}tree-root tree-viewport{min-height:1em}tags-input .tags{border:1px solid #ced4da;border-radius:4px;box-shadow:inset 0 1px 1px #00000017}.card-header{font-size:1.3em}.card-body h2:first-child,.card-body .h2:first-child{margin-top:0}.disabled{pointer-events:none}a:hover{text-decoration:underline}.clickable,a{cursor:pointer;text-decoration:none}a.nav-link,a.btn-light{text-decoration:none}
diff --git a/ceph/src/pybind/mgr/dashboard/frontend/dist/en-US/styles.ffb7f665775e3c191fa3.css b/ceph/src/pybind/mgr/dashboard/frontend/dist/en-US/styles.ffb7f665775e3c191fa3.css
deleted file mode 100644 (file)
index 9b06354..0000000
+++ /dev/null
@@ -1,20 +0,0 @@
-@charset "UTF-8";.swagger-ui{color:#3b4151;
-  /*! normalize.css v7.0.0 | MIT License | github.com/necolas/normalize.css */font-family:sans-serif}.swagger-ui html{-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%;line-height:1.15}.swagger-ui body{margin:0}.swagger-ui article,.swagger-ui aside,.swagger-ui footer,.swagger-ui header,.swagger-ui nav,.swagger-ui section{display:block}.swagger-ui h1{font-size:2em;margin:.67em 0}.swagger-ui figcaption,.swagger-ui figure,.swagger-ui main{display:block}.swagger-ui figure{margin:1em 40px}.swagger-ui hr{box-sizing:initial;height:0;overflow:visible}.swagger-ui pre{font-family:monospace,monospace;font-size:1em}.swagger-ui a{-webkit-text-decoration-skip:objects;background-color:initial}.swagger-ui abbr[title]{border-bottom:none;text-decoration:underline;text-decoration:underline dotted}.swagger-ui b,.swagger-ui strong{font-weight:inherit;font-weight:bolder}.swagger-ui code,.swagger-ui kbd,.swagger-ui samp{font-family:monospace,monospace;font-size:1em}.swagger-ui dfn{font-style:italic}.swagger-ui mark{background-color:#ff0;color:#000}.swagger-ui small{font-size:80%}.swagger-ui sub,.swagger-ui sup{font-size:75%;line-height:0;position:relative;vertical-align:initial}.swagger-ui sub{bottom:-.25em}.swagger-ui sup{top:-.5em}.swagger-ui audio,.swagger-ui video{display:inline-block}.swagger-ui audio:not([controls]){display:none;height:0}.swagger-ui img{border-style:none}.swagger-ui svg:not(:root){overflow:hidden}.swagger-ui button,.swagger-ui input,.swagger-ui optgroup,.swagger-ui select,.swagger-ui textarea{font-family:sans-serif;font-size:100%;line-height:1.15;margin:0}.swagger-ui button,.swagger-ui input{overflow:visible}.swagger-ui button,.swagger-ui select{text-transform:none}.swagger-ui [type=reset],.swagger-ui [type=submit],.swagger-ui button,.swagger-ui html [type=button]{-webkit-appearance:button}.swagger-ui [type=button]::-moz-focus-inner,.swagger-ui [type=reset]::-moz-focus-inner,.swagger-ui [type=submit]::-moz-focus-inner,.swagger-ui button::-moz-focus-inner{border-style:none;padding:0}.swagger-ui [type=button]:-moz-focusring,.swagger-ui [type=reset]:-moz-focusring,.swagger-ui [type=submit]:-moz-focusring,.swagger-ui button:-moz-focusring{outline:1px dotted ButtonText}.swagger-ui fieldset{padding:.35em .75em .625em}.swagger-ui legend{box-sizing:border-box;color:inherit;display:table;max-width:100%;padding:0;white-space:normal}.swagger-ui progress{display:inline-block;vertical-align:initial}.swagger-ui textarea{overflow:auto}.swagger-ui [type=checkbox],.swagger-ui [type=radio]{box-sizing:border-box;padding:0}.swagger-ui [type=number]::-webkit-inner-spin-button,.swagger-ui [type=number]::-webkit-outer-spin-button{height:auto}.swagger-ui [type=search]{-webkit-appearance:textfield;outline-offset:-2px}.swagger-ui [type=search]::-webkit-search-cancel-button,.swagger-ui [type=search]::-webkit-search-decoration{-webkit-appearance:none}.swagger-ui ::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}.swagger-ui details,.swagger-ui menu{display:block}.swagger-ui summary{display:list-item}.swagger-ui canvas{display:inline-block}.swagger-ui [hidden],.swagger-ui template{display:none}.swagger-ui .debug *{outline:1px solid gold}.swagger-ui .debug-white *{outline:1px solid #fff}.swagger-ui .debug-black *{outline:1px solid #000}.swagger-ui .debug-grid{background:#0000 url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAYAAADED76LAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyhpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuNi1jMTExIDc5LjE1ODMyNSwgMjAxNS8wOS8xMC0wMToxMDoyMCAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wTU09Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9tbS8iIHhtbG5zOnN0UmVmPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvc1R5cGUvUmVzb3VyY2VSZWYjIiB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6MTRDOTY4N0U2N0VFMTFFNjg2MzZDQjkwNkQ4MjgwMEIiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6MTRDOTY4N0Q2N0VFMTFFNjg2MzZDQjkwNkQ4MjgwMEIiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENDIDIwMTUgKE1hY2ludG9zaCkiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDo3NjcyQkQ3NjY3QzUxMUU2QjJCQ0UyNDA4MTAwMjE3MSIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDo3NjcyQkQ3NzY3QzUxMUU2QjJCQ0UyNDA4MTAwMjE3MSIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/PsBS+GMAAAAjSURBVHjaYvz//z8DLsD4gcGXiYEAGBIKGBne//fFpwAgwAB98AaF2pjlUQAAAABJRU5ErkJggg==) repeat 0 0}.swagger-ui .debug-grid-16{background:#0000 url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyhpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuNi1jMTExIDc5LjE1ODMyNSwgMjAxNS8wOS8xMC0wMToxMDoyMCAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wTU09Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9tbS8iIHhtbG5zOnN0UmVmPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvc1R5cGUvUmVzb3VyY2VSZWYjIiB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6ODYyRjhERDU2N0YyMTFFNjg2MzZDQjkwNkQ4MjgwMEIiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6ODYyRjhERDQ2N0YyMTFFNjg2MzZDQjkwNkQ4MjgwMEIiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENDIDIwMTUgKE1hY2ludG9zaCkiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDo3NjcyQkQ3QTY3QzUxMUU2QjJCQ0UyNDA4MTAwMjE3MSIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDo3NjcyQkQ3QjY3QzUxMUU2QjJCQ0UyNDA4MTAwMjE3MSIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/PvCS01IAAABMSURBVHjaYmR4/5+BFPBfAMFm/MBgx8RAGWCn1AAmSg34Q6kBDKMGMDCwICeMIemF/5QawEipAWwUhwEjMDvbAWlWkvVBwu8vQIABAEwBCph8U6c0AAAAAElFTkSuQmCC) repeat 0 0}.swagger-ui .debug-grid-8-solid{background:#fff url(data:image/jpeg;base64,/9j/4QAYRXhpZgAASUkqAAgAAAAAAAAAAAAAAP/sABFEdWNreQABAAQAAAAAAAD/4QMxaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wLwA8P3hwYWNrZXQgYmVnaW49Iu+7vyIgaWQ9Ilc1TTBNcENlaGlIenJlU3pOVGN6a2M5ZCI/PiA8eDp4bXBtZXRhIHhtbG5zOng9ImFkb2JlOm5zOm1ldGEvIiB4OnhtcHRrPSJBZG9iZSBYTVAgQ29yZSA1LjYtYzExMSA3OS4xNTgzMjUsIDIwMTUvMDkvMTAtMDE6MTA6MjAgICAgICAgICI+IDxyZGY6UkRGIHhtbG5zOnJkZj0iaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zIyI+IDxyZGY6RGVzY3JpcHRpb24gcmRmOmFib3V0PSIiIHhtbG5zOnhtcD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wLyIgeG1sbnM6eG1wTU09Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9tbS8iIHhtbG5zOnN0UmVmPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvc1R5cGUvUmVzb3VyY2VSZWYjIiB4bXA6Q3JlYXRvclRvb2w9IkFkb2JlIFBob3Rvc2hvcCBDQyAyMDE1IChNYWNpbnRvc2gpIiB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOkIxMjI0OTczNjdCMzExRTZCMkJDRTI0MDgxMDAyMTcxIiB4bXBNTTpEb2N1bWVudElEPSJ4bXAuZGlkOkIxMjI0OTc0NjdCMzExRTZCMkJDRTI0MDgxMDAyMTcxIj4gPHhtcE1NOkRlcml2ZWRGcm9tIHN0UmVmOmluc3RhbmNlSUQ9InhtcC5paWQ6QjEyMjQ5NzE2N0IzMTFFNkIyQkNFMjQwODEwMDIxNzEiIHN0UmVmOmRvY3VtZW50SUQ9InhtcC5kaWQ6QjEyMjQ5NzI2N0IzMTFFNkIyQkNFMjQwODEwMDIxNzEiLz4gPC9yZGY6RGVzY3JpcHRpb24+IDwvcmRmOlJERj4gPC94OnhtcG1ldGE+IDw/eHBhY2tldCBlbmQ9InIiPz7/7gAOQWRvYmUAZMAAAAAB/9sAhAAbGhopHSlBJiZBQi8vL0JHPz4+P0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHAR0pKTQmND8oKD9HPzU/R0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0f/wAARCAAIAAgDASIAAhEBAxEB/8QAWQABAQAAAAAAAAAAAAAAAAAAAAYBAQEAAAAAAAAAAAAAAAAAAAIEEAEBAAMBAAAAAAAAAAAAAAABADECA0ERAAEDBQAAAAAAAAAAAAAAAAARITFBUWESIv/aAAwDAQACEQMRAD8AoOnTV1QTD7JJshP3vSM3P//Z) repeat 0 0}.swagger-ui .debug-grid-16-solid{background:#fff url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAIAAACQkWg2AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyhpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuNi1jMTExIDc5LjE1ODMyNSwgMjAxNS8wOS8xMC0wMToxMDoyMCAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENDIDIwMTUgKE1hY2ludG9zaCkiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6NzY3MkJEN0U2N0M1MTFFNkIyQkNFMjQwODEwMDIxNzEiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6NzY3MkJEN0Y2N0M1MTFFNkIyQkNFMjQwODEwMDIxNzEiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDo3NjcyQkQ3QzY3QzUxMUU2QjJCQ0UyNDA4MTAwMjE3MSIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDo3NjcyQkQ3RDY3QzUxMUU2QjJCQ0UyNDA4MTAwMjE3MSIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/Pve6J3kAAAAzSURBVHjaYvz//z8D0UDsMwMjSRoYP5Gq4SPNbRjVMEQ1fCRDg+in/6+J1AJUxsgAEGAA31BAJMS0GYEAAAAASUVORK5CYII=) repeat 0 0}.swagger-ui .border-box,.swagger-ui a,.swagger-ui article,.swagger-ui body,.swagger-ui code,.swagger-ui dd,.swagger-ui div,.swagger-ui dl,.swagger-ui dt,.swagger-ui fieldset,.swagger-ui footer,.swagger-ui form,.swagger-ui h1,.swagger-ui h2,.swagger-ui h3,.swagger-ui h4,.swagger-ui h5,.swagger-ui h6,.swagger-ui header,.swagger-ui html,.swagger-ui input[type=email],.swagger-ui input[type=number],.swagger-ui input[type=password],.swagger-ui input[type=tel],.swagger-ui input[type=text],.swagger-ui input[type=url],.swagger-ui legend,.swagger-ui li,.swagger-ui main,.swagger-ui ol,.swagger-ui p,.swagger-ui pre,.swagger-ui section,.swagger-ui table,.swagger-ui td,.swagger-ui textarea,.swagger-ui th,.swagger-ui tr,.swagger-ui ul{box-sizing:border-box}.swagger-ui .aspect-ratio{height:0;position:relative}.swagger-ui .aspect-ratio--16x9{padding-bottom:56.25%}.swagger-ui .aspect-ratio--9x16{padding-bottom:177.77%}.swagger-ui .aspect-ratio--4x3{padding-bottom:75%}.swagger-ui .aspect-ratio--3x4{padding-bottom:133.33%}.swagger-ui .aspect-ratio--6x4{padding-bottom:66.6%}.swagger-ui .aspect-ratio--4x6{padding-bottom:150%}.swagger-ui .aspect-ratio--8x5{padding-bottom:62.5%}.swagger-ui .aspect-ratio--5x8{padding-bottom:160%}.swagger-ui .aspect-ratio--7x5{padding-bottom:71.42%}.swagger-ui .aspect-ratio--5x7{padding-bottom:140%}.swagger-ui .aspect-ratio--1x1{padding-bottom:100%}.swagger-ui .aspect-ratio--object{bottom:0;height:100%;left:0;position:absolute;right:0;top:0;width:100%;z-index:100}@media screen and (min-width:30em){.swagger-ui .aspect-ratio-ns{height:0;position:relative}.swagger-ui .aspect-ratio--16x9-ns{padding-bottom:56.25%}.swagger-ui .aspect-ratio--9x16-ns{padding-bottom:177.77%}.swagger-ui .aspect-ratio--4x3-ns{padding-bottom:75%}.swagger-ui .aspect-ratio--3x4-ns{padding-bottom:133.33%}.swagger-ui .aspect-ratio--6x4-ns{padding-bottom:66.6%}.swagger-ui .aspect-ratio--4x6-ns{padding-bottom:150%}.swagger-ui .aspect-ratio--8x5-ns{padding-bottom:62.5%}.swagger-ui .aspect-ratio--5x8-ns{padding-bottom:160%}.swagger-ui .aspect-ratio--7x5-ns{padding-bottom:71.42%}.swagger-ui .aspect-ratio--5x7-ns{padding-bottom:140%}.swagger-ui .aspect-ratio--1x1-ns{padding-bottom:100%}.swagger-ui .aspect-ratio--object-ns{bottom:0;height:100%;left:0;position:absolute;right:0;top:0;width:100%;z-index:100}}@media screen and (min-width:30em) and (max-width:60em){.swagger-ui .aspect-ratio-m{height:0;position:relative}.swagger-ui .aspect-ratio--16x9-m{padding-bottom:56.25%}.swagger-ui .aspect-ratio--9x16-m{padding-bottom:177.77%}.swagger-ui .aspect-ratio--4x3-m{padding-bottom:75%}.swagger-ui .aspect-ratio--3x4-m{padding-bottom:133.33%}.swagger-ui .aspect-ratio--6x4-m{padding-bottom:66.6%}.swagger-ui .aspect-ratio--4x6-m{padding-bottom:150%}.swagger-ui .aspect-ratio--8x5-m{padding-bottom:62.5%}.swagger-ui .aspect-ratio--5x8-m{padding-bottom:160%}.swagger-ui .aspect-ratio--7x5-m{padding-bottom:71.42%}.swagger-ui .aspect-ratio--5x7-m{padding-bottom:140%}.swagger-ui .aspect-ratio--1x1-m{padding-bottom:100%}.swagger-ui .aspect-ratio--object-m{bottom:0;height:100%;left:0;position:absolute;right:0;top:0;width:100%;z-index:100}}@media screen and (min-width:60em){.swagger-ui .aspect-ratio-l{height:0;position:relative}.swagger-ui .aspect-ratio--16x9-l{padding-bottom:56.25%}.swagger-ui .aspect-ratio--9x16-l{padding-bottom:177.77%}.swagger-ui .aspect-ratio--4x3-l{padding-bottom:75%}.swagger-ui .aspect-ratio--3x4-l{padding-bottom:133.33%}.swagger-ui .aspect-ratio--6x4-l{padding-bottom:66.6%}.swagger-ui .aspect-ratio--4x6-l{padding-bottom:150%}.swagger-ui .aspect-ratio--8x5-l{padding-bottom:62.5%}.swagger-ui .aspect-ratio--5x8-l{padding-bottom:160%}.swagger-ui .aspect-ratio--7x5-l{padding-bottom:71.42%}.swagger-ui .aspect-ratio--5x7-l{padding-bottom:140%}.swagger-ui .aspect-ratio--1x1-l{padding-bottom:100%}.swagger-ui .aspect-ratio--object-l{bottom:0;height:100%;left:0;position:absolute;right:0;top:0;width:100%;z-index:100}}.swagger-ui img{max-width:100%}.swagger-ui .cover{background-size:cover!important}.swagger-ui .contain{background-size:contain!important}@media screen and (min-width:30em){.swagger-ui .cover-ns{background-size:cover!important}.swagger-ui .contain-ns{background-size:contain!important}}@media screen and (min-width:30em) and (max-width:60em){.swagger-ui .cover-m{background-size:cover!important}.swagger-ui .contain-m{background-size:contain!important}}@media screen and (min-width:60em){.swagger-ui .cover-l{background-size:cover!important}.swagger-ui .contain-l{background-size:contain!important}}.swagger-ui .bg-center{background-position:50%;background-repeat:no-repeat}.swagger-ui .bg-top{background-position:top;background-repeat:no-repeat}.swagger-ui .bg-right{background-position:100%;background-repeat:no-repeat}.swagger-ui .bg-bottom{background-position:bottom;background-repeat:no-repeat}.swagger-ui .bg-left{background-position:0;background-repeat:no-repeat}@media screen and (min-width:30em){.swagger-ui .bg-center-ns{background-position:50%;background-repeat:no-repeat}.swagger-ui .bg-top-ns{background-position:top;background-repeat:no-repeat}.swagger-ui .bg-right-ns{background-position:100%;background-repeat:no-repeat}.swagger-ui .bg-bottom-ns{background-position:bottom;background-repeat:no-repeat}.swagger-ui .bg-left-ns{background-position:0;background-repeat:no-repeat}}@media screen and (min-width:30em) and (max-width:60em){.swagger-ui .bg-center-m{background-position:50%;background-repeat:no-repeat}.swagger-ui .bg-top-m{background-position:top;background-repeat:no-repeat}.swagger-ui .bg-right-m{background-position:100%;background-repeat:no-repeat}.swagger-ui .bg-bottom-m{background-position:bottom;background-repeat:no-repeat}.swagger-ui .bg-left-m{background-position:0;background-repeat:no-repeat}}@media screen and (min-width:60em){.swagger-ui .bg-center-l{background-position:50%;background-repeat:no-repeat}.swagger-ui .bg-top-l{background-position:top;background-repeat:no-repeat}.swagger-ui .bg-right-l{background-position:100%;background-repeat:no-repeat}.swagger-ui .bg-bottom-l{background-position:bottom;background-repeat:no-repeat}.swagger-ui .bg-left-l{background-position:0;background-repeat:no-repeat}}.swagger-ui .outline{outline:1px solid}.swagger-ui .outline-transparent{outline:1px solid #0000}.swagger-ui .outline-0{outline:0}@media screen and (min-width:30em){.swagger-ui .outline-ns{outline:1px solid}.swagger-ui .outline-transparent-ns{outline:1px solid #0000}.swagger-ui .outline-0-ns{outline:0}}@media screen and (min-width:30em) and (max-width:60em){.swagger-ui .outline-m{outline:1px solid}.swagger-ui .outline-transparent-m{outline:1px solid #0000}.swagger-ui .outline-0-m{outline:0}}@media screen and (min-width:60em){.swagger-ui .outline-l{outline:1px solid}.swagger-ui .outline-transparent-l{outline:1px solid #0000}.swagger-ui .outline-0-l{outline:0}}.swagger-ui .ba{border-style:solid;border-width:1px}.swagger-ui .bt{border-top-style:solid;border-top-width:1px}.swagger-ui .br{border-right-style:solid;border-right-width:1px}.swagger-ui .bb{border-bottom-style:solid;border-bottom-width:1px}.swagger-ui .bl{border-left-style:solid;border-left-width:1px}.swagger-ui .bn{border-style:none;border-width:0}@media screen and (min-width:30em){.swagger-ui .ba-ns{border-style:solid;border-width:1px}.swagger-ui .bt-ns{border-top-style:solid;border-top-width:1px}.swagger-ui .br-ns{border-right-style:solid;border-right-width:1px}.swagger-ui .bb-ns{border-bottom-style:solid;border-bottom-width:1px}.swagger-ui .bl-ns{border-left-style:solid;border-left-width:1px}.swagger-ui .bn-ns{border-style:none;border-width:0}}@media screen and (min-width:30em) and (max-width:60em){.swagger-ui .ba-m{border-style:solid;border-width:1px}.swagger-ui .bt-m{border-top-style:solid;border-top-width:1px}.swagger-ui .br-m{border-right-style:solid;border-right-width:1px}.swagger-ui .bb-m{border-bottom-style:solid;border-bottom-width:1px}.swagger-ui .bl-m{border-left-style:solid;border-left-width:1px}.swagger-ui .bn-m{border-style:none;border-width:0}}@media screen and (min-width:60em){.swagger-ui .ba-l{border-style:solid;border-width:1px}.swagger-ui .bt-l{border-top-style:solid;border-top-width:1px}.swagger-ui .br-l{border-right-style:solid;border-right-width:1px}.swagger-ui .bb-l{border-bottom-style:solid;border-bottom-width:1px}.swagger-ui .bl-l{border-left-style:solid;border-left-width:1px}.swagger-ui .bn-l{border-style:none;border-width:0}}.swagger-ui .b--black{border-color:#000}.swagger-ui .b--near-black{border-color:#111}.swagger-ui .b--dark-gray{border-color:#333}.swagger-ui .b--mid-gray{border-color:#555}.swagger-ui .b--gray{border-color:#777}.swagger-ui .b--silver{border-color:#999}.swagger-ui .b--light-silver{border-color:#aaa}.swagger-ui .b--moon-gray{border-color:#ccc}.swagger-ui .b--light-gray{border-color:#eee}.swagger-ui .b--near-white{border-color:#f4f4f4}.swagger-ui .b--white{border-color:#fff}.swagger-ui .b--white-90{border-color:#ffffffe6}.swagger-ui .b--white-80{border-color:#fffc}.swagger-ui .b--white-70{border-color:#ffffffb3}.swagger-ui .b--white-60{border-color:#fff9}.swagger-ui .b--white-50{border-color:#ffffff80}.swagger-ui .b--white-40{border-color:#fff6}.swagger-ui .b--white-30{border-color:#ffffff4d}.swagger-ui .b--white-20{border-color:#fff3}.swagger-ui .b--white-10{border-color:#ffffff1a}.swagger-ui .b--white-05{border-color:#ffffff0d}.swagger-ui .b--white-025{border-color:hsla(0,0%,100%,.025)}.swagger-ui .b--white-0125{border-color:hsla(0,0%,100%,.013)}.swagger-ui .b--black-90{border-color:#000000e6}.swagger-ui .b--black-80{border-color:#000c}.swagger-ui .b--black-70{border-color:#000000b3}.swagger-ui .b--black-60{border-color:#0009}.swagger-ui .b--black-50{border-color:#00000080}.swagger-ui .b--black-40{border-color:#0006}.swagger-ui .b--black-30{border-color:#0000004d}.swagger-ui .b--black-20{border-color:#0003}.swagger-ui .b--black-10{border-color:#0000001a}.swagger-ui .b--black-05{border-color:#0000000d}.swagger-ui .b--black-025{border-color:rgba(0,0,0,.025)}.swagger-ui .b--black-0125{border-color:rgba(0,0,0,.013)}.swagger-ui .b--dark-red{border-color:#e7040f}.swagger-ui .b--red{border-color:#ff4136}.swagger-ui .b--light-red{border-color:#ff725c}.swagger-ui .b--orange{border-color:#ff6300}.swagger-ui .b--gold{border-color:#ffb700}.swagger-ui .b--yellow{border-color:gold}.swagger-ui .b--light-yellow{border-color:#fbf1a9}.swagger-ui .b--purple{border-color:#5e2ca5}.swagger-ui .b--light-purple{border-color:#a463f2}.swagger-ui .b--dark-pink{border-color:#d5008f}.swagger-ui .b--hot-pink{border-color:#ff41b4}.swagger-ui .b--pink{border-color:#ff80cc}.swagger-ui .b--light-pink{border-color:#ffa3d7}.swagger-ui .b--dark-green{border-color:#137752}.swagger-ui .b--green{border-color:#19a974}.swagger-ui .b--light-green{border-color:#9eebcf}.swagger-ui .b--navy{border-color:#001b44}.swagger-ui .b--dark-blue{border-color:#00449e}.swagger-ui .b--blue{border-color:#357edd}.swagger-ui .b--light-blue{border-color:#96ccff}.swagger-ui .b--lightest-blue{border-color:#cdecff}.swagger-ui .b--washed-blue{border-color:#f6fffe}.swagger-ui .b--washed-green{border-color:#e8fdf5}.swagger-ui .b--washed-yellow{border-color:#fffceb}.swagger-ui .b--washed-red{border-color:#ffdfdf}.swagger-ui .b--transparent{border-color:#0000}.swagger-ui .b--inherit{border-color:inherit}.swagger-ui .br0{border-radius:0}.swagger-ui .br1{border-radius:.125rem}.swagger-ui .br2{border-radius:.25rem}.swagger-ui .br3{border-radius:.5rem}.swagger-ui .br4{border-radius:1rem}.swagger-ui .br-100{border-radius:100%}.swagger-ui .br-pill{border-radius:9999px}.swagger-ui .br--bottom{border-top-left-radius:0;border-top-right-radius:0}.swagger-ui .br--top{border-bottom-left-radius:0;border-bottom-right-radius:0}.swagger-ui .br--right{border-bottom-left-radius:0;border-top-left-radius:0}.swagger-ui .br--left{border-bottom-right-radius:0;border-top-right-radius:0}@media screen and (min-width:30em){.swagger-ui .br0-ns{border-radius:0}.swagger-ui .br1-ns{border-radius:.125rem}.swagger-ui .br2-ns{border-radius:.25rem}.swagger-ui .br3-ns{border-radius:.5rem}.swagger-ui .br4-ns{border-radius:1rem}.swagger-ui .br-100-ns{border-radius:100%}.swagger-ui .br-pill-ns{border-radius:9999px}.swagger-ui .br--bottom-ns{border-top-left-radius:0;border-top-right-radius:0}.swagger-ui .br--top-ns{border-bottom-left-radius:0;border-bottom-right-radius:0}.swagger-ui .br--right-ns{border-bottom-left-radius:0;border-top-left-radius:0}.swagger-ui .br--left-ns{border-bottom-right-radius:0;border-top-right-radius:0}}@media screen and (min-width:30em) and (max-width:60em){.swagger-ui .br0-m{border-radius:0}.swagger-ui .br1-m{border-radius:.125rem}.swagger-ui .br2-m{border-radius:.25rem}.swagger-ui .br3-m{border-radius:.5rem}.swagger-ui .br4-m{border-radius:1rem}.swagger-ui .br-100-m{border-radius:100%}.swagger-ui .br-pill-m{border-radius:9999px}.swagger-ui .br--bottom-m{border-top-left-radius:0;border-top-right-radius:0}.swagger-ui .br--top-m{border-bottom-left-radius:0;border-bottom-right-radius:0}.swagger-ui .br--right-m{border-bottom-left-radius:0;border-top-left-radius:0}.swagger-ui .br--left-m{border-bottom-right-radius:0;border-top-right-radius:0}}@media screen and (min-width:60em){.swagger-ui .br0-l{border-radius:0}.swagger-ui .br1-l{border-radius:.125rem}.swagger-ui .br2-l{border-radius:.25rem}.swagger-ui .br3-l{border-radius:.5rem}.swagger-ui .br4-l{border-radius:1rem}.swagger-ui .br-100-l{border-radius:100%}.swagger-ui .br-pill-l{border-radius:9999px}.swagger-ui .br--bottom-l{border-top-left-radius:0;border-top-right-radius:0}.swagger-ui .br--top-l{border-bottom-left-radius:0;border-bottom-right-radius:0}.swagger-ui .br--right-l{border-bottom-left-radius:0;border-top-left-radius:0}.swagger-ui .br--left-l{border-bottom-right-radius:0;border-top-right-radius:0}}.swagger-ui .b--dotted{border-style:dotted}.swagger-ui .b--dashed{border-style:dashed}.swagger-ui .b--solid{border-style:solid}.swagger-ui .b--none{border-style:none}@media screen and (min-width:30em){.swagger-ui .b--dotted-ns{border-style:dotted}.swagger-ui .b--dashed-ns{border-style:dashed}.swagger-ui .b--solid-ns{border-style:solid}.swagger-ui .b--none-ns{border-style:none}}@media screen and (min-width:30em) and (max-width:60em){.swagger-ui .b--dotted-m{border-style:dotted}.swagger-ui .b--dashed-m{border-style:dashed}.swagger-ui .b--solid-m{border-style:solid}.swagger-ui .b--none-m{border-style:none}}@media screen and (min-width:60em){.swagger-ui .b--dotted-l{border-style:dotted}.swagger-ui .b--dashed-l{border-style:dashed}.swagger-ui .b--solid-l{border-style:solid}.swagger-ui .b--none-l{border-style:none}}.swagger-ui .bw0{border-width:0}.swagger-ui .bw1{border-width:.125rem}.swagger-ui .bw2{border-width:.25rem}.swagger-ui .bw3{border-width:.5rem}.swagger-ui .bw4{border-width:1rem}.swagger-ui .bw5{border-width:2rem}.swagger-ui .bt-0{border-top-width:0}.swagger-ui .br-0{border-right-width:0}.swagger-ui .bb-0{border-bottom-width:0}.swagger-ui .bl-0{border-left-width:0}@media screen and (min-width:30em){.swagger-ui .bw0-ns{border-width:0}.swagger-ui .bw1-ns{border-width:.125rem}.swagger-ui .bw2-ns{border-width:.25rem}.swagger-ui .bw3-ns{border-width:.5rem}.swagger-ui .bw4-ns{border-width:1rem}.swagger-ui .bw5-ns{border-width:2rem}.swagger-ui .bt-0-ns{border-top-width:0}.swagger-ui .br-0-ns{border-right-width:0}.swagger-ui .bb-0-ns{border-bottom-width:0}.swagger-ui .bl-0-ns{border-left-width:0}}@media screen and (min-width:30em) and (max-width:60em){.swagger-ui .bw0-m{border-width:0}.swagger-ui .bw1-m{border-width:.125rem}.swagger-ui .bw2-m{border-width:.25rem}.swagger-ui .bw3-m{border-width:.5rem}.swagger-ui .bw4-m{border-width:1rem}.swagger-ui .bw5-m{border-width:2rem}.swagger-ui .bt-0-m{border-top-width:0}.swagger-ui .br-0-m{border-right-width:0}.swagger-ui .bb-0-m{border-bottom-width:0}.swagger-ui .bl-0-m{border-left-width:0}}@media screen and (min-width:60em){.swagger-ui .bw0-l{border-width:0}.swagger-ui .bw1-l{border-width:.125rem}.swagger-ui .bw2-l{border-width:.25rem}.swagger-ui .bw3-l{border-width:.5rem}.swagger-ui .bw4-l{border-width:1rem}.swagger-ui .bw5-l{border-width:2rem}.swagger-ui .bt-0-l{border-top-width:0}.swagger-ui .br-0-l{border-right-width:0}.swagger-ui .bb-0-l{border-bottom-width:0}.swagger-ui .bl-0-l{border-left-width:0}}.swagger-ui .shadow-1{box-shadow:0 0 4px 2px #0003}.swagger-ui .shadow-2{box-shadow:0 0 8px 2px #0003}.swagger-ui .shadow-3{box-shadow:2px 2px 4px 2px #0003}.swagger-ui .shadow-4{box-shadow:2px 2px 8px 0 #0003}.swagger-ui .shadow-5{box-shadow:4px 4px 8px 0 #0003}@media screen and (min-width:30em){.swagger-ui .shadow-1-ns{box-shadow:0 0 4px 2px #0003}.swagger-ui .shadow-2-ns{box-shadow:0 0 8px 2px #0003}.swagger-ui .shadow-3-ns{box-shadow:2px 2px 4px 2px #0003}.swagger-ui .shadow-4-ns{box-shadow:2px 2px 8px 0 #0003}.swagger-ui .shadow-5-ns{box-shadow:4px 4px 8px 0 #0003}}@media screen and (min-width:30em) and (max-width:60em){.swagger-ui .shadow-1-m{box-shadow:0 0 4px 2px #0003}.swagger-ui .shadow-2-m{box-shadow:0 0 8px 2px #0003}.swagger-ui .shadow-3-m{box-shadow:2px 2px 4px 2px #0003}.swagger-ui .shadow-4-m{box-shadow:2px 2px 8px 0 #0003}.swagger-ui .shadow-5-m{box-shadow:4px 4px 8px 0 #0003}}@media screen and (min-width:60em){.swagger-ui .shadow-1-l{box-shadow:0 0 4px 2px #0003}.swagger-ui .shadow-2-l{box-shadow:0 0 8px 2px #0003}.swagger-ui .shadow-3-l{box-shadow:2px 2px 4px 2px #0003}.swagger-ui .shadow-4-l{box-shadow:2px 2px 8px 0 #0003}.swagger-ui .shadow-5-l{box-shadow:4px 4px 8px 0 #0003}}.swagger-ui .pre{overflow-x:auto;overflow-y:hidden;overflow:scroll}.swagger-ui .top-0{top:0}.swagger-ui .right-0{right:0}.swagger-ui .bottom-0{bottom:0}.swagger-ui .left-0{left:0}.swagger-ui .top-1{top:1rem}.swagger-ui .right-1{right:1rem}.swagger-ui .bottom-1{bottom:1rem}.swagger-ui .left-1{left:1rem}.swagger-ui .top-2{top:2rem}.swagger-ui .right-2{right:2rem}.swagger-ui .bottom-2{bottom:2rem}.swagger-ui .left-2{left:2rem}.swagger-ui .top--1{top:-1rem}.swagger-ui .right--1{right:-1rem}.swagger-ui .bottom--1{bottom:-1rem}.swagger-ui .left--1{left:-1rem}.swagger-ui .top--2{top:-2rem}.swagger-ui .right--2{right:-2rem}.swagger-ui .bottom--2{bottom:-2rem}.swagger-ui .left--2{left:-2rem}.swagger-ui .absolute--fill{bottom:0;left:0;right:0;top:0}@media screen and (min-width:30em){.swagger-ui .top-0-ns{top:0}.swagger-ui .left-0-ns{left:0}.swagger-ui .right-0-ns{right:0}.swagger-ui .bottom-0-ns{bottom:0}.swagger-ui .top-1-ns{top:1rem}.swagger-ui .left-1-ns{left:1rem}.swagger-ui .right-1-ns{right:1rem}.swagger-ui .bottom-1-ns{bottom:1rem}.swagger-ui .top-2-ns{top:2rem}.swagger-ui .left-2-ns{left:2rem}.swagger-ui .right-2-ns{right:2rem}.swagger-ui .bottom-2-ns{bottom:2rem}.swagger-ui .top--1-ns{top:-1rem}.swagger-ui .right--1-ns{right:-1rem}.swagger-ui .bottom--1-ns{bottom:-1rem}.swagger-ui .left--1-ns{left:-1rem}.swagger-ui .top--2-ns{top:-2rem}.swagger-ui .right--2-ns{right:-2rem}.swagger-ui .bottom--2-ns{bottom:-2rem}.swagger-ui .left--2-ns{left:-2rem}.swagger-ui .absolute--fill-ns{bottom:0;left:0;right:0;top:0}}@media screen and (min-width:30em) and (max-width:60em){.swagger-ui .top-0-m{top:0}.swagger-ui .left-0-m{left:0}.swagger-ui .right-0-m{right:0}.swagger-ui .bottom-0-m{bottom:0}.swagger-ui .top-1-m{top:1rem}.swagger-ui .left-1-m{left:1rem}.swagger-ui .right-1-m{right:1rem}.swagger-ui .bottom-1-m{bottom:1rem}.swagger-ui .top-2-m{top:2rem}.swagger-ui .left-2-m{left:2rem}.swagger-ui .right-2-m{right:2rem}.swagger-ui .bottom-2-m{bottom:2rem}.swagger-ui .top--1-m{top:-1rem}.swagger-ui .right--1-m{right:-1rem}.swagger-ui .bottom--1-m{bottom:-1rem}.swagger-ui .left--1-m{left:-1rem}.swagger-ui .top--2-m{top:-2rem}.swagger-ui .right--2-m{right:-2rem}.swagger-ui .bottom--2-m{bottom:-2rem}.swagger-ui .left--2-m{left:-2rem}.swagger-ui .absolute--fill-m{bottom:0;left:0;right:0;top:0}}@media screen and (min-width:60em){.swagger-ui .top-0-l{top:0}.swagger-ui .left-0-l{left:0}.swagger-ui .right-0-l{right:0}.swagger-ui .bottom-0-l{bottom:0}.swagger-ui .top-1-l{top:1rem}.swagger-ui .left-1-l{left:1rem}.swagger-ui .right-1-l{right:1rem}.swagger-ui .bottom-1-l{bottom:1rem}.swagger-ui .top-2-l{top:2rem}.swagger-ui .left-2-l{left:2rem}.swagger-ui .right-2-l{right:2rem}.swagger-ui .bottom-2-l{bottom:2rem}.swagger-ui .top--1-l{top:-1rem}.swagger-ui .right--1-l{right:-1rem}.swagger-ui .bottom--1-l{bottom:-1rem}.swagger-ui .left--1-l{left:-1rem}.swagger-ui .top--2-l{top:-2rem}.swagger-ui .right--2-l{right:-2rem}.swagger-ui .bottom--2-l{bottom:-2rem}.swagger-ui .left--2-l{left:-2rem}.swagger-ui .absolute--fill-l{bottom:0;left:0;right:0;top:0}}.swagger-ui .cf:after,.swagger-ui .cf:before{content:" ";display:table}.swagger-ui .cf:after{clear:both}.swagger-ui .cf{*zoom:1}.swagger-ui .cl{clear:left}.swagger-ui .cr{clear:right}.swagger-ui .cb{clear:both}.swagger-ui .cn{clear:none}@media screen and (min-width:30em){.swagger-ui .cl-ns{clear:left}.swagger-ui .cr-ns{clear:right}.swagger-ui .cb-ns{clear:both}.swagger-ui .cn-ns{clear:none}}@media screen and (min-width:30em) and (max-width:60em){.swagger-ui .cl-m{clear:left}.swagger-ui .cr-m{clear:right}.swagger-ui .cb-m{clear:both}.swagger-ui .cn-m{clear:none}}@media screen and (min-width:60em){.swagger-ui .cl-l{clear:left}.swagger-ui .cr-l{clear:right}.swagger-ui .cb-l{clear:both}.swagger-ui .cn-l{clear:none}}.swagger-ui .flex{display:flex}.swagger-ui .inline-flex{display:inline-flex}.swagger-ui .flex-auto{flex:1 1 auto;min-height:0;min-width:0}.swagger-ui .flex-none{flex:none}.swagger-ui .flex-column{flex-direction:column}.swagger-ui .flex-row{flex-direction:row}.swagger-ui .flex-wrap{flex-wrap:wrap}.swagger-ui .flex-nowrap{flex-wrap:nowrap}.swagger-ui .flex-wrap-reverse{flex-wrap:wrap-reverse}.swagger-ui .flex-column-reverse{flex-direction:column-reverse}.swagger-ui .flex-row-reverse{flex-direction:row-reverse}.swagger-ui .items-start{align-items:flex-start}.swagger-ui .items-end{align-items:flex-end}.swagger-ui .items-center{align-items:center}.swagger-ui .items-baseline{align-items:baseline}.swagger-ui .items-stretch{align-items:stretch}.swagger-ui .self-start{align-self:flex-start}.swagger-ui .self-end{align-self:flex-end}.swagger-ui .self-center{align-self:center}.swagger-ui .self-baseline{align-self:baseline}.swagger-ui .self-stretch{align-self:stretch}.swagger-ui .justify-start{justify-content:flex-start}.swagger-ui .justify-end{justify-content:flex-end}.swagger-ui .justify-center{justify-content:center}.swagger-ui .justify-between{justify-content:space-between}.swagger-ui .justify-around{justify-content:space-around}.swagger-ui .content-start{align-content:flex-start}.swagger-ui .content-end{align-content:flex-end}.swagger-ui .content-center{align-content:center}.swagger-ui .content-between{align-content:space-between}.swagger-ui .content-around{align-content:space-around}.swagger-ui .content-stretch{align-content:stretch}.swagger-ui .order-0{order:0}.swagger-ui .order-1{order:1}.swagger-ui .order-2{order:2}.swagger-ui .order-3{order:3}.swagger-ui .order-4{order:4}.swagger-ui .order-5{order:5}.swagger-ui .order-6{order:6}.swagger-ui .order-7{order:7}.swagger-ui .order-8{order:8}.swagger-ui .order-last{order:99999}.swagger-ui .flex-grow-0{flex-grow:0}.swagger-ui .flex-grow-1{flex-grow:1}.swagger-ui .flex-shrink-0{flex-shrink:0}.swagger-ui .flex-shrink-1{flex-shrink:1}@media screen and (min-width:30em){.swagger-ui .flex-ns{display:flex}.swagger-ui .inline-flex-ns{display:inline-flex}.swagger-ui .flex-auto-ns{flex:1 1 auto;min-height:0;min-width:0}.swagger-ui .flex-none-ns{flex:none}.swagger-ui .flex-column-ns{flex-direction:column}.swagger-ui .flex-row-ns{flex-direction:row}.swagger-ui .flex-wrap-ns{flex-wrap:wrap}.swagger-ui .flex-nowrap-ns{flex-wrap:nowrap}.swagger-ui .flex-wrap-reverse-ns{flex-wrap:wrap-reverse}.swagger-ui .flex-column-reverse-ns{flex-direction:column-reverse}.swagger-ui .flex-row-reverse-ns{flex-direction:row-reverse}.swagger-ui .items-start-ns{align-items:flex-start}.swagger-ui .items-end-ns{align-items:flex-end}.swagger-ui .items-center-ns{align-items:center}.swagger-ui .items-baseline-ns{align-items:baseline}.swagger-ui .items-stretch-ns{align-items:stretch}.swagger-ui .self-start-ns{align-self:flex-start}.swagger-ui .self-end-ns{align-self:flex-end}.swagger-ui .self-center-ns{align-self:center}.swagger-ui .self-baseline-ns{align-self:baseline}.swagger-ui .self-stretch-ns{align-self:stretch}.swagger-ui .justify-start-ns{justify-content:flex-start}.swagger-ui .justify-end-ns{justify-content:flex-end}.swagger-ui .justify-center-ns{justify-content:center}.swagger-ui .justify-between-ns{justify-content:space-between}.swagger-ui .justify-around-ns{justify-content:space-around}.swagger-ui .content-start-ns{align-content:flex-start}.swagger-ui .content-end-ns{align-content:flex-end}.swagger-ui .content-center-ns{align-content:center}.swagger-ui .content-between-ns{align-content:space-between}.swagger-ui .content-around-ns{align-content:space-around}.swagger-ui .content-stretch-ns{align-content:stretch}.swagger-ui .order-0-ns{order:0}.swagger-ui .order-1-ns{order:1}.swagger-ui .order-2-ns{order:2}.swagger-ui .order-3-ns{order:3}.swagger-ui .order-4-ns{order:4}.swagger-ui .order-5-ns{order:5}.swagger-ui .order-6-ns{order:6}.swagger-ui .order-7-ns{order:7}.swagger-ui .order-8-ns{order:8}.swagger-ui .order-last-ns{order:99999}.swagger-ui .flex-grow-0-ns{flex-grow:0}.swagger-ui .flex-grow-1-ns{flex-grow:1}.swagger-ui .flex-shrink-0-ns{flex-shrink:0}.swagger-ui .flex-shrink-1-ns{flex-shrink:1}}@media screen and (min-width:30em) and (max-width:60em){.swagger-ui .flex-m{display:flex}.swagger-ui .inline-flex-m{display:inline-flex}.swagger-ui .flex-auto-m{flex:1 1 auto;min-height:0;min-width:0}.swagger-ui .flex-none-m{flex:none}.swagger-ui .flex-column-m{flex-direction:column}.swagger-ui .flex-row-m{flex-direction:row}.swagger-ui .flex-wrap-m{flex-wrap:wrap}.swagger-ui .flex-nowrap-m{flex-wrap:nowrap}.swagger-ui .flex-wrap-reverse-m{flex-wrap:wrap-reverse}.swagger-ui .flex-column-reverse-m{flex-direction:column-reverse}.swagger-ui .flex-row-reverse-m{flex-direction:row-reverse}.swagger-ui .items-start-m{align-items:flex-start}.swagger-ui .items-end-m{align-items:flex-end}.swagger-ui .items-center-m{align-items:center}.swagger-ui .items-baseline-m{align-items:baseline}.swagger-ui .items-stretch-m{align-items:stretch}.swagger-ui .self-start-m{align-self:flex-start}.swagger-ui .self-end-m{align-self:flex-end}.swagger-ui .self-center-m{align-self:center}.swagger-ui .self-baseline-m{align-self:baseline}.swagger-ui .self-stretch-m{align-self:stretch}.swagger-ui .justify-start-m{justify-content:flex-start}.swagger-ui .justify-end-m{justify-content:flex-end}.swagger-ui .justify-center-m{justify-content:center}.swagger-ui .justify-between-m{justify-content:space-between}.swagger-ui .justify-around-m{justify-content:space-around}.swagger-ui .content-start-m{align-content:flex-start}.swagger-ui .content-end-m{align-content:flex-end}.swagger-ui .content-center-m{align-content:center}.swagger-ui .content-between-m{align-content:space-between}.swagger-ui .content-around-m{align-content:space-around}.swagger-ui .content-stretch-m{align-content:stretch}.swagger-ui .order-0-m{order:0}.swagger-ui .order-1-m{order:1}.swagger-ui .order-2-m{order:2}.swagger-ui .order-3-m{order:3}.swagger-ui .order-4-m{order:4}.swagger-ui .order-5-m{order:5}.swagger-ui .order-6-m{order:6}.swagger-ui .order-7-m{order:7}.swagger-ui .order-8-m{order:8}.swagger-ui .order-last-m{order:99999}.swagger-ui .flex-grow-0-m{flex-grow:0}.swagger-ui .flex-grow-1-m{flex-grow:1}.swagger-ui .flex-shrink-0-m{flex-shrink:0}.swagger-ui .flex-shrink-1-m{flex-shrink:1}}@media screen and (min-width:60em){.swagger-ui .flex-l{display:flex}.swagger-ui .inline-flex-l{display:inline-flex}.swagger-ui .flex-auto-l{flex:1 1 auto;min-height:0;min-width:0}.swagger-ui .flex-none-l{flex:none}.swagger-ui .flex-column-l{flex-direction:column}.swagger-ui .flex-row-l{flex-direction:row}.swagger-ui .flex-wrap-l{flex-wrap:wrap}.swagger-ui .flex-nowrap-l{flex-wrap:nowrap}.swagger-ui .flex-wrap-reverse-l{flex-wrap:wrap-reverse}.swagger-ui .flex-column-reverse-l{flex-direction:column-reverse}.swagger-ui .flex-row-reverse-l{flex-direction:row-reverse}.swagger-ui .items-start-l{align-items:flex-start}.swagger-ui .items-end-l{align-items:flex-end}.swagger-ui .items-center-l{align-items:center}.swagger-ui .items-baseline-l{align-items:baseline}.swagger-ui .items-stretch-l{align-items:stretch}.swagger-ui .self-start-l{align-self:flex-start}.swagger-ui .self-end-l{align-self:flex-end}.swagger-ui .self-center-l{align-self:center}.swagger-ui .self-baseline-l{align-self:baseline}.swagger-ui .self-stretch-l{align-self:stretch}.swagger-ui .justify-start-l{justify-content:flex-start}.swagger-ui .justify-end-l{justify-content:flex-end}.swagger-ui .justify-center-l{justify-content:center}.swagger-ui .justify-between-l{justify-content:space-between}.swagger-ui .justify-around-l{justify-content:space-around}.swagger-ui .content-start-l{align-content:flex-start}.swagger-ui .content-end-l{align-content:flex-end}.swagger-ui .content-center-l{align-content:center}.swagger-ui .content-between-l{align-content:space-between}.swagger-ui .content-around-l{align-content:space-around}.swagger-ui .content-stretch-l{align-content:stretch}.swagger-ui .order-0-l{order:0}.swagger-ui .order-1-l{order:1}.swagger-ui .order-2-l{order:2}.swagger-ui .order-3-l{order:3}.swagger-ui .order-4-l{order:4}.swagger-ui .order-5-l{order:5}.swagger-ui .order-6-l{order:6}.swagger-ui .order-7-l{order:7}.swagger-ui .order-8-l{order:8}.swagger-ui .order-last-l{order:99999}.swagger-ui .flex-grow-0-l{flex-grow:0}.swagger-ui .flex-grow-1-l{flex-grow:1}.swagger-ui .flex-shrink-0-l{flex-shrink:0}.swagger-ui .flex-shrink-1-l{flex-shrink:1}}.swagger-ui .dn{display:none}.swagger-ui .di{display:inline}.swagger-ui .db{display:block}.swagger-ui .dib{display:inline-block}.swagger-ui .dit{display:inline-table}.swagger-ui .dt{display:table}.swagger-ui .dtc{display:table-cell}.swagger-ui .dt-row{display:table-row}.swagger-ui .dt-row-group{display:table-row-group}.swagger-ui .dt-column{display:table-column}.swagger-ui .dt-column-group{display:table-column-group}.swagger-ui .dt--fixed{table-layout:fixed;width:100%}@media screen and (min-width:30em){.swagger-ui .dn-ns{display:none}.swagger-ui .di-ns{display:inline}.swagger-ui .db-ns{display:block}.swagger-ui .dib-ns{display:inline-block}.swagger-ui .dit-ns{display:inline-table}.swagger-ui .dt-ns{display:table}.swagger-ui .dtc-ns{display:table-cell}.swagger-ui .dt-row-ns{display:table-row}.swagger-ui .dt-row-group-ns{display:table-row-group}.swagger-ui .dt-column-ns{display:table-column}.swagger-ui .dt-column-group-ns{display:table-column-group}.swagger-ui .dt--fixed-ns{table-layout:fixed;width:100%}}@media screen and (min-width:30em) and (max-width:60em){.swagger-ui .dn-m{display:none}.swagger-ui .di-m{display:inline}.swagger-ui .db-m{display:block}.swagger-ui .dib-m{display:inline-block}.swagger-ui .dit-m{display:inline-table}.swagger-ui .dt-m{display:table}.swagger-ui .dtc-m{display:table-cell}.swagger-ui .dt-row-m{display:table-row}.swagger-ui .dt-row-group-m{display:table-row-group}.swagger-ui .dt-column-m{display:table-column}.swagger-ui .dt-column-group-m{display:table-column-group}.swagger-ui .dt--fixed-m{table-layout:fixed;width:100%}}@media screen and (min-width:60em){.swagger-ui .dn-l{display:none}.swagger-ui .di-l{display:inline}.swagger-ui .db-l{display:block}.swagger-ui .dib-l{display:inline-block}.swagger-ui .dit-l{display:inline-table}.swagger-ui .dt-l{display:table}.swagger-ui .dtc-l{display:table-cell}.swagger-ui .dt-row-l{display:table-row}.swagger-ui .dt-row-group-l{display:table-row-group}.swagger-ui .dt-column-l{display:table-column}.swagger-ui .dt-column-group-l{display:table-column-group}.swagger-ui .dt--fixed-l{table-layout:fixed;width:100%}}.swagger-ui .fl{_display:inline;float:left}.swagger-ui .fr{_display:inline;float:right}.swagger-ui .fn{float:none}@media screen and (min-width:30em){.swagger-ui .fl-ns{_display:inline;float:left}.swagger-ui .fr-ns{_display:inline;float:right}.swagger-ui .fn-ns{float:none}}@media screen and (min-width:30em) and (max-width:60em){.swagger-ui .fl-m{_display:inline;float:left}.swagger-ui .fr-m{_display:inline;float:right}.swagger-ui .fn-m{float:none}}@media screen and (min-width:60em){.swagger-ui .fl-l{_display:inline;float:left}.swagger-ui .fr-l{_display:inline;float:right}.swagger-ui .fn-l{float:none}}.swagger-ui .sans-serif{font-family:-apple-system,BlinkMacSystemFont,avenir next,avenir,helvetica,helvetica neue,ubuntu,roboto,noto,segoe ui,arial,sans-serif}.swagger-ui .serif{font-family:georgia,serif}.swagger-ui .system-sans-serif{font-family:sans-serif}.swagger-ui .system-serif{font-family:serif}.swagger-ui .code,.swagger-ui code{font-family:Consolas,monaco,monospace}.swagger-ui .courier{font-family:Courier Next,courier,monospace}.swagger-ui .helvetica{font-family:helvetica neue,helvetica,sans-serif}.swagger-ui .avenir{font-family:avenir next,avenir,sans-serif}.swagger-ui .athelas{font-family:athelas,georgia,serif}.swagger-ui .georgia{font-family:georgia,serif}.swagger-ui .times{font-family:times,serif}.swagger-ui .bodoni{font-family:Bodoni MT,serif}.swagger-ui .calisto{font-family:Calisto MT,serif}.swagger-ui .garamond{font-family:garamond,serif}.swagger-ui .baskerville{font-family:baskerville,serif}.swagger-ui .i{font-style:italic}.swagger-ui .fs-normal{font-style:normal}@media screen and (min-width:30em){.swagger-ui .i-ns{font-style:italic}.swagger-ui .fs-normal-ns{font-style:normal}}@media screen and (min-width:30em) and (max-width:60em){.swagger-ui .i-m{font-style:italic}.swagger-ui .fs-normal-m{font-style:normal}}@media screen and (min-width:60em){.swagger-ui .i-l{font-style:italic}.swagger-ui .fs-normal-l{font-style:normal}}.swagger-ui .normal{font-weight:400}.swagger-ui .b{font-weight:700}.swagger-ui .fw1{font-weight:100}.swagger-ui .fw2{font-weight:200}.swagger-ui .fw3{font-weight:300}.swagger-ui .fw4{font-weight:400}.swagger-ui .fw5{font-weight:500}.swagger-ui .fw6{font-weight:600}.swagger-ui .fw7{font-weight:700}.swagger-ui .fw8{font-weight:800}.swagger-ui .fw9{font-weight:900}@media screen and (min-width:30em){.swagger-ui .normal-ns{font-weight:400}.swagger-ui .b-ns{font-weight:700}.swagger-ui .fw1-ns{font-weight:100}.swagger-ui .fw2-ns{font-weight:200}.swagger-ui .fw3-ns{font-weight:300}.swagger-ui .fw4-ns{font-weight:400}.swagger-ui .fw5-ns{font-weight:500}.swagger-ui .fw6-ns{font-weight:600}.swagger-ui .fw7-ns{font-weight:700}.swagger-ui .fw8-ns{font-weight:800}.swagger-ui .fw9-ns{font-weight:900}}@media screen and (min-width:30em) and (max-width:60em){.swagger-ui .normal-m{font-weight:400}.swagger-ui .b-m{font-weight:700}.swagger-ui .fw1-m{font-weight:100}.swagger-ui .fw2-m{font-weight:200}.swagger-ui .fw3-m{font-weight:300}.swagger-ui .fw4-m{font-weight:400}.swagger-ui .fw5-m{font-weight:500}.swagger-ui .fw6-m{font-weight:600}.swagger-ui .fw7-m{font-weight:700}.swagger-ui .fw8-m{font-weight:800}.swagger-ui .fw9-m{font-weight:900}}@media screen and (min-width:60em){.swagger-ui .normal-l{font-weight:400}.swagger-ui .b-l{font-weight:700}.swagger-ui .fw1-l{font-weight:100}.swagger-ui .fw2-l{font-weight:200}.swagger-ui .fw3-l{font-weight:300}.swagger-ui .fw4-l{font-weight:400}.swagger-ui .fw5-l{font-weight:500}.swagger-ui .fw6-l{font-weight:600}.swagger-ui .fw7-l{font-weight:700}.swagger-ui .fw8-l{font-weight:800}.swagger-ui .fw9-l{font-weight:900}}.swagger-ui .input-reset{-webkit-appearance:none;-moz-appearance:none}.swagger-ui .button-reset::-moz-focus-inner,.swagger-ui .input-reset::-moz-focus-inner{border:0;padding:0}.swagger-ui .h1{height:1rem}.swagger-ui .h2{height:2rem}.swagger-ui .h3{height:4rem}.swagger-ui .h4{height:8rem}.swagger-ui .h5{height:16rem}.swagger-ui .h-25{height:25%}.swagger-ui .h-50{height:50%}.swagger-ui .h-75{height:75%}.swagger-ui .h-100{height:100%}.swagger-ui .min-h-100{min-height:100%}.swagger-ui .vh-25{height:25vh}.swagger-ui .vh-50{height:50vh}.swagger-ui .vh-75{height:75vh}.swagger-ui .vh-100{height:100vh}.swagger-ui .min-vh-100{min-height:100vh}.swagger-ui .h-auto{height:auto}.swagger-ui .h-inherit{height:inherit}@media screen and (min-width:30em){.swagger-ui .h1-ns{height:1rem}.swagger-ui .h2-ns{height:2rem}.swagger-ui .h3-ns{height:4rem}.swagger-ui .h4-ns{height:8rem}.swagger-ui .h5-ns{height:16rem}.swagger-ui .h-25-ns{height:25%}.swagger-ui .h-50-ns{height:50%}.swagger-ui .h-75-ns{height:75%}.swagger-ui .h-100-ns{height:100%}.swagger-ui .min-h-100-ns{min-height:100%}.swagger-ui .vh-25-ns{height:25vh}.swagger-ui .vh-50-ns{height:50vh}.swagger-ui .vh-75-ns{height:75vh}.swagger-ui .vh-100-ns{height:100vh}.swagger-ui .min-vh-100-ns{min-height:100vh}.swagger-ui .h-auto-ns{height:auto}.swagger-ui .h-inherit-ns{height:inherit}}@media screen and (min-width:30em) and (max-width:60em){.swagger-ui .h1-m{height:1rem}.swagger-ui .h2-m{height:2rem}.swagger-ui .h3-m{height:4rem}.swagger-ui .h4-m{height:8rem}.swagger-ui .h5-m{height:16rem}.swagger-ui .h-25-m{height:25%}.swagger-ui .h-50-m{height:50%}.swagger-ui .h-75-m{height:75%}.swagger-ui .h-100-m{height:100%}.swagger-ui .min-h-100-m{min-height:100%}.swagger-ui .vh-25-m{height:25vh}.swagger-ui .vh-50-m{height:50vh}.swagger-ui .vh-75-m{height:75vh}.swagger-ui .vh-100-m{height:100vh}.swagger-ui .min-vh-100-m{min-height:100vh}.swagger-ui .h-auto-m{height:auto}.swagger-ui .h-inherit-m{height:inherit}}@media screen and (min-width:60em){.swagger-ui .h1-l{height:1rem}.swagger-ui .h2-l{height:2rem}.swagger-ui .h3-l{height:4rem}.swagger-ui .h4-l{height:8rem}.swagger-ui .h5-l{height:16rem}.swagger-ui .h-25-l{height:25%}.swagger-ui .h-50-l{height:50%}.swagger-ui .h-75-l{height:75%}.swagger-ui .h-100-l{height:100%}.swagger-ui .min-h-100-l{min-height:100%}.swagger-ui .vh-25-l{height:25vh}.swagger-ui .vh-50-l{height:50vh}.swagger-ui .vh-75-l{height:75vh}.swagger-ui .vh-100-l{height:100vh}.swagger-ui .min-vh-100-l{min-height:100vh}.swagger-ui .h-auto-l{height:auto}.swagger-ui .h-inherit-l{height:inherit}}.swagger-ui .tracked{letter-spacing:.1em}.swagger-ui .tracked-tight{letter-spacing:-.05em}.swagger-ui .tracked-mega{letter-spacing:.25em}@media screen and (min-width:30em){.swagger-ui .tracked-ns{letter-spacing:.1em}.swagger-ui .tracked-tight-ns{letter-spacing:-.05em}.swagger-ui .tracked-mega-ns{letter-spacing:.25em}}@media screen and (min-width:30em) and (max-width:60em){.swagger-ui .tracked-m{letter-spacing:.1em}.swagger-ui .tracked-tight-m{letter-spacing:-.05em}.swagger-ui .tracked-mega-m{letter-spacing:.25em}}@media screen and (min-width:60em){.swagger-ui .tracked-l{letter-spacing:.1em}.swagger-ui .tracked-tight-l{letter-spacing:-.05em}.swagger-ui .tracked-mega-l{letter-spacing:.25em}}.swagger-ui .lh-solid{line-height:1}.swagger-ui .lh-title{line-height:1.25}.swagger-ui .lh-copy{line-height:1.5}@media screen and (min-width:30em){.swagger-ui .lh-solid-ns{line-height:1}.swagger-ui .lh-title-ns{line-height:1.25}.swagger-ui .lh-copy-ns{line-height:1.5}}@media screen and (min-width:30em) and (max-width:60em){.swagger-ui .lh-solid-m{line-height:1}.swagger-ui .lh-title-m{line-height:1.25}.swagger-ui .lh-copy-m{line-height:1.5}}@media screen and (min-width:60em){.swagger-ui .lh-solid-l{line-height:1}.swagger-ui .lh-title-l{line-height:1.25}.swagger-ui .lh-copy-l{line-height:1.5}}.swagger-ui .link{text-decoration:none}.swagger-ui .link,.swagger-ui .link:active,.swagger-ui .link:focus,.swagger-ui .link:hover,.swagger-ui .link:link,.swagger-ui .link:visited{transition:color .15s ease-in}.swagger-ui .link:focus{outline:1px dotted currentColor}.swagger-ui .list{list-style-type:none}.swagger-ui .mw-100{max-width:100%}.swagger-ui .mw1{max-width:1rem}.swagger-ui .mw2{max-width:2rem}.swagger-ui .mw3{max-width:4rem}.swagger-ui .mw4{max-width:8rem}.swagger-ui .mw5{max-width:16rem}.swagger-ui .mw6{max-width:32rem}.swagger-ui .mw7{max-width:48rem}.swagger-ui .mw8{max-width:64rem}.swagger-ui .mw9{max-width:96rem}.swagger-ui .mw-none{max-width:none}@media screen and (min-width:30em){.swagger-ui .mw-100-ns{max-width:100%}.swagger-ui .mw1-ns{max-width:1rem}.swagger-ui .mw2-ns{max-width:2rem}.swagger-ui .mw3-ns{max-width:4rem}.swagger-ui .mw4-ns{max-width:8rem}.swagger-ui .mw5-ns{max-width:16rem}.swagger-ui .mw6-ns{max-width:32rem}.swagger-ui .mw7-ns{max-width:48rem}.swagger-ui .mw8-ns{max-width:64rem}.swagger-ui .mw9-ns{max-width:96rem}.swagger-ui .mw-none-ns{max-width:none}}@media screen and (min-width:30em) and (max-width:60em){.swagger-ui .mw-100-m{max-width:100%}.swagger-ui .mw1-m{max-width:1rem}.swagger-ui .mw2-m{max-width:2rem}.swagger-ui .mw3-m{max-width:4rem}.swagger-ui .mw4-m{max-width:8rem}.swagger-ui .mw5-m{max-width:16rem}.swagger-ui .mw6-m{max-width:32rem}.swagger-ui .mw7-m{max-width:48rem}.swagger-ui .mw8-m{max-width:64rem}.swagger-ui .mw9-m{max-width:96rem}.swagger-ui .mw-none-m{max-width:none}}@media screen and (min-width:60em){.swagger-ui .mw-100-l{max-width:100%}.swagger-ui .mw1-l{max-width:1rem}.swagger-ui .mw2-l{max-width:2rem}.swagger-ui .mw3-l{max-width:4rem}.swagger-ui .mw4-l{max-width:8rem}.swagger-ui .mw5-l{max-width:16rem}.swagger-ui .mw6-l{max-width:32rem}.swagger-ui .mw7-l{max-width:48rem}.swagger-ui .mw8-l{max-width:64rem}.swagger-ui .mw9-l{max-width:96rem}.swagger-ui .mw-none-l{max-width:none}}.swagger-ui .w1{width:1rem}.swagger-ui .w2{width:2rem}.swagger-ui .w3{width:4rem}.swagger-ui .w4{width:8rem}.swagger-ui .w5{width:16rem}.swagger-ui .w-10{width:10%}.swagger-ui .w-20{width:20%}.swagger-ui .w-25{width:25%}.swagger-ui .w-30{width:30%}.swagger-ui .w-33{width:33%}.swagger-ui .w-34{width:34%}.swagger-ui .w-40{width:40%}.swagger-ui .w-50{width:50%}.swagger-ui .w-60{width:60%}.swagger-ui .w-70{width:70%}.swagger-ui .w-75{width:75%}.swagger-ui .w-80{width:80%}.swagger-ui .w-90{width:90%}.swagger-ui .w-100{width:100%}.swagger-ui .w-third{width:33.3333333333%}.swagger-ui .w-two-thirds{width:66.6666666667%}.swagger-ui .w-auto{width:auto}@media screen and (min-width:30em){.swagger-ui .w1-ns{width:1rem}.swagger-ui .w2-ns{width:2rem}.swagger-ui .w3-ns{width:4rem}.swagger-ui .w4-ns{width:8rem}.swagger-ui .w5-ns{width:16rem}.swagger-ui .w-10-ns{width:10%}.swagger-ui .w-20-ns{width:20%}.swagger-ui .w-25-ns{width:25%}.swagger-ui .w-30-ns{width:30%}.swagger-ui .w-33-ns{width:33%}.swagger-ui .w-34-ns{width:34%}.swagger-ui .w-40-ns{width:40%}.swagger-ui .w-50-ns{width:50%}.swagger-ui .w-60-ns{width:60%}.swagger-ui .w-70-ns{width:70%}.swagger-ui .w-75-ns{width:75%}.swagger-ui .w-80-ns{width:80%}.swagger-ui .w-90-ns{width:90%}.swagger-ui .w-100-ns{width:100%}.swagger-ui .w-third-ns{width:33.3333333333%}.swagger-ui .w-two-thirds-ns{width:66.6666666667%}.swagger-ui .w-auto-ns{width:auto}}@media screen and (min-width:30em) and (max-width:60em){.swagger-ui .w1-m{width:1rem}.swagger-ui .w2-m{width:2rem}.swagger-ui .w3-m{width:4rem}.swagger-ui .w4-m{width:8rem}.swagger-ui .w5-m{width:16rem}.swagger-ui .w-10-m{width:10%}.swagger-ui .w-20-m{width:20%}.swagger-ui .w-25-m{width:25%}.swagger-ui .w-30-m{width:30%}.swagger-ui .w-33-m{width:33%}.swagger-ui .w-34-m{width:34%}.swagger-ui .w-40-m{width:40%}.swagger-ui .w-50-m{width:50%}.swagger-ui .w-60-m{width:60%}.swagger-ui .w-70-m{width:70%}.swagger-ui .w-75-m{width:75%}.swagger-ui .w-80-m{width:80%}.swagger-ui .w-90-m{width:90%}.swagger-ui .w-100-m{width:100%}.swagger-ui .w-third-m{width:33.3333333333%}.swagger-ui .w-two-thirds-m{width:66.6666666667%}.swagger-ui .w-auto-m{width:auto}}@media screen and (min-width:60em){.swagger-ui .w1-l{width:1rem}.swagger-ui .w2-l{width:2rem}.swagger-ui .w3-l{width:4rem}.swagger-ui .w4-l{width:8rem}.swagger-ui .w5-l{width:16rem}.swagger-ui .w-10-l{width:10%}.swagger-ui .w-20-l{width:20%}.swagger-ui .w-25-l{width:25%}.swagger-ui .w-30-l{width:30%}.swagger-ui .w-33-l{width:33%}.swagger-ui .w-34-l{width:34%}.swagger-ui .w-40-l{width:40%}.swagger-ui .w-50-l{width:50%}.swagger-ui .w-60-l{width:60%}.swagger-ui .w-70-l{width:70%}.swagger-ui .w-75-l{width:75%}.swagger-ui .w-80-l{width:80%}.swagger-ui .w-90-l{width:90%}.swagger-ui .w-100-l{width:100%}.swagger-ui .w-third-l{width:33.3333333333%}.swagger-ui .w-two-thirds-l{width:66.6666666667%}.swagger-ui .w-auto-l{width:auto}}.swagger-ui .overflow-visible{overflow:visible}.swagger-ui .overflow-hidden{overflow:hidden}.swagger-ui .overflow-scroll{overflow:scroll}.swagger-ui .overflow-auto{overflow:auto}.swagger-ui .overflow-x-visible{overflow-x:visible}.swagger-ui .overflow-x-hidden{overflow-x:hidden}.swagger-ui .overflow-x-scroll{overflow-x:scroll}.swagger-ui .overflow-x-auto{overflow-x:auto}.swagger-ui .overflow-y-visible{overflow-y:visible}.swagger-ui .overflow-y-hidden{overflow-y:hidden}.swagger-ui .overflow-y-scroll{overflow-y:scroll}.swagger-ui .overflow-y-auto{overflow-y:auto}@media screen and (min-width:30em){.swagger-ui .overflow-visible-ns{overflow:visible}.swagger-ui .overflow-hidden-ns{overflow:hidden}.swagger-ui .overflow-scroll-ns{overflow:scroll}.swagger-ui .overflow-auto-ns{overflow:auto}.swagger-ui .overflow-x-visible-ns{overflow-x:visible}.swagger-ui .overflow-x-hidden-ns{overflow-x:hidden}.swagger-ui .overflow-x-scroll-ns{overflow-x:scroll}.swagger-ui .overflow-x-auto-ns{overflow-x:auto}.swagger-ui .overflow-y-visible-ns{overflow-y:visible}.swagger-ui .overflow-y-hidden-ns{overflow-y:hidden}.swagger-ui .overflow-y-scroll-ns{overflow-y:scroll}.swagger-ui .overflow-y-auto-ns{overflow-y:auto}}@media screen and (min-width:30em) and (max-width:60em){.swagger-ui .overflow-visible-m{overflow:visible}.swagger-ui .overflow-hidden-m{overflow:hidden}.swagger-ui .overflow-scroll-m{overflow:scroll}.swagger-ui .overflow-auto-m{overflow:auto}.swagger-ui .overflow-x-visible-m{overflow-x:visible}.swagger-ui .overflow-x-hidden-m{overflow-x:hidden}.swagger-ui .overflow-x-scroll-m{overflow-x:scroll}.swagger-ui .overflow-x-auto-m{overflow-x:auto}.swagger-ui .overflow-y-visible-m{overflow-y:visible}.swagger-ui .overflow-y-hidden-m{overflow-y:hidden}.swagger-ui .overflow-y-scroll-m{overflow-y:scroll}.swagger-ui .overflow-y-auto-m{overflow-y:auto}}@media screen and (min-width:60em){.swagger-ui .overflow-visible-l{overflow:visible}.swagger-ui .overflow-hidden-l{overflow:hidden}.swagger-ui .overflow-scroll-l{overflow:scroll}.swagger-ui .overflow-auto-l{overflow:auto}.swagger-ui .overflow-x-visible-l{overflow-x:visible}.swagger-ui .overflow-x-hidden-l{overflow-x:hidden}.swagger-ui .overflow-x-scroll-l{overflow-x:scroll}.swagger-ui .overflow-x-auto-l{overflow-x:auto}.swagger-ui .overflow-y-visible-l{overflow-y:visible}.swagger-ui .overflow-y-hidden-l{overflow-y:hidden}.swagger-ui .overflow-y-scroll-l{overflow-y:scroll}.swagger-ui .overflow-y-auto-l{overflow-y:auto}}.swagger-ui .static{position:static}.swagger-ui .relative{position:relative}.swagger-ui .absolute{position:absolute}.swagger-ui .fixed{position:fixed}@media screen and (min-width:30em){.swagger-ui .static-ns{position:static}.swagger-ui .relative-ns{position:relative}.swagger-ui .absolute-ns{position:absolute}.swagger-ui .fixed-ns{position:fixed}}@media screen and (min-width:30em) and (max-width:60em){.swagger-ui .static-m{position:static}.swagger-ui .relative-m{position:relative}.swagger-ui .absolute-m{position:absolute}.swagger-ui .fixed-m{position:fixed}}@media screen and (min-width:60em){.swagger-ui .static-l{position:static}.swagger-ui .relative-l{position:relative}.swagger-ui .absolute-l{position:absolute}.swagger-ui .fixed-l{position:fixed}}.swagger-ui .o-100{opacity:1}.swagger-ui .o-90{opacity:.9}.swagger-ui .o-80{opacity:.8}.swagger-ui .o-70{opacity:.7}.swagger-ui .o-60{opacity:.6}.swagger-ui .o-50{opacity:.5}.swagger-ui .o-40{opacity:.4}.swagger-ui .o-30{opacity:.3}.swagger-ui .o-20{opacity:.2}.swagger-ui .o-10{opacity:.1}.swagger-ui .o-05{opacity:.05}.swagger-ui .o-025{opacity:.025}.swagger-ui .o-0{opacity:0}.swagger-ui .rotate-45{transform:rotate(45deg)}.swagger-ui .rotate-90{transform:rotate(90deg)}.swagger-ui .rotate-135{transform:rotate(135deg)}.swagger-ui .rotate-180{transform:rotate(180deg)}.swagger-ui .rotate-225{transform:rotate(225deg)}.swagger-ui .rotate-270{transform:rotate(270deg)}.swagger-ui .rotate-315{transform:rotate(315deg)}@media screen and (min-width:30em){.swagger-ui .rotate-45-ns{transform:rotate(45deg)}.swagger-ui .rotate-90-ns{transform:rotate(90deg)}.swagger-ui .rotate-135-ns{transform:rotate(135deg)}.swagger-ui .rotate-180-ns{transform:rotate(180deg)}.swagger-ui .rotate-225-ns{transform:rotate(225deg)}.swagger-ui .rotate-270-ns{transform:rotate(270deg)}.swagger-ui .rotate-315-ns{transform:rotate(315deg)}}@media screen and (min-width:30em) and (max-width:60em){.swagger-ui .rotate-45-m{transform:rotate(45deg)}.swagger-ui .rotate-90-m{transform:rotate(90deg)}.swagger-ui .rotate-135-m{transform:rotate(135deg)}.swagger-ui .rotate-180-m{transform:rotate(180deg)}.swagger-ui .rotate-225-m{transform:rotate(225deg)}.swagger-ui .rotate-270-m{transform:rotate(270deg)}.swagger-ui .rotate-315-m{transform:rotate(315deg)}}@media screen and (min-width:60em){.swagger-ui .rotate-45-l{transform:rotate(45deg)}.swagger-ui .rotate-90-l{transform:rotate(90deg)}.swagger-ui .rotate-135-l{transform:rotate(135deg)}.swagger-ui .rotate-180-l{transform:rotate(180deg)}.swagger-ui .rotate-225-l{transform:rotate(225deg)}.swagger-ui .rotate-270-l{transform:rotate(270deg)}.swagger-ui .rotate-315-l{transform:rotate(315deg)}}.swagger-ui .black-90{color:#000000e6}.swagger-ui .black-80{color:#000c}.swagger-ui .black-70{color:#000000b3}.swagger-ui .black-60{color:#0009}.swagger-ui .black-50{color:#00000080}.swagger-ui .black-40{color:#0006}.swagger-ui .black-30{color:#0000004d}.swagger-ui .black-20{color:#0003}.swagger-ui .black-10{color:#0000001a}.swagger-ui .black-05{color:#0000000d}.swagger-ui .white-90{color:#ffffffe6}.swagger-ui .white-80{color:#fffc}.swagger-ui .white-70{color:#ffffffb3}.swagger-ui .white-60{color:#fff9}.swagger-ui .white-50{color:#ffffff80}.swagger-ui .white-40{color:#fff6}.swagger-ui .white-30{color:#ffffff4d}.swagger-ui .white-20{color:#fff3}.swagger-ui .white-10{color:#ffffff1a}.swagger-ui .black{color:#000}.swagger-ui .near-black{color:#111}.swagger-ui .dark-gray{color:#333}.swagger-ui .mid-gray{color:#555}.swagger-ui .gray{color:#777}.swagger-ui .silver{color:#999}.swagger-ui .light-silver{color:#aaa}.swagger-ui .moon-gray{color:#ccc}.swagger-ui .light-gray{color:#eee}.swagger-ui .near-white{color:#f4f4f4}.swagger-ui .white{color:#fff}.swagger-ui .dark-red{color:#e7040f}.swagger-ui .red{color:#ff4136}.swagger-ui .light-red{color:#ff725c}.swagger-ui .orange{color:#ff6300}.swagger-ui .gold{color:#ffb700}.swagger-ui .yellow{color:gold}.swagger-ui .light-yellow{color:#fbf1a9}.swagger-ui .purple{color:#5e2ca5}.swagger-ui .light-purple{color:#a463f2}.swagger-ui .dark-pink{color:#d5008f}.swagger-ui .hot-pink{color:#ff41b4}.swagger-ui .pink{color:#ff80cc}.swagger-ui .light-pink{color:#ffa3d7}.swagger-ui .dark-green{color:#137752}.swagger-ui .green{color:#19a974}.swagger-ui .light-green{color:#9eebcf}.swagger-ui .navy{color:#001b44}.swagger-ui .dark-blue{color:#00449e}.swagger-ui .blue{color:#357edd}.swagger-ui .light-blue{color:#96ccff}.swagger-ui .lightest-blue{color:#cdecff}.swagger-ui .washed-blue{color:#f6fffe}.swagger-ui .washed-green{color:#e8fdf5}.swagger-ui .washed-yellow{color:#fffceb}.swagger-ui .washed-red{color:#ffdfdf}.swagger-ui .color-inherit{color:inherit}.swagger-ui .bg-black-90{background-color:#000000e6}.swagger-ui .bg-black-80{background-color:#000c}.swagger-ui .bg-black-70{background-color:#000000b3}.swagger-ui .bg-black-60{background-color:#0009}.swagger-ui .bg-black-50{background-color:#00000080}.swagger-ui .bg-black-40{background-color:#0006}.swagger-ui .bg-black-30{background-color:#0000004d}.swagger-ui .bg-black-20{background-color:#0003}.swagger-ui .bg-black-10{background-color:#0000001a}.swagger-ui .bg-black-05{background-color:#0000000d}.swagger-ui .bg-white-90{background-color:#ffffffe6}.swagger-ui .bg-white-80{background-color:#fffc}.swagger-ui .bg-white-70{background-color:#ffffffb3}.swagger-ui .bg-white-60{background-color:#fff9}.swagger-ui .bg-white-50{background-color:#ffffff80}.swagger-ui .bg-white-40{background-color:#fff6}.swagger-ui .bg-white-30{background-color:#ffffff4d}.swagger-ui .bg-white-20{background-color:#fff3}.swagger-ui .bg-white-10{background-color:#ffffff1a}.swagger-ui .bg-black{background-color:#000}.swagger-ui .bg-near-black{background-color:#111}.swagger-ui .bg-dark-gray{background-color:#333}.swagger-ui .bg-mid-gray{background-color:#555}.swagger-ui .bg-gray{background-color:#777}.swagger-ui .bg-silver{background-color:#999}.swagger-ui .bg-light-silver{background-color:#aaa}.swagger-ui .bg-moon-gray{background-color:#ccc}.swagger-ui .bg-light-gray{background-color:#eee}.swagger-ui .bg-near-white{background-color:#f4f4f4}.swagger-ui .bg-white{background-color:#fff}.swagger-ui .bg-transparent{background-color:initial}.swagger-ui .bg-dark-red{background-color:#e7040f}.swagger-ui .bg-red{background-color:#ff4136}.swagger-ui .bg-light-red{background-color:#ff725c}.swagger-ui .bg-orange{background-color:#ff6300}.swagger-ui .bg-gold{background-color:#ffb700}.swagger-ui .bg-yellow{background-color:gold}.swagger-ui .bg-light-yellow{background-color:#fbf1a9}.swagger-ui .bg-purple{background-color:#5e2ca5}.swagger-ui .bg-light-purple{background-color:#a463f2}.swagger-ui .bg-dark-pink{background-color:#d5008f}.swagger-ui .bg-hot-pink{background-color:#ff41b4}.swagger-ui .bg-pink{background-color:#ff80cc}.swagger-ui .bg-light-pink{background-color:#ffa3d7}.swagger-ui .bg-dark-green{background-color:#137752}.swagger-ui .bg-green{background-color:#19a974}.swagger-ui .bg-light-green{background-color:#9eebcf}.swagger-ui .bg-navy{background-color:#001b44}.swagger-ui .bg-dark-blue{background-color:#00449e}.swagger-ui .bg-blue{background-color:#357edd}.swagger-ui .bg-light-blue{background-color:#96ccff}.swagger-ui .bg-lightest-blue{background-color:#cdecff}.swagger-ui .bg-washed-blue{background-color:#f6fffe}.swagger-ui .bg-washed-green{background-color:#e8fdf5}.swagger-ui .bg-washed-yellow{background-color:#fffceb}.swagger-ui .bg-washed-red{background-color:#ffdfdf}.swagger-ui .bg-inherit{background-color:inherit}.swagger-ui .hover-black:focus,.swagger-ui .hover-black:hover{color:#000}.swagger-ui .hover-near-black:focus,.swagger-ui .hover-near-black:hover{color:#111}.swagger-ui .hover-dark-gray:focus,.swagger-ui .hover-dark-gray:hover{color:#333}.swagger-ui .hover-mid-gray:focus,.swagger-ui .hover-mid-gray:hover{color:#555}.swagger-ui .hover-gray:focus,.swagger-ui .hover-gray:hover{color:#777}.swagger-ui .hover-silver:focus,.swagger-ui .hover-silver:hover{color:#999}.swagger-ui .hover-light-silver:focus,.swagger-ui .hover-light-silver:hover{color:#aaa}.swagger-ui .hover-moon-gray:focus,.swagger-ui .hover-moon-gray:hover{color:#ccc}.swagger-ui .hover-light-gray:focus,.swagger-ui .hover-light-gray:hover{color:#eee}.swagger-ui .hover-near-white:focus,.swagger-ui .hover-near-white:hover{color:#f4f4f4}.swagger-ui .hover-white:focus,.swagger-ui .hover-white:hover{color:#fff}.swagger-ui .hover-black-90:focus,.swagger-ui .hover-black-90:hover{color:#000000e6}.swagger-ui .hover-black-80:focus,.swagger-ui .hover-black-80:hover{color:#000c}.swagger-ui .hover-black-70:focus,.swagger-ui .hover-black-70:hover{color:#000000b3}.swagger-ui .hover-black-60:focus,.swagger-ui .hover-black-60:hover{color:#0009}.swagger-ui .hover-black-50:focus,.swagger-ui .hover-black-50:hover{color:#00000080}.swagger-ui .hover-black-40:focus,.swagger-ui .hover-black-40:hover{color:#0006}.swagger-ui .hover-black-30:focus,.swagger-ui .hover-black-30:hover{color:#0000004d}.swagger-ui .hover-black-20:focus,.swagger-ui .hover-black-20:hover{color:#0003}.swagger-ui .hover-black-10:focus,.swagger-ui .hover-black-10:hover{color:#0000001a}.swagger-ui .hover-white-90:focus,.swagger-ui .hover-white-90:hover{color:#ffffffe6}.swagger-ui .hover-white-80:focus,.swagger-ui .hover-white-80:hover{color:#fffc}.swagger-ui .hover-white-70:focus,.swagger-ui .hover-white-70:hover{color:#ffffffb3}.swagger-ui .hover-white-60:focus,.swagger-ui .hover-white-60:hover{color:#fff9}.swagger-ui .hover-white-50:focus,.swagger-ui .hover-white-50:hover{color:#ffffff80}.swagger-ui .hover-white-40:focus,.swagger-ui .hover-white-40:hover{color:#fff6}.swagger-ui .hover-white-30:focus,.swagger-ui .hover-white-30:hover{color:#ffffff4d}.swagger-ui .hover-white-20:focus,.swagger-ui .hover-white-20:hover{color:#fff3}.swagger-ui .hover-white-10:focus,.swagger-ui .hover-white-10:hover{color:#ffffff1a}.swagger-ui .hover-inherit:focus,.swagger-ui .hover-inherit:hover{color:inherit}.swagger-ui .hover-bg-black:focus,.swagger-ui .hover-bg-black:hover{background-color:#000}.swagger-ui .hover-bg-near-black:focus,.swagger-ui .hover-bg-near-black:hover{background-color:#111}.swagger-ui .hover-bg-dark-gray:focus,.swagger-ui .hover-bg-dark-gray:hover{background-color:#333}.swagger-ui .hover-bg-mid-gray:focus,.swagger-ui .hover-bg-mid-gray:hover{background-color:#555}.swagger-ui .hover-bg-gray:focus,.swagger-ui .hover-bg-gray:hover{background-color:#777}.swagger-ui .hover-bg-silver:focus,.swagger-ui .hover-bg-silver:hover{background-color:#999}.swagger-ui .hover-bg-light-silver:focus,.swagger-ui .hover-bg-light-silver:hover{background-color:#aaa}.swagger-ui .hover-bg-moon-gray:focus,.swagger-ui .hover-bg-moon-gray:hover{background-color:#ccc}.swagger-ui .hover-bg-light-gray:focus,.swagger-ui .hover-bg-light-gray:hover{background-color:#eee}.swagger-ui .hover-bg-near-white:focus,.swagger-ui .hover-bg-near-white:hover{background-color:#f4f4f4}.swagger-ui .hover-bg-white:focus,.swagger-ui .hover-bg-white:hover{background-color:#fff}.swagger-ui .hover-bg-transparent:focus,.swagger-ui .hover-bg-transparent:hover{background-color:initial}.swagger-ui .hover-bg-black-90:focus,.swagger-ui .hover-bg-black-90:hover{background-color:#000000e6}.swagger-ui .hover-bg-black-80:focus,.swagger-ui .hover-bg-black-80:hover{background-color:#000c}.swagger-ui .hover-bg-black-70:focus,.swagger-ui .hover-bg-black-70:hover{background-color:#000000b3}.swagger-ui .hover-bg-black-60:focus,.swagger-ui .hover-bg-black-60:hover{background-color:#0009}.swagger-ui .hover-bg-black-50:focus,.swagger-ui .hover-bg-black-50:hover{background-color:#00000080}.swagger-ui .hover-bg-black-40:focus,.swagger-ui .hover-bg-black-40:hover{background-color:#0006}.swagger-ui .hover-bg-black-30:focus,.swagger-ui .hover-bg-black-30:hover{background-color:#0000004d}.swagger-ui .hover-bg-black-20:focus,.swagger-ui .hover-bg-black-20:hover{background-color:#0003}.swagger-ui .hover-bg-black-10:focus,.swagger-ui .hover-bg-black-10:hover{background-color:#0000001a}.swagger-ui .hover-bg-white-90:focus,.swagger-ui .hover-bg-white-90:hover{background-color:#ffffffe6}.swagger-ui .hover-bg-white-80:focus,.swagger-ui .hover-bg-white-80:hover{background-color:#fffc}.swagger-ui .hover-bg-white-70:focus,.swagger-ui .hover-bg-white-70:hover{background-color:#ffffffb3}.swagger-ui .hover-bg-white-60:focus,.swagger-ui .hover-bg-white-60:hover{background-color:#fff9}.swagger-ui .hover-bg-white-50:focus,.swagger-ui .hover-bg-white-50:hover{background-color:#ffffff80}.swagger-ui .hover-bg-white-40:focus,.swagger-ui .hover-bg-white-40:hover{background-color:#fff6}.swagger-ui .hover-bg-white-30:focus,.swagger-ui .hover-bg-white-30:hover{background-color:#ffffff4d}.swagger-ui .hover-bg-white-20:focus,.swagger-ui .hover-bg-white-20:hover{background-color:#fff3}.swagger-ui .hover-bg-white-10:focus,.swagger-ui .hover-bg-white-10:hover{background-color:#ffffff1a}.swagger-ui .hover-dark-red:focus,.swagger-ui .hover-dark-red:hover{color:#e7040f}.swagger-ui .hover-red:focus,.swagger-ui .hover-red:hover{color:#ff4136}.swagger-ui .hover-light-red:focus,.swagger-ui .hover-light-red:hover{color:#ff725c}.swagger-ui .hover-orange:focus,.swagger-ui .hover-orange:hover{color:#ff6300}.swagger-ui .hover-gold:focus,.swagger-ui .hover-gold:hover{color:#ffb700}.swagger-ui .hover-yellow:focus,.swagger-ui .hover-yellow:hover{color:gold}.swagger-ui .hover-light-yellow:focus,.swagger-ui .hover-light-yellow:hover{color:#fbf1a9}.swagger-ui .hover-purple:focus,.swagger-ui .hover-purple:hover{color:#5e2ca5}.swagger-ui .hover-light-purple:focus,.swagger-ui .hover-light-purple:hover{color:#a463f2}.swagger-ui .hover-dark-pink:focus,.swagger-ui .hover-dark-pink:hover{color:#d5008f}.swagger-ui .hover-hot-pink:focus,.swagger-ui .hover-hot-pink:hover{color:#ff41b4}.swagger-ui .hover-pink:focus,.swagger-ui .hover-pink:hover{color:#ff80cc}.swagger-ui .hover-light-pink:focus,.swagger-ui .hover-light-pink:hover{color:#ffa3d7}.swagger-ui .hover-dark-green:focus,.swagger-ui .hover-dark-green:hover{color:#137752}.swagger-ui .hover-green:focus,.swagger-ui .hover-green:hover{color:#19a974}.swagger-ui .hover-light-green:focus,.swagger-ui .hover-light-green:hover{color:#9eebcf}.swagger-ui .hover-navy:focus,.swagger-ui .hover-navy:hover{color:#001b44}.swagger-ui .hover-dark-blue:focus,.swagger-ui .hover-dark-blue:hover{color:#00449e}.swagger-ui .hover-blue:focus,.swagger-ui .hover-blue:hover{color:#357edd}.swagger-ui .hover-light-blue:focus,.swagger-ui .hover-light-blue:hover{color:#96ccff}.swagger-ui .hover-lightest-blue:focus,.swagger-ui .hover-lightest-blue:hover{color:#cdecff}.swagger-ui .hover-washed-blue:focus,.swagger-ui .hover-washed-blue:hover{color:#f6fffe}.swagger-ui .hover-washed-green:focus,.swagger-ui .hover-washed-green:hover{color:#e8fdf5}.swagger-ui .hover-washed-yellow:focus,.swagger-ui .hover-washed-yellow:hover{color:#fffceb}.swagger-ui .hover-washed-red:focus,.swagger-ui .hover-washed-red:hover{color:#ffdfdf}.swagger-ui .hover-bg-dark-red:focus,.swagger-ui .hover-bg-dark-red:hover{background-color:#e7040f}.swagger-ui .hover-bg-red:focus,.swagger-ui .hover-bg-red:hover{background-color:#ff4136}.swagger-ui .hover-bg-light-red:focus,.swagger-ui .hover-bg-light-red:hover{background-color:#ff725c}.swagger-ui .hover-bg-orange:focus,.swagger-ui .hover-bg-orange:hover{background-color:#ff6300}.swagger-ui .hover-bg-gold:focus,.swagger-ui .hover-bg-gold:hover{background-color:#ffb700}.swagger-ui .hover-bg-yellow:focus,.swagger-ui .hover-bg-yellow:hover{background-color:gold}.swagger-ui .hover-bg-light-yellow:focus,.swagger-ui .hover-bg-light-yellow:hover{background-color:#fbf1a9}.swagger-ui .hover-bg-purple:focus,.swagger-ui .hover-bg-purple:hover{background-color:#5e2ca5}.swagger-ui .hover-bg-light-purple:focus,.swagger-ui .hover-bg-light-purple:hover{background-color:#a463f2}.swagger-ui .hover-bg-dark-pink:focus,.swagger-ui .hover-bg-dark-pink:hover{background-color:#d5008f}.swagger-ui .hover-bg-hot-pink:focus,.swagger-ui .hover-bg-hot-pink:hover{background-color:#ff41b4}.swagger-ui .hover-bg-pink:focus,.swagger-ui .hover-bg-pink:hover{background-color:#ff80cc}.swagger-ui .hover-bg-light-pink:focus,.swagger-ui .hover-bg-light-pink:hover{background-color:#ffa3d7}.swagger-ui .hover-bg-dark-green:focus,.swagger-ui .hover-bg-dark-green:hover{background-color:#137752}.swagger-ui .hover-bg-green:focus,.swagger-ui .hover-bg-green:hover{background-color:#19a974}.swagger-ui .hover-bg-light-green:focus,.swagger-ui .hover-bg-light-green:hover{background-color:#9eebcf}.swagger-ui .hover-bg-navy:focus,.swagger-ui .hover-bg-navy:hover{background-color:#001b44}.swagger-ui .hover-bg-dark-blue:focus,.swagger-ui .hover-bg-dark-blue:hover{background-color:#00449e}.swagger-ui .hover-bg-blue:focus,.swagger-ui .hover-bg-blue:hover{background-color:#357edd}.swagger-ui .hover-bg-light-blue:focus,.swagger-ui .hover-bg-light-blue:hover{background-color:#96ccff}.swagger-ui .hover-bg-lightest-blue:focus,.swagger-ui .hover-bg-lightest-blue:hover{background-color:#cdecff}.swagger-ui .hover-bg-washed-blue:focus,.swagger-ui .hover-bg-washed-blue:hover{background-color:#f6fffe}.swagger-ui .hover-bg-washed-green:focus,.swagger-ui .hover-bg-washed-green:hover{background-color:#e8fdf5}.swagger-ui .hover-bg-washed-yellow:focus,.swagger-ui .hover-bg-washed-yellow:hover{background-color:#fffceb}.swagger-ui .hover-bg-washed-red:focus,.swagger-ui .hover-bg-washed-red:hover{background-color:#ffdfdf}.swagger-ui .hover-bg-inherit:focus,.swagger-ui .hover-bg-inherit:hover{background-color:inherit}.swagger-ui .pa0{padding:0}.swagger-ui .pa1{padding:.25rem}.swagger-ui .pa2{padding:.5rem}.swagger-ui .pa3{padding:1rem}.swagger-ui .pa4{padding:2rem}.swagger-ui .pa5{padding:4rem}.swagger-ui .pa6{padding:8rem}.swagger-ui .pa7{padding:16rem}.swagger-ui .pl0{padding-left:0}.swagger-ui .pl1{padding-left:.25rem}.swagger-ui .pl2{padding-left:.5rem}.swagger-ui .pl3{padding-left:1rem}.swagger-ui .pl4{padding-left:2rem}.swagger-ui .pl5{padding-left:4rem}.swagger-ui .pl6{padding-left:8rem}.swagger-ui .pl7{padding-left:16rem}.swagger-ui .pr0{padding-right:0}.swagger-ui .pr1{padding-right:.25rem}.swagger-ui .pr2{padding-right:.5rem}.swagger-ui .pr3{padding-right:1rem}.swagger-ui .pr4{padding-right:2rem}.swagger-ui .pr5{padding-right:4rem}.swagger-ui .pr6{padding-right:8rem}.swagger-ui .pr7{padding-right:16rem}.swagger-ui .pb0{padding-bottom:0}.swagger-ui .pb1{padding-bottom:.25rem}.swagger-ui .pb2{padding-bottom:.5rem}.swagger-ui .pb3{padding-bottom:1rem}.swagger-ui .pb4{padding-bottom:2rem}.swagger-ui .pb5{padding-bottom:4rem}.swagger-ui .pb6{padding-bottom:8rem}.swagger-ui .pb7{padding-bottom:16rem}.swagger-ui .pt0{padding-top:0}.swagger-ui .pt1{padding-top:.25rem}.swagger-ui .pt2{padding-top:.5rem}.swagger-ui .pt3{padding-top:1rem}.swagger-ui .pt4{padding-top:2rem}.swagger-ui .pt5{padding-top:4rem}.swagger-ui .pt6{padding-top:8rem}.swagger-ui .pt7{padding-top:16rem}.swagger-ui .pv0{padding-bottom:0;padding-top:0}.swagger-ui .pv1{padding-bottom:.25rem;padding-top:.25rem}.swagger-ui .pv2{padding-bottom:.5rem;padding-top:.5rem}.swagger-ui .pv3{padding-bottom:1rem;padding-top:1rem}.swagger-ui .pv4{padding-bottom:2rem;padding-top:2rem}.swagger-ui .pv5{padding-bottom:4rem;padding-top:4rem}.swagger-ui .pv6{padding-bottom:8rem;padding-top:8rem}.swagger-ui .pv7{padding-bottom:16rem;padding-top:16rem}.swagger-ui .ph0{padding-left:0;padding-right:0}.swagger-ui .ph1{padding-left:.25rem;padding-right:.25rem}.swagger-ui .ph2{padding-left:.5rem;padding-right:.5rem}.swagger-ui .ph3{padding-left:1rem;padding-right:1rem}.swagger-ui .ph4{padding-left:2rem;padding-right:2rem}.swagger-ui .ph5{padding-left:4rem;padding-right:4rem}.swagger-ui .ph6{padding-left:8rem;padding-right:8rem}.swagger-ui .ph7{padding-left:16rem;padding-right:16rem}.swagger-ui .ma0{margin:0}.swagger-ui .ma1{margin:.25rem}.swagger-ui .ma2{margin:.5rem}.swagger-ui .ma3{margin:1rem}.swagger-ui .ma4{margin:2rem}.swagger-ui .ma5{margin:4rem}.swagger-ui .ma6{margin:8rem}.swagger-ui .ma7{margin:16rem}.swagger-ui .ml0{margin-left:0}.swagger-ui .ml1{margin-left:.25rem}.swagger-ui .ml2{margin-left:.5rem}.swagger-ui .ml3{margin-left:1rem}.swagger-ui .ml4{margin-left:2rem}.swagger-ui .ml5{margin-left:4rem}.swagger-ui .ml6{margin-left:8rem}.swagger-ui .ml7{margin-left:16rem}.swagger-ui .mr0{margin-right:0}.swagger-ui .mr1{margin-right:.25rem}.swagger-ui .mr2{margin-right:.5rem}.swagger-ui .mr3{margin-right:1rem}.swagger-ui .mr4{margin-right:2rem}.swagger-ui .mr5{margin-right:4rem}.swagger-ui .mr6{margin-right:8rem}.swagger-ui .mr7{margin-right:16rem}.swagger-ui .mb0{margin-bottom:0}.swagger-ui .mb1{margin-bottom:.25rem}.swagger-ui .mb2{margin-bottom:.5rem}.swagger-ui .mb3{margin-bottom:1rem}.swagger-ui .mb4{margin-bottom:2rem}.swagger-ui .mb5{margin-bottom:4rem}.swagger-ui .mb6{margin-bottom:8rem}.swagger-ui .mb7{margin-bottom:16rem}.swagger-ui .mt0{margin-top:0}.swagger-ui .mt1{margin-top:.25rem}.swagger-ui .mt2{margin-top:.5rem}.swagger-ui .mt3{margin-top:1rem}.swagger-ui .mt4{margin-top:2rem}.swagger-ui .mt5{margin-top:4rem}.swagger-ui .mt6{margin-top:8rem}.swagger-ui .mt7{margin-top:16rem}.swagger-ui .mv0{margin-bottom:0;margin-top:0}.swagger-ui .mv1{margin-bottom:.25rem;margin-top:.25rem}.swagger-ui .mv2{margin-bottom:.5rem;margin-top:.5rem}.swagger-ui .mv3{margin-bottom:1rem;margin-top:1rem}.swagger-ui .mv4{margin-bottom:2rem;margin-top:2rem}.swagger-ui .mv5{margin-bottom:4rem;margin-top:4rem}.swagger-ui .mv6{margin-bottom:8rem;margin-top:8rem}.swagger-ui .mv7{margin-bottom:16rem;margin-top:16rem}.swagger-ui .mh0{margin-left:0;margin-right:0}.swagger-ui .mh1{margin-left:.25rem;margin-right:.25rem}.swagger-ui .mh2{margin-left:.5rem;margin-right:.5rem}.swagger-ui .mh3{margin-left:1rem;margin-right:1rem}.swagger-ui .mh4{margin-left:2rem;margin-right:2rem}.swagger-ui .mh5{margin-left:4rem;margin-right:4rem}.swagger-ui .mh6{margin-left:8rem;margin-right:8rem}.swagger-ui .mh7{margin-left:16rem;margin-right:16rem}@media screen and (min-width:30em){.swagger-ui .pa0-ns{padding:0}.swagger-ui .pa1-ns{padding:.25rem}.swagger-ui .pa2-ns{padding:.5rem}.swagger-ui .pa3-ns{padding:1rem}.swagger-ui .pa4-ns{padding:2rem}.swagger-ui .pa5-ns{padding:4rem}.swagger-ui .pa6-ns{padding:8rem}.swagger-ui .pa7-ns{padding:16rem}.swagger-ui .pl0-ns{padding-left:0}.swagger-ui .pl1-ns{padding-left:.25rem}.swagger-ui .pl2-ns{padding-left:.5rem}.swagger-ui .pl3-ns{padding-left:1rem}.swagger-ui .pl4-ns{padding-left:2rem}.swagger-ui .pl5-ns{padding-left:4rem}.swagger-ui .pl6-ns{padding-left:8rem}.swagger-ui .pl7-ns{padding-left:16rem}.swagger-ui .pr0-ns{padding-right:0}.swagger-ui .pr1-ns{padding-right:.25rem}.swagger-ui .pr2-ns{padding-right:.5rem}.swagger-ui .pr3-ns{padding-right:1rem}.swagger-ui .pr4-ns{padding-right:2rem}.swagger-ui .pr5-ns{padding-right:4rem}.swagger-ui .pr6-ns{padding-right:8rem}.swagger-ui .pr7-ns{padding-right:16rem}.swagger-ui .pb0-ns{padding-bottom:0}.swagger-ui .pb1-ns{padding-bottom:.25rem}.swagger-ui .pb2-ns{padding-bottom:.5rem}.swagger-ui .pb3-ns{padding-bottom:1rem}.swagger-ui .pb4-ns{padding-bottom:2rem}.swagger-ui .pb5-ns{padding-bottom:4rem}.swagger-ui .pb6-ns{padding-bottom:8rem}.swagger-ui .pb7-ns{padding-bottom:16rem}.swagger-ui .pt0-ns{padding-top:0}.swagger-ui .pt1-ns{padding-top:.25rem}.swagger-ui .pt2-ns{padding-top:.5rem}.swagger-ui .pt3-ns{padding-top:1rem}.swagger-ui .pt4-ns{padding-top:2rem}.swagger-ui .pt5-ns{padding-top:4rem}.swagger-ui .pt6-ns{padding-top:8rem}.swagger-ui .pt7-ns{padding-top:16rem}.swagger-ui .pv0-ns{padding-bottom:0;padding-top:0}.swagger-ui .pv1-ns{padding-bottom:.25rem;padding-top:.25rem}.swagger-ui .pv2-ns{padding-bottom:.5rem;padding-top:.5rem}.swagger-ui .pv3-ns{padding-bottom:1rem;padding-top:1rem}.swagger-ui .pv4-ns{padding-bottom:2rem;padding-top:2rem}.swagger-ui .pv5-ns{padding-bottom:4rem;padding-top:4rem}.swagger-ui .pv6-ns{padding-bottom:8rem;padding-top:8rem}.swagger-ui .pv7-ns{padding-bottom:16rem;padding-top:16rem}.swagger-ui .ph0-ns{padding-left:0;padding-right:0}.swagger-ui .ph1-ns{padding-left:.25rem;padding-right:.25rem}.swagger-ui .ph2-ns{padding-left:.5rem;padding-right:.5rem}.swagger-ui .ph3-ns{padding-left:1rem;padding-right:1rem}.swagger-ui .ph4-ns{padding-left:2rem;padding-right:2rem}.swagger-ui .ph5-ns{padding-left:4rem;padding-right:4rem}.swagger-ui .ph6-ns{padding-left:8rem;padding-right:8rem}.swagger-ui .ph7-ns{padding-left:16rem;padding-right:16rem}.swagger-ui .ma0-ns{margin:0}.swagger-ui .ma1-ns{margin:.25rem}.swagger-ui .ma2-ns{margin:.5rem}.swagger-ui .ma3-ns{margin:1rem}.swagger-ui .ma4-ns{margin:2rem}.swagger-ui .ma5-ns{margin:4rem}.swagger-ui .ma6-ns{margin:8rem}.swagger-ui .ma7-ns{margin:16rem}.swagger-ui .ml0-ns{margin-left:0}.swagger-ui .ml1-ns{margin-left:.25rem}.swagger-ui .ml2-ns{margin-left:.5rem}.swagger-ui .ml3-ns{margin-left:1rem}.swagger-ui .ml4-ns{margin-left:2rem}.swagger-ui .ml5-ns{margin-left:4rem}.swagger-ui .ml6-ns{margin-left:8rem}.swagger-ui .ml7-ns{margin-left:16rem}.swagger-ui .mr0-ns{margin-right:0}.swagger-ui .mr1-ns{margin-right:.25rem}.swagger-ui .mr2-ns{margin-right:.5rem}.swagger-ui .mr3-ns{margin-right:1rem}.swagger-ui .mr4-ns{margin-right:2rem}.swagger-ui .mr5-ns{margin-right:4rem}.swagger-ui .mr6-ns{margin-right:8rem}.swagger-ui .mr7-ns{margin-right:16rem}.swagger-ui .mb0-ns{margin-bottom:0}.swagger-ui .mb1-ns{margin-bottom:.25rem}.swagger-ui .mb2-ns{margin-bottom:.5rem}.swagger-ui .mb3-ns{margin-bottom:1rem}.swagger-ui .mb4-ns{margin-bottom:2rem}.swagger-ui .mb5-ns{margin-bottom:4rem}.swagger-ui .mb6-ns{margin-bottom:8rem}.swagger-ui .mb7-ns{margin-bottom:16rem}.swagger-ui .mt0-ns{margin-top:0}.swagger-ui .mt1-ns{margin-top:.25rem}.swagger-ui .mt2-ns{margin-top:.5rem}.swagger-ui .mt3-ns{margin-top:1rem}.swagger-ui .mt4-ns{margin-top:2rem}.swagger-ui .mt5-ns{margin-top:4rem}.swagger-ui .mt6-ns{margin-top:8rem}.swagger-ui .mt7-ns{margin-top:16rem}.swagger-ui .mv0-ns{margin-bottom:0;margin-top:0}.swagger-ui .mv1-ns{margin-bottom:.25rem;margin-top:.25rem}.swagger-ui .mv2-ns{margin-bottom:.5rem;margin-top:.5rem}.swagger-ui .mv3-ns{margin-bottom:1rem;margin-top:1rem}.swagger-ui .mv4-ns{margin-bottom:2rem;margin-top:2rem}.swagger-ui .mv5-ns{margin-bottom:4rem;margin-top:4rem}.swagger-ui .mv6-ns{margin-bottom:8rem;margin-top:8rem}.swagger-ui .mv7-ns{margin-bottom:16rem;margin-top:16rem}.swagger-ui .mh0-ns{margin-left:0;margin-right:0}.swagger-ui .mh1-ns{margin-left:.25rem;margin-right:.25rem}.swagger-ui .mh2-ns{margin-left:.5rem;margin-right:.5rem}.swagger-ui .mh3-ns{margin-left:1rem;margin-right:1rem}.swagger-ui .mh4-ns{margin-left:2rem;margin-right:2rem}.swagger-ui .mh5-ns{margin-left:4rem;margin-right:4rem}.swagger-ui .mh6-ns{margin-left:8rem;margin-right:8rem}.swagger-ui .mh7-ns{margin-left:16rem;margin-right:16rem}}@media screen and (min-width:30em) and (max-width:60em){.swagger-ui .pa0-m{padding:0}.swagger-ui .pa1-m{padding:.25rem}.swagger-ui .pa2-m{padding:.5rem}.swagger-ui .pa3-m{padding:1rem}.swagger-ui .pa4-m{padding:2rem}.swagger-ui .pa5-m{padding:4rem}.swagger-ui .pa6-m{padding:8rem}.swagger-ui .pa7-m{padding:16rem}.swagger-ui .pl0-m{padding-left:0}.swagger-ui .pl1-m{padding-left:.25rem}.swagger-ui .pl2-m{padding-left:.5rem}.swagger-ui .pl3-m{padding-left:1rem}.swagger-ui .pl4-m{padding-left:2rem}.swagger-ui .pl5-m{padding-left:4rem}.swagger-ui .pl6-m{padding-left:8rem}.swagger-ui .pl7-m{padding-left:16rem}.swagger-ui .pr0-m{padding-right:0}.swagger-ui .pr1-m{padding-right:.25rem}.swagger-ui .pr2-m{padding-right:.5rem}.swagger-ui .pr3-m{padding-right:1rem}.swagger-ui .pr4-m{padding-right:2rem}.swagger-ui .pr5-m{padding-right:4rem}.swagger-ui .pr6-m{padding-right:8rem}.swagger-ui .pr7-m{padding-right:16rem}.swagger-ui .pb0-m{padding-bottom:0}.swagger-ui .pb1-m{padding-bottom:.25rem}.swagger-ui .pb2-m{padding-bottom:.5rem}.swagger-ui .pb3-m{padding-bottom:1rem}.swagger-ui .pb4-m{padding-bottom:2rem}.swagger-ui .pb5-m{padding-bottom:4rem}.swagger-ui .pb6-m{padding-bottom:8rem}.swagger-ui .pb7-m{padding-bottom:16rem}.swagger-ui .pt0-m{padding-top:0}.swagger-ui .pt1-m{padding-top:.25rem}.swagger-ui .pt2-m{padding-top:.5rem}.swagger-ui .pt3-m{padding-top:1rem}.swagger-ui .pt4-m{padding-top:2rem}.swagger-ui .pt5-m{padding-top:4rem}.swagger-ui .pt6-m{padding-top:8rem}.swagger-ui .pt7-m{padding-top:16rem}.swagger-ui .pv0-m{padding-bottom:0;padding-top:0}.swagger-ui .pv1-m{padding-bottom:.25rem;padding-top:.25rem}.swagger-ui .pv2-m{padding-bottom:.5rem;padding-top:.5rem}.swagger-ui .pv3-m{padding-bottom:1rem;padding-top:1rem}.swagger-ui .pv4-m{padding-bottom:2rem;padding-top:2rem}.swagger-ui .pv5-m{padding-bottom:4rem;padding-top:4rem}.swagger-ui .pv6-m{padding-bottom:8rem;padding-top:8rem}.swagger-ui .pv7-m{padding-bottom:16rem;padding-top:16rem}.swagger-ui .ph0-m{padding-left:0;padding-right:0}.swagger-ui .ph1-m{padding-left:.25rem;padding-right:.25rem}.swagger-ui .ph2-m{padding-left:.5rem;padding-right:.5rem}.swagger-ui .ph3-m{padding-left:1rem;padding-right:1rem}.swagger-ui .ph4-m{padding-left:2rem;padding-right:2rem}.swagger-ui .ph5-m{padding-left:4rem;padding-right:4rem}.swagger-ui .ph6-m{padding-left:8rem;padding-right:8rem}.swagger-ui .ph7-m{padding-left:16rem;padding-right:16rem}.swagger-ui .ma0-m{margin:0}.swagger-ui .ma1-m{margin:.25rem}.swagger-ui .ma2-m{margin:.5rem}.swagger-ui .ma3-m{margin:1rem}.swagger-ui .ma4-m{margin:2rem}.swagger-ui .ma5-m{margin:4rem}.swagger-ui .ma6-m{margin:8rem}.swagger-ui .ma7-m{margin:16rem}.swagger-ui .ml0-m{margin-left:0}.swagger-ui .ml1-m{margin-left:.25rem}.swagger-ui .ml2-m{margin-left:.5rem}.swagger-ui .ml3-m{margin-left:1rem}.swagger-ui .ml4-m{margin-left:2rem}.swagger-ui .ml5-m{margin-left:4rem}.swagger-ui .ml6-m{margin-left:8rem}.swagger-ui .ml7-m{margin-left:16rem}.swagger-ui .mr0-m{margin-right:0}.swagger-ui .mr1-m{margin-right:.25rem}.swagger-ui .mr2-m{margin-right:.5rem}.swagger-ui .mr3-m{margin-right:1rem}.swagger-ui .mr4-m{margin-right:2rem}.swagger-ui .mr5-m{margin-right:4rem}.swagger-ui .mr6-m{margin-right:8rem}.swagger-ui .mr7-m{margin-right:16rem}.swagger-ui .mb0-m{margin-bottom:0}.swagger-ui .mb1-m{margin-bottom:.25rem}.swagger-ui .mb2-m{margin-bottom:.5rem}.swagger-ui .mb3-m{margin-bottom:1rem}.swagger-ui .mb4-m{margin-bottom:2rem}.swagger-ui .mb5-m{margin-bottom:4rem}.swagger-ui .mb6-m{margin-bottom:8rem}.swagger-ui .mb7-m{margin-bottom:16rem}.swagger-ui .mt0-m{margin-top:0}.swagger-ui .mt1-m{margin-top:.25rem}.swagger-ui .mt2-m{margin-top:.5rem}.swagger-ui .mt3-m{margin-top:1rem}.swagger-ui .mt4-m{margin-top:2rem}.swagger-ui .mt5-m{margin-top:4rem}.swagger-ui .mt6-m{margin-top:8rem}.swagger-ui .mt7-m{margin-top:16rem}.swagger-ui .mv0-m{margin-bottom:0;margin-top:0}.swagger-ui .mv1-m{margin-bottom:.25rem;margin-top:.25rem}.swagger-ui .mv2-m{margin-bottom:.5rem;margin-top:.5rem}.swagger-ui .mv3-m{margin-bottom:1rem;margin-top:1rem}.swagger-ui .mv4-m{margin-bottom:2rem;margin-top:2rem}.swagger-ui .mv5-m{margin-bottom:4rem;margin-top:4rem}.swagger-ui .mv6-m{margin-bottom:8rem;margin-top:8rem}.swagger-ui .mv7-m{margin-bottom:16rem;margin-top:16rem}.swagger-ui .mh0-m{margin-left:0;margin-right:0}.swagger-ui .mh1-m{margin-left:.25rem;margin-right:.25rem}.swagger-ui .mh2-m{margin-left:.5rem;margin-right:.5rem}.swagger-ui .mh3-m{margin-left:1rem;margin-right:1rem}.swagger-ui .mh4-m{margin-left:2rem;margin-right:2rem}.swagger-ui .mh5-m{margin-left:4rem;margin-right:4rem}.swagger-ui .mh6-m{margin-left:8rem;margin-right:8rem}.swagger-ui .mh7-m{margin-left:16rem;margin-right:16rem}}@media screen and (min-width:60em){.swagger-ui .pa0-l{padding:0}.swagger-ui .pa1-l{padding:.25rem}.swagger-ui .pa2-l{padding:.5rem}.swagger-ui .pa3-l{padding:1rem}.swagger-ui .pa4-l{padding:2rem}.swagger-ui .pa5-l{padding:4rem}.swagger-ui .pa6-l{padding:8rem}.swagger-ui .pa7-l{padding:16rem}.swagger-ui .pl0-l{padding-left:0}.swagger-ui .pl1-l{padding-left:.25rem}.swagger-ui .pl2-l{padding-left:.5rem}.swagger-ui .pl3-l{padding-left:1rem}.swagger-ui .pl4-l{padding-left:2rem}.swagger-ui .pl5-l{padding-left:4rem}.swagger-ui .pl6-l{padding-left:8rem}.swagger-ui .pl7-l{padding-left:16rem}.swagger-ui .pr0-l{padding-right:0}.swagger-ui .pr1-l{padding-right:.25rem}.swagger-ui .pr2-l{padding-right:.5rem}.swagger-ui .pr3-l{padding-right:1rem}.swagger-ui .pr4-l{padding-right:2rem}.swagger-ui .pr5-l{padding-right:4rem}.swagger-ui .pr6-l{padding-right:8rem}.swagger-ui .pr7-l{padding-right:16rem}.swagger-ui .pb0-l{padding-bottom:0}.swagger-ui .pb1-l{padding-bottom:.25rem}.swagger-ui .pb2-l{padding-bottom:.5rem}.swagger-ui .pb3-l{padding-bottom:1rem}.swagger-ui .pb4-l{padding-bottom:2rem}.swagger-ui .pb5-l{padding-bottom:4rem}.swagger-ui .pb6-l{padding-bottom:8rem}.swagger-ui .pb7-l{padding-bottom:16rem}.swagger-ui .pt0-l{padding-top:0}.swagger-ui .pt1-l{padding-top:.25rem}.swagger-ui .pt2-l{padding-top:.5rem}.swagger-ui .pt3-l{padding-top:1rem}.swagger-ui .pt4-l{padding-top:2rem}.swagger-ui .pt5-l{padding-top:4rem}.swagger-ui .pt6-l{padding-top:8rem}.swagger-ui .pt7-l{padding-top:16rem}.swagger-ui .pv0-l{padding-bottom:0;padding-top:0}.swagger-ui .pv1-l{padding-bottom:.25rem;padding-top:.25rem}.swagger-ui .pv2-l{padding-bottom:.5rem;padding-top:.5rem}.swagger-ui .pv3-l{padding-bottom:1rem;padding-top:1rem}.swagger-ui .pv4-l{padding-bottom:2rem;padding-top:2rem}.swagger-ui .pv5-l{padding-bottom:4rem;padding-top:4rem}.swagger-ui .pv6-l{padding-bottom:8rem;padding-top:8rem}.swagger-ui .pv7-l{padding-bottom:16rem;padding-top:16rem}.swagger-ui .ph0-l{padding-left:0;padding-right:0}.swagger-ui .ph1-l{padding-left:.25rem;padding-right:.25rem}.swagger-ui .ph2-l{padding-left:.5rem;padding-right:.5rem}.swagger-ui .ph3-l{padding-left:1rem;padding-right:1rem}.swagger-ui .ph4-l{padding-left:2rem;padding-right:2rem}.swagger-ui .ph5-l{padding-left:4rem;padding-right:4rem}.swagger-ui .ph6-l{padding-left:8rem;padding-right:8rem}.swagger-ui .ph7-l{padding-left:16rem;padding-right:16rem}.swagger-ui .ma0-l{margin:0}.swagger-ui .ma1-l{margin:.25rem}.swagger-ui .ma2-l{margin:.5rem}.swagger-ui .ma3-l{margin:1rem}.swagger-ui .ma4-l{margin:2rem}.swagger-ui .ma5-l{margin:4rem}.swagger-ui .ma6-l{margin:8rem}.swagger-ui .ma7-l{margin:16rem}.swagger-ui .ml0-l{margin-left:0}.swagger-ui .ml1-l{margin-left:.25rem}.swagger-ui .ml2-l{margin-left:.5rem}.swagger-ui .ml3-l{margin-left:1rem}.swagger-ui .ml4-l{margin-left:2rem}.swagger-ui .ml5-l{margin-left:4rem}.swagger-ui .ml6-l{margin-left:8rem}.swagger-ui .ml7-l{margin-left:16rem}.swagger-ui .mr0-l{margin-right:0}.swagger-ui .mr1-l{margin-right:.25rem}.swagger-ui .mr2-l{margin-right:.5rem}.swagger-ui .mr3-l{margin-right:1rem}.swagger-ui .mr4-l{margin-right:2rem}.swagger-ui .mr5-l{margin-right:4rem}.swagger-ui .mr6-l{margin-right:8rem}.swagger-ui .mr7-l{margin-right:16rem}.swagger-ui .mb0-l{margin-bottom:0}.swagger-ui .mb1-l{margin-bottom:.25rem}.swagger-ui .mb2-l{margin-bottom:.5rem}.swagger-ui .mb3-l{margin-bottom:1rem}.swagger-ui .mb4-l{margin-bottom:2rem}.swagger-ui .mb5-l{margin-bottom:4rem}.swagger-ui .mb6-l{margin-bottom:8rem}.swagger-ui .mb7-l{margin-bottom:16rem}.swagger-ui .mt0-l{margin-top:0}.swagger-ui .mt1-l{margin-top:.25rem}.swagger-ui .mt2-l{margin-top:.5rem}.swagger-ui .mt3-l{margin-top:1rem}.swagger-ui .mt4-l{margin-top:2rem}.swagger-ui .mt5-l{margin-top:4rem}.swagger-ui .mt6-l{margin-top:8rem}.swagger-ui .mt7-l{margin-top:16rem}.swagger-ui .mv0-l{margin-bottom:0;margin-top:0}.swagger-ui .mv1-l{margin-bottom:.25rem;margin-top:.25rem}.swagger-ui .mv2-l{margin-bottom:.5rem;margin-top:.5rem}.swagger-ui .mv3-l{margin-bottom:1rem;margin-top:1rem}.swagger-ui .mv4-l{margin-bottom:2rem;margin-top:2rem}.swagger-ui .mv5-l{margin-bottom:4rem;margin-top:4rem}.swagger-ui .mv6-l{margin-bottom:8rem;margin-top:8rem}.swagger-ui .mv7-l{margin-bottom:16rem;margin-top:16rem}.swagger-ui .mh0-l{margin-left:0;margin-right:0}.swagger-ui .mh1-l{margin-left:.25rem;margin-right:.25rem}.swagger-ui .mh2-l{margin-left:.5rem;margin-right:.5rem}.swagger-ui .mh3-l{margin-left:1rem;margin-right:1rem}.swagger-ui .mh4-l{margin-left:2rem;margin-right:2rem}.swagger-ui .mh5-l{margin-left:4rem;margin-right:4rem}.swagger-ui .mh6-l{margin-left:8rem;margin-right:8rem}.swagger-ui .mh7-l{margin-left:16rem;margin-right:16rem}}.swagger-ui .na1{margin:-.25rem}.swagger-ui .na2{margin:-.5rem}.swagger-ui .na3{margin:-1rem}.swagger-ui .na4{margin:-2rem}.swagger-ui .na5{margin:-4rem}.swagger-ui .na6{margin:-8rem}.swagger-ui .na7{margin:-16rem}.swagger-ui .nl1{margin-left:-.25rem}.swagger-ui .nl2{margin-left:-.5rem}.swagger-ui .nl3{margin-left:-1rem}.swagger-ui .nl4{margin-left:-2rem}.swagger-ui .nl5{margin-left:-4rem}.swagger-ui .nl6{margin-left:-8rem}.swagger-ui .nl7{margin-left:-16rem}.swagger-ui .nr1{margin-right:-.25rem}.swagger-ui .nr2{margin-right:-.5rem}.swagger-ui .nr3{margin-right:-1rem}.swagger-ui .nr4{margin-right:-2rem}.swagger-ui .nr5{margin-right:-4rem}.swagger-ui .nr6{margin-right:-8rem}.swagger-ui .nr7{margin-right:-16rem}.swagger-ui .nb1{margin-bottom:-.25rem}.swagger-ui .nb2{margin-bottom:-.5rem}.swagger-ui .nb3{margin-bottom:-1rem}.swagger-ui .nb4{margin-bottom:-2rem}.swagger-ui .nb5{margin-bottom:-4rem}.swagger-ui .nb6{margin-bottom:-8rem}.swagger-ui .nb7{margin-bottom:-16rem}.swagger-ui .nt1{margin-top:-.25rem}.swagger-ui .nt2{margin-top:-.5rem}.swagger-ui .nt3{margin-top:-1rem}.swagger-ui .nt4{margin-top:-2rem}.swagger-ui .nt5{margin-top:-4rem}.swagger-ui .nt6{margin-top:-8rem}.swagger-ui .nt7{margin-top:-16rem}@media screen and (min-width:30em){.swagger-ui .na1-ns{margin:-.25rem}.swagger-ui .na2-ns{margin:-.5rem}.swagger-ui .na3-ns{margin:-1rem}.swagger-ui .na4-ns{margin:-2rem}.swagger-ui .na5-ns{margin:-4rem}.swagger-ui .na6-ns{margin:-8rem}.swagger-ui .na7-ns{margin:-16rem}.swagger-ui .nl1-ns{margin-left:-.25rem}.swagger-ui .nl2-ns{margin-left:-.5rem}.swagger-ui .nl3-ns{margin-left:-1rem}.swagger-ui .nl4-ns{margin-left:-2rem}.swagger-ui .nl5-ns{margin-left:-4rem}.swagger-ui .nl6-ns{margin-left:-8rem}.swagger-ui .nl7-ns{margin-left:-16rem}.swagger-ui .nr1-ns{margin-right:-.25rem}.swagger-ui .nr2-ns{margin-right:-.5rem}.swagger-ui .nr3-ns{margin-right:-1rem}.swagger-ui .nr4-ns{margin-right:-2rem}.swagger-ui .nr5-ns{margin-right:-4rem}.swagger-ui .nr6-ns{margin-right:-8rem}.swagger-ui .nr7-ns{margin-right:-16rem}.swagger-ui .nb1-ns{margin-bottom:-.25rem}.swagger-ui .nb2-ns{margin-bottom:-.5rem}.swagger-ui .nb3-ns{margin-bottom:-1rem}.swagger-ui .nb4-ns{margin-bottom:-2rem}.swagger-ui .nb5-ns{margin-bottom:-4rem}.swagger-ui .nb6-ns{margin-bottom:-8rem}.swagger-ui .nb7-ns{margin-bottom:-16rem}.swagger-ui .nt1-ns{margin-top:-.25rem}.swagger-ui .nt2-ns{margin-top:-.5rem}.swagger-ui .nt3-ns{margin-top:-1rem}.swagger-ui .nt4-ns{margin-top:-2rem}.swagger-ui .nt5-ns{margin-top:-4rem}.swagger-ui .nt6-ns{margin-top:-8rem}.swagger-ui .nt7-ns{margin-top:-16rem}}@media screen and (min-width:30em) and (max-width:60em){.swagger-ui .na1-m{margin:-.25rem}.swagger-ui .na2-m{margin:-.5rem}.swagger-ui .na3-m{margin:-1rem}.swagger-ui .na4-m{margin:-2rem}.swagger-ui .na5-m{margin:-4rem}.swagger-ui .na6-m{margin:-8rem}.swagger-ui .na7-m{margin:-16rem}.swagger-ui .nl1-m{margin-left:-.25rem}.swagger-ui .nl2-m{margin-left:-.5rem}.swagger-ui .nl3-m{margin-left:-1rem}.swagger-ui .nl4-m{margin-left:-2rem}.swagger-ui .nl5-m{margin-left:-4rem}.swagger-ui .nl6-m{margin-left:-8rem}.swagger-ui .nl7-m{margin-left:-16rem}.swagger-ui .nr1-m{margin-right:-.25rem}.swagger-ui .nr2-m{margin-right:-.5rem}.swagger-ui .nr3-m{margin-right:-1rem}.swagger-ui .nr4-m{margin-right:-2rem}.swagger-ui .nr5-m{margin-right:-4rem}.swagger-ui .nr6-m{margin-right:-8rem}.swagger-ui .nr7-m{margin-right:-16rem}.swagger-ui .nb1-m{margin-bottom:-.25rem}.swagger-ui .nb2-m{margin-bottom:-.5rem}.swagger-ui .nb3-m{margin-bottom:-1rem}.swagger-ui .nb4-m{margin-bottom:-2rem}.swagger-ui .nb5-m{margin-bottom:-4rem}.swagger-ui .nb6-m{margin-bottom:-8rem}.swagger-ui .nb7-m{margin-bottom:-16rem}.swagger-ui .nt1-m{margin-top:-.25rem}.swagger-ui .nt2-m{margin-top:-.5rem}.swagger-ui .nt3-m{margin-top:-1rem}.swagger-ui .nt4-m{margin-top:-2rem}.swagger-ui .nt5-m{margin-top:-4rem}.swagger-ui .nt6-m{margin-top:-8rem}.swagger-ui .nt7-m{margin-top:-16rem}}@media screen and (min-width:60em){.swagger-ui .na1-l{margin:-.25rem}.swagger-ui .na2-l{margin:-.5rem}.swagger-ui .na3-l{margin:-1rem}.swagger-ui .na4-l{margin:-2rem}.swagger-ui .na5-l{margin:-4rem}.swagger-ui .na6-l{margin:-8rem}.swagger-ui .na7-l{margin:-16rem}.swagger-ui .nl1-l{margin-left:-.25rem}.swagger-ui .nl2-l{margin-left:-.5rem}.swagger-ui .nl3-l{margin-left:-1rem}.swagger-ui .nl4-l{margin-left:-2rem}.swagger-ui .nl5-l{margin-left:-4rem}.swagger-ui .nl6-l{margin-left:-8rem}.swagger-ui .nl7-l{margin-left:-16rem}.swagger-ui .nr1-l{margin-right:-.25rem}.swagger-ui .nr2-l{margin-right:-.5rem}.swagger-ui .nr3-l{margin-right:-1rem}.swagger-ui .nr4-l{margin-right:-2rem}.swagger-ui .nr5-l{margin-right:-4rem}.swagger-ui .nr6-l{margin-right:-8rem}.swagger-ui .nr7-l{margin-right:-16rem}.swagger-ui .nb1-l{margin-bottom:-.25rem}.swagger-ui .nb2-l{margin-bottom:-.5rem}.swagger-ui .nb3-l{margin-bottom:-1rem}.swagger-ui .nb4-l{margin-bottom:-2rem}.swagger-ui .nb5-l{margin-bottom:-4rem}.swagger-ui .nb6-l{margin-bottom:-8rem}.swagger-ui .nb7-l{margin-bottom:-16rem}.swagger-ui .nt1-l{margin-top:-.25rem}.swagger-ui .nt2-l{margin-top:-.5rem}.swagger-ui .nt3-l{margin-top:-1rem}.swagger-ui .nt4-l{margin-top:-2rem}.swagger-ui .nt5-l{margin-top:-4rem}.swagger-ui .nt6-l{margin-top:-8rem}.swagger-ui .nt7-l{margin-top:-16rem}}.swagger-ui .collapse{border-collapse:collapse;border-spacing:0}.swagger-ui .striped--light-silver:nth-child(odd){background-color:#aaa}.swagger-ui .striped--moon-gray:nth-child(odd){background-color:#ccc}.swagger-ui .striped--light-gray:nth-child(odd){background-color:#eee}.swagger-ui .striped--near-white:nth-child(odd){background-color:#f4f4f4}.swagger-ui .stripe-light:nth-child(odd){background-color:#ffffff1a}.swagger-ui .stripe-dark:nth-child(odd){background-color:#0000001a}.swagger-ui .strike{text-decoration:line-through}.swagger-ui .underline{text-decoration:underline}.swagger-ui .no-underline{text-decoration:none}@media screen and (min-width:30em){.swagger-ui .strike-ns{text-decoration:line-through}.swagger-ui .underline-ns{text-decoration:underline}.swagger-ui .no-underline-ns{text-decoration:none}}@media screen and (min-width:30em) and (max-width:60em){.swagger-ui .strike-m{text-decoration:line-through}.swagger-ui .underline-m{text-decoration:underline}.swagger-ui .no-underline-m{text-decoration:none}}@media screen and (min-width:60em){.swagger-ui .strike-l{text-decoration:line-through}.swagger-ui .underline-l{text-decoration:underline}.swagger-ui .no-underline-l{text-decoration:none}}.swagger-ui .tl{text-align:left}.swagger-ui .tr{text-align:right}.swagger-ui .tc{text-align:center}.swagger-ui .tj{text-align:justify}@media screen and (min-width:30em){.swagger-ui .tl-ns{text-align:left}.swagger-ui .tr-ns{text-align:right}.swagger-ui .tc-ns{text-align:center}.swagger-ui .tj-ns{text-align:justify}}@media screen and (min-width:30em) and (max-width:60em){.swagger-ui .tl-m{text-align:left}.swagger-ui .tr-m{text-align:right}.swagger-ui .tc-m{text-align:center}.swagger-ui .tj-m{text-align:justify}}@media screen and (min-width:60em){.swagger-ui .tl-l{text-align:left}.swagger-ui .tr-l{text-align:right}.swagger-ui .tc-l{text-align:center}.swagger-ui .tj-l{text-align:justify}}.swagger-ui .ttc{text-transform:capitalize}.swagger-ui .ttl{text-transform:lowercase}.swagger-ui .ttu{text-transform:uppercase}.swagger-ui .ttn{text-transform:none}@media screen and (min-width:30em){.swagger-ui .ttc-ns{text-transform:capitalize}.swagger-ui .ttl-ns{text-transform:lowercase}.swagger-ui .ttu-ns{text-transform:uppercase}.swagger-ui .ttn-ns{text-transform:none}}@media screen and (min-width:30em) and (max-width:60em){.swagger-ui .ttc-m{text-transform:capitalize}.swagger-ui .ttl-m{text-transform:lowercase}.swagger-ui .ttu-m{text-transform:uppercase}.swagger-ui .ttn-m{text-transform:none}}@media screen and (min-width:60em){.swagger-ui .ttc-l{text-transform:capitalize}.swagger-ui .ttl-l{text-transform:lowercase}.swagger-ui .ttu-l{text-transform:uppercase}.swagger-ui .ttn-l{text-transform:none}}.swagger-ui .f-6,.swagger-ui .f-headline{font-size:6rem}.swagger-ui .f-5,.swagger-ui .f-subheadline{font-size:5rem}.swagger-ui .f1{font-size:3rem}.swagger-ui .f2{font-size:2.25rem}.swagger-ui .f3{font-size:1.5rem}.swagger-ui .f4{font-size:1.25rem}.swagger-ui .f5{font-size:1rem}.swagger-ui .f6{font-size:.875rem}.swagger-ui .f7{font-size:.75rem}@media screen and (min-width:30em){.swagger-ui .f-6-ns,.swagger-ui .f-headline-ns{font-size:6rem}.swagger-ui .f-5-ns,.swagger-ui .f-subheadline-ns{font-size:5rem}.swagger-ui .f1-ns{font-size:3rem}.swagger-ui .f2-ns{font-size:2.25rem}.swagger-ui .f3-ns{font-size:1.5rem}.swagger-ui .f4-ns{font-size:1.25rem}.swagger-ui .f5-ns{font-size:1rem}.swagger-ui .f6-ns{font-size:.875rem}.swagger-ui .f7-ns{font-size:.75rem}}@media screen and (min-width:30em) and (max-width:60em){.swagger-ui .f-6-m,.swagger-ui .f-headline-m{font-size:6rem}.swagger-ui .f-5-m,.swagger-ui .f-subheadline-m{font-size:5rem}.swagger-ui .f1-m{font-size:3rem}.swagger-ui .f2-m{font-size:2.25rem}.swagger-ui .f3-m{font-size:1.5rem}.swagger-ui .f4-m{font-size:1.25rem}.swagger-ui .f5-m{font-size:1rem}.swagger-ui .f6-m{font-size:.875rem}.swagger-ui .f7-m{font-size:.75rem}}@media screen and (min-width:60em){.swagger-ui .f-6-l,.swagger-ui .f-headline-l{font-size:6rem}.swagger-ui .f-5-l,.swagger-ui .f-subheadline-l{font-size:5rem}.swagger-ui .f1-l{font-size:3rem}.swagger-ui .f2-l{font-size:2.25rem}.swagger-ui .f3-l{font-size:1.5rem}.swagger-ui .f4-l{font-size:1.25rem}.swagger-ui .f5-l{font-size:1rem}.swagger-ui .f6-l{font-size:.875rem}.swagger-ui .f7-l{font-size:.75rem}}.swagger-ui .measure{max-width:30em}.swagger-ui .measure-wide{max-width:34em}.swagger-ui .measure-narrow{max-width:20em}.swagger-ui .indent{margin-bottom:0;margin-top:0;text-indent:1em}.swagger-ui .small-caps{font-feature-settings:"smcp";font-variant:small-caps}.swagger-ui .truncate{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}@media screen and (min-width:30em){.swagger-ui .measure-ns{max-width:30em}.swagger-ui .measure-wide-ns{max-width:34em}.swagger-ui .measure-narrow-ns{max-width:20em}.swagger-ui .indent-ns{margin-bottom:0;margin-top:0;text-indent:1em}.swagger-ui .small-caps-ns{font-feature-settings:"smcp";font-variant:small-caps}.swagger-ui .truncate-ns{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}}@media screen and (min-width:30em) and (max-width:60em){.swagger-ui .measure-m{max-width:30em}.swagger-ui .measure-wide-m{max-width:34em}.swagger-ui .measure-narrow-m{max-width:20em}.swagger-ui .indent-m{margin-bottom:0;margin-top:0;text-indent:1em}.swagger-ui .small-caps-m{font-feature-settings:"smcp";font-variant:small-caps}.swagger-ui .truncate-m{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}}@media screen and (min-width:60em){.swagger-ui .measure-l{max-width:30em}.swagger-ui .measure-wide-l{max-width:34em}.swagger-ui .measure-narrow-l{max-width:20em}.swagger-ui .indent-l{margin-bottom:0;margin-top:0;text-indent:1em}.swagger-ui .small-caps-l{font-feature-settings:"smcp";font-variant:small-caps}.swagger-ui .truncate-l{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}}.swagger-ui .overflow-container{overflow-y:scroll}.swagger-ui .center{margin-left:auto;margin-right:auto}.swagger-ui .mr-auto{margin-right:auto}.swagger-ui .ml-auto{margin-left:auto}@media screen and (min-width:30em){.swagger-ui .center-ns{margin-left:auto;margin-right:auto}.swagger-ui .mr-auto-ns{margin-right:auto}.swagger-ui .ml-auto-ns{margin-left:auto}}@media screen and (min-width:30em) and (max-width:60em){.swagger-ui .center-m{margin-left:auto;margin-right:auto}.swagger-ui .mr-auto-m{margin-right:auto}.swagger-ui .ml-auto-m{margin-left:auto}}@media screen and (min-width:60em){.swagger-ui .center-l{margin-left:auto;margin-right:auto}.swagger-ui .mr-auto-l{margin-right:auto}.swagger-ui .ml-auto-l{margin-left:auto}}.swagger-ui .clip{clip:rect(1px 1px 1px 1px);clip:rect(1px,1px,1px,1px);position:fixed!important;_position:absolute!important}@media screen and (min-width:30em){.swagger-ui .clip-ns{clip:rect(1px 1px 1px 1px);clip:rect(1px,1px,1px,1px);position:fixed!important;_position:absolute!important}}@media screen and (min-width:30em) and (max-width:60em){.swagger-ui .clip-m{clip:rect(1px 1px 1px 1px);clip:rect(1px,1px,1px,1px);position:fixed!important;_position:absolute!important}}@media screen and (min-width:60em){.swagger-ui .clip-l{clip:rect(1px 1px 1px 1px);clip:rect(1px,1px,1px,1px);position:fixed!important;_position:absolute!important}}.swagger-ui .ws-normal{white-space:normal}.swagger-ui .nowrap{white-space:nowrap}.swagger-ui .pre{white-space:pre}@media screen and (min-width:30em){.swagger-ui .ws-normal-ns{white-space:normal}.swagger-ui .nowrap-ns{white-space:nowrap}.swagger-ui .pre-ns{white-space:pre}}@media screen and (min-width:30em) and (max-width:60em){.swagger-ui .ws-normal-m{white-space:normal}.swagger-ui .nowrap-m{white-space:nowrap}.swagger-ui .pre-m{white-space:pre}}@media screen and (min-width:60em){.swagger-ui .ws-normal-l{white-space:normal}.swagger-ui .nowrap-l{white-space:nowrap}.swagger-ui .pre-l{white-space:pre}}.swagger-ui .v-base{vertical-align:initial}.swagger-ui .v-mid{vertical-align:middle}.swagger-ui .v-top{vertical-align:top}.swagger-ui .v-btm{vertical-align:bottom}@media screen and (min-width:30em){.swagger-ui .v-base-ns{vertical-align:initial}.swagger-ui .v-mid-ns{vertical-align:middle}.swagger-ui .v-top-ns{vertical-align:top}.swagger-ui .v-btm-ns{vertical-align:bottom}}@media screen and (min-width:30em) and (max-width:60em){.swagger-ui .v-base-m{vertical-align:initial}.swagger-ui .v-mid-m{vertical-align:middle}.swagger-ui .v-top-m{vertical-align:top}.swagger-ui .v-btm-m{vertical-align:bottom}}@media screen and (min-width:60em){.swagger-ui .v-base-l{vertical-align:initial}.swagger-ui .v-mid-l{vertical-align:middle}.swagger-ui .v-top-l{vertical-align:top}.swagger-ui .v-btm-l{vertical-align:bottom}}.swagger-ui .dim{opacity:1;transition:opacity .15s ease-in}.swagger-ui .dim:focus,.swagger-ui .dim:hover{opacity:.5;transition:opacity .15s ease-in}.swagger-ui .dim:active{opacity:.8;transition:opacity .15s ease-out}.swagger-ui .glow{transition:opacity .15s ease-in}.swagger-ui .glow:focus,.swagger-ui .glow:hover{opacity:1;transition:opacity .15s ease-in}.swagger-ui .hide-child .child{opacity:0;transition:opacity .15s ease-in}.swagger-ui .hide-child:active .child,.swagger-ui .hide-child:focus .child,.swagger-ui .hide-child:hover .child{opacity:1;transition:opacity .15s ease-in}.swagger-ui .underline-hover:focus,.swagger-ui .underline-hover:hover{text-decoration:underline}.swagger-ui .grow{-moz-osx-font-smoothing:grayscale;backface-visibility:hidden;transform:translateZ(0);transition:transform .25s ease-out}.swagger-ui .grow:focus,.swagger-ui .grow:hover{transform:scale(1.05)}.swagger-ui .grow:active{transform:scale(.9)}.swagger-ui .grow-large{-moz-osx-font-smoothing:grayscale;backface-visibility:hidden;transform:translateZ(0);transition:transform .25s ease-in-out}.swagger-ui .grow-large:focus,.swagger-ui .grow-large:hover{transform:scale(1.2)}.swagger-ui .grow-large:active{transform:scale(.95)}.swagger-ui .pointer:hover{cursor:pointer}.swagger-ui .shadow-hover{cursor:pointer;position:relative;transition:all .5s cubic-bezier(.165,.84,.44,1)}.swagger-ui .shadow-hover:after{border-radius:inherit;box-shadow:0 0 16px 2px #0003;content:"";height:100%;left:0;opacity:0;position:absolute;top:0;transition:opacity .5s cubic-bezier(.165,.84,.44,1);width:100%;z-index:-1}.swagger-ui .shadow-hover:focus:after,.swagger-ui .shadow-hover:hover:after{opacity:1}.swagger-ui .bg-animate,.swagger-ui .bg-animate:focus,.swagger-ui .bg-animate:hover{transition:background-color .15s ease-in-out}.swagger-ui .z-0{z-index:0}.swagger-ui .z-1{z-index:1}.swagger-ui .z-2{z-index:2}.swagger-ui .z-3{z-index:3}.swagger-ui .z-4{z-index:4}.swagger-ui .z-5{z-index:5}.swagger-ui .z-999{z-index:999}.swagger-ui .z-9999{z-index:9999}.swagger-ui .z-max{z-index:2147483647}.swagger-ui .z-inherit{z-index:inherit}.swagger-ui .z-initial{z-index:auto}.swagger-ui .z-unset{z-index:unset}.swagger-ui .nested-copy-line-height ol,.swagger-ui .nested-copy-line-height p,.swagger-ui .nested-copy-line-height ul{line-height:1.5}.swagger-ui .nested-headline-line-height h1,.swagger-ui .nested-headline-line-height h2,.swagger-ui .nested-headline-line-height h3,.swagger-ui .nested-headline-line-height h4,.swagger-ui .nested-headline-line-height h5,.swagger-ui .nested-headline-line-height h6{line-height:1.25}.swagger-ui .nested-list-reset ol,.swagger-ui .nested-list-reset ul{list-style-type:none;margin-left:0;padding-left:0}.swagger-ui .nested-copy-indent p+p{margin-bottom:0;margin-top:0;text-indent:.1em}.swagger-ui .nested-copy-seperator p+p{margin-top:1.5em}.swagger-ui .nested-img img{display:block;max-width:100%;width:100%}.swagger-ui .nested-links a{color:#357edd;transition:color .15s ease-in}.swagger-ui .nested-links a:focus,.swagger-ui .nested-links a:hover{color:#96ccff;transition:color .15s ease-in}.swagger-ui .wrapper{box-sizing:border-box;margin:0 auto;max-width:1460px;padding:0 20px;width:100%}.swagger-ui .opblock-tag-section{display:flex;flex-direction:column}.swagger-ui .try-out.btn-group{display:flex;flex:0.1 2 auto;padding:0}.swagger-ui .try-out__btn{margin-left:1.25rem}.swagger-ui .opblock-tag{align-items:center;border-bottom:1px solid #3b41514d;cursor:pointer;display:flex;padding:10px 20px 10px 10px;transition:all .2s}.swagger-ui .opblock-tag:hover{background:#00000005}.swagger-ui .opblock-tag{color:#3b4151;font-family:sans-serif;font-size:24px;margin:0 0 5px}.swagger-ui .opblock-tag.no-desc span{flex:1}.swagger-ui .opblock-tag svg{transition:all .4s}.swagger-ui .opblock-tag small{color:#3b4151;flex:2;font-family:sans-serif;font-size:14px;font-weight:400;padding:0 10px}.swagger-ui .opblock-tag>div{flex:1 1 150px;font-weight:400;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.swagger-ui .parameter__type{color:#3b4151;font-family:monospace;font-size:12px;font-weight:600;padding:5px 0}.swagger-ui .parameter-controls{margin-top:.75em}.swagger-ui .examples__title{display:block;font-size:1.1em;font-weight:700;margin-bottom:.75em}.swagger-ui .examples__section{margin-top:1.5em}.swagger-ui .examples__section-header{font-size:.9rem;font-weight:700;margin-bottom:.5rem}.swagger-ui .examples-select{display:inline-block;margin-bottom:.75em}.swagger-ui .examples-select .examples-select-element{width:100%}.swagger-ui .examples-select__section-label{font-size:.9rem;font-weight:700;margin-right:.5rem}.swagger-ui .example__section{margin-top:1.5em}.swagger-ui .example__section-header{font-size:.9rem;font-weight:700;margin-bottom:.5rem}.swagger-ui .view-line-link{cursor:pointer;margin:0 5px;position:relative;top:3px;transition:all .5s;width:20px}.swagger-ui .opblock{border:1px solid #000;border-radius:4px;box-shadow:0 0 3px #00000030;margin:0 0 15px}.swagger-ui .opblock .tab-header{display:flex;flex:1}.swagger-ui .opblock .tab-header .tab-item{cursor:pointer;padding:0 40px}.swagger-ui .opblock .tab-header .tab-item:first-of-type{padding:0 40px 0 0}.swagger-ui .opblock .tab-header .tab-item.active h4 span{position:relative}.swagger-ui .opblock .tab-header .tab-item.active h4 span:after{background:gray;bottom:-15px;content:"";height:4px;left:50%;position:absolute;transform:translateX(-50%);width:120%}.swagger-ui .opblock.is-open .opblock-summary{border-bottom:1px solid #000}.swagger-ui .opblock .opblock-section-header{align-items:center;background:#fffc;box-shadow:0 1px 2px #0000001a;display:flex;min-height:50px;padding:8px 20px}.swagger-ui .opblock .opblock-section-header>label{align-items:center;color:#3b4151;display:flex;font-family:sans-serif;font-size:12px;font-weight:700;margin:0 0 0 auto}.swagger-ui .opblock .opblock-section-header>label>span{padding:0 10px 0 0}.swagger-ui .opblock .opblock-section-header h4{color:#3b4151;flex:1;font-family:sans-serif;font-size:14px;margin:0}.swagger-ui .opblock .opblock-summary-method{background:#000;border-radius:3px;color:#fff;font-family:sans-serif;font-size:14px;font-weight:700;min-width:80px;padding:6px 0;text-align:center;text-shadow:0 1px 0 #0000001a}.swagger-ui .opblock .opblock-summary-operation-id,.swagger-ui .opblock .opblock-summary-path,.swagger-ui .opblock .opblock-summary-path__deprecated{align-items:center;color:#3b4151;display:flex;font-family:monospace;font-size:16px;font-weight:600;padding:0 10px;word-break:break-word}@media (max-width:768px){.swagger-ui .opblock .opblock-summary-operation-id,.swagger-ui .opblock .opblock-summary-path,.swagger-ui .opblock .opblock-summary-path__deprecated{font-size:12px}}.swagger-ui .opblock .opblock-summary-path{flex-shrink:0;max-width:calc(100% - 110px - 15rem)}.swagger-ui .opblock .opblock-summary-path__deprecated{text-decoration:line-through}.swagger-ui .opblock .opblock-summary-operation-id{font-size:14px}.swagger-ui .opblock .opblock-summary-description{color:#3b4151;flex:1 1 auto;font-family:sans-serif;font-size:13px;word-break:break-word}.swagger-ui .opblock .opblock-summary{align-items:center;cursor:pointer;display:flex;padding:5px}.swagger-ui .opblock .opblock-summary .view-line-link{cursor:pointer;margin:0;position:relative;top:2px;transition:all .5s;width:0}.swagger-ui .opblock .opblock-summary:hover .view-line-link{margin:0 5px;width:18px}.swagger-ui .opblock.opblock-post{background:#49cc901a;border-color:#49cc90}.swagger-ui .opblock.opblock-post .opblock-summary-method{background:#49cc90}.swagger-ui .opblock.opblock-post .opblock-summary{border-color:#49cc90}.swagger-ui .opblock.opblock-post .tab-header .tab-item.active h4 span:after{background:#49cc90}.swagger-ui .opblock.opblock-put{background:#fca1301a;border-color:#fca130}.swagger-ui .opblock.opblock-put .opblock-summary-method{background:#fca130}.swagger-ui .opblock.opblock-put .opblock-summary{border-color:#fca130}.swagger-ui .opblock.opblock-put .tab-header .tab-item.active h4 span:after{background:#fca130}.swagger-ui .opblock.opblock-delete{background:#f93e3e1a;border-color:#f93e3e}.swagger-ui .opblock.opblock-delete .opblock-summary-method{background:#f93e3e}.swagger-ui .opblock.opblock-delete .opblock-summary{border-color:#f93e3e}.swagger-ui .opblock.opblock-delete .tab-header .tab-item.active h4 span:after{background:#f93e3e}.swagger-ui .opblock.opblock-get{background:#61affe1a;border-color:#61affe}.swagger-ui .opblock.opblock-get .opblock-summary-method{background:#61affe}.swagger-ui .opblock.opblock-get .opblock-summary{border-color:#61affe}.swagger-ui .opblock.opblock-get .tab-header .tab-item.active h4 span:after{background:#61affe}.swagger-ui .opblock.opblock-patch{background:#50e3c21a;border-color:#50e3c2}.swagger-ui .opblock.opblock-patch .opblock-summary-method{background:#50e3c2}.swagger-ui .opblock.opblock-patch .opblock-summary{border-color:#50e3c2}.swagger-ui .opblock.opblock-patch .tab-header .tab-item.active h4 span:after{background:#50e3c2}.swagger-ui .opblock.opblock-head{background:#9012fe1a;border-color:#9012fe}.swagger-ui .opblock.opblock-head .opblock-summary-method{background:#9012fe}.swagger-ui .opblock.opblock-head .opblock-summary{border-color:#9012fe}.swagger-ui .opblock.opblock-head .tab-header .tab-item.active h4 span:after{background:#9012fe}.swagger-ui .opblock.opblock-options{background:#0d5aa71a;border-color:#0d5aa7}.swagger-ui .opblock.opblock-options .opblock-summary-method{background:#0d5aa7}.swagger-ui .opblock.opblock-options .opblock-summary{border-color:#0d5aa7}.swagger-ui .opblock.opblock-options .tab-header .tab-item.active h4 span:after{background:#0d5aa7}.swagger-ui .opblock.opblock-deprecated{background:#ebebeb1a;border-color:#ebebeb;opacity:.6}.swagger-ui .opblock.opblock-deprecated .opblock-summary-method{background:#ebebeb}.swagger-ui .opblock.opblock-deprecated .opblock-summary{border-color:#ebebeb}.swagger-ui .opblock.opblock-deprecated .tab-header .tab-item.active h4 span:after{background:#ebebeb}.swagger-ui .opblock .opblock-schemes{padding:8px 20px}.swagger-ui .opblock .opblock-schemes .schemes-title{padding:0 10px 0 0}.swagger-ui .filter .operation-filter-input{border:2px solid #d8dde7;margin:20px 0;padding:10px;width:100%}.swagger-ui .download-url-wrapper .failed,.swagger-ui .filter .failed{color:red}.swagger-ui .download-url-wrapper .loading,.swagger-ui .filter .loading{color:#aaa}.swagger-ui .model-example{margin-top:1em}.swagger-ui .tab{display:flex;list-style:none;padding:0}.swagger-ui .tab li{color:#3b4151;cursor:pointer;font-family:sans-serif;font-size:12px;min-width:60px;padding:0}.swagger-ui .tab li:first-of-type{padding-left:0;padding-right:12px;position:relative}.swagger-ui .tab li:first-of-type:after{background:#0003;content:"";height:100%;position:absolute;right:6px;top:0;width:1px}.swagger-ui .tab li.active{font-weight:700}.swagger-ui .tab li button.tablinks{background:none;border:0;color:inherit;font-family:inherit;font-weight:inherit;padding:0}.swagger-ui .opblock-description-wrapper,.swagger-ui .opblock-external-docs-wrapper,.swagger-ui .opblock-title_normal{color:#3b4151;font-family:sans-serif;font-size:12px;margin:0 0 5px;padding:15px 20px}.swagger-ui .opblock-description-wrapper h4,.swagger-ui .opblock-external-docs-wrapper h4,.swagger-ui .opblock-title_normal h4{color:#3b4151;font-family:sans-serif;font-size:12px;margin:0 0 5px}.swagger-ui .opblock-description-wrapper p,.swagger-ui .opblock-external-docs-wrapper p,.swagger-ui .opblock-title_normal p{color:#3b4151;font-family:sans-serif;font-size:14px;margin:0}.swagger-ui .opblock-external-docs-wrapper h4{padding-left:0}.swagger-ui .execute-wrapper{padding:20px;text-align:right}.swagger-ui .execute-wrapper .btn{padding:8px 40px;width:100%}.swagger-ui .body-param-options{display:flex;flex-direction:column}.swagger-ui .body-param-options .body-param-edit{padding:10px 0}.swagger-ui .body-param-options label{padding:8px 0}.swagger-ui .body-param-options label select{margin:3px 0 0}.swagger-ui .responses-inner{padding:20px}.swagger-ui .responses-inner h4,.swagger-ui .responses-inner h5{color:#3b4151;font-family:sans-serif;font-size:12px;margin:10px 0 5px}.swagger-ui .responses-inner .curl{white-space:normal}.swagger-ui .response-col_status{color:#3b4151;font-family:sans-serif;font-size:14px}.swagger-ui .response-col_status .response-undocumented{color:#909090;font-family:monospace;font-size:11px;font-weight:600}.swagger-ui .response-col_links{color:#3b4151;font-family:sans-serif;font-size:14px;max-width:40em;padding-left:2em}.swagger-ui .response-col_links .response-undocumented{color:#909090;font-family:monospace;font-size:11px;font-weight:600}.swagger-ui .response-col_links .operation-link{margin-bottom:1.5em}.swagger-ui .response-col_links .operation-link .description{margin-bottom:.5em}.swagger-ui .opblock-body .opblock-loading-animation{display:block;margin:3em auto}.swagger-ui .opblock-body pre.microlight{word-wrap:break-word;background:#333;border-radius:4px;color:#fff;font-family:monospace;font-size:12px;font-weight:600;hyphens:auto;margin:0;padding:10px;white-space:pre-wrap;word-break:break-all;word-break:break-word}.swagger-ui .opblock-body pre.microlight .headerline{display:block}.swagger-ui .highlight-code{position:relative}.swagger-ui .highlight-code>.microlight{max-height:400px;min-height:6em;overflow-y:auto}.swagger-ui .highlight-code>.microlight code{white-space:pre-wrap!important;word-break:break-all}.swagger-ui .curl-command{position:relative}.swagger-ui .download-contents{align-items:center;background:#7d8293;border-radius:4px;bottom:10px;color:#fff;cursor:pointer;display:flex;font-family:sans-serif;font-size:14px;font-weight:600;height:30px;justify-content:center;padding:5px;position:absolute;right:10px;text-align:center}.swagger-ui .scheme-container{background:#fff;box-shadow:0 1px 2px 0 #00000026;margin:0 0 20px;padding:30px 0}.swagger-ui .scheme-container .schemes{align-items:flex-end;display:flex}.swagger-ui .scheme-container .schemes>label{color:#3b4151;display:flex;flex-direction:column;font-family:sans-serif;font-size:12px;font-weight:700;margin:-20px 15px 0 0}.swagger-ui .scheme-container .schemes>label select{min-width:130px;text-transform:uppercase}.swagger-ui .loading-container{align-items:center;display:flex;flex-direction:column;justify-content:center;margin-top:1em;min-height:1px;padding:40px 0 60px}.swagger-ui .loading-container .loading{position:relative}.swagger-ui .loading-container .loading:after{color:#3b4151;content:"loading";font-family:sans-serif;font-size:10px;font-weight:700;left:50%;position:absolute;text-transform:uppercase;top:50%;transform:translate(-50%,-50%)}.swagger-ui .loading-container .loading:before{animation:rotation 1s linear infinite,opacity .5s;backface-visibility:hidden;border-radius:100%;border:2px solid #5555551a;border-top-color:#0009;content:"";display:block;height:60px;left:50%;margin:-30px;opacity:1;position:absolute;top:50%;width:60px}@keyframes rotation{to{transform:rotate(1turn)}}.swagger-ui .response-controls{display:flex;padding-top:1em}.swagger-ui .response-control-media-type{margin-right:1em}.swagger-ui .response-control-media-type--accept-controller select{border-color:green}.swagger-ui .response-control-media-type__accept-message{color:green;font-size:.7em}.swagger-ui .response-control-examples__title,.swagger-ui .response-control-media-type__title{display:block;font-size:.7em;margin-bottom:.2em}@keyframes blinker{50%{opacity:0}}.swagger-ui .hidden{display:none}.swagger-ui .no-margin{border:none;height:auto;margin:0;padding:0}.swagger-ui .float-right{float:right}.swagger-ui .svg-assets{height:0;position:absolute;width:0}.swagger-ui section h3{color:#3b4151;font-family:sans-serif}.swagger-ui a.nostyle{display:inline}.swagger-ui a.nostyle,.swagger-ui a.nostyle:visited{color:inherit;cursor:pointer;text-decoration:inherit}.swagger-ui .fallback{color:#aaa;padding:1em}.swagger-ui .version-pragma{height:100%;padding:5em 0}.swagger-ui .version-pragma__message{display:flex;font-size:1.2em;height:100%;justify-content:center;line-height:1.5em;padding:0 .6em;text-align:center}.swagger-ui .version-pragma__message>div{flex:1;max-width:55ch}.swagger-ui .version-pragma__message code{background-color:#dedede;padding:4px 4px 2px;white-space:pre}.swagger-ui .opblock-link{font-weight:400}.swagger-ui .opblock-link.shown{font-weight:700}.swagger-ui span.token-string{color:#555}.swagger-ui span.token-not-formatted{color:#555;font-weight:700}.swagger-ui .btn{background:#0000;border:2px solid gray;border-radius:4px;box-shadow:0 1px 2px #0000001a;color:#3b4151;font-family:sans-serif;font-size:14px;font-weight:700;padding:5px 23px;transition:all .3s}.swagger-ui .btn.btn-sm{font-size:12px;padding:4px 23px}.swagger-ui .btn[disabled]{cursor:not-allowed;opacity:.3}.swagger-ui .btn:hover{box-shadow:0 0 5px #0000004d}.swagger-ui .btn.cancel{background-color:initial;border-color:#ff6060;color:#ff6060;font-family:sans-serif}.swagger-ui .btn.authorize{background-color:initial;border-color:#49cc90;color:#49cc90;display:inline;line-height:1}.swagger-ui .btn.authorize span{float:left;padding:4px 20px 0 0}.swagger-ui .btn.authorize svg{fill:#49cc90}.swagger-ui .btn.execute{background-color:#4990e2;border-color:#4990e2;color:#fff}.swagger-ui .btn-group{display:flex;padding:30px}.swagger-ui .btn-group .btn{flex:1}.swagger-ui .btn-group .btn:first-child{border-radius:4px 0 0 4px}.swagger-ui .btn-group .btn:last-child{border-radius:0 4px 4px 0}.swagger-ui .authorization__btn{background:none;border:none;padding:0 0 0 10px}.swagger-ui .authorization__btn.locked{opacity:1}.swagger-ui .authorization__btn.unlocked{opacity:.4}.swagger-ui .model-box-control,.swagger-ui .models-control,.swagger-ui .opblock-summary-control{all:inherit;border-bottom:0;cursor:pointer;flex:1;padding:0}.swagger-ui .model-box-control:focus,.swagger-ui .models-control:focus,.swagger-ui .opblock-summary-control:focus{outline:auto}.swagger-ui .expand-methods,.swagger-ui .expand-operation{background:none;border:none}.swagger-ui .expand-methods svg,.swagger-ui .expand-operation svg{height:20px;width:20px}.swagger-ui .expand-methods{padding:0 10px}.swagger-ui .expand-methods:hover svg{fill:#404040}.swagger-ui .expand-methods svg{fill:#707070;transition:all .3s}.swagger-ui button{cursor:pointer}.swagger-ui button.invalid{animation:shake .4s 1;background:#feebeb;border-color:#f93e3e}.swagger-ui .copy-to-clipboard{align-items:center;background:#7d8293;border:none;border-radius:4px;bottom:10px;display:flex;height:30px;justify-content:center;position:absolute;right:100px;width:30px}.swagger-ui .copy-to-clipboard button{background:url('data:image/svg+xml;charset=utf-8,<svg xmlns="http://www.w3.org/2000/svg" width="16" height="15" aria-hidden="true"><path fill="%23fff" fill-rule="evenodd" d="M4 12h4v1H4v-1zm5-6H4v1h5V6zm2 3V7l-3 3 3 3v-2h5V9h-5zM6.5 8H4v1h2.5V8zM4 11h2.5v-1H4v1zm9 1h1v2c-.02.28-.11.52-.3.7-.19.18-.42.28-.7.3H3c-.55 0-1-.45-1-1V3c0-.55.45-1 1-1h3c0-1.11.89-2 2-2 1.11 0 2 .89 2 2h3c.55 0 1 .45 1 1v5h-1V5H3v9h10v-2zM4 4h8c0-.55-.45-1-1-1h-1c-.55 0-1-.45-1-1s-.45-1-1-1-1 .45-1 1-.45 1-1 1H5c-.55 0-1 .45-1 1z"/></svg>') 50% no-repeat;border:none;flex-grow:1;flex-shrink:1;height:25px}.swagger-ui .curl-command .copy-to-clipboard{bottom:5px;height:20px;right:10px;width:20px}.swagger-ui .curl-command .copy-to-clipboard button{height:18px}.swagger-ui select{appearance:none;background:#f7f7f7 url('data:image/svg+xml;charset=utf-8,<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 20 20"><path d="M13.418 7.859a.695.695 0 0 1 .978 0 .68.68 0 0 1 0 .969l-3.908 3.83a.697.697 0 0 1-.979 0l-3.908-3.83a.68.68 0 0 1 0-.969.695.695 0 0 1 .978 0L10 11l3.418-3.141z"/></svg>') right 10px center no-repeat;background-size:20px;border:2px solid #41444e;border-radius:4px;box-shadow:0 1px 2px 0 #00000040;color:#3b4151;font-family:sans-serif;font-size:14px;font-weight:700;padding:5px 40px 5px 10px}.swagger-ui select[multiple]{background:#f7f7f7;margin:5px 0;padding:5px}.swagger-ui select.invalid{animation:shake .4s 1;background:#feebeb;border-color:#f93e3e}.swagger-ui .opblock-body select{min-width:230px}@media (max-width:768px){.swagger-ui .opblock-body select{min-width:180px}}.swagger-ui label{color:#3b4151;font-family:sans-serif;font-size:12px;font-weight:700;margin:0 0 5px}@media (max-width:768px){.swagger-ui input[type=email],.swagger-ui input[type=file],.swagger-ui input[type=password],.swagger-ui input[type=search],.swagger-ui input[type=text]{max-width:175px}}.swagger-ui input[type=email],.swagger-ui input[type=file],.swagger-ui input[type=password],.swagger-ui input[type=search],.swagger-ui input[type=text],.swagger-ui textarea{background:#fff;border:1px solid #d9d9d9;border-radius:4px;margin:5px 0;min-width:100px;padding:8px 10px}.swagger-ui input[type=email].invalid,.swagger-ui input[type=file].invalid,.swagger-ui input[type=password].invalid,.swagger-ui input[type=search].invalid,.swagger-ui input[type=text].invalid,.swagger-ui textarea.invalid{animation:shake .4s 1;background:#feebeb;border-color:#f93e3e}.swagger-ui input[disabled],.swagger-ui select[disabled],.swagger-ui textarea[disabled]{background-color:#fafafa;color:#888;cursor:not-allowed}.swagger-ui select[disabled]{border-color:#888}.swagger-ui textarea[disabled]{background-color:#41444e;color:#fff}@keyframes shake{10%,90%{transform:translate3d(-1px,0,0)}20%,80%{transform:translate3d(2px,0,0)}30%,50%,70%{transform:translate3d(-4px,0,0)}40%,60%{transform:translate3d(4px,0,0)}}.swagger-ui textarea{background:#fffc;border:none;border-radius:4px;color:#3b4151;font-family:monospace;font-size:12px;font-weight:600;min-height:280px;outline:none;padding:10px;width:100%}.swagger-ui textarea:focus{border:2px solid #61affe}.swagger-ui textarea.curl{background:#41444e;border-radius:4px;color:#fff;font-family:monospace;font-size:12px;font-weight:600;margin:0;min-height:100px;padding:10px;resize:none}.swagger-ui .checkbox{color:#303030;padding:5px 0 10px;transition:opacity .5s}.swagger-ui .checkbox label{display:flex}.swagger-ui .checkbox p{color:#3b4151;font-family:monospace;font-style:italic;font-weight:400!important;font-weight:600;margin:0!important}.swagger-ui .checkbox input[type=checkbox]{display:none}.swagger-ui .checkbox input[type=checkbox]+label>.item{background:#e8e8e8;border-radius:1px;box-shadow:0 0 0 2px #e8e8e8;cursor:pointer;display:inline-block;flex:none;height:16px;margin:0 8px 0 0;padding:5px;position:relative;top:3px;width:16px}.swagger-ui .checkbox input[type=checkbox]+label>.item:active{transform:scale(.9)}.swagger-ui .checkbox input[type=checkbox]:checked+label>.item{background:#e8e8e8 url('data:image/svg+xml;charset=utf-8,<svg width="10" height="8" viewBox="3 7 10 8" xmlns="http://www.w3.org/2000/svg"><path fill="%2341474E" fill-rule="evenodd" d="M6.333 15 3 11.667l1.333-1.334 2 2L11.667 7 13 8.333z"/></svg>') 50% no-repeat}.swagger-ui .dialog-ux{bottom:0;left:0;position:fixed;right:0;top:0;z-index:9999}.swagger-ui .dialog-ux .backdrop-ux{background:#000c;bottom:0;left:0;position:fixed;right:0;top:0}.swagger-ui .dialog-ux .modal-ux{background:#fff;border:1px solid #ebebeb;border-radius:4px;box-shadow:0 10px 30px 0 #0003;left:50%;max-width:650px;min-width:300px;position:absolute;top:50%;transform:translate(-50%,-50%);width:100%;z-index:9999}.swagger-ui .dialog-ux .modal-ux-content{max-height:540px;overflow-y:auto;padding:20px}.swagger-ui .dialog-ux .modal-ux-content p{color:#41444e;color:#3b4151;font-family:sans-serif;font-size:12px;margin:0 0 5px}.swagger-ui .dialog-ux .modal-ux-content h4{color:#3b4151;font-family:sans-serif;font-size:18px;font-weight:600;margin:15px 0 0}.swagger-ui .dialog-ux .modal-ux-header{align-items:center;border-bottom:1px solid #ebebeb;display:flex;padding:12px 0}.swagger-ui .dialog-ux .modal-ux-header .close-modal{appearance:none;background:none;border:none;padding:0 10px}.swagger-ui .dialog-ux .modal-ux-header h3{color:#3b4151;flex:1;font-family:sans-serif;font-size:20px;font-weight:600;margin:0;padding:0 20px}.swagger-ui .model{color:#3b4151;font-family:monospace;font-size:12px;font-weight:300;font-weight:600}.swagger-ui .model .deprecated span,.swagger-ui .model .deprecated td{color:#a0a0a0!important}.swagger-ui .model .deprecated>td:first-of-type{text-decoration:line-through}.swagger-ui .model-toggle{cursor:pointer;display:inline-block;font-size:10px;margin:auto .3em;position:relative;top:6px;transform:rotate(90deg);transform-origin:50% 50%;transition:transform .15s ease-in}.swagger-ui .model-toggle.collapsed{transform:rotate(0deg)}.swagger-ui .model-toggle:after{background:url('data:image/svg+xml;charset=utf-8,<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24"><path d="M10 6 8.59 7.41 13.17 12l-4.58 4.59L10 18l6-6z"/></svg>') 50% no-repeat;background-size:100%;content:"";display:block;height:20px;width:20px}.swagger-ui .model-jump-to-path{cursor:pointer;position:relative}.swagger-ui .model-jump-to-path .view-line-link{cursor:pointer;position:absolute;top:-.4em}.swagger-ui .model-title{position:relative}.swagger-ui .model-title:hover .model-hint{visibility:visible}.swagger-ui .model-hint{background:#000000b3;border-radius:4px;color:#ebebeb;padding:.1em .5em;position:absolute;top:-1.8em;visibility:hidden;white-space:nowrap}.swagger-ui .model p{margin:0 0 1em}.swagger-ui .model .property{color:#999;font-style:italic}.swagger-ui .model .property.primitive{color:#6b6b6b}.swagger-ui table.model tr.description{color:#666;font-weight:400}.swagger-ui table.model tr.description td:first-child,.swagger-ui table.model tr.property-row.required td:first-child{font-weight:700}.swagger-ui table.model tr.property-row td{vertical-align:top}.swagger-ui table.model tr.property-row td:first-child{padding-right:.2em}.swagger-ui table.model tr.property-row .star{color:red}.swagger-ui table.model tr.extension{color:#777}.swagger-ui table.model tr.extension td:last-child{vertical-align:top}.swagger-ui section.models{border:1px solid #3b41514d;border-radius:4px;margin:30px 0}.swagger-ui section.models .pointer{cursor:pointer}.swagger-ui section.models.is-open{padding:0 0 20px}.swagger-ui section.models.is-open h4{border-bottom:1px solid #3b41514d;margin:0 0 5px}.swagger-ui section.models h4{align-items:center;color:#606060;cursor:pointer;display:flex;font-family:sans-serif;font-size:16px;margin:0;padding:10px 20px 10px 10px;transition:all .2s}.swagger-ui section.models h4 svg{transition:all .4s}.swagger-ui section.models h4 span{flex:1}.swagger-ui section.models h4:hover{background:#00000005}.swagger-ui section.models h5{color:#707070;font-family:sans-serif;font-size:16px;margin:0 0 10px}.swagger-ui section.models .model-jump-to-path{position:relative;top:5px}.swagger-ui section.models .model-container{background:#0000000d;border-radius:4px;margin:0 20px 15px;position:relative;transition:all .5s}.swagger-ui section.models .model-container:hover{background:#00000012}.swagger-ui section.models .model-container:first-of-type{margin:20px}.swagger-ui section.models .model-container:last-of-type{margin:0 20px}.swagger-ui section.models .model-container .models-jump-to-path{opacity:.65;position:absolute;right:5px;top:8px}.swagger-ui section.models .model-box{background:none}.swagger-ui .model-box{background:#0000001a;border-radius:4px;display:inline-block;padding:10px}.swagger-ui .model-box .model-jump-to-path{position:relative;top:4px}.swagger-ui .model-box.deprecated{opacity:.5}.swagger-ui .model-title{color:#505050;font-family:sans-serif;font-size:16px}.swagger-ui .model-title img{bottom:0;margin-left:1em;position:relative}.swagger-ui .model-deprecated-warning{color:#f93e3e;font-family:sans-serif;font-size:16px;font-weight:600;margin-right:1em}.swagger-ui span>span.model .brace-close{padding:0 0 0 10px}.swagger-ui .prop-name{display:inline-block;margin-right:1em}.swagger-ui .prop-type{color:#55a}.swagger-ui .prop-enum{display:block}.swagger-ui .prop-format{color:#606060}.swagger-ui .servers>label{color:#3b4151;font-family:sans-serif;font-size:12px;margin:-20px 15px 0 0}.swagger-ui .servers>label select{max-width:100%;min-width:130px}.swagger-ui .servers h4.message{padding-bottom:2em}.swagger-ui .servers table tr{width:30em}.swagger-ui .servers table td{display:inline-block;max-width:15em;padding-bottom:10px;padding-top:10px;vertical-align:middle}.swagger-ui .servers table td:first-of-type{padding-right:1em}.swagger-ui .servers table td input{height:100%;width:100%}.swagger-ui .servers .computed-url{margin:2em 0}.swagger-ui .servers .computed-url code{display:inline-block;font-size:16px;margin:0 1em;padding:4px}.swagger-ui .servers-title{font-size:12px;font-weight:700}.swagger-ui .operation-servers h4.message{margin-bottom:2em}.swagger-ui table{border-collapse:collapse;padding:0 10px;width:100%}.swagger-ui table.model tbody tr td{padding:0;vertical-align:top}.swagger-ui table.model tbody tr td:first-of-type{padding:0 0 0 2em;width:174px}.swagger-ui table.headers td{color:#3b4151;font-family:monospace;font-size:12px;font-weight:300;font-weight:600;vertical-align:middle}.swagger-ui table.headers .header-example{color:#999;font-style:italic}.swagger-ui table tbody tr td{padding:10px 0 0;vertical-align:top}.swagger-ui table tbody tr td:first-of-type{min-width:6em;padding:10px 0}.swagger-ui table thead tr td,.swagger-ui table thead tr th{border-bottom:1px solid #3b415133;color:#3b4151;font-family:sans-serif;font-size:12px;font-weight:700;padding:12px 0;text-align:left}.swagger-ui .parameters-col_description{margin-bottom:2em;width:99%}.swagger-ui .parameters-col_description input[type=text]{max-width:340px;width:100%}.swagger-ui .parameters-col_description select{border-width:1px}.swagger-ui .parameter__name{color:#3b4151;font-family:sans-serif;font-size:16px;font-weight:400;margin-right:.75em}.swagger-ui .parameter__name.required{font-weight:700}.swagger-ui .parameter__name.required span{color:red}.swagger-ui .parameter__name.required:after{color:#f009;content:"required";font-size:10px;padding:5px;position:relative;top:-6px}.swagger-ui .parameter__extension,.swagger-ui .parameter__in{color:gray;font-family:monospace;font-size:12px;font-style:italic;font-weight:600}.swagger-ui .parameter__deprecated{color:red;font-family:monospace;font-size:12px;font-style:italic;font-weight:600}.swagger-ui .parameter__empty_value_toggle{display:block;font-size:13px;padding-bottom:12px;padding-top:5px}.swagger-ui .parameter__empty_value_toggle input{margin-right:7px}.swagger-ui .parameter__empty_value_toggle.disabled{opacity:.7}.swagger-ui .table-container{padding:20px}.swagger-ui .response-col_description{width:99%}.swagger-ui .response-col_links{min-width:6em}.swagger-ui .response__extension{color:gray;font-family:monospace;font-size:12px;font-style:italic;font-weight:600}.swagger-ui .topbar{background-color:#1b1b1b;padding:10px 0}.swagger-ui .topbar .topbar-wrapper,.swagger-ui .topbar a{align-items:center;display:flex}.swagger-ui .topbar a{color:#fff;flex:1;font-family:sans-serif;font-size:1.5em;font-weight:700;max-width:300px;text-decoration:none}.swagger-ui .topbar a span{margin:0;padding:0 10px}.swagger-ui .topbar .download-url-wrapper{display:flex;flex:3;justify-content:flex-end}.swagger-ui .topbar .download-url-wrapper input[type=text]{border:2px solid #62a03f;border-radius:4px 0 0 4px;margin:0;outline:none;width:100%}.swagger-ui .topbar .download-url-wrapper .select-label{align-items:center;color:#f0f0f0;display:flex;margin:0;max-width:600px;width:100%}.swagger-ui .topbar .download-url-wrapper .select-label span{flex:1;font-size:16px;padding:0 10px 0 0;text-align:right}.swagger-ui .topbar .download-url-wrapper .select-label select{border:2px solid #62a03f;box-shadow:none;flex:2;outline:none;width:100%}.swagger-ui .topbar .download-url-wrapper .download-url-button{background:#62a03f;border:none;border-radius:0 4px 4px 0;color:#fff;font-family:sans-serif;font-size:16px;font-weight:700;padding:4px 30px}.swagger-ui .info{margin:50px 0}.swagger-ui .info.failed-config{margin-left:auto;margin-right:auto;max-width:880px;text-align:center}.swagger-ui .info hgroup.main{margin:0 0 20px}.swagger-ui .info hgroup.main a{font-size:12px}.swagger-ui .info pre{font-size:14px}.swagger-ui .info li,.swagger-ui .info p,.swagger-ui .info table{color:#3b4151;font-family:sans-serif;font-size:14px}.swagger-ui .info h1,.swagger-ui .info h2,.swagger-ui .info h3,.swagger-ui .info h4,.swagger-ui .info h5{color:#3b4151;font-family:sans-serif}.swagger-ui .info a{color:#4990e2;font-family:sans-serif;font-size:14px;transition:all .4s}.swagger-ui .info a:hover{color:#1f69c0}.swagger-ui .info>div{margin:0 0 5px}.swagger-ui .info .base-url{color:#3b4151;font-family:monospace;font-size:12px;font-weight:300!important;font-weight:600;margin:0}.swagger-ui .info .title{color:#3b4151;font-family:sans-serif;font-size:36px;margin:0}.swagger-ui .info .title small{background:#7d8492;border-radius:57px;display:inline-block;font-size:10px;margin:0 0 0 5px;padding:2px 4px;position:relative;top:-5px;vertical-align:super}.swagger-ui .info .title small.version-stamp{background-color:#89bf04}.swagger-ui .info .title small pre{color:#fff;font-family:sans-serif;margin:0;padding:0}.swagger-ui .auth-btn-wrapper{display:flex;justify-content:center;padding:10px 0}.swagger-ui .auth-btn-wrapper .btn-done{margin-right:1em}.swagger-ui .auth-wrapper{display:flex;flex:1;justify-content:flex-end}.swagger-ui .auth-wrapper .authorize{margin-right:10px;padding-right:20px}.swagger-ui .auth-container{border-bottom:1px solid #ebebeb;margin:0 0 10px;padding:10px 20px}.swagger-ui .auth-container:last-of-type{border:0;margin:0;padding:10px 20px}.swagger-ui .auth-container h4{margin:5px 0 15px!important}.swagger-ui .auth-container .wrapper{margin:0;padding:0}.swagger-ui .auth-container input[type=password],.swagger-ui .auth-container input[type=text]{min-width:230px}.swagger-ui .auth-container .errors{background-color:#fee;border-radius:4px;color:red;color:#3b4151;font-family:monospace;font-size:12px;font-weight:600;margin:1em;padding:10px}.swagger-ui .auth-container .errors b{margin-right:1em;text-transform:capitalize}.swagger-ui .scopes h2{color:#3b4151;font-family:sans-serif;font-size:14px}.swagger-ui .scopes h2 a{color:#4990e2;cursor:pointer;font-size:12px;padding-left:10px;text-decoration:underline}.swagger-ui .scope-def{padding:0 0 20px}.swagger-ui .errors-wrapper{animation:scaleUp .5s;background:#f93e3e1a;border:2px solid #f93e3e;border-radius:4px;margin:20px;padding:10px 20px}.swagger-ui .errors-wrapper .error-wrapper{margin:0 0 10px}.swagger-ui .errors-wrapper .errors h4{color:#3b4151;font-family:monospace;font-size:14px;font-weight:600;margin:0}.swagger-ui .errors-wrapper .errors small{color:#606060}.swagger-ui .errors-wrapper .errors .message{white-space:pre-line}.swagger-ui .errors-wrapper .errors .message.thrown{max-width:100%}.swagger-ui .errors-wrapper .errors .error-line{cursor:pointer;text-decoration:underline}.swagger-ui .errors-wrapper hgroup{align-items:center;display:flex}.swagger-ui .errors-wrapper hgroup h4{color:#3b4151;flex:1;font-family:sans-serif;font-size:20px;margin:0}@keyframes scaleUp{0%{opacity:0;transform:scale(.8)}to{opacity:1;transform:scale(1)}}.swagger-ui .Resizer.vertical.disabled{display:none}.swagger-ui .markdown p,.swagger-ui .markdown pre,.swagger-ui .renderedMarkdown p,.swagger-ui .renderedMarkdown pre{margin:1em auto;word-break:break-all;word-break:break-word}.swagger-ui .markdown pre,.swagger-ui .renderedMarkdown pre{background:none;color:#000;font-weight:400;padding:0;white-space:pre-wrap}.swagger-ui .markdown code,.swagger-ui .renderedMarkdown code{background:#0000000d;border-radius:4px;color:#9012fe;font-family:monospace;font-size:14px;font-weight:600;padding:5px 7px}.swagger-ui .markdown pre>code,.swagger-ui .renderedMarkdown pre>code{display:block}.toast-center-center{top:50%;left:50%;transform:translate(-50%,-50%)}.toast-top-center{top:0;right:0;width:100%}.toast-bottom-center{bottom:0;right:0;width:100%}.toast-top-full-width{top:0;right:0;width:100%}.toast-bottom-full-width{bottom:0;right:0;width:100%}.toast-top-left{top:12px;left:12px}.toast-top-right{top:12px;right:12px}.toast-bottom-right{right:12px;bottom:12px}.toast-bottom-left{bottom:12px;left:12px}.toast-title{font-weight:700}.toast-message{word-wrap:break-word}.toast-message a,.toast-message label{color:#fff}.toast-message a:hover{color:#ccc;text-decoration:none}.toast-close-button{position:relative;right:-.3em;top:-.3em;float:right;font-size:20px;font-weight:700;color:#fff;text-shadow:0 1px 0 #fff}.toast-close-button:focus,.toast-close-button:hover{color:#000;text-decoration:none;cursor:pointer;opacity:.4}button.toast-close-button{padding:0;cursor:pointer;background:#0000;border:0}.toast-container{pointer-events:none;position:fixed;z-index:999999}.toast-container *{box-sizing:border-box}.toast-container .ngx-toastr{position:relative;overflow:hidden;margin:0 0 6px;padding:15px 15px 15px 50px;width:300px;border-radius:3px 3px 3px 3px;background-position:15px;background-repeat:no-repeat;background-size:24px;box-shadow:0 0 12px #999;color:#fff}.toast-container .ngx-toastr:hover{box-shadow:0 0 12px #000;opacity:1;cursor:pointer}.toast-info{background-image:url("data:image/svg+xml;base64,PHN2ZyB4bWxucz0naHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmcnIHZpZXdCb3g9JzAgMCA1MTIgNTEyJyB3aWR0aD0nNTEyJyBoZWlnaHQ9JzUxMic+PHBhdGggZmlsbD0ncmdiKDI1NSwyNTUsMjU1KScgZD0nTTI1NiA4QzExOS4wNDMgOCA4IDExOS4wODMgOCAyNTZjMCAxMzYuOTk3IDExMS4wNDMgMjQ4IDI0OCAyNDhzMjQ4LTExMS4wMDMgMjQ4LTI0OEM1MDQgMTE5LjA4MyAzOTIuOTU3IDggMjU2IDh6bTAgMTEwYzIzLjE5NiAwIDQyIDE4LjgwNCA0MiA0MnMtMTguODA0IDQyLTQyIDQyLTQyLTE4LjgwNC00Mi00MiAxOC44MDQtNDIgNDItNDJ6bTU2IDI1NGMwIDYuNjI3LTUuMzczIDEyLTEyIDEyaC04OGMtNi42MjcgMC0xMi01LjM3My0xMi0xMnYtMjRjMC02LjYyNyA1LjM3My0xMiAxMi0xMmgxMnYtNjRoLTEyYy02LjYyNyAwLTEyLTUuMzczLTEyLTEydi0yNGMwLTYuNjI3IDUuMzczLTEyIDEyLTEyaDY0YzYuNjI3IDAgMTIgNS4zNzMgMTIgMTJ2MTAwaDEyYzYuNjI3IDAgMTIgNS4zNzMgMTIgMTJ2MjR6Jy8+PC9zdmc+")}.toast-error{background-image:url("data:image/svg+xml;base64,PHN2ZyB4bWxucz0naHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmcnIHZpZXdCb3g9JzAgMCA1MTIgNTEyJyB3aWR0aD0nNTEyJyBoZWlnaHQ9JzUxMic+PHBhdGggZmlsbD0ncmdiKDI1NSwyNTUsMjU1KScgZD0nTTI1NiA4QzExOSA4IDggMTE5IDggMjU2czExMSAyNDggMjQ4IDI0OCAyNDgtMTExIDI0OC0yNDhTMzkzIDggMjU2IDh6bTEyMS42IDMxMy4xYzQuNyA0LjcgNC43IDEyLjMgMCAxN0wzMzggMzc3LjZjLTQuNyA0LjctMTIuMyA0LjctMTcgMEwyNTYgMzEybC02NS4xIDY1LjZjLTQuNyA0LjctMTIuMyA0LjctMTcgMEwxMzQuNCAzMzhjLTQuNy00LjctNC43LTEyLjMgMC0xN2w2NS42LTY1LTY1LjYtNjUuMWMtNC43LTQuNy00LjctMTIuMyAwLTE3bDM5LjYtMzkuNmM0LjctNC43IDEyLjMtNC43IDE3IDBsNjUgNjUuNyA2NS4xLTY1LjZjNC43LTQuNyAxMi4zLTQuNyAxNyAwbDM5LjYgMzkuNmM0LjcgNC43IDQuNyAxMi4zIDAgMTdMMzEyIDI1Nmw2NS42IDY1LjF6Jy8+PC9zdmc+")}.toast-success{background-image:url("data:image/svg+xml;base64,PHN2ZyB4bWxucz0naHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmcnIHZpZXdCb3g9JzAgMCA1MTIgNTEyJyB3aWR0aD0nNTEyJyBoZWlnaHQ9JzUxMic+PHBhdGggZmlsbD0ncmdiKDI1NSwyNTUsMjU1KScgZD0nTTE3My44OTggNDM5LjQwNGwtMTY2LjQtMTY2LjRjLTkuOTk3LTkuOTk3LTkuOTk3LTI2LjIwNiAwLTM2LjIwNGwzNi4yMDMtMzYuMjA0YzkuOTk3LTkuOTk4IDI2LjIwNy05Ljk5OCAzNi4yMDQgMEwxOTIgMzEyLjY5IDQzMi4wOTUgNzIuNTk2YzkuOTk3LTkuOTk3IDI2LjIwNy05Ljk5NyAzNi4yMDQgMGwzNi4yMDMgMzYuMjA0YzkuOTk3IDkuOTk3IDkuOTk3IDI2LjIwNiAwIDM2LjIwNGwtMjk0LjQgMjk0LjQwMWMtOS45OTggOS45OTctMjYuMjA3IDkuOTk3LTM2LjIwNC0uMDAxeicvPjwvc3ZnPg==")}.toast-warning{background-image:url("data:image/svg+xml;base64,PHN2ZyB4bWxucz0naHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmcnIHZpZXdCb3g9JzAgMCA1NzYgNTEyJyB3aWR0aD0nNTc2JyBoZWlnaHQ9JzUxMic+PHBhdGggZmlsbD0ncmdiKDI1NSwyNTUsMjU1KScgZD0nTTU2OS41MTcgNDQwLjAxM0M1ODcuOTc1IDQ3Mi4wMDcgNTY0LjgwNiA1MTIgNTI3Ljk0IDUxMkg0OC4wNTRjLTM2LjkzNyAwLTU5Ljk5OS00MC4wNTUtNDEuNTc3LTcxLjk4N0wyNDYuNDIzIDIzLjk4NWMxOC40NjctMzIuMDA5IDY0LjcyLTMxLjk1MSA4My4xNTQgMGwyMzkuOTQgNDE2LjAyOHpNMjg4IDM1NGMtMjUuNDA1IDAtNDYgMjAuNTk1LTQ2IDQ2czIwLjU5NSA0NiA0NiA0NiA0Ni0yMC41OTUgNDYtNDYtMjAuNTk1LTQ2LTQ2LTQ2em0tNDMuNjczLTE2NS4zNDZsNy40MTggMTM2Yy4zNDcgNi4zNjQgNS42MDkgMTEuMzQ2IDExLjk4MiAxMS4zNDZoNDguNTQ2YzYuMzczIDAgMTEuNjM1LTQuOTgyIDExLjk4Mi0xMS4zNDZsNy40MTgtMTM2Yy4zNzUtNi44NzQtNS4wOTgtMTIuNjU0LTExLjk4Mi0xMi42NTRoLTYzLjM4M2MtNi44ODQgMC0xMi4zNTYgNS43OC0xMS45ODEgMTIuNjU0eicvPjwvc3ZnPg==")}.toast-container.toast-bottom-center .ngx-toastr,.toast-container.toast-top-center .ngx-toastr{width:300px;margin-left:auto;margin-right:auto}.toast-container.toast-bottom-full-width .ngx-toastr,.toast-container.toast-top-full-width .ngx-toastr{width:96%;margin-left:auto;margin-right:auto}.ngx-toastr{background-color:#030303;pointer-events:auto}.toast-success{background-color:#51a351}.toast-error{background-color:#bd362f}.toast-info{background-color:#2f96b4}.toast-warning{background-color:#f89406}.toast-progress{position:absolute;left:0;bottom:0;height:4px;background-color:#000;opacity:.4}@media all and (max-width: 240px){.toast-container .ngx-toastr.div{padding:8px 8px 8px 50px;width:11em}.toast-container .toast-close-button{right:-.2em;top:-.2em}}@media all and (min-width: 241px) and (max-width: 480px){.toast-container .ngx-toastr.div{padding:8px 8px 8px 50px;width:18em}.toast-container .toast-close-button{right:-.2em;top:-.2em}}@media all and (min-width: 481px) and (max-width: 768px){.toast-container .ngx-toastr.div{padding:15px 15px 15px 50px;width:25em}}.tree-children.tree-children-no-padding{padding-left:0}.tree-children{overflow:hidden}.node-drop-slot{display:block;height:2px}.node-drop-slot.is-dragging-over{background:#dfe;height:20px;border:2px dotted #888}.toggle-children-wrapper-expanded .toggle-children{transform:rotate(90deg)}.toggle-children-wrapper-collapsed .toggle-children{transform:rotate(0)}.toggle-children-wrapper{padding:2px 3px 5px 1px}.toggle-children{background-image:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAASCAYAAABSO15qAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAABAhpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuNi1jMDY3IDc5LjE1Nzc0NywgMjAxNS8wMy8zMC0yMzo0MDo0MiAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wTU09Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9tbS8iIHhtbG5zOnN0UmVmPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvc1R5cGUvUmVzb3VyY2VSZWYjIiB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iIHhtbG5zOmRjPSJodHRwOi8vcHVybC5vcmcvZGMvZWxlbWVudHMvMS4xLyIgeG1wTU06T3JpZ2luYWxEb2N1bWVudElEPSJ1dWlkOjY1RTYzOTA2ODZDRjExREJBNkUyRDg4N0NFQUNCNDA3IiB4bXBNTTpEb2N1bWVudElEPSJ4bXAuZGlkOkYzRkRFQjcxODUzNTExRTU4RTQwRkQwODFEOUZEMEE3IiB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOkYzRkRFQjcwODUzNTExRTU4RTQwRkQwODFEOUZEMEE3IiB4bXA6Q3JlYXRvclRvb2w9IkFkb2JlIFBob3Rvc2hvcCBDQyAyMDE1IChNYWNpbnRvc2gpIj4gPHhtcE1NOkRlcml2ZWRGcm9tIHN0UmVmOmluc3RhbmNlSUQ9InhtcC5paWQ6MTk5NzA1OGEtZDI3OC00NDZkLWE4ODgtNGM4MGQ4YWI1NzNmIiBzdFJlZjpkb2N1bWVudElEPSJhZG9iZTpkb2NpZDpwaG90b3Nob3A6YzRkZmQxMGMtY2NlNS0xMTc4LWE5OGQtY2NkZmM5ODk5YWYwIi8+IDxkYzp0aXRsZT4gPHJkZjpBbHQ+IDxyZGY6bGkgeG1sOmxhbmc9IngtZGVmYXVsdCI+Z2x5cGhpY29uczwvcmRmOmxpPiA8L3JkZjpBbHQ+IDwvZGM6dGl0bGU+IDwvcmRmOkRlc2NyaXB0aW9uPiA8L3JkZjpSREY+IDwveDp4bXBtZXRhPiA8P3hwYWNrZXQgZW5kPSJyIj8+5iogFwAAAGhJREFUeNpiYGBgKABigf///zOQg0EARH4A4gZyDIIZ8B/JoAJKDIDhB0CcQIkBRBtEyABkgxwoMQCGD6AbRKoBGAYxQgXIBRuZGKgAKPIC3QLxArnRSHZCIjspk52ZKMrOFBUoAAEGAKnq593MQAZtAAAAAElFTkSuQmCC");height:8px;width:9px;background-size:contain;background-repeat:no-repeat;background-position:50%}.toggle-children,.toggle-children-placeholder{display:inline-block;position:relative;top:1px}.toggle-children-placeholder{height:10px;width:10px;padding-right:3px}.node-content-wrapper{display:inline-block;padding:2px 5px;border-radius:2px;transition:background-color .15s,box-shadow .15s}.node-wrapper{display:flex;align-items:flex-start}.node-content-wrapper-active,.node-content-wrapper-active.node-content-wrapper-focused,.node-content-wrapper.node-content-wrapper-active:hover{background:#beebff}.node-content-wrapper-focused{background:#e7f4f9}.node-content-wrapper:hover{background:#f7fbff}.node-content-wrapper-active,.node-content-wrapper-focused,.node-content-wrapper:hover{box-shadow:inset 0 0 1px #999}.node-content-wrapper.is-dragging-over{background:#dfe;box-shadow:inset 0 0 1px #999}.node-content-wrapper.is-dragging-over-disabled{opacity:.5}tree-viewport{-webkit-tap-highlight-color:transparent;height:100%;overflow:auto;display:block}.tree-children{padding-left:20px}.empty-tree-drop-slot .node-drop-slot{height:20px;min-width:100px}.angular-tree-component{width:100%;position:relative;display:inline-block;cursor:pointer;-webkit-touch-callout:none;user-select:none}tree-root .angular-tree-component-rtl{direction:rtl}tree-root .angular-tree-component-rtl .toggle-children-wrapper-collapsed .toggle-children{transform:rotate(180deg)!important}tree-root .angular-tree-component-rtl .tree-children{padding-right:20px;padding-left:0}tree-node-checkbox{padding:1px}:root{--gray-100:#f8f9fa;--gray-200:#e9ecef;--gray-300:#dee2e6;--gray-400:#ced4da;--gray-500:#adb5bd;--gray-600:#6c757d;--gray-700:#495057;--gray-800:#343a40;--gray-900:#212529;--black:#000;--barley-white:#fcecba;--fg-color-over-dark-bg:#fff;--fg-hover-color-over-dark-bg:#adb5bd;--body-color-bright:#f8f9fa;--body-bg:#fff;--body-color:#212529;--body-bg-alt:#e9ecef;--health-color-error:red;--health-color-healthy:#0b0;--health-color-warning:orange;--chart-color-red:#c9190b;--chart-color-blue:#06c;--chart-color-orange:#ef9234;--chart-color-yellow:#f6d173;--chart-color-green:#7cc674;--chart-color-gray:#ededed;--chart-color-cyan:#73c5c5;--chart-color-purple:#3c3d99;--chart-color-center-text:#151515;--chart-color-center-text-description:#72767b;--chart-color-tooltip-background:#000;--chart-danger:#c9190b;--card-cap-bg:#f8f9fa;--grid-gutter-width:30px;--datatable-divider-color:#00000017;--nav-tabs-margin-bottom:1rem;--tooltip-color:#fff;--tooltip-bg:#212529;--screen-sm-min:576px;--screen-md-min:768px;--screen-lg-min:992px;--screen-xl-min:1200px;--screen-xs-max:calc(576px - 1px);--screen-sm-max:calc(768px - 1px);--screen-md-max:calc(992px - 1px);--screen-lg-max:calc(1200px - 1px);--navbar-height:43px;--blue:#007bff;--indigo:#6610f2;--purple:#6f42c1;--pink:#a94442;--red:#ef5c55;--orange:#fd7e14;--yellow:#ffc200;--green:#0b0;--teal:#20c997;--cyan:#17a2b8;--white:#fff;--gray:#6c757d;--gray-dark:#343a40;--primary:#2b99a8;--secondary:#374249;--success:#0b0;--info:#2b99a8;--warning:#ffc200;--danger:#ef5c55;--light:#f8f9fa;--dark:#777;--accent:#ef5c55;--warning-dark:#fd7e14;--breakpoint-xs:0;--breakpoint-sm:576px;--breakpoint-md:768px;--breakpoint-lg:992px;--breakpoint-xl:1200px;--breakpoint-2xl:1450px;--font-family-sans-serif:"Helvetica Neue",Helvetica,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}
-/*!
- * Bootstrap v4.6.1 (https://getbootstrap.com/)
- * Copyright 2011-2021 The Bootstrap Authors
- * Copyright 2011-2021 Twitter, Inc.
- * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
- */*,:after,:before{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:Helvetica Neue,Helvetica,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.5;color:#212529;text-align:left;background-color:#fff}[tabindex="-1"]:focus:not(:focus-visible){outline:0!important}hr{box-sizing:initial;height:0;overflow:visible}h1,h2,h3,h4,h5,h6{margin-top:0;margin-bottom:.5rem}p{margin-top:0;margin-bottom:1rem}abbr[data-original-title],abbr[title]{text-decoration:underline;text-decoration:underline dotted;cursor:help;border-bottom:0;text-decoration-skip-ink:none}address{font-style:normal;line-height:inherit}address,dl,ol,ul{margin-bottom:1rem}dl,ol,ul{margin-top:0}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:initial}sub{bottom:-.25em}sup{top:-.5em}a{color:#2b99a8;text-decoration:none;background-color:initial}a:hover{color:#1b626b;text-decoration:underline}a:not([href]):not([class]),a:not([href]):not([class]):hover{color:inherit;text-decoration:none}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;-ms-overflow-style:scrollbar}figure{margin:0 0 1rem}img{border-style:none}img,svg{vertical-align:middle}svg{overflow:hidden}table{border-collapse:collapse}caption{padding-top:.75rem;padding-bottom:.75rem;color:#6c757d;text-align:left;caption-side:bottom}th{text-align:inherit;text-align:-webkit-match-parent}label{display:inline-block;margin-bottom:.5rem}button{border-radius:0}button:focus:not(:focus-visible){outline:0}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}[role=button]{cursor:pointer}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}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:initial}[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:.5rem;font-weight:500;line-height:1.2}.h1,h1{font-size:2.5rem}.h2,h2{font-size:2rem}.h3,h3{font-size:1.75rem}.h4,h4{font-size:1.5rem}.h5,h5{font-size:1.25rem}.h6,h6{font-size:1rem}.lead{font-size:1.25rem;font-weight:300}.display-1{font-size:6rem}.display-1,.display-2{font-weight:300;line-height:1.2}.display-2{font-size:5.5rem}.display-3{font-size:4.5rem}.display-3,.display-4{font-weight:300;line-height:1.2}.display-4{font-size:3.5rem}hr{margin-top:1rem;margin-bottom:1rem;border:0;border-top:1px solid #0000001a}.small,small{font-size:80%;font-weight:400}.mark,mark{padding:.2em;background-color:#fcf8e3}.list-inline,.list-unstyled{padding-left:0;list-style:none}.list-inline-item{display:inline-block}.list-inline-item:not(:last-child){margin-right:.5rem}.initialism{font-size:90%;text-transform:uppercase}.blockquote{margin-bottom:1rem;font-size:1.25rem}.blockquote-footer{display:block;font-size:80%;color:#6c757d}.blockquote-footer:before{content:"— "}.img-fluid,.img-thumbnail{max-width:100%;height:auto}.img-thumbnail{padding:.25rem;background-color:#fff;border:1px solid #dee2e6;border-radius:.25rem}.figure{display:inline-block}.figure-img{margin-bottom:.5rem;line-height:1}.figure-caption{font-size:90%;color:#6c757d}code{font-size:87.5%;color:#a94442;word-wrap:break-word}a>code{color:inherit}kbd{padding:.2rem .4rem;font-size:87.5%;color:#fff;background-color:#212529;border-radius:.2rem}kbd kbd{padding:0;font-size:100%;font-weight:700}pre{display:block;font-size:87.5%;color:#212529}pre code{font-size:inherit;color:inherit;word-break:normal}.pre-scrollable{max-height:340px;overflow-y:scroll}.container,.container-fluid,.container-lg,.container-md,.container-sm,.container-xl{width:100%;padding-right:15px;padding-left:15px;margin-right:auto;margin-left:auto}@media (min-width: 576px){.container,.container-sm{max-width:540px}}@media (min-width: 768px){.container,.container-md,.container-sm{max-width:720px}}@media (min-width: 992px){.container,.container-lg,.container-md,.container-sm{max-width:960px}}@media (min-width: 1200px){.container,.container-lg,.container-md,.container-sm,.container-xl{max-width:1140px}}.row,cd-about dl{display:flex;flex-wrap:wrap;margin-right:-15px;margin-left:-15px}.no-gutters{margin-right:0;margin-left:0}.no-gutters>.col,.no-gutters>[class*=col-]{padding-right:0;padding-left:0}.cd-col-form,.cd-col-form-input,.cd-col-form-label,.cd-col-form-offset,.col,.col-1,.col-10,.col-11,.col-12,.col-2,.col-2xl,.col-2xl-1,.col-2xl-10,.col-2xl-11,.col-2xl-12,.col-2xl-2,.col-2xl-3,.col-2xl-4,.col-2xl-5,.col-2xl-6,.col-2xl-7,.col-2xl-8,.col-2xl-9,.col-2xl-auto,.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,cd-about dd,cd-about dt,cd-health cd-info-card,cd-health cd-info-card.cd-capacity-card,cd-health cd-info-card.cd-chart-card,cd-health cd-info-card.cd-performance-card,cd-health cd-info-card.cd-status-card,cd-modal .cd-col-form-input,cd-modal .cd-col-form-label,cd-modal .cd-col-form-offset{position:relative;width:100%;padding-right:15px;padding-left:15px}.col{flex-basis:0;flex-grow:1;max-width:100%}.row-cols-1>*{flex:0 0 100%;max-width:100%}.row-cols-2>*{flex:0 0 50%;max-width:50%}.row-cols-3>*{flex:0 0 33.3333333333%;max-width:33.3333333333%}.row-cols-4>*{flex:0 0 25%;max-width:25%}.row-cols-5>*{flex:0 0 20%;max-width:20%}.row-cols-6>*{flex:0 0 16.6666666667%;max-width:16.6666666667%}.col-auto{flex:0 0 auto;width:auto;max-width:100%}.col-1{flex:0 0 8.33333333%;max-width:8.33333333%}.col-2{flex:0 0 16.66666667%;max-width:16.66666667%}.col-3{flex:0 0 25%;max-width:25%}.col-4,cd-about dt{flex:0 0 33.33333333%;max-width:33.33333333%}.col-5{flex:0 0 41.66666667%;max-width:41.66666667%}.col-6{flex:0 0 50%;max-width:50%}.col-7{flex:0 0 58.33333333%;max-width:58.33333333%}.col-8,cd-about dd{flex:0 0 66.66666667%;max-width:66.66666667%}.col-9{flex:0 0 75%;max-width:75%}.col-10{flex:0 0 83.33333333%;max-width:83.33333333%}.col-11{flex:0 0 91.66666667%;max-width:91.66666667%}.cd-col-form,.col-12,cd-health cd-info-card{flex:0 0 100%;max-width:100%}.order-first{order:-1}.order-last{order:13}.order-0{order:0}.order-1{order:1}.order-2{order:2}.order-3{order:3}.order-4{order:4}.order-5{order:5}.order-6{order:6}.order-7{order:7}.order-8{order:8}.order-9{order:9}.order-10{order:10}.order-11{order:11}.order-12{order:12}.offset-1{margin-left:8.33333333%}.offset-2{margin-left:16.66666667%}.offset-3{margin-left:25%}.offset-4{margin-left:33.33333333%}.offset-5{margin-left:41.66666667%}.offset-6{margin-left:50%}.offset-7{margin-left:58.33333333%}.offset-8{margin-left:66.66666667%}.offset-9{margin-left:75%}.offset-10{margin-left:83.33333333%}.offset-11{margin-left:91.66666667%}@media (min-width: 576px){.col-sm{flex-basis:0;flex-grow:1;max-width:100%}.row-cols-sm-1>*{flex:0 0 100%;max-width:100%}.row-cols-sm-2>*{flex:0 0 50%;max-width:50%}.row-cols-sm-3>*{flex:0 0 33.3333333333%;max-width:33.3333333333%}.row-cols-sm-4>*{flex:0 0 25%;max-width:25%}.row-cols-sm-5>*{flex:0 0 20%;max-width:20%}.row-cols-sm-6>*{flex:0 0 16.6666666667%;max-width:16.6666666667%}.col-sm-auto{flex:0 0 auto;width:auto;max-width:100%}.col-sm-1{flex:0 0 8.33333333%;max-width:8.33333333%}.col-sm-2{flex:0 0 16.66666667%;max-width:16.66666667%}.col-sm-3{flex:0 0 25%;max-width:25%}.cd-col-form-label,.col-sm-4{flex:0 0 33.33333333%;max-width:33.33333333%}.col-sm-5{flex:0 0 41.66666667%;max-width:41.66666667%}.col-sm-6{flex:0 0 50%;max-width:50%}.col-sm-7{flex:0 0 58.33333333%;max-width:58.33333333%}.cd-col-form-input,.cd-col-form-offset,.col-sm-8{flex:0 0 66.66666667%;max-width:66.66666667%}.col-sm-9{flex:0 0 75%;max-width:75%}.col-sm-10{flex:0 0 83.33333333%;max-width:83.33333333%}.col-sm-11{flex:0 0 91.66666667%;max-width:91.66666667%}.col-sm-12,cd-health cd-info-card{flex:0 0 100%;max-width:100%}.order-sm-first{order:-1}.order-sm-last{order:13}.order-sm-0{order:0}.order-sm-1{order:1}.order-sm-2{order:2}.order-sm-3{order:3}.order-sm-4{order:4}.order-sm-5{order:5}.order-sm-6{order:6}.order-sm-7{order:7}.order-sm-8{order:8}.order-sm-9{order:9}.order-sm-10{order:10}.order-sm-11{order:11}.order-sm-12{order:12}.offset-sm-0{margin-left:0}.offset-sm-1{margin-left:8.33333333%}.offset-sm-2{margin-left:16.66666667%}.offset-sm-3{margin-left:25%}.cd-col-form-offset,.offset-sm-4{margin-left:33.33333333%}.offset-sm-5{margin-left:41.66666667%}.offset-sm-6{margin-left:50%}.offset-sm-7{margin-left:58.33333333%}.offset-sm-8{margin-left:66.66666667%}.offset-sm-9{margin-left:75%}.offset-sm-10{margin-left:83.33333333%}.offset-sm-11{margin-left:91.66666667%}}@media (min-width: 768px){.col-md{flex-basis:0;flex-grow:1;max-width:100%}.row-cols-md-1>*{flex:0 0 100%;max-width:100%}.row-cols-md-2>*{flex:0 0 50%;max-width:50%}.row-cols-md-3>*{flex:0 0 33.3333333333%;max-width:33.3333333333%}.row-cols-md-4>*{flex:0 0 25%;max-width:25%}.row-cols-md-5>*{flex:0 0 20%;max-width:20%}.row-cols-md-6>*{flex:0 0 16.6666666667%;max-width:16.6666666667%}.col-md-auto{flex:0 0 auto;width:auto;max-width:100%}.col-md-1{flex:0 0 8.33333333%;max-width:8.33333333%}.col-md-2{flex:0 0 16.66666667%;max-width:16.66666667%}.col-md-3{flex:0 0 25%;max-width:25%}.cd-col-form-label,.col-md-4{flex:0 0 33.33333333%;max-width:33.33333333%}.col-md-5{flex:0 0 41.66666667%;max-width:41.66666667%}.col-md-6,cd-health cd-info-card{flex:0 0 50%;max-width:50%}.col-md-7{flex:0 0 58.33333333%;max-width:58.33333333%}.cd-col-form-input,.cd-col-form-offset,.col-md-8{flex:0 0 66.66666667%;max-width:66.66666667%}.col-md-9{flex:0 0 75%;max-width:75%}.col-md-10{flex:0 0 83.33333333%;max-width:83.33333333%}.col-md-11{flex:0 0 91.66666667%;max-width:91.66666667%}.col-md-12,cd-health cd-info-card.cd-chart-card{flex:0 0 100%;max-width:100%}.order-md-first{order:-1}.order-md-last{order:13}.order-md-0{order:0}.order-md-1{order:1}.order-md-2{order:2}.order-md-3{order:3}.order-md-4{order:4}.order-md-5{order:5}.order-md-6{order:6}.order-md-7{order:7}.order-md-8{order:8}.order-md-9{order:9}.order-md-10{order:10}.order-md-11{order:11}.order-md-12{order:12}.offset-md-0{margin-left:0}.offset-md-1{margin-left:8.33333333%}.offset-md-2{margin-left:16.66666667%}.offset-md-3{margin-left:25%}.offset-md-4{margin-left:33.33333333%}.offset-md-5{margin-left:41.66666667%}.offset-md-6{margin-left:50%}.offset-md-7{margin-left:58.33333333%}.offset-md-8{margin-left:66.66666667%}.offset-md-9{margin-left:75%}.offset-md-10{margin-left:83.33333333%}.offset-md-11{margin-left:91.66666667%}}@media (min-width: 992px){.col-lg{flex-basis:0;flex-grow:1;max-width:100%}.row-cols-lg-1>*{flex:0 0 100%;max-width:100%}.row-cols-lg-2>*{flex:0 0 50%;max-width:50%}.row-cols-lg-3>*{flex:0 0 33.3333333333%;max-width:33.3333333333%}.row-cols-lg-4>*{flex:0 0 25%;max-width:25%}.row-cols-lg-5>*{flex:0 0 20%;max-width:20%}.row-cols-lg-6>*{flex:0 0 16.6666666667%;max-width:16.6666666667%}.col-lg-auto{flex:0 0 auto;width:auto;max-width:100%}.col-lg-1{flex:0 0 8.33333333%;max-width:8.33333333%}.col-lg-2{flex:0 0 16.66666667%;max-width:16.66666667%}.cd-col-form-label,.col-lg-3,cd-health cd-info-card.cd-capacity-card{flex:0 0 25%;max-width:25%}.col-lg-4,cd-health cd-info-card,cd-modal .cd-col-form-label{flex:0 0 33.33333333%;max-width:33.33333333%}.col-lg-5{flex:0 0 41.66666667%;max-width:41.66666667%}.col-lg-6,cd-health cd-info-card.cd-chart-card,cd-health cd-info-card.cd-performance-card{flex:0 0 50%;max-width:50%}.col-lg-7{flex:0 0 58.33333333%;max-width:58.33333333%}.cd-col-form,.col-lg-8,cd-modal .cd-col-form-input,cd-modal .cd-col-form-offset{flex:0 0 66.66666667%;max-width:66.66666667%}.cd-col-form-input,.cd-col-form-offset,.col-lg-9{flex:0 0 75%;max-width:75%}.col-lg-10{flex:0 0 83.33333333%;max-width:83.33333333%}.col-lg-11{flex:0 0 91.66666667%;max-width:91.66666667%}.col-lg-12{flex:0 0 100%;max-width:100%}.order-lg-first{order:-1}.order-lg-last{order:13}.order-lg-0{order:0}.order-lg-1{order:1}.order-lg-2{order:2}.order-lg-3{order:3}.order-lg-4{order:4}.order-lg-5{order:5}.order-lg-6{order:6}.order-lg-7{order:7}.order-lg-8{order:8}.order-lg-9{order:9}.order-lg-10{order:10}.order-lg-11{order:11}.order-lg-12{order:12}.offset-lg-0{margin-left:0}.offset-lg-1{margin-left:8.33333333%}.offset-lg-2{margin-left:16.66666667%}.cd-col-form-offset,.offset-lg-3{margin-left:25%}.offset-lg-4,cd-modal .cd-col-form-offset{margin-left:33.33333333%}.offset-lg-5{margin-left:41.66666667%}.offset-lg-6{margin-left:50%}.offset-lg-7{margin-left:58.33333333%}.offset-lg-8{margin-left:66.66666667%}.offset-lg-9{margin-left:75%}.offset-lg-10{margin-left:83.33333333%}.offset-lg-11{margin-left:91.66666667%}}@media (min-width: 1200px){.col-xl,cd-health cd-info-card.cd-capacity-card,cd-health cd-info-card.cd-performance-card{flex-basis:0;flex-grow:1;max-width:100%}.row-cols-xl-1>*{flex:0 0 100%;max-width:100%}.row-cols-xl-2>*{flex:0 0 50%;max-width:50%}.row-cols-xl-3>*{flex:0 0 33.3333333333%;max-width:33.3333333333%}.row-cols-xl-4>*{flex:0 0 25%;max-width:25%}.row-cols-xl-5>*{flex:0 0 20%;max-width:20%}.row-cols-xl-6>*{flex:0 0 16.6666666667%;max-width:16.6666666667%}.col-xl-auto{flex:0 0 auto;width:auto;max-width:100%}.col-xl-1{flex:0 0 8.33333333%;max-width:8.33333333%}.col-xl-2{flex:0 0 16.66666667%;max-width:16.66666667%}.col-xl-3,cd-health cd-info-card.cd-status-card{flex:0 0 25%;max-width:25%}.col-xl-4,cd-health cd-info-card.cd-chart-card{flex:0 0 33.33333333%;max-width:33.33333333%}.col-xl-5{flex:0 0 41.66666667%;max-width:41.66666667%}.cd-col-form,.col-xl-6{flex:0 0 50%;max-width:50%}.col-xl-7{flex:0 0 58.33333333%;max-width:58.33333333%}.col-xl-8{flex:0 0 66.66666667%;max-width:66.66666667%}.col-xl-9{flex:0 0 75%;max-width:75%}.col-xl-10{flex:0 0 83.33333333%;max-width:83.33333333%}.col-xl-11{flex:0 0 91.66666667%;max-width:91.66666667%}.col-xl-12{flex:0 0 100%;max-width:100%}.order-xl-first{order:-1}.order-xl-last{order:13}.order-xl-0{order:0}.order-xl-1{order:1}.order-xl-2{order:2}.order-xl-3{order:3}.order-xl-4{order:4}.order-xl-5{order:5}.order-xl-6{order:6}.order-xl-7{order:7}.order-xl-8{order:8}.order-xl-9{order:9}.order-xl-10{order:10}.order-xl-11{order:11}.order-xl-12{order:12}.offset-xl-0{margin-left:0}.offset-xl-1{margin-left:8.33333333%}.offset-xl-2{margin-left:16.66666667%}.offset-xl-3{margin-left:25%}.offset-xl-4{margin-left:33.33333333%}.offset-xl-5{margin-left:41.66666667%}.offset-xl-6{margin-left:50%}.offset-xl-7{margin-left:58.33333333%}.offset-xl-8{margin-left:66.66666667%}.offset-xl-9{margin-left:75%}.offset-xl-10{margin-left:83.33333333%}.offset-xl-11{margin-left:91.66666667%}}@media (min-width: 1450px){.col-2xl{flex-basis:0;flex-grow:1;max-width:100%}.row-cols-2xl-1>*{flex:0 0 100%;max-width:100%}.row-cols-2xl-2>*{flex:0 0 50%;max-width:50%}.row-cols-2xl-3>*{flex:0 0 33.3333333333%;max-width:33.3333333333%}.row-cols-2xl-4>*{flex:0 0 25%;max-width:25%}.row-cols-2xl-5>*{flex:0 0 20%;max-width:20%}.row-cols-2xl-6>*{flex:0 0 16.6666666667%;max-width:16.6666666667%}.col-2xl-auto{flex:0 0 auto;width:auto;max-width:100%}.col-2xl-1{flex:0 0 8.33333333%;max-width:8.33333333%}.col-2xl-2{flex:0 0 16.66666667%;max-width:16.66666667%}.col-2xl-3,cd-health cd-info-card.cd-chart-card{flex:0 0 25%;max-width:25%}.col-2xl-4{flex:0 0 33.33333333%;max-width:33.33333333%}.col-2xl-5{flex:0 0 41.66666667%;max-width:41.66666667%}.col-2xl-6{flex:0 0 50%;max-width:50%}.col-2xl-7{flex:0 0 58.33333333%;max-width:58.33333333%}.col-2xl-8{flex:0 0 66.66666667%;max-width:66.66666667%}.col-2xl-9{flex:0 0 75%;max-width:75%}.col-2xl-10{flex:0 0 83.33333333%;max-width:83.33333333%}.col-2xl-11{flex:0 0 91.66666667%;max-width:91.66666667%}.col-2xl-12{flex:0 0 100%;max-width:100%}.order-2xl-first{order:-1}.order-2xl-last{order:13}.order-2xl-0{order:0}.order-2xl-1{order:1}.order-2xl-2{order:2}.order-2xl-3{order:3}.order-2xl-4{order:4}.order-2xl-5{order:5}.order-2xl-6{order:6}.order-2xl-7{order:7}.order-2xl-8{order:8}.order-2xl-9{order:9}.order-2xl-10{order:10}.order-2xl-11{order:11}.order-2xl-12{order:12}.offset-2xl-0{margin-left:0}.offset-2xl-1{margin-left:8.33333333%}.offset-2xl-2{margin-left:16.66666667%}.offset-2xl-3{margin-left:25%}.offset-2xl-4{margin-left:33.33333333%}.offset-2xl-5{margin-left:41.66666667%}.offset-2xl-6{margin-left:50%}.offset-2xl-7{margin-left:58.33333333%}.offset-2xl-8{margin-left:66.66666667%}.offset-2xl-9{margin-left:75%}.offset-2xl-10{margin-left:83.33333333%}.offset-2xl-11{margin-left:91.66666667%}}.table{width:100%;margin-bottom:1rem;color:#212529}.table td,.table th{padding:.75rem;vertical-align:top;border-top:1px solid #dee2e6}.table thead th{vertical-align:bottom;border-bottom:2px solid #dee2e6}.table tbody+tbody{border-top:2px solid #dee2e6}.table-sm td,.table-sm th{padding:.3rem}.table-bordered,.table-bordered td,.table-bordered th{border:1px solid #dee2e6}.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:#0000000d}.table-hover tbody tr:hover{color:#212529;background-color:rgba(0,0,0,.075)}.table-primary,.table-primary>td,.table-primary>th{background-color:#c4e2e7}.table-primary tbody+tbody,.table-primary td,.table-primary th,.table-primary thead th{border-color:#91cad2}.table-hover .table-primary:hover,.table-hover .table-primary:hover>td,.table-hover .table-primary:hover>th{background-color:#b2d9e0}.table-secondary,.table-secondary>td,.table-secondary>th{background-color:#c7cacc}.table-secondary tbody+tbody,.table-secondary td,.table-secondary th,.table-secondary thead th{border-color:#979da0}.table-hover .table-secondary:hover,.table-hover .table-secondary:hover>td,.table-hover .table-secondary:hover>th{background-color:#babdc0}.table-success,.table-success>td,.table-success>th{background-color:#b8ecb8}.table-success tbody+tbody,.table-success td,.table-success th,.table-success thead th{border-color:#7adc7a}.table-hover .table-success:hover,.table-hover .table-success:hover>td,.table-hover .table-success:hover>th{background-color:#a4e7a4}.table-info,.table-info>td,.table-info>th{background-color:#c4e2e7}.table-info tbody+tbody,.table-info td,.table-info th,.table-info thead th{border-color:#91cad2}.table-hover .table-info:hover,.table-hover .table-info:hover>td,.table-hover .table-info:hover>th{background-color:#b2d9e0}.table-warning,.table-warning>td,.table-warning>th{background-color:#ffeeb8}.table-warning tbody+tbody,.table-warning td,.table-warning th,.table-warning thead th{border-color:#ffdf7a}.table-hover .table-warning:hover,.table-hover .table-warning:hover>td,.table-hover .table-warning:hover>th{background-color:#ffe89f}.table-danger,.table-danger>td,.table-danger>th{background-color:#fbd1cf}.table-danger tbody+tbody,.table-danger td,.table-danger th,.table-danger thead th{border-color:#f7aaa7}.table-hover .table-danger:hover,.table-hover .table-danger:hover>td,.table-hover .table-danger:hover>th{background-color:#f9bab7}.table-light,.table-light>td,.table-light>th{background-color:#fdfdfe}.table-light tbody+tbody,.table-light td,.table-light th,.table-light thead th{border-color:#fbfcfc}.table-hover .table-light:hover,.table-hover .table-light:hover>td,.table-hover .table-light:hover>th{background-color:#ececf6}.table-dark,.table-dark>td,.table-dark>th{background-color:#d9d9d9}.table-dark tbody+tbody,.table-dark td,.table-dark th,.table-dark thead th{border-color:#b8b8b8}.table-hover .table-dark:hover,.table-hover .table-dark:hover>td,.table-hover .table-dark:hover>th{background-color:#ccc}.table-accent,.table-accent>td,.table-accent>th{background-color:#fbd1cf}.table-accent tbody+tbody,.table-accent td,.table-accent th,.table-accent thead th{border-color:#f7aaa7}.table-hover .table-accent:hover,.table-hover .table-accent:hover>td,.table-hover .table-accent:hover>th{background-color:#f9bab7}.table-warning-dark,.table-warning-dark>td,.table-warning-dark>th{background-color:#fedbbd}.table-warning-dark tbody+tbody,.table-warning-dark td,.table-warning-dark th,.table-warning-dark thead th{border-color:#febc85}.table-hover .table-warning-dark:hover,.table-hover .table-warning-dark:hover>td,.table-hover .table-warning-dark:hover>th{background-color:#fecda4}.table-active,.table-active>td,.table-active>th,.table-hover .table-active:hover,.table-hover .table-active:hover>td,.table-hover .table-active:hover>th{background-color:rgba(0,0,0,.075)}.table .thead-dark th{color:#fff;background-color:#343a40;border-color:#454d55}.table .thead-light th{color:#495057;background-color:#e9ecef;border-color:#dee2e6}.table-dark{color:#fff;background-color:#343a40}.table-dark td,.table-dark th,.table-dark thead th{border-color:#454d55}.table-dark.table-bordered{border:0}.table-dark.table-striped tbody tr:nth-of-type(odd){background-color:#ffffff0d}.table-dark.table-hover tbody tr:hover{color:#fff;background-color:hsla(0,0%,100%,.075)}@media (max-width: 575.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: 991.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: 1199.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: 1449.98px){.table-responsive-2xl{display:block;width:100%;overflow-x:auto;-webkit-overflow-scrolling:touch}.table-responsive-2xl>.table-bordered{border:0}}.table-responsive{display:block;width:100%;overflow-x:auto;-webkit-overflow-scrolling:touch}.table-responsive>.table-bordered{border:0}.cd-form-control,.form-control{display:block;width:100%;height:calc(1.5em + .75rem + 2px);padding:.375rem .75rem;font-size:1rem;font-weight:400;line-height:1.5;color:#495057;background-color:#fff;background-clip:padding-box;border:1px solid #ced4da;border-radius:.25rem;transition:border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media (prefers-reduced-motion: reduce){.cd-form-control,.form-control{transition:none}}.cd-form-control::-ms-expand,.form-control::-ms-expand{background-color:initial;border:0}.cd-form-control:focus,.form-control:focus{color:#495057;background-color:#fff;border-color:#76d0dc;box-shadow:0 0 0 .2rem #2b99a840}.cd-form-control::placeholder,.form-control::placeholder{color:#6c757d;opacity:1}.cd-form-control:disabled,.form-control:disabled,.form-control[readonly],[readonly].cd-form-control{background-color:#e9ecef;opacity:1}input[type=date].cd-form-control,input[type=date].form-control,input[type=datetime-local].cd-form-control,input[type=datetime-local].form-control,input[type=month].cd-form-control,input[type=month].form-control,input[type=time].cd-form-control,input[type=time].form-control{appearance:none}select.cd-form-control:-moz-focusring,select.form-control:-moz-focusring{color:#0000;text-shadow:0 0 0 #495057}select.cd-form-control:focus::-ms-value,select.form-control:focus::-ms-value{color:#495057;background-color:#fff}.form-control-file,.form-control-range{display:block;width:100%}.cd-col-form-label,.col-form-label{padding-top:calc(.375rem + 1px);padding-bottom:calc(.375rem + 1px);margin-bottom:0;font-size:inherit;line-height:1.5}.col-form-label-lg{padding-top:calc(.5rem + 1px);padding-bottom:calc(.5rem + 1px);font-size:1.25rem;line-height:1.5}.col-form-label-sm{padding-top:calc(.25rem + 1px);padding-bottom:calc(.25rem + 1px);font-size:.875rem;line-height:1.5}.form-control-plaintext{display:block;width:100%;padding:.375rem 0;margin-bottom:0;font-size:1rem;line-height:1.5;color:#212529;background-color:initial;border:solid #0000;border-width:1px 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.5em + .5rem + 2px);padding:.25rem .5rem;font-size:.875rem;line-height:1.5;border-radius:.2rem}.form-control-lg{height:calc(1.5em + 1rem + 2px);padding:.5rem 1rem;font-size:1.25rem;line-height:1.5;border-radius:.3rem}select.form-control[multiple],select.form-control[size],select[multiple].cd-form-control,select[size].cd-form-control,textarea.cd-form-control,textarea.form-control{height:auto}.form-group{margin-bottom:1rem}.form-text{display:block;margin-top:.25rem}.form-row{display:flex;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}.form-check-input{position:absolute;margin-top:.3rem;margin-left:-1.25rem}.form-check-input:disabled~.form-check-label,.form-check-input[disabled]~.form-check-label{color:#6c757d}.form-check-label{margin-bottom:0}.form-check-inline{display:inline-flex;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:.25rem;font-size:100%;color:#0b0}.valid-tooltip{position:absolute;top:100%;left:0;z-index:5;display:none;max-width:100%;padding:.25rem .5rem;margin-top:.1rem;font-size:.875rem;line-height:1.5;color:#fff;background-color:#00bb00e6;border-radius:.25rem}.form-row>.col>.valid-tooltip,.form-row>[class*=col-]>.valid-tooltip{left:5px}.is-valid~.valid-feedback,.is-valid~.valid-tooltip,.was-validated :valid~.valid-feedback,.was-validated :valid~.valid-tooltip{display:block}.form-control.is-valid,.is-valid.cd-form-control,.was-validated .cd-form-control:valid,.was-validated .form-control:valid{border-color:#0b0;padding-right:calc(1.5em + .75rem)!important;background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='8' height='8' viewBox='0 0 8 8'%3e%3cpath fill='%230b0' 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");background-repeat:no-repeat;background-position:right calc(.375em + .1875rem) center;background-size:calc(.75em + .375rem) calc(.75em + .375rem)}.form-control.is-valid:focus,.is-valid.cd-form-control:focus,.was-validated .cd-form-control:valid:focus,.was-validated .form-control:valid:focus{border-color:#0b0;box-shadow:0 0 0 .2rem #00bb0040}.was-validated select.cd-form-control:valid,.was-validated select.form-control:valid,select.form-control.is-valid,select.is-valid.cd-form-control{padding-right:3rem!important;background-position:right 1.5rem center}.was-validated textarea.cd-form-control:valid,.was-validated textarea.form-control:valid,textarea.form-control.is-valid,textarea.is-valid.cd-form-control{padding-right:calc(1.5em + .75rem);background-position:top calc(.375em + .1875rem) right calc(.375em + .1875rem)}.custom-select.is-valid,.was-validated .custom-select:valid{border-color:#0b0;padding-right:calc(.75em + 2.3125rem)!important;background:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='4' height='5' viewBox='0 0 4 5'%3e%3cpath fill='%23343a40' d='M2 0L0 2h4zm0 5L0 3h4z'/%3e%3c/svg%3e") right .75rem center/8px 10px no-repeat,#fff url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='8' height='8' viewBox='0 0 8 8'%3e%3cpath fill='%230b0' 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") center right 1.75rem/calc(.75em + .375rem) calc(.75em + .375rem) no-repeat}.custom-select.is-valid:focus,.was-validated .custom-select:valid:focus{border-color:#0b0;box-shadow:0 0 0 .2rem #00bb0040}.form-check-input.is-valid~.form-check-label,.was-validated .form-check-input:valid~.form-check-label{color:#0b0}.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:#0b0}.custom-control-input.is-valid~.custom-control-label:before,.was-validated .custom-control-input:valid~.custom-control-label:before{border-color:#0b0}.custom-control-input.is-valid:checked~.custom-control-label:before,.was-validated .custom-control-input:valid:checked~.custom-control-label:before{border-color:#0e0;background-color:#0e0}.custom-control-input.is-valid:focus~.custom-control-label:before,.was-validated .custom-control-input:valid:focus~.custom-control-label:before{box-shadow:0 0 0 .2rem #00bb0040}.custom-control-input.is-valid:focus:not(:checked)~.custom-control-label:before,.custom-file-input.is-valid~.custom-file-label,.was-validated .custom-control-input:valid:focus:not(:checked)~.custom-control-label:before,.was-validated .custom-file-input:valid~.custom-file-label{border-color:#0b0}.custom-file-input.is-valid:focus~.custom-file-label,.was-validated .custom-file-input:valid:focus~.custom-file-label{border-color:#0b0;box-shadow:0 0 0 .2rem #00bb0040}.invalid-feedback{display:none;width:100%;margin-top:.25rem;font-size:100%;color:#ef5c55}.invalid-tooltip{position:absolute;top:100%;left:0;z-index:5;display:none;max-width:100%;padding:.25rem .5rem;margin-top:.1rem;font-size:.875rem;line-height:1.5;color:#fff;background-color:#ef5c55e6;border-radius:.25rem}.form-row>.col>.invalid-tooltip,.form-row>[class*=col-]>.invalid-tooltip{left:5px}.is-invalid~.invalid-feedback,.is-invalid~.invalid-tooltip,.was-validated :invalid~.invalid-feedback,.was-validated :invalid~.invalid-tooltip{display:block}.form-control.is-invalid,.is-invalid.cd-form-control,.was-validated .cd-form-control:invalid,.was-validated .form-control:invalid{border-color:#ef5c55;padding-right:calc(1.5em + .75rem)!important;background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='12' height='12' fill='none' stroke='%23ef5c55' viewBox='0 0 12 12'%3e%3ccircle cx='6' cy='6' r='4.5'/%3e%3cpath stroke-linejoin='round' d='M5.8 3.6h.4L6 6.5z'/%3e%3ccircle cx='6' cy='8.2' r='.6' fill='%23ef5c55' stroke='none'/%3e%3c/svg%3e");background-repeat:no-repeat;background-position:right calc(.375em + .1875rem) center;background-size:calc(.75em + .375rem) calc(.75em + .375rem)}.form-control.is-invalid:focus,.is-invalid.cd-form-control:focus,.was-validated .cd-form-control:invalid:focus,.was-validated .form-control:invalid:focus{border-color:#ef5c55;box-shadow:0 0 0 .2rem #ef5c5540}.was-validated select.cd-form-control:invalid,.was-validated select.form-control:invalid,select.form-control.is-invalid,select.is-invalid.cd-form-control{padding-right:3rem!important;background-position:right 1.5rem center}.was-validated textarea.cd-form-control:invalid,.was-validated textarea.form-control:invalid,textarea.form-control.is-invalid,textarea.is-invalid.cd-form-control{padding-right:calc(1.5em + .75rem);background-position:top calc(.375em + .1875rem) right calc(.375em + .1875rem)}.custom-select.is-invalid,.was-validated .custom-select:invalid{border-color:#ef5c55;padding-right:calc(.75em + 2.3125rem)!important;background:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='4' height='5' viewBox='0 0 4 5'%3e%3cpath fill='%23343a40' d='M2 0L0 2h4zm0 5L0 3h4z'/%3e%3c/svg%3e") right .75rem center/8px 10px no-repeat,#fff url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='12' height='12' fill='none' stroke='%23ef5c55' viewBox='0 0 12 12'%3e%3ccircle cx='6' cy='6' r='4.5'/%3e%3cpath stroke-linejoin='round' d='M5.8 3.6h.4L6 6.5z'/%3e%3ccircle cx='6' cy='8.2' r='.6' fill='%23ef5c55' stroke='none'/%3e%3c/svg%3e") center right 1.75rem/calc(.75em + .375rem) calc(.75em + .375rem) no-repeat}.custom-select.is-invalid:focus,.was-validated .custom-select:invalid:focus{border-color:#ef5c55;box-shadow:0 0 0 .2rem #ef5c5540}.form-check-input.is-invalid~.form-check-label,.was-validated .form-check-input:invalid~.form-check-label{color:#ef5c55}.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:#ef5c55}.custom-control-input.is-invalid~.custom-control-label:before,.was-validated .custom-control-input:invalid~.custom-control-label:before{border-color:#ef5c55}.custom-control-input.is-invalid:checked~.custom-control-label:before,.was-validated .custom-control-input:invalid:checked~.custom-control-label:before{border-color:#f38984;background-color:#f38984}.custom-control-input.is-invalid:focus~.custom-control-label:before,.was-validated .custom-control-input:invalid:focus~.custom-control-label:before{box-shadow:0 0 0 .2rem #ef5c5540}.custom-control-input.is-invalid:focus:not(:checked)~.custom-control-label:before,.custom-file-input.is-invalid~.custom-file-label,.was-validated .custom-control-input:invalid:focus:not(:checked)~.custom-control-label:before,.was-validated .custom-file-input:invalid~.custom-file-label{border-color:#ef5c55}.custom-file-input.is-invalid:focus~.custom-file-label,.was-validated .custom-file-input:invalid:focus~.custom-file-label{border-color:#ef5c55;box-shadow:0 0 0 .2rem #ef5c5540}.form-inline{display:flex;flex-flow:row wrap;align-items:center}.form-inline .form-check{width:100%}@media (min-width: 576px){.form-inline label{justify-content:center}.form-inline .form-group,.form-inline label{display:flex;align-items:center;margin-bottom:0}.form-inline .form-group{flex:0 0 auto;flex-flow:row wrap}.form-inline .cd-form-control,.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:flex;align-items:center;justify-content:center;width:auto;padding-left:0}.form-inline .form-check-input{position:relative;flex-shrink:0;margin-top:0;margin-right:.25rem;margin-left:0}.form-inline .custom-control{align-items:center;justify-content:center}.form-inline .custom-control-label{margin-bottom:0}}.btn{display:inline-block;font-weight:400;color:#212529;text-align:center;vertical-align:middle;user-select:none;background-color:initial;border:1px solid #0000;padding:.375rem .75rem;font-size:1rem;line-height:1.5;border-radius:.25rem;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:#212529;text-decoration:none}.btn.focus,.btn:focus{outline:0;box-shadow:0 0 0 .2rem #2b99a840}.btn.disabled,.btn:disabled{opacity:.65}.btn:not(:disabled):not(.disabled){cursor:pointer}a.btn.disabled,fieldset:disabled a.btn{pointer-events:none}.btn-primary{color:#fff;background-color:#2b99a8;border-color:#2b99a8}.btn-primary.focus,.btn-primary:focus,.btn-primary:hover{color:#fff;background-color:#237d8a;border-color:#21747f}.btn-primary.focus,.btn-primary:focus{box-shadow:0 0 0 .2rem #4ba8b580}.btn-primary.disabled,.btn-primary:disabled{color:#fff;background-color:#2b99a8;border-color:#2b99a8}.btn-primary:not(:disabled):not(.disabled).active,.btn-primary:not(:disabled):not(.disabled):active,.show>.btn-primary.dropdown-toggle{color:#fff;background-color:#21747f;border-color:#1e6b75}.btn-primary:not(:disabled):not(.disabled).active:focus,.btn-primary:not(:disabled):not(.disabled):active:focus,.show>.btn-primary.dropdown-toggle:focus{box-shadow:0 0 0 .2rem #4ba8b580}.btn-secondary{color:#fff;background-color:#374249;border-color:#374249}.btn-secondary.focus,.btn-secondary:focus,.btn-secondary:hover{color:#fff;background-color:#272e33;border-color:#21282c}.btn-secondary.focus,.btn-secondary:focus{box-shadow:0 0 0 .2rem #555e6480}.btn-secondary.disabled,.btn-secondary:disabled{color:#fff;background-color:#374249;border-color:#374249}.btn-secondary:not(:disabled):not(.disabled).active,.btn-secondary:not(:disabled):not(.disabled):active,.show>.btn-secondary.dropdown-toggle{color:#fff;background-color:#21282c;border-color:#1c2125}.btn-secondary:not(:disabled):not(.disabled).active:focus,.btn-secondary:not(:disabled):not(.disabled):active:focus,.show>.btn-secondary.dropdown-toggle:focus{box-shadow:0 0 0 .2rem #555e6480}.btn-success{color:#fff;background-color:#0b0;border-color:#0b0}.btn-success.focus,.btn-success:focus,.btn-success:hover{color:#fff;background-color:#009500;border-color:#080}.btn-success.focus,.btn-success:focus{box-shadow:0 0 0 .2rem #26c52680}.btn-success.disabled,.btn-success:disabled{color:#fff;background-color:#0b0;border-color:#0b0}.btn-success:not(:disabled):not(.disabled).active,.btn-success:not(:disabled):not(.disabled):active,.show>.btn-success.dropdown-toggle{color:#fff;background-color:#080;border-color:#007b00}.btn-success:not(:disabled):not(.disabled).active:focus,.btn-success:not(:disabled):not(.disabled):active:focus,.show>.btn-success.dropdown-toggle:focus{box-shadow:0 0 0 .2rem #26c52680}.btn-info{color:#fff;background-color:#2b99a8;border-color:#2b99a8}.btn-info.focus,.btn-info:focus,.btn-info:hover{color:#fff;background-color:#237d8a;border-color:#21747f}.btn-info.focus,.btn-info:focus{box-shadow:0 0 0 .2rem #4ba8b580}.btn-info.disabled,.btn-info:disabled{color:#fff;background-color:#2b99a8;border-color:#2b99a8}.btn-info:not(:disabled):not(.disabled).active,.btn-info:not(:disabled):not(.disabled):active,.show>.btn-info.dropdown-toggle{color:#fff;background-color:#21747f;border-color:#1e6b75}.btn-info:not(:disabled):not(.disabled).active:focus,.btn-info:not(:disabled):not(.disabled):active:focus,.show>.btn-info.dropdown-toggle:focus{box-shadow:0 0 0 .2rem #4ba8b580}.btn-warning{color:#212529;background-color:#ffc200;border-color:#ffc200}.btn-warning.focus,.btn-warning:focus,.btn-warning:hover{color:#212529;background-color:#d9a500;border-color:#cc9b00}.btn-warning.focus,.btn-warning:focus{box-shadow:0 0 0 .2rem #deaa0680}.btn-warning.disabled,.btn-warning:disabled{color:#212529;background-color:#ffc200;border-color:#ffc200}.btn-warning:not(:disabled):not(.disabled).active,.btn-warning:not(:disabled):not(.disabled):active,.show>.btn-warning.dropdown-toggle{color:#212529;background-color:#cc9b00;border-color:#bf9200}.btn-warning:not(:disabled):not(.disabled).active:focus,.btn-warning:not(:disabled):not(.disabled):active:focus,.show>.btn-warning.dropdown-toggle:focus{box-shadow:0 0 0 .2rem #deaa0680}.btn-danger{color:#fff;background-color:#ef5c55;border-color:#ef5c55}.btn-danger.focus,.btn-danger:focus,.btn-danger:hover{color:#fff;background-color:#ec3a32;border-color:#eb2f26}.btn-danger.focus,.btn-danger:focus{box-shadow:0 0 0 .2rem #f1746f80}.btn-danger.disabled,.btn-danger:disabled{color:#fff;background-color:#ef5c55;border-color:#ef5c55}.btn-danger:not(:disabled):not(.disabled).active,.btn-danger:not(:disabled):not(.disabled):active,.show>.btn-danger.dropdown-toggle{color:#fff;background-color:#eb2f26;border-color:#ea241b}.btn-danger:not(:disabled):not(.disabled).active:focus,.btn-danger:not(:disabled):not(.disabled):active:focus,.show>.btn-danger.dropdown-toggle:focus{box-shadow:0 0 0 .2rem #f1746f80}.btn-light{color:#212529;background-color:#f8f9fa;border-color:#f8f9fa}.btn-light.focus,.btn-light:focus,.btn-light:hover{color:#212529;background-color:#e2e6ea;border-color:#dae0e5}.btn-light.focus,.btn-light:focus{box-shadow:0 0 0 .2rem #d8d9db80}.btn-light.disabled,.btn-light:disabled{color:#212529;background-color:#f8f9fa;border-color:#f8f9fa}.btn-light:not(:disabled):not(.disabled).active,.btn-light:not(:disabled):not(.disabled):active,.show>.btn-light.dropdown-toggle{color:#212529;background-color:#dae0e5;border-color:#d3d9df}.btn-light:not(:disabled):not(.disabled).active:focus,.btn-light:not(:disabled):not(.disabled):active:focus,.show>.btn-light.dropdown-toggle:focus{box-shadow:0 0 0 .2rem #d8d9db80}.btn-dark{color:#fff;background-color:#777;border-color:#777}.btn-dark.focus,.btn-dark:focus,.btn-dark:hover{color:#fff;background-color:#646464;border-color:#5e5e5e}.btn-dark.focus,.btn-dark:focus{box-shadow:0 0 0 .2rem #8b8b8b80}.btn-dark.disabled,.btn-dark:disabled{color:#fff;background-color:#777;border-color:#777}.btn-dark:not(:disabled):not(.disabled).active,.btn-dark:not(:disabled):not(.disabled):active,.show>.btn-dark.dropdown-toggle{color:#fff;background-color:#5e5e5e;border-color:#575757}.btn-dark:not(:disabled):not(.disabled).active:focus,.btn-dark:not(:disabled):not(.disabled):active:focus,.show>.btn-dark.dropdown-toggle:focus{box-shadow:0 0 0 .2rem #8b8b8b80}.btn-accent{color:#fff;background-color:#ef5c55;border-color:#ef5c55}.btn-accent.focus,.btn-accent:focus,.btn-accent:hover{color:#fff;background-color:#ec3a32;border-color:#eb2f26}.btn-accent.focus,.btn-accent:focus{box-shadow:0 0 0 .2rem #f1746f80}.btn-accent.disabled,.btn-accent:disabled{color:#fff;background-color:#ef5c55;border-color:#ef5c55}.btn-accent:not(:disabled):not(.disabled).active,.btn-accent:not(:disabled):not(.disabled):active,.show>.btn-accent.dropdown-toggle{color:#fff;background-color:#eb2f26;border-color:#ea241b}.btn-accent:not(:disabled):not(.disabled).active:focus,.btn-accent:not(:disabled):not(.disabled):active:focus,.show>.btn-accent.dropdown-toggle:focus{box-shadow:0 0 0 .2rem #f1746f80}.btn-warning-dark{color:#212529;background-color:#fd7e14;border-color:#fd7e14}.btn-warning-dark.focus,.btn-warning-dark:focus,.btn-warning-dark:hover{color:#fff;background-color:#e96b02;border-color:#dc6502}.btn-warning-dark.focus,.btn-warning-dark:focus{box-shadow:0 0 0 .2rem #dc711780}.btn-warning-dark.disabled,.btn-warning-dark:disabled{color:#212529;background-color:#fd7e14;border-color:#fd7e14}.btn-warning-dark:not(:disabled):not(.disabled).active,.btn-warning-dark:not(:disabled):not(.disabled):active,.show>.btn-warning-dark.dropdown-toggle{color:#fff;background-color:#dc6502;border-color:#cf5f02}.btn-warning-dark:not(:disabled):not(.disabled).active:focus,.btn-warning-dark:not(:disabled):not(.disabled):active:focus,.show>.btn-warning-dark.dropdown-toggle:focus{box-shadow:0 0 0 .2rem #dc711780}.btn-outline-primary{color:#2b99a8;border-color:#2b99a8}.btn-outline-primary:hover{color:#fff;background-color:#2b99a8;border-color:#2b99a8}.btn-outline-primary.focus,.btn-outline-primary:focus{box-shadow:0 0 0 .2rem #2b99a880}.btn-outline-primary.disabled,.btn-outline-primary:disabled{color:#2b99a8;background-color:initial}.btn-outline-primary:not(:disabled):not(.disabled).active,.btn-outline-primary:not(:disabled):not(.disabled):active,.show>.btn-outline-primary.dropdown-toggle{color:#fff;background-color:#2b99a8;border-color:#2b99a8}.btn-outline-primary:not(:disabled):not(.disabled).active:focus,.btn-outline-primary:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-primary.dropdown-toggle:focus{box-shadow:0 0 0 .2rem #2b99a880}.btn-outline-secondary{color:#374249;border-color:#374249}.btn-outline-secondary:hover{color:#fff;background-color:#374249;border-color:#374249}.btn-outline-secondary.focus,.btn-outline-secondary:focus{box-shadow:0 0 0 .2rem #37424980}.btn-outline-secondary.disabled,.btn-outline-secondary:disabled{color:#374249;background-color:initial}.btn-outline-secondary:not(:disabled):not(.disabled).active,.btn-outline-secondary:not(:disabled):not(.disabled):active,.show>.btn-outline-secondary.dropdown-toggle{color:#fff;background-color:#374249;border-color:#374249}.btn-outline-secondary:not(:disabled):not(.disabled).active:focus,.btn-outline-secondary:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-secondary.dropdown-toggle:focus{box-shadow:0 0 0 .2rem #37424980}.btn-outline-success{color:#0b0;border-color:#0b0}.btn-outline-success:hover{color:#fff;background-color:#0b0;border-color:#0b0}.btn-outline-success.focus,.btn-outline-success:focus{box-shadow:0 0 0 .2rem #00bb0080}.btn-outline-success.disabled,.btn-outline-success:disabled{color:#0b0;background-color:initial}.btn-outline-success:not(:disabled):not(.disabled).active,.btn-outline-success:not(:disabled):not(.disabled):active,.show>.btn-outline-success.dropdown-toggle{color:#fff;background-color:#0b0;border-color:#0b0}.btn-outline-success:not(:disabled):not(.disabled).active:focus,.btn-outline-success:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-success.dropdown-toggle:focus{box-shadow:0 0 0 .2rem #00bb0080}.btn-outline-info{color:#2b99a8;border-color:#2b99a8}.btn-outline-info:hover{color:#fff;background-color:#2b99a8;border-color:#2b99a8}.btn-outline-info.focus,.btn-outline-info:focus{box-shadow:0 0 0 .2rem #2b99a880}.btn-outline-info.disabled,.btn-outline-info:disabled{color:#2b99a8;background-color:initial}.btn-outline-info:not(:disabled):not(.disabled).active,.btn-outline-info:not(:disabled):not(.disabled):active,.show>.btn-outline-info.dropdown-toggle{color:#fff;background-color:#2b99a8;border-color:#2b99a8}.btn-outline-info:not(:disabled):not(.disabled).active:focus,.btn-outline-info:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-info.dropdown-toggle:focus{box-shadow:0 0 0 .2rem #2b99a880}.btn-outline-warning{color:#ffc200;border-color:#ffc200}.btn-outline-warning:hover{color:#212529;background-color:#ffc200;border-color:#ffc200}.btn-outline-warning.focus,.btn-outline-warning:focus{box-shadow:0 0 0 .2rem #ffc20080}.btn-outline-warning.disabled,.btn-outline-warning:disabled{color:#ffc200;background-color:initial}.btn-outline-warning:not(:disabled):not(.disabled).active,.btn-outline-warning:not(:disabled):not(.disabled):active,.show>.btn-outline-warning.dropdown-toggle{color:#212529;background-color:#ffc200;border-color:#ffc200}.btn-outline-warning:not(:disabled):not(.disabled).active:focus,.btn-outline-warning:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-warning.dropdown-toggle:focus{box-shadow:0 0 0 .2rem #ffc20080}.btn-outline-danger{color:#ef5c55;border-color:#ef5c55}.btn-outline-danger:hover{color:#fff;background-color:#ef5c55;border-color:#ef5c55}.btn-outline-danger.focus,.btn-outline-danger:focus{box-shadow:0 0 0 .2rem #ef5c5580}.btn-outline-danger.disabled,.btn-outline-danger:disabled{color:#ef5c55;background-color:initial}.btn-outline-danger:not(:disabled):not(.disabled).active,.btn-outline-danger:not(:disabled):not(.disabled):active,.show>.btn-outline-danger.dropdown-toggle{color:#fff;background-color:#ef5c55;border-color:#ef5c55}.btn-outline-danger:not(:disabled):not(.disabled).active:focus,.btn-outline-danger:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-danger.dropdown-toggle:focus{box-shadow:0 0 0 .2rem #ef5c5580}.btn-outline-light{color:#f8f9fa;border-color:#f8f9fa}.btn-outline-light:hover{color:#212529;background-color:#f8f9fa;border-color:#f8f9fa}.btn-outline-light.focus,.btn-outline-light:focus{box-shadow:0 0 0 .2rem #f8f9fa80}.btn-outline-light.disabled,.btn-outline-light:disabled{color:#f8f9fa;background-color:initial}.btn-outline-light:not(:disabled):not(.disabled).active,.btn-outline-light:not(:disabled):not(.disabled):active,.show>.btn-outline-light.dropdown-toggle{color:#212529;background-color:#f8f9fa;border-color:#f8f9fa}.btn-outline-light:not(:disabled):not(.disabled).active:focus,.btn-outline-light:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-light.dropdown-toggle:focus{box-shadow:0 0 0 .2rem #f8f9fa80}.btn-outline-dark{color:#777;border-color:#777}.btn-outline-dark:hover{color:#fff;background-color:#777;border-color:#777}.btn-outline-dark.focus,.btn-outline-dark:focus{box-shadow:0 0 0 .2rem #77777780}.btn-outline-dark.disabled,.btn-outline-dark:disabled{color:#777;background-color:initial}.btn-outline-dark:not(:disabled):not(.disabled).active,.btn-outline-dark:not(:disabled):not(.disabled):active,.show>.btn-outline-dark.dropdown-toggle{color:#fff;background-color:#777;border-color:#777}.btn-outline-dark:not(:disabled):not(.disabled).active:focus,.btn-outline-dark:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-dark.dropdown-toggle:focus{box-shadow:0 0 0 .2rem #77777780}.btn-outline-accent{color:#ef5c55;border-color:#ef5c55}.btn-outline-accent:hover{color:#fff;background-color:#ef5c55;border-color:#ef5c55}.btn-outline-accent.focus,.btn-outline-accent:focus{box-shadow:0 0 0 .2rem #ef5c5580}.btn-outline-accent.disabled,.btn-outline-accent:disabled{color:#ef5c55;background-color:initial}.btn-outline-accent:not(:disabled):not(.disabled).active,.btn-outline-accent:not(:disabled):not(.disabled):active,.show>.btn-outline-accent.dropdown-toggle{color:#fff;background-color:#ef5c55;border-color:#ef5c55}.btn-outline-accent:not(:disabled):not(.disabled).active:focus,.btn-outline-accent:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-accent.dropdown-toggle:focus{box-shadow:0 0 0 .2rem #ef5c5580}.btn-outline-warning-dark{color:#fd7e14;border-color:#fd7e14}.btn-outline-warning-dark:hover{color:#212529;background-color:#fd7e14;border-color:#fd7e14}.btn-outline-warning-dark.focus,.btn-outline-warning-dark:focus{box-shadow:0 0 0 .2rem #fd7e1480}.btn-outline-warning-dark.disabled,.btn-outline-warning-dark:disabled{color:#fd7e14;background-color:initial}.btn-outline-warning-dark:not(:disabled):not(.disabled).active,.btn-outline-warning-dark:not(:disabled):not(.disabled):active,.show>.btn-outline-warning-dark.dropdown-toggle{color:#212529;background-color:#fd7e14;border-color:#fd7e14}.btn-outline-warning-dark:not(:disabled):not(.disabled).active:focus,.btn-outline-warning-dark:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-warning-dark.dropdown-toggle:focus{box-shadow:0 0 0 .2rem #fd7e1480}.btn-link{font-weight:400;color:#2b99a8;text-decoration:none}.btn-link:hover{color:#1b626b}.btn-link.focus,.btn-link:focus,.btn-link:hover{text-decoration:underline}.btn-link.disabled,.btn-link:disabled{color:#6c757d;pointer-events:none}.btn-group-lg>.btn,.btn-lg{padding:.5rem 1rem;font-size:1.25rem;line-height:1.5;border-radius:.3rem}.btn-group-sm>.btn,.btn-sm{padding:.25rem .5rem;font-size:.875rem;line-height:1.5;border-radius:.2rem}.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:.255em;vertical-align:.255em;content:"";border-top:.3em solid;border-right:.3em solid #0000;border-bottom:0;border-left:.3em solid #0000}.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:.5rem 0;margin:.125rem 0 0;font-size:1rem;color:#212529;text-align:left;list-style:none;background-color:#fff;background-clip:padding-box;border:1px solid #00000026;border-radius:.25rem}.dropdown-menu-left{right:auto;left:0}.dropdown-menu-right{right:0;left:auto}@media (min-width: 576px){.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: 992px){.dropdown-menu-lg-left{right:auto;left:0}.dropdown-menu-lg-right{right:0;left:auto}}@media (min-width: 1200px){.dropdown-menu-xl-left{right:auto;left:0}.dropdown-menu-xl-right{right:0;left:auto}}@media (min-width: 1450px){.dropdown-menu-2xl-left{right:auto;left:0}.dropdown-menu-2xl-right{right:0;left:auto}}.dropup .dropdown-menu{top:auto;bottom:100%;margin-top:0;margin-bottom:.125rem}.dropup .dropdown-toggle:after{display:inline-block;margin-left:.255em;vertical-align:.255em;content:"";border-top:0;border-right:.3em solid #0000;border-bottom:.3em solid;border-left:.3em solid #0000}.dropup .dropdown-toggle:empty:after{margin-left:0}.dropright .dropdown-menu{top:0;right:auto;left:100%;margin-top:0;margin-left:.125rem}.dropright .dropdown-toggle:after{display:inline-block;margin-left:.255em;vertical-align:.255em;content:"";border-top:.3em solid #0000;border-right:0;border-bottom:.3em solid #0000;border-left:.3em 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:.125rem}.dropleft .dropdown-toggle:after{display:inline-block;margin-left:.255em;vertical-align:.255em;content:"";display:none}.dropleft .dropdown-toggle:before{display:inline-block;margin-right:.255em;vertical-align:.255em;content:"";border-top:.3em solid #0000;border-right:.3em solid;border-bottom:.3em solid #0000}.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:.5rem 0;overflow:hidden;border-top:1px solid #e9ecef}.dropdown-item{display:block;width:100%;padding:.25rem 1.5rem;clear:both;font-weight:400;color:#212529;text-align:inherit;white-space:nowrap;background-color:initial;border:0}.dropdown-item:focus,.dropdown-item:hover{color:#16181b;text-decoration:none;background-color:#e9ecef}.dropdown-item.active,.dropdown-item:active{color:#fff;text-decoration:none;background-color:#2b99a8}.dropdown-item.disabled,.dropdown-item:disabled{color:#adb5bd;pointer-events:none;background-color:initial}.dropdown-menu.show{display:block}.dropdown-header{display:block;padding:.5rem 1.5rem;margin-bottom:0;font-size:.875rem;color:#6c757d;white-space:nowrap}.dropdown-item-text{display:block;padding:.25rem 1.5rem;color:#212529}.btn-group,.btn-group-vertical{position:relative;display:inline-flex;vertical-align:middle}.btn-group-vertical>.btn,.btn-group>.btn{position:relative;flex:1 1 auto}.btn-group-vertical>.btn.active,.btn-group-vertical>.btn:active,.btn-group-vertical>.btn:focus,.btn-group-vertical>.btn:hover,.btn-group>.btn.active,.btn-group>.btn:active,.btn-group>.btn:focus,.btn-group>.btn:hover{z-index:1}.btn-toolbar{display:flex;flex-wrap:wrap;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:-1px}.btn-group>.btn-group:not(:last-child)>.btn,.btn-group>.btn:not(:last-child):not(.dropdown-toggle){border-top-right-radius:0;border-bottom-right-radius:0}.btn-group>.btn-group:not(:first-child)>.btn,.btn-group>.btn:not(:first-child){border-top-left-radius:0;border-bottom-left-radius:0}.dropdown-toggle-split{padding-right:.5625rem;padding-left:.5625rem}.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:.375rem;padding-left:.375rem}.btn-group-lg>.btn+.dropdown-toggle-split,.btn-lg+.dropdown-toggle-split{padding-right:.75rem;padding-left:.75rem}.btn-group-vertical{flex-direction:column;align-items:flex-start;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:-1px}.btn-group-vertical>.btn-group:not(:last-child)>.btn,.btn-group-vertical>.btn:not(:last-child):not(.dropdown-toggle){border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn-group:not(:first-child)>.btn,.btn-group-vertical>.btn:not(:first-child){border-top-left-radius:0;border-top-right-radius:0}.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:flex;flex-wrap:wrap;align-items:stretch;width:100%}.input-group>.cd-form-control,.input-group>.custom-file,.input-group>.custom-select,.input-group>.form-control,.input-group>.form-control-plaintext{position:relative;flex:1 1 auto;width:1%;min-width:0;margin-bottom:0}.input-group>.cd-form-control+.cd-form-control,.input-group>.cd-form-control+.custom-file,.input-group>.cd-form-control+.custom-select,.input-group>.cd-form-control+.form-control,.input-group>.custom-file+.cd-form-control,.input-group>.custom-file+.custom-file,.input-group>.custom-file+.custom-select,.input-group>.custom-file+.form-control,.input-group>.custom-select+.cd-form-control,.input-group>.custom-select+.custom-file,.input-group>.custom-select+.custom-select,.input-group>.custom-select+.form-control,.input-group>.form-control+.cd-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+.cd-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:-1px}.input-group>.cd-form-control:focus,.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>.cd-form-control:not(:first-child),.input-group>.custom-select:not(:first-child),.input-group>.form-control:not(:first-child){border-top-left-radius:0;border-bottom-left-radius:0}.input-group>.custom-file{display:flex;align-items:center}.input-group>.custom-file:not(:last-child) .custom-file-label,.input-group>.custom-file:not(:last-child) .custom-file-label:after{border-top-right-radius:0;border-bottom-right-radius:0}.input-group>.custom-file:not(:first-child) .custom-file-label{border-top-left-radius:0;border-bottom-left-radius:0}.input-group.has-validation>.cd-form-control:nth-last-child(n+3),.input-group.has-validation>.custom-file:nth-last-child(n+3) .custom-file-label,.input-group.has-validation>.custom-file:nth-last-child(n+3) .custom-file-label:after,.input-group.has-validation>.custom-select:nth-last-child(n+3),.input-group.has-validation>.form-control:nth-last-child(n+3),.input-group:not(.has-validation)>.cd-form-control:not(:last-child),.input-group:not(.has-validation)>.custom-file:not(:last-child) .custom-file-label,.input-group:not(.has-validation)>.custom-file:not(:last-child) .custom-file-label:after,.input-group:not(.has-validation)>.custom-select:not(:last-child),.input-group:not(.has-validation)>.form-control:not(:last-child){border-top-right-radius:0;border-bottom-right-radius:0}.input-group-append,.input-group-prepend{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:-1px}.input-group-prepend{margin-right:-1px}.input-group-append{margin-left:-1px}.input-group-text{display:flex;align-items:center;padding:.375rem .75rem;margin-bottom:0;font-size:1rem;font-weight:400;line-height:1.5;color:#495057;text-align:center;white-space:nowrap;background-color:#e9ecef;border:1px solid #ced4da;border-radius:.25rem}.input-group-text input[type=checkbox],.input-group-text input[type=radio]{margin-top:0}.input-group-lg>.cd-form-control:not(textarea),.input-group-lg>.custom-select,.input-group-lg>.form-control:not(textarea){height:calc(1.5em + 1rem + 2px)}.input-group-lg>.cd-form-control,.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:.5rem 1rem;font-size:1.25rem;line-height:1.5;border-radius:.3rem}.input-group-sm>.cd-form-control:not(textarea),.input-group-sm>.custom-select,.input-group-sm>.form-control:not(textarea){height:calc(1.5em + .5rem + 2px)}.input-group-sm>.cd-form-control,.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:.25rem .5rem;font-size:.875rem;line-height:1.5;border-radius:.2rem}.input-group-lg>.custom-select,.input-group-sm>.custom-select{padding-right:1.75rem}.input-group.has-validation>.input-group-append:nth-last-child(n+3)>.btn,.input-group.has-validation>.input-group-append:nth-last-child(n+3)>.input-group-text,.input-group:not(.has-validation)>.input-group-append:not(:last-child)>.btn,.input-group:not(.has-validation)>.input-group-append:not(:last-child)>.input-group-text,.input-group>.input-group-append:last-child>.btn:not(:last-child):not(.dropdown-toggle),.input-group>.input-group-append:last-child>.input-group-text:not(:last-child),.input-group>.input-group-prepend>.btn,.input-group>.input-group-prepend>.input-group-text{border-top-right-radius:0;border-bottom-right-radius:0}.input-group>.input-group-append>.btn,.input-group>.input-group-append>.input-group-text,.input-group>.input-group-prepend:first-child>.btn:not(:first-child),.input-group>.input-group-prepend:first-child>.input-group-text:not(:first-child),.input-group>.input-group-prepend:not(:first-child)>.btn,.input-group>.input-group-prepend:not(:first-child)>.input-group-text{border-top-left-radius:0;border-bottom-left-radius:0}.custom-control{position:relative;z-index:1;display:block;min-height:1.5rem;padding-left:1.5rem;-webkit-print-color-adjust:exact;color-adjust:exact}.custom-control-inline{display:inline-flex;margin-right:1rem}.custom-control-input{position:absolute;left:0;z-index:-1;width:1rem;height:1.25rem;opacity:0}.custom-control-input:checked~.custom-control-label:before{color:#fff;border-color:#2b99a8;background-color:#2b99a8}.custom-control-input:focus~.custom-control-label:before{box-shadow:0 0 0 .2rem #2b99a840}.custom-control-input:focus:not(:checked)~.custom-control-label:before{border-color:#76d0dc}.custom-control-input:not(:disabled):active~.custom-control-label:before{color:#fff;background-color:#9fdee6;border-color:#9fdee6}.custom-control-input:disabled~.custom-control-label,.custom-control-input[disabled]~.custom-control-label{color:#6c757d}.custom-control-input:disabled~.custom-control-label:before,.custom-control-input[disabled]~.custom-control-label:before{background-color:#e9ecef}.custom-control-label{position:relative;margin-bottom:0;vertical-align:top}.custom-control-label:before{pointer-events:none;background-color:#fff;border:1px solid #adb5bd}.custom-control-label:after,.custom-control-label:before{position:absolute;top:.25rem;left:-1.5rem;display:block;width:1rem;height:1rem;content:""}.custom-control-label:after{background:50%/50% 50% no-repeat}.custom-checkbox .custom-control-label:before{border-radius:.25rem}.custom-checkbox .custom-control-input:checked~.custom-control-label:after{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='8' height='8' viewBox='0 0 8 8'%3e%3cpath fill='%23fff' d='M6.564.75l-3.59 3.612-1.538-1.55L0 4.26l2.974 2.99L8 2.193z'/%3e%3c/svg%3e")}.custom-checkbox .custom-control-input:indeterminate~.custom-control-label:before{border-color:#2b99a8;background-color:#2b99a8}.custom-checkbox .custom-control-input:indeterminate~.custom-control-label:after{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='4' height='4' viewBox='0 0 4 4'%3e%3cpath stroke='%23fff' d='M0 2h4'/%3e%3c/svg%3e")}.custom-checkbox .custom-control-input:disabled:checked~.custom-control-label:before,.custom-checkbox .custom-control-input:disabled:indeterminate~.custom-control-label:before{background-color:#2b99a880}.custom-radio .custom-control-label:before{border-radius:50%}.custom-radio .custom-control-input:checked~.custom-control-label:after{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='12' height='12' viewBox='-4 -4 8 8'%3e%3ccircle r='3' fill='%23fff'/%3e%3c/svg%3e")}.custom-radio .custom-control-input:disabled:checked~.custom-control-label:before{background-color:#2b99a880}.custom-switch{padding-left:2.25rem}.custom-switch .custom-control-label:before{left:-2.25rem;width:1.75rem;pointer-events:all;border-radius:.5rem}.custom-switch .custom-control-label:after{top:calc(.25rem + 2px);left:calc(-2.25rem + 2px);width:calc(1rem - 4px);height:calc(1rem - 4px);background-color:#adb5bd;border-radius:.5rem;transition:transform .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){.custom-switch .custom-control-label:after{transition:none}}.custom-switch .custom-control-input:checked~.custom-control-label:after{background-color:#fff;transform:translateX(.75rem)}.custom-switch .custom-control-input:disabled:checked~.custom-control-label:before{background-color:#2b99a880}.custom-select{display:inline-block;width:100%;height:calc(1.5em + .75rem + 2px);padding:.375rem 1.75rem .375rem .75rem;font-size:1rem;font-weight:400;line-height:1.5;color:#495057;vertical-align:middle;background:#fff url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='4' height='5' viewBox='0 0 4 5'%3e%3cpath fill='%23343a40' d='M2 0L0 2h4zm0 5L0 3h4z'/%3e%3c/svg%3e") right .75rem center/8px 10px no-repeat;border:1px solid #ced4da;border-radius:.25rem;appearance:none}.custom-select:focus{border-color:#76d0dc;outline:0;box-shadow:0 0 0 .2rem #2b99a840}.custom-select:focus::-ms-value{color:#495057;background-color:#fff}.custom-select[multiple],.custom-select[size]:not([size="1"]){height:auto;padding-right:.75rem;background-image:none}.custom-select:disabled{color:#6c757d;background-color:#e9ecef}.custom-select::-ms-expand{display:none}.custom-select:-moz-focusring{color:#0000;text-shadow:0 0 0 #495057}.custom-select-sm{height:calc(1.5em + .5rem + 2px);padding-top:.25rem;padding-bottom:.25rem;padding-left:.5rem;font-size:.875rem}.custom-select-lg{height:calc(1.5em + 1rem + 2px);padding-top:.5rem;padding-bottom:.5rem;padding-left:1rem;font-size:1.25rem}.custom-file{display:inline-block;margin-bottom:0}.custom-file,.custom-file-input{position:relative;width:100%;height:calc(1.5em + .75rem + 2px)}.custom-file-input{z-index:2;margin:0;overflow:hidden;opacity:0}.custom-file-input:focus~.custom-file-label{border-color:#76d0dc;box-shadow:0 0 0 .2rem #2b99a840}.custom-file-input:disabled~.custom-file-label,.custom-file-input[disabled]~.custom-file-label{background-color:#e9ecef}.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{left:0;z-index:1;height:calc(1.5em + .75rem + 2px);overflow:hidden;font-weight:400;background-color:#fff;border:1px solid #ced4da;border-radius:.25rem}.custom-file-label,.custom-file-label:after{position:absolute;top:0;right:0;padding:.375rem .75rem;line-height:1.5;color:#495057}.custom-file-label:after{bottom:0;z-index:3;display:block;height:calc(1.5em + .75rem);content:"Browse";background-color:#e9ecef;border-left:inherit;border-radius:0 .25rem .25rem 0}.custom-range{width:100%;height:1.4rem;padding:0;background-color:initial;appearance:none}.custom-range:focus{outline:0}.custom-range:focus::-webkit-slider-thumb{box-shadow:0 0 0 1px #fff,0 0 0 .2rem #2b99a840}.custom-range:focus::-moz-range-thumb{box-shadow:0 0 0 1px #fff,0 0 0 .2rem #2b99a840}.custom-range:focus::-ms-thumb{box-shadow:0 0 0 1px #fff,0 0 0 .2rem #2b99a840}.custom-range::-moz-focus-outer{border:0}.custom-range::-webkit-slider-thumb{width:1rem;height:1rem;margin-top:-.25rem;background-color:#2b99a8;border:0;border-radius:1rem;-webkit-transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;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::-webkit-slider-thumb{-webkit-transition:none;transition:none}}.custom-range::-webkit-slider-thumb:active{background-color:#9fdee6}.custom-range::-webkit-slider-runnable-track{width:100%;height:.5rem;color:#0000;cursor:pointer;background-color:#dee2e6;border-color:#0000;border-radius:1rem}.custom-range::-moz-range-thumb{width:1rem;height:1rem;background-color:#2b99a8;border:0;border-radius:1rem;-moz-transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;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::-moz-range-thumb{-moz-transition:none;transition:none}}.custom-range::-moz-range-thumb:active{background-color:#9fdee6}.custom-range::-moz-range-track{width:100%;height:.5rem;color:#0000;cursor:pointer;background-color:#dee2e6;border-color:#0000;border-radius:1rem}.custom-range::-ms-thumb{width:1rem;height:1rem;margin-top:0;margin-right:.2rem;margin-left:.2rem;background-color:#2b99a8;border:0;border-radius:1rem;-ms-transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;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{-ms-transition:none;transition:none}}.custom-range::-ms-thumb:active{background-color:#9fdee6}.custom-range::-ms-track{width:100%;height:.5rem;color:#0000;cursor:pointer;background-color:initial;border-color:#0000;border-width:.5rem}.custom-range::-ms-fill-lower,.custom-range::-ms-fill-upper{background-color:#dee2e6;border-radius:1rem}.custom-range::-ms-fill-upper{margin-right:15px}.custom-range:disabled::-webkit-slider-thumb{background-color:#adb5bd}.custom-range:disabled::-webkit-slider-runnable-track{cursor:default}.custom-range:disabled::-moz-range-thumb{background-color:#adb5bd}.custom-range:disabled::-moz-range-track{cursor:default}.custom-range:disabled::-ms-thumb{background-color:#adb5bd}.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:flex;flex-wrap:wrap;padding-left:0;margin-bottom:0;list-style:none}.nav-link{display:block;padding:.5rem 1rem}.nav-link:focus,.nav-link:hover{text-decoration:none}.nav-link.disabled{color:#6c757d;pointer-events:none;cursor:default}.nav-tabs{border-bottom:1px solid #dee2e6}.nav-tabs .nav-link{margin-bottom:-1px;border:1px solid #0000;border-top-left-radius:.25rem;border-top-right-radius:.25rem}.nav-tabs .nav-link:focus,.nav-tabs .nav-link:hover{border-color:#e9ecef #e9ecef #dee2e6}.nav-tabs .nav-link.disabled{color:#6c757d;background-color:initial;border-color:#0000}.nav-tabs .nav-item.show .nav-link,.nav-tabs .nav-link.active{color:#495057;background-color:#fff;border-color:#dee2e6 #dee2e6 #fff}.nav-tabs .dropdown-menu{margin-top:-1px;border-top-left-radius:0;border-top-right-radius:0}.nav-pills .nav-link{border-radius:.25rem}.nav-pills .nav-link.active,.nav-pills .show>.nav-link{color:#fff;background-color:#2b99a8}.nav-fill .nav-item,.nav-fill>.nav-link{flex:1 1 auto;text-align:center}.nav-justified .nav-item,.nav-justified>.nav-link{flex-basis:0;flex-grow:1;text-align:center}.tab-content>.tab-pane{display:none}.tab-content>.active{display:block}.navbar{position:relative;padding:.5rem 1rem}.navbar,.navbar .container,.navbar .container-fluid,.navbar .container-lg,.navbar .container-md,.navbar .container-sm,.navbar .container-xl{display:flex;flex-wrap:wrap;align-items:center;justify-content:space-between}.navbar-brand{display:inline-block;padding-top:.3125rem;padding-bottom:.3125rem;margin-right:1rem;font-size:1.25rem;line-height:inherit;white-space:nowrap}.navbar-brand:focus,.navbar-brand:hover{text-decoration:none}.navbar-nav{display:flex;flex-direction:column;padding-left:0;margin-bottom:0;list-style:none}.navbar-nav .nav-link{padding-right:0;padding-left:0}.navbar-nav .dropdown-menu{position:static;float:none}.navbar-text{display:inline-block;padding-top:.5rem;padding-bottom:.5rem}.navbar-collapse{flex-basis:100%;flex-grow:1;align-items:center}.navbar-toggler{padding:.25rem .75rem;font-size:1.25rem;line-height:1;background-color:initial;border:1px solid #0000;border-radius:.25rem}.navbar-toggler:focus,.navbar-toggler:hover{text-decoration:none}.navbar-toggler-icon{display:inline-block;width:1.5em;height:1.5em;vertical-align:middle;content:"";background:50%/100% 100% no-repeat}.navbar-nav-scroll{max-height:75vh;overflow-y:auto}@media (max-width: 575.98px){.navbar-expand-sm>.container,.navbar-expand-sm>.container-fluid,.navbar-expand-sm>.container-lg,.navbar-expand-sm>.container-md,.navbar-expand-sm>.container-sm,.navbar-expand-sm>.container-xl{padding-right:0;padding-left:0}}@media (min-width: 576px){.navbar-expand-sm{flex-flow:row nowrap;justify-content:flex-start}.navbar-expand-sm .navbar-nav{flex-direction:row}.navbar-expand-sm .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-sm .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}.navbar-expand-sm>.container,.navbar-expand-sm>.container-fluid,.navbar-expand-sm>.container-lg,.navbar-expand-sm>.container-md,.navbar-expand-sm>.container-sm,.navbar-expand-sm>.container-xl{flex-wrap:nowrap}.navbar-expand-sm .navbar-nav-scroll{overflow:visible}.navbar-expand-sm .navbar-collapse{display:flex!important;flex-basis:auto}.navbar-expand-sm .navbar-toggler{display:none}}@media (max-width: 767.98px){.navbar-expand-md>.container,.navbar-expand-md>.container-fluid,.navbar-expand-md>.container-lg,.navbar-expand-md>.container-md,.navbar-expand-md>.container-sm,.navbar-expand-md>.container-xl{padding-right:0;padding-left:0}}@media (min-width: 768px){.navbar-expand-md{flex-flow:row nowrap;justify-content:flex-start}.navbar-expand-md .navbar-nav{flex-direction:row}.navbar-expand-md .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-md .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}.navbar-expand-md>.container,.navbar-expand-md>.container-fluid,.navbar-expand-md>.container-lg,.navbar-expand-md>.container-md,.navbar-expand-md>.container-sm,.navbar-expand-md>.container-xl{flex-wrap:nowrap}.navbar-expand-md .navbar-nav-scroll{overflow:visible}.navbar-expand-md .navbar-collapse{display:flex!important;flex-basis:auto}.navbar-expand-md .navbar-toggler{display:none}}@media (max-width: 991.98px){.navbar-expand-lg>.container,.navbar-expand-lg>.container-fluid,.navbar-expand-lg>.container-lg,.navbar-expand-lg>.container-md,.navbar-expand-lg>.container-sm,.navbar-expand-lg>.container-xl{padding-right:0;padding-left:0}}@media (min-width: 992px){.navbar-expand-lg{flex-flow:row nowrap;justify-content:flex-start}.navbar-expand-lg .navbar-nav{flex-direction:row}.navbar-expand-lg .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-lg .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}.navbar-expand-lg>.container,.navbar-expand-lg>.container-fluid,.navbar-expand-lg>.container-lg,.navbar-expand-lg>.container-md,.navbar-expand-lg>.container-sm,.navbar-expand-lg>.container-xl{flex-wrap:nowrap}.navbar-expand-lg .navbar-nav-scroll{overflow:visible}.navbar-expand-lg .navbar-collapse{display:flex!important;flex-basis:auto}.navbar-expand-lg .navbar-toggler{display:none}}@media (max-width: 1199.98px){.navbar-expand-xl>.container,.navbar-expand-xl>.container-fluid,.navbar-expand-xl>.container-lg,.navbar-expand-xl>.container-md,.navbar-expand-xl>.container-sm,.navbar-expand-xl>.container-xl{padding-right:0;padding-left:0}}@media (min-width: 1200px){.navbar-expand-xl{flex-flow:row nowrap;justify-content:flex-start}.navbar-expand-xl .navbar-nav{flex-direction:row}.navbar-expand-xl .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-xl .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}.navbar-expand-xl>.container,.navbar-expand-xl>.container-fluid,.navbar-expand-xl>.container-lg,.navbar-expand-xl>.container-md,.navbar-expand-xl>.container-sm,.navbar-expand-xl>.container-xl{flex-wrap:nowrap}.navbar-expand-xl .navbar-nav-scroll{overflow:visible}.navbar-expand-xl .navbar-collapse{display:flex!important;flex-basis:auto}.navbar-expand-xl .navbar-toggler{display:none}}@media (max-width: 1449.98px){.navbar-expand-2xl>.container,.navbar-expand-2xl>.container-fluid,.navbar-expand-2xl>.container-lg,.navbar-expand-2xl>.container-md,.navbar-expand-2xl>.container-sm,.navbar-expand-2xl>.container-xl{padding-right:0;padding-left:0}}@media (min-width: 1450px){.navbar-expand-2xl{flex-flow:row nowrap;justify-content:flex-start}.navbar-expand-2xl .navbar-nav{flex-direction:row}.navbar-expand-2xl .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-2xl .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}.navbar-expand-2xl>.container,.navbar-expand-2xl>.container-fluid,.navbar-expand-2xl>.container-lg,.navbar-expand-2xl>.container-md,.navbar-expand-2xl>.container-sm,.navbar-expand-2xl>.container-xl{flex-wrap:nowrap}.navbar-expand-2xl .navbar-nav-scroll{overflow:visible}.navbar-expand-2xl .navbar-collapse{display:flex!important;flex-basis:auto}.navbar-expand-2xl .navbar-toggler{display:none}}.navbar-expand{flex-flow:row nowrap;justify-content:flex-start}.navbar-expand>.container,.navbar-expand>.container-fluid,.navbar-expand>.container-lg,.navbar-expand>.container-md,.navbar-expand>.container-sm,.navbar-expand>.container-xl{padding-right:0;padding-left:0}.navbar-expand .navbar-nav{flex-direction:row}.navbar-expand .navbar-nav .dropdown-menu{position:absolute}.navbar-expand .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}.navbar-expand>.container,.navbar-expand>.container-fluid,.navbar-expand>.container-lg,.navbar-expand>.container-md,.navbar-expand>.container-sm,.navbar-expand>.container-xl{flex-wrap:nowrap}.navbar-expand .navbar-nav-scroll{overflow:visible}.navbar-expand .navbar-collapse{display:flex!important;flex-basis:auto}.navbar-expand .navbar-toggler{display:none}.navbar-light .navbar-brand,.navbar-light .navbar-brand:focus,.navbar-light .navbar-brand:hover{color:#000000e6}.navbar-light .navbar-nav .nav-link{color:#00000080}.navbar-light .navbar-nav .nav-link:focus,.navbar-light .navbar-nav .nav-link:hover{color:#000000b3}.navbar-light .navbar-nav .nav-link.disabled{color:#0000004d}.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:#000000e6}.navbar-light .navbar-toggler{color:#00000080;border-color:#0000001a}.navbar-light .navbar-toggler-icon{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='30' height='30' viewBox='0 0 30 30'%3e%3cpath stroke='rgba%280, 0, 0, 0.5%29' stroke-linecap='round' stroke-miterlimit='10' stroke-width='2' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e")}.navbar-light .navbar-text{color:#00000080}.navbar-light .navbar-text a,.navbar-light .navbar-text a:focus,.navbar-light .navbar-text a:hover{color:#000000e6}.navbar-dark .navbar-brand,.navbar-dark .navbar-brand:focus,.navbar-dark .navbar-brand:hover{color:#fff}.navbar-dark .navbar-nav .nav-link{color:#ffffff80}.navbar-dark .navbar-nav .nav-link:focus,.navbar-dark .navbar-nav .nav-link:hover{color:#ffffffbf}.navbar-dark .navbar-nav .nav-link.disabled{color:#ffffff40}.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:#fff}.navbar-dark .navbar-toggler{color:#ffffff80;border-color:#ffffff1a}.navbar-dark .navbar-toggler-icon{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='30' height='30' viewBox='0 0 30 30'%3e%3cpath stroke='rgba%28255, 255, 255, 0.5%29' stroke-linecap='round' stroke-miterlimit='10' stroke-width='2' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e")}.navbar-dark .navbar-text{color:#ffffff80}.navbar-dark .navbar-text a,.navbar-dark .navbar-text a:focus,.navbar-dark .navbar-text a:hover{color:#fff}.card,pre:not(cd-api-docs *){position:relative;display:flex;flex-direction:column;min-width:0;word-wrap:break-word;background-color:#fff;background-clip:initial;border:1px solid rgba(0,0,0,.125);border-radius:.25rem}.card>hr,pre:not(cd-api-docs *)>hr{margin-right:0;margin-left:0}.card>.list-group,pre:not(cd-api-docs *)>.list-group{border-top:inherit;border-bottom:inherit}.card>.list-group:first-child,pre:not(cd-api-docs *)>.list-group:first-child{border-top-width:0;border-top-left-radius:calc(.25rem - 1px);border-top-right-radius:calc(.25rem - 1px)}.card>.list-group:last-child,pre:not(cd-api-docs *)>.list-group:last-child{border-bottom-width:0;border-bottom-right-radius:calc(.25rem - 1px);border-bottom-left-radius:calc(.25rem - 1px)}.card>.card-header+.list-group,.card>.list-group+.card-footer,pre:not(cd-api-docs *)>.card-header+.list-group,pre:not(cd-api-docs *)>.list-group+.card-footer{border-top:0}.card-body{flex:1 1 auto;min-height:1px;padding:1.25rem}.card-title{margin-bottom:.75rem}.card-subtitle{margin-top:-.375rem}.card-subtitle,.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;background-color:#f8f9fa;border-bottom:1px solid rgba(0,0,0,.125)}.card-header:first-child{border-radius:calc(.25rem - 1px) calc(.25rem - 1px) 0 0}.card-footer{padding:.75rem 1.25rem;background-color:#f8f9fa;border-top:1px solid rgba(0,0,0,.125)}.card-footer:last-child{border-radius:0 0 calc(.25rem - 1px) calc(.25rem - 1px)}.card-header-tabs{margin-bottom:-.75rem;border-bottom:0}.card-header-pills,.card-header-tabs{margin-right:-.625rem;margin-left:-.625rem}.card-img-overlay{position:absolute;top:0;right:0;bottom:0;left:0;padding:1.25rem;border-radius:calc(.25rem - 1px)}.card-img,.card-img-bottom,.card-img-top{flex-shrink:0;width:100%}.card-img,.card-img-top{border-top-left-radius:calc(.25rem - 1px);border-top-right-radius:calc(.25rem - 1px)}.card-img,.card-img-bottom{border-bottom-right-radius:calc(.25rem - 1px);border-bottom-left-radius:calc(.25rem - 1px)}.card-deck .card,.card-deck pre:not(cd-api-docs *){margin-bottom:15px}@media (min-width: 576px){.card-deck{display:flex;flex-flow:row wrap;margin-right:-15px;margin-left:-15px}.card-deck .card,.card-deck pre:not(cd-api-docs *){flex:1 0 0%;margin-right:15px;margin-bottom:0;margin-left:15px}}.card-group>.card,.card-group>pre:not(cd-api-docs *){margin-bottom:15px}@media (min-width: 576px){.card-group{display:flex;flex-flow:row wrap}.card-group>.card,.card-group>pre:not(cd-api-docs *){flex:1 0 0%;margin-bottom:0}.card-group>.card+.card,.card-group>.card+pre:not(cd-api-docs *),.card-group>pre:not(cd-api-docs *)+.card,.card-group>pre:not(cd-api-docs *)+pre:not(cd-api-docs *){margin-left:0;border-left:0}.card-group>.card:not(:last-child),.card-group>pre:not(:last-child):not(cd-api-docs *){border-top-right-radius:0;border-bottom-right-radius:0}.card-group>.card:not(:last-child) .card-header,.card-group>.card:not(:last-child) .card-img-top,.card-group>pre:not(:last-child):not(cd-api-docs *) .card-header,.card-group>pre:not(:last-child):not(cd-api-docs *) .card-img-top{border-top-right-radius:0}.card-group>.card:not(:last-child) .card-footer,.card-group>.card:not(:last-child) .card-img-bottom,.card-group>pre:not(:last-child):not(cd-api-docs *) .card-footer,.card-group>pre:not(:last-child):not(cd-api-docs *) .card-img-bottom{border-bottom-right-radius:0}.card-group>.card:not(:first-child),.card-group>pre:not(:first-child):not(cd-api-docs *){border-top-left-radius:0;border-bottom-left-radius:0}.card-group>.card:not(:first-child) .card-header,.card-group>.card:not(:first-child) .card-img-top,.card-group>pre:not(:first-child):not(cd-api-docs *) .card-header,.card-group>pre:not(:first-child):not(cd-api-docs *) .card-img-top{border-top-left-radius:0}.card-group>.card:not(:first-child) .card-footer,.card-group>.card:not(:first-child) .card-img-bottom,.card-group>pre:not(:first-child):not(cd-api-docs *) .card-footer,.card-group>pre:not(:first-child):not(cd-api-docs *) .card-img-bottom{border-bottom-left-radius:0}}.card-columns .card,.card-columns pre:not(cd-api-docs *){margin-bottom:.75rem}@media (min-width: 576px){.card-columns{column-count:3;grid-column-gap:1.25rem;column-gap:1.25rem;orphans:1;widows:1}.card-columns .card,.card-columns pre:not(cd-api-docs *){display:inline-block;width:100%}}.accordion{overflow-anchor:none}.accordion>.card,.accordion>pre:not(cd-api-docs *){overflow:hidden}.accordion>.card:not(:last-of-type),.accordion>pre:not(:last-of-type):not(cd-api-docs *){border-bottom:0;border-bottom-right-radius:0;border-bottom-left-radius:0}.accordion>.card:not(:first-of-type),.accordion>pre:not(:first-of-type):not(cd-api-docs *){border-top-left-radius:0;border-top-right-radius:0}.accordion>.card>.card-header,.accordion>pre:not(cd-api-docs *)>.card-header{border-radius:0;margin-bottom:-1px}.breadcrumb{display:flex;flex-wrap:wrap;padding:.75rem 1rem;margin-bottom:1rem;list-style:none;background-color:#e9ecef;border-radius:.25rem}.breadcrumb-item+.breadcrumb-item{padding-left:.5rem}.breadcrumb-item+.breadcrumb-item:before{float:left;padding-right:.5rem;color:#6c757d;content:"/"}.breadcrumb-item+.breadcrumb-item:hover:before{text-decoration:underline;text-decoration:none}.breadcrumb-item.active{color:#6c757d}.pagination,cd-table .cd-datatable .datatable-footer .datatable-pager ul{display:flex;padding-left:0;list-style:none;border-radius:.25rem}.page-link,cd-table .cd-datatable .datatable-footer .datatable-pager ul li a{position:relative;display:block;padding:.5rem .75rem;margin-left:-1px;line-height:1.25;color:#2b99a8;background-color:#fff;border:1px solid #dee2e6}.page-link:hover,cd-table .cd-datatable .datatable-footer .datatable-pager ul li a:hover{z-index:2;color:#1b626b;text-decoration:none;background-color:#e9ecef;border-color:#dee2e6}.page-link:focus,cd-table .cd-datatable .datatable-footer .datatable-pager ul li a:focus{z-index:3;outline:0;box-shadow:0 0 0 .2rem #2b99a840}.page-item:first-child .page-link,.page-item:first-child cd-table .cd-datatable .datatable-footer .datatable-pager ul li a,cd-table .cd-datatable .datatable-footer .datatable-pager ul li .page-item:first-child a,cd-table .cd-datatable .datatable-footer .datatable-pager ul li:first-child .page-link,cd-table .cd-datatable .datatable-footer .datatable-pager ul li:first-child a{margin-left:0;border-top-left-radius:.25rem;border-bottom-left-radius:.25rem}.page-item:last-child .page-link,.page-item:last-child cd-table .cd-datatable .datatable-footer .datatable-pager ul li a,cd-table .cd-datatable .datatable-footer .datatable-pager ul li .page-item:last-child a,cd-table .cd-datatable .datatable-footer .datatable-pager ul li:last-child .page-link,cd-table .cd-datatable .datatable-footer .datatable-pager ul li:last-child a{border-top-right-radius:.25rem;border-bottom-right-radius:.25rem}.page-item.active .page-link,.page-item.active cd-table .cd-datatable .datatable-footer .datatable-pager ul li a,cd-table .cd-datatable .datatable-footer .datatable-pager ul li .page-item.active a,cd-table .cd-datatable .datatable-footer .datatable-pager ul li.active .page-link,cd-table .cd-datatable .datatable-footer .datatable-pager ul li.active a{z-index:3;color:#fff;background-color:#2b99a8;border-color:#2b99a8}.page-item.disabled .page-link,.page-item.disabled cd-table .cd-datatable .datatable-footer .datatable-pager ul li a,cd-table .cd-datatable .datatable-footer .datatable-pager ul li .page-item.disabled a,cd-table .cd-datatable .datatable-footer .datatable-pager ul li.disabled .page-link,cd-table .cd-datatable .datatable-footer .datatable-pager ul li.disabled a{color:#6c757d;pointer-events:none;cursor:auto;background-color:#fff;border-color:#dee2e6}.pagination-lg .page-link,.pagination-lg cd-table .cd-datatable .datatable-footer .datatable-pager ul li a,cd-table .cd-datatable .datatable-footer .datatable-pager ul li .pagination-lg a{padding:.75rem 1.5rem;font-size:1.25rem;line-height:1.5}.pagination-lg .page-item:first-child .page-link,.pagination-lg .page-item:first-child cd-table .cd-datatable .datatable-footer .datatable-pager ul li a,.pagination-lg cd-table .cd-datatable .datatable-footer .datatable-pager ul li:first-child .page-link,.pagination-lg cd-table .cd-datatable .datatable-footer .datatable-pager ul li:first-child a,cd-table .cd-datatable .datatable-footer .datatable-pager ul .pagination-lg li:first-child .page-link,cd-table .cd-datatable .datatable-footer .datatable-pager ul .pagination-lg li:first-child a,cd-table .cd-datatable .datatable-footer .datatable-pager ul li .pagination-lg .page-item:first-child a{border-top-left-radius:.3rem;border-bottom-left-radius:.3rem}.pagination-lg .page-item:last-child .page-link,.pagination-lg .page-item:last-child cd-table .cd-datatable .datatable-footer .datatable-pager ul li a,.pagination-lg cd-table .cd-datatable .datatable-footer .datatable-pager ul li:last-child .page-link,.pagination-lg cd-table .cd-datatable .datatable-footer .datatable-pager ul li:last-child a,cd-table .cd-datatable .datatable-footer .datatable-pager ul .pagination-lg li:last-child .page-link,cd-table .cd-datatable .datatable-footer .datatable-pager ul .pagination-lg li:last-child a,cd-table .cd-datatable .datatable-footer .datatable-pager ul li .pagination-lg .page-item:last-child a{border-top-right-radius:.3rem;border-bottom-right-radius:.3rem}.pagination-sm .page-link,.pagination-sm cd-table .cd-datatable .datatable-footer .datatable-pager ul li a,cd-table .cd-datatable .datatable-footer .datatable-pager ul li .pagination-sm a{padding:.25rem .5rem;font-size:.875rem;line-height:1.5}.pagination-sm .page-item:first-child .page-link,.pagination-sm .page-item:first-child cd-table .cd-datatable .datatable-footer .datatable-pager ul li a,.pagination-sm cd-table .cd-datatable .datatable-footer .datatable-pager ul li:first-child .page-link,.pagination-sm cd-table .cd-datatable .datatable-footer .datatable-pager ul li:first-child a,cd-table .cd-datatable .datatable-footer .datatable-pager ul .pagination-sm li:first-child .page-link,cd-table .cd-datatable .datatable-footer .datatable-pager ul .pagination-sm li:first-child a,cd-table .cd-datatable .datatable-footer .datatable-pager ul li .pagination-sm .page-item:first-child a{border-top-left-radius:.2rem;border-bottom-left-radius:.2rem}.pagination-sm .page-item:last-child .page-link,.pagination-sm .page-item:last-child cd-table .cd-datatable .datatable-footer .datatable-pager ul li a,.pagination-sm cd-table .cd-datatable .datatable-footer .datatable-pager ul li:last-child .page-link,.pagination-sm cd-table .cd-datatable .datatable-footer .datatable-pager ul li:last-child a,cd-table .cd-datatable .datatable-footer .datatable-pager ul .pagination-sm li:last-child .page-link,cd-table .cd-datatable .datatable-footer .datatable-pager ul .pagination-sm li:last-child a,cd-table .cd-datatable .datatable-footer .datatable-pager ul li .pagination-sm .page-item:last-child a{border-top-right-radius:.2rem;border-bottom-right-radius:.2rem}.badge{display:inline-block;padding:.25em .4em;font-size:1rem;font-weight:700;line-height:1;text-align:center;white-space:nowrap;vertical-align:initial;border-radius:.25rem;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:.6em;padding-left:.6em;border-radius:10rem}.badge-primary{color:#fff;background-color:#2b99a8}a.badge-primary:focus,a.badge-primary:hover{color:#fff;background-color:#21747f}a.badge-primary.focus,a.badge-primary:focus{outline:0;box-shadow:0 0 0 .2rem #2b99a880}.badge-secondary{color:#fff;background-color:#374249}a.badge-secondary:focus,a.badge-secondary:hover{color:#fff;background-color:#21282c}a.badge-secondary.focus,a.badge-secondary:focus{outline:0;box-shadow:0 0 0 .2rem #37424980}.badge-success{color:#fff;background-color:#0b0}a.badge-success:focus,a.badge-success:hover{color:#fff;background-color:#080}a.badge-success.focus,a.badge-success:focus{outline:0;box-shadow:0 0 0 .2rem #00bb0080}.badge-info{color:#fff;background-color:#2b99a8}a.badge-info:focus,a.badge-info:hover{color:#fff;background-color:#21747f}a.badge-info.focus,a.badge-info:focus{outline:0;box-shadow:0 0 0 .2rem #2b99a880}.badge-warning{color:#212529;background-color:#ffc200}a.badge-warning:focus,a.badge-warning:hover{color:#212529;background-color:#cc9b00}a.badge-warning.focus,a.badge-warning:focus{outline:0;box-shadow:0 0 0 .2rem #ffc20080}.badge-danger{color:#fff;background-color:#ef5c55}a.badge-danger:focus,a.badge-danger:hover{color:#fff;background-color:#eb2f26}a.badge-danger.focus,a.badge-danger:focus{outline:0;box-shadow:0 0 0 .2rem #ef5c5580}.badge-light{color:#212529;background-color:#f8f9fa}a.badge-light:focus,a.badge-light:hover{color:#212529;background-color:#dae0e5}a.badge-light.focus,a.badge-light:focus{outline:0;box-shadow:0 0 0 .2rem #f8f9fa80}.badge-dark{color:#fff;background-color:#777}a.badge-dark:focus,a.badge-dark:hover{color:#fff;background-color:#5e5e5e}a.badge-dark.focus,a.badge-dark:focus{outline:0;box-shadow:0 0 0 .2rem #77777780}.badge-accent{color:#fff;background-color:#ef5c55}a.badge-accent:focus,a.badge-accent:hover{color:#fff;background-color:#eb2f26}a.badge-accent.focus,a.badge-accent:focus{outline:0;box-shadow:0 0 0 .2rem #ef5c5580}.badge-warning-dark{color:#212529;background-color:#fd7e14}a.badge-warning-dark:focus,a.badge-warning-dark:hover{color:#212529;background-color:#dc6502}a.badge-warning-dark.focus,a.badge-warning-dark:focus{outline:0;box-shadow:0 0 0 .2rem #fd7e1480}.jumbotron{padding:2rem 1rem;margin-bottom:2rem;background-color:#e9ecef;border-radius:.3rem}@media (min-width: 576px){.jumbotron{padding:4rem 2rem}}.jumbotron-fluid{padding-right:0;padding-left:0;border-radius:0}.alert{position:relative;padding:.75rem 1.25rem;margin-bottom:1rem;border:1px solid #0000;border-radius:.25rem}.alert-heading{color:inherit}.alert-link{font-weight:700}.alert-dismissible{padding-right:4rem}.alert-dismissible .close{position:absolute;top:0;right:0;z-index:2;padding:.75rem 1.25rem;color:inherit}.alert-primary{color:#165057;background-color:#d5ebee;border-color:#c4e2e7}.alert-primary hr{border-top-color:#b2d9e0}.alert-primary .alert-link{color:#0c2b2e}.alert-secondary{color:#1d2226;background-color:#d7d9db;border-color:#c7cacc}.alert-secondary hr{border-top-color:#babdc0}.alert-secondary .alert-link{color:#070809}.alert-success{color:#006100;background-color:#ccf1cc;border-color:#b8ecb8}.alert-success hr{border-top-color:#a4e7a4}.alert-success .alert-link{color:#002e00}.alert-info{color:#165057;background-color:#d5ebee;border-color:#c4e2e7}.alert-info hr{border-top-color:#b2d9e0}.alert-info .alert-link{color:#0c2b2e}.alert-warning{color:#856500;background-color:#fff3cc;border-color:#ffeeb8}.alert-warning hr{border-top-color:#ffe89f}.alert-warning .alert-link{color:#523e00}.alert-danger{color:#7c302c;background-color:#fcdedd;border-color:#fbd1cf}.alert-danger hr{border-top-color:#f9bab7}.alert-danger .alert-link{color:#56211f}.alert-light{color:#818182;background-color:#fefefe;border-color:#fdfdfe}.alert-light hr{border-top-color:#ececf6}.alert-light .alert-link{color:#686868}.alert-dark{color:#3e3e3e;background-color:#e4e4e4;border-color:#d9d9d9}.alert-dark hr{border-top-color:#ccc}.alert-dark .alert-link{color:#252525}.alert-accent{color:#7c302c;background-color:#fcdedd;border-color:#fbd1cf}.alert-accent hr{border-top-color:#f9bab7}.alert-accent .alert-link{color:#56211f}.alert-warning-dark{color:#84420a;background-color:#ffe5d0;border-color:#fedbbd}.alert-warning-dark hr{border-top-color:#fecda4}.alert-warning-dark .alert-link{color:#552a06}@keyframes progress-bar-stripes{0%{background-position:1rem 0}to{background-position:0 0}}.progress{height:1rem;line-height:0;font-size:.75rem;background-color:#e9ecef;border-radius:.25rem}.progress,.progress-bar{display:flex;overflow:hidden}.progress-bar{flex-direction:column;justify-content:center;color:#fff;text-align:center;white-space:nowrap;background-color:#2b99a8;transition:width .6s ease}@media (prefers-reduced-motion: reduce){.progress-bar{transition:none}}.progress-bar-striped{background-image:linear-gradient(45deg,#ffffff26 25%,#0000 0,#0000 50%,#ffffff26 0,#ffffff26 75%,#0000 0,#0000);background-size:1rem 1rem}.progress-bar-animated{animation:progress-bar-stripes 1s linear infinite}@media (prefers-reduced-motion: reduce){.progress-bar-animated{animation:none}}.media{display:flex;align-items:flex-start}.media-body{flex:1}.list-group{display:flex;flex-direction:column;padding-left:0;margin-bottom:0;border-radius:.25rem}.list-group-item-action{width:100%;color:#495057;text-align:inherit}.list-group-item-action:focus,.list-group-item-action:hover{z-index:1;color:#495057;text-decoration:none;background-color:#f8f9fa}.list-group-item-action:active{color:#212529;background-color:#e9ecef}.list-group-item{position:relative;display:block;padding:.75rem 1.25rem;background-color:#fff;border:1px solid rgba(0,0,0,.125)}.list-group-item:first-child{border-top-left-radius:inherit;border-top-right-radius:inherit}.list-group-item:last-child{border-bottom-right-radius:inherit;border-bottom-left-radius:inherit}.list-group-item.disabled,.list-group-item:disabled{color:#6c757d;pointer-events:none;background-color:#fff}.list-group-item.active{z-index:2;color:#fff;background-color:#2b99a8;border-color:#2b99a8}.list-group-item+.list-group-item{border-top-width:0}.list-group-item+.list-group-item.active{margin-top:-1px;border-top-width:1px}.list-group-horizontal{flex-direction:row}.list-group-horizontal>.list-group-item:first-child{border-bottom-left-radius:.25rem;border-top-right-radius:0}.list-group-horizontal>.list-group-item:last-child{border-top-right-radius:.25rem;border-bottom-left-radius:0}.list-group-horizontal>.list-group-item.active{margin-top:0}.list-group-horizontal>.list-group-item+.list-group-item{border-top-width:1px;border-left-width:0}.list-group-horizontal>.list-group-item+.list-group-item.active{margin-left:-1px;border-left-width:1px}@media (min-width: 576px){.list-group-horizontal-sm{flex-direction:row}.list-group-horizontal-sm>.list-group-item:first-child{border-bottom-left-radius:.25rem;border-top-right-radius:0}.list-group-horizontal-sm>.list-group-item:last-child{border-top-right-radius:.25rem;border-bottom-left-radius:0}.list-group-horizontal-sm>.list-group-item.active{margin-top:0}.list-group-horizontal-sm>.list-group-item+.list-group-item{border-top-width:1px;border-left-width:0}.list-group-horizontal-sm>.list-group-item+.list-group-item.active{margin-left:-1px;border-left-width:1px}}@media (min-width: 768px){.list-group-horizontal-md{flex-direction:row}.list-group-horizontal-md>.list-group-item:first-child{border-bottom-left-radius:.25rem;border-top-right-radius:0}.list-group-horizontal-md>.list-group-item:last-child{border-top-right-radius:.25rem;border-bottom-left-radius:0}.list-group-horizontal-md>.list-group-item.active{margin-top:0}.list-group-horizontal-md>.list-group-item+.list-group-item{border-top-width:1px;border-left-width:0}.list-group-horizontal-md>.list-group-item+.list-group-item.active{margin-left:-1px;border-left-width:1px}}@media (min-width: 992px){.list-group-horizontal-lg{flex-direction:row}.list-group-horizontal-lg>.list-group-item:first-child{border-bottom-left-radius:.25rem;border-top-right-radius:0}.list-group-horizontal-lg>.list-group-item:last-child{border-top-right-radius:.25rem;border-bottom-left-radius:0}.list-group-horizontal-lg>.list-group-item.active{margin-top:0}.list-group-horizontal-lg>.list-group-item+.list-group-item{border-top-width:1px;border-left-width:0}.list-group-horizontal-lg>.list-group-item+.list-group-item.active{margin-left:-1px;border-left-width:1px}}@media (min-width: 1200px){.list-group-horizontal-xl{flex-direction:row}.list-group-horizontal-xl>.list-group-item:first-child{border-bottom-left-radius:.25rem;border-top-right-radius:0}.list-group-horizontal-xl>.list-group-item:last-child{border-top-right-radius:.25rem;border-bottom-left-radius:0}.list-group-horizontal-xl>.list-group-item.active{margin-top:0}.list-group-horizontal-xl>.list-group-item+.list-group-item{border-top-width:1px;border-left-width:0}.list-group-horizontal-xl>.list-group-item+.list-group-item.active{margin-left:-1px;border-left-width:1px}}@media (min-width: 1450px){.list-group-horizontal-2xl{flex-direction:row}.list-group-horizontal-2xl>.list-group-item:first-child{border-bottom-left-radius:.25rem;border-top-right-radius:0}.list-group-horizontal-2xl>.list-group-item:last-child{border-top-right-radius:.25rem;border-bottom-left-radius:0}.list-group-horizontal-2xl>.list-group-item.active{margin-top:0}.list-group-horizontal-2xl>.list-group-item+.list-group-item{border-top-width:1px;border-left-width:0}.list-group-horizontal-2xl>.list-group-item+.list-group-item.active{margin-left:-1px;border-left-width:1px}}.list-group-flush{border-radius:0}.list-group-flush>.list-group-item{border-width:0 0 1px}.list-group-flush>.list-group-item:last-child{border-bottom-width:0}.list-group-item-primary{color:#165057;background-color:#c4e2e7}.list-group-item-primary.list-group-item-action:focus,.list-group-item-primary.list-group-item-action:hover{color:#165057;background-color:#b2d9e0}.list-group-item-primary.list-group-item-action.active{color:#fff;background-color:#165057;border-color:#165057}.list-group-item-secondary{color:#1d2226;background-color:#c7cacc}.list-group-item-secondary.list-group-item-action:focus,.list-group-item-secondary.list-group-item-action:hover{color:#1d2226;background-color:#babdc0}.list-group-item-secondary.list-group-item-action.active{color:#fff;background-color:#1d2226;border-color:#1d2226}.list-group-item-success{color:#006100;background-color:#b8ecb8}.list-group-item-success.list-group-item-action:focus,.list-group-item-success.list-group-item-action:hover{color:#006100;background-color:#a4e7a4}.list-group-item-success.list-group-item-action.active{color:#fff;background-color:#006100;border-color:#006100}.list-group-item-info{color:#165057;background-color:#c4e2e7}.list-group-item-info.list-group-item-action:focus,.list-group-item-info.list-group-item-action:hover{color:#165057;background-color:#b2d9e0}.list-group-item-info.list-group-item-action.active{color:#fff;background-color:#165057;border-color:#165057}.list-group-item-warning{color:#856500;background-color:#ffeeb8}.list-group-item-warning.list-group-item-action:focus,.list-group-item-warning.list-group-item-action:hover{color:#856500;background-color:#ffe89f}.list-group-item-warning.list-group-item-action.active{color:#fff;background-color:#856500;border-color:#856500}.list-group-item-danger{color:#7c302c;background-color:#fbd1cf}.list-group-item-danger.list-group-item-action:focus,.list-group-item-danger.list-group-item-action:hover{color:#7c302c;background-color:#f9bab7}.list-group-item-danger.list-group-item-action.active{color:#fff;background-color:#7c302c;border-color:#7c302c}.list-group-item-light{color:#818182;background-color:#fdfdfe}.list-group-item-light.list-group-item-action:focus,.list-group-item-light.list-group-item-action:hover{color:#818182;background-color:#ececf6}.list-group-item-light.list-group-item-action.active{color:#fff;background-color:#818182;border-color:#818182}.list-group-item-dark{color:#3e3e3e;background-color:#d9d9d9}.list-group-item-dark.list-group-item-action:focus,.list-group-item-dark.list-group-item-action:hover{color:#3e3e3e;background-color:#ccc}.list-group-item-dark.list-group-item-action.active{color:#fff;background-color:#3e3e3e;border-color:#3e3e3e}.list-group-item-accent{color:#7c302c;background-color:#fbd1cf}.list-group-item-accent.list-group-item-action:focus,.list-group-item-accent.list-group-item-action:hover{color:#7c302c;background-color:#f9bab7}.list-group-item-accent.list-group-item-action.active{color:#fff;background-color:#7c302c;border-color:#7c302c}.list-group-item-warning-dark{color:#84420a;background-color:#fedbbd}.list-group-item-warning-dark.list-group-item-action:focus,.list-group-item-warning-dark.list-group-item-action:hover{color:#84420a;background-color:#fecda4}.list-group-item-warning-dark.list-group-item-action.active{color:#fff;background-color:#84420a;border-color:#84420a}.close{float:right;font-size:1.5rem;font-weight:700;line-height:1;color:#000;text-shadow:0 1px 0 #fff;opacity:.5}.close:hover{color:#000;text-decoration:none}.close:not(:disabled):not(.disabled):focus,.close:not(:disabled):not(.disabled):hover{opacity:.75}button.close{padding:0;background-color:initial;border:0}a.close.disabled{pointer-events:none}.toast{flex-basis:350px;max-width:350px;font-size:.875rem;background-color:#ffffffd9;background-clip:padding-box;border:1px solid #0000001a;box-shadow:0 .25rem .75rem #0000001a;opacity:0;border-radius:.25rem}.toast:not(:last-child){margin-bottom:.75rem}.toast.showing{opacity:1}.toast.show{display:block;opacity:1}.toast.hide{display:none}.toast-header{display:flex;align-items:center;padding:.25rem .75rem;color:#6c757d;background-color:#ffffffd9;background-clip:padding-box;border-bottom:1px solid #0000000d;border-top-left-radius:calc(.25rem - 1px);border-top-right-radius:calc(.25rem - 1px)}.toast-body{padding:.75rem}.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:.5rem;pointer-events:none}.modal.fade .modal-dialog{transition:transform .3s ease-out;transform:translateY(-50px)}@media (prefers-reduced-motion: reduce){.modal.fade .modal-dialog{transition:none}}.modal.show .modal-dialog{transform:none}.modal.modal-static .modal-dialog{transform:scale(1.02)}.modal-dialog-scrollable{display:flex;max-height:calc(100% - 1rem)}.modal-dialog-scrollable .modal-content{max-height:calc(100vh - 1rem);overflow:hidden}.modal-dialog-scrollable .modal-footer,.modal-dialog-scrollable .modal-header{flex-shrink:0}.modal-dialog-scrollable .modal-body{overflow-y:auto}.modal-dialog-centered{display:flex;align-items:center;min-height:calc(100% - 1rem)}.modal-dialog-centered:before{display:block;height:calc(100vh - 1rem);height:min-content;content:""}.modal-dialog-centered.modal-dialog-scrollable{flex-direction:column;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:flex;flex-direction:column;width:100%;pointer-events:auto;background-color:#fff;background-clip:padding-box;border:1px solid #0003;border-radius:.3rem;outline:0}.modal-backdrop{position:fixed;top:0;left:0;z-index:1040;width:100vw;height:100vh;background-color:#000}.modal-backdrop.fade{opacity:0}.modal-backdrop.show{opacity:.5}.modal-header{display:flex;align-items:flex-start;justify-content:space-between;padding:1rem;border-bottom:1px solid #dee2e6;border-top-left-radius:calc(.3rem - 1px);border-top-right-radius:calc(.3rem - 1px)}.modal-header .close{padding:1rem;margin:-1rem -1rem -1rem auto}.modal-title{margin-bottom:0;line-height:1.5}.modal-body{position:relative;flex:1 1 auto;padding:1rem}.modal-footer{display:flex;flex-wrap:wrap;align-items:center;justify-content:flex-end;padding:.75rem;border-top:1px solid #dee2e6;border-bottom-right-radius:calc(.3rem - 1px);border-bottom-left-radius:calc(.3rem - 1px)}.modal-footer>*{margin:.25rem}.modal-scrollbar-measure{position:absolute;top:-9999px;width:50px;height:50px;overflow:scroll}@media (min-width: 576px){.modal-dialog{max-width:500px;margin:1.75rem auto}.modal-dialog-scrollable{max-height:calc(100% - 3.5rem)}.modal-dialog-scrollable .modal-content{max-height:calc(100vh - 3.5rem)}.modal-dialog-centered{min-height:calc(100% - 3.5rem)}.modal-dialog-centered:before{height:calc(100vh - 3.5rem);height:min-content}.modal-sm{max-width:300px}}@media (min-width: 992px){.modal-lg,.modal-xl{max-width:800px}}@media (min-width: 1200px){.modal-xl{max-width:1140px}}.tooltip{position:absolute;z-index:1070;display:block;margin:0;font-family:Helvetica Neue,Helvetica,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.5;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;word-wrap:break-word;opacity:0}.tooltip.show{opacity:.9}.tooltip .arrow{position:absolute;display:block;width:.8rem;height:.4rem}.tooltip .arrow:before{position:absolute;content:"";border-color:#0000;border-style:solid}.bs-tooltip-auto[x-placement^=top],.bs-tooltip-top{padding:.4rem 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:.4rem .4rem 0;border-top-color:#212529}.bs-tooltip-auto[x-placement^=right],.bs-tooltip-right{padding:0 .4rem}.bs-tooltip-auto[x-placement^=right] .arrow,.bs-tooltip-right .arrow{left:0;width:.4rem;height:.8rem}.bs-tooltip-auto[x-placement^=right] .arrow:before,.bs-tooltip-right .arrow:before{right:0;border-width:.4rem .4rem .4rem 0;border-right-color:#212529}.bs-tooltip-auto[x-placement^=bottom],.bs-tooltip-bottom{padding:.4rem 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 .4rem .4rem;border-bottom-color:#212529}.bs-tooltip-auto[x-placement^=left],.bs-tooltip-left{padding:0 .4rem}.bs-tooltip-auto[x-placement^=left] .arrow,.bs-tooltip-left .arrow{right:0;width:.4rem;height:.8rem}.bs-tooltip-auto[x-placement^=left] .arrow:before,.bs-tooltip-left .arrow:before{left:0;border-width:.4rem 0 .4rem .4rem;border-left-color:#212529}.tooltip-inner{max-width:200px;padding:.25rem .5rem;color:#fff;text-align:center;background-color:#212529;border-radius:.25rem}.popover{top:0;left:0;z-index:1060;max-width:350px;font-family:Helvetica Neue,Helvetica,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.5;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:1rem;word-wrap:break-word;background-color:#fff;background-clip:padding-box;border:1px solid #0003;border-radius:.3rem}.popover,.popover .arrow{position:absolute;display:block}.popover .arrow{width:1rem;height:.5rem;margin:0 .3rem}.popover .arrow:after,.popover .arrow:before{position:absolute;display:block;content:"";border-color:#0000;border-style:solid}.bs-popover-auto[x-placement^=top],.bs-popover-top{margin-bottom:.5rem}.bs-popover-auto[x-placement^=top]>.arrow,.bs-popover-top>.arrow{bottom:calc(-.5rem - 1px)}.bs-popover-auto[x-placement^=top]>.arrow:before,.bs-popover-top>.arrow:before{bottom:0;border-width:.5rem .5rem 0;border-top-color:#00000040}.bs-popover-auto[x-placement^=top]>.arrow:after,.bs-popover-top>.arrow:after{bottom:1px;border-width:.5rem .5rem 0;border-top-color:#fff}.bs-popover-auto[x-placement^=right],.bs-popover-right{margin-left:.5rem}.bs-popover-auto[x-placement^=right]>.arrow,.bs-popover-right>.arrow{left:calc(-.5rem - 1px);width:.5rem;height:1rem;margin:.3rem 0}.bs-popover-auto[x-placement^=right]>.arrow:before,.bs-popover-right>.arrow:before{left:0;border-width:.5rem .5rem .5rem 0;border-right-color:#00000040}.bs-popover-auto[x-placement^=right]>.arrow:after,.bs-popover-right>.arrow:after{left:1px;border-width:.5rem .5rem .5rem 0;border-right-color:#fff}.bs-popover-auto[x-placement^=bottom],.bs-popover-bottom{margin-top:.5rem}.bs-popover-auto[x-placement^=bottom]>.arrow,.bs-popover-bottom>.arrow{top:calc(-.5rem - 1px)}.bs-popover-auto[x-placement^=bottom]>.arrow:before,.bs-popover-bottom>.arrow:before{top:0;border-width:0 .5rem .5rem;border-bottom-color:#00000040}.bs-popover-auto[x-placement^=bottom]>.arrow:after,.bs-popover-bottom>.arrow:after{top:1px;border-width:0 .5rem .5rem;border-bottom-color:#fff}.bs-popover-auto[x-placement^=bottom] .popover-header:before,.bs-popover-bottom .popover-header:before{position:absolute;top:0;left:50%;display:block;width:1rem;margin-left:-.5rem;content:"";border-bottom:1px solid #f7f7f7}.bs-popover-auto[x-placement^=left],.bs-popover-left{margin-right:.5rem}.bs-popover-auto[x-placement^=left]>.arrow,.bs-popover-left>.arrow{right:calc(-.5rem - 1px);width:.5rem;height:1rem;margin:.3rem 0}.bs-popover-auto[x-placement^=left]>.arrow:before,.bs-popover-left>.arrow:before{right:0;border-width:.5rem 0 .5rem .5rem;border-left-color:#00000040}.bs-popover-auto[x-placement^=left]>.arrow:after,.bs-popover-left>.arrow:after{right:1px;border-width:.5rem 0 .5rem .5rem;border-left-color:#fff}.popover-header{padding:.5rem .75rem;margin-bottom:0;font-size:1rem;background-color:#f7f7f7;border-bottom:1px solid #ebebeb;border-top-left-radius:calc(.3rem - 1px);border-top-right-radius:calc(.3rem - 1px)}.popover-header:empty{display:none}.popover-body{padding:.5rem .75rem;color:#212529}.carousel{position:relative}.carousel.pointer-event{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%;backface-visibility:hidden;transition: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){transform:translateX(100%)}.active.carousel-item-left,.carousel-item-prev:not(.carousel-item-right){transform:translateX(-100%)}.carousel-fade .carousel-item{opacity:0;transition-property:opacity;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:opacity 0s .6s}@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:flex;align-items:center;justify-content:center;width:15%;padding:0;color:#fff;text-align:center;background:none;border:0;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:#fff;text-decoration:none;outline:0;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:50%/100% 100% no-repeat}.carousel-control-prev-icon{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' fill='%23fff' width='8' height='8' viewBox='0 0 8 8'%3e%3cpath d='M5.25 0l-4 4 4 4 1.5-1.5L4.25 4l2.5-2.5L5.25 0z'/%3e%3c/svg%3e")}.carousel-control-next-icon{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' fill='%23fff' width='8' height='8' viewBox='0 0 8 8'%3e%3cpath d='M2.75 0l-1.5 1.5L3.75 4l-2.5 2.5L2.75 8l4-4-4-4z'/%3e%3c/svg%3e")}.carousel-indicators{position:absolute;right:0;bottom:0;left:0;z-index:15;display:flex;justify-content:center;padding-left:0;margin-right:15%;margin-left:15%;list-style:none}.carousel-indicators li{box-sizing:initial;flex:0 1 auto;width:30px;height:3px;margin-right:3px;margin-left:3px;text-indent:-999px;cursor:pointer;background-color:#fff;background-clip:padding-box;border-top:10px solid #0000;border-bottom:10px solid #0000;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:#fff;text-align:center}@keyframes spinner-border{to{transform:rotate(1turn)}}.spinner-border{display:inline-block;width:2rem;height:2rem;vertical-align:-.125em;border:.25em solid;border-right:.25em solid #0000;border-radius:50%;animation:spinner-border .75s linear infinite}.spinner-border-sm{width:1rem;height:1rem;border-width:.2em}@keyframes spinner-grow{0%{transform:scale(0)}50%{opacity:1;transform:none}}.spinner-grow{display:inline-block;width:2rem;height:2rem;vertical-align:-.125em;background-color:currentColor;border-radius:50%;opacity:0;animation:spinner-grow .75s linear infinite}.spinner-grow-sm{width:1rem;height:1rem}@media (prefers-reduced-motion: reduce){.spinner-border,.spinner-grow{animation-duration:1.5s}}.align-baseline{vertical-align:initial!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:#2b99a8!important}a.bg-primary:focus,a.bg-primary:hover,button.bg-primary:focus,button.bg-primary:hover{background-color:#21747f!important}.bg-secondary{background-color:#374249!important}a.bg-secondary:focus,a.bg-secondary:hover,button.bg-secondary:focus,button.bg-secondary:hover{background-color:#21282c!important}.bg-success{background-color:#0b0!important}a.bg-success:focus,a.bg-success:hover,button.bg-success:focus,button.bg-success:hover{background-color:#080!important}.bg-info{background-color:#2b99a8!important}a.bg-info:focus,a.bg-info:hover,button.bg-info:focus,button.bg-info:hover{background-color:#21747f!important}.bg-warning{background-color:#ffc200!important}a.bg-warning:focus,a.bg-warning:hover,button.bg-warning:focus,button.bg-warning:hover{background-color:#cc9b00!important}.bg-danger{background-color:#ef5c55!important}a.bg-danger:focus,a.bg-danger:hover,button.bg-danger:focus,button.bg-danger:hover{background-color:#eb2f26!important}.bg-light,pre:not(cd-api-docs *){background-color:#f8f9fa!important}a.bg-light:focus,a.bg-light:hover,button.bg-light:focus,button.bg-light:hover{background-color:#dae0e5!important}.bg-dark{background-color:#777!important}a.bg-dark:focus,a.bg-dark:hover,button.bg-dark:focus,button.bg-dark:hover{background-color:#5e5e5e!important}.bg-accent{background-color:#ef5c55!important}a.bg-accent:focus,a.bg-accent:hover,button.bg-accent:focus,button.bg-accent:hover{background-color:#eb2f26!important}.bg-warning-dark{background-color:#fd7e14!important}a.bg-warning-dark:focus,a.bg-warning-dark:hover,button.bg-warning-dark:focus,button.bg-warning-dark:hover{background-color:#dc6502!important}.bg-white{background-color:#fff!important}.bg-transparent{background-color:initial!important}.border{border:1px solid #dee2e6!important}.border-top{border-top:1px solid #dee2e6!important}.border-right{border-right:1px solid #dee2e6!important}.border-bottom,.cd-header,legend{border-bottom:1px solid #dee2e6!important}.border-left{border-left:1px solid #dee2e6!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:#2b99a8!important}.border-secondary{border-color:#374249!important}.border-success{border-color:#0b0!important}.border-info{border-color:#2b99a8!important}.border-warning{border-color:#ffc200!important}.border-danger{border-color:#ef5c55!important}.border-light{border-color:#f8f9fa!important}.border-dark{border-color:#777!important}.border-accent{border-color:#ef5c55!important}.border-warning-dark{border-color:#fd7e14!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}.rounded-right,.rounded-top{border-top-right-radius:.25rem!important}.rounded-bottom,.rounded-right{border-bottom-right-radius:.25rem!important}.rounded-bottom,.rounded-left{border-bottom-left-radius:.25rem!important}.rounded-left{border-top-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,cd-health cd-info-card{display:flex!important}.d-inline-flex{display:inline-flex!important}@media (min-width: 576px){.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:flex!important}.d-sm-inline-flex{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:flex!important}.d-md-inline-flex{display:inline-flex!important}}@media (min-width: 992px){.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:flex!important}.d-lg-inline-flex{display:inline-flex!important}}@media (min-width: 1200px){.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:flex!important}.d-xl-inline-flex{display:inline-flex!important}}@media (min-width: 1450px){.d-2xl-none{display:none!important}.d-2xl-inline{display:inline!important}.d-2xl-inline-block{display:inline-block!important}.d-2xl-block{display:block!important}.d-2xl-table{display:table!important}.d-2xl-table-row{display:table-row!important}.d-2xl-table-cell{display:table-cell!important}.d-2xl-flex{display:flex!important}.d-2xl-inline-flex{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:flex!important}.d-print-inline-flex{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.85714286%}.embed-responsive-16by9:before{padding-top:56.25%}.embed-responsive-4by3:before{padding-top:75%}.embed-responsive-1by1:before{padding-top:100%}.flex-row{flex-direction:row!important}.flex-column,cd-health cd-info-card{flex-direction:column!important}.flex-row-reverse{flex-direction:row-reverse!important}.flex-column-reverse{flex-direction:column-reverse!important}.flex-wrap{flex-wrap:wrap!important}.flex-nowrap{flex-wrap:nowrap!important}.flex-wrap-reverse{flex-wrap:wrap-reverse!important}.flex-fill{flex:1 1 auto!important}.flex-grow-0{flex-grow:0!important}.flex-grow-1{flex-grow:1!important}.flex-shrink-0{flex-shrink:0!important}.flex-shrink-1{flex-shrink:1!important}.justify-content-start{justify-content:flex-start!important}.justify-content-end{justify-content:flex-end!important}.justify-content-center{justify-content:center!important}.justify-content-between{justify-content:space-between!important}.justify-content-around{justify-content:space-around!important}.align-items-start{align-items:flex-start!important}.align-items-end{align-items:flex-end!important}.align-items-center{align-items:center!important}.align-items-baseline{align-items:baseline!important}.align-items-stretch{align-items:stretch!important}.align-content-start{align-content:flex-start!important}.align-content-end{align-content:flex-end!important}.align-content-center{align-content:center!important}.align-content-between{align-content:space-between!important}.align-content-around{align-content:space-around!important}.align-content-stretch{align-content:stretch!important}.align-self-auto{align-self:auto!important}.align-self-start{align-self:flex-start!important}.align-self-end{align-self:flex-end!important}.align-self-center{align-self:center!important}.align-self-baseline{align-self:baseline!important}.align-self-stretch{align-self:stretch!important}@media (min-width: 576px){.flex-sm-row{flex-direction:row!important}.flex-sm-column{flex-direction:column!important}.flex-sm-row-reverse{flex-direction:row-reverse!important}.flex-sm-column-reverse{flex-direction:column-reverse!important}.flex-sm-wrap{flex-wrap:wrap!important}.flex-sm-nowrap{flex-wrap:nowrap!important}.flex-sm-wrap-reverse{flex-wrap:wrap-reverse!important}.flex-sm-fill{flex:1 1 auto!important}.flex-sm-grow-0{flex-grow:0!important}.flex-sm-grow-1{flex-grow:1!important}.flex-sm-shrink-0{flex-shrink:0!important}.flex-sm-shrink-1{flex-shrink:1!important}.justify-content-sm-start{justify-content:flex-start!important}.justify-content-sm-end{justify-content:flex-end!important}.justify-content-sm-center{justify-content:center!important}.justify-content-sm-between{justify-content:space-between!important}.justify-content-sm-around{justify-content:space-around!important}.align-items-sm-start{align-items:flex-start!important}.align-items-sm-end{align-items:flex-end!important}.align-items-sm-center{align-items:center!important}.align-items-sm-baseline{align-items:baseline!important}.align-items-sm-stretch{align-items:stretch!important}.align-content-sm-start{align-content:flex-start!important}.align-content-sm-end{align-content:flex-end!important}.align-content-sm-center{align-content:center!important}.align-content-sm-between{align-content:space-between!important}.align-content-sm-around{align-content:space-around!important}.align-content-sm-stretch{align-content:stretch!important}.align-self-sm-auto{align-self:auto!important}.align-self-sm-start{align-self:flex-start!important}.align-self-sm-end{align-self:flex-end!important}.align-self-sm-center{align-self:center!important}.align-self-sm-baseline{align-self:baseline!important}.align-self-sm-stretch{align-self:stretch!important}}@media (min-width: 768px){.flex-md-row{flex-direction:row!important}.flex-md-column{flex-direction:column!important}.flex-md-row-reverse{flex-direction:row-reverse!important}.flex-md-column-reverse{flex-direction:column-reverse!important}.flex-md-wrap{flex-wrap:wrap!important}.flex-md-nowrap{flex-wrap:nowrap!important}.flex-md-wrap-reverse{flex-wrap:wrap-reverse!important}.flex-md-fill{flex:1 1 auto!important}.flex-md-grow-0{flex-grow:0!important}.flex-md-grow-1{flex-grow:1!important}.flex-md-shrink-0{flex-shrink:0!important}.flex-md-shrink-1{flex-shrink:1!important}.justify-content-md-start{justify-content:flex-start!important}.justify-content-md-end{justify-content:flex-end!important}.justify-content-md-center{justify-content:center!important}.justify-content-md-between{justify-content:space-between!important}.justify-content-md-around{justify-content:space-around!important}.align-items-md-start{align-items:flex-start!important}.align-items-md-end{align-items:flex-end!important}.align-items-md-center{align-items:center!important}.align-items-md-baseline{align-items:baseline!important}.align-items-md-stretch{align-items:stretch!important}.align-content-md-start{align-content:flex-start!important}.align-content-md-end{align-content:flex-end!important}.align-content-md-center{align-content:center!important}.align-content-md-between{align-content:space-between!important}.align-content-md-around{align-content:space-around!important}.align-content-md-stretch{align-content:stretch!important}.align-self-md-auto{align-self:auto!important}.align-self-md-start{align-self:flex-start!important}.align-self-md-end{align-self:flex-end!important}.align-self-md-center{align-self:center!important}.align-self-md-baseline{align-self:baseline!important}.align-self-md-stretch{align-self:stretch!important}}@media (min-width: 992px){.flex-lg-row{flex-direction:row!important}.flex-lg-column{flex-direction:column!important}.flex-lg-row-reverse{flex-direction:row-reverse!important}.flex-lg-column-reverse{flex-direction:column-reverse!important}.flex-lg-wrap{flex-wrap:wrap!important}.flex-lg-nowrap{flex-wrap:nowrap!important}.flex-lg-wrap-reverse{flex-wrap:wrap-reverse!important}.flex-lg-fill{flex:1 1 auto!important}.flex-lg-grow-0{flex-grow:0!important}.flex-lg-grow-1{flex-grow:1!important}.flex-lg-shrink-0{flex-shrink:0!important}.flex-lg-shrink-1{flex-shrink:1!important}.justify-content-lg-start{justify-content:flex-start!important}.justify-content-lg-end{justify-content:flex-end!important}.justify-content-lg-center{justify-content:center!important}.justify-content-lg-between{justify-content:space-between!important}.justify-content-lg-around{justify-content:space-around!important}.align-items-lg-start{align-items:flex-start!important}.align-items-lg-end{align-items:flex-end!important}.align-items-lg-center{align-items:center!important}.align-items-lg-baseline{align-items:baseline!important}.align-items-lg-stretch{align-items:stretch!important}.align-content-lg-start{align-content:flex-start!important}.align-content-lg-end{align-content:flex-end!important}.align-content-lg-center{align-content:center!important}.align-content-lg-between{align-content:space-between!important}.align-content-lg-around{align-content:space-around!important}.align-content-lg-stretch{align-content:stretch!important}.align-self-lg-auto{align-self:auto!important}.align-self-lg-start{align-self:flex-start!important}.align-self-lg-end{align-self:flex-end!important}.align-self-lg-center{align-self:center!important}.align-self-lg-baseline{align-self:baseline!important}.align-self-lg-stretch{align-self:stretch!important}}@media (min-width: 1200px){.flex-xl-row{flex-direction:row!important}.flex-xl-column{flex-direction:column!important}.flex-xl-row-reverse{flex-direction:row-reverse!important}.flex-xl-column-reverse{flex-direction:column-reverse!important}.flex-xl-wrap{flex-wrap:wrap!important}.flex-xl-nowrap{flex-wrap:nowrap!important}.flex-xl-wrap-reverse{flex-wrap:wrap-reverse!important}.flex-xl-fill{flex:1 1 auto!important}.flex-xl-grow-0{flex-grow:0!important}.flex-xl-grow-1{flex-grow:1!important}.flex-xl-shrink-0{flex-shrink:0!important}.flex-xl-shrink-1{flex-shrink:1!important}.justify-content-xl-start{justify-content:flex-start!important}.justify-content-xl-end{justify-content:flex-end!important}.justify-content-xl-center{justify-content:center!important}.justify-content-xl-between{justify-content:space-between!important}.justify-content-xl-around{justify-content:space-around!important}.align-items-xl-start{align-items:flex-start!important}.align-items-xl-end{align-items:flex-end!important}.align-items-xl-center{align-items:center!important}.align-items-xl-baseline{align-items:baseline!important}.align-items-xl-stretch{align-items:stretch!important}.align-content-xl-start{align-content:flex-start!important}.align-content-xl-end{align-content:flex-end!important}.align-content-xl-center{align-content:center!important}.align-content-xl-between{align-content:space-between!important}.align-content-xl-around{align-content:space-around!important}.align-content-xl-stretch{align-content:stretch!important}.align-self-xl-auto{align-self:auto!important}.align-self-xl-start{align-self:flex-start!important}.align-self-xl-end{align-self:flex-end!important}.align-self-xl-center{align-self:center!important}.align-self-xl-baseline{align-self:baseline!important}.align-self-xl-stretch{align-self:stretch!important}}@media (min-width: 1450px){.flex-2xl-row{flex-direction:row!important}.flex-2xl-column{flex-direction:column!important}.flex-2xl-row-reverse{flex-direction:row-reverse!important}.flex-2xl-column-reverse{flex-direction:column-reverse!important}.flex-2xl-wrap{flex-wrap:wrap!important}.flex-2xl-nowrap{flex-wrap:nowrap!important}.flex-2xl-wrap-reverse{flex-wrap:wrap-reverse!important}.flex-2xl-fill{flex:1 1 auto!important}.flex-2xl-grow-0{flex-grow:0!important}.flex-2xl-grow-1{flex-grow:1!important}.flex-2xl-shrink-0{flex-shrink:0!important}.flex-2xl-shrink-1{flex-shrink:1!important}.justify-content-2xl-start{justify-content:flex-start!important}.justify-content-2xl-end{justify-content:flex-end!important}.justify-content-2xl-center{justify-content:center!important}.justify-content-2xl-between{justify-content:space-between!important}.justify-content-2xl-around{justify-content:space-around!important}.align-items-2xl-start{align-items:flex-start!important}.align-items-2xl-end{align-items:flex-end!important}.align-items-2xl-center{align-items:center!important}.align-items-2xl-baseline{align-items:baseline!important}.align-items-2xl-stretch{align-items:stretch!important}.align-content-2xl-start{align-content:flex-start!important}.align-content-2xl-end{align-content:flex-end!important}.align-content-2xl-center{align-content:center!important}.align-content-2xl-between{align-content:space-between!important}.align-content-2xl-around{align-content:space-around!important}.align-content-2xl-stretch{align-content:stretch!important}.align-self-2xl-auto{align-self:auto!important}.align-self-2xl-start{align-self:flex-start!important}.align-self-2xl-end{align-self:flex-end!important}.align-self-2xl-center{align-self:center!important}.align-self-2xl-baseline{align-self:baseline!important}.align-self-2xl-stretch{align-self:stretch!important}}.float-left{float:left!important}.float-right{float:right!important}.float-none{float:none!important}@media (min-width: 576px){.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: 992px){.float-lg-left{float:left!important}.float-lg-right{float:right!important}.float-lg-none{float:none!important}}@media (min-width: 1200px){.float-xl-left{float:left!important}.float-xl-right{float:right!important}.float-xl-none{float:none!important}}@media (min-width: 1450px){.float-2xl-left{float:left!important}.float-2xl-right{float:right!important}.float-2xl-none{float:none!important}}.user-select-all{user-select:all!important}.user-select-auto{user-select:auto!important}.user-select-none{user-select: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:sticky!important}.fixed-top{top:0}.fixed-bottom,.fixed-top{position:fixed;right:0;left:0;z-index:1030}.fixed-bottom{bottom:0}@supports (position: sticky){.sticky-top{position:sticky;top:0;z-index:1020}}.sr-only{white-space:nowrap}.sr-only-focusable:active,.sr-only-focusable:focus{white-space:normal}.shadow-sm{box-shadow:0 .125rem .25rem rgba(0,0,0,.075)!important}.shadow{box-shadow:0 .5rem 1rem #00000026!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}.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:.25rem!important}.mt-1,.my-1{margin-top:.25rem!important}.mr-1,.mx-1{margin-right:.25rem!important}.mb-1,.my-1{margin-bottom:.25rem!important}.ml-1,.mx-1{margin-left:.25rem!important}.m-2{margin:.5rem!important}.mt-2,.my-2{margin-top:.5rem!important}.btn-toolbar cd-table-actions.btn-group,.mr-2,.mx-2,cd-logs label{margin-right:.5rem!important}.mb-2,.my-2{margin-bottom:.5rem!important}.ml-2,.mx-2{margin-left:.5rem!important}.m-3{margin:1rem!important}.mt-3,.my-3{margin-top:1rem!important}.mr-3,.mx-3,cd-logs .form-inline>.form-group{margin-right:1rem!important}.mb-3,.my-3,cd-logs .form-inline>.form-group{margin-bottom:1rem!important}.ml-3,.mx-3{margin-left:1rem!important}.m-4{margin:1.5rem!important}.cd-header,.mt-4,.my-4,legend{margin-top:1.5rem!important}.mr-4,.mx-4{margin-right:1.5rem!important}.cd-header,.mb-4,.my-4,cd-health cd-info-card,legend{margin-bottom:1.5rem!important}.ml-4,.mx-4{margin-left:1.5rem!important}.m-5{margin:3rem!important}.mt-5,.my-5{margin-top:3rem!important}.mr-5,.mx-5{margin-right:3rem!important}.mb-5,.my-5{margin-bottom:3rem!important}.ml-5,.mx-5{margin-left:3rem!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:.25rem!important}.pt-1,.py-1{padding-top:.25rem!important}.pr-1,.px-1{padding-right:.25rem!important}.cd-header,.pb-1,.py-1,legend{padding-bottom:.25rem!important}.pl-1,.px-1{padding-left:.25rem!important}.p-2,cd-table .cd-datatable .datatable-footer,pre:not(cd-api-docs *){padding:.5rem!important}.pt-2,.py-2,cd-info-card .card .card-body .card-text,cd-info-card pre:not(cd-api-docs *) .card-body .card-text{padding-top:.5rem!important}.pr-2,.px-2{padding-right:.5rem!important}.pb-2,.py-2,cd-info-card .card,cd-info-card pre:not(cd-api-docs *){padding-bottom:.5rem!important}.pl-2,.px-2,cd-info-card .card .card-body .card-title,cd-info-card pre:not(cd-api-docs *) .card-body .card-title{padding-left:.5rem!important}.p-3{padding:1rem!important}.pt-3,.py-3{padding-top:1rem!important}.pr-3,.px-3{padding-right:1rem!important}.pb-3,.py-3{padding-bottom:1rem!important}.pl-3,.px-3{padding-left:1rem!important}.p-4{padding:1.5rem!important}.pt-4,.py-4{padding-top:1.5rem!important}.pr-4,.px-4{padding-right:1.5rem!important}.pb-4,.py-4{padding-bottom:1.5rem!important}.pl-4,.px-4{padding-left:1.5rem!important}.p-5{padding:3rem!important}.pt-5,.py-5{padding-top:3rem!important}.pr-5,.px-5{padding-right:3rem!important}.pb-5,.py-5{padding-bottom:3rem!important}.pl-5,.px-5{padding-left:3rem!important}.m-n1{margin:-.25rem!important}.mt-n1,.my-n1{margin-top:-.25rem!important}.mr-n1,.mx-n1{margin-right:-.25rem!important}.mb-n1,.my-n1{margin-bottom:-.25rem!important}.ml-n1,.mx-n1{margin-left:-.25rem!important}.m-n2{margin:-.5rem!important}.mt-n2,.my-n2{margin-top:-.5rem!important}.mr-n2,.mx-n2{margin-right:-.5rem!important}.mb-n2,.my-n2{margin-bottom:-.5rem!important}.ml-n2,.mx-n2{margin-left:-.5rem!important}.m-n3{margin:-1rem!important}.mt-n3,.my-n3{margin-top:-1rem!important}.mr-n3,.mx-n3{margin-right:-1rem!important}.mb-n3,.my-n3{margin-bottom:-1rem!important}.ml-n3,.mx-n3{margin-left:-1rem!important}.m-n4{margin:-1.5rem!important}.mt-n4,.my-n4{margin-top:-1.5rem!important}.mr-n4,.mx-n4{margin-right:-1.5rem!important}.mb-n4,.my-n4{margin-bottom:-1.5rem!important}.ml-n4,.mx-n4{margin-left:-1.5rem!important}.m-n5{margin:-3rem!important}.mt-n5,.my-n5{margin-top:-3rem!important}.mr-n5,.mx-n5{margin-right:-3rem!important}.mb-n5,.my-n5{margin-bottom:-3rem!important}.ml-n5,.mx-n5{margin-left:-3rem!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: 576px){.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:.25rem!important}.mt-sm-1,.my-sm-1{margin-top:.25rem!important}.mr-sm-1,.mx-sm-1{margin-right:.25rem!important}.mb-sm-1,.my-sm-1{margin-bottom:.25rem!important}.ml-sm-1,.mx-sm-1{margin-left:.25rem!important}.m-sm-2{margin:.5rem!important}.mt-sm-2,.my-sm-2{margin-top:.5rem!important}.mr-sm-2,.mx-sm-2{margin-right:.5rem!important}.mb-sm-2,.my-sm-2{margin-bottom:.5rem!important}.ml-sm-2,.mx-sm-2{margin-left:.5rem!important}.m-sm-3{margin:1rem!important}.mt-sm-3,.my-sm-3{margin-top:1rem!important}.mr-sm-3,.mx-sm-3{margin-right:1rem!important}.mb-sm-3,.my-sm-3{margin-bottom:1rem!important}.ml-sm-3,.mx-sm-3{margin-left:1rem!important}.m-sm-4{margin:1.5rem!important}.mt-sm-4,.my-sm-4{margin-top:1.5rem!important}.mr-sm-4,.mx-sm-4{margin-right:1.5rem!important}.mb-sm-4,.my-sm-4{margin-bottom:1.5rem!important}.ml-sm-4,.mx-sm-4{margin-left:1.5rem!important}.m-sm-5{margin:3rem!important}.mt-sm-5,.my-sm-5{margin-top:3rem!important}.mr-sm-5,.mx-sm-5{margin-right:3rem!important}.mb-sm-5,.my-sm-5{margin-bottom:3rem!important}.ml-sm-5,.mx-sm-5{margin-left:3rem!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:.25rem!important}.pt-sm-1,.py-sm-1{padding-top:.25rem!important}.pr-sm-1,.px-sm-1{padding-right:.25rem!important}.pb-sm-1,.py-sm-1{padding-bottom:.25rem!important}.pl-sm-1,.px-sm-1{padding-left:.25rem!important}.p-sm-2{padding:.5rem!important}.pt-sm-2,.py-sm-2{padding-top:.5rem!important}.pr-sm-2,.px-sm-2{padding-right:.5rem!important}.pb-sm-2,.py-sm-2{padding-bottom:.5rem!important}.pl-sm-2,.px-sm-2{padding-left:.5rem!important}.p-sm-3{padding:1rem!important}.pt-sm-3,.py-sm-3{padding-top:1rem!important}.pr-sm-3,.px-sm-3{padding-right:1rem!important}.pb-sm-3,.py-sm-3{padding-bottom:1rem!important}.pl-sm-3,.px-sm-3{padding-left:1rem!important}.p-sm-4{padding:1.5rem!important}.pt-sm-4,.py-sm-4{padding-top:1.5rem!important}.pr-sm-4,.px-sm-4{padding-right:1.5rem!important}.pb-sm-4,.py-sm-4{padding-bottom:1.5rem!important}.pl-sm-4,.px-sm-4{padding-left:1.5rem!important}.p-sm-5{padding:3rem!important}.pt-sm-5,.py-sm-5{padding-top:3rem!important}.pr-sm-5,.px-sm-5{padding-right:3rem!important}.pb-sm-5,.py-sm-5{padding-bottom:3rem!important}.pl-sm-5,.px-sm-5{padding-left:3rem!important}.m-sm-n1{margin:-.25rem!important}.mt-sm-n1,.my-sm-n1{margin-top:-.25rem!important}.mr-sm-n1,.mx-sm-n1{margin-right:-.25rem!important}.mb-sm-n1,.my-sm-n1{margin-bottom:-.25rem!important}.ml-sm-n1,.mx-sm-n1{margin-left:-.25rem!important}.m-sm-n2{margin:-.5rem!important}.mt-sm-n2,.my-sm-n2{margin-top:-.5rem!important}.mr-sm-n2,.mx-sm-n2{margin-right:-.5rem!important}.mb-sm-n2,.my-sm-n2{margin-bottom:-.5rem!important}.ml-sm-n2,.mx-sm-n2{margin-left:-.5rem!important}.m-sm-n3{margin:-1rem!important}.mt-sm-n3,.my-sm-n3{margin-top:-1rem!important}.mr-sm-n3,.mx-sm-n3{margin-right:-1rem!important}.mb-sm-n3,.my-sm-n3{margin-bottom:-1rem!important}.ml-sm-n3,.mx-sm-n3{margin-left:-1rem!important}.m-sm-n4{margin:-1.5rem!important}.mt-sm-n4,.my-sm-n4{margin-top:-1.5rem!important}.mr-sm-n4,.mx-sm-n4{margin-right:-1.5rem!important}.mb-sm-n4,.my-sm-n4{margin-bottom:-1.5rem!important}.ml-sm-n4,.mx-sm-n4{margin-left:-1.5rem!important}.m-sm-n5{margin:-3rem!important}.mt-sm-n5,.my-sm-n5{margin-top:-3rem!important}.mr-sm-n5,.mx-sm-n5{margin-right:-3rem!important}.mb-sm-n5,.my-sm-n5{margin-bottom:-3rem!important}.ml-sm-n5,.mx-sm-n5{margin-left:-3rem!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:.25rem!important}.mt-md-1,.my-md-1{margin-top:.25rem!important}.mr-md-1,.mx-md-1{margin-right:.25rem!important}.mb-md-1,.my-md-1{margin-bottom:.25rem!important}.ml-md-1,.mx-md-1{margin-left:.25rem!important}.m-md-2{margin:.5rem!important}.mt-md-2,.my-md-2{margin-top:.5rem!important}.mr-md-2,.mx-md-2{margin-right:.5rem!important}.mb-md-2,.my-md-2{margin-bottom:.5rem!important}.ml-md-2,.mx-md-2{margin-left:.5rem!important}.m-md-3{margin:1rem!important}.mt-md-3,.my-md-3{margin-top:1rem!important}.mr-md-3,.mx-md-3{margin-right:1rem!important}.mb-md-3,.my-md-3{margin-bottom:1rem!important}.ml-md-3,.mx-md-3{margin-left:1rem!important}.m-md-4{margin:1.5rem!important}.mt-md-4,.my-md-4{margin-top:1.5rem!important}.mr-md-4,.mx-md-4{margin-right:1.5rem!important}.mb-md-4,.my-md-4{margin-bottom:1.5rem!important}.ml-md-4,.mx-md-4{margin-left:1.5rem!important}.m-md-5{margin:3rem!important}.mt-md-5,.my-md-5{margin-top:3rem!important}.mr-md-5,.mx-md-5{margin-right:3rem!important}.mb-md-5,.my-md-5{margin-bottom:3rem!important}.ml-md-5,.mx-md-5{margin-left:3rem!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:.25rem!important}.pt-md-1,.py-md-1{padding-top:.25rem!important}.pr-md-1,.px-md-1{padding-right:.25rem!important}.pb-md-1,.py-md-1{padding-bottom:.25rem!important}.pl-md-1,.px-md-1{padding-left:.25rem!important}.p-md-2{padding:.5rem!important}.pt-md-2,.py-md-2{padding-top:.5rem!important}.pr-md-2,.px-md-2{padding-right:.5rem!important}.pb-md-2,.py-md-2{padding-bottom:.5rem!important}.pl-md-2,.px-md-2{padding-left:.5rem!important}.p-md-3{padding:1rem!important}.pt-md-3,.py-md-3{padding-top:1rem!important}.pr-md-3,.px-md-3{padding-right:1rem!important}.pb-md-3,.py-md-3{padding-bottom:1rem!important}.pl-md-3,.px-md-3{padding-left:1rem!important}.p-md-4{padding:1.5rem!important}.pt-md-4,.py-md-4{padding-top:1.5rem!important}.pr-md-4,.px-md-4{padding-right:1.5rem!important}.pb-md-4,.py-md-4{padding-bottom:1.5rem!important}.pl-md-4,.px-md-4{padding-left:1.5rem!important}.p-md-5{padding:3rem!important}.pt-md-5,.py-md-5{padding-top:3rem!important}.pr-md-5,.px-md-5{padding-right:3rem!important}.pb-md-5,.py-md-5{padding-bottom:3rem!important}.pl-md-5,.px-md-5{padding-left:3rem!important}.m-md-n1{margin:-.25rem!important}.mt-md-n1,.my-md-n1{margin-top:-.25rem!important}.mr-md-n1,.mx-md-n1{margin-right:-.25rem!important}.mb-md-n1,.my-md-n1{margin-bottom:-.25rem!important}.ml-md-n1,.mx-md-n1{margin-left:-.25rem!important}.m-md-n2{margin:-.5rem!important}.mt-md-n2,.my-md-n2{margin-top:-.5rem!important}.mr-md-n2,.mx-md-n2{margin-right:-.5rem!important}.mb-md-n2,.my-md-n2{margin-bottom:-.5rem!important}.ml-md-n2,.mx-md-n2{margin-left:-.5rem!important}.m-md-n3{margin:-1rem!important}.mt-md-n3,.my-md-n3{margin-top:-1rem!important}.mr-md-n3,.mx-md-n3{margin-right:-1rem!important}.mb-md-n3,.my-md-n3{margin-bottom:-1rem!important}.ml-md-n3,.mx-md-n3{margin-left:-1rem!important}.m-md-n4{margin:-1.5rem!important}.mt-md-n4,.my-md-n4{margin-top:-1.5rem!important}.mr-md-n4,.mx-md-n4{margin-right:-1.5rem!important}.mb-md-n4,.my-md-n4{margin-bottom:-1.5rem!important}.ml-md-n4,.mx-md-n4{margin-left:-1.5rem!important}.m-md-n5{margin:-3rem!important}.mt-md-n5,.my-md-n5{margin-top:-3rem!important}.mr-md-n5,.mx-md-n5{margin-right:-3rem!important}.mb-md-n5,.my-md-n5{margin-bottom:-3rem!important}.ml-md-n5,.mx-md-n5{margin-left:-3rem!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: 992px){.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:.25rem!important}.mt-lg-1,.my-lg-1{margin-top:.25rem!important}.mr-lg-1,.mx-lg-1{margin-right:.25rem!important}.mb-lg-1,.my-lg-1{margin-bottom:.25rem!important}.ml-lg-1,.mx-lg-1{margin-left:.25rem!important}.m-lg-2{margin:.5rem!important}.mt-lg-2,.my-lg-2{margin-top:.5rem!important}.mr-lg-2,.mx-lg-2{margin-right:.5rem!important}.mb-lg-2,.my-lg-2{margin-bottom:.5rem!important}.ml-lg-2,.mx-lg-2{margin-left:.5rem!important}.m-lg-3{margin:1rem!important}.mt-lg-3,.my-lg-3{margin-top:1rem!important}.mr-lg-3,.mx-lg-3{margin-right:1rem!important}.mb-lg-3,.my-lg-3{margin-bottom:1rem!important}.ml-lg-3,.mx-lg-3{margin-left:1rem!important}.m-lg-4{margin:1.5rem!important}.mt-lg-4,.my-lg-4{margin-top:1.5rem!important}.mr-lg-4,.mx-lg-4{margin-right:1.5rem!important}.mb-lg-4,.my-lg-4{margin-bottom:1.5rem!important}.ml-lg-4,.mx-lg-4{margin-left:1.5rem!important}.m-lg-5{margin:3rem!important}.mt-lg-5,.my-lg-5{margin-top:3rem!important}.mr-lg-5,.mx-lg-5{margin-right:3rem!important}.mb-lg-5,.my-lg-5{margin-bottom:3rem!important}.ml-lg-5,.mx-lg-5{margin-left:3rem!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:.25rem!important}.pt-lg-1,.py-lg-1{padding-top:.25rem!important}.pr-lg-1,.px-lg-1{padding-right:.25rem!important}.pb-lg-1,.py-lg-1{padding-bottom:.25rem!important}.pl-lg-1,.px-lg-1{padding-left:.25rem!important}.p-lg-2{padding:.5rem!important}.pt-lg-2,.py-lg-2{padding-top:.5rem!important}.pr-lg-2,.px-lg-2{padding-right:.5rem!important}.pb-lg-2,.py-lg-2{padding-bottom:.5rem!important}.pl-lg-2,.px-lg-2{padding-left:.5rem!important}.p-lg-3{padding:1rem!important}.pt-lg-3,.py-lg-3{padding-top:1rem!important}.pr-lg-3,.px-lg-3{padding-right:1rem!important}.pb-lg-3,.py-lg-3{padding-bottom:1rem!important}.pl-lg-3,.px-lg-3{padding-left:1rem!important}.p-lg-4{padding:1.5rem!important}.pt-lg-4,.py-lg-4{padding-top:1.5rem!important}.pr-lg-4,.px-lg-4{padding-right:1.5rem!important}.pb-lg-4,.py-lg-4{padding-bottom:1.5rem!important}.pl-lg-4,.px-lg-4{padding-left:1.5rem!important}.p-lg-5{padding:3rem!important}.pt-lg-5,.py-lg-5{padding-top:3rem!important}.pr-lg-5,.px-lg-5{padding-right:3rem!important}.pb-lg-5,.py-lg-5{padding-bottom:3rem!important}.pl-lg-5,.px-lg-5{padding-left:3rem!important}.m-lg-n1{margin:-.25rem!important}.mt-lg-n1,.my-lg-n1{margin-top:-.25rem!important}.mr-lg-n1,.mx-lg-n1{margin-right:-.25rem!important}.mb-lg-n1,.my-lg-n1{margin-bottom:-.25rem!important}.ml-lg-n1,.mx-lg-n1{margin-left:-.25rem!important}.m-lg-n2{margin:-.5rem!important}.mt-lg-n2,.my-lg-n2{margin-top:-.5rem!important}.mr-lg-n2,.mx-lg-n2{margin-right:-.5rem!important}.mb-lg-n2,.my-lg-n2{margin-bottom:-.5rem!important}.ml-lg-n2,.mx-lg-n2{margin-left:-.5rem!important}.m-lg-n3{margin:-1rem!important}.mt-lg-n3,.my-lg-n3{margin-top:-1rem!important}.mr-lg-n3,.mx-lg-n3{margin-right:-1rem!important}.mb-lg-n3,.my-lg-n3{margin-bottom:-1rem!important}.ml-lg-n3,.mx-lg-n3{margin-left:-1rem!important}.m-lg-n4{margin:-1.5rem!important}.mt-lg-n4,.my-lg-n4{margin-top:-1.5rem!important}.mr-lg-n4,.mx-lg-n4{margin-right:-1.5rem!important}.mb-lg-n4,.my-lg-n4{margin-bottom:-1.5rem!important}.ml-lg-n4,.mx-lg-n4{margin-left:-1.5rem!important}.m-lg-n5{margin:-3rem!important}.mt-lg-n5,.my-lg-n5{margin-top:-3rem!important}.mr-lg-n5,.mx-lg-n5{margin-right:-3rem!important}.mb-lg-n5,.my-lg-n5{margin-bottom:-3rem!important}.ml-lg-n5,.mx-lg-n5{margin-left:-3rem!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: 1200px){.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:.25rem!important}.mt-xl-1,.my-xl-1{margin-top:.25rem!important}.mr-xl-1,.mx-xl-1{margin-right:.25rem!important}.mb-xl-1,.my-xl-1{margin-bottom:.25rem!important}.ml-xl-1,.mx-xl-1{margin-left:.25rem!important}.m-xl-2{margin:.5rem!important}.mt-xl-2,.my-xl-2{margin-top:.5rem!important}.mr-xl-2,.mx-xl-2{margin-right:.5rem!important}.mb-xl-2,.my-xl-2{margin-bottom:.5rem!important}.ml-xl-2,.mx-xl-2{margin-left:.5rem!important}.m-xl-3{margin:1rem!important}.mt-xl-3,.my-xl-3{margin-top:1rem!important}.mr-xl-3,.mx-xl-3{margin-right:1rem!important}.mb-xl-3,.my-xl-3{margin-bottom:1rem!important}.ml-xl-3,.mx-xl-3{margin-left:1rem!important}.m-xl-4{margin:1.5rem!important}.mt-xl-4,.my-xl-4{margin-top:1.5rem!important}.mr-xl-4,.mx-xl-4{margin-right:1.5rem!important}.mb-xl-4,.my-xl-4{margin-bottom:1.5rem!important}.ml-xl-4,.mx-xl-4{margin-left:1.5rem!important}.m-xl-5{margin:3rem!important}.mt-xl-5,.my-xl-5{margin-top:3rem!important}.mr-xl-5,.mx-xl-5{margin-right:3rem!important}.mb-xl-5,.my-xl-5{margin-bottom:3rem!important}.ml-xl-5,.mx-xl-5{margin-left:3rem!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:.25rem!important}.pt-xl-1,.py-xl-1{padding-top:.25rem!important}.pr-xl-1,.px-xl-1{padding-right:.25rem!important}.pb-xl-1,.py-xl-1{padding-bottom:.25rem!important}.pl-xl-1,.px-xl-1{padding-left:.25rem!important}.p-xl-2{padding:.5rem!important}.pt-xl-2,.py-xl-2{padding-top:.5rem!important}.pr-xl-2,.px-xl-2{padding-right:.5rem!important}.pb-xl-2,.py-xl-2{padding-bottom:.5rem!important}.pl-xl-2,.px-xl-2{padding-left:.5rem!important}.p-xl-3{padding:1rem!important}.pt-xl-3,.py-xl-3{padding-top:1rem!important}.pr-xl-3,.px-xl-3{padding-right:1rem!important}.pb-xl-3,.py-xl-3{padding-bottom:1rem!important}.pl-xl-3,.px-xl-3{padding-left:1rem!important}.p-xl-4{padding:1.5rem!important}.pt-xl-4,.py-xl-4{padding-top:1.5rem!important}.pr-xl-4,.px-xl-4{padding-right:1.5rem!important}.pb-xl-4,.py-xl-4{padding-bottom:1.5rem!important}.pl-xl-4,.px-xl-4{padding-left:1.5rem!important}.p-xl-5{padding:3rem!important}.pt-xl-5,.py-xl-5{padding-top:3rem!important}.pr-xl-5,.px-xl-5{padding-right:3rem!important}.pb-xl-5,.py-xl-5{padding-bottom:3rem!important}.pl-xl-5,.px-xl-5{padding-left:3rem!important}.m-xl-n1{margin:-.25rem!important}.mt-xl-n1,.my-xl-n1{margin-top:-.25rem!important}.mr-xl-n1,.mx-xl-n1{margin-right:-.25rem!important}.mb-xl-n1,.my-xl-n1{margin-bottom:-.25rem!important}.ml-xl-n1,.mx-xl-n1{margin-left:-.25rem!important}.m-xl-n2{margin:-.5rem!important}.mt-xl-n2,.my-xl-n2{margin-top:-.5rem!important}.mr-xl-n2,.mx-xl-n2{margin-right:-.5rem!important}.mb-xl-n2,.my-xl-n2{margin-bottom:-.5rem!important}.ml-xl-n2,.mx-xl-n2{margin-left:-.5rem!important}.m-xl-n3{margin:-1rem!important}.mt-xl-n3,.my-xl-n3{margin-top:-1rem!important}.mr-xl-n3,.mx-xl-n3{margin-right:-1rem!important}.mb-xl-n3,.my-xl-n3{margin-bottom:-1rem!important}.ml-xl-n3,.mx-xl-n3{margin-left:-1rem!important}.m-xl-n4{margin:-1.5rem!important}.mt-xl-n4,.my-xl-n4{margin-top:-1.5rem!important}.mr-xl-n4,.mx-xl-n4{margin-right:-1.5rem!important}.mb-xl-n4,.my-xl-n4{margin-bottom:-1.5rem!important}.ml-xl-n4,.mx-xl-n4{margin-left:-1.5rem!important}.m-xl-n5{margin:-3rem!important}.mt-xl-n5,.my-xl-n5{margin-top:-3rem!important}.mr-xl-n5,.mx-xl-n5{margin-right:-3rem!important}.mb-xl-n5,.my-xl-n5{margin-bottom:-3rem!important}.ml-xl-n5,.mx-xl-n5{margin-left:-3rem!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: 1450px){.m-2xl-0{margin:0!important}.mt-2xl-0,.my-2xl-0{margin-top:0!important}.mr-2xl-0,.mx-2xl-0{margin-right:0!important}.mb-2xl-0,.my-2xl-0{margin-bottom:0!important}.ml-2xl-0,.mx-2xl-0{margin-left:0!important}.m-2xl-1{margin:.25rem!important}.mt-2xl-1,.my-2xl-1{margin-top:.25rem!important}.mr-2xl-1,.mx-2xl-1{margin-right:.25rem!important}.mb-2xl-1,.my-2xl-1{margin-bottom:.25rem!important}.ml-2xl-1,.mx-2xl-1{margin-left:.25rem!important}.m-2xl-2{margin:.5rem!important}.mt-2xl-2,.my-2xl-2{margin-top:.5rem!important}.mr-2xl-2,.mx-2xl-2{margin-right:.5rem!important}.mb-2xl-2,.my-2xl-2{margin-bottom:.5rem!important}.ml-2xl-2,.mx-2xl-2{margin-left:.5rem!important}.m-2xl-3{margin:1rem!important}.mt-2xl-3,.my-2xl-3{margin-top:1rem!important}.mr-2xl-3,.mx-2xl-3{margin-right:1rem!important}.mb-2xl-3,.my-2xl-3{margin-bottom:1rem!important}.ml-2xl-3,.mx-2xl-3{margin-left:1rem!important}.m-2xl-4{margin:1.5rem!important}.mt-2xl-4,.my-2xl-4{margin-top:1.5rem!important}.mr-2xl-4,.mx-2xl-4{margin-right:1.5rem!important}.mb-2xl-4,.my-2xl-4{margin-bottom:1.5rem!important}.ml-2xl-4,.mx-2xl-4{margin-left:1.5rem!important}.m-2xl-5{margin:3rem!important}.mt-2xl-5,.my-2xl-5{margin-top:3rem!important}.mr-2xl-5,.mx-2xl-5{margin-right:3rem!important}.mb-2xl-5,.my-2xl-5{margin-bottom:3rem!important}.ml-2xl-5,.mx-2xl-5{margin-left:3rem!important}.p-2xl-0{padding:0!important}.pt-2xl-0,.py-2xl-0{padding-top:0!important}.pr-2xl-0,.px-2xl-0{padding-right:0!important}.pb-2xl-0,.py-2xl-0{padding-bottom:0!important}.pl-2xl-0,.px-2xl-0{padding-left:0!important}.p-2xl-1{padding:.25rem!important}.pt-2xl-1,.py-2xl-1{padding-top:.25rem!important}.pr-2xl-1,.px-2xl-1{padding-right:.25rem!important}.pb-2xl-1,.py-2xl-1{padding-bottom:.25rem!important}.pl-2xl-1,.px-2xl-1{padding-left:.25rem!important}.p-2xl-2{padding:.5rem!important}.pt-2xl-2,.py-2xl-2{padding-top:.5rem!important}.pr-2xl-2,.px-2xl-2{padding-right:.5rem!important}.pb-2xl-2,.py-2xl-2{padding-bottom:.5rem!important}.pl-2xl-2,.px-2xl-2{padding-left:.5rem!important}.p-2xl-3{padding:1rem!important}.pt-2xl-3,.py-2xl-3{padding-top:1rem!important}.pr-2xl-3,.px-2xl-3{padding-right:1rem!important}.pb-2xl-3,.py-2xl-3{padding-bottom:1rem!important}.pl-2xl-3,.px-2xl-3{padding-left:1rem!important}.p-2xl-4{padding:1.5rem!important}.pt-2xl-4,.py-2xl-4{padding-top:1.5rem!important}.pr-2xl-4,.px-2xl-4{padding-right:1.5rem!important}.pb-2xl-4,.py-2xl-4{padding-bottom:1.5rem!important}.pl-2xl-4,.px-2xl-4{padding-left:1.5rem!important}.p-2xl-5{padding:3rem!important}.pt-2xl-5,.py-2xl-5{padding-top:3rem!important}.pr-2xl-5,.px-2xl-5{padding-right:3rem!important}.pb-2xl-5,.py-2xl-5{padding-bottom:3rem!important}.pl-2xl-5,.px-2xl-5{padding-left:3rem!important}.m-2xl-n1{margin:-.25rem!important}.mt-2xl-n1,.my-2xl-n1{margin-top:-.25rem!important}.mr-2xl-n1,.mx-2xl-n1{margin-right:-.25rem!important}.mb-2xl-n1,.my-2xl-n1{margin-bottom:-.25rem!important}.ml-2xl-n1,.mx-2xl-n1{margin-left:-.25rem!important}.m-2xl-n2{margin:-.5rem!important}.mt-2xl-n2,.my-2xl-n2{margin-top:-.5rem!important}.mr-2xl-n2,.mx-2xl-n2{margin-right:-.5rem!important}.mb-2xl-n2,.my-2xl-n2{margin-bottom:-.5rem!important}.ml-2xl-n2,.mx-2xl-n2{margin-left:-.5rem!important}.m-2xl-n3{margin:-1rem!important}.mt-2xl-n3,.my-2xl-n3{margin-top:-1rem!important}.mr-2xl-n3,.mx-2xl-n3{margin-right:-1rem!important}.mb-2xl-n3,.my-2xl-n3{margin-bottom:-1rem!important}.ml-2xl-n3,.mx-2xl-n3{margin-left:-1rem!important}.m-2xl-n4{margin:-1.5rem!important}.mt-2xl-n4,.my-2xl-n4{margin-top:-1.5rem!important}.mr-2xl-n4,.mx-2xl-n4{margin-right:-1.5rem!important}.mb-2xl-n4,.my-2xl-n4{margin-bottom:-1.5rem!important}.ml-2xl-n4,.mx-2xl-n4{margin-left:-1.5rem!important}.m-2xl-n5{margin:-3rem!important}.mt-2xl-n5,.my-2xl-n5{margin-top:-3rem!important}.mr-2xl-n5,.mx-2xl-n5{margin-right:-3rem!important}.mb-2xl-n5,.my-2xl-n5{margin-bottom:-3rem!important}.ml-2xl-n5,.mx-2xl-n5{margin-left:-3rem!important}.m-2xl-auto{margin:auto!important}.mt-2xl-auto,.my-2xl-auto{margin-top:auto!important}.mr-2xl-auto,.mx-2xl-auto{margin-right:auto!important}.mb-2xl-auto,.my-2xl-auto{margin-bottom:auto!important}.ml-2xl-auto,.mx-2xl-auto{margin-left:auto!important}}.stretched-link:after{position:absolute;top:0;right:0;bottom:0;left:0;z-index:1;pointer-events:auto;content:"";background-color:#0000}.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: 576px){.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: 992px){.text-lg-left{text-align:left!important}.text-lg-right{text-align:right!important}.text-lg-center{text-align:center!important}}@media (min-width: 1200px){.text-xl-left{text-align:left!important}.text-xl-right{text-align:right!important}.text-xl-center{text-align:center!important}}@media (min-width: 1450px){.text-2xl-left{text-align:left!important}.text-2xl-right{text-align:right!important}.text-2xl-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,cd-about dt{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:#2b99a8!important}a.text-primary:focus,a.text-primary:hover{color:#1b626b!important}.text-secondary{color:#374249!important}a.text-secondary:focus,a.text-secondary:hover{color:#161b1d!important}.text-success{color:#0b0!important}a.text-success:focus,a.text-success:hover{color:#006f00!important}.text-info{color:#2b99a8!important}a.text-info:focus,a.text-info:hover{color:#1b626b!important}.text-warning{color:#ffc200!important}a.text-warning:focus,a.text-warning:hover{color:#b38800!important}.text-danger{color:#ef5c55!important}a.text-danger:focus,a.text-danger:hover{color:#e21f15!important}.text-light{color:#f8f9fa!important}a.text-light:focus,a.text-light:hover{color:#cbd3da!important}.text-dark{color:#777!important}a.text-dark:focus,a.text-dark:hover{color:#515151!important}.text-accent{color:#ef5c55!important}a.text-accent:focus,a.text-accent:hover{color:#e21f15!important}.text-warning-dark{color:#fd7e14!important}a.text-warning-dark:focus,a.text-warning-dark:hover{color:#c35a02!important}.text-body{color:#212529!important}.text-muted{color:#6c757d!important}.text-black-50{color:#00000080!important}.text-white-50{color:#ffffff80!important}.text-hide{font:0/0 a;color:#0000;text-shadow:none;background-color:initial;border:0}.text-decoration-none{text-decoration:none!important}.text-break{word-break:break-word!important;word-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:1px solid #adb5bd}blockquote,img,pre,tr{page-break-inside:avoid}h2,h3,p{orphans:3;widows:3}h2,h3{page-break-after:avoid}@page{size:a3}.container,body{min-width:992px!important}.navbar{display:none}.badge{border:1px solid #000}.table{border-collapse:collapse!important}.table td,.table th{background-color:#fff!important}.table-bordered td,.table-bordered th{border:1px solid #dee2e6!important}.table-dark{color:inherit}.table-dark tbody+tbody,.table-dark td,.table-dark th,.table-dark thead th{border-color:#dee2e6}.table .thead-dark th{color:inherit;border-color:#dee2e6}}
-/*!
-Fork Awesome 1.1.7
-License - https://forkaweso.me/Fork-Awesome/license
-
-Copyright 2018 Dave Gandy & Fork Awesome
-
-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.
- */@font-face{font-family:ForkAwesome;src:url(forkawesome-webfont.e182ad6df04f9177b326.eot?v=1.1.7);src:url(forkawesome-webfont.e182ad6df04f9177b326.eot?#iefix&v=1.1.7) format("embedded-opentype"),url(forkawesome-webfont.7c20758e3e7c7dff7c8d.woff2?v=1.1.7) format("woff2"),url(forkawesome-webfont.2dfb5f36fc148e26e398.woff?v=1.1.7) format("woff"),url(forkawesome-webfont.ee4d8bfd0af89fc714a2.ttf?v=1.1.7) format("truetype"),url(forkawesome-webfont.86541105409e56d17291.svg?v=1.1.7#forkawesomeregular) format("svg");font-weight:400;font-style:normal}.fa{display:inline-block;font:normal normal normal 14px/1 ForkAwesome;font-size:inherit;text-rendering:auto;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.fa-lg{font-size:1.3333333333em;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,.fa-fw{width:1.2857142857em;text-align:center}.fa-ul{padding-left:0;margin-left:2.1428571429em;list-style-type:none}.fa-ul>li{position:relative}.fa-li{position:absolute;left:-2.1428571429em;width:2.1428571429em;top:.1428571429em;text-align:center}.fa-li.fa-lg{left:-1.8571428571em}.fa-border{padding:.2em .25em .15em;border:.08em solid #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{animation:fa-spin 2s linear infinite}.fa-pulse{animation:fa-spin 1s steps(8) infinite}@keyframes fa-spin{0%{transform:rotate(0deg)}to{transform:rotate(359deg)}}.fa-rotate-90{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=1)";transform:rotate(90deg)}.fa-rotate-180{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2)";transform:rotate(180deg)}.fa-rotate-270{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=3)";transform:rotate(270deg)}.fa-flip-horizontal{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=0, mirror=1)";transform:scaleX(-1)}.fa-flip-vertical{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1)";transform:scaleY(-1)}:root .fa-flip-horizontal,:root .fa-flip-vertical,:root .fa-rotate-180,:root .fa-rotate-270,:root .fa-rotate-90{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:""}.fa-music:before{content:""}.fa-search:before{content:""}.fa-envelope-o:before{content:""}.fa-heart:before{content:""}.fa-star:before{content:""}.fa-star-o:before{content:""}.fa-user:before{content:""}.fa-film:before{content:""}.fa-th-large:before{content:""}.fa-th:before{content:""}.fa-th-list:before{content:""}.fa-check:before{content:""}.fa-close:before,.fa-remove:before,.fa-times:before{content:""}.fa-search-plus:before{content:""}.fa-search-minus:before{content:""}.fa-power-off:before{content:""}.fa-signal:before{content:""}.fa-cog:before,.fa-gear:before{content:""}.fa-trash-o:before{content:""}.fa-home:before{content:""}.fa-file-o:before{content:""}.fa-clock-o:before{content:""}.fa-road:before{content:""}.fa-download:before{content:""}.fa-arrow-circle-o-down:before{content:""}.fa-arrow-circle-o-up:before{content:""}.fa-inbox:before{content:""}.fa-play-circle-o:before{content:""}.fa-repeat:before,.fa-rotate-right:before{content:""}.fa-refresh:before,.fa-sync:before{content:""}.fa-list-alt:before{content:""}.fa-lock:before{content:""}.fa-flag:before{content:""}.fa-headphones:before{content:""}.fa-volume-off:before{content:""}.fa-volume-down:before{content:""}.fa-volume-up:before{content:""}.fa-qrcode:before{content:""}.fa-barcode:before{content:""}.fa-tag:before{content:""}.fa-tags:before{content:""}.fa-book:before{content:""}.fa-bookmark:before{content:""}.fa-print:before{content:""}.fa-camera:before{content:""}.fa-font:before{content:""}.fa-bold:before{content:""}.fa-italic:before{content:""}.fa-text-height:before{content:""}.fa-text-width:before{content:""}.fa-align-left:before{content:""}.fa-align-center:before{content:""}.fa-align-right:before{content:""}.fa-align-justify:before{content:""}.fa-list:before{content:""}.fa-dedent:before,.fa-outdent:before{content:""}.fa-indent:before{content:""}.fa-video-camera:before,.fa-video:before{content:""}.fa-image:before,.fa-photo:before,.fa-picture-o:before{content:""}.fa-pencil:before{content:""}.fa-map-marker:before{content:""}.fa-adjust:before{content:""}.fa-tint:before{content:""}.fa-edit:before,.fa-pencil-square-o:before{content:""}.fa-share-square-o:before{content:""}.fa-check-square-o:before{content:""}.fa-arrows:before{content:""}.fa-step-backward:before{content:""}.fa-fast-backward:before{content:""}.fa-backward:before{content:""}.fa-play:before{content:""}.fa-pause:before{content:""}.fa-stop:before{content:""}.fa-forward:before{content:""}.fa-fast-forward:before{content:""}.fa-step-forward:before{content:""}.fa-eject:before{content:""}.fa-chevron-left:before{content:""}.fa-chevron-right:before{content:""}.fa-plus-circle:before{content:""}.fa-minus-circle:before{content:""}.fa-times-circle:before{content:""}.fa-check-circle:before{content:""}.fa-question-circle:before{content:""}.fa-info-circle:before{content:""}.fa-crosshairs:before{content:""}.fa-times-circle-o:before{content:""}.fa-check-circle-o:before{content:""}.fa-ban:before{content:""}.fa-arrow-left:before{content:""}.fa-arrow-right:before{content:""}.fa-arrow-up:before{content:""}.fa-arrow-down:before{content:""}.fa-mail-forward:before,.fa-share:before{content:""}.fa-expand:before{content:""}.fa-compress:before{content:""}.fa-plus:before{content:""}.fa-minus:before{content:""}.fa-asterisk:before{content:""}.fa-exclamation-circle:before{content:""}.fa-gift:before{content:""}.fa-leaf:before{content:""}.fa-fire:before{content:""}.fa-eye:before{content:""}.fa-eye-slash:before{content:""}.fa-exclamation-triangle:before,.fa-warning:before{content:""}.fa-plane:before{content:""}.fa-calendar:before{content:""}.fa-random:before{content:""}.fa-comment:before{content:""}.fa-magnet:before{content:""}.fa-chevron-up:before{content:""}.fa-chevron-down:before{content:""}.fa-retweet:before{content:""}.fa-shopping-cart:before{content:""}.fa-folder:before{content:""}.fa-folder-open:before{content:""}.fa-arrows-v:before{content:""}.fa-arrows-h:before{content:""}.fa-bar-chart-o:before,.fa-bar-chart:before{content:""}.fa-twitter-square:before{content:""}.fa-facebook-square:before{content:""}.fa-camera-retro:before{content:""}.fa-key:before{content:""}.fa-cogs:before,.fa-gears:before{content:""}.fa-comments:before{content:""}.fa-thumbs-o-up:before{content:""}.fa-thumbs-o-down:before{content:""}.fa-star-half:before{content:""}.fa-heart-o:before{content:""}.fa-sign-out:before{content:""}.fa-linkedin-square:before{content:""}.fa-thumb-tack:before{content:""}.fa-external-link:before{content:""}.fa-sign-in:before{content:""}.fa-trophy:before{content:""}.fa-github-square:before{content:""}.fa-upload:before{content:""}.fa-lemon-o:before{content:""}.fa-phone:before{content:""}.fa-square-o:before{content:""}.fa-bookmark-o:before{content:""}.fa-phone-square:before{content:""}.fa-twitter:before{content:""}.fa-facebook-f:before,.fa-facebook:before{content:""}.fa-github:before{content:""}.fa-unlock:before{content:""}.fa-credit-card:before{content:""}.fa-feed:before,.fa-rss:before{content:""}.fa-hdd-o:before{content:""}.fa-bullhorn:before{content:""}.fa-bell-o:before{content:""}.fa-certificate:before{content:""}.fa-hand-o-right:before{content:""}.fa-hand-o-left:before{content:""}.fa-hand-o-up:before{content:""}.fa-hand-o-down:before{content:""}.fa-arrow-circle-left:before{content:""}.fa-arrow-circle-right:before{content:""}.fa-arrow-circle-up:before{content:""}.fa-arrow-circle-down:before{content:""}.fa-globe:before{content:""}.fa-globe-e:before{content:""}.fa-globe-w:before{content:""}.fa-wrench:before{content:""}.fa-tasks:before{content:""}.fa-filter:before{content:""}.fa-briefcase:before{content:""}.fa-arrows-alt:before{content:""}.fa-community:before,.fa-group:before,.fa-users:before{content:""}.fa-chain:before,.fa-link:before{content:""}.fa-cloud:before{content:""}.fa-flask:before{content:""}.fa-cut:before,.fa-scissors:before{content:""}.fa-copy:before,.fa-files-o:before{content:""}.fa-paperclip:before{content:""}.fa-floppy-o:before,.fa-save:before{content:""}.fa-square:before{content:""}.fa-bars:before,.fa-navicon:before,.fa-reorder:before{content:""}.fa-list-ul:before{content:""}.fa-list-ol:before{content:""}.fa-strikethrough:before{content:""}.fa-underline:before{content:""}.fa-table:before{content:""}.fa-magic:before{content:""}.fa-truck:before{content:""}.fa-pinterest:before{content:""}.fa-pinterest-square:before{content:""}.fa-google-plus-square:before{content:""}.fa-google-plus-g:before,.fa-google-plus:before{content:""}.fa-money:before{content:""}.fa-caret-down:before{content:""}.fa-caret-up:before{content:""}.fa-caret-left:before{content:""}.fa-caret-right:before{content:""}.fa-columns:before{content:""}.fa-sort:before,.fa-unsorted:before{content:""}.fa-sort-desc:before,.fa-sort-down:before{content:""}.fa-sort-asc:before,.fa-sort-up:before{content:""}.fa-envelope:before{content:""}.fa-linkedin:before{content:""}.fa-rotate-left:before,.fa-undo:before{content:""}.fa-gavel:before,.fa-legal:before{content:""}.fa-dashboard:before,.fa-tachometer:before{content:""}.fa-comment-o:before{content:""}.fa-comments-o:before{content:""}.fa-bolt:before,.fa-flash:before{content:""}.fa-sitemap:before{content:""}.fa-umbrella:before{content:""}.fa-clipboard:before,.fa-paste:before{content:""}.fa-lightbulb-o:before{content:""}.fa-exchange:before{content:""}.fa-cloud-download:before{content:""}.fa-cloud-upload:before{content:""}.fa-user-md:before{content:""}.fa-stethoscope:before{content:""}.fa-suitcase:before{content:""}.fa-bell:before{content:""}.fa-coffee:before{content:""}.fa-cutlery:before,.fa-utensils:before{content:""}.fa-file-text-o:before{content:""}.fa-building-o:before{content:""}.fa-hospital-o:before{content:""}.fa-ambulance:before{content:""}.fa-medkit:before{content:""}.fa-fighter-jet:before{content:""}.fa-beer:before{content:""}.fa-h-square:before{content:""}.fa-plus-square:before{content:""}.fa-angle-double-left:before{content:""}.fa-angle-double-right:before{content:""}.fa-angle-double-up:before{content:""}.fa-angle-double-down:before{content:""}.fa-angle-left:before{content:""}.fa-angle-right:before{content:""}.fa-angle-up:before{content:""}.fa-angle-down:before{content:""}.fa-desktop:before{content:""}.fa-laptop:before{content:""}.fa-tablet:before{content:""}.fa-mobile-phone:before,.fa-mobile:before{content:""}.fa-circle-o:before{content:""}.fa-quote-left:before{content:""}.fa-quote-right:before{content:""}.fa-spinner:before{content:""}.fa-circle:before{content:""}.fa-mail-reply:before,.fa-reply:before{content:""}.fa-github-alt:before{content:""}.fa-folder-o:before{content:""}.fa-folder-open-o:before{content:""}.fa-smile-o:before{content:""}.fa-frown-o:before{content:""}.fa-meh-o:before{content:""}.fa-gamepad:before{content:""}.fa-keyboard-o:before{content:""}.fa-flag-o:before{content:""}.fa-flag-checkered:before{content:""}.fa-terminal:before{content:""}.fa-code:before{content:""}.fa-mail-reply-all:before,.fa-reply-all:before{content:""}.fa-star-half-empty:before,.fa-star-half-full:before,.fa-star-half-o:before{content:""}.fa-location-arrow:before{content:""}.fa-crop:before{content:""}.fa-code-fork:before{content:""}.fa-chain-broken:before,.fa-unlink:before{content:""}.fa-question:before{content:""}.fa-info:before{content:""}.fa-exclamation:before{content:""}.fa-superscript:before{content:""}.fa-subscript:before{content:""}.fa-eraser:before{content:""}.fa-puzzle-piece:before{content:""}.fa-microphone:before{content:""}.fa-microphone-slash:before{content:""}.fa-shield:before{content:""}.fa-calendar-o:before{content:""}.fa-fire-extinguisher:before{content:""}.fa-rocket:before{content:""}.fa-maxcdn:before{content:""}.fa-chevron-circle-left:before{content:""}.fa-chevron-circle-right:before{content:""}.fa-chevron-circle-up:before{content:""}.fa-chevron-circle-down:before{content:""}.fa-html5:before{content:""}.fa-css3:before{content:""}.fa-anchor:before{content:""}.fa-unlock-alt:before{content:""}.fa-bullseye:before{content:""}.fa-ellipsis-h:before{content:""}.fa-ellipsis-v:before{content:""}.fa-rss-square:before{content:""}.fa-play-circle:before{content:""}.fa-ticket:before{content:""}.fa-minus-square:before{content:""}.fa-minus-square-o:before{content:""}.fa-level-up:before{content:""}.fa-level-down:before{content:""}.fa-check-square:before{content:""}.fa-pencil-square:before{content:""}.fa-external-link-square:before{content:""}.fa-share-square:before{content:""}.fa-compass:before{content:""}.fa-caret-square-o-down:before,.fa-toggle-down:before{content:""}.fa-caret-square-o-up:before,.fa-toggle-up:before{content:""}.fa-caret-square-o-right:before,.fa-toggle-right:before{content:""}.fa-eur:before,.fa-euro:before{content:""}.fa-gbp:before,.fa-pound:before{content:""}.fa-dollar:before,.fa-usd:before{content:""}.fa-inr:before,.fa-rupee:before{content:""}.fa-cny:before,.fa-jpy:before,.fa-rmb:before,.fa-yen:before{content:""}.fa-rouble:before,.fa-rub:before,.fa-ruble:before{content:""}.fa-krw:before,.fa-won:before{content:""}.fa-bitcoin:before,.fa-btc:before{content:""}.fa-file:before{content:""}.fa-file-text:before{content:""}.fa-sort-alpha-asc:before,.fa-sort-alpha-down:before{content:""}.fa-sort-alpha-desc:before,.fa-sort-alpha-up:before{content:""}.fa-sort-amount-asc:before,.fa-sort-amount-down:before{content:""}.fa-sort-amount-desc:before,.fa-sort-amount-up:before{content:""}.fa-sort-numeric-asc:before,.fa-sort-numeric-down:before{content:""}.fa-sort-numeric-desc:before,.fa-sort-numeric-up:before{content:""}.fa-thumbs-up:before{content:""}.fa-thumbs-down:before{content:""}.fa-youtube-square:before{content:""}.fa-youtube:before{content:""}.fa-xing:before{content:""}.fa-xing-square:before{content:""}.fa-youtube-play:before{content:""}.fa-dropbox:before{content:""}.fa-stack-overflow:before{content:""}.fa-instagram:before{content:""}.fa-flickr:before{content:""}.fa-adn:before{content:""}.fa-bitbucket:before{content:""}.fa-bitbucket-square:before{content:""}.fa-tumblr:before{content:""}.fa-tumblr-square:before{content:""}.fa-long-arrow-down:before{content:""}.fa-long-arrow-up:before{content:""}.fa-long-arrow-left:before{content:""}.fa-long-arrow-right:before{content:""}.fa-apple:before{content:""}.fa-windows:before{content:""}.fa-android:before{content:""}.fa-linux:before{content:""}.fa-dribbble:before{content:""}.fa-skype:before{content:""}.fa-foursquare:before{content:""}.fa-trello:before{content:""}.fa-female:before{content:""}.fa-male:before{content:""}.fa-gittip:before,.fa-gratipay:before{content:""}.fa-sun-o:before{content:""}.fa-moon-o:before{content:""}.fa-archive:before{content:""}.fa-bug:before{content:""}.fa-vk:before{content:""}.fa-weibo:before{content:""}.fa-renren:before{content:""}.fa-pagelines:before{content:""}.fa-stack-exchange:before{content:""}.fa-arrow-circle-o-right:before{content:""}.fa-arrow-circle-o-left:before{content:""}.fa-caret-square-o-left:before,.fa-toggle-left:before{content:""}.fa-dot-circle-o:before{content:""}.fa-wheelchair:before{content:""}.fa-vimeo-square:before{content:""}.fa-try:before,.fa-turkish-lira:before{content:""}.fa-plus-square-o:before{content:""}.fa-space-shuttle:before{content:""}.fa-slack:before{content:""}.fa-envelope-square:before{content:""}.fa-wordpress:before{content:""}.fa-openid:before{content:""}.fa-bank:before,.fa-institution:before,.fa-university:before{content:""}.fa-graduation-cap:before,.fa-mortar-board:before{content:""}.fa-yahoo:before{content:""}.fa-google:before{content:""}.fa-reddit:before{content:""}.fa-reddit-square:before{content:""}.fa-stumbleupon-circle:before{content:""}.fa-stumbleupon:before{content:""}.fa-delicious:before{content:""}.fa-digg:before{content:""}.fa-drupal:before{content:""}.fa-joomla:before{content:""}.fa-language:before{content:""}.fa-fax:before{content:""}.fa-building:before{content:""}.fa-child:before{content:""}.fa-paw:before{content:""}.fa-spoon:before,.fa-utensil-spoon:before{content:""}.fa-cube:before{content:""}.fa-cubes:before{content:""}.fa-behance:before{content:""}.fa-behance-square:before{content:""}.fa-steam:before{content:""}.fa-steam-square:before{content:""}.fa-recycle:before{content:""}.fa-automobile:before,.fa-car:before{content:""}.fa-cab:before,.fa-taxi:before{content:""}.fa-tree:before{content:""}.fa-spotify:before{content:""}.fa-deviantart:before{content:""}.fa-soundcloud:before{content:""}.fa-database:before{content:""}.fa-file-pdf-o:before{content:""}.fa-file-word-o:before{content:""}.fa-file-excel-o:before{content:""}.fa-file-powerpoint-o:before{content:""}.fa-file-image-o:before,.fa-file-photo-o:before,.fa-file-picture-o:before{content:""}.fa-file-archive-o:before,.fa-file-zip-o:before{content:""}.fa-file-audio-o:before,.fa-file-sound-o:before{content:""}.fa-file-movie-o:before,.fa-file-video-o:before{content:""}.fa-file-code-o:before{content:""}.fa-vine:before{content:""}.fa-codepen:before{content:""}.fa-jsfiddle:before{content:""}.fa-life-bouy:before,.fa-life-buoy:before,.fa-life-ring:before,.fa-life-saver:before,.fa-support:before{content:""}.fa-circle-o-notch:before{content:""}.fa-ra:before,.fa-rebel:before,.fa-resistance:before{content:""}.fa-empire:before,.fa-ge:before{content:""}.fa-git-square:before{content:""}.fa-git:before{content:""}.fa-hacker-news:before,.fa-y-combinator-square:before,.fa-yc-square:before{content:""}.fa-tencent-weibo:before{content:""}.fa-qq:before{content:""}.fa-wechat:before,.fa-weixin:before{content:""}.fa-paper-plane:before,.fa-send:before{content:""}.fa-paper-plane-o:before,.fa-send-o:before{content:""}.fa-history:before{content:""}.fa-circle-thin:before{content:""}.fa-header:before,.fa-heading:before{content:""}.fa-paragraph:before{content:""}.fa-sliders:before{content:""}.fa-share-alt:before{content:""}.fa-share-alt-square:before{content:""}.fa-bomb:before{content:""}.fa-futbol-o:before,.fa-soccer-ball-o:before{content:""}.fa-tty:before{content:""}.fa-binoculars:before{content:""}.fa-plug:before{content:""}.fa-slideshare:before{content:""}.fa-twitch:before{content:""}.fa-yelp:before{content:""}.fa-newspaper-o:before{content:""}.fa-wifi:before{content:""}.fa-calculator:before{content:""}.fa-paypal:before{content:""}.fa-google-wallet:before{content:""}.fa-cc-visa:before{content:""}.fa-cc-mastercard:before{content:""}.fa-cc-discover:before{content:""}.fa-cc-amex:before{content:""}.fa-cc-paypal:before{content:""}.fa-cc-stripe:before{content:""}.fa-bell-slash:before{content:""}.fa-bell-slash-o:before{content:""}.fa-trash:before{content:""}.fa-copyright:before{content:""}.fa-at:before{content:""}.fa-eyedropper:before{content:""}.fa-paint-brush:before{content:""}.fa-birthday-cake:before{content:""}.fa-area-chart:before{content:""}.fa-pie-chart:before{content:""}.fa-line-chart:before{content:""}.fa-lastfm:before{content:""}.fa-lastfm-square:before{content:""}.fa-toggle-off:before{content:""}.fa-toggle-on:before{content:""}.fa-bicycle:before{content:""}.fa-bus:before{content:""}.fa-ioxhost:before{content:""}.fa-angellist:before{content:""}.fa-cc:before,.fa-closed-captioning:before{content:""}.fa-ils:before,.fa-shekel:before,.fa-sheqel:before{content:""}.fa-meanpath:before{content:""}.fa-buysellads:before{content:""}.fa-connectdevelop:before{content:""}.fa-dashcube:before{content:""}.fa-forumbee:before{content:""}.fa-leanpub:before{content:""}.fa-sellsy:before{content:""}.fa-shirtsinbulk:before{content:""}.fa-simplybuilt:before{content:""}.fa-skyatlas:before{content:""}.fa-cart-plus:before{content:""}.fa-cart-arrow-down:before{content:""}.fa-diamond:before,.fa-gem:before{content:""}.fa-ship:before{content:""}.fa-user-secret:before{content:""}.fa-motorcycle:before{content:""}.fa-street-view:before{content:""}.fa-heartbeat:before{content:""}.fa-venus:before{content:""}.fa-mars:before{content:""}.fa-mercury:before{content:""}.fa-intersex:before,.fa-transgender:before{content:""}.fa-transgender-alt:before{content:""}.fa-venus-double:before{content:""}.fa-mars-double:before{content:""}.fa-venus-mars:before{content:""}.fa-mars-stroke:before{content:""}.fa-mars-stroke-v:before{content:""}.fa-mars-stroke-h:before{content:""}.fa-neuter:before{content:""}.fa-genderless:before{content:""}.fa-facebook-official:before{content:""}.fa-pinterest-p:before{content:""}.fa-whatsapp:before{content:""}.fa-server:before{content:""}.fa-user-plus:before{content:""}.fa-user-times:before{content:""}.fa-bed:before,.fa-hotel:before{content:""}.fa-viacoin:before{content:""}.fa-train:before{content:""}.fa-subway:before{content:""}.fa-medium:before{content:""}.fa-medium-square:before{content:""}.fa-y-combinator:before,.fa-yc:before{content:""}.fa-optin-monster:before{content:""}.fa-opencart:before{content:""}.fa-expeditedssl:before{content:""}.fa-battery-4:before,.fa-battery-full:before,.fa-battery:before{content:""}.fa-battery-3:before,.fa-battery-three-quarters:before{content:""}.fa-battery-2:before,.fa-battery-half:before{content:""}.fa-battery-1:before,.fa-battery-quarter:before{content:""}.fa-battery-0:before,.fa-battery-empty:before{content:""}.fa-mouse-pointer:before{content:""}.fa-i-cursor:before{content:""}.fa-object-group:before{content:""}.fa-object-ungroup:before{content:""}.fa-sticky-note:before{content:""}.fa-sticky-note-o:before{content:""}.fa-cc-jcb:before{content:""}.fa-cc-diners-club:before{content:""}.fa-clone:before{content:""}.fa-balance-scale:before{content:""}.fa-hourglass-o:before{content:""}.fa-hourglass-1:before,.fa-hourglass-start:before{content:""}.fa-hourglass-2:before,.fa-hourglass-half:before{content:""}.fa-hourglass-3:before,.fa-hourglass-end:before{content:""}.fa-hourglass:before{content:""}.fa-hand-grab-o:before,.fa-hand-rock-o:before{content:""}.fa-hand-paper-o:before,.fa-hand-stop-o:before{content:""}.fa-hand-scissors-o:before{content:""}.fa-hand-lizard-o:before{content:""}.fa-hand-spock-o:before{content:""}.fa-hand-pointer-o:before{content:""}.fa-hand-peace-o:before{content:""}.fa-trademark:before{content:""}.fa-registered:before{content:""}.fa-creative-commons:before{content:""}.fa-gg:before{content:""}.fa-gg-circle:before{content:""}.fa-tripadvisor:before{content:""}.fa-odnoklassniki:before{content:""}.fa-odnoklassniki-square:before{content:""}.fa-get-pocket:before{content:""}.fa-wikipedia-w:before{content:""}.fa-safari:before{content:""}.fa-chrome:before{content:""}.fa-firefox:before{content:""}.fa-opera:before{content:""}.fa-internet-explorer:before{content:""}.fa-television:before,.fa-tv:before{content:""}.fa-contao:before{content:""}.fa-500px:before{content:""}.fa-amazon:before{content:""}.fa-calendar-plus-o:before{content:""}.fa-calendar-minus-o:before{content:""}.fa-calendar-times-o:before{content:""}.fa-calendar-check-o:before{content:""}.fa-industry:before{content:""}.fa-map-pin:before{content:""}.fa-map-signs:before{content:""}.fa-map-o:before{content:""}.fa-map:before{content:""}.fa-commenting:before{content:""}.fa-commenting-o:before{content:""}.fa-houzz:before{content:""}.fa-vimeo-v:before,.fa-vimeo:before{content:""}.fa-black-tie:before{content:""}.fa-fonticons:before{content:""}.fa-reddit-alien:before{content:""}.fa-edge:before{content:""}.fa-credit-card-alt:before{content:""}.fa-codiepie:before{content:""}.fa-modx:before{content:""}.fa-fort-awesome:before{content:""}.fa-usb:before{content:""}.fa-product-hunt:before{content:""}.fa-mixcloud:before{content:""}.fa-scribd:before{content:""}.fa-pause-circle:before{content:""}.fa-pause-circle-o:before{content:""}.fa-stop-circle:before{content:""}.fa-stop-circle-o:before{content:""}.fa-shopping-bag:before{content:""}.fa-shopping-basket:before{content:""}.fa-hashtag:before{content:""}.fa-bluetooth:before{content:""}.fa-bluetooth-b:before{content:""}.fa-percent:before{content:""}.fa-gitlab:before{content:""}.fa-wpbeginner:before{content:""}.fa-wpforms:before{content:""}.fa-envira:before{content:""}.fa-universal-access:before{content:""}.fa-wheelchair-alt:before{content:""}.fa-question-circle-o:before{content:""}.fa-blind:before{content:""}.fa-audio-description:before{content:""}.fa-phone-volume:before,.fa-volume-control-phone:before{content:""}.fa-braille:before{content:""}.fa-assistive-listening-systems:before{content:""}.fa-american-sign-language-interpreting:before,.fa-asl-interpreting:before{content:""}.fa-deaf:before,.fa-deafness:before,.fa-hard-of-hearing:before{content:""}.fa-glide:before{content:""}.fa-glide-g:before{content:""}.fa-sign-language:before,.fa-signing:before{content:""}.fa-low-vision:before{content:""}.fa-viadeo:before{content:""}.fa-viadeo-square:before{content:""}.fa-snapchat:before{content:""}.fa-snapchat-ghost:before{content:""}.fa-snapchat-square:before{content:""}.fa-first-order:before{content:""}.fa-yoast:before{content:""}.fa-themeisle:before{content:""}.fa-google-plus-circle:before,.fa-google-plus-official:before{content:""}.fa-fa:before,.fa-font-awesome:before{content:""}.fa-handshake-o:before{content:""}.fa-envelope-open:before{content:""}.fa-envelope-open-o:before{content:""}.fa-linode:before{content:""}.fa-address-book:before{content:""}.fa-address-book-o:before{content:""}.fa-address-card:before,.fa-vcard:before{content:""}.fa-address-card-o:before,.fa-vcard-o:before{content:""}.fa-user-circle:before{content:""}.fa-user-circle-o:before{content:""}.fa-user-o:before{content:""}.fa-id-badge:before{content:""}.fa-drivers-license:before,.fa-id-card:before{content:""}.fa-drivers-license-o:before,.fa-id-card-o:before{content:""}.fa-quora:before{content:""}.fa-free-code-camp:before{content:""}.fa-telegram:before{content:""}.fa-thermometer-4:before,.fa-thermometer-full:before,.fa-thermometer:before{content:""}.fa-thermometer-3:before,.fa-thermometer-three-quarters:before{content:""}.fa-thermometer-2:before,.fa-thermometer-half:before{content:""}.fa-thermometer-1:before,.fa-thermometer-quarter:before{content:""}.fa-thermometer-0:before,.fa-thermometer-empty:before{content:""}.fa-shower:before{content:""}.fa-bath:before,.fa-bathtub:before,.fa-s15:before{content:""}.fa-podcast:before{content:""}.fa-window-maximize:before{content:""}.fa-window-minimize:before{content:""}.fa-window-restore:before{content:""}.fa-times-rectangle:before,.fa-window-close:before{content:""}.fa-times-rectangle-o:before,.fa-window-close-o:before{content:""}.fa-bandcamp:before{content:""}.fa-grav:before{content:""}.fa-etsy:before{content:""}.fa-imdb:before{content:""}.fa-ravelry:before{content:""}.fa-eercast:before{content:""}.fa-microchip:before{content:""}.fa-snowflake-o:before{content:""}.fa-superpowers:before{content:""}.fa-wpexplorer:before{content:""}.fa-meetup:before{content:""}.fa-mastodon:before{content:""}.fa-mastodon-alt:before{content:""}.fa-fork-awesome:before,.fa-fork-circle:before{content:""}.fa-peertube:before{content:""}.fa-diaspora:before{content:""}.fa-friendica:before{content:""}.fa-gnu-social:before{content:""}.fa-liberapay-square:before{content:""}.fa-liberapay:before{content:""}.fa-scuttlebutt:before,.fa-ssb:before{content:""}.fa-hubzilla:before{content:""}.fa-social-home:before{content:""}.fa-artstation:before{content:""}.fa-discord:before{content:""}.fa-discord-alt:before{content:""}.fa-patreon:before{content:""}.fa-snowdrift:before{content:""}.fa-activitypub:before{content:""}.fa-ethereum:before{content:""}.fa-keybase:before{content:""}.fa-shaarli:before{content:""}.fa-shaarli-o:before{content:""}.fa-cut-key:before,.fa-key-modern:before{content:""}.fa-xmpp:before{content:""}.fa-archive-org:before{content:""}.fa-freedombox:before{content:""}.fa-facebook-messenger:before{content:""}.fa-debian:before{content:""}.fa-mastodon-square:before{content:""}.fa-tipeee:before{content:""}.fa-react:before{content:""}.fa-dogmazic:before{content:""}.fa-zotero:before{content:""}.fa-nodejs:before{content:""}.fa-nextcloud:before{content:""}.fa-nextcloud-square:before{content:""}.fa-hackaday:before{content:""}.fa-laravel:before{content:""}.fa-signalapp:before{content:""}.fa-gnupg:before{content:""}.fa-php:before{content:""}.fa-ffmpeg:before{content:""}.fa-joplin:before{content:""}.fa-syncthing:before{content:""}.fa-inkscape:before{content:""}.fa-matrix-org:before{content:""}.fa-pixelfed:before{content:""}.fa-bootstrap:before{content:""}.fa-dev-to:before{content:""}.fa-hashnode:before{content:""}.fa-jirafeau:before{content:""}.fa-emby:before{content:""}.fa-wikidata:before{content:""}.fa-gimp:before{content:""}.fa-c:before{content:""}.fa-digitalocean:before{content:""}.fa-att:before{content:""}.fa-gitea:before{content:""}.fa-file-epub:before{content:""}.fa-python:before{content:""}.fa-archlinux:before{content:""}.fa-pleroma:before{content:""}.fa-unsplash:before{content:""}.fa-hackster:before{content:""}.fa-spell-check:before{content:""}.fa-moon:before{content:""}.fa-sun:before{content:""}.fa-f-droid:before{content:""}.fa-biometric:before{content:""}.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}.info-card-popover-cluster-status{max-height:20vh;max-width:23vw}.info-card-popover-cluster-status .popover-body{font-size:1rem;max-height:19vh;max-width:100%;overflow:auto}@media (max-width: calc(1200px - 1px)){.info-card-popover-cluster-status{max-width:31vw}}@media (max-width: calc(992px - 1px)){.info-card-popover-cluster-status{max-width:46vw}}@media (max-width: calc(768px - 1px)){.info-card-popover-cluster-status{max-width:83vw}}.info-card-content-clickable{border:1px solid #e9ecef;border-radius:3px;cursor:pointer;padding:7px}.info-card-content-clickable:hover{background-color:#e9ecef;border-color:#ced4da}html{background-color:#fff}body,html{font-size:12px;height:100%;width:100%}option{font-style:normal;font-weight:400}mark{background-color:#ffc200;padding:0}.full-height{height:100vh}.full-width{width:100vw}.vertical-align{align-items:center;display:flex}.horizontal-align{display:flex;justify-content:center}.loading:not(cd-api-docs *){left:50%;position:absolute;top:50%}.margin-right-md{margin-right:15px}.no-border{border:0;box-shadow:0 0 0!important}.italic{font-style:italic}.bold{font-weight:700}.text-right{text-align:right}.text-monospace{font-family:monospace}.text-pre-wrap{white-space:pre-wrap}.text-pre{white-space:pre}.icon-danger-color{color:#ef5c55}.icon-warning-color{color:#ffc200}.border-warning{border-left:4px solid #ffc200}.border-danger{border-left:4px solid #ef5c55}.border-info{border-left:4px solid #2b99a8}.border-success{border-left:4px solid #0b0}.vertical-line{border-left:1px solid #ced4da}.accordion .card,.accordion pre:not(cd-api-docs *){border:0}.accordion .card-header{border:0;border-bottom:3px solid #fff;padding-left:0}.accordion .card-header .btn.focus,.accordion .card-header .btn:focus{box-shadow:none}.accordion .card-header button.dropdown-toggle{position:relative}.accordion .card-header button.dropdown-toggle:after{border:0;content:"";font-family:ForkAwesome;font-size:1rem;position:absolute;right:20px;transition:transform .3s ease-in-out}.accordion .card-header button.dropdown-toggle[aria-expanded=true]:after{transform:rotate(90deg)}.custom-control-input.is-valid~.custom-control-label,.was-validated .custom-control-input:valid~.custom-control-label{color:initial}.custom-control-input.is-valid:checked~.custom-control-label:before,.was-validated .custom-control-input:valid:checked~.custom-control-label:before{background-color:#2b99a8;border-color:#2b99a8}.custom-control-input.is-valid~.custom-control-label:before,.was-validated .custom-control-input:valid~.custom-control-label:before{border-color:#adb5bd}.custom-control-input.is-valid:focus~.custom-control-label:before,.was-validated .custom-control-input:valid:focus~.custom-control-label:before{box-shadow:0 0 0 .2rem #2b99a840}.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:#76d0dc}.btn-light{background-color:#fff;border-color:#ced4da!important}.btn-light:hover{background-color:#dee2e6;border-color:#6c757d!important}.btn-light:disabled{background-color:#e9ecef;border-color:#ced4da!important}.btn.active.focus,.btn.active:focus,.btn.focus,.btn:active.focus,.btn:active:focus,.btn:focus{outline:0}.btn.disabled{border:0;box-shadow:none}.btn-primary .badge{background-color:#e9ecef;color:#2b99a8}.btn-group>.btn>i.fa,.cd-datatable-actions button.btn i.fa{margin-right:5px}.card-footer button.btn:not(:first-child){margin-left:5px}.dropdown-menu{min-width:50px;z-index:999999}.dropdown-menu button.dropdown-item:focus{outline:none}.dropdown-menu>li>a{cursor:pointer}.dropdown-menu>li>a>i.fa{margin-right:5px}.dropdown-menu>.active>a{background-color:#2b99a8;color:#e9ecef}.dropdown-menu>.active>a,.dropdown-menu>.active>a:focus,.dropdown-menu>.active>a:hover{background-color:#21747f}.dataTables_wrapper .dropdown-menu>li.dropdown-divider{cursor:auto}.required:after{color:#ef5c55;content:"*";font-size:1.167rem;padding-left:4px}.form-footer{display:flex;width:100%}.cd-form-control,.form-control{display:table-cell}.cd-form-control:focus,.form-control:focus{border-color:#2b99a8cc;box-shadow:0 0 3px 2px #2b99a880;outline:0}.custom-checkbox{padding-top:7px}.custom-radio{padding-top:5px}cd-modal .modal{background-color:#0006;display:block}cd-modal .modal-dialog{max-width:70vh}.invalid-feedback{display:block}.container-fluid,.container-lg,.container-md,.container-sm,.container-xl{padding:0 30px}.ceph-icon{background:url(Ceph_Logo.487a0001b327fa7f5232.svg)}.prometheus-icon{background:url(prometheus_logo.8b3183e5a2db0e87bb2b.svg)}.custom-icon{background-clip:padding-box;background-repeat:no-repeat;background-size:contain;margin-right:8px;padding:10px}.nav-tabs{margin-bottom:1rem}#toast-container{margin-top:2vw}@media (max-width: 1600px){#toast-container{margin-top:2.5vw}}@media (max-width: calc(992px - 1px)){#toast-container{margin-top:9vw}}@media (max-width: 900px){#toast-container{margin-top:10vw}}@media (max-width: 319px){#toast-container{margin-top:11vw}}@media (max-width: 260px){#toast-container{margin-top:14vw}}.toast-message>ul{margin:0;padding-left:1rem}.noscript{padding-top:5em}@media (min-width: 576px){.cd-col-form-label,.col-form-label{text-align:right}}.cd-col-form-label,.col-form-label{font-weight:700}.password-strength-level{flex:100%;margin-top:2px}.password-strength-level .ok,.password-strength-level .strong,.password-strength-level .very-strong,.password-strength-level .weak{border-radius:.25rem;height:13px}.password-strength-level .weak{background:#ef5c55;width:25%}.password-strength-level .ok{background:#ffc200;width:50%}.password-strength-level .strong{background:#0b0;width:75%}.password-strength-level .very-strong{background:#006f00;width:100%}.badge-background-gray,.badge-hdd{background-color:#6c757d;color:#fff}.badge-background-primary,.badge-ssd{background-color:#2b99a8;color:#fff}.badge-tab{background-color:#e9ecef;color:#495057}tree-root tree-viewport{min-height:1em}tags-input .tags{border:1px solid #ced4da;border-radius:4px;box-shadow:inset 0 1px 1px #00000017}.card-header{font-size:1.3em}.card-body h2:first-child{margin-top:0}.disabled{pointer-events:none}.clickable,a{cursor:pointer}
\ No newline at end of file
diff --git a/ceph/src/pybind/mgr/dashboard/frontend/jest.config.cjs b/ceph/src/pybind/mgr/dashboard/frontend/jest.config.cjs
new file mode 100644 (file)
index 0000000..a08aaeb
--- /dev/null
@@ -0,0 +1,44 @@
+const esModules = ['@angular', '@ngrx', '@progress', 'simplebar', 'lodash-es', 'react-syntax-highlighter', 'swagger-client', '@ng-bootstrap'];
+const jestConfig = {
+    globals: {
+        'ts-jest': {
+            useESM: true,
+            stringifyContentPathRegex: '\\.(html|svg)$',
+            tsconfig: '<rootDir>/tsconfig.spec.json',
+            isolatedModules: true
+        },
+    },
+    globalSetup: 'jest-preset-angular/global-setup',
+    moduleNameMapper: {
+        "\\.scss$": "identity-obj-proxy",
+        "~/(.*)$": "<rootDir>/src/$1"
+    },
+    moduleFileExtensions: ['ts', 'html', 'js', 'json', 'mjs', 'cjs'],
+    preset: "jest-preset-angular",
+    setupFilesAfterEnv: [
+        "<rootDir>/src/setupJest.ts"
+    ],
+    transformIgnorePatterns: [
+        "node_modules/(?!.*\\.mjs$|".concat(esModules.join('|'), ")")
+    ],
+    transform: {
+        "^.+\\.(ts|html|mjs)$": "jest-preset-angular",
+        "^.+\\.(js)$": "babel-jest"
+    },
+    setupFiles: [
+        "jest-canvas-mock"
+    ],
+    coverageReporters: [
+        "cobertura",
+        "html"
+    ],
+    modulePathIgnorePatterns: [
+        "<rootDir>/coverage/",
+        "<rootDir>/node_modules/simplebar-angular",
+    ],
+    testMatch: [
+        "**/*.spec.ts"
+    ],
+    testRunner: 'jest-jasmine2'
+};
+module.exports = jestConfig;
index 6020f276cc3865612488bd0767d1add9745adf90..8d946e93e1ccf8d7354dc439f52684a5f96cbd58 100644 (file)
       "dev": true
     },
     "@ampproject/remapping": {
       "dev": true
     },
     "@ampproject/remapping": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-1.0.1.tgz",
-      "integrity": "sha512-Ta9bMA3EtUHDaZJXqUoT5cn/EecwOp+SXpKJqxDbDuMbLvEMu6YTyDDuvTWeStODfdmXyfMo7LymQyPkN3BicA==",
-      "dev": true,
+      "version": "2.2.0",
+      "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.0.tgz",
+      "integrity": "sha512-qRmjj8nj9qmLTQXXmaR1cck3UXSRMPrbsLJAasZpF+t3riI71BXed5ebIOYwQntykeZuhjsdweEc9BxH5Jc26w==",
       "requires": {
       "requires": {
-        "@jridgewell/resolve-uri": "1.0.0",
-        "sourcemap-codec": "1.4.8"
-      },
-      "dependencies": {
-        "@jridgewell/resolve-uri": {
-          "version": "1.0.0",
-          "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-1.0.0.tgz",
-          "integrity": "sha512-9oLAnygRMi8Q5QkYEU4XWK04B+nuoXoxjRvRxgjuChkLZFBja0YPSgdZ7dZtwhncLBcQe/I/E+fLuk5qxcYVJA==",
-          "dev": true
-        }
+        "@jridgewell/gen-mapping": "^0.1.0",
+        "@jridgewell/trace-mapping": "^0.3.9"
       }
     },
     "@angular-devkit/architect": {
       }
     },
     "@angular-devkit/architect": {
-      "version": "0.1202.13",
-      "resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.1202.13.tgz",
-      "integrity": "sha512-LXgiidXwBgyWPqqWK4xR1/kCPQTMTzG5w+s7+LvENUZwbcdl6CKrOMjfgjo6WPr6yeq+WWQvPCD4pZ6nXRTm7A==",
+      "version": "0.1303.9",
+      "resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.1303.9.tgz",
+      "integrity": "sha512-RMHqCGDxbLqT+250A0a8vagsoTdqGjAxjhrvTeq7PJmClI7uJ/uA1Fs18+t85toIqVKn2hovdY9sNf42nBDD2Q==",
       "dev": true,
       "requires": {
       "dev": true,
       "requires": {
-        "@angular-devkit/core": "12.2.13",
+        "@angular-devkit/core": "13.3.9",
         "rxjs": "6.6.7"
       },
       "dependencies": {
         "rxjs": "6.6.7"
       },
       "dependencies": {
       }
     },
     "@angular-devkit/build-angular": {
       }
     },
     "@angular-devkit/build-angular": {
-      "version": "12.2.13",
-      "resolved": "https://registry.npmjs.org/@angular-devkit/build-angular/-/build-angular-12.2.13.tgz",
-      "integrity": "sha512-iJ1P/RZ1hk2n/HtEqB5ohXvHa+Hf0BXShYskSGrn6/klcTb0eJTCREsFxHk7mNEmRIGPWkjbLAslqpPgwiagXg==",
-      "dev": true,
-      "requires": {
-        "@ampproject/remapping": "1.0.1",
-        "@angular-devkit/architect": "0.1202.13",
-        "@angular-devkit/build-optimizer": "0.1202.13",
-        "@angular-devkit/build-webpack": "0.1202.13",
-        "@angular-devkit/core": "12.2.13",
-        "@babel/core": "7.14.8",
-        "@babel/generator": "7.14.8",
-        "@babel/helper-annotate-as-pure": "7.14.5",
-        "@babel/plugin-proposal-async-generator-functions": "7.14.7",
-        "@babel/plugin-transform-async-to-generator": "7.14.5",
-        "@babel/plugin-transform-runtime": "7.14.5",
-        "@babel/preset-env": "7.14.8",
-        "@babel/runtime": "7.14.8",
-        "@babel/template": "7.14.5",
-        "@discoveryjs/json-ext": "0.5.3",
-        "@jsdevtools/coverage-istanbul-loader": "3.0.5",
-        "@ngtools/webpack": "12.2.13",
+      "version": "13.3.9",
+      "resolved": "https://registry.npmjs.org/@angular-devkit/build-angular/-/build-angular-13.3.9.tgz",
+      "integrity": "sha512-1LqcMizeabx3yOkx3tptCSAoEhG6nO6hPgI/B3EJ07G/ZcoxunMWSeN3P3zT10dZMEHhcxl+8cSStSXaXj9hfA==",
+      "dev": true,
+      "requires": {
+        "@ampproject/remapping": "2.2.0",
+        "@angular-devkit/architect": "0.1303.9",
+        "@angular-devkit/build-webpack": "0.1303.9",
+        "@angular-devkit/core": "13.3.9",
+        "@babel/core": "7.16.12",
+        "@babel/generator": "7.16.8",
+        "@babel/helper-annotate-as-pure": "7.16.7",
+        "@babel/plugin-proposal-async-generator-functions": "7.16.8",
+        "@babel/plugin-transform-async-to-generator": "7.16.8",
+        "@babel/plugin-transform-runtime": "7.16.10",
+        "@babel/preset-env": "7.16.11",
+        "@babel/runtime": "7.16.7",
+        "@babel/template": "7.16.7",
+        "@discoveryjs/json-ext": "0.5.6",
+        "@ngtools/webpack": "13.3.9",
         "ansi-colors": "4.1.1",
         "ansi-colors": "4.1.1",
-        "babel-loader": "8.2.2",
+        "babel-loader": "8.2.5",
+        "babel-plugin-istanbul": "6.1.1",
         "browserslist": "^4.9.1",
         "browserslist": "^4.9.1",
-        "cacache": "15.2.0",
-        "caniuse-lite": "^1.0.30001032",
+        "cacache": "15.3.0",
         "circular-dependency-plugin": "5.2.2",
         "circular-dependency-plugin": "5.2.2",
-        "copy-webpack-plugin": "9.0.1",
-        "core-js": "3.16.0",
-        "critters": "0.0.12",
-        "css-loader": "6.2.0",
-        "css-minimizer-webpack-plugin": "3.0.2",
-        "esbuild": "0.13.8",
-        "esbuild-wasm": "0.13.8",
-        "find-cache-dir": "3.3.1",
-        "glob": "7.1.7",
+        "copy-webpack-plugin": "10.2.1",
+        "core-js": "3.20.3",
+        "critters": "0.0.16",
+        "css-loader": "6.5.1",
+        "esbuild": "0.14.22",
+        "esbuild-wasm": "0.14.22",
+        "glob": "7.2.0",
         "https-proxy-agent": "5.0.0",
         "https-proxy-agent": "5.0.0",
-        "inquirer": "8.1.2",
+        "inquirer": "8.2.0",
+        "jsonc-parser": "3.0.0",
         "karma-source-map-support": "1.4.0",
         "karma-source-map-support": "1.4.0",
-        "less": "4.1.1",
-        "less-loader": "10.0.1",
-        "license-webpack-plugin": "2.3.20",
-        "loader-utils": "2.0.0",
-        "mini-css-extract-plugin": "2.4.2",
-        "minimatch": "3.0.4",
-        "open": "8.2.1",
+        "less": "4.1.2",
+        "less-loader": "10.2.0",
+        "license-webpack-plugin": "4.0.2",
+        "loader-utils": "3.2.0",
+        "mini-css-extract-plugin": "2.5.3",
+        "minimatch": "3.0.5",
+        "open": "8.4.0",
         "ora": "5.4.1",
         "parse5-html-rewriting-stream": "6.0.1",
         "ora": "5.4.1",
         "parse5-html-rewriting-stream": "6.0.1",
-        "piscina": "3.1.0",
-        "postcss": "8.3.6",
+        "piscina": "3.2.0",
+        "postcss": "8.4.5",
         "postcss-import": "14.0.2",
         "postcss-import": "14.0.2",
-        "postcss-loader": "6.1.1",
-        "postcss-preset-env": "6.7.0",
+        "postcss-loader": "6.2.1",
+        "postcss-preset-env": "7.2.3",
         "regenerator-runtime": "0.13.9",
         "regenerator-runtime": "0.13.9",
-        "resolve-url-loader": "4.0.0",
+        "resolve-url-loader": "5.0.0",
         "rxjs": "6.6.7",
         "rxjs": "6.6.7",
-        "sass": "1.36.0",
-        "sass-loader": "12.1.0",
+        "sass": "1.49.9",
+        "sass-loader": "12.4.0",
         "semver": "7.3.5",
         "semver": "7.3.5",
-        "source-map-loader": "3.0.0",
-        "source-map-support": "0.5.19",
-        "style-loader": "3.2.1",
-        "stylus": "0.54.8",
-        "stylus-loader": "6.1.0",
-        "terser": "5.7.1",
-        "terser-webpack-plugin": "5.1.4",
+        "source-map-loader": "3.0.1",
+        "source-map-support": "0.5.21",
+        "stylus": "0.56.0",
+        "stylus-loader": "6.2.0",
+        "terser": "5.14.2",
         "text-table": "0.2.0",
         "tree-kill": "1.2.2",
         "text-table": "0.2.0",
         "tree-kill": "1.2.2",
-        "tslib": "2.3.0",
-        "webpack": "5.50.0",
-        "webpack-dev-middleware": "5.0.0",
-        "webpack-dev-server": "3.11.2",
+        "tslib": "2.3.1",
+        "webpack": "5.70.0",
+        "webpack-dev-middleware": "5.3.0",
+        "webpack-dev-server": "4.7.3",
         "webpack-merge": "5.8.0",
         "webpack-merge": "5.8.0",
-        "webpack-subresource-integrity": "1.5.2"
+        "webpack-subresource-integrity": "5.1.0"
       },
       "dependencies": {
         "@babel/core": {
       },
       "dependencies": {
         "@babel/core": {
-          "version": "7.14.8",
-          "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.14.8.tgz",
-          "integrity": "sha512-/AtaeEhT6ErpDhInbXmjHcUQXH0L0TEgscfcxk1qbOvLuKCa5aZT0SOOtDKFY96/CLROwbLSKyFor6idgNaU4Q==",
-          "dev": true,
-          "requires": {
-            "@babel/code-frame": "^7.14.5",
-            "@babel/generator": "^7.14.8",
-            "@babel/helper-compilation-targets": "^7.14.5",
-            "@babel/helper-module-transforms": "^7.14.8",
-            "@babel/helpers": "^7.14.8",
-            "@babel/parser": "^7.14.8",
-            "@babel/template": "^7.14.5",
-            "@babel/traverse": "^7.14.8",
-            "@babel/types": "^7.14.8",
+          "version": "7.16.12",
+          "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.16.12.tgz",
+          "integrity": "sha512-dK5PtG1uiN2ikk++5OzSYsitZKny4wOCD0nrO4TqnW4BVBTQ2NGS3NgilvT/TEyxTST7LNyWV/T4tXDoD3fOgg==",
+          "dev": true,
+          "requires": {
+            "@babel/code-frame": "^7.16.7",
+            "@babel/generator": "^7.16.8",
+            "@babel/helper-compilation-targets": "^7.16.7",
+            "@babel/helper-module-transforms": "^7.16.7",
+            "@babel/helpers": "^7.16.7",
+            "@babel/parser": "^7.16.12",
+            "@babel/template": "^7.16.7",
+            "@babel/traverse": "^7.16.10",
+            "@babel/types": "^7.16.8",
             "convert-source-map": "^1.7.0",
             "debug": "^4.1.0",
             "gensync": "^1.0.0-beta.2",
             "convert-source-map": "^1.7.0",
             "debug": "^4.1.0",
             "gensync": "^1.0.0-beta.2",
           }
         },
         "@babel/generator": {
           }
         },
         "@babel/generator": {
-          "version": "7.14.8",
-          "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.14.8.tgz",
-          "integrity": "sha512-cYDUpvIzhBVnMzRoY1fkSEhK/HmwEVwlyULYgn/tMQYd6Obag3ylCjONle3gdErfXBW61SVTlR9QR7uWlgeIkg==",
+          "version": "7.16.8",
+          "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.16.8.tgz",
+          "integrity": "sha512-1ojZwE9+lOXzcWdWmO6TbUzDfqLD39CmEhN8+2cX9XkDo5yW1OpgfejfliysR2AWLpMamTiOiAp/mtroaymhpw==",
           "dev": true,
           "requires": {
           "dev": true,
           "requires": {
-            "@babel/types": "^7.14.8",
+            "@babel/types": "^7.16.8",
             "jsesc": "^2.5.1",
             "source-map": "^0.5.0"
           }
         },
         "@babel/runtime": {
             "jsesc": "^2.5.1",
             "source-map": "^0.5.0"
           }
         },
         "@babel/runtime": {
-          "version": "7.14.8",
-          "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.14.8.tgz",
-          "integrity": "sha512-twj3L8Og5SaCRCErB4x4ajbvBIVV77CGeFglHpeg5WC5FF8TZzBWXtTJ4MqaD9QszLYTtr+IsaAL2rEUevb+eg==",
+          "version": "7.16.7",
+          "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.16.7.tgz",
+          "integrity": "sha512-9E9FJowqAsytyOY6LG+1KuueckRL+aQW+mKvXRXnuFGyRAyepJPmEo9vgMfXUA6O9u3IeEdv9MAkppFcaQwogQ==",
           "dev": true,
           "requires": {
             "regenerator-runtime": "^0.13.4"
           }
         },
         "@babel/template": {
           "dev": true,
           "requires": {
             "regenerator-runtime": "^0.13.4"
           }
         },
         "@babel/template": {
-          "version": "7.14.5",
-          "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.14.5.tgz",
-          "integrity": "sha512-6Z3Po85sfxRGachLULUhOmvAaOo7xCvqGQtxINai2mEGPFm6pQ4z5QInFnUrRpfoSV60BnjyF5F3c+15fxFV1g==",
+          "version": "7.16.7",
+          "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.16.7.tgz",
+          "integrity": "sha512-I8j/x8kHUrbYRTUxXrrMbfCa7jxkE7tZre39x3kjr9hvI82cK1FfqLygotcWN5kdPGWcLdWMHpSBavse5tWw3w==",
           "dev": true,
           "requires": {
           "dev": true,
           "requires": {
-            "@babel/code-frame": "^7.14.5",
-            "@babel/parser": "^7.14.5",
-            "@babel/types": "^7.14.5"
+            "@babel/code-frame": "^7.16.7",
+            "@babel/parser": "^7.16.7",
+            "@babel/types": "^7.16.7"
           }
         },
         "core-js": {
           }
         },
         "core-js": {
-          "version": "3.16.0",
-          "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.16.0.tgz",
-          "integrity": "sha512-5+5VxRFmSf97nM8Jr2wzOwLqRo6zphH2aX+7KsAUONObyzakDNq2G/bgbhinxB4PoV9L3aXQYhiDKyIKWd2c8g==",
+          "version": "3.20.3",
+          "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.20.3.tgz",
+          "integrity": "sha512-vVl8j8ph6tRS3B8qir40H7yw7voy17xL0piAjlbBUsH7WIfzoedL/ZOr1OV9FyZQLWXsayOJyV4tnRyXR85/ag==",
           "dev": true
         },
         "esbuild": {
           "dev": true
         },
         "esbuild": {
-          "version": "0.13.8",
-          "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.13.8.tgz",
-          "integrity": "sha512-A4af7G7YZLfG5OnARJRMtlpEsCkq/zHZQXewgPA864l9D6VjjbH1SuFYK/OSV6BtHwDGkdwyRrX0qQFLnMfUcw==",
+          "version": "0.14.22",
+          "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.14.22.tgz",
+          "integrity": "sha512-CjFCFGgYtbFOPrwZNJf7wsuzesx8kqwAffOlbYcFDLFuUtP8xloK1GH+Ai13Qr0RZQf9tE7LMTHJ2iVGJ1SKZA==",
           "dev": true,
           "optional": true,
           "requires": {
           "dev": true,
           "optional": true,
           "requires": {
-            "esbuild-android-arm64": "0.13.8",
-            "esbuild-darwin-64": "0.13.8",
-            "esbuild-darwin-arm64": "0.13.8",
-            "esbuild-freebsd-64": "0.13.8",
-            "esbuild-freebsd-arm64": "0.13.8",
-            "esbuild-linux-32": "0.13.8",
-            "esbuild-linux-64": "0.13.8",
-            "esbuild-linux-arm": "0.13.8",
-            "esbuild-linux-arm64": "0.13.8",
-            "esbuild-linux-mips64le": "0.13.8",
-            "esbuild-linux-ppc64le": "0.13.8",
-            "esbuild-netbsd-64": "0.13.8",
-            "esbuild-openbsd-64": "0.13.8",
-            "esbuild-sunos-64": "0.13.8",
-            "esbuild-windows-32": "0.13.8",
-            "esbuild-windows-64": "0.13.8",
-            "esbuild-windows-arm64": "0.13.8"
+            "esbuild-android-arm64": "0.14.22",
+            "esbuild-darwin-64": "0.14.22",
+            "esbuild-darwin-arm64": "0.14.22",
+            "esbuild-freebsd-64": "0.14.22",
+            "esbuild-freebsd-arm64": "0.14.22",
+            "esbuild-linux-32": "0.14.22",
+            "esbuild-linux-64": "0.14.22",
+            "esbuild-linux-arm": "0.14.22",
+            "esbuild-linux-arm64": "0.14.22",
+            "esbuild-linux-mips64le": "0.14.22",
+            "esbuild-linux-ppc64le": "0.14.22",
+            "esbuild-linux-riscv64": "0.14.22",
+            "esbuild-linux-s390x": "0.14.22",
+            "esbuild-netbsd-64": "0.14.22",
+            "esbuild-openbsd-64": "0.14.22",
+            "esbuild-sunos-64": "0.14.22",
+            "esbuild-windows-32": "0.14.22",
+            "esbuild-windows-64": "0.14.22",
+            "esbuild-windows-arm64": "0.14.22"
+          }
+        },
+        "lru-cache": {
+          "version": "6.0.0",
+          "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz",
+          "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==",
+          "dev": true,
+          "requires": {
+            "yallist": "^4.0.0"
           }
         },
         "minimatch": {
           }
         },
         "minimatch": {
-          "version": "3.0.4",
-          "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz",
-          "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==",
+          "version": "3.0.5",
+          "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.5.tgz",
+          "integrity": "sha512-tUpxzX0VAzJHjLu0xUfFv1gwVp9ba3IOuRAVH2EGuRW8a5emA2FlACLqiT/lDVtS1W+TGNwqz3sWaNyLgDJWuw==",
           "dev": true,
           "requires": {
             "brace-expansion": "^1.1.7"
           }
         },
           "dev": true,
           "requires": {
             "brace-expansion": "^1.1.7"
           }
         },
+        "regenerator-runtime": {
+          "version": "0.13.9",
+          "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.9.tgz",
+          "integrity": "sha512-p3VT+cOEgxFsRRA9X4lkI1E+k2/CtnKtU4gcxyaCUreilL/vqI6CdZ3wxVUx3UOUg+gnUOQQcRI7BmSI656MYA==",
+          "dev": true
+        },
         "rxjs": {
           "version": "6.6.7",
           "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.7.tgz",
         "rxjs": {
           "version": "6.6.7",
           "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.7.tgz",
             "lru-cache": "^6.0.0"
           }
         },
             "lru-cache": "^6.0.0"
           }
         },
-        "tslib": {
-          "version": "2.3.0",
-          "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.0.tgz",
-          "integrity": "sha512-N82ooyxVNm6h1riLCoyS9e3fuJ3AMG2zIZs2Gd1ATcSFjSA23Q0fzjjZeh0jbJvWVDZ0cJT8yaNNaaXHzueNjg==",
-          "dev": true
-        }
-      }
-    },
-    "@angular-devkit/build-optimizer": {
-      "version": "0.1202.13",
-      "resolved": "https://registry.npmjs.org/@angular-devkit/build-optimizer/-/build-optimizer-0.1202.13.tgz",
-      "integrity": "sha512-XX6rX5+mAl+MiIJDvi5N5mBLWOoskhMJ5r/G1PEqv0CMMJSSw60zUTndjxfq/nrX0PtsV3j/aqHN4Sj0w/gumg==",
-      "dev": true,
-      "requires": {
-        "source-map": "0.7.3",
-        "tslib": "2.3.0",
-        "typescript": "4.3.5"
-      },
-      "dependencies": {
         "source-map": {
         "source-map": {
-          "version": "0.7.3",
-          "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz",
-          "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==",
+          "version": "0.5.7",
+          "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz",
+          "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==",
           "dev": true
         },
           "dev": true
         },
-        "tslib": {
-          "version": "2.3.0",
-          "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.0.tgz",
-          "integrity": "sha512-N82ooyxVNm6h1riLCoyS9e3fuJ3AMG2zIZs2Gd1ATcSFjSA23Q0fzjjZeh0jbJvWVDZ0cJT8yaNNaaXHzueNjg==",
+        "yallist": {
+          "version": "4.0.0",
+          "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
+          "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==",
           "dev": true
         }
       }
     },
     "@angular-devkit/build-webpack": {
           "dev": true
         }
       }
     },
     "@angular-devkit/build-webpack": {
-      "version": "0.1202.13",
-      "resolved": "https://registry.npmjs.org/@angular-devkit/build-webpack/-/build-webpack-0.1202.13.tgz",
-      "integrity": "sha512-KafzGyHuU2gBKaSICfMTFP2niTYZ/46DKU94TQ0lCILdJZsj0NE5M/288LSCbYgu2c7srJKz+Rvb+JcYGxIZ1g==",
+      "version": "0.1303.9",
+      "resolved": "https://registry.npmjs.org/@angular-devkit/build-webpack/-/build-webpack-0.1303.9.tgz",
+      "integrity": "sha512-CdYXvAN1xAik8FyfdF1B8Nt1B/1aBvkZr65AUVFOmP6wuVzcdn78BMZmZD42srYbV2449sWi5Vyo/j0a/lfJww==",
       "dev": true,
       "requires": {
       "dev": true,
       "requires": {
-        "@angular-devkit/architect": "0.1202.13",
+        "@angular-devkit/architect": "0.1303.9",
         "rxjs": "6.6.7"
       },
       "dependencies": {
         "rxjs": "6.6.7"
       },
       "dependencies": {
       }
     },
     "@angular-devkit/core": {
       }
     },
     "@angular-devkit/core": {
-      "version": "12.2.13",
-      "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-12.2.13.tgz",
-      "integrity": "sha512-9csMF0p+lTvlWnutxxTZ/+pDRMIbXk/TV4MGLbcqUPPfeG3dCRwErns73xLuMTwp9qO/KCLkFqNaM6cGOoqsDA==",
+      "version": "13.3.9",
+      "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-13.3.9.tgz",
+      "integrity": "sha512-XqCuIWyoqIsLABjV3GQL/+EiBCt3xVPPtNp3Mg4gjBsDLW7PEnvbb81yGkiZQmIsq4EIyQC/6fQa3VdjsCshGg==",
       "dev": true,
       "requires": {
       "dev": true,
       "requires": {
-        "ajv": "8.6.2",
-        "ajv-formats": "2.1.0",
+        "ajv": "8.9.0",
+        "ajv-formats": "2.1.1",
         "fast-json-stable-stringify": "2.1.0",
         "magic-string": "0.25.7",
         "rxjs": "6.6.7",
         "fast-json-stable-stringify": "2.1.0",
         "magic-string": "0.25.7",
         "rxjs": "6.6.7",
             "tslib": "^1.9.0"
           }
         },
             "tslib": "^1.9.0"
           }
         },
-        "source-map": {
-          "version": "0.7.3",
-          "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz",
-          "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==",
-          "dev": true
-        },
         "tslib": {
           "version": "1.14.1",
           "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz",
         "tslib": {
           "version": "1.14.1",
           "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz",
       }
     },
     "@angular-devkit/schematics": {
       }
     },
     "@angular-devkit/schematics": {
-      "version": "12.2.13",
-      "resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-12.2.13.tgz",
-      "integrity": "sha512-LQTv72R5Ma1uowMEeii2wIoDWI4bYQyZvunqPy9jRveBTjli2yVwwcOziGCVyttwlYs46bSdxThgeEvVIako2w==",
+      "version": "13.3.9",
+      "resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-13.3.9.tgz",
+      "integrity": "sha512-oNHLNtwbtEJ0dYPPXy1NpfRdSiFsYBl7+ozJklLgNV/AEOxlSi2qlVx6DoxNVjz5XgQ7Z+eoVDMw7ewGPnGSyA==",
       "dev": true,
       "requires": {
       "dev": true,
       "requires": {
-        "@angular-devkit/core": "12.2.13",
+        "@angular-devkit/core": "13.3.9",
+        "jsonc-parser": "3.0.0",
+        "magic-string": "0.25.7",
         "ora": "5.4.1",
         "rxjs": "6.6.7"
       },
         "ora": "5.4.1",
         "rxjs": "6.6.7"
       },
         }
       }
     },
         }
       }
     },
+    "@angular-eslint/builder": {
+      "version": "13.5.0",
+      "resolved": "https://registry.npmjs.org/@angular-eslint/builder/-/builder-13.5.0.tgz",
+      "integrity": "sha512-IYY/HYS4fSddJLs2pAkMkKhHL07driUILPxGnGLblfWuoJBhRspyrVL3uZc3Q4iJXc1RJfaOno9oRw11FGyL6Q==",
+      "dev": true,
+      "requires": {
+        "@nrwl/devkit": "13.1.3"
+      }
+    },
+    "@angular-eslint/bundled-angular-compiler": {
+      "version": "13.5.0",
+      "resolved": "https://registry.npmjs.org/@angular-eslint/bundled-angular-compiler/-/bundled-angular-compiler-13.5.0.tgz",
+      "integrity": "sha512-7M/5ilxqPD3ydgqqdLsYs3kBwZgNg2Y6C01B5SEHZNLqLT9kAJa7I4y6GlxCZqejCIh554kdXGeV3abIxFccSg==",
+      "dev": true
+    },
+    "@angular-eslint/eslint-plugin": {
+      "version": "13.5.0",
+      "resolved": "https://registry.npmjs.org/@angular-eslint/eslint-plugin/-/eslint-plugin-13.5.0.tgz",
+      "integrity": "sha512-k9o9WIqUkdO8tdYFCJ54PUWsNd9HHflih/GmA13EWciBYx8QxciwBh0u4NSAnbtOwp4Y7juGZ/Dta5ZrT/2VBA==",
+      "dev": true,
+      "requires": {
+        "@angular-eslint/utils": "13.5.0",
+        "@typescript-eslint/experimental-utils": "5.27.1"
+      }
+    },
+    "@angular-eslint/eslint-plugin-template": {
+      "version": "13.5.0",
+      "resolved": "https://registry.npmjs.org/@angular-eslint/eslint-plugin-template/-/eslint-plugin-template-13.5.0.tgz",
+      "integrity": "sha512-ZVSXayn8MqYOhYomH2Cjc0azhuUQbY9fp9dKjJZOD64KhP8BYHw8+Ogc9E/FU5oZQ9fKw6A+23NAYKmLNqSAgA==",
+      "dev": true,
+      "requires": {
+        "@angular-eslint/bundled-angular-compiler": "13.5.0",
+        "@typescript-eslint/experimental-utils": "5.27.1",
+        "aria-query": "^4.2.2",
+        "axobject-query": "^2.2.0"
+      }
+    },
+    "@angular-eslint/schematics": {
+      "version": "13.5.0",
+      "resolved": "https://registry.npmjs.org/@angular-eslint/schematics/-/schematics-13.5.0.tgz",
+      "integrity": "sha512-0LvdalNpYb0oWwptwkeK2PVokfQ9itMIp8/aMjbOLH1RQ3eHFZgBtVvVm3G5EpPKzbL0llaeTifZvH2z70qVYQ==",
+      "dev": true,
+      "requires": {
+        "@angular-eslint/eslint-plugin": "13.5.0",
+        "@angular-eslint/eslint-plugin-template": "13.5.0",
+        "ignore": "5.2.0",
+        "strip-json-comments": "3.1.1",
+        "tmp": "0.2.1"
+      },
+      "dependencies": {
+        "ignore": {
+          "version": "5.2.0",
+          "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.0.tgz",
+          "integrity": "sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ==",
+          "dev": true
+        },
+        "strip-json-comments": {
+          "version": "3.1.1",
+          "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz",
+          "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==",
+          "dev": true
+        },
+        "tmp": {
+          "version": "0.2.1",
+          "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.1.tgz",
+          "integrity": "sha512-76SUhtfqR2Ijn+xllcI5P1oyannHNHByD80W1q447gU3mp9G9PSpGdWmjUOHRDPiHYacIk66W7ubDTuPF3BEtQ==",
+          "dev": true,
+          "requires": {
+            "rimraf": "^3.0.0"
+          }
+        }
+      }
+    },
+    "@angular-eslint/template-parser": {
+      "version": "13.5.0",
+      "resolved": "https://registry.npmjs.org/@angular-eslint/template-parser/-/template-parser-13.5.0.tgz",
+      "integrity": "sha512-k+24+kBjaOuthfp9RBQB0zH6UqeizZuFQFEuZEQbvirPbdQ2SqNBw7IcmW2Qw1v7fjFe6/6gqK7wm2g7o9ZZvA==",
+      "dev": true,
+      "requires": {
+        "@angular-eslint/bundled-angular-compiler": "13.5.0",
+        "eslint-scope": "^5.1.0"
+      }
+    },
+    "@angular-eslint/utils": {
+      "version": "13.5.0",
+      "resolved": "https://registry.npmjs.org/@angular-eslint/utils/-/utils-13.5.0.tgz",
+      "integrity": "sha512-wX3W6STSDJDJ7ZyEsUdBp4HUPwmillMmKcdnFsy+qxbpJFzFOxOFpK1zet4ELsq1XpB89i9vRvC3vYbpHn3CSw==",
+      "dev": true,
+      "requires": {
+        "@angular-eslint/bundled-angular-compiler": "13.5.0",
+        "@typescript-eslint/experimental-utils": "5.27.1"
+      }
+    },
     "@angular/animations": {
     "@angular/animations": {
-      "version": "12.2.13",
-      "resolved": "https://registry.npmjs.org/@angular/animations/-/animations-12.2.13.tgz",
-      "integrity": "sha512-qpdmvu+nxsKnimJ3Hc1joNuzK7xXYyE+VtNMk4K77Ao/9+5C/juGMce85DhqZCcu1xraZ3YYIrzYmL/GgdUK4g==",
+      "version": "13.3.11",
+      "resolved": "https://registry.npmjs.org/@angular/animations/-/animations-13.3.11.tgz",
+      "integrity": "sha512-KE/3RuvixHIk9YTSwaUsezsUm9Ig9Y8rZMpHOT/8bRtzPiJ5ld2GnDHjrJgyZn7TdoP4wz4YCta5eC4ycu+KCw==",
       "requires": {
       "requires": {
-        "tslib": "^2.2.0"
+        "tslib": "^2.3.0"
       }
     },
     "@angular/cli": {
       }
     },
     "@angular/cli": {
-      "version": "12.2.13",
-      "resolved": "https://registry.npmjs.org/@angular/cli/-/cli-12.2.13.tgz",
-      "integrity": "sha512-Yz6MuwdxxP6U2i8iRuCSNZeJxlLDPshT/joymCsFdjwSMGEH9Kk9DdvAfFYfzdHGdHbGrDdASJ4G+uALyNSLxw==",
+      "version": "13.3.9",
+      "resolved": "https://registry.npmjs.org/@angular/cli/-/cli-13.3.9.tgz",
+      "integrity": "sha512-b64mfB7A8vw5QmopEnkCVhGH8zDX5FrQVKKCRlK1dO3GEtAdfhFJb5J7TBbCOwp1XfYJ5jl+biNQy4HoX5HQPw==",
       "dev": true,
       "requires": {
       "dev": true,
       "requires": {
-        "@angular-devkit/architect": "0.1202.13",
-        "@angular-devkit/core": "12.2.13",
-        "@angular-devkit/schematics": "12.2.13",
-        "@schematics/angular": "12.2.13",
+        "@angular-devkit/architect": "0.1303.9",
+        "@angular-devkit/core": "13.3.9",
+        "@angular-devkit/schematics": "13.3.9",
+        "@schematics/angular": "13.3.9",
         "@yarnpkg/lockfile": "1.1.0",
         "ansi-colors": "4.1.1",
         "@yarnpkg/lockfile": "1.1.0",
         "ansi-colors": "4.1.1",
-        "debug": "4.3.2",
+        "debug": "4.3.3",
         "ini": "2.0.0",
         "ini": "2.0.0",
-        "inquirer": "8.1.2",
+        "inquirer": "8.2.0",
         "jsonc-parser": "3.0.0",
         "npm-package-arg": "8.1.5",
         "npm-pick-manifest": "6.1.1",
         "jsonc-parser": "3.0.0",
         "npm-package-arg": "8.1.5",
         "npm-pick-manifest": "6.1.1",
-        "open": "8.2.1",
+        "open": "8.4.0",
         "ora": "5.4.1",
         "ora": "5.4.1",
-        "pacote": "11.3.5",
-        "resolve": "1.20.0",
+        "pacote": "12.0.3",
+        "resolve": "1.22.0",
         "semver": "7.3.5",
         "symbol-observable": "4.0.0",
         "uuid": "8.3.2"
       },
       "dependencies": {
         "debug": {
         "semver": "7.3.5",
         "symbol-observable": "4.0.0",
         "uuid": "8.3.2"
       },
       "dependencies": {
         "debug": {
-          "version": "4.3.2",
-          "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz",
-          "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==",
+          "version": "4.3.3",
+          "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.3.tgz",
+          "integrity": "sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==",
           "dev": true,
           "requires": {
             "ms": "2.1.2"
           }
         },
           "dev": true,
           "requires": {
             "ms": "2.1.2"
           }
         },
+        "ini": {
+          "version": "2.0.0",
+          "resolved": "https://registry.npmjs.org/ini/-/ini-2.0.0.tgz",
+          "integrity": "sha512-7PnF4oN3CvZF23ADhA5wRaYEQpJ8qygSkbtTXWBeXWXmEVRXK+1ITciHWwHhsjv1TmW0MgacIv6hEi5pX5NQdA==",
+          "dev": true
+        },
+        "lru-cache": {
+          "version": "6.0.0",
+          "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz",
+          "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==",
+          "dev": true,
+          "requires": {
+            "yallist": "^4.0.0"
+          }
+        },
         "resolve": {
         "resolve": {
-          "version": "1.20.0",
-          "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.20.0.tgz",
-          "integrity": "sha512-wENBPt4ySzg4ybFQW2TT1zMQucPK95HSh/nq2CFTZVOGut2+pQvSsgtda4d26YrYcr067wjbmzOG8byDPBX63A==",
+          "version": "1.22.0",
+          "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.0.tgz",
+          "integrity": "sha512-Hhtrw0nLeSrFQ7phPp4OOcVjLPIeMnRlr5mcnVuMe7M/7eBn98A3hmFRLoFo3DLZkivSYwhRUJTyPyWAk56WLw==",
           "dev": true,
           "requires": {
           "dev": true,
           "requires": {
-            "is-core-module": "^2.2.0",
-            "path-parse": "^1.0.6"
+            "is-core-module": "^2.8.1",
+            "path-parse": "^1.0.7",
+            "supports-preserve-symlinks-flag": "^1.0.0"
           }
         },
         "semver": {
           }
         },
         "semver": {
           "requires": {
             "lru-cache": "^6.0.0"
           }
           "requires": {
             "lru-cache": "^6.0.0"
           }
+        },
+        "yallist": {
+          "version": "4.0.0",
+          "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
+          "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==",
+          "dev": true
         }
       }
     },
     "@angular/common": {
         }
       }
     },
     "@angular/common": {
-      "version": "12.2.13",
-      "resolved": "https://registry.npmjs.org/@angular/common/-/common-12.2.13.tgz",
-      "integrity": "sha512-I1t/jl9ojCwTJKT7PKHnk23D+vMHTHS/9qZ2nndCjzGusMK8029nn8l3tHAkwefvxZWSaLAk1MgsVcP+rHQNsQ==",
+      "version": "13.3.11",
+      "resolved": "https://registry.npmjs.org/@angular/common/-/common-13.3.11.tgz",
+      "integrity": "sha512-gPMwDYIAag1izXm2tRQ6EOIx9FVEUqLdr+qYtRVoQtoBmfkoTSLGcpeBXqqlPVxVPbA6Li1WZZT5wxLLlLAN+Q==",
       "requires": {
       "requires": {
-        "tslib": "^2.2.0"
+        "tslib": "^2.3.0"
       }
     },
     "@angular/compiler": {
       }
     },
     "@angular/compiler": {
-      "version": "12.2.13",
-      "resolved": "https://registry.npmjs.org/@angular/compiler/-/compiler-12.2.13.tgz",
-      "integrity": "sha512-L0saTTJJtxldjhaGIL6b1BCfodPOEz4Wrev3pEUK5UcODooj5HLiE/aO6jiNb8M4XTbdqByKyqvZyWzGHeexVQ==",
+      "version": "13.3.11",
+      "resolved": "https://registry.npmjs.org/@angular/compiler/-/compiler-13.3.11.tgz",
+      "integrity": "sha512-EV6JCBbXdHDHbPShWmymvuoxFYG0KVc8sDJpYp47WLHCY2zgZaXhvWs//Hrls3fmi+TGTekgRa2jOBBNce/Ggg==",
       "requires": {
       "requires": {
-        "tslib": "^2.2.0"
+        "tslib": "^2.3.0"
       }
     },
     "@angular/compiler-cli": {
       }
     },
     "@angular/compiler-cli": {
-      "version": "12.2.13",
-      "resolved": "https://registry.npmjs.org/@angular/compiler-cli/-/compiler-cli-12.2.13.tgz",
-      "integrity": "sha512-qmnmihl3SCRooj/mCsNIZLtnQ6qbx1/L6aMIEQosPvQhMeGMt8GCYvQPE8IZ+sahv7fih95HCWNa9TeLpOylug==",
+      "version": "13.3.11",
+      "resolved": "https://registry.npmjs.org/@angular/compiler-cli/-/compiler-cli-13.3.11.tgz",
+      "integrity": "sha512-cl+3Wzxt8NRi2WY+RdsxuQ3yQRUp8pSlfSlJJnfaKE1BEqap6uem2DovuhnIbmrLhxZ5xt7o+I1szyO6sn6+ag==",
       "dev": true,
       "requires": {
       "dev": true,
       "requires": {
-        "@babel/core": "^7.8.6",
-        "@babel/types": "^7.8.6",
-        "canonical-path": "1.0.0",
+        "@babel/core": "^7.17.2",
         "chokidar": "^3.0.0",
         "convert-source-map": "^1.5.1",
         "dependency-graph": "^0.11.0",
         "chokidar": "^3.0.0",
         "convert-source-map": "^1.5.1",
         "dependency-graph": "^0.11.0",
-        "magic-string": "^0.25.0",
-        "minimist": "^1.2.0",
+        "magic-string": "^0.26.0",
         "reflect-metadata": "^0.1.2",
         "semver": "^7.0.0",
         "reflect-metadata": "^0.1.2",
         "semver": "^7.0.0",
-        "source-map": "^0.6.1",
         "sourcemap-codec": "^1.4.8",
         "sourcemap-codec": "^1.4.8",
-        "tslib": "^2.2.0",
-        "yargs": "^17.0.0"
+        "tslib": "^2.3.0",
+        "yargs": "^17.2.1"
       },
       "dependencies": {
       },
       "dependencies": {
-        "@ampproject/remapping": {
-          "version": "2.2.0",
-          "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.0.tgz",
-          "integrity": "sha512-qRmjj8nj9qmLTQXXmaR1cck3UXSRMPrbsLJAasZpF+t3riI71BXed5ebIOYwQntykeZuhjsdweEc9BxH5Jc26w==",
-          "dev": true,
-          "requires": {
-            "@jridgewell/gen-mapping": "^0.1.0",
-            "@jridgewell/trace-mapping": "^0.3.9"
-          }
-        },
-        "@babel/core": {
-          "version": "7.18.10",
-          "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.18.10.tgz",
-          "integrity": "sha512-JQM6k6ENcBFKVtWvLavlvi/mPcpYZ3+R+2EySDEMSMbp7Mn4FexlbbJVrx2R7Ijhr01T8gyqrOaABWIOgxeUyw==",
+        "lru-cache": {
+          "version": "6.0.0",
+          "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz",
+          "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==",
           "dev": true,
           "requires": {
           "dev": true,
           "requires": {
-            "@ampproject/remapping": "^2.1.0",
-            "@babel/code-frame": "^7.18.6",
-            "@babel/generator": "^7.18.10",
-            "@babel/helper-compilation-targets": "^7.18.9",
-            "@babel/helper-module-transforms": "^7.18.9",
-            "@babel/helpers": "^7.18.9",
-            "@babel/parser": "^7.18.10",
-            "@babel/template": "^7.18.10",
-            "@babel/traverse": "^7.18.10",
-            "@babel/types": "^7.18.10",
-            "convert-source-map": "^1.7.0",
-            "debug": "^4.1.0",
-            "gensync": "^1.0.0-beta.2",
-            "json5": "^2.2.1",
-            "semver": "^6.3.0"
-          },
-          "dependencies": {
-            "semver": {
-              "version": "6.3.0",
-              "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
-              "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==",
-              "dev": true
-            }
+            "yallist": "^4.0.0"
           }
         },
           }
         },
-        "@jridgewell/gen-mapping": {
-          "version": "0.1.1",
-          "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.1.1.tgz",
-          "integrity": "sha512-sQXCasFk+U8lWYEe66WxRDOE9PjVz4vSM51fTu3Hw+ClTpUSQb718772vH3pyS5pShp6lvQM7SxgIDXXXmOX7w==",
+        "magic-string": {
+          "version": "0.26.7",
+          "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.26.7.tgz",
+          "integrity": "sha512-hX9XH3ziStPoPhJxLq1syWuZMxbDvGNbVchfrdCtanC7D13888bMFow61x8axrx+GfHLtVeAx2kxL7tTGRl+Ow==",
           "dev": true,
           "requires": {
           "dev": true,
           "requires": {
-            "@jridgewell/set-array": "^1.0.0",
-            "@jridgewell/sourcemap-codec": "^1.4.10"
+            "sourcemap-codec": "^1.4.8"
           }
         },
         "semver": {
           }
         },
         "semver": {
-          "version": "7.3.7",
-          "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.7.tgz",
-          "integrity": "sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g==",
+          "version": "7.3.8",
+          "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz",
+          "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==",
           "dev": true,
           "requires": {
             "lru-cache": "^6.0.0"
           }
         },
           "dev": true,
           "requires": {
             "lru-cache": "^6.0.0"
           }
         },
-        "source-map": {
-          "version": "0.6.1",
-          "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
-          "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+        "yallist": {
+          "version": "4.0.0",
+          "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
+          "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==",
           "dev": true
         }
       }
     },
     "@angular/core": {
           "dev": true
         }
       }
     },
     "@angular/core": {
-      "version": "12.2.13",
-      "resolved": "https://registry.npmjs.org/@angular/core/-/core-12.2.13.tgz",
-      "integrity": "sha512-tZ5nAnmOi418JDaJIFiiP9z2JrluMJZvUvXO4QDUs52BXaL2yuP7MJ2LczWOVJXrBLZXeZGfjDjZmaFPA24grg==",
+      "version": "13.3.11",
+      "resolved": "https://registry.npmjs.org/@angular/core/-/core-13.3.11.tgz",
+      "integrity": "sha512-9BmE2CxyV0g+AkBeuc8IwjSOiJ8Y+kptXnqD/J8EAFT3B0/fLGVnjFdZC6Sev9L0SNZb6qdzebpfIOLqbUjReQ==",
       "requires": {
       "requires": {
-        "tslib": "^2.2.0"
+        "tslib": "^2.3.0"
       }
     },
     "@angular/forms": {
       }
     },
     "@angular/forms": {
-      "version": "12.2.13",
-      "resolved": "https://registry.npmjs.org/@angular/forms/-/forms-12.2.13.tgz",
-      "integrity": "sha512-wa7I5R8sck2q+VWNL262GJTVxtpEHMys8Bt6oE+lyHB5zlZAgOXwAb8GE4XVwuc+BZU1Gvrocn21P/8KvDY1uw==",
+      "version": "13.3.11",
+      "resolved": "https://registry.npmjs.org/@angular/forms/-/forms-13.3.11.tgz",
+      "integrity": "sha512-iMgTNB+Qc3TsfAZSk1FnUE6MVoddPzxhG9AKCfSlvpjFh8VmXkIjxPL3dun7J8OjayT3X+B8f7LZ9AkKNXtBKw==",
       "requires": {
       "requires": {
-        "tslib": "^2.2.0"
+        "tslib": "^2.3.0"
       }
     },
     "@angular/language-service": {
       }
     },
     "@angular/language-service": {
-      "version": "12.2.13",
-      "resolved": "https://registry.npmjs.org/@angular/language-service/-/language-service-12.2.13.tgz",
-      "integrity": "sha512-jb9s3IJuWNKTRcM90NOwvMfiy85nnKfTxxLVn8/QFMO6+Ps/hsVZNp+W/TmAEDvCkon+9q0O4hwa4MY1m/Dlkw==",
+      "version": "13.3.11",
+      "resolved": "https://registry.npmjs.org/@angular/language-service/-/language-service-13.3.11.tgz",
+      "integrity": "sha512-EDw8L0RKrRYUYWB2P0xS1WRazYvv5gOguX+IwPZlCpR95QLQPTTpmNaqvnYjmFlvQjGHJYc8wqtJJIIMiL6FSA==",
       "dev": true
     },
     "@angular/localize": {
       "dev": true
     },
     "@angular/localize": {
-      "version": "12.2.13",
-      "resolved": "https://registry.npmjs.org/@angular/localize/-/localize-12.2.13.tgz",
-      "integrity": "sha512-mAGs86JaWaoHN/+Mmvq1QppiTbIT1FWC5cUe0dnpGStfoKqiULPSjiHTzlfJw/eUZUMOMD7C8kjbbhv3jjLTIQ==",
+      "version": "13.3.11",
+      "resolved": "https://registry.npmjs.org/@angular/localize/-/localize-13.3.11.tgz",
+      "integrity": "sha512-plMAkj07mcYYsidv7R4NFRYdxQEJJMK7IGp7BeaEwtrBbplqQORIMy2HOUDet/gWg/D1b/KFTjTAhlmNdczYtg==",
       "requires": {
       "requires": {
-        "@babel/core": "7.8.3",
-        "glob": "7.1.7",
-        "yargs": "^17.0.0"
+        "@babel/core": "7.17.2",
+        "glob": "7.2.0",
+        "yargs": "^17.2.1"
       }
     },
     "@angular/platform-browser": {
       }
     },
     "@angular/platform-browser": {
-      "version": "12.2.13",
-      "resolved": "https://registry.npmjs.org/@angular/platform-browser/-/platform-browser-12.2.13.tgz",
-      "integrity": "sha512-Ua8m2GtG2msqz/Mr/MK7s8RXud554x8cup2THVAwetyTaY5th/1LOZX0hhDIhfsxBCLHnC53LRhMbSsI0cikOg==",
+      "version": "13.3.11",
+      "resolved": "https://registry.npmjs.org/@angular/platform-browser/-/platform-browser-13.3.11.tgz",
+      "integrity": "sha512-PG3chCErARb6wNzkOed2NsZmgvTmbumRx/6sMXqGkDKXYQm0JULnl4X42Rn+JCgJ9DLJi5/jrd1dbcBCrKk9Vg==",
       "requires": {
       "requires": {
-        "tslib": "^2.2.0"
+        "tslib": "^2.3.0"
       }
     },
     "@angular/platform-browser-dynamic": {
       }
     },
     "@angular/platform-browser-dynamic": {
-      "version": "12.2.13",
-      "resolved": "https://registry.npmjs.org/@angular/platform-browser-dynamic/-/platform-browser-dynamic-12.2.13.tgz",
-      "integrity": "sha512-a7y7R3vOXhMAk9uQWK5/23DefahuF0UYJSFM/wKeVo5zR+qOCVCTfafkJMcWbuZWTrSDbVafJ1xbcWnu3+TkCg==",
+      "version": "13.3.11",
+      "resolved": "https://registry.npmjs.org/@angular/platform-browser-dynamic/-/platform-browser-dynamic-13.3.11.tgz",
+      "integrity": "sha512-xM0VRC1Nw//SHO3gkghUHyjCaaQbk1UYMq4vIu3iKVq9KLqOSZgccv0NcOKHzXXN3S5RgX2auuyOUOCD6ny1Pg==",
       "requires": {
       "requires": {
-        "tslib": "^2.2.0"
+        "tslib": "^2.3.0"
       }
     },
     "@angular/router": {
       }
     },
     "@angular/router": {
-      "version": "12.2.13",
-      "resolved": "https://registry.npmjs.org/@angular/router/-/router-12.2.13.tgz",
-      "integrity": "sha512-HZL/Pzp6I7fQiMLrzfEzhnqhgNcGcFjBgMMOoLp5IA1IV26rp1NU6zYJzPrXtopBx7XLl8BECehAwFqrJsu/PQ==",
+      "version": "13.3.11",
+      "resolved": "https://registry.npmjs.org/@angular/router/-/router-13.3.11.tgz",
+      "integrity": "sha512-bJTcxDYKEyoqtsi1kJcDJWLmEN+dXpwhU07SsqUwfyN4V5fYF1ApDhpJ4c17hNdjEqe106srT9tiHXhmWayhmQ==",
       "requires": {
       "requires": {
-        "tslib": "^2.2.0"
+        "tslib": "^2.3.0"
       }
     },
     "@applitools/dom-capture": {
       }
     },
     "@applitools/dom-capture": {
         "@applitools/functional-commons": "1.6.0",
         "css-tree": "1.0.0-alpha.39",
         "pako": "1.0.11"
         "@applitools/functional-commons": "1.6.0",
         "css-tree": "1.0.0-alpha.39",
         "pako": "1.0.11"
-      },
-      "dependencies": {
-        "css-tree": {
-          "version": "1.0.0-alpha.39",
-          "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.0.0-alpha.39.tgz",
-          "integrity": "sha512-7UvkEYgBAHRG9Nt980lYxjsTrCyHFN53ky3wVsDkiMdVqylqRt+Zc+jm5qw7/qyOvN2dHSYtX0e4MbCCExSvnA==",
-          "dev": true,
-          "requires": {
-            "mdn-data": "2.0.6",
-            "source-map": "^0.6.1"
-          }
-        },
-        "mdn-data": {
-          "version": "2.0.6",
-          "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.6.tgz",
-          "integrity": "sha512-rQvjv71olwNHgiTbfPZFkJtjNMciWgswYeciZhtvWLO8bmX3TnhyA62I6sTWOyZssWHJJjY6/KiWwqQsWWsqOA==",
-          "dev": true
-        },
-        "source-map": {
-          "version": "0.6.1",
-          "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
-          "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
-          "dev": true
-        }
       }
     },
     "@applitools/driver": {
       }
     },
     "@applitools/driver": {
             "unpipe": "1.0.0"
           }
         },
             "unpipe": "1.0.0"
           }
         },
+        "safe-buffer": {
+          "version": "5.1.2",
+          "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz",
+          "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==",
+          "dev": true
+        },
         "send": {
           "version": "0.17.1",
           "resolved": "https://registry.npmjs.org/send/-/send-0.17.1.tgz",
         "send": {
           "version": "0.17.1",
           "resolved": "https://registry.npmjs.org/send/-/send-0.17.1.tgz",
             "color-convert": "^2.0.1"
           }
         },
             "color-convert": "^2.0.1"
           }
         },
+        "axios": {
+          "version": "0.21.4",
+          "resolved": "https://registry.npmjs.org/axios/-/axios-0.21.4.tgz",
+          "integrity": "sha512-ut5vewkiu8jjGBdqpM44XxjuCjq9LAKeHVmoVfHVzy8eHgxxq8SbAVQNovDA8mVi05kP0Ea/n/UzcSHcTJQfNg==",
+          "dev": true,
+          "requires": {
+            "follow-redirects": "^1.14.0"
+          }
+        },
         "chalk": {
           "version": "3.0.0",
           "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz",
         "chalk": {
           "version": "3.0.0",
           "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz",
             "ms": "2.1.2"
           }
         },
             "ms": "2.1.2"
           }
         },
+        "deepmerge": {
+          "version": "4.2.2",
+          "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.2.2.tgz",
+          "integrity": "sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg==",
+          "dev": true
+        },
         "has-flag": {
           "version": "4.0.0",
           "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
         "has-flag": {
           "version": "4.0.0",
           "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
           "dev": true
         },
         "punycode": {
           "dev": true
         },
         "punycode": {
-          "version": "2.1.1",
-          "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz",
-          "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==",
+          "version": "2.3.0",
+          "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.0.tgz",
+          "integrity": "sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==",
           "dev": true
         },
           "dev": true
         },
-        "tough-cookie": {
-          "version": "3.0.1",
-          "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-3.0.1.tgz",
-          "integrity": "sha512-yQyJ0u4pZsv9D4clxO69OEjLWYw+jbgspjTue4lTQZLfV0c5l1VmK2y1JK8E9ahdpltPOaAThPcp5nKPUgSnsg==",
-          "dev": true,
-          "requires": {
-            "ip-regex": "^2.1.0",
-            "psl": "^1.1.28",
-            "punycode": "^2.1.1"
-          }
-        },
         "tr46": {
           "version": "1.0.1",
           "resolved": "https://registry.npmjs.org/tr46/-/tr46-1.0.1.tgz",
         "tr46": {
           "version": "1.0.1",
           "resolved": "https://registry.npmjs.org/tr46/-/tr46-1.0.1.tgz",
         }
       }
     },
         }
       }
     },
+    "@apteco/ngth": {
+      "version": "1.5.0",
+      "resolved": "https://registry.npmjs.org/@apteco/ngth/-/ngth-1.5.0.tgz",
+      "integrity": "sha512-LBpdybaZbc5PFj8ifNIf6dXGeoQ8tlPhfbN2skcM12ojAe8qH2ymHx9f/ZggVs+KyBuVQLVuJ++jzukG13wryw==",
+      "dev": true,
+      "requires": {
+        "tslib": "^2.3.0"
+      }
+    },
     "@assemblyscript/loader": {
       "version": "0.10.1",
       "resolved": "https://registry.npmjs.org/@assemblyscript/loader/-/loader-0.10.1.tgz",
     "@assemblyscript/loader": {
       "version": "0.10.1",
       "resolved": "https://registry.npmjs.org/@assemblyscript/loader/-/loader-0.10.1.tgz",
       }
     },
     "@babel/compat-data": {
       }
     },
     "@babel/compat-data": {
-      "version": "7.18.8",
-      "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.18.8.tgz",
-      "integrity": "sha512-HSmX4WZPPK3FUxYp7g2T6EyO8j96HlZJlxmKPSh6KAcqwyDrfx7hKjXpAW/0FhFfTJsR0Yt4lAjLI2coMptIHQ==",
-      "dev": true
+      "version": "7.21.0",
+      "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.21.0.tgz",
+      "integrity": "sha512-gMuZsmsgxk/ENC3O/fRw5QY8A9/uxQbbCEypnLIiYYc/qVJtEV7ouxC3EllIIwNzMqAQee5tanFabWsUOutS7g=="
     },
     "@babel/core": {
     },
     "@babel/core": {
-      "version": "7.8.3",
-      "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.8.3.tgz",
-      "integrity": "sha512-4XFkf8AwyrEG7Ziu3L2L0Cv+WyY47Tcsp70JFmpftbAA1K7YL/sgE9jh9HyNj08Y/U50ItUchpN0w6HxAoX1rA==",
-      "requires": {
-        "@babel/code-frame": "^7.8.3",
-        "@babel/generator": "^7.8.3",
-        "@babel/helpers": "^7.8.3",
-        "@babel/parser": "^7.8.3",
-        "@babel/template": "^7.8.3",
-        "@babel/traverse": "^7.8.3",
-        "@babel/types": "^7.8.3",
+      "version": "7.17.2",
+      "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.17.2.tgz",
+      "integrity": "sha512-R3VH5G42VSDolRHyUO4V2cfag8WHcZyxdq5Z/m8Xyb92lW/Erm/6kM+XtRFGf3Mulre3mveni2NHfEUws8wSvw==",
+      "requires": {
+        "@ampproject/remapping": "^2.0.0",
+        "@babel/code-frame": "^7.16.7",
+        "@babel/generator": "^7.17.0",
+        "@babel/helper-compilation-targets": "^7.16.7",
+        "@babel/helper-module-transforms": "^7.16.7",
+        "@babel/helpers": "^7.17.2",
+        "@babel/parser": "^7.17.0",
+        "@babel/template": "^7.16.7",
+        "@babel/traverse": "^7.17.0",
+        "@babel/types": "^7.17.0",
         "convert-source-map": "^1.7.0",
         "debug": "^4.1.0",
         "convert-source-map": "^1.7.0",
         "debug": "^4.1.0",
-        "gensync": "^1.0.0-beta.1",
-        "json5": "^2.1.0",
-        "lodash": "^4.17.13",
-        "resolve": "^1.3.2",
-        "semver": "^5.4.1",
-        "source-map": "^0.5.0"
+        "gensync": "^1.0.0-beta.2",
+        "json5": "^2.1.2",
+        "semver": "^6.3.0"
       }
     },
     "@babel/generator": {
       }
     },
     "@babel/generator": {
-      "version": "7.18.12",
-      "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.18.12.tgz",
-      "integrity": "sha512-dfQ8ebCN98SvyL7IxNMCUtZQSq5R7kxgN+r8qYTGDmmSion1hX2C0zq2yo1bsCDhXixokv1SAWTZUMYbO/V5zg==",
+      "version": "7.21.1",
+      "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.21.1.tgz",
+      "integrity": "sha512-1lT45bAYlQhFn/BHivJs43AiW2rg3/UbLyShGfF3C0KmHvO5fSghWd5kBJy30kpRRucGzXStvnnCFniCR2kXAA==",
       "requires": {
       "requires": {
-        "@babel/types": "^7.18.10",
+        "@babel/types": "^7.21.0",
         "@jridgewell/gen-mapping": "^0.3.2",
         "@jridgewell/gen-mapping": "^0.3.2",
+        "@jridgewell/trace-mapping": "^0.3.17",
         "jsesc": "^2.5.1"
         "jsesc": "^2.5.1"
+      },
+      "dependencies": {
+        "@jridgewell/gen-mapping": {
+          "version": "0.3.2",
+          "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz",
+          "integrity": "sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A==",
+          "requires": {
+            "@jridgewell/set-array": "^1.0.1",
+            "@jridgewell/sourcemap-codec": "^1.4.10",
+            "@jridgewell/trace-mapping": "^0.3.9"
+          }
+        }
       }
     },
     "@babel/helper-annotate-as-pure": {
       }
     },
     "@babel/helper-annotate-as-pure": {
-      "version": "7.14.5",
-      "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.14.5.tgz",
-      "integrity": "sha512-EivH9EgBIb+G8ij1B2jAwSH36WnGvkQSEC6CkX/6v6ZFlw5fVOHvsgGF4uiEHO2GzMvunZb6tDLQEQSdrdocrA==",
+      "version": "7.16.7",
+      "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.16.7.tgz",
+      "integrity": "sha512-s6t2w/IPQVTAET1HitoowRGXooX8mCgtuP5195wD/QJPV6wYjpujCGF7JuMODVX2ZAJOf1GT6DT9MHEZvLOFSw==",
       "dev": true,
       "requires": {
       "dev": true,
       "requires": {
-        "@babel/types": "^7.14.5"
+        "@babel/types": "^7.16.7"
       }
     },
     "@babel/helper-builder-binary-assignment-operator-visitor": {
       }
     },
     "@babel/helper-builder-binary-assignment-operator-visitor": {
       }
     },
     "@babel/helper-compilation-targets": {
       }
     },
     "@babel/helper-compilation-targets": {
-      "version": "7.18.9",
-      "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.18.9.tgz",
-      "integrity": "sha512-tzLCyVmqUiFlcFoAPLA/gL9TeYrF61VLNtb+hvkuVaB5SUjW7jcfrglBIX1vUIoT7CLP3bBlIMeyEsIl2eFQNg==",
-      "dev": true,
+      "version": "7.20.7",
+      "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.20.7.tgz",
+      "integrity": "sha512-4tGORmfQcrc+bvrjb5y3dG9Mx1IOZjsHqQVUz7XCNHO+iTmqxWnVg3KRygjGmpRLJGdQSKuvFinbIb0CnZwHAQ==",
       "requires": {
       "requires": {
-        "@babel/compat-data": "^7.18.8",
+        "@babel/compat-data": "^7.20.5",
         "@babel/helper-validator-option": "^7.18.6",
         "@babel/helper-validator-option": "^7.18.6",
-        "browserslist": "^4.20.2",
+        "browserslist": "^4.21.3",
+        "lru-cache": "^5.1.1",
         "semver": "^6.3.0"
         "semver": "^6.3.0"
-      },
-      "dependencies": {
-        "semver": {
-          "version": "6.3.0",
-          "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
-          "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==",
-          "dev": true
-        }
       }
     },
     "@babel/helper-create-class-features-plugin": {
       }
     },
     "@babel/helper-create-class-features-plugin": {
-      "version": "7.18.9",
-      "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.18.9.tgz",
-      "integrity": "sha512-WvypNAYaVh23QcjpMR24CwZY2Nz6hqdOcFdPbNpV56hL5H6KiFheO7Xm1aPdlLQ7d5emYZX7VZwPp9x3z+2opw==",
+      "version": "7.21.0",
+      "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.21.0.tgz",
+      "integrity": "sha512-Q8wNiMIdwsv5la5SPxNYzzkPnjgC0Sy0i7jLkVOCdllu/xcVNkr3TeZzbHBJrj+XXRqzX5uCyCoV9eu6xUG7KQ==",
       "dev": true,
       "requires": {
         "@babel/helper-annotate-as-pure": "^7.18.6",
         "@babel/helper-environment-visitor": "^7.18.9",
       "dev": true,
       "requires": {
         "@babel/helper-annotate-as-pure": "^7.18.6",
         "@babel/helper-environment-visitor": "^7.18.9",
-        "@babel/helper-function-name": "^7.18.9",
-        "@babel/helper-member-expression-to-functions": "^7.18.9",
+        "@babel/helper-function-name": "^7.21.0",
+        "@babel/helper-member-expression-to-functions": "^7.21.0",
         "@babel/helper-optimise-call-expression": "^7.18.6",
         "@babel/helper-optimise-call-expression": "^7.18.6",
-        "@babel/helper-replace-supers": "^7.18.9",
+        "@babel/helper-replace-supers": "^7.20.7",
+        "@babel/helper-skip-transparent-expression-wrappers": "^7.20.0",
         "@babel/helper-split-export-declaration": "^7.18.6"
       },
       "dependencies": {
         "@babel/helper-split-export-declaration": "^7.18.6"
       },
       "dependencies": {
       }
     },
     "@babel/helper-create-regexp-features-plugin": {
       }
     },
     "@babel/helper-create-regexp-features-plugin": {
-      "version": "7.18.6",
-      "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.18.6.tgz",
-      "integrity": "sha512-7LcpH1wnQLGrI+4v+nPp+zUvIkF9x0ddv1Hkdue10tg3gmRnLy97DXh4STiOf1qeIInyD69Qv5kKSZzKD8B/7A==",
+      "version": "7.21.0",
+      "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.21.0.tgz",
+      "integrity": "sha512-N+LaFW/auRSWdx7SHD/HiARwXQju1vXTW4fKr4u5SgBUTm51OKEjKgj+cs00ggW3kEvNqwErnlwuq7Y3xBe4eg==",
       "dev": true,
       "requires": {
         "@babel/helper-annotate-as-pure": "^7.18.6",
       "dev": true,
       "requires": {
         "@babel/helper-annotate-as-pure": "^7.18.6",
-        "regexpu-core": "^5.1.0"
+        "regexpu-core": "^5.3.1"
       },
       "dependencies": {
         "@babel/helper-annotate-as-pure": {
       },
       "dependencies": {
         "@babel/helper-annotate-as-pure": {
       }
     },
     "@babel/helper-define-polyfill-provider": {
       }
     },
     "@babel/helper-define-polyfill-provider": {
-      "version": "0.2.4",
-      "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.2.4.tgz",
-      "integrity": "sha512-OrpPZ97s+aPi6h2n1OXzdhVis1SGSsMU2aMHgLcOKfsp4/v1NWpx3CWT3lBj5eeBq9cDkPkh+YCfdF7O12uNDQ==",
+      "version": "0.3.3",
+      "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.3.3.tgz",
+      "integrity": "sha512-z5aQKU4IzbqCC1XH0nAqfsFLMVSo22SBKUc0BxGrLkolTdPTructy0ToNnlO2zA4j9Q/7pjMZf0DSY+DSTYzww==",
       "dev": true,
       "requires": {
       "dev": true,
       "requires": {
-        "@babel/helper-compilation-targets": "^7.13.0",
-        "@babel/helper-module-imports": "^7.12.13",
-        "@babel/helper-plugin-utils": "^7.13.0",
-        "@babel/traverse": "^7.13.0",
+        "@babel/helper-compilation-targets": "^7.17.7",
+        "@babel/helper-plugin-utils": "^7.16.7",
         "debug": "^4.1.1",
         "lodash.debounce": "^4.0.8",
         "resolve": "^1.14.2",
         "semver": "^6.1.2"
         "debug": "^4.1.1",
         "lodash.debounce": "^4.0.8",
         "resolve": "^1.14.2",
         "semver": "^6.1.2"
-      },
-      "dependencies": {
-        "semver": {
-          "version": "6.3.0",
-          "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
-          "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==",
-          "dev": true
-        }
       }
     },
     "@babel/helper-environment-visitor": {
       }
     },
     "@babel/helper-environment-visitor": {
       }
     },
     "@babel/helper-function-name": {
       }
     },
     "@babel/helper-function-name": {
-      "version": "7.18.9",
-      "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.18.9.tgz",
-      "integrity": "sha512-fJgWlZt7nxGksJS9a0XdSaI4XvpExnNIgRP+rVefWh5U7BL8pPuir6SJUmFKRfjWQ51OtWSzwOxhaH/EBWWc0A==",
+      "version": "7.21.0",
+      "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.21.0.tgz",
+      "integrity": "sha512-HfK1aMRanKHpxemaY2gqBmL04iAPOPRj7DxtNbiDOrJK+gdwkiNRVpCpUJYbUT+aZyemKN8brqTOxzCaG6ExRg==",
       "requires": {
       "requires": {
-        "@babel/template": "^7.18.6",
-        "@babel/types": "^7.18.9"
+        "@babel/template": "^7.20.7",
+        "@babel/types": "^7.21.0"
       }
     },
     "@babel/helper-hoist-variables": {
       }
     },
     "@babel/helper-hoist-variables": {
       }
     },
     "@babel/helper-member-expression-to-functions": {
       }
     },
     "@babel/helper-member-expression-to-functions": {
-      "version": "7.18.9",
-      "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.18.9.tgz",
-      "integrity": "sha512-RxifAh2ZoVU67PyKIO4AMi1wTenGfMR/O/ae0CCRqwgBAt5v7xjdtRw7UoSbsreKrQn5t7r89eruK/9JjYHuDg==",
+      "version": "7.21.0",
+      "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.21.0.tgz",
+      "integrity": "sha512-Muu8cdZwNN6mRRNG6lAYErJ5X3bRevgYR2O8wN0yn7jJSnGDu6eG59RfT29JHxGUovyfrh6Pj0XzmR7drNVL3Q==",
       "dev": true,
       "requires": {
       "dev": true,
       "requires": {
-        "@babel/types": "^7.18.9"
+        "@babel/types": "^7.21.0"
       }
     },
     "@babel/helper-module-imports": {
       "version": "7.18.6",
       "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.18.6.tgz",
       "integrity": "sha512-0NFvs3VkuSYbFi1x2Vd6tKrywq+z/cLeYC/RJNFrIX/30Bf5aiGYbtvGXolEktzJH8o5E5KJ3tT+nkxuuZFVlA==",
       }
     },
     "@babel/helper-module-imports": {
       "version": "7.18.6",
       "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.18.6.tgz",
       "integrity": "sha512-0NFvs3VkuSYbFi1x2Vd6tKrywq+z/cLeYC/RJNFrIX/30Bf5aiGYbtvGXolEktzJH8o5E5KJ3tT+nkxuuZFVlA==",
-      "dev": true,
       "requires": {
         "@babel/types": "^7.18.6"
       }
     },
     "@babel/helper-module-transforms": {
       "requires": {
         "@babel/types": "^7.18.6"
       }
     },
     "@babel/helper-module-transforms": {
-      "version": "7.18.9",
-      "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.18.9.tgz",
-      "integrity": "sha512-KYNqY0ICwfv19b31XzvmI/mfcylOzbLtowkw+mfvGPAQ3kfCnMLYbED3YecL5tPd8nAYFQFAd6JHp2LxZk/J1g==",
-      "dev": true,
+      "version": "7.21.2",
+      "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.21.2.tgz",
+      "integrity": "sha512-79yj2AR4U/Oqq/WOV7Lx6hUjau1Zfo4cI+JLAVYeMV5XIlbOhmjEk5ulbTc9fMpmlojzZHkUUxAiK+UKn+hNQQ==",
       "requires": {
         "@babel/helper-environment-visitor": "^7.18.9",
         "@babel/helper-module-imports": "^7.18.6",
       "requires": {
         "@babel/helper-environment-visitor": "^7.18.9",
         "@babel/helper-module-imports": "^7.18.6",
-        "@babel/helper-simple-access": "^7.18.6",
+        "@babel/helper-simple-access": "^7.20.2",
         "@babel/helper-split-export-declaration": "^7.18.6",
         "@babel/helper-split-export-declaration": "^7.18.6",
-        "@babel/helper-validator-identifier": "^7.18.6",
-        "@babel/template": "^7.18.6",
-        "@babel/traverse": "^7.18.9",
-        "@babel/types": "^7.18.9"
+        "@babel/helper-validator-identifier": "^7.19.1",
+        "@babel/template": "^7.20.7",
+        "@babel/traverse": "^7.21.2",
+        "@babel/types": "^7.21.2"
       }
     },
     "@babel/helper-optimise-call-expression": {
       }
     },
     "@babel/helper-optimise-call-expression": {
       }
     },
     "@babel/helper-plugin-utils": {
       }
     },
     "@babel/helper-plugin-utils": {
-      "version": "7.18.9",
-      "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.18.9.tgz",
-      "integrity": "sha512-aBXPT3bmtLryXaoJLyYPXPlSD4p1ld9aYeR+sJNOZjJJGiOpb+fKfh3NkcCu7J54nUJwCERPBExCCpyCOHnu/w==",
+      "version": "7.20.2",
+      "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.20.2.tgz",
+      "integrity": "sha512-8RvlJG2mj4huQ4pZ+rU9lqKi9ZKiRmuvGuM2HlWmkmgOhbs6zEAw6IEiJ5cQqGbDzGZOhwuOQNtZMi/ENLjZoQ==",
       "dev": true
     },
     "@babel/helper-remap-async-to-generator": {
       "dev": true
     },
     "@babel/helper-remap-async-to-generator": {
       }
     },
     "@babel/helper-replace-supers": {
       }
     },
     "@babel/helper-replace-supers": {
-      "version": "7.18.9",
-      "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.18.9.tgz",
-      "integrity": "sha512-dNsWibVI4lNT6HiuOIBr1oyxo40HvIVmbwPUm3XZ7wMh4k2WxrxTqZwSqw/eEmXDS9np0ey5M2bz9tBmO9c+YQ==",
+      "version": "7.20.7",
+      "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.20.7.tgz",
+      "integrity": "sha512-vujDMtB6LVfNW13jhlCrp48QNslK6JXi7lQG736HVbHz/mbf4Dc7tIRh1Xf5C0rF7BP8iiSxGMCmY6Ci1ven3A==",
       "dev": true,
       "requires": {
         "@babel/helper-environment-visitor": "^7.18.9",
       "dev": true,
       "requires": {
         "@babel/helper-environment-visitor": "^7.18.9",
-        "@babel/helper-member-expression-to-functions": "^7.18.9",
+        "@babel/helper-member-expression-to-functions": "^7.20.7",
         "@babel/helper-optimise-call-expression": "^7.18.6",
         "@babel/helper-optimise-call-expression": "^7.18.6",
-        "@babel/traverse": "^7.18.9",
-        "@babel/types": "^7.18.9"
+        "@babel/template": "^7.20.7",
+        "@babel/traverse": "^7.20.7",
+        "@babel/types": "^7.20.7"
       }
     },
     "@babel/helper-simple-access": {
       }
     },
     "@babel/helper-simple-access": {
-      "version": "7.18.6",
-      "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.18.6.tgz",
-      "integrity": "sha512-iNpIgTgyAvDQpDj76POqg+YEt8fPxx3yaNBg3S30dxNKm2SWfYhD0TGrK/Eu9wHpUW63VQU894TsTg+GLbUa1g==",
-      "dev": true,
+      "version": "7.20.2",
+      "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.20.2.tgz",
+      "integrity": "sha512-+0woI/WPq59IrqDYbVGfshjT5Dmk/nnbdpcF8SnMhhXObpTq2KNBdLFRFrkVdbDOyUmHBCxzm5FHV1rACIkIbA==",
       "requires": {
       "requires": {
-        "@babel/types": "^7.18.6"
+        "@babel/types": "^7.20.2"
       }
     },
     "@babel/helper-skip-transparent-expression-wrappers": {
       }
     },
     "@babel/helper-skip-transparent-expression-wrappers": {
-      "version": "7.18.9",
-      "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.18.9.tgz",
-      "integrity": "sha512-imytd2gHi3cJPsybLRbmFrF7u5BIEuI2cNheyKi3/iOBC63kNn3q8Crn2xVuESli0aM4KYsyEqKyS7lFL8YVtw==",
+      "version": "7.20.0",
+      "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.20.0.tgz",
+      "integrity": "sha512-5y1JYeNKfvnT8sZcK9DVRtpTbGiomYIHviSP3OQWmDPU3DeH4a1ZlT/N2lyQ5P8egjcRaT/Y9aNqUxK0WsnIIg==",
       "dev": true,
       "requires": {
       "dev": true,
       "requires": {
-        "@babel/types": "^7.18.9"
+        "@babel/types": "^7.20.0"
       }
     },
     "@babel/helper-split-export-declaration": {
       }
     },
     "@babel/helper-split-export-declaration": {
       }
     },
     "@babel/helper-string-parser": {
       }
     },
     "@babel/helper-string-parser": {
-      "version": "7.18.10",
-      "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.18.10.tgz",
-      "integrity": "sha512-XtIfWmeNY3i4t7t4D2t02q50HvqHybPqW2ki1kosnvWCwuCMeo81Jf0gwr85jy/neUdg5XDdeFE/80DXiO+njw=="
+      "version": "7.19.4",
+      "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.19.4.tgz",
+      "integrity": "sha512-nHtDoQcuqFmwYNYPz3Rah5ph2p8PFeFCsZk9A/48dPc/rGocJ5J3hAAZ7pb76VWX3fZKu+uEr/FhH5jLx7umrw=="
     },
     "@babel/helper-validator-identifier": {
     },
     "@babel/helper-validator-identifier": {
-      "version": "7.18.6",
-      "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.18.6.tgz",
-      "integrity": "sha512-MmetCkz9ej86nJQV+sFCxoGGrUbU3q02kgLciwkrt9QqEB7cP39oKEY0PakknEO0Gu20SskMRi+AYZ3b1TpN9g=="
+      "version": "7.19.1",
+      "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.19.1.tgz",
+      "integrity": "sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w=="
     },
     "@babel/helper-validator-option": {
     },
     "@babel/helper-validator-option": {
-      "version": "7.18.6",
-      "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.18.6.tgz",
-      "integrity": "sha512-XO7gESt5ouv/LRJdrVjkShckw6STTaB7l9BrpBaAHDeF5YZT+01PCwmR0SJHnkW6i8OwW/EVWRShfi4j2x+KQw==",
-      "dev": true
+      "version": "7.21.0",
+      "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.21.0.tgz",
+      "integrity": "sha512-rmL/B8/f0mKS2baE9ZpyTcTavvEuWhTTW8amjzXNvYG4AwBsqTLikfXsEofsJEfKHf+HQVQbFOHy6o+4cnC/fQ=="
     },
     "@babel/helper-wrap-function": {
     },
     "@babel/helper-wrap-function": {
-      "version": "7.18.11",
-      "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.18.11.tgz",
-      "integrity": "sha512-oBUlbv+rjZLh2Ks9SKi4aL7eKaAXBWleHzU89mP0G6BMUlRxSckk9tSIkgDGydhgFxHuGSlBQZfnaD47oBEB7w==",
+      "version": "7.20.5",
+      "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.20.5.tgz",
+      "integrity": "sha512-bYMxIWK5mh+TgXGVqAtnu5Yn1un+v8DDZtqyzKRLUzrh70Eal2O3aZ7aPYiMADO4uKlkzOiRiZ6GX5q3qxvW9Q==",
       "dev": true,
       "requires": {
       "dev": true,
       "requires": {
-        "@babel/helper-function-name": "^7.18.9",
+        "@babel/helper-function-name": "^7.19.0",
         "@babel/template": "^7.18.10",
         "@babel/template": "^7.18.10",
-        "@babel/traverse": "^7.18.11",
-        "@babel/types": "^7.18.10"
+        "@babel/traverse": "^7.20.5",
+        "@babel/types": "^7.20.5"
       }
     },
     "@babel/helpers": {
       }
     },
     "@babel/helpers": {
-      "version": "7.18.9",
-      "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.18.9.tgz",
-      "integrity": "sha512-Jf5a+rbrLoR4eNdUmnFu8cN5eNJT6qdTdOg5IHIzq87WwyRw9PwguLFOWYgktN/60IP4fgDUawJvs7PjQIzELQ==",
+      "version": "7.21.0",
+      "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.21.0.tgz",
+      "integrity": "sha512-XXve0CBtOW0pd7MRzzmoyuSj0e3SEzj8pgyFxnTT1NJZL38BD1MK7yYrm8yefRPIDvNNe14xR4FdbHwpInD4rA==",
       "requires": {
       "requires": {
-        "@babel/template": "^7.18.6",
-        "@babel/traverse": "^7.18.9",
-        "@babel/types": "^7.18.9"
+        "@babel/template": "^7.20.7",
+        "@babel/traverse": "^7.21.0",
+        "@babel/types": "^7.21.0"
       }
     },
     "@babel/highlight": {
       }
     },
     "@babel/highlight": {
       }
     },
     "@babel/parser": {
       }
     },
     "@babel/parser": {
-      "version": "7.18.11",
-      "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.18.11.tgz",
-      "integrity": "sha512-9JKn5vN+hDt0Hdqn1PiJ2guflwP+B6Ga8qbDuoF0PzzVhrzsKIJo8yGqVk6CmMHiMei9w1C1Bp9IMJSIK+HPIQ=="
+      "version": "7.21.2",
+      "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.21.2.tgz",
+      "integrity": "sha512-URpaIJQwEkEC2T9Kn+Ai6Xe/02iNaVCuT/PtoRz3GPVJVDpPd7mLo+VddTbhCRU9TXqW5mSrQfXZyi8kDKOVpQ=="
     },
     "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": {
       "version": "7.18.6",
     },
     "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": {
       "version": "7.18.6",
       }
     },
     "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": {
       }
     },
     "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": {
-      "version": "7.18.9",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.18.9.tgz",
-      "integrity": "sha512-AHrP9jadvH7qlOj6PINbgSuphjQUAK7AOT7DPjBo9EHoLhQTnnK5u45e1Hd4DbSQEO9nqPWtQ89r+XEOWFScKg==",
+      "version": "7.20.7",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.20.7.tgz",
+      "integrity": "sha512-sbr9+wNE5aXMBBFBICk01tt7sBf2Oc9ikRFEcem/ZORup9IMUdNhW7/wVLEbbtlWOsEubJet46mHAL2C8+2jKQ==",
       "dev": true,
       "requires": {
       "dev": true,
       "requires": {
-        "@babel/helper-plugin-utils": "^7.18.9",
-        "@babel/helper-skip-transparent-expression-wrappers": "^7.18.9",
-        "@babel/plugin-proposal-optional-chaining": "^7.18.9"
+        "@babel/helper-plugin-utils": "^7.20.2",
+        "@babel/helper-skip-transparent-expression-wrappers": "^7.20.0",
+        "@babel/plugin-proposal-optional-chaining": "^7.20.7"
       }
     },
     "@babel/plugin-proposal-async-generator-functions": {
       }
     },
     "@babel/plugin-proposal-async-generator-functions": {
-      "version": "7.14.7",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.14.7.tgz",
-      "integrity": "sha512-RK8Wj7lXLY3bqei69/cc25gwS5puEc3dknoFPFbqfy3XxYQBQFvu4ioWpafMBAB+L9NyptQK4nMOa5Xz16og8Q==",
+      "version": "7.16.8",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.16.8.tgz",
+      "integrity": "sha512-71YHIvMuiuqWJQkebWJtdhQTfd4Q4mF76q2IX37uZPkG9+olBxsX+rH1vkhFto4UeJZ9dPY2s+mDvhDm1u2BGQ==",
       "dev": true,
       "requires": {
       "dev": true,
       "requires": {
-        "@babel/helper-plugin-utils": "^7.14.5",
-        "@babel/helper-remap-async-to-generator": "^7.14.5",
+        "@babel/helper-plugin-utils": "^7.16.7",
+        "@babel/helper-remap-async-to-generator": "^7.16.8",
         "@babel/plugin-syntax-async-generators": "^7.8.4"
       }
     },
         "@babel/plugin-syntax-async-generators": "^7.8.4"
       }
     },
       }
     },
     "@babel/plugin-proposal-class-static-block": {
       }
     },
     "@babel/plugin-proposal-class-static-block": {
-      "version": "7.18.6",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-static-block/-/plugin-proposal-class-static-block-7.18.6.tgz",
-      "integrity": "sha512-+I3oIiNxrCpup3Gi8n5IGMwj0gOCAjcJUSQEcotNnCCPMEnixawOQ+KeJPlgfjzx+FKQ1QSyZOWe7wmoJp7vhw==",
+      "version": "7.21.0",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-static-block/-/plugin-proposal-class-static-block-7.21.0.tgz",
+      "integrity": "sha512-XP5G9MWNUskFuP30IfFSEFB0Z6HzLIUcjYM4bYOPHXl7eiJ9HFv8tWj6TXTN5QODiEhDZAeI4hLok2iHFFV4hw==",
       "dev": true,
       "requires": {
       "dev": true,
       "requires": {
-        "@babel/helper-create-class-features-plugin": "^7.18.6",
-        "@babel/helper-plugin-utils": "^7.18.6",
+        "@babel/helper-create-class-features-plugin": "^7.21.0",
+        "@babel/helper-plugin-utils": "^7.20.2",
         "@babel/plugin-syntax-class-static-block": "^7.14.5"
       }
     },
         "@babel/plugin-syntax-class-static-block": "^7.14.5"
       }
     },
       }
     },
     "@babel/plugin-proposal-logical-assignment-operators": {
       }
     },
     "@babel/plugin-proposal-logical-assignment-operators": {
-      "version": "7.18.9",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.18.9.tgz",
-      "integrity": "sha512-128YbMpjCrP35IOExw2Fq+x55LMP42DzhOhX2aNNIdI9avSWl2PI0yuBWarr3RYpZBSPtabfadkH2yeRiMD61Q==",
+      "version": "7.20.7",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.20.7.tgz",
+      "integrity": "sha512-y7C7cZgpMIjWlKE5T7eJwp+tnRYM89HmRvWM5EQuB5BoHEONjmQ8lSNmBUwOyy/GFRsohJED51YBF79hE1djug==",
       "dev": true,
       "requires": {
       "dev": true,
       "requires": {
-        "@babel/helper-plugin-utils": "^7.18.9",
+        "@babel/helper-plugin-utils": "^7.20.2",
         "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4"
       }
     },
         "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4"
       }
     },
       }
     },
     "@babel/plugin-proposal-object-rest-spread": {
       }
     },
     "@babel/plugin-proposal-object-rest-spread": {
-      "version": "7.18.9",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.18.9.tgz",
-      "integrity": "sha512-kDDHQ5rflIeY5xl69CEqGEZ0KY369ehsCIEbTGb4siHG5BE9sga/T0r0OUwyZNLMmZE79E1kbsqAjwFCW4ds6Q==",
+      "version": "7.20.7",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.20.7.tgz",
+      "integrity": "sha512-d2S98yCiLxDVmBmE8UjGcfPvNEUbA1U5q5WxaWFUGRzJSVAZqm5W6MbPct0jxnegUZ0niLeNX+IOzEs7wYg9Dg==",
       "dev": true,
       "requires": {
       "dev": true,
       "requires": {
-        "@babel/compat-data": "^7.18.8",
-        "@babel/helper-compilation-targets": "^7.18.9",
-        "@babel/helper-plugin-utils": "^7.18.9",
+        "@babel/compat-data": "^7.20.5",
+        "@babel/helper-compilation-targets": "^7.20.7",
+        "@babel/helper-plugin-utils": "^7.20.2",
         "@babel/plugin-syntax-object-rest-spread": "^7.8.3",
         "@babel/plugin-syntax-object-rest-spread": "^7.8.3",
-        "@babel/plugin-transform-parameters": "^7.18.8"
+        "@babel/plugin-transform-parameters": "^7.20.7"
       }
     },
     "@babel/plugin-proposal-optional-catch-binding": {
       }
     },
     "@babel/plugin-proposal-optional-catch-binding": {
       }
     },
     "@babel/plugin-proposal-optional-chaining": {
       }
     },
     "@babel/plugin-proposal-optional-chaining": {
-      "version": "7.18.9",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.18.9.tgz",
-      "integrity": "sha512-v5nwt4IqBXihxGsW2QmCWMDS3B3bzGIk/EQVZz2ei7f3NJl8NzAJVvUmpDW5q1CRNY+Beb/k58UAH1Km1N411w==",
+      "version": "7.21.0",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.21.0.tgz",
+      "integrity": "sha512-p4zeefM72gpmEe2fkUr/OnOXpWEf8nAgk7ZYVqqfFiyIG7oFfVZcCrU64hWn5xp4tQ9LkV4bTIa5rD0KANpKNA==",
       "dev": true,
       "requires": {
       "dev": true,
       "requires": {
-        "@babel/helper-plugin-utils": "^7.18.9",
-        "@babel/helper-skip-transparent-expression-wrappers": "^7.18.9",
+        "@babel/helper-plugin-utils": "^7.20.2",
+        "@babel/helper-skip-transparent-expression-wrappers": "^7.20.0",
         "@babel/plugin-syntax-optional-chaining": "^7.8.3"
       }
     },
         "@babel/plugin-syntax-optional-chaining": "^7.8.3"
       }
     },
       }
     },
     "@babel/plugin-proposal-private-property-in-object": {
       }
     },
     "@babel/plugin-proposal-private-property-in-object": {
-      "version": "7.18.6",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.18.6.tgz",
-      "integrity": "sha512-9Rysx7FOctvT5ouj5JODjAFAkgGoudQuLPamZb0v1TGLpapdNaftzifU8NTWQm0IRjqoYypdrSmyWgkocDQ8Dw==",
+      "version": "7.21.0",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.21.0.tgz",
+      "integrity": "sha512-ha4zfehbJjc5MmXBlHec1igel5TJXXLDDRbuJ4+XT2TJcyD9/V1919BA8gMvsdHcNMBy4WBUBiRb3nw/EQUtBw==",
       "dev": true,
       "requires": {
         "@babel/helper-annotate-as-pure": "^7.18.6",
       "dev": true,
       "requires": {
         "@babel/helper-annotate-as-pure": "^7.18.6",
-        "@babel/helper-create-class-features-plugin": "^7.18.6",
-        "@babel/helper-plugin-utils": "^7.18.6",
+        "@babel/helper-create-class-features-plugin": "^7.21.0",
+        "@babel/helper-plugin-utils": "^7.20.2",
         "@babel/plugin-syntax-private-property-in-object": "^7.14.5"
       },
       "dependencies": {
         "@babel/plugin-syntax-private-property-in-object": "^7.14.5"
       },
       "dependencies": {
         "@babel/helper-plugin-utils": "^7.8.3"
       }
     },
         "@babel/helper-plugin-utils": "^7.8.3"
       }
     },
-    "@babel/plugin-syntax-import-assertions": {
-      "version": "7.18.6",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.18.6.tgz",
-      "integrity": "sha512-/DU3RXad9+bZwrgWJQKbr39gYbJpLJHezqEzRzi/BHRlJ9zsQb4CK2CA/5apllXNomwA1qHwzvHl+AdEmC5krQ==",
-      "dev": true,
-      "requires": {
-        "@babel/helper-plugin-utils": "^7.18.6"
-      }
-    },
     "@babel/plugin-syntax-import-meta": {
       "version": "7.10.4",
       "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz",
     "@babel/plugin-syntax-import-meta": {
       "version": "7.10.4",
       "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz",
         "@babel/helper-plugin-utils": "^7.14.5"
       }
     },
         "@babel/helper-plugin-utils": "^7.14.5"
       }
     },
+    "@babel/plugin-syntax-typescript": {
+      "version": "7.20.0",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.20.0.tgz",
+      "integrity": "sha512-rd9TkG+u1CExzS4SM1BlMEhMXwFLKVjOAFFCDx9PbX5ycJWDoWMcwdJH9RhkPu1dOgn5TrxLot/Gx6lWFuAUNQ==",
+      "dev": true,
+      "requires": {
+        "@babel/helper-plugin-utils": "^7.19.0"
+      }
+    },
     "@babel/plugin-transform-arrow-functions": {
     "@babel/plugin-transform-arrow-functions": {
-      "version": "7.18.6",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.18.6.tgz",
-      "integrity": "sha512-9S9X9RUefzrsHZmKMbDXxweEH+YlE8JJEuat9FdvW9Qh1cw7W64jELCtWNkPBPX5En45uy28KGvA/AySqUh8CQ==",
+      "version": "7.20.7",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.20.7.tgz",
+      "integrity": "sha512-3poA5E7dzDomxj9WXWwuD6A5F3kc7VXwIJO+E+J8qtDtS+pXPAhrgEyh+9GBwBgPq1Z+bB+/JD60lp5jsN7JPQ==",
       "dev": true,
       "requires": {
       "dev": true,
       "requires": {
-        "@babel/helper-plugin-utils": "^7.18.6"
+        "@babel/helper-plugin-utils": "^7.20.2"
       }
     },
     "@babel/plugin-transform-async-to-generator": {
       }
     },
     "@babel/plugin-transform-async-to-generator": {
-      "version": "7.14.5",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.14.5.tgz",
-      "integrity": "sha512-szkbzQ0mNk0rpu76fzDdqSyPu0MuvpXgC+6rz5rpMb5OIRxdmHfQxrktL8CYolL2d8luMCZTR0DpIMIdL27IjA==",
+      "version": "7.16.8",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.16.8.tgz",
+      "integrity": "sha512-MtmUmTJQHCnyJVrScNzNlofQJ3dLFuobYn3mwOTKHnSCMtbNsqvF71GQmJfFjdrXSsAA7iysFmYWw4bXZ20hOg==",
       "dev": true,
       "requires": {
       "dev": true,
       "requires": {
-        "@babel/helper-module-imports": "^7.14.5",
-        "@babel/helper-plugin-utils": "^7.14.5",
-        "@babel/helper-remap-async-to-generator": "^7.14.5"
+        "@babel/helper-module-imports": "^7.16.7",
+        "@babel/helper-plugin-utils": "^7.16.7",
+        "@babel/helper-remap-async-to-generator": "^7.16.8"
       }
     },
     "@babel/plugin-transform-block-scoped-functions": {
       }
     },
     "@babel/plugin-transform-block-scoped-functions": {
       }
     },
     "@babel/plugin-transform-block-scoping": {
       }
     },
     "@babel/plugin-transform-block-scoping": {
-      "version": "7.18.9",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.18.9.tgz",
-      "integrity": "sha512-5sDIJRV1KtQVEbt/EIBwGy4T01uYIo4KRB3VUqzkhrAIOGx7AoctL9+Ux88btY0zXdDyPJ9mW+bg+v+XEkGmtw==",
+      "version": "7.21.0",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.21.0.tgz",
+      "integrity": "sha512-Mdrbunoh9SxwFZapeHVrwFmri16+oYotcZysSzhNIVDwIAb1UV+kvnxULSYq9J3/q5MDG+4X6w8QVgD1zhBXNQ==",
       "dev": true,
       "requires": {
       "dev": true,
       "requires": {
-        "@babel/helper-plugin-utils": "^7.18.9"
+        "@babel/helper-plugin-utils": "^7.20.2"
       }
     },
     "@babel/plugin-transform-classes": {
       }
     },
     "@babel/plugin-transform-classes": {
-      "version": "7.18.9",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.18.9.tgz",
-      "integrity": "sha512-EkRQxsxoytpTlKJmSPYrsOMjCILacAjtSVkd4gChEe2kXjFCun3yohhW5I7plXJhCemM0gKsaGMcO8tinvCA5g==",
+      "version": "7.21.0",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.21.0.tgz",
+      "integrity": "sha512-RZhbYTCEUAe6ntPehC4hlslPWosNHDox+vAs4On/mCLRLfoDVHf6hVEd7kuxr1RnHwJmxFfUM3cZiZRmPxJPXQ==",
       "dev": true,
       "requires": {
         "@babel/helper-annotate-as-pure": "^7.18.6",
       "dev": true,
       "requires": {
         "@babel/helper-annotate-as-pure": "^7.18.6",
+        "@babel/helper-compilation-targets": "^7.20.7",
         "@babel/helper-environment-visitor": "^7.18.9",
         "@babel/helper-environment-visitor": "^7.18.9",
-        "@babel/helper-function-name": "^7.18.9",
+        "@babel/helper-function-name": "^7.21.0",
         "@babel/helper-optimise-call-expression": "^7.18.6",
         "@babel/helper-optimise-call-expression": "^7.18.6",
-        "@babel/helper-plugin-utils": "^7.18.9",
-        "@babel/helper-replace-supers": "^7.18.9",
+        "@babel/helper-plugin-utils": "^7.20.2",
+        "@babel/helper-replace-supers": "^7.20.7",
         "@babel/helper-split-export-declaration": "^7.18.6",
         "globals": "^11.1.0"
       },
         "@babel/helper-split-export-declaration": "^7.18.6",
         "globals": "^11.1.0"
       },
       }
     },
     "@babel/plugin-transform-computed-properties": {
       }
     },
     "@babel/plugin-transform-computed-properties": {
-      "version": "7.18.9",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.18.9.tgz",
-      "integrity": "sha512-+i0ZU1bCDymKakLxn5srGHrsAPRELC2WIbzwjLhHW9SIE1cPYkLCL0NlnXMZaM1vhfgA2+M7hySk42VBvrkBRw==",
+      "version": "7.20.7",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.20.7.tgz",
+      "integrity": "sha512-Lz7MvBK6DTjElHAmfu6bfANzKcxpyNPeYBGEafyA6E5HtRpjpZwU+u7Qrgz/2OR0z+5TvKYbPdphfSaAcZBrYQ==",
       "dev": true,
       "requires": {
       "dev": true,
       "requires": {
-        "@babel/helper-plugin-utils": "^7.18.9"
+        "@babel/helper-plugin-utils": "^7.20.2",
+        "@babel/template": "^7.20.7"
       }
     },
     "@babel/plugin-transform-destructuring": {
       }
     },
     "@babel/plugin-transform-destructuring": {
-      "version": "7.18.9",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.18.9.tgz",
-      "integrity": "sha512-p5VCYNddPLkZTq4XymQIaIfZNJwT9YsjkPOhkVEqt6QIpQFZVM9IltqqYpOEkJoN1DPznmxUDyZ5CTZs/ZCuHA==",
+      "version": "7.20.7",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.20.7.tgz",
+      "integrity": "sha512-Xwg403sRrZb81IVB79ZPqNQME23yhugYVqgTxAhT99h485F4f+GMELFhhOsscDUB7HCswepKeCKLn/GZvUKoBA==",
       "dev": true,
       "requires": {
       "dev": true,
       "requires": {
-        "@babel/helper-plugin-utils": "^7.18.9"
+        "@babel/helper-plugin-utils": "^7.20.2"
       }
     },
     "@babel/plugin-transform-dotall-regex": {
       }
     },
     "@babel/plugin-transform-dotall-regex": {
       }
     },
     "@babel/plugin-transform-for-of": {
       }
     },
     "@babel/plugin-transform-for-of": {
-      "version": "7.18.8",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.18.8.tgz",
-      "integrity": "sha512-yEfTRnjuskWYo0k1mHUqrVWaZwrdq8AYbfrpqULOJOaucGSp4mNMVps+YtA8byoevxS/urwU75vyhQIxcCgiBQ==",
+      "version": "7.21.0",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.21.0.tgz",
+      "integrity": "sha512-LlUYlydgDkKpIY7mcBWvyPPmMcOphEyYA27Ef4xpbh1IiDNLr0kZsos2nf92vz3IccvJI25QUwp86Eo5s6HmBQ==",
       "dev": true,
       "requires": {
       "dev": true,
       "requires": {
-        "@babel/helper-plugin-utils": "^7.18.6"
+        "@babel/helper-plugin-utils": "^7.20.2"
       }
     },
     "@babel/plugin-transform-function-name": {
       }
     },
     "@babel/plugin-transform-function-name": {
       }
     },
     "@babel/plugin-transform-modules-amd": {
       }
     },
     "@babel/plugin-transform-modules-amd": {
-      "version": "7.18.6",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.18.6.tgz",
-      "integrity": "sha512-Pra5aXsmTsOnjM3IajS8rTaLCy++nGM4v3YR4esk5PCsyg9z8NA5oQLwxzMUtDBd8F+UmVza3VxoAaWCbzH1rg==",
+      "version": "7.20.11",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.20.11.tgz",
+      "integrity": "sha512-NuzCt5IIYOW0O30UvqktzHYR2ud5bOWbY0yaxWZ6G+aFzOMJvrs5YHNikrbdaT15+KNO31nPOy5Fim3ku6Zb5g==",
       "dev": true,
       "requires": {
       "dev": true,
       "requires": {
-        "@babel/helper-module-transforms": "^7.18.6",
-        "@babel/helper-plugin-utils": "^7.18.6",
-        "babel-plugin-dynamic-import-node": "^2.3.3"
+        "@babel/helper-module-transforms": "^7.20.11",
+        "@babel/helper-plugin-utils": "^7.20.2"
       }
     },
     "@babel/plugin-transform-modules-commonjs": {
       }
     },
     "@babel/plugin-transform-modules-commonjs": {
-      "version": "7.18.6",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.18.6.tgz",
-      "integrity": "sha512-Qfv2ZOWikpvmedXQJDSbxNqy7Xr/j2Y8/KfijM0iJyKkBTmWuvCA1yeH1yDM7NJhBW/2aXxeucLj6i80/LAJ/Q==",
+      "version": "7.21.2",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.21.2.tgz",
+      "integrity": "sha512-Cln+Yy04Gxua7iPdj6nOV96smLGjpElir5YwzF0LBPKoPlLDNJePNlrGGaybAJkd0zKRnOVXOgizSqPYMNYkzA==",
       "dev": true,
       "requires": {
       "dev": true,
       "requires": {
-        "@babel/helper-module-transforms": "^7.18.6",
-        "@babel/helper-plugin-utils": "^7.18.6",
-        "@babel/helper-simple-access": "^7.18.6",
-        "babel-plugin-dynamic-import-node": "^2.3.3"
+        "@babel/helper-module-transforms": "^7.21.2",
+        "@babel/helper-plugin-utils": "^7.20.2",
+        "@babel/helper-simple-access": "^7.20.2"
       }
     },
     "@babel/plugin-transform-modules-systemjs": {
       }
     },
     "@babel/plugin-transform-modules-systemjs": {
-      "version": "7.18.9",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.18.9.tgz",
-      "integrity": "sha512-zY/VSIbbqtoRoJKo2cDTewL364jSlZGvn0LKOf9ntbfxOvjfmyrdtEEOAdswOswhZEb8UH3jDkCKHd1sPgsS0A==",
+      "version": "7.20.11",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.20.11.tgz",
+      "integrity": "sha512-vVu5g9BPQKSFEmvt2TA4Da5N+QVS66EX21d8uoOihC+OCpUoGvzVsXeqFdtAEfVa5BILAeFt+U7yVmLbQnAJmw==",
       "dev": true,
       "requires": {
         "@babel/helper-hoist-variables": "^7.18.6",
       "dev": true,
       "requires": {
         "@babel/helper-hoist-variables": "^7.18.6",
-        "@babel/helper-module-transforms": "^7.18.9",
-        "@babel/helper-plugin-utils": "^7.18.9",
-        "@babel/helper-validator-identifier": "^7.18.6",
-        "babel-plugin-dynamic-import-node": "^2.3.3"
+        "@babel/helper-module-transforms": "^7.20.11",
+        "@babel/helper-plugin-utils": "^7.20.2",
+        "@babel/helper-validator-identifier": "^7.19.1"
       }
     },
     "@babel/plugin-transform-modules-umd": {
       }
     },
     "@babel/plugin-transform-modules-umd": {
       }
     },
     "@babel/plugin-transform-named-capturing-groups-regex": {
       }
     },
     "@babel/plugin-transform-named-capturing-groups-regex": {
-      "version": "7.18.6",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.18.6.tgz",
-      "integrity": "sha512-UmEOGF8XgaIqD74bC8g7iV3RYj8lMf0Bw7NJzvnS9qQhM4mg+1WHKotUIdjxgD2RGrgFLZZPCFPFj3P/kVDYhg==",
+      "version": "7.20.5",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.20.5.tgz",
+      "integrity": "sha512-mOW4tTzi5iTLnw+78iEq3gr8Aoq4WNRGpmSlrogqaiCBoR1HFhpU4JkpQFOHfeYx3ReVIFWOQJS4aZBRvuZ6mA==",
       "dev": true,
       "requires": {
       "dev": true,
       "requires": {
-        "@babel/helper-create-regexp-features-plugin": "^7.18.6",
-        "@babel/helper-plugin-utils": "^7.18.6"
+        "@babel/helper-create-regexp-features-plugin": "^7.20.5",
+        "@babel/helper-plugin-utils": "^7.20.2"
       }
     },
     "@babel/plugin-transform-new-target": {
       }
     },
     "@babel/plugin-transform-new-target": {
       }
     },
     "@babel/plugin-transform-parameters": {
       }
     },
     "@babel/plugin-transform-parameters": {
-      "version": "7.18.8",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.18.8.tgz",
-      "integrity": "sha512-ivfbE3X2Ss+Fj8nnXvKJS6sjRG4gzwPMsP+taZC+ZzEGjAYlvENixmt1sZ5Ca6tWls+BlKSGKPJ6OOXvXCbkFg==",
+      "version": "7.20.7",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.20.7.tgz",
+      "integrity": "sha512-WiWBIkeHKVOSYPO0pWkxGPfKeWrCJyD3NJ53+Lrp/QMSZbsVPovrVl2aWZ19D/LTVnaDv5Ap7GJ/B2CTOZdrfA==",
       "dev": true,
       "requires": {
       "dev": true,
       "requires": {
-        "@babel/helper-plugin-utils": "^7.18.6"
+        "@babel/helper-plugin-utils": "^7.20.2"
       }
     },
     "@babel/plugin-transform-property-literals": {
       }
     },
     "@babel/plugin-transform-property-literals": {
       }
     },
     "@babel/plugin-transform-react-jsx": {
       }
     },
     "@babel/plugin-transform-react-jsx": {
-      "version": "7.18.10",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.18.10.tgz",
-      "integrity": "sha512-gCy7Iikrpu3IZjYZolFE4M1Sm+nrh1/6za2Ewj77Z+XirT4TsbJcvOFOyF+fRPwU6AKKK136CZxx6L8AbSFG6A==",
+      "version": "7.21.0",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.21.0.tgz",
+      "integrity": "sha512-6OAWljMvQrZjR2DaNhVfRz6dkCAVV+ymcLUmaf8bccGOHn2v5rHJK3tTpij0BuhdYWP4LLaqj5lwcdlpAAPuvg==",
       "dev": true,
       "requires": {
         "@babel/helper-annotate-as-pure": "^7.18.6",
         "@babel/helper-module-imports": "^7.18.6",
       "dev": true,
       "requires": {
         "@babel/helper-annotate-as-pure": "^7.18.6",
         "@babel/helper-module-imports": "^7.18.6",
-        "@babel/helper-plugin-utils": "^7.18.9",
+        "@babel/helper-plugin-utils": "^7.20.2",
         "@babel/plugin-syntax-jsx": "^7.18.6",
         "@babel/plugin-syntax-jsx": "^7.18.6",
-        "@babel/types": "^7.18.10"
+        "@babel/types": "^7.21.0"
       },
       "dependencies": {
         "@babel/helper-annotate-as-pure": {
       },
       "dependencies": {
         "@babel/helper-annotate-as-pure": {
       }
     },
     "@babel/plugin-transform-regenerator": {
       }
     },
     "@babel/plugin-transform-regenerator": {
-      "version": "7.18.6",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.18.6.tgz",
-      "integrity": "sha512-poqRI2+qiSdeldcz4wTSTXBRryoq3Gc70ye7m7UD5Ww0nE29IXqMl6r7Nd15WBgRd74vloEMlShtH6CKxVzfmQ==",
+      "version": "7.20.5",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.20.5.tgz",
+      "integrity": "sha512-kW/oO7HPBtntbsahzQ0qSE3tFvkFwnbozz3NWFhLGqH75vLEg+sCGngLlhVkePlCs3Jv0dBBHDzCHxNiFAQKCQ==",
       "dev": true,
       "requires": {
       "dev": true,
       "requires": {
-        "@babel/helper-plugin-utils": "^7.18.6",
-        "regenerator-transform": "^0.15.0"
+        "@babel/helper-plugin-utils": "^7.20.2",
+        "regenerator-transform": "^0.15.1"
       }
     },
     "@babel/plugin-transform-reserved-words": {
       }
     },
     "@babel/plugin-transform-reserved-words": {
       }
     },
     "@babel/plugin-transform-runtime": {
       }
     },
     "@babel/plugin-transform-runtime": {
-      "version": "7.14.5",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.14.5.tgz",
-      "integrity": "sha512-fPMBhh1AV8ZyneiCIA+wYYUH1arzlXR1UMcApjvchDhfKxhy2r2lReJv8uHEyihi4IFIGlr1Pdx7S5fkESDQsg==",
+      "version": "7.16.10",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.16.10.tgz",
+      "integrity": "sha512-9nwTiqETv2G7xI4RvXHNfpGdr8pAA+Q/YtN3yLK7OoK7n9OibVm/xymJ838a9A6E/IciOLPj82lZk0fW6O4O7w==",
       "dev": true,
       "requires": {
       "dev": true,
       "requires": {
-        "@babel/helper-module-imports": "^7.14.5",
-        "@babel/helper-plugin-utils": "^7.14.5",
-        "babel-plugin-polyfill-corejs2": "^0.2.2",
-        "babel-plugin-polyfill-corejs3": "^0.2.2",
-        "babel-plugin-polyfill-regenerator": "^0.2.2",
+        "@babel/helper-module-imports": "^7.16.7",
+        "@babel/helper-plugin-utils": "^7.16.7",
+        "babel-plugin-polyfill-corejs2": "^0.3.0",
+        "babel-plugin-polyfill-corejs3": "^0.5.0",
+        "babel-plugin-polyfill-regenerator": "^0.3.0",
         "semver": "^6.3.0"
         "semver": "^6.3.0"
-      },
-      "dependencies": {
-        "semver": {
-          "version": "6.3.0",
-          "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
-          "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==",
-          "dev": true
-        }
       }
     },
     "@babel/plugin-transform-shorthand-properties": {
       }
     },
     "@babel/plugin-transform-shorthand-properties": {
       }
     },
     "@babel/plugin-transform-spread": {
       }
     },
     "@babel/plugin-transform-spread": {
-      "version": "7.18.9",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.18.9.tgz",
-      "integrity": "sha512-39Q814wyoOPtIB/qGopNIL9xDChOE1pNU0ZY5dO0owhiVt/5kFm4li+/bBtwc7QotG0u5EPzqhZdjMtmqBqyQA==",
+      "version": "7.20.7",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.20.7.tgz",
+      "integrity": "sha512-ewBbHQ+1U/VnH1fxltbJqDeWBU1oNLG8Dj11uIv3xVf7nrQu0bPGe5Rf716r7K5Qz+SqtAOVswoVunoiBtGhxw==",
       "dev": true,
       "requires": {
       "dev": true,
       "requires": {
-        "@babel/helper-plugin-utils": "^7.18.9",
-        "@babel/helper-skip-transparent-expression-wrappers": "^7.18.9"
+        "@babel/helper-plugin-utils": "^7.20.2",
+        "@babel/helper-skip-transparent-expression-wrappers": "^7.20.0"
       }
     },
     "@babel/plugin-transform-sticky-regex": {
       }
     },
     "@babel/plugin-transform-sticky-regex": {
       }
     },
     "@babel/preset-env": {
       }
     },
     "@babel/preset-env": {
-      "version": "7.14.8",
-      "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.14.8.tgz",
-      "integrity": "sha512-a9aOppDU93oArQ51H+B8M1vH+tayZbuBqzjOhntGetZVa+4tTu5jp+XTwqHGG2lxslqomPYVSjIxQkFwXzgnxg==",
-      "dev": true,
-      "requires": {
-        "@babel/compat-data": "^7.14.7",
-        "@babel/helper-compilation-targets": "^7.14.5",
-        "@babel/helper-plugin-utils": "^7.14.5",
-        "@babel/helper-validator-option": "^7.14.5",
-        "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.14.5",
-        "@babel/plugin-proposal-async-generator-functions": "^7.14.7",
-        "@babel/plugin-proposal-class-properties": "^7.14.5",
-        "@babel/plugin-proposal-class-static-block": "^7.14.5",
-        "@babel/plugin-proposal-dynamic-import": "^7.14.5",
-        "@babel/plugin-proposal-export-namespace-from": "^7.14.5",
-        "@babel/plugin-proposal-json-strings": "^7.14.5",
-        "@babel/plugin-proposal-logical-assignment-operators": "^7.14.5",
-        "@babel/plugin-proposal-nullish-coalescing-operator": "^7.14.5",
-        "@babel/plugin-proposal-numeric-separator": "^7.14.5",
-        "@babel/plugin-proposal-object-rest-spread": "^7.14.7",
-        "@babel/plugin-proposal-optional-catch-binding": "^7.14.5",
-        "@babel/plugin-proposal-optional-chaining": "^7.14.5",
-        "@babel/plugin-proposal-private-methods": "^7.14.5",
-        "@babel/plugin-proposal-private-property-in-object": "^7.14.5",
-        "@babel/plugin-proposal-unicode-property-regex": "^7.14.5",
+      "version": "7.16.11",
+      "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.16.11.tgz",
+      "integrity": "sha512-qcmWG8R7ZW6WBRPZK//y+E3Cli151B20W1Rv7ln27vuPaXU/8TKms6jFdiJtF7UDTxcrb7mZd88tAeK9LjdT8g==",
+      "dev": true,
+      "requires": {
+        "@babel/compat-data": "^7.16.8",
+        "@babel/helper-compilation-targets": "^7.16.7",
+        "@babel/helper-plugin-utils": "^7.16.7",
+        "@babel/helper-validator-option": "^7.16.7",
+        "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.16.7",
+        "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.16.7",
+        "@babel/plugin-proposal-async-generator-functions": "^7.16.8",
+        "@babel/plugin-proposal-class-properties": "^7.16.7",
+        "@babel/plugin-proposal-class-static-block": "^7.16.7",
+        "@babel/plugin-proposal-dynamic-import": "^7.16.7",
+        "@babel/plugin-proposal-export-namespace-from": "^7.16.7",
+        "@babel/plugin-proposal-json-strings": "^7.16.7",
+        "@babel/plugin-proposal-logical-assignment-operators": "^7.16.7",
+        "@babel/plugin-proposal-nullish-coalescing-operator": "^7.16.7",
+        "@babel/plugin-proposal-numeric-separator": "^7.16.7",
+        "@babel/plugin-proposal-object-rest-spread": "^7.16.7",
+        "@babel/plugin-proposal-optional-catch-binding": "^7.16.7",
+        "@babel/plugin-proposal-optional-chaining": "^7.16.7",
+        "@babel/plugin-proposal-private-methods": "^7.16.11",
+        "@babel/plugin-proposal-private-property-in-object": "^7.16.7",
+        "@babel/plugin-proposal-unicode-property-regex": "^7.16.7",
         "@babel/plugin-syntax-async-generators": "^7.8.4",
         "@babel/plugin-syntax-class-properties": "^7.12.13",
         "@babel/plugin-syntax-class-static-block": "^7.14.5",
         "@babel/plugin-syntax-async-generators": "^7.8.4",
         "@babel/plugin-syntax-class-properties": "^7.12.13",
         "@babel/plugin-syntax-class-static-block": "^7.14.5",
         "@babel/plugin-syntax-optional-chaining": "^7.8.3",
         "@babel/plugin-syntax-private-property-in-object": "^7.14.5",
         "@babel/plugin-syntax-top-level-await": "^7.14.5",
         "@babel/plugin-syntax-optional-chaining": "^7.8.3",
         "@babel/plugin-syntax-private-property-in-object": "^7.14.5",
         "@babel/plugin-syntax-top-level-await": "^7.14.5",
-        "@babel/plugin-transform-arrow-functions": "^7.14.5",
-        "@babel/plugin-transform-async-to-generator": "^7.14.5",
-        "@babel/plugin-transform-block-scoped-functions": "^7.14.5",
-        "@babel/plugin-transform-block-scoping": "^7.14.5",
-        "@babel/plugin-transform-classes": "^7.14.5",
-        "@babel/plugin-transform-computed-properties": "^7.14.5",
-        "@babel/plugin-transform-destructuring": "^7.14.7",
-        "@babel/plugin-transform-dotall-regex": "^7.14.5",
-        "@babel/plugin-transform-duplicate-keys": "^7.14.5",
-        "@babel/plugin-transform-exponentiation-operator": "^7.14.5",
-        "@babel/plugin-transform-for-of": "^7.14.5",
-        "@babel/plugin-transform-function-name": "^7.14.5",
-        "@babel/plugin-transform-literals": "^7.14.5",
-        "@babel/plugin-transform-member-expression-literals": "^7.14.5",
-        "@babel/plugin-transform-modules-amd": "^7.14.5",
-        "@babel/plugin-transform-modules-commonjs": "^7.14.5",
-        "@babel/plugin-transform-modules-systemjs": "^7.14.5",
-        "@babel/plugin-transform-modules-umd": "^7.14.5",
-        "@babel/plugin-transform-named-capturing-groups-regex": "^7.14.7",
-        "@babel/plugin-transform-new-target": "^7.14.5",
-        "@babel/plugin-transform-object-super": "^7.14.5",
-        "@babel/plugin-transform-parameters": "^7.14.5",
-        "@babel/plugin-transform-property-literals": "^7.14.5",
-        "@babel/plugin-transform-regenerator": "^7.14.5",
-        "@babel/plugin-transform-reserved-words": "^7.14.5",
-        "@babel/plugin-transform-shorthand-properties": "^7.14.5",
-        "@babel/plugin-transform-spread": "^7.14.6",
-        "@babel/plugin-transform-sticky-regex": "^7.14.5",
-        "@babel/plugin-transform-template-literals": "^7.14.5",
-        "@babel/plugin-transform-typeof-symbol": "^7.14.5",
-        "@babel/plugin-transform-unicode-escapes": "^7.14.5",
-        "@babel/plugin-transform-unicode-regex": "^7.14.5",
-        "@babel/preset-modules": "^0.1.4",
-        "@babel/types": "^7.14.8",
-        "babel-plugin-polyfill-corejs2": "^0.2.2",
-        "babel-plugin-polyfill-corejs3": "^0.2.2",
-        "babel-plugin-polyfill-regenerator": "^0.2.2",
-        "core-js-compat": "^3.15.0",
+        "@babel/plugin-transform-arrow-functions": "^7.16.7",
+        "@babel/plugin-transform-async-to-generator": "^7.16.8",
+        "@babel/plugin-transform-block-scoped-functions": "^7.16.7",
+        "@babel/plugin-transform-block-scoping": "^7.16.7",
+        "@babel/plugin-transform-classes": "^7.16.7",
+        "@babel/plugin-transform-computed-properties": "^7.16.7",
+        "@babel/plugin-transform-destructuring": "^7.16.7",
+        "@babel/plugin-transform-dotall-regex": "^7.16.7",
+        "@babel/plugin-transform-duplicate-keys": "^7.16.7",
+        "@babel/plugin-transform-exponentiation-operator": "^7.16.7",
+        "@babel/plugin-transform-for-of": "^7.16.7",
+        "@babel/plugin-transform-function-name": "^7.16.7",
+        "@babel/plugin-transform-literals": "^7.16.7",
+        "@babel/plugin-transform-member-expression-literals": "^7.16.7",
+        "@babel/plugin-transform-modules-amd": "^7.16.7",
+        "@babel/plugin-transform-modules-commonjs": "^7.16.8",
+        "@babel/plugin-transform-modules-systemjs": "^7.16.7",
+        "@babel/plugin-transform-modules-umd": "^7.16.7",
+        "@babel/plugin-transform-named-capturing-groups-regex": "^7.16.8",
+        "@babel/plugin-transform-new-target": "^7.16.7",
+        "@babel/plugin-transform-object-super": "^7.16.7",
+        "@babel/plugin-transform-parameters": "^7.16.7",
+        "@babel/plugin-transform-property-literals": "^7.16.7",
+        "@babel/plugin-transform-regenerator": "^7.16.7",
+        "@babel/plugin-transform-reserved-words": "^7.16.7",
+        "@babel/plugin-transform-shorthand-properties": "^7.16.7",
+        "@babel/plugin-transform-spread": "^7.16.7",
+        "@babel/plugin-transform-sticky-regex": "^7.16.7",
+        "@babel/plugin-transform-template-literals": "^7.16.7",
+        "@babel/plugin-transform-typeof-symbol": "^7.16.7",
+        "@babel/plugin-transform-unicode-escapes": "^7.16.7",
+        "@babel/plugin-transform-unicode-regex": "^7.16.7",
+        "@babel/preset-modules": "^0.1.5",
+        "@babel/types": "^7.16.8",
+        "babel-plugin-polyfill-corejs2": "^0.3.0",
+        "babel-plugin-polyfill-corejs3": "^0.5.0",
+        "babel-plugin-polyfill-regenerator": "^0.3.0",
+        "core-js-compat": "^3.20.2",
         "semver": "^6.3.0"
         "semver": "^6.3.0"
-      },
-      "dependencies": {
-        "semver": {
-          "version": "6.3.0",
-          "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
-          "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==",
-          "dev": true
-        }
       }
     },
     "@babel/preset-modules": {
       }
     },
     "@babel/preset-modules": {
         "@babel/plugin-transform-react-pure-annotations": "^7.18.6"
       }
     },
         "@babel/plugin-transform-react-pure-annotations": "^7.18.6"
       }
     },
+    "@babel/regjsgen": {
+      "version": "0.8.0",
+      "resolved": "https://registry.npmjs.org/@babel/regjsgen/-/regjsgen-0.8.0.tgz",
+      "integrity": "sha512-x/rqGMdzj+fWZvCOYForTghzbtqPDZ5gPwaoNGHdgDfF2QA/XZbCBp4Moo5scrkAMPhB7z26XM/AaHuIJdgauA==",
+      "dev": true
+    },
     "@babel/runtime": {
     "@babel/runtime": {
-      "version": "7.18.9",
-      "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.18.9.tgz",
-      "integrity": "sha512-lkqXDcvlFT5rvEjiu6+QYO+1GXrEHRo2LOtS7E4GtX5ESIZOgepqsZBVIj6Pv+a6zqsya9VCgiK1KAK4BvJDAw==",
+      "version": "7.21.0",
+      "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.21.0.tgz",
+      "integrity": "sha512-xwII0//EObnq89Ji5AKYQaRYiW/nZ3llSv29d49IuxPhKbtJoLP+9QUUZ4nVragQVtaVGeZrpB+ZtG/Pdy/POw==",
       "requires": {
       "requires": {
-        "regenerator-runtime": "^0.13.4"
+        "regenerator-runtime": "^0.13.11"
       }
     },
     "@babel/runtime-corejs3": {
       }
     },
     "@babel/runtime-corejs3": {
-      "version": "7.18.9",
-      "resolved": "https://registry.npmjs.org/@babel/runtime-corejs3/-/runtime-corejs3-7.18.9.tgz",
-      "integrity": "sha512-qZEWeccZCrHA2Au4/X05QW5CMdm4VjUDCrGq5gf1ZDcM4hRqreKrtwAn7yci9zfgAS9apvnsFXiGBHBAxZdK9A==",
+      "version": "7.21.0",
+      "resolved": "https://registry.npmjs.org/@babel/runtime-corejs3/-/runtime-corejs3-7.21.0.tgz",
+      "integrity": "sha512-TDD4UJzos3JJtM+tHX+w2Uc+KWj7GV+VKKFdMVd2Rx8sdA19hcc3P3AHFYd5LVOw+pYuSd5lICC3gm52B6Rwxw==",
       "requires": {
       "requires": {
-        "core-js-pure": "^3.20.2",
-        "regenerator-runtime": "^0.13.4"
+        "core-js-pure": "^3.25.1",
+        "regenerator-runtime": "^0.13.11"
       }
     },
     "@babel/template": {
       }
     },
     "@babel/template": {
-      "version": "7.18.10",
-      "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.18.10.tgz",
-      "integrity": "sha512-TI+rCtooWHr3QJ27kJxfjutghu44DLnasDMwpDqCXVTal9RLp3RSYNh4NdBrRP2cQAoG9A8juOQl6P6oZG4JxA==",
+      "version": "7.20.7",
+      "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.20.7.tgz",
+      "integrity": "sha512-8SegXApWe6VoNw0r9JHpSteLKTpTiLZ4rMlGIm9JQ18KiCtyQiAMEazujAHrUS5flrcqYZa75ukev3P6QmUwUw==",
       "requires": {
         "@babel/code-frame": "^7.18.6",
       "requires": {
         "@babel/code-frame": "^7.18.6",
-        "@babel/parser": "^7.18.10",
-        "@babel/types": "^7.18.10"
+        "@babel/parser": "^7.20.7",
+        "@babel/types": "^7.20.7"
       }
     },
     "@babel/traverse": {
       }
     },
     "@babel/traverse": {
-      "version": "7.18.11",
-      "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.18.11.tgz",
-      "integrity": "sha512-TG9PiM2R/cWCAy6BPJKeHzNbu4lPzOSZpeMfeNErskGpTJx6trEvFaVCbDvpcxwy49BKWmEPwiW8mrysNiDvIQ==",
+      "version": "7.21.2",
+      "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.21.2.tgz",
+      "integrity": "sha512-ts5FFU/dSUPS13tv8XiEObDu9K+iagEKME9kAbaP7r0Y9KtZJZ+NGndDvWoRAYNpeWafbpFeki3q9QoMD6gxyw==",
       "requires": {
         "@babel/code-frame": "^7.18.6",
       "requires": {
         "@babel/code-frame": "^7.18.6",
-        "@babel/generator": "^7.18.10",
+        "@babel/generator": "^7.21.1",
         "@babel/helper-environment-visitor": "^7.18.9",
         "@babel/helper-environment-visitor": "^7.18.9",
-        "@babel/helper-function-name": "^7.18.9",
+        "@babel/helper-function-name": "^7.21.0",
         "@babel/helper-hoist-variables": "^7.18.6",
         "@babel/helper-split-export-declaration": "^7.18.6",
         "@babel/helper-hoist-variables": "^7.18.6",
         "@babel/helper-split-export-declaration": "^7.18.6",
-        "@babel/parser": "^7.18.11",
-        "@babel/types": "^7.18.10",
+        "@babel/parser": "^7.21.2",
+        "@babel/types": "^7.21.2",
         "debug": "^4.1.0",
         "globals": "^11.1.0"
       }
     },
     "@babel/types": {
         "debug": "^4.1.0",
         "globals": "^11.1.0"
       }
     },
     "@babel/types": {
-      "version": "7.18.10",
-      "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.18.10.tgz",
-      "integrity": "sha512-MJvnbEiiNkpjo+LknnmRrqbY1GPUUggjv+wQVjetM/AONoupqRALB7I6jGqNUAZsKcRIEu2J6FRFvsczljjsaQ==",
+      "version": "7.21.2",
+      "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.21.2.tgz",
+      "integrity": "sha512-3wRZSs7jiFaB8AjxiiD+VqN5DTG2iRvJGQ+qYFrs/654lg6kGTQWIOFjlBo5RaXuAZjBmP3+OQH4dmhqiiyYxw==",
       "requires": {
       "requires": {
-        "@babel/helper-string-parser": "^7.18.10",
-        "@babel/helper-validator-identifier": "^7.18.6",
+        "@babel/helper-string-parser": "^7.19.4",
+        "@babel/helper-validator-identifier": "^7.19.1",
         "to-fast-properties": "^2.0.0"
       }
     },
         "to-fast-properties": "^2.0.0"
       }
     },
         "tslib": "^2.0.0"
       }
     },
         "tslib": "^2.0.0"
       }
     },
-    "@cnakazawa/watch": {
-      "version": "1.0.4",
-      "resolved": "https://registry.npmjs.org/@cnakazawa/watch/-/watch-1.0.4.tgz",
-      "integrity": "sha512-v9kIhKwjeZThiWrLmj0y17CWoyddASLj9O2yvbZkbvw/N3rWOYy9zkV66ursAoVr0mV15bL8g0c4QZUE6cdDoQ==",
-      "dev": true,
-      "requires": {
-        "exec-sh": "^0.3.2",
-        "minimist": "^1.2.0"
-      }
-    },
     "@colors/colors": {
       "version": "1.5.0",
       "resolved": "https://registry.npmjs.org/@colors/colors/-/colors-1.5.0.tgz",
     "@colors/colors": {
       "version": "1.5.0",
       "resolved": "https://registry.npmjs.org/@colors/colors/-/colors-1.5.0.tgz",
       "optional": true
     },
     "@compodoc/compodoc": {
       "optional": true
     },
     "@compodoc/compodoc": {
-      "version": "1.1.15",
-      "resolved": "https://registry.npmjs.org/@compodoc/compodoc/-/compodoc-1.1.15.tgz",
-      "integrity": "sha512-ek38uUSFR4SfH4ueJbV9zPn5bxaA21uSRPeeG2YQ602S0DgYl5QhJlXM2DlvZIqZ3Fuz0p1sd/v0f0ZnNrCDzA==",
+      "version": "1.1.18",
+      "resolved": "https://registry.npmjs.org/@compodoc/compodoc/-/compodoc-1.1.18.tgz",
+      "integrity": "sha512-+AFtcj2U3AJq6r8a2+PTdajIlS7m3pgvDhqgoYZJ4Rg/Zp9xvuDvUJU+5oHu8iHCAWwda3NoLUDjOZMNR8uIKg==",
       "dev": true,
       "requires": {
       "dev": true,
       "requires": {
-        "@babel/core": "^7.15.5",
-        "@babel/preset-env": "^7.15.5",
-        "@compodoc/live-server": "^1.2.2",
+        "@angular-devkit/schematics": "^13.1.2",
+        "@babel/core": "^7.16.7",
+        "@babel/preset-env": "^7.16.7",
+        "@compodoc/live-server": "^1.2.3",
         "@compodoc/ngd-transformer": "^2.1.0",
         "chalk": "^4.1.2",
         "cheerio": "^1.0.0-rc.10",
         "chokidar": "^3.5.2",
         "@compodoc/ngd-transformer": "^2.1.0",
         "chalk": "^4.1.2",
         "cheerio": "^1.0.0-rc.10",
         "chokidar": "^3.5.2",
-        "colors": "^1.4.0",
-        "commander": "^8.2.0",
+        "colors": "1.4.0",
+        "commander": "^8.3.0",
         "cosmiconfig": "^7.0.1",
         "cosmiconfig": "^7.0.1",
-        "decache": "^4.6.0",
-        "fancy-log": "^1.3.3",
+        "decache": "^4.6.1",
+        "fancy-log": "^2.0.0",
         "findit2": "^2.2.3",
         "fs-extra": "^10.0.0",
         "findit2": "^2.2.3",
         "fs-extra": "^10.0.0",
-        "glob": "^7.1.7",
+        "glob": "^7.2.0",
         "handlebars": "^4.7.7",
         "html-entities": "^2.3.2",
         "handlebars": "^4.7.7",
         "html-entities": "^2.3.2",
-        "i18next": "^20.6.1",
+        "i18next": "^21.6.5",
         "inside": "^1.0.0",
         "json5": "^2.2.0",
         "lodash": "^4.17.21",
         "inside": "^1.0.0",
         "json5": "^2.2.0",
         "lodash": "^4.17.21",
-        "loglevel": "^1.7.1",
+        "loglevel": "^1.8.0",
         "loglevel-plugin-prefix": "^0.8.4",
         "lunr": "^2.3.9",
         "loglevel-plugin-prefix": "^0.8.4",
         "lunr": "^2.3.9",
-        "marked": "^3.0.4",
+        "marked": "^4.0.9",
         "minimist": "^1.2.5",
         "opencollective-postinstall": "^2.0.3",
         "os-name": "4.0.1",
         "minimist": "^1.2.5",
         "opencollective-postinstall": "^2.0.3",
         "os-name": "4.0.1",
-        "pdfmake": "^0.2.2",
+        "pdfjs-dist": "^2.12.313",
+        "pdfmake": "^0.2.4",
         "semver": "^7.3.5",
         "traverse": "^0.6.6",
         "semver": "^7.3.5",
         "traverse": "^0.6.6",
-        "ts-morph": "^12.0.0",
+        "ts-morph": "^13.0.2",
         "uuid": "^8.3.2"
       },
       "dependencies": {
         "uuid": "^8.3.2"
       },
       "dependencies": {
-        "@ampproject/remapping": {
-          "version": "2.2.0",
-          "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.0.tgz",
-          "integrity": "sha512-qRmjj8nj9qmLTQXXmaR1cck3UXSRMPrbsLJAasZpF+t3riI71BXed5ebIOYwQntykeZuhjsdweEc9BxH5Jc26w==",
-          "dev": true,
-          "requires": {
-            "@jridgewell/gen-mapping": "^0.1.0",
-            "@jridgewell/trace-mapping": "^0.3.9"
-          }
-        },
-        "@babel/core": {
-          "version": "7.18.10",
-          "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.18.10.tgz",
-          "integrity": "sha512-JQM6k6ENcBFKVtWvLavlvi/mPcpYZ3+R+2EySDEMSMbp7Mn4FexlbbJVrx2R7Ijhr01T8gyqrOaABWIOgxeUyw==",
-          "dev": true,
-          "requires": {
-            "@ampproject/remapping": "^2.1.0",
-            "@babel/code-frame": "^7.18.6",
-            "@babel/generator": "^7.18.10",
-            "@babel/helper-compilation-targets": "^7.18.9",
-            "@babel/helper-module-transforms": "^7.18.9",
-            "@babel/helpers": "^7.18.9",
-            "@babel/parser": "^7.18.10",
-            "@babel/template": "^7.18.10",
-            "@babel/traverse": "^7.18.10",
-            "@babel/types": "^7.18.10",
-            "convert-source-map": "^1.7.0",
-            "debug": "^4.1.0",
-            "gensync": "^1.0.0-beta.2",
-            "json5": "^2.2.1",
-            "semver": "^6.3.0"
-          },
-          "dependencies": {
-            "semver": {
-              "version": "6.3.0",
-              "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
-              "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==",
-              "dev": true
-            }
-          }
-        },
-        "@babel/helper-define-polyfill-provider": {
-          "version": "0.3.2",
-          "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.3.2.tgz",
-          "integrity": "sha512-r9QJJ+uDWrd+94BSPcP6/de67ygLtvVy6cK4luE6MOuDsZIdoaPBnfSpbO/+LTifjPckbKXRuI9BB/Z2/y3iTg==",
-          "dev": true,
-          "requires": {
-            "@babel/helper-compilation-targets": "^7.17.7",
-            "@babel/helper-plugin-utils": "^7.16.7",
-            "debug": "^4.1.1",
-            "lodash.debounce": "^4.0.8",
-            "resolve": "^1.14.2",
-            "semver": "^6.1.2"
-          },
-          "dependencies": {
-            "semver": {
-              "version": "6.3.0",
-              "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
-              "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==",
-              "dev": true
-            }
-          }
-        },
-        "@babel/plugin-proposal-async-generator-functions": {
-          "version": "7.18.10",
-          "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.18.10.tgz",
-          "integrity": "sha512-1mFuY2TOsR1hxbjCo4QL+qlIjV07p4H4EUYw2J/WCqsvFV6V9X9z9YhXbWndc/4fw+hYGlDT7egYxliMp5O6Ew==",
-          "dev": true,
-          "requires": {
-            "@babel/helper-environment-visitor": "^7.18.9",
-            "@babel/helper-plugin-utils": "^7.18.9",
-            "@babel/helper-remap-async-to-generator": "^7.18.9",
-            "@babel/plugin-syntax-async-generators": "^7.8.4"
-          }
-        },
-        "@babel/plugin-transform-async-to-generator": {
-          "version": "7.18.6",
-          "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.18.6.tgz",
-          "integrity": "sha512-ARE5wZLKnTgPW7/1ftQmSi1CmkqqHo2DNmtztFhvgtOWSDfq0Cq9/9L+KnZNYSNrydBekhW3rwShduf59RoXag==",
-          "dev": true,
-          "requires": {
-            "@babel/helper-module-imports": "^7.18.6",
-            "@babel/helper-plugin-utils": "^7.18.6",
-            "@babel/helper-remap-async-to-generator": "^7.18.6"
-          }
-        },
-        "@babel/preset-env": {
-          "version": "7.18.10",
-          "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.18.10.tgz",
-          "integrity": "sha512-wVxs1yjFdW3Z/XkNfXKoblxoHgbtUF7/l3PvvP4m02Qz9TZ6uZGxRVYjSQeR87oQmHco9zWitW5J82DJ7sCjvA==",
-          "dev": true,
-          "requires": {
-            "@babel/compat-data": "^7.18.8",
-            "@babel/helper-compilation-targets": "^7.18.9",
-            "@babel/helper-plugin-utils": "^7.18.9",
-            "@babel/helper-validator-option": "^7.18.6",
-            "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.18.6",
-            "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.18.9",
-            "@babel/plugin-proposal-async-generator-functions": "^7.18.10",
-            "@babel/plugin-proposal-class-properties": "^7.18.6",
-            "@babel/plugin-proposal-class-static-block": "^7.18.6",
-            "@babel/plugin-proposal-dynamic-import": "^7.18.6",
-            "@babel/plugin-proposal-export-namespace-from": "^7.18.9",
-            "@babel/plugin-proposal-json-strings": "^7.18.6",
-            "@babel/plugin-proposal-logical-assignment-operators": "^7.18.9",
-            "@babel/plugin-proposal-nullish-coalescing-operator": "^7.18.6",
-            "@babel/plugin-proposal-numeric-separator": "^7.18.6",
-            "@babel/plugin-proposal-object-rest-spread": "^7.18.9",
-            "@babel/plugin-proposal-optional-catch-binding": "^7.18.6",
-            "@babel/plugin-proposal-optional-chaining": "^7.18.9",
-            "@babel/plugin-proposal-private-methods": "^7.18.6",
-            "@babel/plugin-proposal-private-property-in-object": "^7.18.6",
-            "@babel/plugin-proposal-unicode-property-regex": "^7.18.6",
-            "@babel/plugin-syntax-async-generators": "^7.8.4",
-            "@babel/plugin-syntax-class-properties": "^7.12.13",
-            "@babel/plugin-syntax-class-static-block": "^7.14.5",
-            "@babel/plugin-syntax-dynamic-import": "^7.8.3",
-            "@babel/plugin-syntax-export-namespace-from": "^7.8.3",
-            "@babel/plugin-syntax-import-assertions": "^7.18.6",
-            "@babel/plugin-syntax-json-strings": "^7.8.3",
-            "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4",
-            "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3",
-            "@babel/plugin-syntax-numeric-separator": "^7.10.4",
-            "@babel/plugin-syntax-object-rest-spread": "^7.8.3",
-            "@babel/plugin-syntax-optional-catch-binding": "^7.8.3",
-            "@babel/plugin-syntax-optional-chaining": "^7.8.3",
-            "@babel/plugin-syntax-private-property-in-object": "^7.14.5",
-            "@babel/plugin-syntax-top-level-await": "^7.14.5",
-            "@babel/plugin-transform-arrow-functions": "^7.18.6",
-            "@babel/plugin-transform-async-to-generator": "^7.18.6",
-            "@babel/plugin-transform-block-scoped-functions": "^7.18.6",
-            "@babel/plugin-transform-block-scoping": "^7.18.9",
-            "@babel/plugin-transform-classes": "^7.18.9",
-            "@babel/plugin-transform-computed-properties": "^7.18.9",
-            "@babel/plugin-transform-destructuring": "^7.18.9",
-            "@babel/plugin-transform-dotall-regex": "^7.18.6",
-            "@babel/plugin-transform-duplicate-keys": "^7.18.9",
-            "@babel/plugin-transform-exponentiation-operator": "^7.18.6",
-            "@babel/plugin-transform-for-of": "^7.18.8",
-            "@babel/plugin-transform-function-name": "^7.18.9",
-            "@babel/plugin-transform-literals": "^7.18.9",
-            "@babel/plugin-transform-member-expression-literals": "^7.18.6",
-            "@babel/plugin-transform-modules-amd": "^7.18.6",
-            "@babel/plugin-transform-modules-commonjs": "^7.18.6",
-            "@babel/plugin-transform-modules-systemjs": "^7.18.9",
-            "@babel/plugin-transform-modules-umd": "^7.18.6",
-            "@babel/plugin-transform-named-capturing-groups-regex": "^7.18.6",
-            "@babel/plugin-transform-new-target": "^7.18.6",
-            "@babel/plugin-transform-object-super": "^7.18.6",
-            "@babel/plugin-transform-parameters": "^7.18.8",
-            "@babel/plugin-transform-property-literals": "^7.18.6",
-            "@babel/plugin-transform-regenerator": "^7.18.6",
-            "@babel/plugin-transform-reserved-words": "^7.18.6",
-            "@babel/plugin-transform-shorthand-properties": "^7.18.6",
-            "@babel/plugin-transform-spread": "^7.18.9",
-            "@babel/plugin-transform-sticky-regex": "^7.18.6",
-            "@babel/plugin-transform-template-literals": "^7.18.9",
-            "@babel/plugin-transform-typeof-symbol": "^7.18.9",
-            "@babel/plugin-transform-unicode-escapes": "^7.18.10",
-            "@babel/plugin-transform-unicode-regex": "^7.18.6",
-            "@babel/preset-modules": "^0.1.5",
-            "@babel/types": "^7.18.10",
-            "babel-plugin-polyfill-corejs2": "^0.3.2",
-            "babel-plugin-polyfill-corejs3": "^0.5.3",
-            "babel-plugin-polyfill-regenerator": "^0.4.0",
-            "core-js-compat": "^3.22.1",
-            "semver": "^6.3.0"
-          },
-          "dependencies": {
-            "semver": {
-              "version": "6.3.0",
-              "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
-              "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==",
-              "dev": true
-            }
-          }
-        },
-        "@jridgewell/gen-mapping": {
-          "version": "0.1.1",
-          "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.1.1.tgz",
-          "integrity": "sha512-sQXCasFk+U8lWYEe66WxRDOE9PjVz4vSM51fTu3Hw+ClTpUSQb718772vH3pyS5pShp6lvQM7SxgIDXXXmOX7w==",
-          "dev": true,
-          "requires": {
-            "@jridgewell/set-array": "^1.0.0",
-            "@jridgewell/sourcemap-codec": "^1.4.10"
-          }
-        },
         "ansi-styles": {
           "version": "4.3.0",
           "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
         "ansi-styles": {
           "version": "4.3.0",
           "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
             "color-convert": "^2.0.1"
           }
         },
             "color-convert": "^2.0.1"
           }
         },
-        "babel-plugin-polyfill-corejs2": {
-          "version": "0.3.2",
-          "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.3.2.tgz",
-          "integrity": "sha512-LPnodUl3lS0/4wN3Rb+m+UK8s7lj2jcLRrjho4gLw+OJs+I4bvGXshINesY5xx/apM+biTnQ9reDI8yj+0M5+Q==",
-          "dev": true,
-          "requires": {
-            "@babel/compat-data": "^7.17.7",
-            "@babel/helper-define-polyfill-provider": "^0.3.2",
-            "semver": "^6.1.1"
-          },
-          "dependencies": {
-            "semver": {
-              "version": "6.3.0",
-              "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
-              "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==",
-              "dev": true
-            }
-          }
-        },
-        "babel-plugin-polyfill-corejs3": {
-          "version": "0.5.3",
-          "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.5.3.tgz",
-          "integrity": "sha512-zKsXDh0XjnrUEW0mxIHLfjBfnXSMr5Q/goMe/fxpQnLm07mcOZiIZHBNWCMx60HmdvjxfXcalac0tfFg0wqxyw==",
-          "dev": true,
-          "requires": {
-            "@babel/helper-define-polyfill-provider": "^0.3.2",
-            "core-js-compat": "^3.21.0"
-          }
-        },
-        "babel-plugin-polyfill-regenerator": {
-          "version": "0.4.0",
-          "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.4.0.tgz",
-          "integrity": "sha512-RW1cnryiADFeHmfLS+WW/G431p1PsW5qdRdz0SDRi7TKcUgc7Oh/uXkT7MZ/+tGsT1BkczEAmD5XjUyJ5SWDTw==",
-          "dev": true,
-          "requires": {
-            "@babel/helper-define-polyfill-provider": "^0.3.2"
-          }
-        },
         "chalk": {
           "version": "4.1.2",
           "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
         "chalk": {
           "version": "4.1.2",
           "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
           "integrity": "sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==",
           "dev": true
         },
           "integrity": "sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==",
           "dev": true
         },
+        "fs-extra": {
+          "version": "10.1.0",
+          "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz",
+          "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==",
+          "dev": true,
+          "requires": {
+            "graceful-fs": "^4.2.0",
+            "jsonfile": "^6.0.1",
+            "universalify": "^2.0.0"
+          }
+        },
         "has-flag": {
           "version": "4.0.0",
           "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
           "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
           "dev": true
         },
         "has-flag": {
           "version": "4.0.0",
           "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
           "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
           "dev": true
         },
-        "html-entities": {
-          "version": "2.3.3",
-          "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-2.3.3.tgz",
-          "integrity": "sha512-DV5Ln36z34NNTDgnz0EWGBLZENelNAtkiFA4kyNOG2tDI6Mz1uSWiq1wAKdyjnJwyDiDO7Fa2SO1CTxPXL8VxA==",
-          "dev": true
+        "lru-cache": {
+          "version": "6.0.0",
+          "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz",
+          "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==",
+          "dev": true,
+          "requires": {
+            "yallist": "^4.0.0"
+          }
         },
         "semver": {
         },
         "semver": {
-          "version": "7.3.7",
-          "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.7.tgz",
-          "integrity": "sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g==",
+          "version": "7.3.8",
+          "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz",
+          "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==",
           "dev": true,
           "requires": {
             "lru-cache": "^6.0.0"
           "dev": true,
           "requires": {
             "lru-cache": "^6.0.0"
           "requires": {
             "has-flag": "^4.0.0"
           }
           "requires": {
             "has-flag": "^4.0.0"
           }
+        },
+        "yallist": {
+          "version": "4.0.0",
+          "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
+          "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==",
+          "dev": true
         }
       }
     },
         }
       }
     },
           "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==",
           "dev": true
         },
           "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==",
           "dev": true
         },
-        "open": {
-          "version": "8.4.0",
-          "resolved": "https://registry.npmjs.org/open/-/open-8.4.0.tgz",
-          "integrity": "sha512-XgFPPM+B28FtCCgSb9I+s9szOC1vZRSwgWsRUA5ylIxRTgKozqjOCrVOqGsYABPYK5qnfqClxZTFBa8PKt2v6Q==",
-          "dev": true,
-          "requires": {
-            "define-lazy-prop": "^2.0.0",
-            "is-docker": "^2.1.1",
-            "is-wsl": "^2.2.0"
-          }
-        },
         "send": {
           "version": "0.18.0",
           "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz",
         "send": {
           "version": "0.18.0",
           "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz",
         "ansi-colors": "^4.1.1",
         "fancy-log": "^1.3.3",
         "typescript": "^4.0.3"
         "ansi-colors": "^4.1.1",
         "fancy-log": "^1.3.3",
         "typescript": "^4.0.3"
+      },
+      "dependencies": {
+        "fancy-log": {
+          "version": "1.3.3",
+          "resolved": "https://registry.npmjs.org/fancy-log/-/fancy-log-1.3.3.tgz",
+          "integrity": "sha512-k9oEhlyc0FrVh25qYuSELjr8oxsCoc4/LEZfg2iJJrfEk/tZL9bCoJE47gqAvI2m/AUjluCS4+3I0eTx8n3AEw==",
+          "dev": true,
+          "requires": {
+            "ansi-gray": "^0.1.1",
+            "color-support": "^1.1.3",
+            "parse-node-version": "^1.0.0",
+            "time-stamp": "^1.0.0"
+          }
+        }
       }
     },
     "@compodoc/ngd-transformer": {
       }
     },
     "@compodoc/ngd-transformer": {
         "@compodoc/ngd-core": "~2.1.0",
         "dot": "^1.1.3",
         "fs-extra": "^9.0.1"
         "@compodoc/ngd-core": "~2.1.0",
         "dot": "^1.1.3",
         "fs-extra": "^9.0.1"
-      },
-      "dependencies": {
-        "fs-extra": {
-          "version": "9.1.0",
-          "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz",
-          "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==",
-          "dev": true,
-          "requires": {
-            "at-least-node": "^1.0.0",
-            "graceful-fs": "^4.2.0",
-            "jsonfile": "^6.0.1",
-            "universalify": "^2.0.0"
-          }
-        }
       }
     },
       }
     },
-    "@csstools/convert-colors": {
-      "version": "1.4.0",
-      "resolved": "https://registry.npmjs.org/@csstools/convert-colors/-/convert-colors-1.4.0.tgz",
-      "integrity": "sha512-5a6wqoJV/xEdbRNKVo6I4hO3VjyDq//8q2f9I6PBAvMesJHFauXDorcNCsr9RzvsZnaWi5NYCcfyqP1QeFHFbw==",
+    "@csstools/postcss-progressive-custom-properties": {
+      "version": "1.3.0",
+      "resolved": "https://registry.npmjs.org/@csstools/postcss-progressive-custom-properties/-/postcss-progressive-custom-properties-1.3.0.tgz",
+      "integrity": "sha512-ASA9W1aIy5ygskZYuWams4BzafD12ULvSypmaLJT2jvQ8G0M3I8PRQhC0h7mG0Z3LI05+agZjqSR9+K9yaQQjA==",
+      "dev": true,
+      "requires": {
+        "postcss-value-parser": "^4.2.0"
+      }
+    },
+    "@csstools/selector-specificity": {
+      "version": "2.1.1",
+      "resolved": "https://registry.npmjs.org/@csstools/selector-specificity/-/selector-specificity-2.1.1.tgz",
+      "integrity": "sha512-jwx+WCqszn53YHOfvFMJJRd/B2GqkCBt+1MJSG6o5/s8+ytHMvDZXsJgUEWLk12UnLd7HYKac4BYU5i/Ron1Cw==",
       "dev": true
     },
     "@cypress/browserify-preprocessor": {
       "dev": true
     },
     "@cypress/browserify-preprocessor": {
         "lodash.clonedeep": "^4.5.0",
         "through2": "^2.0.0",
         "watchify": "^4.0.0"
         "lodash.clonedeep": "^4.5.0",
         "through2": "^2.0.0",
         "watchify": "^4.0.0"
+      }
+    },
+    "@cypress/request": {
+      "version": "2.88.11",
+      "resolved": "https://registry.npmjs.org/@cypress/request/-/request-2.88.11.tgz",
+      "integrity": "sha512-M83/wfQ1EkspjkE2lNWNV5ui2Cv7UCv1swW1DqljahbzLVWltcsexQh8jYtuS/vzFXP+HySntGM83ZXA9fn17w==",
+      "dev": true,
+      "requires": {
+        "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",
+        "http-signature": "~1.3.6",
+        "is-typedarray": "~1.0.0",
+        "isstream": "~0.1.2",
+        "json-stringify-safe": "~5.0.1",
+        "mime-types": "~2.1.19",
+        "performance-now": "^2.1.0",
+        "qs": "~6.10.3",
+        "safe-buffer": "^5.1.2",
+        "tough-cookie": "~2.5.0",
+        "tunnel-agent": "^0.6.0",
+        "uuid": "^8.3.2"
       },
       "dependencies": {
       },
       "dependencies": {
-        "@ampproject/remapping": {
-          "version": "2.2.0",
-          "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.0.tgz",
-          "integrity": "sha512-qRmjj8nj9qmLTQXXmaR1cck3UXSRMPrbsLJAasZpF+t3riI71BXed5ebIOYwQntykeZuhjsdweEc9BxH5Jc26w==",
+        "form-data": {
+          "version": "2.3.3",
+          "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz",
+          "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==",
           "dev": true,
           "requires": {
           "dev": true,
           "requires": {
-            "@jridgewell/gen-mapping": "^0.1.0",
-            "@jridgewell/trace-mapping": "^0.3.9"
+            "asynckit": "^0.4.0",
+            "combined-stream": "^1.0.6",
+            "mime-types": "^2.1.12"
           }
         },
           }
         },
-        "@babel/core": {
-          "version": "7.18.10",
-          "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.18.10.tgz",
-          "integrity": "sha512-JQM6k6ENcBFKVtWvLavlvi/mPcpYZ3+R+2EySDEMSMbp7Mn4FexlbbJVrx2R7Ijhr01T8gyqrOaABWIOgxeUyw==",
-          "dev": true,
-          "requires": {
-            "@ampproject/remapping": "^2.1.0",
-            "@babel/code-frame": "^7.18.6",
-            "@babel/generator": "^7.18.10",
-            "@babel/helper-compilation-targets": "^7.18.9",
-            "@babel/helper-module-transforms": "^7.18.9",
-            "@babel/helpers": "^7.18.9",
-            "@babel/parser": "^7.18.10",
-            "@babel/template": "^7.18.10",
-            "@babel/traverse": "^7.18.10",
-            "@babel/types": "^7.18.10",
-            "convert-source-map": "^1.7.0",
-            "debug": "^4.1.0",
-            "gensync": "^1.0.0-beta.2",
-            "json5": "^2.2.1",
-            "semver": "^6.3.0"
-          }
-        },
-        "@babel/helper-define-polyfill-provider": {
-          "version": "0.3.2",
-          "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.3.2.tgz",
-          "integrity": "sha512-r9QJJ+uDWrd+94BSPcP6/de67ygLtvVy6cK4luE6MOuDsZIdoaPBnfSpbO/+LTifjPckbKXRuI9BB/Z2/y3iTg==",
-          "dev": true,
-          "requires": {
-            "@babel/helper-compilation-targets": "^7.17.7",
-            "@babel/helper-plugin-utils": "^7.16.7",
-            "debug": "^4.1.1",
-            "lodash.debounce": "^4.0.8",
-            "resolve": "^1.14.2",
-            "semver": "^6.1.2"
-          }
-        },
-        "@babel/plugin-proposal-async-generator-functions": {
-          "version": "7.18.10",
-          "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.18.10.tgz",
-          "integrity": "sha512-1mFuY2TOsR1hxbjCo4QL+qlIjV07p4H4EUYw2J/WCqsvFV6V9X9z9YhXbWndc/4fw+hYGlDT7egYxliMp5O6Ew==",
-          "dev": true,
-          "requires": {
-            "@babel/helper-environment-visitor": "^7.18.9",
-            "@babel/helper-plugin-utils": "^7.18.9",
-            "@babel/helper-remap-async-to-generator": "^7.18.9",
-            "@babel/plugin-syntax-async-generators": "^7.8.4"
-          }
-        },
-        "@babel/plugin-transform-async-to-generator": {
-          "version": "7.18.6",
-          "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.18.6.tgz",
-          "integrity": "sha512-ARE5wZLKnTgPW7/1ftQmSi1CmkqqHo2DNmtztFhvgtOWSDfq0Cq9/9L+KnZNYSNrydBekhW3rwShduf59RoXag==",
-          "dev": true,
-          "requires": {
-            "@babel/helper-module-imports": "^7.18.6",
-            "@babel/helper-plugin-utils": "^7.18.6",
-            "@babel/helper-remap-async-to-generator": "^7.18.6"
-          }
-        },
-        "@babel/plugin-transform-runtime": {
-          "version": "7.18.10",
-          "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.18.10.tgz",
-          "integrity": "sha512-q5mMeYAdfEbpBAgzl7tBre/la3LeCxmDO1+wMXRdPWbcoMjR3GiXlCLk7JBZVVye0bqTGNMbt0yYVXX1B1jEWQ==",
-          "dev": true,
-          "requires": {
-            "@babel/helper-module-imports": "^7.18.6",
-            "@babel/helper-plugin-utils": "^7.18.9",
-            "babel-plugin-polyfill-corejs2": "^0.3.2",
-            "babel-plugin-polyfill-corejs3": "^0.5.3",
-            "babel-plugin-polyfill-regenerator": "^0.4.0",
-            "semver": "^6.3.0"
-          }
-        },
-        "@babel/preset-env": {
-          "version": "7.18.10",
-          "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.18.10.tgz",
-          "integrity": "sha512-wVxs1yjFdW3Z/XkNfXKoblxoHgbtUF7/l3PvvP4m02Qz9TZ6uZGxRVYjSQeR87oQmHco9zWitW5J82DJ7sCjvA==",
-          "dev": true,
-          "requires": {
-            "@babel/compat-data": "^7.18.8",
-            "@babel/helper-compilation-targets": "^7.18.9",
-            "@babel/helper-plugin-utils": "^7.18.9",
-            "@babel/helper-validator-option": "^7.18.6",
-            "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.18.6",
-            "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.18.9",
-            "@babel/plugin-proposal-async-generator-functions": "^7.18.10",
-            "@babel/plugin-proposal-class-properties": "^7.18.6",
-            "@babel/plugin-proposal-class-static-block": "^7.18.6",
-            "@babel/plugin-proposal-dynamic-import": "^7.18.6",
-            "@babel/plugin-proposal-export-namespace-from": "^7.18.9",
-            "@babel/plugin-proposal-json-strings": "^7.18.6",
-            "@babel/plugin-proposal-logical-assignment-operators": "^7.18.9",
-            "@babel/plugin-proposal-nullish-coalescing-operator": "^7.18.6",
-            "@babel/plugin-proposal-numeric-separator": "^7.18.6",
-            "@babel/plugin-proposal-object-rest-spread": "^7.18.9",
-            "@babel/plugin-proposal-optional-catch-binding": "^7.18.6",
-            "@babel/plugin-proposal-optional-chaining": "^7.18.9",
-            "@babel/plugin-proposal-private-methods": "^7.18.6",
-            "@babel/plugin-proposal-private-property-in-object": "^7.18.6",
-            "@babel/plugin-proposal-unicode-property-regex": "^7.18.6",
-            "@babel/plugin-syntax-async-generators": "^7.8.4",
-            "@babel/plugin-syntax-class-properties": "^7.12.13",
-            "@babel/plugin-syntax-class-static-block": "^7.14.5",
-            "@babel/plugin-syntax-dynamic-import": "^7.8.3",
-            "@babel/plugin-syntax-export-namespace-from": "^7.8.3",
-            "@babel/plugin-syntax-import-assertions": "^7.18.6",
-            "@babel/plugin-syntax-json-strings": "^7.8.3",
-            "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4",
-            "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3",
-            "@babel/plugin-syntax-numeric-separator": "^7.10.4",
-            "@babel/plugin-syntax-object-rest-spread": "^7.8.3",
-            "@babel/plugin-syntax-optional-catch-binding": "^7.8.3",
-            "@babel/plugin-syntax-optional-chaining": "^7.8.3",
-            "@babel/plugin-syntax-private-property-in-object": "^7.14.5",
-            "@babel/plugin-syntax-top-level-await": "^7.14.5",
-            "@babel/plugin-transform-arrow-functions": "^7.18.6",
-            "@babel/plugin-transform-async-to-generator": "^7.18.6",
-            "@babel/plugin-transform-block-scoped-functions": "^7.18.6",
-            "@babel/plugin-transform-block-scoping": "^7.18.9",
-            "@babel/plugin-transform-classes": "^7.18.9",
-            "@babel/plugin-transform-computed-properties": "^7.18.9",
-            "@babel/plugin-transform-destructuring": "^7.18.9",
-            "@babel/plugin-transform-dotall-regex": "^7.18.6",
-            "@babel/plugin-transform-duplicate-keys": "^7.18.9",
-            "@babel/plugin-transform-exponentiation-operator": "^7.18.6",
-            "@babel/plugin-transform-for-of": "^7.18.8",
-            "@babel/plugin-transform-function-name": "^7.18.9",
-            "@babel/plugin-transform-literals": "^7.18.9",
-            "@babel/plugin-transform-member-expression-literals": "^7.18.6",
-            "@babel/plugin-transform-modules-amd": "^7.18.6",
-            "@babel/plugin-transform-modules-commonjs": "^7.18.6",
-            "@babel/plugin-transform-modules-systemjs": "^7.18.9",
-            "@babel/plugin-transform-modules-umd": "^7.18.6",
-            "@babel/plugin-transform-named-capturing-groups-regex": "^7.18.6",
-            "@babel/plugin-transform-new-target": "^7.18.6",
-            "@babel/plugin-transform-object-super": "^7.18.6",
-            "@babel/plugin-transform-parameters": "^7.18.8",
-            "@babel/plugin-transform-property-literals": "^7.18.6",
-            "@babel/plugin-transform-regenerator": "^7.18.6",
-            "@babel/plugin-transform-reserved-words": "^7.18.6",
-            "@babel/plugin-transform-shorthand-properties": "^7.18.6",
-            "@babel/plugin-transform-spread": "^7.18.9",
-            "@babel/plugin-transform-sticky-regex": "^7.18.6",
-            "@babel/plugin-transform-template-literals": "^7.18.9",
-            "@babel/plugin-transform-typeof-symbol": "^7.18.9",
-            "@babel/plugin-transform-unicode-escapes": "^7.18.10",
-            "@babel/plugin-transform-unicode-regex": "^7.18.6",
-            "@babel/preset-modules": "^0.1.5",
-            "@babel/types": "^7.18.10",
-            "babel-plugin-polyfill-corejs2": "^0.3.2",
-            "babel-plugin-polyfill-corejs3": "^0.5.3",
-            "babel-plugin-polyfill-regenerator": "^0.4.0",
-            "core-js-compat": "^3.22.1",
-            "semver": "^6.3.0"
-          }
-        },
-        "@jridgewell/gen-mapping": {
-          "version": "0.1.1",
-          "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.1.1.tgz",
-          "integrity": "sha512-sQXCasFk+U8lWYEe66WxRDOE9PjVz4vSM51fTu3Hw+ClTpUSQb718772vH3pyS5pShp6lvQM7SxgIDXXXmOX7w==",
-          "dev": true,
-          "requires": {
-            "@jridgewell/set-array": "^1.0.0",
-            "@jridgewell/sourcemap-codec": "^1.4.10"
-          }
-        },
-        "babel-plugin-polyfill-corejs2": {
-          "version": "0.3.2",
-          "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.3.2.tgz",
-          "integrity": "sha512-LPnodUl3lS0/4wN3Rb+m+UK8s7lj2jcLRrjho4gLw+OJs+I4bvGXshINesY5xx/apM+biTnQ9reDI8yj+0M5+Q==",
-          "dev": true,
-          "requires": {
-            "@babel/compat-data": "^7.17.7",
-            "@babel/helper-define-polyfill-provider": "^0.3.2",
-            "semver": "^6.1.1"
-          }
-        },
-        "babel-plugin-polyfill-corejs3": {
-          "version": "0.5.3",
-          "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.5.3.tgz",
-          "integrity": "sha512-zKsXDh0XjnrUEW0mxIHLfjBfnXSMr5Q/goMe/fxpQnLm07mcOZiIZHBNWCMx60HmdvjxfXcalac0tfFg0wqxyw==",
-          "dev": true,
-          "requires": {
-            "@babel/helper-define-polyfill-provider": "^0.3.2",
-            "core-js-compat": "^3.21.0"
-          }
-        },
-        "babel-plugin-polyfill-regenerator": {
-          "version": "0.4.0",
-          "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.4.0.tgz",
-          "integrity": "sha512-RW1cnryiADFeHmfLS+WW/G431p1PsW5qdRdz0SDRi7TKcUgc7Oh/uXkT7MZ/+tGsT1BkczEAmD5XjUyJ5SWDTw==",
-          "dev": true,
-          "requires": {
-            "@babel/helper-define-polyfill-provider": "^0.3.2"
-          }
-        },
-        "fs-extra": {
-          "version": "9.1.0",
-          "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz",
-          "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==",
-          "dev": true,
-          "requires": {
-            "at-least-node": "^1.0.0",
-            "graceful-fs": "^4.2.0",
-            "jsonfile": "^6.0.1",
-            "universalify": "^2.0.0"
-          }
-        },
-        "semver": {
-          "version": "6.3.0",
-          "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
-          "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==",
-          "dev": true
-        }
-      }
-    },
-    "@cypress/request": {
-      "version": "2.88.10",
-      "resolved": "https://registry.npmjs.org/@cypress/request/-/request-2.88.10.tgz",
-      "integrity": "sha512-Zp7F+R93N0yZyG34GutyTNr+okam7s/Fzc1+i3kcqOP8vk6OuajuE9qZJ6Rs+10/1JFtXFYMdyarnU1rZuJesg==",
-      "dev": true,
-      "requires": {
-        "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",
-        "http-signature": "~1.3.6",
-        "is-typedarray": "~1.0.0",
-        "isstream": "~0.1.2",
-        "json-stringify-safe": "~5.0.1",
-        "mime-types": "~2.1.19",
-        "performance-now": "^2.1.0",
-        "qs": "~6.5.2",
-        "safe-buffer": "^5.1.2",
-        "tough-cookie": "~2.5.0",
-        "tunnel-agent": "^0.6.0",
-        "uuid": "^8.3.2"
-      },
-      "dependencies": {
         "http-signature": {
           "version": "1.3.6",
           "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.3.6.tgz",
         "http-signature": {
           "version": "1.3.6",
           "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.3.6.tgz",
             "verror": "1.10.0"
           }
         },
             "verror": "1.10.0"
           }
         },
-        "qs": {
-          "version": "6.5.3",
-          "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.3.tgz",
-          "integrity": "sha512-qxXIEh4pCGfHICj1mAJQ2/2XVZkjCDTcEgfoSQxc/fYivUZxTkk7L3bDBJSoNrEzXI17oUO5Dp07ktqE5KzczA==",
+        "punycode": {
+          "version": "2.3.0",
+          "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.0.tgz",
+          "integrity": "sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==",
           "dev": true
           "dev": true
+        },
+        "qs": {
+          "version": "6.10.4",
+          "resolved": "https://registry.npmjs.org/qs/-/qs-6.10.4.tgz",
+          "integrity": "sha512-OQiU+C+Ds5qiH91qh/mg0w+8nwQuLjM4F4M/PbmhDOoYehPh+Fb0bDjtR1sOvy7YKxvj28Y/M0PhP5uVX0kB+g==",
+          "dev": true,
+          "requires": {
+            "side-channel": "^1.0.4"
+          }
+        },
+        "tough-cookie": {
+          "version": "2.5.0",
+          "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz",
+          "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==",
+          "dev": true,
+          "requires": {
+            "psl": "^1.1.28",
+            "punycode": "^2.1.1"
+          }
         }
       }
     },
         }
       }
     },
       }
     },
     "@discoveryjs/json-ext": {
       }
     },
     "@discoveryjs/json-ext": {
-      "version": "0.5.3",
-      "resolved": "https://registry.npmjs.org/@discoveryjs/json-ext/-/json-ext-0.5.3.tgz",
-      "integrity": "sha512-Fxt+AfXgjMoin2maPIYzFZnQjAXjAL0PHscM5pRTtatFqB+vZxAM9tLp2Optnuw3QOQC40jTNeGYFOMvyf7v9g==",
+      "version": "0.5.6",
+      "resolved": "https://registry.npmjs.org/@discoveryjs/json-ext/-/json-ext-0.5.6.tgz",
+      "integrity": "sha512-ws57AidsDvREKrZKYffXddNkyaF14iHNHm8VQnZH6t99E8gczjNN0GpvcGny0imC80yQ0tHz1xVUKk/KFQSUyA==",
       "dev": true
     },
       "dev": true
     },
+    "@esbuild/android-arm": {
+      "version": "0.17.11",
+      "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.17.11.tgz",
+      "integrity": "sha512-CdyX6sRVh1NzFCsf5vw3kULwlAhfy9wVt8SZlrhQ7eL2qBjGbFhRBWkkAzuZm9IIEOCKJw4DXA6R85g+qc8RDw==",
+      "dev": true,
+      "optional": true
+    },
+    "@esbuild/android-arm64": {
+      "version": "0.17.11",
+      "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.17.11.tgz",
+      "integrity": "sha512-QnK4d/zhVTuV4/pRM4HUjcsbl43POALU2zvBynmrrqZt9LPcLA3x1fTZPBg2RRguBQnJcnU059yKr+bydkntjg==",
+      "dev": true,
+      "optional": true
+    },
+    "@esbuild/android-x64": {
+      "version": "0.17.11",
+      "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.17.11.tgz",
+      "integrity": "sha512-3PL3HKtsDIXGQcSCKtWD/dy+mgc4p2Tvo2qKgKHj9Yf+eniwFnuoQ0OUhlSfAEpKAFzF9N21Nwgnap6zy3L3MQ==",
+      "dev": true,
+      "optional": true
+    },
+    "@esbuild/darwin-arm64": {
+      "version": "0.17.11",
+      "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.17.11.tgz",
+      "integrity": "sha512-pJ950bNKgzhkGNO3Z9TeHzIFtEyC2GDQL3wxkMApDEghYx5Qers84UTNc1bAxWbRkuJOgmOha5V0WUeh8G+YGw==",
+      "dev": true,
+      "optional": true
+    },
+    "@esbuild/darwin-x64": {
+      "version": "0.17.11",
+      "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.17.11.tgz",
+      "integrity": "sha512-iB0dQkIHXyczK3BZtzw1tqegf0F0Ab5texX2TvMQjiJIWXAfM4FQl7D909YfXWnB92OQz4ivBYQ2RlxBJrMJOw==",
+      "dev": true,
+      "optional": true
+    },
+    "@esbuild/freebsd-arm64": {
+      "version": "0.17.11",
+      "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.17.11.tgz",
+      "integrity": "sha512-7EFzUADmI1jCHeDRGKgbnF5sDIceZsQGapoO6dmw7r/ZBEKX7CCDnIz8m9yEclzr7mFsd+DyasHzpjfJnmBB1Q==",
+      "dev": true,
+      "optional": true
+    },
+    "@esbuild/freebsd-x64": {
+      "version": "0.17.11",
+      "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.17.11.tgz",
+      "integrity": "sha512-iPgenptC8i8pdvkHQvXJFzc1eVMR7W2lBPrTE6GbhR54sLcF42mk3zBOjKPOodezzuAz/KSu8CPyFSjcBMkE9g==",
+      "dev": true,
+      "optional": true
+    },
+    "@esbuild/linux-arm": {
+      "version": "0.17.11",
+      "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.17.11.tgz",
+      "integrity": "sha512-M9iK/d4lgZH0U5M1R2p2gqhPV/7JPJcRz+8O8GBKVgqndTzydQ7B2XGDbxtbvFkvIs53uXTobOhv+RyaqhUiMg==",
+      "dev": true,
+      "optional": true
+    },
+    "@esbuild/linux-arm64": {
+      "version": "0.17.11",
+      "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.17.11.tgz",
+      "integrity": "sha512-Qxth3gsWWGKz2/qG2d5DsW/57SeA2AmpSMhdg9TSB5Svn2KDob3qxfQSkdnWjSd42kqoxIPy3EJFs+6w1+6Qjg==",
+      "dev": true,
+      "optional": true
+    },
+    "@esbuild/linux-ia32": {
+      "version": "0.17.11",
+      "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.17.11.tgz",
+      "integrity": "sha512-dB1nGaVWtUlb/rRDHmuDQhfqazWE0LMro/AIbT2lWM3CDMHJNpLckH+gCddQyhhcLac2OYw69ikUMO34JLt3wA==",
+      "dev": true,
+      "optional": true
+    },
+    "@esbuild/linux-loong64": {
+      "version": "0.17.11",
+      "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.17.11.tgz",
+      "integrity": "sha512-aCWlq70Q7Nc9WDnormntGS1ar6ZFvUpqr8gXtO+HRejRYPweAFQN615PcgaSJkZjhHp61+MNLhzyVALSF2/Q0g==",
+      "dev": true,
+      "optional": true
+    },
+    "@esbuild/linux-mips64el": {
+      "version": "0.17.11",
+      "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.17.11.tgz",
+      "integrity": "sha512-cGeGNdQxqY8qJwlYH1BP6rjIIiEcrM05H7k3tR7WxOLmD1ZxRMd6/QIOWMb8mD2s2YJFNRuNQ+wjMhgEL2oCEw==",
+      "dev": true,
+      "optional": true
+    },
+    "@esbuild/linux-ppc64": {
+      "version": "0.17.11",
+      "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.17.11.tgz",
+      "integrity": "sha512-BdlziJQPW/bNe0E8eYsHB40mYOluS+jULPCjlWiHzDgr+ZBRXPtgMV1nkLEGdpjrwgmtkZHEGEPaKdS/8faLDA==",
+      "dev": true,
+      "optional": true
+    },
+    "@esbuild/linux-riscv64": {
+      "version": "0.17.11",
+      "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.17.11.tgz",
+      "integrity": "sha512-MDLwQbtF+83oJCI1Cixn68Et/ME6gelmhssPebC40RdJaect+IM+l7o/CuG0ZlDs6tZTEIoxUe53H3GmMn8oMA==",
+      "dev": true,
+      "optional": true
+    },
+    "@esbuild/linux-s390x": {
+      "version": "0.17.11",
+      "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.17.11.tgz",
+      "integrity": "sha512-4N5EMESvws0Ozr2J94VoUD8HIRi7X0uvUv4c0wpTHZyZY9qpaaN7THjosdiW56irQ4qnJ6Lsc+i+5zGWnyqWqQ==",
+      "dev": true,
+      "optional": true
+    },
+    "@esbuild/linux-x64": {
+      "version": "0.17.11",
+      "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.17.11.tgz",
+      "integrity": "sha512-rM/v8UlluxpytFSmVdbCe1yyKQd/e+FmIJE2oPJvbBo+D0XVWi1y/NQ4iTNx+436WmDHQBjVLrbnAQLQ6U7wlw==",
+      "dev": true,
+      "optional": true
+    },
+    "@esbuild/netbsd-x64": {
+      "version": "0.17.11",
+      "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.17.11.tgz",
+      "integrity": "sha512-4WaAhuz5f91h3/g43VBGdto1Q+X7VEZfpcWGtOFXnggEuLvjV+cP6DyLRU15IjiU9fKLLk41OoJfBFN5DhPvag==",
+      "dev": true,
+      "optional": true
+    },
+    "@esbuild/openbsd-x64": {
+      "version": "0.17.11",
+      "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.17.11.tgz",
+      "integrity": "sha512-UBj135Nx4FpnvtE+C8TWGp98oUgBcmNmdYgl5ToKc0mBHxVVqVE7FUS5/ELMImOp205qDAittL6Ezhasc2Ev/w==",
+      "dev": true,
+      "optional": true
+    },
+    "@esbuild/sunos-x64": {
+      "version": "0.17.11",
+      "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.17.11.tgz",
+      "integrity": "sha512-1/gxTifDC9aXbV2xOfCbOceh5AlIidUrPsMpivgzo8P8zUtczlq1ncFpeN1ZyQJ9lVs2hILy1PG5KPp+w8QPPg==",
+      "dev": true,
+      "optional": true
+    },
+    "@esbuild/win32-arm64": {
+      "version": "0.17.11",
+      "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.17.11.tgz",
+      "integrity": "sha512-vtSfyx5yRdpiOW9yp6Ax0zyNOv9HjOAw8WaZg3dF5djEHKKm3UnoohftVvIJtRh0Ec7Hso0RIdTqZvPXJ7FdvQ==",
+      "dev": true,
+      "optional": true
+    },
+    "@esbuild/win32-ia32": {
+      "version": "0.17.11",
+      "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.17.11.tgz",
+      "integrity": "sha512-GFPSLEGQr4wHFTiIUJQrnJKZhZjjq4Sphf+mM76nQR6WkQn73vm7IsacmBRPkALfpOCHsopSvLgqdd4iUW2mYw==",
+      "dev": true,
+      "optional": true
+    },
+    "@esbuild/win32-x64": {
+      "version": "0.17.11",
+      "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.17.11.tgz",
+      "integrity": "sha512-N9vXqLP3eRL8BqSy8yn4Y98cZI2pZ8fyuHx6lKjiG2WABpT2l01TXdzq5Ma2ZUBzfB7tx5dXVhge8X9u0S70ZQ==",
+      "dev": true,
+      "optional": true
+    },
+    "@eslint/eslintrc": {
+      "version": "1.4.1",
+      "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-1.4.1.tgz",
+      "integrity": "sha512-XXrH9Uarn0stsyldqDYq8r++mROmWRI1xKMXa640Bb//SY1+ECYX6VzT6Lcx5frD0V30XieqJ0oX9I2Xj5aoMA==",
+      "dev": true,
+      "requires": {
+        "ajv": "^6.12.4",
+        "debug": "^4.3.2",
+        "espree": "^9.4.0",
+        "globals": "^13.19.0",
+        "ignore": "^5.2.0",
+        "import-fresh": "^3.2.1",
+        "js-yaml": "^4.1.0",
+        "minimatch": "^3.1.2",
+        "strip-json-comments": "^3.1.1"
+      },
+      "dependencies": {
+        "ajv": {
+          "version": "6.12.6",
+          "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz",
+          "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==",
+          "dev": true,
+          "requires": {
+            "fast-deep-equal": "^3.1.1",
+            "fast-json-stable-stringify": "^2.0.0",
+            "json-schema-traverse": "^0.4.1",
+            "uri-js": "^4.2.2"
+          }
+        },
+        "globals": {
+          "version": "13.20.0",
+          "resolved": "https://registry.npmjs.org/globals/-/globals-13.20.0.tgz",
+          "integrity": "sha512-Qg5QtVkCy/kv3FUSlu4ukeZDVf9ee0iXLAUYX13gbR17bnejFTzr4iS9bY7kwCf1NztRNm1t91fjOiyx4CSwPQ==",
+          "dev": true,
+          "requires": {
+            "type-fest": "^0.20.2"
+          }
+        },
+        "json-schema-traverse": {
+          "version": "0.4.1",
+          "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz",
+          "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==",
+          "dev": true
+        },
+        "strip-json-comments": {
+          "version": "3.1.1",
+          "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz",
+          "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==",
+          "dev": true
+        }
+      }
+    },
     "@foliojs-fork/fontkit": {
       "version": "1.9.1",
       "resolved": "https://registry.npmjs.org/@foliojs-fork/fontkit/-/fontkit-1.9.1.tgz",
     "@foliojs-fork/fontkit": {
       "version": "1.9.1",
       "resolved": "https://registry.npmjs.org/@foliojs-fork/fontkit/-/fontkit-1.9.1.tgz",
       "integrity": "sha512-59SgoZ3EXbkfSX7b63tsou/SDGzwUEK6MuB5sKqgVK1/XE0fxmpsOb9DQI8LXW3KfGnAjImCGhhEb7uPPAUVNA==",
       "dev": true
     },
       "integrity": "sha512-59SgoZ3EXbkfSX7b63tsou/SDGzwUEK6MuB5sKqgVK1/XE0fxmpsOb9DQI8LXW3KfGnAjImCGhhEb7uPPAUVNA==",
       "dev": true
     },
+    "@gar/promisify": {
+      "version": "1.1.3",
+      "resolved": "https://registry.npmjs.org/@gar/promisify/-/promisify-1.1.3.tgz",
+      "integrity": "sha512-k2Ty1JcVojjJFwrg/ThKi2ujJ7XNLYaFGNB/bWT9wGR+oSMJHMa5w+CUq6p/pVrKeNNgA7pCqEcjSnHVoqJQFw==",
+      "dev": true
+    },
     "@grafana/e2e": {
       "version": "8.4.5",
       "resolved": "https://registry.npmjs.org/@grafana/e2e/-/e2e-8.4.5.tgz",
     "@grafana/e2e": {
       "version": "8.4.5",
       "resolved": "https://registry.npmjs.org/@grafana/e2e/-/e2e-8.4.5.tgz",
             "source-map": "^0.5.0"
           }
         },
             "source-map": "^0.5.0"
           }
         },
-        "@babel/helper-define-polyfill-provider": {
-          "version": "0.3.2",
-          "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.3.2.tgz",
-          "integrity": "sha512-r9QJJ+uDWrd+94BSPcP6/de67ygLtvVy6cK4luE6MOuDsZIdoaPBnfSpbO/+LTifjPckbKXRuI9BB/Z2/y3iTg==",
-          "dev": true,
-          "requires": {
-            "@babel/helper-compilation-targets": "^7.17.7",
-            "@babel/helper-plugin-utils": "^7.16.7",
-            "debug": "^4.1.1",
-            "lodash.debounce": "^4.0.8",
-            "resolve": "^1.14.2",
-            "semver": "^6.1.2"
-          }
-        },
-        "@babel/plugin-proposal-async-generator-functions": {
-          "version": "7.18.10",
-          "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.18.10.tgz",
-          "integrity": "sha512-1mFuY2TOsR1hxbjCo4QL+qlIjV07p4H4EUYw2J/WCqsvFV6V9X9z9YhXbWndc/4fw+hYGlDT7egYxliMp5O6Ew==",
-          "dev": true,
-          "requires": {
-            "@babel/helper-environment-visitor": "^7.18.9",
-            "@babel/helper-plugin-utils": "^7.18.9",
-            "@babel/helper-remap-async-to-generator": "^7.18.9",
-            "@babel/plugin-syntax-async-generators": "^7.8.4"
-          }
-        },
-        "@babel/plugin-transform-async-to-generator": {
-          "version": "7.18.6",
-          "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.18.6.tgz",
-          "integrity": "sha512-ARE5wZLKnTgPW7/1ftQmSi1CmkqqHo2DNmtztFhvgtOWSDfq0Cq9/9L+KnZNYSNrydBekhW3rwShduf59RoXag==",
-          "dev": true,
-          "requires": {
-            "@babel/helper-module-imports": "^7.18.6",
-            "@babel/helper-plugin-utils": "^7.18.6",
-            "@babel/helper-remap-async-to-generator": "^7.18.6"
-          }
-        },
         "@babel/preset-env": {
           "version": "7.16.7",
           "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.16.7.tgz",
         "@babel/preset-env": {
           "version": "7.16.7",
           "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.16.7.tgz",
           }
         },
         "@types/node": {
           }
         },
         "@types/node": {
-          "version": "14.18.25",
-          "resolved": "https://registry.npmjs.org/@types/node/-/node-14.18.25.tgz",
-          "integrity": "sha512-9pLfceRSrKIsv/MISN6RoFWTIzka36Uk2Uuf5a8cHyDYhEgl5Hm5dXoe621KULeBjt+cFsY18mILsWWtJeG80w==",
+          "version": "14.18.37",
+          "resolved": "https://registry.npmjs.org/@types/node/-/node-14.18.37.tgz",
+          "integrity": "sha512-7GgtHCs/QZrBrDzgIJnQtuSvhFSwhyYSI2uafSwZoNt1iOGhEN5fwNrQMjtONyHm9+/LoA4453jH0CMYcr06Pg==",
           "dev": true
         },
         "ansi-styles": {
           "dev": true
         },
         "ansi-styles": {
             "schema-utils": "^2.6.5"
           }
         },
             "schema-utils": "^2.6.5"
           }
         },
-        "babel-plugin-polyfill-corejs2": {
-          "version": "0.3.2",
-          "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.3.2.tgz",
-          "integrity": "sha512-LPnodUl3lS0/4wN3Rb+m+UK8s7lj2jcLRrjho4gLw+OJs+I4bvGXshINesY5xx/apM+biTnQ9reDI8yj+0M5+Q==",
-          "dev": true,
-          "requires": {
-            "@babel/compat-data": "^7.17.7",
-            "@babel/helper-define-polyfill-provider": "^0.3.2",
-            "semver": "^6.1.1"
-          }
-        },
         "babel-plugin-polyfill-corejs3": {
           "version": "0.4.0",
           "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.4.0.tgz",
         "babel-plugin-polyfill-corejs3": {
           "version": "0.4.0",
           "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.4.0.tgz",
             "core-js-compat": "^3.18.0"
           }
         },
             "core-js-compat": "^3.18.0"
           }
         },
-        "babel-plugin-polyfill-regenerator": {
-          "version": "0.3.1",
-          "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.3.1.tgz",
-          "integrity": "sha512-Y2B06tvgHYt1x0yz17jGkGeeMr5FeKUu+ASJ+N6nB5lQ8Dapfg42i0OVrf8PNGJ3zKL4A23snMi1IRwrqqND7A==",
-          "dev": true,
-          "requires": {
-            "@babel/helper-define-polyfill-provider": "^0.3.1"
-          }
-        },
         "chalk": {
           "version": "4.1.2",
           "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
         "chalk": {
           "version": "4.1.2",
           "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
           "integrity": "sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==",
           "dev": true
         },
           "integrity": "sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==",
           "dev": true
         },
-        "cross-spawn": {
-          "version": "7.0.3",
-          "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz",
-          "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==",
-          "dev": true,
-          "requires": {
-            "path-key": "^3.1.0",
-            "shebang-command": "^2.0.0",
-            "which": "^2.0.1"
-          }
-        },
         "cypress": {
           "version": "9.3.1",
           "resolved": "https://registry.npmjs.org/cypress/-/cypress-9.3.1.tgz",
         "cypress": {
           "version": "9.3.1",
           "resolved": "https://registry.npmjs.org/cypress/-/cypress-9.3.1.tgz",
             }
           }
         },
             }
           }
         },
-        "execa": {
-          "version": "5.1.1",
-          "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz",
-          "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==",
-          "dev": true,
-          "requires": {
-            "cross-spawn": "^7.0.3",
-            "get-stream": "^6.0.0",
-            "human-signals": "^2.1.0",
-            "is-stream": "^2.0.0",
-            "merge-stream": "^2.0.0",
-            "npm-run-path": "^4.0.1",
-            "onetime": "^5.1.2",
-            "signal-exit": "^3.0.3",
-            "strip-final-newline": "^2.0.0"
-          },
-          "dependencies": {
-            "get-stream": {
-              "version": "6.0.1",
-              "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz",
-              "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==",
-              "dev": true
-            },
-            "human-signals": {
-              "version": "2.1.0",
-              "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz",
-              "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==",
-              "dev": true
-            }
-          }
-        },
-        "fs-extra": {
-          "version": "9.1.0",
-          "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz",
-          "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==",
-          "dev": true,
-          "requires": {
-            "at-least-node": "^1.0.0",
-            "graceful-fs": "^4.2.0",
-            "jsonfile": "^6.0.1",
-            "universalify": "^2.0.0"
-          }
-        },
         "get-stream": {
           "version": "5.2.0",
           "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz",
         "get-stream": {
           "version": "5.2.0",
           "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz",
           "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
           "dev": true
         },
           "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
           "dev": true
         },
-        "is-stream": {
-          "version": "2.0.1",
-          "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz",
-          "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==",
+        "human-signals": {
+          "version": "1.1.1",
+          "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-1.1.1.tgz",
+          "integrity": "sha512-SEQu7vl8KjNL2eoGBLF3+wAjpsNfA9XMlXAYj/3EdaNfAlxKthD1xjEQfGOUhllCGGJVNY34bRr6lPINhNjyZw==",
           "dev": true
         },
         "loader-utils": {
           "dev": true
         },
         "loader-utils": {
-          "version": "1.4.0",
-          "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.0.tgz",
-          "integrity": "sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA==",
+          "version": "1.4.2",
+          "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.2.tgz",
+          "integrity": "sha512-I5d00Pd/jwMD2QCduo657+YM/6L3KZu++pmX9VFncxaxvHcru9jx1lBaFft+r4Mt2jK0Yhp41XlRAihzPxHNCg==",
           "dev": true,
           "requires": {
             "big.js": "^5.2.2",
           "dev": true,
           "requires": {
             "big.js": "^5.2.2",
           },
           "dependencies": {
             "json5": {
           },
           "dependencies": {
             "json5": {
-              "version": "1.0.1",
-              "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz",
-              "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==",
+              "version": "1.0.2",
+              "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz",
+              "integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==",
               "dev": true,
               "requires": {
                 "minimist": "^1.2.0"
               "dev": true,
               "requires": {
                 "minimist": "^1.2.0"
             }
           }
         },
             }
           }
         },
-        "npm-run-path": {
-          "version": "4.0.1",
-          "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz",
-          "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==",
-          "dev": true,
-          "requires": {
-            "path-key": "^3.0.0"
-          }
-        },
-        "path-key": {
-          "version": "3.1.1",
-          "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz",
-          "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==",
-          "dev": true
-        },
-        "semver": {
-          "version": "6.3.0",
-          "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
-          "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==",
+        "proxy-from-env": {
+          "version": "1.0.0",
+          "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.0.0.tgz",
+          "integrity": "sha512-F2JHgJQ1iqwnHDcQjVBsq3n/uoaFL+iPW/eAeL7kVxy/2RrWaN4WroKjjvbsoRtv0ftelNyC01bjRhn/bhcf4A==",
           "dev": true
         },
           "dev": true
         },
-        "shebang-command": {
-          "version": "2.0.0",
-          "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz",
-          "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==",
-          "dev": true,
-          "requires": {
-            "shebang-regex": "^3.0.0"
-          }
-        },
-        "shebang-regex": {
-          "version": "3.0.0",
-          "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz",
-          "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==",
+        "source-map": {
+          "version": "0.5.7",
+          "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz",
+          "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==",
           "dev": true
         },
         "supports-color": {
           "dev": true
         },
         "supports-color": {
           "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.4.4.tgz",
           "integrity": "sha512-DqGhF5IKoBl8WNf8C1gu8q0xZSInh9j1kJJMqT3a94w1JzVaBU4EXOSMrz9yDqMT0xt3selp83fuFMQ0uzv6qA==",
           "dev": true
           "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.4.4.tgz",
           "integrity": "sha512-DqGhF5IKoBl8WNf8C1gu8q0xZSInh9j1kJJMqT3a94w1JzVaBU4EXOSMrz9yDqMT0xt3selp83fuFMQ0uzv6qA==",
           "dev": true
-        },
-        "which": {
-          "version": "2.0.2",
-          "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz",
-          "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==",
-          "dev": true,
-          "requires": {
-            "isexe": "^2.0.0"
-          }
         }
       }
     },
         }
       }
     },
         "@hapi/hoek": "^9.0.0"
       }
     },
         "@hapi/hoek": "^9.0.0"
       }
     },
+    "@humanwhocodes/config-array": {
+      "version": "0.9.5",
+      "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.9.5.tgz",
+      "integrity": "sha512-ObyMyWxZiCu/yTisA7uzx81s40xR2fD5Cg/2Kq7G02ajkNubJf6BopgDTmDyc3U7sXpNKM8cYOw7s7Tyr+DnCw==",
+      "dev": true,
+      "requires": {
+        "@humanwhocodes/object-schema": "^1.2.1",
+        "debug": "^4.1.1",
+        "minimatch": "^3.0.4"
+      }
+    },
+    "@humanwhocodes/object-schema": {
+      "version": "1.2.1",
+      "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz",
+      "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==",
+      "dev": true
+    },
     "@istanbuljs/load-nyc-config": {
       "version": "1.1.0",
       "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz",
     "@istanbuljs/load-nyc-config": {
       "version": "1.1.0",
       "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz",
             "argparse": "^1.0.7",
             "esprima": "^4.0.0"
           }
             "argparse": "^1.0.7",
             "esprima": "^4.0.0"
           }
-        },
-        "resolve-from": {
-          "version": "5.0.0",
-          "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz",
-          "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==",
-          "dev": true
         }
       }
     },
         }
       }
     },
       "dev": true
     },
     "@jest/console": {
       "dev": true
     },
     "@jest/console": {
-      "version": "26.6.2",
-      "resolved": "https://registry.npmjs.org/@jest/console/-/console-26.6.2.tgz",
-      "integrity": "sha512-IY1R2i2aLsLr7Id3S6p2BA82GNWryt4oSvEXLAKc+L2zdi89dSkE8xC1C+0kpATG4JhBJREnQOH7/zmccM2B0g==",
+      "version": "28.1.3",
+      "resolved": "https://registry.npmjs.org/@jest/console/-/console-28.1.3.tgz",
+      "integrity": "sha512-QPAkP5EwKdK/bxIr6C1I4Vs0rm2nHiANzj/Z5X2JQkrZo6IqvC4ldZ9K95tF0HdidhA8Bo6egxSzUFPYKcEXLw==",
       "dev": true,
       "requires": {
       "dev": true,
       "requires": {
-        "@jest/types": "^26.6.2",
+        "@jest/types": "^28.1.3",
         "@types/node": "*",
         "chalk": "^4.0.0",
         "@types/node": "*",
         "chalk": "^4.0.0",
-        "jest-message-util": "^26.6.2",
-        "jest-util": "^26.6.2",
+        "jest-message-util": "^28.1.3",
+        "jest-util": "^28.1.3",
         "slash": "^3.0.0"
       },
       "dependencies": {
         "slash": "^3.0.0"
       },
       "dependencies": {
-        "@jest/types": {
-          "version": "26.6.2",
-          "resolved": "https://registry.npmjs.org/@jest/types/-/types-26.6.2.tgz",
-          "integrity": "sha512-fC6QCp7Sc5sX6g8Tvbmj4XUTbyrik0akgRy03yjXbQaBWWNWGE7SGtJk98m0N8nzegD/7SggrUlivxo5ax4KWQ==",
-          "dev": true,
-          "requires": {
-            "@types/istanbul-lib-coverage": "^2.0.0",
-            "@types/istanbul-reports": "^3.0.0",
-            "@types/node": "*",
-            "@types/yargs": "^15.0.0",
-            "chalk": "^4.0.0"
-          }
-        },
-        "@types/istanbul-reports": {
-          "version": "3.0.1",
-          "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.1.tgz",
-          "integrity": "sha512-c3mAZEuK0lvBp8tmuL74XRKn1+y2dcwOUpH7x4WrF6gk1GIgiluDRgMYQtw2OFcBvAJWlt6ASU3tSqxp0Uu0Aw==",
-          "dev": true,
-          "requires": {
-            "@types/istanbul-lib-report": "*"
-          }
-        },
         "ansi-styles": {
           "version": "4.3.0",
           "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
         "ansi-styles": {
           "version": "4.3.0",
           "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
           "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
           "dev": true
         },
           "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
           "dev": true
         },
+        "slash": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz",
+          "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==",
+          "dev": true
+        },
         "supports-color": {
           "version": "7.2.0",
           "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
         "supports-color": {
           "version": "7.2.0",
           "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
       }
     },
     "@jest/core": {
       }
     },
     "@jest/core": {
-      "version": "26.6.3",
-      "resolved": "https://registry.npmjs.org/@jest/core/-/core-26.6.3.tgz",
-      "integrity": "sha512-xvV1kKbhfUqFVuZ8Cyo+JPpipAHHAV3kcDBftiduK8EICXmTFddryy3P7NfZt8Pv37rA9nEJBKCCkglCPt/Xjw==",
+      "version": "28.1.3",
+      "resolved": "https://registry.npmjs.org/@jest/core/-/core-28.1.3.tgz",
+      "integrity": "sha512-CIKBrlaKOzA7YG19BEqCw3SLIsEwjZkeJzf5bdooVnW4bH5cktqe3JX+G2YV1aK5vP8N9na1IGWFzYaTp6k6NA==",
       "dev": true,
       "requires": {
       "dev": true,
       "requires": {
-        "@jest/console": "^26.6.2",
-        "@jest/reporters": "^26.6.2",
-        "@jest/test-result": "^26.6.2",
-        "@jest/transform": "^26.6.2",
-        "@jest/types": "^26.6.2",
+        "@jest/console": "^28.1.3",
+        "@jest/reporters": "^28.1.3",
+        "@jest/test-result": "^28.1.3",
+        "@jest/transform": "^28.1.3",
+        "@jest/types": "^28.1.3",
         "@types/node": "*",
         "ansi-escapes": "^4.2.1",
         "chalk": "^4.0.0",
         "@types/node": "*",
         "ansi-escapes": "^4.2.1",
         "chalk": "^4.0.0",
+        "ci-info": "^3.2.0",
         "exit": "^0.1.2",
         "exit": "^0.1.2",
-        "graceful-fs": "^4.2.4",
-        "jest-changed-files": "^26.6.2",
-        "jest-config": "^26.6.3",
-        "jest-haste-map": "^26.6.2",
-        "jest-message-util": "^26.6.2",
-        "jest-regex-util": "^26.0.0",
-        "jest-resolve": "^26.6.2",
-        "jest-resolve-dependencies": "^26.6.3",
-        "jest-runner": "^26.6.3",
-        "jest-runtime": "^26.6.3",
-        "jest-snapshot": "^26.6.2",
-        "jest-util": "^26.6.2",
-        "jest-validate": "^26.6.2",
-        "jest-watcher": "^26.6.2",
-        "micromatch": "^4.0.2",
-        "p-each-series": "^2.1.0",
+        "graceful-fs": "^4.2.9",
+        "jest-changed-files": "^28.1.3",
+        "jest-config": "^28.1.3",
+        "jest-haste-map": "^28.1.3",
+        "jest-message-util": "^28.1.3",
+        "jest-regex-util": "^28.0.2",
+        "jest-resolve": "^28.1.3",
+        "jest-resolve-dependencies": "^28.1.3",
+        "jest-runner": "^28.1.3",
+        "jest-runtime": "^28.1.3",
+        "jest-snapshot": "^28.1.3",
+        "jest-util": "^28.1.3",
+        "jest-validate": "^28.1.3",
+        "jest-watcher": "^28.1.3",
+        "micromatch": "^4.0.4",
+        "pretty-format": "^28.1.3",
         "rimraf": "^3.0.0",
         "slash": "^3.0.0",
         "strip-ansi": "^6.0.0"
       },
       "dependencies": {
         "rimraf": "^3.0.0",
         "slash": "^3.0.0",
         "strip-ansi": "^6.0.0"
       },
       "dependencies": {
-        "@jest/types": {
-          "version": "26.6.2",
-          "resolved": "https://registry.npmjs.org/@jest/types/-/types-26.6.2.tgz",
-          "integrity": "sha512-fC6QCp7Sc5sX6g8Tvbmj4XUTbyrik0akgRy03yjXbQaBWWNWGE7SGtJk98m0N8nzegD/7SggrUlivxo5ax4KWQ==",
-          "dev": true,
-          "requires": {
-            "@types/istanbul-lib-coverage": "^2.0.0",
-            "@types/istanbul-reports": "^3.0.0",
-            "@types/node": "*",
-            "@types/yargs": "^15.0.0",
-            "chalk": "^4.0.0"
-          }
-        },
-        "@types/istanbul-reports": {
-          "version": "3.0.1",
-          "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.1.tgz",
-          "integrity": "sha512-c3mAZEuK0lvBp8tmuL74XRKn1+y2dcwOUpH7x4WrF6gk1GIgiluDRgMYQtw2OFcBvAJWlt6ASU3tSqxp0Uu0Aw==",
-          "dev": true,
-          "requires": {
-            "@types/istanbul-lib-report": "*"
-          }
-        },
         "ansi-styles": {
           "version": "4.3.0",
           "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
         "ansi-styles": {
           "version": "4.3.0",
           "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
           "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
           "dev": true
         },
           "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
           "dev": true
         },
+        "slash": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz",
+          "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==",
+          "dev": true
+        },
         "supports-color": {
           "version": "7.2.0",
           "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
         "supports-color": {
           "version": "7.2.0",
           "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
       }
     },
     "@jest/environment": {
       }
     },
     "@jest/environment": {
-      "version": "26.6.2",
-      "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-26.6.2.tgz",
-      "integrity": "sha512-nFy+fHl28zUrRsCeMB61VDThV1pVTtlEokBRgqPrcT1JNq4yRNIyTHfyht6PqtUvY9IsuLGTrbG8kPXjSZIZwA==",
+      "version": "28.1.3",
+      "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-28.1.3.tgz",
+      "integrity": "sha512-1bf40cMFTEkKyEf585R9Iz1WayDjHoHqvts0XFYEqyKM3cFWDpeMoqKKTAF9LSYQModPUlh8FKptoM2YcMWAXA==",
+      "dev": true,
+      "requires": {
+        "@jest/fake-timers": "^28.1.3",
+        "@jest/types": "^28.1.3",
+        "@types/node": "*",
+        "jest-mock": "^28.1.3"
+      }
+    },
+    "@jest/expect": {
+      "version": "28.1.3",
+      "resolved": "https://registry.npmjs.org/@jest/expect/-/expect-28.1.3.tgz",
+      "integrity": "sha512-lzc8CpUbSoE4dqT0U+g1qODQjBRHPpCPXissXD4mS9+sWQdmmpeJ9zSH1rS1HEkrsMN0fb7nKrJ9giAR1d3wBw==",
+      "dev": true,
+      "requires": {
+        "expect": "^28.1.3",
+        "jest-snapshot": "^28.1.3"
+      }
+    },
+    "@jest/expect-utils": {
+      "version": "28.1.3",
+      "resolved": "https://registry.npmjs.org/@jest/expect-utils/-/expect-utils-28.1.3.tgz",
+      "integrity": "sha512-wvbi9LUrHJLn3NlDW6wF2hvIMtd4JUl2QNVrjq+IBSHirgfrR3o9RnVtxzdEGO2n9JyIWwHnLfby5KzqBGg2YA==",
+      "dev": true,
+      "requires": {
+        "jest-get-type": "^28.0.2"
+      }
+    },
+    "@jest/fake-timers": {
+      "version": "28.1.3",
+      "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-28.1.3.tgz",
+      "integrity": "sha512-D/wOkL2POHv52h+ok5Oj/1gOG9HSywdoPtFsRCUmlCILXNn5eIWmcnd3DIiWlJnpGvQtmajqBP95Ei0EimxfLw==",
+      "dev": true,
+      "requires": {
+        "@jest/types": "^28.1.3",
+        "@sinonjs/fake-timers": "^9.1.2",
+        "@types/node": "*",
+        "jest-message-util": "^28.1.3",
+        "jest-mock": "^28.1.3",
+        "jest-util": "^28.1.3"
+      }
+    },
+    "@jest/globals": {
+      "version": "28.1.3",
+      "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-28.1.3.tgz",
+      "integrity": "sha512-XFU4P4phyryCXu1pbcqMO0GSQcYe1IsalYCDzRNyhetyeyxMcIxa11qPNDpVNLeretItNqEmYYQn1UYz/5x1NA==",
+      "dev": true,
+      "requires": {
+        "@jest/environment": "^28.1.3",
+        "@jest/expect": "^28.1.3",
+        "@jest/types": "^28.1.3"
+      }
+    },
+    "@jest/reporters": {
+      "version": "28.1.3",
+      "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-28.1.3.tgz",
+      "integrity": "sha512-JuAy7wkxQZVNU/V6g9xKzCGC5LVXx9FDcABKsSXp5MiKPEE2144a/vXTEDoyzjUpZKfVwp08Wqg5A4WfTMAzjg==",
       "dev": true,
       "requires": {
       "dev": true,
       "requires": {
-        "@jest/fake-timers": "^26.6.2",
-        "@jest/types": "^26.6.2",
+        "@bcoe/v8-coverage": "^0.2.3",
+        "@jest/console": "^28.1.3",
+        "@jest/test-result": "^28.1.3",
+        "@jest/transform": "^28.1.3",
+        "@jest/types": "^28.1.3",
+        "@jridgewell/trace-mapping": "^0.3.13",
         "@types/node": "*",
         "@types/node": "*",
-        "jest-mock": "^26.6.2"
+        "chalk": "^4.0.0",
+        "collect-v8-coverage": "^1.0.0",
+        "exit": "^0.1.2",
+        "glob": "^7.1.3",
+        "graceful-fs": "^4.2.9",
+        "istanbul-lib-coverage": "^3.0.0",
+        "istanbul-lib-instrument": "^5.1.0",
+        "istanbul-lib-report": "^3.0.0",
+        "istanbul-lib-source-maps": "^4.0.0",
+        "istanbul-reports": "^3.1.3",
+        "jest-message-util": "^28.1.3",
+        "jest-util": "^28.1.3",
+        "jest-worker": "^28.1.3",
+        "slash": "^3.0.0",
+        "string-length": "^4.0.1",
+        "strip-ansi": "^6.0.0",
+        "terminal-link": "^2.0.0",
+        "v8-to-istanbul": "^9.0.1"
       },
       "dependencies": {
       },
       "dependencies": {
-        "@jest/types": {
-          "version": "26.6.2",
-          "resolved": "https://registry.npmjs.org/@jest/types/-/types-26.6.2.tgz",
-          "integrity": "sha512-fC6QCp7Sc5sX6g8Tvbmj4XUTbyrik0akgRy03yjXbQaBWWNWGE7SGtJk98m0N8nzegD/7SggrUlivxo5ax4KWQ==",
-          "dev": true,
-          "requires": {
-            "@types/istanbul-lib-coverage": "^2.0.0",
-            "@types/istanbul-reports": "^3.0.0",
-            "@types/node": "*",
-            "@types/yargs": "^15.0.0",
-            "chalk": "^4.0.0"
-          }
-        },
-        "@types/istanbul-reports": {
-          "version": "3.0.1",
-          "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.1.tgz",
-          "integrity": "sha512-c3mAZEuK0lvBp8tmuL74XRKn1+y2dcwOUpH7x4WrF6gk1GIgiluDRgMYQtw2OFcBvAJWlt6ASU3tSqxp0Uu0Aw==",
-          "dev": true,
-          "requires": {
-            "@types/istanbul-lib-report": "*"
-          }
-        },
         "ansi-styles": {
           "version": "4.3.0",
           "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
         "ansi-styles": {
           "version": "4.3.0",
           "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
           "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
           "dev": true
         },
           "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
           "dev": true
         },
+        "jest-worker": {
+          "version": "28.1.3",
+          "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-28.1.3.tgz",
+          "integrity": "sha512-CqRA220YV/6jCo8VWvAt1KKx6eek1VIHMPeLEbpcfSfkEeWyBNppynM/o6q+Wmw+sOhos2ml34wZbSX3G13//g==",
+          "dev": true,
+          "requires": {
+            "@types/node": "*",
+            "merge-stream": "^2.0.0",
+            "supports-color": "^8.0.0"
+          },
+          "dependencies": {
+            "supports-color": {
+              "version": "8.1.1",
+              "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz",
+              "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==",
+              "dev": true,
+              "requires": {
+                "has-flag": "^4.0.0"
+              }
+            }
+          }
+        },
+        "slash": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz",
+          "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==",
+          "dev": true
+        },
         "supports-color": {
           "version": "7.2.0",
           "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
         "supports-color": {
           "version": "7.2.0",
           "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
         }
       }
     },
         }
       }
     },
-    "@jest/fake-timers": {
-      "version": "26.6.2",
-      "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-26.6.2.tgz",
-      "integrity": "sha512-14Uleatt7jdzefLPYM3KLcnUl1ZNikaKq34enpb5XG9i81JpppDb5muZvonvKyrl7ftEHkKS5L5/eB/kxJ+bvA==",
+    "@jest/schemas": {
+      "version": "28.1.3",
+      "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-28.1.3.tgz",
+      "integrity": "sha512-/l/VWsdt/aBXgjshLWOFyFt3IVdYypu5y2Wn2rOO1un6nkqIn8SLXzgIMYXFyYsRWDyF5EthmKJMIdJvk08grg==",
       "dev": true,
       "requires": {
       "dev": true,
       "requires": {
-        "@jest/types": "^26.6.2",
-        "@sinonjs/fake-timers": "^6.0.1",
-        "@types/node": "*",
-        "jest-message-util": "^26.6.2",
-        "jest-mock": "^26.6.2",
-        "jest-util": "^26.6.2"
+        "@sinclair/typebox": "^0.24.1"
+      }
+    },
+    "@jest/source-map": {
+      "version": "28.1.2",
+      "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-28.1.2.tgz",
+      "integrity": "sha512-cV8Lx3BeStJb8ipPHnqVw/IM2VCMWO3crWZzYodSIkxXnRcXJipCdx1JCK0K5MsJJouZQTH73mzf4vgxRaH9ww==",
+      "dev": true,
+      "requires": {
+        "@jridgewell/trace-mapping": "^0.3.13",
+        "callsites": "^3.0.0",
+        "graceful-fs": "^4.2.9"
+      }
+    },
+    "@jest/test-result": {
+      "version": "28.1.3",
+      "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-28.1.3.tgz",
+      "integrity": "sha512-kZAkxnSE+FqE8YjW8gNuoVkkC9I7S1qmenl8sGcDOLropASP+BkcGKwhXoyqQuGOGeYY0y/ixjrd/iERpEXHNg==",
+      "dev": true,
+      "requires": {
+        "@jest/console": "^28.1.3",
+        "@jest/types": "^28.1.3",
+        "@types/istanbul-lib-coverage": "^2.0.0",
+        "collect-v8-coverage": "^1.0.0"
+      }
+    },
+    "@jest/test-sequencer": {
+      "version": "28.1.3",
+      "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-28.1.3.tgz",
+      "integrity": "sha512-NIMPEqqa59MWnDi1kvXXpYbqsfQmSJsIbnd85mdVGkiDfQ9WQQTXOLsvISUfonmnBT+w85WEgneCigEEdHDFxw==",
+      "dev": true,
+      "requires": {
+        "@jest/test-result": "^28.1.3",
+        "graceful-fs": "^4.2.9",
+        "jest-haste-map": "^28.1.3",
+        "slash": "^3.0.0"
+      },
+      "dependencies": {
+        "slash": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz",
+          "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==",
+          "dev": true
+        }
+      }
+    },
+    "@jest/transform": {
+      "version": "28.1.3",
+      "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-28.1.3.tgz",
+      "integrity": "sha512-u5dT5di+oFI6hfcLOHGTAfmUxFRrjK+vnaP0kkVow9Md/M7V/MxqQMOz/VV25UZO8pzeA9PjfTpOu6BDuwSPQA==",
+      "dev": true,
+      "requires": {
+        "@babel/core": "^7.11.6",
+        "@jest/types": "^28.1.3",
+        "@jridgewell/trace-mapping": "^0.3.13",
+        "babel-plugin-istanbul": "^6.1.1",
+        "chalk": "^4.0.0",
+        "convert-source-map": "^1.4.0",
+        "fast-json-stable-stringify": "^2.0.0",
+        "graceful-fs": "^4.2.9",
+        "jest-haste-map": "^28.1.3",
+        "jest-regex-util": "^28.0.2",
+        "jest-util": "^28.1.3",
+        "micromatch": "^4.0.4",
+        "pirates": "^4.0.4",
+        "slash": "^3.0.0",
+        "write-file-atomic": "^4.0.1"
       },
       "dependencies": {
       },
       "dependencies": {
-        "@jest/types": {
-          "version": "26.6.2",
-          "resolved": "https://registry.npmjs.org/@jest/types/-/types-26.6.2.tgz",
-          "integrity": "sha512-fC6QCp7Sc5sX6g8Tvbmj4XUTbyrik0akgRy03yjXbQaBWWNWGE7SGtJk98m0N8nzegD/7SggrUlivxo5ax4KWQ==",
-          "dev": true,
-          "requires": {
-            "@types/istanbul-lib-coverage": "^2.0.0",
-            "@types/istanbul-reports": "^3.0.0",
-            "@types/node": "*",
-            "@types/yargs": "^15.0.0",
-            "chalk": "^4.0.0"
-          }
-        },
-        "@types/istanbul-reports": {
-          "version": "3.0.1",
-          "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.1.tgz",
-          "integrity": "sha512-c3mAZEuK0lvBp8tmuL74XRKn1+y2dcwOUpH7x4WrF6gk1GIgiluDRgMYQtw2OFcBvAJWlt6ASU3tSqxp0Uu0Aw==",
-          "dev": true,
-          "requires": {
-            "@types/istanbul-lib-report": "*"
-          }
-        },
         "ansi-styles": {
           "version": "4.3.0",
           "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
         "ansi-styles": {
           "version": "4.3.0",
           "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
           "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
           "dev": true
         },
           "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
           "dev": true
         },
+        "slash": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz",
+          "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==",
+          "dev": true
+        },
         "supports-color": {
           "version": "7.2.0",
           "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
         "supports-color": {
           "version": "7.2.0",
           "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
         }
       }
     },
         }
       }
     },
-    "@jest/globals": {
-      "version": "26.6.2",
-      "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-26.6.2.tgz",
-      "integrity": "sha512-85Ltnm7HlB/KesBUuALwQ68YTU72w9H2xW9FjZ1eL1U3lhtefjjl5c2MiUbpXt/i6LaPRvoOFJ22yCBSfQ0JIA==",
+    "@jest/types": {
+      "version": "28.1.3",
+      "resolved": "https://registry.npmjs.org/@jest/types/-/types-28.1.3.tgz",
+      "integrity": "sha512-RyjiyMUZrKz/c+zlMFO1pm70DcIlST8AeWTkoUdZevew44wcNZQHsEVOiCVtgVnlFFD82FPaXycys58cf2muVQ==",
       "dev": true,
       "requires": {
       "dev": true,
       "requires": {
-        "@jest/environment": "^26.6.2",
-        "@jest/types": "^26.6.2",
-        "expect": "^26.6.2"
+        "@jest/schemas": "^28.1.3",
+        "@types/istanbul-lib-coverage": "^2.0.0",
+        "@types/istanbul-reports": "^3.0.0",
+        "@types/node": "*",
+        "@types/yargs": "^17.0.8",
+        "chalk": "^4.0.0"
       },
       "dependencies": {
       },
       "dependencies": {
-        "@jest/types": {
-          "version": "26.6.2",
-          "resolved": "https://registry.npmjs.org/@jest/types/-/types-26.6.2.tgz",
-          "integrity": "sha512-fC6QCp7Sc5sX6g8Tvbmj4XUTbyrik0akgRy03yjXbQaBWWNWGE7SGtJk98m0N8nzegD/7SggrUlivxo5ax4KWQ==",
-          "dev": true,
-          "requires": {
-            "@types/istanbul-lib-coverage": "^2.0.0",
-            "@types/istanbul-reports": "^3.0.0",
-            "@types/node": "*",
-            "@types/yargs": "^15.0.0",
-            "chalk": "^4.0.0"
-          }
-        },
-        "@types/istanbul-reports": {
-          "version": "3.0.1",
-          "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.1.tgz",
-          "integrity": "sha512-c3mAZEuK0lvBp8tmuL74XRKn1+y2dcwOUpH7x4WrF6gk1GIgiluDRgMYQtw2OFcBvAJWlt6ASU3tSqxp0Uu0Aw==",
-          "dev": true,
-          "requires": {
-            "@types/istanbul-lib-report": "*"
-          }
-        },
         "ansi-styles": {
           "version": "4.3.0",
           "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
         "ansi-styles": {
           "version": "4.3.0",
           "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
         }
       }
     },
         }
       }
     },
-    "@jest/reporters": {
-      "version": "26.6.2",
-      "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-26.6.2.tgz",
-      "integrity": "sha512-h2bW53APG4HvkOnVMo8q3QXa6pcaNt1HkwVsOPMBV6LD/q9oSpxNSYZQYkAnjdMjrJ86UuYeLo+aEZClV6opnw==",
+    "@jridgewell/gen-mapping": {
+      "version": "0.1.1",
+      "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.1.1.tgz",
+      "integrity": "sha512-sQXCasFk+U8lWYEe66WxRDOE9PjVz4vSM51fTu3Hw+ClTpUSQb718772vH3pyS5pShp6lvQM7SxgIDXXXmOX7w==",
+      "requires": {
+        "@jridgewell/set-array": "^1.0.0",
+        "@jridgewell/sourcemap-codec": "^1.4.10"
+      }
+    },
+    "@jridgewell/resolve-uri": {
+      "version": "3.1.0",
+      "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz",
+      "integrity": "sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w=="
+    },
+    "@jridgewell/set-array": {
+      "version": "1.1.2",
+      "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz",
+      "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw=="
+    },
+    "@jridgewell/source-map": {
+      "version": "0.3.2",
+      "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.2.tgz",
+      "integrity": "sha512-m7O9o2uR8k2ObDysZYzdfhb08VuEml5oWGiosa1VdaPZ/A6QyPkAJuwN0Q1lhULOf6B7MtQmHENS743hWtCrgw==",
       "dev": true,
       "requires": {
       "dev": true,
       "requires": {
-        "@bcoe/v8-coverage": "^0.2.3",
-        "@jest/console": "^26.6.2",
-        "@jest/test-result": "^26.6.2",
-        "@jest/transform": "^26.6.2",
-        "@jest/types": "^26.6.2",
-        "chalk": "^4.0.0",
-        "collect-v8-coverage": "^1.0.0",
-        "exit": "^0.1.2",
-        "glob": "^7.1.2",
-        "graceful-fs": "^4.2.4",
-        "istanbul-lib-coverage": "^3.0.0",
-        "istanbul-lib-instrument": "^4.0.3",
-        "istanbul-lib-report": "^3.0.0",
-        "istanbul-lib-source-maps": "^4.0.0",
-        "istanbul-reports": "^3.0.2",
-        "jest-haste-map": "^26.6.2",
-        "jest-resolve": "^26.6.2",
-        "jest-util": "^26.6.2",
-        "jest-worker": "^26.6.2",
-        "node-notifier": "^8.0.0",
-        "slash": "^3.0.0",
-        "source-map": "^0.6.0",
-        "string-length": "^4.0.1",
-        "terminal-link": "^2.0.0",
-        "v8-to-istanbul": "^7.0.0"
+        "@jridgewell/gen-mapping": "^0.3.0",
+        "@jridgewell/trace-mapping": "^0.3.9"
       },
       "dependencies": {
       },
       "dependencies": {
-        "@jest/types": {
-          "version": "26.6.2",
-          "resolved": "https://registry.npmjs.org/@jest/types/-/types-26.6.2.tgz",
-          "integrity": "sha512-fC6QCp7Sc5sX6g8Tvbmj4XUTbyrik0akgRy03yjXbQaBWWNWGE7SGtJk98m0N8nzegD/7SggrUlivxo5ax4KWQ==",
+        "@jridgewell/gen-mapping": {
+          "version": "0.3.2",
+          "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz",
+          "integrity": "sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A==",
           "dev": true,
           "requires": {
           "dev": true,
           "requires": {
-            "@types/istanbul-lib-coverage": "^2.0.0",
-            "@types/istanbul-reports": "^3.0.0",
-            "@types/node": "*",
-            "@types/yargs": "^15.0.0",
-            "chalk": "^4.0.0"
+            "@jridgewell/set-array": "^1.0.1",
+            "@jridgewell/sourcemap-codec": "^1.4.10",
+            "@jridgewell/trace-mapping": "^0.3.9"
+          }
+        }
+      }
+    },
+    "@jridgewell/sourcemap-codec": {
+      "version": "1.4.14",
+      "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz",
+      "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw=="
+    },
+    "@jridgewell/trace-mapping": {
+      "version": "0.3.17",
+      "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.17.tgz",
+      "integrity": "sha512-MCNzAp77qzKca9+W/+I0+sEpaUnZoeasnghNeVc41VZCEKaCH73Vq3BZZ/SzWIgrqE4H4ceI+p+b6C0mHf9T4g==",
+      "requires": {
+        "@jridgewell/resolve-uri": "3.1.0",
+        "@jridgewell/sourcemap-codec": "1.4.14"
+      }
+    },
+    "@juggle/resize-observer": {
+      "version": "3.4.0",
+      "resolved": "https://registry.npmjs.org/@juggle/resize-observer/-/resize-observer-3.4.0.tgz",
+      "integrity": "sha512-dfLbk+PwWvFzSxwk3n5ySL0hfBog779o8h68wK/7/APo/7cgyWp5jcXockbxdk5kFRkbeXWm4Fbi9FrdN381sA=="
+    },
+    "@mochajs/json-file-reporter": {
+      "version": "1.3.0",
+      "resolved": "https://registry.npmjs.org/@mochajs/json-file-reporter/-/json-file-reporter-1.3.0.tgz",
+      "integrity": "sha512-evIxpeP8EOixo/T2xh5xYEIzwbEHk8YNJfRUm1KeTs8F3bMjgNn2580Ogze9yisXNlTxu88JiJJYzXjjg5NdLA==",
+      "dev": true
+    },
+    "@ng-bootstrap/ng-bootstrap": {
+      "version": "12.1.2",
+      "resolved": "https://registry.npmjs.org/@ng-bootstrap/ng-bootstrap/-/ng-bootstrap-12.1.2.tgz",
+      "integrity": "sha512-p27c+mYVdHiJMYrj5hwClVJxLdiZxafAqlbw1sdJh2xJ1rGOe+H/kCf5YDRbhlHqRN+34Gr0RQqIUeD1I2V8hg==",
+      "requires": {
+        "tslib": "^2.3.0"
+      }
+    },
+    "@ngtools/webpack": {
+      "version": "13.3.9",
+      "resolved": "https://registry.npmjs.org/@ngtools/webpack/-/webpack-13.3.9.tgz",
+      "integrity": "sha512-wmgOI5sogAuilwBZJqCHVMjm2uhDxjdSmNLFx7eznwGDa6LjvjuATqCv2dVlftq0Y/5oZFVrg5NpyHt5kfZ8Cg==",
+      "dev": true
+    },
+    "@nodelib/fs.scandir": {
+      "version": "2.1.5",
+      "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz",
+      "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==",
+      "dev": true,
+      "requires": {
+        "@nodelib/fs.stat": "2.0.5",
+        "run-parallel": "^1.1.9"
+      }
+    },
+    "@nodelib/fs.stat": {
+      "version": "2.0.5",
+      "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz",
+      "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==",
+      "dev": true
+    },
+    "@nodelib/fs.walk": {
+      "version": "1.2.8",
+      "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz",
+      "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==",
+      "dev": true,
+      "requires": {
+        "@nodelib/fs.scandir": "2.1.5",
+        "fastq": "^1.6.0"
+      }
+    },
+    "@npmcli/fs": {
+      "version": "1.1.1",
+      "resolved": "https://registry.npmjs.org/@npmcli/fs/-/fs-1.1.1.tgz",
+      "integrity": "sha512-8KG5RD0GVP4ydEzRn/I4BNDuxDtqVbOdm8675T49OIG/NGhaK0pjPX7ZcDlvKYbA+ulvVK3ztfcF4uBdOxuJbQ==",
+      "dev": true,
+      "requires": {
+        "@gar/promisify": "^1.0.1",
+        "semver": "^7.3.5"
+      },
+      "dependencies": {
+        "lru-cache": {
+          "version": "6.0.0",
+          "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz",
+          "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==",
+          "dev": true,
+          "requires": {
+            "yallist": "^4.0.0"
           }
         },
           }
         },
-        "@types/istanbul-reports": {
-          "version": "3.0.1",
-          "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.1.tgz",
-          "integrity": "sha512-c3mAZEuK0lvBp8tmuL74XRKn1+y2dcwOUpH7x4WrF6gk1GIgiluDRgMYQtw2OFcBvAJWlt6ASU3tSqxp0Uu0Aw==",
+        "semver": {
+          "version": "7.3.8",
+          "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz",
+          "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==",
+          "dev": true,
+          "requires": {
+            "lru-cache": "^6.0.0"
+          }
+        },
+        "yallist": {
+          "version": "4.0.0",
+          "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
+          "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==",
+          "dev": true
+        }
+      }
+    },
+    "@npmcli/git": {
+      "version": "2.1.0",
+      "resolved": "https://registry.npmjs.org/@npmcli/git/-/git-2.1.0.tgz",
+      "integrity": "sha512-/hBFX/QG1b+N7PZBFs0bi+evgRZcK9nWBxQKZkGoXUT5hJSwl5c4d7y8/hm+NQZRPhQ67RzFaj5UM9YeyKoryw==",
+      "dev": true,
+      "requires": {
+        "@npmcli/promise-spawn": "^1.3.2",
+        "lru-cache": "^6.0.0",
+        "mkdirp": "^1.0.4",
+        "npm-pick-manifest": "^6.1.1",
+        "promise-inflight": "^1.0.1",
+        "promise-retry": "^2.0.1",
+        "semver": "^7.3.5",
+        "which": "^2.0.2"
+      },
+      "dependencies": {
+        "lru-cache": {
+          "version": "6.0.0",
+          "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz",
+          "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==",
+          "dev": true,
+          "requires": {
+            "yallist": "^4.0.0"
+          }
+        },
+        "semver": {
+          "version": "7.3.8",
+          "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz",
+          "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==",
+          "dev": true,
+          "requires": {
+            "lru-cache": "^6.0.0"
+          }
+        },
+        "yallist": {
+          "version": "4.0.0",
+          "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
+          "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==",
+          "dev": true
+        }
+      }
+    },
+    "@npmcli/installed-package-contents": {
+      "version": "1.0.7",
+      "resolved": "https://registry.npmjs.org/@npmcli/installed-package-contents/-/installed-package-contents-1.0.7.tgz",
+      "integrity": "sha512-9rufe0wnJusCQoLpV9ZPKIVP55itrM5BxOXs10DmdbRfgWtHy1LDyskbwRnBghuB0PrF7pNPOqREVtpz4HqzKw==",
+      "dev": true,
+      "requires": {
+        "npm-bundled": "^1.1.1",
+        "npm-normalize-package-bin": "^1.0.1"
+      }
+    },
+    "@npmcli/move-file": {
+      "version": "1.1.2",
+      "resolved": "https://registry.npmjs.org/@npmcli/move-file/-/move-file-1.1.2.tgz",
+      "integrity": "sha512-1SUf/Cg2GzGDyaf15aR9St9TWlb+XvbZXWpDx8YKs7MLzMH/BCeopv+y9vzrzgkfykCGuWOlSu3mZhj2+FQcrg==",
+      "dev": true,
+      "requires": {
+        "mkdirp": "^1.0.4",
+        "rimraf": "^3.0.2"
+      }
+    },
+    "@npmcli/node-gyp": {
+      "version": "1.0.3",
+      "resolved": "https://registry.npmjs.org/@npmcli/node-gyp/-/node-gyp-1.0.3.tgz",
+      "integrity": "sha512-fnkhw+fmX65kiLqk6E3BFLXNC26rUhK90zVwe2yncPliVT/Qos3xjhTLE59Df8KnPlcwIERXKVlU1bXoUQ+liA==",
+      "dev": true
+    },
+    "@npmcli/promise-spawn": {
+      "version": "1.3.2",
+      "resolved": "https://registry.npmjs.org/@npmcli/promise-spawn/-/promise-spawn-1.3.2.tgz",
+      "integrity": "sha512-QyAGYo/Fbj4MXeGdJcFzZ+FkDkomfRBrPM+9QYJSg+PxgAUL+LU3FneQk37rKR2/zjqkCV1BLHccX98wRXG3Sg==",
+      "dev": true,
+      "requires": {
+        "infer-owner": "^1.0.4"
+      }
+    },
+    "@npmcli/run-script": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/@npmcli/run-script/-/run-script-2.0.0.tgz",
+      "integrity": "sha512-fSan/Pu11xS/TdaTpTB0MRn9guwGU8dye+x56mEVgBEd/QsybBbYcAL0phPXi8SGWFEChkQd6M9qL4y6VOpFig==",
+      "dev": true,
+      "requires": {
+        "@npmcli/node-gyp": "^1.0.2",
+        "@npmcli/promise-spawn": "^1.3.2",
+        "node-gyp": "^8.2.0",
+        "read-package-json-fast": "^2.0.1"
+      }
+    },
+    "@nrwl/cli": {
+      "version": "15.8.5",
+      "resolved": "https://registry.npmjs.org/@nrwl/cli/-/cli-15.8.5.tgz",
+      "integrity": "sha512-voy16nUO1MxRMRqCpLlhDB9U4KyPfGHZABXtfMEIQk+W3alncatFMMSVvMQZmi8HXwubM8LxWSOnPtTtOCKBrQ==",
+      "dev": true,
+      "requires": {
+        "nx": "15.8.5"
+      },
+      "dependencies": {
+        "@nrwl/tao": {
+          "version": "15.8.5",
+          "resolved": "https://registry.npmjs.org/@nrwl/tao/-/tao-15.8.5.tgz",
+          "integrity": "sha512-pb/hUprOOv2vgvbevGz9hiu8LLOtK7KKuBe4JLSXrFxfHEQjMFsK/2aymnts0ZQrA83QlIG2Mr0tuSKj6/iWvg==",
+          "dev": true,
+          "requires": {
+            "nx": "15.8.5"
+          }
+        },
+        "@zkochan/js-yaml": {
+          "version": "0.0.6",
+          "resolved": "https://registry.npmjs.org/@zkochan/js-yaml/-/js-yaml-0.0.6.tgz",
+          "integrity": "sha512-nzvgl3VfhcELQ8LyVrYOru+UtAy1nrygk2+AGbTm8a5YcO6o8lSjAT+pfg3vJWxIoZKOUhrK6UU7xW/+00kQrg==",
           "dev": true,
           "requires": {
           "dev": true,
           "requires": {
-            "@types/istanbul-lib-report": "*"
+            "argparse": "^2.0.1"
           }
         },
         "ansi-styles": {
           }
         },
         "ansi-styles": {
             "supports-color": "^7.1.0"
           }
         },
             "supports-color": "^7.1.0"
           }
         },
+        "cli-spinners": {
+          "version": "2.6.1",
+          "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.6.1.tgz",
+          "integrity": "sha512-x/5fWmGMnbKQAaNwN+UZlV79qBLM9JFnJuJ03gIi5whrob0xV0ofNVHy9DhwGdsMJQc2OKv0oGmLzvaqvAVv+g==",
+          "dev": true
+        },
+        "cliui": {
+          "version": "7.0.4",
+          "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz",
+          "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==",
+          "dev": true,
+          "requires": {
+            "string-width": "^4.2.0",
+            "strip-ansi": "^6.0.0",
+            "wrap-ansi": "^7.0.0"
+          }
+        },
         "color-convert": {
           "version": "2.0.1",
           "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
         "color-convert": {
           "version": "2.0.1",
           "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
           "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
           "dev": true
         },
           "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
           "dev": true
         },
-        "has-flag": {
-          "version": "4.0.0",
-          "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
-          "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
-          "dev": true
+        "fast-glob": {
+          "version": "3.2.7",
+          "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.7.tgz",
+          "integrity": "sha512-rYGMRwip6lUMvYD3BTScMwT1HtAs2d71SMv66Vrxs0IekGZEjhM0pcMfjQPnknBt2zeCwQMEupiN02ZP4DiT1Q==",
+          "dev": true,
+          "requires": {
+            "@nodelib/fs.stat": "^2.0.2",
+            "@nodelib/fs.walk": "^1.2.3",
+            "glob-parent": "^5.1.2",
+            "merge2": "^1.3.0",
+            "micromatch": "^4.0.4"
+          }
         },
         },
-        "jest-worker": {
-          "version": "26.6.2",
-          "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-26.6.2.tgz",
-          "integrity": "sha512-KWYVV1c4i+jbMpaBC+U++4Va0cp8OisU185o73T1vo99hqi7w8tSJfUXYswwqqrjzwxa6KpRK54WhPvwf5w6PQ==",
+        "fs-extra": {
+          "version": "11.1.0",
+          "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.1.0.tgz",
+          "integrity": "sha512-0rcTq621PD5jM/e0a3EJoGC/1TC5ZBCERW82LQuwfGnCa1V8w7dpYH1yNu+SLb6E5dkeCBzKEyLGlFrnr+dUyw==",
           "dev": true,
           "requires": {
           "dev": true,
           "requires": {
-            "@types/node": "*",
-            "merge-stream": "^2.0.0",
-            "supports-color": "^7.0.0"
+            "graceful-fs": "^4.2.0",
+            "jsonfile": "^6.0.1",
+            "universalify": "^2.0.0"
           }
         },
           }
         },
-        "source-map": {
-          "version": "0.6.1",
-          "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
-          "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
-          "dev": true
-        },
-        "supports-color": {
-          "version": "7.2.0",
-          "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
-          "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
+        "glob": {
+          "version": "7.1.4",
+          "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.4.tgz",
+          "integrity": "sha512-hkLPepehmnKk41pUGm3sYxoFs/umurYfYJCerbXEyFIWcAzvpipAgVkBqqT9RBKMGjnq6kMuyYwha6csxbiM1A==",
           "dev": true,
           "requires": {
           "dev": true,
           "requires": {
-            "has-flag": "^4.0.0"
+            "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"
           }
           }
-        }
-      }
-    },
-    "@jest/source-map": {
-      "version": "26.6.2",
-      "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-26.6.2.tgz",
-      "integrity": "sha512-YwYcCwAnNmOVsZ8mr3GfnzdXDAl4LaenZP5z+G0c8bzC9/dugL8zRmxZzdoTl4IaS3CryS1uWnROLPFmb6lVvA==",
-      "dev": true,
-      "requires": {
-        "callsites": "^3.0.0",
-        "graceful-fs": "^4.2.4",
-        "source-map": "^0.6.0"
-      },
-      "dependencies": {
-        "source-map": {
-          "version": "0.6.1",
-          "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
-          "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
-          "dev": true
-        }
-      }
-    },
-    "@jest/test-result": {
-      "version": "26.6.2",
-      "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-26.6.2.tgz",
-      "integrity": "sha512-5O7H5c/7YlojphYNrK02LlDIV2GNPYisKwHm2QTKjNZeEzezCbwYs9swJySv2UfPMyZ0VdsmMv7jIlD/IKYQpQ==",
-      "dev": true,
-      "requires": {
-        "@jest/console": "^26.6.2",
-        "@jest/types": "^26.6.2",
-        "@types/istanbul-lib-coverage": "^2.0.0",
-        "collect-v8-coverage": "^1.0.0"
-      },
-      "dependencies": {
-        "@jest/types": {
-          "version": "26.6.2",
-          "resolved": "https://registry.npmjs.org/@jest/types/-/types-26.6.2.tgz",
-          "integrity": "sha512-fC6QCp7Sc5sX6g8Tvbmj4XUTbyrik0akgRy03yjXbQaBWWNWGE7SGtJk98m0N8nzegD/7SggrUlivxo5ax4KWQ==",
+        },
+        "glob-parent": {
+          "version": "5.1.2",
+          "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz",
+          "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==",
           "dev": true,
           "requires": {
           "dev": true,
           "requires": {
-            "@types/istanbul-lib-coverage": "^2.0.0",
-            "@types/istanbul-reports": "^3.0.0",
-            "@types/node": "*",
-            "@types/yargs": "^15.0.0",
-            "chalk": "^4.0.0"
+            "is-glob": "^4.0.1"
           }
         },
           }
         },
-        "@types/istanbul-reports": {
-          "version": "3.0.1",
-          "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.1.tgz",
-          "integrity": "sha512-c3mAZEuK0lvBp8tmuL74XRKn1+y2dcwOUpH7x4WrF6gk1GIgiluDRgMYQtw2OFcBvAJWlt6ASU3tSqxp0Uu0Aw==",
+        "has-flag": {
+          "version": "4.0.0",
+          "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
+          "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+          "dev": true
+        },
+        "jsonc-parser": {
+          "version": "3.2.0",
+          "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.2.0.tgz",
+          "integrity": "sha512-gfFQZrcTc8CnKXp6Y4/CBT3fTc0OVuDofpre4aEeEpSBPV5X5v4+Vmx+8snU7RLPrNHPKSgLxGo9YuQzz20o+w==",
+          "dev": true
+        },
+        "lines-and-columns": {
+          "version": "2.0.3",
+          "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-2.0.3.tgz",
+          "integrity": "sha512-cNOjgCnLB+FnvWWtyRTzmB3POJ+cXxTA81LoW7u8JdmhfXzriropYwpjShnz1QLLWsQwY7nIxoDmcPTwphDK9w==",
+          "dev": true
+        },
+        "lru-cache": {
+          "version": "6.0.0",
+          "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz",
+          "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==",
           "dev": true,
           "requires": {
           "dev": true,
           "requires": {
-            "@types/istanbul-lib-report": "*"
+            "yallist": "^4.0.0"
           }
         },
           }
         },
-        "ansi-styles": {
-          "version": "4.3.0",
-          "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
-          "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+        "minimatch": {
+          "version": "3.0.5",
+          "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.5.tgz",
+          "integrity": "sha512-tUpxzX0VAzJHjLu0xUfFv1gwVp9ba3IOuRAVH2EGuRW8a5emA2FlACLqiT/lDVtS1W+TGNwqz3sWaNyLgDJWuw==",
           "dev": true,
           "requires": {
           "dev": true,
           "requires": {
-            "color-convert": "^2.0.1"
+            "brace-expansion": "^1.1.7"
           }
         },
           }
         },
-        "chalk": {
-          "version": "4.1.2",
-          "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
-          "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
-          "dev": true,
-          "requires": {
-            "ansi-styles": "^4.1.0",
-            "supports-color": "^7.1.0"
+        "nx": {
+          "version": "15.8.5",
+          "resolved": "https://registry.npmjs.org/nx/-/nx-15.8.5.tgz",
+          "integrity": "sha512-1c6Y3rPSzzlqQVJPo33Ej0HY/3t9ykeaPs074HpYxXH0+GU1BSIv/9EfXKQGvmBzjs5yAx6asGIv+H3QDrFt3A==",
+          "dev": true,
+          "requires": {
+            "@nrwl/cli": "15.8.5",
+            "@nrwl/nx-darwin-arm64": "15.8.5",
+            "@nrwl/nx-darwin-x64": "15.8.5",
+            "@nrwl/nx-linux-arm-gnueabihf": "15.8.5",
+            "@nrwl/nx-linux-arm64-gnu": "15.8.5",
+            "@nrwl/nx-linux-arm64-musl": "15.8.5",
+            "@nrwl/nx-linux-x64-gnu": "15.8.5",
+            "@nrwl/nx-linux-x64-musl": "15.8.5",
+            "@nrwl/nx-win32-arm64-msvc": "15.8.5",
+            "@nrwl/nx-win32-x64-msvc": "15.8.5",
+            "@nrwl/tao": "15.8.5",
+            "@parcel/watcher": "2.0.4",
+            "@yarnpkg/lockfile": "^1.1.0",
+            "@yarnpkg/parsers": "^3.0.0-rc.18",
+            "@zkochan/js-yaml": "0.0.6",
+            "axios": "^1.0.0",
+            "chalk": "^4.1.0",
+            "cli-cursor": "3.1.0",
+            "cli-spinners": "2.6.1",
+            "cliui": "^7.0.2",
+            "dotenv": "~10.0.0",
+            "enquirer": "~2.3.6",
+            "fast-glob": "3.2.7",
+            "figures": "3.2.0",
+            "flat": "^5.0.2",
+            "fs-extra": "^11.1.0",
+            "glob": "7.1.4",
+            "ignore": "^5.0.4",
+            "js-yaml": "4.1.0",
+            "jsonc-parser": "3.2.0",
+            "lines-and-columns": "~2.0.3",
+            "minimatch": "3.0.5",
+            "npm-run-path": "^4.0.1",
+            "open": "^8.4.0",
+            "semver": "7.3.4",
+            "string-width": "^4.2.3",
+            "strong-log-transformer": "^2.1.0",
+            "tar-stream": "~2.2.0",
+            "tmp": "~0.2.1",
+            "tsconfig-paths": "^4.1.2",
+            "tslib": "^2.3.0",
+            "v8-compile-cache": "2.3.0",
+            "yargs": "^17.6.2",
+            "yargs-parser": "21.1.1"
           }
         },
           }
         },
-        "color-convert": {
-          "version": "2.0.1",
-          "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
-          "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+        "semver": {
+          "version": "7.3.4",
+          "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.4.tgz",
+          "integrity": "sha512-tCfb2WLjqFAtXn4KEdxIhalnRtoKFN7nAwj0B3ZXCbQloV2tq5eDbcTmT68JJD3nRJq24/XgxtQKFIpQdtvmVw==",
           "dev": true,
           "requires": {
           "dev": true,
           "requires": {
-            "color-name": "~1.1.4"
+            "lru-cache": "^6.0.0"
           }
         },
           }
         },
-        "color-name": {
-          "version": "1.1.4",
-          "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
-          "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
-          "dev": true
-        },
-        "has-flag": {
-          "version": "4.0.0",
-          "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
-          "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
-          "dev": true
-        },
         "supports-color": {
           "version": "7.2.0",
           "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
         "supports-color": {
           "version": "7.2.0",
           "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
           "requires": {
             "has-flag": "^4.0.0"
           }
           "requires": {
             "has-flag": "^4.0.0"
           }
+        },
+        "tmp": {
+          "version": "0.2.1",
+          "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.1.tgz",
+          "integrity": "sha512-76SUhtfqR2Ijn+xllcI5P1oyannHNHByD80W1q447gU3mp9G9PSpGdWmjUOHRDPiHYacIk66W7ubDTuPF3BEtQ==",
+          "dev": true,
+          "requires": {
+            "rimraf": "^3.0.0"
+          }
+        },
+        "yallist": {
+          "version": "4.0.0",
+          "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
+          "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==",
+          "dev": true
         }
       }
     },
         }
       }
     },
-    "@jest/test-sequencer": {
-      "version": "26.6.3",
-      "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-26.6.3.tgz",
-      "integrity": "sha512-YHlVIjP5nfEyjlrSr8t/YdNfU/1XEt7c5b4OxcXCjyRhjzLYu/rO69/WHPuYcbCWkz8kAeZVZp2N2+IOLLEPGw==",
-      "dev": true,
-      "requires": {
-        "@jest/test-result": "^26.6.2",
-        "graceful-fs": "^4.2.4",
-        "jest-haste-map": "^26.6.2",
-        "jest-runner": "^26.6.3",
-        "jest-runtime": "^26.6.3"
-      }
-    },
-    "@jest/transform": {
-      "version": "26.6.2",
-      "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-26.6.2.tgz",
-      "integrity": "sha512-E9JjhUgNzvuQ+vVAL21vlyfy12gP0GhazGgJC4h6qUt1jSdUXGWJ1wfu/X7Sd8etSgxV4ovT1pb9v5D6QW4XgA==",
+    "@nrwl/devkit": {
+      "version": "13.1.3",
+      "resolved": "https://registry.npmjs.org/@nrwl/devkit/-/devkit-13.1.3.tgz",
+      "integrity": "sha512-TAAsZJvVc/obeH0rZKY6miVhyM2GHGb8qIWp9MAIdLlXf4VDcNC7rxwb5OrGVSwuTTjqGYBGPUx0yEogOOJthA==",
       "dev": true,
       "requires": {
       "dev": true,
       "requires": {
-        "@babel/core": "^7.1.0",
-        "@jest/types": "^26.6.2",
-        "babel-plugin-istanbul": "^6.0.0",
-        "chalk": "^4.0.0",
-        "convert-source-map": "^1.4.0",
-        "fast-json-stable-stringify": "^2.0.0",
-        "graceful-fs": "^4.2.4",
-        "jest-haste-map": "^26.6.2",
-        "jest-regex-util": "^26.0.0",
-        "jest-util": "^26.6.2",
-        "micromatch": "^4.0.2",
-        "pirates": "^4.0.1",
-        "slash": "^3.0.0",
-        "source-map": "^0.6.1",
-        "write-file-atomic": "^3.0.0"
+        "@nrwl/tao": "13.1.3",
+        "ejs": "^3.1.5",
+        "ignore": "^5.0.4",
+        "rxjs": "^6.5.4",
+        "semver": "7.3.4",
+        "tslib": "^2.0.0"
       },
       "dependencies": {
       },
       "dependencies": {
-        "@jest/types": {
-          "version": "26.6.2",
-          "resolved": "https://registry.npmjs.org/@jest/types/-/types-26.6.2.tgz",
-          "integrity": "sha512-fC6QCp7Sc5sX6g8Tvbmj4XUTbyrik0akgRy03yjXbQaBWWNWGE7SGtJk98m0N8nzegD/7SggrUlivxo5ax4KWQ==",
+        "lru-cache": {
+          "version": "6.0.0",
+          "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz",
+          "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==",
           "dev": true,
           "requires": {
           "dev": true,
           "requires": {
-            "@types/istanbul-lib-coverage": "^2.0.0",
-            "@types/istanbul-reports": "^3.0.0",
-            "@types/node": "*",
-            "@types/yargs": "^15.0.0",
-            "chalk": "^4.0.0"
+            "yallist": "^4.0.0"
           }
         },
           }
         },
-        "@types/istanbul-reports": {
-          "version": "3.0.1",
-          "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.1.tgz",
-          "integrity": "sha512-c3mAZEuK0lvBp8tmuL74XRKn1+y2dcwOUpH7x4WrF6gk1GIgiluDRgMYQtw2OFcBvAJWlt6ASU3tSqxp0Uu0Aw==",
+        "semver": {
+          "version": "7.3.4",
+          "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.4.tgz",
+          "integrity": "sha512-tCfb2WLjqFAtXn4KEdxIhalnRtoKFN7nAwj0B3ZXCbQloV2tq5eDbcTmT68JJD3nRJq24/XgxtQKFIpQdtvmVw==",
           "dev": true,
           "requires": {
           "dev": true,
           "requires": {
-            "@types/istanbul-lib-report": "*"
+            "lru-cache": "^6.0.0"
           }
         },
           }
         },
+        "yallist": {
+          "version": "4.0.0",
+          "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
+          "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==",
+          "dev": true
+        }
+      }
+    },
+    "@nrwl/nx-darwin-arm64": {
+      "version": "15.8.5",
+      "resolved": "https://registry.npmjs.org/@nrwl/nx-darwin-arm64/-/nx-darwin-arm64-15.8.5.tgz",
+      "integrity": "sha512-/8yXbh1J3k85MAW/A6cDiPeEnbt66SE9BPnM2IPlGoZrXakQvAXEn+gsjQlvnP3q2EaEyv7e5+GA+8d+p6mT5A==",
+      "dev": true,
+      "optional": true
+    },
+    "@nrwl/nx-darwin-x64": {
+      "version": "15.8.5",
+      "resolved": "https://registry.npmjs.org/@nrwl/nx-darwin-x64/-/nx-darwin-x64-15.8.5.tgz",
+      "integrity": "sha512-zEVoi0d+YChLrQMypoGFwu73t3YiD8UkXSozMtUEa2mg/se4e7jh+15tB6Te+Oq5aL0JKwQpr027GE4YtAmpLw==",
+      "dev": true,
+      "optional": true
+    },
+    "@nrwl/nx-linux-arm-gnueabihf": {
+      "version": "15.8.5",
+      "resolved": "https://registry.npmjs.org/@nrwl/nx-linux-arm-gnueabihf/-/nx-linux-arm-gnueabihf-15.8.5.tgz",
+      "integrity": "sha512-4C5wN0C7gQD6/lC9+UKUsB6mbHvowKhlaO529GIgtzrCLmfEh/LJ/CybnnKGpFEB/8Y5GpCa2uTWyA1XcPDzUw==",
+      "dev": true,
+      "optional": true
+    },
+    "@nrwl/nx-linux-arm64-gnu": {
+      "version": "15.8.5",
+      "resolved": "https://registry.npmjs.org/@nrwl/nx-linux-arm64-gnu/-/nx-linux-arm64-gnu-15.8.5.tgz",
+      "integrity": "sha512-SMQ+oIsyK75JiKeSMprmb8VXce6MLdfcS5GWWOihpoDWfUC9FoQHAu4X1OtxHbVTmJfoEOInJKAhPxXAi5obdw==",
+      "dev": true,
+      "optional": true
+    },
+    "@nrwl/nx-linux-arm64-musl": {
+      "version": "15.8.5",
+      "resolved": "https://registry.npmjs.org/@nrwl/nx-linux-arm64-musl/-/nx-linux-arm64-musl-15.8.5.tgz",
+      "integrity": "sha512-GVENjltZ17aJ6KOCibdBtLXQcGY5lpBqKolB9+rIYJvTWuV1k/uHOkYJDG7Vl70Rj46rC8K0Jp6BCpJHCv1ksQ==",
+      "dev": true,
+      "optional": true
+    },
+    "@nrwl/nx-linux-x64-gnu": {
+      "version": "15.8.5",
+      "resolved": "https://registry.npmjs.org/@nrwl/nx-linux-x64-gnu/-/nx-linux-x64-gnu-15.8.5.tgz",
+      "integrity": "sha512-AW8YjhZv3c+LRUoLvHLx4BZaDakQbPCPx70+c/uQyDkQP/ckYJc0gRjoZukolcI6+AvNcBhkI559RL9W4qb9iw==",
+      "dev": true,
+      "optional": true
+    },
+    "@nrwl/nx-linux-x64-musl": {
+      "version": "15.8.5",
+      "resolved": "https://registry.npmjs.org/@nrwl/nx-linux-x64-musl/-/nx-linux-x64-musl-15.8.5.tgz",
+      "integrity": "sha512-m4Iy/pbzH0LTsADq/X+74nfVzm2Tt0zorOXXy/uQN4ozL/JNGVpwvxdOFxZ7e3RBXDX4u6awUzSE52Z2d2f0uA==",
+      "dev": true,
+      "optional": true
+    },
+    "@nrwl/nx-win32-arm64-msvc": {
+      "version": "15.8.5",
+      "resolved": "https://registry.npmjs.org/@nrwl/nx-win32-arm64-msvc/-/nx-win32-arm64-msvc-15.8.5.tgz",
+      "integrity": "sha512-4AT1PHo5At8AXvgE5XlQbimE0THeSji6J3XZ1UTqq7n3L26QicNdnZcaHGyL1ukMtXRIwT/yed+xu1PFkXF4QA==",
+      "dev": true,
+      "optional": true
+    },
+    "@nrwl/nx-win32-x64-msvc": {
+      "version": "15.8.5",
+      "resolved": "https://registry.npmjs.org/@nrwl/nx-win32-x64-msvc/-/nx-win32-x64-msvc-15.8.5.tgz",
+      "integrity": "sha512-53vzsQErvN4OeF/qBgfPg6OZ3smX4V8Lza59bwql9aAjjlMe1Ff9Su0BgAqlhVfSiYGxAirfHljgA6aWFqpCHQ==",
+      "dev": true,
+      "optional": true
+    },
+    "@nrwl/tao": {
+      "version": "13.1.3",
+      "resolved": "https://registry.npmjs.org/@nrwl/tao/-/tao-13.1.3.tgz",
+      "integrity": "sha512-/IwJgSgCBD1SaF+n8RuXX2OxDAh8ut/+P8pMswjm8063ac30UlAHjQ4XTYyskLH8uoUmNi2hNaGgHUrkwt7tQA==",
+      "dev": true,
+      "requires": {
+        "chalk": "4.1.0",
+        "enquirer": "~2.3.6",
+        "fs-extra": "^9.1.0",
+        "jsonc-parser": "3.0.0",
+        "nx": "13.1.3",
+        "rxjs": "^6.5.4",
+        "rxjs-for-await": "0.0.2",
+        "semver": "7.3.4",
+        "tmp": "~0.2.1",
+        "tslib": "^2.0.0",
+        "yargs-parser": "20.0.0"
+      },
+      "dependencies": {
         "ansi-styles": {
           "version": "4.3.0",
           "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
         "ansi-styles": {
           "version": "4.3.0",
           "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
           }
         },
         "chalk": {
           }
         },
         "chalk": {
-          "version": "4.1.2",
-          "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
-          "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
+          "version": "4.1.0",
+          "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz",
+          "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==",
           "dev": true,
           "requires": {
             "ansi-styles": "^4.1.0",
           "dev": true,
           "requires": {
             "ansi-styles": "^4.1.0",
           "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
           "dev": true
         },
           "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
           "dev": true
         },
-        "source-map": {
-          "version": "0.6.1",
-          "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
-          "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
-          "dev": true
-        },
-        "supports-color": {
-          "version": "7.2.0",
-          "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
-          "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
+        "lru-cache": {
+          "version": "6.0.0",
+          "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz",
+          "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==",
           "dev": true,
           "requires": {
           "dev": true,
           "requires": {
-            "has-flag": "^4.0.0"
+            "yallist": "^4.0.0"
           }
           }
-        }
-      }
-    },
-    "@jest/types": {
-      "version": "25.5.0",
-      "resolved": "https://registry.npmjs.org/@jest/types/-/types-25.5.0.tgz",
-      "integrity": "sha512-OXD0RgQ86Tu3MazKo8bnrkDRaDXXMGUqd+kTtLtK1Zb7CRzQcaSRPPPV37SvYTdevXEBVxe0HXylEjs8ibkmCw==",
-      "dev": true,
-      "requires": {
-        "@types/istanbul-lib-coverage": "^2.0.0",
-        "@types/istanbul-reports": "^1.1.1",
-        "@types/yargs": "^15.0.0",
-        "chalk": "^3.0.0"
-      },
-      "dependencies": {
-        "ansi-styles": {
-          "version": "4.3.0",
-          "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
-          "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+        },
+        "semver": {
+          "version": "7.3.4",
+          "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.4.tgz",
+          "integrity": "sha512-tCfb2WLjqFAtXn4KEdxIhalnRtoKFN7nAwj0B3ZXCbQloV2tq5eDbcTmT68JJD3nRJq24/XgxtQKFIpQdtvmVw==",
           "dev": true,
           "requires": {
           "dev": true,
           "requires": {
-            "color-convert": "^2.0.1"
+            "lru-cache": "^6.0.0"
           }
         },
           }
         },
-        "chalk": {
-          "version": "3.0.0",
-          "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz",
-          "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==",
+        "supports-color": {
+          "version": "7.2.0",
+          "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
+          "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
           "dev": true,
           "requires": {
           "dev": true,
           "requires": {
-            "ansi-styles": "^4.1.0",
-            "supports-color": "^7.1.0"
+            "has-flag": "^4.0.0"
           }
         },
           }
         },
-        "color-convert": {
-          "version": "2.0.1",
-          "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
-          "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+        "tmp": {
+          "version": "0.2.1",
+          "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.1.tgz",
+          "integrity": "sha512-76SUhtfqR2Ijn+xllcI5P1oyannHNHByD80W1q447gU3mp9G9PSpGdWmjUOHRDPiHYacIk66W7ubDTuPF3BEtQ==",
           "dev": true,
           "requires": {
           "dev": true,
           "requires": {
-            "color-name": "~1.1.4"
+            "rimraf": "^3.0.0"
           }
         },
           }
         },
-        "color-name": {
-          "version": "1.1.4",
-          "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
-          "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
-          "dev": true
-        },
-        "has-flag": {
+        "yallist": {
           "version": "4.0.0",
           "version": "4.0.0",
-          "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
-          "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+          "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
+          "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==",
           "dev": true
         },
           "dev": true
         },
-        "supports-color": {
-          "version": "7.2.0",
-          "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
-          "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
-          "dev": true,
-          "requires": {
-            "has-flag": "^4.0.0"
-          }
-        }
-      }
-    },
-    "@jridgewell/gen-mapping": {
-      "version": "0.3.2",
-      "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz",
-      "integrity": "sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A==",
-      "requires": {
-        "@jridgewell/set-array": "^1.0.1",
-        "@jridgewell/sourcemap-codec": "^1.4.10",
-        "@jridgewell/trace-mapping": "^0.3.9"
-      }
-    },
-    "@jridgewell/resolve-uri": {
-      "version": "3.1.0",
-      "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz",
-      "integrity": "sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w=="
-    },
-    "@jridgewell/set-array": {
-      "version": "1.1.2",
-      "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz",
-      "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw=="
-    },
-    "@jridgewell/sourcemap-codec": {
-      "version": "1.4.14",
-      "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz",
-      "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw=="
-    },
-    "@jridgewell/trace-mapping": {
-      "version": "0.3.15",
-      "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.15.tgz",
-      "integrity": "sha512-oWZNOULl+UbhsgB51uuZzglikfIKSUBO/M9W2OfEjn7cmqoAiCgmv9lyACTUacZwBz0ITnJ2NqjU8Tx0DHL88g==",
-      "requires": {
-        "@jridgewell/resolve-uri": "^3.0.3",
-        "@jridgewell/sourcemap-codec": "^1.4.10"
-      }
-    },
-    "@jsdevtools/coverage-istanbul-loader": {
-      "version": "3.0.5",
-      "resolved": "https://registry.npmjs.org/@jsdevtools/coverage-istanbul-loader/-/coverage-istanbul-loader-3.0.5.tgz",
-      "integrity": "sha512-EUCPEkaRPvmHjWAAZkWMT7JDzpw7FKB00WTISaiXsbNOd5hCHg77XLA8sLYLFDo1zepYLo2w7GstN8YBqRXZfA==",
-      "dev": true,
-      "requires": {
-        "convert-source-map": "^1.7.0",
-        "istanbul-lib-instrument": "^4.0.3",
-        "loader-utils": "^2.0.0",
-        "merge-source-map": "^1.1.0",
-        "schema-utils": "^2.7.0"
-      }
-    },
-    "@juggle/resize-observer": {
-      "version": "3.4.0",
-      "resolved": "https://registry.npmjs.org/@juggle/resize-observer/-/resize-observer-3.4.0.tgz",
-      "integrity": "sha512-dfLbk+PwWvFzSxwk3n5ySL0hfBog779o8h68wK/7/APo/7cgyWp5jcXockbxdk5kFRkbeXWm4Fbi9FrdN381sA=="
-    },
-    "@mochajs/json-file-reporter": {
-      "version": "1.3.0",
-      "resolved": "https://registry.npmjs.org/@mochajs/json-file-reporter/-/json-file-reporter-1.3.0.tgz",
-      "integrity": "sha512-evIxpeP8EOixo/T2xh5xYEIzwbEHk8YNJfRUm1KeTs8F3bMjgNn2580Ogze9yisXNlTxu88JiJJYzXjjg5NdLA==",
-      "dev": true
-    },
-    "@ng-bootstrap/ng-bootstrap": {
-      "version": "10.0.0",
-      "resolved": "https://registry.npmjs.org/@ng-bootstrap/ng-bootstrap/-/ng-bootstrap-10.0.0.tgz",
-      "integrity": "sha512-Sz+QaxjuyJYJ+zyUbf0TevgcgVesCPQiiFiggEzxKjzY5R+Hvq3YgryLdXf2r/ryePL+C3FXCcmmKpTM5bfczQ==",
-      "requires": {
-        "tslib": "^2.1.0"
-      }
-    },
-    "@ngtools/webpack": {
-      "version": "12.2.13",
-      "resolved": "https://registry.npmjs.org/@ngtools/webpack/-/webpack-12.2.13.tgz",
-      "integrity": "sha512-krAwMyRqOaC1S0+IxAFid9F6A6ABip2DJ0tgCx26X+1Vw/d1GKtV9ZqDJFizMf5k1ywl9aBlhOazWpq5d6i+gw==",
-      "dev": true
-    },
-    "@nodelib/fs.scandir": {
-      "version": "2.1.5",
-      "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz",
-      "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==",
-      "dev": true,
-      "requires": {
-        "@nodelib/fs.stat": "2.0.5",
-        "run-parallel": "^1.1.9"
-      }
-    },
-    "@nodelib/fs.stat": {
-      "version": "2.0.5",
-      "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz",
-      "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==",
-      "dev": true
-    },
-    "@nodelib/fs.walk": {
-      "version": "1.2.8",
-      "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz",
-      "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==",
-      "dev": true,
-      "requires": {
-        "@nodelib/fs.scandir": "2.1.5",
-        "fastq": "^1.6.0"
-      }
-    },
-    "@npmcli/git": {
-      "version": "2.1.0",
-      "resolved": "https://registry.npmjs.org/@npmcli/git/-/git-2.1.0.tgz",
-      "integrity": "sha512-/hBFX/QG1b+N7PZBFs0bi+evgRZcK9nWBxQKZkGoXUT5hJSwl5c4d7y8/hm+NQZRPhQ67RzFaj5UM9YeyKoryw==",
-      "dev": true,
-      "requires": {
-        "@npmcli/promise-spawn": "^1.3.2",
-        "lru-cache": "^6.0.0",
-        "mkdirp": "^1.0.4",
-        "npm-pick-manifest": "^6.1.1",
-        "promise-inflight": "^1.0.1",
-        "promise-retry": "^2.0.1",
-        "semver": "^7.3.5",
-        "which": "^2.0.2"
-      },
-      "dependencies": {
-        "semver": {
-          "version": "7.3.7",
-          "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.7.tgz",
-          "integrity": "sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g==",
-          "dev": true,
-          "requires": {
-            "lru-cache": "^6.0.0"
-          }
-        },
-        "which": {
-          "version": "2.0.2",
-          "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz",
-          "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==",
-          "dev": true,
-          "requires": {
-            "isexe": "^2.0.0"
-          }
+        "yargs-parser": {
+          "version": "20.0.0",
+          "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.0.0.tgz",
+          "integrity": "sha512-8eblPHTL7ZWRkyjIZJjnGf+TijiKJSwA24svzLRVvtgoi/RZiKa9fFQTrlx0OKLnyHSdt/enrdadji6WFfESVA==",
+          "dev": true
         }
       }
     },
         }
       }
     },
-    "@npmcli/installed-package-contents": {
-      "version": "1.0.7",
-      "resolved": "https://registry.npmjs.org/@npmcli/installed-package-contents/-/installed-package-contents-1.0.7.tgz",
-      "integrity": "sha512-9rufe0wnJusCQoLpV9ZPKIVP55itrM5BxOXs10DmdbRfgWtHy1LDyskbwRnBghuB0PrF7pNPOqREVtpz4HqzKw==",
-      "dev": true,
-      "requires": {
-        "npm-bundled": "^1.1.1",
-        "npm-normalize-package-bin": "^1.0.1"
-      }
-    },
-    "@npmcli/move-file": {
-      "version": "1.1.2",
-      "resolved": "https://registry.npmjs.org/@npmcli/move-file/-/move-file-1.1.2.tgz",
-      "integrity": "sha512-1SUf/Cg2GzGDyaf15aR9St9TWlb+XvbZXWpDx8YKs7MLzMH/BCeopv+y9vzrzgkfykCGuWOlSu3mZhj2+FQcrg==",
-      "dev": true,
-      "requires": {
-        "mkdirp": "^1.0.4",
-        "rimraf": "^3.0.2"
-      }
-    },
-    "@npmcli/node-gyp": {
-      "version": "1.0.3",
-      "resolved": "https://registry.npmjs.org/@npmcli/node-gyp/-/node-gyp-1.0.3.tgz",
-      "integrity": "sha512-fnkhw+fmX65kiLqk6E3BFLXNC26rUhK90zVwe2yncPliVT/Qos3xjhTLE59Df8KnPlcwIERXKVlU1bXoUQ+liA==",
-      "dev": true
-    },
-    "@npmcli/promise-spawn": {
-      "version": "1.3.2",
-      "resolved": "https://registry.npmjs.org/@npmcli/promise-spawn/-/promise-spawn-1.3.2.tgz",
-      "integrity": "sha512-QyAGYo/Fbj4MXeGdJcFzZ+FkDkomfRBrPM+9QYJSg+PxgAUL+LU3FneQk37rKR2/zjqkCV1BLHccX98wRXG3Sg==",
+    "@parcel/watcher": {
+      "version": "2.0.4",
+      "resolved": "https://registry.npmjs.org/@parcel/watcher/-/watcher-2.0.4.tgz",
+      "integrity": "sha512-cTDi+FUDBIUOBKEtj+nhiJ71AZVlkAsQFuGQTun5tV9mwQBQgZvhCzG+URPQc8myeN32yRVZEfVAPCs1RW+Jvg==",
       "dev": true,
       "requires": {
       "dev": true,
       "requires": {
-        "infer-owner": "^1.0.4"
+        "node-addon-api": "^3.2.1",
+        "node-gyp-build": "^4.3.0"
       }
     },
       }
     },
-    "@npmcli/run-script": {
-      "version": "1.8.6",
-      "resolved": "https://registry.npmjs.org/@npmcli/run-script/-/run-script-1.8.6.tgz",
-      "integrity": "sha512-e42bVZnC6VluBZBAFEr3YrdqSspG3bgilyg4nSLBJ7TRGNCzxHa92XAHxQBLYg0BmgwO4b2mf3h/l5EkEWRn3g==",
-      "dev": true,
-      "requires": {
-        "@npmcli/node-gyp": "^1.0.2",
-        "@npmcli/promise-spawn": "^1.3.2",
-        "node-gyp": "^7.1.0",
-        "read-package-json-fast": "^2.0.1"
-      }
+    "@popperjs/core": {
+      "version": "2.10.2",
+      "resolved": "https://registry.npmjs.org/@popperjs/core/-/core-2.10.2.tgz",
+      "integrity": "sha512-IXf3XA7+XyN7CP9gGh/XB0UxVMlvARGEgGXLubFICsUMGz6Q+DU+i4gGlpOxTjKvXjkJDJC8YdqdKkDj9qZHEQ=="
     },
     "@protobufjs/aspromise": {
       "version": "1.1.2",
     },
     "@protobufjs/aspromise": {
       "version": "1.1.2",
       "dev": true
     },
     "@schematics/angular": {
       "dev": true
     },
     "@schematics/angular": {
-      "version": "12.2.13",
-      "resolved": "https://registry.npmjs.org/@schematics/angular/-/angular-12.2.13.tgz",
-      "integrity": "sha512-TrigQ9TCmAedf1J5PSSSfTC+sScYrITeAUN8a9rlkjZNvff8hHVyQaiZmhqL+egKQL828mhkqpnFUDd4QsPBIw==",
+      "version": "13.3.9",
+      "resolved": "https://registry.npmjs.org/@schematics/angular/-/angular-13.3.9.tgz",
+      "integrity": "sha512-tm5wst7+Z8cOgOJ/4JVlYKOFCCOVnqKYFtYf0BIWq6RFBXcw6QqbGW1wXH8ASmuev4QZXKgqc7YKALPpYAKCeQ==",
       "dev": true,
       "requires": {
       "dev": true,
       "requires": {
-        "@angular-devkit/core": "12.2.13",
-        "@angular-devkit/schematics": "12.2.13",
+        "@angular-devkit/core": "13.3.9",
+        "@angular-devkit/schematics": "13.3.9",
         "jsonc-parser": "3.0.0"
       }
     },
         "jsonc-parser": "3.0.0"
       }
     },
       }
     },
     "@sideway/formula": {
       }
     },
     "@sideway/formula": {
-      "version": "3.0.0",
-      "resolved": "https://registry.npmjs.org/@sideway/formula/-/formula-3.0.0.tgz",
-      "integrity": "sha512-vHe7wZ4NOXVfkoRb8T5otiENVlT7a3IAiw7H5M2+GO+9CDgcVUUsX1zalAztCmwyOr2RUTGJdgB+ZvSVqmdHmg==",
+      "version": "3.0.1",
+      "resolved": "https://registry.npmjs.org/@sideway/formula/-/formula-3.0.1.tgz",
+      "integrity": "sha512-/poHZJJVjx3L+zVD6g9KgHfYnb443oi7wLu/XKojDviHy6HOEOA6z1Trk5aR1dGcmPenJEgb2sK2I80LeS3MIg==",
       "dev": true
     },
     "@sideway/pinpoint": {
       "dev": true
     },
     "@sideway/pinpoint": {
       "integrity": "sha512-RNiOoTPkptFtSVzQevY/yWtZwf/RxyVnPy/OcA9HBM3MlGDnBEYL5B41H0MTn0Uec8Hi+2qUtTfG2WWZBmMejQ==",
       "dev": true
     },
       "integrity": "sha512-RNiOoTPkptFtSVzQevY/yWtZwf/RxyVnPy/OcA9HBM3MlGDnBEYL5B41H0MTn0Uec8Hi+2qUtTfG2WWZBmMejQ==",
       "dev": true
     },
+    "@sinclair/typebox": {
+      "version": "0.24.51",
+      "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.24.51.tgz",
+      "integrity": "sha512-1P1OROm/rdubP5aFDSZQILU0vrLCJ4fvHt6EoqHEM+2D/G5MK3bIaymUKLit8Js9gbns5UyJnkP/TZROLw4tUA==",
+      "dev": true
+    },
     "@sinonjs/commons": {
     "@sinonjs/commons": {
-      "version": "1.8.3",
-      "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-1.8.3.tgz",
-      "integrity": "sha512-xkNcLAn/wZaX14RPlwizcKicDk9G3F8m2nU3L7Ukm5zBgTwiT0wsoFAHx9Jq56fJA1z/7uKGtCRu16sOUCLIHQ==",
+      "version": "1.8.6",
+      "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-1.8.6.tgz",
+      "integrity": "sha512-Ky+XkAkqPZSm3NLBeUng77EBQl3cmeJhITaGHdYH8kjVB+aun3S4XBRti2zt17mtt0mIUDiNxYeoJm6drVvBJQ==",
       "dev": true,
       "requires": {
         "type-detect": "4.0.8"
       }
     },
     "@sinonjs/fake-timers": {
       "dev": true,
       "requires": {
         "type-detect": "4.0.8"
       }
     },
     "@sinonjs/fake-timers": {
-      "version": "6.0.1",
-      "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-6.0.1.tgz",
-      "integrity": "sha512-MZPUxrmFubI36XS1DI3qmI0YdN1gks62JtFZvxR67ljjSNCeK6U08Zx4msEWOXuofgqUt6zPHSi1H9fbjR/NRA==",
+      "version": "9.1.2",
+      "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-9.1.2.tgz",
+      "integrity": "sha512-BPS4ynJW/o92PUR4wgriz2Ud5gpST5vz6GQfMixEDK0Z8ZCUv2M7SkBLykH56T++Xs+8ln9zTGbOvNGIe02/jw==",
       "dev": true,
       "requires": {
         "@sinonjs/commons": "^1.7.0"
       "dev": true,
       "requires": {
         "@sinonjs/commons": "^1.7.0"
         "@babel/core": "^7.17.9"
       },
       "dependencies": {
         "@babel/core": "^7.17.9"
       },
       "dependencies": {
-        "@ampproject/remapping": {
-          "version": "2.2.0",
-          "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.0.tgz",
-          "integrity": "sha512-qRmjj8nj9qmLTQXXmaR1cck3UXSRMPrbsLJAasZpF+t3riI71BXed5ebIOYwQntykeZuhjsdweEc9BxH5Jc26w==",
-          "dev": true,
-          "requires": {
-            "@jridgewell/gen-mapping": "^0.1.0",
-            "@jridgewell/trace-mapping": "^0.3.9"
-          }
-        },
         "@babel/core": {
         "@babel/core": {
-          "version": "7.18.10",
-          "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.18.10.tgz",
-          "integrity": "sha512-JQM6k6ENcBFKVtWvLavlvi/mPcpYZ3+R+2EySDEMSMbp7Mn4FexlbbJVrx2R7Ijhr01T8gyqrOaABWIOgxeUyw==",
+          "version": "7.21.0",
+          "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.21.0.tgz",
+          "integrity": "sha512-PuxUbxcW6ZYe656yL3EAhpy7qXKq0DmYsrJLpbB8XrsCP9Nm+XCg9XFMb5vIDliPD7+U/+M+QJlH17XOcB7eXA==",
           "dev": true,
           "requires": {
           "dev": true,
           "requires": {
-            "@ampproject/remapping": "^2.1.0",
+            "@ampproject/remapping": "^2.2.0",
             "@babel/code-frame": "^7.18.6",
             "@babel/code-frame": "^7.18.6",
-            "@babel/generator": "^7.18.10",
-            "@babel/helper-compilation-targets": "^7.18.9",
-            "@babel/helper-module-transforms": "^7.18.9",
-            "@babel/helpers": "^7.18.9",
-            "@babel/parser": "^7.18.10",
-            "@babel/template": "^7.18.10",
-            "@babel/traverse": "^7.18.10",
-            "@babel/types": "^7.18.10",
+            "@babel/generator": "^7.21.0",
+            "@babel/helper-compilation-targets": "^7.20.7",
+            "@babel/helper-module-transforms": "^7.21.0",
+            "@babel/helpers": "^7.21.0",
+            "@babel/parser": "^7.21.0",
+            "@babel/template": "^7.20.7",
+            "@babel/traverse": "^7.21.0",
+            "@babel/types": "^7.21.0",
             "convert-source-map": "^1.7.0",
             "debug": "^4.1.0",
             "gensync": "^1.0.0-beta.2",
             "convert-source-map": "^1.7.0",
             "debug": "^4.1.0",
             "gensync": "^1.0.0-beta.2",
-            "json5": "^2.2.1",
+            "json5": "^2.2.2",
             "semver": "^6.3.0"
           }
             "semver": "^6.3.0"
           }
-        },
-        "@jridgewell/gen-mapping": {
-          "version": "0.1.1",
-          "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.1.1.tgz",
-          "integrity": "sha512-sQXCasFk+U8lWYEe66WxRDOE9PjVz4vSM51fTu3Hw+ClTpUSQb718772vH3pyS5pShp6lvQM7SxgIDXXXmOX7w==",
-          "dev": true,
-          "requires": {
-            "@jridgewell/set-array": "^1.0.0",
-            "@jridgewell/sourcemap-codec": "^1.4.10"
-          }
-        },
-        "semver": {
-          "version": "6.3.0",
-          "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
-          "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==",
-          "dev": true
         }
       }
     },
         }
       }
     },
         "unist-util-find-all-after": "^3.0.2"
       }
     },
         "unist-util-find-all-after": "^3.0.2"
       }
     },
+    "@swagger-api/apidom-ast": {
+      "version": "0.69.0",
+      "resolved": "https://registry.npmjs.org/@swagger-api/apidom-ast/-/apidom-ast-0.69.0.tgz",
+      "integrity": "sha512-JsRyi1Ir3VeNSSWmIFqgaFOQCIUvCoKcfmOcU/h4Jz1IOkQij1vj3qEFln4J9sByOWHrhA8zD1Cf+LnXkbGVZg==",
+      "requires": {
+        "@babel/runtime-corejs3": "^7.20.7",
+        "@types/ramda": "=0.28.23",
+        "ramda": "=0.28.0",
+        "ramda-adjunct": "=3.4.0",
+        "stampit": "=4.3.2",
+        "unraw": "=2.0.1"
+      }
+    },
+    "@swagger-api/apidom-core": {
+      "version": "0.69.0",
+      "resolved": "https://registry.npmjs.org/@swagger-api/apidom-core/-/apidom-core-0.69.0.tgz",
+      "integrity": "sha512-n59Mz6JjgL5SJHne7om22+5RRfDNmM8oQ0NgHvWU44rHcmA/8Byxs28w6Ke2xgJFmLYasEw6hx1bwAATBLaa7w==",
+      "requires": {
+        "@babel/runtime-corejs3": "^7.20.7",
+        "@swagger-api/apidom-ast": "^0.69.0",
+        "@types/ramda": "=0.28.23",
+        "minim": "=0.23.8",
+        "ramda": "=0.28.0",
+        "ramda-adjunct": "=3.4.0",
+        "short-unique-id": "=4.4.4",
+        "stampit": "=4.3.2"
+      }
+    },
+    "@swagger-api/apidom-json-pointer": {
+      "version": "0.69.0",
+      "resolved": "https://registry.npmjs.org/@swagger-api/apidom-json-pointer/-/apidom-json-pointer-0.69.0.tgz",
+      "integrity": "sha512-TDcrES6POTBrQXDdq7VjlqFYZuZ/eqaxD9K2MUJcRckil+jxpDV0W38lgXE+c8Gjwvqqqce/izkilUgMA+ajFA==",
+      "requires": {
+        "@babel/runtime-corejs3": "^7.20.7",
+        "@swagger-api/apidom-core": "^0.69.0",
+        "@types/ramda": "=0.28.23",
+        "ramda": "=0.28.0",
+        "ramda-adjunct": "=3.4.0"
+      }
+    },
+    "@swagger-api/apidom-ns-api-design-systems": {
+      "version": "0.69.0",
+      "resolved": "https://registry.npmjs.org/@swagger-api/apidom-ns-api-design-systems/-/apidom-ns-api-design-systems-0.69.0.tgz",
+      "integrity": "sha512-1W5N4wL5I9n4dD6AJ1Bh49kphn+DXmwggUQhwsq7phxey4jiEXUNC9W/CQDXJp0wkFtNE6REn8yks9QGqfkemw==",
+      "optional": true,
+      "requires": {
+        "@babel/runtime-corejs3": "^7.20.7",
+        "@swagger-api/apidom-core": "^0.69.0",
+        "@swagger-api/apidom-ns-openapi-3-1": "^0.69.0",
+        "@types/ramda": "=0.28.23",
+        "ramda": "=0.28.0",
+        "ramda-adjunct": "=3.4.0",
+        "stampit": "=4.3.2"
+      }
+    },
+    "@swagger-api/apidom-ns-asyncapi-2": {
+      "version": "0.69.0",
+      "resolved": "https://registry.npmjs.org/@swagger-api/apidom-ns-asyncapi-2/-/apidom-ns-asyncapi-2-0.69.0.tgz",
+      "integrity": "sha512-D49mduzDwVQJp55+KoT8NozQEUsLMhCxbAnD4iY1E/v4uK7xSqQ3JW/Luunz6DNKWWtcWhgCiehmBwIjVAQN/A==",
+      "optional": true,
+      "requires": {
+        "@babel/runtime-corejs3": "^7.20.7",
+        "@swagger-api/apidom-core": "^0.69.0",
+        "@swagger-api/apidom-ns-json-schema-draft-7": "^0.69.0",
+        "@types/ramda": "=0.28.23",
+        "ramda": "=0.28.0",
+        "ramda-adjunct": "=3.4.0",
+        "stampit": "=4.3.2"
+      }
+    },
+    "@swagger-api/apidom-ns-json-schema-draft-4": {
+      "version": "0.69.0",
+      "resolved": "https://registry.npmjs.org/@swagger-api/apidom-ns-json-schema-draft-4/-/apidom-ns-json-schema-draft-4-0.69.0.tgz",
+      "integrity": "sha512-rRo226jITgG6DZNuk1oCuKFhr0giJ6GATyQtaaEmH9bhxB8i1eeES/LolJfo4donyejCb+imJN+L1fQ1N2YOYA==",
+      "requires": {
+        "@babel/runtime-corejs3": "^7.20.7",
+        "@swagger-api/apidom-core": "^0.69.0",
+        "@types/ramda": "=0.28.23",
+        "ramda": "=0.28.0",
+        "ramda-adjunct": "=3.4.0",
+        "stampit": "=4.3.2"
+      }
+    },
+    "@swagger-api/apidom-ns-json-schema-draft-6": {
+      "version": "0.69.0",
+      "resolved": "https://registry.npmjs.org/@swagger-api/apidom-ns-json-schema-draft-6/-/apidom-ns-json-schema-draft-6-0.69.0.tgz",
+      "integrity": "sha512-koLHh4TS3RtrWxcYX/tZobgnwUbjiFLOESiqe0FYvs82LXNwr+dveM8Umj89ACjpCd0Pq2J+5yvfNyvuIa6WFw==",
+      "optional": true,
+      "requires": {
+        "@babel/runtime-corejs3": "^7.20.7",
+        "@swagger-api/apidom-core": "^0.69.0",
+        "@swagger-api/apidom-ns-json-schema-draft-4": "^0.69.0",
+        "@types/ramda": "=0.28.23",
+        "ramda": "=0.28.0",
+        "ramda-adjunct": "=3.4.0",
+        "stampit": "=4.3.2"
+      }
+    },
+    "@swagger-api/apidom-ns-json-schema-draft-7": {
+      "version": "0.69.0",
+      "resolved": "https://registry.npmjs.org/@swagger-api/apidom-ns-json-schema-draft-7/-/apidom-ns-json-schema-draft-7-0.69.0.tgz",
+      "integrity": "sha512-OaEBBrgoDfqMPnZ0NCfg5HUJJ/V6XJ1AZ6OTW1AfJTqErLxYTgdNv52lYXKLiKkyLiH5olBBnPEKPPLg+DwUKQ==",
+      "optional": true,
+      "requires": {
+        "@babel/runtime-corejs3": "^7.20.7",
+        "@swagger-api/apidom-core": "^0.69.0",
+        "@swagger-api/apidom-ns-json-schema-draft-6": "^0.69.0",
+        "@types/ramda": "=0.28.23",
+        "ramda": "=0.28.0",
+        "ramda-adjunct": "=3.4.0",
+        "stampit": "=4.3.2"
+      }
+    },
+    "@swagger-api/apidom-ns-openapi-3-0": {
+      "version": "0.69.0",
+      "resolved": "https://registry.npmjs.org/@swagger-api/apidom-ns-openapi-3-0/-/apidom-ns-openapi-3-0-0.69.0.tgz",
+      "integrity": "sha512-rKgEd/k0MNV93DhwZ6yfUaIjbs6RfS9xB3QN9M6Lx5ZJktxNGAdpS/c3WEb5jBOpkQIJ6MaNI67Q0ZHHJTlrng==",
+      "requires": {
+        "@babel/runtime-corejs3": "^7.20.7",
+        "@swagger-api/apidom-core": "^0.69.0",
+        "@swagger-api/apidom-ns-json-schema-draft-4": "^0.69.0",
+        "@types/ramda": "=0.28.23",
+        "ramda": "=0.28.0",
+        "ramda-adjunct": "=3.4.0",
+        "stampit": "=4.3.2"
+      }
+    },
+    "@swagger-api/apidom-ns-openapi-3-1": {
+      "version": "0.69.0",
+      "resolved": "https://registry.npmjs.org/@swagger-api/apidom-ns-openapi-3-1/-/apidom-ns-openapi-3-1-0.69.0.tgz",
+      "integrity": "sha512-l5g4K09I4znwTcXbkBaE4JKmvEQ7Q831hzpBWZimcnUGrC8/nJ7eYUc04bjgbdDZd37B0zEzRn6w92ax7Hi2Fg==",
+      "requires": {
+        "@babel/runtime-corejs3": "^7.20.7",
+        "@swagger-api/apidom-core": "^0.69.0",
+        "@swagger-api/apidom-ns-openapi-3-0": "^0.69.0",
+        "@types/ramda": "=0.28.23",
+        "ramda": "=0.28.0",
+        "ramda-adjunct": "=3.4.0",
+        "stampit": "=4.3.2"
+      }
+    },
+    "@swagger-api/apidom-parser-adapter-api-design-systems-json": {
+      "version": "0.69.0",
+      "resolved": "https://registry.npmjs.org/@swagger-api/apidom-parser-adapter-api-design-systems-json/-/apidom-parser-adapter-api-design-systems-json-0.69.0.tgz",
+      "integrity": "sha512-oi52u6rmLrE+iXOk5wlx1NRXHd0NtGsxF1G+g2JTtC0oh5ETrj5fMGwMQwcBqYGTj3Y6vPJMkvVyaC46KUKg0Q==",
+      "optional": true,
+      "requires": {
+        "@babel/runtime-corejs3": "^7.20.7",
+        "@swagger-api/apidom-core": "^0.69.0",
+        "@swagger-api/apidom-ns-api-design-systems": "^0.69.0",
+        "@swagger-api/apidom-parser-adapter-json": "^0.69.0",
+        "@types/ramda": "=0.28.23",
+        "ramda": "=0.28.0",
+        "ramda-adjunct": "=3.4.0"
+      }
+    },
+    "@swagger-api/apidom-parser-adapter-api-design-systems-yaml": {
+      "version": "0.69.0",
+      "resolved": "https://registry.npmjs.org/@swagger-api/apidom-parser-adapter-api-design-systems-yaml/-/apidom-parser-adapter-api-design-systems-yaml-0.69.0.tgz",
+      "integrity": "sha512-bqgf+iHK3qrANJ5zrQJ+BoWrIftL4YhCfZyE/aWwnGW1BKdB4uGC94rx9DHhS8ZfNPz7AnW+ki6ISXpYOD8uyw==",
+      "optional": true,
+      "requires": {
+        "@babel/runtime-corejs3": "^7.20.7",
+        "@swagger-api/apidom-core": "^0.69.0",
+        "@swagger-api/apidom-ns-api-design-systems": "^0.69.0",
+        "@swagger-api/apidom-parser-adapter-yaml-1-2": "^0.69.0",
+        "@types/ramda": "=0.28.23",
+        "ramda": "=0.28.0",
+        "ramda-adjunct": "=3.4.0"
+      }
+    },
+    "@swagger-api/apidom-parser-adapter-asyncapi-json-2": {
+      "version": "0.69.0",
+      "resolved": "https://registry.npmjs.org/@swagger-api/apidom-parser-adapter-asyncapi-json-2/-/apidom-parser-adapter-asyncapi-json-2-0.69.0.tgz",
+      "integrity": "sha512-3b1nGsbFh6DAUDB9plQE5iyqOE37DZS/X34Hr+5ENiq7DFA/19UYeUSJQfU+kWjtFzRDHBRluPo38nHdGnh4gg==",
+      "optional": true,
+      "requires": {
+        "@babel/runtime-corejs3": "^7.20.7",
+        "@swagger-api/apidom-core": "^0.69.0",
+        "@swagger-api/apidom-ns-asyncapi-2": "^0.69.0",
+        "@swagger-api/apidom-parser-adapter-json": "^0.69.0",
+        "@types/ramda": "=0.28.23",
+        "ramda": "=0.28.0",
+        "ramda-adjunct": "=3.4.0"
+      }
+    },
+    "@swagger-api/apidom-parser-adapter-asyncapi-yaml-2": {
+      "version": "0.69.0",
+      "resolved": "https://registry.npmjs.org/@swagger-api/apidom-parser-adapter-asyncapi-yaml-2/-/apidom-parser-adapter-asyncapi-yaml-2-0.69.0.tgz",
+      "integrity": "sha512-JEuZw04wdtbn1WFkavB9Yn8MNAWtfUdlD6naa/Z4CL0iUOhC5BzG9dUfe6gn+Z+xtFRHm3MHMh9B6Xdr3MWDBg==",
+      "optional": true,
+      "requires": {
+        "@babel/runtime-corejs3": "^7.20.7",
+        "@swagger-api/apidom-core": "^0.69.0",
+        "@swagger-api/apidom-ns-asyncapi-2": "^0.69.0",
+        "@swagger-api/apidom-parser-adapter-yaml-1-2": "^0.69.0",
+        "@types/ramda": "=0.28.23",
+        "ramda": "=0.28.0",
+        "ramda-adjunct": "=3.4.0"
+      }
+    },
+    "@swagger-api/apidom-parser-adapter-json": {
+      "version": "0.69.0",
+      "resolved": "https://registry.npmjs.org/@swagger-api/apidom-parser-adapter-json/-/apidom-parser-adapter-json-0.69.0.tgz",
+      "integrity": "sha512-wNSYD9FU31aSBnCCp3Nt2ZZVAdu1LGGWmlLKmcOx7SXi79F1E+T6RtqyoLa0VBGKPVEwDtaH8kWRsZzXpUZVvQ==",
+      "optional": true,
+      "requires": {
+        "@babel/runtime-corejs3": "^7.20.7",
+        "@swagger-api/apidom-ast": "^0.69.0",
+        "@swagger-api/apidom-core": "^0.69.0",
+        "@types/ramda": "=0.28.23",
+        "ramda": "=0.28.0",
+        "ramda-adjunct": "=3.4.0",
+        "stampit": "=4.3.2",
+        "tree-sitter": "=0.20.1",
+        "tree-sitter-json": "=0.20.0",
+        "web-tree-sitter": "=0.20.7"
+      }
+    },
+    "@swagger-api/apidom-parser-adapter-openapi-json-3-0": {
+      "version": "0.69.0",
+      "resolved": "https://registry.npmjs.org/@swagger-api/apidom-parser-adapter-openapi-json-3-0/-/apidom-parser-adapter-openapi-json-3-0-0.69.0.tgz",
+      "integrity": "sha512-aSNFJ4he67c5Vz9+FbKKnJzy9JdmSDqzeog8CTiLI8TFrCvj9KQns68NbemyxHHc7uH9TcOwXq3WbXgXSWv60A==",
+      "optional": true,
+      "requires": {
+        "@babel/runtime-corejs3": "^7.20.7",
+        "@swagger-api/apidom-core": "^0.69.0",
+        "@swagger-api/apidom-ns-openapi-3-0": "^0.69.0",
+        "@swagger-api/apidom-parser-adapter-json": "^0.69.0",
+        "@types/ramda": "=0.28.23",
+        "ramda": "=0.28.0",
+        "ramda-adjunct": "=3.4.0"
+      }
+    },
+    "@swagger-api/apidom-parser-adapter-openapi-json-3-1": {
+      "version": "0.69.0",
+      "resolved": "https://registry.npmjs.org/@swagger-api/apidom-parser-adapter-openapi-json-3-1/-/apidom-parser-adapter-openapi-json-3-1-0.69.0.tgz",
+      "integrity": "sha512-7TCnTTKMVTyDiX7MKhphmqUaoKtWLOgKCaPEtBRFgd94yOkobWBKw7yG6G+0rdsCIb4Q9AFcL39eUDh5yI45/w==",
+      "optional": true,
+      "requires": {
+        "@babel/runtime-corejs3": "^7.20.7",
+        "@swagger-api/apidom-core": "^0.69.0",
+        "@swagger-api/apidom-ns-openapi-3-1": "^0.69.0",
+        "@swagger-api/apidom-parser-adapter-json": "^0.69.0",
+        "@types/ramda": "=0.28.23",
+        "ramda": "=0.28.0",
+        "ramda-adjunct": "=3.4.0"
+      }
+    },
+    "@swagger-api/apidom-parser-adapter-openapi-yaml-3-0": {
+      "version": "0.69.0",
+      "resolved": "https://registry.npmjs.org/@swagger-api/apidom-parser-adapter-openapi-yaml-3-0/-/apidom-parser-adapter-openapi-yaml-3-0-0.69.0.tgz",
+      "integrity": "sha512-mrKLsNMsJr5Z4cUDO4v5vt59uGGWfLL36hTuSKcqO9IH/3nziPrYJ7Kd4VdiJaQYqFuUQCEG7A2pOZfkpbR1KA==",
+      "optional": true,
+      "requires": {
+        "@babel/runtime-corejs3": "^7.20.7",
+        "@swagger-api/apidom-core": "^0.69.0",
+        "@swagger-api/apidom-ns-openapi-3-0": "^0.69.0",
+        "@swagger-api/apidom-parser-adapter-yaml-1-2": "^0.69.0",
+        "@types/ramda": "=0.28.23",
+        "ramda": "=0.28.0",
+        "ramda-adjunct": "=3.4.0"
+      }
+    },
+    "@swagger-api/apidom-parser-adapter-openapi-yaml-3-1": {
+      "version": "0.69.0",
+      "resolved": "https://registry.npmjs.org/@swagger-api/apidom-parser-adapter-openapi-yaml-3-1/-/apidom-parser-adapter-openapi-yaml-3-1-0.69.0.tgz",
+      "integrity": "sha512-tEyNhlGoQ7/CnC0K3NqBWfhi90U+5fFDl7Z2PyV/+fRG1F0okAoHwp9+Q3/BieWdiZ5OChX8yxwOdq1kJ2+TTQ==",
+      "optional": true,
+      "requires": {
+        "@babel/runtime-corejs3": "^7.20.7",
+        "@swagger-api/apidom-core": "^0.69.0",
+        "@swagger-api/apidom-ns-openapi-3-1": "^0.69.0",
+        "@swagger-api/apidom-parser-adapter-yaml-1-2": "^0.69.0",
+        "@types/ramda": "=0.28.23",
+        "ramda": "=0.28.0",
+        "ramda-adjunct": "=3.4.0"
+      }
+    },
+    "@swagger-api/apidom-parser-adapter-yaml-1-2": {
+      "version": "0.69.0",
+      "resolved": "https://registry.npmjs.org/@swagger-api/apidom-parser-adapter-yaml-1-2/-/apidom-parser-adapter-yaml-1-2-0.69.0.tgz",
+      "integrity": "sha512-wfvFXg9xSz89hg/MRd1u6ESUb2UQmVJVIS2wWZwi1UXN9+F3Yh2l8RB5JchJYb5bqu2HX1ZYJ6FxG3dQTQICyQ==",
+      "optional": true,
+      "requires": {
+        "@babel/runtime-corejs3": "^7.20.7",
+        "@swagger-api/apidom-ast": "^0.69.0",
+        "@swagger-api/apidom-core": "^0.69.0",
+        "@types/ramda": "=0.28.23",
+        "ramda": "=0.28.0",
+        "ramda-adjunct": "=3.4.0",
+        "stampit": "=4.3.2",
+        "tree-sitter": "=0.20.1",
+        "tree-sitter-yaml": "=0.5.0",
+        "web-tree-sitter": "=0.20.7"
+      }
+    },
+    "@swagger-api/apidom-reference": {
+      "version": "0.69.0",
+      "resolved": "https://registry.npmjs.org/@swagger-api/apidom-reference/-/apidom-reference-0.69.0.tgz",
+      "integrity": "sha512-Sc3My/qTa90ofWXRaULkQ2oCUlgUCTbPN209jk/Lg0cywPTgeVEVn7Awpp2ftxl007uPPr2PwUzn/K6zzj+gyg==",
+      "requires": {
+        "@babel/runtime-corejs3": "^7.20.7",
+        "@swagger-api/apidom-core": "^0.69.0",
+        "@swagger-api/apidom-json-pointer": "^0.69.0",
+        "@swagger-api/apidom-ns-asyncapi-2": "^0.69.0",
+        "@swagger-api/apidom-ns-openapi-3-0": "^0.69.0",
+        "@swagger-api/apidom-ns-openapi-3-1": "^0.69.0",
+        "@swagger-api/apidom-parser-adapter-api-design-systems-json": "^0.69.0",
+        "@swagger-api/apidom-parser-adapter-api-design-systems-yaml": "^0.69.0",
+        "@swagger-api/apidom-parser-adapter-asyncapi-json-2": "^0.69.0",
+        "@swagger-api/apidom-parser-adapter-asyncapi-yaml-2": "^0.69.0",
+        "@swagger-api/apidom-parser-adapter-json": "^0.69.0",
+        "@swagger-api/apidom-parser-adapter-openapi-json-3-0": "^0.69.0",
+        "@swagger-api/apidom-parser-adapter-openapi-json-3-1": "^0.69.0",
+        "@swagger-api/apidom-parser-adapter-openapi-yaml-3-0": "^0.69.0",
+        "@swagger-api/apidom-parser-adapter-openapi-yaml-3-1": "^0.69.0",
+        "@swagger-api/apidom-parser-adapter-yaml-1-2": "^0.69.0",
+        "@types/ramda": "=0.28.23",
+        "axios": "=1.3.4",
+        "minimatch": "=7.3.0",
+        "process": "=0.11.10",
+        "ramda": "=0.28.0",
+        "ramda-adjunct": "=3.4.0",
+        "stampit": "=4.3.2"
+      },
+      "dependencies": {
+        "brace-expansion": {
+          "version": "2.0.1",
+          "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz",
+          "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==",
+          "requires": {
+            "balanced-match": "^1.0.0"
+          }
+        },
+        "minimatch": {
+          "version": "7.3.0",
+          "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-7.3.0.tgz",
+          "integrity": "sha512-WaMDuhKa7a6zKiwplR1AOz+zGvJba24k5VU1Cy6NhEguavT2YRlHxuINUgTas4wiS6fwBpYq4TcA1XIECSntyw==",
+          "requires": {
+            "brace-expansion": "^2.0.1"
+          }
+        }
+      }
+    },
     "@swimlane/ngx-datatable": {
       "version": "18.0.0",
       "resolved": "https://registry.npmjs.org/@swimlane/ngx-datatable/-/ngx-datatable-18.0.0.tgz",
     "@swimlane/ngx-datatable": {
       "version": "18.0.0",
       "resolved": "https://registry.npmjs.org/@swimlane/ngx-datatable/-/ngx-datatable-18.0.0.tgz",
       "integrity": "sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw==",
       "dev": true
     },
       "integrity": "sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw==",
       "dev": true
     },
-    "@trysound/sax": {
-      "version": "0.2.0",
-      "resolved": "https://registry.npmjs.org/@trysound/sax/-/sax-0.2.0.tgz",
-      "integrity": "sha512-L7z9BgrNEcYyUYtF+HaEfiS5ebkh9jXqbszz7pC0hRBPaatV0XjSD3+eHrpqFemQfgwiFF0QPIarnIihIDn7OA==",
-      "dev": true
-    },
     "@ts-morph/common": {
     "@ts-morph/common": {
-      "version": "0.11.1",
-      "resolved": "https://registry.npmjs.org/@ts-morph/common/-/common-0.11.1.tgz",
-      "integrity": "sha512-7hWZS0NRpEsNV8vWJzg7FEz6V8MaLNeJOmwmghqUXTpzk16V1LLZhdo+4QvE/+zv4cVci0OviuJFnqhEfoV3+g==",
+      "version": "0.12.3",
+      "resolved": "https://registry.npmjs.org/@ts-morph/common/-/common-0.12.3.tgz",
+      "integrity": "sha512-4tUmeLyXJnJWvTFOKtcNJ1yh0a3SsTLi2MUoyj8iUNznFRN1ZquaNe7Oukqrnki2FzZkm0J9adCNLDZxUzvj+w==",
       "dev": true,
       "requires": {
         "fast-glob": "^3.2.7",
       "dev": true,
       "requires": {
         "fast-glob": "^3.2.7",
       }
     },
     "@types/babel__core": {
       }
     },
     "@types/babel__core": {
-      "version": "7.1.19",
-      "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.1.19.tgz",
-      "integrity": "sha512-WEOTgRsbYkvA/KCsDwVEGkd7WAr1e3g31VHQ8zy5gul/V1qKullU/BU5I68X5v7V3GnB9eotmom4v5a5gjxorw==",
+      "version": "7.20.0",
+      "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.0.tgz",
+      "integrity": "sha512-+n8dL/9GWblDO0iU6eZAwEIJVr5DWigtle+Q6HLOrh/pdbXOhOtqzq8VPPE2zvNJzSKY4vH/z3iT3tn0A3ypiQ==",
       "dev": true,
       "requires": {
       "dev": true,
       "requires": {
-        "@babel/parser": "^7.1.0",
-        "@babel/types": "^7.0.0",
+        "@babel/parser": "^7.20.7",
+        "@babel/types": "^7.20.7",
         "@types/babel__generator": "*",
         "@types/babel__template": "*",
         "@types/babel__traverse": "*"
         "@types/babel__generator": "*",
         "@types/babel__template": "*",
         "@types/babel__traverse": "*"
       }
     },
     "@types/babel__traverse": {
       }
     },
     "@types/babel__traverse": {
-      "version": "7.18.0",
-      "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.18.0.tgz",
-      "integrity": "sha512-v4Vwdko+pgymgS+A2UIaJru93zQd85vIGWObM5ekZNdXCKtDYqATlEYnWgfo86Q6I1Lh0oXnksDnMU1cwmlPDw==",
+      "version": "7.18.3",
+      "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.18.3.tgz",
+      "integrity": "sha512-1kbcJ40lLB7MHsj39U4Sh1uTd2E7rLEa79kmDpI6cy+XiXsteB3POdQomoq4FxszMrO3ZYchkhYJw7A2862b3w==",
       "dev": true,
       "requires": {
         "@babel/types": "^7.3.0"
       }
     },
       "dev": true,
       "requires": {
         "@babel/types": "^7.3.0"
       }
     },
-    "@types/brace-expansion": {
-      "version": "1.1.0",
-      "resolved": "https://registry.npmjs.org/@types/brace-expansion/-/brace-expansion-1.1.0.tgz",
-      "integrity": "sha512-SaU/Kgp6z40CiF9JxlsrSrBEa+8YIry9IiCPhhYSNekeEhIAkY7iyu9aZ+5dSQIdo7mf86MUVvxWYm5GAzB/0g==",
-      "dev": true
+    "@types/body-parser": {
+      "version": "1.19.2",
+      "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.2.tgz",
+      "integrity": "sha512-ALYone6pm6QmwZoAgeyNksccT9Q4AWZQ6PvfwR37GT6r6FWUPguq6sUmNGSMV2Wr761oQoBxwGGa6DR5o1DC9g==",
+      "dev": true,
+      "requires": {
+        "@types/connect": "*",
+        "@types/node": "*"
+      }
+    },
+    "@types/bonjour": {
+      "version": "3.5.10",
+      "resolved": "https://registry.npmjs.org/@types/bonjour/-/bonjour-3.5.10.tgz",
+      "integrity": "sha512-p7ienRMiS41Nu2/igbJxxLDWrSZ0WxM8UQgCeO9KhoVF7cOVFkrKsiDr1EsJIla8vV3oEEjGcz11jc5yimhzZw==",
+      "dev": true,
+      "requires": {
+        "@types/node": "*"
+      }
+    },
+    "@types/brace-expansion": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npmjs.org/@types/brace-expansion/-/brace-expansion-1.1.0.tgz",
+      "integrity": "sha512-SaU/Kgp6z40CiF9JxlsrSrBEa+8YIry9IiCPhhYSNekeEhIAkY7iyu9aZ+5dSQIdo7mf86MUVvxWYm5GAzB/0g==",
+      "dev": true
     },
     "@types/chart.js": {
       "version": "2.9.37",
     },
     "@types/chart.js": {
       "version": "2.9.37",
         "moment": "^2.10.2"
       }
     },
         "moment": "^2.10.2"
       }
     },
+    "@types/connect": {
+      "version": "3.4.35",
+      "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.35.tgz",
+      "integrity": "sha512-cdeYyv4KWoEgpBISTxWvqYsVy444DOqehiF3fM3ne10AmJ62RSyNkUnxMJXHQWRQQX2eR94m5y1IZyDwBjV9FQ==",
+      "dev": true,
+      "requires": {
+        "@types/node": "*"
+      }
+    },
+    "@types/connect-history-api-fallback": {
+      "version": "1.3.5",
+      "resolved": "https://registry.npmjs.org/@types/connect-history-api-fallback/-/connect-history-api-fallback-1.3.5.tgz",
+      "integrity": "sha512-h8QJa8xSb1WD4fpKBDcATDNGXghFj6/3GRWG6dhmRcu0RX1Ubasur2Uvx5aeEwlf0MwblEC2bMzzMQntxnw/Cw==",
+      "dev": true,
+      "requires": {
+        "@types/express-serve-static-core": "*",
+        "@types/node": "*"
+      }
+    },
     "@types/cypress-cucumber-preprocessor": {
       "version": "4.0.1",
       "resolved": "https://registry.npmjs.org/@types/cypress-cucumber-preprocessor/-/cypress-cucumber-preprocessor-4.0.1.tgz",
     "@types/cypress-cucumber-preprocessor": {
       "version": "4.0.1",
       "resolved": "https://registry.npmjs.org/@types/cypress-cucumber-preprocessor/-/cypress-cucumber-preprocessor-4.0.1.tgz",
       "dev": true
     },
     "@types/eslint": {
       "dev": true
     },
     "@types/eslint": {
-      "version": "8.4.6",
-      "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.4.6.tgz",
-      "integrity": "sha512-/fqTbjxyFUaYNO7VcW5g+4npmqVACz1bB7RTHYuLj+PRjw9hrCwrUXVQFpChUS0JsyEFvMZ7U/PfmvWgxJhI9g==",
+      "version": "8.21.1",
+      "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.21.1.tgz",
+      "integrity": "sha512-rc9K8ZpVjNcLs8Fp0dkozd5Pt2Apk1glO4Vgz8ix1u6yFByxfqo5Yavpy65o+93TAe24jr7v+eSBtFLvOQtCRQ==",
       "dev": true,
       "requires": {
         "@types/estree": "*",
       "dev": true,
       "requires": {
         "@types/estree": "*",
       }
     },
     "@types/estree": {
       }
     },
     "@types/estree": {
-      "version": "0.0.50",
-      "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.50.tgz",
-      "integrity": "sha512-C6N5s2ZFtuZRj54k2/zyRhNDjJwwcViAM3Nbm8zjBpbqAdZ00mr0CFxvSKeO8Y/e03WVFLpQMdHYVfUd6SB+Hw==",
+      "version": "0.0.51",
+      "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.51.tgz",
+      "integrity": "sha512-CuPgU6f3eT/XgKKPqKd/gLZV1Xmvf1a2R5POBOGQa6uv82xpls89HU5zKeVoyR8XzHd1RGNOlQlvUe3CFkjWNQ==",
       "dev": true
     },
       "dev": true
     },
-    "@types/file-saver": {
-      "version": "2.0.1",
-      "resolved": "https://registry.npmjs.org/@types/file-saver/-/file-saver-2.0.1.tgz",
-      "integrity": "sha512-g1QUuhYVVAamfCifK7oB7G3aIl4BbOyzDOqVyUfEr4tfBKrXfeH+M+Tg7HKCXSrbzxYdhyCP7z9WbKo0R2hBCw=="
+    "@types/express": {
+      "version": "4.17.17",
+      "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.17.tgz",
+      "integrity": "sha512-Q4FmmuLGBG58btUnfS1c1r/NQdlp3DMfGDGig8WhfpA2YRUtEkxAjkZb0yvplJGYdF1fsQ81iMDcH24sSCNC/Q==",
+      "dev": true,
+      "requires": {
+        "@types/body-parser": "*",
+        "@types/express-serve-static-core": "^4.17.33",
+        "@types/qs": "*",
+        "@types/serve-static": "*"
+      }
     },
     },
-    "@types/glob": {
-      "version": "7.2.0",
-      "resolved": "https://registry.npmjs.org/@types/glob/-/glob-7.2.0.tgz",
-      "integrity": "sha512-ZUxbzKl0IfJILTS6t7ip5fQQM/J3TJYubDm3nMbgubNNYS62eXeUpoLUC8/7fJNiFYHTrGPQn7hspDUzIHX3UA==",
+    "@types/express-serve-static-core": {
+      "version": "4.17.33",
+      "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.33.tgz",
+      "integrity": "sha512-TPBqmR/HRYI3eC2E5hmiivIzv+bidAfXofM+sbonAGvyDhySGw9/PQZFt2BLOrjUUR++4eJVpx6KnLQK1Fk9tA==",
       "dev": true,
       "requires": {
       "dev": true,
       "requires": {
-        "@types/minimatch": "*",
-        "@types/node": "*"
+        "@types/node": "*",
+        "@types/qs": "*",
+        "@types/range-parser": "*"
       }
     },
       }
     },
+    "@types/file-saver": {
+      "version": "2.0.1",
+      "resolved": "https://registry.npmjs.org/@types/file-saver/-/file-saver-2.0.1.tgz",
+      "integrity": "sha512-g1QUuhYVVAamfCifK7oB7G3aIl4BbOyzDOqVyUfEr4tfBKrXfeH+M+Tg7HKCXSrbzxYdhyCP7z9WbKo0R2hBCw=="
+    },
     "@types/graceful-fs": {
     "@types/graceful-fs": {
-      "version": "4.1.5",
-      "resolved": "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.5.tgz",
-      "integrity": "sha512-anKkLmZZ+xm4p8JWBf4hElkM4XR+EZeA2M9BAkkTldmcyDY4mbdIJnRghDJH3Ov5ooY7/UAoENtmdMSkaAd7Cw==",
+      "version": "4.1.6",
+      "resolved": "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.6.tgz",
+      "integrity": "sha512-Sig0SNORX9fdW+bQuTEovKj3uHcUL6LQKbCrrqb1X7J6/ReAbhCXRAhc+SMejhLELFj2QcyuxmUooZ4bt5ReSw==",
       "dev": true,
       "requires": {
         "@types/node": "*"
       "dev": true,
       "requires": {
         "@types/node": "*"
         "hoist-non-react-statics": "^3.3.0"
       }
     },
         "hoist-non-react-statics": "^3.3.0"
       }
     },
+    "@types/http-proxy": {
+      "version": "1.17.10",
+      "resolved": "https://registry.npmjs.org/@types/http-proxy/-/http-proxy-1.17.10.tgz",
+      "integrity": "sha512-Qs5aULi+zV1bwKAg5z1PWnDXWmsn+LxIvUGv6E2+OOMYhclZMO+OXd9pYVf2gLykf2I7IV2u7oTHwChPNsvJ7g==",
+      "dev": true,
+      "requires": {
+        "@types/node": "*"
+      }
+    },
     "@types/istanbul-lib-coverage": {
       "version": "2.0.4",
       "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.4.tgz",
     "@types/istanbul-lib-coverage": {
       "version": "2.0.4",
       "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.4.tgz",
       }
     },
     "@types/istanbul-reports": {
       }
     },
     "@types/istanbul-reports": {
-      "version": "1.1.2",
-      "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-1.1.2.tgz",
-      "integrity": "sha512-P/W9yOX/3oPZSpaYOCQzGqgCQRXn0FFO/V8bWrCQs+wLmvVVxk6CRBXALEvNs9OHIatlnlFokfhuDo2ug01ciw==",
+      "version": "3.0.1",
+      "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.1.tgz",
+      "integrity": "sha512-c3mAZEuK0lvBp8tmuL74XRKn1+y2dcwOUpH7x4WrF6gk1GIgiluDRgMYQtw2OFcBvAJWlt6ASU3tSqxp0Uu0Aw==",
       "dev": true,
       "requires": {
       "dev": true,
       "requires": {
-        "@types/istanbul-lib-coverage": "*",
         "@types/istanbul-lib-report": "*"
       }
     },
     "@types/jest": {
         "@types/istanbul-lib-report": "*"
       }
     },
     "@types/jest": {
-      "version": "26.0.14",
-      "resolved": "https://registry.npmjs.org/@types/jest/-/jest-26.0.14.tgz",
-      "integrity": "sha512-Hz5q8Vu0D288x3iWXePSn53W7hAjP0H7EQ6QvDO9c7t46mR0lNOLlfuwQ+JkVxuhygHzlzPX+0jKdA3ZgSh+Vg==",
+      "version": "28.1.3",
+      "resolved": "https://registry.npmjs.org/@types/jest/-/jest-28.1.3.tgz",
+      "integrity": "sha512-Tsbjk8Y2hkBaY/gJsataeb4q9Mubw9EOz7+4RjPkzD5KjTvHHs7cpws22InaoXxAVAhF5HfFbzJjo6oKWqSZLw==",
+      "dev": true,
+      "requires": {
+        "jest-matcher-utils": "^28.0.0",
+        "pretty-format": "^28.0.0"
+      }
+    },
+    "@types/jsdom": {
+      "version": "16.2.15",
+      "resolved": "https://registry.npmjs.org/@types/jsdom/-/jsdom-16.2.15.tgz",
+      "integrity": "sha512-nwF87yjBKuX/roqGYerZZM0Nv1pZDMAT5YhOHYeM/72Fic+VEqJh4nyoqoapzJnW3pUlfxPY5FhgsJtM+dRnQQ==",
       "dev": true,
       "requires": {
       "dev": true,
       "requires": {
-        "jest-diff": "^25.2.1",
-        "pretty-format": "^25.2.1"
+        "@types/node": "*",
+        "@types/parse5": "^6.0.3",
+        "@types/tough-cookie": "*"
       }
     },
     "@types/json-schema": {
       }
     },
     "@types/json-schema": {
         "@types/unist": "*"
       }
     },
         "@types/unist": "*"
       }
     },
+    "@types/mime": {
+      "version": "3.0.1",
+      "resolved": "https://registry.npmjs.org/@types/mime/-/mime-3.0.1.tgz",
+      "integrity": "sha512-Y4XFY5VJAuw0FgAqPNd6NNoV44jbq9Bz2L7Rh/J6jLTiHBSBJa9fxqQIvkIld4GsoDOcCbvzOUAbLPsSKKg+uA==",
+      "dev": true
+    },
     "@types/minimatch": {
       "version": "3.0.5",
       "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-3.0.5.tgz",
     "@types/minimatch": {
       "version": "3.0.5",
       "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-3.0.5.tgz",
       "integrity": "sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA==",
       "dev": true
     },
       "integrity": "sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA==",
       "dev": true
     },
+    "@types/parse5": {
+      "version": "6.0.3",
+      "resolved": "https://registry.npmjs.org/@types/parse5/-/parse5-6.0.3.tgz",
+      "integrity": "sha512-SuT16Q1K51EAVPz1K29DJ/sXjhSQ0zjvsypYJ6tlwVsRV9jwW5Adq2ch8Dq8kDBCkYnELS7N7VNCSB5nC56t/g==",
+      "dev": true
+    },
     "@types/prettier": {
     "@types/prettier": {
-      "version": "2.7.0",
-      "resolved": "https://registry.npmjs.org/@types/prettier/-/prettier-2.7.0.tgz",
-      "integrity": "sha512-RI1L7N4JnW5gQw2spvL7Sllfuf1SaHdrZpCHiBlCXjIlufi1SMNnbu2teze3/QE67Fg2tBlH7W+mi4hVNk4p0A==",
+      "version": "2.7.2",
+      "resolved": "https://registry.npmjs.org/@types/prettier/-/prettier-2.7.2.tgz",
+      "integrity": "sha512-KufADq8uQqo1pYKVIYzfKbJfBAc0sOeXqGbFaSpv8MRmC/zXgowNZmFcbngndGk922QDmOASEXUZCaY48gs4cg==",
       "dev": true
     },
     "@types/prop-types": {
       "dev": true
     },
     "@types/prop-types": {
       "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.5.tgz",
       "integrity": "sha512-JCB8C6SnDoQf0cNycqd/35A7MjcnK+ZTqE7judS6o7utxUCg6imJg3QK2qzHKszlTjcj2cn+NwMB2i96ubpj7w=="
     },
       "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.5.tgz",
       "integrity": "sha512-JCB8C6SnDoQf0cNycqd/35A7MjcnK+ZTqE7judS6o7utxUCg6imJg3QK2qzHKszlTjcj2cn+NwMB2i96ubpj7w=="
     },
+    "@types/qs": {
+      "version": "6.9.7",
+      "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.7.tgz",
+      "integrity": "sha512-FGa1F62FT09qcrueBA6qYTrJPVDzah9a+493+o2PCXsesWHIn27G98TsSMs3WPNbZIEj4+VJf6saSFpvD+3Zsw==",
+      "dev": true
+    },
+    "@types/ramda": {
+      "version": "0.28.23",
+      "resolved": "https://registry.npmjs.org/@types/ramda/-/ramda-0.28.23.tgz",
+      "integrity": "sha512-9TYWiwkew+mCMsL7jZ+kkzy6QXn8PL5/SKmBPmjgUlTpkokZWTBr+OhiIUDztpAEbslWyt24NNfEmZUBFmnXig==",
+      "requires": {
+        "ts-toolbelt": "^6.15.1"
+      }
+    },
+    "@types/range-parser": {
+      "version": "1.2.4",
+      "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.4.tgz",
+      "integrity": "sha512-EEhsLsD6UsDM1yFhAvy0Cjr6VwmpMWqFBCb9w07wVugF7w9nfajxLuVmngTIpgS6svCnm6Vaw+MZhoDCKnOfsw==",
+      "dev": true
+    },
     "@types/react": {
     "@types/react": {
-      "version": "18.0.17",
-      "resolved": "https://registry.npmjs.org/@types/react/-/react-18.0.17.tgz",
-      "integrity": "sha512-38ETy4tL+rn4uQQi7mB81G7V1g0u2ryquNmsVIOKUAEIDK+3CUjZ6rSRpdvS99dNBnkLFL83qfmtLacGOTIhwQ==",
+      "version": "18.0.28",
+      "resolved": "https://registry.npmjs.org/@types/react/-/react-18.0.28.tgz",
+      "integrity": "sha512-RD0ivG1kEztNBdoAK7lekI9M+azSnitIn85h4iOiaLjaTrMjzslhaqCGaI4IyCJ1RljWiLCEu4jyrLLgqxBTew==",
       "requires": {
         "@types/prop-types": "*",
         "@types/scheduler": "*",
       "requires": {
         "@types/prop-types": "*",
         "@types/scheduler": "*",
       }
     },
     "@types/react-redux": {
       }
     },
     "@types/react-redux": {
-      "version": "7.1.24",
-      "resolved": "https://registry.npmjs.org/@types/react-redux/-/react-redux-7.1.24.tgz",
-      "integrity": "sha512-7FkurKcS1k0FHZEtdbbgN8Oc6b+stGSfZYjQGicofJ0j4U0qIn/jaSvnP2pLwZKiai3/17xqqxkkrxTgN8UNbQ==",
+      "version": "7.1.25",
+      "resolved": "https://registry.npmjs.org/@types/react-redux/-/react-redux-7.1.25.tgz",
+      "integrity": "sha512-bAGh4e+w5D8dajd6InASVIyCo4pZLJ66oLb80F9OBLO1gKESbZcRCJpTT6uLXX+HAB57zw1WTdwJdAsewuTweg==",
       "requires": {
         "@types/hoist-non-react-statics": "^3.3.0",
         "@types/react": "*",
       "requires": {
         "@types/hoist-non-react-statics": "^3.3.0",
         "@types/react": "*",
         "redux": "^4.0.0"
       }
     },
         "redux": "^4.0.0"
       }
     },
+    "@types/retry": {
+      "version": "0.12.0",
+      "resolved": "https://registry.npmjs.org/@types/retry/-/retry-0.12.0.tgz",
+      "integrity": "sha512-wWKOClTTiizcZhXnPY4wikVAwmdYHp8q6DmC+EJUzAMsycb7HB32Kh9RN4+0gExjmPmZSAQjgURXIGATPegAvA==",
+      "dev": true
+    },
     "@types/scheduler": {
       "version": "0.16.2",
       "resolved": "https://registry.npmjs.org/@types/scheduler/-/scheduler-0.16.2.tgz",
       "integrity": "sha512-hppQEBDmlwhFAXKJX2KnWLYu5yMfi91yazPb2l+lbJiwW+wdo1gNeRA+3RgNSO39WYX2euey41KEwnqesU2Jew=="
     },
     "@types/scheduler": {
       "version": "0.16.2",
       "resolved": "https://registry.npmjs.org/@types/scheduler/-/scheduler-0.16.2.tgz",
       "integrity": "sha512-hppQEBDmlwhFAXKJX2KnWLYu5yMfi91yazPb2l+lbJiwW+wdo1gNeRA+3RgNSO39WYX2euey41KEwnqesU2Jew=="
     },
-    "@types/simplebar": {
-      "version": "5.1.1",
-      "resolved": "https://registry.npmjs.org/@types/simplebar/-/simplebar-5.1.1.tgz",
-      "integrity": "sha512-nC9iBQ4dfvvzJ3iAbL1qCfwjUyaF8EO56l/ApcRXUFK2zLOb8GDXC55V08JZvpzkUxGHtWVunp17KKH/3/KFJA==",
-      "dev": true
+    "@types/serve-index": {
+      "version": "1.9.1",
+      "resolved": "https://registry.npmjs.org/@types/serve-index/-/serve-index-1.9.1.tgz",
+      "integrity": "sha512-d/Hs3nWDxNL2xAczmOVZNj92YZCS6RGxfBPjKzuu/XirCgXdpKEb88dYNbrYGint6IVWLNP+yonwVAuRC0T2Dg==",
+      "dev": true,
+      "requires": {
+        "@types/express": "*"
+      }
+    },
+    "@types/serve-static": {
+      "version": "1.15.1",
+      "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.1.tgz",
+      "integrity": "sha512-NUo5XNiAdULrJENtJXZZ3fHtfMolzZwczzBbnAeBbqBwG+LaG6YaJtuwzwGSQZ2wsCrxjEhNNjAkKigy3n8teQ==",
+      "dev": true,
+      "requires": {
+        "@types/mime": "*",
+        "@types/node": "*"
+      }
     },
     "@types/sinonjs__fake-timers": {
       "version": "8.1.1",
     },
     "@types/sinonjs__fake-timers": {
       "version": "8.1.1",
       "integrity": "sha512-JYM8x9EGF163bEyhdJBpR2QX1R5naCJHC8ucJylJ3w9/CVBaskdQ8WqBf8MmQrd1kRvp/a4TS8HJ+bxzR7ZJYQ==",
       "dev": true
     },
       "integrity": "sha512-JYM8x9EGF163bEyhdJBpR2QX1R5naCJHC8ucJylJ3w9/CVBaskdQ8WqBf8MmQrd1kRvp/a4TS8HJ+bxzR7ZJYQ==",
       "dev": true
     },
-    "@types/source-list-map": {
-      "version": "0.1.2",
-      "resolved": "https://registry.npmjs.org/@types/source-list-map/-/source-list-map-0.1.2.tgz",
-      "integrity": "sha512-K5K+yml8LTo9bWJI/rECfIPrGgxdpeNbj+d53lwN4QjW1MCwlkhUms+gtdzigTeUyBr09+u8BwOIY3MXvHdcsA==",
-      "dev": true
+    "@types/sockjs": {
+      "version": "0.3.33",
+      "resolved": "https://registry.npmjs.org/@types/sockjs/-/sockjs-0.3.33.tgz",
+      "integrity": "sha512-f0KEEe05NvUnat+boPTZ0dgaLZ4SfSouXUgv5noUiefG2ajgKjmETo9ZJyuqsl7dfl2aHlLJUiki6B4ZYldiiw==",
+      "dev": true,
+      "requires": {
+        "@types/node": "*"
+      }
     },
     "@types/stack-utils": {
       "version": "2.0.1",
     },
     "@types/stack-utils": {
       "version": "2.0.1",
       "integrity": "sha512-SlufixEmh+8CLHNgTfAfCT1icNOF7bXboWabhHr1+hIolqlvfwYJGe7HgRcpI3ChE7HWASmEKLkMu34rxseJjQ==",
       "dev": true
     },
       "integrity": "sha512-SlufixEmh+8CLHNgTfAfCT1icNOF7bXboWabhHr1+hIolqlvfwYJGe7HgRcpI3ChE7HWASmEKLkMu34rxseJjQ==",
       "dev": true
     },
+    "@types/tough-cookie": {
+      "version": "4.0.2",
+      "resolved": "https://registry.npmjs.org/@types/tough-cookie/-/tough-cookie-4.0.2.tgz",
+      "integrity": "sha512-Q5vtl1W5ue16D+nIaW8JWebSSraJVlK+EthKn7e7UcD4KWsaSJ8BqGPXNaPghgtcn/fhvrN17Tv8ksUsQpiplw==",
+      "dev": true
+    },
     "@types/unist": {
       "version": "2.0.6",
       "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.6.tgz",
     "@types/unist": {
       "version": "2.0.6",
       "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.6.tgz",
       "integrity": "sha512-BgeaZuElf7DEYZhWYDTc/XcLZXdVgFkVSTa13BqKvbnmUrxr3TJFKofUxCtDO9UQOdhnV+HPOESdHiHKZOJV1A==",
       "dev": true
     },
       "integrity": "sha512-BgeaZuElf7DEYZhWYDTc/XcLZXdVgFkVSTa13BqKvbnmUrxr3TJFKofUxCtDO9UQOdhnV+HPOESdHiHKZOJV1A==",
       "dev": true
     },
-    "@types/webpack-sources": {
-      "version": "0.1.9",
-      "resolved": "https://registry.npmjs.org/@types/webpack-sources/-/webpack-sources-0.1.9.tgz",
-      "integrity": "sha512-bvzMnzqoK16PQIC8AYHNdW45eREJQMd6WG/msQWX5V2+vZmODCOPb4TJcbgRljTZZTwTM4wUMcsI8FftNA7new==",
+    "@types/ws": {
+      "version": "8.5.4",
+      "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.5.4.tgz",
+      "integrity": "sha512-zdQDHKUgcX/zBc4GrwsE/7dVdAD8JR4EuiAXiiUhhfyIJXXb2+PrGshFyeXWQPMmmZ2XxgaqclgpIC7eTXc1mg==",
       "dev": true,
       "requires": {
       "dev": true,
       "requires": {
-        "@types/node": "*",
-        "@types/source-list-map": "*",
-        "source-map": "^0.6.1"
-      },
-      "dependencies": {
-        "source-map": {
-          "version": "0.6.1",
-          "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
-          "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
-          "dev": true
-        }
+        "@types/node": "*"
       }
     },
     "@types/yargs": {
       }
     },
     "@types/yargs": {
-      "version": "15.0.14",
-      "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-15.0.14.tgz",
-      "integrity": "sha512-yEJzHoxf6SyQGhBhIYGXQDSCkJjB6HohDShto7m8vaKg9Yp0Yn8+71J9eakh2bnPg6BfsH9PRMhiRTZnd4eXGQ==",
+      "version": "17.0.22",
+      "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.22.tgz",
+      "integrity": "sha512-pet5WJ9U8yPVRhkwuEIp5ktAeAqRZOq4UdAyWLWzxbtpyXnzbtLdKiXAjJzi/KLmPGS9wk86lUFWZFN6sISo4g==",
       "dev": true,
       "requires": {
         "@types/yargs-parser": "*"
       "dev": true,
       "requires": {
         "@types/yargs-parser": "*"
         "@types/node": "*"
       }
     },
         "@types/node": "*"
       }
     },
+    "@typescript-eslint/eslint-plugin": {
+      "version": "5.27.1",
+      "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.27.1.tgz",
+      "integrity": "sha512-6dM5NKT57ZduNnJfpY81Phe9nc9wolnMCnknb1im6brWi1RYv84nbMS3olJa27B6+irUVV1X/Wb+Am0FjJdGFw==",
+      "dev": true,
+      "requires": {
+        "@typescript-eslint/scope-manager": "5.27.1",
+        "@typescript-eslint/type-utils": "5.27.1",
+        "@typescript-eslint/utils": "5.27.1",
+        "debug": "^4.3.4",
+        "functional-red-black-tree": "^1.0.1",
+        "ignore": "^5.2.0",
+        "regexpp": "^3.2.0",
+        "semver": "^7.3.7",
+        "tsutils": "^3.21.0"
+      },
+      "dependencies": {
+        "lru-cache": {
+          "version": "6.0.0",
+          "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz",
+          "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==",
+          "dev": true,
+          "requires": {
+            "yallist": "^4.0.0"
+          }
+        },
+        "semver": {
+          "version": "7.3.8",
+          "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz",
+          "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==",
+          "dev": true,
+          "requires": {
+            "lru-cache": "^6.0.0"
+          }
+        },
+        "yallist": {
+          "version": "4.0.0",
+          "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
+          "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==",
+          "dev": true
+        }
+      }
+    },
+    "@typescript-eslint/experimental-utils": {
+      "version": "5.27.1",
+      "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-5.27.1.tgz",
+      "integrity": "sha512-Vd8uewIixGP93sEnmTRIH6jHZYRQRkGPDPpapACMvitJKX8335VHNyqKTE+mZ+m3E2c5VznTZfSsSsS5IF7vUA==",
+      "dev": true,
+      "requires": {
+        "@typescript-eslint/utils": "5.27.1"
+      }
+    },
+    "@typescript-eslint/parser": {
+      "version": "5.27.1",
+      "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.27.1.tgz",
+      "integrity": "sha512-7Va2ZOkHi5NP+AZwb5ReLgNF6nWLGTeUJfxdkVUAPPSaAdbWNnFZzLZ4EGGmmiCTg+AwlbE1KyUYTBglosSLHQ==",
+      "dev": true,
+      "requires": {
+        "@typescript-eslint/scope-manager": "5.27.1",
+        "@typescript-eslint/types": "5.27.1",
+        "@typescript-eslint/typescript-estree": "5.27.1",
+        "debug": "^4.3.4"
+      }
+    },
+    "@typescript-eslint/scope-manager": {
+      "version": "5.27.1",
+      "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.27.1.tgz",
+      "integrity": "sha512-fQEOSa/QroWE6fAEg+bJxtRZJTH8NTskggybogHt4H9Da8zd4cJji76gA5SBlR0MgtwF7rebxTbDKB49YUCpAg==",
+      "dev": true,
+      "requires": {
+        "@typescript-eslint/types": "5.27.1",
+        "@typescript-eslint/visitor-keys": "5.27.1"
+      }
+    },
+    "@typescript-eslint/type-utils": {
+      "version": "5.27.1",
+      "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.27.1.tgz",
+      "integrity": "sha512-+UC1vVUWaDHRnC2cQrCJ4QtVjpjjCgjNFpg8b03nERmkHv9JV9X5M19D7UFMd+/G7T/sgFwX2pGmWK38rqyvXw==",
+      "dev": true,
+      "requires": {
+        "@typescript-eslint/utils": "5.27.1",
+        "debug": "^4.3.4",
+        "tsutils": "^3.21.0"
+      }
+    },
+    "@typescript-eslint/types": {
+      "version": "5.27.1",
+      "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.27.1.tgz",
+      "integrity": "sha512-LgogNVkBhCTZU/m8XgEYIWICD6m4dmEDbKXESCbqOXfKZxRKeqpiJXQIErv66sdopRKZPo5l32ymNqibYEH/xg==",
+      "dev": true
+    },
+    "@typescript-eslint/typescript-estree": {
+      "version": "5.27.1",
+      "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.27.1.tgz",
+      "integrity": "sha512-DnZvvq3TAJ5ke+hk0LklvxwYsnXpRdqUY5gaVS0D4raKtbznPz71UJGnPTHEFo0GDxqLOLdMkkmVZjSpET1hFw==",
+      "dev": true,
+      "requires": {
+        "@typescript-eslint/types": "5.27.1",
+        "@typescript-eslint/visitor-keys": "5.27.1",
+        "debug": "^4.3.4",
+        "globby": "^11.1.0",
+        "is-glob": "^4.0.3",
+        "semver": "^7.3.7",
+        "tsutils": "^3.21.0"
+      },
+      "dependencies": {
+        "array-union": {
+          "version": "2.1.0",
+          "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz",
+          "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==",
+          "dev": true
+        },
+        "globby": {
+          "version": "11.1.0",
+          "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz",
+          "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==",
+          "dev": true,
+          "requires": {
+            "array-union": "^2.1.0",
+            "dir-glob": "^3.0.1",
+            "fast-glob": "^3.2.9",
+            "ignore": "^5.2.0",
+            "merge2": "^1.4.1",
+            "slash": "^3.0.0"
+          }
+        },
+        "lru-cache": {
+          "version": "6.0.0",
+          "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz",
+          "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==",
+          "dev": true,
+          "requires": {
+            "yallist": "^4.0.0"
+          }
+        },
+        "semver": {
+          "version": "7.3.8",
+          "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz",
+          "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==",
+          "dev": true,
+          "requires": {
+            "lru-cache": "^6.0.0"
+          }
+        },
+        "slash": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz",
+          "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==",
+          "dev": true
+        },
+        "yallist": {
+          "version": "4.0.0",
+          "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
+          "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==",
+          "dev": true
+        }
+      }
+    },
+    "@typescript-eslint/utils": {
+      "version": "5.27.1",
+      "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.27.1.tgz",
+      "integrity": "sha512-mZ9WEn1ZLDaVrhRaYgzbkXBkTPghPFsup8zDbbsYTxC5OmqrFE7skkKS/sraVsLP3TcT3Ki5CSyEFBRkLH/H/w==",
+      "dev": true,
+      "requires": {
+        "@types/json-schema": "^7.0.9",
+        "@typescript-eslint/scope-manager": "5.27.1",
+        "@typescript-eslint/types": "5.27.1",
+        "@typescript-eslint/typescript-estree": "5.27.1",
+        "eslint-scope": "^5.1.1",
+        "eslint-utils": "^3.0.0"
+      }
+    },
+    "@typescript-eslint/visitor-keys": {
+      "version": "5.27.1",
+      "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.27.1.tgz",
+      "integrity": "sha512-xYs6ffo01nhdJgPieyk7HAOpjhTsx7r/oB9LWEhwAXgwn33tkr+W8DI2ChboqhZlC4q3TC6geDYPoiX8ROqyOQ==",
+      "dev": true,
+      "requires": {
+        "@typescript-eslint/types": "5.27.1",
+        "eslint-visitor-keys": "^3.3.0"
+      }
+    },
     "@ungap/promise-all-settled": {
       "version": "1.1.2",
       "resolved": "https://registry.npmjs.org/@ungap/promise-all-settled/-/promise-all-settled-1.1.2.tgz",
     "@ungap/promise-all-settled": {
       "version": "1.1.2",
       "resolved": "https://registry.npmjs.org/@ungap/promise-all-settled/-/promise-all-settled-1.1.2.tgz",
       "integrity": "sha512-GpSwvyXOcOOlV70vbnzjj4fW5xW/FdUF6nQEt1ENy7m4ZCczi1+/buVUPAqmGfqznsORNFzUMjctTIp8a9tuCQ==",
       "dev": true
     },
       "integrity": "sha512-GpSwvyXOcOOlV70vbnzjj4fW5xW/FdUF6nQEt1ENy7m4ZCczi1+/buVUPAqmGfqznsORNFzUMjctTIp8a9tuCQ==",
       "dev": true
     },
+    "@yarnpkg/parsers": {
+      "version": "3.0.0-rc.40",
+      "resolved": "https://registry.npmjs.org/@yarnpkg/parsers/-/parsers-3.0.0-rc.40.tgz",
+      "integrity": "sha512-sKbi5XhHKXCjzb5m0ftGuQuODM2iUXEsrCSl8MkKexNWHepCmU3IPaGTPC5gHZy4sOvsb9JqTLaZEez+kDzG+Q==",
+      "dev": true,
+      "requires": {
+        "js-yaml": "^3.10.0",
+        "tslib": "^2.4.0"
+      },
+      "dependencies": {
+        "argparse": {
+          "version": "1.0.10",
+          "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz",
+          "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==",
+          "dev": true,
+          "requires": {
+            "sprintf-js": "~1.0.2"
+          }
+        },
+        "js-yaml": {
+          "version": "3.14.1",
+          "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz",
+          "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==",
+          "dev": true,
+          "requires": {
+            "argparse": "^1.0.7",
+            "esprima": "^4.0.0"
+          }
+        },
+        "tslib": {
+          "version": "2.5.0",
+          "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz",
+          "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==",
+          "dev": true
+        }
+      }
+    },
     "JSONStream": {
       "version": "1.3.5",
       "resolved": "https://registry.npmjs.org/JSONStream/-/JSONStream-1.3.5.tgz",
     "JSONStream": {
       "version": "1.3.5",
       "resolved": "https://registry.npmjs.org/JSONStream/-/JSONStream-1.3.5.tgz",
       }
     },
     "acorn": {
       }
     },
     "acorn": {
-      "version": "8.8.0",
-      "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.0.tgz",
-      "integrity": "sha512-QOxyigPVrpZ2GXT+PFyZTl6TtOFc5egxHIP9IlQ+RbupQuX4RkT/Bee4/kQuC02Xkzg84JcT7oLYtDIQxp+v7w==",
+      "version": "8.8.2",
+      "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.2.tgz",
+      "integrity": "sha512-xjIYgE8HBrkpd/sJqOGNspf8uHG+NOHGOw6a/Urj8taM2EXfdNAH2oFcPeIFfsv3+kz/mJrS5VuMqbNLjCa2vw==",
       "dev": true
     },
     "acorn-globals": {
       "dev": true
     },
     "acorn-globals": {
       "integrity": "sha512-m7VZ3jwz4eK6A4Vtt8Ew1/mNbP24u0FhdyfA7fSvnJR6LMdfOYnmuIrrJAgrYfYJ10F/otaHTtrtrtmHdMNzEw==",
       "dev": true
     },
       "integrity": "sha512-m7VZ3jwz4eK6A4Vtt8Ew1/mNbP24u0FhdyfA7fSvnJR6LMdfOYnmuIrrJAgrYfYJ10F/otaHTtrtrtmHdMNzEw==",
       "dev": true
     },
+    "acorn-jsx": {
+      "version": "5.3.2",
+      "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz",
+      "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==",
+      "dev": true
+    },
     "acorn-node": {
       "version": "1.8.2",
       "resolved": "https://registry.npmjs.org/acorn-node/-/acorn-node-1.8.2.tgz",
     "acorn-node": {
       "version": "1.8.2",
       "resolved": "https://registry.npmjs.org/acorn-node/-/acorn-node-1.8.2.tgz",
       "requires": {
         "loader-utils": "^2.0.0",
         "regex-parser": "^2.2.11"
       "requires": {
         "loader-utils": "^2.0.0",
         "regex-parser": "^2.2.11"
+      },
+      "dependencies": {
+        "loader-utils": {
+          "version": "2.0.4",
+          "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.4.tgz",
+          "integrity": "sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw==",
+          "dev": true,
+          "requires": {
+            "big.js": "^5.2.2",
+            "emojis-list": "^3.0.0",
+            "json5": "^2.1.2"
+          }
+        }
       }
     },
     "agent-base": {
       }
     },
     "agent-base": {
       }
     },
     "agentkeepalive": {
       }
     },
     "agentkeepalive": {
-      "version": "4.2.1",
-      "resolved": "https://registry.npmjs.org/agentkeepalive/-/agentkeepalive-4.2.1.tgz",
-      "integrity": "sha512-Zn4cw2NEqd+9fiSVWMscnjyQ1a8Yfoc5oBajLeo5w+YBHgDUcEBY2hS4YpTz6iN5f/2zQiktcuM6tS8x1p9dpA==",
+      "version": "4.3.0",
+      "resolved": "https://registry.npmjs.org/agentkeepalive/-/agentkeepalive-4.3.0.tgz",
+      "integrity": "sha512-7Epl1Blf4Sy37j4v9f9FjICCh4+KAQOyXgHEwlyBiAQLbhKdq/i2QQU3amQalS/wPhdPzDXPL5DMR5bkn+YeWg==",
       "dev": true,
       "requires": {
         "debug": "^4.1.0",
       "dev": true,
       "requires": {
         "debug": "^4.1.0",
-        "depd": "^1.1.2",
+        "depd": "^2.0.0",
         "humanize-ms": "^1.2.1"
         "humanize-ms": "^1.2.1"
-      },
-      "dependencies": {
-        "depd": {
-          "version": "1.1.2",
-          "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz",
-          "integrity": "sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==",
-          "dev": true
-        }
       }
     },
     "aggregate-error": {
       }
     },
     "aggregate-error": {
       }
     },
     "ajv": {
       }
     },
     "ajv": {
-      "version": "8.6.2",
-      "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.6.2.tgz",
-      "integrity": "sha512-9807RlWAgT564wT+DjeyU5OFMPjmzxVobvDFmNAhY+5zD6A2ly3jDp6sgnfyDtlIQ+7H97oc/DGCzzfu9rjw9w==",
+      "version": "8.9.0",
+      "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.9.0.tgz",
+      "integrity": "sha512-qOKJyNj/h+OWx7s5DePL6Zu1KeM9jPZhwBqs+7DzP6bGOvqzVCSf0xueYmVuaC/oQ/VtS2zLMLHdQFbkka+XDQ==",
       "dev": true,
       "requires": {
         "fast-deep-equal": "^3.1.1",
       "dev": true,
       "requires": {
         "fast-deep-equal": "^3.1.1",
         "uri-js": "^4.2.2"
       }
     },
         "uri-js": "^4.2.2"
       }
     },
-    "ajv-errors": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/ajv-errors/-/ajv-errors-1.0.1.tgz",
-      "integrity": "sha512-DCRfO/4nQ+89p/RK43i8Ezd41EqdGIU4ld7nGF8OQ14oc/we5rEntLCUa7+jrn3nn83BosfwZA0wb4pon2o8iQ==",
-      "dev": true
-    },
     "ajv-formats": {
     "ajv-formats": {
-      "version": "2.1.0",
-      "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-2.1.0.tgz",
-      "integrity": "sha512-USH2jBb+C/hIpwD2iRjp0pe0k+MvzG0mlSn/FIdCgQhUb9ALPRjt2KIQdfZDS9r0ZIeUAg7gOu9KL0PFqGqr5Q==",
+      "version": "2.1.1",
+      "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-2.1.1.tgz",
+      "integrity": "sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==",
       "dev": true,
       "requires": {
         "ajv": "^8.0.0"
       "dev": true,
       "requires": {
         "ajv": "^8.0.0"
         "ansi-wrap": "0.1.0"
       }
     },
         "ansi-wrap": "0.1.0"
       }
     },
-    "ansi-html": {
-      "version": "0.0.7",
-      "resolved": "https://registry.npmjs.org/ansi-html/-/ansi-html-0.0.7.tgz",
-      "integrity": "sha512-JoAxEa1DfP9m2xfB/y2r/aKcwXNlltr4+0QSBC4TrLfcxyvepX2Pv0t/xpgGV5bGsDzCYV8SzjWgyCW0T9yYbA==",
+    "ansi-html-community": {
+      "version": "0.0.8",
+      "resolved": "https://registry.npmjs.org/ansi-html-community/-/ansi-html-community-0.0.8.tgz",
+      "integrity": "sha512-1APHAyr3+PCamwNw3bXCPp4HFLONZt/yIH0sZp0/469KWNTEy+qN5jQ3GVX6DMZ1UXAi34yVwtTeaG/HpBuuzw==",
       "dev": true
     },
     "ansi-regex": {
       "dev": true
     },
     "ansi-regex": {
       "dev": true
     },
     "anymatch": {
       "dev": true
     },
     "anymatch": {
-      "version": "3.1.2",
-      "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz",
-      "integrity": "sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==",
+      "version": "3.1.3",
+      "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz",
+      "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==",
       "dev": true,
       "requires": {
         "normalize-path": "^3.0.0",
       "dev": true,
       "requires": {
         "normalize-path": "^3.0.0",
       }
     },
     "apache-crypt": {
       }
     },
     "apache-crypt": {
-      "version": "1.2.5",
-      "resolved": "https://registry.npmjs.org/apache-crypt/-/apache-crypt-1.2.5.tgz",
-      "integrity": "sha512-ICnYQH+DFVmw+S4Q0QY2XRXD8Ne8ewh8HgbuFH4K7022zCxgHM0Hz1xkRnUlEfAXNbwp1Cnhbedu60USIfDxvg==",
+      "version": "1.2.6",
+      "resolved": "https://registry.npmjs.org/apache-crypt/-/apache-crypt-1.2.6.tgz",
+      "integrity": "sha512-072WetlM4blL8PREJVeY+WHiUh1R5VNt2HfceGS8aKqttPHcmqE5pkKuXPz/ULmJOFkc8Hw3kfKl6vy7Qka6DA==",
       "dev": true,
       "requires": {
         "unix-crypt-td-js": "^1.1.4"
       }
     },
     "apache-md5": {
       "dev": true,
       "requires": {
         "unix-crypt-td-js": "^1.1.4"
       }
     },
     "apache-md5": {
-      "version": "1.1.7",
-      "resolved": "https://registry.npmjs.org/apache-md5/-/apache-md5-1.1.7.tgz",
-      "integrity": "sha512-JtHjzZmJxtzfTSjsCyHgPR155HBe5WGyUyHTaEkfy46qhwCFKx1Epm6nAxgUG3WfUZP1dWhGqj9Z2NOBeZ+uBw==",
-      "dev": true
-    },
-    "app-root-path": {
-      "version": "3.1.0",
-      "resolved": "https://registry.npmjs.org/app-root-path/-/app-root-path-3.1.0.tgz",
-      "integrity": "sha512-biN3PwB2gUtjaYy/isrU3aNWI5w+fAfvHkSvCKeQGxhmYpwKFUxudR3Yya+KqVRHBmEDYh+/lTozYCFbmzX4nA==",
+      "version": "1.1.8",
+      "resolved": "https://registry.npmjs.org/apache-md5/-/apache-md5-1.1.8.tgz",
+      "integrity": "sha512-FCAJojipPn0bXjuEpjOOOMN8FZDkxfWWp4JGN9mifU2IhxvKyXZYqpzPHdnTSUpmPDy+tsslB6Z1g+Vg6nVbYA==",
       "dev": true
     },
     "aproba": {
       "version": "1.2.0",
       "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz",
       "dev": true
     },
     "aproba": {
       "version": "1.2.0",
       "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz",
-      "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==",
-      "dev": true
+      "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw=="
     },
     "arch": {
       "version": "2.2.0",
     },
     "arch": {
       "version": "2.2.0",
       "version": "1.1.7",
       "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-1.1.7.tgz",
       "integrity": "sha512-nxwy40TuMiUGqMyRHgCSWZ9FM4VAoRP4xUYSTv5ImRog+h9yISPbVH7H8fASCIzYn9wlEv4zvFL7uKDMCFQm3g==",
       "version": "1.1.7",
       "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-1.1.7.tgz",
       "integrity": "sha512-nxwy40TuMiUGqMyRHgCSWZ9FM4VAoRP4xUYSTv5ImRog+h9yISPbVH7H8fASCIzYn9wlEv4zvFL7uKDMCFQm3g==",
-      "dev": true,
+      "optional": true,
       "requires": {
         "delegates": "^1.0.0",
         "readable-stream": "^2.0.6"
       "requires": {
         "delegates": "^1.0.0",
         "readable-stream": "^2.0.6"
-      },
-      "dependencies": {
-        "readable-stream": {
-          "version": "2.3.7",
-          "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz",
-          "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==",
-          "dev": true,
-          "requires": {
-            "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"
-          }
-        },
-        "string_decoder": {
-          "version": "1.1.1",
-          "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz",
-          "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
-          "dev": true,
-          "requires": {
-            "safe-buffer": "~5.1.0"
-          }
-        }
       }
     },
     "arg": {
       }
     },
     "arg": {
       "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q=="
     },
     "aria-query": {
       "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q=="
     },
     "aria-query": {
-      "version": "3.0.0",
-      "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-3.0.0.tgz",
-      "integrity": "sha512-majUxHgLehQTeSA+hClx+DY09OVUqG3GtezWkF1krgLGNdlDu9l9V8DaqNMWbq4Eddc8wsyDA0hpDUtnYxQEXw==",
+      "version": "4.2.2",
+      "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-4.2.2.tgz",
+      "integrity": "sha512-o/HelwhuKpTj/frsOsbNLNgnNGVIFsVP/SW2BSF14gVl7kAfMOJ6/8wUAUvG1R1NHKrfG+2sHZTu0yauT1qBrA==",
       "dev": true,
       "requires": {
       "dev": true,
       "requires": {
-        "ast-types-flow": "0.0.7",
-        "commander": "^2.11.0"
-      },
-      "dependencies": {
-        "commander": {
-          "version": "2.20.3",
-          "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz",
-          "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==",
-          "dev": true
-        }
+        "@babel/runtime": "^7.10.2",
+        "@babel/runtime-corejs3": "^7.10.2"
       }
     },
     "arr-diff": {
       }
     },
     "arr-diff": {
       "dev": true
     },
     "array-union": {
       "dev": true
     },
     "array-union": {
-      "version": "2.1.0",
-      "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz",
-      "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==",
-      "dev": true
-    },
-    "array-uniq": {
-      "version": "1.0.3",
-      "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz",
-      "integrity": "sha512-MNha4BWQ6JbwhFhj03YK552f7cb3AzoE8SzeljgChvL1dl3IcvggXVz1DilzySZkCja+CXuZbdW7yATchWn8/Q==",
+      "version": "3.0.1",
+      "resolved": "https://registry.npmjs.org/array-union/-/array-union-3.0.1.tgz",
+      "integrity": "sha512-1OvF9IbWwaeiM9VhzYXVQacMibxpXOMYVNIvMtKRyX9SImBXpKcFr8XvFDeEslCyuH/t6KRt7HEO94AlP8Iatw==",
       "dev": true
     },
     "array-unique": {
       "dev": true
     },
     "array-unique": {
       "integrity": "sha512-RIOpVnVlltB6PcBJ5BMLx+H+6JJ/zjDGU0t7f0L6c2M1dqcK92VQopLBlPQ9R80AVXelfqYgjcPLtHtDbNFg0Q==",
       "dev": true
     },
       "integrity": "sha512-RIOpVnVlltB6PcBJ5BMLx+H+6JJ/zjDGU0t7f0L6c2M1dqcK92VQopLBlPQ9R80AVXelfqYgjcPLtHtDbNFg0Q==",
       "dev": true
     },
-    "ast-types-flow": {
-      "version": "0.0.7",
-      "resolved": "https://registry.npmjs.org/ast-types-flow/-/ast-types-flow-0.0.7.tgz",
-      "integrity": "sha512-eBvWn1lvIApYMhzQMsu9ciLfkBY499mFZlNqG+/9WR7PVlroQw0vG30cOQQbaKz3sCEc44TAOu2ykzqXSNnwag==",
-      "dev": true
-    },
     "astral-regex": {
       "version": "2.0.0",
       "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz",
     "astral-regex": {
       "version": "2.0.0",
       "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz",
         "lodash": "^4.17.14"
       }
     },
         "lodash": "^4.17.14"
       }
     },
-    "async-each": {
-      "version": "1.0.3",
-      "resolved": "https://registry.npmjs.org/async-each/-/async-each-1.0.3.tgz",
-      "integrity": "sha512-z/WhQ5FPySLdvREByI2vZiTWwCnF0moMJ1hK9YQwDTHKh6I7/uSckMetoRGb5UBZPC1z0jlw+n/XCgjeH7y1AQ==",
-      "dev": true
-    },
-    "async-limiter": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/async-limiter/-/async-limiter-1.0.1.tgz",
-      "integrity": "sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ==",
-      "dev": true
-    },
     "async-mutex": {
       "version": "0.2.4",
       "resolved": "https://registry.npmjs.org/async-mutex/-/async-mutex-0.2.4.tgz",
     "async-mutex": {
       "version": "0.2.4",
       "resolved": "https://registry.npmjs.org/async-mutex/-/async-mutex-0.2.4.tgz",
     "asynckit": {
       "version": "0.4.0",
       "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz",
     "asynckit": {
       "version": "0.4.0",
       "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz",
-      "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==",
-      "dev": true
+      "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q=="
     },
     "at-least-node": {
       "version": "1.0.0",
     },
     "at-least-node": {
       "version": "1.0.0",
       "dev": true
     },
     "autolinker": {
       "dev": true
     },
     "autolinker": {
-      "version": "3.16.0",
-      "resolved": "https://registry.npmjs.org/autolinker/-/autolinker-3.16.0.tgz",
-      "integrity": "sha512-KY8yhlwvuQpA7exkkvHsmk0chdrtS0ZRO7XoPfs7w8N3kpiGPjYNDrQ0lIMx2GrKFZzGK/QSEd2Sx5SYtSNBKg==",
+      "version": "3.16.2",
+      "resolved": "https://registry.npmjs.org/autolinker/-/autolinker-3.16.2.tgz",
+      "integrity": "sha512-JiYl7j2Z19F9NdTmirENSUUIIL/9MytEWtmzhfmsKPCp9E+G35Y0UNCMoM9tFigxT59qSc8Ml2dlZXOCVTYwuA==",
       "requires": {
         "tslib": "^2.3.0"
       }
     },
     "autoprefixer": {
       "requires": {
         "tslib": "^2.3.0"
       }
     },
     "autoprefixer": {
-      "version": "9.8.8",
-      "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-9.8.8.tgz",
-      "integrity": "sha512-eM9d/swFopRt5gdJ7jrpCwgvEMIayITpojhkkSMRsFHYuH5bkSQ4p/9qTEHtmNudUZh22Tehu7I6CxAW0IXTKA==",
+      "version": "10.4.13",
+      "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.13.tgz",
+      "integrity": "sha512-49vKpMqcZYsJjwotvt4+h/BCjJVnhGwcLpDt5xkcaOG3eLrG/HUYLagrihYsQ+qrIBgIzX1Rw7a6L8I/ZA1Atg==",
       "dev": true,
       "requires": {
       "dev": true,
       "requires": {
-        "browserslist": "^4.12.0",
-        "caniuse-lite": "^1.0.30001109",
+        "browserslist": "^4.21.4",
+        "caniuse-lite": "^1.0.30001426",
+        "fraction.js": "^4.2.0",
         "normalize-range": "^0.1.2",
         "normalize-range": "^0.1.2",
-        "num2fraction": "^1.2.2",
-        "picocolors": "^0.2.1",
-        "postcss": "^7.0.32",
-        "postcss-value-parser": "^4.1.0"
-      },
-      "dependencies": {
-        "picocolors": {
-          "version": "0.2.1",
-          "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz",
-          "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==",
-          "dev": true
-        },
-        "postcss": {
-          "version": "7.0.39",
-          "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz",
-          "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==",
-          "dev": true,
-          "requires": {
-            "picocolors": "^0.2.1",
-            "source-map": "^0.6.1"
-          }
-        },
-        "source-map": {
-          "version": "0.6.1",
-          "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
-          "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
-          "dev": true
-        }
+        "picocolors": "^1.0.0",
+        "postcss-value-parser": "^4.2.0"
       }
     },
     "available-typed-arrays": {
       }
     },
     "available-typed-arrays": {
       "dev": true
     },
     "aws4": {
       "dev": true
     },
     "aws4": {
-      "version": "1.11.0",
-      "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.11.0.tgz",
-      "integrity": "sha512-xh1Rl34h6Fi1DC2WWKfxUTVqRsNnr6LsKz2+hfwDxQJWmrx8+c7ylaqBMcHfl1U1r2dsifOvKX3LQuLNZ+XSvA==",
+      "version": "1.12.0",
+      "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.12.0.tgz",
+      "integrity": "sha512-NmWvPnx0F1SfrQbYwOi7OeaNGokp9XhzNioJ/CSBs8Qa4vxug81mhJEAVZwxXuBmYB5KDRfMq/F3RR0BIU7sWg==",
+      "dev": true
+    },
+    "axe-core": {
+      "version": "4.4.3",
+      "resolved": "https://registry.npmjs.org/axe-core/-/axe-core-4.4.3.tgz",
+      "integrity": "sha512-32+ub6kkdhhWick/UjvEwRchgoetXqTK14INLqbGm5U2TzBkBNF3nQtLYm8ovxSkQWArjEQvftCKryjZaATu3w==",
       "dev": true
     },
     "axios": {
       "dev": true
     },
     "axios": {
-      "version": "0.21.4",
-      "resolved": "https://registry.npmjs.org/axios/-/axios-0.21.4.tgz",
-      "integrity": "sha512-ut5vewkiu8jjGBdqpM44XxjuCjq9LAKeHVmoVfHVzy8eHgxxq8SbAVQNovDA8mVi05kP0Ea/n/UzcSHcTJQfNg==",
-      "dev": true,
+      "version": "1.3.4",
+      "resolved": "https://registry.npmjs.org/axios/-/axios-1.3.4.tgz",
+      "integrity": "sha512-toYm+Bsyl6VC5wSkfkbbNB6ROv7KY93PEBBL6xyDczaIHasAiv4wPqQ/c4RjoQzipxRD2W5g21cOqQulZ7rHwQ==",
       "requires": {
       "requires": {
-        "follow-redirects": "^1.14.0"
+        "follow-redirects": "^1.15.0",
+        "form-data": "^4.0.0",
+        "proxy-from-env": "^1.1.0"
       }
     },
     "axobject-query": {
       }
     },
     "axobject-query": {
-      "version": "2.0.2",
-      "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-2.0.2.tgz",
-      "integrity": "sha512-MCeek8ZH7hKyO1rWUbKNQBbl4l2eY0ntk7OGi+q0RlafrCnfPxC06WZA+uebCfmYp4mNU9jRBP1AhGyf8+W3ww==",
-      "dev": true,
-      "requires": {
-        "ast-types-flow": "0.0.7"
-      }
+      "version": "2.2.0",
+      "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-2.2.0.tgz",
+      "integrity": "sha512-Td525n+iPOOyUQIeBfcASuG6uJsDOITl7Mds5gFyerkWiX7qhUTdYUBlSgNMyVqtSJqwpt1kXGLdUt6SykLMRA==",
+      "dev": true
     },
     "babel-jest": {
     },
     "babel-jest": {
-      "version": "26.6.3",
-      "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-26.6.3.tgz",
-      "integrity": "sha512-pl4Q+GAVOHwvjrck6jKjvmGhnO3jHX/xuB9d27f+EJZ/6k+6nMuPjorrYp7s++bKKdANwzElBWnLWaObvTnaZA==",
+      "version": "28.1.3",
+      "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-28.1.3.tgz",
+      "integrity": "sha512-epUaPOEWMk3cWX0M/sPvCHHCe9fMFAa/9hXEgKP8nFfNl/jlGkE9ucq9NqkZGXLDduCJYS0UvSlPUwC0S+rH6Q==",
       "dev": true,
       "requires": {
       "dev": true,
       "requires": {
-        "@jest/transform": "^26.6.2",
-        "@jest/types": "^26.6.2",
-        "@types/babel__core": "^7.1.7",
-        "babel-plugin-istanbul": "^6.0.0",
-        "babel-preset-jest": "^26.6.2",
+        "@jest/transform": "^28.1.3",
+        "@types/babel__core": "^7.1.14",
+        "babel-plugin-istanbul": "^6.1.1",
+        "babel-preset-jest": "^28.1.3",
         "chalk": "^4.0.0",
         "chalk": "^4.0.0",
-        "graceful-fs": "^4.2.4",
+        "graceful-fs": "^4.2.9",
         "slash": "^3.0.0"
       },
       "dependencies": {
         "slash": "^3.0.0"
       },
       "dependencies": {
-        "@jest/types": {
-          "version": "26.6.2",
-          "resolved": "https://registry.npmjs.org/@jest/types/-/types-26.6.2.tgz",
-          "integrity": "sha512-fC6QCp7Sc5sX6g8Tvbmj4XUTbyrik0akgRy03yjXbQaBWWNWGE7SGtJk98m0N8nzegD/7SggrUlivxo5ax4KWQ==",
-          "dev": true,
-          "requires": {
-            "@types/istanbul-lib-coverage": "^2.0.0",
-            "@types/istanbul-reports": "^3.0.0",
-            "@types/node": "*",
-            "@types/yargs": "^15.0.0",
-            "chalk": "^4.0.0"
-          }
-        },
-        "@types/istanbul-reports": {
-          "version": "3.0.1",
-          "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.1.tgz",
-          "integrity": "sha512-c3mAZEuK0lvBp8tmuL74XRKn1+y2dcwOUpH7x4WrF6gk1GIgiluDRgMYQtw2OFcBvAJWlt6ASU3tSqxp0Uu0Aw==",
-          "dev": true,
-          "requires": {
-            "@types/istanbul-lib-report": "*"
-          }
-        },
         "ansi-styles": {
           "version": "4.3.0",
           "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
         "ansi-styles": {
           "version": "4.3.0",
           "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
           "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
           "dev": true
         },
           "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
           "dev": true
         },
+        "slash": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz",
+          "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==",
+          "dev": true
+        },
         "supports-color": {
           "version": "7.2.0",
           "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
         "supports-color": {
           "version": "7.2.0",
           "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
       }
     },
     "babel-loader": {
       }
     },
     "babel-loader": {
-      "version": "8.2.2",
-      "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-8.2.2.tgz",
-      "integrity": "sha512-JvTd0/D889PQBtUXJ2PXaKU/pjZDMtHA9V2ecm+eNRmmBCMR09a+fmpGTNwnJtFmFl5Ei7Vy47LjBb+L0wQ99g==",
+      "version": "8.2.5",
+      "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-8.2.5.tgz",
+      "integrity": "sha512-OSiFfH89LrEMiWd4pLNqGz4CwJDtbs2ZVc+iGu2HrkRfPxId9F2anQj38IxWpmRfsUY0aBZYi1EFcd3mhtRMLQ==",
       "dev": true,
       "requires": {
         "find-cache-dir": "^3.3.1",
       "dev": true,
       "requires": {
         "find-cache-dir": "^3.3.1",
-        "loader-utils": "^1.4.0",
+        "loader-utils": "^2.0.0",
         "make-dir": "^3.1.0",
         "schema-utils": "^2.6.5"
       },
       "dependencies": {
         "make-dir": "^3.1.0",
         "schema-utils": "^2.6.5"
       },
       "dependencies": {
-        "json5": {
-          "version": "1.0.1",
-          "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz",
-          "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==",
-          "dev": true,
-          "requires": {
-            "minimist": "^1.2.0"
-          }
-        },
         "loader-utils": {
         "loader-utils": {
-          "version": "1.4.0",
-          "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.0.tgz",
-          "integrity": "sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA==",
+          "version": "2.0.4",
+          "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.4.tgz",
+          "integrity": "sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw==",
           "dev": true,
           "requires": {
             "big.js": "^5.2.2",
             "emojis-list": "^3.0.0",
           "dev": true,
           "requires": {
             "big.js": "^5.2.2",
             "emojis-list": "^3.0.0",
-            "json5": "^1.0.1"
+            "json5": "^2.1.2"
           }
         }
       }
           }
         }
       }
       "integrity": "sha512-g+8yxHUZ60RcyaUpfNzy56OtWW+x9cyEe9j+CranqLiqbju2yf/Cy6ZtYK40EZxtrdHllzlVZgLmcOUCTlJ7Jg==",
       "dev": true
     },
       "integrity": "sha512-g+8yxHUZ60RcyaUpfNzy56OtWW+x9cyEe9j+CranqLiqbju2yf/Cy6ZtYK40EZxtrdHllzlVZgLmcOUCTlJ7Jg==",
       "dev": true
     },
-    "babel-plugin-dynamic-import-node": {
-      "version": "2.3.3",
-      "resolved": "https://registry.npmjs.org/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.3.3.tgz",
-      "integrity": "sha512-jZVI+s9Zg3IqA/kdi0i6UDCybUI3aSBLnglhYbSSjKlV7yF1F/5LWv8MakQmvYpnbJDS6fcBL2KzHSxNCMtWSQ==",
-      "dev": true,
-      "requires": {
-        "object.assign": "^4.1.0"
-      }
-    },
     "babel-plugin-istanbul": {
       "version": "6.1.1",
       "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-6.1.1.tgz",
     "babel-plugin-istanbul": {
       "version": "6.1.1",
       "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-6.1.1.tgz",
         "@istanbuljs/schema": "^0.1.2",
         "istanbul-lib-instrument": "^5.0.4",
         "test-exclude": "^6.0.0"
         "@istanbuljs/schema": "^0.1.2",
         "istanbul-lib-instrument": "^5.0.4",
         "test-exclude": "^6.0.0"
-      },
-      "dependencies": {
-        "@ampproject/remapping": {
-          "version": "2.2.0",
-          "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.0.tgz",
-          "integrity": "sha512-qRmjj8nj9qmLTQXXmaR1cck3UXSRMPrbsLJAasZpF+t3riI71BXed5ebIOYwQntykeZuhjsdweEc9BxH5Jc26w==",
-          "dev": true,
-          "requires": {
-            "@jridgewell/gen-mapping": "^0.1.0",
-            "@jridgewell/trace-mapping": "^0.3.9"
-          }
-        },
-        "@babel/core": {
-          "version": "7.18.10",
-          "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.18.10.tgz",
-          "integrity": "sha512-JQM6k6ENcBFKVtWvLavlvi/mPcpYZ3+R+2EySDEMSMbp7Mn4FexlbbJVrx2R7Ijhr01T8gyqrOaABWIOgxeUyw==",
-          "dev": true,
-          "requires": {
-            "@ampproject/remapping": "^2.1.0",
-            "@babel/code-frame": "^7.18.6",
-            "@babel/generator": "^7.18.10",
-            "@babel/helper-compilation-targets": "^7.18.9",
-            "@babel/helper-module-transforms": "^7.18.9",
-            "@babel/helpers": "^7.18.9",
-            "@babel/parser": "^7.18.10",
-            "@babel/template": "^7.18.10",
-            "@babel/traverse": "^7.18.10",
-            "@babel/types": "^7.18.10",
-            "convert-source-map": "^1.7.0",
-            "debug": "^4.1.0",
-            "gensync": "^1.0.0-beta.2",
-            "json5": "^2.2.1",
-            "semver": "^6.3.0"
-          }
-        },
-        "@jridgewell/gen-mapping": {
-          "version": "0.1.1",
-          "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.1.1.tgz",
-          "integrity": "sha512-sQXCasFk+U8lWYEe66WxRDOE9PjVz4vSM51fTu3Hw+ClTpUSQb718772vH3pyS5pShp6lvQM7SxgIDXXXmOX7w==",
-          "dev": true,
-          "requires": {
-            "@jridgewell/set-array": "^1.0.0",
-            "@jridgewell/sourcemap-codec": "^1.4.10"
-          }
-        },
-        "istanbul-lib-instrument": {
-          "version": "5.2.0",
-          "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.0.tgz",
-          "integrity": "sha512-6Lthe1hqXHBNsqvgDzGO6l03XNeu3CrG4RqQ1KM9+l5+jNGpEJfIELx1NS3SEHmJQA8np/u+E4EPRKRiu6m19A==",
-          "dev": true,
-          "requires": {
-            "@babel/core": "^7.12.3",
-            "@babel/parser": "^7.14.7",
-            "@istanbuljs/schema": "^0.1.2",
-            "istanbul-lib-coverage": "^3.2.0",
-            "semver": "^6.3.0"
-          }
-        },
-        "semver": {
-          "version": "6.3.0",
-          "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
-          "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==",
-          "dev": true
-        }
       }
     },
     "babel-plugin-jest-hoist": {
       }
     },
     "babel-plugin-jest-hoist": {
-      "version": "26.6.2",
-      "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-26.6.2.tgz",
-      "integrity": "sha512-PO9t0697lNTmcEHH69mdtYiOIkkOlj9fySqfO3K1eCcdISevLAE0xY59VLLUj0SoiPiTX/JU2CYFpILydUa5Lw==",
+      "version": "28.1.3",
+      "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-28.1.3.tgz",
+      "integrity": "sha512-Ys3tUKAmfnkRUpPdpa98eYrAR0nV+sSFUZZEGuQ2EbFd1y4SOLtD5QDNHAq+bb9a+bbXvYQC4b+ID/THIMcU6Q==",
       "dev": true,
       "requires": {
         "@babel/template": "^7.3.3",
         "@babel/types": "^7.3.3",
       "dev": true,
       "requires": {
         "@babel/template": "^7.3.3",
         "@babel/types": "^7.3.3",
-        "@types/babel__core": "^7.0.0",
+        "@types/babel__core": "^7.1.14",
         "@types/babel__traverse": "^7.0.6"
       }
     },
     "babel-plugin-polyfill-corejs2": {
         "@types/babel__traverse": "^7.0.6"
       }
     },
     "babel-plugin-polyfill-corejs2": {
-      "version": "0.2.3",
-      "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.2.3.tgz",
-      "integrity": "sha512-NDZ0auNRzmAfE1oDDPW2JhzIMXUk+FFe2ICejmt5T4ocKgiQx3e0VCRx9NCAidcMtL2RUZaWtXnmjTCkx0tcbA==",
+      "version": "0.3.3",
+      "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.3.3.tgz",
+      "integrity": "sha512-8hOdmFYFSZhqg2C/JgLUQ+t52o5nirNwaWM2B9LWteozwIvM14VSwdsCAUET10qT+kmySAlseadmfeeSWFCy+Q==",
       "dev": true,
       "requires": {
       "dev": true,
       "requires": {
-        "@babel/compat-data": "^7.13.11",
-        "@babel/helper-define-polyfill-provider": "^0.2.4",
+        "@babel/compat-data": "^7.17.7",
+        "@babel/helper-define-polyfill-provider": "^0.3.3",
         "semver": "^6.1.1"
         "semver": "^6.1.1"
-      },
-      "dependencies": {
-        "semver": {
-          "version": "6.3.0",
-          "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
-          "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==",
-          "dev": true
-        }
       }
     },
     "babel-plugin-polyfill-corejs3": {
       }
     },
     "babel-plugin-polyfill-corejs3": {
-      "version": "0.2.5",
-      "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.2.5.tgz",
-      "integrity": "sha512-ninF5MQNwAX9Z7c9ED+H2pGt1mXdP4TqzlHKyPIYmJIYz0N+++uwdM7RnJukklhzJ54Q84vA4ZJkgs7lu5vqcw==",
+      "version": "0.5.3",
+      "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.5.3.tgz",
+      "integrity": "sha512-zKsXDh0XjnrUEW0mxIHLfjBfnXSMr5Q/goMe/fxpQnLm07mcOZiIZHBNWCMx60HmdvjxfXcalac0tfFg0wqxyw==",
       "dev": true,
       "requires": {
       "dev": true,
       "requires": {
-        "@babel/helper-define-polyfill-provider": "^0.2.2",
-        "core-js-compat": "^3.16.2"
+        "@babel/helper-define-polyfill-provider": "^0.3.2",
+        "core-js-compat": "^3.21.0"
       }
     },
     "babel-plugin-polyfill-regenerator": {
       }
     },
     "babel-plugin-polyfill-regenerator": {
-      "version": "0.2.3",
-      "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.2.3.tgz",
-      "integrity": "sha512-JVE78oRZPKFIeUqFGrSORNzQnrDwZR16oiWeGM8ZyjBn2XAT5OjP+wXx5ESuo33nUsFUEJYjtklnsKbxW5L+7g==",
+      "version": "0.3.1",
+      "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.3.1.tgz",
+      "integrity": "sha512-Y2B06tvgHYt1x0yz17jGkGeeMr5FeKUu+ASJ+N6nB5lQ8Dapfg42i0OVrf8PNGJ3zKL4A23snMi1IRwrqqND7A==",
       "dev": true,
       "requires": {
       "dev": true,
       "requires": {
-        "@babel/helper-define-polyfill-provider": "^0.2.4"
+        "@babel/helper-define-polyfill-provider": "^0.3.1"
       }
     },
     "babel-preset-current-node-syntax": {
       }
     },
     "babel-preset-current-node-syntax": {
       }
     },
     "babel-preset-jest": {
       }
     },
     "babel-preset-jest": {
-      "version": "26.6.2",
-      "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-26.6.2.tgz",
-      "integrity": "sha512-YvdtlVm9t3k777c5NPQIv6cxFFFapys25HiUmuSgHwIZhfifweR5c5Sf5nwE3MAbfu327CYSvps8Yx6ANLyleQ==",
+      "version": "28.1.3",
+      "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-28.1.3.tgz",
+      "integrity": "sha512-L+fupJvlWAHbQfn74coNX3zf60LXMJsezNvvx8eIh7iOR1luJ1poxYgQk1F8PYtNq/6QODDHCqsSnTFSWC491A==",
       "dev": true,
       "requires": {
       "dev": true,
       "requires": {
-        "babel-plugin-jest-hoist": "^26.6.2",
+        "babel-plugin-jest-hoist": "^28.1.3",
         "babel-preset-current-node-syntax": "^1.0.0"
       }
     },
         "babel-preset-current-node-syntax": "^1.0.0"
       }
     },
       "dev": true,
       "requires": {
         "safe-buffer": "5.1.2"
       "dev": true,
       "requires": {
         "safe-buffer": "5.1.2"
+      },
+      "dependencies": {
+        "safe-buffer": {
+          "version": "5.1.2",
+          "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz",
+          "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==",
+          "dev": true
+        }
       }
     },
     "batch": {
       }
     },
     "batch": {
       "version": "4.1.0",
       "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz",
       "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==",
       "version": "4.1.0",
       "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz",
       "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==",
-      "dev": true,
       "requires": {
         "buffer": "^5.5.0",
         "inherits": "^2.0.4",
         "readable-stream": "^3.4.0"
       "requires": {
         "buffer": "^5.5.0",
         "inherits": "^2.0.4",
         "readable-stream": "^3.4.0"
+      },
+      "dependencies": {
+        "readable-stream": {
+          "version": "3.6.1",
+          "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.1.tgz",
+          "integrity": "sha512-+rQmrWMYGA90yenhTYsLWAsLsqVC8osOw6PKE1HDYiO0gdPeKe/xDHNzIAIn4C91YQ6oenEhfYqqc1883qHbjQ==",
+          "requires": {
+            "inherits": "^2.0.3",
+            "string_decoder": "^1.1.1",
+            "util-deprecate": "^1.0.1"
+          }
+        }
       }
     },
     "blink-diff": {
       }
     },
     "blink-diff": {
       "dev": true
     },
     "body-parser": {
       "dev": true
     },
     "body-parser": {
-      "version": "1.20.0",
-      "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.0.tgz",
-      "integrity": "sha512-DfJ+q6EPcGKZD1QWUjSpqp+Q7bDQTsQIF4zfUAtZ6qk+H/3/QRhg9CEp39ss+/T2vw0+HaidC0ecJj/DRLIaKg==",
+      "version": "1.20.1",
+      "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.1.tgz",
+      "integrity": "sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw==",
       "dev": true,
       "requires": {
         "bytes": "3.1.2",
       "dev": true,
       "requires": {
         "bytes": "3.1.2",
         "http-errors": "2.0.0",
         "iconv-lite": "0.4.24",
         "on-finished": "2.4.1",
         "http-errors": "2.0.0",
         "iconv-lite": "0.4.24",
         "on-finished": "2.4.1",
-        "qs": "6.10.3",
+        "qs": "6.11.0",
         "raw-body": "2.5.1",
         "type-is": "~1.6.18",
         "unpipe": "1.0.0"
         "raw-body": "2.5.1",
         "type-is": "~1.6.18",
         "unpipe": "1.0.0"
           "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
           "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==",
           "dev": true
           "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
           "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==",
           "dev": true
-        },
-        "qs": {
-          "version": "6.10.3",
-          "resolved": "https://registry.npmjs.org/qs/-/qs-6.10.3.tgz",
-          "integrity": "sha512-wr7M2E0OFRfIfJZjKGieI8lBKb7fRCH4Fv5KNPEs7gJ8jadvotdsS08PzOKR7opXhZ/Xkjtt3WF9g38drmyRqQ==",
-          "dev": true,
-          "requires": {
-            "side-channel": "^1.0.4"
-          }
         }
       }
     },
         }
       }
     },
       "dev": true
     },
     "bootstrap": {
       "dev": true
     },
     "bootstrap": {
-      "version": "4.6.1",
-      "resolved": "https://registry.npmjs.org/bootstrap/-/bootstrap-4.6.1.tgz",
-      "integrity": "sha512-0dj+VgI9Ecom+rvvpNZ4MUZJz8dcX7WCX+eTID9+/8HgOkv3dsRzi8BGeZJCQU6flWQVYxwTQnEZFrmJSEO7og=="
+      "version": "5.0.0",
+      "resolved": "https://registry.npmjs.org/bootstrap/-/bootstrap-5.0.0.tgz",
+      "integrity": "sha512-tmhPET9B9qCl8dCofvHeiIhi49iBt0EehmIsziZib65k1erBW1rHhj2s/2JsuQh5Pq+xz2E9bEbzp9B7xHG+VA=="
     },
     "brace-expansion": {
       "version": "1.1.11",
     },
     "brace-expansion": {
       "version": "1.1.11",
           "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-0.0.1.tgz",
           "integrity": "sha512-BapA40NHICOS+USX9SN4tyhq+A2RrN/Ws5F0Z5aMHDp98Fl86lX8Oti8B7uN93L4Ifv4fHOEA+pQw87gmMO/lQ==",
           "dev": true
           "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-0.0.1.tgz",
           "integrity": "sha512-BapA40NHICOS+USX9SN4tyhq+A2RrN/Ws5F0Z5aMHDp98Fl86lX8Oti8B7uN93L4Ifv4fHOEA+pQw87gmMO/lQ==",
           "dev": true
-        },
-        "readable-stream": {
-          "version": "2.3.7",
-          "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz",
-          "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==",
-          "dev": true,
-          "requires": {
-            "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"
-          },
-          "dependencies": {
-            "string_decoder": {
-              "version": "1.1.1",
-              "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz",
-              "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
-              "dev": true,
-              "requires": {
-                "safe-buffer": "~5.1.0"
-              }
-            }
-          }
         }
       }
     },
         }
       }
     },
         "safe-buffer": "^5.2.0"
       },
       "dependencies": {
         "safe-buffer": "^5.2.0"
       },
       "dependencies": {
-        "safe-buffer": {
-          "version": "5.2.1",
-          "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz",
-          "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==",
-          "dev": true
+        "readable-stream": {
+          "version": "3.6.1",
+          "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.1.tgz",
+          "integrity": "sha512-+rQmrWMYGA90yenhTYsLWAsLsqVC8osOw6PKE1HDYiO0gdPeKe/xDHNzIAIn4C91YQ6oenEhfYqqc1883qHbjQ==",
+          "dev": true,
+          "requires": {
+            "inherits": "^2.0.3",
+            "string_decoder": "^1.1.1",
+            "util-deprecate": "^1.0.1"
+          }
         }
       }
     },
         }
       }
     },
       }
     },
     "browserslist": {
       }
     },
     "browserslist": {
-      "version": "4.21.3",
-      "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.3.tgz",
-      "integrity": "sha512-898rgRXLAyRkM1GryrrBHGkqA5hlpkV5MhtZwg9QXeiyLUYs2k00Un05aX5l2/yJIOObYKOpS2JNo8nJDE7fWQ==",
-      "dev": true,
+      "version": "4.21.5",
+      "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.5.tgz",
+      "integrity": "sha512-tUkiguQGW7S3IhB7N+c2MV/HZPSCPAAiYBZXLsBhFB/PCy6ZKKsZrmBayHV9fdGV/ARIfJ14NkxKzRDjvp7L6w==",
       "requires": {
       "requires": {
-        "caniuse-lite": "^1.0.30001370",
-        "electron-to-chromium": "^1.4.202",
-        "node-releases": "^2.0.6",
-        "update-browserslist-db": "^1.0.5"
+        "caniuse-lite": "^1.0.30001449",
+        "electron-to-chromium": "^1.4.284",
+        "node-releases": "^2.0.8",
+        "update-browserslist-db": "^1.0.10"
       }
     },
     "bs-logger": {
       }
     },
     "bs-logger": {
       "version": "5.7.1",
       "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz",
       "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==",
       "version": "5.7.1",
       "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz",
       "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==",
-      "dev": true,
       "requires": {
         "base64-js": "^1.3.1",
         "ieee754": "^1.1.13"
       "requires": {
         "base64-js": "^1.3.1",
         "ieee754": "^1.1.13"
       "integrity": "sha512-571s0T7nZWK6vB67HI5dyUF7wXiNcfaPPPTl6zYCNApANjIvYJTg7hlud/+cJpdAhS7dVzqMLmfhfHR3rAcOjQ==",
       "dev": true
     },
       "integrity": "sha512-571s0T7nZWK6vB67HI5dyUF7wXiNcfaPPPTl6zYCNApANjIvYJTg7hlud/+cJpdAhS7dVzqMLmfhfHR3rAcOjQ==",
       "dev": true
     },
-    "builtin-modules": {
-      "version": "1.1.1",
-      "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-1.1.1.tgz",
-      "integrity": "sha512-wxXCdllwGhI2kCC0MnvTGYTMvnVZTvqgypkiTI8Pa5tcz2i6VqsqwYGgqwXji+4RgCzms6EajE4IxiUH6HH8nQ==",
-      "dev": true
-    },
     "builtin-status-codes": {
       "version": "3.0.0",
       "resolved": "https://registry.npmjs.org/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz",
     "builtin-status-codes": {
       "version": "3.0.0",
       "resolved": "https://registry.npmjs.org/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz",
       "dev": true
     },
     "cacache": {
       "dev": true
     },
     "cacache": {
-      "version": "15.2.0",
-      "resolved": "https://registry.npmjs.org/cacache/-/cacache-15.2.0.tgz",
-      "integrity": "sha512-uKoJSHmnrqXgthDFx/IU6ED/5xd+NNGe+Bb+kLZy7Ku4P+BaiWEUflAKPZ7eAzsYGcsAGASJZsybXp+quEcHTw==",
+      "version": "15.3.0",
+      "resolved": "https://registry.npmjs.org/cacache/-/cacache-15.3.0.tgz",
+      "integrity": "sha512-VVdYzXEn+cnbXpFgWs5hTT7OScegHVmLhJIR8Ufqk3iFD6A6j5iSX1KuBTfNEv4tdJWE2PzA6IVFtcLC7fN9wQ==",
       "dev": true,
       "requires": {
       "dev": true,
       "requires": {
+        "@npmcli/fs": "^1.0.0",
         "@npmcli/move-file": "^1.0.1",
         "chownr": "^2.0.0",
         "fs-minipass": "^2.0.0",
         "@npmcli/move-file": "^1.0.1",
         "chownr": "^2.0.0",
         "fs-minipass": "^2.0.0",
         "ssri": "^8.0.1",
         "tar": "^6.0.2",
         "unique-filename": "^1.1.1"
         "ssri": "^8.0.1",
         "tar": "^6.0.2",
         "unique-filename": "^1.1.1"
+      },
+      "dependencies": {
+        "chownr": {
+          "version": "2.0.0",
+          "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz",
+          "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==",
+          "dev": true
+        },
+        "lru-cache": {
+          "version": "6.0.0",
+          "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz",
+          "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==",
+          "dev": true,
+          "requires": {
+            "yallist": "^4.0.0"
+          }
+        },
+        "yallist": {
+          "version": "4.0.0",
+          "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
+          "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==",
+          "dev": true
+        }
       }
     },
     "cache-base": {
       }
     },
     "cache-base": {
       "resolved": "https://registry.npmjs.org/can-use-dom/-/can-use-dom-0.1.0.tgz",
       "integrity": "sha512-ceOhN1DL7Y4O6M0j9ICgmTYziV89WMd96SvSl0REd8PMgrY0B/WBOPoed5S1KUmJqXgUXh8gzSe6E3ae27upsQ=="
     },
       "resolved": "https://registry.npmjs.org/can-use-dom/-/can-use-dom-0.1.0.tgz",
       "integrity": "sha512-ceOhN1DL7Y4O6M0j9ICgmTYziV89WMd96SvSl0REd8PMgrY0B/WBOPoed5S1KUmJqXgUXh8gzSe6E3ae27upsQ=="
     },
-    "caniuse-api": {
-      "version": "3.0.0",
-      "resolved": "https://registry.npmjs.org/caniuse-api/-/caniuse-api-3.0.0.tgz",
-      "integrity": "sha512-bsTwuIg/BZZK/vreVTYYbSWoe2F+71P7K5QGEX+pT250DZbfU1MQ5prOKpPR+LL6uWKK3KMwMCAS74QB3Um1uw==",
-      "dev": true,
-      "requires": {
-        "browserslist": "^4.0.0",
-        "caniuse-lite": "^1.0.0",
-        "lodash.memoize": "^4.1.2",
-        "lodash.uniq": "^4.5.0"
-      }
-    },
     "caniuse-lite": {
     "caniuse-lite": {
-      "version": "1.0.30001381",
-      "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001381.tgz",
-      "integrity": "sha512-fEnkDOKpvp6qc+olg7+NzE1SqyfiyKf4uci7fAU38M3zxs0YOyKOxW/nMZ2l9sJbt7KZHcDIxUnbI0Iime7V4w==",
-      "dev": true
-    },
-    "canonical-path": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/canonical-path/-/canonical-path-1.0.0.tgz",
-      "integrity": "sha512-feylzsbDxi1gPZ1IjystzIQZagYYLvfKrSuygUCgf7z6x790VEzze5QEkdSV1U58RA7Hi0+v6fv4K54atOzATg==",
-      "dev": true
-    },
-    "capture-exit": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/capture-exit/-/capture-exit-2.0.0.tgz",
-      "integrity": "sha512-PiT/hQmTonHhl/HFGN+Lx3JJUznrVYJ3+AQsnthneZbvW7x+f08Tk7yLJTLEOUvBTbduLeeBkxEaYXUOUrRq6g==",
-      "dev": true,
-      "requires": {
-        "rsvp": "^4.8.4"
-      }
+      "version": "1.0.30001460",
+      "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001460.tgz",
+      "integrity": "sha512-Bud7abqjvEjipUkpLs4D7gR0l8hBYBHoa+tGtKJHvT2AYzLp1z7EmVkUT4ERpVUfca8S2HGIVs883D8pUH1ZzQ=="
     },
     "caseless": {
       "version": "0.12.0",
     },
     "caseless": {
       "version": "0.12.0",
       "dev": true
     },
     "chai": {
       "dev": true
     },
     "chai": {
-      "version": "4.3.6",
-      "resolved": "https://registry.npmjs.org/chai/-/chai-4.3.6.tgz",
-      "integrity": "sha512-bbcp3YfHCUzMOvKqsztczerVgBKSsEijCySNlHHbX3VG1nskvqjz5Rfso1gGwD6w6oOV3eI60pKuMOV5MV7p3Q==",
+      "version": "4.3.7",
+      "resolved": "https://registry.npmjs.org/chai/-/chai-4.3.7.tgz",
+      "integrity": "sha512-HLnAzZ2iupm25PlN0xFreAlBA5zaBSv3og0DdeGA4Ar6h6rJ3A0rolRUKJhSF2V10GZKDgWF/VmAEsNWjCRB+A==",
       "dev": true,
       "requires": {
         "assertion-error": "^1.1.0",
         "check-error": "^1.0.2",
       "dev": true,
       "requires": {
         "assertion-error": "^1.1.0",
         "check-error": "^1.0.2",
-        "deep-eql": "^3.0.1",
+        "deep-eql": "^4.1.2",
         "get-func-name": "^2.0.0",
         "loupe": "^2.3.1",
         "pathval": "^1.1.1",
         "get-func-name": "^2.0.0",
         "loupe": "^2.3.1",
         "pathval": "^1.1.1",
           }
         },
         "entities": {
           }
         },
         "entities": {
-          "version": "4.3.1",
-          "resolved": "https://registry.npmjs.org/entities/-/entities-4.3.1.tgz",
-          "integrity": "sha512-o4q/dYJlmyjP2zfnaWDUC6A3BQFmVTX+tZPezK7k0GLSU9QYCauscf5Y+qcEPzKL+EixVouYDgLQK5H9GrLpkg==",
+          "version": "4.4.0",
+          "resolved": "https://registry.npmjs.org/entities/-/entities-4.4.0.tgz",
+          "integrity": "sha512-oYp7156SP8LkeGD0GF85ad1X9Ai79WtRsZ2gxJqtBuzH+98YUV6jkHEKlZkMbcrjJjIVJNIDP/3WL9wQkoPbWA==",
           "dev": true
         },
         "parse5": {
           "dev": true
         },
         "parse5": {
-          "version": "7.0.0",
-          "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.0.0.tgz",
-          "integrity": "sha512-y/t8IXSPWTuRZqXc0ajH/UwDj4mnqLEbSttNbThcFhGrZuOyoyvNBO85PBp2jQa55wY9d07PBNjsK8ZP3K5U6g==",
+          "version": "7.1.2",
+          "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.1.2.tgz",
+          "integrity": "sha512-Czj1WaSVpaoj0wbhMzLmWD69anp2WH7FXMB9n1Sy8/ZFF9jolSQVMu1Ij5WIyGmcBmhk7EOndpO4mIpihVqAXw==",
           "dev": true,
           "requires": {
           "dev": true,
           "requires": {
-            "entities": "^4.3.0"
+            "entities": "^4.4.0"
           }
         },
         "parse5-htmlparser2-tree-adapter": {
           }
         },
         "parse5-htmlparser2-tree-adapter": {
           }
         },
         "entities": {
           }
         },
         "entities": {
-          "version": "4.3.1",
-          "resolved": "https://registry.npmjs.org/entities/-/entities-4.3.1.tgz",
-          "integrity": "sha512-o4q/dYJlmyjP2zfnaWDUC6A3BQFmVTX+tZPezK7k0GLSU9QYCauscf5Y+qcEPzKL+EixVouYDgLQK5H9GrLpkg==",
+          "version": "4.4.0",
+          "resolved": "https://registry.npmjs.org/entities/-/entities-4.4.0.tgz",
+          "integrity": "sha512-oYp7156SP8LkeGD0GF85ad1X9Ai79WtRsZ2gxJqtBuzH+98YUV6jkHEKlZkMbcrjJjIVJNIDP/3WL9wQkoPbWA==",
           "dev": true
         }
       }
           "dev": true
         }
       }
       }
     },
     "chownr": {
       }
     },
     "chownr": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz",
-      "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==",
-      "dev": true
+      "version": "1.1.4",
+      "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz",
+      "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==",
+      "optional": true
     },
     "chrome-remote-interface": {
       "version": "0.31.1",
     },
     "chrome-remote-interface": {
       "version": "0.31.1",
       "dev": true
     },
     "ci-info": {
       "dev": true
     },
     "ci-info": {
-      "version": "3.3.2",
-      "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.3.2.tgz",
-      "integrity": "sha512-xmDt/QIAdeZ9+nfdPsaBCpMvHNLFiLdjj59qjqn+6iPe6YmHGQ35sBnQ8uslRBXFmXkiZQOJRjvQeoGppoTjjg==",
+      "version": "3.8.0",
+      "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.8.0.tgz",
+      "integrity": "sha512-eXTggHWSooYhq49F2opQhuHWgzucfF2YgODK4e1566GQs5BIfP30B0oenwBJHfWxAs2fyPB1s7Mg949zLf61Yw==",
       "dev": true
     },
     "cipher-base": {
       "dev": true
     },
     "cipher-base": {
       "dev": true
     },
     "cjs-module-lexer": {
       "dev": true
     },
     "cjs-module-lexer": {
-      "version": "0.6.0",
-      "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-0.6.0.tgz",
-      "integrity": "sha512-uc2Vix1frTfnuzxxu1Hp4ktSvM3QaI4oXl4ZUqL1wjTu/BGki9TrCWoqLTg/drR1KwAEarXuRFCG2Svr1GxPFw==",
+      "version": "1.2.2",
+      "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-1.2.2.tgz",
+      "integrity": "sha512-cOU9usZw8/dXIXKtwa8pM0OTJQuJkxMN6w30csNRUerHfeQ5R6U3kkU/FtJeIf3M202OHfY2U8ccInBG7/xogA==",
       "dev": true
     },
     "cjson": {
       "dev": true
     },
     "cjson": {
       }
     },
     "classnames": {
       }
     },
     "classnames": {
-      "version": "2.3.1",
-      "resolved": "https://registry.npmjs.org/classnames/-/classnames-2.3.1.tgz",
-      "integrity": "sha512-OlQdbZ7gLfGarSqxesMesDa5uz7KFbID8Kpq/SxIoNGDqY8lSYs0D+hhtBXhcdB3rcbXArFr7vlHheLk1voeNA=="
+      "version": "2.3.2",
+      "resolved": "https://registry.npmjs.org/classnames/-/classnames-2.3.2.tgz",
+      "integrity": "sha512-CSbhY4cFEJRe6/GQzIk5qXZ4Jeg5pcsP7b5peFSDpffpe1cqjASH/n9UTjBwOp6XpMSTwQ8Za2K5V02ueA7Tmw=="
     },
     "clean-stack": {
       "version": "2.2.0",
     },
     "clean-stack": {
       "version": "2.2.0",
       }
     },
     "cli-table3": {
       }
     },
     "cli-table3": {
-      "version": "0.6.2",
-      "resolved": "https://registry.npmjs.org/cli-table3/-/cli-table3-0.6.2.tgz",
-      "integrity": "sha512-QyavHCaIC80cMivimWu4aWHilIpiDpfm3hGmqAmXVL1UsnbLuBSMd21hTX6VY4ZSDSM73ESLeF8TOYId3rBTbw==",
+      "version": "0.6.3",
+      "resolved": "https://registry.npmjs.org/cli-table3/-/cli-table3-0.6.3.tgz",
+      "integrity": "sha512-w5Jac5SykAeZJKntOxJCrm63Eg5/4dhMWIcuTbo9rpE+brgaSZo0RuNJZeOyMgsUdhDeojvgyQLmjI+K50ZGyg==",
       "dev": true,
       "requires": {
         "@colors/colors": "1.5.0",
       "dev": true,
       "requires": {
         "@colors/colors": "1.5.0",
       "dev": true
     },
     "cliui": {
       "dev": true
     },
     "cliui": {
-      "version": "7.0.4",
-      "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz",
-      "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==",
+      "version": "8.0.1",
+      "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz",
+      "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==",
       "requires": {
         "string-width": "^4.2.0",
       "requires": {
         "string-width": "^4.2.0",
-        "strip-ansi": "^6.0.0",
+        "strip-ansi": "^6.0.1",
         "wrap-ansi": "^7.0.0"
       }
     },
         "wrap-ansi": "^7.0.0"
       }
     },
       "dev": true
     },
     "code-block-writer": {
       "dev": true
     },
     "code-block-writer": {
-      "version": "10.1.1",
-      "resolved": "https://registry.npmjs.org/code-block-writer/-/code-block-writer-10.1.1.tgz",
-      "integrity": "sha512-67ueh2IRGst/51p0n6FvPrnRjAGHY5F8xdjkgrYE7DDzpJe6qA07RYQ9VcoUeo5ATOjSOiWpSL3SWBRRbempMw==",
+      "version": "11.0.3",
+      "resolved": "https://registry.npmjs.org/code-block-writer/-/code-block-writer-11.0.3.tgz",
+      "integrity": "sha512-NiujjUFB4SwScJq2bwbYUtXbZhBSlY6vYzm++3Q6oC+U+injTqfPYFK8wS9COOmb2lueqp0ZRB4nK1VYeHgNyw==",
       "dev": true
     },
     "code-point-at": {
       "version": "1.1.0",
       "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz",
       "dev": true
     },
     "code-point-at": {
       "version": "1.1.0",
       "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz",
-      "integrity": "sha512-RpAVKQA5T63xEj6/giIbUEtZwJ4UFIc3ZtvEkiaUERylqe8xb5IvqcgOurZLahv93CLKfxcw5YI+DZcUBRyLXA==",
-      "dev": true
-    },
-    "codelyzer": {
-      "version": "6.0.2",
-      "resolved": "https://registry.npmjs.org/codelyzer/-/codelyzer-6.0.2.tgz",
-      "integrity": "sha512-v3+E0Ucu2xWJMOJ2fA/q9pDT/hlxHftHGPUay1/1cTgyPV5JTHFdO9hqo837Sx2s9vKBMTt5gO+lhF95PO6J+g==",
-      "dev": true,
-      "requires": {
-        "@angular/compiler": "9.0.0",
-        "@angular/core": "9.0.0",
-        "app-root-path": "^3.0.0",
-        "aria-query": "^3.0.0",
-        "axobject-query": "2.0.2",
-        "css-selector-tokenizer": "^0.7.1",
-        "cssauron": "^1.4.0",
-        "damerau-levenshtein": "^1.0.4",
-        "rxjs": "^6.5.3",
-        "semver-dsl": "^1.0.1",
-        "source-map": "^0.5.7",
-        "sprintf-js": "^1.1.2",
-        "tslib": "^1.10.0",
-        "zone.js": "~0.10.3"
-      },
-      "dependencies": {
-        "@angular/compiler": {
-          "version": "9.0.0",
-          "resolved": "https://registry.npmjs.org/@angular/compiler/-/compiler-9.0.0.tgz",
-          "integrity": "sha512-ctjwuntPfZZT2mNj2NDIVu51t9cvbhl/16epc5xEwyzyDt76pX9UgwvY+MbXrf/C/FWwdtmNtfP698BKI+9leQ==",
-          "dev": true
-        },
-        "@angular/core": {
-          "version": "9.0.0",
-          "resolved": "https://registry.npmjs.org/@angular/core/-/core-9.0.0.tgz",
-          "integrity": "sha512-6Pxgsrf0qF9iFFqmIcWmjJGkkCaCm6V5QNnxMy2KloO3SDq6QuMVRbN9RtC8Urmo25LP+eZ6ZgYqFYpdD8Hd9w==",
-          "dev": true
-        },
-        "sprintf-js": {
-          "version": "1.1.2",
-          "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.1.2.tgz",
-          "integrity": "sha512-VE0SOVEHCk7Qc8ulkWw3ntAzXuqf7S2lvwQaDLRnUeIEaKNQJzV6BwmLKhOqT61aGhfUMrXeaBk+oDGCzvhcug==",
-          "dev": true
-        },
-        "tslib": {
-          "version": "1.14.1",
-          "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz",
-          "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==",
-          "dev": true
-        }
-      }
+      "integrity": "sha512-RpAVKQA5T63xEj6/giIbUEtZwJ4UFIc3ZtvEkiaUERylqe8xb5IvqcgOurZLahv93CLKfxcw5YI+DZcUBRyLXA=="
     },
     "coffeeify": {
       "version": "3.0.1",
     },
     "coffeeify": {
       "version": "3.0.1",
       "integrity": "sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==",
       "dev": true
     },
       "integrity": "sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==",
       "dev": true
     },
-    "colord": {
-      "version": "2.9.3",
-      "resolved": "https://registry.npmjs.org/colord/-/colord-2.9.3.tgz",
-      "integrity": "sha512-jeC1axXpnb0/2nn/Y1LPuLdgXBLH7aDcHu4KEKfqw3CUhX7ZpfBSlPKyqXE6btIgEzfWtrX3/tyBCaCvXvMkOw==",
-      "dev": true
-    },
     "colorette": {
     "colorette": {
-      "version": "1.4.0",
-      "resolved": "https://registry.npmjs.org/colorette/-/colorette-1.4.0.tgz",
-      "integrity": "sha512-Y2oEozpomLn7Q3HFP7dpww7AtMJplbM9lGZP6RDfHqmbeRjiwRg4n6VM6j4KLmRke85uWEI7JqF17f3pqdRA0g==",
+      "version": "2.0.19",
+      "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.19.tgz",
+      "integrity": "sha512-3tlv/dIP7FWvj3BsbHrGLJ6l/oKh1O3TcgBqMn+yyCagOxc23fyzDS6HypQbgxWbkpDnf52p1LuR4eWDQ/K9WQ==",
       "dev": true
     },
     "colors": {
       "dev": true
     },
     "colors": {
           "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-3.0.4.tgz",
           "integrity": "sha512-eDn9kqrAmVUC1wmZvlQ6Uhde44n+tXpqPrN8olQJbttgh0oKclk+SF54P47VEGE9CEiMeRwAP8BaM7UHvBkz2A==",
           "dev": true
           "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-3.0.4.tgz",
           "integrity": "sha512-eDn9kqrAmVUC1wmZvlQ6Uhde44n+tXpqPrN8olQJbttgh0oKclk+SF54P47VEGE9CEiMeRwAP8BaM7UHvBkz2A==",
           "dev": true
+        },
+        "source-map": {
+          "version": "0.5.7",
+          "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz",
+          "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==",
+          "dev": true
         }
       }
     },
         }
       }
     },
       "version": "1.0.8",
       "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz",
       "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==",
       "version": "1.0.8",
       "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz",
       "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==",
-      "dev": true,
       "requires": {
         "delayed-stream": "~1.0.0"
       }
       "requires": {
         "delayed-stream": "~1.0.0"
       }
       "integrity": "sha512-GHuDRO12Sypu2cV70d1dkA2EUmXHgntrzbpvOB+Qy+49ypNfGgFQIC2fhhXbnyrJRynDCAARsT7Ou0M6hirpfw=="
     },
     "commander": {
       "integrity": "sha512-GHuDRO12Sypu2cV70d1dkA2EUmXHgntrzbpvOB+Qy+49ypNfGgFQIC2fhhXbnyrJRynDCAARsT7Ou0M6hirpfw=="
     },
     "commander": {
-      "version": "7.2.0",
-      "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz",
-      "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==",
+      "version": "2.20.3",
+      "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz",
+      "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==",
       "dev": true
     },
     "common-tags": {
       "dev": true
     },
     "common-tags": {
           "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
           "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==",
           "dev": true
           "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
           "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==",
           "dev": true
+        },
+        "safe-buffer": {
+          "version": "5.1.2",
+          "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz",
+          "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==",
+          "dev": true
         }
       }
     },
         }
       }
     },
         "inherits": "^2.0.3",
         "readable-stream": "^2.2.2",
         "typedarray": "^0.0.6"
         "inherits": "^2.0.3",
         "readable-stream": "^2.2.2",
         "typedarray": "^0.0.6"
-      },
-      "dependencies": {
-        "readable-stream": {
-          "version": "2.3.7",
-          "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz",
-          "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==",
-          "dev": true,
-          "requires": {
-            "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"
-          }
-        },
-        "string_decoder": {
-          "version": "1.1.1",
-          "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz",
-          "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
-          "dev": true,
-          "requires": {
-            "safe-buffer": "~5.1.0"
-          }
-        }
       }
     },
     "connect": {
       }
     },
     "connect": {
     "console-control-strings": {
       "version": "1.1.0",
       "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz",
     "console-control-strings": {
       "version": "1.1.0",
       "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz",
-      "integrity": "sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ==",
-      "dev": true
+      "integrity": "sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ=="
     },
     "constants-browserify": {
       "version": "1.0.0",
     },
     "constants-browserify": {
       "version": "1.0.0",
       "dev": true,
       "requires": {
         "safe-buffer": "5.2.1"
       "dev": true,
       "requires": {
         "safe-buffer": "5.2.1"
-      },
-      "dependencies": {
-        "safe-buffer": {
-          "version": "5.2.1",
-          "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz",
-          "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==",
-          "dev": true
-        }
       }
     },
     "content-type": {
       }
     },
     "content-type": {
-      "version": "1.0.4",
-      "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz",
-      "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==",
+      "version": "1.0.5",
+      "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz",
+      "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==",
       "dev": true
     },
     "convert-source-map": {
       "dev": true
     },
     "convert-source-map": {
-      "version": "1.8.0",
-      "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.8.0.tgz",
-      "integrity": "sha512-+OQdjP49zViI/6i7nIJpA8rAl4sV/JdPfU9nZs3VqOwGIgizICvuN2ru6fMd+4llL0tar18UYJXfZ/TWtmhUjA==",
-      "requires": {
-        "safe-buffer": "~5.1.1"
-      }
+      "version": "1.9.0",
+      "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz",
+      "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A=="
     },
     "cookie": {
       "version": "0.5.0",
     },
     "cookie": {
       "version": "0.5.0",
       "dev": true
     },
     "copy-to-clipboard": {
       "dev": true
     },
     "copy-to-clipboard": {
-      "version": "3.3.2",
-      "resolved": "https://registry.npmjs.org/copy-to-clipboard/-/copy-to-clipboard-3.3.2.tgz",
-      "integrity": "sha512-Vme1Z6RUDzrb6xAI7EZlVZ5uvOk2F//GaxKUxajDqm9LhOVM1inxNAD2vy+UZDYsd0uyA9s7b3/FVZPSxqrCfg==",
+      "version": "3.3.3",
+      "resolved": "https://registry.npmjs.org/copy-to-clipboard/-/copy-to-clipboard-3.3.3.tgz",
+      "integrity": "sha512-2KV8NhB5JqC3ky0r9PMCAZKbUHSwtEo4CwCs0KXgruG43gX5PMqDEBbVU4OUzw2MuAWUfsuFmWvEKG5QRfSnJA==",
       "requires": {
         "toggle-selection": "^1.0.6"
       }
     },
     "copy-webpack-plugin": {
       "requires": {
         "toggle-selection": "^1.0.6"
       }
     },
     "copy-webpack-plugin": {
-      "version": "9.0.1",
-      "resolved": "https://registry.npmjs.org/copy-webpack-plugin/-/copy-webpack-plugin-9.0.1.tgz",
-      "integrity": "sha512-14gHKKdYIxF84jCEgPgYXCPpldbwpxxLbCmA7LReY7gvbaT555DgeBWBgBZM116tv/fO6RRJrsivBqRyRlukhw==",
+      "version": "10.2.1",
+      "resolved": "https://registry.npmjs.org/copy-webpack-plugin/-/copy-webpack-plugin-10.2.1.tgz",
+      "integrity": "sha512-nr81NhCAIpAWXGCK5thrKmfCQ6GDY0L5RN0U+BnIn/7Us55+UCex5ANNsNKmIVtDRnk0Ecf+/kzp9SUVrrBMLg==",
       "dev": true,
       "requires": {
       "dev": true,
       "requires": {
-        "fast-glob": "^3.2.5",
-        "glob-parent": "^6.0.0",
-        "globby": "^11.0.3",
+        "fast-glob": "^3.2.7",
+        "glob-parent": "^6.0.1",
+        "globby": "^12.0.2",
         "normalize-path": "^3.0.0",
         "normalize-path": "^3.0.0",
-        "p-limit": "^3.1.0",
-        "schema-utils": "^3.0.0",
+        "schema-utils": "^4.0.0",
         "serialize-javascript": "^6.0.0"
       },
       "dependencies": {
         "serialize-javascript": "^6.0.0"
       },
       "dependencies": {
-        "ajv": {
-          "version": "6.12.6",
-          "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz",
-          "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==",
-          "dev": true,
-          "requires": {
-            "fast-deep-equal": "^3.1.1",
-            "fast-json-stable-stringify": "^2.0.0",
-            "json-schema-traverse": "^0.4.1",
-            "uri-js": "^4.2.2"
-          }
-        },
-        "json-schema-traverse": {
-          "version": "0.4.1",
-          "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz",
-          "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==",
-          "dev": true
-        },
-        "p-limit": {
-          "version": "3.1.0",
-          "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz",
-          "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==",
+        "ajv-keywords": {
+          "version": "5.1.0",
+          "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz",
+          "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==",
           "dev": true,
           "requires": {
           "dev": true,
           "requires": {
-            "yocto-queue": "^0.1.0"
+            "fast-deep-equal": "^3.1.3"
           }
         },
         "schema-utils": {
           }
         },
         "schema-utils": {
-          "version": "3.1.1",
-          "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz",
-          "integrity": "sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==",
+          "version": "4.0.0",
+          "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.0.0.tgz",
+          "integrity": "sha512-1edyXKgh6XnJsJSQ8mKWXnN/BVaIbFMLpouRUrXgVq7WYne5kw3MW7UPhO44uRXQSIpTSXoJbmrR2X0w9kUTyg==",
           "dev": true,
           "requires": {
           "dev": true,
           "requires": {
-            "@types/json-schema": "^7.0.8",
-            "ajv": "^6.12.5",
-            "ajv-keywords": "^3.5.2"
+            "@types/json-schema": "^7.0.9",
+            "ajv": "^8.8.0",
+            "ajv-formats": "^2.1.1",
+            "ajv-keywords": "^5.0.0"
           }
         }
       }
     },
     "core-js": {
           }
         }
       }
     },
     "core-js": {
-      "version": "3.24.1",
-      "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.24.1.tgz",
-      "integrity": "sha512-0QTBSYSUZ6Gq21utGzkfITDylE8jWC9Ne1D2MrhvlsZBI1x39OdDIVbzSqtgMndIy6BlHxBXpMGqzZmnztg2rg=="
+      "version": "3.29.0",
+      "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.29.0.tgz",
+      "integrity": "sha512-VG23vuEisJNkGl6XQmFJd3rEG/so/CNatqeE+7uZAwTSwFeB/qaO0be8xZYUNWprJ/GIwL8aMt9cj1kvbpTZhg=="
     },
     "core-js-compat": {
     },
     "core-js-compat": {
-      "version": "3.24.1",
-      "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.24.1.tgz",
-      "integrity": "sha512-XhdNAGeRnTpp8xbD+sR/HFDK9CbeeeqXT6TuofXh3urqEevzkWmLRgrVoykodsw8okqo2pu1BOmuCKrHx63zdw==",
+      "version": "3.29.0",
+      "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.29.0.tgz",
+      "integrity": "sha512-ScMn3uZNAFhK2DGoEfErguoiAHhV2Ju+oJo/jK08p7B3f3UhocUrCCkTvnZaiS+edl5nlIoiBXKcwMc6elv4KQ==",
       "dev": true,
       "requires": {
       "dev": true,
       "requires": {
-        "browserslist": "^4.21.3",
-        "semver": "7.0.0"
-      },
-      "dependencies": {
-        "semver": {
-          "version": "7.0.0",
-          "resolved": "https://registry.npmjs.org/semver/-/semver-7.0.0.tgz",
-          "integrity": "sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A==",
-          "dev": true
-        }
+        "browserslist": "^4.21.5"
       }
     },
     "core-js-pure": {
       }
     },
     "core-js-pure": {
-      "version": "3.24.1",
-      "resolved": "https://registry.npmjs.org/core-js-pure/-/core-js-pure-3.24.1.tgz",
-      "integrity": "sha512-r1nJk41QLLPyozHUUPmILCEMtMw24NG4oWK6RbsDdjzQgg9ZvrUsPBj1MnG0wXXp1DCDU6j+wUvEmBSrtRbLXg=="
+      "version": "3.29.0",
+      "resolved": "https://registry.npmjs.org/core-js-pure/-/core-js-pure-3.29.0.tgz",
+      "integrity": "sha512-v94gUjN5UTe1n0yN/opTihJ8QBWD2O8i19RfTZR7foONPWArnjB96QA/wk5ozu1mm6ja3udQCzOzwQXTxi3xOQ=="
     },
     "core-util-is": {
       "version": "1.0.3",
       "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz",
     },
     "core-util-is": {
       "version": "1.0.3",
       "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz",
-      "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==",
-      "dev": true
+      "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ=="
     },
     "cors": {
       "version": "2.8.5",
     },
     "cors": {
       "version": "2.8.5",
       }
     },
     "cosmiconfig": {
       }
     },
     "cosmiconfig": {
-      "version": "7.0.1",
-      "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.0.1.tgz",
-      "integrity": "sha512-a1YWNUV2HwGimB7dU2s1wUMurNKjpx60HxBB6xUM8Re+2s1g1IIfJvFR0/iCF+XHdE0GMTKTuLR32UQff4TEyQ==",
+      "version": "7.1.0",
+      "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.1.0.tgz",
+      "integrity": "sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA==",
       "dev": true,
       "requires": {
         "@types/parse-json": "^4.0.0",
       "dev": true,
       "requires": {
         "@types/parse-json": "^4.0.0",
       }
     },
     "critters": {
       }
     },
     "critters": {
-      "version": "0.0.12",
-      "resolved": "https://registry.npmjs.org/critters/-/critters-0.0.12.tgz",
-      "integrity": "sha512-ujxKtKc/mWpjrOKeaACTaQ1aP0O31M0ZPWhfl85jZF1smPU4Ivb9va5Ox2poif4zVJQQo0LCFlzGtEZAsCAPcw==",
+      "version": "0.0.16",
+      "resolved": "https://registry.npmjs.org/critters/-/critters-0.0.16.tgz",
+      "integrity": "sha512-JwjgmO6i3y6RWtLYmXwO5jMd+maZt8Tnfu7VVISmEWyQqfLpB8soBswf8/2bu6SBXxtKA68Al3c+qIG1ApT68A==",
       "dev": true,
       "requires": {
         "chalk": "^4.1.0",
       "dev": true,
       "requires": {
         "chalk": "^4.1.0",
-        "css-select": "^4.1.3",
+        "css-select": "^4.2.0",
         "parse5": "^6.0.1",
         "parse5-htmlparser2-tree-adapter": "^6.0.1",
         "postcss": "^8.3.7",
         "parse5": "^6.0.1",
         "parse5-htmlparser2-tree-adapter": "^6.0.1",
         "postcss": "^8.3.7",
           "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
           "dev": true
         },
           "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
           "dev": true
         },
-        "postcss": {
-          "version": "8.4.16",
-          "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.16.tgz",
-          "integrity": "sha512-ipHE1XBvKzm5xI7hiHCZJCSugxvsdq2mPnsq5+UF+VHCjiBvtDrlxJfMBToWaP9D5XlgNmcFGqoHmUn0EYEaRQ==",
-          "dev": true,
-          "requires": {
-            "nanoid": "^3.3.4",
-            "picocolors": "^1.0.0",
-            "source-map-js": "^1.0.2"
-          }
-        },
         "supports-color": {
           "version": "7.2.0",
           "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
         "supports-color": {
           "version": "7.2.0",
           "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
       }
     },
     "cross-spawn": {
       }
     },
     "cross-spawn": {
-      "version": "6.0.5",
-      "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz",
-      "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==",
+      "version": "7.0.3",
+      "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz",
+      "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==",
       "dev": true,
       "requires": {
       "dev": true,
       "requires": {
-        "nice-try": "^1.0.4",
-        "path-key": "^2.0.1",
-        "semver": "^5.5.0",
-        "shebang-command": "^1.2.0",
-        "which": "^1.2.9"
+        "path-key": "^3.1.0",
+        "shebang-command": "^2.0.0",
+        "which": "^2.0.1"
       }
     },
     "crypt": {
       }
     },
     "crypt": {
       "dev": true
     },
     "css": {
       "dev": true
     },
     "css": {
-      "version": "2.2.4",
-      "resolved": "https://registry.npmjs.org/css/-/css-2.2.4.tgz",
-      "integrity": "sha512-oUnjmWpy0niI3x/mPL8dVEI1l7MnG3+HHyRPHf+YFSbK+svOhXpmSOcDURUh2aOCgl2grzrOPt1nHLuCVFULLw==",
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/css/-/css-3.0.0.tgz",
+      "integrity": "sha512-DG9pFfwOrzc+hawpmqX/dHYHJG+Bsdb0klhyi1sDneOgGOXy9wQIC8hzyVp1e4NRYDBdxcylvywPkkXCHAzTyQ==",
       "dev": true,
       "requires": {
       "dev": true,
       "requires": {
-        "inherits": "^2.0.3",
+        "inherits": "^2.0.4",
         "source-map": "^0.6.1",
         "source-map": "^0.6.1",
-        "source-map-resolve": "^0.5.2",
-        "urix": "^0.1.0"
+        "source-map-resolve": "^0.6.0"
       },
       "dependencies": {
         "source-map": {
       },
       "dependencies": {
         "source-map": {
       }
     },
     "css-blank-pseudo": {
       }
     },
     "css-blank-pseudo": {
-      "version": "0.1.4",
-      "resolved": "https://registry.npmjs.org/css-blank-pseudo/-/css-blank-pseudo-0.1.4.tgz",
-      "integrity": "sha512-LHz35Hr83dnFeipc7oqFDmsjHdljj3TQtxGGiNWSOsTLIAubSm4TEz8qCaKFpk7idaQ1GfWscF4E6mgpBysA1w==",
+      "version": "3.0.3",
+      "resolved": "https://registry.npmjs.org/css-blank-pseudo/-/css-blank-pseudo-3.0.3.tgz",
+      "integrity": "sha512-VS90XWtsHGqoM0t4KpH053c4ehxZ2E6HtGI7x68YFV0pTo/QmkV/YFA+NnlvK8guxZVNWGQhVNJGC39Q8XF4OQ==",
       "dev": true,
       "requires": {
       "dev": true,
       "requires": {
-        "postcss": "^7.0.5"
-      },
-      "dependencies": {
-        "picocolors": {
-          "version": "0.2.1",
-          "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz",
-          "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==",
-          "dev": true
-        },
-        "postcss": {
-          "version": "7.0.39",
-          "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz",
-          "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==",
-          "dev": true,
-          "requires": {
-            "picocolors": "^0.2.1",
-            "source-map": "^0.6.1"
-          }
-        },
-        "source-map": {
-          "version": "0.6.1",
-          "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
-          "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
-          "dev": true
-        }
+        "postcss-selector-parser": "^6.0.9"
       }
     },
       }
     },
-    "css-declaration-sorter": {
-      "version": "6.3.0",
-      "resolved": "https://registry.npmjs.org/css-declaration-sorter/-/css-declaration-sorter-6.3.0.tgz",
-      "integrity": "sha512-OGT677UGHJTAVMRhPO+HJ4oKln3wkBTwtDFH0ojbqm+MJm6xuDMHp2nkhh/ThaBqq20IbraBQSWKfSLNHQO9Og==",
-      "dev": true
-    },
     "css-has-pseudo": {
     "css-has-pseudo": {
-      "version": "0.10.0",
-      "resolved": "https://registry.npmjs.org/css-has-pseudo/-/css-has-pseudo-0.10.0.tgz",
-      "integrity": "sha512-Z8hnfsZu4o/kt+AuFzeGpLVhFOGO9mluyHBaA2bA8aCGTwah5sT3WV/fTHH8UNZUytOIImuGPrl/prlb4oX4qQ==",
+      "version": "3.0.4",
+      "resolved": "https://registry.npmjs.org/css-has-pseudo/-/css-has-pseudo-3.0.4.tgz",
+      "integrity": "sha512-Vse0xpR1K9MNlp2j5w1pgWIJtm1a8qS0JwS9goFYcImjlHEmywP9VUF05aGBXzGpDJF86QXk4L0ypBmwPhGArw==",
       "dev": true,
       "requires": {
       "dev": true,
       "requires": {
-        "postcss": "^7.0.6",
-        "postcss-selector-parser": "^5.0.0-rc.4"
-      },
-      "dependencies": {
-        "cssesc": {
-          "version": "2.0.0",
-          "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-2.0.0.tgz",
-          "integrity": "sha512-MsCAG1z9lPdoO/IUMLSBWBSVxVtJ1395VGIQ+Fc2gNdkQ1hNDnQdw3YhA71WJCBW1vdwA0cAnk/DnW6bqoEUYg==",
-          "dev": true
-        },
-        "picocolors": {
-          "version": "0.2.1",
-          "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz",
-          "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==",
-          "dev": true
-        },
-        "postcss": {
-          "version": "7.0.39",
-          "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz",
-          "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==",
-          "dev": true,
-          "requires": {
-            "picocolors": "^0.2.1",
-            "source-map": "^0.6.1"
-          }
-        },
-        "postcss-selector-parser": {
-          "version": "5.0.0",
-          "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-5.0.0.tgz",
-          "integrity": "sha512-w+zLE5Jhg6Liz8+rQOWEAwtwkyqpfnmsinXjXg6cY7YIONZZtgvE0v2O0uhQBs0peNomOJwWRKt6JBfTdTd3OQ==",
-          "dev": true,
-          "requires": {
-            "cssesc": "^2.0.0",
-            "indexes-of": "^1.0.1",
-            "uniq": "^1.0.1"
-          }
-        },
-        "source-map": {
-          "version": "0.6.1",
-          "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
-          "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
-          "dev": true
-        }
+        "postcss-selector-parser": "^6.0.9"
       }
     },
     "css-loader": {
       }
     },
     "css-loader": {
-      "version": "6.2.0",
-      "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-6.2.0.tgz",
-      "integrity": "sha512-/rvHfYRjIpymZblf49w8jYcRo2y9gj6rV8UroHGmBxKrIyGLokpycyKzp9OkitvqT29ZSpzJ0Ic7SpnJX3sC8g==",
+      "version": "6.5.1",
+      "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-6.5.1.tgz",
+      "integrity": "sha512-gEy2w9AnJNnD9Kuo4XAP9VflW/ujKoS9c/syO+uWMlm5igc7LysKzPXaDoR2vroROkSwsTS2tGr1yGGEbZOYZQ==",
       "dev": true,
       "requires": {
         "icss-utils": "^5.1.0",
       "dev": true,
       "requires": {
         "icss-utils": "^5.1.0",
         "semver": "^7.3.5"
       },
       "dependencies": {
         "semver": "^7.3.5"
       },
       "dependencies": {
-        "semver": {
-          "version": "7.3.7",
-          "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.7.tgz",
-          "integrity": "sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g==",
-          "dev": true,
-          "requires": {
-            "lru-cache": "^6.0.0"
-          }
-        }
-      }
-    },
-    "css-minimizer-webpack-plugin": {
-      "version": "3.0.2",
-      "resolved": "https://registry.npmjs.org/css-minimizer-webpack-plugin/-/css-minimizer-webpack-plugin-3.0.2.tgz",
-      "integrity": "sha512-B3I5e17RwvKPJwsxjjWcdgpU/zqylzK1bPVghcmpFHRL48DXiBgrtqz1BJsn68+t/zzaLp9kYAaEDvQ7GyanFQ==",
-      "dev": true,
-      "requires": {
-        "cssnano": "^5.0.6",
-        "jest-worker": "^27.0.2",
-        "p-limit": "^3.0.2",
-        "postcss": "^8.3.5",
-        "schema-utils": "^3.0.0",
-        "serialize-javascript": "^6.0.0",
-        "source-map": "^0.6.1"
-      },
-      "dependencies": {
-        "ajv": {
-          "version": "6.12.6",
-          "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz",
-          "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==",
-          "dev": true,
-          "requires": {
-            "fast-deep-equal": "^3.1.1",
-            "fast-json-stable-stringify": "^2.0.0",
-            "json-schema-traverse": "^0.4.1",
-            "uri-js": "^4.2.2"
-          }
-        },
-        "json-schema-traverse": {
-          "version": "0.4.1",
-          "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz",
-          "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==",
-          "dev": true
-        },
-        "p-limit": {
-          "version": "3.1.0",
-          "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz",
-          "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==",
+        "lru-cache": {
+          "version": "6.0.0",
+          "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz",
+          "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==",
           "dev": true,
           "requires": {
           "dev": true,
           "requires": {
-            "yocto-queue": "^0.1.0"
+            "yallist": "^4.0.0"
           }
         },
           }
         },
-        "schema-utils": {
-          "version": "3.1.1",
-          "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz",
-          "integrity": "sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==",
+        "semver": {
+          "version": "7.3.8",
+          "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz",
+          "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==",
           "dev": true,
           "requires": {
           "dev": true,
           "requires": {
-            "@types/json-schema": "^7.0.8",
-            "ajv": "^6.12.5",
-            "ajv-keywords": "^3.5.2"
+            "lru-cache": "^6.0.0"
           }
         },
           }
         },
-        "source-map": {
-          "version": "0.6.1",
-          "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
-          "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+        "yallist": {
+          "version": "4.0.0",
+          "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
+          "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==",
           "dev": true
         }
       }
     },
           "dev": true
         }
       }
     },
-    "css-parse": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/css-parse/-/css-parse-2.0.0.tgz",
-      "integrity": "sha512-UNIFik2RgSbiTwIW1IsFwXWn6vs+bYdq83LKTSOsx7NJR7WII9dxewkHLltfTLVppoUApHV0118a4RZRI9FLwA==",
-      "dev": true,
-      "requires": {
-        "css": "^2.0.0"
-      }
-    },
     "css-prefers-color-scheme": {
     "css-prefers-color-scheme": {
-      "version": "3.1.1",
-      "resolved": "https://registry.npmjs.org/css-prefers-color-scheme/-/css-prefers-color-scheme-3.1.1.tgz",
-      "integrity": "sha512-MTu6+tMs9S3EUqzmqLXEcgNRbNkkD/TGFvowpeoWJn5Vfq7FMgsmRQs9X5NXAURiOBmOxm/lLjsDNXDE6k9bhg==",
-      "dev": true,
-      "requires": {
-        "postcss": "^7.0.5"
-      },
-      "dependencies": {
-        "picocolors": {
-          "version": "0.2.1",
-          "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz",
-          "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==",
-          "dev": true
-        },
-        "postcss": {
-          "version": "7.0.39",
-          "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz",
-          "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==",
-          "dev": true,
-          "requires": {
-            "picocolors": "^0.2.1",
-            "source-map": "^0.6.1"
-          }
-        },
-        "source-map": {
-          "version": "0.6.1",
-          "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
-          "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
-          "dev": true
-        }
-      }
+      "version": "6.0.3",
+      "resolved": "https://registry.npmjs.org/css-prefers-color-scheme/-/css-prefers-color-scheme-6.0.3.tgz",
+      "integrity": "sha512-4BqMbZksRkJQx2zAjrokiGMd07RqOa2IxIrrN10lyBe9xhn9DEvjUK79J6jkeiv9D9hQFXKb6g1jwU62jziJZA==",
+      "dev": true
     },
     "css-select": {
       "version": "4.3.0",
     },
     "css-select": {
       "version": "4.3.0",
         "nth-check": "^2.0.1"
       }
     },
         "nth-check": "^2.0.1"
       }
     },
-    "css-selector-tokenizer": {
-      "version": "0.7.3",
-      "resolved": "https://registry.npmjs.org/css-selector-tokenizer/-/css-selector-tokenizer-0.7.3.tgz",
-      "integrity": "sha512-jWQv3oCEL5kMErj4wRnK/OPoBi0D+P1FR2cDCKYPaMeD2eW3/mttav8HT4hT1CKopiJI/psEULjkClhvJo4Lvg==",
+    "css-tree": {
+      "version": "1.0.0-alpha.39",
+      "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.0.0-alpha.39.tgz",
+      "integrity": "sha512-7UvkEYgBAHRG9Nt980lYxjsTrCyHFN53ky3wVsDkiMdVqylqRt+Zc+jm5qw7/qyOvN2dHSYtX0e4MbCCExSvnA==",
       "dev": true,
       "requires": {
       "dev": true,
       "requires": {
-        "cssesc": "^3.0.0",
-        "fastparse": "^1.1.2"
-      }
-    },
-    "css-tree": {
-      "version": "1.1.3",
-      "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.1.3.tgz",
-      "integrity": "sha512-tRpdppF7TRazZrjJ6v3stzv93qxRcSsFmW6cX0Zm2NVKpxE1WV1HblnghVv9TreireHkqI/VDEsfolRF1p6y7Q==",
-      "dev": true,
-      "requires": {
-        "mdn-data": "2.0.14",
+        "mdn-data": "2.0.6",
         "source-map": "^0.6.1"
       },
       "dependencies": {
         "source-map": "^0.6.1"
       },
       "dependencies": {
       "resolved": "https://registry.npmjs.org/css.escape/-/css.escape-1.5.1.tgz",
       "integrity": "sha512-YUifsXXuknHlUsmlgyY0PKzgPOr7/FjCePfHNt0jxm83wHZi44VDMQ7/fGNkjY3/jV1MC+1CmZbaHzugyeRtpg=="
     },
       "resolved": "https://registry.npmjs.org/css.escape/-/css.escape-1.5.1.tgz",
       "integrity": "sha512-YUifsXXuknHlUsmlgyY0PKzgPOr7/FjCePfHNt0jxm83wHZi44VDMQ7/fGNkjY3/jV1MC+1CmZbaHzugyeRtpg=="
     },
-    "cssauron": {
-      "version": "1.4.0",
-      "resolved": "https://registry.npmjs.org/cssauron/-/cssauron-1.4.0.tgz",
-      "integrity": "sha512-Ht70DcFBh+/ekjVrYS2PlDMdSQEl3OFNmjK6lcn49HptBgilXf/Zwg4uFh9Xn0pX3Q8YOkSjIFOfK2osvdqpBw==",
-      "dev": true,
-      "requires": {
-        "through": "X.X.X"
-      }
-    },
     "cssdb": {
     "cssdb": {
-      "version": "4.4.0",
-      "resolved": "https://registry.npmjs.org/cssdb/-/cssdb-4.4.0.tgz",
-      "integrity": "sha512-LsTAR1JPEM9TpGhl/0p3nQecC2LJ0kD8X5YARu1hk/9I1gril5vDtMZyNxcEpxxDj34YNck/ucjuoUd66K03oQ==",
+      "version": "5.1.0",
+      "resolved": "https://registry.npmjs.org/cssdb/-/cssdb-5.1.0.tgz",
+      "integrity": "sha512-/vqjXhv1x9eGkE/zO6o8ZOI7dgdZbLVLUGyVRbPgk6YipXbW87YzUCcO+Jrmi5bwJlAH6oD+MNeZyRgXea1GZw==",
       "dev": true
     },
     "cssesc": {
       "dev": true
     },
     "cssesc": {
       "integrity": "sha512-6tun4LoZnj7VN6YeegOVb67KBX/7JJsqvj+pv3ZA7F878/eN33AbGa5b/S/wXxS/tcp8nc40xRUrsPlxIyNUPg==",
       "dev": true
     },
       "integrity": "sha512-6tun4LoZnj7VN6YeegOVb67KBX/7JJsqvj+pv3ZA7F878/eN33AbGa5b/S/wXxS/tcp8nc40xRUrsPlxIyNUPg==",
       "dev": true
     },
-    "cssnano": {
-      "version": "5.1.13",
-      "resolved": "https://registry.npmjs.org/cssnano/-/cssnano-5.1.13.tgz",
-      "integrity": "sha512-S2SL2ekdEz6w6a2epXn4CmMKU4K3KpcyXLKfAYc9UQQqJRkD/2eLUG0vJ3Db/9OvO5GuAdgXw3pFbR6abqghDQ==",
-      "dev": true,
-      "requires": {
-        "cssnano-preset-default": "^5.2.12",
-        "lilconfig": "^2.0.3",
-        "yaml": "^1.10.2"
-      }
-    },
-    "cssnano-preset-default": {
-      "version": "5.2.12",
-      "resolved": "https://registry.npmjs.org/cssnano-preset-default/-/cssnano-preset-default-5.2.12.tgz",
-      "integrity": "sha512-OyCBTZi+PXgylz9HAA5kHyoYhfGcYdwFmyaJzWnzxuGRtnMw/kR6ilW9XzlzlRAtB6PLT/r+prYgkef7hngFew==",
-      "dev": true,
-      "requires": {
-        "css-declaration-sorter": "^6.3.0",
-        "cssnano-utils": "^3.1.0",
-        "postcss-calc": "^8.2.3",
-        "postcss-colormin": "^5.3.0",
-        "postcss-convert-values": "^5.1.2",
-        "postcss-discard-comments": "^5.1.2",
-        "postcss-discard-duplicates": "^5.1.0",
-        "postcss-discard-empty": "^5.1.1",
-        "postcss-discard-overridden": "^5.1.0",
-        "postcss-merge-longhand": "^5.1.6",
-        "postcss-merge-rules": "^5.1.2",
-        "postcss-minify-font-values": "^5.1.0",
-        "postcss-minify-gradients": "^5.1.1",
-        "postcss-minify-params": "^5.1.3",
-        "postcss-minify-selectors": "^5.2.1",
-        "postcss-normalize-charset": "^5.1.0",
-        "postcss-normalize-display-values": "^5.1.0",
-        "postcss-normalize-positions": "^5.1.1",
-        "postcss-normalize-repeat-style": "^5.1.1",
-        "postcss-normalize-string": "^5.1.0",
-        "postcss-normalize-timing-functions": "^5.1.0",
-        "postcss-normalize-unicode": "^5.1.0",
-        "postcss-normalize-url": "^5.1.0",
-        "postcss-normalize-whitespace": "^5.1.1",
-        "postcss-ordered-values": "^5.1.3",
-        "postcss-reduce-initial": "^5.1.0",
-        "postcss-reduce-transforms": "^5.1.0",
-        "postcss-svgo": "^5.1.0",
-        "postcss-unique-selectors": "^5.1.1"
-      }
-    },
-    "cssnano-utils": {
-      "version": "3.1.0",
-      "resolved": "https://registry.npmjs.org/cssnano-utils/-/cssnano-utils-3.1.0.tgz",
-      "integrity": "sha512-JQNR19/YZhz4psLX/rQ9M83e3z2Wf/HdJbryzte4a3NSuafyp9w/I4U+hx5C2S9g41qlstH7DEWnZaaj83OuEA==",
-      "dev": true
-    },
-    "csso": {
-      "version": "4.2.0",
-      "resolved": "https://registry.npmjs.org/csso/-/csso-4.2.0.tgz",
-      "integrity": "sha512-wvlcdIbf6pwKEk7vHj8/Bkc0B4ylXZruLvOgs9doS5eOsOpuodOV2zJChSpkp+pRpYQLQMeF04nr3Z68Sta9jA==",
-      "dev": true,
-      "requires": {
-        "css-tree": "^1.1.2"
-      }
-    },
     "cssom": {
       "version": "0.4.4",
       "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.4.4.tgz",
     "cssom": {
       "version": "0.4.4",
       "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.4.4.tgz",
       }
     },
     "csstype": {
       }
     },
     "csstype": {
-      "version": "3.1.0",
-      "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.0.tgz",
-      "integrity": "sha512-uX1KG+x9h5hIJsaKR9xHUeUraxf8IODOwq9JLNPq6BwB04a/xgpq3rcx47l5BZu5zBPlgD342tdke3Hom/nJRA=="
+      "version": "3.1.1",
+      "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.1.tgz",
+      "integrity": "sha512-DJR/VvkAvSZW9bTouZue2sSxDwdTN92uHjqeKVm+0dAqdfNykRzQ95tay8aXMBAAPpUiq4Qcug2L7neoRh2Egw=="
     },
     "cucumber": {
       "version": "4.2.1",
     },
     "cucumber": {
       "version": "4.2.1",
         "verror": "^1.9.0"
       },
       "dependencies": {
         "verror": "^1.9.0"
       },
       "dependencies": {
-        "commander": {
-          "version": "2.20.3",
-          "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz",
-          "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==",
-          "dev": true
-        },
         "cucumber-expressions": {
           "version": "5.0.18",
           "resolved": "https://registry.npmjs.org/cucumber-expressions/-/cucumber-expressions-5.0.18.tgz",
         "cucumber-expressions": {
           "version": "5.0.18",
           "resolved": "https://registry.npmjs.org/cucumber-expressions/-/cucumber-expressions-5.0.18.tgz",
           "integrity": "sha512-BYqTHXTGUIvg7t1r4sJNKcbDZkL92nkXA8YtRpbjFHRHGDL/NtUeiBJMeE60kIFN/Mg8ESaWQvftaYMGJzQZCQ==",
           "dev": true
         },
           "integrity": "sha512-BYqTHXTGUIvg7t1r4sJNKcbDZkL92nkXA8YtRpbjFHRHGDL/NtUeiBJMeE60kIFN/Mg8ESaWQvftaYMGJzQZCQ==",
           "dev": true
         },
+        "is-stream": {
+          "version": "1.1.0",
+          "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz",
+          "integrity": "sha512-uQPm8kcs47jx38atAcWTVxyltQYoPT68y9aWYdV6yWXSyW8mzSat0TL6CiWdZeCdF3KrAvpVtnHbTv4RN+rqdQ==",
+          "dev": true
+        },
         "serialize-error": {
           "version": "2.1.0",
           "resolved": "https://registry.npmjs.org/serialize-error/-/serialize-error-2.1.0.tgz",
         "serialize-error": {
           "version": "2.1.0",
           "resolved": "https://registry.npmjs.org/serialize-error/-/serialize-error-2.1.0.tgz",
       },
       "dependencies": {
         "@types/node": {
       },
       "dependencies": {
         "@types/node": {
-          "version": "14.18.25",
-          "resolved": "https://registry.npmjs.org/@types/node/-/node-14.18.25.tgz",
-          "integrity": "sha512-9pLfceRSrKIsv/MISN6RoFWTIzka36Uk2Uuf5a8cHyDYhEgl5Hm5dXoe621KULeBjt+cFsY18mILsWWtJeG80w==",
+          "version": "14.18.37",
+          "resolved": "https://registry.npmjs.org/@types/node/-/node-14.18.37.tgz",
+          "integrity": "sha512-7GgtHCs/QZrBrDzgIJnQtuSvhFSwhyYSI2uafSwZoNt1iOGhEN5fwNrQMjtONyHm9+/LoA4453jH0CMYcr06Pg==",
           "dev": true
         },
         "ansi-styles": {
           "dev": true
         },
         "ansi-styles": {
           "integrity": "sha512-P0CysNDQ7rtVw4QIQtm+MRxV66vKFSvlsQvGYXZWR3qFU0jlMKHZZZgw8e+8DSah4UDKMqnknRDQz+xuQXQ/Zg==",
           "dev": true
         },
           "integrity": "sha512-P0CysNDQ7rtVw4QIQtm+MRxV66vKFSvlsQvGYXZWR3qFU0jlMKHZZZgw8e+8DSah4UDKMqnknRDQz+xuQXQ/Zg==",
           "dev": true
         },
-        "cross-spawn": {
-          "version": "7.0.3",
-          "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz",
-          "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==",
-          "dev": true,
-          "requires": {
-            "path-key": "^3.1.0",
-            "shebang-command": "^2.0.0",
-            "which": "^2.0.1"
-          }
-        },
         "execa": {
           "version": "4.1.0",
           "resolved": "https://registry.npmjs.org/execa/-/execa-4.1.0.tgz",
         "execa": {
           "version": "4.1.0",
           "resolved": "https://registry.npmjs.org/execa/-/execa-4.1.0.tgz",
             "strip-final-newline": "^2.0.0"
           }
         },
             "strip-final-newline": "^2.0.0"
           }
         },
-        "fs-extra": {
-          "version": "9.1.0",
-          "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz",
-          "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==",
-          "dev": true,
-          "requires": {
-            "at-least-node": "^1.0.0",
-            "graceful-fs": "^4.2.0",
-            "jsonfile": "^6.0.1",
-            "universalify": "^2.0.0"
-          }
-        },
         "get-stream": {
           "version": "5.2.0",
           "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz",
         "get-stream": {
           "version": "5.2.0",
           "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz",
           "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
           "dev": true
         },
           "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
           "dev": true
         },
-        "is-stream": {
-          "version": "2.0.1",
-          "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz",
-          "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==",
+        "human-signals": {
+          "version": "1.1.1",
+          "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-1.1.1.tgz",
+          "integrity": "sha512-SEQu7vl8KjNL2eoGBLF3+wAjpsNfA9XMlXAYj/3EdaNfAlxKthD1xjEQfGOUhllCGGJVNY34bRr6lPINhNjyZw==",
           "dev": true
         },
           "dev": true
         },
-        "npm-run-path": {
-          "version": "4.0.1",
-          "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz",
-          "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==",
+        "lru-cache": {
+          "version": "6.0.0",
+          "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz",
+          "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==",
           "dev": true,
           "requires": {
           "dev": true,
           "requires": {
-            "path-key": "^3.0.0"
+            "yallist": "^4.0.0"
           }
         },
           }
         },
-        "path-key": {
-          "version": "3.1.1",
-          "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz",
-          "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==",
+        "proxy-from-env": {
+          "version": "1.0.0",
+          "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.0.0.tgz",
+          "integrity": "sha512-F2JHgJQ1iqwnHDcQjVBsq3n/uoaFL+iPW/eAeL7kVxy/2RrWaN4WroKjjvbsoRtv0ftelNyC01bjRhn/bhcf4A==",
           "dev": true
         },
         "semver": {
           "dev": true
         },
         "semver": {
-          "version": "7.3.7",
-          "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.7.tgz",
-          "integrity": "sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g==",
+          "version": "7.3.8",
+          "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz",
+          "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==",
           "dev": true,
           "requires": {
             "lru-cache": "^6.0.0"
           }
         },
           "dev": true,
           "requires": {
             "lru-cache": "^6.0.0"
           }
         },
-        "shebang-command": {
-          "version": "2.0.0",
-          "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz",
-          "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==",
-          "dev": true,
-          "requires": {
-            "shebang-regex": "^3.0.0"
-          }
-        },
-        "shebang-regex": {
-          "version": "3.0.0",
-          "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz",
-          "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==",
-          "dev": true
-        },
         "supports-color": {
           "version": "8.1.1",
           "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz",
         "supports-color": {
           "version": "8.1.1",
           "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz",
             "rimraf": "^3.0.0"
           }
         },
             "rimraf": "^3.0.0"
           }
         },
-        "which": {
-          "version": "2.0.2",
-          "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz",
-          "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==",
-          "dev": true,
-          "requires": {
-            "isexe": "^2.0.0"
-          }
+        "yallist": {
+          "version": "4.0.0",
+          "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
+          "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==",
+          "dev": true
         }
       }
     },
         }
       }
     },
+    "cypress-axe": {
+      "version": "0.14.0",
+      "resolved": "https://registry.npmjs.org/cypress-axe/-/cypress-axe-0.14.0.tgz",
+      "integrity": "sha512-7Rdjnko0MjggCmndc1wECAkvQBIhuy+DRtjF7bd5YPZRFvubfMNvrxfqD8PWQmxm7MZE0ffS4Xr43V6ZmvLopg==",
+      "dev": true
+    },
     "cypress-cucumber-preprocessor": {
       "version": "4.3.1",
       "resolved": "https://registry.npmjs.org/cypress-cucumber-preprocessor/-/cypress-cucumber-preprocessor-4.3.1.tgz",
     "cypress-cucumber-preprocessor": {
       "version": "4.3.1",
       "resolved": "https://registry.npmjs.org/cypress-cucumber-preprocessor/-/cypress-cucumber-preprocessor-4.3.1.tgz",
         "type": "^1.0.1"
       }
     },
         "type": "^1.0.1"
       }
     },
-    "damerau-levenshtein": {
-      "version": "1.0.8",
-      "resolved": "https://registry.npmjs.org/damerau-levenshtein/-/damerau-levenshtein-1.0.8.tgz",
-      "integrity": "sha512-sdQSFB7+llfUcQHUQO3+B8ERRj0Oa4w9POWMI/puGtuf7gFywGmkaLCElnudfTiKZV+NvHqL0ifzdrI8Ro7ESA==",
-      "dev": true
-    },
     "dargs": {
       "version": "7.0.0",
       "resolved": "https://registry.npmjs.org/dargs/-/dargs-7.0.0.tgz",
     "dargs": {
       "version": "7.0.0",
       "resolved": "https://registry.npmjs.org/dargs/-/dargs-7.0.0.tgz",
       },
       "dependencies": {
         "punycode": {
       },
       "dependencies": {
         "punycode": {
-          "version": "2.1.1",
-          "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz",
-          "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==",
+          "version": "2.3.0",
+          "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.0.tgz",
+          "integrity": "sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==",
           "dev": true
         },
         "tr46": {
           "dev": true
         },
         "tr46": {
       "dev": true
     },
     "dayjs": {
       "dev": true
     },
     "dayjs": {
-      "version": "1.11.5",
-      "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.11.5.tgz",
-      "integrity": "sha512-CAdX5Q3YW3Gclyo5Vpqkgpj8fSdLQcRuzfX6mC6Phy0nfJ0eGYOeS7m4mt2plDWLAtA4TqTakvbboHvUxfe4iA==",
+      "version": "1.11.7",
+      "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.11.7.tgz",
+      "integrity": "sha512-+Yw9U6YO5TQohxLcIkrXBeY73WP3ejHWVvx8XCk3gxvQDCTEmS48ZrSZCKciI7Bhl/uCMyxYtE9UqRILmFphkQ==",
       "dev": true
     },
     "debug": {
       "dev": true
     },
     "debug": {
       }
     },
     "decamelize": {
       }
     },
     "decamelize": {
-      "version": "1.2.0",
-      "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz",
-      "integrity": "sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==",
+      "version": "4.0.0",
+      "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-4.0.0.tgz",
+      "integrity": "sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ==",
       "dev": true
     },
     "decamelize-keys": {
       "dev": true
     },
     "decamelize-keys": {
-      "version": "1.1.0",
-      "resolved": "https://registry.npmjs.org/decamelize-keys/-/decamelize-keys-1.1.0.tgz",
-      "integrity": "sha512-ocLWuYzRPoS9bfiSdDd3cxvrzovVMZnRDVEzAs+hWIVXGDbHxWMECij2OBuyB/An0FFW/nLuq6Kv1i/YC5Qfzg==",
+      "version": "1.1.1",
+      "resolved": "https://registry.npmjs.org/decamelize-keys/-/decamelize-keys-1.1.1.tgz",
+      "integrity": "sha512-WiPxgEirIV0/eIOMcnFBA3/IJZAZqKnwAwWyvvdi4lsr1WCN22nhdf/3db3DoZcUjTV2SqfzIwNyp6y2xs3nmg==",
       "dev": true,
       "requires": {
         "decamelize": "^1.1.0",
         "map-obj": "^1.0.0"
       },
       "dependencies": {
       "dev": true,
       "requires": {
         "decamelize": "^1.1.0",
         "map-obj": "^1.0.0"
       },
       "dependencies": {
+        "decamelize": {
+          "version": "1.2.0",
+          "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz",
+          "integrity": "sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==",
+          "dev": true
+        },
         "map-obj": {
           "version": "1.0.1",
           "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz",
         "map-obj": {
           "version": "1.0.1",
           "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz",
       }
     },
     "decimal.js": {
       }
     },
     "decimal.js": {
-      "version": "10.4.0",
-      "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.4.0.tgz",
-      "integrity": "sha512-Nv6ENEzyPQ6AItkGwLE2PGKinZZ9g59vSh2BeH6NqPu0OTKZ5ruJsVqh/orbAnqXc9pBbgXAIrc2EyaCj8NpGg==",
+      "version": "10.4.3",
+      "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.4.3.tgz",
+      "integrity": "sha512-VBBaLc1MgL5XpzgIP7ny5Z6Nx3UrRkIViUkPUdtl9aya5amy3De1gsUUSB1g3+3sExYNjCAsAznmukyxCb1GRA==",
       "dev": true
     },
     "decode-uri-component": {
       "dev": true
     },
     "decode-uri-component": {
-      "version": "0.2.0",
-      "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz",
-      "integrity": "sha512-hjf+xovcEn31w/EUYdTXQh/8smFL/dzYjohQGEIgjyNavaJfBY2p5F527Bo1VPATxv0VYTUC2bOcXvqFwk78Og==",
+      "version": "0.2.2",
+      "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.2.tgz",
+      "integrity": "sha512-FqUYQ+8o158GyGTrMFJms9qh3CqTKvAqgqsTnkLI8sKu0028orqBhxNMFkFen0zGyg6epACD32pjVk58ngIErQ==",
+      "dev": true
+    },
+    "decompress-response": {
+      "version": "4.2.1",
+      "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-4.2.1.tgz",
+      "integrity": "sha512-jOSne2qbyE+/r8G1VU+G/82LBs2Fs4LAsTiLSHOCOMZQl2OKZ6i8i4IyHemTe+/yIXOtTcRQMzPcgyhoFlqPkw==",
+      "optional": true,
+      "requires": {
+        "mimic-response": "^2.0.0"
+      }
+    },
+    "dedent": {
+      "version": "0.7.0",
+      "resolved": "https://registry.npmjs.org/dedent/-/dedent-0.7.0.tgz",
+      "integrity": "sha512-Q6fKUPqnAHAyhiUgFU7BUzLiv0kd8saH9al7tnu5Q/okj6dnupxyTgFIBjVzJATdfIAm9NAsvXNzjaKa+bxVyA==",
       "dev": true
     },
     "deep-eql": {
       "dev": true
     },
     "deep-eql": {
-      "version": "3.0.1",
-      "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-3.0.1.tgz",
-      "integrity": "sha512-+QeIQyN5ZuO+3Uk5DYh6/1eKO0m0YmJFGNmFHGACpf1ClL1nmlV/p4gNgbl2pJGxgXb4faqo6UE+M5ACEMyVcw==",
+      "version": "4.1.3",
+      "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-4.1.3.tgz",
+      "integrity": "sha512-WaEtAOpRA1MQ0eohqZjpGD8zdI0Ovsm8mmFhaDN8dvDZzyoUMcYDnf5Y6iu7HTXxf8JDS23qWa4a+hKCDyOPzw==",
       "dev": true,
       "requires": {
         "type-detect": "^4.0.0"
       "dev": true,
       "requires": {
         "type-detect": "^4.0.0"
       "dev": true
     },
     "deepmerge": {
       "dev": true
     },
     "deepmerge": {
-      "version": "4.2.2",
-      "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.2.2.tgz",
-      "integrity": "sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg=="
+      "version": "4.3.0",
+      "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.0.tgz",
+      "integrity": "sha512-z2wJZXrmeHdvYJp/Ux55wIjqo81G5Bp4c+oELTW+7ar6SogWHajt5a9gO3s3IDaGSAXjDk0vlQKN3rms8ab3og=="
     },
     "default-gateway": {
     },
     "default-gateway": {
-      "version": "4.2.0",
-      "resolved": "https://registry.npmjs.org/default-gateway/-/default-gateway-4.2.0.tgz",
-      "integrity": "sha512-h6sMrVB1VMWVrW13mSc6ia/DwYYw5MN6+exNu1OaJeFac5aSAvwM7lZ0NVfTABuSkQelr4h5oebg3KB1XPdjgA==",
+      "version": "6.0.3",
+      "resolved": "https://registry.npmjs.org/default-gateway/-/default-gateway-6.0.3.tgz",
+      "integrity": "sha512-fwSOJsbbNzZ/CUFpqFBqYfYNLj1NbMPm8MMCIzHjC83iSJRBEGmDUxU+WP661BaBQImeC2yHwXtz+P/O9o+XEg==",
       "dev": true,
       "requires": {
       "dev": true,
       "requires": {
-        "execa": "^1.0.0",
-        "ip-regex": "^2.1.0"
+        "execa": "^5.0.0"
       }
     },
     "defaults": {
       }
     },
     "defaults": {
-      "version": "1.0.3",
-      "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.3.tgz",
-      "integrity": "sha512-s82itHOnYrN0Ib8r+z7laQz3sdE+4FP3d9Q7VLO7U+KRT+CR0GsWuyHxzdAY82I7cXv0G/twrqomTJLOssO5HA==",
+      "version": "1.0.4",
+      "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.4.tgz",
+      "integrity": "sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==",
       "dev": true,
       "requires": {
         "clone": "^1.0.2"
       "dev": true,
       "requires": {
         "clone": "^1.0.2"
       "dev": true
     },
     "define-properties": {
       "dev": true
     },
     "define-properties": {
-      "version": "1.1.4",
-      "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.4.tgz",
-      "integrity": "sha512-uckOqKcfaVvtBdsVkdPv3XjveQJsNQqmhXgRi8uhvWWuPYZCNlzT8qAyblUgNoXdHdjMTzAqeGjAoli8f+bzPA==",
+      "version": "1.2.0",
+      "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.0.tgz",
+      "integrity": "sha512-xvqAVKGfT1+UAvPwKTVw/njhdQ8ZhXK4lI0bCIuCMrp2up9nPnaDftrLtmpTazqd1o+UY4zgzU+avtMbDP+ldA==",
       "dev": true,
       "requires": {
         "has-property-descriptors": "^1.0.0",
       "dev": true,
       "requires": {
         "has-property-descriptors": "^1.0.0",
       }
     },
     "defined": {
       }
     },
     "defined": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/defined/-/defined-1.0.0.tgz",
-      "integrity": "sha512-Y2caI5+ZwS5c3RiNDJ6u53VhQHv+hHKwhkI1iHvceKUHw9Df6EK2zRLfjejRgMuCuxK7PfSWIMwWecceVvThjQ==",
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/defined/-/defined-1.0.1.tgz",
+      "integrity": "sha512-hsBd2qSVCRE+5PmNdHt1uzyrFu5d3RwmFDKzyNZMFq/EwDNJF7Ee5+D5oEKF0hU6LhtoUF1macFvOe4AskQC1Q==",
       "dev": true
     },
     "del": {
       "dev": true
     },
     "del": {
-      "version": "4.1.1",
-      "resolved": "https://registry.npmjs.org/del/-/del-4.1.1.tgz",
-      "integrity": "sha512-QwGuEUouP2kVwQenAsOof5Fv8K9t3D8Ca8NxcXKrIpEHjTXK5J2nXLdP+ALI1cgv8wj7KuwBhTwBkOZSJKM5XQ==",
+      "version": "6.1.1",
+      "resolved": "https://registry.npmjs.org/del/-/del-6.1.1.tgz",
+      "integrity": "sha512-ua8BhapfP0JUJKC/zV9yHHDW/rDoDxP4Zhn3AkA6/xT6gY7jYXJiaeyBZznYVujhZZET+UgcbZiQ7sN3WqcImg==",
       "dev": true,
       "requires": {
       "dev": true,
       "requires": {
-        "@types/glob": "^7.1.1",
-        "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"
+        "globby": "^11.0.1",
+        "graceful-fs": "^4.2.4",
+        "is-glob": "^4.0.1",
+        "is-path-cwd": "^2.2.0",
+        "is-path-inside": "^3.0.2",
+        "p-map": "^4.0.0",
+        "rimraf": "^3.0.2",
+        "slash": "^3.0.0"
       },
       "dependencies": {
         "array-union": {
       },
       "dependencies": {
         "array-union": {
-          "version": "1.0.2",
-          "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz",
-          "integrity": "sha512-Dxr6QJj/RdU/hCaBjOfxW+q6lyuVE6JFWIrAUpuOOhoJJoQ99cUn3igRaHVB5P9WrgFVN0FfArM3x0cueOU8ng==",
-          "dev": true,
-          "requires": {
-            "array-uniq": "^1.0.1"
-          }
+          "version": "2.1.0",
+          "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz",
+          "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==",
+          "dev": true
         },
         "globby": {
         },
         "globby": {
-          "version": "6.1.0",
-          "resolved": "https://registry.npmjs.org/globby/-/globby-6.1.0.tgz",
-          "integrity": "sha512-KVbFv2TQtbzCoxAnfD6JcHZTYCzyliEaaeM/gH8qQdkKr5s0OP9scEgvdcngyk7AVdY6YVW/TJHd+lQ/Df3Daw==",
+          "version": "11.1.0",
+          "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz",
+          "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==",
           "dev": true,
           "requires": {
           "dev": true,
           "requires": {
-            "array-union": "^1.0.1",
-            "glob": "^7.0.3",
-            "object-assign": "^4.0.1",
-            "pify": "^2.0.0",
-            "pinkie-promise": "^2.0.0"
-          },
-          "dependencies": {
-            "pify": {
-              "version": "2.3.0",
-              "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz",
-              "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==",
-              "dev": true
-            }
+            "array-union": "^2.1.0",
+            "dir-glob": "^3.0.1",
+            "fast-glob": "^3.2.9",
+            "ignore": "^5.2.0",
+            "merge2": "^1.4.1",
+            "slash": "^3.0.0"
           }
         },
           }
         },
-        "p-map": {
-          "version": "2.1.0",
-          "resolved": "https://registry.npmjs.org/p-map/-/p-map-2.1.0.tgz",
-          "integrity": "sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw==",
+        "slash": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz",
+          "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==",
           "dev": true
           "dev": true
-        },
-        "rimraf": {
-          "version": "2.7.1",
-          "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz",
-          "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==",
-          "dev": true,
-          "requires": {
-            "glob": "^7.1.3"
-          }
         }
       }
     },
     "delayed-stream": {
       "version": "1.0.0",
       "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz",
         }
       }
     },
     "delayed-stream": {
       "version": "1.0.0",
       "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz",
-      "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==",
-      "dev": true
+      "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ=="
     },
     "delegates": {
       "version": "1.0.0",
       "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz",
     },
     "delegates": {
       "version": "1.0.0",
       "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz",
-      "integrity": "sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==",
-      "dev": true
+      "integrity": "sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ=="
     },
     "depd": {
       "version": "2.0.0",
     },
     "depd": {
       "version": "2.0.0",
       "integrity": "sha512-DtCOLG98P007x7wiiOmfI0fi3eIKyWiLTGJ2MDnVi/E04lWGbf+JzrRHMm0rgIIZJGtHpKpbVgLWHrv8xXpc3Q==",
       "dev": true
     },
       "integrity": "sha512-DtCOLG98P007x7wiiOmfI0fi3eIKyWiLTGJ2MDnVi/E04lWGbf+JzrRHMm0rgIIZJGtHpKpbVgLWHrv8xXpc3Q==",
       "dev": true
     },
+    "detect-libc": {
+      "version": "1.0.3",
+      "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-1.0.3.tgz",
+      "integrity": "sha512-pGjwhsmsp4kL2RTz08wcOlGN83otlqHeD/Z5T8GXZB+/YcpQ/dgo+lbU8ZsGxV0HIvqqxo9l7mqYwyYMD9bKDg==",
+      "optional": true
+    },
     "detect-newline": {
       "version": "3.1.0",
       "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-3.1.0.tgz",
     "detect-newline": {
       "version": "3.1.0",
       "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-3.1.0.tgz",
       "dev": true
     },
     "diff-sequences": {
       "dev": true
     },
     "diff-sequences": {
-      "version": "25.2.6",
-      "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-25.2.6.tgz",
-      "integrity": "sha512-Hq8o7+6GaZeoFjtpgvRBUknSXNeJiCx7V9Fr94ZMljNiCr9n9L8H8aJqgWOQiDDGdyn29fRNcDdRVJ5fdyihfg==",
+      "version": "28.1.1",
+      "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-28.1.1.tgz",
+      "integrity": "sha512-FU0iFaH/E23a+a718l8Qa/19bF9p06kgE0KipMOMadwa3SjnaElKzPaUC0vnibs6/B/9ni97s61mcejk8W1fQw==",
       "dev": true
     },
     "diffie-hellman": {
       "dev": true
     },
     "diffie-hellman": {
         "buffer-indexof": "^1.0.0"
       }
     },
         "buffer-indexof": "^1.0.0"
       }
     },
+    "doctrine": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz",
+      "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==",
+      "dev": true,
+      "requires": {
+        "esutils": "^2.0.2"
+      }
+    },
     "dom-serializer": {
       "version": "1.4.1",
       "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.4.1.tgz",
     "dom-serializer": {
       "version": "1.4.1",
       "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.4.1.tgz",
         "domelementtype": "^2.2.0"
       }
     },
         "domelementtype": "^2.2.0"
       }
     },
+    "dommatrix": {
+      "version": "1.0.3",
+      "resolved": "https://registry.npmjs.org/dommatrix/-/dommatrix-1.0.3.tgz",
+      "integrity": "sha512-l32Xp/TLgWb8ReqbVJAFIvXmY7go4nTxxlWiAFyhoQw9RKEOHBZNnyGvJWqDVSPmq3Y9HlM4npqF/T6VMOXhww==",
+      "dev": true
+    },
     "dompurify": {
       "version": "2.3.3",
       "resolved": "https://registry.npmjs.org/dompurify/-/dompurify-2.3.3.tgz",
     "dompurify": {
       "version": "2.3.3",
       "resolved": "https://registry.npmjs.org/dompurify/-/dompurify-2.3.3.tgz",
       "integrity": "sha512-/nt74Rm+PcfnirXGEdhZleTwGC2LMnuKTeeTIlI82xb5loBBoXNYzr2ezCroPSMtilK8EZIfcNZwOcHN+ib1Lg==",
       "dev": true
     },
       "integrity": "sha512-/nt74Rm+PcfnirXGEdhZleTwGC2LMnuKTeeTIlI82xb5loBBoXNYzr2ezCroPSMtilK8EZIfcNZwOcHN+ib1Lg==",
       "dev": true
     },
+    "dotenv": {
+      "version": "10.0.0",
+      "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-10.0.0.tgz",
+      "integrity": "sha512-rlBi9d8jpv9Sf1klPjNfFAuWDjKLwTIJJ/VxtoTwIR6hnZxcEOQCZg2oIL3MWBYw5GpUDKOEnND7LXTbIpQ03Q==",
+      "dev": true
+    },
     "drange": {
       "version": "1.1.1",
       "resolved": "https://registry.npmjs.org/drange/-/drange-1.1.1.tgz",
     "drange": {
       "version": "1.1.1",
       "resolved": "https://registry.npmjs.org/drange/-/drange-1.1.1.tgz",
       "dev": true,
       "requires": {
         "readable-stream": "^2.0.2"
       "dev": true,
       "requires": {
         "readable-stream": "^2.0.2"
-      },
-      "dependencies": {
-        "readable-stream": {
-          "version": "2.3.7",
-          "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz",
-          "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==",
-          "dev": true,
-          "requires": {
-            "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"
-          }
-        },
-        "string_decoder": {
-          "version": "1.1.1",
-          "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz",
-          "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
-          "dev": true,
-          "requires": {
-            "safe-buffer": "~5.1.0"
-          }
-        }
       }
     },
     "duration": {
       }
     },
     "duration": {
       "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==",
       "dev": true
     },
       "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==",
       "dev": true
     },
+    "ejs": {
+      "version": "3.1.8",
+      "resolved": "https://registry.npmjs.org/ejs/-/ejs-3.1.8.tgz",
+      "integrity": "sha512-/sXZeMlhS0ArkfX2Aw780gJzXSMPnKjtspYZv+f3NiKLlubezAHDU5+9xz6gd3/NhG3txQCo6xlglmTS+oTGEQ==",
+      "dev": true,
+      "requires": {
+        "jake": "^10.8.5"
+      }
+    },
     "electron-to-chromium": {
     "electron-to-chromium": {
-      "version": "1.4.225",
-      "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.225.tgz",
-      "integrity": "sha512-ICHvGaCIQR3P88uK8aRtx8gmejbVJyC6bB4LEC3anzBrIzdzC7aiZHY4iFfXhN4st6I7lMO0x4sgBHf/7kBvRw==",
-      "dev": true
+      "version": "1.4.320",
+      "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.320.tgz",
+      "integrity": "sha512-h70iRscrNluMZPVICXYl5SSB+rBKo22XfuIS1ER0OQxQZpKTnFpuS6coj7wY9M/3trv7OR88rRMOlKmRvDty7Q=="
     },
     "elliptic": {
       "version": "6.5.4",
     },
     "elliptic": {
       "version": "6.5.4",
       }
     },
     "emittery": {
       }
     },
     "emittery": {
-      "version": "0.7.2",
-      "resolved": "https://registry.npmjs.org/emittery/-/emittery-0.7.2.tgz",
-      "integrity": "sha512-A8OG5SR/ij3SsJdWDJdkkSYUjQdCUx6APQXem0SaEePBSRg4eymGYwBkKo1Y6DU+af/Jn2dBQqDBvjnr9Vi8nQ==",
+      "version": "0.10.2",
+      "resolved": "https://registry.npmjs.org/emittery/-/emittery-0.10.2.tgz",
+      "integrity": "sha512-aITqOwnLanpHLNXZJENbOgjUBeHocD+xsSJmNrjovKBW5HbSpW3d1pEls7GFQPUWXiwG9+0P4GtHfEqC/4M0Iw==",
       "dev": true
     },
     "emoji-regex": {
       "dev": true
     },
     "emoji-regex": {
       "version": "1.4.4",
       "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz",
       "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==",
       "version": "1.4.4",
       "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz",
       "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==",
-      "dev": true,
       "requires": {
         "once": "^1.4.0"
       }
     },
     "enhanced-resolve": {
       "requires": {
         "once": "^1.4.0"
       }
     },
     "enhanced-resolve": {
-      "version": "5.10.0",
-      "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.10.0.tgz",
-      "integrity": "sha512-T0yTFjdpldGY8PmuXXR0PyQ1ufZpEGiHVrp7zHKB7jdR4qlmZHhONVM5AQOAWXuF/w3dnHbEQVrNptJgt7F+cQ==",
+      "version": "5.12.0",
+      "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.12.0.tgz",
+      "integrity": "sha512-QHTXI/sZQmko1cbDoNAa3mJ5qhWUUNAq3vR0/YiD379fWQrcfuoX1+HW2S0MTt7XmoPLapdaDKUtelUSPic7hQ==",
       "dev": true,
       "requires": {
         "graceful-fs": "^4.2.4",
       "dev": true,
       "requires": {
         "graceful-fs": "^4.2.4",
       }
     },
     "es-abstract": {
       }
     },
     "es-abstract": {
-      "version": "1.20.1",
-      "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.20.1.tgz",
-      "integrity": "sha512-WEm2oBhfoI2sImeM4OF2zE2V3BYdSF+KnSi9Sidz51fQHd7+JuF8Xgcj9/0o+OWeIeIS/MiuNnlruQrJf16GQA==",
+      "version": "1.21.1",
+      "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.21.1.tgz",
+      "integrity": "sha512-QudMsPOz86xYz/1dG1OuGBKOELjCh99IIWHLzy5znUB6j8xG2yMA7bfTV86VSqKF+Y/H08vQPR+9jyXpuC6hfg==",
       "dev": true,
       "requires": {
       "dev": true,
       "requires": {
+        "available-typed-arrays": "^1.0.5",
         "call-bind": "^1.0.2",
         "call-bind": "^1.0.2",
+        "es-set-tostringtag": "^2.0.1",
         "es-to-primitive": "^1.2.1",
         "function-bind": "^1.1.1",
         "function.prototype.name": "^1.1.5",
         "es-to-primitive": "^1.2.1",
         "function-bind": "^1.1.1",
         "function.prototype.name": "^1.1.5",
-        "get-intrinsic": "^1.1.1",
+        "get-intrinsic": "^1.1.3",
         "get-symbol-description": "^1.0.0",
         "get-symbol-description": "^1.0.0",
+        "globalthis": "^1.0.3",
+        "gopd": "^1.0.1",
         "has": "^1.0.3",
         "has-property-descriptors": "^1.0.0",
         "has": "^1.0.3",
         "has-property-descriptors": "^1.0.0",
+        "has-proto": "^1.0.1",
         "has-symbols": "^1.0.3",
         "has-symbols": "^1.0.3",
-        "internal-slot": "^1.0.3",
-        "is-callable": "^1.2.4",
+        "internal-slot": "^1.0.4",
+        "is-array-buffer": "^3.0.1",
+        "is-callable": "^1.2.7",
         "is-negative-zero": "^2.0.2",
         "is-regex": "^1.1.4",
         "is-shared-array-buffer": "^1.0.2",
         "is-string": "^1.0.7",
         "is-negative-zero": "^2.0.2",
         "is-regex": "^1.1.4",
         "is-shared-array-buffer": "^1.0.2",
         "is-string": "^1.0.7",
+        "is-typed-array": "^1.1.10",
         "is-weakref": "^1.0.2",
         "is-weakref": "^1.0.2",
-        "object-inspect": "^1.12.0",
+        "object-inspect": "^1.12.2",
         "object-keys": "^1.1.1",
         "object-keys": "^1.1.1",
-        "object.assign": "^4.1.2",
+        "object.assign": "^4.1.4",
         "regexp.prototype.flags": "^1.4.3",
         "regexp.prototype.flags": "^1.4.3",
-        "string.prototype.trimend": "^1.0.5",
-        "string.prototype.trimstart": "^1.0.5",
-        "unbox-primitive": "^1.0.2"
+        "safe-regex-test": "^1.0.0",
+        "string.prototype.trimend": "^1.0.6",
+        "string.prototype.trimstart": "^1.0.6",
+        "typed-array-length": "^1.0.4",
+        "unbox-primitive": "^1.0.2",
+        "which-typed-array": "^1.1.9"
       }
     },
     "es-module-lexer": {
       }
     },
     "es-module-lexer": {
-      "version": "0.7.1",
-      "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-0.7.1.tgz",
-      "integrity": "sha512-MgtWFl5No+4S3TmhDmCz2ObFGm6lEpTnzbQi+Dd+pw4mlTIZTmM2iAs5gRlmx5zS9luzobCSBSI90JM/1/JgOw==",
+      "version": "0.9.3",
+      "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-0.9.3.tgz",
+      "integrity": "sha512-1HQ2M2sPtxwnvOvT1ZClHyQDiggdNjURWpY2we6aMKCQiUVxTmVs2UYPLIrD84sS+kMdUwfBSylbJPwNnBrnHQ==",
       "dev": true
     },
       "dev": true
     },
+    "es-set-tostringtag": {
+      "version": "2.0.1",
+      "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.1.tgz",
+      "integrity": "sha512-g3OMbtlwY3QewlqAiMLI47KywjWZoEytKr8pf6iTC8uJq5bIAH52Z9pnQ8pVL6whrCto53JZDuUIsifGeLorTg==",
+      "dev": true,
+      "requires": {
+        "get-intrinsic": "^1.1.3",
+        "has": "^1.0.3",
+        "has-tostringtag": "^1.0.0"
+      }
+    },
     "es-to-primitive": {
       "version": "1.2.1",
       "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz",
     "es-to-primitive": {
       "version": "1.2.1",
       "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz",
       }
     },
     "esbuild-android-arm64": {
       }
     },
     "esbuild-android-arm64": {
-      "version": "0.13.8",
-      "resolved": "https://registry.npmjs.org/esbuild-android-arm64/-/esbuild-android-arm64-0.13.8.tgz",
-      "integrity": "sha512-AilbChndywpk7CdKkNSZ9klxl+9MboLctXd9LwLo3b0dawmOF/i/t2U5d8LM6SbT1Xw36F8yngSUPrd8yPs2RA==",
+      "version": "0.14.22",
+      "resolved": "https://registry.npmjs.org/esbuild-android-arm64/-/esbuild-android-arm64-0.14.22.tgz",
+      "integrity": "sha512-k1Uu4uC4UOFgrnTj2zuj75EswFSEBK+H6lT70/DdS4mTAOfs2ECv2I9ZYvr3w0WL0T4YItzJdK7fPNxcPw6YmQ==",
       "dev": true,
       "optional": true
     },
     "esbuild-darwin-64": {
       "dev": true,
       "optional": true
     },
     "esbuild-darwin-64": {
-      "version": "0.13.8",
-      "resolved": "https://registry.npmjs.org/esbuild-darwin-64/-/esbuild-darwin-64-0.13.8.tgz",
-      "integrity": "sha512-b6sdiT84zV5LVaoF+UoMVGJzR/iE2vNUfUDfFQGrm4LBwM/PWXweKpuu6RD9mcyCq18cLxkP6w/LD/w9DtX3ng==",
+      "version": "0.14.22",
+      "resolved": "https://registry.npmjs.org/esbuild-darwin-64/-/esbuild-darwin-64-0.14.22.tgz",
+      "integrity": "sha512-d8Ceuo6Vw6HM3fW218FB6jTY6O3r2WNcTAU0SGsBkXZ3k8SDoRLd3Nrc//EqzdgYnzDNMNtrWegK2Qsss4THhw==",
       "dev": true,
       "optional": true
     },
     "esbuild-darwin-arm64": {
       "dev": true,
       "optional": true
     },
     "esbuild-darwin-arm64": {
-      "version": "0.13.8",
-      "resolved": "https://registry.npmjs.org/esbuild-darwin-arm64/-/esbuild-darwin-arm64-0.13.8.tgz",
-      "integrity": "sha512-R8YuPiiJayuJJRUBG4H0VwkEKo6AvhJs2m7Tl0JaIer3u1FHHXwGhMxjJDmK+kXwTFPriSysPvcobXC/UrrZCQ==",
+      "version": "0.14.22",
+      "resolved": "https://registry.npmjs.org/esbuild-darwin-arm64/-/esbuild-darwin-arm64-0.14.22.tgz",
+      "integrity": "sha512-YAt9Tj3SkIUkswuzHxkaNlT9+sg0xvzDvE75LlBo4DI++ogSgSmKNR6B4eUhU5EUUepVXcXdRIdqMq9ppeRqfw==",
       "dev": true,
       "optional": true
     },
     "esbuild-freebsd-64": {
       "dev": true,
       "optional": true
     },
     "esbuild-freebsd-64": {
-      "version": "0.13.8",
-      "resolved": "https://registry.npmjs.org/esbuild-freebsd-64/-/esbuild-freebsd-64-0.13.8.tgz",
-      "integrity": "sha512-zBn6urrn8FnKC+YSgDxdof9jhPCeU8kR/qaamlV4gI8R3KUaUK162WYM7UyFVAlj9N0MyD3AtB+hltzu4cysTw==",
+      "version": "0.14.22",
+      "resolved": "https://registry.npmjs.org/esbuild-freebsd-64/-/esbuild-freebsd-64-0.14.22.tgz",
+      "integrity": "sha512-ek1HUv7fkXMy87Qm2G4IRohN+Qux4IcnrDBPZGXNN33KAL0pEJJzdTv0hB/42+DCYWylSrSKxk3KUXfqXOoH4A==",
       "dev": true,
       "optional": true
     },
     "esbuild-freebsd-arm64": {
       "dev": true,
       "optional": true
     },
     "esbuild-freebsd-arm64": {
-      "version": "0.13.8",
-      "resolved": "https://registry.npmjs.org/esbuild-freebsd-arm64/-/esbuild-freebsd-arm64-0.13.8.tgz",
-      "integrity": "sha512-pWW2slN7lGlkx0MOEBoUGwRX5UgSCLq3dy2c8RIOpiHtA87xAUpDBvZK10MykbT+aMfXc0NI2lu1X+6kI34xng==",
+      "version": "0.14.22",
+      "resolved": "https://registry.npmjs.org/esbuild-freebsd-arm64/-/esbuild-freebsd-arm64-0.14.22.tgz",
+      "integrity": "sha512-zPh9SzjRvr9FwsouNYTqgqFlsMIW07O8mNXulGeQx6O5ApgGUBZBgtzSlBQXkHi18WjrosYfsvp5nzOKiWzkjQ==",
       "dev": true,
       "optional": true
     },
     "esbuild-linux-32": {
       "dev": true,
       "optional": true
     },
     "esbuild-linux-32": {
-      "version": "0.13.8",
-      "resolved": "https://registry.npmjs.org/esbuild-linux-32/-/esbuild-linux-32-0.13.8.tgz",
-      "integrity": "sha512-T0I0ueeKVO/Is0CAeSEOG9s2jeNNb8jrrMwG9QBIm3UU18MRB60ERgkS2uV3fZ1vP2F8i3Z2e3Zju4lg9dhVmw==",
+      "version": "0.14.22",
+      "resolved": "https://registry.npmjs.org/esbuild-linux-32/-/esbuild-linux-32-0.14.22.tgz",
+      "integrity": "sha512-SnpveoE4nzjb9t2hqCIzzTWBM0RzcCINDMBB67H6OXIuDa4KqFqaIgmTchNA9pJKOVLVIKd5FYxNiJStli21qg==",
       "dev": true,
       "optional": true
     },
     "esbuild-linux-64": {
       "dev": true,
       "optional": true
     },
     "esbuild-linux-64": {
-      "version": "0.13.8",
-      "resolved": "https://registry.npmjs.org/esbuild-linux-64/-/esbuild-linux-64-0.13.8.tgz",
-      "integrity": "sha512-Bm8SYmFtvfDCIu9sjKppFXzRXn2BVpuCinU1ChTuMtdKI/7aPpXIrkqBNOgPTOQO9AylJJc1Zw6EvtKORhn64w==",
+      "version": "0.14.22",
+      "resolved": "https://registry.npmjs.org/esbuild-linux-64/-/esbuild-linux-64-0.14.22.tgz",
+      "integrity": "sha512-Zcl9Wg7gKhOWWNqAjygyqzB+fJa19glgl2JG7GtuxHyL1uEnWlpSMytTLMqtfbmRykIHdab797IOZeKwk5g0zg==",
       "dev": true,
       "optional": true
     },
     "esbuild-linux-arm": {
       "dev": true,
       "optional": true
     },
     "esbuild-linux-arm": {
-      "version": "0.13.8",
-      "resolved": "https://registry.npmjs.org/esbuild-linux-arm/-/esbuild-linux-arm-0.13.8.tgz",
-      "integrity": "sha512-4/HfcC40LJ4GPyboHA+db0jpFarTB628D1ifU+/5bunIgY+t6mHkJWyxWxAAE8wl/ZIuRYB9RJFdYpu1AXGPdg==",
+      "version": "0.14.22",
+      "resolved": "https://registry.npmjs.org/esbuild-linux-arm/-/esbuild-linux-arm-0.14.22.tgz",
+      "integrity": "sha512-soPDdbpt/C0XvOOK45p4EFt8HbH5g+0uHs5nUKjHVExfgR7du734kEkXR/mE5zmjrlymk5AA79I0VIvj90WZ4g==",
       "dev": true,
       "optional": true
     },
     "esbuild-linux-arm64": {
       "dev": true,
       "optional": true
     },
     "esbuild-linux-arm64": {
-      "version": "0.13.8",
-      "resolved": "https://registry.npmjs.org/esbuild-linux-arm64/-/esbuild-linux-arm64-0.13.8.tgz",
-      "integrity": "sha512-X4pWZ+SL+FJ09chWFgRNO3F+YtvAQRcWh0uxKqZSWKiWodAB20flsW/OWFYLXBKiVCTeoGMvENZS/GeVac7+tQ==",
+      "version": "0.14.22",
+      "resolved": "https://registry.npmjs.org/esbuild-linux-arm64/-/esbuild-linux-arm64-0.14.22.tgz",
+      "integrity": "sha512-8q/FRBJtV5IHnQChO3LHh/Jf7KLrxJ/RCTGdBvlVZhBde+dk3/qS9fFsUy+rs3dEi49aAsyVitTwlKw1SUFm+A==",
       "dev": true,
       "optional": true
     },
     "esbuild-linux-mips64le": {
       "dev": true,
       "optional": true
     },
     "esbuild-linux-mips64le": {
-      "version": "0.13.8",
-      "resolved": "https://registry.npmjs.org/esbuild-linux-mips64le/-/esbuild-linux-mips64le-0.13.8.tgz",
-      "integrity": "sha512-o7e0D+sqHKT31v+mwFircJFjwSKVd2nbkHEn4l9xQ1hLR+Bv8rnt3HqlblY3+sBdlrOTGSwz0ReROlKUMJyldA==",
+      "version": "0.14.22",
+      "resolved": "https://registry.npmjs.org/esbuild-linux-mips64le/-/esbuild-linux-mips64le-0.14.22.tgz",
+      "integrity": "sha512-SiNDfuRXhGh1JQLLA9JPprBgPVFOsGuQ0yDfSPTNxztmVJd8W2mX++c4FfLpAwxuJe183mLuKf7qKCHQs5ZnBQ==",
       "dev": true,
       "optional": true
     },
     "esbuild-linux-ppc64le": {
       "dev": true,
       "optional": true
     },
     "esbuild-linux-ppc64le": {
-      "version": "0.13.8",
-      "resolved": "https://registry.npmjs.org/esbuild-linux-ppc64le/-/esbuild-linux-ppc64le-0.13.8.tgz",
-      "integrity": "sha512-eZSQ0ERsWkukJp2px/UWJHVNuy0lMoz/HZcRWAbB6reoaBw7S9vMzYNUnflfL3XA6WDs+dZn3ekHE4Y2uWLGig==",
+      "version": "0.14.22",
+      "resolved": "https://registry.npmjs.org/esbuild-linux-ppc64le/-/esbuild-linux-ppc64le-0.14.22.tgz",
+      "integrity": "sha512-6t/GI9I+3o1EFm2AyN9+TsjdgWCpg2nwniEhjm2qJWtJyJ5VzTXGUU3alCO3evopu8G0hN2Bu1Jhz2YmZD0kng==",
+      "dev": true,
+      "optional": true
+    },
+    "esbuild-linux-riscv64": {
+      "version": "0.14.22",
+      "resolved": "https://registry.npmjs.org/esbuild-linux-riscv64/-/esbuild-linux-riscv64-0.14.22.tgz",
+      "integrity": "sha512-AyJHipZKe88sc+tp5layovquw5cvz45QXw5SaDgAq2M911wLHiCvDtf/07oDx8eweCyzYzG5Y39Ih568amMTCQ==",
+      "dev": true,
+      "optional": true
+    },
+    "esbuild-linux-s390x": {
+      "version": "0.14.22",
+      "resolved": "https://registry.npmjs.org/esbuild-linux-s390x/-/esbuild-linux-s390x-0.14.22.tgz",
+      "integrity": "sha512-Sz1NjZewTIXSblQDZWEFZYjOK6p8tV6hrshYdXZ0NHTjWE+lwxpOpWeElUGtEmiPcMT71FiuA9ODplqzzSxkzw==",
       "dev": true,
       "optional": true
     },
     "esbuild-netbsd-64": {
       "dev": true,
       "optional": true
     },
     "esbuild-netbsd-64": {
-      "version": "0.13.8",
-      "resolved": "https://registry.npmjs.org/esbuild-netbsd-64/-/esbuild-netbsd-64-0.13.8.tgz",
-      "integrity": "sha512-gZX4kP7gVvOrvX0ZwgHmbuHczQUwqYppxqtoyC7VNd80t5nBHOFXVhWo2Ad/Lms0E8b+wwgI/WjZFTCpUHOg9Q==",
+      "version": "0.14.22",
+      "resolved": "https://registry.npmjs.org/esbuild-netbsd-64/-/esbuild-netbsd-64-0.14.22.tgz",
+      "integrity": "sha512-TBbCtx+k32xydImsHxvFgsOCuFqCTGIxhzRNbgSL1Z2CKhzxwT92kQMhxort9N/fZM2CkRCPPs5wzQSamtzEHA==",
       "dev": true,
       "optional": true
     },
     "esbuild-openbsd-64": {
       "dev": true,
       "optional": true
     },
     "esbuild-openbsd-64": {
-      "version": "0.13.8",
-      "resolved": "https://registry.npmjs.org/esbuild-openbsd-64/-/esbuild-openbsd-64-0.13.8.tgz",
-      "integrity": "sha512-afzza308X4WmcebexbTzAgfEWt9MUkdTvwIa8xOu4CM2qGbl2LanqEl8/LUs8jh6Gqw6WsicEK52GPrS9wvkcw==",
+      "version": "0.14.22",
+      "resolved": "https://registry.npmjs.org/esbuild-openbsd-64/-/esbuild-openbsd-64-0.14.22.tgz",
+      "integrity": "sha512-vK912As725haT313ANZZZN+0EysEEQXWC/+YE4rQvOQzLuxAQc2tjbzlAFREx3C8+uMuZj/q7E5gyVB7TzpcTA==",
       "dev": true,
       "optional": true
     },
     "esbuild-sunos-64": {
       "dev": true,
       "optional": true
     },
     "esbuild-sunos-64": {
-      "version": "0.13.8",
-      "resolved": "https://registry.npmjs.org/esbuild-sunos-64/-/esbuild-sunos-64-0.13.8.tgz",
-      "integrity": "sha512-mWPZibmBbuMKD+LDN23LGcOZ2EawMYBONMXXHmbuxeT0XxCNwadbCVwUQ/2p5Dp5Kvf6mhrlIffcnWOiCBpiVw==",
+      "version": "0.14.22",
+      "resolved": "https://registry.npmjs.org/esbuild-sunos-64/-/esbuild-sunos-64-0.14.22.tgz",
+      "integrity": "sha512-/mbJdXTW7MTcsPhtfDsDyPEOju9EOABvCjeUU2OJ7fWpX/Em/H3WYDa86tzLUbcVg++BScQDzqV/7RYw5XNY0g==",
       "dev": true,
       "optional": true
     },
     "esbuild-wasm": {
       "dev": true,
       "optional": true
     },
     "esbuild-wasm": {
-      "version": "0.13.8",
-      "resolved": "https://registry.npmjs.org/esbuild-wasm/-/esbuild-wasm-0.13.8.tgz",
-      "integrity": "sha512-UbD+3nloiSpJWXTCInZQrqPe8Y+RLfDkY/5kEHiXsw/lmaEvibe69qTzQu16m5R9je/0bF7VYQ5jaEOq0z9lLA==",
+      "version": "0.14.22",
+      "resolved": "https://registry.npmjs.org/esbuild-wasm/-/esbuild-wasm-0.14.22.tgz",
+      "integrity": "sha512-FOSAM29GN1fWusw0oLMv6JYhoheDIh5+atC72TkJKfIUMID6yISlicoQSd9gsNSFsNBvABvtE2jR4JB1j4FkFw==",
       "dev": true
     },
     "esbuild-windows-32": {
       "dev": true
     },
     "esbuild-windows-32": {
-      "version": "0.13.8",
-      "resolved": "https://registry.npmjs.org/esbuild-windows-32/-/esbuild-windows-32-0.13.8.tgz",
-      "integrity": "sha512-QsZ1HnWIcnIEApETZWw8HlOhDSWqdZX2SylU7IzGxOYyVcX7QI06ety/aDcn437mwyO7Ph4RrbhB+2ntM8kX8A==",
+      "version": "0.14.22",
+      "resolved": "https://registry.npmjs.org/esbuild-windows-32/-/esbuild-windows-32-0.14.22.tgz",
+      "integrity": "sha512-1vRIkuvPTjeSVK3diVrnMLSbkuE36jxA+8zGLUOrT4bb7E/JZvDRhvtbWXWaveUc/7LbhaNFhHNvfPuSw2QOQg==",
       "dev": true,
       "optional": true
     },
     "esbuild-windows-64": {
       "dev": true,
       "optional": true
     },
     "esbuild-windows-64": {
-      "version": "0.13.8",
-      "resolved": "https://registry.npmjs.org/esbuild-windows-64/-/esbuild-windows-64-0.13.8.tgz",
-      "integrity": "sha512-76Fb57B9eE/JmJi1QmUW0tRLQZfGo0it+JeYoCDTSlbTn7LV44ecOHIMJSSgZADUtRMWT9z0Kz186bnaB3amSg==",
+      "version": "0.14.22",
+      "resolved": "https://registry.npmjs.org/esbuild-windows-64/-/esbuild-windows-64-0.14.22.tgz",
+      "integrity": "sha512-AxjIDcOmx17vr31C5hp20HIwz1MymtMjKqX4qL6whPj0dT9lwxPexmLj6G1CpR3vFhui6m75EnBEe4QL82SYqw==",
       "dev": true,
       "optional": true
     },
     "esbuild-windows-arm64": {
       "dev": true,
       "optional": true
     },
     "esbuild-windows-arm64": {
-      "version": "0.13.8",
-      "resolved": "https://registry.npmjs.org/esbuild-windows-arm64/-/esbuild-windows-arm64-0.13.8.tgz",
-      "integrity": "sha512-HW6Mtq5eTudllxY2YgT62MrVcn7oq2o8TAoAvDUhyiEmRmDY8tPwAhb1vxw5/cdkbukM3KdMYtksnUhF/ekWeg==",
+      "version": "0.14.22",
+      "resolved": "https://registry.npmjs.org/esbuild-windows-arm64/-/esbuild-windows-arm64-0.14.22.tgz",
+      "integrity": "sha512-5wvQ+39tHmRhNpu2Fx04l7QfeK3mQ9tKzDqqGR8n/4WUxsFxnVLfDRBGirIfk4AfWlxk60kqirlODPoT5LqMUg==",
       "dev": true,
       "optional": true
     },
       "dev": true,
       "optional": true
     },
         }
       }
     },
         }
       }
     },
-    "eslint-scope": {
-      "version": "5.1.1",
-      "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz",
-      "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==",
-      "dev": true,
-      "requires": {
-        "esrecurse": "^4.3.0",
-        "estraverse": "^4.1.1"
-      }
-    },
-    "esprima": {
-      "version": "4.0.1",
-      "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz",
-      "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==",
-      "dev": true
-    },
-    "esrecurse": {
-      "version": "4.3.0",
-      "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz",
-      "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==",
+    "eslint": {
+      "version": "8.17.0",
+      "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.17.0.tgz",
+      "integrity": "sha512-gq0m0BTJfci60Fz4nczYxNAlED+sMcihltndR8t9t1evnU/azx53x3t2UHXC/uRjcbvRw/XctpaNygSTcQD+Iw==",
       "dev": true,
       "requires": {
       "dev": true,
       "requires": {
-        "estraverse": "^5.2.0"
+        "@eslint/eslintrc": "^1.3.0",
+        "@humanwhocodes/config-array": "^0.9.2",
+        "ajv": "^6.10.0",
+        "chalk": "^4.0.0",
+        "cross-spawn": "^7.0.2",
+        "debug": "^4.3.2",
+        "doctrine": "^3.0.0",
+        "escape-string-regexp": "^4.0.0",
+        "eslint-scope": "^7.1.1",
+        "eslint-utils": "^3.0.0",
+        "eslint-visitor-keys": "^3.3.0",
+        "espree": "^9.3.2",
+        "esquery": "^1.4.0",
+        "esutils": "^2.0.2",
+        "fast-deep-equal": "^3.1.3",
+        "file-entry-cache": "^6.0.1",
+        "functional-red-black-tree": "^1.0.1",
+        "glob-parent": "^6.0.1",
+        "globals": "^13.15.0",
+        "ignore": "^5.2.0",
+        "import-fresh": "^3.0.0",
+        "imurmurhash": "^0.1.4",
+        "is-glob": "^4.0.0",
+        "js-yaml": "^4.1.0",
+        "json-stable-stringify-without-jsonify": "^1.0.1",
+        "levn": "^0.4.1",
+        "lodash.merge": "^4.6.2",
+        "minimatch": "^3.1.2",
+        "natural-compare": "^1.4.0",
+        "optionator": "^0.9.1",
+        "regexpp": "^3.2.0",
+        "strip-ansi": "^6.0.1",
+        "strip-json-comments": "^3.1.0",
+        "text-table": "^0.2.0",
+        "v8-compile-cache": "^2.0.3"
       },
       "dependencies": {
       },
       "dependencies": {
-        "estraverse": {
-          "version": "5.3.0",
-          "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz",
-          "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==",
-          "dev": true
-        }
-      }
-    },
-    "estraverse": {
-      "version": "4.3.0",
-      "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz",
-      "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==",
-      "dev": true
-    },
-    "estree-is-function": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/estree-is-function/-/estree-is-function-1.0.0.tgz",
-      "integrity": "sha512-nSCWn1jkSq2QAtkaVLJZY2ezwcFO161HVc174zL1KPW3RJ+O6C3eJb8Nx7OXzvhoEv+nLgSR1g71oWUHUDTrJA==",
-      "dev": true
-    },
-    "esutils": {
-      "version": "2.0.3",
-      "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz",
-      "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==",
-      "dev": true
-    },
-    "etag": {
-      "version": "1.8.1",
-      "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz",
-      "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==",
-      "dev": true
-    },
-    "event-emitter": {
-      "version": "0.3.5",
-      "resolved": "https://registry.npmjs.org/event-emitter/-/event-emitter-0.3.5.tgz",
-      "integrity": "sha512-D9rRn9y7kLPnJ+hMq7S/nhvoKwwvVJahBi2BPmx3bvbsEdK3W9ii8cBSGjP+72/LnM4n6fo3+dkCX5FeTQruXA==",
-      "dev": true,
-      "requires": {
-        "d": "1",
-        "es5-ext": "~0.10.14"
+        "ajv": {
+          "version": "6.12.6",
+          "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz",
+          "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==",
+          "dev": true,
+          "requires": {
+            "fast-deep-equal": "^3.1.1",
+            "fast-json-stable-stringify": "^2.0.0",
+            "json-schema-traverse": "^0.4.1",
+            "uri-js": "^4.2.2"
+          }
+        },
+        "ansi-styles": {
+          "version": "4.3.0",
+          "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
+          "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+          "dev": true,
+          "requires": {
+            "color-convert": "^2.0.1"
+          }
+        },
+        "chalk": {
+          "version": "4.1.2",
+          "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
+          "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
+          "dev": true,
+          "requires": {
+            "ansi-styles": "^4.1.0",
+            "supports-color": "^7.1.0"
+          }
+        },
+        "color-convert": {
+          "version": "2.0.1",
+          "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
+          "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+          "dev": true,
+          "requires": {
+            "color-name": "~1.1.4"
+          }
+        },
+        "color-name": {
+          "version": "1.1.4",
+          "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
+          "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
+          "dev": true
+        },
+        "escape-string-regexp": {
+          "version": "4.0.0",
+          "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz",
+          "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==",
+          "dev": true
+        },
+        "eslint-scope": {
+          "version": "7.1.1",
+          "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.1.1.tgz",
+          "integrity": "sha512-QKQM/UXpIiHcLqJ5AOyIW7XZmzjkzQXYE54n1++wb0u9V/abW3l9uQnxX8Z5Xd18xyKIMTUAyQ0k1e8pz6LUrw==",
+          "dev": true,
+          "requires": {
+            "esrecurse": "^4.3.0",
+            "estraverse": "^5.2.0"
+          }
+        },
+        "estraverse": {
+          "version": "5.3.0",
+          "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz",
+          "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==",
+          "dev": true
+        },
+        "globals": {
+          "version": "13.20.0",
+          "resolved": "https://registry.npmjs.org/globals/-/globals-13.20.0.tgz",
+          "integrity": "sha512-Qg5QtVkCy/kv3FUSlu4ukeZDVf9ee0iXLAUYX13gbR17bnejFTzr4iS9bY7kwCf1NztRNm1t91fjOiyx4CSwPQ==",
+          "dev": true,
+          "requires": {
+            "type-fest": "^0.20.2"
+          }
+        },
+        "has-flag": {
+          "version": "4.0.0",
+          "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
+          "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+          "dev": true
+        },
+        "json-schema-traverse": {
+          "version": "0.4.1",
+          "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz",
+          "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==",
+          "dev": true
+        },
+        "levn": {
+          "version": "0.4.1",
+          "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz",
+          "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==",
+          "dev": true,
+          "requires": {
+            "prelude-ls": "^1.2.1",
+            "type-check": "~0.4.0"
+          }
+        },
+        "optionator": {
+          "version": "0.9.1",
+          "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz",
+          "integrity": "sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==",
+          "dev": true,
+          "requires": {
+            "deep-is": "^0.1.3",
+            "fast-levenshtein": "^2.0.6",
+            "levn": "^0.4.1",
+            "prelude-ls": "^1.2.1",
+            "type-check": "^0.4.0",
+            "word-wrap": "^1.2.3"
+          }
+        },
+        "prelude-ls": {
+          "version": "1.2.1",
+          "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz",
+          "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==",
+          "dev": true
+        },
+        "strip-json-comments": {
+          "version": "3.1.1",
+          "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz",
+          "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==",
+          "dev": true
+        },
+        "supports-color": {
+          "version": "7.2.0",
+          "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
+          "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
+          "dev": true,
+          "requires": {
+            "has-flag": "^4.0.0"
+          }
+        },
+        "type-check": {
+          "version": "0.4.0",
+          "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz",
+          "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==",
+          "dev": true,
+          "requires": {
+            "prelude-ls": "^1.2.1"
+          }
+        }
+      }
+    },
+    "eslint-scope": {
+      "version": "5.1.1",
+      "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz",
+      "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==",
+      "dev": true,
+      "requires": {
+        "esrecurse": "^4.3.0",
+        "estraverse": "^4.1.1"
+      }
+    },
+    "eslint-utils": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-3.0.0.tgz",
+      "integrity": "sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==",
+      "dev": true,
+      "requires": {
+        "eslint-visitor-keys": "^2.0.0"
+      },
+      "dependencies": {
+        "eslint-visitor-keys": {
+          "version": "2.1.0",
+          "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz",
+          "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==",
+          "dev": true
+        }
+      }
+    },
+    "eslint-visitor-keys": {
+      "version": "3.3.0",
+      "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.3.0.tgz",
+      "integrity": "sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA==",
+      "dev": true
+    },
+    "espree": {
+      "version": "9.4.1",
+      "resolved": "https://registry.npmjs.org/espree/-/espree-9.4.1.tgz",
+      "integrity": "sha512-XwctdmTO6SIvCzd9810yyNzIrOrqNYV9Koizx4C/mRhf9uq0o4yHoCEU/670pOxOL/MSraektvSAji79kX90Vg==",
+      "dev": true,
+      "requires": {
+        "acorn": "^8.8.0",
+        "acorn-jsx": "^5.3.2",
+        "eslint-visitor-keys": "^3.3.0"
+      }
+    },
+    "esprima": {
+      "version": "4.0.1",
+      "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz",
+      "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==",
+      "dev": true
+    },
+    "esquery": {
+      "version": "1.5.0",
+      "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.5.0.tgz",
+      "integrity": "sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==",
+      "dev": true,
+      "requires": {
+        "estraverse": "^5.1.0"
+      },
+      "dependencies": {
+        "estraverse": {
+          "version": "5.3.0",
+          "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz",
+          "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==",
+          "dev": true
+        }
+      }
+    },
+    "esrecurse": {
+      "version": "4.3.0",
+      "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz",
+      "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==",
+      "dev": true,
+      "requires": {
+        "estraverse": "^5.2.0"
+      },
+      "dependencies": {
+        "estraverse": {
+          "version": "5.3.0",
+          "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz",
+          "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==",
+          "dev": true
+        }
+      }
+    },
+    "estraverse": {
+      "version": "4.3.0",
+      "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz",
+      "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==",
+      "dev": true
+    },
+    "estree-is-function": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/estree-is-function/-/estree-is-function-1.0.0.tgz",
+      "integrity": "sha512-nSCWn1jkSq2QAtkaVLJZY2ezwcFO161HVc174zL1KPW3RJ+O6C3eJb8Nx7OXzvhoEv+nLgSR1g71oWUHUDTrJA==",
+      "dev": true
+    },
+    "esutils": {
+      "version": "2.0.3",
+      "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz",
+      "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==",
+      "dev": true
+    },
+    "etag": {
+      "version": "1.8.1",
+      "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz",
+      "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==",
+      "dev": true
+    },
+    "event-emitter": {
+      "version": "0.3.5",
+      "resolved": "https://registry.npmjs.org/event-emitter/-/event-emitter-0.3.5.tgz",
+      "integrity": "sha512-D9rRn9y7kLPnJ+hMq7S/nhvoKwwvVJahBi2BPmx3bvbsEdK3W9ii8cBSGjP+72/LnM4n6fo3+dkCX5FeTQruXA==",
+      "dev": true,
+      "requires": {
+        "d": "1",
+        "es5-ext": "~0.10.14"
       }
     },
     "event-stream": {
       }
     },
     "event-stream": {
       "dev": true
     },
     "eventemitter2": {
       "dev": true
     },
     "eventemitter2": {
-      "version": "6.4.7",
-      "resolved": "https://registry.npmjs.org/eventemitter2/-/eventemitter2-6.4.7.tgz",
-      "integrity": "sha512-tYUSVOGeQPKt/eC1ABfhHy5Xd96N3oIijJvN3O9+TsC28T5V9yX9oEfEK5faP0EFSNVOG97qtAS68GBrQB2hDg==",
+      "version": "6.4.9",
+      "resolved": "https://registry.npmjs.org/eventemitter2/-/eventemitter2-6.4.9.tgz",
+      "integrity": "sha512-JEPTiaOt9f04oa6NOkc4aH+nVp5I3wEjpHbIPqfgCdD5v5bUzy7xQqwcVO2aDQgOWhI28da57HksMrzK9HlRxg==",
       "dev": true
     },
     "eventemitter3": {
       "dev": true
     },
     "eventemitter3": {
       "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==",
       "dev": true
     },
       "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==",
       "dev": true
     },
-    "eventsource": {
-      "version": "2.0.2",
-      "resolved": "https://registry.npmjs.org/eventsource/-/eventsource-2.0.2.tgz",
-      "integrity": "sha512-IzUmBGPR3+oUG9dUeXynyNmf91/3zUSJg1lCktzKw47OXuhco54U3r9B7O4XX+Rb1Itm9OZ2b0RkTs10bICOxA==",
-      "dev": true
-    },
     "evp_bytestokey": {
       "version": "1.0.3",
       "resolved": "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz",
     "evp_bytestokey": {
       "version": "1.0.3",
       "resolved": "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz",
         "safe-buffer": "^5.1.1"
       }
     },
         "safe-buffer": "^5.1.1"
       }
     },
-    "exec-sh": {
-      "version": "0.3.6",
-      "resolved": "https://registry.npmjs.org/exec-sh/-/exec-sh-0.3.6.tgz",
-      "integrity": "sha512-nQn+hI3yp+oD0huYhKwvYI32+JFeq+XkNcD1GAo3Y/MjxsfVGmrrzrnzjWiNY6f+pUCP440fThsFh5gZrRAU/w==",
-      "dev": true
-    },
     "execa": {
     "execa": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/execa/-/execa-1.0.0.tgz",
-      "integrity": "sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==",
+      "version": "5.1.1",
+      "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz",
+      "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==",
       "dev": true,
       "requires": {
       "dev": true,
       "requires": {
-        "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"
+        "cross-spawn": "^7.0.3",
+        "get-stream": "^6.0.0",
+        "human-signals": "^2.1.0",
+        "is-stream": "^2.0.0",
+        "merge-stream": "^2.0.0",
+        "npm-run-path": "^4.0.1",
+        "onetime": "^5.1.2",
+        "signal-exit": "^3.0.3",
+        "strip-final-newline": "^2.0.0"
       }
     },
     "execall": {
       }
     },
     "execall": {
         }
       }
     },
         }
       }
     },
+    "expand-template": {
+      "version": "2.0.3",
+      "resolved": "https://registry.npmjs.org/expand-template/-/expand-template-2.0.3.tgz",
+      "integrity": "sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg==",
+      "optional": true
+    },
     "expand-tilde": {
       "version": "2.0.2",
       "resolved": "https://registry.npmjs.org/expand-tilde/-/expand-tilde-2.0.2.tgz",
     "expand-tilde": {
       "version": "2.0.2",
       "resolved": "https://registry.npmjs.org/expand-tilde/-/expand-tilde-2.0.2.tgz",
       }
     },
     "expect": {
       }
     },
     "expect": {
-      "version": "26.6.2",
-      "resolved": "https://registry.npmjs.org/expect/-/expect-26.6.2.tgz",
-      "integrity": "sha512-9/hlOBkQl2l/PLHJx6JjoDF6xPKcJEsUlWKb23rKE7KzeDqUZKXKNMW27KIue5JMdBV9HgmoJPcc8HtO85t9IA==",
+      "version": "28.1.3",
+      "resolved": "https://registry.npmjs.org/expect/-/expect-28.1.3.tgz",
+      "integrity": "sha512-eEh0xn8HlsuOBxFgIss+2mX85VAS4Qy3OSkjV7rlBWljtA4oWH37glVGyOZSZvErDT/yBywZdPGwCXuTvSG85g==",
       "dev": true,
       "requires": {
       "dev": true,
       "requires": {
-        "@jest/types": "^26.6.2",
-        "ansi-styles": "^4.0.0",
-        "jest-get-type": "^26.3.0",
-        "jest-matcher-utils": "^26.6.2",
-        "jest-message-util": "^26.6.2",
-        "jest-regex-util": "^26.0.0"
-      },
-      "dependencies": {
-        "@jest/types": {
-          "version": "26.6.2",
-          "resolved": "https://registry.npmjs.org/@jest/types/-/types-26.6.2.tgz",
-          "integrity": "sha512-fC6QCp7Sc5sX6g8Tvbmj4XUTbyrik0akgRy03yjXbQaBWWNWGE7SGtJk98m0N8nzegD/7SggrUlivxo5ax4KWQ==",
-          "dev": true,
-          "requires": {
-            "@types/istanbul-lib-coverage": "^2.0.0",
-            "@types/istanbul-reports": "^3.0.0",
-            "@types/node": "*",
-            "@types/yargs": "^15.0.0",
-            "chalk": "^4.0.0"
-          }
-        },
-        "@types/istanbul-reports": {
-          "version": "3.0.1",
-          "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.1.tgz",
-          "integrity": "sha512-c3mAZEuK0lvBp8tmuL74XRKn1+y2dcwOUpH7x4WrF6gk1GIgiluDRgMYQtw2OFcBvAJWlt6ASU3tSqxp0Uu0Aw==",
-          "dev": true,
-          "requires": {
-            "@types/istanbul-lib-report": "*"
-          }
-        },
-        "ansi-styles": {
-          "version": "4.3.0",
-          "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
-          "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
-          "dev": true,
-          "requires": {
-            "color-convert": "^2.0.1"
-          }
-        },
-        "chalk": {
-          "version": "4.1.2",
-          "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
-          "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
-          "dev": true,
-          "requires": {
-            "ansi-styles": "^4.1.0",
-            "supports-color": "^7.1.0"
-          }
-        },
-        "color-convert": {
-          "version": "2.0.1",
-          "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
-          "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
-          "dev": true,
-          "requires": {
-            "color-name": "~1.1.4"
-          }
-        },
-        "color-name": {
-          "version": "1.1.4",
-          "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
-          "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
-          "dev": true
-        },
-        "has-flag": {
-          "version": "4.0.0",
-          "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
-          "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
-          "dev": true
-        },
-        "jest-get-type": {
-          "version": "26.3.0",
-          "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-26.3.0.tgz",
-          "integrity": "sha512-TpfaviN1R2pQWkIihlfEanwOXK0zcxrKEE4MlU6Tn7keoXdN6/3gK/xl0yEh8DOunn5pOVGKf8hB4R9gVh04ig==",
-          "dev": true
-        },
-        "supports-color": {
-          "version": "7.2.0",
-          "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
-          "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
-          "dev": true,
-          "requires": {
-            "has-flag": "^4.0.0"
-          }
-        }
-      }
-    },
-    "express": {
-      "version": "4.18.1",
-      "resolved": "https://registry.npmjs.org/express/-/express-4.18.1.tgz",
-      "integrity": "sha512-zZBcOX9TfehHQhtupq57OF8lFZ3UZi08Y97dwFCkD8p9d/d2Y3M+ykKcwaMDEL+4qyUolgBDX6AblpR3fL212Q==",
-      "dev": true,
-      "requires": {
-        "accepts": "~1.3.8",
-        "array-flatten": "1.1.1",
-        "body-parser": "1.20.0",
-        "content-disposition": "0.5.4",
-        "content-type": "~1.0.4",
-        "cookie": "0.5.0",
-        "cookie-signature": "1.0.6",
-        "debug": "2.6.9",
-        "depd": "2.0.0",
-        "encodeurl": "~1.0.2",
-        "escape-html": "~1.0.3",
-        "etag": "~1.8.1",
-        "finalhandler": "1.2.0",
-        "fresh": "0.5.2",
-        "http-errors": "2.0.0",
-        "merge-descriptors": "1.0.1",
-        "methods": "~1.1.2",
-        "on-finished": "2.4.1",
-        "parseurl": "~1.3.3",
-        "path-to-regexp": "0.1.7",
-        "proxy-addr": "~2.0.7",
-        "qs": "6.10.3",
-        "range-parser": "~1.2.1",
-        "safe-buffer": "5.2.1",
-        "send": "0.18.0",
-        "serve-static": "1.15.0",
-        "setprototypeof": "1.2.0",
-        "statuses": "2.0.1",
-        "type-is": "~1.6.18",
-        "utils-merge": "1.0.1",
-        "vary": "~1.1.2"
+        "@jest/expect-utils": "^28.1.3",
+        "jest-get-type": "^28.0.2",
+        "jest-matcher-utils": "^28.1.3",
+        "jest-message-util": "^28.1.3",
+        "jest-util": "^28.1.3"
+      }
+    },
+    "express": {
+      "version": "4.18.2",
+      "resolved": "https://registry.npmjs.org/express/-/express-4.18.2.tgz",
+      "integrity": "sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ==",
+      "dev": true,
+      "requires": {
+        "accepts": "~1.3.8",
+        "array-flatten": "1.1.1",
+        "body-parser": "1.20.1",
+        "content-disposition": "0.5.4",
+        "content-type": "~1.0.4",
+        "cookie": "0.5.0",
+        "cookie-signature": "1.0.6",
+        "debug": "2.6.9",
+        "depd": "2.0.0",
+        "encodeurl": "~1.0.2",
+        "escape-html": "~1.0.3",
+        "etag": "~1.8.1",
+        "finalhandler": "1.2.0",
+        "fresh": "0.5.2",
+        "http-errors": "2.0.0",
+        "merge-descriptors": "1.0.1",
+        "methods": "~1.1.2",
+        "on-finished": "2.4.1",
+        "parseurl": "~1.3.3",
+        "path-to-regexp": "0.1.7",
+        "proxy-addr": "~2.0.7",
+        "qs": "6.11.0",
+        "range-parser": "~1.2.1",
+        "safe-buffer": "5.2.1",
+        "send": "0.18.0",
+        "serve-static": "1.15.0",
+        "setprototypeof": "1.2.0",
+        "statuses": "2.0.1",
+        "type-is": "~1.6.18",
+        "utils-merge": "1.0.1",
+        "vary": "~1.1.2"
       },
       "dependencies": {
         "array-flatten": {
       },
       "dependencies": {
         "array-flatten": {
           "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
           "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==",
           "dev": true
           "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
           "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==",
           "dev": true
-        },
-        "qs": {
-          "version": "6.10.3",
-          "resolved": "https://registry.npmjs.org/qs/-/qs-6.10.3.tgz",
-          "integrity": "sha512-wr7M2E0OFRfIfJZjKGieI8lBKb7fRCH4Fv5KNPEs7gJ8jadvotdsS08PzOKR7opXhZ/Xkjtt3WF9g38drmyRqQ==",
-          "dev": true,
-          "requires": {
-            "side-channel": "^1.0.4"
-          }
-        },
-        "safe-buffer": {
-          "version": "5.2.1",
-          "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz",
-          "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==",
-          "dev": true
         }
       }
     },
     "ext": {
         }
       }
     },
     "ext": {
-      "version": "1.6.0",
-      "resolved": "https://registry.npmjs.org/ext/-/ext-1.6.0.tgz",
-      "integrity": "sha512-sdBImtzkq2HpkdRLtlLWDa6w4DX22ijZLKx8BMPUuKe1c5lbN6xwQDQCxSfxBQnHZ13ls/FH0MQZx/q/gr6FQg==",
+      "version": "1.7.0",
+      "resolved": "https://registry.npmjs.org/ext/-/ext-1.7.0.tgz",
+      "integrity": "sha512-6hxeJYaL110a9b5TEJSj0gojyHQAmA2ch5Os+ySCiA1QGdS697XWY1pzsrSjqA9LDEEgdB/KypIlR59RcLuHYw==",
       "dev": true,
       "requires": {
       "dev": true,
       "requires": {
-        "type": "^2.5.0"
+        "type": "^2.7.2"
       },
       "dependencies": {
         "type": {
       },
       "dependencies": {
         "type": {
       "dev": true
     },
     "fancy-log": {
       "dev": true
     },
     "fancy-log": {
-      "version": "1.3.3",
-      "resolved": "https://registry.npmjs.org/fancy-log/-/fancy-log-1.3.3.tgz",
-      "integrity": "sha512-k9oEhlyc0FrVh25qYuSELjr8oxsCoc4/LEZfg2iJJrfEk/tZL9bCoJE47gqAvI2m/AUjluCS4+3I0eTx8n3AEw==",
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/fancy-log/-/fancy-log-2.0.0.tgz",
+      "integrity": "sha512-9CzxZbACXMUXW13tS0tI8XsGGmxWzO2DmYrGuBJOJ8k8q2K7hwfJA5qHjuPPe8wtsco33YR9wc+Rlr5wYFvhSA==",
       "dev": true,
       "requires": {
       "dev": true,
       "requires": {
-        "ansi-gray": "^0.1.1",
-        "color-support": "^1.1.3",
-        "parse-node-version": "^1.0.0",
-        "time-stamp": "^1.0.0"
+        "color-support": "^1.1.3"
       }
     },
     "fast-deep-equal": {
       }
     },
     "fast-deep-equal": {
       "dev": true
     },
     "fast-glob": {
       "dev": true
     },
     "fast-glob": {
-      "version": "3.2.11",
-      "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.11.tgz",
-      "integrity": "sha512-xrO3+1bxSo3ZVHAnqzyuewYT6aMFHRAd4Kcs92MAonjwQZLsK9d0SF1IyQ3k5PoirxTW0Oe/RqFgMQ6TcNE5Ew==",
+      "version": "3.2.12",
+      "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.12.tgz",
+      "integrity": "sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w==",
       "dev": true,
       "requires": {
         "@nodelib/fs.stat": "^2.0.2",
       "dev": true,
       "requires": {
         "@nodelib/fs.stat": "^2.0.2",
       "integrity": "sha512-eRnCtTTtGZFpQCwhJiUOuxPQWRXVKYDn0b2PeHfXL6/Zi53SLAzAHfVhVWK2AryC/WH05kGfxhFIPvTF0SXQzg==",
       "dev": true
     },
       "integrity": "sha512-eRnCtTTtGZFpQCwhJiUOuxPQWRXVKYDn0b2PeHfXL6/Zi53SLAzAHfVhVWK2AryC/WH05kGfxhFIPvTF0SXQzg==",
       "dev": true
     },
-    "fastparse": {
-      "version": "1.1.2",
-      "resolved": "https://registry.npmjs.org/fastparse/-/fastparse-1.1.2.tgz",
-      "integrity": "sha512-483XLLxTVIwWK3QTrMGRqUfUpoOs/0hbQrl2oz4J0pAcm3A3bu84wxTFqGqkJzewCLdME38xJLJAxBABfQT8sQ==",
-      "dev": true
-    },
     "fastq": {
     "fastq": {
-      "version": "1.13.0",
-      "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.13.0.tgz",
-      "integrity": "sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw==",
+      "version": "1.15.0",
+      "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.15.0.tgz",
+      "integrity": "sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==",
       "dev": true,
       "requires": {
         "reusify": "^1.0.4"
       "dev": true,
       "requires": {
         "reusify": "^1.0.4"
       }
     },
     "fb-watchman": {
       }
     },
     "fb-watchman": {
-      "version": "2.0.1",
-      "resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.1.tgz",
-      "integrity": "sha512-DkPJKQeY6kKwmuMretBhr7G6Vodr7bFwDYTXIkfG1gjvNpaxBTQV3PbXg6bR1c1UP4jPOX0jHUbbHANL9vRjVg==",
+      "version": "2.0.2",
+      "resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.2.tgz",
+      "integrity": "sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==",
       "dev": true,
       "requires": {
         "bser": "2.1.1"
       "dev": true,
       "requires": {
         "bser": "2.1.1"
       "resolved": "https://registry.npmjs.org/file-saver/-/file-saver-2.0.2.tgz",
       "integrity": "sha512-Wz3c3XQ5xroCxd1G8b7yL0Ehkf0TC9oYC6buPFkNnU9EnaPlifeAFCyCh+iewXTyFRcg0a6j3J7FmJsIhlhBdw=="
     },
       "resolved": "https://registry.npmjs.org/file-saver/-/file-saver-2.0.2.tgz",
       "integrity": "sha512-Wz3c3XQ5xroCxd1G8b7yL0Ehkf0TC9oYC6buPFkNnU9EnaPlifeAFCyCh+iewXTyFRcg0a6j3J7FmJsIhlhBdw=="
     },
+    "filelist": {
+      "version": "1.0.4",
+      "resolved": "https://registry.npmjs.org/filelist/-/filelist-1.0.4.tgz",
+      "integrity": "sha512-w1cEuf3S+DrLCQL7ET6kz+gmlJdbq9J7yXCSjK/OZCPA+qEN1WyF4ZAf0YYJa4/shHJra2t/d/r8SV4Ji+x+8Q==",
+      "dev": true,
+      "requires": {
+        "minimatch": "^5.0.1"
+      },
+      "dependencies": {
+        "brace-expansion": {
+          "version": "2.0.1",
+          "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz",
+          "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==",
+          "dev": true,
+          "requires": {
+            "balanced-match": "^1.0.0"
+          }
+        },
+        "minimatch": {
+          "version": "5.1.6",
+          "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz",
+          "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==",
+          "dev": true,
+          "requires": {
+            "brace-expansion": "^2.0.1"
+          }
+        }
+      }
+    },
     "fill-range": {
       "version": "7.0.1",
       "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz",
     "fill-range": {
       "version": "7.0.1",
       "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz",
       }
     },
     "find-cache-dir": {
       }
     },
     "find-cache-dir": {
-      "version": "3.3.1",
-      "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.3.1.tgz",
-      "integrity": "sha512-t2GDMt3oGC/v+BMwzmllWDuJF/xcDtE5j/fCGbqDD7OLuJkj0cfh1YSA5VKPvwMeLFLNDBkwOKZ2X85jGLVftQ==",
+      "version": "3.3.2",
+      "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.3.2.tgz",
+      "integrity": "sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig==",
       "dev": true,
       "requires": {
         "commondir": "^1.0.1",
       "dev": true,
       "requires": {
         "commondir": "^1.0.1",
       "integrity": "sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ==",
       "dev": true
     },
       "integrity": "sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ==",
       "dev": true
     },
-    "flatten": {
-      "version": "1.0.3",
-      "resolved": "https://registry.npmjs.org/flatten/-/flatten-1.0.3.tgz",
-      "integrity": "sha512-dVsPA/UwQ8+2uoFe5GHtiBMu48dWLTdsuEd7CKGlZlD78r1TTWBvDuFaFGKCo/ZfEr95Uk56vZoX86OsHkUeIg==",
-      "dev": true
-    },
     "follow-redirects": {
     "follow-redirects": {
-      "version": "1.15.1",
-      "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.1.tgz",
-      "integrity": "sha512-yLAMQs+k0b2m7cVxpS1VKJVvoz7SS9Td1zss3XRwXj+ZDH00RJgnuLx7E44wx02kQLrdM3aOOy+FpzS7+8OizA==",
-      "dev": true
+      "version": "1.15.2",
+      "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.2.tgz",
+      "integrity": "sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA=="
     },
     "for-each": {
       "version": "0.3.3",
     },
     "for-each": {
       "version": "0.3.3",
       "integrity": "sha512-IHI7XCSXrKfUIWslse8c/PaaVDT1oBaYge+ju40ihL2ooiQeBpTr4wvIXhgTd2NuhntlvX+M5jYHAPTzNlmv0g=="
     },
     "form-data": {
       "integrity": "sha512-IHI7XCSXrKfUIWslse8c/PaaVDT1oBaYge+ju40ihL2ooiQeBpTr4wvIXhgTd2NuhntlvX+M5jYHAPTzNlmv0g=="
     },
     "form-data": {
-      "version": "2.3.3",
-      "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz",
-      "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==",
-      "dev": true,
+      "version": "4.0.0",
+      "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz",
+      "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==",
       "requires": {
         "asynckit": "^0.4.0",
       "requires": {
         "asynckit": "^0.4.0",
-        "combined-stream": "^1.0.6",
+        "combined-stream": "^1.0.8",
         "mime-types": "^2.1.12"
       }
     },
         "mime-types": "^2.1.12"
       }
     },
       "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==",
       "dev": true
     },
       "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==",
       "dev": true
     },
+    "fraction.js": {
+      "version": "4.2.0",
+      "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.2.0.tgz",
+      "integrity": "sha512-MhLuK+2gUcnZe8ZHlaaINnQLl0xRIGRfcGk2yl8xoQAfHrSsL3rYu6FCmBdkdbhc9EPlwyGHewaRsvwRMJtAlA==",
+      "dev": true
+    },
     "fragment-cache": {
       "version": "0.2.1",
       "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz",
     "fragment-cache": {
       "version": "0.2.1",
       "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz",
       "integrity": "sha512-twe20eF1OxVxp/ML/kq2p1uc6KvFK/+vs8WjEbeKmV2He22MKm7YF2ANIt+EOqhJ5L3K/SuuPhk0hWQDjOM23g==",
       "dev": true
     },
       "integrity": "sha512-twe20eF1OxVxp/ML/kq2p1uc6KvFK/+vs8WjEbeKmV2He22MKm7YF2ANIt+EOqhJ5L3K/SuuPhk0hWQDjOM23g==",
       "dev": true
     },
+    "fs-constants": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz",
+      "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow=="
+    },
     "fs-extra": {
     "fs-extra": {
-      "version": "10.1.0",
-      "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz",
-      "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==",
+      "version": "9.1.0",
+      "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz",
+      "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==",
       "dev": true,
       "requires": {
       "dev": true,
       "requires": {
+        "at-least-node": "^1.0.0",
         "graceful-fs": "^4.2.0",
         "jsonfile": "^6.0.1",
         "universalify": "^2.0.0"
         "graceful-fs": "^4.2.0",
         "jsonfile": "^6.0.1",
         "universalify": "^2.0.0"
         "functions-have-names": "^1.2.2"
       }
     },
         "functions-have-names": "^1.2.2"
       }
     },
+    "functional-red-black-tree": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz",
+      "integrity": "sha512-dsKNQNdj6xA3T+QlADDA7mOSlX0qiMINjn0cgr+eGHGsbSHzTabcIogz2+p/iqP1Xs6EP/sS2SbqH+brGTbq0g==",
+      "dev": true
+    },
     "functions-have-names": {
       "version": "1.2.3",
       "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz",
     "functions-have-names": {
       "version": "1.2.3",
       "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz",
       "version": "2.7.4",
       "resolved": "https://registry.npmjs.org/gauge/-/gauge-2.7.4.tgz",
       "integrity": "sha512-14x4kjc6lkD3ltw589k0NrPD6cCNTD6CWoVUNpB85+DrtONoZn+Rug6xZU5RvSC4+TZPxA5AnBibQYAvZn41Hg==",
       "version": "2.7.4",
       "resolved": "https://registry.npmjs.org/gauge/-/gauge-2.7.4.tgz",
       "integrity": "sha512-14x4kjc6lkD3ltw589k0NrPD6cCNTD6CWoVUNpB85+DrtONoZn+Rug6xZU5RvSC4+TZPxA5AnBibQYAvZn41Hg==",
-      "dev": true,
+      "optional": true,
       "requires": {
         "aproba": "^1.0.3",
         "console-control-strings": "^1.0.0",
       "requires": {
         "aproba": "^1.0.3",
         "console-control-strings": "^1.0.0",
           "version": "2.1.1",
           "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz",
           "integrity": "sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA==",
           "version": "2.1.1",
           "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz",
           "integrity": "sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA==",
-          "dev": true
+          "optional": true
         },
         "is-fullwidth-code-point": {
           "version": "1.0.0",
           "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz",
           "integrity": "sha512-1pqUqRjkhPJ9miNq9SwMfdvi6lBJcd6eFxvfaivQhaH3SgisfiuudvFntdKOmxuee/77l+FPjKrQjWvmPjWrRw==",
         },
         "is-fullwidth-code-point": {
           "version": "1.0.0",
           "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz",
           "integrity": "sha512-1pqUqRjkhPJ9miNq9SwMfdvi6lBJcd6eFxvfaivQhaH3SgisfiuudvFntdKOmxuee/77l+FPjKrQjWvmPjWrRw==",
-          "dev": true,
+          "optional": true,
           "requires": {
             "number-is-nan": "^1.0.0"
           }
           "requires": {
             "number-is-nan": "^1.0.0"
           }
           "version": "1.0.2",
           "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz",
           "integrity": "sha512-0XsVpQLnVCXHJfyEs8tC0zpTVIr5PKKsQtkT29IwupnPTjtPmQ3xT/4yCREF9hYkV/3M3kzcUTSAZT6a6h81tw==",
           "version": "1.0.2",
           "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz",
           "integrity": "sha512-0XsVpQLnVCXHJfyEs8tC0zpTVIr5PKKsQtkT29IwupnPTjtPmQ3xT/4yCREF9hYkV/3M3kzcUTSAZT6a6h81tw==",
-          "dev": true,
+          "optional": true,
           "requires": {
             "code-point-at": "^1.0.0",
             "is-fullwidth-code-point": "^1.0.0",
           "requires": {
             "code-point-at": "^1.0.0",
             "is-fullwidth-code-point": "^1.0.0",
           "version": "3.0.1",
           "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz",
           "integrity": "sha512-VhumSSbBqDTP8p2ZLKj40UjBCV4+v8bUSEpUb4KjRgWk9pbqGF4REFj6KEagidb2f/M6AzC0EmFyDNGaw9OCzg==",
           "version": "3.0.1",
           "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz",
           "integrity": "sha512-VhumSSbBqDTP8p2ZLKj40UjBCV4+v8bUSEpUb4KjRgWk9pbqGF4REFj6KEagidb2f/M6AzC0EmFyDNGaw9OCzg==",
-          "dev": true,
+          "optional": true,
           "requires": {
             "ansi-regex": "^2.0.0"
           }
           "requires": {
             "ansi-regex": "^2.0.0"
           }
       "dev": true
     },
     "get-intrinsic": {
       "dev": true
     },
     "get-intrinsic": {
-      "version": "1.1.2",
-      "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.2.tgz",
-      "integrity": "sha512-Jfm3OyCxHh9DJyc28qGk+JmfkpO41A4XkneDSujN9MDXrm4oDKdHvndhZ2dN94+ERNfkYJWDclW6k2L/ZGHjXA==",
+      "version": "1.2.0",
+      "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.0.tgz",
+      "integrity": "sha512-L049y6nFOuom5wGyRc3/gdTLO94dySVKRACj1RmJZBQXlbTMhtNIgkWkUHq+jYmZvKf14EW1EoJnnjbmoHij0Q==",
       "requires": {
         "function-bind": "^1.1.1",
         "has": "^1.0.3",
       "requires": {
         "function-bind": "^1.1.1",
         "has": "^1.0.3",
       "dev": true
     },
     "get-stream": {
       "dev": true
     },
     "get-stream": {
-      "version": "4.1.0",
-      "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz",
-      "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==",
-      "dev": true,
-      "requires": {
-        "pump": "^3.0.0"
-      }
+      "version": "6.0.1",
+      "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz",
+      "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==",
+      "dev": true
     },
     "get-symbol-description": {
       "version": "1.0.0",
     },
     "get-symbol-description": {
       "version": "1.0.0",
         }
       }
     },
         }
       }
     },
+    "github-from-package": {
+      "version": "0.0.0",
+      "resolved": "https://registry.npmjs.org/github-from-package/-/github-from-package-0.0.0.tgz",
+      "integrity": "sha512-SyHy3T1v2NUXn29OsWdxmK6RwHD+vkj3v8en8AOBZ1wBQ/hCAQ5bAQTD02kW4W9tUp/3Qh6J8r9EvntiyCmOOw==",
+      "optional": true
+    },
     "glob": {
     "glob": {
-      "version": "7.1.7",
-      "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.7.tgz",
-      "integrity": "sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ==",
+      "version": "7.2.0",
+      "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz",
+      "integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==",
       "requires": {
         "fs.realpath": "^1.0.0",
         "inflight": "^1.0.4",
       "requires": {
         "fs.realpath": "^1.0.0",
         "inflight": "^1.0.4",
       "dev": true
     },
     "global-dirs": {
       "dev": true
     },
     "global-dirs": {
-      "version": "3.0.0",
-      "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-3.0.0.tgz",
-      "integrity": "sha512-v8ho2DS5RiCjftj1nD9NmnfaOzTdud7RRnVd9kFNOjqZbISlx5DQ+OrTkywgd0dIt7oFCvKetZSHoHcP3sDdiA==",
+      "version": "3.0.1",
+      "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-3.0.1.tgz",
+      "integrity": "sha512-NBcGGFbBA9s1VzD41QXDG+3++t9Mn5t1FpLdhESY6oKY4gYTFpX4wO3sqGUa0Srjtbfj3szX0RnemmrVRUdULA==",
       "dev": true,
       "requires": {
         "ini": "2.0.0"
       "dev": true,
       "requires": {
         "ini": "2.0.0"
+      },
+      "dependencies": {
+        "ini": {
+          "version": "2.0.0",
+          "resolved": "https://registry.npmjs.org/ini/-/ini-2.0.0.tgz",
+          "integrity": "sha512-7PnF4oN3CvZF23ADhA5wRaYEQpJ8qygSkbtTXWBeXWXmEVRXK+1ITciHWwHhsjv1TmW0MgacIv6hEi5pX5NQdA==",
+          "dev": true
+        }
       }
     },
     "global-modules": {
       }
     },
     "global-modules": {
         "which": "^1.2.14"
       },
       "dependencies": {
         "which": "^1.2.14"
       },
       "dependencies": {
-        "ini": {
-          "version": "1.3.8",
-          "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz",
-          "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==",
-          "dev": true
+        "which": {
+          "version": "1.3.1",
+          "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz",
+          "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==",
+          "dev": true,
+          "requires": {
+            "isexe": "^2.0.0"
+          }
         }
       }
     },
         }
       }
     },
       "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz",
       "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA=="
     },
       "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz",
       "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA=="
     },
+    "globalthis": {
+      "version": "1.0.3",
+      "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.3.tgz",
+      "integrity": "sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA==",
+      "dev": true,
+      "requires": {
+        "define-properties": "^1.1.3"
+      }
+    },
     "globby": {
     "globby": {
-      "version": "11.1.0",
-      "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz",
-      "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==",
+      "version": "12.2.0",
+      "resolved": "https://registry.npmjs.org/globby/-/globby-12.2.0.tgz",
+      "integrity": "sha512-wiSuFQLZ+urS9x2gGPl1H5drc5twabmm4m2gTR27XDFyjUHJUNsS8o/2aKyIF6IoBaR630atdher0XJ5g6OMmA==",
       "dev": true,
       "requires": {
       "dev": true,
       "requires": {
-        "array-union": "^2.1.0",
+        "array-union": "^3.0.1",
         "dir-glob": "^3.0.1",
         "dir-glob": "^3.0.1",
-        "fast-glob": "^3.2.9",
-        "ignore": "^5.2.0",
+        "fast-glob": "^3.2.7",
+        "ignore": "^5.1.9",
         "merge2": "^1.4.1",
         "merge2": "^1.4.1",
-        "slash": "^3.0.0"
+        "slash": "^4.0.0"
       }
     },
     "globjoin": {
       }
     },
     "globjoin": {
         "minimist": "^1.2.5"
       }
     },
         "minimist": "^1.2.5"
       }
     },
+    "gopd": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz",
+      "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==",
+      "dev": true,
+      "requires": {
+        "get-intrinsic": "^1.1.3"
+      }
+    },
     "graceful-fs": {
       "version": "4.2.10",
       "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz",
     "graceful-fs": {
       "version": "4.2.10",
       "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz",
       "integrity": "sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA==",
       "dev": true
     },
       "integrity": "sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA==",
       "dev": true
     },
-    "growly": {
-      "version": "1.3.0",
-      "resolved": "https://registry.npmjs.org/growly/-/growly-1.3.0.tgz",
-      "integrity": "sha512-+xGQY0YyAWCnqy7Cd++hc2JqMYzlm0dG30Jd0beaA64sROr8C4nt8Yc9V5Ro3avlSUDTN0ulqP/VBKi1/lLygw==",
-      "dev": true,
-      "optional": true
-    },
     "handle-thing": {
       "version": "2.0.1",
       "resolved": "https://registry.npmjs.org/handle-thing/-/handle-thing-2.0.1.tgz",
     "handle-thing": {
       "version": "2.0.1",
       "resolved": "https://registry.npmjs.org/handle-thing/-/handle-thing-2.0.1.tgz",
         "get-intrinsic": "^1.1.1"
       }
     },
         "get-intrinsic": "^1.1.1"
       }
     },
+    "has-proto": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.1.tgz",
+      "integrity": "sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==",
+      "dev": true
+    },
     "has-symbols": {
       "version": "1.0.3",
       "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz",
     "has-symbols": {
       "version": "1.0.3",
       "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz",
     "has-unicode": {
       "version": "2.0.1",
       "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz",
     "has-unicode": {
       "version": "2.0.1",
       "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz",
-      "integrity": "sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ==",
-      "dev": true
+      "integrity": "sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ=="
     },
     "has-value": {
       "version": "1.0.0",
     },
     "has-value": {
       "version": "1.0.0",
         "safe-buffer": "^5.2.0"
       },
       "dependencies": {
         "safe-buffer": "^5.2.0"
       },
       "dependencies": {
-        "safe-buffer": {
-          "version": "5.2.1",
-          "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz",
-          "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==",
-          "dev": true
+        "readable-stream": {
+          "version": "3.6.1",
+          "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.1.tgz",
+          "integrity": "sha512-+rQmrWMYGA90yenhTYsLWAsLsqVC8osOw6PKE1HDYiO0gdPeKe/xDHNzIAIn4C91YQ6oenEhfYqqc1883qHbjQ==",
+          "dev": true,
+          "requires": {
+            "inherits": "^2.0.3",
+            "string_decoder": "^1.1.1",
+            "util-deprecate": "^1.0.1"
+          }
         }
       }
     },
         }
       }
     },
       "dev": true,
       "requires": {
         "lru-cache": "^6.0.0"
       "dev": true,
       "requires": {
         "lru-cache": "^6.0.0"
+      },
+      "dependencies": {
+        "lru-cache": {
+          "version": "6.0.0",
+          "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz",
+          "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==",
+          "dev": true,
+          "requires": {
+            "yallist": "^4.0.0"
+          }
+        },
+        "yallist": {
+          "version": "4.0.0",
+          "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
+          "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==",
+          "dev": true
+        }
       }
     },
     "hpack.js": {
       }
     },
     "hpack.js": {
         "obuf": "^1.0.0",
         "readable-stream": "^2.0.1",
         "wbuf": "^1.1.0"
         "obuf": "^1.0.0",
         "readable-stream": "^2.0.1",
         "wbuf": "^1.1.0"
-      },
-      "dependencies": {
-        "readable-stream": {
-          "version": "2.3.7",
-          "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz",
-          "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==",
-          "dev": true,
-          "requires": {
-            "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"
-          }
-        },
-        "string_decoder": {
-          "version": "1.1.1",
-          "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz",
-          "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
-          "dev": true,
-          "requires": {
-            "safe-buffer": "~5.1.0"
-          }
-        }
       }
     },
     "html-encoding-sniffer": {
       }
     },
     "html-encoding-sniffer": {
       }
     },
     "html-entities": {
       }
     },
     "html-entities": {
-      "version": "1.4.0",
-      "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-1.4.0.tgz",
-      "integrity": "sha512-8nxjcBcd8wovbeKx7h3wTji4e6+rhaVuPNpMqwWgnHh+N9ToqsCs6XztWRBPQ+UtzsoMAdKZtUENoVzU/EMtZA==",
+      "version": "2.3.3",
+      "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-2.3.3.tgz",
+      "integrity": "sha512-DV5Ln36z34NNTDgnz0EWGBLZENelNAtkiFA4kyNOG2tDI6Mz1uSWiq1wAKdyjnJwyDiDO7Fa2SO1CTxPXL8VxA==",
       "dev": true
     },
     "html-escaper": {
       "dev": true
     },
     "html-escaper": {
         "chalk": "^2.4.1",
         "commander": "^2.12.2",
         "glob": "^7.1.2"
         "chalk": "^2.4.1",
         "commander": "^2.12.2",
         "glob": "^7.1.2"
-      },
-      "dependencies": {
-        "commander": {
-          "version": "2.20.3",
-          "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz",
-          "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==",
-          "dev": true
-        }
       }
     },
     "html-tags": {
       }
     },
     "html-tags": {
           }
         },
         "promise": {
           }
         },
         "promise": {
-          "version": "8.1.0",
-          "resolved": "https://registry.npmjs.org/promise/-/promise-8.1.0.tgz",
-          "integrity": "sha512-W04AqnILOL/sPRXziNicCjSNRruLAuIHEOVBazepu0545DDNGYHz7ar9ZgZ1fMU8/MA4mVxp5rkBWRi6OXIy3Q==",
+          "version": "8.3.0",
+          "resolved": "https://registry.npmjs.org/promise/-/promise-8.3.0.tgz",
+          "integrity": "sha512-rZPNPKTOYVNEEKFaq1HqTgOwZD+4/YHS5ukLzQCypkj+OkYx7iv0mA91lJlpPPZ8vMau3IIGj5Qlwrx+8iiSmg==",
           "dev": true,
           "requires": {
             "asap": "~2.0.6"
           }
           "dev": true,
           "requires": {
             "asap": "~2.0.6"
           }
+        },
+        "readable-stream": {
+          "version": "3.6.1",
+          "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.1.tgz",
+          "integrity": "sha512-+rQmrWMYGA90yenhTYsLWAsLsqVC8osOw6PKE1HDYiO0gdPeKe/xDHNzIAIn4C91YQ6oenEhfYqqc1883qHbjQ==",
+          "dev": true,
+          "requires": {
+            "inherits": "^2.0.3",
+            "string_decoder": "^1.1.1",
+            "util-deprecate": "^1.0.1"
+          }
         }
       }
     },
         }
       }
     },
             "wrap-ansi": "^2.0.0"
           }
         },
             "wrap-ansi": "^2.0.0"
           }
         },
+        "decamelize": {
+          "version": "1.2.0",
+          "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz",
+          "integrity": "sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==",
+          "dev": true
+        },
         "find-up": {
           "version": "2.1.0",
           "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz",
         "find-up": {
           "version": "2.1.0",
           "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz",
           "integrity": "sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==",
           "dev": true
         },
           "integrity": "sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==",
           "dev": true
         },
-        "require-main-filename": {
-          "version": "1.0.1",
-          "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-1.0.1.tgz",
-          "integrity": "sha512-IqSUtOVP4ksd1C/ej5zeEh/BIP2ajqpn8c5x+q99gvcIG/Qf0cud5raVnE/Dwd0ua9TXYDoDc0RE5hBSdz22Ug==",
+        "semver": {
+          "version": "5.7.1",
+          "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz",
+          "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==",
           "dev": true
         },
         "string-width": {
           "dev": true
         },
         "string-width": {
           }
         },
         "entities": {
           }
         },
         "entities": {
-          "version": "4.3.1",
-          "resolved": "https://registry.npmjs.org/entities/-/entities-4.3.1.tgz",
-          "integrity": "sha512-o4q/dYJlmyjP2zfnaWDUC6A3BQFmVTX+tZPezK7k0GLSU9QYCauscf5Y+qcEPzKL+EixVouYDgLQK5H9GrLpkg==",
+          "version": "4.4.0",
+          "resolved": "https://registry.npmjs.org/entities/-/entities-4.4.0.tgz",
+          "integrity": "sha512-oYp7156SP8LkeGD0GF85ad1X9Ai79WtRsZ2gxJqtBuzH+98YUV6jkHEKlZkMbcrjJjIVJNIDP/3WL9wQkoPbWA==",
           "dev": true
         }
       }
           "dev": true
         }
       }
       }
     },
     "http-auth-connect": {
       }
     },
     "http-auth-connect": {
-      "version": "1.0.5",
-      "resolved": "https://registry.npmjs.org/http-auth-connect/-/http-auth-connect-1.0.5.tgz",
-      "integrity": "sha512-zykAOKpVAXyzhOLm6+xyB/RtRcfN3uDfH4Al73DIfeSb6B7nr0WToLI6UyyM6ohtcLmbBPksWXzVbEDStz8ObQ==",
+      "version": "1.0.6",
+      "resolved": "https://registry.npmjs.org/http-auth-connect/-/http-auth-connect-1.0.6.tgz",
+      "integrity": "sha512-yaO0QSCPqGCjPrl3qEEHjJP+lwZ6gMpXLuCBE06eWwcXomkI5TARtu0kxf9teFuBj6iaV3Ybr15jaWUvbzNzHw==",
       "dev": true
     },
     "http-cache-semantics": {
       "dev": true
     },
     "http-cache-semantics": {
-      "version": "4.1.0",
-      "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.0.tgz",
-      "integrity": "sha512-carPklcUh7ROWRK7Cv27RPtdhYhUsela/ue5/jKzjegVvXDqM2ILE9Q2BGn9JZJh1g87cp56su/FgQSzcWS8cQ==",
+      "version": "4.1.1",
+      "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.1.tgz",
+      "integrity": "sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==",
       "dev": true
     },
     "http-deceiver": {
       "dev": true
     },
     "http-deceiver": {
       }
     },
     "http-proxy-middleware": {
       }
     },
     "http-proxy-middleware": {
-      "version": "0.19.1",
-      "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-0.19.1.tgz",
-      "integrity": "sha512-yHYTgWMQO8VvwNS22eLLloAkvungsKdKTLO8AJlftYIKNfJr3GK3zK0ZCfzDDGUBttdGc8xFy1mCitvNKQtC3Q==",
+      "version": "2.0.6",
+      "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-2.0.6.tgz",
+      "integrity": "sha512-ya/UeJ6HVBYxrgYotAZo1KvPWlgB48kUJLDePFeneHsVujFaW5WNj2NgWCAE//B1Dl02BIfYlpNgBy8Kf8Rjmw==",
       "dev": true,
       "requires": {
       "dev": true,
       "requires": {
-        "http-proxy": "^1.17.0",
-        "is-glob": "^4.0.0",
-        "lodash": "^4.17.11",
-        "micromatch": "^3.1.10"
-      },
-      "dependencies": {
-        "braces": {
-          "version": "2.3.2",
-          "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz",
-          "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==",
-          "dev": true,
-          "requires": {
-            "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"
-          },
-          "dependencies": {
-            "extend-shallow": {
-              "version": "2.0.1",
-              "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
-              "integrity": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==",
-              "dev": true,
-              "requires": {
-                "is-extendable": "^0.1.0"
-              }
-            }
-          }
-        },
-        "fill-range": {
-          "version": "4.0.0",
-          "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz",
-          "integrity": "sha512-VcpLTWqWDiTerugjj8e3+esbg+skS3M9e54UuR3iCeIDMXCLTsAH8hTSzDQU/X6/6t3eYkOKoZSef2PlU6U1XQ==",
-          "dev": true,
-          "requires": {
-            "extend-shallow": "^2.0.1",
-            "is-number": "^3.0.0",
-            "repeat-string": "^1.6.1",
-            "to-regex-range": "^2.1.0"
-          },
-          "dependencies": {
-            "extend-shallow": {
-              "version": "2.0.1",
-              "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
-              "integrity": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==",
-              "dev": true,
-              "requires": {
-                "is-extendable": "^0.1.0"
-              }
-            }
-          }
-        },
-        "is-number": {
-          "version": "3.0.0",
-          "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz",
-          "integrity": "sha512-4cboCqIpliH+mAvFNegjZQ4kgKc3ZUhQVr3HvWbSh5q3WH2v82ct+T2Y1hdU5Gdtorx/cLifQjqCbL7bpznLTg==",
-          "dev": true,
-          "requires": {
-            "kind-of": "^3.0.2"
-          },
-          "dependencies": {
-            "kind-of": {
-              "version": "3.2.2",
-              "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
-              "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==",
-              "dev": true,
-              "requires": {
-                "is-buffer": "^1.1.5"
-              }
-            }
-          }
-        },
-        "micromatch": {
-          "version": "3.1.10",
-          "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz",
-          "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==",
-          "dev": true,
-          "requires": {
-            "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"
-          }
-        },
-        "to-regex-range": {
-          "version": "2.1.1",
-          "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz",
-          "integrity": "sha512-ZZWNfCjUokXXDGXFpZehJIkZqq91BcULFq/Pi7M5i4JnxXdhMKAK682z8bCW3o8Hj1wuuzoKcW3DfVzaP6VuNg==",
-          "dev": true,
-          "requires": {
-            "is-number": "^3.0.0",
-            "repeat-string": "^1.6.1"
-          }
-        }
+        "@types/http-proxy": "^1.17.8",
+        "http-proxy": "^1.18.1",
+        "is-glob": "^4.0.1",
+        "is-plain-obj": "^3.0.0",
+        "micromatch": "^4.0.2"
       }
     },
     "http-signature": {
       }
     },
     "http-signature": {
       }
     },
     "human-signals": {
       }
     },
     "human-signals": {
-      "version": "1.1.1",
-      "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-1.1.1.tgz",
-      "integrity": "sha512-SEQu7vl8KjNL2eoGBLF3+wAjpsNfA9XMlXAYj/3EdaNfAlxKthD1xjEQfGOUhllCGGJVNY34bRr6lPINhNjyZw==",
+      "version": "2.1.0",
+      "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz",
+      "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==",
       "dev": true
     },
     "humanize-ms": {
       "dev": true
     },
     "humanize-ms": {
       }
     },
     "i18next": {
       }
     },
     "i18next": {
-      "version": "20.6.1",
-      "resolved": "https://registry.npmjs.org/i18next/-/i18next-20.6.1.tgz",
-      "integrity": "sha512-yCMYTMEJ9ihCwEQQ3phLo7I/Pwycf8uAx+sRHwwk5U9Aui/IZYgQRyMqXafQOw5QQ7DM1Z+WyEXWIqSuJHhG2A==",
+      "version": "21.10.0",
+      "resolved": "https://registry.npmjs.org/i18next/-/i18next-21.10.0.tgz",
+      "integrity": "sha512-YeuIBmFsGjUfO3qBmMOc0rQaun4mIpGKET5WDwvu8lU7gvwpcariZLNtL0Fzj+zazcHUrlXHiptcFhBMFaxzfg==",
       "dev": true,
       "requires": {
       "dev": true,
       "requires": {
-        "@babel/runtime": "^7.12.0"
+        "@babel/runtime": "^7.17.2"
       }
     },
     "iconv-lite": {
       }
     },
     "iconv-lite": {
       "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA=="
     },
     "ignore": {
       "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA=="
     },
     "ignore": {
-      "version": "5.2.0",
-      "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.0.tgz",
-      "integrity": "sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ==",
+      "version": "5.2.4",
+      "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.4.tgz",
+      "integrity": "sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==",
       "dev": true
     },
     "ignore-walk": {
       "dev": true
     },
     "ignore-walk": {
-      "version": "3.0.4",
-      "resolved": "https://registry.npmjs.org/ignore-walk/-/ignore-walk-3.0.4.tgz",
-      "integrity": "sha512-PY6Ii8o1jMRA1z4F2hRkH/xN59ox43DavKvD3oDpfurRlOJyAHpifIwpbdv1n4jt4ov0jSpw3kQ4GhJnpBL6WQ==",
+      "version": "4.0.1",
+      "resolved": "https://registry.npmjs.org/ignore-walk/-/ignore-walk-4.0.1.tgz",
+      "integrity": "sha512-rzDQLaW4jQbh2YrOFlJdCtX8qgJTehFRYiUB2r1osqTeDzV/3+Jh8fz1oAPzUThf3iku8Ds4IDqawI5d8mUiQw==",
       "dev": true,
       "requires": {
         "minimatch": "^3.0.4"
       "dev": true,
       "requires": {
         "minimatch": "^3.0.4"
       "requires": {
         "parent-module": "^1.0.0",
         "resolve-from": "^4.0.0"
       "requires": {
         "parent-module": "^1.0.0",
         "resolve-from": "^4.0.0"
+      },
+      "dependencies": {
+        "resolve-from": {
+          "version": "4.0.0",
+          "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz",
+          "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==",
+          "dev": true
+        }
       }
     },
     "import-lazy": {
       }
     },
     "import-lazy": {
       "dev": true
     },
     "import-local": {
       "dev": true
     },
     "import-local": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/import-local/-/import-local-2.0.0.tgz",
-      "integrity": "sha512-b6s04m3O+s3CGSbqDIyP4R6aAwAeYlVq9+WUWep6iHa8ETRf9yei1U48C5MmfJmV9AiLYYBKPMq/W+/WRpQmCQ==",
+      "version": "3.1.0",
+      "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.1.0.tgz",
+      "integrity": "sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg==",
       "dev": true,
       "requires": {
       "dev": true,
       "requires": {
-        "pkg-dir": "^3.0.0",
-        "resolve-cwd": "^2.0.0"
-      },
-      "dependencies": {
-        "find-up": {
-          "version": "3.0.0",
-          "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz",
-          "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==",
-          "dev": true,
-          "requires": {
-            "locate-path": "^3.0.0"
-          }
-        },
-        "locate-path": {
-          "version": "3.0.0",
-          "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz",
-          "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==",
-          "dev": true,
-          "requires": {
-            "p-locate": "^3.0.0",
-            "path-exists": "^3.0.0"
-          }
-        },
-        "p-locate": {
-          "version": "3.0.0",
-          "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz",
-          "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==",
-          "dev": true,
-          "requires": {
-            "p-limit": "^2.0.0"
-          }
-        },
-        "path-exists": {
-          "version": "3.0.0",
-          "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz",
-          "integrity": "sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==",
-          "dev": true
-        },
-        "pkg-dir": {
-          "version": "3.0.0",
-          "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-3.0.0.tgz",
-          "integrity": "sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw==",
-          "dev": true,
-          "requires": {
-            "find-up": "^3.0.0"
-          }
-        }
+        "pkg-dir": "^4.2.0",
+        "resolve-cwd": "^3.0.0"
       }
     },
     "imurmurhash": {
       }
     },
     "imurmurhash": {
       "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==",
       "dev": true
     },
       "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==",
       "dev": true
     },
-    "indexes-of": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/indexes-of/-/indexes-of-1.0.1.tgz",
-      "integrity": "sha512-bup+4tap3Hympa+JBJUG7XuOsdNQ6fxt0MHyXMKuLBKn0OqsTfvUxkUrroEX1+B2VsSHvCjiIcZVxRtYa4nllA==",
-      "dev": true
-    },
     "infer-owner": {
       "version": "1.0.4",
       "resolved": "https://registry.npmjs.org/infer-owner/-/infer-owner-1.0.4.tgz",
     "infer-owner": {
       "version": "1.0.4",
       "resolved": "https://registry.npmjs.org/infer-owner/-/infer-owner-1.0.4.tgz",
       "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ=="
     },
     "ini": {
       "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ=="
     },
     "ini": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/ini/-/ini-2.0.0.tgz",
-      "integrity": "sha512-7PnF4oN3CvZF23ADhA5wRaYEQpJ8qygSkbtTXWBeXWXmEVRXK+1ITciHWwHhsjv1TmW0MgacIv6hEi5pX5NQdA==",
-      "dev": true
+      "version": "1.3.8",
+      "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz",
+      "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew=="
     },
     "inline-source-map": {
       "version": "0.6.2",
     },
     "inline-source-map": {
       "version": "0.6.2",
       "dev": true,
       "requires": {
         "source-map": "~0.5.3"
       "dev": true,
       "requires": {
         "source-map": "~0.5.3"
+      },
+      "dependencies": {
+        "source-map": {
+          "version": "0.5.7",
+          "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz",
+          "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==",
+          "dev": true
+        }
       }
     },
     "inquirer": {
       }
     },
     "inquirer": {
-      "version": "8.1.2",
-      "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-8.1.2.tgz",
-      "integrity": "sha512-DHLKJwLPNgkfwNmsuEUKSejJFbkv0FMO9SMiQbjI3n5NQuCrSIBqP66ggqyz2a6t2qEolKrMjhQ3+W/xXgUQ+Q==",
+      "version": "8.2.0",
+      "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-8.2.0.tgz",
+      "integrity": "sha512-0crLweprevJ02tTuA6ThpoAERAGyVILC4sS74uib58Xf/zSr1/ZWtmm7D5CI+bSQEaA04f0K7idaHpQbSWgiVQ==",
       "dev": true,
       "requires": {
         "ansi-escapes": "^4.2.1",
       "dev": true,
       "requires": {
         "ansi-escapes": "^4.2.1",
         "figures": "^3.0.0",
         "lodash": "^4.17.21",
         "mute-stream": "0.0.8",
         "figures": "^3.0.0",
         "lodash": "^4.17.21",
         "mute-stream": "0.0.8",
-        "ora": "^5.3.0",
+        "ora": "^5.4.1",
         "run-async": "^2.4.0",
         "rxjs": "^7.2.0",
         "string-width": "^4.1.0",
         "run-async": "^2.4.0",
         "rxjs": "^7.2.0",
         "string-width": "^4.1.0",
           "dev": true
         },
         "rxjs": {
           "dev": true
         },
         "rxjs": {
-          "version": "7.5.6",
-          "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.5.6.tgz",
-          "integrity": "sha512-dnyv2/YsXhnm461G+R/Pe5bWP41Nm6LBXEYWI6eiFP4fiwx6WRI/CD0zbdVAudd9xwLEF2IDcKXLHit0FYjUzw==",
+          "version": "7.8.0",
+          "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.0.tgz",
+          "integrity": "sha512-F2+gxDshqmIub1KdvZkaEfGDwLNpPvk9Fs6LD/MyQxNgMds/WH9OdDDXOmxUZpME+iSK3rQCctkL0DYyytUqMg==",
           "dev": true,
           "requires": {
             "tslib": "^2.1.0"
           "dev": true,
           "requires": {
             "tslib": "^2.1.0"
       "integrity": "sha512-tvFwvS4g7q6iDot/4FjtWFHwwpv6TVvEumbTdLQilk1F07ojakbXPQcvf3kMAlyNDpzKRzn+d33O3RuXODuxZQ==",
       "dev": true
     },
       "integrity": "sha512-tvFwvS4g7q6iDot/4FjtWFHwwpv6TVvEumbTdLQilk1F07ojakbXPQcvf3kMAlyNDpzKRzn+d33O3RuXODuxZQ==",
       "dev": true
     },
-    "internal-ip": {
-      "version": "4.3.0",
-      "resolved": "https://registry.npmjs.org/internal-ip/-/internal-ip-4.3.0.tgz",
-      "integrity": "sha512-S1zBo1D6zcsyuC6PMmY5+55YMILQ9av8lotMx447Bq6SAgo/sDK6y6uUKmuYhW7eacnIhFfsPmCNYdDzsnnDCg==",
-      "dev": true,
-      "requires": {
-        "default-gateway": "^4.2.0",
-        "ipaddr.js": "^1.9.0"
-      }
-    },
     "internal-slot": {
     "internal-slot": {
-      "version": "1.0.3",
-      "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.3.tgz",
-      "integrity": "sha512-O0DB1JC/sPyZl7cIo78n5dR7eUSwwpYPiXRhTzNxZVAMUuB8vlnRFyLxdrVToks6XPLVnFfbzaVd5WLjhgg+vA==",
+      "version": "1.0.5",
+      "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.5.tgz",
+      "integrity": "sha512-Y+R5hJrzs52QCG2laLn4udYVnxsfny9CpOhNhUvk/SSSVyF6T27FzRbF0sroPidSu3X8oEAkOn2K804mjpt6UQ==",
       "dev": true,
       "requires": {
       "dev": true,
       "requires": {
-        "get-intrinsic": "^1.1.0",
+        "get-intrinsic": "^1.2.0",
         "has": "^1.0.3",
         "side-channel": "^1.0.4"
       }
         "has": "^1.0.3",
         "side-channel": "^1.0.4"
       }
       "dev": true
     },
     "ipaddr.js": {
       "dev": true
     },
     "ipaddr.js": {
-      "version": "1.9.1",
-      "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz",
-      "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==",
+      "version": "2.0.1",
+      "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-2.0.1.tgz",
+      "integrity": "sha512-1qTgH9NG+IIJ4yfKs2e6Pp1bZg8wbDbKHT21HrLIeYBTRLgMYKnMTPAuI3Lcs61nfx5h1xlXnbJtH1kX5/d/ng==",
       "dev": true
     },
     "is-absolute": {
       "dev": true
     },
     "is-absolute": {
         "is-windows": "^1.0.1"
       }
     },
         "is-windows": "^1.0.1"
       }
     },
-    "is-absolute-url": {
-      "version": "3.0.3",
-      "resolved": "https://registry.npmjs.org/is-absolute-url/-/is-absolute-url-3.0.3.tgz",
-      "integrity": "sha512-opmNIX7uFnS96NtPmhWQgQx6/NYFgsUXYMllcfzwWKUMwfo8kku1TvE6hkNcH+Q1ts5cMVrsY7j0bxXQDciu9Q==",
-      "dev": true
-    },
     "is-accessor-descriptor": {
       "version": "0.1.6",
       "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz",
     "is-accessor-descriptor": {
       "version": "0.1.6",
       "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz",
         "has-tostringtag": "^1.0.0"
       }
     },
         "has-tostringtag": "^1.0.0"
       }
     },
+    "is-array-buffer": {
+      "version": "3.0.2",
+      "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.2.tgz",
+      "integrity": "sha512-y+FyyR/w8vfIRq4eQcM1EYgSTnmHXPqaF+IgzgraytCFq5Xh8lllDVmAZolPJiZttZLeFSINPYMaEJ7/vWUa1w==",
+      "dev": true,
+      "requires": {
+        "call-bind": "^1.0.2",
+        "get-intrinsic": "^1.2.0",
+        "is-typed-array": "^1.1.10"
+      }
+    },
     "is-arrayish": {
       "version": "0.2.1",
       "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz",
     "is-arrayish": {
       "version": "0.2.1",
       "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz",
       "dev": true
     },
     "is-callable": {
       "dev": true
     },
     "is-callable": {
-      "version": "1.2.4",
-      "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.4.tgz",
-      "integrity": "sha512-nsuwtxZfMX67Oryl9LCQ+upnC0Z0BgpwntpS89m1H/TLF0zNfzfLMV/9Wa/6MZsj0acpEjAO0KF1xT6ZdLl95w==",
+      "version": "1.2.7",
+      "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz",
+      "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==",
       "dev": true
     },
     "is-ci": {
       "dev": true
     },
     "is-ci": {
       }
     },
     "is-core-module": {
       }
     },
     "is-core-module": {
-      "version": "2.10.0",
-      "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.10.0.tgz",
-      "integrity": "sha512-Erxj2n/LDAZ7H8WNJXd9tw38GYM3dv8rk8Zcs+jJuxYTW7sozH+SS8NtrSjVL1/vpLvWi1hxy96IzjJ3EHTJJg==",
+      "version": "2.11.0",
+      "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.11.0.tgz",
+      "integrity": "sha512-RRjxlvLDkD1YJwDbroBHMb+cukurkDWNyHx7D3oNB5x9rb5ogcksMC5wHCadcXoo67gVr/+3GFySh3134zi6rw==",
+      "dev": true,
       "requires": {
         "has": "^1.0.3"
       }
       "requires": {
         "has": "^1.0.3"
       }
       "requires": {
         "global-dirs": "^3.0.0",
         "is-path-inside": "^3.0.2"
       "requires": {
         "global-dirs": "^3.0.0",
         "is-path-inside": "^3.0.2"
-      },
-      "dependencies": {
-        "is-path-inside": {
-          "version": "3.0.3",
-          "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz",
-          "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==",
-          "dev": true
-        }
       }
     },
     "is-interactive": {
       }
     },
     "is-interactive": {
       "integrity": "sha512-w942bTcih8fdJPJmQHFzkS76NEP8Kzzvmw92cXsazb8intwLqPibPPdXf4ANdKV3rYMuuQYGIWtvz9JilB3NFQ==",
       "dev": true
     },
       "integrity": "sha512-w942bTcih8fdJPJmQHFzkS76NEP8Kzzvmw92cXsazb8intwLqPibPPdXf4ANdKV3rYMuuQYGIWtvz9JilB3NFQ==",
       "dev": true
     },
-    "is-path-in-cwd": {
-      "version": "2.1.0",
-      "resolved": "https://registry.npmjs.org/is-path-in-cwd/-/is-path-in-cwd-2.1.0.tgz",
-      "integrity": "sha512-rNocXHgipO+rvnP6dk3zI20RpOtrAM/kzbB258Uw5BWr3TpXi861yzjo16Dn4hUox07iw5AyeMLHWsujkjzvRQ==",
-      "dev": true,
-      "requires": {
-        "is-path-inside": "^2.1.0"
-      }
-    },
     "is-path-inside": {
     "is-path-inside": {
-      "version": "2.1.0",
-      "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-2.1.0.tgz",
-      "integrity": "sha512-wiyhTzfDWsvwAW53OBWF5zuvaOGlZ6PwYxAbPVDhpm+gM09xKQGjBq/8uYN12aDvMxnAnq3dxTyoSoRNmg5YFg==",
-      "dev": true,
-      "requires": {
-        "path-is-inside": "^1.0.2"
-      }
+      "version": "3.0.3",
+      "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz",
+      "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==",
+      "dev": true
     },
     "is-plain-obj": {
     },
     "is-plain-obj": {
-      "version": "2.1.0",
-      "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-2.1.0.tgz",
-      "integrity": "sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==",
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-3.0.0.tgz",
+      "integrity": "sha512-gwsOE28k+23GP1B6vFl1oVh/WOzmawBrKwo5Ev6wMKzPkaXaCDIQKzLnvsA42DRlbVTWorkgTKIviAKCWkfUwA==",
       "dev": true
     },
     "is-plain-object": {
       "dev": true
     },
     "is-plain-object": {
       }
     },
     "is-stream": {
       }
     },
     "is-stream": {
-      "version": "1.1.0",
-      "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz",
-      "integrity": "sha512-uQPm8kcs47jx38atAcWTVxyltQYoPT68y9aWYdV6yWXSyW8mzSat0TL6CiWdZeCdF3KrAvpVtnHbTv4RN+rqdQ==",
+      "version": "2.0.1",
+      "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz",
+      "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==",
       "dev": true
     },
     "is-string": {
       "dev": true
     },
     "is-string": {
       }
     },
     "is-typed-array": {
       }
     },
     "is-typed-array": {
-      "version": "1.1.9",
-      "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.9.tgz",
-      "integrity": "sha512-kfrlnTTn8pZkfpJMUgYD7YZ3qzeJgWUn8XfVYBARc4wnmNOmLbmuuaAs3q5fvB0UJOn6yHAKaGTPM7d6ezoD/A==",
+      "version": "1.1.10",
+      "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.10.tgz",
+      "integrity": "sha512-PJqgEHiWZvMpaFZ3uTc8kHPM4+4ADTlDniuQL7cU/UDA0Ql7F70yGfHph3cLNe+c9toaigv+DFzTJKhc2CtO6A==",
       "dev": true,
       "requires": {
         "available-typed-arrays": "^1.0.5",
         "call-bind": "^1.0.2",
       "dev": true,
       "requires": {
         "available-typed-arrays": "^1.0.5",
         "call-bind": "^1.0.2",
-        "es-abstract": "^1.20.0",
         "for-each": "^0.3.3",
         "for-each": "^0.3.3",
+        "gopd": "^1.0.1",
         "has-tostringtag": "^1.0.0"
       }
     },
         "has-tostringtag": "^1.0.0"
       }
     },
     "isarray": {
       "version": "1.0.0",
       "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
     "isarray": {
       "version": "1.0.0",
       "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
-      "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==",
-      "dev": true
+      "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ=="
     },
     "isexe": {
       "version": "2.0.0",
     },
     "isexe": {
       "version": "2.0.0",
       "dev": true,
       "requires": {
         "form-data": "^2.3.2"
       "dev": true,
       "requires": {
         "form-data": "^2.3.2"
+      },
+      "dependencies": {
+        "form-data": {
+          "version": "2.5.1",
+          "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.5.1.tgz",
+          "integrity": "sha512-m21N3WOmEEURgk6B9GLOE4RuWOFf28Lhh9qGYeNlGq4VDXUlJy2th2slBNU8Gp8EzloYZOibZJ7t5ecIrFSjVA==",
+          "dev": true,
+          "requires": {
+            "asynckit": "^0.4.0",
+            "combined-stream": "^1.0.6",
+            "mime-types": "^2.1.12"
+          }
+        }
       }
     },
     "isstream": {
       }
     },
     "isstream": {
       "dev": true
     },
     "istanbul-lib-instrument": {
       "dev": true
     },
     "istanbul-lib-instrument": {
-      "version": "4.0.3",
-      "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-4.0.3.tgz",
-      "integrity": "sha512-BXgQl9kf4WTCPCCpmFGoJkz/+uhvm7h7PFKUYxh7qarQd3ER33vHG//qaE8eN25l07YqZPpHXU9I09l/RD5aGQ==",
+      "version": "5.2.1",
+      "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.1.tgz",
+      "integrity": "sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==",
       "dev": true,
       "requires": {
       "dev": true,
       "requires": {
-        "@babel/core": "^7.7.5",
+        "@babel/core": "^7.12.3",
+        "@babel/parser": "^7.14.7",
         "@istanbuljs/schema": "^0.1.2",
         "@istanbuljs/schema": "^0.1.2",
-        "istanbul-lib-coverage": "^3.0.0",
+        "istanbul-lib-coverage": "^3.2.0",
         "semver": "^6.3.0"
         "semver": "^6.3.0"
-      },
-      "dependencies": {
-        "semver": {
-          "version": "6.3.0",
-          "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
-          "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==",
-          "dev": true
-        }
       }
     },
     "istanbul-lib-report": {
       }
     },
     "istanbul-lib-report": {
         "istanbul-lib-report": "^3.0.0"
       }
     },
         "istanbul-lib-report": "^3.0.0"
       }
     },
-    "jest": {
-      "version": "26.5.2",
-      "resolved": "https://registry.npmjs.org/jest/-/jest-26.5.2.tgz",
-      "integrity": "sha512-4HFabJVwsgDwul/7rhXJ3yFAF/aUkVIXiJWmgFxb+WMdZG39fVvOwYAs8/3r4AlFPc4m/n5sTMtuMbOL3kNtrQ==",
+    "jake": {
+      "version": "10.8.5",
+      "resolved": "https://registry.npmjs.org/jake/-/jake-10.8.5.tgz",
+      "integrity": "sha512-sVpxYeuAhWt0OTWITwT98oyV0GsXyMlXCF+3L1SuafBVUIr/uILGRB+NqwkzhgXKvoJpDIpQvqkUALgdmQsQxw==",
       "dev": true,
       "requires": {
       "dev": true,
       "requires": {
-        "@jest/core": "^26.5.2",
-        "import-local": "^3.0.2",
-        "jest-cli": "^26.5.2"
+        "async": "^3.2.3",
+        "chalk": "^4.0.2",
+        "filelist": "^1.0.1",
+        "minimatch": "^3.0.4"
       },
       "dependencies": {
       },
       "dependencies": {
-        "@jest/types": {
-          "version": "26.6.2",
-          "resolved": "https://registry.npmjs.org/@jest/types/-/types-26.6.2.tgz",
-          "integrity": "sha512-fC6QCp7Sc5sX6g8Tvbmj4XUTbyrik0akgRy03yjXbQaBWWNWGE7SGtJk98m0N8nzegD/7SggrUlivxo5ax4KWQ==",
-          "dev": true,
-          "requires": {
-            "@types/istanbul-lib-coverage": "^2.0.0",
-            "@types/istanbul-reports": "^3.0.0",
-            "@types/node": "*",
-            "@types/yargs": "^15.0.0",
-            "chalk": "^4.0.0"
-          }
-        },
-        "@types/istanbul-reports": {
-          "version": "3.0.1",
-          "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.1.tgz",
-          "integrity": "sha512-c3mAZEuK0lvBp8tmuL74XRKn1+y2dcwOUpH7x4WrF6gk1GIgiluDRgMYQtw2OFcBvAJWlt6ASU3tSqxp0Uu0Aw==",
-          "dev": true,
-          "requires": {
-            "@types/istanbul-lib-report": "*"
-          }
-        },
         "ansi-styles": {
           "version": "4.3.0",
           "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
         "ansi-styles": {
           "version": "4.3.0",
           "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
             "color-convert": "^2.0.1"
           }
         },
             "color-convert": "^2.0.1"
           }
         },
+        "async": {
+          "version": "3.2.4",
+          "resolved": "https://registry.npmjs.org/async/-/async-3.2.4.tgz",
+          "integrity": "sha512-iAB+JbDEGXhyIUavoDl9WP/Jj106Kz9DEn1DPgYw5ruDn0e3Wgi3sKFm55sASdGBNOQB8F59d9qQ7deqrHA8wQ==",
+          "dev": true
+        },
         "chalk": {
           "version": "4.1.2",
           "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
         "chalk": {
           "version": "4.1.2",
           "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
             "supports-color": "^7.1.0"
           }
         },
             "supports-color": "^7.1.0"
           }
         },
-        "ci-info": {
-          "version": "2.0.0",
-          "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz",
-          "integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==",
-          "dev": true
-        },
-        "cliui": {
-          "version": "6.0.0",
-          "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz",
-          "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==",
-          "dev": true,
-          "requires": {
-            "string-width": "^4.2.0",
-            "strip-ansi": "^6.0.0",
-            "wrap-ansi": "^6.2.0"
-          }
-        },
         "color-convert": {
           "version": "2.0.1",
           "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
         "color-convert": {
           "version": "2.0.1",
           "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
           "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
           "dev": true
         },
           "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
           "dev": true
         },
-        "import-local": {
-          "version": "3.1.0",
-          "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.1.0.tgz",
-          "integrity": "sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg==",
+        "supports-color": {
+          "version": "7.2.0",
+          "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
+          "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
           "dev": true,
           "requires": {
           "dev": true,
           "requires": {
-            "pkg-dir": "^4.2.0",
-            "resolve-cwd": "^3.0.0"
+            "has-flag": "^4.0.0"
           }
           }
-        },
-        "is-ci": {
-          "version": "2.0.0",
-          "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-2.0.0.tgz",
-          "integrity": "sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w==",
+        }
+      }
+    },
+    "jest": {
+      "version": "28.1.3",
+      "resolved": "https://registry.npmjs.org/jest/-/jest-28.1.3.tgz",
+      "integrity": "sha512-N4GT5on8UkZgH0O5LUavMRV1EDEhNTL0KEfRmDIeZHSV7p2XgLoY9t9VDUgL6o+yfdgYHVxuz81G8oB9VG5uyA==",
+      "dev": true,
+      "requires": {
+        "@jest/core": "^28.1.3",
+        "@jest/types": "^28.1.3",
+        "import-local": "^3.0.2",
+        "jest-cli": "^28.1.3"
+      },
+      "dependencies": {
+        "ansi-styles": {
+          "version": "4.3.0",
+          "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
+          "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
           "dev": true,
           "requires": {
           "dev": true,
           "requires": {
-            "ci-info": "^2.0.0"
+            "color-convert": "^2.0.1"
           }
         },
           }
         },
-        "jest-cli": {
-          "version": "26.6.3",
-          "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-26.6.3.tgz",
-          "integrity": "sha512-GF9noBSa9t08pSyl3CY4frMrqp+aQXFGFkf5hEPbh/pIUFYWMK6ZLTfbmadxJVcJrdRoChlWQsA2VkJcDFK8hg==",
+        "chalk": {
+          "version": "4.1.2",
+          "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
+          "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
           "dev": true,
           "requires": {
           "dev": true,
           "requires": {
-            "@jest/core": "^26.6.3",
-            "@jest/test-result": "^26.6.2",
-            "@jest/types": "^26.6.2",
-            "chalk": "^4.0.0",
-            "exit": "^0.1.2",
-            "graceful-fs": "^4.2.4",
-            "import-local": "^3.0.2",
-            "is-ci": "^2.0.0",
-            "jest-config": "^26.6.3",
-            "jest-util": "^26.6.2",
-            "jest-validate": "^26.6.2",
-            "prompts": "^2.0.1",
-            "yargs": "^15.4.1"
+            "ansi-styles": "^4.1.0",
+            "supports-color": "^7.1.0"
           }
         },
           }
         },
-        "resolve-cwd": {
-          "version": "3.0.0",
-          "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz",
-          "integrity": "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==",
+        "color-convert": {
+          "version": "2.0.1",
+          "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
+          "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
           "dev": true,
           "requires": {
           "dev": true,
           "requires": {
-            "resolve-from": "^5.0.0"
+            "color-name": "~1.1.4"
           }
         },
           }
         },
-        "resolve-from": {
-          "version": "5.0.0",
-          "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz",
-          "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==",
+        "color-name": {
+          "version": "1.1.4",
+          "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
+          "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
           "dev": true
         },
           "dev": true
         },
-        "supports-color": {
-          "version": "7.2.0",
-          "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
-          "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
-          "dev": true,
-          "requires": {
-            "has-flag": "^4.0.0"
-          }
-        },
-        "wrap-ansi": {
-          "version": "6.2.0",
-          "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz",
-          "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==",
-          "dev": true,
-          "requires": {
-            "ansi-styles": "^4.0.0",
-            "string-width": "^4.1.0",
-            "strip-ansi": "^6.0.0"
-          }
-        },
-        "y18n": {
-          "version": "4.0.3",
-          "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz",
-          "integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==",
+        "has-flag": {
+          "version": "4.0.0",
+          "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
+          "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
           "dev": true
         },
           "dev": true
         },
-        "yargs": {
-          "version": "15.4.1",
-          "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.4.1.tgz",
-          "integrity": "sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==",
+        "jest-cli": {
+          "version": "28.1.3",
+          "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-28.1.3.tgz",
+          "integrity": "sha512-roY3kvrv57Azn1yPgdTebPAXvdR2xfezaKKYzVxZ6It/5NCxzJym6tUI5P1zkdWhfUYkxEI9uZWcQdaFLo8mJQ==",
           "dev": true,
           "requires": {
           "dev": true,
           "requires": {
-            "cliui": "^6.0.0",
-            "decamelize": "^1.2.0",
-            "find-up": "^4.1.0",
-            "get-caller-file": "^2.0.1",
-            "require-directory": "^2.1.1",
-            "require-main-filename": "^2.0.0",
-            "set-blocking": "^2.0.0",
-            "string-width": "^4.2.0",
-            "which-module": "^2.0.0",
-            "y18n": "^4.0.0",
-            "yargs-parser": "^18.1.2"
+            "@jest/core": "^28.1.3",
+            "@jest/test-result": "^28.1.3",
+            "@jest/types": "^28.1.3",
+            "chalk": "^4.0.0",
+            "exit": "^0.1.2",
+            "graceful-fs": "^4.2.9",
+            "import-local": "^3.0.2",
+            "jest-config": "^28.1.3",
+            "jest-util": "^28.1.3",
+            "jest-validate": "^28.1.3",
+            "prompts": "^2.0.1",
+            "yargs": "^17.3.1"
           }
         },
           }
         },
-        "yargs-parser": {
-          "version": "18.1.3",
-          "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz",
-          "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==",
+        "supports-color": {
+          "version": "7.2.0",
+          "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
+          "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
           "dev": true,
           "requires": {
           "dev": true,
           "requires": {
-            "camelcase": "^5.0.0",
-            "decamelize": "^1.2.0"
+            "has-flag": "^4.0.0"
           }
         }
       }
     },
     "jest-canvas-mock": {
           }
         }
       }
     },
     "jest-canvas-mock": {
-      "version": "2.3.0",
-      "resolved": "https://registry.npmjs.org/jest-canvas-mock/-/jest-canvas-mock-2.3.0.tgz",
-      "integrity": "sha512-3TMyR66VG2MzAW8Negzec03bbcIjVJMfGNvKzrEnbws1CYKqMNkvIJ8LbkoGYfp42tKqDmhIpQq3v+MNLW2A2w==",
+      "version": "2.4.0",
+      "resolved": "https://registry.npmjs.org/jest-canvas-mock/-/jest-canvas-mock-2.4.0.tgz",
+      "integrity": "sha512-mmMpZzpmLzn5vepIaHk5HoH3Ka4WykbSoLuG/EKoJd0x0ID/t+INo1l8ByfcUJuDM+RIsL4QDg/gDnBbrj2/IQ==",
       "dev": true,
       "requires": {
         "cssfontparser": "^1.2.1",
       "dev": true,
       "requires": {
         "cssfontparser": "^1.2.1",
       }
     },
     "jest-changed-files": {
       }
     },
     "jest-changed-files": {
-      "version": "26.6.2",
-      "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-26.6.2.tgz",
-      "integrity": "sha512-fDS7szLcY9sCtIip8Fjry9oGf3I2ht/QT21bAHm5Dmf0mD4X3ReNUf17y+bO6fR8WgbIZTlbyG1ak/53cbRzKQ==",
+      "version": "28.1.3",
+      "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-28.1.3.tgz",
+      "integrity": "sha512-esaOfUWJXk2nfZt9SPyC8gA1kNfdKLkQWyzsMlqq8msYSlNKfmZxfRgZn4Cd4MGVUF+7v6dBs0d5TOAKa7iIiA==",
       "dev": true,
       "requires": {
       "dev": true,
       "requires": {
-        "@jest/types": "^26.6.2",
-        "execa": "^4.0.0",
-        "throat": "^5.0.0"
+        "execa": "^5.0.0",
+        "p-limit": "^3.1.0"
       },
       "dependencies": {
       },
       "dependencies": {
-        "@jest/types": {
-          "version": "26.6.2",
-          "resolved": "https://registry.npmjs.org/@jest/types/-/types-26.6.2.tgz",
-          "integrity": "sha512-fC6QCp7Sc5sX6g8Tvbmj4XUTbyrik0akgRy03yjXbQaBWWNWGE7SGtJk98m0N8nzegD/7SggrUlivxo5ax4KWQ==",
-          "dev": true,
-          "requires": {
-            "@types/istanbul-lib-coverage": "^2.0.0",
-            "@types/istanbul-reports": "^3.0.0",
-            "@types/node": "*",
-            "@types/yargs": "^15.0.0",
-            "chalk": "^4.0.0"
-          }
-        },
-        "@types/istanbul-reports": {
-          "version": "3.0.1",
-          "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.1.tgz",
-          "integrity": "sha512-c3mAZEuK0lvBp8tmuL74XRKn1+y2dcwOUpH7x4WrF6gk1GIgiluDRgMYQtw2OFcBvAJWlt6ASU3tSqxp0Uu0Aw==",
+        "p-limit": {
+          "version": "3.1.0",
+          "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz",
+          "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==",
           "dev": true,
           "requires": {
           "dev": true,
           "requires": {
-            "@types/istanbul-lib-report": "*"
+            "yocto-queue": "^0.1.0"
           }
           }
-        },
+        }
+      }
+    },
+    "jest-circus": {
+      "version": "28.1.3",
+      "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-28.1.3.tgz",
+      "integrity": "sha512-cZ+eS5zc79MBwt+IhQhiEp0OeBddpc1n8MBo1nMB8A7oPMKEO+Sre+wHaLJexQUj9Ya/8NOBY0RESUgYjB6fow==",
+      "dev": true,
+      "requires": {
+        "@jest/environment": "^28.1.3",
+        "@jest/expect": "^28.1.3",
+        "@jest/test-result": "^28.1.3",
+        "@jest/types": "^28.1.3",
+        "@types/node": "*",
+        "chalk": "^4.0.0",
+        "co": "^4.6.0",
+        "dedent": "^0.7.0",
+        "is-generator-fn": "^2.0.0",
+        "jest-each": "^28.1.3",
+        "jest-matcher-utils": "^28.1.3",
+        "jest-message-util": "^28.1.3",
+        "jest-runtime": "^28.1.3",
+        "jest-snapshot": "^28.1.3",
+        "jest-util": "^28.1.3",
+        "p-limit": "^3.1.0",
+        "pretty-format": "^28.1.3",
+        "slash": "^3.0.0",
+        "stack-utils": "^2.0.3"
+      },
+      "dependencies": {
         "ansi-styles": {
           "version": "4.3.0",
           "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
         "ansi-styles": {
           "version": "4.3.0",
           "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
           "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
           "dev": true
         },
           "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
           "dev": true
         },
-        "cross-spawn": {
-          "version": "7.0.3",
-          "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz",
-          "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==",
-          "dev": true,
-          "requires": {
-            "path-key": "^3.1.0",
-            "shebang-command": "^2.0.0",
-            "which": "^2.0.1"
-          }
-        },
-        "execa": {
-          "version": "4.1.0",
-          "resolved": "https://registry.npmjs.org/execa/-/execa-4.1.0.tgz",
-          "integrity": "sha512-j5W0//W7f8UxAn8hXVnwG8tLwdiUy4FJLcSupCg6maBYZDpyBvTApK7KyuI4bKj8KOh1r2YH+6ucuYtJv1bTZA==",
-          "dev": true,
-          "requires": {
-            "cross-spawn": "^7.0.0",
-            "get-stream": "^5.0.0",
-            "human-signals": "^1.1.1",
-            "is-stream": "^2.0.0",
-            "merge-stream": "^2.0.0",
-            "npm-run-path": "^4.0.0",
-            "onetime": "^5.1.0",
-            "signal-exit": "^3.0.2",
-            "strip-final-newline": "^2.0.0"
-          }
-        },
-        "get-stream": {
-          "version": "5.2.0",
-          "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz",
-          "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==",
-          "dev": true,
-          "requires": {
-            "pump": "^3.0.0"
-          }
-        },
         "has-flag": {
           "version": "4.0.0",
           "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
           "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
           "dev": true
         },
         "has-flag": {
           "version": "4.0.0",
           "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
           "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
           "dev": true
         },
-        "is-stream": {
-          "version": "2.0.1",
-          "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz",
-          "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==",
-          "dev": true
-        },
-        "npm-run-path": {
-          "version": "4.0.1",
-          "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz",
-          "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==",
-          "dev": true,
-          "requires": {
-            "path-key": "^3.0.0"
-          }
-        },
-        "path-key": {
-          "version": "3.1.1",
-          "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz",
-          "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==",
-          "dev": true
-        },
-        "shebang-command": {
-          "version": "2.0.0",
-          "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz",
-          "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==",
+        "p-limit": {
+          "version": "3.1.0",
+          "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz",
+          "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==",
           "dev": true,
           "requires": {
           "dev": true,
           "requires": {
-            "shebang-regex": "^3.0.0"
+            "yocto-queue": "^0.1.0"
           }
         },
           }
         },
-        "shebang-regex": {
+        "slash": {
           "version": "3.0.0",
           "version": "3.0.0",
-          "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz",
-          "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==",
+          "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz",
+          "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==",
           "dev": true
         },
         "supports-color": {
           "dev": true
         },
         "supports-color": {
           "requires": {
             "has-flag": "^4.0.0"
           }
           "requires": {
             "has-flag": "^4.0.0"
           }
-        },
-        "which": {
-          "version": "2.0.2",
-          "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz",
-          "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==",
-          "dev": true,
-          "requires": {
-            "isexe": "^2.0.0"
-          }
         }
       }
     },
     "jest-config": {
         }
       }
     },
     "jest-config": {
-      "version": "26.6.3",
-      "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-26.6.3.tgz",
-      "integrity": "sha512-t5qdIj/bCj2j7NFVHb2nFB4aUdfucDn3JRKgrZnplb8nieAirAzRSHP8uDEd+qV6ygzg9Pz4YG7UTJf94LPSyg==",
+      "version": "28.1.3",
+      "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-28.1.3.tgz",
+      "integrity": "sha512-MG3INjByJ0J4AsNBm7T3hsuxKQqFIiRo/AUqb1q9LRKI5UU6Aar9JHbr9Ivn1TVwfUD9KirRoM/T6u8XlcQPHQ==",
       "dev": true,
       "requires": {
       "dev": true,
       "requires": {
-        "@babel/core": "^7.1.0",
-        "@jest/test-sequencer": "^26.6.3",
-        "@jest/types": "^26.6.2",
-        "babel-jest": "^26.6.3",
+        "@babel/core": "^7.11.6",
+        "@jest/test-sequencer": "^28.1.3",
+        "@jest/types": "^28.1.3",
+        "babel-jest": "^28.1.3",
         "chalk": "^4.0.0",
         "chalk": "^4.0.0",
+        "ci-info": "^3.2.0",
         "deepmerge": "^4.2.2",
         "deepmerge": "^4.2.2",
-        "glob": "^7.1.1",
-        "graceful-fs": "^4.2.4",
-        "jest-environment-jsdom": "^26.6.2",
-        "jest-environment-node": "^26.6.2",
-        "jest-get-type": "^26.3.0",
-        "jest-jasmine2": "^26.6.3",
-        "jest-regex-util": "^26.0.0",
-        "jest-resolve": "^26.6.2",
-        "jest-util": "^26.6.2",
-        "jest-validate": "^26.6.2",
-        "micromatch": "^4.0.2",
-        "pretty-format": "^26.6.2"
+        "glob": "^7.1.3",
+        "graceful-fs": "^4.2.9",
+        "jest-circus": "^28.1.3",
+        "jest-environment-node": "^28.1.3",
+        "jest-get-type": "^28.0.2",
+        "jest-regex-util": "^28.0.2",
+        "jest-resolve": "^28.1.3",
+        "jest-runner": "^28.1.3",
+        "jest-util": "^28.1.3",
+        "jest-validate": "^28.1.3",
+        "micromatch": "^4.0.4",
+        "parse-json": "^5.2.0",
+        "pretty-format": "^28.1.3",
+        "slash": "^3.0.0",
+        "strip-json-comments": "^3.1.1"
       },
       "dependencies": {
       },
       "dependencies": {
-        "@jest/types": {
-          "version": "26.6.2",
-          "resolved": "https://registry.npmjs.org/@jest/types/-/types-26.6.2.tgz",
-          "integrity": "sha512-fC6QCp7Sc5sX6g8Tvbmj4XUTbyrik0akgRy03yjXbQaBWWNWGE7SGtJk98m0N8nzegD/7SggrUlivxo5ax4KWQ==",
-          "dev": true,
-          "requires": {
-            "@types/istanbul-lib-coverage": "^2.0.0",
-            "@types/istanbul-reports": "^3.0.0",
-            "@types/node": "*",
-            "@types/yargs": "^15.0.0",
-            "chalk": "^4.0.0"
-          }
-        },
-        "@types/istanbul-reports": {
-          "version": "3.0.1",
-          "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.1.tgz",
-          "integrity": "sha512-c3mAZEuK0lvBp8tmuL74XRKn1+y2dcwOUpH7x4WrF6gk1GIgiluDRgMYQtw2OFcBvAJWlt6ASU3tSqxp0Uu0Aw==",
-          "dev": true,
-          "requires": {
-            "@types/istanbul-lib-report": "*"
-          }
-        },
         "ansi-styles": {
           "version": "4.3.0",
           "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
         "ansi-styles": {
           "version": "4.3.0",
           "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
           "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
           "dev": true
         },
           "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
           "dev": true
         },
-        "jest-get-type": {
-          "version": "26.3.0",
-          "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-26.3.0.tgz",
-          "integrity": "sha512-TpfaviN1R2pQWkIihlfEanwOXK0zcxrKEE4MlU6Tn7keoXdN6/3gK/xl0yEh8DOunn5pOVGKf8hB4R9gVh04ig==",
+        "slash": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz",
+          "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==",
           "dev": true
         },
           "dev": true
         },
-        "pretty-format": {
-          "version": "26.6.2",
-          "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-26.6.2.tgz",
-          "integrity": "sha512-7AeGuCYNGmycyQbCqd/3PWH4eOoX/OiCa0uphp57NVTeAGdJGaAliecxwBDHYQCIvrW7aDBZCYeNTP/WX69mkg==",
-          "dev": true,
-          "requires": {
-            "@jest/types": "^26.6.2",
-            "ansi-regex": "^5.0.0",
-            "ansi-styles": "^4.0.0",
-            "react-is": "^17.0.1"
-          }
-        },
-        "react-is": {
-          "version": "17.0.2",
-          "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz",
-          "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==",
+        "strip-json-comments": {
+          "version": "3.1.1",
+          "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz",
+          "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==",
           "dev": true
         },
         "supports-color": {
           "dev": true
         },
         "supports-color": {
       }
     },
     "jest-diff": {
       }
     },
     "jest-diff": {
-      "version": "25.5.0",
-      "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-25.5.0.tgz",
-      "integrity": "sha512-z1kygetuPiREYdNIumRpAHY6RXiGmp70YHptjdaxTWGmA085W3iCnXNx0DhflK3vwrKmrRWyY1wUpkPMVxMK7A==",
+      "version": "28.1.3",
+      "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-28.1.3.tgz",
+      "integrity": "sha512-8RqP1B/OXzjjTWkqMX67iqgwBVJRgCyKD3L9nq+6ZqJMdvjE8RgHktqZ6jNrkdMT+dJuYNI3rhQpxaz7drJHfw==",
       "dev": true,
       "requires": {
       "dev": true,
       "requires": {
-        "chalk": "^3.0.0",
-        "diff-sequences": "^25.2.6",
-        "jest-get-type": "^25.2.6",
-        "pretty-format": "^25.5.0"
+        "chalk": "^4.0.0",
+        "diff-sequences": "^28.1.1",
+        "jest-get-type": "^28.0.2",
+        "pretty-format": "^28.1.3"
       },
       "dependencies": {
         "ansi-styles": {
       },
       "dependencies": {
         "ansi-styles": {
           }
         },
         "chalk": {
           }
         },
         "chalk": {
-          "version": "3.0.0",
-          "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz",
-          "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==",
+          "version": "4.1.2",
+          "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
+          "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
           "dev": true,
           "requires": {
             "ansi-styles": "^4.1.0",
           "dev": true,
           "requires": {
             "ansi-styles": "^4.1.0",
       }
     },
     "jest-docblock": {
       }
     },
     "jest-docblock": {
-      "version": "26.0.0",
-      "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-26.0.0.tgz",
-      "integrity": "sha512-RDZ4Iz3QbtRWycd8bUEPxQsTlYazfYn/h5R65Fc6gOfwozFhoImx+affzky/FFBuqISPTqjXomoIGJVKBWoo0w==",
+      "version": "28.1.1",
+      "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-28.1.1.tgz",
+      "integrity": "sha512-3wayBVNiOYx0cwAbl9rwm5kKFP8yHH3d/fkEaL02NPTkDojPtheGB7HZSFY4wzX+DxyrvhXz0KSCVksmCknCuA==",
       "dev": true,
       "requires": {
         "detect-newline": "^3.0.0"
       }
     },
     "jest-each": {
       "dev": true,
       "requires": {
         "detect-newline": "^3.0.0"
       }
     },
     "jest-each": {
-      "version": "26.6.2",
-      "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-26.6.2.tgz",
-      "integrity": "sha512-Mer/f0KaATbjl8MCJ+0GEpNdqmnVmDYqCTJYTvoo7rqmRiDllmp2AYN+06F93nXcY3ur9ShIjS+CO/uD+BbH4A==",
+      "version": "28.1.3",
+      "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-28.1.3.tgz",
+      "integrity": "sha512-arT1z4sg2yABU5uogObVPvSlSMQlDA48owx07BDPAiasW0yYpYHYOo4HHLz9q0BVzDVU4hILFjzJw0So9aCL/g==",
       "dev": true,
       "requires": {
       "dev": true,
       "requires": {
-        "@jest/types": "^26.6.2",
+        "@jest/types": "^28.1.3",
         "chalk": "^4.0.0",
         "chalk": "^4.0.0",
-        "jest-get-type": "^26.3.0",
-        "jest-util": "^26.6.2",
-        "pretty-format": "^26.6.2"
+        "jest-get-type": "^28.0.2",
+        "jest-util": "^28.1.3",
+        "pretty-format": "^28.1.3"
       },
       "dependencies": {
       },
       "dependencies": {
-        "@jest/types": {
-          "version": "26.6.2",
-          "resolved": "https://registry.npmjs.org/@jest/types/-/types-26.6.2.tgz",
-          "integrity": "sha512-fC6QCp7Sc5sX6g8Tvbmj4XUTbyrik0akgRy03yjXbQaBWWNWGE7SGtJk98m0N8nzegD/7SggrUlivxo5ax4KWQ==",
-          "dev": true,
-          "requires": {
-            "@types/istanbul-lib-coverage": "^2.0.0",
-            "@types/istanbul-reports": "^3.0.0",
-            "@types/node": "*",
-            "@types/yargs": "^15.0.0",
-            "chalk": "^4.0.0"
-          }
-        },
-        "@types/istanbul-reports": {
-          "version": "3.0.1",
-          "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.1.tgz",
-          "integrity": "sha512-c3mAZEuK0lvBp8tmuL74XRKn1+y2dcwOUpH7x4WrF6gk1GIgiluDRgMYQtw2OFcBvAJWlt6ASU3tSqxp0Uu0Aw==",
-          "dev": true,
-          "requires": {
-            "@types/istanbul-lib-report": "*"
-          }
-        },
         "ansi-styles": {
           "version": "4.3.0",
           "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
         "ansi-styles": {
           "version": "4.3.0",
           "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
           "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
           "dev": true
         },
           "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
           "dev": true
         },
-        "jest-get-type": {
-          "version": "26.3.0",
-          "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-26.3.0.tgz",
-          "integrity": "sha512-TpfaviN1R2pQWkIihlfEanwOXK0zcxrKEE4MlU6Tn7keoXdN6/3gK/xl0yEh8DOunn5pOVGKf8hB4R9gVh04ig==",
-          "dev": true
-        },
-        "pretty-format": {
-          "version": "26.6.2",
-          "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-26.6.2.tgz",
-          "integrity": "sha512-7AeGuCYNGmycyQbCqd/3PWH4eOoX/OiCa0uphp57NVTeAGdJGaAliecxwBDHYQCIvrW7aDBZCYeNTP/WX69mkg==",
-          "dev": true,
-          "requires": {
-            "@jest/types": "^26.6.2",
-            "ansi-regex": "^5.0.0",
-            "ansi-styles": "^4.0.0",
-            "react-is": "^17.0.1"
-          }
-        },
-        "react-is": {
-          "version": "17.0.2",
-          "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz",
-          "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==",
-          "dev": true
-        },
         "supports-color": {
           "version": "7.2.0",
           "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
         "supports-color": {
           "version": "7.2.0",
           "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
       }
     },
     "jest-environment-jsdom": {
       }
     },
     "jest-environment-jsdom": {
-      "version": "26.6.2",
-      "resolved": "https://registry.npmjs.org/jest-environment-jsdom/-/jest-environment-jsdom-26.6.2.tgz",
-      "integrity": "sha512-jgPqCruTlt3Kwqg5/WVFyHIOJHsiAvhcp2qiR2QQstuG9yWox5+iHpU3ZrcBxW14T4fe5Z68jAfLRh7joCSP2Q==",
+      "version": "28.1.3",
+      "resolved": "https://registry.npmjs.org/jest-environment-jsdom/-/jest-environment-jsdom-28.1.3.tgz",
+      "integrity": "sha512-HnlGUmZRdxfCByd3GM2F100DgQOajUBzEitjGqIREcb45kGjZvRrKUdlaF6escXBdcXNl0OBh+1ZrfeZT3GnAg==",
+      "dev": true,
+      "requires": {
+        "@jest/environment": "^28.1.3",
+        "@jest/fake-timers": "^28.1.3",
+        "@jest/types": "^28.1.3",
+        "@types/jsdom": "^16.2.4",
+        "@types/node": "*",
+        "jest-mock": "^28.1.3",
+        "jest-util": "^28.1.3",
+        "jsdom": "^19.0.0"
+      }
+    },
+    "jest-environment-node": {
+      "version": "28.1.3",
+      "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-28.1.3.tgz",
+      "integrity": "sha512-ugP6XOhEpjAEhGYvp5Xj989ns5cB1K6ZdjBYuS30umT4CQEETaxSiPcZ/E1kFktX4GkrcM4qu07IIlDYX1gp+A==",
+      "dev": true,
+      "requires": {
+        "@jest/environment": "^28.1.3",
+        "@jest/fake-timers": "^28.1.3",
+        "@jest/types": "^28.1.3",
+        "@types/node": "*",
+        "jest-mock": "^28.1.3",
+        "jest-util": "^28.1.3"
+      }
+    },
+    "jest-get-type": {
+      "version": "28.0.2",
+      "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-28.0.2.tgz",
+      "integrity": "sha512-ioj2w9/DxSYHfOm5lJKCdcAmPJzQXmbM/Url3rhlghrPvT3tt+7a/+oXc9azkKmLvoiXjtV83bEWqi+vs5nlPA==",
+      "dev": true
+    },
+    "jest-haste-map": {
+      "version": "28.1.3",
+      "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-28.1.3.tgz",
+      "integrity": "sha512-3S+RQWDXccXDKSWnkHa/dPwt+2qwA8CJzR61w3FoYCvoo3Pn8tvGcysmMF0Bj0EX5RYvAI2EIvC57OmotfdtKA==",
       "dev": true,
       "requires": {
       "dev": true,
       "requires": {
-        "@jest/environment": "^26.6.2",
-        "@jest/fake-timers": "^26.6.2",
-        "@jest/types": "^26.6.2",
+        "@jest/types": "^28.1.3",
+        "@types/graceful-fs": "^4.1.3",
         "@types/node": "*",
         "@types/node": "*",
-        "jest-mock": "^26.6.2",
-        "jest-util": "^26.6.2",
-        "jsdom": "^16.4.0"
+        "anymatch": "^3.0.3",
+        "fb-watchman": "^2.0.0",
+        "fsevents": "^2.3.2",
+        "graceful-fs": "^4.2.9",
+        "jest-regex-util": "^28.0.2",
+        "jest-util": "^28.1.3",
+        "jest-worker": "^28.1.3",
+        "micromatch": "^4.0.4",
+        "walker": "^1.0.8"
       },
       "dependencies": {
       },
       "dependencies": {
-        "@jest/types": {
-          "version": "26.6.2",
-          "resolved": "https://registry.npmjs.org/@jest/types/-/types-26.6.2.tgz",
-          "integrity": "sha512-fC6QCp7Sc5sX6g8Tvbmj4XUTbyrik0akgRy03yjXbQaBWWNWGE7SGtJk98m0N8nzegD/7SggrUlivxo5ax4KWQ==",
+        "has-flag": {
+          "version": "4.0.0",
+          "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
+          "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+          "dev": true
+        },
+        "jest-worker": {
+          "version": "28.1.3",
+          "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-28.1.3.tgz",
+          "integrity": "sha512-CqRA220YV/6jCo8VWvAt1KKx6eek1VIHMPeLEbpcfSfkEeWyBNppynM/o6q+Wmw+sOhos2ml34wZbSX3G13//g==",
           "dev": true,
           "requires": {
           "dev": true,
           "requires": {
-            "@types/istanbul-lib-coverage": "^2.0.0",
-            "@types/istanbul-reports": "^3.0.0",
             "@types/node": "*",
             "@types/node": "*",
-            "@types/yargs": "^15.0.0",
-            "chalk": "^4.0.0"
+            "merge-stream": "^2.0.0",
+            "supports-color": "^8.0.0"
           }
         },
           }
         },
-        "@types/istanbul-reports": {
-          "version": "3.0.1",
-          "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.1.tgz",
-          "integrity": "sha512-c3mAZEuK0lvBp8tmuL74XRKn1+y2dcwOUpH7x4WrF6gk1GIgiluDRgMYQtw2OFcBvAJWlt6ASU3tSqxp0Uu0Aw==",
+        "supports-color": {
+          "version": "8.1.1",
+          "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz",
+          "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==",
           "dev": true,
           "requires": {
           "dev": true,
           "requires": {
-            "@types/istanbul-lib-report": "*"
+            "has-flag": "^4.0.0"
           }
           }
-        },
+        }
+      }
+    },
+    "jest-jasmine2": {
+      "version": "28.1.3",
+      "resolved": "https://registry.npmjs.org/jest-jasmine2/-/jest-jasmine2-28.1.3.tgz",
+      "integrity": "sha512-nlNWJY1u62w+WAVgnXOQTdxFdZhqlxpKvMTn1cOK1QHX2oRrkPV3JcIcJfXwcGcifttOJZhExcgDUqSHrYQ6Dw==",
+      "dev": true,
+      "requires": {
+        "@jest/environment": "^28.1.3",
+        "@jest/expect": "^28.1.3",
+        "@jest/source-map": "^28.1.2",
+        "@jest/test-result": "^28.1.3",
+        "@jest/types": "^28.1.3",
+        "@types/node": "*",
+        "chalk": "^4.0.0",
+        "co": "^4.6.0",
+        "is-generator-fn": "^2.0.0",
+        "jest-each": "^28.1.3",
+        "jest-matcher-utils": "^28.1.3",
+        "jest-message-util": "^28.1.3",
+        "jest-runtime": "^28.1.3",
+        "jest-snapshot": "^28.1.3",
+        "jest-util": "^28.1.3",
+        "p-limit": "^3.1.0",
+        "pretty-format": "^28.1.3"
+      },
+      "dependencies": {
         "ansi-styles": {
           "version": "4.3.0",
           "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
         "ansi-styles": {
           "version": "4.3.0",
           "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
           "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
           "dev": true
         },
           "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
           "dev": true
         },
+        "p-limit": {
+          "version": "3.1.0",
+          "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz",
+          "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==",
+          "dev": true,
+          "requires": {
+            "yocto-queue": "^0.1.0"
+          }
+        },
         "supports-color": {
           "version": "7.2.0",
           "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
         "supports-color": {
           "version": "7.2.0",
           "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
         }
       }
     },
         }
       }
     },
-    "jest-environment-node": {
-      "version": "26.6.2",
-      "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-26.6.2.tgz",
-      "integrity": "sha512-zhtMio3Exty18dy8ee8eJ9kjnRyZC1N4C1Nt/VShN1apyXc8rWGtJ9lI7vqiWcyyXS4BVSEn9lxAM2D+07/Tag==",
+    "jest-leak-detector": {
+      "version": "28.1.3",
+      "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-28.1.3.tgz",
+      "integrity": "sha512-WFVJhnQsiKtDEo5lG2mM0v40QWnBM+zMdHHyJs8AWZ7J0QZJS59MsyKeJHWhpBZBH32S48FOVvGyOFT1h0DlqA==",
       "dev": true,
       "requires": {
       "dev": true,
       "requires": {
-        "@jest/environment": "^26.6.2",
-        "@jest/fake-timers": "^26.6.2",
-        "@jest/types": "^26.6.2",
-        "@types/node": "*",
-        "jest-mock": "^26.6.2",
-        "jest-util": "^26.6.2"
+        "jest-get-type": "^28.0.2",
+        "pretty-format": "^28.1.3"
+      }
+    },
+    "jest-matcher-utils": {
+      "version": "28.1.3",
+      "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-28.1.3.tgz",
+      "integrity": "sha512-kQeJ7qHemKfbzKoGjHHrRKH6atgxMk8Enkk2iPQ3XwO6oE/KYD8lMYOziCkeSB9G4adPM4nR1DE8Tf5JeWH6Bw==",
+      "dev": true,
+      "requires": {
+        "chalk": "^4.0.0",
+        "jest-diff": "^28.1.3",
+        "jest-get-type": "^28.0.2",
+        "pretty-format": "^28.1.3"
       },
       "dependencies": {
       },
       "dependencies": {
-        "@jest/types": {
-          "version": "26.6.2",
-          "resolved": "https://registry.npmjs.org/@jest/types/-/types-26.6.2.tgz",
-          "integrity": "sha512-fC6QCp7Sc5sX6g8Tvbmj4XUTbyrik0akgRy03yjXbQaBWWNWGE7SGtJk98m0N8nzegD/7SggrUlivxo5ax4KWQ==",
-          "dev": true,
-          "requires": {
-            "@types/istanbul-lib-coverage": "^2.0.0",
-            "@types/istanbul-reports": "^3.0.0",
-            "@types/node": "*",
-            "@types/yargs": "^15.0.0",
-            "chalk": "^4.0.0"
-          }
-        },
-        "@types/istanbul-reports": {
-          "version": "3.0.1",
-          "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.1.tgz",
-          "integrity": "sha512-c3mAZEuK0lvBp8tmuL74XRKn1+y2dcwOUpH7x4WrF6gk1GIgiluDRgMYQtw2OFcBvAJWlt6ASU3tSqxp0Uu0Aw==",
-          "dev": true,
-          "requires": {
-            "@types/istanbul-lib-report": "*"
-          }
-        },
         "ansi-styles": {
           "version": "4.3.0",
           "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
         "ansi-styles": {
           "version": "4.3.0",
           "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
         }
       }
     },
         }
       }
     },
-    "jest-get-type": {
-      "version": "25.2.6",
-      "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-25.2.6.tgz",
-      "integrity": "sha512-DxjtyzOHjObRM+sM1knti6or+eOgcGU4xVSb2HNP1TqO4ahsT+rqZg+nyqHWJSvWgKC5cG3QjGFBqxLghiF/Ig==",
-      "dev": true
-    },
-    "jest-haste-map": {
-      "version": "26.6.2",
-      "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-26.6.2.tgz",
-      "integrity": "sha512-easWIJXIw71B2RdR8kgqpjQrbMRWQBgiBwXYEhtGUTaX+doCjBheluShdDMeR8IMfJiTqH4+zfhtg29apJf/8w==",
+    "jest-message-util": {
+      "version": "28.1.3",
+      "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-28.1.3.tgz",
+      "integrity": "sha512-PFdn9Iewbt575zKPf1286Ht9EPoJmYT7P0kY+RibeYZ2XtOr53pDLEFoTWXbd1h4JiGiWpTBC84fc8xMXQMb7g==",
       "dev": true,
       "requires": {
       "dev": true,
       "requires": {
-        "@jest/types": "^26.6.2",
-        "@types/graceful-fs": "^4.1.2",
-        "@types/node": "*",
-        "anymatch": "^3.0.3",
-        "fb-watchman": "^2.0.0",
-        "fsevents": "^2.1.2",
-        "graceful-fs": "^4.2.4",
-        "jest-regex-util": "^26.0.0",
-        "jest-serializer": "^26.6.2",
-        "jest-util": "^26.6.2",
-        "jest-worker": "^26.6.2",
-        "micromatch": "^4.0.2",
-        "sane": "^4.0.3",
-        "walker": "^1.0.7"
+        "@babel/code-frame": "^7.12.13",
+        "@jest/types": "^28.1.3",
+        "@types/stack-utils": "^2.0.0",
+        "chalk": "^4.0.0",
+        "graceful-fs": "^4.2.9",
+        "micromatch": "^4.0.4",
+        "pretty-format": "^28.1.3",
+        "slash": "^3.0.0",
+        "stack-utils": "^2.0.3"
       },
       "dependencies": {
       },
       "dependencies": {
-        "@jest/types": {
-          "version": "26.6.2",
-          "resolved": "https://registry.npmjs.org/@jest/types/-/types-26.6.2.tgz",
-          "integrity": "sha512-fC6QCp7Sc5sX6g8Tvbmj4XUTbyrik0akgRy03yjXbQaBWWNWGE7SGtJk98m0N8nzegD/7SggrUlivxo5ax4KWQ==",
-          "dev": true,
-          "requires": {
-            "@types/istanbul-lib-coverage": "^2.0.0",
-            "@types/istanbul-reports": "^3.0.0",
-            "@types/node": "*",
-            "@types/yargs": "^15.0.0",
-            "chalk": "^4.0.0"
-          }
-        },
-        "@types/istanbul-reports": {
-          "version": "3.0.1",
-          "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.1.tgz",
-          "integrity": "sha512-c3mAZEuK0lvBp8tmuL74XRKn1+y2dcwOUpH7x4WrF6gk1GIgiluDRgMYQtw2OFcBvAJWlt6ASU3tSqxp0Uu0Aw==",
-          "dev": true,
-          "requires": {
-            "@types/istanbul-lib-report": "*"
-          }
-        },
         "ansi-styles": {
           "version": "4.3.0",
           "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
         "ansi-styles": {
           "version": "4.3.0",
           "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
           "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
           "dev": true
         },
           "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
           "dev": true
         },
-        "jest-worker": {
-          "version": "26.6.2",
-          "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-26.6.2.tgz",
-          "integrity": "sha512-KWYVV1c4i+jbMpaBC+U++4Va0cp8OisU185o73T1vo99hqi7w8tSJfUXYswwqqrjzwxa6KpRK54WhPvwf5w6PQ==",
-          "dev": true,
-          "requires": {
-            "@types/node": "*",
-            "merge-stream": "^2.0.0",
-            "supports-color": "^7.0.0"
-          }
+        "slash": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz",
+          "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==",
+          "dev": true
         },
         "supports-color": {
           "version": "7.2.0",
         },
         "supports-color": {
           "version": "7.2.0",
         }
       }
     },
         }
       }
     },
-    "jest-jasmine2": {
-      "version": "26.6.3",
-      "resolved": "https://registry.npmjs.org/jest-jasmine2/-/jest-jasmine2-26.6.3.tgz",
-      "integrity": "sha512-kPKUrQtc8aYwBV7CqBg5pu+tmYXlvFlSFYn18ev4gPFtrRzB15N2gW/Roew3187q2w2eHuu0MU9TJz6w0/nPEg==",
+    "jest-mock": {
+      "version": "28.1.3",
+      "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-28.1.3.tgz",
+      "integrity": "sha512-o3J2jr6dMMWYVH4Lh/NKmDXdosrsJgi4AviS8oXLujcjpCMBb1FMsblDnOXKZKfSiHLxYub1eS0IHuRXsio9eA==",
       "dev": true,
       "requires": {
       "dev": true,
       "requires": {
-        "@babel/traverse": "^7.1.0",
-        "@jest/environment": "^26.6.2",
-        "@jest/source-map": "^26.6.2",
-        "@jest/test-result": "^26.6.2",
-        "@jest/types": "^26.6.2",
-        "@types/node": "*",
-        "chalk": "^4.0.0",
-        "co": "^4.6.0",
-        "expect": "^26.6.2",
-        "is-generator-fn": "^2.0.0",
-        "jest-each": "^26.6.2",
-        "jest-matcher-utils": "^26.6.2",
-        "jest-message-util": "^26.6.2",
-        "jest-runtime": "^26.6.3",
-        "jest-snapshot": "^26.6.2",
-        "jest-util": "^26.6.2",
-        "pretty-format": "^26.6.2",
-        "throat": "^5.0.0"
+        "@jest/types": "^28.1.3",
+        "@types/node": "*"
+      }
+    },
+    "jest-pnp-resolver": {
+      "version": "1.2.3",
+      "resolved": "https://registry.npmjs.org/jest-pnp-resolver/-/jest-pnp-resolver-1.2.3.tgz",
+      "integrity": "sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w==",
+      "dev": true
+    },
+    "jest-preset-angular": {
+      "version": "12.0.0",
+      "resolved": "https://registry.npmjs.org/jest-preset-angular/-/jest-preset-angular-12.0.0.tgz",
+      "integrity": "sha512-xJmnvilwMo0+4QV3xfYLxhVW+nrmH6oTa0yUlR0LCgIYNavwR9rPkHnpeXRszFRXOqQu7th2weYOAsXSj38pNg==",
+      "dev": true,
+      "requires": {
+        "bs-logger": "^0.2.6",
+        "esbuild": ">=0.13.8",
+        "esbuild-wasm": ">=0.13.8",
+        "jest-environment-jsdom": "^28.0.0",
+        "pretty-format": "^28.0.0",
+        "ts-jest": "^28.0.0"
       },
       "dependencies": {
       },
       "dependencies": {
-        "@jest/types": {
-          "version": "26.6.2",
-          "resolved": "https://registry.npmjs.org/@jest/types/-/types-26.6.2.tgz",
-          "integrity": "sha512-fC6QCp7Sc5sX6g8Tvbmj4XUTbyrik0akgRy03yjXbQaBWWNWGE7SGtJk98m0N8nzegD/7SggrUlivxo5ax4KWQ==",
-          "dev": true,
-          "requires": {
-            "@types/istanbul-lib-coverage": "^2.0.0",
-            "@types/istanbul-reports": "^3.0.0",
-            "@types/node": "*",
-            "@types/yargs": "^15.0.0",
-            "chalk": "^4.0.0"
-          }
-        },
-        "@types/istanbul-reports": {
-          "version": "3.0.1",
-          "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.1.tgz",
-          "integrity": "sha512-c3mAZEuK0lvBp8tmuL74XRKn1+y2dcwOUpH7x4WrF6gk1GIgiluDRgMYQtw2OFcBvAJWlt6ASU3tSqxp0Uu0Aw==",
+        "esbuild": {
+          "version": "0.17.11",
+          "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.17.11.tgz",
+          "integrity": "sha512-pAMImyokbWDtnA/ufPxjQg0fYo2DDuzAlqwnDvbXqHLphe+m80eF++perYKVm8LeTuj2zUuFXC+xgSVxyoHUdg==",
           "dev": true,
           "dev": true,
+          "optional": true,
           "requires": {
           "requires": {
-            "@types/istanbul-lib-report": "*"
+            "@esbuild/android-arm": "0.17.11",
+            "@esbuild/android-arm64": "0.17.11",
+            "@esbuild/android-x64": "0.17.11",
+            "@esbuild/darwin-arm64": "0.17.11",
+            "@esbuild/darwin-x64": "0.17.11",
+            "@esbuild/freebsd-arm64": "0.17.11",
+            "@esbuild/freebsd-x64": "0.17.11",
+            "@esbuild/linux-arm": "0.17.11",
+            "@esbuild/linux-arm64": "0.17.11",
+            "@esbuild/linux-ia32": "0.17.11",
+            "@esbuild/linux-loong64": "0.17.11",
+            "@esbuild/linux-mips64el": "0.17.11",
+            "@esbuild/linux-ppc64": "0.17.11",
+            "@esbuild/linux-riscv64": "0.17.11",
+            "@esbuild/linux-s390x": "0.17.11",
+            "@esbuild/linux-x64": "0.17.11",
+            "@esbuild/netbsd-x64": "0.17.11",
+            "@esbuild/openbsd-x64": "0.17.11",
+            "@esbuild/sunos-x64": "0.17.11",
+            "@esbuild/win32-arm64": "0.17.11",
+            "@esbuild/win32-ia32": "0.17.11",
+            "@esbuild/win32-x64": "0.17.11"
           }
           }
-        },
+        }
+      }
+    },
+    "jest-regex-util": {
+      "version": "28.0.2",
+      "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-28.0.2.tgz",
+      "integrity": "sha512-4s0IgyNIy0y9FK+cjoVYoxamT7Zeo7MhzqRGx7YDYmaQn1wucY9rotiGkBzzcMXTtjrCAP/f7f+E0F7+fxPNdw==",
+      "dev": true
+    },
+    "jest-resolve": {
+      "version": "28.1.3",
+      "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-28.1.3.tgz",
+      "integrity": "sha512-Z1W3tTjE6QaNI90qo/BJpfnvpxtaFTFw5CDgwpyE/Kz8U/06N1Hjf4ia9quUhCh39qIGWF1ZuxFiBiJQwSEYKQ==",
+      "dev": true,
+      "requires": {
+        "chalk": "^4.0.0",
+        "graceful-fs": "^4.2.9",
+        "jest-haste-map": "^28.1.3",
+        "jest-pnp-resolver": "^1.2.2",
+        "jest-util": "^28.1.3",
+        "jest-validate": "^28.1.3",
+        "resolve": "^1.20.0",
+        "resolve.exports": "^1.1.0",
+        "slash": "^3.0.0"
+      },
+      "dependencies": {
         "ansi-styles": {
           "version": "4.3.0",
           "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
         "ansi-styles": {
           "version": "4.3.0",
           "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
           "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
           "dev": true
         },
           "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
           "dev": true
         },
-        "pretty-format": {
-          "version": "26.6.2",
-          "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-26.6.2.tgz",
-          "integrity": "sha512-7AeGuCYNGmycyQbCqd/3PWH4eOoX/OiCa0uphp57NVTeAGdJGaAliecxwBDHYQCIvrW7aDBZCYeNTP/WX69mkg==",
-          "dev": true,
-          "requires": {
-            "@jest/types": "^26.6.2",
-            "ansi-regex": "^5.0.0",
-            "ansi-styles": "^4.0.0",
-            "react-is": "^17.0.1"
-          }
-        },
-        "react-is": {
-          "version": "17.0.2",
-          "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz",
-          "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==",
+        "slash": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz",
+          "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==",
           "dev": true
         },
         "supports-color": {
           "dev": true
         },
         "supports-color": {
         }
       }
     },
         }
       }
     },
-    "jest-leak-detector": {
-      "version": "26.6.2",
-      "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-26.6.2.tgz",
-      "integrity": "sha512-i4xlXpsVSMeKvg2cEKdfhh0H39qlJlP5Ex1yQxwF9ubahboQYMgTtz5oML35AVA3B4Eu+YsmwaiKVev9KCvLxg==",
+    "jest-resolve-dependencies": {
+      "version": "28.1.3",
+      "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-28.1.3.tgz",
+      "integrity": "sha512-qa0QO2Q0XzQoNPouMbCc7Bvtsem8eQgVPNkwn9LnS+R2n8DaVDPL/U1gngC0LTl1RYXJU0uJa2BMC2DbTfFrHA==",
+      "dev": true,
+      "requires": {
+        "jest-regex-util": "^28.0.2",
+        "jest-snapshot": "^28.1.3"
+      }
+    },
+    "jest-runner": {
+      "version": "28.1.3",
+      "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-28.1.3.tgz",
+      "integrity": "sha512-GkMw4D/0USd62OVO0oEgjn23TM+YJa2U2Wu5zz9xsQB1MxWKDOlrnykPxnMsN0tnJllfLPinHTka61u0QhaxBA==",
       "dev": true,
       "requires": {
       "dev": true,
       "requires": {
-        "jest-get-type": "^26.3.0",
-        "pretty-format": "^26.6.2"
+        "@jest/console": "^28.1.3",
+        "@jest/environment": "^28.1.3",
+        "@jest/test-result": "^28.1.3",
+        "@jest/transform": "^28.1.3",
+        "@jest/types": "^28.1.3",
+        "@types/node": "*",
+        "chalk": "^4.0.0",
+        "emittery": "^0.10.2",
+        "graceful-fs": "^4.2.9",
+        "jest-docblock": "^28.1.1",
+        "jest-environment-node": "^28.1.3",
+        "jest-haste-map": "^28.1.3",
+        "jest-leak-detector": "^28.1.3",
+        "jest-message-util": "^28.1.3",
+        "jest-resolve": "^28.1.3",
+        "jest-runtime": "^28.1.3",
+        "jest-util": "^28.1.3",
+        "jest-watcher": "^28.1.3",
+        "jest-worker": "^28.1.3",
+        "p-limit": "^3.1.0",
+        "source-map-support": "0.5.13"
       },
       "dependencies": {
       },
       "dependencies": {
-        "@jest/types": {
-          "version": "26.6.2",
-          "resolved": "https://registry.npmjs.org/@jest/types/-/types-26.6.2.tgz",
-          "integrity": "sha512-fC6QCp7Sc5sX6g8Tvbmj4XUTbyrik0akgRy03yjXbQaBWWNWGE7SGtJk98m0N8nzegD/7SggrUlivxo5ax4KWQ==",
-          "dev": true,
-          "requires": {
-            "@types/istanbul-lib-coverage": "^2.0.0",
-            "@types/istanbul-reports": "^3.0.0",
-            "@types/node": "*",
-            "@types/yargs": "^15.0.0",
-            "chalk": "^4.0.0"
-          }
-        },
-        "@types/istanbul-reports": {
-          "version": "3.0.1",
-          "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.1.tgz",
-          "integrity": "sha512-c3mAZEuK0lvBp8tmuL74XRKn1+y2dcwOUpH7x4WrF6gk1GIgiluDRgMYQtw2OFcBvAJWlt6ASU3tSqxp0Uu0Aw==",
-          "dev": true,
-          "requires": {
-            "@types/istanbul-lib-report": "*"
-          }
-        },
-        "ansi-styles": {
-          "version": "4.3.0",
-          "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
-          "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+        "ansi-styles": {
+          "version": "4.3.0",
+          "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
+          "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
           "dev": true,
           "requires": {
             "color-convert": "^2.0.1"
           "dev": true,
           "requires": {
             "color-convert": "^2.0.1"
           "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
           "dev": true
         },
           "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
           "dev": true
         },
-        "jest-get-type": {
-          "version": "26.3.0",
-          "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-26.3.0.tgz",
-          "integrity": "sha512-TpfaviN1R2pQWkIihlfEanwOXK0zcxrKEE4MlU6Tn7keoXdN6/3gK/xl0yEh8DOunn5pOVGKf8hB4R9gVh04ig==",
-          "dev": true
+        "jest-worker": {
+          "version": "28.1.3",
+          "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-28.1.3.tgz",
+          "integrity": "sha512-CqRA220YV/6jCo8VWvAt1KKx6eek1VIHMPeLEbpcfSfkEeWyBNppynM/o6q+Wmw+sOhos2ml34wZbSX3G13//g==",
+          "dev": true,
+          "requires": {
+            "@types/node": "*",
+            "merge-stream": "^2.0.0",
+            "supports-color": "^8.0.0"
+          },
+          "dependencies": {
+            "supports-color": {
+              "version": "8.1.1",
+              "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz",
+              "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==",
+              "dev": true,
+              "requires": {
+                "has-flag": "^4.0.0"
+              }
+            }
+          }
         },
         },
-        "pretty-format": {
-          "version": "26.6.2",
-          "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-26.6.2.tgz",
-          "integrity": "sha512-7AeGuCYNGmycyQbCqd/3PWH4eOoX/OiCa0uphp57NVTeAGdJGaAliecxwBDHYQCIvrW7aDBZCYeNTP/WX69mkg==",
+        "p-limit": {
+          "version": "3.1.0",
+          "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz",
+          "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==",
           "dev": true,
           "requires": {
           "dev": true,
           "requires": {
-            "@jest/types": "^26.6.2",
-            "ansi-regex": "^5.0.0",
-            "ansi-styles": "^4.0.0",
-            "react-is": "^17.0.1"
+            "yocto-queue": "^0.1.0"
           }
         },
           }
         },
-        "react-is": {
-          "version": "17.0.2",
-          "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz",
-          "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==",
+        "source-map": {
+          "version": "0.6.1",
+          "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+          "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
           "dev": true
         },
           "dev": true
         },
+        "source-map-support": {
+          "version": "0.5.13",
+          "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.13.tgz",
+          "integrity": "sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w==",
+          "dev": true,
+          "requires": {
+            "buffer-from": "^1.0.0",
+            "source-map": "^0.6.0"
+          }
+        },
         "supports-color": {
           "version": "7.2.0",
           "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
         "supports-color": {
           "version": "7.2.0",
           "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
         }
       }
     },
         }
       }
     },
-    "jest-matcher-utils": {
-      "version": "26.6.2",
-      "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-26.6.2.tgz",
-      "integrity": "sha512-llnc8vQgYcNqDrqRDXWwMr9i7rS5XFiCwvh6DTP7Jqa2mqpcCBBlpCbn+trkG0KNhPu/h8rzyBkriOtBstvWhw==",
-      "dev": true,
-      "requires": {
+    "jest-runtime": {
+      "version": "28.1.3",
+      "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-28.1.3.tgz",
+      "integrity": "sha512-NU+881ScBQQLc1JHG5eJGU7Ui3kLKrmwCPPtYsJtBykixrM2OhVQlpMmFWJjMyDfdkGgBMNjXCGB/ebzsgNGQw==",
+      "dev": true,
+      "requires": {
+        "@jest/environment": "^28.1.3",
+        "@jest/fake-timers": "^28.1.3",
+        "@jest/globals": "^28.1.3",
+        "@jest/source-map": "^28.1.2",
+        "@jest/test-result": "^28.1.3",
+        "@jest/transform": "^28.1.3",
+        "@jest/types": "^28.1.3",
         "chalk": "^4.0.0",
         "chalk": "^4.0.0",
-        "jest-diff": "^26.6.2",
-        "jest-get-type": "^26.3.0",
-        "pretty-format": "^26.6.2"
+        "cjs-module-lexer": "^1.0.0",
+        "collect-v8-coverage": "^1.0.0",
+        "execa": "^5.0.0",
+        "glob": "^7.1.3",
+        "graceful-fs": "^4.2.9",
+        "jest-haste-map": "^28.1.3",
+        "jest-message-util": "^28.1.3",
+        "jest-mock": "^28.1.3",
+        "jest-regex-util": "^28.0.2",
+        "jest-resolve": "^28.1.3",
+        "jest-snapshot": "^28.1.3",
+        "jest-util": "^28.1.3",
+        "slash": "^3.0.0",
+        "strip-bom": "^4.0.0"
       },
       "dependencies": {
       },
       "dependencies": {
-        "@jest/types": {
-          "version": "26.6.2",
-          "resolved": "https://registry.npmjs.org/@jest/types/-/types-26.6.2.tgz",
-          "integrity": "sha512-fC6QCp7Sc5sX6g8Tvbmj4XUTbyrik0akgRy03yjXbQaBWWNWGE7SGtJk98m0N8nzegD/7SggrUlivxo5ax4KWQ==",
-          "dev": true,
-          "requires": {
-            "@types/istanbul-lib-coverage": "^2.0.0",
-            "@types/istanbul-reports": "^3.0.0",
-            "@types/node": "*",
-            "@types/yargs": "^15.0.0",
-            "chalk": "^4.0.0"
-          }
-        },
-        "@types/istanbul-reports": {
-          "version": "3.0.1",
-          "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.1.tgz",
-          "integrity": "sha512-c3mAZEuK0lvBp8tmuL74XRKn1+y2dcwOUpH7x4WrF6gk1GIgiluDRgMYQtw2OFcBvAJWlt6ASU3tSqxp0Uu0Aw==",
-          "dev": true,
-          "requires": {
-            "@types/istanbul-lib-report": "*"
-          }
-        },
         "ansi-styles": {
           "version": "4.3.0",
           "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
         "ansi-styles": {
           "version": "4.3.0",
           "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
           "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
           "dev": true
         },
           "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
           "dev": true
         },
-        "diff-sequences": {
-          "version": "26.6.2",
-          "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-26.6.2.tgz",
-          "integrity": "sha512-Mv/TDa3nZ9sbc5soK+OoA74BsS3mL37yixCvUAQkiuA4Wz6YtwP/K47n2rv2ovzHZvoiQeA5FTQOschKkEwB0Q==",
-          "dev": true
-        },
         "has-flag": {
           "version": "4.0.0",
           "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
           "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
           "dev": true
         },
         "has-flag": {
           "version": "4.0.0",
           "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
           "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
           "dev": true
         },
-        "jest-diff": {
-          "version": "26.6.2",
-          "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-26.6.2.tgz",
-          "integrity": "sha512-6m+9Z3Gv9wN0WFVasqjCL/06+EFCMTqDEUl/b87HYK2rAPTyfz4ZIuSlPhY51PIQRWx5TaxeF1qmXKe9gfN3sA==",
-          "dev": true,
-          "requires": {
-            "chalk": "^4.0.0",
-            "diff-sequences": "^26.6.2",
-            "jest-get-type": "^26.3.0",
-            "pretty-format": "^26.6.2"
-          }
-        },
-        "jest-get-type": {
-          "version": "26.3.0",
-          "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-26.3.0.tgz",
-          "integrity": "sha512-TpfaviN1R2pQWkIihlfEanwOXK0zcxrKEE4MlU6Tn7keoXdN6/3gK/xl0yEh8DOunn5pOVGKf8hB4R9gVh04ig==",
+        "slash": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz",
+          "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==",
           "dev": true
         },
           "dev": true
         },
-        "pretty-format": {
-          "version": "26.6.2",
-          "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-26.6.2.tgz",
-          "integrity": "sha512-7AeGuCYNGmycyQbCqd/3PWH4eOoX/OiCa0uphp57NVTeAGdJGaAliecxwBDHYQCIvrW7aDBZCYeNTP/WX69mkg==",
-          "dev": true,
-          "requires": {
-            "@jest/types": "^26.6.2",
-            "ansi-regex": "^5.0.0",
-            "ansi-styles": "^4.0.0",
-            "react-is": "^17.0.1"
-          }
-        },
-        "react-is": {
-          "version": "17.0.2",
-          "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz",
-          "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==",
+        "strip-bom": {
+          "version": "4.0.0",
+          "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz",
+          "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==",
           "dev": true
         },
         "supports-color": {
           "dev": true
         },
         "supports-color": {
         }
       }
     },
         }
       }
     },
-    "jest-message-util": {
-      "version": "26.6.2",
-      "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-26.6.2.tgz",
-      "integrity": "sha512-rGiLePzQ3AzwUshu2+Rn+UMFk0pHN58sOG+IaJbk5Jxuqo3NYO1U2/MIR4S1sKgsoYSXSzdtSa0TgrmtUwEbmA==",
+    "jest-silent-reporter": {
+      "version": "0.5.0",
+      "resolved": "https://registry.npmjs.org/jest-silent-reporter/-/jest-silent-reporter-0.5.0.tgz",
+      "integrity": "sha512-epdLt8Oj0a1AyRiR6F8zx/1SVT1Mi7VU3y4wB2uOBHs/ohIquC7v2eeja7UN54uRPyHInIKWdL+RdG228n5pJQ==",
       "dev": true,
       "requires": {
       "dev": true,
       "requires": {
-        "@babel/code-frame": "^7.0.0",
-        "@jest/types": "^26.6.2",
-        "@types/stack-utils": "^2.0.0",
         "chalk": "^4.0.0",
         "chalk": "^4.0.0",
-        "graceful-fs": "^4.2.4",
-        "micromatch": "^4.0.2",
-        "pretty-format": "^26.6.2",
-        "slash": "^3.0.0",
-        "stack-utils": "^2.0.2"
+        "jest-util": "^26.0.0"
       },
       "dependencies": {
         "@jest/types": {
       },
       "dependencies": {
         "@jest/types": {
             "chalk": "^4.0.0"
           }
         },
             "chalk": "^4.0.0"
           }
         },
-        "@types/istanbul-reports": {
-          "version": "3.0.1",
-          "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.1.tgz",
-          "integrity": "sha512-c3mAZEuK0lvBp8tmuL74XRKn1+y2dcwOUpH7x4WrF6gk1GIgiluDRgMYQtw2OFcBvAJWlt6ASU3tSqxp0Uu0Aw==",
+        "@types/yargs": {
+          "version": "15.0.15",
+          "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-15.0.15.tgz",
+          "integrity": "sha512-IziEYMU9XoVj8hWg7k+UJrXALkGFjWJhn5QFEv9q4p+v40oZhSuC135M38st8XPjICL7Ey4TV64ferBGUoJhBg==",
           "dev": true,
           "requires": {
           "dev": true,
           "requires": {
-            "@types/istanbul-lib-report": "*"
+            "@types/yargs-parser": "*"
           }
         },
         "ansi-styles": {
           }
         },
         "ansi-styles": {
             "supports-color": "^7.1.0"
           }
         },
             "supports-color": "^7.1.0"
           }
         },
+        "ci-info": {
+          "version": "2.0.0",
+          "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz",
+          "integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==",
+          "dev": true
+        },
         "color-convert": {
           "version": "2.0.1",
           "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
         "color-convert": {
           "version": "2.0.1",
           "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
           "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
           "dev": true
         },
           "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
           "dev": true
         },
-        "pretty-format": {
+        "is-ci": {
+          "version": "2.0.0",
+          "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-2.0.0.tgz",
+          "integrity": "sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w==",
+          "dev": true,
+          "requires": {
+            "ci-info": "^2.0.0"
+          }
+        },
+        "jest-util": {
           "version": "26.6.2",
           "version": "26.6.2",
-          "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-26.6.2.tgz",
-          "integrity": "sha512-7AeGuCYNGmycyQbCqd/3PWH4eOoX/OiCa0uphp57NVTeAGdJGaAliecxwBDHYQCIvrW7aDBZCYeNTP/WX69mkg==",
+          "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-26.6.2.tgz",
+          "integrity": "sha512-MDW0fKfsn0OI7MS7Euz6h8HNDXVQ0gaM9uW6RjfDmd1DAFcaxX9OqIakHIqhbnmF08Cf2DLDG+ulq8YQQ0Lp0Q==",
           "dev": true,
           "requires": {
             "@jest/types": "^26.6.2",
           "dev": true,
           "requires": {
             "@jest/types": "^26.6.2",
-            "ansi-regex": "^5.0.0",
-            "ansi-styles": "^4.0.0",
-            "react-is": "^17.0.1"
+            "@types/node": "*",
+            "chalk": "^4.0.0",
+            "graceful-fs": "^4.2.4",
+            "is-ci": "^2.0.0",
+            "micromatch": "^4.0.2"
           }
         },
           }
         },
-        "react-is": {
-          "version": "17.0.2",
-          "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz",
-          "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==",
-          "dev": true
-        },
         "supports-color": {
           "version": "7.2.0",
           "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
         "supports-color": {
           "version": "7.2.0",
           "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
         }
       }
     },
         }
       }
     },
-    "jest-mock": {
-      "version": "26.6.2",
-      "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-26.6.2.tgz",
-      "integrity": "sha512-YyFjePHHp1LzpzYcmgqkJ0nm0gg/lJx2aZFzFy1S6eUqNjXsOqTK10zNRff2dNfssgokjkG65OlWNcIlgd3zew==",
+    "jest-snapshot": {
+      "version": "28.1.3",
+      "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-28.1.3.tgz",
+      "integrity": "sha512-4lzMgtiNlc3DU/8lZfmqxN3AYD6GGLbl+72rdBpXvcV+whX7mDrREzkPdp2RnmfIiWBg1YbuFSkXduF2JcafJg==",
       "dev": true,
       "requires": {
       "dev": true,
       "requires": {
-        "@jest/types": "^26.6.2",
-        "@types/node": "*"
+        "@babel/core": "^7.11.6",
+        "@babel/generator": "^7.7.2",
+        "@babel/plugin-syntax-typescript": "^7.7.2",
+        "@babel/traverse": "^7.7.2",
+        "@babel/types": "^7.3.3",
+        "@jest/expect-utils": "^28.1.3",
+        "@jest/transform": "^28.1.3",
+        "@jest/types": "^28.1.3",
+        "@types/babel__traverse": "^7.0.6",
+        "@types/prettier": "^2.1.5",
+        "babel-preset-current-node-syntax": "^1.0.0",
+        "chalk": "^4.0.0",
+        "expect": "^28.1.3",
+        "graceful-fs": "^4.2.9",
+        "jest-diff": "^28.1.3",
+        "jest-get-type": "^28.0.2",
+        "jest-haste-map": "^28.1.3",
+        "jest-matcher-utils": "^28.1.3",
+        "jest-message-util": "^28.1.3",
+        "jest-util": "^28.1.3",
+        "natural-compare": "^1.4.0",
+        "pretty-format": "^28.1.3",
+        "semver": "^7.3.5"
       },
       "dependencies": {
       },
       "dependencies": {
-        "@jest/types": {
-          "version": "26.6.2",
-          "resolved": "https://registry.npmjs.org/@jest/types/-/types-26.6.2.tgz",
-          "integrity": "sha512-fC6QCp7Sc5sX6g8Tvbmj4XUTbyrik0akgRy03yjXbQaBWWNWGE7SGtJk98m0N8nzegD/7SggrUlivxo5ax4KWQ==",
-          "dev": true,
-          "requires": {
-            "@types/istanbul-lib-coverage": "^2.0.0",
-            "@types/istanbul-reports": "^3.0.0",
-            "@types/node": "*",
-            "@types/yargs": "^15.0.0",
-            "chalk": "^4.0.0"
-          }
-        },
-        "@types/istanbul-reports": {
-          "version": "3.0.1",
-          "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.1.tgz",
-          "integrity": "sha512-c3mAZEuK0lvBp8tmuL74XRKn1+y2dcwOUpH7x4WrF6gk1GIgiluDRgMYQtw2OFcBvAJWlt6ASU3tSqxp0Uu0Aw==",
-          "dev": true,
-          "requires": {
-            "@types/istanbul-lib-report": "*"
-          }
-        },
         "ansi-styles": {
           "version": "4.3.0",
           "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
         "ansi-styles": {
           "version": "4.3.0",
           "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
           "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
           "dev": true
         },
           "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
           "dev": true
         },
+        "lru-cache": {
+          "version": "6.0.0",
+          "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz",
+          "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==",
+          "dev": true,
+          "requires": {
+            "yallist": "^4.0.0"
+          }
+        },
+        "semver": {
+          "version": "7.3.8",
+          "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz",
+          "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==",
+          "dev": true,
+          "requires": {
+            "lru-cache": "^6.0.0"
+          }
+        },
         "supports-color": {
           "version": "7.2.0",
           "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
         "supports-color": {
           "version": "7.2.0",
           "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
           "requires": {
             "has-flag": "^4.0.0"
           }
           "requires": {
             "has-flag": "^4.0.0"
           }
+        },
+        "yallist": {
+          "version": "4.0.0",
+          "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
+          "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==",
+          "dev": true
         }
       }
     },
         }
       }
     },
-    "jest-pnp-resolver": {
-      "version": "1.2.2",
-      "resolved": "https://registry.npmjs.org/jest-pnp-resolver/-/jest-pnp-resolver-1.2.2.tgz",
-      "integrity": "sha512-olV41bKSMm8BdnuMsewT4jqlZ8+3TCARAXjZGT9jcoSnrfUnRCqnMoF9XEeoWjbzObpqF9dRhHQj0Xb9QdF6/w==",
-      "dev": true
-    },
-    "jest-preset-angular": {
-      "version": "8.3.1",
-      "resolved": "https://registry.npmjs.org/jest-preset-angular/-/jest-preset-angular-8.3.1.tgz",
-      "integrity": "sha512-WhQm+0tXzikkvIF35XErV87DqYbieZI0R0MIGgn7VE/DDhdbXFDmYQxFZ7w4qcA0cGLLvSMTBbIsUtHeE/rFxQ==",
+    "jest-util": {
+      "version": "28.1.3",
+      "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-28.1.3.tgz",
+      "integrity": "sha512-XdqfpHwpcSRko/C35uLYFM2emRAltIIKZiJ9eAmhjsj0CqZMa0p1ib0R5fWIqGhn1a103DebTbpqIaP1qCQ6tQ==",
       "dev": true,
       "requires": {
       "dev": true,
       "requires": {
-        "pretty-format": "26.x",
-        "ts-jest": "26.x"
+        "@jest/types": "^28.1.3",
+        "@types/node": "*",
+        "chalk": "^4.0.0",
+        "ci-info": "^3.2.0",
+        "graceful-fs": "^4.2.9",
+        "picomatch": "^2.2.3"
       },
       "dependencies": {
       },
       "dependencies": {
-        "@jest/types": {
-          "version": "26.6.2",
-          "resolved": "https://registry.npmjs.org/@jest/types/-/types-26.6.2.tgz",
-          "integrity": "sha512-fC6QCp7Sc5sX6g8Tvbmj4XUTbyrik0akgRy03yjXbQaBWWNWGE7SGtJk98m0N8nzegD/7SggrUlivxo5ax4KWQ==",
-          "dev": true,
-          "requires": {
-            "@types/istanbul-lib-coverage": "^2.0.0",
-            "@types/istanbul-reports": "^3.0.0",
-            "@types/node": "*",
-            "@types/yargs": "^15.0.0",
-            "chalk": "^4.0.0"
-          }
-        },
-        "@types/istanbul-reports": {
-          "version": "3.0.1",
-          "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.1.tgz",
-          "integrity": "sha512-c3mAZEuK0lvBp8tmuL74XRKn1+y2dcwOUpH7x4WrF6gk1GIgiluDRgMYQtw2OFcBvAJWlt6ASU3tSqxp0Uu0Aw==",
-          "dev": true,
-          "requires": {
-            "@types/istanbul-lib-report": "*"
-          }
-        },
         "ansi-styles": {
           "version": "4.3.0",
           "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
         "ansi-styles": {
           "version": "4.3.0",
           "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
           "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
           "dev": true
         },
           "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
           "dev": true
         },
-        "pretty-format": {
-          "version": "26.6.2",
-          "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-26.6.2.tgz",
-          "integrity": "sha512-7AeGuCYNGmycyQbCqd/3PWH4eOoX/OiCa0uphp57NVTeAGdJGaAliecxwBDHYQCIvrW7aDBZCYeNTP/WX69mkg==",
-          "dev": true,
-          "requires": {
-            "@jest/types": "^26.6.2",
-            "ansi-regex": "^5.0.0",
-            "ansi-styles": "^4.0.0",
-            "react-is": "^17.0.1"
-          }
-        },
-        "react-is": {
-          "version": "17.0.2",
-          "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz",
-          "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==",
-          "dev": true
-        },
         "supports-color": {
           "version": "7.2.0",
           "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
         "supports-color": {
           "version": "7.2.0",
           "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
         }
       }
     },
         }
       }
     },
-    "jest-regex-util": {
-      "version": "26.0.0",
-      "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-26.0.0.tgz",
-      "integrity": "sha512-Gv3ZIs/nA48/Zvjrl34bf+oD76JHiGDUxNOVgUjh3j890sblXryjY4rss71fPtD/njchl6PSE2hIhvyWa1eT0A==",
-      "dev": true
-    },
-    "jest-resolve": {
-      "version": "26.6.2",
-      "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-26.6.2.tgz",
-      "integrity": "sha512-sOxsZOq25mT1wRsfHcbtkInS+Ek7Q8jCHUB0ZUTP0tc/c41QHriU/NunqMfCUWsL4H3MHpvQD4QR9kSYhS7UvQ==",
+    "jest-validate": {
+      "version": "28.1.3",
+      "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-28.1.3.tgz",
+      "integrity": "sha512-SZbOGBWEsaTxBGCOpsRWlXlvNkvTkY0XxRfh7zYmvd8uL5Qzyg0CHAXiXKROflh801quA6+/DsT4ODDthOC/OA==",
       "dev": true,
       "requires": {
       "dev": true,
       "requires": {
-        "@jest/types": "^26.6.2",
+        "@jest/types": "^28.1.3",
+        "camelcase": "^6.2.0",
         "chalk": "^4.0.0",
         "chalk": "^4.0.0",
-        "graceful-fs": "^4.2.4",
-        "jest-pnp-resolver": "^1.2.2",
-        "jest-util": "^26.6.2",
-        "read-pkg-up": "^7.0.1",
-        "resolve": "^1.18.1",
-        "slash": "^3.0.0"
+        "jest-get-type": "^28.0.2",
+        "leven": "^3.1.0",
+        "pretty-format": "^28.1.3"
       },
       "dependencies": {
       },
       "dependencies": {
-        "@jest/types": {
-          "version": "26.6.2",
-          "resolved": "https://registry.npmjs.org/@jest/types/-/types-26.6.2.tgz",
-          "integrity": "sha512-fC6QCp7Sc5sX6g8Tvbmj4XUTbyrik0akgRy03yjXbQaBWWNWGE7SGtJk98m0N8nzegD/7SggrUlivxo5ax4KWQ==",
-          "dev": true,
-          "requires": {
-            "@types/istanbul-lib-coverage": "^2.0.0",
-            "@types/istanbul-reports": "^3.0.0",
-            "@types/node": "*",
-            "@types/yargs": "^15.0.0",
-            "chalk": "^4.0.0"
-          }
-        },
-        "@types/istanbul-reports": {
-          "version": "3.0.1",
-          "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.1.tgz",
-          "integrity": "sha512-c3mAZEuK0lvBp8tmuL74XRKn1+y2dcwOUpH7x4WrF6gk1GIgiluDRgMYQtw2OFcBvAJWlt6ASU3tSqxp0Uu0Aw==",
-          "dev": true,
-          "requires": {
-            "@types/istanbul-lib-report": "*"
-          }
-        },
         "ansi-styles": {
           "version": "4.3.0",
           "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
         "ansi-styles": {
           "version": "4.3.0",
           "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
             "color-convert": "^2.0.1"
           }
         },
             "color-convert": "^2.0.1"
           }
         },
+        "camelcase": {
+          "version": "6.3.0",
+          "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz",
+          "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==",
+          "dev": true
+        },
         "chalk": {
           "version": "4.1.2",
           "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
         "chalk": {
           "version": "4.1.2",
           "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
         }
       }
     },
         }
       }
     },
-    "jest-resolve-dependencies": {
-      "version": "26.6.3",
-      "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-26.6.3.tgz",
-      "integrity": "sha512-pVwUjJkxbhe4RY8QEWzN3vns2kqyuldKpxlxJlzEYfKSvY6/bMvxoFrYYzUO1Gx28yKWN37qyV7rIoIp2h8fTg==",
+    "jest-watcher": {
+      "version": "28.1.3",
+      "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-28.1.3.tgz",
+      "integrity": "sha512-t4qcqj9hze+jviFPUN3YAtAEeFnr/azITXQEMARf5cMwKY2SMBRnCQTXLixTl20OR6mLh9KLMrgVJgJISym+1g==",
       "dev": true,
       "requires": {
       "dev": true,
       "requires": {
-        "@jest/types": "^26.6.2",
-        "jest-regex-util": "^26.0.0",
-        "jest-snapshot": "^26.6.2"
+        "@jest/test-result": "^28.1.3",
+        "@jest/types": "^28.1.3",
+        "@types/node": "*",
+        "ansi-escapes": "^4.2.1",
+        "chalk": "^4.0.0",
+        "emittery": "^0.10.2",
+        "jest-util": "^28.1.3",
+        "string-length": "^4.0.1"
       },
       "dependencies": {
       },
       "dependencies": {
-        "@jest/types": {
-          "version": "26.6.2",
-          "resolved": "https://registry.npmjs.org/@jest/types/-/types-26.6.2.tgz",
-          "integrity": "sha512-fC6QCp7Sc5sX6g8Tvbmj4XUTbyrik0akgRy03yjXbQaBWWNWGE7SGtJk98m0N8nzegD/7SggrUlivxo5ax4KWQ==",
-          "dev": true,
-          "requires": {
-            "@types/istanbul-lib-coverage": "^2.0.0",
-            "@types/istanbul-reports": "^3.0.0",
-            "@types/node": "*",
-            "@types/yargs": "^15.0.0",
-            "chalk": "^4.0.0"
-          }
-        },
-        "@types/istanbul-reports": {
-          "version": "3.0.1",
-          "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.1.tgz",
-          "integrity": "sha512-c3mAZEuK0lvBp8tmuL74XRKn1+y2dcwOUpH7x4WrF6gk1GIgiluDRgMYQtw2OFcBvAJWlt6ASU3tSqxp0Uu0Aw==",
-          "dev": true,
-          "requires": {
-            "@types/istanbul-lib-report": "*"
-          }
-        },
         "ansi-styles": {
           "version": "4.3.0",
           "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
         "ansi-styles": {
           "version": "4.3.0",
           "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
         }
       }
     },
         }
       }
     },
-    "jest-runner": {
-      "version": "26.6.3",
-      "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-26.6.3.tgz",
-      "integrity": "sha512-atgKpRHnaA2OvByG/HpGA4g6CSPS/1LK0jK3gATJAoptC1ojltpmVlYC3TYgdmGp+GLuhzpH30Gvs36szSL2JQ==",
+    "jest-worker": {
+      "version": "27.5.1",
+      "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.5.1.tgz",
+      "integrity": "sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==",
       "dev": true,
       "requires": {
       "dev": true,
       "requires": {
-        "@jest/console": "^26.6.2",
-        "@jest/environment": "^26.6.2",
-        "@jest/test-result": "^26.6.2",
-        "@jest/types": "^26.6.2",
         "@types/node": "*",
         "@types/node": "*",
-        "chalk": "^4.0.0",
-        "emittery": "^0.7.1",
-        "exit": "^0.1.2",
-        "graceful-fs": "^4.2.4",
-        "jest-config": "^26.6.3",
-        "jest-docblock": "^26.0.0",
-        "jest-haste-map": "^26.6.2",
-        "jest-leak-detector": "^26.6.2",
-        "jest-message-util": "^26.6.2",
-        "jest-resolve": "^26.6.2",
-        "jest-runtime": "^26.6.3",
-        "jest-util": "^26.6.2",
-        "jest-worker": "^26.6.2",
-        "source-map-support": "^0.5.6",
-        "throat": "^5.0.0"
+        "merge-stream": "^2.0.0",
+        "supports-color": "^8.0.0"
       },
       "dependencies": {
       },
       "dependencies": {
-        "@jest/types": {
-          "version": "26.6.2",
-          "resolved": "https://registry.npmjs.org/@jest/types/-/types-26.6.2.tgz",
-          "integrity": "sha512-fC6QCp7Sc5sX6g8Tvbmj4XUTbyrik0akgRy03yjXbQaBWWNWGE7SGtJk98m0N8nzegD/7SggrUlivxo5ax4KWQ==",
+        "has-flag": {
+          "version": "4.0.0",
+          "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
+          "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+          "dev": true
+        },
+        "supports-color": {
+          "version": "8.1.1",
+          "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz",
+          "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==",
           "dev": true,
           "requires": {
           "dev": true,
           "requires": {
-            "@types/istanbul-lib-coverage": "^2.0.0",
-            "@types/istanbul-reports": "^3.0.0",
-            "@types/node": "*",
-            "@types/yargs": "^15.0.0",
-            "chalk": "^4.0.0"
+            "has-flag": "^4.0.0"
           }
           }
+        }
+      }
+    },
+    "jju": {
+      "version": "1.4.0",
+      "resolved": "https://registry.npmjs.org/jju/-/jju-1.4.0.tgz",
+      "integrity": "sha512-8wb9Yw966OSxApiCt0K3yNJL8pnNeIv+OEq2YMidz4FKP6nonSRoOXc80iXY4JaN2FC11B9qsNmDsm+ZOfMROA==",
+      "dev": true
+    },
+    "joi": {
+      "version": "17.8.3",
+      "resolved": "https://registry.npmjs.org/joi/-/joi-17.8.3.tgz",
+      "integrity": "sha512-q5Fn6Tj/jR8PfrLrx4fpGH4v9qM6o+vDUfD4/3vxxyg34OmKcNqYZ1qn2mpLza96S8tL0p0rIw2gOZX+/cTg9w==",
+      "dev": true,
+      "requires": {
+        "@hapi/hoek": "^9.0.0",
+        "@hapi/topo": "^5.0.0",
+        "@sideway/address": "^4.1.3",
+        "@sideway/formula": "^3.0.1",
+        "@sideway/pinpoint": "^2.0.0"
+      }
+    },
+    "js-file-download": {
+      "version": "0.4.12",
+      "resolved": "https://registry.npmjs.org/js-file-download/-/js-file-download-0.4.12.tgz",
+      "integrity": "sha512-rML+NkoD08p5Dllpjo0ffy4jRHeY6Zsapvr/W86N7E0yuzAO6qa5X9+xog6zQNlH102J7IXljNY2FtS6Lj3ucg=="
+    },
+    "js-string-escape": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/js-string-escape/-/js-string-escape-1.0.1.tgz",
+      "integrity": "sha512-Smw4xcfIQ5LVjAOuJCvN/zIodzA/BBSsluuoSykP+lUvScIi4U6RJLfwHet5cxFnCswUjISV8oAXaqaJDY3chg==",
+      "dev": true
+    },
+    "js-tokens": {
+      "version": "4.0.0",
+      "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz",
+      "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ=="
+    },
+    "js-yaml": {
+      "version": "4.1.0",
+      "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz",
+      "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==",
+      "requires": {
+        "argparse": "^2.0.1"
+      }
+    },
+    "jsbn": {
+      "version": "0.1.1",
+      "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz",
+      "integrity": "sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg==",
+      "dev": true
+    },
+    "jsdom": {
+      "version": "19.0.0",
+      "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-19.0.0.tgz",
+      "integrity": "sha512-RYAyjCbxy/vri/CfnjUWJQQtZ3LKlLnDqj+9XLNnJPgEGeirZs3hllKR20re8LUZ6o1b1X4Jat+Qd26zmP41+A==",
+      "dev": true,
+      "requires": {
+        "abab": "^2.0.5",
+        "acorn": "^8.5.0",
+        "acorn-globals": "^6.0.0",
+        "cssom": "^0.5.0",
+        "cssstyle": "^2.3.0",
+        "data-urls": "^3.0.1",
+        "decimal.js": "^10.3.1",
+        "domexception": "^4.0.0",
+        "escodegen": "^2.0.0",
+        "form-data": "^4.0.0",
+        "html-encoding-sniffer": "^3.0.0",
+        "http-proxy-agent": "^5.0.0",
+        "https-proxy-agent": "^5.0.0",
+        "is-potential-custom-element-name": "^1.0.1",
+        "nwsapi": "^2.2.0",
+        "parse5": "6.0.1",
+        "saxes": "^5.0.1",
+        "symbol-tree": "^3.2.4",
+        "tough-cookie": "^4.0.0",
+        "w3c-hr-time": "^1.0.2",
+        "w3c-xmlserializer": "^3.0.0",
+        "webidl-conversions": "^7.0.0",
+        "whatwg-encoding": "^2.0.0",
+        "whatwg-mimetype": "^3.0.0",
+        "whatwg-url": "^10.0.0",
+        "ws": "^8.2.3",
+        "xml-name-validator": "^4.0.0"
+      },
+      "dependencies": {
+        "@tootallnate/once": {
+          "version": "2.0.0",
+          "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-2.0.0.tgz",
+          "integrity": "sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A==",
+          "dev": true
         },
         },
-        "@types/istanbul-reports": {
-          "version": "3.0.1",
-          "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.1.tgz",
-          "integrity": "sha512-c3mAZEuK0lvBp8tmuL74XRKn1+y2dcwOUpH7x4WrF6gk1GIgiluDRgMYQtw2OFcBvAJWlt6ASU3tSqxp0Uu0Aw==",
+        "acorn-globals": {
+          "version": "6.0.0",
+          "resolved": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-6.0.0.tgz",
+          "integrity": "sha512-ZQl7LOWaF5ePqqcX4hLuv/bLXYQNfNWw2c0/yX/TsPRKamzHcTGQnlCjHT3TsmkOUVEPS3crCxiPfdzE/Trlhg==",
           "dev": true,
           "requires": {
           "dev": true,
           "requires": {
-            "@types/istanbul-lib-report": "*"
+            "acorn": "^7.1.1",
+            "acorn-walk": "^7.1.1"
+          },
+          "dependencies": {
+            "acorn": {
+              "version": "7.4.1",
+              "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz",
+              "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==",
+              "dev": true
+            }
           }
         },
           }
         },
-        "ansi-styles": {
-          "version": "4.3.0",
-          "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
-          "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+        "acorn-walk": {
+          "version": "7.2.0",
+          "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-7.2.0.tgz",
+          "integrity": "sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA==",
+          "dev": true
+        },
+        "cssom": {
+          "version": "0.5.0",
+          "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.5.0.tgz",
+          "integrity": "sha512-iKuQcq+NdHqlAcwUY0o/HL69XQrUaQdMjmStJ8JFmUaiiQErlhrmuigkg/CU4E2J0IyUKUrMAgl36TvN67MqTw==",
+          "dev": true
+        },
+        "data-urls": {
+          "version": "3.0.2",
+          "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-3.0.2.tgz",
+          "integrity": "sha512-Jy/tj3ldjZJo63sVAvg6LHt2mHvl4V6AgRAmNDtLdm7faqtsx+aJG42rsyCo9JCoRVKwPFzKlIPx3DIibwSIaQ==",
           "dev": true,
           "requires": {
           "dev": true,
           "requires": {
-            "color-convert": "^2.0.1"
+            "abab": "^2.0.6",
+            "whatwg-mimetype": "^3.0.0",
+            "whatwg-url": "^11.0.0"
+          },
+          "dependencies": {
+            "whatwg-url": {
+              "version": "11.0.0",
+              "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-11.0.0.tgz",
+              "integrity": "sha512-RKT8HExMpoYx4igMiVMY83lN6UeITKJlBQ+vR/8ZJ8OCdSiN3RwCq+9gH0+Xzj0+5IrM6i4j/6LuvzbZIQgEcQ==",
+              "dev": true,
+              "requires": {
+                "tr46": "^3.0.0",
+                "webidl-conversions": "^7.0.0"
+              }
+            }
           }
         },
           }
         },
-        "chalk": {
-          "version": "4.1.2",
-          "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
-          "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
+        "domexception": {
+          "version": "4.0.0",
+          "resolved": "https://registry.npmjs.org/domexception/-/domexception-4.0.0.tgz",
+          "integrity": "sha512-A2is4PLG+eeSfoTMA95/s4pvAoSo2mKtiM5jlHkAVewmiO8ISFTFKZjH7UAM1Atli/OT/7JHOrJRJiMKUZKYBw==",
           "dev": true,
           "requires": {
           "dev": true,
           "requires": {
-            "ansi-styles": "^4.1.0",
-            "supports-color": "^7.1.0"
+            "webidl-conversions": "^7.0.0"
           }
         },
           }
         },
-        "color-convert": {
-          "version": "2.0.1",
-          "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
-          "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+        "escodegen": {
+          "version": "2.0.0",
+          "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-2.0.0.tgz",
+          "integrity": "sha512-mmHKys/C8BFUGI+MAWNcSYoORYLMdPzjrknd2Vc+bUsjN5bXcr8EhrNB+UTqfL1y3I9c4fw2ihgtMPQLBRiQxw==",
           "dev": true,
           "requires": {
           "dev": true,
           "requires": {
-            "color-name": "~1.1.4"
+            "esprima": "^4.0.1",
+            "estraverse": "^5.2.0",
+            "esutils": "^2.0.2",
+            "optionator": "^0.8.1",
+            "source-map": "~0.6.1"
           }
         },
           }
         },
-        "color-name": {
-          "version": "1.1.4",
-          "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
-          "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
-          "dev": true
-        },
-        "has-flag": {
-          "version": "4.0.0",
-          "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
-          "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+        "estraverse": {
+          "version": "5.3.0",
+          "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz",
+          "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==",
           "dev": true
         },
           "dev": true
         },
-        "jest-worker": {
-          "version": "26.6.2",
-          "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-26.6.2.tgz",
-          "integrity": "sha512-KWYVV1c4i+jbMpaBC+U++4Va0cp8OisU185o73T1vo99hqi7w8tSJfUXYswwqqrjzwxa6KpRK54WhPvwf5w6PQ==",
+        "html-encoding-sniffer": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-3.0.0.tgz",
+          "integrity": "sha512-oWv4T4yJ52iKrufjnyZPkrN0CH3QnrUqdB6In1g5Fe1mia8GmF36gnfNySxoZtxD5+NmYw1EElVXiBk93UeskA==",
           "dev": true,
           "requires": {
           "dev": true,
           "requires": {
-            "@types/node": "*",
-            "merge-stream": "^2.0.0",
-            "supports-color": "^7.0.0"
+            "whatwg-encoding": "^2.0.0"
           }
         },
           }
         },
-        "supports-color": {
-          "version": "7.2.0",
-          "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
-          "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
+        "http-proxy-agent": {
+          "version": "5.0.0",
+          "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-5.0.0.tgz",
+          "integrity": "sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w==",
           "dev": true,
           "requires": {
           "dev": true,
           "requires": {
-            "has-flag": "^4.0.0"
+            "@tootallnate/once": "2",
+            "agent-base": "6",
+            "debug": "4"
           }
           }
-        }
-      }
-    },
-    "jest-runtime": {
-      "version": "26.6.3",
-      "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-26.6.3.tgz",
-      "integrity": "sha512-lrzyR3N8sacTAMeonbqpnSka1dHNux2uk0qqDXVkMv2c/A3wYnvQ4EXuI013Y6+gSKSCxdaczvf4HF0mVXHRdw==",
-      "dev": true,
-      "requires": {
-        "@jest/console": "^26.6.2",
-        "@jest/environment": "^26.6.2",
-        "@jest/fake-timers": "^26.6.2",
-        "@jest/globals": "^26.6.2",
-        "@jest/source-map": "^26.6.2",
-        "@jest/test-result": "^26.6.2",
-        "@jest/transform": "^26.6.2",
-        "@jest/types": "^26.6.2",
-        "@types/yargs": "^15.0.0",
-        "chalk": "^4.0.0",
-        "cjs-module-lexer": "^0.6.0",
-        "collect-v8-coverage": "^1.0.0",
-        "exit": "^0.1.2",
-        "glob": "^7.1.3",
-        "graceful-fs": "^4.2.4",
-        "jest-config": "^26.6.3",
-        "jest-haste-map": "^26.6.2",
-        "jest-message-util": "^26.6.2",
-        "jest-mock": "^26.6.2",
-        "jest-regex-util": "^26.0.0",
-        "jest-resolve": "^26.6.2",
-        "jest-snapshot": "^26.6.2",
-        "jest-util": "^26.6.2",
-        "jest-validate": "^26.6.2",
-        "slash": "^3.0.0",
-        "strip-bom": "^4.0.0",
-        "yargs": "^15.4.1"
-      },
-      "dependencies": {
-        "@jest/types": {
-          "version": "26.6.2",
-          "resolved": "https://registry.npmjs.org/@jest/types/-/types-26.6.2.tgz",
-          "integrity": "sha512-fC6QCp7Sc5sX6g8Tvbmj4XUTbyrik0akgRy03yjXbQaBWWNWGE7SGtJk98m0N8nzegD/7SggrUlivxo5ax4KWQ==",
+        },
+        "iconv-lite": {
+          "version": "0.6.3",
+          "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz",
+          "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==",
           "dev": true,
           "requires": {
           "dev": true,
           "requires": {
-            "@types/istanbul-lib-coverage": "^2.0.0",
-            "@types/istanbul-reports": "^3.0.0",
-            "@types/node": "*",
-            "@types/yargs": "^15.0.0",
-            "chalk": "^4.0.0"
+            "safer-buffer": ">= 2.1.2 < 3.0.0"
           }
         },
           }
         },
-        "@types/istanbul-reports": {
-          "version": "3.0.1",
-          "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.1.tgz",
-          "integrity": "sha512-c3mAZEuK0lvBp8tmuL74XRKn1+y2dcwOUpH7x4WrF6gk1GIgiluDRgMYQtw2OFcBvAJWlt6ASU3tSqxp0Uu0Aw==",
+        "punycode": {
+          "version": "2.3.0",
+          "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.0.tgz",
+          "integrity": "sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==",
+          "dev": true
+        },
+        "saxes": {
+          "version": "5.0.1",
+          "resolved": "https://registry.npmjs.org/saxes/-/saxes-5.0.1.tgz",
+          "integrity": "sha512-5LBh1Tls8c9xgGjw3QrMwETmTMVk0oFgvrFSvWx62llR2hcEInrKNZ2GZCCuuy2lvWrdl5jhbpeqc5hRYKFOcw==",
           "dev": true,
           "requires": {
           "dev": true,
           "requires": {
-            "@types/istanbul-lib-report": "*"
+            "xmlchars": "^2.2.0"
           }
         },
           }
         },
-        "ansi-styles": {
-          "version": "4.3.0",
-          "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
-          "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+        "source-map": {
+          "version": "0.6.1",
+          "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+          "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
           "dev": true,
           "dev": true,
-          "requires": {
-            "color-convert": "^2.0.1"
-          }
+          "optional": true
         },
         },
-        "chalk": {
+        "tough-cookie": {
           "version": "4.1.2",
           "version": "4.1.2",
-          "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
-          "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
+          "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-4.1.2.tgz",
+          "integrity": "sha512-G9fqXWoYFZgTc2z8Q5zaHy/vJMjm+WV0AkAeHxVCQiEB1b+dGvWzFW6QV07cY5jQ5gRkeid2qIkzkxUnmoQZUQ==",
           "dev": true,
           "requires": {
           "dev": true,
           "requires": {
-            "ansi-styles": "^4.1.0",
-            "supports-color": "^7.1.0"
+            "psl": "^1.1.33",
+            "punycode": "^2.1.1",
+            "universalify": "^0.2.0",
+            "url-parse": "^1.5.3"
           }
         },
           }
         },
-        "cliui": {
-          "version": "6.0.0",
-          "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz",
-          "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==",
-          "dev": true,
-          "requires": {
-            "string-width": "^4.2.0",
-            "strip-ansi": "^6.0.0",
-            "wrap-ansi": "^6.2.0"
-          }
-        },
-        "color-convert": {
-          "version": "2.0.1",
-          "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
-          "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+        "tr46": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npmjs.org/tr46/-/tr46-3.0.0.tgz",
+          "integrity": "sha512-l7FvfAHlcmulp8kr+flpQZmVwtu7nfRV7NZujtN0OqES8EL4O4e0qqzL0DC5gAvx/ZC/9lk6rhcUwYvkBnBnYA==",
           "dev": true,
           "requires": {
           "dev": true,
           "requires": {
-            "color-name": "~1.1.4"
+            "punycode": "^2.1.1"
           }
         },
           }
         },
-        "color-name": {
-          "version": "1.1.4",
-          "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
-          "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
-          "dev": true
-        },
-        "has-flag": {
-          "version": "4.0.0",
-          "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
-          "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+        "universalify": {
+          "version": "0.2.0",
+          "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.2.0.tgz",
+          "integrity": "sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg==",
           "dev": true
         },
           "dev": true
         },
-        "supports-color": {
-          "version": "7.2.0",
-          "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
-          "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
+        "w3c-xmlserializer": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-3.0.0.tgz",
+          "integrity": "sha512-3WFqGEgSXIyGhOmAFtlicJNMjEps8b1MG31NCA0/vOF9+nKMUW1ckhi9cnNHmf88Rzw5V+dwIwsm2C7X8k9aQg==",
           "dev": true,
           "requires": {
           "dev": true,
           "requires": {
-            "has-flag": "^4.0.0"
+            "xml-name-validator": "^4.0.0"
           }
         },
           }
         },
-        "wrap-ansi": {
-          "version": "6.2.0",
-          "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz",
-          "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==",
+        "webidl-conversions": {
+          "version": "7.0.0",
+          "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-7.0.0.tgz",
+          "integrity": "sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==",
+          "dev": true
+        },
+        "whatwg-encoding": {
+          "version": "2.0.0",
+          "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-2.0.0.tgz",
+          "integrity": "sha512-p41ogyeMUrw3jWclHWTQg1k05DSVXPLcVxRTYsXUk+ZooOCZLcoYgPZ/HL/D/N+uQPOtcp1me1WhBEaX02mhWg==",
           "dev": true,
           "requires": {
           "dev": true,
           "requires": {
-            "ansi-styles": "^4.0.0",
-            "string-width": "^4.1.0",
-            "strip-ansi": "^6.0.0"
+            "iconv-lite": "0.6.3"
           }
         },
           }
         },
-        "y18n": {
-          "version": "4.0.3",
-          "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz",
-          "integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==",
+        "whatwg-mimetype": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-3.0.0.tgz",
+          "integrity": "sha512-nt+N2dzIutVRxARx1nghPKGv1xHikU7HKdfafKkLNLindmPU/ch3U31NOCGGA/dmPcmb1VlofO0vnKAcsm0o/Q==",
           "dev": true
         },
           "dev": true
         },
-        "yargs": {
-          "version": "15.4.1",
-          "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.4.1.tgz",
-          "integrity": "sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==",
+        "whatwg-url": {
+          "version": "10.0.0",
+          "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-10.0.0.tgz",
+          "integrity": "sha512-CLxxCmdUby142H5FZzn4D8ikO1cmypvXVQktsgosNy4a4BHrDHeciBBGZhb0bNoR5/MltoCatso+vFjjGx8t0w==",
           "dev": true,
           "requires": {
           "dev": true,
           "requires": {
-            "cliui": "^6.0.0",
-            "decamelize": "^1.2.0",
-            "find-up": "^4.1.0",
-            "get-caller-file": "^2.0.1",
-            "require-directory": "^2.1.1",
-            "require-main-filename": "^2.0.0",
-            "set-blocking": "^2.0.0",
-            "string-width": "^4.2.0",
-            "which-module": "^2.0.0",
-            "y18n": "^4.0.0",
-            "yargs-parser": "^18.1.2"
+            "tr46": "^3.0.0",
+            "webidl-conversions": "^7.0.0"
           }
         },
           }
         },
-        "yargs-parser": {
-          "version": "18.1.3",
-          "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz",
-          "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==",
-          "dev": true,
-          "requires": {
-            "camelcase": "^5.0.0",
-            "decamelize": "^1.2.0"
-          }
+        "xml-name-validator": {
+          "version": "4.0.0",
+          "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-4.0.0.tgz",
+          "integrity": "sha512-ICP2e+jsHvAj2E2lIHxa5tjXRlKDJo4IdvPvCXbXQGdzSfmSpNVyIKMvoZHjDY9DP0zV17iI85o90vRFXNccRw==",
+          "dev": true
         }
       }
     },
         }
       }
     },
-    "jest-serializer": {
-      "version": "26.6.2",
-      "resolved": "https://registry.npmjs.org/jest-serializer/-/jest-serializer-26.6.2.tgz",
-      "integrity": "sha512-S5wqyz0DXnNJPd/xfIzZ5Xnp1HrJWBczg8mMfMpN78OJ5eDxXyf+Ygld9wX1DnUWbIbhM1YDY95NjR4CBXkb2g==",
+    "jsesc": {
+      "version": "2.5.2",
+      "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz",
+      "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA=="
+    },
+    "json-parse-better-errors": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz",
+      "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==",
+      "dev": true
+    },
+    "json-parse-even-better-errors": {
+      "version": "2.3.1",
+      "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz",
+      "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==",
+      "dev": true
+    },
+    "json-parse-helpfulerror": {
+      "version": "1.0.3",
+      "resolved": "https://registry.npmjs.org/json-parse-helpfulerror/-/json-parse-helpfulerror-1.0.3.tgz",
+      "integrity": "sha512-XgP0FGR77+QhUxjXkwOMkC94k3WtqEBfcnjWqhRd82qTat4SWKRE+9kUnynz/shm3I4ea2+qISvTIeGTNU7kJg==",
+      "dev": true,
+      "requires": {
+        "jju": "^1.1.0"
+      }
+    },
+    "json-schema": {
+      "version": "0.4.0",
+      "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.4.0.tgz",
+      "integrity": "sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==",
+      "dev": true
+    },
+    "json-schema-traverse": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz",
+      "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==",
+      "dev": true
+    },
+    "json-stable-stringify": {
+      "version": "0.0.1",
+      "resolved": "https://registry.npmjs.org/json-stable-stringify/-/json-stable-stringify-0.0.1.tgz",
+      "integrity": "sha512-nKtD/Qxm7tWdZqJoldEC7fF0S41v0mWbeaXG3637stOWfyGxTgWTYE2wtfKmjzpvxv2MA2xzxsXOIiwUpkX6Qw==",
       "dev": true,
       "requires": {
       "dev": true,
       "requires": {
-        "@types/node": "*",
-        "graceful-fs": "^4.2.4"
+        "jsonify": "~0.0.0"
       }
     },
       }
     },
-    "jest-silent-reporter": {
-      "version": "0.2.1",
-      "resolved": "https://registry.npmjs.org/jest-silent-reporter/-/jest-silent-reporter-0.2.1.tgz",
-      "integrity": "sha512-nEO3oOFHtEXFjlRCbJOlvEWA7ZHyyyvMsU4WHuAhinYBOI4PiX1EIbsZfQZ/cxHcYliHBU9zY8bPxMPdBGksYw==",
+    "json-stable-stringify-without-jsonify": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz",
+      "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==",
+      "dev": true
+    },
+    "json-stringify-safe": {
+      "version": "5.0.1",
+      "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz",
+      "integrity": "sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==",
+      "dev": true
+    },
+    "json5": {
+      "version": "2.2.3",
+      "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz",
+      "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg=="
+    },
+    "jsonc-parser": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.0.0.tgz",
+      "integrity": "sha512-fQzRfAbIBnR0IQvftw9FJveWiHp72Fg20giDrHz6TdfB12UH/uue0D3hm57UB5KgAVuniLMCaS8P1IMj9NR7cA==",
+      "dev": true
+    },
+    "jsonfile": {
+      "version": "6.1.0",
+      "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz",
+      "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==",
+      "dev": true,
+      "requires": {
+        "graceful-fs": "^4.1.6",
+        "universalify": "^2.0.0"
+      }
+    },
+    "jsonify": {
+      "version": "0.0.1",
+      "resolved": "https://registry.npmjs.org/jsonify/-/jsonify-0.0.1.tgz",
+      "integrity": "sha512-2/Ki0GcmuqSrgFyelQq9M05y7PS0mEwuIzrf3f1fPqkVDVRvZrPZtVSMHxdgo8Aq0sxAOb/cr2aqqA3LeWHVPg==",
+      "dev": true
+    },
+    "jsonparse": {
+      "version": "1.3.1",
+      "resolved": "https://registry.npmjs.org/jsonparse/-/jsonparse-1.3.1.tgz",
+      "integrity": "sha512-POQXvpdL69+CluYsillJ7SUhKvytYjW9vG/GKpnf+xP8UWgYEM/RaMzHHofbALDiKbbP1W8UEYmgGl39WkPZsg==",
+      "dev": true
+    },
+    "jsprim": {
+      "version": "1.4.2",
+      "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.2.tgz",
+      "integrity": "sha512-P2bSOMAc/ciLz6DzgjVlGJP9+BrJWu5UDGK70C2iweC5QBIeFf0ZXRvGjEj2uYgrY2MkAAhsSWHDWlFtEroZWw==",
+      "dev": true,
+      "requires": {
+        "assert-plus": "1.0.0",
+        "extsprintf": "1.3.0",
+        "json-schema": "0.4.0",
+        "verror": "1.10.0"
+      }
+    },
+    "karma-source-map-support": {
+      "version": "1.4.0",
+      "resolved": "https://registry.npmjs.org/karma-source-map-support/-/karma-source-map-support-1.4.0.tgz",
+      "integrity": "sha512-RsBECncGO17KAoJCYXjv+ckIz+Ii9NCi+9enk+rq6XC81ezYkb4/RHE6CTXdA7IOJqoF3wcaLfVG0CPmE5ca6A==",
+      "dev": true,
+      "requires": {
+        "source-map-support": "^0.5.5"
+      }
+    },
+    "kind-of": {
+      "version": "6.0.3",
+      "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz",
+      "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==",
+      "dev": true
+    },
+    "kleur": {
+      "version": "3.0.3",
+      "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz",
+      "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==",
+      "dev": true
+    },
+    "klona": {
+      "version": "2.0.6",
+      "resolved": "https://registry.npmjs.org/klona/-/klona-2.0.6.tgz",
+      "integrity": "sha512-dhG34DXATL5hSxJbIexCft8FChFXtmskoZYnoPWjXQuebWYCNkVeV3KkGegCK9CP1oswI/vQibS2GY7Em/sJJA==",
+      "dev": true
+    },
+    "known-css-properties": {
+      "version": "0.21.0",
+      "resolved": "https://registry.npmjs.org/known-css-properties/-/known-css-properties-0.21.0.tgz",
+      "integrity": "sha512-sZLUnTqimCkvkgRS+kbPlYW5o8q5w1cu+uIisKpEWkj31I8mx8kNG162DwRav8Zirkva6N5uoFsm9kzK4mUXjw==",
+      "dev": true
+    },
+    "knuth-shuffle-seeded": {
+      "version": "1.0.6",
+      "resolved": "https://registry.npmjs.org/knuth-shuffle-seeded/-/knuth-shuffle-seeded-1.0.6.tgz",
+      "integrity": "sha512-9pFH0SplrfyKyojCLxZfMcvkhf5hH0d+UwR9nTVJ/DDQJGuzcXjTwB7TP7sDfehSudlGGaOLblmEWqv04ERVWg==",
+      "dev": true,
+      "requires": {
+        "seed-random": "~2.2.0"
+      }
+    },
+    "labeled-stream-splicer": {
+      "version": "2.0.2",
+      "resolved": "https://registry.npmjs.org/labeled-stream-splicer/-/labeled-stream-splicer-2.0.2.tgz",
+      "integrity": "sha512-Ca4LSXFFZUjPScRaqOcFxneA0VpKZr4MMYCljyQr4LIewTLb3Y0IUTIsnBBsVubIeEfxeSZpSjSsRM8APEQaAw==",
+      "dev": true,
+      "requires": {
+        "inherits": "^2.0.1",
+        "stream-splicer": "^2.0.0"
+      }
+    },
+    "lazy-ass": {
+      "version": "1.6.0",
+      "resolved": "https://registry.npmjs.org/lazy-ass/-/lazy-ass-1.6.0.tgz",
+      "integrity": "sha512-cc8oEVoctTvsFZ/Oje/kGnHbpWHYBe8IAJe4C0QNc3t8uM/0Y8+erSz/7Y1ALuXTEZTMvxXwO6YbX1ey3ujiZw==",
+      "dev": true
+    },
+    "lcid": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/lcid/-/lcid-2.0.0.tgz",
+      "integrity": "sha512-avPEb8P8EGnwXKClwsNUgryVjllcRqtMYa49NTsbQagYuT1DcXnl1915oxWjoyGrXR6zH/Y0Zc96xWsPcoDKeA==",
+      "dev": true,
+      "requires": {
+        "invert-kv": "^2.0.0"
+      }
+    },
+    "less": {
+      "version": "4.1.2",
+      "resolved": "https://registry.npmjs.org/less/-/less-4.1.2.tgz",
+      "integrity": "sha512-EoQp/Et7OSOVu0aJknJOtlXZsnr8XE8KwuzTHOLeVSEx8pVWUICc8Q0VYRHgzyjX78nMEyC/oztWFbgyhtNfDA==",
       "dev": true,
       "requires": {
       "dev": true,
       "requires": {
-        "chalk": "^2.3.1",
-        "jest-util": "^24.0.0"
+        "copy-anything": "^2.0.1",
+        "errno": "^0.1.1",
+        "graceful-fs": "^4.1.2",
+        "image-size": "~0.5.0",
+        "make-dir": "^2.1.0",
+        "mime": "^1.4.1",
+        "needle": "^2.5.2",
+        "parse-node-version": "^1.0.1",
+        "source-map": "~0.6.0",
+        "tslib": "^2.3.0"
       },
       "dependencies": {
       },
       "dependencies": {
-        "@jest/console": {
-          "version": "24.9.0",
-          "resolved": "https://registry.npmjs.org/@jest/console/-/console-24.9.0.tgz",
-          "integrity": "sha512-Zuj6b8TnKXi3q4ymac8EQfc3ea/uhLeCGThFqXeC8H9/raaH8ARPUTdId+XyGd03Z4In0/VjD2OYFcBF09fNLQ==",
-          "dev": true,
-          "requires": {
-            "@jest/source-map": "^24.9.0",
-            "chalk": "^2.0.1",
-            "slash": "^2.0.0"
-          }
-        },
-        "@jest/fake-timers": {
-          "version": "24.9.0",
-          "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-24.9.0.tgz",
-          "integrity": "sha512-eWQcNa2YSwzXWIMC5KufBh3oWRIijrQFROsIqt6v/NS9Io/gknw1jsAC9c+ih/RQX4A3O7SeWAhQeN0goKhT9A==",
-          "dev": true,
-          "requires": {
-            "@jest/types": "^24.9.0",
-            "jest-message-util": "^24.9.0",
-            "jest-mock": "^24.9.0"
-          }
-        },
-        "@jest/source-map": {
-          "version": "24.9.0",
-          "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-24.9.0.tgz",
-          "integrity": "sha512-/Xw7xGlsZb4MJzNDgB7PW5crou5JqWiBQaz6xyPd3ArOg2nfn/PunV8+olXbbEZzNl591o5rWKE9BRDaFAuIBg==",
+        "make-dir": {
+          "version": "2.1.0",
+          "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz",
+          "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==",
           "dev": true,
           "dev": true,
+          "optional": true,
           "requires": {
           "requires": {
-            "callsites": "^3.0.0",
-            "graceful-fs": "^4.1.15",
-            "source-map": "^0.6.0"
+            "pify": "^4.0.1",
+            "semver": "^5.6.0"
           }
         },
           }
         },
-        "@jest/test-result": {
-          "version": "24.9.0",
-          "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-24.9.0.tgz",
-          "integrity": "sha512-XEFrHbBonBJ8dGp2JmF8kP/nQI/ImPpygKHwQ/SY+es59Z3L5PI4Qb9TQQMAEeYsThG1xF0k6tmG0tIKATNiiA==",
+        "semver": {
+          "version": "5.7.1",
+          "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz",
+          "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==",
           "dev": true,
           "dev": true,
-          "requires": {
-            "@jest/console": "^24.9.0",
-            "@jest/types": "^24.9.0",
-            "@types/istanbul-lib-coverage": "^2.0.0"
-          }
+          "optional": true
         },
         },
-        "@jest/types": {
-          "version": "24.9.0",
-          "resolved": "https://registry.npmjs.org/@jest/types/-/types-24.9.0.tgz",
-          "integrity": "sha512-XKK7ze1apu5JWQ5eZjHITP66AX+QsLlbaJRBGYr8pNzwcAE2JVkwnf0yqjHTsDRcjR0mujy/NmZMXw5kl+kGBw==",
+        "source-map": {
+          "version": "0.6.1",
+          "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+          "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
           "dev": true,
           "dev": true,
-          "requires": {
-            "@types/istanbul-lib-coverage": "^2.0.0",
-            "@types/istanbul-reports": "^1.1.1",
-            "@types/yargs": "^13.0.0"
-          }
-        },
-        "@types/stack-utils": {
-          "version": "1.0.1",
-          "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-1.0.1.tgz",
-          "integrity": "sha512-l42BggppR6zLmpfU6fq9HEa2oGPEI8yrSPL3GITjfRInppYFahObbIQOQK3UGxEnyQpltZLaPe75046NOZQikw==",
-          "dev": true
-        },
-        "@types/yargs": {
-          "version": "13.0.12",
-          "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-13.0.12.tgz",
-          "integrity": "sha512-qCxJE1qgz2y0hA4pIxjBR+PelCH0U5CK1XJXFwCNqfmliatKp47UCXXE9Dyk1OXBDLvsCF57TqQEJaeLfDYEOQ==",
-          "dev": true,
-          "requires": {
-            "@types/yargs-parser": "*"
-          }
-        },
-        "braces": {
-          "version": "2.3.2",
-          "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz",
-          "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==",
-          "dev": true,
-          "requires": {
-            "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"
-          },
-          "dependencies": {
-            "extend-shallow": {
-              "version": "2.0.1",
-              "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
-              "integrity": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==",
-              "dev": true,
-              "requires": {
-                "is-extendable": "^0.1.0"
-              }
-            }
-          }
-        },
-        "ci-info": {
-          "version": "2.0.0",
-          "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz",
-          "integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==",
-          "dev": true
-        },
-        "escape-string-regexp": {
-          "version": "2.0.0",
-          "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz",
-          "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==",
-          "dev": true
-        },
-        "fill-range": {
-          "version": "4.0.0",
-          "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz",
-          "integrity": "sha512-VcpLTWqWDiTerugjj8e3+esbg+skS3M9e54UuR3iCeIDMXCLTsAH8hTSzDQU/X6/6t3eYkOKoZSef2PlU6U1XQ==",
-          "dev": true,
-          "requires": {
-            "extend-shallow": "^2.0.1",
-            "is-number": "^3.0.0",
-            "repeat-string": "^1.6.1",
-            "to-regex-range": "^2.1.0"
-          },
-          "dependencies": {
-            "extend-shallow": {
-              "version": "2.0.1",
-              "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
-              "integrity": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==",
-              "dev": true,
-              "requires": {
-                "is-extendable": "^0.1.0"
-              }
-            }
-          }
-        },
-        "is-ci": {
-          "version": "2.0.0",
-          "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-2.0.0.tgz",
-          "integrity": "sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w==",
-          "dev": true,
-          "requires": {
-            "ci-info": "^2.0.0"
-          }
-        },
-        "is-number": {
-          "version": "3.0.0",
-          "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz",
-          "integrity": "sha512-4cboCqIpliH+mAvFNegjZQ4kgKc3ZUhQVr3HvWbSh5q3WH2v82ct+T2Y1hdU5Gdtorx/cLifQjqCbL7bpznLTg==",
-          "dev": true,
-          "requires": {
-            "kind-of": "^3.0.2"
-          },
-          "dependencies": {
-            "kind-of": {
-              "version": "3.2.2",
-              "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
-              "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==",
-              "dev": true,
-              "requires": {
-                "is-buffer": "^1.1.5"
-              }
-            }
-          }
-        },
-        "jest-message-util": {
-          "version": "24.9.0",
-          "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-24.9.0.tgz",
-          "integrity": "sha512-oCj8FiZ3U0hTP4aSui87P4L4jC37BtQwUMqk+zk/b11FR19BJDeZsZAvIHutWnmtw7r85UmR3CEWZ0HWU2mAlw==",
-          "dev": true,
-          "requires": {
-            "@babel/code-frame": "^7.0.0",
-            "@jest/test-result": "^24.9.0",
-            "@jest/types": "^24.9.0",
-            "@types/stack-utils": "^1.0.1",
-            "chalk": "^2.0.1",
-            "micromatch": "^3.1.10",
-            "slash": "^2.0.0",
-            "stack-utils": "^1.0.1"
-          }
-        },
-        "jest-mock": {
-          "version": "24.9.0",
-          "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-24.9.0.tgz",
-          "integrity": "sha512-3BEYN5WbSq9wd+SyLDES7AHnjH9A/ROBwmz7l2y+ol+NtSFO8DYiEBzoO1CeFc9a8DYy10EO4dDFVv/wN3zl1w==",
-          "dev": true,
-          "requires": {
-            "@jest/types": "^24.9.0"
-          }
-        },
-        "jest-util": {
-          "version": "24.9.0",
-          "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-24.9.0.tgz",
-          "integrity": "sha512-x+cZU8VRmOJxbA1K5oDBdxQmdq0OIdADarLxk0Mq+3XS4jgvhG/oKGWcIDCtPG0HgjxOYvF+ilPJQsAyXfbNOg==",
-          "dev": true,
-          "requires": {
-            "@jest/console": "^24.9.0",
-            "@jest/fake-timers": "^24.9.0",
-            "@jest/source-map": "^24.9.0",
-            "@jest/test-result": "^24.9.0",
-            "@jest/types": "^24.9.0",
-            "callsites": "^3.0.0",
-            "chalk": "^2.0.1",
-            "graceful-fs": "^4.1.15",
-            "is-ci": "^2.0.0",
-            "mkdirp": "^0.5.1",
-            "slash": "^2.0.0",
-            "source-map": "^0.6.0"
-          }
-        },
-        "micromatch": {
-          "version": "3.1.10",
-          "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz",
-          "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==",
-          "dev": true,
-          "requires": {
-            "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"
-          }
-        },
-        "mkdirp": {
-          "version": "0.5.6",
-          "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz",
-          "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==",
-          "dev": true,
-          "requires": {
-            "minimist": "^1.2.6"
-          }
-        },
-        "slash": {
-          "version": "2.0.0",
-          "resolved": "https://registry.npmjs.org/slash/-/slash-2.0.0.tgz",
-          "integrity": "sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A==",
-          "dev": true
-        },
-        "source-map": {
-          "version": "0.6.1",
-          "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
-          "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
-          "dev": true
-        },
-        "stack-utils": {
-          "version": "1.0.5",
-          "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-1.0.5.tgz",
-          "integrity": "sha512-KZiTzuV3CnSnSvgMRrARVCj+Ht7rMbauGDK0LdVFRGyenwdylpajAp4Q0i6SX8rEmbTpMMf6ryq2gb8pPq2WgQ==",
-          "dev": true,
-          "requires": {
-            "escape-string-regexp": "^2.0.0"
-          }
-        },
-        "to-regex-range": {
-          "version": "2.1.1",
-          "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz",
-          "integrity": "sha512-ZZWNfCjUokXXDGXFpZehJIkZqq91BcULFq/Pi7M5i4JnxXdhMKAK682z8bCW3o8Hj1wuuzoKcW3DfVzaP6VuNg==",
-          "dev": true,
-          "requires": {
-            "is-number": "^3.0.0",
-            "repeat-string": "^1.6.1"
-          }
-        }
-      }
-    },
-    "jest-snapshot": {
-      "version": "26.6.2",
-      "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-26.6.2.tgz",
-      "integrity": "sha512-OLhxz05EzUtsAmOMzuupt1lHYXCNib0ECyuZ/PZOx9TrZcC8vL0x+DUG3TL+GLX3yHG45e6YGjIm0XwDc3q3og==",
-      "dev": true,
-      "requires": {
-        "@babel/types": "^7.0.0",
-        "@jest/types": "^26.6.2",
-        "@types/babel__traverse": "^7.0.4",
-        "@types/prettier": "^2.0.0",
-        "chalk": "^4.0.0",
-        "expect": "^26.6.2",
-        "graceful-fs": "^4.2.4",
-        "jest-diff": "^26.6.2",
-        "jest-get-type": "^26.3.0",
-        "jest-haste-map": "^26.6.2",
-        "jest-matcher-utils": "^26.6.2",
-        "jest-message-util": "^26.6.2",
-        "jest-resolve": "^26.6.2",
-        "natural-compare": "^1.4.0",
-        "pretty-format": "^26.6.2",
-        "semver": "^7.3.2"
-      },
-      "dependencies": {
-        "@jest/types": {
-          "version": "26.6.2",
-          "resolved": "https://registry.npmjs.org/@jest/types/-/types-26.6.2.tgz",
-          "integrity": "sha512-fC6QCp7Sc5sX6g8Tvbmj4XUTbyrik0akgRy03yjXbQaBWWNWGE7SGtJk98m0N8nzegD/7SggrUlivxo5ax4KWQ==",
-          "dev": true,
-          "requires": {
-            "@types/istanbul-lib-coverage": "^2.0.0",
-            "@types/istanbul-reports": "^3.0.0",
-            "@types/node": "*",
-            "@types/yargs": "^15.0.0",
-            "chalk": "^4.0.0"
-          }
-        },
-        "@types/istanbul-reports": {
-          "version": "3.0.1",
-          "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.1.tgz",
-          "integrity": "sha512-c3mAZEuK0lvBp8tmuL74XRKn1+y2dcwOUpH7x4WrF6gk1GIgiluDRgMYQtw2OFcBvAJWlt6ASU3tSqxp0Uu0Aw==",
-          "dev": true,
-          "requires": {
-            "@types/istanbul-lib-report": "*"
-          }
-        },
-        "ansi-styles": {
-          "version": "4.3.0",
-          "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
-          "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
-          "dev": true,
-          "requires": {
-            "color-convert": "^2.0.1"
-          }
-        },
-        "chalk": {
-          "version": "4.1.2",
-          "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
-          "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
-          "dev": true,
-          "requires": {
-            "ansi-styles": "^4.1.0",
-            "supports-color": "^7.1.0"
-          }
-        },
-        "color-convert": {
-          "version": "2.0.1",
-          "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
-          "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
-          "dev": true,
-          "requires": {
-            "color-name": "~1.1.4"
-          }
-        },
-        "color-name": {
-          "version": "1.1.4",
-          "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
-          "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
-          "dev": true
-        },
-        "diff-sequences": {
-          "version": "26.6.2",
-          "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-26.6.2.tgz",
-          "integrity": "sha512-Mv/TDa3nZ9sbc5soK+OoA74BsS3mL37yixCvUAQkiuA4Wz6YtwP/K47n2rv2ovzHZvoiQeA5FTQOschKkEwB0Q==",
-          "dev": true
-        },
-        "has-flag": {
-          "version": "4.0.0",
-          "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
-          "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
-          "dev": true
-        },
-        "jest-diff": {
-          "version": "26.6.2",
-          "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-26.6.2.tgz",
-          "integrity": "sha512-6m+9Z3Gv9wN0WFVasqjCL/06+EFCMTqDEUl/b87HYK2rAPTyfz4ZIuSlPhY51PIQRWx5TaxeF1qmXKe9gfN3sA==",
-          "dev": true,
-          "requires": {
-            "chalk": "^4.0.0",
-            "diff-sequences": "^26.6.2",
-            "jest-get-type": "^26.3.0",
-            "pretty-format": "^26.6.2"
-          }
-        },
-        "jest-get-type": {
-          "version": "26.3.0",
-          "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-26.3.0.tgz",
-          "integrity": "sha512-TpfaviN1R2pQWkIihlfEanwOXK0zcxrKEE4MlU6Tn7keoXdN6/3gK/xl0yEh8DOunn5pOVGKf8hB4R9gVh04ig==",
-          "dev": true
-        },
-        "pretty-format": {
-          "version": "26.6.2",
-          "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-26.6.2.tgz",
-          "integrity": "sha512-7AeGuCYNGmycyQbCqd/3PWH4eOoX/OiCa0uphp57NVTeAGdJGaAliecxwBDHYQCIvrW7aDBZCYeNTP/WX69mkg==",
-          "dev": true,
-          "requires": {
-            "@jest/types": "^26.6.2",
-            "ansi-regex": "^5.0.0",
-            "ansi-styles": "^4.0.0",
-            "react-is": "^17.0.1"
-          }
-        },
-        "react-is": {
-          "version": "17.0.2",
-          "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz",
-          "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==",
-          "dev": true
-        },
-        "semver": {
-          "version": "7.3.7",
-          "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.7.tgz",
-          "integrity": "sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g==",
-          "dev": true,
-          "requires": {
-            "lru-cache": "^6.0.0"
-          }
-        },
-        "supports-color": {
-          "version": "7.2.0",
-          "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
-          "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
-          "dev": true,
-          "requires": {
-            "has-flag": "^4.0.0"
-          }
-        }
-      }
-    },
-    "jest-util": {
-      "version": "26.6.2",
-      "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-26.6.2.tgz",
-      "integrity": "sha512-MDW0fKfsn0OI7MS7Euz6h8HNDXVQ0gaM9uW6RjfDmd1DAFcaxX9OqIakHIqhbnmF08Cf2DLDG+ulq8YQQ0Lp0Q==",
-      "dev": true,
-      "requires": {
-        "@jest/types": "^26.6.2",
-        "@types/node": "*",
-        "chalk": "^4.0.0",
-        "graceful-fs": "^4.2.4",
-        "is-ci": "^2.0.0",
-        "micromatch": "^4.0.2"
-      },
-      "dependencies": {
-        "@jest/types": {
-          "version": "26.6.2",
-          "resolved": "https://registry.npmjs.org/@jest/types/-/types-26.6.2.tgz",
-          "integrity": "sha512-fC6QCp7Sc5sX6g8Tvbmj4XUTbyrik0akgRy03yjXbQaBWWNWGE7SGtJk98m0N8nzegD/7SggrUlivxo5ax4KWQ==",
-          "dev": true,
-          "requires": {
-            "@types/istanbul-lib-coverage": "^2.0.0",
-            "@types/istanbul-reports": "^3.0.0",
-            "@types/node": "*",
-            "@types/yargs": "^15.0.0",
-            "chalk": "^4.0.0"
-          }
-        },
-        "@types/istanbul-reports": {
-          "version": "3.0.1",
-          "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.1.tgz",
-          "integrity": "sha512-c3mAZEuK0lvBp8tmuL74XRKn1+y2dcwOUpH7x4WrF6gk1GIgiluDRgMYQtw2OFcBvAJWlt6ASU3tSqxp0Uu0Aw==",
-          "dev": true,
-          "requires": {
-            "@types/istanbul-lib-report": "*"
-          }
-        },
-        "ansi-styles": {
-          "version": "4.3.0",
-          "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
-          "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
-          "dev": true,
-          "requires": {
-            "color-convert": "^2.0.1"
-          }
-        },
-        "chalk": {
-          "version": "4.1.2",
-          "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
-          "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
-          "dev": true,
-          "requires": {
-            "ansi-styles": "^4.1.0",
-            "supports-color": "^7.1.0"
-          }
-        },
-        "ci-info": {
-          "version": "2.0.0",
-          "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz",
-          "integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==",
-          "dev": true
-        },
-        "color-convert": {
-          "version": "2.0.1",
-          "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
-          "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
-          "dev": true,
-          "requires": {
-            "color-name": "~1.1.4"
-          }
-        },
-        "color-name": {
-          "version": "1.1.4",
-          "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
-          "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
-          "dev": true
-        },
-        "has-flag": {
-          "version": "4.0.0",
-          "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
-          "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
-          "dev": true
-        },
-        "is-ci": {
-          "version": "2.0.0",
-          "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-2.0.0.tgz",
-          "integrity": "sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w==",
-          "dev": true,
-          "requires": {
-            "ci-info": "^2.0.0"
-          }
-        },
-        "supports-color": {
-          "version": "7.2.0",
-          "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
-          "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
-          "dev": true,
-          "requires": {
-            "has-flag": "^4.0.0"
-          }
-        }
-      }
-    },
-    "jest-validate": {
-      "version": "26.6.2",
-      "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-26.6.2.tgz",
-      "integrity": "sha512-NEYZ9Aeyj0i5rQqbq+tpIOom0YS1u2MVu6+euBsvpgIme+FOfRmoC4R5p0JiAUpaFvFy24xgrpMknarR/93XjQ==",
-      "dev": true,
-      "requires": {
-        "@jest/types": "^26.6.2",
-        "camelcase": "^6.0.0",
-        "chalk": "^4.0.0",
-        "jest-get-type": "^26.3.0",
-        "leven": "^3.1.0",
-        "pretty-format": "^26.6.2"
-      },
-      "dependencies": {
-        "@jest/types": {
-          "version": "26.6.2",
-          "resolved": "https://registry.npmjs.org/@jest/types/-/types-26.6.2.tgz",
-          "integrity": "sha512-fC6QCp7Sc5sX6g8Tvbmj4XUTbyrik0akgRy03yjXbQaBWWNWGE7SGtJk98m0N8nzegD/7SggrUlivxo5ax4KWQ==",
-          "dev": true,
-          "requires": {
-            "@types/istanbul-lib-coverage": "^2.0.0",
-            "@types/istanbul-reports": "^3.0.0",
-            "@types/node": "*",
-            "@types/yargs": "^15.0.0",
-            "chalk": "^4.0.0"
-          }
-        },
-        "@types/istanbul-reports": {
-          "version": "3.0.1",
-          "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.1.tgz",
-          "integrity": "sha512-c3mAZEuK0lvBp8tmuL74XRKn1+y2dcwOUpH7x4WrF6gk1GIgiluDRgMYQtw2OFcBvAJWlt6ASU3tSqxp0Uu0Aw==",
-          "dev": true,
-          "requires": {
-            "@types/istanbul-lib-report": "*"
-          }
-        },
-        "ansi-styles": {
-          "version": "4.3.0",
-          "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
-          "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
-          "dev": true,
-          "requires": {
-            "color-convert": "^2.0.1"
-          }
-        },
-        "camelcase": {
-          "version": "6.3.0",
-          "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz",
-          "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==",
-          "dev": true
-        },
-        "chalk": {
-          "version": "4.1.2",
-          "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
-          "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
-          "dev": true,
-          "requires": {
-            "ansi-styles": "^4.1.0",
-            "supports-color": "^7.1.0"
-          }
-        },
-        "color-convert": {
-          "version": "2.0.1",
-          "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
-          "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
-          "dev": true,
-          "requires": {
-            "color-name": "~1.1.4"
-          }
-        },
-        "color-name": {
-          "version": "1.1.4",
-          "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
-          "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
-          "dev": true
-        },
-        "has-flag": {
-          "version": "4.0.0",
-          "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
-          "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
-          "dev": true
-        },
-        "jest-get-type": {
-          "version": "26.3.0",
-          "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-26.3.0.tgz",
-          "integrity": "sha512-TpfaviN1R2pQWkIihlfEanwOXK0zcxrKEE4MlU6Tn7keoXdN6/3gK/xl0yEh8DOunn5pOVGKf8hB4R9gVh04ig==",
-          "dev": true
-        },
-        "pretty-format": {
-          "version": "26.6.2",
-          "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-26.6.2.tgz",
-          "integrity": "sha512-7AeGuCYNGmycyQbCqd/3PWH4eOoX/OiCa0uphp57NVTeAGdJGaAliecxwBDHYQCIvrW7aDBZCYeNTP/WX69mkg==",
-          "dev": true,
-          "requires": {
-            "@jest/types": "^26.6.2",
-            "ansi-regex": "^5.0.0",
-            "ansi-styles": "^4.0.0",
-            "react-is": "^17.0.1"
-          }
-        },
-        "react-is": {
-          "version": "17.0.2",
-          "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz",
-          "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==",
-          "dev": true
-        },
-        "supports-color": {
-          "version": "7.2.0",
-          "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
-          "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
-          "dev": true,
-          "requires": {
-            "has-flag": "^4.0.0"
-          }
-        }
-      }
-    },
-    "jest-watcher": {
-      "version": "26.6.2",
-      "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-26.6.2.tgz",
-      "integrity": "sha512-WKJob0P/Em2csiVthsI68p6aGKTIcsfjH9Gsx1f0A3Italz43e3ho0geSAVsmj09RWOELP1AZ/DXyJgOgDKxXQ==",
-      "dev": true,
-      "requires": {
-        "@jest/test-result": "^26.6.2",
-        "@jest/types": "^26.6.2",
-        "@types/node": "*",
-        "ansi-escapes": "^4.2.1",
-        "chalk": "^4.0.0",
-        "jest-util": "^26.6.2",
-        "string-length": "^4.0.1"
-      },
-      "dependencies": {
-        "@jest/types": {
-          "version": "26.6.2",
-          "resolved": "https://registry.npmjs.org/@jest/types/-/types-26.6.2.tgz",
-          "integrity": "sha512-fC6QCp7Sc5sX6g8Tvbmj4XUTbyrik0akgRy03yjXbQaBWWNWGE7SGtJk98m0N8nzegD/7SggrUlivxo5ax4KWQ==",
-          "dev": true,
-          "requires": {
-            "@types/istanbul-lib-coverage": "^2.0.0",
-            "@types/istanbul-reports": "^3.0.0",
-            "@types/node": "*",
-            "@types/yargs": "^15.0.0",
-            "chalk": "^4.0.0"
-          }
-        },
-        "@types/istanbul-reports": {
-          "version": "3.0.1",
-          "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.1.tgz",
-          "integrity": "sha512-c3mAZEuK0lvBp8tmuL74XRKn1+y2dcwOUpH7x4WrF6gk1GIgiluDRgMYQtw2OFcBvAJWlt6ASU3tSqxp0Uu0Aw==",
-          "dev": true,
-          "requires": {
-            "@types/istanbul-lib-report": "*"
-          }
-        },
-        "ansi-styles": {
-          "version": "4.3.0",
-          "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
-          "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
-          "dev": true,
-          "requires": {
-            "color-convert": "^2.0.1"
-          }
-        },
-        "chalk": {
-          "version": "4.1.2",
-          "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
-          "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
-          "dev": true,
-          "requires": {
-            "ansi-styles": "^4.1.0",
-            "supports-color": "^7.1.0"
-          }
-        },
-        "color-convert": {
-          "version": "2.0.1",
-          "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
-          "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
-          "dev": true,
-          "requires": {
-            "color-name": "~1.1.4"
-          }
-        },
-        "color-name": {
-          "version": "1.1.4",
-          "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
-          "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
-          "dev": true
-        },
-        "has-flag": {
-          "version": "4.0.0",
-          "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
-          "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
-          "dev": true
-        },
-        "supports-color": {
-          "version": "7.2.0",
-          "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
-          "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
-          "dev": true,
-          "requires": {
-            "has-flag": "^4.0.0"
-          }
-        }
-      }
-    },
-    "jest-worker": {
-      "version": "27.5.1",
-      "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.5.1.tgz",
-      "integrity": "sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==",
-      "dev": true,
-      "requires": {
-        "@types/node": "*",
-        "merge-stream": "^2.0.0",
-        "supports-color": "^8.0.0"
-      },
-      "dependencies": {
-        "has-flag": {
-          "version": "4.0.0",
-          "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
-          "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
-          "dev": true
-        },
-        "supports-color": {
-          "version": "8.1.1",
-          "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz",
-          "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==",
-          "dev": true,
-          "requires": {
-            "has-flag": "^4.0.0"
-          }
-        }
-      }
-    },
-    "jju": {
-      "version": "1.4.0",
-      "resolved": "https://registry.npmjs.org/jju/-/jju-1.4.0.tgz",
-      "integrity": "sha512-8wb9Yw966OSxApiCt0K3yNJL8pnNeIv+OEq2YMidz4FKP6nonSRoOXc80iXY4JaN2FC11B9qsNmDsm+ZOfMROA==",
-      "dev": true
-    },
-    "joi": {
-      "version": "17.6.0",
-      "resolved": "https://registry.npmjs.org/joi/-/joi-17.6.0.tgz",
-      "integrity": "sha512-OX5dG6DTbcr/kbMFj0KGYxuew69HPcAE3K/sZpEV2nP6e/j/C0HV+HNiBPCASxdx5T7DMoa0s8UeHWMnb6n2zw==",
-      "dev": true,
-      "requires": {
-        "@hapi/hoek": "^9.0.0",
-        "@hapi/topo": "^5.0.0",
-        "@sideway/address": "^4.1.3",
-        "@sideway/formula": "^3.0.0",
-        "@sideway/pinpoint": "^2.0.0"
-      }
-    },
-    "js-file-download": {
-      "version": "0.4.12",
-      "resolved": "https://registry.npmjs.org/js-file-download/-/js-file-download-0.4.12.tgz",
-      "integrity": "sha512-rML+NkoD08p5Dllpjo0ffy4jRHeY6Zsapvr/W86N7E0yuzAO6qa5X9+xog6zQNlH102J7IXljNY2FtS6Lj3ucg=="
-    },
-    "js-string-escape": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/js-string-escape/-/js-string-escape-1.0.1.tgz",
-      "integrity": "sha512-Smw4xcfIQ5LVjAOuJCvN/zIodzA/BBSsluuoSykP+lUvScIi4U6RJLfwHet5cxFnCswUjISV8oAXaqaJDY3chg==",
-      "dev": true
-    },
-    "js-tokens": {
-      "version": "4.0.0",
-      "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz",
-      "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ=="
-    },
-    "js-yaml": {
-      "version": "4.1.0",
-      "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz",
-      "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==",
-      "requires": {
-        "argparse": "^2.0.1"
-      }
-    },
-    "jsbn": {
-      "version": "0.1.1",
-      "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz",
-      "integrity": "sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg==",
-      "dev": true
-    },
-    "jsdom": {
-      "version": "16.7.0",
-      "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-16.7.0.tgz",
-      "integrity": "sha512-u9Smc2G1USStM+s/x1ru5Sxrl6mPYCbByG1U/hUmqaVsm4tbNyS7CicOSRyuGQYZhTu0h84qkZZQ/I+dzizSVw==",
-      "dev": true,
-      "requires": {
-        "abab": "^2.0.5",
-        "acorn": "^8.2.4",
-        "acorn-globals": "^6.0.0",
-        "cssom": "^0.4.4",
-        "cssstyle": "^2.3.0",
-        "data-urls": "^2.0.0",
-        "decimal.js": "^10.2.1",
-        "domexception": "^2.0.1",
-        "escodegen": "^2.0.0",
-        "form-data": "^3.0.0",
-        "html-encoding-sniffer": "^2.0.1",
-        "http-proxy-agent": "^4.0.1",
-        "https-proxy-agent": "^5.0.0",
-        "is-potential-custom-element-name": "^1.0.1",
-        "nwsapi": "^2.2.0",
-        "parse5": "6.0.1",
-        "saxes": "^5.0.1",
-        "symbol-tree": "^3.2.4",
-        "tough-cookie": "^4.0.0",
-        "w3c-hr-time": "^1.0.2",
-        "w3c-xmlserializer": "^2.0.0",
-        "webidl-conversions": "^6.1.0",
-        "whatwg-encoding": "^1.0.5",
-        "whatwg-mimetype": "^2.3.0",
-        "whatwg-url": "^8.5.0",
-        "ws": "^7.4.6",
-        "xml-name-validator": "^3.0.0"
-      },
-      "dependencies": {
-        "acorn-globals": {
-          "version": "6.0.0",
-          "resolved": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-6.0.0.tgz",
-          "integrity": "sha512-ZQl7LOWaF5ePqqcX4hLuv/bLXYQNfNWw2c0/yX/TsPRKamzHcTGQnlCjHT3TsmkOUVEPS3crCxiPfdzE/Trlhg==",
-          "dev": true,
-          "requires": {
-            "acorn": "^7.1.1",
-            "acorn-walk": "^7.1.1"
-          },
-          "dependencies": {
-            "acorn": {
-              "version": "7.4.1",
-              "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz",
-              "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==",
-              "dev": true
-            }
-          }
-        },
-        "acorn-walk": {
-          "version": "7.2.0",
-          "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-7.2.0.tgz",
-          "integrity": "sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA==",
-          "dev": true
-        },
-        "data-urls": {
-          "version": "2.0.0",
-          "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-2.0.0.tgz",
-          "integrity": "sha512-X5eWTSXO/BJmpdIKCRuKUgSCgAN0OwliVK3yPKbwIWU1Tdw5BRajxlzMidvh+gwko9AfQ9zIj52pzF91Q3YAvQ==",
-          "dev": true,
-          "requires": {
-            "abab": "^2.0.3",
-            "whatwg-mimetype": "^2.3.0",
-            "whatwg-url": "^8.0.0"
-          }
-        },
-        "domexception": {
-          "version": "2.0.1",
-          "resolved": "https://registry.npmjs.org/domexception/-/domexception-2.0.1.tgz",
-          "integrity": "sha512-yxJ2mFy/sibVQlu5qHjOkf9J3K6zgmCxgJ94u2EdvDOV09H+32LtRswEcUsmUWN72pVLOEnTSRaIVVzVQgS0dg==",
-          "dev": true,
-          "requires": {
-            "webidl-conversions": "^5.0.0"
-          },
-          "dependencies": {
-            "webidl-conversions": {
-              "version": "5.0.0",
-              "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-5.0.0.tgz",
-              "integrity": "sha512-VlZwKPCkYKxQgeSbH5EyngOmRp7Ww7I9rQLERETtf5ofd9pGeswWiOtogpEO850jziPRarreGxn5QIiTqpb2wA==",
-              "dev": true
-            }
-          }
-        },
-        "escodegen": {
-          "version": "2.0.0",
-          "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-2.0.0.tgz",
-          "integrity": "sha512-mmHKys/C8BFUGI+MAWNcSYoORYLMdPzjrknd2Vc+bUsjN5bXcr8EhrNB+UTqfL1y3I9c4fw2ihgtMPQLBRiQxw==",
-          "dev": true,
-          "requires": {
-            "esprima": "^4.0.1",
-            "estraverse": "^5.2.0",
-            "esutils": "^2.0.2",
-            "optionator": "^0.8.1",
-            "source-map": "~0.6.1"
-          }
-        },
-        "estraverse": {
-          "version": "5.3.0",
-          "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz",
-          "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==",
-          "dev": true
-        },
-        "form-data": {
-          "version": "3.0.1",
-          "resolved": "https://registry.npmjs.org/form-data/-/form-data-3.0.1.tgz",
-          "integrity": "sha512-RHkBKtLWUVwd7SqRIvCZMEvAMoGUp0XU+seQiZejj0COz3RI3hWP4sCv3gZWWLjJTd7rGwcsF5eKZGii0r/hbg==",
-          "dev": true,
-          "requires": {
-            "asynckit": "^0.4.0",
-            "combined-stream": "^1.0.8",
-            "mime-types": "^2.1.12"
-          }
-        },
-        "html-encoding-sniffer": {
-          "version": "2.0.1",
-          "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-2.0.1.tgz",
-          "integrity": "sha512-D5JbOMBIR/TVZkubHT+OyT2705QvogUW4IBn6nHd756OwieSF9aDYFj4dv6HHEVGYbHaLETa3WggZYWWMyy3ZQ==",
-          "dev": true,
-          "requires": {
-            "whatwg-encoding": "^1.0.5"
-          }
-        },
-        "punycode": {
-          "version": "2.1.1",
-          "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz",
-          "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==",
-          "dev": true
-        },
-        "saxes": {
-          "version": "5.0.1",
-          "resolved": "https://registry.npmjs.org/saxes/-/saxes-5.0.1.tgz",
-          "integrity": "sha512-5LBh1Tls8c9xgGjw3QrMwETmTMVk0oFgvrFSvWx62llR2hcEInrKNZ2GZCCuuy2lvWrdl5jhbpeqc5hRYKFOcw==",
-          "dev": true,
-          "requires": {
-            "xmlchars": "^2.2.0"
-          }
-        },
-        "source-map": {
-          "version": "0.6.1",
-          "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
-          "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
-          "dev": true,
-          "optional": true
-        },
-        "tough-cookie": {
-          "version": "4.0.0",
-          "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-4.0.0.tgz",
-          "integrity": "sha512-tHdtEpQCMrc1YLrMaqXXcj6AxhYi/xgit6mZu1+EDWUn+qhUf8wMQoFIy9NXuq23zAwtcB0t/MjACGR18pcRbg==",
-          "dev": true,
-          "requires": {
-            "psl": "^1.1.33",
-            "punycode": "^2.1.1",
-            "universalify": "^0.1.2"
-          }
-        },
-        "tr46": {
-          "version": "2.1.0",
-          "resolved": "https://registry.npmjs.org/tr46/-/tr46-2.1.0.tgz",
-          "integrity": "sha512-15Ih7phfcdP5YxqiB+iDtLoaTz4Nd35+IiAv0kQ5FNKHzXgdWqPoTIqEDDJmXceQt4JZk6lVPT8lnDlPpGDppw==",
-          "dev": true,
-          "requires": {
-            "punycode": "^2.1.1"
-          }
-        },
-        "universalify": {
-          "version": "0.1.2",
-          "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz",
-          "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==",
-          "dev": true
-        },
-        "w3c-xmlserializer": {
-          "version": "2.0.0",
-          "resolved": "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-2.0.0.tgz",
-          "integrity": "sha512-4tzD0mF8iSiMiNs30BiLO3EpfGLZUT2MSX/G+o7ZywDzliWQ3OPtTZ0PTC3B3ca1UAf4cJMHB+2Bf56EriJuRA==",
-          "dev": true,
-          "requires": {
-            "xml-name-validator": "^3.0.0"
-          }
-        },
-        "webidl-conversions": {
-          "version": "6.1.0",
-          "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-6.1.0.tgz",
-          "integrity": "sha512-qBIvFLGiBpLjfwmYAaHPXsn+ho5xZnGvyGvsarywGNc8VyQJUMHJ8OBKGGrPER0okBeMDaan4mNBlgBROxuI8w==",
-          "dev": true
-        },
-        "whatwg-url": {
-          "version": "8.7.0",
-          "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-8.7.0.tgz",
-          "integrity": "sha512-gAojqb/m9Q8a5IV96E3fHJM70AzCkgt4uXYX2O7EmuyOnLrViCQlsEBmF9UQIu3/aeAIp2U17rtbpZWNntQqdg==",
-          "dev": true,
-          "requires": {
-            "lodash": "^4.7.0",
-            "tr46": "^2.1.0",
-            "webidl-conversions": "^6.1.0"
-          }
-        },
-        "ws": {
-          "version": "7.5.9",
-          "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.9.tgz",
-          "integrity": "sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q==",
-          "dev": true
-        }
-      }
-    },
-    "jsesc": {
-      "version": "2.5.2",
-      "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz",
-      "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA=="
-    },
-    "json-parse-better-errors": {
-      "version": "1.0.2",
-      "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz",
-      "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==",
-      "dev": true
-    },
-    "json-parse-even-better-errors": {
-      "version": "2.3.1",
-      "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz",
-      "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==",
-      "dev": true
-    },
-    "json-parse-helpfulerror": {
-      "version": "1.0.3",
-      "resolved": "https://registry.npmjs.org/json-parse-helpfulerror/-/json-parse-helpfulerror-1.0.3.tgz",
-      "integrity": "sha512-XgP0FGR77+QhUxjXkwOMkC94k3WtqEBfcnjWqhRd82qTat4SWKRE+9kUnynz/shm3I4ea2+qISvTIeGTNU7kJg==",
-      "dev": true,
-      "requires": {
-        "jju": "^1.1.0"
-      }
-    },
-    "json-schema": {
-      "version": "0.4.0",
-      "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.4.0.tgz",
-      "integrity": "sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==",
-      "dev": true
-    },
-    "json-schema-traverse": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz",
-      "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==",
-      "dev": true
-    },
-    "json-stable-stringify": {
-      "version": "0.0.1",
-      "resolved": "https://registry.npmjs.org/json-stable-stringify/-/json-stable-stringify-0.0.1.tgz",
-      "integrity": "sha512-nKtD/Qxm7tWdZqJoldEC7fF0S41v0mWbeaXG3637stOWfyGxTgWTYE2wtfKmjzpvxv2MA2xzxsXOIiwUpkX6Qw==",
-      "dev": true,
-      "requires": {
-        "jsonify": "~0.0.0"
-      }
-    },
-    "json-stringify-safe": {
-      "version": "5.0.1",
-      "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz",
-      "integrity": "sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==",
-      "dev": true
-    },
-    "json5": {
-      "version": "2.2.1",
-      "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.1.tgz",
-      "integrity": "sha512-1hqLFMSrGHRHxav9q9gNjJ5EXznIxGVO09xQRrwplcS8qs28pZ8s8hupZAmqDwZUmVZ2Qb2jnyPOWcDH8m8dlA=="
-    },
-    "jsonc-parser": {
-      "version": "3.0.0",
-      "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.0.0.tgz",
-      "integrity": "sha512-fQzRfAbIBnR0IQvftw9FJveWiHp72Fg20giDrHz6TdfB12UH/uue0D3hm57UB5KgAVuniLMCaS8P1IMj9NR7cA==",
-      "dev": true
-    },
-    "jsonfile": {
-      "version": "6.1.0",
-      "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz",
-      "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==",
-      "dev": true,
-      "requires": {
-        "graceful-fs": "^4.1.6",
-        "universalify": "^2.0.0"
-      }
-    },
-    "jsonify": {
-      "version": "0.0.0",
-      "resolved": "https://registry.npmjs.org/jsonify/-/jsonify-0.0.0.tgz",
-      "integrity": "sha512-trvBk1ki43VZptdBI5rIlG4YOzyeH/WefQt5rj1grasPn4iiZWKet8nkgc4GlsAylaztn0qZfUYOiTsASJFdNA==",
-      "dev": true
-    },
-    "jsonparse": {
-      "version": "1.3.1",
-      "resolved": "https://registry.npmjs.org/jsonparse/-/jsonparse-1.3.1.tgz",
-      "integrity": "sha512-POQXvpdL69+CluYsillJ7SUhKvytYjW9vG/GKpnf+xP8UWgYEM/RaMzHHofbALDiKbbP1W8UEYmgGl39WkPZsg==",
-      "dev": true
-    },
-    "jsprim": {
-      "version": "1.4.2",
-      "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.2.tgz",
-      "integrity": "sha512-P2bSOMAc/ciLz6DzgjVlGJP9+BrJWu5UDGK70C2iweC5QBIeFf0ZXRvGjEj2uYgrY2MkAAhsSWHDWlFtEroZWw==",
-      "dev": true,
-      "requires": {
-        "assert-plus": "1.0.0",
-        "extsprintf": "1.3.0",
-        "json-schema": "0.4.0",
-        "verror": "1.10.0"
-      }
-    },
-    "karma-source-map-support": {
-      "version": "1.4.0",
-      "resolved": "https://registry.npmjs.org/karma-source-map-support/-/karma-source-map-support-1.4.0.tgz",
-      "integrity": "sha512-RsBECncGO17KAoJCYXjv+ckIz+Ii9NCi+9enk+rq6XC81ezYkb4/RHE6CTXdA7IOJqoF3wcaLfVG0CPmE5ca6A==",
-      "dev": true,
-      "requires": {
-        "source-map-support": "^0.5.5"
-      }
-    },
-    "killable": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/killable/-/killable-1.0.1.tgz",
-      "integrity": "sha512-LzqtLKlUwirEUyl/nicirVmNiPvYs7l5n8wOPP7fyJVpUPkvCnW/vuiXGpylGUlnPDnB7311rARzAt3Mhswpjg==",
-      "dev": true
-    },
-    "kind-of": {
-      "version": "6.0.3",
-      "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz",
-      "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==",
-      "dev": true
-    },
-    "kleur": {
-      "version": "3.0.3",
-      "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz",
-      "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==",
-      "dev": true
-    },
-    "klona": {
-      "version": "2.0.5",
-      "resolved": "https://registry.npmjs.org/klona/-/klona-2.0.5.tgz",
-      "integrity": "sha512-pJiBpiXMbt7dkzXe8Ghj/u4FfXOOa98fPW+bihOJ4SjnoijweJrNThJfd3ifXpXhREjpoF2mZVH1GfS9LV3kHQ==",
-      "dev": true
-    },
-    "known-css-properties": {
-      "version": "0.21.0",
-      "resolved": "https://registry.npmjs.org/known-css-properties/-/known-css-properties-0.21.0.tgz",
-      "integrity": "sha512-sZLUnTqimCkvkgRS+kbPlYW5o8q5w1cu+uIisKpEWkj31I8mx8kNG162DwRav8Zirkva6N5uoFsm9kzK4mUXjw==",
-      "dev": true
-    },
-    "knuth-shuffle-seeded": {
-      "version": "1.0.6",
-      "resolved": "https://registry.npmjs.org/knuth-shuffle-seeded/-/knuth-shuffle-seeded-1.0.6.tgz",
-      "integrity": "sha512-9pFH0SplrfyKyojCLxZfMcvkhf5hH0d+UwR9nTVJ/DDQJGuzcXjTwB7TP7sDfehSudlGGaOLblmEWqv04ERVWg==",
-      "dev": true,
-      "requires": {
-        "seed-random": "~2.2.0"
-      }
-    },
-    "labeled-stream-splicer": {
-      "version": "2.0.2",
-      "resolved": "https://registry.npmjs.org/labeled-stream-splicer/-/labeled-stream-splicer-2.0.2.tgz",
-      "integrity": "sha512-Ca4LSXFFZUjPScRaqOcFxneA0VpKZr4MMYCljyQr4LIewTLb3Y0IUTIsnBBsVubIeEfxeSZpSjSsRM8APEQaAw==",
-      "dev": true,
-      "requires": {
-        "inherits": "^2.0.1",
-        "stream-splicer": "^2.0.0"
-      }
-    },
-    "lazy-ass": {
-      "version": "1.6.0",
-      "resolved": "https://registry.npmjs.org/lazy-ass/-/lazy-ass-1.6.0.tgz",
-      "integrity": "sha512-cc8oEVoctTvsFZ/Oje/kGnHbpWHYBe8IAJe4C0QNc3t8uM/0Y8+erSz/7Y1ALuXTEZTMvxXwO6YbX1ey3ujiZw==",
-      "dev": true
-    },
-    "lcid": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/lcid/-/lcid-2.0.0.tgz",
-      "integrity": "sha512-avPEb8P8EGnwXKClwsNUgryVjllcRqtMYa49NTsbQagYuT1DcXnl1915oxWjoyGrXR6zH/Y0Zc96xWsPcoDKeA==",
-      "dev": true,
-      "requires": {
-        "invert-kv": "^2.0.0"
-      }
-    },
-    "less": {
-      "version": "4.1.1",
-      "resolved": "https://registry.npmjs.org/less/-/less-4.1.1.tgz",
-      "integrity": "sha512-w09o8tZFPThBscl5d0Ggp3RcrKIouBoQscnOMgFH3n5V3kN/CXGHNfCkRPtxJk6nKryDXaV9aHLK55RXuH4sAw==",
-      "dev": true,
-      "requires": {
-        "copy-anything": "^2.0.1",
-        "errno": "^0.1.1",
-        "graceful-fs": "^4.1.2",
-        "image-size": "~0.5.0",
-        "make-dir": "^2.1.0",
-        "mime": "^1.4.1",
-        "needle": "^2.5.2",
-        "parse-node-version": "^1.0.1",
-        "source-map": "~0.6.0",
-        "tslib": "^1.10.0"
-      },
-      "dependencies": {
-        "make-dir": {
-          "version": "2.1.0",
-          "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz",
-          "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==",
-          "dev": true,
-          "optional": true,
-          "requires": {
-            "pify": "^4.0.1",
-            "semver": "^5.6.0"
-          }
-        },
-        "source-map": {
-          "version": "0.6.1",
-          "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
-          "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
-          "dev": true,
-          "optional": true
-        },
-        "tslib": {
-          "version": "1.14.1",
-          "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz",
-          "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==",
-          "dev": true
-        }
-      }
-    },
-    "less-loader": {
-      "version": "10.0.1",
-      "resolved": "https://registry.npmjs.org/less-loader/-/less-loader-10.0.1.tgz",
-      "integrity": "sha512-Crln//HpW9M5CbtdfWm3IO66Cvx1WhZQvNybXgfB2dD/6Sav9ppw+IWqs/FQKPBFO4B6X0X28Z0WNznshgwUzA==",
-      "dev": true,
-      "requires": {
-        "klona": "^2.0.4"
-      }
-    },
-    "leven": {
-      "version": "3.1.0",
-      "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz",
-      "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==",
-      "dev": true
-    },
-    "levn": {
-      "version": "0.3.0",
-      "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz",
-      "integrity": "sha512-0OO4y2iOHix2W6ujICbKIaEQXvFQHue65vUG3pb5EUomzPI90z9hsA1VsO/dbIIpC53J8gxM9Q4Oho0jrCM/yA==",
-      "dev": true,
-      "requires": {
-        "prelude-ls": "~1.1.2",
-        "type-check": "~0.3.2"
-      }
-    },
-    "license-webpack-plugin": {
-      "version": "2.3.20",
-      "resolved": "https://registry.npmjs.org/license-webpack-plugin/-/license-webpack-plugin-2.3.20.tgz",
-      "integrity": "sha512-AHVueg9clOKACSHkhmEI+PCC9x8+qsQVuKECZD3ETxETK5h/PCv5/MUzyG1gm8OMcip/s1tcNxqo9Qb7WhjGsg==",
-      "dev": true,
-      "requires": {
-        "@types/webpack-sources": "^0.1.5",
-        "webpack-sources": "^1.2.0"
-      }
-    },
-    "liftoff": {
-      "version": "2.5.0",
-      "resolved": "https://registry.npmjs.org/liftoff/-/liftoff-2.5.0.tgz",
-      "integrity": "sha512-01zfGFqfORP1CGmZZP2Zn51zsqz4RltDi0RDOhbGoLYdUT5Lw+I2gX6QdwXhPITF6hPOHEOp+At6/L24hIg9WQ==",
-      "dev": true,
-      "requires": {
-        "extend": "^3.0.0",
-        "findup-sync": "^2.0.0",
-        "fined": "^1.0.1",
-        "flagged-respawn": "^1.0.0",
-        "is-plain-object": "^2.0.4",
-        "object.map": "^1.0.0",
-        "rechoir": "^0.6.2",
-        "resolve": "^1.1.7"
-      },
-      "dependencies": {
-        "is-plain-object": {
-          "version": "2.0.4",
-          "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz",
-          "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==",
-          "dev": true,
-          "requires": {
-            "isobject": "^3.0.1"
-          }
-        }
-      }
-    },
-    "lilconfig": {
-      "version": "2.0.6",
-      "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-2.0.6.tgz",
-      "integrity": "sha512-9JROoBW7pobfsx+Sq2JsASvCo6Pfo6WWoUW79HuB1BCoBXD4PLWJPqDF6fNj67pqBYTbAHkE57M1kS/+L1neOg==",
-      "dev": true
-    },
-    "lines-and-columns": {
-      "version": "1.2.4",
-      "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz",
-      "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==",
-      "dev": true
-    },
-    "listr2": {
-      "version": "3.14.0",
-      "resolved": "https://registry.npmjs.org/listr2/-/listr2-3.14.0.tgz",
-      "integrity": "sha512-TyWI8G99GX9GjE54cJ+RrNMcIFBfwMPxc3XTFiAYGN4s10hWROGtOg7+O6u6LE3mNkyld7RSLE6nrKBvTfcs3g==",
-      "dev": true,
-      "requires": {
-        "cli-truncate": "^2.1.0",
-        "colorette": "^2.0.16",
-        "log-update": "^4.0.0",
-        "p-map": "^4.0.0",
-        "rfdc": "^1.3.0",
-        "rxjs": "^7.5.1",
-        "through": "^2.3.8",
-        "wrap-ansi": "^7.0.0"
-      },
-      "dependencies": {
-        "colorette": {
-          "version": "2.0.19",
-          "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.19.tgz",
-          "integrity": "sha512-3tlv/dIP7FWvj3BsbHrGLJ6l/oKh1O3TcgBqMn+yyCagOxc23fyzDS6HypQbgxWbkpDnf52p1LuR4eWDQ/K9WQ==",
-          "dev": true
-        },
-        "rxjs": {
-          "version": "7.5.6",
-          "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.5.6.tgz",
-          "integrity": "sha512-dnyv2/YsXhnm461G+R/Pe5bWP41Nm6LBXEYWI6eiFP4fiwx6WRI/CD0zbdVAudd9xwLEF2IDcKXLHit0FYjUzw==",
-          "dev": true,
-          "requires": {
-            "tslib": "^2.1.0"
-          }
-        }
-      }
-    },
-    "load-json-file": {
-      "version": "4.0.0",
-      "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-4.0.0.tgz",
-      "integrity": "sha512-Kx8hMakjX03tiGTLAIdJ+lL0htKnXjEZN6hk/tozf/WOuYGdZBJrZ+rCJRbVCugsjB3jMLn9746NsQIf5VjBMw==",
-      "dev": true,
-      "requires": {
-        "graceful-fs": "^4.1.2",
-        "parse-json": "^4.0.0",
-        "pify": "^3.0.0",
-        "strip-bom": "^3.0.0"
-      },
-      "dependencies": {
-        "parse-json": {
-          "version": "4.0.0",
-          "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz",
-          "integrity": "sha512-aOIos8bujGN93/8Ox/jPLh7RwVnPEysynVFE+fQZyg6jKELEHwzgKdLRFHUgXJL6kylijVSBC4BvN9OmsB48Rw==",
-          "dev": true,
-          "requires": {
-            "error-ex": "^1.3.1",
-            "json-parse-better-errors": "^1.0.1"
-          }
-        },
-        "pify": {
-          "version": "3.0.0",
-          "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz",
-          "integrity": "sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg==",
-          "dev": true
-        },
-        "strip-bom": {
-          "version": "3.0.0",
-          "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz",
-          "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==",
-          "dev": true
-        }
-      }
-    },
-    "loader-runner": {
-      "version": "4.3.0",
-      "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.3.0.tgz",
-      "integrity": "sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg==",
-      "dev": true
-    },
-    "loader-utils": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.0.tgz",
-      "integrity": "sha512-rP4F0h2RaWSvPEkD7BLDFQnvSf+nK+wr3ESUjNTyAGobqrijmW92zc+SO6d4p4B1wh7+B/Jg1mkQe5NYUEHtHQ==",
-      "dev": true,
-      "requires": {
-        "big.js": "^5.2.2",
-        "emojis-list": "^3.0.0",
-        "json5": "^2.1.2"
-      }
-    },
-    "locate-path": {
-      "version": "5.0.0",
-      "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz",
-      "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==",
-      "dev": true,
-      "requires": {
-        "p-locate": "^4.1.0"
-      }
-    },
-    "lodash": {
-      "version": "4.17.21",
-      "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz",
-      "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg=="
-    },
-    "lodash-es": {
-      "version": "4.17.21",
-      "resolved": "https://registry.npmjs.org/lodash-es/-/lodash-es-4.17.21.tgz",
-      "integrity": "sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw=="
-    },
-    "lodash.clonedeep": {
-      "version": "4.5.0",
-      "resolved": "https://registry.npmjs.org/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz",
-      "integrity": "sha512-H5ZhCF25riFd9uB5UCkVKo61m3S/xZk1x4wA6yp/L3RFP6Z/eHH1ymQcGLo7J3GMPfm0V/7m1tryHuGVxpqEBQ==",
-      "dev": true
-    },
-    "lodash.debounce": {
-      "version": "4.0.8",
-      "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz",
-      "integrity": "sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow=="
-    },
-    "lodash.flatten": {
-      "version": "4.4.0",
-      "resolved": "https://registry.npmjs.org/lodash.flatten/-/lodash.flatten-4.4.0.tgz",
-      "integrity": "sha512-C5N2Z3DgnnKr0LOpv/hKCgKdb7ZZwafIrsesve6lmzvZIRZRGaZ/l6Q8+2W7NaT+ZwO3fFlSCzCzrDCFdJfZ4g==",
-      "dev": true
-    },
-    "lodash.mapvalues": {
-      "version": "4.6.0",
-      "resolved": "https://registry.npmjs.org/lodash.mapvalues/-/lodash.mapvalues-4.6.0.tgz",
-      "integrity": "sha512-JPFqXFeZQ7BfS00H58kClY7SPVeHertPE0lNuCyZ26/XlN8TvakYD7b9bGyNmXbT/D3BbtPAAmq90gPWqLkxlQ==",
-      "dev": true
-    },
-    "lodash.memoize": {
-      "version": "4.1.2",
-      "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz",
-      "integrity": "sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag=="
-    },
-    "lodash.merge": {
-      "version": "4.6.2",
-      "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz",
-      "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==",
-      "dev": true
-    },
-    "lodash.once": {
-      "version": "4.1.1",
-      "resolved": "https://registry.npmjs.org/lodash.once/-/lodash.once-4.1.1.tgz",
-      "integrity": "sha512-Sb487aTOCr9drQVL8pIxOzVhafOjZN9UU54hiN8PU3uAiSV7lx1yYNpbNmex2PK6dSJoNTSJUUswT651yww3Mg==",
-      "dev": true
-    },
-    "lodash.sortby": {
-      "version": "4.7.0",
-      "resolved": "https://registry.npmjs.org/lodash.sortby/-/lodash.sortby-4.7.0.tgz",
-      "integrity": "sha512-HDWXG8isMntAyRF5vZ7xKuEvOhT4AhlRt/3czTSjvGUxjYCBVRQY48ViDHyfYz9VIoBkW4TMGQNapx+l3RUwdA==",
-      "dev": true
-    },
-    "lodash.throttle": {
-      "version": "4.1.1",
-      "resolved": "https://registry.npmjs.org/lodash.throttle/-/lodash.throttle-4.1.1.tgz",
-      "integrity": "sha512-wIkUCfVKpVsWo3JSZlc+8MB5it+2AN5W8J7YVMST30UrvcQNZ1Okbj+rbVniijTWE6FGYy4XJq/rHkas8qJMLQ=="
-    },
-    "lodash.truncate": {
-      "version": "4.4.2",
-      "resolved": "https://registry.npmjs.org/lodash.truncate/-/lodash.truncate-4.4.2.tgz",
-      "integrity": "sha512-jttmRe7bRse52OsWIMDLaXxWqRAmtIUccAQ3garviCqJjafXOfNMO0yMfNpdD6zbGaTU0P5Nz7e7gAT6cKmJRw==",
-      "dev": true
-    },
-    "lodash.uniq": {
-      "version": "4.5.0",
-      "resolved": "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz",
-      "integrity": "sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ==",
-      "dev": true
-    },
-    "log-symbols": {
-      "version": "4.1.0",
-      "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz",
-      "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==",
-      "dev": true,
-      "requires": {
-        "chalk": "^4.1.0",
-        "is-unicode-supported": "^0.1.0"
-      },
-      "dependencies": {
-        "ansi-styles": {
-          "version": "4.3.0",
-          "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
-          "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
-          "dev": true,
-          "requires": {
-            "color-convert": "^2.0.1"
-          }
-        },
-        "chalk": {
-          "version": "4.1.2",
-          "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
-          "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
-          "dev": true,
-          "requires": {
-            "ansi-styles": "^4.1.0",
-            "supports-color": "^7.1.0"
-          }
-        },
-        "color-convert": {
-          "version": "2.0.1",
-          "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
-          "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
-          "dev": true,
-          "requires": {
-            "color-name": "~1.1.4"
-          }
-        },
-        "color-name": {
-          "version": "1.1.4",
-          "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
-          "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
-          "dev": true
-        },
-        "has-flag": {
-          "version": "4.0.0",
-          "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
-          "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
-          "dev": true
-        },
-        "supports-color": {
-          "version": "7.2.0",
-          "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
-          "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
-          "dev": true,
-          "requires": {
-            "has-flag": "^4.0.0"
-          }
-        }
-      }
-    },
-    "log-update": {
-      "version": "4.0.0",
-      "resolved": "https://registry.npmjs.org/log-update/-/log-update-4.0.0.tgz",
-      "integrity": "sha512-9fkkDevMefjg0mmzWFBW8YkFP91OrizzkW3diF7CpG+S2EYdy4+TVfGwz1zeF8x7hCx1ovSPTOE9Ngib74qqUg==",
-      "dev": true,
-      "requires": {
-        "ansi-escapes": "^4.3.0",
-        "cli-cursor": "^3.1.0",
-        "slice-ansi": "^4.0.0",
-        "wrap-ansi": "^6.2.0"
-      },
-      "dependencies": {
-        "ansi-styles": {
-          "version": "4.3.0",
-          "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
-          "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
-          "dev": true,
-          "requires": {
-            "color-convert": "^2.0.1"
-          }
-        },
-        "color-convert": {
-          "version": "2.0.1",
-          "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
-          "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
-          "dev": true,
-          "requires": {
-            "color-name": "~1.1.4"
-          }
-        },
-        "color-name": {
-          "version": "1.1.4",
-          "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
-          "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
-          "dev": true
-        },
-        "slice-ansi": {
-          "version": "4.0.0",
-          "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz",
-          "integrity": "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==",
-          "dev": true,
-          "requires": {
-            "ansi-styles": "^4.0.0",
-            "astral-regex": "^2.0.0",
-            "is-fullwidth-code-point": "^3.0.0"
-          }
-        },
-        "wrap-ansi": {
-          "version": "6.2.0",
-          "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz",
-          "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==",
-          "dev": true,
-          "requires": {
-            "ansi-styles": "^4.0.0",
-            "string-width": "^4.1.0",
-            "strip-ansi": "^6.0.0"
-          }
-        }
-      }
-    },
-    "log4js": {
-      "version": "1.1.1",
-      "resolved": "https://registry.npmjs.org/log4js/-/log4js-1.1.1.tgz",
-      "integrity": "sha512-lYb14ZSs1M/CUFuvy7Zk3VZLDtqrqOaVql9CE0tv8g6/qE1Gfq97XKdltBsjSxxvcJ+t8fAXOnvFxSsms7gGVg==",
-      "dev": true,
-      "requires": {
-        "debug": "^2.2.0",
-        "semver": "^5.3.0",
-        "streamroller": "^0.4.0"
-      },
-      "dependencies": {
-        "debug": {
-          "version": "2.6.9",
-          "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
-          "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
-          "dev": true,
-          "requires": {
-            "ms": "2.0.0"
-          }
-        },
-        "ms": {
-          "version": "2.0.0",
-          "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
-          "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==",
-          "dev": true
-        }
-      }
-    },
-    "loglevel": {
-      "version": "1.8.0",
-      "resolved": "https://registry.npmjs.org/loglevel/-/loglevel-1.8.0.tgz",
-      "integrity": "sha512-G6A/nJLRgWOuuwdNuA6koovfEV1YpqqAG4pRUlFaz3jj2QNZ8M4vBqnVA+HBTmU/AMNUtlOsMmSpF6NyOjztbA==",
-      "dev": true
-    },
-    "loglevel-plugin-prefix": {
-      "version": "0.8.4",
-      "resolved": "https://registry.npmjs.org/loglevel-plugin-prefix/-/loglevel-plugin-prefix-0.8.4.tgz",
-      "integrity": "sha512-WpG9CcFAOjz/FtNht+QJeGpvVl/cdR6P0z6OcXSkr8wFJOsV2GRj2j10JLfjuA4aYkcKCNIEqRGCyTife9R8/g==",
-      "dev": true
-    },
-    "long": {
-      "version": "4.0.0",
-      "resolved": "https://registry.npmjs.org/long/-/long-4.0.0.tgz",
-      "integrity": "sha512-XsP+KhQif4bjX1kbuSiySJFNAehNxgLb6hPRGJ9QsUr8ajHkuXGdrHmFUTUUXhDwVX2R5bY4JNZEwbUiMhV+MA==",
-      "dev": true
-    },
-    "longest-streak": {
-      "version": "2.0.4",
-      "resolved": "https://registry.npmjs.org/longest-streak/-/longest-streak-2.0.4.tgz",
-      "integrity": "sha512-vM6rUVCVUJJt33bnmHiZEvr7wPT78ztX7rojL+LW51bHtLh6HTjx84LA5W4+oa6aKEJA7jJu5LR6vQRBpA5DVg==",
-      "dev": true
-    },
-    "loose-envify": {
-      "version": "1.4.0",
-      "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz",
-      "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==",
-      "requires": {
-        "js-tokens": "^3.0.0 || ^4.0.0"
-      }
-    },
-    "loupe": {
-      "version": "2.3.4",
-      "resolved": "https://registry.npmjs.org/loupe/-/loupe-2.3.4.tgz",
-      "integrity": "sha512-OvKfgCC2Ndby6aSTREl5aCCPTNIzlDfQZvZxNUrBrihDhL3xcrYegTblhmEiCrg2kKQz4XsFIaemE5BF4ybSaQ==",
-      "dev": true,
-      "requires": {
-        "get-func-name": "^2.0.0"
-      }
-    },
-    "lower-case": {
-      "version": "1.1.4",
-      "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-1.1.4.tgz",
-      "integrity": "sha512-2Fgx1Ycm599x+WGpIYwJOvsjmXFzTSc34IwDWALRA/8AopUKAVPwfJ+h5+f85BCp0PWmmJcWzEpxOpoXycMpdA==",
-      "dev": true
-    },
-    "lowlight": {
-      "version": "1.20.0",
-      "resolved": "https://registry.npmjs.org/lowlight/-/lowlight-1.20.0.tgz",
-      "integrity": "sha512-8Ktj+prEb1RoCPkEOrPMYUN/nCggB7qAWe3a7OpMjWQkh3l2RD5wKRQ+o8Q8YuI9RG/xs95waaI/E6ym/7NsTw==",
-      "requires": {
-        "fault": "^1.0.0",
-        "highlight.js": "~10.7.0"
-      }
-    },
-    "lru-cache": {
-      "version": "6.0.0",
-      "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz",
-      "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==",
-      "dev": true,
-      "requires": {
-        "yallist": "^4.0.0"
-      }
-    },
-    "lunr": {
-      "version": "2.3.9",
-      "resolved": "https://registry.npmjs.org/lunr/-/lunr-2.3.9.tgz",
-      "integrity": "sha512-zTU3DaZaF3Rt9rhN3uBMGQD3dD2/vFQqnvZCDv4dl5iOzq2IZQqTxu90r4E5J+nP70J3ilqVCrbho2eWaeW8Ow==",
-      "dev": true
-    },
-    "macos-release": {
-      "version": "2.5.0",
-      "resolved": "https://registry.npmjs.org/macos-release/-/macos-release-2.5.0.tgz",
-      "integrity": "sha512-EIgv+QZ9r+814gjJj0Bt5vSLJLzswGmSUbUpbi9AIr/fsN2IWFBl2NucV9PAiek+U1STK468tEkxmVYUtuAN3g==",
-      "dev": true
-    },
-    "magic-string": {
-      "version": "0.25.7",
-      "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.25.7.tgz",
-      "integrity": "sha512-4CrMT5DOHTDk4HYDlzmwu4FVCcIYI8gauveasrdCu2IKIFOJ3f0v/8MDGJCDL9oD2ppz/Av1b0Nj345H9M+XIA==",
-      "dev": true,
-      "requires": {
-        "sourcemap-codec": "^1.4.4"
-      }
-    },
-    "make-dir": {
-      "version": "3.1.0",
-      "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz",
-      "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==",
-      "dev": true,
-      "requires": {
-        "semver": "^6.0.0"
-      },
-      "dependencies": {
-        "semver": {
-          "version": "6.3.0",
-          "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
-          "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==",
-          "dev": true
-        }
-      }
-    },
-    "make-error": {
-      "version": "1.3.6",
-      "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz",
-      "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==",
-      "dev": true
-    },
-    "make-fetch-happen": {
-      "version": "9.1.0",
-      "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-9.1.0.tgz",
-      "integrity": "sha512-+zopwDy7DNknmwPQplem5lAZX/eCOzSvSNNcSKm5eVwTkOBzoktEfXsa9L23J/GIRhxRsaxzkPEhrJEpE2F4Gg==",
-      "dev": true,
-      "requires": {
-        "agentkeepalive": "^4.1.3",
-        "cacache": "^15.2.0",
-        "http-cache-semantics": "^4.1.0",
-        "http-proxy-agent": "^4.0.1",
-        "https-proxy-agent": "^5.0.0",
-        "is-lambda": "^1.0.1",
-        "lru-cache": "^6.0.0",
-        "minipass": "^3.1.3",
-        "minipass-collect": "^1.0.2",
-        "minipass-fetch": "^1.3.2",
-        "minipass-flush": "^1.0.5",
-        "minipass-pipeline": "^1.2.4",
-        "negotiator": "^0.6.2",
-        "promise-retry": "^2.0.1",
-        "socks-proxy-agent": "^6.0.0",
-        "ssri": "^8.0.0"
-      }
-    },
-    "make-iterator": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/make-iterator/-/make-iterator-1.0.1.tgz",
-      "integrity": "sha512-pxiuXh0iVEq7VM7KMIhs5gxsfxCux2URptUQaXo4iZZJxBAzTPOLE2BumO5dbfVYq/hBJFBR/a1mFDmOx5AGmw==",
-      "dev": true,
-      "requires": {
-        "kind-of": "^6.0.2"
-      }
-    },
-    "makeerror": {
-      "version": "1.0.12",
-      "resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.12.tgz",
-      "integrity": "sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==",
-      "dev": true,
-      "requires": {
-        "tmpl": "1.0.5"
-      }
-    },
-    "map-age-cleaner": {
-      "version": "0.1.3",
-      "resolved": "https://registry.npmjs.org/map-age-cleaner/-/map-age-cleaner-0.1.3.tgz",
-      "integrity": "sha512-bJzx6nMoP6PDLPBFmg7+xRKeFZvFboMrGlxmNj9ClvX53KrmvM5bXFXEWjbz4cz1AFn+jWJ9z/DJSz7hrs0w3w==",
-      "dev": true,
-      "requires": {
-        "p-defer": "^1.0.0"
-      }
-    },
-    "map-cache": {
-      "version": "0.2.2",
-      "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz",
-      "integrity": "sha512-8y/eV9QQZCiyn1SprXSrCmqJN0yNRATe+PO8ztwqrvrbdRLA3eYJF0yaR0YayLWkMbsQSKWS9N2gPcGEc4UsZg==",
-      "dev": true
-    },
-    "map-obj": {
-      "version": "4.3.0",
-      "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-4.3.0.tgz",
-      "integrity": "sha512-hdN1wVrZbb29eBGiGjJbeP8JbKjq1urkHJ/LIP/NY48MZ1QVXUsQBV1G1zvYFHn1XE06cwjBsOI2K3Ulnj1YXQ==",
-      "dev": true
-    },
-    "map-stream": {
-      "version": "0.0.7",
-      "resolved": "https://registry.npmjs.org/map-stream/-/map-stream-0.0.7.tgz",
-      "integrity": "sha512-C0X0KQmGm3N2ftbTGBhSyuydQ+vV1LC3f3zPvT3RXHXNZrvfPZcoXp/N5DOa8vedX/rTMm2CjTtivFg2STJMRQ==",
-      "dev": true
-    },
-    "map-visit": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz",
-      "integrity": "sha512-4y7uGv8bd2WdM9vpQsiQNo41Ln1NvhvDRuVt0k2JZQ+ezN2uaQes7lZeZ+QQUHOLQAtDaBJ+7wCbi+ab/KFs+w==",
-      "dev": true,
-      "requires": {
-        "object-visit": "^1.0.0"
-      }
-    },
-    "marked": {
-      "version": "3.0.8",
-      "resolved": "https://registry.npmjs.org/marked/-/marked-3.0.8.tgz",
-      "integrity": "sha512-0gVrAjo5m0VZSJb4rpL59K1unJAMb/hm8HRXqasD8VeC8m91ytDPMritgFSlKonfdt+rRYYpP/JfLxgIX8yoSw==",
-      "dev": true
-    },
-    "mathml-tag-names": {
-      "version": "2.1.3",
-      "resolved": "https://registry.npmjs.org/mathml-tag-names/-/mathml-tag-names-2.1.3.tgz",
-      "integrity": "sha512-APMBEanjybaPzUrfqU0IMU5I0AswKMH7k8OTLs0vvV4KZpExkTkY87nR/zpbuTPj+gARop7aGUbl11pnDfW6xg==",
-      "dev": true
-    },
-    "md5": {
-      "version": "2.3.0",
-      "resolved": "https://registry.npmjs.org/md5/-/md5-2.3.0.tgz",
-      "integrity": "sha512-T1GITYmFaKuO91vxyoQMFETst+O71VUPEU3ze5GNzDm0OWdP8v1ziTaAEPUr/3kLsY3Sftgz242A1SetQiDL7g==",
-      "dev": true,
-      "requires": {
-        "charenc": "0.0.2",
-        "crypt": "0.0.2",
-        "is-buffer": "~1.1.6"
-      }
-    },
-    "md5.js": {
-      "version": "1.3.5",
-      "resolved": "https://registry.npmjs.org/md5.js/-/md5.js-1.3.5.tgz",
-      "integrity": "sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg==",
-      "dev": true,
-      "requires": {
-        "hash-base": "^3.0.0",
-        "inherits": "^2.0.1",
-        "safe-buffer": "^5.1.2"
-      }
-    },
-    "mdast-util-from-markdown": {
-      "version": "0.8.5",
-      "resolved": "https://registry.npmjs.org/mdast-util-from-markdown/-/mdast-util-from-markdown-0.8.5.tgz",
-      "integrity": "sha512-2hkTXtYYnr+NubD/g6KGBS/0mFmBcifAsI0yIWRiRo0PjVs6SSOSOdtzbp6kSGnShDN6G5aWZpKQ2lWRy27mWQ==",
-      "dev": true,
-      "requires": {
-        "@types/mdast": "^3.0.0",
-        "mdast-util-to-string": "^2.0.0",
-        "micromark": "~2.11.0",
-        "parse-entities": "^2.0.0",
-        "unist-util-stringify-position": "^2.0.0"
-      }
-    },
-    "mdast-util-to-markdown": {
-      "version": "0.6.5",
-      "resolved": "https://registry.npmjs.org/mdast-util-to-markdown/-/mdast-util-to-markdown-0.6.5.tgz",
-      "integrity": "sha512-XeV9sDE7ZlOQvs45C9UKMtfTcctcaj/pGwH8YLbMHoMOXNNCn2LsqVQOqrF1+/NU8lKDAqozme9SCXWyo9oAcQ==",
-      "dev": true,
-      "requires": {
-        "@types/unist": "^2.0.0",
-        "longest-streak": "^2.0.0",
-        "mdast-util-to-string": "^2.0.0",
-        "parse-entities": "^2.0.0",
-        "repeat-string": "^1.0.0",
-        "zwitch": "^1.0.0"
-      }
-    },
-    "mdast-util-to-string": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/mdast-util-to-string/-/mdast-util-to-string-2.0.0.tgz",
-      "integrity": "sha512-AW4DRS3QbBayY/jJmD8437V1Gombjf8RSOUCMFBuo5iHi58AGEgVCKQ+ezHkZZDpAQS75hcBMpLqjpJTjtUL7w==",
-      "dev": true
-    },
-    "mdn-data": {
-      "version": "2.0.14",
-      "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.14.tgz",
-      "integrity": "sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow==",
-      "dev": true
-    },
-    "media-typer": {
-      "version": "0.3.0",
-      "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz",
-      "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==",
-      "dev": true
-    },
-    "mem": {
-      "version": "8.1.1",
-      "resolved": "https://registry.npmjs.org/mem/-/mem-8.1.1.tgz",
-      "integrity": "sha512-qFCFUDs7U3b8mBDPyz5EToEKoAkgCzqquIgi9nkkR9bixxOVOre+09lbuH7+9Kn2NFpm56M3GUWVbU2hQgdACA==",
-      "dev": true,
-      "requires": {
-        "map-age-cleaner": "^0.1.3",
-        "mimic-fn": "^3.1.0"
-      },
-      "dependencies": {
-        "mimic-fn": {
-          "version": "3.1.0",
-          "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-3.1.0.tgz",
-          "integrity": "sha512-Ysbi9uYW9hFyfrThdDEQuykN4Ey6BuwPD2kpI5ES/nFTDn/98yxYNLZJcgUAKPT/mcrLLKaGzJR9YVxJrIdASQ==",
-          "dev": true
-        }
-      }
-    },
-    "memfs": {
-      "version": "3.4.7",
-      "resolved": "https://registry.npmjs.org/memfs/-/memfs-3.4.7.tgz",
-      "integrity": "sha512-ygaiUSNalBX85388uskeCyhSAoOSgzBbtVCr9jA2RROssFL9Q19/ZXFqS+2Th2sr1ewNIWgFdLzLC3Yl1Zv+lw==",
-      "dev": true,
-      "requires": {
-        "fs-monkey": "^1.0.3"
-      }
-    },
-    "memory-fs": {
-      "version": "0.4.1",
-      "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.4.1.tgz",
-      "integrity": "sha512-cda4JKCxReDXFXRqOHPQscuIYg1PvxbE2S2GP45rnwfEK+vZaXC8C1OFvdHIbgw0DLzowXGVoxLaAmlgRy14GQ==",
-      "dev": true,
-      "requires": {
-        "errno": "^0.1.3",
-        "readable-stream": "^2.0.1"
-      },
-      "dependencies": {
-        "readable-stream": {
-          "version": "2.3.7",
-          "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz",
-          "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==",
-          "dev": true,
-          "requires": {
-            "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"
-          }
-        },
-        "string_decoder": {
-          "version": "1.1.1",
-          "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz",
-          "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
-          "dev": true,
-          "requires": {
-            "safe-buffer": "~5.1.0"
-          }
-        }
-      }
-    },
-    "memorystream": {
-      "version": "0.3.1",
-      "resolved": "https://registry.npmjs.org/memorystream/-/memorystream-0.3.1.tgz",
-      "integrity": "sha512-S3UwM3yj5mtUSEfP41UZmt/0SCoVYUcU1rkXv+BQ5Ig8ndL4sPoJNBUJERafdPb5jjHJGuMgytgKvKIf58XNBw==",
-      "dev": true
-    },
-    "meow": {
-      "version": "9.0.0",
-      "resolved": "https://registry.npmjs.org/meow/-/meow-9.0.0.tgz",
-      "integrity": "sha512-+obSblOQmRhcyBt62furQqRAQpNyWXo8BuQ5bN7dG8wmwQ+vwHKp/rCFD4CrTP8CsDQD1sjoZ94K417XEUk8IQ==",
-      "dev": true,
-      "requires": {
-        "@types/minimist": "^1.2.0",
-        "camelcase-keys": "^6.2.2",
-        "decamelize": "^1.2.0",
-        "decamelize-keys": "^1.1.0",
-        "hard-rejection": "^2.1.0",
-        "minimist-options": "4.1.0",
-        "normalize-package-data": "^3.0.0",
-        "read-pkg-up": "^7.0.1",
-        "redent": "^3.0.0",
-        "trim-newlines": "^3.0.0",
-        "type-fest": "^0.18.0",
-        "yargs-parser": "^20.2.3"
-      },
-      "dependencies": {
-        "normalize-package-data": {
-          "version": "3.0.3",
-          "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-3.0.3.tgz",
-          "integrity": "sha512-p2W1sgqij3zMMyRC067Dg16bfzVH+w7hyegmpIvZ4JNjqtGOVAIvLmjBx3yP7YTe9vKJgkoNOPjwQGogDoMXFA==",
-          "dev": true,
-          "requires": {
-            "hosted-git-info": "^4.0.1",
-            "is-core-module": "^2.5.0",
-            "semver": "^7.3.4",
-            "validate-npm-package-license": "^3.0.1"
-          }
-        },
-        "semver": {
-          "version": "7.3.7",
-          "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.7.tgz",
-          "integrity": "sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g==",
-          "dev": true,
-          "requires": {
-            "lru-cache": "^6.0.0"
-          }
-        },
-        "type-fest": {
-          "version": "0.18.1",
-          "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.18.1.tgz",
-          "integrity": "sha512-OIAYXk8+ISY+qTOwkHtKqzAuxchoMiD9Udx+FSGQDuiRR+PJKJHc2NJAXlbhkGwTt/4/nKZxELY1w3ReWOL8mw==",
-          "dev": true
-        },
-        "yargs-parser": {
-          "version": "20.2.9",
-          "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz",
-          "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==",
-          "dev": true
-        }
-      }
-    },
-    "merge-descriptors": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz",
-      "integrity": "sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==",
-      "dev": true
-    },
-    "merge-source-map": {
-      "version": "1.1.0",
-      "resolved": "https://registry.npmjs.org/merge-source-map/-/merge-source-map-1.1.0.tgz",
-      "integrity": "sha512-Qkcp7P2ygktpMPh2mCQZaf3jhN6D3Z/qVZHSdWvQ+2Ef5HgRAPBO57A77+ENm0CPx2+1Ce/MYKi3ymqdfuqibw==",
-      "dev": true,
-      "requires": {
-        "source-map": "^0.6.1"
-      },
-      "dependencies": {
-        "source-map": {
-          "version": "0.6.1",
-          "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
-          "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
-          "dev": true
-        }
-      }
-    },
-    "merge-stream": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz",
-      "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==",
-      "dev": true
-    },
-    "merge2": {
-      "version": "1.4.1",
-      "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz",
-      "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==",
-      "dev": true
-    },
-    "methods": {
-      "version": "1.1.2",
-      "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz",
-      "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==",
-      "dev": true
-    },
-    "micromark": {
-      "version": "2.11.4",
-      "resolved": "https://registry.npmjs.org/micromark/-/micromark-2.11.4.tgz",
-      "integrity": "sha512-+WoovN/ppKolQOFIAajxi7Lu9kInbPxFuTBVEavFcL8eAfVstoc5MocPmqBeAdBOJV00uaVjegzH4+MA0DN/uA==",
-      "dev": true,
-      "requires": {
-        "debug": "^4.0.0",
-        "parse-entities": "^2.0.0"
-      }
-    },
-    "micromatch": {
-      "version": "4.0.5",
-      "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz",
-      "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==",
-      "dev": true,
-      "requires": {
-        "braces": "^3.0.2",
-        "picomatch": "^2.3.1"
-      }
-    },
-    "miller-rabin": {
-      "version": "4.0.1",
-      "resolved": "https://registry.npmjs.org/miller-rabin/-/miller-rabin-4.0.1.tgz",
-      "integrity": "sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA==",
-      "dev": true,
-      "requires": {
-        "bn.js": "^4.0.0",
-        "brorand": "^1.0.1"
-      },
-      "dependencies": {
-        "bn.js": {
-          "version": "4.12.0",
-          "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz",
-          "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==",
-          "dev": true
-        }
-      }
-    },
-    "mime": {
-      "version": "1.6.0",
-      "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz",
-      "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==",
-      "dev": true
-    },
-    "mime-db": {
-      "version": "1.52.0",
-      "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz",
-      "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==",
-      "dev": true
-    },
-    "mime-types": {
-      "version": "2.1.35",
-      "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz",
-      "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==",
-      "dev": true,
-      "requires": {
-        "mime-db": "1.52.0"
-      }
-    },
-    "mimic-fn": {
-      "version": "2.1.0",
-      "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz",
-      "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==",
-      "dev": true
-    },
-    "min-indent": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/min-indent/-/min-indent-1.0.1.tgz",
-      "integrity": "sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==",
-      "dev": true
-    },
-    "mini-css-extract-plugin": {
-      "version": "2.4.2",
-      "resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-2.4.2.tgz",
-      "integrity": "sha512-ZmqShkn79D36uerdED+9qdo1ZYG8C1YsWvXu0UMJxurZnSdgz7gQKO2EGv8T55MhDqG3DYmGtizZNpM/UbTlcA==",
-      "dev": true,
-      "requires": {
-        "schema-utils": "^3.1.0"
-      },
-      "dependencies": {
-        "ajv": {
-          "version": "6.12.6",
-          "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz",
-          "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==",
-          "dev": true,
-          "requires": {
-            "fast-deep-equal": "^3.1.1",
-            "fast-json-stable-stringify": "^2.0.0",
-            "json-schema-traverse": "^0.4.1",
-            "uri-js": "^4.2.2"
-          }
-        },
-        "json-schema-traverse": {
-          "version": "0.4.1",
-          "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz",
-          "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==",
-          "dev": true
-        },
-        "schema-utils": {
-          "version": "3.1.1",
-          "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz",
-          "integrity": "sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==",
-          "dev": true,
-          "requires": {
-            "@types/json-schema": "^7.0.8",
-            "ajv": "^6.12.5",
-            "ajv-keywords": "^3.5.2"
-          }
-        }
-      }
-    },
-    "minimalistic-assert": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz",
-      "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==",
-      "dev": true
-    },
-    "minimalistic-crypto-utils": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz",
-      "integrity": "sha512-JIYlbt6g8i5jKfJ3xz7rF0LXmv2TkDxBLUkiBeZ7bAx4GnnNMr8xFpGnOxn6GhTEHx3SjRrZEoU+j04prX1ktg==",
-      "dev": true
-    },
-    "minimatch": {
-      "version": "3.1.2",
-      "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz",
-      "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==",
-      "requires": {
-        "brace-expansion": "^1.1.7"
-      }
-    },
-    "minimist": {
-      "version": "1.2.6",
-      "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.6.tgz",
-      "integrity": "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==",
-      "dev": true
-    },
-    "minimist-options": {
-      "version": "4.1.0",
-      "resolved": "https://registry.npmjs.org/minimist-options/-/minimist-options-4.1.0.tgz",
-      "integrity": "sha512-Q4r8ghd80yhO/0j1O3B2BjweX3fiHg9cdOwjJd2J76Q135c+NDxGCqdYKQ1SKBuFfgWbAUzBfvYjPUEeNgqN1A==",
-      "dev": true,
-      "requires": {
-        "arrify": "^1.0.1",
-        "is-plain-obj": "^1.1.0",
-        "kind-of": "^6.0.3"
-      },
-      "dependencies": {
-        "arrify": {
-          "version": "1.0.1",
-          "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz",
-          "integrity": "sha512-3CYzex9M9FGQjCGMGyi6/31c8GJbgb0qGyrx5HWxPd0aCwh4cB2YjMb2Xf9UuoogrMrlO9cTqnB5rI5GHZTcUA==",
-          "dev": true
-        },
-        "is-plain-obj": {
-          "version": "1.1.0",
-          "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz",
-          "integrity": "sha512-yvkRyxmFKEOQ4pNXCmJG5AEQNlXJS5LaONXo5/cLdTZdWvsZ1ioJEonLGAosKlMWE8lwUy/bJzMjcw8az73+Fg==",
-          "dev": true
-        }
-      }
-    },
-    "minipass": {
-      "version": "3.3.4",
-      "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.4.tgz",
-      "integrity": "sha512-I9WPbWHCGu8W+6k1ZiGpPu0GkoKBeorkfKNuAFBNS1HNFJvke82sxvI5bzcCNpWPorkOO5QQ+zomzzwRxejXiw==",
-      "dev": true,
-      "requires": {
-        "yallist": "^4.0.0"
-      }
-    },
-    "minipass-collect": {
-      "version": "1.0.2",
-      "resolved": "https://registry.npmjs.org/minipass-collect/-/minipass-collect-1.0.2.tgz",
-      "integrity": "sha512-6T6lH0H8OG9kITm/Jm6tdooIbogG9e0tLgpY6mphXSm/A9u8Nq1ryBG+Qspiub9LjWlBPsPS3tWQ/Botq4FdxA==",
-      "dev": true,
-      "requires": {
-        "minipass": "^3.0.0"
-      }
-    },
-    "minipass-fetch": {
-      "version": "1.4.1",
-      "resolved": "https://registry.npmjs.org/minipass-fetch/-/minipass-fetch-1.4.1.tgz",
-      "integrity": "sha512-CGH1eblLq26Y15+Azk7ey4xh0J/XfJfrCox5LDJiKqI2Q2iwOLOKrlmIaODiSQS8d18jalF6y2K2ePUm0CmShw==",
-      "dev": true,
-      "requires": {
-        "encoding": "^0.1.12",
-        "minipass": "^3.1.0",
-        "minipass-sized": "^1.0.3",
-        "minizlib": "^2.0.0"
-      }
-    },
-    "minipass-flush": {
-      "version": "1.0.5",
-      "resolved": "https://registry.npmjs.org/minipass-flush/-/minipass-flush-1.0.5.tgz",
-      "integrity": "sha512-JmQSYYpPUqX5Jyn1mXaRwOda1uQ8HP5KAT/oDSLCzt1BYRhQU0/hDtsB1ufZfEEzMZ9aAVmsBw8+FWsIXlClWw==",
-      "dev": true,
-      "requires": {
-        "minipass": "^3.0.0"
-      }
-    },
-    "minipass-json-stream": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/minipass-json-stream/-/minipass-json-stream-1.0.1.tgz",
-      "integrity": "sha512-ODqY18UZt/I8k+b7rl2AENgbWE8IDYam+undIJONvigAz8KR5GWblsFTEfQs0WODsjbSXWlm+JHEv8Gr6Tfdbg==",
-      "dev": true,
-      "requires": {
-        "jsonparse": "^1.3.1",
-        "minipass": "^3.0.0"
-      }
-    },
-    "minipass-pipeline": {
-      "version": "1.2.4",
-      "resolved": "https://registry.npmjs.org/minipass-pipeline/-/minipass-pipeline-1.2.4.tgz",
-      "integrity": "sha512-xuIq7cIOt09RPRJ19gdi4b+RiNvDFYe5JH+ggNvBqGqpQXcru3PcRmOZuHBKWK1Txf9+cQ+HMVN4d6z46LZP7A==",
-      "dev": true,
-      "requires": {
-        "minipass": "^3.0.0"
-      }
-    },
-    "minipass-sized": {
-      "version": "1.0.3",
-      "resolved": "https://registry.npmjs.org/minipass-sized/-/minipass-sized-1.0.3.tgz",
-      "integrity": "sha512-MbkQQ2CTiBMlA2Dm/5cY+9SWFEN8pzzOXi6rlM5Xxq0Yqbda5ZQy9sU75a673FE9ZK0Zsbr6Y5iP6u9nktfg2g==",
-      "dev": true,
-      "requires": {
-        "minipass": "^3.0.0"
-      }
-    },
-    "minizlib": {
-      "version": "2.1.2",
-      "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz",
-      "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==",
-      "dev": true,
-      "requires": {
-        "minipass": "^3.0.0",
-        "yallist": "^4.0.0"
-      }
-    },
-    "mixin-deep": {
-      "version": "1.3.2",
-      "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.2.tgz",
-      "integrity": "sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA==",
-      "dev": true,
-      "requires": {
-        "for-in": "^1.0.2",
-        "is-extendable": "^1.0.1"
-      },
-      "dependencies": {
-        "is-extendable": {
-          "version": "1.0.1",
-          "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz",
-          "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==",
-          "dev": true,
-          "requires": {
-            "is-plain-object": "^2.0.4"
-          }
-        },
-        "is-plain-object": {
-          "version": "2.0.4",
-          "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz",
-          "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==",
-          "dev": true,
-          "requires": {
-            "isobject": "^3.0.1"
-          }
-        }
-      }
-    },
-    "mkdirp": {
-      "version": "1.0.4",
-      "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz",
-      "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==",
-      "dev": true
-    },
-    "mkdirp-classic": {
-      "version": "0.5.3",
-      "resolved": "https://registry.npmjs.org/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz",
-      "integrity": "sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==",
-      "dev": true
-    },
-    "mobx": {
-      "version": "4.14.1",
-      "resolved": "https://registry.npmjs.org/mobx/-/mobx-4.14.1.tgz",
-      "integrity": "sha512-Oyg7Sr7r78b+QPYLufJyUmxTWcqeQ96S1nmtyur3QL8SeI6e0TqcKKcxbG+sVJLWANhHQkBW/mDmgG5DDC4fdw=="
-    },
-    "mocha": {
-      "version": "9.2.0",
-      "resolved": "https://registry.npmjs.org/mocha/-/mocha-9.2.0.tgz",
-      "integrity": "sha512-kNn7E8g2SzVcq0a77dkphPsDSN7P+iYkqE0ZsGCYWRsoiKjOt+NvXfaagik8vuDa6W5Zw3qxe8Jfpt5qKf+6/Q==",
-      "dev": true,
-      "requires": {
-        "@ungap/promise-all-settled": "1.1.2",
-        "ansi-colors": "4.1.1",
-        "browser-stdout": "1.3.1",
-        "chokidar": "3.5.3",
-        "debug": "4.3.3",
-        "diff": "5.0.0",
-        "escape-string-regexp": "4.0.0",
-        "find-up": "5.0.0",
-        "glob": "7.2.0",
-        "growl": "1.10.5",
-        "he": "1.2.0",
-        "js-yaml": "4.1.0",
-        "log-symbols": "4.1.0",
-        "minimatch": "3.0.4",
-        "ms": "2.1.3",
-        "nanoid": "3.2.0",
-        "serialize-javascript": "6.0.0",
-        "strip-json-comments": "3.1.1",
-        "supports-color": "8.1.1",
-        "which": "2.0.2",
-        "workerpool": "6.2.0",
-        "yargs": "16.2.0",
-        "yargs-parser": "20.2.4",
-        "yargs-unparser": "2.0.0"
-      },
-      "dependencies": {
-        "debug": {
-          "version": "4.3.3",
-          "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.3.tgz",
-          "integrity": "sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==",
-          "dev": true,
-          "requires": {
-            "ms": "2.1.2"
-          },
-          "dependencies": {
-            "ms": {
-              "version": "2.1.2",
-              "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
-              "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
-              "dev": true
-            }
-          }
-        },
-        "escape-string-regexp": {
-          "version": "4.0.0",
-          "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz",
-          "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==",
-          "dev": true
-        },
-        "find-up": {
-          "version": "5.0.0",
-          "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz",
-          "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==",
-          "dev": true,
-          "requires": {
-            "locate-path": "^6.0.0",
-            "path-exists": "^4.0.0"
-          }
-        },
-        "glob": {
-          "version": "7.2.0",
-          "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz",
-          "integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==",
-          "dev": true,
-          "requires": {
-            "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"
-          }
-        },
-        "has-flag": {
-          "version": "4.0.0",
-          "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
-          "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
-          "dev": true
-        },
-        "locate-path": {
-          "version": "6.0.0",
-          "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz",
-          "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==",
-          "dev": true,
-          "requires": {
-            "p-locate": "^5.0.0"
-          }
-        },
-        "minimatch": {
-          "version": "3.0.4",
-          "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz",
-          "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==",
-          "dev": true,
-          "requires": {
-            "brace-expansion": "^1.1.7"
-          }
-        },
-        "ms": {
-          "version": "2.1.3",
-          "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
-          "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==",
-          "dev": true
-        },
-        "nanoid": {
-          "version": "3.2.0",
-          "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.2.0.tgz",
-          "integrity": "sha512-fmsZYa9lpn69Ad5eDn7FMcnnSR+8R34W9qJEijxYhTbfOWzr22n1QxCMzXLK+ODyW2973V3Fux959iQoUxzUIA==",
-          "dev": true
-        },
-        "p-limit": {
-          "version": "3.1.0",
-          "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz",
-          "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==",
-          "dev": true,
-          "requires": {
-            "yocto-queue": "^0.1.0"
-          }
-        },
-        "p-locate": {
-          "version": "5.0.0",
-          "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz",
-          "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==",
-          "dev": true,
-          "requires": {
-            "p-limit": "^3.0.2"
-          }
-        },
-        "supports-color": {
-          "version": "8.1.1",
-          "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz",
-          "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==",
-          "dev": true,
-          "requires": {
-            "has-flag": "^4.0.0"
-          }
-        },
-        "which": {
-          "version": "2.0.2",
-          "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz",
-          "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==",
-          "dev": true,
-          "requires": {
-            "isexe": "^2.0.0"
-          }
-        },
-        "yargs": {
-          "version": "16.2.0",
-          "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz",
-          "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==",
-          "dev": true,
-          "requires": {
-            "cliui": "^7.0.2",
-            "escalade": "^3.1.1",
-            "get-caller-file": "^2.0.5",
-            "require-directory": "^2.1.1",
-            "string-width": "^4.2.0",
-            "y18n": "^5.0.5",
-            "yargs-parser": "^20.2.2"
-          }
-        },
-        "yargs-parser": {
-          "version": "20.2.4",
-          "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.4.tgz",
-          "integrity": "sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA==",
-          "dev": true
-        }
-      }
-    },
-    "mocha-junit-reporter": {
-      "version": "2.0.2",
-      "resolved": "https://registry.npmjs.org/mocha-junit-reporter/-/mocha-junit-reporter-2.0.2.tgz",
-      "integrity": "sha512-vYwWq5hh3v1lG0gdQCBxwNipBfvDiAM1PHroQRNp96+2l72e9wEUTw+mzoK+O0SudgfQ7WvTQZ9Nh3qkAYAjfg==",
-      "dev": true,
-      "requires": {
-        "debug": "^2.2.0",
-        "md5": "^2.1.0",
-        "mkdirp": "~0.5.1",
-        "strip-ansi": "^6.0.1",
-        "xml": "^1.0.0"
-      },
-      "dependencies": {
-        "debug": {
-          "version": "2.6.9",
-          "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
-          "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
-          "dev": true,
-          "requires": {
-            "ms": "2.0.0"
-          }
-        },
-        "mkdirp": {
-          "version": "0.5.6",
-          "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz",
-          "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==",
-          "dev": true,
-          "requires": {
-            "minimist": "^1.2.6"
-          }
-        },
-        "ms": {
-          "version": "2.0.0",
-          "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
-          "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==",
-          "dev": true
-        }
-      }
-    },
-    "module-deps": {
-      "version": "6.2.3",
-      "resolved": "https://registry.npmjs.org/module-deps/-/module-deps-6.2.3.tgz",
-      "integrity": "sha512-fg7OZaQBcL4/L+AK5f4iVqf9OMbCclXfy/znXRxTVhJSeW5AIlS9AwheYwDaXM3lVW7OBeaeUEY3gbaC6cLlSA==",
-      "dev": true,
-      "requires": {
-        "JSONStream": "^1.0.3",
-        "browser-resolve": "^2.0.0",
-        "cached-path-relative": "^1.0.2",
-        "concat-stream": "~1.6.0",
-        "defined": "^1.0.0",
-        "detective": "^5.2.0",
-        "duplexer2": "^0.1.2",
-        "inherits": "^2.0.1",
-        "parents": "^1.0.0",
-        "readable-stream": "^2.0.2",
-        "resolve": "^1.4.0",
-        "stream-combiner2": "^1.1.1",
-        "subarg": "^1.0.0",
-        "through2": "^2.0.0",
-        "xtend": "^4.0.0"
-      },
-      "dependencies": {
-        "browser-resolve": {
-          "version": "2.0.0",
-          "resolved": "https://registry.npmjs.org/browser-resolve/-/browser-resolve-2.0.0.tgz",
-          "integrity": "sha512-7sWsQlYL2rGLy2IWm8WL8DCTJvYLc/qlOnsakDac87SOoCd16WLsaAMdCiAqsTNHIe+SXfaqyxyo6THoWqs8WQ==",
-          "dev": true,
-          "requires": {
-            "resolve": "^1.17.0"
-          }
-        },
-        "readable-stream": {
-          "version": "2.3.7",
-          "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz",
-          "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==",
-          "dev": true,
-          "requires": {
-            "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"
-          }
-        },
-        "string_decoder": {
-          "version": "1.1.1",
-          "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz",
-          "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
-          "dev": true,
-          "requires": {
-            "safe-buffer": "~5.1.0"
-          }
-        }
-      }
-    },
-    "moment": {
-      "version": "2.29.3",
-      "resolved": "https://registry.npmjs.org/moment/-/moment-2.29.3.tgz",
-      "integrity": "sha512-c6YRvhEo//6T2Jz/vVtYzqBzwvPT95JBQ+smCytzf7c50oMZRsR/a4w88aD34I+/QVSfnoAnSBFPJHItlOMJVw=="
-    },
-    "moo-color": {
-      "version": "1.0.3",
-      "resolved": "https://registry.npmjs.org/moo-color/-/moo-color-1.0.3.tgz",
-      "integrity": "sha512-i/+ZKXMDf6aqYtBhuOcej71YSlbjT3wCO/4H1j8rPvxDJEifdwgg5MaFyu6iYAT8GBZJg2z0dkgK4YMzvURALQ==",
-      "dev": true,
-      "requires": {
-        "color-name": "^1.1.4"
-      },
-      "dependencies": {
-        "color-name": {
-          "version": "1.1.4",
-          "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
-          "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
-          "dev": true
-        }
-      }
-    },
-    "morgan": {
-      "version": "1.10.0",
-      "resolved": "https://registry.npmjs.org/morgan/-/morgan-1.10.0.tgz",
-      "integrity": "sha512-AbegBVI4sh6El+1gNwvD5YIck7nSA36weD7xvIxG4in80j/UoK8AEGaWnnz8v1GxonMCltmlNs5ZKbGvl9b1XQ==",
-      "dev": true,
-      "requires": {
-        "basic-auth": "~2.0.1",
-        "debug": "2.6.9",
-        "depd": "~2.0.0",
-        "on-finished": "~2.3.0",
-        "on-headers": "~1.0.2"
-      },
-      "dependencies": {
-        "debug": {
-          "version": "2.6.9",
-          "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
-          "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
-          "dev": true,
-          "requires": {
-            "ms": "2.0.0"
-          }
-        },
-        "ms": {
-          "version": "2.0.0",
-          "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
-          "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==",
-          "dev": true
-        },
-        "on-finished": {
-          "version": "2.3.0",
-          "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz",
-          "integrity": "sha512-ikqdkGAAyf/X/gPhXGvfgAytDZtDbr+bkNUJ0N9h5MI/dmdgCs3l6hoHrcUv41sRKew3jIwrp4qQDXiK99Utww==",
-          "dev": true,
-          "requires": {
-            "ee-first": "1.1.1"
-          }
-        }
-      }
-    },
-    "mri": {
-      "version": "1.2.0",
-      "resolved": "https://registry.npmjs.org/mri/-/mri-1.2.0.tgz",
-      "integrity": "sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==",
-      "dev": true
-    },
-    "ms": {
-      "version": "2.1.2",
-      "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
-      "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w=="
-    },
-    "multicast-dns": {
-      "version": "6.2.3",
-      "resolved": "https://registry.npmjs.org/multicast-dns/-/multicast-dns-6.2.3.tgz",
-      "integrity": "sha512-ji6J5enbMyGRHIAkAOu3WdV8nggqviKCEKtXcOqfphZZtQrmHKycfynJ2V7eVPUA4NhJ6V7Wf4TmGbTwKE9B6g==",
-      "dev": true,
-      "requires": {
-        "dns-packet": "^1.3.1",
-        "thunky": "^1.0.2"
-      }
-    },
-    "multicast-dns-service-types": {
-      "version": "1.1.0",
-      "resolved": "https://registry.npmjs.org/multicast-dns-service-types/-/multicast-dns-service-types-1.1.0.tgz",
-      "integrity": "sha512-cnAsSVxIDsYt0v7HmC0hWZFwwXSh+E6PgCrREDuN/EsjgLwA5XRmlMHhSiDPrt6HxY1gTivEa/Zh7GtODoLevQ==",
-      "dev": true
-    },
-    "multimatch": {
-      "version": "4.0.0",
-      "resolved": "https://registry.npmjs.org/multimatch/-/multimatch-4.0.0.tgz",
-      "integrity": "sha512-lDmx79y1z6i7RNx0ZGCPq1bzJ6ZoDDKbvh7jxr9SJcWLkShMzXrHbYVpTdnhNM5MXpDUxCQ4DgqVttVXlBgiBQ==",
-      "dev": true,
-      "requires": {
-        "@types/minimatch": "^3.0.3",
-        "array-differ": "^3.0.0",
-        "array-union": "^2.1.0",
-        "arrify": "^2.0.1",
-        "minimatch": "^3.0.4"
-      }
-    },
-    "mute-stream": {
-      "version": "0.0.8",
-      "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.8.tgz",
-      "integrity": "sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==",
-      "dev": true
-    },
-    "mz": {
-      "version": "2.7.0",
-      "resolved": "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz",
-      "integrity": "sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==",
-      "dev": true,
-      "requires": {
-        "any-promise": "^1.0.0",
-        "object-assign": "^4.0.1",
-        "thenify-all": "^1.0.0"
-      }
-    },
-    "nanoid": {
-      "version": "3.3.4",
-      "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.4.tgz",
-      "integrity": "sha512-MqBkQh/OHTS2egovRtLk45wEyNXwF+cokD+1YPf9u5VfJiRdAiRwB2froX5Co9Rh20xs4siNPm8naNotSD6RBw==",
-      "dev": true
-    },
-    "nanomatch": {
-      "version": "1.2.13",
-      "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz",
-      "integrity": "sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==",
-      "dev": true,
-      "requires": {
-        "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": {
-      "version": "1.4.0",
-      "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz",
-      "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==",
-      "dev": true
-    },
-    "needle": {
-      "version": "2.9.1",
-      "resolved": "https://registry.npmjs.org/needle/-/needle-2.9.1.tgz",
-      "integrity": "sha512-6R9fqJ5Zcmf+uYaFgdIHmLwNldn5HbK8L5ybn7Uz+ylX/rnOsSp1AHcvQSrCaFN+qNM1wpymHqD7mVasEOlHGQ==",
-      "dev": true,
-      "optional": true,
-      "requires": {
-        "debug": "^3.2.6",
-        "iconv-lite": "^0.4.4",
-        "sax": "^1.2.4"
-      },
-      "dependencies": {
-        "debug": {
-          "version": "3.2.7",
-          "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz",
-          "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==",
-          "dev": true,
-          "optional": true,
-          "requires": {
-            "ms": "^2.1.1"
-          }
-        }
-      }
-    },
-    "negotiator": {
-      "version": "0.6.3",
-      "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz",
-      "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==",
-      "dev": true
-    },
-    "neo-async": {
-      "version": "2.6.2",
-      "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz",
-      "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==",
-      "dev": true
-    },
-    "next-tick": {
-      "version": "1.1.0",
-      "resolved": "https://registry.npmjs.org/next-tick/-/next-tick-1.1.0.tgz",
-      "integrity": "sha512-CXdUiJembsNjuToQvxayPZF9Vqht7hewsvy2sOWafLvi2awflj9mOC6bHIg50orX8IJvWKY9wYQ/zB2kogPslQ==",
-      "dev": true
-    },
-    "ng-block-ui": {
-      "version": "3.0.2",
-      "resolved": "https://registry.npmjs.org/ng-block-ui/-/ng-block-ui-3.0.2.tgz",
-      "integrity": "sha512-EP3IXP8WSoKQOAwunf/v77aydcBCSLkEm5K8duRMSXFsnrcTdNqUiaLDKCf9U3COHY52IVBJcLb9PGhMBCWVSA==",
-      "requires": {
-        "tslib": "^1.10.0"
-      },
-      "dependencies": {
-        "tslib": {
-          "version": "1.14.1",
-          "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz",
-          "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg=="
-        }
-      }
-    },
-    "ng-bullet": {
-      "version": "1.0.3",
-      "resolved": "https://registry.npmjs.org/ng-bullet/-/ng-bullet-1.0.3.tgz",
-      "integrity": "sha512-qacsE/w/pLlBxebort1rkrE2B4Vc3idutcpe7tYiHVarz0V6Q5SN8E3d6NUp4UFBMOucpHlCpaASp7qEOsxM1Q==",
-      "dev": true,
-      "requires": {
-        "tslib": "^1.9.0"
-      },
-      "dependencies": {
-        "tslib": {
-          "version": "1.14.1",
-          "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz",
-          "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==",
-          "dev": true
+          "optional": true
         }
       }
     },
         }
       }
     },
-    "ng-click-outside": {
-      "version": "7.0.0",
-      "resolved": "https://registry.npmjs.org/ng-click-outside/-/ng-click-outside-7.0.0.tgz",
-      "integrity": "sha512-5QgqABb8ULqQtHNvCNXnBlzjKfILXrdZkq/xcnGL1aM1EmrY7xlUQQ/WLYnxno0gw/QQwCE5tH7sFfFUhIn8CA=="
-    },
-    "ng-mocks": {
+    "less-loader": {
       "version": "10.2.0",
       "version": "10.2.0",
-      "resolved": "https://registry.npmjs.org/ng-mocks/-/ng-mocks-10.2.0.tgz",
-      "integrity": "sha512-aEbNKbXYXNFRH1iedokACPBnZpiWrpG09Szkcc3RpcFa1gb46wwWBQUlgNxuc52MX/RZurVLpdn38nkKh3iSKA==",
-      "dev": true
-    },
-    "ng2-charts": {
-      "version": "2.4.2",
-      "resolved": "https://registry.npmjs.org/ng2-charts/-/ng2-charts-2.4.2.tgz",
-      "integrity": "sha512-mY3C2uKCaApHCQizS2YxEOqQ7sSZZLxdV6N1uM9u/VvUgVtYvlPtdcXbKpN52ak93ZE22I73DiLWVDnDNG4/AQ==",
-      "requires": {
-        "@types/chart.js": "^2.9.24",
-        "lodash-es": "^4.17.15",
-        "tslib": "^2.0.0"
-      }
-    },
-    "ngx-pipe-function": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/ngx-pipe-function/-/ngx-pipe-function-1.0.0.tgz",
-      "integrity": "sha512-AFWZ3icsq+0/nxFZtqRGZ03nRFoHcxVkZNGIi4ZQbdl5QLP3FmNTHGMmigohSeCV785l3YmPDUEx+6qwdGynMw==",
-      "requires": {
-        "tslib": "^1.9.0"
-      },
-      "dependencies": {
-        "tslib": {
-          "version": "1.14.1",
-          "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz",
-          "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg=="
-        }
-      }
-    },
-    "ngx-toastr": {
-      "version": "14.1.4",
-      "resolved": "https://registry.npmjs.org/ngx-toastr/-/ngx-toastr-14.1.4.tgz",
-      "integrity": "sha512-t1/9r+pOXm65LIl0gevvFat6XIl0g3tMA8UOArFjI4ta/nGwDe/14J/f4cZvOBDcomedvjvGAWi+d/2URdSTBg==",
-      "requires": {
-        "tslib": "^2.2.0"
-      }
-    },
-    "nice-napi": {
-      "version": "1.0.2",
-      "resolved": "https://registry.npmjs.org/nice-napi/-/nice-napi-1.0.2.tgz",
-      "integrity": "sha512-px/KnJAJZf5RuBGcfD+Sp2pAKq0ytz8j+1NehvgIGFkvtvFrDM3T8E4x/JJODXK9WZow8RRGrbA9QQ3hs+pDhA==",
+      "resolved": "https://registry.npmjs.org/less-loader/-/less-loader-10.2.0.tgz",
+      "integrity": "sha512-AV5KHWvCezW27GT90WATaDnfXBv99llDbtaj4bshq6DvAihMdNjaPDcUMa6EXKLRF+P2opFenJp89BXg91XLYg==",
       "dev": true,
       "dev": true,
-      "optional": true,
       "requires": {
       "requires": {
-        "node-addon-api": "^3.0.0",
-        "node-gyp-build": "^4.2.2"
+        "klona": "^2.0.4"
       }
     },
       }
     },
-    "nice-try": {
-      "version": "1.0.5",
-      "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz",
-      "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==",
+    "leven": {
+      "version": "3.1.0",
+      "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz",
+      "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==",
       "dev": true
     },
       "dev": true
     },
-    "no-case": {
-      "version": "2.3.2",
-      "resolved": "https://registry.npmjs.org/no-case/-/no-case-2.3.2.tgz",
-      "integrity": "sha512-rmTZ9kz+f3rCvK2TD1Ue/oZlns7OGoIWP4fc3llxxRXlOkHKoWPPWJOfFYpITabSow43QJbRIoHQXtt10VldyQ==",
-      "dev": true,
-      "requires": {
-        "lower-case": "^1.1.1"
-      }
-    },
-    "node-addon-api": {
-      "version": "3.2.1",
-      "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-3.2.1.tgz",
-      "integrity": "sha512-mmcei9JghVNDYydghQmeDX8KoAm0FAiYyIcUt/N4nhyAipB17pllZQDOJD2fotxABnt4Mdz+dKTO7eftLg4d0A==",
+    "levn": {
+      "version": "0.3.0",
+      "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz",
+      "integrity": "sha512-0OO4y2iOHix2W6ujICbKIaEQXvFQHue65vUG3pb5EUomzPI90z9hsA1VsO/dbIIpC53J8gxM9Q4Oho0jrCM/yA==",
       "dev": true,
       "dev": true,
-      "optional": true
-    },
-    "node-domexception": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/node-domexception/-/node-domexception-1.0.0.tgz",
-      "integrity": "sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ=="
-    },
-    "node-fetch": {
-      "version": "2.6.7",
-      "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.7.tgz",
-      "integrity": "sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ==",
       "requires": {
       "requires": {
-        "whatwg-url": "^5.0.0"
+        "prelude-ls": "~1.1.2",
+        "type-check": "~0.3.2"
       }
     },
       }
     },
-    "node-forge": {
-      "version": "0.10.0",
-      "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-0.10.0.tgz",
-      "integrity": "sha512-PPmu8eEeG9saEUvI97fm4OYxXVB6bFvyNTyiUOBichBpFG8A1Ljw3bY62+5oOjDEMHRnd0Y7HQ+x7uzxOzC6JA==",
-      "dev": true
-    },
-    "node-gyp": {
-      "version": "7.1.2",
-      "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-7.1.2.tgz",
-      "integrity": "sha512-CbpcIo7C3eMu3dL1c3d0xw449fHIGALIJsRP4DDPHpyiW8vcriNY7ubh9TE4zEKfSxscY7PjeFnshE7h75ynjQ==",
+    "license-webpack-plugin": {
+      "version": "4.0.2",
+      "resolved": "https://registry.npmjs.org/license-webpack-plugin/-/license-webpack-plugin-4.0.2.tgz",
+      "integrity": "sha512-771TFWFD70G1wLTC4oU2Cw4qvtmNrIw+wRvBtn+okgHl7slJVi7zfNcdmqDL72BojM30VNJ2UHylr1o77U37Jw==",
       "dev": true,
       "requires": {
       "dev": true,
       "requires": {
-        "env-paths": "^2.2.0",
-        "glob": "^7.1.4",
-        "graceful-fs": "^4.2.3",
-        "nopt": "^5.0.0",
-        "npmlog": "^4.1.2",
-        "request": "^2.88.2",
-        "rimraf": "^3.0.2",
-        "semver": "^7.3.2",
-        "tar": "^6.0.2",
-        "which": "^2.0.2"
-      },
-      "dependencies": {
-        "semver": {
-          "version": "7.3.7",
-          "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.7.tgz",
-          "integrity": "sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g==",
-          "dev": true,
-          "requires": {
-            "lru-cache": "^6.0.0"
-          }
-        },
-        "which": {
-          "version": "2.0.2",
-          "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz",
-          "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==",
-          "dev": true,
-          "requires": {
-            "isexe": "^2.0.0"
-          }
-        }
+        "webpack-sources": "^3.0.0"
       }
     },
       }
     },
-    "node-gyp-build": {
-      "version": "4.5.0",
-      "resolved": "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.5.0.tgz",
-      "integrity": "sha512-2iGbaQBV+ITgCz76ZEjmhUKAKVf7xfY1sRl4UiKQspfZMH2h06SyhNsnSVy50cwkFQDGLyif6m/6uFXHkOZ6rg==",
-      "dev": true,
-      "optional": true
-    },
-    "node-int64": {
-      "version": "0.4.0",
-      "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz",
-      "integrity": "sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==",
-      "dev": true
-    },
-    "node-notifier": {
-      "version": "8.0.2",
-      "resolved": "https://registry.npmjs.org/node-notifier/-/node-notifier-8.0.2.tgz",
-      "integrity": "sha512-oJP/9NAdd9+x2Q+rfphB2RJCHjod70RcRLjosiPMMu5gjIfwVnOUGq2nbTjTUbmy0DJ/tFIVT30+Qe3nzl4TJg==",
+    "liftoff": {
+      "version": "2.5.0",
+      "resolved": "https://registry.npmjs.org/liftoff/-/liftoff-2.5.0.tgz",
+      "integrity": "sha512-01zfGFqfORP1CGmZZP2Zn51zsqz4RltDi0RDOhbGoLYdUT5Lw+I2gX6QdwXhPITF6hPOHEOp+At6/L24hIg9WQ==",
       "dev": true,
       "dev": true,
-      "optional": true,
       "requires": {
       "requires": {
-        "growly": "^1.3.0",
-        "is-wsl": "^2.2.0",
-        "semver": "^7.3.2",
-        "shellwords": "^0.1.1",
-        "uuid": "^8.3.0",
-        "which": "^2.0.2"
+        "extend": "^3.0.0",
+        "findup-sync": "^2.0.0",
+        "fined": "^1.0.1",
+        "flagged-respawn": "^1.0.0",
+        "is-plain-object": "^2.0.4",
+        "object.map": "^1.0.0",
+        "rechoir": "^0.6.2",
+        "resolve": "^1.1.7"
       },
       "dependencies": {
       },
       "dependencies": {
-        "semver": {
-          "version": "7.3.7",
-          "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.7.tgz",
-          "integrity": "sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g==",
-          "dev": true,
-          "optional": true,
-          "requires": {
-            "lru-cache": "^6.0.0"
-          }
-        },
-        "which": {
-          "version": "2.0.2",
-          "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz",
-          "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==",
+        "is-plain-object": {
+          "version": "2.0.4",
+          "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz",
+          "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==",
           "dev": true,
           "dev": true,
-          "optional": true,
           "requires": {
           "requires": {
-            "isexe": "^2.0.0"
-          }
-        }
-      }
-    },
-    "node-releases": {
-      "version": "2.0.6",
-      "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.6.tgz",
-      "integrity": "sha512-PiVXnNuFm5+iYkLBNeq5211hvO38y63T0i2KKh2KnUs3RpzJ+JtODFjkD8yjLwnDkTYF1eKXheUwdssR+NRZdg==",
-      "dev": true
-    },
-    "nopt": {
-      "version": "5.0.0",
-      "resolved": "https://registry.npmjs.org/nopt/-/nopt-5.0.0.tgz",
-      "integrity": "sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ==",
-      "dev": true,
-      "requires": {
-        "abbrev": "1"
-      }
-    },
-    "normalize-package-data": {
-      "version": "2.5.0",
-      "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz",
-      "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==",
-      "dev": true,
-      "requires": {
-        "hosted-git-info": "^2.1.4",
-        "resolve": "^1.10.0",
-        "semver": "2 || 3 || 4 || 5",
-        "validate-npm-package-license": "^3.0.1"
-      },
-      "dependencies": {
-        "hosted-git-info": {
-          "version": "2.8.9",
-          "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz",
-          "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==",
-          "dev": true
-        }
-      }
-    },
-    "normalize-path": {
-      "version": "3.0.0",
-      "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz",
-      "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==",
-      "dev": true
-    },
-    "normalize-range": {
-      "version": "0.1.2",
-      "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz",
-      "integrity": "sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==",
-      "dev": true
-    },
-    "normalize-selector": {
-      "version": "0.2.0",
-      "resolved": "https://registry.npmjs.org/normalize-selector/-/normalize-selector-0.2.0.tgz",
-      "integrity": "sha512-dxvWdI8gw6eAvk9BlPffgEoGfM7AdijoCwOEJge3e3ulT2XLgmU7KvvxprOaCu05Q1uGRHmOhHe1r6emZoKyFw==",
-      "dev": true
+            "isobject": "^3.0.1"
+          }
+        }
+      }
     },
     },
-    "normalize-url": {
-      "version": "6.1.0",
-      "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-6.1.0.tgz",
-      "integrity": "sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A==",
+    "lines-and-columns": {
+      "version": "1.2.4",
+      "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz",
+      "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==",
       "dev": true
     },
       "dev": true
     },
-    "npm-bundled": {
-      "version": "1.1.2",
-      "resolved": "https://registry.npmjs.org/npm-bundled/-/npm-bundled-1.1.2.tgz",
-      "integrity": "sha512-x5DHup0SuyQcmL3s7Rx/YQ8sbw/Hzg0rj48eN0dV7hf5cmQq5PXIeioroH3raV1QC1yh3uTYuMThvEQF3iKgGQ==",
-      "dev": true,
-      "requires": {
-        "npm-normalize-package-bin": "^1.0.1"
-      }
-    },
-    "npm-install-checks": {
-      "version": "4.0.0",
-      "resolved": "https://registry.npmjs.org/npm-install-checks/-/npm-install-checks-4.0.0.tgz",
-      "integrity": "sha512-09OmyDkNLYwqKPOnbI8exiOZU2GVVmQp7tgez2BPi5OZC8M82elDAps7sxC4l//uSUtotWqoEIDwjRvWH4qz8w==",
+    "listr2": {
+      "version": "3.14.0",
+      "resolved": "https://registry.npmjs.org/listr2/-/listr2-3.14.0.tgz",
+      "integrity": "sha512-TyWI8G99GX9GjE54cJ+RrNMcIFBfwMPxc3XTFiAYGN4s10hWROGtOg7+O6u6LE3mNkyld7RSLE6nrKBvTfcs3g==",
       "dev": true,
       "requires": {
       "dev": true,
       "requires": {
-        "semver": "^7.1.1"
+        "cli-truncate": "^2.1.0",
+        "colorette": "^2.0.16",
+        "log-update": "^4.0.0",
+        "p-map": "^4.0.0",
+        "rfdc": "^1.3.0",
+        "rxjs": "^7.5.1",
+        "through": "^2.3.8",
+        "wrap-ansi": "^7.0.0"
       },
       "dependencies": {
       },
       "dependencies": {
-        "semver": {
-          "version": "7.3.7",
-          "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.7.tgz",
-          "integrity": "sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g==",
+        "rxjs": {
+          "version": "7.8.0",
+          "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.0.tgz",
+          "integrity": "sha512-F2+gxDshqmIub1KdvZkaEfGDwLNpPvk9Fs6LD/MyQxNgMds/WH9OdDDXOmxUZpME+iSK3rQCctkL0DYyytUqMg==",
           "dev": true,
           "requires": {
           "dev": true,
           "requires": {
-            "lru-cache": "^6.0.0"
+            "tslib": "^2.1.0"
           }
         }
       }
     },
           }
         }
       }
     },
-    "npm-normalize-package-bin": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/npm-normalize-package-bin/-/npm-normalize-package-bin-1.0.1.tgz",
-      "integrity": "sha512-EPfafl6JL5/rU+ot6P3gRSCpPDW5VmIzX959Ob1+ySFUuuYHWHekXpwdUZcKP5C+DS4GEtdJluwBjnsNDl+fSA==",
-      "dev": true
-    },
-    "npm-package-arg": {
-      "version": "8.1.5",
-      "resolved": "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-8.1.5.tgz",
-      "integrity": "sha512-LhgZrg0n0VgvzVdSm1oiZworPbTxYHUJCgtsJW8mGvlDpxTM1vSJc3m5QZeUkhAHIzbz3VCHd/R4osi1L1Tg/Q==",
+    "load-json-file": {
+      "version": "4.0.0",
+      "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-4.0.0.tgz",
+      "integrity": "sha512-Kx8hMakjX03tiGTLAIdJ+lL0htKnXjEZN6hk/tozf/WOuYGdZBJrZ+rCJRbVCugsjB3jMLn9746NsQIf5VjBMw==",
       "dev": true,
       "requires": {
       "dev": true,
       "requires": {
-        "hosted-git-info": "^4.0.1",
-        "semver": "^7.3.4",
-        "validate-npm-package-name": "^3.0.0"
+        "graceful-fs": "^4.1.2",
+        "parse-json": "^4.0.0",
+        "pify": "^3.0.0",
+        "strip-bom": "^3.0.0"
       },
       "dependencies": {
       },
       "dependencies": {
-        "semver": {
-          "version": "7.3.7",
-          "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.7.tgz",
-          "integrity": "sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g==",
+        "parse-json": {
+          "version": "4.0.0",
+          "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz",
+          "integrity": "sha512-aOIos8bujGN93/8Ox/jPLh7RwVnPEysynVFE+fQZyg6jKELEHwzgKdLRFHUgXJL6kylijVSBC4BvN9OmsB48Rw==",
           "dev": true,
           "requires": {
           "dev": true,
           "requires": {
-            "lru-cache": "^6.0.0"
+            "error-ex": "^1.3.1",
+            "json-parse-better-errors": "^1.0.1"
           }
           }
+        },
+        "pify": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz",
+          "integrity": "sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg==",
+          "dev": true
         }
       }
     },
         }
       }
     },
-    "npm-packlist": {
-      "version": "2.2.2",
-      "resolved": "https://registry.npmjs.org/npm-packlist/-/npm-packlist-2.2.2.tgz",
-      "integrity": "sha512-Jt01acDvJRhJGthnUJVF/w6gumWOZxO7IkpY/lsX9//zqQgnF7OJaxgQXcerd4uQOLu7W5bkb4mChL9mdfm+Zg==",
+    "loader-runner": {
+      "version": "4.3.0",
+      "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.3.0.tgz",
+      "integrity": "sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg==",
+      "dev": true
+    },
+    "loader-utils": {
+      "version": "3.2.0",
+      "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-3.2.0.tgz",
+      "integrity": "sha512-HVl9ZqccQihZ7JM85dco1MvO9G+ONvxoGa9rkhzFsneGLKSUg1gJf9bWzhRhcvm2qChhWpebQhP44qxjKIUCaQ==",
+      "dev": true
+    },
+    "locate-path": {
+      "version": "5.0.0",
+      "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz",
+      "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==",
       "dev": true,
       "requires": {
       "dev": true,
       "requires": {
-        "glob": "^7.1.6",
-        "ignore-walk": "^3.0.3",
-        "npm-bundled": "^1.1.1",
-        "npm-normalize-package-bin": "^1.0.1"
+        "p-locate": "^4.1.0"
       }
     },
       }
     },
-    "npm-pick-manifest": {
-      "version": "6.1.1",
-      "resolved": "https://registry.npmjs.org/npm-pick-manifest/-/npm-pick-manifest-6.1.1.tgz",
-      "integrity": "sha512-dBsdBtORT84S8V8UTad1WlUyKIY9iMsAmqxHbLdeEeBNMLQDlDWWra3wYUx9EBEIiG/YwAy0XyNHDd2goAsfuA==",
+    "lodash": {
+      "version": "4.17.21",
+      "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz",
+      "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg=="
+    },
+    "lodash-es": {
+      "version": "4.17.21",
+      "resolved": "https://registry.npmjs.org/lodash-es/-/lodash-es-4.17.21.tgz",
+      "integrity": "sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw=="
+    },
+    "lodash.clonedeep": {
+      "version": "4.5.0",
+      "resolved": "https://registry.npmjs.org/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz",
+      "integrity": "sha512-H5ZhCF25riFd9uB5UCkVKo61m3S/xZk1x4wA6yp/L3RFP6Z/eHH1ymQcGLo7J3GMPfm0V/7m1tryHuGVxpqEBQ==",
+      "dev": true
+    },
+    "lodash.debounce": {
+      "version": "4.0.8",
+      "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz",
+      "integrity": "sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow=="
+    },
+    "lodash.flatten": {
+      "version": "4.4.0",
+      "resolved": "https://registry.npmjs.org/lodash.flatten/-/lodash.flatten-4.4.0.tgz",
+      "integrity": "sha512-C5N2Z3DgnnKr0LOpv/hKCgKdb7ZZwafIrsesve6lmzvZIRZRGaZ/l6Q8+2W7NaT+ZwO3fFlSCzCzrDCFdJfZ4g==",
+      "dev": true
+    },
+    "lodash.mapvalues": {
+      "version": "4.6.0",
+      "resolved": "https://registry.npmjs.org/lodash.mapvalues/-/lodash.mapvalues-4.6.0.tgz",
+      "integrity": "sha512-JPFqXFeZQ7BfS00H58kClY7SPVeHertPE0lNuCyZ26/XlN8TvakYD7b9bGyNmXbT/D3BbtPAAmq90gPWqLkxlQ==",
+      "dev": true
+    },
+    "lodash.memoize": {
+      "version": "4.1.2",
+      "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz",
+      "integrity": "sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag=="
+    },
+    "lodash.merge": {
+      "version": "4.6.2",
+      "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz",
+      "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==",
+      "dev": true
+    },
+    "lodash.once": {
+      "version": "4.1.1",
+      "resolved": "https://registry.npmjs.org/lodash.once/-/lodash.once-4.1.1.tgz",
+      "integrity": "sha512-Sb487aTOCr9drQVL8pIxOzVhafOjZN9UU54hiN8PU3uAiSV7lx1yYNpbNmex2PK6dSJoNTSJUUswT651yww3Mg==",
+      "dev": true
+    },
+    "lodash.sortby": {
+      "version": "4.7.0",
+      "resolved": "https://registry.npmjs.org/lodash.sortby/-/lodash.sortby-4.7.0.tgz",
+      "integrity": "sha512-HDWXG8isMntAyRF5vZ7xKuEvOhT4AhlRt/3czTSjvGUxjYCBVRQY48ViDHyfYz9VIoBkW4TMGQNapx+l3RUwdA==",
+      "dev": true
+    },
+    "lodash.throttle": {
+      "version": "4.1.1",
+      "resolved": "https://registry.npmjs.org/lodash.throttle/-/lodash.throttle-4.1.1.tgz",
+      "integrity": "sha512-wIkUCfVKpVsWo3JSZlc+8MB5it+2AN5W8J7YVMST30UrvcQNZ1Okbj+rbVniijTWE6FGYy4XJq/rHkas8qJMLQ=="
+    },
+    "lodash.truncate": {
+      "version": "4.4.2",
+      "resolved": "https://registry.npmjs.org/lodash.truncate/-/lodash.truncate-4.4.2.tgz",
+      "integrity": "sha512-jttmRe7bRse52OsWIMDLaXxWqRAmtIUccAQ3garviCqJjafXOfNMO0yMfNpdD6zbGaTU0P5Nz7e7gAT6cKmJRw==",
+      "dev": true
+    },
+    "log-symbols": {
+      "version": "4.1.0",
+      "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz",
+      "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==",
       "dev": true,
       "requires": {
       "dev": true,
       "requires": {
-        "npm-install-checks": "^4.0.0",
-        "npm-normalize-package-bin": "^1.0.1",
-        "npm-package-arg": "^8.1.2",
-        "semver": "^7.3.4"
+        "chalk": "^4.1.0",
+        "is-unicode-supported": "^0.1.0"
       },
       "dependencies": {
       },
       "dependencies": {
-        "semver": {
-          "version": "7.3.7",
-          "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.7.tgz",
-          "integrity": "sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g==",
+        "ansi-styles": {
+          "version": "4.3.0",
+          "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
+          "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
           "dev": true,
           "requires": {
           "dev": true,
           "requires": {
-            "lru-cache": "^6.0.0"
+            "color-convert": "^2.0.1"
+          }
+        },
+        "chalk": {
+          "version": "4.1.2",
+          "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
+          "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
+          "dev": true,
+          "requires": {
+            "ansi-styles": "^4.1.0",
+            "supports-color": "^7.1.0"
+          }
+        },
+        "color-convert": {
+          "version": "2.0.1",
+          "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
+          "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+          "dev": true,
+          "requires": {
+            "color-name": "~1.1.4"
+          }
+        },
+        "color-name": {
+          "version": "1.1.4",
+          "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
+          "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
+          "dev": true
+        },
+        "has-flag": {
+          "version": "4.0.0",
+          "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
+          "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+          "dev": true
+        },
+        "supports-color": {
+          "version": "7.2.0",
+          "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
+          "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
+          "dev": true,
+          "requires": {
+            "has-flag": "^4.0.0"
           }
         }
       }
     },
           }
         }
       }
     },
-    "npm-registry-fetch": {
-      "version": "11.0.0",
-      "resolved": "https://registry.npmjs.org/npm-registry-fetch/-/npm-registry-fetch-11.0.0.tgz",
-      "integrity": "sha512-jmlgSxoDNuhAtxUIG6pVwwtz840i994dL14FoNVZisrmZW5kWd63IUTNv1m/hyRSGSqWjCUp/YZlS1BJyNp9XA==",
-      "dev": true,
-      "requires": {
-        "make-fetch-happen": "^9.0.1",
-        "minipass": "^3.1.3",
-        "minipass-fetch": "^1.3.0",
-        "minipass-json-stream": "^1.0.1",
-        "minizlib": "^2.0.0",
-        "npm-package-arg": "^8.0.0"
-      }
-    },
-    "npm-run-all": {
-      "version": "4.1.5",
-      "resolved": "https://registry.npmjs.org/npm-run-all/-/npm-run-all-4.1.5.tgz",
-      "integrity": "sha512-Oo82gJDAVcaMdi3nuoKFavkIHBRVqQ1qvMb+9LHk/cF4P6B2m8aP04hGf7oL6wZ9BuGwX1onlLhpuoofSyoQDQ==",
+    "log-update": {
+      "version": "4.0.0",
+      "resolved": "https://registry.npmjs.org/log-update/-/log-update-4.0.0.tgz",
+      "integrity": "sha512-9fkkDevMefjg0mmzWFBW8YkFP91OrizzkW3diF7CpG+S2EYdy4+TVfGwz1zeF8x7hCx1ovSPTOE9Ngib74qqUg==",
       "dev": true,
       "requires": {
       "dev": true,
       "requires": {
-        "ansi-styles": "^3.2.1",
-        "chalk": "^2.4.1",
-        "cross-spawn": "^6.0.5",
-        "memorystream": "^0.3.1",
-        "minimatch": "^3.0.4",
-        "pidtree": "^0.3.0",
-        "read-pkg": "^3.0.0",
-        "shell-quote": "^1.6.1",
-        "string.prototype.padend": "^3.0.0"
+        "ansi-escapes": "^4.3.0",
+        "cli-cursor": "^3.1.0",
+        "slice-ansi": "^4.0.0",
+        "wrap-ansi": "^6.2.0"
       },
       "dependencies": {
       },
       "dependencies": {
-        "path-type": {
-          "version": "3.0.0",
-          "resolved": "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz",
-          "integrity": "sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==",
+        "ansi-styles": {
+          "version": "4.3.0",
+          "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
+          "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
           "dev": true,
           "requires": {
           "dev": true,
           "requires": {
-            "pify": "^3.0.0"
+            "color-convert": "^2.0.1"
           }
         },
           }
         },
-        "pify": {
-          "version": "3.0.0",
-          "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz",
-          "integrity": "sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg==",
+        "color-convert": {
+          "version": "2.0.1",
+          "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
+          "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+          "dev": true,
+          "requires": {
+            "color-name": "~1.1.4"
+          }
+        },
+        "color-name": {
+          "version": "1.1.4",
+          "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
+          "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
           "dev": true
         },
           "dev": true
         },
-        "read-pkg": {
-          "version": "3.0.0",
-          "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-3.0.0.tgz",
-          "integrity": "sha512-BLq/cCO9two+lBgiTYNqD6GdtK8s4NpaWrl6/rCO9w0TUS8oJl7cmToOZfRYllKTISY6nt1U7jQ53brmKqY6BA==",
+        "slice-ansi": {
+          "version": "4.0.0",
+          "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz",
+          "integrity": "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==",
+          "dev": true,
+          "requires": {
+            "ansi-styles": "^4.0.0",
+            "astral-regex": "^2.0.0",
+            "is-fullwidth-code-point": "^3.0.0"
+          }
+        },
+        "wrap-ansi": {
+          "version": "6.2.0",
+          "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz",
+          "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==",
           "dev": true,
           "requires": {
           "dev": true,
           "requires": {
-            "load-json-file": "^4.0.0",
-            "normalize-package-data": "^2.3.2",
-            "path-type": "^3.0.0"
+            "ansi-styles": "^4.0.0",
+            "string-width": "^4.1.0",
+            "strip-ansi": "^6.0.0"
           }
         }
       }
     },
           }
         }
       }
     },
-    "npm-run-path": {
-      "version": "2.0.2",
-      "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz",
-      "integrity": "sha512-lJxZYlT4DW/bRUtFh1MQIWqmLwQfAxnqWG4HhEdjMlkrJYnJn0Jrr2u3mgxqaWsdiBc76TYkTG/mhrnYTuzfHw==",
-      "dev": true,
-      "requires": {
-        "path-key": "^2.0.0"
-      }
-    },
-    "npmlog": {
-      "version": "4.1.2",
-      "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-4.1.2.tgz",
-      "integrity": "sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg==",
-      "dev": true,
-      "requires": {
-        "are-we-there-yet": "~1.1.2",
-        "console-control-strings": "~1.1.0",
-        "gauge": "~2.7.3",
-        "set-blocking": "~2.0.0"
-      }
-    },
-    "nth-check": {
-      "version": "2.1.1",
-      "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz",
-      "integrity": "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==",
-      "dev": true,
-      "requires": {
-        "boolbase": "^1.0.0"
-      }
-    },
-    "num2fraction": {
-      "version": "1.2.2",
-      "resolved": "https://registry.npmjs.org/num2fraction/-/num2fraction-1.2.2.tgz",
-      "integrity": "sha512-Y1wZESM7VUThYY+4W+X4ySH2maqcA+p7UR+w8VWNWVAd6lwuXXWz/w/Cz43J/dI2I+PS6wD5N+bJUF+gjWvIqg==",
-      "dev": true
-    },
-    "number-is-nan": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz",
-      "integrity": "sha512-4jbtZXNAsfZbAHiiqjLPBiCl16dES1zI4Hpzzxw61Tk+loF+sBDBKx1ICKKKwIqQ7M0mFn1TmkN7euSncWgHiQ==",
-      "dev": true
-    },
-    "nwsapi": {
-      "version": "2.2.1",
-      "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.1.tgz",
-      "integrity": "sha512-JYOWTeFoS0Z93587vRJgASD5Ut11fYl5NyihP3KrYBvMe1FRRs6RN7m20SA/16GM4P6hTnZjT+UmDOt38UeXNg==",
-      "dev": true
-    },
-    "oauth-sign": {
-      "version": "0.9.0",
-      "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz",
-      "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==",
-      "dev": true
-    },
-    "object-assign": {
-      "version": "4.1.1",
-      "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz",
-      "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg=="
-    },
-    "object-copy": {
-      "version": "0.1.0",
-      "resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz",
-      "integrity": "sha512-79LYn6VAb63zgtmAteVOWo9Vdj71ZVBy3Pbse+VqxDpEP83XuujMrGqHIwAXJ5I/aM0zU7dIyIAhifVTPrNItQ==",
+    "log4js": {
+      "version": "1.1.1",
+      "resolved": "https://registry.npmjs.org/log4js/-/log4js-1.1.1.tgz",
+      "integrity": "sha512-lYb14ZSs1M/CUFuvy7Zk3VZLDtqrqOaVql9CE0tv8g6/qE1Gfq97XKdltBsjSxxvcJ+t8fAXOnvFxSsms7gGVg==",
       "dev": true,
       "requires": {
       "dev": true,
       "requires": {
-        "copy-descriptor": "^0.1.0",
-        "define-property": "^0.2.5",
-        "kind-of": "^3.0.3"
+        "debug": "^2.2.0",
+        "semver": "^5.3.0",
+        "streamroller": "^0.4.0"
       },
       "dependencies": {
       },
       "dependencies": {
-        "define-property": {
-          "version": "0.2.5",
-          "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz",
-          "integrity": "sha512-Rr7ADjQZenceVOAKop6ALkkRAmH1A4Gx9hV/7ZujPUN2rkATqFO0JZLZInbAjpZYoJ1gUx8MRMQVkYemcbMSTA==",
+        "debug": {
+          "version": "2.6.9",
+          "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
+          "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
           "dev": true,
           "requires": {
           "dev": true,
           "requires": {
-            "is-descriptor": "^0.1.0"
+            "ms": "2.0.0"
           }
         },
           }
         },
-        "kind-of": {
-          "version": "3.2.2",
-          "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
-          "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==",
-          "dev": true,
-          "requires": {
-            "is-buffer": "^1.1.5"
-          }
+        "ms": {
+          "version": "2.0.0",
+          "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
+          "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==",
+          "dev": true
+        },
+        "semver": {
+          "version": "5.7.1",
+          "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz",
+          "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==",
+          "dev": true
         }
       }
     },
         }
       }
     },
-    "object-inspect": {
-      "version": "1.12.2",
-      "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.2.tgz",
-      "integrity": "sha512-z+cPxW0QGUp0mcqcsgQyLVRDoXFQbXOwBaqyF7VIgI4TWNQsDHrBpUQslRmIfAoYWdYzs6UlKJtB2XJpTaNSpQ=="
-    },
-    "object-is": {
-      "version": "1.1.5",
-      "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.1.5.tgz",
-      "integrity": "sha512-3cyDsyHgtmi7I7DfSSI2LDp6SK2lwvtbg0p0R1e0RvTqF5ceGx+K2dfSjm1bKDMVCFEDAQvy+o8c6a7VujOddw==",
-      "dev": true,
-      "requires": {
-        "call-bind": "^1.0.2",
-        "define-properties": "^1.1.3"
-      }
-    },
-    "object-keys": {
-      "version": "1.1.1",
-      "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz",
-      "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==",
+    "loglevel": {
+      "version": "1.8.1",
+      "resolved": "https://registry.npmjs.org/loglevel/-/loglevel-1.8.1.tgz",
+      "integrity": "sha512-tCRIJM51SHjAayKwC+QAg8hT8vg6z7GSgLJKGvzuPb1Wc+hLzqtuVLxp6/HzSPOozuK+8ErAhy7U/sVzw8Dgfg==",
       "dev": true
     },
       "dev": true
     },
-    "object-visit": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz",
-      "integrity": "sha512-GBaMwwAVK9qbQN3Scdo0OyvgPW7l3lnaVMj84uTOZlswkX0KpF6fyDBJhtTthf7pymztoN36/KEr1DyhF96zEA==",
-      "dev": true,
-      "requires": {
-        "isobject": "^3.0.0"
-      }
-    },
-    "object.assign": {
-      "version": "4.1.4",
-      "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.4.tgz",
-      "integrity": "sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ==",
-      "dev": true,
-      "requires": {
-        "call-bind": "^1.0.2",
-        "define-properties": "^1.1.4",
-        "has-symbols": "^1.0.3",
-        "object-keys": "^1.1.1"
-      }
+    "loglevel-plugin-prefix": {
+      "version": "0.8.4",
+      "resolved": "https://registry.npmjs.org/loglevel-plugin-prefix/-/loglevel-plugin-prefix-0.8.4.tgz",
+      "integrity": "sha512-WpG9CcFAOjz/FtNht+QJeGpvVl/cdR6P0z6OcXSkr8wFJOsV2GRj2j10JLfjuA4aYkcKCNIEqRGCyTife9R8/g==",
+      "dev": true
     },
     },
-    "object.defaults": {
-      "version": "1.1.0",
-      "resolved": "https://registry.npmjs.org/object.defaults/-/object.defaults-1.1.0.tgz",
-      "integrity": "sha512-c/K0mw/F11k4dEUBMW8naXUuBuhxRCfG7W+yFy8EcijU/rSmazOUd1XAEEe6bC0OuXY4HUKjTJv7xbxIMqdxrA==",
-      "dev": true,
-      "requires": {
-        "array-each": "^1.0.1",
-        "array-slice": "^1.0.0",
-        "for-own": "^1.0.0",
-        "isobject": "^3.0.0"
-      }
+    "long": {
+      "version": "4.0.0",
+      "resolved": "https://registry.npmjs.org/long/-/long-4.0.0.tgz",
+      "integrity": "sha512-XsP+KhQif4bjX1kbuSiySJFNAehNxgLb6hPRGJ9QsUr8ajHkuXGdrHmFUTUUXhDwVX2R5bY4JNZEwbUiMhV+MA==",
+      "dev": true
     },
     },
-    "object.map": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/object.map/-/object.map-1.0.1.tgz",
-      "integrity": "sha512-3+mAJu2PLfnSVGHwIWubpOFLscJANBKuB/6A4CxBstc4aqwQY0FWcsppuy4jU5GSB95yES5JHSI+33AWuS4k6w==",
-      "dev": true,
-      "requires": {
-        "for-own": "^1.0.0",
-        "make-iterator": "^1.0.0"
-      }
+    "longest-streak": {
+      "version": "2.0.4",
+      "resolved": "https://registry.npmjs.org/longest-streak/-/longest-streak-2.0.4.tgz",
+      "integrity": "sha512-vM6rUVCVUJJt33bnmHiZEvr7wPT78ztX7rojL+LW51bHtLh6HTjx84LA5W4+oa6aKEJA7jJu5LR6vQRBpA5DVg==",
+      "dev": true
     },
     },
-    "object.pick": {
-      "version": "1.3.0",
-      "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz",
-      "integrity": "sha512-tqa/UMy/CCoYmj+H5qc07qvSL9dqcs/WZENZ1JbtWBlATP+iVOe778gE6MSijnyCnORzDuX6hU+LA4SZ09YjFQ==",
-      "dev": true,
+    "loose-envify": {
+      "version": "1.4.0",
+      "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz",
+      "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==",
       "requires": {
       "requires": {
-        "isobject": "^3.0.1"
+        "js-tokens": "^3.0.0 || ^4.0.0"
       }
     },
       }
     },
-    "obuf": {
-      "version": "1.1.2",
-      "resolved": "https://registry.npmjs.org/obuf/-/obuf-1.1.2.tgz",
-      "integrity": "sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==",
-      "dev": true
-    },
-    "on-finished": {
-      "version": "2.4.1",
-      "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz",
-      "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==",
+    "loupe": {
+      "version": "2.3.6",
+      "resolved": "https://registry.npmjs.org/loupe/-/loupe-2.3.6.tgz",
+      "integrity": "sha512-RaPMZKiMy8/JruncMU5Bt6na1eftNoo++R4Y+N2FrxkDVTrGvcyzFTsaGif4QTeKESheMGegbhw6iUAq+5A8zA==",
       "dev": true,
       "requires": {
       "dev": true,
       "requires": {
-        "ee-first": "1.1.1"
+        "get-func-name": "^2.0.0"
       }
     },
       }
     },
-    "on-headers": {
-      "version": "1.0.2",
-      "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.2.tgz",
-      "integrity": "sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==",
+    "lower-case": {
+      "version": "1.1.4",
+      "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-1.1.4.tgz",
+      "integrity": "sha512-2Fgx1Ycm599x+WGpIYwJOvsjmXFzTSc34IwDWALRA/8AopUKAVPwfJ+h5+f85BCp0PWmmJcWzEpxOpoXycMpdA==",
       "dev": true
     },
       "dev": true
     },
-    "once": {
-      "version": "1.4.0",
-      "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
-      "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==",
-      "requires": {
-        "wrappy": "1"
-      }
-    },
-    "onetime": {
-      "version": "5.1.2",
-      "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz",
-      "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==",
-      "dev": true,
+    "lowlight": {
+      "version": "1.20.0",
+      "resolved": "https://registry.npmjs.org/lowlight/-/lowlight-1.20.0.tgz",
+      "integrity": "sha512-8Ktj+prEb1RoCPkEOrPMYUN/nCggB7qAWe3a7OpMjWQkh3l2RD5wKRQ+o8Q8YuI9RG/xs95waaI/E6ym/7NsTw==",
       "requires": {
       "requires": {
-        "mimic-fn": "^2.1.0"
+        "fault": "^1.0.0",
+        "highlight.js": "~10.7.0"
       }
     },
       }
     },
-    "open": {
-      "version": "8.2.1",
-      "resolved": "https://registry.npmjs.org/open/-/open-8.2.1.tgz",
-      "integrity": "sha512-rXILpcQlkF/QuFez2BJDf3GsqpjGKbkUUToAIGo9A0Q6ZkoSGogZJulrUdwRkrAsoQvoZsrjCYt8+zblOk7JQQ==",
-      "dev": true,
+    "lru-cache": {
+      "version": "5.1.1",
+      "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz",
+      "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==",
       "requires": {
       "requires": {
-        "define-lazy-prop": "^2.0.0",
-        "is-docker": "^2.1.1",
-        "is-wsl": "^2.2.0"
+        "yallist": "^3.0.2"
       }
     },
       }
     },
-    "opencollective-postinstall": {
-      "version": "2.0.3",
-      "resolved": "https://registry.npmjs.org/opencollective-postinstall/-/opencollective-postinstall-2.0.3.tgz",
-      "integrity": "sha512-8AV/sCtuzUeTo8gQK5qDZzARrulB3egtLzFgteqB2tcT4Mw7B8Kt7JcDHmltjz6FOAHsvTevk70gZEbhM4ZS9Q==",
+    "lunr": {
+      "version": "2.3.9",
+      "resolved": "https://registry.npmjs.org/lunr/-/lunr-2.3.9.tgz",
+      "integrity": "sha512-zTU3DaZaF3Rt9rhN3uBMGQD3dD2/vFQqnvZCDv4dl5iOzq2IZQqTxu90r4E5J+nP70J3ilqVCrbho2eWaeW8Ow==",
       "dev": true
     },
       "dev": true
     },
-    "opn": {
-      "version": "5.5.0",
-      "resolved": "https://registry.npmjs.org/opn/-/opn-5.5.0.tgz",
-      "integrity": "sha512-PqHpggC9bLV0VeWcdKhkpxY+3JTzetLSqTCWL/z/tFIbI6G8JCjondXklT1JinczLz2Xib62sSp0T/gKT4KksA==",
+    "macos-release": {
+      "version": "2.5.1",
+      "resolved": "https://registry.npmjs.org/macos-release/-/macos-release-2.5.1.tgz",
+      "integrity": "sha512-DXqXhEM7gW59OjZO8NIjBCz9AQ1BEMrfiOAl4AYByHCtVHRF4KoGNO8mqQeM8lRCtQe/UnJ4imO/d2HdkKsd+A==",
+      "dev": true
+    },
+    "magic-string": {
+      "version": "0.25.7",
+      "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.25.7.tgz",
+      "integrity": "sha512-4CrMT5DOHTDk4HYDlzmwu4FVCcIYI8gauveasrdCu2IKIFOJ3f0v/8MDGJCDL9oD2ppz/Av1b0Nj345H9M+XIA==",
       "dev": true,
       "requires": {
       "dev": true,
       "requires": {
-        "is-wsl": "^1.1.0"
-      },
-      "dependencies": {
-        "is-wsl": {
-          "version": "1.1.0",
-          "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-1.1.0.tgz",
-          "integrity": "sha512-gfygJYZ2gLTDlmbWMI0CE2MwnFzSN/2SZfkMlItC4K/JBlsWVDB0bO6XhqcY13YXE7iMcAJnzTCJjPiTeJJ0Mw==",
-          "dev": true
-        }
+        "sourcemap-codec": "^1.4.4"
       }
     },
       }
     },
-    "optionator": {
-      "version": "0.8.3",
-      "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz",
-      "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==",
+    "make-dir": {
+      "version": "3.1.0",
+      "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz",
+      "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==",
       "dev": true,
       "requires": {
       "dev": true,
       "requires": {
-        "deep-is": "~0.1.3",
-        "fast-levenshtein": "~2.0.6",
-        "levn": "~0.3.0",
-        "prelude-ls": "~1.1.2",
-        "type-check": "~0.3.2",
-        "word-wrap": "~1.2.3"
+        "semver": "^6.0.0"
       }
     },
       }
     },
-    "ora": {
-      "version": "5.4.1",
-      "resolved": "https://registry.npmjs.org/ora/-/ora-5.4.1.tgz",
-      "integrity": "sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ==",
+    "make-error": {
+      "version": "1.3.6",
+      "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz",
+      "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==",
+      "dev": true
+    },
+    "make-fetch-happen": {
+      "version": "9.1.0",
+      "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-9.1.0.tgz",
+      "integrity": "sha512-+zopwDy7DNknmwPQplem5lAZX/eCOzSvSNNcSKm5eVwTkOBzoktEfXsa9L23J/GIRhxRsaxzkPEhrJEpE2F4Gg==",
       "dev": true,
       "requires": {
       "dev": true,
       "requires": {
-        "bl": "^4.1.0",
-        "chalk": "^4.1.0",
-        "cli-cursor": "^3.1.0",
-        "cli-spinners": "^2.5.0",
-        "is-interactive": "^1.0.0",
-        "is-unicode-supported": "^0.1.0",
-        "log-symbols": "^4.1.0",
-        "strip-ansi": "^6.0.0",
-        "wcwidth": "^1.0.1"
+        "agentkeepalive": "^4.1.3",
+        "cacache": "^15.2.0",
+        "http-cache-semantics": "^4.1.0",
+        "http-proxy-agent": "^4.0.1",
+        "https-proxy-agent": "^5.0.0",
+        "is-lambda": "^1.0.1",
+        "lru-cache": "^6.0.0",
+        "minipass": "^3.1.3",
+        "minipass-collect": "^1.0.2",
+        "minipass-fetch": "^1.3.2",
+        "minipass-flush": "^1.0.5",
+        "minipass-pipeline": "^1.2.4",
+        "negotiator": "^0.6.2",
+        "promise-retry": "^2.0.1",
+        "socks-proxy-agent": "^6.0.0",
+        "ssri": "^8.0.0"
       },
       "dependencies": {
       },
       "dependencies": {
-        "ansi-styles": {
-          "version": "4.3.0",
-          "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
-          "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
-          "dev": true,
-          "requires": {
-            "color-convert": "^2.0.1"
-          }
-        },
-        "chalk": {
-          "version": "4.1.2",
-          "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
-          "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
-          "dev": true,
-          "requires": {
-            "ansi-styles": "^4.1.0",
-            "supports-color": "^7.1.0"
-          }
-        },
-        "color-convert": {
-          "version": "2.0.1",
-          "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
-          "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+        "lru-cache": {
+          "version": "6.0.0",
+          "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz",
+          "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==",
           "dev": true,
           "requires": {
           "dev": true,
           "requires": {
-            "color-name": "~1.1.4"
+            "yallist": "^4.0.0"
           }
         },
           }
         },
-        "color-name": {
-          "version": "1.1.4",
-          "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
-          "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
-          "dev": true
-        },
-        "has-flag": {
+        "yallist": {
           "version": "4.0.0",
           "version": "4.0.0",
-          "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
-          "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+          "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
+          "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==",
           "dev": true
           "dev": true
-        },
-        "supports-color": {
-          "version": "7.2.0",
-          "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
-          "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
-          "dev": true,
-          "requires": {
-            "has-flag": "^4.0.0"
-          }
         }
       }
     },
         }
       }
     },
-    "os-browserify": {
-      "version": "0.3.0",
-      "resolved": "https://registry.npmjs.org/os-browserify/-/os-browserify-0.3.0.tgz",
-      "integrity": "sha512-gjcpUc3clBf9+210TRaDWbf+rZZZEshZ+DlXMRCeAjp0xhTrnQsKHypIy1J3d5hKdUzj69t708EHtU8P6bUn0A==",
-      "dev": true
-    },
-    "os-locale": {
-      "version": "3.1.0",
-      "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-3.1.0.tgz",
-      "integrity": "sha512-Z8l3R4wYWM40/52Z+S265okfFj8Kt2cC2MKY+xNi3kFs+XGI7WXu/I309QQQYbRW4ijiZ+yxs9pqEhJh0DqW3Q==",
+    "make-iterator": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/make-iterator/-/make-iterator-1.0.1.tgz",
+      "integrity": "sha512-pxiuXh0iVEq7VM7KMIhs5gxsfxCux2URptUQaXo4iZZJxBAzTPOLE2BumO5dbfVYq/hBJFBR/a1mFDmOx5AGmw==",
       "dev": true,
       "requires": {
       "dev": true,
       "requires": {
-        "execa": "^1.0.0",
-        "lcid": "^2.0.0",
-        "mem": "^4.0.0"
-      },
-      "dependencies": {
-        "mem": {
-          "version": "4.3.0",
-          "resolved": "https://registry.npmjs.org/mem/-/mem-4.3.0.tgz",
-          "integrity": "sha512-qX2bG48pTqYRVmDB37rn/6PT7LcR8T7oAX3bf99u1Tt1nzxYfxkgqDwUwolPlXweM0XzBOBFzSx4kfp7KP1s/w==",
-          "dev": true,
-          "requires": {
-            "map-age-cleaner": "^0.1.1",
-            "mimic-fn": "^2.0.0",
-            "p-is-promise": "^2.0.0"
-          }
-        }
+        "kind-of": "^6.0.2"
       }
     },
       }
     },
-    "os-name": {
-      "version": "4.0.1",
-      "resolved": "https://registry.npmjs.org/os-name/-/os-name-4.0.1.tgz",
-      "integrity": "sha512-xl9MAoU97MH1Xt5K9ERft2YfCAoaO6msy1OBA0ozxEC0x0TmIoE6K3QvgJMMZA9yKGLmHXNY/YZoDbiGDj4zYw==",
+    "makeerror": {
+      "version": "1.0.12",
+      "resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.12.tgz",
+      "integrity": "sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==",
       "dev": true,
       "requires": {
       "dev": true,
       "requires": {
-        "macos-release": "^2.5.0",
-        "windows-release": "^4.0.0"
+        "tmpl": "1.0.5"
       }
     },
       }
     },
-    "os-tmpdir": {
-      "version": "1.0.2",
-      "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz",
-      "integrity": "sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==",
-      "dev": true
-    },
-    "ospath": {
-      "version": "1.2.2",
-      "resolved": "https://registry.npmjs.org/ospath/-/ospath-1.2.2.tgz",
-      "integrity": "sha512-o6E5qJV5zkAbIDNhGSIlyOhScKXgQrSRMilfph0clDfM0nEnBOlKlH4sWDmG95BW/CvwNz0vmm7dJVtU2KlMiA==",
-      "dev": true
-    },
-    "outpipe": {
-      "version": "1.1.1",
-      "resolved": "https://registry.npmjs.org/outpipe/-/outpipe-1.1.1.tgz",
-      "integrity": "sha512-BnNY/RwnDrkmQdUa9U+OfN/Y7AWmKuUPCCd+hbRclZnnANvYpO72zp/a6Q4n829hPbdqEac31XCcsvlEvb+rtA==",
+    "map-age-cleaner": {
+      "version": "0.1.3",
+      "resolved": "https://registry.npmjs.org/map-age-cleaner/-/map-age-cleaner-0.1.3.tgz",
+      "integrity": "sha512-bJzx6nMoP6PDLPBFmg7+xRKeFZvFboMrGlxmNj9ClvX53KrmvM5bXFXEWjbz4cz1AFn+jWJ9z/DJSz7hrs0w3w==",
       "dev": true,
       "requires": {
       "dev": true,
       "requires": {
-        "shell-quote": "^1.4.2"
+        "p-defer": "^1.0.0"
       }
     },
       }
     },
-    "p-defer": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/p-defer/-/p-defer-1.0.0.tgz",
-      "integrity": "sha512-wB3wfAxZpk2AzOfUMJNL+d36xothRSyj8EXOa4f6GMqYDN9BJaaSISbsk+wS9abmnebVw95C2Kb5t85UmpCxuw==",
-      "dev": true
-    },
-    "p-each-series": {
-      "version": "2.2.0",
-      "resolved": "https://registry.npmjs.org/p-each-series/-/p-each-series-2.2.0.tgz",
-      "integrity": "sha512-ycIL2+1V32th+8scbpTvyHNaHe02z0sjgh91XXjAk+ZeXoPN4Z46DVUnzdso0aX4KckKw0FNNFHdjZ2UsZvxiA==",
+    "map-cache": {
+      "version": "0.2.2",
+      "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz",
+      "integrity": "sha512-8y/eV9QQZCiyn1SprXSrCmqJN0yNRATe+PO8ztwqrvrbdRLA3eYJF0yaR0YayLWkMbsQSKWS9N2gPcGEc4UsZg==",
       "dev": true
     },
       "dev": true
     },
-    "p-finally": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz",
-      "integrity": "sha512-LICb2p9CB7FS+0eR1oqWnHhp0FljGLZCWBE9aix0Uye9W8LTQPwMTYVGWQWIw9RdQiDg4+epXQODwIYJtSJaow==",
+    "map-obj": {
+      "version": "4.3.0",
+      "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-4.3.0.tgz",
+      "integrity": "sha512-hdN1wVrZbb29eBGiGjJbeP8JbKjq1urkHJ/LIP/NY48MZ1QVXUsQBV1G1zvYFHn1XE06cwjBsOI2K3Ulnj1YXQ==",
       "dev": true
     },
       "dev": true
     },
-    "p-is-promise": {
-      "version": "2.1.0",
-      "resolved": "https://registry.npmjs.org/p-is-promise/-/p-is-promise-2.1.0.tgz",
-      "integrity": "sha512-Y3W0wlRPK8ZMRbNq97l4M5otioeA5lm1z7bkNkxCka8HSPjR0xRWmpCmc9utiaLP9Jb1eD8BgeIxTW4AIF45Pg==",
+    "map-stream": {
+      "version": "0.0.7",
+      "resolved": "https://registry.npmjs.org/map-stream/-/map-stream-0.0.7.tgz",
+      "integrity": "sha512-C0X0KQmGm3N2ftbTGBhSyuydQ+vV1LC3f3zPvT3RXHXNZrvfPZcoXp/N5DOa8vedX/rTMm2CjTtivFg2STJMRQ==",
       "dev": true
     },
       "dev": true
     },
-    "p-limit": {
-      "version": "2.3.0",
-      "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz",
-      "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==",
+    "map-visit": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz",
+      "integrity": "sha512-4y7uGv8bd2WdM9vpQsiQNo41Ln1NvhvDRuVt0k2JZQ+ezN2uaQes7lZeZ+QQUHOLQAtDaBJ+7wCbi+ab/KFs+w==",
       "dev": true,
       "requires": {
       "dev": true,
       "requires": {
-        "p-try": "^2.0.0"
+        "object-visit": "^1.0.0"
       }
     },
       }
     },
-    "p-locate": {
-      "version": "4.1.0",
-      "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz",
-      "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==",
-      "dev": true,
-      "requires": {
-        "p-limit": "^2.2.0"
-      }
+    "marked": {
+      "version": "4.2.12",
+      "resolved": "https://registry.npmjs.org/marked/-/marked-4.2.12.tgz",
+      "integrity": "sha512-yr8hSKa3Fv4D3jdZmtMMPghgVt6TWbk86WQaWhDloQjRSQhMMYCAro7jP7VDJrjjdV8pxVxMssXS8B8Y5DZ5aw==",
+      "dev": true
     },
     },
-    "p-map": {
-      "version": "4.0.0",
-      "resolved": "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz",
-      "integrity": "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==",
+    "mathml-tag-names": {
+      "version": "2.1.3",
+      "resolved": "https://registry.npmjs.org/mathml-tag-names/-/mathml-tag-names-2.1.3.tgz",
+      "integrity": "sha512-APMBEanjybaPzUrfqU0IMU5I0AswKMH7k8OTLs0vvV4KZpExkTkY87nR/zpbuTPj+gARop7aGUbl11pnDfW6xg==",
+      "dev": true
+    },
+    "md5": {
+      "version": "2.3.0",
+      "resolved": "https://registry.npmjs.org/md5/-/md5-2.3.0.tgz",
+      "integrity": "sha512-T1GITYmFaKuO91vxyoQMFETst+O71VUPEU3ze5GNzDm0OWdP8v1ziTaAEPUr/3kLsY3Sftgz242A1SetQiDL7g==",
       "dev": true,
       "requires": {
       "dev": true,
       "requires": {
-        "aggregate-error": "^3.0.0"
+        "charenc": "0.0.2",
+        "crypt": "0.0.2",
+        "is-buffer": "~1.1.6"
       }
     },
       }
     },
-    "p-retry": {
-      "version": "3.0.1",
-      "resolved": "https://registry.npmjs.org/p-retry/-/p-retry-3.0.1.tgz",
-      "integrity": "sha512-XE6G4+YTTkT2a0UWb2kjZe8xNwf8bIbnqpc/IS/idOBVhyves0mK5OJgeocjx7q5pvX/6m23xuzVPYT1uGM73w==",
+    "md5.js": {
+      "version": "1.3.5",
+      "resolved": "https://registry.npmjs.org/md5.js/-/md5.js-1.3.5.tgz",
+      "integrity": "sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg==",
       "dev": true,
       "requires": {
       "dev": true,
       "requires": {
-        "retry": "^0.12.0"
+        "hash-base": "^3.0.0",
+        "inherits": "^2.0.1",
+        "safe-buffer": "^5.1.2"
       }
     },
       }
     },
-    "p-try": {
-      "version": "2.2.0",
-      "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz",
-      "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==",
-      "dev": true
-    },
-    "pacote": {
-      "version": "11.3.5",
-      "resolved": "https://registry.npmjs.org/pacote/-/pacote-11.3.5.tgz",
-      "integrity": "sha512-fT375Yczn4zi+6Hkk2TBe1x1sP8FgFsEIZ2/iWaXY2r/NkhDJfxbcn5paz1+RTFCyNf+dPnaoBDJoAxXSU8Bkg==",
+    "mdast-util-from-markdown": {
+      "version": "0.8.5",
+      "resolved": "https://registry.npmjs.org/mdast-util-from-markdown/-/mdast-util-from-markdown-0.8.5.tgz",
+      "integrity": "sha512-2hkTXtYYnr+NubD/g6KGBS/0mFmBcifAsI0yIWRiRo0PjVs6SSOSOdtzbp6kSGnShDN6G5aWZpKQ2lWRy27mWQ==",
       "dev": true,
       "requires": {
       "dev": true,
       "requires": {
-        "@npmcli/git": "^2.1.0",
-        "@npmcli/installed-package-contents": "^1.0.6",
-        "@npmcli/promise-spawn": "^1.2.0",
-        "@npmcli/run-script": "^1.8.2",
-        "cacache": "^15.0.5",
-        "chownr": "^2.0.0",
-        "fs-minipass": "^2.1.0",
-        "infer-owner": "^1.0.4",
-        "minipass": "^3.1.3",
-        "mkdirp": "^1.0.3",
-        "npm-package-arg": "^8.0.1",
-        "npm-packlist": "^2.1.4",
-        "npm-pick-manifest": "^6.0.0",
-        "npm-registry-fetch": "^11.0.0",
-        "promise-retry": "^2.0.1",
-        "read-package-json-fast": "^2.0.1",
-        "rimraf": "^3.0.2",
-        "ssri": "^8.0.1",
-        "tar": "^6.1.0"
+        "@types/mdast": "^3.0.0",
+        "mdast-util-to-string": "^2.0.0",
+        "micromark": "~2.11.0",
+        "parse-entities": "^2.0.0",
+        "unist-util-stringify-position": "^2.0.0"
       }
     },
       }
     },
-    "pad-right": {
-      "version": "0.2.2",
-      "resolved": "https://registry.npmjs.org/pad-right/-/pad-right-0.2.2.tgz",
-      "integrity": "sha512-4cy8M95ioIGolCoMmm2cMntGR1lPLEbOMzOKu8bzjuJP6JpzEMQcDHmh7hHLYGgob+nKe1YHFMaG4V59HQa89g==",
+    "mdast-util-to-markdown": {
+      "version": "0.6.5",
+      "resolved": "https://registry.npmjs.org/mdast-util-to-markdown/-/mdast-util-to-markdown-0.6.5.tgz",
+      "integrity": "sha512-XeV9sDE7ZlOQvs45C9UKMtfTcctcaj/pGwH8YLbMHoMOXNNCn2LsqVQOqrF1+/NU8lKDAqozme9SCXWyo9oAcQ==",
       "dev": true,
       "requires": {
       "dev": true,
       "requires": {
-        "repeat-string": "^1.5.2"
+        "@types/unist": "^2.0.0",
+        "longest-streak": "^2.0.0",
+        "mdast-util-to-string": "^2.0.0",
+        "parse-entities": "^2.0.0",
+        "repeat-string": "^1.0.0",
+        "zwitch": "^1.0.0"
       }
     },
       }
     },
-    "pako": {
-      "version": "1.0.11",
-      "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz",
-      "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==",
+    "mdast-util-to-string": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/mdast-util-to-string/-/mdast-util-to-string-2.0.0.tgz",
+      "integrity": "sha512-AW4DRS3QbBayY/jJmD8437V1Gombjf8RSOUCMFBuo5iHi58AGEgVCKQ+ezHkZZDpAQS75hcBMpLqjpJTjtUL7w==",
       "dev": true
     },
       "dev": true
     },
-    "parent-module": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz",
-      "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==",
+    "mdn-data": {
+      "version": "2.0.6",
+      "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.6.tgz",
+      "integrity": "sha512-rQvjv71olwNHgiTbfPZFkJtjNMciWgswYeciZhtvWLO8bmX3TnhyA62I6sTWOyZssWHJJjY6/KiWwqQsWWsqOA==",
+      "dev": true
+    },
+    "media-typer": {
+      "version": "0.3.0",
+      "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz",
+      "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==",
+      "dev": true
+    },
+    "mem": {
+      "version": "4.3.0",
+      "resolved": "https://registry.npmjs.org/mem/-/mem-4.3.0.tgz",
+      "integrity": "sha512-qX2bG48pTqYRVmDB37rn/6PT7LcR8T7oAX3bf99u1Tt1nzxYfxkgqDwUwolPlXweM0XzBOBFzSx4kfp7KP1s/w==",
       "dev": true,
       "requires": {
       "dev": true,
       "requires": {
-        "callsites": "^3.0.0"
+        "map-age-cleaner": "^0.1.1",
+        "mimic-fn": "^2.0.0",
+        "p-is-promise": "^2.0.0"
       }
     },
       }
     },
-    "parents": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/parents/-/parents-1.0.1.tgz",
-      "integrity": "sha512-mXKF3xkoUt5td2DoxpLmtOmZvko9VfFpwRwkKDHSNvgmpLAeBo18YDhcPbBzJq+QLCHMbGOfzia2cX4U+0v9Mg==",
+    "memfs": {
+      "version": "3.4.13",
+      "resolved": "https://registry.npmjs.org/memfs/-/memfs-3.4.13.tgz",
+      "integrity": "sha512-omTM41g3Skpvx5dSYeZIbXKcXoAVc/AoMNwn9TKx++L/gaen/+4TTttmu8ZSch5vfVJ8uJvGbroTsIlslRg6lg==",
       "dev": true,
       "requires": {
       "dev": true,
       "requires": {
-        "path-platform": "~0.11.15"
+        "fs-monkey": "^1.0.3"
       }
     },
       }
     },
-    "parse-asn1": {
-      "version": "5.1.6",
-      "resolved": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.6.tgz",
-      "integrity": "sha512-RnZRo1EPU6JBnra2vGHj0yhp6ebyjBZpmUCLHWiFhxlzvBCCpAuZ7elsBp1PVAbQN0/04VD/19rfzlBSwLstMw==",
+    "memory-fs": {
+      "version": "0.5.0",
+      "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.5.0.tgz",
+      "integrity": "sha512-jA0rdU5KoQMC0e6ppoNRtpp6vjFq6+NY7r8hywnC7V+1Xj/MtHwGIbB1QaK/dunyjWteJzmkpd7ooeWg10T7GA==",
       "dev": true,
       "requires": {
       "dev": true,
       "requires": {
-        "asn1.js": "^5.2.0",
-        "browserify-aes": "^1.0.0",
-        "evp_bytestokey": "^1.0.0",
-        "pbkdf2": "^3.0.3",
-        "safe-buffer": "^5.1.1"
+        "errno": "^0.1.3",
+        "readable-stream": "^2.0.1"
       }
     },
       }
     },
-    "parse-entities": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/parse-entities/-/parse-entities-2.0.0.tgz",
-      "integrity": "sha512-kkywGpCcRYhqQIchaWqZ875wzpS/bMKhz5HnN3p7wveJTkTtyAB/AlnS0f8DFSqYW1T82t6yEAkEcB+A1I3MbQ==",
-      "requires": {
-        "character-entities": "^1.0.0",
-        "character-entities-legacy": "^1.0.0",
-        "character-reference-invalid": "^1.0.0",
-        "is-alphanumerical": "^1.0.0",
-        "is-decimal": "^1.0.0",
-        "is-hexadecimal": "^1.0.0"
-      }
+    "memorystream": {
+      "version": "0.3.1",
+      "resolved": "https://registry.npmjs.org/memorystream/-/memorystream-0.3.1.tgz",
+      "integrity": "sha512-S3UwM3yj5mtUSEfP41UZmt/0SCoVYUcU1rkXv+BQ5Ig8ndL4sPoJNBUJERafdPb5jjHJGuMgytgKvKIf58XNBw==",
+      "dev": true
     },
     },
-    "parse-filepath": {
-      "version": "1.0.2",
-      "resolved": "https://registry.npmjs.org/parse-filepath/-/parse-filepath-1.0.2.tgz",
-      "integrity": "sha512-FwdRXKCohSVeXqwtYonZTXtbGJKrn+HNyWDYVcp5yuJlesTwNH4rsmRZ+GrKAPJ5bLpRxESMeS+Rl0VCHRvB2Q==",
+    "meow": {
+      "version": "9.0.0",
+      "resolved": "https://registry.npmjs.org/meow/-/meow-9.0.0.tgz",
+      "integrity": "sha512-+obSblOQmRhcyBt62furQqRAQpNyWXo8BuQ5bN7dG8wmwQ+vwHKp/rCFD4CrTP8CsDQD1sjoZ94K417XEUk8IQ==",
       "dev": true,
       "requires": {
       "dev": true,
       "requires": {
-        "is-absolute": "^1.0.0",
-        "map-cache": "^0.2.0",
-        "path-root": "^0.1.1"
+        "@types/minimist": "^1.2.0",
+        "camelcase-keys": "^6.2.2",
+        "decamelize": "^1.2.0",
+        "decamelize-keys": "^1.1.0",
+        "hard-rejection": "^2.1.0",
+        "minimist-options": "4.1.0",
+        "normalize-package-data": "^3.0.0",
+        "read-pkg-up": "^7.0.1",
+        "redent": "^3.0.0",
+        "trim-newlines": "^3.0.0",
+        "type-fest": "^0.18.0",
+        "yargs-parser": "^20.2.3"
+      },
+      "dependencies": {
+        "decamelize": {
+          "version": "1.2.0",
+          "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz",
+          "integrity": "sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==",
+          "dev": true
+        },
+        "lru-cache": {
+          "version": "6.0.0",
+          "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz",
+          "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==",
+          "dev": true,
+          "requires": {
+            "yallist": "^4.0.0"
+          }
+        },
+        "normalize-package-data": {
+          "version": "3.0.3",
+          "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-3.0.3.tgz",
+          "integrity": "sha512-p2W1sgqij3zMMyRC067Dg16bfzVH+w7hyegmpIvZ4JNjqtGOVAIvLmjBx3yP7YTe9vKJgkoNOPjwQGogDoMXFA==",
+          "dev": true,
+          "requires": {
+            "hosted-git-info": "^4.0.1",
+            "is-core-module": "^2.5.0",
+            "semver": "^7.3.4",
+            "validate-npm-package-license": "^3.0.1"
+          }
+        },
+        "semver": {
+          "version": "7.3.8",
+          "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz",
+          "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==",
+          "dev": true,
+          "requires": {
+            "lru-cache": "^6.0.0"
+          }
+        },
+        "type-fest": {
+          "version": "0.18.1",
+          "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.18.1.tgz",
+          "integrity": "sha512-OIAYXk8+ISY+qTOwkHtKqzAuxchoMiD9Udx+FSGQDuiRR+PJKJHc2NJAXlbhkGwTt/4/nKZxELY1w3ReWOL8mw==",
+          "dev": true
+        },
+        "yallist": {
+          "version": "4.0.0",
+          "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
+          "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==",
+          "dev": true
+        },
+        "yargs-parser": {
+          "version": "20.2.9",
+          "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz",
+          "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==",
+          "dev": true
+        }
       }
     },
       }
     },
-    "parse-json": {
-      "version": "5.2.0",
-      "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz",
-      "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==",
+    "merge-descriptors": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz",
+      "integrity": "sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==",
+      "dev": true
+    },
+    "merge-source-map": {
+      "version": "1.0.4",
+      "resolved": "https://registry.npmjs.org/merge-source-map/-/merge-source-map-1.0.4.tgz",
+      "integrity": "sha512-PGSmS0kfnTnMJCzJ16BLLCEe6oeYCamKFFdQKshi4BmM6FUwipjVOcBFGxqtQtirtAG4iZvHlqST9CpZKqlRjA==",
       "dev": true,
       "requires": {
       "dev": true,
       "requires": {
-        "@babel/code-frame": "^7.0.0",
-        "error-ex": "^1.3.1",
-        "json-parse-even-better-errors": "^2.3.0",
-        "lines-and-columns": "^1.1.6"
+        "source-map": "^0.5.6"
+      },
+      "dependencies": {
+        "source-map": {
+          "version": "0.5.7",
+          "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz",
+          "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==",
+          "dev": true
+        }
       }
     },
       }
     },
-    "parse-node-version": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/parse-node-version/-/parse-node-version-1.0.1.tgz",
-      "integrity": "sha512-3YHlOa/JgH6Mnpr05jP9eDG254US9ek25LyIxZlDItp2iJtwyaXQb57lBYLdT3MowkUFYEV2XXNAYIPlESvJlA==",
+    "merge-stream": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz",
+      "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==",
       "dev": true
     },
       "dev": true
     },
-    "parse-passwd": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/parse-passwd/-/parse-passwd-1.0.0.tgz",
-      "integrity": "sha512-1Y1A//QUXEZK7YKz+rD9WydcE1+EuPr6ZBgKecAB8tmoW6UFv0NREVJe1p+jRxtThkcbbKkfwIbWJe/IeE6m2Q==",
+    "merge2": {
+      "version": "1.4.1",
+      "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz",
+      "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==",
       "dev": true
     },
       "dev": true
     },
-    "parse5": {
-      "version": "6.0.1",
-      "resolved": "https://registry.npmjs.org/parse5/-/parse5-6.0.1.tgz",
-      "integrity": "sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==",
+    "methods": {
+      "version": "1.1.2",
+      "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz",
+      "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==",
       "dev": true
     },
       "dev": true
     },
-    "parse5-html-rewriting-stream": {
-      "version": "6.0.1",
-      "resolved": "https://registry.npmjs.org/parse5-html-rewriting-stream/-/parse5-html-rewriting-stream-6.0.1.tgz",
-      "integrity": "sha512-vwLQzynJVEfUlURxgnf51yAJDQTtVpNyGD8tKi2Za7m+akukNHxCcUQMAa/mUGLhCeicFdpy7Tlvj8ZNKadprg==",
+    "micromark": {
+      "version": "2.11.4",
+      "resolved": "https://registry.npmjs.org/micromark/-/micromark-2.11.4.tgz",
+      "integrity": "sha512-+WoovN/ppKolQOFIAajxi7Lu9kInbPxFuTBVEavFcL8eAfVstoc5MocPmqBeAdBOJV00uaVjegzH4+MA0DN/uA==",
       "dev": true,
       "requires": {
       "dev": true,
       "requires": {
-        "parse5": "^6.0.1",
-        "parse5-sax-parser": "^6.0.1"
+        "debug": "^4.0.0",
+        "parse-entities": "^2.0.0"
       }
     },
       }
     },
-    "parse5-htmlparser2-tree-adapter": {
-      "version": "6.0.1",
-      "resolved": "https://registry.npmjs.org/parse5-htmlparser2-tree-adapter/-/parse5-htmlparser2-tree-adapter-6.0.1.tgz",
-      "integrity": "sha512-qPuWvbLgvDGilKc5BoicRovlT4MtYT6JfJyBOMDsKoiT+GiuP5qyrPCnR9HcPECIJJmZh5jRndyNThnhhb/vlA==",
+    "micromatch": {
+      "version": "4.0.5",
+      "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz",
+      "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==",
       "dev": true,
       "requires": {
       "dev": true,
       "requires": {
-        "parse5": "^6.0.1"
+        "braces": "^3.0.2",
+        "picomatch": "^2.3.1"
       }
       }
-    },
-    "parse5-sax-parser": {
-      "version": "6.0.1",
-      "resolved": "https://registry.npmjs.org/parse5-sax-parser/-/parse5-sax-parser-6.0.1.tgz",
-      "integrity": "sha512-kXX+5S81lgESA0LsDuGjAlBybImAChYRMT+/uKCEXFBFOeEhS52qUCydGhU3qLRD8D9DVjaUo821WK7DM4iCeg==",
+    },
+    "miller-rabin": {
+      "version": "4.0.1",
+      "resolved": "https://registry.npmjs.org/miller-rabin/-/miller-rabin-4.0.1.tgz",
+      "integrity": "sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA==",
       "dev": true,
       "requires": {
       "dev": true,
       "requires": {
-        "parse5": "^6.0.1"
+        "bn.js": "^4.0.0",
+        "brorand": "^1.0.1"
+      },
+      "dependencies": {
+        "bn.js": {
+          "version": "4.12.0",
+          "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz",
+          "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==",
+          "dev": true
+        }
       }
     },
       }
     },
-    "parseurl": {
-      "version": "1.3.3",
-      "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz",
-      "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==",
+    "mime": {
+      "version": "1.6.0",
+      "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz",
+      "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==",
       "dev": true
     },
       "dev": true
     },
-    "pascalcase": {
-      "version": "0.1.1",
-      "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz",
-      "integrity": "sha512-XHXfu/yOQRy9vYOtUDVMN60OEJjW013GoObG1o+xwQTpB9eYJX/BjXMsdW13ZDPruFhYYn0AG22w0xgQMwl3Nw==",
-      "dev": true
+    "mime-db": {
+      "version": "1.52.0",
+      "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz",
+      "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg=="
     },
     },
-    "path-browserify": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-1.0.1.tgz",
-      "integrity": "sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==",
-      "dev": true
+    "mime-types": {
+      "version": "2.1.35",
+      "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz",
+      "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==",
+      "requires": {
+        "mime-db": "1.52.0"
+      }
     },
     },
-    "path-dirname": {
-      "version": "1.0.2",
-      "resolved": "https://registry.npmjs.org/path-dirname/-/path-dirname-1.0.2.tgz",
-      "integrity": "sha512-ALzNPpyNq9AqXMBjeymIjFDAkAFH06mHJH/cSBHAgU0s4vfpBn6b2nf8tiRLvagKD8RbTpq2FKTBg7cl9l3c7Q==",
+    "mimic-fn": {
+      "version": "2.1.0",
+      "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz",
+      "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==",
       "dev": true
     },
       "dev": true
     },
-    "path-exists": {
-      "version": "4.0.0",
-      "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz",
-      "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==",
-      "dev": true
+    "mimic-response": {
+      "version": "2.1.0",
+      "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-2.1.0.tgz",
+      "integrity": "sha512-wXqjST+SLt7R009ySCglWBCFpjUygmCIfD790/kVbiGmUgfYGuB14PiTd5DwVxSV4NcYHjzMkoj5LjQZwTQLEA==",
+      "optional": true
     },
     },
-    "path-is-absolute": {
+    "min-indent": {
       "version": "1.0.1",
       "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
-      "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg=="
-    },
-    "path-is-inside": {
-      "version": "1.0.2",
-      "resolved": "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz",
-      "integrity": "sha512-DUWJr3+ULp4zXmol/SZkFf3JGsS9/SIv+Y3Rt93/UjPpDpklB5f1er4O3POIbUuUJ3FXgqte2Q7SrU6zAqwk8w==",
-      "dev": true
-    },
-    "path-key": {
-      "version": "2.0.1",
-      "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz",
-      "integrity": "sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw==",
-      "dev": true
-    },
-    "path-parse": {
-      "version": "1.0.7",
-      "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz",
-      "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw=="
-    },
-    "path-platform": {
-      "version": "0.11.15",
-      "resolved": "https://registry.npmjs.org/path-platform/-/path-platform-0.11.15.tgz",
-      "integrity": "sha512-Y30dB6rab1A/nfEKsZxmr01nUotHX0c/ZiIAsCTatEe1CmS5Pm5He7fZ195bPT7RdquoaL8lLxFCMQi/bS7IJg==",
+      "resolved": "https://registry.npmjs.org/min-indent/-/min-indent-1.0.1.tgz",
+      "integrity": "sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==",
       "dev": true
     },
       "dev": true
     },
-    "path-root": {
-      "version": "0.1.1",
-      "resolved": "https://registry.npmjs.org/path-root/-/path-root-0.1.1.tgz",
-      "integrity": "sha512-QLcPegTHF11axjfojBIoDygmS2E3Lf+8+jI6wOVmNVenrKSo3mFdSGiIgdSHenczw3wPtlVMQaFVwGmM7BJdtg==",
+    "mini-css-extract-plugin": {
+      "version": "2.5.3",
+      "resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-2.5.3.tgz",
+      "integrity": "sha512-YseMB8cs8U/KCaAGQoqYmfUuhhGW0a9p9XvWXrxVOkE3/IiISTLw4ALNt7JR5B2eYauFM+PQGSbXMDmVbR7Tfw==",
       "dev": true,
       "requires": {
       "dev": true,
       "requires": {
-        "path-root-regex": "^0.1.0"
+        "schema-utils": "^4.0.0"
+      },
+      "dependencies": {
+        "ajv-keywords": {
+          "version": "5.1.0",
+          "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz",
+          "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==",
+          "dev": true,
+          "requires": {
+            "fast-deep-equal": "^3.1.3"
+          }
+        },
+        "schema-utils": {
+          "version": "4.0.0",
+          "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.0.0.tgz",
+          "integrity": "sha512-1edyXKgh6XnJsJSQ8mKWXnN/BVaIbFMLpouRUrXgVq7WYne5kw3MW7UPhO44uRXQSIpTSXoJbmrR2X0w9kUTyg==",
+          "dev": true,
+          "requires": {
+            "@types/json-schema": "^7.0.9",
+            "ajv": "^8.8.0",
+            "ajv-formats": "^2.1.1",
+            "ajv-keywords": "^5.0.0"
+          }
+        }
       }
     },
       }
     },
-    "path-root-regex": {
-      "version": "0.1.2",
-      "resolved": "https://registry.npmjs.org/path-root-regex/-/path-root-regex-0.1.2.tgz",
-      "integrity": "sha512-4GlJ6rZDhQZFE0DPVKh0e9jmZ5egZfxTkp7bcRDuPlJXbAwhxcl2dINPUAsjLdejqaLsCeg8axcLjIbvBjN4pQ==",
-      "dev": true
-    },
-    "path-to-regexp": {
-      "version": "0.1.7",
-      "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz",
-      "integrity": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==",
-      "dev": true
+    "minim": {
+      "version": "0.23.8",
+      "resolved": "https://registry.npmjs.org/minim/-/minim-0.23.8.tgz",
+      "integrity": "sha512-bjdr2xW1dBCMsMGGsUeqM4eFI60m94+szhxWys+B1ztIt6gWSfeGBdSVCIawezeHYLYn0j6zrsXdQS/JllBzww==",
+      "requires": {
+        "lodash": "^4.15.0"
+      }
     },
     },
-    "path-type": {
-      "version": "4.0.0",
-      "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz",
-      "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==",
+    "minimalistic-assert": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz",
+      "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==",
       "dev": true
     },
       "dev": true
     },
-    "pathval": {
-      "version": "1.1.1",
-      "resolved": "https://registry.npmjs.org/pathval/-/pathval-1.1.1.tgz",
-      "integrity": "sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==",
+    "minimalistic-crypto-utils": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz",
+      "integrity": "sha512-JIYlbt6g8i5jKfJ3xz7rF0LXmv2TkDxBLUkiBeZ7bAx4GnnNMr8xFpGnOxn6GhTEHx3SjRrZEoU+j04prX1ktg==",
       "dev": true
     },
       "dev": true
     },
-    "pause-stream": {
-      "version": "0.0.11",
-      "resolved": "https://registry.npmjs.org/pause-stream/-/pause-stream-0.0.11.tgz",
-      "integrity": "sha512-e3FBlXLmN/D1S+zHzanP4E/4Z60oFAa3O051qt1pxa7DEJWKAyil6upYVXCWadEnuoqa4Pkc9oUx9zsxYeRv8A==",
-      "dev": true,
+    "minimatch": {
+      "version": "3.1.2",
+      "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz",
+      "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==",
       "requires": {
       "requires": {
-        "through": "~2.3"
+        "brace-expansion": "^1.1.7"
       }
     },
       }
     },
-    "pbkdf2": {
-      "version": "3.1.2",
-      "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.1.2.tgz",
-      "integrity": "sha512-iuh7L6jA7JEGu2WxDwtQP1ddOpaJNC4KlDEFfdQajSGgGPNi4OyDc2R7QnbY2bR9QjBVGwgvTdNJZoE7RaxUMA==",
+    "minimist": {
+      "version": "1.2.8",
+      "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz",
+      "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA=="
+    },
+    "minimist-options": {
+      "version": "4.1.0",
+      "resolved": "https://registry.npmjs.org/minimist-options/-/minimist-options-4.1.0.tgz",
+      "integrity": "sha512-Q4r8ghd80yhO/0j1O3B2BjweX3fiHg9cdOwjJd2J76Q135c+NDxGCqdYKQ1SKBuFfgWbAUzBfvYjPUEeNgqN1A==",
       "dev": true,
       "requires": {
       "dev": true,
       "requires": {
-        "create-hash": "^1.1.2",
-        "create-hmac": "^1.1.4",
-        "ripemd160": "^2.0.1",
-        "safe-buffer": "^5.0.1",
-        "sha.js": "^2.4.8"
+        "arrify": "^1.0.1",
+        "is-plain-obj": "^1.1.0",
+        "kind-of": "^6.0.3"
+      },
+      "dependencies": {
+        "arrify": {
+          "version": "1.0.1",
+          "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz",
+          "integrity": "sha512-3CYzex9M9FGQjCGMGyi6/31c8GJbgb0qGyrx5HWxPd0aCwh4cB2YjMb2Xf9UuoogrMrlO9cTqnB5rI5GHZTcUA==",
+          "dev": true
+        },
+        "is-plain-obj": {
+          "version": "1.1.0",
+          "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz",
+          "integrity": "sha512-yvkRyxmFKEOQ4pNXCmJG5AEQNlXJS5LaONXo5/cLdTZdWvsZ1ioJEonLGAosKlMWE8lwUy/bJzMjcw8az73+Fg==",
+          "dev": true
+        }
       }
     },
       }
     },
-    "pdfmake": {
-      "version": "0.2.5",
-      "resolved": "https://registry.npmjs.org/pdfmake/-/pdfmake-0.2.5.tgz",
-      "integrity": "sha512-NlayjehMtuZEdw2Lyipf/MxOCR2vATZQ7jn8cH0/dHwsNb+mqof9/6SW4jZT5p+So4qz+0mD21KG81+dDQSEhA==",
+    "minipass": {
+      "version": "3.3.6",
+      "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz",
+      "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==",
       "dev": true,
       "requires": {
       "dev": true,
       "requires": {
-        "@foliojs-fork/linebreak": "^1.1.1",
-        "@foliojs-fork/pdfkit": "^0.13.0",
-        "iconv-lite": "^0.6.3",
-        "xmldoc": "^1.1.2"
+        "yallist": "^4.0.0"
       },
       "dependencies": {
       },
       "dependencies": {
-        "iconv-lite": {
-          "version": "0.6.3",
-          "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz",
-          "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==",
-          "dev": true,
-          "requires": {
-            "safer-buffer": ">= 2.1.2 < 3.0.0"
-          }
+        "yallist": {
+          "version": "4.0.0",
+          "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
+          "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==",
+          "dev": true
         }
       }
     },
         }
       }
     },
-    "pend": {
-      "version": "1.2.0",
-      "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz",
-      "integrity": "sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==",
-      "dev": true
-    },
-    "performance-now": {
-      "version": "2.1.0",
-      "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz",
-      "integrity": "sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow==",
-      "dev": true
-    },
-    "picocolors": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz",
-      "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==",
-      "dev": true
-    },
-    "picomatch": {
-      "version": "2.3.1",
-      "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz",
-      "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==",
-      "dev": true
+    "minipass-collect": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/minipass-collect/-/minipass-collect-1.0.2.tgz",
+      "integrity": "sha512-6T6lH0H8OG9kITm/Jm6tdooIbogG9e0tLgpY6mphXSm/A9u8Nq1ryBG+Qspiub9LjWlBPsPS3tWQ/Botq4FdxA==",
+      "dev": true,
+      "requires": {
+        "minipass": "^3.0.0"
+      }
     },
     },
-    "pidtree": {
-      "version": "0.3.1",
-      "resolved": "https://registry.npmjs.org/pidtree/-/pidtree-0.3.1.tgz",
-      "integrity": "sha512-qQbW94hLHEqCg7nhby4yRC7G2+jYHY4Rguc2bjw7Uug4GIJuu1tvf2uHaZv5Q8zdt+WKJ6qK1FOI6amaWUo5FA==",
-      "dev": true
+    "minipass-fetch": {
+      "version": "1.4.1",
+      "resolved": "https://registry.npmjs.org/minipass-fetch/-/minipass-fetch-1.4.1.tgz",
+      "integrity": "sha512-CGH1eblLq26Y15+Azk7ey4xh0J/XfJfrCox5LDJiKqI2Q2iwOLOKrlmIaODiSQS8d18jalF6y2K2ePUm0CmShw==",
+      "dev": true,
+      "requires": {
+        "encoding": "^0.1.12",
+        "minipass": "^3.1.0",
+        "minipass-sized": "^1.0.3",
+        "minizlib": "^2.0.0"
+      }
     },
     },
-    "pify": {
-      "version": "4.0.1",
-      "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz",
-      "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==",
-      "dev": true
+    "minipass-flush": {
+      "version": "1.0.5",
+      "resolved": "https://registry.npmjs.org/minipass-flush/-/minipass-flush-1.0.5.tgz",
+      "integrity": "sha512-JmQSYYpPUqX5Jyn1mXaRwOda1uQ8HP5KAT/oDSLCzt1BYRhQU0/hDtsB1ufZfEEzMZ9aAVmsBw8+FWsIXlClWw==",
+      "dev": true,
+      "requires": {
+        "minipass": "^3.0.0"
+      }
     },
     },
-    "pinkie": {
-      "version": "2.0.4",
-      "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz",
-      "integrity": "sha512-MnUuEycAemtSaeFSjXKW/aroV7akBbY+Sv+RkyqFjgAe73F+MR0TBWKBRDkmfWq/HiFmdavfZ1G7h4SPZXaCSg==",
-      "dev": true
+    "minipass-json-stream": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/minipass-json-stream/-/minipass-json-stream-1.0.1.tgz",
+      "integrity": "sha512-ODqY18UZt/I8k+b7rl2AENgbWE8IDYam+undIJONvigAz8KR5GWblsFTEfQs0WODsjbSXWlm+JHEv8Gr6Tfdbg==",
+      "dev": true,
+      "requires": {
+        "jsonparse": "^1.3.1",
+        "minipass": "^3.0.0"
+      }
     },
     },
-    "pinkie-promise": {
-      "version": "2.0.1",
-      "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz",
-      "integrity": "sha512-0Gni6D4UcLTbv9c57DfxDGdr41XfgUjqWZu492f0cIGr16zDU06BWP/RAEvOuo7CQ0CNjHaLlM59YJJFm3NWlw==",
+    "minipass-pipeline": {
+      "version": "1.2.4",
+      "resolved": "https://registry.npmjs.org/minipass-pipeline/-/minipass-pipeline-1.2.4.tgz",
+      "integrity": "sha512-xuIq7cIOt09RPRJ19gdi4b+RiNvDFYe5JH+ggNvBqGqpQXcru3PcRmOZuHBKWK1Txf9+cQ+HMVN4d6z46LZP7A==",
       "dev": true,
       "requires": {
       "dev": true,
       "requires": {
-        "pinkie": "^2.0.0"
+        "minipass": "^3.0.0"
       }
     },
       }
     },
-    "pirates": {
-      "version": "4.0.5",
-      "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.5.tgz",
-      "integrity": "sha512-8V9+HQPupnaXMA23c5hvl69zXvTwTzyAYasnkb0Tts4XvO4CliqONMOnvlq26rkhLC3nWDFBJf73LU1e1VZLaQ==",
-      "dev": true
-    },
-    "piscina": {
-      "version": "3.1.0",
-      "resolved": "https://registry.npmjs.org/piscina/-/piscina-3.1.0.tgz",
-      "integrity": "sha512-KTW4sjsCD34MHrUbx9eAAbuUSpVj407hQSgk/6Epkg0pbRBmv4a3UX7Sr8wxm9xYqQLnsN4mFOjqGDzHAdgKQg==",
+    "minipass-sized": {
+      "version": "1.0.3",
+      "resolved": "https://registry.npmjs.org/minipass-sized/-/minipass-sized-1.0.3.tgz",
+      "integrity": "sha512-MbkQQ2CTiBMlA2Dm/5cY+9SWFEN8pzzOXi6rlM5Xxq0Yqbda5ZQy9sU75a673FE9ZK0Zsbr6Y5iP6u9nktfg2g==",
       "dev": true,
       "requires": {
       "dev": true,
       "requires": {
-        "eventemitter-asyncresource": "^1.0.0",
-        "hdr-histogram-js": "^2.0.1",
-        "hdr-histogram-percentiles-obj": "^3.0.0",
-        "nice-napi": "^1.0.2"
+        "minipass": "^3.0.0"
       }
     },
       }
     },
-    "pkg-dir": {
-      "version": "4.2.0",
-      "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz",
-      "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==",
+    "minizlib": {
+      "version": "2.1.2",
+      "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz",
+      "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==",
       "dev": true,
       "requires": {
       "dev": true,
       "requires": {
-        "find-up": "^4.0.0"
+        "minipass": "^3.0.0",
+        "yallist": "^4.0.0"
+      },
+      "dependencies": {
+        "yallist": {
+          "version": "4.0.0",
+          "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
+          "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==",
+          "dev": true
+        }
       }
     },
       }
     },
-    "pn": {
-      "version": "1.1.0",
-      "resolved": "https://registry.npmjs.org/pn/-/pn-1.1.0.tgz",
-      "integrity": "sha512-2qHaIQr2VLRFoxe2nASzsV6ef4yOOH+Fi9FBOVH6cqeSgUnoyySPZkxzLuzd+RYOQTRpROA0ztTMqxROKSb/nA==",
-      "dev": true
+    "mixin-deep": {
+      "version": "1.3.2",
+      "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.2.tgz",
+      "integrity": "sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA==",
+      "dev": true,
+      "requires": {
+        "for-in": "^1.0.2",
+        "is-extendable": "^1.0.1"
+      },
+      "dependencies": {
+        "is-extendable": {
+          "version": "1.0.1",
+          "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz",
+          "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==",
+          "dev": true,
+          "requires": {
+            "is-plain-object": "^2.0.4"
+          }
+        },
+        "is-plain-object": {
+          "version": "2.0.4",
+          "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz",
+          "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==",
+          "dev": true,
+          "requires": {
+            "isobject": "^3.0.1"
+          }
+        }
+      }
     },
     },
-    "png-async": {
-      "version": "0.9.4",
-      "resolved": "https://registry.npmjs.org/png-async/-/png-async-0.9.4.tgz",
-      "integrity": "sha512-B//AXX9TkneKfgtOpT1mdUnnhk2BImGD+a98vImsMU8uo1dBeHyW/kM2erWZ/CsYteTPU/xKG+t6T62heHkC3A==",
+    "mkdirp": {
+      "version": "1.0.4",
+      "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz",
+      "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==",
       "dev": true
     },
       "dev": true
     },
-    "png-js": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/png-js/-/png-js-1.0.0.tgz",
-      "integrity": "sha512-k+YsbhpA9e+EFfKjTCH3VW6aoKlyNYI6NYdTfDL4CIvFnvsuO84ttonmZE7rc+v23SLTH8XX+5w/Ak9v0xGY4g==",
-      "dev": true
+    "mkdirp-classic": {
+      "version": "0.5.3",
+      "resolved": "https://registry.npmjs.org/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz",
+      "integrity": "sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A=="
     },
     },
-    "pngjs": {
-      "version": "2.3.1",
-      "resolved": "https://registry.npmjs.org/pngjs/-/pngjs-2.3.1.tgz",
-      "integrity": "sha512-ITNPqvx+SSssNFOgHQzGG87HrqQ0g2nMSHc1jjU5Piq9xJEJ40fiFEPz0S5HSSXxBHrTnhaBHIayTO5aRfk2vw==",
-      "dev": true
+    "mobx": {
+      "version": "4.14.1",
+      "resolved": "https://registry.npmjs.org/mobx/-/mobx-4.14.1.tgz",
+      "integrity": "sha512-Oyg7Sr7r78b+QPYLufJyUmxTWcqeQ96S1nmtyur3QL8SeI6e0TqcKKcxbG+sVJLWANhHQkBW/mDmgG5DDC4fdw=="
     },
     },
-    "pngjs-image": {
-      "version": "0.11.7",
-      "resolved": "https://registry.npmjs.org/pngjs-image/-/pngjs-image-0.11.7.tgz",
-      "integrity": "sha512-JRyrmT+HXa1/gvdHpebus8TGqKa8WRgcsHz/DDalxRsMhvu6AOA99/enBFjZIPvmXVAzwKR051s80TuE1IiCpg==",
+    "mocha": {
+      "version": "9.2.0",
+      "resolved": "https://registry.npmjs.org/mocha/-/mocha-9.2.0.tgz",
+      "integrity": "sha512-kNn7E8g2SzVcq0a77dkphPsDSN7P+iYkqE0ZsGCYWRsoiKjOt+NvXfaagik8vuDa6W5Zw3qxe8Jfpt5qKf+6/Q==",
       "dev": true,
       "requires": {
       "dev": true,
       "requires": {
-        "iconv-lite": "^0.4.8",
-        "pako": "^0.2.6",
-        "pngjs": "2.3.1",
-        "request": "^2.55.0",
-        "stream-buffers": "1.0.1",
-        "underscore": "1.7.0"
+        "@ungap/promise-all-settled": "1.1.2",
+        "ansi-colors": "4.1.1",
+        "browser-stdout": "1.3.1",
+        "chokidar": "3.5.3",
+        "debug": "4.3.3",
+        "diff": "5.0.0",
+        "escape-string-regexp": "4.0.0",
+        "find-up": "5.0.0",
+        "glob": "7.2.0",
+        "growl": "1.10.5",
+        "he": "1.2.0",
+        "js-yaml": "4.1.0",
+        "log-symbols": "4.1.0",
+        "minimatch": "3.0.4",
+        "ms": "2.1.3",
+        "nanoid": "3.2.0",
+        "serialize-javascript": "6.0.0",
+        "strip-json-comments": "3.1.1",
+        "supports-color": "8.1.1",
+        "which": "2.0.2",
+        "workerpool": "6.2.0",
+        "yargs": "16.2.0",
+        "yargs-parser": "20.2.4",
+        "yargs-unparser": "2.0.0"
       },
       "dependencies": {
       },
       "dependencies": {
-        "pako": {
-          "version": "0.2.9",
-          "resolved": "https://registry.npmjs.org/pako/-/pako-0.2.9.tgz",
-          "integrity": "sha512-NUcwaKxUxWrZLpDG+z/xZaCgQITkA/Dv4V/T6bw7VON6l1Xz/VnrBqrYjZQ12TamKHzITTfOEIYUj48y2KXImA==",
+        "cliui": {
+          "version": "7.0.4",
+          "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz",
+          "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==",
+          "dev": true,
+          "requires": {
+            "string-width": "^4.2.0",
+            "strip-ansi": "^6.0.0",
+            "wrap-ansi": "^7.0.0"
+          }
+        },
+        "debug": {
+          "version": "4.3.3",
+          "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.3.tgz",
+          "integrity": "sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==",
+          "dev": true,
+          "requires": {
+            "ms": "2.1.2"
+          },
+          "dependencies": {
+            "ms": {
+              "version": "2.1.2",
+              "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
+              "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
+              "dev": true
+            }
+          }
+        },
+        "escape-string-regexp": {
+          "version": "4.0.0",
+          "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz",
+          "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==",
+          "dev": true
+        },
+        "find-up": {
+          "version": "5.0.0",
+          "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz",
+          "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==",
+          "dev": true,
+          "requires": {
+            "locate-path": "^6.0.0",
+            "path-exists": "^4.0.0"
+          }
+        },
+        "has-flag": {
+          "version": "4.0.0",
+          "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
+          "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+          "dev": true
+        },
+        "locate-path": {
+          "version": "6.0.0",
+          "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz",
+          "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==",
+          "dev": true,
+          "requires": {
+            "p-locate": "^5.0.0"
+          }
+        },
+        "minimatch": {
+          "version": "3.0.4",
+          "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz",
+          "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==",
+          "dev": true,
+          "requires": {
+            "brace-expansion": "^1.1.7"
+          }
+        },
+        "ms": {
+          "version": "2.1.3",
+          "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
+          "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==",
+          "dev": true
+        },
+        "nanoid": {
+          "version": "3.2.0",
+          "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.2.0.tgz",
+          "integrity": "sha512-fmsZYa9lpn69Ad5eDn7FMcnnSR+8R34W9qJEijxYhTbfOWzr22n1QxCMzXLK+ODyW2973V3Fux959iQoUxzUIA==",
+          "dev": true
+        },
+        "p-limit": {
+          "version": "3.1.0",
+          "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz",
+          "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==",
+          "dev": true,
+          "requires": {
+            "yocto-queue": "^0.1.0"
+          }
+        },
+        "p-locate": {
+          "version": "5.0.0",
+          "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz",
+          "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==",
+          "dev": true,
+          "requires": {
+            "p-limit": "^3.0.2"
+          }
+        },
+        "serialize-javascript": {
+          "version": "6.0.0",
+          "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.0.tgz",
+          "integrity": "sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag==",
+          "dev": true,
+          "requires": {
+            "randombytes": "^2.1.0"
+          }
+        },
+        "strip-json-comments": {
+          "version": "3.1.1",
+          "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz",
+          "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==",
+          "dev": true
+        },
+        "supports-color": {
+          "version": "8.1.1",
+          "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz",
+          "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==",
+          "dev": true,
+          "requires": {
+            "has-flag": "^4.0.0"
+          }
+        },
+        "yargs": {
+          "version": "16.2.0",
+          "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz",
+          "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==",
+          "dev": true,
+          "requires": {
+            "cliui": "^7.0.2",
+            "escalade": "^3.1.1",
+            "get-caller-file": "^2.0.5",
+            "require-directory": "^2.1.1",
+            "string-width": "^4.2.0",
+            "y18n": "^5.0.5",
+            "yargs-parser": "^20.2.2"
+          }
+        },
+        "yargs-parser": {
+          "version": "20.2.4",
+          "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.4.tgz",
+          "integrity": "sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA==",
           "dev": true
         }
       }
     },
           "dev": true
         }
       }
     },
-    "portfinder": {
-      "version": "1.0.32",
-      "resolved": "https://registry.npmjs.org/portfinder/-/portfinder-1.0.32.tgz",
-      "integrity": "sha512-on2ZJVVDXRADWE6jnQaX0ioEylzgBpQk8r55NE4wjXW1ZxO+BgDlY6DXwj20i0V8eB4SenDQ00WEaxfiIQPcxg==",
+    "mocha-junit-reporter": {
+      "version": "2.1.0",
+      "resolved": "https://registry.npmjs.org/mocha-junit-reporter/-/mocha-junit-reporter-2.1.0.tgz",
+      "integrity": "sha512-Zhz1J+XqJUaAOuSFtHgi2+b+W3rP1SZtaU3HHNNp1iEKMSeoC1/EQUVkGknkLNOBxJhXJ4xLgOr8TbYAZOkUIw==",
       "dev": true,
       "requires": {
       "dev": true,
       "requires": {
-        "async": "^2.6.4",
-        "debug": "^3.2.7",
-        "mkdirp": "^0.5.6"
+        "debug": "^2.2.0",
+        "md5": "^2.1.0",
+        "mkdirp": "~0.5.1",
+        "strip-ansi": "^6.0.1",
+        "xml": "^1.0.0"
       },
       "dependencies": {
         "debug": {
       },
       "dependencies": {
         "debug": {
-          "version": "3.2.7",
-          "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz",
-          "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==",
+          "version": "2.6.9",
+          "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
+          "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
           "dev": true,
           "requires": {
           "dev": true,
           "requires": {
-            "ms": "^2.1.1"
+            "ms": "2.0.0"
           }
         },
         "mkdirp": {
           }
         },
         "mkdirp": {
           "requires": {
             "minimist": "^1.2.6"
           }
           "requires": {
             "minimist": "^1.2.6"
           }
+        },
+        "ms": {
+          "version": "2.0.0",
+          "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
+          "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==",
+          "dev": true
         }
       }
     },
         }
       }
     },
-    "posix-character-classes": {
-      "version": "0.1.1",
-      "resolved": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz",
-      "integrity": "sha512-xTgYBc3fuo7Yt7JbiuFxSYGToMoz8fLoE6TC9Wx1P/u+LfeThMOAqmuyECnlBaaJb+u1m9hHiXUEtwW4OzfUJg==",
-      "dev": true
+    "module-deps": {
+      "version": "6.2.3",
+      "resolved": "https://registry.npmjs.org/module-deps/-/module-deps-6.2.3.tgz",
+      "integrity": "sha512-fg7OZaQBcL4/L+AK5f4iVqf9OMbCclXfy/znXRxTVhJSeW5AIlS9AwheYwDaXM3lVW7OBeaeUEY3gbaC6cLlSA==",
+      "dev": true,
+      "requires": {
+        "JSONStream": "^1.0.3",
+        "browser-resolve": "^2.0.0",
+        "cached-path-relative": "^1.0.2",
+        "concat-stream": "~1.6.0",
+        "defined": "^1.0.0",
+        "detective": "^5.2.0",
+        "duplexer2": "^0.1.2",
+        "inherits": "^2.0.1",
+        "parents": "^1.0.0",
+        "readable-stream": "^2.0.2",
+        "resolve": "^1.4.0",
+        "stream-combiner2": "^1.1.1",
+        "subarg": "^1.0.0",
+        "through2": "^2.0.0",
+        "xtend": "^4.0.0"
+      },
+      "dependencies": {
+        "browser-resolve": {
+          "version": "2.0.0",
+          "resolved": "https://registry.npmjs.org/browser-resolve/-/browser-resolve-2.0.0.tgz",
+          "integrity": "sha512-7sWsQlYL2rGLy2IWm8WL8DCTJvYLc/qlOnsakDac87SOoCd16WLsaAMdCiAqsTNHIe+SXfaqyxyo6THoWqs8WQ==",
+          "dev": true,
+          "requires": {
+            "resolve": "^1.17.0"
+          }
+        }
+      }
     },
     },
-    "postcss": {
-      "version": "8.3.6",
-      "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.3.6.tgz",
-      "integrity": "sha512-wG1cc/JhRgdqB6WHEuyLTedf3KIRuD0hG6ldkFEZNCjRxiC+3i6kkWUUbiJQayP28iwG35cEmAbe98585BYV0A==",
+    "moment": {
+      "version": "2.29.3",
+      "resolved": "https://registry.npmjs.org/moment/-/moment-2.29.3.tgz",
+      "integrity": "sha512-c6YRvhEo//6T2Jz/vVtYzqBzwvPT95JBQ+smCytzf7c50oMZRsR/a4w88aD34I+/QVSfnoAnSBFPJHItlOMJVw=="
+    },
+    "moo-color": {
+      "version": "1.0.3",
+      "resolved": "https://registry.npmjs.org/moo-color/-/moo-color-1.0.3.tgz",
+      "integrity": "sha512-i/+ZKXMDf6aqYtBhuOcej71YSlbjT3wCO/4H1j8rPvxDJEifdwgg5MaFyu6iYAT8GBZJg2z0dkgK4YMzvURALQ==",
       "dev": true,
       "requires": {
       "dev": true,
       "requires": {
-        "colorette": "^1.2.2",
-        "nanoid": "^3.1.23",
-        "source-map-js": "^0.6.2"
+        "color-name": "^1.1.4"
       },
       "dependencies": {
       },
       "dependencies": {
-        "source-map-js": {
-          "version": "0.6.2",
-          "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-0.6.2.tgz",
-          "integrity": "sha512-/3GptzWzu0+0MBQFrDKzw/DvvMTUORvgY6k6jd/VS6iCR4RDTKWH6v6WPwQoUO8667uQEf9Oe38DxAYWY5F/Ug==",
+        "color-name": {
+          "version": "1.1.4",
+          "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
+          "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
           "dev": true
         }
       }
     },
           "dev": true
         }
       }
     },
-    "postcss-attribute-case-insensitive": {
-      "version": "4.0.2",
-      "resolved": "https://registry.npmjs.org/postcss-attribute-case-insensitive/-/postcss-attribute-case-insensitive-4.0.2.tgz",
-      "integrity": "sha512-clkFxk/9pcdb4Vkn0hAHq3YnxBQ2p0CGD1dy24jN+reBck+EWxMbxSUqN4Yj7t0w8csl87K6p0gxBe1utkJsYA==",
+    "morgan": {
+      "version": "1.10.0",
+      "resolved": "https://registry.npmjs.org/morgan/-/morgan-1.10.0.tgz",
+      "integrity": "sha512-AbegBVI4sh6El+1gNwvD5YIck7nSA36weD7xvIxG4in80j/UoK8AEGaWnnz8v1GxonMCltmlNs5ZKbGvl9b1XQ==",
       "dev": true,
       "requires": {
       "dev": true,
       "requires": {
-        "postcss": "^7.0.2",
-        "postcss-selector-parser": "^6.0.2"
+        "basic-auth": "~2.0.1",
+        "debug": "2.6.9",
+        "depd": "~2.0.0",
+        "on-finished": "~2.3.0",
+        "on-headers": "~1.0.2"
       },
       "dependencies": {
       },
       "dependencies": {
-        "picocolors": {
-          "version": "0.2.1",
-          "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz",
-          "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==",
-          "dev": true
-        },
-        "postcss": {
-          "version": "7.0.39",
-          "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz",
-          "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==",
+        "debug": {
+          "version": "2.6.9",
+          "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
+          "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
           "dev": true,
           "requires": {
           "dev": true,
           "requires": {
-            "picocolors": "^0.2.1",
-            "source-map": "^0.6.1"
+            "ms": "2.0.0"
           }
         },
           }
         },
-        "source-map": {
-          "version": "0.6.1",
-          "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
-          "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+        "ms": {
+          "version": "2.0.0",
+          "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
+          "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==",
           "dev": true
           "dev": true
+        },
+        "on-finished": {
+          "version": "2.3.0",
+          "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz",
+          "integrity": "sha512-ikqdkGAAyf/X/gPhXGvfgAytDZtDbr+bkNUJ0N9h5MI/dmdgCs3l6hoHrcUv41sRKew3jIwrp4qQDXiK99Utww==",
+          "dev": true,
+          "requires": {
+            "ee-first": "1.1.1"
+          }
         }
       }
     },
         }
       }
     },
-    "postcss-calc": {
-      "version": "8.2.4",
-      "resolved": "https://registry.npmjs.org/postcss-calc/-/postcss-calc-8.2.4.tgz",
-      "integrity": "sha512-SmWMSJmB8MRnnULldx0lQIyhSNvuDl9HfrZkaqqE/WHAhToYsAvDq+yAsA/kIyINDszOp3Rh0GFoNuH5Ypsm3Q==",
+    "mri": {
+      "version": "1.2.0",
+      "resolved": "https://registry.npmjs.org/mri/-/mri-1.2.0.tgz",
+      "integrity": "sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==",
+      "dev": true
+    },
+    "ms": {
+      "version": "2.1.2",
+      "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
+      "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w=="
+    },
+    "multicast-dns": {
+      "version": "6.2.3",
+      "resolved": "https://registry.npmjs.org/multicast-dns/-/multicast-dns-6.2.3.tgz",
+      "integrity": "sha512-ji6J5enbMyGRHIAkAOu3WdV8nggqviKCEKtXcOqfphZZtQrmHKycfynJ2V7eVPUA4NhJ6V7Wf4TmGbTwKE9B6g==",
       "dev": true,
       "requires": {
       "dev": true,
       "requires": {
-        "postcss-selector-parser": "^6.0.9",
-        "postcss-value-parser": "^4.2.0"
+        "dns-packet": "^1.3.1",
+        "thunky": "^1.0.2"
       }
     },
       }
     },
-    "postcss-color-functional-notation": {
-      "version": "2.0.1",
-      "resolved": "https://registry.npmjs.org/postcss-color-functional-notation/-/postcss-color-functional-notation-2.0.1.tgz",
-      "integrity": "sha512-ZBARCypjEDofW4P6IdPVTLhDNXPRn8T2s1zHbZidW6rPaaZvcnCS2soYFIQJrMZSxiePJ2XIYTlcb2ztr/eT2g==",
+    "multicast-dns-service-types": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npmjs.org/multicast-dns-service-types/-/multicast-dns-service-types-1.1.0.tgz",
+      "integrity": "sha512-cnAsSVxIDsYt0v7HmC0hWZFwwXSh+E6PgCrREDuN/EsjgLwA5XRmlMHhSiDPrt6HxY1gTivEa/Zh7GtODoLevQ==",
+      "dev": true
+    },
+    "multimatch": {
+      "version": "4.0.0",
+      "resolved": "https://registry.npmjs.org/multimatch/-/multimatch-4.0.0.tgz",
+      "integrity": "sha512-lDmx79y1z6i7RNx0ZGCPq1bzJ6ZoDDKbvh7jxr9SJcWLkShMzXrHbYVpTdnhNM5MXpDUxCQ4DgqVttVXlBgiBQ==",
       "dev": true,
       "requires": {
       "dev": true,
       "requires": {
-        "postcss": "^7.0.2",
-        "postcss-values-parser": "^2.0.0"
+        "@types/minimatch": "^3.0.3",
+        "array-differ": "^3.0.0",
+        "array-union": "^2.1.0",
+        "arrify": "^2.0.1",
+        "minimatch": "^3.0.4"
       },
       "dependencies": {
       },
       "dependencies": {
-        "picocolors": {
-          "version": "0.2.1",
-          "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz",
-          "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==",
-          "dev": true
-        },
-        "postcss": {
-          "version": "7.0.39",
-          "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz",
-          "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==",
-          "dev": true,
-          "requires": {
-            "picocolors": "^0.2.1",
-            "source-map": "^0.6.1"
-          }
-        },
-        "source-map": {
-          "version": "0.6.1",
-          "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
-          "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+        "array-union": {
+          "version": "2.1.0",
+          "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz",
+          "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==",
           "dev": true
         }
       }
     },
           "dev": true
         }
       }
     },
-    "postcss-color-gray": {
-      "version": "5.0.0",
-      "resolved": "https://registry.npmjs.org/postcss-color-gray/-/postcss-color-gray-5.0.0.tgz",
-      "integrity": "sha512-q6BuRnAGKM/ZRpfDascZlIZPjvwsRye7UDNalqVz3s7GDxMtqPY6+Q871liNxsonUw8oC61OG+PSaysYpl1bnw==",
+    "mute-stream": {
+      "version": "0.0.8",
+      "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.8.tgz",
+      "integrity": "sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==",
+      "dev": true
+    },
+    "mz": {
+      "version": "2.7.0",
+      "resolved": "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz",
+      "integrity": "sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==",
+      "dev": true,
+      "requires": {
+        "any-promise": "^1.0.0",
+        "object-assign": "^4.0.1",
+        "thenify-all": "^1.0.0"
+      }
+    },
+    "nan": {
+      "version": "2.17.0",
+      "resolved": "https://registry.npmjs.org/nan/-/nan-2.17.0.tgz",
+      "integrity": "sha512-2ZTgtl0nJsO0KQCjEpxcIr5D+Yv90plTitZt9JBfQvVJDS5seMl3FOvsh3+9CoYWXf/1l5OaZzzF6nDm4cagaQ==",
+      "optional": true
+    },
+    "nanoid": {
+      "version": "3.3.4",
+      "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.4.tgz",
+      "integrity": "sha512-MqBkQh/OHTS2egovRtLk45wEyNXwF+cokD+1YPf9u5VfJiRdAiRwB2froX5Co9Rh20xs4siNPm8naNotSD6RBw==",
+      "dev": true
+    },
+    "nanomatch": {
+      "version": "1.2.13",
+      "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz",
+      "integrity": "sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==",
+      "dev": true,
+      "requires": {
+        "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"
+      }
+    },
+    "napi-build-utils": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/napi-build-utils/-/napi-build-utils-1.0.2.tgz",
+      "integrity": "sha512-ONmRUqK7zj7DWX0D9ADe03wbwOBZxNAfF20PlGfCWQcD3+/MakShIHrMqx9YwPTfxDdF1zLeL+RGZiR9kGMLdg==",
+      "optional": true
+    },
+    "natural-compare": {
+      "version": "1.4.0",
+      "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz",
+      "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==",
+      "dev": true
+    },
+    "needle": {
+      "version": "2.9.1",
+      "resolved": "https://registry.npmjs.org/needle/-/needle-2.9.1.tgz",
+      "integrity": "sha512-6R9fqJ5Zcmf+uYaFgdIHmLwNldn5HbK8L5ybn7Uz+ylX/rnOsSp1AHcvQSrCaFN+qNM1wpymHqD7mVasEOlHGQ==",
       "dev": true,
       "dev": true,
+      "optional": true,
       "requires": {
       "requires": {
-        "@csstools/convert-colors": "^1.4.0",
-        "postcss": "^7.0.5",
-        "postcss-values-parser": "^2.0.0"
+        "debug": "^3.2.6",
+        "iconv-lite": "^0.4.4",
+        "sax": "^1.2.4"
       },
       "dependencies": {
       },
       "dependencies": {
-        "picocolors": {
-          "version": "0.2.1",
-          "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz",
-          "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==",
-          "dev": true
-        },
-        "postcss": {
-          "version": "7.0.39",
-          "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz",
-          "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==",
+        "debug": {
+          "version": "3.2.7",
+          "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz",
+          "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==",
           "dev": true,
           "dev": true,
+          "optional": true,
           "requires": {
           "requires": {
-            "picocolors": "^0.2.1",
-            "source-map": "^0.6.1"
+            "ms": "^2.1.1"
           }
           }
-        },
-        "source-map": {
-          "version": "0.6.1",
-          "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
-          "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
-          "dev": true
         }
       }
     },
         }
       }
     },
-    "postcss-color-hex-alpha": {
-      "version": "5.0.3",
-      "resolved": "https://registry.npmjs.org/postcss-color-hex-alpha/-/postcss-color-hex-alpha-5.0.3.tgz",
-      "integrity": "sha512-PF4GDel8q3kkreVXKLAGNpHKilXsZ6xuu+mOQMHWHLPNyjiUBOr75sp5ZKJfmv1MCus5/DWUGcK9hm6qHEnXYw==",
-      "dev": true,
+    "negotiator": {
+      "version": "0.6.3",
+      "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz",
+      "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==",
+      "dev": true
+    },
+    "neo-async": {
+      "version": "2.6.2",
+      "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz",
+      "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==",
+      "dev": true
+    },
+    "next-tick": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npmjs.org/next-tick/-/next-tick-1.1.0.tgz",
+      "integrity": "sha512-CXdUiJembsNjuToQvxayPZF9Vqht7hewsvy2sOWafLvi2awflj9mOC6bHIg50orX8IJvWKY9wYQ/zB2kogPslQ==",
+      "dev": true
+    },
+    "ng-block-ui": {
+      "version": "3.0.2",
+      "resolved": "https://registry.npmjs.org/ng-block-ui/-/ng-block-ui-3.0.2.tgz",
+      "integrity": "sha512-EP3IXP8WSoKQOAwunf/v77aydcBCSLkEm5K8duRMSXFsnrcTdNqUiaLDKCf9U3COHY52IVBJcLb9PGhMBCWVSA==",
       "requires": {
       "requires": {
-        "postcss": "^7.0.14",
-        "postcss-values-parser": "^2.0.1"
+        "tslib": "^1.10.0"
       },
       "dependencies": {
       },
       "dependencies": {
-        "picocolors": {
-          "version": "0.2.1",
-          "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz",
-          "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==",
-          "dev": true
-        },
-        "postcss": {
-          "version": "7.0.39",
-          "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz",
-          "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==",
-          "dev": true,
-          "requires": {
-            "picocolors": "^0.2.1",
-            "source-map": "^0.6.1"
-          }
-        },
-        "source-map": {
-          "version": "0.6.1",
-          "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
-          "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
-          "dev": true
+        "tslib": {
+          "version": "1.14.1",
+          "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz",
+          "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg=="
         }
       }
     },
         }
       }
     },
-    "postcss-color-mod-function": {
-      "version": "3.0.3",
-      "resolved": "https://registry.npmjs.org/postcss-color-mod-function/-/postcss-color-mod-function-3.0.3.tgz",
-      "integrity": "sha512-YP4VG+xufxaVtzV6ZmhEtc+/aTXH3d0JLpnYfxqTvwZPbJhWqp8bSY3nfNzNRFLgB4XSaBA82OE4VjOOKpCdVQ==",
-      "dev": true,
+    "ng-click-outside": {
+      "version": "7.0.0",
+      "resolved": "https://registry.npmjs.org/ng-click-outside/-/ng-click-outside-7.0.0.tgz",
+      "integrity": "sha512-5QgqABb8ULqQtHNvCNXnBlzjKfILXrdZkq/xcnGL1aM1EmrY7xlUQQ/WLYnxno0gw/QQwCE5tH7sFfFUhIn8CA=="
+    },
+    "ng-mocks": {
+      "version": "14.3.0",
+      "resolved": "https://registry.npmjs.org/ng-mocks/-/ng-mocks-14.3.0.tgz",
+      "integrity": "sha512-Nwjwj/EUjOjYRT/2sqJmeNNzn3FIZwPTPuZkv0G6yBfOl2NusDMhQl815HkA7XGQcdUGbb1eMqmRz0zlsaUrww==",
+      "dev": true
+    },
+    "ng2-charts": {
+      "version": "2.4.2",
+      "resolved": "https://registry.npmjs.org/ng2-charts/-/ng2-charts-2.4.2.tgz",
+      "integrity": "sha512-mY3C2uKCaApHCQizS2YxEOqQ7sSZZLxdV6N1uM9u/VvUgVtYvlPtdcXbKpN52ak93ZE22I73DiLWVDnDNG4/AQ==",
       "requires": {
       "requires": {
-        "@csstools/convert-colors": "^1.4.0",
-        "postcss": "^7.0.2",
-        "postcss-values-parser": "^2.0.0"
-      },
-      "dependencies": {
-        "picocolors": {
-          "version": "0.2.1",
-          "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz",
-          "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==",
-          "dev": true
-        },
-        "postcss": {
-          "version": "7.0.39",
-          "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz",
-          "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==",
-          "dev": true,
-          "requires": {
-            "picocolors": "^0.2.1",
-            "source-map": "^0.6.1"
-          }
-        },
-        "source-map": {
-          "version": "0.6.1",
-          "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
-          "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
-          "dev": true
-        }
+        "@types/chart.js": "^2.9.24",
+        "lodash-es": "^4.17.15",
+        "tslib": "^2.0.0"
       }
     },
       }
     },
-    "postcss-color-rebeccapurple": {
-      "version": "4.0.1",
-      "resolved": "https://registry.npmjs.org/postcss-color-rebeccapurple/-/postcss-color-rebeccapurple-4.0.1.tgz",
-      "integrity": "sha512-aAe3OhkS6qJXBbqzvZth2Au4V3KieR5sRQ4ptb2b2O8wgvB3SJBsdG+jsn2BZbbwekDG8nTfcCNKcSfe/lEy8g==",
-      "dev": true,
+    "ngx-pipe-function": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/ngx-pipe-function/-/ngx-pipe-function-1.0.0.tgz",
+      "integrity": "sha512-AFWZ3icsq+0/nxFZtqRGZ03nRFoHcxVkZNGIi4ZQbdl5QLP3FmNTHGMmigohSeCV785l3YmPDUEx+6qwdGynMw==",
       "requires": {
       "requires": {
-        "postcss": "^7.0.2",
-        "postcss-values-parser": "^2.0.0"
+        "tslib": "^1.9.0"
       },
       "dependencies": {
       },
       "dependencies": {
-        "picocolors": {
-          "version": "0.2.1",
-          "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz",
-          "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==",
-          "dev": true
-        },
-        "postcss": {
-          "version": "7.0.39",
-          "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz",
-          "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==",
-          "dev": true,
-          "requires": {
-            "picocolors": "^0.2.1",
-            "source-map": "^0.6.1"
-          }
-        },
-        "source-map": {
-          "version": "0.6.1",
-          "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
-          "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
-          "dev": true
+        "tslib": {
+          "version": "1.14.1",
+          "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz",
+          "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg=="
         }
       }
     },
         }
       }
     },
-    "postcss-colormin": {
-      "version": "5.3.0",
-      "resolved": "https://registry.npmjs.org/postcss-colormin/-/postcss-colormin-5.3.0.tgz",
-      "integrity": "sha512-WdDO4gOFG2Z8n4P8TWBpshnL3JpmNmJwdnfP2gbk2qBA8PWwOYcmjmI/t3CmMeL72a7Hkd+x/Mg9O2/0rD54Pg==",
-      "dev": true,
+    "ngx-toastr": {
+      "version": "14.3.0",
+      "resolved": "https://registry.npmjs.org/ngx-toastr/-/ngx-toastr-14.3.0.tgz",
+      "integrity": "sha512-d8j/sOr60w5U7rGlcKQ0Ff4u+m2NzhqU5ZdJXn7QW3aR3Zf/rY7/Fd14BmUindTOWVr2NeTYcQXCjLpir0ldpA==",
       "requires": {
       "requires": {
-        "browserslist": "^4.16.6",
-        "caniuse-api": "^3.0.0",
-        "colord": "^2.9.1",
-        "postcss-value-parser": "^4.2.0"
+        "tslib": "^2.3.0"
       }
     },
       }
     },
-    "postcss-convert-values": {
-      "version": "5.1.2",
-      "resolved": "https://registry.npmjs.org/postcss-convert-values/-/postcss-convert-values-5.1.2.tgz",
-      "integrity": "sha512-c6Hzc4GAv95B7suy4udszX9Zy4ETyMCgFPUDtWjdFTKH1SE9eFY/jEpHSwTH1QPuwxHpWslhckUQWbNRM4ho5g==",
+    "nice-napi": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/nice-napi/-/nice-napi-1.0.2.tgz",
+      "integrity": "sha512-px/KnJAJZf5RuBGcfD+Sp2pAKq0ytz8j+1NehvgIGFkvtvFrDM3T8E4x/JJODXK9WZow8RRGrbA9QQ3hs+pDhA==",
       "dev": true,
       "dev": true,
+      "optional": true,
       "requires": {
       "requires": {
-        "browserslist": "^4.20.3",
-        "postcss-value-parser": "^4.2.0"
+        "node-addon-api": "^3.0.0",
+        "node-gyp-build": "^4.2.2"
       }
     },
       }
     },
-    "postcss-custom-media": {
-      "version": "7.0.8",
-      "resolved": "https://registry.npmjs.org/postcss-custom-media/-/postcss-custom-media-7.0.8.tgz",
-      "integrity": "sha512-c9s5iX0Ge15o00HKbuRuTqNndsJUbaXdiNsksnVH8H4gdc+zbLzr/UasOwNG6CTDpLFekVY4672eWdiiWu2GUg==",
+    "nice-try": {
+      "version": "1.0.5",
+      "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz",
+      "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==",
+      "dev": true
+    },
+    "no-case": {
+      "version": "2.3.2",
+      "resolved": "https://registry.npmjs.org/no-case/-/no-case-2.3.2.tgz",
+      "integrity": "sha512-rmTZ9kz+f3rCvK2TD1Ue/oZlns7OGoIWP4fc3llxxRXlOkHKoWPPWJOfFYpITabSow43QJbRIoHQXtt10VldyQ==",
       "dev": true,
       "requires": {
       "dev": true,
       "requires": {
-        "postcss": "^7.0.14"
-      },
-      "dependencies": {
-        "picocolors": {
-          "version": "0.2.1",
-          "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz",
-          "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==",
-          "dev": true
-        },
-        "postcss": {
-          "version": "7.0.39",
-          "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz",
-          "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==",
-          "dev": true,
-          "requires": {
-            "picocolors": "^0.2.1",
-            "source-map": "^0.6.1"
-          }
-        },
-        "source-map": {
-          "version": "0.6.1",
-          "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
-          "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
-          "dev": true
-        }
+        "lower-case": "^1.1.1"
       }
     },
       }
     },
-    "postcss-custom-properties": {
-      "version": "8.0.11",
-      "resolved": "https://registry.npmjs.org/postcss-custom-properties/-/postcss-custom-properties-8.0.11.tgz",
-      "integrity": "sha512-nm+o0eLdYqdnJ5abAJeXp4CEU1c1k+eB2yMCvhgzsds/e0umabFrN6HoTy/8Q4K5ilxERdl/JD1LO5ANoYBeMA==",
-      "dev": true,
+    "node-abi": {
+      "version": "2.30.1",
+      "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-2.30.1.tgz",
+      "integrity": "sha512-/2D0wOQPgaUWzVSVgRMx+trKJRC2UG4SUc4oCJoXx9Uxjtp0Vy3/kt7zcbxHF8+Z/pK3UloLWzBISg72brfy1w==",
+      "optional": true,
       "requires": {
       "requires": {
-        "postcss": "^7.0.17",
-        "postcss-values-parser": "^2.0.1"
+        "semver": "^5.4.1"
       },
       "dependencies": {
       },
       "dependencies": {
-        "picocolors": {
-          "version": "0.2.1",
-          "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz",
-          "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==",
-          "dev": true
-        },
-        "postcss": {
-          "version": "7.0.39",
-          "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz",
-          "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==",
-          "dev": true,
-          "requires": {
-            "picocolors": "^0.2.1",
-            "source-map": "^0.6.1"
-          }
-        },
-        "source-map": {
-          "version": "0.6.1",
-          "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
-          "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
-          "dev": true
+        "semver": {
+          "version": "5.7.1",
+          "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz",
+          "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==",
+          "optional": true
         }
       }
     },
         }
       }
     },
-    "postcss-custom-selectors": {
-      "version": "5.1.2",
-      "resolved": "https://registry.npmjs.org/postcss-custom-selectors/-/postcss-custom-selectors-5.1.2.tgz",
-      "integrity": "sha512-DSGDhqinCqXqlS4R7KGxL1OSycd1lydugJ1ky4iRXPHdBRiozyMHrdu0H3o7qNOCiZwySZTUI5MV0T8QhCLu+w==",
+    "node-addon-api": {
+      "version": "3.2.1",
+      "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-3.2.1.tgz",
+      "integrity": "sha512-mmcei9JghVNDYydghQmeDX8KoAm0FAiYyIcUt/N4nhyAipB17pllZQDOJD2fotxABnt4Mdz+dKTO7eftLg4d0A==",
+      "dev": true
+    },
+    "node-domexception": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/node-domexception/-/node-domexception-1.0.0.tgz",
+      "integrity": "sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ=="
+    },
+    "node-fetch": {
+      "version": "2.6.7",
+      "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.7.tgz",
+      "integrity": "sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ==",
+      "requires": {
+        "whatwg-url": "^5.0.0"
+      }
+    },
+    "node-forge": {
+      "version": "1.3.1",
+      "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-1.3.1.tgz",
+      "integrity": "sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA==",
+      "dev": true
+    },
+    "node-gyp": {
+      "version": "8.4.1",
+      "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-8.4.1.tgz",
+      "integrity": "sha512-olTJRgUtAb/hOXG0E93wZDs5YiJlgbXxTwQAFHyNlRsXQnYzUaF2aGgujZbw+hR8aF4ZG/rST57bWMWD16jr9w==",
       "dev": true,
       "requires": {
       "dev": true,
       "requires": {
-        "postcss": "^7.0.2",
-        "postcss-selector-parser": "^5.0.0-rc.3"
+        "env-paths": "^2.2.0",
+        "glob": "^7.1.4",
+        "graceful-fs": "^4.2.6",
+        "make-fetch-happen": "^9.1.0",
+        "nopt": "^5.0.0",
+        "npmlog": "^6.0.0",
+        "rimraf": "^3.0.2",
+        "semver": "^7.3.5",
+        "tar": "^6.1.2",
+        "which": "^2.0.2"
       },
       "dependencies": {
       },
       "dependencies": {
-        "cssesc": {
-          "version": "2.0.0",
-          "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-2.0.0.tgz",
-          "integrity": "sha512-MsCAG1z9lPdoO/IUMLSBWBSVxVtJ1395VGIQ+Fc2gNdkQ1hNDnQdw3YhA71WJCBW1vdwA0cAnk/DnW6bqoEUYg==",
-          "dev": true
-        },
-        "picocolors": {
-          "version": "0.2.1",
-          "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz",
-          "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==",
-          "dev": true
-        },
-        "postcss": {
-          "version": "7.0.39",
-          "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz",
-          "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==",
+        "are-we-there-yet": {
+          "version": "3.0.1",
+          "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-3.0.1.tgz",
+          "integrity": "sha512-QZW4EDmGwlYur0Yyf/b2uGucHQMa8aFUP7eu9ddR73vvhFyt4V0Vl3QHPcTNJ8l6qYOBdxgXdnBXQrHilfRQBg==",
           "dev": true,
           "requires": {
           "dev": true,
           "requires": {
-            "picocolors": "^0.2.1",
-            "source-map": "^0.6.1"
+            "delegates": "^1.0.0",
+            "readable-stream": "^3.6.0"
           }
         },
           }
         },
-        "postcss-selector-parser": {
-          "version": "5.0.0",
-          "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-5.0.0.tgz",
-          "integrity": "sha512-w+zLE5Jhg6Liz8+rQOWEAwtwkyqpfnmsinXjXg6cY7YIONZZtgvE0v2O0uhQBs0peNomOJwWRKt6JBfTdTd3OQ==",
+        "gauge": {
+          "version": "4.0.4",
+          "resolved": "https://registry.npmjs.org/gauge/-/gauge-4.0.4.tgz",
+          "integrity": "sha512-f9m+BEN5jkg6a0fZjleidjN51VE1X+mPFQ2DJ0uv1V39oCLCbsGe6yjbBnp7eK7z/+GAon99a3nHuqbuuthyPg==",
           "dev": true,
           "requires": {
           "dev": true,
           "requires": {
-            "cssesc": "^2.0.0",
-            "indexes-of": "^1.0.1",
-            "uniq": "^1.0.1"
+            "aproba": "^1.0.3 || ^2.0.0",
+            "color-support": "^1.1.3",
+            "console-control-strings": "^1.1.0",
+            "has-unicode": "^2.0.1",
+            "signal-exit": "^3.0.7",
+            "string-width": "^4.2.3",
+            "strip-ansi": "^6.0.1",
+            "wide-align": "^1.1.5"
           }
         },
           }
         },
-        "source-map": {
-          "version": "0.6.1",
-          "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
-          "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
-          "dev": true
-        }
-      }
-    },
-    "postcss-dir-pseudo-class": {
-      "version": "5.0.0",
-      "resolved": "https://registry.npmjs.org/postcss-dir-pseudo-class/-/postcss-dir-pseudo-class-5.0.0.tgz",
-      "integrity": "sha512-3pm4oq8HYWMZePJY+5ANriPs3P07q+LW6FAdTlkFH2XqDdP4HeeJYMOzn0HYLhRSjBO3fhiqSwwU9xEULSrPgw==",
-      "dev": true,
-      "requires": {
-        "postcss": "^7.0.2",
-        "postcss-selector-parser": "^5.0.0-rc.3"
-      },
-      "dependencies": {
-        "cssesc": {
-          "version": "2.0.0",
-          "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-2.0.0.tgz",
-          "integrity": "sha512-MsCAG1z9lPdoO/IUMLSBWBSVxVtJ1395VGIQ+Fc2gNdkQ1hNDnQdw3YhA71WJCBW1vdwA0cAnk/DnW6bqoEUYg==",
-          "dev": true
+        "lru-cache": {
+          "version": "6.0.0",
+          "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz",
+          "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==",
+          "dev": true,
+          "requires": {
+            "yallist": "^4.0.0"
+          }
         },
         },
-        "picocolors": {
-          "version": "0.2.1",
-          "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz",
-          "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==",
-          "dev": true
+        "npmlog": {
+          "version": "6.0.2",
+          "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-6.0.2.tgz",
+          "integrity": "sha512-/vBvz5Jfr9dT/aFWd0FIRf+T/Q2WBsLENygUaFUqstqsycmZAP/t5BvFJTK0viFmSUxiUKTUplWy5vt+rvKIxg==",
+          "dev": true,
+          "requires": {
+            "are-we-there-yet": "^3.0.0",
+            "console-control-strings": "^1.1.0",
+            "gauge": "^4.0.3",
+            "set-blocking": "^2.0.0"
+          }
         },
         },
-        "postcss": {
-          "version": "7.0.39",
-          "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz",
-          "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==",
+        "readable-stream": {
+          "version": "3.6.1",
+          "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.1.tgz",
+          "integrity": "sha512-+rQmrWMYGA90yenhTYsLWAsLsqVC8osOw6PKE1HDYiO0gdPeKe/xDHNzIAIn4C91YQ6oenEhfYqqc1883qHbjQ==",
           "dev": true,
           "requires": {
           "dev": true,
           "requires": {
-            "picocolors": "^0.2.1",
-            "source-map": "^0.6.1"
+            "inherits": "^2.0.3",
+            "string_decoder": "^1.1.1",
+            "util-deprecate": "^1.0.1"
           }
         },
           }
         },
-        "postcss-selector-parser": {
-          "version": "5.0.0",
-          "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-5.0.0.tgz",
-          "integrity": "sha512-w+zLE5Jhg6Liz8+rQOWEAwtwkyqpfnmsinXjXg6cY7YIONZZtgvE0v2O0uhQBs0peNomOJwWRKt6JBfTdTd3OQ==",
+        "semver": {
+          "version": "7.3.8",
+          "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz",
+          "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==",
           "dev": true,
           "requires": {
           "dev": true,
           "requires": {
-            "cssesc": "^2.0.0",
-            "indexes-of": "^1.0.1",
-            "uniq": "^1.0.1"
+            "lru-cache": "^6.0.0"
           }
         },
           }
         },
-        "source-map": {
-          "version": "0.6.1",
-          "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
-          "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+        "yallist": {
+          "version": "4.0.0",
+          "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
+          "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==",
           "dev": true
         }
       }
     },
           "dev": true
         }
       }
     },
-    "postcss-discard-comments": {
-      "version": "5.1.2",
-      "resolved": "https://registry.npmjs.org/postcss-discard-comments/-/postcss-discard-comments-5.1.2.tgz",
-      "integrity": "sha512-+L8208OVbHVF2UQf1iDmRcbdjJkuBF6IS29yBDSiWUIzpYaAhtNl6JYnYm12FnkeCwQqF5LeklOu6rAqgfBZqQ==",
+    "node-gyp-build": {
+      "version": "4.6.0",
+      "resolved": "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.6.0.tgz",
+      "integrity": "sha512-NTZVKn9IylLwUzaKjkas1e4u2DLNcV4rdYagA4PWdPwW87Bi7z+BznyKSRwS/761tV/lzCGXplWsiaMjLqP2zQ==",
       "dev": true
     },
       "dev": true
     },
-    "postcss-discard-duplicates": {
-      "version": "5.1.0",
-      "resolved": "https://registry.npmjs.org/postcss-discard-duplicates/-/postcss-discard-duplicates-5.1.0.tgz",
-      "integrity": "sha512-zmX3IoSI2aoenxHV6C7plngHWWhUOV3sP1T8y2ifzxzbtnuhk1EdPwm0S1bIUNaJ2eNbWeGLEwzw8huPD67aQw==",
+    "node-int64": {
+      "version": "0.4.0",
+      "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz",
+      "integrity": "sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==",
       "dev": true
     },
       "dev": true
     },
-    "postcss-discard-empty": {
-      "version": "5.1.1",
-      "resolved": "https://registry.npmjs.org/postcss-discard-empty/-/postcss-discard-empty-5.1.1.tgz",
-      "integrity": "sha512-zPz4WljiSuLWsI0ir4Mcnr4qQQ5e1Ukc3i7UfE2XcrwKK2LIPIqE5jxMRxO6GbI3cv//ztXDsXwEWT3BHOGh3A==",
-      "dev": true
+    "node-releases": {
+      "version": "2.0.10",
+      "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.10.tgz",
+      "integrity": "sha512-5GFldHPXVG/YZmFzJvKK2zDSzPKhEp0+ZR5SVaoSag9fsL5YgHbUHDfnG5494ISANDcK4KwPXAx2xqVEydmd7w=="
     },
     },
-    "postcss-discard-overridden": {
-      "version": "5.1.0",
-      "resolved": "https://registry.npmjs.org/postcss-discard-overridden/-/postcss-discard-overridden-5.1.0.tgz",
-      "integrity": "sha512-21nOL7RqWR1kasIVdKs8HNqQJhFxLsyRfAnUDm4Fe4t4mCWL9OJiHvlHPjcd8zc5Myu89b/7wZDnOSjFgeWRtw==",
-      "dev": true
+    "nopt": {
+      "version": "5.0.0",
+      "resolved": "https://registry.npmjs.org/nopt/-/nopt-5.0.0.tgz",
+      "integrity": "sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ==",
+      "dev": true,
+      "requires": {
+        "abbrev": "1"
+      }
     },
     },
-    "postcss-double-position-gradients": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/postcss-double-position-gradients/-/postcss-double-position-gradients-1.0.0.tgz",
-      "integrity": "sha512-G+nV8EnQq25fOI8CH/B6krEohGWnF5+3A6H/+JEpOncu5dCnkS1QQ6+ct3Jkaepw1NGVqqOZH6lqrm244mCftA==",
+    "normalize-package-data": {
+      "version": "2.5.0",
+      "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz",
+      "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==",
       "dev": true,
       "requires": {
       "dev": true,
       "requires": {
-        "postcss": "^7.0.5",
-        "postcss-values-parser": "^2.0.0"
+        "hosted-git-info": "^2.1.4",
+        "resolve": "^1.10.0",
+        "semver": "2 || 3 || 4 || 5",
+        "validate-npm-package-license": "^3.0.1"
       },
       "dependencies": {
       },
       "dependencies": {
-        "picocolors": {
-          "version": "0.2.1",
-          "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz",
-          "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==",
+        "hosted-git-info": {
+          "version": "2.8.9",
+          "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz",
+          "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==",
           "dev": true
         },
           "dev": true
         },
-        "postcss": {
-          "version": "7.0.39",
-          "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz",
-          "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==",
-          "dev": true,
-          "requires": {
-            "picocolors": "^0.2.1",
-            "source-map": "^0.6.1"
-          }
-        },
-        "source-map": {
-          "version": "0.6.1",
-          "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
-          "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+        "semver": {
+          "version": "5.7.1",
+          "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz",
+          "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==",
           "dev": true
         }
       }
     },
           "dev": true
         }
       }
     },
-    "postcss-env-function": {
-      "version": "2.0.2",
-      "resolved": "https://registry.npmjs.org/postcss-env-function/-/postcss-env-function-2.0.2.tgz",
-      "integrity": "sha512-rwac4BuZlITeUbiBq60h/xbLzXY43qOsIErngWa4l7Mt+RaSkT7QBjXVGTcBHupykkblHMDrBFh30zchYPaOUw==",
+    "normalize-path": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz",
+      "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==",
+      "dev": true
+    },
+    "normalize-range": {
+      "version": "0.1.2",
+      "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz",
+      "integrity": "sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==",
+      "dev": true
+    },
+    "normalize-selector": {
+      "version": "0.2.0",
+      "resolved": "https://registry.npmjs.org/normalize-selector/-/normalize-selector-0.2.0.tgz",
+      "integrity": "sha512-dxvWdI8gw6eAvk9BlPffgEoGfM7AdijoCwOEJge3e3ulT2XLgmU7KvvxprOaCu05Q1uGRHmOhHe1r6emZoKyFw==",
+      "dev": true
+    },
+    "npm-bundled": {
+      "version": "1.1.2",
+      "resolved": "https://registry.npmjs.org/npm-bundled/-/npm-bundled-1.1.2.tgz",
+      "integrity": "sha512-x5DHup0SuyQcmL3s7Rx/YQ8sbw/Hzg0rj48eN0dV7hf5cmQq5PXIeioroH3raV1QC1yh3uTYuMThvEQF3iKgGQ==",
       "dev": true,
       "requires": {
       "dev": true,
       "requires": {
-        "postcss": "^7.0.2",
-        "postcss-values-parser": "^2.0.0"
-      },
-      "dependencies": {
-        "picocolors": {
-          "version": "0.2.1",
-          "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz",
-          "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==",
-          "dev": true
-        },
-        "postcss": {
-          "version": "7.0.39",
-          "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz",
-          "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==",
-          "dev": true,
-          "requires": {
-            "picocolors": "^0.2.1",
-            "source-map": "^0.6.1"
-          }
-        },
-        "source-map": {
-          "version": "0.6.1",
-          "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
-          "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
-          "dev": true
-        }
+        "npm-normalize-package-bin": "^1.0.1"
       }
     },
       }
     },
-    "postcss-focus-visible": {
+    "npm-install-checks": {
       "version": "4.0.0",
       "version": "4.0.0",
-      "resolved": "https://registry.npmjs.org/postcss-focus-visible/-/postcss-focus-visible-4.0.0.tgz",
-      "integrity": "sha512-Z5CkWBw0+idJHSV6+Bgf2peDOFf/x4o+vX/pwcNYrWpXFrSfTkQ3JQ1ojrq9yS+upnAlNRHeg8uEwFTgorjI8g==",
+      "resolved": "https://registry.npmjs.org/npm-install-checks/-/npm-install-checks-4.0.0.tgz",
+      "integrity": "sha512-09OmyDkNLYwqKPOnbI8exiOZU2GVVmQp7tgez2BPi5OZC8M82elDAps7sxC4l//uSUtotWqoEIDwjRvWH4qz8w==",
       "dev": true,
       "requires": {
       "dev": true,
       "requires": {
-        "postcss": "^7.0.2"
+        "semver": "^7.1.1"
       },
       "dependencies": {
       },
       "dependencies": {
-        "picocolors": {
-          "version": "0.2.1",
-          "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz",
-          "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==",
-          "dev": true
-        },
-        "postcss": {
-          "version": "7.0.39",
-          "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz",
-          "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==",
+        "lru-cache": {
+          "version": "6.0.0",
+          "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz",
+          "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==",
           "dev": true,
           "requires": {
           "dev": true,
           "requires": {
-            "picocolors": "^0.2.1",
-            "source-map": "^0.6.1"
+            "yallist": "^4.0.0"
           }
         },
           }
         },
-        "source-map": {
-          "version": "0.6.1",
-          "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
-          "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
-          "dev": true
-        }
-      }
-    },
-    "postcss-focus-within": {
-      "version": "3.0.0",
-      "resolved": "https://registry.npmjs.org/postcss-focus-within/-/postcss-focus-within-3.0.0.tgz",
-      "integrity": "sha512-W0APui8jQeBKbCGZudW37EeMCjDeVxKgiYfIIEo8Bdh5SpB9sxds/Iq8SEuzS0Q4YFOlG7EPFulbbxujpkrV2w==",
-      "dev": true,
-      "requires": {
-        "postcss": "^7.0.2"
-      },
-      "dependencies": {
-        "picocolors": {
-          "version": "0.2.1",
-          "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz",
-          "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==",
-          "dev": true
-        },
-        "postcss": {
-          "version": "7.0.39",
-          "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz",
-          "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==",
+        "semver": {
+          "version": "7.3.8",
+          "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz",
+          "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==",
           "dev": true,
           "requires": {
           "dev": true,
           "requires": {
-            "picocolors": "^0.2.1",
-            "source-map": "^0.6.1"
+            "lru-cache": "^6.0.0"
           }
         },
           }
         },
-        "source-map": {
-          "version": "0.6.1",
-          "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
-          "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+        "yallist": {
+          "version": "4.0.0",
+          "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
+          "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==",
           "dev": true
         }
       }
     },
           "dev": true
         }
       }
     },
-    "postcss-font-variant": {
-      "version": "4.0.1",
-      "resolved": "https://registry.npmjs.org/postcss-font-variant/-/postcss-font-variant-4.0.1.tgz",
-      "integrity": "sha512-I3ADQSTNtLTTd8uxZhtSOrTCQ9G4qUVKPjHiDk0bV75QSxXjVWiJVJ2VLdspGUi9fbW9BcjKJoRvxAH1pckqmA==",
+    "npm-normalize-package-bin": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/npm-normalize-package-bin/-/npm-normalize-package-bin-1.0.1.tgz",
+      "integrity": "sha512-EPfafl6JL5/rU+ot6P3gRSCpPDW5VmIzX959Ob1+ySFUuuYHWHekXpwdUZcKP5C+DS4GEtdJluwBjnsNDl+fSA==",
+      "dev": true
+    },
+    "npm-package-arg": {
+      "version": "8.1.5",
+      "resolved": "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-8.1.5.tgz",
+      "integrity": "sha512-LhgZrg0n0VgvzVdSm1oiZworPbTxYHUJCgtsJW8mGvlDpxTM1vSJc3m5QZeUkhAHIzbz3VCHd/R4osi1L1Tg/Q==",
       "dev": true,
       "requires": {
       "dev": true,
       "requires": {
-        "postcss": "^7.0.2"
+        "hosted-git-info": "^4.0.1",
+        "semver": "^7.3.4",
+        "validate-npm-package-name": "^3.0.0"
       },
       "dependencies": {
       },
       "dependencies": {
-        "picocolors": {
-          "version": "0.2.1",
-          "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz",
-          "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==",
-          "dev": true
+        "lru-cache": {
+          "version": "6.0.0",
+          "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz",
+          "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==",
+          "dev": true,
+          "requires": {
+            "yallist": "^4.0.0"
+          }
         },
         },
-        "postcss": {
-          "version": "7.0.39",
-          "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz",
-          "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==",
+        "semver": {
+          "version": "7.3.8",
+          "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz",
+          "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==",
           "dev": true,
           "requires": {
           "dev": true,
           "requires": {
-            "picocolors": "^0.2.1",
-            "source-map": "^0.6.1"
+            "lru-cache": "^6.0.0"
           }
         },
           }
         },
-        "source-map": {
-          "version": "0.6.1",
-          "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
-          "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+        "yallist": {
+          "version": "4.0.0",
+          "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
+          "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==",
           "dev": true
         }
       }
     },
           "dev": true
         }
       }
     },
-    "postcss-gap-properties": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/postcss-gap-properties/-/postcss-gap-properties-2.0.0.tgz",
-      "integrity": "sha512-QZSqDaMgXCHuHTEzMsS2KfVDOq7ZFiknSpkrPJY6jmxbugUPTuSzs/vuE5I3zv0WAS+3vhrlqhijiprnuQfzmg==",
+    "npm-packlist": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/npm-packlist/-/npm-packlist-3.0.0.tgz",
+      "integrity": "sha512-L/cbzmutAwII5glUcf2DBRNY/d0TFd4e/FnaZigJV6JD85RHZXJFGwCndjMWiiViiWSsWt3tiOLpI3ByTnIdFQ==",
       "dev": true,
       "requires": {
       "dev": true,
       "requires": {
-        "postcss": "^7.0.2"
+        "glob": "^7.1.6",
+        "ignore-walk": "^4.0.1",
+        "npm-bundled": "^1.1.1",
+        "npm-normalize-package-bin": "^1.0.1"
+      }
+    },
+    "npm-pick-manifest": {
+      "version": "6.1.1",
+      "resolved": "https://registry.npmjs.org/npm-pick-manifest/-/npm-pick-manifest-6.1.1.tgz",
+      "integrity": "sha512-dBsdBtORT84S8V8UTad1WlUyKIY9iMsAmqxHbLdeEeBNMLQDlDWWra3wYUx9EBEIiG/YwAy0XyNHDd2goAsfuA==",
+      "dev": true,
+      "requires": {
+        "npm-install-checks": "^4.0.0",
+        "npm-normalize-package-bin": "^1.0.1",
+        "npm-package-arg": "^8.1.2",
+        "semver": "^7.3.4"
       },
       "dependencies": {
       },
       "dependencies": {
-        "picocolors": {
-          "version": "0.2.1",
-          "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz",
-          "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==",
-          "dev": true
+        "lru-cache": {
+          "version": "6.0.0",
+          "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz",
+          "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==",
+          "dev": true,
+          "requires": {
+            "yallist": "^4.0.0"
+          }
         },
         },
-        "postcss": {
-          "version": "7.0.39",
-          "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz",
-          "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==",
+        "semver": {
+          "version": "7.3.8",
+          "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz",
+          "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==",
           "dev": true,
           "requires": {
           "dev": true,
           "requires": {
-            "picocolors": "^0.2.1",
-            "source-map": "^0.6.1"
+            "lru-cache": "^6.0.0"
           }
         },
           }
         },
-        "source-map": {
-          "version": "0.6.1",
-          "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
-          "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+        "yallist": {
+          "version": "4.0.0",
+          "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
+          "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==",
           "dev": true
         }
       }
     },
           "dev": true
         }
       }
     },
-    "postcss-html": {
-      "version": "0.36.0",
-      "resolved": "https://registry.npmjs.org/postcss-html/-/postcss-html-0.36.0.tgz",
-      "integrity": "sha512-HeiOxGcuwID0AFsNAL0ox3mW6MHH5cstWN1Z3Y+n6H+g12ih7LHdYxWwEA/QmrebctLjo79xz9ouK3MroHwOJw==",
+    "npm-registry-fetch": {
+      "version": "12.0.2",
+      "resolved": "https://registry.npmjs.org/npm-registry-fetch/-/npm-registry-fetch-12.0.2.tgz",
+      "integrity": "sha512-Df5QT3RaJnXYuOwtXBXS9BWs+tHH2olvkCLh6jcR/b/u3DvPMlp3J0TvvYwplPKxHMOwfg287PYih9QqaVFoKA==",
       "dev": true,
       "requires": {
       "dev": true,
       "requires": {
-        "htmlparser2": "^3.10.0"
+        "make-fetch-happen": "^10.0.1",
+        "minipass": "^3.1.6",
+        "minipass-fetch": "^1.4.1",
+        "minipass-json-stream": "^1.0.1",
+        "minizlib": "^2.1.2",
+        "npm-package-arg": "^8.1.5"
       },
       "dependencies": {
       },
       "dependencies": {
-        "dom-serializer": {
-          "version": "0.2.2",
-          "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.2.2.tgz",
-          "integrity": "sha512-2/xPb3ORsQ42nHYiSunXkDjPLBaEj/xTwUO4B7XCZQTRk7EBtTOPaygh10YAAh2OI1Qrp6NWfpAhzswj0ydt9g==",
+        "@npmcli/fs": {
+          "version": "2.1.2",
+          "resolved": "https://registry.npmjs.org/@npmcli/fs/-/fs-2.1.2.tgz",
+          "integrity": "sha512-yOJKRvohFOaLqipNtwYB9WugyZKhC/DZC4VYPmpaCzDBrA8YpK3qHZ8/HGscMnE4GqbkLNuVcCnxkeQEdGt6LQ==",
           "dev": true,
           "requires": {
           "dev": true,
           "requires": {
-            "domelementtype": "^2.0.1",
-            "entities": "^2.0.0"
-          },
-          "dependencies": {
-            "domelementtype": {
-              "version": "2.3.0",
-              "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz",
-              "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==",
-              "dev": true
-            },
-            "entities": {
-              "version": "2.2.0",
-              "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz",
-              "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==",
-              "dev": true
-            }
+            "@gar/promisify": "^1.1.3",
+            "semver": "^7.3.5"
           }
         },
           }
         },
-        "domelementtype": {
-          "version": "1.3.1",
-          "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.1.tgz",
-          "integrity": "sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w==",
+        "@npmcli/move-file": {
+          "version": "2.0.1",
+          "resolved": "https://registry.npmjs.org/@npmcli/move-file/-/move-file-2.0.1.tgz",
+          "integrity": "sha512-mJd2Z5TjYWq/ttPLLGqArdtnC74J6bOzg4rMDnN+p1xTacZ2yPRCk2y0oSWQtygLR9YVQXgOcONrwtnk3JupxQ==",
+          "dev": true,
+          "requires": {
+            "mkdirp": "^1.0.4",
+            "rimraf": "^3.0.2"
+          }
+        },
+        "@tootallnate/once": {
+          "version": "2.0.0",
+          "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-2.0.0.tgz",
+          "integrity": "sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A==",
           "dev": true
         },
           "dev": true
         },
-        "domhandler": {
-          "version": "2.4.2",
-          "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-2.4.2.tgz",
-          "integrity": "sha512-JiK04h0Ht5u/80fdLMCEmV4zkNh2BcoMFBmZ/91WtYZ8qVXSKjiw7fXMgFPnHcSZgOo3XdinHvmnDUeMf5R4wA==",
+        "brace-expansion": {
+          "version": "2.0.1",
+          "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz",
+          "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==",
           "dev": true,
           "requires": {
           "dev": true,
           "requires": {
-            "domelementtype": "1"
+            "balanced-match": "^1.0.0"
           }
         },
           }
         },
-        "domutils": {
-          "version": "1.7.0",
-          "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.7.0.tgz",
-          "integrity": "sha512-Lgd2XcJ/NjEw+7tFvfKxOzCYKZsdct5lczQ2ZaQY8Djz7pfAD3Gbp8ySJWtreII/vDlMVmxwa6pHmdxIYgttDg==",
+        "cacache": {
+          "version": "16.1.3",
+          "resolved": "https://registry.npmjs.org/cacache/-/cacache-16.1.3.tgz",
+          "integrity": "sha512-/+Emcj9DAXxX4cwlLmRI9c166RuL3w30zp4R7Joiv2cQTtTtA+jeuCAjH3ZlGnYS3tKENSrKhAzVVP9GVyzeYQ==",
           "dev": true,
           "requires": {
           "dev": true,
           "requires": {
-            "dom-serializer": "0",
-            "domelementtype": "1"
+            "@npmcli/fs": "^2.1.0",
+            "@npmcli/move-file": "^2.0.0",
+            "chownr": "^2.0.0",
+            "fs-minipass": "^2.1.0",
+            "glob": "^8.0.1",
+            "infer-owner": "^1.0.4",
+            "lru-cache": "^7.7.1",
+            "minipass": "^3.1.6",
+            "minipass-collect": "^1.0.2",
+            "minipass-flush": "^1.0.5",
+            "minipass-pipeline": "^1.2.4",
+            "mkdirp": "^1.0.4",
+            "p-map": "^4.0.0",
+            "promise-inflight": "^1.0.1",
+            "rimraf": "^3.0.2",
+            "ssri": "^9.0.0",
+            "tar": "^6.1.11",
+            "unique-filename": "^2.0.0"
           }
         },
           }
         },
-        "entities": {
-          "version": "1.1.2",
-          "resolved": "https://registry.npmjs.org/entities/-/entities-1.1.2.tgz",
-          "integrity": "sha512-f2LZMYl1Fzu7YSBKg+RoROelpOaNrcGmE9AZubeDfrCEia483oW4MI4VyFd5VNHIgQ/7qm1I0wUHK1eJnn2y2w==",
+        "chownr": {
+          "version": "2.0.0",
+          "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz",
+          "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==",
           "dev": true
         },
           "dev": true
         },
-        "htmlparser2": {
-          "version": "3.10.1",
-          "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-3.10.1.tgz",
-          "integrity": "sha512-IgieNijUMbkDovyoKObU1DUhm1iwNYE/fuifEoEHfd1oZKZDaONBSkal7Y01shxsM49R4XaMdGez3WnF9UfiCQ==",
+        "glob": {
+          "version": "8.1.0",
+          "resolved": "https://registry.npmjs.org/glob/-/glob-8.1.0.tgz",
+          "integrity": "sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==",
           "dev": true,
           "requires": {
           "dev": true,
           "requires": {
-            "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"
+            "fs.realpath": "^1.0.0",
+            "inflight": "^1.0.4",
+            "inherits": "2",
+            "minimatch": "^5.0.1",
+            "once": "^1.3.0"
           }
           }
-        }
-      }
-    },
-    "postcss-image-set-function": {
-      "version": "3.0.1",
-      "resolved": "https://registry.npmjs.org/postcss-image-set-function/-/postcss-image-set-function-3.0.1.tgz",
-      "integrity": "sha512-oPTcFFip5LZy8Y/whto91L9xdRHCWEMs3e1MdJxhgt4jy2WYXfhkng59fH5qLXSCPN8k4n94p1Czrfe5IOkKUw==",
-      "dev": true,
-      "requires": {
-        "postcss": "^7.0.2",
-        "postcss-values-parser": "^2.0.0"
-      },
-      "dependencies": {
-        "picocolors": {
-          "version": "0.2.1",
-          "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz",
-          "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==",
-          "dev": true
         },
         },
-        "postcss": {
-          "version": "7.0.39",
-          "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz",
-          "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==",
+        "http-proxy-agent": {
+          "version": "5.0.0",
+          "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-5.0.0.tgz",
+          "integrity": "sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w==",
+          "dev": true,
+          "requires": {
+            "@tootallnate/once": "2",
+            "agent-base": "6",
+            "debug": "4"
+          }
+        },
+        "lru-cache": {
+          "version": "7.18.3",
+          "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz",
+          "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==",
+          "dev": true
+        },
+        "make-fetch-happen": {
+          "version": "10.2.1",
+          "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-10.2.1.tgz",
+          "integrity": "sha512-NgOPbRiaQM10DYXvN3/hhGVI2M5MtITFryzBGxHM5p4wnFxsVCbxkrBrDsk+EZ5OB4jEOT7AjDxtdF+KVEFT7w==",
+          "dev": true,
+          "requires": {
+            "agentkeepalive": "^4.2.1",
+            "cacache": "^16.1.0",
+            "http-cache-semantics": "^4.1.0",
+            "http-proxy-agent": "^5.0.0",
+            "https-proxy-agent": "^5.0.0",
+            "is-lambda": "^1.0.1",
+            "lru-cache": "^7.7.1",
+            "minipass": "^3.1.6",
+            "minipass-collect": "^1.0.2",
+            "minipass-fetch": "^2.0.3",
+            "minipass-flush": "^1.0.5",
+            "minipass-pipeline": "^1.2.4",
+            "negotiator": "^0.6.3",
+            "promise-retry": "^2.0.1",
+            "socks-proxy-agent": "^7.0.0",
+            "ssri": "^9.0.0"
+          },
+          "dependencies": {
+            "minipass-fetch": {
+              "version": "2.1.2",
+              "resolved": "https://registry.npmjs.org/minipass-fetch/-/minipass-fetch-2.1.2.tgz",
+              "integrity": "sha512-LT49Zi2/WMROHYoqGgdlQIZh8mLPZmOrN2NdJjMXxYe4nkN6FUyuPuOAOedNJDrx0IRGg9+4guZewtp8hE6TxA==",
+              "dev": true,
+              "requires": {
+                "encoding": "^0.1.13",
+                "minipass": "^3.1.6",
+                "minipass-sized": "^1.0.3",
+                "minizlib": "^2.1.2"
+              }
+            }
+          }
+        },
+        "minimatch": {
+          "version": "5.1.6",
+          "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz",
+          "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==",
           "dev": true,
           "requires": {
           "dev": true,
           "requires": {
-            "picocolors": "^0.2.1",
-            "source-map": "^0.6.1"
+            "brace-expansion": "^2.0.1"
           }
         },
           }
         },
-        "source-map": {
-          "version": "0.6.1",
-          "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
-          "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
-          "dev": true
-        }
-      }
-    },
-    "postcss-import": {
-      "version": "14.0.2",
-      "resolved": "https://registry.npmjs.org/postcss-import/-/postcss-import-14.0.2.tgz",
-      "integrity": "sha512-BJ2pVK4KhUyMcqjuKs9RijV5tatNzNa73e/32aBVE/ejYPe37iH+6vAu9WvqUkB5OAYgLHzbSvzHnorybJCm9g==",
-      "dev": true,
-      "requires": {
-        "postcss-value-parser": "^4.0.0",
-        "read-cache": "^1.0.0",
-        "resolve": "^1.1.7"
-      }
-    },
-    "postcss-initial": {
-      "version": "3.0.4",
-      "resolved": "https://registry.npmjs.org/postcss-initial/-/postcss-initial-3.0.4.tgz",
-      "integrity": "sha512-3RLn6DIpMsK1l5UUy9jxQvoDeUN4gP939tDcKUHD/kM8SGSKbFAnvkpFpj3Bhtz3HGk1jWY5ZNWX6mPta5M9fg==",
-      "dev": true,
-      "requires": {
-        "postcss": "^7.0.2"
-      },
-      "dependencies": {
-        "picocolors": {
-          "version": "0.2.1",
-          "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz",
-          "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==",
-          "dev": true
-        },
-        "postcss": {
-          "version": "7.0.39",
-          "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz",
-          "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==",
+        "semver": {
+          "version": "7.3.8",
+          "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz",
+          "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==",
           "dev": true,
           "requires": {
           "dev": true,
           "requires": {
-            "picocolors": "^0.2.1",
-            "source-map": "^0.6.1"
+            "lru-cache": "^6.0.0"
+          },
+          "dependencies": {
+            "lru-cache": {
+              "version": "6.0.0",
+              "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz",
+              "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==",
+              "dev": true,
+              "requires": {
+                "yallist": "^4.0.0"
+              }
+            }
           }
         },
           }
         },
-        "source-map": {
-          "version": "0.6.1",
-          "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
-          "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
-          "dev": true
-        }
-      }
-    },
-    "postcss-lab-function": {
-      "version": "2.0.1",
-      "resolved": "https://registry.npmjs.org/postcss-lab-function/-/postcss-lab-function-2.0.1.tgz",
-      "integrity": "sha512-whLy1IeZKY+3fYdqQFuDBf8Auw+qFuVnChWjmxm/UhHWqNHZx+B99EwxTvGYmUBqe3Fjxs4L1BoZTJmPu6usVg==",
-      "dev": true,
-      "requires": {
-        "@csstools/convert-colors": "^1.4.0",
-        "postcss": "^7.0.2",
-        "postcss-values-parser": "^2.0.0"
-      },
-      "dependencies": {
-        "picocolors": {
-          "version": "0.2.1",
-          "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz",
-          "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==",
-          "dev": true
+        "socks-proxy-agent": {
+          "version": "7.0.0",
+          "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-7.0.0.tgz",
+          "integrity": "sha512-Fgl0YPZ902wEsAyiQ+idGd1A7rSFx/ayC1CQVMw5P+EQx2V0SgpGtf6OKFhVjPflPUl9YMmEOnmfjCdMUsygww==",
+          "dev": true,
+          "requires": {
+            "agent-base": "^6.0.2",
+            "debug": "^4.3.3",
+            "socks": "^2.6.2"
+          }
         },
         },
-        "postcss": {
-          "version": "7.0.39",
-          "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz",
-          "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==",
+        "ssri": {
+          "version": "9.0.1",
+          "resolved": "https://registry.npmjs.org/ssri/-/ssri-9.0.1.tgz",
+          "integrity": "sha512-o57Wcn66jMQvfHG1FlYbWeZWW/dHZhJXjpIcTfXldXEk5nz5lStPo3mK0OJQfGR3RbZUlbISexbljkJzuEj/8Q==",
           "dev": true,
           "requires": {
           "dev": true,
           "requires": {
-            "picocolors": "^0.2.1",
-            "source-map": "^0.6.1"
+            "minipass": "^3.1.1"
           }
         },
           }
         },
-        "source-map": {
-          "version": "0.6.1",
-          "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
-          "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
-          "dev": true
-        }
-      }
-    },
-    "postcss-less": {
-      "version": "3.1.4",
-      "resolved": "https://registry.npmjs.org/postcss-less/-/postcss-less-3.1.4.tgz",
-      "integrity": "sha512-7TvleQWNM2QLcHqvudt3VYjULVB49uiW6XzEUFmvwHzvsOEF5MwBrIXZDJQvJNFGjJQTzSzZnDoCJ8h/ljyGXA==",
-      "dev": true,
-      "requires": {
-        "postcss": "^7.0.14"
-      },
-      "dependencies": {
-        "picocolors": {
-          "version": "0.2.1",
-          "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz",
-          "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==",
-          "dev": true
+        "unique-filename": {
+          "version": "2.0.1",
+          "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-2.0.1.tgz",
+          "integrity": "sha512-ODWHtkkdx3IAR+veKxFV+VBkUMcN+FaqzUUd7IZzt+0zhDZFPFxhlqwPF3YQvMHx1TD0tdgYl+kuPnJ8E6ql7A==",
+          "dev": true,
+          "requires": {
+            "unique-slug": "^3.0.0"
+          }
         },
         },
-        "postcss": {
-          "version": "7.0.39",
-          "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz",
-          "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==",
+        "unique-slug": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-3.0.0.tgz",
+          "integrity": "sha512-8EyMynh679x/0gqE9fT9oilG+qEt+ibFyqjuVTsZn1+CMxH+XLlpvr2UZx4nVcCwTpx81nICr2JQFkM+HPLq4w==",
           "dev": true,
           "requires": {
           "dev": true,
           "requires": {
-            "picocolors": "^0.2.1",
-            "source-map": "^0.6.1"
+            "imurmurhash": "^0.1.4"
           }
         },
           }
         },
-        "source-map": {
-          "version": "0.6.1",
-          "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
-          "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+        "yallist": {
+          "version": "4.0.0",
+          "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
+          "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==",
           "dev": true
         }
       }
     },
           "dev": true
         }
       }
     },
-    "postcss-loader": {
-      "version": "6.1.1",
-      "resolved": "https://registry.npmjs.org/postcss-loader/-/postcss-loader-6.1.1.tgz",
-      "integrity": "sha512-lBmJMvRh1D40dqpWKr9Rpygwxn8M74U9uaCSeYGNKLGInbk9mXBt1ultHf2dH9Ghk6Ue4UXlXWwGMH9QdUJ5ug==",
+    "npm-run-all": {
+      "version": "4.1.5",
+      "resolved": "https://registry.npmjs.org/npm-run-all/-/npm-run-all-4.1.5.tgz",
+      "integrity": "sha512-Oo82gJDAVcaMdi3nuoKFavkIHBRVqQ1qvMb+9LHk/cF4P6B2m8aP04hGf7oL6wZ9BuGwX1onlLhpuoofSyoQDQ==",
       "dev": true,
       "requires": {
       "dev": true,
       "requires": {
-        "cosmiconfig": "^7.0.0",
-        "klona": "^2.0.4",
-        "semver": "^7.3.5"
+        "ansi-styles": "^3.2.1",
+        "chalk": "^2.4.1",
+        "cross-spawn": "^6.0.5",
+        "memorystream": "^0.3.1",
+        "minimatch": "^3.0.4",
+        "pidtree": "^0.3.0",
+        "read-pkg": "^3.0.0",
+        "shell-quote": "^1.6.1",
+        "string.prototype.padend": "^3.0.0"
       },
       "dependencies": {
       },
       "dependencies": {
-        "semver": {
-          "version": "7.3.7",
-          "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.7.tgz",
-          "integrity": "sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g==",
+        "cross-spawn": {
+          "version": "6.0.5",
+          "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz",
+          "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==",
           "dev": true,
           "requires": {
           "dev": true,
           "requires": {
-            "lru-cache": "^6.0.0"
+            "nice-try": "^1.0.4",
+            "path-key": "^2.0.1",
+            "semver": "^5.5.0",
+            "shebang-command": "^1.2.0",
+            "which": "^1.2.9"
           }
           }
-        }
-      }
-    },
-    "postcss-logical": {
-      "version": "3.0.0",
-      "resolved": "https://registry.npmjs.org/postcss-logical/-/postcss-logical-3.0.0.tgz",
-      "integrity": "sha512-1SUKdJc2vuMOmeItqGuNaC+N8MzBWFWEkAnRnLpFYj1tGGa7NqyVBujfRtgNa2gXR+6RkGUiB2O5Vmh7E2RmiA==",
-      "dev": true,
-      "requires": {
-        "postcss": "^7.0.2"
-      },
-      "dependencies": {
-        "picocolors": {
-          "version": "0.2.1",
-          "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz",
-          "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==",
+        },
+        "path-key": {
+          "version": "2.0.1",
+          "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz",
+          "integrity": "sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw==",
           "dev": true
         },
           "dev": true
         },
-        "postcss": {
-          "version": "7.0.39",
-          "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz",
-          "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==",
+        "semver": {
+          "version": "5.7.1",
+          "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz",
+          "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==",
+          "dev": true
+        },
+        "shebang-command": {
+          "version": "1.2.0",
+          "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz",
+          "integrity": "sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg==",
           "dev": true,
           "requires": {
           "dev": true,
           "requires": {
-            "picocolors": "^0.2.1",
-            "source-map": "^0.6.1"
+            "shebang-regex": "^1.0.0"
           }
         },
           }
         },
-        "source-map": {
-          "version": "0.6.1",
-          "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
-          "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+        "shebang-regex": {
+          "version": "1.0.0",
+          "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz",
+          "integrity": "sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ==",
           "dev": true
           "dev": true
+        },
+        "which": {
+          "version": "1.3.1",
+          "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz",
+          "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==",
+          "dev": true,
+          "requires": {
+            "isexe": "^2.0.0"
+          }
         }
       }
     },
         }
       }
     },
-    "postcss-media-minmax": {
-      "version": "4.0.0",
-      "resolved": "https://registry.npmjs.org/postcss-media-minmax/-/postcss-media-minmax-4.0.0.tgz",
-      "integrity": "sha512-fo9moya6qyxsjbFAYl97qKO9gyre3qvbMnkOZeZwlsW6XYFsvs2DMGDlchVLfAd8LHPZDxivu/+qW2SMQeTHBw==",
+    "npm-run-path": {
+      "version": "4.0.1",
+      "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz",
+      "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==",
       "dev": true,
       "requires": {
       "dev": true,
       "requires": {
-        "postcss": "^7.0.2"
+        "path-key": "^3.0.0"
+      }
+    },
+    "npmlog": {
+      "version": "4.1.2",
+      "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-4.1.2.tgz",
+      "integrity": "sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg==",
+      "optional": true,
+      "requires": {
+        "are-we-there-yet": "~1.1.2",
+        "console-control-strings": "~1.1.0",
+        "gauge": "~2.7.3",
+        "set-blocking": "~2.0.0"
+      }
+    },
+    "nth-check": {
+      "version": "2.1.1",
+      "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz",
+      "integrity": "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==",
+      "dev": true,
+      "requires": {
+        "boolbase": "^1.0.0"
+      }
+    },
+    "num2fraction": {
+      "version": "1.2.2",
+      "resolved": "https://registry.npmjs.org/num2fraction/-/num2fraction-1.2.2.tgz",
+      "integrity": "sha512-Y1wZESM7VUThYY+4W+X4ySH2maqcA+p7UR+w8VWNWVAd6lwuXXWz/w/Cz43J/dI2I+PS6wD5N+bJUF+gjWvIqg==",
+      "dev": true
+    },
+    "number-is-nan": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz",
+      "integrity": "sha512-4jbtZXNAsfZbAHiiqjLPBiCl16dES1zI4Hpzzxw61Tk+loF+sBDBKx1ICKKKwIqQ7M0mFn1TmkN7euSncWgHiQ=="
+    },
+    "nwsapi": {
+      "version": "2.2.2",
+      "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.2.tgz",
+      "integrity": "sha512-90yv+6538zuvUMnN+zCr8LuV6bPFdq50304114vJYJ8RDyK8D5O9Phpbd6SZWgI7PwzmmfN1upeOJlvybDSgCw==",
+      "dev": true
+    },
+    "nx": {
+      "version": "13.1.3",
+      "resolved": "https://registry.npmjs.org/nx/-/nx-13.1.3.tgz",
+      "integrity": "sha512-clM0NQhQKYkqcNz2E3uYRMLwhp2L/9dBhJhQi9XBX4IAyA2gWAomhRIlLm5Xxg3g4h1xwSpP3eJ5t89VikY8Pw==",
+      "dev": true,
+      "requires": {
+        "@nrwl/cli": "*"
+      }
+    },
+    "oauth-sign": {
+      "version": "0.9.0",
+      "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz",
+      "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==",
+      "dev": true
+    },
+    "object-assign": {
+      "version": "4.1.1",
+      "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz",
+      "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg=="
+    },
+    "object-copy": {
+      "version": "0.1.0",
+      "resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz",
+      "integrity": "sha512-79LYn6VAb63zgtmAteVOWo9Vdj71ZVBy3Pbse+VqxDpEP83XuujMrGqHIwAXJ5I/aM0zU7dIyIAhifVTPrNItQ==",
+      "dev": true,
+      "requires": {
+        "copy-descriptor": "^0.1.0",
+        "define-property": "^0.2.5",
+        "kind-of": "^3.0.3"
       },
       "dependencies": {
       },
       "dependencies": {
-        "picocolors": {
-          "version": "0.2.1",
-          "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz",
-          "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==",
-          "dev": true
-        },
-        "postcss": {
-          "version": "7.0.39",
-          "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz",
-          "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==",
+        "define-property": {
+          "version": "0.2.5",
+          "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz",
+          "integrity": "sha512-Rr7ADjQZenceVOAKop6ALkkRAmH1A4Gx9hV/7ZujPUN2rkATqFO0JZLZInbAjpZYoJ1gUx8MRMQVkYemcbMSTA==",
           "dev": true,
           "requires": {
           "dev": true,
           "requires": {
-            "picocolors": "^0.2.1",
-            "source-map": "^0.6.1"
+            "is-descriptor": "^0.1.0"
           }
         },
           }
         },
-        "source-map": {
-          "version": "0.6.1",
-          "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
-          "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
-          "dev": true
+        "kind-of": {
+          "version": "3.2.2",
+          "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
+          "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==",
+          "dev": true,
+          "requires": {
+            "is-buffer": "^1.1.5"
+          }
         }
       }
     },
         }
       }
     },
-    "postcss-media-query-parser": {
-      "version": "0.2.3",
-      "resolved": "https://registry.npmjs.org/postcss-media-query-parser/-/postcss-media-query-parser-0.2.3.tgz",
-      "integrity": "sha512-3sOlxmbKcSHMjlUXQZKQ06jOswE7oVkXPxmZdoB1r5l0q6gTFTQSHxNxOrCccElbW7dxNytifNEo8qidX2Vsig==",
+    "object-inspect": {
+      "version": "1.12.3",
+      "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.3.tgz",
+      "integrity": "sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g=="
+    },
+    "object-is": {
+      "version": "1.1.5",
+      "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.1.5.tgz",
+      "integrity": "sha512-3cyDsyHgtmi7I7DfSSI2LDp6SK2lwvtbg0p0R1e0RvTqF5ceGx+K2dfSjm1bKDMVCFEDAQvy+o8c6a7VujOddw==",
+      "dev": true,
+      "requires": {
+        "call-bind": "^1.0.2",
+        "define-properties": "^1.1.3"
+      }
+    },
+    "object-keys": {
+      "version": "1.1.1",
+      "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz",
+      "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==",
       "dev": true
     },
       "dev": true
     },
-    "postcss-merge-longhand": {
-      "version": "5.1.6",
-      "resolved": "https://registry.npmjs.org/postcss-merge-longhand/-/postcss-merge-longhand-5.1.6.tgz",
-      "integrity": "sha512-6C/UGF/3T5OE2CEbOuX7iNO63dnvqhGZeUnKkDeifebY0XqkkvrctYSZurpNE902LDf2yKwwPFgotnfSoPhQiw==",
+    "object-visit": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz",
+      "integrity": "sha512-GBaMwwAVK9qbQN3Scdo0OyvgPW7l3lnaVMj84uTOZlswkX0KpF6fyDBJhtTthf7pymztoN36/KEr1DyhF96zEA==",
       "dev": true,
       "requires": {
       "dev": true,
       "requires": {
-        "postcss-value-parser": "^4.2.0",
-        "stylehacks": "^5.1.0"
+        "isobject": "^3.0.0"
       }
     },
       }
     },
-    "postcss-merge-rules": {
-      "version": "5.1.2",
-      "resolved": "https://registry.npmjs.org/postcss-merge-rules/-/postcss-merge-rules-5.1.2.tgz",
-      "integrity": "sha512-zKMUlnw+zYCWoPN6yhPjtcEdlJaMUZ0WyVcxTAmw3lkkN/NDMRkOkiuctQEoWAOvH7twaxUUdvBWl0d4+hifRQ==",
+    "object.assign": {
+      "version": "4.1.4",
+      "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.4.tgz",
+      "integrity": "sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ==",
       "dev": true,
       "requires": {
       "dev": true,
       "requires": {
-        "browserslist": "^4.16.6",
-        "caniuse-api": "^3.0.0",
-        "cssnano-utils": "^3.1.0",
-        "postcss-selector-parser": "^6.0.5"
+        "call-bind": "^1.0.2",
+        "define-properties": "^1.1.4",
+        "has-symbols": "^1.0.3",
+        "object-keys": "^1.1.1"
       }
     },
       }
     },
-    "postcss-minify-font-values": {
-      "version": "5.1.0",
-      "resolved": "https://registry.npmjs.org/postcss-minify-font-values/-/postcss-minify-font-values-5.1.0.tgz",
-      "integrity": "sha512-el3mYTgx13ZAPPirSVsHqFzl+BBBDrXvbySvPGFnQcTI4iNslrPaFq4muTkLZmKlGk4gyFAYUBMH30+HurREyA==",
+    "object.defaults": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npmjs.org/object.defaults/-/object.defaults-1.1.0.tgz",
+      "integrity": "sha512-c/K0mw/F11k4dEUBMW8naXUuBuhxRCfG7W+yFy8EcijU/rSmazOUd1XAEEe6bC0OuXY4HUKjTJv7xbxIMqdxrA==",
       "dev": true,
       "requires": {
       "dev": true,
       "requires": {
-        "postcss-value-parser": "^4.2.0"
+        "array-each": "^1.0.1",
+        "array-slice": "^1.0.0",
+        "for-own": "^1.0.0",
+        "isobject": "^3.0.0"
       }
     },
       }
     },
-    "postcss-minify-gradients": {
-      "version": "5.1.1",
-      "resolved": "https://registry.npmjs.org/postcss-minify-gradients/-/postcss-minify-gradients-5.1.1.tgz",
-      "integrity": "sha512-VGvXMTpCEo4qHTNSa9A0a3D+dxGFZCYwR6Jokk+/3oB6flu2/PnPXAh2x7x52EkY5xlIHLm+Le8tJxe/7TNhzw==",
+    "object.map": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/object.map/-/object.map-1.0.1.tgz",
+      "integrity": "sha512-3+mAJu2PLfnSVGHwIWubpOFLscJANBKuB/6A4CxBstc4aqwQY0FWcsppuy4jU5GSB95yES5JHSI+33AWuS4k6w==",
       "dev": true,
       "requires": {
       "dev": true,
       "requires": {
-        "colord": "^2.9.1",
-        "cssnano-utils": "^3.1.0",
-        "postcss-value-parser": "^4.2.0"
+        "for-own": "^1.0.0",
+        "make-iterator": "^1.0.0"
       }
     },
       }
     },
-    "postcss-minify-params": {
-      "version": "5.1.3",
-      "resolved": "https://registry.npmjs.org/postcss-minify-params/-/postcss-minify-params-5.1.3.tgz",
-      "integrity": "sha512-bkzpWcjykkqIujNL+EVEPOlLYi/eZ050oImVtHU7b4lFS82jPnsCb44gvC6pxaNt38Els3jWYDHTjHKf0koTgg==",
+    "object.pick": {
+      "version": "1.3.0",
+      "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz",
+      "integrity": "sha512-tqa/UMy/CCoYmj+H5qc07qvSL9dqcs/WZENZ1JbtWBlATP+iVOe778gE6MSijnyCnORzDuX6hU+LA4SZ09YjFQ==",
       "dev": true,
       "requires": {
       "dev": true,
       "requires": {
-        "browserslist": "^4.16.6",
-        "cssnano-utils": "^3.1.0",
-        "postcss-value-parser": "^4.2.0"
+        "isobject": "^3.0.1"
       }
     },
       }
     },
-    "postcss-minify-selectors": {
-      "version": "5.2.1",
-      "resolved": "https://registry.npmjs.org/postcss-minify-selectors/-/postcss-minify-selectors-5.2.1.tgz",
-      "integrity": "sha512-nPJu7OjZJTsVUmPdm2TcaiohIwxP+v8ha9NehQ2ye9szv4orirRU3SDdtUmKH+10nzn0bAyOXZ0UEr7OpvLehg==",
+    "obuf": {
+      "version": "1.1.2",
+      "resolved": "https://registry.npmjs.org/obuf/-/obuf-1.1.2.tgz",
+      "integrity": "sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==",
+      "dev": true
+    },
+    "on-finished": {
+      "version": "2.4.1",
+      "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz",
+      "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==",
       "dev": true,
       "requires": {
       "dev": true,
       "requires": {
-        "postcss-selector-parser": "^6.0.5"
+        "ee-first": "1.1.1"
       }
     },
       }
     },
-    "postcss-modules-extract-imports": {
-      "version": "3.0.0",
-      "resolved": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-3.0.0.tgz",
-      "integrity": "sha512-bdHleFnP3kZ4NYDhuGlVK+CMrQ/pqUm8bx/oGL93K6gVwiclvX5x0n76fYMKuIGKzlABOy13zsvqjb0f92TEXw==",
+    "on-headers": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.2.tgz",
+      "integrity": "sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==",
       "dev": true
     },
       "dev": true
     },
-    "postcss-modules-local-by-default": {
-      "version": "4.0.0",
-      "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-4.0.0.tgz",
-      "integrity": "sha512-sT7ihtmGSF9yhm6ggikHdV0hlziDTX7oFoXtuVWeDd3hHObNkcHRo9V3yg7vCAY7cONyxJC/XXCmmiHHcvX7bQ==",
+    "once": {
+      "version": "1.4.0",
+      "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
+      "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==",
+      "requires": {
+        "wrappy": "1"
+      }
+    },
+    "onetime": {
+      "version": "5.1.2",
+      "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz",
+      "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==",
       "dev": true,
       "requires": {
       "dev": true,
       "requires": {
-        "icss-utils": "^5.0.0",
-        "postcss-selector-parser": "^6.0.2",
-        "postcss-value-parser": "^4.1.0"
+        "mimic-fn": "^2.1.0"
       }
     },
       }
     },
-    "postcss-modules-scope": {
-      "version": "3.0.0",
-      "resolved": "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-3.0.0.tgz",
-      "integrity": "sha512-hncihwFA2yPath8oZ15PZqvWGkWf+XUfQgUGamS4LqoP1anQLOsOJw0vr7J7IwLpoY9fatA2qiGUGmuZL0Iqlg==",
+    "open": {
+      "version": "8.4.0",
+      "resolved": "https://registry.npmjs.org/open/-/open-8.4.0.tgz",
+      "integrity": "sha512-XgFPPM+B28FtCCgSb9I+s9szOC1vZRSwgWsRUA5ylIxRTgKozqjOCrVOqGsYABPYK5qnfqClxZTFBa8PKt2v6Q==",
       "dev": true,
       "requires": {
       "dev": true,
       "requires": {
-        "postcss-selector-parser": "^6.0.4"
+        "define-lazy-prop": "^2.0.0",
+        "is-docker": "^2.1.1",
+        "is-wsl": "^2.2.0"
       }
     },
       }
     },
-    "postcss-modules-values": {
-      "version": "4.0.0",
-      "resolved": "https://registry.npmjs.org/postcss-modules-values/-/postcss-modules-values-4.0.0.tgz",
-      "integrity": "sha512-RDxHkAiEGI78gS2ofyvCsu7iycRv7oqw5xMWn9iMoR0N/7mf9D50ecQqUo5BZ9Zh2vH4bCUR/ktCqbB9m8vJjQ==",
+    "opencollective-postinstall": {
+      "version": "2.0.3",
+      "resolved": "https://registry.npmjs.org/opencollective-postinstall/-/opencollective-postinstall-2.0.3.tgz",
+      "integrity": "sha512-8AV/sCtuzUeTo8gQK5qDZzARrulB3egtLzFgteqB2tcT4Mw7B8Kt7JcDHmltjz6FOAHsvTevk70gZEbhM4ZS9Q==",
+      "dev": true
+    },
+    "optionator": {
+      "version": "0.8.3",
+      "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz",
+      "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==",
       "dev": true,
       "requires": {
       "dev": true,
       "requires": {
-        "icss-utils": "^5.0.0"
+        "deep-is": "~0.1.3",
+        "fast-levenshtein": "~2.0.6",
+        "levn": "~0.3.0",
+        "prelude-ls": "~1.1.2",
+        "type-check": "~0.3.2",
+        "word-wrap": "~1.2.3"
       }
     },
       }
     },
-    "postcss-nesting": {
-      "version": "7.0.1",
-      "resolved": "https://registry.npmjs.org/postcss-nesting/-/postcss-nesting-7.0.1.tgz",
-      "integrity": "sha512-FrorPb0H3nuVq0Sff7W2rnc3SmIcruVC6YwpcS+k687VxyxO33iE1amna7wHuRVzM8vfiYofXSBHNAZ3QhLvYg==",
+    "ora": {
+      "version": "5.4.1",
+      "resolved": "https://registry.npmjs.org/ora/-/ora-5.4.1.tgz",
+      "integrity": "sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ==",
       "dev": true,
       "requires": {
       "dev": true,
       "requires": {
-        "postcss": "^7.0.2"
+        "bl": "^4.1.0",
+        "chalk": "^4.1.0",
+        "cli-cursor": "^3.1.0",
+        "cli-spinners": "^2.5.0",
+        "is-interactive": "^1.0.0",
+        "is-unicode-supported": "^0.1.0",
+        "log-symbols": "^4.1.0",
+        "strip-ansi": "^6.0.0",
+        "wcwidth": "^1.0.1"
       },
       "dependencies": {
       },
       "dependencies": {
-        "picocolors": {
-          "version": "0.2.1",
-          "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz",
-          "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==",
-          "dev": true
+        "ansi-styles": {
+          "version": "4.3.0",
+          "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
+          "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+          "dev": true,
+          "requires": {
+            "color-convert": "^2.0.1"
+          }
         },
         },
-        "postcss": {
-          "version": "7.0.39",
-          "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz",
-          "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==",
+        "chalk": {
+          "version": "4.1.2",
+          "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
+          "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
           "dev": true,
           "requires": {
           "dev": true,
           "requires": {
-            "picocolors": "^0.2.1",
-            "source-map": "^0.6.1"
+            "ansi-styles": "^4.1.0",
+            "supports-color": "^7.1.0"
           }
         },
           }
         },
-        "source-map": {
-          "version": "0.6.1",
-          "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
-          "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+        "color-convert": {
+          "version": "2.0.1",
+          "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
+          "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+          "dev": true,
+          "requires": {
+            "color-name": "~1.1.4"
+          }
+        },
+        "color-name": {
+          "version": "1.1.4",
+          "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
+          "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
           "dev": true
           "dev": true
+        },
+        "has-flag": {
+          "version": "4.0.0",
+          "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
+          "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+          "dev": true
+        },
+        "supports-color": {
+          "version": "7.2.0",
+          "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
+          "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
+          "dev": true,
+          "requires": {
+            "has-flag": "^4.0.0"
+          }
         }
       }
     },
         }
       }
     },
-    "postcss-normalize-charset": {
-      "version": "5.1.0",
-      "resolved": "https://registry.npmjs.org/postcss-normalize-charset/-/postcss-normalize-charset-5.1.0.tgz",
-      "integrity": "sha512-mSgUJ+pd/ldRGVx26p2wz9dNZ7ji6Pn8VWBajMXFf8jk7vUoSrZ2lt/wZR7DtlZYKesmZI680qjr2CeFF2fbUg==",
+    "os-browserify": {
+      "version": "0.3.0",
+      "resolved": "https://registry.npmjs.org/os-browserify/-/os-browserify-0.3.0.tgz",
+      "integrity": "sha512-gjcpUc3clBf9+210TRaDWbf+rZZZEshZ+DlXMRCeAjp0xhTrnQsKHypIy1J3d5hKdUzj69t708EHtU8P6bUn0A==",
       "dev": true
     },
       "dev": true
     },
-    "postcss-normalize-display-values": {
-      "version": "5.1.0",
-      "resolved": "https://registry.npmjs.org/postcss-normalize-display-values/-/postcss-normalize-display-values-5.1.0.tgz",
-      "integrity": "sha512-WP4KIM4o2dazQXWmFaqMmcvsKmhdINFblgSeRgn8BJ6vxaMyaJkwAzpPpuvSIoG/rmX3M+IrRZEz2H0glrQNEA==",
+    "os-locale": {
+      "version": "3.1.0",
+      "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-3.1.0.tgz",
+      "integrity": "sha512-Z8l3R4wYWM40/52Z+S265okfFj8Kt2cC2MKY+xNi3kFs+XGI7WXu/I309QQQYbRW4ijiZ+yxs9pqEhJh0DqW3Q==",
       "dev": true,
       "requires": {
       "dev": true,
       "requires": {
-        "postcss-value-parser": "^4.2.0"
+        "execa": "^1.0.0",
+        "lcid": "^2.0.0",
+        "mem": "^4.0.0"
+      },
+      "dependencies": {
+        "cross-spawn": {
+          "version": "6.0.5",
+          "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz",
+          "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==",
+          "dev": true,
+          "requires": {
+            "nice-try": "^1.0.4",
+            "path-key": "^2.0.1",
+            "semver": "^5.5.0",
+            "shebang-command": "^1.2.0",
+            "which": "^1.2.9"
+          }
+        },
+        "execa": {
+          "version": "1.0.0",
+          "resolved": "https://registry.npmjs.org/execa/-/execa-1.0.0.tgz",
+          "integrity": "sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==",
+          "dev": true,
+          "requires": {
+            "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"
+          }
+        },
+        "get-stream": {
+          "version": "4.1.0",
+          "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz",
+          "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==",
+          "dev": true,
+          "requires": {
+            "pump": "^3.0.0"
+          }
+        },
+        "is-stream": {
+          "version": "1.1.0",
+          "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz",
+          "integrity": "sha512-uQPm8kcs47jx38atAcWTVxyltQYoPT68y9aWYdV6yWXSyW8mzSat0TL6CiWdZeCdF3KrAvpVtnHbTv4RN+rqdQ==",
+          "dev": true
+        },
+        "npm-run-path": {
+          "version": "2.0.2",
+          "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz",
+          "integrity": "sha512-lJxZYlT4DW/bRUtFh1MQIWqmLwQfAxnqWG4HhEdjMlkrJYnJn0Jrr2u3mgxqaWsdiBc76TYkTG/mhrnYTuzfHw==",
+          "dev": true,
+          "requires": {
+            "path-key": "^2.0.0"
+          }
+        },
+        "path-key": {
+          "version": "2.0.1",
+          "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz",
+          "integrity": "sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw==",
+          "dev": true
+        },
+        "semver": {
+          "version": "5.7.1",
+          "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz",
+          "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==",
+          "dev": true
+        },
+        "shebang-command": {
+          "version": "1.2.0",
+          "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz",
+          "integrity": "sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg==",
+          "dev": true,
+          "requires": {
+            "shebang-regex": "^1.0.0"
+          }
+        },
+        "shebang-regex": {
+          "version": "1.0.0",
+          "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz",
+          "integrity": "sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ==",
+          "dev": true
+        },
+        "which": {
+          "version": "1.3.1",
+          "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz",
+          "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==",
+          "dev": true,
+          "requires": {
+            "isexe": "^2.0.0"
+          }
+        }
       }
     },
       }
     },
-    "postcss-normalize-positions": {
-      "version": "5.1.1",
-      "resolved": "https://registry.npmjs.org/postcss-normalize-positions/-/postcss-normalize-positions-5.1.1.tgz",
-      "integrity": "sha512-6UpCb0G4eofTCQLFVuI3EVNZzBNPiIKcA1AKVka+31fTVySphr3VUgAIULBhxZkKgwLImhzMR2Bw1ORK+37INg==",
+    "os-name": {
+      "version": "4.0.1",
+      "resolved": "https://registry.npmjs.org/os-name/-/os-name-4.0.1.tgz",
+      "integrity": "sha512-xl9MAoU97MH1Xt5K9ERft2YfCAoaO6msy1OBA0ozxEC0x0TmIoE6K3QvgJMMZA9yKGLmHXNY/YZoDbiGDj4zYw==",
       "dev": true,
       "requires": {
       "dev": true,
       "requires": {
-        "postcss-value-parser": "^4.2.0"
+        "macos-release": "^2.5.0",
+        "windows-release": "^4.0.0"
       }
     },
       }
     },
-    "postcss-normalize-repeat-style": {
-      "version": "5.1.1",
-      "resolved": "https://registry.npmjs.org/postcss-normalize-repeat-style/-/postcss-normalize-repeat-style-5.1.1.tgz",
-      "integrity": "sha512-mFpLspGWkQtBcWIRFLmewo8aC3ImN2i/J3v8YCFUwDnPu3Xz4rLohDO26lGjwNsQxB3YF0KKRwspGzE2JEuS0g==",
-      "dev": true,
-      "requires": {
-        "postcss-value-parser": "^4.2.0"
-      }
+    "os-tmpdir": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz",
+      "integrity": "sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==",
+      "dev": true
     },
     },
-    "postcss-normalize-string": {
-      "version": "5.1.0",
-      "resolved": "https://registry.npmjs.org/postcss-normalize-string/-/postcss-normalize-string-5.1.0.tgz",
-      "integrity": "sha512-oYiIJOf4T9T1N4i+abeIc7Vgm/xPCGih4bZz5Nm0/ARVJ7K6xrDlLwvwqOydvyL3RHNf8qZk6vo3aatiw/go3w==",
-      "dev": true,
-      "requires": {
-        "postcss-value-parser": "^4.2.0"
-      }
+    "ospath": {
+      "version": "1.2.2",
+      "resolved": "https://registry.npmjs.org/ospath/-/ospath-1.2.2.tgz",
+      "integrity": "sha512-o6E5qJV5zkAbIDNhGSIlyOhScKXgQrSRMilfph0clDfM0nEnBOlKlH4sWDmG95BW/CvwNz0vmm7dJVtU2KlMiA==",
+      "dev": true
     },
     },
-    "postcss-normalize-timing-functions": {
-      "version": "5.1.0",
-      "resolved": "https://registry.npmjs.org/postcss-normalize-timing-functions/-/postcss-normalize-timing-functions-5.1.0.tgz",
-      "integrity": "sha512-DOEkzJ4SAXv5xkHl0Wa9cZLF3WCBhF3o1SKVxKQAa+0pYKlueTpCgvkFAHfk+Y64ezX9+nITGrDZeVGgITJXjg==",
+    "outpipe": {
+      "version": "1.1.1",
+      "resolved": "https://registry.npmjs.org/outpipe/-/outpipe-1.1.1.tgz",
+      "integrity": "sha512-BnNY/RwnDrkmQdUa9U+OfN/Y7AWmKuUPCCd+hbRclZnnANvYpO72zp/a6Q4n829hPbdqEac31XCcsvlEvb+rtA==",
       "dev": true,
       "requires": {
       "dev": true,
       "requires": {
-        "postcss-value-parser": "^4.2.0"
+        "shell-quote": "^1.4.2"
       }
     },
       }
     },
-    "postcss-normalize-unicode": {
-      "version": "5.1.0",
-      "resolved": "https://registry.npmjs.org/postcss-normalize-unicode/-/postcss-normalize-unicode-5.1.0.tgz",
-      "integrity": "sha512-J6M3MizAAZ2dOdSjy2caayJLQT8E8K9XjLce8AUQMwOrCvjCHv24aLC/Lps1R1ylOfol5VIDMaM/Lo9NGlk1SQ==",
+    "p-defer": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/p-defer/-/p-defer-1.0.0.tgz",
+      "integrity": "sha512-wB3wfAxZpk2AzOfUMJNL+d36xothRSyj8EXOa4f6GMqYDN9BJaaSISbsk+wS9abmnebVw95C2Kb5t85UmpCxuw==",
+      "dev": true
+    },
+    "p-finally": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz",
+      "integrity": "sha512-LICb2p9CB7FS+0eR1oqWnHhp0FljGLZCWBE9aix0Uye9W8LTQPwMTYVGWQWIw9RdQiDg4+epXQODwIYJtSJaow==",
+      "dev": true
+    },
+    "p-is-promise": {
+      "version": "2.1.0",
+      "resolved": "https://registry.npmjs.org/p-is-promise/-/p-is-promise-2.1.0.tgz",
+      "integrity": "sha512-Y3W0wlRPK8ZMRbNq97l4M5otioeA5lm1z7bkNkxCka8HSPjR0xRWmpCmc9utiaLP9Jb1eD8BgeIxTW4AIF45Pg==",
+      "dev": true
+    },
+    "p-limit": {
+      "version": "2.3.0",
+      "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz",
+      "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==",
       "dev": true,
       "requires": {
       "dev": true,
       "requires": {
-        "browserslist": "^4.16.6",
-        "postcss-value-parser": "^4.2.0"
+        "p-try": "^2.0.0"
       }
     },
       }
     },
-    "postcss-normalize-url": {
-      "version": "5.1.0",
-      "resolved": "https://registry.npmjs.org/postcss-normalize-url/-/postcss-normalize-url-5.1.0.tgz",
-      "integrity": "sha512-5upGeDO+PVthOxSmds43ZeMeZfKH+/DKgGRD7TElkkyS46JXAUhMzIKiCa7BabPeIy3AQcTkXwVVN7DbqsiCew==",
+    "p-locate": {
+      "version": "4.1.0",
+      "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz",
+      "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==",
       "dev": true,
       "requires": {
       "dev": true,
       "requires": {
-        "normalize-url": "^6.0.1",
-        "postcss-value-parser": "^4.2.0"
+        "p-limit": "^2.2.0"
       }
     },
       }
     },
-    "postcss-normalize-whitespace": {
-      "version": "5.1.1",
-      "resolved": "https://registry.npmjs.org/postcss-normalize-whitespace/-/postcss-normalize-whitespace-5.1.1.tgz",
-      "integrity": "sha512-83ZJ4t3NUDETIHTa3uEg6asWjSBYL5EdkVB0sDncx9ERzOKBVJIUeDO9RyA9Zwtig8El1d79HBp0JEi8wvGQnA==",
+    "p-map": {
+      "version": "4.0.0",
+      "resolved": "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz",
+      "integrity": "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==",
       "dev": true,
       "requires": {
       "dev": true,
       "requires": {
-        "postcss-value-parser": "^4.2.0"
+        "aggregate-error": "^3.0.0"
       }
     },
       }
     },
-    "postcss-ordered-values": {
-      "version": "5.1.3",
-      "resolved": "https://registry.npmjs.org/postcss-ordered-values/-/postcss-ordered-values-5.1.3.tgz",
-      "integrity": "sha512-9UO79VUhPwEkzbb3RNpqqghc6lcYej1aveQteWY+4POIwlqkYE21HKWaLDF6lWNuqCobEAyTovVhtI32Rbv2RQ==",
+    "p-retry": {
+      "version": "4.6.2",
+      "resolved": "https://registry.npmjs.org/p-retry/-/p-retry-4.6.2.tgz",
+      "integrity": "sha512-312Id396EbJdvRONlngUx0NydfrIQ5lsYu0znKVUzVvArzEIt08V1qhtyESbGVd1FGX7UKtiFp5uwKZdM8wIuQ==",
       "dev": true,
       "requires": {
       "dev": true,
       "requires": {
-        "cssnano-utils": "^3.1.0",
-        "postcss-value-parser": "^4.2.0"
+        "@types/retry": "0.12.0",
+        "retry": "^0.13.1"
       }
     },
       }
     },
-    "postcss-overflow-shorthand": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/postcss-overflow-shorthand/-/postcss-overflow-shorthand-2.0.0.tgz",
-      "integrity": "sha512-aK0fHc9CBNx8jbzMYhshZcEv8LtYnBIRYQD5i7w/K/wS9c2+0NSR6B3OVMu5y0hBHYLcMGjfU+dmWYNKH0I85g==",
+    "p-try": {
+      "version": "2.2.0",
+      "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz",
+      "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==",
+      "dev": true
+    },
+    "pacote": {
+      "version": "12.0.3",
+      "resolved": "https://registry.npmjs.org/pacote/-/pacote-12.0.3.tgz",
+      "integrity": "sha512-CdYEl03JDrRO3x18uHjBYA9TyoW8gy+ThVcypcDkxPtKlw76e4ejhYB6i9lJ+/cebbjpqPW/CijjqxwDTts8Ow==",
       "dev": true,
       "requires": {
       "dev": true,
       "requires": {
-        "postcss": "^7.0.2"
+        "@npmcli/git": "^2.1.0",
+        "@npmcli/installed-package-contents": "^1.0.6",
+        "@npmcli/promise-spawn": "^1.2.0",
+        "@npmcli/run-script": "^2.0.0",
+        "cacache": "^15.0.5",
+        "chownr": "^2.0.0",
+        "fs-minipass": "^2.1.0",
+        "infer-owner": "^1.0.4",
+        "minipass": "^3.1.3",
+        "mkdirp": "^1.0.3",
+        "npm-package-arg": "^8.0.1",
+        "npm-packlist": "^3.0.0",
+        "npm-pick-manifest": "^6.0.0",
+        "npm-registry-fetch": "^12.0.0",
+        "promise-retry": "^2.0.1",
+        "read-package-json-fast": "^2.0.1",
+        "rimraf": "^3.0.2",
+        "ssri": "^8.0.1",
+        "tar": "^6.1.0"
       },
       "dependencies": {
       },
       "dependencies": {
-        "picocolors": {
-          "version": "0.2.1",
-          "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz",
-          "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==",
-          "dev": true
-        },
-        "postcss": {
-          "version": "7.0.39",
-          "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz",
-          "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==",
-          "dev": true,
-          "requires": {
-            "picocolors": "^0.2.1",
-            "source-map": "^0.6.1"
-          }
-        },
-        "source-map": {
-          "version": "0.6.1",
-          "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
-          "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+        "chownr": {
+          "version": "2.0.0",
+          "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz",
+          "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==",
           "dev": true
         }
       }
     },
           "dev": true
         }
       }
     },
-    "postcss-page-break": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/postcss-page-break/-/postcss-page-break-2.0.0.tgz",
-      "integrity": "sha512-tkpTSrLpfLfD9HvgOlJuigLuk39wVTbbd8RKcy8/ugV2bNBUW3xU+AIqyxhDrQr1VUj1RmyJrBn1YWrqUm9zAQ==",
+    "pad-right": {
+      "version": "0.2.2",
+      "resolved": "https://registry.npmjs.org/pad-right/-/pad-right-0.2.2.tgz",
+      "integrity": "sha512-4cy8M95ioIGolCoMmm2cMntGR1lPLEbOMzOKu8bzjuJP6JpzEMQcDHmh7hHLYGgob+nKe1YHFMaG4V59HQa89g==",
       "dev": true,
       "requires": {
       "dev": true,
       "requires": {
-        "postcss": "^7.0.2"
-      },
-      "dependencies": {
-        "picocolors": {
-          "version": "0.2.1",
-          "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz",
-          "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==",
-          "dev": true
-        },
-        "postcss": {
-          "version": "7.0.39",
-          "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz",
-          "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==",
-          "dev": true,
-          "requires": {
-            "picocolors": "^0.2.1",
-            "source-map": "^0.6.1"
-          }
-        },
-        "source-map": {
-          "version": "0.6.1",
-          "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
-          "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
-          "dev": true
-        }
+        "repeat-string": "^1.5.2"
       }
     },
       }
     },
-    "postcss-place": {
-      "version": "4.0.1",
-      "resolved": "https://registry.npmjs.org/postcss-place/-/postcss-place-4.0.1.tgz",
-      "integrity": "sha512-Zb6byCSLkgRKLODj/5mQugyuj9bvAAw9LqJJjgwz5cYryGeXfFZfSXoP1UfveccFmeq0b/2xxwcTEVScnqGxBg==",
+    "pako": {
+      "version": "1.0.11",
+      "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz",
+      "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==",
+      "dev": true
+    },
+    "parent-module": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz",
+      "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==",
       "dev": true,
       "requires": {
       "dev": true,
       "requires": {
-        "postcss": "^7.0.2",
-        "postcss-values-parser": "^2.0.0"
-      },
-      "dependencies": {
-        "picocolors": {
-          "version": "0.2.1",
-          "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz",
-          "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==",
-          "dev": true
-        },
-        "postcss": {
-          "version": "7.0.39",
-          "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz",
-          "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==",
-          "dev": true,
-          "requires": {
-            "picocolors": "^0.2.1",
-            "source-map": "^0.6.1"
-          }
-        },
-        "source-map": {
-          "version": "0.6.1",
-          "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
-          "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
-          "dev": true
-        }
+        "callsites": "^3.0.0"
       }
     },
       }
     },
-    "postcss-preset-env": {
-      "version": "6.7.0",
-      "resolved": "https://registry.npmjs.org/postcss-preset-env/-/postcss-preset-env-6.7.0.tgz",
-      "integrity": "sha512-eU4/K5xzSFwUFJ8hTdTQzo2RBLbDVt83QZrAvI07TULOkmyQlnYlpwep+2yIK+K+0KlZO4BvFcleOCCcUtwchg==",
-      "dev": true,
-      "requires": {
-        "autoprefixer": "^9.6.1",
-        "browserslist": "^4.6.4",
-        "caniuse-lite": "^1.0.30000981",
-        "css-blank-pseudo": "^0.1.4",
-        "css-has-pseudo": "^0.10.0",
-        "css-prefers-color-scheme": "^3.1.1",
-        "cssdb": "^4.4.0",
-        "postcss": "^7.0.17",
-        "postcss-attribute-case-insensitive": "^4.0.1",
-        "postcss-color-functional-notation": "^2.0.1",
-        "postcss-color-gray": "^5.0.0",
-        "postcss-color-hex-alpha": "^5.0.3",
-        "postcss-color-mod-function": "^3.0.3",
-        "postcss-color-rebeccapurple": "^4.0.1",
-        "postcss-custom-media": "^7.0.8",
-        "postcss-custom-properties": "^8.0.11",
-        "postcss-custom-selectors": "^5.1.2",
-        "postcss-dir-pseudo-class": "^5.0.0",
-        "postcss-double-position-gradients": "^1.0.0",
-        "postcss-env-function": "^2.0.2",
-        "postcss-focus-visible": "^4.0.0",
-        "postcss-focus-within": "^3.0.0",
-        "postcss-font-variant": "^4.0.0",
-        "postcss-gap-properties": "^2.0.0",
-        "postcss-image-set-function": "^3.0.1",
-        "postcss-initial": "^3.0.0",
-        "postcss-lab-function": "^2.0.1",
-        "postcss-logical": "^3.0.0",
-        "postcss-media-minmax": "^4.0.0",
-        "postcss-nesting": "^7.0.0",
-        "postcss-overflow-shorthand": "^2.0.0",
-        "postcss-page-break": "^2.0.0",
-        "postcss-place": "^4.0.1",
-        "postcss-pseudo-class-any-link": "^6.0.0",
-        "postcss-replace-overflow-wrap": "^3.0.0",
-        "postcss-selector-matches": "^4.0.0",
-        "postcss-selector-not": "^4.0.0"
-      },
-      "dependencies": {
-        "picocolors": {
-          "version": "0.2.1",
-          "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz",
-          "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==",
-          "dev": true
-        },
-        "postcss": {
-          "version": "7.0.39",
-          "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz",
-          "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==",
-          "dev": true,
-          "requires": {
-            "picocolors": "^0.2.1",
-            "source-map": "^0.6.1"
-          }
-        },
-        "source-map": {
-          "version": "0.6.1",
-          "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
-          "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
-          "dev": true
-        }
+    "parents": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/parents/-/parents-1.0.1.tgz",
+      "integrity": "sha512-mXKF3xkoUt5td2DoxpLmtOmZvko9VfFpwRwkKDHSNvgmpLAeBo18YDhcPbBzJq+QLCHMbGOfzia2cX4U+0v9Mg==",
+      "dev": true,
+      "requires": {
+        "path-platform": "~0.11.15"
       }
     },
       }
     },
-    "postcss-pseudo-class-any-link": {
-      "version": "6.0.0",
-      "resolved": "https://registry.npmjs.org/postcss-pseudo-class-any-link/-/postcss-pseudo-class-any-link-6.0.0.tgz",
-      "integrity": "sha512-lgXW9sYJdLqtmw23otOzrtbDXofUdfYzNm4PIpNE322/swES3VU9XlXHeJS46zT2onFO7V1QFdD4Q9LiZj8mew==",
+    "parse-asn1": {
+      "version": "5.1.6",
+      "resolved": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.6.tgz",
+      "integrity": "sha512-RnZRo1EPU6JBnra2vGHj0yhp6ebyjBZpmUCLHWiFhxlzvBCCpAuZ7elsBp1PVAbQN0/04VD/19rfzlBSwLstMw==",
       "dev": true,
       "requires": {
       "dev": true,
       "requires": {
-        "postcss": "^7.0.2",
-        "postcss-selector-parser": "^5.0.0-rc.3"
-      },
-      "dependencies": {
-        "cssesc": {
-          "version": "2.0.0",
-          "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-2.0.0.tgz",
-          "integrity": "sha512-MsCAG1z9lPdoO/IUMLSBWBSVxVtJ1395VGIQ+Fc2gNdkQ1hNDnQdw3YhA71WJCBW1vdwA0cAnk/DnW6bqoEUYg==",
-          "dev": true
-        },
-        "picocolors": {
-          "version": "0.2.1",
-          "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz",
-          "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==",
-          "dev": true
-        },
-        "postcss": {
-          "version": "7.0.39",
-          "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz",
-          "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==",
-          "dev": true,
-          "requires": {
-            "picocolors": "^0.2.1",
-            "source-map": "^0.6.1"
-          }
-        },
-        "postcss-selector-parser": {
-          "version": "5.0.0",
-          "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-5.0.0.tgz",
-          "integrity": "sha512-w+zLE5Jhg6Liz8+rQOWEAwtwkyqpfnmsinXjXg6cY7YIONZZtgvE0v2O0uhQBs0peNomOJwWRKt6JBfTdTd3OQ==",
-          "dev": true,
-          "requires": {
-            "cssesc": "^2.0.0",
-            "indexes-of": "^1.0.1",
-            "uniq": "^1.0.1"
-          }
-        },
-        "source-map": {
-          "version": "0.6.1",
-          "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
-          "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
-          "dev": true
-        }
+        "asn1.js": "^5.2.0",
+        "browserify-aes": "^1.0.0",
+        "evp_bytestokey": "^1.0.0",
+        "pbkdf2": "^3.0.3",
+        "safe-buffer": "^5.1.1"
       }
     },
       }
     },
-    "postcss-reduce-initial": {
-      "version": "5.1.0",
-      "resolved": "https://registry.npmjs.org/postcss-reduce-initial/-/postcss-reduce-initial-5.1.0.tgz",
-      "integrity": "sha512-5OgTUviz0aeH6MtBjHfbr57tml13PuedK/Ecg8szzd4XRMbYxH4572JFG067z+FqBIf6Zp/d+0581glkvvWMFw==",
-      "dev": true,
+    "parse-entities": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/parse-entities/-/parse-entities-2.0.0.tgz",
+      "integrity": "sha512-kkywGpCcRYhqQIchaWqZ875wzpS/bMKhz5HnN3p7wveJTkTtyAB/AlnS0f8DFSqYW1T82t6yEAkEcB+A1I3MbQ==",
       "requires": {
       "requires": {
-        "browserslist": "^4.16.6",
-        "caniuse-api": "^3.0.0"
+        "character-entities": "^1.0.0",
+        "character-entities-legacy": "^1.0.0",
+        "character-reference-invalid": "^1.0.0",
+        "is-alphanumerical": "^1.0.0",
+        "is-decimal": "^1.0.0",
+        "is-hexadecimal": "^1.0.0"
       }
     },
       }
     },
-    "postcss-reduce-transforms": {
-      "version": "5.1.0",
-      "resolved": "https://registry.npmjs.org/postcss-reduce-transforms/-/postcss-reduce-transforms-5.1.0.tgz",
-      "integrity": "sha512-2fbdbmgir5AvpW9RLtdONx1QoYG2/EtqpNQbFASDlixBbAYuTcJ0dECwlqNqH7VbaUnEnh8SrxOe2sRIn24XyQ==",
+    "parse-filepath": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/parse-filepath/-/parse-filepath-1.0.2.tgz",
+      "integrity": "sha512-FwdRXKCohSVeXqwtYonZTXtbGJKrn+HNyWDYVcp5yuJlesTwNH4rsmRZ+GrKAPJ5bLpRxESMeS+Rl0VCHRvB2Q==",
       "dev": true,
       "requires": {
       "dev": true,
       "requires": {
-        "postcss-value-parser": "^4.2.0"
+        "is-absolute": "^1.0.0",
+        "map-cache": "^0.2.0",
+        "path-root": "^0.1.1"
       }
     },
       }
     },
-    "postcss-replace-overflow-wrap": {
-      "version": "3.0.0",
-      "resolved": "https://registry.npmjs.org/postcss-replace-overflow-wrap/-/postcss-replace-overflow-wrap-3.0.0.tgz",
-      "integrity": "sha512-2T5hcEHArDT6X9+9dVSPQdo7QHzG4XKclFT8rU5TzJPDN7RIRTbO9c4drUISOVemLj03aezStHCR2AIcr8XLpw==",
+    "parse-json": {
+      "version": "5.2.0",
+      "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz",
+      "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==",
       "dev": true,
       "requires": {
       "dev": true,
       "requires": {
-        "postcss": "^7.0.2"
-      },
-      "dependencies": {
-        "picocolors": {
-          "version": "0.2.1",
-          "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz",
-          "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==",
-          "dev": true
-        },
-        "postcss": {
-          "version": "7.0.39",
-          "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz",
-          "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==",
-          "dev": true,
-          "requires": {
-            "picocolors": "^0.2.1",
-            "source-map": "^0.6.1"
-          }
-        },
-        "source-map": {
-          "version": "0.6.1",
-          "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
-          "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
-          "dev": true
-        }
+        "@babel/code-frame": "^7.0.0",
+        "error-ex": "^1.3.1",
+        "json-parse-even-better-errors": "^2.3.0",
+        "lines-and-columns": "^1.1.6"
       }
     },
       }
     },
-    "postcss-resolve-nested-selector": {
-      "version": "0.1.1",
-      "resolved": "https://registry.npmjs.org/postcss-resolve-nested-selector/-/postcss-resolve-nested-selector-0.1.1.tgz",
-      "integrity": "sha512-HvExULSwLqHLgUy1rl3ANIqCsvMS0WHss2UOsXhXnQaZ9VCc2oBvIpXrl00IUFT5ZDITME0o6oiXeiHr2SAIfw==",
+    "parse-node-version": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/parse-node-version/-/parse-node-version-1.0.1.tgz",
+      "integrity": "sha512-3YHlOa/JgH6Mnpr05jP9eDG254US9ek25LyIxZlDItp2iJtwyaXQb57lBYLdT3MowkUFYEV2XXNAYIPlESvJlA==",
+      "dev": true
+    },
+    "parse-passwd": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/parse-passwd/-/parse-passwd-1.0.0.tgz",
+      "integrity": "sha512-1Y1A//QUXEZK7YKz+rD9WydcE1+EuPr6ZBgKecAB8tmoW6UFv0NREVJe1p+jRxtThkcbbKkfwIbWJe/IeE6m2Q==",
+      "dev": true
+    },
+    "parse5": {
+      "version": "6.0.1",
+      "resolved": "https://registry.npmjs.org/parse5/-/parse5-6.0.1.tgz",
+      "integrity": "sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==",
       "dev": true
     },
       "dev": true
     },
-    "postcss-safe-parser": {
-      "version": "4.0.2",
-      "resolved": "https://registry.npmjs.org/postcss-safe-parser/-/postcss-safe-parser-4.0.2.tgz",
-      "integrity": "sha512-Uw6ekxSWNLCPesSv/cmqf2bY/77z11O7jZGPax3ycZMFU/oi2DMH9i89AdHc1tRwFg/arFoEwX0IS3LCUxJh1g==",
+    "parse5-html-rewriting-stream": {
+      "version": "6.0.1",
+      "resolved": "https://registry.npmjs.org/parse5-html-rewriting-stream/-/parse5-html-rewriting-stream-6.0.1.tgz",
+      "integrity": "sha512-vwLQzynJVEfUlURxgnf51yAJDQTtVpNyGD8tKi2Za7m+akukNHxCcUQMAa/mUGLhCeicFdpy7Tlvj8ZNKadprg==",
       "dev": true,
       "requires": {
       "dev": true,
       "requires": {
-        "postcss": "^7.0.26"
-      },
-      "dependencies": {
-        "picocolors": {
-          "version": "0.2.1",
-          "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz",
-          "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==",
-          "dev": true
-        },
-        "postcss": {
-          "version": "7.0.39",
-          "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz",
-          "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==",
-          "dev": true,
-          "requires": {
-            "picocolors": "^0.2.1",
-            "source-map": "^0.6.1"
-          }
-        },
-        "source-map": {
-          "version": "0.6.1",
-          "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
-          "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
-          "dev": true
-        }
+        "parse5": "^6.0.1",
+        "parse5-sax-parser": "^6.0.1"
       }
     },
       }
     },
-    "postcss-sass": {
-      "version": "0.4.4",
-      "resolved": "https://registry.npmjs.org/postcss-sass/-/postcss-sass-0.4.4.tgz",
-      "integrity": "sha512-BYxnVYx4mQooOhr+zer0qWbSPYnarAy8ZT7hAQtbxtgVf8gy+LSLT/hHGe35h14/pZDTw1DsxdbrwxBN++H+fg==",
+    "parse5-htmlparser2-tree-adapter": {
+      "version": "6.0.1",
+      "resolved": "https://registry.npmjs.org/parse5-htmlparser2-tree-adapter/-/parse5-htmlparser2-tree-adapter-6.0.1.tgz",
+      "integrity": "sha512-qPuWvbLgvDGilKc5BoicRovlT4MtYT6JfJyBOMDsKoiT+GiuP5qyrPCnR9HcPECIJJmZh5jRndyNThnhhb/vlA==",
       "dev": true,
       "requires": {
       "dev": true,
       "requires": {
-        "gonzales-pe": "^4.3.0",
-        "postcss": "^7.0.21"
-      },
-      "dependencies": {
-        "picocolors": {
-          "version": "0.2.1",
-          "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz",
-          "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==",
-          "dev": true
-        },
-        "postcss": {
-          "version": "7.0.39",
-          "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz",
-          "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==",
-          "dev": true,
-          "requires": {
-            "picocolors": "^0.2.1",
-            "source-map": "^0.6.1"
-          }
-        },
-        "source-map": {
-          "version": "0.6.1",
-          "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
-          "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
-          "dev": true
-        }
+        "parse5": "^6.0.1"
       }
     },
       }
     },
-    "postcss-scss": {
-      "version": "2.1.1",
-      "resolved": "https://registry.npmjs.org/postcss-scss/-/postcss-scss-2.1.1.tgz",
-      "integrity": "sha512-jQmGnj0hSGLd9RscFw9LyuSVAa5Bl1/KBPqG1NQw9w8ND55nY4ZEsdlVuYJvLPpV+y0nwTV5v/4rHPzZRihQbA==",
+    "parse5-sax-parser": {
+      "version": "6.0.1",
+      "resolved": "https://registry.npmjs.org/parse5-sax-parser/-/parse5-sax-parser-6.0.1.tgz",
+      "integrity": "sha512-kXX+5S81lgESA0LsDuGjAlBybImAChYRMT+/uKCEXFBFOeEhS52qUCydGhU3qLRD8D9DVjaUo821WK7DM4iCeg==",
       "dev": true,
       "requires": {
       "dev": true,
       "requires": {
-        "postcss": "^7.0.6"
-      },
-      "dependencies": {
-        "picocolors": {
-          "version": "0.2.1",
-          "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz",
-          "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==",
-          "dev": true
-        },
-        "postcss": {
-          "version": "7.0.39",
-          "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz",
-          "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==",
-          "dev": true,
-          "requires": {
-            "picocolors": "^0.2.1",
-            "source-map": "^0.6.1"
-          }
-        },
-        "source-map": {
-          "version": "0.6.1",
-          "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
-          "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
-          "dev": true
-        }
+        "parse5": "^6.0.1"
       }
     },
       }
     },
-    "postcss-selector-matches": {
+    "parseurl": {
+      "version": "1.3.3",
+      "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz",
+      "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==",
+      "dev": true
+    },
+    "pascalcase": {
+      "version": "0.1.1",
+      "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz",
+      "integrity": "sha512-XHXfu/yOQRy9vYOtUDVMN60OEJjW013GoObG1o+xwQTpB9eYJX/BjXMsdW13ZDPruFhYYn0AG22w0xgQMwl3Nw==",
+      "dev": true
+    },
+    "path-browserify": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-1.0.1.tgz",
+      "integrity": "sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==",
+      "dev": true
+    },
+    "path-exists": {
       "version": "4.0.0",
       "version": "4.0.0",
-      "resolved": "https://registry.npmjs.org/postcss-selector-matches/-/postcss-selector-matches-4.0.0.tgz",
-      "integrity": "sha512-LgsHwQR/EsRYSqlwdGzeaPKVT0Ml7LAT6E75T8W8xLJY62CE4S/l03BWIt3jT8Taq22kXP08s2SfTSzaraoPww==",
+      "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz",
+      "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==",
+      "dev": true
+    },
+    "path-is-absolute": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
+      "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg=="
+    },
+    "path-key": {
+      "version": "3.1.1",
+      "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz",
+      "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==",
+      "dev": true
+    },
+    "path-parse": {
+      "version": "1.0.7",
+      "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz",
+      "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==",
+      "dev": true
+    },
+    "path-platform": {
+      "version": "0.11.15",
+      "resolved": "https://registry.npmjs.org/path-platform/-/path-platform-0.11.15.tgz",
+      "integrity": "sha512-Y30dB6rab1A/nfEKsZxmr01nUotHX0c/ZiIAsCTatEe1CmS5Pm5He7fZ195bPT7RdquoaL8lLxFCMQi/bS7IJg==",
+      "dev": true
+    },
+    "path-root": {
+      "version": "0.1.1",
+      "resolved": "https://registry.npmjs.org/path-root/-/path-root-0.1.1.tgz",
+      "integrity": "sha512-QLcPegTHF11axjfojBIoDygmS2E3Lf+8+jI6wOVmNVenrKSo3mFdSGiIgdSHenczw3wPtlVMQaFVwGmM7BJdtg==",
       "dev": true,
       "requires": {
       "dev": true,
       "requires": {
-        "balanced-match": "^1.0.0",
-        "postcss": "^7.0.2"
-      },
-      "dependencies": {
-        "picocolors": {
-          "version": "0.2.1",
-          "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz",
-          "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==",
-          "dev": true
-        },
-        "postcss": {
-          "version": "7.0.39",
-          "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz",
-          "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==",
-          "dev": true,
-          "requires": {
-            "picocolors": "^0.2.1",
-            "source-map": "^0.6.1"
-          }
-        },
-        "source-map": {
-          "version": "0.6.1",
-          "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
-          "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
-          "dev": true
-        }
+        "path-root-regex": "^0.1.0"
       }
     },
       }
     },
-    "postcss-selector-not": {
-      "version": "4.0.1",
-      "resolved": "https://registry.npmjs.org/postcss-selector-not/-/postcss-selector-not-4.0.1.tgz",
-      "integrity": "sha512-YolvBgInEK5/79C+bdFMyzqTg6pkYqDbzZIST/PDMqa/o3qtXenD05apBG2jLgT0/BQ77d4U2UK12jWpilqMAQ==",
+    "path-root-regex": {
+      "version": "0.1.2",
+      "resolved": "https://registry.npmjs.org/path-root-regex/-/path-root-regex-0.1.2.tgz",
+      "integrity": "sha512-4GlJ6rZDhQZFE0DPVKh0e9jmZ5egZfxTkp7bcRDuPlJXbAwhxcl2dINPUAsjLdejqaLsCeg8axcLjIbvBjN4pQ==",
+      "dev": true
+    },
+    "path-to-regexp": {
+      "version": "0.1.7",
+      "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz",
+      "integrity": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==",
+      "dev": true
+    },
+    "path-type": {
+      "version": "4.0.0",
+      "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz",
+      "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==",
+      "dev": true
+    },
+    "pathval": {
+      "version": "1.1.1",
+      "resolved": "https://registry.npmjs.org/pathval/-/pathval-1.1.1.tgz",
+      "integrity": "sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==",
+      "dev": true
+    },
+    "pause-stream": {
+      "version": "0.0.11",
+      "resolved": "https://registry.npmjs.org/pause-stream/-/pause-stream-0.0.11.tgz",
+      "integrity": "sha512-e3FBlXLmN/D1S+zHzanP4E/4Z60oFAa3O051qt1pxa7DEJWKAyil6upYVXCWadEnuoqa4Pkc9oUx9zsxYeRv8A==",
       "dev": true,
       "requires": {
       "dev": true,
       "requires": {
-        "balanced-match": "^1.0.0",
-        "postcss": "^7.0.2"
-      },
-      "dependencies": {
-        "picocolors": {
-          "version": "0.2.1",
-          "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz",
-          "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==",
-          "dev": true
-        },
-        "postcss": {
-          "version": "7.0.39",
-          "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz",
-          "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==",
-          "dev": true,
-          "requires": {
-            "picocolors": "^0.2.1",
-            "source-map": "^0.6.1"
-          }
-        },
-        "source-map": {
-          "version": "0.6.1",
-          "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
-          "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
-          "dev": true
-        }
+        "through": "~2.3"
       }
     },
       }
     },
-    "postcss-selector-parser": {
-      "version": "6.0.10",
-      "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.10.tgz",
-      "integrity": "sha512-IQ7TZdoaqbT+LCpShg46jnZVlhWD2w6iQYAcYXfHARZ7X1t/UGhhceQDs5X0cGqKvYlHNOuv7Oa1xmb0oQuA3w==",
+    "pbkdf2": {
+      "version": "3.1.2",
+      "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.1.2.tgz",
+      "integrity": "sha512-iuh7L6jA7JEGu2WxDwtQP1ddOpaJNC4KlDEFfdQajSGgGPNi4OyDc2R7QnbY2bR9QjBVGwgvTdNJZoE7RaxUMA==",
       "dev": true,
       "requires": {
       "dev": true,
       "requires": {
-        "cssesc": "^3.0.0",
-        "util-deprecate": "^1.0.2"
+        "create-hash": "^1.1.2",
+        "create-hmac": "^1.1.4",
+        "ripemd160": "^2.0.1",
+        "safe-buffer": "^5.0.1",
+        "sha.js": "^2.4.8"
       }
     },
       }
     },
-    "postcss-sorting": {
-      "version": "5.0.1",
-      "resolved": "https://registry.npmjs.org/postcss-sorting/-/postcss-sorting-5.0.1.tgz",
-      "integrity": "sha512-Y9fUFkIhfrm6i0Ta3n+89j56EFqaNRdUKqXyRp6kvTcSXnmgEjaVowCXH+JBe9+YKWqd4nc28r2sgwnzJalccA==",
+    "pdfjs-dist": {
+      "version": "2.16.105",
+      "resolved": "https://registry.npmjs.org/pdfjs-dist/-/pdfjs-dist-2.16.105.tgz",
+      "integrity": "sha512-J4dn41spsAwUxCpEoVf6GVoz908IAA3mYiLmNxg8J9kfRXc2jxpbUepcP0ocp0alVNLFthTAM8DZ1RaHh8sU0A==",
       "dev": true,
       "requires": {
       "dev": true,
       "requires": {
-        "lodash": "^4.17.14",
-        "postcss": "^7.0.17"
+        "dommatrix": "^1.0.3",
+        "web-streams-polyfill": "^3.2.1"
       },
       "dependencies": {
       },
       "dependencies": {
-        "picocolors": {
-          "version": "0.2.1",
-          "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz",
-          "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==",
-          "dev": true
-        },
-        "postcss": {
-          "version": "7.0.39",
-          "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz",
-          "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==",
-          "dev": true,
-          "requires": {
-            "picocolors": "^0.2.1",
-            "source-map": "^0.6.1"
-          }
-        },
-        "source-map": {
-          "version": "0.6.1",
-          "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
-          "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+        "web-streams-polyfill": {
+          "version": "3.2.1",
+          "resolved": "https://registry.npmjs.org/web-streams-polyfill/-/web-streams-polyfill-3.2.1.tgz",
+          "integrity": "sha512-e0MO3wdXWKrLbL0DgGnUV7WHVuw9OUvL4hjgnPkIeEvESk74gAITi5G606JtZPp39cd8HA9VQzCIvA49LpPN5Q==",
           "dev": true
         }
       }
     },
           "dev": true
         }
       }
     },
-    "postcss-svgo": {
-      "version": "5.1.0",
-      "resolved": "https://registry.npmjs.org/postcss-svgo/-/postcss-svgo-5.1.0.tgz",
-      "integrity": "sha512-D75KsH1zm5ZrHyxPakAxJWtkyXew5qwS70v56exwvw542d9CRtTo78K0WeFxZB4G7JXKKMbEZtZayTGdIky/eA==",
+    "pdfmake": {
+      "version": "0.2.7",
+      "resolved": "https://registry.npmjs.org/pdfmake/-/pdfmake-0.2.7.tgz",
+      "integrity": "sha512-ClLpgx30H5G3EDvRW1MrA1Xih6YxEaSgIVFrOyBMgAAt62V+hxsyWAi6JNP7u1Fc5JKYAbpb4RRVw8Rhvmz5cQ==",
       "dev": true,
       "requires": {
       "dev": true,
       "requires": {
-        "postcss-value-parser": "^4.2.0",
-        "svgo": "^2.7.0"
+        "@foliojs-fork/linebreak": "^1.1.1",
+        "@foliojs-fork/pdfkit": "^0.13.0",
+        "iconv-lite": "^0.6.3",
+        "xmldoc": "^1.1.2"
+      },
+      "dependencies": {
+        "iconv-lite": {
+          "version": "0.6.3",
+          "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz",
+          "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==",
+          "dev": true,
+          "requires": {
+            "safer-buffer": ">= 2.1.2 < 3.0.0"
+          }
+        }
       }
     },
       }
     },
-    "postcss-syntax": {
-      "version": "0.36.2",
-      "resolved": "https://registry.npmjs.org/postcss-syntax/-/postcss-syntax-0.36.2.tgz",
-      "integrity": "sha512-nBRg/i7E3SOHWxF3PpF5WnJM/jQ1YpY9000OaVXlAQj6Zp/kIqJxEDWIZ67tAd7NLuk7zqN4yqe9nc0oNAOs1w==",
+    "pend": {
+      "version": "1.2.0",
+      "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz",
+      "integrity": "sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==",
       "dev": true
     },
       "dev": true
     },
-    "postcss-unique-selectors": {
-      "version": "5.1.1",
-      "resolved": "https://registry.npmjs.org/postcss-unique-selectors/-/postcss-unique-selectors-5.1.1.tgz",
-      "integrity": "sha512-5JiODlELrz8L2HwxfPnhOWZYWDxVHWL83ufOv84NrcgipI7TaeRsatAhK4Tr2/ZiYldpK/wBvw5BD3qfaK96GA==",
-      "dev": true,
-      "requires": {
-        "postcss-selector-parser": "^6.0.5"
-      }
-    },
-    "postcss-value-parser": {
-      "version": "4.2.0",
-      "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz",
-      "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==",
+    "performance-now": {
+      "version": "2.1.0",
+      "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz",
+      "integrity": "sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow==",
       "dev": true
     },
       "dev": true
     },
-    "postcss-values-parser": {
-      "version": "2.0.1",
-      "resolved": "https://registry.npmjs.org/postcss-values-parser/-/postcss-values-parser-2.0.1.tgz",
-      "integrity": "sha512-2tLuBsA6P4rYTNKCXYG/71C7j1pU6pK503suYOmn4xYrQIzW+opD+7FAFNuGSdZC/3Qfy334QbeMu7MEb8gOxg==",
-      "dev": true,
-      "requires": {
-        "flatten": "^1.0.2",
-        "indexes-of": "^1.0.1",
-        "uniq": "^1.0.1"
-      }
-    },
-    "preceptor-core": {
-      "version": "0.10.1",
-      "resolved": "https://registry.npmjs.org/preceptor-core/-/preceptor-core-0.10.1.tgz",
-      "integrity": "sha512-WLDk+UowEESixvlhiamGOj/iqWrp8IWeCCHvBZrLh0g4/A1Fa77fDQWqQUd5S5rScT+9u49aDfa45xYRkxqmiA==",
-      "dev": true,
-      "requires": {
-        "log4js": "1.1.1",
-        "underscore": "1.7.0"
-      }
+    "picocolors": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz",
+      "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ=="
     },
     },
-    "prelude-ls": {
-      "version": "1.1.2",
-      "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz",
-      "integrity": "sha512-ESF23V4SKG6lVSGZgYNpbsiaAkdab6ZgOxe52p7+Kid3W3u3bxR4Vfd/o21dmN7jSt0IwgZ4v5MUd26FEtXE9w==",
+    "picomatch": {
+      "version": "2.3.1",
+      "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz",
+      "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==",
       "dev": true
     },
       "dev": true
     },
-    "prettier": {
-      "version": "2.1.2",
-      "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.1.2.tgz",
-      "integrity": "sha512-16c7K+x4qVlJg9rEbXl7HEGmQyZlG4R9AgP+oHKRMsMsuk8s+ATStlf1NpDqyBI1HpVyfjLOeMhH2LvuNvV5Vg==",
+    "pidtree": {
+      "version": "0.3.1",
+      "resolved": "https://registry.npmjs.org/pidtree/-/pidtree-0.3.1.tgz",
+      "integrity": "sha512-qQbW94hLHEqCg7nhby4yRC7G2+jYHY4Rguc2bjw7Uug4GIJuu1tvf2uHaZv5Q8zdt+WKJ6qK1FOI6amaWUo5FA==",
       "dev": true
     },
       "dev": true
     },
-    "pretty-bytes": {
-      "version": "5.6.0",
-      "resolved": "https://registry.npmjs.org/pretty-bytes/-/pretty-bytes-5.6.0.tgz",
-      "integrity": "sha512-FFw039TmrBqFK8ma/7OL3sDz/VytdtJr044/QUJtH0wK9lb9jLq9tJyIxUwtQJHwar2BqtiA4iCWSwo9JLkzFg==",
+    "pify": {
+      "version": "4.0.1",
+      "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz",
+      "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==",
+      "dev": true,
+      "optional": true
+    },
+    "pirates": {
+      "version": "4.0.5",
+      "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.5.tgz",
+      "integrity": "sha512-8V9+HQPupnaXMA23c5hvl69zXvTwTzyAYasnkb0Tts4XvO4CliqONMOnvlq26rkhLC3nWDFBJf73LU1e1VZLaQ==",
       "dev": true
     },
       "dev": true
     },
-    "pretty-format": {
-      "version": "25.5.0",
-      "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-25.5.0.tgz",
-      "integrity": "sha512-kbo/kq2LQ/A/is0PQwsEHM7Ca6//bGPPvU6UnsdDRSKTWxT/ru/xb88v4BJf6a69H+uTytOEsTusT9ksd/1iWQ==",
+    "piscina": {
+      "version": "3.2.0",
+      "resolved": "https://registry.npmjs.org/piscina/-/piscina-3.2.0.tgz",
+      "integrity": "sha512-yn/jMdHRw+q2ZJhFhyqsmANcbF6V2QwmD84c6xRau+QpQOmtrBCoRGdvTfeuFDYXB5W2m6MfLkjkvQa9lUSmIA==",
       "dev": true,
       "requires": {
       "dev": true,
       "requires": {
-        "@jest/types": "^25.5.0",
-        "ansi-regex": "^5.0.0",
-        "ansi-styles": "^4.0.0",
-        "react-is": "^16.12.0"
-      },
-      "dependencies": {
-        "ansi-styles": {
-          "version": "4.3.0",
-          "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
-          "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
-          "dev": true,
-          "requires": {
-            "color-convert": "^2.0.1"
-          }
-        },
-        "color-convert": {
-          "version": "2.0.1",
-          "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
-          "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
-          "dev": true,
-          "requires": {
-            "color-name": "~1.1.4"
-          }
-        },
-        "color-name": {
-          "version": "1.1.4",
-          "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
-          "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
-          "dev": true
-        }
+        "eventemitter-asyncresource": "^1.0.0",
+        "hdr-histogram-js": "^2.0.1",
+        "hdr-histogram-percentiles-obj": "^3.0.0",
+        "nice-napi": "^1.0.2"
       }
     },
       }
     },
-    "pretty-quick": {
-      "version": "3.0.2",
-      "resolved": "https://registry.npmjs.org/pretty-quick/-/pretty-quick-3.0.2.tgz",
-      "integrity": "sha512-4rWOs/Ifdkg7G/YX7Xbco4jZkuXPx445KdhuMI6REnl3nXRDb9+zysb29c76R59jsJzcnkcpAaGi8D/RjAVfSQ==",
+    "pkg-dir": {
+      "version": "4.2.0",
+      "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz",
+      "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==",
       "dev": true,
       "requires": {
       "dev": true,
       "requires": {
-        "chalk": "^3.0.0",
-        "execa": "^4.0.0",
-        "find-up": "^4.1.0",
-        "ignore": "^5.1.4",
-        "mri": "^1.1.5",
-        "multimatch": "^4.0.0"
-      },
-      "dependencies": {
-        "ansi-styles": {
-          "version": "4.3.0",
-          "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
-          "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
-          "dev": true,
-          "requires": {
-            "color-convert": "^2.0.1"
-          }
-        },
-        "chalk": {
-          "version": "3.0.0",
-          "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz",
-          "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==",
-          "dev": true,
-          "requires": {
-            "ansi-styles": "^4.1.0",
-            "supports-color": "^7.1.0"
-          }
-        },
-        "color-convert": {
-          "version": "2.0.1",
-          "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
-          "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
-          "dev": true,
-          "requires": {
-            "color-name": "~1.1.4"
-          }
-        },
-        "color-name": {
-          "version": "1.1.4",
-          "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
-          "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
-          "dev": true
-        },
-        "cross-spawn": {
-          "version": "7.0.3",
-          "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz",
-          "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==",
-          "dev": true,
-          "requires": {
-            "path-key": "^3.1.0",
-            "shebang-command": "^2.0.0",
-            "which": "^2.0.1"
-          }
-        },
-        "execa": {
-          "version": "4.1.0",
-          "resolved": "https://registry.npmjs.org/execa/-/execa-4.1.0.tgz",
-          "integrity": "sha512-j5W0//W7f8UxAn8hXVnwG8tLwdiUy4FJLcSupCg6maBYZDpyBvTApK7KyuI4bKj8KOh1r2YH+6ucuYtJv1bTZA==",
-          "dev": true,
-          "requires": {
-            "cross-spawn": "^7.0.0",
-            "get-stream": "^5.0.0",
-            "human-signals": "^1.1.1",
-            "is-stream": "^2.0.0",
-            "merge-stream": "^2.0.0",
-            "npm-run-path": "^4.0.0",
-            "onetime": "^5.1.0",
-            "signal-exit": "^3.0.2",
-            "strip-final-newline": "^2.0.0"
-          }
-        },
-        "get-stream": {
-          "version": "5.2.0",
-          "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz",
-          "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==",
-          "dev": true,
-          "requires": {
-            "pump": "^3.0.0"
-          }
-        },
-        "has-flag": {
-          "version": "4.0.0",
-          "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
-          "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
-          "dev": true
-        },
-        "is-stream": {
-          "version": "2.0.1",
-          "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz",
-          "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==",
-          "dev": true
-        },
-        "npm-run-path": {
-          "version": "4.0.1",
-          "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz",
-          "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==",
-          "dev": true,
-          "requires": {
-            "path-key": "^3.0.0"
-          }
-        },
-        "path-key": {
-          "version": "3.1.1",
-          "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz",
-          "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==",
-          "dev": true
-        },
-        "shebang-command": {
-          "version": "2.0.0",
-          "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz",
-          "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==",
-          "dev": true,
-          "requires": {
-            "shebang-regex": "^3.0.0"
-          }
-        },
-        "shebang-regex": {
-          "version": "3.0.0",
-          "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz",
-          "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==",
+        "find-up": "^4.0.0"
+      }
+    },
+    "pn": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npmjs.org/pn/-/pn-1.1.0.tgz",
+      "integrity": "sha512-2qHaIQr2VLRFoxe2nASzsV6ef4yOOH+Fi9FBOVH6cqeSgUnoyySPZkxzLuzd+RYOQTRpROA0ztTMqxROKSb/nA==",
+      "dev": true
+    },
+    "png-async": {
+      "version": "0.9.4",
+      "resolved": "https://registry.npmjs.org/png-async/-/png-async-0.9.4.tgz",
+      "integrity": "sha512-B//AXX9TkneKfgtOpT1mdUnnhk2BImGD+a98vImsMU8uo1dBeHyW/kM2erWZ/CsYteTPU/xKG+t6T62heHkC3A==",
+      "dev": true
+    },
+    "png-js": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/png-js/-/png-js-1.0.0.tgz",
+      "integrity": "sha512-k+YsbhpA9e+EFfKjTCH3VW6aoKlyNYI6NYdTfDL4CIvFnvsuO84ttonmZE7rc+v23SLTH8XX+5w/Ak9v0xGY4g==",
+      "dev": true
+    },
+    "pngjs": {
+      "version": "2.3.1",
+      "resolved": "https://registry.npmjs.org/pngjs/-/pngjs-2.3.1.tgz",
+      "integrity": "sha512-ITNPqvx+SSssNFOgHQzGG87HrqQ0g2nMSHc1jjU5Piq9xJEJ40fiFEPz0S5HSSXxBHrTnhaBHIayTO5aRfk2vw==",
+      "dev": true
+    },
+    "pngjs-image": {
+      "version": "0.11.7",
+      "resolved": "https://registry.npmjs.org/pngjs-image/-/pngjs-image-0.11.7.tgz",
+      "integrity": "sha512-JRyrmT+HXa1/gvdHpebus8TGqKa8WRgcsHz/DDalxRsMhvu6AOA99/enBFjZIPvmXVAzwKR051s80TuE1IiCpg==",
+      "dev": true,
+      "requires": {
+        "iconv-lite": "^0.4.8",
+        "pako": "^0.2.6",
+        "pngjs": "2.3.1",
+        "request": "^2.55.0",
+        "stream-buffers": "1.0.1",
+        "underscore": "1.7.0"
+      },
+      "dependencies": {
+        "pako": {
+          "version": "0.2.9",
+          "resolved": "https://registry.npmjs.org/pako/-/pako-0.2.9.tgz",
+          "integrity": "sha512-NUcwaKxUxWrZLpDG+z/xZaCgQITkA/Dv4V/T6bw7VON6l1Xz/VnrBqrYjZQ12TamKHzITTfOEIYUj48y2KXImA==",
           "dev": true
           "dev": true
-        },
-        "supports-color": {
-          "version": "7.2.0",
-          "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
-          "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
+        }
+      }
+    },
+    "portfinder": {
+      "version": "1.0.32",
+      "resolved": "https://registry.npmjs.org/portfinder/-/portfinder-1.0.32.tgz",
+      "integrity": "sha512-on2ZJVVDXRADWE6jnQaX0ioEylzgBpQk8r55NE4wjXW1ZxO+BgDlY6DXwj20i0V8eB4SenDQ00WEaxfiIQPcxg==",
+      "dev": true,
+      "requires": {
+        "async": "^2.6.4",
+        "debug": "^3.2.7",
+        "mkdirp": "^0.5.6"
+      },
+      "dependencies": {
+        "debug": {
+          "version": "3.2.7",
+          "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz",
+          "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==",
           "dev": true,
           "requires": {
           "dev": true,
           "requires": {
-            "has-flag": "^4.0.0"
+            "ms": "^2.1.1"
           }
         },
           }
         },
-        "which": {
-          "version": "2.0.2",
-          "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz",
-          "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==",
+        "mkdirp": {
+          "version": "0.5.6",
+          "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz",
+          "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==",
           "dev": true,
           "requires": {
           "dev": true,
           "requires": {
-            "isexe": "^2.0.0"
+            "minimist": "^1.2.6"
           }
         }
       }
     },
           }
         }
       }
     },
-    "prismjs": {
-      "version": "1.28.0",
-      "resolved": "https://registry.npmjs.org/prismjs/-/prismjs-1.28.0.tgz",
-      "integrity": "sha512-8aaXdYvl1F7iC7Xm1spqSaY/OJBpYW3v+KJ+F17iYxvdc8sfjW194COK5wVhMZX45tGteiBQgdvD/nhxcRwylw=="
-    },
-    "process": {
-      "version": "0.11.10",
-      "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz",
-      "integrity": "sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==",
+    "posix-character-classes": {
+      "version": "0.1.1",
+      "resolved": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz",
+      "integrity": "sha512-xTgYBc3fuo7Yt7JbiuFxSYGToMoz8fLoE6TC9Wx1P/u+LfeThMOAqmuyECnlBaaJb+u1m9hHiXUEtwW4OzfUJg==",
       "dev": true
     },
       "dev": true
     },
-    "process-nextick-args": {
-      "version": "2.0.1",
-      "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz",
-      "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==",
-      "dev": true
+    "postcss": {
+      "version": "8.4.5",
+      "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.5.tgz",
+      "integrity": "sha512-jBDboWM8qpaqwkMwItqTQTiFikhs/67OYVvblFFTM7MrZjt6yMKd6r2kgXizEbTTljacm4NldIlZnhbjr84QYg==",
+      "dev": true,
+      "requires": {
+        "nanoid": "^3.1.30",
+        "picocolors": "^1.0.0",
+        "source-map-js": "^1.0.1"
+      }
     },
     },
-    "progress": {
-      "version": "2.0.3",
-      "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz",
-      "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==",
-      "dev": true
+    "postcss-attribute-case-insensitive": {
+      "version": "5.0.2",
+      "resolved": "https://registry.npmjs.org/postcss-attribute-case-insensitive/-/postcss-attribute-case-insensitive-5.0.2.tgz",
+      "integrity": "sha512-XIidXV8fDr0kKt28vqki84fRK8VW8eTuIa4PChv2MqKuT6C9UjmSKzen6KaWhWEoYvwxFCa7n/tC1SZ3tyq4SQ==",
+      "dev": true,
+      "requires": {
+        "postcss-selector-parser": "^6.0.10"
+      }
     },
     },
-    "promise": {
-      "version": "6.0.0",
-      "resolved": "https://registry.npmjs.org/promise/-/promise-6.0.0.tgz",
-      "integrity": "sha512-PjIqIEWR8EWwP5ml3Wf5KWIP3sIdXAew9vQ6vLOLV+z4LMa/8ZQyLd7sTWe2r8OuA8A9jsIYptDfbEn/L36ogw==",
+    "postcss-color-functional-notation": {
+      "version": "4.2.4",
+      "resolved": "https://registry.npmjs.org/postcss-color-functional-notation/-/postcss-color-functional-notation-4.2.4.tgz",
+      "integrity": "sha512-2yrTAUZUab9s6CpxkxC4rVgFEVaR6/2Pipvi6qcgvnYiVqZcbDHEoBDhrXzyb7Efh2CCfHQNtcqWcIruDTIUeg==",
       "dev": true,
       "requires": {
       "dev": true,
       "requires": {
-        "asap": "~1.0.0"
+        "postcss-value-parser": "^4.2.0"
       }
     },
       }
     },
-    "promise-inflight": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/promise-inflight/-/promise-inflight-1.0.1.tgz",
-      "integrity": "sha512-6zWPyEOFaQBJYcGMHBKTKJ3u6TBsnMFOIZSa6ce1e/ZrrsOlnHRHbabMjLiBYKp+n44X9eUI6VUPaukCXHuG4g==",
-      "dev": true
+    "postcss-color-hex-alpha": {
+      "version": "8.0.4",
+      "resolved": "https://registry.npmjs.org/postcss-color-hex-alpha/-/postcss-color-hex-alpha-8.0.4.tgz",
+      "integrity": "sha512-nLo2DCRC9eE4w2JmuKgVA3fGL3d01kGq752pVALF68qpGLmx2Qrk91QTKkdUqqp45T1K1XV8IhQpcu1hoAQflQ==",
+      "dev": true,
+      "requires": {
+        "postcss-value-parser": "^4.2.0"
+      }
     },
     },
-    "promise-retry": {
-      "version": "2.0.1",
-      "resolved": "https://registry.npmjs.org/promise-retry/-/promise-retry-2.0.1.tgz",
-      "integrity": "sha512-y+WKFlBR8BGXnsNlIHFGPZmyDf3DFMoLhaflAnyZgV6rG6xu+JwesTo2Q9R6XwYmtmwAFCkAk3e35jEdoeh/3g==",
+    "postcss-color-rebeccapurple": {
+      "version": "7.1.1",
+      "resolved": "https://registry.npmjs.org/postcss-color-rebeccapurple/-/postcss-color-rebeccapurple-7.1.1.tgz",
+      "integrity": "sha512-pGxkuVEInwLHgkNxUc4sdg4g3py7zUeCQ9sMfwyHAT+Ezk8a4OaaVZ8lIY5+oNqA/BXXgLyXv0+5wHP68R79hg==",
       "dev": true,
       "requires": {
       "dev": true,
       "requires": {
-        "err-code": "^2.0.2",
-        "retry": "^0.12.0"
+        "postcss-value-parser": "^4.2.0"
       }
     },
       }
     },
-    "prompts": {
-      "version": "2.4.2",
-      "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz",
-      "integrity": "sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==",
+    "postcss-custom-media": {
+      "version": "8.0.2",
+      "resolved": "https://registry.npmjs.org/postcss-custom-media/-/postcss-custom-media-8.0.2.tgz",
+      "integrity": "sha512-7yi25vDAoHAkbhAzX9dHx2yc6ntS4jQvejrNcC+csQJAXjj15e7VcWfMgLqBNAbOvqi5uIa9huOVwdHbf+sKqg==",
       "dev": true,
       "requires": {
       "dev": true,
       "requires": {
-        "kleur": "^3.0.3",
-        "sisteransi": "^1.0.5"
+        "postcss-value-parser": "^4.2.0"
       }
     },
       }
     },
-    "prop-types": {
-      "version": "15.8.1",
-      "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz",
-      "integrity": "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==",
+    "postcss-custom-properties": {
+      "version": "12.1.11",
+      "resolved": "https://registry.npmjs.org/postcss-custom-properties/-/postcss-custom-properties-12.1.11.tgz",
+      "integrity": "sha512-0IDJYhgU8xDv1KY6+VgUwuQkVtmYzRwu+dMjnmdMafXYv86SWqfxkc7qdDvWS38vsjaEtv8e0vGOUQrAiMBLpQ==",
+      "dev": true,
       "requires": {
       "requires": {
-        "loose-envify": "^1.4.0",
-        "object-assign": "^4.1.1",
-        "react-is": "^16.13.1"
+        "postcss-value-parser": "^4.2.0"
       }
     },
       }
     },
-    "property-information": {
-      "version": "5.6.0",
-      "resolved": "https://registry.npmjs.org/property-information/-/property-information-5.6.0.tgz",
-      "integrity": "sha512-YUHSPk+A30YPv+0Qf8i9Mbfe/C0hdPXk1s1jPVToV8pk8BQtpw10ct89Eo7OWkutrwqvT0eicAxlOg3dOAu8JA==",
+    "postcss-custom-selectors": {
+      "version": "6.0.3",
+      "resolved": "https://registry.npmjs.org/postcss-custom-selectors/-/postcss-custom-selectors-6.0.3.tgz",
+      "integrity": "sha512-fgVkmyiWDwmD3JbpCmB45SvvlCD6z9CG6Ie6Iere22W5aHea6oWa7EM2bpnv2Fj3I94L3VbtvX9KqwSi5aFzSg==",
+      "dev": true,
       "requires": {
       "requires": {
-        "xtend": "^4.0.0"
+        "postcss-selector-parser": "^6.0.4"
       }
     },
       }
     },
-    "protobufjs": {
-      "version": "6.11.3",
-      "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-6.11.3.tgz",
-      "integrity": "sha512-xL96WDdCZYdU7Slin569tFX712BxsxslWwAfAhCYjQKGTq7dAU91Lomy6nLLhh/dyGhk/YH4TwTSRxTzhuHyZg==",
+    "postcss-dir-pseudo-class": {
+      "version": "6.0.5",
+      "resolved": "https://registry.npmjs.org/postcss-dir-pseudo-class/-/postcss-dir-pseudo-class-6.0.5.tgz",
+      "integrity": "sha512-eqn4m70P031PF7ZQIvSgy9RSJ5uI2171O/OO/zcRNYpJbvaeKFUlar1aJ7rmgiQtbm0FSPsRewjpdS0Oew7MPA==",
       "dev": true,
       "requires": {
       "dev": true,
       "requires": {
-        "@protobufjs/aspromise": "^1.1.2",
-        "@protobufjs/base64": "^1.1.2",
-        "@protobufjs/codegen": "^2.0.4",
-        "@protobufjs/eventemitter": "^1.1.0",
-        "@protobufjs/fetch": "^1.1.0",
-        "@protobufjs/float": "^1.0.2",
-        "@protobufjs/inquire": "^1.1.0",
-        "@protobufjs/path": "^1.1.2",
-        "@protobufjs/pool": "^1.1.0",
-        "@protobufjs/utf8": "^1.1.0",
-        "@types/long": "^4.0.1",
-        "@types/node": ">=13.7.0",
-        "long": "^4.0.0"
-      },
-      "dependencies": {
-        "@types/node": {
-          "version": "18.7.9",
-          "resolved": "https://registry.npmjs.org/@types/node/-/node-18.7.9.tgz",
-          "integrity": "sha512-0N5Y1XAdcl865nDdjbO0m3T6FdmQ4ijE89/urOHLREyTXbpMWbSafx9y7XIsgWGtwUP2iYTinLyyW3FatAxBLQ==",
-          "dev": true
-        }
+        "postcss-selector-parser": "^6.0.10"
       }
     },
       }
     },
-    "proxy-addr": {
-      "version": "2.0.7",
-      "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz",
-      "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==",
+    "postcss-double-position-gradients": {
+      "version": "3.1.2",
+      "resolved": "https://registry.npmjs.org/postcss-double-position-gradients/-/postcss-double-position-gradients-3.1.2.tgz",
+      "integrity": "sha512-GX+FuE/uBR6eskOK+4vkXgT6pDkexLokPaz/AbJna9s5Kzp/yl488pKPjhy0obB475ovfT1Wv8ho7U/cHNaRgQ==",
       "dev": true,
       "requires": {
       "dev": true,
       "requires": {
-        "forwarded": "0.2.0",
-        "ipaddr.js": "1.9.1"
+        "@csstools/postcss-progressive-custom-properties": "^1.1.0",
+        "postcss-value-parser": "^4.2.0"
       }
     },
       }
     },
-    "proxy-from-env": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.0.0.tgz",
-      "integrity": "sha512-F2JHgJQ1iqwnHDcQjVBsq3n/uoaFL+iPW/eAeL7kVxy/2RrWaN4WroKjjvbsoRtv0ftelNyC01bjRhn/bhcf4A==",
-      "dev": true
+    "postcss-env-function": {
+      "version": "4.0.6",
+      "resolved": "https://registry.npmjs.org/postcss-env-function/-/postcss-env-function-4.0.6.tgz",
+      "integrity": "sha512-kpA6FsLra+NqcFnL81TnsU+Z7orGtDTxcOhl6pwXeEq1yFPpRMkCDpHhrz8CFQDr/Wfm0jLiNQ1OsGGPjlqPwA==",
+      "dev": true,
+      "requires": {
+        "postcss-value-parser": "^4.2.0"
+      }
     },
     },
-    "proxy-middleware": {
-      "version": "0.15.0",
-      "resolved": "https://registry.npmjs.org/proxy-middleware/-/proxy-middleware-0.15.0.tgz",
-      "integrity": "sha512-EGCG8SeoIRVMhsqHQUdDigB2i7qU7fCsWASwn54+nPutYO8n4q6EiwMzyfWlC+dzRFExP+kvcnDFdBDHoZBU7Q==",
+    "postcss-focus-visible": {
+      "version": "6.0.4",
+      "resolved": "https://registry.npmjs.org/postcss-focus-visible/-/postcss-focus-visible-6.0.4.tgz",
+      "integrity": "sha512-QcKuUU/dgNsstIK6HELFRT5Y3lbrMLEOwG+A4s5cA+fx3A3y/JTq3X9LaOj3OC3ALH0XqyrgQIgey/MIZ8Wczw==",
+      "dev": true,
+      "requires": {
+        "postcss-selector-parser": "^6.0.9"
+      }
+    },
+    "postcss-focus-within": {
+      "version": "5.0.4",
+      "resolved": "https://registry.npmjs.org/postcss-focus-within/-/postcss-focus-within-5.0.4.tgz",
+      "integrity": "sha512-vvjDN++C0mu8jz4af5d52CB184ogg/sSxAFS+oUJQq2SuCe7T5U2iIsVJtsCp2d6R4j0jr5+q3rPkBVZkXD9fQ==",
+      "dev": true,
+      "requires": {
+        "postcss-selector-parser": "^6.0.9"
+      }
+    },
+    "postcss-font-variant": {
+      "version": "5.0.0",
+      "resolved": "https://registry.npmjs.org/postcss-font-variant/-/postcss-font-variant-5.0.0.tgz",
+      "integrity": "sha512-1fmkBaCALD72CK2a9i468mA/+tr9/1cBxRRMXOUaZqO43oWPR5imcyPjXwuv7PXbCid4ndlP5zWhidQVVa3hmA==",
       "dev": true
     },
       "dev": true
     },
-    "prr": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz",
-      "integrity": "sha512-yPw4Sng1gWghHQWj0B3ZggWUm4qVbPwPFcRG8KyxiU7J2OHFSoEHKS+EZ3fv5l1t9CyCiop6l/ZYeWbrgoQejw==",
+    "postcss-gap-properties": {
+      "version": "3.0.5",
+      "resolved": "https://registry.npmjs.org/postcss-gap-properties/-/postcss-gap-properties-3.0.5.tgz",
+      "integrity": "sha512-IuE6gKSdoUNcvkGIqdtjtcMtZIFyXZhmFd5RUlg97iVEvp1BZKV5ngsAjCjrVy+14uhGBQl9tzmi1Qwq4kqVOg==",
       "dev": true
     },
       "dev": true
     },
-    "ps-tree": {
-      "version": "1.2.0",
-      "resolved": "https://registry.npmjs.org/ps-tree/-/ps-tree-1.2.0.tgz",
-      "integrity": "sha512-0VnamPPYHl4uaU/nSFeZZpR21QAWRz+sRv4iW9+v/GS/J5U5iZB5BNN6J0RMoOvdx2gWM2+ZFMIm58q24e4UYA==",
+    "postcss-html": {
+      "version": "0.36.0",
+      "resolved": "https://registry.npmjs.org/postcss-html/-/postcss-html-0.36.0.tgz",
+      "integrity": "sha512-HeiOxGcuwID0AFsNAL0ox3mW6MHH5cstWN1Z3Y+n6H+g12ih7LHdYxWwEA/QmrebctLjo79xz9ouK3MroHwOJw==",
       "dev": true,
       "requires": {
       "dev": true,
       "requires": {
-        "event-stream": "=3.3.4"
+        "htmlparser2": "^3.10.0"
       },
       "dependencies": {
       },
       "dependencies": {
-        "event-stream": {
-          "version": "3.3.4",
-          "resolved": "https://registry.npmjs.org/event-stream/-/event-stream-3.3.4.tgz",
-          "integrity": "sha512-QHpkERcGsR0T7Qm3HNJSyXKEEj8AHNxkY3PK8TS2KJvQ7NiSHe3DDpwVKKtoYprL/AreyzFBeIkBIWChAqn60g==",
+        "dom-serializer": {
+          "version": "0.2.2",
+          "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.2.2.tgz",
+          "integrity": "sha512-2/xPb3ORsQ42nHYiSunXkDjPLBaEj/xTwUO4B7XCZQTRk7EBtTOPaygh10YAAh2OI1Qrp6NWfpAhzswj0ydt9g==",
+          "dev": true,
+          "requires": {
+            "domelementtype": "^2.0.1",
+            "entities": "^2.0.0"
+          },
+          "dependencies": {
+            "domelementtype": {
+              "version": "2.3.0",
+              "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz",
+              "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==",
+              "dev": true
+            },
+            "entities": {
+              "version": "2.2.0",
+              "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz",
+              "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==",
+              "dev": true
+            }
+          }
+        },
+        "domelementtype": {
+          "version": "1.3.1",
+          "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.1.tgz",
+          "integrity": "sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w==",
+          "dev": true
+        },
+        "domhandler": {
+          "version": "2.4.2",
+          "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-2.4.2.tgz",
+          "integrity": "sha512-JiK04h0Ht5u/80fdLMCEmV4zkNh2BcoMFBmZ/91WtYZ8qVXSKjiw7fXMgFPnHcSZgOo3XdinHvmnDUeMf5R4wA==",
           "dev": true,
           "requires": {
           "dev": true,
           "requires": {
-            "duplexer": "~0.1.1",
-            "from": "~0",
-            "map-stream": "~0.1.0",
-            "pause-stream": "0.0.11",
-            "split": "0.3",
-            "stream-combiner": "~0.0.4",
-            "through": "~2.3.1"
+            "domelementtype": "1"
           }
         },
           }
         },
-        "map-stream": {
-          "version": "0.1.0",
-          "resolved": "https://registry.npmjs.org/map-stream/-/map-stream-0.1.0.tgz",
-          "integrity": "sha512-CkYQrPYZfWnu/DAmVCpTSX/xHpKZ80eKh2lAkyA6AJTef6bW+6JpbQZN5rofum7da+SyN1bi5ctTm+lTfcCW3g==",
+        "domutils": {
+          "version": "1.7.0",
+          "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.7.0.tgz",
+          "integrity": "sha512-Lgd2XcJ/NjEw+7tFvfKxOzCYKZsdct5lczQ2ZaQY8Djz7pfAD3Gbp8ySJWtreII/vDlMVmxwa6pHmdxIYgttDg==",
+          "dev": true,
+          "requires": {
+            "dom-serializer": "0",
+            "domelementtype": "1"
+          }
+        },
+        "entities": {
+          "version": "1.1.2",
+          "resolved": "https://registry.npmjs.org/entities/-/entities-1.1.2.tgz",
+          "integrity": "sha512-f2LZMYl1Fzu7YSBKg+RoROelpOaNrcGmE9AZubeDfrCEia483oW4MI4VyFd5VNHIgQ/7qm1I0wUHK1eJnn2y2w==",
           "dev": true
         },
           "dev": true
         },
-        "split": {
-          "version": "0.3.3",
-          "resolved": "https://registry.npmjs.org/split/-/split-0.3.3.tgz",
-          "integrity": "sha512-wD2AeVmxXRBoX44wAycgjVpMhvbwdI2aZjCkvfNcH1YqHQvJVa1duWc73OyVGJUc05fhFaTZeQ/PYsrmyH0JVA==",
+        "htmlparser2": {
+          "version": "3.10.1",
+          "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-3.10.1.tgz",
+          "integrity": "sha512-IgieNijUMbkDovyoKObU1DUhm1iwNYE/fuifEoEHfd1oZKZDaONBSkal7Y01shxsM49R4XaMdGez3WnF9UfiCQ==",
           "dev": true,
           "requires": {
           "dev": true,
           "requires": {
-            "through": "2"
+            "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"
           }
         },
           }
         },
-        "stream-combiner": {
-          "version": "0.0.4",
-          "resolved": "https://registry.npmjs.org/stream-combiner/-/stream-combiner-0.0.4.tgz",
-          "integrity": "sha512-rT00SPnTVyRsaSz5zgSPma/aHSOic5U1prhYdRy5HS2kTZviFpmDgzilbtsJsxiroqACmayynDN/9VzIbX5DOw==",
+        "readable-stream": {
+          "version": "3.6.1",
+          "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.1.tgz",
+          "integrity": "sha512-+rQmrWMYGA90yenhTYsLWAsLsqVC8osOw6PKE1HDYiO0gdPeKe/xDHNzIAIn4C91YQ6oenEhfYqqc1883qHbjQ==",
           "dev": true,
           "requires": {
           "dev": true,
           "requires": {
-            "duplexer": "~0.1.1"
+            "inherits": "^2.0.3",
+            "string_decoder": "^1.1.1",
+            "util-deprecate": "^1.0.1"
           }
         }
       }
     },
           }
         }
       }
     },
-    "psl": {
-      "version": "1.9.0",
-      "resolved": "https://registry.npmjs.org/psl/-/psl-1.9.0.tgz",
-      "integrity": "sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag==",
-      "dev": true
-    },
-    "public-encrypt": {
-      "version": "4.0.3",
-      "resolved": "https://registry.npmjs.org/public-encrypt/-/public-encrypt-4.0.3.tgz",
-      "integrity": "sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q==",
+    "postcss-image-set-function": {
+      "version": "4.0.7",
+      "resolved": "https://registry.npmjs.org/postcss-image-set-function/-/postcss-image-set-function-4.0.7.tgz",
+      "integrity": "sha512-9T2r9rsvYzm5ndsBE8WgtrMlIT7VbtTfE7b3BQnudUqnBcBo7L758oc+o+pdj/dUV0l5wjwSdjeOH2DZtfv8qw==",
       "dev": true,
       "requires": {
       "dev": true,
       "requires": {
-        "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"
-      },
-      "dependencies": {
-        "bn.js": {
-          "version": "4.12.0",
-          "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz",
-          "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==",
-          "dev": true
-        }
+        "postcss-value-parser": "^4.2.0"
       }
     },
       }
     },
-    "pump": {
-      "version": "3.0.0",
-      "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz",
-      "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==",
+    "postcss-import": {
+      "version": "14.0.2",
+      "resolved": "https://registry.npmjs.org/postcss-import/-/postcss-import-14.0.2.tgz",
+      "integrity": "sha512-BJ2pVK4KhUyMcqjuKs9RijV5tatNzNa73e/32aBVE/ejYPe37iH+6vAu9WvqUkB5OAYgLHzbSvzHnorybJCm9g==",
       "dev": true,
       "requires": {
       "dev": true,
       "requires": {
-        "end-of-stream": "^1.1.0",
-        "once": "^1.3.1"
-      }
-    },
-    "punycode": {
-      "version": "1.3.2",
-      "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz",
-      "integrity": "sha512-RofWgt/7fL5wP1Y7fxE7/EmTLzQVnB0ycyibJ0OOHIlJqTNzglYFxVwETOcIoJqJmpDXJ9xImDv+Fq34F/d4Dw=="
-    },
-    "qs": {
-      "version": "6.11.0",
-      "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz",
-      "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==",
-      "requires": {
-        "side-channel": "^1.0.4"
+        "postcss-value-parser": "^4.0.0",
+        "read-cache": "^1.0.0",
+        "resolve": "^1.1.7"
       }
     },
       }
     },
-    "querystring": {
-      "version": "0.2.0",
-      "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz",
-      "integrity": "sha512-X/xY82scca2tau62i9mDyU9K+I+djTMUsvwf7xnUX5GLvVzgJybOJf4Y6o9Zx3oJK/LSXg5tTZBjwzqVPaPO2g=="
-    },
-    "querystring-es3": {
-      "version": "0.2.1",
-      "resolved": "https://registry.npmjs.org/querystring-es3/-/querystring-es3-0.2.1.tgz",
-      "integrity": "sha512-773xhDQnZBMFobEiztv8LIl70ch5MSF/jUQVlhwFyBILqq96anmoctVIYz+ZRp0qbCKATTn6ev02M3r7Ga5vqA==",
-      "dev": true
-    },
-    "querystringify": {
-      "version": "2.2.0",
-      "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.2.0.tgz",
-      "integrity": "sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ=="
-    },
-    "queue-microtask": {
-      "version": "1.2.3",
-      "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz",
-      "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==",
-      "dev": true
-    },
-    "quick-lru": {
+    "postcss-initial": {
       "version": "4.0.1",
       "version": "4.0.1",
-      "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-4.0.1.tgz",
-      "integrity": "sha512-ARhCpm70fzdcvNQfPoy49IaanKkTlRWF2JMzqhcJbhSFRZv7nPTvZJdcY7301IPmvW+/p0RgIWnQDLJxifsQ7g==",
+      "resolved": "https://registry.npmjs.org/postcss-initial/-/postcss-initial-4.0.1.tgz",
+      "integrity": "sha512-0ueD7rPqX8Pn1xJIjay0AZeIuDoF+V+VvMt/uOnn+4ezUKhZM/NokDeP6DwMNyIoYByuN/94IQnt5FEkaN59xQ==",
       "dev": true
     },
       "dev": true
     },
-    "quote-stream": {
-      "version": "1.0.2",
-      "resolved": "https://registry.npmjs.org/quote-stream/-/quote-stream-1.0.2.tgz",
-      "integrity": "sha512-kKr2uQ2AokadPjvTyKJQad9xELbZwYzWlNfI3Uz2j/ib5u6H9lDP7fUUR//rMycd0gv4Z5P1qXMfXR8YpIxrjQ==",
+    "postcss-lab-function": {
+      "version": "4.2.1",
+      "resolved": "https://registry.npmjs.org/postcss-lab-function/-/postcss-lab-function-4.2.1.tgz",
+      "integrity": "sha512-xuXll4isR03CrQsmxyz92LJB2xX9n+pZJ5jE9JgcnmsCammLyKdlzrBin+25dy6wIjfhJpKBAN80gsTlCgRk2w==",
       "dev": true,
       "requires": {
       "dev": true,
       "requires": {
-        "buffer-equal": "0.0.1",
-        "minimist": "^1.1.3",
-        "through2": "^2.0.0"
-      }
-    },
-    "randexp": {
-      "version": "0.5.3",
-      "resolved": "https://registry.npmjs.org/randexp/-/randexp-0.5.3.tgz",
-      "integrity": "sha512-U+5l2KrcMNOUPYvazA3h5ekF80FHTUG+87SEAmHZmolh1M+i/WyTCxVzmi+tidIa1tM4BSe8g2Y/D3loWDjj+w==",
-      "requires": {
-        "drange": "^1.0.2",
-        "ret": "^0.2.0"
-      }
-    },
-    "randombytes": {
-      "version": "2.1.0",
-      "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz",
-      "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==",
-      "requires": {
-        "safe-buffer": "^5.1.0"
+        "@csstools/postcss-progressive-custom-properties": "^1.1.0",
+        "postcss-value-parser": "^4.2.0"
       }
     },
       }
     },
-    "randomfill": {
-      "version": "1.0.4",
-      "resolved": "https://registry.npmjs.org/randomfill/-/randomfill-1.0.4.tgz",
-      "integrity": "sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw==",
+    "postcss-less": {
+      "version": "3.1.4",
+      "resolved": "https://registry.npmjs.org/postcss-less/-/postcss-less-3.1.4.tgz",
+      "integrity": "sha512-7TvleQWNM2QLcHqvudt3VYjULVB49uiW6XzEUFmvwHzvsOEF5MwBrIXZDJQvJNFGjJQTzSzZnDoCJ8h/ljyGXA==",
       "dev": true,
       "requires": {
       "dev": true,
       "requires": {
-        "randombytes": "^2.0.5",
-        "safe-buffer": "^5.1.0"
+        "postcss": "^7.0.14"
+      },
+      "dependencies": {
+        "picocolors": {
+          "version": "0.2.1",
+          "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz",
+          "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==",
+          "dev": true
+        },
+        "postcss": {
+          "version": "7.0.39",
+          "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz",
+          "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==",
+          "dev": true,
+          "requires": {
+            "picocolors": "^0.2.1",
+            "source-map": "^0.6.1"
+          }
+        },
+        "source-map": {
+          "version": "0.6.1",
+          "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+          "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+          "dev": true
+        }
       }
     },
       }
     },
-    "range-parser": {
-      "version": "1.2.1",
-      "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz",
-      "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==",
-      "dev": true
-    },
-    "raw-body": {
-      "version": "2.5.1",
-      "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.1.tgz",
-      "integrity": "sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==",
+    "postcss-loader": {
+      "version": "6.2.1",
+      "resolved": "https://registry.npmjs.org/postcss-loader/-/postcss-loader-6.2.1.tgz",
+      "integrity": "sha512-WbbYpmAaKcux/P66bZ40bpWsBucjx/TTgVVzRZ9yUO8yQfVBlameJ0ZGVaPfH64hNSBh63a+ICP5nqOpBA0w+Q==",
       "dev": true,
       "requires": {
       "dev": true,
       "requires": {
-        "bytes": "3.1.2",
-        "http-errors": "2.0.0",
-        "iconv-lite": "0.4.24",
-        "unpipe": "1.0.0"
+        "cosmiconfig": "^7.0.0",
+        "klona": "^2.0.5",
+        "semver": "^7.3.5"
       },
       "dependencies": {
       },
       "dependencies": {
-        "bytes": {
-          "version": "3.1.2",
-          "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz",
-          "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==",
+        "lru-cache": {
+          "version": "6.0.0",
+          "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz",
+          "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==",
+          "dev": true,
+          "requires": {
+            "yallist": "^4.0.0"
+          }
+        },
+        "semver": {
+          "version": "7.3.8",
+          "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz",
+          "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==",
+          "dev": true,
+          "requires": {
+            "lru-cache": "^6.0.0"
+          }
+        },
+        "yallist": {
+          "version": "4.0.0",
+          "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
+          "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==",
           "dev": true
         }
       }
     },
           "dev": true
         }
       }
     },
-    "react": {
-      "version": "17.0.2",
-      "resolved": "https://registry.npmjs.org/react/-/react-17.0.2.tgz",
-      "integrity": "sha512-gnhPt75i/dq/z3/6q/0asP78D0u592D5L1pd7M8P+dck6Fu/jJeL6iVVK23fptSUZj8Vjf++7wXA8UNclGQcbA==",
-      "requires": {
-        "loose-envify": "^1.1.0",
-        "object-assign": "^4.1.1"
-      }
+    "postcss-logical": {
+      "version": "5.0.4",
+      "resolved": "https://registry.npmjs.org/postcss-logical/-/postcss-logical-5.0.4.tgz",
+      "integrity": "sha512-RHXxplCeLh9VjinvMrZONq7im4wjWGlRJAqmAVLXyZaXwfDWP73/oq4NdIp+OZwhQUMj0zjqDfM5Fj7qby+B4g==",
+      "dev": true
+    },
+    "postcss-media-minmax": {
+      "version": "5.0.0",
+      "resolved": "https://registry.npmjs.org/postcss-media-minmax/-/postcss-media-minmax-5.0.0.tgz",
+      "integrity": "sha512-yDUvFf9QdFZTuCUg0g0uNSHVlJ5X1lSzDZjPSFaiCWvjgsvu8vEVxtahPrLMinIDEEGnx6cBe6iqdx5YWz08wQ==",
+      "dev": true
+    },
+    "postcss-media-query-parser": {
+      "version": "0.2.3",
+      "resolved": "https://registry.npmjs.org/postcss-media-query-parser/-/postcss-media-query-parser-0.2.3.tgz",
+      "integrity": "sha512-3sOlxmbKcSHMjlUXQZKQ06jOswE7oVkXPxmZdoB1r5l0q6gTFTQSHxNxOrCccElbW7dxNytifNEo8qidX2Vsig==",
+      "dev": true
     },
     },
-    "react-copy-to-clipboard": {
-      "version": "5.0.4",
-      "resolved": "https://registry.npmjs.org/react-copy-to-clipboard/-/react-copy-to-clipboard-5.0.4.tgz",
-      "integrity": "sha512-IeVAiNVKjSPeGax/Gmkqfa/+PuMTBhutEvFUaMQLwE2tS0EXrAdgOpWDX26bWTXF3HrioorR7lr08NqeYUWQCQ==",
+    "postcss-modules-extract-imports": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-3.0.0.tgz",
+      "integrity": "sha512-bdHleFnP3kZ4NYDhuGlVK+CMrQ/pqUm8bx/oGL93K6gVwiclvX5x0n76fYMKuIGKzlABOy13zsvqjb0f92TEXw==",
+      "dev": true
+    },
+    "postcss-modules-local-by-default": {
+      "version": "4.0.0",
+      "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-4.0.0.tgz",
+      "integrity": "sha512-sT7ihtmGSF9yhm6ggikHdV0hlziDTX7oFoXtuVWeDd3hHObNkcHRo9V3yg7vCAY7cONyxJC/XXCmmiHHcvX7bQ==",
+      "dev": true,
       "requires": {
       "requires": {
-        "copy-to-clipboard": "^3",
-        "prop-types": "^15.5.8"
+        "icss-utils": "^5.0.0",
+        "postcss-selector-parser": "^6.0.2",
+        "postcss-value-parser": "^4.1.0"
       }
     },
       }
     },
-    "react-debounce-input": {
-      "version": "3.2.4",
-      "resolved": "https://registry.npmjs.org/react-debounce-input/-/react-debounce-input-3.2.4.tgz",
-      "integrity": "sha512-fX70bNj0fLEYO2Zcvuh7eh9wOUQ29GIx6r8IxIJlc0i0mpUH++9ax0BhfAYfzndADli3RAMROrZQ014J01owrg==",
+    "postcss-modules-scope": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-3.0.0.tgz",
+      "integrity": "sha512-hncihwFA2yPath8oZ15PZqvWGkWf+XUfQgUGamS4LqoP1anQLOsOJw0vr7J7IwLpoY9fatA2qiGUGmuZL0Iqlg==",
+      "dev": true,
       "requires": {
       "requires": {
-        "lodash.debounce": "^4",
-        "prop-types": "^15.7.2"
+        "postcss-selector-parser": "^6.0.4"
       }
     },
       }
     },
-    "react-dom": {
-      "version": "17.0.2",
-      "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-17.0.2.tgz",
-      "integrity": "sha512-s4h96KtLDUQlsENhMn1ar8t2bEa+q/YAtj8pPPdIjPDGBDIVNsrD9aXNWqspUe6AzKCIG0C1HZZLqLV7qpOBGA==",
+    "postcss-modules-values": {
+      "version": "4.0.0",
+      "resolved": "https://registry.npmjs.org/postcss-modules-values/-/postcss-modules-values-4.0.0.tgz",
+      "integrity": "sha512-RDxHkAiEGI78gS2ofyvCsu7iycRv7oqw5xMWn9iMoR0N/7mf9D50ecQqUo5BZ9Zh2vH4bCUR/ktCqbB9m8vJjQ==",
+      "dev": true,
       "requires": {
       "requires": {
-        "loose-envify": "^1.1.0",
-        "object-assign": "^4.1.1",
-        "scheduler": "^0.20.2"
+        "icss-utils": "^5.0.0"
       }
     },
       }
     },
-    "react-immutable-proptypes": {
-      "version": "2.2.0",
-      "resolved": "https://registry.npmjs.org/react-immutable-proptypes/-/react-immutable-proptypes-2.2.0.tgz",
-      "integrity": "sha512-Vf4gBsePlwdGvSZoLSBfd4HAP93HDauMY4fDjXhreg/vg6F3Fj/MXDNyTbltPC/xZKmZc+cjLu3598DdYK6sgQ==",
+    "postcss-nesting": {
+      "version": "10.2.0",
+      "resolved": "https://registry.npmjs.org/postcss-nesting/-/postcss-nesting-10.2.0.tgz",
+      "integrity": "sha512-EwMkYchxiDiKUhlJGzWsD9b2zvq/r2SSubcRrgP+jujMXFzqvANLt16lJANC+5uZ6hjI7lpRmI6O8JIl+8l1KA==",
+      "dev": true,
       "requires": {
       "requires": {
-        "invariant": "^2.2.2"
+        "@csstools/selector-specificity": "^2.0.0",
+        "postcss-selector-parser": "^6.0.10"
       }
     },
       }
     },
-    "react-immutable-pure-component": {
-      "version": "2.2.2",
-      "resolved": "https://registry.npmjs.org/react-immutable-pure-component/-/react-immutable-pure-component-2.2.2.tgz",
-      "integrity": "sha512-vkgoMJUDqHZfXXnjVlG3keCxSO/U6WeDQ5/Sl0GK2cH8TOxEzQ5jXqDXHEL/jqk6fsNxV05oH5kD7VNMUE2k+A=="
-    },
-    "react-inspector": {
-      "version": "5.1.1",
-      "resolved": "https://registry.npmjs.org/react-inspector/-/react-inspector-5.1.1.tgz",
-      "integrity": "sha512-GURDaYzoLbW8pMGXwYPDBIv6nqei4kK7LPRZ9q9HCZF54wqXz/dnylBp/kfE9XmekBhHvLDdcYeyIwSrvtOiWg==",
+    "postcss-overflow-shorthand": {
+      "version": "3.0.4",
+      "resolved": "https://registry.npmjs.org/postcss-overflow-shorthand/-/postcss-overflow-shorthand-3.0.4.tgz",
+      "integrity": "sha512-otYl/ylHK8Y9bcBnPLo3foYFLL6a6Ak+3EQBPOTR7luMYCOsiVTUk1iLvNf6tVPNGXcoL9Hoz37kpfriRIFb4A==",
+      "dev": true,
       "requires": {
       "requires": {
-        "@babel/runtime": "^7.0.0",
-        "is-dom": "^1.0.0",
-        "prop-types": "^15.0.0"
+        "postcss-value-parser": "^4.2.0"
       }
     },
       }
     },
-    "react-is": {
-      "version": "16.13.1",
-      "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz",
-      "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ=="
+    "postcss-page-break": {
+      "version": "3.0.4",
+      "resolved": "https://registry.npmjs.org/postcss-page-break/-/postcss-page-break-3.0.4.tgz",
+      "integrity": "sha512-1JGu8oCjVXLa9q9rFTo4MbeeA5FMe00/9C7lN4va606Rdb+HkxXtXsmEDrIraQ11fGz/WvKWa8gMuCKkrXpTsQ==",
+      "dev": true
     },
     },
-    "react-redux": {
-      "version": "7.2.8",
-      "resolved": "https://registry.npmjs.org/react-redux/-/react-redux-7.2.8.tgz",
-      "integrity": "sha512-6+uDjhs3PSIclqoCk0kd6iX74gzrGc3W5zcAjbrFgEdIjRSQObdIwfx80unTkVUYvbQ95Y8Av3OvFHq1w5EOUw==",
+    "postcss-place": {
+      "version": "7.0.5",
+      "resolved": "https://registry.npmjs.org/postcss-place/-/postcss-place-7.0.5.tgz",
+      "integrity": "sha512-wR8igaZROA6Z4pv0d+bvVrvGY4GVHihBCBQieXFY3kuSuMyOmEnnfFzHl/tQuqHZkfkIVBEbDvYcFfHmpSet9g==",
+      "dev": true,
       "requires": {
       "requires": {
-        "@babel/runtime": "^7.15.4",
-        "@types/react-redux": "^7.1.20",
-        "hoist-non-react-statics": "^3.3.2",
-        "loose-envify": "^1.4.0",
-        "prop-types": "^15.7.2",
-        "react-is": "^17.0.2"
-      },
-      "dependencies": {
-        "react-is": {
-          "version": "17.0.2",
-          "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz",
-          "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w=="
-        }
+        "postcss-value-parser": "^4.2.0"
       }
     },
       }
     },
-    "react-syntax-highlighter": {
-      "version": "15.5.0",
-      "resolved": "https://registry.npmjs.org/react-syntax-highlighter/-/react-syntax-highlighter-15.5.0.tgz",
-      "integrity": "sha512-+zq2myprEnQmH5yw6Gqc8lD55QHnpKaU8TOcFeC/Lg/MQSs8UknEA0JC4nTZGFAXC2J2Hyj/ijJ7NlabyPi2gg==",
-      "requires": {
-        "@babel/runtime": "^7.3.1",
-        "highlight.js": "^10.4.1",
-        "lowlight": "^1.17.0",
-        "prismjs": "^1.27.0",
-        "refractor": "^3.6.0"
+    "postcss-preset-env": {
+      "version": "7.2.3",
+      "resolved": "https://registry.npmjs.org/postcss-preset-env/-/postcss-preset-env-7.2.3.tgz",
+      "integrity": "sha512-Ok0DhLfwrcNGrBn8sNdy1uZqWRk/9FId0GiQ39W4ILop5GHtjJs8bu1MY9isPwHInpVEPWjb4CEcEaSbBLpfwA==",
+      "dev": true,
+      "requires": {
+        "autoprefixer": "^10.4.2",
+        "browserslist": "^4.19.1",
+        "caniuse-lite": "^1.0.30001299",
+        "css-blank-pseudo": "^3.0.2",
+        "css-has-pseudo": "^3.0.3",
+        "css-prefers-color-scheme": "^6.0.2",
+        "cssdb": "^5.0.0",
+        "postcss-attribute-case-insensitive": "^5.0.0",
+        "postcss-color-functional-notation": "^4.2.1",
+        "postcss-color-hex-alpha": "^8.0.2",
+        "postcss-color-rebeccapurple": "^7.0.2",
+        "postcss-custom-media": "^8.0.0",
+        "postcss-custom-properties": "^12.1.2",
+        "postcss-custom-selectors": "^6.0.0",
+        "postcss-dir-pseudo-class": "^6.0.3",
+        "postcss-double-position-gradients": "^3.0.4",
+        "postcss-env-function": "^4.0.4",
+        "postcss-focus-visible": "^6.0.3",
+        "postcss-focus-within": "^5.0.3",
+        "postcss-font-variant": "^5.0.0",
+        "postcss-gap-properties": "^3.0.2",
+        "postcss-image-set-function": "^4.0.4",
+        "postcss-initial": "^4.0.1",
+        "postcss-lab-function": "^4.0.3",
+        "postcss-logical": "^5.0.3",
+        "postcss-media-minmax": "^5.0.0",
+        "postcss-nesting": "^10.1.2",
+        "postcss-overflow-shorthand": "^3.0.2",
+        "postcss-page-break": "^3.0.4",
+        "postcss-place": "^7.0.3",
+        "postcss-pseudo-class-any-link": "^7.0.2",
+        "postcss-replace-overflow-wrap": "^4.0.0",
+        "postcss-selector-not": "^5.0.0"
       }
     },
       }
     },
-    "read-cache": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz",
-      "integrity": "sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==",
+    "postcss-pseudo-class-any-link": {
+      "version": "7.1.6",
+      "resolved": "https://registry.npmjs.org/postcss-pseudo-class-any-link/-/postcss-pseudo-class-any-link-7.1.6.tgz",
+      "integrity": "sha512-9sCtZkO6f/5ML9WcTLcIyV1yz9D1rf0tWc+ulKcvV30s0iZKS/ONyETvoWsr6vnrmW+X+KmuK3gV/w5EWnT37w==",
       "dev": true,
       "requires": {
       "dev": true,
       "requires": {
-        "pify": "^2.3.0"
-      },
-      "dependencies": {
-        "pify": {
-          "version": "2.3.0",
-          "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz",
-          "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==",
-          "dev": true
-        }
+        "postcss-selector-parser": "^6.0.10"
       }
     },
       }
     },
-    "read-only-stream": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/read-only-stream/-/read-only-stream-2.0.0.tgz",
-      "integrity": "sha512-3ALe0bjBVZtkdWKIcThYpQCLbBMd/+Tbh2CDSrAIDO3UsZ4Xs+tnyjv2MjCOMMgBG+AsUOeuP1cgtY1INISc8w==",
+    "postcss-replace-overflow-wrap": {
+      "version": "4.0.0",
+      "resolved": "https://registry.npmjs.org/postcss-replace-overflow-wrap/-/postcss-replace-overflow-wrap-4.0.0.tgz",
+      "integrity": "sha512-KmF7SBPphT4gPPcKZc7aDkweHiKEEO8cla/GjcBK+ckKxiZslIu3C4GCRW3DNfL0o7yW7kMQu9xlZ1kXRXLXtw==",
+      "dev": true
+    },
+    "postcss-resolve-nested-selector": {
+      "version": "0.1.1",
+      "resolved": "https://registry.npmjs.org/postcss-resolve-nested-selector/-/postcss-resolve-nested-selector-0.1.1.tgz",
+      "integrity": "sha512-HvExULSwLqHLgUy1rl3ANIqCsvMS0WHss2UOsXhXnQaZ9VCc2oBvIpXrl00IUFT5ZDITME0o6oiXeiHr2SAIfw==",
+      "dev": true
+    },
+    "postcss-safe-parser": {
+      "version": "4.0.2",
+      "resolved": "https://registry.npmjs.org/postcss-safe-parser/-/postcss-safe-parser-4.0.2.tgz",
+      "integrity": "sha512-Uw6ekxSWNLCPesSv/cmqf2bY/77z11O7jZGPax3ycZMFU/oi2DMH9i89AdHc1tRwFg/arFoEwX0IS3LCUxJh1g==",
       "dev": true,
       "requires": {
       "dev": true,
       "requires": {
-        "readable-stream": "^2.0.2"
+        "postcss": "^7.0.26"
       },
       "dependencies": {
       },
       "dependencies": {
-        "readable-stream": {
-          "version": "2.3.7",
-          "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz",
-          "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==",
-          "dev": true,
-          "requires": {
-            "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"
-          }
+        "picocolors": {
+          "version": "0.2.1",
+          "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz",
+          "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==",
+          "dev": true
         },
         },
-        "string_decoder": {
-          "version": "1.1.1",
-          "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz",
-          "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
+        "postcss": {
+          "version": "7.0.39",
+          "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz",
+          "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==",
           "dev": true,
           "requires": {
           "dev": true,
           "requires": {
-            "safe-buffer": "~5.1.0"
+            "picocolors": "^0.2.1",
+            "source-map": "^0.6.1"
           }
           }
+        },
+        "source-map": {
+          "version": "0.6.1",
+          "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+          "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+          "dev": true
         }
       }
     },
         }
       }
     },
-    "read-package-json-fast": {
-      "version": "2.0.3",
-      "resolved": "https://registry.npmjs.org/read-package-json-fast/-/read-package-json-fast-2.0.3.tgz",
-      "integrity": "sha512-W/BKtbL+dUjTuRL2vziuYhp76s5HZ9qQhd/dKfWIZveD0O40453QNyZhC0e63lqZrAQ4jiOapVoeJ7JrszenQQ==",
-      "dev": true,
-      "requires": {
-        "json-parse-even-better-errors": "^2.3.0",
-        "npm-normalize-package-bin": "^1.0.1"
-      }
-    },
-    "read-pkg": {
-      "version": "5.2.0",
-      "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz",
-      "integrity": "sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==",
+    "postcss-sass": {
+      "version": "0.4.4",
+      "resolved": "https://registry.npmjs.org/postcss-sass/-/postcss-sass-0.4.4.tgz",
+      "integrity": "sha512-BYxnVYx4mQooOhr+zer0qWbSPYnarAy8ZT7hAQtbxtgVf8gy+LSLT/hHGe35h14/pZDTw1DsxdbrwxBN++H+fg==",
       "dev": true,
       "requires": {
       "dev": true,
       "requires": {
-        "@types/normalize-package-data": "^2.4.0",
-        "normalize-package-data": "^2.5.0",
-        "parse-json": "^5.0.0",
-        "type-fest": "^0.6.0"
+        "gonzales-pe": "^4.3.0",
+        "postcss": "^7.0.21"
       },
       "dependencies": {
       },
       "dependencies": {
-        "type-fest": {
-          "version": "0.6.0",
-          "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz",
-          "integrity": "sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==",
+        "picocolors": {
+          "version": "0.2.1",
+          "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz",
+          "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==",
+          "dev": true
+        },
+        "postcss": {
+          "version": "7.0.39",
+          "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz",
+          "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==",
+          "dev": true,
+          "requires": {
+            "picocolors": "^0.2.1",
+            "source-map": "^0.6.1"
+          }
+        },
+        "source-map": {
+          "version": "0.6.1",
+          "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+          "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
           "dev": true
         }
       }
     },
           "dev": true
         }
       }
     },
-    "read-pkg-up": {
-      "version": "7.0.1",
-      "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-7.0.1.tgz",
-      "integrity": "sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==",
+    "postcss-scss": {
+      "version": "2.1.1",
+      "resolved": "https://registry.npmjs.org/postcss-scss/-/postcss-scss-2.1.1.tgz",
+      "integrity": "sha512-jQmGnj0hSGLd9RscFw9LyuSVAa5Bl1/KBPqG1NQw9w8ND55nY4ZEsdlVuYJvLPpV+y0nwTV5v/4rHPzZRihQbA==",
       "dev": true,
       "requires": {
       "dev": true,
       "requires": {
-        "find-up": "^4.1.0",
-        "read-pkg": "^5.2.0",
-        "type-fest": "^0.8.1"
+        "postcss": "^7.0.6"
       },
       "dependencies": {
       },
       "dependencies": {
-        "type-fest": {
-          "version": "0.8.1",
-          "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz",
-          "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==",
+        "picocolors": {
+          "version": "0.2.1",
+          "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz",
+          "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==",
           "dev": true
           "dev": true
-        }
-      }
-    },
-    "readable-stream": {
-      "version": "3.6.0",
-      "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz",
-      "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==",
-      "dev": true,
-      "requires": {
-        "inherits": "^2.0.3",
-        "string_decoder": "^1.1.1",
-        "util-deprecate": "^1.0.1"
-      }
-    },
-    "readdirp": {
-      "version": "3.6.0",
-      "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz",
-      "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==",
-      "dev": true,
-      "requires": {
-        "picomatch": "^2.2.1"
+        },
+        "postcss": {
+          "version": "7.0.39",
+          "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz",
+          "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==",
+          "dev": true,
+          "requires": {
+            "picocolors": "^0.2.1",
+            "source-map": "^0.6.1"
+          }
+        },
+        "source-map": {
+          "version": "0.6.1",
+          "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+          "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+          "dev": true
+        }
       }
     },
       }
     },
-    "rechoir": {
-      "version": "0.6.2",
-      "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz",
-      "integrity": "sha512-HFM8rkZ+i3zrV+4LQjwQ0W+ez98pApMGM3HUrN04j3CqzPOzl9nmP15Y8YXNm8QHGv/eacOVEjqhmWpkRV0NAw==",
+    "postcss-selector-not": {
+      "version": "5.0.0",
+      "resolved": "https://registry.npmjs.org/postcss-selector-not/-/postcss-selector-not-5.0.0.tgz",
+      "integrity": "sha512-/2K3A4TCP9orP4TNS7u3tGdRFVKqz/E6pX3aGnriPG0jU78of8wsUcqE4QAhWEU0d+WnMSF93Ah3F//vUtK+iQ==",
       "dev": true,
       "requires": {
       "dev": true,
       "requires": {
-        "resolve": "^1.1.6"
+        "balanced-match": "^1.0.0"
       }
     },
       }
     },
-    "redent": {
-      "version": "3.0.0",
-      "resolved": "https://registry.npmjs.org/redent/-/redent-3.0.0.tgz",
-      "integrity": "sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==",
+    "postcss-selector-parser": {
+      "version": "6.0.11",
+      "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.11.tgz",
+      "integrity": "sha512-zbARubNdogI9j7WY4nQJBiNqQf3sLS3wCP4WfOidu+p28LofJqDH1tcXypGrcmMHhDk2t9wGhCsYe/+szLTy1g==",
       "dev": true,
       "requires": {
       "dev": true,
       "requires": {
-        "indent-string": "^4.0.0",
-        "strip-indent": "^3.0.0"
+        "cssesc": "^3.0.0",
+        "util-deprecate": "^1.0.2"
       }
     },
       }
     },
-    "redux": {
-      "version": "4.2.0",
-      "resolved": "https://registry.npmjs.org/redux/-/redux-4.2.0.tgz",
-      "integrity": "sha512-oSBmcKKIuIR4ME29/AeNUnl5L+hvBq7OaJWzaptTQJAntaPvxIJqfnjbaEiCzzaIz+XmVILfqAM3Ob0aXLPfjA==",
+    "postcss-sorting": {
+      "version": "5.0.1",
+      "resolved": "https://registry.npmjs.org/postcss-sorting/-/postcss-sorting-5.0.1.tgz",
+      "integrity": "sha512-Y9fUFkIhfrm6i0Ta3n+89j56EFqaNRdUKqXyRp6kvTcSXnmgEjaVowCXH+JBe9+YKWqd4nc28r2sgwnzJalccA==",
+      "dev": true,
       "requires": {
       "requires": {
-        "@babel/runtime": "^7.9.2"
+        "lodash": "^4.17.14",
+        "postcss": "^7.0.17"
+      },
+      "dependencies": {
+        "picocolors": {
+          "version": "0.2.1",
+          "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz",
+          "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==",
+          "dev": true
+        },
+        "postcss": {
+          "version": "7.0.39",
+          "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz",
+          "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==",
+          "dev": true,
+          "requires": {
+            "picocolors": "^0.2.1",
+            "source-map": "^0.6.1"
+          }
+        },
+        "source-map": {
+          "version": "0.6.1",
+          "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+          "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+          "dev": true
+        }
       }
     },
       }
     },
-    "redux-immutable": {
-      "version": "4.0.0",
-      "resolved": "https://registry.npmjs.org/redux-immutable/-/redux-immutable-4.0.0.tgz",
-      "integrity": "sha512-SchSn/DWfGb3oAejd+1hhHx01xUoxY+V7TeK0BKqpkLKiQPVFf7DYzEaKmrEVxsWxielKfSK9/Xq66YyxgR1cg=="
+    "postcss-syntax": {
+      "version": "0.36.2",
+      "resolved": "https://registry.npmjs.org/postcss-syntax/-/postcss-syntax-0.36.2.tgz",
+      "integrity": "sha512-nBRg/i7E3SOHWxF3PpF5WnJM/jQ1YpY9000OaVXlAQj6Zp/kIqJxEDWIZ67tAd7NLuk7zqN4yqe9nc0oNAOs1w==",
+      "dev": true
     },
     },
-    "reflect-metadata": {
-      "version": "0.1.13",
-      "resolved": "https://registry.npmjs.org/reflect-metadata/-/reflect-metadata-0.1.13.tgz",
-      "integrity": "sha512-Ts1Y/anZELhSsjMcU605fU9RE4Oi3p5ORujwbIKXfWa+0Zxs510Qrmrce5/Jowq3cHSZSJqBjypxmHarc+vEWg==",
+    "postcss-value-parser": {
+      "version": "4.2.0",
+      "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz",
+      "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==",
       "dev": true
     },
       "dev": true
     },
-    "refractor": {
-      "version": "3.6.0",
-      "resolved": "https://registry.npmjs.org/refractor/-/refractor-3.6.0.tgz",
-      "integrity": "sha512-MY9W41IOWxxk31o+YvFCNyNzdkc9M20NoZK5vq6jkv4I/uh2zkWcfudj0Q1fovjUQJrNewS9NMzeTtqPf+n5EA==",
+    "prebuild-install": {
+      "version": "6.1.4",
+      "resolved": "https://registry.npmjs.org/prebuild-install/-/prebuild-install-6.1.4.tgz",
+      "integrity": "sha512-Z4vpywnK1lBg+zdPCVCsKq0xO66eEV9rWo2zrROGGiRS4JtueBOdlB1FnY8lcy7JsUud/Q3ijUxyWN26Ika0vQ==",
+      "optional": true,
       "requires": {
       "requires": {
-        "hastscript": "^6.0.0",
-        "parse-entities": "^2.0.0",
-        "prismjs": "~1.27.0"
-      },
-      "dependencies": {
-        "prismjs": {
-          "version": "1.27.0",
-          "resolved": "https://registry.npmjs.org/prismjs/-/prismjs-1.27.0.tgz",
-          "integrity": "sha512-t13BGPUlFDR7wRB5kQDG4jjl7XeuH6jbJGt11JHPL96qwsEHNX2+68tFXqc1/k+/jALsbSWJKUOT/hcYAZ5LkA=="
-        }
+        "detect-libc": "^1.0.3",
+        "expand-template": "^2.0.3",
+        "github-from-package": "0.0.0",
+        "minimist": "^1.2.3",
+        "mkdirp-classic": "^0.5.3",
+        "napi-build-utils": "^1.0.1",
+        "node-abi": "^2.21.0",
+        "npmlog": "^4.0.1",
+        "pump": "^3.0.0",
+        "rc": "^1.2.7",
+        "simple-get": "^3.0.3",
+        "tar-fs": "^2.0.0",
+        "tunnel-agent": "^0.6.0"
       }
     },
       }
     },
-    "regenerate": {
-      "version": "1.4.2",
-      "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz",
-      "integrity": "sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==",
-      "dev": true
-    },
-    "regenerate-unicode-properties": {
-      "version": "10.0.1",
-      "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-10.0.1.tgz",
-      "integrity": "sha512-vn5DU6yg6h8hP/2OkQo3K7uVILvY4iu0oI4t3HFa81UPkhGJwkRwM10JEc3upjdhHjs/k8GJY1sRBhk5sr69Bw==",
+    "preceptor-core": {
+      "version": "0.10.1",
+      "resolved": "https://registry.npmjs.org/preceptor-core/-/preceptor-core-0.10.1.tgz",
+      "integrity": "sha512-WLDk+UowEESixvlhiamGOj/iqWrp8IWeCCHvBZrLh0g4/A1Fa77fDQWqQUd5S5rScT+9u49aDfa45xYRkxqmiA==",
       "dev": true,
       "requires": {
       "dev": true,
       "requires": {
-        "regenerate": "^1.4.2"
+        "log4js": "1.1.1",
+        "underscore": "1.7.0"
       }
     },
       }
     },
-    "regenerator-runtime": {
-      "version": "0.13.9",
-      "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.9.tgz",
-      "integrity": "sha512-p3VT+cOEgxFsRRA9X4lkI1E+k2/CtnKtU4gcxyaCUreilL/vqI6CdZ3wxVUx3UOUg+gnUOQQcRI7BmSI656MYA=="
+    "prelude-ls": {
+      "version": "1.1.2",
+      "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz",
+      "integrity": "sha512-ESF23V4SKG6lVSGZgYNpbsiaAkdab6ZgOxe52p7+Kid3W3u3bxR4Vfd/o21dmN7jSt0IwgZ4v5MUd26FEtXE9w==",
+      "dev": true
     },
     },
-    "regenerator-transform": {
-      "version": "0.15.0",
-      "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.15.0.tgz",
-      "integrity": "sha512-LsrGtPmbYg19bcPHwdtmXwbW+TqNvtY4riE3P83foeHRroMbH6/2ddFBfab3t7kbzc7v7p4wbkIecHImqt0QNg==",
+    "prettier": {
+      "version": "2.1.2",
+      "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.1.2.tgz",
+      "integrity": "sha512-16c7K+x4qVlJg9rEbXl7HEGmQyZlG4R9AgP+oHKRMsMsuk8s+ATStlf1NpDqyBI1HpVyfjLOeMhH2LvuNvV5Vg==",
+      "dev": true
+    },
+    "pretty-bytes": {
+      "version": "5.6.0",
+      "resolved": "https://registry.npmjs.org/pretty-bytes/-/pretty-bytes-5.6.0.tgz",
+      "integrity": "sha512-FFw039TmrBqFK8ma/7OL3sDz/VytdtJr044/QUJtH0wK9lb9jLq9tJyIxUwtQJHwar2BqtiA4iCWSwo9JLkzFg==",
+      "dev": true
+    },
+    "pretty-format": {
+      "version": "28.1.3",
+      "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-28.1.3.tgz",
+      "integrity": "sha512-8gFb/To0OmxHR9+ZTb14Df2vNxdGCX8g1xWGUTqUw5TiZvcQf5sHKObd5UcPyLLyowNwDAMTF3XWOG1B6mxl1Q==",
       "dev": true,
       "requires": {
       "dev": true,
       "requires": {
-        "@babel/runtime": "^7.8.4"
+        "@jest/schemas": "^28.1.3",
+        "ansi-regex": "^5.0.1",
+        "ansi-styles": "^5.0.0",
+        "react-is": "^18.0.0"
+      },
+      "dependencies": {
+        "ansi-styles": {
+          "version": "5.2.0",
+          "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz",
+          "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==",
+          "dev": true
+        },
+        "react-is": {
+          "version": "18.2.0",
+          "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz",
+          "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==",
+          "dev": true
+        }
       }
     },
       }
     },
-    "regex-not": {
-      "version": "1.0.2",
-      "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz",
-      "integrity": "sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==",
+    "pretty-quick": {
+      "version": "3.0.2",
+      "resolved": "https://registry.npmjs.org/pretty-quick/-/pretty-quick-3.0.2.tgz",
+      "integrity": "sha512-4rWOs/Ifdkg7G/YX7Xbco4jZkuXPx445KdhuMI6REnl3nXRDb9+zysb29c76R59jsJzcnkcpAaGi8D/RjAVfSQ==",
       "dev": true,
       "requires": {
       "dev": true,
       "requires": {
-        "extend-shallow": "^3.0.2",
-        "safe-regex": "^1.1.0"
+        "chalk": "^3.0.0",
+        "execa": "^4.0.0",
+        "find-up": "^4.1.0",
+        "ignore": "^5.1.4",
+        "mri": "^1.1.5",
+        "multimatch": "^4.0.0"
+      },
+      "dependencies": {
+        "ansi-styles": {
+          "version": "4.3.0",
+          "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
+          "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+          "dev": true,
+          "requires": {
+            "color-convert": "^2.0.1"
+          }
+        },
+        "chalk": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz",
+          "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==",
+          "dev": true,
+          "requires": {
+            "ansi-styles": "^4.1.0",
+            "supports-color": "^7.1.0"
+          }
+        },
+        "color-convert": {
+          "version": "2.0.1",
+          "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
+          "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+          "dev": true,
+          "requires": {
+            "color-name": "~1.1.4"
+          }
+        },
+        "color-name": {
+          "version": "1.1.4",
+          "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
+          "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
+          "dev": true
+        },
+        "execa": {
+          "version": "4.1.0",
+          "resolved": "https://registry.npmjs.org/execa/-/execa-4.1.0.tgz",
+          "integrity": "sha512-j5W0//W7f8UxAn8hXVnwG8tLwdiUy4FJLcSupCg6maBYZDpyBvTApK7KyuI4bKj8KOh1r2YH+6ucuYtJv1bTZA==",
+          "dev": true,
+          "requires": {
+            "cross-spawn": "^7.0.0",
+            "get-stream": "^5.0.0",
+            "human-signals": "^1.1.1",
+            "is-stream": "^2.0.0",
+            "merge-stream": "^2.0.0",
+            "npm-run-path": "^4.0.0",
+            "onetime": "^5.1.0",
+            "signal-exit": "^3.0.2",
+            "strip-final-newline": "^2.0.0"
+          }
+        },
+        "get-stream": {
+          "version": "5.2.0",
+          "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz",
+          "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==",
+          "dev": true,
+          "requires": {
+            "pump": "^3.0.0"
+          }
+        },
+        "has-flag": {
+          "version": "4.0.0",
+          "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
+          "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+          "dev": true
+        },
+        "human-signals": {
+          "version": "1.1.1",
+          "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-1.1.1.tgz",
+          "integrity": "sha512-SEQu7vl8KjNL2eoGBLF3+wAjpsNfA9XMlXAYj/3EdaNfAlxKthD1xjEQfGOUhllCGGJVNY34bRr6lPINhNjyZw==",
+          "dev": true
+        },
+        "supports-color": {
+          "version": "7.2.0",
+          "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
+          "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
+          "dev": true,
+          "requires": {
+            "has-flag": "^4.0.0"
+          }
+        }
       }
     },
       }
     },
-    "regex-parser": {
-      "version": "2.2.11",
-      "resolved": "https://registry.npmjs.org/regex-parser/-/regex-parser-2.2.11.tgz",
-      "integrity": "sha512-jbD/FT0+9MBU2XAZluI7w2OBs1RBi6p9M83nkoZayQXXU9e8Robt69FcZc7wU4eJD/YFTjn1JdCk3rbMJajz8Q==",
-      "dev": true
+    "prismjs": {
+      "version": "1.29.0",
+      "resolved": "https://registry.npmjs.org/prismjs/-/prismjs-1.29.0.tgz",
+      "integrity": "sha512-Kx/1w86q/epKcmte75LNrEoT+lX8pBpavuAbvJWRXar7Hz8jrtF+e3vY751p0R8H9HdArwaCTNDDzHg/ScJK1Q=="
     },
     },
-    "regexp.prototype.flags": {
-      "version": "1.4.3",
-      "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.4.3.tgz",
-      "integrity": "sha512-fjggEOO3slI6Wvgjwflkc4NFRCTZAu5CnNfBd5qOMYhWdn67nJBBu34/TkD++eeFmd8C9r9jfXJ27+nSiRkSUA==",
-      "dev": true,
-      "requires": {
-        "call-bind": "^1.0.2",
-        "define-properties": "^1.1.3",
-        "functions-have-names": "^1.2.2"
-      }
+    "process": {
+      "version": "0.11.10",
+      "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz",
+      "integrity": "sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A=="
+    },
+    "process-nextick-args": {
+      "version": "2.0.1",
+      "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz",
+      "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag=="
+    },
+    "progress": {
+      "version": "2.0.3",
+      "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz",
+      "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==",
+      "dev": true
     },
     },
-    "regexpu-core": {
-      "version": "5.1.0",
-      "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-5.1.0.tgz",
-      "integrity": "sha512-bb6hk+xWd2PEOkj5It46A16zFMs2mv86Iwpdu94la4S3sJ7C973h2dHpYKwIBGaWSO7cIRJ+UX0IeMaWcO4qwA==",
+    "promise": {
+      "version": "6.0.0",
+      "resolved": "https://registry.npmjs.org/promise/-/promise-6.0.0.tgz",
+      "integrity": "sha512-PjIqIEWR8EWwP5ml3Wf5KWIP3sIdXAew9vQ6vLOLV+z4LMa/8ZQyLd7sTWe2r8OuA8A9jsIYptDfbEn/L36ogw==",
       "dev": true,
       "requires": {
       "dev": true,
       "requires": {
-        "regenerate": "^1.4.2",
-        "regenerate-unicode-properties": "^10.0.1",
-        "regjsgen": "^0.6.0",
-        "regjsparser": "^0.8.2",
-        "unicode-match-property-ecmascript": "^2.0.0",
-        "unicode-match-property-value-ecmascript": "^2.0.0"
+        "asap": "~1.0.0"
       }
     },
       }
     },
-    "regjsgen": {
-      "version": "0.6.0",
-      "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.6.0.tgz",
-      "integrity": "sha512-ozE883Uigtqj3bx7OhL1KNbCzGyW2NQZPl6Hs09WTvCuZD5sTI4JY58bkbQWa/Y9hxIsvJ3M8Nbf7j54IqeZbA==",
+    "promise-inflight": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/promise-inflight/-/promise-inflight-1.0.1.tgz",
+      "integrity": "sha512-6zWPyEOFaQBJYcGMHBKTKJ3u6TBsnMFOIZSa6ce1e/ZrrsOlnHRHbabMjLiBYKp+n44X9eUI6VUPaukCXHuG4g==",
       "dev": true
     },
       "dev": true
     },
-    "regjsparser": {
-      "version": "0.8.4",
-      "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.8.4.tgz",
-      "integrity": "sha512-J3LABycON/VNEu3abOviqGHuB/LOtOQj8SKmfP9anY5GfAVw/SPjwzSjxGjbZXIxbGfqTHtJw58C2Li/WkStmA==",
+    "promise-retry": {
+      "version": "2.0.1",
+      "resolved": "https://registry.npmjs.org/promise-retry/-/promise-retry-2.0.1.tgz",
+      "integrity": "sha512-y+WKFlBR8BGXnsNlIHFGPZmyDf3DFMoLhaflAnyZgV6rG6xu+JwesTo2Q9R6XwYmtmwAFCkAk3e35jEdoeh/3g==",
       "dev": true,
       "requires": {
       "dev": true,
       "requires": {
-        "jsesc": "~0.5.0"
+        "err-code": "^2.0.2",
+        "retry": "^0.12.0"
       },
       "dependencies": {
       },
       "dependencies": {
-        "jsesc": {
-          "version": "0.5.0",
-          "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz",
-          "integrity": "sha512-uZz5UnB7u4T9LvwmFqXii7pZSouaRPorGs5who1Ip7VO0wxanFvBL7GkM6dTHlgX+jhBApRetaWpnDabOeTcnA==",
+        "retry": {
+          "version": "0.12.0",
+          "resolved": "https://registry.npmjs.org/retry/-/retry-0.12.0.tgz",
+          "integrity": "sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow==",
           "dev": true
         }
       }
     },
           "dev": true
         }
       }
     },
-    "remark": {
-      "version": "13.0.0",
-      "resolved": "https://registry.npmjs.org/remark/-/remark-13.0.0.tgz",
-      "integrity": "sha512-HDz1+IKGtOyWN+QgBiAT0kn+2s6ovOxHyPAFGKVE81VSzJ+mq7RwHFledEvB5F1p4iJvOah/LOKdFuzvRnNLCA==",
+    "prompts": {
+      "version": "2.4.2",
+      "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz",
+      "integrity": "sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==",
       "dev": true,
       "requires": {
       "dev": true,
       "requires": {
-        "remark-parse": "^9.0.0",
-        "remark-stringify": "^9.0.0",
-        "unified": "^9.1.0"
+        "kleur": "^3.0.3",
+        "sisteransi": "^1.0.5"
       }
     },
       }
     },
-    "remark-parse": {
-      "version": "9.0.0",
-      "resolved": "https://registry.npmjs.org/remark-parse/-/remark-parse-9.0.0.tgz",
-      "integrity": "sha512-geKatMwSzEXKHuzBNU1z676sGcDcFoChMK38TgdHJNAYfFtsfHDQG7MoJAjs6sgYMqyLduCYWDIWZIxiPeafEw==",
-      "dev": true,
+    "prop-types": {
+      "version": "15.8.1",
+      "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz",
+      "integrity": "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==",
       "requires": {
       "requires": {
-        "mdast-util-from-markdown": "^0.8.0"
+        "loose-envify": "^1.4.0",
+        "object-assign": "^4.1.1",
+        "react-is": "^16.13.1"
       }
     },
       }
     },
-    "remark-stringify": {
-      "version": "9.0.1",
-      "resolved": "https://registry.npmjs.org/remark-stringify/-/remark-stringify-9.0.1.tgz",
-      "integrity": "sha512-mWmNg3ZtESvZS8fv5PTvaPckdL4iNlCHTt8/e/8oN08nArHRHjNZMKzA/YW3+p7/lYqIw4nx1XsjCBo/AxNChg==",
+    "property-information": {
+      "version": "5.6.0",
+      "resolved": "https://registry.npmjs.org/property-information/-/property-information-5.6.0.tgz",
+      "integrity": "sha512-YUHSPk+A30YPv+0Qf8i9Mbfe/C0hdPXk1s1jPVToV8pk8BQtpw10ct89Eo7OWkutrwqvT0eicAxlOg3dOAu8JA==",
+      "requires": {
+        "xtend": "^4.0.0"
+      }
+    },
+    "protobufjs": {
+      "version": "6.11.3",
+      "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-6.11.3.tgz",
+      "integrity": "sha512-xL96WDdCZYdU7Slin569tFX712BxsxslWwAfAhCYjQKGTq7dAU91Lomy6nLLhh/dyGhk/YH4TwTSRxTzhuHyZg==",
       "dev": true,
       "requires": {
       "dev": true,
       "requires": {
-        "mdast-util-to-markdown": "^0.6.0"
+        "@protobufjs/aspromise": "^1.1.2",
+        "@protobufjs/base64": "^1.1.2",
+        "@protobufjs/codegen": "^2.0.4",
+        "@protobufjs/eventemitter": "^1.1.0",
+        "@protobufjs/fetch": "^1.1.0",
+        "@protobufjs/float": "^1.0.2",
+        "@protobufjs/inquire": "^1.1.0",
+        "@protobufjs/path": "^1.1.2",
+        "@protobufjs/pool": "^1.1.0",
+        "@protobufjs/utf8": "^1.1.0",
+        "@types/long": "^4.0.1",
+        "@types/node": ">=13.7.0",
+        "long": "^4.0.0"
+      },
+      "dependencies": {
+        "@types/node": {
+          "version": "18.14.6",
+          "resolved": "https://registry.npmjs.org/@types/node/-/node-18.14.6.tgz",
+          "integrity": "sha512-93+VvleD3mXwlLI/xASjw0FzKcwzl3OdTCzm1LaRfqgS21gfFtK3zDXM5Op9TeeMsJVOaJ2VRDpT9q4Y3d0AvA==",
+          "dev": true
+        }
       }
     },
       }
     },
-    "remarkable": {
-      "version": "2.0.1",
-      "resolved": "https://registry.npmjs.org/remarkable/-/remarkable-2.0.1.tgz",
-      "integrity": "sha512-YJyMcOH5lrR+kZdmB0aJJ4+93bEojRZ1HGDn9Eagu6ibg7aVZhc3OWbbShRid+Q5eAfsEqWxpe+g5W5nYNfNiA==",
+    "proxy-addr": {
+      "version": "2.0.7",
+      "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz",
+      "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==",
+      "dev": true,
       "requires": {
       "requires": {
-        "argparse": "^1.0.10",
-        "autolinker": "^3.11.0"
+        "forwarded": "0.2.0",
+        "ipaddr.js": "1.9.1"
       },
       "dependencies": {
       },
       "dependencies": {
-        "argparse": {
-          "version": "1.0.10",
-          "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz",
-          "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==",
-          "requires": {
-            "sprintf-js": "~1.0.2"
-          }
+        "ipaddr.js": {
+          "version": "1.9.1",
+          "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz",
+          "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==",
+          "dev": true
         }
       }
     },
         }
       }
     },
-    "remove-trailing-separator": {
+    "proxy-from-env": {
       "version": "1.1.0",
       "version": "1.1.0",
-      "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz",
-      "integrity": "sha512-/hS+Y0u3aOfIETiaiirUFwDBDzmXPvO+jAfKTitUngIPzdKc6Z0LoFjM/CK5PL4C+eKwHohlHAb6H0VFfmmUsw==",
-      "dev": true
+      "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz",
+      "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg=="
     },
     },
-    "repeat-element": {
-      "version": "1.1.4",
-      "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.4.tgz",
-      "integrity": "sha512-LFiNfRcSu7KK3evMyYOuCzv3L10TW7yC1G2/+StMjK8Y6Vqd2MG7r/Qjw4ghtuCOjFvlnms/iMmLqpvW/ES/WQ==",
+    "proxy-middleware": {
+      "version": "0.15.0",
+      "resolved": "https://registry.npmjs.org/proxy-middleware/-/proxy-middleware-0.15.0.tgz",
+      "integrity": "sha512-EGCG8SeoIRVMhsqHQUdDigB2i7qU7fCsWASwn54+nPutYO8n4q6EiwMzyfWlC+dzRFExP+kvcnDFdBDHoZBU7Q==",
       "dev": true
     },
       "dev": true
     },
-    "repeat-string": {
-      "version": "1.6.1",
-      "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz",
-      "integrity": "sha512-PV0dzCYDNfRi1jCDbJzpW7jNNDRuCOG/jI5ctQcGKt/clZD+YcPS3yIlWuTJMmESC8aevCFmWJy5wjAFgNqN6w=="
+    "prr": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz",
+      "integrity": "sha512-yPw4Sng1gWghHQWj0B3ZggWUm4qVbPwPFcRG8KyxiU7J2OHFSoEHKS+EZ3fv5l1t9CyCiop6l/ZYeWbrgoQejw==",
+      "dev": true
     },
     },
-    "request": {
-      "version": "2.88.2",
-      "resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz",
-      "integrity": "sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==",
+    "ps-tree": {
+      "version": "1.2.0",
+      "resolved": "https://registry.npmjs.org/ps-tree/-/ps-tree-1.2.0.tgz",
+      "integrity": "sha512-0VnamPPYHl4uaU/nSFeZZpR21QAWRz+sRv4iW9+v/GS/J5U5iZB5BNN6J0RMoOvdx2gWM2+ZFMIm58q24e4UYA==",
       "dev": true,
       "requires": {
       "dev": true,
       "requires": {
-        "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.3",
-        "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.5.0",
-        "tunnel-agent": "^0.6.0",
-        "uuid": "^3.3.2"
+        "event-stream": "=3.3.4"
       },
       "dependencies": {
       },
       "dependencies": {
-        "qs": {
-          "version": "6.5.3",
-          "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.3.tgz",
-          "integrity": "sha512-qxXIEh4pCGfHICj1mAJQ2/2XVZkjCDTcEgfoSQxc/fYivUZxTkk7L3bDBJSoNrEzXI17oUO5Dp07ktqE5KzczA==",
-          "dev": true
+        "event-stream": {
+          "version": "3.3.4",
+          "resolved": "https://registry.npmjs.org/event-stream/-/event-stream-3.3.4.tgz",
+          "integrity": "sha512-QHpkERcGsR0T7Qm3HNJSyXKEEj8AHNxkY3PK8TS2KJvQ7NiSHe3DDpwVKKtoYprL/AreyzFBeIkBIWChAqn60g==",
+          "dev": true,
+          "requires": {
+            "duplexer": "~0.1.1",
+            "from": "~0",
+            "map-stream": "~0.1.0",
+            "pause-stream": "0.0.11",
+            "split": "0.3",
+            "stream-combiner": "~0.0.4",
+            "through": "~2.3.1"
+          }
         },
         },
-        "uuid": {
-          "version": "3.4.0",
-          "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz",
-          "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==",
+        "map-stream": {
+          "version": "0.1.0",
+          "resolved": "https://registry.npmjs.org/map-stream/-/map-stream-0.1.0.tgz",
+          "integrity": "sha512-CkYQrPYZfWnu/DAmVCpTSX/xHpKZ80eKh2lAkyA6AJTef6bW+6JpbQZN5rofum7da+SyN1bi5ctTm+lTfcCW3g==",
           "dev": true
           "dev": true
+        },
+        "split": {
+          "version": "0.3.3",
+          "resolved": "https://registry.npmjs.org/split/-/split-0.3.3.tgz",
+          "integrity": "sha512-wD2AeVmxXRBoX44wAycgjVpMhvbwdI2aZjCkvfNcH1YqHQvJVa1duWc73OyVGJUc05fhFaTZeQ/PYsrmyH0JVA==",
+          "dev": true,
+          "requires": {
+            "through": "2"
+          }
+        },
+        "stream-combiner": {
+          "version": "0.0.4",
+          "resolved": "https://registry.npmjs.org/stream-combiner/-/stream-combiner-0.0.4.tgz",
+          "integrity": "sha512-rT00SPnTVyRsaSz5zgSPma/aHSOic5U1prhYdRy5HS2kTZviFpmDgzilbtsJsxiroqACmayynDN/9VzIbX5DOw==",
+          "dev": true,
+          "requires": {
+            "duplexer": "~0.1.1"
+          }
         }
       }
     },
         }
       }
     },
-    "request-progress": {
-      "version": "3.0.0",
-      "resolved": "https://registry.npmjs.org/request-progress/-/request-progress-3.0.0.tgz",
-      "integrity": "sha512-MnWzEHHaxHO2iWiQuHrUPBi/1WeBf5PkxQqNyNvLl9VAYSdXkP8tQ3pBSeCPD+yw0v0Aq1zosWLz0BdeXpWwZg==",
+    "psl": {
+      "version": "1.9.0",
+      "resolved": "https://registry.npmjs.org/psl/-/psl-1.9.0.tgz",
+      "integrity": "sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag==",
+      "dev": true
+    },
+    "public-encrypt": {
+      "version": "4.0.3",
+      "resolved": "https://registry.npmjs.org/public-encrypt/-/public-encrypt-4.0.3.tgz",
+      "integrity": "sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q==",
       "dev": true,
       "requires": {
       "dev": true,
       "requires": {
-        "throttleit": "^1.0.0"
+        "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"
+      },
+      "dependencies": {
+        "bn.js": {
+          "version": "4.12.0",
+          "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz",
+          "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==",
+          "dev": true
+        }
       }
     },
       }
     },
-    "request-promise-core": {
-      "version": "1.1.4",
-      "resolved": "https://registry.npmjs.org/request-promise-core/-/request-promise-core-1.1.4.tgz",
-      "integrity": "sha512-TTbAfBBRdWD7aNNOoVOBH4pN/KigV6LyapYNNlAPA8JwbovRti1E88m3sYAwsLi5ryhPKsE9APwnjFTgdUjTpw==",
-      "dev": true,
+    "pump": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz",
+      "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==",
       "requires": {
       "requires": {
-        "lodash": "^4.17.19"
+        "end-of-stream": "^1.1.0",
+        "once": "^1.3.1"
       }
     },
       }
     },
-    "request-promise-native": {
-      "version": "1.0.9",
-      "resolved": "https://registry.npmjs.org/request-promise-native/-/request-promise-native-1.0.9.tgz",
-      "integrity": "sha512-wcW+sIUiWnKgNY0dqCpOZkUbF/I+YPi+f09JZIDa39Ec+q82CpSYniDp+ISgTTbKmnpJWASeJBPZmoxH84wt3g==",
-      "dev": true,
+    "punycode": {
+      "version": "1.3.2",
+      "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz",
+      "integrity": "sha512-RofWgt/7fL5wP1Y7fxE7/EmTLzQVnB0ycyibJ0OOHIlJqTNzglYFxVwETOcIoJqJmpDXJ9xImDv+Fq34F/d4Dw=="
+    },
+    "qs": {
+      "version": "6.11.0",
+      "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz",
+      "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==",
       "requires": {
       "requires": {
-        "request-promise-core": "1.1.4",
-        "stealthy-require": "^1.1.1",
-        "tough-cookie": "^2.3.3"
+        "side-channel": "^1.0.4"
       }
     },
       }
     },
-    "require-directory": {
-      "version": "2.1.1",
-      "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz",
-      "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q=="
+    "querystring": {
+      "version": "0.2.0",
+      "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz",
+      "integrity": "sha512-X/xY82scca2tau62i9mDyU9K+I+djTMUsvwf7xnUX5GLvVzgJybOJf4Y6o9Zx3oJK/LSXg5tTZBjwzqVPaPO2g=="
     },
     },
-    "require-from-string": {
-      "version": "2.0.2",
-      "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz",
-      "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==",
+    "querystring-es3": {
+      "version": "0.2.1",
+      "resolved": "https://registry.npmjs.org/querystring-es3/-/querystring-es3-0.2.1.tgz",
+      "integrity": "sha512-773xhDQnZBMFobEiztv8LIl70ch5MSF/jUQVlhwFyBILqq96anmoctVIYz+ZRp0qbCKATTn6ev02M3r7Ga5vqA==",
       "dev": true
     },
       "dev": true
     },
-    "require-main-filename": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz",
-      "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==",
-      "dev": true
+    "querystringify": {
+      "version": "2.2.0",
+      "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.2.0.tgz",
+      "integrity": "sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ=="
     },
     },
-    "requires-port": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz",
-      "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ=="
+    "queue-microtask": {
+      "version": "1.2.3",
+      "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz",
+      "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==",
+      "dev": true
     },
     },
-    "reselect": {
-      "version": "4.1.6",
-      "resolved": "https://registry.npmjs.org/reselect/-/reselect-4.1.6.tgz",
-      "integrity": "sha512-ZovIuXqto7elwnxyXbBtCPo9YFEr3uJqj2rRbcOOog1bmu2Ag85M4hixSwFWyaBMKXNgvPaJ9OSu9SkBPIeJHQ=="
+    "quick-lru": {
+      "version": "4.0.1",
+      "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-4.0.1.tgz",
+      "integrity": "sha512-ARhCpm70fzdcvNQfPoy49IaanKkTlRWF2JMzqhcJbhSFRZv7nPTvZJdcY7301IPmvW+/p0RgIWnQDLJxifsQ7g==",
+      "dev": true
     },
     },
-    "resolve": {
-      "version": "1.22.1",
-      "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.1.tgz",
-      "integrity": "sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==",
+    "quote-stream": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/quote-stream/-/quote-stream-1.0.2.tgz",
+      "integrity": "sha512-kKr2uQ2AokadPjvTyKJQad9xELbZwYzWlNfI3Uz2j/ib5u6H9lDP7fUUR//rMycd0gv4Z5P1qXMfXR8YpIxrjQ==",
+      "dev": true,
       "requires": {
       "requires": {
-        "is-core-module": "^2.9.0",
-        "path-parse": "^1.0.7",
-        "supports-preserve-symlinks-flag": "^1.0.0"
+        "buffer-equal": "0.0.1",
+        "minimist": "^1.1.3",
+        "through2": "^2.0.0"
       }
     },
       }
     },
-    "resolve-as-bin": {
-      "version": "2.1.0",
-      "resolved": "https://registry.npmjs.org/resolve-as-bin/-/resolve-as-bin-2.1.0.tgz",
-      "integrity": "sha512-ileUuPIOP+xj+GS/d/EbB2XqRA8T2IeZTFkMggNIW2Mo72VyBMbq+HvIAxdW0ED9D44aEzJwHvUtbMm2PJT5Kw==",
-      "dev": true,
+    "ramda": {
+      "version": "0.28.0",
+      "resolved": "https://registry.npmjs.org/ramda/-/ramda-0.28.0.tgz",
+      "integrity": "sha512-9QnLuG/kPVgWvMQ4aODhsBUFKOUmnbUnsSXACv+NCQZcHbeb+v8Lodp8OVxtRULN1/xOyYLLaL6npE6dMq5QTA=="
+    },
+    "ramda-adjunct": {
+      "version": "3.4.0",
+      "resolved": "https://registry.npmjs.org/ramda-adjunct/-/ramda-adjunct-3.4.0.tgz",
+      "integrity": "sha512-qKRgqwZzJUZmPJfGK8/uLVxQXkiftKhW6FW9NUCUlQrzsBUZBvFAZUxwH7nTRwDMg+ChRU69rVVuS/4EUgtuIg=="
+    },
+    "randexp": {
+      "version": "0.5.3",
+      "resolved": "https://registry.npmjs.org/randexp/-/randexp-0.5.3.tgz",
+      "integrity": "sha512-U+5l2KrcMNOUPYvazA3h5ekF80FHTUG+87SEAmHZmolh1M+i/WyTCxVzmi+tidIa1tM4BSe8g2Y/D3loWDjj+w==",
       "requires": {
       "requires": {
-        "cross-spawn": "^6.0.5"
+        "drange": "^1.0.2",
+        "ret": "^0.2.0"
       }
     },
       }
     },
-    "resolve-cwd": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-2.0.0.tgz",
-      "integrity": "sha512-ccu8zQTrzVr954472aUVPLEcB3YpKSYR3cg/3lo1okzobPBM+1INXBbBZlDbnI/hbEocnf8j0QVo43hQKrbchg==",
-      "dev": true,
+    "randombytes": {
+      "version": "2.1.0",
+      "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz",
+      "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==",
       "requires": {
       "requires": {
-        "resolve-from": "^3.0.0"
-      },
-      "dependencies": {
-        "resolve-from": {
-          "version": "3.0.0",
-          "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz",
-          "integrity": "sha512-GnlH6vxLymXJNMBo7XP1fJIzBFbdYt49CuTwmB/6N53t+kMPRMFKz783LlQ4tv28XoQfMWinAJX6WCGf2IlaIw==",
-          "dev": true
-        }
+        "safe-buffer": "^5.1.0"
       }
     },
       }
     },
-    "resolve-dir": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/resolve-dir/-/resolve-dir-1.0.1.tgz",
-      "integrity": "sha512-R7uiTjECzvOsWSfdM0QKFNBVFcK27aHOUwdvK53BcW8zqnGdYp0Fbj82cy54+2A4P2tFM22J5kRfe1R+lM/1yg==",
+    "randomfill": {
+      "version": "1.0.4",
+      "resolved": "https://registry.npmjs.org/randomfill/-/randomfill-1.0.4.tgz",
+      "integrity": "sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw==",
       "dev": true,
       "requires": {
       "dev": true,
       "requires": {
-        "expand-tilde": "^2.0.0",
-        "global-modules": "^1.0.0"
+        "randombytes": "^2.0.5",
+        "safe-buffer": "^5.1.0"
       }
     },
       }
     },
-    "resolve-from": {
-      "version": "4.0.0",
-      "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz",
-      "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==",
-      "dev": true
-    },
-    "resolve-url": {
-      "version": "0.2.1",
-      "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz",
-      "integrity": "sha512-ZuF55hVUQaaczgOIwqWzkEcEidmlD/xl44x1UZnhOXcYuFN2S6+rcxpG+C1N3So0wvNI3DmJICUFfu2SxhBmvg==",
+    "range-parser": {
+      "version": "1.2.1",
+      "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz",
+      "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==",
       "dev": true
     },
       "dev": true
     },
-    "resolve-url-loader": {
-      "version": "4.0.0",
-      "resolved": "https://registry.npmjs.org/resolve-url-loader/-/resolve-url-loader-4.0.0.tgz",
-      "integrity": "sha512-05VEMczVREcbtT7Bz+C+96eUO5HDNvdthIiMB34t7FcF8ehcu4wC0sSgPUubs3XW2Q3CNLJk/BJrCU9wVRymiA==",
+    "raw-body": {
+      "version": "2.5.1",
+      "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.1.tgz",
+      "integrity": "sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==",
       "dev": true,
       "requires": {
       "dev": true,
       "requires": {
-        "adjust-sourcemap-loader": "^4.0.0",
-        "convert-source-map": "^1.7.0",
-        "loader-utils": "^2.0.0",
-        "postcss": "^7.0.35",
-        "source-map": "0.6.1"
+        "bytes": "3.1.2",
+        "http-errors": "2.0.0",
+        "iconv-lite": "0.4.24",
+        "unpipe": "1.0.0"
       },
       "dependencies": {
       },
       "dependencies": {
-        "picocolors": {
-          "version": "0.2.1",
-          "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz",
-          "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==",
-          "dev": true
-        },
-        "postcss": {
-          "version": "7.0.39",
-          "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz",
-          "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==",
-          "dev": true,
-          "requires": {
-            "picocolors": "^0.2.1",
-            "source-map": "^0.6.1"
-          }
-        },
-        "source-map": {
-          "version": "0.6.1",
-          "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
-          "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+        "bytes": {
+          "version": "3.1.2",
+          "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz",
+          "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==",
           "dev": true
         }
       }
     },
           "dev": true
         }
       }
     },
-    "restore-cursor": {
-      "version": "3.1.0",
-      "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz",
-      "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==",
-      "dev": true,
+    "rc": {
+      "version": "1.2.8",
+      "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz",
+      "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==",
+      "optional": true,
       "requires": {
       "requires": {
-        "onetime": "^5.1.0",
-        "signal-exit": "^3.0.2"
+        "deep-extend": "^0.6.0",
+        "ini": "~1.3.0",
+        "minimist": "^1.2.0",
+        "strip-json-comments": "~2.0.1"
       }
     },
       }
     },
-    "ret": {
-      "version": "0.2.2",
-      "resolved": "https://registry.npmjs.org/ret/-/ret-0.2.2.tgz",
-      "integrity": "sha512-M0b3YWQs7R3Z917WRQy1HHA7Ba7D8hvZg6UE5mLykJxQVE2ju0IXbGlaHPPlkY+WN7wFP+wUMXmBFA0aV6vYGQ=="
-    },
-    "retry": {
-      "version": "0.12.0",
-      "resolved": "https://registry.npmjs.org/retry/-/retry-0.12.0.tgz",
-      "integrity": "sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow==",
-      "dev": true
-    },
-    "reusify": {
-      "version": "1.0.4",
-      "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz",
-      "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==",
-      "dev": true
+    "react": {
+      "version": "17.0.2",
+      "resolved": "https://registry.npmjs.org/react/-/react-17.0.2.tgz",
+      "integrity": "sha512-gnhPt75i/dq/z3/6q/0asP78D0u592D5L1pd7M8P+dck6Fu/jJeL6iVVK23fptSUZj8Vjf++7wXA8UNclGQcbA==",
+      "requires": {
+        "loose-envify": "^1.1.0",
+        "object-assign": "^4.1.1"
+      }
     },
     },
-    "rfdc": {
-      "version": "1.3.0",
-      "resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.3.0.tgz",
-      "integrity": "sha512-V2hovdzFbOi77/WajaSMXk2OLm+xNIeQdMMuB7icj7bk6zi2F8GGAxigcnDFpJHbNyNcgyJDiP+8nOrY5cZGrA==",
-      "dev": true
+    "react-copy-to-clipboard": {
+      "version": "5.0.4",
+      "resolved": "https://registry.npmjs.org/react-copy-to-clipboard/-/react-copy-to-clipboard-5.0.4.tgz",
+      "integrity": "sha512-IeVAiNVKjSPeGax/Gmkqfa/+PuMTBhutEvFUaMQLwE2tS0EXrAdgOpWDX26bWTXF3HrioorR7lr08NqeYUWQCQ==",
+      "requires": {
+        "copy-to-clipboard": "^3",
+        "prop-types": "^15.5.8"
+      }
     },
     },
-    "rimraf": {
-      "version": "3.0.2",
-      "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz",
-      "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==",
-      "dev": true,
+    "react-debounce-input": {
+      "version": "3.2.4",
+      "resolved": "https://registry.npmjs.org/react-debounce-input/-/react-debounce-input-3.2.4.tgz",
+      "integrity": "sha512-fX70bNj0fLEYO2Zcvuh7eh9wOUQ29GIx6r8IxIJlc0i0mpUH++9ax0BhfAYfzndADli3RAMROrZQ014J01owrg==",
       "requires": {
       "requires": {
-        "glob": "^7.1.3"
+        "lodash.debounce": "^4",
+        "prop-types": "^15.7.2"
       }
     },
       }
     },
-    "ripemd160": {
-      "version": "2.0.2",
-      "resolved": "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.2.tgz",
-      "integrity": "sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==",
-      "dev": true,
+    "react-dom": {
+      "version": "17.0.2",
+      "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-17.0.2.tgz",
+      "integrity": "sha512-s4h96KtLDUQlsENhMn1ar8t2bEa+q/YAtj8pPPdIjPDGBDIVNsrD9aXNWqspUe6AzKCIG0C1HZZLqLV7qpOBGA==",
       "requires": {
       "requires": {
-        "hash-base": "^3.0.0",
-        "inherits": "^2.0.1"
+        "loose-envify": "^1.1.0",
+        "object-assign": "^4.1.1",
+        "scheduler": "^0.20.2"
       }
     },
       }
     },
-    "rsvp": {
-      "version": "4.8.5",
-      "resolved": "https://registry.npmjs.org/rsvp/-/rsvp-4.8.5.tgz",
-      "integrity": "sha512-nfMOlASu9OnRJo1mbEk2cz0D56a1MBNrJ7orjRZQG10XDyuvwksKbuXNp6qa+kbn839HwjwhBzhFmdsaEAfauA==",
-      "dev": true
+    "react-immutable-proptypes": {
+      "version": "2.2.0",
+      "resolved": "https://registry.npmjs.org/react-immutable-proptypes/-/react-immutable-proptypes-2.2.0.tgz",
+      "integrity": "sha512-Vf4gBsePlwdGvSZoLSBfd4HAP93HDauMY4fDjXhreg/vg6F3Fj/MXDNyTbltPC/xZKmZc+cjLu3598DdYK6sgQ==",
+      "requires": {
+        "invariant": "^2.2.2"
+      }
     },
     },
-    "run-async": {
-      "version": "2.4.1",
-      "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.4.1.tgz",
-      "integrity": "sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==",
-      "dev": true
+    "react-immutable-pure-component": {
+      "version": "2.2.2",
+      "resolved": "https://registry.npmjs.org/react-immutable-pure-component/-/react-immutable-pure-component-2.2.2.tgz",
+      "integrity": "sha512-vkgoMJUDqHZfXXnjVlG3keCxSO/U6WeDQ5/Sl0GK2cH8TOxEzQ5jXqDXHEL/jqk6fsNxV05oH5kD7VNMUE2k+A=="
     },
     },
-    "run-parallel": {
-      "version": "1.2.0",
-      "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz",
-      "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==",
-      "dev": true,
+    "react-inspector": {
+      "version": "5.1.1",
+      "resolved": "https://registry.npmjs.org/react-inspector/-/react-inspector-5.1.1.tgz",
+      "integrity": "sha512-GURDaYzoLbW8pMGXwYPDBIv6nqei4kK7LPRZ9q9HCZF54wqXz/dnylBp/kfE9XmekBhHvLDdcYeyIwSrvtOiWg==",
       "requires": {
       "requires": {
-        "queue-microtask": "^1.2.2"
+        "@babel/runtime": "^7.0.0",
+        "is-dom": "^1.0.0",
+        "prop-types": "^15.0.0"
       }
     },
       }
     },
-    "rxjs": {
-      "version": "6.6.3",
-      "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.3.tgz",
-      "integrity": "sha512-trsQc+xYYXZ3urjOiJOuCOa5N3jAZ3eiSpQB5hIT8zGlL2QfnHLJ2r7GMkBGuIausdJN1OneaI6gQlsqNHHmZQ==",
+    "react-is": {
+      "version": "16.13.1",
+      "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz",
+      "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ=="
+    },
+    "react-redux": {
+      "version": "7.2.9",
+      "resolved": "https://registry.npmjs.org/react-redux/-/react-redux-7.2.9.tgz",
+      "integrity": "sha512-Gx4L3uM182jEEayZfRbI/G11ZpYdNAnBs70lFVMNdHJI76XYtR+7m0MN+eAs7UHBPhWXcnFPaS+9owSCJQHNpQ==",
       "requires": {
       "requires": {
-        "tslib": "^1.9.0"
+        "@babel/runtime": "^7.15.4",
+        "@types/react-redux": "^7.1.20",
+        "hoist-non-react-statics": "^3.3.2",
+        "loose-envify": "^1.4.0",
+        "prop-types": "^15.7.2",
+        "react-is": "^17.0.2"
       },
       "dependencies": {
       },
       "dependencies": {
-        "tslib": {
-          "version": "1.14.1",
-          "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz",
-          "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg=="
+        "react-is": {
+          "version": "17.0.2",
+          "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz",
+          "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w=="
         }
       }
     },
         }
       }
     },
-    "safe-buffer": {
-      "version": "5.1.2",
-      "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz",
-      "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g=="
+    "react-syntax-highlighter": {
+      "version": "15.5.0",
+      "resolved": "https://registry.npmjs.org/react-syntax-highlighter/-/react-syntax-highlighter-15.5.0.tgz",
+      "integrity": "sha512-+zq2myprEnQmH5yw6Gqc8lD55QHnpKaU8TOcFeC/Lg/MQSs8UknEA0JC4nTZGFAXC2J2Hyj/ijJ7NlabyPi2gg==",
+      "requires": {
+        "@babel/runtime": "^7.3.1",
+        "highlight.js": "^10.4.1",
+        "lowlight": "^1.17.0",
+        "prismjs": "^1.27.0",
+        "refractor": "^3.6.0"
+      }
     },
     },
-    "safe-regex": {
-      "version": "1.1.0",
-      "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz",
-      "integrity": "sha512-aJXcif4xnaNUzvUuC5gcb46oTS7zvg4jpMTnuqtrEPlR3vFr4pxtdTwaF1Qs3Enjn9HK+ZlwQui+a7z0SywIzg==",
+    "read-cache": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz",
+      "integrity": "sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==",
       "dev": true,
       "requires": {
       "dev": true,
       "requires": {
-        "ret": "~0.1.10"
+        "pify": "^2.3.0"
       },
       "dependencies": {
       },
       "dependencies": {
-        "ret": {
-          "version": "0.1.15",
-          "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz",
-          "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==",
+        "pify": {
+          "version": "2.3.0",
+          "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz",
+          "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==",
           "dev": true
         }
       }
     },
           "dev": true
         }
       }
     },
-    "safer-buffer": {
-      "version": "2.1.2",
-      "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz",
-      "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==",
-      "dev": true
+    "read-only-stream": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/read-only-stream/-/read-only-stream-2.0.0.tgz",
+      "integrity": "sha512-3ALe0bjBVZtkdWKIcThYpQCLbBMd/+Tbh2CDSrAIDO3UsZ4Xs+tnyjv2MjCOMMgBG+AsUOeuP1cgtY1INISc8w==",
+      "dev": true,
+      "requires": {
+        "readable-stream": "^2.0.2"
+      }
     },
     },
-    "sane": {
-      "version": "4.1.0",
-      "resolved": "https://registry.npmjs.org/sane/-/sane-4.1.0.tgz",
-      "integrity": "sha512-hhbzAgTIX8O7SHfp2c8/kREfEn4qO/9q8C9beyY6+tvZ87EpoZ3i1RIEvp27YBswnNbY9mWd6paKVmKbAgLfZA==",
+    "read-package-json-fast": {
+      "version": "2.0.3",
+      "resolved": "https://registry.npmjs.org/read-package-json-fast/-/read-package-json-fast-2.0.3.tgz",
+      "integrity": "sha512-W/BKtbL+dUjTuRL2vziuYhp76s5HZ9qQhd/dKfWIZveD0O40453QNyZhC0e63lqZrAQ4jiOapVoeJ7JrszenQQ==",
       "dev": true,
       "requires": {
       "dev": true,
       "requires": {
-        "@cnakazawa/watch": "^1.0.3",
-        "anymatch": "^2.0.0",
-        "capture-exit": "^2.0.0",
-        "exec-sh": "^0.3.2",
-        "execa": "^1.0.0",
-        "fb-watchman": "^2.0.0",
-        "micromatch": "^3.1.4",
-        "minimist": "^1.1.1",
-        "walker": "~1.0.5"
+        "json-parse-even-better-errors": "^2.3.0",
+        "npm-normalize-package-bin": "^1.0.1"
+      }
+    },
+    "read-pkg": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-3.0.0.tgz",
+      "integrity": "sha512-BLq/cCO9two+lBgiTYNqD6GdtK8s4NpaWrl6/rCO9w0TUS8oJl7cmToOZfRYllKTISY6nt1U7jQ53brmKqY6BA==",
+      "dev": true,
+      "requires": {
+        "load-json-file": "^4.0.0",
+        "normalize-package-data": "^2.3.2",
+        "path-type": "^3.0.0"
       },
       "dependencies": {
       },
       "dependencies": {
-        "anymatch": {
-          "version": "2.0.0",
-          "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz",
-          "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==",
-          "dev": true,
-          "requires": {
-            "micromatch": "^3.1.4",
-            "normalize-path": "^2.1.1"
-          }
-        },
-        "braces": {
-          "version": "2.3.2",
-          "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz",
-          "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==",
-          "dev": true,
-          "requires": {
-            "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"
-          },
-          "dependencies": {
-            "extend-shallow": {
-              "version": "2.0.1",
-              "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
-              "integrity": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==",
-              "dev": true,
-              "requires": {
-                "is-extendable": "^0.1.0"
-              }
-            }
-          }
-        },
-        "fill-range": {
-          "version": "4.0.0",
-          "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz",
-          "integrity": "sha512-VcpLTWqWDiTerugjj8e3+esbg+skS3M9e54UuR3iCeIDMXCLTsAH8hTSzDQU/X6/6t3eYkOKoZSef2PlU6U1XQ==",
+        "path-type": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz",
+          "integrity": "sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==",
           "dev": true,
           "requires": {
           "dev": true,
           "requires": {
-            "extend-shallow": "^2.0.1",
-            "is-number": "^3.0.0",
-            "repeat-string": "^1.6.1",
-            "to-regex-range": "^2.1.0"
-          },
-          "dependencies": {
-            "extend-shallow": {
-              "version": "2.0.1",
-              "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
-              "integrity": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==",
-              "dev": true,
-              "requires": {
-                "is-extendable": "^0.1.0"
-              }
-            }
+            "pify": "^3.0.0"
           }
         },
           }
         },
-        "is-number": {
+        "pify": {
           "version": "3.0.0",
           "version": "3.0.0",
-          "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz",
-          "integrity": "sha512-4cboCqIpliH+mAvFNegjZQ4kgKc3ZUhQVr3HvWbSh5q3WH2v82ct+T2Y1hdU5Gdtorx/cLifQjqCbL7bpznLTg==",
+          "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz",
+          "integrity": "sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg==",
+          "dev": true
+        }
+      }
+    },
+    "read-pkg-up": {
+      "version": "7.0.1",
+      "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-7.0.1.tgz",
+      "integrity": "sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==",
+      "dev": true,
+      "requires": {
+        "find-up": "^4.1.0",
+        "read-pkg": "^5.2.0",
+        "type-fest": "^0.8.1"
+      },
+      "dependencies": {
+        "read-pkg": {
+          "version": "5.2.0",
+          "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz",
+          "integrity": "sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==",
           "dev": true,
           "requires": {
           "dev": true,
           "requires": {
-            "kind-of": "^3.0.2"
+            "@types/normalize-package-data": "^2.4.0",
+            "normalize-package-data": "^2.5.0",
+            "parse-json": "^5.0.0",
+            "type-fest": "^0.6.0"
           },
           "dependencies": {
           },
           "dependencies": {
-            "kind-of": {
-              "version": "3.2.2",
-              "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
-              "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==",
-              "dev": true,
-              "requires": {
-                "is-buffer": "^1.1.5"
-              }
+            "type-fest": {
+              "version": "0.6.0",
+              "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz",
+              "integrity": "sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==",
+              "dev": true
             }
           }
         },
             }
           }
         },
-        "micromatch": {
-          "version": "3.1.10",
-          "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz",
-          "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==",
-          "dev": true,
-          "requires": {
-            "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"
-          }
-        },
-        "normalize-path": {
-          "version": "2.1.1",
-          "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz",
-          "integrity": "sha512-3pKJwH184Xo/lnH6oyP1q2pMd7HcypqqmRs91/6/i2CGtWwIKGCkOOMTm/zXbgTEWHw1uNpNi/igc3ePOYHb6w==",
-          "dev": true,
-          "requires": {
-            "remove-trailing-separator": "^1.0.1"
-          }
-        },
-        "to-regex-range": {
-          "version": "2.1.1",
-          "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz",
-          "integrity": "sha512-ZZWNfCjUokXXDGXFpZehJIkZqq91BcULFq/Pi7M5i4JnxXdhMKAK682z8bCW3o8Hj1wuuzoKcW3DfVzaP6VuNg==",
-          "dev": true,
-          "requires": {
-            "is-number": "^3.0.0",
-            "repeat-string": "^1.6.1"
-          }
+        "type-fest": {
+          "version": "0.8.1",
+          "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz",
+          "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==",
+          "dev": true
+        }
+      }
+    },
+    "readable-stream": {
+      "version": "2.3.8",
+      "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz",
+      "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==",
+      "requires": {
+        "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"
+      },
+      "dependencies": {
+        "safe-buffer": {
+          "version": "5.1.2",
+          "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz",
+          "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g=="
+        }
+      }
+    },
+    "readdirp": {
+      "version": "3.6.0",
+      "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz",
+      "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==",
+      "dev": true,
+      "requires": {
+        "picomatch": "^2.2.1"
+      }
+    },
+    "rechoir": {
+      "version": "0.6.2",
+      "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz",
+      "integrity": "sha512-HFM8rkZ+i3zrV+4LQjwQ0W+ez98pApMGM3HUrN04j3CqzPOzl9nmP15Y8YXNm8QHGv/eacOVEjqhmWpkRV0NAw==",
+      "dev": true,
+      "requires": {
+        "resolve": "^1.1.6"
+      }
+    },
+    "redent": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/redent/-/redent-3.0.0.tgz",
+      "integrity": "sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==",
+      "dev": true,
+      "requires": {
+        "indent-string": "^4.0.0",
+        "strip-indent": "^3.0.0"
+      }
+    },
+    "redux": {
+      "version": "4.2.1",
+      "resolved": "https://registry.npmjs.org/redux/-/redux-4.2.1.tgz",
+      "integrity": "sha512-LAUYz4lc+Do8/g7aeRa8JkyDErK6ekstQaqWQrNRW//MY1TvCEpMtpTWvlQ+FPbWCx+Xixu/6SHt5N0HR+SB4w==",
+      "requires": {
+        "@babel/runtime": "^7.9.2"
+      }
+    },
+    "redux-immutable": {
+      "version": "4.0.0",
+      "resolved": "https://registry.npmjs.org/redux-immutable/-/redux-immutable-4.0.0.tgz",
+      "integrity": "sha512-SchSn/DWfGb3oAejd+1hhHx01xUoxY+V7TeK0BKqpkLKiQPVFf7DYzEaKmrEVxsWxielKfSK9/Xq66YyxgR1cg=="
+    },
+    "reflect-metadata": {
+      "version": "0.1.13",
+      "resolved": "https://registry.npmjs.org/reflect-metadata/-/reflect-metadata-0.1.13.tgz",
+      "integrity": "sha512-Ts1Y/anZELhSsjMcU605fU9RE4Oi3p5ORujwbIKXfWa+0Zxs510Qrmrce5/Jowq3cHSZSJqBjypxmHarc+vEWg==",
+      "dev": true
+    },
+    "refractor": {
+      "version": "3.6.0",
+      "resolved": "https://registry.npmjs.org/refractor/-/refractor-3.6.0.tgz",
+      "integrity": "sha512-MY9W41IOWxxk31o+YvFCNyNzdkc9M20NoZK5vq6jkv4I/uh2zkWcfudj0Q1fovjUQJrNewS9NMzeTtqPf+n5EA==",
+      "requires": {
+        "hastscript": "^6.0.0",
+        "parse-entities": "^2.0.0",
+        "prismjs": "~1.27.0"
+      },
+      "dependencies": {
+        "prismjs": {
+          "version": "1.27.0",
+          "resolved": "https://registry.npmjs.org/prismjs/-/prismjs-1.27.0.tgz",
+          "integrity": "sha512-t13BGPUlFDR7wRB5kQDG4jjl7XeuH6jbJGt11JHPL96qwsEHNX2+68tFXqc1/k+/jALsbSWJKUOT/hcYAZ5LkA=="
         }
       }
     },
         }
       }
     },
-    "sass": {
-      "version": "1.36.0",
-      "resolved": "https://registry.npmjs.org/sass/-/sass-1.36.0.tgz",
-      "integrity": "sha512-fQzEjipfOv5kh930nu3Imzq3ie/sGDc/4KtQMJlt7RRdrkQSfe37Bwi/Rf/gfuYHsIuE1fIlDMvpyMcEwjnPvg==",
+    "regenerate": {
+      "version": "1.4.2",
+      "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz",
+      "integrity": "sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==",
+      "dev": true
+    },
+    "regenerate-unicode-properties": {
+      "version": "10.1.0",
+      "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-10.1.0.tgz",
+      "integrity": "sha512-d1VudCLoIGitcU/hEg2QqvyGZQmdC0Lf8BqdOMXGFSvJP4bNV1+XqbPQeHHLD51Jh4QJJ225dlIFvY4Ly6MXmQ==",
       "dev": true,
       "requires": {
       "dev": true,
       "requires": {
-        "chokidar": ">=3.0.0 <4.0.0"
+        "regenerate": "^1.4.2"
       }
     },
       }
     },
-    "sass-loader": {
-      "version": "12.1.0",
-      "resolved": "https://registry.npmjs.org/sass-loader/-/sass-loader-12.1.0.tgz",
-      "integrity": "sha512-FVJZ9kxVRYNZTIe2xhw93n3xJNYZADr+q69/s98l9nTCrWASo+DR2Ot0s5xTKQDDEosUkatsGeHxcH4QBp5bSg==",
+    "regenerator-runtime": {
+      "version": "0.13.11",
+      "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz",
+      "integrity": "sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg=="
+    },
+    "regenerator-transform": {
+      "version": "0.15.1",
+      "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.15.1.tgz",
+      "integrity": "sha512-knzmNAcuyxV+gQCufkYcvOqX/qIIfHLv0u5x79kRxuGojfYVky1f15TzZEu2Avte8QGepvUNTnLskf8E6X6Vyg==",
       "dev": true,
       "requires": {
       "dev": true,
       "requires": {
-        "klona": "^2.0.4",
-        "neo-async": "^2.6.2"
+        "@babel/runtime": "^7.8.4"
       }
     },
       }
     },
-    "sax": {
-      "version": "1.2.4",
-      "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz",
-      "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==",
+    "regex-not": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz",
+      "integrity": "sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==",
+      "dev": true,
+      "requires": {
+        "extend-shallow": "^3.0.2",
+        "safe-regex": "^1.1.0"
+      }
+    },
+    "regex-parser": {
+      "version": "2.2.11",
+      "resolved": "https://registry.npmjs.org/regex-parser/-/regex-parser-2.2.11.tgz",
+      "integrity": "sha512-jbD/FT0+9MBU2XAZluI7w2OBs1RBi6p9M83nkoZayQXXU9e8Robt69FcZc7wU4eJD/YFTjn1JdCk3rbMJajz8Q==",
       "dev": true
     },
       "dev": true
     },
-    "saxes": {
-      "version": "3.1.11",
-      "resolved": "https://registry.npmjs.org/saxes/-/saxes-3.1.11.tgz",
-      "integrity": "sha512-Ydydq3zC+WYDJK1+gRxRapLIED9PWeSuuS41wqyoRmzvhhh9nc+QQrVMKJYzJFULazeGhzSV0QleN2wD3boh2g==",
+    "regexp.prototype.flags": {
+      "version": "1.4.3",
+      "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.4.3.tgz",
+      "integrity": "sha512-fjggEOO3slI6Wvgjwflkc4NFRCTZAu5CnNfBd5qOMYhWdn67nJBBu34/TkD++eeFmd8C9r9jfXJ27+nSiRkSUA==",
       "dev": true,
       "requires": {
       "dev": true,
       "requires": {
-        "xmlchars": "^2.1.1"
+        "call-bind": "^1.0.2",
+        "define-properties": "^1.1.3",
+        "functions-have-names": "^1.2.2"
       }
     },
       }
     },
-    "scheduler": {
-      "version": "0.20.2",
-      "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.20.2.tgz",
-      "integrity": "sha512-2eWfGgAqqWFGqtdMmcL5zCMK1U8KlXv8SQFGglL3CEtd0aDVDWgeF/YoCmvln55m5zSk3J/20hTaSBeSObsQDQ==",
+    "regexpp": {
+      "version": "3.2.0",
+      "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.2.0.tgz",
+      "integrity": "sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==",
+      "dev": true
+    },
+    "regexpu-core": {
+      "version": "5.3.1",
+      "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-5.3.1.tgz",
+      "integrity": "sha512-nCOzW2V/X15XpLsK2rlgdwrysrBq+AauCn+omItIz4R1pIcmeot5zvjdmOBRLzEH/CkC6IxMJVmxDe3QcMuNVQ==",
+      "dev": true,
       "requires": {
       "requires": {
-        "loose-envify": "^1.1.0",
-        "object-assign": "^4.1.1"
+        "@babel/regjsgen": "^0.8.0",
+        "regenerate": "^1.4.2",
+        "regenerate-unicode-properties": "^10.1.0",
+        "regjsparser": "^0.9.1",
+        "unicode-match-property-ecmascript": "^2.0.0",
+        "unicode-match-property-value-ecmascript": "^2.1.0"
       }
     },
       }
     },
-    "schema-utils": {
-      "version": "2.7.1",
-      "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.7.1.tgz",
-      "integrity": "sha512-SHiNtMOUGWBQJwzISiVYKu82GiV4QYGePp3odlY1tuKO7gPtphAT5R/py0fA6xtbgLL/RvtJZnU9b8s0F1q0Xg==",
+    "regjsparser": {
+      "version": "0.9.1",
+      "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.9.1.tgz",
+      "integrity": "sha512-dQUtn90WanSNl+7mQKcXAgZxvUe7Z0SqXlgzv0za4LwiUhyzBC58yQO3liFoUgu8GiJVInAhJjkj1N0EtQ5nkQ==",
       "dev": true,
       "requires": {
       "dev": true,
       "requires": {
-        "@types/json-schema": "^7.0.5",
-        "ajv": "^6.12.4",
-        "ajv-keywords": "^3.5.2"
+        "jsesc": "~0.5.0"
       },
       "dependencies": {
       },
       "dependencies": {
-        "ajv": {
-          "version": "6.12.6",
-          "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz",
-          "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==",
-          "dev": true,
-          "requires": {
-            "fast-deep-equal": "^3.1.1",
-            "fast-json-stable-stringify": "^2.0.0",
-            "json-schema-traverse": "^0.4.1",
-            "uri-js": "^4.2.2"
-          }
-        },
-        "json-schema-traverse": {
-          "version": "0.4.1",
-          "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz",
-          "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==",
+        "jsesc": {
+          "version": "0.5.0",
+          "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz",
+          "integrity": "sha512-uZz5UnB7u4T9LvwmFqXii7pZSouaRPorGs5who1Ip7VO0wxanFvBL7GkM6dTHlgX+jhBApRetaWpnDabOeTcnA==",
           "dev": true
         }
       }
     },
           "dev": true
         }
       }
     },
-    "scope-analyzer": {
-      "version": "2.1.2",
-      "resolved": "https://registry.npmjs.org/scope-analyzer/-/scope-analyzer-2.1.2.tgz",
-      "integrity": "sha512-5cfCmsTYV/wPaRIItNxatw02ua/MThdIUNnUOCYp+3LSEJvnG804ANw2VLaavNILIfWXF1D1G2KNANkBBvInwQ==",
+    "remark": {
+      "version": "13.0.0",
+      "resolved": "https://registry.npmjs.org/remark/-/remark-13.0.0.tgz",
+      "integrity": "sha512-HDz1+IKGtOyWN+QgBiAT0kn+2s6ovOxHyPAFGKVE81VSzJ+mq7RwHFledEvB5F1p4iJvOah/LOKdFuzvRnNLCA==",
       "dev": true,
       "requires": {
       "dev": true,
       "requires": {
-        "array-from": "^2.1.1",
-        "dash-ast": "^2.0.1",
-        "es6-map": "^0.1.5",
-        "es6-set": "^0.1.5",
-        "es6-symbol": "^3.1.1",
-        "estree-is-function": "^1.0.0",
-        "get-assigned-identifiers": "^1.1.0"
+        "remark-parse": "^9.0.0",
+        "remark-stringify": "^9.0.0",
+        "unified": "^9.1.0"
       }
     },
       }
     },
-    "seed-random": {
-      "version": "2.2.0",
-      "resolved": "https://registry.npmjs.org/seed-random/-/seed-random-2.2.0.tgz",
-      "integrity": "sha512-34EQV6AAHQGhoc0tn/96a9Fsi6v2xdqe/dMUwljGRaFOzR3EgRmECvD0O8vi8X+/uQ50LGHfkNu/Eue5TPKZkQ==",
-      "dev": true
+    "remark-parse": {
+      "version": "9.0.0",
+      "resolved": "https://registry.npmjs.org/remark-parse/-/remark-parse-9.0.0.tgz",
+      "integrity": "sha512-geKatMwSzEXKHuzBNU1z676sGcDcFoChMK38TgdHJNAYfFtsfHDQG7MoJAjs6sgYMqyLduCYWDIWZIxiPeafEw==",
+      "dev": true,
+      "requires": {
+        "mdast-util-from-markdown": "^0.8.0"
+      }
     },
     },
-    "select-hose": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/select-hose/-/select-hose-2.0.0.tgz",
-      "integrity": "sha512-mEugaLK+YfkijB4fx0e6kImuJdCIt2LxCRcbEYPqRGCs4F2ogyfZU5IAZRdjCP8JPq2AtdNoC/Dux63d9Kiryg==",
+    "remark-stringify": {
+      "version": "9.0.1",
+      "resolved": "https://registry.npmjs.org/remark-stringify/-/remark-stringify-9.0.1.tgz",
+      "integrity": "sha512-mWmNg3ZtESvZS8fv5PTvaPckdL4iNlCHTt8/e/8oN08nArHRHjNZMKzA/YW3+p7/lYqIw4nx1XsjCBo/AxNChg==",
+      "dev": true,
+      "requires": {
+        "mdast-util-to-markdown": "^0.6.0"
+      }
+    },
+    "remarkable": {
+      "version": "2.0.1",
+      "resolved": "https://registry.npmjs.org/remarkable/-/remarkable-2.0.1.tgz",
+      "integrity": "sha512-YJyMcOH5lrR+kZdmB0aJJ4+93bEojRZ1HGDn9Eagu6ibg7aVZhc3OWbbShRid+Q5eAfsEqWxpe+g5W5nYNfNiA==",
+      "requires": {
+        "argparse": "^1.0.10",
+        "autolinker": "^3.11.0"
+      },
+      "dependencies": {
+        "argparse": {
+          "version": "1.0.10",
+          "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz",
+          "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==",
+          "requires": {
+            "sprintf-js": "~1.0.2"
+          }
+        }
+      }
+    },
+    "repeat-element": {
+      "version": "1.1.4",
+      "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.4.tgz",
+      "integrity": "sha512-LFiNfRcSu7KK3evMyYOuCzv3L10TW7yC1G2/+StMjK8Y6Vqd2MG7r/Qjw4ghtuCOjFvlnms/iMmLqpvW/ES/WQ==",
       "dev": true
     },
       "dev": true
     },
-    "selfsigned": {
-      "version": "1.10.14",
-      "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-1.10.14.tgz",
-      "integrity": "sha512-lkjaiAye+wBZDCBsu5BGi0XiLRxeUlsGod5ZP924CRSEoGuZAw/f7y9RKu28rwTfiHVhdavhB0qH0INV6P1lEA==",
+    "repeat-string": {
+      "version": "1.6.1",
+      "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz",
+      "integrity": "sha512-PV0dzCYDNfRi1jCDbJzpW7jNNDRuCOG/jI5ctQcGKt/clZD+YcPS3yIlWuTJMmESC8aevCFmWJy5wjAFgNqN6w=="
+    },
+    "request": {
+      "version": "2.88.2",
+      "resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz",
+      "integrity": "sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==",
+      "dev": true,
+      "requires": {
+        "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.3",
+        "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.5.0",
+        "tunnel-agent": "^0.6.0",
+        "uuid": "^3.3.2"
+      },
+      "dependencies": {
+        "form-data": {
+          "version": "2.3.3",
+          "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz",
+          "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==",
+          "dev": true,
+          "requires": {
+            "asynckit": "^0.4.0",
+            "combined-stream": "^1.0.6",
+            "mime-types": "^2.1.12"
+          }
+        },
+        "punycode": {
+          "version": "2.3.0",
+          "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.0.tgz",
+          "integrity": "sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==",
+          "dev": true
+        },
+        "qs": {
+          "version": "6.5.3",
+          "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.3.tgz",
+          "integrity": "sha512-qxXIEh4pCGfHICj1mAJQ2/2XVZkjCDTcEgfoSQxc/fYivUZxTkk7L3bDBJSoNrEzXI17oUO5Dp07ktqE5KzczA==",
+          "dev": true
+        },
+        "tough-cookie": {
+          "version": "2.5.0",
+          "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz",
+          "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==",
+          "dev": true,
+          "requires": {
+            "psl": "^1.1.28",
+            "punycode": "^2.1.1"
+          }
+        },
+        "uuid": {
+          "version": "3.4.0",
+          "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz",
+          "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==",
+          "dev": true
+        }
+      }
+    },
+    "request-progress": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/request-progress/-/request-progress-3.0.0.tgz",
+      "integrity": "sha512-MnWzEHHaxHO2iWiQuHrUPBi/1WeBf5PkxQqNyNvLl9VAYSdXkP8tQ3pBSeCPD+yw0v0Aq1zosWLz0BdeXpWwZg==",
       "dev": true,
       "requires": {
       "dev": true,
       "requires": {
-        "node-forge": "^0.10.0"
+        "throttleit": "^1.0.0"
       }
     },
       }
     },
-    "semver": {
-      "version": "5.7.1",
-      "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz",
-      "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ=="
-    },
-    "semver-dsl": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/semver-dsl/-/semver-dsl-1.0.1.tgz",
-      "integrity": "sha512-e8BOaTo007E3dMuQQTnPdalbKTABKNS7UxoBIDnwOqRa+QwMrCPjynB8zAlPF6xlqUfdLPPLIJ13hJNmhtq8Ng==",
+    "request-promise-core": {
+      "version": "1.1.4",
+      "resolved": "https://registry.npmjs.org/request-promise-core/-/request-promise-core-1.1.4.tgz",
+      "integrity": "sha512-TTbAfBBRdWD7aNNOoVOBH4pN/KigV6LyapYNNlAPA8JwbovRti1E88m3sYAwsLi5ryhPKsE9APwnjFTgdUjTpw==",
       "dev": true,
       "requires": {
       "dev": true,
       "requires": {
-        "semver": "^5.3.0"
+        "lodash": "^4.17.19"
       }
     },
       }
     },
-    "send": {
-      "version": "0.18.0",
-      "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz",
-      "integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==",
+    "request-promise-native": {
+      "version": "1.0.9",
+      "resolved": "https://registry.npmjs.org/request-promise-native/-/request-promise-native-1.0.9.tgz",
+      "integrity": "sha512-wcW+sIUiWnKgNY0dqCpOZkUbF/I+YPi+f09JZIDa39Ec+q82CpSYniDp+ISgTTbKmnpJWASeJBPZmoxH84wt3g==",
       "dev": true,
       "requires": {
       "dev": true,
       "requires": {
-        "debug": "2.6.9",
-        "depd": "2.0.0",
-        "destroy": "1.2.0",
-        "encodeurl": "~1.0.2",
-        "escape-html": "~1.0.3",
-        "etag": "~1.8.1",
-        "fresh": "0.5.2",
-        "http-errors": "2.0.0",
-        "mime": "1.6.0",
-        "ms": "2.1.3",
-        "on-finished": "2.4.1",
-        "range-parser": "~1.2.1",
-        "statuses": "2.0.1"
+        "request-promise-core": "1.1.4",
+        "stealthy-require": "^1.1.1",
+        "tough-cookie": "^2.3.3"
       },
       "dependencies": {
       },
       "dependencies": {
-        "debug": {
-          "version": "2.6.9",
-          "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
-          "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+        "punycode": {
+          "version": "2.3.0",
+          "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.0.tgz",
+          "integrity": "sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==",
+          "dev": true
+        },
+        "tough-cookie": {
+          "version": "2.5.0",
+          "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz",
+          "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==",
           "dev": true,
           "requires": {
           "dev": true,
           "requires": {
-            "ms": "2.0.0"
-          },
-          "dependencies": {
-            "ms": {
-              "version": "2.0.0",
-              "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
-              "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==",
-              "dev": true
-            }
+            "psl": "^1.1.28",
+            "punycode": "^2.1.1"
           }
           }
-        },
-        "ms": {
-          "version": "2.1.3",
-          "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
-          "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==",
-          "dev": true
         }
       }
     },
         }
       }
     },
-    "serialize-error": {
-      "version": "8.1.0",
-      "resolved": "https://registry.npmjs.org/serialize-error/-/serialize-error-8.1.0.tgz",
-      "integrity": "sha512-3NnuWfM6vBYoy5gZFvHiYsVbafvI9vZv/+jlIigFn4oP4zjNPK3LhcY0xSCgeb1a5L8jO71Mit9LlNoi2UfDDQ==",
-      "requires": {
-        "type-fest": "^0.20.2"
-      }
+    "require-directory": {
+      "version": "2.1.1",
+      "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz",
+      "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q=="
     },
     },
-    "serialize-javascript": {
-      "version": "6.0.0",
-      "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.0.tgz",
-      "integrity": "sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag==",
+    "require-from-string": {
+      "version": "2.0.2",
+      "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz",
+      "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==",
+      "dev": true
+    },
+    "require-main-filename": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-1.0.1.tgz",
+      "integrity": "sha512-IqSUtOVP4ksd1C/ej5zeEh/BIP2ajqpn8c5x+q99gvcIG/Qf0cud5raVnE/Dwd0ua9TXYDoDc0RE5hBSdz22Ug==",
+      "dev": true
+    },
+    "requires-port": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz",
+      "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ=="
+    },
+    "reselect": {
+      "version": "4.1.7",
+      "resolved": "https://registry.npmjs.org/reselect/-/reselect-4.1.7.tgz",
+      "integrity": "sha512-Zu1xbUt3/OPwsXL46hvOOoQrap2azE7ZQbokq61BQfiXvhewsKDwhMeZjTX9sX0nvw1t/U5Audyn1I9P/m9z0A=="
+    },
+    "resolve": {
+      "version": "1.22.1",
+      "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.1.tgz",
+      "integrity": "sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==",
       "dev": true,
       "requires": {
       "dev": true,
       "requires": {
-        "randombytes": "^2.1.0"
+        "is-core-module": "^2.9.0",
+        "path-parse": "^1.0.7",
+        "supports-preserve-symlinks-flag": "^1.0.0"
       }
     },
       }
     },
-    "serve-index": {
-      "version": "1.9.1",
-      "resolved": "https://registry.npmjs.org/serve-index/-/serve-index-1.9.1.tgz",
-      "integrity": "sha512-pXHfKNP4qujrtteMrSBb0rc8HJ9Ms/GrXwcUtUtD5s4ewDJI8bT3Cz2zTVRMKtri49pLx2e0Ya8ziP5Ya2pZZw==",
+    "resolve-as-bin": {
+      "version": "2.1.0",
+      "resolved": "https://registry.npmjs.org/resolve-as-bin/-/resolve-as-bin-2.1.0.tgz",
+      "integrity": "sha512-ileUuPIOP+xj+GS/d/EbB2XqRA8T2IeZTFkMggNIW2Mo72VyBMbq+HvIAxdW0ED9D44aEzJwHvUtbMm2PJT5Kw==",
       "dev": true,
       "requires": {
       "dev": true,
       "requires": {
-        "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"
+        "cross-spawn": "^6.0.5"
       },
       "dependencies": {
       },
       "dependencies": {
-        "debug": {
-          "version": "2.6.9",
-          "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
-          "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+        "cross-spawn": {
+          "version": "6.0.5",
+          "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz",
+          "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==",
           "dev": true,
           "requires": {
           "dev": true,
           "requires": {
-            "ms": "2.0.0"
+            "nice-try": "^1.0.4",
+            "path-key": "^2.0.1",
+            "semver": "^5.5.0",
+            "shebang-command": "^1.2.0",
+            "which": "^1.2.9"
           }
         },
           }
         },
-        "depd": {
-          "version": "1.1.2",
-          "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz",
-          "integrity": "sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==",
+        "path-key": {
+          "version": "2.0.1",
+          "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz",
+          "integrity": "sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw==",
           "dev": true
         },
           "dev": true
         },
-        "http-errors": {
-          "version": "1.6.3",
-          "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz",
-          "integrity": "sha512-lks+lVC8dgGyh97jxvxeYTWQFvh4uw4yC12gVl63Cg30sjPX4wuGcdkICVXDAESr6OJGjqGA8Iz5mkeN6zlD7A==",
+        "semver": {
+          "version": "5.7.1",
+          "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz",
+          "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==",
+          "dev": true
+        },
+        "shebang-command": {
+          "version": "1.2.0",
+          "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz",
+          "integrity": "sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg==",
           "dev": true,
           "requires": {
           "dev": true,
           "requires": {
-            "depd": "~1.1.2",
-            "inherits": "2.0.3",
-            "setprototypeof": "1.1.0",
-            "statuses": ">= 1.4.0 < 2"
+            "shebang-regex": "^1.0.0"
           }
         },
           }
         },
-        "inherits": {
-          "version": "2.0.3",
-          "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz",
-          "integrity": "sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw==",
-          "dev": true
-        },
-        "ms": {
-          "version": "2.0.0",
-          "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
-          "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==",
-          "dev": true
-        },
-        "setprototypeof": {
-          "version": "1.1.0",
-          "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz",
-          "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==",
+        "shebang-regex": {
+          "version": "1.0.0",
+          "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz",
+          "integrity": "sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ==",
           "dev": true
         },
           "dev": true
         },
-        "statuses": {
-          "version": "1.5.0",
-          "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz",
-          "integrity": "sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==",
-          "dev": true
+        "which": {
+          "version": "1.3.1",
+          "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz",
+          "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==",
+          "dev": true,
+          "requires": {
+            "isexe": "^2.0.0"
+          }
         }
       }
     },
         }
       }
     },
-    "serve-static": {
-      "version": "1.15.0",
-      "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz",
-      "integrity": "sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==",
+    "resolve-cwd": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz",
+      "integrity": "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==",
       "dev": true,
       "requires": {
       "dev": true,
       "requires": {
-        "encodeurl": "~1.0.2",
-        "escape-html": "~1.0.3",
-        "parseurl": "~1.3.3",
-        "send": "0.18.0"
+        "resolve-from": "^5.0.0"
       }
     },
       }
     },
-    "set-blocking": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz",
-      "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==",
-      "dev": true
-    },
-    "set-value": {
-      "version": "2.0.1",
-      "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.1.tgz",
-      "integrity": "sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw==",
+    "resolve-dir": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/resolve-dir/-/resolve-dir-1.0.1.tgz",
+      "integrity": "sha512-R7uiTjECzvOsWSfdM0QKFNBVFcK27aHOUwdvK53BcW8zqnGdYp0Fbj82cy54+2A4P2tFM22J5kRfe1R+lM/1yg==",
       "dev": true,
       "requires": {
       "dev": true,
       "requires": {
-        "extend-shallow": "^2.0.1",
-        "is-extendable": "^0.1.1",
-        "is-plain-object": "^2.0.3",
-        "split-string": "^3.0.1"
-      },
-      "dependencies": {
-        "extend-shallow": {
-          "version": "2.0.1",
-          "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
-          "integrity": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==",
-          "dev": true,
-          "requires": {
-            "is-extendable": "^0.1.0"
-          }
-        },
-        "is-plain-object": {
-          "version": "2.0.4",
-          "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz",
-          "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==",
-          "dev": true,
-          "requires": {
-            "isobject": "^3.0.1"
-          }
-        }
+        "expand-tilde": "^2.0.0",
+        "global-modules": "^1.0.0"
       }
     },
       }
     },
-    "setprototypeof": {
-      "version": "1.2.0",
-      "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz",
-      "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==",
+    "resolve-from": {
+      "version": "5.0.0",
+      "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz",
+      "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==",
       "dev": true
     },
       "dev": true
     },
-    "sha.js": {
-      "version": "2.4.11",
-      "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz",
-      "integrity": "sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==",
-      "requires": {
-        "inherits": "^2.0.1",
-        "safe-buffer": "^5.0.1"
-      }
+    "resolve-url": {
+      "version": "0.2.1",
+      "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz",
+      "integrity": "sha512-ZuF55hVUQaaczgOIwqWzkEcEidmlD/xl44x1UZnhOXcYuFN2S6+rcxpG+C1N3So0wvNI3DmJICUFfu2SxhBmvg==",
+      "dev": true
     },
     },
-    "shallow-clone": {
-      "version": "3.0.1",
-      "resolved": "https://registry.npmjs.org/shallow-clone/-/shallow-clone-3.0.1.tgz",
-      "integrity": "sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==",
+    "resolve-url-loader": {
+      "version": "5.0.0",
+      "resolved": "https://registry.npmjs.org/resolve-url-loader/-/resolve-url-loader-5.0.0.tgz",
+      "integrity": "sha512-uZtduh8/8srhBoMx//5bwqjQ+rfYOUq8zC9NrMUGtjBiGTtFJM42s58/36+hTqeqINcnYe08Nj3LkK9lW4N8Xg==",
       "dev": true,
       "requires": {
       "dev": true,
       "requires": {
-        "kind-of": "^6.0.2"
+        "adjust-sourcemap-loader": "^4.0.0",
+        "convert-source-map": "^1.7.0",
+        "loader-utils": "^2.0.0",
+        "postcss": "^8.2.14",
+        "source-map": "0.6.1"
+      },
+      "dependencies": {
+        "loader-utils": {
+          "version": "2.0.4",
+          "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.4.tgz",
+          "integrity": "sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw==",
+          "dev": true,
+          "requires": {
+            "big.js": "^5.2.2",
+            "emojis-list": "^3.0.0",
+            "json5": "^2.1.2"
+          }
+        },
+        "source-map": {
+          "version": "0.6.1",
+          "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+          "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+          "dev": true
+        }
       }
     },
       }
     },
-    "shallow-copy": {
-      "version": "0.0.1",
-      "resolved": "https://registry.npmjs.org/shallow-copy/-/shallow-copy-0.0.1.tgz",
-      "integrity": "sha512-b6i4ZpVuUxB9h5gfCxPiusKYkqTMOjEbBs4wMaFbkfia4yFv92UKZ6Df8WXcKbn08JNL/abvg3FnMAOfakDvUw==",
+    "resolve.exports": {
+      "version": "1.1.1",
+      "resolved": "https://registry.npmjs.org/resolve.exports/-/resolve.exports-1.1.1.tgz",
+      "integrity": "sha512-/NtpHNDN7jWhAaQ9BvBUYZ6YTXsRBgfqWFWP7BZBaoMJO/I3G5OFzvTuWNlZC3aPjins1F+TNrLKsGbH4rfsRQ==",
       "dev": true
     },
       "dev": true
     },
-    "shasum": {
-      "version": "1.0.2",
-      "resolved": "https://registry.npmjs.org/shasum/-/shasum-1.0.2.tgz",
-      "integrity": "sha512-UTzHm/+AzKfO9RgPgRpDIuMSNie1ubXRaljjlhFMNGYoG7z+rm9AHLPMf70R7887xboDH9Q+5YQbWKObFHEAtw==",
+    "restore-cursor": {
+      "version": "3.1.0",
+      "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz",
+      "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==",
       "dev": true,
       "requires": {
       "dev": true,
       "requires": {
-        "json-stable-stringify": "~0.0.0",
-        "sha.js": "~2.4.4"
+        "onetime": "^5.1.0",
+        "signal-exit": "^3.0.2"
       }
     },
       }
     },
-    "shasum-object": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/shasum-object/-/shasum-object-1.0.0.tgz",
-      "integrity": "sha512-Iqo5rp/3xVi6M4YheapzZhhGPVs0yZwHj7wvwQ1B9z8H6zk+FEnI7y3Teq7qwnekfEhu8WmG2z0z4iWZaxLWVg==",
-      "dev": true,
-      "requires": {
-        "fast-safe-stringify": "^2.0.7"
-      }
+    "ret": {
+      "version": "0.2.2",
+      "resolved": "https://registry.npmjs.org/ret/-/ret-0.2.2.tgz",
+      "integrity": "sha512-M0b3YWQs7R3Z917WRQy1HHA7Ba7D8hvZg6UE5mLykJxQVE2ju0IXbGlaHPPlkY+WN7wFP+wUMXmBFA0aV6vYGQ=="
     },
     },
-    "shebang-command": {
-      "version": "1.2.0",
-      "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz",
-      "integrity": "sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg==",
-      "dev": true,
-      "requires": {
-        "shebang-regex": "^1.0.0"
-      }
+    "retry": {
+      "version": "0.13.1",
+      "resolved": "https://registry.npmjs.org/retry/-/retry-0.13.1.tgz",
+      "integrity": "sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==",
+      "dev": true
     },
     },
-    "shebang-regex": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz",
-      "integrity": "sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ==",
+    "reusify": {
+      "version": "1.0.4",
+      "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz",
+      "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==",
       "dev": true
     },
       "dev": true
     },
-    "shell-quote": {
-      "version": "1.7.3",
-      "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.7.3.tgz",
-      "integrity": "sha512-Vpfqwm4EnqGdlsBFNmHhxhElJYrdfcxPThu+ryKS5J8L/fhAwLazFZtq+S+TWZ9ANj2piSQLGj6NQg+lKPmxrw==",
+    "rfdc": {
+      "version": "1.3.0",
+      "resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.3.0.tgz",
+      "integrity": "sha512-V2hovdzFbOi77/WajaSMXk2OLm+xNIeQdMMuB7icj7bk6zi2F8GGAxigcnDFpJHbNyNcgyJDiP+8nOrY5cZGrA==",
       "dev": true
     },
       "dev": true
     },
-    "shellwords": {
-      "version": "0.1.1",
-      "resolved": "https://registry.npmjs.org/shellwords/-/shellwords-0.1.1.tgz",
-      "integrity": "sha512-vFwSUfQvqybiICwZY5+DAWIPLKsWO31Q91JSKl3UYv+K5c2QRPzn0qzec6QPu1Qc9eHYItiP3NdJqNVqetYAww==",
+    "rimraf": {
+      "version": "3.0.2",
+      "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz",
+      "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==",
       "dev": true,
       "dev": true,
-      "optional": true
-    },
-    "side-channel": {
-      "version": "1.0.4",
-      "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz",
-      "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==",
       "requires": {
       "requires": {
-        "call-bind": "^1.0.0",
-        "get-intrinsic": "^1.0.2",
-        "object-inspect": "^1.9.0"
+        "glob": "^7.1.3"
       }
     },
       }
     },
-    "signal-exit": {
-      "version": "3.0.7",
-      "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz",
-      "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==",
-      "dev": true
+    "ripemd160": {
+      "version": "2.0.2",
+      "resolved": "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.2.tgz",
+      "integrity": "sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==",
+      "dev": true,
+      "requires": {
+        "hash-base": "^3.0.0",
+        "inherits": "^2.0.1"
+      }
     },
     },
-    "simple-concat": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/simple-concat/-/simple-concat-1.0.1.tgz",
-      "integrity": "sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==",
+    "run-async": {
+      "version": "2.4.1",
+      "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.4.1.tgz",
+      "integrity": "sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==",
       "dev": true
     },
       "dev": true
     },
-    "simplebar": {
-      "version": "5.3.8",
-      "resolved": "https://registry.npmjs.org/simplebar/-/simplebar-5.3.8.tgz",
-      "integrity": "sha512-LOHjyOcihx++zFN+vuktoZBGpCarFCtHIVDWXOf2VELbGDknq3Hw/sddafRp1aCg123VNkHWOFHUDHYEXAtufQ==",
+    "run-parallel": {
+      "version": "1.2.0",
+      "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz",
+      "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==",
+      "dev": true,
       "requires": {
       "requires": {
-        "@juggle/resize-observer": "^3.3.1",
-        "can-use-dom": "^0.1.0",
-        "core-js": "^3.0.1",
-        "lodash.debounce": "^4.0.8",
-        "lodash.memoize": "^4.1.2",
-        "lodash.throttle": "^4.1.1"
+        "queue-microtask": "^1.2.2"
       }
     },
       }
     },
-    "simplebar-angular": {
-      "version": "2.3.6",
-      "resolved": "https://registry.npmjs.org/simplebar-angular/-/simplebar-angular-2.3.6.tgz",
-      "integrity": "sha512-chSUdCYCLOdajbCA73oL/OU+H/YFNGGdAYkcYx76YDY81C3sj3vMePjuW8cPgZZHwSCGI+opcl6xoBsCK56fJA==",
+    "rxjs": {
+      "version": "6.6.3",
+      "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.3.tgz",
+      "integrity": "sha512-trsQc+xYYXZ3urjOiJOuCOa5N3jAZ3eiSpQB5hIT8zGlL2QfnHLJ2r7GMkBGuIausdJN1OneaI6gQlsqNHHmZQ==",
       "requires": {
       "requires": {
-        "simplebar": "^5.3.6",
         "tslib": "^1.9.0"
       },
       "dependencies": {
         "tslib": "^1.9.0"
       },
       "dependencies": {
         }
       }
     },
         }
       }
     },
-    "sisteransi": {
-      "version": "1.0.5",
-      "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz",
-      "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==",
+    "rxjs-for-await": {
+      "version": "0.0.2",
+      "resolved": "https://registry.npmjs.org/rxjs-for-await/-/rxjs-for-await-0.0.2.tgz",
+      "integrity": "sha512-IJ8R/ZCFMHOcDIqoABs82jal00VrZx8Xkgfe7TOKoaRPAW5nH/VFlG23bXpeGdrmtqI9UobFPgUKgCuFc7Lncw==",
       "dev": true
     },
       "dev": true
     },
-    "slash": {
-      "version": "3.0.0",
-      "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz",
-      "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==",
-      "dev": true
+    "safe-buffer": {
+      "version": "5.2.1",
+      "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz",
+      "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ=="
     },
     },
-    "slice-ansi": {
-      "version": "3.0.0",
-      "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-3.0.0.tgz",
-      "integrity": "sha512-pSyv7bSTC7ig9Dcgbw9AuRNUb5k5V6oDudjZoMBSr13qpLBG7tB+zgCkARjq7xIUgdz5P1Qe8u+rSGdouOOIyQ==",
+    "safe-regex": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz",
+      "integrity": "sha512-aJXcif4xnaNUzvUuC5gcb46oTS7zvg4jpMTnuqtrEPlR3vFr4pxtdTwaF1Qs3Enjn9HK+ZlwQui+a7z0SywIzg==",
       "dev": true,
       "requires": {
       "dev": true,
       "requires": {
-        "ansi-styles": "^4.0.0",
-        "astral-regex": "^2.0.0",
-        "is-fullwidth-code-point": "^3.0.0"
+        "ret": "~0.1.10"
       },
       "dependencies": {
       },
       "dependencies": {
-        "ansi-styles": {
-          "version": "4.3.0",
-          "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
-          "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
-          "dev": true,
-          "requires": {
-            "color-convert": "^2.0.1"
-          }
-        },
-        "color-convert": {
-          "version": "2.0.1",
-          "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
-          "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
-          "dev": true,
-          "requires": {
-            "color-name": "~1.1.4"
-          }
-        },
-        "color-name": {
-          "version": "1.1.4",
-          "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
-          "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
+        "ret": {
+          "version": "0.1.15",
+          "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz",
+          "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==",
           "dev": true
         }
       }
     },
           "dev": true
         }
       }
     },
-    "smart-buffer": {
-      "version": "4.2.0",
-      "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.2.0.tgz",
-      "integrity": "sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==",
+    "safe-regex-test": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.0.tgz",
+      "integrity": "sha512-JBUUzyOgEwXQY1NuPtvcj/qcBDbDmEvWufhlnXZIm75DEHp+afM1r1ujJpJsV/gSM4t59tpDyPi1sd6ZaPFfsA==",
+      "dev": true,
+      "requires": {
+        "call-bind": "^1.0.2",
+        "get-intrinsic": "^1.1.3",
+        "is-regex": "^1.1.4"
+      }
+    },
+    "safer-buffer": {
+      "version": "2.1.2",
+      "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz",
+      "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==",
       "dev": true
     },
       "dev": true
     },
-    "snapdragon": {
-      "version": "0.8.2",
-      "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz",
-      "integrity": "sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==",
+    "sass": {
+      "version": "1.49.9",
+      "resolved": "https://registry.npmjs.org/sass/-/sass-1.49.9.tgz",
+      "integrity": "sha512-YlYWkkHP9fbwaFRZQRXgDi3mXZShslVmmo+FVK3kHLUELHHEYrCmL1x6IUjC7wLS6VuJSAFXRQS/DxdsC4xL1A==",
       "dev": true,
       "requires": {
       "dev": true,
       "requires": {
-        "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"
+        "chokidar": ">=3.0.0 <4.0.0",
+        "immutable": "^4.0.0",
+        "source-map-js": ">=0.6.2 <2.0.0"
       },
       "dependencies": {
       },
       "dependencies": {
-        "debug": {
-          "version": "2.6.9",
-          "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
-          "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
-          "dev": true,
-          "requires": {
-            "ms": "2.0.0"
-          }
-        },
-        "define-property": {
-          "version": "0.2.5",
-          "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz",
-          "integrity": "sha512-Rr7ADjQZenceVOAKop6ALkkRAmH1A4Gx9hV/7ZujPUN2rkATqFO0JZLZInbAjpZYoJ1gUx8MRMQVkYemcbMSTA==",
-          "dev": true,
-          "requires": {
-            "is-descriptor": "^0.1.0"
-          }
-        },
-        "extend-shallow": {
-          "version": "2.0.1",
-          "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
-          "integrity": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==",
-          "dev": true,
-          "requires": {
-            "is-extendable": "^0.1.0"
-          }
-        },
-        "ms": {
-          "version": "2.0.0",
-          "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
-          "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==",
+        "immutable": {
+          "version": "4.2.4",
+          "resolved": "https://registry.npmjs.org/immutable/-/immutable-4.2.4.tgz",
+          "integrity": "sha512-WDxL3Hheb1JkRN3sQkyujNlL/xRjAo3rJtaU5xeufUauG66JdMr32bLj4gF+vWl84DIA3Zxw7tiAjneYzRRw+w==",
           "dev": true
         }
       }
     },
           "dev": true
         }
       }
     },
-    "snapdragon-node": {
-      "version": "2.1.1",
-      "resolved": "https://registry.npmjs.org/snapdragon-node/-/snapdragon-node-2.1.1.tgz",
-      "integrity": "sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==",
+    "sass-loader": {
+      "version": "12.4.0",
+      "resolved": "https://registry.npmjs.org/sass-loader/-/sass-loader-12.4.0.tgz",
+      "integrity": "sha512-7xN+8khDIzym1oL9XyS6zP6Ges+Bo2B2xbPrjdMHEYyV3AQYhd/wXeru++3ODHF0zMjYmVadblSKrPrjEkL8mg==",
+      "dev": true,
+      "requires": {
+        "klona": "^2.0.4",
+        "neo-async": "^2.6.2"
+      }
+    },
+    "sax": {
+      "version": "1.2.4",
+      "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz",
+      "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==",
+      "dev": true
+    },
+    "saxes": {
+      "version": "3.1.11",
+      "resolved": "https://registry.npmjs.org/saxes/-/saxes-3.1.11.tgz",
+      "integrity": "sha512-Ydydq3zC+WYDJK1+gRxRapLIED9PWeSuuS41wqyoRmzvhhh9nc+QQrVMKJYzJFULazeGhzSV0QleN2wD3boh2g==",
+      "dev": true,
+      "requires": {
+        "xmlchars": "^2.1.1"
+      }
+    },
+    "scheduler": {
+      "version": "0.20.2",
+      "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.20.2.tgz",
+      "integrity": "sha512-2eWfGgAqqWFGqtdMmcL5zCMK1U8KlXv8SQFGglL3CEtd0aDVDWgeF/YoCmvln55m5zSk3J/20hTaSBeSObsQDQ==",
+      "requires": {
+        "loose-envify": "^1.1.0",
+        "object-assign": "^4.1.1"
+      }
+    },
+    "schema-utils": {
+      "version": "2.7.1",
+      "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.7.1.tgz",
+      "integrity": "sha512-SHiNtMOUGWBQJwzISiVYKu82GiV4QYGePp3odlY1tuKO7gPtphAT5R/py0fA6xtbgLL/RvtJZnU9b8s0F1q0Xg==",
       "dev": true,
       "requires": {
       "dev": true,
       "requires": {
-        "define-property": "^1.0.0",
-        "isobject": "^3.0.0",
-        "snapdragon-util": "^3.0.1"
+        "@types/json-schema": "^7.0.5",
+        "ajv": "^6.12.4",
+        "ajv-keywords": "^3.5.2"
       },
       "dependencies": {
       },
       "dependencies": {
-        "define-property": {
-          "version": "1.0.0",
-          "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz",
-          "integrity": "sha512-cZTYKFWspt9jZsMscWo8sc/5lbPC9Q0N5nBLgb+Yd915iL3udB1uFgS3B8YCx66UVHq018DAVFoee7x+gxggeA==",
-          "dev": true,
-          "requires": {
-            "is-descriptor": "^1.0.0"
-          }
-        },
-        "is-accessor-descriptor": {
-          "version": "1.0.0",
-          "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz",
-          "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==",
-          "dev": true,
-          "requires": {
-            "kind-of": "^6.0.0"
-          }
-        },
-        "is-data-descriptor": {
-          "version": "1.0.0",
-          "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz",
-          "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==",
+        "ajv": {
+          "version": "6.12.6",
+          "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz",
+          "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==",
           "dev": true,
           "requires": {
           "dev": true,
           "requires": {
-            "kind-of": "^6.0.0"
+            "fast-deep-equal": "^3.1.1",
+            "fast-json-stable-stringify": "^2.0.0",
+            "json-schema-traverse": "^0.4.1",
+            "uri-js": "^4.2.2"
           }
         },
           }
         },
-        "is-descriptor": {
-          "version": "1.0.2",
-          "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz",
-          "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==",
-          "dev": true,
-          "requires": {
-            "is-accessor-descriptor": "^1.0.0",
-            "is-data-descriptor": "^1.0.0",
-            "kind-of": "^6.0.2"
-          }
+        "json-schema-traverse": {
+          "version": "0.4.1",
+          "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz",
+          "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==",
+          "dev": true
         }
       }
     },
         }
       }
     },
-    "snapdragon-util": {
-      "version": "3.0.1",
-      "resolved": "https://registry.npmjs.org/snapdragon-util/-/snapdragon-util-3.0.1.tgz",
-      "integrity": "sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==",
+    "scope-analyzer": {
+      "version": "2.1.2",
+      "resolved": "https://registry.npmjs.org/scope-analyzer/-/scope-analyzer-2.1.2.tgz",
+      "integrity": "sha512-5cfCmsTYV/wPaRIItNxatw02ua/MThdIUNnUOCYp+3LSEJvnG804ANw2VLaavNILIfWXF1D1G2KNANkBBvInwQ==",
       "dev": true,
       "requires": {
       "dev": true,
       "requires": {
-        "kind-of": "^3.2.0"
-      },
-      "dependencies": {
-        "kind-of": {
-          "version": "3.2.2",
-          "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
-          "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==",
-          "dev": true,
-          "requires": {
-            "is-buffer": "^1.1.5"
-          }
-        }
+        "array-from": "^2.1.1",
+        "dash-ast": "^2.0.1",
+        "es6-map": "^0.1.5",
+        "es6-set": "^0.1.5",
+        "es6-symbol": "^3.1.1",
+        "estree-is-function": "^1.0.0",
+        "get-assigned-identifiers": "^1.1.0"
       }
     },
       }
     },
-    "sockjs": {
-      "version": "0.3.24",
-      "resolved": "https://registry.npmjs.org/sockjs/-/sockjs-0.3.24.tgz",
-      "integrity": "sha512-GJgLTZ7vYb/JtPSSZ10hsOYIvEYsjbNU+zPdIHcUaWVNUEPivzxku31865sSSud0Da0W4lEeOPlmw93zLQchuQ==",
+    "seed-random": {
+      "version": "2.2.0",
+      "resolved": "https://registry.npmjs.org/seed-random/-/seed-random-2.2.0.tgz",
+      "integrity": "sha512-34EQV6AAHQGhoc0tn/96a9Fsi6v2xdqe/dMUwljGRaFOzR3EgRmECvD0O8vi8X+/uQ50LGHfkNu/Eue5TPKZkQ==",
+      "dev": true
+    },
+    "select-hose": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/select-hose/-/select-hose-2.0.0.tgz",
+      "integrity": "sha512-mEugaLK+YfkijB4fx0e6kImuJdCIt2LxCRcbEYPqRGCs4F2ogyfZU5IAZRdjCP8JPq2AtdNoC/Dux63d9Kiryg==",
+      "dev": true
+    },
+    "selfsigned": {
+      "version": "2.1.1",
+      "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-2.1.1.tgz",
+      "integrity": "sha512-GSL3aowiF7wa/WtSFwnUrludWFoNhftq8bUkH9pkzjpN2XSPOAYEgg6e0sS9s0rZwgJzJiQRPU18A6clnoW5wQ==",
       "dev": true,
       "requires": {
       "dev": true,
       "requires": {
-        "faye-websocket": "^0.11.3",
-        "uuid": "^8.3.2",
-        "websocket-driver": "^0.7.4"
+        "node-forge": "^1"
       }
     },
       }
     },
-    "sockjs-client": {
-      "version": "1.6.1",
-      "resolved": "https://registry.npmjs.org/sockjs-client/-/sockjs-client-1.6.1.tgz",
-      "integrity": "sha512-2g0tjOR+fRs0amxENLi/q5TiJTqY+WXFOzb5UwXndlK6TO3U/mirZznpx6w34HVMoc3g7cY24yC/ZMIYnDlfkw==",
+    "semver": {
+      "version": "6.3.0",
+      "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
+      "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw=="
+    },
+    "send": {
+      "version": "0.18.0",
+      "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz",
+      "integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==",
       "dev": true,
       "requires": {
       "dev": true,
       "requires": {
-        "debug": "^3.2.7",
-        "eventsource": "^2.0.2",
-        "faye-websocket": "^0.11.4",
-        "inherits": "^2.0.4",
-        "url-parse": "^1.5.10"
+        "debug": "2.6.9",
+        "depd": "2.0.0",
+        "destroy": "1.2.0",
+        "encodeurl": "~1.0.2",
+        "escape-html": "~1.0.3",
+        "etag": "~1.8.1",
+        "fresh": "0.5.2",
+        "http-errors": "2.0.0",
+        "mime": "1.6.0",
+        "ms": "2.1.3",
+        "on-finished": "2.4.1",
+        "range-parser": "~1.2.1",
+        "statuses": "2.0.1"
       },
       "dependencies": {
         "debug": {
       },
       "dependencies": {
         "debug": {
-          "version": "3.2.7",
-          "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz",
-          "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==",
+          "version": "2.6.9",
+          "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
+          "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
           "dev": true,
           "requires": {
           "dev": true,
           "requires": {
-            "ms": "^2.1.1"
+            "ms": "2.0.0"
+          },
+          "dependencies": {
+            "ms": {
+              "version": "2.0.0",
+              "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
+              "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==",
+              "dev": true
+            }
           }
           }
+        },
+        "ms": {
+          "version": "2.1.3",
+          "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
+          "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==",
+          "dev": true
         }
       }
     },
         }
       }
     },
-    "socks": {
-      "version": "2.7.0",
-      "resolved": "https://registry.npmjs.org/socks/-/socks-2.7.0.tgz",
-      "integrity": "sha512-scnOe9y4VuiNUULJN72GrM26BNOjVsfPXI+j+98PkyEfsIXroa5ofyjT+FzGvn/xHs73U2JtoBYAVx9Hl4quSA==",
-      "dev": true,
+    "serialize-error": {
+      "version": "8.1.0",
+      "resolved": "https://registry.npmjs.org/serialize-error/-/serialize-error-8.1.0.tgz",
+      "integrity": "sha512-3NnuWfM6vBYoy5gZFvHiYsVbafvI9vZv/+jlIigFn4oP4zjNPK3LhcY0xSCgeb1a5L8jO71Mit9LlNoi2UfDDQ==",
       "requires": {
       "requires": {
-        "ip": "^2.0.0",
-        "smart-buffer": "^4.2.0"
-      },
-      "dependencies": {
-        "ip": {
-          "version": "2.0.0",
-          "resolved": "https://registry.npmjs.org/ip/-/ip-2.0.0.tgz",
-          "integrity": "sha512-WKa+XuLG1A1R0UWhl2+1XQSi+fZWMsYKffMZTTYsiZaUD8k2yDAj5atimTUD2TZkyCkNEeYE5NhFZmupOGtjYQ==",
-          "dev": true
-        }
+        "type-fest": "^0.20.2"
       }
     },
       }
     },
-    "socks-proxy-agent": {
-      "version": "6.2.1",
-      "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-6.2.1.tgz",
-      "integrity": "sha512-a6KW9G+6B3nWZ1yB8G7pJwL3ggLy1uTzKAgCb7ttblwqdz9fMGJUuTy3uFzEP48FAs9FLILlmzDlE2JJhVQaXQ==",
+    "serialize-javascript": {
+      "version": "6.0.1",
+      "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.1.tgz",
+      "integrity": "sha512-owoXEFjWRllis8/M1Q+Cw5k8ZH40e3zhp/ovX+Xr/vi1qj6QesbyXXViFbpNvWvPNAD62SutwEXavefrLJWj7w==",
       "dev": true,
       "requires": {
       "dev": true,
       "requires": {
-        "agent-base": "^6.0.2",
-        "debug": "^4.3.3",
-        "socks": "^2.6.2"
+        "randombytes": "^2.1.0"
       }
     },
       }
     },
-    "source-list-map": {
-      "version": "2.0.1",
-      "resolved": "https://registry.npmjs.org/source-list-map/-/source-list-map-2.0.1.tgz",
-      "integrity": "sha512-qnQ7gVMxGNxsiL4lEuJwe/To8UnK7fAnmbGEEH8RpLouuKbeEm0lhbQVFIrNSuB+G7tVrAlVsZgETT5nljf+Iw==",
-      "dev": true
-    },
-    "source-map": {
-      "version": "0.5.7",
-      "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz",
-      "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ=="
-    },
-    "source-map-js": {
-      "version": "1.0.2",
-      "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz",
-      "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==",
-      "dev": true
-    },
-    "source-map-loader": {
-      "version": "3.0.0",
-      "resolved": "https://registry.npmjs.org/source-map-loader/-/source-map-loader-3.0.0.tgz",
-      "integrity": "sha512-GKGWqWvYr04M7tn8dryIWvb0s8YM41z82iQv01yBtIylgxax0CwvSy6gc2Y02iuXwEfGWRlMicH0nvms9UZphw==",
+    "serve-index": {
+      "version": "1.9.1",
+      "resolved": "https://registry.npmjs.org/serve-index/-/serve-index-1.9.1.tgz",
+      "integrity": "sha512-pXHfKNP4qujrtteMrSBb0rc8HJ9Ms/GrXwcUtUtD5s4ewDJI8bT3Cz2zTVRMKtri49pLx2e0Ya8ziP5Ya2pZZw==",
       "dev": true,
       "requires": {
       "dev": true,
       "requires": {
-        "abab": "^2.0.5",
-        "iconv-lite": "^0.6.2",
-        "source-map-js": "^0.6.2"
+        "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"
       },
       "dependencies": {
       },
       "dependencies": {
-        "iconv-lite": {
-          "version": "0.6.3",
-          "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz",
-          "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==",
+        "debug": {
+          "version": "2.6.9",
+          "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
+          "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
           "dev": true,
           "requires": {
           "dev": true,
           "requires": {
-            "safer-buffer": ">= 2.1.2 < 3.0.0"
+            "ms": "2.0.0"
+          }
+        },
+        "depd": {
+          "version": "1.1.2",
+          "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz",
+          "integrity": "sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==",
+          "dev": true
+        },
+        "http-errors": {
+          "version": "1.6.3",
+          "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz",
+          "integrity": "sha512-lks+lVC8dgGyh97jxvxeYTWQFvh4uw4yC12gVl63Cg30sjPX4wuGcdkICVXDAESr6OJGjqGA8Iz5mkeN6zlD7A==",
+          "dev": true,
+          "requires": {
+            "depd": "~1.1.2",
+            "inherits": "2.0.3",
+            "setprototypeof": "1.1.0",
+            "statuses": ">= 1.4.0 < 2"
           }
         },
           }
         },
-        "source-map-js": {
-          "version": "0.6.2",
-          "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-0.6.2.tgz",
-          "integrity": "sha512-/3GptzWzu0+0MBQFrDKzw/DvvMTUORvgY6k6jd/VS6iCR4RDTKWH6v6WPwQoUO8667uQEf9Oe38DxAYWY5F/Ug==",
+        "inherits": {
+          "version": "2.0.3",
+          "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz",
+          "integrity": "sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw==",
+          "dev": true
+        },
+        "ms": {
+          "version": "2.0.0",
+          "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
+          "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==",
+          "dev": true
+        },
+        "setprototypeof": {
+          "version": "1.1.0",
+          "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz",
+          "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==",
+          "dev": true
+        },
+        "statuses": {
+          "version": "1.5.0",
+          "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz",
+          "integrity": "sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==",
           "dev": true
         }
       }
     },
           "dev": true
         }
       }
     },
-    "source-map-resolve": {
-      "version": "0.5.3",
-      "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.3.tgz",
-      "integrity": "sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw==",
+    "serve-static": {
+      "version": "1.15.0",
+      "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz",
+      "integrity": "sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==",
       "dev": true,
       "requires": {
       "dev": true,
       "requires": {
-        "atob": "^2.1.2",
-        "decode-uri-component": "^0.2.0",
-        "resolve-url": "^0.2.1",
-        "source-map-url": "^0.4.0",
-        "urix": "^0.1.0"
+        "encodeurl": "~1.0.2",
+        "escape-html": "~1.0.3",
+        "parseurl": "~1.3.3",
+        "send": "0.18.0"
       }
     },
       }
     },
-    "source-map-support": {
-      "version": "0.5.19",
-      "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.19.tgz",
-      "integrity": "sha512-Wonm7zOCIJzBGQdB+thsPar0kYuCIzYvxZwlBa87yi/Mdjv7Tip2cyVbLj5o0cFPN4EVkuTwb3GDDyUx2DGnGw==",
+    "set-blocking": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz",
+      "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw=="
+    },
+    "set-value": {
+      "version": "2.0.1",
+      "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.1.tgz",
+      "integrity": "sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw==",
       "dev": true,
       "requires": {
       "dev": true,
       "requires": {
-        "buffer-from": "^1.0.0",
-        "source-map": "^0.6.0"
+        "extend-shallow": "^2.0.1",
+        "is-extendable": "^0.1.1",
+        "is-plain-object": "^2.0.3",
+        "split-string": "^3.0.1"
       },
       "dependencies": {
       },
       "dependencies": {
-        "source-map": {
-          "version": "0.6.1",
-          "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
-          "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
-          "dev": true
+        "extend-shallow": {
+          "version": "2.0.1",
+          "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
+          "integrity": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==",
+          "dev": true,
+          "requires": {
+            "is-extendable": "^0.1.0"
+          }
+        },
+        "is-plain-object": {
+          "version": "2.0.4",
+          "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz",
+          "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==",
+          "dev": true,
+          "requires": {
+            "isobject": "^3.0.1"
+          }
         }
       }
     },
         }
       }
     },
-    "source-map-url": {
-      "version": "0.4.1",
-      "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.1.tgz",
-      "integrity": "sha512-cPiFOTLUKvJFIg4SKVScy4ilPPW6rFgMgfuZJPNoDuMs3nC1HbMUycBoJw77xFIp6z1UJQJOfx6C9GMH80DiTw==",
-      "dev": true
-    },
-    "sourcemap-codec": {
-      "version": "1.4.8",
-      "resolved": "https://registry.npmjs.org/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz",
-      "integrity": "sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==",
+    "setprototypeof": {
+      "version": "1.2.0",
+      "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz",
+      "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==",
       "dev": true
     },
       "dev": true
     },
-    "space-separated-tokens": {
-      "version": "1.1.5",
-      "resolved": "https://registry.npmjs.org/space-separated-tokens/-/space-separated-tokens-1.1.5.tgz",
-      "integrity": "sha512-q/JSVd1Lptzhf5bkYm4ob4iWPjx0KiRe3sRFBNrVqbJkFaBm5vbbowy1mymoPNLRa52+oadOhJ+K49wsSeSjTA=="
-    },
-    "spdx-correct": {
-      "version": "3.1.1",
-      "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.1.tgz",
-      "integrity": "sha512-cOYcUWwhCuHCXi49RhFRCyJEK3iPj1Ziz9DpViV3tbZOwXD49QzIN3MpOLJNxh2qwq2lJJZaKMVw9qNi4jTC0w==",
-      "dev": true,
+    "sha.js": {
+      "version": "2.4.11",
+      "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz",
+      "integrity": "sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==",
       "requires": {
       "requires": {
-        "spdx-expression-parse": "^3.0.0",
-        "spdx-license-ids": "^3.0.0"
+        "inherits": "^2.0.1",
+        "safe-buffer": "^5.0.1"
       }
     },
       }
     },
-    "spdx-exceptions": {
-      "version": "2.3.0",
-      "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz",
-      "integrity": "sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==",
-      "dev": true
-    },
-    "spdx-expression-parse": {
+    "shallow-clone": {
       "version": "3.0.1",
       "version": "3.0.1",
-      "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz",
-      "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==",
+      "resolved": "https://registry.npmjs.org/shallow-clone/-/shallow-clone-3.0.1.tgz",
+      "integrity": "sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==",
       "dev": true,
       "requires": {
       "dev": true,
       "requires": {
-        "spdx-exceptions": "^2.1.0",
-        "spdx-license-ids": "^3.0.0"
+        "kind-of": "^6.0.2"
       }
     },
       }
     },
-    "spdx-license-ids": {
-      "version": "3.0.11",
-      "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.11.tgz",
-      "integrity": "sha512-Ctl2BrFiM0X3MANYgj3CkygxhRmr9mi6xhejbdO960nF6EDJApTYpn0BQnDKlnNBULKiCN1n3w9EBkHK8ZWg+g==",
+    "shallow-copy": {
+      "version": "0.0.1",
+      "resolved": "https://registry.npmjs.org/shallow-copy/-/shallow-copy-0.0.1.tgz",
+      "integrity": "sha512-b6i4ZpVuUxB9h5gfCxPiusKYkqTMOjEbBs4wMaFbkfia4yFv92UKZ6Df8WXcKbn08JNL/abvg3FnMAOfakDvUw==",
       "dev": true
     },
       "dev": true
     },
-    "spdy": {
-      "version": "4.0.2",
-      "resolved": "https://registry.npmjs.org/spdy/-/spdy-4.0.2.tgz",
-      "integrity": "sha512-r46gZQZQV+Kl9oItvl1JZZqJKGr+oEkB08A6BzkiR7593/7IbtuncXHd2YoYeTsG4157ZssMu9KYvUHLcjcDoA==",
+    "shasum": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/shasum/-/shasum-1.0.2.tgz",
+      "integrity": "sha512-UTzHm/+AzKfO9RgPgRpDIuMSNie1ubXRaljjlhFMNGYoG7z+rm9AHLPMf70R7887xboDH9Q+5YQbWKObFHEAtw==",
       "dev": true,
       "requires": {
       "dev": true,
       "requires": {
-        "debug": "^4.1.0",
-        "handle-thing": "^2.0.0",
-        "http-deceiver": "^1.2.7",
-        "select-hose": "^2.0.0",
-        "spdy-transport": "^3.0.0"
+        "json-stable-stringify": "~0.0.0",
+        "sha.js": "~2.4.4"
       }
     },
       }
     },
-    "spdy-transport": {
-      "version": "3.0.0",
-      "resolved": "https://registry.npmjs.org/spdy-transport/-/spdy-transport-3.0.0.tgz",
-      "integrity": "sha512-hsLVFE5SjA6TCisWeJXFKniGGOpBgMLmerfO2aCyCU5s7nJ/rpAepqmFifv/GCbSbueEeAJJnmSQ2rKC/g8Fcw==",
+    "shasum-object": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/shasum-object/-/shasum-object-1.0.0.tgz",
+      "integrity": "sha512-Iqo5rp/3xVi6M4YheapzZhhGPVs0yZwHj7wvwQ1B9z8H6zk+FEnI7y3Teq7qwnekfEhu8WmG2z0z4iWZaxLWVg==",
       "dev": true,
       "requires": {
       "dev": true,
       "requires": {
-        "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"
+        "fast-safe-stringify": "^2.0.7"
       }
     },
       }
     },
-    "specificity": {
-      "version": "0.4.1",
-      "resolved": "https://registry.npmjs.org/specificity/-/specificity-0.4.1.tgz",
-      "integrity": "sha512-1klA3Gi5PD1Wv9Q0wUoOQN1IWAuPu0D1U03ThXTr0cJ20+/iq2tHSDnK7Kk/0LXJ1ztUB2/1Os0wKmfyNgUQfg==",
-      "dev": true
-    },
-    "split": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/split/-/split-1.0.1.tgz",
-      "integrity": "sha512-mTyOoPbrivtXnwnIxZRFYRrPNtEFKlpB2fvjSnCQUiAA6qAZzqwna5envK4uk6OIeP17CsdF3rSBGYVBsU0Tkg==",
+    "shebang-command": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz",
+      "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==",
       "dev": true,
       "requires": {
       "dev": true,
       "requires": {
-        "through": "2"
+        "shebang-regex": "^3.0.0"
       }
     },
       }
     },
-    "split-string": {
-      "version": "3.1.0",
-      "resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz",
-      "integrity": "sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==",
-      "dev": true,
-      "requires": {
-        "extend-shallow": "^3.0.0"
-      }
+    "shebang-regex": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz",
+      "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==",
+      "dev": true
     },
     },
-    "sprintf-js": {
-      "version": "1.0.3",
-      "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz",
-      "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g=="
+    "shell-quote": {
+      "version": "1.8.0",
+      "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.8.0.tgz",
+      "integrity": "sha512-QHsz8GgQIGKlRi24yFc6a6lN69Idnx634w49ay6+jA5yFh7a1UY+4Rp6HPx/L/1zcEDPEij8cIsiqR6bQsE5VQ==",
+      "dev": true
     },
     },
-    "sshpk": {
-      "version": "1.17.0",
-      "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.17.0.tgz",
-      "integrity": "sha512-/9HIEs1ZXGhSPE8X6Ccm7Nam1z8KcoCqPdI7ecm1N33EzAetWahvQWVqLZtaZQ+IDKX4IyA2o0gBzqIMkAagHQ==",
-      "dev": true,
-      "requires": {
-        "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"
-      }
+    "short-unique-id": {
+      "version": "4.4.4",
+      "resolved": "https://registry.npmjs.org/short-unique-id/-/short-unique-id-4.4.4.tgz",
+      "integrity": "sha512-oLF1NCmtbiTWl2SqdXZQbo5KM1b7axdp0RgQLq8qCBBLoq+o3A5wmLrNM6bZIh54/a8BJ3l69kTXuxwZ+XCYuw=="
     },
     },
-    "ssri": {
-      "version": "8.0.1",
-      "resolved": "https://registry.npmjs.org/ssri/-/ssri-8.0.1.tgz",
-      "integrity": "sha512-97qShzy1AiyxvPNIkLWoGua7xoQzzPjQ0HAH4B0rWKo7SZ6USuPcrUiAFrws0UH8RrbWmgq3LMTObhPIHbbBeQ==",
-      "dev": true,
+    "side-channel": {
+      "version": "1.0.4",
+      "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz",
+      "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==",
       "requires": {
       "requires": {
-        "minipass": "^3.1.1"
+        "call-bind": "^1.0.0",
+        "get-intrinsic": "^1.0.2",
+        "object-inspect": "^1.9.0"
       }
     },
       }
     },
-    "stable": {
-      "version": "0.1.8",
-      "resolved": "https://registry.npmjs.org/stable/-/stable-0.1.8.tgz",
-      "integrity": "sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w==",
-      "dev": true
+    "signal-exit": {
+      "version": "3.0.7",
+      "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz",
+      "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ=="
     },
     },
-    "stack-chain": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/stack-chain/-/stack-chain-2.0.0.tgz",
-      "integrity": "sha512-GGrHXePi305aW7XQweYZZwiRwR7Js3MWoK/EHzzB9ROdc75nCnjSJVi21rdAGxFl+yCx2L2qdfl5y7NO4lTyqg==",
-      "dev": true
+    "simple-concat": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/simple-concat/-/simple-concat-1.0.1.tgz",
+      "integrity": "sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q=="
     },
     },
-    "stack-generator": {
-      "version": "2.0.10",
-      "resolved": "https://registry.npmjs.org/stack-generator/-/stack-generator-2.0.10.tgz",
-      "integrity": "sha512-mwnua/hkqM6pF4k8SnmZ2zfETsRUpWXREfA/goT8SLCV4iOFa4bzOX2nDipWAZFPTjLvQB82f5yaodMVhK0yJQ==",
-      "dev": true,
+    "simple-get": {
+      "version": "3.1.1",
+      "resolved": "https://registry.npmjs.org/simple-get/-/simple-get-3.1.1.tgz",
+      "integrity": "sha512-CQ5LTKGfCpvE1K0n2us+kuMPbk/q0EKl82s4aheV9oXjFEz6W/Y7oQFVJuU6QG77hRT4Ghb5RURteF5vnWjupA==",
+      "optional": true,
       "requires": {
       "requires": {
-        "stackframe": "^1.3.4"
+        "decompress-response": "^4.2.0",
+        "once": "^1.3.1",
+        "simple-concat": "^1.0.0"
       }
     },
       }
     },
-    "stack-trace": {
-      "version": "0.0.10",
-      "resolved": "https://registry.npmjs.org/stack-trace/-/stack-trace-0.0.10.tgz",
-      "integrity": "sha512-KGzahc7puUKkzyMt+IqAep+TVNbKP+k2Lmwhub39m1AsTSkaDutx56aDCo+HLDzf/D26BIHTJWNiTG1KAJiQCg==",
-      "dev": true
-    },
-    "stack-utils": {
-      "version": "2.0.5",
-      "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.5.tgz",
-      "integrity": "sha512-xrQcmYhOsn/1kX+Vraq+7j4oE2j/6BFscZ0etmYg81xuM8Gq0022Pxb8+IqgOFUIaxHs0KaSb7T1+OegiNrNFA==",
-      "dev": true,
+    "simplebar": {
+      "version": "5.3.9",
+      "resolved": "https://registry.npmjs.org/simplebar/-/simplebar-5.3.9.tgz",
+      "integrity": "sha512-1vIIpjDvY9sVH14e0LGeiCiTFU3ILqAghzO6OI9axeG+mvU/vMSrvXeAXkBolqFFz3XYaY8n5ahH9MeP3sp2Ag==",
       "requires": {
       "requires": {
-        "escape-string-regexp": "^2.0.0"
-      },
-      "dependencies": {
-        "escape-string-regexp": {
-          "version": "2.0.0",
-          "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz",
-          "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==",
-          "dev": true
-        }
+        "@juggle/resize-observer": "^3.3.1",
+        "can-use-dom": "^0.1.0",
+        "core-js": "^3.0.1",
+        "lodash.debounce": "^4.0.8",
+        "lodash.memoize": "^4.1.2",
+        "lodash.throttle": "^4.1.1"
       }
     },
       }
     },
-    "stackframe": {
-      "version": "1.3.4",
-      "resolved": "https://registry.npmjs.org/stackframe/-/stackframe-1.3.4.tgz",
-      "integrity": "sha512-oeVtt7eWQS+Na6F//S4kJ2K2VbRlS9D43mAlMyVpVWovy9o+jfgH8O9agzANzaiLjclA0oYzUXEM4PurhSUChw==",
-      "dev": true
-    },
-    "stacktrace-gps": {
-      "version": "3.1.2",
-      "resolved": "https://registry.npmjs.org/stacktrace-gps/-/stacktrace-gps-3.1.2.tgz",
-      "integrity": "sha512-GcUgbO4Jsqqg6RxfyTHFiPxdPqF+3LFmQhm7MgCuYQOYuWyqxo5pwRPz5d/u6/WYJdEnWfK4r+jGbyD8TSggXQ==",
-      "dev": true,
+    "simplebar-angular": {
+      "version": "2.3.6",
+      "resolved": "https://registry.npmjs.org/simplebar-angular/-/simplebar-angular-2.3.6.tgz",
+      "integrity": "sha512-chSUdCYCLOdajbCA73oL/OU+H/YFNGGdAYkcYx76YDY81C3sj3vMePjuW8cPgZZHwSCGI+opcl6xoBsCK56fJA==",
       "requires": {
       "requires": {
-        "source-map": "0.5.6",
-        "stackframe": "^1.3.4"
-      },
-      "dependencies": {
-        "source-map": {
-          "version": "0.5.6",
-          "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.6.tgz",
-          "integrity": "sha512-MjZkVp0NHr5+TPihLcadqnlVoGIoWo4IBHptutGh9wI3ttUYvCG26HkSuDi+K6lsZ25syXJXcctwgyVCt//xqA==",
-          "dev": true
+        "simplebar": "^5.3.6",
+        "tslib": "^1.9.0"
+      },
+      "dependencies": {
+        "tslib": {
+          "version": "1.14.1",
+          "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz",
+          "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg=="
         }
       }
     },
         }
       }
     },
-    "stacktrace-js": {
-      "version": "2.0.2",
-      "resolved": "https://registry.npmjs.org/stacktrace-js/-/stacktrace-js-2.0.2.tgz",
-      "integrity": "sha512-Je5vBeY4S1r/RnLydLl0TBTi3F2qdfWmYsGvtfZgEI+SCprPppaIhQf5nGcal4gI4cGpCV/duLcAzT1np6sQqg==",
-      "dev": true,
-      "requires": {
-        "error-stack-parser": "^2.0.6",
-        "stack-generator": "^2.0.5",
-        "stacktrace-gps": "^3.0.4"
-      }
+    "sisteransi": {
+      "version": "1.0.5",
+      "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz",
+      "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==",
+      "dev": true
     },
     },
-    "start-server-and-test": {
-      "version": "1.12.1",
-      "resolved": "https://registry.npmjs.org/start-server-and-test/-/start-server-and-test-1.12.1.tgz",
-      "integrity": "sha512-qGQ2HQiF2yDIfyaHsXkHfoE5UOl4zJUbJ/gx2xOkfX7iPMXW9qHmoFyaMfIDJVLNkxCK7RxSrvWEI9hNVKQluw==",
+    "slash": {
+      "version": "4.0.0",
+      "resolved": "https://registry.npmjs.org/slash/-/slash-4.0.0.tgz",
+      "integrity": "sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew==",
+      "dev": true
+    },
+    "slice-ansi": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-3.0.0.tgz",
+      "integrity": "sha512-pSyv7bSTC7ig9Dcgbw9AuRNUb5k5V6oDudjZoMBSr13qpLBG7tB+zgCkARjq7xIUgdz5P1Qe8u+rSGdouOOIyQ==",
       "dev": true,
       "requires": {
       "dev": true,
       "requires": {
-        "bluebird": "3.7.2",
-        "check-more-types": "2.24.0",
-        "debug": "4.3.1",
-        "execa": "3.4.0",
-        "lazy-ass": "1.6.0",
-        "ps-tree": "1.2.0",
-        "wait-on": "5.3.0"
+        "ansi-styles": "^4.0.0",
+        "astral-regex": "^2.0.0",
+        "is-fullwidth-code-point": "^3.0.0"
       },
       "dependencies": {
       },
       "dependencies": {
-        "cross-spawn": {
-          "version": "7.0.3",
-          "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz",
-          "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==",
+        "ansi-styles": {
+          "version": "4.3.0",
+          "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
+          "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
           "dev": true,
           "requires": {
           "dev": true,
           "requires": {
-            "path-key": "^3.1.0",
-            "shebang-command": "^2.0.0",
-            "which": "^2.0.1"
+            "color-convert": "^2.0.1"
           }
         },
           }
         },
-        "debug": {
-          "version": "4.3.1",
-          "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz",
-          "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==",
+        "color-convert": {
+          "version": "2.0.1",
+          "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
+          "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
           "dev": true,
           "requires": {
           "dev": true,
           "requires": {
-            "ms": "2.1.2"
+            "color-name": "~1.1.4"
           }
         },
           }
         },
-        "execa": {
-          "version": "3.4.0",
-          "resolved": "https://registry.npmjs.org/execa/-/execa-3.4.0.tgz",
-          "integrity": "sha512-r9vdGQk4bmCuK1yKQu1KTwcT2zwfWdbdaXfCtAh+5nU/4fSX+JAb7vZGvI5naJrQlvONrEB20jeruESI69530g==",
+        "color-name": {
+          "version": "1.1.4",
+          "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
+          "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
+          "dev": true
+        }
+      }
+    },
+    "smart-buffer": {
+      "version": "4.2.0",
+      "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.2.0.tgz",
+      "integrity": "sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==",
+      "dev": true
+    },
+    "snapdragon": {
+      "version": "0.8.2",
+      "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz",
+      "integrity": "sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==",
+      "dev": true,
+      "requires": {
+        "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"
+      },
+      "dependencies": {
+        "debug": {
+          "version": "2.6.9",
+          "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
+          "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
           "dev": true,
           "requires": {
           "dev": true,
           "requires": {
-            "cross-spawn": "^7.0.0",
-            "get-stream": "^5.0.0",
-            "human-signals": "^1.1.1",
-            "is-stream": "^2.0.0",
-            "merge-stream": "^2.0.0",
-            "npm-run-path": "^4.0.0",
-            "onetime": "^5.1.0",
-            "p-finally": "^2.0.0",
-            "signal-exit": "^3.0.2",
-            "strip-final-newline": "^2.0.0"
+            "ms": "2.0.0"
           }
         },
           }
         },
-        "get-stream": {
-          "version": "5.2.0",
-          "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz",
-          "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==",
+        "define-property": {
+          "version": "0.2.5",
+          "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz",
+          "integrity": "sha512-Rr7ADjQZenceVOAKop6ALkkRAmH1A4Gx9hV/7ZujPUN2rkATqFO0JZLZInbAjpZYoJ1gUx8MRMQVkYemcbMSTA==",
           "dev": true,
           "requires": {
           "dev": true,
           "requires": {
-            "pump": "^3.0.0"
+            "is-descriptor": "^0.1.0"
           }
         },
           }
         },
-        "is-stream": {
+        "extend-shallow": {
           "version": "2.0.1",
           "version": "2.0.1",
-          "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz",
-          "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==",
-          "dev": true
-        },
-        "npm-run-path": {
-          "version": "4.0.1",
-          "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz",
-          "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==",
+          "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
+          "integrity": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==",
           "dev": true,
           "requires": {
           "dev": true,
           "requires": {
-            "path-key": "^3.0.0"
+            "is-extendable": "^0.1.0"
           }
         },
           }
         },
-        "p-finally": {
-          "version": "2.0.1",
-          "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-2.0.1.tgz",
-          "integrity": "sha512-vpm09aKwq6H9phqRQzecoDpD8TmVyGw70qmWlyq5onxY7tqyTTFVvxMykxQSQKILBSFlbXpypIw2T1Ml7+DDtw==",
-          "dev": true
-        },
-        "path-key": {
-          "version": "3.1.1",
-          "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz",
-          "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==",
-          "dev": true
-        },
-        "shebang-command": {
+        "ms": {
           "version": "2.0.0",
           "version": "2.0.0",
-          "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz",
-          "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==",
-          "dev": true,
-          "requires": {
-            "shebang-regex": "^3.0.0"
-          }
+          "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
+          "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==",
+          "dev": true
         },
         },
-        "shebang-regex": {
-          "version": "3.0.0",
-          "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz",
-          "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==",
+        "source-map": {
+          "version": "0.5.7",
+          "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz",
+          "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==",
           "dev": true
         },
           "dev": true
         },
-        "which": {
-          "version": "2.0.2",
-          "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz",
-          "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==",
+        "source-map-resolve": {
+          "version": "0.5.3",
+          "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.3.tgz",
+          "integrity": "sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw==",
           "dev": true,
           "requires": {
           "dev": true,
           "requires": {
-            "isexe": "^2.0.0"
+            "atob": "^2.1.2",
+            "decode-uri-component": "^0.2.0",
+            "resolve-url": "^0.2.1",
+            "source-map-url": "^0.4.0",
+            "urix": "^0.1.0"
           }
         }
       }
     },
           }
         }
       }
     },
-    "static-eval": {
-      "version": "2.1.0",
-      "resolved": "https://registry.npmjs.org/static-eval/-/static-eval-2.1.0.tgz",
-      "integrity": "sha512-agtxZ/kWSsCkI5E4QifRwsaPs0P0JmZV6dkLz6ILYfFYQGn+5plctanRN+IC8dJRiFkyXHrwEE3W9Wmx67uDbw==",
-      "dev": true,
-      "requires": {
-        "escodegen": "^1.11.1"
-      }
-    },
-    "static-extend": {
-      "version": "0.1.2",
-      "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz",
-      "integrity": "sha512-72E9+uLc27Mt718pMHt9VMNiAL4LMsmDbBva8mxWUCkT07fSzEGMYUCk0XWY6lp0j6RBAG4cJ3mWuZv2OE3s0g==",
+    "snapdragon-node": {
+      "version": "2.1.1",
+      "resolved": "https://registry.npmjs.org/snapdragon-node/-/snapdragon-node-2.1.1.tgz",
+      "integrity": "sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==",
       "dev": true,
       "requires": {
       "dev": true,
       "requires": {
-        "define-property": "^0.2.5",
-        "object-copy": "^0.1.0"
+        "define-property": "^1.0.0",
+        "isobject": "^3.0.0",
+        "snapdragon-util": "^3.0.1"
       },
       "dependencies": {
         "define-property": {
       },
       "dependencies": {
         "define-property": {
-          "version": "0.2.5",
-          "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz",
-          "integrity": "sha512-Rr7ADjQZenceVOAKop6ALkkRAmH1A4Gx9hV/7ZujPUN2rkATqFO0JZLZInbAjpZYoJ1gUx8MRMQVkYemcbMSTA==",
-          "dev": true,
-          "requires": {
-            "is-descriptor": "^0.1.0"
-          }
-        }
-      }
-    },
-    "static-module": {
-      "version": "3.0.4",
-      "resolved": "https://registry.npmjs.org/static-module/-/static-module-3.0.4.tgz",
-      "integrity": "sha512-gb0v0rrgpBkifXCa3yZXxqVmXDVE+ETXj6YlC/jt5VzOnGXR2C15+++eXuMDUYsePnbhf+lwW0pE1UXyOLtGCw==",
-      "dev": true,
-      "requires": {
-        "acorn-node": "^1.3.0",
-        "concat-stream": "~1.6.0",
-        "convert-source-map": "^1.5.1",
-        "duplexer2": "~0.1.4",
-        "escodegen": "^1.11.1",
-        "has": "^1.0.1",
-        "magic-string": "0.25.1",
-        "merge-source-map": "1.0.4",
-        "object-inspect": "^1.6.0",
-        "readable-stream": "~2.3.3",
-        "scope-analyzer": "^2.0.1",
-        "shallow-copy": "~0.0.1",
-        "static-eval": "^2.0.5",
-        "through2": "~2.0.3"
-      },
-      "dependencies": {
-        "magic-string": {
-          "version": "0.25.1",
-          "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.25.1.tgz",
-          "integrity": "sha512-sCuTz6pYom8Rlt4ISPFn6wuFodbKMIHUMv4Qko9P17dpxb7s52KJTmRuZZqHdGmLCK9AOcDare039nRIcfdkEg==",
+          "version": "1.0.0",
+          "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz",
+          "integrity": "sha512-cZTYKFWspt9jZsMscWo8sc/5lbPC9Q0N5nBLgb+Yd915iL3udB1uFgS3B8YCx66UVHq018DAVFoee7x+gxggeA==",
           "dev": true,
           "requires": {
           "dev": true,
           "requires": {
-            "sourcemap-codec": "^1.4.1"
+            "is-descriptor": "^1.0.0"
           }
         },
           }
         },
-        "merge-source-map": {
-          "version": "1.0.4",
-          "resolved": "https://registry.npmjs.org/merge-source-map/-/merge-source-map-1.0.4.tgz",
-          "integrity": "sha512-PGSmS0kfnTnMJCzJ16BLLCEe6oeYCamKFFdQKshi4BmM6FUwipjVOcBFGxqtQtirtAG4iZvHlqST9CpZKqlRjA==",
+        "is-accessor-descriptor": {
+          "version": "1.0.0",
+          "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz",
+          "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==",
           "dev": true,
           "requires": {
           "dev": true,
           "requires": {
-            "source-map": "^0.5.6"
+            "kind-of": "^6.0.0"
           }
         },
           }
         },
-        "readable-stream": {
-          "version": "2.3.7",
-          "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz",
-          "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==",
+        "is-data-descriptor": {
+          "version": "1.0.0",
+          "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz",
+          "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==",
           "dev": true,
           "requires": {
           "dev": true,
           "requires": {
-            "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"
+            "kind-of": "^6.0.0"
           }
         },
           }
         },
-        "string_decoder": {
-          "version": "1.1.1",
-          "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz",
-          "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
+        "is-descriptor": {
+          "version": "1.0.2",
+          "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz",
+          "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==",
           "dev": true,
           "requires": {
           "dev": true,
           "requires": {
-            "safe-buffer": "~5.1.0"
+            "is-accessor-descriptor": "^1.0.0",
+            "is-data-descriptor": "^1.0.0",
+            "kind-of": "^6.0.2"
           }
         }
       }
     },
           }
         }
       }
     },
-    "statuses": {
-      "version": "2.0.1",
-      "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz",
-      "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==",
-      "dev": true
-    },
-    "stealthy-require": {
-      "version": "1.1.1",
-      "resolved": "https://registry.npmjs.org/stealthy-require/-/stealthy-require-1.1.1.tgz",
-      "integrity": "sha512-ZnWpYnYugiOVEY5GkcuJK1io5V8QmNYChG62gSit9pQVGErXtrKuPC55ITaVSukmMta5qpMU7vqLt2Lnni4f/g==",
-      "dev": true
-    },
-    "stream-browserify": {
-      "version": "2.0.2",
-      "resolved": "https://registry.npmjs.org/stream-browserify/-/stream-browserify-2.0.2.tgz",
-      "integrity": "sha512-nX6hmklHs/gr2FuxYDltq8fJA1GDlxKQCz8O/IM4atRqBH8OORmBNgfvW5gG10GT/qQ9u0CzIvr2X5Pkt6ntqg==",
+    "snapdragon-util": {
+      "version": "3.0.1",
+      "resolved": "https://registry.npmjs.org/snapdragon-util/-/snapdragon-util-3.0.1.tgz",
+      "integrity": "sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==",
       "dev": true,
       "requires": {
       "dev": true,
       "requires": {
-        "inherits": "~2.0.1",
-        "readable-stream": "^2.0.2"
+        "kind-of": "^3.2.0"
       },
       "dependencies": {
       },
       "dependencies": {
-        "readable-stream": {
-          "version": "2.3.7",
-          "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz",
-          "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==",
-          "dev": true,
-          "requires": {
-            "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"
-          }
-        },
-        "string_decoder": {
-          "version": "1.1.1",
-          "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz",
-          "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
+        "kind-of": {
+          "version": "3.2.2",
+          "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
+          "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==",
           "dev": true,
           "requires": {
           "dev": true,
           "requires": {
-            "safe-buffer": "~5.1.0"
+            "is-buffer": "^1.1.5"
           }
         }
       }
     },
           }
         }
       }
     },
-    "stream-buffers": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/stream-buffers/-/stream-buffers-1.0.1.tgz",
-      "integrity": "sha512-t+8bSU8qPq7NnWHWAvikjcZf+biErLZzD15RroYft1IKQwYbkRyiwppT7kNqwdtYLS59YPxc4sTSvwbLSMaodw==",
-      "dev": true
+    "sockjs": {
+      "version": "0.3.24",
+      "resolved": "https://registry.npmjs.org/sockjs/-/sockjs-0.3.24.tgz",
+      "integrity": "sha512-GJgLTZ7vYb/JtPSSZ10hsOYIvEYsjbNU+zPdIHcUaWVNUEPivzxku31865sSSud0Da0W4lEeOPlmw93zLQchuQ==",
+      "dev": true,
+      "requires": {
+        "faye-websocket": "^0.11.3",
+        "uuid": "^8.3.2",
+        "websocket-driver": "^0.7.4"
+      }
     },
     },
-    "stream-combiner": {
-      "version": "0.2.2",
-      "resolved": "https://registry.npmjs.org/stream-combiner/-/stream-combiner-0.2.2.tgz",
-      "integrity": "sha512-6yHMqgLYDzQDcAkL+tjJDC5nSNuNIx0vZtRZeiPh7Saef7VHX9H5Ijn9l2VIol2zaNYlYEX6KyuT/237A58qEQ==",
+    "socks": {
+      "version": "2.7.1",
+      "resolved": "https://registry.npmjs.org/socks/-/socks-2.7.1.tgz",
+      "integrity": "sha512-7maUZy1N7uo6+WVEX6psASxtNlKaNVMlGQKkG/63nEDdLOWNbiUMoLK7X4uYoLhQstau72mLgfEWcXcwsaHbYQ==",
       "dev": true,
       "requires": {
       "dev": true,
       "requires": {
-        "duplexer": "~0.1.1",
-        "through": "~2.3.4"
+        "ip": "^2.0.0",
+        "smart-buffer": "^4.2.0"
+      },
+      "dependencies": {
+        "ip": {
+          "version": "2.0.0",
+          "resolved": "https://registry.npmjs.org/ip/-/ip-2.0.0.tgz",
+          "integrity": "sha512-WKa+XuLG1A1R0UWhl2+1XQSi+fZWMsYKffMZTTYsiZaUD8k2yDAj5atimTUD2TZkyCkNEeYE5NhFZmupOGtjYQ==",
+          "dev": true
+        }
       }
     },
       }
     },
-    "stream-combiner2": {
-      "version": "1.1.1",
-      "resolved": "https://registry.npmjs.org/stream-combiner2/-/stream-combiner2-1.1.1.tgz",
-      "integrity": "sha512-3PnJbYgS56AeWgtKF5jtJRT6uFJe56Z0Hc5Ngg/6sI6rIt8iiMBTa9cvdyFfpMQjaVHr8dusbNeFGIIonxOvKw==",
+    "socks-proxy-agent": {
+      "version": "6.2.1",
+      "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-6.2.1.tgz",
+      "integrity": "sha512-a6KW9G+6B3nWZ1yB8G7pJwL3ggLy1uTzKAgCb7ttblwqdz9fMGJUuTy3uFzEP48FAs9FLILlmzDlE2JJhVQaXQ==",
       "dev": true,
       "requires": {
       "dev": true,
       "requires": {
-        "duplexer2": "~0.1.0",
-        "readable-stream": "^2.0.2"
+        "agent-base": "^6.0.2",
+        "debug": "^4.3.3",
+        "socks": "^2.6.2"
+      }
+    },
+    "source-map": {
+      "version": "0.7.3",
+      "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz",
+      "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==",
+      "dev": true
+    },
+    "source-map-js": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz",
+      "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==",
+      "dev": true
+    },
+    "source-map-loader": {
+      "version": "3.0.1",
+      "resolved": "https://registry.npmjs.org/source-map-loader/-/source-map-loader-3.0.1.tgz",
+      "integrity": "sha512-Vp1UsfyPvgujKQzi4pyDiTOnE3E4H+yHvkVRN3c/9PJmQS4CQJExvcDvaX/D+RV+xQben9HJ56jMJS3CgUeWyA==",
+      "dev": true,
+      "requires": {
+        "abab": "^2.0.5",
+        "iconv-lite": "^0.6.3",
+        "source-map-js": "^1.0.1"
       },
       "dependencies": {
       },
       "dependencies": {
-        "readable-stream": {
-          "version": "2.3.7",
-          "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz",
-          "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==",
-          "dev": true,
-          "requires": {
-            "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"
-          }
-        },
-        "string_decoder": {
-          "version": "1.1.1",
-          "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz",
-          "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
+        "iconv-lite": {
+          "version": "0.6.3",
+          "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz",
+          "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==",
           "dev": true,
           "requires": {
           "dev": true,
           "requires": {
-            "safe-buffer": "~5.1.0"
+            "safer-buffer": ">= 2.1.2 < 3.0.0"
           }
         }
       }
     },
           }
         }
       }
     },
-    "stream-http": {
-      "version": "3.2.0",
-      "resolved": "https://registry.npmjs.org/stream-http/-/stream-http-3.2.0.tgz",
-      "integrity": "sha512-Oq1bLqisTyK3TSCXpPbT4sdeYNdmyZJv1LxpEm2vu1ZhK89kSE5YXwZc3cWk0MagGaKriBh9mCFbVGtO+vY29A==",
+    "source-map-resolve": {
+      "version": "0.6.0",
+      "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.6.0.tgz",
+      "integrity": "sha512-KXBr9d/fO/bWo97NXsPIAW1bFSBOuCnjbNTBMO7N59hsv5i9yzRDfcYwwt0l04+VqnKC+EwzvJZIP/qkuMgR/w==",
       "dev": true,
       "requires": {
       "dev": true,
       "requires": {
-        "builtin-status-codes": "^3.0.0",
-        "inherits": "^2.0.4",
-        "readable-stream": "^3.6.0",
-        "xtend": "^4.0.2"
+        "atob": "^2.1.2",
+        "decode-uri-component": "^0.2.0"
       }
     },
       }
     },
-    "stream-splicer": {
-      "version": "2.0.1",
-      "resolved": "https://registry.npmjs.org/stream-splicer/-/stream-splicer-2.0.1.tgz",
-      "integrity": "sha512-Xizh4/NPuYSyAXyT7g8IvdJ9HJpxIGL9PjyhtywCZvvP0OPIdqyrr4dMikeuvY8xahpdKEBlBTySe583totajg==",
+    "source-map-support": {
+      "version": "0.5.21",
+      "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz",
+      "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==",
       "dev": true,
       "requires": {
       "dev": true,
       "requires": {
-        "inherits": "^2.0.1",
-        "readable-stream": "^2.0.2"
+        "buffer-from": "^1.0.0",
+        "source-map": "^0.6.0"
       },
       "dependencies": {
       },
       "dependencies": {
-        "readable-stream": {
-          "version": "2.3.7",
-          "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz",
-          "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==",
-          "dev": true,
-          "requires": {
-            "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"
-          }
-        },
-        "string_decoder": {
-          "version": "1.1.1",
-          "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz",
-          "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
-          "dev": true,
-          "requires": {
-            "safe-buffer": "~5.1.0"
-          }
+        "source-map": {
+          "version": "0.6.1",
+          "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+          "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+          "dev": true
         }
       }
     },
         }
       }
     },
-    "streamroller": {
+    "source-map-url": {
       "version": "0.4.1",
       "version": "0.4.1",
-      "resolved": "https://registry.npmjs.org/streamroller/-/streamroller-0.4.1.tgz",
-      "integrity": "sha512-w0GGkMlWOiIBIYTmOWHTWKy9Y5hKxGKpQ5WpiHqwhvoSoMHXNTITrk6ZsR3fdgz3Bi/c+CXVHwmfPUQFkEPL+A==",
+      "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.1.tgz",
+      "integrity": "sha512-cPiFOTLUKvJFIg4SKVScy4ilPPW6rFgMgfuZJPNoDuMs3nC1HbMUycBoJw77xFIp6z1UJQJOfx6C9GMH80DiTw==",
+      "dev": true
+    },
+    "sourcemap-codec": {
+      "version": "1.4.8",
+      "resolved": "https://registry.npmjs.org/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz",
+      "integrity": "sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==",
+      "dev": true
+    },
+    "space-separated-tokens": {
+      "version": "1.1.5",
+      "resolved": "https://registry.npmjs.org/space-separated-tokens/-/space-separated-tokens-1.1.5.tgz",
+      "integrity": "sha512-q/JSVd1Lptzhf5bkYm4ob4iWPjx0KiRe3sRFBNrVqbJkFaBm5vbbowy1mymoPNLRa52+oadOhJ+K49wsSeSjTA=="
+    },
+    "spdx-correct": {
+      "version": "3.1.1",
+      "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.1.tgz",
+      "integrity": "sha512-cOYcUWwhCuHCXi49RhFRCyJEK3iPj1Ziz9DpViV3tbZOwXD49QzIN3MpOLJNxh2qwq2lJJZaKMVw9qNi4jTC0w==",
       "dev": true,
       "requires": {
       "dev": true,
       "requires": {
-        "date-format": "^0.0.0",
-        "debug": "^0.7.2",
-        "mkdirp": "^0.5.1",
-        "readable-stream": "^1.1.7"
+        "spdx-expression-parse": "^3.0.0",
+        "spdx-license-ids": "^3.0.0"
+      }
+    },
+    "spdx-exceptions": {
+      "version": "2.3.0",
+      "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz",
+      "integrity": "sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==",
+      "dev": true
+    },
+    "spdx-expression-parse": {
+      "version": "3.0.1",
+      "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz",
+      "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==",
+      "dev": true,
+      "requires": {
+        "spdx-exceptions": "^2.1.0",
+        "spdx-license-ids": "^3.0.0"
+      }
+    },
+    "spdx-license-ids": {
+      "version": "3.0.12",
+      "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.12.tgz",
+      "integrity": "sha512-rr+VVSXtRhO4OHbXUiAF7xW3Bo9DuuF6C5jH+q/x15j2jniycgKbxU09Hr0WqlSLUs4i4ltHGXqTe7VHclYWyA==",
+      "dev": true
+    },
+    "spdy": {
+      "version": "4.0.2",
+      "resolved": "https://registry.npmjs.org/spdy/-/spdy-4.0.2.tgz",
+      "integrity": "sha512-r46gZQZQV+Kl9oItvl1JZZqJKGr+oEkB08A6BzkiR7593/7IbtuncXHd2YoYeTsG4157ZssMu9KYvUHLcjcDoA==",
+      "dev": true,
+      "requires": {
+        "debug": "^4.1.0",
+        "handle-thing": "^2.0.0",
+        "http-deceiver": "^1.2.7",
+        "select-hose": "^2.0.0",
+        "spdy-transport": "^3.0.0"
+      }
+    },
+    "spdy-transport": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/spdy-transport/-/spdy-transport-3.0.0.tgz",
+      "integrity": "sha512-hsLVFE5SjA6TCisWeJXFKniGGOpBgMLmerfO2aCyCU5s7nJ/rpAepqmFifv/GCbSbueEeAJJnmSQ2rKC/g8Fcw==",
+      "dev": true,
+      "requires": {
+        "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"
       },
       "dependencies": {
       },
       "dependencies": {
-        "debug": {
-          "version": "0.7.4",
-          "resolved": "https://registry.npmjs.org/debug/-/debug-0.7.4.tgz",
-          "integrity": "sha512-EohAb3+DSHSGx8carOSKJe8G0ayV5/i609OD0J2orCkuyae7SyZSz2aoLmQF2s0Pj5gITDebwPH7GFBlqOUQ1Q==",
-          "dev": true
-        },
-        "isarray": {
-          "version": "0.0.1",
-          "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz",
-          "integrity": "sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==",
-          "dev": true
-        },
-        "mkdirp": {
-          "version": "0.5.6",
-          "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz",
-          "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==",
-          "dev": true,
-          "requires": {
-            "minimist": "^1.2.6"
-          }
-        },
         "readable-stream": {
         "readable-stream": {
-          "version": "1.1.14",
-          "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz",
-          "integrity": "sha512-+MeVjFf4L44XUkhM1eYbD8fyEsxcV81pqMSR5gblfcLCHfZvbrqy4/qYHE+/R5HoBUT11WV5O08Cr1n3YXkWVQ==",
+          "version": "3.6.1",
+          "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.1.tgz",
+          "integrity": "sha512-+rQmrWMYGA90yenhTYsLWAsLsqVC8osOw6PKE1HDYiO0gdPeKe/xDHNzIAIn4C91YQ6oenEhfYqqc1883qHbjQ==",
           "dev": true,
           "requires": {
           "dev": true,
           "requires": {
-            "core-util-is": "~1.0.0",
-            "inherits": "~2.0.1",
-            "isarray": "0.0.1",
-            "string_decoder": "~0.10.x"
+            "inherits": "^2.0.3",
+            "string_decoder": "^1.1.1",
+            "util-deprecate": "^1.0.1"
           }
           }
-        },
-        "string_decoder": {
-          "version": "0.10.31",
-          "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz",
-          "integrity": "sha512-ev2QzSzWPYmy9GuqfIVildA4OdcGLeFZQrq5ys6RtiuF+RQQiZWr8TZNyAcuVXyQRYfEO+MsoB/1BuQVhOJuoQ==",
-          "dev": true
         }
       }
     },
         }
       }
     },
-    "string-argv": {
-      "version": "0.0.2",
-      "resolved": "https://registry.npmjs.org/string-argv/-/string-argv-0.0.2.tgz",
-      "integrity": "sha512-p6/Mqq0utTQWUeGMi/m0uBtlLZEwXSY3+mXzeRRqw7fz5ezUb28Wr0R99NlfbWaMmL/jCyT9be4jpn7Yz8IO8w==",
-      "dev": true
-    },
-    "string-length": {
-      "version": "4.0.2",
-      "resolved": "https://registry.npmjs.org/string-length/-/string-length-4.0.2.tgz",
-      "integrity": "sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==",
+    "specificity": {
+      "version": "0.4.1",
+      "resolved": "https://registry.npmjs.org/specificity/-/specificity-0.4.1.tgz",
+      "integrity": "sha512-1klA3Gi5PD1Wv9Q0wUoOQN1IWAuPu0D1U03ThXTr0cJ20+/iq2tHSDnK7Kk/0LXJ1ztUB2/1Os0wKmfyNgUQfg==",
+      "dev": true
+    },
+    "split": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/split/-/split-1.0.1.tgz",
+      "integrity": "sha512-mTyOoPbrivtXnwnIxZRFYRrPNtEFKlpB2fvjSnCQUiAA6qAZzqwna5envK4uk6OIeP17CsdF3rSBGYVBsU0Tkg==",
       "dev": true,
       "requires": {
       "dev": true,
       "requires": {
-        "char-regex": "^1.0.2",
-        "strip-ansi": "^6.0.0"
+        "through": "2"
       }
     },
       }
     },
-    "string-width": {
-      "version": "4.2.3",
-      "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz",
-      "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==",
+    "split-string": {
+      "version": "3.1.0",
+      "resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz",
+      "integrity": "sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==",
+      "dev": true,
       "requires": {
       "requires": {
-        "emoji-regex": "^8.0.0",
-        "is-fullwidth-code-point": "^3.0.0",
-        "strip-ansi": "^6.0.1"
+        "extend-shallow": "^3.0.0"
       }
     },
       }
     },
-    "string.prototype.padend": {
-      "version": "3.1.3",
-      "resolved": "https://registry.npmjs.org/string.prototype.padend/-/string.prototype.padend-3.1.3.tgz",
-      "integrity": "sha512-jNIIeokznm8SD/TZISQsZKYu7RJyheFNt84DUPrh482GC8RVp2MKqm2O5oBRdGxbDQoXrhhWtPIWQOiy20svUg==",
+    "sprintf-js": {
+      "version": "1.0.3",
+      "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz",
+      "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g=="
+    },
+    "sshpk": {
+      "version": "1.17.0",
+      "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.17.0.tgz",
+      "integrity": "sha512-/9HIEs1ZXGhSPE8X6Ccm7Nam1z8KcoCqPdI7ecm1N33EzAetWahvQWVqLZtaZQ+IDKX4IyA2o0gBzqIMkAagHQ==",
       "dev": true,
       "requires": {
       "dev": true,
       "requires": {
-        "call-bind": "^1.0.2",
-        "define-properties": "^1.1.3",
-        "es-abstract": "^1.19.1"
+        "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"
       }
     },
       }
     },
-    "string.prototype.trimend": {
-      "version": "1.0.5",
-      "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.5.tgz",
-      "integrity": "sha512-I7RGvmjV4pJ7O3kdf+LXFpVfdNOxtCW/2C8f6jNiW4+PQchwxkCDzlk1/7p+Wl4bqFIZeF47qAHXLuHHWKAxog==",
+    "ssri": {
+      "version": "8.0.1",
+      "resolved": "https://registry.npmjs.org/ssri/-/ssri-8.0.1.tgz",
+      "integrity": "sha512-97qShzy1AiyxvPNIkLWoGua7xoQzzPjQ0HAH4B0rWKo7SZ6USuPcrUiAFrws0UH8RrbWmgq3LMTObhPIHbbBeQ==",
       "dev": true,
       "requires": {
       "dev": true,
       "requires": {
-        "call-bind": "^1.0.2",
-        "define-properties": "^1.1.4",
-        "es-abstract": "^1.19.5"
+        "minipass": "^3.1.1"
       }
     },
       }
     },
-    "string.prototype.trimstart": {
-      "version": "1.0.5",
-      "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.5.tgz",
-      "integrity": "sha512-THx16TJCGlsN0o6dl2o6ncWUsdgnLRSA23rRE5pyGBw/mLr3Ej/R2LaqCtgP8VNMGZsvMWnf9ooZPyY2bHvUFg==",
+    "stack-chain": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/stack-chain/-/stack-chain-2.0.0.tgz",
+      "integrity": "sha512-GGrHXePi305aW7XQweYZZwiRwR7Js3MWoK/EHzzB9ROdc75nCnjSJVi21rdAGxFl+yCx2L2qdfl5y7NO4lTyqg==",
+      "dev": true
+    },
+    "stack-generator": {
+      "version": "2.0.10",
+      "resolved": "https://registry.npmjs.org/stack-generator/-/stack-generator-2.0.10.tgz",
+      "integrity": "sha512-mwnua/hkqM6pF4k8SnmZ2zfETsRUpWXREfA/goT8SLCV4iOFa4bzOX2nDipWAZFPTjLvQB82f5yaodMVhK0yJQ==",
       "dev": true,
       "requires": {
       "dev": true,
       "requires": {
-        "call-bind": "^1.0.2",
-        "define-properties": "^1.1.4",
-        "es-abstract": "^1.19.5"
+        "stackframe": "^1.3.4"
       }
     },
       }
     },
-    "string_decoder": {
-      "version": "1.3.0",
-      "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz",
-      "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==",
+    "stack-trace": {
+      "version": "0.0.10",
+      "resolved": "https://registry.npmjs.org/stack-trace/-/stack-trace-0.0.10.tgz",
+      "integrity": "sha512-KGzahc7puUKkzyMt+IqAep+TVNbKP+k2Lmwhub39m1AsTSkaDutx56aDCo+HLDzf/D26BIHTJWNiTG1KAJiQCg==",
+      "dev": true
+    },
+    "stack-utils": {
+      "version": "2.0.6",
+      "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.6.tgz",
+      "integrity": "sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==",
       "dev": true,
       "requires": {
       "dev": true,
       "requires": {
-        "safe-buffer": "~5.2.0"
+        "escape-string-regexp": "^2.0.0"
       },
       "dependencies": {
       },
       "dependencies": {
-        "safe-buffer": {
-          "version": "5.2.1",
-          "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz",
-          "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==",
+        "escape-string-regexp": {
+          "version": "2.0.0",
+          "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz",
+          "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==",
           "dev": true
         }
       }
     },
           "dev": true
         }
       }
     },
-    "strip-ansi": {
-      "version": "6.0.1",
-      "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
-      "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
-      "requires": {
-        "ansi-regex": "^5.0.1"
-      }
-    },
-    "strip-bom": {
-      "version": "4.0.0",
-      "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz",
-      "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==",
-      "dev": true
-    },
-    "strip-eof": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz",
-      "integrity": "sha512-7FCwGGmx8mD5xQd3RPUvnSpUXHM3BWuzjtpD4TXsfcZ9EL4azvVVUscFYwD9nx8Kh+uCBC00XBtAykoMHwTh8Q==",
-      "dev": true
-    },
-    "strip-final-newline": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz",
-      "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==",
+    "stackframe": {
+      "version": "1.3.4",
+      "resolved": "https://registry.npmjs.org/stackframe/-/stackframe-1.3.4.tgz",
+      "integrity": "sha512-oeVtt7eWQS+Na6F//S4kJ2K2VbRlS9D43mAlMyVpVWovy9o+jfgH8O9agzANzaiLjclA0oYzUXEM4PurhSUChw==",
       "dev": true
     },
       "dev": true
     },
-    "strip-indent": {
-      "version": "3.0.0",
-      "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-3.0.0.tgz",
-      "integrity": "sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==",
+    "stacktrace-gps": {
+      "version": "3.1.2",
+      "resolved": "https://registry.npmjs.org/stacktrace-gps/-/stacktrace-gps-3.1.2.tgz",
+      "integrity": "sha512-GcUgbO4Jsqqg6RxfyTHFiPxdPqF+3LFmQhm7MgCuYQOYuWyqxo5pwRPz5d/u6/WYJdEnWfK4r+jGbyD8TSggXQ==",
       "dev": true,
       "requires": {
       "dev": true,
       "requires": {
-        "min-indent": "^1.0.0"
+        "source-map": "0.5.6",
+        "stackframe": "^1.3.4"
+      },
+      "dependencies": {
+        "source-map": {
+          "version": "0.5.6",
+          "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.6.tgz",
+          "integrity": "sha512-MjZkVp0NHr5+TPihLcadqnlVoGIoWo4IBHptutGh9wI3ttUYvCG26HkSuDi+K6lsZ25syXJXcctwgyVCt//xqA==",
+          "dev": true
+        }
       }
     },
       }
     },
-    "strip-json-comments": {
-      "version": "3.1.1",
-      "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz",
-      "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==",
-      "dev": true
-    },
-    "style-loader": {
-      "version": "3.2.1",
-      "resolved": "https://registry.npmjs.org/style-loader/-/style-loader-3.2.1.tgz",
-      "integrity": "sha512-1k9ZosJCRFaRbY6hH49JFlRB0fVSbmnyq1iTPjNxUmGVjBNEmwrrHPenhlp+Lgo51BojHSf6pl2FcqYaN3PfVg==",
-      "dev": true
-    },
-    "style-search": {
-      "version": "0.1.0",
-      "resolved": "https://registry.npmjs.org/style-search/-/style-search-0.1.0.tgz",
-      "integrity": "sha512-Dj1Okke1C3uKKwQcetra4jSuk0DqbzbYtXipzFlFMZtowbF1x7BKJwB9AayVMyFARvU8EDrZdcax4At/452cAg==",
-      "dev": true
-    },
-    "stylehacks": {
-      "version": "5.1.0",
-      "resolved": "https://registry.npmjs.org/stylehacks/-/stylehacks-5.1.0.tgz",
-      "integrity": "sha512-SzLmvHQTrIWfSgljkQCw2++C9+Ne91d/6Sp92I8c5uHTcy/PgeHamwITIbBW9wnFTY/3ZfSXR9HIL6Ikqmcu6Q==",
+    "stacktrace-js": {
+      "version": "2.0.2",
+      "resolved": "https://registry.npmjs.org/stacktrace-js/-/stacktrace-js-2.0.2.tgz",
+      "integrity": "sha512-Je5vBeY4S1r/RnLydLl0TBTi3F2qdfWmYsGvtfZgEI+SCprPppaIhQf5nGcal4gI4cGpCV/duLcAzT1np6sQqg==",
       "dev": true,
       "requires": {
       "dev": true,
       "requires": {
-        "browserslist": "^4.16.6",
-        "postcss-selector-parser": "^6.0.4"
+        "error-stack-parser": "^2.0.6",
+        "stack-generator": "^2.0.5",
+        "stacktrace-gps": "^3.0.4"
       }
     },
       }
     },
-    "stylelint": {
-      "version": "13.13.1",
-      "resolved": "https://registry.npmjs.org/stylelint/-/stylelint-13.13.1.tgz",
-      "integrity": "sha512-Mv+BQr5XTUrKqAXmpqm6Ddli6Ief+AiPZkRsIrAoUKFuq/ElkUh9ZMYxXD0iQNZ5ADghZKLOWz1h7hTClB7zgQ==",
+    "stampit": {
+      "version": "4.3.2",
+      "resolved": "https://registry.npmjs.org/stampit/-/stampit-4.3.2.tgz",
+      "integrity": "sha512-pE2org1+ZWQBnIxRPrBM2gVupkuDD0TTNIo1H6GdT/vO82NXli2z8lRE8cu/nBIHrcOCXFBAHpb9ZldrB2/qOA=="
+    },
+    "start-server-and-test": {
+      "version": "1.12.1",
+      "resolved": "https://registry.npmjs.org/start-server-and-test/-/start-server-and-test-1.12.1.tgz",
+      "integrity": "sha512-qGQ2HQiF2yDIfyaHsXkHfoE5UOl4zJUbJ/gx2xOkfX7iPMXW9qHmoFyaMfIDJVLNkxCK7RxSrvWEI9hNVKQluw==",
       "dev": true,
       "requires": {
       "dev": true,
       "requires": {
-        "@stylelint/postcss-css-in-js": "^0.37.2",
-        "@stylelint/postcss-markdown": "^0.36.2",
-        "autoprefixer": "^9.8.6",
-        "balanced-match": "^2.0.0",
-        "chalk": "^4.1.1",
-        "cosmiconfig": "^7.0.0",
-        "debug": "^4.3.1",
-        "execall": "^2.0.0",
-        "fast-glob": "^3.2.5",
-        "fastest-levenshtein": "^1.0.12",
-        "file-entry-cache": "^6.0.1",
-        "get-stdin": "^8.0.0",
-        "global-modules": "^2.0.0",
-        "globby": "^11.0.3",
-        "globjoin": "^0.1.4",
-        "html-tags": "^3.1.0",
-        "ignore": "^5.1.8",
-        "import-lazy": "^4.0.0",
-        "imurmurhash": "^0.1.4",
-        "known-css-properties": "^0.21.0",
-        "lodash": "^4.17.21",
-        "log-symbols": "^4.1.0",
-        "mathml-tag-names": "^2.1.3",
-        "meow": "^9.0.0",
-        "micromatch": "^4.0.4",
-        "normalize-selector": "^0.2.0",
-        "postcss": "^7.0.35",
-        "postcss-html": "^0.36.0",
-        "postcss-less": "^3.1.4",
-        "postcss-media-query-parser": "^0.2.3",
-        "postcss-resolve-nested-selector": "^0.1.1",
-        "postcss-safe-parser": "^4.0.2",
-        "postcss-sass": "^0.4.4",
-        "postcss-scss": "^2.1.1",
-        "postcss-selector-parser": "^6.0.5",
-        "postcss-syntax": "^0.36.2",
-        "postcss-value-parser": "^4.1.0",
-        "resolve-from": "^5.0.0",
-        "slash": "^3.0.0",
-        "specificity": "^0.4.1",
-        "string-width": "^4.2.2",
-        "strip-ansi": "^6.0.0",
-        "style-search": "^0.1.0",
-        "sugarss": "^2.0.0",
-        "svg-tags": "^1.0.0",
-        "table": "^6.6.0",
-        "v8-compile-cache": "^2.3.0",
-        "write-file-atomic": "^3.0.3"
-      },
-      "dependencies": {
-        "ansi-styles": {
-          "version": "4.3.0",
-          "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
-          "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
-          "dev": true,
-          "requires": {
-            "color-convert": "^2.0.1"
-          }
-        },
-        "balanced-match": {
-          "version": "2.0.0",
-          "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-2.0.0.tgz",
-          "integrity": "sha512-1ugUSr8BHXRnK23KfuYS+gVMC3LB8QGH9W1iGtDPsNWoQbgtXSExkBu2aDR4epiGWZOjZsj6lDl/N/AqqTC3UA==",
-          "dev": true
-        },
-        "chalk": {
-          "version": "4.1.2",
-          "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
-          "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
-          "dev": true,
-          "requires": {
-            "ansi-styles": "^4.1.0",
-            "supports-color": "^7.1.0"
-          }
-        },
-        "color-convert": {
-          "version": "2.0.1",
-          "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
-          "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
-          "dev": true,
-          "requires": {
-            "color-name": "~1.1.4"
-          }
-        },
-        "color-name": {
-          "version": "1.1.4",
-          "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
-          "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
-          "dev": true
-        },
-        "global-modules": {
-          "version": "2.0.0",
-          "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-2.0.0.tgz",
-          "integrity": "sha512-NGbfmJBp9x8IxyJSd1P+otYK8vonoJactOogrVfFRIAEY1ukil8RSKDz2Yo7wh1oihl51l/r6W4epkeKJHqL8A==",
+        "bluebird": "3.7.2",
+        "check-more-types": "2.24.0",
+        "debug": "4.3.1",
+        "execa": "3.4.0",
+        "lazy-ass": "1.6.0",
+        "ps-tree": "1.2.0",
+        "wait-on": "5.3.0"
+      },
+      "dependencies": {
+        "debug": {
+          "version": "4.3.1",
+          "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz",
+          "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==",
           "dev": true,
           "requires": {
           "dev": true,
           "requires": {
-            "global-prefix": "^3.0.0"
+            "ms": "2.1.2"
           }
         },
           }
         },
-        "global-prefix": {
-          "version": "3.0.0",
-          "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-3.0.0.tgz",
-          "integrity": "sha512-awConJSVCHVGND6x3tmMaKcQvwXLhjdkmomy2W+Goaui8YPgYgXJZewhg3fWC+DlfqqQuWg8AwqjGTD2nAPVWg==",
+        "execa": {
+          "version": "3.4.0",
+          "resolved": "https://registry.npmjs.org/execa/-/execa-3.4.0.tgz",
+          "integrity": "sha512-r9vdGQk4bmCuK1yKQu1KTwcT2zwfWdbdaXfCtAh+5nU/4fSX+JAb7vZGvI5naJrQlvONrEB20jeruESI69530g==",
           "dev": true,
           "requires": {
           "dev": true,
           "requires": {
-            "ini": "^1.3.5",
-            "kind-of": "^6.0.2",
-            "which": "^1.3.1"
+            "cross-spawn": "^7.0.0",
+            "get-stream": "^5.0.0",
+            "human-signals": "^1.1.1",
+            "is-stream": "^2.0.0",
+            "merge-stream": "^2.0.0",
+            "npm-run-path": "^4.0.0",
+            "onetime": "^5.1.0",
+            "p-finally": "^2.0.0",
+            "signal-exit": "^3.0.2",
+            "strip-final-newline": "^2.0.0"
           }
         },
           }
         },
-        "has-flag": {
-          "version": "4.0.0",
-          "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
-          "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
-          "dev": true
-        },
-        "ini": {
-          "version": "1.3.8",
-          "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz",
-          "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==",
-          "dev": true
-        },
-        "picocolors": {
-          "version": "0.2.1",
-          "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz",
-          "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==",
-          "dev": true
-        },
-        "postcss": {
-          "version": "7.0.39",
-          "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz",
-          "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==",
+        "get-stream": {
+          "version": "5.2.0",
+          "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz",
+          "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==",
           "dev": true,
           "requires": {
           "dev": true,
           "requires": {
-            "picocolors": "^0.2.1",
-            "source-map": "^0.6.1"
+            "pump": "^3.0.0"
           }
         },
           }
         },
-        "resolve-from": {
-          "version": "5.0.0",
-          "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz",
-          "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==",
+        "human-signals": {
+          "version": "1.1.1",
+          "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-1.1.1.tgz",
+          "integrity": "sha512-SEQu7vl8KjNL2eoGBLF3+wAjpsNfA9XMlXAYj/3EdaNfAlxKthD1xjEQfGOUhllCGGJVNY34bRr6lPINhNjyZw==",
           "dev": true
         },
           "dev": true
         },
-        "source-map": {
-          "version": "0.6.1",
-          "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
-          "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+        "p-finally": {
+          "version": "2.0.1",
+          "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-2.0.1.tgz",
+          "integrity": "sha512-vpm09aKwq6H9phqRQzecoDpD8TmVyGw70qmWlyq5onxY7tqyTTFVvxMykxQSQKILBSFlbXpypIw2T1Ml7+DDtw==",
           "dev": true
           "dev": true
-        },
-        "supports-color": {
-          "version": "7.2.0",
-          "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
-          "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
-          "dev": true,
-          "requires": {
-            "has-flag": "^4.0.0"
-          }
         }
       }
     },
         }
       }
     },
-    "stylelint-config-sass-guidelines": {
-      "version": "7.1.0",
-      "resolved": "https://registry.npmjs.org/stylelint-config-sass-guidelines/-/stylelint-config-sass-guidelines-7.1.0.tgz",
-      "integrity": "sha512-WvC9nRdlYknftPcUaJCajrPYKg6d2CKffrr7BPPkN/i/Mt8Qsm1hNQ9lqC1sKoCIKdH051SCEZi10qwFLgDbbg==",
+    "static-eval": {
+      "version": "2.1.0",
+      "resolved": "https://registry.npmjs.org/static-eval/-/static-eval-2.1.0.tgz",
+      "integrity": "sha512-agtxZ/kWSsCkI5E4QifRwsaPs0P0JmZV6dkLz6ILYfFYQGn+5plctanRN+IC8dJRiFkyXHrwEE3W9Wmx67uDbw==",
       "dev": true,
       "requires": {
       "dev": true,
       "requires": {
-        "stylelint-order": "^4.0.0",
-        "stylelint-scss": "^3.18.0"
+        "escodegen": "^1.11.1"
       }
     },
       }
     },
-    "stylelint-declaration-use-variable": {
-      "version": "1.7.3",
-      "resolved": "https://registry.npmjs.org/stylelint-declaration-use-variable/-/stylelint-declaration-use-variable-1.7.3.tgz",
-      "integrity": "sha512-6aH9aJcjT4QAzwgqcE+0td507lqBeSZGWbRf8nX7VJRNm8SQT//b2uoshQ4sNxKfJBH3S8RUWeVP37DgCjzZmQ==",
-      "dev": true
-    },
-    "stylelint-order": {
-      "version": "4.1.0",
-      "resolved": "https://registry.npmjs.org/stylelint-order/-/stylelint-order-4.1.0.tgz",
-      "integrity": "sha512-sVTikaDvMqg2aJjh4r48jsdfmqLT+nqB1MOsaBnvM3OwLx4S+WXcsxsgk5w18h/OZoxZCxuyXMh61iBHcj9Qiw==",
+    "static-extend": {
+      "version": "0.1.2",
+      "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz",
+      "integrity": "sha512-72E9+uLc27Mt718pMHt9VMNiAL4LMsmDbBva8mxWUCkT07fSzEGMYUCk0XWY6lp0j6RBAG4cJ3mWuZv2OE3s0g==",
       "dev": true,
       "requires": {
       "dev": true,
       "requires": {
-        "lodash": "^4.17.15",
-        "postcss": "^7.0.31",
-        "postcss-sorting": "^5.0.1"
+        "define-property": "^0.2.5",
+        "object-copy": "^0.1.0"
       },
       "dependencies": {
       },
       "dependencies": {
-        "picocolors": {
-          "version": "0.2.1",
-          "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz",
-          "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==",
-          "dev": true
-        },
-        "postcss": {
-          "version": "7.0.39",
-          "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz",
-          "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==",
+        "define-property": {
+          "version": "0.2.5",
+          "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz",
+          "integrity": "sha512-Rr7ADjQZenceVOAKop6ALkkRAmH1A4Gx9hV/7ZujPUN2rkATqFO0JZLZInbAjpZYoJ1gUx8MRMQVkYemcbMSTA==",
           "dev": true,
           "requires": {
           "dev": true,
           "requires": {
-            "picocolors": "^0.2.1",
-            "source-map": "^0.6.1"
+            "is-descriptor": "^0.1.0"
           }
           }
-        },
-        "source-map": {
-          "version": "0.6.1",
-          "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
-          "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
-          "dev": true
         }
       }
     },
         }
       }
     },
-    "stylelint-scss": {
-      "version": "3.21.0",
-      "resolved": "https://registry.npmjs.org/stylelint-scss/-/stylelint-scss-3.21.0.tgz",
-      "integrity": "sha512-CMI2wSHL+XVlNExpauy/+DbUcB/oUZLARDtMIXkpV/5yd8nthzylYd1cdHeDMJVBXeYHldsnebUX6MoV5zPW4A==",
-      "dev": true,
-      "requires": {
-        "lodash": "^4.17.15",
-        "postcss-media-query-parser": "^0.2.3",
-        "postcss-resolve-nested-selector": "^0.1.1",
-        "postcss-selector-parser": "^6.0.2",
-        "postcss-value-parser": "^4.1.0"
-      }
-    },
-    "stylus": {
-      "version": "0.54.8",
-      "resolved": "https://registry.npmjs.org/stylus/-/stylus-0.54.8.tgz",
-      "integrity": "sha512-vr54Or4BZ7pJafo2mpf0ZcwA74rpuYCZbxrHBsH8kbcXOwSfvBFwsRfpGO5OD5fhG5HDCFW737PKaawI7OqEAg==",
+    "static-module": {
+      "version": "3.0.4",
+      "resolved": "https://registry.npmjs.org/static-module/-/static-module-3.0.4.tgz",
+      "integrity": "sha512-gb0v0rrgpBkifXCa3yZXxqVmXDVE+ETXj6YlC/jt5VzOnGXR2C15+++eXuMDUYsePnbhf+lwW0pE1UXyOLtGCw==",
       "dev": true,
       "requires": {
       "dev": true,
       "requires": {
-        "css-parse": "~2.0.0",
-        "debug": "~3.1.0",
-        "glob": "^7.1.6",
-        "mkdirp": "~1.0.4",
-        "safer-buffer": "^2.1.2",
-        "sax": "~1.2.4",
-        "semver": "^6.3.0",
-        "source-map": "^0.7.3"
+        "acorn-node": "^1.3.0",
+        "concat-stream": "~1.6.0",
+        "convert-source-map": "^1.5.1",
+        "duplexer2": "~0.1.4",
+        "escodegen": "^1.11.1",
+        "has": "^1.0.1",
+        "magic-string": "0.25.1",
+        "merge-source-map": "1.0.4",
+        "object-inspect": "^1.6.0",
+        "readable-stream": "~2.3.3",
+        "scope-analyzer": "^2.0.1",
+        "shallow-copy": "~0.0.1",
+        "static-eval": "^2.0.5",
+        "through2": "~2.0.3"
       },
       "dependencies": {
       },
       "dependencies": {
-        "debug": {
-          "version": "3.1.0",
-          "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz",
-          "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==",
+        "magic-string": {
+          "version": "0.25.1",
+          "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.25.1.tgz",
+          "integrity": "sha512-sCuTz6pYom8Rlt4ISPFn6wuFodbKMIHUMv4Qko9P17dpxb7s52KJTmRuZZqHdGmLCK9AOcDare039nRIcfdkEg==",
           "dev": true,
           "requires": {
           "dev": true,
           "requires": {
-            "ms": "2.0.0"
+            "sourcemap-codec": "^1.4.1"
           }
           }
-        },
-        "ms": {
-          "version": "2.0.0",
-          "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
-          "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==",
-          "dev": true
-        },
-        "semver": {
-          "version": "6.3.0",
-          "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
-          "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==",
-          "dev": true
-        },
-        "source-map": {
-          "version": "0.7.4",
-          "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.4.tgz",
-          "integrity": "sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==",
-          "dev": true
         }
       }
     },
         }
       }
     },
-    "stylus-loader": {
-      "version": "6.1.0",
-      "resolved": "https://registry.npmjs.org/stylus-loader/-/stylus-loader-6.1.0.tgz",
-      "integrity": "sha512-qKO34QCsOtSJrXxQQmXsPeaVHh6hMumBAFIoJTcsSr2VzrA6o/CW9HCGR8spCjzJhN8oKQHdj/Ytx0wwXyElkw==",
+    "statuses": {
+      "version": "2.0.1",
+      "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz",
+      "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==",
+      "dev": true
+    },
+    "stealthy-require": {
+      "version": "1.1.1",
+      "resolved": "https://registry.npmjs.org/stealthy-require/-/stealthy-require-1.1.1.tgz",
+      "integrity": "sha512-ZnWpYnYugiOVEY5GkcuJK1io5V8QmNYChG62gSit9pQVGErXtrKuPC55ITaVSukmMta5qpMU7vqLt2Lnni4f/g==",
+      "dev": true
+    },
+    "stream-browserify": {
+      "version": "2.0.2",
+      "resolved": "https://registry.npmjs.org/stream-browserify/-/stream-browserify-2.0.2.tgz",
+      "integrity": "sha512-nX6hmklHs/gr2FuxYDltq8fJA1GDlxKQCz8O/IM4atRqBH8OORmBNgfvW5gG10GT/qQ9u0CzIvr2X5Pkt6ntqg==",
       "dev": true,
       "requires": {
       "dev": true,
       "requires": {
-        "fast-glob": "^3.2.5",
-        "klona": "^2.0.4",
-        "normalize-path": "^3.0.0"
+        "inherits": "~2.0.1",
+        "readable-stream": "^2.0.2"
+      }
+    },
+    "stream-buffers": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/stream-buffers/-/stream-buffers-1.0.1.tgz",
+      "integrity": "sha512-t+8bSU8qPq7NnWHWAvikjcZf+biErLZzD15RroYft1IKQwYbkRyiwppT7kNqwdtYLS59YPxc4sTSvwbLSMaodw==",
+      "dev": true
+    },
+    "stream-combiner": {
+      "version": "0.2.2",
+      "resolved": "https://registry.npmjs.org/stream-combiner/-/stream-combiner-0.2.2.tgz",
+      "integrity": "sha512-6yHMqgLYDzQDcAkL+tjJDC5nSNuNIx0vZtRZeiPh7Saef7VHX9H5Ijn9l2VIol2zaNYlYEX6KyuT/237A58qEQ==",
+      "dev": true,
+      "requires": {
+        "duplexer": "~0.1.1",
+        "through": "~2.3.4"
+      }
+    },
+    "stream-combiner2": {
+      "version": "1.1.1",
+      "resolved": "https://registry.npmjs.org/stream-combiner2/-/stream-combiner2-1.1.1.tgz",
+      "integrity": "sha512-3PnJbYgS56AeWgtKF5jtJRT6uFJe56Z0Hc5Ngg/6sI6rIt8iiMBTa9cvdyFfpMQjaVHr8dusbNeFGIIonxOvKw==",
+      "dev": true,
+      "requires": {
+        "duplexer2": "~0.1.0",
+        "readable-stream": "^2.0.2"
+      }
+    },
+    "stream-http": {
+      "version": "3.2.0",
+      "resolved": "https://registry.npmjs.org/stream-http/-/stream-http-3.2.0.tgz",
+      "integrity": "sha512-Oq1bLqisTyK3TSCXpPbT4sdeYNdmyZJv1LxpEm2vu1ZhK89kSE5YXwZc3cWk0MagGaKriBh9mCFbVGtO+vY29A==",
+      "dev": true,
+      "requires": {
+        "builtin-status-codes": "^3.0.0",
+        "inherits": "^2.0.4",
+        "readable-stream": "^3.6.0",
+        "xtend": "^4.0.2"
+      },
+      "dependencies": {
+        "readable-stream": {
+          "version": "3.6.1",
+          "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.1.tgz",
+          "integrity": "sha512-+rQmrWMYGA90yenhTYsLWAsLsqVC8osOw6PKE1HDYiO0gdPeKe/xDHNzIAIn4C91YQ6oenEhfYqqc1883qHbjQ==",
+          "dev": true,
+          "requires": {
+            "inherits": "^2.0.3",
+            "string_decoder": "^1.1.1",
+            "util-deprecate": "^1.0.1"
+          }
+        }
       }
     },
       }
     },
-    "subarg": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/subarg/-/subarg-1.0.0.tgz",
-      "integrity": "sha512-RIrIdRY0X1xojthNcVtgT9sjpOGagEUKpZdgBUi054OEPFo282yg+zE+t1Rj3+RqKq2xStL7uUHhY+AjbC4BXg==",
+    "stream-splicer": {
+      "version": "2.0.1",
+      "resolved": "https://registry.npmjs.org/stream-splicer/-/stream-splicer-2.0.1.tgz",
+      "integrity": "sha512-Xizh4/NPuYSyAXyT7g8IvdJ9HJpxIGL9PjyhtywCZvvP0OPIdqyrr4dMikeuvY8xahpdKEBlBTySe583totajg==",
       "dev": true,
       "requires": {
       "dev": true,
       "requires": {
-        "minimist": "^1.1.0"
+        "inherits": "^2.0.1",
+        "readable-stream": "^2.0.2"
       }
     },
       }
     },
-    "sugarss": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/sugarss/-/sugarss-2.0.0.tgz",
-      "integrity": "sha512-WfxjozUk0UVA4jm+U1d736AUpzSrNsQcIbyOkoE364GrtWmIrFdk5lksEupgWMD4VaT/0kVx1dobpiDumSgmJQ==",
+    "streamroller": {
+      "version": "0.4.1",
+      "resolved": "https://registry.npmjs.org/streamroller/-/streamroller-0.4.1.tgz",
+      "integrity": "sha512-w0GGkMlWOiIBIYTmOWHTWKy9Y5hKxGKpQ5WpiHqwhvoSoMHXNTITrk6ZsR3fdgz3Bi/c+CXVHwmfPUQFkEPL+A==",
       "dev": true,
       "requires": {
       "dev": true,
       "requires": {
-        "postcss": "^7.0.2"
+        "date-format": "^0.0.0",
+        "debug": "^0.7.2",
+        "mkdirp": "^0.5.1",
+        "readable-stream": "^1.1.7"
       },
       "dependencies": {
       },
       "dependencies": {
-        "picocolors": {
-          "version": "0.2.1",
-          "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz",
-          "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==",
+        "debug": {
+          "version": "0.7.4",
+          "resolved": "https://registry.npmjs.org/debug/-/debug-0.7.4.tgz",
+          "integrity": "sha512-EohAb3+DSHSGx8carOSKJe8G0ayV5/i609OD0J2orCkuyae7SyZSz2aoLmQF2s0Pj5gITDebwPH7GFBlqOUQ1Q==",
           "dev": true
         },
           "dev": true
         },
-        "postcss": {
-          "version": "7.0.39",
-          "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz",
-          "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==",
+        "isarray": {
+          "version": "0.0.1",
+          "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz",
+          "integrity": "sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==",
+          "dev": true
+        },
+        "mkdirp": {
+          "version": "0.5.6",
+          "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz",
+          "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==",
           "dev": true,
           "requires": {
           "dev": true,
           "requires": {
-            "picocolors": "^0.2.1",
-            "source-map": "^0.6.1"
+            "minimist": "^1.2.6"
           }
         },
           }
         },
-        "source-map": {
-          "version": "0.6.1",
-          "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
-          "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+        "readable-stream": {
+          "version": "1.1.14",
+          "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz",
+          "integrity": "sha512-+MeVjFf4L44XUkhM1eYbD8fyEsxcV81pqMSR5gblfcLCHfZvbrqy4/qYHE+/R5HoBUT11WV5O08Cr1n3YXkWVQ==",
+          "dev": true,
+          "requires": {
+            "core-util-is": "~1.0.0",
+            "inherits": "~2.0.1",
+            "isarray": "0.0.1",
+            "string_decoder": "~0.10.x"
+          }
+        },
+        "string_decoder": {
+          "version": "0.10.31",
+          "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz",
+          "integrity": "sha512-ev2QzSzWPYmy9GuqfIVildA4OdcGLeFZQrq5ys6RtiuF+RQQiZWr8TZNyAcuVXyQRYfEO+MsoB/1BuQVhOJuoQ==",
           "dev": true
         }
       }
     },
           "dev": true
         }
       }
     },
-    "supports-color": {
-      "version": "5.5.0",
-      "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
-      "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
+    "string-argv": {
+      "version": "0.0.2",
+      "resolved": "https://registry.npmjs.org/string-argv/-/string-argv-0.0.2.tgz",
+      "integrity": "sha512-p6/Mqq0utTQWUeGMi/m0uBtlLZEwXSY3+mXzeRRqw7fz5ezUb28Wr0R99NlfbWaMmL/jCyT9be4jpn7Yz8IO8w==",
+      "dev": true
+    },
+    "string-length": {
+      "version": "4.0.2",
+      "resolved": "https://registry.npmjs.org/string-length/-/string-length-4.0.2.tgz",
+      "integrity": "sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==",
+      "dev": true,
       "requires": {
       "requires": {
-        "has-flag": "^3.0.0"
+        "char-regex": "^1.0.2",
+        "strip-ansi": "^6.0.0"
       }
     },
       }
     },
-    "supports-hyperlinks": {
-      "version": "2.2.0",
-      "resolved": "https://registry.npmjs.org/supports-hyperlinks/-/supports-hyperlinks-2.2.0.tgz",
-      "integrity": "sha512-6sXEzV5+I5j8Bmq9/vUphGRM/RJNT9SCURJLjwfOg51heRtguGWDzcaBlgAzKhQa0EVNpPEKzQuBwZ8S8WaCeQ==",
-      "dev": true,
+    "string-width": {
+      "version": "4.2.3",
+      "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz",
+      "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==",
       "requires": {
       "requires": {
-        "has-flag": "^4.0.0",
-        "supports-color": "^7.0.0"
-      },
-      "dependencies": {
-        "has-flag": {
-          "version": "4.0.0",
-          "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
-          "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
-          "dev": true
-        },
-        "supports-color": {
-          "version": "7.2.0",
-          "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
-          "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
-          "dev": true,
-          "requires": {
-            "has-flag": "^4.0.0"
-          }
-        }
+        "emoji-regex": "^8.0.0",
+        "is-fullwidth-code-point": "^3.0.0",
+        "strip-ansi": "^6.0.1"
       }
     },
       }
     },
-    "supports-preserve-symlinks-flag": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz",
-      "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w=="
+    "string.prototype.padend": {
+      "version": "3.1.4",
+      "resolved": "https://registry.npmjs.org/string.prototype.padend/-/string.prototype.padend-3.1.4.tgz",
+      "integrity": "sha512-67otBXoksdjsnXXRUq+KMVTdlVRZ2af422Y0aTyTjVaoQkGr3mxl2Bc5emi7dOQ3OGVVQQskmLEWwFXwommpNw==",
+      "dev": true,
+      "requires": {
+        "call-bind": "^1.0.2",
+        "define-properties": "^1.1.4",
+        "es-abstract": "^1.20.4"
+      }
     },
     },
-    "svg-tags": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/svg-tags/-/svg-tags-1.0.0.tgz",
-      "integrity": "sha512-ovssysQTa+luh7A5Weu3Rta6FJlFBBbInjOh722LIt6klpU2/HtdUbszju/G4devcvk8PGt7FCLv5wftu3THUA==",
-      "dev": true
+    "string.prototype.trimend": {
+      "version": "1.0.6",
+      "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.6.tgz",
+      "integrity": "sha512-JySq+4mrPf9EsDBEDYMOb/lM7XQLulwg5R/m1r0PXEFqrV0qHvl58sdTilSXtKOflCsK2E8jxf+GKC0T07RWwQ==",
+      "dev": true,
+      "requires": {
+        "call-bind": "^1.0.2",
+        "define-properties": "^1.1.4",
+        "es-abstract": "^1.20.4"
+      }
     },
     },
-    "svgo": {
-      "version": "2.8.0",
-      "resolved": "https://registry.npmjs.org/svgo/-/svgo-2.8.0.tgz",
-      "integrity": "sha512-+N/Q9kV1+F+UeWYoSiULYo4xYSDQlTgb+ayMobAXPwMnLvop7oxKMo9OzIrX5x3eS4L4f2UHhc9axXwY8DpChg==",
+    "string.prototype.trimstart": {
+      "version": "1.0.6",
+      "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.6.tgz",
+      "integrity": "sha512-omqjMDaY92pbn5HOX7f9IccLA+U1tA9GvtU4JrodiXFfYB7jPzzHpRzpglLAjtUV6bB557zwClJezTqnAiYnQA==",
       "dev": true,
       "requires": {
       "dev": true,
       "requires": {
-        "@trysound/sax": "0.2.0",
-        "commander": "^7.2.0",
-        "css-select": "^4.1.3",
-        "css-tree": "^1.1.3",
-        "csso": "^4.2.0",
-        "picocolors": "^1.0.0",
-        "stable": "^0.1.8"
+        "call-bind": "^1.0.2",
+        "define-properties": "^1.1.4",
+        "es-abstract": "^1.20.4"
       }
     },
       }
     },
-    "swagger-client": {
-      "version": "3.18.5",
-      "resolved": "https://registry.npmjs.org/swagger-client/-/swagger-client-3.18.5.tgz",
-      "integrity": "sha512-c0txGDtfQTJnaIBaEKCwtRNcUaaAfj+RXI4QVV9p3WW+AUCQqp4naCjaDNNsOfMkE4ySyhnblbL+jGqAVC7snw==",
+    "string_decoder": {
+      "version": "1.1.1",
+      "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz",
+      "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
       "requires": {
       "requires": {
-        "@babel/runtime-corejs3": "^7.11.2",
-        "cookie": "~0.5.0",
-        "cross-fetch": "^3.1.5",
-        "deepmerge": "~4.2.2",
-        "fast-json-patch": "^3.0.0-1",
-        "form-data-encoder": "^1.4.3",
-        "formdata-node": "^4.0.0",
-        "is-plain-object": "^5.0.0",
-        "js-yaml": "^4.1.0",
-        "lodash": "^4.17.21",
-        "qs": "^6.10.2",
-        "traverse": "~0.6.6",
-        "url": "~0.11.0"
+        "safe-buffer": "~5.1.0"
+      },
+      "dependencies": {
+        "safe-buffer": {
+          "version": "5.1.2",
+          "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz",
+          "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g=="
+        }
       }
     },
       }
     },
-    "swagger-ui": {
-      "version": "4.12.0",
-      "resolved": "https://registry.npmjs.org/swagger-ui/-/swagger-ui-4.12.0.tgz",
-      "integrity": "sha512-ffNcDTQFWu5dEzJywQ4QEcgQZlBaHaeYCjifuWePds8anzqCZXVpeJSD7RCirUs+8D051YevRSu3ZjqNUNyvrQ==",
+    "strip-ansi": {
+      "version": "6.0.1",
+      "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
+      "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
       "requires": {
       "requires": {
-        "@babel/runtime-corejs3": "^7.16.8",
-        "@braintree/sanitize-url": "=6.0.0",
-        "base64-js": "^1.5.1",
-        "classnames": "^2.3.1",
-        "css.escape": "1.5.1",
-        "deep-extend": "0.6.0",
-        "dompurify": "=2.3.3",
-        "ieee754": "^1.2.1",
-        "immutable": "^3.x.x",
-        "js-file-download": "^0.4.12",
-        "js-yaml": "=4.1.0",
-        "lodash": "^4.17.21",
-        "prop-types": "^15.8.1",
-        "randexp": "^0.5.3",
-        "randombytes": "^2.1.0",
-        "react": "=17.0.2",
-        "react-copy-to-clipboard": "5.0.4",
-        "react-debounce-input": "=3.2.4",
-        "react-dom": "=17.0.2",
-        "react-immutable-proptypes": "2.2.0",
-        "react-immutable-pure-component": "^2.2.0",
-        "react-inspector": "^5.1.1",
-        "react-redux": "^7.2.4",
-        "react-syntax-highlighter": "^15.4.5",
-        "redux": "^4.1.2",
-        "redux-immutable": "^4.0.0",
-        "remarkable": "^2.0.1",
-        "reselect": "^4.1.5",
-        "serialize-error": "^8.1.0",
-        "sha.js": "^2.4.11",
-        "swagger-client": "^3.18.5",
-        "url-parse": "^1.5.8",
-        "xml": "=1.0.1",
-        "xml-but-prettier": "^1.0.1",
-        "zenscroll": "^4.0.2"
+        "ansi-regex": "^5.0.1"
       }
     },
       }
     },
-    "symbol-observable": {
-      "version": "4.0.0",
-      "resolved": "https://registry.npmjs.org/symbol-observable/-/symbol-observable-4.0.0.tgz",
-      "integrity": "sha512-b19dMThMV4HVFynSAM1++gBHAbk2Tc/osgLIBZMKsyqh34jb2e8Os7T6ZW/Bt3pJFdBTd2JwAnAAEQV7rSNvcQ==",
+    "strip-bom": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz",
+      "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==",
       "dev": true
     },
       "dev": true
     },
-    "symbol-tree": {
-      "version": "3.2.4",
-      "resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.4.tgz",
-      "integrity": "sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==",
+    "strip-eof": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz",
+      "integrity": "sha512-7FCwGGmx8mD5xQd3RPUvnSpUXHM3BWuzjtpD4TXsfcZ9EL4azvVVUscFYwD9nx8Kh+uCBC00XBtAykoMHwTh8Q==",
       "dev": true
     },
       "dev": true
     },
-    "syntax-error": {
-      "version": "1.4.0",
-      "resolved": "https://registry.npmjs.org/syntax-error/-/syntax-error-1.4.0.tgz",
-      "integrity": "sha512-YPPlu67mdnHGTup2A8ff7BC2Pjq0e0Yp/IyTFN03zWO0RcK07uLcbi7C2KpGR2FvWbaB0+bfE27a+sBKebSo7w==",
+    "strip-final-newline": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz",
+      "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==",
+      "dev": true
+    },
+    "strip-indent": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-3.0.0.tgz",
+      "integrity": "sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==",
       "dev": true,
       "requires": {
       "dev": true,
       "requires": {
-        "acorn-node": "^1.2.0"
+        "min-indent": "^1.0.0"
+      }
+    },
+    "strip-json-comments": {
+      "version": "2.0.1",
+      "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz",
+      "integrity": "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==",
+      "optional": true
+    },
+    "strong-log-transformer": {
+      "version": "2.1.0",
+      "resolved": "https://registry.npmjs.org/strong-log-transformer/-/strong-log-transformer-2.1.0.tgz",
+      "integrity": "sha512-B3Hgul+z0L9a236FAUC9iZsL+nVHgoCJnqCbN588DjYxvGXaXaaFbfmQ/JhvKjZwsOukuR72XbHv71Qkug0HxA==",
+      "dev": true,
+      "requires": {
+        "duplexer": "^0.1.1",
+        "minimist": "^1.2.0",
+        "through": "^2.3.4"
       }
     },
       }
     },
-    "table": {
-      "version": "6.8.0",
-      "resolved": "https://registry.npmjs.org/table/-/table-6.8.0.tgz",
-      "integrity": "sha512-s/fitrbVeEyHKFa7mFdkuQMWlH1Wgw/yEXMt5xACT4ZpzWFluehAxRtUUQKPuWhaLAWhFcVx6w3oC8VKaUfPGA==",
+    "style-search": {
+      "version": "0.1.0",
+      "resolved": "https://registry.npmjs.org/style-search/-/style-search-0.1.0.tgz",
+      "integrity": "sha512-Dj1Okke1C3uKKwQcetra4jSuk0DqbzbYtXipzFlFMZtowbF1x7BKJwB9AayVMyFARvU8EDrZdcax4At/452cAg==",
+      "dev": true
+    },
+    "stylelint": {
+      "version": "13.13.1",
+      "resolved": "https://registry.npmjs.org/stylelint/-/stylelint-13.13.1.tgz",
+      "integrity": "sha512-Mv+BQr5XTUrKqAXmpqm6Ddli6Ief+AiPZkRsIrAoUKFuq/ElkUh9ZMYxXD0iQNZ5ADghZKLOWz1h7hTClB7zgQ==",
       "dev": true,
       "requires": {
       "dev": true,
       "requires": {
-        "ajv": "^8.0.1",
-        "lodash.truncate": "^4.4.2",
-        "slice-ansi": "^4.0.0",
-        "string-width": "^4.2.3",
-        "strip-ansi": "^6.0.1"
+        "@stylelint/postcss-css-in-js": "^0.37.2",
+        "@stylelint/postcss-markdown": "^0.36.2",
+        "autoprefixer": "^9.8.6",
+        "balanced-match": "^2.0.0",
+        "chalk": "^4.1.1",
+        "cosmiconfig": "^7.0.0",
+        "debug": "^4.3.1",
+        "execall": "^2.0.0",
+        "fast-glob": "^3.2.5",
+        "fastest-levenshtein": "^1.0.12",
+        "file-entry-cache": "^6.0.1",
+        "get-stdin": "^8.0.0",
+        "global-modules": "^2.0.0",
+        "globby": "^11.0.3",
+        "globjoin": "^0.1.4",
+        "html-tags": "^3.1.0",
+        "ignore": "^5.1.8",
+        "import-lazy": "^4.0.0",
+        "imurmurhash": "^0.1.4",
+        "known-css-properties": "^0.21.0",
+        "lodash": "^4.17.21",
+        "log-symbols": "^4.1.0",
+        "mathml-tag-names": "^2.1.3",
+        "meow": "^9.0.0",
+        "micromatch": "^4.0.4",
+        "normalize-selector": "^0.2.0",
+        "postcss": "^7.0.35",
+        "postcss-html": "^0.36.0",
+        "postcss-less": "^3.1.4",
+        "postcss-media-query-parser": "^0.2.3",
+        "postcss-resolve-nested-selector": "^0.1.1",
+        "postcss-safe-parser": "^4.0.2",
+        "postcss-sass": "^0.4.4",
+        "postcss-scss": "^2.1.1",
+        "postcss-selector-parser": "^6.0.5",
+        "postcss-syntax": "^0.36.2",
+        "postcss-value-parser": "^4.1.0",
+        "resolve-from": "^5.0.0",
+        "slash": "^3.0.0",
+        "specificity": "^0.4.1",
+        "string-width": "^4.2.2",
+        "strip-ansi": "^6.0.0",
+        "style-search": "^0.1.0",
+        "sugarss": "^2.0.0",
+        "svg-tags": "^1.0.0",
+        "table": "^6.6.0",
+        "v8-compile-cache": "^2.3.0",
+        "write-file-atomic": "^3.0.3"
       },
       "dependencies": {
         "ansi-styles": {
       },
       "dependencies": {
         "ansi-styles": {
             "color-convert": "^2.0.1"
           }
         },
             "color-convert": "^2.0.1"
           }
         },
+        "array-union": {
+          "version": "2.1.0",
+          "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz",
+          "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==",
+          "dev": true
+        },
+        "autoprefixer": {
+          "version": "9.8.8",
+          "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-9.8.8.tgz",
+          "integrity": "sha512-eM9d/swFopRt5gdJ7jrpCwgvEMIayITpojhkkSMRsFHYuH5bkSQ4p/9qTEHtmNudUZh22Tehu7I6CxAW0IXTKA==",
+          "dev": true,
+          "requires": {
+            "browserslist": "^4.12.0",
+            "caniuse-lite": "^1.0.30001109",
+            "normalize-range": "^0.1.2",
+            "num2fraction": "^1.2.2",
+            "picocolors": "^0.2.1",
+            "postcss": "^7.0.32",
+            "postcss-value-parser": "^4.1.0"
+          }
+        },
+        "balanced-match": {
+          "version": "2.0.0",
+          "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-2.0.0.tgz",
+          "integrity": "sha512-1ugUSr8BHXRnK23KfuYS+gVMC3LB8QGH9W1iGtDPsNWoQbgtXSExkBu2aDR4epiGWZOjZsj6lDl/N/AqqTC3UA==",
+          "dev": true
+        },
+        "chalk": {
+          "version": "4.1.2",
+          "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
+          "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
+          "dev": true,
+          "requires": {
+            "ansi-styles": "^4.1.0",
+            "supports-color": "^7.1.0"
+          }
+        },
         "color-convert": {
           "version": "2.0.1",
           "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
         "color-convert": {
           "version": "2.0.1",
           "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
           "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
           "dev": true
         },
           "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
           "dev": true
         },
-        "slice-ansi": {
-          "version": "4.0.0",
-          "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz",
-          "integrity": "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==",
+        "global-modules": {
+          "version": "2.0.0",
+          "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-2.0.0.tgz",
+          "integrity": "sha512-NGbfmJBp9x8IxyJSd1P+otYK8vonoJactOogrVfFRIAEY1ukil8RSKDz2Yo7wh1oihl51l/r6W4epkeKJHqL8A==",
           "dev": true,
           "requires": {
           "dev": true,
           "requires": {
-            "ansi-styles": "^4.0.0",
-            "astral-regex": "^2.0.0",
-            "is-fullwidth-code-point": "^3.0.0"
+            "global-prefix": "^3.0.0"
           }
           }
-        }
-      }
-    },
-    "tapable": {
-      "version": "2.2.1",
-      "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz",
-      "integrity": "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==",
-      "dev": true
-    },
-    "tar": {
-      "version": "6.1.11",
-      "resolved": "https://registry.npmjs.org/tar/-/tar-6.1.11.tgz",
-      "integrity": "sha512-an/KZQzQUkZCkuoAA64hM92X0Urb6VpRhAFllDzz44U2mcD5scmT3zBc4VgVpkugF580+DQn8eAFSyoQt0tznA==",
-      "dev": true,
-      "requires": {
-        "chownr": "^2.0.0",
-        "fs-minipass": "^2.0.0",
-        "minipass": "^3.0.0",
-        "minizlib": "^2.1.1",
-        "mkdirp": "^1.0.3",
-        "yallist": "^4.0.0"
-      }
-    },
-    "terminal-link": {
-      "version": "2.1.1",
-      "resolved": "https://registry.npmjs.org/terminal-link/-/terminal-link-2.1.1.tgz",
-      "integrity": "sha512-un0FmiRUQNr5PJqy9kP7c40F5BOfpGlYTrxonDChEZB7pzZxRNp/bt+ymiy9/npwXya9KH99nJ/GXFIiUkYGFQ==",
-      "dev": true,
-      "requires": {
-        "ansi-escapes": "^4.2.1",
-        "supports-hyperlinks": "^2.0.0"
-      }
-    },
-    "terser": {
-      "version": "5.7.1",
-      "resolved": "https://registry.npmjs.org/terser/-/terser-5.7.1.tgz",
-      "integrity": "sha512-b3e+d5JbHAe/JSjwsC3Zn55wsBIM7AsHLjKxT31kGCldgbpFePaFo+PiddtO6uwRZWRw7sPXmAN8dTW61xmnSg==",
-      "dev": true,
-      "requires": {
-        "commander": "^2.20.0",
-        "source-map": "~0.7.2",
-        "source-map-support": "~0.5.19"
-      },
-      "dependencies": {
-        "commander": {
-          "version": "2.20.3",
-          "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz",
-          "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==",
-          "dev": true
         },
         },
-        "source-map": {
-          "version": "0.7.4",
-          "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.4.tgz",
-          "integrity": "sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==",
-          "dev": true
-        }
-      }
-    },
-    "terser-webpack-plugin": {
-      "version": "5.1.4",
-      "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.1.4.tgz",
-      "integrity": "sha512-C2WkFwstHDhVEmsmlCxrXUtVklS+Ir1A7twrYzrDrQQOIMOaVAYykaoo/Aq1K0QRkMoY2hhvDQY1cm4jnIMFwA==",
-      "dev": true,
-      "requires": {
-        "jest-worker": "^27.0.2",
-        "p-limit": "^3.1.0",
-        "schema-utils": "^3.0.0",
-        "serialize-javascript": "^6.0.0",
-        "source-map": "^0.6.1",
-        "terser": "^5.7.0"
-      },
-      "dependencies": {
-        "ajv": {
-          "version": "6.12.6",
-          "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz",
-          "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==",
+        "global-prefix": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-3.0.0.tgz",
+          "integrity": "sha512-awConJSVCHVGND6x3tmMaKcQvwXLhjdkmomy2W+Goaui8YPgYgXJZewhg3fWC+DlfqqQuWg8AwqjGTD2nAPVWg==",
           "dev": true,
           "requires": {
           "dev": true,
           "requires": {
-            "fast-deep-equal": "^3.1.1",
-            "fast-json-stable-stringify": "^2.0.0",
-            "json-schema-traverse": "^0.4.1",
-            "uri-js": "^4.2.2"
+            "ini": "^1.3.5",
+            "kind-of": "^6.0.2",
+            "which": "^1.3.1"
           }
         },
           }
         },
-        "json-schema-traverse": {
-          "version": "0.4.1",
-          "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz",
-          "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==",
-          "dev": true
-        },
-        "p-limit": {
-          "version": "3.1.0",
-          "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz",
-          "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==",
+        "globby": {
+          "version": "11.1.0",
+          "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz",
+          "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==",
           "dev": true,
           "requires": {
           "dev": true,
           "requires": {
-            "yocto-queue": "^0.1.0"
+            "array-union": "^2.1.0",
+            "dir-glob": "^3.0.1",
+            "fast-glob": "^3.2.9",
+            "ignore": "^5.2.0",
+            "merge2": "^1.4.1",
+            "slash": "^3.0.0"
           }
         },
           }
         },
-        "schema-utils": {
-          "version": "3.1.1",
-          "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz",
-          "integrity": "sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==",
+        "has-flag": {
+          "version": "4.0.0",
+          "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
+          "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+          "dev": true
+        },
+        "picocolors": {
+          "version": "0.2.1",
+          "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz",
+          "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==",
+          "dev": true
+        },
+        "postcss": {
+          "version": "7.0.39",
+          "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz",
+          "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==",
           "dev": true,
           "requires": {
           "dev": true,
           "requires": {
-            "@types/json-schema": "^7.0.8",
-            "ajv": "^6.12.5",
-            "ajv-keywords": "^3.5.2"
+            "picocolors": "^0.2.1",
+            "source-map": "^0.6.1"
           }
         },
           }
         },
+        "slash": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz",
+          "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==",
+          "dev": true
+        },
         "source-map": {
           "version": "0.6.1",
           "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
           "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
           "dev": true
         "source-map": {
           "version": "0.6.1",
           "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
           "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
           "dev": true
-        }
-      }
-    },
-    "test-exclude": {
-      "version": "6.0.0",
-      "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz",
-      "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==",
-      "dev": true,
-      "requires": {
-        "@istanbuljs/schema": "^0.1.2",
-        "glob": "^7.1.4",
-        "minimatch": "^3.0.4"
-      }
-    },
-    "text-table": {
-      "version": "0.2.0",
-      "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz",
-      "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==",
-      "dev": true
-    },
-    "thenify": {
-      "version": "3.3.1",
-      "resolved": "https://registry.npmjs.org/thenify/-/thenify-3.3.1.tgz",
-      "integrity": "sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==",
-      "dev": true,
-      "requires": {
-        "any-promise": "^1.0.0"
+        },
+        "supports-color": {
+          "version": "7.2.0",
+          "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
+          "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
+          "dev": true,
+          "requires": {
+            "has-flag": "^4.0.0"
+          }
+        },
+        "which": {
+          "version": "1.3.1",
+          "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz",
+          "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==",
+          "dev": true,
+          "requires": {
+            "isexe": "^2.0.0"
+          }
+        },
+        "write-file-atomic": {
+          "version": "3.0.3",
+          "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz",
+          "integrity": "sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==",
+          "dev": true,
+          "requires": {
+            "imurmurhash": "^0.1.4",
+            "is-typedarray": "^1.0.0",
+            "signal-exit": "^3.0.2",
+            "typedarray-to-buffer": "^3.1.5"
+          }
+        }
       }
     },
       }
     },
-    "thenify-all": {
-      "version": "1.6.0",
-      "resolved": "https://registry.npmjs.org/thenify-all/-/thenify-all-1.6.0.tgz",
-      "integrity": "sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==",
+    "stylelint-config-sass-guidelines": {
+      "version": "7.1.0",
+      "resolved": "https://registry.npmjs.org/stylelint-config-sass-guidelines/-/stylelint-config-sass-guidelines-7.1.0.tgz",
+      "integrity": "sha512-WvC9nRdlYknftPcUaJCajrPYKg6d2CKffrr7BPPkN/i/Mt8Qsm1hNQ9lqC1sKoCIKdH051SCEZi10qwFLgDbbg==",
       "dev": true,
       "requires": {
       "dev": true,
       "requires": {
-        "thenify": ">= 3.1.0 < 4"
+        "stylelint-order": "^4.0.0",
+        "stylelint-scss": "^3.18.0"
       }
     },
       }
     },
-    "throat": {
-      "version": "5.0.0",
-      "resolved": "https://registry.npmjs.org/throat/-/throat-5.0.0.tgz",
-      "integrity": "sha512-fcwX4mndzpLQKBS1DVYhGAcYaYt7vsHNIvQV+WXMvnow5cgjPphq5CaayLaGsjRdSCKZFNGt7/GYAuXaNOiYCA==",
-      "dev": true
-    },
-    "throttleit": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/throttleit/-/throttleit-1.0.0.tgz",
-      "integrity": "sha512-rkTVqu6IjfQ/6+uNuuc3sZek4CEYxTJom3IktzgdSxcZqdARuebbA/f4QmAxMQIxqq9ZLEUkSYqvuk1I6VKq4g==",
-      "dev": true
-    },
-    "through": {
-      "version": "2.3.8",
-      "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz",
-      "integrity": "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==",
+    "stylelint-declaration-use-variable": {
+      "version": "1.7.3",
+      "resolved": "https://registry.npmjs.org/stylelint-declaration-use-variable/-/stylelint-declaration-use-variable-1.7.3.tgz",
+      "integrity": "sha512-6aH9aJcjT4QAzwgqcE+0td507lqBeSZGWbRf8nX7VJRNm8SQT//b2uoshQ4sNxKfJBH3S8RUWeVP37DgCjzZmQ==",
       "dev": true
     },
       "dev": true
     },
-    "through2": {
-      "version": "2.0.5",
-      "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz",
-      "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==",
+    "stylelint-order": {
+      "version": "4.1.0",
+      "resolved": "https://registry.npmjs.org/stylelint-order/-/stylelint-order-4.1.0.tgz",
+      "integrity": "sha512-sVTikaDvMqg2aJjh4r48jsdfmqLT+nqB1MOsaBnvM3OwLx4S+WXcsxsgk5w18h/OZoxZCxuyXMh61iBHcj9Qiw==",
       "dev": true,
       "requires": {
       "dev": true,
       "requires": {
-        "readable-stream": "~2.3.6",
-        "xtend": "~4.0.1"
+        "lodash": "^4.17.15",
+        "postcss": "^7.0.31",
+        "postcss-sorting": "^5.0.1"
       },
       "dependencies": {
       },
       "dependencies": {
-        "readable-stream": {
-          "version": "2.3.7",
-          "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz",
-          "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==",
-          "dev": true,
-          "requires": {
-            "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"
-          }
+        "picocolors": {
+          "version": "0.2.1",
+          "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz",
+          "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==",
+          "dev": true
         },
         },
-        "string_decoder": {
-          "version": "1.1.1",
-          "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz",
-          "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
+        "postcss": {
+          "version": "7.0.39",
+          "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz",
+          "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==",
           "dev": true,
           "requires": {
           "dev": true,
           "requires": {
-            "safe-buffer": "~5.1.0"
+            "picocolors": "^0.2.1",
+            "source-map": "^0.6.1"
           }
           }
+        },
+        "source-map": {
+          "version": "0.6.1",
+          "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+          "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+          "dev": true
         }
       }
     },
         }
       }
     },
-    "thunky": {
-      "version": "1.1.0",
-      "resolved": "https://registry.npmjs.org/thunky/-/thunky-1.1.0.tgz",
-      "integrity": "sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA==",
-      "dev": true
-    },
-    "time-stamp": {
-      "version": "1.1.0",
-      "resolved": "https://registry.npmjs.org/time-stamp/-/time-stamp-1.1.0.tgz",
-      "integrity": "sha512-gLCeArryy2yNTRzTGKbZbloctj64jkZ57hj5zdraXue6aFgd6PmvVtEyiUU+hvU0v7q08oVv8r8ev0tRo6bvgw==",
-      "dev": true
-    },
-    "timers-browserify": {
-      "version": "1.4.2",
-      "resolved": "https://registry.npmjs.org/timers-browserify/-/timers-browserify-1.4.2.tgz",
-      "integrity": "sha512-PIxwAupJZiYU4JmVZYwXp9FKsHMXb5h0ZEFyuXTAn8WLHOlcij+FEcbrvDsom1o5dr1YggEtFbECvGCW2sT53Q==",
+    "stylelint-scss": {
+      "version": "3.21.0",
+      "resolved": "https://registry.npmjs.org/stylelint-scss/-/stylelint-scss-3.21.0.tgz",
+      "integrity": "sha512-CMI2wSHL+XVlNExpauy/+DbUcB/oUZLARDtMIXkpV/5yd8nthzylYd1cdHeDMJVBXeYHldsnebUX6MoV5zPW4A==",
       "dev": true,
       "requires": {
       "dev": true,
       "requires": {
-        "process": "~0.11.0"
+        "lodash": "^4.17.15",
+        "postcss-media-query-parser": "^0.2.3",
+        "postcss-resolve-nested-selector": "^0.1.1",
+        "postcss-selector-parser": "^6.0.2",
+        "postcss-value-parser": "^4.1.0"
       }
     },
       }
     },
-    "tiny-inflate": {
-      "version": "1.0.3",
-      "resolved": "https://registry.npmjs.org/tiny-inflate/-/tiny-inflate-1.0.3.tgz",
-      "integrity": "sha512-pkY1fj1cKHb2seWDy0B16HeWyczlJA9/WW3u3c4z/NiWDsO3DOU5D7nhTLE9CF0yXv/QZFY7sEJmj24dK+Rrqw==",
-      "dev": true
-    },
-    "title-case": {
-      "version": "2.1.1",
-      "resolved": "https://registry.npmjs.org/title-case/-/title-case-2.1.1.tgz",
-      "integrity": "sha512-EkJoZ2O3zdCz3zJsYCsxyq2OC5hrxR9mfdd5I+w8h/tmFfeOxJ+vvkxsKxdmN0WtS9zLdHEgfgVOiMVgv+Po4Q==",
+    "stylus": {
+      "version": "0.56.0",
+      "resolved": "https://registry.npmjs.org/stylus/-/stylus-0.56.0.tgz",
+      "integrity": "sha512-Ev3fOb4bUElwWu4F9P9WjnnaSpc8XB9OFHSFZSKMFL1CE1oM+oFXWEgAqPmmZIyhBihuqIQlFsVTypiiS9RxeA==",
       "dev": true,
       "requires": {
       "dev": true,
       "requires": {
-        "no-case": "^2.2.0",
-        "upper-case": "^1.0.3"
+        "css": "^3.0.0",
+        "debug": "^4.3.2",
+        "glob": "^7.1.6",
+        "safer-buffer": "^2.1.2",
+        "sax": "~1.2.4",
+        "source-map": "^0.7.3"
       }
     },
       }
     },
-    "tmp": {
-      "version": "0.0.33",
-      "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz",
-      "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==",
+    "stylus-loader": {
+      "version": "6.2.0",
+      "resolved": "https://registry.npmjs.org/stylus-loader/-/stylus-loader-6.2.0.tgz",
+      "integrity": "sha512-5dsDc7qVQGRoc6pvCL20eYgRUxepZ9FpeK28XhdXaIPP6kXr6nI1zAAKFQgP5OBkOfKaURp4WUpJzspg1f01Gg==",
       "dev": true,
       "requires": {
       "dev": true,
       "requires": {
-        "os-tmpdir": "~1.0.2"
+        "fast-glob": "^3.2.7",
+        "klona": "^2.0.4",
+        "normalize-path": "^3.0.0"
       }
     },
       }
     },
-    "tmpl": {
-      "version": "1.0.5",
-      "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.5.tgz",
-      "integrity": "sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==",
-      "dev": true
+    "subarg": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/subarg/-/subarg-1.0.0.tgz",
+      "integrity": "sha512-RIrIdRY0X1xojthNcVtgT9sjpOGagEUKpZdgBUi054OEPFo282yg+zE+t1Rj3+RqKq2xStL7uUHhY+AjbC4BXg==",
+      "dev": true,
+      "requires": {
+        "minimist": "^1.1.0"
+      }
     },
     },
-    "to-fast-properties": {
+    "sugarss": {
       "version": "2.0.0",
       "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz",
-      "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog=="
-    },
-    "to-object-path": {
-      "version": "0.3.0",
-      "resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz",
-      "integrity": "sha512-9mWHdnGRuh3onocaHzukyvCZhzvr6tiflAy/JRFXcJX0TjgfWA9pk9t8CMbzmBE4Jfw58pXbkngtBtqYxzNEyg==",
+      "resolved": "https://registry.npmjs.org/sugarss/-/sugarss-2.0.0.tgz",
+      "integrity": "sha512-WfxjozUk0UVA4jm+U1d736AUpzSrNsQcIbyOkoE364GrtWmIrFdk5lksEupgWMD4VaT/0kVx1dobpiDumSgmJQ==",
       "dev": true,
       "requires": {
       "dev": true,
       "requires": {
-        "kind-of": "^3.0.2"
+        "postcss": "^7.0.2"
       },
       "dependencies": {
       },
       "dependencies": {
-        "kind-of": {
-          "version": "3.2.2",
-          "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
-          "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==",
+        "picocolors": {
+          "version": "0.2.1",
+          "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz",
+          "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==",
+          "dev": true
+        },
+        "postcss": {
+          "version": "7.0.39",
+          "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz",
+          "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==",
           "dev": true,
           "requires": {
           "dev": true,
           "requires": {
-            "is-buffer": "^1.1.5"
+            "picocolors": "^0.2.1",
+            "source-map": "^0.6.1"
           }
           }
+        },
+        "source-map": {
+          "version": "0.6.1",
+          "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+          "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+          "dev": true
         }
       }
     },
         }
       }
     },
-    "to-regex": {
-      "version": "3.0.2",
-      "resolved": "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz",
-      "integrity": "sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==",
-      "dev": true,
-      "requires": {
-        "define-property": "^2.0.2",
-        "extend-shallow": "^3.0.2",
-        "regex-not": "^1.0.2",
-        "safe-regex": "^1.1.0"
-      }
-    },
-    "to-regex-range": {
-      "version": "5.0.1",
-      "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz",
-      "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==",
-      "dev": true,
+    "supports-color": {
+      "version": "5.5.0",
+      "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
+      "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
       "requires": {
       "requires": {
-        "is-number": "^7.0.0"
+        "has-flag": "^3.0.0"
       }
     },
       }
     },
-    "toggle-selection": {
-      "version": "1.0.6",
-      "resolved": "https://registry.npmjs.org/toggle-selection/-/toggle-selection-1.0.6.tgz",
-      "integrity": "sha512-BiZS+C1OS8g/q2RRbJmy59xpyghNBqrr6k5L/uKBGRsTfxmu3ffiRnd8mlGPUVayg8pvfi5urfnu8TU7DVOkLQ=="
-    },
-    "toidentifier": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz",
-      "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==",
-      "dev": true
-    },
-    "tough-cookie": {
-      "version": "2.5.0",
-      "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz",
-      "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==",
+    "supports-hyperlinks": {
+      "version": "2.3.0",
+      "resolved": "https://registry.npmjs.org/supports-hyperlinks/-/supports-hyperlinks-2.3.0.tgz",
+      "integrity": "sha512-RpsAZlpWcDwOPQA22aCH4J0t7L8JmAvsCxfOSEwm7cQs3LshN36QaTkwd70DnBOXDWGssw2eUoc8CaRWT0XunA==",
       "dev": true,
       "requires": {
       "dev": true,
       "requires": {
-        "psl": "^1.1.28",
-        "punycode": "^2.1.1"
+        "has-flag": "^4.0.0",
+        "supports-color": "^7.0.0"
       },
       "dependencies": {
       },
       "dependencies": {
-        "punycode": {
-          "version": "2.1.1",
-          "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz",
-          "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==",
+        "has-flag": {
+          "version": "4.0.0",
+          "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
+          "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
           "dev": true
           "dev": true
-        }
-      }
-    },
-    "tr46": {
-      "version": "0.0.3",
-      "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz",
-      "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw=="
-    },
-    "tracelib": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/tracelib/-/tracelib-1.0.1.tgz",
-      "integrity": "sha512-T2Vkpa/7Vdm3sV8nXRn8vZ0tnq6wlnO4Zx7Pux+JA1W6DMlg5EtbNcPZu/L7XRTPc9S0eAKhEFR4p/u0GcsDpQ==",
-      "dev": true
-    },
-    "transifex-i18ntool": {
-      "version": "1.1.0",
-      "resolved": "https://registry.npmjs.org/transifex-i18ntool/-/transifex-i18ntool-1.1.0.tgz",
-      "integrity": "sha512-W1FIGosZJ3cxbYk238QgsJvKPq12dPDIMn3rg37ZHNtoNAGrUAV6wKp+YSFwnMcqk3igZcAEPlLW1jFjBFC95Q==",
-      "dev": true,
-      "requires": {
-        "colors": "^1.0.3",
-        "minimist": "^1.2.0",
-        "prompts": "^2.0.4",
-        "request": "^2.88.0",
-        "request-promise-native": "^1.0.7",
-        "xliff": "^4.2.0"
+        },
+        "supports-color": {
+          "version": "7.2.0",
+          "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
+          "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
+          "dev": true,
+          "requires": {
+            "has-flag": "^4.0.0"
+          }
+        }
       }
     },
       }
     },
-    "traverse": {
-      "version": "0.6.6",
-      "resolved": "https://registry.npmjs.org/traverse/-/traverse-0.6.6.tgz",
-      "integrity": "sha512-kdf4JKs8lbARxWdp7RKdNzoJBhGUcIalSYibuGyHJbmk40pOysQ0+QPvlkCOICOivDWU2IJo2rkrxyTK2AH4fw=="
+    "supports-preserve-symlinks-flag": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz",
+      "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==",
+      "dev": true
     },
     },
-    "tree-kill": {
-      "version": "1.2.2",
-      "resolved": "https://registry.npmjs.org/tree-kill/-/tree-kill-1.2.2.tgz",
-      "integrity": "sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==",
+    "svg-tags": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/svg-tags/-/svg-tags-1.0.0.tgz",
+      "integrity": "sha512-ovssysQTa+luh7A5Weu3Rta6FJlFBBbInjOh722LIt6klpU2/HtdUbszju/G4devcvk8PGt7FCLv5wftu3THUA==",
       "dev": true
     },
       "dev": true
     },
-    "trim-newlines": {
-      "version": "3.0.1",
-      "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-3.0.1.tgz",
-      "integrity": "sha512-c1PTsA3tYrIsLGkJkzHF+w9F2EyxfXGo4UyJc4pFL++FMjnq0HJS69T3M7d//gKrFKwy429bouPescbjecU+Zw==",
+    "swagger-client": {
+      "version": "3.19.0",
+      "resolved": "https://registry.npmjs.org/swagger-client/-/swagger-client-3.19.0.tgz",
+      "integrity": "sha512-qpmxroj7fuXNSx4Ha720iyoXcUrfS7GRZfUpjuOp6Z85EIbaLcV+8Pf4s5j2ZgX4qPeVgTMApG8KpzGk1Wu68Q==",
+      "requires": {
+        "@babel/runtime-corejs3": "^7.20.13",
+        "@swagger-api/apidom-core": "=0.69.0",
+        "@swagger-api/apidom-json-pointer": "=0.69.0",
+        "@swagger-api/apidom-ns-openapi-3-1": "=0.69.0",
+        "@swagger-api/apidom-reference": "=0.69.0",
+        "cookie": "~0.5.0",
+        "cross-fetch": "^3.1.5",
+        "deepmerge": "~4.3.0",
+        "fast-json-patch": "^3.0.0-1",
+        "form-data-encoder": "^1.4.3",
+        "formdata-node": "^4.0.0",
+        "is-plain-object": "^5.0.0",
+        "js-yaml": "^4.1.0",
+        "lodash": "^4.17.21",
+        "qs": "^6.10.2",
+        "traverse": "~0.6.6",
+        "url": "~0.11.0"
+      }
+    },
+    "swagger-ui": {
+      "version": "4.12.0",
+      "resolved": "https://registry.npmjs.org/swagger-ui/-/swagger-ui-4.12.0.tgz",
+      "integrity": "sha512-ffNcDTQFWu5dEzJywQ4QEcgQZlBaHaeYCjifuWePds8anzqCZXVpeJSD7RCirUs+8D051YevRSu3ZjqNUNyvrQ==",
+      "requires": {
+        "@babel/runtime-corejs3": "^7.16.8",
+        "@braintree/sanitize-url": "=6.0.0",
+        "base64-js": "^1.5.1",
+        "classnames": "^2.3.1",
+        "css.escape": "1.5.1",
+        "deep-extend": "0.6.0",
+        "dompurify": "=2.3.3",
+        "ieee754": "^1.2.1",
+        "immutable": "^3.x.x",
+        "js-file-download": "^0.4.12",
+        "js-yaml": "=4.1.0",
+        "lodash": "^4.17.21",
+        "prop-types": "^15.8.1",
+        "randexp": "^0.5.3",
+        "randombytes": "^2.1.0",
+        "react": "=17.0.2",
+        "react-copy-to-clipboard": "5.0.4",
+        "react-debounce-input": "=3.2.4",
+        "react-dom": "=17.0.2",
+        "react-immutable-proptypes": "2.2.0",
+        "react-immutable-pure-component": "^2.2.0",
+        "react-inspector": "^5.1.1",
+        "react-redux": "^7.2.4",
+        "react-syntax-highlighter": "^15.4.5",
+        "redux": "^4.1.2",
+        "redux-immutable": "^4.0.0",
+        "remarkable": "^2.0.1",
+        "reselect": "^4.1.5",
+        "serialize-error": "^8.1.0",
+        "sha.js": "^2.4.11",
+        "swagger-client": "^3.18.5",
+        "url-parse": "^1.5.8",
+        "xml": "=1.0.1",
+        "xml-but-prettier": "^1.0.1",
+        "zenscroll": "^4.0.2"
+      }
+    },
+    "symbol-observable": {
+      "version": "4.0.0",
+      "resolved": "https://registry.npmjs.org/symbol-observable/-/symbol-observable-4.0.0.tgz",
+      "integrity": "sha512-b19dMThMV4HVFynSAM1++gBHAbk2Tc/osgLIBZMKsyqh34jb2e8Os7T6ZW/Bt3pJFdBTd2JwAnAAEQV7rSNvcQ==",
       "dev": true
     },
       "dev": true
     },
-    "trough": {
-      "version": "1.0.5",
-      "resolved": "https://registry.npmjs.org/trough/-/trough-1.0.5.tgz",
-      "integrity": "sha512-rvuRbTarPXmMb79SmzEp8aqXNKcK+y0XaB298IXueQ8I2PsrATcPBCSPyK/dDNa2iWOhKlfNnOjdAOTBU/nkFA==",
+    "symbol-tree": {
+      "version": "3.2.4",
+      "resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.4.tgz",
+      "integrity": "sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==",
       "dev": true
     },
       "dev": true
     },
-    "ts-jest": {
-      "version": "26.5.6",
-      "resolved": "https://registry.npmjs.org/ts-jest/-/ts-jest-26.5.6.tgz",
-      "integrity": "sha512-rua+rCP8DxpA8b4DQD/6X2HQS8Zy/xzViVYfEs2OQu68tkCuKLV0Md8pmX55+W24uRIyAsf/BajRfxOs+R2MKA==",
+    "syntax-error": {
+      "version": "1.4.0",
+      "resolved": "https://registry.npmjs.org/syntax-error/-/syntax-error-1.4.0.tgz",
+      "integrity": "sha512-YPPlu67mdnHGTup2A8ff7BC2Pjq0e0Yp/IyTFN03zWO0RcK07uLcbi7C2KpGR2FvWbaB0+bfE27a+sBKebSo7w==",
       "dev": true,
       "requires": {
       "dev": true,
       "requires": {
-        "bs-logger": "0.x",
-        "buffer-from": "1.x",
-        "fast-json-stable-stringify": "2.x",
-        "jest-util": "^26.1.0",
-        "json5": "2.x",
-        "lodash": "4.x",
-        "make-error": "1.x",
-        "mkdirp": "1.x",
-        "semver": "7.x",
-        "yargs-parser": "20.x"
-      },
-      "dependencies": {
-        "semver": {
-          "version": "7.3.7",
-          "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.7.tgz",
-          "integrity": "sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g==",
-          "dev": true,
-          "requires": {
-            "lru-cache": "^6.0.0"
-          }
-        },
-        "yargs-parser": {
-          "version": "20.2.9",
-          "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz",
-          "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==",
-          "dev": true
-        }
+        "acorn-node": "^1.2.0"
       }
     },
       }
     },
-    "ts-loader": {
-      "version": "6.2.1",
-      "resolved": "https://registry.npmjs.org/ts-loader/-/ts-loader-6.2.1.tgz",
-      "integrity": "sha512-Dd9FekWuABGgjE1g0TlQJ+4dFUfYGbYcs52/HQObE0ZmUNjQlmLAS7xXsSzy23AMaMwipsx5sNHvoEpT2CZq1g==",
+    "table": {
+      "version": "6.8.0",
+      "resolved": "https://registry.npmjs.org/table/-/table-6.8.0.tgz",
+      "integrity": "sha512-s/fitrbVeEyHKFa7mFdkuQMWlH1Wgw/yEXMt5xACT4ZpzWFluehAxRtUUQKPuWhaLAWhFcVx6w3oC8VKaUfPGA==",
       "dev": true,
       "requires": {
       "dev": true,
       "requires": {
-        "chalk": "^2.3.0",
-        "enhanced-resolve": "^4.0.0",
-        "loader-utils": "^1.0.2",
-        "micromatch": "^4.0.0",
-        "semver": "^6.0.0"
+        "ajv": "^8.0.1",
+        "lodash.truncate": "^4.4.2",
+        "slice-ansi": "^4.0.0",
+        "string-width": "^4.2.3",
+        "strip-ansi": "^6.0.1"
       },
       "dependencies": {
       },
       "dependencies": {
-        "enhanced-resolve": {
-          "version": "4.5.0",
-          "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-4.5.0.tgz",
-          "integrity": "sha512-Nv9m36S/vxpsI+Hc4/ZGRs0n9mXqSWGGq49zxb/cJfPAQMbUtttJAlNPS4AQzaBdw/pKskw5bMbekT/Y7W/Wlg==",
-          "dev": true,
-          "requires": {
-            "graceful-fs": "^4.1.2",
-            "memory-fs": "^0.5.0",
-            "tapable": "^1.0.0"
-          }
-        },
-        "json5": {
-          "version": "1.0.1",
-          "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz",
-          "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==",
+        "ansi-styles": {
+          "version": "4.3.0",
+          "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
+          "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
           "dev": true,
           "requires": {
           "dev": true,
           "requires": {
-            "minimist": "^1.2.0"
+            "color-convert": "^2.0.1"
           }
         },
           }
         },
-        "loader-utils": {
-          "version": "1.4.0",
-          "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.0.tgz",
-          "integrity": "sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA==",
+        "color-convert": {
+          "version": "2.0.1",
+          "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
+          "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
           "dev": true,
           "requires": {
           "dev": true,
           "requires": {
-            "big.js": "^5.2.2",
-            "emojis-list": "^3.0.0",
-            "json5": "^1.0.1"
+            "color-name": "~1.1.4"
           }
         },
           }
         },
-        "memory-fs": {
-          "version": "0.5.0",
-          "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.5.0.tgz",
-          "integrity": "sha512-jA0rdU5KoQMC0e6ppoNRtpp6vjFq6+NY7r8hywnC7V+1Xj/MtHwGIbB1QaK/dunyjWteJzmkpd7ooeWg10T7GA==",
-          "dev": true,
-          "requires": {
-            "errno": "^0.1.3",
-            "readable-stream": "^2.0.1"
-          }
+        "color-name": {
+          "version": "1.1.4",
+          "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
+          "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
+          "dev": true
         },
         },
-        "readable-stream": {
-          "version": "2.3.7",
-          "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz",
-          "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==",
+        "slice-ansi": {
+          "version": "4.0.0",
+          "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz",
+          "integrity": "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==",
           "dev": true,
           "requires": {
           "dev": true,
           "requires": {
-            "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"
+            "ansi-styles": "^4.0.0",
+            "astral-regex": "^2.0.0",
+            "is-fullwidth-code-point": "^3.0.0"
           }
           }
-        },
-        "semver": {
-          "version": "6.3.0",
-          "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
-          "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==",
+        }
+      }
+    },
+    "tapable": {
+      "version": "2.2.1",
+      "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz",
+      "integrity": "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==",
+      "dev": true
+    },
+    "tar": {
+      "version": "6.1.13",
+      "resolved": "https://registry.npmjs.org/tar/-/tar-6.1.13.tgz",
+      "integrity": "sha512-jdIBIN6LTIe2jqzay/2vtYLlBHa3JF42ot3h1dW8Q0PaAG4v8rm0cvpVePtau5C6OKXGGcgO9q2AMNSWxiLqKw==",
+      "dev": true,
+      "requires": {
+        "chownr": "^2.0.0",
+        "fs-minipass": "^2.0.0",
+        "minipass": "^4.0.0",
+        "minizlib": "^2.1.1",
+        "mkdirp": "^1.0.3",
+        "yallist": "^4.0.0"
+      },
+      "dependencies": {
+        "chownr": {
+          "version": "2.0.0",
+          "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz",
+          "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==",
           "dev": true
         },
           "dev": true
         },
-        "string_decoder": {
-          "version": "1.1.1",
-          "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz",
-          "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
-          "dev": true,
-          "requires": {
-            "safe-buffer": "~5.1.0"
-          }
+        "minipass": {
+          "version": "4.2.4",
+          "resolved": "https://registry.npmjs.org/minipass/-/minipass-4.2.4.tgz",
+          "integrity": "sha512-lwycX3cBMTvcejsHITUgYj6Gy6A7Nh4Q6h9NP4sTHY1ccJlC7yKzDmiShEHsJ16Jf1nKGDEaiHxiltsJEvk0nQ==",
+          "dev": true
         },
         },
-        "tapable": {
-          "version": "1.1.3",
-          "resolved": "https://registry.npmjs.org/tapable/-/tapable-1.1.3.tgz",
-          "integrity": "sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA==",
+        "yallist": {
+          "version": "4.0.0",
+          "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
+          "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==",
           "dev": true
         }
       }
     },
           "dev": true
         }
       }
     },
-    "ts-morph": {
-      "version": "12.2.0",
-      "resolved": "https://registry.npmjs.org/ts-morph/-/ts-morph-12.2.0.tgz",
-      "integrity": "sha512-WHXLtFDcIRwoqaiu0elAoZ/AmI+SwwDafnPKjgJmdwJ2gRVO0jMKBt88rV2liT/c6MTsXyuWbGFiHe9MRddWJw==",
-      "dev": true,
+    "tar-fs": {
+      "version": "2.1.1",
+      "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-2.1.1.tgz",
+      "integrity": "sha512-V0r2Y9scmbDRLCNex/+hYzvp/zyYjvFbHPNgVTKfQvVrb6guiE/fxP+XblDNR011utopbkex2nM4dHNV6GDsng==",
+      "optional": true,
       "requires": {
       "requires": {
-        "@ts-morph/common": "~0.11.1",
-        "code-block-writer": "^10.1.1"
+        "chownr": "^1.1.1",
+        "mkdirp-classic": "^0.5.2",
+        "pump": "^3.0.0",
+        "tar-stream": "^2.1.4"
       }
     },
       }
     },
-    "ts-node": {
-      "version": "9.0.0",
-      "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-9.0.0.tgz",
-      "integrity": "sha512-/TqB4SnererCDR/vb4S/QvSZvzQMJN8daAslg7MeaiHvD8rDZsSfXmNeNumyZZzMned72Xoq/isQljYSt8Ynfg==",
-      "dev": true,
+    "tar-stream": {
+      "version": "2.2.0",
+      "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-2.2.0.tgz",
+      "integrity": "sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==",
       "requires": {
       "requires": {
-        "arg": "^4.1.0",
-        "diff": "^4.0.1",
-        "make-error": "^1.1.1",
-        "source-map-support": "^0.5.17",
-        "yn": "3.1.1"
+        "bl": "^4.0.3",
+        "end-of-stream": "^1.4.1",
+        "fs-constants": "^1.0.0",
+        "inherits": "^2.0.3",
+        "readable-stream": "^3.1.1"
       },
       "dependencies": {
       },
       "dependencies": {
-        "diff": {
-          "version": "4.0.2",
-          "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz",
-          "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==",
-          "dev": true
+        "readable-stream": {
+          "version": "3.6.1",
+          "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.1.tgz",
+          "integrity": "sha512-+rQmrWMYGA90yenhTYsLWAsLsqVC8osOw6PKE1HDYiO0gdPeKe/xDHNzIAIn4C91YQ6oenEhfYqqc1883qHbjQ==",
+          "requires": {
+            "inherits": "^2.0.3",
+            "string_decoder": "^1.1.1",
+            "util-deprecate": "^1.0.1"
+          }
         }
       }
     },
         }
       }
     },
-    "tslib": {
-      "version": "2.3.1",
-      "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.1.tgz",
-      "integrity": "sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw=="
-    },
-    "tslint": {
-      "version": "6.1.3",
-      "resolved": "https://registry.npmjs.org/tslint/-/tslint-6.1.3.tgz",
-      "integrity": "sha512-IbR4nkT96EQOvKE2PW/djGz8iGNeJ4rF2mBfiYaR/nvUWYKJhLwimoJKgjIFEIDibBtOevj7BqCRL4oHeWWUCg==",
+    "terminal-link": {
+      "version": "2.1.1",
+      "resolved": "https://registry.npmjs.org/terminal-link/-/terminal-link-2.1.1.tgz",
+      "integrity": "sha512-un0FmiRUQNr5PJqy9kP7c40F5BOfpGlYTrxonDChEZB7pzZxRNp/bt+ymiy9/npwXya9KH99nJ/GXFIiUkYGFQ==",
+      "dev": true,
+      "requires": {
+        "ansi-escapes": "^4.2.1",
+        "supports-hyperlinks": "^2.0.0"
+      }
+    },
+    "terser": {
+      "version": "5.14.2",
+      "resolved": "https://registry.npmjs.org/terser/-/terser-5.14.2.tgz",
+      "integrity": "sha512-oL0rGeM/WFQCUd0y2QrWxYnq7tfSuKBiqTjRPWrRgB46WD/kiwHwF8T23z78H6Q6kGCuuHcPB+KULHRdxvVGQA==",
+      "dev": true,
+      "requires": {
+        "@jridgewell/source-map": "^0.3.2",
+        "acorn": "^8.5.0",
+        "commander": "^2.20.0",
+        "source-map-support": "~0.5.20"
+      }
+    },
+    "terser-webpack-plugin": {
+      "version": "5.3.6",
+      "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.6.tgz",
+      "integrity": "sha512-kfLFk+PoLUQIbLmB1+PZDMRSZS99Mp+/MHqDNmMA6tOItzRt+Npe3E+fsMs5mfcM0wCtrrdU387UnV+vnSffXQ==",
       "dev": true,
       "requires": {
       "dev": true,
       "requires": {
-        "@babel/code-frame": "^7.0.0",
-        "builtin-modules": "^1.1.1",
-        "chalk": "^2.3.0",
-        "commander": "^2.12.1",
-        "diff": "^4.0.1",
-        "glob": "^7.1.1",
-        "js-yaml": "^3.13.1",
-        "minimatch": "^3.0.4",
-        "mkdirp": "^0.5.3",
-        "resolve": "^1.3.2",
-        "semver": "^5.3.0",
-        "tslib": "^1.13.0",
-        "tsutils": "^2.29.0"
+        "@jridgewell/trace-mapping": "^0.3.14",
+        "jest-worker": "^27.4.5",
+        "schema-utils": "^3.1.1",
+        "serialize-javascript": "^6.0.0",
+        "terser": "^5.14.1"
       },
       "dependencies": {
       },
       "dependencies": {
-        "argparse": {
-          "version": "1.0.10",
-          "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz",
-          "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==",
+        "ajv": {
+          "version": "6.12.6",
+          "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz",
+          "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==",
           "dev": true,
           "requires": {
           "dev": true,
           "requires": {
-            "sprintf-js": "~1.0.2"
+            "fast-deep-equal": "^3.1.1",
+            "fast-json-stable-stringify": "^2.0.0",
+            "json-schema-traverse": "^0.4.1",
+            "uri-js": "^4.2.2"
           }
         },
           }
         },
-        "commander": {
-          "version": "2.20.3",
-          "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz",
-          "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==",
-          "dev": true
-        },
-        "diff": {
-          "version": "4.0.2",
-          "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz",
-          "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==",
+        "json-schema-traverse": {
+          "version": "0.4.1",
+          "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz",
+          "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==",
           "dev": true
         },
           "dev": true
         },
-        "js-yaml": {
-          "version": "3.14.1",
-          "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz",
-          "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==",
-          "dev": true,
-          "requires": {
-            "argparse": "^1.0.7",
-            "esprima": "^4.0.0"
-          }
-        },
-        "mkdirp": {
-          "version": "0.5.6",
-          "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz",
-          "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==",
+        "schema-utils": {
+          "version": "3.1.1",
+          "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz",
+          "integrity": "sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==",
           "dev": true,
           "requires": {
           "dev": true,
           "requires": {
-            "minimist": "^1.2.6"
+            "@types/json-schema": "^7.0.8",
+            "ajv": "^6.12.5",
+            "ajv-keywords": "^3.5.2"
           }
           }
-        },
-        "tslib": {
-          "version": "1.14.1",
-          "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz",
-          "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==",
-          "dev": true
         }
       }
     },
         }
       }
     },
-    "tsutils": {
-      "version": "2.29.0",
-      "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-2.29.0.tgz",
-      "integrity": "sha512-g5JVHCIJwzfISaXpXE1qvNalca5Jwob6FjI4AoPlqMusJ6ftFE7IkkFoMhVLRgK+4Kx3gkzb8UZK5t5yTTvEmA==",
+    "test-exclude": {
+      "version": "6.0.0",
+      "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz",
+      "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==",
       "dev": true,
       "requires": {
       "dev": true,
       "requires": {
-        "tslib": "^1.8.1"
-      },
-      "dependencies": {
-        "tslib": {
-          "version": "1.14.1",
-          "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz",
-          "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==",
-          "dev": true
-        }
+        "@istanbuljs/schema": "^0.1.2",
+        "glob": "^7.1.4",
+        "minimatch": "^3.0.4"
       }
     },
       }
     },
-    "tty-browserify": {
-      "version": "0.0.1",
-      "resolved": "https://registry.npmjs.org/tty-browserify/-/tty-browserify-0.0.1.tgz",
-      "integrity": "sha512-C3TaO7K81YvjCgQH9Q1S3R3P3BtN3RIM8n+OvX4il1K1zgE8ZhI0op7kClgkxtutIE8hQrcrHBXvIheqKUUCxw==",
-      "dev": true
-    },
-    "tunnel": {
-      "version": "0.0.6",
-      "resolved": "https://registry.npmjs.org/tunnel/-/tunnel-0.0.6.tgz",
-      "integrity": "sha512-1h/Lnq9yajKY2PEbBadPXj3VxsDDu844OnaAo52UVmIzIvwwtBPIuNvkjuzBlTWpfJyUbG3ez0KSBibQkj4ojg==",
+    "text-table": {
+      "version": "0.2.0",
+      "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz",
+      "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==",
       "dev": true
     },
       "dev": true
     },
-    "tunnel-agent": {
-      "version": "0.6.0",
-      "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz",
-      "integrity": "sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==",
+    "thenify": {
+      "version": "3.3.1",
+      "resolved": "https://registry.npmjs.org/thenify/-/thenify-3.3.1.tgz",
+      "integrity": "sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==",
       "dev": true,
       "requires": {
       "dev": true,
       "requires": {
-        "safe-buffer": "^5.0.1"
+        "any-promise": "^1.0.0"
       }
     },
       }
     },
-    "tweetnacl": {
-      "version": "0.14.5",
-      "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz",
-      "integrity": "sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA==",
-      "dev": true
-    },
-    "type": {
-      "version": "1.2.0",
-      "resolved": "https://registry.npmjs.org/type/-/type-1.2.0.tgz",
-      "integrity": "sha512-+5nt5AAniqsCnu2cEQQdpzCAh33kVx8n0VoFidKpB1dVVLAN/F+bgVOqOJqOnEnrhp222clB5p3vUlD+1QAnfg==",
-      "dev": true
-    },
-    "type-check": {
-      "version": "0.3.2",
-      "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz",
-      "integrity": "sha512-ZCmOJdvOWDBYJlzAoFkC+Q0+bUyEOS1ltgp1MGU03fqHG+dbi9tBFU2Rd9QKiDZFAYrhPh2JUf7rZRIuHRKtOg==",
+    "thenify-all": {
+      "version": "1.6.0",
+      "resolved": "https://registry.npmjs.org/thenify-all/-/thenify-all-1.6.0.tgz",
+      "integrity": "sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==",
       "dev": true,
       "requires": {
       "dev": true,
       "requires": {
-        "prelude-ls": "~1.1.2"
+        "thenify": ">= 3.1.0 < 4"
       }
     },
       }
     },
-    "type-detect": {
-      "version": "4.0.8",
-      "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz",
-      "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==",
+    "throat": {
+      "version": "5.0.0",
+      "resolved": "https://registry.npmjs.org/throat/-/throat-5.0.0.tgz",
+      "integrity": "sha512-fcwX4mndzpLQKBS1DVYhGAcYaYt7vsHNIvQV+WXMvnow5cgjPphq5CaayLaGsjRdSCKZFNGt7/GYAuXaNOiYCA==",
       "dev": true
     },
       "dev": true
     },
-    "type-fest": {
-      "version": "0.20.2",
-      "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz",
-      "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ=="
-    },
-    "type-is": {
-      "version": "1.6.18",
-      "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz",
-      "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==",
-      "dev": true,
-      "requires": {
-        "media-typer": "0.3.0",
-        "mime-types": "~2.1.24"
-      }
+    "throttleit": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/throttleit/-/throttleit-1.0.0.tgz",
+      "integrity": "sha512-rkTVqu6IjfQ/6+uNuuc3sZek4CEYxTJom3IktzgdSxcZqdARuebbA/f4QmAxMQIxqq9ZLEUkSYqvuk1I6VKq4g==",
+      "dev": true
     },
     },
-    "typedarray": {
-      "version": "0.0.6",
-      "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz",
-      "integrity": "sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==",
+    "through": {
+      "version": "2.3.8",
+      "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz",
+      "integrity": "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==",
       "dev": true
     },
       "dev": true
     },
-    "typedarray-to-buffer": {
-      "version": "3.1.5",
-      "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz",
-      "integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==",
+    "through2": {
+      "version": "2.0.5",
+      "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz",
+      "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==",
       "dev": true,
       "requires": {
       "dev": true,
       "requires": {
-        "is-typedarray": "^1.0.0"
+        "readable-stream": "~2.3.6",
+        "xtend": "~4.0.1"
       }
     },
       }
     },
-    "typescript": {
-      "version": "4.3.5",
-      "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.3.5.tgz",
-      "integrity": "sha512-DqQgihaQ9cUrskJo9kIyW/+g0Vxsk8cDtZ52a3NGh0YNTfpUSArXSohyUGnvbPazEPLu398C0UxmKSOrPumUzA==",
-      "dev": true
-    },
-    "uglify-js": {
-      "version": "3.17.0",
-      "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.17.0.tgz",
-      "integrity": "sha512-aTeNPVmgIMPpm1cxXr2Q/nEbvkmV8yq66F3om7X3P/cvOXQ0TMQ64Wk63iyT1gPlmdmGzjGpyLh1f3y8MZWXGg==",
-      "dev": true,
-      "optional": true
-    },
-    "umd": {
-      "version": "3.0.3",
-      "resolved": "https://registry.npmjs.org/umd/-/umd-3.0.3.tgz",
-      "integrity": "sha512-4IcGSufhFshvLNcMCV80UnQVlZ5pMOC8mvNPForqwA4+lzYQuetTESLDQkeLmihq8bRcnpbQa48Wb8Lh16/xow==",
+    "thunky": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npmjs.org/thunky/-/thunky-1.1.0.tgz",
+      "integrity": "sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA==",
       "dev": true
     },
       "dev": true
     },
-    "unbox-primitive": {
-      "version": "1.0.2",
-      "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz",
-      "integrity": "sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==",
-      "dev": true,
-      "requires": {
-        "call-bind": "^1.0.2",
-        "has-bigints": "^1.0.2",
-        "has-symbols": "^1.0.3",
-        "which-boxed-primitive": "^1.0.2"
-      }
-    },
-    "unc-path-regex": {
-      "version": "0.1.2",
-      "resolved": "https://registry.npmjs.org/unc-path-regex/-/unc-path-regex-0.1.2.tgz",
-      "integrity": "sha512-eXL4nmJT7oCpkZsHZUOJo8hcX3GbsiDOa0Qu9F646fi8dT3XuSVopVqAcEiVzSKKH7UoDti23wNX3qGFxcW5Qg==",
+    "time-stamp": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npmjs.org/time-stamp/-/time-stamp-1.1.0.tgz",
+      "integrity": "sha512-gLCeArryy2yNTRzTGKbZbloctj64jkZ57hj5zdraXue6aFgd6PmvVtEyiUU+hvU0v7q08oVv8r8ev0tRo6bvgw==",
       "dev": true
     },
       "dev": true
     },
-    "undeclared-identifiers": {
-      "version": "1.1.3",
-      "resolved": "https://registry.npmjs.org/undeclared-identifiers/-/undeclared-identifiers-1.1.3.tgz",
-      "integrity": "sha512-pJOW4nxjlmfwKApE4zvxLScM/njmwj/DiUBv7EabwE4O8kRUy+HIwxQtZLBPll/jx1LJyBcqNfB3/cpv9EZwOw==",
+    "timers-browserify": {
+      "version": "1.4.2",
+      "resolved": "https://registry.npmjs.org/timers-browserify/-/timers-browserify-1.4.2.tgz",
+      "integrity": "sha512-PIxwAupJZiYU4JmVZYwXp9FKsHMXb5h0ZEFyuXTAn8WLHOlcij+FEcbrvDsom1o5dr1YggEtFbECvGCW2sT53Q==",
       "dev": true,
       "requires": {
       "dev": true,
       "requires": {
-        "acorn-node": "^1.3.0",
-        "dash-ast": "^1.0.0",
-        "get-assigned-identifiers": "^1.2.0",
-        "simple-concat": "^1.0.0",
-        "xtend": "^4.0.1"
-      },
-      "dependencies": {
-        "dash-ast": {
-          "version": "1.0.0",
-          "resolved": "https://registry.npmjs.org/dash-ast/-/dash-ast-1.0.0.tgz",
-          "integrity": "sha512-Vy4dx7gquTeMcQR/hDkYLGUnwVil6vk4FOOct+djUnHOUWt+zJPJAaRIXaAFkPXtJjvlY7o3rfRu0/3hpnwoUA==",
-          "dev": true
-        }
+        "process": "~0.11.0"
       }
     },
       }
     },
-    "underscore": {
-      "version": "1.7.0",
-      "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.7.0.tgz",
-      "integrity": "sha512-cp0oQQyZhUM1kpJDLdGO1jPZHgS/MpzoWYfe9+CM2h/QGDZlqwT2T3YGukuBdaNJ/CAPoeyAZRRHz8JFo176vA==",
-      "dev": true
-    },
-    "unicode-canonical-property-names-ecmascript": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.0.tgz",
-      "integrity": "sha512-yY5PpDlfVIU5+y/BSCxAJRBIS1Zc2dDG3Ujq+sR0U+JjUevW2JhocOF+soROYDSaAezOzOKuyyixhD6mBknSmQ==",
+    "tiny-inflate": {
+      "version": "1.0.3",
+      "resolved": "https://registry.npmjs.org/tiny-inflate/-/tiny-inflate-1.0.3.tgz",
+      "integrity": "sha512-pkY1fj1cKHb2seWDy0B16HeWyczlJA9/WW3u3c4z/NiWDsO3DOU5D7nhTLE9CF0yXv/QZFY7sEJmj24dK+Rrqw==",
       "dev": true
     },
       "dev": true
     },
-    "unicode-match-property-ecmascript": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-2.0.0.tgz",
-      "integrity": "sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q==",
+    "title-case": {
+      "version": "2.1.1",
+      "resolved": "https://registry.npmjs.org/title-case/-/title-case-2.1.1.tgz",
+      "integrity": "sha512-EkJoZ2O3zdCz3zJsYCsxyq2OC5hrxR9mfdd5I+w8h/tmFfeOxJ+vvkxsKxdmN0WtS9zLdHEgfgVOiMVgv+Po4Q==",
       "dev": true,
       "requires": {
       "dev": true,
       "requires": {
-        "unicode-canonical-property-names-ecmascript": "^2.0.0",
-        "unicode-property-aliases-ecmascript": "^2.0.0"
+        "no-case": "^2.2.0",
+        "upper-case": "^1.0.3"
       }
     },
       }
     },
-    "unicode-match-property-value-ecmascript": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.0.0.tgz",
-      "integrity": "sha512-7Yhkc0Ye+t4PNYzOGKedDhXbYIBe1XEQYQxOPyhcXNMJ0WCABqqj6ckydd6pWRZTHV4GuCPKdBAUiMc60tsKVw==",
-      "dev": true
-    },
-    "unicode-properties": {
-      "version": "1.4.1",
-      "resolved": "https://registry.npmjs.org/unicode-properties/-/unicode-properties-1.4.1.tgz",
-      "integrity": "sha512-CLjCCLQ6UuMxWnbIylkisbRj31qxHPAurvena/0iwSVbQ2G1VY5/HjV0IRabOEbDHlzZlRdCrD4NhB0JtU40Pg==",
+    "tmp": {
+      "version": "0.0.33",
+      "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz",
+      "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==",
       "dev": true,
       "requires": {
       "dev": true,
       "requires": {
-        "base64-js": "^1.3.0",
-        "unicode-trie": "^2.0.0"
+        "os-tmpdir": "~1.0.2"
       }
     },
       }
     },
-    "unicode-property-aliases-ecmascript": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.0.0.tgz",
-      "integrity": "sha512-5Zfuy9q/DFr4tfO7ZPeVXb1aPoeQSdeFMLpYuFebehDAhbuevLs5yxSZmIFN1tP5F9Wl4IpJrYojg85/zgyZHQ==",
+    "tmpl": {
+      "version": "1.0.5",
+      "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.5.tgz",
+      "integrity": "sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==",
       "dev": true
     },
       "dev": true
     },
-    "unicode-trie": {
+    "to-fast-properties": {
       "version": "2.0.0",
       "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/unicode-trie/-/unicode-trie-2.0.0.tgz",
-      "integrity": "sha512-x7bc76x0bm4prf1VLg79uhAzKw8DVboClSN5VxJuQ+LKDOVEW9CdH+VY7SP+vX7xCYQqzzgQpFqz15zeLvAtZQ==",
+      "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz",
+      "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog=="
+    },
+    "to-object-path": {
+      "version": "0.3.0",
+      "resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz",
+      "integrity": "sha512-9mWHdnGRuh3onocaHzukyvCZhzvr6tiflAy/JRFXcJX0TjgfWA9pk9t8CMbzmBE4Jfw58pXbkngtBtqYxzNEyg==",
       "dev": true,
       "requires": {
       "dev": true,
       "requires": {
-        "pako": "^0.2.5",
-        "tiny-inflate": "^1.0.0"
+        "kind-of": "^3.0.2"
       },
       "dependencies": {
       },
       "dependencies": {
-        "pako": {
-          "version": "0.2.9",
-          "resolved": "https://registry.npmjs.org/pako/-/pako-0.2.9.tgz",
-          "integrity": "sha512-NUcwaKxUxWrZLpDG+z/xZaCgQITkA/Dv4V/T6bw7VON6l1Xz/VnrBqrYjZQ12TamKHzITTfOEIYUj48y2KXImA==",
-          "dev": true
+        "kind-of": {
+          "version": "3.2.2",
+          "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
+          "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==",
+          "dev": true,
+          "requires": {
+            "is-buffer": "^1.1.5"
+          }
         }
       }
     },
         }
       }
     },
-    "unified": {
-      "version": "9.2.2",
-      "resolved": "https://registry.npmjs.org/unified/-/unified-9.2.2.tgz",
-      "integrity": "sha512-Sg7j110mtefBD+qunSLO1lqOEKdrwBFBrR6Qd8f4uwkhWNlbkaqwHse6e7QvD3AP/MNoJdEDLaf8OxYyoWgorQ==",
+    "to-regex": {
+      "version": "3.0.2",
+      "resolved": "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz",
+      "integrity": "sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==",
       "dev": true,
       "requires": {
       "dev": true,
       "requires": {
-        "bail": "^1.0.0",
-        "extend": "^3.0.0",
-        "is-buffer": "^2.0.0",
-        "is-plain-obj": "^2.0.0",
-        "trough": "^1.0.0",
-        "vfile": "^4.0.0"
-      },
-      "dependencies": {
-        "is-buffer": {
-          "version": "2.0.5",
-          "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.5.tgz",
-          "integrity": "sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ==",
-          "dev": true
-        }
+        "define-property": "^2.0.2",
+        "extend-shallow": "^3.0.2",
+        "regex-not": "^1.0.2",
+        "safe-regex": "^1.1.0"
       }
     },
       }
     },
-    "union-value": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.1.tgz",
-      "integrity": "sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg==",
+    "to-regex-range": {
+      "version": "5.0.1",
+      "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz",
+      "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==",
       "dev": true,
       "requires": {
       "dev": true,
       "requires": {
-        "arr-union": "^3.1.0",
-        "get-value": "^2.0.6",
-        "is-extendable": "^0.1.1",
-        "set-value": "^2.0.1"
+        "is-number": "^7.0.0"
       }
     },
       }
     },
-    "uniq": {
+    "toggle-selection": {
+      "version": "1.0.6",
+      "resolved": "https://registry.npmjs.org/toggle-selection/-/toggle-selection-1.0.6.tgz",
+      "integrity": "sha512-BiZS+C1OS8g/q2RRbJmy59xpyghNBqrr6k5L/uKBGRsTfxmu3ffiRnd8mlGPUVayg8pvfi5urfnu8TU7DVOkLQ=="
+    },
+    "toidentifier": {
       "version": "1.0.1",
       "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/uniq/-/uniq-1.0.1.tgz",
-      "integrity": "sha512-Gw+zz50YNKPDKXs+9d+aKAjVwpjNwqzvNpLigIruT4HA9lMZNdMqs9x07kKHB/L9WRzqp4+DlTU5s4wG2esdoA==",
+      "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz",
+      "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==",
       "dev": true
     },
       "dev": true
     },
-    "unique-filename": {
-      "version": "1.1.1",
-      "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-1.1.1.tgz",
-      "integrity": "sha512-Vmp0jIp2ln35UTXuryvjzkjGdRyf9b2lTXuSYUiPmzRcl3FDtYqAwOnTJkAngD9SWhnoJzDbTKwaOrZ+STtxNQ==",
+    "tough-cookie": {
+      "version": "3.0.1",
+      "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-3.0.1.tgz",
+      "integrity": "sha512-yQyJ0u4pZsv9D4clxO69OEjLWYw+jbgspjTue4lTQZLfV0c5l1VmK2y1JK8E9ahdpltPOaAThPcp5nKPUgSnsg==",
       "dev": true,
       "requires": {
       "dev": true,
       "requires": {
-        "unique-slug": "^2.0.0"
+        "ip-regex": "^2.1.0",
+        "psl": "^1.1.28",
+        "punycode": "^2.1.1"
+      },
+      "dependencies": {
+        "punycode": {
+          "version": "2.3.0",
+          "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.0.tgz",
+          "integrity": "sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==",
+          "dev": true
+        }
       }
     },
       }
     },
-    "unique-slug": {
-      "version": "2.0.2",
-      "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-2.0.2.tgz",
-      "integrity": "sha512-zoWr9ObaxALD3DOPfjPSqxt4fnZiWblxHIgeWqW8x7UqDzEtHEQLzji2cuJYQFCU6KmoJikOYAZlrTHHebjx2w==",
+    "tr46": {
+      "version": "0.0.3",
+      "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz",
+      "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw=="
+    },
+    "tracelib": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/tracelib/-/tracelib-1.0.1.tgz",
+      "integrity": "sha512-T2Vkpa/7Vdm3sV8nXRn8vZ0tnq6wlnO4Zx7Pux+JA1W6DMlg5EtbNcPZu/L7XRTPc9S0eAKhEFR4p/u0GcsDpQ==",
+      "dev": true
+    },
+    "transifex-i18ntool": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npmjs.org/transifex-i18ntool/-/transifex-i18ntool-1.1.0.tgz",
+      "integrity": "sha512-W1FIGosZJ3cxbYk238QgsJvKPq12dPDIMn3rg37ZHNtoNAGrUAV6wKp+YSFwnMcqk3igZcAEPlLW1jFjBFC95Q==",
       "dev": true,
       "requires": {
       "dev": true,
       "requires": {
-        "imurmurhash": "^0.1.4"
+        "colors": "^1.0.3",
+        "minimist": "^1.2.0",
+        "prompts": "^2.0.4",
+        "request": "^2.88.0",
+        "request-promise-native": "^1.0.7",
+        "xliff": "^4.2.0"
       }
     },
       }
     },
-    "unist-util-find-all-after": {
-      "version": "3.0.2",
-      "resolved": "https://registry.npmjs.org/unist-util-find-all-after/-/unist-util-find-all-after-3.0.2.tgz",
-      "integrity": "sha512-xaTC/AGZ0rIM2gM28YVRAFPIZpzbpDtU3dRmp7EXlNVA8ziQc4hY3H7BHXM1J49nEmiqc3svnqMReW+PGqbZKQ==",
-      "dev": true,
+    "traverse": {
+      "version": "0.6.7",
+      "resolved": "https://registry.npmjs.org/traverse/-/traverse-0.6.7.tgz",
+      "integrity": "sha512-/y956gpUo9ZNCb99YjxG7OaslxZWHfCHAUUfshwqOXmxUIvqLjVO581BT+gM59+QV9tFe6/CGG53tsA1Y7RSdg=="
+    },
+    "tree-kill": {
+      "version": "1.2.2",
+      "resolved": "https://registry.npmjs.org/tree-kill/-/tree-kill-1.2.2.tgz",
+      "integrity": "sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==",
+      "dev": true
+    },
+    "tree-sitter": {
+      "version": "0.20.1",
+      "resolved": "https://registry.npmjs.org/tree-sitter/-/tree-sitter-0.20.1.tgz",
+      "integrity": "sha512-Cmb8V0ocamHbgWMVhZIa+78k/7r8VCQ6+ePG8eYEAO7AccwWi06Ct4ATNiI94KwhIkRl0+OwZ42/5nk3GnEMpQ==",
+      "optional": true,
       "requires": {
       "requires": {
-        "unist-util-is": "^4.0.0"
+        "nan": "^2.14.0",
+        "prebuild-install": "^6.0.1"
       }
     },
       }
     },
-    "unist-util-is": {
-      "version": "4.1.0",
-      "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-4.1.0.tgz",
-      "integrity": "sha512-ZOQSsnce92GrxSqlnEEseX0gi7GH9zTJZ0p9dtu87WRb/37mMPO2Ilx1s/t9vBHrFhbgweUwb+t7cIn5dxPhZg==",
-      "dev": true
+    "tree-sitter-json": {
+      "version": "0.20.0",
+      "resolved": "https://registry.npmjs.org/tree-sitter-json/-/tree-sitter-json-0.20.0.tgz",
+      "integrity": "sha512-PteOLH+Tx6Bz4ZA/d40/DbkiSXXRM/gKahhHI8hQ1lWNfFvdknnz9k3Mz84ol5srRyLboJ8wp8GSkhZ6ht9EGQ==",
+      "optional": true,
+      "requires": {
+        "nan": "^2.14.1"
+      }
     },
     },
-    "unist-util-stringify-position": {
-      "version": "2.0.3",
-      "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-2.0.3.tgz",
-      "integrity": "sha512-3faScn5I+hy9VleOq/qNbAd6pAx7iH5jYBMS9I1HgQVijz/4mv5Bvw5iw1sC/90CODiKo81G/ps8AJrISn687g==",
-      "dev": true,
+    "tree-sitter-yaml": {
+      "version": "0.5.0",
+      "resolved": "https://registry.npmjs.org/tree-sitter-yaml/-/tree-sitter-yaml-0.5.0.tgz",
+      "integrity": "sha512-POJ4ZNXXSWIG/W4Rjuyg36MkUD4d769YRUGKRqN+sVaj/VCo6Dh6Pkssn1Rtewd5kybx+jT1BWMyWN0CijXnMA==",
+      "optional": true,
       "requires": {
       "requires": {
-        "@types/unist": "^2.0.2"
+        "nan": "^2.14.0"
       }
     },
       }
     },
-    "universalify": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz",
-      "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==",
+    "trim-newlines": {
+      "version": "3.0.1",
+      "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-3.0.1.tgz",
+      "integrity": "sha512-c1PTsA3tYrIsLGkJkzHF+w9F2EyxfXGo4UyJc4pFL++FMjnq0HJS69T3M7d//gKrFKwy429bouPescbjecU+Zw==",
       "dev": true
     },
       "dev": true
     },
-    "unix-crypt-td-js": {
-      "version": "1.1.4",
-      "resolved": "https://registry.npmjs.org/unix-crypt-td-js/-/unix-crypt-td-js-1.1.4.tgz",
-      "integrity": "sha512-8rMeVYWSIyccIJscb9NdCfZKSRBKYTeVnwmiRYT2ulE3qd1RaDQ0xQDP+rI3ccIWbhu/zuo5cgN8z73belNZgw==",
+    "trough": {
+      "version": "1.0.5",
+      "resolved": "https://registry.npmjs.org/trough/-/trough-1.0.5.tgz",
+      "integrity": "sha512-rvuRbTarPXmMb79SmzEp8aqXNKcK+y0XaB298IXueQ8I2PsrATcPBCSPyK/dDNa2iWOhKlfNnOjdAOTBU/nkFA==",
       "dev": true
     },
       "dev": true
     },
-    "unpipe": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz",
-      "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==",
-      "dev": true
+    "ts-jest": {
+      "version": "28.0.8",
+      "resolved": "https://registry.npmjs.org/ts-jest/-/ts-jest-28.0.8.tgz",
+      "integrity": "sha512-5FaG0lXmRPzApix8oFG8RKjAz4ehtm8yMKOTy5HX3fY6W8kmvOrmcY0hKDElW52FJov+clhUbrKAqofnj4mXTg==",
+      "dev": true,
+      "requires": {
+        "bs-logger": "0.x",
+        "fast-json-stable-stringify": "2.x",
+        "jest-util": "^28.0.0",
+        "json5": "^2.2.1",
+        "lodash.memoize": "4.x",
+        "make-error": "1.x",
+        "semver": "7.x",
+        "yargs-parser": "^21.0.1"
+      },
+      "dependencies": {
+        "lru-cache": {
+          "version": "6.0.0",
+          "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz",
+          "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==",
+          "dev": true,
+          "requires": {
+            "yallist": "^4.0.0"
+          }
+        },
+        "semver": {
+          "version": "7.3.8",
+          "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz",
+          "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==",
+          "dev": true,
+          "requires": {
+            "lru-cache": "^6.0.0"
+          }
+        },
+        "yallist": {
+          "version": "4.0.0",
+          "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
+          "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==",
+          "dev": true
+        }
+      }
     },
     },
-    "unset-value": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz",
-      "integrity": "sha512-PcA2tsuGSF9cnySLHTLSh2qrQiJ70mn+r+Glzxv2TWZblxsxCC52BDlZoPCsz7STd9pN7EZetkWZBAvk4cgZdQ==",
+    "ts-loader": {
+      "version": "6.2.1",
+      "resolved": "https://registry.npmjs.org/ts-loader/-/ts-loader-6.2.1.tgz",
+      "integrity": "sha512-Dd9FekWuABGgjE1g0TlQJ+4dFUfYGbYcs52/HQObE0ZmUNjQlmLAS7xXsSzy23AMaMwipsx5sNHvoEpT2CZq1g==",
       "dev": true,
       "requires": {
       "dev": true,
       "requires": {
-        "has-value": "^0.3.1",
-        "isobject": "^3.0.0"
+        "chalk": "^2.3.0",
+        "enhanced-resolve": "^4.0.0",
+        "loader-utils": "^1.0.2",
+        "micromatch": "^4.0.0",
+        "semver": "^6.0.0"
       },
       "dependencies": {
       },
       "dependencies": {
-        "has-value": {
-          "version": "0.3.1",
-          "resolved": "https://registry.npmjs.org/has-value/-/has-value-0.3.1.tgz",
-          "integrity": "sha512-gpG936j8/MzaeID5Yif+577c17TxaDmhuyVgSwtnL/q8UUTySg8Mecb+8Cf1otgLoD7DDH75axp86ER7LFsf3Q==",
+        "enhanced-resolve": {
+          "version": "4.5.0",
+          "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-4.5.0.tgz",
+          "integrity": "sha512-Nv9m36S/vxpsI+Hc4/ZGRs0n9mXqSWGGq49zxb/cJfPAQMbUtttJAlNPS4AQzaBdw/pKskw5bMbekT/Y7W/Wlg==",
           "dev": true,
           "requires": {
           "dev": true,
           "requires": {
-            "get-value": "^2.0.3",
-            "has-values": "^0.1.4",
-            "isobject": "^2.0.0"
-          },
-          "dependencies": {
-            "isobject": {
-              "version": "2.1.0",
-              "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz",
-              "integrity": "sha512-+OUdGJlgjOBZDfxnDjYYG6zp487z0JGNQq3cYQYg5f5hKR+syHMsaztzGeml/4kGG55CSpKSpWTY+jYGgsHLgA==",
-              "dev": true,
-              "requires": {
-                "isarray": "1.0.0"
-              }
-            }
+            "graceful-fs": "^4.1.2",
+            "memory-fs": "^0.5.0",
+            "tapable": "^1.0.0"
+          }
+        },
+        "json5": {
+          "version": "1.0.2",
+          "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz",
+          "integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==",
+          "dev": true,
+          "requires": {
+            "minimist": "^1.2.0"
           }
         },
           }
         },
-        "has-values": {
-          "version": "0.1.4",
-          "resolved": "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz",
-          "integrity": "sha512-J8S0cEdWuQbqD9//tlZxiMuMNmxB8PlEwvYwuxsTmR1G5RXUePEX/SJn7aD0GMLieuZYSwNH0cQuJGwnYunXRQ==",
+        "loader-utils": {
+          "version": "1.4.2",
+          "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.2.tgz",
+          "integrity": "sha512-I5d00Pd/jwMD2QCduo657+YM/6L3KZu++pmX9VFncxaxvHcru9jx1lBaFft+r4Mt2jK0Yhp41XlRAihzPxHNCg==",
+          "dev": true,
+          "requires": {
+            "big.js": "^5.2.2",
+            "emojis-list": "^3.0.0",
+            "json5": "^1.0.1"
+          }
+        },
+        "tapable": {
+          "version": "1.1.3",
+          "resolved": "https://registry.npmjs.org/tapable/-/tapable-1.1.3.tgz",
+          "integrity": "sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA==",
           "dev": true
         }
       }
     },
           "dev": true
         }
       }
     },
-    "untildify": {
-      "version": "4.0.0",
-      "resolved": "https://registry.npmjs.org/untildify/-/untildify-4.0.0.tgz",
-      "integrity": "sha512-KK8xQ1mkzZeg9inewmFVDNkg3l5LUhoq9kN6iWYB/CC9YMG8HA+c1Q8HwDe6dEX7kErrEVNVBO3fWsVq5iDgtw==",
-      "dev": true
-    },
-    "upath": {
-      "version": "1.2.0",
-      "resolved": "https://registry.npmjs.org/upath/-/upath-1.2.0.tgz",
-      "integrity": "sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg==",
-      "dev": true
-    },
-    "update-browserslist-db": {
-      "version": "1.0.5",
-      "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.5.tgz",
-      "integrity": "sha512-dteFFpCyvuDdr9S/ff1ISkKt/9YZxKjI9WlRR99c180GaztJtRa/fn18FdxGVKVsnPY7/a/FDN68mcvUmP4U7Q==",
+    "ts-morph": {
+      "version": "13.0.3",
+      "resolved": "https://registry.npmjs.org/ts-morph/-/ts-morph-13.0.3.tgz",
+      "integrity": "sha512-pSOfUMx8Ld/WUreoSzvMFQG5i9uEiWIsBYjpU9+TTASOeUa89j5HykomeqVULm1oqWtBdleI3KEFRLrlA3zGIw==",
       "dev": true,
       "requires": {
       "dev": true,
       "requires": {
-        "escalade": "^3.1.1",
-        "picocolors": "^1.0.0"
+        "@ts-morph/common": "~0.12.3",
+        "code-block-writer": "^11.0.0"
       }
     },
       }
     },
-    "upper-case": {
-      "version": "1.1.3",
-      "resolved": "https://registry.npmjs.org/upper-case/-/upper-case-1.1.3.tgz",
-      "integrity": "sha512-WRbjgmYzgXkCV7zNVpy5YgrHgbBv126rMALQQMrmzOVC4GM2waQ9x7xtm8VU+1yF2kWyPzI9zbZ48n4vSxwfSA==",
-      "dev": true
-    },
-    "uri-js": {
-      "version": "4.4.1",
-      "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz",
-      "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==",
+    "ts-node": {
+      "version": "9.0.0",
+      "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-9.0.0.tgz",
+      "integrity": "sha512-/TqB4SnererCDR/vb4S/QvSZvzQMJN8daAslg7MeaiHvD8rDZsSfXmNeNumyZZzMned72Xoq/isQljYSt8Ynfg==",
       "dev": true,
       "requires": {
       "dev": true,
       "requires": {
-        "punycode": "^2.1.0"
+        "arg": "^4.1.0",
+        "diff": "^4.0.1",
+        "make-error": "^1.1.1",
+        "source-map-support": "^0.5.17",
+        "yn": "3.1.1"
       },
       "dependencies": {
       },
       "dependencies": {
-        "punycode": {
-          "version": "2.1.1",
-          "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz",
-          "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==",
+        "diff": {
+          "version": "4.0.2",
+          "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz",
+          "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==",
           "dev": true
         }
       }
     },
           "dev": true
         }
       }
     },
-    "urix": {
-      "version": "0.1.0",
-      "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz",
-      "integrity": "sha512-Am1ousAhSLBeB9cG/7k7r2R0zj50uDRlZHPGbazid5s9rlF1F/QKYObEKSIunSjIOkJZqwRRLpvewjEkM7pSqg==",
-      "dev": true
-    },
-    "url": {
-      "version": "0.11.0",
-      "resolved": "https://registry.npmjs.org/url/-/url-0.11.0.tgz",
-      "integrity": "sha512-kbailJa29QrtXnxgq+DdCEGlbTeYM2eJUxsz6vjZavrCYPMIFHMKQmSKYAIuUK2i7hgPm28a8piX5NTUtM/LKQ==",
-      "requires": {
-        "punycode": "1.3.2",
-        "querystring": "0.2.0"
-      }
+    "ts-toolbelt": {
+      "version": "6.15.5",
+      "resolved": "https://registry.npmjs.org/ts-toolbelt/-/ts-toolbelt-6.15.5.tgz",
+      "integrity": "sha512-FZIXf1ksVyLcfr7M317jbB67XFJhOO1YqdTcuGaq9q5jLUoTikukZ+98TPjKiP2jC5CgmYdWWYs0s2nLSU0/1A=="
     },
     },
-    "url-parse": {
-      "version": "1.5.10",
-      "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.5.10.tgz",
-      "integrity": "sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==",
+    "tsconfig-paths": {
+      "version": "4.1.2",
+      "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-4.1.2.tgz",
+      "integrity": "sha512-uhxiMgnXQp1IR622dUXI+9Ehnws7i/y6xvpZB9IbUVOPy0muvdvgXeZOn88UcGPiT98Vp3rJPTa8bFoalZ3Qhw==",
+      "dev": true,
       "requires": {
       "requires": {
-        "querystringify": "^2.1.1",
-        "requires-port": "^1.0.0"
+        "json5": "^2.2.2",
+        "minimist": "^1.2.6",
+        "strip-bom": "^3.0.0"
       }
     },
       }
     },
-    "use": {
-      "version": "3.1.1",
-      "resolved": "https://registry.npmjs.org/use/-/use-3.1.1.tgz",
-      "integrity": "sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==",
-      "dev": true
+    "tslib": {
+      "version": "2.3.1",
+      "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.1.tgz",
+      "integrity": "sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw=="
     },
     },
-    "util": {
-      "version": "0.10.4",
-      "resolved": "https://registry.npmjs.org/util/-/util-0.10.4.tgz",
-      "integrity": "sha512-0Pm9hTQ3se5ll1XihRic3FDIku70C+iHUdT/W926rSgHV5QgXsYbKZN8MSC3tJtSkhuROzvsQjAaFENRXr+19A==",
+    "tsutils": {
+      "version": "3.21.0",
+      "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz",
+      "integrity": "sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==",
       "dev": true,
       "requires": {
       "dev": true,
       "requires": {
-        "inherits": "2.0.3"
+        "tslib": "^1.8.1"
       },
       "dependencies": {
       },
       "dependencies": {
-        "inherits": {
-          "version": "2.0.3",
-          "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz",
-          "integrity": "sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw==",
+        "tslib": {
+          "version": "1.14.1",
+          "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz",
+          "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==",
           "dev": true
         }
       }
     },
           "dev": true
         }
       }
     },
-    "util-arity": {
-      "version": "1.1.0",
-      "resolved": "https://registry.npmjs.org/util-arity/-/util-arity-1.1.0.tgz",
-      "integrity": "sha512-kkyIsXKwemfSy8ZEoaIz06ApApnWsk5hQO0vLjZS6UkBiGiW++Jsyb8vSBoc0WKlffGoGs5yYy/j5pp8zckrFA==",
+    "tty-browserify": {
+      "version": "0.0.1",
+      "resolved": "https://registry.npmjs.org/tty-browserify/-/tty-browserify-0.0.1.tgz",
+      "integrity": "sha512-C3TaO7K81YvjCgQH9Q1S3R3P3BtN3RIM8n+OvX4il1K1zgE8ZhI0op7kClgkxtutIE8hQrcrHBXvIheqKUUCxw==",
       "dev": true
     },
       "dev": true
     },
-    "util-deprecate": {
-      "version": "1.0.2",
-      "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
-      "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==",
+    "tunnel": {
+      "version": "0.0.6",
+      "resolved": "https://registry.npmjs.org/tunnel/-/tunnel-0.0.6.tgz",
+      "integrity": "sha512-1h/Lnq9yajKY2PEbBadPXj3VxsDDu844OnaAo52UVmIzIvwwtBPIuNvkjuzBlTWpfJyUbG3ez0KSBibQkj4ojg==",
       "dev": true
     },
       "dev": true
     },
-    "utils-merge": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz",
-      "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==",
+    "tunnel-agent": {
+      "version": "0.6.0",
+      "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz",
+      "integrity": "sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==",
+      "requires": {
+        "safe-buffer": "^5.0.1"
+      }
+    },
+    "tweetnacl": {
+      "version": "0.14.5",
+      "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz",
+      "integrity": "sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA==",
       "dev": true
     },
       "dev": true
     },
-    "uuid": {
-      "version": "8.3.2",
-      "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz",
-      "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==",
+    "type": {
+      "version": "1.2.0",
+      "resolved": "https://registry.npmjs.org/type/-/type-1.2.0.tgz",
+      "integrity": "sha512-+5nt5AAniqsCnu2cEQQdpzCAh33kVx8n0VoFidKpB1dVVLAN/F+bgVOqOJqOnEnrhp222clB5p3vUlD+1QAnfg==",
       "dev": true
     },
       "dev": true
     },
-    "v8-compile-cache": {
-      "version": "2.3.0",
-      "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz",
-      "integrity": "sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA==",
+    "type-check": {
+      "version": "0.3.2",
+      "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz",
+      "integrity": "sha512-ZCmOJdvOWDBYJlzAoFkC+Q0+bUyEOS1ltgp1MGU03fqHG+dbi9tBFU2Rd9QKiDZFAYrhPh2JUf7rZRIuHRKtOg==",
+      "dev": true,
+      "requires": {
+        "prelude-ls": "~1.1.2"
+      }
+    },
+    "type-detect": {
+      "version": "4.0.8",
+      "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz",
+      "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==",
       "dev": true
     },
       "dev": true
     },
-    "v8-to-istanbul": {
-      "version": "7.1.2",
-      "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-7.1.2.tgz",
-      "integrity": "sha512-TxNb7YEUwkLXCQYeudi6lgQ/SZrzNO4kMdlqVxaZPUIUjCv6iSSypUQX70kNBSERpQ8fk48+d61FXk+tgqcWow==",
+    "type-fest": {
+      "version": "0.20.2",
+      "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz",
+      "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ=="
+    },
+    "type-is": {
+      "version": "1.6.18",
+      "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz",
+      "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==",
       "dev": true,
       "requires": {
       "dev": true,
       "requires": {
-        "@types/istanbul-lib-coverage": "^2.0.1",
-        "convert-source-map": "^1.6.0",
-        "source-map": "^0.7.3"
-      },
-      "dependencies": {
-        "source-map": {
-          "version": "0.7.4",
-          "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.4.tgz",
-          "integrity": "sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==",
-          "dev": true
-        }
+        "media-typer": "0.3.0",
+        "mime-types": "~2.1.24"
       }
     },
       }
     },
-    "validate-npm-package-license": {
-      "version": "3.0.4",
-      "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz",
-      "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==",
+    "typed-array-length": {
+      "version": "1.0.4",
+      "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.4.tgz",
+      "integrity": "sha512-KjZypGq+I/H7HI5HlOoGHkWUUGq+Q0TPhQurLbyrVrvnKTBgzLhIJ7j6J/XTQOi0d1RjyZ0wdas8bKs2p0x3Ng==",
       "dev": true,
       "requires": {
       "dev": true,
       "requires": {
-        "spdx-correct": "^3.0.0",
-        "spdx-expression-parse": "^3.0.0"
+        "call-bind": "^1.0.2",
+        "for-each": "^0.3.3",
+        "is-typed-array": "^1.1.9"
       }
     },
       }
     },
-    "validate-npm-package-name": {
-      "version": "3.0.0",
-      "resolved": "https://registry.npmjs.org/validate-npm-package-name/-/validate-npm-package-name-3.0.0.tgz",
-      "integrity": "sha512-M6w37eVCMMouJ9V/sdPGnC5H4uDr73/+xdq0FBLO3TFFX1+7wiUY6Es328NN+y43tmY+doUdN9g9J21vqB7iLw==",
+    "typed-assert": {
+      "version": "1.0.9",
+      "resolved": "https://registry.npmjs.org/typed-assert/-/typed-assert-1.0.9.tgz",
+      "integrity": "sha512-KNNZtayBCtmnNmbo5mG47p1XsCyrx6iVqomjcZnec/1Y5GGARaxPs6r49RnSPeUP3YjNYiU9sQHAtY4BBvnZwg==",
+      "dev": true
+    },
+    "typedarray": {
+      "version": "0.0.6",
+      "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz",
+      "integrity": "sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==",
+      "dev": true
+    },
+    "typedarray-to-buffer": {
+      "version": "3.1.5",
+      "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz",
+      "integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==",
       "dev": true,
       "requires": {
       "dev": true,
       "requires": {
-        "builtins": "^1.0.3"
+        "is-typedarray": "^1.0.0"
       }
     },
       }
     },
-    "vary": {
-      "version": "1.1.2",
-      "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz",
-      "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==",
+    "typescript": {
+      "version": "4.6.4",
+      "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.6.4.tgz",
+      "integrity": "sha512-9ia/jWHIEbo49HfjrLGfKbZSuWo9iTMwXO+Ca3pRsSpbsMbc7/IU8NKdCZVRRBafVPGnoJeFL76ZOAA84I9fEg==",
       "dev": true
     },
       "dev": true
     },
-    "verror": {
-      "version": "1.10.0",
-      "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz",
-      "integrity": "sha512-ZZKSmDAEFOijERBLkmYfJ+vmk3w+7hOLYDNkRCuRuMJGEmqYNCNLyBBFwWKVMhfwaEF3WOd0Zlw86U/WC/+nYw==",
+    "uglify-js": {
+      "version": "3.17.4",
+      "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.17.4.tgz",
+      "integrity": "sha512-T9q82TJI9e/C1TAxYvfb16xO120tMVFZrGA3f9/P4424DNu6ypK103y0GPFVa17yotwSyZW5iYXgjYHkGrJW/g==",
+      "dev": true,
+      "optional": true
+    },
+    "umd": {
+      "version": "3.0.3",
+      "resolved": "https://registry.npmjs.org/umd/-/umd-3.0.3.tgz",
+      "integrity": "sha512-4IcGSufhFshvLNcMCV80UnQVlZ5pMOC8mvNPForqwA4+lzYQuetTESLDQkeLmihq8bRcnpbQa48Wb8Lh16/xow==",
+      "dev": true
+    },
+    "unbox-primitive": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz",
+      "integrity": "sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==",
       "dev": true,
       "requires": {
       "dev": true,
       "requires": {
-        "assert-plus": "^1.0.0",
-        "core-util-is": "1.0.2",
-        "extsprintf": "^1.2.0"
-      },
-      "dependencies": {
-        "core-util-is": {
-          "version": "1.0.2",
-          "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz",
-          "integrity": "sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ==",
-          "dev": true
-        }
+        "call-bind": "^1.0.2",
+        "has-bigints": "^1.0.2",
+        "has-symbols": "^1.0.3",
+        "which-boxed-primitive": "^1.0.2"
       }
     },
       }
     },
-    "vfile": {
-      "version": "4.2.1",
-      "resolved": "https://registry.npmjs.org/vfile/-/vfile-4.2.1.tgz",
-      "integrity": "sha512-O6AE4OskCG5S1emQ/4gl8zK586RqA3srz3nfK/Viy0UPToBc5Trp9BVFb1u0CjsKrAWwnpr4ifM/KBXPWwJbCA==",
+    "unc-path-regex": {
+      "version": "0.1.2",
+      "resolved": "https://registry.npmjs.org/unc-path-regex/-/unc-path-regex-0.1.2.tgz",
+      "integrity": "sha512-eXL4nmJT7oCpkZsHZUOJo8hcX3GbsiDOa0Qu9F646fi8dT3XuSVopVqAcEiVzSKKH7UoDti23wNX3qGFxcW5Qg==",
+      "dev": true
+    },
+    "undeclared-identifiers": {
+      "version": "1.1.3",
+      "resolved": "https://registry.npmjs.org/undeclared-identifiers/-/undeclared-identifiers-1.1.3.tgz",
+      "integrity": "sha512-pJOW4nxjlmfwKApE4zvxLScM/njmwj/DiUBv7EabwE4O8kRUy+HIwxQtZLBPll/jx1LJyBcqNfB3/cpv9EZwOw==",
       "dev": true,
       "requires": {
       "dev": true,
       "requires": {
-        "@types/unist": "^2.0.0",
-        "is-buffer": "^2.0.0",
-        "unist-util-stringify-position": "^2.0.0",
-        "vfile-message": "^2.0.0"
+        "acorn-node": "^1.3.0",
+        "dash-ast": "^1.0.0",
+        "get-assigned-identifiers": "^1.2.0",
+        "simple-concat": "^1.0.0",
+        "xtend": "^4.0.1"
       },
       "dependencies": {
       },
       "dependencies": {
-        "is-buffer": {
-          "version": "2.0.5",
-          "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.5.tgz",
-          "integrity": "sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ==",
+        "dash-ast": {
+          "version": "1.0.0",
+          "resolved": "https://registry.npmjs.org/dash-ast/-/dash-ast-1.0.0.tgz",
+          "integrity": "sha512-Vy4dx7gquTeMcQR/hDkYLGUnwVil6vk4FOOct+djUnHOUWt+zJPJAaRIXaAFkPXtJjvlY7o3rfRu0/3hpnwoUA==",
           "dev": true
         }
       }
     },
           "dev": true
         }
       }
     },
-    "vfile-message": {
-      "version": "2.0.4",
-      "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-2.0.4.tgz",
-      "integrity": "sha512-DjssxRGkMvifUOJre00juHoP9DPWuzjxKuMDrhNbk2TdaYYBNMStsNhEOt3idrtI12VQYM/1+iM0KOzXi4pxwQ==",
+    "underscore": {
+      "version": "1.7.0",
+      "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.7.0.tgz",
+      "integrity": "sha512-cp0oQQyZhUM1kpJDLdGO1jPZHgS/MpzoWYfe9+CM2h/QGDZlqwT2T3YGukuBdaNJ/CAPoeyAZRRHz8JFo176vA==",
+      "dev": true
+    },
+    "unicode-canonical-property-names-ecmascript": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.0.tgz",
+      "integrity": "sha512-yY5PpDlfVIU5+y/BSCxAJRBIS1Zc2dDG3Ujq+sR0U+JjUevW2JhocOF+soROYDSaAezOzOKuyyixhD6mBknSmQ==",
+      "dev": true
+    },
+    "unicode-match-property-ecmascript": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-2.0.0.tgz",
+      "integrity": "sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q==",
       "dev": true,
       "requires": {
       "dev": true,
       "requires": {
-        "@types/unist": "^2.0.0",
-        "unist-util-stringify-position": "^2.0.0"
+        "unicode-canonical-property-names-ecmascript": "^2.0.0",
+        "unicode-property-aliases-ecmascript": "^2.0.0"
       }
     },
       }
     },
-    "vm-browserify": {
-      "version": "1.1.2",
-      "resolved": "https://registry.npmjs.org/vm-browserify/-/vm-browserify-1.1.2.tgz",
-      "integrity": "sha512-2ham8XPWTONajOR0ohOKOHXkm3+gaBmGut3SRuu75xLd/RRaY6vqgh8NBYYk7+RW3u5AtzPQZG8F10LHkl0lAQ==",
+    "unicode-match-property-value-ecmascript": {
+      "version": "2.1.0",
+      "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.1.0.tgz",
+      "integrity": "sha512-qxkjQt6qjg/mYscYMC0XKRn3Rh0wFPlfxB0xkt9CfyTvpX1Ra0+rAmdX2QyAobptSEvuy4RtpPRui6XkV+8wjA==",
       "dev": true
     },
       "dev": true
     },
-    "w3c-hr-time": {
-      "version": "1.0.2",
-      "resolved": "https://registry.npmjs.org/w3c-hr-time/-/w3c-hr-time-1.0.2.tgz",
-      "integrity": "sha512-z8P5DvDNjKDoFIHK7q8r8lackT6l+jo/Ye3HOle7l9nICP9lf1Ci25fy9vHd0JOWewkIFzXIEig3TdKT7JQ5fQ==",
+    "unicode-properties": {
+      "version": "1.4.1",
+      "resolved": "https://registry.npmjs.org/unicode-properties/-/unicode-properties-1.4.1.tgz",
+      "integrity": "sha512-CLjCCLQ6UuMxWnbIylkisbRj31qxHPAurvena/0iwSVbQ2G1VY5/HjV0IRabOEbDHlzZlRdCrD4NhB0JtU40Pg==",
       "dev": true,
       "requires": {
       "dev": true,
       "requires": {
-        "browser-process-hrtime": "^1.0.0"
+        "base64-js": "^1.3.0",
+        "unicode-trie": "^2.0.0"
       }
     },
       }
     },
-    "w3c-xmlserializer": {
-      "version": "1.1.2",
-      "resolved": "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-1.1.2.tgz",
-      "integrity": "sha512-p10l/ayESzrBMYWRID6xbuCKh2Fp77+sA0doRuGn4tTIMrrZVeqfpKjXHY+oDh3K4nLdPgNwMTVP6Vp4pvqbNg==",
+    "unicode-property-aliases-ecmascript": {
+      "version": "2.1.0",
+      "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.1.0.tgz",
+      "integrity": "sha512-6t3foTQI9qne+OZoVQB/8x8rk2k1eVy1gRXhV3oFQ5T6R1dqQ1xtin3XqSlx3+ATBkliTaR/hHyJBm+LVPNM8w==",
+      "dev": true
+    },
+    "unicode-trie": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/unicode-trie/-/unicode-trie-2.0.0.tgz",
+      "integrity": "sha512-x7bc76x0bm4prf1VLg79uhAzKw8DVboClSN5VxJuQ+LKDOVEW9CdH+VY7SP+vX7xCYQqzzgQpFqz15zeLvAtZQ==",
       "dev": true,
       "requires": {
       "dev": true,
       "requires": {
-        "domexception": "^1.0.1",
-        "webidl-conversions": "^4.0.2",
-        "xml-name-validator": "^3.0.0"
+        "pako": "^0.2.5",
+        "tiny-inflate": "^1.0.0"
       },
       "dependencies": {
       },
       "dependencies": {
-        "webidl-conversions": {
-          "version": "4.0.2",
-          "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-4.0.2.tgz",
-          "integrity": "sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==",
+        "pako": {
+          "version": "0.2.9",
+          "resolved": "https://registry.npmjs.org/pako/-/pako-0.2.9.tgz",
+          "integrity": "sha512-NUcwaKxUxWrZLpDG+z/xZaCgQITkA/Dv4V/T6bw7VON6l1Xz/VnrBqrYjZQ12TamKHzITTfOEIYUj48y2KXImA==",
           "dev": true
         }
       }
     },
           "dev": true
         }
       }
     },
-    "wait-on": {
-      "version": "5.3.0",
-      "resolved": "https://registry.npmjs.org/wait-on/-/wait-on-5.3.0.tgz",
-      "integrity": "sha512-DwrHrnTK+/0QFaB9a8Ol5Lna3k7WvUR4jzSKmz0YaPBpuN2sACyiPVKVfj6ejnjcajAcvn3wlbTyMIn9AZouOg==",
-      "dev": true,
-      "requires": {
-        "axios": "^0.21.1",
-        "joi": "^17.3.0",
-        "lodash": "^4.17.21",
-        "minimist": "^1.2.5",
-        "rxjs": "^6.6.3"
-      }
-    },
-    "walker": {
-      "version": "1.0.8",
-      "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.8.tgz",
-      "integrity": "sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==",
-      "dev": true,
-      "requires": {
-        "makeerror": "1.0.12"
-      }
-    },
-    "watchify": {
-      "version": "4.0.0",
-      "resolved": "https://registry.npmjs.org/watchify/-/watchify-4.0.0.tgz",
-      "integrity": "sha512-2Z04dxwoOeNxa11qzWumBTgSAohTC0+ScuY7XMenPnH+W2lhTcpEOJP4g2EIG/SWeLadPk47x++Yh+8BqPM/lA==",
+    "unified": {
+      "version": "9.2.2",
+      "resolved": "https://registry.npmjs.org/unified/-/unified-9.2.2.tgz",
+      "integrity": "sha512-Sg7j110mtefBD+qunSLO1lqOEKdrwBFBrR6Qd8f4uwkhWNlbkaqwHse6e7QvD3AP/MNoJdEDLaf8OxYyoWgorQ==",
       "dev": true,
       "requires": {
       "dev": true,
       "requires": {
-        "anymatch": "^3.1.0",
-        "browserify": "^17.0.0",
-        "chokidar": "^3.4.0",
-        "defined": "^1.0.0",
-        "outpipe": "^1.1.0",
-        "through2": "^4.0.2",
-        "xtend": "^4.0.2"
+        "bail": "^1.0.0",
+        "extend": "^3.0.0",
+        "is-buffer": "^2.0.0",
+        "is-plain-obj": "^2.0.0",
+        "trough": "^1.0.0",
+        "vfile": "^4.0.0"
       },
       "dependencies": {
       },
       "dependencies": {
-        "browser-resolve": {
-          "version": "2.0.0",
-          "resolved": "https://registry.npmjs.org/browser-resolve/-/browser-resolve-2.0.0.tgz",
-          "integrity": "sha512-7sWsQlYL2rGLy2IWm8WL8DCTJvYLc/qlOnsakDac87SOoCd16WLsaAMdCiAqsTNHIe+SXfaqyxyo6THoWqs8WQ==",
-          "dev": true,
-          "requires": {
-            "resolve": "^1.17.0"
-          }
-        },
-        "browserify": {
-          "version": "17.0.0",
-          "resolved": "https://registry.npmjs.org/browserify/-/browserify-17.0.0.tgz",
-          "integrity": "sha512-SaHqzhku9v/j6XsQMRxPyBrSP3gnwmE27gLJYZgMT2GeK3J0+0toN+MnuNYDfHwVGQfLiMZ7KSNSIXHemy905w==",
-          "dev": true,
-          "requires": {
-            "JSONStream": "^1.0.3",
-            "assert": "^1.4.0",
-            "browser-pack": "^6.0.1",
-            "browser-resolve": "^2.0.0",
-            "browserify-zlib": "~0.2.0",
-            "buffer": "~5.2.1",
-            "cached-path-relative": "^1.0.0",
-            "concat-stream": "^1.6.0",
-            "console-browserify": "^1.1.0",
-            "constants-browserify": "~1.0.0",
-            "crypto-browserify": "^3.0.0",
-            "defined": "^1.0.0",
-            "deps-sort": "^2.0.1",
-            "domain-browser": "^1.2.0",
-            "duplexer2": "~0.1.2",
-            "events": "^3.0.0",
-            "glob": "^7.1.0",
-            "has": "^1.0.0",
-            "htmlescape": "^1.1.0",
-            "https-browserify": "^1.0.0",
-            "inherits": "~2.0.1",
-            "insert-module-globals": "^7.2.1",
-            "labeled-stream-splicer": "^2.0.0",
-            "mkdirp-classic": "^0.5.2",
-            "module-deps": "^6.2.3",
-            "os-browserify": "~0.3.0",
-            "parents": "^1.0.1",
-            "path-browserify": "^1.0.0",
-            "process": "~0.11.0",
-            "punycode": "^1.3.2",
-            "querystring-es3": "~0.2.0",
-            "read-only-stream": "^2.0.0",
-            "readable-stream": "^2.0.2",
-            "resolve": "^1.1.4",
-            "shasum-object": "^1.0.0",
-            "shell-quote": "^1.6.1",
-            "stream-browserify": "^3.0.0",
-            "stream-http": "^3.0.0",
-            "string_decoder": "^1.1.1",
-            "subarg": "^1.0.0",
-            "syntax-error": "^1.1.1",
-            "through2": "^2.0.0",
-            "timers-browserify": "^1.0.1",
-            "tty-browserify": "0.0.1",
-            "url": "~0.11.0",
-            "util": "~0.12.0",
-            "vm-browserify": "^1.0.0",
-            "xtend": "^4.0.0"
-          },
-          "dependencies": {
-            "through2": {
-              "version": "2.0.5",
-              "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz",
-              "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==",
-              "dev": true,
-              "requires": {
-                "readable-stream": "~2.3.6",
-                "xtend": "~4.0.1"
-              }
-            }
-          }
-        },
-        "buffer": {
-          "version": "5.2.1",
-          "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.2.1.tgz",
-          "integrity": "sha512-c+Ko0loDaFfuPWiL02ls9Xd3GO3cPVmUobQ6t3rXNUk304u6hGq+8N/kFi+QEIKhzK3uwolVhLzszmfLmMLnqg==",
-          "dev": true,
-          "requires": {
-            "base64-js": "^1.0.2",
-            "ieee754": "^1.1.4"
-          }
-        },
-        "readable-stream": {
-          "version": "2.3.7",
-          "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz",
-          "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==",
-          "dev": true,
-          "requires": {
-            "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"
-          },
-          "dependencies": {
-            "string_decoder": {
-              "version": "1.1.1",
-              "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz",
-              "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
-              "dev": true,
-              "requires": {
-                "safe-buffer": "~5.1.0"
-              }
-            }
-          }
-        },
-        "stream-browserify": {
-          "version": "3.0.0",
-          "resolved": "https://registry.npmjs.org/stream-browserify/-/stream-browserify-3.0.0.tgz",
-          "integrity": "sha512-H73RAHsVBapbim0tU2JwwOiXUj+fikfiaoYAKHF3VJfA0pe2BCzkhAHBlLG6REzE+2WNZcxOXjK7lkso+9euLA==",
-          "dev": true,
-          "requires": {
-            "inherits": "~2.0.4",
-            "readable-stream": "^3.5.0"
-          },
-          "dependencies": {
-            "readable-stream": {
-              "version": "3.6.0",
-              "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz",
-              "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==",
-              "dev": true,
-              "requires": {
-                "inherits": "^2.0.3",
-                "string_decoder": "^1.1.1",
-                "util-deprecate": "^1.0.1"
-              }
-            }
-          }
+        "is-buffer": {
+          "version": "2.0.5",
+          "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.5.tgz",
+          "integrity": "sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ==",
+          "dev": true
         },
         },
-        "through2": {
-          "version": "4.0.2",
-          "resolved": "https://registry.npmjs.org/through2/-/through2-4.0.2.tgz",
-          "integrity": "sha512-iOqSav00cVxEEICeD7TjLB1sueEL+81Wpzp2bY17uZjZN0pWZPuo4suZ/61VujxmqSGFfgOcNuTZ85QJwNZQpw==",
+        "is-plain-obj": {
+          "version": "2.1.0",
+          "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-2.1.0.tgz",
+          "integrity": "sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==",
+          "dev": true
+        }
+      }
+    },
+    "union-value": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.1.tgz",
+      "integrity": "sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg==",
+      "dev": true,
+      "requires": {
+        "arr-union": "^3.1.0",
+        "get-value": "^2.0.6",
+        "is-extendable": "^0.1.1",
+        "set-value": "^2.0.1"
+      }
+    },
+    "unique-filename": {
+      "version": "1.1.1",
+      "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-1.1.1.tgz",
+      "integrity": "sha512-Vmp0jIp2ln35UTXuryvjzkjGdRyf9b2lTXuSYUiPmzRcl3FDtYqAwOnTJkAngD9SWhnoJzDbTKwaOrZ+STtxNQ==",
+      "dev": true,
+      "requires": {
+        "unique-slug": "^2.0.0"
+      }
+    },
+    "unique-slug": {
+      "version": "2.0.2",
+      "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-2.0.2.tgz",
+      "integrity": "sha512-zoWr9ObaxALD3DOPfjPSqxt4fnZiWblxHIgeWqW8x7UqDzEtHEQLzji2cuJYQFCU6KmoJikOYAZlrTHHebjx2w==",
+      "dev": true,
+      "requires": {
+        "imurmurhash": "^0.1.4"
+      }
+    },
+    "unist-util-find-all-after": {
+      "version": "3.0.2",
+      "resolved": "https://registry.npmjs.org/unist-util-find-all-after/-/unist-util-find-all-after-3.0.2.tgz",
+      "integrity": "sha512-xaTC/AGZ0rIM2gM28YVRAFPIZpzbpDtU3dRmp7EXlNVA8ziQc4hY3H7BHXM1J49nEmiqc3svnqMReW+PGqbZKQ==",
+      "dev": true,
+      "requires": {
+        "unist-util-is": "^4.0.0"
+      }
+    },
+    "unist-util-is": {
+      "version": "4.1.0",
+      "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-4.1.0.tgz",
+      "integrity": "sha512-ZOQSsnce92GrxSqlnEEseX0gi7GH9zTJZ0p9dtu87WRb/37mMPO2Ilx1s/t9vBHrFhbgweUwb+t7cIn5dxPhZg==",
+      "dev": true
+    },
+    "unist-util-stringify-position": {
+      "version": "2.0.3",
+      "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-2.0.3.tgz",
+      "integrity": "sha512-3faScn5I+hy9VleOq/qNbAd6pAx7iH5jYBMS9I1HgQVijz/4mv5Bvw5iw1sC/90CODiKo81G/ps8AJrISn687g==",
+      "dev": true,
+      "requires": {
+        "@types/unist": "^2.0.2"
+      }
+    },
+    "universalify": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz",
+      "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==",
+      "dev": true
+    },
+    "unix-crypt-td-js": {
+      "version": "1.1.4",
+      "resolved": "https://registry.npmjs.org/unix-crypt-td-js/-/unix-crypt-td-js-1.1.4.tgz",
+      "integrity": "sha512-8rMeVYWSIyccIJscb9NdCfZKSRBKYTeVnwmiRYT2ulE3qd1RaDQ0xQDP+rI3ccIWbhu/zuo5cgN8z73belNZgw==",
+      "dev": true
+    },
+    "unpipe": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz",
+      "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==",
+      "dev": true
+    },
+    "unraw": {
+      "version": "2.0.1",
+      "resolved": "https://registry.npmjs.org/unraw/-/unraw-2.0.1.tgz",
+      "integrity": "sha512-tdOvLfRzHolwYcHS6HIX860MkK9LQ4+oLuNwFYL7bpgTEO64PZrcQxkisgwJYCfF8sKiWLwwu1c83DvMkbefIQ=="
+    },
+    "unset-value": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz",
+      "integrity": "sha512-PcA2tsuGSF9cnySLHTLSh2qrQiJ70mn+r+Glzxv2TWZblxsxCC52BDlZoPCsz7STd9pN7EZetkWZBAvk4cgZdQ==",
+      "dev": true,
+      "requires": {
+        "has-value": "^0.3.1",
+        "isobject": "^3.0.0"
+      },
+      "dependencies": {
+        "has-value": {
+          "version": "0.3.1",
+          "resolved": "https://registry.npmjs.org/has-value/-/has-value-0.3.1.tgz",
+          "integrity": "sha512-gpG936j8/MzaeID5Yif+577c17TxaDmhuyVgSwtnL/q8UUTySg8Mecb+8Cf1otgLoD7DDH75axp86ER7LFsf3Q==",
           "dev": true,
           "requires": {
           "dev": true,
           "requires": {
-            "readable-stream": "3"
+            "get-value": "^2.0.3",
+            "has-values": "^0.1.4",
+            "isobject": "^2.0.0"
           },
           "dependencies": {
           },
           "dependencies": {
-            "readable-stream": {
-              "version": "3.6.0",
-              "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz",
-              "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==",
+            "isobject": {
+              "version": "2.1.0",
+              "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz",
+              "integrity": "sha512-+OUdGJlgjOBZDfxnDjYYG6zp487z0JGNQq3cYQYg5f5hKR+syHMsaztzGeml/4kGG55CSpKSpWTY+jYGgsHLgA==",
               "dev": true,
               "requires": {
               "dev": true,
               "requires": {
-                "inherits": "^2.0.3",
-                "string_decoder": "^1.1.1",
-                "util-deprecate": "^1.0.1"
+                "isarray": "1.0.0"
               }
             }
           }
         },
               }
             }
           }
         },
-        "util": {
-          "version": "0.12.4",
-          "resolved": "https://registry.npmjs.org/util/-/util-0.12.4.tgz",
-          "integrity": "sha512-bxZ9qtSlGUWSOy9Qa9Xgk11kSslpuZwaxCg4sNIDj6FLucDab2JxnHwyNTCpHMtK1MjoQiWQ6DiUMZYbSrO+Sw==",
-          "dev": true,
-          "requires": {
-            "inherits": "^2.0.3",
-            "is-arguments": "^1.0.4",
-            "is-generator-function": "^1.0.7",
-            "is-typed-array": "^1.1.3",
-            "safe-buffer": "^5.1.2",
-            "which-typed-array": "^1.1.2"
-          }
+        "has-values": {
+          "version": "0.1.4",
+          "resolved": "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz",
+          "integrity": "sha512-J8S0cEdWuQbqD9//tlZxiMuMNmxB8PlEwvYwuxsTmR1G5RXUePEX/SJn7aD0GMLieuZYSwNH0cQuJGwnYunXRQ==",
+          "dev": true
         }
       }
     },
         }
       }
     },
-    "watchpack": {
-      "version": "2.4.0",
-      "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.0.tgz",
-      "integrity": "sha512-Lcvm7MGST/4fup+ifyKi2hjyIAwcdI4HRgtvTpIUxBRhB+RFtUh8XtDOxUfctVCnhVi+QQj49i91OyvzkJl6cg==",
+    "untildify": {
+      "version": "4.0.0",
+      "resolved": "https://registry.npmjs.org/untildify/-/untildify-4.0.0.tgz",
+      "integrity": "sha512-KK8xQ1mkzZeg9inewmFVDNkg3l5LUhoq9kN6iWYB/CC9YMG8HA+c1Q8HwDe6dEX7kErrEVNVBO3fWsVq5iDgtw==",
+      "dev": true
+    },
+    "update-browserslist-db": {
+      "version": "1.0.10",
+      "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.10.tgz",
+      "integrity": "sha512-OztqDenkfFkbSG+tRxBeAnCVPckDBcvibKd35yDONx6OU8N7sqgwc7rCbkJ/WcYtVRZ4ba68d6byhC21GFh7sQ==",
+      "requires": {
+        "escalade": "^3.1.1",
+        "picocolors": "^1.0.0"
+      }
+    },
+    "upper-case": {
+      "version": "1.1.3",
+      "resolved": "https://registry.npmjs.org/upper-case/-/upper-case-1.1.3.tgz",
+      "integrity": "sha512-WRbjgmYzgXkCV7zNVpy5YgrHgbBv126rMALQQMrmzOVC4GM2waQ9x7xtm8VU+1yF2kWyPzI9zbZ48n4vSxwfSA==",
+      "dev": true
+    },
+    "uri-js": {
+      "version": "4.4.1",
+      "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz",
+      "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==",
       "dev": true,
       "requires": {
       "dev": true,
       "requires": {
-        "glob-to-regexp": "^0.4.1",
-        "graceful-fs": "^4.1.2"
+        "punycode": "^2.1.0"
+      },
+      "dependencies": {
+        "punycode": {
+          "version": "2.3.0",
+          "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.0.tgz",
+          "integrity": "sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==",
+          "dev": true
+        }
       }
     },
       }
     },
-    "wbuf": {
-      "version": "1.7.3",
-      "resolved": "https://registry.npmjs.org/wbuf/-/wbuf-1.7.3.tgz",
-      "integrity": "sha512-O84QOnr0icsbFGLS0O3bI5FswxzRr8/gHwWkDlQFskhSPryQXvrTMxjxGP4+iWYoauLoBvfDpkrOauZ+0iZpDA==",
+    "urix": {
+      "version": "0.1.0",
+      "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz",
+      "integrity": "sha512-Am1ousAhSLBeB9cG/7k7r2R0zj50uDRlZHPGbazid5s9rlF1F/QKYObEKSIunSjIOkJZqwRRLpvewjEkM7pSqg==",
+      "dev": true
+    },
+    "url": {
+      "version": "0.11.0",
+      "resolved": "https://registry.npmjs.org/url/-/url-0.11.0.tgz",
+      "integrity": "sha512-kbailJa29QrtXnxgq+DdCEGlbTeYM2eJUxsz6vjZavrCYPMIFHMKQmSKYAIuUK2i7hgPm28a8piX5NTUtM/LKQ==",
+      "requires": {
+        "punycode": "1.3.2",
+        "querystring": "0.2.0"
+      }
+    },
+    "url-parse": {
+      "version": "1.5.10",
+      "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.5.10.tgz",
+      "integrity": "sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==",
+      "requires": {
+        "querystringify": "^2.1.1",
+        "requires-port": "^1.0.0"
+      }
+    },
+    "use": {
+      "version": "3.1.1",
+      "resolved": "https://registry.npmjs.org/use/-/use-3.1.1.tgz",
+      "integrity": "sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==",
+      "dev": true
+    },
+    "util": {
+      "version": "0.10.4",
+      "resolved": "https://registry.npmjs.org/util/-/util-0.10.4.tgz",
+      "integrity": "sha512-0Pm9hTQ3se5ll1XihRic3FDIku70C+iHUdT/W926rSgHV5QgXsYbKZN8MSC3tJtSkhuROzvsQjAaFENRXr+19A==",
       "dev": true,
       "requires": {
       "dev": true,
       "requires": {
-        "minimalistic-assert": "^1.0.0"
+        "inherits": "2.0.3"
+      },
+      "dependencies": {
+        "inherits": {
+          "version": "2.0.3",
+          "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz",
+          "integrity": "sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw==",
+          "dev": true
+        }
       }
     },
       }
     },
-    "wcwidth": {
+    "util-arity": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npmjs.org/util-arity/-/util-arity-1.1.0.tgz",
+      "integrity": "sha512-kkyIsXKwemfSy8ZEoaIz06ApApnWsk5hQO0vLjZS6UkBiGiW++Jsyb8vSBoc0WKlffGoGs5yYy/j5pp8zckrFA==",
+      "dev": true
+    },
+    "util-deprecate": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
+      "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw=="
+    },
+    "utils-merge": {
       "version": "1.0.1",
       "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/wcwidth/-/wcwidth-1.0.1.tgz",
-      "integrity": "sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==",
+      "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz",
+      "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==",
+      "dev": true
+    },
+    "uuid": {
+      "version": "8.3.2",
+      "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz",
+      "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==",
+      "dev": true
+    },
+    "v8-compile-cache": {
+      "version": "2.3.0",
+      "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz",
+      "integrity": "sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA==",
+      "dev": true
+    },
+    "v8-to-istanbul": {
+      "version": "9.1.0",
+      "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-9.1.0.tgz",
+      "integrity": "sha512-6z3GW9x8G1gd+JIIgQQQxXuiJtCXeAjp6RaPEPLv62mH3iPHPxV6W3robxtCzNErRo6ZwTmzWhsbNvjyEBKzKA==",
+      "dev": true,
+      "requires": {
+        "@jridgewell/trace-mapping": "^0.3.12",
+        "@types/istanbul-lib-coverage": "^2.0.1",
+        "convert-source-map": "^1.6.0"
+      }
+    },
+    "validate-npm-package-license": {
+      "version": "3.0.4",
+      "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz",
+      "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==",
+      "dev": true,
+      "requires": {
+        "spdx-correct": "^3.0.0",
+        "spdx-expression-parse": "^3.0.0"
+      }
+    },
+    "validate-npm-package-name": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/validate-npm-package-name/-/validate-npm-package-name-3.0.0.tgz",
+      "integrity": "sha512-M6w37eVCMMouJ9V/sdPGnC5H4uDr73/+xdq0FBLO3TFFX1+7wiUY6Es328NN+y43tmY+doUdN9g9J21vqB7iLw==",
       "dev": true,
       "requires": {
       "dev": true,
       "requires": {
-        "defaults": "^1.0.3"
+        "builtins": "^1.0.3"
       }
     },
       }
     },
-    "web-streams-polyfill": {
-      "version": "4.0.0-beta.3",
-      "resolved": "https://registry.npmjs.org/web-streams-polyfill/-/web-streams-polyfill-4.0.0-beta.3.tgz",
-      "integrity": "sha512-QW95TCTaHmsYfHDybGMwO5IJIM93I/6vTRk+daHTWFPhwh+C8Cg7j7XyKrwrj8Ib6vYXe0ocYNrmzY4xAAN6ug=="
-    },
-    "webidl-conversions": {
-      "version": "3.0.1",
-      "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz",
-      "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ=="
+    "vary": {
+      "version": "1.1.2",
+      "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz",
+      "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==",
+      "dev": true
     },
     },
-    "webpack": {
-      "version": "5.50.0",
-      "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.50.0.tgz",
-      "integrity": "sha512-hqxI7t/KVygs0WRv/kTgUW8Kl3YC81uyWQSo/7WUs5LsuRw0htH/fCwbVBGCuiX/t4s7qzjXFcf41O8Reiypag==",
+    "verror": {
+      "version": "1.10.0",
+      "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz",
+      "integrity": "sha512-ZZKSmDAEFOijERBLkmYfJ+vmk3w+7hOLYDNkRCuRuMJGEmqYNCNLyBBFwWKVMhfwaEF3WOd0Zlw86U/WC/+nYw==",
       "dev": true,
       "requires": {
       "dev": true,
       "requires": {
-        "@types/eslint-scope": "^3.7.0",
-        "@types/estree": "^0.0.50",
-        "@webassemblyjs/ast": "1.11.1",
-        "@webassemblyjs/wasm-edit": "1.11.1",
-        "@webassemblyjs/wasm-parser": "1.11.1",
-        "acorn": "^8.4.1",
-        "acorn-import-assertions": "^1.7.6",
-        "browserslist": "^4.14.5",
-        "chrome-trace-event": "^1.0.2",
-        "enhanced-resolve": "^5.8.0",
-        "es-module-lexer": "^0.7.1",
-        "eslint-scope": "5.1.1",
-        "events": "^3.2.0",
-        "glob-to-regexp": "^0.4.1",
-        "graceful-fs": "^4.2.4",
-        "json-parse-better-errors": "^1.0.2",
-        "loader-runner": "^4.2.0",
-        "mime-types": "^2.1.27",
-        "neo-async": "^2.6.2",
-        "schema-utils": "^3.1.0",
-        "tapable": "^2.1.1",
-        "terser-webpack-plugin": "^5.1.3",
-        "watchpack": "^2.2.0",
-        "webpack-sources": "^3.2.0"
+        "assert-plus": "^1.0.0",
+        "core-util-is": "1.0.2",
+        "extsprintf": "^1.2.0"
       },
       "dependencies": {
       },
       "dependencies": {
-        "ajv": {
-          "version": "6.12.6",
-          "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz",
-          "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==",
-          "dev": true,
-          "requires": {
-            "fast-deep-equal": "^3.1.1",
-            "fast-json-stable-stringify": "^2.0.0",
-            "json-schema-traverse": "^0.4.1",
-            "uri-js": "^4.2.2"
-          }
-        },
-        "json-schema-traverse": {
-          "version": "0.4.1",
-          "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz",
-          "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==",
-          "dev": true
-        },
-        "schema-utils": {
-          "version": "3.1.1",
-          "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz",
-          "integrity": "sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==",
-          "dev": true,
-          "requires": {
-            "@types/json-schema": "^7.0.8",
-            "ajv": "^6.12.5",
-            "ajv-keywords": "^3.5.2"
-          }
-        },
-        "webpack-sources": {
-          "version": "3.2.3",
-          "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.2.3.tgz",
-          "integrity": "sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==",
+        "core-util-is": {
+          "version": "1.0.2",
+          "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz",
+          "integrity": "sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ==",
           "dev": true
         }
       }
     },
           "dev": true
         }
       }
     },
-    "webpack-dev-middleware": {
-      "version": "5.0.0",
-      "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-5.0.0.tgz",
-      "integrity": "sha512-9zng2Z60pm6A98YoRcA0wSxw1EYn7B7y5owX/Tckyt9KGyULTkLtiavjaXlWqOMkM0YtqGgL3PvMOFgyFLq8vw==",
+    "vfile": {
+      "version": "4.2.1",
+      "resolved": "https://registry.npmjs.org/vfile/-/vfile-4.2.1.tgz",
+      "integrity": "sha512-O6AE4OskCG5S1emQ/4gl8zK586RqA3srz3nfK/Viy0UPToBc5Trp9BVFb1u0CjsKrAWwnpr4ifM/KBXPWwJbCA==",
       "dev": true,
       "requires": {
       "dev": true,
       "requires": {
-        "colorette": "^1.2.2",
-        "mem": "^8.1.1",
-        "memfs": "^3.2.2",
-        "mime-types": "^2.1.31",
-        "range-parser": "^1.2.1",
-        "schema-utils": "^3.0.0"
+        "@types/unist": "^2.0.0",
+        "is-buffer": "^2.0.0",
+        "unist-util-stringify-position": "^2.0.0",
+        "vfile-message": "^2.0.0"
       },
       "dependencies": {
       },
       "dependencies": {
-        "ajv": {
-          "version": "6.12.6",
-          "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz",
-          "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==",
-          "dev": true,
-          "requires": {
-            "fast-deep-equal": "^3.1.1",
-            "fast-json-stable-stringify": "^2.0.0",
-            "json-schema-traverse": "^0.4.1",
-            "uri-js": "^4.2.2"
-          }
-        },
-        "json-schema-traverse": {
-          "version": "0.4.1",
-          "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz",
-          "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==",
+        "is-buffer": {
+          "version": "2.0.5",
+          "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.5.tgz",
+          "integrity": "sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ==",
           "dev": true
           "dev": true
-        },
-        "schema-utils": {
-          "version": "3.1.1",
-          "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz",
-          "integrity": "sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==",
-          "dev": true,
-          "requires": {
-            "@types/json-schema": "^7.0.8",
-            "ajv": "^6.12.5",
-            "ajv-keywords": "^3.5.2"
-          }
         }
       }
     },
         }
       }
     },
-    "webpack-dev-server": {
-      "version": "3.11.2",
-      "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-3.11.2.tgz",
-      "integrity": "sha512-A80BkuHRQfCiNtGBS1EMf2ChTUs0x+B3wGDFmOeT4rmJOHhHTCH2naNxIHhmkr0/UillP4U3yeIyv1pNp+QDLQ==",
+    "vfile-message": {
+      "version": "2.0.4",
+      "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-2.0.4.tgz",
+      "integrity": "sha512-DjssxRGkMvifUOJre00juHoP9DPWuzjxKuMDrhNbk2TdaYYBNMStsNhEOt3idrtI12VQYM/1+iM0KOzXi4pxwQ==",
       "dev": true,
       "requires": {
       "dev": true,
       "requires": {
-        "ansi-html": "0.0.7",
-        "bonjour": "^3.5.0",
-        "chokidar": "^2.1.8",
-        "compression": "^1.7.4",
-        "connect-history-api-fallback": "^1.6.0",
-        "debug": "^4.1.1",
-        "del": "^4.1.1",
-        "express": "^4.17.1",
-        "html-entities": "^1.3.1",
-        "http-proxy-middleware": "0.19.1",
-        "import-local": "^2.0.0",
-        "internal-ip": "^4.3.0",
-        "ip": "^1.1.5",
-        "is-absolute-url": "^3.0.3",
-        "killable": "^1.0.1",
-        "loglevel": "^1.6.8",
-        "opn": "^5.5.0",
-        "p-retry": "^3.0.1",
-        "portfinder": "^1.0.26",
-        "schema-utils": "^1.0.0",
-        "selfsigned": "^1.10.8",
-        "semver": "^6.3.0",
-        "serve-index": "^1.9.1",
-        "sockjs": "^0.3.21",
-        "sockjs-client": "^1.5.0",
-        "spdy": "^4.0.2",
-        "strip-ansi": "^3.0.1",
-        "supports-color": "^6.1.0",
-        "url": "^0.11.0",
-        "webpack-dev-middleware": "^3.7.2",
-        "webpack-log": "^2.0.0",
-        "ws": "^6.2.1",
-        "yargs": "^13.3.2"
+        "@types/unist": "^2.0.0",
+        "unist-util-stringify-position": "^2.0.0"
+      }
+    },
+    "vm-browserify": {
+      "version": "1.1.2",
+      "resolved": "https://registry.npmjs.org/vm-browserify/-/vm-browserify-1.1.2.tgz",
+      "integrity": "sha512-2ham8XPWTONajOR0ohOKOHXkm3+gaBmGut3SRuu75xLd/RRaY6vqgh8NBYYk7+RW3u5AtzPQZG8F10LHkl0lAQ==",
+      "dev": true
+    },
+    "w3c-hr-time": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/w3c-hr-time/-/w3c-hr-time-1.0.2.tgz",
+      "integrity": "sha512-z8P5DvDNjKDoFIHK7q8r8lackT6l+jo/Ye3HOle7l9nICP9lf1Ci25fy9vHd0JOWewkIFzXIEig3TdKT7JQ5fQ==",
+      "dev": true,
+      "requires": {
+        "browser-process-hrtime": "^1.0.0"
+      }
+    },
+    "w3c-xmlserializer": {
+      "version": "1.1.2",
+      "resolved": "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-1.1.2.tgz",
+      "integrity": "sha512-p10l/ayESzrBMYWRID6xbuCKh2Fp77+sA0doRuGn4tTIMrrZVeqfpKjXHY+oDh3K4nLdPgNwMTVP6Vp4pvqbNg==",
+      "dev": true,
+      "requires": {
+        "domexception": "^1.0.1",
+        "webidl-conversions": "^4.0.2",
+        "xml-name-validator": "^3.0.0"
       },
       "dependencies": {
       },
       "dependencies": {
-        "ajv": {
-          "version": "6.12.6",
-          "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz",
-          "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==",
-          "dev": true,
-          "requires": {
-            "fast-deep-equal": "^3.1.1",
-            "fast-json-stable-stringify": "^2.0.0",
-            "json-schema-traverse": "^0.4.1",
-            "uri-js": "^4.2.2"
-          }
-        },
-        "ansi-regex": {
-          "version": "2.1.1",
-          "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz",
-          "integrity": "sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA==",
-          "dev": true
-        },
-        "anymatch": {
-          "version": "2.0.0",
-          "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz",
-          "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==",
-          "dev": true,
-          "requires": {
-            "micromatch": "^3.1.4",
-            "normalize-path": "^2.1.1"
-          },
-          "dependencies": {
-            "normalize-path": {
-              "version": "2.1.1",
-              "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz",
-              "integrity": "sha512-3pKJwH184Xo/lnH6oyP1q2pMd7HcypqqmRs91/6/i2CGtWwIKGCkOOMTm/zXbgTEWHw1uNpNi/igc3ePOYHb6w==",
-              "dev": true,
-              "requires": {
-                "remove-trailing-separator": "^1.0.1"
-              }
-            }
-          }
-        },
-        "binary-extensions": {
-          "version": "1.13.1",
-          "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.13.1.tgz",
-          "integrity": "sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw==",
-          "dev": true
-        },
-        "braces": {
-          "version": "2.3.2",
-          "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz",
-          "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==",
-          "dev": true,
-          "requires": {
-            "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"
-          },
-          "dependencies": {
-            "extend-shallow": {
-              "version": "2.0.1",
-              "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
-              "integrity": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==",
-              "dev": true,
-              "requires": {
-                "is-extendable": "^0.1.0"
-              }
-            }
-          }
-        },
-        "chokidar": {
-          "version": "2.1.8",
-          "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.1.8.tgz",
-          "integrity": "sha512-ZmZUazfOzf0Nve7duiCKD23PFSCs4JPoYyccjUFF3aQkQadqBhfzhjkwBH2mNOG9cTBwhamM37EIsIkZw3nRgg==",
-          "dev": true,
-          "requires": {
-            "anymatch": "^2.0.0",
-            "async-each": "^1.0.1",
-            "braces": "^2.3.2",
-            "fsevents": "^1.2.7",
-            "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"
-          }
-        },
-        "cliui": {
-          "version": "5.0.0",
-          "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz",
-          "integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==",
-          "dev": true,
-          "requires": {
-            "string-width": "^3.1.0",
-            "strip-ansi": "^5.2.0",
-            "wrap-ansi": "^5.1.0"
-          },
-          "dependencies": {
-            "ansi-regex": {
-              "version": "4.1.1",
-              "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.1.tgz",
-              "integrity": "sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==",
-              "dev": true
-            },
-            "strip-ansi": {
-              "version": "5.2.0",
-              "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz",
-              "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==",
-              "dev": true,
-              "requires": {
-                "ansi-regex": "^4.1.0"
-              }
-            }
-          }
-        },
-        "emoji-regex": {
-          "version": "7.0.3",
-          "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz",
-          "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==",
+        "webidl-conversions": {
+          "version": "4.0.2",
+          "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-4.0.2.tgz",
+          "integrity": "sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==",
           "dev": true
           "dev": true
-        },
-        "fill-range": {
-          "version": "4.0.0",
-          "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz",
-          "integrity": "sha512-VcpLTWqWDiTerugjj8e3+esbg+skS3M9e54UuR3iCeIDMXCLTsAH8hTSzDQU/X6/6t3eYkOKoZSef2PlU6U1XQ==",
+        }
+      }
+    },
+    "wait-on": {
+      "version": "5.3.0",
+      "resolved": "https://registry.npmjs.org/wait-on/-/wait-on-5.3.0.tgz",
+      "integrity": "sha512-DwrHrnTK+/0QFaB9a8Ol5Lna3k7WvUR4jzSKmz0YaPBpuN2sACyiPVKVfj6ejnjcajAcvn3wlbTyMIn9AZouOg==",
+      "dev": true,
+      "requires": {
+        "axios": "^0.21.1",
+        "joi": "^17.3.0",
+        "lodash": "^4.17.21",
+        "minimist": "^1.2.5",
+        "rxjs": "^6.6.3"
+      },
+      "dependencies": {
+        "axios": {
+          "version": "0.21.4",
+          "resolved": "https://registry.npmjs.org/axios/-/axios-0.21.4.tgz",
+          "integrity": "sha512-ut5vewkiu8jjGBdqpM44XxjuCjq9LAKeHVmoVfHVzy8eHgxxq8SbAVQNovDA8mVi05kP0Ea/n/UzcSHcTJQfNg==",
           "dev": true,
           "requires": {
           "dev": true,
           "requires": {
-            "extend-shallow": "^2.0.1",
-            "is-number": "^3.0.0",
-            "repeat-string": "^1.6.1",
-            "to-regex-range": "^2.1.0"
-          },
-          "dependencies": {
-            "extend-shallow": {
-              "version": "2.0.1",
-              "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
-              "integrity": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==",
-              "dev": true,
-              "requires": {
-                "is-extendable": "^0.1.0"
-              }
-            }
+            "follow-redirects": "^1.14.0"
           }
           }
-        },
-        "find-up": {
-          "version": "3.0.0",
-          "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz",
-          "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==",
+        }
+      }
+    },
+    "walker": {
+      "version": "1.0.8",
+      "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.8.tgz",
+      "integrity": "sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==",
+      "dev": true,
+      "requires": {
+        "makeerror": "1.0.12"
+      }
+    },
+    "watchify": {
+      "version": "4.0.0",
+      "resolved": "https://registry.npmjs.org/watchify/-/watchify-4.0.0.tgz",
+      "integrity": "sha512-2Z04dxwoOeNxa11qzWumBTgSAohTC0+ScuY7XMenPnH+W2lhTcpEOJP4g2EIG/SWeLadPk47x++Yh+8BqPM/lA==",
+      "dev": true,
+      "requires": {
+        "anymatch": "^3.1.0",
+        "browserify": "^17.0.0",
+        "chokidar": "^3.4.0",
+        "defined": "^1.0.0",
+        "outpipe": "^1.1.0",
+        "through2": "^4.0.2",
+        "xtend": "^4.0.2"
+      },
+      "dependencies": {
+        "browser-resolve": {
+          "version": "2.0.0",
+          "resolved": "https://registry.npmjs.org/browser-resolve/-/browser-resolve-2.0.0.tgz",
+          "integrity": "sha512-7sWsQlYL2rGLy2IWm8WL8DCTJvYLc/qlOnsakDac87SOoCd16WLsaAMdCiAqsTNHIe+SXfaqyxyo6THoWqs8WQ==",
           "dev": true,
           "requires": {
           "dev": true,
           "requires": {
-            "locate-path": "^3.0.0"
+            "resolve": "^1.17.0"
           }
         },
           }
         },
-        "fsevents": {
-          "version": "1.2.13",
-          "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.13.tgz",
-          "integrity": "sha512-oWb1Z6mkHIskLzEJ/XWX0srkpkTQ7vaopMQkyaEIoq0fmtFVxOthb8cCxeT+p3ynTdkk/RZwbgG4brR5BeWECw==",
-          "dev": true,
-          "optional": true
-        },
-        "glob-parent": {
-          "version": "3.1.0",
-          "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz",
-          "integrity": "sha512-E8Ak/2+dZY6fnzlR7+ueWvhsH1SjHr4jjss4YS/h4py44jY9MhK/VFdaZJAWDz6BbL21KeteKxFSFpq8OS5gVA==",
+        "browserify": {
+          "version": "17.0.0",
+          "resolved": "https://registry.npmjs.org/browserify/-/browserify-17.0.0.tgz",
+          "integrity": "sha512-SaHqzhku9v/j6XsQMRxPyBrSP3gnwmE27gLJYZgMT2GeK3J0+0toN+MnuNYDfHwVGQfLiMZ7KSNSIXHemy905w==",
           "dev": true,
           "requires": {
           "dev": true,
           "requires": {
-            "is-glob": "^3.1.0",
-            "path-dirname": "^1.0.0"
+            "JSONStream": "^1.0.3",
+            "assert": "^1.4.0",
+            "browser-pack": "^6.0.1",
+            "browser-resolve": "^2.0.0",
+            "browserify-zlib": "~0.2.0",
+            "buffer": "~5.2.1",
+            "cached-path-relative": "^1.0.0",
+            "concat-stream": "^1.6.0",
+            "console-browserify": "^1.1.0",
+            "constants-browserify": "~1.0.0",
+            "crypto-browserify": "^3.0.0",
+            "defined": "^1.0.0",
+            "deps-sort": "^2.0.1",
+            "domain-browser": "^1.2.0",
+            "duplexer2": "~0.1.2",
+            "events": "^3.0.0",
+            "glob": "^7.1.0",
+            "has": "^1.0.0",
+            "htmlescape": "^1.1.0",
+            "https-browserify": "^1.0.0",
+            "inherits": "~2.0.1",
+            "insert-module-globals": "^7.2.1",
+            "labeled-stream-splicer": "^2.0.0",
+            "mkdirp-classic": "^0.5.2",
+            "module-deps": "^6.2.3",
+            "os-browserify": "~0.3.0",
+            "parents": "^1.0.1",
+            "path-browserify": "^1.0.0",
+            "process": "~0.11.0",
+            "punycode": "^1.3.2",
+            "querystring-es3": "~0.2.0",
+            "read-only-stream": "^2.0.0",
+            "readable-stream": "^2.0.2",
+            "resolve": "^1.1.4",
+            "shasum-object": "^1.0.0",
+            "shell-quote": "^1.6.1",
+            "stream-browserify": "^3.0.0",
+            "stream-http": "^3.0.0",
+            "string_decoder": "^1.1.1",
+            "subarg": "^1.0.0",
+            "syntax-error": "^1.1.1",
+            "through2": "^2.0.0",
+            "timers-browserify": "^1.0.1",
+            "tty-browserify": "0.0.1",
+            "url": "~0.11.0",
+            "util": "~0.12.0",
+            "vm-browserify": "^1.0.0",
+            "xtend": "^4.0.0"
           },
           "dependencies": {
           },
           "dependencies": {
-            "is-glob": {
-              "version": "3.1.0",
-              "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz",
-              "integrity": "sha512-UFpDDrPgM6qpnFNI+rh/p3bUaq9hKLZN8bMUWzxmcnZVS3omf4IPK+BrewlnWjO1WmUsMYuSjKh4UJuV4+Lqmw==",
+            "through2": {
+              "version": "2.0.5",
+              "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz",
+              "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==",
               "dev": true,
               "requires": {
               "dev": true,
               "requires": {
-                "is-extglob": "^2.1.0"
+                "readable-stream": "~2.3.6",
+                "xtend": "~4.0.1"
               }
             }
           }
         },
               }
             }
           }
         },
-        "is-binary-path": {
-          "version": "1.0.1",
-          "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-1.0.1.tgz",
-          "integrity": "sha512-9fRVlXc0uCxEDj1nQzaWONSpbTfx0FmJfzHF7pwlI8DkWGoHBBea4Pg5Ky0ojwwxQmnSifgbKkI06Qv0Ljgj+Q==",
+        "buffer": {
+          "version": "5.2.1",
+          "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.2.1.tgz",
+          "integrity": "sha512-c+Ko0loDaFfuPWiL02ls9Xd3GO3cPVmUobQ6t3rXNUk304u6hGq+8N/kFi+QEIKhzK3uwolVhLzszmfLmMLnqg==",
           "dev": true,
           "requires": {
           "dev": true,
           "requires": {
-            "binary-extensions": "^1.0.0"
+            "base64-js": "^1.0.2",
+            "ieee754": "^1.1.4"
           }
         },
           }
         },
-        "is-fullwidth-code-point": {
-          "version": "2.0.0",
-          "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz",
-          "integrity": "sha512-VHskAKYM8RfSFXwee5t5cbN5PZeq1Wrh6qd5bkyiXIf6UQcN6w/A0eXM9r6t8d+GYOh+o6ZhiEnb88LN/Y8m2w==",
-          "dev": true
-        },
-        "is-number": {
+        "stream-browserify": {
           "version": "3.0.0",
           "version": "3.0.0",
-          "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz",
-          "integrity": "sha512-4cboCqIpliH+mAvFNegjZQ4kgKc3ZUhQVr3HvWbSh5q3WH2v82ct+T2Y1hdU5Gdtorx/cLifQjqCbL7bpznLTg==",
+          "resolved": "https://registry.npmjs.org/stream-browserify/-/stream-browserify-3.0.0.tgz",
+          "integrity": "sha512-H73RAHsVBapbim0tU2JwwOiXUj+fikfiaoYAKHF3VJfA0pe2BCzkhAHBlLG6REzE+2WNZcxOXjK7lkso+9euLA==",
           "dev": true,
           "requires": {
           "dev": true,
           "requires": {
-            "kind-of": "^3.0.2"
+            "inherits": "~2.0.4",
+            "readable-stream": "^3.5.0"
           },
           "dependencies": {
           },
           "dependencies": {
-            "kind-of": {
-              "version": "3.2.2",
-              "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
-              "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==",
+            "readable-stream": {
+              "version": "3.6.1",
+              "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.1.tgz",
+              "integrity": "sha512-+rQmrWMYGA90yenhTYsLWAsLsqVC8osOw6PKE1HDYiO0gdPeKe/xDHNzIAIn4C91YQ6oenEhfYqqc1883qHbjQ==",
               "dev": true,
               "requires": {
               "dev": true,
               "requires": {
-                "is-buffer": "^1.1.5"
+                "inherits": "^2.0.3",
+                "string_decoder": "^1.1.1",
+                "util-deprecate": "^1.0.1"
               }
             }
           }
         },
               }
             }
           }
         },
-        "json-schema-traverse": {
-          "version": "0.4.1",
-          "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz",
-          "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==",
-          "dev": true
-        },
-        "locate-path": {
-          "version": "3.0.0",
-          "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz",
-          "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==",
-          "dev": true,
-          "requires": {
-            "p-locate": "^3.0.0",
-            "path-exists": "^3.0.0"
-          }
-        },
-        "micromatch": {
-          "version": "3.1.10",
-          "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz",
-          "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==",
-          "dev": true,
-          "requires": {
-            "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"
-          }
-        },
-        "mime": {
-          "version": "2.6.0",
-          "resolved": "https://registry.npmjs.org/mime/-/mime-2.6.0.tgz",
-          "integrity": "sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg==",
-          "dev": true
-        },
-        "mkdirp": {
-          "version": "0.5.6",
-          "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz",
-          "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==",
-          "dev": true,
-          "requires": {
-            "minimist": "^1.2.6"
-          }
-        },
-        "p-locate": {
-          "version": "3.0.0",
-          "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz",
-          "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==",
-          "dev": true,
-          "requires": {
-            "p-limit": "^2.0.0"
-          }
-        },
-        "path-exists": {
-          "version": "3.0.0",
-          "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz",
-          "integrity": "sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==",
-          "dev": true
-        },
-        "readable-stream": {
-          "version": "2.3.7",
-          "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz",
-          "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==",
-          "dev": true,
-          "requires": {
-            "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"
-          }
-        },
-        "readdirp": {
-          "version": "2.2.1",
-          "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.2.1.tgz",
-          "integrity": "sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ==",
-          "dev": true,
-          "requires": {
-            "graceful-fs": "^4.1.11",
-            "micromatch": "^3.1.10",
-            "readable-stream": "^2.0.2"
-          }
-        },
-        "schema-utils": {
-          "version": "1.0.0",
-          "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz",
-          "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==",
-          "dev": true,
-          "requires": {
-            "ajv": "^6.1.0",
-            "ajv-errors": "^1.0.0",
-            "ajv-keywords": "^3.1.0"
-          }
-        },
-        "semver": {
-          "version": "6.3.0",
-          "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
-          "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==",
-          "dev": true
-        },
-        "string-width": {
-          "version": "3.1.0",
-          "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz",
-          "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==",
+        "through2": {
+          "version": "4.0.2",
+          "resolved": "https://registry.npmjs.org/through2/-/through2-4.0.2.tgz",
+          "integrity": "sha512-iOqSav00cVxEEICeD7TjLB1sueEL+81Wpzp2bY17uZjZN0pWZPuo4suZ/61VujxmqSGFfgOcNuTZ85QJwNZQpw==",
           "dev": true,
           "requires": {
           "dev": true,
           "requires": {
-            "emoji-regex": "^7.0.1",
-            "is-fullwidth-code-point": "^2.0.0",
-            "strip-ansi": "^5.1.0"
+            "readable-stream": "3"
           },
           "dependencies": {
           },
           "dependencies": {
-            "ansi-regex": {
-              "version": "4.1.1",
-              "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.1.tgz",
-              "integrity": "sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==",
-              "dev": true
-            },
-            "strip-ansi": {
-              "version": "5.2.0",
-              "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz",
-              "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==",
+            "readable-stream": {
+              "version": "3.6.1",
+              "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.1.tgz",
+              "integrity": "sha512-+rQmrWMYGA90yenhTYsLWAsLsqVC8osOw6PKE1HDYiO0gdPeKe/xDHNzIAIn4C91YQ6oenEhfYqqc1883qHbjQ==",
               "dev": true,
               "requires": {
               "dev": true,
               "requires": {
-                "ansi-regex": "^4.1.0"
+                "inherits": "^2.0.3",
+                "string_decoder": "^1.1.1",
+                "util-deprecate": "^1.0.1"
               }
             }
           }
         },
               }
             }
           }
         },
-        "string_decoder": {
-          "version": "1.1.1",
-          "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz",
-          "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
+        "util": {
+          "version": "0.12.5",
+          "resolved": "https://registry.npmjs.org/util/-/util-0.12.5.tgz",
+          "integrity": "sha512-kZf/K6hEIrWHI6XqOFUiiMa+79wE/D8Q+NCNAWclkyg3b4d2k7s0QGepNjiABc+aR3N1PAyHL7p6UcLY6LmrnA==",
           "dev": true,
           "requires": {
           "dev": true,
           "requires": {
-            "safe-buffer": "~5.1.0"
+            "inherits": "^2.0.3",
+            "is-arguments": "^1.0.4",
+            "is-generator-function": "^1.0.7",
+            "is-typed-array": "^1.1.3",
+            "which-typed-array": "^1.1.2"
           }
           }
-        },
-        "strip-ansi": {
-          "version": "3.0.1",
-          "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz",
-          "integrity": "sha512-VhumSSbBqDTP8p2ZLKj40UjBCV4+v8bUSEpUb4KjRgWk9pbqGF4REFj6KEagidb2f/M6AzC0EmFyDNGaw9OCzg==",
+        }
+      }
+    },
+    "watchpack": {
+      "version": "2.4.0",
+      "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.0.tgz",
+      "integrity": "sha512-Lcvm7MGST/4fup+ifyKi2hjyIAwcdI4HRgtvTpIUxBRhB+RFtUh8XtDOxUfctVCnhVi+QQj49i91OyvzkJl6cg==",
+      "dev": true,
+      "requires": {
+        "glob-to-regexp": "^0.4.1",
+        "graceful-fs": "^4.1.2"
+      }
+    },
+    "wbuf": {
+      "version": "1.7.3",
+      "resolved": "https://registry.npmjs.org/wbuf/-/wbuf-1.7.3.tgz",
+      "integrity": "sha512-O84QOnr0icsbFGLS0O3bI5FswxzRr8/gHwWkDlQFskhSPryQXvrTMxjxGP4+iWYoauLoBvfDpkrOauZ+0iZpDA==",
+      "dev": true,
+      "requires": {
+        "minimalistic-assert": "^1.0.0"
+      }
+    },
+    "wcwidth": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/wcwidth/-/wcwidth-1.0.1.tgz",
+      "integrity": "sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==",
+      "dev": true,
+      "requires": {
+        "defaults": "^1.0.3"
+      }
+    },
+    "web-streams-polyfill": {
+      "version": "4.0.0-beta.3",
+      "resolved": "https://registry.npmjs.org/web-streams-polyfill/-/web-streams-polyfill-4.0.0-beta.3.tgz",
+      "integrity": "sha512-QW95TCTaHmsYfHDybGMwO5IJIM93I/6vTRk+daHTWFPhwh+C8Cg7j7XyKrwrj8Ib6vYXe0ocYNrmzY4xAAN6ug=="
+    },
+    "web-tree-sitter": {
+      "version": "0.20.7",
+      "resolved": "https://registry.npmjs.org/web-tree-sitter/-/web-tree-sitter-0.20.7.tgz",
+      "integrity": "sha512-flC9JJmTII9uAeeYpWF8hxDJ7bfY+leldQryetll8Nv4WgI+MXc6h7TiyAZASWl9uC9TvmfdgOjZn1DAQecb3A==",
+      "optional": true
+    },
+    "webidl-conversions": {
+      "version": "3.0.1",
+      "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz",
+      "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ=="
+    },
+    "webpack": {
+      "version": "5.70.0",
+      "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.70.0.tgz",
+      "integrity": "sha512-ZMWWy8CeuTTjCxbeaQI21xSswseF2oNOwc70QSKNePvmxE7XW36i7vpBMYZFAUHPwQiEbNGCEYIOOlyRbdGmxw==",
+      "dev": true,
+      "requires": {
+        "@types/eslint-scope": "^3.7.3",
+        "@types/estree": "^0.0.51",
+        "@webassemblyjs/ast": "1.11.1",
+        "@webassemblyjs/wasm-edit": "1.11.1",
+        "@webassemblyjs/wasm-parser": "1.11.1",
+        "acorn": "^8.4.1",
+        "acorn-import-assertions": "^1.7.6",
+        "browserslist": "^4.14.5",
+        "chrome-trace-event": "^1.0.2",
+        "enhanced-resolve": "^5.9.2",
+        "es-module-lexer": "^0.9.0",
+        "eslint-scope": "5.1.1",
+        "events": "^3.2.0",
+        "glob-to-regexp": "^0.4.1",
+        "graceful-fs": "^4.2.9",
+        "json-parse-better-errors": "^1.0.2",
+        "loader-runner": "^4.2.0",
+        "mime-types": "^2.1.27",
+        "neo-async": "^2.6.2",
+        "schema-utils": "^3.1.0",
+        "tapable": "^2.1.1",
+        "terser-webpack-plugin": "^5.1.3",
+        "watchpack": "^2.3.1",
+        "webpack-sources": "^3.2.3"
+      },
+      "dependencies": {
+        "ajv": {
+          "version": "6.12.6",
+          "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz",
+          "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==",
           "dev": true,
           "requires": {
           "dev": true,
           "requires": {
-            "ansi-regex": "^2.0.0"
+            "fast-deep-equal": "^3.1.1",
+            "fast-json-stable-stringify": "^2.0.0",
+            "json-schema-traverse": "^0.4.1",
+            "uri-js": "^4.2.2"
           }
         },
           }
         },
-        "supports-color": {
-          "version": "6.1.0",
-          "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz",
-          "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==",
+        "json-schema-traverse": {
+          "version": "0.4.1",
+          "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz",
+          "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==",
+          "dev": true
+        },
+        "schema-utils": {
+          "version": "3.1.1",
+          "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz",
+          "integrity": "sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==",
           "dev": true,
           "requires": {
           "dev": true,
           "requires": {
-            "has-flag": "^3.0.0"
+            "@types/json-schema": "^7.0.8",
+            "ajv": "^6.12.5",
+            "ajv-keywords": "^3.5.2"
           }
           }
-        },
-        "to-regex-range": {
-          "version": "2.1.1",
-          "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz",
-          "integrity": "sha512-ZZWNfCjUokXXDGXFpZehJIkZqq91BcULFq/Pi7M5i4JnxXdhMKAK682z8bCW3o8Hj1wuuzoKcW3DfVzaP6VuNg==",
+        }
+      }
+    },
+    "webpack-dev-middleware": {
+      "version": "5.3.0",
+      "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-5.3.0.tgz",
+      "integrity": "sha512-MouJz+rXAm9B1OTOYaJnn6rtD/lWZPy2ufQCH3BPs8Rloh/Du6Jze4p7AeLYHkVi0giJnYLaSGDC7S+GM9arhg==",
+      "dev": true,
+      "requires": {
+        "colorette": "^2.0.10",
+        "memfs": "^3.2.2",
+        "mime-types": "^2.1.31",
+        "range-parser": "^1.2.1",
+        "schema-utils": "^4.0.0"
+      },
+      "dependencies": {
+        "ajv-keywords": {
+          "version": "5.1.0",
+          "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz",
+          "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==",
           "dev": true,
           "requires": {
           "dev": true,
           "requires": {
-            "is-number": "^3.0.0",
-            "repeat-string": "^1.6.1"
+            "fast-deep-equal": "^3.1.3"
           }
         },
           }
         },
-        "webpack-dev-middleware": {
-          "version": "3.7.3",
-          "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-3.7.3.tgz",
-          "integrity": "sha512-djelc/zGiz9nZj/U7PTBi2ViorGJXEWo/3ltkPbDyxCXhhEXkW0ce99falaok4TPj+AsxLiXJR0EBOb0zh9fKQ==",
+        "schema-utils": {
+          "version": "4.0.0",
+          "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.0.0.tgz",
+          "integrity": "sha512-1edyXKgh6XnJsJSQ8mKWXnN/BVaIbFMLpouRUrXgVq7WYne5kw3MW7UPhO44uRXQSIpTSXoJbmrR2X0w9kUTyg==",
           "dev": true,
           "requires": {
           "dev": true,
           "requires": {
-            "memory-fs": "^0.4.1",
-            "mime": "^2.4.4",
-            "mkdirp": "^0.5.1",
-            "range-parser": "^1.2.1",
-            "webpack-log": "^2.0.0"
+            "@types/json-schema": "^7.0.9",
+            "ajv": "^8.8.0",
+            "ajv-formats": "^2.1.1",
+            "ajv-keywords": "^5.0.0"
           }
           }
-        },
-        "wrap-ansi": {
+        }
+      }
+    },
+    "webpack-dev-server": {
+      "version": "4.7.3",
+      "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-4.7.3.tgz",
+      "integrity": "sha512-mlxq2AsIw2ag016nixkzUkdyOE8ST2GTy34uKSABp1c4nhjZvH90D5ZRR+UOLSsG4Z3TFahAi72a3ymRtfRm+Q==",
+      "dev": true,
+      "requires": {
+        "@types/bonjour": "^3.5.9",
+        "@types/connect-history-api-fallback": "^1.3.5",
+        "@types/serve-index": "^1.9.1",
+        "@types/sockjs": "^0.3.33",
+        "@types/ws": "^8.2.2",
+        "ansi-html-community": "^0.0.8",
+        "bonjour": "^3.5.0",
+        "chokidar": "^3.5.2",
+        "colorette": "^2.0.10",
+        "compression": "^1.7.4",
+        "connect-history-api-fallback": "^1.6.0",
+        "default-gateway": "^6.0.3",
+        "del": "^6.0.0",
+        "express": "^4.17.1",
+        "graceful-fs": "^4.2.6",
+        "html-entities": "^2.3.2",
+        "http-proxy-middleware": "^2.0.0",
+        "ipaddr.js": "^2.0.1",
+        "open": "^8.0.9",
+        "p-retry": "^4.5.0",
+        "portfinder": "^1.0.28",
+        "schema-utils": "^4.0.0",
+        "selfsigned": "^2.0.0",
+        "serve-index": "^1.9.1",
+        "sockjs": "^0.3.21",
+        "spdy": "^4.0.2",
+        "strip-ansi": "^7.0.0",
+        "webpack-dev-middleware": "^5.3.0",
+        "ws": "^8.1.0"
+      },
+      "dependencies": {
+        "ajv-keywords": {
           "version": "5.1.0",
           "version": "5.1.0",
-          "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-5.1.0.tgz",
-          "integrity": "sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==",
+          "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz",
+          "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==",
           "dev": true,
           "requires": {
           "dev": true,
           "requires": {
-            "ansi-styles": "^3.2.0",
-            "string-width": "^3.0.0",
-            "strip-ansi": "^5.0.0"
-          },
-          "dependencies": {
-            "ansi-regex": {
-              "version": "4.1.1",
-              "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.1.tgz",
-              "integrity": "sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==",
-              "dev": true
-            },
-            "strip-ansi": {
-              "version": "5.2.0",
-              "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz",
-              "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==",
-              "dev": true,
-              "requires": {
-                "ansi-regex": "^4.1.0"
-              }
-            }
+            "fast-deep-equal": "^3.1.3"
           }
         },
           }
         },
-        "y18n": {
-          "version": "4.0.3",
-          "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz",
-          "integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==",
+        "ansi-regex": {
+          "version": "6.0.1",
+          "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz",
+          "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==",
           "dev": true
         },
           "dev": true
         },
-        "yargs": {
-          "version": "13.3.2",
-          "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.3.2.tgz",
-          "integrity": "sha512-AX3Zw5iPruN5ie6xGRIDgqkT+ZhnRlZMLMHAs8tg7nRruy2Nb+i5o9bwghAogtM08q1dpr2LVoS8KSTMYpWXUw==",
+        "schema-utils": {
+          "version": "4.0.0",
+          "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.0.0.tgz",
+          "integrity": "sha512-1edyXKgh6XnJsJSQ8mKWXnN/BVaIbFMLpouRUrXgVq7WYne5kw3MW7UPhO44uRXQSIpTSXoJbmrR2X0w9kUTyg==",
           "dev": true,
           "requires": {
           "dev": true,
           "requires": {
-            "cliui": "^5.0.0",
-            "find-up": "^3.0.0",
-            "get-caller-file": "^2.0.1",
-            "require-directory": "^2.1.1",
-            "require-main-filename": "^2.0.0",
-            "set-blocking": "^2.0.0",
-            "string-width": "^3.0.0",
-            "which-module": "^2.0.0",
-            "y18n": "^4.0.0",
-            "yargs-parser": "^13.1.2"
+            "@types/json-schema": "^7.0.9",
+            "ajv": "^8.8.0",
+            "ajv-formats": "^2.1.1",
+            "ajv-keywords": "^5.0.0"
           }
         },
           }
         },
-        "yargs-parser": {
-          "version": "13.1.2",
-          "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.2.tgz",
-          "integrity": "sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg==",
+        "strip-ansi": {
+          "version": "7.0.1",
+          "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.0.1.tgz",
+          "integrity": "sha512-cXNxvT8dFNRVfhVME3JAe98mkXDYN2O1l7jmcwMnOslDeESg1rF/OZMtK0nRAhiari1unG5cD4jG3rapUAkLbw==",
           "dev": true,
           "requires": {
           "dev": true,
           "requires": {
-            "camelcase": "^5.0.0",
-            "decamelize": "^1.2.0"
+            "ansi-regex": "^6.0.1"
           }
         }
       }
     },
           }
         }
       }
     },
-    "webpack-log": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/webpack-log/-/webpack-log-2.0.0.tgz",
-      "integrity": "sha512-cX8G2vR/85UYG59FgkoMamwHUIkSSlV3bBMRsbxVXVUk2j6NleCKjQ/WE9eYg9WY4w25O9w8wKP4rzNZFmUcUg==",
-      "dev": true,
-      "requires": {
-        "ansi-colors": "^3.0.0",
-        "uuid": "^3.3.2"
-      },
-      "dependencies": {
-        "ansi-colors": {
-          "version": "3.2.4",
-          "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-3.2.4.tgz",
-          "integrity": "sha512-hHUXGagefjN2iRrID63xckIvotOXOojhQKWIPUZ4mNUZ9nLZW+7FMNoE1lOkEhNWYsx/7ysGIuJYCiMAA9FnrA==",
-          "dev": true
-        },
-        "uuid": {
-          "version": "3.4.0",
-          "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz",
-          "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==",
-          "dev": true
-        }
-      }
-    },
     "webpack-merge": {
       "version": "5.8.0",
       "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-5.8.0.tgz",
     "webpack-merge": {
       "version": "5.8.0",
       "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-5.8.0.tgz",
       }
     },
     "webpack-sources": {
       }
     },
     "webpack-sources": {
-      "version": "1.4.3",
-      "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-1.4.3.tgz",
-      "integrity": "sha512-lgTS3Xhv1lCOKo7SA5TjKXMjpSM4sBjNV5+q2bqesbSPs5FjGmU6jjtBSkX9b4qW87vDIsCIlUPOEhbZrMdjeQ==",
-      "dev": true,
-      "requires": {
-        "source-list-map": "^2.0.0",
-        "source-map": "~0.6.1"
-      },
-      "dependencies": {
-        "source-map": {
-          "version": "0.6.1",
-          "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
-          "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
-          "dev": true
-        }
-      }
+      "version": "3.2.3",
+      "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.2.3.tgz",
+      "integrity": "sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==",
+      "dev": true
     },
     "webpack-subresource-integrity": {
     },
     "webpack-subresource-integrity": {
-      "version": "1.5.2",
-      "resolved": "https://registry.npmjs.org/webpack-subresource-integrity/-/webpack-subresource-integrity-1.5.2.tgz",
-      "integrity": "sha512-GBWYBoyalbo5YClwWop9qe6Zclp8CIXYGIz12OPclJhIrSplDxs1Ls1JDMH8xBPPrg1T6ISaTW9Y6zOrwEiAzw==",
+      "version": "5.1.0",
+      "resolved": "https://registry.npmjs.org/webpack-subresource-integrity/-/webpack-subresource-integrity-5.1.0.tgz",
+      "integrity": "sha512-sacXoX+xd8r4WKsy9MvH/q/vBtEHr86cpImXwyg74pFIpERKt6FmB8cXpeuh0ZLgclOlHI4Wcll7+R5L02xk9Q==",
       "dev": true,
       "requires": {
       "dev": true,
       "requires": {
-        "webpack-sources": "^1.3.0"
+        "typed-assert": "^1.0.8"
       }
     },
     "websocket-driver": {
       }
     },
     "websocket-driver": {
       }
     },
     "which": {
       }
     },
     "which": {
-      "version": "1.3.1",
-      "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz",
-      "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==",
+      "version": "2.0.2",
+      "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz",
+      "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==",
       "dev": true,
       "requires": {
         "isexe": "^2.0.0"
       "dev": true,
       "requires": {
         "isexe": "^2.0.0"
       "dev": true
     },
     "which-typed-array": {
       "dev": true
     },
     "which-typed-array": {
-      "version": "1.1.8",
-      "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.8.tgz",
-      "integrity": "sha512-Jn4e5PItbcAHyLoRDwvPj1ypu27DJbtdYXUa5zsinrUx77Uvfb0cXwwnGMTn7cjUfhhqgVQnVJCwF+7cgU7tpw==",
+      "version": "1.1.9",
+      "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.9.tgz",
+      "integrity": "sha512-w9c4xkx6mPidwp7180ckYWfMmvxpjlZuIudNtDf4N/tTAUB8VJbX25qZoAsrtGuYNnGw3pa0AXgbGKRB8/EceA==",
       "dev": true,
       "requires": {
         "available-typed-arrays": "^1.0.5",
         "call-bind": "^1.0.2",
       "dev": true,
       "requires": {
         "available-typed-arrays": "^1.0.5",
         "call-bind": "^1.0.2",
-        "es-abstract": "^1.20.0",
         "for-each": "^0.3.3",
         "for-each": "^0.3.3",
+        "gopd": "^1.0.1",
         "has-tostringtag": "^1.0.0",
         "has-tostringtag": "^1.0.0",
-        "is-typed-array": "^1.1.9"
+        "is-typed-array": "^1.1.10"
       }
     },
     "wide-align": {
       "version": "1.1.5",
       "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.5.tgz",
       "integrity": "sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg==",
       }
     },
     "wide-align": {
       "version": "1.1.5",
       "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.5.tgz",
       "integrity": "sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg==",
-      "dev": true,
       "requires": {
         "string-width": "^1.0.2 || 2 || 3 || 4"
       }
       "requires": {
         "string-width": "^1.0.2 || 2 || 3 || 4"
       }
         "execa": "^4.0.2"
       },
       "dependencies": {
         "execa": "^4.0.2"
       },
       "dependencies": {
-        "cross-spawn": {
-          "version": "7.0.3",
-          "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz",
-          "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==",
-          "dev": true,
-          "requires": {
-            "path-key": "^3.1.0",
-            "shebang-command": "^2.0.0",
-            "which": "^2.0.1"
-          }
-        },
         "execa": {
           "version": "4.1.0",
           "resolved": "https://registry.npmjs.org/execa/-/execa-4.1.0.tgz",
         "execa": {
           "version": "4.1.0",
           "resolved": "https://registry.npmjs.org/execa/-/execa-4.1.0.tgz",
             "pump": "^3.0.0"
           }
         },
             "pump": "^3.0.0"
           }
         },
-        "is-stream": {
-          "version": "2.0.1",
-          "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz",
-          "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==",
-          "dev": true
-        },
-        "npm-run-path": {
-          "version": "4.0.1",
-          "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz",
-          "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==",
-          "dev": true,
-          "requires": {
-            "path-key": "^3.0.0"
-          }
-        },
-        "path-key": {
-          "version": "3.1.1",
-          "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz",
-          "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==",
-          "dev": true
-        },
-        "shebang-command": {
-          "version": "2.0.0",
-          "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz",
-          "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==",
-          "dev": true,
-          "requires": {
-            "shebang-regex": "^3.0.0"
-          }
-        },
-        "shebang-regex": {
-          "version": "3.0.0",
-          "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz",
-          "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==",
+        "human-signals": {
+          "version": "1.1.1",
+          "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-1.1.1.tgz",
+          "integrity": "sha512-SEQu7vl8KjNL2eoGBLF3+wAjpsNfA9XMlXAYj/3EdaNfAlxKthD1xjEQfGOUhllCGGJVNY34bRr6lPINhNjyZw==",
           "dev": true
           "dev": true
-        },
-        "which": {
-          "version": "2.0.2",
-          "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz",
-          "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==",
-          "dev": true,
-          "requires": {
-            "isexe": "^2.0.0"
-          }
         }
       }
     },
         }
       }
     },
       "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ=="
     },
     "write-file-atomic": {
       "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ=="
     },
     "write-file-atomic": {
-      "version": "3.0.3",
-      "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz",
-      "integrity": "sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==",
+      "version": "4.0.2",
+      "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-4.0.2.tgz",
+      "integrity": "sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg==",
       "dev": true,
       "requires": {
         "imurmurhash": "^0.1.4",
       "dev": true,
       "requires": {
         "imurmurhash": "^0.1.4",
-        "is-typedarray": "^1.0.0",
-        "signal-exit": "^3.0.2",
-        "typedarray-to-buffer": "^3.1.5"
+        "signal-exit": "^3.0.7"
       }
     },
     "ws": {
       }
     },
     "ws": {
-      "version": "6.2.2",
-      "resolved": "https://registry.npmjs.org/ws/-/ws-6.2.2.tgz",
-      "integrity": "sha512-zmhltoSR8u1cnDsD43TX59mzoMZsLKqUweyYBAIvTngR3shc0W6aOZylZmq/7hqyVxPdi+5Ud2QInblgyE72fw==",
-      "dev": true,
-      "requires": {
-        "async-limiter": "~1.0.0"
-      }
+      "version": "8.12.1",
+      "resolved": "https://registry.npmjs.org/ws/-/ws-8.12.1.tgz",
+      "integrity": "sha512-1qo+M9Ba+xNhPB+YTWUlK6M17brTut5EXbcBaMRN5pH5dFrXz7lzz1ChFSUq3bOUl8yEvSenhHmYUNJxFzdJew==",
+      "dev": true
     },
     "xliff": {
       "version": "4.4.0",
     },
     "xliff": {
       "version": "4.4.0",
       "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA=="
     },
     "yallist": {
       "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA=="
     },
     "yallist": {
-      "version": "4.0.0",
-      "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
-      "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==",
-      "dev": true
+      "version": "3.1.1",
+      "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz",
+      "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g=="
     },
     "yaml": {
       "version": "1.10.2",
     },
     "yaml": {
       "version": "1.10.2",
       "dev": true
     },
     "yargs": {
       "dev": true
     },
     "yargs": {
-      "version": "17.5.1",
-      "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.5.1.tgz",
-      "integrity": "sha512-t6YAJcxDkNX7NFYiVtKvWUz8l+PaKTLiL63mJYWR2GnHq2gjEWISzsLp9wg3aY36dY1j+gfIEL3pIF+XlJJfbA==",
+      "version": "17.7.1",
+      "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.1.tgz",
+      "integrity": "sha512-cwiTb08Xuv5fqF4AovYacTFNxk62th7LKJ6BL9IGUpTJrWoU7/7WdQGTP2SjKf1dUNBGzDd28p/Yfs/GI6JrLw==",
       "requires": {
       "requires": {
-        "cliui": "^7.0.2",
+        "cliui": "^8.0.1",
         "escalade": "^3.1.1",
         "get-caller-file": "^2.0.5",
         "require-directory": "^2.1.1",
         "string-width": "^4.2.3",
         "y18n": "^5.0.5",
         "escalade": "^3.1.1",
         "get-caller-file": "^2.0.5",
         "require-directory": "^2.1.1",
         "string-width": "^4.2.3",
         "y18n": "^5.0.5",
-        "yargs-parser": "^21.0.0"
+        "yargs-parser": "^21.1.1"
       }
     },
     "yargs-parser": {
       }
     },
     "yargs-parser": {
           "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==",
           "dev": true
         },
           "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==",
           "dev": true
         },
-        "decamelize": {
-          "version": "4.0.0",
-          "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-4.0.0.tgz",
-          "integrity": "sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ==",
+        "is-plain-obj": {
+          "version": "2.1.0",
+          "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-2.1.0.tgz",
+          "integrity": "sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==",
           "dev": true
         }
       }
           "dev": true
         }
       }
       "integrity": "sha512-jEA1znR7b4C/NnaycInCU6h/d15ZzCd1jmsruqOKnZP6WXQSMH3W2GL+OXbkruslU4h+Tzuos0HdswzRUk/Vgg=="
     },
     "zone.js": {
       "integrity": "sha512-jEA1znR7b4C/NnaycInCU6h/d15ZzCd1jmsruqOKnZP6WXQSMH3W2GL+OXbkruslU4h+Tzuos0HdswzRUk/Vgg=="
     },
     "zone.js": {
-      "version": "0.10.3",
-      "resolved": "https://registry.npmjs.org/zone.js/-/zone.js-0.10.3.tgz",
-      "integrity": "sha512-LXVLVEq0NNOqK/fLJo3d0kfzd4sxwn2/h67/02pjCjfKDxgx1i9QqpvtHD8CrBnSSwMw5+dy11O7FRX5mkO7Cg==",
-      "dev": true
+      "version": "0.11.8",
+      "resolved": "https://registry.npmjs.org/zone.js/-/zone.js-0.11.8.tgz",
+      "integrity": "sha512-82bctBg2hKcEJ21humWIkXRlLBBmrc3nN7DFh5LGGhcyycO2S7FN8NmdvlcKaGFDNVL4/9kFLmwmInTavdJERA==",
+      "requires": {
+        "tslib": "^2.3.0"
+      }
     },
     "zwitch": {
       "version": "1.0.5",
     },
     "zwitch": {
       "version": "1.0.5",
index 722baa8dc58f34cd26702cf1e5a85c22e551be5d..4258edfbebf35cb36e98a36a17afddb0621d7f1d 100644 (file)
@@ -24,7 +24,7 @@
     "e2e": "start-test 4200 'cypress open'",
     "pree2e:ci": "npm run pree2e",
     "e2e:ci": "start-test 4200 'cypress run -b chrome --headless'",
     "e2e": "start-test 4200 'cypress open'",
     "pree2e:ci": "npm run pree2e",
     "e2e:ci": "start-test 4200 'cypress run -b chrome --headless'",
-    "lint:tslint": "ng lint",
+    "lint:eslint": "ng lint",
     "lint:gherkin": "gherkin-lint -c .gherkin-lintrc cypress/integration",
     "lint:prettier": "prettier --list-different \"{src,cypress}/**/*.{ts,scss}\"",
     "lint:html": "htmllint src/app/**/*.html && html-linter --config html-linter.config.json",
     "lint:gherkin": "gherkin-lint -c .gherkin-lintrc cypress/integration",
     "lint:prettier": "prettier --list-different \"{src,cypress}/**/*.{ts,scss}\"",
     "lint:html": "htmllint src/app/**/*.html && html-linter --config html-linter.config.json",
@@ -33,7 +33,7 @@
     "lint:scss": "stylelint '**/*.scss'",
     "lint": "run-p -csl --aggregate-output lint:*",
     "fix:prettier": "prettier --write \"{src,cypress}/**/*.{ts,scss}\"",
     "lint:scss": "stylelint '**/*.scss'",
     "lint": "run-p -csl --aggregate-output lint:*",
     "fix:prettier": "prettier --write \"{src,cypress}/**/*.{ts,scss}\"",
-    "fix:tslint": "npm run lint:tslint -- --fix",
+    "fix:eslint": "npm run lint:eslint -- --fix",
     "fix:scss": "stylelint '**/*.scss' --fix",
     "fixmod": "pretty-quick --pattern \"{src,cypress}/**/*.{ts,scss}\" --branch HEAD",
     "fix": "run-p -csl --aggregate-output fix:*",
     "fix:scss": "stylelint '**/*.scss' --fix",
     "fixmod": "pretty-quick --pattern \"{src,cypress}/**/*.{ts,scss}\" --branch HEAD",
     "fix": "run-p -csl --aggregate-output fix:*",
     "postinstall": "ngcc --properties es2015 browser module main --async false --first-only --tsconfig 'tsconfig.app.json'"
   },
   "private": true,
     "postinstall": "ngcc --properties es2015 browser module main --async false --first-only --tsconfig 'tsconfig.app.json'"
   },
   "private": true,
-  "jest": {
-    "moduleNameMapper": {
-      "\\.scss$": "identity-obj-proxy",
-      "~/(.*)$": "<rootDir>/src/$1"
-    },
-    "preset": "jest-preset-angular",
-    "setupFilesAfterEnv": [
-      "<rootDir>/src/setupJest.ts"
-    ],
-    "transformIgnorePatterns": [
-      "node_modules/(?!@ngrx|@progress|simplebar|lodash-es|react-syntax-highlighter|swagger-client)"
-    ],
-    "transform": {
-      "^.+\\.(ts|html)$": "ts-jest",
-      "^.+\\.(js)$": "babel-jest"
-    },
-    "setupFiles": [
-      "jest-canvas-mock"
-    ],
-    "coverageReporters": [
-      "cobertura",
-      "html"
-    ],
-    "modulePathIgnorePatterns": [
-      "<rootDir>/coverage/"
-    ],
-    "testMatch": [
-      "**/*.spec.ts"
-    ],
-    "testURL": "http://localhost/"
-  },
   "dependencies": {
   "dependencies": {
-    "@angular/animations": "12.2.13",
-    "@angular/common": "12.2.13",
-    "@angular/compiler": "12.2.13",
-    "@angular/core": "12.2.13",
-    "@angular/forms": "12.2.13",
-    "@angular/localize": "12.2.13",
-    "@angular/platform-browser": "12.2.13",
-    "@angular/platform-browser-dynamic": "12.2.13",
-    "@angular/router": "12.2.13",
+    "@angular/animations": "13.3.11",
+    "@angular/common": "13.3.11",
+    "@angular/compiler": "13.3.11",
+    "@angular/core": "13.3.11",
+    "@angular/forms": "13.3.11",
+    "@angular/localize": "13.3.11",
+    "@angular/platform-browser": "13.3.11",
+    "@angular/platform-browser-dynamic": "13.3.11",
+    "@angular/router": "13.3.11",
     "@circlon/angular-tree-component": "10.0.0",
     "@circlon/angular-tree-component": "10.0.0",
-    "@ng-bootstrap/ng-bootstrap": "10.0.0",
+    "@ng-bootstrap/ng-bootstrap": "12.1.2",
+    "@popperjs/core": "2.10.2",
     "@swimlane/ngx-datatable": "18.0.0",
     "@types/file-saver": "2.0.1",
     "async-mutex": "0.2.4",
     "@swimlane/ngx-datatable": "18.0.0",
     "@types/file-saver": "2.0.1",
     "async-mutex": "0.2.4",
-    "bootstrap": "4.6.1",
+    "bootstrap": "5.0.0",
     "chart.js": "2.9.4",
     "detect-browser": "5.2.0",
     "file-saver": "2.0.2",
     "chart.js": "2.9.4",
     "detect-browser": "5.2.0",
     "file-saver": "2.0.2",
     "ng-click-outside": "7.0.0",
     "ng2-charts": "2.4.2",
     "ngx-pipe-function": "1.0.0",
     "ng-click-outside": "7.0.0",
     "ng2-charts": "2.4.2",
     "ngx-pipe-function": "1.0.0",
-    "ngx-toastr": "14.1.4",
+    "ngx-toastr": "14.3.0",
     "rxjs": "6.6.3",
     "simplebar-angular": "2.3.6",
     "swagger-ui": "4.12.0",
     "rxjs": "6.6.3",
     "simplebar-angular": "2.3.6",
     "swagger-ui": "4.12.0",
-    "tslib": "2.3.1"
+    "tslib": "2.3.1",
+    "zone.js": "0.11.8"
   },
   "devDependencies": {
   },
   "devDependencies": {
-    "@angular-devkit/build-angular": "12.2.13",
-    "@angular/cli": "12.2.13",
-    "@angular/compiler-cli": "12.2.13",
-    "@angular/language-service": "12.2.13",
+    "@angular-devkit/build-angular": "13.3.9",
+    "@angular-eslint/builder": "13.5.0",
+    "@angular-eslint/eslint-plugin": "13.5.0",
+    "@angular-eslint/eslint-plugin-template": "13.5.0",
+    "@angular-eslint/schematics": "13.5.0",
+    "@angular-eslint/template-parser": "13.5.0",
+    "@angular/cli": "13.3.9",
+    "@angular/compiler-cli": "13.3.11",
+    "@angular/language-service": "13.3.11",
     "@applitools/eyes-cypress": "3.22.5",
     "@applitools/eyes-cypress": "3.22.5",
-    "@compodoc/compodoc": "1.1.15",
+    "@apteco/ngth": "1.5.0",
+    "@compodoc/compodoc": "1.1.18",
     "@cypress/browserify-preprocessor": "3.0.2",
     "@grafana/e2e": "8.4.5",
     "@types/brace-expansion": "1.1.0",
     "@types/cypress-cucumber-preprocessor": "4.0.1",
     "@cypress/browserify-preprocessor": "3.0.2",
     "@grafana/e2e": "8.4.5",
     "@types/brace-expansion": "1.1.0",
     "@types/cypress-cucumber-preprocessor": "4.0.1",
-    "@types/jest": "26.0.14",
+    "@types/jest": "28.1.3",
     "@types/lodash": "4.14.161",
     "@types/node": "12.12.62",
     "@types/lodash": "4.14.161",
     "@types/node": "12.12.62",
-    "@types/simplebar": "5.1.1",
     "@types/swagger-ui": "3.52.0",
     "@types/swagger-ui": "3.52.0",
-    "codelyzer": "6.0.2",
+    "@typescript-eslint/eslint-plugin": "5.27.1",
+    "@typescript-eslint/parser": "5.27.1",
+    "axe-core": "4.4.3",
     "cypress": "9.7.0",
     "cypress": "9.7.0",
+    "cypress-axe": "0.14.0",
     "cypress-cucumber-preprocessor": "4.3.1",
     "cypress-iframe": "1.0.1",
     "cypress-multi-reporters": "1.5.0",
     "cypress-cucumber-preprocessor": "4.3.1",
     "cypress-iframe": "1.0.1",
     "cypress-multi-reporters": "1.5.0",
+    "eslint": "8.17.0",
     "gherkin-lint": "4.2.2",
     "html-linter": "1.1.1",
     "htmllint-cli": "0.0.7",
     "identity-obj-proxy": "3.0.0",
     "isomorphic-form-data": "2.0.0",
     "gherkin-lint": "4.2.2",
     "html-linter": "1.1.1",
     "htmllint-cli": "0.0.7",
     "identity-obj-proxy": "3.0.0",
     "isomorphic-form-data": "2.0.0",
-    "jest": "26.5.2",
-    "jest-canvas-mock": "2.3.0",
-    "jest-preset-angular": "8.3.1",
-    "jest-silent-reporter": "0.2.1",
-    "mocha-junit-reporter": "2.0.2",
-    "ng-bullet": "1.0.3",
-    "ng-mocks": "10.2.0",
+    "jest": "28.1.3",
+    "jest-canvas-mock": "2.4.0",
+    "jest-jasmine2": "28.1.3",
+    "jest-preset-angular": "12.0.0",
+    "jest-silent-reporter": "0.5.0",
+    "mocha-junit-reporter": "2.1.0",
+    "ng-mocks": "14.3.0",
     "npm-run-all": "4.1.5",
     "prettier": "2.1.2",
     "pretty-quick": "3.0.2",
     "npm-run-all": "4.1.5",
     "prettier": "2.1.2",
     "pretty-quick": "3.0.2",
     "stylelint": "13.13.1",
     "stylelint-config-sass-guidelines": "7.1.0",
     "stylelint-declaration-use-variable": "1.7.3",
     "stylelint": "13.13.1",
     "stylelint-config-sass-guidelines": "7.1.0",
     "stylelint-declaration-use-variable": "1.7.3",
+    "table": "6.8.0",
     "transifex-i18ntool": "1.1.0",
     "ts-node": "9.0.0",
     "transifex-i18ntool": "1.1.0",
     "ts-node": "9.0.0",
-    "tslint": "6.1.3",
-    "typescript": "4.3.5"
+    "typescript": "4.6.4"
   },
   "cypress-cucumber-preprocessor": {
     "nonGlobalStepDefinitions": true
   },
   "cypress-cucumber-preprocessor": {
     "nonGlobalStepDefinitions": true
+  },
+  "overrides": {
+    "autoprefixer": "10.4.5"
   }
 }
   }
 }
index 3d328cb6bf324a50ca51209ca9b7c4fc946bc212..ec4d07e235a2f31e9ce53335ea8d7e7de37a8a43 100644 (file)
@@ -1,14 +1,16 @@
-<ul ngbNav
-    #nav="ngbNav"
-    [activeId]="router.url"
-    (navChange)="router.navigate([$event.nextId])"
-    class="nav-tabs">
-  <li ngbNavItem="/block/iscsi/overview">
-    <a ngbNavLink
+<ul class="nav nav-tabs">
+  <li class="nav-item">
+    <a class="nav-link"
+       routerLink="/block/iscsi/overview"
+       routerLinkActive="active"
+       ariaCurrentWhenActive="page"
        i18n>Overview</a>
   </li>
        i18n>Overview</a>
   </li>
-  <li ngbNavItem="/block/iscsi/targets">
-    <a ngbNavLink
+  <li class="nav-item">
+    <a class="nav-link"
+       routerLink="/block/iscsi/targets"
+       routerLinkActive="active"
+       ariaCurrentWhenActive="page"
        i18n>Targets</a>
   </li>
 </ul>
        i18n>Targets</a>
   </li>
 </ul>
index d4d21361bcdd58ed9487759970b73ff70ec02df3..6631339538e01419de73231af15d8a386eb1c18e 100644 (file)
@@ -1,11 +1,8 @@
 import { Component } from '@angular/core';
 import { Component } from '@angular/core';
-import { Router } from '@angular/router';
 
 @Component({
   selector: 'cd-iscsi-tabs',
   templateUrl: './iscsi-tabs.component.html',
   styleUrls: ['./iscsi-tabs.component.scss']
 })
 
 @Component({
   selector: 'cd-iscsi-tabs',
   templateUrl: './iscsi-tabs.component.html',
   styleUrls: ['./iscsi-tabs.component.scss']
 })
-export class IscsiTabsComponent {
-  constructor(public router: Router) {}
-}
+export class IscsiTabsComponent {}
index d84ea787f13963cbb27063630154b33c39175cb3..662ad75407070c714602b2f6ef0c3e1ddc359ed7 100644 (file)
                      type="password"
                      autocomplete="new-password">
 
                      type="password"
                      autocomplete="new-password">
 
-              <span class="input-group-append">
-                <button type="button"
-                        class="btn btn-light"
-                        cdPasswordButton="password">
-                </button>
-                <cd-copy-2-clipboard-button source="password">
-                </cd-copy-2-clipboard-button>
-              </span>
+              <button type="button"
+                      class="btn btn-light"
+                      cdPasswordButton="password">
+              </button>
+              <cd-copy-2-clipboard-button source="password">
+              </cd-copy-2-clipboard-button>
             </div>
             <span class="invalid-feedback"
                   *ngIf="discoveryForm.showError('password', formDir, 'required')"
             </div>
             <span class="invalid-feedback"
                   *ngIf="discoveryForm.showError('password', formDir, 'required')"
                      type="password"
                      autocomplete="new-password">
 
                      type="password"
                      autocomplete="new-password">
 
-              <span class="input-group-append">
-                <button type="button"
-                        class="btn btn-light"
-                        cdPasswordButton="mutual_password">
-                </button>
-                <cd-copy-2-clipboard-button source="mutual_password">
-                </cd-copy-2-clipboard-button>
-              </span>
+              <button type="button"
+                      class="btn btn-light"
+                      cdPasswordButton="mutual_password">
+              </button>
+              <cd-copy-2-clipboard-button source="mutual_password">
+              </cd-copy-2-clipboard-button>
             </div>
             <span class="invalid-feedback"
                   *ngIf="discoveryForm.showError('mutual_password', formDir, 'required')"
             </div>
             <span class="invalid-feedback"
                   *ngIf="discoveryForm.showError('mutual_password', formDir, 'required')"
index 852866a86db2c4fa0961ae7321081e2cfc5fb6e4..5e641926955adc7e6f11fa84b1a8fb783756b908 100644 (file)
                      name="target_iqn"
                      formControlName="target_iqn"
                      cdTrim />
                      name="target_iqn"
                      formControlName="target_iqn"
                      cdTrim />
-              <span class="input-group-append">
-                <button class="btn btn-light"
-                        id="ecp-info-button"
-                        type="button"
-                        (click)="targetSettingsModal()">
-                  <i [ngClass]="[icons.deepCheck]"
-                     aria-hidden="true"></i>
-                </button>
-              </span>
+              <button class="btn btn-light"
+                      id="ecp-info-button"
+                      type="button"
+                      (click)="targetSettingsModal()">
+                <i [ngClass]="[icons.deepCheck]"
+                   aria-hidden="true"></i>
+              </button>
             </div>
 
             <span class="invalid-feedback"
             </div>
 
             <span class="invalid-feedback"
                        type="text"
                        [value]="portal"
                        disabled />
                        type="text"
                        [value]="portal"
                        disabled />
-                <span class="input-group-append">
-                  <button class="btn btn-light"
-                          type="button"
-                          (click)="removePortal(i, portal)">
-                    <i [ngClass]="[icons.destroy]"
-                       aria-hidden="true"></i>
-                  </button>
-                </span>
+                <button class="btn btn-light"
+                        type="button"
+                        (click)="removePortal(i, portal)">
+                  <i [ngClass]="[icons.destroy]"
+                     aria-hidden="true"></i>
+                </button>
               </div>
             </ng-container>
 
               </div>
             </ng-container>
 
@@ -90,7 +86,7 @@
                            [options]="portalsSelections"
                            [messages]="messages.portals"
                            (selection)="onPortalSelection($event)"
                            [options]="portalsSelections"
                            [messages]="messages.portals"
                            (selection)="onPortalSelection($event)"
-                           elemClass="btn btn-light float-right">
+                           elemClass="btn btn-light float-end">
                   <i [ngClass]="[icons.add]"></i>
                   <ng-container i18n>Add portal</ng-container>
                 </cd-select>
                   <i [ngClass]="[icons.add]"></i>
                   <ng-container i18n>Add portal</ng-container>
                 </cd-select>
                        type="text"
                        [value]="image"
                        disabled />
                        type="text"
                        [value]="image"
                        disabled />
-                <span class="input-group-append">
-                  <div class="input-group-text"
-                       *ngIf="api_version >= 1">lun: {{ imagesSettings[image]['lun'] }}</div>
-                  <button class="btn btn-light"
-                          type="button"
-                          (click)="imageSettingsModal(image)">
-                    <i [ngClass]="[icons.deepCheck]"
-                       aria-hidden="true"></i>
-                  </button>
-                  <button class="btn btn-light"
-                          type="button"
-                          (click)="removeImage(i, image)">
-                    <i [ngClass]="[icons.destroy]"
-                       aria-hidden="true"></i>
-                  </button>
-                </span>
+                <div class="input-group-text"
+                     *ngIf="api_version >= 1">lun: {{ imagesSettings[image]['lun'] }}</div>
+                <button class="btn btn-light"
+                        type="button"
+                        (click)="imageSettingsModal(image)">
+                  <i [ngClass]="[icons.deepCheck]"
+                     aria-hidden="true"></i>
+                </button>
+                <button class="btn btn-light"
+                        type="button"
+                        (click)="removeImage(i, image)">
+                  <i [ngClass]="[icons.destroy]"
+                     aria-hidden="true"></i>
+                </button>
 
               </div>
 
 
               </div>
 
                            [options]="imagesSelections"
                            [messages]="messages.images"
                            (selection)="onImageSelection($event)"
                            [options]="imagesSelections"
                            [messages]="messages.images"
                            (selection)="onImageSelection($event)"
-                           elemClass="btn btn-light float-right">
+                           elemClass="btn btn-light float-end">
                   <i [ngClass]="[icons.add]"></i>
                   <ng-container i18n>Add image</ng-container>
                 </cd-select>
                   <i [ngClass]="[icons.add]"></i>
                   <ng-container i18n>Add image</ng-container>
                 </cd-select>
                        id="target_password"
                        name="target_password"
                        formControlName="password" />
                        id="target_password"
                        name="target_password"
                        formControlName="password" />
-                <span class="input-group-append">
-                  <button type="button"
-                          class="btn btn-light"
-                          cdPasswordButton="target_password">
-                  </button>
-                  <cd-copy-2-clipboard-button source="target_password">
-                  </cd-copy-2-clipboard-button>
-                </span>
+                <button type="button"
+                        class="btn btn-light"
+                        cdPasswordButton="target_password">
+                </button>
+                <cd-copy-2-clipboard-button source="target_password">
+                </cd-copy-2-clipboard-button>
               </div>
 
               <span class="invalid-feedback"
               </div>
 
               <span class="invalid-feedback"
                        name="target_mutual_password"
                        formControlName="mutual_password" />
 
                        name="target_mutual_password"
                        formControlName="mutual_password" />
 
-                <span class="input-group-append">
-                  <button type="button"
-                          class="btn btn-light"
-                          cdPasswordButton="target_mutual_password">
-                  </button>
-                  <cd-copy-2-clipboard-button source="target_mutual_password">
-                  </cd-copy-2-clipboard-button>
-                </span>
+                <button type="button"
+                        class="btn btn-light"
+                        cdPasswordButton="target_mutual_password">
+                </button>
+                <cd-copy-2-clipboard-button source="target_mutual_password">
+                </cd-copy-2-clipboard-button>
               </div>
 
               <span class="invalid-feedback"
               </div>
 
               <span class="invalid-feedback"
               <div class="card-header">
                 <ng-container i18n>Initiator</ng-container>: {{ initiator.getValue('client_iqn') }}
                 <button type="button"
               <div class="card-header">
                 <ng-container i18n>Initiator</ng-container>: {{ initiator.getValue('client_iqn') }}
                 <button type="button"
-                        class="close"
+                        class="btn-close float-end"
                         (click)="removeInitiator(ii)">
                         (click)="removeInitiator(ii)">
-                  <i [ngClass]="[icons.destroy]"></i>
                 </button>
               </div>
               <div class="card-body">
                 </button>
               </div>
               <div class="card-body">
                                autocomplete="new-password"
                                type="password">
 
                                autocomplete="new-password"
                                type="password">
 
-                        <span class="input-group-append">
-                          <button type="button"
-                                  class="btn btn-light"
-                                  [cdPasswordButton]="'password' + ii">
-                          </button>
-                          <cd-copy-2-clipboard-button [source]="'password' + ii">
-                          </cd-copy-2-clipboard-button>
-                        </span>
+                        <button type="button"
+                                class="btn btn-light"
+                                [cdPasswordButton]="'password' + ii">
+                        </button>
+                        <cd-copy-2-clipboard-button [source]="'password' + ii">
+                        </cd-copy-2-clipboard-button>
                       </div>
                       <span class="invalid-feedback"
                             *ngIf="initiator.showError('password', formDir, 'required')"
                       </div>
                       <span class="invalid-feedback"
                             *ngIf="initiator.showError('password', formDir, 'required')"
                                autocomplete="new-password"
                                type="password">
 
                                autocomplete="new-password"
                                type="password">
 
-                        <span class="input-group-append">
-                          <button type="button"
-                                  class="btn btn-light"
-                                  [cdPasswordButton]="'mutual_password' + ii">
-                          </button>
-                          <cd-copy-2-clipboard-button [source]="'mutual_password' + ii">
-                          </cd-copy-2-clipboard-button>
-                        </span>
+                        <button type="button"
+                                class="btn btn-light"
+                                [cdPasswordButton]="'mutual_password' + ii">
+                        </button>
+                        <cd-copy-2-clipboard-button [source]="'mutual_password' + ii">
+                        </cd-copy-2-clipboard-button>
                       </div>
                       <span class="invalid-feedback"
                             *ngIf="initiator.showError('mutual_password', formDir, 'required')"
                       </div>
                       <span class="invalid-feedback"
                             *ngIf="initiator.showError('mutual_password', formDir, 'required')"
                                type="text"
                                [value]="image"
                                disabled />
                                type="text"
                                [value]="image"
                                disabled />
-                        <span class="input-group-append">
-                          <button class="btn btn-light"
-                                  type="button"
-                                  (click)="removeInitiatorImage(initiator, li, ii, image)">
-                            <i [ngClass]="[icons.destroy]"
-                               aria-hidden="true"></i>
-                          </button>
-                        </span>
+                        <button class="btn btn-light"
+                                type="button"
+                                (click)="removeInitiatorImage(initiator, li, ii, image)">
+                          <i [ngClass]="[icons.destroy]"
+                             aria-hidden="true"></i>
+                        </button>
                       </div>
                     </ng-container>
 
                       </div>
                     </ng-container>
 
                         <cd-select [data]="initiator.getValue('luns')"
                                    [options]="imagesInitiatorSelections[ii]"
                                    [messages]="messages.initiatorImage"
                         <cd-select [data]="initiator.getValue('luns')"
                                    [options]="imagesInitiatorSelections[ii]"
                                    [messages]="messages.initiatorImage"
-                                   elemClass="btn btn-light float-right">
+                                   elemClass="btn btn-light float-end">
                           <i [ngClass]="[icons.add]"></i>
                           <ng-container i18n>Add image</ng-container>
                         </cd-select>
                           <i [ngClass]="[icons.add]"></i>
                           <ng-container i18n>Add image</ng-container>
                         </cd-select>
                       i18n>No items added.</span>
 
                 <button (click)="addInitiator(); false"
                       i18n>No items added.</span>
 
                 <button (click)="addInitiator(); false"
-                        class="btn btn-light float-right">
+                        class="btn btn-light float-end">
                   <i [ngClass]="[icons.add]"></i>
                   <ng-container i18n>Add initiator</ng-container>
                 </button>
                   <i [ngClass]="[icons.add]"></i>
                   <ng-container i18n>Add initiator</ng-container>
                 </button>
               <div class="card-header">
                 <ng-container i18n>Group</ng-container>: {{ group.getValue('group_id') }}
                 <button type="button"
               <div class="card-header">
                 <ng-container i18n>Group</ng-container>: {{ group.getValue('group_id') }}
                 <button type="button"
-                        class="close"
+                        class="btn-close float-end"
                         (click)="removeGroup(gi)">
                         (click)="removeGroup(gi)">
-                  <i [ngClass]="[icons.destroy]"></i>
                 </button>
               </div>
               <div class="card-body">
                 </button>
               </div>
               <div class="card-body">
                                type="text"
                                [value]="member"
                                disabled />
                                type="text"
                                [value]="member"
                                disabled />
-                        <span class="input-group-append">
-                          <button class="btn btn-light"
-                                  type="button"
-                                  (click)="removeGroupInitiator(group, i, gi)">
-                            <i [ngClass]="[icons.destroy]"
-                               aria-hidden="true"></i>
-                          </button>
-                        </span>
+                        <button class="btn btn-light"
+                                type="button"
+                                (click)="removeGroupInitiator(group, i, gi)">
+                          <i [ngClass]="[icons.destroy]"
+                             aria-hidden="true"></i>
+                        </button>
                       </div>
                     </ng-container>
 
                       </div>
                     </ng-container>
 
                                    [options]="groupMembersSelections[gi]"
                                    [messages]="messages.groupInitiator"
                                    (selection)="onGroupMemberSelection($event, gi)"
                                    [options]="groupMembersSelections[gi]"
                                    [messages]="messages.groupInitiator"
                                    (selection)="onGroupMemberSelection($event, gi)"
-                                   elemClass="btn btn-light float-right">
+                                   elemClass="btn btn-light float-end">
                           <i [ngClass]="[icons.add]"></i>
                           <ng-container i18n>Add initiator</ng-container>
                         </cd-select>
                           <i [ngClass]="[icons.add]"></i>
                           <ng-container i18n>Add initiator</ng-container>
                         </cd-select>
                                type="text"
                                [value]="disk"
                                disabled />
                                type="text"
                                [value]="disk"
                                disabled />
-                        <span class="input-group-append">
-                          <button class="btn btn-light"
-                                  type="button"
-                                  (click)="removeGroupDisk(group, i, gi)">
-                            <i [ngClass]="[icons.destroy]"
-                               aria-hidden="true"></i>
-                          </button>
-                        </span>
+                        <button class="btn btn-light"
+                                type="button"
+                                (click)="removeGroupDisk(group, i, gi)">
+                          <i [ngClass]="[icons.destroy]"
+                             aria-hidden="true"></i>
+                        </button>
                       </div>
                     </ng-container>
 
                       </div>
                     </ng-container>
 
                         <cd-select [data]="group.getValue('disks')"
                                    [options]="groupDiskSelections[gi]"
                                    [messages]="messages.initiatorImage"
                         <cd-select [data]="group.getValue('disks')"
                                    [options]="groupDiskSelections[gi]"
                                    [messages]="messages.initiatorImage"
-                                   elemClass="btn btn-light float-right">
+                                   elemClass="btn btn-light float-end">
                           <i [ngClass]="[icons.add]"></i>
                           <ng-container i18n>Add image</ng-container>
                         </cd-select>
                           <i [ngClass]="[icons.add]"></i>
                           <ng-container i18n>Add image</ng-container>
                         </cd-select>
                       i18n>No items added.</span>
 
                 <button (click)="addGroup(); false"
                       i18n>No items added.</span>
 
                 <button (click)="addGroup(); false"
-                        class="btn btn-light float-right">
+                        class="btn btn-light float-end">
                   <i [ngClass]="[icons.add]"></i>
                   <ng-container i18n>Add group</ng-container>
                 </button>
                   <i [ngClass]="[icons.add]"></i>
                   <ng-container i18n>Add group</ng-container>
                 </button>
index 6704b41e6480bba162a4365f829da95d3b3e5a72..ff77665ce98429fdc2a54588a90db1d460202cb0 100644 (file)
@@ -805,9 +805,9 @@ export class IscsiTargetFormComponent extends CdForm implements OnInit {
     const imageFeatures = image.features;
     const requiredFeatures = this.required_rbd_features[backstore];
     const unsupportedFeatures = this.unsupported_rbd_features[backstore];
     const imageFeatures = image.features;
     const requiredFeatures = this.required_rbd_features[backstore];
     const unsupportedFeatures = this.unsupported_rbd_features[backstore];
-    // tslint:disable-next-line:no-bitwise
+    // eslint-disable-next-line no-bitwise
     const validRequiredFeatures = (imageFeatures & requiredFeatures) === requiredFeatures;
     const validRequiredFeatures = (imageFeatures & requiredFeatures) === requiredFeatures;
-    // tslint:disable-next-line:no-bitwise
+    // eslint-disable-next-line no-bitwise
     const validSupportedFeatures = (imageFeatures & unsupportedFeatures) === 0;
     return validRequiredFeatures && validSupportedFeatures;
   }
     const validSupportedFeatures = (imageFeatures & unsupportedFeatures) === 0;
     return validRequiredFeatures && validSupportedFeatures;
   }
index 2452b0bc5721cda153ff4dc43d2a3bfc4c4e4623..9614ac7505f0fdb35be91b0cf9f6c3f46f7179ef 100644 (file)
@@ -58,7 +58,7 @@
                    i18n>Backstore</label>
             <select id="backstore"
                     name="backstore"
                    i18n>Backstore</label>
             <select id="backstore"
                     name="backstore"
-                    class="form-control"
+                    class="form-select"
                     formControlName="backstore">
               <option *ngFor="let bs of backstores"
                       [value]="bs">{{ bs | iscsiBackstore }}</option>
                     formControlName="backstore">
               <option *ngFor="let bs of backstores"
                       [value]="bs">{{ bs | iscsiBackstore }}</option>
index eccb79514c1bf6ce6dc41a37a0a8d3aeb0eb73ff..ba66271cf7763ed71d99688d7050602c9a11ea71 100644 (file)
@@ -1,15 +1,19 @@
 <cd-iscsi-tabs></cd-iscsi-tabs>
 
 <legend i18n>Gateways</legend>
 <cd-iscsi-tabs></cd-iscsi-tabs>
 
 <legend i18n>Gateways</legend>
-<cd-table [data]="gateways"
-          (fetchData)="refresh()"
-          [columns]="gatewaysColumns">
-</cd-table>
+<div>
+  <cd-table [data]="gateways"
+            (fetchData)="refresh()"
+            [columns]="gatewaysColumns">
+  </cd-table>
+</div>
 
 <legend i18n>Images</legend>
 
 <legend i18n>Images</legend>
-<cd-table [data]="images"
-          [columns]="imagesColumns">
-</cd-table>
+<div>
+  <cd-table [data]="images"
+            [columns]="imagesColumns">
+  </cd-table>
+</div>
 
 <ng-template #iscsiSparklineTpl
              let-row="row"
 
 <ng-template #iscsiSparklineTpl
              let-row="row"
index a31ab933c7525d7be708ffec87ab65617616f991..22ad25b08bd36de072198e971faf4fa67b9e235f 100755 (executable)
@@ -53,7 +53,7 @@
                 i18n>At least one pool is required.</span>
         </div>
 
                 i18n>At least one pool is required.</span>
         </div>
 
-        <cd-submit-button class="mb-4 float-right"
+        <cd-submit-button class="mb-4 float-end"
                           i18n
                           [form]="createBootstrapForm"
                           (submitAction)="generate()">Generate</cd-submit-button>
                           i18n
                           [form]="createBootstrapForm"
                           (submitAction)="generate()">Generate</cd-submit-button>
@@ -71,7 +71,7 @@
                     readonly>
           </textarea>
         </div>
                     readonly>
           </textarea>
         </div>
-        <cd-copy-2-clipboard-button class="float-right"
+        <cd-copy-2-clipboard-button class="float-end"
                                     source="token">
         </cd-copy-2-clipboard-button>
       </div>
                                     source="token">
         </cd-copy-2-clipboard-button>
       </div>
index d4972a41c13536042a88896c59c20d2179e9c235..ef72663cde90da9b0be5eb0374caa62eb4ec84d5 100644 (file)
@@ -1,8 +1,8 @@
-<ul ngbNav
-    #nav="ngbNav"
-    class="nav-tabs"
-    cdStatefulTab="image-list">
-  <li ngbNavItem="issues">
+<nav ngbNav
+     #nav="ngbNav"
+     class="nav-tabs"
+     cdStatefulTab="image-list">
+  <ng-container ngbNavItem="issues">
     <a ngbNavLink
        i18n>Issues ({{ image_error.data.length }})</a>
     <ng-template ngbNavContent>
     <a ngbNavLink
        i18n>Issues ({{ image_error.data.length }})</a>
     <ng-template ngbNavContent>
@@ -14,8 +14,8 @@
                 [status]="tableStatus">
       </cd-table>
     </ng-template>
                 [status]="tableStatus">
       </cd-table>
     </ng-template>
-  </li>
-  <li ngbNavItem="syncing">
+  </ng-container>
+  <ng-container ngbNavItem="syncing">
     <a ngbNavLink
        i18n>Syncing ({{ image_syncing.data.length }})</a>
     <ng-template ngbNavContent>
     <a ngbNavLink
        i18n>Syncing ({{ image_syncing.data.length }})</a>
     <ng-template ngbNavContent>
@@ -27,8 +27,8 @@
                 [status]="tableStatus">
       </cd-table>
     </ng-template>
                 [status]="tableStatus">
       </cd-table>
     </ng-template>
-  </li>
-  <li ngbNavItem="ready">
+  </ng-container>
+  <ng-container ngbNavItem="ready">
     <a ngbNavLink
        i18n>Ready ({{ image_ready.data.length }})</a>
     <ng-template ngbNavContent>
     <a ngbNavLink
        i18n>Ready ({{ image_ready.data.length }})</a>
     <ng-template ngbNavContent>
@@ -40,8 +40,8 @@
                 [status]="tableStatus">
       </cd-table>
     </ng-template>
                 [status]="tableStatus">
       </cd-table>
     </ng-template>
-  </li>
-</ul>
+  </ng-container>
+</nav>
 
 <div [ngbNavOutlet]="nav"></div>
 
 
 <div [ngbNavOutlet]="nav"></div>
 
index dfebe934f1e0fac1aadd73d49d77cb894a29ba40..3bb39245740bfd1a710718cf35a3f246c6785dac 100644 (file)
@@ -3,7 +3,7 @@ import { NgModule } from '@angular/core';
 import { FormsModule, ReactiveFormsModule } from '@angular/forms';
 import { RouterModule } from '@angular/router';
 
 import { FormsModule, ReactiveFormsModule } from '@angular/forms';
 import { RouterModule } from '@angular/router';
 
-import { NgbNavModule, NgbProgressbarModule } from '@ng-bootstrap/ng-bootstrap';
+import { NgbNavModule, NgbProgressbarModule, NgbTooltipModule } from '@ng-bootstrap/ng-bootstrap';
 
 import { SharedModule } from '~/app/shared/shared.module';
 import { BootstrapCreateModalComponent } from './bootstrap-create-modal/bootstrap-create-modal.component';
 
 import { SharedModule } from '~/app/shared/shared.module';
 import { BootstrapCreateModalComponent } from './bootstrap-create-modal/bootstrap-create-modal.component';
@@ -24,7 +24,8 @@ import { PoolListComponent } from './pool-list/pool-list.component';
     RouterModule,
     FormsModule,
     ReactiveFormsModule,
     RouterModule,
     FormsModule,
     ReactiveFormsModule,
-    NgbProgressbarModule
+    NgbProgressbarModule,
+    NgbTooltipModule
   ],
   declarations: [
     BootstrapCreateModalComponent,
   ],
   declarations: [
     BootstrapCreateModalComponent,
index 9cdfab939cc2aa529b97a0efd4fe1d744c91f0fa..a51ea9b069fd0e3f8ddea7686a9d0df56b1805b7 100644 (file)
@@ -1,66 +1,68 @@
-<div class="row">
-  <div class="col-md-12">
-    <form name="rbdmirroringForm"
-          #formDir="ngForm"
-          [formGroup]="rbdmirroringForm"
-          novalidate>
-
-      <div class="d-flex flex-row">
-        <label class="col-form-label"
-               for="siteName"
-               i18n>Site Name</label>
+<form name="rbdmirroringForm"
+      #formDir="ngForm"
+      [formGroup]="rbdmirroringForm"
+      novalidate>
+  <div class="row mb-3">
+    <div class="col-md-auto">
+      <label class="col-form-label"
+             for="siteName"
+             i18n>Site Name</label></div>
 
 
-        <div class="col-md-4 input-group mb-3 mr-auto">
-          <input type="text"
-                 class="form-control"
-                 id="siteName"
-                 name="siteName"
-                 formControlName="siteName"
-                 [attr.disabled]="!editing ? true : null">
-          <div class="input-group-append">
-            <button class="btn btn-light"
-                    id="editSiteName"
-                    (click)="updateSiteName()">
-              <i [ngClass]="icons.edit"
-                 *ngIf="!editing"></i>
-              <i [ngClass]="icons.check"
-                 *ngIf="editing"></i>
-            </button>
-            <cd-copy-2-clipboard-button [source]="siteName"
-                                        [byId]="false">
-            </cd-copy-2-clipboard-button>
-          </div>
-        </div>
-        <cd-table-actions class="table-actions"
-                          [permission]="permission"
-                          [selection]="selection"
-                          [tableActions]="tableActions">
-        </cd-table-actions>
-      </div>
-    </form>
+    <div class="col-sm-4 d-flex">
+      <input type="text"
+             class="form-control"
+             id="siteName"
+             name="siteName"
+             formControlName="siteName"
+             [attr.disabled]="!editing ? true : null">
+      <button class="btn btn-light"
+              id="editSiteName"
+              (click)="updateSiteName()"
+              [attr.title]="editing ? 'Save' : 'Edit'">
+        <i [ngClass]="icons.edit"
+           *ngIf="!editing"></i>
+        <i [ngClass]="icons.check"
+           *ngIf="editing"></i>
+      </button>
+      <cd-copy-2-clipboard-button [source]="siteName"
+                                  [byId]="false">
+      </cd-copy-2-clipboard-button>
+    </div>
+    <div class="col">
+      <cd-table-actions class="table-actions float-end"
+                        [permission]="permission"
+                        [selection]="selection"
+                        [tableActions]="tableActions">
+      </cd-table-actions>
+    </div>
   </div>
   </div>
-</div>
+</form>
 
 <div class="row">
   <div class="col-sm-6">
     <legend i18n>Daemons</legend>
 
 <div class="row">
   <div class="col-sm-6">
     <legend i18n>Daemons</legend>
-
-    <cd-mirroring-daemons>
-    </cd-mirroring-daemons>
+    <div>
+      <cd-mirroring-daemons>
+      </cd-mirroring-daemons>
+    </div>
   </div>
 
   <div class="col-sm-6">
     <legend i18n>Pools</legend>
 
   </div>
 
   <div class="col-sm-6">
     <legend i18n>Pools</legend>
 
-    <cd-mirroring-pools>
-    </cd-mirroring-pools>
+    <div>
+      <cd-mirroring-pools>
+      </cd-mirroring-pools>
+    </div>
   </div>
 </div>
 
 <div class="row">
   <div class="col-md-12">
     <legend i18n>Images</legend>
   </div>
 </div>
 
 <div class="row">
   <div class="col-md-12">
     <legend i18n>Images</legend>
-    <cd-mirroring-images>
-    </cd-mirroring-images>
+    <div>
+      <cd-mirroring-images>
+      </cd-mirroring-images>
+    </div>
   </div>
 </div>
   </div>
 </div>
index 3ee1fa81334285d4ee56b38533e4bf9662bf5d9e..8000751df5f671270d8bea6dd9fb770bd03bd4e9 100644 (file)
@@ -59,7 +59,7 @@ export class OverviewComponent implements OnInit, OnDestroy {
       icon: Icons.download,
       click: () => this.importBootstrapModal(),
       name: $localize`Import Bootstrap Token`,
       icon: Icons.download,
       click: () => this.importBootstrapModal(),
       name: $localize`Import Bootstrap Token`,
-      disable: () => this.peersExist
+      disable: () => false
     };
     this.tableActions = [createBootstrapAction, importBootstrapAction];
   }
     };
     this.tableActions = [createBootstrapAction, importBootstrapAction];
   }
@@ -70,7 +70,6 @@ export class OverviewComponent implements OnInit, OnDestroy {
     this.subs.add(
       this.rbdMirroringService.subscribeSummary((data) => {
         this.status = data.content_data.status;
     this.subs.add(
       this.rbdMirroringService.subscribeSummary((data) => {
         this.status = data.content_data.status;
-
         this.peersExist = !!data.content_data.pools.find((o: Pool) => o['peer_uuids'].length > 0);
       })
     );
         this.peersExist = !!data.content_data.pools.find((o: Pool) => o['peer_uuids'].length > 0);
       })
     );
index 00fe92b32b734ecf507ab2c0080f0b2e169ba577..ed4f7289619ec7f7c2ff2e3150a184273172ba23 100644 (file)
@@ -23,7 +23,7 @@
           </label>
           <select id="mirrorMode"
                   name="mirrorMode"
           </label>
           <select id="mirrorMode"
                   name="mirrorMode"
-                  class="form-control"
+                  class="form-select"
                   formControlName="mirrorMode">
             <option *ngFor="let mirrorMode of mirrorModes"
                     [value]="mirrorMode.id">{{ mirrorMode.name }}</option>
                   formControlName="mirrorMode">
             <option *ngFor="let mirrorMode of mirrorModes"
                     [value]="mirrorMode.id">{{ mirrorMode.name }}</option>
index 1e4e72df19651aff478a10effefbe5164891a810..f5581af35efddc1eb6465b6580dd8e4b2398aa32 100644 (file)
              let-value="value">
   <span [ngClass]="row.health_color | mirrorHealthColor">{{ value }}</span>
 </ng-template>
              let-value="value">
   <span [ngClass]="row.health_color | mirrorHealthColor">{{ value }}</span>
 </ng-template>
+<ng-template #localTmpl>
+  <span i18n
+        i18n-ngbTooltip
+        ngbTooltip="Local image count"># Local</span>
+</ng-template>
+<ng-template #remoteTmpl>
+  <span i18n
+        i18n-ngbTooltip
+        ngbTooltip="Remote image count"># Remote</span>
+</ng-template>
 <router-outlet name="modal"></router-outlet>
 <router-outlet name="modal"></router-outlet>
index a5e1c9e4b959ba7dc8ccf334bbfbf10483c6b218..61f812177561ca364c801923c5796c6f9b3ab842 100644 (file)
@@ -27,6 +27,10 @@ const BASE_URL = '/block/mirroring';
 export class PoolListComponent implements OnInit, OnDestroy {
   @ViewChild('healthTmpl', { static: true })
   healthTmpl: TemplateRef<any>;
 export class PoolListComponent implements OnInit, OnDestroy {
   @ViewChild('healthTmpl', { static: true })
   healthTmpl: TemplateRef<any>;
+  @ViewChild('localTmpl', { static: true })
+  localTmpl: TemplateRef<any>;
+  @ViewChild('remoteTmpl', { static: true })
+  remoteTmpl: TemplateRef<any>;
 
   subs: Subscription;
 
 
   subs: Subscription;
 
@@ -89,8 +93,18 @@ export class PoolListComponent implements OnInit, OnDestroy {
       { prop: 'name', name: $localize`Name`, flexGrow: 2 },
       { prop: 'mirror_mode', name: $localize`Mode`, flexGrow: 2 },
       { prop: 'leader_id', name: $localize`Leader`, flexGrow: 2 },
       { prop: 'name', name: $localize`Name`, flexGrow: 2 },
       { prop: 'mirror_mode', name: $localize`Mode`, flexGrow: 2 },
       { prop: 'leader_id', name: $localize`Leader`, flexGrow: 2 },
-      { prop: 'image_local_count', name: $localize`# Local`, flexGrow: 2 },
-      { prop: 'image_remote_count', name: $localize`# Remote`, flexGrow: 2 },
+      {
+        prop: 'image_local_count',
+        name: $localize`# Local`,
+        headerTemplate: this.localTmpl,
+        flexGrow: 2
+      },
+      {
+        prop: 'image_remote_count',
+        name: $localize`# Remote`,
+        headerTemplate: this.remoteTmpl,
+        flexGrow: 2
+      },
       {
         prop: 'health',
         name: $localize`Health`,
       {
         prop: 'health',
         name: $localize`Health`,
index 130aa32866c146d0431d525ff7c66726e8b53023..62707db349961f17d0bdebe5f034f44f6d169c94 100644 (file)
                        cdIops>
               </ng-container>
             </ng-container>
                        cdIops>
               </ng-container>
             </ng-container>
-            <span class="input-group-append">
-              <button class="btn btn-light"
-                      type="button"
-                      data-toggle="button"
-                      [ngClass]="{'active': isDisabled(option.name)}"
-                      title="Remove the local configuration value. The parent configuration value will be inherited and used instead."
-                      i18n-title
-                      (click)="reset(option.name)">
-                <i [ngClass]="[icons.erase]"
-                   aria-hidden="true"></i>
-              </button>
-            </span>
+            <button class="btn btn-light"
+                    type="button"
+                    data-toggle="button"
+                    [ngClass]="{'active': isDisabled(option.name)}"
+                    title="Remove the local configuration value. The parent configuration value will be inherited and used instead."
+                    i18n-title
+                    (click)="reset(option.name)">
+              <i [ngClass]="[icons.erase]"
+                 aria-hidden="true"></i>
+            </button>
           </div>
           <span i18n
                 class="invalid-feedback"
           </div>
           <span i18n
                 class="invalid-feedback"
index 8614dfe72bccbd50973ceca123652e908760aee4..e12d3772876b3d55cde42f36241651798628a93a 100644 (file)
@@ -3,11 +3,11 @@
 </ng-template>
 
 <ng-container *ngIf="selection && selection.source !== 'REMOVING'">
 </ng-template>
 
 <ng-container *ngIf="selection && selection.source !== 'REMOVING'">
-  <ul ngbNav
-      #nav="ngbNav"
-      class="nav-tabs"
-      cdStatefulTab="rbd-details">
-    <li ngbNavItem="details">
+  <nav ngbNav
+       #nav="ngbNav"
+       class="nav-tabs"
+       cdStatefulTab="rbd-details">
+    <ng-container ngbNavItem="details">
       <a ngbNavLink
          i18n>Details</a>
       <ng-template ngbNavContent>
       <a ngbNavLink
          i18n>Details</a>
       <ng-template ngbNavContent>
@@ -53,7 +53,7 @@
                   class="bold">Features</td>
               <td>
                 <span *ngFor="let feature of selection.features_name">
                   class="bold">Features</td>
               <td>
                 <span *ngFor="let feature of selection.features_name">
-                  <span class="badge badge-dark mr-2">{{ feature }}</span>
+                  <span class="badge badge-dark me-2">{{ feature }}</span>
                 </span>
               </td>
             </tr>
                 </span>
               </td>
             </tr>
           </tbody>
         </table>
       </ng-template>
           </tbody>
         </table>
       </ng-template>
-    </li>
-    <li ngbNavItem="snapshots">
+    </ng-container>
+    <ng-container ngbNavItem="snapshots">
       <a ngbNavLink
          i18n>Snapshots</a>
       <ng-template ngbNavContent>
         <cd-rbd-snapshot-list [snapshots]="selection.snapshots"
                               [featuresName]="selection.features_name"
                               [poolName]="selection.pool_name"
       <a ngbNavLink
          i18n>Snapshots</a>
       <ng-template ngbNavContent>
         <cd-rbd-snapshot-list [snapshots]="selection.snapshots"
                               [featuresName]="selection.features_name"
                               [poolName]="selection.pool_name"
+                              [primary]="selection.primary"
                               [namespace]="selection.namespace"
                               [mirroring]="selection.mirror_mode"
                               [rbdName]="selection.name"></cd-rbd-snapshot-list>
       </ng-template>
                               [namespace]="selection.namespace"
                               [mirroring]="selection.mirror_mode"
                               [rbdName]="selection.name"></cd-rbd-snapshot-list>
       </ng-template>
-    </li>
-    <li ngbNavItem="configuration">
+    </ng-container>
+    <ng-container ngbNavItem="configuration">
       <a ngbNavLink
          i18n>Configuration</a>
       <ng-template ngbNavContent>
         <cd-rbd-configuration-table [data]="selection['configuration']"></cd-rbd-configuration-table>
       </ng-template>
       <a ngbNavLink
          i18n>Configuration</a>
       <ng-template ngbNavContent>
         <cd-rbd-configuration-table [data]="selection['configuration']"></cd-rbd-configuration-table>
       </ng-template>
-    </li>
+    </ng-container>
 
 
-    <li ngbNavItem="performance">
+    <ng-container ngbNavItem="performance">
       <a ngbNavLink
          i18n>Performance</a>
       <ng-template ngbNavContent>
       <a ngbNavLink
          i18n>Performance</a>
       <ng-template ngbNavContent>
-        <cd-grafana [grafanaPath]="rbdDashboardUrl"
+        <cd-grafana i18n-title
+                    title="RBD details"
+                    [grafanaPath]="rbdDashboardUrl"
                     [type]="'metrics'"
                     uid="YhCYGcuZz"
                     grafanaStyle="one">
         </cd-grafana>
       </ng-template>
                     [type]="'metrics'"
                     uid="YhCYGcuZz"
                     grafanaStyle="one">
         </cd-grafana>
       </ng-template>
-    </li>
-  </ul>
+    </ng-container>
+  </nav>
 
   <div [ngbNavOutlet]="nav"></div>
 </ng-container>
 
   <div [ngbNavOutlet]="nav"></div>
 </ng-container>
index 38f20476207908f961593bc7a98fe47b2250c934..017456cb4d2a6fcd12d965d833ce7f49fed7ba5c 100644 (file)
@@ -66,7 +66,7 @@
                    *ngIf="mode === 'editing' || !poolPermission.read">
             <select id="pool"
                     name="pool"
                    *ngIf="mode === 'editing' || !poolPermission.read">
             <select id="pool"
                     name="pool"
-                    class="form-control"
+                    class="form-select"
                     formControlName="pool"
                     *ngIf="mode !== 'editing' && poolPermission.read"
                     (change)="setPoolMirrorMode()">
                     formControlName="pool"
                     *ngIf="mode !== 'editing' && poolPermission.read"
                     (change)="setPoolMirrorMode()">
                    *ngIf="mode === 'editing' || !poolPermission.read">
             <select id="namespace"
                     name="namespace"
                    *ngIf="mode === 'editing' || !poolPermission.read">
             <select id="namespace"
                     name="namespace"
-                    class="form-control"
+                    class="form-select"
                     formControlName="namespace"
                     *ngIf="mode !== 'editing' && poolPermission.read">
               <option *ngIf="pools === null"
                     formControlName="namespace"
                     *ngIf="mode !== 'editing' && poolPermission.read">
               <option *ngIf="pools === null"
                    *ngIf="mode === 'editing' || !poolPermission.read">
             <select id="dataPool"
                     name="dataPool"
                    *ngIf="mode === 'editing' || !poolPermission.read">
             <select id="dataPool"
                     name="dataPool"
-                    class="form-control"
+                    class="form-select"
                     formControlName="dataPool"
                     (change)="onDataPoolChange($event.target.value)"
                     *ngIf="mode !== 'editing' && poolPermission.read">
                     formControlName="dataPool"
                     (change)="onDataPoolChange($event.target.value)"
                     *ngIf="mode !== 'editing' && poolPermission.read">
               </cd-helper>
             </div>
             <div *ngIf="mirroring">
               </cd-helper>
             </div>
             <div *ngIf="mirroring">
-              <div class="custom-control custom-radio ml-2"
+              <div class="custom-control custom-radio ms-2"
                    *ngFor="let option of mirroringOptions">
                 <input type="radio"
                    *ngFor="let option of mirroringOptions">
                 <input type="radio"
-                       class="custom-control-input"
+                       class="form-check-input"
                        [id]="option"
                        [value]="option"
                        name="mirroringMode"
                        (change)="setExclusiveLock()"
                        formControlName="mirroringMode"
                        [attr.disabled]="(poolMirrorMode === 'pool' && option === 'snapshot') ? true : null">
                        [id]="option"
                        [value]="option"
                        name="mirroringMode"
                        (change)="setExclusiveLock()"
                        formControlName="mirroringMode"
                        [attr.disabled]="(poolMirrorMode === 'pool' && option === 'snapshot') ? true : null">
-                <label class="custom-control-label"
+                <label class="form-check-label"
                        [for]="option">{{ option | titlecase }}</label>
                 <cd-helper *ngIf="poolMirrorMode === 'pool' && option === 'snapshot'">
                   <span i18n>You need to enable <b>image mirror mode</b> in the selected pool. Please <a [routerLink]="['/block/mirroring', {outlets: {modal: ['edit', currentPoolName]}}]">click here to select a mode and enable it in this pool.</a></span>
                        [for]="option">{{ option | titlecase }}</label>
                 <cd-helper *ngIf="poolMirrorMode === 'pool' && option === 'snapshot'">
                   <span i18n>You need to enable <b>image mirror mode</b> in the selected pool. Please <a [routerLink]="['/block/mirroring', {outlets: {modal: ['edit', currentPoolName]}}]">click here to select a mode and enable it in this pool.</a></span>
           <label class="cd-col-form-label"
                  i18n>Schedule Interval
           <cd-helper i18n-html
           <label class="cd-col-form-label"
                  i18n>Schedule Interval
           <cd-helper i18n-html
-                     html="Create Mirror-Snapshots automatically on a periodic basis. The interval can be specified in days, hours, or minutes using d, h, m suffix respectively.">
+                     html="Create Mirror-Snapshots automatically on a periodic basis. The interval can be specified in days, hours, or minutes using d, h, m suffix respectively. To create mirror snapshots, you must import or create and have available peers to mirror">
           </cd-helper></label>
           <div class="cd-col-form-input">
             <input id="schedule"
           </cd-helper></label>
           <div class="cd-col-form-input">
             <input id="schedule"
                    formControlName="schedule"
                    i18n-placeholder
                    placeholder="e.g., 12h or 1d or 10m"
                    formControlName="schedule"
                    i18n-placeholder
                    placeholder="e.g., 12h or 1d or 10m"
-                   [attr.disabled]="(mode === rbdFormMode.editing) ? true : null">
+                   [attr.disabled]="(peerConfigured === false) ? true : null">
           </div>
         </div>
 
         <!-- Advanced -->
         <div class="row">
           <div class="col-sm-12">
           </div>
         </div>
 
         <!-- Advanced -->
         <div class="row">
           <div class="col-sm-12">
-            <a class="float-right margin-right-md"
+            <a class="float-end margin-right-md"
                (click)="advancedEnabled = true; false"
                *ngIf="!advancedEnabled"
                href=""
                (click)="advancedEnabled = true; false"
                *ngIf="!advancedEnabled"
                href=""
               <div class="cd-col-form-input">
                 <select id="obj_size"
                         name="obj_size"
               <div class="cd-col-form-input">
                 <select id="obj_size"
                         name="obj_size"
-                        class="form-control"
+                        class="form-select"
                         formControlName="obj_size">
                   <option *ngFor="let objectSize of objectSizes"
                           [value]="objectSize">{{ objectSize }}</option>
                         formControlName="obj_size">
                   <option *ngFor="let objectSize of objectSizes"
                           [value]="objectSize">{{ objectSize }}</option>
               <div class="cd-col-form-input">
                 <select id="stripingUnit"
                         name="stripingUnit"
               <div class="cd-col-form-input">
                 <select id="stripingUnit"
                         name="stripingUnit"
-                        class="form-control"
+                        class="form-select"
                         formControlName="stripingUnit">
                   <option i18n
                           [ngValue]="null">-- Select stripe unit --</option>
                         formControlName="stripingUnit">
                   <option i18n
                           [ngValue]="null">-- Select stripe unit --</option>
index 5df73d93fe1ee4142c022dc854f564f4fdcdbaa6..7bf543f1af729b12f721ef6f5779a00dd3a86265 100644 (file)
@@ -452,11 +452,34 @@ describe('RbdFormComponent', () => {
 
       it('should set and disable exclusive-lock only for the journal mode', () => {
         component.poolMirrorMode = 'pool';
 
       it('should set and disable exclusive-lock only for the journal mode', () => {
         component.poolMirrorMode = 'pool';
+        component.mirroring = true;
+        const journal = fixture.debugElement.query(By.css('#journal')).nativeElement;
+        journal.click();
         fixture.detectChanges();
         const exclusiveLocks = fixture.debugElement.query(By.css('#exclusive-lock')).nativeElement;
         expect(exclusiveLocks.checked).toBe(true);
         expect(exclusiveLocks.disabled).toBe(true);
       });
         fixture.detectChanges();
         const exclusiveLocks = fixture.debugElement.query(By.css('#exclusive-lock')).nativeElement;
         expect(exclusiveLocks.checked).toBe(true);
         expect(exclusiveLocks.disabled).toBe(true);
       });
+
+      it('should have journaling feature for journaling mirror mode on createRequest', () => {
+        component.mirroring = true;
+        fixture.detectChanges();
+        const journal = fixture.debugElement.query(By.css('#journal')).nativeElement;
+        journal.click();
+        expect(journal.checked).toBe(true);
+        const request = component.createRequest();
+        expect(request.features).toContain('journaling');
+      });
+
+      it('should have journaling feature for journaling mirror mode on editRequest', () => {
+        component.mirroring = true;
+        fixture.detectChanges();
+        const journal = fixture.debugElement.query(By.css('#journal')).nativeElement;
+        journal.click();
+        expect(journal.checked).toBe(true);
+        const request = component.editRequest();
+        expect(request.features).toContain('journaling');
+      });
     });
   });
 });
     });
   });
 });
index 4fa71646215fafe9f6603309d04818892c97651b..b9e3add709cf8f3bf35db988e5b88b03ce5a365c 100644 (file)
@@ -67,6 +67,7 @@ export class RbdFormComponent extends CdForm implements OnInit {
   }>(1);
 
   pool: string;
   }>(1);
 
   pool: string;
+  peerConfigured = false;
 
   advancedEnabled = false;
 
 
   advancedEnabled = false;
 
@@ -193,11 +194,11 @@ export class RbdFormComponent extends CdForm implements OnInit {
             return acc;
           }, {})
         ),
             return acc;
           }, {})
         ),
-        mirroring: new FormControl(false),
+        mirroring: new FormControl(''),
         schedule: new FormControl('', {
           validators: [Validators.pattern(/^([0-9]+)d|([0-9]+)h|([0-9]+)m$/)] // check schedule interval to be in format - 1d or 1h or 1m
         }),
         schedule: new FormControl('', {
           validators: [Validators.pattern(/^([0-9]+)d|([0-9]+)h|([0-9]+)m$/)] // check schedule interval to be in format - 1d or 1h or 1m
         }),
-        mirroringMode: new FormControl(this.mirroringOptions[0]),
+        mirroringMode: new FormControl(''),
         stripingUnit: new FormControl(this.defaultStripingUnit),
         stripingCount: new FormControl(this.defaultStripingCount, {
           updateOn: 'blur'
         stripingUnit: new FormControl(this.defaultStripingUnit),
         stripingCount: new FormControl(this.defaultStripingCount, {
           updateOn: 'blur'
@@ -257,6 +258,16 @@ export class RbdFormComponent extends CdForm implements OnInit {
   setMirrorMode() {
     this.mirroring = !this.mirroring;
     this.setExclusiveLock();
   setMirrorMode() {
     this.mirroring = !this.mirroring;
     this.setExclusiveLock();
+    this.checkPeersConfigured();
+  }
+
+  checkPeersConfigured(poolname?: string) {
+    const poolName = poolname ? poolname : this.rbdForm.get('pool').value;
+    this.rbdMirroringService.getPeerForPool(poolName).subscribe((resp: any) => {
+      if (resp.length > 0) {
+        this.peerConfigured = true;
+      }
+    });
   }
 
   setPoolMirrorMode() {
   }
 
   setPoolMirrorMode() {
@@ -274,10 +285,6 @@ export class RbdFormComponent extends CdForm implements OnInit {
           this.mirroring = false;
           this.rbdForm.get('mirroring').setValue(this.mirroring);
           this.rbdForm.get('mirroring').disable();
           this.mirroring = false;
           this.rbdForm.get('mirroring').setValue(this.mirroring);
           this.rbdForm.get('mirroring').disable();
-        } else if (this.mode !== this.rbdFormMode.editing) {
-          this.rbdForm.get('mirroring').enable();
-          this.mirroring = true;
-          this.rbdForm.get('mirroring').setValue(this.mirroring);
         }
       });
     }
         }
       });
     }
@@ -319,6 +326,7 @@ export class RbdFormComponent extends CdForm implements OnInit {
           this.snapName = decodeURIComponent(params.snap);
         }
         promises['rbd'] = this.rbdService.get(imageSpec);
           this.snapName = decodeURIComponent(params.snap);
         }
         promises['rbd'] = this.rbdService.get(imageSpec);
+        this.checkPeersConfigured(imageSpec.poolName);
       });
     } else {
       // New image
       });
     } else {
       // New image
@@ -636,6 +644,7 @@ export class RbdFormComponent extends CdForm implements OnInit {
     request.name = this.rbdForm.getValue('name');
     request.schedule_interval = this.rbdForm.getValue('schedule');
     request.size = this.formatter.toBytes(this.rbdForm.getValue('size'));
     request.name = this.rbdForm.getValue('name');
     request.schedule_interval = this.rbdForm.getValue('schedule');
     request.size = this.formatter.toBytes(this.rbdForm.getValue('size'));
+
     if (this.poolMirrorMode === 'image') {
       request.mirror_mode = this.rbdForm.getValue('mirroringMode');
     }
     if (this.poolMirrorMode === 'image') {
       request.mirror_mode = this.rbdForm.getValue('mirroringMode');
     }
@@ -690,18 +699,17 @@ export class RbdFormComponent extends CdForm implements OnInit {
       }
     });
     request.enable_mirror = this.rbdForm.getValue('mirroring');
       }
     });
     request.enable_mirror = this.rbdForm.getValue('mirroring');
-    if (this.poolMirrorMode === 'image') {
-      if (request.enable_mirror) {
+    if (request.enable_mirror) {
+      if (this.rbdForm.getValue('mirroringMode') === 'journal') {
+        request.features.push('journaling');
+      }
+      if (this.poolMirrorMode === 'image') {
         request.mirror_mode = this.rbdForm.getValue('mirroringMode');
       }
     } else {
         request.mirror_mode = this.rbdForm.getValue('mirroringMode');
       }
     } else {
-      if (request.enable_mirror) {
-        request.features.push('journaling');
-      } else {
-        const index = request.features.indexOf('journaling', 0);
-        if (index > -1) {
-          request.features.splice(index, 1);
-        }
+      const index = request.features.indexOf('journaling', 0);
+      if (index > -1) {
+        request.features.splice(index, 1);
       }
     }
     request.configuration = this.getDirtyConfigurationValues();
       }
     }
     request.configuration = this.getDirtyConfigurationValues();
index 712d771c5d4e00b212de525b740bd6a08ad99091..7ab53219ad560f60d6c9d07ee0fe862c81a2aaa3 100644 (file)
@@ -65,8 +65,7 @@
   <span *ngIf="value.length === 3; else probb"
         class="badge badge-info">{{ value[0] }}</span>&nbsp;
   <span *ngIf="value.length === 3"
   <span *ngIf="value.length === 3; else probb"
         class="badge badge-info">{{ value[0] }}</span>&nbsp;
   <span *ngIf="value.length === 3"
-        class="badge badge-info"
-        [ngbTooltip]="'Next scheduled snapshot on' + ' ' + (value[2] | cdDate)">{{ value[1] }}</span>
+        class="badge badge-info">{{ value[1] }}</span>&nbsp;
   <span *ngIf="row.primary === true"
         class="badge badge-info"
         i18n>primary</span>
   <span *ngIf="row.primary === true"
         class="badge badge-info"
         i18n>primary</span>
   </ng-template>
 </ng-template>
 
   </ng-template>
 </ng-template>
 
+<ng-template #scheduleTpl
+             let-value="value"
+             let-row="row">
+  <span *ngIf="value.length === 3"
+        class="badge badge-info">{{ value[2] | cdDate  }}</span>
+</ng-template>
+
 <ng-template #flattenTpl
              let-value>
   You are about to flatten
 <ng-template #flattenTpl
              let-value>
   You are about to flatten
index 983f39ed9be523e7ef53bad5d6f1841cc1a4f558..79fad415e9e4b2b8079cf6727bec683779aa2b2a 100644 (file)
@@ -53,6 +53,8 @@ export class RbdListComponent extends ListWithDetails implements OnInit {
   parentTpl: TemplateRef<any>;
   @ViewChild('nameTpl')
   nameTpl: TemplateRef<any>;
   parentTpl: TemplateRef<any>;
   @ViewChild('nameTpl')
   nameTpl: TemplateRef<any>;
+  @ViewChild('scheduleTpl', { static: true })
+  scheduleTpl: TemplateRef<any>;
   @ViewChild('mirroringTpl', { static: true })
   mirroringTpl: TemplateRef<any>;
   @ViewChild('flattenTpl', { static: true })
   @ViewChild('mirroringTpl', { static: true })
   mirroringTpl: TemplateRef<any>;
   @ViewChild('flattenTpl', { static: true })
@@ -305,6 +307,13 @@ export class RbdListComponent extends ListWithDetails implements OnInit {
         flexGrow: 3,
         sortable: false,
         cellTemplate: this.mirroringTpl
         flexGrow: 3,
         sortable: false,
         cellTemplate: this.mirroringTpl
+      },
+      {
+        name: $localize`Next Scheduled Snapshot`,
+        prop: 'mirror_mode',
+        flexGrow: 3,
+        sortable: false,
+        cellTemplate: this.scheduleTpl
       }
     ];
 
       }
     ];
 
@@ -549,6 +558,7 @@ export class RbdListComponent extends ListWithDetails implements OnInit {
   actionPrimary(primary: boolean) {
     const request = new RbdFormEditRequestModel();
     request.primary = primary;
   actionPrimary(primary: boolean) {
     const request = new RbdFormEditRequestModel();
     request.primary = primary;
+    request.features = null;
     const imageSpec = new ImageSpec(
       this.selection.first().pool_name,
       this.selection.first().namespace,
     const imageSpec = new ImageSpec(
       this.selection.first().pool_name,
       this.selection.first().namespace,
index 9d76cba095fe1ab068fdee146b44693053649443..0c7edccc30f86405f7e3e90a9454c0fde364f85d 100644 (file)
@@ -24,7 +24,7 @@
                    *ngIf="!poolPermission.read">
             <select id="pool"
                     name="pool"
                    *ngIf="!poolPermission.read">
             <select id="pool"
                     name="pool"
-                    class="form-control"
+                    class="form-select"
                     formControlName="pool"
                     *ngIf="poolPermission.read">
               <option *ngIf="pools === null"
                     formControlName="pool"
                     *ngIf="poolPermission.read">
               <option *ngIf="pools === null"
index e8116ea2a86d2b3af772b5bcc9cd2237ab752ab6..01f69dcbcebd4f4876d6723c7480b1c19c744fc7 100644 (file)
@@ -1,6 +1,8 @@
 <cd-rbd-tabs></cd-rbd-tabs>
 
 <cd-rbd-tabs></cd-rbd-tabs>
 
-<cd-grafana [grafanaPath]="'rbd-overview?'"
+<cd-grafana i18n-title
+            title="RBD overview"
+            [grafanaPath]="'rbd-overview?'"
             [type]="'metrics'"
             uid="41FrpeUiz"
             grafanaStyle="two">
             [type]="'metrics'"
             uid="41FrpeUiz"
             grafanaStyle="two">
index ca72007ee81e5b973d5b6dd852318b488d895dc0..c4cd791e595967c18cc331f69a167877ea307aef 100644 (file)
@@ -8,6 +8,7 @@ import { MockComponent } from 'ng-mocks';
 import { ToastrModule } from 'ngx-toastr';
 import { Subject, throwError as observableThrowError } from 'rxjs';
 
 import { ToastrModule } from 'ngx-toastr';
 import { Subject, throwError as observableThrowError } from 'rxjs';
 
+import { RbdMirroringService } from '~/app/shared/api/rbd-mirroring.service';
 import { RbdService } from '~/app/shared/api/rbd.service';
 import { ComponentsModule } from '~/app/shared/components/components.module';
 import { CriticalConfirmationModalComponent } from '~/app/shared/components/critical-confirmation-modal/critical-confirmation-modal.component';
 import { RbdService } from '~/app/shared/api/rbd.service';
 import { ComponentsModule } from '~/app/shared/components/components.module';
 import { CriticalConfirmationModalComponent } from '~/app/shared/components/critical-confirmation-modal/critical-confirmation-modal.component';
@@ -85,6 +86,7 @@ describe('RbdSnapshotListComponent', () => {
   describe('api delete request', () => {
     let called: boolean;
     let rbdService: RbdService;
   describe('api delete request', () => {
     let called: boolean;
     let rbdService: RbdService;
+    let rbdMirroringService: RbdMirroringService;
     let notificationService: NotificationService;
     let authStorageService: AuthStorageService;
 
     let notificationService: NotificationService;
     let authStorageService: AuthStorageService;
 
@@ -93,6 +95,7 @@ describe('RbdSnapshotListComponent', () => {
       const modalService = TestBed.inject(ModalService);
       const actionLabelsI18n = TestBed.inject(ActionLabelsI18n);
       called = false;
       const modalService = TestBed.inject(ModalService);
       const actionLabelsI18n = TestBed.inject(ActionLabelsI18n);
       called = false;
+      rbdMirroringService = new RbdMirroringService(null, null);
       rbdService = new RbdService(null, null);
       notificationService = new NotificationService(null, null, null);
       authStorageService = new AuthStorageService();
       rbdService = new RbdService(null, null);
       notificationService = new NotificationService(null, null, null);
       authStorageService = new AuthStorageService();
@@ -103,6 +106,7 @@ describe('RbdSnapshotListComponent', () => {
         null,
         null,
         rbdService,
         null,
         null,
         rbdService,
+        rbdMirroringService,
         null,
         notificationService,
         null,
         null,
         notificationService,
         null,
index df66b0e8842ae01dd96e61d657e635cbbc8626c4..da09add65a31abd09ef1b208a3065e9c03e518af 100644 (file)
@@ -13,6 +13,7 @@ import { NgbModalRef } from '@ng-bootstrap/ng-bootstrap';
 import moment from 'moment';
 import { of } from 'rxjs';
 
 import moment from 'moment';
 import { of } from 'rxjs';
 
+import { RbdMirroringService } from '~/app/shared/api/rbd-mirroring.service';
 import { RbdService } from '~/app/shared/api/rbd.service';
 import { CdHelperClass } from '~/app/shared/classes/cd-helper.class';
 import { ConfirmationModalComponent } from '~/app/shared/components/confirmation-modal/confirmation-modal.component';
 import { RbdService } from '~/app/shared/api/rbd.service';
 import { CdHelperClass } from '~/app/shared/classes/cd-helper.class';
 import { ConfirmationModalComponent } from '~/app/shared/components/confirmation-modal/confirmation-modal.component';
@@ -58,6 +59,8 @@ export class RbdSnapshotListComponent implements OnInit, OnChanges {
   @Input()
   mirroring: string;
   @Input()
   @Input()
   mirroring: string;
   @Input()
+  primary: boolean;
+  @Input()
   rbdName: string;
   @ViewChild('nameTpl')
   nameTpl: TemplateRef<any>;
   rbdName: string;
   @ViewChild('nameTpl')
   nameTpl: TemplateRef<any>;
@@ -76,6 +79,8 @@ export class RbdSnapshotListComponent implements OnInit, OnChanges {
 
   modalRef: NgbModalRef;
 
 
   modalRef: NgbModalRef;
 
+  peerConfigured = false;
+
   builders = {
     'rbd/snap/create': (metadata: any) => {
       const model = new RbdSnapshotModel();
   builders = {
     'rbd/snap/create': (metadata: any) => {
       const model = new RbdSnapshotModel();
@@ -90,6 +95,7 @@ export class RbdSnapshotListComponent implements OnInit, OnChanges {
     private dimlessBinaryPipe: DimlessBinaryPipe,
     private cdDatePipe: CdDatePipe,
     private rbdService: RbdService,
     private dimlessBinaryPipe: DimlessBinaryPipe,
     private cdDatePipe: CdDatePipe,
     private rbdService: RbdService,
+    private rbdMirrorService: RbdMirroringService,
     private taskManagerService: TaskManagerService,
     private notificationService: NotificationService,
     private summaryService: SummaryService,
     private taskManagerService: TaskManagerService,
     private notificationService: NotificationService,
     private summaryService: SummaryService,
@@ -142,12 +148,20 @@ export class RbdSnapshotListComponent implements OnInit, OnChanges {
       }
     ];
 
       }
     ];
 
+    this.rbdMirrorService.getPeerForPool(this.poolName).subscribe((resp: any) => {
+      if (resp.length > 0) {
+        this.peerConfigured = true;
+      }
+    });
+
     this.imageSpec = new ImageSpec(this.poolName, this.namespace, this.rbdName);
     this.rbdTableActions = new RbdSnapshotActionsModel(
       this.actionLabels,
       this.featuresName,
       this.rbdService
     );
     this.imageSpec = new ImageSpec(this.poolName, this.namespace, this.rbdName);
     this.rbdTableActions = new RbdSnapshotActionsModel(
       this.actionLabels,
       this.featuresName,
       this.rbdService
     );
+    this.rbdTableActions.create.disable = () =>
+      !this.primary || (!this.peerConfigured && this.mirroring === 'snapshot');
     this.rbdTableActions.create.click = () => this.openCreateSnapshotModal();
     this.rbdTableActions.rename.click = () => this.openEditSnapshotModal();
     this.rbdTableActions.protect.click = () => this.toggleProtection();
     this.rbdTableActions.create.click = () => this.openCreateSnapshotModal();
     this.rbdTableActions.rename.click = () => this.openEditSnapshotModal();
     this.rbdTableActions.protect.click = () => this.toggleProtection();
index 657568c2230cc889434a3be8ddb4ebcbbf30aeae..e11beb9bd5e68a7452db9c1cd0c6007f1dde07d2 100644 (file)
@@ -1,23 +1,35 @@
-<ul ngbNav
-    #nav="ngbNav"
-    [activeId]="router.url"
-    (navChange)="router.navigate([$event.nextId])"
-    class="nav-tabs">
-  <li ngbNavItem="/block/rbd">
-    <a ngbNavLink
+<ul class="nav nav-tabs">
+  <li class="nav-item">
+    <a class="nav-link"
+       routerLink="/block/rbd"
+       routerLinkActive="active"
+       ariaCurrentWhenActive="page"
+       [routerLinkActiveOptions]="{exact: true}"
        i18n>Images</a>
   </li>
        i18n>Images</a>
   </li>
-  <li ngbNavItem="/block/rbd/namespaces">
-    <a ngbNavLink
+  <li class="nav-item">
+    <a class="nav-link"
+       routerLink="/block/rbd/namespaces"
+       routerLinkActive="active"
+       ariaCurrentWhenActive="page"
+       [routerLinkActiveOptions]="{exact: true}"
        i18n>Namespaces</a>
   </li>
        i18n>Namespaces</a>
   </li>
-  <li ngbNavItem="/block/rbd/trash">
-    <a ngbNavLink
+  <li class="nav-item">
+    <a class="nav-link"
+       routerLink="/block/rbd/trash"
+       routerLinkActive="active"
+       ariaCurrentWhenActive="page"
+       [routerLinkActiveOptions]="{exact: true}"
        i18n>Trash</a>
   </li>
        i18n>Trash</a>
   </li>
-  <li ngbNavItem="/block/rbd/performance"
+  <li class="nav-item"
       *ngIf="grafanaPermission.read">
       *ngIf="grafanaPermission.read">
-    <a ngbNavLink
+    <a class="nav-link"
+       routerLink="/block/rbd/performance"
+       routerLinkActive="active"
+       ariaCurrentWhenActive="page"
+       [routerLinkActiveOptions]="{exact: true}"
        i18n>Overall Performance</a>
   </li>
 </ul>
        i18n>Overall Performance</a>
   </li>
 </ul>
index 056cb1764583c7f3729863cf55796285cc210c42..a9a57bfcdbcf5accc1237a826b7af109272d1afd 100644 (file)
@@ -1,5 +1,4 @@
 import { Component } from '@angular/core';
 import { Component } from '@angular/core';
-import { Router } from '@angular/router';
 
 import { Permission } from '~/app/shared/models/permissions';
 import { AuthStorageService } from '~/app/shared/services/auth-storage.service';
 
 import { Permission } from '~/app/shared/models/permissions';
 import { AuthStorageService } from '~/app/shared/services/auth-storage.service';
@@ -13,7 +12,7 @@ export class RbdTabsComponent {
   grafanaPermission: Permission;
   url: string;
 
   grafanaPermission: Permission;
   url: string;
 
-  constructor(private authStorageService: AuthStorageService, public router: Router) {
+  constructor(private authStorageService: AuthStorageService) {
     this.grafanaPermission = this.authStorageService.getPermissions().grafana;
   }
 }
     this.grafanaPermission = this.authStorageService.getPermissions().grafana;
   }
 }
index c1d33d8e0d243543429364674dfac62cf97ee055..64011a5263e945bce295132b0d6bf865d219655b 100644 (file)
@@ -32,7 +32,8 @@
 <ng-template #poolUsageTpl
              let-row="row">
   <cd-usage-bar [total]="row.size"
 <ng-template #poolUsageTpl
              let-row="row">
   <cd-usage-bar [total]="row.size"
-                [used]="row.used"></cd-usage-bar>
+                [used]="row.used"
+                [title]="row.pool_name"></cd-usage-bar>
 </ng-template>
 
 <ng-template #activityTmpl
 </ng-template>
 
 <ng-template #activityTmpl
index 1d4b2ece85b3affcba16e598c1bcd526ead285c2..ce6cc71c5ea498518bd8f6a7feb02ba3afb815e9 100644 (file)
@@ -1,5 +1,5 @@
 <div class="row">
 <div class="row">
-  <div class="col-sm-4 pr-0">
+  <div class="col-sm-4 pe-0">
     <div class="card">
       <div class="card-header">
         <button type="button"
     <div class="card">
       <div class="card-header">
         <button type="button"
index c2528f7c4511ed1f6980da5fc64b43a81a3863a8..4ae8a159a0559111fa49c1f3164772733f58cfcd 100644 (file)
@@ -1,5 +1,5 @@
 import { Component, Input, OnChanges, OnInit, TemplateRef, ViewChild } from '@angular/core';
 import { Component, Input, OnChanges, OnInit, TemplateRef, ViewChild } from '@angular/core';
-import { Validators } from '@angular/forms';
+import { AbstractControl, Validators } from '@angular/forms';
 
 import {
   ITreeOptions,
 
 import {
   ITreeOptions,
@@ -103,6 +103,7 @@ export class CephfsDirectoriesComponent implements OnInit, OnChanges {
     updateSelection: Function;
   };
   nodes: any[];
     updateSelection: Function;
   };
   nodes: any[];
+  alreadyExists: boolean;
 
   constructor(
     private authStorageService: AuthStorageService,
 
   constructor(
     private authStorageService: AuthStorageService,
@@ -546,22 +547,34 @@ export class CephfsDirectoriesComponent implements OnInit, OnChanges {
           type: 'text',
           name: 'name',
           value: `${moment().toISOString(true)}`,
           type: 'text',
           name: 'name',
           value: `${moment().toISOString(true)}`,
-          required: true
+          required: true,
+          validators: [this.validateValue.bind(this)]
         }
       ],
       submitButtonText: $localize`Create Snapshot`,
       onSubmit: (values: CephfsSnapshot) => {
         }
       ],
       submitButtonText: $localize`Create Snapshot`,
       onSubmit: (values: CephfsSnapshot) => {
-        this.cephfsService.mkSnapshot(this.id, path, values.name).subscribe((name) => {
+        if (!this.alreadyExists) {
+          this.cephfsService.mkSnapshot(this.id, path, values.name).subscribe((name) => {
+            this.notificationService.show(
+              NotificationType.success,
+              $localize`Created snapshot '${name}' for '${path}'`
+            );
+            this.forceDirRefresh();
+          });
+        } else {
           this.notificationService.show(
           this.notificationService.show(
-            NotificationType.success,
-            $localize`Created snapshot '${name}' for '${path}'`
+            NotificationType.error,
+            $localize`Snapshot name '${values.name}' is already in use. Please use another name.`
           );
           );
-          this.forceDirRefresh();
-        });
+        }
       }
     });
   }
 
       }
     });
   }
 
+  validateValue(control: AbstractControl) {
+    this.alreadyExists = this.selectedDir.snapshots.some((s) => s.name === control.value);
+  }
+
   /**
    * Forces an update of the current selected directory
    *
   /**
    * Forces an update of the current selected directory
    *
index 830645d2b6fca0a2a43c5f483254f14b8313c7b9..b8db2e6b327be19a9908de9da6fb8d3894a24349 100644 (file)
@@ -1,21 +1,21 @@
 <ng-container *ngIf="selection">
 <ng-container *ngIf="selection">
-  <ul ngbNav
-      #nav="ngbNav"
-      (navChange)="softRefresh()"
-      class="nav-tabs"
-      cdStatefulTab="cephfs-tabs">
-    <li ngbNavItem="details">
+  <nav ngbNav
+       #nav="ngbNav"
+       (navChange)="softRefresh()"
+       class="nav-tabs"
+       cdStatefulTab="cephfs-tabs">
+    <ng-container ngbNavItem="details">
       <a ngbNavLink
          i18n>Details</a>
       <ng-template ngbNavContent>
         <cd-cephfs-detail [data]="details">
         </cd-cephfs-detail>
       </ng-template>
       <a ngbNavLink
          i18n>Details</a>
       <ng-template ngbNavContent>
         <cd-cephfs-detail [data]="details">
         </cd-cephfs-detail>
       </ng-template>
-    </li>
-    <li ngbNavItem="clients">
+    </ng-container>
+    <ng-container ngbNavItem="clients">
       <a ngbNavLink>
         <ng-container i18n>Clients</ng-container>
       <a ngbNavLink>
         <ng-container i18n>Clients</ng-container>
-        <span class="badge badge-pill badge-tab ml-1">{{ clients.data.length }}</span>
+        <span class="badge badge-pill badge-tab ms-1">{{ clients.data.length }}</span>
       </a>
       <ng-template ngbNavContent>
         <cd-cephfs-clients [id]="id"
       </a>
       <ng-template ngbNavContent>
         <cd-cephfs-clients [id]="id"
                            (triggerApiUpdate)="refresh()">
         </cd-cephfs-clients>
       </ng-template>
                            (triggerApiUpdate)="refresh()">
         </cd-cephfs-clients>
       </ng-template>
-    </li>
-    <li ngbNavItem="directories">
+    </ng-container>
+    <ng-container ngbNavItem="directories">
       <a ngbNavLink
          i18n>Directories</a>
       <ng-template ngbNavContent>
         <cd-cephfs-directories [id]="id"></cd-cephfs-directories>
       </ng-template>
       <a ngbNavLink
          i18n>Directories</a>
       <ng-template ngbNavContent>
         <cd-cephfs-directories [id]="id"></cd-cephfs-directories>
       </ng-template>
-    </li>
-    <li ngbNavItem="performance-details">
+    </ng-container>
+    <ng-container ngbNavItem="performance-details">
       <a ngbNavLink
          i18n>Performance Details</a>
       <ng-template ngbNavContent>
       <a ngbNavLink
          i18n>Performance Details</a>
       <ng-template ngbNavContent>
-        <cd-grafana [grafanaPath]="'mds-performance?var-mds_servers=mds.' + grafanaId"
+        <cd-grafana i18n-title
+                    title="CephFS MDS performance"
+                    [grafanaPath]="'mds-performance?var-mds_servers=mds.' + grafanaId"
                     [type]="'metrics'"
                     uid="tbO9LAiZz"
                     grafanaStyle="one">
         </cd-grafana>
       </ng-template>
                     [type]="'metrics'"
                     uid="tbO9LAiZz"
                     grafanaStyle="one">
         </cd-grafana>
       </ng-template>
-    </li>
-  </ul>
+    </ng-container>
+  </nav>
 
   <div [ngbNavOutlet]="nav"></div>
 </ng-container>
 
   <div [ngbNavOutlet]="nav"></div>
 </ng-container>
index 8debf9dc66bc5fb2e5ae487e4db04f139d6998eb..13bb16c9cead6a9a3dcb1ac61e4af615273bf618 100755 (executable)
@@ -56,7 +56,7 @@
         <td>
           <span *ngFor="let flag of selection.flags">
             <span title="{{ flags[flag] }}">
         <td>
           <span *ngFor="let flag of selection.flags">
             <span title="{{ flags[flag] }}">
-              <span class="badge badge-dark mr-2">{{ flag | uppercase }}</span>
+              <span class="badge badge-dark me-2">{{ flag | uppercase }}</span>
             </span>
           </span>
         </td>
             </span>
           </span>
         </td>
@@ -66,7 +66,7 @@
             class="bold">Services</td>
         <td>
           <span *ngFor="let service of selection.services">
             class="bold">Services</td>
         <td>
           <span *ngFor="let service of selection.services">
-            <span class="badge badge-dark mr-2">{{ service }}</span>
+            <span class="badge badge-dark me-2">{{ service }}</span>
           </span>
         </td>
       </tr>
           </span>
         </td>
       </tr>
index 72c71794257f008100d7b8399d8979ce7f239432..741c18d52a610e10ae0f6f9cb39871eb99719fe1 100644 (file)
               <div class="cd-col-form-input">
                 <select id="pool"
                         name="pool"
               <div class="cd-col-form-input">
                 <select id="pool"
                         name="pool"
-                        class="form-control"
+                        class="form-select"
                         [formControlName]="section">
                   <option [ngValue]="null"
                           i18n>-- Default --</option>
                         [formControlName]="section">
                   <option [ngValue]="null"
                           i18n>-- Default --</option>
index 23fab84ccc0f7e85de33486e0dc9b1c328b63943..6ec2dac45cc1f483f8cd62bb44a3efbceea29ccb 100644 (file)
@@ -1,7 +1,6 @@
 import { HttpClientTestingModule } from '@angular/common/http/testing';
 import { ComponentFixture, TestBed } from '@angular/core/testing';
 import { ReactiveFormsModule } from '@angular/forms';
 import { HttpClientTestingModule } from '@angular/common/http/testing';
 import { ComponentFixture, TestBed } from '@angular/core/testing';
 import { ReactiveFormsModule } from '@angular/forms';
-import { ActivatedRoute } from '@angular/router';
 import { RouterTestingModule } from '@angular/router/testing';
 
 import { ToastrModule } from 'ngx-toastr';
 import { RouterTestingModule } from '@angular/router/testing';
 
 import { ToastrModule } from 'ngx-toastr';
@@ -23,12 +22,7 @@ describe('ConfigurationFormComponent', () => {
       ToastrModule.forRoot(),
       SharedModule
     ],
       ToastrModule.forRoot(),
       SharedModule
     ],
-    declarations: [ConfigurationFormComponent],
-    providers: [
-      {
-        provide: ActivatedRoute
-      }
-    ]
+    declarations: [ConfigurationFormComponent]
   });
 
   beforeEach(() => {
   });
 
   beforeEach(() => {
index 82429e6dda4e27ce96a1236694c379422a4435d1..d738c4f2ca52b4e30ca8a4ebf432397a85fc147c 100644 (file)
@@ -12,7 +12,7 @@
       <div class="m-4">
         <h4 class="text-center"
             i18n>Please expand your cluster first</h4>
       <div class="m-4">
         <h4 class="text-center"
             i18n>Please expand your cluster first</h4>
-        <div class="offset-md-2">
+        <div class="text-center">
           <button class="btn btn-accent m-2"
                   name="expand-cluster"
                   (click)="createCluster()"
           <button class="btn btn-accent m-2"
                   name="expand-cluster"
                   (click)="createCluster()"
@@ -38,7 +38,7 @@
     <div class="card-body vertical-line">
       <ng-container [ngSwitch]="currentStep?.stepIndex">
         <div *ngSwitchCase="'1'"
     <div class="card-body vertical-line">
       <ng-container [ngSwitch]="currentStep?.stepIndex">
         <div *ngSwitchCase="'1'"
-             class="ml-5">
+             class="ms-5">
           <h4 class="title"
               i18n>Add Hosts</h4>
           <br>
           <h4 class="title"
               i18n>Add Hosts</h4>
           <br>
@@ -48,7 +48,7 @@
                     [showGeneralActionsOnly]="true"></cd-hosts>
         </div>
         <div *ngSwitchCase="'2'"
                     [showGeneralActionsOnly]="true"></cd-hosts>
         </div>
         <div *ngSwitchCase="'2'"
-             class="ml-5">
+             class="ms-5">
           <h4 class="title"
               i18n>Create OSDs</h4>
           <div class="alignForm">
           <h4 class="title"
               i18n>Create OSDs</h4>
           <div class="alignForm">
@@ -60,7 +60,7 @@
           </div>
         </div>
         <div *ngSwitchCase="'3'"
           </div>
         </div>
         <div *ngSwitchCase="'3'"
-             class="ml-5">
+             class="ms-5">
           <h4 class="title"
               i18n>Create Services</h4>
           <br>
           <h4 class="title"
               i18n>Create Services</h4>
           <br>
                        [routedModal]="false"></cd-services>
         </div>
         <div *ngSwitchCase="'4'"
                        [routedModal]="false"></cd-services>
         </div>
         <div *ngSwitchCase="'4'"
-             class="ml-5">
+             class="ms-5">
           <cd-create-cluster-review></cd-create-cluster-review>
         </div>
       </ng-container>
     </div>
   </div>
   <div class="card-footer">
           <cd-create-cluster-review></cd-create-cluster-review>
         </div>
       </ng-container>
     </div>
   </div>
   <div class="card-footer">
-    <button class="btn btn-accent m-2 float-right"
+    <button class="btn btn-accent m-2 float-end"
             (click)="onNextStep()"
             aria-label="Next"
             i18n>{{ showSubmitButtonLabel() }}</button>
             (click)="onNextStep()"
             aria-label="Next"
             i18n>{{ showSubmitButtonLabel() }}</button>
-    <cd-back-button class="m-2 float-right"
+    <cd-back-button class="m-2 float-end"
                     aria-label="Close"
                     (backAction)="onPreviousStep()"
                     [name]="showCancelButtonLabel()"></cd-back-button>
                     aria-label="Close"
                     (backAction)="onPreviousStep()"
                     [name]="showCancelButtonLabel()"></cd-back-button>
index 5803776d0aaefb28813c17accc2495a01386f7d7..386d5b3c99b8b825a9bb0174155ca7017244ea17 100644 (file)
@@ -1,25 +1,25 @@
 <ng-container *ngIf="selection">
 <ng-container *ngIf="selection">
-  <ul ngbNav
-      #nav="ngbNav"
-      class="nav-tabs"
-      cdStatefulTab="host-details">
-    <li ngbNavItem="devices">
+  <nav ngbNav
+       #nav="ngbNav"
+       class="nav-tabs"
+       cdStatefulTab="host-details">
+    <ng-container ngbNavItem="devices">
       <a ngbNavLink
          i18n>Devices</a>
       <ng-template ngbNavContent>
         <cd-device-list [hostname]="selection['hostname']"></cd-device-list>
       </ng-template>
       <a ngbNavLink
          i18n>Devices</a>
       <ng-template ngbNavContent>
         <cd-device-list [hostname]="selection['hostname']"></cd-device-list>
       </ng-template>
-    </li>
-    <li ngbNavItem="inventory"
-        *ngIf="permissions.hosts.read">
+    </ng-container>
+    <ng-container ngbNavItem="inventory"
+                  *ngIf="permissions.hosts.read">
       <a ngbNavLink
          i18n>Physical Disks</a>
       <ng-template ngbNavContent>
         <cd-inventory [hostname]="selectedHostname"></cd-inventory>
       </ng-template>
       <a ngbNavLink
          i18n>Physical Disks</a>
       <ng-template ngbNavContent>
         <cd-inventory [hostname]="selectedHostname"></cd-inventory>
       </ng-template>
-    </li>
-    <li ngbNavItem="daemons"
-        *ngIf="permissions.hosts.read">
+    </ng-container>
+    <ng-container ngbNavItem="daemons"
+                  *ngIf="permissions.hosts.read">
       <a ngbNavLink
          i18n>Daemons</a>
       <ng-template ngbNavContent>
       <a ngbNavLink
          i18n>Daemons</a>
       <ng-template ngbNavContent>
                                 [hiddenColumns]="['hostname']">
         </cd-service-daemon-list>
       </ng-template>
                                 [hiddenColumns]="['hostname']">
         </cd-service-daemon-list>
       </ng-template>
-    </li>
-    <li ngbNavItem="performance-details"
-        *ngIf="permissions.grafana.read">
+    </ng-container>
+    <ng-container ngbNavItem="performance-details"
+                  *ngIf="permissions.grafana.read">
       <a ngbNavLink
          i18n>Performance Details</a>
       <ng-template ngbNavContent>
       <a ngbNavLink
          i18n>Performance Details</a>
       <ng-template ngbNavContent>
-        <cd-grafana [grafanaPath]="'host-details?var-ceph_hosts=' + selectedHostname"
+        <cd-grafana i18n-title
+                    title="Host details"
+                    [grafanaPath]="'host-details?var-ceph_hosts=' + selectedHostname"
                     [type]="'metrics'"
                     uid="rtOg0AiWz"
                     grafanaStyle="four">
         </cd-grafana>
       </ng-template>
                     [type]="'metrics'"
                     uid="rtOg0AiWz"
                     grafanaStyle="four">
         </cd-grafana>
       </ng-template>
-    </li>
-    <li ngbNavItem="device-health">
+    </ng-container>
+    <ng-container ngbNavItem="device-health">
       <a ngbNavLink
          i18n>Device health</a>
       <ng-template ngbNavContent>
         <cd-smart-list *ngIf="selectedHostname; else noHostname"
                        [hostname]="selectedHostname"></cd-smart-list>
       </ng-template>
       <a ngbNavLink
          i18n>Device health</a>
       <ng-template ngbNavContent>
         <cd-smart-list *ngIf="selectedHostname; else noHostname"
                        [hostname]="selectedHostname"></cd-smart-list>
       </ng-template>
-    </li>
-  </ul>
+    </ng-container>
+  </nav>
 
   <div [ngbNavOutlet]="nav"></div>
 </ng-container>
 
   <div [ngbNavOutlet]="nav"></div>
 </ng-container>
index b8a17135af4379336f6f6c00176e0769e7d534c7..69a942e56d2854577d7b829f388a02aac7999bb5 100644 (file)
@@ -1,7 +1,7 @@
-<ul ngbNav
-    #nav="ngbNav"
-    class="nav-tabs">
-  <li ngbNavItem>
+<nav ngbNav
+     #nav="ngbNav"
+     class="nav-tabs">
+  <ng-container ngbNavItem>
     <a ngbNavLink
        i18n>Hosts List</a>
     <ng-template ngbNavContent>
     <a ngbNavLink
        i18n>Hosts List</a>
     <ng-template ngbNavContent>
         </cd-host-details>
       </cd-table>
     </ng-template>
         </cd-host-details>
       </cd-table>
     </ng-template>
-  </li>
-  <li ngbNavItem
-      *ngIf="permissions.grafana.read">
+  </ng-container>
+  <ng-container ngbNavItem
+                *ngIf="permissions.grafana.read">
+  </ng-container>
+  <ng-container ngbNavItem
+                *ngIf="permissions.grafana.read">
     <a ngbNavLink
        i18n>Overall Performance</a>
     <ng-template ngbNavContent>
     <a ngbNavLink
        i18n>Overall Performance</a>
     <ng-template ngbNavContent>
-      <cd-grafana [grafanaPath]="'host-overview?'"
+      <cd-grafana i18n-title
+                  title="Host overview"
+                  [grafanaPath]="'host-overview?'"
                   [type]="'metrics'"
                   uid="y0KGL0iZz"
                   grafanaStyle="two">
       </cd-grafana>
     </ng-template>
                   [type]="'metrics'"
                   uid="y0KGL0iZz"
                   grafanaStyle="two">
       </cd-grafana>
     </ng-template>
-  </li>
-</ul>
+  </ng-container>
+</nav>
 
 <div [ngbNavOutlet]="nav"></div>
 
 <ng-template #servicesTpl
 
 <div [ngbNavOutlet]="nav"></div>
 
 <ng-template #servicesTpl
-             let-value="value">
-  <span *ngFor="let instance of value; last as isLast">
-    <span class="badge badge-background-primary" >{{ instance }}</span>
-    <ng-container *ngIf="!isLast">&nbsp;</ng-container>
+             let-services="value">
+  <span *ngFor="let service of services">
+    <cd-label [key]="service['type']"
+              [value]="service['count']"
+              class="me-1"></cd-label>
   </span>
 </ng-template>
 
 <ng-template #maintenanceConfirmTpl>
   <div *ngFor="let msg of errorMessage; let last=last">
   </span>
 </ng-template>
 
 <ng-template #maintenanceConfirmTpl>
   <div *ngFor="let msg of errorMessage; let last=last">
-    <ul *ngIf="!last || errorMessage.length == '1'">
+    <ul *ngIf="!last || errorMessage.length === '1'">
       <li i18n>{{ msg }}</li>
     </ul>
   </div>
       <li i18n>{{ msg }}</li>
     </ul>
   </div>
index 0d691f62acfd826d19541182b228709e3ee4aaa3..03a61e0834d034c2f2ca1d1edd3e90e935f307e8 100644 (file)
@@ -121,30 +121,18 @@ describe('HostsComponent', () => {
     const hostname = 'ceph.dev';
     const payload = [
       {
     const hostname = 'ceph.dev';
     const payload = [
       {
-        services: [
-          {
-            type: 'mgr',
-            id: 'x'
-          },
+        service_instances: [
           {
             type: 'mgr',
           {
             type: 'mgr',
-            id: 'y'
+            count: 2
           },
           {
             type: 'osd',
           },
           {
             type: 'osd',
-            id: '0'
-          },
-          {
-            type: 'osd',
-            id: '1'
-          },
-          {
-            type: 'osd',
-            id: '2'
+            count: 3
           },
           {
             type: 'rgw',
           },
           {
             type: 'rgw',
-            id: 'rgw'
+            count: 1
           }
         ],
         hostname: hostname,
           }
         ],
         hostname: hostname,
index 73459a364d50ef2dba6c60c7d233cce3d0818cde..6089965fc748762ebb7b68bbeb6a4fee64080e57 100644 (file)
@@ -3,8 +3,8 @@ import { Router } from '@angular/router';
 
 import { NgbModalRef } from '@ng-bootstrap/ng-bootstrap';
 import _ from 'lodash';
 
 import { NgbModalRef } from '@ng-bootstrap/ng-bootstrap';
 import _ from 'lodash';
-import { Observable, Subscription } from 'rxjs';
-import { map, mergeMap } from 'rxjs/operators';
+import { Subscription } from 'rxjs';
+import { mergeMap } from 'rxjs/operators';
 
 import { HostService } from '~/app/shared/api/host.service';
 import { OrchestratorService } from '~/app/shared/api/orchestrator.service';
 
 import { HostService } from '~/app/shared/api/host.service';
 import { OrchestratorService } from '~/app/shared/api/orchestrator.service';
@@ -22,7 +22,6 @@ import { CdTableAction } from '~/app/shared/models/cd-table-action';
 import { CdTableColumn } from '~/app/shared/models/cd-table-column';
 import { CdTableFetchDataContext } from '~/app/shared/models/cd-table-fetch-data-context';
 import { CdTableSelection } from '~/app/shared/models/cd-table-selection';
 import { CdTableColumn } from '~/app/shared/models/cd-table-column';
 import { CdTableFetchDataContext } from '~/app/shared/models/cd-table-fetch-data-context';
 import { CdTableSelection } from '~/app/shared/models/cd-table-selection';
-import { Daemon } from '~/app/shared/models/daemon.interface';
 import { FinishedTask } from '~/app/shared/models/finished-task';
 import { OrchestratorFeature } from '~/app/shared/models/orchestrator.enum';
 import { OrchestratorStatus } from '~/app/shared/models/orchestrator.interface';
 import { FinishedTask } from '~/app/shared/models/finished-task';
 import { OrchestratorFeature } from '~/app/shared/models/orchestrator.enum';
 import { OrchestratorStatus } from '~/app/shared/models/orchestrator.interface';
@@ -199,7 +198,7 @@ export class HostsComponent extends ListWithDetails implements OnDestroy, OnInit
       {
         name: $localize`Service Instances`,
         prop: 'service_instances',
       {
         name: $localize`Service Instances`,
         prop: 'service_instances',
-        flexGrow: 1,
+        flexGrow: 1.5,
         cellTemplate: this.servicesTpl
       },
       {
         cellTemplate: this.servicesTpl
       },
       {
@@ -214,7 +213,7 @@ export class HostsComponent extends ListWithDetails implements OnDestroy, OnInit
       {
         name: $localize`Status`,
         prop: 'status',
       {
         name: $localize`Status`,
         prop: 'status',
-        flexGrow: 1,
+        flexGrow: 0.8,
         cellTransformation: CellTemplate.badge,
         customTemplateConfig: {
           map: {
         cellTransformation: CellTemplate.badge,
         customTemplateConfig: {
           map: {
@@ -491,37 +490,7 @@ export class HostsComponent extends ListWithDetails implements OnDestroy, OnInit
           this.orchStatus = orchStatus;
           const factsAvailable = this.checkHostsFactsAvailable();
           return this.hostService.list(`${factsAvailable}`);
           this.orchStatus = orchStatus;
           const factsAvailable = this.checkHostsFactsAvailable();
           return this.hostService.list(`${factsAvailable}`);
-        }),
-        map((hostList: object[]) =>
-          hostList.map((host) => {
-            const counts = {};
-            host['service_instances'] = new Set<string>();
-            if (this.orchStatus?.available) {
-              let daemons: Daemon[] = [];
-              let observable: Observable<Daemon[]>;
-              observable = this.hostService.getDaemons(host['hostname']);
-              observable.subscribe((dmns: Daemon[]) => {
-                daemons = dmns;
-                daemons.forEach((daemon: any) => {
-                  counts[daemon.daemon_type] = (counts[daemon.daemon_type] || 0) + 1;
-                });
-                daemons.map((daemon: any) => {
-                  host['service_instances'].add(
-                    `${daemon.daemon_type}: ${counts[daemon.daemon_type]}`
-                  );
-                });
-              });
-            } else {
-              host['services'].forEach((service: any) => {
-                counts[service.type] = (counts[service.type] || 0) + 1;
-              });
-              host['services'].map((service: any) => {
-                host['service_instances'].add(`${service.type}: ${counts[service.type]}`);
-              });
-            }
-            return host;
-          })
-        )
+        })
       )
       .subscribe(
         (hostList) => {
       )
       .subscribe(
         (hostList) => {
index 29a3ece96d8ae6c695283f5ea3610ef9d368ede9..b67adb2a43d86c62a8137ff5b5d1f02eaa86a41f 100644 (file)
@@ -105,7 +105,7 @@ describe('InventoryDevicesComponent', () => {
       tableActions.forEach((action) => {
         const actionElement = tableActionElement.query(By.css('button'));
         actions[action.name] = {
       tableActions.forEach((action) => {
         const actionElement = tableActionElement.query(By.css('button'));
         actions[action.name] = {
-          disabled: actionElement.classes.disabled,
+          disabled: actionElement.classes.disabled ? true : false,
           disableDesc: actionElement.properties.title
         };
       });
           disableDesc: actionElement.properties.title
         };
       });
index e0d82cb1975db7e749cdb6c9bfe7bfe020b3fcc5..0ef0449c48126dfd762e57b02b3b3ca5970ef278 100644 (file)
@@ -47,6 +47,10 @@ export class InventoryDevicesComponent implements OnInit, OnDestroy {
   // Do not display these columns
   @Input() hiddenColumns: string[] = [];
 
   // Do not display these columns
   @Input() hiddenColumns: string[] = [];
 
+  @Input() hostname = '';
+
+  @Input() diskType = '';
+
   // Show filters for these columns, specify empty array to disable
   @Input() filterColumns = [
     'hostname',
   // Show filters for these columns, specify empty array to disable
   @Input() filterColumns = [
     'hostname',
@@ -167,6 +171,14 @@ export class InventoryDevicesComponent implements OnInit, OnDestroy {
       if (col) {
         col.filterable = true;
       }
       if (col) {
         col.filterable = true;
       }
+
+      if (col?.prop === 'human_readable_type' && this.diskType === 'ssd') {
+        col.filterInitValue = this.diskType;
+      }
+
+      if (col?.prop === 'hostname' && this.hostname) {
+        col.filterInitValue = this.hostname;
+      }
     });
 
     if (this.fetchInventory.observers.length > 0) {
     });
 
     if (this.fetchInventory.observers.length > 0) {
index d5c73eb73904a198f8e66319ad2abefbd17fb544..cd03f04d55383d86037ed2764e287a726e58e991 100644 (file)
@@ -1,11 +1,11 @@
 <div *ngIf="contentData">
   <ng-container *ngTemplateOutlet="logFiltersTpl"></ng-container>
 
 <div *ngIf="contentData">
   <ng-container *ngTemplateOutlet="logFiltersTpl"></ng-container>
 
-  <ul ngbNav
-      #nav="ngbNav"
-      class="nav-tabs"
-      cdStatefulTab="logs">
-    <li ngbNavItem="cluster-logs">
+  <nav ngbNav
+       #nav="ngbNav"
+       class="nav-tabs"
+       cdStatefulTab="logs">
+    <ng-container ngbNavItem="cluster-logs">
       <a ngbNavLink
          i18n>Cluster Logs</a>
       <ng-template ngbNavContent>
       <a ngbNavLink
          i18n>Cluster Logs</a>
       <ng-template ngbNavContent>
                     [innerHTML]="line.message | searchHighlight: search"></span>
             </p>
 
                     [innerHTML]="line.message | searchHighlight: search"></span>
             </p>
 
-            <ng-container *ngIf="clog.length != 0 else noEntriesTpl"></ng-container>
+            <ng-container *ngIf="clog.length !== 0 else noEntriesTpl"></ng-container>
           </div>
         </div>
       </ng-template>
           </div>
         </div>
       </ng-template>
-    </li>
-    <li ngbNavItem="audit-logs">
+    </ng-container>
+    <ng-container ngbNavItem="audit-logs">
       <a ngbNavLink
          i18n>Audit Logs</a>
       <ng-template ngbNavContent>
       <a ngbNavLink
          i18n>Audit Logs</a>
       <ng-template ngbNavContent>
                     [innerHTML]="line.message | searchHighlight: search"></span>
             </p>
 
                     [innerHTML]="line.message | searchHighlight: search"></span>
             </p>
 
-            <ng-container *ngIf="audit_log.length != 0 else noEntriesTpl"></ng-container>
+            <ng-container *ngIf="audit_log.length !== 0 else noEntriesTpl"></ng-container>
           </div>
         </div>
       </ng-template>
           </div>
         </div>
       </ng-template>
-    </li>
-    <li ngbNavItem="daemon-logs">
+    </ng-container>
+    <ng-container ngbNavItem="daemon-logs">
       <a ngbNavLink
          i18n>Daemon Logs</a>
       <ng-template ngbNavContent>
         <ng-container *ngIf="lokiServiceStatus$ | async as lokiServiceStatus; else daemonLogsTpl">
           <div *ngIf="promtailServiceStatus$ | async as promtailServiceStatus; else daemonLogsTpl">
       <a ngbNavLink
          i18n>Daemon Logs</a>
       <ng-template ngbNavContent>
         <ng-container *ngIf="lokiServiceStatus$ | async as lokiServiceStatus; else daemonLogsTpl">
           <div *ngIf="promtailServiceStatus$ | async as promtailServiceStatus; else daemonLogsTpl">
-            <cd-grafana [grafanaPath]="'explore?'"
+            <cd-grafana i18n-title
+                        title="Daemon logs"
+                        [grafanaPath]="'explore?'"
                         [type]="'logs'"
                         uid="CrAHE0iZz"
                         grafanaStyle="two">
                         [type]="'logs'"
                         uid="CrAHE0iZz"
                         grafanaStyle="two">
           </div>
         </ng-container>
       </ng-template>
           </div>
         </ng-container>
       </ng-template>
-    </li>
-  </ul>
+    </ng-container>
+  </nav>
 
   <div [ngbNavOutlet]="nav"></div>
 </div>
 
 <ng-template #logFiltersTpl>
 
   <div [ngbNavOutlet]="nav"></div>
 </div>
 
 <ng-template #logFiltersTpl>
-  <div class="form-inline">
-    <div class="form-group">
+  <div class="row mb-3">
+  <div class="col-lg-10 d-flex">
+    <div class="col-sm-1 me-3">
       <label for="logs-priority"
       <label for="logs-priority"
+             class="fw-bold"
              i18n>Priority:</label>
       <select id="logs-priority"
              i18n>Priority:</label>
       <select id="logs-priority"
-              class="form-control"
+              class="form-select"
               [(ngModel)]="priority"
               (ngModelChange)="filterLogs()">
         <option *ngFor="let prio of priorities"
               [(ngModel)]="priority"
               (ngModelChange)="filterLogs()">
         <option *ngFor="let prio of priorities"
       </select>
     </div>
 
       </select>
     </div>
 
-    <div class="form-group">
+    <div class="col-md-3 me-3">
       <label for="logs-keyword"
       <label for="logs-keyword"
+             class="fw-bold"
              i18n>Keyword:</label>
       <div class="input-group">
              i18n>Keyword:</label>
       <div class="input-group">
-        <div class="input-group-prepend">
-          <span class="input-group-text">
-            <i [ngClass]="[icons.search]"></i>
-          </span>
-        </div>
+        <span class="input-group-text">
+          <i [ngClass]="[icons.search]"></i>
+        </span>
 
         <input class="form-control"
                id="logs-keyword"
 
         <input class="form-control"
                id="logs-keyword"
                [(ngModel)]="search"
                (keyup)="filterLogs()">
 
                [(ngModel)]="search"
                (keyup)="filterLogs()">
 
-        <div class="input-group-append">
-          <button type="button"
-                  class="btn btn-light"
-                  (click)="clearSearchKey()">
-            <i class="icon-prepend {{ icons.destroy }}"></i>
-          </button>
-        </div>
+        <button type="button"
+                class="btn btn-light"
+                (click)="clearSearchKey()"
+                title="Clear">
+          <i class="icon-prepend {{ icons.destroy }}"></i>
+        </button>
       </div>
     </div>
 
       </div>
     </div>
 
-    <div class="form-group">
+    <div class="col-md-3 me-3">
       <label for="logs-date"
       <label for="logs-date"
+             class="fw-bold"
              i18n>Date:</label>
       <div class="input-group">
         <input class="form-control"
              i18n>Date:</label>
       <div class="input-group">
         <input class="form-control"
                (click)="d.open()"
                [(ngModel)]="selectedDate"
                (ngModelChange)="filterLogs()">
                (click)="d.open()"
                [(ngModel)]="selectedDate"
                (ngModelChange)="filterLogs()">
-        <span class="input-group-append">
-          <button type="button"
-                  class="btn btn-light"
-                  (click)="clearDate()">
-            <i class="icon-prepend {{ icons.destroy }}"></i>
-          </button>
-        </span>
+        <button type="button"
+                class="btn btn-light"
+                (click)="clearDate()"
+                title="Clear">
+          <i class="icon-prepend {{ icons.destroy }}"></i>
+        </button>
       </div>
     </div>
 
       </div>
     </div>
 
-    <div class="form-group">
-      <label i18n>Time range:</label>
+    <div class="col-md-5">
+      <label i18n
+             class="fw-bold">Time range:</label>
+      <div class="d-flex">
       <ngb-timepicker [spinners]="false"
                       [(ngModel)]="startTime"
                       (ngModelChange)="filterLogs()"></ngb-timepicker>
 
       <ngb-timepicker [spinners]="false"
                       [(ngModel)]="startTime"
                       (ngModelChange)="filterLogs()"></ngb-timepicker>
 
-      <span>&nbsp;&mdash;&nbsp;</span>
+      <span class="mt-2">&nbsp;&mdash;&nbsp;</span>
 
       <ngb-timepicker [spinners]="false"
                       [(ngModel)]="endTime"
                       (ngModelChange)="filterLogs()"></ngb-timepicker>
 
       <ngb-timepicker [spinners]="false"
                       [(ngModel)]="endTime"
                       (ngModelChange)="filterLogs()"></ngb-timepicker>
-    </div>
-  </div>
+    </div></div>
+  </div></div>
 </ng-template>
 
 <ng-template #noEntriesTpl>
 </ng-template>
 
 <ng-template #noEntriesTpl>
index b952ce8d8a7c3bf31dad04639fa36596dc977dd5..693741120c20f08a34e2e8ea1341c3227812fd86 100644 (file)
@@ -43,7 +43,7 @@
                    formControlName="{{ moduleOption.value.name }}"
                    *ngIf="moduleOption.value.enum_allowed.length === 0">
             <select id="{{ moduleOption.value.name }}"
                    formControlName="{{ moduleOption.value.name }}"
                    *ngIf="moduleOption.value.enum_allowed.length === 0">
             <select id="{{ moduleOption.value.name }}"
-                    class="form-control"
+                    class="form-select"
                     formControlName="{{ moduleOption.value.name }}"
                     *ngIf="moduleOption.value.enum_allowed.length > 0">
               <option *ngFor="let value of moduleOption.value.enum_allowed"
                     formControlName="{{ moduleOption.value.name }}"
                     *ngIf="moduleOption.value.enum_allowed.length > 0">
               <option *ngFor="let value of moduleOption.value.enum_allowed"
index ca9ac82212c78cc0b8a6c6955211da245c269d63..c9dbf9cc599122fa7bf0cb42541f78ba1c50a6e5 100644 (file)
@@ -5,41 +5,43 @@
               i18n>Status</legend>
       <table class="table table-striped"
              *ngIf="mon_status">
               i18n>Status</legend>
       <table class="table table-striped"
              *ngIf="mon_status">
-        <tr>
-          <td i18n
-              class="bold">Cluster ID</td>
-          <td>{{ mon_status.monmap.fsid }}</td>
-        </tr>
-        <tr>
-          <td i18n
-              class="bold">monmap modified</td>
-          <td>{{ mon_status.monmap.modified | relativeDate }}</td>
-        </tr>
-        <tr>
-          <td i18n
-              class="bold">monmap epoch</td>
-          <td>{{ mon_status.monmap.epoch }}</td>
-        </tr>
-        <tr>
-          <td i18n
-              class="bold">quorum con</td>
-          <td>{{ mon_status.features.quorum_con }}</td>
-        </tr>
-        <tr>
-          <td i18n
-              class="bold">quorum mon</td>
-          <td>{{ mon_status.features.quorum_mon }}</td>
-        </tr>
-        <tr>
-          <td i18n
-              class="bold">required con</td>
-          <td>{{ mon_status.features.required_con }}</td>
-        </tr>
-        <tr>
-          <td i18n
-              class="bold">required mon</td>
-          <td>{{ mon_status.features.required_mon }}</td>
-        </tr>
+        <tbody>
+          <tr>
+            <td i18n
+                class="bold">Cluster ID</td>
+            <td>{{ mon_status.monmap.fsid }}</td>
+          </tr>
+          <tr>
+            <td i18n
+                class="bold">monmap modified</td>
+            <td>{{ mon_status.monmap.modified | relativeDate }}</td>
+          </tr>
+          <tr>
+            <td i18n
+                class="bold">monmap epoch</td>
+            <td>{{ mon_status.monmap.epoch }}</td>
+          </tr>
+          <tr>
+            <td i18n
+                class="bold">quorum con</td>
+            <td>{{ mon_status.features.quorum_con }}</td>
+          </tr>
+          <tr>
+            <td i18n
+                class="bold">quorum mon</td>
+            <td>{{ mon_status.features.quorum_mon }}</td>
+          </tr>
+          <tr>
+            <td i18n
+                class="bold">required con</td>
+            <td>{{ mon_status.features.required_con }}</td>
+          </tr>
+          <tr>
+            <td i18n
+                class="bold">required mon</td>
+            <td>{{ mon_status.features.required_mon }}</td>
+          </tr>
+        </tbody>
       </table>
     </fieldset>
   </div>
       </table>
     </fieldset>
   </div>
   <div class="col-lg-8">
     <legend i18n
             class="in-quorum cd-header">In Quorum</legend>
   <div class="col-lg-8">
     <legend i18n
             class="in-quorum cd-header">In Quorum</legend>
+    <div>
     <cd-table [data]="inQuorum.data"
               [columns]="inQuorum.columns">
     <cd-table [data]="inQuorum.data"
               [columns]="inQuorum.columns">
-    </cd-table>
+    </cd-table></div>
 
     <legend i18n
             class="in-quorum cd-header">Not In Quorum</legend>
 
     <legend i18n
             class="in-quorum cd-header">Not In Quorum</legend>
+    <div>
     <cd-table [data]="notInQuorum.data"
               (fetchData)="refresh()"
               [columns]="notInQuorum.columns">
     <cd-table [data]="notInQuorum.data"
               (fetchData)="refresh()"
               [columns]="notInQuorum.columns">
-    </cd-table>
+    </cd-table></div>
   </div>
 </div>
   </div>
 </div>
index 56eee8c8b9c432dba8c8b46c73f8fd417db8448b..2b73a710ac34883fe916943b9cdd95325d538254 100644 (file)
@@ -1,25 +1,27 @@
 <ng-container *ngIf="selection">
 <ng-container *ngIf="selection">
-  <ul ngbNav
-      #nav="ngbNav"
-      id="tabset-osd-details"
-      class="nav-tabs"
-      cdStatefulTab="osd-details">
-    <li ngbNavItem="devices">
+  <nav ngbNav
+       #nav="ngbNav"
+       id="tabset-osd-details"
+       class="nav-tabs"
+       cdStatefulTab="osd-details">
+    <ng-container ngbNavItem="devices">
       <a ngbNavLink
          i18n>Devices</a>
       <ng-template ngbNavContent>
       <a ngbNavLink
          i18n>Devices</a>
       <ng-template ngbNavContent>
-        <cd-device-list [osdId]="osd?.id"></cd-device-list>
+        <cd-device-list [osdId]="osd?.id"
+                        [hostname]="selection?.host.name"
+                        [osdList]="true"></cd-device-list>
       </ng-template>
       </ng-template>
-    </li>
-    <li ngbNavItem="attributes">
+    </ng-container>
+    <ng-container ngbNavItem="attributes">
       <a ngbNavLink
          i18n>Attributes (OSD map)</a>
       <ng-template ngbNavContent>
         <cd-table-key-value [data]="osd?.details?.osd_map">
         </cd-table-key-value>
       </ng-template>
       <a ngbNavLink
          i18n>Attributes (OSD map)</a>
       <ng-template ngbNavContent>
         <cd-table-key-value [data]="osd?.details?.osd_map">
         </cd-table-key-value>
       </ng-template>
-    </li>
-    <li ngbNavItem="metadata">
+    </ng-container>
+    <ng-container ngbNavItem="metadata">
       <a ngbNavLink
          i18n>Metadata</a>
       <ng-template ngbNavContent>
       <a ngbNavLink
          i18n>Metadata</a>
       <ng-template ngbNavContent>
                           i18n>Metadata not available</cd-alert-panel>
         </ng-template>
       </ng-template>
                           i18n>Metadata not available</cd-alert-panel>
         </ng-template>
       </ng-template>
-    </li>
-    <li ngbNavItem="device-health">
+    </ng-container>
+    <ng-container ngbNavItem="device-health">
       <a ngbNavLink
          i18n>Device health</a>
       <ng-template ngbNavContent>
         <cd-smart-list [osdId]="osd?.id"></cd-smart-list>
       </ng-template>
       <a ngbNavLink
          i18n>Device health</a>
       <ng-template ngbNavContent>
         <cd-smart-list [osdId]="osd?.id"></cd-smart-list>
       </ng-template>
-    </li>
-    <li ngbNavItem="performance-counter">
+    </ng-container>
+    <ng-container ngbNavItem="performance-counter">
       <a ngbNavLink
          i18n>Performance counter</a>
       <ng-template ngbNavContent>
       <a ngbNavLink
          i18n>Performance counter</a>
       <ng-template ngbNavContent>
                                       [serviceId]="osd?.id">
         </cd-table-performance-counter>
       </ng-template>
                                       [serviceId]="osd?.id">
         </cd-table-performance-counter>
       </ng-template>
-    </li>
-    <li ngbNavItem="performance-details"
-        *ngIf="grafanaPermission.read">
+    </ng-container>
+    <ng-container ngbNavItem="performance-details"
+                  *ngIf="grafanaPermission.read">
       <a ngbNavLink
          i18n>Performance Details</a>
       <ng-template ngbNavContent>
       <a ngbNavLink
          i18n>Performance Details</a>
       <ng-template ngbNavContent>
-        <cd-grafana [grafanaPath]="'osd-device-details?var-osd=osd.' + osd['id']"
+        <cd-grafana i18n-title
+                    title="OSD details"
+                    [grafanaPath]="'osd-device-details?var-osd=osd.' + osd['id']"
                     [type]="'metrics'"
                     uid="CrAHE0iZz"
                     grafanaStyle="three">
         </cd-grafana>
       </ng-template>
                     [type]="'metrics'"
                     uid="CrAHE0iZz"
                     grafanaStyle="three">
         </cd-grafana>
       </ng-template>
-    </li>
-  </ul>
+    </ng-container>
+  </nav>
 
   <div [ngbNavOutlet]="nav"></div>
 </ng-container>
 
   <div [ngbNavOutlet]="nav"></div>
 </ng-container>
index 8b1f59eac371c922d991abbe2cac964936dff1f9..95e51662b769f65856958284daec453b5b16749e 100644 (file)
@@ -27,7 +27,7 @@
     <ng-template #blockClearDevices>
       <div class="pb-2 my-2 border-bottom">
         <span *ngFor="let filter of appliedFilters">
     <ng-template #blockClearDevices>
       <div class="pb-2 my-2 border-bottom">
         <span *ngFor="let filter of appliedFilters">
-          <span class="badge badge-dark mr-2">{{ filter.name }}: {{ filter.value.formatted }}</span>
+          <span class="badge badge-dark me-2">{{ filter.name }}: {{ filter.value.formatted }}</span>
         </span>
         <a class="tc_clearSelections"
            href=""
         </span>
         <a class="tc_clearSelections"
            href=""
@@ -43,7 +43,7 @@
         </cd-inventory-devices>
       </div>
       <div *ngIf="type === 'data'"
         </cd-inventory-devices>
       </div>
       <div *ngIf="type === 'data'"
-           class="float-right">
+           class="float-end">
         <span i18n>Raw capacity: {{ capacity | dimlessBinary }}</span>
       </div>
     </ng-template>
         <span i18n>Raw capacity: {{ capacity | dimlessBinary }}</span>
       </div>
     </ng-template>
index cff0cbc0563fc8a39f146933a256042bd47fb204..6c5cf52f6f53dc282db7f364a4033432f3b62372 100644 (file)
@@ -76,13 +76,18 @@ export class OsdDevicesSelectionGroupsComponent implements OnInit, OnChanges {
   }
 
   showSelectionModal() {
   }
 
   showSelectionModal() {
-    let filterColumns = ['human_readable_type', 'sys_api.vendor', 'sys_api.model', 'sys_api.size'];
-    if (this.type === 'data') {
-      filterColumns = ['hostname', ...filterColumns];
-    }
+    const filterColumns = [
+      'hostname',
+      'human_readable_type',
+      'sys_api.vendor',
+      'sys_api.model',
+      'sys_api.size'
+    ];
+    const diskType = this.name === 'Primary' ? 'hdd' : 'ssd';
     const initialState = {
       hostname: this.hostname,
       deviceType: this.name,
     const initialState = {
       hostname: this.hostname,
       deviceType: this.name,
+      diskType: diskType,
       devices: this.availDevices,
       filterColumns: filterColumns
     };
       devices: this.availDevices,
       filterColumns: filterColumns
     };
index 3e53d5c410cd2ceef6a12e5130883f1ea12804bf..ab967eab4aecd3129bafc292c7a450842cc44bda 100644 (file)
                         [showTitle]="false">
           <ng-container i18n>At least one of these filters must be applied in order to proceed:</ng-container>
           <span *ngFor="let filter of requiredFilters"
                         [showTitle]="false">
           <ng-container i18n>At least one of these filters must be applied in order to proceed:</ng-container>
           <span *ngFor="let filter of requiredFilters"
-                class="badge badge-dark ml-2">
+                class="badge badge-dark ms-2">
             {{ filter }}
           </span>
         </cd-alert-panel>
         <cd-inventory-devices #inventoryDevices
                               [devices]="devices"
                               [filterColumns]="filterColumns"
             {{ filter }}
           </span>
         </cd-alert-panel>
         <cd-inventory-devices #inventoryDevices
                               [devices]="devices"
                               [filterColumns]="filterColumns"
-                              [showAvailDeviceOnly]="true"
+                              [hostname]="hostname"
+                              [diskType]="diskType"
                               [hiddenColumns]="['available', 'osd_ids']"
                               (filterChange)="onFilterChange($event)">
         </cd-inventory-devices>
                               [hiddenColumns]="['available', 'osd_ids']"
                               (filterChange)="onFilterChange($event)">
         </cd-inventory-devices>
index edfe9d6a7c3e208243e3a1dc63ca764da9da3bdd..f3ed46227bc226e0c90251958bb826764c1332fa 100644 (file)
@@ -1,4 +1,11 @@
-import { AfterViewInit, Component, EventEmitter, Output, ViewChild } from '@angular/core';
+import {
+  AfterViewInit,
+  ChangeDetectorRef,
+  Component,
+  EventEmitter,
+  Output,
+  ViewChild
+} from '@angular/core';
 
 import { NgbActiveModal } from '@ng-bootstrap/ng-bootstrap';
 import { TableColumnProp } from '@swimlane/ngx-datatable';
 
 import { NgbActiveModal } from '@ng-bootstrap/ng-bootstrap';
 import { TableColumnProp } from '@swimlane/ngx-datatable';
@@ -30,6 +37,7 @@ export class OsdDevicesSelectionModalComponent implements AfterViewInit {
 
   hostname: string;
   deviceType: string;
 
   hostname: string;
   deviceType: string;
+  diskType: string;
   formGroup: CdFormGroup;
   action: string;
 
   formGroup: CdFormGroup;
   action: string;
 
@@ -42,6 +50,7 @@ export class OsdDevicesSelectionModalComponent implements AfterViewInit {
 
   constructor(
     private formBuilder: CdFormBuilder,
 
   constructor(
     private formBuilder: CdFormBuilder,
+    private cdRef: ChangeDetectorRef,
     public activeModal: NgbActiveModal,
     public actionLabels: ActionLabelsI18n,
     public wizardStepService: WizardStepsService
     public activeModal: NgbActiveModal,
     public actionLabels: ActionLabelsI18n,
     public wizardStepService: WizardStepsService
@@ -83,6 +92,7 @@ export class OsdDevicesSelectionModalComponent implements AfterViewInit {
       this.capacity = _.sumBy(this.filteredDevices, 'sys_api.size');
       this.event = event;
     }
       this.capacity = _.sumBy(this.filteredDevices, 'sys_api.size');
       this.event = event;
     }
+    this.cdRef.detectChanges();
   }
 
   onSubmit() {
   }
 
   onSubmit() {
index f8a10ff24de61dbadb65e8db77659cb99f40d215..0aff25409dea7584fd476bc5a0a64a8cdd0d3627 100644 (file)
@@ -21,7 +21,7 @@
                  [for]="flag.code"
                  ng-class="['tc_' + key]">
             <strong>{{ flag.name }}</strong>
                  [for]="flag.code"
                  ng-class="['tc_' + key]">
             <strong>{{ flag.name }}</strong>
-            <span class="badge badge-hdd ml-2"
+            <span class="badge badge-hdd ms-2"
                   [ngbTooltip]="clusterWideTooltip"
                   *ngIf="flag.clusterWide"
                   i18n>Cluster-wide</span>
                   [ngbTooltip]="clusterWideTooltip"
                   *ngIf="flag.clusterWide"
                   i18n>Cluster-wide</span>
index d4b6d9faea1099d2ce677d218a838d4d35035081..78ff50d4d51814925a676c08bf0826641645de5a 100644 (file)
@@ -5,31 +5,30 @@
   <div i18n="form title|Example: Create Pool@@formTitle"
        class="card-header"
        *ngIf="!hideTitle">{{ action | titlecase }} {{ resource | upperFirst }}</div>
   <div i18n="form title|Example: Create Pool@@formTitle"
        class="card-header"
        *ngIf="!hideTitle">{{ action | titlecase }} {{ resource | upperFirst }}</div>
-  <div class="card-body ml-2">
+  <div class="card-body ms-2">
     <form name="form"
           #formDir="ngForm"
           [formGroup]="form"
           novalidate>
       <div class="accordion">
     <form name="form"
           #formDir="ngForm"
           [formGroup]="form"
           novalidate>
       <div class="accordion">
-        <div class="card">
-          <div class="card-header">
-            <h2 class="mb-0">
-              <button class="btn btn-link btn-block text-left dropdown-toggle"
-                      data-toggle="collapse"
-                      aria-label="toggle deployment options"
-                      [attr.aria-expanded]="simpleDeployment"
-                      (click)="emitDeploymentMode()"
-                      i18n>Deployment Options</button>
-            </h2>
-          </div>
+        <div class="accordion-item">
+          <h2 class="accordion-header">
+            <button class="accordion-button"
+                    type="button"
+                    data-toggle="collapse"
+                    aria-label="toggle deployment options"
+                    [ngClass]="{collapsed: !simpleDeployment}"
+                    (click)="emitDeploymentMode()"
+                    i18n>Deployment Options</button>
+          </h2>
         </div>
         </div>
-        <div class="collapse"
+        <div class="accordion-collapse collapse"
              [ngClass]="{show: simpleDeployment}">
              [ngClass]="{show: simpleDeployment}">
-          <div class="card-body d-flex flex-column">
+          <div class="accordion-body">
             <div class="pt-3 pb-3"
                  *ngFor="let optionName of optionNames">
             <div class="pt-3 pb-3"
                  *ngFor="let optionName of optionNames">
-              <div class="custom-control custom-radio custom-control-inline">
-                <input class="custom-control-input"
+              <div class="custom-control form-check custom-control-inline">
+                <input class="form-check-input"
                        type="radio"
                        name="deploymentOption"
                        [id]="optionName"
                        type="radio"
                        name="deploymentOption"
                        [id]="optionName"
@@ -37,7 +36,7 @@
                        formControlName="deploymentOption"
                        (change)="emitDeploymentSelection()"
                        [attr.disabled]="!deploymentOptions?.options[optionName].available ? true : null">
                        formControlName="deploymentOption"
                        (change)="emitDeploymentSelection()"
                        [attr.disabled]="!deploymentOptions?.options[optionName].available ? true : null">
-                <label class="custom-control-label"
+                <label class="form-check-label"
                        [id]="'label_' + optionName"
                        [for]="optionName"
                        i18n>{{ deploymentOptions?.options[optionName].title }}
                        [id]="'label_' + optionName"
                        [for]="optionName"
                        i18n>{{ deploymentOptions?.options[optionName].title }}
             </div> -->
           </div>
         </div>
             </div> -->
           </div>
         </div>
-        <div class="card">
-          <div class="card-header">
-            <h2 class="mb-0">
-              <button class="btn btn-link btn-block text-left dropdown-toggle"
-                      data-toggle="collapse"
-                      aria-label="toggle advanced mode"
-                      [attr.aria-expanded]="!simpleDeployment"
-                      (click)="emitDeploymentMode()"
-                      i18n>Advanced Mode</button>
-            </h2>
-          </div>
+        <div class="accordion-item">
+          <h2 class="accordion-header">
+            <button class="accordion-button"
+                    type="button"
+                    aria-label="toggle advanced mode"
+                    [ngClass]="{collapsed: simpleDeployment}"
+                    (click)="emitDeploymentMode()"
+                    i18n>Advanced Mode</button>
+          </h2>
         </div>
         </div>
-        <div class="collapse"
+        <div class="accordion-collapse collapse"
              [ngClass]="{show: !simpleDeployment}">
              [ngClass]="{show: !simpleDeployment}">
-          <div class="card-body">
+          <div class="accordion-body">
             <div class="card-body">
               <fieldset>
                 <cd-osd-devices-selection-groups #dataDeviceSelectionGroups
             <div class="card-body">
               <fieldset>
                 <cd-osd-devices-selection-groups #dataDeviceSelectionGroups
                                                  [availDevices]="availDevices"
                                                  [canSelect]="dataDeviceSelectionGroups.devices.length !== 0"
                                                  (selected)="onDevicesSelected($event)"
                                                  [availDevices]="availDevices"
                                                  [canSelect]="dataDeviceSelectionGroups.devices.length !== 0"
                                                  (selected)="onDevicesSelected($event)"
-                                                 (cleared)="onDevicesCleared($event)">
+                                                 (cleared)="onDevicesCleared($event)"
+                                                 [hostname]="hostname">
                 </cd-osd-devices-selection-groups>
 
                 <!-- WAL slots -->
                 </cd-osd-devices-selection-groups>
 
                 <!-- WAL slots -->
                                                  [availDevices]="availDevices"
                                                  [canSelect]="dataDeviceSelectionGroups.devices.length !== 0"
                                                  (selected)="onDevicesSelected($event)"
                                                  [availDevices]="availDevices"
                                                  [canSelect]="dataDeviceSelectionGroups.devices.length !== 0"
                                                  (selected)="onDevicesSelected($event)"
-                                                 (cleared)="onDevicesCleared($event)">
+                                                 (cleared)="onDevicesCleared($event)"
+                                                 [hostname]="hostname">
                 </cd-osd-devices-selection-groups>
 
                 <!-- DB slots -->
                 </cd-osd-devices-selection-groups>
 
                 <!-- DB slots -->
         </div>
 
         <!-- Features -->
         </div>
 
         <!-- Features -->
-        <div class="card">
-          <div class="card-header">
-            <h2 class="mb-0">
-              <button class="btn btn-link btn-block text-left dropdown-toggle"
-                      data-toggle="collapse"
-                      aria-label="features"
-                      aria-expanded="true"
-                      i18n>Features</button>
-            </h2>
-          </div>
+        <div class="accordion-item">
+          <h2 class="accordion-header">
+            <button class="accordion-button"
+                    type="button"
+                    data-toggle="collapse"
+                    aria-label="features"
+                    aria-expanded="true"
+                    i18n>Features</button>
+          </h2>
         </div>
         </div>
-        <div class="collapse show">
-          <div class="card-body d-flex flex-column">
+        <div class="accordion-collapse collapse show">
+          <div class="accordion-body">
             <div class="pt-3 pb-3"
                  formGroupName="features">
               <div class="custom-control custom-checkbox"
             <div class="pt-3 pb-3"
                  formGroupName="features">
               <div class="custom-control custom-checkbox"
index c2384425e7019127d087b54ba8813dfdc50513db..e2085548f0f51e8afe844a3c0b610c0345e0c827 100644 (file)
@@ -219,6 +219,7 @@ export class OsdFormComponent extends CdForm implements OnInit {
 
   onDevicesCleared(event: DevicesSelectionClearEvent) {
     if (event.type === 'data') {
 
   onDevicesCleared(event: DevicesSelectionClearEvent) {
     if (event.type === 'data') {
+      this.hostname = '';
       this.availDevices = [...this.allDevices];
       this.walDeviceSelectionGroups.devices = [];
       this.dbDeviceSelectionGroups.devices = [];
       this.availDevices = [...this.allDevices];
       this.walDeviceSelectionGroups.devices = [];
       this.dbDeviceSelectionGroups.devices = [];
index afec81d9d1971e2446d5b36768329ee7ae8ecc01..ede9dbb19f271f03fe2caf374a865dc4d2ede865 100644 (file)
@@ -1,7 +1,7 @@
-<ul ngbNav
-    #nav="ngbNav"
-    class="nav-tabs">
-  <li ngbNavItem>
+<nav ngbNav
+     #nav="ngbNav"
+     class="nav-tabs">
+  <ng-container ngbNavItem>
     <a ngbNavLink
        i18n>OSDs List</a>
     <ng-template ngbNavContent>
     <a ngbNavLink
        i18n>OSDs List</a>
     <ng-template ngbNavContent>
         </cd-osd-details>
       </cd-table>
     </ng-template>
         </cd-osd-details>
       </cd-table>
     </ng-template>
-  </li>
+  </ng-container>
 
 
-  <li ngbNavItem
-      *ngIf="permissions.grafana.read">
+  <ng-container ngbNavItem
+                *ngIf="permissions.grafana.read">
     <a ngbNavLink
        i18n>Overall Performance</a>
     <ng-template ngbNavContent>
     <a ngbNavLink
        i18n>Overall Performance</a>
     <ng-template ngbNavContent>
-      <cd-grafana [grafanaPath]="'osd-overview?'"
+      <cd-grafana i18n-title
+                  title="OSD list"
+                  [grafanaPath]="'osd-overview?'"
                   [type]="'metrics'"
                   uid="lo02I1Aiz"
                   grafanaStyle="four">
       </cd-grafana>
     </ng-template>
                   [type]="'metrics'"
                   uid="lo02I1Aiz"
                   grafanaStyle="four">
       </cd-grafana>
     </ng-template>
-  </li>
-</ul>
+  </ng-container>
+</nav>
 
 <div [ngbNavOutlet]="nav"></div>
 
 
 <div [ngbNavOutlet]="nav"></div>
 
 <ng-template #criticalConfirmationTpl
              let-safeToPerform="safeToPerform"
              let-message="message"
 <ng-template #criticalConfirmationTpl
              let-safeToPerform="safeToPerform"
              let-message="message"
+             let-active="active"
+             let-missingStats="missingStats"
+             let-storedPgs="storedPgs"
              let-actionDescription="actionDescription"
              let-osdIds="osdIds">
   <div *ngIf="!safeToPerform"
              let-actionDescription="actionDescription"
              let-osdIds="osdIds">
   <div *ngIf="!safeToPerform"
-       class="danger">
-    <cd-alert-panel type="warning"
-                    i18n>The {selection.hasSingleSelection, select, true {OSD is} other {OSDs are}} not safe to be
-      {{ actionDescription }}! {{ message }}</cd-alert-panel>
+       class="danger mb-3">
+    <cd-alert-panel type="warning">
+      <span i18n>
+        The {selection.hasSingleSelection, select, true {OSD is} other {OSDs are}} not safe to be
+        {{ actionDescription }}!
+      </span>
+      <br>
+      <ul class="mb-0 ps-4">
+        <li *ngIf="active.length > 0"
+             i18n>
+          {selection.hasSingleSelection, select, true {} other {{{ active | join }} : }}
+          Some PGs are currently mapped to
+          {active.length === 1, select, true {it} other {them}}.
+        </li>
+        <li *ngIf="missingStats.length > 0"
+             i18n>
+          {selection.hasSingleSelection, select, true {} other {{{ missingStats | join }} : }}
+          There are no reported stats and not all PGs are active and clean.
+        </li>
+        <li *ngIf="storedPgs.length > 0"
+             i18n>
+          {selection.hasSingleSelection, select, true {OSD} other {{{ storedPgs | join }} : OSDs }}
+          still store some PG data and not all PGs are active and clean.
+        </li>
+        <li *ngIf="message">
+          {{ message }}
+        </li>
+      </ul>
+    </cd-alert-panel>
+  </div>
+  <div *ngIf="safeToPerform"
+       class="danger mb-3">
+    <cd-alert-panel type="info">
+      <span i18n>
+        The {selection.hasSingleSelection, select, true {OSD is} other {OSDs are}}
+        safe to destroy without reducing data durability.
+      </span>
+    </cd-alert-panel>
   </div>
   <ng-container i18n><strong>OSD {{ osdIds | join }}</strong> will be
   <strong>{{ actionDescription }}</strong> if you proceed.</ng-container>
   </div>
   <ng-container i18n><strong>OSD {{ osdIds | join }}</strong> will be
   <strong>{{ actionDescription }}</strong> if you proceed.</ng-container>
 <ng-template #flagsTpl
              let-row="row">
   <span *ngFor="let flag of row.cdClusterFlags;"
 <ng-template #flagsTpl
              let-row="row">
   <span *ngFor="let flag of row.cdClusterFlags;"
-        class="badge badge-hdd mr-1">{{ flag }}</span>
+        class="badge badge-hdd me-1">{{ flag }}</span>
   <span *ngFor="let flag of row.cdIndivFlags;"
   <span *ngFor="let flag of row.cdIndivFlags;"
-        class="badge badge-info mr-1">{{ flag }}</span>
+        class="badge badge-info me-1">{{ flag }}</span>
 </ng-template>
 
 <ng-template #osdUsageTpl
              let-row="row">
 </ng-template>
 
 <ng-template #osdUsageTpl
              let-row="row">
-  <cd-usage-bar [total]="row.stats.stat_bytes"
+  <cd-usage-bar [title]="'osd ' + row.osd"
+                [total]="row.stats.stat_bytes"
                 [used]="row.stats.stat_bytes_used"
                 [warningThreshold]="osdSettings.nearfull_ratio"
                 [errorThreshold]="osdSettings.full_ratio">
                 [used]="row.stats.stat_bytes_used"
                 [warningThreshold]="osdSettings.nearfull_ratio"
                 [errorThreshold]="osdSettings.full_ratio">
index 9f418e0e3426c065fc75b7ae0a4f235e3a20d73d..ec8268d8b040550cdd8e5182a7faa6ec560e5098 100644 (file)
@@ -580,6 +580,9 @@ export class OsdListComponent extends ListWithDetails implements OnInit {
         bodyContext: {
           safeToPerform: result[checkKey],
           message: result.message,
         bodyContext: {
           safeToPerform: result[checkKey],
           message: result.message,
+          active: result.active,
+          missingStats: result.missing_stats,
+          storedPgs: result.stored_pgs,
           actionDescription: templateItemDescription,
           osdIds: this.getSelectedOsdIds()
         },
           actionDescription: templateItemDescription,
           osdIds: this.getSelectedOsdIds()
         },
index eb54c82f50d3d16ae97a6fcb7c7ae9ff50c3abbe..ccfc58507aa6a71de8ac2a52d8e20d7a4661a265 100755 (executable)
@@ -14,7 +14,7 @@
                  for="priority"
                  i18n>Priority</label>
           <div class="cd-col-form-input">
                  for="priority"
                  i18n>Priority</label>
           <div class="cd-col-form-input">
-            <select class="form-control"
+            <select class="form-select"
                     formControlName="priority"
                     id="priority"
                     (change)="onPriorityChange($event.target.value)">
                     formControlName="priority"
                     id="priority"
                     (change)="onPriorityChange($event.target.value)">
index a319aeed6f338cf85b09377b09e4955e3d060382..1a4854327a04069fc2b4fff78547cb3566bb1a22 100644 (file)
@@ -58,7 +58,7 @@ export class ActiveAlertListComponent extends PrometheusListHelper implements On
       {
         name: $localize`Name`,
         prop: 'labels.alertname',
       {
         name: $localize`Name`,
         prop: 'labels.alertname',
-        cellClass: 'font-weight-bold',
+        cellClass: 'fw-bold',
         flexGrow: 2
       },
       {
         flexGrow: 2
       },
       {
index 3be6091a584c3d849a49c789a574a3fc1720c6df..73ad9884a550133aecbc53e2165a3207b0506e76 100644 (file)
@@ -1,22 +1,30 @@
-<ul ngbNav
-    #nav="ngbNav"
-    [activeId]="router.url"
-    (navChange)="router.navigate([$event.nextId])"
-    class="nav-tabs">
-  <li ngbNavItem="/monitoring/active-alerts">
-    <a ngbNavLink
+<ul class="nav nav-tabs">
+  <li class="nav-item">
+    <a class="nav-link"
+       routerLink="/monitoring/active-alerts"
+       routerLinkActive="active"
+       ariaCurrentWhenActive="page"
+       [routerLinkActiveOptions]="{exact: true}"
        i18n>Active Alerts
     <small *ngIf="prometheusAlertService.activeCriticalAlerts > 0"
        i18n>Active Alerts
     <small *ngIf="prometheusAlertService.activeCriticalAlerts > 0"
-        class="badge badge-danger ml-1">{{ prometheusAlertService.activeCriticalAlerts }}</small>
+        class="badge badge-danger ms-1">{{ prometheusAlertService.activeCriticalAlerts }}</small>
     <small *ngIf="prometheusAlertService.activeWarningAlerts > 0"
     <small *ngIf="prometheusAlertService.activeWarningAlerts > 0"
-        class="badge badge-warning ml-1">{{ prometheusAlertService.activeWarningAlerts }}</small></a>
+        class="badge badge-warning ms-1">{{ prometheusAlertService.activeWarningAlerts }}</small></a>
   </li>
   </li>
-  <li ngbNavItem="/monitoring/alerts">
-    <a ngbNavLink
+  <li class="nav-item">
+    <a class="nav-link"
+       routerLink="/monitoring/alerts"
+       routerLinkActive="active"
+       ariaCurrentWhenActive="page"
+       [routerLinkActiveOptions]="{exact: true}"
        i18n>Alerts</a>
   </li>
        i18n>Alerts</a>
   </li>
-  <li ngbNavItem="/monitoring/silences">
-    <a ngbNavLink
+  <li class="nav-item">
+    <a class="nav-link"
+       routerLink="/monitoring/silences"
+       routerLinkActive="active"
+       ariaCurrentWhenActive="page"
+       [routerLinkActiveOptions]="{exact: true}"
        i18n>Silences</a>
   </li>
 </ul>
        i18n>Silences</a>
   </li>
 </ul>
index cccce1d92e33c9b3cbcdc8814f0036a95ab9aa31..136fe939177ee5d503233fd35f7a8b37e72dc395 100644 (file)
@@ -1,5 +1,4 @@
 import { Component } from '@angular/core';
 import { Component } from '@angular/core';
-import { Router } from '@angular/router';
 
 import { PrometheusAlertService } from '~/app/shared/services/prometheus-alert.service';
 
 
 import { PrometheusAlertService } from '~/app/shared/services/prometheus-alert.service';
 
@@ -9,5 +8,5 @@ import { PrometheusAlertService } from '~/app/shared/services/prometheus-alert.s
   styleUrls: ['./prometheus-tabs.component.scss']
 })
 export class PrometheusTabsComponent {
   styleUrls: ['./prometheus-tabs.component.scss']
 })
 export class PrometheusTabsComponent {
-  constructor(public router: Router, public prometheusAlertService: PrometheusAlertService) {}
+  constructor(public prometheusAlertService: PrometheusAlertService) {}
 }
 }
index cc4ee511156d648978c6e3ab90416f93c785ca2b..e033729da3f3db69227f4b6d873d2873a03feffc 100644 (file)
@@ -38,7 +38,7 @@ export class RulesListComponent extends PrometheusListHelper implements OnInit {
   ngOnInit() {
     super.ngOnInit();
     this.columns = [
   ngOnInit() {
     super.ngOnInit();
     this.columns = [
-      { prop: 'name', name: $localize`Name`, cellClass: 'font-weight-bold', flexGrow: 2 },
+      { prop: 'name', name: $localize`Name`, cellClass: 'fw-bold', flexGrow: 2 },
       {
         prop: 'labels.severity',
         name: $localize`Severity`,
       {
         prop: 'labels.severity',
         name: $localize`Severity`,
index 02f04a06a4bcdd9ad8a497000862ad312b7ae9de..cbd3874164feb2ffa300d8ea443fb6496cdb4e15 100644 (file)
@@ -3,12 +3,12 @@
              let-index="index">
   <div class="input-group my-2">
     <ng-container *ngFor="let config of matcherConfig">
              let-index="index">
   <div class="input-group my-2">
     <ng-container *ngFor="let config of matcherConfig">
-      <div class="input-group-prepend">
-        <span class="input-group-text"
-              [ngbTooltip]="config.tooltip">
-          <i [ngClass]="[config.icon]"></i>
-        </span>
-      </div>
+      <span class="input-group-text"
+            *ngIf="config.attribute === 'isRegex'"
+            [ngbTooltip]="config.tooltip">
+        <i *ngIf="matcher[config.attribute]">~</i>
+        <i *ngIf="!matcher[config.attribute]">=</i>
+      </span>
 
       <ng-container *ngIf="config.attribute !== 'isRegex'">
         <input type="text"
 
       <ng-container *ngIf="config.attribute !== 'isRegex'">
         <input type="text"
                disabled
                readonly>
       </ng-container>
                disabled
                readonly>
       </ng-container>
-
-      <ng-container *ngIf="config.attribute === 'isRegex'">
-        <div class="input-group-append">
-          <div class="input-group-text">
-            <input type="checkbox"
-                   id="matcher-{{config.attribute}}-{{index}}"
-                   [checked]="matcher[config.attribute]"
-                   disabled
-                   readonly>
-          </div>
-        </div>
-      </ng-container>
     </ng-container>
 
     <!-- Matcher actions -->
     </ng-container>
 
     <!-- Matcher actions -->
-    <span class="input-group-append">
-      <button type="button"
-              class="btn btn-light"
-              id="matcher-edit-{{index}}"
-              i18n-ngbTooltip
-              ngbTooltip="Edit"
-              (click)="showMatcherModal(index)">
-        <i [ngClass]="[icons.edit]"></i>
-      </button>
-      <button type="button"
-              class="btn btn-light"
-              id="matcher-delete-{{index}}"
-              i18n-ngbTooltip
-              ngbTooltip="Delete"
-              (click)="deleteMatcher(index)">
-        <i [ngClass]="[icons.trash]"></i>
-      </button>
-    </span>
+    <button type="button"
+            class="btn btn-light"
+            id="matcher-edit-{{index}}"
+            i18n-ngbTooltip
+            ngbTooltip="Edit"
+            (click)="showMatcherModal(index)">
+      <i [ngClass]="[icons.edit]"></i>
+    </button>
+    <button type="button"
+            class="btn btn-light"
+            id="matcher-delete-{{index}}"
+            i18n-ngbTooltip
+            ngbTooltip="Delete"
+            (click)="deleteMatcher(index)">
+      <i [ngClass]="[icons.trash]"></i>
+    </button>
   </div>
   <span class="help-block"></span>
 </ng-template>
   </div>
   <span class="help-block"></span>
 </ng-template>
               <div class="col-12">
                 <button type="button"
                         id="add-matcher"
               <div class="col-12">
                 <button type="button"
                         id="add-matcher"
-                        class="btn btn-light float-right my-3"
+                        class="btn btn-light float-end my-3"
                         [ngClass]="{'btn-warning': formDir.submitted && matchers.length === 0 }"
                         (click)="showMatcherModal()">
                   <i [ngClass]="[icons.add]"></i>
                         [ngClass]="{'btn-warning': formDir.submitted && matchers.length === 0 }"
                         (click)="showMatcherModal()">
                   <i [ngClass]="[icons.add]"></i>
index 41898315019c9e8dafe960dc0e2ebb15a4f5f6b6..b4d8a86526dc59946b81f9f5c15100f1ae9a9d9a 100644 (file)
@@ -15,7 +15,10 @@ import { ErrorComponent } from '~/app/core/error/error.component';
 import { PrometheusService } from '~/app/shared/api/prometheus.service';
 import { NotificationType } from '~/app/shared/enum/notification-type.enum';
 import { CdFormGroup } from '~/app/shared/forms/cd-form-group';
 import { PrometheusService } from '~/app/shared/api/prometheus.service';
 import { NotificationType } from '~/app/shared/enum/notification-type.enum';
 import { CdFormGroup } from '~/app/shared/forms/cd-form-group';
-import { AlertmanagerSilence } from '~/app/shared/models/alertmanager-silence';
+import {
+  AlertmanagerSilence,
+  AlertmanagerSilenceMatcher
+} from '~/app/shared/models/alertmanager-silence';
 import { Permission } from '~/app/shared/models/permissions';
 import { AuthStorageService } from '~/app/shared/services/auth-storage.service';
 import { ModalService } from '~/app/shared/services/modal.service';
 import { Permission } from '~/app/shared/models/permissions';
 import { AuthStorageService } from '~/app/shared/services/auth-storage.service';
 import { ModalService } from '~/app/shared/services/modal.service';
@@ -283,12 +286,7 @@ describe('SilenceFormComponent', () => {
       expectMode('alertAdd', false, false, 'Create');
       expect(prometheusService.getSilences).not.toHaveBeenCalled();
       expect(prometheusService.getAlerts).toHaveBeenCalled();
       expectMode('alertAdd', false, false, 'Create');
       expect(prometheusService.getSilences).not.toHaveBeenCalled();
       expect(prometheusService.getAlerts).toHaveBeenCalled();
-      expect(component.matchers).toEqual([
-        createMatcher('alertname', 'alert0', false),
-        createMatcher('instance', 'someInstance', false),
-        createMatcher('job', 'someJob', false),
-        createMatcher('severity', 'someSeverity', false)
-      ]);
+      expect(component.matchers).toEqual([createMatcher('alertname', 'alert0', false)]);
       expect(component.matcherMatch).toEqual({
         cssClass: 'has-success',
         status: 'Matches 1 rule with 1 active alert.'
       expect(component.matcherMatch).toEqual({
         cssClass: 'has-success',
         status: 'Matches 1 rule with 1 active alert.'
@@ -404,13 +402,7 @@ describe('SilenceFormComponent', () => {
     it('should show added matcher', () => {
       addMatcher('job', 'someJob', true);
       fixtureH.expectIdElementsVisible(
     it('should show added matcher', () => {
       addMatcher('job', 'someJob', true);
       fixtureH.expectIdElementsVisible(
-        [
-          'matcher-name-0',
-          'matcher-value-0',
-          'matcher-isRegex-0',
-          'matcher-edit-0',
-          'matcher-delete-0'
-        ],
+        ['matcher-name-0', 'matcher-value-0', 'matcher-edit-0', 'matcher-delete-0'],
         true
       );
       expectMatch(null);
         true
       );
       expectMatch(null);
@@ -423,12 +415,10 @@ describe('SilenceFormComponent', () => {
         [
           'matcher-name-0',
           'matcher-value-0',
         [
           'matcher-name-0',
           'matcher-value-0',
-          'matcher-isRegex-0',
           'matcher-edit-0',
           'matcher-delete-0',
           'matcher-name-1',
           'matcher-value-1',
           'matcher-edit-0',
           'matcher-delete-0',
           'matcher-name-1',
           'matcher-value-1',
-          'matcher-isRegex-1',
           'matcher-edit-1',
           'matcher-delete-1'
         ],
           'matcher-edit-1',
           'matcher-delete-1'
         ],
@@ -443,8 +433,6 @@ describe('SilenceFormComponent', () => {
       fixture.detectChanges();
       fixtureH.expectFormFieldToBe('#matcher-name-0', 'alertname');
       fixtureH.expectFormFieldToBe('#matcher-value-0', 'alert.*');
       fixture.detectChanges();
       fixtureH.expectFormFieldToBe('#matcher-name-0', 'alertname');
       fixtureH.expectFormFieldToBe('#matcher-value-0', 'alert.*');
-      fixtureH.expectFormFieldToBe('#matcher-isRegex-0', 'true');
-      fixtureH.expectFormFieldToBe('#matcher-isRegex-1', 'false');
       expectMatch(null);
     });
 
       expectMatch(null);
     });
 
@@ -467,7 +455,6 @@ describe('SilenceFormComponent', () => {
 
       fixtureH.expectFormFieldToBe('#matcher-name-0', 'alertname');
       fixtureH.expectFormFieldToBe('#matcher-value-0', 'alert0');
 
       fixtureH.expectFormFieldToBe('#matcher-name-0', 'alertname');
       fixtureH.expectFormFieldToBe('#matcher-value-0', 'alert0');
-      fixtureH.expectFormFieldToBe('#matcher-isRegex-0', 'false');
       expectMatch('Matches 1 rule with 1 active alert.');
     });
 
       expectMatch('Matches 1 rule with 1 active alert.');
     });
 
@@ -506,14 +493,22 @@ describe('SilenceFormComponent', () => {
     let silence: AlertmanagerSilence;
     const silenceId = '50M3-10N6-1D';
 
     let silence: AlertmanagerSilence;
     const silenceId = '50M3-10N6-1D';
 
-    const expectSuccessNotification = (titleStartsWith: string) =>
+    const expectSuccessNotification = (
+      titleStartsWith: string,
+      matchers: AlertmanagerSilenceMatcher[]
+    ) => {
+      let msg = '';
+      for (const matcher of matchers) {
+        msg = msg.concat(` ${matcher.name} - ${matcher.value},`);
+      }
       expect(notificationService.show).toHaveBeenCalledWith(
         NotificationType.success,
       expect(notificationService.show).toHaveBeenCalledWith(
         NotificationType.success,
-        `${titleStartsWith} silence ${silenceId}`,
+        `${titleStartsWith} silence for ${msg.slice(0, -1)}`,
         undefined,
         undefined,
         'Prometheus'
       );
         undefined,
         undefined,
         'Prometheus'
       );
+    };
 
     const fillAndSubmit = () => {
       ['createdBy', 'comment'].forEach((attr) => {
 
     const fillAndSubmit = () => {
       ['createdBy', 'comment'].forEach((attr) => {
@@ -575,7 +570,7 @@ describe('SilenceFormComponent', () => {
     it('should create a silence', () => {
       fillAndSubmit();
       expect(prometheusService.setSilence).toHaveBeenCalledWith(silence);
     it('should create a silence', () => {
       fillAndSubmit();
       expect(prometheusService.setSilence).toHaveBeenCalledWith(silence);
-      expectSuccessNotification('Created');
+      expectSuccessNotification('Created', silence.matchers);
     });
 
     it('should recreate a silence', () => {
     });
 
     it('should recreate a silence', () => {
@@ -583,7 +578,7 @@ describe('SilenceFormComponent', () => {
       component.id = 'recreateId';
       fillAndSubmit();
       expect(prometheusService.setSilence).toHaveBeenCalledWith(silence);
       component.id = 'recreateId';
       fillAndSubmit();
       expect(prometheusService.setSilence).toHaveBeenCalledWith(silence);
-      expectSuccessNotification('Recreated');
+      expectSuccessNotification('Recreated', silence.matchers);
     });
 
     it('should edit a silence', () => {
     });
 
     it('should edit a silence', () => {
@@ -592,7 +587,7 @@ describe('SilenceFormComponent', () => {
       silence.id = component.id;
       fillAndSubmit();
       expect(prometheusService.setSilence).toHaveBeenCalledWith(silence);
       silence.id = component.id;
       fillAndSubmit();
       expect(prometheusService.setSilence).toHaveBeenCalledWith(silence);
-      expectSuccessNotification('Edited');
+      expectSuccessNotification('Edited', silence.matchers);
     });
   });
 });
     });
   });
 });
index b698e4958eddacbdfb10716da42ad8c2b2b47be3..958039a31dc716fd7d48fdbff9100b7becd49fb7 100644 (file)
@@ -37,6 +37,8 @@ export class SilenceFormComponent {
   permission: Permission;
   form: CdFormGroup;
   rules: PrometheusRule[];
   permission: Permission;
   form: CdFormGroup;
   rules: PrometheusRule[];
+  matchName = '';
+  matchValue = '';
 
   recreate = false;
   edit = false;
 
   recreate = false;
   edit = false;
@@ -50,22 +52,20 @@ export class SilenceFormComponent {
   matcherConfig = [
     {
       tooltip: $localize`Attribute name`,
   matcherConfig = [
     {
       tooltip: $localize`Attribute name`,
-      icon: this.icons.paragraph,
       attribute: 'name'
     },
       attribute: 'name'
     },
-    {
-      tooltip: $localize`Value`,
-      icon: this.icons.terminal,
-      attribute: 'value'
-    },
     {
       tooltip: $localize`Regular expression`,
     {
       tooltip: $localize`Regular expression`,
-      icon: this.icons.magic,
       attribute: 'isRegex'
       attribute: 'isRegex'
+    },
+    {
+      tooltip: $localize`Value`,
+      attribute: 'value'
     }
   ];
 
   datetimeFormat = 'YYYY-MM-DD HH:mm';
     }
   ];
 
   datetimeFormat = 'YYYY-MM-DD HH:mm';
+  isNavigate = true;
 
   constructor(
     private router: Router,
 
   constructor(
     private router: Router,
@@ -183,7 +183,7 @@ export class SilenceFormComponent {
     this.getModeSpecificData();
   }
 
     this.getModeSpecificData();
   }
 
-  private getRules() {
+  getRules() {
     this.prometheusService.ifPrometheusConfigured(
       () =>
         this.prometheusService.getRules().subscribe(
     this.prometheusService.ifPrometheusConfigured(
       () =>
         this.prometheusService.getRules().subscribe(
@@ -209,6 +209,7 @@ export class SilenceFormComponent {
         );
       }
     );
         );
       }
     );
+    return this.rules;
   }
 
   private getModeSpecificData() {
   }
 
   private getModeSpecificData() {
@@ -259,13 +260,11 @@ export class SilenceFormComponent {
 
   private fillFormByAlert(alert: AlertmanagerAlert) {
     const labels = alert.labels;
 
   private fillFormByAlert(alert: AlertmanagerAlert) {
     const labels = alert.labels;
-    Object.keys(labels).forEach((key) =>
-      this.setMatcher({
-        name: key,
-        value: labels[key],
-        isRegex: false
-      })
-    );
+    this.setMatcher({
+      name: 'alertname',
+      value: labels.alertname,
+      isRegex: false
+    });
   }
 
   private setMatcher(matcher: AlertmanagerSilenceMatcher, index?: number) {
   }
 
   private setMatcher(matcher: AlertmanagerSilenceMatcher, index?: number) {
@@ -295,20 +294,26 @@ export class SilenceFormComponent {
     this.validateMatchers();
   }
 
     this.validateMatchers();
   }
 
-  submit() {
+  submit(data?: any) {
     if (this.form.invalid) {
       return;
     }
     this.prometheusService.setSilence(this.getSubmitData()).subscribe(
       (resp) => {
     if (this.form.invalid) {
       return;
     }
     this.prometheusService.setSilence(this.getSubmitData()).subscribe(
       (resp) => {
-        this.router.navigate(['/monitoring/silences']);
+        if (data) {
+          data.silenceId = resp.body['silenceId'];
+        }
+        if (this.isNavigate) {
+          this.router.navigate(['/monitoring/silences']);
+        }
         this.notificationService.show(
           NotificationType.success,
         this.notificationService.show(
           NotificationType.success,
-          this.getNotificationTile(resp.body['silenceId']),
+          this.getNotificationTile(this.matchers),
           undefined,
           undefined,
           'Prometheus'
         );
           undefined,
           undefined,
           'Prometheus'
         );
+        this.matchers = [];
       },
       () => this.form.setErrors({ cdSubmitButton: true })
     );
       },
       () => this.form.setErrors({ cdSubmitButton: true })
     );
@@ -326,7 +331,7 @@ export class SilenceFormComponent {
     return payload;
   }
 
     return payload;
   }
 
-  private getNotificationTile(id: string) {
+  private getNotificationTile(matchers: AlertmanagerSilenceMatcher[]) {
     let action;
     if (this.edit) {
       action = this.succeededLabels.EDITED;
     let action;
     if (this.edit) {
       action = this.succeededLabels.EDITED;
@@ -335,6 +340,10 @@ export class SilenceFormComponent {
     } else {
       action = this.succeededLabels.CREATED;
     }
     } else {
       action = this.succeededLabels.CREATED;
     }
-    return `${action} ${this.resource} ${id}`;
+    let msg = '';
+    for (const matcher of matchers) {
+      msg = msg.concat(` ${matcher.name} - ${matcher.value},`);
+    }
+    return `${action} ${this.resource} for ${msg.slice(0, -1)}`;
   }
 }
   }
 }
index cc4b76c327152c6a2ead9cb75ec27ce0720d3e79..a136b2bac1119b6c328e0d909bc5255df1402766 100644 (file)
@@ -11,6 +11,8 @@ import { PrometheusService } from '~/app/shared/api/prometheus.service';
 import { CriticalConfirmationModalComponent } from '~/app/shared/components/critical-confirmation-modal/critical-confirmation-modal.component';
 import { TableActionsComponent } from '~/app/shared/datatable/table-actions/table-actions.component';
 import { NotificationType } from '~/app/shared/enum/notification-type.enum';
 import { CriticalConfirmationModalComponent } from '~/app/shared/components/critical-confirmation-modal/critical-confirmation-modal.component';
 import { TableActionsComponent } from '~/app/shared/datatable/table-actions/table-actions.component';
 import { NotificationType } from '~/app/shared/enum/notification-type.enum';
+import { Permission } from '~/app/shared/models/permissions';
+import { AuthStorageService } from '~/app/shared/services/auth-storage.service';
 import { ModalService } from '~/app/shared/services/modal.service';
 import { NotificationService } from '~/app/shared/services/notification.service';
 import { SharedModule } from '~/app/shared/shared.module';
 import { ModalService } from '~/app/shared/services/modal.service';
 import { NotificationService } from '~/app/shared/services/notification.service';
 import { SharedModule } from '~/app/shared/shared.module';
@@ -22,6 +24,8 @@ describe('SilenceListComponent', () => {
   let component: SilenceListComponent;
   let fixture: ComponentFixture<SilenceListComponent>;
   let prometheusService: PrometheusService;
   let component: SilenceListComponent;
   let fixture: ComponentFixture<SilenceListComponent>;
   let prometheusService: PrometheusService;
+  let authStorageService: AuthStorageService;
+  let prometheusPermissions: Permission;
 
   configureTestBed({
     imports: [
 
   configureTestBed({
     imports: [
@@ -36,6 +40,11 @@ describe('SilenceListComponent', () => {
   });
 
   beforeEach(() => {
   });
 
   beforeEach(() => {
+    authStorageService = TestBed.inject(AuthStorageService);
+    prometheusPermissions = new Permission(['update', 'delete', 'read', 'create']);
+    spyOn(authStorageService, 'getPermissions').and.callFake(() => ({
+      prometheus: prometheusPermissions
+    }));
     fixture = TestBed.createComponent(SilenceListComponent);
     component = fixture.componentInstance;
     prometheusService = TestBed.inject(PrometheusService);
     fixture = TestBed.createComponent(SilenceListComponent);
     component = fixture.componentInstance;
     prometheusService = TestBed.inject(PrometheusService);
index c351a64e5ac7ad148a959b6157b8d87ac053a855..29af2bd2ae891c33865fb9750cb12c302a5b0f27 100644 (file)
@@ -4,6 +4,8 @@ import { NgbModalRef } from '@ng-bootstrap/ng-bootstrap';
 import { SortDirection, SortPropDir } from '@swimlane/ngx-datatable';
 import { Observable, Subscriber } from 'rxjs';
 
 import { SortDirection, SortPropDir } from '@swimlane/ngx-datatable';
 import { Observable, Subscriber } from 'rxjs';
 
+import { PrometheusListHelper } from '~/app/ceph/cluster/prometheus/prometheus-list-helper';
+import { SilenceFormComponent } from '~/app/ceph/cluster/prometheus/silence-form/silence-form.component';
 import { PrometheusService } from '~/app/shared/api/prometheus.service';
 import { CriticalConfirmationModalComponent } from '~/app/shared/components/critical-confirmation-modal/critical-confirmation-modal.component';
 import { ActionLabelsI18n, SucceededActionLabelsI18n } from '~/app/shared/constants/app.constants';
 import { PrometheusService } from '~/app/shared/api/prometheus.service';
 import { CriticalConfirmationModalComponent } from '~/app/shared/components/critical-confirmation-modal/critical-confirmation-modal.component';
 import { ActionLabelsI18n, SucceededActionLabelsI18n } from '~/app/shared/constants/app.constants';
@@ -15,17 +17,21 @@ import { CdTableAction } from '~/app/shared/models/cd-table-action';
 import { CdTableColumn } from '~/app/shared/models/cd-table-column';
 import { CdTableSelection } from '~/app/shared/models/cd-table-selection';
 import { Permission } from '~/app/shared/models/permissions';
 import { CdTableColumn } from '~/app/shared/models/cd-table-column';
 import { CdTableSelection } from '~/app/shared/models/cd-table-selection';
 import { Permission } from '~/app/shared/models/permissions';
+import { PrometheusRule } from '~/app/shared/models/prometheus-alerts';
 import { CdDatePipe } from '~/app/shared/pipes/cd-date.pipe';
 import { AuthStorageService } from '~/app/shared/services/auth-storage.service';
 import { ModalService } from '~/app/shared/services/modal.service';
 import { NotificationService } from '~/app/shared/services/notification.service';
 import { CdDatePipe } from '~/app/shared/pipes/cd-date.pipe';
 import { AuthStorageService } from '~/app/shared/services/auth-storage.service';
 import { ModalService } from '~/app/shared/services/modal.service';
 import { NotificationService } from '~/app/shared/services/notification.service';
+import { PrometheusSilenceMatcherService } from '~/app/shared/services/prometheus-silence-matcher.service';
 import { URLBuilderService } from '~/app/shared/services/url-builder.service';
 import { URLBuilderService } from '~/app/shared/services/url-builder.service';
-import { PrometheusListHelper } from '../prometheus-list-helper';
 
 const BASE_URL = 'monitoring/silences';
 
 @Component({
 
 const BASE_URL = 'monitoring/silences';
 
 @Component({
-  providers: [{ provide: URLBuilderService, useValue: new URLBuilderService(BASE_URL) }],
+  providers: [
+    { provide: URLBuilderService, useValue: new URLBuilderService(BASE_URL) },
+    SilenceFormComponent
+  ],
   selector: 'cd-silences-list',
   templateUrl: './silence-list.component.html',
   styleUrls: ['./silence-list.component.scss']
   selector: 'cd-silences-list',
   templateUrl: './silence-list.component.html',
   styleUrls: ['./silence-list.component.scss']
@@ -43,6 +49,8 @@ export class SilenceListComponent extends PrometheusListHelper {
     'badge badge-default': 'expired'
   };
   sorts: SortPropDir[] = [{ prop: 'endsAt', dir: SortDirection.desc }];
     'badge badge-default': 'expired'
   };
   sorts: SortPropDir[] = [{ prop: 'endsAt', dir: SortDirection.desc }];
+  rules: PrometheusRule[];
+  visited: boolean;
 
   constructor(
     private authStorageService: AuthStorageService,
 
   constructor(
     private authStorageService: AuthStorageService,
@@ -52,6 +60,8 @@ export class SilenceListComponent extends PrometheusListHelper {
     private urlBuilder: URLBuilderService,
     private actionLabels: ActionLabelsI18n,
     private succeededLabels: SucceededActionLabelsI18n,
     private urlBuilder: URLBuilderService,
     private actionLabels: ActionLabelsI18n,
     private succeededLabels: SucceededActionLabelsI18n,
+    private silenceFormComponent: SilenceFormComponent,
+    private silenceMatcher: PrometheusSilenceMatcherService,
     @Inject(PrometheusService) prometheusService: PrometheusService
   ) {
     super(prometheusService);
     @Inject(PrometheusService) prometheusService: PrometheusService
   ) {
     super(prometheusService);
@@ -111,6 +121,12 @@ export class SilenceListComponent extends PrometheusListHelper {
         prop: 'id',
         flexGrow: 3
       },
         prop: 'id',
         flexGrow: 3
       },
+      {
+        name: $localize`Alerts Silenced`,
+        prop: 'silencedAlerts',
+        flexGrow: 3,
+        cellTransformation: CellTemplate.badge
+      },
       {
         name: $localize`Created by`,
         prop: 'createdBy',
       {
         name: $localize`Created by`,
         prop: 'createdBy',
@@ -144,6 +160,10 @@ export class SilenceListComponent extends PrometheusListHelper {
       this.prometheusService.getSilences().subscribe(
         (silences) => {
           this.silences = silences;
       this.prometheusService.getSilences().subscribe(
         (silences) => {
           this.silences = silences;
+          const activeSilences = silences.filter(
+            (silence: AlertmanagerSilence) => silence.status.state !== 'expired'
+          );
+          this.getAlerts(activeSilences);
         },
         () => {
           this.prometheusService.disableAlertmanagerConfig();
         },
         () => {
           this.prometheusService.disableAlertmanagerConfig();
@@ -156,6 +176,20 @@ export class SilenceListComponent extends PrometheusListHelper {
     this.selection = selection;
   }
 
     this.selection = selection;
   }
 
+  getAlerts(silences: any) {
+    const rules = this.silenceFormComponent.getRules();
+    silences.forEach((silence: any) => {
+      silence.matchers.forEach((matcher: any) => {
+        this.rules = this.silenceMatcher.getMatchedRules(matcher, rules);
+        const alertNames: string[] = [];
+        for (const rule of this.rules) {
+          alertNames.push(rule.name);
+        }
+        silence.silencedAlerts = alertNames;
+      });
+    });
+  }
+
   expireSilence() {
     const id = this.selection.first().id;
     const i18nSilence = $localize`Silence`;
   expireSilence() {
     const id = this.selection.first().id;
     const i18nSilence = $localize`Silence`;
index db89adc53690eff92ea78287b0da21530e871f93..78f05b64607aef545badc1c833df6cd5d5584f53 100644 (file)
@@ -14,7 +14,7 @@
                  for="name"
                  i18n>Name</label>
           <div class="cd-col-form-input">
                  for="name"
                  i18n>Name</label>
           <div class="cd-col-form-input">
-            <select class="form-control"
+            <select class="form-select"
                     id="name"
                     formControlName="name"
                     name="name">
                     id="name"
                     formControlName="name"
                     name="name">
             <input id="value"
                    (focus)="valueFocus.next($any($event).target.value)"
                    (click)="valueClick.next($any($event).target.value)"
             <input id="value"
                    (focus)="valueFocus.next($any($event).target.value)"
                    (click)="valueClick.next($any($event).target.value)"
-                   container="body"
                    class="form-control"
                    type="text"
                    [ngbTypeahead]="search"
                    class="form-control"
                    type="text"
                    [ngbTypeahead]="search"
-                   formControlName="value">
+                   formControlName="value"
+                   #instance="ngbTypeahead">
             <span *ngIf="form.showError('value', formDir, 'required')"
                   class="help-block"
                   i18n>This field is required!</span>
             <span *ngIf="form.showError('value', formDir, 'required')"
                   class="help-block"
                   i18n>This field is required!</span>
index fc782c5658d1f168abf17c726d4746a27cf809b5..14ec015d1b8ee4848547d5935462189c0a798be0 100644 (file)
@@ -6,18 +6,18 @@
 
 <ng-template #serviceDetailsTpl>
   <ng-container>
 
 <ng-template #serviceDetailsTpl>
   <ng-container>
-    <ul ngbNav
-        #nav="ngbNav"
-        class="nav-tabs"
-        cdStatefulTab="service-details">
-      <li ngbNavItem="details">
+    <nav ngbNav
+         #nav="ngbNav"
+         class="nav-tabs"
+         cdStatefulTab="service-details">
+      <ng-container ngbNavItem="details">
         <a ngbNavLink
            i18n>Details</a>
         <ng-template ngbNavContent>
           <ng-container *ngTemplateOutlet="serviceDaemonDetailsTpl"></ng-container>
         </ng-template>
         <a ngbNavLink
            i18n>Details</a>
         <ng-template ngbNavContent>
           <ng-container *ngTemplateOutlet="serviceDaemonDetailsTpl"></ng-container>
         </ng-template>
-      </li>
-      <li ngbNavItem="service_events">
+      </ng-container>
+      <ng-container ngbNavItem="service_events">
         <a ngbNavLink
            i18n>Service Events</a>
         <ng-template ngbNavContent>
         <a ngbNavLink
            i18n>Service Events</a>
         <ng-template ngbNavContent>
@@ -29,8 +29,8 @@
                     (fetchData)="getServices($event)">
           </cd-table>
         </ng-template>
                     (fetchData)="getServices($event)">
           </cd-table>
         </ng-template>
-      </li>
-    </ul>
+      </ng-container>
+    </nav>
     <div [ngbNavOutlet]="nav"></div>
   </ng-container>
 </ng-template>
     <div [ngbNavOutlet]="nav"></div>
   </ng-container>
 </ng-template>
index 31739a7c2988f26875bfd381d3ed99b787dfc730..d3ea8c018f66a91d61b560389da545bebb9147af 100644 (file)
@@ -1,3 +1,4 @@
+import { HttpHeaders } from '@angular/common/http';
 import { HttpClientTestingModule } from '@angular/common/http/testing';
 import { ComponentFixture, TestBed } from '@angular/core/testing';
 
 import { HttpClientTestingModule } from '@angular/common/http/testing';
 import { ComponentFixture, TestBed } from '@angular/core/testing';
 
@@ -10,6 +11,7 @@ import { CephModule } from '~/app/ceph/ceph.module';
 import { CoreModule } from '~/app/core/core.module';
 import { CephServiceService } from '~/app/shared/api/ceph-service.service';
 import { HostService } from '~/app/shared/api/host.service';
 import { CoreModule } from '~/app/core/core.module';
 import { CephServiceService } from '~/app/shared/api/ceph-service.service';
 import { HostService } from '~/app/shared/api/host.service';
+import { PaginateObservable } from '~/app/shared/api/paginate.model';
 import { CdTableFetchDataContext } from '~/app/shared/models/cd-table-fetch-data-context';
 import { SharedModule } from '~/app/shared/shared.module';
 import { configureTestBed } from '~/testing/unit-test-helper';
 import { CdTableFetchDataContext } from '~/app/shared/models/cd-table-fetch-data-context';
 import { SharedModule } from '~/app/shared/shared.module';
 import { configureTestBed } from '~/testing/unit-test-helper';
@@ -18,6 +20,7 @@ import { ServiceDaemonListComponent } from './service-daemon-list.component';
 describe('ServiceDaemonListComponent', () => {
   let component: ServiceDaemonListComponent;
   let fixture: ComponentFixture<ServiceDaemonListComponent>;
 describe('ServiceDaemonListComponent', () => {
   let component: ServiceDaemonListComponent;
   let fixture: ComponentFixture<ServiceDaemonListComponent>;
+  let headers: HttpHeaders;
 
   const daemons = [
     {
 
   const daemons = [
     {
@@ -117,6 +120,8 @@ describe('ServiceDaemonListComponent', () => {
     }
   ];
 
     }
   ];
 
+  const context = new CdTableFetchDataContext(() => undefined);
+
   const getDaemonsByHostname = (hostname?: string) => {
     return hostname ? _.filter(daemons, { hostname: hostname }) : daemons;
   };
   const getDaemonsByHostname = (hostname?: string) => {
     return hostname ? _.filter(daemons, { hostname: hostname }) : daemons;
   };
@@ -147,7 +152,13 @@ describe('ServiceDaemonListComponent', () => {
     spyOn(cephServiceService, 'getDaemons').and.callFake(() =>
       of(getDaemonsByServiceName(component.serviceName))
     );
     spyOn(cephServiceService, 'getDaemons').and.callFake(() =>
       of(getDaemonsByServiceName(component.serviceName))
     );
-    spyOn(cephServiceService, 'list').and.returnValue(of(services));
+
+    headers = new HttpHeaders().set('X-Total-Count', '2');
+    const paginate_obs = new PaginateObservable<any>(of({ body: services, headers: headers }));
+    spyOn(cephServiceService, 'list').and.returnValue(paginate_obs);
+    context.pageInfo.offset = 0;
+    context.pageInfo.limit = -1;
+
     fixture.detectChanges();
   });
 
     fixture.detectChanges();
   });
 
@@ -157,18 +168,18 @@ describe('ServiceDaemonListComponent', () => {
 
   it('should list daemons by host', () => {
     component.hostname = 'mon0';
 
   it('should list daemons by host', () => {
     component.hostname = 'mon0';
-    component.getDaemons(new CdTableFetchDataContext(() => undefined));
+    component.getDaemons(context);
     expect(component.daemons.length).toBe(1);
   });
 
   it('should list daemons by service', () => {
     component.serviceName = 'osd';
     expect(component.daemons.length).toBe(1);
   });
 
   it('should list daemons by service', () => {
     component.serviceName = 'osd';
-    component.getDaemons(new CdTableFetchDataContext(() => undefined));
+    component.getDaemons(context);
     expect(component.daemons.length).toBe(3);
   });
 
   it('should list services', () => {
     expect(component.daemons.length).toBe(3);
   });
 
   it('should list services', () => {
-    component.getServices(new CdTableFetchDataContext(() => undefined));
+    component.getServices(context);
     expect(component.services.length).toBe(2);
   });
 
     expect(component.services.length).toBe(2);
   });
 
index d1c2f9cc3f11d153fcccce0883d9d2c66990fa68..c626e4785122db33918bf43235ec97f66db7224e 100644 (file)
@@ -1,5 +1,7 @@
+import { HttpParams } from '@angular/common/http';
 import {
   AfterViewInit,
 import {
   AfterViewInit,
+  ChangeDetectorRef,
   Component,
   Input,
   OnChanges,
   Component,
   Input,
   OnChanges,
@@ -97,7 +99,8 @@ export class ServiceDaemonListComponent implements OnInit, OnChanges, AfterViewI
     public actionLabels: ActionLabelsI18n,
     private authStorageService: AuthStorageService,
     private daemonService: DaemonService,
     public actionLabels: ActionLabelsI18n,
     private authStorageService: AuthStorageService,
     private daemonService: DaemonService,
-    private notificationService: NotificationService
+    private notificationService: NotificationService,
+    private cdRef: ChangeDetectorRef
   ) {}
 
   ngOnInit() {
   ) {}
 
   ngOnInit() {
@@ -214,6 +217,10 @@ export class ServiceDaemonListComponent implements OnInit, OnChanges, AfterViewI
     this.columns = this.columns.filter((col: any) => {
       return !this.hiddenColumns.includes(col.prop);
     });
     this.columns = this.columns.filter((col: any) => {
       return !this.hiddenColumns.includes(col.prop);
     });
+
+    setTimeout(() => {
+      this.cdRef.detectChanges();
+    }, 1000);
   }
 
   ngOnChanges() {
   }
 
   ngOnChanges() {
@@ -281,15 +288,17 @@ export class ServiceDaemonListComponent implements OnInit, OnChanges, AfterViewI
     });
   }
   getServices(context: CdTableFetchDataContext) {
     });
   }
   getServices(context: CdTableFetchDataContext) {
-    this.serviceSub = this.cephServiceService.list(this.serviceName).subscribe(
-      (services: CephServiceSpec[]) => {
-        this.services = services;
-      },
-      () => {
-        this.services = [];
-        context.error();
-      }
-    );
+    this.serviceSub = this.cephServiceService
+      .list(new HttpParams({ fromObject: { limit: -1, offset: 0 } }), this.serviceName)
+      .observable.subscribe(
+        (services: CephServiceSpec[]) => {
+          this.services = services;
+        },
+        () => {
+          this.services = [];
+          context.error();
+        }
+      );
   }
 
   trackByFn(_index: any, item: any) {
   }
 
   trackByFn(_index: any, item: any) {
index dcd898d8853789ef61a342becaae2e8496839d7c..8f85bf723e4251e7f9d09d2a102960d45d2d473f 100644 (file)
@@ -16,7 +16,7 @@
           <div class="cd-col-form-input">
             <select id="service_type"
                     name="service_type"
           <div class="cd-col-form-input">
             <select id="service_type"
                     name="service_type"
-                    class="form-control"
+                    class="form-select"
                     formControlName="service_type"
                     (change)="getServiceIds($event.target.value)">
               <option i18n
                     formControlName="service_type"
                     (change)="getServiceIds($event.target.value)">
               <option i18n
@@ -42,7 +42,7 @@
             <div class="cd-col-form-input">
               <select id="backend_service"
                       name="backend_service"
             <div class="cd-col-form-input">
               <select id="backend_service"
                       name="backend_service"
-                      class="form-control"
+                      class="form-select"
                       formControlName="backend_service"
                       (change)="prePopulateId()">
                 <option *ngIf="services === null"
                       formControlName="backend_service"
                       (change)="prePopulateId()">
                 <option *ngIf="services === null"
         <!-- Service id -->
         <div class="form-group row"
              *ngIf="serviceForm.controls.service_type.value !== 'snmp-gateway'">
         <!-- Service id -->
         <div class="form-group row"
              *ngIf="serviceForm.controls.service_type.value !== 'snmp-gateway'">
-          <label i18n
-                 class="cd-col-form-label"
+          <label class="cd-col-form-label"
                  [ngClass]="{'required': ['mds', 'rgw', 'nfs', 'iscsi', 'ingress'].includes(serviceForm.controls.service_type.value)}"
                  [ngClass]="{'required': ['mds', 'rgw', 'nfs', 'iscsi', 'ingress'].includes(serviceForm.controls.service_type.value)}"
-                 for="service_id">Id</label>
+                 for="service_id">
+            <span i18n>Id</span>
+            <cd-helper i18n>Used in the service name which is &lt;service_type.service_id&gt;</cd-helper>
+          </label>
           <div class="cd-col-form-input">
             <input id="service_id"
                    class="form-control"
           <div class="cd-col-form-input">
             <input id="service_id"
                    class="form-control"
@@ -84,6 +86,9 @@
             <span class="invalid-feedback"
                   *ngIf="serviceForm.showError('service_id', frm, 'rgwPattern')"
                   i18n>The value does not match the pattern <strong>&lt;service_id&gt;[.&lt;realm_name&gt;.&lt;zone_name&gt;]</strong>.</span>
             <span class="invalid-feedback"
                   *ngIf="serviceForm.showError('service_id', frm, 'rgwPattern')"
                   i18n>The value does not match the pattern <strong>&lt;service_id&gt;[.&lt;realm_name&gt;.&lt;zone_name&gt;]</strong>.</span>
+            <span class="invalid-feedback"
+                  *ngIf="serviceForm.showError('service_id', frm, 'mdsPattern')"
+                  i18n>MDS service id must start with a letter and contain alphanumeric characters or '.', '-', and '_'</span>
           </div>
         </div>
 
           </div>
         </div>
 
                  i18n>Placement</label>
           <div class="cd-col-form-input">
             <select id="placement"
                  i18n>Placement</label>
           <div class="cd-col-form-input">
             <select id="placement"
-                    class="form-control"
+                    class="form-select"
                     formControlName="placement">
               <option i18n
                       value="hosts">Hosts</option>
                     formControlName="placement">
               <option i18n
                       value="hosts">Hosts</option>
           <div class="cd-col-form-input">
             <select id="pool"
                     name="pool"
           <div class="cd-col-form-input">
             <select id="pool"
                     name="pool"
-                    class="form-control"
+                    class="form-select"
                     formControlName="pool">
               <option *ngIf="pools === null"
                       [ngValue]="null"
                     formControlName="pool">
               <option *ngIf="pools === null"
                       [ngValue]="null"
                        type="password"
                        autocomplete="new-password"
                        formControlName="api_password">
                        type="password"
                        autocomplete="new-password"
                        formControlName="api_password">
-                <span class="input-group-append">
-                  <button type="button"
-                          class="btn btn-light"
-                          cdPasswordButton="api_password">
-                  </button>
-                  <cd-copy-2-clipboard-button source="api_password">
-                  </cd-copy-2-clipboard-button>
-                </span>
+                <button type="button"
+                        class="btn btn-light"
+                        cdPasswordButton="api_password">
+                </button>
+                <cd-copy-2-clipboard-button source="api_password">
+                </cd-copy-2-clipboard-button>
                 <span class="invalid-feedback"
                       *ngIf="serviceForm.showError('api_password', frm, 'required')"
                       i18n>This field is required.</span>
                 <span class="invalid-feedback"
                       *ngIf="serviceForm.showError('api_password', frm, 'required')"
                       i18n>This field is required.</span>
             <div class="cd-col-form-input">
               <select id="snmp_version"
                       name="snmp_version"
             <div class="cd-col-form-input">
               <select id="snmp_version"
                       name="snmp_version"
-                      class="form-control"
+                      class="form-select"
                       formControlName="snmp_version"
                       (change)="clearValidations()">
                 <option i18n
                       formControlName="snmp_version"
                       (change)="clearValidations()">
                 <option i18n
             <div class="cd-col-form-input">
               <select id="auth_protocol"
                       name="auth_protocol"
             <div class="cd-col-form-input">
               <select id="auth_protocol"
                       name="auth_protocol"
-                      class="form-control"
+                      class="form-select"
                       formControlName="auth_protocol">
                 <option i18n
                         [ngValue]="null">-- Select auth protocol --</option>
                       formControlName="auth_protocol">
                 <option i18n
                         [ngValue]="null">-- Select auth protocol --</option>
             <div class="cd-col-form-input">
               <select id="privacy_protocol"
                       name="privacy_protocol"
             <div class="cd-col-form-input">
               <select id="privacy_protocol"
                       name="privacy_protocol"
-                      class="form-control"
+                      class="form-select"
                       formControlName="privacy_protocol">
                 <option i18n
                         [ngValue]="null">-- Select privacy protocol --</option>
                       formControlName="privacy_protocol">
                 <option i18n
                         [ngValue]="null">-- Select privacy protocol --</option>
index 082fe9162b154dbd71a598402814007cc5994584..e86a86fd65e4ce6d7f63e04e5f0eeb7b74eb573e 100644 (file)
@@ -7,8 +7,10 @@ import { RouterTestingModule } from '@angular/router/testing';
 import { NgbActiveModal, NgbTypeaheadModule } from '@ng-bootstrap/ng-bootstrap';
 import _ from 'lodash';
 import { ToastrModule } from 'ngx-toastr';
 import { NgbActiveModal, NgbTypeaheadModule } from '@ng-bootstrap/ng-bootstrap';
 import _ from 'lodash';
 import { ToastrModule } from 'ngx-toastr';
+import { of } from 'rxjs';
 
 import { CephServiceService } from '~/app/shared/api/ceph-service.service';
 
 import { CephServiceService } from '~/app/shared/api/ceph-service.service';
+import { PaginateObservable } from '~/app/shared/api/paginate.model';
 import { CdFormGroup } from '~/app/shared/forms/cd-form-group';
 import { SharedModule } from '~/app/shared/shared.module';
 import { configureTestBed, FormHelper } from '~/testing/unit-test-helper';
 import { CdFormGroup } from '~/app/shared/forms/cd-form-group';
 import { SharedModule } from '~/app/shared/shared.module';
 import { configureTestBed, FormHelper } from '~/testing/unit-test-helper';
@@ -530,13 +532,38 @@ x4Ea7kGVgx9kWh5XjWz9wjZvY49UKIT5ppIAWPMbLl3UpfckiuNhTA==
       });
     });
 
       });
     });
 
+    describe('should test service mds', () => {
+      beforeEach(() => {
+        formHelper.setValue('service_type', 'mds');
+        const paginate_obs = new PaginateObservable<any>(of({}));
+        spyOn(cephServiceService, 'list').and.returnValue(paginate_obs);
+      });
+
+      it('should test mds valid service id', () => {
+        formHelper.setValue('service_id', 'svc123');
+        formHelper.expectValid('service_id');
+        formHelper.setValue('service_id', 'svc_id-1');
+        formHelper.expectValid('service_id');
+      });
+
+      it('should test mds invalid service id', () => {
+        formHelper.setValue('service_id', '123');
+        formHelper.expectError('service_id', 'mdsPattern');
+        formHelper.setValue('service_id', '123svc');
+        formHelper.expectError('service_id', 'mdsPattern');
+        formHelper.setValue('service_id', 'svc#1');
+        formHelper.expectError('service_id', 'mdsPattern');
+      });
+    });
+
     describe('check edit fields', () => {
       beforeEach(() => {
         component.editing = true;
       });
 
       it('should check whether edit field is correctly loaded', () => {
     describe('check edit fields', () => {
       beforeEach(() => {
         component.editing = true;
       });
 
       it('should check whether edit field is correctly loaded', () => {
-        const cephServiceSpy = spyOn(cephServiceService, 'list').and.callThrough();
+        const paginate_obs = new PaginateObservable<any>(of({}));
+        const cephServiceSpy = spyOn(cephServiceService, 'list').and.returnValue(paginate_obs);
         component.ngOnInit();
         expect(cephServiceSpy).toBeCalledTimes(2);
         expect(component.action).toBe('Edit');
         component.ngOnInit();
         expect(cephServiceSpy).toBeCalledTimes(2);
         expect(component.action).toBe('Edit');
index 4cab7843784f340dd99390817de0d31789b5e637..3b5cc0c71869a358725437dc1a4032c1ef83c931 100644 (file)
@@ -1,3 +1,4 @@
+import { HttpParams } from '@angular/common/http';
 import { Component, Input, OnInit, ViewChild } from '@angular/core';
 import { AbstractControl, Validators } from '@angular/forms';
 import { ActivatedRoute, Router } from '@angular/router';
 import { Component, Input, OnInit, ViewChild } from '@angular/core';
 import { AbstractControl, Validators } from '@angular/forms';
 import { ActivatedRoute, Router } from '@angular/router';
@@ -28,6 +29,7 @@ import { TaskWrapperService } from '~/app/shared/services/task-wrapper.service';
 })
 export class ServiceFormComponent extends CdForm implements OnInit {
   readonly RGW_SVC_ID_PATTERN = /^([^.]+)(\.([^.]+)\.([^.]+))?$/;
 })
 export class ServiceFormComponent extends CdForm implements OnInit {
   readonly RGW_SVC_ID_PATTERN = /^([^.]+)(\.([^.]+)\.([^.]+))?$/;
+  readonly MDS_SVC_ID_PATTERN = /^[a-zA-Z_.-][a-zA-Z0-9_.-]*$/;
   readonly SNMP_DESTINATION_PATTERN = /^[^\:]+:[0-9]/;
   readonly SNMP_ENGINE_ID_PATTERN = /^[0-9A-Fa-f]{10,64}/g;
   readonly INGRESS_SUPPORTED_SERVICE_TYPES = ['rgw', 'nfs'];
   readonly SNMP_DESTINATION_PATTERN = /^[^\:]+:[0-9]/;
   readonly SNMP_ENGINE_ID_PATTERN = /^[0-9A-Fa-f]{10,64}/g;
   readonly INGRESS_SUPPORTED_SERVICE_TYPES = ['rgw', 'nfs'];
@@ -86,9 +88,20 @@ export class ServiceFormComponent extends CdForm implements OnInit {
       service_id: [
         null,
         [
       service_id: [
         null,
         [
-          CdValidators.requiredIf({
-            service_type: 'mds'
-          }),
+          CdValidators.composeIf(
+            {
+              service_type: 'mds'
+            },
+            [
+              Validators.required,
+              CdValidators.custom('mdsPattern', (value: string) => {
+                if (_.isEmpty(value)) {
+                  return false;
+                }
+                return !this.MDS_SVC_ID_PATTERN.test(value);
+              })
+            ]
+          ),
           CdValidators.requiredIf({
             service_type: 'nfs'
           }),
           CdValidators.requiredIf({
             service_type: 'nfs'
           }),
@@ -338,12 +351,14 @@ export class ServiceFormComponent extends CdForm implements OnInit {
       });
     }
 
       });
     }
 
-    this.cephServiceService.list().subscribe((services: CephServiceSpec[]) => {
-      this.serviceList = services;
-      this.services = services.filter((service: any) =>
-        this.INGRESS_SUPPORTED_SERVICE_TYPES.includes(service.service_type)
-      );
-    });
+    this.cephServiceService
+      .list(new HttpParams({ fromObject: { limit: -1, offset: 0 } }))
+      .observable.subscribe((services: CephServiceSpec[]) => {
+        this.serviceList = services;
+        this.services = services.filter((service: any) =>
+          this.INGRESS_SUPPORTED_SERVICE_TYPES.includes(service.service_type)
+        );
+      });
 
     this.cephServiceService.getKnownTypes().subscribe((resp: Array<string>) => {
       // Remove service types:
 
     this.cephServiceService.getKnownTypes().subscribe((resp: Array<string>) => {
       // Remove service types:
@@ -373,102 +388,106 @@ export class ServiceFormComponent extends CdForm implements OnInit {
     if (this.editing) {
       this.action = this.actionLabels.EDIT;
       this.disableForEditing(this.serviceType);
     if (this.editing) {
       this.action = this.actionLabels.EDIT;
       this.disableForEditing(this.serviceType);
-      this.cephServiceService.list(this.serviceName).subscribe((response: CephServiceSpec[]) => {
-        const formKeys = ['service_type', 'service_id', 'unmanaged'];
-        formKeys.forEach((keys) => {
-          this.serviceForm.get(keys).setValue(response[0][keys]);
-        });
-        if (!response[0]['unmanaged']) {
-          const placementKey = Object.keys(response[0]['placement'])[0];
-          let placementValue: string;
-          ['hosts', 'label'].indexOf(placementKey) >= 0
-            ? (placementValue = placementKey)
-            : (placementValue = 'hosts');
-          this.serviceForm.get('placement').setValue(placementValue);
-          this.serviceForm.get('count').setValue(response[0]['placement']['count']);
-          if (response[0]?.placement[placementValue]) {
-            this.serviceForm.get(placementValue).setValue(response[0]?.placement[placementValue]);
-          }
-        }
-        switch (this.serviceType) {
-          case 'iscsi':
-            const specKeys = ['pool', 'api_password', 'api_user', 'trusted_ip_list', 'api_port'];
-            specKeys.forEach((key) => {
-              this.serviceForm.get(key).setValue(response[0].spec[key]);
-            });
-            this.serviceForm.get('ssl').setValue(response[0].spec?.api_secure);
-            if (response[0].spec?.api_secure) {
-              this.serviceForm.get('ssl_cert').setValue(response[0].spec?.ssl_cert);
-              this.serviceForm.get('ssl_key').setValue(response[0].spec?.ssl_key);
+      this.cephServiceService
+        .list(new HttpParams({ fromObject: { limit: -1, offset: 0 } }), this.serviceName)
+        .observable.subscribe((response: CephServiceSpec[]) => {
+          const formKeys = ['service_type', 'service_id', 'unmanaged'];
+          formKeys.forEach((keys) => {
+            this.serviceForm.get(keys).setValue(response[0][keys]);
+          });
+          if (!response[0]['unmanaged']) {
+            const placementKey = Object.keys(response[0]['placement'])[0];
+            let placementValue: string;
+            ['hosts', 'label'].indexOf(placementKey) >= 0
+              ? (placementValue = placementKey)
+              : (placementValue = 'hosts');
+            this.serviceForm.get('placement').setValue(placementValue);
+            this.serviceForm.get('count').setValue(response[0]['placement']['count']);
+            if (response[0]?.placement[placementValue]) {
+              this.serviceForm.get(placementValue).setValue(response[0]?.placement[placementValue]);
             }
             }
-            break;
-          case 'rgw':
-            this.serviceForm.get('rgw_frontend_port').setValue(response[0].spec?.rgw_frontend_port);
-            this.serviceForm.get('ssl').setValue(response[0].spec?.ssl);
-            if (response[0].spec?.ssl) {
+          }
+          switch (this.serviceType) {
+            case 'iscsi':
+              const specKeys = ['pool', 'api_password', 'api_user', 'trusted_ip_list', 'api_port'];
+              specKeys.forEach((key) => {
+                this.serviceForm.get(key).setValue(response[0].spec[key]);
+              });
+              this.serviceForm.get('ssl').setValue(response[0].spec?.api_secure);
+              if (response[0].spec?.api_secure) {
+                this.serviceForm.get('ssl_cert').setValue(response[0].spec?.ssl_cert);
+                this.serviceForm.get('ssl_key').setValue(response[0].spec?.ssl_key);
+              }
+              break;
+            case 'rgw':
               this.serviceForm
               this.serviceForm
-                .get('ssl_cert')
-                .setValue(response[0].spec?.rgw_frontend_ssl_certificate);
-            }
-            break;
-          case 'ingress':
-            const ingressSpecKeys = [
-              'backend_service',
-              'virtual_ip',
-              'frontend_port',
-              'monitor_port',
-              'virtual_interface_networks',
-              'ssl'
-            ];
-            ingressSpecKeys.forEach((key) => {
-              this.serviceForm.get(key).setValue(response[0].spec[key]);
-            });
-            if (response[0].spec?.ssl) {
-              this.serviceForm.get('ssl_cert').setValue(response[0].spec?.ssl_cert);
-              this.serviceForm.get('ssl_key').setValue(response[0].spec?.ssl_key);
-            }
-            break;
-          case 'snmp-gateway':
-            const snmpCommonSpecKeys = ['snmp_version', 'snmp_destination'];
-            snmpCommonSpecKeys.forEach((key) => {
-              this.serviceForm.get(key).setValue(response[0].spec[key]);
-            });
-            if (this.serviceForm.getValue('snmp_version') === 'V3') {
-              const snmpV3SpecKeys = [
-                'engine_id',
-                'auth_protocol',
-                'privacy_protocol',
-                'snmp_v3_auth_username',
-                'snmp_v3_auth_password',
-                'snmp_v3_priv_password'
+                .get('rgw_frontend_port')
+                .setValue(response[0].spec?.rgw_frontend_port);
+              this.serviceForm.get('ssl').setValue(response[0].spec?.ssl);
+              if (response[0].spec?.ssl) {
+                this.serviceForm
+                  .get('ssl_cert')
+                  .setValue(response[0].spec?.rgw_frontend_ssl_certificate);
+              }
+              break;
+            case 'ingress':
+              const ingressSpecKeys = [
+                'backend_service',
+                'virtual_ip',
+                'frontend_port',
+                'monitor_port',
+                'virtual_interface_networks',
+                'ssl'
               ];
               ];
-              snmpV3SpecKeys.forEach((key) => {
-                if (key !== null) {
-                  if (
-                    key === 'snmp_v3_auth_username' ||
-                    key === 'snmp_v3_auth_password' ||
-                    key === 'snmp_v3_priv_password'
-                  ) {
-                    this.serviceForm.get(key).setValue(response[0].spec['credentials'][key]);
-                  } else {
-                    this.serviceForm.get(key).setValue(response[0].spec[key]);
-                  }
-                }
+              ingressSpecKeys.forEach((key) => {
+                this.serviceForm.get(key).setValue(response[0].spec[key]);
               });
               });
-            } else {
-              this.serviceForm
-                .get('snmp_community')
-                .setValue(response[0].spec['credentials']['snmp_community']);
-            }
-            break;
-        }
-      });
+              if (response[0].spec?.ssl) {
+                this.serviceForm.get('ssl_cert').setValue(response[0].spec?.ssl_cert);
+                this.serviceForm.get('ssl_key').setValue(response[0].spec?.ssl_key);
+              }
+              break;
+            case 'snmp-gateway':
+              const snmpCommonSpecKeys = ['snmp_version', 'snmp_destination'];
+              snmpCommonSpecKeys.forEach((key) => {
+                this.serviceForm.get(key).setValue(response[0].spec[key]);
+              });
+              if (this.serviceForm.getValue('snmp_version') === 'V3') {
+                const snmpV3SpecKeys = [
+                  'engine_id',
+                  'auth_protocol',
+                  'privacy_protocol',
+                  'snmp_v3_auth_username',
+                  'snmp_v3_auth_password',
+                  'snmp_v3_priv_password'
+                ];
+                snmpV3SpecKeys.forEach((key) => {
+                  if (key !== null) {
+                    if (
+                      key === 'snmp_v3_auth_username' ||
+                      key === 'snmp_v3_auth_password' ||
+                      key === 'snmp_v3_priv_password'
+                    ) {
+                      this.serviceForm.get(key).setValue(response[0].spec['credentials'][key]);
+                    } else {
+                      this.serviceForm.get(key).setValue(response[0].spec[key]);
+                    }
+                  }
+                });
+              } else {
+                this.serviceForm
+                  .get('snmp_community')
+                  .setValue(response[0].spec['credentials']['snmp_community']);
+              }
+              break;
+          }
+        });
     }
   }
 
   getServiceIds(selectedServiceType: string) {
     this.serviceIds = this.serviceList
     }
   }
 
   getServiceIds(selectedServiceType: string) {
     this.serviceIds = this.serviceList
-      .filter((service) => service['service_type'] === selectedServiceType)
+      ?.filter((service) => service['service_type'] === selectedServiceType)
       .map((service) => service['service_id']);
   }
 
       .map((service) => service['service_id']);
   }
 
index 36ab431fc96b32b73b5bbfb0688a3781a9096e14..fbcc8583cf1d258b41120a74f025a3ac1f7a048c 100644 (file)
@@ -9,6 +9,8 @@
             [autoReload]="5000"
             (fetchData)="getServices($event)"
             [hasDetails]="hasDetails"
             [autoReload]="5000"
             (fetchData)="getServices($event)"
             [hasDetails]="hasDetails"
+            [serverSide]="true"
+            [count]="count"
             (setExpandedRow)="setExpandedRow($event)"
             (updateSelection)="updateSelection($event)">
     <cd-table-actions class="table-actions"
             (setExpandedRow)="setExpandedRow($event)"
             (updateSelection)="updateSelection($event)">
     <cd-table-actions class="table-actions"
index 69d28e7051401091d51cff5109cb3f32f796668a..094a3cef13850e0e35e7fff918804c14883772d5 100644 (file)
@@ -1,3 +1,4 @@
+import { HttpHeaders } from '@angular/common/http';
 import { HttpClientTestingModule } from '@angular/common/http/testing';
 import { ComponentFixture, TestBed } from '@angular/core/testing';
 import { BrowserAnimationsModule } from '@angular/platform-browser/animations';
 import { HttpClientTestingModule } from '@angular/common/http/testing';
 import { ComponentFixture, TestBed } from '@angular/core/testing';
 import { BrowserAnimationsModule } from '@angular/platform-browser/animations';
@@ -10,6 +11,7 @@ import { CephModule } from '~/app/ceph/ceph.module';
 import { CoreModule } from '~/app/core/core.module';
 import { CephServiceService } from '~/app/shared/api/ceph-service.service';
 import { OrchestratorService } from '~/app/shared/api/orchestrator.service';
 import { CoreModule } from '~/app/core/core.module';
 import { CephServiceService } from '~/app/shared/api/ceph-service.service';
 import { OrchestratorService } from '~/app/shared/api/orchestrator.service';
+import { PaginateObservable } from '~/app/shared/api/paginate.model';
 import { CdTableFetchDataContext } from '~/app/shared/models/cd-table-fetch-data-context';
 import { Permissions } from '~/app/shared/models/permissions';
 import { AuthStorageService } from '~/app/shared/services/auth-storage.service';
 import { CdTableFetchDataContext } from '~/app/shared/models/cd-table-fetch-data-context';
 import { Permissions } from '~/app/shared/models/permissions';
 import { AuthStorageService } from '~/app/shared/services/auth-storage.service';
@@ -20,6 +22,7 @@ import { ServicesComponent } from './services.component';
 describe('ServicesComponent', () => {
   let component: ServicesComponent;
   let fixture: ComponentFixture<ServicesComponent>;
 describe('ServicesComponent', () => {
   let component: ServicesComponent;
   let fixture: ComponentFixture<ServicesComponent>;
+  let headers: HttpHeaders;
 
   const fakeAuthStorageService = {
     getPermissions: () => {
 
   const fakeAuthStorageService = {
     getPermissions: () => {
@@ -67,8 +70,10 @@ describe('ServicesComponent', () => {
     const orchService = TestBed.inject(OrchestratorService);
     const cephServiceService = TestBed.inject(CephServiceService);
     spyOn(orchService, 'status').and.returnValue(of({ available: true }));
     const orchService = TestBed.inject(OrchestratorService);
     const cephServiceService = TestBed.inject(CephServiceService);
     spyOn(orchService, 'status').and.returnValue(of({ available: true }));
-    spyOn(cephServiceService, 'list').and.returnValue(of(services));
-    fixture.detectChanges();
+    headers = new HttpHeaders().set('X-Total-Count', '2');
+    const paginate_obs = new PaginateObservable<any>(of({ body: services, headers: headers }));
+
+    spyOn(cephServiceService, 'list').and.returnValue(paginate_obs);
   });
 
   it('should create', () => {
   });
 
   it('should create', () => {
@@ -87,7 +92,10 @@ describe('ServicesComponent', () => {
   });
 
   it('should return all services', () => {
   });
 
   it('should return all services', () => {
-    component.getServices(new CdTableFetchDataContext(() => undefined));
+    const context = new CdTableFetchDataContext(() => undefined);
+    context.pageInfo.offset = 0;
+    context.pageInfo.limit = -1;
+    component.getServices(context);
     expect(component.services.length).toBe(2);
   });
 
     expect(component.services.length).toBe(2);
   });
 
index 318a54a6ee4589f892f65c327617a4b1e6f897cd..55638de24de81fa258fb62e1133f91b960383800 100644 (file)
@@ -54,6 +54,7 @@ export class ServicesComponent extends ListWithDetails implements OnChanges, OnI
   permissions: Permissions;
   tableActions: CdTableAction[];
   showDocPanel = false;
   permissions: Permissions;
   tableActions: CdTableAction[];
   showDocPanel = false;
+  count = 0;
   bsModalRef: NgbModalRef;
 
   orchStatus: OrchestratorStatus;
   bsModalRef: NgbModalRef;
 
   orchStatus: OrchestratorStatus;
@@ -213,9 +214,11 @@ export class ServicesComponent extends ListWithDetails implements OnChanges, OnI
       return;
     }
     this.isLoadingServices = true;
       return;
     }
     this.isLoadingServices = true;
-    this.cephServiceService.list().subscribe(
+    const pagination_obs = this.cephServiceService.list(context.toParams());
+    pagination_obs.observable.subscribe(
       (services: CephServiceSpec[]) => {
         this.services = services;
       (services: CephServiceSpec[]) => {
         this.services = services;
+        this.count = pagination_obs.count;
         this.services = this.services.filter((col: any) => {
           return !this.hiddenServices.includes(col.service_name);
         });
         this.services = this.services.filter((col: any) => {
           return !this.hiddenServices.includes(col.service_name);
         });
index 2d03ea3e6e9bd79c36bcee0ddf87fb4d33ae330d..feea20883efeb6c6bff69152511170ead290fa3a 100644 (file)
@@ -1,28 +1,32 @@
-<div>
+<main aria-label="Dashboard" >
+  <a href="#main"
+     class="sr-only">skip to content</a>
+
   <cd-refresh-selector></cd-refresh-selector>
 
   <ng-container *ngIf="hasGrafana">
   <cd-refresh-selector></cd-refresh-selector>
 
   <ng-container *ngIf="hasGrafana">
-    <ul ngbNav
-        #nav="ngbNav"
-        class="nav-tabs">
-      <li ngbNavItem>
+    <nav ngbNav
+         #nav="ngbNav"
+         class="nav-tabs">
+      <ng-container ngbNavItem>
         <a ngbNavLink
            i18n>Health</a>
         <ng-template ngbNavContent>
           <cd-health></cd-health>
         </ng-template>
         <a ngbNavLink
            i18n>Health</a>
         <ng-template ngbNavContent>
           <cd-health></cd-health>
         </ng-template>
-      </li>
-      <li ngbNavItem>
+      </ng-container>
+      <ng-container ngbNavItem>
         <a ngbNavLink
            i18n>Statistics</a>
         <ng-template ngbNavContent>
         </ng-template>
         <a ngbNavLink
            i18n>Statistics</a>
         <ng-template ngbNavContent>
         </ng-template>
-      </li>
+      </ng-container>
 
 
-    </ul>
+    </nav>
 
     <div [ngbNavOutlet]="nav"></div>
   </ng-container>
 
 
     <div [ngbNavOutlet]="nav"></div>
   </ng-container>
 
-  <cd-health *ngIf="!hasGrafana"></cd-health>
-</div>
+  <cd-health id="main"
+             *ngIf="!hasGrafana"></cd-health>
+</main>
index ba8176beab3b505aa95e9916011fceb0a22666cc..0a2535fc9142a70509e1a7b9cb7a3b0c090c29c1 100644 (file)
@@ -11,6 +11,5 @@
   </canvas>
   <div class="chartjs-tooltip"
        #chartTooltip>
   </canvas>
   <div class="chartjs-tooltip"
        #chartTooltip>
-    <table></table>
   </div>
 </div>
   </div>
 </div>
index 71aac66d9d2fb800612aa847eb4e675949f44096..c440a5f2df0de416a834d0471e78e9f733f84361 100644 (file)
@@ -21,7 +21,9 @@
           <ng-container *ngTemplateOutlet="logsLink"></ng-container>
           <ul>
             <li *ngFor="let check of healthData.health.checks">
           <ng-container *ngTemplateOutlet="logsLink"></ng-container>
           <ul>
             <li *ngFor="let check of healthData.health.checks">
-              <span [ngStyle]="check.severity | healthColor">{{ check.type }}</span>: {{ check.summary.message }}
+              <span [ngStyle]="check.severity | healthColor"
+                    [class.health-warn-description]="check.severity === 'HEALTH_WARN'">
+              {{ check.type }}</span>: {{ check.summary.message }}
             </li>
           </ul>
         </ng-template>
             </li>
           </ul>
         </ng-template>
              [ngStyle]="healthData.health.status | healthColor"
              [ngbPopover]="healthChecks"
              popoverClass="info-card-popover-cluster-status">
              [ngStyle]="healthData.health.status | healthColor"
              [ngbPopover]="healthChecks"
              popoverClass="info-card-popover-cluster-status">
-          {{ healthData.health.status }} <i *ngIf="healthData.health?.status != 'HEALTH_OK'"
-                                            class="fa fa-exclamation-triangle"></i>
+          {{ healthData.health.status | healthLabel | uppercase }}
+          <i *ngIf="healthData.health?.status !== 'HEALTH_OK'"
+             class="fa fa-exclamation-triangle"></i>
         </div>
       </ng-container>
       <ng-container *ngIf="!healthData.health?.checks?.length">
         <div [ngStyle]="healthData.health.status | healthColor">
         </div>
       </ng-container>
       <ng-container *ngIf="!healthData.health?.checks?.length">
         <div [ngStyle]="healthData.health.status | healthColor">
-          {{ healthData.health.status }}
+          {{ healthData.health.status | healthLabel | uppercase }}
         </div>
       </ng-container>
     </cd-info-card>
         </div>
       </ng-container>
     </cd-info-card>
@@ -87,7 +90,7 @@
                   link="/rgw/daemon"
                   class="cd-status-card"
                   contentClass="content-highlight"
                   link="/rgw/daemon"
                   class="cd-status-card"
                   contentClass="content-highlight"
-                  *ngIf="enabledFeature.rgw && healthData.rgw != null">
+                  *ngIf="enabledFeature.rgw && healthData?.rgw != null">
       {{ healthData.rgw }} total
     </cd-info-card>
 
       {{ healthData.rgw }} total
     </cd-info-card>
 
       <!-- TODO: check text-area-size-2 -->
       <span *ngFor="let result of transformedResult"
             [ngClass]="result.class"
       <!-- TODO: check text-area-size-2 -->
       <span *ngFor="let result of transformedResult"
             [ngClass]="result.class"
-            [title]="result.titleText != null ? result.titleText : ''">
+            [title]="result.titleText !== null ? result.titleText : ''">
         {{ result.content }}
       </span>
     </cd-info-card>
         {{ result.content }}
       </span>
     </cd-info-card>
                   link="/block/iscsi"
                   class="cd-status-card"
                   contentClass="content-highlight"
                   link="/block/iscsi"
                   class="cd-status-card"
                   contentClass="content-highlight"
-                  *ngIf="enabledFeature.iscsi && healthData.iscsi_daemons != null">
+                  *ngIf="enabledFeature.iscsi && healthData?.iscsi_daemons != null">
       {{ healthData.iscsi_daemons.up + healthData.iscsi_daemons.down }} total
       <span class="card-text-line-break"></span>
       {{ healthData.iscsi_daemons.up }} up,
       {{ healthData.iscsi_daemons.up + healthData.iscsi_daemons.down }} total
       <span class="card-text-line-break"></span>
       {{ healthData.iscsi_daemons.up }} up,
index 1294f5922db523756d6137ff25f73e4dfade659f..def7aab11a6ea8cc632e6391213123b3e5d79497 100644 (file)
@@ -24,6 +24,10 @@ cd-info-card {
 
 .logs-link {
   text-align: center;
 
 .logs-link {
   text-align: center;
+
+  a {
+    color: vv.$primary;
+  }
 }
 
 .card-text-error {
 }
 
 .card-text-error {
index cedcd06b6975ce07862bc040a47e8fb45156a357..3e25e922878379952d7a20473ebcc379ba7debe9 100644 (file)
@@ -197,7 +197,7 @@ describe('HealthComponent', () => {
     );
     const clickableContent = clusterStatusCard.query(By.css('.info-card-content-clickable'));
     expect(clickableContent).toBeNull();
     );
     const clickableContent = clusterStatusCard.query(By.css('.info-card-content-clickable'));
     expect(clickableContent).toBeNull();
-    expect(clusterStatusCard.nativeElement.textContent).toEqual(` ${healthPayload.health.status} `);
+    expect(clusterStatusCard.nativeElement.textContent).toEqual(' OK ');
   });
 
   it('should render "Cluster Status" card text that is clickable (popover)', () => {
   });
 
   it('should render "Cluster Status" card text that is clickable (popover)', () => {
@@ -216,7 +216,7 @@ describe('HealthComponent', () => {
       By.css('cd-info-card[cardTitle="Cluster Status"]')
     );
     const clickableContent = clusterStatusCard.query(By.css('.info-card-content-clickable'));
       By.css('cd-info-card[cardTitle="Cluster Status"]')
     );
     const clickableContent = clusterStatusCard.query(By.css('.info-card-content-clickable'));
-    expect(clickableContent.nativeElement.textContent).toEqual(` ${payload.health.status} `);
+    expect(clickableContent.nativeElement.textContent).toEqual(' WARNING ');
   });
 
   it('event binding "prepareReadWriteRatio" is called', () => {
   });
 
   it('event binding "prepareReadWriteRatio" is called', () => {
index 43cbe18ffcf09bfa20cebec2d4904a5ffd2eec24..d4828b3e0340e9f9ecce0ecfb1e03c5bea26bd86 100644 (file)
@@ -9,6 +9,17 @@
     max-height: 19vh;
     max-width: 100%;
     overflow: auto;
     max-height: 19vh;
     max-width: 100%;
     overflow: auto;
+
+    li {
+      span {
+        font-size: 1.1em;
+        font-weight: bold;
+      }
+
+      span.health-warn-description {
+        color: vv.$health-color-warning-800 !important;
+      }
+    }
   }
 }
 
   }
 }
 
@@ -33,6 +44,7 @@
   border: 1px solid vv.$gray-200;
   border-radius: 3px;
   cursor: pointer;
   border: 1px solid vv.$gray-200;
   border-radius: 3px;
   cursor: pointer;
+  font-size: 1.25em;
   padding: 7px;
 }
 
   padding: 7px;
 }
 
index 897d09a9a4b937d20dee95636059c29eda0883b9..46764975ce33183d4133f1eb637cfc3009b627bf 100644 (file)
@@ -25,6 +25,10 @@ $card-font-max-size: 21px;
       position: absolute;
       top: -0.3rem;
     }
       position: absolute;
       top: -0.3rem;
     }
+
+    .card-title > a {
+      color: vv.$primary;
+    }
   }
 }
 
   }
 }
 
index 722824a8fe8cbbb5088bf6846c54ca50b4c18a8e..cce38626539ef853d9cf163bd77a8347e77a94b6 100644 (file)
@@ -1,26 +1,17 @@
 <div class="row">
 <div class="row">
-  <div class="info-group-title"
-       [ngbPopover]="popInfoTemplate"
-       #popInfo="ngbPopover"
-       triggers="">
+  <div class="info-group-title">
     <span>{{ groupTitle }}</span>
     <span>{{ groupTitle }}</span>
-    <button type="button"
-            class="popover-icon btn btn-link p-0"
-            (click)="popInfo.toggle()">
-      <i [ngClass]="[icons.infoCircle, icons.large]"></i>
-    </button>
+    <cd-helper iconClass="fa fa-info-circle fa-2xs">
+      <div class="text-center"
+           i18n>For an overview of {{ groupTitle|lowercase }} widgets click
+        <cd-doc section="dashboard-landing-page-{{ groupTitle|lowercase }}"
+                docText="here"
+                i18n-docText></cd-doc>
+      </div>
+    </cd-helper>
   </div>
 </div>
 
 <div class="row">
   <ng-content></ng-content>
 </div>
   </div>
 </div>
 
 <div class="row">
   <ng-content></ng-content>
 </div>
-
-<ng-template #popInfoTemplate>
-  <div class="text-center"
-       i18n>For an overview of {{ groupTitle|lowercase }} widgets click
-    <cd-doc section="dashboard-landing-page-{{ groupTitle|lowercase }}"
-            docText="here"
-            i18n-docText></cd-doc>
-  </div>
-</ng-template>
index 52bcddb96a1b71168f1e4a2df43b71229d1bf61b..ce2057e6a36c12064aadc4d7bcb1b71bc16c90c2 100644 (file)
@@ -1,6 +1,12 @@
+@use './src/styles/vendor/variables' as vv;
+
 .info-group-title {
   font-size: 1.75rem;
 .info-group-title {
   font-size: 1.75rem;
-  margin: 0 0 0.5vw 0.5vw;
+  margin: 0 0 0.5vw;
+}
+
+.popover-icon {
+  color: vv.$primary;
 }
 
 .popover-icon:focus {
 }
 
 .popover-icon:focus {
index 73ed55a8fcf5474d14471182bef9c4e014192ad2..1ac1cb60b3c23138be5b364aa4fdc35483cc77a9 100644 (file)
@@ -1,3 +1,4 @@
+import { HttpClientTestingModule } from '@angular/common/http/testing';
 import { ComponentFixture, TestBed } from '@angular/core/testing';
 
 import { NgbPopoverModule } from '@ng-bootstrap/ng-bootstrap';
 import { ComponentFixture, TestBed } from '@angular/core/testing';
 
 import { NgbPopoverModule } from '@ng-bootstrap/ng-bootstrap';
@@ -11,7 +12,7 @@ describe('InfoGroupComponent', () => {
   let fixture: ComponentFixture<InfoGroupComponent>;
 
   configureTestBed({
   let fixture: ComponentFixture<InfoGroupComponent>;
 
   configureTestBed({
-    imports: [NgbPopoverModule, SharedModule],
+    imports: [NgbPopoverModule, SharedModule, HttpClientTestingModule],
     declarations: [InfoGroupComponent]
   });
 
     declarations: [InfoGroupComponent]
   });
 
index 2a8b9453f3fa13e2ebfc5a1e3d309e7321479cfe..042c9f664580289483119159b82b8c1315e08ff5 100644 (file)
@@ -1,17 +1,17 @@
 <ng-container *ngIf="selection">
 <ng-container *ngIf="selection">
-  <ul ngbNav
-      #nav="ngbNav"
-      class="nav-tabs"
-      cdStatefulTab="nfs-details">
-    <li ngbNavItem="details">
+  <nav ngbNav
+       #nav="ngbNav"
+       class="nav-tabs"
+       cdStatefulTab="nfs-details">
+    <ng-container ngbNavItem="details">
       <a ngbNavLink
          i18n>Details</a>
       <ng-template ngbNavContent>
         <cd-table-key-value [data]="data">
         </cd-table-key-value>
       </ng-template>
       <a ngbNavLink
          i18n>Details</a>
       <ng-template ngbNavContent>
         <cd-table-key-value [data]="data">
         </cd-table-key-value>
       </ng-template>
-    </li>
-    <li ngbNavItem="clients">
+    </ng-container>
+    <ng-container ngbNavItem="clients">
       <a ngbNavLink
          i18n>Clients ({{ clients.length }})</a>
       <ng-template ngbNavContent>
       <a ngbNavLink
          i18n>Clients ({{ clients.length }})</a>
       <ng-template ngbNavContent>
@@ -25,8 +25,8 @@
                   selectionType="">
         </cd-table>
       </ng-template>
                   selectionType="">
         </cd-table>
       </ng-template>
-    </li>
-  </ul>
+    </ng-container>
+  </nav>
 
   <div [ngbNavOutlet]="nav"></div>
 </ng-container>
 
   <div [ngbNavOutlet]="nav"></div>
 </ng-container>
index fcf5305393cba5a345a07bab57369e11bafb3d48..8e78c589a2c297f4cff37b847d9b5f21ba5f9a4b 100644 (file)
@@ -90,7 +90,7 @@ describe('NfsDetailsComponent', () => {
   });
 
   it('should have 1 client', () => {
   });
 
   it('should have 1 client', () => {
-    expect(elem('ul.nav-tabs li:nth-of-type(2) a').nativeElement.textContent).toBe('Clients (1)');
+    expect(elem('nav.nav-tabs a:nth-of-type(2)').nativeElement.textContent).toBe('Clients (1)');
     expect(component.clients).toEqual([
       {
         access_type: 'RW',
     expect(component.clients).toEqual([
       {
         access_type: 'RW',
index 117ad371d4eedb3cf9875515ce654140804e0e5a..b10244b430d4b82e4ce86824d075dfebc2e578d8 100644 (file)
@@ -17,7 +17,7 @@
              [formGroup]="item">
           <div class="card-header">
             {{ (index + 1) | ordinal }}
              [formGroup]="item">
           <div class="card-header">
             {{ (index + 1) | ordinal }}
-            <span class="float-right clickable"
+            <span class="float-end clickable"
                   name="remove_client"
                   (click)="removeClient(index)"
                   ngbTooltip="Remove">&times;</span>
                   name="remove_client"
                   (click)="removeClient(index)"
                   ngbTooltip="Remove">&times;</span>
@@ -55,7 +55,7 @@
                      class="cd-col-form-label"
                      for="access_type">Access Type</label>
               <div class="cd-col-form-input">
                      class="cd-col-form-label"
                      for="access_type">Access Type</label>
               <div class="cd-col-form-input">
-                <select class="form-control"
+                <select class="form-select"
                         name="access_type"
                         id="access_type"
                         formControlName="access_type">
                         name="access_type"
                         id="access_type"
                         formControlName="access_type">
@@ -78,7 +78,7 @@
                 <ng-container *ngTemplateOutlet="squashHelperTpl"></ng-container>
               </label>
               <div class="cd-col-form-input">
                 <ng-container *ngTemplateOutlet="squashHelperTpl"></ng-container>
               </label>
               <div class="cd-col-form-input">
-                <select class="form-control"
+                <select class="form-select"
                         name="squash"
                         id="squash"
                         formControlName="squash">
                         name="squash"
                         id="squash"
                         formControlName="squash">
@@ -93,9 +93,9 @@
       </div>
     </ng-container>
 
       </div>
     </ng-container>
 
-    <div class="row">
+    <div class="row my-2">
       <div class="col-12">
       <div class="col-12">
-        <div class="float-right">
+        <div class="float-end">
           <button class="btn btn-light "
                   (click)="addClient()"
                   name="add_client">
           <button class="btn btn-light "
                   (click)="addClient()"
                   name="add_client">
index 7313ea69b2ecd96d1e1d3adaca92ca6188176a78..82c97e3229584d873956cd711223e9d63d39c8c7 100644 (file)
@@ -20,7 +20,7 @@
             </cd-helper>
           </label>
           <div class="cd-col-form-input">
             </cd-helper>
           </label>
           <div class="cd-col-form-input">
-            <select class="form-control"
+            <select class="form-select"
                     formControlName="cluster_id"
                     name="cluster_id"
                     id="cluster_id">
                     formControlName="cluster_id"
                     name="cluster_id"
                     id="cluster_id">
@@ -52,7 +52,7 @@
                    for="name"
                    i18n>Storage Backend</label>
             <div class="cd-col-form-input">
                    for="name"
                    i18n>Storage Backend</label>
             <div class="cd-col-form-input">
-              <select class="form-control"
+              <select class="form-select"
                       formControlName="name"
                       name="name"
                       id="name"
                       formControlName="name"
                       name="name"
                       id="name"
@@ -86,7 +86,7 @@
                    for="fs_name"
                    i18n>Volume</label>
             <div class="cd-col-form-input">
                    for="fs_name"
                    i18n>Volume</label>
             <div class="cd-col-form-input">
-              <select class="form-control"
+              <select class="form-select"
                       formControlName="fs_name"
                       name="fs_name"
                       id="fs_name"
                       formControlName="fs_name"
                       name="fs_name"
                       id="fs_name"
                  for="access_type"
                  i18n>Access Type</label>
           <div class="cd-col-form-input">
                  for="access_type"
                  i18n>Access Type</label>
           <div class="cd-col-form-input">
-            <select class="form-control"
+            <select class="form-select"
                     formControlName="access_type"
                     name="access_type"
                     id="access_type"
                     formControlName="access_type"
                     name="access_type"
                     id="access_type"
             <ng-container *ngTemplateOutlet="squashHelper"></ng-container>
           </label>
           <div class="cd-col-form-input">
             <ng-container *ngTemplateOutlet="squashHelper"></ng-container>
           </label>
           <div class="cd-col-form-input">
-            <select class="form-control"
+            <select class="form-select"
                     name="squash"
                     formControlName="squash"
                     id="squash">
                     name="squash"
                     formControlName="squash"
                     id="squash">
index e5906dc4b3e04403b88b6e6ecc82e243b4582132..b3c0089834026c93068aaaf15933b8e9b1ffaeb2 100644 (file)
@@ -43,7 +43,7 @@
             <span class="required"></span>
           </label>
           <div class="cd-col-form-input">
             <span class="required"></span>
           </label>
           <div class="cd-col-form-input">
-            <select class="form-control"
+            <select class="form-select"
                     id="root"
                     name="root"
                     formControlName="root">
                     id="root"
                     name="root"
                     formControlName="root">
@@ -71,7 +71,7 @@
             <span class="required"></span>
           </label>
           <div class="cd-col-form-input">
             <span class="required"></span>
           </label>
           <div class="cd-col-form-input">
-            <select class="form-control"
+            <select class="form-select"
                     id="failure_domain"
                     name="failure_domain"
                     formControlName="failure_domain">
                     id="failure_domain"
                     name="failure_domain"
                     formControlName="failure_domain">
@@ -98,7 +98,7 @@
             </cd-helper>
           </label>
           <div class="cd-col-form-input">
             </cd-helper>
           </label>
           <div class="cd-col-form-input">
-            <select class="form-control"
+            <select class="form-select"
                     id="device_class"
                     name="device_class"
                     formControlName="device_class">
                     id="device_class"
                     name="device_class"
                     formControlName="device_class">
index b4b9cd1939099adbfe97fd12e83c28ce47790057..b186677c5c560f8a0f26147b7316f08c027a3af1 100644 (file)
@@ -40,7 +40,7 @@
             </cd-helper>
           </label>
           <div class="cd-col-form-input">
             </cd-helper>
           </label>
           <div class="cd-col-form-input">
-            <select class="form-control"
+            <select class="form-select"
                     id="plugin"
                     name="plugin"
                     formControlName="plugin">
                     id="plugin"
                     name="plugin"
                     formControlName="plugin">
                      class="form-control"
                      placeholder="Helper chunks..."
                      formControlName="d">
                      class="form-control"
                      placeholder="Helper chunks..."
                      formControlName="d">
-              <span class="input-group-append">
-                <button class="btn btn-light"
-                        id="d-calc-btn"
-                        ngbTooltip="Set d manually or use the plugin's default calculation that maximizes d."
-                        i18n-ngbTooltip
-                        type="button"
-                        (click)="toggleDCalc()">
-                  <i [ngClass]="dCalc ? icons.unlock : icons.lock"
-                     aria-hidden="true"></i>
-                </button>
-              </span>
+              <button class="btn btn-light"
+                      id="d-calc-btn"
+                      ngbTooltip="Set d manually or use the plugin's default calculation that maximizes d."
+                      i18n-ngbTooltip
+                      type="button"
+                      (click)="toggleDCalc()">
+                <i [ngClass]="dCalc ? icons.unlock : icons.lock"
+                   aria-hidden="true"></i>
+              </button>
             </div>
             <span class="form-text text-muted"
                   *ngIf="dCalc"
             </div>
             <span class="form-text text-muted"
                   *ngIf="dCalc"
             </cd-helper>
           </label>
           <div class="cd-col-form-input">
             </cd-helper>
           </label>
           <div class="cd-col-form-input">
-            <select class="form-control"
+            <select class="form-select"
                     id="crushFailureDomain"
                     name="crushFailureDomain"
                     formControlName="crushFailureDomain">
                     id="crushFailureDomain"
                     name="crushFailureDomain"
                     formControlName="crushFailureDomain">
             </cd-helper>
           </label>
           <div class="cd-col-form-input">
             </cd-helper>
           </label>
           <div class="cd-col-form-input">
-            <select class="form-control"
+            <select class="form-select"
                     id="crushLocality"
                     name="crushLocality"
                     formControlName="crushLocality">
                     id="crushLocality"
                     name="crushLocality"
                     formControlName="crushLocality">
             </cd-helper>
           </label>
           <div class="cd-col-form-input">
             </cd-helper>
           </label>
           <div class="cd-col-form-input">
-            <select class="form-control"
+            <select class="form-select"
                     id="scalar_mds"
                     name="scalar_mds"
                     formControlName="scalar_mds">
                     id="scalar_mds"
                     name="scalar_mds"
                     formControlName="scalar_mds">
             </cd-helper>
           </label>
           <div class="cd-col-form-input">
             </cd-helper>
           </label>
           <div class="cd-col-form-input">
-            <select class="form-control"
+            <select class="form-select"
                     id="technique"
                     name="technique"
                     formControlName="technique">
                     id="technique"
                     name="technique"
                     formControlName="technique">
             </cd-helper>
           </label>
           <div class="cd-col-form-input">
             </cd-helper>
           </label>
           <div class="cd-col-form-input">
-            <select class="form-control"
+            <select class="form-select"
                     id="crushRoot"
                     name="crushRoot"
                     formControlName="crushRoot">
                     id="crushRoot"
                     name="crushRoot"
                     formControlName="crushRoot">
             </cd-helper>
           </label>
           <div class="cd-col-form-input">
             </cd-helper>
           </label>
           <div class="cd-col-form-input">
-            <select class="form-control"
+            <select class="form-select"
                     id="crushDeviceClass"
                     name="crushDeviceClass"
                     formControlName="crushDeviceClass">
                     id="crushDeviceClass"
                     name="crushDeviceClass"
                     formControlName="crushDeviceClass">
index 40d71dd0e32182f39d87120bc02f45dcc0ed8d01..07823eedfffade17158a82c6759f08ecbee76cd6 100644 (file)
@@ -1,10 +1,10 @@
 <ng-container *ngIf="selection"
               cdTableDetail>
 <ng-container *ngIf="selection"
               cdTableDetail>
-  <ul ngbNav
-      #nav="ngbNav"
-      class="nav-tabs"
-      cdStatefulTab="pool-details">
-    <li ngbNavItem="details">
+  <nav ngbNav
+       #nav="ngbNav"
+       class="nav-tabs"
+       cdStatefulTab="pool-details">
+    <ng-container ngbNavItem="details">
       <a ngbNavLink
          i18n>Details</a>
       <ng-template ngbNavContent>
       <a ngbNavLink
          i18n>Details</a>
       <ng-template ngbNavContent>
                             [autoReload]="false">
         </cd-table-key-value>
       </ng-template>
                             [autoReload]="false">
         </cd-table-key-value>
       </ng-template>
-    </li>
-    <li ngbNavItem="performance-details"
-        *ngIf="permissions.grafana.read">
+    </ng-container>
+    <ng-container ngbNavItem="performance-details"
+                  *ngIf="permissions.grafana.read">
       <a ngbNavLink
          i18n>Performance Details</a>
       <ng-template ngbNavContent>
       <a ngbNavLink
          i18n>Performance Details</a>
       <ng-template ngbNavContent>
-        <cd-grafana grafanaPath="ceph-pool-detail?var-pool_name={{selection.pool_name}}"
+        <cd-grafana i18n-title
+                    title="Pool details"
+                    grafanaPath="ceph-pool-detail?var-pool_name={{selection.pool_name}}"
                     [type]="'metrics'"
                     uid="-xyV8KCiz"
                     grafanaStyle="three">
         </cd-grafana>
       </ng-template>
                     [type]="'metrics'"
                     uid="-xyV8KCiz"
                     grafanaStyle="three">
         </cd-grafana>
       </ng-template>
-    </li>
-    <li ngbNavItem="configuration"
-        *ngIf="selection.type === 'replicated'">
+    </ng-container>
+    <ng-container ngbNavItem="configuration"
+                  *ngIf="selection.type === 'replicated'">
       <a ngbNavLink
          i18n>Configuration</a>
       <ng-template ngbNavContent>
         <cd-rbd-configuration-table [data]="selectedPoolConfiguration"></cd-rbd-configuration-table>
       </ng-template>
       <a ngbNavLink
          i18n>Configuration</a>
       <ng-template ngbNavContent>
         <cd-rbd-configuration-table [data]="selectedPoolConfiguration"></cd-rbd-configuration-table>
       </ng-template>
-    </li>
-    <li ngbNavItem="cache-tiers-details"
-        *ngIf="selection['tiers']?.length > 0">
+    </ng-container>
+    <ng-container ngbNavItem="cache-tiers-details"
+                  *ngIf="selection['tiers']?.length > 0">
       <a ngbNavLink
          i18n>Cache Tiers Details</a>
       <ng-template ngbNavContent>
       <a ngbNavLink
          i18n>Cache Tiers Details</a>
       <ng-template ngbNavContent>
@@ -45,8 +47,8 @@
                   columnMode="flex">
         </cd-table>
       </ng-template>
                   columnMode="flex">
         </cd-table>
       </ng-template>
-    </li>
-  </ul>
+    </ng-container>
+  </nav>
 
   <div [ngbNavOutlet]="nav"></div>
 </ng-container>
 
   <div [ngbNavOutlet]="nav"></div>
 </ng-container>
index 2df480edab26af314ef8bdcf3f11204304ead428..b159f12530d04d28383d7fc82414c03ff0140aad 100644 (file)
@@ -45,7 +45,7 @@
                  for="poolType"
                  i18n>Pool type</label>
           <div class="cd-col-form-input">
                  for="poolType"
                  i18n>Pool type</label>
           <div class="cd-col-form-input">
-            <select class="form-control"
+            <select class="form-select"
                     id="poolType"
                     formControlName="poolType"
                     name="poolType">
                     id="poolType"
                     formControlName="poolType"
                     name="poolType">
@@ -69,7 +69,7 @@
                    class="cd-col-form-label"
                    for="pgAutoscaleMode">PG Autoscale</label>
             <div class="cd-col-form-input">
                    class="cd-col-form-label"
                    for="pgAutoscaleMode">PG Autoscale</label>
             <div class="cd-col-form-input">
-              <select class="form-control"
+              <select class="form-select"
                       id="pgAutoscaleMode"
                       name="pgAutoscaleMode"
                       formControlName="pgAutoscaleMode">
                       id="pgAutoscaleMode"
                       name="pgAutoscaleMode"
                       formControlName="pgAutoscaleMode">
                    class="cd-col-form-label"
                    for="erasureProfile">Erasure code profile</label>
             <div class="cd-col-form-input">
                    class="cd-col-form-label"
                    for="erasureProfile">Erasure code profile</label>
             <div class="cd-col-form-input">
-              <div class="input-group">
-                <select class="form-control"
+              <div class="input-group mb-1">
+                <select class="form-select"
                         id="erasureProfile"
                         name="erasureProfile"
                         formControlName="erasureProfile">
                         id="erasureProfile"
                         name="erasureProfile"
                         formControlName="erasureProfile">
                     {{ ecp.name }}
                   </option>
                 </select>
                     {{ ecp.name }}
                   </option>
                 </select>
-                <span class="input-group-append">
-                  <button class="btn btn-light"
-                          [ngClass]="{'active': data.erasureInfo}"
-                          id="ecp-info-button"
-                          type="button"
-                          (click)="data.erasureInfo = !data.erasureInfo">
-                    <i [ngClass]="[icons.questionCircle]"
-                       aria-hidden="true"></i>
-                  </button>
-                  <button class="btn btn-light"
-                          type="button"
-                          *ngIf="!editing"
-                          (click)="addErasureCodeProfile()">
-                    <i [ngClass]="[icons.add]"
-                       aria-hidden="true"></i>
-                  </button>
-                  <button class="btn btn-light"
-                          type="button"
-                          *ngIf="!editing"
-                          ngbTooltip="This profile can't be deleted as it is in use."
-                          i18n-ngbTooltip
-                          triggers="manual"
-                          #ecpDeletionBtn="ngbTooltip"
-                          (click)="deleteErasureCodeProfile()">
-                    <i [ngClass]="[icons.trash]"
-                       aria-hidden="true"></i>
-                  </button>
-                </span>
+                <button class="btn btn-light"
+                        [ngClass]="{'active': data.erasureInfo}"
+                        id="ecp-info-button"
+                        type="button"
+                        (click)="data.erasureInfo = !data.erasureInfo">
+                  <i [ngClass]="[icons.questionCircle]"
+                     aria-hidden="true"></i>
+                </button>
+                <button class="btn btn-light"
+                        type="button"
+                        *ngIf="!editing"
+                        (click)="addErasureCodeProfile()">
+                  <i [ngClass]="[icons.add]"
+                     aria-hidden="true"></i>
+                </button>
+                <button class="btn btn-light"
+                        type="button"
+                        *ngIf="!editing"
+                        ngbTooltip="This profile can't be deleted as it is in use."
+                        i18n-ngbTooltip
+                        triggers="manual"
+                        #ecpDeletionBtn="ngbTooltip"
+                        (click)="deleteErasureCodeProfile()">
+                  <i [ngClass]="[icons.trash]"
+                     aria-hidden="true"></i>
+                </button>
               </div>
               <span class="form-text text-muted"
                     id="ecp-info-block"
                     *ngIf="data.erasureInfo && form.getValue('erasureProfile')">
               </div>
               <span class="form-text text-muted"
                     id="ecp-info-block"
                     *ngIf="data.erasureInfo && form.getValue('erasureProfile')">
-                <ul ngbNav
-                    #ecpInfoTabs="ngbNav"
-                    class="nav-tabs">
-                  <li ngbNavItem="ecp-info">
+                <nav ngbNav
+                     #ecpInfoTabs="ngbNav"
+                     class="nav-tabs">
+                  <ng-container ngbNavItem="ecp-info">
                     <a ngbNavLink
                        i18n>Profile</a>
                     <ng-template ngbNavContent>
                     <a ngbNavLink
                        i18n>Profile</a>
                     <ng-template ngbNavContent>
                                           [autoReload]="false">
                       </cd-table-key-value>
                     </ng-template>
                                           [autoReload]="false">
                       </cd-table-key-value>
                     </ng-template>
-                  </li>
-                  <li ngbNavItem="used-by-pools">
+                  </ng-container>
+                  <ng-container ngbNavItem="used-by-pools">
                     <a ngbNavLink
                        i18n>Used by pools</a>
                     <ng-template ngbNavContent>
                     <a ngbNavLink
                        i18n>Used by pools</a>
                     <ng-template ngbNavContent>
                         </li>
                       </ul>
                     </ng-template>
                         </li>
                       </ul>
                     </ng-template>
-                  </li>
-                </ul>
+                  </ng-container>
+                </nav>
 
                 <div [ngbNavOutlet]="ecpInfoTabs"></div>
               </span>
 
                 <div [ngbNavOutlet]="ecpInfoTabs"></div>
               </span>
               </ng-template>
               <div *ngIf="current.rules.length > 0; else noRules">
                 <div class="input-group">
               </ng-template>
               <div *ngIf="current.rules.length > 0; else noRules">
                 <div class="input-group">
-                  <select class="form-control"
+                  <select class="form-select"
                           id="crushRule"
                           formControlName="crushRule"
                           name="crushSet">
                           id="crushRule"
                           formControlName="crushRule"
                           name="crushSet">
                       {{ rule.rule_name }}
                     </option>
                   </select>
                       {{ rule.rule_name }}
                     </option>
                   </select>
-                  <span class="input-group-append">
-                    <button class="btn btn-light"
-                            [ngClass]="{'active': data.crushInfo}"
-                            id="crush-info-button"
-                            type="button"
-                            ngbTooltip="Placement and
-                            replication strategies or distribution policies that allow to
-                            specify how CRUSH places data replicas."
-                            i18n-ngbTooltip
-                            (click)="data.crushInfo = !data.crushInfo">
-                      <i [ngClass]="[icons.questionCircle]"
-                         aria-hidden="true"></i>
-                    </button>
-                    <button class="btn btn-light"
-                            type="button"
-                            *ngIf="isReplicated && !editing"
-                            (click)="addCrushRule()">
-                      <i [ngClass]="[icons.add]"
-                         aria-hidden="true"></i>
-                    </button>
-                    <button class="btn btn-light"
-                            *ngIf="isReplicated && !editing"
-                            type="button"
-                            ngbTooltip="This rule can't be deleted as it is in use."
-                            i18n-ngbTooltip
-                            triggers="manual"
-                            #crushDeletionBtn="ngbTooltip"
-                            (click)="deleteCrushRule()">
-                      <i [ngClass]="[icons.trash]"
-                         aria-hidden="true"></i>
-                    </button>
-                  </span>
+                  <button class="btn btn-light"
+                          [ngClass]="{'active': data.crushInfo}"
+                          id="crush-info-button"
+                          type="button"
+                          ngbTooltip="Placement and
+                          replication strategies or distribution policies that allow to
+                          specify how CRUSH places data replicas."
+                          i18n-ngbTooltip
+                          (click)="data.crushInfo = !data.crushInfo">
+                    <i [ngClass]="[icons.questionCircle]"
+                       aria-hidden="true"></i>
+                  </button>
+                  <button class="btn btn-light"
+                          type="button"
+                          *ngIf="isReplicated && !editing"
+                          (click)="addCrushRule()">
+                    <i [ngClass]="[icons.add]"
+                       aria-hidden="true"></i>
+                  </button>
+                  <button class="btn btn-light"
+                          *ngIf="isReplicated && !editing"
+                          type="button"
+                          ngbTooltip="This rule can't be deleted as it is in use."
+                          i18n-ngbTooltip
+                          triggers="manual"
+                          #crushDeletionBtn="ngbTooltip"
+                          (click)="deleteCrushRule()">
+                    <i [ngClass]="[icons.trash]"
+                       aria-hidden="true"></i>
+                  </button>
                 </div>
 
                 <div class="form-text text-muted"
                      id="crush-info-block"
                      *ngIf="data.crushInfo && form.getValue('crushRule')">
                 </div>
 
                 <div class="form-text text-muted"
                      id="crush-info-block"
                      *ngIf="data.crushInfo && form.getValue('crushRule')">
-                  <ul ngbNav
-                      #crushInfoTabs="ngbNav"
-                      class="nav-tabs">
-                    <li ngbNavItem="crush-rule-info">
+                  <nav ngbNav
+                       #crushInfoTabs="ngbNav"
+                       class="nav-tabs">
+                    <ng-container ngbNavItem="crush-rule-info">
                       <a ngbNavLink
                          i18n>Crush rule</a>
                       <ng-template ngbNavContent>
                       <a ngbNavLink
                          i18n>Crush rule</a>
                       <ng-template ngbNavContent>
                                             [autoReload]="false">
                         </cd-table-key-value>
                       </ng-template>
                                             [autoReload]="false">
                         </cd-table-key-value>
                       </ng-template>
-                    </li>
-                    <li ngbNavItem="crush-rule-steps">
+                    </ng-container>
+                    <ng-container ngbNavItem="crush-rule-steps">
                       <a ngbNavLink
                          i18n>Crush steps</a>
                       <ng-template ngbNavContent>
                       <a ngbNavLink
                          i18n>Crush steps</a>
                       <ng-template ngbNavContent>
                           </li>
                         </ol>
                       </ng-template>
                           </li>
                         </ol>
                       </ng-template>
-                    </li>
-                    <li ngbNavItem="used-by-pools">
+                    </ng-container>
+                    <ng-container ngbNavItem="used-by-pools">
                       <a ngbNavLink
                          i18n>Used by pools</a>
                       <ng-template ngbNavContent>
                       <a ngbNavLink
                          i18n>Used by pools</a>
                       <ng-template ngbNavContent>
                           </li>
                         </ul>
                       </ng-template>
                           </li>
                         </ul>
                       </ng-template>
-                    </li>
-                  </ul>
+                    </ng-container>
+                  </nav>
 
                   <div [ngbNavOutlet]="crushInfoTabs"></div>
                 </div>
 
                   <div [ngbNavOutlet]="crushInfoTabs"></div>
                 </div>
                    class="cd-col-form-label"
                    for="mode">Mode</label>
             <div class="cd-col-form-input">
                    class="cd-col-form-label"
                    for="mode">Mode</label>
             <div class="cd-col-form-input">
-              <select class="form-control"
+              <select class="form-select"
                       id="mode"
                       name="mode"
                       formControlName="mode">
                       id="mode"
                       name="mode"
                       formControlName="mode">
                      class="cd-col-form-label"
                      for="algorithm">Algorithm</label>
               <div class="cd-col-form-input">
                      class="cd-col-form-label"
                      for="algorithm">Algorithm</label>
               <div class="cd-col-form-input">
-                <select class="form-control"
+                <select class="form-select"
                         id="algorithm"
                         name="algorithm"
                         formControlName="algorithm">
                         id="algorithm"
                         name="algorithm"
                         formControlName="algorithm">
index bd568a9107ea03d1a93453e4c51927305106bc59..cfbcdaaf184aaa5810a96dcf3f7ea228cc83a802 100644 (file)
@@ -1,7 +1,7 @@
-<ul ngbNav
-    #nav="ngbNav"
-    class="nav-tabs">
-  <li ngbNavItem>
+<nav ngbNav
+     #nav="ngbNav"
+     class="nav-tabs">
+  <ng-container ngbNavItem>
     <a ngbNavLink
        i18n>Pools List</a>
     <ng-template ngbNavContent>
     <a ngbNavLink
        i18n>Pools List</a>
     <ng-template ngbNavContent>
         </cd-pool-details>
       </cd-table>
     </ng-template>
         </cd-pool-details>
       </cd-table>
     </ng-template>
-  </li>
+  </ng-container>
 
 
-  <li ngbNavItem
-      *cdScope="'grafana'">
+  <ng-container ngbNavItem
+                *cdScope="'grafana'">
     <a ngbNavLink
        i18n>Overall Performance</a>
     <ng-template ngbNavContent>
     <a ngbNavLink
        i18n>Overall Performance</a>
     <ng-template ngbNavContent>
-      <cd-grafana [grafanaPath]="'ceph-pools-overview?'"
+      <cd-grafana i18n-title
+                  title="Ceph pools overview"
+                  [grafanaPath]="'ceph-pools-overview?'"
                   [type]="'metrics'"
                   uid="z99hzWtmk"
                   grafanaStyle="two">
       </cd-grafana>
     </ng-template>
                   [type]="'metrics'"
                   uid="z99hzWtmk"
                   grafanaStyle="two">
       </cd-grafana>
     </ng-template>
-  </li>
-</ul>
+  </ng-container>
+</nav>
 
 <div [ngbNavOutlet]="nav"></div>
 
 
 <div [ngbNavOutlet]="nav"></div>
 
@@ -53,6 +55,7 @@
   <cd-usage-bar *ngIf="row.stats?.avail_raw?.latest"
                 [total]="row.stats.bytes_used.latest + row.stats.avail_raw.latest"
                 [used]="row.stats.bytes_used.latest"
   <cd-usage-bar *ngIf="row.stats?.avail_raw?.latest"
                 [total]="row.stats.bytes_used.latest + row.stats.avail_raw.latest"
                 [used]="row.stats.bytes_used.latest"
+                [title]="row.pool_name"
                 decimals="2">
   </cd-usage-bar>
 </ng-template>
                 decimals="2">
   </cd-usage-bar>
 </ng-template>
diff --git a/ceph/src/pybind/mgr/dashboard/frontend/src/app/ceph/rgw/models/rgw-bucket-encryption.ts b/ceph/src/pybind/mgr/dashboard/frontend/src/app/ceph/rgw/models/rgw-bucket-encryption.ts
new file mode 100644 (file)
index 0000000..e4f81f6
--- /dev/null
@@ -0,0 +1,7 @@
+export class RgwBucketEncryptionModel {
+  kmsProviders = ['vault'];
+  authMethods = ['token', 'agent'];
+  secretEngines = ['kv', 'transit'];
+  sse_s3 = 'AES256';
+  sse_kms = 'aws:kms';
+}
index bf4bdcb08d959227b05ed522272980bfc1942d1c..15b33e141229d47c0bc1d7587498420712704adc 100644 (file)
             class="bold">Versioning</td>
         <td>{{ selection.versioning }}</td>
       </tr>
             class="bold">Versioning</td>
         <td>{{ selection.versioning }}</td>
       </tr>
+      <tr>
+        <td i18n
+            class="bold">Encryption</td>
+        <td>{{ selection.encryption }}</td>
+      </tr>
       <tr>
         <td i18n
             class="bold">MFA Delete</td>
       <tr>
         <td i18n
             class="bold">MFA Delete</td>
index bad80a7f358874f69357e14812bb03b29c78bd85..ad1534025c2b59a90f5bba8e9e5e65d03a1bd4ec 100644 (file)
@@ -76,7 +76,7 @@
           <div class="cd-col-form-input">
             <select id="owner"
                     name="owner"
           <div class="cd-col-form-input">
             <select id="owner"
                     name="owner"
-                    class="form-control"
+                    class="form-select"
                     formControlName="owner"
                     [autofocus]="editing">
               <option i18n
                     formControlName="owner"
                     [autofocus]="editing">
               <option i18n
               <select id="placement-target"
                       name="placement-target"
                       formControlName="placement-target"
               <select id="placement-target"
                       name="placement-target"
                       formControlName="placement-target"
-                      class="form-control">
+                      class="form-select">
                 <option i18n
                         *ngIf="placementTargets === null"
                         [ngValue]="null">Loading...</option>
                 <option i18n
                         *ngIf="placementTargets === null"
                         [ngValue]="null">Loading...</option>
                    for="lock_mode"
                    i18n>Mode</label>
             <div class="cd-col-form-input">
                    for="lock_mode"
                    i18n>Mode</label>
             <div class="cd-col-form-input">
-              <select class="form-control"
+              <select class="form-select"
                       formControlName="lock_mode"
                       name="lock_mode"
                       id="lock_mode">
                       formControlName="lock_mode"
                       name="lock_mode"
                       id="lock_mode">
           </div>
         </fieldset>
 
           </div>
         </fieldset>
 
+        <fieldset>
+          <legend class="cd-header"
+                  i18n>Security</legend>
+          <div class="form-group row">
+            <div class="cd-col-form-offset">
+              <div class="custom-control custom-checkbox">
+                <input class="form-check-input"
+                       id="encryption_enabled"
+                       name="encryption_enabled"
+                       formControlName="encryption_enabled"
+                       type="checkbox"
+                       [attr.disabled]="!kmsVaultConfig && !s3VaultConfig ? true : null">
+                <label class="form-check-label"
+                       for="encryption_enabled"
+                       i18n>Encryption</label>
+                <cd-helper>
+                  <span i18n>Enables encryption for the objects in the bucket.
+                     To enable encryption on a bucket you need to set the configuration values for SSE-S3 or SSE-KMS.
+                     To set the configuration values <a href="#/rgw/bucket/create"
+                                                        (click)="openConfigModal()">Click here</a></span>
+                </cd-helper>
+              </div>
+            </div>
+          </div>
+
+          <div *ngIf="bucketForm.getValue('encryption_enabled')">
+            <div class="form-group row">
+              <div class="cd-col-form-offset">
+                <div class="custom-control custom-radio custom-control-inline ps-5">
+                  <input class="form-check-input"
+                         formControlName="encryption_type"
+                         id="sse_S3_enabled"
+                         type="radio"
+                         name="encryption_type"
+                         value="AES256"
+                         [attr.disabled]="!s3VaultConfig ? true : null">
+                  <label class="form-control-label"
+                         for="sse_S3_enabled"
+                         i18n>SSE-S3 Encryption</label>
+                </div>
+              </div>
+            </div>
+
+            <div class="form-group row">
+              <div class="cd-col-form-offset">
+                <div class="custom-control custom-radio custom-control-inline ps-5">
+                  <input class="form-check-input"
+                         formControlName="encryption_type"
+                         id="kms_enabled"
+                         name="encryption_type"
+                         value="aws:kms"
+                         [attr.disabled]="!kmsVaultConfig ? true : null"
+                         type="radio">
+                  <label class="form-control-label"
+                         for="kms_enabled"
+                         i18n>Connect to an external key management service</label>
+                </div>
+              </div>
+            </div>
+
+            <div *ngIf="bucketForm.getValue('encryption_type') === 'aws:kms'">
+              <div class="form-group row">
+                <label class="cd-col-form-label required"
+                       for="kms_provider"
+                       i18n>KMS Provider</label>
+                <div class="cd-col-form-input">
+                  <select id="kms_provider"
+                          name="kms_provider"
+                          class="form-select"
+                          formControlName="kms_provider"
+                          [autofocus]="editing">
+                    <option i18n
+                            *ngIf="kmsProviders !== null"
+                            [ngValue]="null">-- Select a provider --</option>
+                    <option *ngFor="let provider of kmsProviders"
+                            [value]="provider">{{ provider }}</option>
+                  </select>
+                  <span class="invalid-feedback"
+                        *ngIf="bucketForm.showError('kms_provider', frm, 'required')"
+                        i18n>This field is required.</span>
+                </div>
+              </div>
+            </div>
+
+            <div *ngIf="bucketForm.getValue('encryption_type') === 'aws:kms'">
+              <div class="form-group row">
+                <label class="cd-col-form-label required"
+                       for="keyId"
+                       i18n>Key Id
+                </label>
+                <div class="cd-col-form-input">
+                  <input id="keyId"
+                         name="keyId"
+                         class="form-control"
+                         type="text"
+                         formControlName="keyId">
+                  <span class="invalid-feedback"
+                        *ngIf="bucketForm.showError('keyId', frm, 'required')"
+                        i18n>This field is required.</span>
+                </div>
+              </div>
+            </div>
+          </div>
+        </fieldset>
+
       </div>
       <div class="card-footer">
         <cd-form-button-panel (submitActionEvent)="submit()"
       </div>
       <div class="card-footer">
         <cd-form-button-panel (submitActionEvent)="submit()"
index 1d5aede396eae52b8fd6ec2d22738b670550ccea..91449c7d3d8880b75f2ecdb43b02517f2a810906 100644 (file)
@@ -1,5 +1,5 @@
-import { Component, OnInit } from '@angular/core';
-import { Validators } from '@angular/forms';
+import { AfterViewChecked, ChangeDetectorRef, Component, OnInit } from '@angular/core';
+import { AbstractControl, Validators } from '@angular/forms';
 import { ActivatedRoute, Router } from '@angular/router';
 
 import _ from 'lodash';
 import { ActivatedRoute, Router } from '@angular/router';
 
 import _ from 'lodash';
@@ -15,19 +15,24 @@ import { CdForm } from '~/app/shared/forms/cd-form';
 import { CdFormBuilder } from '~/app/shared/forms/cd-form-builder';
 import { CdFormGroup } from '~/app/shared/forms/cd-form-group';
 import { CdValidators } from '~/app/shared/forms/cd-validators';
 import { CdFormBuilder } from '~/app/shared/forms/cd-form-builder';
 import { CdFormGroup } from '~/app/shared/forms/cd-form-group';
 import { CdValidators } from '~/app/shared/forms/cd-validators';
+import { ModalService } from '~/app/shared/services/modal.service';
 import { NotificationService } from '~/app/shared/services/notification.service';
 import { NotificationService } from '~/app/shared/services/notification.service';
+import { RgwBucketEncryptionModel } from '../models/rgw-bucket-encryption';
 import { RgwBucketMfaDelete } from '../models/rgw-bucket-mfa-delete';
 import { RgwBucketVersioning } from '../models/rgw-bucket-versioning';
 import { RgwBucketMfaDelete } from '../models/rgw-bucket-mfa-delete';
 import { RgwBucketVersioning } from '../models/rgw-bucket-versioning';
+import { RgwConfigModalComponent } from '../rgw-config-modal/rgw-config-modal.component';
 
 @Component({
   selector: 'cd-rgw-bucket-form',
   templateUrl: './rgw-bucket-form.component.html',
 
 @Component({
   selector: 'cd-rgw-bucket-form',
   templateUrl: './rgw-bucket-form.component.html',
-  styleUrls: ['./rgw-bucket-form.component.scss']
+  styleUrls: ['./rgw-bucket-form.component.scss'],
+  providers: [RgwBucketEncryptionModel]
 })
 })
-export class RgwBucketFormComponent extends CdForm implements OnInit {
+export class RgwBucketFormComponent extends CdForm implements OnInit, AfterViewChecked {
   bucketForm: CdFormGroup;
   editing = false;
   owners: string[] = null;
   bucketForm: CdFormGroup;
   editing = false;
   owners: string[] = null;
+  kmsProviders: string[] = null;
   action: string;
   resource: string;
   zonegroup: string;
   action: string;
   resource: string;
   zonegroup: string;
@@ -35,6 +40,8 @@ export class RgwBucketFormComponent extends CdForm implements OnInit {
   isVersioningAlreadyEnabled = false;
   isMfaDeleteAlreadyEnabled = false;
   icons = Icons;
   isVersioningAlreadyEnabled = false;
   isMfaDeleteAlreadyEnabled = false;
   icons = Icons;
+  kmsVaultConfig = false;
+  s3VaultConfig = false;
 
   get isVersioningEnabled(): boolean {
     return this.bucketForm.getValue('versioning');
 
   get isVersioningEnabled(): boolean {
     return this.bucketForm.getValue('versioning');
@@ -49,9 +56,12 @@ export class RgwBucketFormComponent extends CdForm implements OnInit {
     private formBuilder: CdFormBuilder,
     private rgwBucketService: RgwBucketService,
     private rgwSiteService: RgwSiteService,
     private formBuilder: CdFormBuilder,
     private rgwBucketService: RgwBucketService,
     private rgwSiteService: RgwSiteService,
+    private modalService: ModalService,
     private rgwUserService: RgwUserService,
     private notificationService: NotificationService,
     private rgwUserService: RgwUserService,
     private notificationService: NotificationService,
-    public actionLabels: ActionLabelsI18n
+    private rgwEncryptionModal: RgwBucketEncryptionModel,
+    public actionLabels: ActionLabelsI18n,
+    private readonly changeDetectorRef: ChangeDetectorRef
   ) {
     super();
     this.editing = this.router.url.startsWith(`/rgw/bucket/${URLVerbs.EDIT}`);
   ) {
     super();
     this.editing = this.router.url.startsWith(`/rgw/bucket/${URLVerbs.EDIT}`);
@@ -60,6 +70,10 @@ export class RgwBucketFormComponent extends CdForm implements OnInit {
     this.createForm();
   }
 
     this.createForm();
   }
 
+  ngAfterViewChecked(): void {
+    this.changeDetectorRef.detectChanges();
+  }
+
   createForm() {
     const self = this;
     const lockDaysValidator = CdValidators.custom('lockDays', () => {
   createForm() {
     const self = this;
     const lockDaysValidator = CdValidators.custom('lockDays', () => {
@@ -79,12 +93,31 @@ export class RgwBucketFormComponent extends CdForm implements OnInit {
           : [CdValidators.bucketName(), CdValidators.bucketExistence(false, this.rgwBucketService)]
       ],
       owner: [null, [Validators.required]],
           : [CdValidators.bucketName(), CdValidators.bucketExistence(false, this.rgwBucketService)]
       ],
       owner: [null, [Validators.required]],
+      kms_provider: ['vault'],
       'placement-target': [null, this.editing ? [] : [Validators.required]],
       versioning: [null],
       'mfa-delete': [null],
       'mfa-token-serial': [''],
       'mfa-token-pin': [''],
       lock_enabled: [{ value: false, disabled: this.editing }],
       'placement-target': [null, this.editing ? [] : [Validators.required]],
       versioning: [null],
       'mfa-delete': [null],
       'mfa-token-serial': [''],
       'mfa-token-pin': [''],
       lock_enabled: [{ value: false, disabled: this.editing }],
+      encryption_enabled: [null],
+      encryption_type: [
+        null,
+        [
+          CdValidators.requiredIf({
+            encryption_enabled: true
+          })
+        ]
+      ],
+      keyId: [
+        null,
+        [
+          CdValidators.requiredIf({
+            encryption_type: 'aws:kms',
+            encryption_enabled: true
+          })
+        ]
+      ],
       lock_mode: ['COMPLIANCE'],
       lock_retention_period_days: [0, [CdValidators.number(false), lockDaysValidator]]
     });
       lock_mode: ['COMPLIANCE'],
       lock_retention_period_days: [0, [CdValidators.number(false), lockDaysValidator]]
     });
@@ -95,6 +128,21 @@ export class RgwBucketFormComponent extends CdForm implements OnInit {
       owners: this.rgwUserService.enumerate()
     };
 
       owners: this.rgwUserService.enumerate()
     };
 
+    this.kmsProviders = this.rgwEncryptionModal.kmsProviders;
+    this.rgwBucketService.getEncryptionConfig().subscribe((data) => {
+      this.kmsVaultConfig = data[0];
+      this.s3VaultConfig = data[1];
+      if (this.kmsVaultConfig && this.s3VaultConfig) {
+        this.bucketForm.get('encryption_type').setValue('');
+      } else if (this.kmsVaultConfig) {
+        this.bucketForm.get('encryption_type').setValue('aws:kms');
+      } else if (this.s3VaultConfig) {
+        this.bucketForm.get('encryption_type').setValue('AES256');
+      } else {
+        this.bucketForm.get('encryption_type').setValue('');
+      }
+    });
+
     if (!this.editing) {
       promises['getPlacementTargets'] = this.rgwSiteService.get('placement-targets');
     }
     if (!this.editing) {
       promises['getPlacementTargets'] = this.rgwSiteService.get('placement-targets');
     }
@@ -137,14 +185,14 @@ export class RgwBucketFormComponent extends CdForm implements OnInit {
           // the Angular react framework will throw an error if there is no
           // field for a given key.
           let value: object = _.pick(bidResp, _.keys(defaults));
           // the Angular react framework will throw an error if there is no
           // field for a given key.
           let value: object = _.pick(bidResp, _.keys(defaults));
+
           value['lock_retention_period_days'] = this.rgwBucketService.getLockDays(bidResp);
           value['placement-target'] = bidResp['placement_rule'];
           value['versioning'] = bidResp['versioning'] === RgwBucketVersioning.ENABLED;
           value['mfa-delete'] = bidResp['mfa_delete'] === RgwBucketMfaDelete.ENABLED;
           value['lock_retention_period_days'] = this.rgwBucketService.getLockDays(bidResp);
           value['placement-target'] = bidResp['placement_rule'];
           value['versioning'] = bidResp['versioning'] === RgwBucketVersioning.ENABLED;
           value['mfa-delete'] = bidResp['mfa_delete'] === RgwBucketMfaDelete.ENABLED;
-
+          value['encryption_enabled'] = bidResp['encryption'] === 'Enabled';
           // Append default values.
           value = _.merge(defaults, value);
           // Append default values.
           value = _.merge(defaults, value);
-
           // Update the form.
           this.bucketForm.setValue(value);
           if (this.editing) {
           // Update the form.
           this.bucketForm.setValue(value);
           if (this.editing) {
@@ -156,7 +204,6 @@ export class RgwBucketFormComponent extends CdForm implements OnInit {
             }
           }
         }
             }
           }
         }
-
         this.loadingReady();
       });
     });
         this.loadingReady();
       });
     });
@@ -168,6 +215,10 @@ export class RgwBucketFormComponent extends CdForm implements OnInit {
 
   submit() {
     // Exit immediately if the form isn't dirty.
 
   submit() {
     // Exit immediately if the form isn't dirty.
+    if (this.bucketForm.getValue('encryption_enabled') == null) {
+      this.bucketForm.get('encryption_enabled').setValue(false);
+      this.bucketForm.get('encryption_type').setValue(null);
+    }
     if (this.bucketForm.pristine) {
       this.goToListView();
       return;
     if (this.bucketForm.pristine) {
       this.goToListView();
       return;
@@ -183,6 +234,9 @@ export class RgwBucketFormComponent extends CdForm implements OnInit {
           values['id'],
           values['owner'],
           versioning,
           values['id'],
           values['owner'],
           versioning,
+          values['encryption_enabled'],
+          values['encryption_type'],
+          values['keyId'],
           mfaDelete,
           values['mfa-token-serial'],
           values['mfa-token-pin'],
           mfaDelete,
           values['mfa-token-serial'],
           values['mfa-token-pin'],
@@ -212,7 +266,10 @@ export class RgwBucketFormComponent extends CdForm implements OnInit {
           values['placement-target'],
           values['lock_enabled'],
           values['lock_mode'],
           values['placement-target'],
           values['lock_enabled'],
           values['lock_mode'],
-          values['lock_retention_period_days']
+          values['lock_retention_period_days'],
+          values['encryption_enabled'],
+          values['encryption_type'],
+          values['keyId']
         )
         .subscribe(
           () => {
         )
         .subscribe(
           () => {
@@ -261,4 +318,23 @@ export class RgwBucketFormComponent extends CdForm implements OnInit {
   getMfaDeleteStatus() {
     return this.isMfaDeleteEnabled ? RgwBucketMfaDelete.ENABLED : RgwBucketMfaDelete.DISABLED;
   }
   getMfaDeleteStatus() {
     return this.isMfaDeleteEnabled ? RgwBucketMfaDelete.ENABLED : RgwBucketMfaDelete.DISABLED;
   }
+
+  fileUpload(files: FileList, controlName: string) {
+    const file: File = files[0];
+    const reader = new FileReader();
+    reader.addEventListener('load', () => {
+      const control: AbstractControl = this.bucketForm.get(controlName);
+      control.setValue(file);
+      control.markAsDirty();
+      control.markAsTouched();
+      control.updateValueAndValidity();
+    });
+  }
+
+  openConfigModal() {
+    const modalRef = this.modalService.show(RgwConfigModalComponent, null, { size: 'lg' });
+    modalRef.componentInstance.configForm
+      .get('encryptionType')
+      .setValue(this.bucketForm.getValue('encryption_type'));
+  }
 }
 }
diff --git a/ceph/src/pybind/mgr/dashboard/frontend/src/app/ceph/rgw/rgw-config-modal/rgw-config-modal.component.html b/ceph/src/pybind/mgr/dashboard/frontend/src/app/ceph/rgw/rgw-config-modal/rgw-config-modal.component.html
new file mode 100644 (file)
index 0000000..dbf93f4
--- /dev/null
@@ -0,0 +1,237 @@
+<cd-modal [modalRef]="activeModal">
+  <ng-container i18n="form title"
+                class="modal-title">Update RGW Encryption Configurations</ng-container>
+
+  <ng-container class="modal-content">
+    <form name="configForm"
+          #frm="ngForm"
+          [formGroup]="configForm">
+    <div class="modal-body">
+      <div class="form-group row">
+        <label class="cd-col-form-label required"
+               for="encryptionType"
+               i18n>Encryption Type</label>
+        <div class="col-md-auto custom-checkbox form-check-inline ms-3">
+          <input class="form-check-input"
+                 formControlName="encryptionType"
+                 id="s3Enabled"
+                 type="radio"
+                 name="encryptionType"
+                 value="AES256">
+          <label class="custom-check-label"
+                 for="s3Enabled"
+                 i18n>SSE-S3 Encryption</label>
+        </div>
+
+        <div class="col-md-auto custom-checkbox form-check-inline">
+          <input class="form-check-input"
+                 formControlName="encryptionType"
+                 id="kmsEnabled"
+                 name="encryptionType"
+                 value="aws:kms"
+                 type="radio">
+          <label class="custom-check-label"
+                 for="kmsEnabled"
+                 i18n>SSE-KMS Encryption</label>
+        </div>
+      </div>
+
+      <div *ngIf="configForm.getValue('encryptionType') === 'aws:kms' || configForm.getValue('encryptionType') === 'AES256'">
+        <div class="form-group row">
+          <label class="cd-col-form-label required"
+                 for="kms_provider"
+                 i18n>Key management service provider</label>
+          <div class="cd-col-form-input">
+            <select id="kms_provider"
+                    name="kms_provider"
+                    class="form-select"
+                    formControlName="kms_provider">
+              <option i18n
+                      *ngIf="kmsProviders !== null"
+                      [ngValue]="null">-- Select a provider --</option>
+              <option *ngFor="let provider of kmsProviders"
+                      [value]="provider">{{ provider }}</option>
+            </select>
+            <span class="invalid-feedback"
+                  *ngIf="configForm.showError('kms_provider', frm, 'required')"
+                  i18n>This field is required.</span>
+          </div>
+        </div>
+      </div>
+
+      <div *ngIf="configForm.getValue('encryptionType') === 'aws:kms' || configForm.getValue('encryptionType') === 'AES256'">
+        <div class="form-group row">
+          <label class="cd-col-form-label required"
+                 for="auth_method"
+                 i18n>Authentication Method</label>
+          <div class="cd-col-form-input">
+            <select id="auth_method"
+                    name="auth_method"
+                    class="form-select"
+                    formControlName="auth_method">
+              <option i18n
+                      *ngIf="authMethods !== null"
+                      [ngValue]="null">-- Select a method --</option>
+              <option *ngFor="let auth_method of authMethods"
+                      [value]="auth_method">{{ auth_method }}</option>
+            </select>
+            <span class="invalid-feedback"
+                  *ngIf="configForm.showError('auth_method', frm, 'required')"
+                  i18n>This field is required.</span>
+          </div>
+        </div>
+      </div>
+
+      <div *ngIf="configForm.getValue('encryptionType') === 'aws:kms' || configForm.getValue('encryptionType') === 'AES256'">
+        <div class="form-group row">
+          <label class="cd-col-form-label required"
+                 for="secret_engine"
+                 i18n>Secret Engine</label>
+          <div class="cd-col-form-input">
+            <select id="secret_engine"
+                    name="secret_engine"
+                    class="form-select"
+                    formControlName="secret_engine">
+              <option i18n
+                      *ngIf="secretEngines !== null"
+                      [ngValue]="null">-- Select a method --</option>
+              <option *ngFor="let secret_engine of secretEngines"
+                      [value]="secret_engine">{{ secret_engine }}</option>
+            </select>
+            <span class="invalid-feedback"
+                  *ngIf="configForm.showError('secret_engine', frm, 'required')"
+                  i18n>This field is required.</span>
+          </div>
+        </div>
+      </div>
+
+      <div *ngIf="configForm.getValue('encryptionType') === 'aws:kms' || configForm.getValue('encryptionType') === 'AES256'">
+        <div class="form-group row">
+          <label class="cd-col-form-label"
+                 for="secret_path"
+                 i18n>Secret Path
+          </label>
+          <div class="cd-col-form-input">
+            <input id="secret_path"
+                   name="secret_path"
+                   class="form-control"
+                   type="text"
+                   formControlName="secret_path">
+            <span class="invalid-feedback"
+                  *ngIf="configForm.showError('secret_path', frm, 'required')"
+                  i18n>This field is required.</span>
+          </div>
+        </div>
+      </div>
+
+      <div *ngIf="configForm.getValue('encryptionType') === 'aws:kms' || configForm.getValue('encryptionType') === 'AES256'">
+        <div class="form-group row">
+          <label class="cd-col-form-label"
+                 for="namespace"
+                 i18n>Namespace
+          </label>
+          <div class="cd-col-form-input">
+            <input id="namespace"
+                   name="namespace"
+                   class="form-control"
+                   type="text"
+                   formControlName="namespace">
+          </div>
+        </div>
+      </div>
+
+      <div *ngIf="configForm.getValue('encryptionType') === 'aws:kms' || configForm.getValue('encryptionType') === 'AES256'">
+        <div class="form-group row">
+          <label class="cd-col-form-label required"
+                 for="address"
+                 i18n>Vault Address
+          </label>
+          <div class="cd-col-form-input">
+            <input id="address"
+                   name="address"
+                   class="form-control"
+                   formControlName="address">
+            <span class="invalid-feedback"
+                  *ngIf="configForm.showError('address', frm, 'required')"
+                  i18n>This field is required.</span>
+          </div>
+        </div>
+      </div>
+
+      <div *ngIf="configForm.getValue('auth_method') === 'token'"
+           class="form-group row">
+        <label class="cd-col-form-label required"
+               for="token">
+        <span i18n>Token</span>
+        </label>
+        <div class="cd-col-form-input">
+          <input type="file"
+                 formControlName="token"
+                 (change)="fileUpload($event.target.files, 'token')">
+          <span class="invalid-feedback"
+                *ngIf="configForm.showError('token', frm, 'required')"
+                i18n>This field is required.</span>
+        </div>
+      </div>
+
+      <div *ngIf="configForm.getValue('encryptionType') === 'aws:kms' || configForm.getValue('encryptionType') === 'AES256'">
+        <div class="form-group row">
+          <label class="cd-col-form-label"
+                 for="ssl_cert">
+          <span i18n>CA Certificate</span>
+          <cd-helper i18n>The SSL certificate in PEM format.</cd-helper>
+          </label>
+          <div class="cd-col-form-input">
+            <input type="file"
+                   formControlName="ssl_cert"
+                   (change)="fileUpload($event.target.files, 'ssl_cert')">
+            <span class="invalid-feedback"
+                  *ngIf="configForm.showError('ssl_cert', frm, 'required')"
+                  i18n>This field is required.</span>
+          </div>
+        </div>
+      </div>
+
+      <div *ngIf="configForm.getValue('encryptionType') === 'aws:kms' || configForm.getValue('encryptionType') === 'AES256'">
+        <div class="form-group row">
+          <label class="cd-col-form-label"
+                 for="client_cert">
+          <span i18n>Client Certificate</span>
+          <cd-helper i18n>The Client certificate in PEM format.</cd-helper>
+          </label>
+          <div class="cd-col-form-input">
+            <input type="file"
+                   formControlName="client_cert"
+                   (change)="fileUpload($event.target.files, 'client_cert')">
+            <span class="invalid-feedback"
+                  *ngIf="configForm.showError('client_cert', frm, 'required')"
+                  i18n>This field is required.</span>
+          </div>
+        </div>
+      </div>
+
+      <div *ngIf="configForm.getValue('encryptionType') === 'aws:kms' || configForm.getValue('encryptionType') === 'AES256'">
+        <div class="form-group row">
+          <label class="cd-col-form-label"
+                 for="client_key">
+          <span i18n>Client Private Key</span>
+          <cd-helper i18n>The Client Private Key in PEM format.</cd-helper>
+          </label>
+          <div class="cd-col-form-input">
+            <input type="file"
+                   (change)="fileUpload($event.target.files, 'client_key')">
+            <span class="invalid-feedback"
+                  *ngIf="configForm.showError('client_key', frm, 'required')"
+                  i18n>This field is required.</span>
+          </div>
+        </div>
+      </div>
+    </div>
+    <div class="modal-footer">
+      <cd-form-button-panel (submitActionEvent)="onSubmit()"
+                            [submitText]="actionLabels.SUBMIT"
+                            [form]="configForm"></cd-form-button-panel>
+    </div>
+    </form>
+  </ng-container>
+</cd-modal>
diff --git a/ceph/src/pybind/mgr/dashboard/frontend/src/app/ceph/rgw/rgw-config-modal/rgw-config-modal.component.scss b/ceph/src/pybind/mgr/dashboard/frontend/src/app/ceph/rgw/rgw-config-modal/rgw-config-modal.component.scss
new file mode 100644 (file)
index 0000000..e69de29
diff --git a/ceph/src/pybind/mgr/dashboard/frontend/src/app/ceph/rgw/rgw-config-modal/rgw-config-modal.component.spec.ts b/ceph/src/pybind/mgr/dashboard/frontend/src/app/ceph/rgw/rgw-config-modal/rgw-config-modal.component.spec.ts
new file mode 100644 (file)
index 0000000..a266615
--- /dev/null
@@ -0,0 +1,38 @@
+import { HttpClientTestingModule } from '@angular/common/http/testing';
+import { ComponentFixture, TestBed } from '@angular/core/testing';
+import { ReactiveFormsModule } from '@angular/forms';
+import { RouterTestingModule } from '@angular/router/testing';
+
+import { NgbActiveModal } from '@ng-bootstrap/ng-bootstrap';
+import { ToastrModule } from 'ngx-toastr';
+
+import { SharedModule } from '~/app/shared/shared.module';
+import { configureTestBed } from '~/testing/unit-test-helper';
+import { RgwConfigModalComponent } from './rgw-config-modal.component';
+
+describe('RgwConfigModalComponent', () => {
+  let component: RgwConfigModalComponent;
+  let fixture: ComponentFixture<RgwConfigModalComponent>;
+
+  configureTestBed({
+    declarations: [RgwConfigModalComponent],
+    imports: [
+      SharedModule,
+      ReactiveFormsModule,
+      RouterTestingModule,
+      HttpClientTestingModule,
+      ToastrModule.forRoot()
+    ],
+    providers: [NgbActiveModal]
+  });
+
+  beforeEach(() => {
+    fixture = TestBed.createComponent(RgwConfigModalComponent);
+    component = fixture.componentInstance;
+    fixture.detectChanges();
+  });
+
+  it('should create', () => {
+    expect(component).toBeTruthy();
+  });
+});
diff --git a/ceph/src/pybind/mgr/dashboard/frontend/src/app/ceph/rgw/rgw-config-modal/rgw-config-modal.component.ts b/ceph/src/pybind/mgr/dashboard/frontend/src/app/ceph/rgw/rgw-config-modal/rgw-config-modal.component.ts
new file mode 100644 (file)
index 0000000..de1541a
--- /dev/null
@@ -0,0 +1,136 @@
+import { Component, EventEmitter, OnInit, Output } from '@angular/core';
+import { AbstractControl, Validators } from '@angular/forms';
+import { Router } from '@angular/router';
+
+import { NgbActiveModal } from '@ng-bootstrap/ng-bootstrap';
+import _ from 'lodash';
+
+import { RgwBucketService } from '~/app/shared/api/rgw-bucket.service';
+import { ActionLabelsI18n } from '~/app/shared/constants/app.constants';
+import { NotificationType } from '~/app/shared/enum/notification-type.enum';
+import { CdFormBuilder } from '~/app/shared/forms/cd-form-builder';
+import { CdFormGroup } from '~/app/shared/forms/cd-form-group';
+import { CdValidators } from '~/app/shared/forms/cd-validators';
+import { NotificationService } from '~/app/shared/services/notification.service';
+import { RgwBucketEncryptionModel } from '../models/rgw-bucket-encryption';
+
+@Component({
+  selector: 'cd-rgw-config-modal',
+  templateUrl: './rgw-config-modal.component.html',
+  styleUrls: ['./rgw-config-modal.component.scss'],
+  providers: [RgwBucketEncryptionModel]
+})
+export class RgwConfigModalComponent implements OnInit {
+  readonly vaultAddress = /^((https?:\/\/)|(www.))(?:([a-zA-Z]+)|(\d+\.\d+.\d+.\d+)):\d{4}$/;
+
+  kmsProviders: string[];
+
+  configForm: CdFormGroup;
+
+  @Output()
+  submitAction = new EventEmitter();
+  authMethods: string[];
+  secretEngines: string[];
+
+  constructor(
+    private formBuilder: CdFormBuilder,
+    public activeModal: NgbActiveModal,
+    private router: Router,
+    public actionLabels: ActionLabelsI18n,
+    private rgwBucketService: RgwBucketService,
+    private rgwEncryptionModal: RgwBucketEncryptionModel,
+    private notificationService: NotificationService
+  ) {
+    this.createForm();
+  }
+  ngOnInit(): void {
+    this.kmsProviders = this.rgwEncryptionModal.kmsProviders;
+    this.authMethods = this.rgwEncryptionModal.authMethods;
+    this.secretEngines = this.rgwEncryptionModal.secretEngines;
+  }
+
+  createForm() {
+    this.configForm = this.formBuilder.group({
+      address: [
+        null,
+        [
+          Validators.required,
+          CdValidators.custom('vaultPattern', (value: string) => {
+            if (_.isEmpty(value)) {
+              return false;
+            }
+            return !this.vaultAddress.test(value);
+          })
+        ]
+      ],
+      kms_provider: ['vault', Validators.required],
+      encryptionType: ['aws:kms', Validators.required],
+      auth_method: [null, Validators.required],
+      secret_engine: [null, Validators.required],
+      secret_path: ['/'],
+      namespace: [null],
+      token: [
+        null,
+        [
+          CdValidators.requiredIf({
+            auth_method: 'token'
+          })
+        ]
+      ],
+      ssl_cert: [null, CdValidators.sslCert()],
+      client_cert: [null, CdValidators.pemCert()],
+      client_key: [null, CdValidators.sslPrivKey()],
+      kmsEnabled: [{ value: false }],
+      s3Enabled: [{ value: false }]
+    });
+  }
+
+  fileUpload(files: FileList, controlName: string) {
+    const file: File = files[0];
+    const reader = new FileReader();
+    reader.addEventListener('load', () => {
+      const control: AbstractControl = this.configForm.get(controlName);
+      control.setValue(file);
+      control.markAsDirty();
+      control.markAsTouched();
+      control.updateValueAndValidity();
+    });
+  }
+
+  onSubmit() {
+    const values = this.configForm.value;
+    this.rgwBucketService
+      .setEncryptionConfig(
+        values['encryptionType'],
+        values['kms_provider'],
+        values['auth_method'],
+        values['secret_engine'],
+        values['secret_path'],
+        values['namespace'],
+        values['address'],
+        values['token'],
+        values['owner'],
+        values['ssl_cert'],
+        values['client_cert'],
+        values['client_key']
+      )
+      .subscribe({
+        next: () => {
+          this.notificationService.show(
+            NotificationType.success,
+            $localize`Updated RGW Encryption Configuration values`
+          );
+        },
+        error: (error: any) => {
+          this.notificationService.show(NotificationType.error, error);
+          this.configForm.setErrors({ cdSubmitButton: true });
+        },
+        complete: () => {
+          this.activeModal.close();
+          this.router.routeReuseStrategy.shouldReuseRoute = () => false;
+          this.router.onSameUrlNavigation = 'reload';
+          this.router.navigate([this.router.url]);
+        }
+      });
+  }
+}
index f10394342b1381e0eef7c587bad937fb63e8ff18..868a803e46ce4e39fc9e9dfaf0621b3bbe66f264 100644 (file)
@@ -1,9 +1,9 @@
 <ng-container *ngIf="selection">
 <ng-container *ngIf="selection">
-  <ul ngbNav
-      #nav="ngbNav"
-      class="nav-tabs"
-      cdStatefulTab="rgw-daemon-details">
-    <li ngbNavItem="details">
+  <nav ngbNav
+       #nav="ngbNav"
+       class="nav-tabs"
+       cdStatefulTab="rgw-daemon-details">
+    <ng-container ngbNavItem="details">
       <a ngbNavLink
          i18n>Details</a>
       <ng-template ngbNavContent>
       <a ngbNavLink
          i18n>Details</a>
       <ng-template ngbNavContent>
@@ -11,8 +11,8 @@
                             (fetchData)="getMetaData()">
         </cd-table-key-value>
       </ng-template>
                             (fetchData)="getMetaData()">
         </cd-table-key-value>
       </ng-template>
-    </li>
-    <li ngbNavItem="performance-counters">
+    </ng-container>
+    <ng-container ngbNavItem="performance-counters">
       <a ngbNavLink
          i18n>Performance Counters</a>
       <ng-template ngbNavContent>
       <a ngbNavLink
          i18n>Performance Counters</a>
       <ng-template ngbNavContent>
                                       [serviceId]="serviceMapId">
         </cd-table-performance-counter>
       </ng-template>
                                       [serviceId]="serviceMapId">
         </cd-table-performance-counter>
       </ng-template>
-    </li>
-    <li ngbNavItem="performance-details"
-        *ngIf="grafanaPermission.read">
+    </ng-container>
+    <ng-container ngbNavItem="performance-details"
+                  *ngIf="grafanaPermission.read">
       <a ngbNavLink
          i18n>Performance Details</a>
       <ng-template ngbNavContent>
       <a ngbNavLink
          i18n>Performance Details</a>
       <ng-template ngbNavContent>
-        <cd-grafana [grafanaPath]="'rgw-instance-detail?var-rgw_servers=rgw.' + this.serviceId"
+        <cd-grafana i18n-title
+                    title="RGW instance details"
+                    [grafanaPath]="'rgw-instance-detail?var-rgw_servers=rgw.' + this.serviceId"
                     [type]="'metrics'"
                     uid="x5ARzZtmk"
                     grafanaStyle="one">
         </cd-grafana>
       </ng-template>
                     [type]="'metrics'"
                     uid="x5ARzZtmk"
                     grafanaStyle="one">
         </cd-grafana>
       </ng-template>
-    </li>
-  </ul>
+    </ng-container>
+  </nav>
 
   <div [ngbNavOutlet]="nav"></div>
 </ng-container>
 
   <div [ngbNavOutlet]="nav"></div>
 </ng-container>
index e5b01305706ae81ec6e2450f3ae5ec1486dcafc8..fbd7d32633015ebe8342e63497ffce2ca729c516 100644 (file)
@@ -1,7 +1,7 @@
-<ul ngbNav
-    #nav="ngbNav"
-    class="nav-tabs">
-  <li ngbNavItem>
+<nav ngbNav
+     #nav="ngbNav"
+     class="nav-tabs">
+  <ng-container ngbNavItem>
     <a ngbNavLink
        i18n>Daemons List</a>
     <ng-template ngbNavContent>
     <a ngbNavLink
        i18n>Daemons List</a>
     <ng-template ngbNavContent>
         </cd-rgw-daemon-details>
       </cd-table>
     </ng-template>
         </cd-rgw-daemon-details>
       </cd-table>
     </ng-template>
-  </li>
+  </ng-container>
 
 
-  <li ngbNavItem
-      *ngIf="grafanaPermission.read">
+  <ng-container ngbNavItem
+                *ngIf="grafanaPermission.read">
     <a ngbNavLink
        i18n>Overall Performance</a>
     <ng-template ngbNavContent>
     <a ngbNavLink
        i18n>Overall Performance</a>
     <ng-template ngbNavContent>
-      <cd-grafana [grafanaPath]="'rgw-overview?'"
+      <cd-grafana i18n-title
+                  title="RGW overview"
+                  [grafanaPath]="'rgw-overview?'"
                   [type]="'metrics'"
                   uid="WAkugZpiz"
                   grafanaStyle="two">
       </cd-grafana>
     </ng-template>
                   [type]="'metrics'"
                   uid="WAkugZpiz"
                   grafanaStyle="two">
       </cd-grafana>
     </ng-template>
-  </li>
+  </ng-container>
 
 
-  <li ngbNavItem
-      *ngIf="grafanaPermission.read && isMultiSite">
+  <ng-container ngbNavItem
+                *ngIf="grafanaPermission.read && isMultiSite">
     <a ngbNavLink
        i18n>Sync Performance</a>
     <ng-template ngbNavContent>
     <a ngbNavLink
        i18n>Sync Performance</a>
     <ng-template ngbNavContent>
-      <cd-grafana [grafanaPath]="'radosgw-sync-overview?'"
+      <cd-grafana i18n-title
+                  title="Radosgw sync overview"
+                  [grafanaPath]="'radosgw-sync-overview?'"
                   [type]="'metrics'"
                   uid="rgw-sync-overview"
                   grafanaStyle="two">
       </cd-grafana>
     </ng-template>
                   [type]="'metrics'"
                   uid="rgw-sync-overview"
                   grafanaStyle="two">
       </cd-grafana>
     </ng-template>
-  </li>
-</ul>
+  </ng-container>
+</nav>
 
 <div [ngbNavOutlet]="nav"></div>
 
 <div [ngbNavOutlet]="nav"></div>
index ecf0bedf961d0d5fb5942e91bcd453daffd93554..c8cddfdc8a9eb06469d02494709fe8d187ff022e 100644 (file)
@@ -77,7 +77,7 @@ describe('RgwDaemonListComponent', () => {
     expect(listDaemonsSpy).toHaveBeenCalledTimes(1);
     expect(component.daemons).toEqual([daemon]);
     expect(fixture.debugElement.query(By.css('cd-table')).nativeElement.textContent).toContain(
     expect(listDaemonsSpy).toHaveBeenCalledTimes(1);
     expect(component.daemons).toEqual([daemon]);
     expect(fixture.debugElement.query(By.css('cd-table')).nativeElement.textContent).toContain(
-      'total 1'
+      'total of 1'
     );
 
     fixture.destroy();
     );
 
     fixture.destroy();
index 8276e01e7c4bf30af6c67cc12d385e7665556fcb..d94e2b94497e1b0cdad710c644592fea3c5203a6 100644 (file)
@@ -21,7 +21,7 @@
                    [readonly]="true"
                    formControlName="type">
             <select id="type"
                    [readonly]="true"
                    formControlName="type">
             <select id="type"
-                    class="form-control"
+                    class="form-select"
                     formControlName="type"
                     *ngIf="!editing"
                     autofocus>
                     formControlName="type"
                     *ngIf="!editing"
                     autofocus>
@@ -44,7 +44,7 @@
                  i18n>Permission</label>
           <div class="cd-col-form-input">
             <select id="perm"
                  i18n>Permission</label>
           <div class="cd-col-form-input">
             <select id="perm"
-                    class="form-control"
+                    class="form-select"
                     formControlName="perm">
               <option i18n
                       [ngValue]="null">-- Select a permission --</option>
                     formControlName="perm">
               <option i18n
                       [ngValue]="null">-- Select a permission --</option>
index 2283f4c546f053982c7def5fbd5d9937c9abc555..992a98ac83fc4ecb9ab0b205f99136998ef090d3 100644 (file)
@@ -1,9 +1,9 @@
 <ng-container *ngIf="selection">
 <ng-container *ngIf="selection">
-  <ul ngbNav
-      #nav="ngbNav"
-      class="nav-tabs"
-      cdStatefulTab="rgw-user-details">
-    <li ngbNavItem="details">
+  <nav ngbNav
+       #nav="ngbNav"
+       class="nav-tabs"
+       cdStatefulTab="rgw-user-details">
+    <ng-container ngbNavItem="details">
       <a ngbNavLink
          i18n>Details</a>
       <ng-template ngbNavContent>
       <a ngbNavLink
          i18n>Details</a>
       <ng-template ngbNavContent>
           </div>
         </div>
       </ng-template>
           </div>
         </div>
       </ng-template>
-    </li>
-    <li ngbNavItem="keys"
-        *ngIf="keys.length">
+    </ng-container>
+    <ng-container ngbNavItem="keys"
+                  *ngIf="keys.length">
       <a ngbNavLink
          i18n>Keys</a>
       <ng-template ngbNavContent>
       <a ngbNavLink
          i18n>Keys</a>
       <ng-template ngbNavContent>
           </div>
         </cd-table>
       </ng-template>
           </div>
         </cd-table>
       </ng-template>
-    </li>
-  </ul>
+    </ng-container>
+  </nav>
 
   <div [ngbNavOutlet]="nav"></div>
 </ng-container>
 
   <div [ngbNavOutlet]="nav"></div>
 </ng-container>
index 6c00f37d42d8387a4c8932a94fa7c25fb0479ed5..a1c72c8481484c9e904be249f9aeda36e65d033d 100644 (file)
                  for="max_buckets_mode"
                  i18n>Max. buckets</label>
           <div class="cd-col-form-input">
                  for="max_buckets_mode"
                  i18n>Max. buckets</label>
           <div class="cd-col-form-input">
-            <select class="form-control"
+            <select class="form-select"
                     formControlName="max_buckets_mode"
                     name="max_buckets_mode"
                     id="max_buckets_mode"
                     formControlName="max_buckets_mode"
                     name="max_buckets_mode"
                     id="max_buckets_mode"
                        class="form-control"
                        type="password"
                        formControlName="access_key">
                        class="form-control"
                        type="password"
                        formControlName="access_key">
-                <span class="input-group-append">
-                  <button type="button"
-                          class="btn btn-light"
-                          cdPasswordButton="access_key">
-                  </button>
-                  <cd-copy-2-clipboard-button source="access_key">
-                  </cd-copy-2-clipboard-button>
-                </span>
+                <button type="button"
+                        class="btn btn-light"
+                        cdPasswordButton="access_key">
+                </button>
+                <cd-copy-2-clipboard-button source="access_key">
+                </cd-copy-2-clipboard-button>
               </div>
               <span class="invalid-feedback"
                     *ngIf="userForm.showError('access_key', frm, 'required')"
               </div>
               <span class="invalid-feedback"
                     *ngIf="userForm.showError('access_key', frm, 'required')"
                        class="form-control"
                        type="password"
                        formControlName="secret_key">
                        class="form-control"
                        type="password"
                        formControlName="secret_key">
-                <span class="input-group-append">
-                  <button type="button"
-                          class="btn btn-light"
-                          cdPasswordButton="secret_key">
-                  </button>
-                  <cd-copy-2-clipboard-button source="secret_key">
-                  </cd-copy-2-clipboard-button>
-                </span>
+                <button type="button"
+                        class="btn btn-light"
+                        cdPasswordButton="secret_key">
+                </button>
+                <cd-copy-2-clipboard-button source="secret_key">
+                </cd-copy-2-clipboard-button>
               </div>
               <span class="invalid-feedback"
                     *ngIf="userForm.showError('secret_key', frm, 'required')"
               </div>
               <span class="invalid-feedback"
                     *ngIf="userForm.showError('secret_key', frm, 'required')"
 
               <span *ngFor="let subuser of subusers; let i=index;">
                 <div class="input-group">
 
               <span *ngFor="let subuser of subusers; let i=index;">
                 <div class="input-group">
-                  <div class="input-group-prepend">
-                    <span class="input-group-text">
-                      <i class="{{ icons.user }}"></i>
-                    </span>
-                  </div>
+                  <span class="input-group-text">
+                    <i class="{{ icons.user }}"></i>
+                  </span>
                   <input type="text"
                          class="cd-form-control"
                          value="{{ subuser.id }}"
                          readonly>
                   <input type="text"
                          class="cd-form-control"
                          value="{{ subuser.id }}"
                          readonly>
-                  <div class="input-group-prepend border-left-0 border-right-0">
-                    <span class="input-group-text">
-                      <i class="{{ icons.share }}"></i>
-                    </span>
-                  </div>
+                  <span class="input-group-text">
+                    <i class="{{ icons.share }}"></i>
+                  </span>
                   <input type="text"
                          class="cd-form-control"
                          value="{{ ('full-control' === subuser.permissions) ? 'full' : subuser.permissions }}"
                          readonly>
                   <input type="text"
                          class="cd-form-control"
                          value="{{ ('full-control' === subuser.permissions) ? 'full' : subuser.permissions }}"
                          readonly>
-                  <span class="input-group-append">
-                    <button type="button"
-                            class="btn btn-light tc_showSubuserButton"
-                            i18n-ngbTooltip
-                            ngbTooltip="Edit"
-                            (click)="showSubuserModal(i)">
-                      <i [ngClass]="[icons.edit]"></i>
-                    </button>
-                    <button type="button"
-                            class="btn btn-light tc_deleteSubuserButton"
-                            i18n-ngbTooltip
-                            ngbTooltip="Delete"
-                            (click)="deleteSubuser(i)">
-                      <i [ngClass]="[icons.destroy]"></i>
-                    </button>
-                  </span>
+                  <button type="button"
+                          class="btn btn-light tc_showSubuserButton"
+                          i18n-ngbTooltip
+                          ngbTooltip="Edit"
+                          (click)="showSubuserModal(i)">
+                    <i [ngClass]="[icons.edit]"></i>
+                  </button>
+                  <button type="button"
+                          class="btn btn-light tc_deleteSubuserButton"
+                          i18n-ngbTooltip
+                          ngbTooltip="Delete"
+                          (click)="deleteSubuser(i)">
+                    <i [ngClass]="[icons.destroy]"></i>
+                  </button>
                 </div>
                 <span class="form-text text-muted"></span>
               </span>
 
                 </div>
                 <span class="form-text text-muted"></span>
               </span>
 
-              <div class="row">
+              <div class="row my-2">
                 <div class="col-12">
                   <button type="button"
                 <div class="col-12">
                   <button type="button"
-                          class="btn btn-light float-right tc_addSubuserButton"
+                          class="btn btn-light float-end tc_addSubuserButton"
                           (click)="showSubuserModal()">
                     <i [ngClass]="[icons.add]"></i>
                     <ng-container i18n>{{ actionLabels.CREATE | titlecase }}
                           (click)="showSubuserModal()">
                     <i [ngClass]="[icons.add]"></i>
                     <ng-container i18n>{{ actionLabels.CREATE | titlecase }}
 
               <span *ngFor="let key of s3Keys; let i=index;">
                 <div class="input-group">
 
               <span *ngFor="let key of s3Keys; let i=index;">
                 <div class="input-group">
-                  <div class="input-group-prepend">
-                    <div class="input-group-text">
-                      <i class="{{ icons.key }}"></i>
-                    </div>
+                  <div class="input-group-text">
+                    <i class="{{ icons.key }}"></i>
                   </div>
                   <input type="text"
                          class="cd-form-control"
                          value="{{ key.user }}"
                          readonly>
                   </div>
                   <input type="text"
                          class="cd-form-control"
                          value="{{ key.user }}"
                          readonly>
-                  <span class="input-group-append">
-                    <button type="button"
-                            class="btn btn-light tc_showS3KeyButton"
-                            i18n-ngbTooltip
-                            ngbTooltip="Show"
-                            (click)="showS3KeyModal(i)">
-                      <i [ngClass]="[icons.show]"></i>
-                    </button>
-                    <button type="button"
-                            class="btn btn-light tc_deleteS3KeyButton"
-                            i18n-ngbTooltip
-                            ngbTooltip="Delete"
-                            (click)="deleteS3Key(i)">
-                      <i [ngClass]="[icons.destroy]"></i>
-                    </button>
-                  </span>
+                  <button type="button"
+                          class="btn btn-light tc_showS3KeyButton"
+                          i18n-ngbTooltip
+                          ngbTooltip="Show"
+                          (click)="showS3KeyModal(i)">
+                    <i [ngClass]="[icons.show]"></i>
+                  </button>
+                  <button type="button"
+                          class="btn btn-light tc_deleteS3KeyButton"
+                          i18n-ngbTooltip
+                          ngbTooltip="Delete"
+                          (click)="deleteS3Key(i)">
+                    <i [ngClass]="[icons.destroy]"></i>
+                  </button>
                 </div>
                 <span class="form-text text-muted"></span>
               </span>
 
                 </div>
                 <span class="form-text text-muted"></span>
               </span>
 
-              <div class="row">
+              <div class="row my-2">
                 <div class="col-12">
                   <button type="button"
                 <div class="col-12">
                   <button type="button"
-                          class="btn btn-light float-right tc_addS3KeyButton"
+                          class="btn btn-light float-end tc_addS3KeyButton"
                           (click)="showS3KeyModal()">
                     <i [ngClass]="[icons.add]"></i>
                     <ng-container i18n>{{ actionLabels.CREATE | titlecase }}
                           (click)="showS3KeyModal()">
                     <i [ngClass]="[icons.add]"></i>
                     <ng-container i18n>{{ actionLabels.CREATE | titlecase }}
 
               <span *ngFor="let key of swiftKeys; let i=index;">
                 <div class="input-group">
 
               <span *ngFor="let key of swiftKeys; let i=index;">
                 <div class="input-group">
-                  <div class="input-group-prepend">
-                    <span class="input-group-text">
-                      <i class="{{ icons.key }}"></i>
-                    </span>
-                  </div>
+                  <span class="input-group-text">
+                    <i class="{{ icons.key }}"></i>
+                  </span>
                   <input type="text"
                          class="cd-form-control"
                          value="{{ key.user }}"
                          readonly>
                   <input type="text"
                          class="cd-form-control"
                          value="{{ key.user }}"
                          readonly>
-                  <span class="input-group-append">
-                    <button type="button"
-                            class="btn btn-light tc_showSwiftKeyButton"
-                            i18n-ngbTooltip
-                            ngbTooltip="Show"
-                            (click)="showSwiftKeyModal(i)">
-                      <i [ngClass]="[icons.show]"></i>
-                    </button>
-                  </span>
+                  <button type="button"
+                          class="btn btn-light tc_showSwiftKeyButton"
+                          i18n-ngbTooltip
+                          ngbTooltip="Show"
+                          (click)="showSwiftKeyModal(i)">
+                    <i [ngClass]="[icons.show]"></i>
+                  </button>
                 </div>
                 <span class="form-text text-muted"></span>
               </span>
                 </div>
                 <span class="form-text text-muted"></span>
               </span>
 
               <span *ngFor="let cap of capabilities; let i=index;">
                 <div class="input-group">
 
               <span *ngFor="let cap of capabilities; let i=index;">
                 <div class="input-group">
-                  <span class="input-group-prepend">
-                    <div class="input-group-text">
-                      <i class="{{ icons.share }}"></i>
-                    </div>
-                  </span>
+                  <div class="input-group-text">
+                    <i class="{{ icons.share }}"></i>
+                  </div>
                   <input type="text"
                          class="cd-form-control"
                          value="{{ cap.type }}:{{ cap.perm }}"
                          readonly>
                   <input type="text"
                          class="cd-form-control"
                          value="{{ cap.type }}:{{ cap.perm }}"
                          readonly>
-                  <span class="input-group-append">
-                    <button type="button"
-                            class="btn btn-light tc_editCapButton"
-                            i18n-ngbTooltip
-                            ngbTooltip="Edit"
-                            (click)="showCapabilityModal(i)">
-                      <i [ngClass]="[icons.edit]"></i>
-                    </button>
-                    <button type="button"
-                            class="btn btn-light tc_deleteCapButton"
-                            i18n-ngbTooltip
-                            ngbTooltip="Delete"
-                            (click)="deleteCapability(i)">
-                      <i [ngClass]="[icons.destroy]"></i>
-                    </button>
-                  </span>
+                  <button type="button"
+                          class="btn btn-light tc_editCapButton"
+                          i18n-ngbTooltip
+                          ngbTooltip="Edit"
+                          (click)="showCapabilityModal(i)">
+                    <i [ngClass]="[icons.edit]"></i>
+                  </button>
+                  <button type="button"
+                          class="btn btn-light tc_deleteCapButton"
+                          i18n-ngbTooltip
+                          ngbTooltip="Delete"
+                          (click)="deleteCapability(i)">
+                    <i [ngClass]="[icons.destroy]"></i>
+                  </button>
                 </div>
                 <span class="form-text text-muted"></span>
               </span>
 
                 </div>
                 <span class="form-text text-muted"></span>
               </span>
 
-              <div class="row">
+              <div class="row my-2">
                 <div class="col-12">
                   <button type="button"
                 <div class="col-12">
                   <button type="button"
-                          class="btn btn-light float-right tc_addCapButton"
+                          class="btn btn-light float-end tc_addCapButton"
                           [disabled]="capabilities | pipeFunction:hasAllCapabilities"
                           i18n-ngbTooltip
                           ngbTooltip="All capabilities are already added."
                           [disabled]="capabilities | pipeFunction:hasAllCapabilities"
                           i18n-ngbTooltip
                           ngbTooltip="All capabilities are already added."
index 6ec8978af966a6d4d4852b4dd477a98cb7b08592..3dc7de71aae795b3f1fd272e43a281e63facbe1f 100644 (file)
                      type="password"
                      [readonly]="viewing"
                      formControlName="access_key">
                      type="password"
                      [readonly]="viewing"
                      formControlName="access_key">
-              <span class="input-group-append">
-                <button type="button"
-                        class="btn btn-light"
-                        cdPasswordButton="access_key">
-                </button>
-                <cd-copy-2-clipboard-button source="access_key">
-                </cd-copy-2-clipboard-button>
-              </span>
+              <button type="button"
+                      class="btn btn-light"
+                      cdPasswordButton="access_key">
+              </button>
+              <cd-copy-2-clipboard-button source="access_key">
+              </cd-copy-2-clipboard-button>
             </div>
             <span class="invalid-feedback"
                   *ngIf="formGroup.showError('access_key', frm, 'required')"
             </div>
             <span class="invalid-feedback"
                   *ngIf="formGroup.showError('access_key', frm, 'required')"
                      type="password"
                      [readonly]="viewing"
                      formControlName="secret_key">
                      type="password"
                      [readonly]="viewing"
                      formControlName="secret_key">
-              <span class="input-group-append">
-                <button type="button"
-                        class="btn btn-light"
-                        cdPasswordButton="secret_key">
-                </button>
-                <cd-copy-2-clipboard-button source="secret_key">
-                </cd-copy-2-clipboard-button>
-              </span>
+              <button type="button"
+                      class="btn btn-light"
+                      cdPasswordButton="secret_key">
+              </button>
+              <cd-copy-2-clipboard-button source="secret_key">
+              </cd-copy-2-clipboard-button>
             </div>
             <span class="invalid-feedback"
                   *ngIf="formGroup.showError('secret_key', frm, 'required')"
             </div>
             <span class="invalid-feedback"
                   *ngIf="formGroup.showError('secret_key', frm, 'required')"
index 4fb03f019c6c990ec950a078f33652ed7bd46cbe..e04dc4cd551323f7b440f2edabc63071e13c8c05 100644 (file)
@@ -50,7 +50,7 @@
                  i18n>Permission</label>
           <div class="cd-col-form-input">
             <select id="perm"
                  i18n>Permission</label>
           <div class="cd-col-form-input">
             <select id="perm"
-                    class="form-control"
+                    class="form-select"
                     formControlName="perm">
               <option i18n
                       [ngValue]="null">-- Select a permission --</option>
                     formControlName="perm">
               <option i18n
                       [ngValue]="null">-- Select a permission --</option>
                        class="form-control"
                        type="password"
                        formControlName="secret_key">
                        class="form-control"
                        type="password"
                        formControlName="secret_key">
-                <span class="input-group-append">
-                  <button type="button"
-                          class="btn btn-light"
-                          cdPasswordButton="secret_key">
-                  </button>
-                  <cd-copy-2-clipboard-button source="secret_key">
-                  </cd-copy-2-clipboard-button>
-                </span>
+                <button type="button"
+                        class="btn btn-light"
+                        cdPasswordButton="secret_key">
+                </button>
+                <cd-copy-2-clipboard-button source="secret_key">
+                </cd-copy-2-clipboard-button>
               </div>
               <span class="invalid-feedback"
                     *ngIf="formGroup.showError('secret_key', frm, 'required')"
               </div>
               <span class="invalid-feedback"
                     *ngIf="formGroup.showError('secret_key', frm, 'required')"
index 00f3cf0f249dc2e6586616ad17031a00e252bc4c..ee64fc8a15c2f38f5e6271e4cacd9e4c5dde68b6 100644 (file)
                      type="password"
                      [(ngModel)]="secret_key"
                      [readonly]="true">
                      type="password"
                      [(ngModel)]="secret_key"
                      [readonly]="true">
-              <span class="input-group-append">
-                <button type="button"
-                        class="btn btn-light"
-                        cdPasswordButton="secret_key">
-                </button>
-                <cd-copy-2-clipboard-button source="secret_key">
-                </cd-copy-2-clipboard-button>
-              </span>
+              <button type="button"
+                      class="btn btn-light"
+                      cdPasswordButton="secret_key">
+              </button>
+              <cd-copy-2-clipboard-button source="secret_key">
+              </cd-copy-2-clipboard-button>
             </div>
           </div>
         </div>
             </div>
           </div>
         </div>
index 4abcd69796f32d51b3babcff07b7fa90414067a8..7ecaddddfef08f3946443fcbadea8ddaf9e4604f 100644 (file)
@@ -12,6 +12,7 @@ import { PerformanceCounterModule } from '../performance-counter/performance-cou
 import { RgwBucketDetailsComponent } from './rgw-bucket-details/rgw-bucket-details.component';
 import { RgwBucketFormComponent } from './rgw-bucket-form/rgw-bucket-form.component';
 import { RgwBucketListComponent } from './rgw-bucket-list/rgw-bucket-list.component';
 import { RgwBucketDetailsComponent } from './rgw-bucket-details/rgw-bucket-details.component';
 import { RgwBucketFormComponent } from './rgw-bucket-form/rgw-bucket-form.component';
 import { RgwBucketListComponent } from './rgw-bucket-list/rgw-bucket-list.component';
+import { RgwConfigModalComponent } from './rgw-config-modal/rgw-config-modal.component';
 import { RgwDaemonDetailsComponent } from './rgw-daemon-details/rgw-daemon-details.component';
 import { RgwDaemonListComponent } from './rgw-daemon-list/rgw-daemon-list.component';
 import { RgwUserCapabilityModalComponent } from './rgw-user-capability-modal/rgw-user-capability-modal.component';
 import { RgwDaemonDetailsComponent } from './rgw-daemon-details/rgw-daemon-details.component';
 import { RgwDaemonListComponent } from './rgw-daemon-list/rgw-daemon-list.component';
 import { RgwUserCapabilityModalComponent } from './rgw-user-capability-modal/rgw-user-capability-modal.component';
@@ -56,7 +57,8 @@ import { RgwUserSwiftKeyModalComponent } from './rgw-user-swift-key-modal/rgw-us
     RgwUserSwiftKeyModalComponent,
     RgwUserS3KeyModalComponent,
     RgwUserCapabilityModalComponent,
     RgwUserSwiftKeyModalComponent,
     RgwUserS3KeyModalComponent,
     RgwUserCapabilityModalComponent,
-    RgwUserSubuserModalComponent
+    RgwUserSubuserModalComponent,
+    RgwConfigModalComponent
   ]
 })
 export class RgwModule {}
   ]
 })
 export class RgwModule {}
index 66c18df61b316c0cd9b0ba0627ea732916f68ed2..46c825419185d710308717e9d7e9816ebed825ab 100644 (file)
@@ -8,11 +8,40 @@
 
 <ng-template #deviceLocation
              let-value="value">
 
 <ng-template #deviceLocation
              let-value="value">
-  <span *ngFor="let location of value">{{location.dev}}</span>
+  <ng-container *ngFor="let location of value">
+    <cd-label *ngIf="location.host === hostname"
+              [value]="location.dev"></cd-label>
+  </ng-container>
 </ng-template>
 
 </ng-template>
 
+<ng-template #daemonName
+             let-value="value">
+  <ng-container [ngTemplateOutlet]="osdId !== null ? osdIdDaemon : readableDaemons"
+                [ngTemplateOutletContext]="{daemons: value}">
+  </ng-container>
+</ng-template>
+
+<ng-template #osdIdDaemon
+             let-daemons="daemons">
+  <ng-container *ngFor="let daemon of daemons">
+    <cd-label *ngIf="daemon.includes(osdId)"
+              [value]="daemon"></cd-label>
+  </ng-container>
+</ng-template>
+
+<ng-template #readableDaemons
+             let-daemons="daemons">
+  <ng-container *ngFor="let daemon of daemons">
+    <cd-label class="me-1"
+              [value]="daemon"></cd-label>
+  </ng-container>
+</ng-template>
+
+
 <ng-template #lifeExpectancy
              let-value="value">
 <ng-template #lifeExpectancy
              let-value="value">
+  <span *ngIf="!value.life_expectancy_enabled"
+        i18n>{{ "" | notAvailable }}</span>
   <span *ngIf="value.min && !value.max">&gt; {{value.min | i18nPlural: translationMapping}}</span>
   <span *ngIf="value.max && !value.min">&lt; {{value.max | i18nPlural: translationMapping}}</span>
   <span *ngIf="value.max && value.min">{{value.min}} to {{value.max | i18nPlural: translationMapping}}</span>
   <span *ngIf="value.min && !value.max">&gt; {{value.min | i18nPlural: translationMapping}}</span>
   <span *ngIf="value.max && !value.min">&lt; {{value.max | i18nPlural: translationMapping}}</span>
   <span *ngIf="value.max && value.min">{{value.min}} to {{value.max | i18nPlural: translationMapping}}</span>
index 5503d1319eb597f728155583743b595930177d25..509b869d7153c162c3ec1695acb7c02e88823b36 100644 (file)
@@ -18,8 +18,13 @@ export class DeviceListComponent implements OnChanges, OnInit {
   @Input()
   osdId: number = null;
 
   @Input()
   osdId: number = null;
 
+  @Input()
+  osdList = false;
+
   @ViewChild('deviceLocation', { static: true })
   locationTemplate: TemplateRef<any>;
   @ViewChild('deviceLocation', { static: true })
   locationTemplate: TemplateRef<any>;
+  @ViewChild('daemonName', { static: true })
+  daemonNameTemplate: TemplateRef<any>;
   @ViewChild('lifeExpectancy', { static: true })
   lifeExpectancyTemplate: TemplateRef<any>;
   @ViewChild('lifeExpectancyTimestamp', { static: true })
   @ViewChild('lifeExpectancy', { static: true })
   lifeExpectancyTemplate: TemplateRef<any>;
   @ViewChild('lifeExpectancyTimestamp', { static: true })
@@ -69,16 +74,16 @@ export class DeviceListComponent implements OnChanges, OnInit {
         isHidden: true
       },
       { prop: 'location', name: $localize`Device Name`, cellTemplate: this.locationTemplate },
         isHidden: true
       },
       { prop: 'location', name: $localize`Device Name`, cellTemplate: this.locationTemplate },
-      { prop: 'readableDaemons', name: $localize`Daemons` }
+      { prop: 'daemons', name: $localize`Daemons`, cellTemplate: this.daemonNameTemplate }
     ];
   }
 
   ngOnChanges() {
     const updateDevicesFn = (devices: CdDevice[]) => (this.devices = devices);
     ];
   }
 
   ngOnChanges() {
     const updateDevicesFn = (devices: CdDevice[]) => (this.devices = devices);
-    if (this.hostname) {
-      this.hostService.getDevices(this.hostname).subscribe(updateDevicesFn);
-    } else if (this.osdId !== null) {
+    if (this.osdList && this.osdId !== null) {
       this.osdService.getDevices(this.osdId).subscribe(updateDevicesFn);
       this.osdService.getDevices(this.osdId).subscribe(updateDevicesFn);
+    } else if (this.hostname) {
+      this.hostService.getDevices(this.hostname).subscribe(updateDevicesFn);
     }
   }
 }
     }
   }
 }
index 72e2919814b2ac3412d25566748d8b5a12a88279..88ef32507a452324da969d2d4d318146fd83374c 100644 (file)
@@ -12,7 +12,7 @@
                         i18n>Feedback module is not enabled. Please enable it from <a (click)="redirect()">Cluster-> Manager Modules.</a>
         </cd-alert-panel>
         <!-- api_key -->
                         i18n>Feedback module is not enabled. Please enable it from <a (click)="redirect()">Cluster-> Manager Modules.</a>
         </cd-alert-panel>
         <!-- api_key -->
-        <div class="form-group row"
+        <div class="form-group row mt-3"
              *ngIf="!isAPIKeySet">
           <label class="cd-col-form-label required"
                  for="api_key"
              *ngIf="!isAPIKeySet">
           <label class="cd-col-form-label required"
                  for="api_key"
index 805d7558e3df7eed48fa9b1d2e631ea513180280..909f3e7ed6deb335e377ec6da3016e2a726d7ac3 100644 (file)
                     i18n>No SMART data available.</cd-alert-panel>
 
     <ng-container *ngIf="!(data | pipeFunction:isEmpty)">
                     i18n>No SMART data available.</cd-alert-panel>
 
     <ng-container *ngIf="!(data | pipeFunction:isEmpty)">
-      <ul ngbNav
-          #nav="ngbNav"
-          class="nav-tabs">
-        <li ngbNavItem
-            *ngFor="let device of data | keyvalue">
+      <nav ngbNav
+           #nav="ngbNav"
+           class="nav-tabs">
+        <ng-container ngbNavItem
+                      *ngFor="let device of data | keyvalue">
           <a ngbNavLink>{{ device.value.device }} ({{ device.value.identifier }})</a>
           <ng-template ngbNavContent>
             <ng-container *ngIf="device.value.error; else noError">
           <a ngbNavLink>{{ device.value.device }} ({{ device.value.identifier }})</a>
           <ng-template ngbNavContent>
             <ng-container *ngIf="device.value.error; else noError">
@@ -55,9 +55,9 @@
             </ng-template>
 
             <ng-container *ngIf="!(device.value.info | pipeFunction:isEmpty) || !(device.value.smart | pipeFunction:isEmpty)">
             </ng-template>
 
             <ng-container *ngIf="!(device.value.info | pipeFunction:isEmpty) || !(device.value.smart | pipeFunction:isEmpty)">
-              <ul ngbNav
-                  #innerNav="ngbNav"
-                  class="nav-tabs">
+              <nav ngbNav
+                   #innerNav="ngbNav"
+                   class="nav-tabs">
                 <li [ngbNavItem]="1">
                   <a ngbNavLink
                      i18n>Device Information</a>
                 <li [ngbNavItem]="1">
                   <a ngbNavLink
                      i18n>Device Information</a>
                                     i18n>No SMART data available for this device.</cd-alert-panel>
                   </ng-template>
                 </li>
                                     i18n>No SMART data available for this device.</cd-alert-panel>
                   </ng-template>
                 </li>
-              </ul>
+              </nav>
 
               <div [ngbNavOutlet]="innerNav"></div>
             </ng-container>
           </ng-template>
 
               <div [ngbNavOutlet]="innerNav"></div>
             </ng-container>
           </ng-template>
-        </li>
-      </ul>
+        </ng-container>
+      </nav>
 
       <div [ngbNavOutlet]="nav"></div>
     </ng-container>
 
       <div [ngbNavOutlet]="nav"></div>
     </ng-container>
index 2dc30df52e613dfaae7a951ca3a4b446c3526af2..4974611413728fadf9c0e76429afc737055703f6 100755 (executable)
                formControlName="oldpassword"
                autocomplete="new-password"
                autofocus>
                formControlName="oldpassword"
                autocomplete="new-password"
                autofocus>
-        <span class="input-group-append">
-          <button class="btn btn-outline-light btn-password"
-                  cdPasswordButton="oldpassword">
-          </button>
-        </span>
+        <button class="btn btn-outline-light btn-password"
+                cdPasswordButton="oldpassword">
+        </button>
       </div>
       <span class="invalid-feedback"
             *ngIf="userForm.showError('oldpassword', frm, 'required')"
       </div>
       <span class="invalid-feedback"
             *ngIf="userForm.showError('oldpassword', frm, 'required')"
                id="newpassword"
                autocomplete="new-password"
                formControlName="newpassword">
                id="newpassword"
                autocomplete="new-password"
                formControlName="newpassword">
-        <span class="input-group-append">
-          <button type="button"
-                  class="btn btn-outline-light btn-password"
-                  cdPasswordButton="newpassword">
-          </button>
-        </span>
+        <button type="button"
+                class="btn btn-outline-light btn-password"
+                cdPasswordButton="newpassword">
+        </button>
       </div>
       <div class="password-strength-level">
         <div class="{{ passwordStrengthLevelClass }}"
       </div>
       <div class="password-strength-level">
         <div class="{{ passwordStrengthLevelClass }}"
                placeholder="Confirm new password..."
                id="confirmnewpassword"
                formControlName="confirmnewpassword">
                placeholder="Confirm new password..."
                id="confirmnewpassword"
                formControlName="confirmnewpassword">
-        <span class="input-group-append">
-          <button class="btn btn-outline-light btn-password"
-                  cdPasswordButton="confirmnewpassword">
-          </button>
-        </span>
+        <button class="btn btn-outline-light btn-password"
+                cdPasswordButton="confirmnewpassword">
+        </button>
       </div>
       <span class="invalid-feedback"
             *ngIf="userForm.showError('confirmnewpassword', frm, 'required')"
       </div>
       <span class="invalid-feedback"
             *ngIf="userForm.showError('confirmnewpassword', frm, 'required')"
index 8565c3615c6bab9dc23ee1642c78214eeb258afe..0fafe12f8274973b7ab90bd2e0402ccfcba31407 100644 (file)
@@ -1,5 +1,6 @@
 <div class="container"
      *ngIf="isLoginActive">
 <div class="container"
      *ngIf="isLoginActive">
+  <h1 class="sr-only">Ceph login</h1>
   <form name="loginForm"
         (ngSubmit)="login()"
         #loginForm="ngForm"
   <form name="loginForm"
         (ngSubmit)="login()"
         #loginForm="ngForm"
@@ -7,7 +8,7 @@
 
     <!-- Username -->
     <div class="form-group has-feedback d-flex flex-column py-3">
 
     <!-- Username -->
     <div class="form-group has-feedback d-flex flex-column py-3">
-      <label class="placeholder pl-4"
+      <label class="placeholder ps-3"
              for="username"
              i18n>Username</label>
       <input id="username"
              for="username"
              i18n>Username</label>
       <input id="username"
              type="text"
              [attr.aria-invalid]="username.invalid"
              aria-labelledby="username"
              type="text"
              [attr.aria-invalid]="username.invalid"
              aria-labelledby="username"
-             class="form-control pl-4"
+             class="form-control ps-3"
              required
              autofocus>
              required
              autofocus>
-      <div class="invalid-feedback pl-4"
+      <div class="invalid-feedback ps-3"
            *ngIf="(loginForm.submitted || username.dirty) && username.invalid"
            i18n>Username is required</div>
     </div>
            *ngIf="(loginForm.submitted || username.dirty) && username.invalid"
            i18n>Username is required</div>
     </div>
@@ -30,7 +31,7 @@
          id="password-div">
       <div class="input-group d-flex flex-nowrap">
         <div class="d-flex flex-column flex-grow-1 py-3">
          id="password-div">
       <div class="input-group d-flex flex-nowrap">
         <div class="d-flex flex-column flex-grow-1 py-3">
-          <label class="placeholder pl-4"
+          <label class="placeholder ps-3"
                  for="password"
                  i18n>Password</label>
           <input id="password"
                  for="password"
                  i18n>Password</label>
           <input id="password"
                  type="password"
                  [attr.aria-invalid]="password.invalid"
                  aria-labelledby="password"
                  type="password"
                  [attr.aria-invalid]="password.invalid"
                  aria-labelledby="password"
-                 class="form-control pl-4"
+                 class="form-control ps-3"
                  required>
                  required>
-          <div class="invalid-feedback pl-4"
+          <div class="invalid-feedback ps-3"
                *ngIf="(loginForm.submitted || password.dirty) && password.invalid"
                i18n>Password is required</div>
         </div>
         <span class="form-group-append">
           <button type="button"
                   class="btn btn-outline-light btn-password h-100 px-4"
                *ngIf="(loginForm.submitted || password.dirty) && password.invalid"
                i18n>Password is required</div>
         </div>
         <span class="form-group-append">
           <button type="button"
                   class="btn btn-outline-light btn-password h-100 px-4"
-                  cdPasswordButton="password">
+                  cdPasswordButton="password"
+                  aria-label="toggle-password">
           </button>
         </span>
       </div>
           </button>
         </span>
       </div>
index 0fdc3c6ba3275c5d917bc9ae46b0f7ca142ae15a..ce8b21cbc7686bbba02f498fafe543c5cedf247b 100644 (file)
@@ -28,7 +28,7 @@ $dark-secondary: darken(vv.$secondary, 4%);
   }
 
   .placeholder {
   }
 
   .placeholder {
-    color: vv.$gray-600;
+    color: vv.$gray-500;
   }
 
   .btn-password:focus {
   }
 
   .btn-password:focus {
index df97face81a3f215f2f02669375975ef2ab6668f..ddb0e6ab8aeb6bb1f22b3eae43283a98c71ab19b 100644 (file)
                      name="password"
                      autocomplete="new-password"
                      formControlName="password">
                      name="password"
                      autocomplete="new-password"
                      formControlName="password">
-              <span class="input-group-append">
-                <button type="button"
-                        class="btn btn-light"
-                        cdPasswordButton="password">
-                </button>
-              </span>
+              <button type="button"
+                      class="btn btn-light"
+                      cdPasswordButton="password">
+              </button>
             </div>
             <div class="password-strength-level">
               <div class="{{ passwordStrengthLevelClass }}"
             </div>
             <div class="password-strength-level">
               <div class="{{ passwordStrengthLevelClass }}"
                      name="confirmpassword"
                      autocomplete="new-password"
                      formControlName="confirmpassword">
                      name="confirmpassword"
                      autocomplete="new-password"
                      formControlName="confirmpassword">
-              <span class="input-group-append">
-                <button type="button"
-                        class="btn btn-light"
-                        cdPasswordButton="confirmpassword">
-                </button>
-              </span>
+              <button type="button"
+                      class="btn btn-light"
+                      cdPasswordButton="confirmpassword">
+              </button>
               <span class="invalid-feedback"
                     *ngIf="userForm.showError('confirmpassword', formDir, 'match')"
                     i18n>Password confirmation doesn't match the password.</span>
               <span class="invalid-feedback"
                     *ngIf="userForm.showError('confirmpassword', formDir, 'match')"
                     i18n>Password confirmation doesn't match the password.</span>
                      #p="ngbPopover"
                      (click)="p.open()"
                      (keypress)="p.close()">
                      #p="ngbPopover"
                      (click)="p.open()"
                      (keypress)="p.close()">
-              <span class="input-group-append">
-                <button type="button"
-                        class="btn btn-light"
-                        (click)="clearExpirationDate()">
-                  <i class="icon-prepend {{ icons.destroy }}"></i>
-                </button>
-              </span>
+              <button type="button"
+                      class="btn btn-light"
+                      (click)="clearExpirationDate()">
+                <i class="icon-prepend {{ icons.destroy }}"></i>
+              </button>
               <span class="invalid-feedback"
                     *ngIf="userForm.showError('pwdExpirationDate', formDir, 'required')"
                     i18n>This field is required.</span>
               <span class="invalid-feedback"
                     *ngIf="userForm.showError('pwdExpirationDate', formDir, 'required')"
                     i18n>This field is required.</span>
index 83eb409446e0c11f6a8b8fce58cd5556f74580b7..e09907aeb85d81865799953b8aae112e217d3a58 100644 (file)
                      formControlName="oldpassword"
                      autocomplete="new-password"
                      autofocus>
                      formControlName="oldpassword"
                      autocomplete="new-password"
                      autofocus>
-              <span class="input-group-append">
-                <button class="btn btn-light"
-                        cdPasswordButton="oldpassword">
-                </button>
-              </span>
+              <button class="btn btn-light"
+                      cdPasswordButton="oldpassword">
+              </button>
             </div>
             <span class="invalid-feedback"
                   *ngIf="userForm.showError('oldpassword', frm, 'required')"
             </div>
             <span class="invalid-feedback"
                   *ngIf="userForm.showError('oldpassword', frm, 'required')"
                      id="newpassword"
                      autocomplete="new-password"
                      formControlName="newpassword">
                      id="newpassword"
                      autocomplete="new-password"
                      formControlName="newpassword">
-              <span class="input-group-append">
-                <button type="button"
-                        class="btn btn-light"
-                        cdPasswordButton="newpassword">
-                </button>
-              </span>
+              <button type="button"
+                      class="btn btn-light"
+                      cdPasswordButton="newpassword">
+              </button>
             </div>
             <div class="password-strength-level">
               <div class="{{ passwordStrengthLevelClass }}"
             </div>
             <div class="password-strength-level">
               <div class="{{ passwordStrengthLevelClass }}"
                      placeholder="Confirm new password..."
                      id="confirmnewpassword"
                      formControlName="confirmnewpassword">
                      placeholder="Confirm new password..."
                      id="confirmnewpassword"
                      formControlName="confirmnewpassword">
-              <span class="input-group-append">
-                <button class="btn btn-light"
-                        cdPasswordButton="confirmnewpassword">
-                </button>
-              </span>
+              <button class="btn btn-light"
+                      cdPasswordButton="confirmnewpassword">
+              </button>
             </div>
             <span class="invalid-feedback"
                   *ngIf="userForm.showError('confirmnewpassword', frm, 'required')"
             </div>
             <span class="invalid-feedback"
                   *ngIf="userForm.showError('confirmnewpassword', frm, 'required')"
index 3c102cf6676c0a922e5435956cab53566801679c..1ab4e1743b39d67235ffe3f7458a32a794841c0d 100644 (file)
@@ -1,14 +1,18 @@
-<ul ngbNav
-    #nav="ngbNav"
-    [activeId]="router.url"
-    (navChange)="router.navigate([$event.nextId])"
-    class="nav-tabs">
-  <li ngbNavItem="/user-management/users">
-    <a ngbNavLink
+<ul class="nav nav-tabs">
+  <li class="nav-item">
+    <a class="nav-link"
+       routerLink="/user-management/users"
+       routerLinkActive="active"
+       ariaCurrentWhenActive="page"
+       [routerLinkActiveOptions]="{exact: true}"
        i18n>Users</a>
   </li>
        i18n>Users</a>
   </li>
-  <li ngbNavItem="/user-management/roles">
-    <a ngbNavLink
+  <li class="nav-item">
+    <a class="nav-link"
+       routerLink="/user-management/roles"
+       routerLinkActive="active"
+       ariaCurrentWhenActive="page"
+       [routerLinkActiveOptions]="{exact: true}"
        i18n>Roles</a>
   </li>
 </ul>
        i18n>Roles</a>
   </li>
 </ul>
index 63af29e13592891a365b9ceace0b6a2d00e76be0..f04a96b88cfdb62e188dc5616ce4419fec487858 100644 (file)
@@ -1,11 +1,11 @@
 <ng-container *ngIf="{ ftMap: featureToggleMap$ | async, daemons: rgwDaemonService.daemons$ | async, selectedDaemon: rgwDaemonService.selectedDaemon$ | async } as data">
   <ng-container *ngIf="data.ftMap && data.ftMap.rgw && permissions.rgw.read && isRgwRoute && data.daemons.length > 1">
     <div class="cd-context-bar pt-3 pb-3">
 <ng-container *ngIf="{ ftMap: featureToggleMap$ | async, daemons: rgwDaemonService.daemons$ | async, selectedDaemon: rgwDaemonService.selectedDaemon$ | async } as data">
   <ng-container *ngIf="data.ftMap && data.ftMap.rgw && permissions.rgw.read && isRgwRoute && data.daemons.length > 1">
     <div class="cd-context-bar pt-3 pb-3">
-      <span class="mr-1"
+      <span class="me-1"
             i18n>Selected Object Gateway:</span>
       <div ngbDropdown
            placement="bottom-left"
             i18n>Selected Object Gateway:</span>
       <div ngbDropdown
            placement="bottom-left"
-           class="d-inline-block ml-2">
+           class="d-inline-block ms-2">
         <button ngbDropdownToggle
                 class="btn btn-outline-info ctx-bar-selected-rgw-daemon"
                 i18n-title
         <button ngbDropdownToggle
                 class="btn btn-outline-info ctx-bar-selected-rgw-daemon"
                 i18n-title
index d5c9f73ec52f828d5952ba12caf40fa34417721b..aa272ffae55a785245fbe594809e12ed782a4bb5 100644 (file)
@@ -32,7 +32,7 @@
 
   .list-inline {
     margin-bottom: 0;
 
   .list-inline {
     margin-bottom: 0;
-    margin-left: 20%;
+    margin-left: 17%;
   }
 
   a {
   }
 
   a {
index fdf4d95cfdd1e62cc69ddd5d19946cc68c49da24..80445be57e3673ad8682054888638616471f01db 100644 (file)
@@ -1,10 +1,9 @@
 <div class="about-container">
   <div class="modal-header">
     <button type="button"
 <div class="about-container">
   <div class="modal-header">
     <button type="button"
-            class="close float-right"
+            class="btn-close float-end"
             aria-label="Close"
             (click)="activeModal.close()">
             aria-label="Close"
             (click)="activeModal.close()">
-      <span aria-hidden="true">&times;</span>
     </button>
   </div>
   <div class="modal-body">
     </button>
   </div>
   <div class="modal-body">
index fa4b38d167a5928073b73e61d0aa801541720186..eda1e83be546da1f71876a97ba935f039ababacb 100644 (file)
@@ -4,7 +4,8 @@
   <a ngbDropdownToggle
      class="dropdown-toggle"
      i18n-title
   <a ngbDropdownToggle
      class="dropdown-toggle"
      i18n-title
-     title="Dashboard Settings">
+     title="Dashboard Settings"
+     role="button">
     <i [ngClass]="[icons.deepCheck]"></i>
     <span i18n
           class="d-md-none">Dashboard Settings</span>
     <i [ngClass]="[icons.deepCheck]"></i>
     <span i18n
           class="d-md-none">Dashboard Settings</span>
index ed5ad8f1535a7005b8159dbc0684d9fae432f38d..d7f7d137768c4dc2c0a85fa02c8a8644042f772f 100644 (file)
@@ -2,22 +2,23 @@
      placement="bottom-right">
   <a ngbDropdownToggle
      i18n-title
      placement="bottom-right">
   <a ngbDropdownToggle
      i18n-title
-     title="Help">
+     title="Help"
+     role="button">
     <i [ngClass]="[icons.questionCircle]"></i>
     <span i18n
           class="d-md-none">Help</span>
   </a>
   <div ngbDropdownMenu>
     <a ngbDropdownItem
     <i [ngClass]="[icons.questionCircle]"></i>
     <span i18n
           class="d-md-none">Help</span>
   </a>
   <div ngbDropdownMenu>
     <a ngbDropdownItem
-       [ngClass]="{'disabled': !docsUrl}"
        class="text-capitalize"
        class="text-capitalize"
+       [ngClass]="{'disabled': !docsUrl}"
        href="{{ docsUrl }}"
        target="_blank"
        i18n>documentation</a>
        href="{{ docsUrl }}"
        target="_blank"
        i18n>documentation</a>
-    <a ngbDropdownItem
-       routerLink="/api-docs"
-       target="_blank"
-       i18n>API</a>
+    <button ngbDropdownItem
+            routerLink="/api-docs"
+            target="_blank"
+            i18n>API</button>
     <button ngbDropdownItem
             (click)="openAboutModal()"
             i18n>About</button>
     <button ngbDropdownItem
             (click)="openAboutModal()"
             i18n>About</button>
index bf0f22fbb4a1970bf28fcdbd2a3ca15c03f79885..61e0e0527fe637b57d59fb844f4acb4e60b0fef4 100644 (file)
@@ -2,7 +2,8 @@
      placement="bottom-right">
   <a ngbDropdownToggle
      i18n-title
      placement="bottom-right">
   <a ngbDropdownToggle
      i18n-title
-     title="Logged in user">
+     title="Logged in user"
+     role="button">
     <i [ngClass]="[icons.user]"></i>
     <span i18n
           class="d-md-none">Logged in user</span>
     <i [ngClass]="[icons.user]"></i>
     <span i18n
           class="d-md-none">Logged in user</span>
@@ -11,7 +12,7 @@
     <button ngbDropdownItem
             disabled
             i18n>Signed in as <strong>{{ username }}</strong></button>
     <button ngbDropdownItem
             disabled
             i18n>Signed in as <strong>{{ username }}</strong></button>
-    <li class="dropdown-divider"></li>
+    <hr class="dropdown-divider" />
     <button ngbDropdownItem
             *ngIf="!sso"
             routerLink="/user-profile/edit">
     <button ngbDropdownItem
             *ngIf="!sso"
             routerLink="/user-profile/edit">
index 39bcb5b6a0dc312fa873b21c6d0e3db9d808b265..aa9b70cc49b2c69ed396c1e7bf10f3ab6ad76558 100644 (file)
@@ -5,14 +5,14 @@
   <cd-notifications-sidebar></cd-notifications-sidebar>
   <div class="cd-navbar-top">
     <nav class="navbar navbar-expand-md navbar-dark cd-navbar-brand">
   <cd-notifications-sidebar></cd-notifications-sidebar>
   <div class="cd-navbar-top">
     <nav class="navbar navbar-expand-md navbar-dark cd-navbar-brand">
-      <button class="btn btn-link py-0"
+      <button class="btn btn-link py-0 ms-3"
               (click)="showMenuSidebar = !showMenuSidebar"
               aria-label="toggle sidebar visibility">
         <i class="fa fa-bars fa-2x"
            aria-hidden="true"></i>
       </button>
 
               (click)="showMenuSidebar = !showMenuSidebar"
               aria-label="toggle sidebar visibility">
         <i class="fa fa-bars fa-2x"
            aria-hidden="true"></i>
       </button>
 
-      <a class="navbar-brand ml-2"
+      <a class="navbar-brand ms-2"
          href="#">
         <img src="assets/Ceph_Ceph_Logo_with_text_white.svg"
              alt="Ceph" />
          href="#">
         <img src="assets/Ceph_Ceph_Logo_with_text_white.svg"
              alt="Ceph" />
           permissions.log.read || permissions.prometheus.read">
         <a (click)="toggleSubMenu('cluster')"
            class="nav-link dropdown-toggle"
           permissions.log.read || permissions.prometheus.read">
         <a (click)="toggleSubMenu('cluster')"
            class="nav-link dropdown-toggle"
-           [attr.aria-expanded]="displayedSubMenu == 'cluster'"
-           aria-controls="collapseBasic">
+           [attr.aria-expanded]="displayedSubMenu === 'cluster'"
+           aria-controls="cluster-nav"
+           role="button">
           <ng-container i18n>Cluster</ng-container>
         </a>
         <ul class="list-unstyled"
           <ng-container i18n>Cluster</ng-container>
         </a>
         <ul class="list-unstyled"
+            id="cluster-nav"
             [ngbCollapse]="displayedSubMenu !== 'cluster'">
           <li routerLinkActive="active"
               class="tc_submenuitem tc_submenuitem_hosts"
             [ngbCollapse]="displayedSubMenu !== 'cluster'">
           <li routerLinkActive="active"
               class="tc_submenuitem tc_submenuitem_hosts"
             <a routerLink="/monitoring">
               <ng-container i18n>Monitoring</ng-container>
               <small *ngIf="prometheusAlertService.activeCriticalAlerts > 0"
             <a routerLink="/monitoring">
               <ng-container i18n>Monitoring</ng-container>
               <small *ngIf="prometheusAlertService.activeCriticalAlerts > 0"
-                     class="badge badge-danger ml-1">{{ prometheusAlertService.activeCriticalAlerts }}</small>
+                     class="badge badge-danger ms-1">{{ prometheusAlertService.activeCriticalAlerts }}</small>
               <small *ngIf="prometheusAlertService.activeWarningAlerts > 0"
               <small *ngIf="prometheusAlertService.activeWarningAlerts > 0"
-                     class="badge badge-warning ml-1">{{ prometheusAlertService.activeWarningAlerts }}</small>
+                     class="badge badge-warning ms-1">{{ prometheusAlertService.activeWarningAlerts }}</small>
             </a>
           </li>
         </ul>
             </a>
           </li>
         </ul>
           (enabledFeature.rbd || enabledFeature.mirroring || enabledFeature.iscsi)">
         <a class="nav-link dropdown-toggle"
            (click)="toggleSubMenu('block')"
           (enabledFeature.rbd || enabledFeature.mirroring || enabledFeature.iscsi)">
         <a class="nav-link dropdown-toggle"
            (click)="toggleSubMenu('block')"
-           [attr.aria-expanded]="displayedSubMenu == 'block'"
-           aria-controls="collapseBasic"
+           [attr.aria-expanded]="displayedSubMenu === 'block'"
+           aria-controls="block-nav"
+           role="button"
            [ngStyle]="blockHealthColor()">
           <ng-container i18n>Block</ng-container>
         </a>
 
         <ul class="list-unstyled"
            [ngStyle]="blockHealthColor()">
           <ng-container i18n>Block</ng-container>
         </a>
 
         <ul class="list-unstyled"
+            id="block-nav"
             [ngbCollapse]="displayedSubMenu !== 'block'">
           <li routerLinkActive="active"
               class="tc_submenuitem tc_submenuitem_block_images"
             [ngbCollapse]="displayedSubMenu !== 'block'">
           <li routerLinkActive="active"
               class="tc_submenuitem tc_submenuitem_block_images"
           *ngIf="permissions.rgw.read && enabledFeature.rgw">
         <a class="nav-link dropdown-toggle"
            (click)="toggleSubMenu('rgw')"
           *ngIf="permissions.rgw.read && enabledFeature.rgw">
         <a class="nav-link dropdown-toggle"
            (click)="toggleSubMenu('rgw')"
-           [attr.aria-expanded]="displayedSubMenu == 'rgw'"
-           aria-controls="collapseBasic">
+           [attr.aria-expanded]="displayedSubMenu === 'rgw'"
+           aria-controls="gateway-nav"
+           role="button">
           <ng-container i18n>Object Gateway</ng-container>
         </a>
         <ul class="list-unstyled"
           <ng-container i18n>Object Gateway</ng-container>
         </a>
         <ul class="list-unstyled"
+            id="gateway-nav"
             [ngbCollapse]="displayedSubMenu !== 'rgw'">
           <li routerLinkActive="active"
               class="tc_submenuitem tc_submenuitem_rgw_daemons">
             [ngbCollapse]="displayedSubMenu !== 'rgw'">
           <li routerLinkActive="active"
               class="tc_submenuitem tc_submenuitem_rgw_daemons">
index f0ce4cd92def728178da00db72fbf50746a70cb5..fc12d8f49a8e7bf6e030a24337a0da391cee9e62 100644 (file)
@@ -152,7 +152,7 @@ $sidebar-width: 200px;
 .cd-navbar-primary > .active > a:hover {
   background-color: vv.$primary !important;
   border: 0 !important;
 .cd-navbar-primary > .active > a:hover {
   background-color: vv.$primary !important;
   border: 0 !important;
-  color: vv.$gray-200 !important;
+  color: vv.$white !important;
 }
 
 .wrapper {
 }
 
 .wrapper {
@@ -190,7 +190,7 @@ $sidebar-width: 200px;
       li a {
         color: vv.$white;
         display: block;
       li a {
         color: vv.$white;
         display: block;
-        font-size: 1.1em;
+        font-size: 1.3em;
         padding: 10px;
         padding-left: 27px;
 
         padding: 10px;
         padding-left: 27px;
 
@@ -221,6 +221,7 @@ $sidebar-width: 200px;
       content: '\f054';
       font-family: 'ForkAwesome';
       font-size: 1rem;
       content: '\f054';
       font-family: 'ForkAwesome';
       font-size: 1rem;
+      margin-top: 2px;
       position: absolute;
       right: 20px;
       transition: transform 0.3s ease-in-out;
       position: absolute;
       right: 20px;
       transition: transform 0.3s ease-in-out;
@@ -233,7 +234,7 @@ $sidebar-width: 200px;
 
   ul ul a {
     background: lighten(vv.$secondary, 10);
 
   ul ul a {
     background: lighten(vv.$secondary, 10);
-    font-size: 0.9em !important;
+    font-size: 1.1em !important;
     padding-left: 40px !important;
   }
 
     padding-left: 40px !important;
   }
 
index 241910f2b4152294400b4504358e9e08ef538f81..2dbce116315f2e61f7d82c12978f82609193ac7c 100644 (file)
@@ -1,8 +1,10 @@
 import { HttpClientTestingModule } from '@angular/common/http/testing';
 import { ComponentFixture, TestBed } from '@angular/core/testing';
 import { By } from '@angular/platform-browser';
 import { HttpClientTestingModule } from '@angular/common/http/testing';
 import { ComponentFixture, TestBed } from '@angular/core/testing';
 import { By } from '@angular/platform-browser';
+import { RouterTestingModule } from '@angular/router/testing';
 
 
-import { MockModule } from 'ng-mocks';
+import { ToastrModule } from 'ngx-toastr';
+import { SimplebarAngularModule } from 'simplebar-angular';
 import { of } from 'rxjs';
 
 import { Permission, Permissions } from '~/app/shared/models/permissions';
 import { of } from 'rxjs';
 
 import { Permission, Permissions } from '~/app/shared/models/permissions';
@@ -14,9 +16,14 @@ import {
 } from '~/app/shared/services/feature-toggles.service';
 import { PrometheusAlertService } from '~/app/shared/services/prometheus-alert.service';
 import { SummaryService } from '~/app/shared/services/summary.service';
 } from '~/app/shared/services/feature-toggles.service';
 import { PrometheusAlertService } from '~/app/shared/services/prometheus-alert.service';
 import { SummaryService } from '~/app/shared/services/summary.service';
+import { SharedModule } from '~/app/shared/shared.module';
 import { configureTestBed } from '~/testing/unit-test-helper';
 import { configureTestBed } from '~/testing/unit-test-helper';
-import { NavigationModule } from '../navigation.module';
 import { NavigationComponent } from './navigation.component';
 import { NavigationComponent } from './navigation.component';
+import { NotificationsComponent } from '../notifications/notifications.component';
+import { AdministrationComponent } from '../administration/administration.component';
+import { IdentityComponent } from '../identity/identity.component';
+import { NgbModule } from '@ng-bootstrap/ng-bootstrap';
+import { DashboardHelpComponent } from '../dashboard-help/dashboard-help.component';
 
 function everythingPermittedExcept(disabledPermissions: string[] = []): any {
   const permissions: Permissions = new Permissions({});
 
 function everythingPermittedExcept(disabledPermissions: string[] = []): any {
   const permissions: Permissions = new Permissions({});
@@ -51,26 +58,43 @@ describe('NavigationComponent', () => {
   let fixture: ComponentFixture<NavigationComponent>;
 
   configureTestBed({
   let fixture: ComponentFixture<NavigationComponent>;
 
   configureTestBed({
-    declarations: [NavigationComponent],
-    imports: [HttpClientTestingModule, MockModule(NavigationModule)],
-    providers: [
-      {
-        provide: AuthStorageService,
-        useValue: {
-          getPermissions: jest.fn(),
-          isPwdDisplayed$: { subscribe: jest.fn() },
-          telemetryNotification$: { subscribe: jest.fn() }
-        }
-      },
-      { provide: SummaryService, useValue: { subscribe: jest.fn() } },
-      { provide: FeatureTogglesService, useValue: { get: jest.fn() } },
-      { provide: PrometheusAlertService, useValue: { alerts: [] } }
-    ]
+    declarations: [
+      NavigationComponent,
+      NotificationsComponent,
+      AdministrationComponent,
+      DashboardHelpComponent,
+      IdentityComponent
+    ],
+    imports: [
+      HttpClientTestingModule,
+      SharedModule,
+      ToastrModule.forRoot(),
+      RouterTestingModule,
+      SimplebarAngularModule,
+      NgbModule
+    ],
+    providers: [AuthStorageService, SummaryService, FeatureTogglesService, PrometheusAlertService]
   });
 
   beforeEach(() => {
   });
 
   beforeEach(() => {
+    spyOn(TestBed.inject(AuthStorageService), 'getPermissions').and.callFake(() =>
+      everythingPermittedExcept()
+    );
+
+    spyOn(TestBed.inject(FeatureTogglesService), 'get').and.callFake(() =>
+      of(everythingEnabledExcept())
+    );
+    spyOn(TestBed.inject(SummaryService), 'subscribe').and.callFake(() =>
+      of({ health: { status: 'HEALTH_OK' } })
+    );
+    spyOn(TestBed.inject(PrometheusAlertService), 'getAlerts').and.callFake(() => of([]));
     fixture = TestBed.createComponent(NavigationComponent);
     component = fixture.componentInstance;
     fixture = TestBed.createComponent(NavigationComponent);
     component = fixture.componentInstance;
+    fixture.detectChanges();
+  });
+
+  afterEach(() => {
+    fixture.destroy();
   });
 
   describe('Test Permissions', () => {
   });
 
   describe('Test Permissions', () => {
index 512feecef9d659e0777ecf36021a6501d927c800..a7cc40f5a8235a0648b183f866c948e5d3796929 100644 (file)
@@ -87,7 +87,7 @@ export class NavigationComponent implements OnInit, OnDestroy {
   blockHealthColor() {
     if (this.summaryData && this.summaryData.rbd_mirroring) {
       if (this.summaryData.rbd_mirroring.errors > 0) {
   blockHealthColor() {
     if (this.summaryData && this.summaryData.rbd_mirroring) {
       if (this.summaryData.rbd_mirroring.errors > 0) {
-        return { color: '#d9534f' };
+        return { color: '#f4926c' };
       } else if (this.summaryData.rbd_mirroring.warnings > 0) {
         return { color: '#f0ad4e' };
       }
       } else if (this.summaryData.rbd_mirroring.warnings > 0) {
         return { color: '#f0ad4e' };
       }
index 5729f7625991bcd1c43152f13717bca2076da262..8bee3d8ff4e40aac63a5e84d2f2ee525867af1e3 100644 (file)
@@ -10,7 +10,7 @@
 
 a {
   .dot {
 
 a {
   .dot {
-    background-color: vv.$primary;
+    background-color: vv.$primary-500;
     border: 2px solid vv.$secondary;
     border-radius: 50%;
     height: 11px;
     border: 2px solid vv.$secondary;
     border-radius: 50%;
     height: 11px;
@@ -22,6 +22,6 @@ a {
 
   &:hover .dot {
     background-color: vv.$white;
 
   &:hover .dot {
     background-color: vv.$white;
-    border-color: vv.$primary;
+    border-color: vv.$primary-500;
   }
 }
   }
 }
index c62dfea7c0155b71fcae79c5d4a424d62f4e4e8a..4c7e4cab370f7a5e9f163bf9cbc5a81888044722 100644 (file)
@@ -3,22 +3,33 @@ import { Injectable } from '@angular/core';
 
 import { Observable } from 'rxjs';
 
 
 import { Observable } from 'rxjs';
 
+import { ApiClient } from '~/app/shared/api/api-client';
 import { Daemon } from '../models/daemon.interface';
 import { CephServiceSpec } from '../models/service.interface';
 import { Daemon } from '../models/daemon.interface';
 import { CephServiceSpec } from '../models/service.interface';
+import { PaginateObservable } from './paginate.model';
 
 @Injectable({
   providedIn: 'root'
 })
 
 @Injectable({
   providedIn: 'root'
 })
-export class CephServiceService {
+export class CephServiceService extends ApiClient {
   private url = 'api/service';
 
   private url = 'api/service';
 
-  constructor(private http: HttpClient) {}
+  constructor(private http: HttpClient) {
+    super();
+  }
 
 
-  list(serviceName?: string): Observable<CephServiceSpec[]> {
-    const options = serviceName
-      ? { params: new HttpParams().set('service_name', serviceName) }
-      : {};
-    return this.http.get<CephServiceSpec[]>(this.url, options);
+  list(httpParams: HttpParams, serviceName?: string): PaginateObservable<CephServiceSpec[]> {
+    const options = {
+      headers: { Accept: this.getVersionHeaderValue(2, 0) },
+      params: httpParams
+    };
+    options['observe'] = 'response';
+    if (serviceName) {
+      options.params = options.params.append('service_name', serviceName);
+    }
+    return new PaginateObservable<CephServiceSpec[]>(
+      this.http.get<CephServiceSpec[]>(this.url, options)
+    );
   }
 
   getDaemons(serviceName?: string): Observable<Daemon[]> {
   }
 
   getDaemons(serviceName?: string): Observable<Daemon[]> {
index d13f415275aa32f76ce858f6dc9d1d04e5ffb8b1..7adbd0b104c27b83d1031b83105dd03f5131ef8e 100644 (file)
@@ -29,7 +29,7 @@ export class HostService extends ApiClient {
 
   list(facts: string): Observable<object[]> {
     return this.http.get<object[]>(this.baseURL, {
 
   list(facts: string): Observable<object[]> {
     return this.http.get<object[]>(this.baseURL, {
-      headers: { Accept: 'application/vnd.ceph.api.v1.1+json' },
+      headers: { Accept: this.getVersionHeaderValue(1, 2) },
       params: { facts: facts }
     });
   }
       params: { facts: facts }
     });
   }
index 10a0cf47f0887ed720af19d652f36d235f2e5b0c..34461bf6314930ba2b98b9e43ae3c02320055675 100644 (file)
@@ -165,6 +165,9 @@ export class OsdService {
 
   safeToDestroy(ids: string) {
     interface SafeToDestroyResponse {
 
   safeToDestroy(ids: string) {
     interface SafeToDestroyResponse {
+      active: number[];
+      missing_stats: number[];
+      stored_pgs: number[];
       is_safe_to_destroy: boolean;
       message?: string;
     }
       is_safe_to_destroy: boolean;
       message?: string;
     }
diff --git a/ceph/src/pybind/mgr/dashboard/frontend/src/app/shared/api/paginate.model.ts b/ceph/src/pybind/mgr/dashboard/frontend/src/app/shared/api/paginate.model.ts
new file mode 100644 (file)
index 0000000..703792a
--- /dev/null
@@ -0,0 +1,16 @@
+import { Observable } from 'rxjs';
+import { map } from 'rxjs/operators';
+
+export class PaginateObservable<Type> {
+  observable: Observable<Type>;
+  count: number;
+
+  constructor(obs: Observable<Type>) {
+    this.observable = obs.pipe(
+      map((response: any) => {
+        this.count = Number(response.headers?.get('X-Total-Count'));
+        return response['body'];
+      })
+    );
+  }
+}
index 4958382e27982a1a1f06aeaafbbe6a1775e28e78..9dc574e4875d44d13d5aeadf5f314fe2d8fa3fdf 100644 (file)
@@ -94,6 +94,10 @@ export class RbdMirroringService {
     return this.http.get(`api/block/mirroring/pool/${poolName}/peer/${peerUUID}`);
   }
 
     return this.http.get(`api/block/mirroring/pool/${poolName}/peer/${peerUUID}`);
   }
 
+  getPeerForPool(poolName: string) {
+    return this.http.get(`api/block/mirroring/pool/${poolName}/peer`);
+  }
+
   addPeer(poolName: string, request: any) {
     return this.http.post(`api/block/mirroring/pool/${poolName}/peer`, request, {
       observe: 'response'
   addPeer(poolName: string, request: any) {
     return this.http.post(`api/block/mirroring/pool/${poolName}/peer`, request, {
       observe: 'response'
index b22b67e349123c244dc7ad0f24c2f7c8c9fe4001..2c42d8b427c0d0f531ecfb430e75376f88e0a551 100644 (file)
@@ -49,20 +49,44 @@ describe('RgwBucketService', () => {
 
   it('should call create', () => {
     service
 
   it('should call create', () => {
     service
-      .create('foo', 'bar', 'default', 'default-placement', false, 'COMPLIANCE', '5')
+      .create(
+        'foo',
+        'bar',
+        'default',
+        'default-placement',
+        false,
+        'COMPLIANCE',
+        '5',
+        true,
+        'aws:kms',
+        'qwerty1'
+      )
       .subscribe();
     const req = httpTesting.expectOne(
       .subscribe();
     const req = httpTesting.expectOne(
-      `api/rgw/bucket?bucket=foo&uid=bar&zonegroup=default&placement_target=default-placement&lock_enabled=false&lock_mode=COMPLIANCE&lock_retention_period_days=5&${RgwHelper.DAEMON_QUERY_PARAM}`
+      `api/rgw/bucket?bucket=foo&uid=bar&zonegroup=default&placement_target=default-placement&lock_enabled=false&lock_mode=COMPLIANCE&lock_retention_period_days=5&encryption_state=true&encryption_type=aws%253Akms&key_id=qwerty1&${RgwHelper.DAEMON_QUERY_PARAM}`
     );
     expect(req.request.method).toBe('POST');
   });
 
   it('should call update', () => {
     service
     );
     expect(req.request.method).toBe('POST');
   });
 
   it('should call update', () => {
     service
-      .update('foo', 'bar', 'baz', 'Enabled', 'Enabled', '1', '223344', 'GOVERNANCE', '10')
+      .update(
+        'foo',
+        'bar',
+        'baz',
+        'Enabled',
+        true,
+        'aws:kms',
+        'qwerty1',
+        'Enabled',
+        '1',
+        '223344',
+        'GOVERNANCE',
+        '10'
+      )
       .subscribe();
     const req = httpTesting.expectOne(
       .subscribe();
     const req = httpTesting.expectOne(
-      `api/rgw/bucket/foo?${RgwHelper.DAEMON_QUERY_PARAM}&bucket_id=bar&uid=baz&versioning_state=Enabled&mfa_delete=Enabled&mfa_token_serial=1&mfa_token_pin=223344&lock_mode=GOVERNANCE&lock_retention_period_days=10`
+      `api/rgw/bucket/foo?${RgwHelper.DAEMON_QUERY_PARAM}&bucket_id=bar&uid=baz&versioning_state=Enabled&encryption_state=true&encryption_type=aws%253Akms&key_id=qwerty1&mfa_delete=Enabled&mfa_token_serial=1&mfa_token_pin=223344&lock_mode=GOVERNANCE&lock_retention_period_days=10`
     );
     expect(req.request.method).toBe('PUT');
   });
     );
     expect(req.request.method).toBe('PUT');
   });
index fc88bfa7181649658c4c04005d7dd12ef750f7a7..315c8b7560f1718f24091cc08e15b7bd86ec7bb7 100644 (file)
@@ -50,7 +50,10 @@ export class RgwBucketService extends ApiClient {
     placementTarget: string,
     lockEnabled: boolean,
     lock_mode: 'GOVERNANCE' | 'COMPLIANCE',
     placementTarget: string,
     lockEnabled: boolean,
     lock_mode: 'GOVERNANCE' | 'COMPLIANCE',
-    lock_retention_period_days: string
+    lock_retention_period_days: string,
+    encryption_state: boolean,
+    encryption_type: string,
+    key_id: string
   ) {
     return this.rgwDaemonService.request((params: HttpParams) => {
       return this.http.post(this.url, null, {
   ) {
     return this.rgwDaemonService.request((params: HttpParams) => {
       return this.http.post(this.url, null, {
@@ -63,6 +66,9 @@ export class RgwBucketService extends ApiClient {
             lock_enabled: String(lockEnabled),
             lock_mode,
             lock_retention_period_days,
             lock_enabled: String(lockEnabled),
             lock_mode,
             lock_retention_period_days,
+            encryption_state: String(encryption_state),
+            encryption_type,
+            key_id,
             daemon_name: params.get('daemon_name')
           }
         })
             daemon_name: params.get('daemon_name')
           }
         })
@@ -75,6 +81,9 @@ export class RgwBucketService extends ApiClient {
     bucketId: string,
     uid: string,
     versioningState: string,
     bucketId: string,
     uid: string,
     versioningState: string,
+    encryptionState: boolean,
+    encryptionType: string,
+    keyId: string,
     mfaDelete: string,
     mfaTokenSerial: string,
     mfaTokenPin: string,
     mfaDelete: string,
     mfaTokenSerial: string,
     mfaTokenPin: string,
@@ -82,14 +91,19 @@ export class RgwBucketService extends ApiClient {
     lockRetentionPeriodDays: string
   ) {
     return this.rgwDaemonService.request((params: HttpParams) => {
     lockRetentionPeriodDays: string
   ) {
     return this.rgwDaemonService.request((params: HttpParams) => {
-      params = params.append('bucket_id', bucketId);
-      params = params.append('uid', uid);
-      params = params.append('versioning_state', versioningState);
-      params = params.append('mfa_delete', mfaDelete);
-      params = params.append('mfa_token_serial', mfaTokenSerial);
-      params = params.append('mfa_token_pin', mfaTokenPin);
-      params = params.append('lock_mode', lockMode);
-      params = params.append('lock_retention_period_days', lockRetentionPeriodDays);
+      params = params.appendAll({
+        bucket_id: bucketId,
+        uid: uid,
+        versioning_state: versioningState,
+        encryption_state: String(encryptionState),
+        encryption_type: encryptionType,
+        key_id: keyId,
+        mfa_delete: mfaDelete,
+        mfa_token_serial: mfaTokenSerial,
+        mfa_token_pin: mfaTokenPin,
+        lock_mode: lockMode,
+        lock_retention_period_days: lockRetentionPeriodDays
+      });
       return this.http.put(`${this.url}/${bucket}`, null, { params: params });
     });
   }
       return this.http.put(`${this.url}/${bucket}`, null, { params: params });
     });
   }
@@ -125,4 +139,55 @@ export class RgwBucketService extends ApiClient {
 
     return bucketData['lock_retention_period_days'] || 0;
   }
 
     return bucketData['lock_retention_period_days'] || 0;
   }
+
+  setEncryptionConfig(
+    encryption_type: string,
+    kms_provider: string,
+    auth_method: string,
+    secret_engine: string,
+    secret_path: string,
+    namespace: string,
+    address: string,
+    token: string,
+    owner: string,
+    ssl_cert: string,
+    client_cert: string,
+    client_key: string
+  ) {
+    return this.rgwDaemonService.request((params: HttpParams) => {
+      params = params.appendAll({
+        encryption_type: encryption_type,
+        kms_provider: kms_provider,
+        auth_method: auth_method,
+        secret_engine: secret_engine,
+        secret_path: secret_path,
+        namespace: namespace,
+        address: address,
+        token: token,
+        owner: owner,
+        ssl_cert: ssl_cert,
+        client_cert: client_cert,
+        client_key: client_key
+      });
+      return this.http.put(`${this.url}/setEncryptionConfig`, null, { params: params });
+    });
+  }
+
+  getEncryption(bucket: string) {
+    return this.rgwDaemonService.request((params: HttpParams) => {
+      return this.http.get(`${this.url}/${bucket}/getEncryption`, { params: params });
+    });
+  }
+
+  deleteEncryption(bucket: string) {
+    return this.rgwDaemonService.request((params: HttpParams) => {
+      return this.http.get(`${this.url}/${bucket}/deleteEncryption`, { params: params });
+    });
+  }
+
+  getEncryptionConfig() {
+    return this.rgwDaemonService.request((params: HttpParams) => {
+      return this.http.get(`${this.url}/getEncryptionConfig`, { params: params });
+    });
+  }
 }
 }
diff --git a/ceph/src/pybind/mgr/dashboard/frontend/src/app/shared/components/cd-label/cd-label.component.html b/ceph/src/pybind/mgr/dashboard/frontend/src/app/shared/components/cd-label/cd-label.component.html
new file mode 100644 (file)
index 0000000..41cfae7
--- /dev/null
@@ -0,0 +1,11 @@
+<span *ngIf="!key; else key_value"
+      class="badge badge-{{value}}"
+      ngClass="{{value | colorClassFromText}}">
+  {{ value }}
+</span>
+
+<ng-template #key_value>
+  <span class="badge badge-background-primary badge-{{key}}-{{value}}">
+        {{ key }}: {{ value }}
+  </span>
+</ng-template>
diff --git a/ceph/src/pybind/mgr/dashboard/frontend/src/app/shared/components/cd-label/cd-label.component.scss b/ceph/src/pybind/mgr/dashboard/frontend/src/app/shared/components/cd-label/cd-label.component.scss
new file mode 100644 (file)
index 0000000..e69de29
diff --git a/ceph/src/pybind/mgr/dashboard/frontend/src/app/shared/components/cd-label/cd-label.component.spec.ts b/ceph/src/pybind/mgr/dashboard/frontend/src/app/shared/components/cd-label/cd-label.component.spec.ts
new file mode 100644 (file)
index 0000000..61472cd
--- /dev/null
@@ -0,0 +1,25 @@
+import { ComponentFixture, TestBed } from '@angular/core/testing';
+
+import { CdLabelComponent } from './cd-label.component';
+import { ColorClassFromTextPipe } from './color-class-from-text.pipe';
+
+describe('CdLabelComponent', () => {
+  let component: CdLabelComponent;
+  let fixture: ComponentFixture<CdLabelComponent>;
+
+  beforeEach(async () => {
+    await TestBed.configureTestingModule({
+      declarations: [CdLabelComponent, ColorClassFromTextPipe]
+    }).compileComponents();
+  });
+
+  beforeEach(() => {
+    fixture = TestBed.createComponent(CdLabelComponent);
+    component = fixture.componentInstance;
+    fixture.detectChanges();
+  });
+
+  it('should create', () => {
+    expect(component).toBeTruthy();
+  });
+});
diff --git a/ceph/src/pybind/mgr/dashboard/frontend/src/app/shared/components/cd-label/cd-label.component.ts b/ceph/src/pybind/mgr/dashboard/frontend/src/app/shared/components/cd-label/cd-label.component.ts
new file mode 100644 (file)
index 0000000..ae0471b
--- /dev/null
@@ -0,0 +1,11 @@
+import { Component, Input } from '@angular/core';
+
+@Component({
+  selector: 'cd-label',
+  templateUrl: './cd-label.component.html',
+  styleUrls: ['./cd-label.component.scss']
+})
+export class CdLabelComponent {
+  @Input() key?: string;
+  @Input() value?: string;
+}
diff --git a/ceph/src/pybind/mgr/dashboard/frontend/src/app/shared/components/cd-label/color-class-from-text.pipe.ts b/ceph/src/pybind/mgr/dashboard/frontend/src/app/shared/components/cd-label/color-class-from-text.pipe.ts
new file mode 100644 (file)
index 0000000..fcbf2f9
--- /dev/null
@@ -0,0 +1,28 @@
+import { Pipe, PipeTransform } from '@angular/core';
+
+@Pipe({
+  name: 'colorClassFromText'
+})
+export class ColorClassFromTextPipe implements PipeTransform {
+  readonly cssClasses: string[] = [
+    'badge-cd-label-green',
+    'badge-cd-label-cyan',
+    'badge-cd-label-purple',
+    'badge-cd-label-light-blue',
+    'badge-cd-label-gold',
+    'badge-cd-label-light-green'
+  ];
+
+  transform(text: string): string {
+    let hash = 0;
+    let charCode = 0;
+    if (text) {
+      for (let i = 0; i < text.length; i++) {
+        charCode = text.charCodeAt(i);
+        // eslint-disable-next-line no-bitwise
+        hash = Math.abs((hash << 5) - hash + charCode);
+      }
+    }
+    return this.cssClasses[hash % this.cssClasses.length];
+  }
+}
index a281bf8598e54d1a03f01be140cddf73a95b2442..5350e2bd50b00b0ddc5299ada572c2a00600a7be 100644 (file)
@@ -21,6 +21,8 @@ import { DirectivesModule } from '../directives/directives.module';
 import { PipesModule } from '../pipes/pipes.module';
 import { AlertPanelComponent } from './alert-panel/alert-panel.component';
 import { BackButtonComponent } from './back-button/back-button.component';
 import { PipesModule } from '../pipes/pipes.module';
 import { AlertPanelComponent } from './alert-panel/alert-panel.component';
 import { BackButtonComponent } from './back-button/back-button.component';
+import { CdLabelComponent } from './cd-label/cd-label.component';
+import { ColorClassFromTextPipe } from './cd-label/color-class-from-text.pipe';
 import { ConfigOptionComponent } from './config-option/config-option.component';
 import { ConfirmationModalComponent } from './confirmation-modal/confirmation-modal.component';
 import { Copy2ClipboardButtonComponent } from './copy2clipboard-button/copy2clipboard-button.component';
 import { ConfigOptionComponent } from './config-option/config-option.component';
 import { ConfirmationModalComponent } from './confirmation-modal/confirmation-modal.component';
 import { Copy2ClipboardButtonComponent } from './copy2clipboard-button/copy2clipboard-button.component';
@@ -97,7 +99,9 @@ import { WizardComponent } from './wizard/wizard.component';
     FormButtonPanelComponent,
     MotdComponent,
     WizardComponent,
     FormButtonPanelComponent,
     MotdComponent,
     WizardComponent,
-    CustomLoginBannerComponent
+    CustomLoginBannerComponent,
+    CdLabelComponent,
+    ColorClassFromTextPipe
   ],
   providers: [],
   exports: [
   ],
   providers: [],
   exports: [
@@ -126,7 +130,8 @@ import { WizardComponent } from './wizard/wizard.component';
     FormButtonPanelComponent,
     MotdComponent,
     WizardComponent,
     FormButtonPanelComponent,
     MotdComponent,
     WizardComponent,
-    CustomLoginBannerComponent
+    CustomLoginBannerComponent,
+    CdLabelComponent
   ]
 })
 export class ComponentsModule {}
   ]
 })
 export class ComponentsModule {}
index 0b0f87957a93ef4025c56ecf48842817aab38400..9c88b5b713538b4ec315bd7a5762403fda1a58c1 100644 (file)
                  [placeholder]="option.additionalTypeInfo.humanReadable"
                  [formControlName]="option.name"
                  [step]="getStep(option.type, optionsForm.getValue(option.name))">
                  [placeholder]="option.additionalTypeInfo.humanReadable"
                  [formControlName]="option.name"
                  [step]="getStep(option.type, optionsForm.getValue(option.name))">
-          <div class="input-group-append"
-               *ngIf="optionsFormShowReset">
-            <button class="btn btn-light"
-                    type="button"
-                    data-toggle="button"
-                    title="Remove the custom configuration value. The default configuration will be inherited and used instead."
-                    (click)="resetValue(option.name)"
-                    i18n-title>
-              <i [ngClass]="[icons.erase]"
-                 aria-hidden="true"></i>
-            </button>
-          </div>
+          <button class="btn btn-light"
+                  type="button"
+                  data-toggle="button"
+                  title="Remove the custom configuration value. The default configuration will be inherited and used instead."
+                  (click)="resetValue(option.name)"
+                  i18n-title
+                  *ngIf="optionsFormShowReset">
+            <i [ngClass]="[icons.erase]"
+               aria-hidden="true"></i>
+          </button>
         </div>
         <span class="invalid-feedback"
               *ngIf="optionsForm.showError(option.name, optionsFormDir, 'pattern')">
         </div>
         <span class="invalid-feedback"
               *ngIf="optionsForm.showError(option.name, optionsFormDir, 'pattern')">
index 47fca49c7e8ade7e0a57656005b83a93448619f4..d24e06ee1a56521d4327cf700633e9eeeb852d3f 100755 (executable)
@@ -32,7 +32,7 @@
                      [formControlName]="field.name"
                      cdDimlessBinary>
               <select *ngIf="field.type === 'select'"
                      [formControlName]="field.name"
                      cdDimlessBinary>
               <select *ngIf="field.type === 'select'"
-                      class="form-control"
+                      class="form-select"
                       [id]="field.name"
                       [formControlName]="field.name">
                 <option *ngIf="field?.typeConfig?.placeholder"
                       [id]="field.name"
                       [formControlName]="field.name">
                 <option *ngIf="field?.typeConfig?.placeholder"
index 8ad98b27f47e7bf11b0e394503dfd7ddf7109efc..6191bac3bcfe289ca6f55365c0d594be890b9fc7 100644 (file)
   <cd-doc section="grafana"></cd-doc> on how to add dashboards to Grafana.</cd-alert-panel>
 
 <ng-container *ngIf="grafanaExist && dashboardExist">
   <cd-doc section="grafana"></cd-doc> on how to add dashboards to Grafana.</cd-alert-panel>
 
 <ng-container *ngIf="grafanaExist && dashboardExist">
-  <div class="row">
-    <div class="col">
-      <div class="form-inline timepicker">
+  <div class="row mb-3">
+    <div class="col-lg-4 d-flex">
+      <div class="col-md-3 timepicker">
         <label for="timepicker"
         <label for="timepicker"
-               class="ml-1 my-1"
-               i18n>Grafana Time Picker</label>
-
+               class="mt-2"
+               i18n>Grafana Time Picker</label></div>
+        <div class="col-md-4">
         <select id="timepicker"
                 name="timepicker"
         <select id="timepicker"
                 name="timepicker"
-                class="custom-select my-1 mx-3"
+                class="form-select"
                 [(ngModel)]="time"
                 (ngModelChange)="onTimepickerChange($event)">
           <option *ngFor="let key of grafanaTimes"
                   [ngValue]="key.value">{{ key.name }}
           </option>
                 [(ngModel)]="time"
                 (ngModelChange)="onTimepickerChange($event)">
           <option *ngFor="let key of grafanaTimes"
                   [ngValue]="key.value">{{ key.name }}
           </option>
-        </select>
+        </select></div>
+        <div class="col-md-3">
 
 
-        <button class="btn btn-light my-1"
+        <button class="btn btn-light ms-3"
                 i18n-title
                 title="Reset Settings"
                 (click)="reset()">
           <i [ngClass]="[icons.undo]"></i>
         </button>
                 i18n-title
                 title="Reset Settings"
                 (click)="reset()">
           <i [ngClass]="[icons.undo]"></i>
         </button>
-        <button class="btn btn-light my-1 ml-3"
+        <button class="btn btn-light ms-3"
                 i18n-title
                 title="Show hidden information"
                 (click)="showMessage = !showMessage">
                 i18n-title
                 title="Show hidden information"
                 (click)="showMessage = !showMessage">
@@ -47,7 +48,7 @@
   </div>
 
   <div class="row">
   </div>
 
   <div class="row">
-    <div class="col my-3"
+    <div class="col my-2"
          *ngIf="showMessage">
       <cd-alert-panel type="info"
                       class="mb-3"
          *ngIf="showMessage">
       <cd-alert-panel type="info"
                       class="mb-3"
@@ -70,7 +71,9 @@
                 class="grafana"
                 [ngClass]="panelStyle"
                 frameborder="0"
                 class="grafana"
                 [ngClass]="panelStyle"
                 frameborder="0"
-                scrolling="no">
+                scrolling="no"
+                [title]="title"
+                i18n-title>
         </iframe>
       </div>
     </div>
         </iframe>
       </div>
     </div>
index 5052ef9ec6e822eac104b8b9c6f13077c0af1c78..07fd97965cedb7dd23625f28e9c2b826a4898fb4 100644 (file)
@@ -35,6 +35,7 @@ describe('GrafanaComponent', () => {
     component.grafanaPath = 'somePath';
     component.type = 'metrics';
     component.uid = 'foo';
     component.grafanaPath = 'somePath';
     component.type = 'metrics';
     component.uid = 'foo';
+    component.title = 'panel title';
   });
 
   it('should create', () => {
   });
 
   it('should create', () => {
index e7f3f5dc990b34bfd76c1f71439794f606f567be..d82d414ae955cb07170accf364ae16edb459bdad 100644 (file)
@@ -37,6 +37,8 @@ export class GrafanaComponent implements OnInit, OnChanges {
   grafanaStyle: string;
   @Input()
   uid: string;
   grafanaStyle: string;
   @Input()
   uid: string;
+  @Input()
+  title: string;
 
   constructor(private sanitizer: DomSanitizer, private settingsService: SettingsService) {
     this.grafanaTimes = [
 
   constructor(private sanitizer: DomSanitizer, private settingsService: SettingsService) {
     this.grafanaTimes = [
index f7bc12b5be8b24c478779ac3e1cc6a37351f25a1..20ab7c80a67ed09c539d29a53992254387899cad 100644 (file)
@@ -4,7 +4,7 @@
   </div>
   <ng-content></ng-content>
 </ng-template>
   </div>
   <ng-content></ng-content>
 </ng-template>
-<i [ngClass]="[icons.questionCircle]"
+<i [ngClass]="iconClass ? iconClass : [icons.questionCircle]"
    aria-hidden="true"
    [ngbPopover]="popoverTpl"
    (click)="$event.preventDefault();">
    aria-hidden="true"
    [ngbPopover]="popoverTpl"
    (click)="$event.preventDefault();">
index 0028945ba6ca0fbbc958d008ce413212b3b8e8e3..84d1639b16f0dfbe4637ffa551b649f02ee08662 100644 (file)
@@ -11,6 +11,9 @@ export class HelperComponent {
   @Input()
   class: string;
 
   @Input()
   class: string;
 
+  @Input()
+  iconClass = '';
+
   @Input()
   html: any;
 
   @Input()
   html: any;
 
index 2ecbbd7cce6df14bd1aa1b16d11d1aa5a9b278f7..be98eaa6f949a05a0c426ae83c6c2a6746667174 100644 (file)
@@ -3,12 +3,17 @@
      placement="bottom-right">
   <a ngbDropdownToggle
      i18n-title
      placement="bottom-right">
   <a ngbDropdownToggle
      i18n-title
-     title="Select a Language">
+     id="toggle-language-button"
+     title="Select a Language"
+     role="button">
     {{ allLanguages[selectedLanguage] }}
   </a>
     {{ allLanguages[selectedLanguage] }}
   </a>
-  <div ngbDropdownMenu>
+  <div ngbDropdownMenu
+       role="listbox"
+       aria-labelledby="toggle-language-button">
     <ng-container *ngFor="let lang of supportedLanguages | keyvalue">
       <button ngbDropdownItem
     <ng-container *ngFor="let lang of supportedLanguages | keyvalue">
       <button ngbDropdownItem
+              role="option"
               (click)="changeLanguage(lang.key)">
         {{ lang.value }}
       </button>
               (click)="changeLanguage(lang.key)">
         {{ lang.value }}
       </button>
index 35726cfbd9986aa123c26dc52964139f953e8735..c2a1b8842b59a4960ecb3de19b00611646172023 100644 (file)
@@ -3,7 +3,7 @@
   <strong>
     <i [ngClass]="[icons.spinner, icons.spin]"
        aria-hidden="true"
   <strong>
     <i [ngClass]="[icons.spinner, icons.spin]"
        aria-hidden="true"
-       class="mr-2"></i>
+       class="me-2"></i>
   </strong>
   <ng-content></ng-content>
 </ngb-alert>
   </strong>
   <ng-content></ng-content>
 </ngb-alert>
index 657e0d6053f89fbc5b2bf94dccb26a0746b4cb4d..f9a328666d54eab907e2f83cc52e8b7638f05352 100644 (file)
@@ -2,14 +2,13 @@
   <div [ngClass]="pageURL ? 'modal-dialog' : ''">
     <div class="modal-content">
       <div class="modal-header">
   <div [ngClass]="pageURL ? 'modal-dialog' : ''">
     <div class="modal-content">
       <div class="modal-header">
-        <h4 class="modal-title float-left">
+        <h4 class="modal-title float-start">
           <ng-content select=".modal-title"></ng-content>
         </h4>
         <button type="button"
           <ng-content select=".modal-title"></ng-content>
         </h4>
         <button type="button"
-                class="close float-right"
+                class="btn-close float-end"
                 aria-label="Close"
                 (click)="close()">
                 aria-label="Close"
                 (click)="close()">
-          <span aria-hidden="true">&times;</span>
         </button>
       </div>
 
         </button>
       </div>
 
index bba23747b01d4be0aeceebd3f300887f4e0bd8a9..6cf373bcdc0abc15eca3388e45fa4a541b095f95 100644 (file)
             </div>
 
             <p class="card-text text-muted">
             </div>
 
             <p class="card-text text-muted">
-              <small class="date float-left">
+              <small class="date float-start">
                 {{ executingTask.begin_time | cdDate }}
               </small>
 
                 {{ executingTask.begin_time | cdDate }}
               </small>
 
-              <span class="float-right">
+              <span class="float-end">
                 {{ executingTask.progress || 0 }} %
               </span>
             </p>
                 {{ executingTask.progress || 0 }} %
               </span>
             </p>
           </div>
           <div class="col-md-10">
             <div class="card-body p-1">
           </div>
           <div class="col-md-10">
             <div class="card-body p-1">
-              <button class="btn btn-link float-right mt-0 pt-0"
+              <button class="btn btn-link float-end mt-0 pt-0"
                       title="Remove notification"
                       i18n-title
                       (click)="remove(i); $event.stopPropagation()">
                 <i [ngClass]="[icons.trash]"></i>
               </button>
                       title="Remove notification"
                       i18n-title
                       (click)="remove(i); $event.stopPropagation()">
                 <i [ngClass]="[icons.trash]"></i>
               </button>
+              <button *ngIf="notification.application === 'Prometheus' && notification.type !== 2 && !notification.alertSilenced"
+                      class="btn btn-link float-end text-muted mute m-0 p-0"
+                      title="Silence Alert"
+                      i18n-title
+                      (click)="silence(notification)">
+                <i [ngClass]="[icons.mute]"></i>
+              </button>
+              <button *ngIf="notification.application === 'Prometheus' && notification.type !== 2 && notification.alertSilenced"
+                      class="btn btn-link float-end text-muted mute m-0 p-0"
+                      title="Expire Silence"
+                      i18n-title
+                      (click)="expire(notification)">
+                <i [ngClass]="[icons.bell]"></i>
+              </button>
+
 
               <h6 class="card-title bold">{{ notification.title }}</h6>
               <p class="card-text"
 
               <h6 class="card-title bold">{{ notification.title }}</h6>
               <p class="card-text"
@@ -84,7 +99,7 @@
                 </ng-container>
                 <small class="date"
                        [title]="notification.timestamp | cdDate">{{ notification.timestamp | relativeDate }}</small>
                 </ng-container>
                 <small class="date"
                        [title]="notification.timestamp | cdDate">{{ notification.timestamp | relativeDate }}</small>
-                <i class="float-right custom-icon"
+                <i class="float-end custom-icon"
                    [ngClass]="[notification.applicationClass]"
                    [title]="notification.application"></i>
               </p>
                    [ngClass]="[notification.applicationClass]"
                    [title]="notification.application"></i>
               </p>
   <div class="card-header">
     <ng-container i18n>Tasks and Notifications</ng-container>
 
   <div class="card-header">
     <ng-container i18n>Tasks and Notifications</ng-container>
 
-    <button class="close float-right"
+    <button class="btn-close float-end"
             tabindex="-1"
             type="button"
             tabindex="-1"
             type="button"
+            title="close"
             (click)="closeSidebar()">
             (click)="closeSidebar()">
-      <span>
-        <i [ngClass]="icons.close"></i>
-      </span>
     </button>
   </div>
 
     </button>
   </div>
 
index 596f3c358bf4d8b9f44de077ef225364645068f1..f3fe9cea3cff41040f772b761ea409f14c7a35e7 100644 (file)
@@ -1,5 +1,11 @@
 import { HttpClientTestingModule } from '@angular/common/http/testing';
 import { HttpClientTestingModule } from '@angular/common/http/testing';
-import { ComponentFixture, fakeAsync, TestBed, tick } from '@angular/core/testing';
+import {
+  ComponentFixture,
+  discardPeriodicTasks,
+  fakeAsync,
+  TestBed,
+  tick
+} from '@angular/core/testing';
 import { NoopAnimationsModule } from '@angular/platform-browser/animations';
 import { RouterTestingModule } from '@angular/router/testing';
 
 import { NoopAnimationsModule } from '@angular/platform-browser/animations';
 import { RouterTestingModule } from '@angular/router/testing';
 
@@ -26,6 +32,10 @@ import { NotificationsSidebarComponent } from './notifications-sidebar.component
 describe('NotificationsSidebarComponent', () => {
   let component: NotificationsSidebarComponent;
   let fixture: ComponentFixture<NotificationsSidebarComponent>;
 describe('NotificationsSidebarComponent', () => {
   let component: NotificationsSidebarComponent;
   let fixture: ComponentFixture<NotificationsSidebarComponent>;
+  let prometheusUpdatePermission: string;
+  let prometheusReadPermission: string;
+  let prometheusCreatePermission: string;
+  let configOptReadPermission: string;
 
   configureTestBed({
     imports: [
 
   configureTestBed({
     imports: [
@@ -43,6 +53,21 @@ describe('NotificationsSidebarComponent', () => {
   });
 
   beforeEach(() => {
   });
 
   beforeEach(() => {
+    prometheusReadPermission = 'read';
+    prometheusUpdatePermission = 'update';
+    prometheusCreatePermission = 'create';
+    configOptReadPermission = 'read';
+    spyOn(TestBed.inject(AuthStorageService), 'getPermissions').and.callFake(
+      () =>
+        new Permissions({
+          prometheus: [
+            prometheusReadPermission,
+            prometheusUpdatePermission,
+            prometheusCreatePermission
+          ],
+          'config-opt': [configOptReadPermission]
+        })
+    );
     fixture = TestBed.createComponent(NotificationsSidebarComponent);
     component = fixture.componentInstance;
   });
     fixture = TestBed.createComponent(NotificationsSidebarComponent);
     component = fixture.componentInstance;
   });
@@ -55,8 +80,6 @@ describe('NotificationsSidebarComponent', () => {
   describe('prometheus alert handling', () => {
     let prometheusAlertService: PrometheusAlertService;
     let prometheusNotificationService: PrometheusNotificationService;
   describe('prometheus alert handling', () => {
     let prometheusAlertService: PrometheusAlertService;
     let prometheusNotificationService: PrometheusNotificationService;
-    let prometheusReadPermission: string;
-    let configOptReadPermission: string;
 
     const expectPrometheusServicesToBeCalledTimes = (n: number) => {
       expect(prometheusNotificationService.refresh).toHaveBeenCalledTimes(n);
 
     const expectPrometheusServicesToBeCalledTimes = (n: number) => {
       expect(prometheusNotificationService.refresh).toHaveBeenCalledTimes(n);
@@ -64,16 +87,6 @@ describe('NotificationsSidebarComponent', () => {
     };
 
     beforeEach(() => {
     };
 
     beforeEach(() => {
-      prometheusReadPermission = 'read';
-      configOptReadPermission = 'read';
-      spyOn(TestBed.inject(AuthStorageService), 'getPermissions').and.callFake(
-        () =>
-          new Permissions({
-            prometheus: [prometheusReadPermission],
-            'config-opt': [configOptReadPermission]
-          })
-      );
-
       spyOn(TestBed.inject(PrometheusService), 'ifAlertmanagerConfigured').and.callFake((fn) =>
         fn()
       );
       spyOn(TestBed.inject(PrometheusService), 'ifAlertmanagerConfigured').and.callFake((fn) =>
         fn()
       );
@@ -152,6 +165,7 @@ describe('NotificationsSidebarComponent', () => {
       tick(6000);
       expect(component.notifications.length).toBe(1);
       expect(component.notifications[0].title).toBe('Sample title');
       tick(6000);
       expect(component.notifications.length).toBe(1);
       expect(component.notifications[0].title).toBe('Sample title');
+      discardPeriodicTasks();
     }));
   });
 
     }));
   });
 
index 8c5caf7ff6bd69c8eb0e51ff573dc95bed139b28..39369ffd5bebc5005efa52f786f0a43e1fa81efb 100644 (file)
@@ -13,7 +13,14 @@ import _ from 'lodash';
 import moment from 'moment';
 import { Subscription } from 'rxjs';
 
 import moment from 'moment';
 import { Subscription } from 'rxjs';
 
+import { PrometheusService } from '~/app/shared/api/prometheus.service';
+import { SucceededActionLabelsI18n } from '~/app/shared/constants/app.constants';
 import { Icons } from '~/app/shared/enum/icons.enum';
 import { Icons } from '~/app/shared/enum/icons.enum';
+import { NotificationType } from '~/app/shared/enum/notification-type.enum';
+import {
+  AlertmanagerSilence,
+  AlertmanagerSilenceMatcher
+} from '~/app/shared/models/alertmanager-silence';
 import { CdNotification } from '~/app/shared/models/cd-notification';
 import { ExecutingTask } from '~/app/shared/models/executing-task';
 import { FinishedTask } from '~/app/shared/models/finished-task';
 import { CdNotification } from '~/app/shared/models/cd-notification';
 import { ExecutingTask } from '~/app/shared/models/executing-task';
 import { FinishedTask } from '~/app/shared/models/finished-task';
@@ -56,8 +63,10 @@ export class NotificationsSidebarComponent implements OnInit, OnDestroy {
     private summaryService: SummaryService,
     private taskMessageService: TaskMessageService,
     private prometheusNotificationService: PrometheusNotificationService,
     private summaryService: SummaryService,
     private taskMessageService: TaskMessageService,
     private prometheusNotificationService: PrometheusNotificationService,
+    private succeededLabels: SucceededActionLabelsI18n,
     private authStorageService: AuthStorageService,
     private prometheusAlertService: PrometheusAlertService,
     private authStorageService: AuthStorageService,
     private prometheusAlertService: PrometheusAlertService,
+    private prometheusService: PrometheusService,
     private ngZone: NgZone,
     private cdRef: ChangeDetectorRef
   ) {
     private ngZone: NgZone,
     private cdRef: ChangeDetectorRef
   ) {
@@ -164,4 +173,56 @@ export class NotificationsSidebarComponent implements OnInit, OnDestroy {
   trackByFn(index: number) {
     return index;
   }
   trackByFn(index: number) {
     return index;
   }
+
+  silence(data: CdNotification) {
+    const datetimeFormat = 'YYYY-MM-DD HH:mm';
+    const resource = $localize`silence`;
+    const matcher: AlertmanagerSilenceMatcher = {
+      name: 'alertname',
+      value: data['title'].split(' ')[0],
+      isRegex: false
+    };
+    const silencePayload: AlertmanagerSilence = {
+      matchers: [matcher],
+      startsAt: moment(moment().format(datetimeFormat)).toISOString(),
+      endsAt: moment(moment().add(2, 'hours').format(datetimeFormat)).toISOString(),
+      createdBy: this.authStorageService.getUsername(),
+      comment: 'Silence created from the alert notification'
+    };
+    let msg = '';
+
+    data.alertSilenced = true;
+    msg = msg.concat(` ${matcher.name} - ${matcher.value},`);
+    const title = `${this.succeededLabels.CREATED} ${resource} for ${msg.slice(0, -1)}`;
+    this.prometheusService.setSilence(silencePayload).subscribe((resp) => {
+      if (data) {
+        data.silenceId = resp.body['silenceId'];
+      }
+      this.notificationService.show(
+        NotificationType.success,
+        title,
+        undefined,
+        undefined,
+        'Prometheus'
+      );
+    });
+  }
+
+  expire(data: CdNotification) {
+    data.alertSilenced = false;
+    this.prometheusService.expireSilence(data.silenceId).subscribe(
+      () => {
+        this.notificationService.show(
+          NotificationType.success,
+          `${this.succeededLabels.EXPIRED} ${data.silenceId}`,
+          undefined,
+          undefined,
+          'Prometheus'
+        );
+      },
+      (resp) => {
+        resp['application'] = 'Prometheus';
+      }
+    );
+  }
 }
 }
index d33fc9af806bad6ecfc09acee83a2f3a33e9ed0a..08f00e2a16f7ecd55a3ab9ebd6faa78dd6d92cee 100644 (file)
@@ -1,19 +1,19 @@
 <div class="container-fluid">
   <div class="row">
 <div class="container-fluid">
   <div class="row">
-    <div class="col d-flex justify-content-end">
-      <form class="form-inline">
+    <form>
+      <div class="col-sm-1 d-flex float-end">
         <label for="refreshInterval"
         <label for="refreshInterval"
-               class="col-form-label my-0 mx-2"
+               class="col-form-label my-0 mx-2 float-end"
                i18n>Refresh</label>
         <select id="refreshInterval"
                 name="refreshInterval"
                i18n>Refresh</label>
         <select id="refreshInterval"
                 name="refreshInterval"
-                class="form-control"
+                class="form-select float-end"
                 (change)="changeRefreshInterval($event.target.value)"
                 [(ngModel)]="selectedInterval">
           <option *ngFor="let key of intervalKeys"
                   [value]="intervalList[key]">{{ key }}</option>
         </select>
                 (change)="changeRefreshInterval($event.target.value)"
                 [(ngModel)]="selectedInterval">
           <option *ngFor="let key of intervalKeys"
                   [value]="intervalList[key]">{{ key }}</option>
         </select>
-      </form>
-    </div>
+      </div>
+    </form>
   </div>
 </div>
   </div>
 </div>
index 0f23aee87aa3fc7680fbbc3992e8f6f7d6a724ec..5351000836f7d16f10fe1787a23ecd3440ae2d3e 100644 (file)
@@ -5,14 +5,14 @@
            [selectionLimit]="selectionLimit"
            [customBadges]="customBadges"
            [customBadgeValidators]="customBadgeValidators"
            [selectionLimit]="selectionLimit"
            [customBadges]="customBadges"
            [customBadgeValidators]="customBadgeValidators"
-           elemClass="mr-2 select-menu-edit"
+           elemClass="me-2 select-menu-edit"
            (selection)="selection.emit($event)">
   <i [ngClass]="[icons.edit]"></i>
 </cd-select>
 
 <span *ngFor="let dataItem of data">
            (selection)="selection.emit($event)">
   <i [ngClass]="[icons.edit]"></i>
 </cd-select>
 
 <span *ngFor="let dataItem of data">
-  <span class="badge badge-dark mr-2">
-    <span class="mr-2">{{ dataItem }}</span>
+  <span class="badge badge-dark me-2">
+    <span class="me-2">{{ dataItem }}</span>
     <a class="badge-remove"
        (click)="cdSelect.removeItem(dataItem)">
       <i [ngClass]="[icons.destroy]"
     <a class="badge-remove"
        (click)="cdSelect.removeItem(dataItem)">
       <i [ngClass]="[icons.destroy]"
index 1533b94395eb457a3c112e1335642487585d1202..7d39e6f2d608ab855e02ad530871eb868fc35b06 100644 (file)
@@ -8,7 +8,7 @@
              formControlName="filter"
              i18n-placeholder
              [placeholder]="messages.filter"
              formControlName="filter"
              i18n-placeholder
              [placeholder]="messages.filter"
-             (keyup)="$event.keyCode == 13 ? selectOption() : updateFilter()"
+             (keyup)="$event.keyCode === 13 ? selectOption() : updateFilter()"
              class="form-control text-center" />
       <ng-container *ngFor="let error of Object.keys(messages.customValidations)">
         <span class="invalid-feedback text-center d-block"
              class="form-control text-center" />
       <ng-container *ngFor="let error of Object.keys(messages.customValidations)">
         <span class="invalid-feedback text-center d-block"
@@ -60,7 +60,7 @@
   </div>
 </ng-template>
 
   </div>
 </ng-template>
 
-<a class="select-menu-edit float-left"
+<a class="select-menu-edit float-start"
    [ngClass]="elemClass"
    [ngbPopover]="popTemplate"
    data-testid="select-menu-edit"
    [ngClass]="elemClass"
    [ngbPopover]="popTemplate"
    data-testid="select-menu-edit"
   <ng-content></ng-content>
 </a>
 
   <ng-content></ng-content>
 </a>
 
-<span class="form-text text-muted float-left"
+<span class="form-text text-muted float-start"
       *ngIf="data.length === 0 && !(!customBadges && options.length === 0)">
   {{ messages.empty }}
 </span>
 
       *ngIf="data.length === 0 && !(!customBadges && options.length === 0)">
   {{ messages.empty }}
 </span>
 
-<span class="form-text text-muted  float-left"
+<span class="form-text text-muted  float-start"
       *ngIf="!customBadges && options.length === 0">
   {{ messages.noOptions }}
 </span>
       *ngIf="!customBadges && options.length === 0">
   {{ messages.noOptions }}
 </span>
index cf8aa33d3bae4112a0515daa2e349b37f764a7b8..1e1606724ca4cf08192af846711a5a1f0a9b4bc4 100644 (file)
@@ -1,6 +1,7 @@
 @use './src/styles/vendor/variables' as vv;
 
 .no-margin-bottom {
 @use './src/styles/vendor/variables' as vv;
 
 .no-margin-bottom {
+  font-size: 0.875rem;
   margin-bottom: 0;
 }
 
   margin-bottom: 0;
 }
 
@@ -15,3 +16,8 @@
   color: vv.$gray-700;
   font-weight: bold;
 }
   color: vv.$gray-700;
   font-weight: bold;
 }
+
+a {
+  color: darken(vv.$primary, 10);
+  font-weight: bold;
+}
index 0602a4e59c8220a34efd6be3e43b08340d03d7b2..7068744e9f02882f04fa79c36a8d13371d58ad54 100644 (file)
   <div class="progress-bar bg-info"
        [ngClass]="{'bg-warning': usedPercentage/100 >= warningThreshold, 'bg-danger': usedPercentage/100 >= errorThreshold}"
        role="progressbar"
   <div class="progress-bar bg-info"
        [ngClass]="{'bg-warning': usedPercentage/100 >= warningThreshold, 'bg-danger': usedPercentage/100 >= errorThreshold}"
        role="progressbar"
+       [attr.aria-label]="{ title }"
+       i18n-aria-label="The title of this usage bar is { title }"
        [style.width]="usedPercentage + '%'">
     <span>{{ usedPercentage | number: '1.0-' + decimals }}%</span>
   </div>
   <div class="progress-bar bg-freespace"
        role="progressbar"
        [style.width]="usedPercentage + '%'">
     <span>{{ usedPercentage | number: '1.0-' + decimals }}%</span>
   </div>
   <div class="progress-bar bg-freespace"
        role="progressbar"
+       [attr.aria-label]="{ title }"
+       i18n-aria-label="The title of this usage bar is { title }"
        [style.width]="freePercentage + '%'">
   </div>
 </div>
        [style.width]="freePercentage + '%'">
   </div>
 </div>
index 203f2c9e05d962b5fe7d8243ac24bc35e9d68f8f..4877e891e1f124d015b47430e7eff0226c8f13a7 100644 (file)
@@ -22,6 +22,8 @@ export class UsageBarComponent implements OnChanges {
   decimals = 0;
   @Input()
   calculatePerc = true;
   decimals = 0;
   @Input()
   calculatePerc = true;
+  @Input()
+  title = $localize`usage`;
 
   usedPercentage: number;
   freePercentage: number;
 
   usedPercentage: number;
   freePercentage: number;
index ede8f2368b70f2405fc4ed9c40eef6a71d1025c3..fa6de840757f124f8ce66b0cb9fdf49db0a39cbb 100644 (file)
@@ -11,6 +11,7 @@ import { ComponentsModule } from '../components/components.module';
 import { PipesModule } from '../pipes/pipes.module';
 import { TableActionsComponent } from './table-actions/table-actions.component';
 import { TableKeyValueComponent } from './table-key-value/table-key-value.component';
 import { PipesModule } from '../pipes/pipes.module';
 import { TableActionsComponent } from './table-actions/table-actions.component';
 import { TableKeyValueComponent } from './table-key-value/table-key-value.component';
+import { TablePaginationComponent } from './table-pagination/table-pagination.component';
 import { TableComponent } from './table/table.component';
 
 @NgModule({
 import { TableComponent } from './table/table.component';
 
 @NgModule({
@@ -25,7 +26,18 @@ import { TableComponent } from './table/table.component';
     ComponentsModule,
     RouterModule
   ],
     ComponentsModule,
     RouterModule
   ],
-  declarations: [TableComponent, TableKeyValueComponent, TableActionsComponent],
-  exports: [TableComponent, NgxDatatableModule, TableKeyValueComponent, TableActionsComponent]
+  declarations: [
+    TableComponent,
+    TableKeyValueComponent,
+    TableActionsComponent,
+    TablePaginationComponent
+  ],
+  exports: [
+    TableComponent,
+    NgxDatatableModule,
+    TableKeyValueComponent,
+    TableActionsComponent,
+    TablePaginationComponent
+  ]
 })
 export class DataTableModule {}
 })
 export class DataTableModule {}
index 905aaa96b69be5721fad0edc874f2ce4ab198bbb..ef2a4481dbe25dd9d63dad89e2356022960634a0 100644 (file)
@@ -5,11 +5,12 @@
             class="btn btn-{{btnColor}}"
             [ngClass]="{'disabled': disableSelectionAction(currentAction)}"
             (click)="useClickAction(currentAction)"
             class="btn btn-{{btnColor}}"
             [ngClass]="{'disabled': disableSelectionAction(currentAction)}"
             (click)="useClickAction(currentAction)"
+            [disabled]="disableSelectionAction(currentAction)"
             [routerLink]="useRouterLink(currentAction)"
             [attr.aria-label]="currentAction.name"
             [preserveFragment]="currentAction.preserveFragment ? '' : null">
       <i [ngClass]="[currentAction.icon]"></i>
             [routerLink]="useRouterLink(currentAction)"
             [attr.aria-label]="currentAction.name"
             [preserveFragment]="currentAction.preserveFragment ? '' : null">
       <i [ngClass]="[currentAction.icon]"></i>
-      <span>{{ currentAction.name }}</span>
+      <span class="action-label">{{ currentAction.name }}</span>
     </button>
   </ng-container>
   <div class="btn-group"
     </button>
   </ng-container>
   <div class="btn-group"
@@ -17,7 +18,8 @@
        role="group"
        *ngIf="dropDownActions.length > 1"
        aria-label="Button group with nested dropdown">
        role="group"
        *ngIf="dropDownActions.length > 1"
        aria-label="Button group with nested dropdown">
-    <button class="btn btn-{{btnColor}} dropdown-toggle-split"
+    <button aria-label="dropdown-menu-toggle"
+            class="btn btn-{{btnColor}} dropdown-toggle-split"
             ngbDropdownToggle>
       <ng-container *ngIf="dropDownOnly">{{ dropDownOnly }} </ng-container>
       <span *ngIf="!dropDownOnly"
             ngbDropdownToggle>
       <ng-container *ngIf="dropDownOnly">{{ dropDownOnly }} </ng-container>
       <span *ngIf="!dropDownOnly"
index f996de72794e9d4cfdee4ad819e16eb4cc8762c8..084b466150a617a1771456b127665c7b0fc7190a 100644 (file)
@@ -1,8 +1,19 @@
+@use './src/styles/vendor/variables' as vv;
+
 button.disabled {
 button.disabled {
+  color: vv.$gray-500;
   cursor: default !important;
   pointer-events: auto;
 }
 
   cursor: default !important;
   pointer-events: auto;
 }
 
+button.dropdown-item:hover {
+  background-color: vv.$gray-300;
+}
+
 .action-icon {
   padding-right: 1.5rem;
 }
 .action-icon {
   padding-right: 1.5rem;
 }
+
+.action-label {
+  font-weight: bold;
+}
index 150d44241051e23a09a0216ebd59a7205dca495a..af493513eec099b6f49e3e440cecd93b8fff8354 100644 (file)
@@ -12,6 +12,7 @@ import { CdTableColumn } from '~/app/shared/models/cd-table-column';
 import { CdDatePipe } from '~/app/shared/pipes/cd-date.pipe';
 import { PipesModule } from '~/app/shared/pipes/pipes.module';
 import { configureTestBed } from '~/testing/unit-test-helper';
 import { CdDatePipe } from '~/app/shared/pipes/cd-date.pipe';
 import { PipesModule } from '~/app/shared/pipes/pipes.module';
 import { configureTestBed } from '~/testing/unit-test-helper';
+import { TablePaginationComponent } from '../table-pagination/table-pagination.component';
 import { TableComponent } from '../table/table.component';
 import { TableKeyValueComponent } from './table-key-value.component';
 
 import { TableComponent } from '../table/table.component';
 import { TableKeyValueComponent } from './table-key-value.component';
 
@@ -20,7 +21,7 @@ describe('TableKeyValueComponent', () => {
   let fixture: ComponentFixture<TableKeyValueComponent>;
 
   configureTestBed({
   let fixture: ComponentFixture<TableKeyValueComponent>;
 
   configureTestBed({
-    declarations: [TableComponent, TableKeyValueComponent],
+    declarations: [TableComponent, TableKeyValueComponent, TablePaginationComponent],
     imports: [
       FormsModule,
       NgxDatatableModule,
     imports: [
       FormsModule,
       NgxDatatableModule,
diff --git a/ceph/src/pybind/mgr/dashboard/frontend/src/app/shared/datatable/table-pagination/table-pagination.component.html b/ceph/src/pybind/mgr/dashboard/frontend/src/app/shared/datatable/table-pagination/table-pagination.component.html
new file mode 100644 (file)
index 0000000..7582c76
--- /dev/null
@@ -0,0 +1,58 @@
+<nav class="pagination"
+     aria-label="Pagination"
+     i18n-aria-label>
+  <button
+    class="pagination__btn pagination__btn_first"
+    aria-label="Go to first page"
+    i18n-aria-label
+    [disabled]="!canPrevious()"
+    (click)="selectPage(1)"
+  >
+    <i class="fa fa-angle-double-left"
+       aria-hidden="true"></i>
+  </button>
+  <button
+    class="pagination__btn pagination__btn_prev"
+    aria-label="Go to previous page"
+    i18n-aria-label
+    [disabled]="!canPrevious()"
+    (click)="prevPage()"
+  >
+    <i class="fa fa-angle-left"
+       aria-hidden="true"></i>
+  </button>
+  <div class="pagination__pages">
+    <input
+      #pageNumber
+      class="pagination__page_input"
+      aria-label="Current page"
+      i18n-aria-label
+      type="number"
+      min="1"
+      [max]="totalPages"
+      [value]="page"
+      (input)="selectPage(pageNumber.valueAsNumber)"
+    />
+    <span aria-hidden="true"> of {{ totalPages }} </span>
+  </div>
+  <button
+    class="pagination__btn pagination__btn_next"
+    aria-label="Go to next page"
+    i18n-aria-label
+    (click)="nextPage()"
+    [disabled]="!canNext()"
+  >
+    <i class="fa fa-angle-right"
+       aria-hidden="true"></i>
+  </button>
+  <button
+    class="pagination__btn pagination__btn_last"
+    aria-label="Go to last page"
+    i18n-aria-label
+    [disabled]="!canNext()"
+    (click)="selectPage(totalPages)"
+  >
+    <i class="fa fa-angle-double-right"
+       aria-hidden="true"></i>
+  </button>
+</nav>
diff --git a/ceph/src/pybind/mgr/dashboard/frontend/src/app/shared/datatable/table-pagination/table-pagination.component.scss b/ceph/src/pybind/mgr/dashboard/frontend/src/app/shared/datatable/table-pagination/table-pagination.component.scss
new file mode 100644 (file)
index 0000000..4455ded
--- /dev/null
@@ -0,0 +1,21 @@
+@use './src/styles/vendor/variables' as vv;
+
+.pagination {
+  align-items: center;
+  display: flex;
+}
+
+.pagination__btn {
+  background: none;
+  border: 0;
+
+  &:disabled {
+    color: vv.$gray-500;
+  }
+}
+
+.pagination__page_input {
+  border: 1px solid vv.$gray-500;
+  border-radius: 0.25rem;
+  padding-left: 0.25rem;
+}
diff --git a/ceph/src/pybind/mgr/dashboard/frontend/src/app/shared/datatable/table-pagination/table-pagination.component.spec.ts b/ceph/src/pybind/mgr/dashboard/frontend/src/app/shared/datatable/table-pagination/table-pagination.component.spec.ts
new file mode 100644 (file)
index 0000000..b220b59
--- /dev/null
@@ -0,0 +1,54 @@
+import { ComponentFixture, TestBed } from '@angular/core/testing';
+
+import { TablePaginationComponent } from './table-pagination.component';
+
+describe('TablePaginationComponent', () => {
+  let component: TablePaginationComponent;
+  let fixture: ComponentFixture<TablePaginationComponent>;
+  let element: HTMLElement;
+
+  beforeEach(async () => {
+    await TestBed.configureTestingModule({
+      declarations: [TablePaginationComponent]
+    }).compileComponents();
+  });
+
+  beforeEach(() => {
+    fixture = TestBed.createComponent(TablePaginationComponent);
+    component = fixture.componentInstance;
+    element = fixture.debugElement.nativeElement;
+    component.page = 1;
+    component.size = 10;
+    component.count = 100;
+    fixture.detectChanges();
+  });
+
+  it('should create', () => {
+    expect(component).toBeTruthy();
+  });
+
+  it('should contain valid inputs', () => {
+    expect(component.page).toEqual(1);
+    expect(component.size).toEqual(10);
+    expect(component.count).toEqual(100);
+  });
+
+  it('should change page', () => {
+    const input = element.querySelector('input');
+    input.value = '5';
+    input.dispatchEvent(new Event('input'));
+    expect(component.page).toEqual(5);
+  });
+
+  it('should disable prev button', () => {
+    const prev: HTMLButtonElement = element.querySelector('.pagination__btn_prev');
+    expect(prev.disabled).toBeTruthy();
+  });
+
+  it('should disable next button', () => {
+    const next: HTMLButtonElement = element.querySelector('.pagination__btn_next');
+    component.size = 100;
+    fixture.detectChanges();
+    expect(next.disabled).toBeTruthy();
+  });
+});
diff --git a/ceph/src/pybind/mgr/dashboard/frontend/src/app/shared/datatable/table-pagination/table-pagination.component.ts b/ceph/src/pybind/mgr/dashboard/frontend/src/app/shared/datatable/table-pagination/table-pagination.component.ts
new file mode 100644 (file)
index 0000000..5080f05
--- /dev/null
@@ -0,0 +1,110 @@
+import { Component, EventEmitter, Input, Output } from '@angular/core';
+
+@Component({
+  selector: 'cd-table-pagination',
+  templateUrl: './table-pagination.component.html',
+  styleUrls: ['./table-pagination.component.scss']
+})
+export class TablePaginationComponent {
+  private _size = 0;
+  private _count = 0;
+  private _page = 1;
+  pages: any;
+
+  @Input()
+  set size(value: number) {
+    this._size = value;
+    this.pages = this.calcPages();
+  }
+
+  get size(): number {
+    return this._size;
+  }
+
+  @Input()
+  set page(value: number) {
+    this._page = value;
+  }
+
+  get page(): number {
+    return this._page;
+  }
+
+  @Input()
+  set count(value: number) {
+    this._count = value;
+  }
+
+  get count(): number {
+    return this._count;
+  }
+
+  get totalPages(): number {
+    const count = this.size < 1 ? 1 : Math.ceil(this._count / this._size);
+    return Math.max(count || 0, 1);
+  }
+
+  @Output() pageChange: EventEmitter<any> = new EventEmitter();
+
+  canPrevious(): boolean {
+    return this._page > 1;
+  }
+
+  canNext(): boolean {
+    return this._page < this.totalPages;
+  }
+
+  prevPage(): void {
+    this.selectPage(this._page - 1);
+  }
+
+  nextPage(): void {
+    this.selectPage(this._page + 1);
+  }
+
+  selectPage(page: number): void {
+    if (page > 0 && page <= this.totalPages && page !== this.page) {
+      this._page = page;
+      this.pageChange.emit({
+        page
+      });
+    } else if (page > 0 && page >= this.totalPages) {
+      this._page = this.totalPages;
+      this.pageChange.emit({
+        page: this.totalPages
+      });
+    }
+  }
+
+  calcPages(page?: number): any[] {
+    const pages = [];
+    let startPage = 1;
+    let endPage = this.totalPages;
+    const maxSize = 5;
+    const isMaxSized = maxSize < this.totalPages;
+
+    page = page || this.page;
+
+    if (isMaxSized) {
+      startPage = page - Math.floor(maxSize / 2);
+      endPage = page + Math.floor(maxSize / 2);
+
+      if (startPage < 1) {
+        startPage = 1;
+        endPage = Math.min(startPage + maxSize - 1, this.totalPages);
+      } else if (endPage > this.totalPages) {
+        startPage = Math.max(this.totalPages - maxSize + 1, 1);
+        endPage = this.totalPages;
+      }
+    }
+
+    for (let num = startPage; num <= endPage; num++) {
+      pages.push({
+        number: num,
+        text: <string>(<any>num)
+      });
+    }
+
+    return pages;
+  }
+}
index d7dd7e5c703ffbbf4b8a69e13fe82200a351cea2..fc7b9f6e54ea291b86d3410521a8621dc6a6a1a9 100644 (file)
@@ -21,7 +21,8 @@
            placement="bottom-right"
            class="tc_filter_name">
         <button ngbDropdownToggle
            placement="bottom-right"
            class="tc_filter_name">
         <button ngbDropdownToggle
-                class="btn btn-light">
+                class="btn btn-light"
+                title="Filter">
           <i [ngClass]="[icons.large, icons.filter]"></i>
           {{ selectedFilter.column.name }}
         </button>
           <i [ngClass]="[icons.large, icons.filter]"></i>
           {{ selectedFilter.column.name }}
         </button>
     <!-- search -->
     <div class="input-group search"
          *ngIf="searchField">
     <!-- search -->
     <div class="input-group search"
          *ngIf="searchField">
-      <span class="input-group-prepend">
-        <span class="input-group-text">
-          <i [ngClass]="[icons.search]"></i>
-        </span>
+      <span class="input-group-text">
+        <i [ngClass]="[icons.search]"></i>
       </span>
       </span>
-      <input class="form-control"
+      <input aria-label="search"
+             class="form-control"
              type="text"
              [(ngModel)]="search"
              (keyup)="updateFilter()">
              type="text"
              [(ngModel)]="search"
              (keyup)="updateFilter()">
-      <div class="input-group-append">
-        <button type="button"
-                class="btn btn-light"
-                (click)="onClearSearch()">
-          <i class="icon-prepend {{ icons.destroy }}"></i>
-        </button>
-      </div>
+      <button type="button"
+              class="btn btn-light"
+              title="Clear"
+              (click)="onClearSearch()">
+        <i class="icon-prepend {{ icons.destroy }}"></i>
+      </button>
     </div>
     <!-- end search -->
 
     <!-- pagination limit -->
     <div class="input-group dataTables_paginate"
          *ngIf="limit">
     </div>
     <!-- end search -->
 
     <!-- pagination limit -->
     <div class="input-group dataTables_paginate"
          *ngIf="limit">
-      <input class="form-control"
+      <input aria-label="table pagination"
+             class="form-control"
              type="number"
              min="1"
              max="9999"
              type="number"
              min="1"
              max="9999"
@@ -97,7 +97,8 @@
            autoClose="outside"
            class="tc_menuitem">
         <button ngbDropdownToggle
            autoClose="outside"
            class="tc_menuitem">
         <button ngbDropdownToggle
-                class="btn btn-light tc_columnBtn">
+                class="btn btn-light tc_columnBtn"
+                title="toggle columns">
           <i [ngClass]="[icons.large, icons.table]"></i>
         </button>
         <div ngbDropdownMenu>
           <i [ngClass]="[icons.large, icons.table]"></i>
         </button>
         <div ngbDropdownMenu>
                 <input class="custom-control-input"
                        type="checkbox"
                        [name]="column.prop"
                 <input class="custom-control-input"
                        type="checkbox"
                        [name]="column.prop"
-                       [id]="column.prop"
+                       id="{{ column.prop }}{{ tableName }}"
                        [checked]="!column.isHidden">
                 <label class="custom-control-label"
                        [checked]="!column.isHidden">
                 <label class="custom-control-label"
-                       [for]="column.prop">{{ column.name }}</label>
+                       for="{{ column.prop }}{{ tableName }}">{{ column.name }}</label>
               </div>
             </button>
           </ng-container>
               </div>
             </button>
           </ng-container>
       <button type="button"
               [class]="'btn btn-' + status.type"
               [ngbTooltip]="status.msg"
       <button type="button"
               [class]="'btn btn-' + status.type"
               [ngbTooltip]="status.msg"
-              (click)="refreshBtn()">
+              (click)="refreshBtn()"
+              title="Refresh">
         <i [ngClass]="[icons.large, icons.refresh]"
            [class.fa-spin]="updating || loadingIndicator"></i>
       </button>
         <i [ngClass]="[icons.large, icons.refresh]"
            [class.fa-spin]="updating || loadingIndicator"></i>
       </button>
     <div class="filter-chips">
       <span *ngFor="let filter of columnFilters">
         <span *ngIf="filter.value"
     <div class="filter-chips">
       <span *ngFor="let filter of columnFilters">
         <span *ngIf="filter.value"
-              class="badge badge-info mr-2">
-          <span class="mr-2">{{ filter.column.name }}: {{ filter.value.formatted }}</span>
+              class="badge badge-info me-2">
+          <span class="me-2">{{ filter.column.name }}: {{ filter.value.formatted }}</span>
           <a class="badge-remove"
              (click)="onChangeFilter(filter); false">
             <i [ngClass]="[icons.destroy]"
           <a class="badge-remove"
              (click)="onChangeFilter(filter); false">
             <i [ngClass]="[icons.destroy]"
                  [rowIdentity]="rowIdentity()"
                  [rowHeight]="'auto'">
 
                  [rowIdentity]="rowIdentity()"
                  [rowHeight]="'auto'">
 
+    <!-- Row Selection Template-->
+    <ng-template #rowSelectionTpl
+                 let-value="value"
+                 let-isSelected="isSelected"
+                 ngx-datatable-cell-template>
+      <input type="checkbox"
+             [attr.aria-label]="isSelected ? 'selected' : 'select'"
+             [checked]="isSelected"
+             class="cd-datatable-checkbox" />
+    </ng-template>
+
     <!-- Row Detail Template -->
     <ngx-datatable-row-detail rowHeight="auto"
                               #detailRow>
     <!-- Row Detail Template -->
     <ngx-datatable-row-detail rowHeight="auto"
                               #detailRow>
             {{ rowCount }} <ng-container i18n="X total">total</ng-container>
           </ng-template>
         </div>
             {{ rowCount }} <ng-container i18n="X total">total</ng-container>
           </ng-template>
         </div>
-        <datatable-pager [pagerLeftArrowIcon]="paginationClasses.pagerPrevious"
-                         [pagerRightArrowIcon]="paginationClasses.pagerNext"
-                         [pagerPreviousIcon]="paginationClasses.pagerLeftArrow"
-                         [pagerNextIcon]="paginationClasses.pagerRightArrow"
-                         [page]="curPage"
-                         [size]="pageSize"
-                         [count]="rowCount"
-                         [hidden]="!((rowCount / pageSize) > 1)"
-                         (change)="table.onFooterPage($event)">
-        </datatable-pager>
+        <cd-table-pagination [page]="curPage"
+                             [size]="pageSize"
+                             [count]="rowCount"
+                             [hidden]="!((rowCount / pageSize) > 1)"
+                             (pageChange)="table.onFooterPage($event)"></cd-table-pagination>
       </ng-template>
     </ngx-datatable-footer>
   </ngx-datatable>
       </ng-template>
     </ngx-datatable-footer>
   </ngx-datatable>
index 57b8e48de9cd6de1def089c19786806b4efbb257..8775b182ae7fc11ad83f482f9dc5395d791d838e 100644 (file)
       }
 
       &.datatable-row-odd {
       }
 
       &.datatable-row-odd {
-        background-color: vv.$gray-100;
+        background-color: vv.$white;
       }
 
       &.active,
       }
 
       &.active,
 
   .cd-datatable-checkbox {
     text-align: center;
 
   .cd-datatable-checkbox {
     text-align: center;
+
+    &:checked {
+      accent-color: vv.$primary;
+    }
   }
 }
 
   }
 }
 
index f0f649780afed5270d91d24d2e183ab16b58937c..53c246d6e0bc66a42843d6cfabda3da323ad3f6a 100644 (file)
@@ -16,6 +16,7 @@ import { CdTableFetchDataContext } from '~/app/shared/models/cd-table-fetch-data
 import { CdTableSelection } from '~/app/shared/models/cd-table-selection';
 import { PipesModule } from '~/app/shared/pipes/pipes.module';
 import { configureTestBed } from '~/testing/unit-test-helper';
 import { CdTableSelection } from '~/app/shared/models/cd-table-selection';
 import { PipesModule } from '~/app/shared/pipes/pipes.module';
 import { configureTestBed } from '~/testing/unit-test-helper';
+import { TablePaginationComponent } from '../table-pagination/table-pagination.component';
 import { TableComponent } from './table.component';
 
 describe('TableComponent', () => {
 import { TableComponent } from './table.component';
 
 describe('TableComponent', () => {
@@ -39,7 +40,7 @@ describe('TableComponent', () => {
   };
 
   configureTestBed({
   };
 
   configureTestBed({
-    declarations: [TableComponent],
+    declarations: [TableComponent, TablePaginationComponent],
     imports: [
       BrowserAnimationsModule,
       NgxDatatableModule,
     imports: [
       BrowserAnimationsModule,
       NgxDatatableModule,
@@ -568,33 +569,15 @@ describe('TableComponent', () => {
       expect(executingElement.nativeElement.textContent.trim()).toBe(`(${state})`);
     };
 
       expect(executingElement.nativeElement.textContent.trim()).toBe(`(${state})`);
     };
 
-    it('should display executing template', () => {
+    it.only('should display executing template', () => {
       testExecutingTemplate();
     });
 
       testExecutingTemplate();
     });
 
-    it('should display executing template with custom classes', () => {
+    it.only('should display executing template with custom classes', () => {
       testExecutingTemplate({ valueClass: 'a b', executingClass: 'c d' });
     });
   });
 
       testExecutingTemplate({ valueClass: 'a b', executingClass: 'c d' });
     });
   });
 
-  describe('test unselect functionality of rows', () => {
-    beforeEach(() => {
-      component.autoReload = -1;
-      component.selectionType = 'single';
-      fixture.detectChanges();
-    });
-
-    it('should unselect row on clicking on it again', () => {
-      const rowCellDebugElement = fixture.debugElement.query(By.css('datatable-body-cell'));
-
-      rowCellDebugElement.triggerEventHandler('click', null);
-      expect(component.selection.selected.length).toEqual(1);
-
-      rowCellDebugElement.triggerEventHandler('click', null);
-      expect(component.selection.selected.length).toEqual(0);
-    });
-  });
-
   describe('reload data', () => {
     beforeEach(() => {
       component.ngOnInit();
   describe('reload data', () => {
     beforeEach(() => {
       component.ngOnInit();
index 4f8ca7133036707b8bc905566ad45509c89f86db..c6c9369acfc637dd0c3bdb7235704ec220602acf 100644 (file)
@@ -70,6 +70,8 @@ export class TableComponent implements AfterContentChecked, OnInit, OnChanges, O
   timeAgoTpl: TemplateRef<any>;
   @ViewChild('rowDetailsTpl', { static: true })
   rowDetailsTpl: TemplateRef<any>;
   timeAgoTpl: TemplateRef<any>;
   @ViewChild('rowDetailsTpl', { static: true })
   rowDetailsTpl: TemplateRef<any>;
+  @ViewChild('rowSelectionTpl', { static: true })
+  rowSelectionTpl: TemplateRef<any>;
 
   // This is the array with the items to be shown.
   @Input()
 
   // This is the array with the items to be shown.
   @Input()
@@ -331,10 +333,6 @@ export class TableComponent implements AfterContentChecked, OnInit, OnChanges, O
     } else {
       this.useData();
     }
     } else {
       this.useData();
     }
-
-    if (this.selectionType === 'single') {
-      this.table.selectCheck = this.singleSelectCheck.bind(this);
-    }
   }
 
   initUserConfig() {
   }
 
   initUserConfig() {
@@ -432,9 +430,10 @@ export class TableComponent implements AfterContentChecked, OnInit, OnChanges, O
         resizeable: false,
         sortable: false,
         draggable: false,
         resizeable: false,
         sortable: false,
         draggable: false,
-        checkboxable: true,
+        checkboxable: false,
         canAutoResize: false,
         cellClass: 'cd-datatable-checkbox',
         canAutoResize: false,
         cellClass: 'cd-datatable-checkbox',
+        cellTemplate: this.rowSelectionTpl,
         width: 30
       });
     }
         width: 30
       });
     }
@@ -769,10 +768,6 @@ export class TableComponent implements AfterContentChecked, OnInit, OnChanges, O
     this.updateSelection.emit(_.clone(this.selection));
   }
 
     this.updateSelection.emit(_.clone(this.selection));
   }
 
-  private singleSelectCheck(row: any) {
-    return this.selection.selected.indexOf(row) === -1;
-  }
-
   toggleColumn(column: CdTableColumn) {
     const prop: TableColumnProp = column.prop;
     const hide = !column.isHidden;
   toggleColumn(column: CdTableColumn) {
     const prop: TableColumnProp = column.prop;
     const hide = !column.isHidden;
index 5f130902a23c59087961d3e20f5e8e64c8bbedf4..e37cf4d5eee3e4a36507826fd42f5271743fdaef 100644 (file)
@@ -19,7 +19,7 @@ export class AuthStorageDirective {
     private authStorageService: AuthStorageService
   ) {}
 
     private authStorageService: AuthStorageService
   ) {}
 
-  @Input('cdScope') set cdScope(condition: Condition) {
+  @Input() set cdScope(condition: Condition) {
     this.permissions = this.authStorageService.getPermissions();
     if (this.isAuthorized(condition)) {
       this.viewContainer.createEmbeddedView(this.templateRef);
     this.permissions = this.authStorageService.getPermissions();
     if (this.isAuthorized(condition)) {
       this.viewContainer.createEmbeddedView(this.templateRef);
index dc34b9f3c30bc21288826fb7c8b8491ee2f8a7d4..69955981aaf751786ec99db28a71419337ee7856 100644 (file)
@@ -3,7 +3,7 @@ import { AfterViewInit, Directive, ElementRef, Input } from '@angular/core';
 import _ from 'lodash';
 
 @Directive({
 import _ from 'lodash';
 
 @Directive({
-  selector: '[autofocus]' // tslint:disable-line
+  selector: '[autofocus]' // eslint-disable-line
 })
 export class AutofocusDirective implements AfterViewInit {
   private focus = true;
 })
 export class AutofocusDirective implements AfterViewInit {
   private focus = true;
index 8bc3b05a2919e0ec6ed2195c43c1654e2f9b4446..cc7782da7552173ffb6e15c857012360f5a80a83 100644 (file)
@@ -47,7 +47,7 @@ describe('FormLoadingDirective', () => {
   });
 
   it('should create an instance', () => {
   });
 
   it('should create an instance', () => {
-    const directive = new FormLoadingDirective(null, null, null);
+    const directive = new FormLoadingDirective(null, null);
     expect(directive).toBeTruthy();
   });
 
     expect(directive).toBeTruthy();
   });
 
index e83614b84a5553f5e1431665e28ec4545d536f9f..bf18a51e94e9a04b0afbabd933c97cbbf355d8dc 100644 (file)
@@ -1,10 +1,4 @@
-import {
-  ComponentFactoryResolver,
-  Directive,
-  Input,
-  TemplateRef,
-  ViewContainerRef
-} from '@angular/core';
+import { Directive, Input, TemplateRef, ViewContainerRef } from '@angular/core';
 
 import { AlertPanelComponent } from '../components/alert-panel/alert-panel.component';
 import { LoadingPanelComponent } from '../components/loading-panel/loading-panel.component';
 
 import { AlertPanelComponent } from '../components/alert-panel/alert-panel.component';
 import { LoadingPanelComponent } from '../components/loading-panel/loading-panel.component';
@@ -14,31 +8,26 @@ import { LoadingStatus } from '../forms/cd-form';
   selector: '[cdFormLoading]'
 })
 export class FormLoadingDirective {
   selector: '[cdFormLoading]'
 })
 export class FormLoadingDirective {
-  constructor(
-    private templateRef: TemplateRef<any>,
-    private viewContainer: ViewContainerRef,
-    private componentFactoryResolver: ComponentFactoryResolver
-  ) {}
+  constructor(private templateRef: TemplateRef<any>, private viewContainer: ViewContainerRef) {}
 
 
-  @Input('cdFormLoading') set cdFormLoading(condition: LoadingStatus) {
-    let factory: any;
+  @Input() set cdFormLoading(condition: LoadingStatus) {
     let content: any;
 
     this.viewContainer.clear();
 
     switch (condition) {
       case LoadingStatus.Loading:
     let content: any;
 
     this.viewContainer.clear();
 
     switch (condition) {
       case LoadingStatus.Loading:
-        factory = this.componentFactoryResolver.resolveComponentFactory(LoadingPanelComponent);
         content = this.resolveNgContent($localize`Loading form data...`);
         content = this.resolveNgContent($localize`Loading form data...`);
-        this.viewContainer.createComponent(factory, null, null, content);
+        this.viewContainer.createComponent(LoadingPanelComponent, { projectableNodes: content });
         break;
       case LoadingStatus.Ready:
         this.viewContainer.createEmbeddedView(this.templateRef);
         break;
       case LoadingStatus.Error:
         break;
       case LoadingStatus.Ready:
         this.viewContainer.createEmbeddedView(this.templateRef);
         break;
       case LoadingStatus.Error:
-        factory = this.componentFactoryResolver.resolveComponentFactory(AlertPanelComponent);
         content = this.resolveNgContent($localize`Form data could not be loaded.`);
         content = this.resolveNgContent($localize`Form data could not be loaded.`);
-        const componentRef = this.viewContainer.createComponent(factory, null, null, content);
+        const componentRef = this.viewContainer.createComponent(AlertPanelComponent, {
+          projectableNodes: content
+        });
         (<AlertPanelComponent>componentRef.instance).type = 'error';
         break;
     }
         (<AlertPanelComponent>componentRef.instance).type = 'error';
         break;
     }
index 86afc72a562d0af2eef642f4eb89b828afb947a7..c88afa69a58e02c1529cd5f71c0a6319c8fdba24 100644 (file)
@@ -34,7 +34,7 @@ export function controlPath(name: string, parent: ControlContainer): string[] {
 }
 
 @Directive({
 }
 
 @Directive({
-  // tslint:disable-next-line:directive-selector
+  // eslint-disable-next-line
   selector: '.form-control,.form-check-input,.custom-control-input'
 })
 export class CdFormControlDirective {
   selector: '.form-control,.form-check-input,.custom-control-input'
 })
 export class CdFormControlDirective {
index 5f6b11de11cd4536a70e275d72e9ea915d086558..adac343d06b8e8af563fa0e0af7c357f3a275090 100644 (file)
@@ -36,7 +36,7 @@ import {
 import { FormControlName } from '@angular/forms';
 
 @Directive({
 import { FormControlName } from '@angular/forms';
 
 @Directive({
-  // tslint:disable-next-line:directive-selector
+  // eslint-disable-next-line
   selector: '.form-group'
 })
 export class CdFormGroupDirective {
   selector: '.form-group'
 })
 export class CdFormGroupDirective {
index a88011d356646f72d810fb8271a2835da9f939e5..4cb4f4dfef799f18c688a633450f6e0f1962162f 100644 (file)
@@ -29,7 +29,7 @@ import { Directive, EventEmitter, HostListener, Input, Output } from '@angular/c
 import { AbstractControl, FormArray, FormControl, FormGroup } from '@angular/forms';
 
 @Directive({
 import { AbstractControl, FormArray, FormControl, FormGroup } from '@angular/forms';
 
 @Directive({
-  // tslint:disable-next-line:directive-selector
+  // eslint-disable-next-line
   selector: '[formGroup]'
 })
 export class CdFormValidationDirective {
   selector: '[formGroup]'
 })
 export class CdFormValidationDirective {
diff --git a/ceph/src/pybind/mgr/dashboard/frontend/src/app/shared/enum/health-label.enum.ts b/ceph/src/pybind/mgr/dashboard/frontend/src/app/shared/enum/health-label.enum.ts
new file mode 100644 (file)
index 0000000..e2e1c0b
--- /dev/null
@@ -0,0 +1,5 @@
+export enum HealthLabel {
+  HEALTH_ERR = 'error',
+  HEALTH_WARN = 'warning',
+  HEALTH_OK = 'ok'
+}
index 6b65f04e8cb2f47af1489ba22dc7d5177fa4d966..a08bfcecc3603f31e6f05b6245fe4fdb2f78e65f 100644 (file)
@@ -53,6 +53,7 @@ export enum Icons {
   health = 'fa fa-heartbeat', // Health
   circle = 'fa fa-circle', // Circle
   bell = 'fa fa-bell', // Notification
   health = 'fa fa-heartbeat', // Health
   circle = 'fa fa-circle', // Circle
   bell = 'fa fa-bell', // Notification
+  mute = 'fa fa-bell-slash', // Mute or silence
   tag = 'fa fa-tag', // Tag, Badge
   leftArrow = 'fa fa-angle-left', // Left facing angle
   rightArrow = 'fa fa-angle-right', // Right facing angle
   tag = 'fa fa-tag', // Tag, Badge
   leftArrow = 'fa fa-angle-left', // Left facing angle
   rightArrow = 'fa fa-angle-right', // Right facing angle
index b7b8862954baeb61433e8255a5725e3d5b836379..5f69f1e1e8164e51efbf9923dbb60e966334a35e 100644 (file)
@@ -1,3 +1,5 @@
+import { PrometheusRule } from './prometheus-alerts';
+
 export class AlertmanagerSilenceMatcher {
   name: string;
   value: any;
 export class AlertmanagerSilenceMatcher {
   name: string;
   value: any;
@@ -20,4 +22,5 @@ export class AlertmanagerSilence {
   status?: {
     state: 'expired' | 'active' | 'pending';
   };
   status?: {
     state: 'expired' | 'active' | 'pending';
   };
+  silencedAlerts?: PrometheusRule[];
 }
 }
index c283c5d801d23f86272aa83dd7cd8abb4b38147b..ddc737c2ddeea215a2afc5df2a2d84de8174286c 100644 (file)
@@ -29,6 +29,8 @@ export class CdNotification extends CdNotificationConfig {
   iconClass: string;
   duration: number;
   borderClass: string;
   iconClass: string;
   duration: number;
   borderClass: string;
+  alertSilenced = false;
+  silenceId?: string;
 
   private textClasses = ['text-danger', 'text-info', 'text-success'];
   private iconClasses = [Icons.warning, Icons.info, Icons.check];
 
   private textClasses = ['text-danger', 'text-info', 'text-success'];
   private iconClasses = [Icons.warning, Icons.info, Icons.check];
index 7937d82e6f3e62cf2d04e7eb872b12c9bed09a4d..0df2d2ebbe071ed14b037aa4532d40030a642b1d 100644 (file)
@@ -23,15 +23,22 @@ export class CdTableFetchDataContext {
   }
 
   toParams(): HttpParams {
   }
 
   toParams(): HttpParams {
+    if (Number.isNaN(this.pageInfo.offset)) {
+      this.pageInfo.offset = 0;
+    }
+
     if (this.pageInfo.limit === null) {
       this.pageInfo.limit = 0;
     }
     if (this.pageInfo.limit === null) {
       this.pageInfo.limit = 0;
     }
+
     if (!this.search) {
       this.search = '';
     }
     if (!this.search) {
       this.search = '';
     }
+
     if (!this.sort || this.sort.length < 2) {
       this.sort = '+name';
     }
     if (!this.sort || this.sort.length < 2) {
       this.sort = '+name';
     }
+
     return new HttpParams({
       fromObject: {
         offset: String(this.pageInfo.offset * this.pageInfo.limit),
     return new HttpParams({
       fromObject: {
         offset: String(this.pageInfo.offset * this.pageInfo.limit),
index 90817c89f9d06f519017fbda93320fdf669257fe..69ab3f5f3ca14427ca258e7080372b29a3bc9200 100644 (file)
@@ -8,6 +8,7 @@ export interface CephDevice {
   life_expectancy_min?: string;
   life_expectancy_max?: string;
   life_expectancy_stamp?: string;
   life_expectancy_min?: string;
   life_expectancy_max?: string;
   life_expectancy_stamp?: string;
+  life_expectancy_enabled?: boolean;
 }
 
 /**
 }
 
 /**
diff --git a/ceph/src/pybind/mgr/dashboard/frontend/src/app/shared/pipes/health-label.pipe.spec.ts b/ceph/src/pybind/mgr/dashboard/frontend/src/app/shared/pipes/health-label.pipe.spec.ts
new file mode 100644 (file)
index 0000000..fb40c3d
--- /dev/null
@@ -0,0 +1,24 @@
+import { HealthLabelPipe } from './health-label.pipe';
+
+describe('HealthLabelPipe', () => {
+  const pipe = new HealthLabelPipe();
+  it('create an instance', () => {
+    expect(pipe).toBeTruthy();
+  });
+
+  it('transforms "HEALTH_OK"', () => {
+    expect(pipe.transform('HEALTH_OK')).toEqual('ok');
+  });
+
+  it('transforms "HEALTH_WARN"', () => {
+    expect(pipe.transform('HEALTH_WARN')).toEqual('warning');
+  });
+
+  it('transforms "HEALTH_ERR"', () => {
+    expect(pipe.transform('HEALTH_ERR')).toEqual('error');
+  });
+
+  it('transforms others', () => {
+    expect(pipe.transform('abc')).toBe(null);
+  });
+});
diff --git a/ceph/src/pybind/mgr/dashboard/frontend/src/app/shared/pipes/health-label.pipe.ts b/ceph/src/pybind/mgr/dashboard/frontend/src/app/shared/pipes/health-label.pipe.ts
new file mode 100644 (file)
index 0000000..cb91d5a
--- /dev/null
@@ -0,0 +1,12 @@
+import { Pipe, PipeTransform } from '@angular/core';
+
+import { HealthLabel } from '~/app/shared/enum/health-label.enum';
+
+@Pipe({
+  name: 'healthLabel'
+})
+export class HealthLabelPipe implements PipeTransform {
+  transform(value: any): any {
+    return Object.keys(HealthLabel).includes(value as HealthLabel) ? HealthLabel[value] : null;
+  }
+}
index 91d611c0a55fc5c982bb7821d847e5772f0593bb..5094a9913355e6f61596dd23ba6dcb76dd24f9f4 100755 (executable)
@@ -15,6 +15,7 @@ import { EmptyPipe } from './empty.pipe';
 import { EncodeUriPipe } from './encode-uri.pipe';
 import { FilterPipe } from './filter.pipe';
 import { HealthColorPipe } from './health-color.pipe';
 import { EncodeUriPipe } from './encode-uri.pipe';
 import { FilterPipe } from './filter.pipe';
 import { HealthColorPipe } from './health-color.pipe';
+import { HealthLabelPipe } from './health-label.pipe';
 import { IopsPipe } from './iops.pipe';
 import { IscsiBackstorePipe } from './iscsi-backstore.pipe';
 import { JoinPipe } from './join.pipe';
 import { IopsPipe } from './iops.pipe';
 import { IscsiBackstorePipe } from './iscsi-backstore.pipe';
 import { JoinPipe } from './join.pipe';
@@ -40,6 +41,7 @@ import { UpperFirstPipe } from './upper-first.pipe';
     DimlessBinaryPipe,
     DimlessBinaryPerSecondPipe,
     HealthColorPipe,
     DimlessBinaryPipe,
     DimlessBinaryPerSecondPipe,
     HealthColorPipe,
+    HealthLabelPipe,
     DimlessPipe,
     CephShortVersionPipe,
     CephReleaseNamePipe,
     DimlessPipe,
     CephShortVersionPipe,
     CephReleaseNamePipe,
@@ -71,6 +73,7 @@ import { UpperFirstPipe } from './upper-first.pipe';
     DimlessBinaryPipe,
     DimlessBinaryPerSecondPipe,
     HealthColorPipe,
     DimlessBinaryPipe,
     DimlessBinaryPerSecondPipe,
     HealthColorPipe,
+    HealthLabelPipe,
     DimlessPipe,
     CephShortVersionPipe,
     CephReleaseNamePipe,
     DimlessPipe,
     CephShortVersionPipe,
     CephReleaseNamePipe,
index 028dd90ea39684f174fd8f6007a48697741691b0..febbec1638fe839956b1185075497a55f9adede0 100644 (file)
@@ -243,7 +243,7 @@ describe('NotificationService', () => {
       service.show(NotificationType.info, 'Some info');
       expect(toastr.info).toHaveBeenCalledWith(
         `<small class="date">${time}</small>` +
       service.show(NotificationType.info, 'Some info');
       expect(toastr.info).toHaveBeenCalledWith(
         `<small class="date">${time}</small>` +
-          '<i class="float-right custom-icon ceph-icon" title="Ceph"></i>',
+          '<i class="float-end custom-icon ceph-icon" title="Ceph"></i>',
         'Some info',
         undefined
       );
         'Some info',
         undefined
       );
@@ -257,7 +257,7 @@ describe('NotificationService', () => {
       expect(toastr.error).toHaveBeenCalledWith(
         'Some operation failed<br>' +
           `<small class="date">${time}</small>` +
       expect(toastr.error).toHaveBeenCalledWith(
         'Some operation failed<br>' +
           `<small class="date">${time}</small>` +
-          '<i class="float-right custom-icon ceph-icon" title="Ceph"></i>',
+          '<i class="float-end custom-icon ceph-icon" title="Ceph"></i>',
         'Some error',
         undefined
       );
         'Some error',
         undefined
       );
@@ -276,7 +276,7 @@ describe('NotificationService', () => {
       expect(toastr.success).toHaveBeenCalledWith(
         'Some alert resolved<br>' +
           `<small class="date">${time}</small>` +
       expect(toastr.success).toHaveBeenCalledWith(
         'Some alert resolved<br>' +
           `<small class="date">${time}</small>` +
-          '<i class="float-right custom-icon prometheus-icon" title="Prometheus"></i>',
+          '<i class="float-end custom-icon prometheus-icon" title="Prometheus"></i>',
         'Alert resolved',
         undefined
       );
         'Alert resolved',
         undefined
       );
index c05dbce0f571fb7ea173f64e095c84407a632d8c..52a06e30598d4d226f978571081ee4417e8e804a 100644 (file)
@@ -182,7 +182,7 @@ export class NotificationService {
   renderTimeAndApplicationHtml(notification: CdNotification): string {
     return `<small class="date">${this.cdDatePipe.transform(
       notification.timestamp
   renderTimeAndApplicationHtml(notification: CdNotification): string {
     return `<small class="date">${this.cdDatePipe.transform(
       notification.timestamp
-    )}</small><i class="float-right custom-icon ${notification.applicationClass}" title="${
+    )}</small><i class="float-end custom-icon ${notification.applicationClass}" title="${
       notification.application
     }"></i>`;
   }
       notification.application
     }"></i>`;
   }
index 7aec6d1d37ccc362e99fed2d28f8e7106b3f7ec2..d3dc1ea502074ba50d2db9c472d10617d30b8d64 100644 (file)
@@ -39,10 +39,7 @@ export class PrometheusSilenceMatcherService {
     return this.describeMatch(rules);
   }
 
     return this.describeMatch(rules);
   }
 
-  private getMatchedRules(
-    matcher: AlertmanagerSilenceMatcher,
-    rules: PrometheusRule[]
-  ): PrometheusRule[] {
+  getMatchedRules(matcher: AlertmanagerSilenceMatcher, rules: PrometheusRule[]): PrometheusRule[] {
     const attributePath = this.getAttributePath(matcher.name);
     return rules.filter((r) => _.get(r, attributePath) === matcher.value);
   }
     const attributePath = this.getAttributePath(matcher.name);
     return rules.filter((r) => _.get(r, attributePath) === matcher.value);
   }
index f399daf9b63780993ef27877decb13c3d7a677f5..c43d8150b03b1dbbdaf45a278ec22ac638710b7e 100644 (file)
@@ -20,4 +20,4 @@ platformBrowserDynamic()
       enableDebugTools(componentRef);
     }
   })
       enableDebugTools(componentRef);
     }
   })
-  .catch((err) => console.log(err));
+  .catch((err) => console.log(err)); // eslint-disable-line no-console
index 3368646d33aa0eac03fe9c3ac01e47f55bf878da..4ed5e6de958242f119b16f188ac4795566ae8c66 100644 (file)
@@ -22,18 +22,9 @@ import '@angular/localize/init';
  * BROWSER POLYFILLS
  */
 
  * BROWSER POLYFILLS
  */
 
-/** IE10 and IE11 requires the following for NgClass support on SVG elements */
-// import 'classlist.js';  // Run `npm install --save classlist.js`.
-
 /** IE10 and IE11 requires the following for the Reflect API. */
 // import 'core-js/es6/reflect';
 
 /** IE10 and IE11 requires the following for the Reflect API. */
 // import 'core-js/es6/reflect';
 
-/**
- * Required to support Web Animations `@angular/platform-browser/animations`.
- * Needed for: All but Chrome, Firefox and Opera. http://caniuse.com/#feat=web-animation
- **/
-// import 'web-animations-js';  // Run `npm install --save web-animations-js`.
-
 /***************************************************************************************************
  * Zone JS is required by Angular itself.
  */
 /***************************************************************************************************
  * Zone JS is required by Angular itself.
  */
index 3f76543571a4fdc6ca85cc09c785a7f72b96ebfc..1f7770aec46063828e46e2a6bc04b25b7dcdff5b 100644 (file)
@@ -1,6 +1,6 @@
 import '@angular/localize/init';
 
 import '@angular/localize/init';
 
-import 'jest-preset-angular';
+import 'jest-preset-angular/setup-jest';
 
 import './jestGlobalMocks';
 
 
 import './jestGlobalMocks';
 
index 099433d3148cc494089c1085700300078a2cfcf6..6253ec6cf46dc1511519c1a6d2831e73c7b802a2 100644 (file)
@@ -105,6 +105,37 @@ $grid-breakpoints: (
   color: $gray-700;
 }
 
   color: $gray-700;
 }
 
+.badge-cd-label-green {
+  background-color: $green-300;
+  color: $white;
+}
+
+.badge-cd-label-cyan {
+  background-color: $cyan-300;
+  color: $white;
+}
+
+.badge-cd-label-purple {
+  background-color: $purple-300;
+  color: $white;
+}
+
+.badge-cd-label-light-blue {
+  background-color: $light-blue-300;
+  color: $white;
+}
+
+.badge-cd-label-gold {
+  background-color: $gold-300;
+  color: $white;
+}
+
+.badge-cd-label-light-green {
+  background-color: $light-green-300;
+  color: $white;
+  font-weight: bolder;
+}
+
 // angular-tree-component
 tree-root {
   tree-viewport {
 // angular-tree-component
 tree-root {
   tree-viewport {
@@ -132,7 +163,57 @@ tags-input .tags {
   pointer-events: none;
 }
 
   pointer-events: none;
 }
 
+a {
+  &:hover {
+    text-decoration: underline;
+  }
+}
+
 .clickable,
 a {
   cursor: pointer;
 .clickable,
 a {
   cursor: pointer;
+  text-decoration: none;
+}
+
+a.nav-link,
+a.btn-light {
+  text-decoration: none;
+}
+
+// Overrides the badge to rounded-pill
+.badge {
+  @extend .badge, .rounded-pill, .mb-1;
+}
+
+// Overriding badges to match the class name of badges in Bootstrap v5
+.badge-primary {
+  @extend .badge, .bg-primary;
+}
+
+.badge-secondary {
+  @extend .badge, .bg-secondary;
+}
+
+.badge-success {
+  @extend .badge, .bg-success;
+}
+
+.badge-danger {
+  @extend .badge, .bg-danger;
+}
+
+.badge-info {
+  @extend .badge, .bg-primary;
+}
+
+.badge-warning {
+  @extend .badge, .bg-warning, .text-dark;
+}
+
+.badge-light {
+  @extend .badge, .bg-light, .text-dark;
+}
+
+.badge-dark {
+  @extend .badge, .bg-dark;
 }
 }
index be304c9e4e30779cdb58ac51f3c624488e255612..e65f2f56acfbbfd38906a8d2cefb53cdf17de4c2 100644 (file)
@@ -10,7 +10,7 @@ cd-info-card {
 
     .card-body {
       .card-title {
 
     .card-body {
       .card-title {
-        @extend .pl-2;
+        @extend .ps-2;
       }
 
       .card-text {
       }
 
       .card-text {
@@ -21,7 +21,7 @@ cd-info-card {
 }
 
 .btn-toolbar cd-table-actions.btn-group {
 }
 
 .btn-toolbar cd-table-actions.btn-group {
-  @extend .mr-2;
+  @extend .me-2;
 }
 
 cd-table {
 }
 
 cd-table {
@@ -85,11 +85,11 @@ cd-health {
 
 cd-logs {
   label {
 
 cd-logs {
   label {
-    @extend .mr-2;
+    @extend .me-2;
   }
 
   .form-inline > .form-group {
   }
 
   .form-inline > .form-group {
-    @extend .mr-3;
+    @extend .me-3;
     @extend .mb-3;
   }
 }
     @extend .mb-3;
   }
 }
@@ -101,7 +101,7 @@ cd-about {
 
   dt {
     @extend .col-4;
 
   dt {
     @extend .col-4;
-    @extend .font-weight-bold;
+    @extend .fw-bold;
   }
 
   dd {
   }
 
   dd {
@@ -121,9 +121,3 @@ legend {
 .fa {
   @extend .fa-fw;
 }
 .fa {
   @extend .fa-fw;
 }
-
-pre:not(cd-api-docs *) {
-  @extend .card;
-  @extend .bg-light;
-  @extend .p-2;
-}
index 7a618f704fc1ee4ec7af0ead9f05b93e2cc0c8cb..6ca04c3d8a481cb741add161c38249777a5f4d4a 100644 (file)
@@ -107,37 +107,6 @@ mark {
   border-left: 1px solid vv.$gray-400;
 }
 
   border-left: 1px solid vv.$gray-400;
 }
 
-.accordion {
-  .card {
-    border: 0;
-  }
-
-  .card-header {
-    border: 0;
-    border-bottom: 3px solid vv.$white;
-    padding-left: 0;
-
-    .btn:focus,
-    .btn.focus {
-      box-shadow: none;
-    }
-
-    button.dropdown-toggle {
-      position: relative;
-
-      &::after {
-        border: 0;
-        content: '\f054';
-        font-family: 'ForkAwesome';
-        font-size: 1rem;
-        position: absolute;
-        right: 20px;
-        transition: transform 0.3s ease-in-out;
-      }
-
-      &[aria-expanded='true']::after {
-        transform: rotate(90deg);
-      }
-    }
-  }
+a.nav-link {
+  color: vv.$primary;
 }
 }
index a56bf350664fdc172ea3ffd4b5f8cede980a7127..5b9789b3162d3bc76aa154e4e7f6379396a5c96b 100644 (file)
@@ -1,27 +1,39 @@
 @use './src/styles/vendor/variables' as vv;
 
 /* Reset checkbox success color */
 @use './src/styles/vendor/variables' as vv;
 
 /* Reset checkbox success color */
-.was-validated .custom-control-input:valid,
-.custom-control-input.is-valid {
-  ~ .custom-control-label {
+.was-validated .form-check-input:valid,
+.form-check-input.is-valid {
+  border-color: rgba(vv.$primary, 0.8);
+
+  &:checked {
+    background-color: vv.$primary;
+    border-color: rgba(vv.$primary, 0.8);
+    box-shadow: 0 0 3px 2px rgba(vv.$primary, 0.5);
+  }
+
+  &:focus {
+    border-color: rgba(vv.$primary, 0.8);
+    box-shadow: 0 0 3px 2px rgba(vv.$primary, 0.5);
+  }
+
+  ~ .form-check-label {
     color: initial;
   }
 
     color: initial;
   }
 
-  &:checked ~ .custom-control-label::before {
+  &:checked ~ .form-check-label::before {
     background-color: $component-active-bg;
     background-color: $component-active-bg;
-    border-color: $custom-control-indicator-checked-border-color;
   }
 
   }
 
-  ~ .custom-control-label::before {
-    border-color: $custom-control-indicator-border-color;
+  ~ .form-check-label::before {
+    border-color: rgba(vv.$primary, 0.8);
   }
 
   &:focus ~ .custom-control-label::before {
   }
 
   &:focus ~ .custom-control-label::before {
-    box-shadow: $custom-control-indicator-focus-box-shadow;
+    box-shadow: 0 0 3px 2px rgba(vv.$primary, 0.5);
   }
 
   &:focus:not(:checked) ~ .custom-control-label::before {
   }
 
   &:focus:not(:checked) ~ .custom-control-label::before {
-    border-color: $custom-control-indicator-focus-border-color;
+    border-color: rgba(vv.$primary, 0.8);
   }
 }
 
   }
 }
 
   }
 }
 
   }
 }
 
+.btn-primary {
+  @extend .btn-accent;
+}
+
 // We have some inputs that don't have a corresponding formControlName,
 // to be able to get the same styling and no JS errors we need use a different
 // class name
 // We have some inputs that don't have a corresponding formControlName,
 // to be able to get the same styling and no JS errors we need use a different
 // class name
index 1d84895c0dd75027e1ca324f0e380283bc7c61c7..26edbd11264f0546f4c4d85828440109dc07b793 100644 (file)
@@ -13,7 +13,8 @@
   width: 100%;
 }
 
   width: 100%;
 }
 
-.form-control {
+.form-control,
+.form-select {
   display: table-cell;
 
   &:focus {
   display: table-cell;
 
   &:focus {
 }
 
 .custom-checkbox {
 }
 
 .custom-checkbox {
+  @extend .form-check;
   padding-top: 7px;
   padding-top: 7px;
+
+  .custom-control-input {
+    @extend .form-check-input;
+  }
+
+  .custom-control-label {
+    @extend .form-check-label;
+  }
 }
 
 .custom-radio {
 }
 
 .custom-radio {
+  @extend .form-check;
   padding-top: 5px;
 }
 
   padding-top: 5px;
 }
 
@@ -84,3 +95,11 @@ cd-modal {
 .invalid-feedback {
   display: block;
 }
 .invalid-feedback {
   display: block;
 }
+
+.form-group {
+  @extend .mb-3;
+}
+
+.custom-control-label {
+  @extend .form-label;
+}
index d4a3d5f86bec7a491a5612b2a01dd911a07c9e45..941f639a363c14a022aa109a3fe0959b53df1977 100644 (file)
@@ -16,25 +16,34 @@ $blue: #007bff !default;
 $indigo: #6610f2 !default;
 $purple: #6f42c1 !default;
 $pink: #a94442 !default;
 $indigo: #6610f2 !default;
 $purple: #6f42c1 !default;
 $pink: #a94442 !default;
-$red: #ef5c55 !default;
+$red: #dc3545 !default;
 $orange: #fd7e14 !default;
 $orange: #fd7e14 !default;
-$yellow: #ffc200 !default;
-$green: #0b0 !default;
+$yellow: #d48200 !default;
+$green: #008a00 !default;
 $teal: #20c997 !default;
 $cyan: #17a2b8 !default;
 $barley-white: #fcecba !default;
 
 $teal: #20c997 !default;
 $cyan: #17a2b8 !default;
 $barley-white: #fcecba !default;
 
-$primary: #2b99a8 !default;
+$primary: #25828e !default;
+$primary-500: #2b99a8 !default;
 $secondary: #374249 !default;
 $success: $green !default;
 $info: $primary !default;
 $warning: $yellow !default;
 $danger: $red !default;
 $light: $gray-100 !default;
 $secondary: #374249 !default;
 $success: $green !default;
 $info: $primary !default;
 $warning: $yellow !default;
 $danger: $red !default;
 $light: $gray-100 !default;
-$dark: #777 !default;
+$dark: $gray-800 !default;
+
+//badges colors
+$green-300: #6ec664;
+$cyan-300: #009596;
+$purple-300: #a18fff;
+$light-blue-300: #35caed;
+$gold-300: #f4c145;
+$light-green-300: #ace12e;
 
 // Extra theme colors.
 
 // Extra theme colors.
-$accent: $red !default;
+$accent: $primary !default;
 $warning-dark: $orange !default;
 
 $fg-color-over-dark-bg: $white !default;
 $warning-dark: $orange !default;
 
 $fg-color-over-dark-bg: $white !default;
@@ -42,7 +51,15 @@ $fg-hover-color-over-dark-bg: $gray-500 !default;
 
 $theme-colors: (
   'accent': $accent,
 
 $theme-colors: (
   'accent': $accent,
-  'warning-dark': $warning-dark
+  'warning-dark': $warning-dark,
+  'primary': $accent,
+  'secondary': $secondary,
+  'success': $success,
+  'info': $info,
+  'warning': $warning,
+  'danger': $danger,
+  'light': $light,
+  'dark': $dark
 ) !default;
 
 // Body
 ) !default;
 
 // Body
@@ -52,18 +69,19 @@ $body-color: $gray-900 !default;
 $body-bg-alt: $gray-200 !default;
 
 // Health colors.
 $body-bg-alt: $gray-200 !default;
 
 // Health colors.
-$health-color-error: #f00 !default;
+$health-color-error: $red !default;
 $health-color-healthy: $green !default;
 $health-color-healthy: $green !default;
-$health-color-warning: #ffa500 !default;
+$health-color-warning: $yellow !default;
+$health-color-warning-800: #9d6d10 !default;
 
 // Chart colors.
 
 // Chart colors.
-$chart-color-red: #c9190b !default;
+$chart-color-red: $red !default;
 $chart-color-blue: #06c !default;
 $chart-color-orange: #ef9234 !default;
 $chart-color-yellow: #f6d173 !default;
 $chart-color-blue: #06c !default;
 $chart-color-orange: #ef9234 !default;
 $chart-color-yellow: #f6d173 !default;
-$chart-color-green: #7cc674 !default;
+$chart-color-green: $green !default;
 $chart-color-gray: #ededed !default;
 $chart-color-gray: #ededed !default;
-$chart-color-cyan: #73c5c5 !default;
+$chart-color-cyan: $primary-500 !default;
 $chart-color-purple: #3c3d99 !default;
 $chart-color-center-text: #151515 !default;
 $chart-color-center-text-description: #72767b !default;
 $chart-color-purple: #3c3d99 !default;
 $chart-color-center-text: #151515 !default;
 $chart-color-center-text-description: #72767b !default;
@@ -95,6 +113,7 @@ $nav-tabs-margin-bottom: 1rem !default;
 
 $tooltip-color: $white !default;
 $tooltip-bg: $body-color !default;
 
 $tooltip-color: $white !default;
 $tooltip-bg: $body-color !default;
+$tooltip-opacity: 1 !default;
 
 // Misc
 
 
 // Misc
 
index 574919d08ec268ebe51df706d7a60f705809799f..12bef83cc58a6cf1419f09b94cf1c100fa3868a5 100644 (file)
@@ -4,9 +4,9 @@ import { AbstractControl } from '@angular/forms';
 import { By } from '@angular/platform-browser';
 import { BrowserDynamicTestingModule } from '@angular/platform-browser-dynamic/testing';
 
 import { By } from '@angular/platform-browser';
 import { BrowserDynamicTestingModule } from '@angular/platform-browser-dynamic/testing';
 
-import { NgbModal, NgbNav, NgbNavItem } from '@ng-bootstrap/ng-bootstrap';
+import { NgbModal, NgbNav, NgbNavItem, NgbNavLink } from '@ng-bootstrap/ng-bootstrap';
 import _ from 'lodash';
 import _ from 'lodash';
-import { configureTestSuite } from 'ng-bullet';
+import { configureSuite } from '@apteco/ngth';
 import { of } from 'rxjs';
 
 import { InventoryDevice } from '~/app/ceph/cluster/inventory/inventory-devices/inventory-device.model';
 import { of } from 'rxjs';
 
 import { InventoryDevice } from '~/app/ceph/cluster/inventory/inventory-devices/inventory-device.model';
@@ -31,7 +31,7 @@ import {
 } from '~/app/shared/models/prometheus-alerts';
 
 export function configureTestBed(configuration: any, entryComponents?: any) {
 } from '~/app/shared/models/prometheus-alerts';
 
 export function configureTestBed(configuration: any, entryComponents?: any) {
-  configureTestSuite(() => {
+  configureSuite(() => {
     if (entryComponents) {
       // Declare entryComponents without having to add them to a module
       // This is needed since Jest doesn't yet support not declaring entryComponents
     if (entryComponents) {
       // Declare entryComponents without having to add them to a module
       // This is needed since Jest doesn't yet support not declaring entryComponents
@@ -622,7 +622,7 @@ export class TabHelper {
 
   private static getNgbNavItemsDebugElems(fixture: ComponentFixture<any>) {
     const debugElem: DebugElement = fixture.debugElement;
 
   private static getNgbNavItemsDebugElems(fixture: ComponentFixture<any>) {
     const debugElem: DebugElement = fixture.debugElement;
-    return debugElem.queryAll(By.directive(NgbNavItem));
+    return debugElem.queryAll(By.directive(NgbNavLink));
   }
 }
 
   }
 }
 
@@ -675,7 +675,7 @@ export class TableActionHelper {
       const actionElement = getActionElement(action);
       if (expectResult[action.name]) {
         actions[action.name] = {
       const actionElement = getActionElement(action);
       if (expectResult[action.name]) {
         actions[action.name] = {
-          disabled: actionElement.classes.disabled,
+          disabled: actionElement.classes.disabled ? true : false,
           disableDesc: actionElement.properties.title
         };
       }
           disableDesc: actionElement.properties.title
         };
       }
index 388a019acc8ef616930e9a26fba8e7b98e6f50d6..cf9a49a689050a5e0477eabd0c15f0f2f209e1fc 100644 (file)
@@ -20,6 +20,7 @@
     "target": "es2015",
     "module": "es2020",
     "baseUrl": "./",
     "target": "es2015",
     "module": "es2020",
     "baseUrl": "./",
+    "resolveJsonModule": true,
     "paths": {
       "~/*": ["src/*"]
     },
     "paths": {
       "~/*": ["src/*"]
     },
diff --git a/ceph/src/pybind/mgr/dashboard/frontend/tslint.json b/ceph/src/pybind/mgr/dashboard/frontend/tslint.json
deleted file mode 100644 (file)
index 2911ef2..0000000
+++ /dev/null
@@ -1,118 +0,0 @@
-{
-  "rulesDirectory": ["node_modules/codelyzer"],
-  "rules": {
-    "no-consecutive-blank-lines": true,
-    "arrow-return-shorthand": true,
-    "callable-types": true,
-    "class-name": true,
-    "comment-format": [true, "check-space"],
-    "curly": true,
-    "deprecation": {
-      "severity": "error"
-    },
-    "eofline": true,
-    "forin": true,
-    "import-blacklist": [true,
-      "rxjs/Rx",
-      {"@angular/core/testing": ["async"]},
-      ["(\\.{1,2}\/){2,}"] // e.g import ../../foobar
-    ],
-    "import-spacing": true,
-    "indent": [true, "spaces"],
-    "interface-over-type-literal": true,
-    "label-position": true,
-    "member-access": false,
-    "member-ordering": [
-      true,
-      {
-        "order": ["static-field", "instance-field", "static-method", "instance-method"]
-      }
-    ],
-    "no-arg": true,
-    "no-bitwise": true,
-    "no-console": [true, "debug", "info", "time", "timeEnd", "trace"],
-    "no-construct": true,
-    "no-debugger": true,
-    "no-duplicate-super": true,
-    "no-duplicate-imports": [true, { "allow-namespace-imports": true }],
-    "no-empty": [true, "allow-empty-catch"],
-    "no-empty-interface": true,
-    "no-eval": true,
-    "no-inferrable-types": [true, "ignore-params"],
-    "no-misused-new": true,
-    "no-non-null-assertion": true,
-    "no-shadowed-variable": true,
-    "no-string-literal": false,
-    "no-string-throw": true,
-    "no-switch-case-fall-through": true,
-    "no-trailing-whitespace": true,
-    "no-unnecessary-initializer": true,
-    "no-unused-expression": true,
-    "no-var-keyword": true,
-    "object-literal-sort-keys": false,
-    "one-line": [true, "check-open-brace", "check-catch", "check-else", "check-whitespace"],
-    "prefer-const": true,
-    "quotemark": [true, "single"],
-    "radix": true,
-    "triple-equals": [true, "allow-null-check"],
-    "typedef-whitespace": [
-      true,
-      {
-        "call-signature": "nospace",
-        "index-signature": "nospace",
-        "parameter": "nospace",
-        "property-declaration": "nospace",
-        "variable-declaration": "nospace"
-      }
-    ],
-    "unified-signatures": true,
-    "variable-name": [true, "check-format", "allow-snake-case", "allow-leading-underscore"],
-    "whitespace": [
-      true,
-      "check-branch",
-      "check-operator",
-      "check-separator",
-      "check-type",
-      "check-module"
-    ],
-    "directive-selector": [true, "attribute", "cd", "camelCase"],
-    "component-selector": [true, "element", "cd", "kebab-case"],
-    "no-output-on-prefix": true,
-    "no-inputs-metadata-property": true,
-    "no-outputs-metadata-property": true,
-    "no-host-metadata-property": true,
-    "no-attribute-decorator": true,
-    "no-input-rename": true,
-    "no-output-rename": true,
-    "use-lifecycle-interface": true,
-    "use-pipe-transform-interface": true,
-    "component-class-suffix": true,
-    "directive-class-suffix": true,
-    "no-forward-ref": true,
-    "no-output-native": true,
-    "ordered-imports": [
-      true,
-      {
-        "grouped-imports": true,
-        "groups": [
-          {
-            "name": "angular",
-            "match": "^@angular",
-            "order": 1
-          },
-          {
-            "name": "relative dir",
-            "match": "^(\\.|\\.\\.|~)/.*",
-            "order": 3
-          },
-          {
-            "name": "node_modules",
-            "match": ".*",
-            "order": 2
-          }
-        ]
-      }
-    ]
-  },
-  "jsRules": { "no-empty": true }
-}
index 946c853f880d66330d91fa3940be94553d16f363..3b3519e7bf0f446d8288590def6904307aa62284 100644 (file)
@@ -6,12 +6,14 @@ import collections
 import errno
 import logging
 import os
 import errno
 import logging
 import os
+import socket
 import ssl
 import sys
 import tempfile
 import threading
 import time
 from typing import TYPE_CHECKING, Optional
 import ssl
 import sys
 import tempfile
 import threading
 import time
 from typing import TYPE_CHECKING, Optional
+from urllib.parse import urlparse
 
 if TYPE_CHECKING:
     if sys.version_info >= (3, 8):
 
 if TYPE_CHECKING:
     if sys.version_info >= (3, 8):
@@ -117,6 +119,7 @@ class CherryPyConfig(object):
 
         # Initialize custom handlers.
         cherrypy.tools.authenticate = AuthManagerTool()
 
         # Initialize custom handlers.
         cherrypy.tools.authenticate = AuthManagerTool()
+        self.configure_cors()
         cherrypy.tools.plugin_hooks_filter_request = cherrypy.Tool(
             'before_handler',
             lambda: PLUGIN_MANAGER.hook.filter_request_before_handler(request=cherrypy.request),
         cherrypy.tools.plugin_hooks_filter_request = cherrypy.Tool(
             'before_handler',
             lambda: PLUGIN_MANAGER.hook.filter_request_before_handler(request=cherrypy.request),
@@ -219,6 +222,70 @@ class CherryPyConfig(object):
                 self.log.info("Configured CherryPy, starting engine...")  # type: ignore
                 return uri
 
                 self.log.info("Configured CherryPy, starting engine...")  # type: ignore
                 return uri
 
+    def configure_cors(self):
+        """
+        Allow CORS requests if the cross_origin_url option is set.
+        """
+        cross_origin_url = mgr.get_localized_module_option('cross_origin_url', '')
+        if cross_origin_url:
+            cherrypy.tools.CORS = cherrypy.Tool('before_handler', self.cors_tool)
+            config = {
+                'tools.CORS.on': True,
+            }
+            self.update_cherrypy_config(config)
+
+    def cors_tool(self):
+        '''
+        Handle both simple and complex CORS requests
+
+        Add CORS headers to each response. If the request is a CORS preflight
+        request swap out the default handler with a simple, single-purpose handler
+        that verifies the request and provides a valid CORS response.
+        '''
+        req_head = cherrypy.request.headers
+        resp_head = cherrypy.response.headers
+
+        # Always set response headers necessary for 'simple' CORS.
+        req_header_cross_origin_url = req_head.get('Access-Control-Allow-Origin')
+        cross_origin_urls = mgr.get_localized_module_option('cross_origin_url', '')
+        cross_origin_url_list = [url.strip() for url in cross_origin_urls.split(',')]
+        if req_header_cross_origin_url in cross_origin_url_list:
+            resp_head['Access-Control-Allow-Origin'] = req_header_cross_origin_url
+        resp_head['Access-Control-Expose-Headers'] = 'GET, POST'
+        resp_head['Access-Control-Allow-Credentials'] = 'true'
+
+        # Non-simple CORS preflight request; short-circuit the normal handler.
+        if cherrypy.request.method == 'OPTIONS':
+            req_header_origin_url = req_head.get('Origin')
+            if req_header_origin_url in cross_origin_url_list:
+                resp_head['Access-Control-Allow-Origin'] = req_header_origin_url
+            ac_method = req_head.get('Access-Control-Request-Method', None)
+
+            allowed_methods = ['GET', 'POST']
+            allowed_headers = [
+                'Content-Type',
+                'Authorization',
+                'Accept',
+                'Access-Control-Allow-Origin'
+            ]
+
+            if ac_method and ac_method in allowed_methods:
+                resp_head['Access-Control-Allow-Methods'] = ', '.join(allowed_methods)
+                resp_head['Access-Control-Allow-Headers'] = ', '.join(allowed_headers)
+
+                resp_head['Connection'] = 'keep-alive'
+                resp_head['Access-Control-Max-Age'] = '3600'
+
+            # CORS requests should short-circuit the other tools.
+            cherrypy.response.body = ''.encode('utf8')
+            cherrypy.response.status = 200
+            cherrypy.serving.request.handler = None
+
+            # Needed to avoid the auth_tool check.
+            if cherrypy.request.config.get('tools.sessions.on', False):
+                cherrypy.session['token'] = True
+            return True
+
 
 if TYPE_CHECKING:
     SslConfigKey = Literal['crt', 'key']
 
 if TYPE_CHECKING:
     SslConfigKey = Literal['crt', 'key']
@@ -268,7 +335,9 @@ class Module(MgrModule, CherryPyConfig):
         Option(name='standby_behaviour', type='str', default='redirect',
                enum_allowed=['redirect', 'error']),
         Option(name='standby_error_status_code', type='int', default=500,
         Option(name='standby_behaviour', type='str', default='redirect',
                enum_allowed=['redirect', 'error']),
         Option(name='standby_error_status_code', type='int', default=500,
-               min=400, max=599)
+               min=400, max=599),
+        Option(name='redirect_resolve_ip_addr', type='bool', default=False),
+        Option(name='cross_origin_url', type='str', default=''),
     ]
     MODULE_OPTIONS.extend(options_schema_list())
     for options in PLUGIN_MANAGER.hook.get_options() or []:
     ]
     MODULE_OPTIONS.extend(options_schema_list())
     for options in PLUGIN_MANAGER.hook.get_options() or []:
@@ -525,6 +594,13 @@ class StandbyModule(MgrStandbyModule, CherryPyConfig):
                         return None
 
                     if active_uri:
                         return None
 
                     if active_uri:
+                        if module.get_module_option('redirect_resolve_ip_addr'):
+                            p_result = urlparse(active_uri)
+                            hostname = str(p_result.hostname)
+                            fqdn_netloc = p_result.netloc.replace(
+                                hostname, socket.getfqdn(hostname))
+                            active_uri = p_result._replace(netloc=fqdn_netloc).geturl()
+
                         module.log.info("Redirecting to active '%s'", active_uri)
                         raise cherrypy.HTTPRedirect(active_uri)
                     else:
                         module.log.info("Redirecting to active '%s'", active_uri)
                         raise cherrypy.HTTPRedirect(active_uri)
                     else:
index 8655a57364612e46ccdfc7b5b2f1ef1466a96359..288d0beb3df79daa2b2dd2f34e7708e05c541e60 100644 (file)
@@ -3466,7 +3466,7 @@ paths:
       responses:
         '200':
           content:
       responses:
         '200':
           content:
-            application/vnd.ceph.api.v1.1+json:
+            application/vnd.ceph.api.v1.2+json:
               schema:
                 properties:
                   addr:
               schema:
                 properties:
                   addr:
@@ -3483,6 +3483,21 @@ paths:
                     items:
                       type: string
                     type: array
                     items:
                       type: string
                     type: array
+                  service_instances:
+                    description: Service instances related to the host
+                    items:
+                      properties:
+                        count:
+                          description: Number of instances of the service
+                          type: integer
+                        type:
+                          description: type of service
+                          type: string
+                      required:
+                      - type
+                      - count
+                      type: object
+                    type: array
                   service_type:
                     description: ''
                     type: string
                   service_type:
                     description: ''
                     type: string
@@ -3520,6 +3535,7 @@ paths:
                 required:
                 - hostname
                 - services
                 required:
                 - hostname
                 - services
+                - service_instances
                 - ceph_version
                 - addr
                 - labels
                 - ceph_version
                 - addr
                 - labels
@@ -7607,6 +7623,13 @@ paths:
                   type: string
                 daemon_name:
                   type: string
                   type: string
                 daemon_name:
                   type: string
+                encryption_state:
+                  default: 'false'
+                  type: string
+                encryption_type:
+                  type: string
+                key_id:
+                  type: string
                 lock_enabled:
                   default: 'false'
                   type: string
                 lock_enabled:
                   default: 'false'
                   type: string
@@ -7650,6 +7673,178 @@ paths:
       - jwt: []
       tags:
       - RgwBucket
       - jwt: []
       tags:
       - RgwBucket
+  /api/rgw/bucket/deleteEncryption:
+    delete:
+      parameters:
+      - in: query
+        name: bucket_name
+        required: true
+        schema:
+          type: string
+      - allowEmptyValue: true
+        in: query
+        name: daemon_name
+        schema:
+          type: string
+      - allowEmptyValue: true
+        in: query
+        name: owner
+        schema:
+          type: string
+      responses:
+        '202':
+          content:
+            application/vnd.ceph.api.v1.0+json:
+              type: object
+          description: Operation is still executing. Please check the task queue.
+        '204':
+          content:
+            application/vnd.ceph.api.v1.0+json:
+              type: object
+          description: Resource deleted.
+        '400':
+          description: Operation exception. Please check the response body for details.
+        '401':
+          description: Unauthenticated access. Please login first.
+        '403':
+          description: Unauthorized access. Please check your permissions.
+        '500':
+          description: Unexpected error. Please check the response body for the stack
+            trace.
+      security:
+      - jwt: []
+      tags:
+      - RgwBucket
+  /api/rgw/bucket/getEncryption:
+    get:
+      parameters:
+      - in: query
+        name: bucket_name
+        required: true
+        schema:
+          type: string
+      - allowEmptyValue: true
+        in: query
+        name: daemon_name
+        schema:
+          type: string
+      - allowEmptyValue: true
+        in: query
+        name: owner
+        schema:
+          type: string
+      responses:
+        '200':
+          content:
+            application/vnd.ceph.api.v1.0+json:
+              type: object
+          description: OK
+        '400':
+          description: Operation exception. Please check the response body for details.
+        '401':
+          description: Unauthenticated access. Please login first.
+        '403':
+          description: Unauthorized access. Please check your permissions.
+        '500':
+          description: Unexpected error. Please check the response body for the stack
+            trace.
+      security:
+      - jwt: []
+      tags:
+      - RgwBucket
+  /api/rgw/bucket/getEncryptionConfig:
+    get:
+      parameters:
+      - allowEmptyValue: true
+        in: query
+        name: daemon_name
+        schema:
+          type: string
+      - allowEmptyValue: true
+        in: query
+        name: owner
+        schema:
+          type: string
+      responses:
+        '200':
+          content:
+            application/vnd.ceph.api.v1.0+json:
+              type: object
+          description: OK
+        '400':
+          description: Operation exception. Please check the response body for details.
+        '401':
+          description: Unauthenticated access. Please login first.
+        '403':
+          description: Unauthorized access. Please check your permissions.
+        '500':
+          description: Unexpected error. Please check the response body for the stack
+            trace.
+      security:
+      - jwt: []
+      tags:
+      - RgwBucket
+  /api/rgw/bucket/setEncryptionConfig:
+    put:
+      parameters: []
+      requestBody:
+        content:
+          application/json:
+            schema:
+              properties:
+                address:
+                  type: string
+                auth_method:
+                  type: string
+                client_cert:
+                  type: string
+                client_key:
+                  type: string
+                daemon_name:
+                  type: string
+                encryption_type:
+                  type: string
+                kms_provider:
+                  type: string
+                namespace:
+                  default: ''
+                  type: string
+                owner:
+                  type: string
+                secret_engine:
+                  type: string
+                secret_path:
+                  default: ''
+                  type: string
+                ssl_cert:
+                  type: string
+                token:
+                  type: string
+              type: object
+      responses:
+        '200':
+          content:
+            application/vnd.ceph.api.v1.0+json:
+              type: object
+          description: Resource updated.
+        '202':
+          content:
+            application/vnd.ceph.api.v1.0+json:
+              type: object
+          description: Operation is still executing. Please check the task queue.
+        '400':
+          description: Operation exception. Please check the response body for details.
+        '401':
+          description: Unauthenticated access. Please login first.
+        '403':
+          description: Unauthorized access. Please check your permissions.
+        '500':
+          description: Unexpected error. Please check the response body for the stack
+            trace.
+      security:
+      - jwt: []
+      tags:
+      - RgwBucket
   /api/rgw/bucket/{bucket}:
     delete:
       parameters:
   /api/rgw/bucket/{bucket}:
     delete:
       parameters:
@@ -7739,6 +7934,13 @@ paths:
                   type: string
                 daemon_name:
                   type: string
                   type: string
                 daemon_name:
                   type: string
+                encryption_state:
+                  default: 'false'
+                  type: string
+                encryption_type:
+                  type: string
+                key_id:
+                  type: string
                 lock_mode:
                   type: string
                 lock_retention_period_days:
                 lock_mode:
                   type: string
                 lock_retention_period_days:
@@ -8753,10 +8955,30 @@ paths:
         name: service_name
         schema:
           type: string
         name: service_name
         schema:
           type: string
+      - default: 0
+        in: query
+        name: offset
+        schema:
+          type: integer
+      - default: 5
+        in: query
+        name: limit
+        schema:
+          type: integer
+      - default: ''
+        in: query
+        name: search
+        schema:
+          type: string
+      - default: +service_name
+        in: query
+        name: sort
+        schema:
+          type: string
       responses:
         '200':
           content:
       responses:
         '200':
           content:
-            application/vnd.ceph.api.v1.0+json:
+            application/vnd.ceph.api.v2.0+json:
               type: object
           description: OK
         '400':
               type: object
           description: OK
         '400':
diff --git a/ceph/src/pybind/mgr/dashboard/services/_paginate.py b/ceph/src/pybind/mgr/dashboard/services/_paginate.py
new file mode 100644 (file)
index 0000000..c8ba300
--- /dev/null
@@ -0,0 +1,71 @@
+from typing import Any, Dict, List
+
+from ..exceptions import DashboardException
+
+
+class ListPaginator:
+    # pylint: disable=W0102
+    def __init__(self, offset: int, limit: int, sort: str, search: str,
+                 input_list: List[Any], default_sort: str,
+                 searchable_params: List[str] = [], sortable_params: List[str] = []):
+        self.offset = offset
+        if limit < -1:
+            raise DashboardException(msg=f'Wrong limit value {limit}', code=400)
+        self.limit = limit
+        self.sort = sort
+        self.search = search
+        self.input_list = input_list
+        self.default_sort = default_sort
+        self.searchable_params = searchable_params
+        self.sortable_params = sortable_params
+        self.count = len(self.input_list)
+
+    def get_count(self):
+        return self.count
+
+    def find_value(self, item: Dict[str, Any], key: str):
+        # dot separated keys to lookup nested values
+        keys = key.split('.')
+        value = item
+        for nested_key in keys:
+            if nested_key in value:
+                value = value[nested_key]
+            else:
+                return ''
+        return value
+
+    def list(self):
+        end = self.offset + self.limit
+        # '-1' is a special number to refer to all items in list
+        if self.limit == -1:
+            end = len(self.input_list)
+
+        if not self.sort:
+            self.sort = self.default_sort
+
+        desc = self.sort[0] == '-'
+        sort_by = self.sort[1:]
+
+        if sort_by not in self.sortable_params:
+            sort_by = self.default_sort[1:]
+
+        # trim down by search
+        trimmed_list = []
+        if self.search:
+            for item in self.input_list:
+                for searchable_param in self.searchable_params:
+                    value = self.find_value(item, searchable_param)
+                    if isinstance(value, str):
+                        if self.search in str(value):
+                            trimmed_list.append(item)
+
+        else:
+            trimmed_list = self.input_list
+
+        def sort(item):
+            return self.find_value(item, sort_by)
+
+        sorted_list = sorted(trimmed_list, key=sort, reverse=desc)
+        self.count = len(sorted_list)
+        for item in sorted_list[self.offset:end]:
+            yield item
index 518ee12a2f5450526f8cb31d6adf84bf33f48108..422375f4aff55cbbc8ee087e34ea3b3e4ac9408f 100644 (file)
@@ -5,7 +5,7 @@ import logging
 
 import rados
 from mgr_module import CommandResult
 
 import rados
 from mgr_module import CommandResult
-from mgr_util import get_most_recent_rate, get_time_series_rates
+from mgr_util import get_most_recent_rate, get_time_series_rates, name_to_config_section
 
 from .. import mgr
 
 
 from .. import mgr
 
@@ -182,6 +182,117 @@ class CephService(object):
                 return pool
         return None
 
                 return pool
         return None
 
+    @classmethod
+    def get_encryption_config(cls, daemon_name):
+        kms_vault_configured = False
+        s3_vault_configured = False
+        kms_backend: str = ''
+        sse_s3_backend: str = ''
+        vault_stats = []
+        full_daemon_name = 'rgw.' + daemon_name
+
+        kms_backend = CephService.send_command('mon', 'config get',
+                                               who=name_to_config_section(full_daemon_name),
+                                               key='rgw_crypt_s3_kms_backend')
+        sse_s3_backend = CephService.send_command('mon', 'config get',
+                                                  who=name_to_config_section(full_daemon_name),
+                                                  key='rgw_crypt_sse_s3_backend')
+
+        if kms_backend.strip() == 'vault':
+            kms_vault_auth: str = CephService.send_command('mon', 'config get',
+                                                           who=name_to_config_section(full_daemon_name),  # noqa E501 #pylint: disable=line-too-long
+                                                           key='rgw_crypt_vault_auth')
+            kms_vault_engine: str = CephService.send_command('mon', 'config get',
+                                                             who=name_to_config_section(full_daemon_name),  # noqa E501 #pylint: disable=line-too-long
+                                                             key='rgw_crypt_vault_secret_engine')
+            kms_vault_address: str = CephService.send_command('mon', 'config get',
+                                                              who=name_to_config_section(full_daemon_name),  # noqa E501 #pylint: disable=line-too-long
+                                                              key='rgw_crypt_vault_addr')
+            kms_vault_token: str = CephService.send_command('mon', 'config get',
+                                                            who=name_to_config_section(full_daemon_name),  # noqa E501 #pylint: disable=line-too-long
+                                                            key='rgw_crypt_vault_token_file')  # noqa E501 #pylint: disable=line-too-long
+            if (kms_vault_auth.strip() != "" and kms_vault_engine.strip() != "" and kms_vault_address.strip() != ""):  # noqa E501 #pylint: disable=line-too-long
+                if(kms_vault_auth == 'token' and kms_vault_token.strip() == ""):
+                    kms_vault_configured = False
+                else:
+                    kms_vault_configured = True
+
+        if sse_s3_backend.strip() == 'vault':
+            s3_vault_auth: str = CephService.send_command('mon', 'config get',
+                                                          who=name_to_config_section(full_daemon_name),  # noqa E501 #pylint: disable=line-too-long
+                                                          key='rgw_crypt_sse_s3_vault_auth')
+            s3_vault_engine: str = CephService.send_command('mon',
+                                                            'config get',
+                                                            who=name_to_config_section(full_daemon_name),  # noqa E501 #pylint: disable=line-too-long
+                                                            key='rgw_crypt_sse_s3_vault_secret_engine')  # noqa E501 #pylint: disable=line-too-long
+            s3_vault_address: str = CephService.send_command('mon', 'config get',
+                                                             who=name_to_config_section(full_daemon_name),  # noqa E501 #pylint: disable=line-too-long
+                                                             key='rgw_crypt_sse_s3_vault_addr')
+            s3_vault_token: str = CephService.send_command('mon', 'config get',
+                                                           who=name_to_config_section(full_daemon_name),  # noqa E501 #pylint: disable=line-too-long
+                                                           key='rgw_crypt_sse_s3_vault_token_file')  # noqa E501 #pylint: disable=line-too-long
+
+            if (s3_vault_auth.strip() != "" and s3_vault_engine.strip() != "" and s3_vault_address.strip() != ""):  # noqa E501 #pylint: disable=line-too-long
+                if(s3_vault_auth == 'token' and s3_vault_token.strip() == ""):
+                    s3_vault_configured = False
+                else:
+                    s3_vault_configured = True
+
+        vault_stats.append(kms_vault_configured)
+        vault_stats.append(s3_vault_configured)
+        return vault_stats
+
+    @classmethod
+    def set_encryption_config(cls, encryption_type, kms_provider, auth_method,
+                              secret_engine, secret_path, namespace, address,
+                              token, daemon_name, ssl_cert, client_cert, client_key):
+        full_daemon_name = 'rgw.' + daemon_name
+        if encryption_type == 'aws:kms':
+
+            KMS_CONFIG = [
+                ['rgw_crypt_s3_kms_backend', kms_provider],
+                ['rgw_crypt_vault_auth', auth_method],
+                ['rgw_crypt_vault_prefix', secret_path],
+                ['rgw_crypt_vault_namespace', namespace],
+                ['rgw_crypt_vault_secret_engine', secret_engine],
+                ['rgw_crypt_vault_addr', address],
+                ['rgw_crypt_vault_token_file', token],
+                ['rgw_crypt_vault_ssl_cacert', ssl_cert],
+                ['rgw_crypt_vault_ssl_clientcert', client_cert],
+                ['rgw_crypt_vault_ssl_clientkey', client_key]
+            ]
+
+            for (key, value) in KMS_CONFIG:
+                if value == 'null':
+                    continue
+                CephService.send_command('mon', 'config set',
+                                         who=name_to_config_section(full_daemon_name),
+                                         name=key, value=value)
+
+        if encryption_type == 'AES256':
+
+            SSE_S3_CONFIG = [
+                ['rgw_crypt_sse_s3_backend', kms_provider],
+                ['rgw_crypt_sse_s3_vault_auth', auth_method],
+                ['rgw_crypt_sse_s3_vault_prefix', secret_path],
+                ['rgw_crypt_sse_s3_vault_namespace', namespace],
+                ['rgw_crypt_sse_s3_vault_secret_engine', secret_engine],
+                ['rgw_crypt_sse_s3_vault_addr', address],
+                ['rgw_crypt_sse_s3_vault_token_file', token],
+                ['rgw_crypt_sse_s3_vault_ssl_cacert', ssl_cert],
+                ['rgw_crypt_sse_s3_vault_ssl_clientcert', client_cert],
+                ['rgw_crypt_sse_s3_vault_ssl_clientkey', client_key]
+            ]
+
+            for (key, value) in SSE_S3_CONFIG:
+                if value == 'null':
+                    continue
+                CephService.send_command('mon', 'config set',
+                                         who=name_to_config_section(full_daemon_name),
+                                         name=key, value=value)
+
+        return {}
+
     @classmethod
     def get_pool_pg_status(cls, pool_name):
         # type: (str) -> dict
     @classmethod
     def get_pool_pg_status(cls, pool_name):
         # type: (str) -> dict
index 6829108e098d54315d9ba39eba891a6fcf12337c..1818164d6c96cbe3d30379e8783b03212b4548be 100644 (file)
@@ -2,7 +2,7 @@
 
 import logging
 from functools import wraps
 
 import logging
 from functools import wraps
-from typing import Any, Dict, List, Optional
+from typing import Any, Dict, List, Optional, Tuple
 
 from ceph.deployment.service_spec import ServiceSpec
 from orchestrator import DaemonDescription, DeviceLightLoc, HostSpec, \
 
 from ceph.deployment.service_spec import ServiceSpec
 from orchestrator import DaemonDescription, DeviceLightLoc, HostSpec, \
@@ -10,6 +10,7 @@ from orchestrator import DaemonDescription, DeviceLightLoc, HostSpec, \
     ServiceDescription, raise_if_exception
 
 from .. import mgr
     ServiceDescription, raise_if_exception
 
 from .. import mgr
+from ._paginate import ListPaginator
 
 logger = logging.getLogger('orchestrator')
 
 
 logger = logging.getLogger('orchestrator')
 
@@ -95,11 +96,21 @@ class InventoryManager(ResourceManager):
 
 
 class ServiceManager(ResourceManager):
 
 
 class ServiceManager(ResourceManager):
-    @wait_api_result
     def list(self,
              service_type: Optional[str] = None,
     def list(self,
              service_type: Optional[str] = None,
-             service_name: Optional[str] = None) -> List[ServiceDescription]:
-        return self.api.describe_service(service_type, service_name)
+             service_name: Optional[str] = None,
+             offset: int = 0, limit: int = -1,
+             sort: str = '+service_name', search: str = '') -> Tuple[List[Dict[Any, Any]], int]:
+        services = self.api.describe_service(service_type, service_name)
+        services = [service.to_dict() for service in services.result]
+        paginator = ListPaginator(offset, limit, sort, search,
+                                  input_list=services,
+                                  searchable_params=['service_name', 'status.running',
+                                                     'status.last_refreshed', 'status.size'],
+                                  sortable_params=['service_name', 'status.running',
+                                                   'status.last_refreshed', 'status.size'],
+                                  default_sort='+service_name')
+        return list(paginator.list()), paginator.get_count()
 
     @wait_api_result
     def get(self, service_name: str) -> ServiceDescription:
 
     @wait_api_result
     def get(self, service_name: str) -> ServiceDescription:
index e4021735dac3e7996d3f44f321edeae97c684b47..9186100adb1d707e69d9e63f3aa02adcf82547da 100644 (file)
@@ -11,6 +11,7 @@ import rbd
 from .. import mgr
 from ..exceptions import DashboardException
 from ..plugins.ttl_cache import ttl_cache
 from .. import mgr
 from ..exceptions import DashboardException
 from ..plugins.ttl_cache import ttl_cache
+from ._paginate import ListPaginator
 from .ceph_service import CephService
 
 try:
 from .ceph_service import CephService
 
 try:
@@ -271,8 +272,9 @@ class RbdService(object):
     def _rbd_image(cls, ioctx, pool_name, namespace, image_name):  # pylint: disable=R0912
         with rbd.Image(ioctx, image_name) as img:
             stat = img.stat()
     def _rbd_image(cls, ioctx, pool_name, namespace, image_name):  # pylint: disable=R0912
         with rbd.Image(ioctx, image_name) as img:
             stat = img.stat()
+            mirror_info = img.mirror_image_get_info()
             mirror_mode = img.mirror_image_get_mode()
             mirror_mode = img.mirror_image_get_mode()
-            if mirror_mode == rbd.RBD_MIRROR_IMAGE_MODE_JOURNAL:
+            if mirror_mode == rbd.RBD_MIRROR_IMAGE_MODE_JOURNAL and mirror_info['state'] != rbd.RBD_MIRROR_IMAGE_DISABLED:  # noqa E501 #pylint: disable=line-too-long
                 stat['mirror_mode'] = 'journal'
             elif mirror_mode == rbd.RBD_MIRROR_IMAGE_MODE_SNAPSHOT:
                 stat['mirror_mode'] = 'snapshot'
                 stat['mirror_mode'] = 'journal'
             elif mirror_mode == rbd.RBD_MIRROR_IMAGE_MODE_SNAPSHOT:
                 stat['mirror_mode'] = 'snapshot'
@@ -282,7 +284,7 @@ class RbdService(object):
                     if scheduled_image['image'] == get_image_spec(pool_name, namespace, image_name):
                         stat['schedule_info'] = scheduled_image
             else:
                     if scheduled_image['image'] == get_image_spec(pool_name, namespace, image_name):
                         stat['schedule_info'] = scheduled_image
             else:
-                stat['mirror_mode'] = 'unknown'
+                stat['mirror_mode'] = 'Disabled'
 
             stat['name'] = image_name
             if img.old_format():
 
             stat['name'] = image_name
             if img.old_format():
@@ -440,50 +442,30 @@ class RbdService(object):
     @classmethod
     def rbd_pool_list(cls, pool_names: List[str], namespace: Optional[str] = None, offset: int = 0,
                       limit: int = 5, search: str = '', sort: str = ''):
     @classmethod
     def rbd_pool_list(cls, pool_names: List[str], namespace: Optional[str] = None, offset: int = 0,
                       limit: int = 5, search: str = '', sort: str = ''):
-        offset = int(offset)
-        limit = int(limit)
-        # let's use -1 to denotate we want ALL images for now. Iscsi currently gathers
-        # all images therefore, we need this.
-        if limit < -1:
-            raise DashboardException(msg=f'Wrong limit value {limit}', code=400)
-
-        refs = cls._rbd_pool_image_refs(pool_names, namespace)
-        image_refs = []
-        # transform to list so that we can count
-        for ref in refs:
-            if search in ref['name']:
-                image_refs.append(ref)
-            elif search in ref['pool_name']:
-                image_refs.append(ref)
-            elif search in ref['namespace']:
-                image_refs.append(ref)
+        image_refs = cls._rbd_pool_image_refs(pool_names, namespace)
+        params = ['name', 'pool_name', 'namespace']
+        paginator = ListPaginator(offset, limit, sort, search, image_refs,
+                                  searchable_params=params, sortable_params=params,
+                                  default_sort='+name')
 
         result = []
 
         result = []
-        end = offset + limit
-        if len(sort) < 2:
-            sort = '+name'
-        descending = sort[0] == '-'
-        sort_by = sort[1:]
-        if sort_by not in ['name', 'pool_name', 'namespace']:
-            sort_by = 'name'
-        if limit == -1:
-            end = len(image_refs)
-        for image_ref in sorted(image_refs, key=lambda v: v[sort_by],
-                                reverse=descending)[offset:end]:
-            ioctx = cls.get_ioctx(image_ref['pool_name'], namespace=image_ref['namespace'])
-            try:
-                stat = cls._rbd_image_stat(
-                    ioctx, image_ref['pool_name'], image_ref['namespace'], image_ref['name'])
-            except rbd.ImageNotFound:
+        for image_ref in paginator.list():
+            with mgr.rados.open_ioctx(image_ref['pool_name']) as ioctx:
+                ioctx.set_namespace(image_ref['namespace'])
                 # Check if the RBD has been deleted partially. This happens for example if
                 # the deletion process of the RBD has been started and was interrupted.
                 # Check if the RBD has been deleted partially. This happens for example if
                 # the deletion process of the RBD has been started and was interrupted.
+
                 try:
                 try:
-                    stat = cls._rbd_image_stat_removing(
-                        ioctx, image_ref['pool_name'], image_ref['namespace'], image_ref['id'])
+                    stat = cls._rbd_image_stat(
+                        ioctx, image_ref['pool_name'], image_ref['namespace'], image_ref['name'])
                 except rbd.ImageNotFound:
                 except rbd.ImageNotFound:
-                    continue
-            result.append(stat)
-        return result, len(image_refs)
+                    try:
+                        stat = cls._rbd_image_stat_removing(
+                            ioctx, image_ref['pool_name'], image_ref['namespace'], image_ref['id'])
+                    except rbd.ImageNotFound:
+                        continue
+                result.append(stat)
+        return result, paginator.get_count()
 
     @classmethod
     def get_image(cls, image_spec):
 
     @classmethod
     def get_image(cls, image_spec):
index 1c1acddd69eb6f5e2dd06cacb9bbe17c99b271d3..242600c2265b07098fb0202b137ec4b8e2882469 100644 (file)
@@ -84,7 +84,7 @@ def _determine_rgw_addr(daemon_info: Dict[str, Any]) -> RgwDaemon:
     Parse RGW daemon info to determine the configured host (IP address) and port.
     """
     daemon = RgwDaemon()
     Parse RGW daemon info to determine the configured host (IP address) and port.
     """
     daemon = RgwDaemon()
-    daemon.host = _parse_addr(daemon_info['addr'])
+    daemon.host = daemon_info['metadata']['hostname']
     daemon.port, daemon.ssl = _parse_frontend_config(daemon_info['metadata']['frontend_config#0'])
 
     return daemon
     daemon.port, daemon.ssl = _parse_frontend_config(daemon_info['metadata']['frontend_config#0'])
 
     return daemon
@@ -267,6 +267,7 @@ def configure_rgw_credentials():
         raise NoCredentialsException
 
 
         raise NoCredentialsException
 
 
+# pylint: disable=R0904
 class RgwClient(RestClient):
     _host = None
     _port = None
 class RgwClient(RestClient):
     _host = None
     _port = None
@@ -646,6 +647,50 @@ class RgwClient(RestClient):
                                      http_status_code=error.status_code,
                                      component='rgw')
 
                                      http_status_code=error.status_code,
                                      component='rgw')
 
+    @RestClient.api_get('/{bucket_name}?encryption')
+    def get_bucket_encryption(self, bucket_name, request=None):
+        # pylint: disable=unused-argument
+        try:
+            result = request()  # type: ignore
+            result['Status'] = 'Enabled'
+            return result
+        except RequestException as e:
+            if e.content:
+                content = json_str_to_object(e.content)
+                if content.get(
+                        'Code') == 'ServerSideEncryptionConfigurationNotFoundError':
+                    return {
+                        'Status': 'Disabled',
+                    }
+            raise e
+
+    @RestClient.api_delete('/{bucket_name}?encryption')
+    def delete_bucket_encryption(self, bucket_name, request=None):
+        # pylint: disable=unused-argument
+        result = request()  # type: ignore
+        return result
+
+    @RestClient.api_put('/{bucket_name}?encryption')
+    def set_bucket_encryption(self, bucket_name, key_id,
+                              sse_algorithm, request: Optional[object] = None):
+        # pylint: disable=unused-argument
+        encryption_configuration = ET.Element('ServerSideEncryptionConfiguration')
+        rule_element = ET.SubElement(encryption_configuration, 'Rule')
+        default_encryption_element = ET.SubElement(rule_element,
+                                                   'ApplyServerSideEncryptionByDefault')
+        sse_algo_element = ET.SubElement(default_encryption_element,
+                                         'SSEAlgorithm')
+        sse_algo_element.text = sse_algorithm
+        if sse_algorithm == 'aws:kms':
+            kms_master_key_element = ET.SubElement(default_encryption_element,
+                                                   'KMSMasterKeyID')
+            kms_master_key_element.text = key_id
+        data = ET.tostring(encryption_configuration, encoding='unicode')
+        try:
+            _ = request(data=data)  # type: ignore
+        except RequestException as e:
+            raise DashboardException(msg=str(e), component='rgw')
+
     @RestClient.api_get('/{bucket_name}?object-lock')
     def get_bucket_locking(self, bucket_name, request=None):
         # type: (str, Optional[object]) -> dict
     @RestClient.api_get('/{bucket_name}?object-lock')
     def get_bucket_locking(self, bucket_name, request=None):
         # type: (str, Optional[object]) -> dict
index aceeaff3de042097a8f7fc10d6c477bcaf578ea9..1155c1d5c6f458c1fe26ec70131ec69f6d9c23b7 100644 (file)
@@ -20,6 +20,7 @@ class TcmuService(object):
     def get_iscsi_info():
         daemons = {}  # type: Dict[str, dict]
         images = {}  # type: Dict[str, dict]
     def get_iscsi_info():
         daemons = {}  # type: Dict[str, dict]
         images = {}  # type: Dict[str, dict]
+        daemon = None
         for service in CephService.get_service_list(SERVICE_TYPE):
             metadata = service['metadata']
             if metadata is None:
         for service in CephService.get_service_list(SERVICE_TYPE):
             metadata = service['metadata']
             if metadata is None:
index 2859e89a2599815cdf0a888711a0bc5714a5cee9..d262d27d7fc58f951aceeca621ee44afe2b7ee32 100644 (file)
@@ -14,7 +14,7 @@ import cherrypy
 from cherrypy._cptools import HandlerWrapperTool
 from cherrypy.test import helper
 from mgr_module import HandleCommandResult
 from cherrypy._cptools import HandlerWrapperTool
 from cherrypy.test import helper
 from mgr_module import HandleCommandResult
-from orchestrator import HostSpec, InventoryHost
+from orchestrator import DaemonDescription, HostSpec, InventoryHost
 from pyfakefs import fake_filesystem
 
 from .. import mgr
 from pyfakefs import fake_filesystem
 
 from .. import mgr
@@ -290,7 +290,8 @@ class RgwStub(Stub):
                     'id': 'daemon1',
                     'realm_name': 'realm1',
                     'zonegroup_name': 'zonegroup1',
                     'id': 'daemon1',
                     'realm_name': 'realm1',
                     'zonegroup_name': 'zonegroup1',
-                    'zone_name': 'zone1'
+                    'zone_name': 'zone1',
+                    'hostname': 'daemon1.server.lan'
                 }
             },
             '5398': {
                 }
             },
             '5398': {
@@ -300,7 +301,8 @@ class RgwStub(Stub):
                     'id': 'daemon2',
                     'realm_name': 'realm2',
                     'zonegroup_name': 'zonegroup2',
                     'id': 'daemon2',
                     'realm_name': 'realm2',
                     'zonegroup_name': 'zonegroup2',
-                    'zone_name': 'zone2'
+                    'zone_name': 'zone2',
+                    'hostname': 'daemon2.server.lan'
                 }
             }
         }}}})
                 }
             }
         }}}})
@@ -345,12 +347,22 @@ class Waiter(threading.Thread):
 @contextlib.contextmanager
 def patch_orch(available: bool, missing_features: Optional[List[str]] = None,
                hosts: Optional[List[HostSpec]] = None,
 @contextlib.contextmanager
 def patch_orch(available: bool, missing_features: Optional[List[str]] = None,
                hosts: Optional[List[HostSpec]] = None,
-               inventory: Optional[List[dict]] = None):
+               inventory: Optional[List[dict]] = None,
+               daemons: Optional[List[DaemonDescription]] = None):
     with mock.patch('dashboard.controllers.orchestrator.OrchClient.instance') as instance:
         fake_client = mock.Mock()
         fake_client.available.return_value = available
         fake_client.get_missing_features.return_value = missing_features
 
     with mock.patch('dashboard.controllers.orchestrator.OrchClient.instance') as instance:
         fake_client = mock.Mock()
         fake_client.available.return_value = available
         fake_client.get_missing_features.return_value = missing_features
 
+        if not daemons:
+            daemons = [
+                DaemonDescription(
+                    daemon_type='mon',
+                    daemon_id='a',
+                    hostname='node0'
+                )
+            ]
+        fake_client.services.list_daemons.return_value = daemons
         if hosts is not None:
             fake_client.hosts.list.return_value = hosts
 
         if hosts is not None:
             fake_client.hosts.list.return_value = hosts
 
index 0f55ce52247c117fea36972700a8daace03f60be..a41d33e713c600d19c759de85fbef24532f05e4f 100644 (file)
@@ -1,7 +1,7 @@
 import unittest
 from unittest import mock
 
 import unittest
 from unittest import mock
 
-from orchestrator import HostSpec
+from orchestrator import DaemonDescription, HostSpec
 
 from .. import mgr
 from ..controllers._version import APIVersion
 
 from .. import mgr
 from ..controllers._version import APIVersion
@@ -123,14 +123,14 @@ class HostControllerTest(ControllerTestCase):
             self._get('{}?facts=true'.format(self.URL_HOST), version=APIVersion(1, 1))
             self.assertStatus(200)
             self.assertHeader('Content-Type',
             self._get('{}?facts=true'.format(self.URL_HOST), version=APIVersion(1, 1))
             self.assertStatus(200)
             self.assertHeader('Content-Type',
-                              'application/vnd.ceph.api.v1.1+json')
+                              APIVersion(1, 2).to_mime_type())
             self.assertJsonBody(hosts_with_facts)
 
             # test with ?facts=false
             self._get('{}?facts=false'.format(self.URL_HOST), version=APIVersion(1, 1))
             self.assertStatus(200)
             self.assertHeader('Content-Type',
             self.assertJsonBody(hosts_with_facts)
 
             # test with ?facts=false
             self._get('{}?facts=false'.format(self.URL_HOST), version=APIVersion(1, 1))
             self.assertStatus(200)
             self.assertHeader('Content-Type',
-                              'application/vnd.ceph.api.v1.1+json')
+                              APIVersion(1, 2).to_mime_type())
             self.assertJsonBody(hosts_without_facts)
 
         # test with orchestrator available but orch backend!=cephadm
             self.assertJsonBody(hosts_without_facts)
 
         # test with orchestrator available but orch backend!=cephadm
@@ -152,7 +152,7 @@ class HostControllerTest(ControllerTestCase):
             self._get('{}?facts=false'.format(self.URL_HOST), version=APIVersion(1, 1))
             self.assertStatus(200)
             self.assertHeader('Content-Type',
             self._get('{}?facts=false'.format(self.URL_HOST), version=APIVersion(1, 1))
             self.assertStatus(200)
             self.assertHeader('Content-Type',
-                              'application/vnd.ceph.api.v1.1+json')
+                              APIVersion(1, 2).to_mime_type())
             self.assertJsonBody(hosts_without_facts)
 
     def test_get_1(self):
             self.assertJsonBody(hosts_without_facts)
 
     def test_get_1(self):
@@ -163,7 +163,10 @@ class HostControllerTest(ControllerTestCase):
             self.assertStatus(404)
 
     def test_get_2(self):
             self.assertStatus(404)
 
     def test_get_2(self):
-        mgr.list_servers.return_value = [{'hostname': 'node1'}]
+        mgr.list_servers.return_value = [{
+            'hostname': 'node1',
+            'services': []
+        }]
 
         with patch_orch(False):
             self._get('{}/node1'.format(self.URL_HOST))
 
         with patch_orch(False):
             self._get('{}/node1'.format(self.URL_HOST))
@@ -182,6 +185,87 @@ class HostControllerTest(ControllerTestCase):
             self.assertIn('status', self.json_body())
             self.assertIn('addr', self.json_body())
 
             self.assertIn('status', self.json_body())
             self.assertIn('addr', self.json_body())
 
+    def test_populate_service_instances(self):
+        mgr.list_servers.return_value = []
+
+        node1_daemons = [
+            DaemonDescription(
+                hostname='node1',
+                daemon_type='mon',
+                daemon_id='a'
+            ),
+            DaemonDescription(
+                hostname='node1',
+                daemon_type='mon',
+                daemon_id='b'
+            )
+        ]
+
+        node2_daemons = [
+            DaemonDescription(
+                hostname='node2',
+                daemon_type='mgr',
+                daemon_id='x'
+            ),
+            DaemonDescription(
+                hostname='node2',
+                daemon_type='mon',
+                daemon_id='c'
+            )
+        ]
+
+        node1_instances = [{
+            'type': 'mon',
+            'count': 2
+        }]
+
+        node2_instances = [{
+            'type': 'mgr',
+            'count': 1
+        }, {
+            'type': 'mon',
+            'count': 1
+        }]
+
+        # test with orchestrator available
+        with patch_orch(True,
+                        hosts=[HostSpec('node1'), HostSpec('node2')]) as fake_client:
+            fake_client.services.list_daemons.return_value = node1_daemons
+            self._get('{}/node1'.format(self.URL_HOST))
+            self.assertStatus(200)
+            self.assertIn('service_instances', self.json_body())
+            self.assertEqual(self.json_body()['service_instances'], node1_instances)
+
+            fake_client.services.list_daemons.return_value = node2_daemons
+            self._get('{}/node2'.format(self.URL_HOST))
+            self.assertStatus(200)
+            self.assertIn('service_instances', self.json_body())
+            self.assertEqual(self.json_body()['service_instances'], node2_instances)
+
+        # test with no orchestrator available
+        with patch_orch(False):
+            mgr.list_servers.return_value = [{
+                'hostname': 'node1',
+                'services': [{
+                    'type': 'mon',
+                    'id': 'a'
+                }, {
+                    'type': 'mgr',
+                    'id': 'b'
+                }]
+            }]
+            self._get('{}/node1'.format(self.URL_HOST))
+            self.assertStatus(200)
+            self.assertIn('service_instances', self.json_body())
+            self.assertEqual(self.json_body()['service_instances'],
+                             [{
+                                 'type': 'mon',
+                                 'count': 1
+                             }, {
+                                 'type': 'mgr',
+                                 'count': 1
+                             }])
+
     @mock.patch('dashboard.controllers.host.add_host')
     def test_add_host(self, mock_add_host):
         with patch_orch(True):
     @mock.patch('dashboard.controllers.host.add_host')
     def test_add_host(self, mock_add_host):
         with patch_orch(True):
@@ -375,9 +459,11 @@ class HostUiControllerTest(ControllerTestCase):
 class TestHosts(unittest.TestCase):
     def test_get_hosts(self):
         mgr.list_servers.return_value = [{
 class TestHosts(unittest.TestCase):
     def test_get_hosts(self):
         mgr.list_servers.return_value = [{
-            'hostname': 'node1'
+            'hostname': 'node1',
+            'services': []
         }, {
         }, {
-            'hostname': 'localhost'
+            'hostname': 'localhost',
+            'services': []
         }]
         orch_hosts = [
             HostSpec('node1', labels=['foo', 'bar']),
         }]
         orch_hosts = [
             HostSpec('node1', labels=['foo', 'bar']),
@@ -499,11 +585,15 @@ class TestHosts(unittest.TestCase):
             host0 = inventories[0]
             self.assertEqual(host0['name'], 'host-0')
             self.assertEqual(host0['addr'], '1.2.3.4')
             host0 = inventories[0]
             self.assertEqual(host0['name'], 'host-0')
             self.assertEqual(host0['addr'], '1.2.3.4')
-            self.assertEqual(host0['devices'][0]['osd_ids'], [1, 2])
-            self.assertEqual(host0['devices'][1]['osd_ids'], [1])
-            self.assertEqual(host0['devices'][2]['osd_ids'], [2])
+            # devices should be sorted by path name, so
+            # /dev/sdb, /dev/sdc, nvme0n1
+            self.assertEqual(host0['devices'][0]['osd_ids'], [1])
+            self.assertEqual(host0['devices'][1]['osd_ids'], [2])
+            self.assertEqual(host0['devices'][2]['osd_ids'], [1, 2])
             host1 = inventories[1]
             self.assertEqual(host1['name'], 'host-1')
             self.assertEqual(host1['addr'], '1.2.3.5')
             host1 = inventories[1]
             self.assertEqual(host1['name'], 'host-1')
             self.assertEqual(host1['addr'], '1.2.3.5')
+            # devices should be sorted by path name, so
+            # /dev/sda, sdb
             self.assertEqual(host1['devices'][0]['osd_ids'], [])
             self.assertEqual(host1['devices'][1]['osd_ids'], [3])
             self.assertEqual(host1['devices'][0]['osd_ids'], [])
             self.assertEqual(host1['devices'][1]['osd_ids'], [3])
index 60571d8e5543f2ec4a9be4c62a516babff2702d2..fd36f681b72d11c490e6873a98cf7668976f9381 100644 (file)
@@ -31,7 +31,11 @@ mock_get_metadata = {
 
 _status = {
     1: {
 
 _status = {
     1: {
-        'callouts': {},
+        'callouts': {
+            'image': {
+                'level': 'warning',
+            }
+        },
         'image_local_count': 5,
         'image_remote_count': 6,
         'image_error_count': 7,
         'image_local_count': 5,
         'image_remote_count': 6,
         'image_error_count': 7,
@@ -108,14 +112,15 @@ class GetDaemonAndPoolsTest(unittest.TestCase):
         mock_rbd_instance = mock_rbd.return_value
         mock_rbd_instance.mirror_peer_list.return_value = []
         test_cases = self._get_pool_test_cases()
         mock_rbd_instance = mock_rbd.return_value
         mock_rbd_instance.mirror_peer_list.return_value = []
         test_cases = self._get_pool_test_cases()
-        for new_status, mirror_mode, expected_output in test_cases:
+        for new_status, pool_mirror_mode, images_summary, expected_output in test_cases:
             _status[1].update(new_status)
             daemon_status = {
                 'json': json.dumps(_status)
             }
             mgr.get_daemon_status.return_value = daemon_status
             daemons = get_daemons()
             _status[1].update(new_status)
             daemon_status = {
                 'json': json.dumps(_status)
             }
             mgr.get_daemon_status.return_value = daemon_status
             daemons = get_daemons()
-            mock_rbd_instance.mirror_mode_get.return_value = mirror_mode
+            mock_rbd_instance.mirror_mode_get.return_value = pool_mirror_mode
+            mock_rbd_instance.mirror_image_status_summary.return_value = images_summary
             res = get_pools(daemons)
             for k, v in expected_output.items():
                 self.assertTrue(v == res['rbd'][k])
             res = get_pools(daemons)
             for k, v in expected_output.items():
                 self.assertTrue(v == res['rbd'][k])
@@ -123,11 +128,16 @@ class GetDaemonAndPoolsTest(unittest.TestCase):
 
     def _get_pool_test_cases(self):
         test_cases = [
 
     def _get_pool_test_cases(self):
         test_cases = [
+            # 1. daemon status
+            # 2. Pool mirror mock_get_daemon_status
+            # 3. Image health summary
+            # 4. Pool health output
             (
                 {
                     'image_error_count': 7,
                 },
                 rbd.RBD_MIRROR_MODE_IMAGE,
             (
                 {
                     'image_error_count': 7,
                 },
                 rbd.RBD_MIRROR_MODE_IMAGE,
+                [(rbd.MIRROR_IMAGE_STATUS_STATE_UNKNOWN, None)],
                 {
                     'health_color': 'warning',
                     'health': 'Warning'
                 {
                     'health_color': 'warning',
                     'health': 'Warning'
@@ -137,7 +147,8 @@ class GetDaemonAndPoolsTest(unittest.TestCase):
                 {
                     'image_error_count': 7,
                 },
                 {
                     'image_error_count': 7,
                 },
-                rbd.RBD_MIRROR_MODE_DISABLED,
+                rbd.RBD_MIRROR_MODE_POOL,
+                [(rbd.MIRROR_IMAGE_STATUS_STATE_ERROR, None)],
                 {
                     'health_color': 'error',
                     'health': 'Error'
                 {
                     'health_color': 'error',
                     'health': 'Error'
@@ -150,6 +161,7 @@ class GetDaemonAndPoolsTest(unittest.TestCase):
                     'leader_id': 1
                 },
                 rbd.RBD_MIRROR_MODE_DISABLED,
                     'leader_id': 1
                 },
                 rbd.RBD_MIRROR_MODE_DISABLED,
+                [],
                 {
                     'health_color': 'info',
                     'health': 'Disabled'
                 {
                     'health_color': 'info',
                     'health': 'Disabled'
@@ -280,7 +292,8 @@ class RbdMirroringSummaryControllerTest(ControllerTestCase):
         self.assertStatus(200)
 
         summary = self.json_body()['rbd_mirroring']
         self.assertStatus(200)
 
         summary = self.json_body()['rbd_mirroring']
-        self.assertEqual(summary, {'errors': 0, 'warnings': 1})
+        # 2 warnings: 1 for the daemon, 1 for the pool
+        self.assertEqual(summary, {'errors': 0, 'warnings': 2})
 
 
 class RbdMirroringStatusControllerTest(ControllerTestCase):
 
 
 class RbdMirroringStatusControllerTest(ControllerTestCase):
index 4ba95ac24d7cfd14f07420b44ecfb7f397fded06..1f5d28f66611061215c58730dcf1b083b1107f9d 100644 (file)
@@ -30,6 +30,7 @@ deps =
     -rrequirements-lint.txt
 
 [testenv]
     -rrequirements-lint.txt
 
 [testenv]
+basepython=python3
 deps =
     {[base]deps}
     {[base-test]deps}
 deps =
     {[base]deps}
     {[base-test]deps}
@@ -47,7 +48,6 @@ commands =
     pytest {posargs}
 
 [testenv:run]
     pytest {posargs}
 
 [testenv:run]
-basepython=python3
 deps =
     {[base]deps}
     {[base-test]deps}
 deps =
     {[base]deps}
     {[base-test]deps}
@@ -99,7 +99,6 @@ commands =
     rstcheck --report info --debug -- {[rstlint]dirs}
 
 [testenv:lint]
     rstcheck --report info --debug -- {[rstlint]dirs}
 
 [testenv:lint]
-basepython=python3
 deps =
     {[base]deps}
     {[base-lint]deps}
 deps =
     {[base]deps}
     {[base-lint]deps}
@@ -112,13 +111,11 @@ commands =
     {[base-rst]commands}
 
 [testenv:flake8]
     {[base-rst]commands}
 
 [testenv:flake8]
-basepython = python3
 deps = {[base-lint]deps}
 commands =
     flake8 --config=tox.ini {posargs}
 
 [testenv:pylint]
 deps = {[base-lint]deps}
 commands =
     flake8 --config=tox.ini {posargs}
 
 [testenv:pylint]
-basepython = python3
 deps =
     {[base]deps}
     {[base-lint]deps}
 deps =
     {[base]deps}
     {[base-lint]deps}
@@ -126,7 +123,6 @@ commands =
     pylint {[pylint]addopts} {posargs:{[pylint]dirs}}
 
 [testenv:rst]
     pylint {[pylint]addopts} {posargs:{[pylint]dirs}}
 
 [testenv:rst]
-basepython = python3
 deps = {[base-lint]deps}
 commands =
     rstcheck --report info --debug -- {posargs:{[rstlint]dirs}}
 deps = {[base-lint]deps}
 commands =
     rstcheck --report info --debug -- {posargs:{[rstlint]dirs}}
@@ -142,7 +138,6 @@ addopts =
 #    --aggressive
 
 [testenv:fix]
 #    --aggressive
 
 [testenv:fix]
-basepython=python3
 deps =
     {[base-lint]deps}
 commands =
 deps =
     {[base-lint]deps}
 commands =
@@ -156,7 +151,6 @@ commands =
     python ci/check_grafana_dashboards.py frontend/src/app ../../../../monitoring/ceph-mixin/dashboards_out
 
 [testenv:openapi-{check,fix}]
     python ci/check_grafana_dashboards.py frontend/src/app ../../../../monitoring/ceph-mixin/dashboards_out
 
 [testenv:openapi-{check,fix}]
-basepython = python3
 allowlist_externals = diff
 description =
     check: Ensure that auto-generated OpenAPI Specification matches the current version
 allowlist_externals = diff
 description =
     check: Ensure that auto-generated OpenAPI Specification matches the current version
index 1730cdc226fca262f41ecf3106270c5156e0bb5b..338b03dfdd7573994772d75261b4f54ed2693b4d 100644 (file)
@@ -404,7 +404,7 @@ class CLICommand(object):
                 continue
             arg_spec[argname] = argtype
             args.append(CephArgtype.to_argdesc(
                 continue
             arg_spec[argname] = argtype
             args.append(CephArgtype.to_argdesc(
-                argtype, dict(name=arg), has_default=True, positional=False
+                argtype, dict(name=argname), has_default=True, positional=False
             ))
         return desc, arg_spec, first_default, ' '.join(args)
 
             ))
         return desc, arg_spec, first_default, ' '.join(args)
 
@@ -1197,6 +1197,7 @@ class MgrModule(ceph_module.BaseMgrModule, MgrModuleLoggingMixin):
         db.execute('PRAGMA JOURNAL_MODE = PERSIST')
         db.execute('PRAGMA PAGE_SIZE = 65536')
         db.execute('PRAGMA CACHE_SIZE = 64')
         db.execute('PRAGMA JOURNAL_MODE = PERSIST')
         db.execute('PRAGMA PAGE_SIZE = 65536')
         db.execute('PRAGMA CACHE_SIZE = 64')
+        db.execute('PRAGMA TEMP_STORE = memory')
         db.row_factory = sqlite3.Row
         self.load_schema(db)
 
         db.row_factory = sqlite3.Row
         self.load_schema(db)
 
@@ -1562,7 +1563,7 @@ class MgrModule(ceph_module.BaseMgrModule, MgrModuleLoggingMixin):
         :rtype: dict, or None if no metadata found
         """
         metadata = self._ceph_get_metadata(svc_type, svc_id)
         :rtype: dict, or None if no metadata found
         """
         metadata = self._ceph_get_metadata(svc_type, svc_id)
-        if metadata is None:
+        if not metadata:
             return default
         return metadata
 
             return default
         return metadata
 
@@ -2273,6 +2274,13 @@ class MgrModule(ceph_module.BaseMgrModule, MgrModuleLoggingMixin):
         """
         return self._ceph_get_mds_perf_counters(query_id)
 
         """
         return self._ceph_get_mds_perf_counters(query_id)
 
+    def get_daemon_health_metrics(self) -> Dict[str, List[Dict[str, Any]]]:
+        """
+        Get the list of health metrics per daemon. This includes SLOW_OPS health metrics
+        in MON and OSD daemons, and PENDING_CREATING_PGS health metrics for OSDs.
+        """
+        return self._ceph_get_daemon_health_metrics()
+
     def is_authorized(self, arguments: Dict[str, str]) -> bool:
         """
         Verifies that the current session caps permit executing the py service
     def is_authorized(self, arguments: Dict[str, str]) -> bool:
         """
         Verifies that the current session caps permit executing the py service
index 1a86967cb4a32c797827367fac96132dd855be75..ddc9bfa4a2dac7adb3b9de3387b22c4225ec69a7 100644 (file)
@@ -12,7 +12,7 @@ import time
 import logging
 import sys
 from threading import Lock, Condition, Event
 import logging
 import sys
 from threading import Lock, Condition, Event
-from typing import no_type_check
+from typing import no_type_check, NewType
 import urllib
 from functools import wraps
 if sys.version_info >= (3, 3):
 import urllib
 from functools import wraps
 if sys.version_info >= (3, 3):
@@ -29,6 +29,8 @@ T = TypeVar('T')
 if TYPE_CHECKING:
     from mgr_module import MgrModule
 
 if TYPE_CHECKING:
     from mgr_module import MgrModule
 
+ConfEntity = NewType('ConfEntity', str)
+
 Module_T = TypeVar('Module_T', bound="MgrModule")
 
 (
 Module_T = TypeVar('Module_T', bound="MgrModule")
 
 (
@@ -700,6 +702,18 @@ def get_time_series_rates(data: List[Tuple[float, float]]) -> List[Tuple[float,
     return [(data2[0], _derivative(data1, data2) if data1 is not None else 0.0) for data1, data2 in
             _pairwise(data)]
 
     return [(data2[0], _derivative(data1, data2) if data1 is not None else 0.0) for data1, data2 in
             _pairwise(data)]
 
+def name_to_config_section(name: str) -> ConfEntity:
+    """
+    Map from daemon names to ceph entity names (as seen in config)
+    """
+    daemon_type = name.split('.', 1)[0]
+    if daemon_type in ['rgw', 'rbd-mirror', 'nfs', 'crash', 'iscsi']:
+        return ConfEntity('client.' + name)
+    elif daemon_type in ['mon', 'osd', 'mds', 'mgr', 'client']:
+        return ConfEntity(name)
+    else:
+        return ConfEntity('mon')
+
 
 def _filter_time_series(data: List[Tuple[float, float]]) -> List[Tuple[float, float]]:
     """ Filters time series data
 
 def _filter_time_series(data: List[Tuple[float, float]]) -> List[Tuple[float, float]]:
     """ Filters time series data
index 61bc477727baa5ba2d5e80c4697d512e7c4f4e23..d0adaa49d7dec217f9ee65d29c6a6aa0a8ec4e89 100644 (file)
@@ -201,6 +201,8 @@ class NFSCluster:
 
     def show_nfs_cluster_info(self, cluster_id: Optional[str] = None) -> Tuple[int, str, str]:
         try:
 
     def show_nfs_cluster_info(self, cluster_id: Optional[str] = None) -> Tuple[int, str, str]:
         try:
+            if cluster_id and cluster_id not in available_clusters(self.mgr):
+                raise ClusterNotFound()
             info_res = {}
             if cluster_id:
                 cluster_ls = [cluster_id]
             info_res = {}
             if cluster_id:
                 cluster_ls = [cluster_id]
index 6f129e55c528204944e54772ba5673f163b9a593..8fabb78f247a0edc4341a56579c5a93d24925c98 100644 (file)
@@ -635,7 +635,8 @@ class ExportMgr:
                              path: str,
                              squash: str,
                              access_type: str,
                              path: str,
                              squash: str,
                              access_type: str,
-                             clients: list = []) -> Tuple[int, str, str]:
+                             clients: list = [],
+                             sectype: Optional[List[str]] = None) -> Tuple[int, str, str]:
         pseudo_path = normalize_path(pseudo_path)
 
         if not self._fetch_export(cluster_id, pseudo_path):
         pseudo_path = normalize_path(pseudo_path)
 
         if not self._fetch_export(cluster_id, pseudo_path):
@@ -652,6 +653,7 @@ class ExportMgr:
                         "fs_name": fs_name,
                     },
                     "clients": clients,
                         "fs_name": fs_name,
                     },
                     "clients": clients,
+                    "sectype": sectype,
                 }
             )
             log.debug("creating cephfs export %s", export)
                 }
             )
             log.debug("creating cephfs export %s", export)
@@ -675,7 +677,8 @@ class ExportMgr:
                           squash: str,
                           bucket: Optional[str] = None,
                           user_id: Optional[str] = None,
                           squash: str,
                           bucket: Optional[str] = None,
                           user_id: Optional[str] = None,
-                          clients: list = []) -> Tuple[int, str, str]:
+                          clients: list = [],
+                          sectype: Optional[List[str]] = None) -> Tuple[int, str, str]:
         pseudo_path = normalize_path(pseudo_path)
 
         if not bucket and not user_id:
         pseudo_path = normalize_path(pseudo_path)
 
         if not bucket and not user_id:
@@ -695,6 +698,7 @@ class ExportMgr:
                         "user_id": user_id,
                     },
                     "clients": clients,
                         "user_id": user_id,
                     },
                     "clients": clients,
+                    "sectype": sectype,
                 }
             )
             log.debug("creating rgw export %s", export)
                 }
             )
             log.debug("creating rgw export %s", export)
index 17d967e77e5cda8049eb86b236e10054d8a2892b..31aaa4ea11c38f8f04781eec19f87418185ec921 100644 (file)
@@ -46,6 +46,13 @@ def _validate_access_type(access_type: str) -> None:
         )
 
 
         )
 
 
+def _validate_sec_type(sec_type: str) -> None:
+    valid_sec_types = ["none", "sys", "krb5", "krb5i", "krb5p"]
+    if not isinstance(sec_type, str) or sec_type not in valid_sec_types:
+        raise NFSInvalidOperation(
+            f"SecType {sec_type} invalid, valid types are {valid_sec_types}")
+
+
 class RawBlock():
     def __init__(self, block_name: str, blocks: List['RawBlock'] = [], values: Dict[str, Any] = {}):
         if not values:  # workaround mutable default argument
 class RawBlock():
     def __init__(self, block_name: str, blocks: List['RawBlock'] = [], values: Dict[str, Any] = {}):
         if not values:  # workaround mutable default argument
@@ -355,7 +362,8 @@ class Export:
             protocols: List[int],
             transports: List[str],
             fsal: FSAL,
             protocols: List[int],
             transports: List[str],
             fsal: FSAL,
-            clients: Optional[List[Client]] = None) -> None:
+            clients: Optional[List[Client]] = None,
+            sectype: Optional[List[str]] = None) -> None:
         self.export_id = export_id
         self.path = path
         self.fsal = fsal
         self.export_id = export_id
         self.path = path
         self.fsal = fsal
@@ -368,6 +376,7 @@ class Export:
         self.protocols = protocols
         self.transports = transports
         self.clients: List[Client] = clients or []
         self.protocols = protocols
         self.transports = transports
         self.clients: List[Client] = clients or []
+        self.sectype = sectype
 
     @classmethod
     def from_export_block(cls, export_block: RawBlock, cluster_id: str) -> 'Export':
 
     @classmethod
     def from_export_block(cls, export_block: RawBlock, cluster_id: str) -> 'Export':
@@ -387,6 +396,11 @@ class Export:
         elif not transports:
             transports = []
 
         elif not transports:
             transports = []
 
+        # if this module wrote the ganesha conf the param is camelcase
+        # "SecType".  but for compatiblity with manually edited ganesha confs,
+        # accept "sectype" too.
+        sectype = (export_block.values.get("SecType")
+                   or export_block.values.get("sectype") or None)
         return cls(export_block.values['export_id'],
                    export_block.values['path'],
                    cluster_id,
         return cls(export_block.values['export_id'],
                    export_block.values['path'],
                    cluster_id,
@@ -398,10 +412,11 @@ class Export:
                    transports,
                    FSAL.from_fsal_block(fsal_blocks[0]),
                    [Client.from_client_block(client)
                    transports,
                    FSAL.from_fsal_block(fsal_blocks[0]),
                    [Client.from_client_block(client)
-                    for client in client_blocks])
+                    for client in client_blocks],
+                   sectype=sectype)
 
     def to_export_block(self) -> RawBlock:
 
     def to_export_block(self) -> RawBlock:
-        result = RawBlock('EXPORT', values={
+        values = {
             'export_id': self.export_id,
             'path': self.path,
             'pseudo': self.pseudo,
             'export_id': self.export_id,
             'path': self.path,
             'pseudo': self.pseudo,
@@ -411,7 +426,10 @@ class Export:
             'security_label': self.security_label,
             'protocols': self.protocols,
             'transports': self.transports,
             'security_label': self.security_label,
             'protocols': self.protocols,
             'transports': self.transports,
-        })
+        }
+        if self.sectype:
+            values['SecType'] = self.sectype
+        result = RawBlock("EXPORT", values=values)
         result.blocks = [
             self.fsal.to_fsal_block()
         ] + [
         result.blocks = [
             self.fsal.to_fsal_block()
         ] + [
@@ -432,10 +450,11 @@ class Export:
                    ex_dict.get('protocols', [4]),
                    ex_dict.get('transports', ['TCP']),
                    FSAL.from_dict(ex_dict.get('fsal', {})),
                    ex_dict.get('protocols', [4]),
                    ex_dict.get('transports', ['TCP']),
                    FSAL.from_dict(ex_dict.get('fsal', {})),
-                   [Client.from_dict(client) for client in ex_dict.get('clients', [])])
+                   [Client.from_dict(client) for client in ex_dict.get('clients', [])],
+                   sectype=ex_dict.get("sectype"))
 
     def to_dict(self) -> Dict[str, Any]:
 
     def to_dict(self) -> Dict[str, Any]:
-        return {
+        values = {
             'export_id': self.export_id,
             'path': self.path,
             'cluster_id': self.cluster_id,
             'export_id': self.export_id,
             'path': self.path,
             'cluster_id': self.cluster_id,
@@ -448,6 +467,9 @@ class Export:
             'fsal': self.fsal.to_dict(),
             'clients': [client.to_dict() for client in self.clients]
         }
             'fsal': self.fsal.to_dict(),
             'clients': [client.to_dict() for client in self.clients]
         }
+        if self.sectype:
+            values['sectype'] = self.sectype
+        return values
 
     def validate(self, mgr: 'Module') -> None:
         if not isabs(self.pseudo) or self.pseudo == "/":
 
     def validate(self, mgr: 'Module') -> None:
         if not isabs(self.pseudo) or self.pseudo == "/":
@@ -487,6 +509,9 @@ class Export:
         else:
             raise NFSInvalidOperation('FSAL {self.fsal.name} not supported')
 
         else:
             raise NFSInvalidOperation('FSAL {self.fsal.name} not supported')
 
+        for st in (self.sectype or []):
+            _validate_sec_type(st)
+
     def __eq__(self, other: Any) -> bool:
         if not isinstance(other, Export):
             return False
     def __eq__(self, other: Any) -> bool:
         if not isinstance(other, Export):
             return False
index 403f89f3a97367061a5d9cbc1624773b84a9cec5..340792e81b33b228a0dbecd600e9fc279b065c5e 100644 (file)
@@ -34,12 +34,20 @@ class Module(orchestrator.OrchestratorClientMixin, MgrModule):
             readonly: Optional[bool] = False,
             client_addr: Optional[List[str]] = None,
             squash: str = 'none',
             readonly: Optional[bool] = False,
             client_addr: Optional[List[str]] = None,
             squash: str = 'none',
+            sectype: Optional[List[str]] = None,
     ) -> Tuple[int, str, str]:
         """Create a CephFS export"""
     ) -> Tuple[int, str, str]:
         """Create a CephFS export"""
-        return self.export_mgr.create_export(fsal_type='cephfs', fs_name=fsname,
-                                             cluster_id=cluster_id, pseudo_path=pseudo_path,
-                                             read_only=readonly, path=path,
-                                             squash=squash, addr=client_addr)
+        return self.export_mgr.create_export(
+            fsal_type='cephfs',
+            fs_name=fsname,
+            cluster_id=cluster_id,
+            pseudo_path=pseudo_path,
+            read_only=readonly,
+            path=path,
+            squash=squash,
+            addr=client_addr,
+            sectype=sectype,
+        )
 
     @CLICommand('nfs export create rgw', perm='rw')
     def _cmd_nfs_export_create_rgw(
 
     @CLICommand('nfs export create rgw', perm='rw')
     def _cmd_nfs_export_create_rgw(
@@ -51,13 +59,20 @@ class Module(orchestrator.OrchestratorClientMixin, MgrModule):
             readonly: Optional[bool] = False,
             client_addr: Optional[List[str]] = None,
             squash: str = 'none',
             readonly: Optional[bool] = False,
             client_addr: Optional[List[str]] = None,
             squash: str = 'none',
+            sectype: Optional[List[str]] = None,
     ) -> Tuple[int, str, str]:
         """Create an RGW export"""
     ) -> Tuple[int, str, str]:
         """Create an RGW export"""
-        return self.export_mgr.create_export(fsal_type='rgw', bucket=bucket,
-                                             user_id=user_id,
-                                             cluster_id=cluster_id, pseudo_path=pseudo_path,
-                                             read_only=readonly, squash=squash,
-                                             addr=client_addr)
+        return self.export_mgr.create_export(
+            fsal_type='rgw',
+            bucket=bucket,
+            user_id=user_id,
+            cluster_id=cluster_id,
+            pseudo_path=pseudo_path,
+            read_only=readonly,
+            squash=squash,
+            addr=client_addr,
+            sectype=sectype,
+        )
 
     @CLICommand('nfs export rm', perm='rw')
     def _cmd_nfs_export_rm(self, cluster_id: str, pseudo_path: str) -> Tuple[int, str, str]:
 
     @CLICommand('nfs export rm', perm='rw')
     def _cmd_nfs_export_rm(self, cluster_id: str, pseudo_path: str) -> Tuple[int, str, str]:
index 1fca67249e0d459710f521de349bd04db2be06bd..b984426b6d87ccc398f5ecdc45c741e02a624151 100644 (file)
@@ -90,6 +90,26 @@ EXPORT {
     protocols = 4;
     transports = "TCP";
 }
     protocols = 4;
     transports = "TCP";
 }
+"""
+    export_4 = """
+EXPORT {
+    FSAL {
+        name = "CEPH";
+        user_id = "nfs.foo.1";
+        filesystem = "a";
+        secret_access_key = "AQCjU+hgjyReLBAAddJa0Dza/ZHqjX5+JiePMA==";
+    }
+    export_id = 1;
+    path = "/secure/me";
+    pseudo = "/secure1";
+    access_type = "RW";
+    squash = "no_root_squash";
+    SecType = "krb5p", "krb5i";
+    attr_expiration_time = 0;
+    security_label = true;
+    protocols = 4;
+    transports = "TCP";
+}
 """
 
     conf_nfs_foo = f'''
 """
 
     conf_nfs_foo = f'''
@@ -370,9 +390,9 @@ NFS_CORE_PARAM {
         assert blocks[1].block_name == "%url"
         assert blocks[1].values['value'] == f"rados://{NFS_POOL_NAME}/{self.cluster_id}/export-2"
 
         assert blocks[1].block_name == "%url"
         assert blocks[1].values['value'] == f"rados://{NFS_POOL_NAME}/{self.cluster_id}/export-2"
 
-    def _do_mock_test(self, func) -> None:
+    def _do_mock_test(self, func, *args) -> None:
         with self._mock_orchestrator(True):
         with self._mock_orchestrator(True):
-            func()
+            func(*args)
             self._reset_temp_store()
 
     def test_ganesha_conf(self) -> None:
             self._reset_temp_store()
 
     def test_ganesha_conf(self) -> None:
@@ -689,6 +709,73 @@ NFS_CORE_PARAM {
         assert export.clients[0].access_type is None
         assert export.cluster_id == self.cluster_id
 
         assert export.clients[0].access_type is None
         assert export.cluster_id == self.cluster_id
 
+    def test_update_export_sectype(self):
+        self._do_mock_test(self._test_update_export_sectype)
+
+    def _test_update_export_sectype(self):
+        nfs_mod = Module('nfs', '', '')
+        conf = ExportMgr(nfs_mod)
+        r = conf.apply_export(self.cluster_id, json.dumps({
+            'export_id': 2,
+            'path': 'bucket',
+            'pseudo': '/rgw/bucket',
+            'cluster_id': self.cluster_id,
+            'access_type': 'RW',
+            'squash': 'all_squash',
+            'security_label': False,
+            'protocols': [4, 3],
+            'transports': ['TCP', 'UDP'],
+            'clients': [{
+                'addresses': ["192.168.0.0/16"],
+                'access_type': None,
+                'squash': None
+            }],
+            'fsal': {
+                'name': 'RGW',
+                'user_id': 'nfs.foo.bucket',
+                'access_key_id': 'the_access_key',
+                'secret_access_key': 'the_secret_key',
+            }
+        }))
+        assert r[0] == 0
+
+        # no sectype was given, key not present
+        info = conf._get_export_dict(self.cluster_id, "/rgw/bucket")
+        assert info["export_id"] == 2
+        assert info["path"] == "bucket"
+        assert "sectype" not in info
+
+        r = conf.apply_export(self.cluster_id, json.dumps({
+            'export_id': 2,
+            'path': 'bucket',
+            'pseudo': '/rgw/bucket',
+            'cluster_id': self.cluster_id,
+            'access_type': 'RW',
+            'squash': 'all_squash',
+            'security_label': False,
+            'protocols': [4, 3],
+            'transports': ['TCP', 'UDP'],
+            'clients': [{
+                'addresses': ["192.168.0.0/16"],
+                'access_type': None,
+                'squash': None
+            }],
+            'sectype': ["krb5p", "krb5i", "sys"],
+            'fsal': {
+                'name': 'RGW',
+                'user_id': 'nfs.foo.bucket',
+                'access_key_id': 'the_access_key',
+                'secret_access_key': 'the_secret_key',
+            }
+        }))
+        assert r[0] == 0
+
+        # assert sectype matches new value(s)
+        info = conf._get_export_dict(self.cluster_id, "/rgw/bucket")
+        assert info["export_id"] == 2
+        assert info["path"] == "bucket"
+        assert info["sectype"] == ["krb5p", "krb5i", "sys"]
+
     def test_update_export_with_ganesha_conf(self):
         self._do_mock_test(self._do_test_update_export_with_ganesha_conf)
 
     def test_update_export_with_ganesha_conf(self):
         self._do_mock_test(self._do_test_update_export_with_ganesha_conf)
 
@@ -698,6 +785,29 @@ NFS_CORE_PARAM {
         r = conf.apply_export(self.cluster_id, self.export_3)
         assert r[0] == 0
 
         r = conf.apply_export(self.cluster_id, self.export_3)
         assert r[0] == 0
 
+    def test_update_export_with_ganesha_conf_sectype(self):
+        self._do_mock_test(
+            self._do_test_update_export_with_ganesha_conf_sectype,
+            self.export_4, ["krb5p", "krb5i"])
+
+    def test_update_export_with_ganesha_conf_sectype_lcase(self):
+        export_conf = self.export_4.replace("SecType", "sectype").replace("krb5i", "sys")
+        self._do_mock_test(
+            self._do_test_update_export_with_ganesha_conf_sectype,
+            export_conf, ["krb5p", "sys"])
+
+    def _do_test_update_export_with_ganesha_conf_sectype(self, export_conf, expect_sectype):
+        nfs_mod = Module('nfs', '', '')
+        conf = ExportMgr(nfs_mod)
+        r = conf.apply_export(self.cluster_id, export_conf)
+        assert r[0] == 0
+
+        # assert sectype matches new value(s)
+        info = conf._get_export_dict(self.cluster_id, "/secure1")
+        assert info["export_id"] == 1
+        assert info["path"] == "/secure/me"
+        assert info["sectype"] == expect_sectype
+
     def test_update_export_with_list(self):
         self._do_mock_test(self._do_test_update_export_with_list)
 
     def test_update_export_with_list(self):
         self._do_mock_test(self._do_test_update_export_with_list)
 
index 4a843e5c26cf69bc2ffde1dc9a6977ee90d2df3a..b53bc3eb060a6691fd92a7e7613cbc3c906d6a1f 100644 (file)
@@ -190,12 +190,6 @@ class Format(str, enum.Enum):
 SimpleData = Any
 
 
 SimpleData = Any
 
 
-ObjectResponseFuncType = Union[
-    Callable[..., Dict[Any, Any]],
-    Callable[..., List[Any]],
-]
-
-
 class SimpleDataProvider(Protocol):
     def to_simplified(self) -> SimpleData:
         """Return a simplified representation of the current object.
 class SimpleDataProvider(Protocol):
     def to_simplified(self) -> SimpleData:
         """Return a simplified representation of the current object.
@@ -432,10 +426,14 @@ class ErrorResponse(ErrorResponseBase):
     @classmethod
     def wrap(
         cls: Type[E], exc: Exception, return_value: Optional[int] = None
     @classmethod
     def wrap(
         cls: Type[E], exc: Exception, return_value: Optional[int] = None
-    ) -> E:
+    ) -> ErrorResponseBase:
+        if isinstance(exc, ErrorResponseBase):
+            return exc
         if return_value is None:
             try:
         if return_value is None:
             try:
-                return_value = -int(getattr(exc, "errno"))
+                return_value = int(getattr(exc, "errno"))
+                if return_value > 0:
+                    return_value = -return_value
             except (AttributeError, ValueError):
                 pass
         err = cls(str(exc), return_value=return_value)
             except (AttributeError, ValueError):
                 pass
         err = cls(str(exc), return_value=return_value)
@@ -443,6 +441,16 @@ class ErrorResponse(ErrorResponseBase):
         return err
 
 
         return err
 
 
+ObjectResponseFuncType = Union[
+    Callable[..., Dict[Any, Any]],
+    Callable[..., List[Any]],
+    Callable[..., SimpleDataProvider],
+    Callable[..., JSONDataProvider],
+    Callable[..., YAMLDataProvider],
+    Callable[..., ReturnValueProvider],
+]
+
+
 def _get_requested_format(f: ObjectResponseFuncType, kw: Dict[str, Any]) -> str:
     # todo: leave 'format' in kw dict iff its part of f's signature
     return kw.pop("format", None)
 def _get_requested_format(f: ObjectResponseFuncType, kw: Dict[str, Any]) -> str:
     # todo: leave 'format' in kw dict iff its part of f's signature
     return kw.pop("format", None)
@@ -529,3 +537,76 @@ class Responder:
         # on the ceph cli/api
         setattr(_format_response, "extra_args", {"format": str})
         return _format_response
         # on the ceph cli/api
         setattr(_format_response, "extra_args", {"format": str})
         return _format_response
+
+
+class ErrorResponseHandler:
+    """ErrorResponseHandler is a very simple decorator that handles functions that
+    raise exceptions inheriting from ErrorResponseBase. If such an exception
+    is raised that exception can and will be converted to a mgr response tuple.
+    This is similar to Responder but error handling is all this decorator does.
+    """
+
+    def __call__(self, f: Callable[..., Tuple[int, str, str]]) -> HandlerFuncType:
+        """Wrap a python function so that if the function raises an exception inheriting
+        ErrorResponderBase the error is correctly converted to a mgr response.
+        """
+
+        @wraps(f)
+        def _format_response(*args: Any, **kwargs: Any) -> Tuple[int, str, str]:
+            try:
+                retval, body, sts = f(*args, **kwargs)
+            except ErrorResponseBase as e:
+                return e.format_response()
+            return retval, body, sts
+
+        return _format_response
+
+
+class ConstantResponderBase:
+    """The constant responder base assumes that a wrapped function should not
+    be passing data back to the manager. It only responds with the default
+    (constant) values provided. The process_response function allows a subclass
+    to handle/log/validate any values that were returned from the wrapped
+    function.
+
+    This class can be used a building block for special decorators that
+    do not normally emit response data.
+    """
+
+    def mgr_return_value(self) -> int:
+        return 0
+
+    def mgr_body_value(self) -> str:
+        return ""
+
+    def mgr_status_value(self) -> str:
+        return ""
+
+    def process_response(self, result: Any) -> None:
+        return None
+
+    def __call__(self, f: Callable) -> HandlerFuncType:
+        """Wrap a python function so that if the function raises an exception
+        inheriting ErrorResponderBase the error is correctly converted to a mgr
+        response. Otherwise, it returns a default set of constant values.
+        """
+
+        @wraps(f)
+        def _format_response(*args: Any, **kwargs: Any) -> Tuple[int, str, str]:
+            try:
+                self.process_response(f(*args, **kwargs))
+            except ErrorResponseBase as e:
+                return e.format_response()
+            return self.mgr_return_value(), self.mgr_body_value(), self.mgr_status_value()
+        return _format_response
+
+
+class EmptyResponder(ConstantResponderBase):
+    """Always respond with an empty (string) body. Checks that the wrapped function
+    returned None in order to ensure it is not being used on functions that
+    return data objects.
+    """
+
+    def process_response(self, result: Any) -> None:
+        if result is not None:
+            raise ValueError("EmptyResponder expects None from wrapped functions")
index 6f0374ffede94dc1c0571981ee5af61ac10986aa..47009f4f4151fb1847fc95e78a4f0da6f73b3d5b 100644 (file)
@@ -475,6 +475,7 @@ class Orchestrator(object):
             'mon': self.apply_mon,
             'nfs': self.apply_nfs,
             'node-exporter': self.apply_node_exporter,
             'mon': self.apply_mon,
             'nfs': self.apply_nfs,
             'node-exporter': self.apply_node_exporter,
+            'ceph-exporter': self.apply_ceph_exporter,
             'osd': lambda dg: self.apply_drivegroups([dg]),  # type: ignore
             'prometheus': self.apply_prometheus,
             'loki': self.apply_loki,
             'osd': lambda dg: self.apply_drivegroups([dg]),  # type: ignore
             'prometheus': self.apply_prometheus,
             'loki': self.apply_loki,
@@ -655,6 +656,10 @@ class Orchestrator(object):
         """Update existing a Node-Exporter daemon(s)"""
         raise NotImplementedError()
 
         """Update existing a Node-Exporter daemon(s)"""
         raise NotImplementedError()
 
+    def apply_ceph_exporter(self, spec: ServiceSpec) -> OrchResult[str]:
+        """Update existing a ceph exporter daemon(s)"""
+        raise NotImplementedError()
+
     def apply_loki(self, spec: ServiceSpec) -> OrchResult[str]:
         """Update existing a Loki daemon(s)"""
         raise NotImplementedError()
     def apply_loki(self, spec: ServiceSpec) -> OrchResult[str]:
         """Update existing a Loki daemon(s)"""
         raise NotImplementedError()
@@ -764,6 +769,7 @@ def daemon_type_to_service(dtype: str) -> str:
         'alertmanager': 'alertmanager',
         'prometheus': 'prometheus',
         'node-exporter': 'node-exporter',
         'alertmanager': 'alertmanager',
         'prometheus': 'prometheus',
         'node-exporter': 'node-exporter',
+        'ceph-exporter': 'ceph-exporter',
         'loki': 'loki',
         'promtail': 'promtail',
         'crash': 'crash',
         'loki': 'loki',
         'promtail': 'promtail',
         'crash': 'crash',
@@ -793,6 +799,7 @@ def service_to_daemon_types(stype: str) -> List[str]:
         'loki': ['loki'],
         'promtail': ['promtail'],
         'node-exporter': ['node-exporter'],
         'loki': ['loki'],
         'promtail': ['promtail'],
         'node-exporter': ['node-exporter'],
+        'ceph-exporter': ['ceph-exporter'],
         'crash': ['crash'],
         'container': ['container'],
         'agent': ['agent'],
         'crash': ['crash'],
         'container': ['container'],
         'agent': ['agent'],
@@ -891,6 +898,7 @@ class DaemonDescription(object):
                  rank: Optional[int] = None,
                  rank_generation: Optional[int] = None,
                  extra_container_args: Optional[List[str]] = None,
                  rank: Optional[int] = None,
                  rank_generation: Optional[int] = None,
                  extra_container_args: Optional[List[str]] = None,
+                 extra_entrypoint_args: Optional[List[str]] = None,
                  ) -> None:
 
         #: Host is at the same granularity as InventoryHost
                  ) -> None:
 
         #: Host is at the same granularity as InventoryHost
@@ -956,6 +964,7 @@ class DaemonDescription(object):
         self.is_active = is_active
 
         self.extra_container_args = extra_container_args
         self.is_active = is_active
 
         self.extra_container_args = extra_container_args
+        self.extra_entrypoint_args = extra_entrypoint_args
 
     @property
     def status(self) -> Optional[DaemonDescriptionStatus]:
 
     @property
     def status(self) -> Optional[DaemonDescriptionStatus]:
index f8d2d2d7b8760ce136040d75ce42e10e101924e4..73bd137484db6eb7e39c52097aee5e31bddd2238 100644 (file)
@@ -14,7 +14,7 @@ except ImportError:
     # fallback to normal sort
     natsorted = sorted  # type: ignore
 
     # fallback to normal sort
     natsorted = sorted  # type: ignore
 
-from ceph.deployment.inventory import Device
+from ceph.deployment.inventory import Device  # noqa: F401; pylint: disable=unused-variable
 from ceph.deployment.drive_group import DriveGroupSpec, DeviceSelection, OSDMethod
 from ceph.deployment.service_spec import PlacementSpec, ServiceSpec, service_spec_allow_invalid_from_json
 from ceph.deployment.hostspec import SpecValidationError
 from ceph.deployment.drive_group import DriveGroupSpec, DeviceSelection, OSDMethod
 from ceph.deployment.service_spec import PlacementSpec, ServiceSpec, service_spec_allow_invalid_from_json
 from ceph.deployment.hostspec import SpecValidationError
@@ -54,6 +54,7 @@ class ServiceType(enum.Enum):
     alertmanager = 'alertmanager'
     grafana = 'grafana'
     node_exporter = 'node-exporter'
     alertmanager = 'alertmanager'
     grafana = 'grafana'
     node_exporter = 'node-exporter'
+    ceph_exporter = 'ceph-exporter'
     prometheus = 'prometheus'
     loki = 'loki'
     promtail = 'promtail'
     prometheus = 'prometheus'
     loki = 'loki'
     promtail = 'promtail'
@@ -70,6 +71,7 @@ class ServiceAction(enum.Enum):
     restart = 'restart'
     redeploy = 'redeploy'
     reconfig = 'reconfig'
     restart = 'restart'
     redeploy = 'redeploy'
     reconfig = 'reconfig'
+    rotate_key = 'rotate-key'
 
 
 class DaemonAction(enum.Enum):
 
 
 class DaemonAction(enum.Enum):
@@ -77,6 +79,7 @@ class DaemonAction(enum.Enum):
     stop = 'stop'
     restart = 'restart'
     reconfig = 'reconfig'
     stop = 'stop'
     restart = 'restart'
     reconfig = 'reconfig'
+    rotate_key = 'rotate-key'
 
 
 def to_format(what: Any, format: Format, many: bool, cls: Any) -> Any:
 
 
 def to_format(what: Any, format: Format, many: bool, cls: Any) -> Any:
@@ -215,8 +218,8 @@ class OrchestratorCli(OrchestratorClientMixin, MgrModule,
 
     def __init__(self, *args: Any, **kwargs: Any) -> None:
         super(OrchestratorCli, self).__init__(*args, **kwargs)
 
     def __init__(self, *args: Any, **kwargs: Any) -> None:
         super(OrchestratorCli, self).__init__(*args, **kwargs)
-        self.ident = set()  # type: Set[str]
-        self.fault = set()  # type: Set[str]
+        self.ident: Set[str] = set()
+        self.fault: Set[str] = set()
         self._load()
         self._refresh_health()
 
         self._load()
         self._refresh_health()
 
@@ -495,7 +498,7 @@ class OrchestratorCli(OrchestratorClientMixin, MgrModule,
                 "On": "On",
                 "Off": "Off",
                 True: "Yes",
                 "On": "On",
                 "Off": "Off",
                 True: "Yes",
-                False: "",
+                False: "No",
             }
 
             out = []
             }
 
             out = []
@@ -995,7 +998,7 @@ Usage:
 
     @_cli_write_command('orch daemon')
     def _daemon_action(self, action: DaemonAction, name: str) -> HandleCommandResult:
 
     @_cli_write_command('orch daemon')
     def _daemon_action(self, action: DaemonAction, name: str) -> HandleCommandResult:
-        """Start, stop, restart, (redeploy,) or reconfig a specific daemon"""
+        """Start, stop, restart, redeploy, reconfig, or rotate-key for a specific daemon"""
         if '.' not in name:
             raise OrchestratorError('%s is not a valid daemon name' % name)
         completion = self.daemon_action(action.value, name)
         if '.' not in name:
             raise OrchestratorError('%s is not a valid daemon name' % name)
         completion = self.daemon_action(action.value, name)
@@ -1006,7 +1009,7 @@ Usage:
     def _daemon_action_redeploy(self,
                                 name: str,
                                 image: Optional[str] = None) -> HandleCommandResult:
     def _daemon_action_redeploy(self,
                                 name: str,
                                 image: Optional[str] = None) -> HandleCommandResult:
-        """Redeploy a daemon (with a specifc image)"""
+        """Redeploy a daemon (with a specific image)"""
         if '.' not in name:
             raise OrchestratorError('%s is not a valid daemon name' % name)
         completion = self.daemon_action("redeploy", name, image=image)
         if '.' not in name:
             raise OrchestratorError('%s is not a valid daemon name' % name)
         completion = self.daemon_action("redeploy", name, image=image)
@@ -1499,7 +1502,7 @@ Usage:
 
     @_cli_write_command('orch upgrade status')
     def _upgrade_status(self) -> HandleCommandResult:
 
     @_cli_write_command('orch upgrade status')
     def _upgrade_status(self) -> HandleCommandResult:
-        """Check service versions vs available and target containers"""
+        """Check the status of any potential ongoing upgrade operation"""
         completion = self.upgrade_status()
         status = raise_if_exception(completion)
         r = {
         completion = self.upgrade_status()
         status = raise_if_exception(completion)
         r = {
index 57d27655114483a8d7abf9056415cac4315a63b9..d4758c75ab4462449134a5844d7afb71210960bb 100644 (file)
@@ -605,7 +605,8 @@ class PgAutoscaler(MgrModule):
             if (final_pg_target > p['pg_num_target'] * threshold or
                     final_pg_target < p['pg_num_target'] / threshold) and \
                     final_ratio >= 0.0 and \
             if (final_pg_target > p['pg_num_target'] * threshold or
                     final_pg_target < p['pg_num_target'] / threshold) and \
                     final_ratio >= 0.0 and \
-                    final_ratio <= 1.0:
+                    final_ratio <= 1.0 and \
+                    p['pg_autoscale_mode'] == 'on':
                 adjust = True
 
             assert pool_pg_target is not None
                 adjust = True
 
             assert pool_pg_target is not None
index d8ba83d111af42a63ec2377040055ba32a6bc34d..655025bbef877498fd69b2dfea8c10a6c40c14bc 100644 (file)
@@ -18,7 +18,7 @@ class RootMapItem:
 
 class TestPgAutoscaler(object):
 
 
 class TestPgAutoscaler(object):
 
-    def setup(self):
+    def setup_method(self):
         # a bunch of attributes for testing.
         self.autoscaler = module.PgAutoscaler('module_name', 0, 0)
 
         # a bunch of attributes for testing.
         self.autoscaler = module.PgAutoscaler('module_name', 0, 0)
 
index bf4ddfb62020d012740bc865f017f01fd2f599fd..009019707ec84608acebe0118561c0bcc07f4d6d 100644 (file)
@@ -42,7 +42,7 @@ class CRUSH:
 
 class TestPgAutoscaler(object):
 
 
 class TestPgAutoscaler(object):
 
-    def setup(self):
+    def setup_method(self):
         # a bunch of attributes for testing.
         self.autoscaler = module.PgAutoscaler('module_name', 0, 0)
 
         # a bunch of attributes for testing.
         self.autoscaler = module.PgAutoscaler('module_name', 0, 0)
 
index ef4e7e166180571faf51bda6ff191e3e238cea94..47baa177e25b7b59cbb5b7da71ec4e9b297de6d0 100644 (file)
@@ -13,7 +13,7 @@ from progress import module
 class TestPgRecoveryEvent(object):
     # Testing PgRecoveryEvent class
 
 class TestPgRecoveryEvent(object):
     # Testing PgRecoveryEvent class
 
-    def setup(self):
+    def setup_method(self):
         # Creating the class and Mocking 
         # a bunch of attributes for testing
         module._module = mock.Mock() # just so Event._refresh() works
         # Creating the class and Mocking 
         # a bunch of attributes for testing
         module._module = mock.Mock() # just so Event._refresh() works
@@ -90,7 +90,7 @@ class OSDMap:
 class TestModule(object):
     # Testing Module Class
     
 class TestModule(object):
     # Testing Module Class
     
-    def setup(self):
+    def setup_method(self):
         # Creating the class and Mocking a
         # bunch of attributes for testing
 
         # Creating the class and Mocking a
         # bunch of attributes for testing
 
index 56d239843d13731b2e016ba3d12931d5716a18a3..0e4829d06569a317bbe3ebd250cb0cb381ce10a5 100644 (file)
@@ -1,6 +1,6 @@
 import cherrypy
 from collections import defaultdict
 import cherrypy
 from collections import defaultdict
-from distutils.version import StrictVersion
+from pkg_resources import packaging  # type: ignore
 import json
 import math
 import os
 import json
 import math
 import os
@@ -32,10 +32,11 @@ DEFAULT_PORT = 9283
 # ipv6 isn't yet configured / supported and CherryPy throws an uncaught
 # exception.
 if cherrypy is not None:
 # ipv6 isn't yet configured / supported and CherryPy throws an uncaught
 # exception.
 if cherrypy is not None:
-    v = StrictVersion(cherrypy.__version__)
+    Version = packaging.version.Version
+    v = Version(cherrypy.__version__)
     # the issue was fixed in 3.2.3. it's present in 3.2.2 (current version on
     # centos:7) and back to at least 3.0.0.
     # the issue was fixed in 3.2.3. it's present in 3.2.2 (current version on
     # centos:7) and back to at least 3.0.0.
-    if StrictVersion("3.1.2") <= v < StrictVersion("3.2.3"):
+    if Version("3.1.2") <= v < Version("3.2.3"):
         # https://github.com/cherrypy/cherrypy/issues/1100
         from cherrypy.process import servers
         servers.wait_for_occupied_port = lambda host, port: None
         # https://github.com/cherrypy/cherrypy/issues/1100
         from cherrypy.process import servers
         servers.wait_for_occupied_port = lambda host, port: None
@@ -69,6 +70,8 @@ def health_status_to_number(status: str) -> int:
 
 DF_CLUSTER = ['total_bytes', 'total_used_bytes', 'total_used_raw_bytes']
 
 
 DF_CLUSTER = ['total_bytes', 'total_used_bytes', 'total_used_raw_bytes']
 
+OSD_BLOCKLIST = ['osd_blocklist_count']
+
 DF_POOL = ['max_avail', 'avail_raw', 'stored', 'stored_raw', 'objects', 'dirty',
            'quota_bytes', 'quota_objects', 'rd', 'rd_bytes', 'wr', 'wr_bytes',
            'compress_bytes_used', 'compress_under_bytes', 'bytes_used', 'percent_used']
 DF_POOL = ['max_avail', 'avail_raw', 'stored', 'stored_raw', 'objects', 'dirty',
            'quota_bytes', 'quota_objects', 'rd', 'rd_bytes', 'wr', 'wr_bytes',
            'compress_bytes_used', 'compress_under_bytes', 'bytes_used', 'percent_used']
@@ -809,6 +812,13 @@ class Module(MgrModule):
                 'DF pool {}'.format(state),
                 ('pool_id',)
             )
                 'DF pool {}'.format(state),
                 ('pool_id',)
             )
+        for state in OSD_BLOCKLIST:
+            path = 'cluster_{}'.format(state)
+            metrics[path] = Metric(
+                'gauge',
+                path,
+                'OSD Blocklist Count {}'.format(state),
+            )
         for state in NUM_OBJECTS:
             path = 'num_objects_{}'.format(state)
             metrics[path] = Metric(
         for state in NUM_OBJECTS:
             path = 'num_objects_{}'.format(state)
             metrics[path] = Metric(
@@ -929,7 +939,8 @@ class Module(MgrModule):
         for stat in DF_CLUSTER:
             self.metrics['cluster_{}'.format(stat)].set(df['stats'][stat])
             for device_class in df['stats_by_class']:
         for stat in DF_CLUSTER:
             self.metrics['cluster_{}'.format(stat)].set(df['stats'][stat])
             for device_class in df['stats_by_class']:
-                self.metrics['cluster_by_class_{}'.format(stat)].set(df['stats_by_class'][device_class][stat], (device_class,))
+                self.metrics['cluster_by_class_{}'.format(stat)].set(
+                    df['stats_by_class'][device_class][stat], (device_class,))
 
         for pool in df['pools']:
             for stat in DF_POOL:
 
         for pool in df['pools']:
             for stat in DF_POOL:
@@ -938,6 +949,17 @@ class Module(MgrModule):
                     (pool['id'],)
                 )
 
                     (pool['id'],)
                 )
 
+    @profile_method()
+    def get_osd_blocklisted_entries(self) -> None:
+        r = self.mon_command({
+            'prefix': 'osd blocklist ls',
+            'format': 'json'
+        })
+        blocklist_entries = r[2].split(' ')
+        blocklist_count = blocklist_entries[1]
+        for stat in OSD_BLOCKLIST:
+            self.metrics['cluster_{}'.format(stat)].set(int(blocklist_count))
+
     @profile_method()
     def get_fs(self) -> None:
         fs_map = self.get('fs_map')
     @profile_method()
     def get_fs(self) -> None:
         fs_map = self.get('fs_map')
@@ -1042,7 +1064,9 @@ class Module(MgrModule):
         pg_summary = self.get('pg_summary')
 
         for pool in pg_summary['by_pool']:
         pg_summary = self.get('pg_summary')
 
         for pool in pg_summary['by_pool']:
-            num_by_state = defaultdict(int)  # type: DefaultDict[str, int]
+            num_by_state: DefaultDict[str, int] = defaultdict(int)
+            for state in PG_STATES:
+                num_by_state[state] = 0
 
             for state_name, count in pg_summary['by_pool'][pool].items():
                 for state in state_name.split('+'):
 
             for state_name, count in pg_summary['by_pool'][pool].items():
                 for state in state_name.split('+'):
@@ -1071,8 +1095,9 @@ class Module(MgrModule):
         for server in self.list_servers():
             host = cast(str, server.get('hostname', ''))
             for service in cast(List[ServiceInfoT], server.get('services', [])):
         for server in self.list_servers():
             host = cast(str, server.get('hostname', ''))
             for service in cast(List[ServiceInfoT], server.get('services', [])):
-                ret.update({(service['id'], service['type']): (
-                    host, service['ceph_version'], service.get('name', ''))})
+                ret.update({(service['id'], service['type']): (host,
+                                                               service.get('ceph_version', 'unknown'),
+                                                               service.get('name', ''))})
         return ret
 
     @profile_method()
         return ret
 
     @profile_method()
@@ -1562,6 +1587,35 @@ class Module(MgrModule):
                 cast(MetricCounter, sum_metric).add(duration, (method_name,))
                 cast(MetricCounter, count_metric).add(1, (method_name,))
 
                 cast(MetricCounter, sum_metric).add(duration, (method_name,))
                 cast(MetricCounter, count_metric).add(1, (method_name,))
 
+    def get_pool_repaired_objects(self) -> None:
+        dump = self.get('pg_dump')
+        for stats in dump['pool_stats']:
+            path = f'pool_objects_repaired{stats["poolid"]}'
+            self.metrics[path] = Metric(
+                'counter',
+                'pool_objects_repaired',
+                'Number of objects repaired in a pool Count',
+                ('poolid',)
+            )
+
+            self.metrics[path].set(stats['stat_sum']['num_objects_repaired'],
+                                   labelvalues=(stats['poolid'],))
+
+    def get_all_daemon_health_metrics(self) -> None:
+        daemon_metrics = self.get_daemon_health_metrics()
+        self.log.debug('metrics jeje %s' % (daemon_metrics))
+        for daemon_name, health_metrics in daemon_metrics.items():
+            for health_metric in health_metrics:
+                path = f'daemon_health_metrics{daemon_name}{health_metric["type"]}'
+                self.metrics[path] = Metric(
+                    'counter',
+                    'daemon_health_metrics',
+                    'Health metrics for Ceph daemons',
+                    ('type', 'ceph_daemon',)
+                )
+                self.metrics[path].set(health_metric['value'], labelvalues=(
+                    health_metric['type'], daemon_name,))
+
     @profile_method(True)
     def collect(self) -> str:
         # Clear the metrics before scraping
     @profile_method(True)
     def collect(self) -> str:
         # Clear the metrics before scraping
@@ -1570,6 +1624,7 @@ class Module(MgrModule):
 
         self.get_health()
         self.get_df()
 
         self.get_health()
         self.get_df()
+        self.get_osd_blocklisted_entries()
         self.get_pool_stats()
         self.get_fs()
         self.get_osd_stats()
         self.get_pool_stats()
         self.get_fs()
         self.get_osd_stats()
@@ -1577,7 +1632,9 @@ class Module(MgrModule):
         self.get_mgr_status()
         self.get_metadata_and_osd_status()
         self.get_pg_status()
         self.get_mgr_status()
         self.get_metadata_and_osd_status()
         self.get_pg_status()
+        self.get_pool_repaired_objects()
         self.get_num_objects()
         self.get_num_objects()
+        self.get_all_daemon_health_metrics()
 
         for daemon, counters in self.get_all_perf_counters().items():
             for path, counter_info in counters.items():
 
         for daemon, counters in self.get_all_perf_counters().items():
             for path, counter_info in counters.items():
index c8cf4e4ee7ea303745bfcf9f3cd9f6f00b27e008..a786040b448831270e3be64fa7f43a68f784e1e5 100644 (file)
@@ -369,15 +369,13 @@ class MirrorSnapshotScheduleHandler:
         self.queue: Dict[str, List[ImageSpec]] = {}
         # pool_id => {namespace => image_id}
         self.images: Dict[str, Dict[str, Dict[str, str]]] = {}
         self.queue: Dict[str, List[ImageSpec]] = {}
         # pool_id => {namespace => image_id}
         self.images: Dict[str, Dict[str, Dict[str, str]]] = {}
+        self.schedules = Schedules(self)
         self.refresh_images()
         self.log.debug("MirrorSnapshotScheduleHandler: queue is initialized")
 
     def load_schedules(self) -> None:
         self.log.info("MirrorSnapshotScheduleHandler: load_schedules")
         self.refresh_images()
         self.log.debug("MirrorSnapshotScheduleHandler: queue is initialized")
 
     def load_schedules(self) -> None:
         self.log.info("MirrorSnapshotScheduleHandler: load_schedules")
-
-        schedules = Schedules(self)
-        schedules.load(namespace_validator, image_validator)
-        self.schedules = schedules
+        self.schedules.load(namespace_validator, image_validator)
 
     def refresh_images(self) -> float:
         elapsed = (datetime.now() - self.last_refresh_images).total_seconds()
 
     def refresh_images(self) -> float:
         elapsed = (datetime.now() - self.last_refresh_images).total_seconds()
index b8507a1b8fe5b8876ed05d44171ac17a7dc7cf29..496cff403d75a7b90ccc95ee5a512067daeb027a 100644 (file)
@@ -378,18 +378,10 @@ class Schedules:
         self.level_specs: Dict[str, LevelSpec] = {}
         self.schedules: Dict[str, Schedule] = {}
 
         self.level_specs: Dict[str, LevelSpec] = {}
         self.schedules: Dict[str, Schedule] = {}
 
-    def __len__(self) -> int:
-        return len(self.schedules)
-
-    def load(self,
-             namespace_validator: Optional[Callable] = None,
-             image_validator: Optional[Callable] = None) -> None:
-
-        schedule_cfg = self.handler.module.get_module_option(
-            self.handler.MODULE_OPTION_NAME, '')
-
         # Previous versions incorrectly stored the global config in
         # the localized module option. Check the config is here and fix it.
         # Previous versions incorrectly stored the global config in
         # the localized module option. Check the config is here and fix it.
+        schedule_cfg = self.handler.module.get_module_option(
+            self.handler.MODULE_OPTION_NAME, '')
         if not schedule_cfg:
             schedule_cfg = self.handler.module.get_localized_module_option(
                 self.handler.MODULE_OPTION_NAME, '')
         if not schedule_cfg:
             schedule_cfg = self.handler.module.get_localized_module_option(
                 self.handler.MODULE_OPTION_NAME, '')
@@ -399,6 +391,17 @@ class Schedules:
         self.handler.module.set_localized_module_option(
             self.handler.MODULE_OPTION_NAME, None)
 
         self.handler.module.set_localized_module_option(
             self.handler.MODULE_OPTION_NAME, None)
 
+    def __len__(self) -> int:
+        return len(self.schedules)
+
+    def load(self,
+             namespace_validator: Optional[Callable] = None,
+             image_validator: Optional[Callable] = None) -> None:
+        self.level_specs = {}
+        self.schedules = {}
+
+        schedule_cfg = self.handler.module.get_module_option(
+            self.handler.MODULE_OPTION_NAME, '')
         if schedule_cfg:
             try:
                 level_spec = LevelSpec.make_global()
         if schedule_cfg:
             try:
                 level_spec = LevelSpec.make_global()
index d283962a365e3f07f1c84fa9da352360d0caf97b..2566648634d7384a559d9d8e5cb5b879fc0e3de7 100644 (file)
@@ -348,17 +348,18 @@ class TaskHandler:
         return task_json
 
     def remove_task(self,
         return task_json
 
     def remove_task(self,
-                    ioctx: rados.Ioctx,
+                    ioctx: Optional[rados.Ioctx],
                     task: Task,
                     remove_in_memory: bool = True) -> None:
         self.log.info("remove_task: task={}".format(str(task)))
                     task: Task,
                     remove_in_memory: bool = True) -> None:
         self.log.info("remove_task: task={}".format(str(task)))
-        omap_keys = (task.sequence_key, )
-        try:
-            with rados.WriteOpCtx() as write_op:
-                ioctx.remove_omap_keys(write_op, omap_keys)
-                ioctx.operate_write_op(write_op, RBD_TASK_OID)
-        except rados.ObjectNotFound:
-            pass
+        if ioctx:
+            try:
+                with rados.WriteOpCtx() as write_op:
+                    omap_keys = (task.sequence_key, )
+                    ioctx.remove_omap_keys(write_op, omap_keys)
+                    ioctx.operate_write_op(write_op, RBD_TASK_OID)
+            except rados.ObjectNotFound:
+                pass
 
         if remove_in_memory:
             try:
 
         if remove_in_memory:
             try:
@@ -422,9 +423,9 @@ class TaskHandler:
                 task.retry_message = "{}".format(e)
                 self.update_progress(task, 0)
             else:
                 task.retry_message = "{}".format(e)
                 self.update_progress(task, 0)
             else:
-                # pool DNE -- remove the task
+                # pool DNE -- remove in-memory task
                 self.complete_progress(task)
                 self.complete_progress(task)
-                self.remove_task(ioctx, task)
+                self.remove_task(None, task)
 
         except (rados.Error, rbd.Error) as e:
             self.log.error("execute_task: {}".format(e))
 
         except (rados.Error, rbd.Error) as e:
             self.log.error("execute_task: {}".format(e))
index d9bf24cf27cd49cd4ed3398c28e02286e861a6e0..0f87c41184acf043e934384dbb4f42879ff2a2d6 100644 (file)
@@ -64,15 +64,13 @@ class TrashPurgeScheduleHandler:
         self.queue: Dict[str, List[Tuple[str, str]]] = {}
         # pool_id => {namespace => pool_name}
         self.pools: Dict[str, Dict[str, str]] = {}
         self.queue: Dict[str, List[Tuple[str, str]]] = {}
         # pool_id => {namespace => pool_name}
         self.pools: Dict[str, Dict[str, str]] = {}
+        self.schedules = Schedules(self)
         self.refresh_pools()
         self.log.debug("TrashPurgeScheduleHandler: queue is initialized")
 
     def load_schedules(self) -> None:
         self.log.info("TrashPurgeScheduleHandler: load_schedules")
         self.refresh_pools()
         self.log.debug("TrashPurgeScheduleHandler: queue is initialized")
 
     def load_schedules(self) -> None:
         self.log.info("TrashPurgeScheduleHandler: load_schedules")
-
-        schedules = Schedules(self)
-        schedules.load()
-        self.schedules = schedules
+        self.schedules.load()
 
     def refresh_pools(self) -> float:
         elapsed = (datetime.now() - self.last_refresh_pools).total_seconds()
 
     def refresh_pools(self) -> float:
         elapsed = (datetime.now() - self.last_refresh_pools).total_seconds()
index ab36032e6705f32517b497f7155d4758593df5e6..1fad65c626f8661d04e5238d9f06714a6bd27922 100644 (file)
@@ -1,16 +1,17 @@
--e../../python-common
+-e ../../python-common
 asyncmock
 cherrypy
 cryptography
 jsonpatch
 Jinja2
 pecan
 asyncmock
 cherrypy
 cryptography
 jsonpatch
 Jinja2
 pecan
-prettytable==3.3.0
+prettytable<3.4.0
 pyfakefs
 pyOpenSSL
 pytest-cov==2.7.1
 pyyaml
 requests-mock
 scipy
 pyfakefs
 pyOpenSSL
 pytest-cov==2.7.1
 pyyaml
 requests-mock
 scipy
+setuptools
 werkzeug
 natsort
 werkzeug
 natsort
index 4662b06143673acfaf994a89aee5c9b6a32d6e06..2ac1dcb8a843982be376b601f1fa6fa32b06d5cb 100644 (file)
@@ -16,6 +16,7 @@ from orchestrator import OrchResult
 
 import jsonpatch
 from urllib.parse import urljoin
 
 import jsonpatch
 from urllib.parse import urljoin
+import json
 
 # Optional kubernetes imports to enable MgrModule.can_run
 # to behave cleanly.
 
 # Optional kubernetes imports to enable MgrModule.can_run
 # to behave cleanly.
@@ -215,6 +216,45 @@ class LSOFetcher(DefaultFetcher):
         )
         return (node, device)
 
         )
         return (node, device)
 
+
+class PDFetcher(DefaultFetcher):
+    """ Physical Devices Fetcher"""
+    def __init__(self, coreV1_api: 'client.CoreV1Api'):
+        self.coreV1_api = coreV1_api
+
+    def fetch(self) -> None:
+        """ Collect the devices information from k8s configmaps"""
+        self.dev_cms: KubernetesResource = KubernetesResource(self.coreV1_api.list_namespaced_config_map,
+                                                              namespace='rook-ceph',
+                                                              label_selector='app=rook-discover')
+
+    def devices(self) -> Dict[str, List[Device]]:
+        """ Return the list of devices found"""
+        node_devices: Dict[str, List[Device]] = {}
+        for i in self.dev_cms.items:
+            devices_list: List[Device] = []
+            for d in json.loads(i.data['devices']):
+                devices_list.append(self.device(d)[1])
+            node_devices[i.metadata.labels['rook.io/node']] = devices_list
+
+        return node_devices
+
+    def device(self, devData: Dict[str,str]) -> Tuple[str, Device]:
+        """ Build an orchestrator device """
+        if 'cephVolumeData' in devData and devData['cephVolumeData']:
+            return "", Device.from_json(json.loads(devData['cephVolumeData']))
+        else:
+            return "", Device(
+                path='/dev/' + devData['name'],
+                sys_api=dict(
+                    rotational='1' if devData['rotational'] else '0',
+                    size=devData['size']
+                ),
+                available=False,
+                rejected_reasons=['device data coming from ceph-volume not provided'],
+            )
+
+
 class KubernetesResource(Generic[T]):
     def __init__(self, api_func: Callable, **kwargs: Any) -> None:
         """
 class KubernetesResource(Generic[T]):
     def __init__(self, api_func: Callable, **kwargs: Any) -> None:
         """
@@ -669,7 +709,7 @@ class RookCluster(object):
                                             label_selector="rook_cluster={0}".format(
                                                 self.rook_env.namespace))
         self.nodes: KubernetesResource[client.V1Node] = KubernetesResource(self.coreV1_api.list_node)
                                             label_selector="rook_cluster={0}".format(
                                                 self.rook_env.namespace))
         self.nodes: KubernetesResource[client.V1Node] = KubernetesResource(self.coreV1_api.list_node)
-        
+
     def rook_url(self, path: str) -> str:
         prefix = "/apis/ceph.rook.io/%s/namespaces/%s/" % (
             self.rook_env.crd_version, self.rook_env.namespace)
     def rook_url(self, path: str) -> str:
         prefix = "/apis/ceph.rook.io/%s/namespaces/%s/" % (
             self.rook_env.crd_version, self.rook_env.namespace)
@@ -710,15 +750,20 @@ class RookCluster(object):
         return matching_sc[0]
 
     def get_discovered_devices(self, nodenames: Optional[List[str]] = None) -> Dict[str, List[Device]]:
         return matching_sc[0]
 
     def get_discovered_devices(self, nodenames: Optional[List[str]] = None) -> Dict[str, List[Device]]:
-        storage_class = self.get_storage_class()
         self.fetcher: Optional[DefaultFetcher] = None
         self.fetcher: Optional[DefaultFetcher] = None
-        if storage_class.metadata.labels and ('local.storage.openshift.io/owner-name' in storage_class.metadata.labels):
-            self.fetcher = LSOFetcher(self.storage_class, self.coreV1_api, self.customObjects_api, nodenames)
+        op_settings = self.coreV1_api.read_namespaced_config_map(name="rook-ceph-operator-config", namespace='rook-ceph').data
+        if op_settings.get('ROOK_ENABLE_DISCOVERY_DAEMON', 'false').lower() == 'true':
+            self.fetcher = PDFetcher(self.coreV1_api)
         else:
         else:
-            self.fetcher = DefaultFetcher(self.storage_class, self.coreV1_api)
+            storage_class = self.get_storage_class()
+            if storage_class.metadata.labels and ('local.storage.openshift.io/owner-name' in storage_class.metadata.labels):
+                self.fetcher = LSOFetcher(self.storage_class, self.coreV1_api, self.customObjects_api, nodenames)
+            else:
+                self.fetcher = DefaultFetcher(self.storage_class, self.coreV1_api)
+
         self.fetcher.fetch()
         return self.fetcher.devices()
         self.fetcher.fetch()
         return self.fetcher.devices()
-        
+
     def get_osds(self) -> List:
         osd_pods: KubernetesResource = KubernetesResource(self.coreV1_api.list_namespaced_pod, namespace='rook-ceph', label_selector='app=rook-ceph-osd')
         return list(osd_pods.items)
     def get_osds(self) -> List:
         osd_pods: KubernetesResource = KubernetesResource(self.coreV1_api.list_namespaced_pod, namespace='rook-ceph', label_selector='app=rook-ceph-osd')
         return list(osd_pods.items)
@@ -1065,7 +1110,7 @@ class RookCluster(object):
             return rook_nfsgw
 
         create_ganesha_pool(mgr)
             return rook_nfsgw
 
         create_ganesha_pool(mgr)
-        NFSRados(mgr_module, service_id).write_obj('', f'conf-nfs.{spec.service_id}')
+        NFSRados(mgr_module.rados, service_id).write_obj('', f'conf-nfs.{spec.service_id}')
         return self._create_or_patch(cnfs.CephNFS, 'cephnfses', service_id,
                 _update_nfs, _create_nfs)
 
         return self._create_or_patch(cnfs.CephNFS, 'cephnfses', service_id,
                 _update_nfs, _create_nfs)
 
index 486582074767ed303dac712ceac7481dd01cb8cf..1fc3217ec7d266188a1866b95709eadeb6ced133 100644 (file)
@@ -193,6 +193,7 @@ class SnapSchedClient(CephfsClient):
             db.execute('PRAGMA JOURNAL_MODE = PERSIST')
             db.execute('PRAGMA PAGE_SIZE = 65536')
             db.execute('PRAGMA CACHE_SIZE = 256')
             db.execute('PRAGMA JOURNAL_MODE = PERSIST')
             db.execute('PRAGMA PAGE_SIZE = 65536')
             db.execute('PRAGMA CACHE_SIZE = 256')
+            db.execute('PRAGMA TEMP_STORE = memory')
             db.row_factory = sqlite3.Row
             # check for legacy dump store
             pool_param = cast(Union[int, str], poolid)
             db.row_factory = sqlite3.Row
             # check for legacy dump store
             pool_param = cast(Union[int, str], poolid)
index a068b4ac31d8c9b6906ac19d6fe04deba4ed0d7e..572e26815c00e057c85db9bf2a52b2d84b85cb50 100644 (file)
@@ -37,17 +37,6 @@ class Module(MgrModule):
         self._initialized = Event()
         self.client = SnapSchedClient(self)
 
         self._initialized = Event()
         self.client = SnapSchedClient(self)
 
-    def resolve_subvolume_path(self, fs: str, subvol: Optional[str], path: str) -> str:
-        if not subvol:
-            return path
-
-        rc, subvol_path, err = self.remote('fs', 'subvolume', 'getpath',
-                                           fs, subvol)
-        if rc != 0:
-            # TODO custom exception?
-            raise Exception(f'Could not resolve {path} in {fs}, {subvol}')
-        return subvol_path + path
-
     @property
     def default_fs(self) -> str:
         fs_map = self.get('fs_map')
     @property
     def default_fs(self) -> str:
         fs_map = self.get('fs_map')
@@ -58,6 +47,9 @@ class Module(MgrModule):
             raise CephfsConnectionException(
                 -errno.ENOENT, "no filesystem found")
 
             raise CephfsConnectionException(
                 -errno.ENOENT, "no filesystem found")
 
+    def has_fs(self, fs_name: str) -> bool:
+        return fs_name in self.client.get_all_filesystems()
+
     def serve(self) -> None:
         self._initialized.set()
 
     def serve(self) -> None:
         self._initialized.set()
 
@@ -68,13 +60,14 @@ class Module(MgrModule):
     @CLIReadCommand('fs snap-schedule status')
     def snap_schedule_get(self,
                           path: str = '/',
     @CLIReadCommand('fs snap-schedule status')
     def snap_schedule_get(self,
                           path: str = '/',
-                          subvol: Optional[str] = None,
                           fs: Optional[str] = None,
                           format: Optional[str] = 'plain') -> Tuple[int, str, str]:
         '''
         List current snapshot schedules
         '''
         use_fs = fs if fs else self.default_fs
                           fs: Optional[str] = None,
                           format: Optional[str] = 'plain') -> Tuple[int, str, str]:
         '''
         List current snapshot schedules
         '''
         use_fs = fs if fs else self.default_fs
+        if not self.has_fs(use_fs):
+            return -errno.EINVAL, '', f"no such filesystem: {use_fs}"
         try:
             ret_scheds = self.client.get_snap_schedules(use_fs, path)
         except CephfsConnectionException as e:
         try:
             ret_scheds = self.client.get_snap_schedules(use_fs, path)
         except CephfsConnectionException as e:
@@ -86,7 +79,6 @@ class Module(MgrModule):
 
     @CLIReadCommand('fs snap-schedule list')
     def snap_schedule_list(self, path: str,
 
     @CLIReadCommand('fs snap-schedule list')
     def snap_schedule_list(self, path: str,
-                           subvol: Optional[str] = None,
                            recursive: bool = False,
                            fs: Optional[str] = None,
                            format: Optional[str] = 'plain') -> Tuple[int, str, str]:
                            recursive: bool = False,
                            fs: Optional[str] = None,
                            format: Optional[str] = 'plain') -> Tuple[int, str, str]:
@@ -95,6 +87,8 @@ class Module(MgrModule):
         '''
         try:
             use_fs = fs if fs else self.default_fs
         '''
         try:
             use_fs = fs if fs else self.default_fs
+            if not self.has_fs(use_fs):
+                return -errno.EINVAL, '', f"no such filesystem: {use_fs}"
             scheds = self.client.list_snap_schedules(use_fs, path, recursive)
             self.log.debug(f'recursive is {recursive}')
         except CephfsConnectionException as e:
             scheds = self.client.list_snap_schedules(use_fs, path, recursive)
             self.log.debug(f'recursive is {recursive}')
         except CephfsConnectionException as e:
@@ -117,14 +111,16 @@ class Module(MgrModule):
                           path: str,
                           snap_schedule: str,
                           start: Optional[str] = None,
                           path: str,
                           snap_schedule: str,
                           start: Optional[str] = None,
-                          fs: Optional[str] = None,
-                          subvol: Optional[str] = None) -> Tuple[int, str, str]:
+                          fs: Optional[str] = None) -> Tuple[int, str, str]:
         '''
         Set a snapshot schedule for <path>
         '''
         try:
             use_fs = fs if fs else self.default_fs
         '''
         Set a snapshot schedule for <path>
         '''
         try:
             use_fs = fs if fs else self.default_fs
-            abs_path = self.resolve_subvolume_path(use_fs, subvol, path)
+            if not self.has_fs(use_fs):
+                return -errno.EINVAL, '', f"no such filesystem: {use_fs}"
+            abs_path = path
+            subvol = None
             self.client.store_snap_schedule(use_fs,
                                             abs_path,
                                             (abs_path, snap_schedule,
             self.client.store_snap_schedule(use_fs,
                                             abs_path,
                                             (abs_path, snap_schedule,
@@ -147,14 +143,15 @@ class Module(MgrModule):
                          path: str,
                          repeat: Optional[str] = None,
                          start: Optional[str] = None,
                          path: str,
                          repeat: Optional[str] = None,
                          start: Optional[str] = None,
-                         subvol: Optional[str] = None,
                          fs: Optional[str] = None) -> Tuple[int, str, str]:
         '''
         Remove a snapshot schedule for <path>
         '''
         try:
             use_fs = fs if fs else self.default_fs
                          fs: Optional[str] = None) -> Tuple[int, str, str]:
         '''
         Remove a snapshot schedule for <path>
         '''
         try:
             use_fs = fs if fs else self.default_fs
-            abs_path = self.resolve_subvolume_path(use_fs, subvol, path)
+            if not self.has_fs(use_fs):
+                return -errno.EINVAL, '', f"no such filesystem: {use_fs}"
+            abs_path = path
             self.client.rm_snap_schedule(use_fs, abs_path, repeat, start)
         except CephfsConnectionException as e:
             return e.to_tuple()
             self.client.rm_snap_schedule(use_fs, abs_path, repeat, start)
         except CephfsConnectionException as e:
             return e.to_tuple()
@@ -167,14 +164,15 @@ class Module(MgrModule):
                                     path: str,
                                     retention_spec_or_period: str,
                                     retention_count: Optional[str] = None,
                                     path: str,
                                     retention_spec_or_period: str,
                                     retention_count: Optional[str] = None,
-                                    fs: Optional[str] = None,
-                                    subvol: Optional[str] = None) -> Tuple[int, str, str]:
+                                    fs: Optional[str] = None) -> Tuple[int, str, str]:
         '''
         Set a retention specification for <path>
         '''
         try:
             use_fs = fs if fs else self.default_fs
         '''
         Set a retention specification for <path>
         '''
         try:
             use_fs = fs if fs else self.default_fs
-            abs_path = self.resolve_subvolume_path(use_fs, subvol, path)
+            if not self.has_fs(use_fs):
+                return -errno.EINVAL, '', f"no such filesystem: {use_fs}"
+            abs_path = path
             self.client.add_retention_spec(use_fs, abs_path,
                                           retention_spec_or_period,
                                           retention_count)
             self.client.add_retention_spec(use_fs, abs_path,
                                           retention_spec_or_period,
                                           retention_count)
@@ -189,14 +187,15 @@ class Module(MgrModule):
                                    path: str,
                                    retention_spec_or_period: str,
                                    retention_count: Optional[str] = None,
                                    path: str,
                                    retention_spec_or_period: str,
                                    retention_count: Optional[str] = None,
-                                   fs: Optional[str] = None,
-                                   subvol: Optional[str] = None) -> Tuple[int, str, str]:
+                                   fs: Optional[str] = None) -> Tuple[int, str, str]:
         '''
         Remove a retention specification for <path>
         '''
         try:
             use_fs = fs if fs else self.default_fs
         '''
         Remove a retention specification for <path>
         '''
         try:
             use_fs = fs if fs else self.default_fs
-            abs_path = self.resolve_subvolume_path(use_fs, subvol, path)
+            if not self.has_fs(use_fs):
+                return -errno.EINVAL, '', f"no such filesystem: {use_fs}"
+            abs_path = path
             self.client.rm_retention_spec(use_fs, abs_path,
                                           retention_spec_or_period,
                                           retention_count)
             self.client.rm_retention_spec(use_fs, abs_path,
                                           retention_spec_or_period,
                                           retention_count)
@@ -211,14 +210,15 @@ class Module(MgrModule):
                                path: str,
                                repeat: Optional[str] = None,
                                start: Optional[str] = None,
                                path: str,
                                repeat: Optional[str] = None,
                                start: Optional[str] = None,
-                               subvol: Optional[str] = None,
                                fs: Optional[str] = None) -> Tuple[int, str, str]:
         '''
         Activate a snapshot schedule for <path>
         '''
         try:
             use_fs = fs if fs else self.default_fs
                                fs: Optional[str] = None) -> Tuple[int, str, str]:
         '''
         Activate a snapshot schedule for <path>
         '''
         try:
             use_fs = fs if fs else self.default_fs
-            abs_path = self.resolve_subvolume_path(use_fs, subvol, path)
+            if not self.has_fs(use_fs):
+                return -errno.EINVAL, '', f"no such filesystem: {use_fs}"
+            abs_path = path
             self.client.activate_snap_schedule(use_fs, abs_path, repeat, start)
         except CephfsConnectionException as e:
             return e.to_tuple()
             self.client.activate_snap_schedule(use_fs, abs_path, repeat, start)
         except CephfsConnectionException as e:
             return e.to_tuple()
@@ -231,14 +231,15 @@ class Module(MgrModule):
                                  path: str,
                                  repeat: Optional[str] = None,
                                  start: Optional[str] = None,
                                  path: str,
                                  repeat: Optional[str] = None,
                                  start: Optional[str] = None,
-                                 subvol: Optional[str] = None,
                                  fs: Optional[str] = None) -> Tuple[int, str, str]:
         '''
         Deactivate a snapshot schedule for <path>
         '''
         try:
             use_fs = fs if fs else self.default_fs
                                  fs: Optional[str] = None) -> Tuple[int, str, str]:
         '''
         Deactivate a snapshot schedule for <path>
         '''
         try:
             use_fs = fs if fs else self.default_fs
-            abs_path = self.resolve_subvolume_path(use_fs, subvol, path)
+            if not self.has_fs(use_fs):
+                return -errno.EINVAL, '', f"no such filesystem: {use_fs}"
+            abs_path = path
             self.client.deactivate_snap_schedule(use_fs, abs_path, repeat, start)
         except CephfsConnectionException as e:
             return e.to_tuple()
             self.client.deactivate_snap_schedule(use_fs, abs_path, repeat, start)
         except CephfsConnectionException as e:
             return e.to_tuple()
index 4e06f1fc64db23702ffc17f4b236ed6dd2d0aaff..596b3bc08d1a8137eb68aecd1c1818137860086c 100644 (file)
@@ -14,7 +14,7 @@ from datetime import datetime, timedelta
 from threading import Lock, Condition, Thread, Timer
 from ipaddress import ip_address
 
 from threading import Lock, Condition, Thread, Timer
 from ipaddress import ip_address
 
-PERF_STATS_VERSION = 1
+PERF_STATS_VERSION = 2
 
 QUERY_IDS = "query_ids"
 GLOBAL_QUERY_ID = "global_query_id"
 
 QUERY_IDS = "query_ids"
 GLOBAL_QUERY_ID = "global_query_id"
@@ -26,6 +26,8 @@ MDS_RANK_ALL = (-1,)
 CLIENT_ID_ALL = "\d*"
 CLIENT_IP_ALL = ".*"
 
 CLIENT_ID_ALL = "\d*"
 CLIENT_IP_ALL = ".*"
 
+fs_list = [] # type: List[str]
+
 MDS_PERF_QUERY_REGEX_MATCH_ALL_RANKS = '^(.*)$'
 MDS_PERF_QUERY_REGEX_MATCH_CLIENTS = '^(client.{0}\s+{1}):.*'
 MDS_PERF_QUERY_COUNTERS_MAP = OrderedDict({'cap_hit': 0,
 MDS_PERF_QUERY_REGEX_MATCH_ALL_RANKS = '^(.*)$'
 MDS_PERF_QUERY_REGEX_MATCH_CLIENTS = '^(client.{0}\s+{1}):.*'
 MDS_PERF_QUERY_COUNTERS_MAP = OrderedDict({'cap_hit': 0,
@@ -143,8 +145,9 @@ class FSPerfStats(object):
         self.report_processor = Thread(target=self.run)
         self.report_processor.start()
 
         self.report_processor = Thread(target=self.run)
         self.report_processor.start()
 
-    def set_client_metadata(self, client_id, key, meta):
-        result = self.client_metadata['metadata'].setdefault(client_id, {})
+    def set_client_metadata(self, fs_name, client_id, key, meta):
+        result = (self.client_metadata['metadata'].setdefault(
+                            fs_name, {})).setdefault(client_id, {})
         if not key in result or not result[key] == meta:
             result[key] = meta
 
         if not key in result or not result[key] == meta:
             result[key] = meta
 
@@ -156,35 +159,40 @@ class FSPerfStats(object):
             except KeyError:
                 self.log.warn(f"cmdtag {cmdtag} not found in client metadata")
                 return
             except KeyError:
                 self.log.warn(f"cmdtag {cmdtag} not found in client metadata")
                 return
-
-            client_meta = result[1].wait()
+            fs_name = result[0]
+            client_meta = result[2].wait()
             if client_meta[0] != 0:
             if client_meta[0] != 0:
-                self.log.warn("failed to fetch client metadata from rank {0}, err={1}".format(
-                    result[0], client_meta[2]))
+                self.log.warn("failed to fetch client metadata from gid {0}, err={1}".format(
+                    result[1], client_meta[2]))
                 return
             self.log.debug("notify: client metadata={0}".format(json.loads(client_meta[1])))
             for metadata in json.loads(client_meta[1]):
                 client_id = "client.{0}".format(metadata['id'])
                 return
             self.log.debug("notify: client metadata={0}".format(json.loads(client_meta[1])))
             for metadata in json.loads(client_meta[1]):
                 client_id = "client.{0}".format(metadata['id'])
-                result = self.client_metadata['metadata'].setdefault(client_id, {})
+                result = (self.client_metadata['metadata'].setdefault(fs_name, {})).setdefault(client_id, {})
                 for subkey in CLIENT_METADATA_SUBKEYS:
                 for subkey in CLIENT_METADATA_SUBKEYS:
-                    self.set_client_metadata(client_id, subkey, metadata[CLIENT_METADATA_KEY][subkey])
+                    self.set_client_metadata(fs_name, client_id, subkey, metadata[CLIENT_METADATA_KEY][subkey])
                 for subkey in CLIENT_METADATA_SUBKEYS_OPTIONAL:
                 for subkey in CLIENT_METADATA_SUBKEYS_OPTIONAL:
-                    self.set_client_metadata(client_id, subkey,
+                    self.set_client_metadata(fs_name, client_id, subkey,
                                              metadata[CLIENT_METADATA_KEY].get(subkey, NON_EXISTENT_KEY_STR))
                 metric_features = int(metadata[CLIENT_METADATA_KEY]["metric_spec"]["metric_flags"]["feature_bits"], 16)
                 supported_metrics = [metric for metric, bit in MDS_PERF_QUERY_COUNTERS_MAP.items() if metric_features & (1 << bit)]
                                              metadata[CLIENT_METADATA_KEY].get(subkey, NON_EXISTENT_KEY_STR))
                 metric_features = int(metadata[CLIENT_METADATA_KEY]["metric_spec"]["metric_flags"]["feature_bits"], 16)
                 supported_metrics = [metric for metric, bit in MDS_PERF_QUERY_COUNTERS_MAP.items() if metric_features & (1 << bit)]
-                self.set_client_metadata(client_id, "valid_metrics", supported_metrics)
+                self.set_client_metadata(fs_name, client_id, "valid_metrics", supported_metrics)
                 kver = metadata[CLIENT_METADATA_KEY].get("kernel_version", None)
                 if kver:
                 kver = metadata[CLIENT_METADATA_KEY].get("kernel_version", None)
                 if kver:
-                    self.set_client_metadata(client_id, "kernel_version", kver)
+                    self.set_client_metadata(fs_name, client_id, "kernel_version", kver)
             # when all async requests are done, purge clients metadata if any.
             if not self.client_metadata['in_progress']:
             # when all async requests are done, purge clients metadata if any.
             if not self.client_metadata['in_progress']:
-                for client in self.client_metadata['to_purge']:
-                    try:
-                        self.log.info("purge client metadata for {0}".format(client))
-                        self.client_metadata['metadata'].remove(client)
-                    except:
-                        pass
+                global fs_list
+                for fs_name in fs_list:
+                    for client in self.client_metadata['to_purge']:
+                        try:
+                            if client in self.client_metadata['metadata'][fs_name]:
+                                self.log.info("purge client metadata for {0}".format(client))
+                                self.client_metadata['metadata'][fs_name].pop(client)
+                        except:
+                            pass
+                    if fs_name in self.client_metadata['metadata'] and not bool(self.client_metadata['metadata'][fs_name]):
+                        self.client_metadata['metadata'].pop(fs_name)
                 self.client_metadata['to_purge'].clear()
             self.log.debug("client_metadata={0}, to_purge={1}".format(
                 self.client_metadata['metadata'], self.client_metadata['to_purge']))
                 self.client_metadata['to_purge'].clear()
             self.log.debug("client_metadata={0}, to_purge={1}".format(
                 self.client_metadata['metadata'], self.client_metadata['to_purge']))
@@ -195,15 +203,17 @@ class FSPerfStats(object):
             gid_state = FSPerfStats.get_rank0_mds_gid_state(self.module.get('fs_map'))
             if not gid_state:
                 return
             gid_state = FSPerfStats.get_rank0_mds_gid_state(self.module.get('fs_map'))
             if not gid_state:
                 return
-            rank0_gid, state = gid_state
-            if (rank0_gid and rank0_gid != self.prev_rank0_gid and state == 'up:active'):
-                #the new rank0 MDS is up:active
-                ua_last_updated = time.monotonic()
-                if (self.rqtimer and self.rqtimer.is_alive()):
-                    self.rqtimer.cancel()
-                self.rqtimer = Timer(REREGISTER_TIMER_INTERVAL,
-                                     self.re_register_queries, args=(rank0_gid, ua_last_updated,))
-                self.rqtimer.start()
+            for value in gid_state:
+                rank0_gid, state = value
+                if (rank0_gid and rank0_gid != self.prev_rank0_gid and state == 'up:active'):
+                    #the new rank0 MDS is up:active
+                    ua_last_updated = time.monotonic()
+                    if (self.rqtimer and self.rqtimer.is_alive()):
+                        self.rqtimer.cancel()
+                    self.rqtimer = Timer(REREGISTER_TIMER_INTERVAL,
+                                         self.re_register_queries,
+                                         args=(rank0_gid, ua_last_updated,))
+                    self.rqtimer.start()
 
     def re_register_queries(self, rank0_gid, ua_last_updated):
         #reregister queries if the metrics are the latest. Otherwise reschedule the timer and
 
     def re_register_queries(self, rank0_gid, ua_last_updated):
         #reregister queries if the metrics are the latest. Otherwise reschedule the timer and
@@ -221,34 +231,42 @@ class FSPerfStats(object):
 
     @staticmethod
     def get_rank0_mds_gid_state(fsmap):
 
     @staticmethod
     def get_rank0_mds_gid_state(fsmap):
+        gid_state = []
         for fs in fsmap['filesystems']:
             mds_map = fs['mdsmap']
             if mds_map is not None:
                 for mds_id, mds_status in mds_map['info'].items():
                     if mds_status['rank'] == 0:
         for fs in fsmap['filesystems']:
             mds_map = fs['mdsmap']
             if mds_map is not None:
                 for mds_id, mds_status in mds_map['info'].items():
                     if mds_status['rank'] == 0:
-                        return mds_status['gid'], mds_status['state']
+                        gid_state.append([mds_status['gid'], mds_status['state']])
+        if gid_state:
+            return gid_state
         logger.warn("No rank0 mds in the fsmap")
 
     def update_client_meta(self):
         new_updates = {}
         pending_updates = [v[0] for v in self.client_metadata['in_progress'].values()]
         logger.warn("No rank0 mds in the fsmap")
 
     def update_client_meta(self):
         new_updates = {}
         pending_updates = [v[0] for v in self.client_metadata['in_progress'].values()]
+        global fs_list
+        fs_list.clear()
         with self.meta_lock:
             fsmap = self.module.get('fs_map')
             for fs in fsmap['filesystems']:
         with self.meta_lock:
             fsmap = self.module.get('fs_map')
             for fs in fsmap['filesystems']:
-                mdsmap = fs['mdsmap']                
-                gid = mdsmap['up']["mds_0"]
-                if gid in pending_updates:
-                    continue                
-                tag = str(uuid.uuid4())
-                result = CommandResult(tag)
-                new_updates[tag] = (gid, result)
-            self.client_metadata['in_progress'].update(new_updates)
+                mds_map = fs['mdsmap']
+                if mds_map is not None:
+                    fsname = mds_map['fs_name']
+                    for mds_id, mds_status in mds_map['info'].items():
+                        if mds_status['rank'] == 0:
+                            fs_list.append(fsname)
+                            rank0_gid = mds_status['gid']
+                            tag = str(uuid.uuid4())
+                            result = CommandResult(tag)
+                            new_updates[tag] = (fsname, rank0_gid, result)
+                    self.client_metadata['in_progress'].update(new_updates)
 
         self.log.debug(f"updating client metadata from {new_updates}")
 
         cmd_dict = {'prefix': 'client ls'}
         for tag,val in new_updates.items():
 
         self.log.debug(f"updating client metadata from {new_updates}")
 
         cmd_dict = {'prefix': 'client ls'}
         for tag,val in new_updates.items():
-            self.module.send_command(val[1], "mds", str(val[0]), json.dumps(cmd_dict), tag)
+            self.module.send_command(val[2], "mds", str(val[1]), json.dumps(cmd_dict), tag)
 
     def run(self):
         try:
 
     def run(self):
         try:
@@ -280,7 +298,7 @@ class FSPerfStats(object):
     def cull_client_entries(self, raw_perf_counters, incoming_metrics, missing_clients):
         # this is a bit more involed -- for each rank figure out what clients
         # are missing in incoming report and purge them from our tracked map.
     def cull_client_entries(self, raw_perf_counters, incoming_metrics, missing_clients):
         # this is a bit more involed -- for each rank figure out what clients
         # are missing in incoming report and purge them from our tracked map.
-        # but, if this is invoked _after_ cull_mds_entries(), the rank set
+        # but, if this is invoked after cull_mds_entries(), the rank set
         # is same, so we can loop based on that assumption.
         ranks = raw_perf_counters.keys()
         for rank in ranks:
         # is same, so we can loop based on that assumption.
         ranks = raw_perf_counters.keys()
         for rank in ranks:
@@ -303,13 +321,16 @@ class FSPerfStats(object):
                 self.log.info("deferring client metadata purge (now {0} client(s))".format(
                     len(self.client_metadata['to_purge'])))
             else:
                 self.log.info("deferring client metadata purge (now {0} client(s))".format(
                     len(self.client_metadata['to_purge'])))
             else:
-                for client in missing_clients:
-                    try:
-                        self.log.info("purge client metadata for {0}".format(client))
-                        self.client_metadata['metadata'].pop(client)
-                    except KeyError:
-                        pass
-                self.log.debug("client_metadata={0}".format(self.client_metadata['metadata']))
+                global fs_list
+                for fs_name in fs_list:
+                    for client in missing_clients:
+                        try:
+                            self.log.info("purge client metadata for {0}".format(client))
+                            if client in self.client_metadata['metadata'][fs_name]:
+                                self.client_metadata['metadata'][fs_name].pop(client)
+                        except KeyError:
+                            pass
+                    self.log.debug("client_metadata={0}".format(self.client_metadata['metadata']))
 
     def cull_global_metrics(self, raw_perf_counters, incoming_metrics):
         tracked_clients = raw_perf_counters.keys()
 
     def cull_global_metrics(self, raw_perf_counters, incoming_metrics):
         tracked_clients = raw_perf_counters.keys()
@@ -340,21 +361,27 @@ class FSPerfStats(object):
 
             # iterate over metrics list and update our copy (note that we have
             # already culled the differences).
 
             # iterate over metrics list and update our copy (note that we have
             # already culled the differences).
-            for counter in incoming_metrics:
-                mds_rank = int(counter['k'][0][0])
-                client_id, client_ip = extract_client_id_and_ip(counter['k'][1][0])
-                if client_id is not None or not client_ip: # client_id _could_ be 0
-                    with self.meta_lock:
-                        self.set_client_metadata(client_id, "IP", client_ip)
-                else:
-                    self.log.warn("client metadata for client_id={0} might be unavailable".format(client_id))
-
-                raw_counters = raw_perf_counters.setdefault(mds_rank, [False, {}])
-                raw_counters[0] = True if mds_rank in delayed_ranks else False
-                raw_client_counters = raw_counters[1].setdefault(client_id, [])
-
-                del raw_client_counters[:]
-                raw_client_counters.extend(counter['c'])
+            global fs_list
+            for fs_name in fs_list:
+                for counter in incoming_metrics:
+                    mds_rank = int(counter['k'][0][0])
+                    client_id, client_ip = extract_client_id_and_ip(counter['k'][1][0])
+                    if self.client_metadata['metadata'].get(fs_name):
+                        if (client_id is not None or not client_ip) and\
+                             self.client_metadata["metadata"][fs_name].get(client_id): # client_id _could_ be 0
+                            with self.meta_lock:
+                                self.set_client_metadata(fs_name, client_id, "IP", client_ip)
+                        else:
+                            self.log.warn(f"client metadata for client_id={client_id} might be unavailable")
+                    else:
+                        self.log.warn(f"client metadata for filesystem={fs_name} might be unavailable")
+
+                    raw_counters = raw_perf_counters.setdefault(mds_rank, [False, {}])
+                    raw_counters[0] = True if mds_rank in delayed_ranks else False
+                    raw_client_counters = raw_counters[1].setdefault(client_id, [])
+
+                    del raw_client_counters[:]
+                    raw_client_counters.extend(counter['c'])
         # send an asynchronous client metadata refresh
         self.update_client_meta()
 
         # send an asynchronous client metadata refresh
         self.update_client_meta()
 
@@ -471,32 +498,42 @@ class FSPerfStats(object):
 
     def generate_report(self, user_query):
         result = {} # type: Dict
 
     def generate_report(self, user_query):
         result = {} # type: Dict
+        global fs_list
         # start with counter info -- metrics that are global and per mds
         result["version"] = PERF_STATS_VERSION
         result["global_counters"] = MDS_GLOBAL_PERF_QUERY_COUNTERS
         result["counters"] = MDS_PERF_QUERY_COUNTERS
 
         # fill in client metadata
         # start with counter info -- metrics that are global and per mds
         result["version"] = PERF_STATS_VERSION
         result["global_counters"] = MDS_GLOBAL_PERF_QUERY_COUNTERS
         result["counters"] = MDS_PERF_QUERY_COUNTERS
 
         # fill in client metadata
-        raw_perfs = user_query.setdefault(QUERY_RAW_COUNTERS_GLOBAL, {})
+        raw_perfs_global = user_query.setdefault(QUERY_RAW_COUNTERS_GLOBAL, {})
+        raw_perfs = user_query.setdefault(QUERY_RAW_COUNTERS, {})
         with self.meta_lock:
         with self.meta_lock:
+            raw_counters_clients = []
+            for val in raw_perfs.values():
+                raw_counters_clients.extend(list(val[1]))
             result_meta = result.setdefault("client_metadata", {})
             result_meta = result.setdefault("client_metadata", {})
-            for client_id in raw_perfs.keys():
-                if client_id in self.client_metadata["metadata"]:
-                    client_meta = result_meta.setdefault(client_id, {})
-                    client_meta.update(self.client_metadata["metadata"][client_id])
+            for fs_name in fs_list:
+                meta = self.client_metadata["metadata"]
+                if fs_name in meta and len(meta[fs_name]):
+                    for client_id in raw_perfs_global.keys():
+                        if client_id in meta[fs_name] and client_id in raw_counters_clients:
+                            client_meta = (result_meta.setdefault(fs_name, {})).setdefault(client_id, {})
+                            client_meta.update(meta[fs_name][client_id])
 
             # start populating global perf metrics w/ client metadata
             metrics = result.setdefault("global_metrics", {})
 
             # start populating global perf metrics w/ client metadata
             metrics = result.setdefault("global_metrics", {})
-            for client_id, counters in raw_perfs.items():
-                global_client_metrics = metrics.setdefault(client_id, [])
-                del global_client_metrics[:]
-                global_client_metrics.extend(counters)
+            for fs_name in fs_list:
+                if fs_name in meta and len(meta[fs_name]):
+                    for client_id, counters in raw_perfs_global.items():
+                        if client_id in meta[fs_name] and client_id in raw_counters_clients:
+                            global_client_metrics = (metrics.setdefault(fs_name, {})).setdefault(client_id, [])
+                            del global_client_metrics[:]
+                            global_client_metrics.extend(counters)
 
             # and, now per-mds metrics keyed by mds rank along with delayed ranks
 
             # and, now per-mds metrics keyed by mds rank along with delayed ranks
-            raw_perfs = user_query.setdefault(QUERY_RAW_COUNTERS, {})
             metrics = result.setdefault("metrics", {})
 
             metrics = result.setdefault("metrics", {})
 
-            metrics["delayed_ranks"] = [rank for rank,counters in raw_perfs.items() if counters[0]]
+            metrics["delayed_ranks"] = [rank for rank, counters in raw_perfs.items() if counters[0]]
             for rank, counters in raw_perfs.items():
                 mds_key = "mds.{}".format(rank)
                 mds_metrics = metrics.setdefault(mds_key, {})
             for rank, counters in raw_perfs.items():
                 mds_key = "mds.{}".format(rank)
                 mds_metrics = metrics.setdefault(mds_key, {})
index f3d49055a5ee3f0206cbd0931753951169a4c5f1..293daa22a0828fead49e19721369141a3c3842fb 100644 (file)
@@ -70,6 +70,7 @@ class Collection(str, enum.Enum):
     basic_usage_by_class = 'basic_usage_by_class'
     basic_rook_v01 = 'basic_rook_v01'
     perf_memory_metrics = 'perf_memory_metrics'
     basic_usage_by_class = 'basic_usage_by_class'
     basic_rook_v01 = 'basic_rook_v01'
     perf_memory_metrics = 'perf_memory_metrics'
+    basic_pool_options_bluestore = 'basic_pool_options_bluestore'
 
 MODULE_COLLECTION : List[Dict] = [
     {
 
 MODULE_COLLECTION : List[Dict] = [
     {
@@ -132,6 +133,12 @@ MODULE_COLLECTION : List[Dict] = [
         "channel": "perf",
         "nag": False
     },
         "channel": "perf",
         "nag": False
     },
+    {
+        "name": Collection.basic_pool_options_bluestore,
+        "description": "Per-pool bluestore config options",
+        "channel": "basic",
+        "nag": False
+    },
 ]
 
 ROOK_KEYS_BY_COLLECTION : List[Tuple[str, Collection]] = [
 ]
 
 ROOK_KEYS_BY_COLLECTION : List[Tuple[str, Collection]] = [
@@ -1086,7 +1093,17 @@ class Module(MgrModule):
                                             'wr': pool_stats['wr'],
                                             'wr_bytes': pool_stats['wr_bytes']
                         }
                                             'wr': pool_stats['wr'],
                                             'wr_bytes': pool_stats['wr_bytes']
                         }
-
+                    pool_data['options'] = {}
+                    # basic_pool_options_bluestore collection
+                    if self.is_enabled_collection(Collection.basic_pool_options_bluestore):
+                        bluestore_options = ['compression_algorithm',
+                                             'compression_mode',
+                                             'compression_required_ratio',
+                                             'compression_min_blob_size',
+                                             'compression_max_blob_size']
+                        for option in bluestore_options:
+                            if option in pool['options']:
+                                pool_data['options'][option] = pool['options'][option]
                 cast(List[Dict[str, Any]], report['pools']).append(pool_data)
                 if 'rbd' in pool['application_metadata']:
                     rbd_num_pools += 1
                 cast(List[Dict[str, Any]], report['pools']).append(pool_data)
                 if 'rbd' in pool['application_metadata']:
                     rbd_num_pools += 1
index b6096d25fa2a297d643c20cb8c4e3b5a54d3d431..20ed950378dd03682e51a525a906dcb26978c265 100644 (file)
       "service_type": "mds",
       "status": {
         "container_image_id": "36114e38494190b0c9d4b088c12e6e4086e8017b96b4d5fc14eb5406bd51b55b",
       "service_type": "mds",
       "status": {
         "container_image_id": "36114e38494190b0c9d4b088c12e6e4086e8017b96b4d5fc14eb5406bd51b55b",
-        "container_image_name": "quay.io/ceph-ci/ceph:master",
+        "container_image_name": "quay.io/ceph-ci/ceph:main",
         "created": "2020-04-16T03:39:39.512721",
         "last_refresh": "2020-04-16T06:51:42.412980",
         "running": 2,
         "created": "2020-04-16T03:39:39.512721",
         "last_refresh": "2020-04-16T06:51:42.412980",
         "running": 2,
       "service_type": "mgr",
       "status": {
         "container_image_id": "36114e38494190b0c9d4b088c12e6e4086e8017b96b4d5fc14eb5406bd51b55b",
       "service_type": "mgr",
       "status": {
         "container_image_id": "36114e38494190b0c9d4b088c12e6e4086e8017b96b4d5fc14eb5406bd51b55b",
-        "container_image_name": "quay.io/ceph-ci/ceph:master",
+        "container_image_name": "quay.io/ceph-ci/ceph:main",
         "created": "2020-04-16T05:44:40.978366",
         "last_refresh": "2020-04-16T06:51:42.412919",
         "running": 2,
         "created": "2020-04-16T05:44:40.978366",
         "last_refresh": "2020-04-16T06:51:42.412919",
         "running": 2,
       "service_type": "nfs",
       "status": {
         "container_image_id": "36114e38494190b0c9d4b088c12e6e4086e8017b96b4d5fc14eb5406bd51b55b",
       "service_type": "nfs",
       "status": {
         "container_image_id": "36114e38494190b0c9d4b088c12e6e4086e8017b96b4d5fc14eb5406bd51b55b",
-        "container_image_name": "quay.io/ceph-ci/ceph:master",
+        "container_image_name": "quay.io/ceph-ci/ceph:main",
         "created": "2020-04-16T03:39:39.512721",
         "last_refresh": "2020-04-16T06:51:42.412980",
         "running": 1,
         "created": "2020-04-16T03:39:39.512721",
         "last_refresh": "2020-04-16T06:51:42.412980",
         "running": 1,
       "service_type": "iscsi",
       "status": {
         "container_image_id": "36114e38494190b0c9d4b088c12e6e4086e8017b96b4d5fc14eb5406bd51b55b",
       "service_type": "iscsi",
       "status": {
         "container_image_id": "36114e38494190b0c9d4b088c12e6e4086e8017b96b4d5fc14eb5406bd51b55b",
-        "container_image_name": "quay.io/ceph-ci/ceph:master",
+        "container_image_name": "quay.io/ceph-ci/ceph:main",
         "created": "2020-04-16T03:39:39.512721",
         "last_refresh": "2020-04-16T06:51:42.412980",
         "running": 1,
         "created": "2020-04-16T03:39:39.512721",
         "last_refresh": "2020-04-16T06:51:42.412980",
         "running": 1,
     {
       "container_id": "87d84858109d",
       "container_image_id": "36114e38494190b0c9d4b088c12e6e4086e8017b96b4d5fc14eb5406bd51b55b",
     {
       "container_id": "87d84858109d",
       "container_image_id": "36114e38494190b0c9d4b088c12e6e4086e8017b96b4d5fc14eb5406bd51b55b",
-      "container_image_name": "quay.io/ceph-ci/ceph:master",
+      "container_image_name": "quay.io/ceph-ci/ceph:main",
       "created": "2020-04-16T03:39:40.394999",
       "daemon_id": "xx.mgr0.nkchxn",
       "daemon_type": "mds",
       "created": "2020-04-16T03:39:40.394999",
       "daemon_id": "xx.mgr0.nkchxn",
       "daemon_type": "mds",
     {
       "container_id": "07ff9b56bcb9",
       "container_image_id": "36114e38494190b0c9d4b088c12e6e4086e8017b96b4d5fc14eb5406bd51b55b",
     {
       "container_id": "07ff9b56bcb9",
       "container_image_id": "36114e38494190b0c9d4b088c12e6e4086e8017b96b4d5fc14eb5406bd51b55b",
-      "container_image_name": "quay.io/ceph-ci/ceph:master",
+      "container_image_name": "quay.io/ceph-ci/ceph:main",
       "created": "2020-04-16T03:39:41.318155",
       "daemon_id": "xx.osd0.ouawlt",
       "daemon_type": "mds",
       "created": "2020-04-16T03:39:41.318155",
       "daemon_id": "xx.osd0.ouawlt",
       "daemon_type": "mds",
     {
       "container_id": "459a982152c6",
       "container_image_id": "36114e38494190b0c9d4b088c12e6e4086e8017b96b4d5fc14eb5406bd51b55b",
     {
       "container_id": "459a982152c6",
       "container_image_id": "36114e38494190b0c9d4b088c12e6e4086e8017b96b4d5fc14eb5406bd51b55b",
-      "container_image_name": "quay.io/ceph-ci/ceph:master",
+      "container_image_name": "quay.io/ceph-ci/ceph:main",
       "created": "2020-04-16T03:36:31.577976",
       "daemon_id": "mgr0.gvlxbw",
       "daemon_type": "mgr",
       "created": "2020-04-16T03:36:31.577976",
       "daemon_id": "mgr0.gvlxbw",
       "daemon_type": "mgr",
     {
       "container_id": "37b7fc67390a",
       "container_image_id": "36114e38494190b0c9d4b088c12e6e4086e8017b96b4d5fc14eb5406bd51b55b",
     {
       "container_id": "37b7fc67390a",
       "container_image_id": "36114e38494190b0c9d4b088c12e6e4086e8017b96b4d5fc14eb5406bd51b55b",
-      "container_image_name": "quay.io/ceph-ci/ceph:master",
+      "container_image_name": "quay.io/ceph-ci/ceph:main",
       "created": "2020-04-16T05:44:41.551646",
       "daemon_id": "osd0.mnsbeq",
       "daemon_type": "mgr",
       "created": "2020-04-16T05:44:41.551646",
       "daemon_id": "osd0.mnsbeq",
       "daemon_type": "mgr",
     {
       "container_id": "aeba86ca1655",
       "container_image_id": "36114e38494190b0c9d4b088c12e6e4086e8017b96b4d5fc14eb5406bd51b55b",
     {
       "container_id": "aeba86ca1655",
       "container_image_id": "36114e38494190b0c9d4b088c12e6e4086e8017b96b4d5fc14eb5406bd51b55b",
-      "container_image_name": "quay.io/ceph-ci/ceph:master",
+      "container_image_name": "quay.io/ceph-ci/ceph:main",
       "created": "2020-04-16T05:44:41.551646",
       "daemon_id": "vstart.osd0",
       "daemon_type": "nfs",
       "created": "2020-04-16T05:44:41.551646",
       "daemon_id": "vstart.osd0",
       "daemon_type": "nfs",
     {
       "container_id": "e695cd698d8a",
       "container_image_id": "36114e38494190b0c9d4b088c12e6e4086e8017b96b4d5fc14eb5406bd51b55b",
     {
       "container_id": "e695cd698d8a",
       "container_image_id": "36114e38494190b0c9d4b088c12e6e4086e8017b96b4d5fc14eb5406bd51b55b",
-      "container_image_name": "quay.io/ceph-ci/ceph:master",
+      "container_image_name": "quay.io/ceph-ci/ceph:main",
       "created": "2020-04-16T05:44:41.551646",
       "daemon_id": "iscsi.osd0.abc123",
       "daemon_type": "iscsi",
       "created": "2020-04-16T05:44:41.551646",
       "daemon_id": "iscsi.osd0.abc123",
       "daemon_type": "iscsi",
index b09df8ce384705861636d8edbbfda914c46679fa..d2fd20870e7ac77489d95712d81e601463dc031e 100644 (file)
@@ -263,12 +263,37 @@ class DecoDemo:
     def gamma_three(self, size: int = 0) -> Dict[str, Any]:
         return {"name": "funnystuff", "size": size}
 
     def gamma_three(self, size: int = 0) -> Dict[str, Any]:
         return {"name": "funnystuff", "size": size}
 
+    @CLICommand("z_err", perm="rw")
+    @object_format.ErrorResponseHandler()
+    def z_err(self, name: str = "default") -> Tuple[int, str, str]:
+        if "z" in name:
+            raise object_format.ErrorResponse(f"{name} bad")
+        return 0, name, ""
+
+    @CLICommand("empty one", perm="rw")
+    @object_format.EmptyResponder()
+    def empty_one(self, name: str = "default", retval: Optional[int] = None) -> None:
+        # in real code, this would be making some sort of state change
+        # but we need to handle erors still
+        if retval is None:
+            retval = -5
+        if name in ["pow"]:
+            raise object_format.ErrorResponse(name, return_value=retval)
+        return
+
+    @CLICommand("empty bad", perm="rw")
+    @object_format.EmptyResponder()
+    def empty_bad(self, name: str = "default") -> int:
+        # in real code, this would be making some sort of state change
+        return 5
+
 
 @pytest.mark.parametrize(
 
 @pytest.mark.parametrize(
-    "prefix, args, response",
+    "prefix, can_format, args, response",
     [
         (
             "alpha one",
     [
         (
             "alpha one",
+            True,
             {"name": "moonbase"},
             (
                 0,
             {"name": "moonbase"},
             (
                 0,
@@ -279,6 +304,7 @@ class DecoDemo:
         # ---
         (
             "alpha one",
         # ---
         (
             "alpha one",
+            True,
             {"name": "moonbase2", "format": "yaml"},
             (
                 0,
             {"name": "moonbase2", "format": "yaml"},
             (
                 0,
@@ -289,6 +315,7 @@ class DecoDemo:
         # ---
         (
             "alpha one",
         # ---
         (
             "alpha one",
+            True,
             {"name": "moonbase2", "format": "chocolate"},
             (
                 -22,
             {"name": "moonbase2", "format": "chocolate"},
             (
                 -22,
@@ -299,6 +326,7 @@ class DecoDemo:
         # ---
         (
             "beta two",
         # ---
         (
             "beta two",
+            True,
             {"name": "blocker"},
             (
                 0,
             {"name": "blocker"},
             (
                 0,
@@ -309,6 +337,7 @@ class DecoDemo:
         # ---
         (
             "beta two",
         # ---
         (
             "beta two",
+            True,
             {"name": "test", "format": "yaml"},
             (
                 0,
             {"name": "test", "format": "yaml"},
             (
                 0,
@@ -319,6 +348,7 @@ class DecoDemo:
         # ---
         (
             "beta two",
         # ---
         (
             "beta two",
+            True,
             {"name": "test", "format": "plain"},
             (
                 -22,
             {"name": "test", "format": "plain"},
             (
                 -22,
@@ -329,6 +359,7 @@ class DecoDemo:
         # ---
         (
             "gamma three",
         # ---
         (
             "gamma three",
+            True,
             {},
             (
                 0,
             {},
             (
                 0,
@@ -339,6 +370,7 @@ class DecoDemo:
         # ---
         (
             "gamma three",
         # ---
         (
             "gamma three",
+            True,
             {"size": 1, "format": "json"},
             (
                 0,
             {"size": 1, "format": "json"},
             (
                 0,
@@ -349,6 +381,7 @@ class DecoDemo:
         # ---
         (
             "gamma three",
         # ---
         (
             "gamma three",
+            True,
             {"size": 1, "format": "plain"},
             (
                 0,
             {"size": 1, "format": "plain"},
             (
                 0,
@@ -359,6 +392,7 @@ class DecoDemo:
         # ---
         (
             "gamma three",
         # ---
         (
             "gamma three",
+            True,
             {"size": 2, "format": "plain"},
             (
                 0,
             {"size": 2, "format": "plain"},
             (
                 0,
@@ -369,6 +403,7 @@ class DecoDemo:
         # ---
         (
             "gamma three",
         # ---
         (
             "gamma three",
+            True,
             {"size": 2, "format": "xml"},
             (
                 0,
             {"size": 2, "format": "xml"},
             (
                 0,
@@ -379,6 +414,7 @@ class DecoDemo:
         # ---
         (
             "gamma three",
         # ---
         (
             "gamma three",
+            True,
             {"size": 2, "format": "toml"},
             (
                 -22,
             {"size": 2, "format": "toml"},
             (
                 -22,
@@ -386,11 +422,71 @@ class DecoDemo:
                 "Unknown format name: toml",
             ),
         ),
                 "Unknown format name: toml",
             ),
         ),
+        # ---
+        (
+            "z_err",
+            False,
+            {"name": "foobar"},
+            (
+                0,
+                "foobar",
+                "",
+            ),
+        ),
+        # ---
+        (
+            "z_err",
+            False,
+            {"name": "zamboni"},
+            (
+                -22,
+                "",
+                "zamboni bad",
+            ),
+        ),
+        # ---
+        (
+            "empty one",
+            False,
+            {"name": "zucchini"},
+            (
+                0,
+                "",
+                "",
+            ),
+        ),
+        # ---
+        (
+            "empty one",
+            False,
+            {"name": "pow"},
+            (
+                -5,
+                "",
+                "pow",
+            ),
+        ),
+        # Ensure setting return_value to zero even on an exception is honored
+        (
+            "empty one",
+            False,
+            {"name": "pow", "retval": 0},
+            (
+                0,
+                "",
+                "pow",
+            ),
+        ),
     ],
 )
     ],
 )
-def test_cli_command_responder(prefix, args, response):
+def test_cli_with_decorators(prefix, can_format, args, response):
     dd = DecoDemo()
     dd = DecoDemo()
-    assert CLICommand.COMMANDS[prefix].call(dd, args, None) == response
+    cmd = CLICommand.COMMANDS[prefix]
+    assert cmd.call(dd, args, None) == response
+    # slighly hacky way to check that the CLI "knows" about a --format option
+    # checking the extra_args feature of the Decorators that provide them (Responder)
+    if can_format:
+        assert 'name=format,' in cmd.args
 
 
 def test_error_response():
 
 
 def test_error_response():
@@ -420,3 +516,67 @@ def test_error_response():
     assert r[1] == ""
     assert "blat" in r[2]
     assert r[0] == e3.mgr_return_value()
     assert r[1] == ""
     assert "blat" in r[2]
     assert r[0] == e3.mgr_return_value()
+
+    # A custom exception type with an errno property
+
+    class MyCoolException(Exception):
+        def __init__(self, err_msg: str, errno: int = 0) -> None:
+            super().__init__(errno, err_msg)
+            self.errno = errno
+            self.err_msg = err_msg
+
+        def __str__(self) -> str:
+            return self.err_msg
+
+    e4 = object_format.ErrorResponse.wrap(MyCoolException("beep", -17))
+    r = e4.format_response()
+    assert r[0] == -17
+    assert r[1] == ""
+    assert r[2] == "beep"
+    assert e4.mgr_return_value() == -17
+
+    e5 = object_format.ErrorResponse.wrap(MyCoolException("ok, fine", 0))
+    r = e5.format_response()
+    assert r[0] == 0
+    assert r[1] == ""
+    assert r[2] == "ok, fine"
+
+    e5 = object_format.ErrorResponse.wrap(MyCoolException("no can do", 8))
+    r = e5.format_response()
+    assert r[0] == -8
+    assert r[1] == ""
+    assert r[2] == "no can do"
+
+    # A custom exception type that inherits from ErrorResponseBase
+
+    class MyErrorResponse(object_format.ErrorResponseBase):
+        def __init__(self, err_msg: str, return_value: int):
+            super().__init__(self, err_msg)
+            self.msg = err_msg
+            self.return_value = return_value
+
+        def format_response(self):
+            return self.return_value, "", self.msg
+
+
+    e6 = object_format.ErrorResponse.wrap(MyErrorResponse("yeah, sure", 0))
+    r = e6.format_response()
+    assert r[0] == 0
+    assert r[1] == ""
+    assert r[2] == "yeah, sure"
+    assert isinstance(e5, object_format.ErrorResponseBase)
+    assert isinstance(e6, MyErrorResponse)
+
+    e7 = object_format.ErrorResponse.wrap(MyErrorResponse("no can do", -8))
+    r = e7.format_response()
+    assert r[0] == -8
+    assert r[1] == ""
+    assert r[2] == "no can do"
+    assert isinstance(e7, object_format.ErrorResponseBase)
+    assert isinstance(e7, MyErrorResponse)
+
+
+def test_empty_responder_return_check():
+    dd = DecoDemo()
+    with pytest.raises(ValueError):
+        CLICommand.COMMANDS["empty bad"].call(dd, {}, None)
index 3426ae2873579f569f03338457b6d75ffc4b4684..d6ae7a29b3d63074331669e7ac2d298a7e310d0d 100644 (file)
@@ -1,15 +1,12 @@
 [tox]
 envlist =
     py3,
 [tox]
 envlist =
     py3,
-    py37,
-    lint,
     mypy,
     fix
     flake8
     jinjalint
     nooptional
 skipsdist = true
     mypy,
     fix
     flake8
     jinjalint
     nooptional
 skipsdist = true
-requires = cython
 skip_missing_interpreters = true
 
 [pytest]
 skip_missing_interpreters = true
 
 [pytest]
@@ -31,20 +28,20 @@ ignore =
     E501,
     W503,
 exclude =
     E501,
     W503,
 exclude =
-    .tox,
-    .vagrant,
-    __pycache__,
-    *.pyc,
-    templates,
+    .tox \
+    .vagrant \
+    __pycache__ \
+    *.pyc \
+    templates \
     .eggs
 statistics = True
 
 [autopep8]
 addopts =
     .eggs
 statistics = True
 
 [autopep8]
 addopts =
-    --max-line-length {[flake8]max-line-length}
-    --exclude "{[flake8]exclude}"
-    --in-place
-    --recursive
+    --max-line-length {[flake8]max-line-length} \
+    --exclude "{[flake8]exclude}" \
+    --in-place \
+    --recursive \
     --ignore-local-config
 
 [testenv]
     --ignore-local-config
 
 [testenv]
@@ -52,7 +49,6 @@ setenv =
     UNITTEST = true
     PYTHONPATH = $PYTHONPATH:..
 deps =
     UNITTEST = true
     PYTHONPATH = $PYTHONPATH:..
 deps =
-    cython
     -rrequirements.txt
     -rrook/requirements.txt
 commands =
     -rrequirements.txt
     -rrook/requirements.txt
 commands =
@@ -63,7 +59,6 @@ setenv =
     UNITTEST = true
     PYTHONPATH = $PYTHONPATH:..
 deps =
     UNITTEST = true
     PYTHONPATH = $PYTHONPATH:..
 deps =
-    cython
     -rrequirements-required.txt
 commands =
     pytest {posargs:cephadm/tests/test_ssh.py}
     -rrequirements-required.txt
 commands =
     pytest {posargs:cephadm/tests/test_ssh.py}
@@ -75,40 +70,7 @@ setenv =
 passenv =
     MYPYPATH
 basepython = python3
 passenv =
     MYPYPATH
 basepython = python3
-mypy_args = --config-file=../../mypy.ini
-           -m alerts
-           -m balancer
-           -m cephadm
-           -m crash
-           -m dashboard
-           -m devicehealth
-           -m diskprediction_local
-           -m hello
-           -m influx
-           -m iostat
-           -m localpool
-           -m mds_autoscaler
-           -m mgr_module
-           -m mgr_util
-           -m mirroring
-           -m nfs
-           -m orchestrator
-           -m pg_autoscaler
-           -m progress
-           -m prometheus
-           -m rbd_support
-           -m rook
-           -m snap_schedule
-           -m selftest
-           -m stats
-           -m status
-           -m telegraf
-           -m telemetry
-           -m test_orchestrator
-           -m volumes
-           -m zabbix
 deps =
 deps =
-    cython
     -rrequirements.txt
     -c{toxinidir}/../../mypy-constrains.txt
     mypy
     -rrequirements.txt
     -c{toxinidir}/../../mypy-constrains.txt
     mypy
@@ -119,9 +81,38 @@ deps =
     types-PyYAML
     types-jwt
 commands =
     types-PyYAML
     types-jwt
 commands =
-    mypy {[testenv:mypy]mypy_args}
-    mypy --python-version 3.7 {[testenv:mypy]mypy_args}
-
+    mypy --config-file=../../mypy.ini \
+           -m alerts \
+           -m balancer \
+           -m cephadm \
+           -m crash \
+           -m dashboard \
+           -m devicehealth \
+           -m diskprediction_local \
+           -m hello \
+           -m influx \
+           -m iostat \
+           -m localpool \
+           -m mds_autoscaler \
+           -m mgr_module \
+           -m mgr_util \
+           -m mirroring \
+           -m nfs \
+           -m orchestrator \
+           -m pg_autoscaler \
+           -m progress \
+           -m prometheus \
+           -m rbd_support \
+           -m rook \
+           -m snap_schedule \
+           -m selftest \
+           -m stats \
+           -m status \
+           -m telegraf \
+           -m telemetry \
+           -m test_orchestrator \
+           -m volumes \
+           -m zabbix
 
 [testenv:test]
 setenv = {[testenv]setenv}
 
 [testenv:test]
 setenv = {[testenv]setenv}
@@ -133,19 +124,19 @@ basepython = python3
 deps =
     autopep8
 modules =
 deps =
     autopep8
 modules =
-    alerts
-    balancer
-    cephadm
-    cli_api
-    crash
-    devicehealth
-    diskprediction_local
-    insights
-    iostat
-    nfs
-    orchestrator
-    prometheus
-    status
+    alerts \
+    balancer \
+    cephadm \
+    cli_api \
+    crash \
+    devicehealth \
+    diskprediction_local \
+    insights \
+    iostat \
+    nfs \
+    orchestrator \
+    prometheus \
+    status \
     telemetry
 commands =
     python --version
     telemetry
 commands =
     python --version
@@ -167,19 +158,19 @@ deps =
     flake8
 allowlist_externals = bash
 modules =
     flake8
 allowlist_externals = bash
 modules =
-    alerts
-    balancer
-    cephadm
-    cli_api
-    crash
-    devicehealth
-    diskprediction_local
-    hello
-    iostat
-    localpool
-    nfs
-    orchestrator
-    prometheus
+    alerts \
+    balancer \
+    cephadm \
+    cli_api \
+    crash \
+    devicehealth \
+    diskprediction_local \
+    hello \
+    iostat \
+    localpool \
+    nfs \
+    orchestrator \
+    prometheus \
     selftest
 commands =
     flake8 --config=tox.ini {posargs} \
     selftest
 commands =
     flake8 --config=tox.ini {posargs} \
index 335d76a809ab13db72128cd83eabbf75b10c589e..6d465febc5e3b1b573789ac013d0f6e33e514a8e 100644 (file)
@@ -2,6 +2,7 @@ import json
 import errno
 import logging
 import os
 import errno
 import logging
 import os
+import mgr_util
 from typing import TYPE_CHECKING
 
 import cephfs
 from typing import TYPE_CHECKING
 
 import cephfs
@@ -152,6 +153,7 @@ class VolumeClient(CephfsClient["Module"]):
     def volume_info(self, **kwargs):
         ret     = None
         volname = kwargs['vol_name']
     def volume_info(self, **kwargs):
         ret     = None
         volname = kwargs['vol_name']
+        human_readable    = kwargs['human_readable']
 
         try:
             with open_volume(self, volname) as fs_handle:
 
         try:
             with open_volume(self, volname) as fs_handle:
@@ -163,7 +165,10 @@ class VolumeClient(CephfsClient["Module"]):
 
                     usedbytes = st['size']
                     vol_info_dict = get_pending_subvol_deletions_count(path)
 
                     usedbytes = st['size']
                     vol_info_dict = get_pending_subvol_deletions_count(path)
-                    vol_info_dict['used_size'] = int(usedbytes)
+                    if human_readable:
+                        vol_info_dict['used_size'] = mgr_util.format_bytes(int(usedbytes), 5)
+                    else:
+                        vol_info_dict['used_size'] = int(usedbytes)
                 except cephfs.Error as e:
                     if e.args[0] == errno.ENOENT:
                         pass
                 except cephfs.Error as e:
                     if e.args[0] == errno.ENOENT:
                         pass
@@ -178,10 +183,16 @@ class VolumeClient(CephfsClient["Module"]):
                         pool_type = "metadata"
                     else:
                         pool_type = "data"
                         pool_type = "metadata"
                     else:
                         pool_type = "data"
-                    vol_info_dict["pools"][pool_type].append({
-                                    'name': pools[pool_id]['pool_name'],
-                                    'used': pool_stats[pool_id]['bytes_used'],
-                                    'avail': pool_stats[pool_id]['max_avail']})
+                    if human_readable:
+                        vol_info_dict["pools"][pool_type].append({
+                                        'name': pools[pool_id]['pool_name'],
+                                        'used': mgr_util.format_bytes(pool_stats[pool_id]['bytes_used'], 5),
+                                        'avail': mgr_util.format_bytes(pool_stats[pool_id]['max_avail'], 5)})
+                    else:
+                        vol_info_dict["pools"][pool_type].append({
+                                        'name': pools[pool_id]['pool_name'],
+                                        'used': pool_stats[pool_id]['bytes_used'],
+                                        'avail': pool_stats[pool_id]['max_avail']})
 
                 mon_addr_lst = []
                 mon_map_mons = self.mgr.get('mon_map')['mons']
 
                 mon_addr_lst = []
                 mon_map_mons = self.mgr.get('mon_map')['mons']
index 752dde33e3e6badbbffee67c03edd1ece9912f8d..b9c8e7893435934318aee3f8180f424bce813947 100644 (file)
@@ -70,7 +70,8 @@ class Module(orchestrator.OrchestratorClientMixin, MgrModule):
         },
         {
             'cmd': 'fs volume info '
         },
         {
             'cmd': 'fs volume info '
-                   'name=vol_name,type=CephString ',
+                   'name=vol_name,type=CephString '
+                   'name=human_readable,type=CephBool,req=false ',
             'desc': "Get the information of a CephFS volume",
             'perm': 'r'
         },
             'desc': "Get the information of a CephFS volume",
             'perm': 'r'
         },
@@ -555,7 +556,8 @@ class Module(orchestrator.OrchestratorClientMixin, MgrModule):
 
     @mgr_cmd_wrap
     def _cmd_fs_volume_info(self, inbuf, cmd):
 
     @mgr_cmd_wrap
     def _cmd_fs_volume_info(self, inbuf, cmd):
-        return self.vc.volume_info(vol_name=cmd['vol_name'])
+        return self.vc.volume_info(vol_name=cmd['vol_name'],
+                                   human_readable=cmd.get('human_readable', False))
 
     @mgr_cmd_wrap
     def _cmd_fs_subvolumegroup_create(self, inbuf, cmd):
 
     @mgr_cmd_wrap
     def _cmd_fs_subvolumegroup_create(self, inbuf, cmd):
index 9be03df108d6cc198e2e2e8a59b1e8763e28ea35..b8397ca2789d781eb0fb244c346bd887882f3d4d 100644 (file)
@@ -30,7 +30,7 @@ class DeviceSelection(object):
     ]
 
     def __init__(self,
     ]
 
     def __init__(self,
-                 paths=None,  # type: Optional[List[str]]
+                 paths=None,  # type: Optional[List[Dict[str, str]]]
                  model=None,  # type: Optional[str]
                  size=None,  # type: Optional[str]
                  rotational=None,  # type: Optional[bool]
                  model=None,  # type: Optional[str]
                  size=None,  # type: Optional[str]
                  rotational=None,  # type: Optional[bool]
@@ -42,7 +42,16 @@ class DeviceSelection(object):
         ephemeral drive group device specification
         """
         #: List of Device objects for devices paths.
         ephemeral drive group device specification
         """
         #: List of Device objects for devices paths.
-        self.paths = [] if paths is None else [Device(path) for path in paths]  # type: List[Device]
+
+        self.paths = []
+
+        if paths is not None:
+            for device in paths:
+                if isinstance(device, dict):
+                    path: str = device.get("path", '')
+                    self.paths.append(Device(path, crush_device_class=device.get("crush_device_class", None)))  # noqa E501
+                else:
+                    self.paths.append(Device(str(device)))
 
         #: A wildcard string. e.g: "SDD*" or "SanDisk SD8SN8U5"
         self.model = model
 
         #: A wildcard string. e.g: "SDD*" or "SanDisk SD8SN8U5"
         self.model = model
@@ -150,7 +159,7 @@ class DriveGroupSpec(ServiceSpec):
         "data_devices", "db_devices", "wal_devices", "journal_devices",
         "data_directories", "osds_per_device", "objectstore", "osd_id_claims",
         "journal_size", "unmanaged", "filter_logic", "preview_only", "extra_container_args",
         "data_devices", "db_devices", "wal_devices", "journal_devices",
         "data_directories", "osds_per_device", "objectstore", "osd_id_claims",
         "journal_size", "unmanaged", "filter_logic", "preview_only", "extra_container_args",
-        "data_allocate_fraction", "method", "crush_device_class", "config",
+        "extra_entrypoint_args", "data_allocate_fraction", "method", "crush_device_class", "config",
     ]
 
     def __init__(self,
     ]
 
     def __init__(self,
@@ -175,11 +184,12 @@ class DriveGroupSpec(ServiceSpec):
                  filter_logic='AND',  # type: str
                  preview_only=False,  # type: bool
                  extra_container_args=None,  # type: Optional[List[str]]
                  filter_logic='AND',  # type: str
                  preview_only=False,  # type: bool
                  extra_container_args=None,  # type: Optional[List[str]]
+                 extra_entrypoint_args: Optional[List[str]] = None,
                  data_allocate_fraction=None,  # type: Optional[float]
                  method=None,  # type: Optional[OSDMethod]
                  data_allocate_fraction=None,  # type: Optional[float]
                  method=None,  # type: Optional[OSDMethod]
-                 crush_device_class=None,  # type: Optional[str]
                  config=None,  # type: Optional[Dict[str, str]]
                  custom_configs=None,  # type: Optional[List[CustomConfig]]
                  config=None,  # type: Optional[Dict[str, str]]
                  custom_configs=None,  # type: Optional[List[CustomConfig]]
+                 crush_device_class=None,  # type: Optional[str]
                  ):
         assert service_type is None or service_type == 'osd'
         super(DriveGroupSpec, self).__init__('osd', service_id=service_id,
                  ):
         assert service_type is None or service_type == 'osd'
         super(DriveGroupSpec, self).__init__('osd', service_id=service_id,
@@ -188,6 +198,7 @@ class DriveGroupSpec(ServiceSpec):
                                              unmanaged=unmanaged,
                                              preview_only=preview_only,
                                              extra_container_args=extra_container_args,
                                              unmanaged=unmanaged,
                                              preview_only=preview_only,
                                              extra_container_args=extra_container_args,
+                                             extra_entrypoint_args=extra_entrypoint_args,
                                              custom_configs=custom_configs)
 
         #: A :class:`ceph.deployment.drive_group.DeviceSelection`
                                              custom_configs=custom_configs)
 
         #: A :class:`ceph.deployment.drive_group.DeviceSelection`
@@ -353,5 +364,10 @@ class DriveGroupSpec(ServiceSpec):
                 self.service_id,
                 'method raw only supports bluestore')
 
                 self.service_id,
                 'method raw only supports bluestore')
 
+        if self.data_devices.paths is not None:
+            for device in list(self.data_devices.paths):
+                if not device.path:
+                    raise DriveGroupValidationError(self.service_id, 'Device path cannot be empty')  # noqa E501
+
 
 yaml.add_representer(DriveGroupSpec, DriveGroupSpec.yaml_representer)
 
 yaml.add_representer(DriveGroupSpec, DriveGroupSpec.yaml_representer)
index 8203796659b3cad5bcf06e15269c13a2329a82f2..f423c2f43eea86dd4025a4232fa065276d41cdd5 100644 (file)
@@ -175,9 +175,9 @@ class SizeMatcher(Matcher):
     """
 
     SUFFIXES = (
     """
 
     SUFFIXES = (
-        ["MB", "GB", "TB"],
-        ["M", "G", "T"],
-        [1e+6, 1e+9, 1e+12]
+        ["KB", "MB", "GB", "TB"],
+        ["K", "M", "G", "T"],
+        [1e+3, 1e+6, 1e+9, 1e+12]
     )
 
     supported_suffixes = SUFFIXES[0] + SUFFIXES[1]
     )
 
     supported_suffixes = SUFFIXES[0] + SUFFIXES[1]
index 07b0549f3a201f726b44eb7e4998e6c510efd248..d6556dd2c0a557c73d231bf8147093f7dc44a401 100644 (file)
@@ -128,6 +128,17 @@ class DriveSelection(object):
                 )
                 continue
 
                 )
                 continue
 
+            if not disk.available and disk.ceph_device and disk.lvs:
+                other_osdspec_affinity = ''
+                for lv in disk.lvs:
+                    if lv['osdspec_affinity'] != self.spec.service_id:
+                        other_osdspec_affinity = lv['osdspec_affinity']
+                        break
+                if other_osdspec_affinity:
+                    logger.debug("{} is already used in spec {}, "
+                                 "skipping it.".format(disk.path, other_osdspec_affinity))
+                    continue
+
             if not self._has_mandatory_idents(disk):
                 logger.debug(
                     "Ignoring disk {}. Missing mandatory idents".format(
             if not self._has_mandatory_idents(disk):
                 logger.debug(
                     "Ignoring disk {}. Missing mandatory idents".format(
index cb7e4de34842484f3ce444c22638fe92d2c6cfcd..0c448bf1313bc6421ff82e5f7b2d712f9bd9ca0e 100644 (file)
@@ -129,7 +129,9 @@ class HostSpec(object):
 
     def __eq__(self, other: Any) -> bool:
         # Let's omit `status` for the moment, as it is still the very same host.
 
     def __eq__(self, other: Any) -> bool:
         # Let's omit `status` for the moment, as it is still the very same host.
+        if not isinstance(other, HostSpec):
+            return NotImplemented
         return self.hostname == other.hostname and \
         return self.hostname == other.hostname and \
-               self.addr == other.addr and \
-               sorted(self.labels) == sorted(other.labels) and \
-               self.location == other.location
+            self.addr == other.addr and \
+            sorted(self.labels) == sorted(other.labels) and \
+            self.location == other.location
index 570c1dbb3615e0cd41ac24e7a08ac12ee35bea1f..a3023882108e38ef2cd296e461c23ed5b3a9b851 100644 (file)
@@ -15,7 +15,8 @@ class Devices(object):
 
     def __init__(self, devices):
         # type: (List[Device]) -> None
 
     def __init__(self, devices):
         # type: (List[Device]) -> None
-        self.devices = devices  # type: List[Device]
+        # sort devices by path name so ordering is consistent
+        self.devices: List[Device] = sorted(devices, key=lambda d: d.path if d.path else '')
 
     def __eq__(self, other: Any) -> bool:
         if not isinstance(other, Devices):
 
     def __eq__(self, other: Any) -> bool:
         if not isinstance(other, Devices):
@@ -53,6 +54,7 @@ class Device(object):
         'human_readable_type',
         'device_id',
         'lsm_data',
         'human_readable_type',
         'device_id',
         'lsm_data',
+        'crush_device_class'
     ]
 
     def __init__(self,
     ]
 
     def __init__(self,
@@ -60,12 +62,14 @@ class Device(object):
                  sys_api=None,  # type: Optional[Dict[str, Any]]
                  available=None,  # type: Optional[bool]
                  rejected_reasons=None,  # type: Optional[List[str]]
                  sys_api=None,  # type: Optional[Dict[str, Any]]
                  available=None,  # type: Optional[bool]
                  rejected_reasons=None,  # type: Optional[List[str]]
-                 lvs=None,  # type: Optional[List[str]]
+                 lvs=None,  # type: Optional[List[Dict[str, str]]]
                  device_id=None,  # type: Optional[str]
                  lsm_data=None,  # type: Optional[Dict[str, Dict[str, str]]]
                  created=None,  # type: Optional[datetime.datetime]
                  device_id=None,  # type: Optional[str]
                  lsm_data=None,  # type: Optional[Dict[str, Dict[str, str]]]
                  created=None,  # type: Optional[datetime.datetime]
-                 ceph_device=None  # type: Optional[bool]
+                 ceph_device=None,  # type: Optional[bool]
+                 crush_device_class=None  # type: Optional[str]
                  ):
                  ):
+
         self.path = path
         self.sys_api = sys_api if sys_api is not None else {}  # type: Dict[str, Any]
         self.available = available
         self.path = path
         self.sys_api = sys_api if sys_api is not None else {}  # type: Dict[str, Any]
         self.available = available
@@ -75,6 +79,7 @@ class Device(object):
         self.lsm_data = lsm_data if lsm_data is not None else {}  # type: Dict[str, Dict[str, str]]
         self.created = created if created is not None else datetime_now()
         self.ceph_device = ceph_device
         self.lsm_data = lsm_data if lsm_data is not None else {}  # type: Dict[str, Dict[str, str]]
         self.created = created if created is not None else datetime_now()
         self.ceph_device = ceph_device
+        self.crush_device_class = crush_device_class
 
     def __eq__(self, other):
         # type: (Any) -> bool
 
     def __eq__(self, other):
         # type: (Any) -> bool
@@ -119,11 +124,12 @@ class Device(object):
         return 'hdd' if self.sys_api["rotational"] == "1" else 'ssd'
 
     def __repr__(self) -> str:
         return 'hdd' if self.sys_api["rotational"] == "1" else 'ssd'
 
     def __repr__(self) -> str:
-        device_desc: Dict[str, Union[str, List[str]]] = {
+        device_desc: Dict[str, Union[str, List[str], List[Dict[str, str]]]] = {
             'path': self.path if self.path is not None else 'unknown',
             'lvs': self.lvs if self.lvs else 'None',
             'available': str(self.available),
             'path': self.path if self.path is not None else 'unknown',
             'lvs': self.lvs if self.lvs else 'None',
             'available': str(self.available),
-            'ceph_device': str(self.ceph_device)
+            'ceph_device': str(self.ceph_device),
+            'crush_device_class': str(self.crush_device_class)
         }
         if not self.available and self.rejected_reasons:
             device_desc['rejection reasons'] = self.rejected_reasons
         }
         if not self.available and self.rejected_reasons:
             device_desc['rejection reasons'] = self.rejected_reasons
index 72f3efa2e9132446cb3bd8811312d0f4c2974852..70757304ad9ebb75c6882ff7317e00e1a372724f 100644 (file)
@@ -498,7 +498,7 @@ class ServiceSpec(object):
     """
     KNOWN_SERVICE_TYPES = 'alertmanager crash grafana iscsi loki promtail mds mgr mon nfs ' \
                           'node-exporter osd prometheus rbd-mirror rgw agent ' \
     """
     KNOWN_SERVICE_TYPES = 'alertmanager crash grafana iscsi loki promtail mds mgr mon nfs ' \
                           'node-exporter osd prometheus rbd-mirror rgw agent ' \
-                          'container ingress cephfs-mirror snmp-gateway'.split()
+                          'container ingress cephfs-mirror snmp-gateway ceph-exporter'.split()
     REQUIRES_SERVICE_ID = 'iscsi mds nfs rgw container ingress '.split()
     MANAGED_CONFIG_OPTIONS = [
         'mds_join_fs',
     REQUIRES_SERVICE_ID = 'iscsi mds nfs rgw container ingress '.split()
     MANAGED_CONFIG_OPTIONS = [
         'mds_join_fs',
@@ -519,7 +519,8 @@ class ServiceSpec(object):
             'container': CustomContainerSpec,
             'grafana': GrafanaSpec,
             'node-exporter': MonitoringSpec,
             'container': CustomContainerSpec,
             'grafana': GrafanaSpec,
             'node-exporter': MonitoringSpec,
-            'prometheus': MonitoringSpec,
+            'ceph-exporter': CephExporterSpec,
+            'prometheus': PrometheusSpec,
             'loki': MonitoringSpec,
             'promtail': MonitoringSpec,
             'snmp-gateway': SNMPGatewaySpec,
             'loki': MonitoringSpec,
             'promtail': MonitoringSpec,
             'snmp-gateway': SNMPGatewaySpec,
@@ -553,6 +554,7 @@ class ServiceSpec(object):
                  preview_only: bool = False,
                  networks: Optional[List[str]] = None,
                  extra_container_args: Optional[List[str]] = None,
                  preview_only: bool = False,
                  networks: Optional[List[str]] = None,
                  extra_container_args: Optional[List[str]] = None,
+                 extra_entrypoint_args: Optional[List[str]] = None,
                  custom_configs: Optional[List[CustomConfig]] = None,
                  ):
 
                  custom_configs: Optional[List[CustomConfig]] = None,
                  ):
 
@@ -593,6 +595,7 @@ class ServiceSpec(object):
             self.config = {k.replace(' ', '_'): v for k, v in config.items()}
 
         self.extra_container_args: Optional[List[str]] = extra_container_args
             self.config = {k.replace(' ', '_'): v for k, v in config.items()}
 
         self.extra_container_args: Optional[List[str]] = extra_container_args
+        self.extra_entrypoint_args: Optional[List[str]] = extra_entrypoint_args
         self.custom_configs: Optional[List[CustomConfig]] = custom_configs
 
     @classmethod
         self.custom_configs: Optional[List[CustomConfig]] = custom_configs
 
     @classmethod
@@ -721,6 +724,8 @@ class ServiceSpec(object):
             ret['networks'] = self.networks
         if self.extra_container_args:
             ret['extra_container_args'] = self.extra_container_args
             ret['networks'] = self.networks
         if self.extra_container_args:
             ret['extra_container_args'] = self.extra_container_args
+        if self.extra_entrypoint_args:
+            ret['extra_entrypoint_args'] = self.extra_entrypoint_args
         if self.custom_configs:
             ret['custom_configs'] = [c.to_json() for c in self.custom_configs]
 
         if self.custom_configs:
             ret['custom_configs'] = [c.to_json() for c in self.custom_configs]
 
@@ -799,6 +804,7 @@ class NFSServiceSpec(ServiceSpec):
                  networks: Optional[List[str]] = None,
                  port: Optional[int] = None,
                  extra_container_args: Optional[List[str]] = None,
                  networks: Optional[List[str]] = None,
                  port: Optional[int] = None,
                  extra_container_args: Optional[List[str]] = None,
+                 extra_entrypoint_args: Optional[List[str]] = None,
                  custom_configs: Optional[List[CustomConfig]] = None,
                  ):
         assert service_type == 'nfs'
                  custom_configs: Optional[List[CustomConfig]] = None,
                  ):
         assert service_type == 'nfs'
@@ -806,7 +812,7 @@ class NFSServiceSpec(ServiceSpec):
             'nfs', service_id=service_id,
             placement=placement, unmanaged=unmanaged, preview_only=preview_only,
             config=config, networks=networks, extra_container_args=extra_container_args,
             'nfs', service_id=service_id,
             placement=placement, unmanaged=unmanaged, preview_only=preview_only,
             config=config, networks=networks, extra_container_args=extra_container_args,
-            custom_configs=custom_configs)
+            extra_entrypoint_args=extra_entrypoint_args, custom_configs=custom_configs)
 
         self.port = port
 
 
         self.port = port
 
@@ -864,6 +870,7 @@ class RGWSpec(ServiceSpec):
                  networks: Optional[List[str]] = None,
                  subcluster: Optional[str] = None,  # legacy, only for from_json on upgrade
                  extra_container_args: Optional[List[str]] = None,
                  networks: Optional[List[str]] = None,
                  subcluster: Optional[str] = None,  # legacy, only for from_json on upgrade
                  extra_container_args: Optional[List[str]] = None,
+                 extra_entrypoint_args: Optional[List[str]] = None,
                  custom_configs: Optional[List[CustomConfig]] = None,
                  ):
         assert service_type == 'rgw', service_type
                  custom_configs: Optional[List[CustomConfig]] = None,
                  ):
         assert service_type == 'rgw', service_type
@@ -876,7 +883,8 @@ class RGWSpec(ServiceSpec):
             'rgw', service_id=service_id,
             placement=placement, unmanaged=unmanaged,
             preview_only=preview_only, config=config, networks=networks,
             'rgw', service_id=service_id,
             placement=placement, unmanaged=unmanaged,
             preview_only=preview_only, config=config, networks=networks,
-            extra_container_args=extra_container_args, custom_configs=custom_configs)
+            extra_container_args=extra_container_args, extra_entrypoint_args=extra_entrypoint_args,
+            custom_configs=custom_configs)
 
         #: The RGW realm associated with this service. Needs to be manually created
         self.rgw_realm: Optional[str] = rgw_realm
 
         #: The RGW realm associated with this service. Needs to be manually created
         self.rgw_realm: Optional[str] = rgw_realm
@@ -922,9 +930,9 @@ class IscsiServiceSpec(ServiceSpec):
                  service_id: Optional[str] = None,
                  pool: Optional[str] = None,
                  trusted_ip_list: Optional[str] = None,
                  service_id: Optional[str] = None,
                  pool: Optional[str] = None,
                  trusted_ip_list: Optional[str] = None,
-                 api_port: Optional[int] = None,
-                 api_user: Optional[str] = None,
-                 api_password: Optional[str] = None,
+                 api_port: Optional[int] = 5000,
+                 api_user: Optional[str] = 'admin',
+                 api_password: Optional[str] = 'admin',
                  api_secure: Optional[bool] = None,
                  ssl_cert: Optional[str] = None,
                  ssl_key: Optional[str] = None,
                  api_secure: Optional[bool] = None,
                  ssl_cert: Optional[str] = None,
                  ssl_key: Optional[str] = None,
@@ -934,6 +942,7 @@ class IscsiServiceSpec(ServiceSpec):
                  config: Optional[Dict[str, str]] = None,
                  networks: Optional[List[str]] = None,
                  extra_container_args: Optional[List[str]] = None,
                  config: Optional[Dict[str, str]] = None,
                  networks: Optional[List[str]] = None,
                  extra_container_args: Optional[List[str]] = None,
+                 extra_entrypoint_args: Optional[List[str]] = None,
                  custom_configs: Optional[List[CustomConfig]] = None,
                  ):
         assert service_type == 'iscsi'
                  custom_configs: Optional[List[CustomConfig]] = None,
                  ):
         assert service_type == 'iscsi'
@@ -942,6 +951,7 @@ class IscsiServiceSpec(ServiceSpec):
                                                preview_only=preview_only,
                                                config=config, networks=networks,
                                                extra_container_args=extra_container_args,
                                                preview_only=preview_only,
                                                config=config, networks=networks,
                                                extra_container_args=extra_container_args,
+                                               extra_entrypoint_args=extra_entrypoint_args,
                                                custom_configs=custom_configs)
 
         #: RADOS pool where ceph-iscsi config data is stored.
                                                custom_configs=custom_configs)
 
         #: RADOS pool where ceph-iscsi config data is stored.
@@ -964,6 +974,9 @@ class IscsiServiceSpec(ServiceSpec):
         if not self.api_secure and self.ssl_cert and self.ssl_key:
             self.api_secure = True
 
         if not self.api_secure and self.ssl_cert and self.ssl_key:
             self.api_secure = True
 
+    def get_port_start(self) -> List[int]:
+        return [self.api_port or 5000]
+
     def validate(self) -> None:
         super(IscsiServiceSpec, self).validate()
 
     def validate(self) -> None:
         super(IscsiServiceSpec, self).validate()
 
@@ -1006,6 +1019,7 @@ class IngressSpec(ServiceSpec):
                  unmanaged: bool = False,
                  ssl: bool = False,
                  extra_container_args: Optional[List[str]] = None,
                  unmanaged: bool = False,
                  ssl: bool = False,
                  extra_container_args: Optional[List[str]] = None,
+                 extra_entrypoint_args: Optional[List[str]] = None,
                  custom_configs: Optional[List[CustomConfig]] = None,
                  ):
         assert service_type == 'ingress'
                  custom_configs: Optional[List[CustomConfig]] = None,
                  ):
         assert service_type == 'ingress'
@@ -1015,6 +1029,7 @@ class IngressSpec(ServiceSpec):
             placement=placement, config=config,
             networks=networks,
             extra_container_args=extra_container_args,
             placement=placement, config=config,
             networks=networks,
             extra_container_args=extra_container_args,
+            extra_entrypoint_args=extra_entrypoint_args,
             custom_configs=custom_configs
         )
         self.backend_service = backend_service
             custom_configs=custom_configs
         )
         self.backend_service = backend_service
@@ -1075,10 +1090,11 @@ class CustomContainerSpec(ServiceSpec):
                  preview_only: bool = False,
                  image: Optional[str] = None,
                  entrypoint: Optional[str] = None,
                  preview_only: bool = False,
                  image: Optional[str] = None,
                  entrypoint: Optional[str] = None,
+                 extra_entrypoint_args: Optional[List[str]] = None,
                  uid: Optional[int] = None,
                  gid: Optional[int] = None,
                  volume_mounts: Optional[Dict[str, str]] = {},
                  uid: Optional[int] = None,
                  gid: Optional[int] = None,
                  volume_mounts: Optional[Dict[str, str]] = {},
-                 args: Optional[List[str]] = [],
+                 args: Optional[List[str]] = [],  # args for the container runtime, not entrypoint
                  envs: Optional[List[str]] = [],
                  privileged: Optional[bool] = False,
                  bind_mounts: Optional[List[List[str]]] = None,
                  envs: Optional[List[str]] = [],
                  privileged: Optional[bool] = False,
                  bind_mounts: Optional[List[List[str]]] = None,
@@ -1094,7 +1110,7 @@ class CustomContainerSpec(ServiceSpec):
             service_type, service_id,
             placement=placement, unmanaged=unmanaged,
             preview_only=preview_only, config=config,
             service_type, service_id,
             placement=placement, unmanaged=unmanaged,
             preview_only=preview_only, config=config,
-            networks=networks)
+            networks=networks, extra_entrypoint_args=extra_entrypoint_args)
 
         self.image = image
         self.entrypoint = entrypoint
 
         self.image = image
         self.entrypoint = entrypoint
@@ -1142,6 +1158,7 @@ class MonitoringSpec(ServiceSpec):
                  preview_only: bool = False,
                  port: Optional[int] = None,
                  extra_container_args: Optional[List[str]] = None,
                  preview_only: bool = False,
                  port: Optional[int] = None,
                  extra_container_args: Optional[List[str]] = None,
+                 extra_entrypoint_args: Optional[List[str]] = None,
                  custom_configs: Optional[List[CustomConfig]] = None,
                  ):
         assert service_type in ['grafana', 'node-exporter', 'prometheus', 'alertmanager',
                  custom_configs: Optional[List[CustomConfig]] = None,
                  ):
         assert service_type in ['grafana', 'node-exporter', 'prometheus', 'alertmanager',
@@ -1152,6 +1169,7 @@ class MonitoringSpec(ServiceSpec):
             placement=placement, unmanaged=unmanaged,
             preview_only=preview_only, config=config,
             networks=networks, extra_container_args=extra_container_args,
             placement=placement, unmanaged=unmanaged,
             preview_only=preview_only, config=config,
             networks=networks, extra_container_args=extra_container_args,
+            extra_entrypoint_args=extra_entrypoint_args,
             custom_configs=custom_configs)
 
         self.service_type = service_type
             custom_configs=custom_configs)
 
         self.service_type = service_type
@@ -1188,6 +1206,7 @@ class AlertManagerSpec(MonitoringSpec):
                  port: Optional[int] = None,
                  secure: bool = False,
                  extra_container_args: Optional[List[str]] = None,
                  port: Optional[int] = None,
                  secure: bool = False,
                  extra_container_args: Optional[List[str]] = None,
+                 extra_entrypoint_args: Optional[List[str]] = None,
                  custom_configs: Optional[List[CustomConfig]] = None,
                  ):
         assert service_type == 'alertmanager'
                  custom_configs: Optional[List[CustomConfig]] = None,
                  ):
         assert service_type == 'alertmanager'
@@ -1195,7 +1214,8 @@ class AlertManagerSpec(MonitoringSpec):
             'alertmanager', service_id=service_id,
             placement=placement, unmanaged=unmanaged,
             preview_only=preview_only, config=config, networks=networks, port=port,
             'alertmanager', service_id=service_id,
             placement=placement, unmanaged=unmanaged,
             preview_only=preview_only, config=config, networks=networks, port=port,
-            extra_container_args=extra_container_args, custom_configs=custom_configs)
+            extra_container_args=extra_container_args, extra_entrypoint_args=extra_entrypoint_args,
+            custom_configs=custom_configs)
 
         # Custom configuration.
         #
 
         # Custom configuration.
         #
@@ -1240,6 +1260,7 @@ class GrafanaSpec(MonitoringSpec):
                  port: Optional[int] = None,
                  initial_admin_password: Optional[str] = None,
                  extra_container_args: Optional[List[str]] = None,
                  port: Optional[int] = None,
                  initial_admin_password: Optional[str] = None,
                  extra_container_args: Optional[List[str]] = None,
+                 extra_entrypoint_args: Optional[List[str]] = None,
                  custom_configs: Optional[List[CustomConfig]] = None,
                  ):
         assert service_type == 'grafana'
                  custom_configs: Optional[List[CustomConfig]] = None,
                  ):
         assert service_type == 'grafana'
@@ -1247,7 +1268,8 @@ class GrafanaSpec(MonitoringSpec):
             'grafana', service_id=service_id,
             placement=placement, unmanaged=unmanaged,
             preview_only=preview_only, config=config, networks=networks, port=port,
             'grafana', service_id=service_id,
             placement=placement, unmanaged=unmanaged,
             preview_only=preview_only, config=config, networks=networks, port=port,
-            extra_container_args=extra_container_args, custom_configs=custom_configs)
+            extra_container_args=extra_container_args, extra_entrypoint_args=extra_entrypoint_args,
+            custom_configs=custom_configs)
 
         self.initial_admin_password = initial_admin_password
 
 
         self.initial_admin_password = initial_admin_password
 
@@ -1255,6 +1277,37 @@ class GrafanaSpec(MonitoringSpec):
 yaml.add_representer(GrafanaSpec, ServiceSpec.yaml_representer)
 
 
 yaml.add_representer(GrafanaSpec, ServiceSpec.yaml_representer)
 
 
+class PrometheusSpec(MonitoringSpec):
+    def __init__(self,
+                 service_type: str = 'prometheus',
+                 service_id: Optional[str] = None,
+                 placement: Optional[PlacementSpec] = None,
+                 unmanaged: bool = False,
+                 preview_only: bool = False,
+                 config: Optional[Dict[str, str]] = None,
+                 networks: Optional[List[str]] = None,
+                 port: Optional[int] = None,
+                 retention_time: Optional[str] = None,
+                 retention_size: Optional[str] = None,
+                 extra_container_args: Optional[List[str]] = None,
+                 extra_entrypoint_args: Optional[List[str]] = None,
+                 custom_configs: Optional[List[CustomConfig]] = None,
+                 ):
+        assert service_type == 'prometheus'
+        super(PrometheusSpec, self).__init__(
+            'prometheus', service_id=service_id,
+            placement=placement, unmanaged=unmanaged,
+            preview_only=preview_only, config=config, networks=networks, port=port,
+            extra_container_args=extra_container_args, extra_entrypoint_args=extra_entrypoint_args,
+            custom_configs=custom_configs)
+
+        self.retention_time = retention_time.strip() if retention_time else None
+        self.retention_size = retention_size.strip() if retention_size else None
+
+
+yaml.add_representer(PrometheusSpec, ServiceSpec.yaml_representer)
+
+
 class SNMPGatewaySpec(ServiceSpec):
     class SNMPVersion(str, enum.Enum):
         V2c = 'V2c'
 class SNMPGatewaySpec(ServiceSpec):
     class SNMPVersion(str, enum.Enum):
         V2c = 'V2c'
@@ -1295,6 +1348,7 @@ class SNMPGatewaySpec(ServiceSpec):
                  preview_only: bool = False,
                  port: Optional[int] = None,
                  extra_container_args: Optional[List[str]] = None,
                  preview_only: bool = False,
                  port: Optional[int] = None,
                  extra_container_args: Optional[List[str]] = None,
+                 extra_entrypoint_args: Optional[List[str]] = None,
                  custom_configs: Optional[List[CustomConfig]] = None,
                  ):
         assert service_type == 'snmp-gateway'
                  custom_configs: Optional[List[CustomConfig]] = None,
                  ):
         assert service_type == 'snmp-gateway'
@@ -1305,6 +1359,7 @@ class SNMPGatewaySpec(ServiceSpec):
             unmanaged=unmanaged,
             preview_only=preview_only,
             extra_container_args=extra_container_args,
             unmanaged=unmanaged,
             preview_only=preview_only,
             extra_container_args=extra_container_args,
+            extra_entrypoint_args=extra_entrypoint_args,
             custom_configs=custom_configs)
 
         self.service_type = service_type
             custom_configs=custom_configs)
 
         self.service_type = service_type
@@ -1416,6 +1471,7 @@ class MDSSpec(ServiceSpec):
                  unmanaged: bool = False,
                  preview_only: bool = False,
                  extra_container_args: Optional[List[str]] = None,
                  unmanaged: bool = False,
                  preview_only: bool = False,
                  extra_container_args: Optional[List[str]] = None,
+                 extra_entrypoint_args: Optional[List[str]] = None,
                  custom_configs: Optional[List[CustomConfig]] = None,
                  ):
         assert service_type == 'mds'
                  custom_configs: Optional[List[CustomConfig]] = None,
                  ):
         assert service_type == 'mds'
@@ -1425,6 +1481,7 @@ class MDSSpec(ServiceSpec):
                                       unmanaged=unmanaged,
                                       preview_only=preview_only,
                                       extra_container_args=extra_container_args,
                                       unmanaged=unmanaged,
                                       preview_only=preview_only,
                                       extra_container_args=extra_container_args,
+                                      extra_entrypoint_args=extra_entrypoint_args,
                                       custom_configs=custom_configs)
 
     def validate(self) -> None:
                                       custom_configs=custom_configs)
 
     def validate(self) -> None:
@@ -1487,3 +1544,46 @@ class TunedProfileSpec():
         # for making deep copies so you can edit the settings in one without affecting the other
         # mostly for testing purposes
         return TunedProfileSpec(self.profile_name, self.placement, self.settings.copy())
         # for making deep copies so you can edit the settings in one without affecting the other
         # mostly for testing purposes
         return TunedProfileSpec(self.profile_name, self.placement, self.settings.copy())
+
+
+class CephExporterSpec(ServiceSpec):
+    def __init__(self,
+                 service_type: str = 'ceph-exporter',
+                 sock_dir: Optional[str] = None,
+                 addrs: str = '',
+                 port: Optional[int] = None,
+                 prio_limit: Optional[int] = 5,
+                 stats_period: Optional[int] = 5,
+                 placement: Optional[PlacementSpec] = None,
+                 unmanaged: bool = False,
+                 preview_only: bool = False,
+                 extra_container_args: Optional[List[str]] = None,
+                 ):
+        assert service_type == 'ceph-exporter'
+
+        super(CephExporterSpec, self).__init__(
+            service_type,
+            placement=placement,
+            unmanaged=unmanaged,
+            preview_only=preview_only,
+            extra_container_args=extra_container_args)
+
+        self.service_type = service_type
+        self.sock_dir = sock_dir
+        self.addrs = addrs
+        self.port = port
+        self.prio_limit = prio_limit
+        self.stats_period = stats_period
+
+    def validate(self) -> None:
+        super(CephExporterSpec, self).validate()
+
+        if not isinstance(self.prio_limit, int):
+            raise SpecValidationError(
+                    f'prio_limit must be an integer. Got {type(self.prio_limit)}')
+        if not isinstance(self.stats_period, int):
+            raise SpecValidationError(
+                    f'stats_period must be an integer. Got {type(self.stats_period)}')
+
+
+yaml.add_representer(CephExporterSpec, ServiceSpec.yaml_representer)
index 2d373732c04f1fb44881901aa0e8aaae842c025e..0f404af305b103e6ad14649027bc6b73a9698169 100644 (file)
@@ -1,7 +1,7 @@
 import logging
 
 try:
 import logging
 
 try:
-    from typing import Optional, List
+    from typing import Optional, List, Dict
 except ImportError:
     pass
 
 except ImportError:
     pass
 
@@ -13,6 +13,10 @@ logger = logging.getLogger(__name__)
 # TODO refactor this to a DriveSelection method
 class to_ceph_volume(object):
 
 # TODO refactor this to a DriveSelection method
 class to_ceph_volume(object):
 
+    _supported_device_classes = [
+        "hdd", "ssd", "nvme"
+    ]
+
     def __init__(self,
                  selection,  # type: DriveSelection
                  osd_id_claims=None,  # type: Optional[List[str]]
     def __init__(self,
                  selection,  # type: DriveSelection
                  osd_id_claims=None,  # type: Optional[List[str]]
@@ -24,73 +28,161 @@ class to_ceph_volume(object):
         self.preview = preview
         self.osd_id_claims = osd_id_claims
 
         self.preview = preview
         self.osd_id_claims = osd_id_claims
 
+    def prepare_devices(self):
+
+        # type: () -> Dict[str, List[str]]
+
+        lvcount: Dict[str, List[str]] = dict()
+
+        """
+        Default entry for the global crush_device_class definition;
+        if there's no global definition at spec level, we do not want
+        to apply anything to the provided devices, hence we need to run
+        a ceph-volume command without that option, otherwise we init an
+        entry for the globally defined crush_device_class.
+        """
+        if self.spec.crush_device_class:
+            lvcount[self.spec.crush_device_class] = []
+
+        # entry where the drives that don't require a crush_device_class
+        # option are collected
+        lvcount["no_crush"] = []
+
+        """
+        for each device, check if it's just a path or it has a crush_device
+        class definition, and append an entry to the right crush_device_
+        class group
+        """
+        for device in self.selection.data_devices():
+            # iterate on List[Device], containing both path and
+            # crush_device_class
+            path = device.path
+            crush_device_class = device.crush_device_class
+
+            if path is None:
+                raise ValueError("Device path can't be empty")
+
+            """
+            if crush_device_class is specified for the current Device path
+            we should either init the array for this group or append the
+            drive path to the existing entry
+            """
+            if crush_device_class:
+                if crush_device_class in lvcount.keys():
+                    lvcount[crush_device_class].append(path)
+                else:
+                    lvcount[crush_device_class] = [path]
+                continue
+
+            """
+            if no crush_device_class is specified for the current path
+            but a global definition is present in the spec, so we group
+            the drives together
+            """
+            if crush_device_class is None and self.spec.crush_device_class:
+                lvcount[self.spec.crush_device_class].append(path)
+                continue
+            else:
+                # default use case
+                lvcount["no_crush"].append(path)
+                continue
+
+        return lvcount
+
     def run(self):
         # type: () -> List[str]
         """ Generate ceph-volume commands based on the DriveGroup filters """
     def run(self):
         # type: () -> List[str]
         """ Generate ceph-volume commands based on the DriveGroup filters """
-        data_devices = [x.path for x in self.selection.data_devices()]
+
         db_devices = [x.path for x in self.selection.db_devices()]
         wal_devices = [x.path for x in self.selection.wal_devices()]
         journal_devices = [x.path for x in self.selection.journal_devices()]
 
         db_devices = [x.path for x in self.selection.db_devices()]
         wal_devices = [x.path for x in self.selection.wal_devices()]
         journal_devices = [x.path for x in self.selection.journal_devices()]
 
-        if not data_devices:
+        if not self.selection.data_devices():
             return []
 
         cmds: List[str] = []
             return []
 
         cmds: List[str] = []
-        if self.spec.method == 'raw':
-            assert self.spec.objectstore == 'bluestore'
-            # ceph-volume raw prepare only support 1:1 ratio of data to db/wal devices
-            if data_devices and db_devices:
-                if len(data_devices) != len(db_devices):
-                    raise ValueError('Number of data devices must match number of '
-                                     'db devices for raw mode osds')
-            if data_devices and wal_devices:
-                if len(data_devices) != len(wal_devices):
-                    raise ValueError('Number of data devices must match number of '
-                                     'wal devices for raw mode osds')
-            # for raw prepare each data device needs its own prepare command
-            dev_counter = 0
-            while dev_counter < len(data_devices):
-                cmd = "raw prepare --bluestore"
-                cmd += " --data {}".format(data_devices[dev_counter])
-                if db_devices:
-                    cmd += " --block.db {}".format(db_devices[dev_counter])
-                if wal_devices:
-                    cmd += " --block.wal {}".format(wal_devices[dev_counter])
-                cmds.append(cmd)
-                dev_counter += 1
-
-        elif self.spec.objectstore == 'filestore':
+
+        devices = self.prepare_devices()
+        # get the total number of devices provided by the Dict[str, List[str]]
+        devices_count = len(sum(list(devices.values()), []))
+
+        if devices and db_devices:
+            if (devices_count != len(db_devices)) and (self.spec.method == 'raw'):
+                raise ValueError('Number of data devices must match number of '
+                                 'db devices for raw mode osds')
+
+        if devices and wal_devices:
+            if (devices_count != len(wal_devices)) and (self.spec.method == 'raw'):
+                raise ValueError('Number of data devices must match number of '
+                                 'wal devices for raw mode osds')
+
+        # For this use case we don't apply any custom crush_device_classes
+        # Note that filestore is not supported anymore by the DriveGroupSpec
+        if self.spec.objectstore == 'filestore':
             # for lvm batch we can just do all devices in one command
             # for lvm batch we can just do all devices in one command
+            devs: List = sum(list(devices.values()), [])
+
             cmd = "lvm batch --no-auto"
 
             cmd = "lvm batch --no-auto"
 
-            cmd += " {}".format(" ".join(data_devices))
+            cmd += " {}".format(" ".join(devs))
 
             if self.spec.journal_size:
                 cmd += " --journal-size {}".format(self.spec.journal_size)
 
             if journal_devices:
                 cmd += " --journal-devices {}".format(
 
             if self.spec.journal_size:
                 cmd += " --journal-size {}".format(self.spec.journal_size)
 
             if journal_devices:
                 cmd += " --journal-devices {}".format(
-                    ' '.join(journal_devices))
+                        ' '.join(journal_devices))
 
             cmd += " --filestore"
             cmds.append(cmd)
 
             cmd += " --filestore"
             cmds.append(cmd)
-
-        elif self.spec.objectstore == 'bluestore':
-            # for lvm batch we can just do all devices in one command
-            cmd = "lvm batch --no-auto {}".format(" ".join(data_devices))
-
-            if db_devices:
-                cmd += " --db-devices {}".format(" ".join(db_devices))
-
-            if wal_devices:
-                cmd += " --wal-devices {}".format(" ".join(wal_devices))
-
-            if self.spec.block_wal_size:
-                cmd += " --block-wal-size {}".format(self.spec.block_wal_size)
-
-            if self.spec.block_db_size:
-                cmd += " --block-db-size {}".format(self.spec.block_db_size)
-            cmds.append(cmd)
+        else:
+            for d in devices.keys():
+                data_devices: Optional[List[str]] = devices.get(d)
+                if not data_devices:
+                    continue
+
+                if self.spec.method == 'raw':
+                    assert self.spec.objectstore == 'bluestore'
+                    # ceph-volume raw prepare only support 1:1 ratio of data to db/wal devices
+                    # for raw prepare each data device needs its own prepare command
+                    dev_counter = 0
+                    # reversing the lists as we're assigning db_devices sequentially
+                    db_devices.reverse()
+                    wal_devices.reverse()
+
+                    while dev_counter < len(data_devices):
+                        cmd = "raw prepare --bluestore"
+                        cmd += " --data {}".format(data_devices[dev_counter])
+                        if db_devices:
+                            cmd += " --block.db {}".format(db_devices.pop())
+                        if wal_devices:
+                            cmd += " --block.wal {}".format(wal_devices.pop())
+                        if d in self._supported_device_classes:
+                            cmd += " --crush-device-class {}".format(d)
+
+                        cmds.append(cmd)
+                        dev_counter += 1
+
+                elif self.spec.objectstore == 'bluestore':
+                    # for lvm batch we can just do all devices in one command
+
+                    cmd = "lvm batch --no-auto {}".format(" ".join(data_devices))
+
+                    if db_devices:
+                        cmd += " --db-devices {}".format(" ".join(db_devices))
+
+                    if wal_devices:
+                        cmd += " --wal-devices {}".format(" ".join(wal_devices))
+
+                    if self.spec.block_wal_size:
+                        cmd += " --block-wal-size {}".format(self.spec.block_wal_size)
+
+                    if self.spec.block_db_size:
+                        cmd += " --block-db-size {}".format(self.spec.block_db_size)
+
+                    if d in self._supported_device_classes:
+                        cmd += " --crush-device-class {}".format(d)
+                    cmds.append(cmd)
 
         for i in range(len(cmds)):
             if self.spec.encrypted:
 
         for i in range(len(cmds)):
             if self.spec.encrypted:
@@ -109,8 +201,16 @@ class to_ceph_volume(object):
                 cmds[i] += " --yes"
                 cmds[i] += " --no-systemd"
 
                 cmds[i] += " --yes"
                 cmds[i] += " --no-systemd"
 
-            if self.spec.crush_device_class:
-                cmds[i] += " --crush-device-class {}".format(self.spec.crush_device_class)
+            # set the --crush-device-class option when:
+            # - crush_device_class is specified at spec level (global for all the osds)  # noqa E501
+            # - crush_device_class is allowed
+            # - there's no override at osd level
+            if (
+                    self.spec.crush_device_class and
+                    self.spec.crush_device_class in self._supported_device_classes and  # noqa E501
+                    "crush-device-class" not in cmds[i]
+               ):
+                cmds[i] += " --crush-device-class {}".format(self.spec.crush_device_class)  # noqa E501
 
             if self.preview:
                 cmds[i] += " --report"
 
             if self.preview:
                 cmds[i] += " --report"
index 0b7826c4b0697793ce7285c62a539b8278424038..b08236130e0666e89ef1da201daafa29218ff8fd 100644 (file)
@@ -122,6 +122,12 @@ class TestSizeMatcher(object):
         assert matcher.low[0] == '50'
         assert matcher.low[1] == 'GB'
 
         assert matcher.low[0] == '50'
         assert matcher.low[1] == 'GB'
 
+    def test_to_byte_KB(self):
+        """ I doubt anyone ever thought we'd need to understand KB """
+
+        ret = drive_selection.SizeMatcher('size', '4K').to_byte(('4', 'KB'))
+        assert ret == 4 * 1e+3
+
     def test_to_byte_GB(self):
         """ Pretty nonesense test.."""
 
     def test_to_byte_GB(self):
         """ Pretty nonesense test.."""
 
index 2fc66b737fcd072114ff27aceff2a3e78ac615f6..faa001a0233ab2df72a36122e0f185f7c63a305c 100644 (file)
@@ -19,9 +19,10 @@ from ceph.deployment.drive_group import DriveGroupSpec, DeviceSelection, \
 service_id: testing_drivegroup
 placement:
   host_pattern: hostname
 service_id: testing_drivegroup
 placement:
   host_pattern: hostname
+crush_device_class: ssd
 data_devices:
   paths:
 data_devices:
   paths:
-  - /dev/sda 
+  - /dev/sda
 """
     ),
     (
 """
     ),
     (
@@ -31,14 +32,19 @@ placement:
   host_pattern: hostname
 data_devices:
   paths:
   host_pattern: hostname
 data_devices:
   paths:
-  - /dev/sda"""
+  - path: /dev/sda
+    crush_device_class: ssd"""
     ),
 ])
 def test_DriveGroup(test_input):
     ),
 ])
 def test_DriveGroup(test_input):
+
     dg = DriveGroupSpec.from_json(yaml.safe_load(test_input))
     assert dg.service_id == 'testing_drivegroup'
     assert all([isinstance(x, Device) for x in dg.data_devices.paths])
     dg = DriveGroupSpec.from_json(yaml.safe_load(test_input))
     assert dg.service_id == 'testing_drivegroup'
     assert all([isinstance(x, Device) for x in dg.data_devices.paths])
-    assert dg.data_devices.paths[0].path == '/dev/sda'
+    if isinstance(dg.data_devices.paths[0].path, str):
+        assert dg.data_devices.paths[0].path == '/dev/sda'
+
+
 
 @pytest.mark.parametrize("match,test_input",
 [
 
 @pytest.mark.parametrize("match,test_input",
 [
@@ -301,6 +307,129 @@ def test_ceph_volume_command_9():
     cmds = translate.to_ceph_volume(sel, []).run()
     assert all(cmd == 'lvm batch --no-auto /dev/sda /dev/sdb --data-allocate-fraction 0.8 --yes --no-systemd' for cmd in cmds), f'Expected {cmd} in {cmds}'
 
     cmds = translate.to_ceph_volume(sel, []).run()
     assert all(cmd == 'lvm batch --no-auto /dev/sda /dev/sdb --data-allocate-fraction 0.8 --yes --no-systemd' for cmd in cmds), f'Expected {cmd} in {cmds}'
 
+
+@pytest.mark.parametrize("test_input_base",
+[
+    (
+        """service_type: osd
+service_id: testing_drivegroup
+placement:
+  host_pattern: hostname
+crush_device_class: ssd
+data_devices:
+  paths:
+  - /dev/sda
+"""
+    ),
+    ])
+def test_ceph_volume_command_10(test_input_base):
+    spec = DriveGroupSpec.from_json(yaml.safe_load(test_input_base))
+    spec.validate()
+    drive = drive_selection.DriveSelection(spec, spec.data_devices.paths)
+    cmds = translate.to_ceph_volume(drive, []).run()
+
+    assert all(cmd == 'lvm batch --no-auto /dev/sda --crush-device-class ssd --yes --no-systemd' for cmd in cmds), f'Expected {cmd} in {cmds}'
+
+
+@pytest.mark.parametrize("test_input1",
+[
+    (
+        """service_type: osd
+service_id: testing_drivegroup
+placement:
+  host_pattern: hostname
+crush_device_class: ssd
+data_devices:
+  paths:
+  - path: /dev/sda
+    crush_device_class: hdd
+  - path: /dev/sdb
+    crush_device_class: hdd
+"""
+    ),
+    ])
+def test_ceph_volume_command_11(test_input1):
+    spec = DriveGroupSpec.from_json(yaml.safe_load(test_input1))
+    spec.validate()
+    drive = drive_selection.DriveSelection(spec, spec.data_devices.paths)
+    cmds = translate.to_ceph_volume(drive, []).run()
+
+    assert all(cmd == 'lvm batch --no-auto /dev/sda /dev/sdb --crush-device-class hdd --yes --no-systemd' for cmd in cmds), f'Expected {cmd} in {cmds}'
+
+
+@pytest.mark.parametrize("test_input2",
+[
+    (
+        """service_type: osd
+service_id: testing_drivegroup
+placement:
+  host_pattern: hostname
+crush_device_class: ssd
+data_devices:
+  paths:
+  - path: /dev/sda
+    crush_device_class: hdd
+  - path: /dev/sdb
+"""
+    ),
+    ])
+def test_ceph_volume_command_12(test_input2):
+
+    spec = DriveGroupSpec.from_json(yaml.safe_load(test_input2))
+    spec.validate()
+    drive = drive_selection.DriveSelection(spec, spec.data_devices.paths)
+    cmds = translate.to_ceph_volume(drive, []).run()
+
+    assert (cmds[0] == 'lvm batch --no-auto /dev/sdb --crush-device-class ssd --yes --no-systemd')  # noqa E501
+    assert (cmds[1] == 'lvm batch --no-auto /dev/sda --crush-device-class hdd --yes --no-systemd')  # noqa E501
+
+
+@pytest.mark.parametrize("test_input3",
+[
+    (
+        """service_type: osd
+service_id: testing_drivegroup
+placement:
+  host_pattern: hostname
+data_devices:
+  paths:
+  - path: /dev/sda
+    crush_device_class: hdd
+  - path: /dev/sdb
+"""
+    ),
+    ])
+def test_ceph_volume_command_13(test_input3):
+
+    spec = DriveGroupSpec.from_json(yaml.safe_load(test_input3))
+    spec.validate()
+    drive = drive_selection.DriveSelection(spec, spec.data_devices.paths)
+    cmds = translate.to_ceph_volume(drive, []).run()
+
+    assert (cmds[0] == 'lvm batch --no-auto /dev/sdb --yes --no-systemd')  # noqa E501
+    assert (cmds[1] == 'lvm batch --no-auto /dev/sda --crush-device-class hdd --yes --no-systemd')  # noqa E501
+
+
+@pytest.mark.parametrize("test_input4",
+[
+    (
+        """service_type: osd
+service_id: testing_drivegroup
+placement:
+  host_pattern: hostname
+data_devices:
+  paths:
+  - crush_device_class: hdd
+"""
+    ),
+    ])
+def test_ceph_volume_command_14(test_input4):
+
+    with pytest.raises(DriveGroupValidationError, match='Device path'):
+        spec = DriveGroupSpec.from_json(yaml.safe_load(test_input4))
+        spec.validate()
+
+
 def test_raw_ceph_volume_command_0():
     spec = DriveGroupSpec(placement=PlacementSpec(host_pattern='*'),
                           service_id='foobar',
 def test_raw_ceph_volume_command_0():
     spec = DriveGroupSpec(placement=PlacementSpec(host_pattern='*'),
                           service_id='foobar',
@@ -334,3 +463,118 @@ def test_raw_ceph_volume_command_1():
     sel = drive_selection.DriveSelection(spec, inventory)
     with pytest.raises(ValueError):
         cmds = translate.to_ceph_volume(sel, []).run()
     sel = drive_selection.DriveSelection(spec, inventory)
     with pytest.raises(ValueError):
         cmds = translate.to_ceph_volume(sel, []).run()
+
+@pytest.mark.parametrize("test_input5",
+[
+    (
+        """service_type: osd
+service_id: testing_drivegroup
+placement:
+  host_pattern: hostname
+method: raw
+data_devices:
+  paths:
+  - path: /dev/sda
+    crush_device_class: hdd
+  - path: /dev/sdb
+    crush_device_class: hdd
+  - path: /dev/sdc
+    crush_device_class: hdd
+db_devices:
+  paths:
+  - /dev/sdd
+  - /dev/sde
+  - /dev/sdf
+
+"""
+    ),
+    ])
+def test_raw_ceph_volume_command_2(test_input5):
+
+    spec = DriveGroupSpec.from_json(yaml.safe_load(test_input5))
+    spec.validate()
+    drive = drive_selection.DriveSelection(spec, spec.data_devices.paths)
+    cmds = translate.to_ceph_volume(drive, []).run()
+
+    assert cmds[0] == 'raw prepare --bluestore --data /dev/sda --block.db /dev/sdd --crush-device-class hdd'
+    assert cmds[1] == 'raw prepare --bluestore --data /dev/sdb --block.db /dev/sde --crush-device-class hdd'
+    assert cmds[2] == 'raw prepare --bluestore --data /dev/sdc --block.db /dev/sdf --crush-device-class hdd'
+
+
+@pytest.mark.parametrize("test_input6",
+[
+    (
+        """service_type: osd
+service_id: testing_drivegroup
+placement:
+  host_pattern: hostname
+method: raw
+data_devices:
+  paths:
+  - path: /dev/sda
+    crush_device_class: hdd
+  - path: /dev/sdb
+    crush_device_class: hdd
+  - path: /dev/sdc
+    crush_device_class: ssd
+db_devices:
+  paths:
+  - /dev/sdd
+  - /dev/sde
+  - /dev/sdf
+
+"""
+    ),
+    ])
+def test_raw_ceph_volume_command_3(test_input6):
+
+    spec = DriveGroupSpec.from_json(yaml.safe_load(test_input6))
+    spec.validate()
+    drive = drive_selection.DriveSelection(spec, spec.data_devices.paths)
+    cmds = translate.to_ceph_volume(drive, []).run()
+
+    assert cmds[0] == 'raw prepare --bluestore --data /dev/sda --block.db /dev/sdd --crush-device-class hdd'
+    assert cmds[1] == 'raw prepare --bluestore --data /dev/sdb --block.db /dev/sde --crush-device-class hdd'
+    assert cmds[2] == 'raw prepare --bluestore --data /dev/sdc --block.db /dev/sdf --crush-device-class ssd'
+
+
+@pytest.mark.parametrize("test_input7",
+[
+    (
+        """service_type: osd
+service_id: testing_drivegroup
+placement:
+  host_pattern: hostname
+method: raw
+data_devices:
+  paths:
+  - path: /dev/sda
+    crush_device_class: hdd
+  - path: /dev/sdb
+    crush_device_class: nvme
+  - path: /dev/sdc
+    crush_device_class: ssd
+db_devices:
+  paths:
+  - /dev/sdd
+  - /dev/sde
+  - /dev/sdf
+wal_devices:
+  paths:
+  - /dev/sdg
+  - /dev/sdh
+  - /dev/sdi
+
+"""
+    ),
+    ])
+def test_raw_ceph_volume_command_4(test_input7):
+
+    spec = DriveGroupSpec.from_json(yaml.safe_load(test_input7))
+    spec.validate()
+    drive = drive_selection.DriveSelection(spec, spec.data_devices.paths)
+    cmds = translate.to_ceph_volume(drive, []).run()
+
+    assert cmds[0] == 'raw prepare --bluestore --data /dev/sda --block.db /dev/sdd --block.wal /dev/sdg --crush-device-class hdd'
+    assert cmds[1] == 'raw prepare --bluestore --data /dev/sdb --block.db /dev/sdf --block.wal /dev/sdi --crush-device-class nvme'
+    assert cmds[2] == 'raw prepare --bluestore --data /dev/sdc --block.db /dev/sde --block.wal /dev/sdh --crush-device-class ssd'
index 69c1c306cf8015a6ad595a35a9495ae27d814aef..2d916fad2f8c263df7cc51b3c54f840c7dfe5724 100644 (file)
@@ -1,8 +1,10 @@
+import datetime
 import json
 import os
 import pytest
 
 import json
 import os
 import pytest
 
-from ceph.deployment.inventory import Devices
+from ceph.deployment.inventory import Devices, Device
+from ceph.utils import datetime_now
 
 
 @pytest.mark.parametrize("filename",
 
 
 @pytest.mark.parametrize("filename",
@@ -19,3 +21,51 @@ def test_from_json(filename):
     ds = Devices.from_json(data)
     assert len(ds.devices) == len(data)
     assert Devices.from_json(ds.to_json()) == ds
     ds = Devices.from_json(data)
     assert len(ds.devices) == len(data)
     assert Devices.from_json(ds.to_json()) == ds
+
+
+class TestDevicesEquality():
+    created_time1 = datetime_now()
+    created_time2 = created_time1 + datetime.timedelta(seconds=30)
+
+    @pytest.mark.parametrize(
+        "old_devices, new_devices, expected_equal",
+        [
+            (  # identical list should be equal
+                Devices([Device('/dev/sdb', available=True, created=created_time1),
+                         Device('/dev/sdc', available=True, created=created_time1)]),
+                Devices([Device('/dev/sdb', available=True, created=created_time1),
+                         Device('/dev/sdc', available=True, created=created_time1)]),
+                True,
+            ),
+            (  # differing only in created time should still be equal
+                Devices([Device('/dev/sdb', available=True, created=created_time1),
+                         Device('/dev/sdc', available=True, created=created_time1)]),
+                Devices([Device('/dev/sdb', available=True, created=created_time2),
+                         Device('/dev/sdc', available=True, created=created_time2)]),
+                True,
+            ),
+            (  # differing in some other field should make them not equal
+                Devices([Device('/dev/sdb', available=True, created=created_time1),
+                         Device('/dev/sdc', available=True, created=created_time1)]),
+                Devices([Device('/dev/sdb', available=False, created=created_time1),
+                         Device('/dev/sdc', available=True, created=created_time1)]),
+                False,
+            ),
+            (  # different amount of devices should not pass equality
+                Devices([Device('/dev/sdb', available=True, created=created_time1),
+                         Device('/dev/sdc', available=True, created=created_time1)]),
+                Devices([Device('/dev/sdb', available=True, created=created_time1),
+                         Device('/dev/sdc', available=True, created=created_time1),
+                         Device('/dev/sdd', available=True, created=created_time1)]),
+                False,
+            ),
+            (  # differing order should not affect equality
+                Devices([Device('/dev/sdb', available=True, created=created_time1),
+                         Device('/dev/sdc', available=True, created=created_time1)]),
+                Devices([Device('/dev/sdc', available=True, created=created_time1),
+                         Device('/dev/sdb', available=True, created=created_time1)]),
+                True,
+            ),
+        ])
+    def test_equality(self, old_devices, new_devices, expected_equal):
+        assert (old_devices == new_devices) == expected_equal
index d3fb4329668bb74d193a10669969f888eced5703..28dc1680f0f0c8d4069955568f7178e22d122d7f 100644 (file)
@@ -283,7 +283,9 @@ service_name: iscsi.iscsi
 networks:
 - ::0/8
 spec:
 networks:
 - ::0/8
 spec:
-  api_user: api_user
+  api_password: admin
+  api_port: 5000
+  api_user: admin
   pool: pool
   trusted_ip_list:
   - ::1
   pool: pool
   trusted_ip_list:
   - ::1
index bee4cd0c9a42f749856ba6e61a861f794027aaba..93fa482953b688dd0cbdcce395587cea0a50b926 100644 (file)
@@ -39,6 +39,7 @@ set(librgw_common_srcs
   services/svc_quota.cc
   services/svc_sync_modules.cc
   services/svc_rados.cc
   services/svc_quota.cc
   services/svc_sync_modules.cc
   services/svc_rados.cc
+  services/svc_role_rados.cc
   services/svc_sys_obj.cc
   services/svc_sys_obj_cache.cc
   services/svc_sys_obj_core.cc
   services/svc_sys_obj.cc
   services/svc_sys_obj_cache.cc
   services/svc_sys_obj_core.cc
@@ -367,7 +368,7 @@ install(TARGETS radosgw DESTINATION ${CMAKE_INSTALL_LIBDIR})
 add_executable(radosgwd radosgw.cc)
 target_link_libraries(radosgwd radosgw librados
   cls_rgw_client cls_otp_client cls_lock_client cls_refcount_client
 add_executable(radosgwd radosgw.cc)
 target_link_libraries(radosgwd radosgw librados
   cls_rgw_client cls_otp_client cls_lock_client cls_refcount_client
-  cls_log_client cls_timeindex_client neorados_cls_fifo
+  cls_log_client cls_timeindex_client
   cls_version_client cls_user_client
   global
   ${LIB_RESOLV}
   cls_version_client cls_user_client
   global
   ${LIB_RESOLV}
@@ -383,7 +384,7 @@ set(radosgw_admin_srcs
 add_executable(radosgw-admin ${radosgw_admin_srcs})
 target_link_libraries(radosgw-admin ${rgw_libs} librados
   cls_rgw_client cls_otp_client cls_lock_client cls_refcount_client
 add_executable(radosgw-admin ${radosgw_admin_srcs})
 target_link_libraries(radosgw-admin ${rgw_libs} librados
   cls_rgw_client cls_otp_client cls_lock_client cls_refcount_client
-  cls_log_client cls_timeindex_client neorados_cls_fifo
+  cls_log_client cls_timeindex_client
   cls_version_client cls_user_client
   global ${LIB_RESOLV}
   OATH::OATH
   cls_version_client cls_user_client
   global ${LIB_RESOLV}
   OATH::OATH
@@ -395,7 +396,7 @@ set(radosgw_es_srcs
 add_executable(radosgw-es ${radosgw_es_srcs})
 target_link_libraries(radosgw-es ${rgw_libs} librados
   cls_rgw_client cls_otp_client cls_lock_client cls_refcount_client
 add_executable(radosgw-es ${radosgw_es_srcs})
 target_link_libraries(radosgw-es ${rgw_libs} librados
   cls_rgw_client cls_otp_client cls_lock_client cls_refcount_client
-  cls_log_client cls_timeindex_client neorados_cls_fifo
+  cls_log_client cls_timeindex_client
   cls_version_client cls_user_client
   global ${LIB_RESOLV}
   ${CURL_LIBRARIES} ${EXPAT_LIBRARIES} ${BLKID_LIBRARIES})
   cls_version_client cls_user_client
   global ${LIB_RESOLV}
   ${CURL_LIBRARIES} ${EXPAT_LIBRARIES} ${BLKID_LIBRARIES})
@@ -413,7 +414,7 @@ set(radosgw_object_expirer_srcs
 add_executable(radosgw-object-expirer ${radosgw_object_expirer_srcs})
 target_link_libraries(radosgw-object-expirer ${rgw_libs} librados
   cls_rgw_client cls_otp_client cls_lock_client cls_refcount_client
 add_executable(radosgw-object-expirer ${radosgw_object_expirer_srcs})
 target_link_libraries(radosgw-object-expirer ${rgw_libs} librados
   cls_rgw_client cls_otp_client cls_lock_client cls_refcount_client
-  cls_log_client cls_timeindex_client neorados_cls_fifo
+  cls_log_client cls_timeindex_client
   cls_version_client cls_user_client
   global ${LIB_RESOLV}
   ${CURL_LIBRARIES} ${EXPAT_LIBRARIES})
   cls_version_client cls_user_client
   global ${LIB_RESOLV}
   ${CURL_LIBRARIES} ${EXPAT_LIBRARIES})
@@ -433,7 +434,6 @@ target_link_libraries(rgw
   cls_refcount_client
   cls_log_client
   cls_timeindex_client
   cls_refcount_client
   cls_log_client
   cls_timeindex_client
-  neorados_cls_fifo
   cls_version_client
   cls_user_client
   global
   cls_version_client
   cls_user_client
   global
index d164a0e409520f28720c283a2ab49a5e22a9eb31..79ccd87a31ea1cb2c01f9ee802111c25d6fa83e1 100644 (file)
@@ -13,6 +13,7 @@
  *
  */
 
  *
  */
 
+#include <algorithm>
 #include <cstdint>
 #include <numeric>
 #include <optional>
 #include <cstdint>
 #include <numeric>
 #include <optional>
@@ -123,12 +124,10 @@ void update_meta(lr::ObjectWriteOperation* op, const fifo::objv& objv,
   op->exec(fifo::op::CLASS, fifo::op::UPDATE_META, in);
 }
 
   op->exec(fifo::op::CLASS, fifo::op::UPDATE_META, in);
 }
 
-void part_init(lr::ObjectWriteOperation* op, std::string_view tag,
-              fifo::data_params params)
+void part_init(lr::ObjectWriteOperation* op, fifo::data_params params)
 {
   fifo::op::init_part ip;
 
 {
   fifo::op::init_part ip;
 
-  ip.tag = tag;
   ip.params = params;
 
   cb::list in;
   ip.params = params;
 
   cb::list in;
@@ -136,14 +135,15 @@ void part_init(lr::ObjectWriteOperation* op, std::string_view tag,
   op->exec(fifo::op::CLASS, fifo::op::INIT_PART, in);
 }
 
   op->exec(fifo::op::CLASS, fifo::op::INIT_PART, in);
 }
 
-int push_part(const DoutPrefixProvider *dpp, lr::IoCtx& ioctx, const std::string& oid, std::string_view tag,
+int push_part(const DoutPrefixProvider *dpp, lr::IoCtx& ioctx, const std::string& oid,
              std::deque<cb::list> data_bufs, std::uint64_t tid,
              optional_yield y)
 {
   lr::ObjectWriteOperation op;
   fifo::op::push_part pp;
 
              std::deque<cb::list> data_bufs, std::uint64_t tid,
              optional_yield y)
 {
   lr::ObjectWriteOperation op;
   fifo::op::push_part pp;
 
-  pp.tag = tag;
+  op.assert_exists();
+
   pp.data_bufs = data_bufs;
   pp.total_len = 0;
 
   pp.data_bufs = data_bufs;
   pp.total_len = 0;
 
@@ -171,14 +171,13 @@ int push_part(const DoutPrefixProvider *dpp, lr::IoCtx& ioctx, const std::string
   return retval;
 }
 
   return retval;
 }
 
-void push_part(lr::IoCtx& ioctx, const std::string& oid, std::string_view tag,
+void push_part(lr::IoCtx& ioctx, const std::string& oid,
               std::deque<cb::list> data_bufs, std::uint64_t tid,
               lr::AioCompletion* c)
 {
   lr::ObjectWriteOperation op;
   fifo::op::push_part pp;
 
               std::deque<cb::list> data_bufs, std::uint64_t tid,
               lr::AioCompletion* c)
 {
   lr::ObjectWriteOperation op;
   fifo::op::push_part pp;
 
-  pp.tag = tag;
   pp.data_bufs = data_bufs;
   pp.total_len = 0;
 
   pp.data_bufs = data_bufs;
   pp.total_len = 0;
 
@@ -193,12 +192,10 @@ void push_part(lr::IoCtx& ioctx, const std::string& oid, std::string_view tag,
 }
 
 void trim_part(lr::ObjectWriteOperation* op,
 }
 
 void trim_part(lr::ObjectWriteOperation* op,
-              std::optional<std::string_view> tag,
               std::uint64_t ofs, bool exclusive)
 {
   fifo::op::trim_part tp;
 
               std::uint64_t ofs, bool exclusive)
 {
   fifo::op::trim_part tp;
 
-  tp.tag = tag;
   tp.ofs = ofs;
   tp.exclusive = exclusive;
 
   tp.ofs = ofs;
   tp.exclusive = exclusive;
 
@@ -208,16 +205,14 @@ void trim_part(lr::ObjectWriteOperation* op,
 }
 
 int list_part(const DoutPrefixProvider *dpp, lr::IoCtx& ioctx, const std::string& oid,
 }
 
 int list_part(const DoutPrefixProvider *dpp, lr::IoCtx& ioctx, const std::string& oid,
-             std::optional<std::string_view> tag, std::uint64_t ofs,
-             std::uint64_t max_entries,
+             std::uint64_t ofs, std::uint64_t max_entries,
              std::vector<fifo::part_list_entry>* entries,
              std::vector<fifo::part_list_entry>* entries,
-             bool* more, bool* full_part, std::string* ptag,
+             bool* more, bool* full_part,
              std::uint64_t tid, optional_yield y)
 {
   lr::ObjectReadOperation op;
   fifo::op::list_part lp;
 
              std::uint64_t tid, optional_yield y)
 {
   lr::ObjectReadOperation op;
   fifo::op::list_part lp;
 
-  lp.tag = tag;
   lp.ofs = ofs;
   lp.max_entries = max_entries;
 
   lp.ofs = ofs;
   lp.max_entries = max_entries;
 
@@ -233,7 +228,6 @@ int list_part(const DoutPrefixProvider *dpp, lr::IoCtx& ioctx, const std::string
       if (entries) *entries = std::move(reply.entries);
       if (more) *more = reply.more;
       if (full_part) *full_part = reply.full_part;
       if (entries) *entries = std::move(reply.entries);
       if (more) *more = reply.more;
       if (full_part) *full_part = reply.full_part;
-      if (ptag) *ptag = reply.tag;
     } catch (const cb::error& err) {
       ldpp_dout(dpp, -1)
        << __PRETTY_FUNCTION__ << ":" << __LINE__
     } catch (const cb::error& err) {
       ldpp_dout(dpp, -1)
        << __PRETTY_FUNCTION__ << ":" << __LINE__
@@ -255,14 +249,12 @@ struct list_entry_completion : public lr::ObjectOperationCompletion {
   std::vector<fifo::part_list_entry>* entries;
   bool* more;
   bool* full_part;
   std::vector<fifo::part_list_entry>* entries;
   bool* more;
   bool* full_part;
-  std::string* ptag;
   std::uint64_t tid;
 
   list_entry_completion(CephContext* cct, int* r_out, std::vector<fifo::part_list_entry>* entries,
   std::uint64_t tid;
 
   list_entry_completion(CephContext* cct, int* r_out, std::vector<fifo::part_list_entry>* entries,
-                       bool* more, bool* full_part, std::string* ptag,
-                       std::uint64_t tid)
+                       bool* more, bool* full_part, std::uint64_t tid)
     : cct(cct), r_out(r_out), entries(entries), more(more),
     : cct(cct), r_out(r_out), entries(entries), more(more),
-      full_part(full_part), ptag(ptag), tid(tid) {}
+      full_part(full_part), tid(tid) {}
   virtual ~list_entry_completion() = default;
   void handle_completion(int r, bufferlist& bl) override {
     if (r >= 0) try {
   virtual ~list_entry_completion() = default;
   void handle_completion(int r, bufferlist& bl) override {
     if (r >= 0) try {
@@ -272,7 +264,6 @@ struct list_entry_completion : public lr::ObjectOperationCompletion {
        if (entries) *entries = std::move(reply.entries);
        if (more) *more = reply.more;
        if (full_part) *full_part = reply.full_part;
        if (entries) *entries = std::move(reply.entries);
        if (more) *more = reply.more;
        if (full_part) *full_part = reply.full_part;
-       if (ptag) *ptag = reply.tag;
       } catch (const cb::error& err) {
        lderr(cct)
          << __PRETTY_FUNCTION__ << ":" << __LINE__
       } catch (const cb::error& err) {
        lderr(cct)
          << __PRETTY_FUNCTION__ << ":" << __LINE__
@@ -290,18 +281,16 @@ struct list_entry_completion : public lr::ObjectOperationCompletion {
 };
 
 lr::ObjectReadOperation list_part(CephContext* cct,
 };
 
 lr::ObjectReadOperation list_part(CephContext* cct,
-                                 std::optional<std::string_view> tag,
                                  std::uint64_t ofs,
                                  std::uint64_t max_entries,
                                  int* r_out,
                                  std::vector<fifo::part_list_entry>* entries,
                                  bool* more, bool* full_part,
                                  std::uint64_t ofs,
                                  std::uint64_t max_entries,
                                  int* r_out,
                                  std::vector<fifo::part_list_entry>* entries,
                                  bool* more, bool* full_part,
-                                 std::string* ptag, std::uint64_t tid)
+                                 std::uint64_t tid)
 {
   lr::ObjectReadOperation op;
   fifo::op::list_part lp;
 
 {
   lr::ObjectReadOperation op;
   fifo::op::list_part lp;
 
-  lp.tag = tag;
   lp.ofs = ofs;
   lp.max_entries = max_entries;
 
   lp.ofs = ofs;
   lp.max_entries = max_entries;
 
@@ -309,7 +298,7 @@ lr::ObjectReadOperation list_part(CephContext* cct,
   encode(lp, in);
   op.exec(fifo::op::CLASS, fifo::op::LIST_PART, in,
          new list_entry_completion(cct, r_out, entries, more, full_part,
   encode(lp, in);
   op.exec(fifo::op::CLASS, fifo::op::LIST_PART, in,
          new list_entry_completion(cct, r_out, entries, more, full_part,
-                                   ptag, tid));
+                                   tid));
   return op;
 }
 
   return op;
 }
 
@@ -423,14 +412,6 @@ std::optional<marker> FIFO::to_marker(std::string_view s)
   return m;
 }
 
   return m;
 }
 
-std::string FIFO::generate_tag() const
-{
-  static constexpr auto HEADER_TAG_SIZE = 16;
-  return gen_rand_alphanumeric_plain(static_cast<CephContext*>(ioctx.cct()),
-                                    HEADER_TAG_SIZE);
-}
-
-
 int FIFO::apply_update(const DoutPrefixProvider *dpp,
                        fifo::info* info,
                       const fifo::objv& objv,
 int FIFO::apply_update(const DoutPrefixProvider *dpp,
                        fifo::info* info,
                       const fifo::objv& objv,
@@ -442,18 +423,11 @@ int FIFO::apply_update(const DoutPrefixProvider *dpp,
   std::unique_lock l(m);
   if (objv != info->version) {
     ldpp_dout(dpp, -1) << __PRETTY_FUNCTION__ << ":" << __LINE__
   std::unique_lock l(m);
   if (objv != info->version) {
     ldpp_dout(dpp, -1) << __PRETTY_FUNCTION__ << ":" << __LINE__
-              << " version mismatch, canceling: tid=" << tid << dendl;
-    return -ECANCELED;
-  }
-  auto err = info->apply_update(update);
-  if (err) {
-    ldpp_dout(dpp, -1) << __PRETTY_FUNCTION__ << ":" << __LINE__
-              << " error applying update: " << *err << " tid=" << tid << dendl;
+                      << " version mismatch, canceling: tid=" << tid << dendl;
     return -ECANCELED;
   }
 
     return -ECANCELED;
   }
 
-  ++info->version.ver;
-
+  info->apply_update(update);
   return {};
 }
 
   return {};
 }
 
@@ -465,7 +439,7 @@ int FIFO::_update_meta(const DoutPrefixProvider *dpp, const fifo::update& update
                 << " entering: tid=" << tid << dendl;
   lr::ObjectWriteOperation op;
   bool canceled = false;
                 << " entering: tid=" << tid << dendl;
   lr::ObjectWriteOperation op;
   bool canceled = false;
-  update_meta(&op, info.version, update);
+  update_meta(&op, version, update);
   auto r = rgw_rados_operate(dpp, ioctx, oid, &op, y);
   if (r >= 0 || r == -ECANCELED) {
     canceled = (r == -ECANCELED);
   auto r = rgw_rados_operate(dpp, ioctx, oid, &op, y);
   if (r >= 0 || r == -ECANCELED) {
     canceled = (r == -ECANCELED);
@@ -579,7 +553,7 @@ void FIFO::_update_meta(const DoutPrefixProvider *dpp, const fifo::update& updat
   assert(r >= 0);
 }
 
   assert(r >= 0);
 }
 
-int FIFO::create_part(const DoutPrefixProvider *dpp, int64_t part_num, std::string_view tag, std::uint64_t tid,
+int FIFO::create_part(const DoutPrefixProvider *dpp, int64_t part_num, std::uint64_t tid,
                      optional_yield y)
 {
   ldpp_dout(dpp, 20) << __PRETTY_FUNCTION__ << ":" << __LINE__
                      optional_yield y)
 {
   ldpp_dout(dpp, 20) << __PRETTY_FUNCTION__ << ":" << __LINE__
@@ -588,7 +562,7 @@ int FIFO::create_part(const DoutPrefixProvider *dpp, int64_t part_num, std::stri
   op.create(false); /* We don't need exclusivity, part_init ensures
                       we're creating from the same journal entry. */
   std::unique_lock l(m);
   op.create(false); /* We don't need exclusivity, part_init ensures
                       we're creating from the same journal entry. */
   std::unique_lock l(m);
-  part_init(&op, tag, info.params);
+  part_init(&op, info.params);
   auto oid = info.part_oid(part_num);
   l.unlock();
   auto r = rgw_rados_operate(dpp, ioctx, oid, &op, y);
   auto oid = info.part_oid(part_num);
   l.unlock();
   auto r = rgw_rados_operate(dpp, ioctx, oid, &op, y);
@@ -600,7 +574,7 @@ int FIFO::create_part(const DoutPrefixProvider *dpp, int64_t part_num, std::stri
   return r;
 }
 
   return r;
 }
 
-int FIFO::remove_part(const DoutPrefixProvider *dpp, int64_t part_num, std::string_view tag, std::uint64_t tid,
+int FIFO::remove_part(const DoutPrefixProvider *dpp, int64_t part_num, std::uint64_t tid,
                      optional_yield y)
 {
   ldpp_dout(dpp, 20) << __PRETTY_FUNCTION__ << ":" << __LINE__
                      optional_yield y)
 {
   ldpp_dout(dpp, 20) << __PRETTY_FUNCTION__ << ":" << __LINE__
@@ -633,13 +607,13 @@ int FIFO::process_journal(const DoutPrefixProvider *dpp, std::uint64_t tid, opti
   l.unlock();
 
   int r = 0;
   l.unlock();
 
   int r = 0;
-  for (auto& [n, entry] : tmpjournal) {
+  for (auto& entry : tmpjournal) {
     ldpp_dout(dpp, 20) << __PRETTY_FUNCTION__ << ":" << __LINE__
                   << " processing entry: entry=" << entry << " tid=" << tid
                   << dendl;
     switch (entry.op) {
     case fifo::journal_entry::Op::create:
     ldpp_dout(dpp, 20) << __PRETTY_FUNCTION__ << ":" << __LINE__
                   << " processing entry: entry=" << entry << " tid=" << tid
                   << dendl;
     switch (entry.op) {
     case fifo::journal_entry::Op::create:
-      r = create_part(dpp, entry.part_num, entry.part_tag, tid, y);
+      r = create_part(dpp, entry.part_num, tid, y);
       if (entry.part_num > new_max) {
        new_max = entry.part_num;
       }
       if (entry.part_num > new_max) {
        new_max = entry.part_num;
       }
@@ -651,7 +625,7 @@ int FIFO::process_journal(const DoutPrefixProvider *dpp, std::uint64_t tid, opti
       }
       break;
     case fifo::journal_entry::Op::remove:
       }
       break;
     case fifo::journal_entry::Op::remove:
-      r = remove_part(dpp, entry.part_num, entry.part_tag, tid, y);
+      r = remove_part(dpp, entry.part_num, tid, y);
       if (r == -ENOENT) r = 0;
       if (entry.part_num >= new_tail) {
        new_tail = entry.part_num + 1;
       if (r == -ENOENT) r = 0;
       if (entry.part_num >= new_tail) {
        new_tail = entry.part_num + 1;
@@ -719,13 +693,9 @@ int FIFO::process_journal(const DoutPrefixProvider *dpp, std::uint64_t tid, opti
                     << " update canceled, retrying: i=" << i << " tid="
                     << tid << dendl;
       for (auto& e : processed) {
                     << " update canceled, retrying: i=" << i << " tid="
                     << tid << dendl;
       for (auto& e : processed) {
-       auto jiter = info.journal.find(e.part_num);
-       /* journal entry was already processed */
-       if (jiter == info.journal.end() ||
-           !(jiter->second == e)) {
-         continue;
+       if (info.journal.contains(e)) {
+         new_processed.push_back(e);
        }
        }
-       new_processed.push_back(e);
       }
       processed = std::move(new_processed);
     }
       }
       processed = std::move(new_processed);
     }
@@ -742,13 +712,16 @@ int FIFO::process_journal(const DoutPrefixProvider *dpp, std::uint64_t tid, opti
   return r;
 }
 
   return r;
 }
 
-int FIFO::_prepare_new_part(const DoutPrefixProvider *dpp, bool is_head, std::uint64_t tid, optional_yield y)
+int FIFO::_prepare_new_part(const DoutPrefixProvider *dpp,
+                           std::int64_t new_part_num, bool is_head,
+                           std::uint64_t tid, optional_yield y)
 {
   ldpp_dout(dpp, 20) << __PRETTY_FUNCTION__ << ":" << __LINE__
                 << " entering: tid=" << tid << dendl;
   std::unique_lock l(m);
 {
   ldpp_dout(dpp, 20) << __PRETTY_FUNCTION__ << ":" << __LINE__
                 << " entering: tid=" << tid << dendl;
   std::unique_lock l(m);
-  std::vector jentries = { info.next_journal_entry(generate_tag()) };
-  if (info.journal.find(jentries.front().part_num) != info.journal.end()) {
+  std::vector<fifo::journal_entry> jentries{{ fifo::journal_entry::Op::create, new_part_num }};
+  if (info.journal.contains({fifo::journal_entry::Op::create, new_part_num}) &&
+      (!is_head || info.journal.contains({fifo::journal_entry::Op::set_head, new_part_num}))) {
     l.unlock();
     ldpp_dout(dpp, 5) << __PRETTY_FUNCTION__ << ":" << __LINE__
                  << " new part journaled, but not processed: tid="
     l.unlock();
     ldpp_dout(dpp, 5) << __PRETTY_FUNCTION__ << ":" << __LINE__
                  << " new part journaled, but not processed: tid="
@@ -760,16 +733,12 @@ int FIFO::_prepare_new_part(const DoutPrefixProvider *dpp, bool is_head, std::ui
     }
     return r;
   }
     }
     return r;
   }
-  std::int64_t new_head_part_num = info.head_part_num;
   auto version = info.version;
 
   if (is_head) {
     ldpp_dout(dpp, 20) << __PRETTY_FUNCTION__ << ":" << __LINE__
                   << " needs new head: tid=" << tid << dendl;
   auto version = info.version;
 
   if (is_head) {
     ldpp_dout(dpp, 20) << __PRETTY_FUNCTION__ << ":" << __LINE__
                   << " needs new head: tid=" << tid << dendl;
-    auto new_head_jentry = jentries.front();
-    new_head_jentry.op = fifo::journal_entry::Op::set_head;
-    new_head_part_num = jentries.front().part_num;
-    jentries.push_back(std::move(new_head_jentry));
+    jentries.push_back({ fifo::journal_entry::Op::set_head, new_part_num });
   }
   l.unlock();
 
   }
   l.unlock();
 
@@ -783,10 +752,11 @@ int FIFO::_prepare_new_part(const DoutPrefixProvider *dpp, bool is_head, std::ui
     r = _update_meta(dpp, u, version, &canceled, tid, y);
     if (r >= 0 && canceled) {
       std::unique_lock l(m);
     r = _update_meta(dpp, u, version, &canceled, tid, y);
     if (r >= 0 && canceled) {
       std::unique_lock l(m);
-      auto found = (info.journal.find(jentries.front().part_num) !=
-                   info.journal.end());
-      if ((info.max_push_part_num >= jentries.front().part_num &&
-          info.head_part_num >= new_head_part_num)) {
+      version = info.version;
+      auto found = (info.journal.contains({fifo::journal_entry::Op::create, new_part_num}) ||
+                   info.journal.contains({fifo::journal_entry::Op::set_head, new_part_num}));
+      if ((info.max_push_part_num >= new_part_num &&
+          info.head_part_num >= new_part_num)) {
        ldpp_dout(dpp, 20) << __PRETTY_FUNCTION__ << ":" << __LINE__
                       << " raced, but journaled and processed: i=" << i
                       << " tid=" << tid << dendl;
        ldpp_dout(dpp, 20) << __PRETTY_FUNCTION__ << ":" << __LINE__
                       << " raced, but journaled and processed: i=" << i
                       << " tid=" << tid << dendl;
@@ -820,21 +790,22 @@ int FIFO::_prepare_new_part(const DoutPrefixProvider *dpp, bool is_head, std::ui
   return r;
 }
 
   return r;
 }
 
-int FIFO::_prepare_new_head(const DoutPrefixProvider *dpp, std::uint64_t tid, optional_yield y)
+int FIFO::_prepare_new_head(const DoutPrefixProvider *dpp,
+                           std::int64_t new_head_part_num,
+                           std::uint64_t tid, optional_yield y)
 {
   ldpp_dout(dpp, 20) << __PRETTY_FUNCTION__ << ":" << __LINE__
 {
   ldpp_dout(dpp, 20) << __PRETTY_FUNCTION__ << ":" << __LINE__
-                << " entering: tid=" << tid << dendl;
+                    << " entering: tid=" << tid << dendl;
   std::unique_lock l(m);
   std::unique_lock l(m);
-  std::int64_t new_head_num = info.head_part_num + 1;
   auto max_push_part_num = info.max_push_part_num;
   auto version = info.version;
   l.unlock();
 
   int r = 0;
   auto max_push_part_num = info.max_push_part_num;
   auto version = info.version;
   l.unlock();
 
   int r = 0;
-  if (max_push_part_num < new_head_num) {
+  if (max_push_part_num < new_head_part_num) {
     ldpp_dout(dpp, 20) << __PRETTY_FUNCTION__ << ":" << __LINE__
                   << " need new part: tid=" << tid << dendl;
     ldpp_dout(dpp, 20) << __PRETTY_FUNCTION__ << ":" << __LINE__
                   << " need new part: tid=" << tid << dendl;
-    r = _prepare_new_part(dpp, true, tid, y);
+    r = _prepare_new_part(dpp, new_head_part_num, true, tid, y);
     if (r < 0) {
       ldpp_dout(dpp, -1) << __PRETTY_FUNCTION__ << ":" << __LINE__
                 << " _prepare_new_part failed: r=" << r
     if (r < 0) {
       ldpp_dout(dpp, -1) << __PRETTY_FUNCTION__ << ":" << __LINE__
                 << " _prepare_new_part failed: r=" << r
@@ -842,7 +813,7 @@ int FIFO::_prepare_new_head(const DoutPrefixProvider *dpp, std::uint64_t tid, op
       return r;
     }
     std::unique_lock l(m);
       return r;
     }
     std::unique_lock l(m);
-    if (info.max_push_part_num < new_head_num) {
+    if (info.max_push_part_num < new_head_part_num) {
       ldpp_dout(dpp, -1) << __PRETTY_FUNCTION__ << ":" << __LINE__
                 << " inconsistency, push part less than head part: "
                 << " tid=" << tid << dendl;
       ldpp_dout(dpp, -1) << __PRETTY_FUNCTION__ << ":" << __LINE__
                 << " inconsistency, push part less than head part: "
                 << " tid=" << tid << dendl;
@@ -852,51 +823,71 @@ int FIFO::_prepare_new_head(const DoutPrefixProvider *dpp, std::uint64_t tid, op
     return 0;
   }
 
     return 0;
   }
 
+  fifo::journal_entry jentry;
+  jentry.op = fifo::journal_entry::Op::set_head;
+  jentry.part_num = new_head_part_num;
+
+  r = 0;
   bool canceled = true;
   for (auto i = 0; canceled && i < MAX_RACE_RETRIES; ++i) {
   bool canceled = true;
   for (auto i = 0; canceled && i < MAX_RACE_RETRIES; ++i) {
+    canceled = false;
     ldpp_dout(dpp, 20) << __PRETTY_FUNCTION__ << ":" << __LINE__
     ldpp_dout(dpp, 20) << __PRETTY_FUNCTION__ << ":" << __LINE__
-                  << " updating head: i=" << i << " tid=" << tid << dendl;
-    auto u = fifo::update{}.head_part_num(new_head_num);
+                  << " updating metadata: i=" << i << " tid=" << tid << dendl;
+    auto u = fifo::update{}.journal_entries_add({{ jentry }});
     r = _update_meta(dpp, u, version, &canceled, tid, y);
     r = _update_meta(dpp, u, version, &canceled, tid, y);
+    if (r >= 0 && canceled) {
+      std::unique_lock l(m);
+      auto found = (info.journal.contains({fifo::journal_entry::Op::create, new_head_part_num}) ||
+                   info.journal.contains({fifo::journal_entry::Op::set_head, new_head_part_num}));
+      version = info.version;
+      if ((info.head_part_num >= new_head_part_num)) {
+       ldpp_dout(dpp, 20) << __PRETTY_FUNCTION__ << ":" << __LINE__
+                      << " raced, but journaled and processed: i=" << i
+                      << " tid=" << tid << dendl;
+       return 0;
+      }
+      if (found) {
+       ldpp_dout(dpp, 20) << __PRETTY_FUNCTION__ << ":" << __LINE__
+                      << " raced, journaled but not processed: i=" << i
+                      << " tid=" << tid << dendl;
+       canceled = false;
+      }
+      l.unlock();
+    }
     if (r < 0) {
       ldpp_dout(dpp, -1) << __PRETTY_FUNCTION__ << ":" << __LINE__
                 << " _update_meta failed: update=" << u << " r=" << r
                 << " tid=" << tid << dendl;
       return r;
     }
     if (r < 0) {
       ldpp_dout(dpp, -1) << __PRETTY_FUNCTION__ << ":" << __LINE__
                 << " _update_meta failed: update=" << u << " r=" << r
                 << " tid=" << tid << dendl;
       return r;
     }
-    std::unique_lock l(m);
-    auto head_part_num = info.head_part_num;
-    version = info.version;
-    l.unlock();
-    if (canceled && (head_part_num >= new_head_num)) {
-      ldpp_dout(dpp, 20) << __PRETTY_FUNCTION__ << ":" << __LINE__
-                    << " raced, but completed by the other caller: i=" << i
-                    << " tid=" << tid << dendl;
-      canceled = false;
-    }
   }
   if (canceled) {
     ldpp_dout(dpp, -1) << __PRETTY_FUNCTION__ << ":" << __LINE__
               << " canceled too many times, giving up: tid=" << tid << dendl;
     return -ECANCELED;
   }
   }
   if (canceled) {
     ldpp_dout(dpp, -1) << __PRETTY_FUNCTION__ << ":" << __LINE__
               << " canceled too many times, giving up: tid=" << tid << dendl;
     return -ECANCELED;
   }
-  return 0;
+  r = process_journal(dpp, tid, y);
+  if (r < 0) {
+    ldpp_dout(dpp, -1) << __PRETTY_FUNCTION__ << ":" << __LINE__
+              << " process_journal failed: r=" << r << " tid=" << tid << dendl;
+  }
+  return r;
 }
 
 struct NewPartPreparer : public Completion<NewPartPreparer> {
   FIFO* f;
   std::vector<fifo::journal_entry> jentries;
   int i = 0;
 }
 
 struct NewPartPreparer : public Completion<NewPartPreparer> {
   FIFO* f;
   std::vector<fifo::journal_entry> jentries;
   int i = 0;
-  std::int64_t new_head_part_num;
+  std::int64_t new_part_num;
   bool canceled = false;
   uint64_t tid;
 
   NewPartPreparer(const DoutPrefixProvider *dpp, FIFO* f, lr::AioCompletion* super,
                  std::vector<fifo::journal_entry> jentries,
   bool canceled = false;
   uint64_t tid;
 
   NewPartPreparer(const DoutPrefixProvider *dpp, FIFO* f, lr::AioCompletion* super,
                  std::vector<fifo::journal_entry> jentries,
-                 std::int64_t new_head_part_num,
+                 std::int64_t new_part_num,
                  std::uint64_t tid)
     : Completion(dpp, super), f(f), jentries(std::move(jentries)),
                  std::uint64_t tid)
     : Completion(dpp, super), f(f), jentries(std::move(jentries)),
-      new_head_part_num(new_head_part_num), tid(tid) {}
+      new_part_num(new_part_num), tid(tid) {}
 
   void handle(const DoutPrefixProvider *dpp, Ptr&& p, int r) {
     ldpp_dout(dpp, 20) << __PRETTY_FUNCTION__ << ":" << __LINE__
 
   void handle(const DoutPrefixProvider *dpp, Ptr&& p, int r) {
     ldpp_dout(dpp, 20) << __PRETTY_FUNCTION__ << ":" << __LINE__
@@ -911,14 +902,14 @@ struct NewPartPreparer : public Completion<NewPartPreparer> {
 
     if (canceled) {
       std::unique_lock l(f->m);
 
     if (canceled) {
       std::unique_lock l(f->m);
-      auto iter = f->info.journal.find(jentries.front().part_num);
+      auto found = (f->info.journal.contains({fifo::journal_entry::Op::create, new_part_num}) ||
+                   f->info.journal.contains({fifo::journal_entry::Op::set_head, new_part_num}));
       auto max_push_part_num = f->info.max_push_part_num;
       auto head_part_num = f->info.head_part_num;
       auto version = f->info.version;
       auto max_push_part_num = f->info.max_push_part_num;
       auto head_part_num = f->info.head_part_num;
       auto version = f->info.version;
-      auto found = (iter != f->info.journal.end());
       l.unlock();
       l.unlock();
-      if ((max_push_part_num >= jentries.front().part_num &&
-          head_part_num >= new_head_part_num)) {
+      if ((max_push_part_num >= new_part_num &&
+          head_part_num >= new_part_num)) {
        ldpp_dout(dpp, 20) << __PRETTY_FUNCTION__ << ":" << __LINE__
                          << " raced, but journaled and processed: i=" << i
                          << " tid=" << tid << dendl;
        ldpp_dout(dpp, 20) << __PRETTY_FUNCTION__ << ":" << __LINE__
                          << " raced, but journaled and processed: i=" << i
                          << " tid=" << tid << dendl;
@@ -948,12 +939,13 @@ struct NewPartPreparer : public Completion<NewPartPreparer> {
   }
 };
 
   }
 };
 
-void FIFO::_prepare_new_part(const DoutPrefixProvider *dpp, bool is_head, std::uint64_t tid,
-                            lr::AioCompletion* c)
+void FIFO::_prepare_new_part(const DoutPrefixProvider *dpp, std::int64_t new_part_num,
+                            bool is_head, std::uint64_t tid, lr::AioCompletion* c)
 {
   std::unique_lock l(m);
 {
   std::unique_lock l(m);
-  std::vector jentries = { info.next_journal_entry(generate_tag()) };
-  if (info.journal.find(jentries.front().part_num) != info.journal.end()) {
+  std::vector<fifo::journal_entry> jentries{{fifo::journal_entry::Op::create, new_part_num}};
+  if (info.journal.contains({fifo::journal_entry::Op::create, new_part_num}) &&
+      (!is_head || info.journal.contains({fifo::journal_entry::Op::set_head, new_part_num}))) {
     l.unlock();
     ldpp_dout(dpp, 5) << __PRETTY_FUNCTION__ << ":" << __LINE__
                  << " new part journaled, but not processed: tid="
     l.unlock();
     ldpp_dout(dpp, 5) << __PRETTY_FUNCTION__ << ":" << __LINE__
                  << " new part journaled, but not processed: tid="
@@ -961,19 +953,15 @@ void FIFO::_prepare_new_part(const DoutPrefixProvider *dpp, bool is_head, std::u
     process_journal(dpp, tid, c);
     return;
   }
     process_journal(dpp, tid, c);
     return;
   }
-  std::int64_t new_head_part_num = info.head_part_num;
   auto version = info.version;
 
   if (is_head) {
   auto version = info.version;
 
   if (is_head) {
-    auto new_head_jentry = jentries.front();
-    new_head_jentry.op = fifo::journal_entry::Op::set_head;
-    new_head_part_num = jentries.front().part_num;
-    jentries.push_back(std::move(new_head_jentry));
+    jentries.push_back({ fifo::journal_entry::Op::set_head, new_part_num });
   }
   l.unlock();
 
   auto n = std::make_unique<NewPartPreparer>(dpp, this, c, jentries,
   }
   l.unlock();
 
   auto n = std::make_unique<NewPartPreparer>(dpp, this, c, jentries,
-                                            new_head_part_num, tid);
+                                            new_part_num, tid);
   auto np = n.get();
   _update_meta(dpp, fifo::update{}.journal_entries_add(jentries), version,
               &np->canceled, tid, NewPartPreparer::call(std::move(n)));
   auto np = n.get();
   _update_meta(dpp, fifo::update{}.journal_entries_add(jentries), version,
               &np->canceled, tid, NewPartPreparer::call(std::move(n)));
@@ -983,14 +971,15 @@ struct NewHeadPreparer : public Completion<NewHeadPreparer> {
   FIFO* f;
   int i = 0;
   bool newpart;
   FIFO* f;
   int i = 0;
   bool newpart;
-  std::int64_t new_head_num;
+  std::int64_t new_head_part_num;
   bool canceled = false;
   std::uint64_t tid;
 
   NewHeadPreparer(const DoutPrefixProvider *dpp, FIFO* f, lr::AioCompletion* super,
   bool canceled = false;
   std::uint64_t tid;
 
   NewHeadPreparer(const DoutPrefixProvider *dpp, FIFO* f, lr::AioCompletion* super,
-                 bool newpart, std::int64_t new_head_num, std::uint64_t tid)
-    : Completion(dpp, super), f(f), newpart(newpart), new_head_num(new_head_num),
-      tid(tid) {}
+                 bool newpart, std::int64_t new_head_part_num,
+                 std::uint64_t tid)
+    : Completion(dpp, super), f(f), newpart(newpart),
+      new_head_part_num(new_head_part_num), tid(tid) {}
 
   void handle(const DoutPrefixProvider *dpp, Ptr&& p, int r) {
     if (newpart)
 
   void handle(const DoutPrefixProvider *dpp, Ptr&& p, int r) {
     if (newpart)
@@ -1008,7 +997,7 @@ struct NewHeadPreparer : public Completion<NewHeadPreparer> {
       return;
     }
     std::unique_lock l(f->m);
       return;
     }
     std::unique_lock l(f->m);
-    if (f->info.max_push_part_num < new_head_num) {
+    if (f->info.max_push_part_num < new_head_part_num) {
       l.unlock();
       lderr(f->cct) << __PRETTY_FUNCTION__ << ":" << __LINE__
                    << " _prepare_new_part failed: r=" << r
       l.unlock();
       lderr(f->cct) << __PRETTY_FUNCTION__ << ":" << __LINE__
                    << " _prepare_new_part failed: r=" << r
@@ -1021,67 +1010,84 @@ struct NewHeadPreparer : public Completion<NewHeadPreparer> {
   }
 
   void handle_update(const DoutPrefixProvider *dpp, Ptr&& p, int r) {
   }
 
   void handle_update(const DoutPrefixProvider *dpp, Ptr&& p, int r) {
-    std::unique_lock l(f->m);
-    auto head_part_num = f->info.head_part_num;
-    auto version = f->info.version;
-    l.unlock();
-
+    ldpp_dout(dpp, 20) << __PRETTY_FUNCTION__ << ":" << __LINE__
+                      << " entering: tid=" << tid << dendl;
     if (r < 0) {
       ldpp_dout(dpp, -1) << __PRETTY_FUNCTION__ << ":" << __LINE__
     if (r < 0) {
       ldpp_dout(dpp, -1) << __PRETTY_FUNCTION__ << ":" << __LINE__
-                   << " _update_meta failed: r=" << r
+                   << " _update_meta failed:  r=" << r
                    << " tid=" << tid << dendl;
       complete(std::move(p), r);
       return;
     }
                    << " tid=" << tid << dendl;
       complete(std::move(p), r);
       return;
     }
+
     if (canceled) {
     if (canceled) {
+      std::unique_lock l(f->m);
+      auto found = (f->info.journal.contains({fifo::journal_entry::Op::create, new_head_part_num }) ||
+                   f->info.journal.contains({fifo::journal_entry::Op::set_head, new_head_part_num }));
+      auto head_part_num = f->info.head_part_num;
+      auto version = f->info.version;
+
+      l.unlock();
+      if ((head_part_num >= new_head_part_num)) {
+       ldpp_dout(dpp, 20) << __PRETTY_FUNCTION__ << ":" << __LINE__
+                         << " raced, but journaled and processed: i=" << i
+                         << " tid=" << tid << dendl;
+       complete(std::move(p), 0);
+       return;
+      }
       if (i >= MAX_RACE_RETRIES) {
       if (i >= MAX_RACE_RETRIES) {
-       ldpp_dout(dpp, -1) << __PRETTY_FUNCTION__ << ":" << __LINE__
-                     << " canceled too many times, giving up: tid=" << tid << dendl;
        complete(std::move(p), -ECANCELED);
        return;
       }
        complete(std::move(p), -ECANCELED);
        return;
       }
-
-      // Raced, but there's still work to do!
-      if (head_part_num < new_head_num) {
-       canceled = false;
+      if (!found) {
        ++i;
        ++i;
-       ldpp_dout(dpp, 20) << __PRETTY_FUNCTION__ << ":" << __LINE__
-                         << " updating head: i=" << i << " tid=" << tid << dendl;
-       f->_update_meta(dpp, fifo::update{}.head_part_num(new_head_num),
-                       version, &this->canceled, tid, call(std::move(p)));
+       fifo::journal_entry jentry;
+       jentry.op = fifo::journal_entry::Op::set_head;
+       jentry.part_num = new_head_part_num;
+       f->_update_meta(dpp, fifo::update{}
+                       .journal_entries_add({{jentry}}),
+                        version, &canceled, tid, call(std::move(p)));
        return;
        return;
+      } else {
+       ldpp_dout(dpp, 20) << __PRETTY_FUNCTION__ << ":" << __LINE__
+                         << " raced, journaled but not processed: i=" << i
+                         << " tid=" << tid << dendl;
+       canceled = false;
       }
       }
+      // Fall through. We still need to process the journal.
     }
     }
-    ldpp_dout(dpp, 20) << __PRETTY_FUNCTION__ << ":" << __LINE__
-                  << " succeeded : i=" << i << " tid=" << tid << dendl;
-    complete(std::move(p), 0);
+    f->process_journal(dpp, tid, super());
     return;
   }
 };
 
     return;
   }
 };
 
-void FIFO::_prepare_new_head(const DoutPrefixProvider *dpp, std::uint64_t tid, lr::AioCompletion* c)
+void FIFO::_prepare_new_head(const DoutPrefixProvider *dpp, std::int64_t new_head_part_num,
+                            std::uint64_t tid, lr::AioCompletion* c)
 {
   ldpp_dout(dpp, 20) << __PRETTY_FUNCTION__ << ":" << __LINE__
                 << " entering: tid=" << tid << dendl;
   std::unique_lock l(m);
 {
   ldpp_dout(dpp, 20) << __PRETTY_FUNCTION__ << ":" << __LINE__
                 << " entering: tid=" << tid << dendl;
   std::unique_lock l(m);
-  int64_t new_head_num = info.head_part_num + 1;
   auto max_push_part_num = info.max_push_part_num;
   auto version = info.version;
   l.unlock();
 
   auto max_push_part_num = info.max_push_part_num;
   auto version = info.version;
   l.unlock();
 
-  if (max_push_part_num < new_head_num) {
+  if (max_push_part_num < new_head_part_num) {
     ldpp_dout(dpp, 20) << __PRETTY_FUNCTION__ << ":" << __LINE__
                   << " need new part: tid=" << tid << dendl;
     ldpp_dout(dpp, 20) << __PRETTY_FUNCTION__ << ":" << __LINE__
                   << " need new part: tid=" << tid << dendl;
-    auto n = std::make_unique<NewHeadPreparer>(dpp, this, c, true, new_head_num,
+    auto n = std::make_unique<NewHeadPreparer>(dpp, this, c, true, new_head_part_num,
                                               tid);
                                               tid);
-    _prepare_new_part(dpp, true, tid, NewHeadPreparer::call(std::move(n)));
+    _prepare_new_part(dpp, new_head_part_num, true, tid,
+                     NewHeadPreparer::call(std::move(n)));
   } else {
     ldpp_dout(dpp, 20) << __PRETTY_FUNCTION__ << ":" << __LINE__
                   << " updating head: tid=" << tid << dendl;
   } else {
     ldpp_dout(dpp, 20) << __PRETTY_FUNCTION__ << ":" << __LINE__
                   << " updating head: tid=" << tid << dendl;
-    auto n = std::make_unique<NewHeadPreparer>(dpp, this, c, false, new_head_num,
+    auto n = std::make_unique<NewHeadPreparer>(dpp, this, c, false, new_head_part_num,
                                               tid);
     auto np = n.get();
                                               tid);
     auto np = n.get();
-    _update_meta(dpp, fifo::update{}.head_part_num(new_head_num), version,
+    fifo::journal_entry jentry;
+    jentry.op = fifo::journal_entry::Op::set_head;
+    jentry.part_num = new_head_part_num;
+    _update_meta(dpp, fifo::update{}.journal_entries_add({{jentry}}), version,
                 &np->canceled, tid, NewHeadPreparer::call(std::move(n)));
   }
 }
                 &np->canceled, tid, NewHeadPreparer::call(std::move(n)));
   }
 }
@@ -1093,11 +1099,10 @@ int FIFO::push_entries(const DoutPrefixProvider *dpp, const std::deque<cb::list>
                 << " entering: tid=" << tid << dendl;
   std::unique_lock l(m);
   auto head_part_num = info.head_part_num;
                 << " entering: tid=" << tid << dendl;
   std::unique_lock l(m);
   auto head_part_num = info.head_part_num;
-  auto tag = info.head_tag;
   const auto part_oid = info.part_oid(head_part_num);
   l.unlock();
 
   const auto part_oid = info.part_oid(head_part_num);
   l.unlock();
 
-  auto r = push_part(dpp, ioctx, part_oid, tag, data_bufs, tid, y);
+  auto r = push_part(dpp, ioctx, part_oid, data_bufs, tid, y);
   if (r < 0) {
     ldpp_dout(dpp, -1) << __PRETTY_FUNCTION__ << ":" << __LINE__
               << " push_part failed: r=" << r << " tid=" << tid << dendl;
   if (r < 0) {
     ldpp_dout(dpp, -1) << __PRETTY_FUNCTION__ << ":" << __LINE__
               << " push_part failed: r=" << r << " tid=" << tid << dendl;
@@ -1110,15 +1115,13 @@ void FIFO::push_entries(const std::deque<cb::list>& data_bufs,
 {
   std::unique_lock l(m);
   auto head_part_num = info.head_part_num;
 {
   std::unique_lock l(m);
   auto head_part_num = info.head_part_num;
-  auto tag = info.head_tag;
   const auto part_oid = info.part_oid(head_part_num);
   l.unlock();
 
   const auto part_oid = info.part_oid(head_part_num);
   l.unlock();
 
-  push_part(ioctx, part_oid, tag, data_bufs, tid, c);
+  push_part(ioctx, part_oid, data_bufs, tid, c);
 }
 
 int FIFO::trim_part(const DoutPrefixProvider *dpp, int64_t part_num, uint64_t ofs,
 }
 
 int FIFO::trim_part(const DoutPrefixProvider *dpp, int64_t part_num, uint64_t ofs,
-                   std::optional<std::string_view> tag,
                    bool exclusive, std::uint64_t tid,
                    optional_yield y)
 {
                    bool exclusive, std::uint64_t tid,
                    optional_yield y)
 {
@@ -1128,7 +1131,7 @@ int FIFO::trim_part(const DoutPrefixProvider *dpp, int64_t part_num, uint64_t of
   std::unique_lock l(m);
   const auto part_oid = info.part_oid(part_num);
   l.unlock();
   std::unique_lock l(m);
   const auto part_oid = info.part_oid(part_num);
   l.unlock();
-  rgw::cls::fifo::trim_part(&op, tag, ofs, exclusive);
+  rgw::cls::fifo::trim_part(&op, ofs, exclusive);
   auto r = rgw_rados_operate(dpp, ioctx, part_oid, &op, y);
   if (r < 0) {
     ldpp_dout(dpp, -1) << __PRETTY_FUNCTION__ << ":" << __LINE__
   auto r = rgw_rados_operate(dpp, ioctx, part_oid, &op, y);
   if (r < 0) {
     ldpp_dout(dpp, -1) << __PRETTY_FUNCTION__ << ":" << __LINE__
@@ -1138,7 +1141,6 @@ int FIFO::trim_part(const DoutPrefixProvider *dpp, int64_t part_num, uint64_t of
 }
 
 void FIFO::trim_part(const DoutPrefixProvider *dpp, int64_t part_num, uint64_t ofs,
 }
 
 void FIFO::trim_part(const DoutPrefixProvider *dpp, int64_t part_num, uint64_t ofs,
-                    std::optional<std::string_view> tag,
                     bool exclusive, std::uint64_t tid,
                     lr::AioCompletion* c)
 {
                     bool exclusive, std::uint64_t tid,
                     lr::AioCompletion* c)
 {
@@ -1148,7 +1150,7 @@ void FIFO::trim_part(const DoutPrefixProvider *dpp, int64_t part_num, uint64_t o
   std::unique_lock l(m);
   const auto part_oid = info.part_oid(part_num);
   l.unlock();
   std::unique_lock l(m);
   const auto part_oid = info.part_oid(part_num);
   l.unlock();
-  rgw::cls::fifo::trim_part(&op, tag, ofs, exclusive);
+  rgw::cls::fifo::trim_part(&op, ofs, exclusive);
   auto r = ioctx.aio_operate(part_oid, c, &op);
   ceph_assert(r >= 0);
 }
   auto r = ioctx.aio_operate(part_oid, c, &op);
   ceph_assert(r >= 0);
 }
@@ -1316,6 +1318,7 @@ int FIFO::push(const DoutPrefixProvider *dpp, const std::vector<cb::list>& data_
   auto tid = ++next_tid;
   auto max_entry_size = info.params.max_entry_size;
   auto need_new_head = info.need_new_head();
   auto tid = ++next_tid;
   auto max_entry_size = info.params.max_entry_size;
   auto need_new_head = info.need_new_head();
+  auto head_part_num = info.head_part_num;
   l.unlock();
   ldpp_dout(dpp, 20) << __PRETTY_FUNCTION__ << ":" << __LINE__
                 << " entering: tid=" << tid << dendl;
   l.unlock();
   ldpp_dout(dpp, 20) << __PRETTY_FUNCTION__ << ":" << __LINE__
                 << " entering: tid=" << tid << dendl;
@@ -1338,7 +1341,7 @@ int FIFO::push(const DoutPrefixProvider *dpp, const std::vector<cb::list>& data_
   if (need_new_head) {
     ldpp_dout(dpp, 20) << __PRETTY_FUNCTION__ << ":" << __LINE__
                   << " need new head tid=" << tid << dendl;
   if (need_new_head) {
     ldpp_dout(dpp, 20) << __PRETTY_FUNCTION__ << ":" << __LINE__
                   << " need new head tid=" << tid << dendl;
-    r = _prepare_new_head(dpp, tid, y);
+    r = _prepare_new_head(dpp, head_part_num + 1, tid, y);
     if (r < 0) {
       ldpp_dout(dpp, -1) << __PRETTY_FUNCTION__ << ":" << __LINE__
                 << " _prepare_new_head failed: r=" << r
     if (r < 0) {
       ldpp_dout(dpp, -1) << __PRETTY_FUNCTION__ << ":" << __LINE__
                 << " _prepare_new_head failed: r=" << r
@@ -1360,6 +1363,7 @@ int FIFO::push(const DoutPrefixProvider *dpp, const std::vector<cb::list>& data_
                   << " batch=" << batch.size() << " retries=" << retries
                   << " tid=" << tid << dendl;
     std::unique_lock l(m);
                   << " batch=" << batch.size() << " retries=" << retries
                   << " tid=" << tid << dendl;
     std::unique_lock l(m);
+    head_part_num = info.head_part_num;
     auto max_part_size = info.params.max_part_size;
     auto overhead = part_entry_overhead;
     l.unlock();
     auto max_part_size = info.params.max_part_size;
     auto overhead = part_entry_overhead;
     l.unlock();
@@ -1385,8 +1389,8 @@ int FIFO::push(const DoutPrefixProvider *dpp, const std::vector<cb::list>& data_
       canceled = true;
       ++retries;
       ldpp_dout(dpp, 20) << __PRETTY_FUNCTION__ << ":" << __LINE__
       canceled = true;
       ++retries;
       ldpp_dout(dpp, 20) << __PRETTY_FUNCTION__ << ":" << __LINE__
-                    << " need new head tid=" << tid << dendl;
-      r = _prepare_new_head(dpp, tid, y);
+                        << " need new head tid=" << tid << dendl;
+      r = _prepare_new_head(dpp, head_part_num + 1, tid, y);
       if (r < 0) {
        ldpp_dout(dpp, -1) << __PRETTY_FUNCTION__ << ":" << __LINE__
                   << " prepare_new_head failed: r=" << r
       if (r < 0) {
        ldpp_dout(dpp, -1) << __PRETTY_FUNCTION__ << ":" << __LINE__
                   << " prepare_new_head failed: r=" << r
@@ -1396,6 +1400,22 @@ int FIFO::push(const DoutPrefixProvider *dpp, const std::vector<cb::list>& data_
       r = 0;
       continue;
     }
       r = 0;
       continue;
     }
+    if (r == -ENOENT) {
+      ldpp_dout(dpp, 20) << __PRETTY_FUNCTION__ << ":" << __LINE__
+                        << " racing client trimmed part, rereading metadata "
+                        << "tid=" << tid << dendl;
+      canceled = true;
+      ++retries;
+      r = read_meta(dpp, y);
+      if (r < 0) {
+       ldpp_dout(dpp, -1) << __PRETTY_FUNCTION__ << ":" << __LINE__
+                  << " read_meta failed: r=" << r
+                  << " tid=" << tid << dendl;
+       return r;
+      }
+      r = 0;
+      continue;
+    }
     if (r < 0) {
       ldpp_dout(dpp, -1) << __PRETTY_FUNCTION__ << ":" << __LINE__
                 << " push_entries failed: r=" << r
     if (r < 0) {
       ldpp_dout(dpp, -1) << __PRETTY_FUNCTION__ << ":" << __LINE__
                 << " push_entries failed: r=" << r
@@ -1428,13 +1448,15 @@ struct Pusher : public Completion<Pusher> {
   std::deque<cb::list> remaining;
   std::deque<cb::list> batch;
   int i = 0;
   std::deque<cb::list> remaining;
   std::deque<cb::list> batch;
   int i = 0;
+  std::int64_t head_part_num;
   std::uint64_t tid;
   std::uint64_t tid;
-  bool new_heading = false;
+  enum { pushing, new_heading, meta_reading } state = pushing;
 
   void prep_then_push(const DoutPrefixProvider *dpp, Ptr&& p, const unsigned successes) {
     std::unique_lock l(f->m);
     auto max_part_size = f->info.params.max_part_size;
     auto part_entry_overhead = f->part_entry_overhead;
 
   void prep_then_push(const DoutPrefixProvider *dpp, Ptr&& p, const unsigned successes) {
     std::unique_lock l(f->m);
     auto max_part_size = f->info.params.max_part_size;
     auto part_entry_overhead = f->part_entry_overhead;
+    head_part_num = f->info.head_part_num;
     l.unlock();
 
     ldpp_dout(dpp, 20) << __PRETTY_FUNCTION__ << ":" << __LINE__
     l.unlock();
 
     ldpp_dout(dpp, 20) << __PRETTY_FUNCTION__ << ":" << __LINE__
@@ -1483,18 +1505,37 @@ struct Pusher : public Completion<Pusher> {
   }
 
   void new_head(const DoutPrefixProvider *dpp, Ptr&& p) {
   }
 
   void new_head(const DoutPrefixProvider *dpp, Ptr&& p) {
-    new_heading = true;
-    f->_prepare_new_head(dpp, tid, call(std::move(p)));
+    state = new_heading;
+    f->_prepare_new_head(dpp, head_part_num + 1, tid, call(std::move(p)));
+  }
+
+  void read_meta(const DoutPrefixProvider *dpp, Ptr&& p) {
+    ++i;
+    state = meta_reading;
+    f->read_meta(dpp, tid, call(std::move(p)));
   }
 
   void handle(const DoutPrefixProvider *dpp, Ptr&& p, int r) {
   }
 
   void handle(const DoutPrefixProvider *dpp, Ptr&& p, int r) {
-    if (!new_heading) {
+    switch (state) {
+    case pushing:
       if (r == -ERANGE) {
        ldpp_dout(dpp, 20) << __PRETTY_FUNCTION__ << ":" << __LINE__
                       << " need new head tid=" << tid << dendl;
        new_head(dpp, std::move(p));
        return;
       }
       if (r == -ERANGE) {
        ldpp_dout(dpp, 20) << __PRETTY_FUNCTION__ << ":" << __LINE__
                       << " need new head tid=" << tid << dendl;
        new_head(dpp, std::move(p));
        return;
       }
+      if (r == -ENOENT) {
+       if (i > MAX_RACE_RETRIES) {
+         ldpp_dout(dpp, -1) << __PRETTY_FUNCTION__ << ":" << __LINE__
+                            << " racing client deleted part, but we're out"
+                            << " of retries: tid=" << tid << dendl;
+         complete(std::move(p), r);
+       }
+       ldpp_dout(dpp, 20) << __PRETTY_FUNCTION__ << ":" << __LINE__
+                          << " racing client deleted part: tid=" << tid << dendl;
+       read_meta(dpp, std::move(p));
+       return;
+      }
       if (r < 0) {
        ldpp_dout(dpp, -1) << __PRETTY_FUNCTION__ << ":" << __LINE__
                      << " push_entries failed: r=" << r
       if (r < 0) {
        ldpp_dout(dpp, -1) << __PRETTY_FUNCTION__ << ":" << __LINE__
                      << " push_entries failed: r=" << r
@@ -1504,7 +1545,9 @@ struct Pusher : public Completion<Pusher> {
       }
       i = 0; // We've made forward progress, so reset the race counter!
       prep_then_push(dpp, std::move(p), r);
       }
       i = 0; // We've made forward progress, so reset the race counter!
       prep_then_push(dpp, std::move(p), r);
-    } else {
+      break;
+
+    case new_heading:
       if (r < 0) {
        ldpp_dout(dpp, -1) << __PRETTY_FUNCTION__ << ":" << __LINE__
                      << " prepare_new_head failed: r=" << r
       if (r < 0) {
        ldpp_dout(dpp, -1) << __PRETTY_FUNCTION__ << ":" << __LINE__
                      << " prepare_new_head failed: r=" << r
@@ -1512,8 +1555,21 @@ struct Pusher : public Completion<Pusher> {
        complete(std::move(p), r);
        return;
       }
        complete(std::move(p), r);
        return;
       }
-      new_heading = false;
+      state = pushing;
       handle_new_head(dpp, std::move(p), r);
       handle_new_head(dpp, std::move(p), r);
+      break;
+
+    case meta_reading:
+      if (r < 0) {
+       ldpp_dout(dpp, -1) << __PRETTY_FUNCTION__ << ":" << __LINE__
+                     << " read_meta failed: r=" << r
+                     << " tid=" << tid << dendl;
+       complete(std::move(p), r);
+       return;
+      }
+      state = pushing;
+      prep_then_push(dpp, std::move(p), r);
+      break;
     }
   }
 
     }
   }
 
@@ -1541,9 +1597,10 @@ struct Pusher : public Completion<Pusher> {
   }
 
   Pusher(const DoutPrefixProvider *dpp, FIFO* f, std::deque<cb::list>&& remaining,
   }
 
   Pusher(const DoutPrefixProvider *dpp, FIFO* f, std::deque<cb::list>&& remaining,
-        std::uint64_t tid, lr::AioCompletion* super)
+        std::int64_t head_part_num, std::uint64_t tid,
+        lr::AioCompletion* super)
     : Completion(dpp, super), f(f), remaining(std::move(remaining)),
     : Completion(dpp, super), f(f), remaining(std::move(remaining)),
-      tid(tid) {}
+      head_part_num(head_part_num), tid(tid) {}
 };
 
 void FIFO::push(const DoutPrefixProvider *dpp, const std::vector<cb::list>& data_bufs,
 };
 
 void FIFO::push(const DoutPrefixProvider *dpp, const std::vector<cb::list>& data_bufs,
@@ -1553,11 +1610,12 @@ void FIFO::push(const DoutPrefixProvider *dpp, const std::vector<cb::list>& data
   auto tid = ++next_tid;
   auto max_entry_size = info.params.max_entry_size;
   auto need_new_head = info.need_new_head();
   auto tid = ++next_tid;
   auto max_entry_size = info.params.max_entry_size;
   auto need_new_head = info.need_new_head();
+  auto head_part_num = info.head_part_num;
   l.unlock();
   ldpp_dout(dpp, 20) << __PRETTY_FUNCTION__ << ":" << __LINE__
                 << " entering: tid=" << tid << dendl;
   auto p = std::make_unique<Pusher>(dpp, this, std::deque<cb::list>(data_bufs.begin(), data_bufs.end()),
   l.unlock();
   ldpp_dout(dpp, 20) << __PRETTY_FUNCTION__ << ":" << __LINE__
                 << " entering: tid=" << tid << dendl;
   auto p = std::make_unique<Pusher>(dpp, this, std::deque<cb::list>(data_bufs.begin(), data_bufs.end()),
-                                   tid, c);
+                                   head_part_num, tid, c);
   // Validate sizes
   for (const auto& bl : data_bufs) {
     if (bl.length() > max_entry_size) {
   // Validate sizes
   for (const auto& bl : data_bufs) {
     if (bl.length() > max_entry_size) {
@@ -1624,8 +1682,8 @@ int FIFO::list(const DoutPrefixProvider *dpp, int max_entries,
     auto part_oid = info.part_oid(part_num);
     l.unlock();
 
     auto part_oid = info.part_oid(part_num);
     l.unlock();
 
-    r = list_part(dpp, ioctx, part_oid, {}, ofs, max_entries, &entries,
-                 &part_more, &part_full, nullptr, tid, y);
+    r = list_part(dpp, ioctx, part_oid, ofs, max_entries, &entries,
+                 &part_more, &part_full, tid, y);
     if (r == -ENOENT) {
       ldpp_dout(dpp, 20) << __PRETTY_FUNCTION__ << ":" << __LINE__
                     << " missing part, rereading metadata"
     if (r == -ENOENT) {
       ldpp_dout(dpp, 20) << __PRETTY_FUNCTION__ << ":" << __LINE__
                     << " missing part, rereading metadata"
@@ -1737,7 +1795,7 @@ int FIFO::trim(const DoutPrefixProvider *dpp, std::string_view markstr, bool exc
                   << " pn=" << pn << " tid=" << tid << dendl;
     std::unique_lock l(m);
     l.unlock();
                   << " pn=" << pn << " tid=" << tid << dendl;
     std::unique_lock l(m);
     l.unlock();
-    r = trim_part(dpp, pn, max_part_size, std::nullopt, false, tid, y);
+    r = trim_part(dpp, pn, max_part_size, false, tid, y);
     if (r < 0 && r == -ENOENT) {
       ldpp_dout(dpp, -1) << __PRETTY_FUNCTION__ << ":" << __LINE__
                 << " trim_part failed: r=" << r
     if (r < 0 && r == -ENOENT) {
       ldpp_dout(dpp, -1) << __PRETTY_FUNCTION__ << ":" << __LINE__
                 << " trim_part failed: r=" << r
@@ -1746,7 +1804,7 @@ int FIFO::trim(const DoutPrefixProvider *dpp, std::string_view markstr, bool exc
     }
     ++pn;
   }
     }
     ++pn;
   }
-  r = trim_part(dpp, part_num, ofs, std::nullopt, exclusive, tid, y);
+  r = trim_part(dpp, part_num, ofs, exclusive, tid, y);
   if (r < 0 && r != -ENOENT) {
     ldpp_dout(dpp, -1) << __PRETTY_FUNCTION__ << ":" << __LINE__
               << " trim_part failed: r=" << r
   if (r < 0 && r != -ENOENT) {
     ldpp_dout(dpp, -1) << __PRETTY_FUNCTION__ << ":" << __LINE__
               << " trim_part failed: r=" << r
@@ -1839,13 +1897,12 @@ struct Trimmer : public Completion<Trimmer> {
       if (pn < part_num) {
        ldpp_dout(dpp, 20) << __PRETTY_FUNCTION__ << ":" << __LINE__
                       << " pn=" << pn << " tid=" << tid << dendl;
       if (pn < part_num) {
        ldpp_dout(dpp, 20) << __PRETTY_FUNCTION__ << ":" << __LINE__
                       << " pn=" << pn << " tid=" << tid << dendl;
-       fifo->trim_part(dpp, pn++, max_part_size, std::nullopt,
-                       false, tid, call(std::move(p)));
+       fifo->trim_part(dpp, pn++, max_part_size, false, tid,
+                       call(std::move(p)));
       } else {
        update = true;
        canceled = tail_part_num < part_num;
       } else {
        update = true;
        canceled = tail_part_num < part_num;
-       fifo->trim_part(dpp, part_num, ofs, std::nullopt, exclusive, tid,
-                       call(std::move(p)));
+       fifo->trim_part(dpp, part_num, ofs, exclusive, tid, call(std::move(p)));
       }
       return;
     }
       }
       return;
     }
@@ -1872,8 +1929,8 @@ struct Trimmer : public Completion<Trimmer> {
        std::unique_lock l(fifo->m);
        const auto max_part_size = fifo->info.params.max_part_size;
        l.unlock();
        std::unique_lock l(fifo->m);
        const auto max_part_size = fifo->info.params.max_part_size;
        l.unlock();
-       fifo->trim_part(dpp, pn++, max_part_size, std::nullopt,
-                       false, tid, call(std::move(p)));
+       fifo->trim_part(dpp, pn++, max_part_size, false, tid,
+                       call(std::move(p)));
        return;
       }
 
        return;
       }
 
@@ -1882,8 +1939,7 @@ struct Trimmer : public Completion<Trimmer> {
       l.unlock();
       update = true;
       canceled = tail_part_num < part_num;
       l.unlock();
       update = true;
       canceled = tail_part_num < part_num;
-      fifo->trim_part(dpp, part_num, ofs, std::nullopt, exclusive, tid,
-                     call(std::move(p)));
+      fifo->trim_part(dpp, part_num, ofs, exclusive, tid, call(std::move(p)));
       return;
     }
 
       return;
     }
 
@@ -1944,8 +2000,7 @@ void FIFO::trim(const DoutPrefixProvider *dpp, std::string_view markstr, bool ex
   } else {
     trimmer->update = true;
   }
   } else {
     trimmer->update = true;
   }
-  trim_part(dpp, pn, ofs, std::nullopt, exclusive,
-           tid, Trimmer::call(std::move(trimmer)));
+  trim_part(dpp, pn, ofs, exclusive, tid, Trimmer::call(std::move(trimmer)));
 }
 
 int FIFO::get_part_info(const DoutPrefixProvider *dpp, int64_t part_num,
 }
 
 int FIFO::get_part_info(const DoutPrefixProvider *dpp, int64_t part_num,
@@ -2051,8 +2106,8 @@ private:
   FIFO* const fifo;
 
   std::vector<fifo::journal_entry> processed;
   FIFO* const fifo;
 
   std::vector<fifo::journal_entry> processed;
-  std::multimap<std::int64_t, fifo::journal_entry> journal;
-  std::multimap<std::int64_t, fifo::journal_entry>::iterator iter;
+  decltype(fifo->info.journal) journal;
+  decltype(journal)::iterator iter;
   std::int64_t new_tail;
   std::int64_t new_head;
   std::int64_t new_max;
   std::int64_t new_tail;
   std::int64_t new_head;
   std::int64_t new_max;
@@ -2066,8 +2121,7 @@ private:
     pp_callback,
   } state;
 
     pp_callback,
   } state;
 
-  void create_part(const DoutPrefixProvider *dpp, Ptr&& p, int64_t part_num,
-                  std::string_view tag) {
+  void create_part(const DoutPrefixProvider *dpp, Ptr&& p, int64_t part_num) {
     ldpp_dout(dpp, 20) << __PRETTY_FUNCTION__ << ":" << __LINE__
                         << " entering: tid=" << tid << dendl;
     state = entry_callback;
     ldpp_dout(dpp, 20) << __PRETTY_FUNCTION__ << ":" << __LINE__
                         << " entering: tid=" << tid << dendl;
     state = entry_callback;
@@ -2075,7 +2129,7 @@ private:
     op.create(false); /* We don't need exclusivity, part_init ensures
                         we're creating from the  same journal entry. */
     std::unique_lock l(fifo->m);
     op.create(false); /* We don't need exclusivity, part_init ensures
                         we're creating from the  same journal entry. */
     std::unique_lock l(fifo->m);
-    part_init(&op, tag, fifo->info.params);
+    part_init(&op, fifo->info.params);
     auto oid = fifo->info.part_oid(part_num);
     l.unlock();
     auto r = fifo->ioctx.aio_operate(oid, call(std::move(p)), &op);
     auto oid = fifo->info.part_oid(part_num);
     l.unlock();
     auto r = fifo->ioctx.aio_operate(oid, call(std::move(p)), &op);
@@ -2083,8 +2137,7 @@ private:
     return;
   }
 
     return;
   }
 
-  void remove_part(const DoutPrefixProvider *dpp, Ptr&& p, int64_t part_num,
-                  std::string_view tag) {
+  void remove_part(const DoutPrefixProvider *dpp, Ptr&& p, int64_t part_num) {
     ldpp_dout(dpp, 20) << __PRETTY_FUNCTION__ << ":" << __LINE__
                         << " entering: tid=" << tid << dendl;
     state = entry_callback;
     ldpp_dout(dpp, 20) << __PRETTY_FUNCTION__ << ":" << __LINE__
                         << " entering: tid=" << tid << dendl;
     state = entry_callback;
@@ -2211,13 +2264,9 @@ public:
       std::vector<fifo::journal_entry> new_processed;
       std::unique_lock l(fifo->m);
       for (auto& e : processed) {
       std::vector<fifo::journal_entry> new_processed;
       std::unique_lock l(fifo->m);
       for (auto& e : processed) {
-       auto jiter = fifo->info.journal.find(e.part_num);
-       /* journal entry was already processed */
-       if (jiter == fifo->info.journal.end() ||
-           !(jiter->second == e)) {
-         continue;
+       if (fifo->info.journal.contains(e)) {
+         new_processed.push_back(e);
        }
        }
-       new_processed.push_back(e);
       }
       processed = std::move(new_processed);
     }
       }
       processed = std::move(new_processed);
     }
@@ -2269,10 +2318,10 @@ public:
       ldpp_dout(dpp, 20) << __PRETTY_FUNCTION__ << ":" << __LINE__
                           << " processing entry: entry=" << *iter
                           << " tid=" << tid << dendl;
       ldpp_dout(dpp, 20) << __PRETTY_FUNCTION__ << ":" << __LINE__
                           << " processing entry: entry=" << *iter
                           << " tid=" << tid << dendl;
-      const auto entry = iter->second;
+      const auto entry = *iter;
       switch (entry.op) {
       case fifo::journal_entry::Op::create:
       switch (entry.op) {
       case fifo::journal_entry::Op::create:
-       create_part(dpp, std::move(p), entry.part_num, entry.part_tag);
+       create_part(dpp, std::move(p), entry.part_num);
        return;
       case fifo::journal_entry::Op::set_head:
        if (entry.part_num > new_head) {
        return;
       case fifo::journal_entry::Op::set_head:
        if (entry.part_num > new_head) {
@@ -2282,7 +2331,7 @@ public:
        ++iter;
        continue;
       case fifo::journal_entry::Op::remove:
        ++iter;
        continue;
       case fifo::journal_entry::Op::remove:
-       remove_part(dpp, std::move(p), entry.part_num, entry.part_tag);
+       remove_part(dpp, std::move(p), entry.part_num);
        return;
       default:
        ldpp_dout(dpp, -1) << __PRETTY_FUNCTION__ << ":" << __LINE__
        return;
       default:
        ldpp_dout(dpp, -1) << __PRETTY_FUNCTION__ << ":" << __LINE__
@@ -2301,7 +2350,7 @@ public:
                         << " entering: tid=" << tid << dendl;
     switch (state) {
     case entry_callback:
                         << " entering: tid=" << tid << dendl;
     switch (state) {
     case entry_callback:
-      finish_je(dpp, std::move(p), r, iter->second);
+      finish_je(dpp, std::move(p), r, *iter);
       return;
     case pp_callback:
       auto c = canceled;
       return;
     case pp_callback:
       auto c = canceled;
@@ -2377,9 +2426,8 @@ public:
       l.unlock();
 
       read = false;
       l.unlock();
 
       read = false;
-      auto op = list_part(f->cct, {}, ofs, max_entries, &r_out,
-                         &entries, &part_more, &part_full,
-                         nullptr, tid);
+      auto op = list_part(f->cct, ofs, max_entries, &r_out,
+                         &entries, &part_more, &part_full, tid);
       f->ioctx.aio_operate(part_oid, call(std::move(p)), &op, nullptr);
     } else {
       complete(std::move(p), 0);
       f->ioctx.aio_operate(part_oid, call(std::move(p)), &op, nullptr);
     } else {
       complete(std::move(p), 0);
index 9a35e4dd251ce4024bda6ad1212a8acae0cb688c..84d43d44177699f3d84f7bb53adf49d8c601f0cf 100644 (file)
@@ -127,8 +127,6 @@ class FIFO {
        std::string oid)
     : ioctx(std::move(ioc)), oid(oid) {}
 
        std::string oid)
     : ioctx(std::move(ioc)), oid(oid) {}
 
-  std::string generate_tag() const;
-
   int apply_update(const DoutPrefixProvider *dpp,
                    fifo::info* info,
                   const fifo::objv& objv,
   int apply_update(const DoutPrefixProvider *dpp,
                    fifo::info* info,
                   const fifo::objv& objv,
@@ -140,26 +138,25 @@ class FIFO {
   void _update_meta(const DoutPrefixProvider *dpp, const fifo::update& update,
                    fifo::objv version, bool* pcanceled,
                    std::uint64_t tid, lr::AioCompletion* c);
   void _update_meta(const DoutPrefixProvider *dpp, const fifo::update& update,
                    fifo::objv version, bool* pcanceled,
                    std::uint64_t tid, lr::AioCompletion* c);
-  int create_part(const DoutPrefixProvider *dpp, int64_t part_num, std::string_view tag, std::uint64_t tid,
+  int create_part(const DoutPrefixProvider *dpp, int64_t part_num, std::uint64_t tid,
                  optional_yield y);
                  optional_yield y);
-  int remove_part(const DoutPrefixProvider *dpp, int64_t part_num, std::string_view tag, std::uint64_t tid,
+  int remove_part(const DoutPrefixProvider *dpp, int64_t part_num, std::uint64_t tid,
                  optional_yield y);
   int process_journal(const DoutPrefixProvider *dpp, std::uint64_t tid, optional_yield y);
   void process_journal(const DoutPrefixProvider *dpp, std::uint64_t tid, lr::AioCompletion* c);
                  optional_yield y);
   int process_journal(const DoutPrefixProvider *dpp, std::uint64_t tid, optional_yield y);
   void process_journal(const DoutPrefixProvider *dpp, std::uint64_t tid, lr::AioCompletion* c);
-  int _prepare_new_part(const DoutPrefixProvider *dpp, bool is_head, std::uint64_t tid, optional_yield y);
-  void _prepare_new_part(const DoutPrefixProvider *dpp, bool is_head, std::uint64_t tid, lr::AioCompletion* c);
-  int _prepare_new_head(const DoutPrefixProvider *dpp, std::uint64_t tid, optional_yield y);
-  void _prepare_new_head(const DoutPrefixProvider *dpp, std::uint64_t tid, lr::AioCompletion* c);
+  int _prepare_new_part(const DoutPrefixProvider *dpp, std::int64_t new_part_num, bool is_head, std::uint64_t tid, optional_yield y);
+  void _prepare_new_part(const DoutPrefixProvider *dpp, std::int64_t new_part_num, bool is_head, std::uint64_t tid, lr::AioCompletion* c);
+  int _prepare_new_head(const DoutPrefixProvider *dpp, std::int64_t new_head_part_num,
+                       std::uint64_t tid, optional_yield y);
+  void _prepare_new_head(const DoutPrefixProvider *dpp, std::int64_t new_head_part_num, std::uint64_t tid, lr::AioCompletion* c);
   int push_entries(const DoutPrefixProvider *dpp, const std::deque<cb::list>& data_bufs,
                   std::uint64_t tid, optional_yield y);
   void push_entries(const std::deque<cb::list>& data_bufs,
                    std::uint64_t tid, lr::AioCompletion* c);
   int trim_part(const DoutPrefixProvider *dpp, int64_t part_num, uint64_t ofs,
   int push_entries(const DoutPrefixProvider *dpp, const std::deque<cb::list>& data_bufs,
                   std::uint64_t tid, optional_yield y);
   void push_entries(const std::deque<cb::list>& data_bufs,
                    std::uint64_t tid, lr::AioCompletion* c);
   int trim_part(const DoutPrefixProvider *dpp, int64_t part_num, uint64_t ofs,
-               std::optional<std::string_view> tag, bool exclusive,
-               std::uint64_t tid, optional_yield y);
+               bool exclusive, std::uint64_t tid, optional_yield y);
   void trim_part(const DoutPrefixProvider *dpp, int64_t part_num, uint64_t ofs,
   void trim_part(const DoutPrefixProvider *dpp, int64_t part_num, uint64_t ofs,
-                std::optional<std::string_view> tag, bool exclusive,
-                std::uint64_t tid, lr::AioCompletion* c);
+                bool exclusive, std::uint64_t tid, lr::AioCompletion* c);
 
   /// Force refresh of metadata, yielding/blocking style
   int read_meta(const DoutPrefixProvider *dpp, std::uint64_t tid, optional_yield y);
 
   /// Force refresh of metadata, yielding/blocking style
   int read_meta(const DoutPrefixProvider *dpp, std::uint64_t tid, optional_yield y);
index 18c4140e60b31d6ada5113eb4e7f642b920eab80..6f030f8e5016eaa9c433a98f71fa989e1a75e2d8 100644 (file)
@@ -340,7 +340,7 @@ namespace rgw {
               << e.what() << dendl;
     }
     if (should_log) {
               << e.what() << dendl;
     }
     if (should_log) {
-      rgw_log_op(nullptr /* !rest */, s, (op ? op->name() : "unknown"), olog);
+      rgw_log_op(nullptr /* !rest */, s, op, olog);
     }
 
     int http_ret = s->err.http_ret;
     }
 
     int http_ret = s->err.http_ret;
index a18ac23d7807b541a1af4df271121d5d40487e15..fd8188e2ddabb6719e447194f19ce687e72cbcf3 100644 (file)
@@ -369,6 +369,9 @@ void usage()
   cout << "   --data-extra-pool=<pool>  placement target data extra (non-ec) pool\n";
   cout << "   --placement-index-type=<type>\n";
   cout << "                             placement target index type (normal, indexless, or #id)\n";
   cout << "   --data-extra-pool=<pool>  placement target data extra (non-ec) pool\n";
   cout << "   --placement-index-type=<type>\n";
   cout << "                             placement target index type (normal, indexless, or #id)\n";
+  cout << "   --placement-inline-data=<true>\n";
+  cout << "                             set whether the placement target is configured to store a data\n";
+  cout << "                             chunk inline in head objects\n";
   cout << "   --compression=<type>      placement target compression type (plugin name or empty/none)\n";
   cout << "   --tier-type=<type>        zone tier type\n";
   cout << "   --tier-config=<k>=<v>[,...]\n";
   cout << "   --compression=<type>      placement target compression type (plugin name or empty/none)\n";
   cout << "   --tier-type=<type>        zone tier type\n";
   cout << "   --tier-config=<k>=<v>[,...]\n";
@@ -3478,6 +3481,8 @@ int main(int argc, const char **argv)
   list<string> tags;
   list<string> tags_add;
   list<string> tags_rm;
   list<string> tags;
   list<string> tags_add;
   list<string> tags_rm;
+  int placement_inline_data = true;
+  bool placement_inline_data_specified = false;
 
   int64_t max_objects = -1;
   int64_t max_size = -1;
 
   int64_t max_objects = -1;
   int64_t max_size = -1;
@@ -3515,6 +3520,7 @@ int main(int argc, const char **argv)
   int num_shards = 0;
   bool num_shards_specified = false;
   std::optional<int> bucket_index_max_shards;
   int num_shards = 0;
   bool num_shards_specified = false;
   std::optional<int> bucket_index_max_shards;
+
   int max_concurrent_ios = 32;
   uint64_t orphan_stale_secs = (24 * 3600);
   int detail = false;
   int max_concurrent_ios = 32;
   uint64_t orphan_stale_secs = (24 * 3600);
   int detail = false;
@@ -3843,6 +3849,9 @@ int main(int argc, const char **argv)
      // do nothing
     } else if (ceph_argparse_binary_flag(args, i, &inconsistent_index, NULL, "--inconsistent-index", (char*)NULL)) {
      // do nothing
      // do nothing
     } else if (ceph_argparse_binary_flag(args, i, &inconsistent_index, NULL, "--inconsistent-index", (char*)NULL)) {
      // do nothing
+    } else if (ceph_argparse_binary_flag(args, i, &placement_inline_data, NULL, "--placement-inline-data", (char*)NULL)) {
+      placement_inline_data_specified = true;
+     // do nothing
     } else if (ceph_argparse_witharg(args, i, &val, "--caps", (char*)NULL)) {
       caps = val;
     } else if (ceph_argparse_witharg(args, i, &val, "--infile", (char*)NULL)) {
     } else if (ceph_argparse_witharg(args, i, &val, "--caps", (char*)NULL)) {
       caps = val;
     } else if (ceph_argparse_witharg(args, i, &val, "--infile", (char*)NULL)) {
@@ -4241,7 +4250,9 @@ int main(int argc, const char **argv)
                         OPT::OBJECTS_EXPIRE_STALE_RM,
                         OPT::LC_PROCESS,
        OPT::BUCKET_SYNC_RUN,
                         OPT::OBJECTS_EXPIRE_STALE_RM,
                         OPT::LC_PROCESS,
        OPT::BUCKET_SYNC_RUN,
-       OPT::DATA_SYNC_RUN
+       OPT::DATA_SYNC_RUN,
+       OPT::BUCKET_REWRITE,
+       OPT::OBJECT_REWRITE
     };
 
     raw_storage_op = (raw_storage_ops_list.find(opt_cmd) != raw_storage_ops_list.end() ||
     };
 
     raw_storage_op = (raw_storage_ops_list.find(opt_cmd) != raw_storage_ops_list.end() ||
@@ -5975,6 +5986,9 @@ int main(int argc, const char **argv)
           if (index_type_specified) {
            info.index_type = placement_index_type;
           }
           if (index_type_specified) {
            info.index_type = placement_index_type;
           }
+          if (placement_inline_data_specified) {
+            info.inline_data = placement_inline_data;
+          }
 
           ret = check_pool_support_omap(info.get_data_extra_pool());
           if (ret < 0) {
 
           ret = check_pool_support_omap(info.get_data_extra_pool());
           if (ret < 0) {
@@ -6062,7 +6076,9 @@ int main(int argc, const char **argv)
                                         OPT::METADATA_RM, OPT::RESHARD_CANCEL,
                                         OPT::RESHARD_ADD, OPT::MFA_CREATE,
                                         OPT::MFA_REMOVE, OPT::MFA_RESYNC,
                                         OPT::METADATA_RM, OPT::RESHARD_CANCEL,
                                         OPT::RESHARD_ADD, OPT::MFA_CREATE,
                                         OPT::MFA_REMOVE, OPT::MFA_RESYNC,
-                                        OPT::CAPS_ADD, OPT::CAPS_RM};
+                                        OPT::CAPS_ADD, OPT::CAPS_RM,
+                                        OPT::ROLE_CREATE, OPT::ROLE_DELETE,
+                                        OPT::ROLE_POLICY_PUT, OPT::ROLE_POLICY_DELETE};
 
   bool print_warning_message = (non_master_ops_list.find(opt_cmd) != non_master_ops_list.end() &&
                                 non_master_cmd);
 
   bool print_warning_message = (non_master_ops_list.find(opt_cmd) != non_master_ops_list.end() &&
                                 non_master_cmd);
@@ -6401,7 +6417,7 @@ int main(int argc, const char **argv)
         return -EINVAL;
       }
       std::unique_ptr<rgw::sal::RGWRole> role = store->get_role(role_name, tenant, path, assume_role_doc);
         return -EINVAL;
       }
       std::unique_ptr<rgw::sal::RGWRole> role = store->get_role(role_name, tenant, path, assume_role_doc);
-      ret = role->create(dpp(), true, null_yield);
+      ret = role->create(dpp(), true, "", null_yield);
       if (ret < 0) {
         return -ret;
       }
       if (ret < 0) {
         return -ret;
       }
@@ -7661,6 +7677,8 @@ next:
       }
     }
 
       }
     }
 
+    bool resharding_underway = true;
+
     if (bucket_initable) {
       // we did not encounter an error, so let's work with the bucket
       RGWBucketReshard br(static_cast<rgw::sal::RadosStore*>(store), bucket->get_info(), bucket->get_attrs(),
     if (bucket_initable) {
       // we did not encounter an error, so let's work with the bucket
       RGWBucketReshard br(static_cast<rgw::sal::RadosStore*>(store), bucket->get_info(), bucket->get_attrs(),
@@ -7669,14 +7687,17 @@ next:
       if (ret < 0) {
         if (ret == -EBUSY) {
           cerr << "There is ongoing resharding, please retry after " <<
       if (ret < 0) {
         if (ret == -EBUSY) {
           cerr << "There is ongoing resharding, please retry after " <<
-            store->ctx()->_conf.get_val<uint64_t>(
-              "rgw_reshard_bucket_lock_duration") <<
-            " seconds " << std::endl;
+            store->ctx()->_conf.get_val<uint64_t>("rgw_reshard_bucket_lock_duration") <<
+            " seconds." << std::endl;
+         return -ret;
+       } else if (ret == -EINVAL) {
+         resharding_underway = false;
+         // we can continue and try to unschedule
         } else {
         } else {
-          cerr << "Error canceling bucket " << bucket_name <<
-            " resharding: " << cpp_strerror(-ret) << std::endl;
+          cerr << "Error cancelling bucket \"" << bucket_name <<
+            "\" resharding: " << cpp_strerror(-ret) << std::endl;
+         return -ret;
         }
         }
-        return ret;
       }
     }
 
       }
     }
 
@@ -7685,13 +7706,22 @@ next:
     cls_rgw_reshard_entry entry;
     entry.tenant = tenant;
     entry.bucket_name = bucket_name;
     cls_rgw_reshard_entry entry;
     entry.tenant = tenant;
     entry.bucket_name = bucket_name;
-    //entry.bucket_id = bucket_id;
 
     ret = reshard.remove(dpp(), entry);
 
     ret = reshard.remove(dpp(), entry);
-    if (ret < 0 && ret != -ENOENT) {
-      cerr << "Error in updating reshard log with bucket " <<
-        bucket_name << ": " << cpp_strerror(-ret) << std::endl;
-      return ret;
+    if (ret == -ENOENT) {
+      if (!resharding_underway) {
+       cerr << "Error, bucket \"" << bucket_name <<
+         "\" is neither undergoing resharding nor scheduled to undergo "
+         "resharding." << std::endl;
+       return EINVAL;
+      } else {
+       // we cancelled underway resharding above, so we're good
+       return 0;
+      }
+    } else if (ret < 0) {
+      cerr << "Error in updating reshard log with bucket \"" <<
+        bucket_name << "\": " << cpp_strerror(-ret) << std::endl;
+      return -ret;
     }
   } // OPT_RESHARD_CANCEL
 
     }
   } // OPT_RESHARD_CANCEL
 
@@ -8039,7 +8069,7 @@ next:
   }
 
   if (opt_cmd == OPT::USER_CHECK) {
   }
 
   if (opt_cmd == OPT::USER_CHECK) {
-    check_bad_user_bucket_mapping(store, user.get(), fix, null_yield, dpp());
+    check_bad_user_bucket_mapping(store, *user.get(), fix, null_yield, dpp());
   }
 
   if (opt_cmd == OPT::USER_STATS) {
   }
 
   if (opt_cmd == OPT::USER_STATS) {
index 82d5d43f8b8d141b0916eb1f527fbd73e29fdce2..a0ec0bf5c0683a33ab0e66be52be37deafbec83a 100644 (file)
@@ -123,6 +123,7 @@ size_t ClientIO::send_100_continue()
   const size_t sent = txbuf.sputn(HTTTP_100_CONTINUE,
                                   sizeof(HTTTP_100_CONTINUE) - 1);
   flush();
   const size_t sent = txbuf.sputn(HTTTP_100_CONTINUE,
                                   sizeof(HTTTP_100_CONTINUE) - 1);
   flush();
+  sent100continue = true;
   return sent;
 }
 
   return sent;
 }
 
index a595b0351997ba452472c2bf7dd5f9ead1beebcf..8b03fe2e3da8856cefd1ecb587f4c991693088ec 100644 (file)
@@ -30,6 +30,7 @@ class ClientIO : public io::RestfulClient,
   RGWEnv env;
 
   rgw::io::StaticOutputBufferer<> txbuf;
   RGWEnv env;
 
   rgw::io::StaticOutputBufferer<> txbuf;
+  bool sent100continue = false;
 
  public:
   ClientIO(parser_type& parser, bool is_ssl,
 
  public:
   ClientIO(parser_type& parser, bool is_ssl,
@@ -54,6 +55,8 @@ class ClientIO : public io::RestfulClient,
   RGWEnv& get_env() noexcept override {
     return env;
   }
   RGWEnv& get_env() noexcept override {
     return env;
   }
+
+  bool sent_100_continue() const { return sent100continue; }
 };
 
 } // namespace asio
 };
 
 } // namespace asio
index d6001a67f16ca26aa12dc34c770d1854297b8997..dac47d36a7bfe6c5b7289a66c178293d5813df7a 100644 (file)
@@ -72,6 +72,7 @@ class StreamIO : public rgw::asio::ClientIO {
   timeout_timer& timeout;
   yield_context yield;
   parse_buffer& buffer;
   timeout_timer& timeout;
   yield_context yield;
   parse_buffer& buffer;
+  boost::system::error_code fatal_ec;
  public:
   StreamIO(CephContext *cct, Stream& stream, timeout_timer& timeout,
            rgw::asio::parser_type& parser, yield_context yield,
  public:
   StreamIO(CephContext *cct, Stream& stream, timeout_timer& timeout,
            rgw::asio::parser_type& parser, yield_context yield,
@@ -83,6 +84,8 @@ class StreamIO : public rgw::asio::ClientIO {
         buffer(buffer)
   {}
 
         buffer(buffer)
   {}
 
+  boost::system::error_code get_fatal_error_code() const { return fatal_ec; }
+
   size_t write_data(const char* buf, size_t len) override {
     boost::system::error_code ec;
     timeout.start();
   size_t write_data(const char* buf, size_t len) override {
     boost::system::error_code ec;
     timeout.start();
@@ -95,6 +98,9 @@ class StreamIO : public rgw::asio::ClientIO {
         boost::system::error_code ec_ignored;
         stream.lowest_layer().shutdown(tcp_socket::shutdown_both, ec_ignored);
       }
         boost::system::error_code ec_ignored;
         stream.lowest_layer().shutdown(tcp_socket::shutdown_both, ec_ignored);
       }
+      if (!fatal_ec) {
+        fatal_ec = ec;
+      }
       throw rgw::io::Exception(ec.value(), std::system_category());
     }
     return bytes;
       throw rgw::io::Exception(ec.value(), std::system_category());
     }
     return bytes;
@@ -116,6 +122,9 @@ class StreamIO : public rgw::asio::ClientIO {
       }
       if (ec) {
         ldout(cct, 4) << "failed to read body: " << ec.message() << dendl;
       }
       if (ec) {
         ldout(cct, 4) << "failed to read body: " << ec.message() << dendl;
+        if (!fatal_ec) {
+          fatal_ec = ec;
+        }
         throw rgw::io::Exception(ec.value(), std::system_category());
       }
     }
         throw rgw::io::Exception(ec.value(), std::system_category());
       }
     }
@@ -228,6 +237,8 @@ void handle_connection(boost::asio::io_context& context,
       return;
     }
 
       return;
     }
 
+    bool expect_continue = (message[http::field::expect] == "100-continue");
+
     {
       auto lock = pause_mutex.async_lock_shared(yield[ec]);
       if (ec == boost::asio::error::operation_aborted) {
     {
       auto lock = pause_mutex.async_lock_shared(yield[ec]);
       if (ec == boost::asio::error::operation_aborted) {
@@ -283,6 +294,17 @@ void handle_connection(boost::asio::io_context& context,
             << log_header{message, http::field::range} << " latency="
             << latency << dendl;
       }
             << log_header{message, http::field::range} << " latency="
             << latency << dendl;
       }
+
+      // process_request() can't distinguish between connection errors and
+      // http/s3 errors, so check StreamIO for fatal connection errors
+      ec = real_client.get_fatal_error_code();
+      if (ec) {
+        return;
+      }
+
+      if (real_client.sent_100_continue()) {
+        expect_continue = false;
+      }
     }
 
     if (!parser.keep_alive()) {
     }
 
     if (!parser.keep_alive()) {
@@ -291,7 +313,7 @@ void handle_connection(boost::asio::io_context& context,
 
     // if we failed before reading the entire message, discard any remaining
     // bytes before reading the next
 
     // if we failed before reading the entire message, discard any remaining
     // bytes before reading the next
-    while (!parser.is_done()) {
+    while (!expect_continue && !parser.is_done()) {
       static std::array<char, 1024> discard_buffer;
 
       auto& body = parser.get().body();
       static std::array<char, 1024> discard_buffer;
 
       auto& body = parser.get().body();
@@ -330,6 +352,8 @@ struct Connection : boost::intrusive::list_base_hook<>,
   void close(boost::system::error_code& ec) {
     socket.close(ec);
   }
   void close(boost::system::error_code& ec) {
     socket.close(ec);
   }
+
+  tcp_socket& get_socket() { return socket; }
 };
 
 class ConnectionList {
 };
 
 class ConnectionList {
index b7d6a63b46f114fb5debdd042138ef5be1b646fe..bc58790d62986fada91578cb450068aa092162fb 100644 (file)
@@ -20,7 +20,8 @@ struct timeout_handler {
   void operator()(boost::system::error_code ec) {
     if (!ec) { // wait was not canceled
       boost::system::error_code ec_ignored;
   void operator()(boost::system::error_code ec) {
     if (!ec) { // wait was not canceled
       boost::system::error_code ec_ignored;
-      stream->close(ec_ignored);
+      stream->get_socket().cancel();
+      stream->get_socket().shutdown(boost::asio::ip::tcp::socket::shutdown_both, ec_ignored);
     }
   }
 };
     }
   }
 };
index e46bf32681b8be292f9924bdaffe0e6443524777..be2c430286199843c01d8eb384d90da618de3d75 100644 (file)
@@ -220,8 +220,9 @@ bool rgw_create_s3_canonical_header(const DoutPrefixProvider *dpp,
 
     if (header_time) {
       struct tm t;
 
     if (header_time) {
       struct tm t;
-      if (!parse_rfc2616(req_date, &t)) {
-        ldpp_dout(dpp, 0) << "NOTICE: failed to parse date for auth header" << dendl;
+      uint32_t ns = 0;
+      if (!parse_rfc2616(req_date, &t) && !parse_iso8601(req_date, &t, &ns, false)) {
+        ldpp_dout(dpp, 0) << "NOTICE: failed to parse date <" << req_date << "> for auth header" << dendl;
         return false;
       }
       if (t.tm_year < 70) {
         return false;
       }
       if (t.tm_year < 70) {
@@ -610,11 +611,12 @@ std::string get_v4_canonical_qs(const req_info& info, const bool using_qs)
 }
 
 static void add_v4_canonical_params_from_map(const map<string, string>& m,
 }
 
 static void add_v4_canonical_params_from_map(const map<string, string>& m,
-                                        std::map<string, string> *result)
+                                        std::map<string, string> *result,
+                                        bool is_non_s3_op)
 {
   for (auto& entry : m) {
     const auto& key = entry.first;
 {
   for (auto& entry : m) {
     const auto& key = entry.first;
-    if (key.empty()) {
+    if (key.empty() || (is_non_s3_op && key == "PayloadHash")) {
       continue;
     }
 
       continue;
     }
 
@@ -622,12 +624,12 @@ static void add_v4_canonical_params_from_map(const map<string, string>& m,
   }
 }
 
   }
 }
 
-std::string gen_v4_canonical_qs(const req_info& info)
+std::string gen_v4_canonical_qs(const req_info& info, bool is_non_s3_op)
 {
   std::map<std::string, std::string> canonical_qs_map;
 
 {
   std::map<std::string, std::string> canonical_qs_map;
 
-  add_v4_canonical_params_from_map(info.args.get_params(), &canonical_qs_map);
-  add_v4_canonical_params_from_map(info.args.get_sys_params(), &canonical_qs_map);
+  add_v4_canonical_params_from_map(info.args.get_params(), &canonical_qs_map, is_non_s3_op);
+  add_v4_canonical_params_from_map(info.args.get_sys_params(), &canonical_qs_map, false);
 
   if (canonical_qs_map.empty()) {
     return string();
 
   if (canonical_qs_map.empty()) {
     return string();
index 944d708191ddcdd5e315c4623298ad0920bef6c9..00eddc46f30b08e1dd8f7dc33fa40d0a6dbfc0ca 100644 (file)
@@ -601,7 +601,7 @@ static inline bool is_v4_payload_streamed(const char* const exp_payload_hash)
 
 std::string get_v4_canonical_qs(const req_info& info, bool using_qs);
 
 
 std::string get_v4_canonical_qs(const req_info& info, bool using_qs);
 
-std::string gen_v4_canonical_qs(const req_info& info);
+std::string gen_v4_canonical_qs(const req_info& info, bool is_non_s3_op);
 
 boost::optional<std::string>
 get_v4_canonical_headers(const req_info& info,
 
 boost::optional<std::string>
 get_v4_canonical_headers(const req_info& info,
index 12772f1ea28bcc0a71556fec28c9d9e76c60a711..8b21bcb584585bc93af84b6cd4dd24e7239da828 100644 (file)
@@ -44,6 +44,7 @@
 #include "rgw_reshard.h"
 #include "rgw_lc.h"
 #include "rgw_bucket_layout.h"
 #include "rgw_reshard.h"
 #include "rgw_lc.h"
 #include "rgw_bucket_layout.h"
+#include "common/errno.h"
 
 // stolen from src/cls/version/cls_version.cc
 #define VERSION_ATTR "ceph.objclass.version"
 
 // stolen from src/cls/version/cls_version.cc
 #define VERSION_ATTR "ceph.objclass.version"
@@ -140,8 +141,8 @@ std::string rgw_make_bucket_entry_name(const std::string& tenant_name,
  * Tenants are separated from buckets in URLs by a colon in S3.
  * This function is not to be used on Swift URLs, not even for COPY arguments.
  */
  * Tenants are separated from buckets in URLs by a colon in S3.
  * This function is not to be used on Swift URLs, not even for COPY arguments.
  */
-void rgw_parse_url_bucket(const string &bucket, const string& auth_tenant,
-                          string &tenant_name, string &bucket_name) {
+int rgw_parse_url_bucket(const string &bucket, const string& auth_tenant,
+                         string &tenant_name, string &bucket_name) {
 
   int pos = bucket.find(':');
   if (pos >= 0) {
 
   int pos = bucket.find(':');
   if (pos >= 0) {
@@ -152,10 +153,14 @@ void rgw_parse_url_bucket(const string &bucket, const string& auth_tenant,
      */
     tenant_name = bucket.substr(0, pos);
     bucket_name = bucket.substr(pos + 1);
      */
     tenant_name = bucket.substr(0, pos);
     bucket_name = bucket.substr(pos + 1);
+    if (bucket_name.empty()) {
+      return -ERR_INVALID_BUCKET_NAME;
+    }
   } else {
     tenant_name = auth_tenant;
     bucket_name = bucket;
   }
   } else {
     tenant_name = auth_tenant;
     bucket_name = bucket;
   }
+  return 0;
 }
 
 int rgw_bucket_parse_bucket_instance(const string& bucket_instance, string *bucket_name, string *bucket_id, int *shard_id)
 }
 
 int rgw_bucket_parse_bucket_instance(const string& bucket_instance, string *bucket_name, string *bucket_id, int *shard_id)
@@ -252,7 +257,7 @@ static void dump_mulipart_index_results(list<rgw_obj_index_key>& objs_to_unlink,
   }
 }
 
   }
 }
 
-void check_bad_user_bucket_mapping(rgw::sal::Store* store, rgw::sal::User* user,
+void check_bad_user_bucket_mapping(rgw::sal::Store* store, rgw::sal::User& user,
                                   bool fix,
                                   optional_yield y,
                                    const DoutPrefixProvider *dpp)
                                   bool fix,
                                   optional_yield y,
                                    const DoutPrefixProvider *dpp)
@@ -265,7 +270,7 @@ void check_bad_user_bucket_mapping(rgw::sal::Store* store, rgw::sal::User* user,
   size_t max_entries = cct->_conf->rgw_list_buckets_max_chunk;
 
   do {
   size_t max_entries = cct->_conf->rgw_list_buckets_max_chunk;
 
   do {
-    int ret = user->list_buckets(dpp, marker, string(), max_entries, false, user_buckets, y);
+    int ret = user.list_buckets(dpp, marker, string(), max_entries, false, user_buckets, y);
     if (ret < 0) {
       ldout(store->ctx(), 0) << "failed to read user buckets: "
                             << cpp_strerror(-ret) << dendl;
     if (ret < 0) {
       ldout(store->ctx(), 0) << "failed to read user buckets: "
                             << cpp_strerror(-ret) << dendl;
@@ -281,7 +286,7 @@ void check_bad_user_bucket_mapping(rgw::sal::Store* store, rgw::sal::User* user,
       auto& bucket = i->second;
 
       std::unique_ptr<rgw::sal::Bucket> actual_bucket;
       auto& bucket = i->second;
 
       std::unique_ptr<rgw::sal::Bucket> actual_bucket;
-      int r = store->get_bucket(dpp, user, user->get_tenant(), bucket->get_name(), &actual_bucket, null_yield);
+      int r = store->get_bucket(dpp, &user, user.get_tenant(), bucket->get_name(), &actual_bucket, null_yield);
       if (r < 0) {
         ldout(store->ctx(), 0) << "could not get bucket info for bucket=" << bucket << dendl;
         continue;
       if (r < 0) {
         ldout(store->ctx(), 0) << "could not get bucket info for bucket=" << bucket << dendl;
         continue;
@@ -294,7 +299,7 @@ void check_bad_user_bucket_mapping(rgw::sal::Store* store, rgw::sal::User* user,
         cout << "bucket info mismatch: expected " << actual_bucket << " got " << bucket << std::endl;
         if (fix) {
           cout << "fixing" << std::endl;
         cout << "bucket info mismatch: expected " << actual_bucket << " got " << bucket << std::endl;
         if (fix) {
           cout << "fixing" << std::endl;
-         r = actual_bucket->chown(dpp, user, nullptr, null_yield);
+         r = actual_bucket->chown(dpp, user, null_yield);
           if (r < 0) {
             cerr << "failed to fix bucket: " << cpp_strerror(-r) << std::endl;
           }
           if (r < 0) {
             cerr << "failed to fix bucket: " << cpp_strerror(-r) << std::endl;
           }
@@ -419,12 +424,12 @@ bool rgw_find_bucket_by_id(const DoutPrefixProvider *dpp, CephContext *cct, rgw:
 int RGWBucket::chown(RGWBucketAdminOpState& op_state, const string& marker,
                      optional_yield y, const DoutPrefixProvider *dpp, std::string *err_msg)
 {
 int RGWBucket::chown(RGWBucketAdminOpState& op_state, const string& marker,
                      optional_yield y, const DoutPrefixProvider *dpp, std::string *err_msg)
 {
-  int ret = bucket->chown(dpp, user.get(), user.get(), y, &marker);
-  if (ret < 0) {
-    set_err_msg(err_msg, "Failed to change object ownership: " + cpp_strerror(-ret));
-  }
-  
-  return ret;
+  /* User passed in by rgw_admin is the new user; get the current user and set it in
+   * the bucket */
+  std::unique_ptr<rgw::sal::User> old_user = store->get_user(bucket->get_info().owner);
+  bucket->set_owner(old_user.get());
+
+  return rgw_chown_bucket_and_objects(store, bucket.get(), user.get(), marker, err_msg, dpp, y);
 }
 
 int RGWBucket::set_quota(RGWBucketAdminOpState& op_state, const DoutPrefixProvider *dpp, std::string *err_msg)
 }
 
 int RGWBucket::set_quota(RGWBucketAdminOpState& op_state, const DoutPrefixProvider *dpp, std::string *err_msg)
@@ -2888,97 +2893,6 @@ int RGWBucketCtl::do_unlink_bucket(RGWSI_Bucket_EP_Ctx& ctx,
   return svc.bucket->store_bucket_entrypoint_info(ctx, meta_key, ep, false, real_time(), &attrs, &ot, y, dpp);
 }
 
   return svc.bucket->store_bucket_entrypoint_info(ctx, meta_key, ep, false, real_time(), &attrs, &ot, y, dpp);
 }
 
-// TODO: remove RGWRados dependency for bucket listing
-int RGWBucketCtl::chown(rgw::sal::Store* store, rgw::sal::Bucket* bucket,
-                        const rgw_user& user_id, const std::string& display_name,
-                        const std::string& marker, optional_yield y, const DoutPrefixProvider *dpp)
-{
-  map<string, bool> common_prefixes;
-
-  rgw::sal::Bucket::ListParams params;
-  rgw::sal::Bucket::ListResults results;
-
-  params.list_versions = true;
-  params.allow_unordered = true;
-  params.marker = marker;
-
-  int count = 0;
-  int max_entries = 1000;
-
-  //Loop through objects and update object acls to point to bucket owner
-
-  do {
-    RGWObjectCtx obj_ctx(store);
-    results.objs.clear();
-    int ret = bucket->list(dpp, params, max_entries, results, y);
-    if (ret < 0) {
-      ldpp_dout(dpp, 0) << "ERROR: list objects failed: " << cpp_strerror(-ret) << dendl;
-      return ret;
-    }
-
-    params.marker = results.next_marker;
-    count += results.objs.size();
-
-    for (const auto& obj : results.objs) {
-      std::unique_ptr<rgw::sal::Object> r_obj = bucket->get_object(obj.key);
-
-      ret = r_obj->get_obj_attrs(&obj_ctx, y, dpp);
-      if (ret < 0){
-        ldpp_dout(dpp, 0) << "ERROR: failed to read object " << obj.key.name << cpp_strerror(-ret) << dendl;
-        continue;
-      }
-      const auto& aiter = r_obj->get_attrs().find(RGW_ATTR_ACL);
-      if (aiter == r_obj->get_attrs().end()) {
-        ldpp_dout(dpp, 0) << "ERROR: no acls found for object " << obj.key.name << " .Continuing with next object." << dendl;
-        continue;
-      } else {
-        bufferlist& bl = aiter->second;
-        RGWAccessControlPolicy policy(store->ctx());
-        ACLOwner owner;
-        try {
-          decode(policy, bl);
-          owner = policy.get_owner();
-        } catch (buffer::error& err) {
-          ldpp_dout(dpp, 0) << "ERROR: decode policy failed" << err.what()
-                                << dendl;
-          return -EIO;
-        }
-
-        //Get the ACL from the policy
-        RGWAccessControlList& acl = policy.get_acl();
-
-        //Remove grant that is set to old owner
-        acl.remove_canon_user_grant(owner.get_id());
-
-        //Create a grant and add grant
-        ACLGrant grant;
-        grant.set_canon(user_id, display_name, RGW_PERM_FULL_CONTROL);
-        acl.add_grant(&grant);
-
-        //Update the ACL owner to the new user
-        owner.set_id(user_id);
-        owner.set_name(display_name);
-        policy.set_owner(owner);
-
-        bl.clear();
-        encode(policy, bl);
-
-       r_obj->set_atomic(&obj_ctx);
-       map<string, bufferlist> attrs;
-       attrs[RGW_ATTR_ACL] = bl;
-       ret = r_obj->set_obj_attrs(dpp, &obj_ctx, &attrs, nullptr, y);
-        if (ret < 0) {
-          ldpp_dout(dpp, 0) << "ERROR: modify attr failed " << cpp_strerror(-ret) << dendl;
-          return ret;
-        }
-      }
-    }
-    cerr << count << " objects processed in " << bucket
-        << ". Next marker " << params.marker.name << std::endl;
-  } while(results.is_truncated);
-  return 0;
-}
-
 int RGWBucketCtl::read_bucket_stats(const rgw_bucket& bucket,
                                     RGWBucketEnt *result,
                                     optional_yield y,
 int RGWBucketCtl::read_bucket_stats(const rgw_bucket& bucket,
                                     RGWBucketEnt *result,
                                     optional_yield y,
@@ -3119,3 +3033,56 @@ void RGWBucketEntryPoint::decode_json(JSONObj *obj) {
   }
 }
 
   }
 }
 
+int rgw_chown_bucket_and_objects(rgw::sal::Store* store, rgw::sal::Bucket* bucket,
+                                rgw::sal::User* new_user,
+                                const std::string& marker, std::string *err_msg,
+                                const DoutPrefixProvider *dpp, optional_yield y)
+{
+  /* Chown on the bucket */
+  int ret = bucket->chown(dpp, *new_user, y);
+  if (ret < 0) {
+    set_err_msg(err_msg, "Failed to change object ownership: " + cpp_strerror(-ret));
+  }
+
+  /* Now chown on all the objects in the bucket */
+  map<string, bool> common_prefixes;
+
+  rgw::sal::Bucket::ListParams params;
+  rgw::sal::Bucket::ListResults results;
+
+  params.list_versions = true;
+  params.allow_unordered = true;
+  params.marker = marker;
+
+  int count = 0;
+  int max_entries = 1000;
+
+  //Loop through objects and update object acls to point to bucket owner
+
+  do {
+    results.objs.clear();
+    ret = bucket->list(dpp, params, max_entries, results, y);
+    if (ret < 0) {
+      ldpp_dout(dpp, 0) << "ERROR: list objects failed: " << cpp_strerror(-ret) << dendl;
+      return ret;
+    }
+
+    params.marker = results.next_marker;
+    count += results.objs.size();
+
+    for (const auto& obj : results.objs) {
+      std::unique_ptr<rgw::sal::Object> r_obj = bucket->get_object(obj.key);
+
+      ret = r_obj->chown(*new_user, dpp, y);
+        if (ret < 0) {
+          ldpp_dout(dpp, 0) << "ERROR: chown failed on " << r_obj << " :" << cpp_strerror(-ret) << dendl;
+          return ret;
+        }
+      }
+    cerr << count << " objects processed in " << bucket
+        << ". Next marker " << params.marker.name << std::endl;
+  } while(results.is_truncated);
+
+  return ret;
+}
+
index 0bc24db7e40957c8571800b32fa62d38e031c72e..bcddc7ae8fd0b996f41bc1270059d61fa8527a89 100644 (file)
@@ -47,9 +47,18 @@ extern int rgw_bucket_parse_bucket_key(CephContext *cct, const std::string& key,
 extern std::string rgw_make_bucket_entry_name(const std::string& tenant_name,
                                               const std::string& bucket_name);
 
 extern std::string rgw_make_bucket_entry_name(const std::string& tenant_name,
                                               const std::string& bucket_name);
 
-extern void rgw_parse_url_bucket(const std::string& bucket,
-                                 const std::string& auth_tenant,
-                                 std::string &tenant_name, std::string &bucket_name);
+[[nodiscard]] int rgw_parse_url_bucket(const std::string& bucket,
+                                       const std::string& auth_tenant,
+                                       std::string &tenant_name,
+                                       std::string &bucket_name);
+
+extern int rgw_chown_bucket_and_objects(rgw::sal::Store* store,
+                                       rgw::sal::Bucket* bucket,
+                                       rgw::sal::User* new_user,
+                                       const std::string& marker,
+                                       std::string *err_msg,
+                                       const DoutPrefixProvider *dpp,
+                                       optional_yield y);
 
 // this is used as a filter to RGWRados::cls_bucket_list_ordered; it
 // conforms to the type RGWBucketListNameFilter
 
 // this is used as a filter to RGWRados::cls_bucket_list_ordered; it
 // conforms to the type RGWBucketListNameFilter
@@ -225,7 +234,7 @@ extern int rgw_object_get_attr(rgw::sal::Store* store, rgw::sal::Object* obj,
                               const char* attr_name, bufferlist& out_bl,
                               optional_yield y);
 
                               const char* attr_name, bufferlist& out_bl,
                               optional_yield y);
 
-extern void check_bad_user_bucket_mapping(rgw::sal::Store* store, rgw::sal::User* user, bool fix, optional_yield y, const DoutPrefixProvider *dpp);
+extern void check_bad_user_bucket_mapping(rgw::sal::Store* store, rgw::sal::User& user, bool fix, optional_yield y, const DoutPrefixProvider *dpp);
 
 struct RGWBucketAdminOpState {
   rgw_user uid;
 
 struct RGWBucketAdminOpState {
   rgw_user uid;
@@ -688,10 +697,6 @@ public:
                     const DoutPrefixProvider *dpp,
                     bool update_entrypoint = true);
 
                     const DoutPrefixProvider *dpp,
                     bool update_entrypoint = true);
 
-  int chown(rgw::sal::Store* store, rgw::sal::Bucket* bucket,
-            const rgw_user& user_id, const std::string& display_name,
-            const std::string& marker, optional_yield y, const DoutPrefixProvider *dpp);
-
   int read_buckets_stats(std::map<std::string, RGWBucketEnt>& m,
                          optional_yield y,
                          const DoutPrefixProvider *dpp);
   int read_buckets_stats(std::map<std::string, RGWBucketEnt>& m,
                          optional_yield y,
                          const DoutPrefixProvider *dpp);
index 3eb60b6c0d141d4951813e6937ee06bd97fcb7f9..73b2ccc057d7f8ab22c25150beaa024786db5bd0 100644 (file)
@@ -868,6 +868,24 @@ int RGWHTTPArgs::parse(const DoutPrefixProvider *dpp)
   return 0;
 }
 
   return 0;
 }
 
+void RGWHTTPArgs::remove(const string& name)
+{
+  auto val_iter = val_map.find(name);
+  if (val_iter != std::end(val_map)) {
+    val_map.erase(val_iter);
+  }
+
+  auto sys_val_iter = sys_val_map.find(name);
+  if (sys_val_iter != std::end(sys_val_map)) {
+    sys_val_map.erase(sys_val_iter);
+  }
+
+  auto subres_iter = sub_resources.find(name);
+  if (subres_iter != std::end(sub_resources)) {
+    sub_resources.erase(subres_iter);
+  }
+}
+
 void RGWHTTPArgs::append(const string& name, const string& val)
 {
   if (name.compare(0, sizeof(RGW_SYS_PARAM_PREFIX) - 1, RGW_SYS_PARAM_PREFIX) == 0) {
 void RGWHTTPArgs::append(const string& name, const string& val)
 {
   if (name.compare(0, sizeof(RGW_SYS_PARAM_PREFIX) - 1, RGW_SYS_PARAM_PREFIX) == 0) {
index 8a441d043e199c5c3a68742579cc7f2825954915..25e5b24ad8170dde5731188b187993f92a26c72b 100644 (file)
@@ -348,6 +348,7 @@ class RGWHTTPArgs {
   /** parse the received arguments */
   int parse(const DoutPrefixProvider *dpp);
   void append(const std::string& name, const std::string& val);
   /** parse the received arguments */
   int parse(const DoutPrefixProvider *dpp);
   void append(const std::string& name, const std::string& val);
+  void remove(const std::string& name);
   /** Get the value for a specific argument parameter */
   const std::string& get(const std::string& name, bool *exists = NULL) const;
   boost::optional<const std::string&>
   /** Get the value for a specific argument parameter */
   const std::string& get(const std::string& name, bool *exists = NULL) const;
   boost::optional<const std::string&>
index d5da5d80a1039b9ce0c08dd36eba714aac0322bf..41d8680bffc52f3c5202b1a5a8db6fee3b9181be 100644 (file)
@@ -897,6 +897,7 @@ int RGWCoroutinesManagerRegistry::hook_to_admin_command(const string& command)
 
 int RGWCoroutinesManagerRegistry::call(std::string_view command,
                                       const cmdmap_t& cmdmap,
 
 int RGWCoroutinesManagerRegistry::call(std::string_view command,
                                       const cmdmap_t& cmdmap,
+                                      const bufferlist&,
                                       Formatter *f,
                                       std::ostream& ss,
                                       bufferlist& out) {
                                       Formatter *f,
                                       std::ostream& ss,
                                       bufferlist& out) {
@@ -1046,7 +1047,9 @@ bool RGWCoroutine::drain_children(int num_cr_left,
 
 void RGWCoroutine::wakeup()
 {
 
 void RGWCoroutine::wakeup()
 {
-  stack->wakeup();
+  if (stack) {
+    stack->wakeup();
+  }
 }
 
 RGWCoroutinesEnv *RGWCoroutine::get_env() const
 }
 
 RGWCoroutinesEnv *RGWCoroutine::get_env() const
index 1a9fa62cd32147469fba74bcbe224687e5770162..a6e3dee3be64385a84b6d962e63ac18adc924ea3 100644 (file)
@@ -612,6 +612,7 @@ public:
 
   int hook_to_admin_command(const std::string& command);
   int call(std::string_view command, const cmdmap_t& cmdmap,
 
   int hook_to_admin_command(const std::string& command);
   int call(std::string_view command, const cmdmap_t& cmdmap,
+          const bufferlist&,
           Formatter *f,
           std::ostream& ss,
           bufferlist& out) override;
           Formatter *f,
           std::ostream& ss,
           bufferlist& out) override;
index d59cc65b4b2b2117a29c42ad8cb0083a7d441d44..bd16bde1bd5dbeac47926845d1a8f16dbeac1504 100644 (file)
@@ -65,7 +65,57 @@ int RGWGC::tag_index(const string& tag)
   return rgw_shards_mod(XXH64(tag.c_str(), tag.size(), seed), max_objs);
 }
 
   return rgw_shards_mod(XXH64(tag.c_str(), tag.size(), seed), max_objs);
 }
 
-int RGWGC::send_chain(cls_rgw_obj_chain& chain, const string& tag)
+std::tuple<int, std::optional<cls_rgw_obj_chain>> RGWGC::send_split_chain(const cls_rgw_obj_chain& chain, const std::string& tag)
+{
+  ldpp_dout(this, 20) << "RGWGC::send_split_chain - tag is: " << tag << dendl;
+
+  if (cct->_conf->rgw_max_chunk_size) {
+    cls_rgw_obj_chain broken_chain;
+    ldpp_dout(this, 20) << "RGWGC::send_split_chain - rgw_max_chunk_size is: " << cct->_conf->rgw_max_chunk_size << dendl;
+
+    for (auto it = chain.objs.begin(); it != chain.objs.end(); it++) {
+      ldpp_dout(this, 20) << "RGWGC::send_split_chain - adding obj with name: " << it->key << dendl;
+      broken_chain.objs.emplace_back(*it);
+      cls_rgw_gc_obj_info info;
+      info.tag = tag;
+      info.chain = broken_chain;
+      cls_rgw_gc_set_entry_op op;
+      op.info = info;
+      size_t total_encoded_size = op.estimate_encoded_size();
+      ldpp_dout(this, 20) << "RGWGC::send_split_chain - total_encoded_size is: " << total_encoded_size << dendl;
+
+      if (total_encoded_size > cct->_conf->rgw_max_chunk_size) { //dont add to chain, and send to gc
+        broken_chain.objs.pop_back();
+        --it;
+        ldpp_dout(this, 20) << "RGWGC::send_split_chain - more than, dont add to broken chain and send chain" << dendl;
+        auto ret = send_chain(broken_chain, tag);
+        if (ret < 0) {
+          broken_chain.objs.insert(broken_chain.objs.end(), it, chain.objs.end()); // add all the remainder objs to the list to be deleted inline
+          ldpp_dout(this, 0) << "RGWGC::send_split_chain - send chain returned error: " << ret << dendl;
+          return {ret, {broken_chain}};
+        }
+        broken_chain.objs.clear();
+      }
+    }
+    if (!broken_chain.objs.empty()) { //when the chain is smaller than or equal to rgw_max_chunk_size
+      ldpp_dout(this, 20) << "RGWGC::send_split_chain - sending leftover objects" << dendl;
+      auto ret = send_chain(broken_chain, tag);
+      if (ret < 0) {
+        ldpp_dout(this, 0) << "RGWGC::send_split_chain - send chain returned error: " << ret << dendl;
+        return {ret, {broken_chain}};
+      }
+    }
+  } else {
+    auto ret = send_chain(chain, tag);
+    if (ret < 0) {
+      ldpp_dout(this, 0) << "RGWGC::send_split_chain - send chain returned error: " << ret << dendl;
+      return {ret, {std::move(chain)}};
+    }
+  }
+  return {0, {}};
+}
+
+int RGWGC::send_chain(const cls_rgw_obj_chain& chain, const string& tag)
 {
   ObjectWriteOperation op;
   cls_rgw_gc_obj_info info;
 {
   ObjectWriteOperation op;
   cls_rgw_gc_obj_info info;
index f66b0be89c8482dd65e512f5cae5f0bba1e15479..196f2802c1649a2c4d84232695e31147f172bb16 100644 (file)
@@ -29,6 +29,7 @@ class RGWGC : public DoutPrefixProvider {
   static constexpr uint64_t seed = 8675309;
 
   int tag_index(const std::string& tag);
   static constexpr uint64_t seed = 8675309;
 
   int tag_index(const std::string& tag);
+  int send_chain(const cls_rgw_obj_chain& chain, const std::string& tag);
 
   class GCWorker : public Thread {
     const DoutPrefixProvider *dpp;
 
   class GCWorker : public Thread {
     const DoutPrefixProvider *dpp;
@@ -51,7 +52,7 @@ public:
     finalize();
   }
   std::vector<bool> transitioned_objects_cache;
     finalize();
   }
   std::vector<bool> transitioned_objects_cache;
-  int send_chain(cls_rgw_obj_chain& chain, const std::string& tag);
+  std::tuple<int, std::optional<cls_rgw_obj_chain>> send_split_chain(const cls_rgw_obj_chain& chain, const std::string& tag);
 
   // asynchronously defer garbage collection on an object that's still being read
   int async_defer_chain(const std::string& tag, const cls_rgw_obj_chain& info);
 
   // asynchronously defer garbage collection on an object that's still being read
   int async_defer_chain(const std::string& tag, const cls_rgw_obj_chain& info);
index 31822d862c60577802cccf9576638c165197ae33..6dad16efc8086e4508f682ab895aac58e04895c7 100644 (file)
@@ -1454,25 +1454,16 @@ public:
     tier_ctx.multipart_sync_threshold = oc.tier.t.s3.multipart_sync_threshold;
     tier_ctx.storage_class = oc.tier.storage_class;
 
     tier_ctx.multipart_sync_threshold = oc.tier.t.s3.multipart_sync_threshold;
     tier_ctx.storage_class = oc.tier.storage_class;
 
-    // check if target_path is already created
     std::set<std::string>& cloud_targets = oc.env.worker->get_cloud_targets();
     std::set<std::string>& cloud_targets = oc.env.worker->get_cloud_targets();
-    std::pair<std::set<std::string>::iterator, bool> it;
-
-    it = cloud_targets.insert(bucket_name);
-    tier_ctx.target_bucket_created = !(it.second);
 
     ldpp_dout(oc.dpp, 0) << "Transitioning object(" << oc.o.key << ") to the cloud endpoint(" << endpoint << ")" << dendl;
 
     /* Transition object to cloud end point */
 
     ldpp_dout(oc.dpp, 0) << "Transitioning object(" << oc.o.key << ") to the cloud endpoint(" << endpoint << ")" << dendl;
 
     /* Transition object to cloud end point */
-    int ret = rgw_cloud_tier_transfer_object(tier_ctx);
+    int ret = rgw_cloud_tier_transfer_object(tier_ctx, cloud_targets);
 
     if (ret < 0) {
       ldpp_dout(oc.dpp, 0) << "ERROR: failed to transfer object(" << oc.o.key << ") to the cloud endpoint(" << endpoint << ") ret=" << ret << dendl;
       return ret;
 
     if (ret < 0) {
       ldpp_dout(oc.dpp, 0) << "ERROR: failed to transfer object(" << oc.o.key << ") to the cloud endpoint(" << endpoint << ") ret=" << ret << dendl;
       return ret;
-
-      if (!tier_ctx.target_bucket_created) {
-        cloud_targets.erase(it.first);
-      }
     }
 
     if (delete_object) {
     }
 
     if (delete_object) {
index 704b7dee2e2714fcc4d5d045c937f3eee2ace011..080b99737acb661cd624cddc41ff3053d36dd56d 100644 (file)
@@ -326,17 +326,17 @@ class RGWLCStreamRead
   rgw::sal::Object *obj;
   const real_time &mtime;
 
   rgw::sal::Object *obj;
   const real_time &mtime;
 
-  bool multipart;
-  uint64_t m_part_size;
-  off_t m_part_off;
-  off_t m_part_end;
+  bool multipart{false};
+  uint64_t m_part_size{0};
+  off_t m_part_off{0};
+  off_t m_part_end{0};
 
   std::unique_ptr<rgw::sal::Object::ReadOp> read_op;
 
   std::unique_ptr<rgw::sal::Object::ReadOp> read_op;
-  off_t ofs;
-  off_t end;
+  off_t ofs{0};
+  off_t end{0};
   rgw_rest_obj rest_obj;
 
   rgw_rest_obj rest_obj;
 
-  int retcode;
+  int retcode{0};
 
   public:
   RGWLCStreamRead(CephContext *_cct, const DoutPrefixProvider *_dpp,
 
   public:
   RGWLCStreamRead(CephContext *_cct, const DoutPrefixProvider *_dpp,
@@ -1246,8 +1246,7 @@ static int cloud_tier_create_bucket(RGWLCCloudTierCtx& tier_ctx) {
                                     out_bl, &bl, nullptr, null_yield);
 
   if (ret < 0 ) {
                                     out_bl, &bl, nullptr, null_yield);
 
   if (ret < 0 ) {
-    ldpp_dout(tier_ctx.dpp, 0) << "ERROR: failed to create target bucket: " << tier_ctx.target_bucket_name << ", ret:" << ret << dendl;
-    return ret;
+    ldpp_dout(tier_ctx.dpp, 0) << "create target bucket : " << tier_ctx.target_bucket_name << " returned ret:" << ret << dendl;
   }
   if (out_bl.length() > 0) {
     RGWXMLDecoder::XMLParser parser;
   }
   if (out_bl.length() > 0) {
     RGWXMLDecoder::XMLParser parser;
@@ -1270,7 +1269,7 @@ static int cloud_tier_create_bucket(RGWLCCloudTierCtx& tier_ctx) {
       return -EIO;
     }
 
       return -EIO;
     }
 
-    if (result.code != "BucketAlreadyOwnedByYou") {
+    if (result.code != "BucketAlreadyOwnedByYou" && result.code != "BucketAlreadyExists") {
       ldpp_dout(tier_ctx.dpp, 0) << "ERROR: Creating target bucket failed with error: " << result.code << dendl;
       return -EIO;
     }
       ldpp_dout(tier_ctx.dpp, 0) << "ERROR: Creating target bucket failed with error: " << result.code << dendl;
       return -EIO;
     }
@@ -1279,9 +1278,15 @@ static int cloud_tier_create_bucket(RGWLCCloudTierCtx& tier_ctx) {
   return 0;
 }
 
   return 0;
 }
 
-int rgw_cloud_tier_transfer_object(RGWLCCloudTierCtx& tier_ctx) {
+int rgw_cloud_tier_transfer_object(RGWLCCloudTierCtx& tier_ctx, std::set<std::string>& cloud_targets) {
   int ret = 0;
 
   int ret = 0;
 
+  // check if target_path is already created
+  std::set<std::string>::iterator it;
+
+  it = cloud_targets.find(tier_ctx.target_bucket_name);
+  tier_ctx.target_bucket_created = (it != cloud_targets.end());
+
   /* If run first time attempt to create the target bucket */
   if (!tier_ctx.target_bucket_created) {
     ret = cloud_tier_create_bucket(tier_ctx);
   /* If run first time attempt to create the target bucket */
   if (!tier_ctx.target_bucket_created) {
     ret = cloud_tier_create_bucket(tier_ctx);
@@ -1291,6 +1296,7 @@ int rgw_cloud_tier_transfer_object(RGWLCCloudTierCtx& tier_ctx) {
       return ret;
     }
     tier_ctx.target_bucket_created = true;
       return ret;
     }
     tier_ctx.target_bucket_created = true;
+    cloud_targets.insert(tier_ctx.target_bucket_name);
   }
 
   /* Since multiple zones may try to transition the same object to the cloud,
   }
 
   /* Since multiple zones may try to transition the same object to the cloud,
index 86df479e8280847c23414253ce19cddd12892312..7f38f1e02b833b97eca87a24757d86eb5ca1c75b 100644 (file)
@@ -50,6 +50,6 @@ struct RGWLCCloudTierCtx {
 };
 
 /* Transition object to cloud endpoint */
 };
 
 /* Transition object to cloud endpoint */
-int rgw_cloud_tier_transfer_object(RGWLCCloudTierCtx& tier_ctx);
+int rgw_cloud_tier_transfer_object(RGWLCCloudTierCtx& tier_ctx, std::set<std::string>& cloud_targets);
 
 #endif
 
 #endif
index c51eecded53d204b39b1cf03bea67297dc57f68f..5f7598a41f6a8e6e5d4e66ea1ae03e287b567427 100644 (file)
@@ -323,6 +323,29 @@ void rgw_format_ops_log_entry(struct rgw_log_entry& entry, Formatter *formatter)
     formatter->dump_string("subuser", entry.subuser);
   }
   formatter->dump_bool("temp_url", entry.temp_url);
     formatter->dump_string("subuser", entry.subuser);
   }
   formatter->dump_bool("temp_url", entry.temp_url);
+
+  if (entry.op == "multi_object_delete") {
+    formatter->open_object_section("op_data");
+    formatter->dump_int("num_ok", entry.delete_multi_obj_meta.num_ok);
+    formatter->dump_int("num_err", entry.delete_multi_obj_meta.num_err);
+    formatter->open_array_section("objects");
+    for (const auto& iter: entry.delete_multi_obj_meta.objects) {
+      formatter->open_object_section("");
+      formatter->dump_string("key", iter.key);
+      formatter->dump_string("version_id", iter.version_id);
+      formatter->dump_int("http_status", iter.http_status);
+      formatter->dump_bool("error", iter.error);
+      if (iter.error) {
+        formatter->dump_string("error_message", iter.error_message);
+      } else {
+        formatter->dump_bool("delete_marker", iter.delete_marker);
+        formatter->dump_string("marker_version_id", iter.marker_version_id);
+      }
+      formatter->close_section();
+    }
+    formatter->close_section();
+    formatter->close_section();
+  }
   formatter->close_section();
 }
 
   formatter->close_section();
 }
 
@@ -515,10 +538,11 @@ int OpsLogRados::log(struct req_state* s, struct rgw_log_entry& entry)
   return 0;
 }
 
   return 0;
 }
 
-int rgw_log_op(RGWREST* const rest, struct req_state *s, const string& op_name, OpsLogSink *olog)
+int rgw_log_op(RGWREST* const rest, struct req_state *s, const RGWOp* op, OpsLogSink *olog)
 {
   struct rgw_log_entry entry;
   string bucket_id;
 {
   struct rgw_log_entry entry;
   string bucket_id;
+  string op_name = (op ? op->name() : "unknown");
 
   if (s->enable_usage_log)
     log_usage(s, op_name);
 
   if (s->enable_usage_log)
     log_usage(s, op_name);
@@ -594,6 +618,9 @@ int rgw_log_op(RGWREST* const rest, struct req_state *s, const string& op_name,
   entry.uri = std::move(uri);
 
   entry.op = op_name;
   entry.uri = std::move(uri);
 
   entry.op = op_name;
+  if (op) {
+    op->write_ops_log_entry(entry);
+  }
 
   if (s->auth.identity) {
     entry.identity_type = s->auth.identity->get_identity_type();
 
   if (s->auth.identity) {
     entry.identity_type = s->auth.identity->get_identity_type();
index acbf441f47b32fafa945d8d375aee6e6ae902b7e..14159f2384716b68a31224472c1c4ce446b3ae7d 100644 (file)
@@ -16,6 +16,66 @@ namespace rgw { namespace sal {
   class Store;
 } }
 
   class Store;
 } }
 
+class RGWOp;
+
+struct delete_multi_obj_entry {
+  std::string key;
+  std::string version_id;
+  std::string error_message;
+  std::string marker_version_id;
+  uint32_t http_status = 0;
+  bool error = false;
+  bool delete_marker = false;
+
+  void encode(bufferlist &bl) const {
+    ENCODE_START(1, 1, bl);
+    encode(key, bl);
+    encode(version_id, bl);
+    encode(error_message, bl);
+    encode(marker_version_id, bl);
+    encode(http_status, bl);
+    encode(error, bl);
+    encode(delete_marker, bl);
+    ENCODE_FINISH(bl);
+  }
+
+  void decode(bufferlist::const_iterator &p) {
+    DECODE_START_LEGACY_COMPAT_LEN(1, 1, 1, p);
+    decode(key, p);
+    decode(version_id, p);
+    decode(error_message, p);
+    decode(marker_version_id, p);
+    decode(http_status, p);
+    decode(error, p);
+    decode(delete_marker, p);
+    DECODE_FINISH(p);
+  }
+};
+WRITE_CLASS_ENCODER(delete_multi_obj_entry)
+
+struct delete_multi_obj_op_meta {
+  uint32_t num_ok = 0;
+  uint32_t num_err = 0;
+  std::vector<delete_multi_obj_entry> objects;
+
+  void encode(bufferlist &bl) const {
+    ENCODE_START(1, 1, bl);
+    encode(num_ok, bl);
+    encode(num_err, bl);
+    encode(objects, bl);
+    ENCODE_FINISH(bl);
+  }
+
+  void decode(bufferlist::const_iterator &p) {
+    DECODE_START_LEGACY_COMPAT_LEN(1, 1, 1, p);
+    decode(num_ok, p);
+    decode(num_err, p);
+    decode(objects, p);
+    DECODE_FINISH(p);
+  }
+};
+WRITE_CLASS_ENCODER(delete_multi_obj_op_meta)
+
 struct rgw_log_entry {
 
   using headers_map = boost::container::flat_map<std::string, std::string>;
 struct rgw_log_entry {
 
   using headers_map = boost::container::flat_map<std::string, std::string>;
@@ -42,13 +102,14 @@ struct rgw_log_entry {
   headers_map x_headers;
   std::string trans_id;
   std::vector<std::string> token_claims;
   headers_map x_headers;
   std::string trans_id;
   std::vector<std::string> token_claims;
-  uint32_t identity_type;
+  uint32_t identity_type = TYPE_NONE;
   std::string access_key_id;
   std::string subuser;
   bool temp_url {false};
   std::string access_key_id;
   std::string subuser;
   bool temp_url {false};
+  delete_multi_obj_op_meta delete_multi_obj_meta;
 
   void encode(bufferlist &bl) const {
 
   void encode(bufferlist &bl) const {
-    ENCODE_START(13, 5, bl);
+    ENCODE_START(14, 5, bl);
     encode(object_owner.id, bl);
     encode(bucket_owner.id, bl);
     encode(bucket, bl);
     encode(object_owner.id, bl);
     encode(bucket_owner.id, bl);
     encode(bucket, bl);
@@ -77,10 +138,11 @@ struct rgw_log_entry {
     encode(access_key_id, bl);
     encode(subuser, bl);
     encode(temp_url, bl);
     encode(access_key_id, bl);
     encode(subuser, bl);
     encode(temp_url, bl);
+    encode(delete_multi_obj_meta, bl);
     ENCODE_FINISH(bl);
   }
   void decode(bufferlist::const_iterator &p) {
     ENCODE_FINISH(bl);
   }
   void decode(bufferlist::const_iterator &p) {
-    DECODE_START_LEGACY_COMPAT_LEN(13, 5, 5, p);
+    DECODE_START_LEGACY_COMPAT_LEN(14, 5, 5, p);
     decode(object_owner.id, p);
     if (struct_v > 3)
       decode(bucket_owner.id, p);
     decode(object_owner.id, p);
     if (struct_v > 3)
       decode(bucket_owner.id, p);
@@ -140,6 +202,9 @@ struct rgw_log_entry {
       decode(subuser, p);
       decode(temp_url, p);
     }
       decode(subuser, p);
       decode(temp_url, p);
     }
+    if (struct_v >= 14) {
+      decode(delete_multi_obj_meta, p);
+    }
     DECODE_FINISH(p);
   }
   void dump(ceph::Formatter *f) const;
     DECODE_FINISH(p);
   }
   void dump(ceph::Formatter *f) const;
@@ -223,7 +288,7 @@ public:
 class RGWREST;
 
 int rgw_log_op(RGWREST* const rest, struct req_state* s,
 class RGWREST;
 
 int rgw_log_op(RGWREST* const rest, struct req_state* s,
-              const std::string& op_name, OpsLogSink* olog);
+              const RGWOp* op, OpsLogSink* olog);
 void rgw_log_usage_init(CephContext* cct, rgw::sal::Store* store);
 void rgw_log_usage_finalize();
 void rgw_format_ops_log_entry(struct rgw_log_entry& entry,
 void rgw_log_usage_init(CephContext* cct, rgw::sal::Store* store);
 void rgw_log_usage_finalize();
 void rgw_format_ops_log_entry(struct rgw_log_entry& entry,
index 2e971c329c8752c097a63e7e175efee7884ce539..f1aa5e5b34f84a2184acac7cbd59e91a3941d991 100644 (file)
@@ -27,9 +27,9 @@ int RequestLog(lua_State* L)
   const auto rest = reinterpret_cast<RGWREST*>(lua_touserdata(L, lua_upvalueindex(1)));
   const auto olog = reinterpret_cast<OpsLogSink*>(lua_touserdata(L, lua_upvalueindex(2)));
   const auto s = reinterpret_cast<req_state*>(lua_touserdata(L, lua_upvalueindex(3)));
   const auto rest = reinterpret_cast<RGWREST*>(lua_touserdata(L, lua_upvalueindex(1)));
   const auto olog = reinterpret_cast<OpsLogSink*>(lua_touserdata(L, lua_upvalueindex(2)));
   const auto s = reinterpret_cast<req_state*>(lua_touserdata(L, lua_upvalueindex(3)));
-  const std::string op_name(reinterpret_cast<const char*>(lua_touserdata(L, lua_upvalueindex(4))));
+  const auto op(reinterpret_cast<RGWOp*>(lua_touserdata(L, lua_upvalueindex(4))));
   if (s) {
   if (s) {
-    const auto rc = rgw_log_op(rest, s, op_name, olog);
+    const auto rc = rgw_log_op(rest, s, op, olog);
     lua_pushinteger(L, rc);
   } else {
     ldpp_dout(s, 1) << "Lua ERROR: missing request state, cannot use ops log"  << dendl;
     lua_pushinteger(L, rc);
   } else {
     ldpp_dout(s, 1) << "Lua ERROR: missing request state, cannot use ops log"  << dendl;
@@ -793,11 +793,11 @@ int execute(
     RGWREST* rest,
     OpsLogSink* olog,
     req_state* s, 
     RGWREST* rest,
     OpsLogSink* olog,
     req_state* s, 
-    const char* op_name,
+    RGWOp* op,
     const std::string& script)
     const std::string& script)
-
 {
   auto L = luaL_newstate();
 {
   auto L = luaL_newstate();
+  const char* op_name = op ? op->name() : "Unknown";
   lua_state_guard lguard(L);
 
   open_standard_libs(L);
   lua_state_guard lguard(L);
 
   open_standard_libs(L);
@@ -816,7 +816,7 @@ int execute(
   lua_pushlightuserdata(L, rest);
   lua_pushlightuserdata(L, olog);
   lua_pushlightuserdata(L, s);
   lua_pushlightuserdata(L, rest);
   lua_pushlightuserdata(L, olog);
   lua_pushlightuserdata(L, s);
-  lua_pushlightuserdata(L, const_cast<char*>(op_name));
+  lua_pushlightuserdata(L, op);
   lua_pushcclosure(L, RequestLog, FOUR_UPVALS);
   lua_rawset(L, -3);
 
   lua_pushcclosure(L, RequestLog, FOUR_UPVALS);
   lua_rawset(L, -3);
 
index fcf0673f3ba7b5bb71c9cca394c9cd5f1bf3b642..17884069c032f301bfafe0c6c63385c9b7e6e535 100644 (file)
@@ -18,8 +18,8 @@ int execute(
     RGWREST* rest,
     OpsLogSink* olog,
     req_state *s, 
     RGWREST* rest,
     OpsLogSink* olog,
     req_state *s, 
-    const char* op_name,
+    RGWOp* op,
     const std::string& script);
 
     const std::string& script);
 
-}
+} // namespace rgw::lua::request
 
 
index e27fe27af233eb63f377d07fc3d0c72531aa1590..5812016f3d3128b655d8d93c00691bfd4ed155be 100644 (file)
@@ -37,6 +37,8 @@ protected:
   
 public:
   RGWMetadataObject() {}
   
 public:
   RGWMetadataObject() {}
+  RGWMetadataObject(const obj_version& v,
+                   real_time m) : objv(v), mtime(m) {}
   virtual ~RGWMetadataObject() {}
   obj_version& get_version();
   real_time& get_mtime() { return mtime; }
   virtual ~RGWMetadataObject() {}
   obj_version& get_version();
   real_time& get_mtime() { return mtime; }
index 0fa2ffc85aef9d3d324787a08163af1a898add92..09cfa355759c2dc991605d46cd7ed94722512d4a 100644 (file)
@@ -2397,6 +2397,8 @@ void RGWListBuckets::execute(optional_yield y)
       break;
     }
 
       break;
     }
 
+    is_truncated = buckets.is_truncated();
+
     /* We need to have stats for all our policies - even if a given policy
      * isn't actually used in a given account. In such situation its usage
      * stats would be simply full of zeros. */
     /* We need to have stats for all our policies - even if a given policy
      * isn't actually used in a given account. In such situation its usage
      * stats would be simply full of zeros. */
@@ -5786,23 +5788,23 @@ void RGWPutLC::execute(optional_yield y)
   RGWXMLParser parser;
   RGWLifecycleConfiguration_S3 new_config(s->cct);
 
   RGWXMLParser parser;
   RGWLifecycleConfiguration_S3 new_config(s->cct);
 
-  content_md5 = s->info.env->get("HTTP_CONTENT_MD5");
-  if (content_md5 == nullptr) {
-    op_ret = -ERR_INVALID_REQUEST;
-    s->err.message = "Missing required header for this request: Content-MD5";
-    ldpp_dout(this, 5) << s->err.message << dendl;
-    return;
-  }
+  // amazon says that Content-MD5 is required for this op specifically, but MD5
+  // is not a security primitive and FIPS mode makes it difficult to use. if the
+  // client provides the header we'll try to verify its checksum, but the header
+  // itself is no longer required
+  std::optional<std::string> content_md5_bin;
 
 
-  std::string content_md5_bin;
-  try {
-    content_md5_bin = rgw::from_base64(std::string_view(content_md5));
-  } catch (...) {
-    s->err.message = "Request header Content-MD5 contains character "
-                     "that is not base64 encoded.";
-    ldpp_dout(this, 5) << s->err.message << dendl;
-    op_ret = -ERR_BAD_DIGEST;
-    return;
+  content_md5 = s->info.env->get("HTTP_CONTENT_MD5");
+  if (content_md5 != nullptr) {
+    try {
+      content_md5_bin = rgw::from_base64(std::string_view(content_md5));
+    } catch (...) {
+      s->err.message = "Request header Content-MD5 contains character "
+                       "that is not base64 encoded.";
+      ldpp_dout(this, 5) << s->err.message << dendl;
+      op_ret = -ERR_BAD_DIGEST;
+      return;
+    }
   }
 
   if (!parser.init()) {
   }
 
   if (!parser.init()) {
@@ -5817,21 +5819,23 @@ void RGWPutLC::execute(optional_yield y)
   char* buf = data.c_str();
   ldpp_dout(this, 15) << "read len=" << data.length() << " data=" << (buf ? buf : "") << dendl;
 
   char* buf = data.c_str();
   ldpp_dout(this, 15) << "read len=" << data.length() << " data=" << (buf ? buf : "") << dendl;
 
-  MD5 data_hash;
-  // Allow use of MD5 digest in FIPS mode for non-cryptographic purposes
-  data_hash.SetFlags(EVP_MD_CTX_FLAG_NON_FIPS_ALLOW);
-  unsigned char data_hash_res[CEPH_CRYPTO_MD5_DIGESTSIZE];
-  data_hash.Update(reinterpret_cast<const unsigned char*>(buf), data.length());
-  data_hash.Final(data_hash_res);
+  if (content_md5_bin) {
+    MD5 data_hash;
+    // Allow use of MD5 digest in FIPS mode for non-cryptographic purposes
+    data_hash.SetFlags(EVP_MD_CTX_FLAG_NON_FIPS_ALLOW);
+    unsigned char data_hash_res[CEPH_CRYPTO_MD5_DIGESTSIZE];
+    data_hash.Update(reinterpret_cast<const unsigned char*>(buf), data.length());
+    data_hash.Final(data_hash_res);
 
 
-  if (memcmp(data_hash_res, content_md5_bin.c_str(), CEPH_CRYPTO_MD5_DIGESTSIZE) != 0) {
-    op_ret = -ERR_BAD_DIGEST;
-    s->err.message = "The Content-MD5 you specified did not match what we received.";
-    ldpp_dout(this, 5) << s->err.message
-                     << " Specified content md5: " << content_md5
-                     << ", calculated content md5: " << data_hash_res
-                     << dendl;
-    return;
+    if (memcmp(data_hash_res, content_md5_bin->c_str(), CEPH_CRYPTO_MD5_DIGESTSIZE) != 0) {
+      op_ret = -ERR_BAD_DIGEST;
+      s->err.message = "The Content-MD5 you specified did not match what we received.";
+      ldpp_dout(this, 5) << s->err.message
+                       << " Specified content md5: " << content_md5
+                       << ", calculated content md5: " << data_hash_res
+                       << dendl;
+      return;
+    }
   }
 
   if (!parser.parse(buf, data.length(), 1)) {
   }
 
   if (!parser.parse(buf, data.length(), 1)) {
@@ -6766,6 +6770,23 @@ void RGWDeleteMultiObj::pre_exec()
   rgw_bucket_object_pre_exec(s);
 }
 
   rgw_bucket_object_pre_exec(s);
 }
 
+void RGWDeleteMultiObj::write_ops_log_entry(rgw_log_entry& entry) const {
+  int num_err = 0;
+  int num_ok = 0;
+  for (auto iter = ops_log_entries.begin();
+       iter != ops_log_entries.end();
+       ++iter) {
+    if (iter->error) {
+      num_err++;
+    } else {
+      num_ok++;
+    }
+  }
+  entry.delete_multi_obj_meta.num_err = num_err;
+  entry.delete_multi_obj_meta.num_ok = num_ok;
+  entry.delete_multi_obj_meta.objects = std::move(ops_log_entries);
+}
+
 void RGWDeleteMultiObj::execute(optional_yield y)
 {
   RGWMultiDelDelete *multi_delete;
 void RGWDeleteMultiObj::execute(optional_yield y)
 {
   RGWMultiDelDelete *multi_delete;
index c5bd7f62a3d5dfb89d28ae6befac7abd0dd5e6fd..fa246fe26a25d4cf13a874b5cc91a4bd58da54de 100644 (file)
@@ -44,6 +44,7 @@
 #include "rgw_putobj.h"
 #include "rgw_sal.h"
 #include "rgw_compression_types.h"
 #include "rgw_putobj.h"
 #include "rgw_sal.h"
 #include "rgw_compression_types.h"
+#include "rgw_log.h"
 
 #include "rgw_lc.h"
 #include "rgw_torrent.h"
 
 #include "rgw_lc.h"
 #include "rgw_torrent.h"
@@ -278,6 +279,7 @@ public:
 
   virtual dmc::client_id dmclock_client() { return dmc::client_id::metadata; }
   virtual dmc::Cost dmclock_cost() { return 1; }
 
   virtual dmc::client_id dmclock_client() { return dmc::client_id::metadata; }
   virtual dmc::Cost dmclock_cost() { return 1; }
+  virtual void write_ops_log_entry(rgw_log_entry& entry) const {};
 };
 
 class RGWDefaultResponseOp : public RGWOp {
 };
 
 class RGWDefaultResponseOp : public RGWOp {
@@ -2021,6 +2023,7 @@ public:
 
 class RGWDeleteMultiObj : public RGWOp {
 protected:
 
 class RGWDeleteMultiObj : public RGWOp {
 protected:
+  std::vector<delete_multi_obj_entry> ops_log_entries;
   bufferlist data;
   rgw::sal::Bucket* bucket;
   bool quiet;
   bufferlist data;
   rgw::sal::Bucket* bucket;
   bool quiet;
@@ -2050,6 +2053,8 @@ public:
   const char* name() const override { return "multi_object_delete"; }
   RGWOpType get_type() override { return RGW_OP_DELETE_MULTI_OBJ; }
   uint32_t op_mask() override { return RGW_OP_TYPE_DELETE; }
   const char* name() const override { return "multi_object_delete"; }
   RGWOpType get_type() override { return RGW_OP_DELETE_MULTI_OBJ; }
   uint32_t op_mask() override { return RGW_OP_TYPE_DELETE; }
+
+  void write_ops_log_entry(rgw_log_entry& entry) const override;
 };
 
 class RGWInfo: public RGWOp {
 };
 
 class RGWInfo: public RGWOp {
index f8d43a3258d225ee735018bb5ee11168a504ff8f..413c1150dd2c389ec4fb0226f88c536a6cba00da 100644 (file)
@@ -338,7 +338,7 @@ int process_request(rgw::sal::Store* const store,
     } else if (rc < 0) {
       ldpp_dout(op, 5) << "WARNING: failed to read pre request script. error: " << rc << dendl;
     } else {
     } else if (rc < 0) {
       ldpp_dout(op, 5) << "WARNING: failed to read pre request script. error: " << rc << dendl;
     } else {
-      rc = rgw::lua::request::execute(store, rest, olog, s, op->name(), script);
+      rc = rgw::lua::request::execute(store, rest, olog, s, op, script);
       if (rc < 0) {
         ldpp_dout(op, 5) << "WARNING: failed to execute pre request script. error: " << rc << dendl;
       }
       if (rc < 0) {
         ldpp_dout(op, 5) << "WARNING: failed to execute pre request script. error: " << rc << dendl;
       }
@@ -420,7 +420,7 @@ done:
     } else if (rc < 0) {
       ldpp_dout(op, 5) << "WARNING: failed to read post request script. error: " << rc << dendl;
     } else {
     } else if (rc < 0) {
       ldpp_dout(op, 5) << "WARNING: failed to read post request script. error: " << rc << dendl;
     } else {
-      rc = rgw::lua::request::execute(store, rest, olog, s, op->name(), script);
+      rc = rgw::lua::request::execute(store, rest, olog, s, op, script);
       if (rc < 0) {
         ldpp_dout(op, 5) << "WARNING: failed to execute post request script. error: " << rc << dendl;
       }
       if (rc < 0) {
         ldpp_dout(op, 5) << "WARNING: failed to execute post request script. error: " << rc << dendl;
       }
@@ -434,7 +434,7 @@ done:
             << e.what() << dendl;
   }
   if (should_log) {
             << e.what() << dendl;
   }
   if (should_log) {
-    rgw_log_op(rest, s, (op ? op->name() : "unknown"), olog);
+    rgw_log_op(rest, s, op, olog);
   }
 
   if (http_ret != nullptr) {
   }
 
   if (http_ret != nullptr) {
index 80d39794c83018bcc37912d4f43f63c91e8f5d85..f0045d6f1686a67ab57506c88847aedbe686a7db 100644 (file)
@@ -18,6 +18,7 @@
 #include "rgw_multi.h"
 #include "rgw_compression.h"
 #include "services/svc_sys_obj.h"
 #include "rgw_multi.h"
 #include "rgw_compression.h"
 #include "services/svc_sys_obj.h"
+#include "services/svc_zone.h"
 #include "rgw_sal_rados.h"
 
 #define dout_subsys ceph_subsys_rgw
 #include "rgw_sal_rados.h"
 
 #define dout_subsys ceph_subsys_rgw
@@ -246,7 +247,12 @@ int AtomicObjectProcessor::prepare(optional_yield y)
   }
 
   if (same_pool) {
   }
 
   if (same_pool) {
-    head_max_size = max_head_chunk_size;
+    RGWZonePlacementInfo placement_info;
+    if (!store->svc()->zone->get_zone_params().get_placement(head_obj->get_bucket()->get_placement_rule().name, &placement_info) || placement_info.inline_data) {
+      head_max_size = max_head_chunk_size;
+    } else {
+      head_max_size = 0;
+    }
     chunk_size = max_head_chunk_size;
   }
 
     chunk_size = max_head_chunk_size;
   }
 
@@ -330,6 +336,11 @@ int AtomicObjectProcessor::complete(size_t accounted_size,
 
   r = obj_op.write_meta(dpp, actual_size, accounted_size, attrs, y);
   if (r < 0) {
 
   r = obj_op.write_meta(dpp, actual_size, accounted_size, attrs, y);
   if (r < 0) {
+    if (r == -ETIMEDOUT) {
+      // The head object write may eventually succeed, clear the set of objects for deletion. if it
+      // doesn't ever succeed, we'll orphan any tail objects as if we'd crashed before that write
+      writer.clear_written();
+    }
     return r;
   }
   if (!obj_op.meta.canceled) {
     return r;
   }
   if (!obj_op.meta.canceled) {
index bc6c34e68bffb563f3e6f7c98567ea332b2899a6..bc897993d2764c36a52147b969af9724bb2a1d9c 100644 (file)
@@ -804,121 +804,64 @@ struct complete_op_data {
   }
 };
 
   }
 };
 
-class RGWIndexCompletionThread : public RGWRadosThread, public DoutPrefixProvider {
-  RGWRados *store;
-
-  uint64_t interval_msec() override {
-    return 0;
-  }
-
-  list<complete_op_data *> completions;
-
-  ceph::mutex completions_lock =
-    ceph::make_mutex("RGWIndexCompletionThread::completions_lock");
-public:
-  RGWIndexCompletionThread(RGWRados *_store)
-    : RGWRadosThread(_store, "index-complete"), store(_store) {}
-
-  int process(const DoutPrefixProvider *dpp) override;
-
-  void add_completion(complete_op_data *completion) {
-    {
-      std::lock_guard l{completions_lock};
-      completions.push_back(completion);
-    }
-
-    signal();
-  }
-
-  CephContext *get_cct() const override { return store->ctx(); }
-  unsigned get_subsys() const { return dout_subsys; }
-  std::ostream& gen_prefix(std::ostream& out) const { return out << "rgw index completion thread: "; }
-};
-
-int RGWIndexCompletionThread::process(const DoutPrefixProvider *dpp)
-{
-  list<complete_op_data *> comps;
-
-  {
-    std::lock_guard l{completions_lock};
-    completions.swap(comps);
-  }
-
-  for (auto c : comps) {
-    std::unique_ptr<complete_op_data> up{c};
+class RGWIndexCompletionManager {
+  RGWRados* const store;
+  const int num_shards;
+  ceph::containers::tiny_vector<ceph::mutex> locks;
+  std::vector<set<complete_op_data*>> completions;
+  std::vector<complete_op_data*> retry_completions;
 
 
-    if (going_down()) {
-      continue;
-    }
-    ldpp_dout(this, 20) << __func__ << "(): handling completion for key=" << c->key << dendl;
+  std::condition_variable cond;
+  std::mutex retry_completions_lock;
+  bool _stop{false};
+  std::thread retry_thread;
 
 
-    RGWRados::BucketShard bs(store);
-    RGWBucketInfo bucket_info;
+  std::atomic<int> cur_shard {0};
 
 
-    int r = bs.init(c->obj.bucket, c->obj, &bucket_info, this);
-    if (r < 0) {
-      ldpp_dout(this, 0) << "ERROR: " << __func__ << "(): failed to initialize BucketShard, obj=" << c->obj << " r=" << r << dendl;
-      /* not much to do */
-      continue;
+  void process();
+  
+  void add_completion(complete_op_data *completion);
+  
+  void stop() {
+    if (retry_thread.joinable()) {
+      _stop = true;
+      cond.notify_all();
+      retry_thread.join();
     }
 
     }
 
-    r = store->guard_reshard(this, &bs, c->obj, bucket_info,
-                            [&](RGWRados::BucketShard *bs) -> int {
-                              librados::ObjectWriteOperation o;
-                              cls_rgw_guard_bucket_resharding(o, -ERR_BUSY_RESHARDING);
-                              cls_rgw_bucket_complete_op(o, c->op, c->tag, c->ver, c->key, c->dir_meta, &c->remove_objs,
-                                                         c->log_op, c->bilog_op, &c->zones_trace);
-                              return bs->bucket_obj.operate(this, &o, null_yield);
-                             });
-    if (r < 0) {
-      ldpp_dout(this, 0) << "ERROR: " << __func__ << "(): bucket index completion failed, obj=" << c->obj << " r=" << r << dendl;
-      /* ignoring error, can't do anything about it */
-      continue;
-    }
-    r = store->svc.datalog_rados->add_entry(this, bucket_info, bs.shard_id);
-    if (r < 0) {
-      ldpp_dout(this, -1) << "ERROR: failed writing data log" << dendl;
+    for (int i = 0; i < num_shards; ++i) {
+      std::lock_guard l{locks[i]};
+      for (auto c : completions[i]) {
+        c->stop();
+      }
     }
     }
+    completions.clear();
+  }
+  
+  int next_shard() {
+    int result = cur_shard % num_shards;
+    cur_shard++;
+    return result;
   }
   }
-
-  return 0;
-}
-
-class RGWIndexCompletionManager {
-  RGWRados *store{nullptr};
-  ceph::containers::tiny_vector<ceph::mutex> locks;
-  vector<set<complete_op_data *> > completions;
-
-  RGWIndexCompletionThread *completion_thread{nullptr};
-
-  int num_shards;
-
-  std::atomic<int> cur_shard {0};
-
 
 public:
   RGWIndexCompletionManager(RGWRados *_store) :
     store(_store),
 
 public:
   RGWIndexCompletionManager(RGWRados *_store) :
     store(_store),
+    num_shards(store->ctx()->_conf->rgw_thread_pool_size),
     locks{ceph::make_lock_container<ceph::mutex>(
     locks{ceph::make_lock_container<ceph::mutex>(
-      store->ctx()->_conf->rgw_thread_pool_size,
+      num_shards,
       [](const size_t i) {
         return ceph::make_mutex("RGWIndexCompletionManager::lock::" +
                                std::to_string(i));
       [](const size_t i) {
         return ceph::make_mutex("RGWIndexCompletionManager::lock::" +
                                std::to_string(i));
-      })}
-  {
-    num_shards = store->ctx()->_conf->rgw_thread_pool_size;
-    completions.resize(num_shards);
-  }
+      })},
+    completions(num_shards),
+    retry_thread(&RGWIndexCompletionManager::process, this)
+    {}
+
   ~RGWIndexCompletionManager() {
     stop();
   }
 
   ~RGWIndexCompletionManager() {
     stop();
   }
 
-  int next_shard() {
-    int result = cur_shard % num_shards;
-    cur_shard++;
-    return result;
-  }
-
   void create_completion(const rgw_obj& obj,
                          RGWModifyOp op, string& tag,
                          rgw_bucket_entry_ver& ver,
   void create_completion(const rgw_obj& obj,
                          RGWModifyOp op, string& tag,
                          rgw_bucket_entry_ver& ver,
@@ -928,36 +871,17 @@ public:
                          uint16_t bilog_op,
                          rgw_zone_set *zones_trace,
                          complete_op_data **result);
                          uint16_t bilog_op,
                          rgw_zone_set *zones_trace,
                          complete_op_data **result);
-  bool handle_completion(completion_t cb, complete_op_data *arg);
 
 
-  int start(const DoutPrefixProvider *dpp) {
-    completion_thread = new RGWIndexCompletionThread(store);
-    int ret = completion_thread->init(dpp);
-    if (ret < 0) {
-      return ret;
-    }
-    completion_thread->start();
-    return 0;
-  }
-  void stop() {
-    if (completion_thread) {
-      completion_thread->stop();
-      delete completion_thread;
-    }
+  bool handle_completion(completion_t cb, complete_op_data *arg);
 
 
-    for (int i = 0; i < num_shards; ++i) {
-      std::lock_guard l{locks[i]};
-      for (auto c : completions[i]) {
-        c->stop();
-      }
-    }
-    completions.clear();
+  CephContext* ctx() {
+    return store->ctx();
   }
 };
 
 static void obj_complete_cb(completion_t cb, void *arg)
 {
   }
 };
 
 static void obj_complete_cb(completion_t cb, void *arg)
 {
-  complete_op_data *completion = (complete_op_data *)arg;
+  complete_op_data *completion = reinterpret_cast<complete_op_data*>(arg);
   completion->lock.lock();
   if (completion->stopped) {
     completion->lock.unlock(); /* can drop lock, no one else is referencing us */
   completion->lock.lock();
   if (completion->stopped) {
     completion->lock.unlock(); /* can drop lock, no one else is referencing us */
@@ -971,6 +895,57 @@ static void obj_complete_cb(completion_t cb, void *arg)
   }
 }
 
   }
 }
 
+void RGWIndexCompletionManager::process()
+{
+  DoutPrefix dpp(store->ctx(), dout_subsys, "rgw index completion thread: ");
+  while(!_stop) {
+    std::vector<complete_op_data*> comps;
+
+    {
+      std::unique_lock l{retry_completions_lock};
+      cond.wait(l, [this](){return _stop || !retry_completions.empty();});
+      if (_stop) {
+        return;
+      }
+      retry_completions.swap(comps);
+    }
+
+    for (auto c : comps) {
+      std::unique_ptr<complete_op_data> up{c};
+
+      ldpp_dout(&dpp, 20) << __func__ << "(): handling completion for key=" << c->key << dendl;
+
+      RGWRados::BucketShard bs(store);
+      RGWBucketInfo bucket_info;
+
+      int r = bs.init(c->obj.bucket, c->obj, &bucket_info, &dpp);
+      if (r < 0) {
+        ldpp_dout(&dpp, 0) << "ERROR: " << __func__ << "(): failed to initialize BucketShard, obj=" << c->obj << " r=" << r << dendl;
+        /* not much to do */
+        continue;
+      }
+
+      r = store->guard_reshard(&dpp, &bs, c->obj, bucket_info,
+                            [&](RGWRados::BucketShard *bs) -> int {
+                              librados::ObjectWriteOperation o;
+                              cls_rgw_guard_bucket_resharding(o, -ERR_BUSY_RESHARDING);
+                              cls_rgw_bucket_complete_op(o, c->op, c->tag, c->ver, c->key, c->dir_meta, &c->remove_objs,
+                                                         c->log_op, c->bilog_op, &c->zones_trace);
+                              return bs->bucket_obj.operate(&dpp, &o, null_yield);
+                             });
+      if (r < 0) {
+        ldpp_dout(&dpp, 0) << "ERROR: " << __func__ << "(): bucket index completion failed, obj=" << c->obj << " r=" << r << dendl;
+        /* ignoring error, can't do anything about it */
+        continue;
+      }
+
+      r = store->svc.datalog_rados->add_entry(&dpp, bucket_info, bs.shard_id);
+      if (r < 0) {
+        ldpp_dout(&dpp, -1) << "ERROR: failed writing data log" << dendl;
+      }
+    }
+  }
+}
 
 void RGWIndexCompletionManager::create_completion(const rgw_obj& obj,
                                                   RGWModifyOp op, string& tag,
 
 void RGWIndexCompletionManager::create_completion(const rgw_obj& obj,
                                                   RGWModifyOp op, string& tag,
@@ -1014,7 +989,16 @@ void RGWIndexCompletionManager::create_completion(const rgw_obj& obj,
   entry->rados_completion = librados::Rados::aio_create_completion(entry, obj_complete_cb);
 
   std::lock_guard l{locks[shard_id]};
   entry->rados_completion = librados::Rados::aio_create_completion(entry, obj_complete_cb);
 
   std::lock_guard l{locks[shard_id]};
-  completions[shard_id].insert(entry);
+  const auto ok = completions[shard_id].insert(entry).second;
+  ceph_assert(ok);
+}
+
+void RGWIndexCompletionManager::add_completion(complete_op_data *completion) {
+  {
+    std::lock_guard l{retry_completions_lock};
+    retry_completions.push_back(completion);
+  }
+  cond.notify_all();
 }
 
 bool RGWIndexCompletionManager::handle_completion(completion_t cb, complete_op_data *arg)
 }
 
 bool RGWIndexCompletionManager::handle_completion(completion_t cb, complete_op_data *arg)
@@ -1027,6 +1011,7 @@ bool RGWIndexCompletionManager::handle_completion(completion_t cb, complete_op_d
 
     auto iter = comps.find(arg);
     if (iter == comps.end()) {
 
     auto iter = comps.find(arg);
     if (iter == comps.end()) {
+      ldout(arg->manager->ctx(), 0) << __func__ << "(): cannot find completion for obj=" << arg->key << dendl;
       return true;
     }
 
       return true;
     }
 
@@ -1035,9 +1020,13 @@ bool RGWIndexCompletionManager::handle_completion(completion_t cb, complete_op_d
 
   int r = rados_aio_get_return_value(cb);
   if (r != -ERR_BUSY_RESHARDING) {
 
   int r = rados_aio_get_return_value(cb);
   if (r != -ERR_BUSY_RESHARDING) {
+    ldout(arg->manager->ctx(), 20) << __func__ << "(): completion " << 
+      (r == 0 ? "ok" : "failed with " + to_string(r)) << 
+      " for obj=" << arg->key << dendl;
     return true;
   }
     return true;
   }
-  completion_thread->add_completion(arg);
+  add_completion(arg);
+  ldout(arg->manager->ctx(), 20) << __func__ << "(): async completion added for obj=" << arg->key << dendl;
   return false;
 }
 
   return false;
 }
 
@@ -1359,10 +1348,6 @@ int RGWRados::init_complete(const DoutPrefixProvider *dpp)
   }
 
   index_completion_manager = new RGWIndexCompletionManager(this);
   }
 
   index_completion_manager = new RGWIndexCompletionManager(this);
-  ret = index_completion_manager->start(dpp);
-  if (ret < 0) {
-    return ret;
-  }
   ret = rgw::notify::init(cct, store, dpp);
   if (ret < 0 ) {
     ldpp_dout(dpp, 1) << "ERROR: failed to initialize notification manager" << dendl;
   ret = rgw::notify::init(cct, store, dpp);
   if (ret < 0 ) {
     ldpp_dout(dpp, 1) << "ERROR: failed to initialize notification manager" << dendl;
@@ -1382,7 +1367,7 @@ int RGWRados::init_svc(bool raw, const DoutPrefixProvider *dpp)
 
 int RGWRados::init_ctl(const DoutPrefixProvider *dpp)
 {
 
 int RGWRados::init_ctl(const DoutPrefixProvider *dpp)
 {
-  return ctl.init(&svc, dpp);
+  return ctl.init(&svc, store, dpp);
 }
 
 /** 
 }
 
 /** 
@@ -2433,19 +2418,25 @@ std::string RGWRados::get_cluster_fsid(const DoutPrefixProvider *dpp, optional_y
   return svc.rados->cluster_fsid();
 }
 
   return svc.rados->cluster_fsid();
 }
 
-int RGWRados::get_obj_head_ioctx(const DoutPrefixProvider *dpp, const RGWBucketInfo& bucket_info, const rgw_obj& obj, librados::IoCtx *ioctx)
+int RGWRados::get_obj_head_ioctx(const DoutPrefixProvider *dpp,
+                                const RGWBucketInfo& bucket_info,
+                                const rgw_obj& obj,
+                                librados::IoCtx *ioctx)
 {
 {
-  string oid, key;
+  std::string oid, key;
   get_obj_bucket_and_oid_loc(obj, oid, key);
 
   rgw_pool pool;
   if (!get_obj_data_pool(bucket_info.placement_rule, obj, &pool)) {
   get_obj_bucket_and_oid_loc(obj, oid, key);
 
   rgw_pool pool;
   if (!get_obj_data_pool(bucket_info.placement_rule, obj, &pool)) {
-    ldpp_dout(dpp, 0) << "ERROR: cannot get data pool for obj=" << obj << ", probably misconfiguration" << dendl;
+    ldpp_dout(dpp, 0) << "ERROR: cannot get data pool for obj=" << obj <<
+      ", probably misconfiguration" << dendl;
     return -EIO;
   }
 
   int r = open_pool_ctx(dpp, pool, *ioctx, false);
   if (r < 0) {
     return -EIO;
   }
 
   int r = open_pool_ctx(dpp, pool, *ioctx, false);
   if (r < 0) {
+    ldpp_dout(dpp, 0) << "ERROR: unable to open data-pool=" << pool.to_str() <<
+      " for obj=" << obj << " with error-code=" << r << dendl;
     return r;
   }
 
     return r;
   }
 
@@ -4956,10 +4947,10 @@ int RGWRados::Object::complete_atomic_modification(const DoutPrefixProvider *dpp
     //Delete objects inline just in case gc hasn't been initialised, prevents crashes
     store->delete_objs_inline(dpp, chain, tag);
   } else {
     //Delete objects inline just in case gc hasn't been initialised, prevents crashes
     store->delete_objs_inline(dpp, chain, tag);
   } else {
-    auto ret = store->gc->send_chain(chain, tag); // do it synchronously
-    if (ret < 0) {
+    auto [ret, leftover_chain] = store->gc->send_split_chain(chain, tag); // do it synchronously
+    if (ret < 0 && leftover_chain) {
       //Delete objects inline if send chain to gc fails
       //Delete objects inline if send chain to gc fails
-      store->delete_objs_inline(dpp, chain, tag);
+      store->delete_objs_inline(dpp, *leftover_chain, tag);
     }
   }
   return 0;
     }
   }
   return 0;
@@ -4979,13 +4970,13 @@ void RGWRados::update_gc_chain(const DoutPrefixProvider *dpp, rgw_obj& head_obj,
   }
 }
 
   }
 }
 
-int RGWRados::send_chain_to_gc(cls_rgw_obj_chain& chain, const string& tag)
+std::tuple<int, std::optional<cls_rgw_obj_chain>> RGWRados::send_chain_to_gc(cls_rgw_obj_chain& chain, const string& tag)
 {
   if (chain.empty()) {
 {
   if (chain.empty()) {
-    return 0;
+    return {0, std::nullopt};
   }
 
   }
 
-  return gc->send_chain(chain, tag);
+  return gc->send_split_chain(chain, tag);
 }
 
 void RGWRados::delete_objs_inline(const DoutPrefixProvider *dpp, cls_rgw_obj_chain& chain, const string& tag)
 }
 
 void RGWRados::delete_objs_inline(const DoutPrefixProvider *dpp, cls_rgw_obj_chain& chain, const string& tag)
@@ -5093,7 +5084,14 @@ int RGWRados::bucket_set_reshard(const DoutPrefixProvider *dpp, const RGWBucketI
     return r;
   }
 
     return r;
   }
 
-  return CLSRGWIssueSetBucketResharding(index_pool.ioctx(), bucket_objs, entry, cct->_conf->rgw_bucket_index_max_aio)();
+  r = CLSRGWIssueSetBucketResharding(index_pool.ioctx(), bucket_objs, entry, cct->_conf->rgw_bucket_index_max_aio)();
+  if (r < 0) {
+    ldpp_dout(dpp, 0) << "ERROR: " << __func__ <<
+      ": unable to issue set bucket resharding, r=" << r << " (" <<
+      cpp_strerror(-r) << ")" << dendl;
+  }
+
+  return r;
 }
 
 int RGWRados::defer_gc(const DoutPrefixProvider *dpp, void *ctx, const RGWBucketInfo& bucket_info, const rgw_obj& obj, optional_yield y)
 }
 
 int RGWRados::defer_gc(const DoutPrefixProvider *dpp, void *ctx, const RGWBucketInfo& bucket_info, const rgw_obj& obj, optional_yield y)
@@ -6203,27 +6201,62 @@ int RGWRados::Bucket::UpdateIndex::guard_reshard(const DoutPrefixProvider *dpp,
       ldpp_dout(dpp, 5) << "failed to get BucketShard object: ret=" << ret << dendl;
       return ret;
     }
       ldpp_dout(dpp, 5) << "failed to get BucketShard object: ret=" << ret << dendl;
       return ret;
     }
+
     r = call(bs);
     r = call(bs);
-    if (r != -ERR_BUSY_RESHARDING) {
+    if (r != -ERR_BUSY_RESHARDING && r != -ENOENT) {
       break;
     }
       break;
     }
-    ldpp_dout(dpp, 0) << "NOTICE: resharding operation on bucket index detected, blocking" << dendl;
-    string new_bucket_id;
-    r = store->block_while_resharding(bs, &new_bucket_id,
-                                      target->bucket_info, null_yield, dpp);
-    if (r == -ERR_BUSY_RESHARDING) {
-      continue;
-    }
-    if (r < 0) {
-      return r;
+
+    std::string new_bucket_id;
+
+    // different logic depending whether resharding completed or is
+    // underway
+
+    if (r == -ENOENT) { // case where resharding must have completed
+      ldpp_dout(dpp, 0) <<
+       "NOTICE: resharding operation recently completed, invalidating "
+       "old BucketInfo" << dendl;
+
+      r = store->fetch_new_bucket_id(target->bucket_info,
+                                    nullptr,
+                                    new_bucket_id, dpp);
+      if (r == -ENOENT) {
+       // apparently this op raced with a bucket deletion
+       ldpp_dout(dpp, 10) << "WARNING: " << __func__ <<
+         " unable to fetch bucket_id, apparently due to race "
+         "with deletion of bucket: " <<
+         target->bucket_info.bucket.get_key() << dendl;
+       return -ERR_NO_SUCH_BUCKET;
+      } else if (r < 0) {
+       ldpp_dout(dpp, 0) << "ERROR: " << __func__ <<
+         " unable to refresh stale bucket_id after reshard; r=" <<
+         r << dendl;
+       return r;
+      }
+    } else { // must have been resharding at the time
+      ldpp_dout(dpp, 0) << "NOTICE: resharding operation on bucket index detected, blocking" << dendl;
+
+      r = store->block_while_resharding(bs, &new_bucket_id,
+                                       target->bucket_info, null_yield, dpp);
+      if (r == -ERR_BUSY_RESHARDING) {
+       continue;
+      }
+      if (r < 0) {
+       return r;
+      }
+
+      ldpp_dout(dpp, 20) << "reshard completion identified, new_bucket_id=" << new_bucket_id << dendl;
+      i = 0; /* resharding is finished, make sure we can retry */
     }
     }
-    ldpp_dout(dpp, 20) << "reshard completion identified, new_bucket_id=" << new_bucket_id << dendl;
-    i = 0; /* resharding is finished, make sure we can retry */
+
+    // common portion -- finished resharding either way
+
     r = target->update_bucket_id(new_bucket_id, dpp);
     if (r < 0) {
       ldpp_dout(dpp, 0) << "ERROR: update_bucket_id() new_bucket_id=" << new_bucket_id << " returned r=" << r << dendl;
       return r;
     }
     r = target->update_bucket_id(new_bucket_id, dpp);
     if (r < 0) {
       ldpp_dout(dpp, 0) << "ERROR: update_bucket_id() new_bucket_id=" << new_bucket_id << " returned r=" << r << dendl;
       return r;
     }
+
     invalidate_bs();
   } // for loop
 
     invalidate_bs();
   } // for loop
 
@@ -6847,8 +6880,29 @@ int RGWRados::guard_reshard(const DoutPrefixProvider *dpp,
   return 0;
 }
 
   return 0;
 }
 
+
+int RGWRados::fetch_new_bucket_id(
+  const RGWBucketInfo& curr_bucket_info,
+  RGWBucketInfo* save_bucket_info, // nullptr -> no save
+  std::string& new_bucket_id,
+  const DoutPrefixProvider* dpp)
+{
+  RGWBucketInfo local_bucket_info; // use if save_bucket_info is null
+  RGWBucketInfo* bip = save_bucket_info ? save_bucket_info : &local_bucket_info;
+  *bip = curr_bucket_info; // copy
+
+  int ret = try_refresh_bucket_info(*bip, nullptr, dpp);
+  if (ret < 0) {
+    return ret;
+  }
+
+  new_bucket_id = bip->bucket.bucket_id;
+  return 0;
+} // fetch_new_bucket_id
+
+
 int RGWRados::block_while_resharding(RGWRados::BucketShard *bs,
 int RGWRados::block_while_resharding(RGWRados::BucketShard *bs,
-                                    string *new_bucket_id,
+                                    std::string *new_bucket_id,
                                      const RGWBucketInfo& bucket_info,
                                      optional_yield y,
                                      const DoutPrefixProvider *dpp)
                                      const RGWBucketInfo& bucket_info,
                                      optional_yield y,
                                      const DoutPrefixProvider *dpp)
@@ -6856,32 +6910,18 @@ int RGWRados::block_while_resharding(RGWRados::BucketShard *bs,
   int ret = 0;
   cls_rgw_bucket_instance_entry entry;
 
   int ret = 0;
   cls_rgw_bucket_instance_entry entry;
 
-  // since we want to run this recovery code from two distinct places,
-  // let's just put it in a lambda so we can easily re-use; if the
-  // lambda successfully fetches a new bucket id, it sets
-  // new_bucket_id and returns 0, otherwise it returns a negative
-  // error code
-  auto fetch_new_bucket_id =
-    [this, &bucket_info, dpp](const std::string& log_tag,
-                        std::string* new_bucket_id) -> int {
-      RGWBucketInfo fresh_bucket_info = bucket_info;
-      int ret = try_refresh_bucket_info(fresh_bucket_info, nullptr, dpp);
-      if (ret < 0) {
-       ldpp_dout(dpp, 0) << __func__ <<
-         " ERROR: failed to refresh bucket info after reshard at " <<
-         log_tag << ": " << cpp_strerror(-ret) << dendl;
-       return ret;
-      }
-      *new_bucket_id = fresh_bucket_info.bucket.bucket_id;
-      return 0;
-    };
-
   constexpr int num_retries = 10;
   for (int i = 1; i <= num_retries; i++) { // nb: 1-based for loop
     auto& ref = bs->bucket_obj.get_ref();
     ret = cls_rgw_get_bucket_resharding(ref.pool.ioctx(), ref.obj.oid, &entry);
     if (ret == -ENOENT) {
   constexpr int num_retries = 10;
   for (int i = 1; i <= num_retries; i++) { // nb: 1-based for loop
     auto& ref = bs->bucket_obj.get_ref();
     ret = cls_rgw_get_bucket_resharding(ref.pool.ioctx(), ref.obj.oid, &entry);
     if (ret == -ENOENT) {
-      return fetch_new_bucket_id("get_bucket_resharding_failed", new_bucket_id);
+      ret = fetch_new_bucket_id(bucket_info, nullptr, *new_bucket_id, dpp);
+      if (ret < 0) {
+       ldpp_dout(dpp, 0) << "ERROR: " << __func__ <<
+         " failed to refresh bucket info after reshard when get bucket "
+         "resharding failed, error: " << cpp_strerror(-ret) << dendl;
+       return ret;
+      }
     } else if (ret < 0) {
       ldpp_dout(dpp, 0) << __func__ <<
        " ERROR: failed to get bucket resharding : " << cpp_strerror(-ret) <<
     } else if (ret < 0) {
       ldpp_dout(dpp, 0) << __func__ <<
        " ERROR: failed to get bucket resharding : " << cpp_strerror(-ret) <<
@@ -6890,8 +6930,13 @@ int RGWRados::block_while_resharding(RGWRados::BucketShard *bs,
     }
 
     if (!entry.resharding_in_progress()) {
     }
 
     if (!entry.resharding_in_progress()) {
-      return fetch_new_bucket_id("get_bucket_resharding_succeeded",
-                                new_bucket_id);
+      ret = fetch_new_bucket_id(bucket_info, nullptr, *new_bucket_id, dpp);
+      if (ret < 0) {
+       ldpp_dout(dpp, 0) << "ERROR: " << __func__ <<
+         " failed to refresh bucket info after reshard when get bucket "
+         "resharding succeeded, error: " << cpp_strerror(-ret) << dendl;
+       return ret;
+      }
     }
 
     ldpp_dout(dpp, 20) << "NOTICE: reshard still in progress; " <<
     }
 
     ldpp_dout(dpp, 20) << "NOTICE: reshard still in progress; " <<
@@ -6914,7 +6959,9 @@ int RGWRados::block_while_resharding(RGWRados::BucketShard *bs,
       std::string bucket_id = b.get_key();
       RGWBucketReshardLock reshard_lock(this->store, bucket_info, true);
       ret = reshard_lock.lock(dpp);
       std::string bucket_id = b.get_key();
       RGWBucketReshardLock reshard_lock(this->store, bucket_info, true);
       ret = reshard_lock.lock(dpp);
-      if (ret < 0) {
+      if (ret == -ENOENT) {
+       continue;
+      } else if (ret < 0) {
        ldpp_dout(dpp, 20) << __PRETTY_FUNCTION__ <<
          ": failed to take reshard lock for bucket " <<
          bucket_id << "; expected if resharding underway" << dendl;
        ldpp_dout(dpp, 20) << __PRETTY_FUNCTION__ <<
          ": failed to take reshard lock for bucket " <<
          bucket_id << "; expected if resharding underway" << dendl;
@@ -6922,14 +6969,21 @@ int RGWRados::block_while_resharding(RGWRados::BucketShard *bs,
        ldpp_dout(dpp, 10) << __PRETTY_FUNCTION__ <<
          ": was able to take reshard lock for bucket " <<
          bucket_id << dendl;
        ldpp_dout(dpp, 10) << __PRETTY_FUNCTION__ <<
          ": was able to take reshard lock for bucket " <<
          bucket_id << dendl;
+
        ret = RGWBucketReshard::clear_resharding(dpp, this->store, bucket_info);
        ret = RGWBucketReshard::clear_resharding(dpp, this->store, bucket_info);
-       if (ret < 0) {
-         reshard_lock.unlock();
+       reshard_lock.unlock();
+
+       if (ret == -ENOENT) {
+         ldpp_dout(dpp, 5) << __PRETTY_FUNCTION__ <<
+           " INFO: no need to reset reshard flags; old shards apparently"
+           " removed after successful resharding of bucket " <<
+           bucket_id << dendl;
+         continue;
+       } else if (ret < 0) {
          ldpp_dout(dpp, 0) << __PRETTY_FUNCTION__ <<
            " ERROR: failed to clear resharding flags for bucket " <<
          ldpp_dout(dpp, 0) << __PRETTY_FUNCTION__ <<
            " ERROR: failed to clear resharding flags for bucket " <<
-           bucket_id << dendl;
+           bucket_id << ", " << cpp_strerror(-ret) << dendl;
        } else {
        } else {
-         reshard_lock.unlock();
          ldpp_dout(dpp, 5) << __PRETTY_FUNCTION__ <<
            ": apparently successfully cleared resharding flags for "
            "bucket " << bucket_id << dendl;
          ldpp_dout(dpp, 5) << __PRETTY_FUNCTION__ <<
            ": apparently successfully cleared resharding flags for "
            "bucket " << bucket_id << dendl;
@@ -6978,6 +7032,7 @@ int RGWRados::bucket_index_link_olh(const DoutPrefixProvider *dpp, const RGWBuck
                      cls_rgw_obj_key key(obj_instance.key.get_index_key_name(), obj_instance.key.instance);
                      auto& ref = bs->bucket_obj.get_ref();
                      librados::ObjectWriteOperation op;
                      cls_rgw_obj_key key(obj_instance.key.get_index_key_name(), obj_instance.key.instance);
                      auto& ref = bs->bucket_obj.get_ref();
                      librados::ObjectWriteOperation op;
+                     op.assert_exists(); // bucket index shard must exist
                      cls_rgw_guard_bucket_resharding(op, -ERR_BUSY_RESHARDING);
                      cls_rgw_bucket_link_olh(op, key, olh_state.olh_tag,
                                               delete_marker, op_tag, meta, olh_epoch,
                      cls_rgw_guard_bucket_resharding(op, -ERR_BUSY_RESHARDING);
                      cls_rgw_bucket_link_olh(op, key, olh_state.olh_tag,
                                               delete_marker, op_tag, meta, olh_epoch,
@@ -7026,6 +7081,7 @@ int RGWRados::bucket_index_unlink_instance(const DoutPrefixProvider *dpp, const
                    [&](BucketShard *bs) -> int {
                      auto& ref = bs->bucket_obj.get_ref();
                      librados::ObjectWriteOperation op;
                    [&](BucketShard *bs) -> int {
                      auto& ref = bs->bucket_obj.get_ref();
                      librados::ObjectWriteOperation op;
+                     op.assert_exists(); // bucket index shard must exist
                      cls_rgw_guard_bucket_resharding(op, -ERR_BUSY_RESHARDING);
                      cls_rgw_bucket_unlink_instance(op, key, op_tag,
                                                     olh_tag, olh_epoch, svc.zone->get_zone().log_data, zones_trace);
                      cls_rgw_guard_bucket_resharding(op, -ERR_BUSY_RESHARDING);
                      cls_rgw_bucket_unlink_instance(op, key, op_tag,
                                                     olh_tag, olh_epoch, svc.zone->get_zone().log_data, zones_trace);
@@ -7063,33 +7119,25 @@ int RGWRados::bucket_index_read_olh_log(const DoutPrefixProvider *dpp,
 
   cls_rgw_obj_key key(obj_instance.key.get_index_key_name(), string());
 
 
   cls_rgw_obj_key key(obj_instance.key.get_index_key_name(), string());
 
-  ret = guard_reshard(dpp, &bs, obj_instance, bucket_info,
-                     [&](BucketShard *bs) -> int {
-                       auto& ref = bs->bucket_obj.get_ref();
-                       ObjectReadOperation op;
-                       cls_rgw_guard_bucket_resharding(op, -ERR_BUSY_RESHARDING);
-
-                        rgw_cls_read_olh_log_ret log_ret;
-                        int op_ret = 0;
-                       cls_rgw_get_olh_log(op, key, ver_marker, olh_tag, log_ret, op_ret); 
-                        bufferlist outbl;
-                        int r =  rgw_rados_operate(dpp, ref.pool.ioctx(), ref.obj.oid, &op, &outbl, null_yield);
-                        if (r < 0) {
-                          return r;
-                        }
-                        if (op_ret < 0) {
-                          return op_ret;
-                        }
+  auto& shard_ref = bs.bucket_obj.get_ref();
+  ObjectReadOperation op;
 
 
-                        *log = std::move(log_ret.log);
-                        *is_truncated = log_ret.is_truncated;
-                        return r;
-                     });
-  if (ret < 0) {
-    ldpp_dout(dpp, 20) << "cls_rgw_get_olh_log() returned r=" << r << dendl;
-    return ret;
+  rgw_cls_read_olh_log_ret log_ret;
+  int op_ret = 0;
+  cls_rgw_get_olh_log(op, key, ver_marker, olh_tag, log_ret, op_ret); 
+  bufferlist outbl;
+  r =  rgw_rados_operate(dpp, shard_ref.pool.ioctx(), shard_ref.obj.oid, &op, &outbl, null_yield);
+  if (r < 0) {
+    return r;
+  }
+  if (op_ret < 0) {
+    ldpp_dout(dpp, 20) << "cls_rgw_get_olh_log() returned op_ret=" << op_ret << dendl;
+    return op_ret;
   }
 
   }
 
+  *log = std::move(log_ret.log);
+  *is_truncated = log_ret.is_truncated;
+
   return 0;
 }
 
   return 0;
 }
 
@@ -7171,6 +7219,7 @@ int RGWRados::bucket_index_trim_olh_log(const DoutPrefixProvider *dpp, const RGW
   ret = guard_reshard(dpp, &bs, obj_instance, bucket_info,
                      [&](BucketShard *pbs) -> int {
                        ObjectWriteOperation op;
   ret = guard_reshard(dpp, &bs, obj_instance, bucket_info,
                      [&](BucketShard *pbs) -> int {
                        ObjectWriteOperation op;
+                       op.assert_exists(); // bucket index shard must exist
                        cls_rgw_guard_bucket_resharding(op, -ERR_BUSY_RESHARDING);
                        cls_rgw_trim_olh_log(op, key, ver, olh_tag);
                         return pbs->bucket_obj.operate(dpp, &op, null_yield);
                        cls_rgw_guard_bucket_resharding(op, -ERR_BUSY_RESHARDING);
                        cls_rgw_trim_olh_log(op, key, ver, olh_tag);
                         return pbs->bucket_obj.operate(dpp, &op, null_yield);
@@ -7200,6 +7249,7 @@ int RGWRados::bucket_index_clear_olh(const DoutPrefixProvider *dpp, const RGWBuc
   int ret = guard_reshard(dpp, &bs, obj_instance, bucket_info,
                          [&](BucketShard *pbs) -> int {
                            ObjectWriteOperation op;
   int ret = guard_reshard(dpp, &bs, obj_instance, bucket_info,
                          [&](BucketShard *pbs) -> int {
                            ObjectWriteOperation op;
+                           op.assert_exists(); // bucket index shard must exist
                            auto& ref = pbs->bucket_obj.get_ref();
                            cls_rgw_guard_bucket_resharding(op, -ERR_BUSY_RESHARDING);
                            cls_rgw_clear_olh(op, key, olh_tag);
                            auto& ref = pbs->bucket_obj.get_ref();
                            cls_rgw_guard_bucket_resharding(op, -ERR_BUSY_RESHARDING);
                            cls_rgw_clear_olh(op, key, olh_tag);
@@ -8380,6 +8430,8 @@ int RGWRados::cls_obj_prepare_op(const DoutPrefixProvider *dpp, BucketShard& bs,
   zones_trace.insert(svc.zone->get_zone().id, bs.bucket.get_key());
 
   ObjectWriteOperation o;
   zones_trace.insert(svc.zone->get_zone().id, bs.bucket.get_key());
 
   ObjectWriteOperation o;
+  o.assert_exists(); // bucket index shard must exist
+
   cls_rgw_obj_key key(obj.key.get_index_key_name(), obj.key.instance);
   cls_rgw_guard_bucket_resharding(o, -ERR_BUSY_RESHARDING);
   cls_rgw_bucket_prepare_op(o, op, tag, key, obj.key.get_loc(), svc.zone->get_zone().log_data, bilog_flags, zones_trace);
   cls_rgw_obj_key key(obj.key.get_index_key_name(), obj.key.instance);
   cls_rgw_guard_bucket_resharding(o, -ERR_BUSY_RESHARDING);
   cls_rgw_bucket_prepare_op(o, op, tag, key, obj.key.get_loc(), svc.zone->get_zone().log_data, bilog_flags, zones_trace);
@@ -8392,6 +8444,8 @@ int RGWRados::cls_obj_complete_op(BucketShard& bs, const rgw_obj& obj, RGWModify
                                  list<rgw_obj_index_key> *remove_objs, uint16_t bilog_flags, rgw_zone_set *_zones_trace)
 {
   ObjectWriteOperation o;
                                  list<rgw_obj_index_key> *remove_objs, uint16_t bilog_flags, rgw_zone_set *_zones_trace)
 {
   ObjectWriteOperation o;
+  o.assert_exists(); // bucket index shard must exist
+
   rgw_bucket_dir_entry_meta dir_meta;
   dir_meta = ent.meta;
   dir_meta.category = category;
   rgw_bucket_dir_entry_meta dir_meta;
   dir_meta = ent.meta;
   dir_meta.category = category;
@@ -8621,14 +8675,12 @@ int RGWRados::cls_bucket_list_ordered(const DoutPrefixProvider *dpp,
 
   // add the next unique candidate, or return false if we reach the end
   auto next_candidate = [] (CephContext *cct, ShardTracker& t,
 
   // add the next unique candidate, or return false if we reach the end
   auto next_candidate = [] (CephContext *cct, ShardTracker& t,
-                            std::map<std::string, size_t>& candidates,
+                            std::multimap<std::string, size_t>& candidates,
                             size_t tracker_idx) {
                             size_t tracker_idx) {
-    while (!t.at_end()) {
-      if (candidates.emplace(t.entry_name(), tracker_idx).second) {
-        return;
-      }
-      t.advance(); // skip duplicate common prefixes
+    if (!t.at_end()) {
+      candidates.emplace(t.entry_name(), tracker_idx);
     }
     }
+    return;
   };
 
   // one tracker per shard requested (may not be all shards)
   };
 
   // one tracker per shard requested (may not be all shards)
@@ -8650,8 +8702,10 @@ int RGWRados::cls_bucket_list_ordered(const DoutPrefixProvider *dpp,
   // (key=candidate, value=index into results_trackers); as we consume
   // entries from shards, we replace them with the next entries in the
   // shards until we run out
   // (key=candidate, value=index into results_trackers); as we consume
   // entries from shards, we replace them with the next entries in the
   // shards until we run out
-  std::map<std::string, size_t> candidates;
+  std::multimap<std::string, size_t> candidates;
   size_t tracker_idx = 0;
   size_t tracker_idx = 0;
+  std::vector<size_t> vidx;
+  vidx.reserve(shard_list_results.size());
   for (auto& t : results_trackers) {
     // it's important that the values in the map refer to the index
     // into the results_trackers vector, which may not be the same
   for (auto& t : results_trackers) {
     // it's important that the values in the map refer to the index
     // into the results_trackers vector, which may not be the same
@@ -8724,12 +8778,23 @@ int RGWRados::cls_bucket_list_ordered(const DoutPrefixProvider *dpp,
     }
 
     // refresh the candidates map
     }
 
     // refresh the candidates map
-    candidates.erase(candidates.begin());
-    tracker.advance();
-
-    next_candidate(cct, tracker, candidates, tracker_idx);
-
-    if (tracker.at_end() && tracker.is_truncated()) {
+    vidx.clear();
+    bool need_to_stop = false;
+    auto range = candidates.equal_range(name);
+    for (auto i = range.first; i != range.second; ++i) {
+      vidx.push_back(i->second);
+    } 
+    candidates.erase(range.first, range.second);
+    for (auto idx : vidx) {
+      auto& tracker_match = results_trackers.at(idx);
+      tracker_match.advance();
+      next_candidate(cct, tracker_match, candidates, idx);
+      if (tracker_match.at_end() && tracker_match.is_truncated()) {
+        need_to_stop = true;
+        break;
+      }
+    }
+    if (need_to_stop) {
       // once we exhaust one shard that is truncated, we need to stop,
       // as we cannot be certain that one of the next entries needs to
       // come from that shard; S3 and swift protocols allow returning
       // once we exhaust one shard that is truncated, we need to stop,
       // as we cannot be certain that one of the next entries needs to
       // come from that shard; S3 and swift protocols allow returning
@@ -8737,7 +8802,7 @@ int RGWRados::cls_bucket_list_ordered(const DoutPrefixProvider *dpp,
       ldpp_dout(dpp, 10) << __PRETTY_FUNCTION__ <<
        ": stopped accumulating results at count=" << count <<
        ", dirent=\"" << dirent.key <<
       ldpp_dout(dpp, 10) << __PRETTY_FUNCTION__ <<
        ": stopped accumulating results at count=" << count <<
        ", dirent=\"" << dirent.key <<
-       "\", because its shard is untruncated and exhaused" << dendl;
+       "\", because its shard is truncated and exhausted" << dendl;
       break;
     }
   } // while we haven't provided requested # of result entries
       break;
     }
   } // while we haven't provided requested # of result entries
@@ -9216,8 +9281,8 @@ int RGWRados::check_disk_state(const DoutPrefixProvider *dpp,
   list_state.meta.storage_class = storage_class;
 
   librados::IoCtx head_obj_ctx; // initialize to data pool so we can get pool id
   list_state.meta.storage_class = storage_class;
 
   librados::IoCtx head_obj_ctx; // initialize to data pool so we can get pool id
-  int ret = get_obj_head_ioctx(dpp, bucket_info, obj, &head_obj_ctx);
-  if (ret < 0) {
+  r = get_obj_head_ioctx(dpp, bucket_info, obj, &head_obj_ctx);
+  if (r < 0) {
     ldpp_dout(dpp, 0) << __PRETTY_FUNCTION__ <<
       " WARNING: unable to find head object data pool for \"" <<
       obj << "\", not updating version pool/epoch" << dendl;
     ldpp_dout(dpp, 0) << __PRETTY_FUNCTION__ <<
       " WARNING: unable to find head object data pool for \"" <<
       obj << "\", not updating version pool/epoch" << dendl;
index 7ec229fee18d91afa77e07c08f31a1b5be4b8ae4..08a825b8dba53105807969e933e8f1571f52bf82 100644 (file)
@@ -1268,6 +1268,10 @@ public:
   int obj_operate(const DoutPrefixProvider *dpp, const RGWBucketInfo& bucket_info, const rgw_obj& obj, librados::ObjectWriteOperation *op);
   int obj_operate(const DoutPrefixProvider *dpp, const RGWBucketInfo& bucket_info, const rgw_obj& obj, librados::ObjectReadOperation *op);
 
   int obj_operate(const DoutPrefixProvider *dpp, const RGWBucketInfo& bucket_info, const rgw_obj& obj, librados::ObjectWriteOperation *op);
   int obj_operate(const DoutPrefixProvider *dpp, const RGWBucketInfo& bucket_info, const rgw_obj& obj, librados::ObjectReadOperation *op);
 
+  int fetch_new_bucket_id(const RGWBucketInfo& curr_bucket_info,
+                         RGWBucketInfo* save_bucket_info,
+                         std::string& new_bucket_id,
+                         const DoutPrefixProvider* dpp);
   int guard_reshard(const DoutPrefixProvider *dpp,
                     BucketShard *bs,
                    const rgw_obj& obj_instance,
   int guard_reshard(const DoutPrefixProvider *dpp,
                     BucketShard *bs,
                    const rgw_obj& obj_instance,
@@ -1444,7 +1448,7 @@ public:
   int unlock(const rgw_pool& pool, const std::string& oid, rgw_zone_id& zone_id, std::string& owner_id);
 
   void update_gc_chain(const DoutPrefixProvider *dpp, rgw_obj& head_obj, RGWObjManifest& manifest, cls_rgw_obj_chain *chain);
   int unlock(const rgw_pool& pool, const std::string& oid, rgw_zone_id& zone_id, std::string& owner_id);
 
   void update_gc_chain(const DoutPrefixProvider *dpp, rgw_obj& head_obj, RGWObjManifest& manifest, cls_rgw_obj_chain *chain);
-  int send_chain_to_gc(cls_rgw_obj_chain& chain, const std::string& tag);
+  std::tuple<int, std::optional<cls_rgw_obj_chain>> send_chain_to_gc(cls_rgw_obj_chain& chain, const std::string& tag);
   void delete_objs_inline(const DoutPrefixProvider *dpp, cls_rgw_obj_chain& chain, const std::string& tag);
   int gc_operate(const DoutPrefixProvider *dpp, std::string& oid, librados::ObjectWriteOperation *op);
   int gc_aio_operate(const std::string& oid, librados::AioCompletion *c,
   void delete_objs_inline(const DoutPrefixProvider *dpp, cls_rgw_obj_chain& chain, const std::string& tag);
   int gc_operate(const DoutPrefixProvider *dpp, std::string& oid, librados::ObjectWriteOperation *op);
   int gc_aio_operate(const std::string& oid, librados::AioCompletion *c,
index 532dad7b47fd19c72875e877b43ed6ee3d39329d..6bf3e6bd5e71c79491efa161a328448d6318e3d5 100644 (file)
@@ -290,15 +290,11 @@ int RGWBucketReshard::clear_resharding(const DoutPrefixProvider *dpp,
                                        rgw::sal::RadosStore* store,
                                       const RGWBucketInfo& bucket_info)
 {
                                        rgw::sal::RadosStore* store,
                                       const RGWBucketInfo& bucket_info)
 {
-  int ret = clear_index_shard_reshard_status(dpp, store, bucket_info);
-  if (ret < 0) {
-    ldpp_dout(dpp, 0) << "RGWBucketReshard::" << __func__ <<
-      " ERROR: error clearing reshard status from index shard " <<
-      cpp_strerror(-ret) << dendl;
-    return ret;
-  }
+  int ret;
 
 
+  // default constructed = NOT_RESHARDING
   cls_rgw_bucket_instance_entry instance_entry;
   cls_rgw_bucket_instance_entry instance_entry;
+
   ret = store->getRados()->bucket_set_reshard(dpp, bucket_info, instance_entry);
   if (ret < 0) {
     ldpp_dout(dpp, 0) << "RGWReshard::" << __func__ <<
   ret = store->getRados()->bucket_set_reshard(dpp, bucket_info, instance_entry);
   if (ret < 0) {
     ldpp_dout(dpp, 0) << "RGWReshard::" << __func__ <<
index 68b40324ce268f5285b2ab3c300392472a831568..16730cfda1f74340a61091532fbeb9668868208f 100644 (file)
@@ -189,7 +189,7 @@ void RGWHTTPSimpleRequest::get_out_headers(map<string, string> *pheaders)
   out_headers.clear();
 }
 
   out_headers.clear();
 }
 
-static int sign_request_v2(const DoutPrefixProvider *dpp, RGWAccessKey& key,
+static int sign_request_v2(const DoutPrefixProvider *dpp, const RGWAccessKey& key,
                         const string& region, const string& service,
                         RGWEnv& env, req_info& info,
                         const bufferlist *opt_content)
                         const string& region, const string& service,
                         RGWEnv& env, req_info& info,
                         const bufferlist *opt_content)
@@ -230,7 +230,7 @@ static int sign_request_v2(const DoutPrefixProvider *dpp, RGWAccessKey& key,
   return 0;
 }
 
   return 0;
 }
 
-static int sign_request_v4(const DoutPrefixProvider *dpp, RGWAccessKey& key,
+static int sign_request_v4(const DoutPrefixProvider *dpp, const RGWAccessKey& key,
                            const string& region, const string& service,
                            RGWEnv& env, req_info& info,
                            const bufferlist *opt_content)
                            const string& region, const string& service,
                            RGWEnv& env, req_info& info,
                            const bufferlist *opt_content)
@@ -248,7 +248,12 @@ static int sign_request_v4(const DoutPrefixProvider *dpp, RGWAccessKey& key,
     }
   }
 
     }
   }
 
-  auto sigv4_data = rgw::auth::s3::AWSSignerV4::prepare(dpp, key.id, region, service, info, opt_content, true);
+  rgw::auth::s3::AWSSignerV4::prepare_result_t sigv4_data;
+  if (service == "s3") {
+    sigv4_data = rgw::auth::s3::AWSSignerV4::prepare(dpp, key.id, region, service, info, opt_content, true);
+  } else {
+    sigv4_data = rgw::auth::s3::AWSSignerV4::prepare(dpp, key.id, region, service, info, opt_content, false);
+  }
   auto sigv4_headers = sigv4_data.signature_factory(dpp, key.key, sigv4_data);
 
   for (auto& entry : sigv4_headers) {
   auto sigv4_headers = sigv4_data.signature_factory(dpp, key.key, sigv4_data);
 
   for (auto& entry : sigv4_headers) {
@@ -259,7 +264,7 @@ static int sign_request_v4(const DoutPrefixProvider *dpp, RGWAccessKey& key,
   return 0;
 }
 
   return 0;
 }
 
-static int sign_request(const DoutPrefixProvider *dpp, RGWAccessKey& key,
+static int sign_request(const DoutPrefixProvider *dpp, const RGWAccessKey& key,
                         const string& region, const string& service,
                         RGWEnv& env, req_info& info,
                         const bufferlist *opt_content)
                         const string& region, const string& service,
                         RGWEnv& env, req_info& info,
                         const bufferlist *opt_content)
@@ -289,7 +294,7 @@ static bool identify_scope(const DoutPrefixProvider *dpp,
                            CephContext *cct,
                            const string& host,
                            string *region,
                            CephContext *cct,
                            const string& host,
                            string *region,
-                           string *service)
+                           stringservice)
 {
   if (!boost::algorithm::ends_with(host, "amazonaws.com")) {
     ldpp_dout(dpp, 20) << "NOTICE: cannot identify region for connection to: " << host << dendl;
 {
   if (!boost::algorithm::ends_with(host, "amazonaws.com")) {
     ldpp_dout(dpp, 20) << "NOTICE: cannot identify region for connection to: " << host << dendl;
@@ -300,14 +305,18 @@ static bool identify_scope(const DoutPrefixProvider *dpp,
 
   get_str_vec(host, ".", vec);
 
 
   get_str_vec(host, ".", vec);
 
-  *service = "s3"; /* default */
+  string ser = service;
+  if (service.empty()) {
+    service = "s3"; /* default */
+  }
 
   for (auto iter = vec.begin(); iter != vec.end(); ++iter) {
     auto& s = *iter;
     if (s == "s3" ||
 
   for (auto iter = vec.begin(); iter != vec.end(); ++iter) {
     auto& s = *iter;
     if (s == "s3" ||
-        s == "execute-api") {
+        s == "execute-api" ||
+        s == "iam") {
       if (s == "execute-api") {
       if (s == "execute-api") {
-        *service = s;
+        service = s;
       }
       ++iter;
       if (iter == vec.end()) {
       }
       ++iter;
       if (iter == vec.end()) {
@@ -335,22 +344,26 @@ static void scope_from_api_name(const DoutPrefixProvider *dpp,
                                 const string& host,
                                 std::optional<string> api_name,
                                 string *region,
                                 const string& host,
                                 std::optional<string> api_name,
                                 string *region,
-                                string *service)
+                                stringservice)
 {
 {
-  if (api_name) {
+  if (api_name && service.empty()) {
     *region = *api_name;
     *region = *api_name;
-    *service = "s3";
+    service = "s3";
     return;
   }
 
   if (!identify_scope(dpp, cct, host, region, service)) {
     return;
   }
 
   if (!identify_scope(dpp, cct, host, region, service)) {
-    *region = cct->_conf->rgw_zonegroup;
-    *service = "s3";
+    if (service == "iam") {
+      *region = cct->_conf->rgw_zonegroup;
+    } else {
+      *region = cct->_conf->rgw_zonegroup;
+      service = "s3";
+    }
     return;
   }
 }
 
     return;
   }
 }
 
-int RGWRESTSimpleRequest::forward_request(const DoutPrefixProvider *dpp, RGWAccessKey& key, req_info& info, size_t max_response, bufferlist *inbl, bufferlist *outbl, optional_yield y)
+int RGWRESTSimpleRequest::forward_request(const DoutPrefixProvider *dpp, const RGWAccessKey& key, req_info& info, size_t max_response, bufferlist *inbl, bufferlist *outbl, optional_yield y, std::string service)
 {
 
   string date_str;
 {
 
   string date_str;
@@ -381,21 +394,28 @@ int RGWRESTSimpleRequest::forward_request(const DoutPrefixProvider *dpp, RGWAcce
   }
 
   string region;
   }
 
   string region;
-  string service;
+  string s;
+  if (!service.empty()) {
+    s = service;
+  }
 
 
-  scope_from_api_name(dpp, cct, host, api_name, &region, &service);
+  scope_from_api_name(dpp, cct, host, api_name, &region, s);
 
   const char *maybe_payload_hash = info.env->get("HTTP_X_AMZ_CONTENT_SHA256");
 
   const char *maybe_payload_hash = info.env->get("HTTP_X_AMZ_CONTENT_SHA256");
-  if (maybe_payload_hash) {
+  if (maybe_payload_hash && s != "iam") {
     new_env.set("HTTP_X_AMZ_CONTENT_SHA256", maybe_payload_hash);
   }
 
     new_env.set("HTTP_X_AMZ_CONTENT_SHA256", maybe_payload_hash);
   }
 
-  int ret = sign_request(dpp, key, region, service, new_env, new_info, nullptr);
+  int ret = sign_request(dpp, key, region, s, new_env, new_info, nullptr);
   if (ret < 0) {
     ldpp_dout(dpp, 0) << "ERROR: failed to sign request" << dendl;
     return ret;
   }
 
   if (ret < 0) {
     ldpp_dout(dpp, 0) << "ERROR: failed to sign request" << dendl;
     return ret;
   }
 
+  if (s == "iam") {
+    info.args.remove("PayloadHash");
+  }
+
   for (const auto& kv: new_env.get_map()) {
     headers.emplace_back(kv);
   }
   for (const auto& kv: new_env.get_map()) {
     headers.emplace_back(kv);
   }
@@ -559,7 +579,7 @@ void RGWRESTGenerateHTTPHeaders::init(const string& _method, const string& host,
                                       const string& resource, const param_vec_t& params,
                                       std::optional<string> api_name)
 {
                                       const string& resource, const param_vec_t& params,
                                       std::optional<string> api_name)
 {
-  scope_from_api_name(this, cct, host, api_name, &region, &service);
+  scope_from_api_name(this, cct, host, api_name, &region, service);
 
   string params_str;
   map<string, string>& args = new_info->args.get_params();
 
   string params_str;
   map<string, string>& args = new_info->args.get_params();
index caf6ffa35c80274391ec9a86a5da4e4895d039c2..5beeb389589ccff9b4ed30c766ba06a8843a1955 100644 (file)
@@ -65,7 +65,7 @@ public:
                        param_vec_t *_headers, param_vec_t *_params,
                        std::optional<std::string> _api_name) : RGWHTTPSimpleRequest(_cct, _method, _url, _headers, _params), api_name(_api_name) {}
 
                        param_vec_t *_headers, param_vec_t *_params,
                        std::optional<std::string> _api_name) : RGWHTTPSimpleRequest(_cct, _method, _url, _headers, _params), api_name(_api_name) {}
 
-  int forward_request(const DoutPrefixProvider *dpp, RGWAccessKey& key, req_info& info, size_t max_response, bufferlist *inbl, bufferlist *outbl, optional_yield y);
+  int forward_request(const DoutPrefixProvider *dpp, const RGWAccessKey& key, req_info& info, size_t max_response, bufferlist *inbl, bufferlist *outbl, optional_yield y, std::string service="");
 };
 
 class RGWWriteDrainCB {
 };
 
 class RGWWriteDrainCB {
index afcc86db11cd8ca71d7cb5148e2104aacf2bcd8f..ea42f3d2604dbdf3b24896a7595660b03b10d05f 100644 (file)
@@ -147,6 +147,24 @@ int RGWRESTConn::forward(const DoutPrefixProvider *dpp, const rgw_user& uid, req
   return req.forward_request(dpp, key, info, max_response, inbl, outbl, y);
 }
 
   return req.forward_request(dpp, key, info, max_response, inbl, outbl, y);
 }
 
+int RGWRESTConn::forward_iam_request(const DoutPrefixProvider *dpp, const RGWAccessKey& key, req_info& info, obj_version *objv, size_t max_response, bufferlist *inbl, bufferlist *outbl, optional_yield y)
+{
+  string url;
+  int ret = get_url(url);
+  if (ret < 0)
+    return ret;
+  param_vec_t params;
+  if (objv) {
+    params.push_back(param_pair_t(RGW_SYS_PARAM_PREFIX "tag", objv->tag));
+    char buf[16];
+    snprintf(buf, sizeof(buf), "%lld", (long long)objv->ver);
+    params.push_back(param_pair_t(RGW_SYS_PARAM_PREFIX "ver", buf));
+  }
+  std::string service = "iam";
+  RGWRESTSimpleRequest req(cct, info.method, url, NULL, &params, api_name);
+  return req.forward_request(dpp, key, info, max_response, inbl, outbl, y, service);
+}
+
 int RGWRESTConn::put_obj_send_init(rgw::sal::Object* obj, const rgw_http_param_pair *extra_params, RGWRESTStreamS3PutObj **req)
 {
   string url;
 int RGWRESTConn::put_obj_send_init(rgw::sal::Object* obj, const rgw_http_param_pair *extra_params, RGWRESTStreamS3PutObj **req)
 {
   string url;
@@ -409,7 +427,12 @@ int RGWRESTConn::send_resource(const DoutPrefixProvider *dpp, const std::string&
     return ret;
   }
 
     return ret;
   }
 
-  return req.complete_request(y);
+  ret = req.complete_request(y);
+  if (ret < 0) {
+    ldpp_dout(dpp, 5) << __func__ << ": complete_request() resource=" << resource << " returned ret=" << ret << dendl;
+  }
+
+  return ret;
 }
 
 RGWRESTReadResource::RGWRESTReadResource(RGWRESTConn *_conn,
 }
 
 RGWRESTReadResource::RGWRESTReadResource(RGWRESTConn *_conn,
index cae8120705c3c0b57be18b242f082bdd8990ae4f..68a2e78ec551410e82dc6e0e3803a56c6ec23203 100644 (file)
@@ -143,6 +143,9 @@ public:
   /* sync request */
   int forward(const DoutPrefixProvider *dpp, const rgw_user& uid, req_info& info, obj_version *objv, size_t max_response, bufferlist *inbl, bufferlist *outbl, optional_yield y);
 
   /* sync request */
   int forward(const DoutPrefixProvider *dpp, const rgw_user& uid, req_info& info, obj_version *objv, size_t max_response, bufferlist *inbl, bufferlist *outbl, optional_yield y);
 
+  /* sync request */
+  int forward_iam_request(const DoutPrefixProvider *dpp, const RGWAccessKey& key, req_info& info, obj_version *objv, size_t max_response, bufferlist *inbl, bufferlist *outbl, optional_yield y);
+
 
   /* async requests */
   int put_obj_send_init(rgw::sal::Object* obj, const rgw_http_param_pair *extra_params, RGWRESTStreamS3PutObj **req);
 
   /* async requests */
   int put_obj_send_init(rgw::sal::Object* obj, const rgw_http_param_pair *extra_params, RGWRESTStreamS3PutObj **req);
index 7b01133fce4a18ce4a5720e8bb613f99fd0b134d..f63018d189b3b9dd723e68dc8a5f15ca661ec5d2 100644 (file)
@@ -20,6 +20,7 @@ using namespace std;
 
 void RGWHandler_REST_IAM::rgw_iam_parse_input()
 {
 
 void RGWHandler_REST_IAM::rgw_iam_parse_input()
 {
+  std::string post_body = bl_post_body.to_str();
   if (post_body.size() > 0) {
     ldpp_dout(s, 10) << "Content of POST: " << post_body << dendl;
 
   if (post_body.size() > 0) {
     ldpp_dout(s, 10) << "Content of POST: " << post_body << dendl;
 
@@ -46,23 +47,23 @@ RGWOp *RGWHandler_REST_IAM::op_post()
   if (s->info.args.exists("Action")) {
     string action = s->info.args.get("Action");
     if (action.compare("CreateRole") == 0)
   if (s->info.args.exists("Action")) {
     string action = s->info.args.get("Action");
     if (action.compare("CreateRole") == 0)
-      return new RGWCreateRole;
+      return new RGWCreateRole(this->bl_post_body);
     if (action.compare("DeleteRole") == 0)
     if (action.compare("DeleteRole") == 0)
-      return new RGWDeleteRole;
+      return new RGWDeleteRole(this->bl_post_body);
     if (action.compare("GetRole") == 0)
       return new RGWGetRole;
     if (action.compare("UpdateAssumeRolePolicy") == 0)
     if (action.compare("GetRole") == 0)
       return new RGWGetRole;
     if (action.compare("UpdateAssumeRolePolicy") == 0)
-      return new RGWModifyRole;
+      return new RGWModifyRole(this->bl_post_body);
     if (action.compare("ListRoles") == 0)
       return new RGWListRoles;
     if (action.compare("PutRolePolicy") == 0)
     if (action.compare("ListRoles") == 0)
       return new RGWListRoles;
     if (action.compare("PutRolePolicy") == 0)
-      return new RGWPutRolePolicy;
+      return new RGWPutRolePolicy(this->bl_post_body);
     if (action.compare("GetRolePolicy") == 0)
       return new RGWGetRolePolicy;
     if (action.compare("ListRolePolicies") == 0)
       return new RGWListRolePolicies;
     if (action.compare("DeleteRolePolicy") == 0)
     if (action.compare("GetRolePolicy") == 0)
       return new RGWGetRolePolicy;
     if (action.compare("ListRolePolicies") == 0)
       return new RGWListRolePolicies;
     if (action.compare("DeleteRolePolicy") == 0)
-      return new RGWDeleteRolePolicy;
+      return new RGWDeleteRolePolicy(this->bl_post_body);
     if (action.compare("PutUserPolicy") == 0)
       return new RGWPutUserPolicy;
     if (action.compare("GetUserPolicy") == 0)
     if (action.compare("PutUserPolicy") == 0)
       return new RGWPutUserPolicy;
     if (action.compare("GetUserPolicy") == 0)
@@ -80,11 +81,11 @@ RGWOp *RGWHandler_REST_IAM::op_post()
     if (action.compare("DeleteOpenIDConnectProvider") == 0)
       return new RGWDeleteOIDCProvider;
     if (action.compare("TagRole") == 0)
     if (action.compare("DeleteOpenIDConnectProvider") == 0)
       return new RGWDeleteOIDCProvider;
     if (action.compare("TagRole") == 0)
-      return new RGWTagRole;
+      return new RGWTagRole(this->bl_post_body);
     if (action.compare("ListRoleTags") == 0)
       return new RGWListRoleTags;
     if (action.compare("UntagRole") == 0)
     if (action.compare("ListRoleTags") == 0)
       return new RGWListRoleTags;
     if (action.compare("UntagRole") == 0)
-      return new RGWUntagRole;
+      return new RGWUntagRole(this->bl_post_body);
   }
 
   return nullptr;
   }
 
   return nullptr;
@@ -157,5 +158,6 @@ RGWRESTMgr_IAM::get_handler(rgw::sal::Store* store,
                            const rgw::auth::StrategyRegistry& auth_registry,
                            const std::string& frontend_prefix)
 {
                            const rgw::auth::StrategyRegistry& auth_registry,
                            const std::string& frontend_prefix)
 {
-  return new RGWHandler_REST_IAM(auth_registry);
+  bufferlist bl;
+  return new RGWHandler_REST_IAM(auth_registry, bl);
 }
 }
index 0822f6f7e68932ef1d9526b0bfa5f3b47f4ba614..d2421b603210a9b894f78f661a9ab5bbe262426b 100644 (file)
@@ -9,7 +9,7 @@
 
 class RGWHandler_REST_IAM : public RGWHandler_REST {
   const rgw::auth::StrategyRegistry& auth_registry;
 
 class RGWHandler_REST_IAM : public RGWHandler_REST {
   const rgw::auth::StrategyRegistry& auth_registry;
-  const std::string& post_body;
+  bufferlist bl_post_body;
   RGWOp *op_post() override;
   void rgw_iam_parse_input();
 public:
   RGWOp *op_post() override;
   void rgw_iam_parse_input();
 public:
@@ -17,10 +17,10 @@ public:
   static int init_from_header(struct req_state *s, int default_formatter, bool configurable_format);
 
   RGWHandler_REST_IAM(const rgw::auth::StrategyRegistry& auth_registry,
   static int init_from_header(struct req_state *s, int default_formatter, bool configurable_format);
 
   RGWHandler_REST_IAM(const rgw::auth::StrategyRegistry& auth_registry,
-                     const std::string& post_body="")
+                     bufferlist& bl_post_body)
     : RGWHandler_REST(),
       auth_registry(auth_registry),
     : RGWHandler_REST(),
       auth_registry(auth_registry),
-      post_body(post_body) {}
+      bl_post_body(bl_post_body) {}
   ~RGWHandler_REST_IAM() override = default;
 
   int init(rgw::sal::Store* store,
   ~RGWHandler_REST_IAM() override = default;
 
   int init(rgw::sal::Store* store,
index 0fa0f8f011554cf755b1aaf36f69ec2edcf3ad25..7ae70e6a097e818ad99616d5980dc0f658799d49 100644 (file)
@@ -203,9 +203,85 @@ void RGWCreateRole::execute(optional_yield y)
     op_ret = -EINVAL;
     return;
   }
     op_ret = -EINVAL;
     return;
   }
-  op_ret = role->create(s, true, y);
+
+  std::string role_id;
+
+  if (!store->is_meta_master()) {
+    RGWXMLDecoder::XMLParser parser;
+    if (!parser.init()) {
+      ldpp_dout(this, 0) << "ERROR: failed to initialize xml parser" << dendl;
+      op_ret = -EINVAL;
+      return;
+    }
+
+    bufferlist data;
+    s->info.args.remove("RoleName");
+    s->info.args.remove("Path");
+    s->info.args.remove("AssumeRolePolicyDocument");
+    s->info.args.remove("MaxSessionDuration");
+    s->info.args.remove("Action");
+    s->info.args.remove("Version");
+    auto& val_map = s->info.args.get_params();
+    for (auto it = val_map.begin(); it!= val_map.end(); it++) {
+      if (it->first.find("Tags.member.") == 0) {
+        val_map.erase(it);
+      }
+    }
+
+    RGWUserInfo info = s->user->get_info();
+    const auto& it = info.access_keys.begin();
+    RGWAccessKey key;
+    if (it != info.access_keys.end()) {
+      key.id = it->first;
+      RGWAccessKey cred = it->second;
+      key.key = cred.key;
+    }
+    op_ret = store->forward_iam_request_to_master(s, key, nullptr, bl_post_body, &parser, s->info, y);
+    if (op_ret < 0) {
+      ldpp_dout(this, 20) << "ERROR: forward_iam_request_to_master failed with error code: " << op_ret << dendl;
+      return;
+    }
+
+    XMLObj* create_role_resp_obj = parser.find_first("CreateRoleResponse");;
+    if (!create_role_resp_obj) {
+      ldpp_dout(this, 5) << "ERROR: unexpected xml: CreateRoleResponse" << dendl;
+      op_ret = -EINVAL;
+      return;
+    }
+
+    XMLObj* create_role_res_obj = create_role_resp_obj->find_first("CreateRoleResult");
+    if (!create_role_res_obj) {
+      ldpp_dout(this, 5) << "ERROR: unexpected xml: CreateRoleResult" << dendl;
+      op_ret = -EINVAL;
+      return;
+    }
+
+    XMLObj* role_obj = nullptr;
+    if (create_role_res_obj) {
+      role_obj = create_role_res_obj->find_first("Role");
+    }
+    if (!role_obj) {
+      ldpp_dout(this, 5) << "ERROR: unexpected xml: Role" << dendl;
+      op_ret = -EINVAL;
+      return;
+    }
+
+    try {
+      if (role_obj) {
+        RGWXMLDecoder::decode_xml("RoleId", role_id, role_obj, true);
+      }
+    } catch (RGWXMLDecoder::err& err) {
+      ldpp_dout(this, 5) << "ERROR: unexpected xml: RoleId" << dendl;
+      op_ret = -EINVAL;
+      return;
+    }
+    ldpp_dout(this, 0) << "role_id decoded from master zonegroup response is" << role_id << dendl;
+  }
+
+  op_ret = role->create(s, true, role_id, y);
   if (op_ret == -EEXIST) {
     op_ret = -ERR_ROLE_EXISTS;
   if (op_ret == -EEXIST) {
     op_ret = -ERR_ROLE_EXISTS;
+    return;
   }
 
   if (op_ret == 0) {
   }
 
   if (op_ret == 0) {
@@ -236,15 +312,52 @@ int RGWDeleteRole::get_params()
 
 void RGWDeleteRole::execute(optional_yield y)
 {
 
 void RGWDeleteRole::execute(optional_yield y)
 {
+  bool is_master = true;
+  int master_op_ret = 0;
   op_ret = get_params();
   if (op_ret < 0) {
     return;
   }
 
   op_ret = get_params();
   if (op_ret < 0) {
     return;
   }
 
+  if (!store->is_meta_master()) {
+    is_master = false;
+    RGWXMLDecoder::XMLParser parser;
+    if (!parser.init()) {
+      ldpp_dout(this, 0) << "ERROR: failed to initialize xml parser" << dendl;
+      op_ret = -EINVAL;
+    }
+
+    bufferlist data;
+    s->info.args.remove("RoleName");
+    s->info.args.remove("Action");
+    s->info.args.remove("Version");
+
+    RGWUserInfo info = s->user->get_info();
+    const auto& it = info.access_keys.begin();
+    RGWAccessKey key;
+    if (it != info.access_keys.end()) {
+      key.id = it->first;
+      RGWAccessKey cred = it->second;
+      key.key = cred.key;
+    }
+    master_op_ret = store->forward_iam_request_to_master(s, key, nullptr, bl_post_body, &parser, s->info, y);
+    if (master_op_ret < 0) {
+      op_ret = master_op_ret;
+      ldpp_dout(this, 0) << "forward_iam_request_to_master returned ret=" << op_ret << dendl;
+      return;
+    }
+  }
+
   op_ret = _role->delete_obj(s, y);
 
   if (op_ret == -ENOENT) {
   op_ret = _role->delete_obj(s, y);
 
   if (op_ret == -ENOENT) {
-    op_ret = -ERR_NO_ROLE_FOUND;
+    //Role has been deleted since metadata from master has synced up
+    if (!is_master && master_op_ret == 0) {
+      op_ret = 0;
+    } else {
+      op_ret = -ERR_NO_ROLE_FOUND;
+    }
+    return;
   }
   if (!op_ret) {
     s->formatter->open_object_section("DeleteRoleResponse");
   }
   if (!op_ret) {
     s->formatter->open_object_section("DeleteRoleResponse");
@@ -350,6 +463,35 @@ void RGWModifyRole::execute(optional_yield y)
     return;
   }
 
     return;
   }
 
+  if (!store->is_meta_master()) {
+    RGWXMLDecoder::XMLParser parser;
+    if (!parser.init()) {
+      ldpp_dout(this, 0) << "ERROR: failed to initialize xml parser" << dendl;
+      op_ret = -EINVAL;
+      return;
+    }
+
+    bufferlist data;
+    s->info.args.remove("RoleName");
+    s->info.args.remove("PolicyDocument");
+    s->info.args.remove("Action");
+    s->info.args.remove("Version");
+
+    RGWUserInfo info = s->user->get_info();
+    const auto& it = info.access_keys.begin();
+    RGWAccessKey key;
+    if (it != info.access_keys.end()) {
+      key.id = it->first;
+      RGWAccessKey cred = it->second;
+      key.key = cred.key;
+    }
+    op_ret = store->forward_iam_request_to_master(s, key, nullptr, bl_post_body, &parser, s->info, y);
+    if (op_ret < 0) {
+      ldpp_dout(this, 20) << "ERROR: forward_iam_request_to_master failed with error code: " << op_ret << dendl;
+      return;
+    }
+  }
+
   _role->update_trust_policy(trust_policy);
   op_ret = _role->update(this, y);
 
   _role->update_trust_policy(trust_policy);
   op_ret = _role->update(this, y);
 
@@ -442,6 +584,36 @@ void RGWPutRolePolicy::execute(optional_yield y)
     return;
   }
 
     return;
   }
 
+  if (!store->is_meta_master()) {
+    RGWXMLDecoder::XMLParser parser;
+    if (!parser.init()) {
+      ldpp_dout(this, 0) << "ERROR: failed to initialize xml parser" << dendl;
+      op_ret = -EINVAL;
+      return;
+    }
+
+    bufferlist data;
+    s->info.args.remove("RoleName");
+    s->info.args.remove("PolicyName");
+    s->info.args.remove("PolicyDocument");
+    s->info.args.remove("Action");
+    s->info.args.remove("Version");
+
+    RGWUserInfo info = s->user->get_info();
+    const auto& it = info.access_keys.begin();
+    RGWAccessKey key;
+    if (it != info.access_keys.end()) {
+      key.id = it->first;
+      RGWAccessKey cred = it->second;
+      key.key = cred.key;
+    }
+    op_ret = store->forward_iam_request_to_master(s, key, nullptr, bl_post_body, &parser, s->info, y);
+    if (op_ret < 0) {
+      ldpp_dout(this, 20) << "ERROR: forward_iam_request_to_master failed with error code: " << op_ret << dendl;
+      return;
+    }
+  }
+
   _role->set_perm_policy(policy_name, perm_policy);
   op_ret = _role->update(this, y);
 
   _role->set_perm_policy(policy_name, perm_policy);
   op_ret = _role->update(this, y);
 
@@ -545,9 +717,39 @@ void RGWDeleteRolePolicy::execute(optional_yield y)
     return;
   }
 
     return;
   }
 
+  if (!store->is_meta_master()) {
+    RGWXMLDecoder::XMLParser parser;
+    if (!parser.init()) {
+      ldpp_dout(this, 0) << "ERROR: failed to initialize xml parser" << dendl;
+      op_ret = -EINVAL;
+      return;
+    }
+
+    bufferlist data;
+    s->info.args.remove("RoleName");
+    s->info.args.remove("PolicyName");
+    s->info.args.remove("Action");
+    s->info.args.remove("Version");
+
+    RGWUserInfo info = s->user->get_info();
+    const auto& it = info.access_keys.begin();
+    RGWAccessKey key;
+    if (it != info.access_keys.end()) {
+      key.id = it->first;
+      RGWAccessKey cred = it->second;
+      key.key = cred.key;
+    }
+    op_ret = store->forward_iam_request_to_master(s, key, nullptr, bl_post_body, &parser, s->info, y);
+    if (op_ret < 0) {
+      ldpp_dout(this, 20) << "ERROR: forward_iam_request_to_master failed with error code: " << op_ret << dendl;
+      return;
+    }
+  }
+
   op_ret = _role->delete_policy(this, policy_name);
   if (op_ret == -ENOENT) {
     op_ret = -ERR_NO_ROLE_FOUND;
   op_ret = _role->delete_policy(this, policy_name);
   if (op_ret == -ENOENT) {
     op_ret = -ERR_NO_ROLE_FOUND;
+    return;
   }
 
   if (op_ret == 0) {
   }
 
   if (op_ret == 0) {
@@ -584,6 +786,40 @@ void RGWTagRole::execute(optional_yield y)
     return;
   }
 
     return;
   }
 
+  if (!store->is_meta_master()) {
+    RGWXMLDecoder::XMLParser parser;
+    if (!parser.init()) {
+      ldpp_dout(this, 0) << "ERROR: failed to initialize xml parser" << dendl;
+      op_ret = -EINVAL;
+      return;
+    }
+
+    bufferlist data;
+    s->info.args.remove("RoleName");
+    s->info.args.remove("Action");
+    s->info.args.remove("Version");
+    auto& val_map = s->info.args.get_params();
+    for (auto it = val_map.begin(); it!= val_map.end(); it++) {
+      if (it->first.find("Tags.member.") == 0) {
+        val_map.erase(it);
+      }
+    }
+
+    RGWUserInfo info = s->user->get_info();
+    const auto& it = info.access_keys.begin();
+    RGWAccessKey key;
+    if (it != info.access_keys.end()) {
+      key.id = it->first;
+      RGWAccessKey cred = it->second;
+      key.key = cred.key;
+    }
+    op_ret = store->forward_iam_request_to_master(s, key, nullptr, bl_post_body, &parser, s->info, y);
+    if (op_ret < 0) {
+      ldpp_dout(this, 20) << "ERROR: forward_iam_request_to_master failed with error code: " << op_ret << dendl;
+      return;
+    }
+  }
+
   op_ret = _role->set_tags(this, tags);
   if (op_ret == 0) {
     op_ret = _role->update(this, y);
   op_ret = _role->set_tags(this, tags);
   if (op_ret == 0) {
     op_ret = _role->update(this, y);
@@ -664,6 +900,44 @@ void RGWUntagRole::execute(optional_yield y)
     return;
   }
 
     return;
   }
 
+  if (!store->is_meta_master()) {
+    RGWXMLDecoder::XMLParser parser;
+    if (!parser.init()) {
+      ldpp_dout(this, 0) << "ERROR: failed to initialize xml parser" << dendl;
+      op_ret = -EINVAL;
+      return;
+    }
+
+    bufferlist data;
+    s->info.args.remove("RoleName");
+    s->info.args.remove("Action");
+    s->info.args.remove("Version");
+    auto& val_map = s->info.args.get_params();
+    std::vector<std::multimap<std::string, std::string>::iterator> iters;
+    for (auto it = val_map.begin(); it!= val_map.end(); it++) {
+      if (it->first.find("Tags.member.") == 0) {
+        iters.emplace_back(it);
+      }
+    }
+
+    for (auto& it : iters) {
+      val_map.erase(it);
+    }
+    RGWUserInfo info = s->user->get_info();
+    const auto& it = info.access_keys.begin();
+    RGWAccessKey key;
+    if (it != info.access_keys.end()) {
+      key.id = it->first;
+      RGWAccessKey cred = it->second;
+      key.key = cred.key;
+    }
+    op_ret = store->forward_iam_request_to_master(s, key, nullptr, bl_post_body, &parser, s->info, y);
+    if (op_ret < 0) {
+      ldpp_dout(this, 20) << "ERROR: forward_iam_request_to_master failed with error code: " << op_ret << dendl;
+      return;
+    }
+  }
+
   _role->erase_tags(tagKeys);
   op_ret = _role->update(this, y);
 
   _role->erase_tags(tagKeys);
   op_ret = _role->update(this, y);
 
index a8beb2b54052c2fbb44201db769e6b618d42e049..f007d2ec23fa6dd41c9c8a11af528ad329e0f8b8 100644 (file)
@@ -39,8 +39,9 @@ public:
 };
 
 class RGWCreateRole : public RGWRoleWrite {
 };
 
 class RGWCreateRole : public RGWRoleWrite {
+  bufferlist bl_post_body;
 public:
 public:
-  RGWCreateRole() = default;
+  RGWCreateRole(const bufferlist& bl_post_body) : bl_post_body(bl_post_body) {};
   int verify_permission(optional_yield y) override;
   void execute(optional_yield y) override;
   int get_params();
   int verify_permission(optional_yield y) override;
   void execute(optional_yield y) override;
   int get_params();
@@ -50,8 +51,9 @@ public:
 };
 
 class RGWDeleteRole : public RGWRoleWrite {
 };
 
 class RGWDeleteRole : public RGWRoleWrite {
+  bufferlist bl_post_body;
 public:
 public:
-  RGWDeleteRole() = default;
+  RGWDeleteRole(const bufferlist& bl_post_body) : bl_post_body(bl_post_body) {};
   void execute(optional_yield y) override;
   int get_params();
   const char* name() const override { return "delete_role"; }
   void execute(optional_yield y) override;
   int get_params();
   const char* name() const override { return "delete_role"; }
@@ -72,8 +74,9 @@ public:
 };
 
 class RGWModifyRole : public RGWRoleWrite {
 };
 
 class RGWModifyRole : public RGWRoleWrite {
+  bufferlist bl_post_body;
 public:
 public:
-  RGWModifyRole() = default;
+  RGWModifyRole(const bufferlist& bl_post_body) : bl_post_body(bl_post_body) {};
   void execute(optional_yield y) override;
   int get_params();
   const char* name() const override { return "modify_role"; }
   void execute(optional_yield y) override;
   int get_params();
   const char* name() const override { return "modify_role"; }
@@ -93,8 +96,9 @@ public:
 };
 
 class RGWPutRolePolicy : public RGWRoleWrite {
 };
 
 class RGWPutRolePolicy : public RGWRoleWrite {
+  bufferlist bl_post_body;
 public:
 public:
-  RGWPutRolePolicy() = default;
+  RGWPutRolePolicy(const bufferlist& bl_post_body) : bl_post_body(bl_post_body) {};
   void execute(optional_yield y) override;
   int get_params();
   const char* name() const override { return "put_role_policy"; }
   void execute(optional_yield y) override;
   int get_params();
   const char* name() const override { return "put_role_policy"; }
@@ -123,8 +127,9 @@ public:
 };
 
 class RGWDeleteRolePolicy : public RGWRoleWrite {
 };
 
 class RGWDeleteRolePolicy : public RGWRoleWrite {
+  bufferlist bl_post_body;
 public:
 public:
-  RGWDeleteRolePolicy() = default;
+  RGWDeleteRolePolicy(const bufferlist& bl_post_body) : bl_post_body(bl_post_body) {};
   void execute(optional_yield y) override;
   int get_params();
   const char* name() const override { return "delete_role_policy"; }
   void execute(optional_yield y) override;
   int get_params();
   const char* name() const override { return "delete_role_policy"; }
@@ -133,8 +138,9 @@ public:
 };
 
 class RGWTagRole : public RGWRoleWrite {
 };
 
 class RGWTagRole : public RGWRoleWrite {
+  bufferlist bl_post_body;
 public:
 public:
-  RGWTagRole() = default;
+  RGWTagRole(const bufferlist& bl_post_body) : bl_post_body(bl_post_body) {};
   void execute(optional_yield y) override;
   int get_params();
   const char* name() const override { return "tag_role"; }
   void execute(optional_yield y) override;
   int get_params();
   const char* name() const override { return "tag_role"; }
@@ -153,8 +159,9 @@ public:
 };
 
 class RGWUntagRole : public RGWRoleWrite {
 };
 
 class RGWUntagRole : public RGWRoleWrite {
+  bufferlist bl_post_body;
 public:
 public:
-  RGWUntagRole() = default;
+  RGWUntagRole(const bufferlist& bl_post_body) : bl_post_body(bl_post_body) {};
   void execute(optional_yield y) override;
   int get_params();
   const char* name() const override { return "untag_role"; }
   void execute(optional_yield y) override;
   int get_params();
   const char* name() const override { return "untag_role"; }
index 7d6a51a573d79e1391b00fb89910757a912e9d4e..f51c38df9054c2e4c0d736ce2540b27c68ca6e3f 100644 (file)
@@ -617,8 +617,8 @@ int RGWGetObj_ObjStore_S3::override_range_hdr(const rgw::auth::StrategyRegistry&
     std::string key = "HTTP_";
     key.append(*k);
     boost::replace_all(key, "-", "_");
     std::string key = "HTTP_";
     key.append(*k);
     boost::replace_all(key, "-", "_");
+    ldpp_dout(this, 10) << "after splitting cache kv key: " << key  << " " << *v << dendl;
     rgw_env->set(std::move(key), std::string(*v));
     rgw_env->set(std::move(key), std::string(*v));
-    ldpp_dout(this, 10) << "after splitting cache kv key: " << key  << " " << rgw_env->get(key.c_str())  << dendl;
   }
   ret = RGWOp::verify_requester(auth_registry, y);
   if(!ret && backup_range) {
   }
   ret = RGWOp::verify_requester(auth_registry, y);
   if(!ret && backup_range) {
@@ -2847,7 +2847,7 @@ int RGWPostObj_ObjStore_S3::get_params(optional_yield y)
     return -EINVAL;
   }
 
     return -EINVAL;
   }
 
-  s->object = store->get_object(rgw_obj_key(object_str));
+  s->object = s->bucket->get_object(rgw_obj_key(object_str));
 
   rebuild_key(s->object.get());
 
 
   rebuild_key(s->object.get());
 
@@ -4118,17 +4118,28 @@ void RGWDeleteMultiObj_ObjStore_S3::send_partial_response(rgw_obj_key& key,
                                                          const string& marker_version_id, int ret)
 {
   if (!key.empty()) {
                                                          const string& marker_version_id, int ret)
 {
   if (!key.empty()) {
-    if (ret == 0 && !quiet) {
-      s->formatter->open_object_section("Deleted");
-      s->formatter->dump_string("Key", key.name);
-      if (!key.instance.empty()) {
-       s->formatter->dump_string("VersionId", key.instance);
-      }
+    delete_multi_obj_entry ops_log_entry;
+    ops_log_entry.key = key.name;
+    ops_log_entry.version_id = key.instance;
+    if (ret == 0) {
+      ops_log_entry.error = false;
+      ops_log_entry.http_status = 200;
+      ops_log_entry.delete_marker = delete_marker;
       if (delete_marker) {
       if (delete_marker) {
-       s->formatter->dump_bool("DeleteMarker", true);
-       s->formatter->dump_string("DeleteMarkerVersionId", marker_version_id);
+        ops_log_entry.marker_version_id = marker_version_id;
+      }
+      if (!quiet) {
+        s->formatter->open_object_section("Deleted");
+        s->formatter->dump_string("Key", key.name);
+        if (!key.instance.empty()) {
+            s->formatter->dump_string("VersionId", key.instance);
+        }
+        if (delete_marker) {
+            s->formatter->dump_bool("DeleteMarker", true);
+            s->formatter->dump_string("DeleteMarkerVersionId", marker_version_id);
+        }
+        s->formatter->close_section();
       }
       }
-      s->formatter->close_section();
     } else if (ret < 0) {
       struct rgw_http_error r;
       int err_no;
     } else if (ret < 0) {
       struct rgw_http_error r;
       int err_no;
@@ -4138,6 +4149,10 @@ void RGWDeleteMultiObj_ObjStore_S3::send_partial_response(rgw_obj_key& key,
       err_no = -ret;
       rgw_get_errno_s3(&r, err_no);
 
       err_no = -ret;
       rgw_get_errno_s3(&r, err_no);
 
+      ops_log_entry.error = true;
+      ops_log_entry.http_status = r.http_ret;
+      ops_log_entry.error_message = r.s3_code;
+
       s->formatter->dump_string("Key", key.name);
       s->formatter->dump_string("VersionId", key.instance);
       s->formatter->dump_string("Code", r.s3_code);
       s->formatter->dump_string("Key", key.name);
       s->formatter->dump_string("VersionId", key.instance);
       s->formatter->dump_string("Code", r.s3_code);
@@ -4145,6 +4160,7 @@ void RGWDeleteMultiObj_ObjStore_S3::send_partial_response(rgw_obj_key& key,
       s->formatter->close_section();
     }
 
       s->formatter->close_section();
     }
 
+    ops_log_entries.push_back(std::move(ops_log_entry));
     rgw_flush_formatter(s, s->formatter);
   }
 }
     rgw_flush_formatter(s, s->formatter);
   }
 }
@@ -4451,7 +4467,7 @@ RGWOp *RGWHandler_REST_Service_S3::op_post()
   }
 
   if (isIAMEnabled) {
   }
 
   if (isIAMEnabled) {
-    RGWHandler_REST_IAM iam_handler(auth_registry, post_body);
+    RGWHandler_REST_IAM iam_handler(auth_registry, data);
     iam_handler.init(store, s, s->cio);
     auto op = iam_handler.get_op();
     if (op) {
     iam_handler.init(store, s, s->cio);
     auto op = iam_handler.get_op();
     if (op) {
@@ -4855,9 +4871,11 @@ int RGWHandler_REST_S3::postauth_init(optional_yield y)
 {
   struct req_init_state *t = &s->init_state;
 
 {
   struct req_init_state *t = &s->init_state;
 
-  rgw_parse_url_bucket(t->url_bucket, s->user->get_tenant(),
-                     s->bucket_tenant, s->bucket_name);
-
+  int ret = rgw_parse_url_bucket(t->url_bucket, s->user->get_tenant(),
+                                 s->bucket_tenant, s->bucket_name);
+  if (ret) {
+    return ret;
+  }
   if (s->auth.identity->get_identity_type() == TYPE_ROLE) {
     s->bucket_tenant = s->auth.identity->get_role_tenant();
   }
   if (s->auth.identity->get_identity_type() == TYPE_ROLE) {
     s->bucket_tenant = s->auth.identity->get_role_tenant();
   }
@@ -4865,7 +4883,6 @@ int RGWHandler_REST_S3::postauth_init(optional_yield y)
   ldpp_dout(s, 10) << "s->object=" << s->object
            << " s->bucket=" << rgw_make_bucket_entry_name(s->bucket_tenant, s->bucket_name) << dendl;
 
   ldpp_dout(s, 10) << "s->object=" << s->object
            << " s->bucket=" << rgw_make_bucket_entry_name(s->bucket_tenant, s->bucket_name) << dendl;
 
-  int ret;
   ret = rgw_validate_tenant_name(s->bucket_tenant);
   if (ret)
     return ret;
   ret = rgw_validate_tenant_name(s->bucket_tenant);
   if (ret)
     return ret;
@@ -4882,8 +4899,11 @@ int RGWHandler_REST_S3::postauth_init(optional_yield y)
     } else {
       auth_tenant = s->user->get_tenant();
     }
     } else {
       auth_tenant = s->user->get_tenant();
     }
-    rgw_parse_url_bucket(t->src_bucket, auth_tenant,
-                       s->src_tenant_name, s->src_bucket_name);
+    ret = rgw_parse_url_bucket(t->src_bucket, auth_tenant,
+                               s->src_tenant_name, s->src_bucket_name);
+    if (ret) {
+      return ret;
+    }
     ret = rgw_validate_tenant_name(s->src_tenant_name);
     if (ret)
       return ret;
     ret = rgw_validate_tenant_name(s->src_tenant_name);
     if (ret)
       return ret;
@@ -5451,7 +5471,7 @@ AWSSignerV4::prepare(const DoutPrefixProvider *dpp,
 
 
   /* Craft canonical query string. std::moving later so non-const here. */
 
 
   /* Craft canonical query string. std::moving later so non-const here. */
-  auto canonical_qs = rgw::auth::s3::gen_v4_canonical_qs(info);
+  auto canonical_qs = rgw::auth::s3::gen_v4_canonical_qs(info, is_non_s3_op);
 
   auto cct = dpp->get_cct();
 
 
   auto cct = dpp->get_cct();
 
index fe028f315971ea1a7f18f2e68ba1ffacf8f8c5b6..0188f4227779d34ce0aab5385355be73cf80ce74 100644 (file)
@@ -4,6 +4,7 @@
 #include <errno.h>
 #include <ctime>
 #include <regex>
 #include <errno.h>
 #include <ctime>
 #include <regex>
+#include <boost/algorithm/string/replace.hpp>
 
 #include "common/errno.h"
 #include "common/Formatter.h"
 
 #include "common/errno.h"
 #include "common/Formatter.h"
@@ -21,6 +22,9 @@
 
 #include "services/svc_zone.h"
 #include "services/svc_sys_obj.h"
 
 #include "services/svc_zone.h"
 #include "services/svc_sys_obj.h"
+#include "services/svc_meta_be_sobj.h"
+#include "services/svc_meta.h"
+#include "services/svc_role_rados.h"
 
 #define dout_subsys ceph_subsys_rgw
 
 
 #define dout_subsys ceph_subsys_rgw
 
@@ -33,6 +37,113 @@ const string RGWRole::role_oid_prefix = "roles.";
 const string RGWRole::role_path_oid_prefix = "role_paths.";
 const string RGWRole::role_arn_prefix = "arn:aws:iam::";
 
 const string RGWRole::role_path_oid_prefix = "role_paths.";
 const string RGWRole::role_arn_prefix = "arn:aws:iam::";
 
+void RGWRoleInfo::dump(Formatter *f) const
+{
+  encode_json("RoleId", id , f);
+  std::string role_name;
+  if (tenant.empty()) {
+    role_name = name;
+  } else {
+    role_name = tenant + '$' + name;
+  }
+  encode_json("RoleName", role_name , f);
+  encode_json("Path", path, f);
+  encode_json("Arn", arn, f);
+  encode_json("CreateDate", creation_date, f);
+  encode_json("MaxSessionDuration", max_session_duration, f);
+  encode_json("AssumeRolePolicyDocument", trust_policy, f);
+  if (!perm_policy_map.empty()) {
+    f->open_array_section("PermissionPolicies");
+    for (const auto& it : perm_policy_map) {
+      f->open_object_section("Policy");
+      encode_json("PolicyName", it.first, f);
+      encode_json("PolicyValue", it.second, f);
+      f->close_section();
+    }
+    f->close_section();
+  }
+  if (!tags.empty()) {
+    f->open_array_section("Tags");
+    for (const auto& it : tags) {
+      f->open_object_section("Tag");
+      encode_json("Key", it.first, f);
+      encode_json("Value", it.second, f);
+      f->close_section();
+    }
+    f->close_section();
+  }
+}
+
+void RGWRoleInfo::decode_json(JSONObj *obj)
+{
+  JSONDecoder::decode_json("RoleId", id, obj);
+  JSONDecoder::decode_json("RoleName", name, obj);
+  JSONDecoder::decode_json("Path", path, obj);
+  JSONDecoder::decode_json("Arn", arn, obj);
+  JSONDecoder::decode_json("CreateDate", creation_date, obj);
+  JSONDecoder::decode_json("MaxSessionDuration", max_session_duration, obj);
+  JSONDecoder::decode_json("AssumeRolePolicyDocument", trust_policy, obj);
+
+  auto tags_iter = obj->find_first("Tags");
+  if (!tags_iter.end()) {
+    JSONObj* tags_json = *tags_iter;
+    auto iter = tags_json->find_first();
+
+    for (; !iter.end(); ++iter) {
+      std::string key, val;
+      JSONDecoder::decode_json("Key", key, *iter);
+      JSONDecoder::decode_json("Value", val, *iter);
+      this->tags.emplace(key, val);
+    }
+  }
+
+  auto perm_policy_iter = obj->find_first("PermissionPolicies");
+  if (!perm_policy_iter.end()) {
+    JSONObj* perm_policies = *perm_policy_iter;
+    auto iter = perm_policies->find_first();
+
+    for (; !iter.end(); ++iter) {
+      std::string policy_name, policy_val;
+      JSONDecoder::decode_json("PolicyName", policy_name, *iter);
+      JSONDecoder::decode_json("PolicyValue", policy_val, *iter);
+      this->perm_policy_map.emplace(policy_name, policy_val);
+    }
+  }
+
+  if (auto pos = name.find('$'); pos != std::string::npos) {
+    tenant = name.substr(0, pos);
+    name = name.substr(pos+1);
+  }
+}
+
+RGWRole::RGWRole(std::string name,
+              std::string tenant,
+              std::string path,
+              std::string trust_policy,
+              std::string max_session_duration_str,
+              std::multimap<std::string,std::string> tags)
+{
+  info.name = std::move(name);
+  info.path = std::move(path);
+  info.trust_policy = std::move(trust_policy);
+  info.tenant = std::move(tenant);
+  info.tags = std::move(tags);
+  if (this->info.path.empty())
+    this->info.path = "/";
+  extract_name_tenant(this->info.name);
+  if (max_session_duration_str.empty()) {
+    info.max_session_duration = SESSION_DURATION_MIN;
+  } else {
+    info.max_session_duration = std::stoull(max_session_duration_str);
+  }
+  info.mtime = real_time();
+}
+
+RGWRole::RGWRole(std::string id)
+{
+  info.id = std::move(id);
+}
+
 int RGWRole::get(const DoutPrefixProvider *dpp, optional_yield y)
 {
   int ret = read_name(dpp, y);
 int RGWRole::get(const DoutPrefixProvider *dpp, optional_yield y)
 {
   int ret = read_name(dpp, y);
@@ -58,12 +169,62 @@ int RGWRole::get_by_id(const DoutPrefixProvider *dpp, optional_yield y)
   return 0;
 }
 
   return 0;
 }
 
+void RGWRole::dump(Formatter *f) const
+{
+  info.dump(f);
+}
+
+void RGWRole::decode_json(JSONObj *obj)
+{
+  info.decode_json(obj);
+}
+
+bool RGWRole::validate_input(const DoutPrefixProvider* dpp)
+{
+  if (info.name.length() > MAX_ROLE_NAME_LEN) {
+    ldpp_dout(dpp, 0) << "ERROR: Invalid name length " << dendl;
+    return false;
+  }
+
+  if (info.path.length() > MAX_PATH_NAME_LEN) {
+    ldpp_dout(dpp, 0) << "ERROR: Invalid path length " << dendl;
+    return false;
+  }
+
+  std::regex regex_name("[A-Za-z0-9:=,.@-]+");
+  if (! std::regex_match(info.name, regex_name)) {
+    ldpp_dout(dpp, 0) << "ERROR: Invalid chars in name " << dendl;
+    return false;
+  }
+
+  std::regex regex_path("(/[!-~]+/)|(/)");
+  if (! std::regex_match(info.path,regex_path)) {
+    ldpp_dout(dpp, 0) << "ERROR: Invalid chars in path " << dendl;
+    return false;
+  }
+
+  if (info.max_session_duration < SESSION_DURATION_MIN ||
+          info.max_session_duration > SESSION_DURATION_MAX) {
+    ldpp_dout(dpp, 0) << "ERROR: Invalid session duration, should be between 3600 and 43200 seconds " << dendl;
+    return false;
+  }
+  return true;
+}
+
+void RGWRole::extract_name_tenant(const std::string& str) {
+  if (auto pos = str.find('$');
+      pos != std::string::npos) {
+    info.tenant = str.substr(0, pos);
+    info.name = str.substr(pos+1);
+  }
+}
+
 int RGWRole::update(const DoutPrefixProvider *dpp, optional_yield y)
 {
   int ret = store_info(dpp, false, y);
   if (ret < 0) {
     ldpp_dout(dpp, 0) << "ERROR:  storing info in Role pool: "
 int RGWRole::update(const DoutPrefixProvider *dpp, optional_yield y)
 {
   int ret = store_info(dpp, false, y);
   if (ret < 0) {
     ldpp_dout(dpp, 0) << "ERROR:  storing info in Role pool: "
-                  << id << ": " << cpp_strerror(-ret) << dendl;
+                  << info.id << ": " << cpp_strerror(-ret) << dendl;
     return ret;
   }
 
     return ret;
   }
 
@@ -72,13 +233,13 @@ int RGWRole::update(const DoutPrefixProvider *dpp, optional_yield y)
 
 void RGWRole::set_perm_policy(const string& policy_name, const string& perm_policy)
 {
 
 void RGWRole::set_perm_policy(const string& policy_name, const string& perm_policy)
 {
-  perm_policy_map[policy_name] = perm_policy;
+  info.perm_policy_map[policy_name] = perm_policy;
 }
 
 vector<string> RGWRole::get_role_policy_names()
 {
   vector<string> policy_names;
 }
 
 vector<string> RGWRole::get_role_policy_names()
 {
   vector<string> policy_names;
-  for (const auto& it : perm_policy_map)
+  for (const auto& it : info.perm_policy_map)
   {
     policy_names.push_back(std::move(it.first));
   }
   {
     policy_names.push_back(std::move(it.first));
   }
@@ -88,8 +249,8 @@ vector<string> RGWRole::get_role_policy_names()
 
 int RGWRole::get_role_policy(const DoutPrefixProvider* dpp, const string& policy_name, string& perm_policy)
 {
 
 int RGWRole::get_role_policy(const DoutPrefixProvider* dpp, const string& policy_name, string& perm_policy)
 {
-  const auto it = perm_policy_map.find(policy_name);
-  if (it == perm_policy_map.end()) {
+  const auto it = info.perm_policy_map.find(policy_name);
+  if (it == info.perm_policy_map.end()) {
     ldpp_dout(dpp, 0) << "ERROR: Policy name: " << policy_name << " not found" << dendl;
     return -ENOENT;
   } else {
     ldpp_dout(dpp, 0) << "ERROR: Policy name: " << policy_name << " not found" << dendl;
     return -ENOENT;
   } else {
@@ -100,102 +261,27 @@ int RGWRole::get_role_policy(const DoutPrefixProvider* dpp, const string& policy
 
 int RGWRole::delete_policy(const DoutPrefixProvider* dpp, const string& policy_name)
 {
 
 int RGWRole::delete_policy(const DoutPrefixProvider* dpp, const string& policy_name)
 {
-  const auto& it = perm_policy_map.find(policy_name);
-  if (it == perm_policy_map.end()) {
+  const auto& it = info.perm_policy_map.find(policy_name);
+  if (it == info.perm_policy_map.end()) {
     ldpp_dout(dpp, 0) << "ERROR: Policy name: " << policy_name << " not found" << dendl;
     return -ENOENT;
   } else {
     ldpp_dout(dpp, 0) << "ERROR: Policy name: " << policy_name << " not found" << dendl;
     return -ENOENT;
   } else {
-    perm_policy_map.erase(it);
+    info.perm_policy_map.erase(it);
   }
   return 0;
 }
 
   }
   return 0;
 }
 
-void RGWRole::dump(Formatter *f) const
-{
-  encode_json("RoleId", id , f);
-  encode_json("RoleName", name , f);
-  encode_json("Path", path, f);
-  encode_json("Arn", arn, f);
-  encode_json("CreateDate", creation_date, f);
-  encode_json("MaxSessionDuration", max_session_duration, f);
-  encode_json("AssumeRolePolicyDocument", trust_policy, f);
-  if (!tags.empty()) {
-    f->open_array_section("Tags");
-    for (const auto& it : tags) {
-      f->open_object_section("Key");
-      encode_json("Key", it.first, f);
-      f->close_section();
-      f->open_object_section("Value");
-      encode_json("Value", it.second, f);
-      f->close_section();
-    }
-    f->close_section();
-  }
-}
-
-void RGWRole::decode_json(JSONObj *obj)
-{
-  JSONDecoder::decode_json("id", id, obj);
-  JSONDecoder::decode_json("name", name, obj);
-  JSONDecoder::decode_json("path", path, obj);
-  JSONDecoder::decode_json("arn", arn, obj);
-  JSONDecoder::decode_json("create_date", creation_date, obj);
-  JSONDecoder::decode_json("max_session_duration", max_session_duration, obj);
-  JSONDecoder::decode_json("assume_role_policy_document", trust_policy, obj);
-}
-
-bool RGWRole::validate_input(const DoutPrefixProvider* dpp)
-{
-  if (name.length() > MAX_ROLE_NAME_LEN) {
-    ldpp_dout(dpp, 0) << "ERROR: Invalid name length " << dendl;
-    return false;
-  }
-
-  if (path.length() > MAX_PATH_NAME_LEN) {
-    ldpp_dout(dpp, 0) << "ERROR: Invalid path length " << dendl;
-    return false;
-  }
-
-  std::regex regex_name("[A-Za-z0-9:=,.@-]+");
-  if (! std::regex_match(name, regex_name)) {
-    ldpp_dout(dpp, 0) << "ERROR: Invalid chars in name " << dendl;
-    return false;
-  }
-
-  std::regex regex_path("(/[!-~]+/)|(/)");
-  if (! std::regex_match(path,regex_path)) {
-    ldpp_dout(dpp, 0) << "ERROR: Invalid chars in path " << dendl;
-    return false;
-  }
-
-  if (max_session_duration < SESSION_DURATION_MIN ||
-          max_session_duration > SESSION_DURATION_MAX) {
-    ldpp_dout(dpp, 0) << "ERROR: Invalid session duration, should be between 3600 and 43200 seconds " << dendl;
-    return false;
-  }
-  return true;
-}
-
-void RGWRole::extract_name_tenant(const std::string& str)
-{
-  size_t pos = str.find('$');
-  if (pos != std::string::npos) {
-    tenant = str.substr(0, pos);
-    name = str.substr(pos + 1);
-  }
-}
-
 void RGWRole::update_trust_policy(string& trust_policy)
 {
 void RGWRole::update_trust_policy(string& trust_policy)
 {
-  this->trust_policy = trust_policy;
+  this->info.trust_policy = trust_policy;
 }
 
 int RGWRole::set_tags(const DoutPrefixProvider* dpp, const multimap<string,string>& tags_map)
 {
   for (auto& it : tags_map) {
 }
 
 int RGWRole::set_tags(const DoutPrefixProvider* dpp, const multimap<string,string>& tags_map)
 {
   for (auto& it : tags_map) {
-    this->tags.emplace(it.first, it.second);
+    this->info.tags.emplace(it.first, it.second);
   }
   }
-  if (this->tags.size() > 50) {
+  if (this->info.tags.size() > 50) {
     ldpp_dout(dpp, 0) << "No. of tags is greater than 50" << dendl;
     return -EINVAL;
   }
     ldpp_dout(dpp, 0) << "No. of tags is greater than 50" << dendl;
     return -EINVAL;
   }
@@ -204,16 +290,16 @@ int RGWRole::set_tags(const DoutPrefixProvider* dpp, const multimap<string,strin
 
 boost::optional<multimap<string,string>> RGWRole::get_tags()
 {
 
 boost::optional<multimap<string,string>> RGWRole::get_tags()
 {
-  if(this->tags.empty()) {
+  if(this->info.tags.empty()) {
     return boost::none;
   }
     return boost::none;
   }
-  return this->tags;
+  return this->info.tags;
 }
 
 void RGWRole::erase_tags(const vector<string>& tagKeys)
 {
   for (auto& it : tagKeys) {
 }
 
 void RGWRole::erase_tags(const vector<string>& tagKeys)
 {
   for (auto& it : tagKeys) {
-    this->tags.erase(it);
+    this->info.tags.erase(it);
   }
 }
 
   }
 }
 
@@ -232,4 +318,110 @@ const string& RGWRole::get_path_oid_prefix()
   return role_path_oid_prefix;
 }
 
   return role_path_oid_prefix;
 }
 
+RGWRoleMetadataHandler::RGWRoleMetadataHandler(Store* store,
+                                              RGWSI_Role_RADOS *role_svc)
+{
+  this->store = store;
+  base_init(role_svc->ctx(), role_svc->get_be_handler());
+}
+
+RGWMetadataObject *RGWRoleMetadataHandler::get_meta_obj(JSONObj *jo,
+                                                       const obj_version& objv,
+                                                       const ceph::real_time& mtime)
+{
+  RGWRoleInfo info;
+
+  try {
+    info.decode_json(jo);
+  } catch (JSONDecoder:: err& e) {
+    return nullptr;
+  }
+
+  return new RGWRoleMetadataObject(info, objv, mtime, store);
+}
+
+int RGWRoleMetadataHandler::do_get(RGWSI_MetaBackend_Handler::Op *op,
+                                   std::string& entry,
+                                   RGWMetadataObject **obj,
+                                   optional_yield y,
+                                   const DoutPrefixProvider *dpp)
+{
+  std::unique_ptr<rgw::sal::RGWRole> role = store->get_role(entry);
+  int ret = role->read_info(dpp, y);
+  if (ret < 0) {
+    return ret;
+  }
+
+  RGWObjVersionTracker objv_tracker = role->get_objv_tracker();
+  real_time mtime = role->get_mtime();
+
+  RGWRoleInfo info = role->get_info();
+  RGWRoleMetadataObject *rdo = new RGWRoleMetadataObject(info, objv_tracker.read_version,
+                                                         mtime, store);
+  *obj = rdo;
+
+  return 0;
+}
+
+int RGWRoleMetadataHandler::do_remove(RGWSI_MetaBackend_Handler::Op *op,
+                                      std::string& entry,
+                                      RGWObjVersionTracker& objv_tracker,
+                                      optional_yield y,
+                                      const DoutPrefixProvider *dpp)
+{
+  std::unique_ptr<rgw::sal::RGWRole> role = store->get_role(entry);
+  int ret = role->read_info(dpp, y);
+  if (ret < 0) {
+    return ret == -ENOENT? 0 : ret;
+  }
+
+  return role->delete_obj(dpp, y);
+}
+
+class RGWMetadataHandlerPut_Role : public RGWMetadataHandlerPut_SObj
+{
+  RGWRoleMetadataHandler *rhandler;
+  RGWRoleMetadataObject *mdo;
+public:
+  RGWMetadataHandlerPut_Role(RGWRoleMetadataHandler *handler,
+                             RGWSI_MetaBackend_Handler::Op *op,
+                             std::string& entry,
+                             RGWMetadataObject *obj,
+                             RGWObjVersionTracker& objv_tracker,
+                             optional_yield y,
+                             RGWMDLogSyncType type,
+                             bool from_remote_zone) :
+    RGWMetadataHandlerPut_SObj(handler, op, entry, obj, objv_tracker, y, type, from_remote_zone),
+    rhandler(handler) {
+    mdo = static_cast<RGWRoleMetadataObject*>(obj);
+  }
+
+  int put_checked(const DoutPrefixProvider *dpp) override {
+    auto& info = mdo->get_role_info();
+    auto mtime = mdo->get_mtime();
+    auto* store = mdo->get_store();
+    info.mtime = mtime;
+    std::unique_ptr<rgw::sal::RGWRole> role = store->get_role(info);
+    int ret = role->create(dpp, true, info.id, y);
+    if (ret == -EEXIST) {
+      ret = role->update(dpp, y);
+    }
+
+    return ret < 0 ? ret : STATUS_APPLIED;
+  }
+};
+
+int RGWRoleMetadataHandler::do_put(RGWSI_MetaBackend_Handler::Op *op,
+                                   std::string& entry,
+                                   RGWMetadataObject *obj,
+                                   RGWObjVersionTracker& objv_tracker,
+                                   optional_yield y,
+                                   const DoutPrefixProvider *dpp,
+                                   RGWMDLogSyncType type,
+                                   bool from_remote_zone)
+{
+  RGWMetadataHandlerPut_Role put_op(this, op , entry, obj, objv_tracker, y, type, from_remote_zone);
+  return do_put_operate(&put_op, dpp);
+}
+
 } } // namespace rgw::sal
 } } // namespace rgw::sal
index 1d85dc1f06840398640fa12055acf1eaa1236755..6ea23e090e9b8bca056a4116c104d188de2d4402 100644 (file)
 
 #include "common/ceph_json.h"
 #include "common/ceph_context.h"
 
 #include "common/ceph_json.h"
 #include "common/ceph_context.h"
-
 #include "rgw/rgw_rados.h"
 #include "rgw/rgw_rados.h"
+#include "rgw_metadata.h"
 
 
-namespace rgw { namespace sal {
+class RGWRados;
 
 
-class RGWRole
+namespace rgw { namespace sal {
+struct RGWRoleInfo
 {
 {
-public:
-  static const std::string role_name_oid_prefix;
-  static const std::string role_oid_prefix;
-  static const std::string role_path_oid_prefix;
-  static const std::string role_arn_prefix;
-  static constexpr int MAX_ROLE_NAME_LEN = 64;
-  static constexpr int MAX_PATH_NAME_LEN = 512;
-  static constexpr uint64_t SESSION_DURATION_MIN = 3600; // in seconds
-  static constexpr uint64_t SESSION_DURATION_MAX = 43200; // in seconds
-protected:
-
   std::string id;
   std::string name;
   std::string path;
   std::string id;
   std::string name;
   std::string path;
@@ -38,41 +28,13 @@ protected:
   std::string tenant;
   uint64_t max_session_duration;
   std::multimap<std::string,std::string> tags;
   std::string tenant;
   uint64_t max_session_duration;
   std::multimap<std::string,std::string> tags;
+  std::map<std::string, bufferlist> attrs;
+  RGWObjVersionTracker objv_tracker;
+  real_time mtime;
 
 
-public:
-  virtual int store_info(const DoutPrefixProvider *dpp, bool exclusive, optional_yield y) = 0;
-  virtual int store_name(const DoutPrefixProvider *dpp, bool exclusive, optional_yield y) = 0;
-  virtual int store_path(const DoutPrefixProvider *dpp, bool exclusive, optional_yield y) = 0;
-  virtual int read_id(const DoutPrefixProvider *dpp, const std::string& role_name, const std::string& tenant, std::string& role_id, optional_yield y) = 0;
-  virtual int read_name(const DoutPrefixProvider *dpp, optional_yield y) = 0;
-  virtual int read_info(const DoutPrefixProvider *dpp, optional_yield y) = 0;
-  bool validate_input(const DoutPrefixProvider* dpp);
-  void extract_name_tenant(const std::string& str);
-
-  RGWRole(std::string name,
-          std::string tenant,
-          std::string path="",
-          std::string trust_policy="",
-          std::string max_session_duration_str="",
-          std::multimap<std::string,std::string> tags={})
-  : name(std::move(name)),
-    path(std::move(path)),
-    trust_policy(std::move(trust_policy)),
-    tenant(std::move(tenant)),
-    tags(std::move(tags)) {
-    if (this->path.empty())
-      this->path = "/";
-    extract_name_tenant(this->name);
-    if (max_session_duration_str.empty()) {
-      max_session_duration = SESSION_DURATION_MIN;
-    } else {
-      max_session_duration = std::stoull(max_session_duration_str);
-    }
-  }
+  RGWRoleInfo() = default;
 
 
-  RGWRole(std::string id) : id(std::move(id)) {}
-
-  virtual ~RGWRole() = default;
+  ~RGWRoleInfo() = default;
 
   void encode(bufferlist& bl) const {
     ENCODE_START(3, 1, bl);
 
   void encode(bufferlist& bl) const {
     ENCODE_START(3, 1, bl);
@@ -106,17 +68,65 @@ public:
     DECODE_FINISH(bl);
   }
 
     DECODE_FINISH(bl);
   }
 
-  const std::string& get_id() const { return id; }
-  const std::string& get_name() const { return name; }
-  const std::string& get_tenant() const { return tenant; }
-  const std::string& get_path() const { return path; }
-  const std::string& get_create_date() const { return creation_date; }
-  const std::string& get_assume_role_policy() const { return trust_policy;}
-  const uint64_t& get_max_session_duration() const { return max_session_duration; }
+  void dump(Formatter *f) const;
+  void decode_json(JSONObj *obj);
+};
+WRITE_CLASS_ENCODER(RGWRoleInfo)
+
+class RGWRole
+{
+public:
+  static const std::string role_name_oid_prefix;
+  static const std::string role_oid_prefix;
+  static const std::string role_path_oid_prefix;
+  static const std::string role_arn_prefix;
+  static constexpr int MAX_ROLE_NAME_LEN = 64;
+  static constexpr int MAX_PATH_NAME_LEN = 512;
+  static constexpr uint64_t SESSION_DURATION_MIN = 3600; // in seconds
+  static constexpr uint64_t SESSION_DURATION_MAX = 43200; // in seconds
+protected:
+  RGWRoleInfo info;
+public:
+  virtual int store_info(const DoutPrefixProvider *dpp, bool exclusive, optional_yield y) = 0;
+  virtual int store_name(const DoutPrefixProvider *dpp, bool exclusive, optional_yield y) = 0;
+  virtual int store_path(const DoutPrefixProvider *dpp, bool exclusive, optional_yield y) = 0;
+  virtual int read_id(const DoutPrefixProvider *dpp, const std::string& role_name, const std::string& tenant, std::string& role_id, optional_yield y) = 0;
+  virtual int read_name(const DoutPrefixProvider *dpp, optional_yield y) = 0;
+  virtual int read_info(const DoutPrefixProvider *dpp, optional_yield y) = 0;
+  bool validate_input(const DoutPrefixProvider* dpp);
+  void extract_name_tenant(const std::string& str);
+
+  RGWRole(std::string name,
+              std::string tenant,
+              std::string path="",
+              std::string trust_policy="",
+              std::string max_session_duration_str="",
+              std::multimap<std::string,std::string> tags={});
+
+  explicit RGWRole(std::string id);
+
+  explicit RGWRole(const RGWRoleInfo& info) : info(info) {}
 
 
-  void set_id(const std::string& id) { this->id = id; }
+  RGWRole() = default;
+
+  virtual ~RGWRole() = default;
 
 
-  virtual int create(const DoutPrefixProvider *dpp, bool exclusive, optional_yield y) = 0;
+  const std::string& get_id() const { return info.id; }
+  const std::string& get_name() const { return info.name; }
+  const std::string& get_tenant() const { return info.tenant; }
+  const std::string& get_path() const { return info.path; }
+  const std::string& get_create_date() const { return info.creation_date; }
+  const std::string& get_assume_role_policy() const { return info.trust_policy;}
+  const uint64_t& get_max_session_duration() const { return info.max_session_duration; }
+  const RGWObjVersionTracker& get_objv_tracker() const { return info.objv_tracker; }
+  const real_time& get_mtime() const { return info.mtime; }
+  std::map<std::string, bufferlist>& get_attrs() { return info.attrs; }
+  RGWRoleInfo& get_info() { return info; }
+
+  void set_id(const std::string& id) { this->info.id = id; }
+  void set_mtime(const real_time& mtime) { this->info.mtime = mtime; }
+
+  virtual int create(const DoutPrefixProvider *dpp, bool exclusive, const std::string &role_id, optional_yield y) = 0;
   virtual int delete_obj(const DoutPrefixProvider *dpp, optional_yield y) = 0;
   int get(const DoutPrefixProvider *dpp, optional_yield y);
   int get_by_id(const DoutPrefixProvider *dpp, optional_yield y);
   virtual int delete_obj(const DoutPrefixProvider *dpp, optional_yield y) = 0;
   int get(const DoutPrefixProvider *dpp, optional_yield y);
   int get_by_id(const DoutPrefixProvider *dpp, optional_yield y);
@@ -136,6 +146,65 @@ public:
   static const std::string& get_info_oid_prefix();
   static const std::string& get_path_oid_prefix();
 };
   static const std::string& get_info_oid_prefix();
   static const std::string& get_path_oid_prefix();
 };
-WRITE_CLASS_ENCODER(RGWRole)
+
+class RGWRoleMetadataObject: public RGWMetadataObject {
+  RGWRoleInfo info;
+  Store* store;
+public:
+  RGWRoleMetadataObject() = default;
+  RGWRoleMetadataObject(RGWRoleInfo& info,
+                       const obj_version& v,
+                       real_time m,
+      Store* store) : RGWMetadataObject(v,m), info(info), store(store) {}
+
+  void dump(Formatter *f) const override {
+    info.dump(f);
+  }
+
+  RGWRoleInfo& get_role_info() {
+    return info;
+  }
+
+  Store* get_store() {
+    return store;
+  }
+};
+
+class RGWRoleMetadataHandler: public RGWMetadataHandler_GenericMetaBE
+{
+public:
+  RGWRoleMetadataHandler(Store* store, RGWSI_Role_RADOS *role_svc);
+
+  std::string get_type() final { return "roles";  }
+
+  RGWMetadataObject *get_meta_obj(JSONObj *jo,
+                                 const obj_version& objv,
+                                 const ceph::real_time& mtime);
+
+  int do_get(RGWSI_MetaBackend_Handler::Op *op,
+            std::string& entry,
+            RGWMetadataObject **obj,
+            optional_yield y,
+       const DoutPrefixProvider *dpp) final;
+
+  int do_remove(RGWSI_MetaBackend_Handler::Op *op,
+               std::string& entry,
+               RGWObjVersionTracker& objv_tracker,
+               optional_yield y,
+    const DoutPrefixProvider *dpp) final;
+
+  int do_put(RGWSI_MetaBackend_Handler::Op *op,
+            std::string& entr,
+            RGWMetadataObject *obj,
+            RGWObjVersionTracker& objv_tracker,
+            optional_yield y,
+       const DoutPrefixProvider *dpp,
+            RGWMDLogSyncType type,
+       bool from_remote_zone) override;
+
+private:
+  Store* store;
+};
 } } // namespace rgw::sal
 } } // namespace rgw::sal
+
 #endif /* CEPH_RGW_ROLE_H */
 #endif /* CEPH_RGW_ROLE_H */
index 9d02cbbfdf501bc914e514f411b6580eb72423e7..b28369341ea4e61499aa33fa2cb32fba7223925d 100644 (file)
@@ -170,6 +170,7 @@ class Zone;
 class LuaScriptManager;
 class RGWOIDCProvider;
 class RGWRole;
 class LuaScriptManager;
 class RGWOIDCProvider;
 class RGWRole;
+struct RGWRoleInfo;
 
 enum AttrsMod {
   ATTRSMOD_NONE    = 0,
 
 enum AttrsMod {
   ATTRSMOD_NONE    = 0,
@@ -272,6 +273,10 @@ class Store {
     virtual int forward_request_to_master(const DoutPrefixProvider *dpp, User* user, obj_version* objv,
                                          bufferlist& in_data, JSONParser* jp, req_info& info,
                                          optional_yield y) = 0;
     virtual int forward_request_to_master(const DoutPrefixProvider *dpp, User* user, obj_version* objv,
                                          bufferlist& in_data, JSONParser* jp, req_info& info,
                                          optional_yield y) = 0;
+    virtual int forward_iam_request_to_master(const DoutPrefixProvider *dpp, const RGWAccessKey& key, obj_version* objv,
+                                            bufferlist& in_data,
+                                            RGWXMLDecoder::XMLParser* parser, req_info& info,
+                                            optional_yield y) = 0;
     /** Get zone info for this store */
     virtual Zone* get_zone() = 0;
     /** Get a unique ID specific to this zone. */
     /** Get zone info for this store */
     virtual Zone* get_zone() = 0;
     /** Get a unique ID specific to this zone. */
@@ -365,6 +370,7 @@ class Store {
                 std::multimap<std::string,std::string> tags={}) = 0;
     /** Get an IAM Role by ID */
     virtual std::unique_ptr<RGWRole> get_role(std::string id) = 0;
                 std::multimap<std::string,std::string> tags={}) = 0;
     /** Get an IAM Role by ID */
     virtual std::unique_ptr<RGWRole> get_role(std::string id) = 0;
+    virtual std::unique_ptr<RGWRole> get_role(const RGWRoleInfo& info) = 0;
     /** Get all IAM Roles optionally filtered by path */
     virtual int get_roles(const DoutPrefixProvider *dpp,
                          optional_yield y,
     /** Get all IAM Roles optionally filtered by path */
     virtual int get_roles(const DoutPrefixProvider *dpp,
                          optional_yield y,
@@ -665,8 +671,9 @@ class Bucket {
     virtual int update_container_stats(const DoutPrefixProvider* dpp) = 0;
     /** Check if this bucket needs resharding, and schedule it if it does */
     virtual int check_bucket_shards(const DoutPrefixProvider* dpp) = 0;
     virtual int update_container_stats(const DoutPrefixProvider* dpp) = 0;
     /** Check if this bucket needs resharding, and schedule it if it does */
     virtual int check_bucket_shards(const DoutPrefixProvider* dpp) = 0;
-    /** Change the owner of this bucket in the backing store */
-    virtual int chown(const DoutPrefixProvider* dpp, User* new_user, User* old_user, optional_yield y, const std::string* marker = nullptr) = 0;
+    /** Change the owner of this bucket in the backing store.  Current owner must be set.  Does not
+     * change ownership of the objects in the bucket. */
+    virtual int chown(const DoutPrefixProvider* dpp, User& new_user, optional_yield y) = 0;
     /** Store the cached bucket info into the backing store */
     virtual int put_info(const DoutPrefixProvider* dpp, bool exclusive, ceph::real_time mtime) = 0;
     /** Check to see if the given user is the owner of this bucket */
     /** Store the cached bucket info into the backing store */
     virtual int put_info(const DoutPrefixProvider* dpp, bool exclusive, ceph::real_time mtime) = 0;
     /** Check to see if the given user is the owner of this bucket */
@@ -1093,6 +1100,8 @@ class Object {
     /** Get a single OMAP value matching the given key */
     virtual int omap_set_val_by_key(const DoutPrefixProvider *dpp, const std::string& key, bufferlist& val,
                                    bool must_exist, optional_yield y) = 0;
     /** Get a single OMAP value matching the given key */
     virtual int omap_set_val_by_key(const DoutPrefixProvider *dpp, const std::string& key, bufferlist& val,
                                    bool must_exist, optional_yield y) = 0;
+    /** Change the ownership of this object */
+    virtual int chown(User& new_user, const DoutPrefixProvider* dpp, optional_yield y) = 0;
 
     /** Check to see if the give object pointer is uninitialized */
     static bool empty(Object* o) { return (!o || o->empty()); }
 
     /** Check to see if the give object pointer is uninitialized */
     static bool empty(Object* o) { return (!o || o->empty()); }
index f646d94357dfa1aaa3170be62518108dadc6eb67..2c9a47f4717e85896a309cef79b2f56b679896f9 100644 (file)
@@ -311,13 +311,11 @@ namespace rgw::sal {
     return 0;
   }
 
     return 0;
   }
 
-  int DBBucket::chown(const DoutPrefixProvider *dpp, User* new_user, User* old_user, optional_yield y, const std::string* marker)
+  int DBBucket::chown(const DoutPrefixProvider *dpp, User& new_user, optional_yield y)
   {
     int ret;
 
   {
     int ret;
 
-    ret = store->getDB()->update_bucket(dpp, "owner", info, false, &(new_user->get_id()), nullptr, nullptr, nullptr);
-
-    /* XXX: Update policies of all the bucket->objects with new user */
+    ret = store->getDB()->update_bucket(dpp, "owner", info, false, &(new_user.get_id()), nullptr, nullptr, nullptr);
     return ret;
   }
 
     return ret;
   }
 
@@ -684,6 +682,11 @@ namespace rgw::sal {
     return op_target.obj_omap_set_val_by_key(dpp, key, val, must_exist);
   }
 
     return op_target.obj_omap_set_val_by_key(dpp, key, val, must_exist);
   }
 
+  int DBObject::chown(User& new_user, const DoutPrefixProvider* dpp, optional_yield y)
+  {
+    return 0;
+  }
+
   MPSerializer* DBObject::get_serializer(const DoutPrefixProvider *dpp, const std::string& lock_name)
   {
     return new MPDBSerializer(dpp, store, this, lock_name);
   MPSerializer* DBObject::get_serializer(const DoutPrefixProvider *dpp, const std::string& lock_name)
   {
     return new MPDBSerializer(dpp, store, this, lock_name);
@@ -1515,6 +1518,12 @@ namespace rgw::sal {
     return std::unique_ptr<RGWRole>(p);
   }
 
     return std::unique_ptr<RGWRole>(p);
   }
 
+  std::unique_ptr<RGWRole> DBStore::get_role(const RGWRoleInfo& info)
+  {
+    RGWRole* p = nullptr;
+    return std::unique_ptr<RGWRole>(p);
+  }
+
   int DBStore::get_roles(const DoutPrefixProvider *dpp,
       optional_yield y,
       const std::string& path_prefix,
   int DBStore::get_roles(const DoutPrefixProvider *dpp,
       optional_yield y,
       const std::string& path_prefix,
@@ -1680,6 +1689,14 @@ namespace rgw::sal {
     return 0;
   }
 
     return 0;
   }
 
+  int DBStore::forward_iam_request_to_master(const DoutPrefixProvider *dpp, const RGWAccessKey& key, obj_version* objv,
+                                            bufferlist& in_data,
+                                            RGWXMLDecoder::XMLParser* parser, req_info& info,
+                                            optional_yield y)
+  {
+      return 0;
+  }
+
   std::string DBStore::zone_unique_id(uint64_t unique_num)
   {
     return "";
   std::string DBStore::zone_unique_id(uint64_t unique_num)
   {
     return "";
index 49c1bc4340bc24e8bcc5d2bb1507495d7b7a5ae8..98ea8b69f127e611db965239ec731d5657771dc0 100644 (file)
@@ -196,7 +196,7 @@ protected:
       virtual int sync_user_stats(const DoutPrefixProvider *dpp, optional_yield y) override;
       virtual int update_container_stats(const DoutPrefixProvider *dpp) override;
       virtual int check_bucket_shards(const DoutPrefixProvider *dpp) override;
       virtual int sync_user_stats(const DoutPrefixProvider *dpp, optional_yield y) override;
       virtual int update_container_stats(const DoutPrefixProvider *dpp) override;
       virtual int check_bucket_shards(const DoutPrefixProvider *dpp) override;
-      virtual int chown(const DoutPrefixProvider *dpp, User* new_user, User* old_user, optional_yield y, const std::string* marker = nullptr) override;
+      virtual int chown(const DoutPrefixProvider *dpp, User& new_user, optional_yield y) override;
       virtual int put_info(const DoutPrefixProvider *dpp, bool exclusive, ceph::real_time mtime) override;
       virtual bool is_owner(User* user) override;
       virtual int check_empty(const DoutPrefixProvider *dpp, optional_yield y) override;
       virtual int put_info(const DoutPrefixProvider *dpp, bool exclusive, ceph::real_time mtime) override;
       virtual bool is_owner(User* user) override;
       virtual int check_empty(const DoutPrefixProvider *dpp, optional_yield y) override;
@@ -555,6 +555,7 @@ protected:
           Attrs* vals) override;
       virtual int omap_set_val_by_key(const DoutPrefixProvider *dpp, const std::string& key, bufferlist& val,
           bool must_exist, optional_yield y) override;
           Attrs* vals) override;
       virtual int omap_set_val_by_key(const DoutPrefixProvider *dpp, const std::string& key, bufferlist& val,
           bool must_exist, optional_yield y) override;
+      virtual int chown(User& new_user, const DoutPrefixProvider* dpp, optional_yield y) override;
     private:
       int read_attrs(const DoutPrefixProvider* dpp, DB::Object::Read &read_op, optional_yield y, rgw_obj* target_obj = nullptr);
   };
     private:
       int read_attrs(const DoutPrefixProvider* dpp, DB::Object::Read &read_op, optional_yield y, rgw_obj* target_obj = nullptr);
   };
@@ -708,6 +709,10 @@ public:
       virtual int forward_request_to_master(const DoutPrefixProvider *dpp, User* user, obj_version* objv,
           bufferlist& in_data, JSONParser *jp, req_info& info,
           optional_yield y) override;
       virtual int forward_request_to_master(const DoutPrefixProvider *dpp, User* user, obj_version* objv,
           bufferlist& in_data, JSONParser *jp, req_info& info,
           optional_yield y) override;
+      virtual int forward_iam_request_to_master(const DoutPrefixProvider *dpp, const RGWAccessKey& key, obj_version* objv,
+                                            bufferlist& in_data,
+                                            RGWXMLDecoder::XMLParser* parser, req_info& info,
+                                            optional_yield y) override;
       virtual Zone* get_zone() { return &zone; }
       virtual std::string zone_unique_id(uint64_t unique_num) override;
       virtual std::string zone_unique_trans_id(const uint64_t unique_num) override;
       virtual Zone* get_zone() { return &zone; }
       virtual std::string zone_unique_id(uint64_t unique_num) override;
       virtual std::string zone_unique_trans_id(const uint64_t unique_num) override;
@@ -768,6 +773,7 @@ public:
           std::string max_session_duration_str="",
           std::multimap<std::string,std::string> tags={}) override;
       virtual std::unique_ptr<RGWRole> get_role(std::string id) override;
           std::string max_session_duration_str="",
           std::multimap<std::string,std::string> tags={}) override;
       virtual std::unique_ptr<RGWRole> get_role(std::string id) override;
+      virtual std::unique_ptr<RGWRole> get_role(const RGWRoleInfo& info) override;
       virtual int get_roles(const DoutPrefixProvider *dpp,
           optional_yield y,
           const std::string& path_prefix,
       virtual int get_roles(const DoutPrefixProvider *dpp,
           optional_yield y,
           const std::string& path_prefix,
index 8c9f9ef031b7da6dc24178d7f3b3e4a215593efa..3288f2e2d06ec60ef7f99a1adfea9915cfae0b78 100644 (file)
@@ -18,6 +18,7 @@
 #include <system_error>
 #include <unistd.h>
 #include <sstream>
 #include <system_error>
 #include <unistd.h>
 #include <sstream>
+#include <boost/algorithm/string.hpp>
 
 #include "common/Clock.h"
 #include "common/errno.h"
 
 #include "common/Clock.h"
 #include "common/errno.h"
@@ -26,6 +27,7 @@
 #include "rgw_sal_rados.h"
 #include "rgw_bucket.h"
 #include "rgw_multi.h"
 #include "rgw_sal_rados.h"
 #include "rgw_bucket.h"
 #include "rgw_multi.h"
+#include "rgw_acl.h"
 #include "rgw_acl_s3.h"
 #include "rgw_aio.h"
 #include "rgw_aio_throttle.h"
 #include "rgw_acl_s3.h"
 #include "rgw_aio.h"
 #include "rgw_aio_throttle.h"
 #include "rgw_service.h"
 #include "rgw_lc.h"
 #include "services/svc_sys_obj.h"
 #include "rgw_service.h"
 #include "rgw_lc.h"
 #include "services/svc_sys_obj.h"
+#include "services/svc_meta.h"
+#include "services/svc_meta_be_sobj.h"
 #include "services/svc_zone.h"
 #include "services/svc_tier_rados.h"
 #include "services/svc_quota.h"
 #include "services/svc_config_key.h"
 #include "services/svc_zone_utils.h"
 #include "services/svc_zone.h"
 #include "services/svc_tier_rados.h"
 #include "services/svc_quota.h"
 #include "services/svc_config_key.h"
 #include "services/svc_zone_utils.h"
+#include "services/svc_role_rados.h"
 #include "cls/rgw/cls_rgw_client.h"
 
 #include "rgw_pubsub.h"
 #include "cls/rgw/cls_rgw_client.h"
 
 #include "rgw_pubsub.h"
@@ -692,23 +697,22 @@ int RadosBucket::unlink(const DoutPrefixProvider* dpp, User* new_user, optional_
   return store->ctl()->bucket->unlink_bucket(new_user->get_id(), info.bucket, y, dpp, update_entrypoint);
 }
 
   return store->ctl()->bucket->unlink_bucket(new_user->get_id(), info.bucket, y, dpp, update_entrypoint);
 }
 
-int RadosBucket::chown(const DoutPrefixProvider* dpp, User* new_user, User* old_user, optional_yield y, const std::string* marker)
+int RadosBucket::chown(const DoutPrefixProvider* dpp, User& new_user, optional_yield y)
 {
   std::string obj_marker;
 {
   std::string obj_marker;
+  int r;
 
 
-  if (marker == nullptr)
-    marker = &obj_marker;
+  if (!owner) {
+      ldpp_dout(dpp, 0) << __func__ << " Cannot chown without an owner " << dendl;
+      return -EINVAL;
+  }
 
 
-  int r = this->link(dpp, new_user, y);
+  r = this->unlink(dpp, owner, y);
   if (r < 0) {
     return r;
   }
   if (r < 0) {
     return r;
   }
-  if (!old_user) {
-    return r;
-  }
 
 
-  return store->ctl()->bucket->chown(store, this, new_user->get_id(),
-                          old_user->get_display_name(), *marker, y, dpp);
+  return this->link(dpp, &new_user, y);
 }
 
 int RadosBucket::put_info(const DoutPrefixProvider* dpp, bool exclusive, ceph::real_time _mtime)
 }
 
 int RadosBucket::put_info(const DoutPrefixProvider* dpp, bool exclusive, ceph::real_time _mtime)
@@ -1121,6 +1125,45 @@ int RadosStore::forward_request_to_master(const DoutPrefixProvider *dpp, User* u
   return 0;
 }
 
   return 0;
 }
 
+int RadosStore::forward_iam_request_to_master(const DoutPrefixProvider *dpp, const RGWAccessKey& key, obj_version* objv,
+                                            bufferlist& in_data,
+                                            RGWXMLDecoder::XMLParser* parser, req_info& info,
+                                            optional_yield y)
+{
+  if (is_meta_master()) {
+    /* We're master, don't forward */
+    return 0;
+  }
+
+  if (!svc()->zone->get_master_conn()) {
+    ldpp_dout(dpp, 0) << "rest connection is invalid" << dendl;
+    return -EINVAL;
+  }
+  ldpp_dout(dpp, 0) << "sending request to master zonegroup" << dendl;
+  bufferlist response;
+#define MAX_REST_RESPONSE (128 * 1024) // we expect a very small response
+  int ret = svc()->zone->get_master_conn()->forward_iam_request(dpp, key, info,
+                                                    objv, MAX_REST_RESPONSE,
+                                                                                       &in_data, &response, y);
+  if (ret < 0)
+    return ret;
+
+  ldpp_dout(dpp, 20) << "response: " << response.c_str() << dendl;
+
+  std::string r = response.c_str();
+  std::string str_to_search = "&quot;";
+  std::string str_to_replace = "\"";
+  boost::replace_all(r, str_to_search, str_to_replace);
+  ldpp_dout(dpp, 20) << "r: " << r.c_str() << dendl;
+
+  if (parser && !parser->parse(r.c_str(), r.length(), 1)) {
+    ldpp_dout(dpp, 0) << "ERROR: failed to parse response from master zonegroup" << dendl;
+    return -EIO;
+  }
+
+  return 0;
+}
+
 std::string RadosStore::zone_unique_id(uint64_t unique_num)
 {
   return svc()->zone_utils->unique_id(unique_num);
 std::string RadosStore::zone_unique_id(uint64_t unique_num)
 {
   return svc()->zone_utils->unique_id(unique_num);
@@ -1326,6 +1369,11 @@ std::unique_ptr<RGWRole> RadosStore::get_role(std::string id)
   return std::make_unique<RadosRole>(this, id);
 }
 
   return std::make_unique<RadosRole>(this, id);
 }
 
+std::unique_ptr<RGWRole> RadosStore::get_role(const RGWRoleInfo& info)
+{
+  return std::make_unique<RadosRole>(this, info);
+}
+
 int RadosStore::get_roles(const DoutPrefixProvider *dpp,
                          optional_yield y,
                          const std::string& path_prefix,
 int RadosStore::get_roles(const DoutPrefixProvider *dpp,
                          optional_yield y,
                          const std::string& path_prefix,
@@ -1648,6 +1696,65 @@ int RadosObject::omap_set_val_by_key(const DoutPrefixProvider *dpp, const std::s
   return sysobj.omap().set_must_exist(must_exist).set(dpp, key, val, y);
 }
 
   return sysobj.omap().set_must_exist(must_exist).set(dpp, key, val, y);
 }
 
+int RadosObject::chown(User& new_user, const DoutPrefixProvider* dpp, optional_yield y)
+{
+  RGWObjectCtx obj_ctx(store);
+  int r = get_obj_attrs(&obj_ctx, y, dpp);
+  if (r < 0) {
+    ldpp_dout(dpp, 0) << "ERROR: failed to read object attrs " << get_name() << cpp_strerror(-r) << dendl;
+    return r;
+  }
+
+  const auto& aiter = get_attrs().find(RGW_ATTR_ACL);
+  if (aiter == get_attrs().end()) {
+    ldpp_dout(dpp, 0) << "ERROR: no acls found for object " << get_name() << dendl;
+    return -EINVAL;
+  }
+
+  bufferlist& bl = aiter->second;
+  RGWAccessControlPolicy policy(store->ctx());
+  ACLOwner owner;
+  auto bliter = bl.cbegin();
+  try {
+    policy.decode(bliter);
+    owner = policy.get_owner();
+  } catch (buffer::error& err) {
+    ldpp_dout(dpp, 0) << "ERROR: decode policy failed" << err.what()
+      << dendl;
+    return -EIO;
+  }
+
+  //Get the ACL from the policy
+  RGWAccessControlList& acl = policy.get_acl();
+
+  //Remove grant that is set to old owner
+  acl.remove_canon_user_grant(owner.get_id());
+
+  //Create a grant and add grant
+  ACLGrant grant;
+  grant.set_canon(new_user.get_id(), new_user.get_display_name(), RGW_PERM_FULL_CONTROL);
+  acl.add_grant(&grant);
+
+  //Update the ACL owner to the new user
+  owner.set_id(new_user.get_id());
+  owner.set_name(new_user.get_display_name());
+  policy.set_owner(owner);
+
+  bl.clear();
+  encode(policy, bl);
+
+  set_atomic(&obj_ctx);
+  map<string, bufferlist> attrs;
+  attrs[RGW_ATTR_ACL] = bl;
+  r = set_obj_attrs(dpp, &obj_ctx, &attrs, nullptr, y);
+  if (r < 0) {
+    ldpp_dout(dpp, 0) << "ERROR: modify attr failed " << cpp_strerror(-r) << dendl;
+    return r;
+  }
+
+  return 0;
+}
+
 MPSerializer* RadosObject::get_serializer(const DoutPrefixProvider *dpp, const std::string& lock_name)
 {
   return new MPRadosSerializer(dpp, store, this, lock_name);
 MPSerializer* RadosObject::get_serializer(const DoutPrefixProvider *dpp, const std::string& lock_name)
 {
   return new MPRadosSerializer(dpp, store, this, lock_name);
@@ -2005,14 +2112,14 @@ int RadosMultipartUpload::abort(const DoutPrefixProvider *dpp, CephContext *cct,
     store->getRados()->delete_objs_inline(dpp, chain, mp_obj.get_upload_id());
   } else {
     /* use upload id as tag and do it synchronously */
     store->getRados()->delete_objs_inline(dpp, chain, mp_obj.get_upload_id());
   } else {
     /* use upload id as tag and do it synchronously */
-    ret = store->getRados()->send_chain_to_gc(chain, mp_obj.get_upload_id());
-    if (ret < 0) {
+    auto [ret, leftover_chain] = store->getRados()->send_chain_to_gc(chain, mp_obj.get_upload_id());
+    if (ret < 0 && leftover_chain) {
       ldpp_dout(dpp, 5) << __func__ << ": gc->send_chain() returned " << ret << dendl;
       if (ret == -ENOENT) {
         return -ERR_NO_SUCH_UPLOAD;
       }
       //Delete objects inline if send chain to gc fails
       ldpp_dout(dpp, 5) << __func__ << ": gc->send_chain() returned " << ret << dendl;
       if (ret == -ENOENT) {
         return -ERR_NO_SUCH_UPLOAD;
       }
       //Delete objects inline if send chain to gc fails
-      store->getRados()->delete_objs_inline(dpp, chain, mp_obj.get_upload_id());
+      store->getRados()->delete_objs_inline(dpp, *leftover_chain, mp_obj.get_upload_id());
     }
   }
 
     }
   }
 
@@ -2821,52 +2928,60 @@ int RadosOIDCProvider::delete_obj(const DoutPrefixProvider *dpp, optional_yield
 int RadosRole::store_info(const DoutPrefixProvider *dpp, bool exclusive, optional_yield y)
 {
   using ceph::encode;
 int RadosRole::store_info(const DoutPrefixProvider *dpp, bool exclusive, optional_yield y)
 {
   using ceph::encode;
-  auto obj_ctx = store->svc()->sysobj->init_obj_ctx();
-  std::string oid = get_info_oid_prefix() + id;
+  std::string oid;
+
+  oid = info.id;
 
   bufferlist bl;
 
   bufferlist bl;
-  encode(*this, bl);
+  encode(this->info, bl);
 
 
-  if (!this->tags.empty()) {
+  if (!this->info.tags.empty()) {
     bufferlist bl_tags;
     bufferlist bl_tags;
-    encode(this->tags, bl_tags);
+    encode(this->info.tags, bl_tags);
     map<string, bufferlist> attrs;
     attrs.emplace("tagging", bl_tags);
     map<string, bufferlist> attrs;
     attrs.emplace("tagging", bl_tags);
-    return rgw_put_system_obj(dpp, obj_ctx, store->get_zone()->get_params().roles_pool, oid, bl, exclusive, nullptr, real_time(), y, &attrs);
-  }
 
 
-  return rgw_put_system_obj(dpp, obj_ctx, store->get_zone()->get_params().roles_pool, oid, bl, exclusive, nullptr, real_time(), y);
+    RGWSI_MBSObj_PutParams params(bl, &attrs, info.mtime, exclusive);
+    std::unique_ptr<RGWSI_MetaBackend::Context> ctx(store->svc()->role->svc.meta_be->alloc_ctx());
+    ctx->init(store->svc()->role->get_be_handler());
+    return store->svc()->role->svc.meta_be->put(ctx.get(), oid, params, &info.objv_tracker, y, dpp);
+  } else {
+    RGWSI_MBSObj_PutParams params(bl, nullptr, info.mtime, exclusive);
+    std::unique_ptr<RGWSI_MetaBackend::Context> ctx(store->svc()->role->svc.meta_be->alloc_ctx());
+    ctx->init(store->svc()->role->get_be_handler());
+    return store->svc()->role->svc.meta_be->put(ctx.get(), oid, params, &info.objv_tracker, y, dpp);
+  }
 }
 
 int RadosRole::store_name(const DoutPrefixProvider *dpp, bool exclusive, optional_yield y)
 {
   auto obj_ctx = store->svc()->sysobj->init_obj_ctx();
   RGWNameToId nameToId;
 }
 
 int RadosRole::store_name(const DoutPrefixProvider *dpp, bool exclusive, optional_yield y)
 {
   auto obj_ctx = store->svc()->sysobj->init_obj_ctx();
   RGWNameToId nameToId;
-  nameToId.obj_id = id;
+  nameToId.obj_id = info.id;
 
 
-  std::string oid = tenant + get_names_oid_prefix() + name;
+  std::string oid = info.tenant + get_names_oid_prefix() + info.name;
 
   bufferlist bl;
   using ceph::encode;
   encode(nameToId, bl);
 
 
   bufferlist bl;
   using ceph::encode;
   encode(nameToId, bl);
 
-  return rgw_put_system_obj(dpp, obj_ctx, store->get_zone()->get_params().roles_pool, oid, bl, exclusive, nullptr, real_time(), y);
+  return rgw_put_system_obj(dpp, obj_ctx, store->get_zone()->get_params().roles_pool, oid, bl, exclusive, &info.objv_tracker, real_time(), y);
 }
 
 int RadosRole::store_path(const DoutPrefixProvider *dpp, bool exclusive, optional_yield y)
 {
   auto obj_ctx = store->svc()->sysobj->init_obj_ctx();
 }
 
 int RadosRole::store_path(const DoutPrefixProvider *dpp, bool exclusive, optional_yield y)
 {
   auto obj_ctx = store->svc()->sysobj->init_obj_ctx();
-  std::string oid = tenant + get_path_oid_prefix() + path + get_info_oid_prefix() + id;
+  std::string oid = info.tenant + get_path_oid_prefix() + info.path + get_info_oid_prefix() + info.id;
 
   bufferlist bl;
 
 
   bufferlist bl;
 
-  return rgw_put_system_obj(dpp, obj_ctx, store->get_zone()->get_params().roles_pool, oid, bl, exclusive, nullptr, real_time(), y);
+  return rgw_put_system_obj(dpp, obj_ctx, store->get_zone()->get_params().roles_pool, oid, bl, exclusive, &info.objv_tracker, real_time(), y);
 }
 
 int RadosRole::read_id(const DoutPrefixProvider *dpp, const std::string& role_name, const std::string& tenant, std::string& role_id, optional_yield y)
 {
   auto obj_ctx = store->svc()->sysobj->init_obj_ctx();
 }
 
 int RadosRole::read_id(const DoutPrefixProvider *dpp, const std::string& role_name, const std::string& tenant, std::string& role_id, optional_yield y)
 {
   auto obj_ctx = store->svc()->sysobj->init_obj_ctx();
-  std::string oid = tenant + get_names_oid_prefix() + role_name;
+  std::string oid = info.tenant + get_names_oid_prefix() + role_name;
   bufferlist bl;
 
   int ret = rgw_get_system_obj(obj_ctx, store->get_zone()->get_params().roles_pool, oid, bl, nullptr, nullptr, null_yield, dpp);
   bufferlist bl;
 
   int ret = rgw_get_system_obj(obj_ctx, store->get_zone()->get_params().roles_pool, oid, bl, nullptr, nullptr, null_yield, dpp);
@@ -2890,12 +3005,12 @@ int RadosRole::read_id(const DoutPrefixProvider *dpp, const std::string& role_na
 int RadosRole::read_name(const DoutPrefixProvider *dpp, optional_yield y)
 {
   auto obj_ctx = store->svc()->sysobj->init_obj_ctx();
 int RadosRole::read_name(const DoutPrefixProvider *dpp, optional_yield y)
 {
   auto obj_ctx = store->svc()->sysobj->init_obj_ctx();
-  std::string oid = tenant + get_names_oid_prefix() + name;
+  std::string oid = info.tenant + get_names_oid_prefix() + info.name;
   bufferlist bl;
 
   int ret = rgw_get_system_obj(obj_ctx, store->get_zone()->get_params().roles_pool, oid, bl, nullptr, nullptr, null_yield, dpp);
   if (ret < 0) {
   bufferlist bl;
 
   int ret = rgw_get_system_obj(obj_ctx, store->get_zone()->get_params().roles_pool, oid, bl, nullptr, nullptr, null_yield, dpp);
   if (ret < 0) {
-    ldpp_dout(dpp, 0) << "ERROR: failed reading role name from Role pool: " << name <<
+    ldpp_dout(dpp, 0) << "ERROR: failed reading role name from Role pool: " << info.name <<
       ": " << cpp_strerror(-ret) << dendl;
     return ret;
   }
       ": " << cpp_strerror(-ret) << dendl;
     return ret;
   }
@@ -2906,44 +3021,50 @@ int RadosRole::read_name(const DoutPrefixProvider *dpp, optional_yield y)
     auto iter = bl.cbegin();
     decode(nameToId, iter);
   } catch (buffer::error& err) {
     auto iter = bl.cbegin();
     decode(nameToId, iter);
   } catch (buffer::error& err) {
-    ldpp_dout(dpp, 0) << "ERROR: failed to decode role name from Role pool: " << name << dendl;
+    ldpp_dout(dpp, 0) << "ERROR: failed to decode role name from Role pool: " << info.name << dendl;
     return -EIO;
   }
     return -EIO;
   }
-  id = nameToId.obj_id;
+  info.id = nameToId.obj_id;
   return 0;
 }
 
 int RadosRole::read_info(const DoutPrefixProvider *dpp, optional_yield y)
 {
   auto obj_ctx = store->svc()->sysobj->init_obj_ctx();
   return 0;
 }
 
 int RadosRole::read_info(const DoutPrefixProvider *dpp, optional_yield y)
 {
   auto obj_ctx = store->svc()->sysobj->init_obj_ctx();
-  std::string oid = get_info_oid_prefix() + id;
+  std::string oid;
+
+  oid = info.id;
+  ldpp_dout(dpp, 20) << "INFO: oid in read_info is: " << oid << dendl;
+
   bufferlist bl;
 
   bufferlist bl;
 
-  map<string, bufferlist> attrs;
-  int ret = rgw_get_system_obj(obj_ctx, store->get_zone()->get_params().roles_pool, oid, bl, nullptr, nullptr, null_yield, dpp, &attrs, nullptr, boost::none, true);
+  RGWSI_MBSObj_GetParams params(&bl, &info.attrs, &info.mtime);
+  std::unique_ptr<RGWSI_MetaBackend::Context> ctx(store->svc()->role->svc.meta_be->alloc_ctx());
+  ctx->init(store->svc()->role->get_be_handler());
+  int ret = store->svc()->role->svc.meta_be->get(ctx.get(), oid, params, &info.objv_tracker, y, dpp, true);
   if (ret < 0) {
   if (ret < 0) {
-    ldpp_dout(dpp, 0) << "ERROR: failed reading role info from Role pool: " << id << ": " << cpp_strerror(-ret) << dendl;
+    ldpp_dout(dpp, 0) << "ERROR: failed reading role info from Role pool: " << info.id << ": " << cpp_strerror(-ret) << dendl;
     return ret;
   }
 
   try {
     using ceph::decode;
     auto iter = bl.cbegin();
     return ret;
   }
 
   try {
     using ceph::decode;
     auto iter = bl.cbegin();
-    decode(*this, iter);
+    decode(this->info, iter);
   } catch (buffer::error& err) {
   } catch (buffer::error& err) {
-    ldpp_dout(dpp, 0) << "ERROR: failed to decode role info from Role pool: " << id << dendl;
+    ldpp_dout(dpp, 0) << "ERROR: failed to decode role info from Role pool: " << info.id << dendl;
     return -EIO;
   }
 
     return -EIO;
   }
 
-  auto it = attrs.find("tagging");
-  if (it != attrs.end()) {
+  auto it = info.attrs.find("tagging");
+  if (it != info.attrs.end()) {
     bufferlist bl_tags = it->second;
     try {
       using ceph::decode;
       auto iter = bl_tags.cbegin();
     bufferlist bl_tags = it->second;
     try {
       using ceph::decode;
       auto iter = bl_tags.cbegin();
-      decode(tags, iter);
+      decode(info.tags, iter);
     } catch (buffer::error& err) {
     } catch (buffer::error& err) {
-      ldpp_dout(dpp, 0) << "ERROR: failed to decode attrs" << id << dendl;
+      ldpp_dout(dpp, 0) << "ERROR: failed to decode attrs" << info.id << dendl;
       return -EIO;
     }
   }
       return -EIO;
     }
   }
@@ -2951,7 +3072,7 @@ int RadosRole::read_info(const DoutPrefixProvider *dpp, optional_yield y)
   return 0;
 }
 
   return 0;
 }
 
-int RadosRole::create(const DoutPrefixProvider *dpp, bool exclusive, optional_yield y)
+int RadosRole::create(const DoutPrefixProvider *dpp, bool exclusive, const std::string& role_id, optional_yield y)
 {
   int ret;
 
 {
   int ret;
 
@@ -2959,27 +3080,33 @@ int RadosRole::create(const DoutPrefixProvider *dpp, bool exclusive, optional_yi
     return -EINVAL;
   }
 
     return -EINVAL;
   }
 
+  if (!role_id.empty()) {
+    info.id = role_id;
+  }
+
   /* check to see the name is not used */
   /* check to see the name is not used */
-  ret = read_id(dpp, name, tenant, id, y);
+  ret = read_id(dpp, info.name, info.tenant, info.id, y);
   if (exclusive && ret == 0) {
   if (exclusive && ret == 0) {
-    ldpp_dout(dpp, 0) << "ERROR: name " << name << " already in use for role id "
-                    << id << dendl;
+    ldpp_dout(dpp, 0) << "ERROR: name " << info.name << " already in use for role id "
+                    << info.id << dendl;
     return -EEXIST;
   } else if ( ret < 0 && ret != -ENOENT) {
     return -EEXIST;
   } else if ( ret < 0 && ret != -ENOENT) {
-    ldpp_dout(dpp, 0) << "failed reading role id  " << id << ": "
+    ldpp_dout(dpp, 0) << "failed reading role id  " << info.id << ": "
                   << cpp_strerror(-ret) << dendl;
     return ret;
   }
 
                   << cpp_strerror(-ret) << dendl;
     return ret;
   }
 
-  /* create unique id */
-  uuid_d new_uuid;
-  char uuid_str[37];
-  new_uuid.generate_random();
-  new_uuid.print(uuid_str);
-  id = uuid_str;
+  if (info.id.empty()) {
+    /* create unique id */
+    uuid_d new_uuid;
+    char uuid_str[37];
+    new_uuid.generate_random();
+    new_uuid.print(uuid_str);
+    info.id = uuid_str;
+  }
 
   //arn
 
   //arn
-  arn = role_arn_prefix + tenant + ":role" + path + name;
+  info.arn = role_arn_prefix + info.tenant + ":role" + info.path + info.name;
 
   // Creation time
   real_clock::time_point t = real_clock::now();
 
   // Creation time
   real_clock::time_point t = real_clock::now();
@@ -2992,27 +3119,27 @@ int RadosRole::create(const DoutPrefixProvider *dpp, bool exclusive, optional_yi
   gmtime_r(&tv.tv_sec, &result);
   strftime(buf,30,"%Y-%m-%dT%H:%M:%S", &result);
   sprintf(buf + strlen(buf),".%dZ",(int)tv.tv_usec/1000);
   gmtime_r(&tv.tv_sec, &result);
   strftime(buf,30,"%Y-%m-%dT%H:%M:%S", &result);
   sprintf(buf + strlen(buf),".%dZ",(int)tv.tv_usec/1000);
-  creation_date.assign(buf, strlen(buf));
+  info.creation_date.assign(buf, strlen(buf));
 
   auto& pool = store->get_zone()->get_params().roles_pool;
   ret = store_info(dpp, exclusive, y);
   if (ret < 0) {
     ldpp_dout(dpp, 0) << "ERROR:  storing role info in Role pool: "
 
   auto& pool = store->get_zone()->get_params().roles_pool;
   ret = store_info(dpp, exclusive, y);
   if (ret < 0) {
     ldpp_dout(dpp, 0) << "ERROR:  storing role info in Role pool: "
-                  << id << ": " << cpp_strerror(-ret) << dendl;
+                  << info.id << ": " << cpp_strerror(-ret) << dendl;
     return ret;
   }
 
   ret = store_name(dpp, exclusive, y);
   if (ret < 0) {
     ldpp_dout(dpp, 0) << "ERROR: storing role name in Role pool: "
     return ret;
   }
 
   ret = store_name(dpp, exclusive, y);
   if (ret < 0) {
     ldpp_dout(dpp, 0) << "ERROR: storing role name in Role pool: "
-                  << name << ": " << cpp_strerror(-ret) << dendl;
+                  << info.name << ": " << cpp_strerror(-ret) << dendl;
 
     //Delete the role info that was stored in the previous call
 
     //Delete the role info that was stored in the previous call
-    std::string oid = get_info_oid_prefix() + id;
+    std::string oid = get_info_oid_prefix() + info.id;
     int info_ret = rgw_delete_system_obj(dpp, store->svc()->sysobj, pool, oid, nullptr, y);
     if (info_ret < 0) {
       ldpp_dout(dpp, 0) << "ERROR: cleanup of role id from Role pool: "
     int info_ret = rgw_delete_system_obj(dpp, store->svc()->sysobj, pool, oid, nullptr, y);
     if (info_ret < 0) {
       ldpp_dout(dpp, 0) << "ERROR: cleanup of role id from Role pool: "
-                  << id << ": " << cpp_strerror(-info_ret) << dendl;
+                  << info.id << ": " << cpp_strerror(-info_ret) << dendl;
     }
     return ret;
   }
     }
     return ret;
   }
@@ -3020,20 +3147,20 @@ int RadosRole::create(const DoutPrefixProvider *dpp, bool exclusive, optional_yi
   ret = store_path(dpp, exclusive, y);
   if (ret < 0) {
     ldpp_dout(dpp, 0) << "ERROR: storing role path in Role pool: "
   ret = store_path(dpp, exclusive, y);
   if (ret < 0) {
     ldpp_dout(dpp, 0) << "ERROR: storing role path in Role pool: "
-                  << path << ": " << cpp_strerror(-ret) << dendl;
+                  << info.path << ": " << cpp_strerror(-ret) << dendl;
     //Delete the role info that was stored in the previous call
     //Delete the role info that was stored in the previous call
-    std::string oid = get_info_oid_prefix() + id;
+    std::string oid = get_info_oid_prefix() + info.id;
     int info_ret = rgw_delete_system_obj(dpp, store->svc()->sysobj, pool, oid, nullptr, y);
     if (info_ret < 0) {
       ldpp_dout(dpp, 0) << "ERROR: cleanup of role id from Role pool: "
     int info_ret = rgw_delete_system_obj(dpp, store->svc()->sysobj, pool, oid, nullptr, y);
     if (info_ret < 0) {
       ldpp_dout(dpp, 0) << "ERROR: cleanup of role id from Role pool: "
-                  << id << ": " << cpp_strerror(-info_ret) << dendl;
+                  << info.id << ": " << cpp_strerror(-info_ret) << dendl;
     }
     //Delete role name that was stored in previous call
     }
     //Delete role name that was stored in previous call
-    oid = tenant + get_names_oid_prefix() + name;
+    oid = info.tenant + get_names_oid_prefix() + info.name;
     int name_ret = rgw_delete_system_obj(dpp, store->svc()->sysobj, pool, oid, nullptr, y);
     if (name_ret < 0) {
       ldpp_dout(dpp, 0) << "ERROR: cleanup of role name from Role pool: "
     int name_ret = rgw_delete_system_obj(dpp, store->svc()->sysobj, pool, oid, nullptr, y);
     if (name_ret < 0) {
       ldpp_dout(dpp, 0) << "ERROR: cleanup of role name from Role pool: "
-                  << name << ": " << cpp_strerror(-name_ret) << dendl;
+                  << info.name << ": " << cpp_strerror(-name_ret) << dendl;
     }
     return ret;
   }
     }
     return ret;
   }
@@ -3054,37 +3181,36 @@ int RadosRole::delete_obj(const DoutPrefixProvider *dpp, optional_yield y)
     return ret;
   }
 
     return ret;
   }
 
-  if (! perm_policy_map.empty()) {
+  if (! info.perm_policy_map.empty()) {
     return -ERR_DELETE_CONFLICT;
   }
 
   // Delete id
     return -ERR_DELETE_CONFLICT;
   }
 
   // Delete id
-  std::string oid = get_info_oid_prefix() + id;
+  std::string oid = get_info_oid_prefix() + info.id;
   ret = rgw_delete_system_obj(dpp, store->svc()->sysobj, pool, oid, nullptr, y);
   if (ret < 0) {
     ldpp_dout(dpp, 0) << "ERROR: deleting role id from Role pool: "
   ret = rgw_delete_system_obj(dpp, store->svc()->sysobj, pool, oid, nullptr, y);
   if (ret < 0) {
     ldpp_dout(dpp, 0) << "ERROR: deleting role id from Role pool: "
-                  << id << ": " << cpp_strerror(-ret) << dendl;
+                  << info.id << ": " << cpp_strerror(-ret) << dendl;
   }
 
   // Delete name
   }
 
   // Delete name
-  oid = tenant + get_names_oid_prefix() + name;
+  oid = info.tenant + get_names_oid_prefix() + info.name;
   ret = rgw_delete_system_obj(dpp, store->svc()->sysobj, pool, oid, nullptr, y);
   if (ret < 0) {
     ldpp_dout(dpp, 0) << "ERROR: deleting role name from Role pool: "
   ret = rgw_delete_system_obj(dpp, store->svc()->sysobj, pool, oid, nullptr, y);
   if (ret < 0) {
     ldpp_dout(dpp, 0) << "ERROR: deleting role name from Role pool: "
-                  << name << ": " << cpp_strerror(-ret) << dendl;
+                  << info.name << ": " << cpp_strerror(-ret) << dendl;
   }
 
   // Delete path
   }
 
   // Delete path
-  oid = tenant + get_path_oid_prefix() + path + get_info_oid_prefix() + id;
+  oid = info.tenant + get_path_oid_prefix() + info.path + get_info_oid_prefix() + info.id;
   ret = rgw_delete_system_obj(dpp, store->svc()->sysobj, pool, oid, nullptr, y);
   if (ret < 0) {
     ldpp_dout(dpp, 0) << "ERROR: deleting role path from Role pool: "
   ret = rgw_delete_system_obj(dpp, store->svc()->sysobj, pool, oid, nullptr, y);
   if (ret < 0) {
     ldpp_dout(dpp, 0) << "ERROR: deleting role path from Role pool: "
-                  << path << ": " << cpp_strerror(-ret) << dendl;
+                  << info.path << ": " << cpp_strerror(-ret) << dendl;
   }
   return ret;
 }
 
   }
   return ret;
 }
 
-
 } // namespace rgw::sal
 
 extern "C" {
 } // namespace rgw::sal
 
 extern "C" {
index 4e4673c032806dce1026a9e29af5287defe541e5..26ea5cb55a28bd907b7a43f307d89e1af1b0cd99 100644 (file)
@@ -213,6 +213,7 @@ class RadosObject : public Object {
                              Attrs* vals) override;
     virtual int omap_set_val_by_key(const DoutPrefixProvider *dpp, const std::string& key, bufferlist& val,
                                    bool must_exist, optional_yield y) override;
                              Attrs* vals) override;
     virtual int omap_set_val_by_key(const DoutPrefixProvider *dpp, const std::string& key, bufferlist& val,
                                    bool must_exist, optional_yield y) override;
+    virtual int chown(User& new_user, const DoutPrefixProvider* dpp, optional_yield y) override;
 
     /* Internal to RadosStore */
     int get_max_chunk_size(const DoutPrefixProvider* dpp,
 
     /* Internal to RadosStore */
     int get_max_chunk_size(const DoutPrefixProvider* dpp,
@@ -300,7 +301,7 @@ class RadosBucket : public Bucket {
     virtual int sync_user_stats(const DoutPrefixProvider *dpp, optional_yield y) override;
     virtual int update_container_stats(const DoutPrefixProvider* dpp) override;
     virtual int check_bucket_shards(const DoutPrefixProvider* dpp) override;
     virtual int sync_user_stats(const DoutPrefixProvider *dpp, optional_yield y) override;
     virtual int update_container_stats(const DoutPrefixProvider* dpp) override;
     virtual int check_bucket_shards(const DoutPrefixProvider* dpp) override;
-    virtual int chown(const DoutPrefixProvider* dpp, User* new_user, User* old_user, optional_yield y, const std::string* marker = nullptr) override;
+    virtual int chown(const DoutPrefixProvider* dpp, User& new_user, optional_yield y) override;
     virtual int put_info(const DoutPrefixProvider* dpp, bool exclusive, ceph::real_time mtime) override;
     virtual bool is_owner(User* user) override;
     virtual int check_empty(const DoutPrefixProvider* dpp, optional_yield y) override;
     virtual int put_info(const DoutPrefixProvider* dpp, bool exclusive, ceph::real_time mtime) override;
     virtual bool is_owner(User* user) override;
     virtual int check_empty(const DoutPrefixProvider* dpp, optional_yield y) override;
@@ -391,6 +392,10 @@ class RadosStore : public Store {
     virtual int forward_request_to_master(const DoutPrefixProvider *dpp, User* user, obj_version* objv,
                                          bufferlist& in_data, JSONParser* jp, req_info& info,
                                          optional_yield y) override;
     virtual int forward_request_to_master(const DoutPrefixProvider *dpp, User* user, obj_version* objv,
                                          bufferlist& in_data, JSONParser* jp, req_info& info,
                                          optional_yield y) override;
+    virtual int forward_iam_request_to_master(const DoutPrefixProvider *dpp, const RGWAccessKey& key, obj_version* objv,
+                                            bufferlist& in_data,
+                                            RGWXMLDecoder::XMLParser* parser, req_info& info,
+                                            optional_yield y) override;
     virtual Zone* get_zone() { return &zone; }
     virtual std::string zone_unique_id(uint64_t unique_num) override;
     virtual std::string zone_unique_trans_id(const uint64_t unique_num) override;
     virtual Zone* get_zone() { return &zone; }
     virtual std::string zone_unique_id(uint64_t unique_num) override;
     virtual std::string zone_unique_trans_id(const uint64_t unique_num) override;
@@ -444,6 +449,7 @@ class RadosStore : public Store {
                                              std::string max_session_duration_str="",
                 std::multimap<std::string,std::string> tags={}) override;
     virtual std::unique_ptr<RGWRole> get_role(std::string id) override;
                                              std::string max_session_duration_str="",
                 std::multimap<std::string,std::string> tags={}) override;
     virtual std::unique_ptr<RGWRole> get_role(std::string id) override;
+    virtual std::unique_ptr<RGWRole> get_role(const RGWRoleInfo& info) override;
     virtual int get_roles(const DoutPrefixProvider *dpp,
                          optional_yield y,
                          const std::string& path_prefix,
     virtual int get_roles(const DoutPrefixProvider *dpp,
                          optional_yield y,
                          const std::string& path_prefix,
@@ -809,6 +815,8 @@ public:
           std::string max_session_duration,
           std::multimap<std::string,std::string> tags) : RGWRole(name, tenant, path, trust_policy, max_session_duration, tags), store(_store) {}
   RadosRole(RadosStore* _store, std::string id) : RGWRole(id), store(_store) {}
           std::string max_session_duration,
           std::multimap<std::string,std::string> tags) : RGWRole(name, tenant, path, trust_policy, max_session_duration, tags), store(_store) {}
   RadosRole(RadosStore* _store, std::string id) : RGWRole(id), store(_store) {}
+  RadosRole(RadosStore* _store, const RGWRoleInfo& info) : RGWRole(info), store(_store) {}
+  RadosRole(RadosStore* _store) : store(_store) {}
   ~RadosRole() = default;
 
   virtual int store_info(const DoutPrefixProvider *dpp, bool exclusive, optional_yield y) override;
   ~RadosRole() = default;
 
   virtual int store_info(const DoutPrefixProvider *dpp, bool exclusive, optional_yield y) override;
@@ -817,10 +825,9 @@ public:
   virtual int read_id(const DoutPrefixProvider *dpp, const std::string& role_name, const std::string& tenant, std::string& role_id, optional_yield y) override;
   virtual int read_name(const DoutPrefixProvider *dpp, optional_yield y) override;
   virtual int read_info(const DoutPrefixProvider *dpp, optional_yield y) override;
   virtual int read_id(const DoutPrefixProvider *dpp, const std::string& role_name, const std::string& tenant, std::string& role_id, optional_yield y) override;
   virtual int read_name(const DoutPrefixProvider *dpp, optional_yield y) override;
   virtual int read_info(const DoutPrefixProvider *dpp, optional_yield y) override;
-  virtual int create(const DoutPrefixProvider *dpp, bool exclusive, optional_yield y) override;
+  virtual int create(const DoutPrefixProvider *dpp, bool exclusive, const std::string& role_id, optional_yield y) override;
   virtual int delete_obj(const DoutPrefixProvider *dpp, optional_yield y) override;
 };
   virtual int delete_obj(const DoutPrefixProvider *dpp, optional_yield y) override;
 };
-
-} } // namespace rgw::sal
+}} // namespace rgw::sal
 
 WRITE_CLASS_ENCODER(rgw::sal::RadosOIDCProvider)
 
 WRITE_CLASS_ENCODER(rgw::sal::RadosOIDCProvider)
index 874c2e3e3b34006ce3d530186e3f1151578a995a..7df25a2dba5d836cedf7a15d093d976485fc81db 100644 (file)
@@ -26,6 +26,7 @@
 #include "services/svc_sys_obj_cache.h"
 #include "services/svc_sys_obj_core.h"
 #include "services/svc_user_rados.h"
 #include "services/svc_sys_obj_cache.h"
 #include "services/svc_sys_obj_core.h"
 #include "services/svc_user_rados.h"
+#include "services/svc_role_rados.h"
 
 #include "common/errno.h"
 
 
 #include "common/errno.h"
 
@@ -34,6 +35,7 @@
 #include "rgw_metadata.h"
 #include "rgw_otp.h"
 #include "rgw_user.h"
 #include "rgw_metadata.h"
 #include "rgw_otp.h"
 #include "rgw_user.h"
+#include "rgw_role.h"
 
 #define dout_subsys ceph_subsys_rgw
 
 
 #define dout_subsys ceph_subsys_rgw
 
@@ -74,6 +76,7 @@ int RGWServices_Def::init(CephContext *cct,
   sysobj = std::make_unique<RGWSI_SysObj>(cct);
   sysobj_core = std::make_unique<RGWSI_SysObj_Core>(cct);
   user_rados = std::make_unique<RGWSI_User_RADOS>(cct);
   sysobj = std::make_unique<RGWSI_SysObj>(cct);
   sysobj_core = std::make_unique<RGWSI_SysObj_Core>(cct);
   user_rados = std::make_unique<RGWSI_User_RADOS>(cct);
+  role_rados = std::make_unique<RGWSI_Role_RADOS>(cct);
 
   if (have_cache) {
     sysobj_cache = std::make_unique<RGWSI_SysObj_Cache>(dpp, cct);
 
   if (have_cache) {
     sysobj_cache = std::make_unique<RGWSI_SysObj_Cache>(dpp, cct);
@@ -113,6 +116,7 @@ int RGWServices_Def::init(CephContext *cct,
   }
   user_rados->init(rados.get(), zone.get(), sysobj.get(), sysobj_cache.get(),
                    meta.get(), meta_be_sobj.get(), sync_modules.get());
   }
   user_rados->init(rados.get(), zone.get(), sysobj.get(), sysobj_cache.get(),
                    meta.get(), meta_be_sobj.get(), sync_modules.get());
+  role_rados->init(zone.get(), meta.get(), meta_be_sobj.get(), sysobj.get());
 
   can_shutdown = true;
 
 
   can_shutdown = true;
 
@@ -244,6 +248,13 @@ int RGWServices_Def::init(CephContext *cct,
       ldpp_dout(dpp, 0) << "ERROR: failed to start otp service (" << cpp_strerror(-r) << dendl;
       return r;
     }
       ldpp_dout(dpp, 0) << "ERROR: failed to start otp service (" << cpp_strerror(-r) << dendl;
       return r;
     }
+
+    r = role_rados->start(y, dpp);
+    if (r < 0) {
+      ldout(cct, 0) << "ERROR: failed to start role_rados service (" << cpp_strerror(-r) << dendl;
+      return r;
+    }
+
   }
 
   /* cache or core services will be started by sysobj */
   }
 
   /* cache or core services will be started by sysobj */
@@ -313,6 +324,7 @@ int RGWServices::do_init(CephContext *_cct, bool have_cache, bool raw, bool run_
   cache = _svc.sysobj_cache.get();
   core = _svc.sysobj_core.get();
   user = _svc.user_rados.get();
   cache = _svc.sysobj_cache.get();
   core = _svc.sysobj_core.get();
   user = _svc.user_rados.get();
+  role = _svc.role_rados.get();
 
   return 0;
 }
 
   return 0;
 }
@@ -344,7 +356,7 @@ RGWCtlDef::_meta::_meta() {}
 RGWCtlDef::_meta::~_meta() {}
 
 
 RGWCtlDef::_meta::~_meta() {}
 
 
-int RGWCtlDef::init(RGWServices& svc, const DoutPrefixProvider *dpp)
+int RGWCtlDef::init(RGWServices& svc, rgw::sal::Store* store, const DoutPrefixProvider *dpp)
 {
   meta.mgr.reset(new RGWMetadataManager(svc.meta));
 
 {
   meta.mgr.reset(new RGWMetadataManager(svc.meta));
 
@@ -360,6 +372,7 @@ int RGWCtlDef::init(RGWServices& svc, const DoutPrefixProvider *dpp)
   }
 
   meta.otp.reset(RGWOTPMetaHandlerAllocator::alloc());
   }
 
   meta.otp.reset(RGWOTPMetaHandlerAllocator::alloc());
+  meta.role = std::make_unique<rgw::sal::RGWRoleMetadataHandler>(store, svc.role);
 
   user.reset(new RGWUserCtl(svc.zone, svc.user, (RGWUserMetadataHandler *)meta.user.get()));
   bucket.reset(new RGWBucketCtl(svc.zone,
 
   user.reset(new RGWUserCtl(svc.zone, svc.user, (RGWUserMetadataHandler *)meta.user.get()));
   bucket.reset(new RGWBucketCtl(svc.zone,
@@ -389,12 +402,12 @@ int RGWCtlDef::init(RGWServices& svc, const DoutPrefixProvider *dpp)
   return 0;
 }
 
   return 0;
 }
 
-int RGWCtl::init(RGWServices *_svc, const DoutPrefixProvider *dpp)
+int RGWCtl::init(RGWServices *_svc, rgw::sal::Store* store, const DoutPrefixProvider *dpp)
 {
   svc = _svc;
   cct = svc->cct;
 
 {
   svc = _svc;
   cct = svc->cct;
 
-  int r = _ctl.init(*svc, dpp);
+  int r = _ctl.init(*svc, store, dpp);
   if (r < 0) {
     ldpp_dout(dpp, 0) << "ERROR: failed to start init ctls (" << cpp_strerror(-r) << dendl;
     return r;
   if (r < 0) {
     ldpp_dout(dpp, 0) << "ERROR: failed to start init ctls (" << cpp_strerror(-r) << dendl;
     return r;
@@ -405,6 +418,7 @@ int RGWCtl::init(RGWServices *_svc, const DoutPrefixProvider *dpp)
   meta.bucket = _ctl.meta.bucket.get();
   meta.bucket_instance = _ctl.meta.bucket_instance.get();
   meta.otp = _ctl.meta.otp.get();
   meta.bucket = _ctl.meta.bucket.get();
   meta.bucket_instance = _ctl.meta.bucket_instance.get();
   meta.otp = _ctl.meta.otp.get();
+  meta.role = _ctl.meta.role.get();
 
   user = _ctl.user.get();
   bucket = _ctl.bucket.get();
 
   user = _ctl.user.get();
   bucket = _ctl.bucket.get();
@@ -434,6 +448,11 @@ int RGWCtl::init(RGWServices *_svc, const DoutPrefixProvider *dpp)
     return r;
   }
 
     return r;
   }
 
+  r = meta.role->attach(meta.mgr);
+  if (r < 0) {
+    ldout(cct, 0) << "ERROR: failed to start init otp ctl (" << cpp_strerror(-r) << dendl;
+    return r;
+  }
   return 0;
 }
 
   return 0;
 }
 
index b94f4cb28c09da0000d01548d51d1898d2dc69c7..83475140d16843501068c2358718431202d75a09 100644 (file)
@@ -75,6 +75,7 @@ class RGWSI_SysObj_Cache;
 class RGWSI_User;
 class RGWSI_User_RADOS;
 class RGWDataChangesLog;
 class RGWSI_User;
 class RGWSI_User_RADOS;
 class RGWDataChangesLog;
+class RGWSI_Role_RADOS;
 
 struct RGWServices_Def
 {
 
 struct RGWServices_Def
 {
@@ -104,6 +105,7 @@ struct RGWServices_Def
   std::unique_ptr<RGWSI_SysObj_Cache> sysobj_cache;
   std::unique_ptr<RGWSI_User_RADOS> user_rados;
   std::unique_ptr<RGWDataChangesLog> datalog_rados;
   std::unique_ptr<RGWSI_SysObj_Cache> sysobj_cache;
   std::unique_ptr<RGWSI_User_RADOS> user_rados;
   std::unique_ptr<RGWDataChangesLog> datalog_rados;
+  std::unique_ptr<RGWSI_Role_RADOS> role_rados;
 
   RGWServices_Def();
   ~RGWServices_Def();
 
   RGWServices_Def();
   ~RGWServices_Def();
@@ -146,6 +148,7 @@ struct RGWServices
   RGWSI_SysObj_Cache *cache{nullptr};
   RGWSI_SysObj_Core *core{nullptr};
   RGWSI_User *user{nullptr};
   RGWSI_SysObj_Cache *cache{nullptr};
   RGWSI_SysObj_Core *core{nullptr};
   RGWSI_User *user{nullptr};
+  RGWSI_Role_RADOS *role{nullptr};
 
   int do_init(CephContext *cct, bool have_cache, bool raw_storage, bool run_sync, optional_yield y, const DoutPrefixProvider *dpp);
 
 
   int do_init(CephContext *cct, bool have_cache, bool raw_storage, bool run_sync, optional_yield y, const DoutPrefixProvider *dpp);
 
@@ -174,6 +177,7 @@ struct RGWCtlDef {
     std::unique_ptr<RGWMetadataHandler> bucket_instance;
     std::unique_ptr<RGWMetadataHandler> user;
     std::unique_ptr<RGWMetadataHandler> otp;
     std::unique_ptr<RGWMetadataHandler> bucket_instance;
     std::unique_ptr<RGWMetadataHandler> user;
     std::unique_ptr<RGWMetadataHandler> otp;
+    std::unique_ptr<RGWMetadataHandler> role;
 
     _meta();
     ~_meta();
 
     _meta();
     ~_meta();
@@ -186,7 +190,7 @@ struct RGWCtlDef {
   RGWCtlDef();
   ~RGWCtlDef();
 
   RGWCtlDef();
   ~RGWCtlDef();
 
-  int init(RGWServices& svc, const DoutPrefixProvider *dpp);
+  int init(RGWServices& svc, rgw::sal::Store* store, const DoutPrefixProvider *dpp);
 };
 
 struct RGWCtl {
 };
 
 struct RGWCtl {
@@ -202,13 +206,14 @@ struct RGWCtl {
     RGWMetadataHandler *bucket_instance{nullptr};
     RGWMetadataHandler *user{nullptr};
     RGWMetadataHandler *otp{nullptr};
     RGWMetadataHandler *bucket_instance{nullptr};
     RGWMetadataHandler *user{nullptr};
     RGWMetadataHandler *otp{nullptr};
+    RGWMetadataHandler *role{nullptr};
   } meta;
 
   RGWUserCtl *user{nullptr};
   RGWBucketCtl *bucket{nullptr};
   RGWOTPCtl *otp{nullptr};
 
   } meta;
 
   RGWUserCtl *user{nullptr};
   RGWBucketCtl *bucket{nullptr};
   RGWOTPCtl *otp{nullptr};
 
-  int init(RGWServices *_svc, const DoutPrefixProvider *dpp);
+  int init(RGWServices *_svc, rgw::sal::Store* store, const DoutPrefixProvider *dpp);
 };
 
 #endif
 };
 
 #endif
index 86a72d1740f9aac5d147ac05ad00af8c03e1353c..bcf2bc230b38892aa03508c717ad56e9d61717df 100644 (file)
@@ -876,6 +876,7 @@ public:
     append_section_from_set(all_sections, "user");
     append_section_from_set(all_sections, "bucket.instance");
     append_section_from_set(all_sections, "bucket");
     append_section_from_set(all_sections, "user");
     append_section_from_set(all_sections, "bucket.instance");
     append_section_from_set(all_sections, "bucket");
+    append_section_from_set(all_sections, "roles");
 
     std::move(all_sections.begin(), all_sections.end(),
               std::back_inserter(sections));
 
     std::move(all_sections.begin(), all_sections.end(),
               std::back_inserter(sections));
index dc29cfa857ec0b1b71d978fd7a938efcc2ac5aea..8d6b69e0e9962a46323049513db353485b94f353 100644 (file)
@@ -197,6 +197,7 @@ string RGWSyncTraceManager::get_active_names()
 }
 
 int RGWSyncTraceManager::call(std::string_view command, const cmdmap_t& cmdmap,
 }
 
 int RGWSyncTraceManager::call(std::string_view command, const cmdmap_t& cmdmap,
+                             const bufferlist&,
                              Formatter *f,
                              std::ostream& ss,
                              bufferlist& out) {
                              Formatter *f,
                              std::ostream& ss,
                              bufferlist& out) {
index e66dde7cf41aa5a02266d32829e43f0246fc9cfd..9617dac70dbc9a1ca9453555914b5e022f7cc374 100644 (file)
@@ -134,6 +134,7 @@ public:
 
   int hook_to_admin_command();
   int call(std::string_view command, const cmdmap_t& cmdmap,
 
   int hook_to_admin_command();
   int call(std::string_view command, const cmdmap_t& cmdmap,
+          const bufferlist&,
           Formatter *f,
           std::ostream& ss,
           bufferlist& out) override;
           Formatter *f,
           std::ostream& ss,
           bufferlist& out) override;
index ed0f872108ef1ca5db6566e98ef29c36b3396b06..c383d08393888d73163c60f43ad7457711aa7d08 100644 (file)
@@ -169,6 +169,21 @@ int rgw_put_system_obj(const DoutPrefixProvider *dpp,
   return ret;
 }
 
   return ret;
 }
 
+int rgw_stat_system_obj(const DoutPrefixProvider *dpp,
+      RGWSysObjectCtx& obj_ctx, const rgw_pool& pool,
+                       const std::string& key, RGWObjVersionTracker *objv_tracker,
+                       real_time *pmtime, optional_yield y,
+                       std::map<std::string, bufferlist> *pattrs)
+{
+  rgw_raw_obj obj(pool, key);
+  auto sysobj = obj_ctx.get_obj(obj);
+  return sysobj.rop()
+               .set_attrs(pattrs)
+               .set_last_mod(pmtime)
+               .stat(y, dpp);
+}
+
+
 int rgw_get_system_obj(RGWSysObjectCtx& obj_ctx, const rgw_pool& pool, const string& key, bufferlist& bl,
                        RGWObjVersionTracker *objv_tracker, real_time *pmtime, optional_yield y, const DoutPrefixProvider *dpp, map<string, bufferlist> *pattrs,
                        rgw_cache_entry_info *cache_info,
 int rgw_get_system_obj(RGWSysObjectCtx& obj_ctx, const rgw_pool& pool, const string& key, bufferlist& bl,
                        RGWObjVersionTracker *objv_tracker, real_time *pmtime, optional_yield y, const DoutPrefixProvider *dpp, map<string, bufferlist> *pattrs,
                        rgw_cache_entry_info *cache_info,
index b842916fd876781ad0b970402ef81c0c0ec800c0..1beaad396f0a37f9e168bb1dfee5b43ddb49ba7a 100644 (file)
@@ -81,6 +81,11 @@ int rgw_get_system_obj(RGWSysObjectCtx& obj_ctx, const rgw_pool& pool, const std
 int rgw_delete_system_obj(const DoutPrefixProvider *dpp, 
                           RGWSI_SysObj *sysobj_svc, const rgw_pool& pool, const std::string& oid,
                           RGWObjVersionTracker *objv_tracker, optional_yield y);
 int rgw_delete_system_obj(const DoutPrefixProvider *dpp, 
                           RGWSI_SysObj *sysobj_svc, const rgw_pool& pool, const std::string& oid,
                           RGWObjVersionTracker *objv_tracker, optional_yield y);
+int rgw_stat_system_obj(const DoutPrefixProvider *dpp,
+                        RGWSysObjectCtx& obj_Ctx, const rgw_pool& pool,
+                        const std::string& key, RGWObjVersionTracker *objv_tracker,
+                        real_time *pmtime, optional_yield y,
+                        std::map<std::string, bufferlist> *pattrs = nullptr);
 
 const char *rgw_find_mime_by_ext(std::string& ext);
 
 
 const char *rgw_find_mime_by_ext(std::string& ext);
 
index 3db58af7e9501fc6084ede03601060ad85f0da23..28eaed66bd0216a524960e27dd6c7c4aa464b3da 100644 (file)
@@ -1690,7 +1690,8 @@ int RGWUser::execute_rename(const DoutPrefixProvider *dpp, RGWUserAdminOpState&
         return ret;
       }
 
         return ret;
       }
 
-      ret = bucket->chown(dpp, new_user.get(), old_user.get(), y);
+      ret = rgw_chown_bucket_and_objects(store, bucket.get(), new_user.get(),
+                                        std::string(), nullptr, dpp, y);
       if (ret < 0) {
         set_err_msg(err_msg, "failed to run bucket chown" + cpp_strerror(-ret));
         return ret;
       if (ret < 0) {
         set_err_msg(err_msg, "failed to run bucket chown" + cpp_strerror(-ret));
         return ret;
index c8e8d09b8879a66adb8548e56b5138fa8627db8c..bbeea7efb84e1e1ad39c1d361e412e697de48466 100644 (file)
@@ -2607,6 +2607,7 @@ void RGWZonePlacementInfo::dump(Formatter *f) const
   encode_json("storage_classes", storage_classes, f);
   encode_json("data_extra_pool", data_extra_pool, f);
   encode_json("index_type", (uint32_t)index_type, f);
   encode_json("storage_classes", storage_classes, f);
   encode_json("data_extra_pool", data_extra_pool, f);
   encode_json("index_type", (uint32_t)index_type, f);
+  encode_json("inline_data", inline_data, f);
 
   /* no real need for backward compatibility of compression_type and data_pool in here,
    * rather not clutter the output */
 
   /* no real need for backward compatibility of compression_type and data_pool in here,
    * rather not clutter the output */
@@ -2619,6 +2620,7 @@ void RGWZonePlacementInfo::decode_json(JSONObj *obj)
   JSONDecoder::decode_json("data_extra_pool", data_extra_pool, obj);
   uint32_t it;
   JSONDecoder::decode_json("index_type", it, obj);
   JSONDecoder::decode_json("data_extra_pool", data_extra_pool, obj);
   uint32_t it;
   JSONDecoder::decode_json("index_type", it, obj);
+  JSONDecoder::decode_json("inline_data", inline_data, obj);
   index_type = (rgw::BucketIndexType)it;
 
   /* backward compatibility, these are now defined in storage_classes */
   index_type = (rgw::BucketIndexType)it;
 
   /* backward compatibility, these are now defined in storage_classes */
index 9e89cbf150a72183210415177d332757ba158b4e..f8ddcec5bda51f8a1285798467a0ce93f87fedfc 100644 (file)
@@ -275,11 +275,12 @@ struct RGWZonePlacementInfo {
   rgw_pool data_extra_pool; /* if not set we should use data_pool */
   RGWZoneStorageClasses storage_classes;
   rgw::BucketIndexType index_type;
   rgw_pool data_extra_pool; /* if not set we should use data_pool */
   RGWZoneStorageClasses storage_classes;
   rgw::BucketIndexType index_type;
+  bool inline_data;
 
 
-  RGWZonePlacementInfo() : index_type(rgw::BucketIndexType::Normal) {}
+  RGWZonePlacementInfo() : index_type(rgw::BucketIndexType::Normal), inline_data(true) {}
 
   void encode(bufferlist& bl) const {
 
   void encode(bufferlist& bl) const {
-    ENCODE_START(7, 1, bl);
+    ENCODE_START(8, 1, bl);
     encode(index_pool.to_str(), bl);
     rgw_pool standard_data_pool = get_data_pool(RGW_STORAGE_CLASS_STANDARD);
     encode(standard_data_pool.to_str(), bl);
     encode(index_pool.to_str(), bl);
     rgw_pool standard_data_pool = get_data_pool(RGW_STORAGE_CLASS_STANDARD);
     encode(standard_data_pool.to_str(), bl);
@@ -288,11 +289,12 @@ struct RGWZonePlacementInfo {
     std::string standard_compression_type = get_compression_type(RGW_STORAGE_CLASS_STANDARD);
     encode(standard_compression_type, bl);
     encode(storage_classes, bl);
     std::string standard_compression_type = get_compression_type(RGW_STORAGE_CLASS_STANDARD);
     encode(standard_compression_type, bl);
     encode(storage_classes, bl);
+    encode(inline_data, bl);
     ENCODE_FINISH(bl);
   }
 
   void decode(bufferlist::const_iterator& bl) {
     ENCODE_FINISH(bl);
   }
 
   void decode(bufferlist::const_iterator& bl) {
-    DECODE_START(7, bl);
+    DECODE_START(8, bl);
     std::string index_pool_str;
     std::string data_pool_str;
     decode(index_pool_str, bl);
     std::string index_pool_str;
     std::string data_pool_str;
     decode(index_pool_str, bl);
@@ -319,6 +321,9 @@ struct RGWZonePlacementInfo {
       storage_classes.set_storage_class(RGW_STORAGE_CLASS_STANDARD, &standard_data_pool,
                                         (!standard_compression_type.empty() ? &standard_compression_type : nullptr));
     }
       storage_classes.set_storage_class(RGW_STORAGE_CLASS_STANDARD, &standard_data_pool,
                                         (!standard_compression_type.empty() ? &standard_compression_type : nullptr));
     }
+    if (struct_v >= 8) {
+      decode(inline_data, bl);
+    }
     DECODE_FINISH(bl);
   }
   const rgw_pool& get_data_extra_pool() const {
     DECODE_FINISH(bl);
   }
   const rgw_pool& get_data_extra_pool() const {
index 5037ae536277d117f0b123d1f976f9a7c5841c1e..9d030e3148113549ecd349f8cc44cc11de99abc6 100644 (file)
@@ -115,9 +115,10 @@ int RGWSI_MetaBackend::get(Context *ctx,
                           GetParams& params,
                           RGWObjVersionTracker *objv_tracker,
                            optional_yield y,
                           GetParams& params,
                           RGWObjVersionTracker *objv_tracker,
                            optional_yield y,
-                           const DoutPrefixProvider *dpp)
+                           const DoutPrefixProvider *dpp,
+                           bool get_raw_attrs)
 {
 {
-  return get_entry(ctx, key, params, objv_tracker, y, dpp);
+  return get_entry(ctx, key, params, objv_tracker, y, dpp, get_raw_attrs);
 }
 
 int RGWSI_MetaBackend::put(Context *ctx,
 }
 
 int RGWSI_MetaBackend::put(Context *ctx,
index 79f0a4aa1ae8ed5e1ee4556c1a766864117b1178..b2b5784f6ba6fec708035bc0d65011f9a9984441 100644 (file)
@@ -145,7 +145,8 @@ public:
                         RGWSI_MetaBackend::GetParams& params,
                         RGWObjVersionTracker *objv_tracker,
                         optional_yield y,
                         RGWSI_MetaBackend::GetParams& params,
                         RGWObjVersionTracker *objv_tracker,
                         optional_yield y,
-                        const DoutPrefixProvider *dpp) = 0;
+                        const DoutPrefixProvider *dpp,
+                        bool get_raw_attrs=false) = 0;
   virtual int put_entry(const DoutPrefixProvider *dpp, 
                         RGWSI_MetaBackend::Context *ctx,
                         const std::string& key,
   virtual int put_entry(const DoutPrefixProvider *dpp, 
                         RGWSI_MetaBackend::Context *ctx,
                         const std::string& key,
@@ -184,7 +185,8 @@ public:
                   GetParams &params,
                   RGWObjVersionTracker *objv_tracker,
                   optional_yield y,
                   GetParams &params,
                   RGWObjVersionTracker *objv_tracker,
                   optional_yield y,
-                  const DoutPrefixProvider *dpp);
+                  const DoutPrefixProvider *dpp,
+                  bool get_raw_attrs=false);
 
   virtual int put(Context *ctx,
                   const std::string& key,
 
   virtual int put(Context *ctx,
                   const std::string& key,
index e8c8b7864d143e97c1d512b09ac037819c9d669a..bc5db46145551f5cc49d8dc5904ab0af774574a6 100644 (file)
@@ -46,7 +46,8 @@ int RGWSI_MetaBackend_OTP::get_entry(RGWSI_MetaBackend::Context *_ctx,
                                      RGWSI_MetaBackend::GetParams& _params,
                                      RGWObjVersionTracker *objv_tracker,
                                      optional_yield y,
                                      RGWSI_MetaBackend::GetParams& _params,
                                      RGWObjVersionTracker *objv_tracker,
                                      optional_yield y,
-                                     const DoutPrefixProvider *dpp)
+                                     const DoutPrefixProvider *dpp,
+                                     bool get_raw_attrs)
 {
   RGWSI_MBOTP_GetParams& params = static_cast<RGWSI_MBOTP_GetParams&>(_params);
 
 {
   RGWSI_MBOTP_GetParams& params = static_cast<RGWSI_MBOTP_GetParams&>(_params);
 
index 52ea66b337359b8a45cd17f7566473940623a0bc..fc17d761fcd2f50ebf86e7f0da77bc0970fbd225 100644 (file)
@@ -78,7 +78,8 @@ public:
                 RGWSI_MetaBackend::GetParams& _params,
                 RGWObjVersionTracker *objv_tracker,
                 optional_yield y,
                 RGWSI_MetaBackend::GetParams& _params,
                 RGWObjVersionTracker *objv_tracker,
                 optional_yield y,
-                const DoutPrefixProvider *dpp);
+                const DoutPrefixProvider *dpp,
+                bool get_raw_attrs=false);
   int put_entry(const DoutPrefixProvider *dpp, 
                 RGWSI_MetaBackend::Context *ctx,
                 const std::string& key,
   int put_entry(const DoutPrefixProvider *dpp, 
                 RGWSI_MetaBackend::Context *ctx,
                 const std::string& key,
index 6c06182af477f7431385121faa081a1e7bc89907..208f6045f588efce9799cb70dd2142ebade52149 100644 (file)
@@ -143,7 +143,8 @@ int RGWSI_MetaBackend_SObj::get_entry(RGWSI_MetaBackend::Context *_ctx,
                                       GetParams& _params,
                                       RGWObjVersionTracker *objv_tracker,
                                       optional_yield y,
                                       GetParams& _params,
                                       RGWObjVersionTracker *objv_tracker,
                                       optional_yield y,
-                                      const DoutPrefixProvider *dpp)
+                                      const DoutPrefixProvider *dpp,
+                                      bool get_raw_attrs)
 {
   RGWSI_MetaBackend_SObj::Context_SObj *ctx = static_cast<RGWSI_MetaBackend_SObj::Context_SObj *>(_ctx);
   RGWSI_MBSObj_GetParams& params = static_cast<RGWSI_MBSObj_GetParams&>(_params);
 {
   RGWSI_MetaBackend_SObj::Context_SObj *ctx = static_cast<RGWSI_MetaBackend_SObj::Context_SObj *>(_ctx);
   RGWSI_MBSObj_GetParams& params = static_cast<RGWSI_MBSObj_GetParams&>(_params);
@@ -152,11 +153,14 @@ int RGWSI_MetaBackend_SObj::get_entry(RGWSI_MetaBackend::Context *_ctx,
   string oid;
   ctx->module->get_pool_and_oid(key, &pool, &oid);
 
   string oid;
   ctx->module->get_pool_and_oid(key, &pool, &oid);
 
-  return rgw_get_system_obj(*ctx->obj_ctx, pool, oid, *params.pbl,
+  int ret = 0;
+  ret = rgw_get_system_obj(*ctx->obj_ctx, pool, oid, *params.pbl,
                             objv_tracker, params.pmtime,
                             y, dpp,
                             params.pattrs, params.cache_info,
                             objv_tracker, params.pmtime,
                             y, dpp,
                             params.pattrs, params.cache_info,
-                            params.refresh_version);
+                            params.refresh_version, get_raw_attrs);
+
+  return ret;
 }
 
 int RGWSI_MetaBackend_SObj::put_entry(const DoutPrefixProvider *dpp, 
 }
 
 int RGWSI_MetaBackend_SObj::put_entry(const DoutPrefixProvider *dpp, 
index 8183617d437b0bfc9b9de502fdafb5648485e11b..fe3230ec8d979c99915ff68696415012ddf5b764 100644 (file)
@@ -151,7 +151,8 @@ public:
                 RGWSI_MetaBackend::GetParams& params,
                 RGWObjVersionTracker *objv_tracker,
                 optional_yield y,
                 RGWSI_MetaBackend::GetParams& params,
                 RGWObjVersionTracker *objv_tracker,
                 optional_yield y,
-                const DoutPrefixProvider *dpp) override;
+                const DoutPrefixProvider *dpp,
+                bool get_raw_attrs=false) override;
   int put_entry(const DoutPrefixProvider *dpp, 
                 RGWSI_MetaBackend::Context *ctx,
                 const std::string& key,
   int put_entry(const DoutPrefixProvider *dpp, 
                 RGWSI_MetaBackend::Context *ctx,
                 const std::string& key,
diff --git a/ceph/src/rgw/services/svc_role_rados.cc b/ceph/src/rgw/services/svc_role_rados.cc
new file mode 100644 (file)
index 0000000..a840224
--- /dev/null
@@ -0,0 +1,82 @@
+#include "svc_role_rados.h"
+#include "svc_meta_be_sobj.h"
+#include "svc_meta.h"
+#include "rgw_role.h"
+#include "rgw_zone.h"
+#include "svc_zone.h"
+#include "rgw_tools.h"
+
+#define dout_subsys ceph_subsys_rgw
+
+class RGWSI_Role_Module : public RGWSI_MBSObj_Handler_Module {
+  RGWSI_Role_RADOS::Svc& svc;
+  const std::string prefix;
+public:
+  RGWSI_Role_Module(RGWSI_Role_RADOS::Svc& _svc): RGWSI_MBSObj_Handler_Module("roles"),
+                                                  svc(_svc),
+                                                  prefix(role_oid_prefix) {}
+
+  void get_pool_and_oid(const std::string& key,
+                        rgw_pool *pool,
+                        std::string *oid) override
+  {
+    if (pool) {
+      *pool = svc.zone->get_zone_params().roles_pool;
+    }
+
+    if (oid) {
+      *oid = key_to_oid(key);
+    }
+  }
+
+  bool is_valid_oid(const std::string& oid) override {
+    return boost::algorithm::starts_with(oid, prefix);
+  }
+
+  std::string key_to_oid(const std::string& key) override {
+    return prefix + key;
+  }
+
+  // This is called after `is_valid_oid` and is assumed to be a valid oid
+  std::string oid_to_key(const std::string& oid) override {
+    return oid.substr(prefix.size());
+  }
+
+  const std::string& get_oid_prefix() {
+    return prefix;
+  }
+};
+
+RGWSI_MetaBackend_Handler* RGWSI_Role_RADOS::get_be_handler()
+{
+  return be_handler;
+}
+
+void RGWSI_Role_RADOS::init(RGWSI_Zone *_zone_svc,
+                            RGWSI_Meta *_meta_svc,
+                            RGWSI_MetaBackend *_meta_be_svc,
+                            RGWSI_SysObj *_sysobj_svc)
+{
+  svc.zone = _zone_svc;
+  svc.meta = _meta_svc;
+  svc.meta_be = _meta_be_svc;
+  svc.sysobj = _sysobj_svc;
+}
+
+int RGWSI_Role_RADOS::do_start(optional_yield y, const DoutPrefixProvider *dpp)
+{
+
+  int r = svc.meta->create_be_handler(RGWSI_MetaBackend::Type::MDBE_SOBJ,
+                                      &be_handler);
+  if (r < 0) {
+    ldout(ctx(), 0) << "ERROR: failed to create be_handler for Roles: r="
+                    << r <<dendl;
+    return r;
+  }
+
+  auto module = new RGWSI_Role_Module(svc);
+  RGWSI_MetaBackend_Handler_SObj* bh= static_cast<RGWSI_MetaBackend_Handler_SObj *>(be_handler);
+  be_module.reset(module);
+  bh->set_module(module);
+  return 0;
+}
diff --git a/ceph/src/rgw/services/svc_role_rados.h b/ceph/src/rgw/services/svc_role_rados.h
new file mode 100644 (file)
index 0000000..6acfc2f
--- /dev/null
@@ -0,0 +1,50 @@
+// -*- mode:C++; tab-width:8; c-basic-offset:2; indent-tabs-mode:t -*-
+// vim: ts=8 sw=2 smarttab ft=cpp
+
+/*
+ * Ceph - scalable distributed file system
+ *
+ * Copyright (C) 2020 SUSE LLC
+ *
+ * This is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License version 2.1, as published by the Free Software
+ * Foundation. See file COPYING.
+ *
+ */
+
+#pragma once
+
+#include "rgw/rgw_service.h"
+#include "rgw/rgw_role.h"
+#include "svc_meta_be.h"
+
+class RGWSI_Role_RADOS: public RGWServiceInstance
+{
+ public:
+  struct Svc {
+    RGWSI_Zone *zone{nullptr};
+    RGWSI_Meta *meta{nullptr};
+    RGWSI_MetaBackend *meta_be{nullptr};
+    RGWSI_SysObj *sysobj{nullptr};
+  } svc;
+
+  RGWSI_Role_RADOS(CephContext *cct) : RGWServiceInstance(cct) {}
+  ~RGWSI_Role_RADOS() {}
+
+  void init(RGWSI_Zone *_zone_svc,
+           RGWSI_Meta *_meta_svc,
+           RGWSI_MetaBackend *_meta_be_svc,
+           RGWSI_SysObj *_sysobj_svc);
+
+  RGWSI_MetaBackend_Handler * get_be_handler();
+  int do_start(optional_yield y, const DoutPrefixProvider *dpp) override;
+
+private:
+  RGWSI_MetaBackend_Handler *be_handler;
+  std::unique_ptr<RGWSI_MetaBackend::Module> be_module;
+};
+
+static const std::string role_name_oid_prefix = "role_names.";
+static const std::string role_oid_prefix = "roles.";
+static const std::string role_path_oid_prefix = "role_paths.";
\ No newline at end of file
index 3453f43e16ad1b0c0e0be5f9d59cad63ead29012..e7c595bd2a81f358283a9c756e6dc51c5a0e5ee7 100644 (file)
@@ -527,6 +527,7 @@ public:
     void shutdown();
 
     int call(std::string_view command, const cmdmap_t& cmdmap,
     void shutdown();
 
     int call(std::string_view command, const cmdmap_t& cmdmap,
+            const bufferlist&,
             Formatter *f,
             std::ostream& ss,
             bufferlist& out) override;
             Formatter *f,
             std::ostream& ss,
             bufferlist& out) override;
@@ -554,6 +555,7 @@ void RGWSI_SysObj_Cache_ASocketHook::shutdown()
 
 int RGWSI_SysObj_Cache_ASocketHook::call(
   std::string_view command, const cmdmap_t& cmdmap,
 
 int RGWSI_SysObj_Cache_ASocketHook::call(
   std::string_view command, const cmdmap_t& cmdmap,
+  const bufferlist&,
   Formatter *f,
   std::ostream& ss,
   bufferlist& out)
   Formatter *f,
   std::ostream& ss,
   bufferlist& out)
index b2f8f9665e0929ce4d4560a3a4b37c9f5f5323d8..88dfca285a7c7bba346749d200ecbdf722ae1ae4 100644 (file)
@@ -973,7 +973,6 @@ int RGWSI_User_RADOS::read_stats_async(const DoutPrefixProvider *dpp, RGWSI_Meta
   RGWGetUserStatsContext *cb = new RGWGetUserStatsContext(_cb);
   int r = cls_user_get_header_async(dpp, user_str, cb);
   if (r < 0) {
   RGWGetUserStatsContext *cb = new RGWGetUserStatsContext(_cb);
   int r = cls_user_get_header_async(dpp, user_str, cb);
   if (r < 0) {
-    _cb->put();
     delete cb;
     return r;
   }
     delete cb;
     return r;
   }
index 8a981573a5fdb286ec8b617caef126c782a4c9c7..16f026fffd115ecd42fcbff2bc3fd4b4803981ec 100755 (executable)
@@ -9,7 +9,7 @@ if [ ! -e Makefile ] && [ ! -e build.ninja ] || [ ! -e ../do_cmake.sh ]; then
     exit 1
 fi
 
     exit 1
 fi
 
-base="quay.ceph.io/ceph-ci/ceph:master"
+base="quay.ceph.io/ceph-ci/ceph:main"
 target=""
 push=0
 strip=1
 target=""
 push=0
 strip=1
index 54c49970ebc6772929ae29feb51bed9a3661fafd..ebee8e5c82898ac75e7dcf78eb730bdd2e2c087e 100644 (file)
@@ -37,7 +37,6 @@ if(NOT WIN32)
   # libcls_* dependencies cascade to osd, kv and other libs that are not
   # available on Windows yet.
   add_subdirectory(cls_hello)
   # libcls_* dependencies cascade to osd, kv and other libs that are not
   # available on Windows yet.
   add_subdirectory(cls_hello)
-  add_subdirectory(cls_fifo)
   add_subdirectory(cls_cas)
   add_subdirectory(cls_lock)
   add_subdirectory(cls_log)
   add_subdirectory(cls_cas)
   add_subdirectory(cls_lock)
   add_subdirectory(cls_log)
index 69bbcedb3cd4af8a2ac52be2c4d965e02f2ddc96..369e7abbf9b6e565f553475e28b8462e7f31a9d5 100644 (file)
@@ -118,6 +118,7 @@ TEST(AdminSocket, SendTooLongRequest) {
 
 class MyTest : public AdminSocketHook {
   int call(std::string_view command, const cmdmap_t& cmdmap,
 
 class MyTest : public AdminSocketHook {
   int call(std::string_view command, const cmdmap_t& cmdmap,
+          const bufferlist&,
           Formatter *f,
           std::ostream& ss,
           bufferlist& result) override {
           Formatter *f,
           std::ostream& ss,
           bufferlist& result) override {
@@ -153,6 +154,7 @@ TEST(AdminSocket, RegisterCommand) {
 
 class MyTest2 : public AdminSocketHook {
   int call(std::string_view command, const cmdmap_t& cmdmap,
 
 class MyTest2 : public AdminSocketHook {
   int call(std::string_view command, const cmdmap_t& cmdmap,
+          const bufferlist&,
           Formatter *f,
           std::ostream& ss,
           bufferlist& result) override {
           Formatter *f,
           std::ostream& ss,
           bufferlist& result) override {
@@ -210,6 +212,7 @@ public:
   BlockingHook() = default;
 
   int call(std::string_view command, const cmdmap_t& cmdmap,
   BlockingHook() = default;
 
   int call(std::string_view command, const cmdmap_t& cmdmap,
+          const bufferlist&,
           Formatter *f,
           std::ostream& ss,
           bufferlist& result) override {
           Formatter *f,
           std::ostream& ss,
           bufferlist& result) override {
index 6784b966ca4451939bc1f2f3dacf2182cda8218e..f6ba9650fddd6e5fbb478249c4550dd61f262e85 100644 (file)
      --data-extra-pool=<pool>  placement target data extra (non-ec) pool
      --placement-index-type=<type>
                                placement target index type (normal, indexless, or #id)
      --data-extra-pool=<pool>  placement target data extra (non-ec) pool
      --placement-index-type=<type>
                                placement target index type (normal, indexless, or #id)
+     --placement-inline-data=<true>
+                               set whether the placement target is configured to store a data
+                               chunk inline in head objects
      --compression=<type>      placement target compression type (plugin name or empty/none)
      --tier-type=<type>        zone tier type
      --tier-config=<k>=<v>[,...]
      --compression=<type>      placement target compression type (plugin name or empty/none)
      --tier-type=<type>        zone tier type
      --tier-config=<k>=<v>[,...]
index 59de21c03661939f1fff54dc5739c426d6c6a482..e8b2c0db21d6f487cf6446230cba5f7f3c81c4c6 100644 (file)
                            [--snap <snap>] --device <device> [--show-cookie] 
                            [--cookie <cookie>] [--read-only] [--force] 
                            [--exclusive] [--quiesce] 
                            [--snap <snap>] --device <device> [--show-cookie] 
                            [--cookie <cookie>] [--read-only] [--force] 
                            [--exclusive] [--quiesce] 
-                           [--quiesce-hook <quiesce-hook>] [--options <options>] 
+                           [--quiesce-hook <quiesce-hook>] [--snap-id <snap-id>] 
+                           [--options <options>] 
                            <image-or-snap-spec> 
   
   Attach image to device.
                            <image-or-snap-spec> 
   
   Attach image to device.
     --exclusive              disable automatic exclusive lock transitions
     --quiesce                use quiesce hooks
     --quiesce-hook arg       quiesce hook path
     --exclusive              disable automatic exclusive lock transitions
     --quiesce                use quiesce hooks
     --quiesce-hook arg       quiesce hook path
+    --snap-id arg            snapshot id
     -o [ --options ] arg     device specific options
   
   rbd help device detach
   usage: rbd device detach [--device-type <device-type>] [--pool <pool>] 
     -o [ --options ] arg     device specific options
   
   rbd help device detach
   usage: rbd device detach [--device-type <device-type>] [--pool <pool>] 
-                           [--image <image>] [--snap <snap>] 
+                           [--namespace <namespace>] [--image <image>] 
+                           [--snap <snap>] [--snap-id <snap-id>] 
                            [--options <options>] 
                            <image-or-snap-or-device-spec> 
   
                            [--options <options>] 
                            <image-or-snap-or-device-spec> 
   
   
   Positional arguments
     <image-or-snap-or-device-spec>  image, snapshot, or device specification
   
   Positional arguments
     <image-or-snap-or-device-spec>  image, snapshot, or device specification
-                                    [<pool-name>/]<image-name>[@<snap-name>] or
-                                    <device-path>
+                                    [<pool-name>/[<namespace>/]]<image-name>[@<sna
+                                    p-name>] or <device-path>
   
   Optional arguments
     -t [ --device-type ] arg        device type [ggate, krbd (default), nbd]
     -p [ --pool ] arg               pool name
   
   Optional arguments
     -t [ --device-type ] arg        device type [ggate, krbd (default), nbd]
     -p [ --pool ] arg               pool name
+    --namespace arg                 namespace name
     --image arg                     image name
     --snap arg                      snapshot name
     --image arg                     image name
     --snap arg                      snapshot name
+    --snap-id arg                   snapshot id
     -o [ --options ] arg            device specific options
   
   rbd help device list
     -o [ --options ] arg            device specific options
   
   rbd help device list
                         [--namespace <namespace>] [--image <image>] 
                         [--snap <snap>] [--show-cookie] [--cookie <cookie>] 
                         [--read-only] [--exclusive] [--quiesce] 
                         [--namespace <namespace>] [--image <image>] 
                         [--snap <snap>] [--show-cookie] [--cookie <cookie>] 
                         [--read-only] [--exclusive] [--quiesce] 
-                        [--quiesce-hook <quiesce-hook>] [--options <options>] 
+                        [--quiesce-hook <quiesce-hook>] [--snap-id <snap-id>] 
+                        [--options <options>] 
                         <image-or-snap-spec> 
   
   Map an image to a block device.
                         <image-or-snap-spec> 
   
   Map an image to a block device.
     --exclusive              disable automatic exclusive lock transitions
     --quiesce                use quiesce hooks
     --quiesce-hook arg       quiesce hook path
     --exclusive              disable automatic exclusive lock transitions
     --quiesce                use quiesce hooks
     --quiesce-hook arg       quiesce hook path
+    --snap-id arg            snapshot id
     -o [ --options ] arg     device specific options
   
   rbd help device unmap
   usage: rbd device unmap [--device-type <device-type>] [--pool <pool>] 
     -o [ --options ] arg     device specific options
   
   rbd help device unmap
   usage: rbd device unmap [--device-type <device-type>] [--pool <pool>] 
-                          [--image <image>] [--snap <snap>] [--options <options>] 
+                          [--namespace <namespace>] [--image <image>] 
+                          [--snap <snap>] [--snap-id <snap-id>] 
+                          [--options <options>] 
                           <image-or-snap-or-device-spec> 
   
   Unmap a rbd device.
   
   Positional arguments
     <image-or-snap-or-device-spec>  image, snapshot, or device specification
                           <image-or-snap-or-device-spec> 
   
   Unmap a rbd device.
   
   Positional arguments
     <image-or-snap-or-device-spec>  image, snapshot, or device specification
-                                    [<pool-name>/]<image-name>[@<snap-name>] or
-                                    <device-path>
+                                    [<pool-name>/[<namespace>/]]<image-name>[@<sna
+                                    p-name>] or <device-path>
   
   Optional arguments
     -t [ --device-type ] arg        device type [ggate, krbd (default), nbd]
     -p [ --pool ] arg               pool name
   
   Optional arguments
     -t [ --device-type ] arg        device type [ggate, krbd (default), nbd]
     -p [ --pool ] arg               pool name
+    --namespace arg                 namespace name
     --image arg                     image name
     --snap arg                      snapshot name
     --image arg                     image name
     --snap arg                      snapshot name
+    --snap-id arg                   snapshot id
     -o [ --options ] arg            device specific options
   
   rbd help diff
     -o [ --options ] arg            device specific options
   
   rbd help diff
index 66d403c7e9e5361bd18485cf20d004ec011a533f..1937bdd0b55423d63adcaa39dfeea3f6e39fedbb 100644 (file)
@@ -2,6 +2,7 @@ if(${WITH_CEPHFS})
   add_executable(ceph_test_client
     main.cc
     alternate_name.cc
   add_executable(ceph_test_client
     main.cc
     alternate_name.cc
+    ops.cc
     )
   target_link_libraries(ceph_test_client
     client
     )
   target_link_libraries(ceph_test_client
     client
index e1c0199b3105b70603eb502285e000db60ece143..bf3b274af603ebdfdd4d666f0fb7bcef155a4571 100644 (file)
 #include "msg/Messenger.h"
 #include "mon/MonClient.h"
 #include "osdc/ObjectCacher.h"
 #include "msg/Messenger.h"
 #include "mon/MonClient.h"
 #include "osdc/ObjectCacher.h"
-
+#include "client/MetaRequest.h"
 #include "client/Client.h"
 #include "client/Client.h"
+#include "messages/MClientReclaim.h"
+#include "messages/MClientSession.h"
+#include "common/async/blocked_completion.h"
+
+#define dout_subsys ceph_subsys_client
+
+namespace bs = boost::system;
+namespace ca = ceph::async;
+
+class ClientScaffold : public Client {  
+public:
+    ClientScaffold(Messenger *m, MonClient *mc, Objecter *objecter_) : Client(m, mc, objecter_) {}
+    virtual ~ClientScaffold()
+    { }
+    int check_dummy_op(const UserPerm& perms){
+      RWRef_t mref_reader(mount_state, CLIENT_MOUNTING);
+      if (!mref_reader.is_state_satisfied()) {
+        return -CEPHFS_ENOTCONN;
+      }
+      std::scoped_lock l(client_lock);
+      MetaRequest *req = new MetaRequest(CEPH_MDS_OP_DUMMY);
+      int res = make_request(req, perms);
+      ldout(cct, 10) << __func__ << " result=" << res << dendl;
+      return res;
+    }
+    int send_unknown_session_op(int op) {
+      RWRef_t mref_reader(mount_state, CLIENT_MOUNTING);
+      if (!mref_reader.is_state_satisfied()) {
+        return -CEPHFS_ENOTCONN;
+      }
+      std::scoped_lock l(client_lock);
+      auto session = _get_or_open_mds_session(0);
+      auto msg = make_message<MClientSession>(op, session->seq);
+      int res = session->con->send_message2(std::move(msg));
+      ldout(cct, 10) << __func__ << " result=" << res << dendl;
+      return res;
+    }
+    bool check_client_blocklisted() {
+      RWRef_t mref_reader(mount_state, CLIENT_MOUNTING);
+      if (!mref_reader.is_state_satisfied()) {
+        return -CEPHFS_ENOTCONN;
+      }
+      std::scoped_lock l(client_lock);
+      bs::error_code ec;
+      ldout(cct, 20) << __func__ << ": waiting for latest osdmap" << dendl;
+      objecter->wait_for_latest_osdmap(ca::use_blocked[ec]);
+      ldout(cct, 20) << __func__ << ": got latest osdmap: " << ec << dendl;
+      const auto myaddrs = messenger->get_myaddrs();
+      return objecter->with_osdmap([&](const OSDMap& o) {return o.is_blocklisted(myaddrs);});
+    }
+    bool check_unknown_reclaim_flag(uint32_t flag) {
+      RWRef_t mref_reader(mount_state, CLIENT_MOUNTING);
+      if (!mref_reader.is_state_satisfied()) {
+        return -CEPHFS_ENOTCONN;
+      }
+      std::scoped_lock l(client_lock);
+      char uuid[256];
+      sprintf(uuid, "unknownreclaimflag:%x", getpid());
+      auto session = _get_or_open_mds_session(0);
+      auto m = make_message<MClientReclaim>(uuid, flag);
+      ceph_assert(session->con->send_message2(std::move(m)) == 0);
+      wait_on_list(waiting_for_reclaim);
+      return session->reclaim_state == MetaSession::RECLAIM_FAIL ? true : false;
+    }
+};
 
 class TestClient : public ::testing::Test {
 public:
 
 class TestClient : public ::testing::Test {
 public:
@@ -53,7 +118,7 @@ public:
       messenger->add_dispatcher_tail(objecter);
       objecter->start();
 
       messenger->add_dispatcher_tail(objecter);
       objecter->start();
 
-      client = new Client(messenger, mc, objecter);
+      client = new ClientScaffold(messenger, mc, objecter);
       client->init();
       client->mount("/", myperm, true);
     }
       client->init();
       client->mount("/", myperm, true);
     }
@@ -81,5 +146,5 @@ protected:
     MonClient* mc = nullptr;
     Messenger* messenger = nullptr;
     Objecter* objecter = nullptr;
     MonClient* mc = nullptr;
     Messenger* messenger = nullptr;
     Objecter* objecter = nullptr;
-    Client* client = nullptr;
+    ClientScaffold* client = nullptr;
 };
 };
diff --git a/ceph/src/test/client/ops.cc b/ceph/src/test/client/ops.cc
new file mode 100644 (file)
index 0000000..e6e2513
--- /dev/null
@@ -0,0 +1,45 @@
+// -*- mode:C++; tab-width:8; c-basic-offset:2; indent-tabs-mode:t -*-
+// vim: ts=8 sw=2 smarttab
+/*
+ * Ceph - scalable distributed file system
+ *
+ * Copyright (C) 2022 Red Hat
+ *
+ * This is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License version 2.1, as published by the Free Software
+ * Foundation.  See file COPYING.
+ *
+ */
+
+#include <iostream>
+#include <errno.h>
+#include "TestClient.h"
+#include "gmock/gmock.h"
+#include "gtest/gtest.h"
+#include "gtest/gtest-spi.h"
+#include "gmock/gmock-matchers.h"
+#include "gmock/gmock-more-matchers.h"
+
+TEST_F(TestClient, CheckDummyOP) {
+  ASSERT_EQ(client->check_dummy_op(myperm), -EOPNOTSUPP);
+}
+
+TEST_F(TestClient, CheckUnknownSessionOp) {
+  ASSERT_EQ(client->send_unknown_session_op(-1), 0);
+  sleep(5);
+  ASSERT_EQ(client->check_client_blocklisted(), true);
+}
+
+TEST_F(TestClient, CheckZeroReclaimFlag) {
+  ASSERT_EQ(client->check_unknown_reclaim_flag(0), true);
+}
+TEST_F(TestClient, CheckUnknownReclaimFlag) {
+  ASSERT_EQ(client->check_unknown_reclaim_flag(2), true);
+}
+TEST_F(TestClient, CheckNegativeReclaimFlagUnmasked) {
+  ASSERT_EQ(client->check_unknown_reclaim_flag(-1 & ~MClientReclaim::FLAG_FINISH), true);
+}
+TEST_F(TestClient, CheckNegativeReclaimFlag) {
+  ASSERT_EQ(client->check_unknown_reclaim_flag(-1), true);
+}
diff --git a/ceph/src/test/cls_fifo/CMakeLists.txt b/ceph/src/test/cls_fifo/CMakeLists.txt
deleted file mode 100644 (file)
index 3abf763..0000000
+++ /dev/null
@@ -1,34 +0,0 @@
-add_executable(ceph_test_cls_fifo
-  test_cls_fifo.cc
-  )
-target_link_libraries(ceph_test_cls_fifo
-  neorados_cls_fifo
-  libneorados
-  spawn
-  ${UNITTEST_LIBS}
-  ${BLKID_LIBRARIES}
-  ${CMAKE_DL_LIBS}
-  ${CRYPTO_LIBS}
-  ${EXTRALIBS}
-  neoradostest-support
-  )
-install(TARGETS
-  ceph_test_cls_fifo
-  DESTINATION ${CMAKE_INSTALL_BINDIR})
-
-add_executable(ceph_bench_cls_fifo
-  bench_cls_fifo.cc
-  )
-target_link_libraries(ceph_bench_cls_fifo
-  neorados_cls_fifo
-  libneorados
-  spawn
-  ${UNITTEST_LIBS}
-  ${BLKID_LIBRARIES}
-  ${CMAKE_DL_LIBS}
-  ${CRYPTO_LIBS}
-  ${EXTRALIBS}
-  )
-install(TARGETS
-  ceph_test_cls_fifo
-  DESTINATION ${CMAKE_INSTALL_BINDIR})
diff --git a/ceph/src/test/cls_fifo/bench_cls_fifo.cc b/ceph/src/test/cls_fifo/bench_cls_fifo.cc
deleted file mode 100644 (file)
index ae4b7e1..0000000
+++ /dev/null
@@ -1,464 +0,0 @@
-// -*- mode:C++; tab-width:8; c-basic-offset:2; indent-tabs-mode:t -*-
-// vim: ts=8 sw=2 smarttab
-/*
- * Ceph - scalable distributed file system
- *
- * Copyright (C) 2020 Red Hat, Inc.
- *
- * This is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License version 2.1, as published by the Free Software
- * Foundation.  See file COPYING.
- *
- */
-
-
-#include <cerrno>
-#include <chrono>
-#include <cstdint>
-#include <exception>
-#include <future>
-#include <iostream>
-#include <string_view>
-
-#include <boost/asio.hpp>
-#include <boost/system/error_code.hpp>
-#include <boost/program_options.hpp>
-
-#undef FMT_HEADER_ONLY
-#define FMT_HEADER_ONLY 1
-#include <fmt/chrono.h>
-#include <fmt/format.h>
-#include <fmt/ostream.h>
-
-#include <spawn/spawn.hpp>
-
-#include "include/neorados/RADOS.hpp"
-
-#include "neorados/cls/fifo.h"
-
-using namespace std;
-
-namespace ba = boost::asio;
-namespace bs = boost::system;
-namespace bpo = boost::program_options;
-namespace cb = ceph::buffer;
-namespace R = neorados;
-namespace RCf = neorados::cls::fifo;
-namespace fifo = rados::cls::fifo;
-namespace s = spawn;
-namespace sc = std::chrono;
-
-namespace {
-static constexpr auto PUSH = 0x01 << 0;
-static constexpr auto PULL = 0x01 << 1;
-static constexpr auto BOTH = PUSH | PULL;
-static constexpr auto CLEAN = 0x01 << 2;
-static constexpr auto METADATA = 0x01 << 3;
-static constexpr auto PARTINFO = 0x01 << 4;
-static constexpr auto LIST = 0x01 << 5;
-
-struct benchmark {
-  std::uint32_t entries = 0;
-  sc::duration<double> elapsed = 0ns;
-
-  std::uint64_t ratio() const {
-    return entries/std::max(elapsed,
-                           sc::duration<double>(1ns)).count();
-  }
-  benchmark() = default;
-  benchmark(std::uint32_t entries, sc::duration<double> elapsed)
-    : entries(entries), elapsed(elapsed) {}
-};
-
-benchmark push(RCf::FIFO& f, const std::uint32_t count,
-              const std::uint32_t entry_size, const std::uint32_t push_entries,
-              s::yield_context y)
-{
-  cb::list entry;
-  entry.push_back(cb::create_small_page_aligned(entry_size));
-  entry.zero();
-
-  std::vector entries(std::min(count, push_entries), entry);
-  auto remaining = count;
-  auto start = sc::steady_clock::now();
-  while (remaining) {
-    if (entries.size() > remaining) {
-      entries.resize(remaining);
-    }
-    f.push(entries, y);
-    remaining -= entries.size();
-  }
-  auto finish = sc::steady_clock::now();
-  return benchmark(count, (finish - start));
-}
-
-benchmark pull(RCf::FIFO& f, const std::uint32_t count,
-              const std::uint32_t pull_entries, s::yield_context y)
-{
-  auto remaining = count;
-  std::uint32_t got = 0;
-
-  auto start = sc::steady_clock::now();
-  while (remaining) {
-    auto [result, more] = f.list(std::min(remaining, pull_entries),
-                                std::nullopt, y);
-    if (result.empty())
-      break;
-    got += result.size();
-    remaining -= result.size();
-    f.trim(result.back().marker, false, y);
-  }
-  auto finish = sc::steady_clock::now();
-  return benchmark(got, (finish - start));
-}
-
-void concurpull(const std::string& oid, const std::int64_t pool,
-               const std::uint32_t count, const std::uint32_t pull_entries,
-               std::promise<benchmark> notify, const bool* const exit_early)
-{
-  ba::io_context c;
-  benchmark bench;
-  std::exception_ptr ex;
-  s::spawn(
-    c,
-    [&](s::yield_context y) {
-      try {
-       auto r = R::RADOS::Builder{}.build(c, y);
-       R::IOContext ioc(pool);
-       auto f = RCf::FIFO::open(r, ioc, oid, y);
-       auto remaining = count;
-       std::uint32_t got = 0;
-
-       auto start = sc::steady_clock::now();
-       while (remaining) {
-         if (*exit_early) break;
-         auto [result, more] =
-           f->list(std::min(remaining, pull_entries), std::nullopt, y);
-         if (result.empty()) {
-           // We just keep going assuming they'll push more.
-           continue;
-         }
-         got += result.size();
-         remaining -= result.size();
-         if (*exit_early) break;
-         f->trim(result.back().marker, false, y);
-       }
-       auto finish = sc::steady_clock::now();
-       bench.entries = got;
-       bench.elapsed = finish - start;
-      } catch (const std::exception&) {
-       ex = std::current_exception();
-      }
-    });
-  c.run();
-  if (ex) {
-    notify.set_exception(std::current_exception());
-  } else {
-    notify.set_value(bench);
-  }
-}
-
-void clean(R::RADOS& r, const R::IOContext& ioc, RCf::FIFO& f,
-          s::yield_context y)
-{
-  f.read_meta(y);
-  const auto info = f.meta();
-  if (info.head_part_num > -1) {
-    for (auto i = info.tail_part_num; i <= info.head_part_num; ++i) {
-      R::WriteOp op;
-      op.remove();
-      r.execute(info.part_oid(i), ioc, std::move(op), y);
-    }
-  }
-  R::WriteOp op;
-  op.remove();
-  r.execute(info.id, ioc, std::move(op), y);
-}
-}
-
-int main(int argc, char* argv[])
-{
-  const std::string_view prog(argv[0]);
-  std::string command;
-  try {
-    std::uint32_t count = 0;
-    std::string oid;
-    std::string pool;
-    std::uint32_t entry_size = 0;
-    std::uint32_t push_entries = 0;
-    std::uint32_t pull_entries = 0;
-    std::uint64_t max_part_size = 0;
-    std::uint64_t max_entry_size = 0;
-    std::int64_t part_num = 0;
-    std::string marker;
-
-    bpo::options_description desc(fmt::format("{} options", prog));
-    desc.add_options()
-      ("help", "show help")
-      ("oid", bpo::value<std::string>(&oid)->default_value("fifo"s),
-       "the base oid for the fifo")
-      ("pool", bpo::value<std::string>(&pool)->default_value("fifo_benchmark"s),
-       "the base oid for the fifo")
-      ("count", bpo::value<std::uint32_t>(&count)->default_value(1024),
-       "total count of items")
-      ("entry-size", bpo::value<std::uint32_t>(&entry_size)->default_value(64),
-       "size of entries to push")
-      ("push-entries",
-       bpo::value<std::uint32_t>(&push_entries)
-       ->default_value(512), "entries to push per call")
-      ("max-part-size", bpo::value<std::uint64_t>(&max_part_size)
-       ->default_value(RCf::default_max_part_size),
-       "maximum entry size allowed by FIFO")
-      ("max-entry-size", bpo::value<std::uint64_t>(&max_entry_size)
-       ->default_value(RCf::default_max_entry_size),
-       "maximum entry size allowed by FIFO")
-      ("pull-entries",
-       bpo::value<uint32_t>(&pull_entries)
-       ->default_value(512), "entries to pull per call")
-      ("part-num",
-       bpo::value<int64_t>(&part_num)
-       ->default_value(-1), "partition number, -1 for head")
-      ("marker", bpo::value<std::string>(&marker), "marker to begin list")
-      ("command", bpo::value<std::string>(&command),
-       "the operation to perform");
-
-    bpo::positional_options_description p;
-    p.add("command", 1);
-
-    bpo::variables_map vm;
-
-    bpo::store(bpo::command_line_parser(argc, argv).
-              options(desc).positional(p).run(), vm);
-
-    bpo::notify(vm);
-
-    if (vm.count("help")) {
-      fmt::print(std::cout, "{}", desc);
-      fmt::print(std::cout, "\n{} commands:\n", prog);
-      fmt::print(std::cout, "    push\t\t\t push entries into fifo\n");
-      fmt::print(std::cout, "    pull\t\t\t retrieve and trim entries\n");
-      fmt::print(std::cout, "    both\t\t\t both at once, in two threads\n");
-      fmt::print(std::cout, "    metadata\t\t\t print metadata\n");
-      fmt::print(std::cout, "    partinfo\t\t\t print metadata\n");
-      fmt::print(std::cout, "    list\t\t\t list entries\n");
-      fmt::print(std::cout, "    clean\t\t\t clean up\n");
-      return 0;
-    }
-
-
-    if (vm.find("command") == vm.end()) {
-      fmt::print(std::cerr, "{}: a command is required\n", prog);
-      return 1;
-    }
-
-    int op = 0;
-    if (command == "push"s) {
-      op = PUSH;
-    } else if (command == "pull"s) {
-      op = PULL;
-    } else if (command == "both"s) {
-      op = BOTH;
-    } else if (command == "clean"s) {
-      op = CLEAN;
-    } else if (command == "metadata"s) {
-      op = METADATA;
-    } else if (command == "partinfo"s) {
-      op = PARTINFO;
-    } else if (command == "list"s) {
-      op = LIST;
-    } else {
-      fmt::print(std::cerr, "{}: {} is not a valid command\n",
-                prog, command);
-      return 1;
-    }
-
-    if (!(op & PULL) && !vm["pull-entries"].defaulted()) {
-      fmt::print(std::cerr, "{}: pull-entries is only meaningful when pulling\n",
-                prog);
-      return 1;
-    }
-
-    if (!(op & PUSH)) {
-      for (const auto& p : { "entry-size"s, "push-entries"s, "max-part-size"s,
-           "max-entry-size"s }) {
-       if (!vm[p].defaulted()) {
-         fmt::print(std::cerr, "{}: {} is only meaningful when pushing\n",
-                    prog, p);
-         return 1;
-       }
-      }
-    }
-
-    if (!(op & BOTH) && !(op & LIST) && !vm["count"].defaulted()) {
-      fmt::print(std::cerr, "{}: count is only meaningful when pulling, pushing, both, or listing\n",
-                prog);
-      return 1;
-    }
-
-    if (!(op & PARTINFO) && !vm["part-num"].defaulted()) {
-      fmt::print(std::cerr, "{}: part-num is only meaningful when getting part info\n",
-                prog);
-      return 1;
-    }
-
-    if (count == 0) {
-      fmt::print(std::cerr, "{}: count must be nonzero\n", prog);
-      return 1;
-    }
-
-    if ((op & PULL) && (pull_entries == 0)) {
-      fmt::print(std::cerr,
-                "{}: pull-entries must be nonzero\n", prog);
-      return 1;
-    }
-
-    if (!(op & LIST) && vm.count("marker") > 0) {
-      fmt::print(std::cerr, "{}: marker is only meaningful when listing\n",
-                prog);
-      return 1;
-    }
-
-    if (op & PUSH) {
-      if (entry_size == 0) {
-       fmt::print(std::cerr, "{}: entry-size must be nonzero\n", prog);
-       return 1;
-      }
-      if (push_entries== 0) {
-       fmt::print(std::cerr, "{}: push-entries must be nonzero\n", prog);
-       return 1;
-      }
-      if (max_entry_size == 0) {
-       fmt::print(std::cerr, "{}: max-entry-size must be nonzero\n", prog);
-       return 1;
-      }
-      if (max_part_size == 0) {
-       fmt::print(std::cerr, "{}: max-part-size must be nonzero\n", prog);
-       return 1;
-      }
-      if (entry_size > max_entry_size) {
-       fmt::print(std::cerr,
-                  "{}: entry-size may not be greater than max-entry-size\n",
-                  prog);
-       return 1;
-      }
-      if (max_entry_size >= max_part_size) {
-       fmt::print(std::cerr,
-                  "{}: max-entry-size may be less than max-part-size\n",
-                  prog);
-       return 1;
-      }
-    }
-
-    ba::io_context c;
-    benchmark pushmark, pullmark;
-    fifo::info meta;
-    fifo::part_header partinfo;
-    bool more = false;
-    std::vector<RCf::list_entry> entries;
-    s::spawn(
-      c,
-      [&](s::yield_context y) {
-       auto r = R::RADOS::Builder{}.build(c, y);
-       bs::error_code ec;
-       std::int64_t pid;
-       pid = r.lookup_pool(pool, y[ec]);
-       if (ec) {
-         r.create_pool(pool, std::nullopt, y);
-         pid = r.lookup_pool(pool, y);
-       }
-       const R::IOContext ioc(pid);
-       auto f = RCf::FIFO::create(r, ioc, oid, y, std::nullopt,
-                                  std::nullopt, false, max_part_size,
-                                  max_entry_size);
-
-       switch (op) {
-       case PUSH:
-         pushmark = push(*f, count, entry_size, push_entries, y);
-         break;
-
-       case PULL:
-         pullmark = pull(*f, count, pull_entries, y);
-         break;
-
-       case METADATA:
-         meta = f->meta();
-         break;
-
-       case PARTINFO:
-         meta = f->meta();
-         if (part_num == -1) {
-           part_num = meta.head_part_num;
-         }
-         partinfo = f->get_part_info(part_num, y);
-         break;
-
-       case LIST:
-         if (vm.count("marker") == 0) {
-           std::tie(entries, more) = f->list(count, std::nullopt, y);
-         } else {
-           std::tie(entries, more) = f->list(count, marker, y);
-         }
-         break;
-
-       case BOTH: {
-         std::promise<benchmark> notify;
-         bool exit_early = false;
-
-         auto notifier = notify.get_future();
-         std::thread t(concurpull, oid, pid, count, pull_entries,
-                       std::move(notify), &exit_early);
-         t.detach();
-         try {
-           pushmark = push(*f, count, entry_size, push_entries, y);
-         } catch (const std::exception&) {
-           exit_early = true;
-           notifier.wait();
-           throw;
-         }
-         pullmark = notifier.get();
-       }
-       }
-
-       if (op & CLEAN)
-         clean(r, ioc, *f, y);
-      });
-    c.run();
-    if (op & PUSH) {
-      fmt::print("Pushed {} in {} at {}/s\n",
-                pushmark.entries, pushmark.elapsed, pushmark.ratio());
-    }
-    if (op & PULL) {
-      if (pullmark.entries == count) {
-       fmt::print(std::cout, "Pulled {} in {} at {}/s\n",
-                  pullmark.entries, pullmark.elapsed, pullmark.ratio());
-      } else {
-       fmt::print(std::cout, "Pulled {} (of {} requested), in {} at {}/s\n",
-                  pullmark.entries, count, pullmark.elapsed, pullmark.ratio());
-      }
-    }
-    if (op & METADATA) {
-      fmt::print(std::cout, "Metadata: [{}]\n", meta);
-    }
-    if (op & PARTINFO) {
-      fmt::print(std::cout, "Info for partition {}: [{}]\n", part_num, partinfo);
-    }
-    if (op & LIST) {
-      for (const auto& entry : entries) {
-       fmt::print(std::cout, "{}\t{}\n", entry.marker, entry.mtime);
-      }
-      if (more) {
-       fmt::print(std::cout, "...");
-      }
-    }
-  } catch (const std::exception& e) {
-    if (command.empty()) {
-      fmt::print(std::cerr, "{}: {}\n", prog, e.what());
-    } else {
-      fmt::print(std::cerr, "{}: {}: {}\n", prog, command, e.what());
-    }
-    return 1;
-  }
-
-  return 0;
-}
diff --git a/ceph/src/test/cls_fifo/test_cls_fifo.cc b/ceph/src/test/cls_fifo/test_cls_fifo.cc
deleted file mode 100644 (file)
index c7a4041..0000000
+++ /dev/null
@@ -1,741 +0,0 @@
-// -*- mode:C++; tab-width:8; c-basic-offset:2; indent-tabs-mode:t -*-
-// vim: ts=8 sw=2 smarttab
-/*
- * Ceph - scalable distributed file system
- *
- * Copyright (C) 2019 Red Hat, Inc.
- *
- * This is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License version 2.1, as published by the Free Software
- * Foundation.  See file COPYING.
- *
- */
-
-#include <cerrno>
-#include <iostream>
-#include <string_view>
-
-#include <boost/asio.hpp>
-#include <boost/system/error_code.hpp>
-
-#include <spawn/spawn.hpp>
-
-#include "include/scope_guard.h"
-#include "include/types.h"
-#include "include/neorados/RADOS.hpp"
-
-#include "cls/fifo/cls_fifo_ops.h"
-
-#include "neorados/cls/fifo.h"
-
-#include "test/neorados/common_tests.h"
-
-#include "gtest/gtest.h"
-
-using namespace std;
-
-namespace R = neorados;
-namespace ba = boost::asio;
-namespace bs = boost::system;
-namespace cb = ceph::buffer;
-namespace fifo = rados::cls::fifo;
-namespace RCf = neorados::cls::fifo;
-namespace s = spawn;
-
-namespace {
-void fifo_create(R::RADOS& r,
-                const R::IOContext& ioc,
-                const R::Object& oid,
-                std::string_view id,
-                s::yield_context y,
-                std::optional<fifo::objv> objv = std::nullopt,
-                std::optional<std::string_view> oid_prefix = std::nullopt,
-                bool exclusive = false,
-                std::uint64_t max_part_size = RCf::default_max_part_size,
-                std::uint64_t max_entry_size = RCf::default_max_entry_size)
-{
-  R::WriteOp op;
-  RCf::create_meta(op, id, objv, oid_prefix, exclusive, max_part_size,
-                  max_entry_size);
-  r.execute(oid, ioc, std::move(op), y);
-}
-}
-
-TEST(ClsFIFO, TestCreate) {
-  ba::io_context c;
-  auto fifo_id = "fifo"sv;
-  R::Object oid(fifo_id);
-
-  s::spawn(c, [&](s::yield_context y) {
-               auto r = R::RADOS::Builder{}.build(c, y);
-               auto pool = create_pool(r, get_temp_pool_name(), y);
-               auto sg = make_scope_guard(
-                 [&] {
-                   r.delete_pool(pool, y);
-                 });
-               R::IOContext ioc(pool);
-               bs::error_code ec;
-               fifo_create(r, ioc, oid, ""s, y[ec]);
-               EXPECT_EQ(bs::errc::invalid_argument, ec);
-               fifo_create(r, ioc, oid, fifo_id, y[ec], std::nullopt,
-                           std::nullopt, false, 0);
-               EXPECT_EQ(bs::errc::invalid_argument, ec);
-               fifo_create(r, ioc, oid, {}, y[ec],
-                           std::nullopt, std::nullopt,
-                           false, RCf::default_max_part_size, 0);
-               EXPECT_EQ(bs::errc::invalid_argument, ec);
-               fifo_create(r, ioc, oid, fifo_id, y);
-               {
-                 std::uint64_t size;
-                 std::uint64_t size2;
-                 {
-                   R::ReadOp op;
-                   op.stat(&size, nullptr);
-                   r.execute(oid, ioc, std::move(op),
-                             nullptr, y);
-                   EXPECT_GT(size, 0);
-                 }
-
-                 {
-                   R::ReadOp op;
-                   op.stat(&size2, nullptr);
-                   r.execute(oid, ioc, std::move(op), nullptr, y);
-                 }
-                 EXPECT_EQ(size2, size);
-               }
-               /* test idempotency */
-               fifo_create(r, ioc, oid, fifo_id, y);
-               fifo_create(r, ioc, oid, {}, y[ec], std::nullopt,
-                           std::nullopt, false);
-               EXPECT_EQ(bs::errc::invalid_argument, ec);
-               fifo_create(r, ioc, oid, {}, y[ec], std::nullopt,
-                           "myprefix"sv, false);
-               EXPECT_EQ(bs::errc::invalid_argument, ec);
-               fifo_create(r, ioc, oid, "foo"sv, y[ec],
-                           std::nullopt, std::nullopt, false);
-               EXPECT_EQ(bs::errc::file_exists, ec);
-             });
-  c.run();
-}
-
-TEST(ClsFIFO, TestGetInfo) {
-  ba::io_context c;
-  auto fifo_id = "fifo"sv;
-  R::Object oid(fifo_id);
-
-  s::spawn(c, [&](s::yield_context y) {
-               auto r = R::RADOS::Builder{}.build(c, y);
-               auto pool = create_pool(r, get_temp_pool_name(), y);
-               auto sg = make_scope_guard(
-                 [&] {
-                   r.delete_pool(pool, y);
-                 });
-               R::IOContext ioc(pool);
-               /* first successful create */
-               fifo_create(r, ioc, oid, fifo_id, y);
-
-               fifo::info info;
-               std::uint32_t part_header_size;
-               std::uint32_t part_entry_overhead;
-               {
-                 R::ReadOp op;
-                 RCf::get_meta(op, std::nullopt,
-                               nullptr, &info, &part_header_size,
-                               &part_entry_overhead);
-                 r.execute(oid, ioc, std::move(op), nullptr, y);
-                 EXPECT_GT(part_header_size, 0);
-                 EXPECT_GT(part_entry_overhead, 0);
-                 EXPECT_FALSE(info.version.instance.empty());
-               }
-               {
-                 R::ReadOp op;
-                 RCf::get_meta(op, info.version,
-                               nullptr, &info, &part_header_size,
-                               &part_entry_overhead);
-                 r.execute(oid, ioc, std::move(op), nullptr, y);
-               }
-               {
-                 R::ReadOp op;
-                 fifo::objv objv;
-                 objv.instance = "foo";
-                 objv.ver = 12;
-                 RCf::get_meta(op, objv,
-                               nullptr, &info, &part_header_size,
-                               &part_entry_overhead);
-                 ASSERT_ANY_THROW(r.execute(oid, ioc, std::move(op),
-                                            nullptr, y));
-               }
-             });
-  c.run();
-}
-
-TEST(FIFO, TestOpenDefault) {
-  ba::io_context c;
-  auto fifo_id = "fifo"s;
-
-  s::spawn(c, [&](s::yield_context y) {
-               auto r = R::RADOS::Builder{}.build(c, y);
-               auto pool = create_pool(r, get_temp_pool_name(), y);
-               auto sg = make_scope_guard(
-                 [&] {
-                   r.delete_pool(pool, y);
-                 });
-               R::IOContext ioc(pool);
-               auto fifo = RCf::FIFO::create(r, ioc, fifo_id, y);
-               // force reading from backend
-               fifo->read_meta(y);
-               auto info = fifo->meta();
-               EXPECT_EQ(info.id, fifo_id);
-             });
-  c.run();
-}
-
-TEST(FIFO, TestOpenParams) {
-  ba::io_context c;
-  auto fifo_id = "fifo"sv;
-
-  s::spawn(c, [&](s::yield_context y) {
-               auto r = R::RADOS::Builder{}.build(c, y);
-               auto pool = create_pool(r, get_temp_pool_name(), y);
-               auto sg = make_scope_guard(
-                 [&] {
-                   r.delete_pool(pool, y);
-                 });
-               R::IOContext ioc(pool);
-
-               const std::uint64_t max_part_size = 10 * 1024;
-               const std::uint64_t max_entry_size = 128;
-               auto oid_prefix = "foo.123."sv;
-               fifo::objv objv;
-               objv.instance = "fooz"s;
-               objv.ver = 10;
-
-               /* first successful create */
-               auto f = RCf::FIFO::create(r, ioc, fifo_id, y, objv, oid_prefix,
-                                          false, max_part_size,
-                                          max_entry_size);
-
-
-               /* force reading from backend */
-               f->read_meta(y);
-               auto info = f->meta();
-               ASSERT_EQ(info.id, fifo_id);
-               ASSERT_EQ(info.params.max_part_size, max_part_size);
-               ASSERT_EQ(info.params.max_entry_size, max_entry_size);
-               ASSERT_EQ(info.version, objv);
-             });
-  c.run();
-}
-
-namespace {
-template<class T>
-std::pair<T, std::string> decode_entry(const RCf::list_entry& entry)
-{
-  T val;
-  auto iter = entry.data.cbegin();
-  decode(val, iter);
-  return std::make_pair(std::move(val), entry.marker);
-}
-}
-
-
-
-TEST(FIFO, TestPushListTrim) {
-  ba::io_context c;
-  auto fifo_id = "fifo"sv;
-
-  s::spawn(c, [&](s::yield_context y) mutable {
-               auto r = R::RADOS::Builder{}.build(c, y);
-               auto pool = create_pool(r, get_temp_pool_name(), y);
-               auto sg = make_scope_guard(
-                 [&] {
-                   r.delete_pool(pool, y);
-                 });
-               R::IOContext ioc(pool);
-               auto f = RCf::FIFO::create(r, ioc, fifo_id, y);
-               static constexpr auto max_entries = 10u;
-               for (uint32_t i = 0; i < max_entries; ++i) {
-                 cb::list bl;
-                 encode(i, bl);
-                 f->push(bl, y);
-               }
-
-               std::optional<std::string> marker;
-               /* get entries one by one */
-
-               for (auto i = 0u; i < max_entries; ++i) {
-                 auto [result, more] = f->list(1, marker, y);
-
-                 bool expected_more = (i != (max_entries - 1));
-                 ASSERT_EQ(expected_more, more);
-                 ASSERT_EQ(1, result.size());
-
-                 std::uint32_t val;
-                 std::tie(val, marker) =
-                   decode_entry<std::uint32_t>(result.front());
-
-                 ASSERT_EQ(i, val);
-               }
-
-               /* get all entries at once */
-               std::string markers[max_entries];
-               std::uint32_t min_entry = 0;
-               {
-                 auto [result, more] = f->list(max_entries * 10, std::nullopt,
-                                               y);
-
-                 ASSERT_FALSE(more);
-                 ASSERT_EQ(max_entries, result.size());
-
-
-                 for (auto i = 0u; i < max_entries; ++i) {
-                   std::uint32_t val;
-
-                   std::tie(val, markers[i]) =
-                     decode_entry<std::uint32_t>(result[i]);
-                   ASSERT_EQ(i, val);
-                 }
-
-
-                 /* trim one entry */
-                 f->trim(markers[min_entry], false, y);
-                 ++min_entry;
-               }
-
-               auto [result, more] = f->list(max_entries * 10,
-                                             std::nullopt, y);
-
-               ASSERT_FALSE(more);
-               ASSERT_EQ(max_entries - min_entry, result.size());
-
-               for (auto i = min_entry; i < max_entries; ++i) {
-                 std::uint32_t val;
-
-                 std::tie(val, markers[i - min_entry]) =
-                   decode_entry<std::uint32_t>(result[i - min_entry]);
-                 ASSERT_EQ(i, val);
-               }
-
-             });
-  c.run();
-}
-
-
-TEST(FIFO, TestPushTooBig) {
-  ba::io_context c;
-  auto fifo_id = "fifo"sv;
-  static constexpr auto max_part_size = 2048ull;
-  static constexpr auto max_entry_size = 128ull;
-
-  s::spawn(c, [&](s::yield_context y) {
-               auto r = R::RADOS::Builder{}.build(c, y);
-               auto pool = create_pool(r, get_temp_pool_name(), y);
-               auto sg = make_scope_guard(
-                 [&] {
-                   r.delete_pool(pool, y);
-                 });
-               R::IOContext ioc(pool);
-
-               auto f = RCf::FIFO::create(r, ioc, fifo_id, y, std::nullopt,
-                                          std::nullopt, false, max_part_size,
-                                          max_entry_size);
-
-               char buf[max_entry_size + 1];
-               memset(buf, 0, sizeof(buf));
-
-               cb::list bl;
-               bl.append(buf, sizeof(buf));
-
-               bs::error_code ec;
-               f->push(bl, y[ec]);
-               EXPECT_EQ(RCf::errc::entry_too_large, ec);
-             });
-  c.run();
-}
-
-
-TEST(FIFO, TestMultipleParts) {
-  ba::io_context c;
-  auto fifo_id = "fifo"sv;
-  static constexpr auto max_part_size = 2048ull;
-  static constexpr auto max_entry_size = 128ull;
-
-  s::spawn(c, [&](s::yield_context y) mutable {
-               auto r = R::RADOS::Builder{}.build(c, y);
-               auto pool = create_pool(r, get_temp_pool_name(), y);
-               auto sg = make_scope_guard(
-                 [&] {
-                   r.delete_pool(pool, y);
-                 });
-               R::IOContext ioc(pool);
-
-               auto f = RCf::FIFO::create(r, ioc, fifo_id, y, std::nullopt,
-                                          std::nullopt, false, max_part_size,
-                                          max_entry_size);
-
-
-               char buf[max_entry_size];
-               memset(buf, 0, sizeof(buf));
-
-               const auto [part_header_size, part_entry_overhead] =
-                 f->get_part_layout_info();
-
-               const auto entries_per_part =
-                 (max_part_size - part_header_size) /
-                 (max_entry_size + part_entry_overhead);
-
-               const auto max_entries = entries_per_part * 4 + 1;
-
-               /* push enough entries */
-               for (auto i = 0u; i < max_entries; ++i) {
-                 cb::list bl;
-
-                 *(int *)buf = i;
-                 bl.append(buf, sizeof(buf));
-
-                 f->push(bl, y);
-               }
-
-               auto info = f->meta();
-
-               ASSERT_EQ(info.id, fifo_id);
-               /* head should have advanced */
-               ASSERT_GT(info.head_part_num, 0);
-
-
-               /* list all at once */
-               auto [result, more] = f->list(max_entries, std::nullopt, y);
-               EXPECT_EQ(false, more);
-
-               ASSERT_EQ(max_entries, result.size());
-
-               for (auto i = 0u; i < max_entries; ++i) {
-                 auto& bl = result[i].data;
-                 ASSERT_EQ(i, *(int *)bl.c_str());
-               }
-
-               std::optional<std::string> marker;
-               /* get entries one by one */
-
-               for (auto i = 0u; i < max_entries; ++i) {
-                 auto [result, more] = f->list(1, marker, y);
-                 ASSERT_EQ(result.size(), 1);
-                 const bool expected_more = (i != (max_entries - 1));
-                 ASSERT_EQ(expected_more, more);
-
-                 std::uint32_t val;
-                 std::tie(val, marker) =
-                   decode_entry<std::uint32_t>(result.front());
-
-                 auto& entry = result.front();
-                 auto& bl = entry.data;
-                 ASSERT_EQ(i, *(int *)bl.c_str());
-                 marker = entry.marker;
-               }
-
-               /* trim one at a time */
-               marker.reset();
-               for (auto i = 0u; i < max_entries; ++i) {
-                 /* read single entry */
-                 {
-                   auto [result, more] = f->list(1, marker, y);
-                   ASSERT_EQ(result.size(), 1);
-                   const bool expected_more = (i != (max_entries - 1));
-                   ASSERT_EQ(expected_more, more);
-
-                   marker = result.front().marker;
-
-                   f->trim(*marker, false, y);
-                 }
-
-                 /* check tail */
-                 info = f->meta();
-                 ASSERT_EQ(info.tail_part_num, i / entries_per_part);
-
-                 /* try to read all again, see how many entries left */
-                 auto [result, more] = f->list(max_entries, marker, y);
-                 ASSERT_EQ(max_entries - i - 1, result.size());
-                 ASSERT_EQ(false, more);
-               }
-
-               /* tail now should point at head */
-               info = f->meta();
-               ASSERT_EQ(info.head_part_num, info.tail_part_num);
-
-               /* check old tails are removed */
-               for (auto i = 0; i < info.tail_part_num; ++i) {
-                 bs::error_code ec;
-                 f->get_part_info(i, y[ec]);
-                 ASSERT_EQ(bs::errc::no_such_file_or_directory, ec);
-               }
-               /* check current tail exists */
-               f->get_part_info(info.tail_part_num, y);
-             });
-  c.run();
-}
-
-
-TEST(FIFO, TestTwoPushers) {
-  ba::io_context c;
-  auto fifo_id = "fifo"sv;
-  static constexpr auto max_part_size = 2048ull;
-  static constexpr auto max_entry_size = 128ull;
-
-  s::spawn(c, [&](s::yield_context y) {
-               auto r = R::RADOS::Builder{}.build(c, y);
-               auto pool = create_pool(r, get_temp_pool_name(), y);
-               auto sg = make_scope_guard(
-                 [&] {
-                   r.delete_pool(pool, y);
-                 });
-               R::IOContext ioc(pool);
-
-               auto f = RCf::FIFO::create(r, ioc, fifo_id, y, std::nullopt,
-                                          std::nullopt, false, max_part_size,
-                                          max_entry_size);
-
-
-
-               char buf[max_entry_size];
-               memset(buf, 0, sizeof(buf));
-
-
-               auto [part_header_size, part_entry_overhead] =
-                 f->get_part_layout_info();
-
-               const auto entries_per_part =
-                 (max_part_size - part_header_size) /
-                 (max_entry_size + part_entry_overhead);
-
-               const auto max_entries = entries_per_part * 4 + 1;
-
-               auto f2 = RCf::FIFO::open(r, ioc, fifo_id, y);
-
-               std::vector fifos{&f, &f2};
-
-               for (auto i = 0u; i < max_entries; ++i) {
-                 cb::list bl;
-                 *(int *)buf = i;
-                 bl.append(buf, sizeof(buf));
-
-                 auto& f = fifos[i % fifos.size()];
-
-                 (*f)->push(bl, y);
-               }
-
-               /* list all by both */
-               {
-                 auto [result, more] = f2->list(max_entries, std::nullopt, y);
-
-                 ASSERT_EQ(false, more);
-                 ASSERT_EQ(max_entries, result.size());
-               }
-               auto [result, more] = f2->list(max_entries, std::nullopt, y);
-               ASSERT_EQ(false, more);
-               ASSERT_EQ(max_entries, result.size());
-
-               for (auto i = 0u; i < max_entries; ++i) {
-                 auto& bl = result[i].data;
-                 ASSERT_EQ(i, *(int *)bl.c_str());
-               }
-             });
-  c.run();
-}
-
-
-TEST(FIFO, TestTwoPushersTrim) {
-  ba::io_context c;
-  auto fifo_id = "fifo"sv;
-  static constexpr auto max_part_size = 2048ull;
-  static constexpr auto max_entry_size = 128ull;
-
-  s::spawn(c, [&](s::yield_context y) {
-               auto r = R::RADOS::Builder{}.build(c, y);
-               auto pool = create_pool(r, get_temp_pool_name(), y);
-               auto sg = make_scope_guard(
-                 [&] {
-                   r.delete_pool(pool, y);
-                 });
-               R::IOContext ioc(pool);
-
-               auto f1 = RCf::FIFO::create(r, ioc, fifo_id, y, std::nullopt,
-                                           std::nullopt, false, max_part_size,
-                                           max_entry_size);
-
-               char buf[max_entry_size];
-               memset(buf, 0, sizeof(buf));
-
-
-               auto [part_header_size, part_entry_overhead] =
-                 f1->get_part_layout_info();
-
-               const auto entries_per_part =
-                 (max_part_size - part_header_size) /
-                 (max_entry_size + part_entry_overhead);
-
-               const auto max_entries = entries_per_part * 4 + 1;
-
-               auto f2 = RCf::FIFO::open(r, ioc, fifo_id, y);
-
-               /* push one entry to f2 and the rest to f1 */
-
-               for (auto i = 0u; i < max_entries; ++i) {
-                 cb::list bl;
-
-                 *(int *)buf = i;
-                 bl.append(buf, sizeof(buf));
-
-                 auto f = (i < 1 ? &f2 : &f1);
-                 (*f)->push(bl, y);
-               }
-
-               /* trim half by fifo1 */
-               auto num = max_entries / 2;
-
-               std::string marker;
-               {
-                 auto [result, more] = f1->list(num, std::nullopt, y);
-
-                 ASSERT_EQ(true, more);
-                 ASSERT_EQ(num, result.size());
-
-                 for (auto i = 0u; i < num; ++i) {
-                   auto& bl = result[i].data;
-                   ASSERT_EQ(i, *(int *)bl.c_str());
-                 }
-
-                 auto& entry = result[num - 1];
-                 marker = entry.marker;
-
-                 f1->trim(marker, false, y);
-
-                 /* list what's left by fifo2 */
-
-               }
-
-               const auto left = max_entries - num;
-               auto [result, more] = f2->list(left, marker, y);
-               ASSERT_EQ(left, result.size());
-               ASSERT_EQ(false, more);
-
-               for (auto i = num; i < max_entries; ++i) {
-                 auto& bl = result[i - num].data;
-                 ASSERT_EQ(i, *(int *)bl.c_str());
-               }
-             });
-  c.run();
-}
-
-TEST(FIFO, TestPushBatch) {
-  ba::io_context c;
-  auto fifo_id = "fifo"sv;
-  static constexpr auto max_part_size = 2048ull;
-  static constexpr auto max_entry_size = 128ull;
-
-  s::spawn(c, [&](s::yield_context y) {
-               auto r = R::RADOS::Builder{}.build(c, y);
-               auto pool = create_pool(r, get_temp_pool_name(), y);
-               auto sg = make_scope_guard(
-                 [&] {
-                   r.delete_pool(pool, y);
-                 });
-               R::IOContext ioc(pool);
-
-               auto f = RCf::FIFO::create(r, ioc, fifo_id, y, std::nullopt,
-                                          std::nullopt, false, max_part_size,
-                                          max_entry_size);
-
-
-               char buf[max_entry_size];
-               memset(buf, 0, sizeof(buf));
-
-               auto [part_header_size, part_entry_overhead]
-                 = f->get_part_layout_info();
-
-               auto entries_per_part =
-                 (max_part_size - part_header_size) /
-                 (max_entry_size + part_entry_overhead);
-
-               auto max_entries = entries_per_part * 4 + 1; /* enough entries to span multiple parts */
-
-               std::vector<cb::list> bufs;
-
-               for (auto i = 0u; i < max_entries; ++i) {
-                 cb::list bl;
-
-                 *(int *)buf = i;
-                 bl.append(buf, sizeof(buf));
-
-                 bufs.push_back(bl);
-               }
-
-               f->push(bufs, y);
-
-               /* list all */
-
-               auto [result, more] = f->list(max_entries, std::nullopt, y);
-               ASSERT_EQ(false, more);
-               ASSERT_EQ(max_entries, result.size());
-
-               for (auto i = 0u; i < max_entries; ++i) {
-                 auto& bl = result[i].data;
-                 ASSERT_EQ(i, *(int *)bl.c_str());
-               }
-
-               auto& info = f->meta();
-               ASSERT_EQ(info.head_part_num, 4);
-             });
-  c.run();
-}
-
-TEST(FIFO, TestTrimExclusive) {
-  ba::io_context c;
-  auto fifo_id = "fifo"sv;
-
-  s::spawn(c, [&](s::yield_context y) mutable {
-               auto r = R::RADOS::Builder{}.build(c, y);
-               auto pool = create_pool(r, get_temp_pool_name(), y);
-               auto sg = make_scope_guard(
-                 [&] {
-                   r.delete_pool(pool, y);
-                 });
-               R::IOContext ioc(pool);
-               auto f = RCf::FIFO::create(r, ioc, fifo_id, y);
-               static constexpr auto max_entries = 10u;
-               for (uint32_t i = 0; i < max_entries; ++i) {
-                 cb::list bl;
-                 encode(i, bl);
-                 f->push(bl, y);
-               }
-
-               {
-                 auto [result, more] = f->list(1, std::nullopt, y);
-                 auto [val, marker] =
-                   decode_entry<std::uint32_t>(result.front());
-                 ASSERT_EQ(0, val);
-                 f->trim(marker, true, y);
-               }
-               {
-                 auto [result, more] = f->list(max_entries, std::nullopt, y);
-                 auto [val, marker] = decode_entry<std::uint32_t>(result.front());
-                 ASSERT_EQ(0, val);
-                 f->trim(result[4].marker, true, y);
-               }
-               {
-                 auto [result, more] = f->list(max_entries, std::nullopt, y);
-                 auto [val, marker] =
-                   decode_entry<std::uint32_t>(result.front());
-                 ASSERT_EQ(4, val);
-                 f->trim(result.back().marker, true, y);
-               }
-               {
-                 auto [result, more] = f->list(max_entries, std::nullopt, y);
-                 auto [val, marker] =
-                   decode_entry<std::uint32_t>(result.front());
-                 ASSERT_EQ(result.size(), 1);
-                 ASSERT_EQ(max_entries - 1, val);
-               }
-             });
-  c.run();
-}
index 5b33597455643ab0c9ddacc39c4a8f6d05f2e5a6..66105947e439986f113d63065104432bde3fe383 100644 (file)
@@ -2612,8 +2612,6 @@ TEST_F(TestClsRbd, group_snap_set_empty_name) {
   librados::IoCtx ioctx;
   ASSERT_EQ(0, _rados.ioctx_create(_pool_name.c_str(), ioctx));
 
   librados::IoCtx ioctx;
   ASSERT_EQ(0, _rados.ioctx_create(_pool_name.c_str(), ioctx));
 
-  string image_id = "image_id_snap_add_emtpy_name";
-
   string group_id = "group_id_snap_add_empty_name";
   ASSERT_EQ(0, ioctx.create(group_id, true));
 
   string group_id = "group_id_snap_add_empty_name";
   ASSERT_EQ(0, ioctx.create(group_id, true));
 
@@ -2626,8 +2624,6 @@ TEST_F(TestClsRbd, group_snap_set_empty_id) {
   librados::IoCtx ioctx;
   ASSERT_EQ(0, _rados.ioctx_create(_pool_name.c_str(), ioctx));
 
   librados::IoCtx ioctx;
   ASSERT_EQ(0, _rados.ioctx_create(_pool_name.c_str(), ioctx));
 
-  string image_id = "image_id_snap_add_empty_id";
-
   string group_id = "group_id_snap_add_empty_id";
   ASSERT_EQ(0, ioctx.create(group_id, true));
 
   string group_id = "group_id_snap_add_empty_id";
   ASSERT_EQ(0, ioctx.create(group_id, true));
 
@@ -2640,8 +2636,6 @@ TEST_F(TestClsRbd, group_snap_set_duplicate_id) {
   librados::IoCtx ioctx;
   ASSERT_EQ(0, _rados.ioctx_create(_pool_name.c_str(), ioctx));
 
   librados::IoCtx ioctx;
   ASSERT_EQ(0, _rados.ioctx_create(_pool_name.c_str(), ioctx));
 
-  string image_id = "image_id_snap_add_duplicate_id";
-
   string group_id = "group_id_snap_add_duplicate_id";
   ASSERT_EQ(0, ioctx.create(group_id, true));
 
   string group_id = "group_id_snap_add_duplicate_id";
   ASSERT_EQ(0, ioctx.create(group_id, true));
 
@@ -2657,8 +2651,6 @@ TEST_F(TestClsRbd, group_snap_set_duplicate_name) {
   librados::IoCtx ioctx;
   ASSERT_EQ(0, _rados.ioctx_create(_pool_name.c_str(), ioctx));
 
   librados::IoCtx ioctx;
   ASSERT_EQ(0, _rados.ioctx_create(_pool_name.c_str(), ioctx));
 
-  string image_id = "image_id_snap_add_duplicate_name";
-
   string group_id = "group_id_snap_add_duplicate_name";
   ASSERT_EQ(0, ioctx.create(group_id, true));
 
   string group_id = "group_id_snap_add_duplicate_name";
   ASSERT_EQ(0, ioctx.create(group_id, true));
 
@@ -2675,8 +2667,6 @@ TEST_F(TestClsRbd, group_snap_set) {
   librados::IoCtx ioctx;
   ASSERT_EQ(0, _rados.ioctx_create(_pool_name.c_str(), ioctx));
 
   librados::IoCtx ioctx;
   ASSERT_EQ(0, _rados.ioctx_create(_pool_name.c_str(), ioctx));
 
-  string image_id = "image_id_snap_add";
-
   string group_id = "group_id_snap_add";
   ASSERT_EQ(0, ioctx.create(group_id, true));
 
   string group_id = "group_id_snap_add";
   ASSERT_EQ(0, ioctx.create(group_id, true));
 
@@ -2698,8 +2688,6 @@ TEST_F(TestClsRbd, group_snap_list) {
   librados::IoCtx ioctx;
   ASSERT_EQ(0, _rados.ioctx_create(_pool_name.c_str(), ioctx));
 
   librados::IoCtx ioctx;
   ASSERT_EQ(0, _rados.ioctx_create(_pool_name.c_str(), ioctx));
 
-  string image_id = "image_id_snap_list";
-
   string group_id = "group_id_snap_list";
   ASSERT_EQ(0, ioctx.create(group_id, true));
 
   string group_id = "group_id_snap_list";
   ASSERT_EQ(0, ioctx.create(group_id, true));
 
@@ -2729,8 +2717,6 @@ TEST_F(TestClsRbd, group_snap_list_max_return) {
   librados::IoCtx ioctx;
   ASSERT_EQ(0, _rados.ioctx_create(_pool_name.c_str(), ioctx));
 
   librados::IoCtx ioctx;
   ASSERT_EQ(0, _rados.ioctx_create(_pool_name.c_str(), ioctx));
 
-  string image_id = "image_id_snap_list_max_return";
-
   string group_id = "group_id_snap_list_max_return";
   ASSERT_EQ(0, ioctx.create(group_id, true));
 
   string group_id = "group_id_snap_list_max_return";
   ASSERT_EQ(0, ioctx.create(group_id, true));
 
@@ -2761,13 +2747,37 @@ TEST_F(TestClsRbd, group_snap_list_max_return) {
   }
 }
 
   }
 }
 
+TEST_F(TestClsRbd, group_snap_list_max_read) {
+  librados::IoCtx ioctx;
+  ASSERT_EQ(0, _rados.ioctx_create(_pool_name.c_str(), ioctx));
+
+  string group_id = "group_id_snap_list_max_read";
+  ASSERT_EQ(0, ioctx.create(group_id, true));
+
+  // 2 * RBD_MAX_KEYS_READ + a few
+  for (int i = 0; i < 150; ++i) {
+    string snap_id = "snap_id" + hexify(i);
+    cls::rbd::GroupSnapshot snap = {snap_id,
+                                    "test_snapshot" + hexify(i),
+                                    cls::rbd::GROUP_SNAPSHOT_STATE_INCOMPLETE};
+    ASSERT_EQ(0, group_snap_set(&ioctx, group_id, snap));
+  }
+
+  std::vector<cls::rbd::GroupSnapshot> snapshots;
+  ASSERT_EQ(0, group_snap_list(&ioctx, group_id, cls::rbd::GroupSnapshot(), 500, &snapshots));
+  ASSERT_EQ(150U, snapshots.size());
+
+  for (int i = 0; i < 150; ++i) {
+    string snap_id = "snap_id" + hexify(i);
+    ASSERT_EQ(snap_id, snapshots[i].id);
+  }
+}
+
 TEST_F(TestClsRbd, group_snap_remove) {
   librados::IoCtx ioctx;
 
   ASSERT_EQ(0, _rados.ioctx_create(_pool_name.c_str(), ioctx));
 
 TEST_F(TestClsRbd, group_snap_remove) {
   librados::IoCtx ioctx;
 
   ASSERT_EQ(0, _rados.ioctx_create(_pool_name.c_str(), ioctx));
 
-  string image_id = "image_id_snap_remove";
-
   string group_id = "group_id_snap_remove";
   ASSERT_EQ(0, ioctx.create(group_id, true));
 
   string group_id = "group_id_snap_remove";
   ASSERT_EQ(0, ioctx.create(group_id, true));
 
@@ -2798,8 +2808,6 @@ TEST_F(TestClsRbd, group_snap_get_by_id) {
 
   ASSERT_EQ(0, _rados.ioctx_create(_pool_name.c_str(), ioctx));
 
 
   ASSERT_EQ(0, _rados.ioctx_create(_pool_name.c_str(), ioctx));
 
-  string image_id = "image_id_snap_get_by_id";
-
   string group_id = "group_id_snap_get_by_id";
   ASSERT_EQ(0, ioctx.create(group_id, true));
 
   string group_id = "group_id_snap_get_by_id";
   ASSERT_EQ(0, ioctx.create(group_id, true));
 
index c37521a248fd18a716187175d6f0f49410c09129..4b9d2d072b836e38b5ba46d57d74b844da8f360f 100644 (file)
@@ -1252,3 +1252,91 @@ TEST_F(cls_rgw, bi_log_trim)
     EXPECT_FALSE(truncated);
   }
 }
     EXPECT_FALSE(truncated);
   }
 }
+
+TEST_F(cls_rgw, index_racing_removes)
+{
+  string bucket_oid = str_int("bucket", 8);
+
+  ObjectWriteOperation op;
+  cls_rgw_bucket_init_index(op);
+  ASSERT_EQ(0, ioctx.operate(bucket_oid, &op));
+
+  int epoch = 0;
+  rgw_bucket_dir_entry dirent;
+  rgw_bucket_dir_entry_meta meta;
+
+  // prepare/complete add for single object
+  const cls_rgw_obj_key obj{"obj"};
+  std::string loc = "loc";
+  {
+    std::string tag = "tag-add";
+    index_prepare(ioctx, bucket_oid, CLS_RGW_OP_ADD, tag, obj, loc);
+    index_complete(ioctx, bucket_oid, CLS_RGW_OP_ADD, tag, ++epoch, obj, meta);
+    test_stats(ioctx, bucket_oid, RGWObjCategory::None, 1, 0);
+  }
+
+  // list to verify no pending ops
+  {
+    std::map<int, rgw_cls_list_ret> results;
+    list_entries(ioctx, bucket_oid, 1, results);
+    ASSERT_EQ(1, results.size());
+    const auto& entries = results.begin()->second.dir.m;
+    ASSERT_EQ(1, entries.size());
+    dirent = std::move(entries.begin()->second);
+    ASSERT_EQ(obj, dirent.key);
+    ASSERT_TRUE(dirent.exists);
+    ASSERT_TRUE(dirent.pending_map.empty());
+  }
+
+  // prepare three racing removals
+  std::string tag1 = "tag-rm1";
+  std::string tag2 = "tag-rm2";
+  std::string tag3 = "tag-rm3";
+  index_prepare(ioctx, bucket_oid, CLS_RGW_OP_DEL, tag1, obj, loc);
+  index_prepare(ioctx, bucket_oid, CLS_RGW_OP_DEL, tag2, obj, loc);
+  index_prepare(ioctx, bucket_oid, CLS_RGW_OP_DEL, tag3, obj, loc);
+
+  test_stats(ioctx, bucket_oid, RGWObjCategory::None, 1, 0);
+
+  // complete on tag2
+  index_complete(ioctx, bucket_oid, CLS_RGW_OP_DEL, tag2, ++epoch, obj, meta);
+  {
+    std::map<int, rgw_cls_list_ret> results;
+    list_entries(ioctx, bucket_oid, 1, results);
+    ASSERT_EQ(1, results.size());
+    const auto& entries = results.begin()->second.dir.m;
+    ASSERT_EQ(1, entries.size());
+    dirent = std::move(entries.begin()->second);
+    ASSERT_EQ(obj, dirent.key);
+    ASSERT_FALSE(dirent.exists);
+    ASSERT_FALSE(dirent.pending_map.empty());
+  }
+
+  // cancel on tag1
+  index_complete(ioctx, bucket_oid, CLS_RGW_OP_CANCEL, tag1, ++epoch, obj, meta);
+  {
+    std::map<int, rgw_cls_list_ret> results;
+    list_entries(ioctx, bucket_oid, 1, results);
+    ASSERT_EQ(1, results.size());
+    const auto& entries = results.begin()->second.dir.m;
+    ASSERT_EQ(1, entries.size());
+    dirent = std::move(entries.begin()->second);
+    ASSERT_EQ(obj, dirent.key);
+    ASSERT_FALSE(dirent.exists);
+    ASSERT_FALSE(dirent.pending_map.empty());
+  }
+
+  // final cancel on tag3
+  index_complete(ioctx, bucket_oid, CLS_RGW_OP_CANCEL, tag3, ++epoch, obj, meta);
+
+  // verify that the key was removed
+  {
+    std::map<int, rgw_cls_list_ret> results;
+    list_entries(ioctx, bucket_oid, 1, results);
+    EXPECT_EQ(1, results.size());
+    const auto& entries = results.begin()->second.dir.m;
+    ASSERT_EQ(0, entries.size());
+  }
+
+  test_stats(ioctx, bucket_oid, RGWObjCategory::None, 0, 0);
+}
index f49290bcdfd404787da66da7abee03b2e4952423..dc4c27905a542f07988f184481d8a8430d04c386 100644 (file)
@@ -22,6 +22,20 @@ if(${WITH_CEPHFS})
   install(TARGETS ceph_test_libcephfs
     DESTINATION ${CMAKE_INSTALL_BINDIR})
 
   install(TARGETS ceph_test_libcephfs
     DESTINATION ${CMAKE_INSTALL_BINDIR})
 
+  add_executable(ceph_test_libcephfs_newops
+    main.cc
+    newops.cc
+  )
+  target_link_libraries(ceph_test_libcephfs_newops
+    ceph-common
+    cephfs
+    ${UNITTEST_LIBS}
+    ${EXTRALIBS}
+    ${CMAKE_DL_LIBS}
+    )
+  install(TARGETS ceph_test_libcephfs_newops
+    DESTINATION ${CMAKE_INSTALL_BINDIR})
+
   add_executable(ceph_test_libcephfs_reclaim
     reclaim.cc
   )
   add_executable(ceph_test_libcephfs_reclaim
     reclaim.cc
   )
index a6c4a65963d92778645610b7d264a9bdde1885bb..2827a9b4b788b613d69b4444cc3161cb204a1255 100644 (file)
@@ -280,6 +280,9 @@ TEST(ACL, DefaultACL) {
 
   free(acl1_buf);
   free(acl2_buf);
 
   free(acl1_buf);
   free(acl2_buf);
+  ASSERT_EQ(ceph_unlink(cmount, test_file1), 0);
+  ASSERT_EQ(ceph_rmdir(cmount, test_dir2), 0);
+  ASSERT_EQ(ceph_rmdir(cmount, test_dir1), 0);
   ceph_close(cmount, fd);
   ceph_shutdown(cmount);
 }
   ceph_close(cmount, fd);
   ceph_shutdown(cmount);
 }
@@ -307,3 +310,54 @@ TEST(ACL, Disabled) {
   free(acl_buf);
   ceph_shutdown(cmount);
 }
   free(acl_buf);
   ceph_shutdown(cmount);
 }
+
+TEST(ACL, SnapdirACL) {
+  struct ceph_mount_info *cmount;
+  ASSERT_EQ(0, ceph_create(&cmount, NULL));
+  ASSERT_EQ(0, ceph_conf_read_file(cmount, NULL));
+  ASSERT_EQ(0, ceph_mount(cmount, "/"));
+  ASSERT_EQ(0, ceph_conf_set(cmount, "client_acl_type", "posix_acl"));
+
+  int acl_buf_size = acl_ea_size(5);
+  void *acl1_buf = malloc(acl_buf_size);
+  void *acl2_buf = malloc(acl_buf_size);
+  void *acl3_buf = malloc(acl_buf_size);
+
+  ASSERT_EQ(generate_test_acl(acl1_buf, acl_buf_size, 0750), 0);
+
+  char test_dir1[256];
+  sprintf(test_dir1, "dir1_acl_default_%d", getpid());
+  ASSERT_EQ(ceph_mkdir(cmount, test_dir1, 0750), 0);
+
+  // set default acl
+  ASSERT_EQ(ceph_setxattr(cmount, test_dir1, ACL_EA_DEFAULT, acl1_buf, acl_buf_size, 0), 0);
+
+  char test_dir2[262];
+  sprintf(test_dir2, "%s/dir2", test_dir1);
+  ASSERT_EQ(ceph_mkdir(cmount, test_dir2, 0755), 0);
+
+  // inherit default acl
+  ASSERT_EQ(ceph_getxattr(cmount, test_dir2, ACL_EA_DEFAULT, acl2_buf, acl_buf_size), acl_buf_size);
+  ASSERT_EQ(memcmp(acl1_buf, acl2_buf, acl_buf_size), 0);
+
+  char test_dir2_snapdir[512];
+  sprintf(test_dir2_snapdir, "%s/dir2/.snap", test_dir1);
+
+  // inherit default acl
+  ASSERT_EQ(ceph_getxattr(cmount, test_dir2_snapdir, ACL_EA_DEFAULT, acl3_buf, acl_buf_size), acl_buf_size);
+  ASSERT_EQ(memcmp(acl2_buf, acl3_buf, acl_buf_size), 0);
+
+  memset(acl2_buf, 0, acl_buf_size);
+  memset(acl3_buf, 0, acl_buf_size);
+
+  ASSERT_EQ(ceph_getxattr(cmount, test_dir2, ACL_EA_ACCESS, acl2_buf, acl_buf_size), acl_buf_size);
+  ASSERT_EQ(ceph_getxattr(cmount, test_dir2_snapdir, ACL_EA_ACCESS, acl3_buf, acl_buf_size), acl_buf_size);
+  ASSERT_EQ(memcmp(acl2_buf, acl3_buf, acl_buf_size), 0);
+
+  free(acl1_buf);
+  free(acl2_buf);
+  free(acl3_buf);
+  ASSERT_EQ(ceph_rmdir(cmount, test_dir2), 0);
+  ASSERT_EQ(ceph_rmdir(cmount, test_dir1), 0);
+  ceph_shutdown(cmount);
+}
diff --git a/ceph/src/test/libcephfs/newops.cc b/ceph/src/test/libcephfs/newops.cc
new file mode 100644 (file)
index 0000000..9897cb8
--- /dev/null
@@ -0,0 +1,86 @@
+// -*- mode:C++; tab-width:8; c-basic-offset:2; indent-tabs-mode:t -*-
+// vim: ts=8 sw=2 smarttab
+/*
+ * Ceph - scalable distributed file system
+ *
+ * Copyright (C) 2021 Red Hat Inc.
+ *
+ * This is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License version 2.1, as published by the Free Software
+ * Foundation.  See file COPYING.
+ *
+ */
+
+#include "gmock/gmock.h"
+#include "gtest/gtest.h"
+#include "gtest/gtest-spi.h"
+#include "gmock/gmock-matchers.h"
+#include "gmock/gmock-more-matchers.h"
+#include "include/compat.h"
+#include "include/cephfs/libcephfs.h"
+#include "mds/mdstypes.h"
+#include "include/stat.h"
+#include <errno.h>
+#include <fcntl.h>
+#include <unistd.h>
+#include <string.h>
+
+#ifdef __linux__
+#include <limits.h>
+#include <sys/xattr.h>
+#endif
+
+#include <fmt/format.h>
+#include <map>
+#include <vector>
+#include <thread>
+#include <regex>
+#include <string>
+
+using ::testing::AnyOf;
+using ::testing::Gt;
+using ::testing::Eq;
+using namespace std;
+
+/*
+ * Test this with different ceph versions
+ */
+
+TEST(LibCephFS, NewOPs)
+{
+  struct ceph_mount_info *cmount;
+  ASSERT_EQ(0, ceph_create(&cmount, NULL));
+  ASSERT_EQ(0, ceph_conf_read_file(cmount, NULL));
+  ASSERT_EQ(0, ceph_conf_parse_env(cmount, NULL));
+  ASSERT_EQ(0, ceph_mount(cmount, "/"));
+
+  const char *test_path = "test_newops_dir";
+
+  ASSERT_EQ(0, ceph_mkdirs(cmount, test_path, 0777));
+
+  {
+    char value[1024] = "";
+    int r = ceph_getxattr(cmount, test_path, "ceph.dir.pin.random", (void*)value, sizeof(value));
+    // Clients will return -ENODATA if new getvxattr op not support yet.
+    EXPECT_THAT(r, AnyOf(Gt(0), Eq(-ENODATA)));
+  }
+
+  {
+    double val = (double)1.0/(double)128.0;
+    std::stringstream ss;
+    ss << val;
+    int r = ceph_setxattr(cmount, test_path, "ceph.dir.pin.random", (void*)ss.str().c_str(), strlen(ss.str().c_str()), XATTR_CREATE);
+    // Old cephs will return -EINVAL if not support "ceph.dir.pin.random" yet.
+    EXPECT_THAT(r, AnyOf(Eq(0), Eq(-EINVAL)));
+
+    char value[1024] = "";
+    r = ceph_getxattr(cmount, test_path, "ceph.dir.pin.random", (void*)value, sizeof(value));
+    // Clients will return -ENODATA if new getvxattr op not support yet.
+    EXPECT_THAT(r, AnyOf(Gt(0), Eq(-ENODATA)));
+  }
+
+  ASSERT_EQ(0, ceph_rmdir(cmount, test_path));
+
+  ceph_shutdown(cmount);
+}
index 585fae104dea452f3572331e66bb77f9b8f8ebff..85ecfb3e508ab38bf0be36b47a871babfc4211fd 100644 (file)
@@ -1870,40 +1870,139 @@ TEST(LibCephFS, ChangeAttr) {
   ceph_shutdown(cmount);
 }
 
   ceph_shutdown(cmount);
 }
 
-TEST(LibCephFS, DirChangeAttr) {
+TEST(LibCephFS, DirChangeAttrCreateFile) {
   struct ceph_mount_info *cmount;
   ASSERT_EQ(ceph_create(&cmount, NULL), 0);
   ASSERT_EQ(ceph_conf_read_file(cmount, NULL), 0);
   ASSERT_EQ(0, ceph_conf_parse_env(cmount, NULL));
   ASSERT_EQ(ceph_mount(cmount, "/"), 0);
 
   struct ceph_mount_info *cmount;
   ASSERT_EQ(ceph_create(&cmount, NULL), 0);
   ASSERT_EQ(ceph_conf_read_file(cmount, NULL), 0);
   ASSERT_EQ(0, ceph_conf_parse_env(cmount, NULL));
   ASSERT_EQ(ceph_mount(cmount, "/"), 0);
 
-  char dirname[32], filename[56];
-  sprintf(dirname, "/dirchange%x", getpid());
-  sprintf(filename, "%s/foo", dirname);
+  char dirpath[32], filepath[56];
+  sprintf(dirpath, "/dirchange%x", getpid());
+  sprintf(filepath, "%s/foo", dirpath);
 
 
-  ASSERT_EQ(ceph_mkdir(cmount, dirname, 0755), 0);
+  ASSERT_EQ(ceph_mkdir(cmount, dirpath, 0755), 0);
 
   struct ceph_statx    stx;
 
   struct ceph_statx    stx;
-  ASSERT_EQ(ceph_statx(cmount, dirname, &stx, CEPH_STATX_VERSION, 0), 0);
+  ASSERT_EQ(ceph_statx(cmount, dirpath, &stx, CEPH_STATX_VERSION, 0), 0);
   ASSERT_TRUE(stx.stx_mask & CEPH_STATX_VERSION);
 
   uint64_t old_change_attr = stx.stx_version;
 
   ASSERT_TRUE(stx.stx_mask & CEPH_STATX_VERSION);
 
   uint64_t old_change_attr = stx.stx_version;
 
-  int fd = ceph_open(cmount, filename, O_RDWR|O_CREAT|O_EXCL, 0666);
+  /* Important: Follow an operation that changes the directory's ctime (setxattr)
+   * with one that changes the directory's mtime and ctime (create).
+   * Check that directory's change_attr is updated everytime ctime changes.
+   */
+
+  /* set xattr on dir, and check whether dir's change_attr is incremented */
+  ASSERT_EQ(ceph_setxattr(cmount, dirpath, "user.name", (void*)"bob", 3, XATTR_CREATE), 0);
+  ASSERT_EQ(ceph_statx(cmount, dirpath, &stx, CEPH_STATX_VERSION, 0), 0);
+  ASSERT_TRUE(stx.stx_mask & CEPH_STATX_VERSION);
+  ASSERT_GT(stx.stx_version, old_change_attr);
+  old_change_attr = stx.stx_version;
+
+  /* create a file within dir, and check whether dir's change_attr is incremented */
+  int fd = ceph_open(cmount, filepath, O_RDWR|O_CREAT|O_EXCL, 0666);
   ASSERT_LT(0, fd);
   ceph_close(cmount, fd);
   ASSERT_LT(0, fd);
   ceph_close(cmount, fd);
+  ASSERT_EQ(ceph_statx(cmount, dirpath, &stx, CEPH_STATX_VERSION, 0), 0);
+  ASSERT_TRUE(stx.stx_mask & CEPH_STATX_VERSION);
+  ASSERT_GT(stx.stx_version, old_change_attr);
+
+  ASSERT_EQ(0, ceph_unlink(cmount, filepath));
+  ASSERT_EQ(0, ceph_rmdir(cmount, dirpath));
+  ceph_shutdown(cmount);
+}
 
 
-  ASSERT_EQ(ceph_statx(cmount, dirname, &stx, CEPH_STATX_VERSION, 0), 0);
+TEST(LibCephFS, DirChangeAttrRenameFile) {
+  struct ceph_mount_info *cmount;
+  ASSERT_EQ(ceph_create(&cmount, NULL), 0);
+  ASSERT_EQ(ceph_conf_read_file(cmount, NULL), 0);
+  ASSERT_EQ(0, ceph_conf_parse_env(cmount, NULL));
+  ASSERT_EQ(ceph_mount(cmount, "/"), 0);
+
+  char dirpath[32], filepath[56], newfilepath[56];
+  sprintf(dirpath, "/dirchange%x", getpid());
+  sprintf(filepath, "%s/foo", dirpath);
+
+  ASSERT_EQ(ceph_mkdir(cmount, dirpath, 0755), 0);
+
+  int fd = ceph_open(cmount, filepath, O_RDWR|O_CREAT|O_EXCL, 0666);
+  ASSERT_LT(0, fd);
+  ceph_close(cmount, fd);
+
+  /* Important: Follow an operation that changes the directory's ctime (setattr)
+   * with one that changes the directory's mtime and ctime (rename).
+   * Check that directory's change_attr is updated everytime ctime changes.
+   */
+  struct ceph_statx    stx;
+  ASSERT_EQ(ceph_statx(cmount, dirpath, &stx, CEPH_STATX_VERSION, 0), 0);
   ASSERT_TRUE(stx.stx_mask & CEPH_STATX_VERSION);
   ASSERT_TRUE(stx.stx_mask & CEPH_STATX_VERSION);
-  ASSERT_NE(stx.stx_version, old_change_attr);
 
 
+  uint64_t old_change_attr = stx.stx_version;
+
+  /* chmod dir, and check whether dir's change_attr is incremented */
+  ASSERT_EQ(ceph_chmod(cmount, dirpath, 0777), 0);
+  ASSERT_EQ(ceph_statx(cmount, dirpath, &stx, CEPH_STATX_VERSION, 0), 0);
+  ASSERT_TRUE(stx.stx_mask & CEPH_STATX_VERSION);
+  ASSERT_GT(stx.stx_version, old_change_attr);
   old_change_attr = stx.stx_version;
 
   old_change_attr = stx.stx_version;
 
-  ASSERT_EQ(ceph_unlink(cmount, filename), 0);
-  ASSERT_EQ(ceph_statx(cmount, dirname, &stx, CEPH_STATX_VERSION, 0), 0);
+  /* rename a file within dir, and check whether dir's change_attr is incremented */
+  sprintf(newfilepath, "%s/bar", dirpath);
+  ASSERT_EQ(ceph_rename(cmount, filepath, newfilepath), 0);
+  ASSERT_EQ(ceph_statx(cmount, dirpath, &stx, CEPH_STATX_VERSION, 0), 0);
   ASSERT_TRUE(stx.stx_mask & CEPH_STATX_VERSION);
   ASSERT_TRUE(stx.stx_mask & CEPH_STATX_VERSION);
-  ASSERT_NE(stx.stx_version, old_change_attr);
+  ASSERT_GT(stx.stx_version, old_change_attr);
 
 
+  ASSERT_EQ(0, ceph_unlink(cmount, newfilepath));
+  ASSERT_EQ(0, ceph_rmdir(cmount, dirpath));
+  ceph_shutdown(cmount);
+}
+
+TEST(LibCephFS, DirChangeAttrRemoveFile) {
+  struct ceph_mount_info *cmount;
+  ASSERT_EQ(ceph_create(&cmount, NULL), 0);
+  ASSERT_EQ(ceph_conf_read_file(cmount, NULL), 0);
+  ASSERT_EQ(0, ceph_conf_parse_env(cmount, NULL));
+  ASSERT_EQ(ceph_mount(cmount, "/"), 0);
+
+  char dirpath[32], filepath[56];
+  sprintf(dirpath, "/dirchange%x", getpid());
+  sprintf(filepath, "%s/foo", dirpath);
+
+  ASSERT_EQ(ceph_mkdir(cmount, dirpath, 0755), 0);
+
+  ASSERT_EQ(ceph_setxattr(cmount, dirpath, "user.name", (void*)"bob", 3, XATTR_CREATE), 0);
+
+  int fd = ceph_open(cmount, filepath, O_RDWR|O_CREAT|O_EXCL, 0666);
+  ASSERT_LT(0, fd);
+  ceph_close(cmount, fd);
+
+  /* Important: Follow an operation that changes the directory's ctime (removexattr)
+   * with one that changes the directory's mtime and ctime (remove a file).
+   * Check that directory's change_attr is updated everytime ctime changes.
+   */
+  struct ceph_statx    stx;
+  ASSERT_EQ(ceph_statx(cmount, dirpath, &stx, CEPH_STATX_VERSION, 0), 0);
+  ASSERT_TRUE(stx.stx_mask & CEPH_STATX_VERSION);
+
+  uint64_t old_change_attr = stx.stx_version;
+
+  /* remove xattr, and check whether dir's change_attr is incremented */
+  ASSERT_EQ(ceph_removexattr(cmount, dirpath, "user.name"), 0);
+  ASSERT_EQ(ceph_statx(cmount, dirpath, &stx, CEPH_STATX_VERSION, 0), 0);
+  ASSERT_TRUE(stx.stx_mask & CEPH_STATX_VERSION);
+  ASSERT_GT(stx.stx_version, old_change_attr);
+  old_change_attr = stx.stx_version;
+
+  /* remove a file within dir, and check whether dir's change_attr is incremented */
+  ASSERT_EQ(0, ceph_unlink(cmount, filepath));
+  ASSERT_EQ(ceph_statx(cmount, dirpath, &stx, CEPH_STATX_VERSION, 0), 0);
+  ASSERT_TRUE(stx.stx_mask & CEPH_STATX_VERSION);
+  ASSERT_GT(stx.stx_version, old_change_attr);
+
+  ASSERT_EQ(0, ceph_rmdir(cmount, dirpath));
   ceph_shutdown(cmount);
 }
 
   ceph_shutdown(cmount);
 }
 
@@ -3576,3 +3675,66 @@ TEST(LibCephFS, SetMountTimeout) {
 
   ceph_shutdown(cmount);
 }
 
   ceph_shutdown(cmount);
 }
+
+TEST(LibCephFS, SnapdirAttrs) {
+  struct ceph_mount_info *cmount;
+  ASSERT_EQ(ceph_create(&cmount, NULL), 0);
+  ASSERT_EQ(ceph_conf_read_file(cmount, NULL), 0);
+  ASSERT_EQ(0, ceph_conf_parse_env(cmount, NULL));
+  ASSERT_EQ(ceph_mount(cmount, NULL), 0);
+
+  char dir_name[128];
+  char dir_path[256];
+  char snap_dir_path[512];
+
+  pid_t mypid = getpid();
+  sprintf(dir_name, "dir_%d", mypid);
+  sprintf(dir_path, "/%s", dir_name);
+  sprintf(snap_dir_path, "%s/.snap", dir_path);
+
+  Inode *dir, *root;
+  struct ceph_statx stx_dir;
+  struct ceph_statx stx_snap_dir;
+  UserPerm *perms = ceph_mount_perms(cmount);
+
+  ASSERT_EQ(ceph_ll_lookup_root(cmount, &root), 0);
+  ASSERT_EQ(ceph_ll_mkdir(cmount, root, dir_name, 0755, &dir, &stx_dir, 0, 0, perms), 0);
+
+  ASSERT_EQ(ceph_statx(cmount, dir_path, &stx_dir,
+                       CEPH_STATX_MTIME|CEPH_STATX_ATIME|CEPH_STATX_MODE|CEPH_STATX_MODE|CEPH_STATX_GID|CEPH_STATX_VERSION, 0), 0);
+  ASSERT_EQ(ceph_statx(cmount, snap_dir_path, &stx_snap_dir,
+                       CEPH_STATX_MTIME|CEPH_STATX_ATIME|CEPH_STATX_MODE|CEPH_STATX_MODE|CEPH_STATX_GID|CEPH_STATX_VERSION, 0), 0);
+
+  ASSERT_EQ(utime_t(stx_dir.stx_atime), utime_t(stx_snap_dir.stx_atime));
+  ASSERT_EQ(utime_t(stx_dir.stx_mtime), utime_t(stx_snap_dir.stx_mtime));
+  ASSERT_EQ(stx_dir.stx_mode, stx_snap_dir.stx_mode);
+  ASSERT_EQ(stx_dir.stx_uid, stx_snap_dir.stx_uid);
+  ASSERT_EQ(stx_dir.stx_gid, stx_snap_dir.stx_gid);
+  ASSERT_EQ(stx_dir.stx_version, stx_snap_dir.stx_version);
+
+  // chown  -- for this we need to be "root"
+  UserPerm *rootcred = ceph_userperm_new(0, 0, 0, NULL);
+  ASSERT_TRUE(rootcred);
+  stx_dir.stx_uid++;
+  stx_dir.stx_gid++;
+  ASSERT_EQ(ceph_ll_setattr(cmount, dir, &stx_dir, CEPH_SETATTR_UID|CEPH_SETATTR_GID, rootcred), 0);
+
+  memset(&stx_dir, 0, sizeof(stx_dir));
+  memset(&stx_snap_dir, 0, sizeof(stx_snap_dir));
+
+  ASSERT_EQ(ceph_statx(cmount, dir_path, &stx_dir,
+                       CEPH_STATX_MTIME|CEPH_STATX_ATIME|CEPH_STATX_MODE|CEPH_STATX_MODE|CEPH_STATX_GID|CEPH_STATX_VERSION, 0), 0);
+  ASSERT_EQ(ceph_statx(cmount, snap_dir_path, &stx_snap_dir,
+                       CEPH_STATX_MTIME|CEPH_STATX_ATIME|CEPH_STATX_MODE|CEPH_STATX_MODE|CEPH_STATX_GID|CEPH_STATX_VERSION, 0), 0);
+
+  ASSERT_EQ(utime_t(stx_dir.stx_atime), utime_t(stx_snap_dir.stx_atime));
+  ASSERT_EQ(utime_t(stx_dir.stx_mtime), utime_t(stx_snap_dir.stx_mtime));
+  ASSERT_EQ(stx_dir.stx_mode, stx_snap_dir.stx_mode);
+  ASSERT_EQ(stx_dir.stx_uid, stx_snap_dir.stx_uid);
+  ASSERT_EQ(stx_dir.stx_gid, stx_snap_dir.stx_gid);
+  ASSERT_EQ(stx_dir.stx_version, stx_snap_dir.stx_version);
+
+  ASSERT_EQ(ceph_ll_rmdir(cmount, root, dir_name, rootcred), 0);
+  ASSERT_EQ(0, ceph_unmount(cmount));
+  ceph_shutdown(cmount);
+}
index d1390bcf85d85eeae893a75c75eb84cf270bf81a..190aec028ff0920173b7f73c5a5a9bc120718fbb 100644 (file)
@@ -18,6 +18,10 @@ struct MockTestImageCtx;
 struct MockTestJournal : public MockJournal {
   MOCK_METHOD4(append_write_event, uint64_t(uint64_t, size_t,
                                             const bufferlist &, bool));
 struct MockTestJournal : public MockJournal {
   MOCK_METHOD4(append_write_event, uint64_t(uint64_t, size_t,
                                             const bufferlist &, bool));
+  MOCK_METHOD5(append_compare_and_write_event, uint64_t(uint64_t, size_t,
+                                                        const bufferlist &,
+                                                        const bufferlist &,
+                                                        bool));
   MOCK_METHOD5(append_io_event_mock, uint64_t(const journal::EventEntry&,
                                               uint64_t, size_t, bool, int));
   uint64_t append_io_event(journal::EventEntry &&event_entry,
   MOCK_METHOD5(append_io_event_mock, uint64_t(const journal::EventEntry&,
                                               uint64_t, size_t, bool, int));
   uint64_t append_io_event(journal::EventEntry &&event_entry,
@@ -111,6 +115,12 @@ struct TestMockIoImageRequest : public TestMockFixture {
     }
   }
 
     }
   }
 
+  void expect_journal_append_io_event(MockTestJournal &mock_journal, uint64_t journal_tid,
+                                      uint64_t offset, size_t length) {
+    EXPECT_CALL(mock_journal, append_io_event_mock(_, offset, length, _, _))
+      .WillOnce(Return(journal_tid));
+  }
+
   void expect_object_discard_request(MockTestImageCtx &mock_image_ctx,
                                      uint64_t object_no, uint64_t offset,
                                      uint32_t length, int r) {
   void expect_object_discard_request(MockTestImageCtx &mock_image_ctx,
                                      uint64_t object_no, uint64_t offset,
                                      uint32_t length, int r) {
@@ -358,6 +368,169 @@ TEST_F(TestMockIoImageRequest, DiscardGranularity) {
   ASSERT_EQ(0, aio_comp_ctx.wait());
 }
 
   ASSERT_EQ(0, aio_comp_ctx.wait());
 }
 
+TEST_F(TestMockIoImageRequest, PartialDiscardJournalAppendEnabled) {
+  REQUIRE_FEATURE(RBD_FEATURE_JOURNALING);
+
+  librbd::ImageCtx *ictx;
+  ASSERT_EQ(0, open_image(m_image_name, &ictx));
+  ictx->discard_granularity_bytes = 0;
+
+  MockTestImageCtx mock_image_ctx(*ictx);
+  MockTestJournal mock_journal;
+  mock_image_ctx.journal = &mock_journal;
+
+  InSequence seq;
+  expect_get_modify_timestamp(mock_image_ctx, false);
+  expect_is_journal_appending(mock_journal, true);
+  expect_journal_append_io_event(mock_journal, 0, 16, 63);
+  expect_journal_append_io_event(mock_journal, 1, 84, 100);
+  expect_object_discard_request(mock_image_ctx, 0, 16, 63, 0);
+  expect_object_discard_request(mock_image_ctx, 0, 84, 100, 0);
+
+  C_SaferCond aio_comp_ctx;
+  AioCompletion *aio_comp = AioCompletion::create_and_start(
+    &aio_comp_ctx, ictx, AIO_TYPE_DISCARD);
+  MockImageDiscardRequest mock_aio_image_discard(
+    mock_image_ctx, aio_comp, {{16, 63}, {84, 100}},
+    ictx->discard_granularity_bytes, mock_image_ctx.get_data_io_context(), {});
+  {
+    std::shared_lock owner_locker{mock_image_ctx.owner_lock};
+    mock_aio_image_discard.send();
+  }
+  ASSERT_EQ(0, aio_comp_ctx.wait());
+}
+
+TEST_F(TestMockIoImageRequest, TailDiscardJournalAppendEnabled) {
+  REQUIRE_FEATURE(RBD_FEATURE_JOURNALING);
+
+  librbd::ImageCtx *ictx;
+  ASSERT_EQ(0, open_image(m_image_name, &ictx));
+  ASSERT_EQ(0, resize(ictx, ictx->layout.object_size));
+  ictx->discard_granularity_bytes = 2 * ictx->layout.object_size;
+
+  MockTestImageCtx mock_image_ctx(*ictx);
+  MockTestJournal mock_journal;
+  mock_image_ctx.journal = &mock_journal;
+
+  InSequence seq;
+  expect_get_modify_timestamp(mock_image_ctx, false);
+  expect_is_journal_appending(mock_journal, true);
+  expect_journal_append_io_event(
+    mock_journal, 0, ictx->layout.object_size - 1024, 1024);
+  expect_object_discard_request(
+    mock_image_ctx, 0, ictx->layout.object_size - 1024, 1024, 0);
+
+  C_SaferCond aio_comp_ctx;
+  AioCompletion *aio_comp = AioCompletion::create_and_start(
+    &aio_comp_ctx, ictx, AIO_TYPE_DISCARD);
+  MockImageDiscardRequest mock_aio_image_discard(
+    mock_image_ctx, aio_comp, {{ictx->layout.object_size - 1024, 1024}},
+    ictx->discard_granularity_bytes, mock_image_ctx.get_data_io_context(), {});
+  {
+    std::shared_lock owner_locker{mock_image_ctx.owner_lock};
+    mock_aio_image_discard.send();
+  }
+  ASSERT_EQ(0, aio_comp_ctx.wait());
+}
+
+TEST_F(TestMockIoImageRequest, PruneRequiredDiscardJournalAppendEnabled) {
+  REQUIRE_FEATURE(RBD_FEATURE_JOURNALING);
+
+  librbd::ImageCtx *ictx;
+  ASSERT_EQ(0, open_image(m_image_name, &ictx));
+  ictx->discard_granularity_bytes = 32;
+
+  MockTestImageCtx mock_image_ctx(*ictx);
+  MockTestJournal mock_journal;
+  mock_image_ctx.journal = &mock_journal;
+
+  InSequence seq;
+  expect_get_modify_timestamp(mock_image_ctx, false);
+  expect_is_journal_appending(mock_journal, true);
+  EXPECT_CALL(mock_journal, append_io_event_mock(_, _, _, _, _)).Times(0);
+  EXPECT_CALL(*mock_image_ctx.io_object_dispatcher, send(_)).Times(0);
+
+  C_SaferCond aio_comp_ctx;
+  AioCompletion *aio_comp = AioCompletion::create_and_start(
+    &aio_comp_ctx, ictx, AIO_TYPE_DISCARD);
+  MockImageDiscardRequest mock_aio_image_discard(
+    mock_image_ctx, aio_comp, {{96, 31}}, ictx->discard_granularity_bytes,
+    mock_image_ctx.get_data_io_context(), {});
+  {
+    std::shared_lock owner_locker{mock_image_ctx.owner_lock};
+    mock_aio_image_discard.send();
+  }
+  ASSERT_EQ(0, aio_comp_ctx.wait());
+}
+
+TEST_F(TestMockIoImageRequest, LengthModifiedDiscardJournalAppendEnabled) {
+  REQUIRE_FEATURE(RBD_FEATURE_JOURNALING);
+
+  librbd::ImageCtx *ictx;
+  ASSERT_EQ(0, open_image(m_image_name, &ictx));
+  ictx->discard_granularity_bytes = 32;
+
+  MockTestImageCtx mock_image_ctx(*ictx);
+  MockTestJournal mock_journal;
+  mock_image_ctx.journal = &mock_journal;
+
+  InSequence seq;
+  expect_get_modify_timestamp(mock_image_ctx, false);
+  expect_is_journal_appending(mock_journal, true);
+  expect_journal_append_io_event(mock_journal, 0, 32, 32);
+  expect_object_discard_request(mock_image_ctx, 0, 32, 32, 0);
+
+  C_SaferCond aio_comp_ctx;
+  AioCompletion *aio_comp = AioCompletion::create_and_start(
+    &aio_comp_ctx, ictx, AIO_TYPE_DISCARD);
+  MockImageDiscardRequest mock_aio_image_discard(
+    mock_image_ctx, aio_comp, {{16, 63}}, ictx->discard_granularity_bytes,
+    mock_image_ctx.get_data_io_context(), {});
+  {
+    std::shared_lock owner_locker{mock_image_ctx.owner_lock};
+    mock_aio_image_discard.send();
+  }
+  ASSERT_EQ(0, aio_comp_ctx.wait());
+}
+
+TEST_F(TestMockIoImageRequest, DiscardGranularityJournalAppendEnabled) {
+  REQUIRE_FEATURE(RBD_FEATURE_JOURNALING);
+
+  librbd::ImageCtx *ictx;
+  ASSERT_EQ(0, open_image(m_image_name, &ictx));
+  ASSERT_EQ(0, resize(ictx, ictx->layout.object_size));
+  ictx->discard_granularity_bytes = 32;
+
+  MockTestImageCtx mock_image_ctx(*ictx);
+  MockTestJournal mock_journal;
+  mock_image_ctx.journal = &mock_journal;
+
+  InSequence seq;
+  expect_get_modify_timestamp(mock_image_ctx, false);
+  expect_is_journal_appending(mock_journal, true);
+  expect_journal_append_io_event(mock_journal, 0, 32, 32);
+  expect_journal_append_io_event(mock_journal, 1, 96, 64);
+  expect_journal_append_io_event(
+    mock_journal, 2, ictx->layout.object_size - 32, 32);
+  expect_object_discard_request(mock_image_ctx, 0, 32, 32, 0);
+  expect_object_discard_request(mock_image_ctx, 0, 96, 64, 0);
+  expect_object_discard_request(
+    mock_image_ctx, 0, ictx->layout.object_size - 32, 32, 0);
+
+  C_SaferCond aio_comp_ctx;
+  AioCompletion *aio_comp = AioCompletion::create_and_start(
+    &aio_comp_ctx, ictx, AIO_TYPE_DISCARD);
+  MockImageDiscardRequest mock_aio_image_discard(
+    mock_image_ctx, aio_comp,
+    {{16, 63}, {96, 31}, {84, 100}, {ictx->layout.object_size - 33, 33}},
+    ictx->discard_granularity_bytes, mock_image_ctx.get_data_io_context(), {});
+  {
+    std::shared_lock owner_locker{mock_image_ctx.owner_lock};
+    mock_aio_image_discard.send();
+  }
+  ASSERT_EQ(0, aio_comp_ctx.wait());
+}
+
 TEST_F(TestMockIoImageRequest, AioWriteJournalAppendDisabled) {
   REQUIRE_FEATURE(RBD_FEATURE_JOURNALING);
 
 TEST_F(TestMockIoImageRequest, AioWriteJournalAppendDisabled) {
   REQUIRE_FEATURE(RBD_FEATURE_JOURNALING);
 
index 61b0d7ebd8e82e89c2997a281c005e7b71b01d81..29d4a06ffd16a77f5a02aaf81a1c9417a16761a6 100644 (file)
@@ -712,13 +712,16 @@ public:
 
     ASSERT_PASSED(write_test_data, image, zero_data, 0, TEST_IO_SIZE,
                   LIBRADOS_OP_FLAG_FADVISE_NOCACHE);
 
     ASSERT_PASSED(write_test_data, image, zero_data, 0, TEST_IO_SIZE,
                   LIBRADOS_OP_FLAG_FADVISE_NOCACHE);
+    mismatch_offset = 123;
     ASSERT_EQ(-EILSEQ, rbd_compare_and_write(image, 0, TEST_IO_SIZE,
               mismatch_data, mismatch_data, &mismatch_offset, 0));
     ASSERT_EQ(0U, mismatch_offset);
     rbd_aio_create_completion(NULL, (rbd_callback_t) simple_read_cb, &comp);
     ASSERT_EQ(-EILSEQ, rbd_compare_and_write(image, 0, TEST_IO_SIZE,
               mismatch_data, mismatch_data, &mismatch_offset, 0));
     ASSERT_EQ(0U, mismatch_offset);
     rbd_aio_create_completion(NULL, (rbd_callback_t) simple_read_cb, &comp);
+    mismatch_offset = 123;
     ASSERT_EQ(0, rbd_aio_compare_and_write(image, 0, TEST_IO_SIZE, mismatch_data,
               mismatch_data, comp, &mismatch_offset, 0));
     ASSERT_EQ(0, rbd_aio_wait_for_complete(comp));
     ASSERT_EQ(0, rbd_aio_compare_and_write(image, 0, TEST_IO_SIZE, mismatch_data,
               mismatch_data, comp, &mismatch_offset, 0));
     ASSERT_EQ(0, rbd_aio_wait_for_complete(comp));
+    ASSERT_EQ(-EILSEQ, rbd_aio_get_return_value(comp));
     ASSERT_EQ(0U, mismatch_offset);
     rbd_aio_release(comp);
 
     ASSERT_EQ(0U, mismatch_offset);
     rbd_aio_release(comp);
 
@@ -2458,13 +2461,16 @@ TEST_F(TestLibRBD, TestIOWithIOHint)
   rbd_aio_release(comp);
 
   ASSERT_PASSED(write_test_data, image, zero_data, 0, TEST_IO_SIZE, LIBRADOS_OP_FLAG_FADVISE_NOCACHE);
   rbd_aio_release(comp);
 
   ASSERT_PASSED(write_test_data, image, zero_data, 0, TEST_IO_SIZE, LIBRADOS_OP_FLAG_FADVISE_NOCACHE);
+  mismatch_offset = 123;
   ASSERT_EQ(-EILSEQ, rbd_compare_and_write(image, 0, TEST_IO_SIZE, mismatch_data, mismatch_data,
                                            &mismatch_offset, LIBRADOS_OP_FLAG_FADVISE_DONTNEED));
   ASSERT_EQ(0U, mismatch_offset);
   rbd_aio_create_completion(NULL, (rbd_callback_t) simple_read_cb, &comp);
   ASSERT_EQ(-EILSEQ, rbd_compare_and_write(image, 0, TEST_IO_SIZE, mismatch_data, mismatch_data,
                                            &mismatch_offset, LIBRADOS_OP_FLAG_FADVISE_DONTNEED));
   ASSERT_EQ(0U, mismatch_offset);
   rbd_aio_create_completion(NULL, (rbd_callback_t) simple_read_cb, &comp);
+  mismatch_offset = 123;
   ASSERT_EQ(0, rbd_aio_compare_and_write(image, 0, TEST_IO_SIZE, mismatch_data, mismatch_data,
                                          comp, &mismatch_offset, LIBRADOS_OP_FLAG_FADVISE_DONTNEED));
   ASSERT_EQ(0, rbd_aio_wait_for_complete(comp));
   ASSERT_EQ(0, rbd_aio_compare_and_write(image, 0, TEST_IO_SIZE, mismatch_data, mismatch_data,
                                          comp, &mismatch_offset, LIBRADOS_OP_FLAG_FADVISE_DONTNEED));
   ASSERT_EQ(0, rbd_aio_wait_for_complete(comp));
+  ASSERT_EQ(-EILSEQ, rbd_aio_get_return_value(comp));
   ASSERT_EQ(0U, mismatch_offset);
   rbd_aio_release(comp);
 
   ASSERT_EQ(0U, mismatch_offset);
   rbd_aio_release(comp);
 
@@ -2574,7 +2580,7 @@ TEST_F(TestLibRBD, TestDataPoolIO)
   rados_ioctx_destroy(ioctx);
 }
 
   rados_ioctx_destroy(ioctx);
 }
 
-TEST_F(TestLibRBD, TestScatterGatherIO)
+TEST_F(TestLibRBD, TestCompareAndWriteMismatch)
 {
   rados_ioctx_t ioctx;
   rados_ioctx_create(_cluster, m_pool_name.c_str(), &ioctx);
 {
   rados_ioctx_t ioctx;
   rados_ioctx_create(_cluster, m_pool_name.c_str(), &ioctx);
@@ -2582,65 +2588,83 @@ TEST_F(TestLibRBD, TestScatterGatherIO)
   rbd_image_t image;
   int order = 0;
   std::string name = get_temp_image_name();
   rbd_image_t image;
   int order = 0;
   std::string name = get_temp_image_name();
-  uint64_t size = 20 << 20;
+  uint64_t size = 20 << 20; /* 20MiB */
+  off_t off = 512;
 
   ASSERT_EQ(0, create_image(ioctx, name.c_str(), size, &order));
   ASSERT_EQ(0, rbd_open(ioctx, name.c_str(), &image, NULL));
 
 
   ASSERT_EQ(0, create_image(ioctx, name.c_str(), size, &order));
   ASSERT_EQ(0, rbd_open(ioctx, name.c_str(), &image, NULL));
 
-  std::string write_buffer("This is a test");
-  // These iovecs should produce a length overflow
-  struct iovec bad_iovs[] = {
-    {.iov_base = &write_buffer[0], .iov_len = 5},
-    {.iov_base = NULL, .iov_len = std::numeric_limits<size_t>::max()}
-  };
-  struct iovec write_iovs[] = {
-    {.iov_base = &write_buffer[0],  .iov_len = 5},
-    {.iov_base = &write_buffer[5],  .iov_len = 3},
-    {.iov_base = &write_buffer[8],  .iov_len = 2},
-    {.iov_base = &write_buffer[10], .iov_len = 4}
-  };
+  // We only support to compare and write the same amount of (len) bytes
+  std::string cmp_buffer("This is a test");
+  std::string write_buffer("Write this !!!");
+  std::string mismatch_buffer("This will fail");
+  std::string read_buffer(cmp_buffer.length(), '1');
+
+  ssize_t written = rbd_write(image, off, cmp_buffer.length(),
+                              cmp_buffer.data());
+  ASSERT_EQ(cmp_buffer.length(), written);
+
+  // Compare should fail because of mismatch
+  uint64_t mismatch_off = 0;
+  written = rbd_compare_and_write(image, off, write_buffer.length(),
+                                  mismatch_buffer.data(), write_buffer.data(),
+                                  &mismatch_off, 0);
+  ASSERT_EQ(-EILSEQ, written);
+  ASSERT_EQ(5U, mismatch_off);
+
+  // check nothing was written
+  ssize_t read = rbd_read(image, off, read_buffer.length(), read_buffer.data());
+  ASSERT_EQ(read_buffer.length(), read);
+  ASSERT_EQ(cmp_buffer, read_buffer);
 
 
-  rbd_completion_t comp;
-  rbd_aio_create_completion(NULL, NULL, &comp);
-  ASSERT_EQ(-EINVAL, rbd_aio_writev(image, write_iovs, 0, 0, comp));
-  ASSERT_EQ(-EINVAL, rbd_aio_writev(image, bad_iovs, 2, 0, comp));
-  ASSERT_EQ(0, rbd_aio_writev(image, write_iovs,
-                              sizeof(write_iovs) / sizeof(struct iovec),
-                              1<<order, comp));
-  ASSERT_EQ(0, rbd_aio_wait_for_complete(comp));
-  ASSERT_EQ(0, rbd_aio_get_return_value(comp));
-  rbd_aio_release(comp);
+  ASSERT_PASSED(validate_object_map, image);
+  ASSERT_EQ(0, rbd_close(image));
 
 
-  std::string read_buffer(write_buffer.size(), '1');
-  struct iovec read_iovs[] = {
-    {.iov_base = &read_buffer[0],  .iov_len = 4},
-    {.iov_base = &read_buffer[8],  .iov_len = 4},
-    {.iov_base = &read_buffer[12], .iov_len = 2}
-  };
+  rados_ioctx_destroy(ioctx);
+}
 
 
-  rbd_aio_create_completion(NULL, NULL, &comp);
-  ASSERT_EQ(-EINVAL, rbd_aio_readv(image, read_iovs, 0, 0, comp));
-  ASSERT_EQ(-EINVAL, rbd_aio_readv(image, bad_iovs, 2, 0, comp));
-  ASSERT_EQ(0, rbd_aio_readv(image, read_iovs,
-                             sizeof(read_iovs) / sizeof(struct iovec),
-                             1<<order, comp));
-  ASSERT_EQ(0, rbd_aio_wait_for_complete(comp));
-  ASSERT_EQ(10, rbd_aio_get_return_value(comp));
-  rbd_aio_release(comp);
-  ASSERT_EQ("This1111 is a ", read_buffer);
+TEST_F(TestLibRBD, TestAioCompareAndWriteMismatch)
+{
+  rados_ioctx_t ioctx;
+  rados_ioctx_create(_cluster, m_pool_name.c_str(), &ioctx);
 
 
-  std::string linear_buffer(write_buffer.size(), '1');
-  struct iovec linear_iovs[] = {
-    {.iov_base = &linear_buffer[4], .iov_len = 4}
-  };
+  rbd_image_t image;
+  int order = 0;
+  std::string name = get_temp_image_name();
+  uint64_t size = 20 << 20; /* 20MiB */
+  off_t off = 512;
+
+  ASSERT_EQ(0, create_image(ioctx, name.c_str(), size, &order));
+  ASSERT_EQ(0, rbd_open(ioctx, name.c_str(), &image, NULL));
+
+  // We only support to compare and write the same amount of (len) bytes
+  std::string cmp_buffer("This is a test");
+  std::string write_buffer("Write this !!!");
+  std::string mismatch_buffer("This will fail");
+  std::string read_buffer(cmp_buffer.length(), '1');
+
+  ssize_t written = rbd_write(image, off, cmp_buffer.length(),
+                              cmp_buffer.data());
+  ASSERT_EQ(cmp_buffer.length(), written);
+
+  // Compare should fail because of mismatch
+  rbd_completion_t comp;
   rbd_aio_create_completion(NULL, NULL, &comp);
   rbd_aio_create_completion(NULL, NULL, &comp);
-  ASSERT_EQ(0, rbd_aio_readv(image, linear_iovs,
-                             sizeof(linear_iovs) / sizeof(struct iovec),
-                             1<<order, comp));
+  uint64_t mismatch_off = 0;
+  int ret = rbd_aio_compare_and_write(image, off, write_buffer.length(),
+                                      mismatch_buffer.data(),
+                                      write_buffer.data(), comp,
+                                      &mismatch_off, 0);
+  ASSERT_EQ(0, ret);
   ASSERT_EQ(0, rbd_aio_wait_for_complete(comp));
   ASSERT_EQ(0, rbd_aio_wait_for_complete(comp));
-  ASSERT_EQ(4, rbd_aio_get_return_value(comp));
+  ASSERT_EQ(-EILSEQ, rbd_aio_get_return_value(comp));
+  ASSERT_EQ(5U, mismatch_off);
   rbd_aio_release(comp);
   rbd_aio_release(comp);
-  ASSERT_EQ("1111This111111", linear_buffer);
+
+  // check nothing was written
+  ssize_t read = rbd_read(image, off, read_buffer.length(), read_buffer.data());
+  ASSERT_EQ(read_buffer.length(), read);
+  ASSERT_EQ(cmp_buffer, read_buffer);
 
   ASSERT_PASSED(validate_object_map, image);
   ASSERT_EQ(0, rbd_close(image));
 
   ASSERT_PASSED(validate_object_map, image);
   ASSERT_EQ(0, rbd_close(image));
@@ -2648,7 +2672,7 @@ TEST_F(TestLibRBD, TestScatterGatherIO)
   rados_ioctx_destroy(ioctx);
 }
 
   rados_ioctx_destroy(ioctx);
 }
 
-TEST_F(TestLibRBD, TestEmptyDiscard)
+TEST_F(TestLibRBD, TestCompareAndWriteSuccess)
 {
   rados_ioctx_t ioctx;
   rados_ioctx_create(_cluster, m_pool_name.c_str(), &ioctx);
 {
   rados_ioctx_t ioctx;
   rados_ioctx_create(_cluster, m_pool_name.c_str(), &ioctx);
@@ -2656,14 +2680,35 @@ TEST_F(TestLibRBD, TestEmptyDiscard)
   rbd_image_t image;
   int order = 0;
   std::string name = get_temp_image_name();
   rbd_image_t image;
   int order = 0;
   std::string name = get_temp_image_name();
-  uint64_t size = 20 << 20;
+  uint64_t size = 20 << 20; /* 20MiB */
+  off_t off = 512;
 
   ASSERT_EQ(0, create_image(ioctx, name.c_str(), size, &order));
   ASSERT_EQ(0, rbd_open(ioctx, name.c_str(), &image, NULL));
 
 
   ASSERT_EQ(0, create_image(ioctx, name.c_str(), size, &order));
   ASSERT_EQ(0, rbd_open(ioctx, name.c_str(), &image, NULL));
 
-  ASSERT_PASSED(aio_discard_test_data, image, 0, 1*1024*1024);
-  ASSERT_PASSED(aio_discard_test_data, image, 0, 4*1024*1024);
-  ASSERT_PASSED(aio_discard_test_data, image, 3*1024*1024, 1*1024*1024);
+  // We only support to compare and write the same amount of (len) bytes
+  std::string cmp_buffer("This is a test");
+  std::string write_buffer("Write this !!!");
+  std::string read_buffer(cmp_buffer.length(), '1');
+
+  ssize_t written = rbd_write(image, off, cmp_buffer.length(),
+                              cmp_buffer.data());
+  ASSERT_EQ(cmp_buffer.length(), written);
+
+  /*
+   * we compare against the written buffer (cmp_buffer) and write the buffer
+   * We expect: len bytes written
+   */
+  uint64_t mismatch_off = 0;
+  written = rbd_compare_and_write(image, off, write_buffer.length(),
+                                  cmp_buffer.data(), write_buffer.data(),
+                                  &mismatch_off, 0);
+  ASSERT_EQ(write_buffer.length(), written);
+  ASSERT_EQ(0U, mismatch_off);
+
+  ssize_t read = rbd_read(image, off, read_buffer.length(), read_buffer.data());
+  ASSERT_EQ(read_buffer.length(), read);
+  ASSERT_EQ(write_buffer, read_buffer);
 
   ASSERT_PASSED(validate_object_map, image);
   ASSERT_EQ(0, rbd_close(image));
 
   ASSERT_PASSED(validate_object_map, image);
   ASSERT_EQ(0, rbd_close(image));
@@ -2671,113 +2716,761 @@ TEST_F(TestLibRBD, TestEmptyDiscard)
   rados_ioctx_destroy(ioctx);
 }
 
   rados_ioctx_destroy(ioctx);
 }
 
-TEST_F(TestLibRBD, TestFUA)
+TEST_F(TestLibRBD, TestAioCompareAndWriteSuccess)
 {
   rados_ioctx_t ioctx;
   rados_ioctx_create(_cluster, m_pool_name.c_str(), &ioctx);
 
 {
   rados_ioctx_t ioctx;
   rados_ioctx_create(_cluster, m_pool_name.c_str(), &ioctx);
 
-  rbd_image_t image_write;
-  rbd_image_t image_read;
+  rbd_image_t image;
   int order = 0;
   std::string name = get_temp_image_name();
   int order = 0;
   std::string name = get_temp_image_name();
-  uint64_t size = 2 << 20;
+  uint64_t size = 20 << 20; /* 20MiB */
+  off_t off = 512;
 
   ASSERT_EQ(0, create_image(ioctx, name.c_str(), size, &order));
 
   ASSERT_EQ(0, create_image(ioctx, name.c_str(), size, &order));
-  ASSERT_EQ(0, rbd_open(ioctx, name.c_str(), &image_write, NULL));
-  ASSERT_EQ(0, rbd_open(ioctx, name.c_str(), &image_read, NULL));
-
-  // enable writeback cache
-  rbd_flush(image_write);
+  ASSERT_EQ(0, rbd_open(ioctx, name.c_str(), &image, NULL));
 
 
-  char test_data[TEST_IO_SIZE + 1];
-  int i;
+  // We only support to compare and write the same amount of (len) bytes
+  std::string cmp_buffer("This is a test");
+  std::string write_buffer("Write this !!!");
+  std::string read_buffer(cmp_buffer.length(), '1');
 
 
-  for (i = 0; i < TEST_IO_SIZE; ++i) {
-    test_data[i] = (char) (rand() % (126 - 33) + 33);
-  }
-  test_data[TEST_IO_SIZE] = '\0';
-  for (i = 0; i < 5; ++i)
-    ASSERT_PASSED(write_test_data, image_write, test_data,
-                  TEST_IO_SIZE * i, TEST_IO_SIZE, LIBRADOS_OP_FLAG_FADVISE_FUA);
+  ssize_t written = rbd_write(image, off, cmp_buffer.length(),
+                              cmp_buffer.data());
+  ASSERT_EQ(cmp_buffer.length(), written);
 
 
-  for (i = 0; i < 5; ++i)
-    ASSERT_PASSED(read_test_data, image_read, test_data,
-                  TEST_IO_SIZE * i, TEST_IO_SIZE, 0);
+  /*
+   * we compare against the written buffer (cmp_buffer) and write the buffer
+   * We expect: len bytes written
+   */
+  rbd_completion_t comp;
+  rbd_aio_create_completion(NULL, NULL, &comp);
+  uint64_t mismatch_off = 0;
+  int ret = rbd_aio_compare_and_write(image, off, write_buffer.length(),
+                                      cmp_buffer.data(), write_buffer.data(),
+                                      comp, &mismatch_off, 0);
+  ASSERT_EQ(0, ret);
+  ASSERT_EQ(0, rbd_aio_wait_for_complete(comp));
+  ASSERT_EQ(0, rbd_aio_get_return_value(comp));
+  ASSERT_EQ(0U, mismatch_off);
+  rbd_aio_release(comp);
 
 
-  for (i = 5; i < 10; ++i)
-    ASSERT_PASSED(aio_write_test_data, image_write, test_data,
-                  TEST_IO_SIZE * i, TEST_IO_SIZE, LIBRADOS_OP_FLAG_FADVISE_FUA);
+  ssize_t read = rbd_read(image, off, read_buffer.length(), read_buffer.data());
+  ASSERT_EQ(read_buffer.length(), read);
+  ASSERT_EQ(write_buffer, read_buffer);
 
 
-  for (i = 5; i < 10; ++i)
-    ASSERT_PASSED(aio_read_test_data, image_read, test_data,
-                  TEST_IO_SIZE * i, TEST_IO_SIZE, 0);
+  ASSERT_PASSED(validate_object_map, image);
+  ASSERT_EQ(0, rbd_close(image));
 
 
-  ASSERT_PASSED(validate_object_map, image_write);
-  ASSERT_PASSED(validate_object_map, image_read);
-  ASSERT_EQ(0, rbd_close(image_write));
-  ASSERT_EQ(0, rbd_close(image_read));
-  ASSERT_EQ(0, rbd_remove(ioctx, name.c_str()));
   rados_ioctx_destroy(ioctx);
 }
 
   rados_ioctx_destroy(ioctx);
 }
 
-void simple_write_cb_pp(librbd::completion_t cb, void *arg)
+
+TEST_F(TestLibRBD, TestCompareAndWriteStripeUnitUnaligned)
 {
 {
-  cout << "write completion cb called!" << std::endl;
+  REQUIRE(!is_rbd_pwl_enabled((CephContext *)_rados.cct()));
+
+  rados_ioctx_t ioctx;
+  rados_ioctx_create(_cluster, m_pool_name.c_str(), &ioctx);
+
+  rbd_image_t image;
+  int order = 0;
+  std::string name = get_temp_image_name();
+  uint64_t size = 20 << 20; /* 20MiB */
+
+  ASSERT_EQ(0, create_image(ioctx, name.c_str(), size, &order));
+  ASSERT_EQ(0, rbd_open(ioctx, name.c_str(), &image, NULL));
+
+  // large write test => we allow stripe unit size writes (aligned)
+  uint64_t stripe_unit;
+  rbd_get_stripe_unit(image, &stripe_unit);
+  std::string large_write_buffer(stripe_unit, '2');
+  std::string large_cmp_buffer(stripe_unit * 2, '4');
+
+  ssize_t written = rbd_write(image, stripe_unit, large_cmp_buffer.length(),
+                              large_cmp_buffer.data());
+  ASSERT_EQ(large_cmp_buffer.length(), written);
+
+  /*
+    * compare and write at offset stripe_unit + 1 and stripe unit size
+    * Expect fail because access exceeds stripe (unaligned)
+    */
+  uint64_t mismatch_off = 0;
+  written = rbd_compare_and_write(image, stripe_unit + 1, stripe_unit,
+                                  large_cmp_buffer.data(),
+                                  large_write_buffer.data(),
+                                  &mismatch_off, 0);
+  ASSERT_EQ(-EINVAL, written);
+  ASSERT_EQ(0U, mismatch_off);
+
+  // check nothing has been written
+  std::string large_read_buffer(large_cmp_buffer.length(), '5');
+  ssize_t read = rbd_read(image, stripe_unit, large_read_buffer.length(),
+                          large_read_buffer.data());
+  ASSERT_EQ(large_read_buffer.length(), read);
+  auto buffer_mismatch = std::mismatch(large_cmp_buffer.begin(),
+                                       large_cmp_buffer.end(),
+                                       large_read_buffer.begin());
+  ASSERT_EQ(large_read_buffer.end(), buffer_mismatch.second);
+
+  ASSERT_PASSED(validate_object_map, image);
+  ASSERT_EQ(0, rbd_close(image));
+
+  rados_ioctx_destroy(ioctx);
 }
 
 }
 
-void simple_read_cb_pp(librbd::completion_t cb, void *arg)
+TEST_F(TestLibRBD, TestAioCompareAndWriteStripeUnitUnaligned)
 {
 {
-  cout << "read completion cb called!" << std::endl;
+  REQUIRE(!is_rbd_pwl_enabled((CephContext *)_rados.cct()));
+
+  rados_ioctx_t ioctx;
+  rados_ioctx_create(_cluster, m_pool_name.c_str(), &ioctx);
+
+  rbd_image_t image;
+  int order = 0;
+  std::string name = get_temp_image_name();
+  uint64_t size = 20 << 20; /* 20MiB */
+
+  ASSERT_EQ(0, create_image(ioctx, name.c_str(), size, &order));
+  ASSERT_EQ(0, rbd_open(ioctx, name.c_str(), &image, NULL));
+
+  // large write test => we allow stripe unit size writes (aligned)
+  uint64_t stripe_unit;
+  rbd_get_stripe_unit(image, &stripe_unit);
+  std::string large_write_buffer(stripe_unit, '2');
+  std::string large_cmp_buffer(stripe_unit * 2, '4');
+
+  ssize_t written = rbd_write(image, stripe_unit, large_cmp_buffer.length(),
+                              large_cmp_buffer.data());
+  ASSERT_EQ(large_cmp_buffer.length(), written);
+
+  /*
+    * compare and write at offset stripe_unit + 1 and stripe unit size
+    * Expect fail because access spans stripe unit boundary (unaligned)
+    */
+  rbd_completion_t comp;
+  rbd_aio_create_completion(NULL, NULL, &comp);
+  uint64_t mismatch_off = 0;
+  int ret = rbd_aio_compare_and_write(image, stripe_unit + 1, stripe_unit,
+                                      large_cmp_buffer.data(),
+                                      large_write_buffer.data(),
+                                      comp, &mismatch_off, 0);
+  ASSERT_EQ(0, ret);
+  ASSERT_EQ(0, rbd_aio_wait_for_complete(comp));
+  ASSERT_EQ(-EINVAL, rbd_aio_get_return_value(comp));
+  ASSERT_EQ(0U, mismatch_off);
+  rbd_aio_release(comp);
+
+  // check nothing has been written
+  std::string large_read_buffer(large_cmp_buffer.length(), '5');
+  ssize_t read = rbd_read(image, stripe_unit, large_read_buffer.length(),
+                          large_read_buffer.data());
+  ASSERT_EQ(large_read_buffer.length(), read);
+  auto buffer_mismatch = std::mismatch(large_cmp_buffer.begin(),
+                                       large_cmp_buffer.end(),
+                                       large_read_buffer.begin());
+  ASSERT_EQ(large_read_buffer.end(), buffer_mismatch.second);
+
+  ASSERT_PASSED(validate_object_map, image);
+  ASSERT_EQ(0, rbd_close(image));
+
+  rados_ioctx_destroy(ioctx);
 }
 
 }
 
-void aio_write_test_data(librbd::Image& image, const char *test_data,
-                        off_t off, uint32_t iohint, bool *passed)
+TEST_F(TestLibRBD, TestCompareAndWriteTooLarge)
 {
 {
-  ceph::bufferlist bl;
-  bl.append(test_data, strlen(test_data));
-  librbd::RBD::AioCompletion *comp = new librbd::RBD::AioCompletion(NULL, (librbd::callback_t) simple_write_cb_pp);
-  printf("created completion\n");
-  if (iohint)
-    image.aio_write2(off, strlen(test_data), bl, comp, iohint);
-  else
-    image.aio_write(off, strlen(test_data), bl, comp);
-  printf("started write\n");
-  comp->wait_for_complete();
-  int r = comp->get_return_value();
-  printf("return value is: %d\n", r);
-  ASSERT_EQ(0, r);
-  printf("finished write\n");
-  comp->release();
-  *passed = true;
+  REQUIRE(!is_rbd_pwl_enabled((CephContext *)_rados.cct()));
+
+  rados_ioctx_t ioctx;
+  rados_ioctx_create(_cluster, m_pool_name.c_str(), &ioctx);
+
+  rbd_image_t image;
+  int order = 0;
+  std::string name = get_temp_image_name();
+  uint64_t size = 20 << 20; /* 20MiB */
+
+  ASSERT_EQ(0, create_image(ioctx, name.c_str(), size, &order));
+  ASSERT_EQ(0, rbd_open(ioctx, name.c_str(), &image, NULL));
+
+  // large write test => we allow stripe unit size writes (aligned)
+  uint64_t stripe_unit;
+  rbd_get_stripe_unit(image, &stripe_unit);
+  std::string large_write_buffer(stripe_unit * 2, '2');
+  std::string large_cmp_buffer(large_write_buffer.length(), '4');
+
+  ssize_t written = rbd_write(image, stripe_unit, large_cmp_buffer.length(),
+                              large_cmp_buffer.data());
+  ASSERT_EQ(large_cmp_buffer.length(), written);
+
+  /*
+    * compare and write at offset stripe_unit and stripe unit size + 1
+    * Expect fail because access is larger than stripe unit size
+    */
+  uint64_t mismatch_off = 0;
+  written = rbd_compare_and_write(image, stripe_unit, stripe_unit + 1,
+                                  large_cmp_buffer.data(),
+                                  large_write_buffer.data(),
+                                  &mismatch_off, 0);
+  ASSERT_EQ(-EINVAL, written);
+  ASSERT_EQ(0U, mismatch_off);
+
+  // check nothing has been written
+  std::string large_read_buffer(large_cmp_buffer.length(), '5');
+  ssize_t read = rbd_read(image, stripe_unit, large_read_buffer.length(),
+                          large_read_buffer.data());
+  ASSERT_EQ(large_read_buffer.length(), read);
+  auto buffer_mismatch = std::mismatch(large_cmp_buffer.begin(),
+                                       large_cmp_buffer.end(),
+                                       large_read_buffer.begin());
+  ASSERT_EQ(large_read_buffer.end(), buffer_mismatch.second);
+
+  ASSERT_PASSED(validate_object_map, image);
+  ASSERT_EQ(0, rbd_close(image));
+
+  rados_ioctx_destroy(ioctx);
 }
 
 }
 
-void aio_discard_test_data(librbd::Image& image, off_t off, size_t len, bool *passed)
+TEST_F(TestLibRBD, TestAioCompareAndWriteTooLarge)
 {
 {
-  librbd::RBD::AioCompletion *comp = new librbd::RBD::AioCompletion(NULL, (librbd::callback_t) simple_write_cb_pp);
-  image.aio_discard(off, len, comp);
-  comp->wait_for_complete();
-  int r = comp->get_return_value();
-  ASSERT_EQ(0, r);
-  comp->release();
-  *passed = true;
+  REQUIRE(!is_rbd_pwl_enabled((CephContext *)_rados.cct()));
+
+  rados_ioctx_t ioctx;
+  rados_ioctx_create(_cluster, m_pool_name.c_str(), &ioctx);
+
+  rbd_image_t image;
+  int order = 0;
+  std::string name = get_temp_image_name();
+  uint64_t size = 20 << 20; /* 20MiB */
+
+  ASSERT_EQ(0, create_image(ioctx, name.c_str(), size, &order));
+  ASSERT_EQ(0, rbd_open(ioctx, name.c_str(), &image, NULL));
+
+  // large write test => we allow stripe unit size writes (aligned)
+  uint64_t stripe_unit;
+  rbd_get_stripe_unit(image, &stripe_unit);
+  std::string large_write_buffer(stripe_unit * 2, '2');
+  std::string large_cmp_buffer(large_write_buffer.length(), '4');
+
+  ssize_t written = rbd_write(image, stripe_unit, large_cmp_buffer.length(),
+                              large_cmp_buffer.data());
+  ASSERT_EQ(large_cmp_buffer.length(), written);
+
+  /*
+    * compare and write at offset stripe_unit and stripe unit size + 1
+    * Expect fail because access is larger than stripe unit size
+    */
+  rbd_completion_t comp;
+  rbd_aio_create_completion(NULL, NULL, &comp);
+  uint64_t mismatch_off = 0;
+  int ret = rbd_aio_compare_and_write(image, stripe_unit, stripe_unit + 1,
+                                      large_cmp_buffer.data(),
+                                      large_write_buffer.data(),
+                                      comp, &mismatch_off, 0);
+  ASSERT_EQ(0, ret);
+  ASSERT_EQ(0, rbd_aio_wait_for_complete(comp));
+  ASSERT_EQ(-EINVAL, rbd_aio_get_return_value(comp));
+  ASSERT_EQ(0U, mismatch_off);
+  rbd_aio_release(comp);
+
+  // check nothing has been written
+  std::string large_read_buffer(large_cmp_buffer.length(), '5');
+  ssize_t read = rbd_read(image, stripe_unit, large_read_buffer.length(),
+                          large_read_buffer.data());
+  ASSERT_EQ(large_read_buffer.length(), read);
+  auto buffer_mismatch = std::mismatch(large_cmp_buffer.begin(),
+                                       large_cmp_buffer.end(),
+                                       large_read_buffer.begin());
+  ASSERT_EQ(large_read_buffer.end(), buffer_mismatch.second);
+
+  ASSERT_PASSED(validate_object_map, image);
+  ASSERT_EQ(0, rbd_close(image));
+
+  rados_ioctx_destroy(ioctx);
 }
 
 }
 
-void write_test_data(librbd::Image& image, const char *test_data, off_t off, uint32_t iohint, bool *passed)
+TEST_F(TestLibRBD, TestCompareAndWriteStripeUnitSuccess)
 {
 {
-  size_t written;
-  size_t len = strlen(test_data);
-  ceph::bufferlist bl;
-  bl.append(test_data, len);
-  if (iohint)
-    written = image.write2(off, len, bl, iohint);
-  else
-    written = image.write(off, len, bl);
-  printf("wrote: %u\n", (unsigned int) written);
-  ASSERT_EQ(bl.length(), written);
-  *passed = true;
+  rados_ioctx_t ioctx;
+  rados_ioctx_create(_cluster, m_pool_name.c_str(), &ioctx);
+
+  rbd_image_t image;
+  int order = 0;
+  std::string name = get_temp_image_name();
+  uint64_t size = 20 << 20; /* 20MiB */
+
+  ASSERT_EQ(0, create_image(ioctx, name.c_str(), size, &order));
+  ASSERT_EQ(0, rbd_open(ioctx, name.c_str(), &image, NULL));
+
+  // large write test => we allow stripe unit size writes (aligned)
+  uint64_t stripe_unit;
+  rbd_get_stripe_unit(image, &stripe_unit);
+  std::string large_write_buffer(stripe_unit, '2');
+  std::string large_cmp_buffer(stripe_unit * 2, '4');
+
+  ssize_t written = rbd_write(image, stripe_unit, large_cmp_buffer.length(),
+                              large_cmp_buffer.data());
+  ASSERT_EQ(large_cmp_buffer.length(), written);
+
+  // aligned stripe unit size access => expect success
+  uint64_t mismatch_off = 0;
+  written = rbd_compare_and_write(image, stripe_unit, stripe_unit,
+                                  large_cmp_buffer.data(),
+                                  large_write_buffer.data(),
+                                  &mismatch_off, 0);
+  ASSERT_EQ(stripe_unit, written);
+  ASSERT_EQ(0U, mismatch_off);
+
+  // check stripe_unit bytes of large_write_buffer were written
+  std::string large_read_buffer(large_cmp_buffer.length(), '5');
+  ssize_t read = rbd_read(image, stripe_unit, large_read_buffer.length(),
+                          large_read_buffer.data());
+  ASSERT_EQ(large_read_buffer.length(), read);
+  auto buffer_mismatch = std::mismatch(large_read_buffer.begin(),
+                                       large_read_buffer.begin() + stripe_unit,
+                                       large_write_buffer.begin());
+  ASSERT_EQ(large_write_buffer.end(), buffer_mismatch.second);
+  // check data beyond stripe_unit size was not overwritten
+  buffer_mismatch = std::mismatch(large_read_buffer.begin() + stripe_unit,
+                                  large_read_buffer.end(),
+                                  large_cmp_buffer.begin());
+  ASSERT_EQ(large_cmp_buffer.begin() + stripe_unit, buffer_mismatch.second);
+
+  ASSERT_PASSED(validate_object_map, image);
+  ASSERT_EQ(0, rbd_close(image));
+
+  rados_ioctx_destroy(ioctx);
 }
 
 }
 
-void discard_test_data(librbd::Image& image, off_t off, size_t len, bool *passed)
+TEST_F(TestLibRBD, TestAioCompareAndWriteStripeUnitSuccess)
+{
+  rados_ioctx_t ioctx;
+  rados_ioctx_create(_cluster, m_pool_name.c_str(), &ioctx);
+
+  rbd_image_t image;
+  int order = 0;
+  std::string name = get_temp_image_name();
+  uint64_t size = 20 << 20; /* 20MiB */
+
+  ASSERT_EQ(0, create_image(ioctx, name.c_str(), size, &order));
+  ASSERT_EQ(0, rbd_open(ioctx, name.c_str(), &image, NULL));
+
+  // large write test => we allow stripe unit size writes (aligned)
+  uint64_t stripe_unit;
+  rbd_get_stripe_unit(image, &stripe_unit);
+  std::string large_write_buffer(stripe_unit, '2');
+  std::string large_cmp_buffer(stripe_unit * 2, '4');
+
+  ssize_t written = rbd_write(image, stripe_unit, large_cmp_buffer.length(),
+                              large_cmp_buffer.data());
+  ASSERT_EQ(large_cmp_buffer.length(), written);
+
+  // aligned stripe unit size access => expect success
+  rbd_completion_t comp;
+  rbd_aio_create_completion(NULL, NULL, &comp);
+  uint64_t mismatch_off = 0;
+  int ret = rbd_aio_compare_and_write(image, stripe_unit, stripe_unit,
+                                      large_cmp_buffer.data(),
+                                      large_write_buffer.data(),
+                                      comp, &mismatch_off, 0);
+  ASSERT_EQ(0, ret);
+  ASSERT_EQ(0, rbd_aio_wait_for_complete(comp));
+  ASSERT_EQ(0, rbd_aio_get_return_value(comp));
+  ASSERT_EQ(0U, mismatch_off);
+  rbd_aio_release(comp);
+
+  // check stripe_unit bytes of large_write_buffer were written
+  std::string large_read_buffer(large_cmp_buffer.length(), '5');
+  ssize_t read = rbd_read(image, stripe_unit, large_read_buffer.length(),
+                          large_read_buffer.data());
+  ASSERT_EQ(large_read_buffer.length(), read);
+  auto buffer_mismatch = std::mismatch(large_read_buffer.begin(),
+                                       large_read_buffer.begin() + stripe_unit,
+                                       large_write_buffer.begin());
+  ASSERT_EQ(large_write_buffer.end(), buffer_mismatch.second);
+  // check data beyond stripe_unit size was not overwritten
+  buffer_mismatch = std::mismatch(large_read_buffer.begin() + stripe_unit,
+                                  large_read_buffer.end(),
+                                  large_cmp_buffer.begin());
+  ASSERT_EQ(large_cmp_buffer.begin() + stripe_unit, buffer_mismatch.second);
+
+  ASSERT_PASSED(validate_object_map, image);
+  ASSERT_EQ(0, rbd_close(image));
+
+  rados_ioctx_destroy(ioctx);
+}
+
+TEST_F(TestLibRBD, TestAioCompareAndWriteVIovecLenDiffers)
+{
+  rados_ioctx_t ioctx;
+  rados_ioctx_create(_cluster, m_pool_name.c_str(), &ioctx);
+
+  rbd_image_t image;
+  int order = 0;
+  std::string name = get_temp_image_name();
+  uint64_t size = 20 << 20; /* 20MiB */
+  off_t off = 512;
+
+  ASSERT_EQ(0, create_image(ioctx, name.c_str(), size, &order));
+  ASSERT_EQ(0, rbd_open(ioctx, name.c_str(), &image, NULL));
+
+  std::string cmp_buffer("This is a test");
+  size_t cmp_len = cmp_buffer.length();
+
+  std::string write_buffer("Write this !!!");
+  struct iovec write_iovs[] = {
+    {.iov_base = &write_buffer[0], .iov_len = 6},
+    {.iov_base = &write_buffer[6], .iov_len = 5},
+    {.iov_base = &write_buffer[11], .iov_len = 3}
+  };
+
+  ASSERT_EQ(cmp_len, rbd_write(image, off, cmp_len, cmp_buffer.data()));
+
+  // should fail because compare iovec len cannot be different to write iovec len
+  rbd_completion_t comp;
+  rbd_aio_create_completion(NULL, NULL, &comp);
+  uint64_t mismatch_off = 0;
+  int ret = rbd_aio_compare_and_writev(image, off,
+                                       write_iovs /* cmp_iovs */, 1,
+                                       write_iovs, std::size(write_iovs),
+                                       comp, &mismatch_off, 0);
+  ASSERT_EQ(-EINVAL, ret);
+  ASSERT_EQ(0U, mismatch_off);
+  rbd_aio_release(comp);
+
+  // check nothing was written
+  std::string read_buffer(cmp_buffer.length(), '1');
+  ssize_t read = rbd_read(image, off, read_buffer.length(), read_buffer.data());
+  ASSERT_EQ(read_buffer.length(), read);
+  ASSERT_EQ(cmp_buffer, read_buffer);
+
+  ASSERT_PASSED(validate_object_map, image);
+  ASSERT_EQ(0, rbd_close(image));
+
+  rados_ioctx_destroy(ioctx);
+}
+
+TEST_F(TestLibRBD, TestAioCompareAndWriteVMismatch)
+{
+  rados_ioctx_t ioctx;
+  rados_ioctx_create(_cluster, m_pool_name.c_str(), &ioctx);
+
+  rbd_image_t image;
+  int order = 0;
+  std::string name = get_temp_image_name();
+  uint64_t size = 20 << 20; /* 20MiB */
+  off_t off = 512;
+
+  ASSERT_EQ(0, create_image(ioctx, name.c_str(), size, &order));
+  ASSERT_EQ(0, rbd_open(ioctx, name.c_str(), &image, NULL));
+
+  std::string cmp_buffer("This is a test");
+  int cmp_len = cmp_buffer.length();
+
+  std::string write_buffer("Write this !!!");
+  struct iovec write_iovs[] = {
+    {.iov_base = &write_buffer[0], .iov_len = 6},
+    {.iov_base = &write_buffer[6], .iov_len = 5},
+    {.iov_base = &write_buffer[11], .iov_len = 3}
+  };
+
+  std::string mismatch_buffer("This will fail");
+  struct iovec mismatch_iovs[] = {
+    {.iov_base = &mismatch_buffer[0], .iov_len = 5},
+    {.iov_base = &mismatch_buffer[5], .iov_len = 5},
+    {.iov_base = &mismatch_buffer[10], .iov_len = 4}
+  };
+
+  ASSERT_EQ(cmp_len, rbd_write(image, off, cmp_len, cmp_buffer.data()));
+
+  // this should execute the compare but fail because of mismatch
+  rbd_completion_t comp;
+  rbd_aio_create_completion(NULL, NULL, &comp);
+  uint64_t mismatch_off = 0;
+  int ret = rbd_aio_compare_and_writev(image, off,
+                                       mismatch_iovs /* cmp_iovs */,
+                                       std::size(mismatch_iovs),
+                                       write_iovs, std::size(write_iovs),
+                                       comp, &mismatch_off, 0);
+  ASSERT_EQ(0, ret);
+  ASSERT_EQ(0, rbd_aio_wait_for_complete(comp));
+  ASSERT_EQ(-EILSEQ, rbd_aio_get_return_value(comp));
+  ASSERT_EQ(5U, mismatch_off);
+  rbd_aio_release(comp);
+
+  // check nothing was written
+  std::string read_buffer(cmp_buffer.length(), '1');
+  ssize_t read = rbd_read(image, off, read_buffer.length(), read_buffer.data());
+  ASSERT_EQ(read_buffer.length(), read);
+  ASSERT_EQ(cmp_buffer, read_buffer);
+
+  ASSERT_PASSED(validate_object_map, image);
+  ASSERT_EQ(0, rbd_close(image));
+
+  rados_ioctx_destroy(ioctx);
+}
+
+TEST_F(TestLibRBD, TestAioCompareAndWriteVSuccess)
+{
+  rados_ioctx_t ioctx;
+  rados_ioctx_create(_cluster, m_pool_name.c_str(), &ioctx);
+
+  rbd_image_t image;
+  int order = 0;
+  std::string name = get_temp_image_name();
+  uint64_t size = 20 << 20; /* 20MiB */
+  off_t off = 512;
+
+  ASSERT_EQ(0, create_image(ioctx, name.c_str(), size, &order));
+  ASSERT_EQ(0, rbd_open(ioctx, name.c_str(), &image, NULL));
+
+  std::string cmp_buffer("This is a test");
+  struct iovec cmp_iovs[] = {
+    {.iov_base = &cmp_buffer[0], .iov_len = 5},
+    {.iov_base = &cmp_buffer[5], .iov_len = 3},
+    {.iov_base = &cmp_buffer[8], .iov_len = 2},
+    {.iov_base = &cmp_buffer[10], .iov_len = 4}
+  };
+  size_t cmp_len = cmp_buffer.length();
+
+  std::string write_buffer("Write this !!!");
+  struct iovec write_iovs[] = {
+    {.iov_base = &write_buffer[0], .iov_len = 6},
+    {.iov_base = &write_buffer[6], .iov_len = 5},
+    {.iov_base = &write_buffer[11], .iov_len = 3}
+  };
+
+  ASSERT_EQ(cmp_len, rbd_write(image, off, cmp_len, cmp_buffer.data()));
+
+  // compare against the buffer written before => should succeed
+  rbd_completion_t comp;
+  rbd_aio_create_completion(NULL, NULL, &comp);
+  uint64_t mismatch_off = 0;
+  int ret = rbd_aio_compare_and_writev(image, off,
+                                       cmp_iovs, std::size(cmp_iovs),
+                                       write_iovs, std::size(write_iovs),
+                                       comp, &mismatch_off, 0);
+  ASSERT_EQ(0, ret);
+  ASSERT_EQ(0, rbd_aio_wait_for_complete(comp));
+  ASSERT_EQ(0, rbd_aio_get_return_value(comp));
+  ASSERT_EQ(0U, mismatch_off);
+  rbd_aio_release(comp);
+
+  // check data was successfully written
+  std::string read_buffer(cmp_buffer.length(), '1');
+  ssize_t read = rbd_read(image, off, read_buffer.length(), read_buffer.data());
+  ASSERT_EQ(read_buffer.length(), read);
+  ASSERT_EQ(write_buffer, read_buffer);
+
+  ASSERT_PASSED(validate_object_map, image);
+  ASSERT_EQ(0, rbd_close(image));
+
+  rados_ioctx_destroy(ioctx);
+}
+
+TEST_F(TestLibRBD, TestScatterGatherIO)
+{
+  rados_ioctx_t ioctx;
+  rados_ioctx_create(_cluster, m_pool_name.c_str(), &ioctx);
+
+  rbd_image_t image;
+  int order = 0;
+  std::string name = get_temp_image_name();
+  uint64_t size = 20 << 20;
+
+  ASSERT_EQ(0, create_image(ioctx, name.c_str(), size, &order));
+  ASSERT_EQ(0, rbd_open(ioctx, name.c_str(), &image, NULL));
+
+  std::string write_buffer("This is a test");
+  // These iovecs should produce a length overflow
+  struct iovec bad_iovs[] = {
+    {.iov_base = &write_buffer[0], .iov_len = 5},
+    {.iov_base = NULL, .iov_len = std::numeric_limits<size_t>::max()}
+  };
+  struct iovec write_iovs[] = {
+    {.iov_base = &write_buffer[0],  .iov_len = 5},
+    {.iov_base = &write_buffer[5],  .iov_len = 3},
+    {.iov_base = &write_buffer[8],  .iov_len = 2},
+    {.iov_base = &write_buffer[10], .iov_len = 4}
+  };
+
+  rbd_completion_t comp;
+  rbd_aio_create_completion(NULL, NULL, &comp);
+  ASSERT_EQ(-EINVAL, rbd_aio_writev(image, write_iovs, 0, 0, comp));
+  ASSERT_EQ(-EINVAL, rbd_aio_writev(image, bad_iovs, 2, 0, comp));
+  ASSERT_EQ(0, rbd_aio_writev(image, write_iovs,
+                              sizeof(write_iovs) / sizeof(struct iovec),
+                              1<<order, comp));
+  ASSERT_EQ(0, rbd_aio_wait_for_complete(comp));
+  ASSERT_EQ(0, rbd_aio_get_return_value(comp));
+  rbd_aio_release(comp);
+
+  std::string read_buffer(write_buffer.size(), '1');
+  struct iovec read_iovs[] = {
+    {.iov_base = &read_buffer[0],  .iov_len = 4},
+    {.iov_base = &read_buffer[8],  .iov_len = 4},
+    {.iov_base = &read_buffer[12], .iov_len = 2}
+  };
+
+  rbd_aio_create_completion(NULL, NULL, &comp);
+  ASSERT_EQ(-EINVAL, rbd_aio_readv(image, read_iovs, 0, 0, comp));
+  ASSERT_EQ(-EINVAL, rbd_aio_readv(image, bad_iovs, 2, 0, comp));
+  ASSERT_EQ(0, rbd_aio_readv(image, read_iovs,
+                             sizeof(read_iovs) / sizeof(struct iovec),
+                             1<<order, comp));
+  ASSERT_EQ(0, rbd_aio_wait_for_complete(comp));
+  ASSERT_EQ(10, rbd_aio_get_return_value(comp));
+  rbd_aio_release(comp);
+  ASSERT_EQ("This1111 is a ", read_buffer);
+
+  std::string linear_buffer(write_buffer.size(), '1');
+  struct iovec linear_iovs[] = {
+    {.iov_base = &linear_buffer[4], .iov_len = 4}
+  };
+  rbd_aio_create_completion(NULL, NULL, &comp);
+  ASSERT_EQ(0, rbd_aio_readv(image, linear_iovs,
+                             sizeof(linear_iovs) / sizeof(struct iovec),
+                             1<<order, comp));
+  ASSERT_EQ(0, rbd_aio_wait_for_complete(comp));
+  ASSERT_EQ(4, rbd_aio_get_return_value(comp));
+  rbd_aio_release(comp);
+  ASSERT_EQ("1111This111111", linear_buffer);
+
+  ASSERT_PASSED(validate_object_map, image);
+  ASSERT_EQ(0, rbd_close(image));
+
+  rados_ioctx_destroy(ioctx);
+}
+
+TEST_F(TestLibRBD, TestEmptyDiscard)
+{
+  rados_ioctx_t ioctx;
+  rados_ioctx_create(_cluster, m_pool_name.c_str(), &ioctx);
+
+  rbd_image_t image;
+  int order = 0;
+  std::string name = get_temp_image_name();
+  uint64_t size = 20 << 20;
+
+  ASSERT_EQ(0, create_image(ioctx, name.c_str(), size, &order));
+  ASSERT_EQ(0, rbd_open(ioctx, name.c_str(), &image, NULL));
+
+  ASSERT_PASSED(aio_discard_test_data, image, 0, 1*1024*1024);
+  ASSERT_PASSED(aio_discard_test_data, image, 0, 4*1024*1024);
+  ASSERT_PASSED(aio_discard_test_data, image, 3*1024*1024, 1*1024*1024);
+
+  ASSERT_PASSED(validate_object_map, image);
+  ASSERT_EQ(0, rbd_close(image));
+
+  rados_ioctx_destroy(ioctx);
+}
+
+TEST_F(TestLibRBD, TestFUA)
+{
+  rados_ioctx_t ioctx;
+  rados_ioctx_create(_cluster, m_pool_name.c_str(), &ioctx);
+
+  rbd_image_t image_write;
+  rbd_image_t image_read;
+  int order = 0;
+  std::string name = get_temp_image_name();
+  uint64_t size = 2 << 20;
+
+  ASSERT_EQ(0, create_image(ioctx, name.c_str(), size, &order));
+  ASSERT_EQ(0, rbd_open(ioctx, name.c_str(), &image_write, NULL));
+  ASSERT_EQ(0, rbd_open(ioctx, name.c_str(), &image_read, NULL));
+
+  // enable writeback cache
+  rbd_flush(image_write);
+
+  char test_data[TEST_IO_SIZE + 1];
+  int i;
+
+  for (i = 0; i < TEST_IO_SIZE; ++i) {
+    test_data[i] = (char) (rand() % (126 - 33) + 33);
+  }
+  test_data[TEST_IO_SIZE] = '\0';
+  for (i = 0; i < 5; ++i)
+    ASSERT_PASSED(write_test_data, image_write, test_data,
+                  TEST_IO_SIZE * i, TEST_IO_SIZE, LIBRADOS_OP_FLAG_FADVISE_FUA);
+
+  for (i = 0; i < 5; ++i)
+    ASSERT_PASSED(read_test_data, image_read, test_data,
+                  TEST_IO_SIZE * i, TEST_IO_SIZE, 0);
+
+  for (i = 5; i < 10; ++i)
+    ASSERT_PASSED(aio_write_test_data, image_write, test_data,
+                  TEST_IO_SIZE * i, TEST_IO_SIZE, LIBRADOS_OP_FLAG_FADVISE_FUA);
+
+  for (i = 5; i < 10; ++i)
+    ASSERT_PASSED(aio_read_test_data, image_read, test_data,
+                  TEST_IO_SIZE * i, TEST_IO_SIZE, 0);
+
+  ASSERT_PASSED(validate_object_map, image_write);
+  ASSERT_PASSED(validate_object_map, image_read);
+  ASSERT_EQ(0, rbd_close(image_write));
+  ASSERT_EQ(0, rbd_close(image_read));
+  ASSERT_EQ(0, rbd_remove(ioctx, name.c_str()));
+  rados_ioctx_destroy(ioctx);
+}
+
+void simple_write_cb_pp(librbd::completion_t cb, void *arg)
+{
+  cout << "write completion cb called!" << std::endl;
+}
+
+void simple_read_cb_pp(librbd::completion_t cb, void *arg)
+{
+  cout << "read completion cb called!" << std::endl;
+}
+
+void aio_write_test_data(librbd::Image& image, const char *test_data,
+                        off_t off, uint32_t iohint, bool *passed)
+{
+  ceph::bufferlist bl;
+  bl.append(test_data, strlen(test_data));
+  librbd::RBD::AioCompletion *comp = new librbd::RBD::AioCompletion(NULL, (librbd::callback_t) simple_write_cb_pp);
+  printf("created completion\n");
+  if (iohint)
+    image.aio_write2(off, strlen(test_data), bl, comp, iohint);
+  else
+    image.aio_write(off, strlen(test_data), bl, comp);
+  printf("started write\n");
+  comp->wait_for_complete();
+  int r = comp->get_return_value();
+  printf("return value is: %d\n", r);
+  ASSERT_EQ(0, r);
+  printf("finished write\n");
+  comp->release();
+  *passed = true;
+}
+
+void aio_discard_test_data(librbd::Image& image, off_t off, size_t len, bool *passed)
+{
+  librbd::RBD::AioCompletion *comp = new librbd::RBD::AioCompletion(NULL, (librbd::callback_t) simple_write_cb_pp);
+  image.aio_discard(off, len, comp);
+  comp->wait_for_complete();
+  int r = comp->get_return_value();
+  ASSERT_EQ(0, r);
+  comp->release();
+  *passed = true;
+}
+
+void write_test_data(librbd::Image& image, const char *test_data, off_t off, uint32_t iohint, bool *passed)
+{
+  size_t written;
+  size_t len = strlen(test_data);
+  ceph::bufferlist bl;
+  bl.append(test_data, len);
+  if (iohint)
+    written = image.write2(off, len, bl, iohint);
+  else
+    written = image.write(off, len, bl);
+  printf("wrote: %u\n", (unsigned int) written);
+  ASSERT_EQ(bl.length(), written);
+  *passed = true;
+}
+
+void discard_test_data(librbd::Image& image, off_t off, size_t len, bool *passed)
 {
   size_t written;
   written = image.discard(off, len);
 {
   size_t written;
   written = image.discard(off, len);
@@ -2786,178 +3479,1139 @@ void discard_test_data(librbd::Image& image, off_t off, size_t len, bool *passed
   *passed = true;
 }
 
   *passed = true;
 }
 
-void aio_read_test_data(librbd::Image& image, const char *expected, off_t off, size_t expected_len, uint32_t iohint, bool *passed)
+void aio_read_test_data(librbd::Image& image, const char *expected, off_t off, size_t expected_len, uint32_t iohint, bool *passed)
+{
+  librbd::RBD::AioCompletion *comp = new librbd::RBD::AioCompletion(NULL, (librbd::callback_t) simple_read_cb_pp);
+  ceph::bufferlist bl;
+  printf("created completion\n");
+  if (iohint)
+    image.aio_read2(off, expected_len, bl, comp, iohint);
+  else
+    image.aio_read(off, expected_len, bl, comp);
+  printf("started read\n");
+  comp->wait_for_complete();
+  int r = comp->get_return_value();
+  printf("return value is: %d\n", r);
+  ASSERT_EQ(TEST_IO_SIZE, r);
+  ASSERT_EQ(0, memcmp(expected, bl.c_str(), TEST_IO_SIZE));
+  printf("finished read\n");
+  comp->release();
+  *passed = true;
+}
+
+void read_test_data(librbd::Image& image, const char *expected, off_t off, size_t expected_len, uint32_t iohint, bool *passed)
+{
+  int read;
+  size_t len = expected_len;
+  ceph::bufferlist bl;
+  if (iohint)
+    read = image.read2(off, len, bl, iohint);
+  else
+    read = image.read(off, len, bl);
+  ASSERT_TRUE(read >= 0);
+  std::string bl_str(bl.c_str(), read);
+
+  printf("read: %u\n", (unsigned int) read);
+  int result = memcmp(bl_str.c_str(), expected, expected_len);
+  if (result != 0) {
+    printf("read: %s\nexpected: %s\n", bl_str.c_str(), expected);
+    ASSERT_EQ(0, result);
+  }
+  *passed = true;
+}
+
+void aio_writesame_test_data(librbd::Image& image, const char *test_data, off_t off,
+                             size_t len, size_t data_len, uint32_t iohint, bool *passed)
+{
+  ceph::bufferlist bl;
+  bl.append(test_data, data_len);
+  librbd::RBD::AioCompletion *comp = new librbd::RBD::AioCompletion(NULL, (librbd::callback_t) simple_write_cb_pp);
+  printf("created completion\n");
+  int r;
+  r = image.aio_writesame(off, len, bl, comp, iohint);
+  printf("started writesame\n");
+  if (len % data_len) {
+    ASSERT_EQ(-EINVAL, r);
+    printf("expected fail, finished writesame\n");
+    comp->release();
+    *passed = true;
+    return;
+  }
+
+  comp->wait_for_complete();
+  r = comp->get_return_value();
+  printf("return value is: %d\n", r);
+  ASSERT_EQ(0, r);
+  printf("finished writesame\n");
+  comp->release();
+
+  //verify data
+  printf("to verify the data\n");
+  int read;
+  uint64_t left = len;
+  while (left > 0) {
+    ceph::bufferlist bl;
+    read = image.read(off, data_len, bl);
+    ASSERT_EQ(data_len, static_cast<size_t>(read));
+    std::string bl_str(bl.c_str(), read);
+    int result = memcmp(bl_str.c_str(), test_data, data_len);
+    if (result !=0 ) {
+      printf("read: %u ~ %u\n", (unsigned int) off, (unsigned int) read);
+      printf("read: %s\nexpected: %s\n", bl_str.c_str(), test_data);
+      ASSERT_EQ(0, result);
+    }
+    off += data_len;
+    left -= data_len;
+  }
+  ASSERT_EQ(0U, left);
+  printf("verified\n");
+
+  *passed = true;
+}
+
+void writesame_test_data(librbd::Image& image, const char *test_data, off_t off,
+                         ssize_t len, size_t data_len, uint32_t iohint,
+                         bool *passed)
+{
+  ssize_t written;
+  ceph::bufferlist bl;
+  bl.append(test_data, data_len);
+  written = image.writesame(off, len, bl, iohint);
+  if (len % data_len) {
+    ASSERT_EQ(-EINVAL, written);
+    printf("expected fail, finished writesame\n");
+    *passed = true;
+    return;
+  }
+  ASSERT_EQ(len, written);
+  printf("wrote: %u\n", (unsigned int) written);
+  *passed = true;
+
+  //verify data
+  printf("to verify the data\n");
+  int read;
+  uint64_t left = len;
+  while (left > 0) {
+    ceph::bufferlist bl;
+    read = image.read(off, data_len, bl);
+    ASSERT_EQ(data_len, static_cast<size_t>(read));
+    std::string bl_str(bl.c_str(), read);
+    int result = memcmp(bl_str.c_str(), test_data, data_len);
+    if (result !=0 ) {
+      printf("read: %u ~ %u\n", (unsigned int) off, (unsigned int) read);
+      printf("read: %s\nexpected: %s\n", bl_str.c_str(), test_data);
+      ASSERT_EQ(0, result);
+    }
+    off += data_len;
+    left -= data_len;
+  }
+  ASSERT_EQ(0U, left);
+  printf("verified\n");
+
+  *passed = true;
+}
+
+void aio_compare_and_write_test_data(librbd::Image& image, const char *cmp_data,
+                                     const char *test_data, off_t off, ssize_t len,
+                                     uint32_t iohint, bool *passed)
+{
+  ceph::bufferlist cmp_bl;
+  cmp_bl.append(cmp_data, strlen(cmp_data));
+  ceph::bufferlist test_bl;
+  test_bl.append(test_data, strlen(test_data));
+  librbd::RBD::AioCompletion *comp = new librbd::RBD::AioCompletion(NULL, (librbd::callback_t) simple_write_cb_pp);
+  printf("created completion\n");
+
+  uint64_t mismatch_offset;
+  image.aio_compare_and_write(off, len, cmp_bl, test_bl, comp, &mismatch_offset, iohint);
+  printf("started aio compare and write\n");
+  comp->wait_for_complete();
+  int r = comp->get_return_value();
+  printf("return value is: %d\n", r);
+  ASSERT_EQ(0, r);
+  printf("finished aio compare and write\n");
+  comp->release();
+  *passed = true;
+}
+
+void compare_and_write_test_data(librbd::Image& image, const char *cmp_data, const char *test_data,
+                                 off_t off, ssize_t len, uint64_t *mismatch_off, uint32_t iohint, bool *passed)
+{
+  size_t written;
+  ceph::bufferlist cmp_bl;
+  cmp_bl.append(cmp_data, strlen(cmp_data));
+  ceph::bufferlist test_bl;
+  test_bl.append(test_data, strlen(test_data));
+  printf("start compare and write\n");
+  written = image.compare_and_write(off, len, cmp_bl, test_bl, mismatch_off, iohint);
+  printf("compare and  wrote: %d\n", (int) written);
+  ASSERT_EQ(len, static_cast<ssize_t>(written));
+  *passed = true;
+}
+
+TEST_F(TestLibRBD, TestIOPP)
+{
+  librados::IoCtx ioctx;
+  ASSERT_EQ(0, _rados.ioctx_create(m_pool_name.c_str(), ioctx));
+
+  {
+    librbd::RBD rbd;
+    librbd::Image image;
+    int order = 0;
+    std::string name = get_temp_image_name();
+    uint64_t size = 2 << 20;
+
+    ASSERT_EQ(0, create_image_pp(rbd, ioctx, name.c_str(), size, &order));
+    ASSERT_EQ(0, rbd.open(ioctx, image, name.c_str(), NULL));
+
+    bool skip_discard = this->is_skip_partial_discard_enabled(image);
+
+    char test_data[TEST_IO_SIZE + 1];
+    char zero_data[TEST_IO_SIZE + 1];
+    int i;
+    uint64_t mismatch_offset;
+
+    for (i = 0; i < TEST_IO_SIZE; ++i) {
+      test_data[i] = (char) (rand() % (126 - 33) + 33);
+    }
+    test_data[TEST_IO_SIZE] = '\0';
+    memset(zero_data, 0, sizeof(zero_data));
+
+    for (i = 0; i < 5; ++i)
+      ASSERT_PASSED(write_test_data, image, test_data, strlen(test_data) * i, 0);
+
+    for (i = 5; i < 10; ++i)
+      ASSERT_PASSED(aio_write_test_data, image, test_data, strlen(test_data) * i, 0);
+
+    for (i = 0; i < 5; ++i)
+      ASSERT_PASSED(compare_and_write_test_data, image, test_data, test_data, TEST_IO_SIZE * i,
+        TEST_IO_SIZE, &mismatch_offset, 0);
+
+    for (i = 5; i < 10; ++i)
+      ASSERT_PASSED(aio_compare_and_write_test_data, image, test_data, test_data, TEST_IO_SIZE * i,
+        TEST_IO_SIZE, 0);
+
+    for (i = 0; i < 5; ++i)
+      ASSERT_PASSED(read_test_data, image, test_data, strlen(test_data) * i, TEST_IO_SIZE, 0);
+
+    for (i = 5; i < 10; ++i)
+      ASSERT_PASSED(aio_read_test_data, image, test_data, strlen(test_data) * i, TEST_IO_SIZE, 0);
+
+    // discard 2nd, 4th sections.
+    ASSERT_PASSED(discard_test_data, image, TEST_IO_SIZE, TEST_IO_SIZE);
+    ASSERT_PASSED(aio_discard_test_data, image, TEST_IO_SIZE*3, TEST_IO_SIZE);
+
+    ASSERT_PASSED(read_test_data, image, test_data,  0, TEST_IO_SIZE, 0);
+    ASSERT_PASSED(read_test_data, image, skip_discard ? test_data : zero_data,
+                 TEST_IO_SIZE, TEST_IO_SIZE, 0);
+    ASSERT_PASSED(read_test_data, image, test_data,  TEST_IO_SIZE*2, TEST_IO_SIZE, 0);
+    ASSERT_PASSED(read_test_data, image, skip_discard ? test_data : zero_data,
+                 TEST_IO_SIZE*3, TEST_IO_SIZE, 0);
+    ASSERT_PASSED(read_test_data, image, test_data,  TEST_IO_SIZE*4, TEST_IO_SIZE, 0);
+
+    for (i = 0; i < 15; ++i) {
+      if (i % 3 == 2) {
+        ASSERT_PASSED(writesame_test_data, image, test_data, TEST_IO_SIZE * i, TEST_IO_SIZE * i * 32 + i, TEST_IO_SIZE, 0);
+        ASSERT_PASSED(writesame_test_data, image, zero_data, TEST_IO_SIZE * i, TEST_IO_SIZE * i * 32 + i, TEST_IO_SIZE, 0);
+      } else if (i % 3 == 1) {
+        ASSERT_PASSED(writesame_test_data, image, test_data, TEST_IO_SIZE + i, TEST_IO_SIZE * i * 32, TEST_IO_SIZE, 0);
+        ASSERT_PASSED(writesame_test_data, image, zero_data, TEST_IO_SIZE + i, TEST_IO_SIZE * i * 32, TEST_IO_SIZE, 0);
+      } else {
+        ASSERT_PASSED(writesame_test_data, image, test_data, TEST_IO_SIZE * i, TEST_IO_SIZE * i * 32, TEST_IO_SIZE, 0);
+        ASSERT_PASSED(writesame_test_data, image, zero_data, TEST_IO_SIZE * i, TEST_IO_SIZE * i * 32, TEST_IO_SIZE, 0);
+      }
+    }
+    for (i = 0; i < 15; ++i) {
+      if (i % 3 == 2) {
+        ASSERT_PASSED(aio_writesame_test_data, image, test_data, TEST_IO_SIZE * i, TEST_IO_SIZE * i * 32 + i, TEST_IO_SIZE, 0);
+        ASSERT_PASSED(aio_writesame_test_data, image, zero_data, TEST_IO_SIZE * i, TEST_IO_SIZE * i * 32 + i, TEST_IO_SIZE, 0);
+      } else if (i % 3 == 1) {
+        ASSERT_PASSED(aio_writesame_test_data, image, test_data, TEST_IO_SIZE + i, TEST_IO_SIZE * i * 32, TEST_IO_SIZE, 0);
+        ASSERT_PASSED(aio_writesame_test_data, image, zero_data, TEST_IO_SIZE + i, TEST_IO_SIZE * i * 32, TEST_IO_SIZE, 0);
+      } else {
+        ASSERT_PASSED(aio_writesame_test_data, image, test_data, TEST_IO_SIZE * i, TEST_IO_SIZE * i * 32, TEST_IO_SIZE, 0);
+        ASSERT_PASSED(aio_writesame_test_data, image, zero_data, TEST_IO_SIZE * i, TEST_IO_SIZE * i * 32, TEST_IO_SIZE, 0);
+      }
+    }
+
+    ASSERT_PASSED(validate_object_map, image);
+  }
+
+  ioctx.close();
+}
+
+static void compare_written(librbd::Image& image, off_t off, size_t len,
+                            const std::string& buffer, bool *passed)
+{
+  bufferlist read_bl;
+  ssize_t read = image.read(off, len, read_bl);
+  ASSERT_EQ(len, read);
+  std::string read_buffer(read_bl.c_str(), read);
+  ASSERT_EQ(buffer.substr(0, len), read_buffer);
+  *passed = true;
+}
+
+TEST_F(TestLibRBD, TestCompareAndWriteCompareTooSmallPP)
+{
+  librados::IoCtx ioctx;
+  ASSERT_EQ(0, _rados.ioctx_create(m_pool_name.c_str(), ioctx));
+
+  {
+    librbd::RBD rbd;
+    librbd::Image image;
+    int order = 0;
+    std::string name = get_temp_image_name();
+    uint64_t size = 20 << 20; /* 20MiB */
+    off_t off = 512;
+
+    ASSERT_EQ(0, create_image_pp(rbd, ioctx, name.c_str(), size, &order));
+    ASSERT_EQ(0, rbd.open(ioctx, image, name.c_str(), NULL));
+
+    std::string cmp_buffer("This is a test");
+    ceph::bufferlist cmp_bl;
+    cmp_bl.append(&cmp_buffer[0], 5);
+    cmp_bl.append(&cmp_buffer[5], 3);
+    cmp_bl.append(&cmp_buffer[8], 2);
+    cmp_bl.append(&cmp_buffer[10], 4);
+
+    std::string write_buffer("Write this !!!");
+    ceph::bufferlist write_bl;
+    write_bl.append(&write_buffer[0], 6);
+    write_bl.append(&write_buffer[6], 5);
+    write_bl.append(&write_buffer[11], 3);
+
+    ssize_t written = image.write(off, cmp_bl.length(), cmp_bl);
+    ASSERT_EQ(cmp_bl.length(), written);
+
+    std::string small_buffer("Too small");
+    ceph::bufferlist small_bl;
+    small_bl.append(&small_buffer[0], 4);
+    small_bl.append(&small_buffer[4], 4);
+
+    // should fail because compare bufferlist cannot be smaller than len
+    uint64_t mismatch_off = 0;
+    written = image.compare_and_write(off, cmp_bl.length(),
+                                      small_bl, /* cmp_bl */
+                                      write_bl,
+                                      &mismatch_off, 0);
+    ASSERT_EQ(-EINVAL, written);
+    ASSERT_EQ(0U, mismatch_off);
+
+    ASSERT_PASSED(validate_object_map, image);
+  }
+
+  ioctx.close();
+}
+
+TEST_F(TestLibRBD, TestAioCompareAndWriteCompareTooSmallPP)
 {
 {
-  librbd::RBD::AioCompletion *comp = new librbd::RBD::AioCompletion(NULL, (librbd::callback_t) simple_read_cb_pp);
-  ceph::bufferlist bl;
-  printf("created completion\n");
-  if (iohint)
-    image.aio_read2(off, expected_len, bl, comp, iohint);
-  else
-    image.aio_read(off, expected_len, bl, comp);
-  printf("started read\n");
-  comp->wait_for_complete();
-  int r = comp->get_return_value();
-  printf("return value is: %d\n", r);
-  ASSERT_EQ(TEST_IO_SIZE, r);
-  ASSERT_EQ(0, memcmp(expected, bl.c_str(), TEST_IO_SIZE));
-  printf("finished read\n");
-  comp->release();
-  *passed = true;
+  librados::IoCtx ioctx;
+  ASSERT_EQ(0, _rados.ioctx_create(m_pool_name.c_str(), ioctx));
+
+  {
+    librbd::RBD rbd;
+    librbd::Image image;
+    int order = 0;
+    std::string name = get_temp_image_name();
+    uint64_t size = 20 << 20; /* 20MiB */
+    off_t off = 512;
+
+    ASSERT_EQ(0, create_image_pp(rbd, ioctx, name.c_str(), size, &order));
+    ASSERT_EQ(0, rbd.open(ioctx, image, name.c_str(), NULL));
+
+    std::string cmp_buffer("This is a test");
+    ceph::bufferlist cmp_bl;
+    cmp_bl.append(&cmp_buffer[0], 5);
+    cmp_bl.append(&cmp_buffer[5], 3);
+    cmp_bl.append(&cmp_buffer[8], 2);
+    cmp_bl.append(&cmp_buffer[10], 4);
+
+    std::string write_buffer("Write this !!!");
+    ceph::bufferlist write_bl;
+    write_bl.append(&write_buffer[0], 6);
+    write_bl.append(&write_buffer[6], 5);
+    write_bl.append(&write_buffer[11], 3);
+
+    ssize_t written = image.write(off, cmp_bl.length(), cmp_bl);
+    ASSERT_EQ(cmp_bl.length(), written);
+
+    std::string small_buffer("Too small");
+    ceph::bufferlist small_bl;
+    small_bl.append(&small_buffer[0], 4);
+    small_bl.append(&small_buffer[4], 4);
+
+    // should fail because compare bufferlist cannot be smaller than len
+    librbd::RBD::AioCompletion *comp = new librbd::RBD::AioCompletion(
+        NULL, (librbd::callback_t) simple_write_cb_pp);
+    uint64_t mismatch_off = 0;
+    int ret = image.aio_compare_and_write(off, cmp_bl.length(),
+                                          small_bl, /* cmp_bl */
+                                          write_bl,
+                                          comp, &mismatch_off, 0);
+    ASSERT_EQ(-EINVAL, ret);
+    ASSERT_EQ(0U, mismatch_off);
+    comp->release();
+
+    ASSERT_PASSED(validate_object_map, image);
+  }
+
+  ioctx.close();
 }
 
 }
 
-void read_test_data(librbd::Image& image, const char *expected, off_t off, size_t expected_len, uint32_t iohint, bool *passed)
+TEST_F(TestLibRBD, TestCompareAndWriteWriteTooSmallPP)
 {
 {
-  int read;
-  size_t len = expected_len;
-  ceph::bufferlist bl;
-  if (iohint)
-    read = image.read2(off, len, bl, iohint);
-  else
-    read = image.read(off, len, bl);
-  ASSERT_TRUE(read >= 0);
-  std::string bl_str(bl.c_str(), read);
+  librados::IoCtx ioctx;
+  ASSERT_EQ(0, _rados.ioctx_create(m_pool_name.c_str(), ioctx));
 
 
-  printf("read: %u\n", (unsigned int) read);
-  int result = memcmp(bl_str.c_str(), expected, expected_len);
-  if (result != 0) {
-    printf("read: %s\nexpected: %s\n", bl_str.c_str(), expected);
-    ASSERT_EQ(0, result);
+  {
+    librbd::RBD rbd;
+    librbd::Image image;
+    int order = 0;
+    std::string name = get_temp_image_name();
+    uint64_t size = 20 << 20; /* 20MiB */
+    off_t off = 512;
+
+    ASSERT_EQ(0, create_image_pp(rbd, ioctx, name.c_str(), size, &order));
+    ASSERT_EQ(0, rbd.open(ioctx, image, name.c_str(), NULL));
+
+    std::string cmp_buffer("This is a test");
+    ceph::bufferlist cmp_bl;
+    cmp_bl.append(&cmp_buffer[0], 5);
+    cmp_bl.append(&cmp_buffer[5], 3);
+    cmp_bl.append(&cmp_buffer[8], 2);
+    cmp_bl.append(&cmp_buffer[10], 4);
+
+    ssize_t written = image.write(off, cmp_bl.length(), cmp_bl);
+    ASSERT_EQ(cmp_bl.length(), written);
+
+    std::string small_buffer("Too small");
+    ceph::bufferlist small_bl;
+    small_bl.append(&small_buffer[0], 4);
+    small_bl.append(&small_buffer[4], 4);
+
+    // should fail because write bufferlist cannot be smaller than len
+    uint64_t mismatch_off = 0;
+    written = image.compare_and_write(off, cmp_bl.length(),
+                                      cmp_bl,
+                                      small_bl, /* write_bl */
+                                      &mismatch_off, 0);
+    ASSERT_EQ(-EINVAL, written);
+    ASSERT_EQ(0U, mismatch_off);
+
+    ASSERT_PASSED(validate_object_map, image);
   }
   }
-  *passed = true;
+
+  ioctx.close();
 }
 
 }
 
-void aio_writesame_test_data(librbd::Image& image, const char *test_data, off_t off,
-                             size_t len, size_t data_len, uint32_t iohint, bool *passed)
+TEST_F(TestLibRBD, TestAioCompareAndWriteWriteTooSmallPP)
 {
 {
-  ceph::bufferlist bl;
-  bl.append(test_data, data_len);
-  librbd::RBD::AioCompletion *comp = new librbd::RBD::AioCompletion(NULL, (librbd::callback_t) simple_write_cb_pp);
-  printf("created completion\n");
-  int r;
-  r = image.aio_writesame(off, len, bl, comp, iohint);
-  printf("started writesame\n");
-  if (len % data_len) {
-    ASSERT_EQ(-EINVAL, r);
-    printf("expected fail, finished writesame\n");
+  librados::IoCtx ioctx;
+  ASSERT_EQ(0, _rados.ioctx_create(m_pool_name.c_str(), ioctx));
+
+  {
+    librbd::RBD rbd;
+    librbd::Image image;
+    int order = 0;
+    std::string name = get_temp_image_name();
+    uint64_t size = 20 << 20; /* 20MiB */
+    off_t off = 512;
+
+    ASSERT_EQ(0, create_image_pp(rbd, ioctx, name.c_str(), size, &order));
+    ASSERT_EQ(0, rbd.open(ioctx, image, name.c_str(), NULL));
+
+    std::string cmp_buffer("This is a test");
+    ceph::bufferlist cmp_bl;
+    cmp_bl.append(&cmp_buffer[0], 5);
+    cmp_bl.append(&cmp_buffer[5], 3);
+    cmp_bl.append(&cmp_buffer[8], 2);
+    cmp_bl.append(&cmp_buffer[10], 4);
+
+    ssize_t written = image.write(off, cmp_bl.length(), cmp_bl);
+    ASSERT_EQ(cmp_bl.length(), written);
+
+    std::string small_buffer("Too small");
+    ceph::bufferlist small_bl;
+    small_bl.append(&small_buffer[0], 4);
+    small_bl.append(&small_buffer[4], 4);
+
+    // should fail because write bufferlist cannot be smaller than len
+    librbd::RBD::AioCompletion *comp = new librbd::RBD::AioCompletion(
+        NULL, (librbd::callback_t) simple_write_cb_pp);
+    uint64_t mismatch_off = 0;
+    int ret = image.aio_compare_and_write(off, cmp_bl.length(),
+                                          cmp_bl,
+                                          small_bl, /* write_bl */
+                                          comp, &mismatch_off, 0);
+    ASSERT_EQ(-EINVAL, ret);
+    ASSERT_EQ(0U, mismatch_off);
+    comp->release();
+
+    ASSERT_PASSED(validate_object_map, image);
+  }
+
+  ioctx.close();
+}
+
+TEST_F(TestLibRBD, TestCompareAndWriteMismatchPP)
+{
+  librados::IoCtx ioctx;
+  ASSERT_EQ(0, _rados.ioctx_create(m_pool_name.c_str(), ioctx));
+
+  {
+    librbd::RBD rbd;
+    librbd::Image image;
+    int order = 0;
+    std::string name = get_temp_image_name();
+    uint64_t size = 20 << 20; /* 20MiB */
+    off_t off = 512;
+
+    ASSERT_EQ(0, create_image_pp(rbd, ioctx, name.c_str(), size, &order));
+    ASSERT_EQ(0, rbd.open(ioctx, image, name.c_str(), NULL));
+
+    std::string cmp_buffer("This is a test");
+    ceph::bufferlist cmp_bl;
+    cmp_bl.append(&cmp_buffer[0], 5);
+    cmp_bl.append(&cmp_buffer[5], 3);
+    cmp_bl.append(&cmp_buffer[8], 2);
+    cmp_bl.append(&cmp_buffer[10], 4);
+
+    std::string write_buffer("Write this !!!");
+    ceph::bufferlist write_bl;
+    write_bl.append(&write_buffer[0], 6);
+    write_bl.append(&write_buffer[6], 5);
+    write_bl.append(&write_buffer[11], 3);
+
+    std::string mismatch_buffer("This will fail");
+    ceph::bufferlist mismatch_bl;
+    mismatch_bl.append(&mismatch_buffer[0], 5);
+    mismatch_bl.append(&mismatch_buffer[5], 5);
+    mismatch_bl.append(&mismatch_buffer[10], 4);
+
+    ssize_t written = image.write(off, cmp_bl.length(), cmp_bl);
+    ASSERT_EQ(cmp_bl.length(), written);
+
+    // this should execute the compare but fail because of mismatch
+    uint64_t mismatch_off = 0;
+    written = image.compare_and_write(off, write_bl.length(),
+                                      mismatch_bl, /* cmp_bl */
+                                      write_bl,
+                                      &mismatch_off, 0);
+    ASSERT_EQ(-EILSEQ, written);
+    ASSERT_EQ(5U, mismatch_off);
+
+    // check that nothing was written
+    ASSERT_PASSED(compare_written, image, off, cmp_bl.length(), cmp_buffer);
+
+    ASSERT_PASSED(validate_object_map, image);
+  }
+
+  ioctx.close();
+}
+
+TEST_F(TestLibRBD, TestAioCompareAndWriteMismatchPP)
+{
+  librados::IoCtx ioctx;
+  ASSERT_EQ(0, _rados.ioctx_create(m_pool_name.c_str(), ioctx));
+
+  {
+    librbd::RBD rbd;
+    librbd::Image image;
+    int order = 0;
+    std::string name = get_temp_image_name();
+    uint64_t size = 20 << 20; /* 20MiB */
+    off_t off = 512;
+
+    ASSERT_EQ(0, create_image_pp(rbd, ioctx, name.c_str(), size, &order));
+    ASSERT_EQ(0, rbd.open(ioctx, image, name.c_str(), NULL));
+
+    std::string cmp_buffer("This is a test");
+    ceph::bufferlist cmp_bl;
+    cmp_bl.append(&cmp_buffer[0], 5);
+    cmp_bl.append(&cmp_buffer[5], 3);
+    cmp_bl.append(&cmp_buffer[8], 2);
+    cmp_bl.append(&cmp_buffer[10], 4);
+
+    std::string write_buffer("Write this !!!");
+    ceph::bufferlist write_bl;
+    write_bl.append(&write_buffer[0], 6);
+    write_bl.append(&write_buffer[6], 5);
+    write_bl.append(&write_buffer[11], 3);
+
+    std::string mismatch_buffer("This will fail");
+    ceph::bufferlist mismatch_bl;
+    mismatch_bl.append(&mismatch_buffer[0], 5);
+    mismatch_bl.append(&mismatch_buffer[5], 5);
+    mismatch_bl.append(&mismatch_buffer[10], 4);
+
+    ssize_t written = image.write(off, cmp_bl.length(), cmp_bl);
+    ASSERT_EQ(cmp_bl.length(), written);
+
+    // this should execute the compare but fail because of mismatch
+    librbd::RBD::AioCompletion *comp = new librbd::RBD::AioCompletion(
+        NULL, (librbd::callback_t) simple_write_cb_pp);
+    uint64_t mismatch_off = 0;
+    int ret = image.aio_compare_and_write(off, write_bl.length(),
+                                          mismatch_bl, /* cmp_bl */
+                                          write_bl,
+                                          comp, &mismatch_off, 0);
+    ASSERT_EQ(0, ret);
+    comp->wait_for_complete();
+    ssize_t aio_ret = comp->get_return_value();
+    ASSERT_EQ(-EILSEQ, aio_ret);
+    ASSERT_EQ(5U, mismatch_off);
+    comp->release();
+
+    // check that nothing was written
+    ASSERT_PASSED(compare_written, image, off, cmp_bl.length(), cmp_buffer);
+
+    ASSERT_PASSED(validate_object_map, image);
+  }
+
+  ioctx.close();
+}
+
+TEST_F(TestLibRBD, TestCompareAndWriteMismatchBufferlistGreaterLenPP)
+{
+  librados::IoCtx ioctx;
+  ASSERT_EQ(0, _rados.ioctx_create(m_pool_name.c_str(), ioctx));
+
+  {
+    librbd::RBD rbd;
+    librbd::Image image;
+    int order = 0;
+    std::string name = get_temp_image_name();
+    uint64_t size = 20 << 20; /* 20MiB */
+    off_t off = 512;
+
+    ASSERT_EQ(0, create_image_pp(rbd, ioctx, name.c_str(), size, &order));
+    ASSERT_EQ(0, rbd.open(ioctx, image, name.c_str(), NULL));
+
+    std::string cmp_buffer("This is a test");
+    ceph::bufferlist cmp_bl;
+    cmp_bl.append(&cmp_buffer[0], 5);
+    cmp_bl.append(&cmp_buffer[5], 3);
+    cmp_bl.append(&cmp_buffer[8], 2);
+    cmp_bl.append(&cmp_buffer[10], 4);
+
+    std::string write_buffer("Write this !!!");
+    ceph::bufferlist write_bl;
+    write_bl.append(&write_buffer[0], 6);
+    write_bl.append(&write_buffer[6], 5);
+    write_bl.append(&write_buffer[11], 3);
+
+    std::string mismatch_buffer("This will fail");
+    ceph::bufferlist mismatch_bl;
+    mismatch_bl.append(&mismatch_buffer[0], 5);
+    mismatch_bl.append(&mismatch_buffer[5], 5);
+    mismatch_bl.append(&mismatch_buffer[10], 4);
+
+    ssize_t written = image.write(off, cmp_bl.length(), cmp_bl);
+    ASSERT_EQ(cmp_bl.length(), written);
+
+    /*
+     * we allow cmp_bl and write_bl to be greater than len so this
+     * should execute the compare but fail because of mismatch
+     */
+    uint64_t mismatch_off = 0;
+    written = image.compare_and_write(off, cmp_bl.length() - 1,
+                                      mismatch_bl, /* cmp_bl */
+                                      write_bl,
+                                      &mismatch_off, 0);
+    ASSERT_EQ(-EILSEQ, written);
+    ASSERT_EQ(5U, mismatch_off);
+
+    // check that nothing was written
+    ASSERT_PASSED(compare_written, image, off, cmp_bl.length(), cmp_buffer);
+
+    ASSERT_PASSED(validate_object_map, image);
+  }
+
+  ioctx.close();
+}
+
+TEST_F(TestLibRBD, TestAioCompareAndWriteMismatchBufferlistGreaterLenPP)
+{
+  librados::IoCtx ioctx;
+  ASSERT_EQ(0, _rados.ioctx_create(m_pool_name.c_str(), ioctx));
+
+  {
+    librbd::RBD rbd;
+    librbd::Image image;
+    int order = 0;
+    std::string name = get_temp_image_name();
+    uint64_t size = 20 << 20; /* 20MiB */
+    off_t off = 512;
+
+    ASSERT_EQ(0, create_image_pp(rbd, ioctx, name.c_str(), size, &order));
+    ASSERT_EQ(0, rbd.open(ioctx, image, name.c_str(), NULL));
+
+    std::string cmp_buffer("This is a test");
+    ceph::bufferlist cmp_bl;
+    cmp_bl.append(&cmp_buffer[0], 5);
+    cmp_bl.append(&cmp_buffer[5], 3);
+    cmp_bl.append(&cmp_buffer[8], 2);
+    cmp_bl.append(&cmp_buffer[10], 4);
+
+    std::string write_buffer("Write this !!!");
+    ceph::bufferlist write_bl;
+    write_bl.append(&write_buffer[0], 6);
+    write_bl.append(&write_buffer[6], 5);
+    write_bl.append(&write_buffer[11], 3);
+
+    std::string mismatch_buffer("This will fail");
+    ceph::bufferlist mismatch_bl;
+    mismatch_bl.append(&mismatch_buffer[0], 5);
+    mismatch_bl.append(&mismatch_buffer[5], 5);
+    mismatch_bl.append(&mismatch_buffer[10], 4);
+
+    ssize_t written = image.write(off, cmp_bl.length(), cmp_bl);
+    ASSERT_EQ(cmp_bl.length(), written);
+
+    /*
+     * we allow cmp_bl and write_bl to be greater than len so this
+     * should execute the compare but fail because of mismatch
+     */
+    librbd::RBD::AioCompletion *comp = new librbd::RBD::AioCompletion(
+        NULL, (librbd::callback_t) simple_write_cb_pp);
+    uint64_t mismatch_off = 0;
+    int ret = image.aio_compare_and_write(off, cmp_bl.length() - 1,
+                                          mismatch_bl, /* cmp_bl */
+                                          write_bl,
+                                          comp, &mismatch_off, 0);
+    ASSERT_EQ(0, ret);
+    comp->wait_for_complete();
+    ssize_t aio_ret = comp->get_return_value();
+    ASSERT_EQ(-EILSEQ, aio_ret);
+    ASSERT_EQ(5U, mismatch_off);
+    comp->release();
+
+    // check that nothing was written
+    ASSERT_PASSED(compare_written, image, off, cmp_bl.length(), cmp_buffer);
+
+    ASSERT_PASSED(validate_object_map, image);
+  }
+
+  ioctx.close();
+}
+
+TEST_F(TestLibRBD, TestCompareAndWriteSuccessPP)
+{
+  librados::IoCtx ioctx;
+  ASSERT_EQ(0, _rados.ioctx_create(m_pool_name.c_str(), ioctx));
+
+  {
+    librbd::RBD rbd;
+    librbd::Image image;
+    int order = 0;
+    std::string name = get_temp_image_name();
+    uint64_t size = 20 << 20; /* 20MiB */
+    off_t off = 512;
+
+    ASSERT_EQ(0, create_image_pp(rbd, ioctx, name.c_str(), size, &order));
+    ASSERT_EQ(0, rbd.open(ioctx, image, name.c_str(), NULL));
+
+    std::string cmp_buffer("This is a test");
+    ceph::bufferlist cmp_bl;
+    cmp_bl.append(&cmp_buffer[0], 5);
+    cmp_bl.append(&cmp_buffer[5], 3);
+    cmp_bl.append(&cmp_buffer[8], 2);
+    cmp_bl.append(&cmp_buffer[10], 4);
+
+    std::string write_buffer("Write this !!!");
+    ceph::bufferlist write_bl;
+    write_bl.append(&write_buffer[0], 6);
+    write_bl.append(&write_buffer[6], 5);
+    write_bl.append(&write_buffer[11], 3);
+
+    ssize_t written = image.write(off, cmp_bl.length(), cmp_bl);
+    ASSERT_EQ(cmp_bl.length(), written);
+
+    // compare against the buffer written before => should succeed
+    uint64_t mismatch_off = 0;
+    written = image.compare_and_write(off, cmp_bl.length(),
+                                      cmp_bl,
+                                      write_bl,
+                                      &mismatch_off, 0);
+    ASSERT_EQ(write_bl.length(), written);
+    ASSERT_EQ(0U, mismatch_off);
+
+    // check write_bl was written
+    ASSERT_PASSED(compare_written, image, off, write_bl.length(), write_buffer);
+
+    ASSERT_PASSED(validate_object_map, image);
+  }
+
+  ioctx.close();
+}
+
+TEST_F(TestLibRBD, TestAioCompareAndWriteSuccessPP)
+{
+  librados::IoCtx ioctx;
+  ASSERT_EQ(0, _rados.ioctx_create(m_pool_name.c_str(), ioctx));
+
+  {
+    librbd::RBD rbd;
+    librbd::Image image;
+    int order = 0;
+    std::string name = get_temp_image_name();
+    uint64_t size = 20 << 20; /* 20MiB */
+    off_t off = 512;
+
+    ASSERT_EQ(0, create_image_pp(rbd, ioctx, name.c_str(), size, &order));
+    ASSERT_EQ(0, rbd.open(ioctx, image, name.c_str(), NULL));
+
+    std::string cmp_buffer("This is a test");
+    ceph::bufferlist cmp_bl;
+    cmp_bl.append(&cmp_buffer[0], 5);
+    cmp_bl.append(&cmp_buffer[5], 3);
+    cmp_bl.append(&cmp_buffer[8], 2);
+    cmp_bl.append(&cmp_buffer[10], 4);
+
+    std::string write_buffer("Write this !!!");
+    ceph::bufferlist write_bl;
+    write_bl.append(&write_buffer[0], 6);
+    write_bl.append(&write_buffer[6], 5);
+    write_bl.append(&write_buffer[11], 3);
+
+    ssize_t written = image.write(off, cmp_bl.length(), cmp_bl);
+    ASSERT_EQ(cmp_bl.length(), written);
+
+    // compare against the buffer written before => should succeed
+    librbd::RBD::AioCompletion *comp = new librbd::RBD::AioCompletion(
+        NULL, (librbd::callback_t) simple_write_cb_pp);
+    uint64_t mismatch_off = 0;
+    int ret = image.aio_compare_and_write(off, write_bl.length(),
+                                          cmp_bl,
+                                          write_bl,
+                                          comp, &mismatch_off, 0);
+    ASSERT_EQ(0, ret);
+    comp->wait_for_complete();
+    ssize_t aio_ret = comp->get_return_value();
+    ASSERT_EQ(0, aio_ret);
+    ASSERT_EQ(0U, mismatch_off);
+    comp->release();
+
+    // check write_bl was written
+    ASSERT_PASSED(compare_written, image, off, write_bl.length(), write_buffer);
+
+    ASSERT_PASSED(validate_object_map, image);
+  }
+
+  ioctx.close();
+}
+
+TEST_F(TestLibRBD, TestCompareAndWriteSuccessBufferlistGreaterLenPP)
+{
+  librados::IoCtx ioctx;
+  ASSERT_EQ(0, _rados.ioctx_create(m_pool_name.c_str(), ioctx));
+
+  {
+    librbd::RBD rbd;
+    librbd::Image image;
+    int order = 0;
+    std::string name = get_temp_image_name();
+    uint64_t size = 20 << 20; /* 20MiB */
+    off_t off = 512;
+
+    ASSERT_EQ(0, create_image_pp(rbd, ioctx, name.c_str(), size, &order));
+    ASSERT_EQ(0, rbd.open(ioctx, image, name.c_str(), NULL));
+
+    std::string cmp_buffer("This is a test");
+    ceph::bufferlist cmp_bl;
+    cmp_bl.append(&cmp_buffer[0], 5);
+    cmp_bl.append(&cmp_buffer[5], 3);
+    cmp_bl.append(&cmp_buffer[8], 2);
+    cmp_bl.append(&cmp_buffer[10], 4);
+
+    std::string write_buffer("Write this !!!");
+    ceph::bufferlist write_bl;
+    write_bl.append(&write_buffer[0], 6);
+    write_bl.append(&write_buffer[6], 5);
+    write_bl.append(&write_buffer[11], 3);
+
+    std::string mismatch_buffer("This will fail");
+    ceph::bufferlist mismatch_bl;
+    mismatch_bl.append(&mismatch_buffer[0], 5);
+    mismatch_bl.append(&mismatch_buffer[5], 5);
+    mismatch_bl.append(&mismatch_buffer[10], 4);
+
+    /*
+     * Test len < cmp_bl & write_bl => should succeed but only compare
+     * len bytes resp. only write len bytes
+     */
+    ssize_t written = image.write(off, mismatch_bl.length(), mismatch_bl);
+    ASSERT_EQ(mismatch_bl.length(), written);
+
+    size_t len_m1 = cmp_bl.length() - 1;
+    written = image.write(off, len_m1, cmp_bl);
+    ASSERT_EQ(len_m1, written);
+    // the content of the image at off should now be "This is a tesl"
+
+    uint64_t mismatch_off = 0;
+    written = image.compare_and_write(off, len_m1,
+                                      cmp_bl,
+                                      write_bl,
+                                      &mismatch_off, 0);
+    ASSERT_EQ(len_m1, written);
+    ASSERT_EQ(0U, mismatch_off);
+
+    // check that only write_bl.length() - 1 bytes were written
+    ASSERT_PASSED(compare_written, image, off, len_m1, write_buffer);
+    ASSERT_PASSED(compare_written, image, off + len_m1, 1, std::string("l"));
+
+    ASSERT_PASSED(validate_object_map, image);
+  }
+
+  ioctx.close();
+}
+
+TEST_F(TestLibRBD, TestAioCompareAndWriteSuccessBufferlistGreaterLenPP)
+{
+  librados::IoCtx ioctx;
+  ASSERT_EQ(0, _rados.ioctx_create(m_pool_name.c_str(), ioctx));
+
+  {
+    librbd::RBD rbd;
+    librbd::Image image;
+    int order = 0;
+    std::string name = get_temp_image_name();
+    uint64_t size = 20 << 20; /* 20MiB */
+    off_t off = 512;
+
+    ASSERT_EQ(0, create_image_pp(rbd, ioctx, name.c_str(), size, &order));
+    ASSERT_EQ(0, rbd.open(ioctx, image, name.c_str(), NULL));
+
+    std::string cmp_buffer("This is a test");
+    ceph::bufferlist cmp_bl;
+    cmp_bl.append(&cmp_buffer[0], 5);
+    cmp_bl.append(&cmp_buffer[5], 3);
+    cmp_bl.append(&cmp_buffer[8], 2);
+    cmp_bl.append(&cmp_buffer[10], 4);
+
+    std::string write_buffer("Write this !!!");
+    ceph::bufferlist write_bl;
+    write_bl.append(&write_buffer[0], 6);
+    write_bl.append(&write_buffer[6], 5);
+    write_bl.append(&write_buffer[11], 3);
+
+    std::string mismatch_buffer("This will fail");
+    ceph::bufferlist mismatch_bl;
+    mismatch_bl.append(&mismatch_buffer[0], 5);
+    mismatch_bl.append(&mismatch_buffer[5], 5);
+    mismatch_bl.append(&mismatch_buffer[10], 4);
+
+    ssize_t written = image.write(off, cmp_bl.length(), cmp_bl);
+    ASSERT_EQ(cmp_bl.length(), written);
+
+    /*
+     * Test len < cmp_bl & write_bl => should succeed but only compare
+     * len bytes resp. only write len bytes
+     */
+    written = image.write(off, mismatch_bl.length(), mismatch_bl);
+    ASSERT_EQ(mismatch_bl.length(), written);
+
+    size_t len_m1 = cmp_bl.length() - 1;
+    written = image.write(off, len_m1, cmp_bl);
+    ASSERT_EQ(len_m1, written);
+    // the content of the image at off should now be "This is a tesl"
+
+    librbd::RBD::AioCompletion *comp = new librbd::RBD::AioCompletion(
+        NULL, (librbd::callback_t) simple_write_cb_pp);
+    uint64_t mismatch_off = 0;
+    int ret = image.aio_compare_and_write(off, len_m1,
+                                          cmp_bl,
+                                          write_bl,
+                                          comp, &mismatch_off, 0);
+    ASSERT_EQ(0, ret);
+    comp->wait_for_complete();
+    ssize_t aio_ret = comp->get_return_value();
+    ASSERT_EQ(0, aio_ret);
+    ASSERT_EQ(0U, mismatch_off);
     comp->release();
     comp->release();
-    *passed = true;
-    return;
-  }
 
 
-  comp->wait_for_complete();
-  r = comp->get_return_value();
-  printf("return value is: %d\n", r);
-  ASSERT_EQ(0, r);
-  printf("finished writesame\n");
-  comp->release();
+    // check that only write_bl.length() - 1 bytes were written
+    ASSERT_PASSED(compare_written, image, off, len_m1, write_buffer);
+    ASSERT_PASSED(compare_written, image, off + len_m1, 1, std::string("l"));
 
 
-  //verify data
-  printf("to verify the data\n");
-  int read;
-  uint64_t left = len;
-  while (left > 0) {
-    ceph::bufferlist bl;
-    read = image.read(off, data_len, bl);
-    ASSERT_EQ(data_len, static_cast<size_t>(read));
-    std::string bl_str(bl.c_str(), read);
-    int result = memcmp(bl_str.c_str(), test_data, data_len);
-    if (result !=0 ) {
-      printf("read: %u ~ %u\n", (unsigned int) off, (unsigned int) read);
-      printf("read: %s\nexpected: %s\n", bl_str.c_str(), test_data);
-      ASSERT_EQ(0, result);
-    }
-    off += data_len;
-    left -= data_len;
+    ASSERT_PASSED(validate_object_map, image);
   }
   }
-  ASSERT_EQ(0U, left);
-  printf("verified\n");
 
 
-  *passed = true;
+  ioctx.close();
 }
 
 }
 
-void writesame_test_data(librbd::Image& image, const char *test_data, off_t off,
-                         ssize_t len, size_t data_len, uint32_t iohint,
-                         bool *passed)
+TEST_F(TestLibRBD, TestCompareAndWriteStripeUnitUnalignedPP)
 {
 {
-  ssize_t written;
-  ceph::bufferlist bl;
-  bl.append(test_data, data_len);
-  written = image.writesame(off, len, bl, iohint);
-  if (len % data_len) {
+  REQUIRE(!is_rbd_pwl_enabled((CephContext *)_rados.cct()));
+
+  librados::IoCtx ioctx;
+  ASSERT_EQ(0, _rados.ioctx_create(m_pool_name.c_str(), ioctx));
+
+  {
+    librbd::RBD rbd;
+    librbd::Image image;
+    int order = 0;
+    std::string name = get_temp_image_name();
+    uint64_t size = 20 << 20; /* 20MiB */
+
+    ASSERT_EQ(0, create_image_pp(rbd, ioctx, name.c_str(), size, &order));
+    ASSERT_EQ(0, rbd.open(ioctx, image, name.c_str(), NULL));
+
+    // large write test => we allow stripe unit size writes (aligned)
+    uint64_t stripe_unit = image.get_stripe_unit();
+    std::string large_write_buffer(stripe_unit, '2');
+    ceph::bufferlist large_write_bl;
+    large_write_bl.append(large_write_buffer.data(),
+                          large_write_buffer.length());
+
+    std::string large_cmp_buffer(stripe_unit * 2, '3');
+    ceph::bufferlist large_cmp_bl;
+    large_cmp_bl.append(large_cmp_buffer.data(), large_cmp_buffer.length());
+
+    ssize_t written = image.write(stripe_unit, large_cmp_bl.length(),
+                                  large_cmp_bl);
+    ASSERT_EQ(large_cmp_bl.length(), written);
+
+    /*
+     * compare and write at offset stripe_unit + 1 and stripe unit size
+     * Expect fail because access exceeds stripe
+     */
+    uint64_t mismatch_off = 0;
+    written = image.compare_and_write(stripe_unit + 1, stripe_unit,
+                                      large_cmp_bl,
+                                      large_write_bl,
+                                      &mismatch_off, 0);
     ASSERT_EQ(-EINVAL, written);
     ASSERT_EQ(-EINVAL, written);
-    printf("expected fail, finished writesame\n");
-    *passed = true;
-    return;
-  }
-  ASSERT_EQ(len, written);
-  printf("wrote: %u\n", (unsigned int) written);
-  *passed = true;
+    ASSERT_EQ(0U, mismatch_off);
 
 
-  //verify data
-  printf("to verify the data\n");
-  int read;
-  uint64_t left = len;
-  while (left > 0) {
-    ceph::bufferlist bl;
-    read = image.read(off, data_len, bl);
-    ASSERT_EQ(data_len, static_cast<size_t>(read));
-    std::string bl_str(bl.c_str(), read);
-    int result = memcmp(bl_str.c_str(), test_data, data_len);
-    if (result !=0 ) {
-      printf("read: %u ~ %u\n", (unsigned int) off, (unsigned int) read);
-      printf("read: %s\nexpected: %s\n", bl_str.c_str(), test_data);
-      ASSERT_EQ(0, result);
-    }
-    off += data_len;
-    left -= data_len;
+    // check nothing has been written
+    ASSERT_PASSED(compare_written, image, stripe_unit, large_cmp_bl.length(),
+                  large_cmp_buffer);
+
+    ASSERT_PASSED(validate_object_map, image);
   }
   }
-  ASSERT_EQ(0U, left);
-  printf("verified\n");
 
 
-  *passed = true;
+  ioctx.close();
 }
 
 }
 
-void aio_compare_and_write_test_data(librbd::Image& image, const char *cmp_data,
-                                     const char *test_data, off_t off, ssize_t len,
-                                     uint32_t iohint, bool *passed)
+TEST_F(TestLibRBD, TestAioCompareAndWriteStripeUnitUnalignedPP)
 {
 {
-  ceph::bufferlist cmp_bl;
-  cmp_bl.append(cmp_data, strlen(cmp_data));
-  ceph::bufferlist test_bl;
-  test_bl.append(test_data, strlen(test_data));
-  librbd::RBD::AioCompletion *comp = new librbd::RBD::AioCompletion(NULL, (librbd::callback_t) simple_write_cb_pp);
-  printf("created completion\n");
+  REQUIRE(!is_rbd_pwl_enabled((CephContext *)_rados.cct()));
 
 
-  uint64_t mismatch_offset;
-  image.aio_compare_and_write(off, len, cmp_bl, test_bl, comp, &mismatch_offset, iohint);
-  printf("started aio compare and write\n");
-  comp->wait_for_complete();
-  int r = comp->get_return_value();
-  printf("return value is: %d\n", r);
-  ASSERT_EQ(0, r);
-  printf("finished aio compare and write\n");
-  comp->release();
-  *passed = true;
+  librados::IoCtx ioctx;
+  ASSERT_EQ(0, _rados.ioctx_create(m_pool_name.c_str(), ioctx));
+
+  {
+    librbd::RBD rbd;
+    librbd::Image image;
+    int order = 0;
+    std::string name = get_temp_image_name();
+    uint64_t size = 20 << 20; /* 20MiB */
+
+    ASSERT_EQ(0, create_image_pp(rbd, ioctx, name.c_str(), size, &order));
+    ASSERT_EQ(0, rbd.open(ioctx, image, name.c_str(), NULL));
+
+    // large write test => we allow stripe unit size writes (aligned)
+    uint64_t stripe_unit = image.get_stripe_unit();
+    std::string large_write_buffer(stripe_unit, '2');
+    ceph::bufferlist large_write_bl;
+    large_write_bl.append(large_write_buffer.data(),
+                          large_write_buffer.length());
+
+    std::string large_cmp_buffer(stripe_unit * 2, '3');
+    ceph::bufferlist large_cmp_bl;
+    large_cmp_bl.append(large_cmp_buffer.data(), large_cmp_buffer.length());
+
+    ssize_t written = image.write(stripe_unit, large_cmp_bl.length(),
+                                  large_cmp_bl);
+    ASSERT_EQ(large_cmp_bl.length(), written);
+
+    /*
+     * compare and write at offset stripe_unit + 1 and stripe unit size
+     * Expect fail because access exceeds stripe
+     */
+    librbd::RBD::AioCompletion *comp = new librbd::RBD::AioCompletion(
+        NULL, (librbd::callback_t) simple_write_cb_pp);
+    uint64_t mismatch_off = 0;
+    int ret = image.aio_compare_and_write(stripe_unit + 1, stripe_unit,
+                                          large_cmp_bl,
+                                          large_write_bl,
+                                          comp, &mismatch_off, 0);
+    ASSERT_EQ(0, ret);
+    comp->wait_for_complete();
+    ssize_t aio_ret = comp->get_return_value();
+    ASSERT_EQ(-EINVAL, aio_ret);
+    ASSERT_EQ(0U, mismatch_off);
+    comp->release();
+
+    // check nothing has been written
+    ASSERT_PASSED(compare_written, image, stripe_unit, large_cmp_bl.length(),
+                  large_cmp_buffer);
+
+    ASSERT_PASSED(validate_object_map, image);
+  }
+
+  ioctx.close();
 }
 
 }
 
-void compare_and_write_test_data(librbd::Image& image, const char *cmp_data, const char *test_data,
-                                 off_t off, ssize_t len, uint64_t *mismatch_off, uint32_t iohint, bool *passed)
+TEST_F(TestLibRBD, TestCompareAndWriteTooLargePP)
 {
 {
-  size_t written;
-  ceph::bufferlist cmp_bl;
-  cmp_bl.append(cmp_data, strlen(cmp_data));
-  ceph::bufferlist test_bl;
-  test_bl.append(test_data, strlen(test_data));
-  printf("start compare and write\n");
-  written = image.compare_and_write(off, len, cmp_bl, test_bl, mismatch_off, iohint);
-  printf("compare and  wrote: %d\n", (int) written);
-  ASSERT_EQ(len, static_cast<ssize_t>(written));
-  *passed = true;
+  REQUIRE(!is_rbd_pwl_enabled((CephContext *)_rados.cct()));
+
+  librados::IoCtx ioctx;
+  ASSERT_EQ(0, _rados.ioctx_create(m_pool_name.c_str(), ioctx));
+
+  {
+    librbd::RBD rbd;
+    librbd::Image image;
+    int order = 0;
+    std::string name = get_temp_image_name();
+    uint64_t size = 20 << 20; /* 20MiB */
+
+    ASSERT_EQ(0, create_image_pp(rbd, ioctx, name.c_str(), size, &order));
+    ASSERT_EQ(0, rbd.open(ioctx, image, name.c_str(), NULL));
+
+    // large write test => we allow stripe unit size writes (aligned)
+    uint64_t stripe_unit = image.get_stripe_unit();
+    std::string large_write_buffer(stripe_unit * 2, '2');
+    ceph::bufferlist large_write_bl;
+    large_write_bl.append(large_write_buffer.data(),
+                          large_write_buffer.length());
+
+    std::string large_cmp_buffer(stripe_unit * 2, '3');
+    ceph::bufferlist large_cmp_bl;
+    large_cmp_bl.append(large_cmp_buffer.data(), large_cmp_buffer.length());
+
+    ssize_t written = image.write(stripe_unit, large_cmp_bl.length(),
+                                  large_cmp_bl);
+    ASSERT_EQ(large_cmp_bl.length(), written);
+
+    /*
+     * compare and write at offset stripe_unit and stripe unit size + 1
+     * Expect fail because access is larger than stripe unit size
+     */
+    uint64_t mismatch_off = 0;
+    written = image.compare_and_write(stripe_unit, stripe_unit + 1,
+                                      large_cmp_bl,
+                                      large_write_bl,
+                                      &mismatch_off, 0);
+    ASSERT_EQ(-EINVAL, written);
+    ASSERT_EQ(0U, mismatch_off);
+
+    // check nothing has been written
+    ASSERT_PASSED(compare_written, image, stripe_unit, large_cmp_bl.length(),
+                  large_cmp_buffer);
+
+    ASSERT_PASSED(validate_object_map, image);
+  }
+
+  ioctx.close();
 }
 
 }
 
-TEST_F(TestLibRBD, TestIOPP)
+TEST_F(TestLibRBD, TestAioCompareAndWriteTooLargePP)
 {
 {
+  REQUIRE(!is_rbd_pwl_enabled((CephContext *)_rados.cct()));
+
   librados::IoCtx ioctx;
   ASSERT_EQ(0, _rados.ioctx_create(m_pool_name.c_str(), ioctx));
 
   librados::IoCtx ioctx;
   ASSERT_EQ(0, _rados.ioctx_create(m_pool_name.c_str(), ioctx));
 
@@ -2966,80 +4620,156 @@ TEST_F(TestLibRBD, TestIOPP)
     librbd::Image image;
     int order = 0;
     std::string name = get_temp_image_name();
     librbd::Image image;
     int order = 0;
     std::string name = get_temp_image_name();
-    uint64_t size = 2 << 20;
+    uint64_t size = 20 << 20; /* 20MiB */
 
     ASSERT_EQ(0, create_image_pp(rbd, ioctx, name.c_str(), size, &order));
     ASSERT_EQ(0, rbd.open(ioctx, image, name.c_str(), NULL));
 
 
     ASSERT_EQ(0, create_image_pp(rbd, ioctx, name.c_str(), size, &order));
     ASSERT_EQ(0, rbd.open(ioctx, image, name.c_str(), NULL));
 
-    bool skip_discard = this->is_skip_partial_discard_enabled(image);
+    // large write test => we allow stripe unit size writes (aligned)
+    uint64_t stripe_unit = image.get_stripe_unit();
+    std::string large_write_buffer(stripe_unit * 2, '2');
+    ceph::bufferlist large_write_bl;
+    large_write_bl.append(large_write_buffer.data(),
+                          large_write_buffer.length());
+
+    std::string large_cmp_buffer(stripe_unit * 2, '3');
+    ceph::bufferlist large_cmp_bl;
+    large_cmp_bl.append(large_cmp_buffer.data(), large_cmp_buffer.length());
+
+    ssize_t written = image.write(stripe_unit, large_cmp_bl.length(),
+                                  large_cmp_bl);
+    ASSERT_EQ(large_cmp_bl.length(), written);
+
+    /*
+     * compare and write at offset stripe_unit and stripe unit size + 1
+     * Expect fail because access is larger than stripe unit size
+     */
+    librbd::RBD::AioCompletion *comp = new librbd::RBD::AioCompletion(
+        NULL, (librbd::callback_t) simple_write_cb_pp);
+    uint64_t mismatch_off = 0;
+    int ret = image.aio_compare_and_write(stripe_unit, stripe_unit + 1,
+                                          large_cmp_bl,
+                                          large_write_bl,
+                                          comp, &mismatch_off, 0);
+    ASSERT_EQ(0, ret);
+    comp->wait_for_complete();
+    ssize_t aio_ret = comp->get_return_value();
+    ASSERT_EQ(-EINVAL, aio_ret);
+    ASSERT_EQ(0U, mismatch_off);
+    comp->release();
 
 
-    char test_data[TEST_IO_SIZE + 1];
-    char zero_data[TEST_IO_SIZE + 1];
-    int i;
-    uint64_t mismatch_offset;
+    // check nothing has been written
+    ASSERT_PASSED(compare_written, image, stripe_unit, large_cmp_bl.length(),
+                  large_cmp_buffer);
 
 
-    for (i = 0; i < TEST_IO_SIZE; ++i) {
-      test_data[i] = (char) (rand() % (126 - 33) + 33);
-    }
-    test_data[TEST_IO_SIZE] = '\0';
-    memset(zero_data, 0, sizeof(zero_data));
+    ASSERT_PASSED(validate_object_map, image);
+  }
 
 
-    for (i = 0; i < 5; ++i)
-      ASSERT_PASSED(write_test_data, image, test_data, strlen(test_data) * i, 0);
+  ioctx.close();
+}
 
 
-    for (i = 5; i < 10; ++i)
-      ASSERT_PASSED(aio_write_test_data, image, test_data, strlen(test_data) * i, 0);
+TEST_F(TestLibRBD, TestCompareAndWriteStripeUnitSuccessPP)
+{
+  librados::IoCtx ioctx;
+  ASSERT_EQ(0, _rados.ioctx_create(m_pool_name.c_str(), ioctx));
 
 
-    for (i = 0; i < 5; ++i)
-      ASSERT_PASSED(compare_and_write_test_data, image, test_data, test_data, TEST_IO_SIZE * i,
-        TEST_IO_SIZE, &mismatch_offset, 0);
+  {
+    librbd::RBD rbd;
+    librbd::Image image;
+    int order = 0;
+    std::string name = get_temp_image_name();
+    uint64_t size = 20 << 20; /* 20MiB */
 
 
-    for (i = 5; i < 10; ++i)
-      ASSERT_PASSED(aio_compare_and_write_test_data, image, test_data, test_data, TEST_IO_SIZE * i,
-        TEST_IO_SIZE, 0);
+    ASSERT_EQ(0, create_image_pp(rbd, ioctx, name.c_str(), size, &order));
+    ASSERT_EQ(0, rbd.open(ioctx, image, name.c_str(), NULL));
 
 
-    for (i = 0; i < 5; ++i)
-      ASSERT_PASSED(read_test_data, image, test_data, strlen(test_data) * i, TEST_IO_SIZE, 0);
+    // large write test => we allow stripe unit size writes (aligned)
+    uint64_t stripe_unit = image.get_stripe_unit();
+    std::string large_write_buffer(stripe_unit * 2, '2');
+    ceph::bufferlist large_write_bl;
+    large_write_bl.append(large_write_buffer.data(),
+                          large_write_buffer.length());
+
+    std::string large_cmp_buffer(stripe_unit * 2, '3');
+    ceph::bufferlist large_cmp_bl;
+    large_cmp_bl.append(large_cmp_buffer.data(), large_cmp_buffer.length());
+
+    ssize_t written = image.write(stripe_unit, large_cmp_bl.length(),
+                                  large_cmp_bl);
+    ASSERT_EQ(large_cmp_bl.length(), written);
+
+    // aligned stripe unit size access => expect success
+    uint64_t mismatch_off = 0;
+    written = image.compare_and_write(stripe_unit, stripe_unit,
+                                      large_cmp_bl,
+                                      large_write_bl,
+                                      &mismatch_off, 0);
+    ASSERT_EQ(stripe_unit, written);
+    ASSERT_EQ(0U, mismatch_off);
+
+    // check large_write_bl was written and nothing beyond
+    ASSERT_PASSED(compare_written, image, stripe_unit, stripe_unit,
+                  large_write_buffer);
+    ASSERT_PASSED(compare_written, image, stripe_unit * 2, stripe_unit,
+                  large_cmp_buffer);
 
 
-    for (i = 5; i < 10; ++i)
-      ASSERT_PASSED(aio_read_test_data, image, test_data, strlen(test_data) * i, TEST_IO_SIZE, 0);
+    ASSERT_PASSED(validate_object_map, image);
+  }
 
 
-    // discard 2nd, 4th sections.
-    ASSERT_PASSED(discard_test_data, image, TEST_IO_SIZE, TEST_IO_SIZE);
-    ASSERT_PASSED(aio_discard_test_data, image, TEST_IO_SIZE*3, TEST_IO_SIZE);
+  ioctx.close();
+}
 
 
-    ASSERT_PASSED(read_test_data, image, test_data,  0, TEST_IO_SIZE, 0);
-    ASSERT_PASSED(read_test_data, image, skip_discard ? test_data : zero_data,
-                 TEST_IO_SIZE, TEST_IO_SIZE, 0);
-    ASSERT_PASSED(read_test_data, image, test_data,  TEST_IO_SIZE*2, TEST_IO_SIZE, 0);
-    ASSERT_PASSED(read_test_data, image, skip_discard ? test_data : zero_data,
-                 TEST_IO_SIZE*3, TEST_IO_SIZE, 0);
-    ASSERT_PASSED(read_test_data, image, test_data,  TEST_IO_SIZE*4, TEST_IO_SIZE, 0);
+TEST_F(TestLibRBD, TestAioCompareAndWriteStripeUnitSuccessPP)
+{
+  librados::IoCtx ioctx;
+  ASSERT_EQ(0, _rados.ioctx_create(m_pool_name.c_str(), ioctx));
 
 
-    for (i = 0; i < 15; ++i) {
-      if (i % 3 == 2) {
-        ASSERT_PASSED(writesame_test_data, image, test_data, TEST_IO_SIZE * i, TEST_IO_SIZE * i * 32 + i, TEST_IO_SIZE, 0);
-        ASSERT_PASSED(writesame_test_data, image, zero_data, TEST_IO_SIZE * i, TEST_IO_SIZE * i * 32 + i, TEST_IO_SIZE, 0);
-      } else if (i % 3 == 1) {
-        ASSERT_PASSED(writesame_test_data, image, test_data, TEST_IO_SIZE + i, TEST_IO_SIZE * i * 32, TEST_IO_SIZE, 0);
-        ASSERT_PASSED(writesame_test_data, image, zero_data, TEST_IO_SIZE + i, TEST_IO_SIZE * i * 32, TEST_IO_SIZE, 0);
-      } else {
-        ASSERT_PASSED(writesame_test_data, image, test_data, TEST_IO_SIZE * i, TEST_IO_SIZE * i * 32, TEST_IO_SIZE, 0);
-        ASSERT_PASSED(writesame_test_data, image, zero_data, TEST_IO_SIZE * i, TEST_IO_SIZE * i * 32, TEST_IO_SIZE, 0);
-      }
-    }
-    for (i = 0; i < 15; ++i) {
-      if (i % 3 == 2) {
-        ASSERT_PASSED(aio_writesame_test_data, image, test_data, TEST_IO_SIZE * i, TEST_IO_SIZE * i * 32 + i, TEST_IO_SIZE, 0);
-        ASSERT_PASSED(aio_writesame_test_data, image, zero_data, TEST_IO_SIZE * i, TEST_IO_SIZE * i * 32 + i, TEST_IO_SIZE, 0);
-      } else if (i % 3 == 1) {
-        ASSERT_PASSED(aio_writesame_test_data, image, test_data, TEST_IO_SIZE + i, TEST_IO_SIZE * i * 32, TEST_IO_SIZE, 0);
-        ASSERT_PASSED(aio_writesame_test_data, image, zero_data, TEST_IO_SIZE + i, TEST_IO_SIZE * i * 32, TEST_IO_SIZE, 0);
-      } else {
-        ASSERT_PASSED(aio_writesame_test_data, image, test_data, TEST_IO_SIZE * i, TEST_IO_SIZE * i * 32, TEST_IO_SIZE, 0);
-        ASSERT_PASSED(aio_writesame_test_data, image, zero_data, TEST_IO_SIZE * i, TEST_IO_SIZE * i * 32, TEST_IO_SIZE, 0);
-      }
-    }
+  {
+    librbd::RBD rbd;
+    librbd::Image image;
+    int order = 0;
+    std::string name = get_temp_image_name();
+    uint64_t size = 20 << 20; /* 20MiB */
+
+    ASSERT_EQ(0, create_image_pp(rbd, ioctx, name.c_str(), size, &order));
+    ASSERT_EQ(0, rbd.open(ioctx, image, name.c_str(), NULL));
+
+    // large write test => we allow stripe unit size writes (aligned)
+    uint64_t stripe_unit = image.get_stripe_unit();
+    std::string large_write_buffer(stripe_unit * 2, '2');
+    ceph::bufferlist large_write_bl;
+    large_write_bl.append(large_write_buffer.data(),
+                          large_write_buffer.length());
+
+    std::string large_cmp_buffer(stripe_unit * 2, '3');
+    ceph::bufferlist large_cmp_bl;
+    large_cmp_bl.append(large_cmp_buffer.data(),
+                        large_cmp_buffer.length());
+
+    ssize_t written = image.write(stripe_unit, large_cmp_bl.length(),
+                                  large_cmp_bl);
+    ASSERT_EQ(large_cmp_bl.length(), written);
+
+    // aligned stripe unit size access => expect success
+    librbd::RBD::AioCompletion *comp = new librbd::RBD::AioCompletion(
+        NULL, (librbd::callback_t) simple_write_cb_pp);
+    uint64_t mismatch_off = 0;
+    int ret = image.aio_compare_and_write(stripe_unit, stripe_unit,
+                                          large_cmp_bl,
+                                          large_write_bl,
+                                          comp, &mismatch_off, 0);
+    ASSERT_EQ(0, ret);
+    comp->wait_for_complete();
+    ssize_t aio_ret = comp->get_return_value();
+    ASSERT_EQ(0, aio_ret);
+    ASSERT_EQ(0U, mismatch_off);
+    comp->release();
+
+    // check large_write_bl was written and nothing beyond
+    ASSERT_PASSED(compare_written, image, stripe_unit, stripe_unit,
+                  large_write_buffer);
+    ASSERT_PASSED(compare_written, image, stripe_unit * 2, stripe_unit,
+                  large_cmp_buffer);
 
     ASSERT_PASSED(validate_object_map, image);
   }
 
     ASSERT_PASSED(validate_object_map, image);
   }
@@ -5127,14 +6857,14 @@ void compare_and_write_copyup(librados::IoCtx &ioctx, bool deep_copyup,
   }
 
   bufferlist cmp_bl;
   }
 
   bufferlist cmp_bl;
-  cmp_bl.append(std::string(96, '1'));
+  cmp_bl.append(std::string(512, '1'));
   bufferlist write_bl;
   write_bl.append(std::string(512, '2'));
   bufferlist write_bl;
   write_bl.append(std::string(512, '2'));
-  uint64_t mismatch_off;
+  uint64_t mismatch_off = 0;
   ASSERT_EQ((ssize_t)write_bl.length(),
             clone_image.compare_and_write(512, write_bl.length(), cmp_bl,
                                           write_bl, &mismatch_off, 0));
   ASSERT_EQ((ssize_t)write_bl.length(),
             clone_image.compare_and_write(512, write_bl.length(), cmp_bl,
                                           write_bl, &mismatch_off, 0));
-
+  ASSERT_EQ(0U, mismatch_off);
   bufferlist read_bl;
   ASSERT_EQ(4096, clone_image.read(0, 4096, read_bl));
 
   bufferlist read_bl;
   ASSERT_EQ(4096, clone_image.read(0, 4096, read_bl));
 
@@ -5191,10 +6921,10 @@ void compare_and_write_copyup_mismatch(librados::IoCtx &ioctx,
 
   bufferlist cmp_bl;
   cmp_bl.append(std::string(48, '1'));
 
   bufferlist cmp_bl;
   cmp_bl.append(std::string(48, '1'));
-  cmp_bl.append(std::string(48, '3'));
+  cmp_bl.append(std::string(464, '3'));
   bufferlist write_bl;
   write_bl.append(std::string(512, '2'));
   bufferlist write_bl;
   write_bl.append(std::string(512, '2'));
-  uint64_t mismatch_off;
+  uint64_t mismatch_off = 0;
   ASSERT_EQ(-EILSEQ,
             clone_image.compare_and_write(512, write_bl.length(), cmp_bl,
                                           write_bl, &mismatch_off, 0));
   ASSERT_EQ(-EILSEQ,
             clone_image.compare_and_write(512, write_bl.length(), cmp_bl,
                                           write_bl, &mismatch_off, 0));
index b57c66e8907cdfc43f003f46248cc5c3a814a4d0..2fe74d2fe4661ae4bb796fafef44798440d4740d 100644 (file)
@@ -463,6 +463,19 @@ public:
     return mock_journal->append_write_event(0, length, bl, false);
   }
 
     return mock_journal->append_write_event(0, length, bl, false);
   }
 
+  uint64_t when_append_compare_and_write_event(
+      MockJournalImageCtx &mock_image_ctx, MockJournal *mock_journal,
+      uint64_t length) {
+    bufferlist cmp_bl;
+    cmp_bl.append_zero(length);
+    bufferlist write_bl;
+    write_bl.append_zero(length);
+
+    std::shared_lock owner_locker{mock_image_ctx.owner_lock};
+    return mock_journal->append_compare_and_write_event(0, length, cmp_bl,
+                                                        write_bl, false);
+  }
+
   uint64_t when_append_io_event(MockJournalImageCtx &mock_image_ctx,
                                 MockJournal *mock_journal,
                                 int filter_ret_val) {
   uint64_t when_append_io_event(MockJournalImageCtx &mock_image_ctx,
                                 MockJournal *mock_journal,
                                 int filter_ret_val) {
@@ -1125,6 +1138,51 @@ TEST_F(TestMockJournal, AppendWriteEvent) {
   expect_shut_down_journaler(mock_journaler);
 }
 
   expect_shut_down_journaler(mock_journaler);
 }
 
+TEST_F(TestMockJournal, AppendCompareAndWriteEvent) {
+  REQUIRE_FEATURE(RBD_FEATURE_JOURNALING);
+
+  librbd::ImageCtx *ictx;
+  ASSERT_EQ(0, open_image(m_image_name, &ictx));
+
+  MockJournalImageCtx mock_image_ctx(*ictx);
+  MockJournal *mock_journal = new MockJournal(mock_image_ctx);
+  MockObjectDispatch mock_object_dispatch;
+  ::journal::MockJournaler mock_journaler;
+  MockJournalOpenRequest mock_open_request;
+  open_journal(mock_image_ctx, mock_journal, mock_object_dispatch,
+               mock_journaler, mock_open_request);
+  BOOST_SCOPE_EXIT_ALL(&) {
+    close_journal(mock_image_ctx, mock_journal, mock_journaler);
+    mock_journal->put();
+  };
+
+  InSequence seq;
+
+  ::journal::MockFuture mock_future;
+  Context *on_journal_safe = nullptr;
+  expect_append_journaler(mock_journaler);
+  expect_append_journaler(mock_journaler);
+  expect_append_journaler(mock_journaler);
+  expect_wait_future(mock_future, &on_journal_safe);
+  ASSERT_EQ(1U, when_append_compare_and_write_event(mock_image_ctx,
+                                                    mock_journal,
+                                                    1 << 16));
+  mock_journal->get_work_queue()->drain();
+
+  on_journal_safe->complete(0);
+  C_SaferCond event_ctx;
+  mock_journal->wait_event(1U, &event_ctx);
+  ASSERT_EQ(0, event_ctx.wait());
+
+  expect_future_committed(mock_journaler);
+  expect_future_committed(mock_journaler);
+  expect_future_committed(mock_journaler);
+  mock_journal->commit_io_event(1U, 0);
+  ictx->op_work_queue->drain();
+
+  expect_shut_down_journaler(mock_journaler);
+}
+
 TEST_F(TestMockJournal, EventCommitError) {
   REQUIRE_FEATURE(RBD_FEATURE_JOURNALING);
 
 TEST_F(TestMockJournal, EventCommitError) {
   REQUIRE_FEATURE(RBD_FEATURE_JOURNALING);
 
index ca5415ff6a930a84aead5d1a7af8cca9b3f8037e..a232d7355f9f5f89c36769b71a1a26e6152b1255 100644 (file)
@@ -106,7 +106,7 @@ struct Owner : public ElectionOwner, RankProvider {
  Owner(int r, ElectionLogic::election_strategy es, double tracker_halflife,
        Election *p) : parent(p), rank(r), persisted_epoch(0),
     ever_joined(false),
  Owner(int r, ElectionLogic::election_strategy es, double tracker_halflife,
        Election *p) : parent(p), rank(r), persisted_epoch(0),
     ever_joined(false),
-    peer_tracker(this, rank, tracker_halflife, 5),
+    peer_tracker(this, rank, tracker_halflife, 5, g_ceph_context),
     logic(this, es, &peer_tracker, 0.0005, g_ceph_context),
     victory_accepters(0),
     timer_steps(-1), timer_election(true) {
     logic(this, es, &peer_tracker, 0.0005, g_ceph_context),
     victory_accepters(0),
     timer_steps(-1), timer_election(true) {
@@ -124,9 +124,13 @@ struct Owner : public ElectionOwner, RankProvider {
   // don't need to do anything with our state right now
   void notify_bump_epoch() {}
   void notify_rank_removed(int removed_rank) {
   // don't need to do anything with our state right now
   void notify_bump_epoch() {}
   void notify_rank_removed(int removed_rank) {
-    peer_tracker.notify_rank_removed(removed_rank);
-    if (rank > removed_rank)
+    ldout(g_ceph_context, 1) << "removed_rank: " << removed_rank << dendl;
+    ldout(g_ceph_context, 1) << "rank before: " << rank << dendl;
+    if (removed_rank < rank) {
       --rank;
       --rank;
+    }
+    peer_tracker.notify_rank_removed(removed_rank, rank);
+    ldout(g_ceph_context, 1) << "rank after: " << rank << dendl;
   }
   void notify_deleted() { rank_deleted = true; rank = -1; cancel_timer(); }
   // pass back to ElectionLogic; we don't need this redirect ourselves
   }
   void notify_deleted() { rank_deleted = true; rank = -1; cancel_timer(); }
   // pass back to ElectionLogic; we don't need this redirect ourselves
@@ -216,7 +220,7 @@ struct Owner : public ElectionOwner, RankProvider {
     }
   }
   void receive_scores(bufferlist bl) {
     }
   }
   void receive_scores(bufferlist bl) {
-    ConnectionTracker oct(bl);
+    ConnectionTracker oct(bl, g_ceph_context);
     peer_tracker.receive_peer_report(oct);
     ldout(g_ceph_context, 10) << "received scores " << oct << dendl;
   }
     peer_tracker.receive_peer_report(oct);
     ldout(g_ceph_context, 10) << "received scores " << oct << dendl;
   }
@@ -362,7 +366,7 @@ void Election::propose_to(int from, int to, epoch_t e, bufferlist& cbl)
   Owner *o = electors[to];
   ConnectionTracker *oct = NULL;
   if (cbl.length()) {
   Owner *o = electors[to];
   ConnectionTracker *oct = NULL;
   if (cbl.length()) {
-    oct = new ConnectionTracker(cbl); // we leak these on blocked cons, meh
+    oct = new ConnectionTracker(cbl, g_ceph_context); // we leak these on blocked cons, meh
   }
   queue_election_message(from, to, [o, from, e, oct] {
       o->receive_propose(from, e, oct);
   }
   queue_election_message(from, to, [o, from, e, oct] {
       o->receive_propose(from, e, oct);
index dd95a0bc10875b68b86e78cf06441f413d428fdc..2e114c41e569d7041a1e46edca7a681d9d14b5b6 100644 (file)
@@ -6877,6 +6877,116 @@ INSTANTIATE_TEST_SUITE_P(
     "bluestore"));
 #endif
 
     "bluestore"));
 #endif
 
+
+struct deferred_test_t {
+  uint32_t bdev_block_size;
+  uint32_t min_alloc_size;
+  uint32_t max_blob_size;
+  uint32_t prefer_deferred_size;
+};
+
+void PrintTo(const deferred_test_t& t, ::std::ostream* os)
+{
+  *os << t.bdev_block_size << "/" << t.min_alloc_size << "/"
+      << t.max_blob_size << "/" << t.prefer_deferred_size;
+}
+
+class DeferredWriteTest : public StoreTestFixture,
+                         public ::testing::WithParamInterface<deferred_test_t> {
+public:
+  DeferredWriteTest()
+    : StoreTestFixture("bluestore")
+  {}
+  void SetUp() override {
+    //do nothing
+  }
+protected:
+  void DeferredSetup() {
+    StoreTestFixture::SetUp();
+  }
+public:
+  std::vector<uint32_t> offsets = {0, 3000, 4096, 20000, 32768, 65000, 65536, 80000, 128 * 1024};
+  std::vector<uint32_t> lengths = {1, 1000, 4096, 12000, 32768, 30000, 80000, 128 * 1024};
+};
+
+TEST_P(DeferredWriteTest, NewData) {
+  const bool print = false;
+  deferred_test_t t = GetParam();
+  SetVal(g_conf(), "bdev_block_size", stringify(t.bdev_block_size).c_str());
+  SetVal(g_conf(), "bluestore_min_alloc_size", stringify(t.min_alloc_size).c_str());
+  SetVal(g_conf(), "bluestore_max_blob_size", stringify(t.max_blob_size).c_str());
+  SetVal(g_conf(), "bluestore_prefer_deferred_size", stringify(t.prefer_deferred_size).c_str());
+  g_conf().apply_changes(nullptr);
+  DeferredSetup();
+
+  int r;
+  coll_t cid;
+  const PerfCounters* logger = store->get_perf_counters();
+  ObjectStore::CollectionHandle ch = store->create_new_collection(cid);
+  {
+    ObjectStore::Transaction t;
+    t.create_collection(cid, 0);
+    r = queue_transaction(store, ch, std::move(t));
+    ASSERT_EQ(r, 0);
+  }
+  {
+    for (auto offset:offsets) {
+      for (auto length:lengths) {
+       std::string hname = fmt::format("test-{}-{}", offset, length);
+       ghobject_t hoid(hobject_t(hname, "", CEPH_NOSNAP, 0, -1, ""));
+       {
+         ObjectStore::Transaction t;
+         t.touch(cid, hoid);
+         r = queue_transaction(store, ch, std::move(t));
+         ASSERT_EQ(r, 0);
+       }
+       if (print)
+         std::cout << hname << std::endl;
+
+       auto w_new =             logger->get(l_bluestore_write_new);
+       auto w_big_deferred =    logger->get(l_bluestore_write_big_deferred);
+       auto i_deferred_w =      logger->get(l_bluestore_issued_deferred_writes);
+       {
+         ObjectStore::Transaction t;
+         bufferlist bl;
+         bl.append(std::string(length, 'x'));
+         t.write(cid, hoid, offset, bl.length(), bl,
+                 CEPH_OSD_OP_FLAG_FADVISE_NOCACHE);
+         r = queue_transaction(store, ch, std::move(t));
+         ASSERT_EQ(r, 0);
+       }
+       uint32_t first_db = offset / t.bdev_block_size;
+       uint32_t last_db = (offset + length - 1) / t.bdev_block_size;
+
+       uint32_t write_size = (last_db - first_db + 1) * t.bdev_block_size;
+       if (write_size < t.prefer_deferred_size) {
+         // expect no direct writes
+         ASSERT_EQ(w_new ,             logger->get(l_bluestore_write_new));
+       } else {
+         // expect no deferred
+         ASSERT_EQ(w_big_deferred ,    logger->get(l_bluestore_write_big_deferred));
+         ASSERT_EQ(i_deferred_w ,      logger->get(l_bluestore_issued_deferred_writes));
+       }
+      }
+    }
+  }
+}
+
+#if defined(WITH_BLUESTORE)
+INSTANTIATE_TEST_SUITE_P(
+  BlueStore,
+  DeferredWriteTest,
+  ::testing::Values(
+    //              bdev      alloc      blob       deferred
+    deferred_test_t{4 * 1024, 4 * 1024,  16 * 1024, 32 * 1024},
+    deferred_test_t{4 * 1024, 16 * 1024, 64 * 1024, 64 * 1024},
+    deferred_test_t{4 * 1024, 64 * 1024, 64 * 1024, 4 * 1024},
+    deferred_test_t{4 * 1024, 4 * 1024, 64 * 1024, 0 * 1024},
+    deferred_test_t{4 * 1024, 16 * 1024, 32 * 1024, 32 * 1024},
+    deferred_test_t{4 * 1024, 16 * 1024, 64 * 1024, 128 * 1024}
+  ));
+#endif
+
 void doMany4KWritesTest(ObjectStore* store,
                         unsigned max_objects,
                         unsigned max_ops,
 void doMany4KWritesTest(ObjectStore* store,
                         unsigned max_objects,
                         unsigned max_ops,
@@ -8664,6 +8774,96 @@ TEST_P(StoreTestSpecificAUSize, SmallWriteOnShardedExtents) {
   }
 }
 
   }
 }
 
+TEST_P(StoreTestSpecificAUSize, ReproBug56488Test) {
+
+  if (string(GetParam()) != "bluestore")
+    return;
+  if (smr) {
+    cout << "SKIP: no deferred" << std::endl;
+    return;
+  }
+
+  size_t alloc_size = 65536;
+  size_t write_size = 4096;
+  SetVal(g_conf(), "bluestore_debug_enforce_settings", "hdd");
+  SetVal(g_conf(), "bluestore_block_db_create", "true");
+  SetVal(g_conf(), "bluestore_block_db_size", stringify(1 << 30).c_str());
+
+  g_conf().apply_changes(nullptr);
+  StartDeferred(alloc_size);
+
+  int r;
+  coll_t cid;
+  const PerfCounters* logger = store->get_perf_counters();
+
+  ObjectStore::CollectionHandle ch = store->create_new_collection(cid);
+  {
+    ObjectStore::Transaction t;
+    t.create_collection(cid, 0);
+    r = queue_transaction(store, ch, std::move(t));
+    ASSERT_EQ(r, 0);
+  }
+  {
+    ghobject_t hoid(hobject_t("test", "", CEPH_NOSNAP, 0, -1, ""));
+    {
+      ObjectStore::Transaction t;
+      t.touch(cid, hoid);
+      r = queue_transaction(store, ch, std::move(t));
+      ASSERT_EQ(r, 0);
+    }
+
+    auto issued_dw = logger->get(l_bluestore_issued_deferred_writes);
+    auto issued_dw_bytes = logger->get(l_bluestore_issued_deferred_write_bytes);
+    {
+      ObjectStore::Transaction t;
+      bufferlist bl;
+      bl.append(std::string(write_size, 'x'));
+      t.write(cid, hoid, 0, bl.length(), bl,
+             CEPH_OSD_OP_FLAG_FADVISE_NOCACHE);
+      r = queue_transaction(store, ch, std::move(t));
+      ASSERT_EQ(r, 0);
+    }
+    ASSERT_EQ(logger->get(l_bluestore_issued_deferred_writes), issued_dw + 1);
+    ASSERT_EQ(logger->get(l_bluestore_issued_deferred_write_bytes),
+      issued_dw_bytes + write_size);
+  }
+  {
+    ghobject_t hoid(hobject_t("test-a", "", CEPH_NOSNAP, 0, -1, ""));
+    {
+      ObjectStore::Transaction t;
+      t.touch(cid, hoid);
+      r = queue_transaction(store, ch, std::move(t));
+      ASSERT_EQ(r, 0);
+    }
+
+    auto issued_dw = logger->get(l_bluestore_issued_deferred_writes);
+    auto issued_dw_bytes = logger->get(l_bluestore_issued_deferred_write_bytes);
+    {
+      ObjectStore::Transaction t;
+      bufferlist bl;
+      bl.append(std::string(write_size * 2, 'x'));
+      t.write(cid, hoid, alloc_size - write_size, bl.length(), bl,
+             CEPH_OSD_OP_FLAG_FADVISE_NOCACHE);
+      r = queue_transaction(store, ch, std::move(t));
+      ASSERT_EQ(r, 0);
+    }
+    ASSERT_EQ(logger->get(l_bluestore_issued_deferred_writes), issued_dw + 2);
+    ASSERT_EQ(logger->get(l_bluestore_issued_deferred_write_bytes),
+      issued_dw_bytes + write_size * 2);
+  }
+  {
+    ObjectStore::Transaction t;
+    ghobject_t hoid(hobject_t("test", "", CEPH_NOSNAP, 0, -1, ""));
+    t.remove(cid, hoid);
+    ghobject_t hoid_a(hobject_t("test-a", "", CEPH_NOSNAP, 0, -1, ""));
+    t.remove(cid, hoid_a);
+    t.remove_collection(cid);
+    cerr << "Cleaning" << std::endl;
+    r = queue_transaction(store, ch, std::move(t));
+    ASSERT_EQ(r, 0);
+  }
+}
+
 #endif //#if defined(WITH_BLUESTORE)
 
 TEST_P(StoreTest, KVDBHistogramTest) {
 #endif //#if defined(WITH_BLUESTORE)
 
 TEST_P(StoreTest, KVDBHistogramTest) {
@@ -8974,7 +9174,6 @@ TEST_P(StoreTestSpecificAUSize, BluestoreRepairTest) {
   SetVal(g_conf(), "bluestore_max_blob_size", 
     stringify(2 * offs_base).c_str());
   SetVal(g_conf(), "bluestore_extent_map_shard_max_size", "12000");
   SetVal(g_conf(), "bluestore_max_blob_size", 
     stringify(2 * offs_base).c_str());
   SetVal(g_conf(), "bluestore_extent_map_shard_max_size", "12000");
-  SetVal(g_conf(), "bluestore_fsck_error_on_no_per_pool_stats", "false");
 
   StartDeferred(0x10000);
 
 
   StartDeferred(0x10000);
 
@@ -9022,7 +9221,7 @@ TEST_P(StoreTestSpecificAUSize, BluestoreRepairTest) {
   ASSERT_EQ(bstore->fsck(false), 0);
   ASSERT_EQ(bstore->repair(false), 0);
   bstore->mount();
   ASSERT_EQ(bstore->fsck(false), 0);
   ASSERT_EQ(bstore->repair(false), 0);
   bstore->mount();
-  if (!bstore->has_null_fm()) {
+  if (!bstore->has_null_manager()) {
     bstore->inject_leaked(0x30000);
     err_was_injected = true;
   }
     bstore->inject_leaked(0x30000);
     err_was_injected = true;
   }
@@ -9037,7 +9236,7 @@ TEST_P(StoreTestSpecificAUSize, BluestoreRepairTest) {
   //////////// false free fix ////////////
   cerr << "fix false free pextents" << std::endl;
   bstore->mount();
   //////////// false free fix ////////////
   cerr << "fix false free pextents" << std::endl;
   bstore->mount();
-  if (!bstore->has_null_fm()) {
+  if (!bstore->has_null_manager()) {
     bstore->inject_false_free(cid, hoid);
     err_was_injected = true;
   }
     bstore->inject_false_free(cid, hoid);
     err_was_injected = true;
   }
@@ -9048,29 +9247,9 @@ TEST_P(StoreTestSpecificAUSize, BluestoreRepairTest) {
   }
   ASSERT_EQ(bstore->fsck(false), 0);
 
   }
   ASSERT_EQ(bstore->fsck(false), 0);
 
-  //////////// verify invalid statfs ///////////
-  cerr << "fix invalid statfs" << std::endl;
-  store_statfs_t statfs0, statfs;
-  bstore->mount();
-  ASSERT_EQ(bstore->statfs(&statfs0), 0);
-  statfs = statfs0;
-  statfs.allocated += 0x10000;
-  statfs.data_stored += 0x10000;
-  ASSERT_FALSE(statfs0 == statfs);
-  bstore->inject_statfs("bluestore_statfs", statfs);
-  bstore->umount();
-
-  ASSERT_EQ(bstore->fsck(false), 2);
-  ASSERT_EQ(bstore->repair(false), 0);
-  ASSERT_EQ(bstore->fsck(false), 0);
-  ASSERT_EQ(bstore->mount(), 0);
-  ASSERT_EQ(bstore->statfs(&statfs), 0);
-  // adjust free/internal meta space to success in comparison
-  statfs0.available = statfs.available;
-  statfs0.internal_metadata = statfs.internal_metadata;
-  ASSERT_EQ(statfs0, statfs);
 
   ///////// undecodable shared blob key / stray shared blob records ///////
 
   ///////// undecodable shared blob key / stray shared blob records ///////
+  bstore->mount();
   cerr << "undecodable shared blob key" << std::endl;
   bstore->inject_broken_shared_blob_key("undec1",
                            bufferlist());
   cerr << "undecodable shared blob key" << std::endl;
   bstore->inject_broken_shared_blob_key("undec1",
                            bufferlist());
@@ -9088,7 +9267,7 @@ TEST_P(StoreTestSpecificAUSize, BluestoreRepairTest) {
   bstore->inject_misreference(cid, hoid, cid, hoid_dup, 0);
   bstore->inject_misreference(cid, hoid, cid, hoid_dup, (offs_base * repeats) / 2);
   bstore->inject_misreference(cid, hoid, cid, hoid_dup, offs_base * (repeats -1) );
   bstore->inject_misreference(cid, hoid, cid, hoid_dup, 0);
   bstore->inject_misreference(cid, hoid, cid, hoid_dup, (offs_base * repeats) / 2);
   bstore->inject_misreference(cid, hoid, cid, hoid_dup, offs_base * (repeats -1) );
-  int expected_errors = bstore->has_null_fm() ? 3 : 6;
+  int expected_errors = bstore->has_null_manager() ? 3 : 6;
   bstore->umount();
   ASSERT_EQ(bstore->fsck(false), expected_errors);
   ASSERT_EQ(bstore->repair(false), 0);
   bstore->umount();
   ASSERT_EQ(bstore->fsck(false), expected_errors);
   ASSERT_EQ(bstore->repair(false), 0);
@@ -9122,7 +9301,9 @@ TEST_P(StoreTestSpecificAUSize, BluestoreRepairTest) {
     }
 
     bstore->umount();
     }
 
     bstore->umount();
-    ASSERT_EQ(bstore->fsck(false), 4);
+    // depending on statfs tracking we might meet or miss relevant error
+    // hence error count >= 3
+    ASSERT_GE(bstore->fsck(false), 3);
     ASSERT_LE(bstore->repair(false), 0);
     ASSERT_EQ(bstore->fsck(false), 0);
   }
     ASSERT_LE(bstore->repair(false), 0);
     ASSERT_EQ(bstore->fsck(false), 0);
   }
@@ -9156,9 +9337,58 @@ TEST_P(StoreTestSpecificAUSize, BluestoreRepairTest) {
     ASSERT_EQ(bstore->fsck(false), 0);
   }
 
     ASSERT_EQ(bstore->fsck(false), 0);
   }
 
-  cerr << "Completing" << std::endl;
+  //////////// verify invalid statfs ///////////
+  cerr << "fix invalid statfs" << std::endl;
+  SetVal(g_conf(), "bluestore_fsck_error_on_no_per_pool_stats", "true");
+  SetVal(g_conf(),
+    "bluestore_debug_inject_allocation_from_file_failure", "1");
+  store_statfs_t statfs0;
+  store_statfs_t statfs;
   bstore->mount();
   bstore->mount();
+  ASSERT_EQ(bstore->statfs(&statfs0), 0);
+  statfs = statfs0;
+  statfs.allocated += 0x10000;
+  statfs.data_stored += 0x10000;
+  ASSERT_FALSE(statfs0 == statfs);
+  // this enforces global stats usage
+  bstore->inject_statfs("bluestore_statfs", statfs);
+  bstore->umount();
 
 
+  ASSERT_GE(bstore->fsck(false), 1); // global stats mismatch might omitted when
+                                     // NCB restore is applied. Hence using >= for
+                                     // error count
+  ASSERT_EQ(bstore->repair(false), 0);
+  ASSERT_EQ(bstore->fsck(false), 0);
+  ASSERT_EQ(bstore->mount(), 0);
+  ASSERT_EQ(bstore->statfs(&statfs), 0);
+  // adjust free/internal meta space to success in comparison
+  statfs0.available = statfs.available;
+  statfs0.internal_metadata = statfs.internal_metadata;
+  ASSERT_EQ(statfs0, statfs);
+
+  SetVal(g_conf(),
+    "bluestore_debug_inject_allocation_from_file_failure", "0");
+  cerr << "fix invalid statfs2" << std::endl;
+  ASSERT_EQ(bstore->statfs(&statfs0), 0);
+  statfs = statfs0;
+  statfs.allocated += 0x20000;
+  statfs.data_stored += 0x20000;
+  ASSERT_FALSE(statfs0 == statfs);
+  // this enforces global stats usage
+  bstore->inject_statfs("bluestore_statfs", statfs);
+  bstore->umount();
+
+  ASSERT_EQ(bstore->fsck(false), 2);
+  ASSERT_EQ(bstore->repair(false), 0);
+  ASSERT_EQ(bstore->fsck(false), 0);
+  ASSERT_EQ(bstore->mount(), 0);
+  ASSERT_EQ(bstore->statfs(&statfs), 0);
+  // adjust free/internal meta space to success in comparison
+  statfs0.available = statfs.available;
+  statfs0.internal_metadata = statfs.internal_metadata;
+  ASSERT_EQ(statfs0, statfs);
+
+  cerr << "Completing" << std::endl;
 }
 
 TEST_P(StoreTestSpecificAUSize, BluestoreBrokenZombieRepairTest) {
 }
 
 TEST_P(StoreTestSpecificAUSize, BluestoreBrokenZombieRepairTest) {
@@ -9377,9 +9607,9 @@ TEST_P(StoreTestSpecificAUSize, BluestoreBrokenNoSharedBlobRepairTest) {
     // value
     size_t expected_error_count =
       has_null_manager ?
     // value
     size_t expected_error_count =
       has_null_manager ?
-      5: // 4 sb ref mismatch errors + 1 statfs mismatch
+      4: // 4 sb ref mismatch errors [+ 1 optional statfs, hence ASSERT_GE]
       7; // 4 sb ref mismatch errors + 1 statfs + 1 block leak + 1 non-free
       7; // 4 sb ref mismatch errors + 1 statfs + 1 block leak + 1 non-free
-    ASSERT_EQ(bstore->fsck(false), expected_error_count);
+    ASSERT_GE(bstore->fsck(false), expected_error_count);
     // repair might report less errors than fsck above showed
     // as some errors, e.g. statfs mismatch, are implicitly fixed
     // before the detection during the previous repair steps...
     // repair might report less errors than fsck above showed
     // as some errors, e.g. statfs mismatch, are implicitly fixed
     // before the detection during the previous repair steps...
@@ -10651,10 +10881,11 @@ int main(int argc, char **argv) {
   g_ceph_context->_conf.set_val_or_die("bluestore_debug_freelist", "true");
   g_ceph_context->_conf.set_val_or_die("bluestore_clone_cow", "true");
   g_ceph_context->_conf.set_val_or_die("bluestore_max_alloc_size", "196608");
   g_ceph_context->_conf.set_val_or_die("bluestore_debug_freelist", "true");
   g_ceph_context->_conf.set_val_or_die("bluestore_clone_cow", "true");
   g_ceph_context->_conf.set_val_or_die("bluestore_max_alloc_size", "196608");
-
   // set small cache sizes so we see trimming during Synthetic tests
   g_ceph_context->_conf.set_val_or_die("bluestore_cache_size_hdd", "4000000");
   g_ceph_context->_conf.set_val_or_die("bluestore_cache_size_ssd", "4000000");
   // set small cache sizes so we see trimming during Synthetic tests
   g_ceph_context->_conf.set_val_or_die("bluestore_cache_size_hdd", "4000000");
   g_ceph_context->_conf.set_val_or_die("bluestore_cache_size_ssd", "4000000");
+  g_ceph_context->_conf.set_val_or_die(
+  "bluestore_debug_inject_allocation_from_file_failure", "0.66");
 
   // very short *_max prealloc so that we fall back to async submits
   g_ceph_context->_conf.set_val_or_die("bluestore_blobid_prealloc", "10");
 
   // very short *_max prealloc so that we fall back to async submits
   g_ceph_context->_conf.set_val_or_die("bluestore_blobid_prealloc", "10");
index 2a84b27c9992e22c59e1e6a182e0099860f33b2c..e3e154df841f67d3aa3366c14508d29d7b0038ef 100644 (file)
 #include <random>
 #include <thread>
 #include <stack>
 #include <random>
 #include <thread>
 #include <stack>
+#include <gtest/gtest.h>
 #include "global/global_init.h"
 #include "common/ceph_argparse.h"
 #include "include/stringify.h"
 #include "include/scope_guard.h"
 #include "common/errno.h"
 #include "global/global_init.h"
 #include "common/ceph_argparse.h"
 #include "include/stringify.h"
 #include "include/scope_guard.h"
 #include "common/errno.h"
-#include <gtest/gtest.h>
 
 
+#include "os/bluestore/Allocator.h"
 #include "os/bluestore/BlueFS.h"
 
 using namespace std;
 #include "os/bluestore/BlueFS.h"
 
 using namespace std;
@@ -234,7 +235,7 @@ TEST(BlueFS, very_large_write) {
     delete h;
     ASSERT_EQ(0, fs.open_for_read("dir", "bigfile", &h));
     ASSERT_EQ(h->file->fnode.size, total_written);
     delete h;
     ASSERT_EQ(0, fs.open_for_read("dir", "bigfile", &h));
     ASSERT_EQ(h->file->fnode.size, total_written);
-    unique_ptr<char> huge_buf(new char[h->file->fnode.size]);
+    auto huge_buf = std::make_unique<char[]>(h->file->fnode.size);
     auto l = h->file->fnode.size;
     int64_t r = fs.read(h, 0, l, NULL, huge_buf.get());
     ASSERT_EQ(r, l);
     auto l = h->file->fnode.size;
     int64_t r = fs.read(h, 0, l, NULL, huge_buf.get());
     ASSERT_EQ(r, l);
@@ -1013,6 +1014,225 @@ TEST(BlueFS, test_update_ino1_delta_after_replay) {
   fs.umount();
 }
 
   fs.umount();
 }
 
+TEST(BlueFS, test_shared_alloc) {
+  uint64_t size = 1048576 * 128;
+  TempBdev bdev_slow{size};
+  uint64_t size_db = 1048576 * 8;
+  TempBdev bdev_db{size_db};
+
+  ConfSaver conf(g_ceph_context->_conf);
+  conf.SetVal("bluefs_shared_alloc_size", "1048576");
+
+  bluefs_shared_alloc_context_t shared_alloc;
+  uint64_t shared_alloc_unit = 4096;
+  shared_alloc.set(
+    Allocator::create(g_ceph_context, g_ceph_context->_conf->bluefs_allocator,
+                      size, shared_alloc_unit, 0, 0, "test shared allocator"),
+    shared_alloc_unit);
+  shared_alloc.a->init_add_free(0, size);
+
+  BlueFS fs(g_ceph_context);
+  // DB device is fully utilized
+  ASSERT_EQ(0, fs.add_block_device(BlueFS::BDEV_DB, bdev_db.path, false, size_db - 0x1000));
+  ASSERT_EQ(0, fs.add_block_device(BlueFS::BDEV_SLOW, bdev_slow.path, false, 0,
+                                   &shared_alloc));
+  uuid_d fsid;
+  ASSERT_EQ(0, fs.mkfs(fsid, { BlueFS::BDEV_DB, false, false }));
+  ASSERT_EQ(0, fs.mount());
+  ASSERT_EQ(0, fs.maybe_verify_layout({ BlueFS::BDEV_DB, false, false }));
+  {
+    for (int i=0; i<10; i++) {
+       string dir = "dir.";
+       dir.append(to_string(i));
+       ASSERT_EQ(0, fs.mkdir(dir));
+       for (int j=0; j<10; j++) {
+          string file = "file.";
+         file.append(to_string(j));
+          BlueFS::FileWriter *h;
+          ASSERT_EQ(0, fs.open_for_write(dir, file, &h, false));
+          ASSERT_NE(nullptr, h);
+          auto sg = make_scope_guard([&fs, h] { fs.close_writer(h); });
+          bufferlist bl;
+          std::unique_ptr<char[]> buf = gen_buffer(4096);
+         bufferptr bp = buffer::claim_char(4096, buf.get());
+         bl.push_back(bp);
+          h->append(bl.c_str(), bl.length());
+          fs.fsync(h);
+       }
+    }
+  }
+  {
+    for (int i=0; i<10; i+=2) {
+       string dir = "dir.";
+       dir.append(to_string(i));
+       for (int j=0; j<10; j++) {
+          string file = "file.";
+         file.append(to_string(j));
+          fs.unlink(dir, file);
+         fs.sync_metadata(false);
+       }
+       ASSERT_EQ(0, fs.rmdir(dir));
+       fs.sync_metadata(false);
+    }
+  }
+  fs.compact_log();
+  auto *logger = fs.get_perf_counters();
+  ASSERT_NE(logger->get(l_bluefs_alloc_shared_dev_fallbacks), 0);
+  auto num_files = logger->get(l_bluefs_num_files);
+  fs.umount();
+  fs.mount();
+  ASSERT_EQ(num_files, logger->get(l_bluefs_num_files));
+  fs.umount();
+}
+
+TEST(BlueFS, test_shared_alloc_sparse) {
+  uint64_t size = 1048576 * 128 * 2;
+  uint64_t main_unit = 4096;
+  uint64_t bluefs_alloc_unit = 1048576;
+  TempBdev bdev_slow{size};
+
+  ConfSaver conf(g_ceph_context->_conf);
+  conf.SetVal("bluefs_shared_alloc_size",
+    stringify(bluefs_alloc_unit).c_str());
+
+  bluefs_shared_alloc_context_t shared_alloc;
+  shared_alloc.set(
+    Allocator::create(g_ceph_context, g_ceph_context->_conf->bluefs_allocator,
+                      size, main_unit, 0, 0, "test shared allocator"),
+    main_unit);
+  // prepare sparse free space but let's have a continuous chunk at
+  // the beginning to fit initial log's fnode into superblock,
+  // we don't have any tricks to deal with sparse allocations
+  // (and hence long fnode) at mkfs
+  shared_alloc.a->init_add_free(bluefs_alloc_unit, 4 * bluefs_alloc_unit);
+  for(uint64_t i = 5 * bluefs_alloc_unit; i < size; i += 2 * main_unit) {
+    shared_alloc.a->init_add_free(i, main_unit);
+  }
+
+  BlueFS fs(g_ceph_context);
+  ASSERT_EQ(0, fs.add_block_device(BlueFS::BDEV_DB, bdev_slow.path, false, 0,
+                                   &shared_alloc));
+  uuid_d fsid;
+  ASSERT_EQ(0, fs.mkfs(fsid, { BlueFS::BDEV_DB, false, false }));
+  ASSERT_EQ(0, fs.mount());
+  ASSERT_EQ(0, fs.maybe_verify_layout({ BlueFS::BDEV_DB, false, false }));
+  {
+    for (int i=0; i<10; i++) {
+       string dir = "dir.";
+       dir.append(to_string(i));
+       ASSERT_EQ(0, fs.mkdir(dir));
+       for (int j=0; j<10; j++) {
+          string file = "file.";
+         file.append(to_string(j));
+          BlueFS::FileWriter *h;
+          ASSERT_EQ(0, fs.open_for_write(dir, file, &h, false));
+          ASSERT_NE(nullptr, h);
+          auto sg = make_scope_guard([&fs, h] { fs.close_writer(h); });
+          bufferlist bl;
+          std::unique_ptr<char[]> buf = gen_buffer(4096);
+         bufferptr bp = buffer::claim_char(4096, buf.get());
+         bl.push_back(bp);
+          h->append(bl.c_str(), bl.length());
+          fs.fsync(h);
+       }
+    }
+  }
+  {
+    for (int i=0; i<10; i+=2) {
+       string dir = "dir.";
+       dir.append(to_string(i));
+       for (int j=0; j<10; j++) {
+          string file = "file.";
+         file.append(to_string(j));
+          fs.unlink(dir, file);
+         fs.sync_metadata(false);
+       }
+       ASSERT_EQ(0, fs.rmdir(dir));
+       fs.sync_metadata(false);
+    }
+  }
+  fs.compact_log();
+  auto *logger = fs.get_perf_counters();
+  ASSERT_NE(logger->get(l_bluefs_alloc_shared_size_fallbacks), 0);
+  auto num_files = logger->get(l_bluefs_num_files);
+  fs.umount();
+
+  fs.mount();
+  ASSERT_EQ(num_files, logger->get(l_bluefs_num_files));
+  fs.umount();
+}
+
+TEST(BlueFS, test_4k_shared_alloc) {
+  uint64_t size = 1048576 * 128 * 2;
+  uint64_t main_unit = 4096;
+  uint64_t bluefs_alloc_unit = main_unit;
+  TempBdev bdev_slow{size};
+
+  ConfSaver conf(g_ceph_context->_conf);
+  conf.SetVal("bluefs_shared_alloc_size",
+    stringify(bluefs_alloc_unit).c_str());
+
+  bluefs_shared_alloc_context_t shared_alloc;
+  shared_alloc.set(
+    Allocator::create(g_ceph_context, g_ceph_context->_conf->bluefs_allocator,
+                      size, main_unit, 0, 0, "test shared allocator"),
+    main_unit);
+  shared_alloc.a->init_add_free(bluefs_alloc_unit, size - bluefs_alloc_unit);
+
+  BlueFS fs(g_ceph_context);
+  ASSERT_EQ(0, fs.add_block_device(BlueFS::BDEV_DB, bdev_slow.path, false, 0,
+                                   &shared_alloc));
+  uuid_d fsid;
+  ASSERT_EQ(0, fs.mkfs(fsid, { BlueFS::BDEV_DB, false, false }));
+  ASSERT_EQ(0, fs.mount());
+  ASSERT_EQ(0, fs.maybe_verify_layout({ BlueFS::BDEV_DB, false, false }));
+  {
+    for (int i=0; i<10; i++) {
+       string dir = "dir.";
+       dir.append(to_string(i));
+       ASSERT_EQ(0, fs.mkdir(dir));
+       for (int j=0; j<10; j++) {
+          string file = "file.";
+         file.append(to_string(j));
+          BlueFS::FileWriter *h;
+          ASSERT_EQ(0, fs.open_for_write(dir, file, &h, false));
+          ASSERT_NE(nullptr, h);
+          auto sg = make_scope_guard([&fs, h] { fs.close_writer(h); });
+          bufferlist bl;
+          std::unique_ptr<char[]> buf = gen_buffer(4096);
+         bufferptr bp = buffer::claim_char(4096, buf.get());
+         bl.push_back(bp);
+          h->append(bl.c_str(), bl.length());
+          fs.fsync(h);
+       }
+    }
+  }
+  {
+    for (int i=0; i<10; i+=2) {
+       string dir = "dir.";
+       dir.append(to_string(i));
+       for (int j=0; j<10; j++) {
+          string file = "file.";
+         file.append(to_string(j));
+          fs.unlink(dir, file);
+         fs.sync_metadata(false);
+       }
+       ASSERT_EQ(0, fs.rmdir(dir));
+       fs.sync_metadata(false);
+    }
+  }
+  fs.compact_log();
+  auto *logger = fs.get_perf_counters();
+  ASSERT_EQ(logger->get(l_bluefs_alloc_shared_dev_fallbacks), 0);
+  ASSERT_EQ(logger->get(l_bluefs_alloc_shared_size_fallbacks), 0);
+  auto num_files = logger->get(l_bluefs_num_files);
+  fs.umount();
+
+  fs.mount();
+  ASSERT_EQ(num_files, logger->get(l_bluefs_num_files));
+  fs.umount();
+}
+
 int main(int argc, char **argv) {
   auto args = argv_to_vec(argc, argv);
   map<string,string> defaults = {
 int main(int argc, char **argv) {
   auto args = argv_to_vec(argc, argv);
   map<string,string> defaults = {
index bf69df0b9d4edc34d320f2ffdfc23ceb89c43f1e..2d3fbd97c49e10b16506ebc061d58dfa459f8ce5 100644 (file)
@@ -1097,17 +1097,17 @@ TEST(Blob, legacy_decode)
 
     uint64_t sbid, sbid2;
     Bres.decode(
 
     uint64_t sbid, sbid2;
     Bres.decode(
-      coll.get(),
       p,
       1, /*struct_v*/
       &sbid,
       p,
       1, /*struct_v*/
       &sbid,
-      true);
+      true,
+      coll.get());
     Bres2.decode(
     Bres2.decode(
-      coll.get(),
       p2,
       2, /*struct_v*/
       &sbid2,
       p2,
       2, /*struct_v*/
       &sbid2,
-      true);
+      true,
+      coll.get());
 
     ASSERT_EQ(0xff0u + 1u, Bres.get_blob_use_tracker().get_referenced_bytes());
     ASSERT_EQ(0xff0u + 1u, Bres2.get_blob_use_tracker().get_referenced_bytes());
 
     ASSERT_EQ(0xff0u + 1u, Bres.get_blob_use_tracker().get_referenced_bytes());
     ASSERT_EQ(0xff0u + 1u, Bres2.get_blob_use_tracker().get_referenced_bytes());
@@ -1125,7 +1125,8 @@ TEST(ExtentMap, seek_lextent)
 
   auto coll = ceph::make_ref<BlueStore::Collection>(&store, oc, bc, coll_t());
   BlueStore::Onode onode(coll.get(), ghobject_t(), "");
 
   auto coll = ceph::make_ref<BlueStore::Collection>(&store, oc, bc, coll_t());
   BlueStore::Onode onode(coll.get(), ghobject_t(), "");
-  BlueStore::ExtentMap em(&onode);
+  BlueStore::ExtentMap em(&onode,
+    g_ceph_context->_conf->bluestore_extent_map_inline_shard_prealloc_size);
   BlueStore::BlobRef br(new BlueStore::Blob);
   br->shared_blob = new BlueStore::SharedBlob(coll.get());
 
   BlueStore::BlobRef br(new BlueStore::Blob);
   br->shared_blob = new BlueStore::SharedBlob(coll.get());
 
@@ -1177,7 +1178,8 @@ TEST(ExtentMap, has_any_lextents)
     g_ceph_context, "lru", NULL);
   auto coll = ceph::make_ref<BlueStore::Collection>(&store, oc, bc, coll_t());
   BlueStore::Onode onode(coll.get(), ghobject_t(), "");
     g_ceph_context, "lru", NULL);
   auto coll = ceph::make_ref<BlueStore::Collection>(&store, oc, bc, coll_t());
   BlueStore::Onode onode(coll.get(), ghobject_t(), "");
-  BlueStore::ExtentMap em(&onode);
+  BlueStore::ExtentMap em(&onode,
+    g_ceph_context->_conf->bluestore_extent_map_inline_shard_prealloc_size);
   BlueStore::BlobRef b(new BlueStore::Blob);
   b->shared_blob = new BlueStore::SharedBlob(coll.get());
 
   BlueStore::BlobRef b(new BlueStore::Blob);
   b->shared_blob = new BlueStore::SharedBlob(coll.get());
 
@@ -1236,7 +1238,8 @@ TEST(ExtentMap, compress_extent_map)
   
   auto coll = ceph::make_ref<BlueStore::Collection>(&store, oc, bc, coll_t());
   BlueStore::Onode onode(coll.get(), ghobject_t(), "");
   
   auto coll = ceph::make_ref<BlueStore::Collection>(&store, oc, bc, coll_t());
   BlueStore::Onode onode(coll.get(), ghobject_t(), "");
-  BlueStore::ExtentMap em(&onode);
+  BlueStore::ExtentMap em(&onode,
+    g_ceph_context->_conf->bluestore_extent_map_inline_shard_prealloc_size);
   BlueStore::BlobRef b1(new BlueStore::Blob);
   BlueStore::BlobRef b2(new BlueStore::Blob);
   BlueStore::BlobRef b3(new BlueStore::Blob);
   BlueStore::BlobRef b1(new BlueStore::Blob);
   BlueStore::BlobRef b2(new BlueStore::Blob);
   BlueStore::BlobRef b3(new BlueStore::Blob);
@@ -1303,7 +1306,8 @@ TEST(GarbageCollector, BasicTest)
   BlueStore store(g_ceph_context, "", 4096);
   auto coll = ceph::make_ref<BlueStore::Collection>(&store, oc, bc, coll_t());
   BlueStore::Onode onode(coll.get(), ghobject_t(), "");
   BlueStore store(g_ceph_context, "", 4096);
   auto coll = ceph::make_ref<BlueStore::Collection>(&store, oc, bc, coll_t());
   BlueStore::Onode onode(coll.get(), ghobject_t(), "");
-  BlueStore::ExtentMap em(&onode);
+  BlueStore::ExtentMap em(&onode,
+    g_ceph_context->_conf->bluestore_extent_map_inline_shard_prealloc_size);
 
   BlueStore::old_extent_map_t old_extents;
 
 
   BlueStore::old_extent_map_t old_extents;
 
@@ -1392,7 +1396,8 @@ TEST(GarbageCollector, BasicTest)
     BlueStore store(g_ceph_context, "", 0x10000);
     auto coll = ceph::make_ref<BlueStore::Collection>(&store, oc, bc, coll_t());
     BlueStore::Onode onode(coll.get(), ghobject_t(), "");
     BlueStore store(g_ceph_context, "", 0x10000);
     auto coll = ceph::make_ref<BlueStore::Collection>(&store, oc, bc, coll_t());
     BlueStore::Onode onode(coll.get(), ghobject_t(), "");
-    BlueStore::ExtentMap em(&onode);
+    BlueStore::ExtentMap em(&onode,
+      g_ceph_context->_conf->bluestore_extent_map_inline_shard_prealloc_size);
 
     BlueStore::old_extent_map_t old_extents;
     BlueStore::GarbageCollector gc(g_ceph_context);
 
     BlueStore::old_extent_map_t old_extents;
     BlueStore::GarbageCollector gc(g_ceph_context);
@@ -1519,7 +1524,8 @@ TEST(GarbageCollector, BasicTest)
     BlueStore store(g_ceph_context, "", 0x10000);
     auto coll = ceph::make_ref<BlueStore::Collection>(&store, oc, bc, coll_t());
     BlueStore::Onode onode(coll.get(), ghobject_t(), "");
     BlueStore store(g_ceph_context, "", 0x10000);
     auto coll = ceph::make_ref<BlueStore::Collection>(&store, oc, bc, coll_t());
     BlueStore::Onode onode(coll.get(), ghobject_t(), "");
-    BlueStore::ExtentMap em(&onode);
+    BlueStore::ExtentMap em(&onode,
+      g_ceph_context->_conf->bluestore_extent_map_inline_shard_prealloc_size);
 
     BlueStore::old_extent_map_t old_extents;
     BlueStore::GarbageCollector gc(g_ceph_context);
 
     BlueStore::old_extent_map_t old_extents;
     BlueStore::GarbageCollector gc(g_ceph_context);
index 0feb427ec1016fb6211ad9a6b5578b2e013e0d10..7e1971b13591425f20c41cce6342cf73de1c8c10 100644 (file)
@@ -27,8 +27,11 @@ int main(int argc, char **argv) {
 
 class mClockSchedulerTest : public testing::Test {
 public:
 
 class mClockSchedulerTest : public testing::Test {
 public:
+  int whoami;
   uint32_t num_shards;
   uint32_t num_shards;
+  int shard_id;
   bool is_rotational;
   bool is_rotational;
+  MonClient *monc;
   mClockScheduler q;
 
   uint64_t client1;
   mClockScheduler q;
 
   uint64_t client1;
@@ -36,9 +39,12 @@ public:
   uint64_t client3;
 
   mClockSchedulerTest() :
   uint64_t client3;
 
   mClockSchedulerTest() :
+    whoami(0),
     num_shards(1),
     num_shards(1),
+    shard_id(0),
     is_rotational(false),
     is_rotational(false),
-    q(g_ceph_context, num_shards, is_rotational),
+    monc(nullptr),
+    q(g_ceph_context, whoami, num_shards, shard_id, is_rotational, monc),
     client1(1001),
     client2(9999),
     client3(100000001)
     client1(1001),
     client2(9999),
     client3(100000001)
index 508cbe5ae9e469056a2ed3dd6a59778d746b6cb8..ff6fee3db29633d1059cb0931d72a4f0ac9d5287 100644 (file)
@@ -1373,6 +1373,7 @@ class TestCommand(object):
         eq(u"pool '\u9ec5' created", out)
 
 
         eq(u"pool '\u9ec5' created", out)
 
 
+@attr('watch')
 class TestWatchNotify(object):
     OID = "test_watch_notify"
 
 class TestWatchNotify(object):
     OID = "test_watch_notify"
 
@@ -1401,8 +1402,9 @@ class TestWatchNotify(object):
         def callback(notify_id, notifier_id, watch_id, data):
             with self.lock:
                 if watch_id not in self.notify_cnt:
         def callback(notify_id, notifier_id, watch_id, data):
             with self.lock:
                 if watch_id not in self.notify_cnt:
-                    self.notify_cnt[watch_id] = 0
-                self.notify_cnt[watch_id] += 1
+                    self.notify_cnt[watch_id] = 1
+                elif  self.notify_data[watch_id] != data:
+                    self.notify_cnt[watch_id] += 1
                 self.notify_data[watch_id] = data
         return callback
 
                 self.notify_data[watch_id] = data
         return callback
 
index b03db36735f4d9699b71406546e621afe45391f4..59bc2fdd3d2f7b1a3246ad4019d2bdfdcea2334b 100644 (file)
@@ -1,6 +1,6 @@
 import boto
 import boto.s3.connection
 import boto
 import boto.s3.connection
-
+import boto.iam.connection
 
 def get_gateway_connection(gateway, credentials):
     """ connect to the given gateway """
 
 def get_gateway_connection(gateway, credentials):
     """ connect to the given gateway """
@@ -28,3 +28,14 @@ def get_gateway_secure_connection(gateway, credentials):
             validate_certs=False,
             calling_format = boto.s3.connection.OrdinaryCallingFormat())
     return gateway.secure_connection
             validate_certs=False,
             calling_format = boto.s3.connection.OrdinaryCallingFormat())
     return gateway.secure_connection
+
+def get_gateway_iam_connection(gateway, credentials):
+    """ connect to iam api of the given gateway """
+    if gateway.iam_connection is None:
+        gateway.iam_connection = boto.connect_iam(
+                aws_access_key_id = credentials.access_key,
+                aws_secret_access_key = credentials.secret,
+                host = gateway.host,
+                port = gateway.port,
+                is_secure = False)
+    return gateway.iam_connection
index dfcde085ed0a0636943f9b93f9a35324ccf7b810..ba6b13ee17f3a597b75fe774396d8609c719b46c 100644 (file)
@@ -3,7 +3,7 @@ from io import StringIO
 
 import json
 
 
 import json
 
-from .conn import get_gateway_connection, get_gateway_secure_connection
+from .conn import get_gateway_connection, get_gateway_iam_connection, get_gateway_secure_connection
 
 class Cluster:
     """ interface to run commands against a distinct ceph cluster """
 
 class Cluster:
     """ interface to run commands against a distinct ceph cluster """
@@ -26,6 +26,7 @@ class Gateway:
         self.connection = None
         self.secure_connection = None
         self.ssl_port = ssl_port
         self.connection = None
         self.secure_connection = None
         self.ssl_port = ssl_port
+        self.iam_connection = None
 
     @abstractmethod
     def start(self, args = []):
 
     @abstractmethod
     def start(self, args = []):
@@ -184,15 +185,23 @@ class ZoneConn(object):
         if self.zone.gateways is not None:
             self.conn = get_gateway_connection(self.zone.gateways[0], self.credentials)
             self.secure_conn = get_gateway_secure_connection(self.zone.gateways[0], self.credentials)
         if self.zone.gateways is not None:
             self.conn = get_gateway_connection(self.zone.gateways[0], self.credentials)
             self.secure_conn = get_gateway_secure_connection(self.zone.gateways[0], self.credentials)
+
+            self.iam_conn = get_gateway_iam_connection(self.zone.gateways[0], self.credentials)
+
             # create connections for the rest of the gateways (if exist)
             for gw in list(self.zone.gateways):
                 get_gateway_connection(gw, self.credentials)
                 get_gateway_secure_connection(gw, self.credentials)
 
             # create connections for the rest of the gateways (if exist)
             for gw in list(self.zone.gateways):
                 get_gateway_connection(gw, self.credentials)
                 get_gateway_secure_connection(gw, self.credentials)
 
+                get_gateway_iam_connection(gw, self.credentials)
+
 
     def get_connection(self):
         return self.conn
 
 
     def get_connection(self):
         return self.conn
 
+    def get_iam_connection(self):
+        return self.iam_conn
+
     def get_bucket(self, bucket_name, credentials):
         raise NotImplementedError
 
     def get_bucket(self, bucket_name, credentials):
         raise NotImplementedError
 
index a30993ea50c5fa015208b21927112342422bad99..f8aa536f9bd05b0dc727b67cc251ccb6485830ae 100644 (file)
@@ -63,6 +63,8 @@ log = logging.getLogger('rgw_multi.tests')
 num_buckets = 0
 run_prefix=''.join(random.choice(string.ascii_lowercase) for _ in range(6))
 
 num_buckets = 0
 run_prefix=''.join(random.choice(string.ascii_lowercase) for _ in range(6))
 
+num_roles = 0
+
 def get_zone_connection(zone, credentials):
     """ connect to the zone's first gateway """
     if isinstance(credentials, list):
 def get_zone_connection(zone, credentials):
     """ connect to the zone's first gateway """
     if isinstance(credentials, list):
@@ -439,6 +441,12 @@ def gen_bucket_name():
     num_buckets += 1
     return run_prefix + '-' + str(num_buckets)
 
     num_buckets += 1
     return run_prefix + '-' + str(num_buckets)
 
+def gen_role_name():
+    global num_roles
+
+    num_roles += 1
+    return "roles" + '-' + run_prefix + '-' + str(num_roles)
+
 class ZonegroupConns:
     def __init__(self, zonegroup):
         self.zonegroup = zonegroup
 class ZonegroupConns:
     def __init__(self, zonegroup):
         self.zonegroup = zonegroup
@@ -446,6 +454,7 @@ class ZonegroupConns:
         self.ro_zones = []
         self.rw_zones = []
         self.master_zone = None
         self.ro_zones = []
         self.rw_zones = []
         self.master_zone = None
+
         for z in zonegroup.zones:
             zone_conn = z.get_conn(user.credentials)
             self.zones.append(zone_conn)
         for z in zonegroup.zones:
             zone_conn = z.get_conn(user.credentials)
             self.zones.append(zone_conn)
@@ -485,6 +494,19 @@ def check_all_buckets_dont_exist(zone_conn, buckets):
 
     return True
 
 
     return True
 
+def create_role_per_zone(zonegroup_conns, roles_per_zone = 1):
+    roles = []
+    zone_role = []
+    for zone in zonegroup_conns.rw_zones:
+        for i in range(roles_per_zone):
+            role_name = gen_role_name()
+            policy_document = "{\"Version\":\"2012-10-17\",\"Statement\":[{\"Effect\":\"Allow\",\"Principal\":{\"AWS\":[\"arn:aws:iam:::user/testuser\"]},\"Action\":[\"sts:AssumeRole\"]}]}"
+            role = zone.create_role("", role_name, policy_document, "")
+            roles.append(role_name)
+            zone_role.append((zone, role))
+
+    return roles, zone_role
+
 def create_bucket_per_zone(zonegroup_conns, buckets_per_zone = 1):
     buckets = []
     zone_bucket = []
 def create_bucket_per_zone(zonegroup_conns, buckets_per_zone = 1):
     buckets = []
     zone_bucket = []
@@ -572,6 +594,9 @@ def check_bucket_eq(zone_conn1, zone_conn2, bucket):
     if zone_conn2.zone.has_buckets():
         zone_conn2.check_bucket_eq(zone_conn1, bucket.name)
 
     if zone_conn2.zone.has_buckets():
         zone_conn2.check_bucket_eq(zone_conn1, bucket.name)
 
+def check_role_eq(zone_conn1, zone_conn2, role):
+    zone_conn2.check_role_eq(zone_conn1, role['create_role_response']['create_role_result']['role']['role_name'])
+
 def test_object_sync():
     zonegroup = realm.master_zonegroup()
     zonegroup_conns = ZonegroupConns(zonegroup)
 def test_object_sync():
     zonegroup = realm.master_zonegroup()
     zonegroup_conns = ZonegroupConns(zonegroup)
@@ -1316,3 +1341,17 @@ def test_bucket_creation_time():
         for a, b in zip(z1, z2):
             eq(a.name, b.name)
             eq(a.creation_date, b.creation_date)
         for a, b in zip(z1, z2):
             eq(a.name, b.name)
             eq(a.creation_date, b.creation_date)
+
+def test_role_sync():
+    zonegroup = realm.master_zonegroup()
+    zonegroup_conns = ZonegroupConns(zonegroup)
+    roles, zone_role = create_role_per_zone(zonegroup_conns)
+
+    zonegroup_meta_checkpoint(zonegroup)
+
+    for source_conn, role in zone_role:
+        for target_conn in zonegroup_conns.zones:
+            if source_conn.zone == target_conn.zone:
+                continue
+
+            check_role_eq(source_conn, target_conn, role)
diff --git a/ceph/src/test/rgw/rgw_multi/tests_ps.py b/ceph/src/test/rgw/rgw_multi/tests_ps.py
deleted file mode 100644 (file)
index f2f27ff..0000000
+++ /dev/null
@@ -1,2593 +0,0 @@
-import logging
-import json
-import tempfile
-import random
-import threading
-import subprocess
-import socket
-import time
-import os
-from http import server as http_server
-from random import randint
-from .tests import get_realm, \
-    ZonegroupConns, \
-    zonegroup_meta_checkpoint, \
-    zone_meta_checkpoint, \
-    zone_bucket_checkpoint, \
-    zone_data_checkpoint, \
-    zonegroup_bucket_checkpoint, \
-    check_bucket_eq, \
-    gen_bucket_name, \
-    get_user, \
-    get_tenant
-from .zone_ps import PSTopic, \
-    PSTopicS3, \
-    PSNotification, \
-    PSSubscription, \
-    PSNotificationS3, \
-    print_connection_info, \
-    get_object_tagging
-from .multisite import User
-from nose import SkipTest
-from nose.tools import assert_not_equal, assert_equal
-import boto.s3.tagging
-
-# configure logging for the tests module
-log = logging.getLogger(__name__)
-
-skip_push_tests = True
-
-####################################
-# utility functions for pubsub tests
-####################################
-
-def set_contents_from_string(key, content):
-    try:
-        key.set_contents_from_string(content)
-    except Exception as e:
-        print('Error: ' + str(e))
-
-
-# HTTP endpoint functions
-# multithreaded streaming server, based on: https://stackoverflow.com/questions/46210672/
-
-class HTTPPostHandler(http_server.BaseHTTPRequestHandler):
-    """HTTP POST hanler class storing the received events in its http server"""
-    def do_POST(self):
-        """implementation of POST handler"""
-        try:
-            content_length = int(self.headers['Content-Length'])
-            body = self.rfile.read(content_length)
-            log.info('HTTP Server (%d) received event: %s', self.server.worker_id, str(body))
-            self.server.append(json.loads(body))
-        except:
-            log.error('HTTP Server received empty event')
-            self.send_response(400)
-        else:
-            if self.headers.get('Expect') == '100-continue':
-                self.send_response(100)
-            else:
-                self.send_response(200)
-        finally:
-            if self.server.delay > 0:
-                time.sleep(self.server.delay)
-            self.end_headers()
-
-
-class HTTPServerWithEvents(http_server.HTTPServer):
-    """HTTP server used by the handler to store events"""
-    def __init__(self, addr, handler, worker_id, delay=0):
-        http_server.HTTPServer.__init__(self, addr, handler, False)
-        self.worker_id = worker_id
-        self.events = []
-        self.delay = delay
-
-    def append(self, event):
-        self.events.append(event)
-
-
-class HTTPServerThread(threading.Thread):
-    """thread for running the HTTP server. reusing the same socket for all threads"""
-    def __init__(self, i, sock, addr, delay=0):
-        threading.Thread.__init__(self)
-        self.i = i
-        self.daemon = True
-        self.httpd = HTTPServerWithEvents(addr, HTTPPostHandler, i, delay)
-        self.httpd.socket = sock
-        # prevent the HTTP server from re-binding every handler
-        self.httpd.server_bind = self.server_close = lambda self: None
-        self.start()
-
-    def run(self):
-        try:
-            log.info('HTTP Server (%d) started on: %s', self.i, self.httpd.server_address)
-            self.httpd.serve_forever()
-            log.info('HTTP Server (%d) ended', self.i)
-        except Exception as error:
-            # could happen if the server r/w to a closing socket during shutdown
-            log.info('HTTP Server (%d) ended unexpectedly: %s', self.i, str(error))
-
-    def close(self):
-        self.httpd.shutdown()
-
-    def get_events(self):
-        return self.httpd.events
-
-    def reset_events(self):
-        self.httpd.events = []
-
-
-class StreamingHTTPServer:
-    """multi-threaded http server class also holding list of events received into the handler
-    each thread has its own server, and all servers share the same socket"""
-    def __init__(self, host, port, num_workers=100, delay=0):
-        addr = (host, port)
-        self.sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
-        self.sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
-        self.sock.bind(addr)
-        self.sock.listen(num_workers)
-        self.workers = [HTTPServerThread(i, self.sock, addr, delay) for i in range(num_workers)]
-
-    def verify_s3_events(self, keys, exact_match=False, deletions=False, expected_sizes={}):
-        """verify stored s3 records agains a list of keys"""
-        events = []
-        for worker in self.workers:
-            events += worker.get_events()
-            worker.reset_events()
-        verify_s3_records_by_elements(events, keys, exact_match=exact_match, deletions=deletions, expected_sizes=expected_sizes)
-
-    def verify_events(self, keys, exact_match=False, deletions=False):
-        """verify stored events agains a list of keys"""
-        events = []
-        for worker in self.workers:
-            events += worker.get_events()
-            worker.reset_events()
-        verify_events_by_elements(events, keys, exact_match=exact_match, deletions=deletions)
-
-    def get_and_reset_events(self):
-        events = []
-        for worker in self.workers:
-            events += worker.get_events()
-            worker.reset_events()
-        return events
-
-    def close(self):
-        """close all workers in the http server and wait for it to finish"""
-        # make sure that the shared socket is closed
-        # this is needed in case that one of the threads is blocked on the socket
-        self.sock.shutdown(socket.SHUT_RDWR)
-        self.sock.close()
-        # wait for server threads to finish
-        for worker in self.workers:
-            worker.close()
-            worker.join()
-
-
-# AMQP endpoint functions
-
-
-class AMQPReceiver(object):
-    """class for receiving and storing messages on a topic from the AMQP broker"""
-    def __init__(self, exchange, topic, external_endpoint_address=None, ca_location=None):
-        import pika
-        import ssl
-
-        if ca_location:
-            ssl_context = ssl.create_default_context()
-            ssl_context.load_verify_locations(cafile=ca_location)
-            ssl_options = pika.SSLOptions(ssl_context)
-            rabbitmq_port = 5671
-        else:
-            rabbitmq_port = 5672
-            ssl_options = None
-
-        if external_endpoint_address:
-            params = pika.URLParameters(external_endpoint_address, ssl_options=ssl_options)
-        else:
-            hostname = get_ip()
-            params = pika.ConnectionParameters(host=hostname, port=rabbitmq_port, ssl_options=ssl_options)
-        remaining_retries = 10
-        while remaining_retries > 0:
-            try:
-                connection = pika.BlockingConnection(params)
-                break
-            except Exception as error:
-                remaining_retries -= 1
-                print('failed to connect to rabbitmq (remaining retries '
-                    + str(remaining_retries) + '): ' + str(error))
-                time.sleep(1)
-
-        if remaining_retries == 0:
-            raise Exception('failed to connect to rabbitmq - no retries left')
-
-        self.channel = connection.channel()
-        self.channel.exchange_declare(exchange=exchange, exchange_type='topic', durable=True)
-        result = self.channel.queue_declare('', exclusive=True)
-        queue_name = result.method.queue
-        self.channel.queue_bind(exchange=exchange, queue=queue_name, routing_key=topic)
-        self.channel.basic_consume(queue=queue_name,
-                                   on_message_callback=self.on_message,
-                                   auto_ack=True)
-        self.events = []
-        self.topic = topic
-
-    def on_message(self, ch, method, properties, body):
-        """callback invoked when a new message arrive on the topic"""
-        log.info('AMQP received event for topic %s:\n %s', self.topic, body)
-        self.events.append(json.loads(body))
-
-    # TODO create a base class for the AMQP and HTTP cases
-    def verify_s3_events(self, keys, exact_match=False, deletions=False):
-        """verify stored s3 records agains a list of keys"""
-        verify_s3_records_by_elements(self.events, keys, exact_match=exact_match, deletions=deletions)
-        self.events = []
-
-    def verify_events(self, keys, exact_match=False, deletions=False):
-        """verify stored events agains a list of keys"""
-        verify_events_by_elements(self.events, keys, exact_match=exact_match, deletions=deletions)
-        self.events = []
-
-    def get_and_reset_events(self):
-        tmp = self.events
-        self.events = []
-        return tmp
-
-
-def amqp_receiver_thread_runner(receiver):
-    """main thread function for the amqp receiver"""
-    try:
-        log.info('AMQP receiver started')
-        receiver.channel.start_consuming()
-        log.info('AMQP receiver ended')
-    except Exception as error:
-        log.info('AMQP receiver ended unexpectedly: %s', str(error))
-
-
-def create_amqp_receiver_thread(exchange, topic, external_endpoint_address=None, ca_location=None):
-    """create amqp receiver and thread"""
-    receiver = AMQPReceiver(exchange, topic, external_endpoint_address, ca_location)
-    task = threading.Thread(target=amqp_receiver_thread_runner, args=(receiver,))
-    task.daemon = True
-    return task, receiver
-
-
-def stop_amqp_receiver(receiver, task):
-    """stop the receiver thread and wait for it to finis"""
-    try:
-        receiver.channel.stop_consuming()
-        log.info('stopping AMQP receiver')
-    except Exception as error:
-        log.info('failed to gracefuly stop AMQP receiver: %s', str(error))
-    task.join(5)
-
-def check_ps_configured():
-    """check if at least one pubsub zone exist"""
-    realm = get_realm()
-    zonegroup = realm.master_zonegroup()
-
-    ps_zones = zonegroup.zones_by_type.get("pubsub")
-    if not ps_zones:
-        raise SkipTest("Requires at least one PS zone")
-
-
-def is_ps_zone(zone_conn):
-    """check if a specific zone is pubsub zone"""
-    if not zone_conn:
-        return False
-    return zone_conn.zone.tier_type() == "pubsub"
-
-
-def verify_events_by_elements(events, keys, exact_match=False, deletions=False):
-    """ verify there is at least one event per element """
-    err = ''
-    for key in keys:
-        key_found = False
-        if type(events) is list:
-            for event_list in events: 
-                if key_found:
-                    break
-                for event in event_list['events']:
-                    if event['info']['bucket']['name'] == key.bucket.name and \
-                        event['info']['key']['name'] == key.name:
-                        if deletions and event['event'] == 'OBJECT_DELETE':
-                            key_found = True
-                            break
-                        elif not deletions and event['event'] == 'OBJECT_CREATE':
-                            key_found = True
-                            break
-        else:
-            for event in events['events']:
-                if event['info']['bucket']['name'] == key.bucket.name and \
-                    event['info']['key']['name'] == key.name:
-                    if deletions and event['event'] == 'OBJECT_DELETE':
-                        key_found = True
-                        break
-                    elif not deletions and event['event'] == 'OBJECT_CREATE':
-                        key_found = True
-                        break
-
-        if not key_found:
-            err = 'no ' + ('deletion' if deletions else 'creation') + ' event found for key: ' + str(key)
-            log.error(events)
-            assert False, err
-
-    if not len(events) == len(keys):
-        err = 'superfluous events are found'
-        log.debug(err)
-        if exact_match:
-            log.error(events)
-            assert False, err
-
-
-def verify_s3_records_by_elements(records, keys, exact_match=False, deletions=False, expected_sizes={}):
-    """ verify there is at least one record per element """
-    err = ''
-    for key in keys:
-        key_found = False
-        object_size = 0
-        if type(records) is list:
-            for record_list in records:
-                if key_found:
-                    break
-                for record in record_list['Records']:
-                    if record['s3']['bucket']['name'] == key.bucket.name and \
-                        record['s3']['object']['key'] == key.name:
-                        if deletions and record['eventName'].startswith('ObjectRemoved'):
-                            key_found = True
-                            object_size = record['s3']['object']['size']
-                            break
-                        elif not deletions and record['eventName'].startswith('ObjectCreated'):
-                            key_found = True
-                            object_size = record['s3']['object']['size']
-                            break
-        else:
-            for record in records['Records']:
-                if record['s3']['bucket']['name'] == key.bucket.name and \
-                    record['s3']['object']['key'] == key.name:
-                    if deletions and record['eventName'].startswith('ObjectRemoved'):
-                        key_found = True
-                        object_size = record['s3']['object']['size']
-                        break
-                    elif not deletions and record['eventName'].startswith('ObjectCreated'):
-                        key_found = True
-                        object_size = record['s3']['object']['size']
-                        break
-
-        if not key_found:
-            err = 'no ' + ('deletion' if deletions else 'creation') + ' event found for key: ' + str(key)
-            assert False, err
-        elif expected_sizes:
-            assert_equal(object_size, expected_sizes.get(key.name))
-
-    if not len(records) == len(keys):
-        err = 'superfluous records are found'
-        log.warning(err)
-        if exact_match:
-            for record_list in records:
-                for record in record_list['Records']:
-                    log.error(str(record['s3']['bucket']['name']) + ',' + str(record['s3']['object']['key']))
-            assert False, err
-
-
-def init_rabbitmq():
-    """ start a rabbitmq broker """
-    hostname = get_ip()
-    #port = str(random.randint(20000, 30000))
-    #data_dir = './' + port + '_data'
-    #log_dir = './' + port + '_log'
-    #print('')
-    #try:
-    #    os.mkdir(data_dir)
-    #    os.mkdir(log_dir)
-    #except:
-    #    print('rabbitmq directories already exists')
-    #env = {'RABBITMQ_NODE_PORT': port,
-    #       'RABBITMQ_NODENAME': 'rabbit'+ port + '@' + hostname,
-    #       'RABBITMQ_USE_LONGNAME': 'true',
-    #       'RABBITMQ_MNESIA_BASE': data_dir,
-    #       'RABBITMQ_LOG_BASE': log_dir}
-    # TODO: support multiple brokers per host using env
-    # make sure we don't collide with the default
-    try:
-        proc = subprocess.Popen(['sudo', '--preserve-env=RABBITMQ_CONFIG_FILE', 'rabbitmq-server'])
-    except Exception as error:
-        log.info('failed to execute rabbitmq-server: %s', str(error))
-        print('failed to execute rabbitmq-server: %s' % str(error))
-        return None
-    # TODO add rabbitmq checkpoint instead of sleep
-    time.sleep(5)
-    return proc #, port, data_dir, log_dir
-
-
-def clean_rabbitmq(proc): #, data_dir, log_dir)
-    """ stop the rabbitmq broker """
-    try:
-        subprocess.call(['sudo', 'rabbitmqctl', 'stop'])
-        time.sleep(5)
-        proc.terminate()
-    except:
-        log.info('rabbitmq server already terminated')
-    # TODO: add directory cleanup once multiple brokers are supported
-    #try:
-    #    os.rmdir(data_dir)
-    #    os.rmdir(log_dir)
-    #except:
-    #    log.info('rabbitmq directories already removed')
-
-
-# Kafka endpoint functions
-
-kafka_server = 'localhost'
-
-class KafkaReceiver(object):
-    """class for receiving and storing messages on a topic from the kafka broker"""
-    def __init__(self, topic, security_type):
-        from kafka import KafkaConsumer
-        remaining_retries = 10
-        port = 9092
-        if security_type != 'PLAINTEXT':
-            security_type = 'SSL'
-            port = 9093
-        while remaining_retries > 0:
-            try:
-                self.consumer = KafkaConsumer(topic, bootstrap_servers = kafka_server+':'+str(port), security_protocol=security_type)
-                print('Kafka consumer created on topic: '+topic)
-                break
-            except Exception as error:
-                remaining_retries -= 1
-                print('failed to connect to kafka (remaining retries '
-                    + str(remaining_retries) + '): ' + str(error))
-                time.sleep(1)
-
-        if remaining_retries == 0:
-            raise Exception('failed to connect to kafka - no retries left')
-
-        self.events = []
-        self.topic = topic
-        self.stop = False
-
-    def verify_s3_events(self, keys, exact_match=False, deletions=False):
-        """verify stored s3 records agains a list of keys"""
-        verify_s3_records_by_elements(self.events, keys, exact_match=exact_match, deletions=deletions)
-        self.events = []
-
-
-def kafka_receiver_thread_runner(receiver):
-    """main thread function for the kafka receiver"""
-    try:
-        log.info('Kafka receiver started')
-        print('Kafka receiver started')
-        while not receiver.stop:
-            for msg in receiver.consumer:
-                receiver.events.append(json.loads(msg.value))
-            timer.sleep(0.1)
-        log.info('Kafka receiver ended')
-        print('Kafka receiver ended')
-    except Exception as error:
-        log.info('Kafka receiver ended unexpectedly: %s', str(error))
-        print('Kafka receiver ended unexpectedly: ' + str(error))
-
-
-def create_kafka_receiver_thread(topic, security_type='PLAINTEXT'):
-    """create kafka receiver and thread"""
-    receiver = KafkaReceiver(topic, security_type)
-    task = threading.Thread(target=kafka_receiver_thread_runner, args=(receiver,))
-    task.daemon = True
-    return task, receiver
-
-def stop_kafka_receiver(receiver, task):
-    """stop the receiver thread and wait for it to finis"""
-    receiver.stop = True
-    task.join(1)
-    try:
-        receiver.consumer.close()
-    except Exception as error:
-        log.info('failed to gracefuly stop Kafka receiver: %s', str(error))
-
-
-# follow the instruction here to create and sign a broker certificate:
-# https://github.com/edenhill/librdkafka/wiki/Using-SSL-with-librdkafka
-
-# the generated broker certificate should be stored in the java keystore for the use of the server
-# assuming the jks files were copied to $KAFKA_DIR and broker name is "localhost"
-# following lines must be added to $KAFKA_DIR/config/server.properties
-# listeners=PLAINTEXT://localhost:9092,SSL://localhost:9093,SASL_SSL://localhost:9094
-# sasl.enabled.mechanisms=PLAIN
-# ssl.keystore.location = $KAFKA_DIR/server.keystore.jks
-# ssl.keystore.password = abcdefgh
-# ssl.key.password = abcdefgh
-# ssl.truststore.location = $KAFKA_DIR/server.truststore.jks
-# ssl.truststore.password = abcdefgh
-
-# notes:
-# (1) we dont test client authentication, hence, no need to generate client keys
-# (2) our client is not using the keystore, and the "rootCA.crt" file generated in the process above
-# should be copied to: $KAFKA_DIR
-
-def init_kafka():
-    """ start kafka/zookeeper """
-    try:
-        KAFKA_DIR = os.environ['KAFKA_DIR']
-    except:
-        KAFKA_DIR = ''
-
-    if KAFKA_DIR == '':
-        log.info('KAFKA_DIR must be set to where kafka is installed')
-        print('KAFKA_DIR must be set to where kafka is installed')
-        return None, None, None
-    
-    DEVNULL = open(os.devnull, 'wb')
-
-    print('\nStarting zookeeper...')
-    try:
-        zk_proc = subprocess.Popen([KAFKA_DIR+'bin/zookeeper-server-start.sh', KAFKA_DIR+'config/zookeeper.properties'], stdout=DEVNULL)
-    except Exception as error:
-        log.info('failed to execute zookeeper: %s', str(error))
-        print('failed to execute zookeeper: %s' % str(error))
-        return None, None, None
-
-    time.sleep(5)
-    if zk_proc.poll() is not None:
-        print('zookeeper failed to start')
-        return None, None, None
-    print('Zookeeper started')
-    print('Starting kafka...')
-    kafka_log = open('./kafka.log', 'w')
-    try:
-        kafka_env = os.environ.copy()
-        kafka_env['KAFKA_OPTS']='-Djava.security.auth.login.config='+KAFKA_DIR+'config/kafka_server_jaas.conf'
-        kafka_proc = subprocess.Popen([
-            KAFKA_DIR+'bin/kafka-server-start.sh', 
-            KAFKA_DIR+'config/server.properties'], 
-            stdout=kafka_log,
-            env=kafka_env)
-    except Exception as error:
-        log.info('failed to execute kafka: %s', str(error))
-        print('failed to execute kafka: %s' % str(error))
-        zk_proc.terminate()
-        kafka_log.close()
-        return None, None, None
-
-    # TODO add kafka checkpoint instead of sleep
-    time.sleep(15)
-    if kafka_proc.poll() is not None:
-        zk_proc.terminate()
-        print('kafka failed to start. details in: ./kafka.log')
-        kafka_log.close()
-        return None, None, None
-
-    print('Kafka started')
-    return kafka_proc, zk_proc, kafka_log
-
-
-def clean_kafka(kafka_proc, zk_proc, kafka_log):
-    """ stop kafka/zookeeper """
-    try:
-        kafka_log.close()
-        print('Shutdown Kafka...')
-        kafka_proc.terminate()
-        time.sleep(5)
-        if kafka_proc.poll() is None:
-            print('Failed to shutdown Kafka... killing')
-            kafka_proc.kill()
-        print('Shutdown zookeeper...')
-        zk_proc.terminate()
-        time.sleep(5)
-        if zk_proc.poll() is None:
-            print('Failed to shutdown zookeeper... killing')
-            zk_proc.kill()
-    except:
-        log.info('kafka/zookeeper already terminated')
-
-
-def init_env(require_ps=True):
-    """initialize the environment"""
-    if require_ps:
-        check_ps_configured()
-
-    realm = get_realm()
-    zonegroup = realm.master_zonegroup()
-    zonegroup_conns = ZonegroupConns(zonegroup)
-
-    zonegroup_meta_checkpoint(zonegroup)
-
-    ps_zone = None
-    master_zone = None
-    for conn in zonegroup_conns.zones:
-        if conn.zone == zonegroup.master_zone:
-            master_zone = conn
-        if is_ps_zone(conn):
-            zone_meta_checkpoint(conn.zone)
-            ps_zone = conn
-
-    assert_not_equal(master_zone, None)
-    if require_ps:
-        assert_not_equal(ps_zone, None)
-    return master_zone, ps_zone
-
-
-def get_ip():
-    """ This method returns the "primary" IP on the local box (the one with a default route)
-    source: https://stackoverflow.com/a/28950776/711085
-    this is needed because on the teuthology machines: socket.getfqdn()/socket.gethostname() return 127.0.0.1 """
-    s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
-    try:
-        # address should not be reachable
-        s.connect(('10.255.255.255', 1))
-        ip = s.getsockname()[0]
-    finally:
-        s.close()
-    return ip
-
-
-TOPIC_SUFFIX = "_topic"
-SUB_SUFFIX = "_sub"
-NOTIFICATION_SUFFIX = "_notif"
-
-##############
-# pubsub tests
-##############
-
-def test_ps_info():
-    """ log information for manual testing """
-    return SkipTest("only used in manual testing")
-    master_zone, ps_zone = init_env()
-    realm = get_realm()
-    zonegroup = realm.master_zonegroup()
-    bucket_name = gen_bucket_name()
-    # create bucket on the first of the rados zones
-    bucket = master_zone.create_bucket(bucket_name)
-    # create objects in the bucket
-    number_of_objects = 10
-    for i in range(number_of_objects):
-        key = bucket.new_key(str(i))
-        key.set_contents_from_string('bar')
-    print('Zonegroup: ' + zonegroup.name)
-    print('user: ' + get_user())
-    print('tenant: ' + get_tenant())
-    print('Master Zone')
-    print_connection_info(master_zone.conn)
-    print('PubSub Zone')
-    print_connection_info(ps_zone.conn)
-    print('Bucket: ' + bucket_name)
-
-
-def test_ps_s3_notification_low_level():
-    """ test low level implementation of s3 notifications """
-    master_zone, ps_zone = init_env()
-    bucket_name = gen_bucket_name()
-    # create bucket on the first of the rados zones
-    master_zone.create_bucket(bucket_name)
-    # wait for sync
-    zone_meta_checkpoint(ps_zone.zone)
-    # create topic
-    topic_name = bucket_name + TOPIC_SUFFIX
-    topic_conf = PSTopic(ps_zone.conn, topic_name)
-    result, status = topic_conf.set_config()
-    assert_equal(status/100, 2)
-    parsed_result = json.loads(result)
-    topic_arn = parsed_result['arn']
-    # create s3 notification
-    notification_name = bucket_name + NOTIFICATION_SUFFIX
-    generated_topic_name = notification_name+'_'+topic_name
-    topic_conf_list = [{'Id': notification_name,
-                        'TopicArn': topic_arn,
-                        'Events': ['s3:ObjectCreated:*']
-                       }]
-    s3_notification_conf = PSNotificationS3(ps_zone.conn, bucket_name, topic_conf_list)
-    _, status = s3_notification_conf.set_config()
-    assert_equal(status/100, 2)
-    zone_meta_checkpoint(ps_zone.zone)
-    # get auto-generated topic
-    generated_topic_conf = PSTopic(ps_zone.conn, generated_topic_name)
-    result, status = generated_topic_conf.get_config()
-    parsed_result = json.loads(result)
-    assert_equal(status/100, 2)
-    assert_equal(parsed_result['topic']['name'], generated_topic_name)
-    # get auto-generated notification
-    notification_conf = PSNotification(ps_zone.conn, bucket_name,
-                                       generated_topic_name)
-    result, status = notification_conf.get_config()
-    parsed_result = json.loads(result)
-    assert_equal(status/100, 2)
-    assert_equal(len(parsed_result['topics']), 1)
-    # get auto-generated subscription
-    sub_conf = PSSubscription(ps_zone.conn, notification_name,
-                              generated_topic_name)
-    result, status = sub_conf.get_config()
-    parsed_result = json.loads(result)
-    assert_equal(status/100, 2)
-    assert_equal(parsed_result['topic'], generated_topic_name)
-    # delete s3 notification
-    _, status = s3_notification_conf.del_config(notification=notification_name)
-    assert_equal(status/100, 2)
-    # delete topic
-    _, status = topic_conf.del_config()
-    assert_equal(status/100, 2)
-
-    # verify low-level cleanup
-    _, status = generated_topic_conf.get_config()
-    assert_equal(status, 404)
-    result, status = notification_conf.get_config()
-    parsed_result = json.loads(result)
-    assert_equal(len(parsed_result['topics']), 0)
-    # TODO should return 404
-    # assert_equal(status, 404)
-    result, status = sub_conf.get_config()
-    parsed_result = json.loads(result)
-    assert_equal(parsed_result['topic'], '')
-    # TODO should return 404
-    # assert_equal(status, 404)
-
-    # cleanup
-    topic_conf.del_config()
-    # delete the bucket
-    master_zone.delete_bucket(bucket_name)
-
-
-def test_ps_s3_notification_records():
-    """ test s3 records fetching """
-    master_zone, ps_zone = init_env()
-    bucket_name = gen_bucket_name()
-    # create bucket on the first of the rados zones
-    bucket = master_zone.create_bucket(bucket_name)
-    # wait for sync
-    zone_meta_checkpoint(ps_zone.zone)
-    # create topic
-    topic_name = bucket_name + TOPIC_SUFFIX
-    topic_conf = PSTopic(ps_zone.conn, topic_name)
-    result, status = topic_conf.set_config()
-    assert_equal(status/100, 2)
-    parsed_result = json.loads(result)
-    topic_arn = parsed_result['arn']
-    # create s3 notification
-    notification_name = bucket_name + NOTIFICATION_SUFFIX
-    topic_conf_list = [{'Id': notification_name,
-                        'TopicArn': topic_arn,
-                        'Events': ['s3:ObjectCreated:*']
-                       }]
-    s3_notification_conf = PSNotificationS3(ps_zone.conn, bucket_name, topic_conf_list)
-    _, status = s3_notification_conf.set_config()
-    assert_equal(status/100, 2)
-    zone_meta_checkpoint(ps_zone.zone)
-    # get auto-generated subscription
-    sub_conf = PSSubscription(ps_zone.conn, notification_name,
-                              topic_name)
-    _, status = sub_conf.get_config()
-    assert_equal(status/100, 2)
-    # create objects in the bucket
-    number_of_objects = 10
-    for i in range(number_of_objects):
-        key = bucket.new_key(str(i))
-        key.set_contents_from_string('bar')
-    # wait for sync
-    zone_bucket_checkpoint(ps_zone.zone, master_zone.zone, bucket_name)
-
-    # get the events from the subscription
-    result, _ = sub_conf.get_events()
-    records = json.loads(result)
-    for record in records['Records']:
-        log.debug(record)
-    keys = list(bucket.list())
-    # TODO: use exact match
-    verify_s3_records_by_elements(records, keys, exact_match=False)
-
-    # cleanup
-    _, status = s3_notification_conf.del_config()
-    topic_conf.del_config()
-    # delete the keys
-    for key in bucket.list():
-        key.delete()
-    master_zone.delete_bucket(bucket_name)
-
-
-def test_ps_s3_notification():
-    """ test s3 notification set/get/delete """
-    master_zone, ps_zone = init_env()
-    bucket_name = gen_bucket_name()
-    # create bucket on the first of the rados zones
-    master_zone.create_bucket(bucket_name)
-    # wait for sync
-    zone_meta_checkpoint(ps_zone.zone)
-    topic_name = bucket_name + TOPIC_SUFFIX
-    # create topic
-    topic_name = bucket_name + TOPIC_SUFFIX
-    topic_conf = PSTopic(ps_zone.conn, topic_name)
-    response, status = topic_conf.set_config()
-    assert_equal(status/100, 2)
-    parsed_result = json.loads(response)
-    topic_arn = parsed_result['arn']
-    # create one s3 notification
-    notification_name1 = bucket_name + NOTIFICATION_SUFFIX + '_1'
-    topic_conf_list = [{'Id': notification_name1,
-                        'TopicArn': topic_arn,
-                        'Events': ['s3:ObjectCreated:*']
-                       }]
-    s3_notification_conf1 = PSNotificationS3(ps_zone.conn, bucket_name, topic_conf_list)
-    response, status = s3_notification_conf1.set_config()
-    assert_equal(status/100, 2)
-    # create another s3 notification with the same topic
-    notification_name2 = bucket_name + NOTIFICATION_SUFFIX + '_2'
-    topic_conf_list = [{'Id': notification_name2,
-                        'TopicArn': topic_arn,
-                        'Events': ['s3:ObjectCreated:*', 's3:ObjectRemoved:*']
-                       }]
-    s3_notification_conf2 = PSNotificationS3(ps_zone.conn, bucket_name, topic_conf_list)
-    response, status = s3_notification_conf2.set_config()
-    assert_equal(status/100, 2)
-    zone_meta_checkpoint(ps_zone.zone)
-
-    # get all notification on a bucket
-    response, status = s3_notification_conf1.get_config()
-    assert_equal(status/100, 2)
-    assert_equal(len(response['TopicConfigurations']), 2)
-    assert_equal(response['TopicConfigurations'][0]['TopicArn'], topic_arn)
-    assert_equal(response['TopicConfigurations'][1]['TopicArn'], topic_arn)
-
-    # get specific notification on a bucket
-    response, status = s3_notification_conf1.get_config(notification=notification_name1)
-    assert_equal(status/100, 2)
-    assert_equal(response['NotificationConfiguration']['TopicConfiguration']['Topic'], topic_arn)
-    assert_equal(response['NotificationConfiguration']['TopicConfiguration']['Id'], notification_name1)
-    response, status = s3_notification_conf2.get_config(notification=notification_name2)
-    assert_equal(status/100, 2)
-    assert_equal(response['NotificationConfiguration']['TopicConfiguration']['Topic'], topic_arn)
-    assert_equal(response['NotificationConfiguration']['TopicConfiguration']['Id'], notification_name2)
-
-    # delete specific notifications
-    _, status = s3_notification_conf1.del_config(notification=notification_name1)
-    assert_equal(status/100, 2)
-    _, status = s3_notification_conf2.del_config(notification=notification_name2)
-    assert_equal(status/100, 2)
-
-    # cleanup
-    topic_conf.del_config()
-    # delete the bucket
-    master_zone.delete_bucket(bucket_name)
-
-
-def test_ps_s3_notification_filter():
-    """ test s3 notification filter on master """
-    if skip_push_tests:
-        return SkipTest("PubSub push tests don't run in teuthology")
-    hostname = get_ip()
-    proc = init_rabbitmq()
-    if proc is  None:
-        return SkipTest('end2end amqp tests require rabbitmq-server installed')
-        
-    master_zone, ps_zone = init_env(require_ps=True)
-    ps_zone = ps_zone
-
-    realm = get_realm()
-    zonegroup = realm.master_zonegroup()
-    
-    # create bucket
-    bucket_name = gen_bucket_name()
-    bucket = master_zone.create_bucket(bucket_name)
-    topic_name = bucket_name + TOPIC_SUFFIX
-
-    # start amqp receivers
-    exchange = 'ex1'
-    task, receiver = create_amqp_receiver_thread(exchange, topic_name)
-    task.start()
-
-    # create s3 topic
-    endpoint_address = 'amqp://' + hostname
-    endpoint_args = 'push-endpoint='+endpoint_address+'&amqp-exchange=' + exchange +'&amqp-ack-level=broker'
-   
-    topic_conf = PSTopic(ps_zone.conn, topic_name, endpoint=endpoint_address, endpoint_args=endpoint_args)
-    result, _ = topic_conf.set_config()
-    parsed_result = json.loads(result)
-    topic_arn = parsed_result['arn']
-    zone_meta_checkpoint(ps_zone.zone)
-
-    # create s3 notification
-    notification_name = bucket_name + NOTIFICATION_SUFFIX
-    topic_conf_list = [{'Id': notification_name+'_1',
-                        'TopicArn': topic_arn,
-                        'Events': ['s3:ObjectCreated:*'],
-                       'Filter': {
-                         'Key': {
-                            'FilterRules': [{'Name': 'prefix', 'Value': 'hello'}]
-                         }
-                        }
-                       },
-                       {'Id': notification_name+'_2',
-                        'TopicArn': topic_arn,
-                        'Events': ['s3:ObjectCreated:*'],
-                       'Filter': {
-                         'Key': {
-                            'FilterRules': [{'Name': 'prefix', 'Value': 'world'},
-                                            {'Name': 'suffix', 'Value': 'log'}]
-                         }
-                        }
-                       },
-                       {'Id': notification_name+'_3',
-                        'TopicArn': topic_arn,
-                        'Events': [],
-                       'Filter': {
-                          'Key': {
-                            'FilterRules': [{'Name': 'regex', 'Value': '([a-z]+)\\.txt'}]
-                         }
-                        }
-                       }]
-
-    s3_notification_conf = PSNotificationS3(ps_zone.conn, bucket_name, topic_conf_list)
-    result, status = s3_notification_conf.set_config()
-    assert_equal(status/100, 2)
-
-    print('filtering by attributes only supported on master zone')
-    skip_notif4 = True
-
-    # get all notifications
-    result, status = s3_notification_conf.get_config()
-    assert_equal(status/100, 2)
-    for conf in result['TopicConfigurations']:
-        filter_name = conf['Filter']['Key']['FilterRules'][0]['Name']
-        assert filter_name == 'prefix' or filter_name == 'suffix' or filter_name == 'regex', filter_name
-
-    if not skip_notif4:
-        result, status = s3_notification_conf4.get_config(notification=notification_name+'_4')
-        assert_equal(status/100, 2)
-        filter_name = result['NotificationConfiguration']['TopicConfiguration']['Filter']['S3Metadata']['FilterRule'][0]['Name']
-        assert filter_name == 'x-amz-meta-foo' or filter_name == 'x-amz-meta-hello'
-
-    expected_in1 = ['hello.kaboom', 'hello.txt', 'hello123.txt', 'hello']
-    expected_in2 = ['world1.log', 'world2log', 'world3.log']
-    expected_in3 = ['hello.txt', 'hell.txt', 'worldlog.txt']
-    expected_in4 = ['foo', 'bar', 'hello', 'world']
-    filtered = ['hell.kaboom', 'world.og', 'world.logg', 'he123ll.txt', 'wo', 'log', 'h', 'txt', 'world.log.txt']
-    filtered_with_attr = ['nofoo', 'nobar', 'nohello', 'noworld']
-    # create objects in bucket
-    for key_name in expected_in1:
-        key = bucket.new_key(key_name)
-        key.set_contents_from_string('bar')
-    for key_name in expected_in2:
-        key = bucket.new_key(key_name)
-        key.set_contents_from_string('bar')
-    for key_name in expected_in3:
-        key = bucket.new_key(key_name)
-        key.set_contents_from_string('bar')
-    if not skip_notif4:
-        for key_name in expected_in4:
-            key = bucket.new_key(key_name)
-            key.set_metadata('foo', 'bar')
-            key.set_metadata('hello', 'world')
-            key.set_metadata('goodbye', 'cruel world')
-            key.set_contents_from_string('bar')
-    for key_name in filtered:
-        key = bucket.new_key(key_name)
-        key.set_contents_from_string('bar')
-    for key_name in filtered_with_attr:
-        key.set_metadata('foo', 'nobar')
-        key.set_metadata('hello', 'noworld')
-        key.set_metadata('goodbye', 'cruel world')
-        key = bucket.new_key(key_name)
-        key.set_contents_from_string('bar')
-
-    zone_bucket_checkpoint(ps_zone.zone, master_zone.zone, bucket_name)
-
-    found_in1 = []
-    found_in2 = []
-    found_in3 = []
-    found_in4 = []
-
-    for event in receiver.get_and_reset_events():
-        notif_id = event['Records'][0]['s3']['configurationId']
-        key_name = event['Records'][0]['s3']['object']['key']
-        if notif_id == notification_name+'_1':
-            found_in1.append(key_name)
-        elif notif_id == notification_name+'_2':
-            found_in2.append(key_name)
-        elif notif_id == notification_name+'_3':
-            found_in3.append(key_name)
-        elif not skip_notif4 and notif_id == notification_name+'_4':
-            found_in4.append(key_name)
-        else:
-            assert False, 'invalid notification: ' + notif_id
-
-    assert_equal(set(found_in1), set(expected_in1))
-    assert_equal(set(found_in2), set(expected_in2))
-    assert_equal(set(found_in3), set(expected_in3))
-    if not skip_notif4:
-        assert_equal(set(found_in4), set(expected_in4))
-
-    # cleanup
-    s3_notification_conf.del_config()
-    if not skip_notif4:
-        s3_notification_conf4.del_config()
-    topic_conf.del_config()
-    # delete the bucket
-    for key in bucket.list():
-        key.delete()
-    master_zone.delete_bucket(bucket_name)
-    stop_amqp_receiver(receiver, task)
-    clean_rabbitmq(proc)
-
-
-def test_object_timing():
-    return SkipTest("only used in manual testing")
-    master_zone, _ = init_env(require_ps=False)
-    
-    # create bucket
-    bucket_name = gen_bucket_name()
-    bucket = master_zone.create_bucket(bucket_name)
-    # create objects in the bucket (async)
-    print('creating objects...')
-    number_of_objects = 1000
-    client_threads = []
-    start_time = time.time()
-    content = str(bytearray(os.urandom(1024*1024)))
-    for i in range(number_of_objects):
-        key = bucket.new_key(str(i))
-        thr = threading.Thread(target = set_contents_from_string, args=(key, content,))
-        thr.start()
-        client_threads.append(thr)
-    [thr.join() for thr in client_threads] 
-
-    time_diff = time.time() - start_time
-    print('average time for object creation: ' + str(time_diff*1000/number_of_objects) + ' milliseconds')
-    
-    print('total number of objects: ' + str(len(list(bucket.list()))))
-
-    print('deleting objects...')
-    client_threads = []
-    start_time = time.time()
-    for key in bucket.list():
-        thr = threading.Thread(target = key.delete, args=())
-        thr.start()
-        client_threads.append(thr)
-    [thr.join() for thr in client_threads] 
-    
-    time_diff = time.time() - start_time
-    print('average time for object deletion: ' + str(time_diff*1000/number_of_objects) + ' milliseconds')
-    
-    # cleanup
-    master_zone.delete_bucket(bucket_name)
-
-
-def test_ps_s3_opaque_data():
-    """ test that opaque id set in topic, is sent in notification """
-    if skip_push_tests:
-        return SkipTest("PubSub push tests don't run in teuthology")
-    hostname = get_ip()
-    master_zone, ps_zone = init_env()
-    realm = get_realm()
-    zonegroup = realm.master_zonegroup()
-    
-    # create random port for the http server
-    host = get_ip()
-    port = random.randint(10000, 20000)
-    # start an http server in a separate thread
-    number_of_objects = 10
-    http_server = StreamingHTTPServer(host, port, num_workers=number_of_objects)
-    
-    # create bucket
-    bucket_name = gen_bucket_name()
-    bucket = master_zone.create_bucket(bucket_name)
-    topic_name = bucket_name + TOPIC_SUFFIX
-    # wait for sync
-    zone_meta_checkpoint(ps_zone.zone)
-
-    # create s3 topic
-    endpoint_address = 'http://'+host+':'+str(port)
-    opaque_data = 'http://1.2.3.4:8888'
-    endpoint_args = 'push-endpoint='+endpoint_address+'&OpaqueData='+opaque_data
-    topic_conf = PSTopic(ps_zone.conn, topic_name, endpoint=endpoint_address, endpoint_args=endpoint_args)
-    result, status = topic_conf.set_config()
-    assert_equal(status/100, 2)
-    parsed_result = json.loads(result)
-    topic_arn = parsed_result['arn']
-    # create s3 notification
-    notification_name = bucket_name + NOTIFICATION_SUFFIX
-    topic_conf_list = [{'Id': notification_name,
-                        'TopicArn': topic_arn,
-                        'Events': []
-                       }]
-    s3_notification_conf = PSNotificationS3(ps_zone.conn, bucket_name, topic_conf_list)
-    response, status = s3_notification_conf.set_config()
-    assert_equal(status/100, 2)
-
-    # create objects in the bucket
-    client_threads = []
-    content = 'bar'
-    for i in range(number_of_objects):
-        key = bucket.new_key(str(i))
-        thr = threading.Thread(target = set_contents_from_string, args=(key, content,))
-        thr.start()
-        client_threads.append(thr)
-    [thr.join() for thr in client_threads] 
-
-    # wait for sync
-    zone_bucket_checkpoint(ps_zone.zone, master_zone.zone, bucket_name)
-
-    # check http receiver
-    keys = list(bucket.list())
-    print('total number of objects: ' + str(len(keys)))
-    events = http_server.get_and_reset_events()
-    for event in events:
-        assert_equal(event['Records'][0]['opaqueData'], opaque_data)
-    
-    # cleanup
-    for key in keys:
-        key.delete()
-    [thr.join() for thr in client_threads] 
-    topic_conf.del_config()
-    s3_notification_conf.del_config(notification=notification_name)
-    # delete the bucket
-    master_zone.delete_bucket(bucket_name)
-    http_server.close()
-
-
-def test_ps_topic():
-    """ test set/get/delete of topic """
-    _, ps_zone = init_env()
-    realm = get_realm()
-    zonegroup = realm.master_zonegroup()
-    bucket_name = gen_bucket_name()
-    topic_name = bucket_name+TOPIC_SUFFIX
-
-    # create topic
-    topic_conf = PSTopic(ps_zone.conn, topic_name)
-    _, status = topic_conf.set_config()
-    assert_equal(status/100, 2)
-    # get topic
-    result, _ = topic_conf.get_config()
-    # verify topic content
-    parsed_result = json.loads(result)
-    assert_equal(parsed_result['topic']['name'], topic_name)
-    assert_equal(len(parsed_result['subs']), 0)
-    assert_equal(parsed_result['topic']['arn'],
-                 'arn:aws:sns:' + zonegroup.name + ':' + get_tenant() + ':' + topic_name)
-    # delete topic
-    _, status = topic_conf.del_config()
-    assert_equal(status/100, 2)
-    # verift topic is deleted
-    result, status = topic_conf.get_config()
-    assert_equal(status, 404)
-    parsed_result = json.loads(result)
-    assert_equal(parsed_result['Code'], 'NoSuchKey')
-
-
-def test_ps_topic_with_endpoint():
-    """ test set topic with endpoint"""
-    _, ps_zone = init_env()
-    bucket_name = gen_bucket_name()
-    topic_name = bucket_name+TOPIC_SUFFIX
-
-    # create topic
-    dest_endpoint = 'amqp://localhost:7001'
-    dest_args = 'amqp-exchange=amqp.direct&amqp-ack-level=none'
-    topic_conf = PSTopic(ps_zone.conn, topic_name,
-                         endpoint=dest_endpoint,
-                         endpoint_args=dest_args)
-    _, status = topic_conf.set_config()
-    assert_equal(status/100, 2)
-    # get topic
-    result, _ = topic_conf.get_config()
-    # verify topic content
-    parsed_result = json.loads(result)
-    assert_equal(parsed_result['topic']['name'], topic_name)
-    assert_equal(parsed_result['topic']['dest']['push_endpoint'], dest_endpoint)
-    # cleanup
-    topic_conf.del_config()
-
-
-def test_ps_notification():
-    """ test set/get/delete of notification """
-    master_zone, ps_zone = init_env()
-    bucket_name = gen_bucket_name()
-    topic_name = bucket_name+TOPIC_SUFFIX
-
-    # create topic
-    topic_conf = PSTopic(ps_zone.conn, topic_name)
-    topic_conf.set_config()
-    # create bucket on the first of the rados zones
-    master_zone.create_bucket(bucket_name)
-    # wait for sync
-    zone_meta_checkpoint(ps_zone.zone)
-    # create notifications
-    notification_conf = PSNotification(ps_zone.conn, bucket_name,
-                                       topic_name)
-    _, status = notification_conf.set_config()
-    assert_equal(status/100, 2)
-    # get notification
-    result, _ = notification_conf.get_config()
-    parsed_result = json.loads(result)
-    assert_equal(len(parsed_result['topics']), 1)
-    assert_equal(parsed_result['topics'][0]['topic']['name'],
-                 topic_name)
-    # delete notification
-    _, status = notification_conf.del_config()
-    assert_equal(status/100, 2)
-    result, status = notification_conf.get_config()
-    parsed_result = json.loads(result)
-    assert_equal(len(parsed_result['topics']), 0)
-    # TODO should return 404
-    # assert_equal(status, 404)
-
-    # cleanup
-    topic_conf.del_config()
-    master_zone.delete_bucket(bucket_name)
-
-
-def test_ps_notification_events():
-    """ test set/get/delete of notification on specific events"""
-    master_zone, ps_zone = init_env()
-    bucket_name = gen_bucket_name()
-    topic_name = bucket_name+TOPIC_SUFFIX
-
-    # create topic
-    topic_conf = PSTopic(ps_zone.conn, topic_name)
-    topic_conf.set_config()
-    # create bucket on the first of the rados zones
-    master_zone.create_bucket(bucket_name)
-    # wait for sync
-    zone_meta_checkpoint(ps_zone.zone)
-    # create notifications
-    events = "OBJECT_CREATE,OBJECT_DELETE"
-    notification_conf = PSNotification(ps_zone.conn, bucket_name,
-                                       topic_name,
-                                       events)
-    _, status = notification_conf.set_config()
-    assert_equal(status/100, 2)
-    # get notification
-    result, _ = notification_conf.get_config()
-    parsed_result = json.loads(result)
-    assert_equal(len(parsed_result['topics']), 1)
-    assert_equal(parsed_result['topics'][0]['topic']['name'],
-                 topic_name)
-    assert_not_equal(len(parsed_result['topics'][0]['events']), 0)
-    # TODO add test for invalid event name
-
-    # cleanup
-    notification_conf.del_config()
-    topic_conf.del_config()
-    master_zone.delete_bucket(bucket_name)
-
-
-def test_ps_subscription():
-    """ test set/get/delete of subscription """
-    master_zone, ps_zone = init_env()
-    bucket_name = gen_bucket_name()
-    topic_name = bucket_name+TOPIC_SUFFIX
-
-    # create topic
-    topic_conf = PSTopic(ps_zone.conn, topic_name)
-    topic_conf.set_config()
-    # create bucket on the first of the rados zones
-    bucket = master_zone.create_bucket(bucket_name)
-    # wait for sync
-    zone_meta_checkpoint(ps_zone.zone)
-    # create notifications
-    notification_conf = PSNotification(ps_zone.conn, bucket_name,
-                                       topic_name)
-    _, status = notification_conf.set_config()
-    assert_equal(status/100, 2)
-    # create subscription
-    sub_conf = PSSubscription(ps_zone.conn, bucket_name+SUB_SUFFIX,
-                              topic_name)
-    _, status = sub_conf.set_config()
-    assert_equal(status/100, 2)
-    # get the subscription
-    result, _ = sub_conf.get_config()
-    parsed_result = json.loads(result)
-    assert_equal(parsed_result['topic'], topic_name)
-    # create objects in the bucket
-    number_of_objects = 10
-    for i in range(number_of_objects):
-        key = bucket.new_key(str(i))
-        key.set_contents_from_string('bar')
-    # wait for sync
-    zone_bucket_checkpoint(ps_zone.zone, master_zone.zone, bucket_name)
-
-    # get the create events from the subscription
-    result, _ = sub_conf.get_events()
-    events = json.loads(result)
-    for event in events['events']:
-        log.debug('Event: objname: "' + str(event['info']['key']['name']) + '" type: "' + str(event['event']) + '"')
-    keys = list(bucket.list())
-    # TODO: use exact match
-    verify_events_by_elements(events, keys, exact_match=False)
-    # delete objects from the bucket
-    for key in bucket.list():
-        key.delete()
-    # wait for sync
-    zone_bucket_checkpoint(ps_zone.zone, master_zone.zone, bucket_name)
-
-    # get the delete events from the subscriptions
-    #result, _ = sub_conf.get_events()
-    #for event in events['events']:
-    #    log.debug('Event: objname: "' + str(event['info']['key']['name']) + '" type: "' + str(event['event']) + '"')
-    # TODO: check deletions
-    # TODO: use exact match
-    # verify_events_by_elements(events, keys, exact_match=False, deletions=True)
-    # we should see the creations as well as the deletions
-    # delete subscription
-    _, status = sub_conf.del_config()
-    assert_equal(status/100, 2)
-    result, status = sub_conf.get_config()
-    parsed_result = json.loads(result)
-    assert_equal(parsed_result['topic'], '')
-    # TODO should return 404
-    # assert_equal(status, 404)
-
-    # cleanup
-    notification_conf.del_config()
-    topic_conf.del_config()
-    master_zone.delete_bucket(bucket_name)
-
-
-def test_ps_admin():
-    """ test radosgw-admin commands """
-    master_zone, ps_zone = init_env()
-    bucket_name = gen_bucket_name()
-    topic_name = bucket_name+TOPIC_SUFFIX
-    realm = get_realm()
-    zonegroup = realm.master_zonegroup()
-
-    # create topic
-    topic_conf = PSTopic(ps_zone.conn, topic_name)
-    topic_conf.set_config()
-    result, status = topic_conf.get_config()
-    assert_equal(status, 200)
-    parsed_result = json.loads(result)
-    assert_equal(parsed_result['topic']['name'], topic_name)
-    result, status = ps_zone.zone.cluster.admin(['topic', 'list', '--uid', get_user()] + ps_zone.zone.zone_arg())
-    assert_equal(status, 0)
-    parsed_result = json.loads(result)
-    assert len(parsed_result['topics']) > 0
-    result, status = ps_zone.zone.cluster.admin(['topic', 'get', '--uid', get_user(), '--topic', topic_name] + ps_zone.zone.zone_arg())
-    assert_equal(status, 0)
-    parsed_result = json.loads(result)
-    assert_equal(parsed_result['topic']['name'], topic_name)
-
-    # create s3 topics
-    endpoint_address = 'amqp://127.0.0.1:7001/vhost_1'
-    endpoint_args = 'push-endpoint='+endpoint_address+'&amqp-exchange=amqp.direct&amqp-ack-level=none'
-    topic_conf_s3 = PSTopicS3(master_zone.conn, topic_name, zonegroup.name, endpoint_args=endpoint_args)
-    topic_conf_s3.set_config()
-    result, status = topic_conf_s3.get_config()
-    assert_equal(status, 200)
-    assert_equal(result['GetTopicResponse']['GetTopicResult']['Topic']['Name'], topic_name)
-    result, status = master_zone.zone.cluster.admin(['topic', 'list', '--uid', get_user()] + master_zone.zone.zone_arg())
-    assert_equal(status, 0)
-    parsed_result = json.loads(result)
-    assert len(parsed_result['topics']) > 0
-    result, status = master_zone.zone.cluster.admin(['topic', 'get', '--uid', get_user(), '--topic', topic_name] + master_zone.zone.zone_arg())
-    assert_equal(status, 0)
-    parsed_result = json.loads(result)
-    assert_equal(parsed_result['topic']['name'], topic_name)
-
-    # create bucket on the first of the rados zones
-    bucket = master_zone.create_bucket(bucket_name)
-    # wait for sync
-    zone_meta_checkpoint(ps_zone.zone)
-    # create notifications
-    notification_conf = PSNotification(ps_zone.conn, bucket_name,
-                                       topic_name)
-    _, status = notification_conf.set_config()
-    assert_equal(status/100, 2)
-    # create subscription
-    sub_conf = PSSubscription(ps_zone.conn, bucket_name+SUB_SUFFIX,
-                              topic_name)
-    _, status = sub_conf.set_config()
-    assert_equal(status/100, 2)
-    result, status = ps_zone.zone.cluster.admin(['subscription', 'get', '--uid', get_user(), '--subscription', bucket_name+SUB_SUFFIX] 
-            + ps_zone.zone.zone_arg())
-    assert_equal(status, 0)
-    parsed_result = json.loads(result)
-    assert_equal(parsed_result['name'], bucket_name+SUB_SUFFIX)
-    # create objects in the bucket
-    number_of_objects = 110
-    for i in range(number_of_objects):
-        key = bucket.new_key(str(i))
-        key.set_contents_from_string('bar')
-    # wait for sync
-    # get events from subscription
-    zone_bucket_checkpoint(ps_zone.zone, master_zone.zone, bucket_name)
-    result, status = ps_zone.zone.cluster.admin(['subscription', 'pull', '--uid', get_user(), '--subscription', bucket_name+SUB_SUFFIX] 
-            + ps_zone.zone.zone_arg())
-    assert_equal(status, 0)
-    parsed_result = json.loads(result)
-    marker = parsed_result['next_marker']
-    events1 = parsed_result['events']
-    result, status = ps_zone.zone.cluster.admin(['subscription', 'pull', '--uid', get_user(), '--subscription', bucket_name+SUB_SUFFIX, '--marker', marker]
-            + ps_zone.zone.zone_arg())
-    assert_equal(status, 0)
-    parsed_result = json.loads(result)
-    events2 = parsed_result['events'] 
-    
-    keys = list(bucket.list())
-    verify_events_by_elements({"events": events1+events2}, keys, exact_match=False)
-
-    # ack an event in the subscription 
-    result, status = ps_zone.zone.cluster.admin(['subscription', 'ack', '--uid', get_user(), '--subscription', bucket_name+SUB_SUFFIX, '--event-id', events2[0]['id']]
-            + ps_zone.zone.zone_arg())
-    assert_equal(status, 0)
-
-    # remove the subscription
-    result, status = ps_zone.zone.cluster.admin(['subscription', 'rm', '--uid', get_user(), '--subscription', bucket_name+SUB_SUFFIX]
-            + ps_zone.zone.zone_arg())
-    assert_equal(status, 0)
-
-    # remove the topics
-    result, status = ps_zone.zone.cluster.admin(['topic', 'rm', '--uid', get_user(), '--topic', topic_name]
-            + ps_zone.zone.zone_arg())
-    assert_equal(status, 0)
-    result, status = master_zone.zone.cluster.admin(['topic', 'rm', '--uid', get_user(), '--topic', topic_name]
-            + master_zone.zone.zone_arg())
-    assert_equal(status, 0)
-
-    # cleanup
-    for key in bucket.list():
-        key.delete()
-    notification_conf.del_config()
-    master_zone.delete_bucket(bucket_name)
-
-
-def test_ps_incremental_sync():
-    """ test that events are only sent on incremental sync """
-    master_zone, ps_zone = init_env()
-    bucket_name = gen_bucket_name()
-    topic_name = bucket_name+TOPIC_SUFFIX
-
-    # create topic
-    topic_conf = PSTopic(ps_zone.conn, topic_name)
-    topic_conf.set_config()
-    # create bucket on the first of the rados zones
-    bucket = master_zone.create_bucket(bucket_name)
-    # create objects in the bucket
-    number_of_objects = 10
-    for i in range(0, number_of_objects):
-        key = bucket.new_key(str(i))
-        key.set_contents_from_string('foo')
-    # wait for sync
-    zone_bucket_checkpoint(ps_zone.zone, master_zone.zone, bucket_name)
-    # create notifications
-    notification_conf = PSNotification(ps_zone.conn, bucket_name,
-                                       topic_name)
-    _, status = notification_conf.set_config()
-    assert_equal(status/100, 2)
-    # create subscription
-    sub_conf = PSSubscription(ps_zone.conn, bucket_name+SUB_SUFFIX,
-                              topic_name)
-    _, status = sub_conf.set_config()
-    assert_equal(status/100, 2)
-    
-    # create more objects in the bucket
-    for i in range(number_of_objects, 2*number_of_objects):
-        key = bucket.new_key(str(i))
-        key.set_contents_from_string('bar')
-    # wait for sync
-    zone_bucket_checkpoint(ps_zone.zone, master_zone.zone, bucket_name)
-
-    # get the create events from the subscription
-    result, _ = sub_conf.get_events()
-    events = json.loads(result)
-    count = 0
-    for event in events['events']:
-        log.debug('Event: objname: "' + str(event['info']['key']['name']) + '" type: "' + str(event['event']) + '"')
-        count += 1
-   
-    # make sure we have 10 and not 20 events
-    assert_equal(count, number_of_objects)
-
-    # cleanup
-    for key in bucket.list():
-        key.delete()
-    sub_conf.del_config()
-    notification_conf.del_config()
-    topic_conf.del_config()
-    master_zone.delete_bucket(bucket_name)
-
-def test_ps_event_type_subscription():
-    """ test subscriptions for different events """
-    master_zone, ps_zone = init_env()
-    bucket_name = gen_bucket_name()
-
-    # create topic for objects creation
-    topic_create_name = bucket_name+TOPIC_SUFFIX+'_create'
-    topic_create_conf = PSTopic(ps_zone.conn, topic_create_name)
-    topic_create_conf.set_config()
-    # create topic for objects deletion
-    topic_delete_name = bucket_name+TOPIC_SUFFIX+'_delete'
-    topic_delete_conf = PSTopic(ps_zone.conn, topic_delete_name)
-    topic_delete_conf.set_config()
-    # create topic for all events
-    topic_name = bucket_name+TOPIC_SUFFIX+'_all'
-    topic_conf = PSTopic(ps_zone.conn, topic_name)
-    topic_conf.set_config()
-    # create bucket on the first of the rados zones
-    bucket = master_zone.create_bucket(bucket_name)
-    # wait for sync
-    zone_meta_checkpoint(ps_zone.zone)
-    zone_bucket_checkpoint(ps_zone.zone, master_zone.zone, bucket_name)
-    # create notifications for objects creation
-    notification_create_conf = PSNotification(ps_zone.conn, bucket_name,
-                                              topic_create_name, "OBJECT_CREATE")
-    _, status = notification_create_conf.set_config()
-    assert_equal(status/100, 2)
-    # create notifications for objects deletion
-    notification_delete_conf = PSNotification(ps_zone.conn, bucket_name,
-                                              topic_delete_name, "OBJECT_DELETE")
-    _, status = notification_delete_conf.set_config()
-    assert_equal(status/100, 2)
-    # create notifications for all events
-    notification_conf = PSNotification(ps_zone.conn, bucket_name,
-                                       topic_name, "OBJECT_DELETE,OBJECT_CREATE")
-    _, status = notification_conf.set_config()
-    assert_equal(status/100, 2)
-    # create subscription for objects creation
-    sub_create_conf = PSSubscription(ps_zone.conn, bucket_name+SUB_SUFFIX+'_create',
-                                     topic_create_name)
-    _, status = sub_create_conf.set_config()
-    assert_equal(status/100, 2)
-    # create subscription for objects deletion
-    sub_delete_conf = PSSubscription(ps_zone.conn, bucket_name+SUB_SUFFIX+'_delete',
-                                     topic_delete_name)
-    _, status = sub_delete_conf.set_config()
-    assert_equal(status/100, 2)
-    # create subscription for all events
-    sub_conf = PSSubscription(ps_zone.conn, bucket_name+SUB_SUFFIX+'_all',
-                              topic_name)
-    _, status = sub_conf.set_config()
-    assert_equal(status/100, 2)
-    # create objects in the bucket
-    number_of_objects = 10
-    for i in range(number_of_objects):
-        key = bucket.new_key(str(i))
-        key.set_contents_from_string('bar')
-    # wait for sync
-    zone_bucket_checkpoint(ps_zone.zone, master_zone.zone, bucket_name)
-
-    # get the events from the creation subscription
-    result, _ = sub_create_conf.get_events()
-    events = json.loads(result)
-    for event in events['events']:
-        log.debug('Event (OBJECT_CREATE): objname: "' + str(event['info']['key']['name']) +
-                  '" type: "' + str(event['event']) + '"')
-    keys = list(bucket.list())
-    # TODO: use exact match
-    verify_events_by_elements(events, keys, exact_match=False)
-    # get the events from the deletions subscription
-    result, _ = sub_delete_conf.get_events()
-    events = json.loads(result)
-    for event in events['events']:
-        log.debug('Event (OBJECT_DELETE): objname: "' + str(event['info']['key']['name']) +
-                  '" type: "' + str(event['event']) + '"')
-    assert_equal(len(events['events']), 0)
-    # get the events from the all events subscription
-    result, _ = sub_conf.get_events()
-    events = json.loads(result)
-    for event in events['events']:
-        log.debug('Event (OBJECT_CREATE,OBJECT_DELETE): objname: "' +
-                  str(event['info']['key']['name']) + '" type: "' + str(event['event']) + '"')
-    # TODO: use exact match
-    verify_events_by_elements(events, keys, exact_match=False)
-    # delete objects from the bucket
-    for key in bucket.list():
-        key.delete()
-    # wait for sync
-    zone_bucket_checkpoint(ps_zone.zone, master_zone.zone, bucket_name)
-    log.debug("Event (OBJECT_DELETE) synced")
-
-    # get the events from the creations subscription
-    result, _ = sub_create_conf.get_events()
-    events = json.loads(result)
-    for event in events['events']:
-        log.debug('Event (OBJECT_CREATE): objname: "' + str(event['info']['key']['name']) +
-                  '" type: "' + str(event['event']) + '"')
-    # deletions should not change the creation events
-    # TODO: use exact match
-    verify_events_by_elements(events, keys, exact_match=False)
-    # get the events from the deletions subscription
-    result, _ = sub_delete_conf.get_events()
-    events = json.loads(result)
-    for event in events['events']:
-        log.debug('Event (OBJECT_DELETE): objname: "' + str(event['info']['key']['name']) +
-                  '" type: "' + str(event['event']) + '"')
-    # only deletions should be listed here
-    # TODO: use exact match
-    verify_events_by_elements(events, keys, exact_match=False, deletions=True)
-    # get the events from the all events subscription
-    result, _ = sub_create_conf.get_events()
-    events = json.loads(result)
-    for event in events['events']:
-        log.debug('Event (OBJECT_CREATE,OBJECT_DELETE): objname: "' + str(event['info']['key']['name']) +
-                  '" type: "' + str(event['event']) + '"')
-    # both deletions and creations should be here
-    # TODO: use exact match
-    verify_events_by_elements(events, keys, exact_match=False, deletions=False)
-    # verify_events_by_elements(events, keys, exact_match=False, deletions=True)
-    # TODO: (1) test deletions (2) test overall number of events
-
-    # test subscription deletion when topic is specified
-    _, status = sub_create_conf.del_config(topic=True)
-    assert_equal(status/100, 2)
-    _, status = sub_delete_conf.del_config(topic=True)
-    assert_equal(status/100, 2)
-    _, status = sub_conf.del_config(topic=True)
-    assert_equal(status/100, 2)
-
-    # cleanup
-    notification_create_conf.del_config()
-    notification_delete_conf.del_config()
-    notification_conf.del_config()
-    topic_create_conf.del_config()
-    topic_delete_conf.del_config()
-    topic_conf.del_config()
-    master_zone.delete_bucket(bucket_name)
-
-
-def test_ps_event_fetching():
-    """ test incremental fetching of events from a subscription """
-    master_zone, ps_zone = init_env()
-    bucket_name = gen_bucket_name()
-    topic_name = bucket_name+TOPIC_SUFFIX
-
-    # create topic
-    topic_conf = PSTopic(ps_zone.conn, topic_name)
-    topic_conf.set_config()
-    # create bucket on the first of the rados zones
-    bucket = master_zone.create_bucket(bucket_name)
-    # wait for sync
-    zone_meta_checkpoint(ps_zone.zone)
-    # create notifications
-    notification_conf = PSNotification(ps_zone.conn, bucket_name,
-                                       topic_name)
-    _, status = notification_conf.set_config()
-    assert_equal(status/100, 2)
-    # create subscription
-    sub_conf = PSSubscription(ps_zone.conn, bucket_name+SUB_SUFFIX,
-                              topic_name)
-    _, status = sub_conf.set_config()
-    assert_equal(status/100, 2)
-    # create objects in the bucket
-    number_of_objects = 100
-    for i in range(number_of_objects):
-        key = bucket.new_key(str(i))
-        key.set_contents_from_string('bar')
-    # wait for sync
-    zone_bucket_checkpoint(ps_zone.zone, master_zone.zone, bucket_name)
-    max_events = 15
-    total_events_count = 0
-    next_marker = None
-    all_events = []
-    while True:
-        # get the events from the subscription
-        result, _ = sub_conf.get_events(max_events, next_marker)
-        events = json.loads(result)
-        total_events_count += len(events['events'])
-        all_events.extend(events['events'])
-        next_marker = events['next_marker']
-        for event in events['events']:
-            log.debug('Event: objname: "' + str(event['info']['key']['name']) + '" type: "' + str(event['event']) + '"')
-        if next_marker == '':
-            break
-    keys = list(bucket.list())
-    # TODO: use exact match
-    verify_events_by_elements({'events': all_events}, keys, exact_match=False)
-
-    # cleanup
-    sub_conf.del_config()
-    notification_conf.del_config()
-    topic_conf.del_config()
-    for key in bucket.list():
-        key.delete()
-    master_zone.delete_bucket(bucket_name)
-
-
-def test_ps_event_acking():
-    """ test acking of some events in a subscription """
-    master_zone, ps_zone = init_env()
-    bucket_name = gen_bucket_name()
-    topic_name = bucket_name+TOPIC_SUFFIX
-
-    # create topic
-    topic_conf = PSTopic(ps_zone.conn, topic_name)
-    topic_conf.set_config()
-    # create bucket on the first of the rados zones
-    bucket = master_zone.create_bucket(bucket_name)
-    # wait for sync
-    zone_meta_checkpoint(ps_zone.zone)
-    # create notifications
-    notification_conf = PSNotification(ps_zone.conn, bucket_name,
-                                       topic_name)
-    _, status = notification_conf.set_config()
-    assert_equal(status/100, 2)
-    # create subscription
-    sub_conf = PSSubscription(ps_zone.conn, bucket_name+SUB_SUFFIX,
-                              topic_name)
-    _, status = sub_conf.set_config()
-    assert_equal(status/100, 2)
-    # create objects in the bucket
-    number_of_objects = 10
-    for i in range(number_of_objects):
-        key = bucket.new_key(str(i))
-        key.set_contents_from_string('bar')
-    # wait for sync
-    zone_bucket_checkpoint(ps_zone.zone, master_zone.zone, bucket_name)
-
-    # get the create events from the subscription
-    result, _ = sub_conf.get_events()
-    events = json.loads(result)
-    original_number_of_events = len(events)
-    for event in events['events']:
-        log.debug('Event (before ack)  id: "' + str(event['id']) + '"')
-    keys = list(bucket.list())
-    # TODO: use exact match
-    verify_events_by_elements(events, keys, exact_match=False)
-    # ack half of the  events
-    events_to_ack = number_of_objects/2
-    for event in events['events']:
-        if events_to_ack == 0:
-            break
-        _, status = sub_conf.ack_events(event['id'])
-        assert_equal(status/100, 2)
-        events_to_ack -= 1
-
-    # verify that acked events are gone
-    result, _ = sub_conf.get_events()
-    events = json.loads(result)
-    for event in events['events']:
-        log.debug('Event (after ack) id: "' + str(event['id']) + '"')
-    assert len(events) >= (original_number_of_events - number_of_objects/2)
-
-    # cleanup
-    sub_conf.del_config()
-    notification_conf.del_config()
-    topic_conf.del_config()
-    for key in bucket.list():
-        key.delete()
-    master_zone.delete_bucket(bucket_name)
-
-
-def test_ps_creation_triggers():
-    """ test object creation notifications in using put/copy/post """
-    master_zone, ps_zone = init_env()
-    bucket_name = gen_bucket_name()
-    topic_name = bucket_name+TOPIC_SUFFIX
-
-    # create topic
-    topic_conf = PSTopic(ps_zone.conn, topic_name)
-    topic_conf.set_config()
-    # create bucket on the first of the rados zones
-    bucket = master_zone.create_bucket(bucket_name)
-    # wait for sync
-    zone_meta_checkpoint(ps_zone.zone)
-    # create notifications
-    notification_conf = PSNotification(ps_zone.conn, bucket_name,
-                                       topic_name)
-    _, status = notification_conf.set_config()
-    assert_equal(status/100, 2)
-    # create subscription
-    sub_conf = PSSubscription(ps_zone.conn, bucket_name+SUB_SUFFIX,
-                              topic_name)
-    _, status = sub_conf.set_config()
-    assert_equal(status/100, 2)
-    # create objects in the bucket using PUT
-    key = bucket.new_key('put')
-    key.set_contents_from_string('bar')
-    # create objects in the bucket using COPY
-    bucket.copy_key('copy', bucket.name, key.name)
-
-    # create objects in the bucket using multi-part upload
-    fp = tempfile.NamedTemporaryFile(mode='w+b')
-    object_size = 1024
-    content = bytearray(os.urandom(object_size))
-    fp.write(content)
-    fp.flush()
-    fp.seek(0)
-    uploader = bucket.initiate_multipart_upload('multipart')
-    uploader.upload_part_from_file(fp, 1)
-    uploader.complete_upload()
-    fp.close()
-    
-    # wait for sync
-    zone_bucket_checkpoint(ps_zone.zone, master_zone.zone, bucket_name)
-
-    # get the create events from the subscription
-    result, _ = sub_conf.get_events()
-    events = json.loads(result)
-    for event in events['events']:
-        log.debug('Event key: "' + str(event['info']['key']['name']) + '" type: "' + str(event['event']) + '"')
-
-    # TODO: verify the specific 3 keys: 'put', 'copy' and 'multipart'
-    assert len(events['events']) >= 3
-    # cleanup
-    sub_conf.del_config()
-    notification_conf.del_config()
-    topic_conf.del_config()
-    for key in bucket.list():
-        key.delete()
-    master_zone.delete_bucket(bucket_name)
-
-
-def test_ps_versioned_deletion():
-    """ test notification of deletion markers """
-    master_zone, ps_zone = init_env()
-    bucket_name = gen_bucket_name()
-    topic_name = bucket_name+TOPIC_SUFFIX
-
-    # create topics
-    topic_conf1 = PSTopic(ps_zone.conn, topic_name+'_1')
-    _, status = topic_conf1.set_config()
-    assert_equal(status/100, 2)
-    topic_conf2 = PSTopic(ps_zone.conn, topic_name+'_2')
-    _, status = topic_conf2.set_config()
-    assert_equal(status/100, 2)
-    
-    # create bucket on the first of the rados zones
-    bucket = master_zone.create_bucket(bucket_name)
-    bucket.configure_versioning(True)
-    
-    # wait for sync
-    zone_meta_checkpoint(ps_zone.zone)
-    
-    # create notifications
-    event_type1 = 'OBJECT_DELETE'
-    notification_conf1 = PSNotification(ps_zone.conn, bucket_name,
-                                        topic_name+'_1',
-                                        event_type1)
-    _, status = notification_conf1.set_config()
-    assert_equal(status/100, 2)
-    event_type2 = 'DELETE_MARKER_CREATE'
-    notification_conf2 = PSNotification(ps_zone.conn, bucket_name,
-                                        topic_name+'_2',
-                                        event_type2)
-    _, status = notification_conf2.set_config()
-    assert_equal(status/100, 2)
-    
-    # create subscriptions
-    sub_conf1 = PSSubscription(ps_zone.conn, bucket_name+SUB_SUFFIX+'_1',
-                               topic_name+'_1')
-    _, status = sub_conf1.set_config()
-    assert_equal(status/100, 2)
-    sub_conf2 = PSSubscription(ps_zone.conn, bucket_name+SUB_SUFFIX+'_2',
-                               topic_name+'_2')
-    _, status = sub_conf2.set_config()
-    assert_equal(status/100, 2)
-    
-    # create objects in the bucket
-    key = bucket.new_key('foo')
-    key.set_contents_from_string('bar')
-    v1 = key.version_id
-    key.set_contents_from_string('kaboom')
-    v2 = key.version_id
-    # create deletion marker
-    delete_marker_key = bucket.delete_key(key.name)
-    
-    # wait for sync
-    zone_bucket_checkpoint(ps_zone.zone, master_zone.zone, bucket_name)
-
-    # delete the deletion marker
-    delete_marker_key.delete()
-    # delete versions
-    bucket.delete_key(key.name, version_id=v2)
-    bucket.delete_key(key.name, version_id=v1)
-    
-    # wait for sync
-    zone_bucket_checkpoint(ps_zone.zone, master_zone.zone, bucket_name)
-
-    # get the delete events from the subscription
-    result, _ = sub_conf1.get_events()
-    events = json.loads(result)
-    for event in events['events']:
-        log.debug('Event key: "' + str(event['info']['key']['name']) + '" type: "' + str(event['event']) + '"')
-        assert_equal(str(event['event']), event_type1)
-
-    result, _ = sub_conf2.get_events()
-    events = json.loads(result)
-    for event in events['events']:
-        log.debug('Event key: "' + str(event['info']['key']['name']) + '" type: "' + str(event['event']) + '"')
-        assert_equal(str(event['event']), event_type2)
-
-    # cleanup
-    # follwing is needed for the cleanup in the case of 3-zones
-    # see: http://tracker.ceph.com/issues/39142
-    realm = get_realm()
-    zonegroup = realm.master_zonegroup()
-    zonegroup_conns = ZonegroupConns(zonegroup)
-    try:
-        zonegroup_bucket_checkpoint(zonegroup_conns, bucket_name)
-        master_zone.delete_bucket(bucket_name)
-    except:
-        log.debug('zonegroup_bucket_checkpoint failed, cannot delete bucket')
-    sub_conf1.del_config()
-    sub_conf2.del_config()
-    notification_conf1.del_config()
-    notification_conf2.del_config()
-    topic_conf1.del_config()
-    topic_conf2.del_config()
-
-
-def test_ps_push_http():
-    """ test pushing to http endpoint """
-    if skip_push_tests:
-        return SkipTest("PubSub push tests don't run in teuthology")
-    master_zone, ps_zone = init_env()
-    bucket_name = gen_bucket_name()
-    topic_name = bucket_name+TOPIC_SUFFIX
-
-    # create random port for the http server
-    host = get_ip()
-    port = random.randint(10000, 20000)
-    # start an http server in a separate thread
-    http_server = StreamingHTTPServer(host, port)
-
-    # create topic
-    topic_conf = PSTopic(ps_zone.conn, topic_name)
-    _, status = topic_conf.set_config()
-    assert_equal(status/100, 2)
-    # create bucket on the first of the rados zones
-    bucket = master_zone.create_bucket(bucket_name)
-    # wait for sync
-    zone_meta_checkpoint(ps_zone.zone)
-    # create notifications
-    notification_conf = PSNotification(ps_zone.conn, bucket_name,
-                                       topic_name)
-    _, status = notification_conf.set_config()
-    assert_equal(status/100, 2)
-    # create subscription
-    sub_conf = PSSubscription(ps_zone.conn, bucket_name+SUB_SUFFIX,
-                              topic_name, endpoint='http://'+host+':'+str(port))
-    _, status = sub_conf.set_config()
-    assert_equal(status/100, 2)
-    # create objects in the bucket
-    number_of_objects = 10
-    for i in range(number_of_objects):
-        key = bucket.new_key(str(i))
-        key.set_contents_from_string('bar')
-    # wait for sync
-    zone_bucket_checkpoint(ps_zone.zone, master_zone.zone, bucket_name)
-    # check http server
-    keys = list(bucket.list())
-    # TODO: use exact match
-    http_server.verify_events(keys, exact_match=False)
-
-    # delete objects from the bucket
-    for key in bucket.list():
-        key.delete()
-    # wait for sync
-    zone_meta_checkpoint(ps_zone.zone)
-    zone_bucket_checkpoint(ps_zone.zone, master_zone.zone, bucket_name)
-    # check http server
-    # TODO: use exact match
-    http_server.verify_events(keys, deletions=True, exact_match=False)
-
-    # cleanup
-    sub_conf.del_config()
-    notification_conf.del_config()
-    topic_conf.del_config()
-    master_zone.delete_bucket(bucket_name)
-    http_server.close()
-
-
-def test_ps_s3_push_http():
-    """ test pushing to http endpoint s3 record format"""
-    if skip_push_tests:
-        return SkipTest("PubSub push tests don't run in teuthology")
-    master_zone, ps_zone = init_env()
-    bucket_name = gen_bucket_name()
-    topic_name = bucket_name+TOPIC_SUFFIX
-
-    # create random port for the http server
-    host = get_ip()
-    port = random.randint(10000, 20000)
-    # start an http server in a separate thread
-    http_server = StreamingHTTPServer(host, port)
-
-    # create topic
-    topic_conf = PSTopic(ps_zone.conn, topic_name,
-                         endpoint='http://'+host+':'+str(port))
-    result, status = topic_conf.set_config()
-    assert_equal(status/100, 2)
-    parsed_result = json.loads(result)
-    topic_arn = parsed_result['arn']
-    # create bucket on the first of the rados zones
-    bucket = master_zone.create_bucket(bucket_name)
-    # wait for sync
-    zone_meta_checkpoint(ps_zone.zone)
-    # create s3 notification
-    notification_name = bucket_name + NOTIFICATION_SUFFIX
-    topic_conf_list = [{'Id': notification_name,
-                        'TopicArn': topic_arn,
-                        'Events': ['s3:ObjectCreated:*', 's3:ObjectRemoved:*']
-                       }]
-    s3_notification_conf = PSNotificationS3(ps_zone.conn, bucket_name, topic_conf_list)
-    _, status = s3_notification_conf.set_config()
-    assert_equal(status/100, 2)
-    # create objects in the bucket
-    number_of_objects = 10
-    for i in range(number_of_objects):
-        key = bucket.new_key(str(i))
-        key.set_contents_from_string('bar')
-    # wait for sync
-    zone_bucket_checkpoint(ps_zone.zone, master_zone.zone, bucket_name)
-    # check http server
-    keys = list(bucket.list())
-    # TODO: use exact match
-    http_server.verify_s3_events(keys, exact_match=False)
-
-    # delete objects from the bucket
-    for key in bucket.list():
-        key.delete()
-    # wait for sync
-    zone_meta_checkpoint(ps_zone.zone)
-    zone_bucket_checkpoint(ps_zone.zone, master_zone.zone, bucket_name)
-    # check http server
-    # TODO: use exact match
-    http_server.verify_s3_events(keys, deletions=True, exact_match=False)
-
-    # cleanup
-    s3_notification_conf.del_config()
-    topic_conf.del_config()
-    master_zone.delete_bucket(bucket_name)
-    http_server.close()
-
-
-def test_ps_push_amqp():
-    """ test pushing to amqp endpoint """
-    if skip_push_tests:
-        return SkipTest("PubSub push tests don't run in teuthology")
-    hostname = get_ip()
-    proc = init_rabbitmq()
-    if proc is  None:
-        return SkipTest('end2end amqp tests require rabbitmq-server installed')
-    master_zone, ps_zone = init_env()
-    bucket_name = gen_bucket_name()
-    topic_name = bucket_name+TOPIC_SUFFIX
-
-    # create topic
-    exchange = 'ex1'
-    task, receiver = create_amqp_receiver_thread(exchange, topic_name)
-    task.start()
-    topic_conf = PSTopic(ps_zone.conn, topic_name)
-    _, status = topic_conf.set_config()
-    assert_equal(status/100, 2)
-    # create bucket on the first of the rados zones
-    bucket = master_zone.create_bucket(bucket_name)
-    # wait for sync
-    zone_meta_checkpoint(ps_zone.zone)
-    # create notifications
-    notification_conf = PSNotification(ps_zone.conn, bucket_name,
-                                       topic_name)
-    _, status = notification_conf.set_config()
-    assert_equal(status/100, 2)
-    # create subscription
-    sub_conf = PSSubscription(ps_zone.conn, bucket_name+SUB_SUFFIX,
-                              topic_name, endpoint='amqp://'+hostname,
-                              endpoint_args='amqp-exchange='+exchange+'&amqp-ack-level=broker')
-    _, status = sub_conf.set_config()
-    assert_equal(status/100, 2)
-    # create objects in the bucket
-    number_of_objects = 10
-    for i in range(number_of_objects):
-        key = bucket.new_key(str(i))
-        key.set_contents_from_string('bar')
-    # wait for sync
-    zone_bucket_checkpoint(ps_zone.zone, master_zone.zone, bucket_name)
-    # check amqp receiver
-    keys = list(bucket.list())
-    # TODO: use exact match
-    receiver.verify_events(keys, exact_match=False)
-
-    # delete objects from the bucket
-    for key in bucket.list():
-        key.delete()
-    # wait for sync
-    zone_meta_checkpoint(ps_zone.zone)
-    zone_bucket_checkpoint(ps_zone.zone, master_zone.zone, bucket_name)
-    # check amqp receiver
-    # TODO: use exact match
-    receiver.verify_events(keys, deletions=True, exact_match=False)
-
-    # cleanup
-    stop_amqp_receiver(receiver, task)
-    sub_conf.del_config()
-    notification_conf.del_config()
-    topic_conf.del_config()
-    master_zone.delete_bucket(bucket_name)
-    clean_rabbitmq(proc)
-
-
-def test_ps_s3_push_amqp():
-    """ test pushing to amqp endpoint s3 record format"""
-    if skip_push_tests:
-        return SkipTest("PubSub push tests don't run in teuthology")
-    hostname = get_ip()
-    proc = init_rabbitmq()
-    if proc is  None:
-        return SkipTest('end2end amqp tests require rabbitmq-server installed')
-    master_zone, ps_zone = init_env()
-    bucket_name = gen_bucket_name()
-    topic_name = bucket_name+TOPIC_SUFFIX
-
-    # create topic
-    exchange = 'ex1'
-    task, receiver = create_amqp_receiver_thread(exchange, topic_name)
-    task.start()
-    topic_conf = PSTopic(ps_zone.conn, topic_name,
-                         endpoint='amqp://' + hostname,
-                         endpoint_args='amqp-exchange=' + exchange + '&amqp-ack-level=none')
-    result, status = topic_conf.set_config()
-    assert_equal(status/100, 2)
-    parsed_result = json.loads(result)
-    topic_arn = parsed_result['arn']
-    # create bucket on the first of the rados zones
-    bucket = master_zone.create_bucket(bucket_name)
-    # wait for sync
-    zone_meta_checkpoint(ps_zone.zone)
-    # create s3 notification
-    notification_name = bucket_name + NOTIFICATION_SUFFIX
-    topic_conf_list = [{'Id': notification_name,
-                        'TopicArn': topic_arn,
-                        'Events': ['s3:ObjectCreated:*', 's3:ObjectRemoved:*']
-                       }]
-    s3_notification_conf = PSNotificationS3(ps_zone.conn, bucket_name, topic_conf_list)
-    _, status = s3_notification_conf.set_config()
-    assert_equal(status/100, 2)
-    # create objects in the bucket
-    number_of_objects = 10
-    for i in range(number_of_objects):
-        key = bucket.new_key(str(i))
-        key.set_contents_from_string('bar')
-    # wait for sync
-    zone_bucket_checkpoint(ps_zone.zone, master_zone.zone, bucket_name)
-    # check amqp receiver
-    keys = list(bucket.list())
-    # TODO: use exact match
-    receiver.verify_s3_events(keys, exact_match=False)
-
-    # delete objects from the bucket
-    for key in bucket.list():
-        key.delete()
-    # wait for sync
-    zone_meta_checkpoint(ps_zone.zone)
-    zone_bucket_checkpoint(ps_zone.zone, master_zone.zone, bucket_name)
-    # check amqp receiver
-    # TODO: use exact match
-    receiver.verify_s3_events(keys, deletions=True, exact_match=False)
-
-    # cleanup
-    stop_amqp_receiver(receiver, task)
-    s3_notification_conf.del_config()
-    topic_conf.del_config()
-    master_zone.delete_bucket(bucket_name)
-    clean_rabbitmq(proc)
-
-
-def test_ps_delete_bucket():
-    """ test notification status upon bucket deletion """
-    master_zone, ps_zone = init_env()
-    bucket_name = gen_bucket_name()
-    # create bucket on the first of the rados zones
-    bucket = master_zone.create_bucket(bucket_name)
-    # wait for sync
-    zone_meta_checkpoint(ps_zone.zone)
-    topic_name = bucket_name + TOPIC_SUFFIX
-    # create topic
-    topic_name = bucket_name + TOPIC_SUFFIX
-    topic_conf = PSTopic(ps_zone.conn, topic_name)
-    response, status = topic_conf.set_config()
-    assert_equal(status/100, 2)
-    parsed_result = json.loads(response)
-    topic_arn = parsed_result['arn']
-    # create one s3 notification
-    notification_name = bucket_name + NOTIFICATION_SUFFIX
-    topic_conf_list = [{'Id': notification_name,
-                        'TopicArn': topic_arn,
-                        'Events': ['s3:ObjectCreated:*']
-                       }]
-    s3_notification_conf = PSNotificationS3(ps_zone.conn, bucket_name, topic_conf_list)
-    response, status = s3_notification_conf.set_config()
-    assert_equal(status/100, 2)
-
-    # create non-s3 notification
-    notification_conf = PSNotification(ps_zone.conn, bucket_name,
-                                       topic_name)
-    _, status = notification_conf.set_config()
-    assert_equal(status/100, 2)
-
-    # create objects in the bucket
-    number_of_objects = 10
-    for i in range(number_of_objects):
-        key = bucket.new_key(str(i))
-        key.set_contents_from_string('bar')
-    # wait for bucket sync
-    zone_bucket_checkpoint(ps_zone.zone, master_zone.zone, bucket_name)
-    keys = list(bucket.list())
-    # delete objects from the bucket
-    for key in bucket.list():
-        key.delete()
-    # wait for bucket sync
-    zone_bucket_checkpoint(ps_zone.zone, master_zone.zone, bucket_name)
-    # delete the bucket
-    master_zone.delete_bucket(bucket_name)
-    # wait for meta sync
-    zone_meta_checkpoint(ps_zone.zone)
-
-    # get the events from the auto-generated subscription
-    sub_conf = PSSubscription(ps_zone.conn, notification_name,
-                              topic_name)
-    result, _ = sub_conf.get_events()
-    records = json.loads(result)
-    # TODO: use exact match
-    verify_s3_records_by_elements(records, keys, exact_match=False)
-
-    # s3 notification is deleted with bucket
-    _, status = s3_notification_conf.get_config(notification=notification_name)
-    assert_equal(status, 404)
-    # non-s3 notification is deleted with bucket
-    _, status = notification_conf.get_config()
-    assert_equal(status, 404)
-    # cleanup
-    sub_conf.del_config()
-    topic_conf.del_config()
-
-
-def test_ps_missing_topic():
-    """ test creating a subscription when no topic info exists"""
-    master_zone, ps_zone = init_env()
-    bucket_name = gen_bucket_name()
-    topic_name = bucket_name+TOPIC_SUFFIX
-
-    # create bucket on the first of the rados zones
-    master_zone.create_bucket(bucket_name)
-    # wait for sync
-    zone_meta_checkpoint(ps_zone.zone)
-    # create s3 notification
-    notification_name = bucket_name + NOTIFICATION_SUFFIX
-    topic_arn = 'arn:aws:sns:::' + topic_name
-    topic_conf_list = [{'Id': notification_name,
-                        'TopicArn': topic_arn,
-                        'Events': ['s3:ObjectCreated:*']
-                       }]
-    s3_notification_conf = PSNotificationS3(ps_zone.conn, bucket_name, topic_conf_list)
-    try:
-        s3_notification_conf.set_config()
-    except:
-        log.info('missing topic is expected')
-    else:
-        assert 'missing topic is expected'
-
-    # cleanup
-    master_zone.delete_bucket(bucket_name)
-
-
-def test_ps_s3_topic_update():
-    """ test updating topic associated with a notification"""
-    if skip_push_tests:
-        return SkipTest("PubSub push tests don't run in teuthology")
-    rabbit_proc = init_rabbitmq()
-    if rabbit_proc is  None:
-        return SkipTest('end2end amqp tests require rabbitmq-server installed')
-    master_zone, ps_zone = init_env()
-    bucket_name = gen_bucket_name()
-    topic_name = bucket_name+TOPIC_SUFFIX
-
-    # create amqp topic
-    hostname = get_ip()
-    exchange = 'ex1'
-    amqp_task, receiver = create_amqp_receiver_thread(exchange, topic_name)
-    amqp_task.start()
-    topic_conf = PSTopic(ps_zone.conn, topic_name,
-                          endpoint='amqp://' + hostname,
-                          endpoint_args='amqp-exchange=' + exchange + '&amqp-ack-level=none')
-    result, status = topic_conf.set_config()
-    assert_equal(status/100, 2)
-    parsed_result = json.loads(result)
-    topic_arn = parsed_result['arn']
-    # get topic
-    result, _ = topic_conf.get_config()
-    # verify topic content
-    parsed_result = json.loads(result)
-    assert_equal(parsed_result['topic']['name'], topic_name)
-    assert_equal(parsed_result['topic']['dest']['push_endpoint'], topic_conf.parameters['push-endpoint'])
-    
-    # create http server
-    port = random.randint(10000, 20000)
-    # start an http server in a separate thread
-    http_server = StreamingHTTPServer(hostname, port)
-
-    # create bucket on the first of the rados zones
-    bucket = master_zone.create_bucket(bucket_name)
-    # wait for sync
-    zone_meta_checkpoint(ps_zone.zone)
-    # create s3 notification
-    notification_name = bucket_name + NOTIFICATION_SUFFIX
-    topic_conf_list = [{'Id': notification_name,
-                        'TopicArn': topic_arn,
-                        'Events': ['s3:ObjectCreated:*']
-                       }]
-    s3_notification_conf = PSNotificationS3(ps_zone.conn, bucket_name, topic_conf_list)
-    _, status = s3_notification_conf.set_config()
-    assert_equal(status/100, 2)
-    # create objects in the bucket
-    number_of_objects = 10
-    for i in range(number_of_objects):
-        key = bucket.new_key(str(i))
-        key.set_contents_from_string('bar')
-    # wait for sync
-    zone_bucket_checkpoint(ps_zone.zone, master_zone.zone, bucket_name)
-
-    keys = list(bucket.list())
-    # TODO: use exact match
-    receiver.verify_s3_events(keys, exact_match=False)
-
-    # update the same topic with new endpoint
-    topic_conf = PSTopic(ps_zone.conn, topic_name,
-                         endpoint='http://'+ hostname + ':' + str(port))
-    _, status = topic_conf.set_config()
-    assert_equal(status/100, 2)
-    # get topic
-    result, _ = topic_conf.get_config()
-    # verify topic content
-    parsed_result = json.loads(result)
-    assert_equal(parsed_result['topic']['name'], topic_name)
-    assert_equal(parsed_result['topic']['dest']['push_endpoint'], topic_conf.parameters['push-endpoint'])
-
-    # delete current objects and create new objects in the bucket
-    for key in bucket.list():
-        key.delete()
-    for i in range(number_of_objects):
-        key = bucket.new_key(str(i+100))
-        key.set_contents_from_string('bar')
-    # wait for sync
-    zone_meta_checkpoint(ps_zone.zone)
-    zone_bucket_checkpoint(ps_zone.zone, master_zone.zone, bucket_name)
-
-    keys = list(bucket.list())
-    # verify that notifications are still sent to amqp
-    # TODO: use exact match
-    receiver.verify_s3_events(keys, exact_match=False)
-
-    # update notification to update the endpoint from the topic
-    topic_conf_list = [{'Id': notification_name,
-                        'TopicArn': topic_arn,
-                        'Events': ['s3:ObjectCreated:*']
-                       }]
-    s3_notification_conf = PSNotificationS3(ps_zone.conn, bucket_name, topic_conf_list)
-    _, status = s3_notification_conf.set_config()
-    assert_equal(status/100, 2)
-    
-    # delete current objects and create new objects in the bucket
-    for key in bucket.list():
-        key.delete()
-    for i in range(number_of_objects):
-        key = bucket.new_key(str(i+200))
-        key.set_contents_from_string('bar')
-    # wait for sync
-    zone_meta_checkpoint(ps_zone.zone)
-    zone_bucket_checkpoint(ps_zone.zone, master_zone.zone, bucket_name)
-
-    keys = list(bucket.list())
-    # check that updates switched to http
-    # TODO: use exact match
-    http_server.verify_s3_events(keys, exact_match=False)
-
-    # cleanup
-    # delete objects from the bucket
-    stop_amqp_receiver(receiver, amqp_task)
-    for key in bucket.list():
-        key.delete()
-    s3_notification_conf.del_config()
-    topic_conf.del_config()
-    master_zone.delete_bucket(bucket_name)
-    http_server.close()
-    clean_rabbitmq(rabbit_proc)
-
-
-def test_ps_s3_notification_update():
-    """ test updating the topic of a notification"""
-    if skip_push_tests:
-        return SkipTest("PubSub push tests don't run in teuthology")
-    hostname = get_ip()
-    rabbit_proc = init_rabbitmq()
-    if rabbit_proc is  None:
-        return SkipTest('end2end amqp tests require rabbitmq-server installed')
-
-    master_zone, ps_zone = init_env()
-    bucket_name = gen_bucket_name()
-    topic_name1 = bucket_name+'amqp'+TOPIC_SUFFIX
-    topic_name2 = bucket_name+'http'+TOPIC_SUFFIX
-
-    # create topics
-    # start amqp receiver in a separate thread
-    exchange = 'ex1'
-    amqp_task, receiver = create_amqp_receiver_thread(exchange, topic_name1)
-    amqp_task.start()
-    # create random port for the http server
-    http_port = random.randint(10000, 20000)
-    # start an http server in a separate thread
-    http_server = StreamingHTTPServer(hostname, http_port)
-
-    topic_conf1 = PSTopic(ps_zone.conn, topic_name1,
-                          endpoint='amqp://' + hostname,
-                          endpoint_args='amqp-exchange=' + exchange + '&amqp-ack-level=none')
-    result, status = topic_conf1.set_config()
-    parsed_result = json.loads(result)
-    topic_arn1 = parsed_result['arn']
-    assert_equal(status/100, 2)
-    topic_conf2 = PSTopic(ps_zone.conn, topic_name2,
-                          endpoint='http://'+hostname+':'+str(http_port))
-    result, status = topic_conf2.set_config()
-    parsed_result = json.loads(result)
-    topic_arn2 = parsed_result['arn']
-    assert_equal(status/100, 2)
-
-    # create bucket on the first of the rados zones
-    bucket = master_zone.create_bucket(bucket_name)
-    # wait for sync
-    zone_meta_checkpoint(ps_zone.zone)
-    # create s3 notification with topic1
-    notification_name = bucket_name + NOTIFICATION_SUFFIX
-    topic_conf_list = [{'Id': notification_name,
-                        'TopicArn': topic_arn1,
-                        'Events': ['s3:ObjectCreated:*']
-                       }]
-    s3_notification_conf = PSNotificationS3(ps_zone.conn, bucket_name, topic_conf_list)
-    _, status = s3_notification_conf.set_config()
-    assert_equal(status/100, 2)
-    # create objects in the bucket
-    number_of_objects = 10
-    for i in range(number_of_objects):
-        key = bucket.new_key(str(i))
-        key.set_contents_from_string('bar')
-    # wait for sync
-    zone_bucket_checkpoint(ps_zone.zone, master_zone.zone, bucket_name)
-
-    keys = list(bucket.list())
-    # TODO: use exact match
-    receiver.verify_s3_events(keys, exact_match=False);
-
-    # update notification to use topic2
-    topic_conf_list = [{'Id': notification_name,
-                        'TopicArn': topic_arn2,
-                        'Events': ['s3:ObjectCreated:*']
-                       }]
-    s3_notification_conf = PSNotificationS3(ps_zone.conn, bucket_name, topic_conf_list)
-    _, status = s3_notification_conf.set_config()
-    assert_equal(status/100, 2)
-
-    # delete current objects and create new objects in the bucket
-    for key in bucket.list():
-        key.delete()
-    for i in range(number_of_objects):
-        key = bucket.new_key(str(i+100))
-        key.set_contents_from_string('bar')
-    # wait for sync
-    zone_meta_checkpoint(ps_zone.zone)
-    zone_bucket_checkpoint(ps_zone.zone, master_zone.zone, bucket_name)
-
-    keys = list(bucket.list())
-    # check that updates switched to http
-    # TODO: use exact match
-    http_server.verify_s3_events(keys, exact_match=False)
-
-    # cleanup
-    # delete objects from the bucket
-    stop_amqp_receiver(receiver, amqp_task)
-    for key in bucket.list():
-        key.delete()
-    s3_notification_conf.del_config()
-    topic_conf1.del_config()
-    topic_conf2.del_config()
-    master_zone.delete_bucket(bucket_name)
-    http_server.close()
-    clean_rabbitmq(rabbit_proc)
-
-
-def test_ps_s3_multiple_topics_notification():
-    """ test notification creation with multiple topics"""
-    if skip_push_tests:
-        return SkipTest("PubSub push tests don't run in teuthology")
-    hostname = get_ip()
-    rabbit_proc = init_rabbitmq()
-    if rabbit_proc is  None:
-        return SkipTest('end2end amqp tests require rabbitmq-server installed')
-
-    master_zone, ps_zone = init_env()
-    bucket_name = gen_bucket_name()
-    topic_name1 = bucket_name+'amqp'+TOPIC_SUFFIX
-    topic_name2 = bucket_name+'http'+TOPIC_SUFFIX
-
-    # create topics
-    # start amqp receiver in a separate thread
-    exchange = 'ex1'
-    amqp_task, receiver = create_amqp_receiver_thread(exchange, topic_name1)
-    amqp_task.start()
-    # create random port for the http server
-    http_port = random.randint(10000, 20000)
-    # start an http server in a separate thread
-    http_server = StreamingHTTPServer(hostname, http_port)
-
-    topic_conf1 = PSTopic(ps_zone.conn, topic_name1,
-                          endpoint='amqp://' + hostname,
-                          endpoint_args='amqp-exchange=' + exchange + '&amqp-ack-level=none')
-    result, status = topic_conf1.set_config()
-    parsed_result = json.loads(result)
-    topic_arn1 = parsed_result['arn']
-    assert_equal(status/100, 2)
-    topic_conf2 = PSTopic(ps_zone.conn, topic_name2,
-                          endpoint='http://'+hostname+':'+str(http_port))
-    result, status = topic_conf2.set_config()
-    parsed_result = json.loads(result)
-    topic_arn2 = parsed_result['arn']
-    assert_equal(status/100, 2)
-
-    # create bucket on the first of the rados zones
-    bucket = master_zone.create_bucket(bucket_name)
-    # wait for sync
-    zone_meta_checkpoint(ps_zone.zone)
-    # create s3 notification
-    notification_name1 = bucket_name + NOTIFICATION_SUFFIX + '_1'
-    notification_name2 = bucket_name + NOTIFICATION_SUFFIX + '_2'
-    topic_conf_list = [
-        {
-            'Id': notification_name1,
-            'TopicArn': topic_arn1,
-            'Events': ['s3:ObjectCreated:*']
-        },
-        {
-            'Id': notification_name2,
-            'TopicArn': topic_arn2,
-            'Events': ['s3:ObjectCreated:*']
-        }]
-    s3_notification_conf = PSNotificationS3(ps_zone.conn, bucket_name, topic_conf_list)
-    _, status = s3_notification_conf.set_config()
-    assert_equal(status/100, 2)
-    result, _ = s3_notification_conf.get_config()
-    assert_equal(len(result['TopicConfigurations']), 2)
-    assert_equal(result['TopicConfigurations'][0]['Id'], notification_name1)
-    assert_equal(result['TopicConfigurations'][1]['Id'], notification_name2)
-
-    # get auto-generated subscriptions
-    sub_conf1 = PSSubscription(ps_zone.conn, notification_name1,
-                               topic_name1)
-    _, status = sub_conf1.get_config()
-    assert_equal(status/100, 2)
-    sub_conf2 = PSSubscription(ps_zone.conn, notification_name2,
-                               topic_name2)
-    _, status = sub_conf2.get_config()
-    assert_equal(status/100, 2)
-
-    # create objects in the bucket
-    number_of_objects = 10
-    for i in range(number_of_objects):
-        key = bucket.new_key(str(i))
-        key.set_contents_from_string('bar')
-    # wait for sync
-    zone_bucket_checkpoint(ps_zone.zone, master_zone.zone, bucket_name)
-
-    # get the events from both of the subscription
-    result, _ = sub_conf1.get_events()
-    records = json.loads(result)
-    for record in records['Records']:
-        log.debug(record)
-    keys = list(bucket.list())
-    # TODO: use exact match
-    verify_s3_records_by_elements(records, keys, exact_match=False)
-    receiver.verify_s3_events(keys, exact_match=False)
-
-    result, _ = sub_conf2.get_events()
-    parsed_result = json.loads(result)
-    for record in parsed_result['Records']:
-        log.debug(record)
-    keys = list(bucket.list())
-    # TODO: use exact match
-    verify_s3_records_by_elements(records, keys, exact_match=False)
-    http_server.verify_s3_events(keys, exact_match=False)
-
-    # cleanup
-    stop_amqp_receiver(receiver, amqp_task)
-    s3_notification_conf.del_config()
-    topic_conf1.del_config()
-    topic_conf2.del_config()
-    # delete objects from the bucket
-    for key in bucket.list():
-        key.delete()
-    master_zone.delete_bucket(bucket_name)
-    http_server.close()
-    clean_rabbitmq(rabbit_proc)
index 322a19e6d1807a9559c5d7c332e1eefac585e811..ea1b49e1e563c9f7ee42d10be029ec138c005209 100644 (file)
@@ -298,6 +298,9 @@ class CloudZone(Zone):
 
             return True
 
 
             return True
 
+        def create_role(self, path, rolename, policy_document, tag_list):
+            assert False
+
     def get_conn(self, credentials):
         return self.Conn(self, credentials)
 
     def get_conn(self, credentials):
         return self.Conn(self, credentials)
 
index 204b9e47f2e3ee8dfcbe35d41c854d1d13b233c0..5ec20871ad5c3e51a5ab2e19c19eb7997e1e74b1 100644 (file)
@@ -240,6 +240,9 @@ class ESZone(Zone):
 
             return True
 
 
             return True
 
+        def create_role(self, path, rolename, policy_document, tag_list):
+            assert False
+
     def get_conn(self, credentials):
         return self.Conn(self, credentials)
 
     def get_conn(self, credentials):
         return self.Conn(self, credentials)
 
diff --git a/ceph/src/test/rgw/rgw_multi/zone_ps.py b/ceph/src/test/rgw/rgw_multi/zone_ps.py
deleted file mode 100644 (file)
index daee7a2..0000000
+++ /dev/null
@@ -1,390 +0,0 @@
-import logging
-import ssl
-import urllib
-import hmac
-import hashlib
-import base64
-import xmltodict
-from http import client as http_client
-from urllib import parse as urlparse
-from time import gmtime, strftime
-from .multisite import Zone
-import boto3
-from botocore.client import Config
-
-log = logging.getLogger('rgw_multi.tests')
-
-
-def get_object_tagging(conn, bucket, object_key):
-    client = boto3.client('s3',
-            endpoint_url='http://'+conn.host+':'+str(conn.port),
-            aws_access_key_id=conn.aws_access_key_id,
-            aws_secret_access_key=conn.aws_secret_access_key,
-            config=Config(signature_version='s3'))
-    return client.get_object_tagging(
-                Bucket=bucket, 
-                Key=object_key
-            )
-
-
-class PSZone(Zone):  # pylint: disable=too-many-ancestors
-    """ PubSub zone class """
-    def __init__(self, name, zonegroup=None, cluster=None, data=None, zone_id=None, gateways=None, full_sync='false', retention_days ='7'):
-        self.full_sync = full_sync
-        self.retention_days = retention_days
-        self.master_zone = zonegroup.master_zone
-        super(PSZone, self).__init__(name, zonegroup, cluster, data, zone_id, gateways)
-
-    def is_read_only(self):
-        return True
-
-    def tier_type(self):
-        return "pubsub"
-
-    def syncs_from(self, zone_name):
-        return zone_name == self.master_zone.name
-
-    def create(self, cluster, args=None, **kwargs):
-        if args is None:
-            args = ''
-        tier_config = ','.join(['start_with_full_sync=' + self.full_sync, 'event_retention_days=' + self.retention_days])
-        args += ['--tier-type', self.tier_type(), '--sync-from-all=0', '--sync-from', self.master_zone.name, '--tier-config', tier_config] 
-        return self.json_command(cluster, 'create', args)
-
-    def has_buckets(self):
-        return False
-
-
-NO_HTTP_BODY = ''
-
-
-def make_request(conn, method, resource, parameters=None, sign_parameters=False, extra_parameters=None):
-    """generic request sending to pubsub radogw
-    should cover: topics, notificatios and subscriptions
-    """
-    url_params = ''
-    if parameters is not None:
-        url_params = urlparse.urlencode(parameters)
-        # remove 'None' from keys with no values
-        url_params = url_params.replace('=None', '')
-        url_params = '?' + url_params
-    if extra_parameters is not None:
-        url_params = url_params + '&' + extra_parameters
-    string_date = strftime("%a, %d %b %Y %H:%M:%S +0000", gmtime())
-    string_to_sign = method + '\n\n\n' + string_date + '\n' + resource
-    if sign_parameters:
-        string_to_sign += url_params
-    signature = base64.b64encode(hmac.new(conn.aws_secret_access_key.encode('utf-8'),
-                                          string_to_sign.encode('utf-8'),
-                                          hashlib.sha1).digest()).decode('ascii')
-    headers = {'Authorization': 'AWS '+conn.aws_access_key_id+':'+signature,
-               'Date': string_date,
-               'Host': conn.host+':'+str(conn.port)}
-    http_conn = http_client.HTTPConnection(conn.host, conn.port)
-    if log.getEffectiveLevel() <= 10:
-        http_conn.set_debuglevel(5)
-    http_conn.request(method, resource+url_params, NO_HTTP_BODY, headers)
-    response = http_conn.getresponse()
-    data = response.read()
-    status = response.status
-    http_conn.close()
-    return data.decode('utf-8'), status
-
-
-def print_connection_info(conn):
-    """print info of connection"""
-    print("Host: " + conn.host+':'+str(conn.port))
-    print("AWS Secret Key: " + conn.aws_secret_access_key)
-    print("AWS Access Key: " + conn.aws_access_key_id)
-
-
-class PSTopic:
-    """class to set/get/delete a topic
-    PUT /topics/<topic name>[?push-endpoint=<endpoint>&[<arg1>=<value1>...]]
-    GET /topics/<topic name>
-    DELETE /topics/<topic name>
-    """
-    def __init__(self, conn, topic_name, endpoint=None, endpoint_args=None):
-        self.conn = conn
-        assert topic_name.strip()
-        self.resource = '/topics/'+topic_name
-        if endpoint is not None:
-            self.parameters = {'push-endpoint': endpoint}
-            self.extra_parameters = endpoint_args
-        else:
-            self.parameters = None
-            self.extra_parameters = None
-
-    def send_request(self, method, get_list=False, parameters=None, extra_parameters=None):
-        """send request to radosgw"""
-        if get_list:
-            return make_request(self.conn, method, '/topics')
-        return make_request(self.conn, method, self.resource, 
-                            parameters=parameters, extra_parameters=extra_parameters)
-
-    def get_config(self):
-        """get topic info"""
-        return self.send_request('GET')
-
-    def set_config(self):
-        """set topic"""
-        return self.send_request('PUT', parameters=self.parameters, extra_parameters=self.extra_parameters)
-
-    def del_config(self):
-        """delete topic"""
-        return self.send_request('DELETE')
-    
-    def get_list(self):
-        """list all topics"""
-        return self.send_request('GET', get_list=True)
-
-
-class PSTopicS3:
-    """class to set/list/get/delete a topic
-    POST ?Action=CreateTopic&Name=<topic name>[&OpaqueData=<data>[&push-endpoint=<endpoint>&[<arg1>=<value1>...]]]
-    POST ?Action=ListTopics
-    POST ?Action=GetTopic&TopicArn=<topic-arn>
-    POST ?Action=GetTopicAttributes&TopicArn=<topic-arn>
-    POST ?Action=DeleteTopic&TopicArn=<topic-arn>
-    """
-    def __init__(self, conn, topic_name, region, endpoint_args=None, opaque_data=None):
-        self.conn = conn
-        self.topic_name = topic_name.strip()
-        assert self.topic_name
-        self.topic_arn = ''
-        self.attributes = {}
-        if endpoint_args is not None:
-            self.attributes = {nvp[0] : nvp[1] for nvp in urlparse.parse_qsl(endpoint_args, keep_blank_values=True)}
-        if opaque_data is not None:
-            self.attributes['OpaqueData'] = opaque_data
-        protocol = 'https' if conn.is_secure else 'http'
-        self.client = boto3.client('sns',
-                           endpoint_url=protocol+'://'+conn.host+':'+str(conn.port),
-                           aws_access_key_id=conn.aws_access_key_id,
-                           aws_secret_access_key=conn.aws_secret_access_key,
-                           region_name=region,
-                           verify='./cert.pem',
-                           config=Config(signature_version='s3'))
-
-
-    def get_config(self):
-        """get topic info"""
-        parameters = {'Action': 'GetTopic', 'TopicArn': self.topic_arn}
-        body = urlparse.urlencode(parameters)
-        string_date = strftime("%a, %d %b %Y %H:%M:%S +0000", gmtime())
-        content_type = 'application/x-www-form-urlencoded; charset=utf-8'
-        resource = '/'
-        method = 'POST'
-        string_to_sign = method + '\n\n' + content_type + '\n' + string_date + '\n' + resource
-        log.debug('StringTosign: %s', string_to_sign) 
-        signature = base64.b64encode(hmac.new(self.conn.aws_secret_access_key.encode('utf-8'),
-                                     string_to_sign.encode('utf-8'),
-                                     hashlib.sha1).digest()).decode('ascii')
-        headers = {'Authorization': 'AWS '+self.conn.aws_access_key_id+':'+signature,
-                   'Date': string_date,
-                   'Host': self.conn.host+':'+str(self.conn.port),
-                   'Content-Type': content_type}
-        if self.conn.is_secure:
-            http_conn = http_client.HTTPSConnection(self.conn.host, self.conn.port,
-                    context=ssl.create_default_context(cafile='./cert.pem'))
-        else:
-            http_conn = http_client.HTTPConnection(self.conn.host, self.conn.port)
-        http_conn.request(method, resource, body, headers)
-        response = http_conn.getresponse()
-        data = response.read()
-        status = response.status
-        http_conn.close()
-        dict_response = xmltodict.parse(data)
-        return dict_response, status
-
-    def get_attributes(self):
-        """get topic attributes"""
-        return self.client.get_topic_attributes(TopicArn=self.topic_arn)
-
-    def set_config(self):
-        """set topic"""
-        result = self.client.create_topic(Name=self.topic_name, Attributes=self.attributes)
-        self.topic_arn = result['TopicArn']
-        return self.topic_arn
-
-    def del_config(self):
-        """delete topic"""
-        result = self.client.delete_topic(TopicArn=self.topic_arn)
-        return result['ResponseMetadata']['HTTPStatusCode']
-    
-    def get_list(self):
-        """list all topics"""
-        # note that boto3 supports list_topics(), however, the result only show ARNs
-        parameters = {'Action': 'ListTopics'}
-        body = urlparse.urlencode(parameters)
-        string_date = strftime("%a, %d %b %Y %H:%M:%S +0000", gmtime())
-        content_type = 'application/x-www-form-urlencoded; charset=utf-8'
-        resource = '/'
-        method = 'POST'
-        string_to_sign = method + '\n\n' + content_type + '\n' + string_date + '\n' + resource
-        log.debug('StringTosign: %s', string_to_sign) 
-        signature = base64.b64encode(hmac.new(self.conn.aws_secret_access_key.encode('utf-8'),
-                                     string_to_sign.encode('utf-8'),
-                                     hashlib.sha1).digest()).decode('ascii')
-        headers = {'Authorization': 'AWS '+self.conn.aws_access_key_id+':'+signature,
-                   'Date': string_date,
-                   'Host': self.conn.host+':'+str(self.conn.port),
-                   'Content-Type': content_type}
-        if self.conn.is_secure:
-            http_conn = http_client.HTTPSConnection(self.conn.host, self.conn.port,
-                    context=ssl.create_default_context(cafile='./cert.pem'))
-        else:
-            http_conn = http_client.HTTPConnection(self.conn.host, self.conn.port)
-        http_conn.request(method, resource, body, headers)
-        response = http_conn.getresponse()
-        data = response.read()
-        status = response.status
-        http_conn.close()
-        dict_response = xmltodict.parse(data)
-        return dict_response, status
-
-
-class PSNotification:
-    """class to set/get/delete a notification
-    PUT /notifications/bucket/<bucket>?topic=<topic-name>[&events=<event>[,<event>]]
-    GET /notifications/bucket/<bucket>
-    DELETE /notifications/bucket/<bucket>?topic=<topic-name>
-    """
-    def __init__(self, conn, bucket_name, topic_name, events=''):
-        self.conn = conn
-        assert bucket_name.strip()
-        assert topic_name.strip()
-        self.resource = '/notifications/bucket/'+bucket_name
-        if events.strip():
-            self.parameters = {'topic': topic_name, 'events': events}
-        else:
-            self.parameters = {'topic': topic_name}
-
-    def send_request(self, method, parameters=None):
-        """send request to radosgw"""
-        return make_request(self.conn, method, self.resource, parameters)
-
-    def get_config(self):
-        """get notification info"""
-        return self.send_request('GET')
-
-    def set_config(self):
-        """set notification"""
-        return self.send_request('PUT', self.parameters)
-
-    def del_config(self):
-        """delete notification"""
-        return self.send_request('DELETE', self.parameters)
-
-
-class PSNotificationS3:
-    """class to set/get/delete an S3 notification
-    PUT /<bucket>?notification
-    GET /<bucket>?notification[=<notification>]
-    DELETE /<bucket>?notification[=<notification>]
-    """
-    def __init__(self, conn, bucket_name, topic_conf_list):
-        self.conn = conn
-        assert bucket_name.strip()
-        self.bucket_name = bucket_name
-        self.resource = '/'+bucket_name
-        self.topic_conf_list = topic_conf_list
-        self.client = boto3.client('s3',
-                                   endpoint_url='http://'+conn.host+':'+str(conn.port),
-                                   aws_access_key_id=conn.aws_access_key_id,
-                                   aws_secret_access_key=conn.aws_secret_access_key,
-                                   config=Config(signature_version='s3'))
-
-    def send_request(self, method, parameters=None):
-        """send request to radosgw"""
-        return make_request(self.conn, method, self.resource,
-                            parameters=parameters, sign_parameters=True)
-
-    def get_config(self, notification=None):
-        """get notification info"""
-        parameters = None
-        if notification is None:
-            response = self.client.get_bucket_notification_configuration(Bucket=self.bucket_name)
-            status = response['ResponseMetadata']['HTTPStatusCode']
-            return response, status
-        parameters = {'notification': notification}
-        response, status = self.send_request('GET', parameters=parameters)
-        dict_response = xmltodict.parse(response)
-        return dict_response, status
-
-    def set_config(self):
-        """set notification"""
-        response = self.client.put_bucket_notification_configuration(Bucket=self.bucket_name,
-                                                                     NotificationConfiguration={
-                                                                         'TopicConfigurations': self.topic_conf_list
-                                                                     })
-        status = response['ResponseMetadata']['HTTPStatusCode']
-        return response, status
-
-    def del_config(self, notification=None):
-        """delete notification"""
-        parameters = {'notification': notification}
-
-        return self.send_request('DELETE', parameters)
-
-
-class PSSubscription:
-    """class to set/get/delete a subscription:
-    PUT /subscriptions/<sub-name>?topic=<topic-name>[&push-endpoint=<endpoint>&[<arg1>=<value1>...]]
-    GET /subscriptions/<sub-name>
-    DELETE /subscriptions/<sub-name>
-    also to get list of events, and ack them:
-    GET /subscriptions/<sub-name>?events[&max-entries=<max-entries>][&marker=<marker>]
-    POST /subscriptions/<sub-name>?ack&event-id=<event-id>
-    """
-    def __init__(self, conn, sub_name, topic_name, endpoint=None, endpoint_args=None):
-        self.conn = conn
-        assert topic_name.strip()
-        self.resource = '/subscriptions/'+sub_name
-        if endpoint is not None:
-            self.parameters = {'topic': topic_name, 'push-endpoint': endpoint}
-            self.extra_parameters = endpoint_args
-        else:
-            self.parameters = {'topic': topic_name}
-            self.extra_parameters = None
-
-    def send_request(self, method, parameters=None, extra_parameters=None):
-        """send request to radosgw"""
-        return make_request(self.conn, method, self.resource, 
-                            parameters=parameters,
-                            extra_parameters=extra_parameters)
-
-    def get_config(self):
-        """get subscription info"""
-        return self.send_request('GET')
-
-    def set_config(self):
-        """set subscription"""
-        return self.send_request('PUT', parameters=self.parameters, extra_parameters=self.extra_parameters)
-
-    def del_config(self, topic=False):
-        """delete subscription"""
-        if topic:
-            return self.send_request('DELETE', self.parameters)
-        return self.send_request('DELETE')
-
-    def get_events(self, max_entries=None, marker=None):
-        """ get events from subscription """
-        parameters = {'events': None}
-        if max_entries is not None:
-            parameters['max-entries'] = max_entries
-        if marker is not None:
-            parameters['marker'] = marker
-        return self.send_request('GET', parameters)
-
-    def ack_events(self, event_id):
-        """ ack events in a subscription """
-        parameters = {'ack': None, 'event-id': event_id}
-        return self.send_request('POST', parameters)
-
-
-class PSZoneConfig:
-    """ pubsub zone configuration """
-    def __init__(self, cfg, section):
-        self.full_sync = cfg.get(section, 'start_with_full_sync')
-        self.retention_days = cfg.get(section, 'retention_days')
index 984b0c2ffca06d06bc34325343f8423412d4a691..ac4edd004d6e131158650f15816ef4a64870861e 100644 (file)
@@ -104,6 +104,31 @@ class RadosZone(Zone):
 
             return True
 
 
             return True
 
+        def get_role(self, role_name):
+            return self.iam_conn.get_role(role_name)
+
+        def check_role_eq(self, zone_conn, role_name):
+            log.info('comparing role=%s zones={%s, %s}', role_name, self.name, zone_conn.name)
+            r1 = self.get_role(role_name)
+            r2 = zone_conn.get_role(role_name)
+
+            assert r1
+            assert r2
+            log.debug('comparing role name=%s', r1['get_role_response']['get_role_result']['role']['role_name'])
+            eq(r1['get_role_response']['get_role_result']['role']['role_name'], r2['get_role_response']['get_role_result']['role']['role_name'])
+            eq(r1['get_role_response']['get_role_result']['role']['role_id'], r2['get_role_response']['get_role_result']['role']['role_id'])
+            eq(r1['get_role_response']['get_role_result']['role']['path'], r2['get_role_response']['get_role_result']['role']['path'])
+            eq(r1['get_role_response']['get_role_result']['role']['arn'], r2['get_role_response']['get_role_result']['role']['arn'])
+            eq(r1['get_role_response']['get_role_result']['role']['max_session_duration'], r2['get_role_response']['get_role_result']['role']['max_session_duration'])
+            eq(r1['get_role_response']['get_role_result']['role']['assume_role_policy_document'], r2['get_role_response']['get_role_result']['role']['assume_role_policy_document'])
+
+            log.info('success, role identical: role=%s zones={%s, %s}', role_name, self.name, zone_conn.name)
+
+            return True
+
+        def create_role(self, path, rolename, policy_document, tag_list):
+            return self.iam_conn.create_role(rolename, policy_document, path)
+
     def get_conn(self, credentials):
         return self.Conn(self, credentials)
 
     def get_conn(self, credentials):
         return self.Conn(self, credentials)
 
index e4c4375c4de337d3ea497037722616d25c9cbc47..ec5b35bda0900dcfe9639d4b181a70f661979cab 100644 (file)
@@ -784,7 +784,6 @@ TEST_F(AioLegacyFIFO, TestMultipleParts)
   {
     auto c = R::Rados::aio_create_completion();
     f->get_head_info(&dp, [&](int r, RCf::part_info&& p) {
   {
     auto c = R::Rados::aio_create_completion();
     f->get_head_info(&dp, [&](int r, RCf::part_info&& p) {
-      ASSERT_TRUE(p.tag.empty());
       ASSERT_EQ(0, p.magic);
       ASSERT_EQ(0, p.min_ofs);
       ASSERT_EQ(0, p.last_ofs);
       ASSERT_EQ(0, p.magic);
       ASSERT_EQ(0, p.min_ofs);
       ASSERT_EQ(0, p.last_ofs);
index 6acba7d7323b4e0f4c820ee0ccc2206021758bb0..f2c1285300ec15cb433882b401f09c45b06c8926 100644 (file)
@@ -31,7 +31,6 @@ The configuration file for the run has 3 sections:
 This section holds the following parameters:
  - `num_zonegroups`: number of zone groups (integer, default 1)
  - `num_zones`: number of regular zones in each group (integer, default 3)
 This section holds the following parameters:
  - `num_zonegroups`: number of zone groups (integer, default 1)
  - `num_zones`: number of regular zones in each group (integer, default 3)
- - `num_ps_zones`: number of pubsub zones in each group (integer, default 0)         
  - `num_az_zones`: number of archive zones (integer, default 0, max value 1)
  - `gateways_per_zone`: number of RADOS gateways per zone (integer, default 2)
  - `no_bootstrap`: whether to assume that the cluster is already up and does not need to be setup again. If set to "false", it will try to re-run the cluster, so, `mstop.sh` must be called beforehand. Should be set to false, anytime the configuration is changed. Otherwise, and assuming the cluster is already up, it should be set to "true" to save on execution time (boolean, default false)
  - `num_az_zones`: number of archive zones (integer, default 0, max value 1)
  - `gateways_per_zone`: number of RADOS gateways per zone (integer, default 2)
  - `no_bootstrap`: whether to assume that the cluster is already up and does not need to be setup again. If set to "false", it will try to re-run the cluster, so, `mstop.sh` must be called beforehand. Should be set to false, anytime the configuration is changed. Otherwise, and assuming the cluster is already up, it should be set to "true" to save on execution time (boolean, default false)
@@ -51,8 +50,6 @@ This section holds the following parameters:
 *TODO*
 ### Cloud
 *TODO*
 *TODO*
 ### Cloud
 *TODO*
-### PubSub
-*TODO*
 ## Writing Tests
 New tests should be added into the `/path/to/ceph/src/test/rgw/rgw_multi` subdirectory.
 - Base classes are in: `/path/to/ceph/src/test/rgw/rgw_multi/multisite.py`
 ## Writing Tests
 New tests should be added into the `/path/to/ceph/src/test/rgw/rgw_multi` subdirectory.
 - Base classes are in: `/path/to/ceph/src/test/rgw/rgw_multi/multisite.py`
index e32d00f0da31740cbeb584388c791ed4f803b5eb..57d27343efc335219d54533a83e5314e88b69d12 100644 (file)
@@ -18,15 +18,12 @@ from rgw_multi.zone_es import ESZone as ESZone
 from rgw_multi.zone_es import ESZoneConfig as ESZoneConfig
 from rgw_multi.zone_cloud import CloudZone as CloudZone
 from rgw_multi.zone_cloud import CloudZoneConfig as CloudZoneConfig
 from rgw_multi.zone_es import ESZoneConfig as ESZoneConfig
 from rgw_multi.zone_cloud import CloudZone as CloudZone
 from rgw_multi.zone_cloud import CloudZoneConfig as CloudZoneConfig
-from rgw_multi.zone_ps import PSZone as PSZone
-from rgw_multi.zone_ps import PSZoneConfig as PSZoneConfig
 from rgw_multi.zone_az import AZone as AZone
 from rgw_multi.zone_az import AZoneConfig as AZoneConfig
 
 # make tests from rgw_multi.tests available to nose
 from rgw_multi.tests import *
 from rgw_multi.tests_es import *
 from rgw_multi.zone_az import AZone as AZone
 from rgw_multi.zone_az import AZoneConfig as AZoneConfig
 
 # make tests from rgw_multi.tests available to nose
 from rgw_multi.tests import *
 from rgw_multi.tests_es import *
-from rgw_multi.tests_ps import *
 from rgw_multi.tests_az import *
 
 mstart_path = os.getenv('MSTART_PATH')
 from rgw_multi.tests_az import *
 
 mstart_path = os.getenv('MSTART_PATH')
@@ -172,7 +169,6 @@ def init(parse_args):
     cfg = configparser.RawConfigParser({
                                          'num_zonegroups': 1,
                                          'num_zones': 3,
     cfg = configparser.RawConfigParser({
                                          'num_zonegroups': 1,
                                          'num_zones': 3,
-                                         'num_ps_zones': 0,
                                          'num_az_zones': 0,
                                          'gateways_per_zone': 2,
                                          'no_bootstrap': 'false',
                                          'num_az_zones': 0,
                                          'gateways_per_zone': 2,
                                          'no_bootstrap': 'false',
@@ -213,13 +209,11 @@ def init(parse_args):
     parser.add_argument('--checkpoint-retries', type=int, default=cfg.getint(section, 'checkpoint_retries'))
     parser.add_argument('--checkpoint-delay', type=int, default=cfg.getint(section, 'checkpoint_delay'))
     parser.add_argument('--reconfigure-delay', type=int, default=cfg.getint(section, 'reconfigure_delay'))
     parser.add_argument('--checkpoint-retries', type=int, default=cfg.getint(section, 'checkpoint_retries'))
     parser.add_argument('--checkpoint-delay', type=int, default=cfg.getint(section, 'checkpoint_delay'))
     parser.add_argument('--reconfigure-delay', type=int, default=cfg.getint(section, 'reconfigure_delay'))
-    parser.add_argument('--num-ps-zones', type=int, default=cfg.getint(section, 'num_ps_zones'))
     parser.add_argument('--use-ssl', type=bool, default=cfg.getboolean(section, 'use_ssl'))
 
 
     es_cfg = []
     cloud_cfg = []
     parser.add_argument('--use-ssl', type=bool, default=cfg.getboolean(section, 'use_ssl'))
 
 
     es_cfg = []
     cloud_cfg = []
-    ps_cfg = []
     az_cfg = []
 
     for s in cfg.sections():
     az_cfg = []
 
     for s in cfg.sections():
@@ -227,8 +221,6 @@ def init(parse_args):
             es_cfg.append(ESZoneConfig(cfg, s))
         elif s.startswith('cloud'):
             cloud_cfg.append(CloudZoneConfig(cfg, s))
             es_cfg.append(ESZoneConfig(cfg, s))
         elif s.startswith('cloud'):
             cloud_cfg.append(CloudZoneConfig(cfg, s))
-        elif s.startswith('pubsub'):
-            ps_cfg.append(PSZoneConfig(cfg, s))
         elif s.startswith('archive'):
             az_cfg.append(AZoneConfig(cfg, s))
 
         elif s.startswith('archive'):
             az_cfg.append(AZoneConfig(cfg, s))
 
@@ -267,12 +259,9 @@ def init(parse_args):
 
     num_es_zones = len(es_cfg)
     num_cloud_zones = len(cloud_cfg)
 
     num_es_zones = len(es_cfg)
     num_cloud_zones = len(cloud_cfg)
-    num_ps_zones_from_conf = len(ps_cfg)
     num_az_zones = cfg.getint(section, 'num_az_zones')
 
     num_az_zones = cfg.getint(section, 'num_az_zones')
 
-    num_ps_zones = args.num_ps_zones if num_ps_zones_from_conf == 0 else num_ps_zones_from_conf 
-
-    num_zones = args.num_zones + num_es_zones + num_cloud_zones + num_ps_zones + num_az_zones
+    num_zones = args.num_zones + num_es_zones + num_cloud_zones + num_az_zones
 
     use_ssl = cfg.getboolean(section, 'use_ssl')
 
 
     use_ssl = cfg.getboolean(section, 'use_ssl')
 
@@ -333,8 +322,7 @@ def init(parse_args):
 
             es_zone = (z >= args.num_zones and z < args.num_zones + num_es_zones)
             cloud_zone = (z >= args.num_zones + num_es_zones and z < args.num_zones + num_es_zones + num_cloud_zones)
 
             es_zone = (z >= args.num_zones and z < args.num_zones + num_es_zones)
             cloud_zone = (z >= args.num_zones + num_es_zones and z < args.num_zones + num_es_zones + num_cloud_zones)
-            ps_zone = (z >= args.num_zones + num_es_zones + num_cloud_zones and z < args.num_zones + num_es_zones + num_cloud_zones + num_ps_zones)
-            az_zone = (z >= args.num_zones + num_es_zones + num_cloud_zones + num_ps_zones)
+            az_zone = (z >= args.num_zones + num_es_zones + num_cloud_zones)
 
             # create the zone in its zonegroup
             zone = multisite.Zone(zone_name(zg, z), zonegroup, cluster)
 
             # create the zone in its zonegroup
             zone = multisite.Zone(zone_name(zg, z), zonegroup, cluster)
@@ -346,16 +334,8 @@ def init(parse_args):
                 ccfg = cloud_cfg[zone_index]
                 zone = CloudZone(zone_name(zg, z), ccfg.endpoint, ccfg.credentials, ccfg.source_bucket,
                                  ccfg.target_path, zonegroup, cluster)
                 ccfg = cloud_cfg[zone_index]
                 zone = CloudZone(zone_name(zg, z), ccfg.endpoint, ccfg.credentials, ccfg.source_bucket,
                                  ccfg.target_path, zonegroup, cluster)
-            elif ps_zone:
-                zone_index = z - args.num_zones - num_es_zones - num_cloud_zones
-                if num_ps_zones_from_conf == 0:
-                    zone = PSZone(zone_name(zg, z), zonegroup, cluster)
-                else:
-                    pscfg = ps_cfg[zone_index]
-                    zone = PSZone(zone_name(zg, z), zonegroup, cluster,
-                                  full_sync=pscfg.full_sync, retention_days=pscfg.retention_days)
             elif az_zone:
             elif az_zone:
-                zone_index = z - args.num_zones - num_es_zones - num_cloud_zones - num_ps_zones
+                zone_index = z - args.num_zones - num_es_zones - num_cloud_zones
                 zone = AZone(zone_name(zg, z), zonegroup, cluster)
             else:
                 zone = RadosZone(zone_name(zg, z), zonegroup, cluster)
                 zone = AZone(zone_name(zg, z), zonegroup, cluster)
             else:
                 zone = RadosZone(zone_name(zg, z), zonegroup, cluster)
@@ -402,7 +382,7 @@ def init(parse_args):
                     arg += admin_creds.credential_args()
                     admin_user.create(zone, arg)
                     # create test user
                     arg += admin_creds.credential_args()
                     admin_user.create(zone, arg)
                     # create test user
-                    arg = ['--display-name', '"Test User"']
+                    arg = ['--display-name', '"Test User"', '--caps', 'roles=*']
                     arg += user_creds.credential_args()
                     user.create(zone, arg)
                 else:
                     arg += user_creds.credential_args()
                     user.create(zone, arg)
                 else:
index 501144d5a34d25159dbacf00326de93e62ae1277..0b5d1a72f6cd810911daf39eb3b20d9876a19432 100644 (file)
@@ -164,7 +164,7 @@ TEST(TestRGWLua, EmptyScript)
   uint64_t id = 0;
   req_state s(cct, &e, id); 
 
   uint64_t id = 0;
   req_state s(cct, &e, id); 
 
-  const auto rc = lua::request::execute(nullptr, nullptr, nullptr, &s, "", script);
+  const auto rc = lua::request::execute(nullptr, nullptr, nullptr, &s, nullptr, script);
   ASSERT_EQ(rc, 0);
 }
 
   ASSERT_EQ(rc, 0);
 }
 
@@ -179,7 +179,7 @@ TEST(TestRGWLua, SyntaxError)
 
   DEFINE_REQ_STATE;
 
 
   DEFINE_REQ_STATE;
 
-  const auto rc = lua::request::execute(nullptr, nullptr, nullptr, &s, "", script);
+  const auto rc = lua::request::execute(nullptr, nullptr, nullptr, &s, nullptr, script);
   ASSERT_EQ(rc, -1);
 }
 
   ASSERT_EQ(rc, -1);
 }
 
@@ -191,7 +191,7 @@ TEST(TestRGWLua, Hello)
 
   DEFINE_REQ_STATE;
 
 
   DEFINE_REQ_STATE;
 
-  const auto rc = lua::request::execute(nullptr, nullptr, nullptr, &s, "", script);
+  const auto rc = lua::request::execute(nullptr, nullptr, nullptr, &s, nullptr, script);
   ASSERT_EQ(rc, 0);
 }
 
   ASSERT_EQ(rc, 0);
 }
 
@@ -203,7 +203,7 @@ TEST(TestRGWLua, RGWDebugLogNumber)
 
   DEFINE_REQ_STATE;
 
 
   DEFINE_REQ_STATE;
 
-  const auto rc = lua::request::execute(nullptr, nullptr, nullptr, &s, "", script);
+  const auto rc = lua::request::execute(nullptr, nullptr, nullptr, &s, nullptr, script);
   ASSERT_EQ(rc, 0);
 }
 
   ASSERT_EQ(rc, 0);
 }
 
@@ -215,7 +215,7 @@ TEST(TestRGWLua, RGWDebugNil)
 
   DEFINE_REQ_STATE;
 
 
   DEFINE_REQ_STATE;
 
-  const auto rc = lua::request::execute(nullptr, nullptr, nullptr, &s, "", script);
+  const auto rc = lua::request::execute(nullptr, nullptr, nullptr, &s, nullptr, script);
   ASSERT_EQ(rc, -1);
 }
 
   ASSERT_EQ(rc, -1);
 }
 
@@ -229,7 +229,7 @@ TEST(TestRGWLua, URI)
   DEFINE_REQ_STATE;
   s.decoded_uri = "http://hello.world/";
 
   DEFINE_REQ_STATE;
   s.decoded_uri = "http://hello.world/";
 
-  const auto rc = lua::request::execute(nullptr, nullptr, nullptr, &s, "", script);
+  const auto rc = lua::request::execute(nullptr, nullptr, nullptr, &s, nullptr, script);
   ASSERT_EQ(rc, 0);
 }
 
   ASSERT_EQ(rc, 0);
 }
 
@@ -248,7 +248,7 @@ TEST(TestRGWLua, Response)
   s.err.err_code = "Bad Request";
   s.err.message = "This is a bad request";
 
   s.err.err_code = "Bad Request";
   s.err.message = "This is a bad request";
 
-  const auto rc = lua::request::execute(nullptr, nullptr, nullptr, &s, "put_obj", script);
+  const auto rc = lua::request::execute(nullptr, nullptr, nullptr, &s, nullptr, script);
   ASSERT_EQ(rc, 0);
 }
 
   ASSERT_EQ(rc, 0);
 }
 
@@ -263,7 +263,7 @@ TEST(TestRGWLua, SetResponse)
   DEFINE_REQ_STATE;
   s.err.message = "this is a bad request";
 
   DEFINE_REQ_STATE;
   s.err.message = "this is a bad request";
 
-  const auto rc = lua::request::execute(nullptr, nullptr, nullptr, &s, "put_obj", script);
+  const auto rc = lua::request::execute(nullptr, nullptr, nullptr, &s, nullptr, script);
   ASSERT_EQ(rc, 0);
 }
 
   ASSERT_EQ(rc, 0);
 }
 
@@ -277,7 +277,7 @@ TEST(TestRGWLua, SetRGWId)
   DEFINE_REQ_STATE;
   s.host_id = "foo";
 
   DEFINE_REQ_STATE;
   s.host_id = "foo";
 
-  const auto rc = lua::request::execute(nullptr, nullptr, nullptr, &s, "put_obj", script);
+  const auto rc = lua::request::execute(nullptr, nullptr, nullptr, &s, nullptr, script);
   ASSERT_NE(rc, 0);
 }
 
   ASSERT_NE(rc, 0);
 }
 
@@ -290,7 +290,7 @@ TEST(TestRGWLua, InvalidField)
   DEFINE_REQ_STATE;
   s.host_id = "foo";
 
   DEFINE_REQ_STATE;
   s.host_id = "foo";
 
-  const auto rc = lua::request::execute(nullptr, nullptr, nullptr, &s, "kaboom", script);
+  const auto rc = lua::request::execute(nullptr, nullptr, nullptr, &s, nullptr, script);
   ASSERT_EQ(rc, -1);
 }
 
   ASSERT_EQ(rc, -1);
 }
 
@@ -302,7 +302,7 @@ TEST(TestRGWLua, InvalidSubField)
 
   DEFINE_REQ_STATE;
 
 
   DEFINE_REQ_STATE;
 
-  const auto rc = lua::request::execute(nullptr, nullptr, nullptr, &s, "kaboom", script);
+  const auto rc = lua::request::execute(nullptr, nullptr, nullptr, &s, nullptr, script);
   ASSERT_EQ(rc, -1);
 }
 
   ASSERT_EQ(rc, -1);
 }
 
@@ -336,7 +336,7 @@ TEST(TestRGWLua, Bucket)
   b.bucket_id = "myid"; 
   s.bucket.reset(new sal::RadosBucket(nullptr, b));
 
   b.bucket_id = "myid"; 
   s.bucket.reset(new sal::RadosBucket(nullptr, b));
 
-  const auto rc = lua::request::execute(nullptr, nullptr, nullptr, &s, "put_obj", script);
+  const auto rc = lua::request::execute(nullptr, nullptr, nullptr, &s, nullptr, script);
   ASSERT_EQ(rc, 0);
 }
 
   ASSERT_EQ(rc, 0);
 }
 
@@ -359,7 +359,7 @@ TEST(TestRGWLua, GenericAttributes)
   s.generic_attrs["goodbye"] = "cruel world";
   s.generic_attrs["ka"] = "boom";
 
   s.generic_attrs["goodbye"] = "cruel world";
   s.generic_attrs["ka"] = "boom";
 
-  const auto rc = lua::request::execute(nullptr, nullptr, nullptr, &s, "put_obj", script);
+  const auto rc = lua::request::execute(nullptr, nullptr, nullptr, &s, nullptr, script);
   ASSERT_EQ(rc, 0);
 }
 
   ASSERT_EQ(rc, 0);
 }
 
@@ -381,7 +381,7 @@ TEST(TestRGWLua, Environment)
   s.env.emplace("goodbye", "cruel world");
   s.env.emplace("ka", "boom");
 
   s.env.emplace("goodbye", "cruel world");
   s.env.emplace("ka", "boom");
 
-  const auto rc = lua::request::execute(nullptr, nullptr, nullptr, &s, "put_obj", script);
+  const auto rc = lua::request::execute(nullptr, nullptr, nullptr, &s, nullptr, script);
   ASSERT_EQ(rc, 0);
 }
 
   ASSERT_EQ(rc, 0);
 }
 
@@ -402,7 +402,7 @@ TEST(TestRGWLua, Tags)
   s.tagset.add_tag("goodbye", "cruel world");
   s.tagset.add_tag("ka", "boom");
 
   s.tagset.add_tag("goodbye", "cruel world");
   s.tagset.add_tag("ka", "boom");
 
-  const auto rc = lua::request::execute(nullptr, nullptr, nullptr, &s, "put_obj", script);
+  const auto rc = lua::request::execute(nullptr, nullptr, nullptr, &s, nullptr, script);
   ASSERT_EQ(rc, 0);
 }
 
   ASSERT_EQ(rc, 0);
 }
 
@@ -415,7 +415,7 @@ TEST(TestRGWLua, TagsNotWriteable)
   DEFINE_REQ_STATE;
   s.tagset.add_tag("hello", "world");
 
   DEFINE_REQ_STATE;
   s.tagset.add_tag("hello", "world");
 
-  const auto rc = lua::request::execute(nullptr, nullptr, nullptr, &s, "put_obj", script);
+  const auto rc = lua::request::execute(nullptr, nullptr, nullptr, &s, nullptr, script);
   ASSERT_NE(rc, 0);
 }
 
   ASSERT_NE(rc, 0);
 }
 
@@ -441,7 +441,7 @@ TEST(TestRGWLua, Metadata)
   s.info.x_meta_map["foo"] = "bar";
   s.info.x_meta_map["ka"] = "boom";
 
   s.info.x_meta_map["foo"] = "bar";
   s.info.x_meta_map["ka"] = "boom";
 
-  const auto rc = lua::request::execute(nullptr, nullptr, nullptr, &s, "put_obj", script);
+  const auto rc = lua::request::execute(nullptr, nullptr, nullptr, &s, nullptr, script);
   ASSERT_EQ(rc, 0);
 }
 
   ASSERT_EQ(rc, 0);
 }
 
@@ -492,7 +492,7 @@ TEST(TestRGWLua, Acl)
   s.user_acl->get_acl().add_grant(&grant3);
   s.user_acl->get_acl().add_grant(&grant4);
   s.user_acl->get_acl().add_grant(&grant5);
   s.user_acl->get_acl().add_grant(&grant3);
   s.user_acl->get_acl().add_grant(&grant4);
   s.user_acl->get_acl().add_grant(&grant5);
-  const auto rc = lua::request::execute(nullptr, nullptr, nullptr, &s, "put_obj", script);
+  const auto rc = lua::request::execute(nullptr, nullptr, nullptr, &s, nullptr, script);
   ASSERT_EQ(rc, 0);
 }
 
   ASSERT_EQ(rc, 0);
 }
 
@@ -511,7 +511,7 @@ TEST(TestRGWLua, User)
   u.id = "myid";
   s.user.reset(new sal::RadosUser(nullptr, u));
 
   u.id = "myid";
   s.user.reset(new sal::RadosUser(nullptr, u));
 
-  const auto rc = lua::request::execute(nullptr, nullptr, nullptr, &s, "put_obj", script);
+  const auto rc = lua::request::execute(nullptr, nullptr, nullptr, &s, nullptr, script);
   ASSERT_EQ(rc, 0);
 }
 
   ASSERT_EQ(rc, 0);
 }
 
@@ -556,7 +556,7 @@ TEST(TestRGWLua, UseFunction)
   s.object_acl->get_owner().set_name("user five");
   s.object_acl->get_owner().set_id(rgw_user("tenant5", "user5"));
 
   s.object_acl->get_owner().set_name("user five");
   s.object_acl->get_owner().set_id(rgw_user("tenant5", "user5"));
 
-  const auto rc = lua::request::execute(nullptr, nullptr, nullptr, &s, "put_obj", script);
+  const auto rc = lua::request::execute(nullptr, nullptr, nullptr, &s, nullptr, script);
   ASSERT_EQ(rc, 0);
 }
 
   ASSERT_EQ(rc, 0);
 }
 
@@ -577,7 +577,7 @@ TEST(TestRGWLua, WithLib)
   b.name = "my-bucket-name-is-fish";
   s.bucket.reset(new sal::RadosBucket(nullptr, b));
 
   b.name = "my-bucket-name-is-fish";
   s.bucket.reset(new sal::RadosBucket(nullptr, b));
 
-  const auto rc = lua::request::execute(nullptr, nullptr, nullptr, &s, "put_obj", script);
+  const auto rc = lua::request::execute(nullptr, nullptr, nullptr, &s, nullptr, script);
   ASSERT_EQ(rc, 0);
 }
 
   ASSERT_EQ(rc, 0);
 }
 
@@ -590,7 +590,7 @@ TEST(TestRGWLua, NotAllowedInLib)
 
   DEFINE_REQ_STATE;
 
 
   DEFINE_REQ_STATE;
 
-  const auto rc = lua::request::execute(nullptr, nullptr, nullptr, &s, "put_obj", script);
+  const auto rc = lua::request::execute(nullptr, nullptr, nullptr, &s, nullptr, script);
   ASSERT_NE(rc, 0);
 }
 #include <sys/socket.h>
   ASSERT_NE(rc, 0);
 }
 #include <sys/socket.h>
@@ -669,11 +669,11 @@ TEST(TestRGWLua, OpsLog)
   s.auth.identity = std::unique_ptr<rgw::auth::Identity>(
                         new FakeIdentity());
 
   s.auth.identity = std::unique_ptr<rgw::auth::Identity>(
                         new FakeIdentity());
 
-  auto rc = lua::request::execute(store.get(), nullptr, olog.get(), &s, "put_obj", script);
+  auto rc = lua::request::execute(store.get(), nullptr, olog.get(), &s, nullptr, script);
   EXPECT_EQ(rc, 0);
  
        s.err.http_ret = 400;
   EXPECT_EQ(rc, 0);
  
        s.err.http_ret = 400;
-  rc = lua::request::execute(store.get(), nullptr, olog.get(), &s, "put_obj", script);
+  rc = lua::request::execute(store.get(), nullptr, olog.get(), &s, nullptr, script);
   EXPECT_EQ(rc, 0);
 
        // give the socket client time to read
   EXPECT_EQ(rc, 0);
 
        // give the socket client time to read
index af767e01360f2192c6f817221ff7b65700872c35..799410f9bf586b19020a493cf3f9b3c7f5484825 100644 (file)
@@ -49,7 +49,9 @@ add_denc_mod(denc-mod-osd
 target_link_libraries(denc-mod-osd
   os
   osd
 target_link_libraries(denc-mod-osd
   os
   osd
-  mon)
+  mon
+  erasure_code
+  global)
 
 if(WITH_RADOSGW)
   add_denc_mod(denc-mod-rgw
 
 if(WITH_RADOSGW)
   add_denc_mod(denc-mod-rgw
index 363cc026403c52f7d7021bef49abf866abca18d3..6decae280354b76e9f314de44988fcb50cc18768 100644 (file)
@@ -951,6 +951,8 @@ int DataScan::scan_links()
     for (auto it = metadata_io.nobjects_begin(); it != it_end; ++it) {
       const std::string oid = it->get_oid();
 
     for (auto it = metadata_io.nobjects_begin(); it != it_end; ++it) {
       const std::string oid = it->get_oid();
 
+      dout(10) << "step " << step << ": handling object " << oid << dendl;
+
       uint64_t dir_ino = 0;
       uint64_t frag_id = 0;
       int r = parse_oid(oid, &dir_ino, &frag_id);
       uint64_t dir_ino = 0;
       uint64_t frag_id = 0;
       int r = parse_oid(oid, &dir_ino, &frag_id);
@@ -1119,7 +1121,13 @@ int DataScan::scan_links()
 
   used_inos.clear();
 
 
   used_inos.clear();
 
+  dout(10) << "processing " << dup_primaries.size() << " dup_primaries, "
+          << remote_links.size() << " remote_links" << dendl;
+
   for (auto& p : dup_primaries) {
   for (auto& p : dup_primaries) {
+
+    dout(10) << "handling dup " << p.first << dendl;
+
     link_info_t newest;
     for (auto& q : p.second) {
       if (q.version > newest.version) {
     link_info_t newest;
     for (auto& q : p.second) {
       if (q.version > newest.version) {
@@ -1181,9 +1189,14 @@ int DataScan::scan_links()
     }
   }
 
     }
   }
 
+  dout(10) << "removing dup dentries from " << to_remove.size() << " objects"
+          << dendl;
+
   for (auto& p : to_remove) {
     object_t frag_oid = InodeStore::get_object_name(p.first.ino, p.first.frag, "");
 
   for (auto& p : to_remove) {
     object_t frag_oid = InodeStore::get_object_name(p.first.ino, p.first.frag, "");
 
+    dout(10) << "removing dup dentries from " << p.first << dendl;
+
     int r = metadata_io.omap_rm_keys(frag_oid.name, p.second);
     if (r != 0) {
       derr << "Error removing duplicated dentries from " << p.first << dendl;
     int r = metadata_io.omap_rm_keys(frag_oid.name, p.second);
     if (r != 0) {
       derr << "Error removing duplicated dentries from " << p.first << dendl;
@@ -1192,7 +1205,12 @@ int DataScan::scan_links()
   }
   to_remove.clear();
 
   }
   to_remove.clear();
 
+  dout(10) << "processing " << bad_nlink_inos.size() << " bad_nlink_inos"
+          << dendl;
+
   for (auto &p : bad_nlink_inos) {
   for (auto &p : bad_nlink_inos) {
+    dout(10) << "handling bad_nlink_ino " << p.first << dendl;
+
     InodeStore inode;
     snapid_t first;
     int r = read_dentry(p.second.dirino, p.second.frag, p.second.name, &inode, &first);
     InodeStore inode;
     snapid_t first;
     int r = read_dentry(p.second.dirino, p.second.frag, p.second.name, &inode, &first);
@@ -1212,7 +1230,12 @@ int DataScan::scan_links()
       return r;
   }
 
       return r;
   }
 
+  dout(10) << "processing " << injected_inos.size() << " injected_inos"
+          << dendl;
+
   for (auto &p : injected_inos) {
   for (auto &p : injected_inos) {
+    dout(10) << "handling injected_ino " << p.first << dendl;
+
     InodeStore inode;
     snapid_t first;
     int r = read_dentry(p.second.dirino, p.second.frag, p.second.name, &inode, &first);
     InodeStore inode;
     snapid_t first;
     int r = read_dentry(p.second.dirino, p.second.frag, p.second.name, &inode, &first);
@@ -1232,6 +1255,8 @@ int DataScan::scan_links()
       return r;
   }
 
       return r;
   }
 
+  dout(10) << "updating inotable" << dendl;
+
   for (auto& p : max_ino_map) {
     InoTable inotable(nullptr);
     inotable.set_rank(p.first);
   for (auto& p : max_ino_map) {
     InoTable inotable(nullptr);
     inotable.set_rank(p.first);
@@ -1250,6 +1275,8 @@ int DataScan::scan_links()
     }
   }
 
     }
   }
 
+  dout(10) << "updating snaptable" << dendl;
+
   {
     SnapServer snaptable;
     snaptable.set_rank(0);
   {
     SnapServer snaptable;
     snaptable.set_rank(0);
index 4d359211f246f2f124970a9ceb840d354f072332..845ca447e30bc47477163026534d3e249808043e 100755 (executable)
@@ -8,11 +8,12 @@ import json
 import signal
 import time
 import math
 import signal
 import time
 import math
+import threading
 
 from collections import OrderedDict
 from datetime import datetime
 from enum import Enum, unique
 
 from collections import OrderedDict
 from datetime import datetime
 from enum import Enum, unique
-from threading import Event
+from curses import ascii
 
 import rados
 
 
 import rados
 
@@ -35,11 +36,13 @@ class MetricType(Enum):
 
 
 FS_TOP_PROG_STR = 'cephfs-top'
 
 
 FS_TOP_PROG_STR = 'cephfs-top'
+FS_TOP_ALL_FS_APP = 'ALL_FS_APP'
+FS_TOP_FS_SELECTED_APP = 'SELECTED_FS_APP'
 
 # version match b/w fstop and stats emitted by mgr/stats
 
 # version match b/w fstop and stats emitted by mgr/stats
-FS_TOP_SUPPORTED_VER = 1
+FS_TOP_SUPPORTED_VER = 2
 
 
-ITEMS_PAD_LEN = 1
+ITEMS_PAD_LEN = 3
 ITEMS_PAD = " " * ITEMS_PAD_LEN
 DEFAULT_REFRESH_INTERVAL = 1
 # min refresh interval allowed
 ITEMS_PAD = " " * ITEMS_PAD_LEN
 DEFAULT_REFRESH_INTERVAL = 1
 # min refresh interval allowed
@@ -83,8 +86,9 @@ MAIN_WINDOW_TOP_LINE_METRICS = OrderedDict([
 MGR_STATS_COUNTERS = list(MAIN_WINDOW_TOP_LINE_METRICS.keys())
 
 FS_TOP_VERSION_HEADER_FMT = '{prog_name} - {now}'
 MGR_STATS_COUNTERS = list(MAIN_WINDOW_TOP_LINE_METRICS.keys())
 
 FS_TOP_VERSION_HEADER_FMT = '{prog_name} - {now}'
-FS_TOP_CLIENT_HEADER_FMT = 'Client(s): {num_clients} - {num_mounts} FUSE, '\
-    '{num_kclients} kclient, {num_libs} libcephfs'
+FS_TOP_CLIENT_HEADER_FMT = 'Total Client(s): {num_clients} - '\
+    '{num_mounts} FUSE, {num_kclients} kclient, {num_libs} libcephfs'
+FS_TOP_NAME_TOPL_FMT = 'Filesystem: {fs_name} - {client_count} client(s)'
 
 CLIENT_METADATA_KEY = "client_metadata"
 CLIENT_METADATA_MOUNT_POINT_KEY = "mount_point"
 
 CLIENT_METADATA_KEY = "client_metadata"
 CLIENT_METADATA_MOUNT_POINT_KEY = "mount_point"
@@ -100,6 +104,14 @@ last_time = time.time()
 last_read_size = {}
 last_write_size = {}
 
 last_read_size = {}
 last_write_size = {}
 
+fs_list = []
+# store the current states of cephfs-top
+# last_fs    : last filesystem visited
+# last_field : last field selected for sorting
+# limit      : last limit value
+current_states = {"last_fs": "", "last_field": 'chit', "limit": None}
+metrics_dict = {}
+
 
 def calc_perc(c):
     if c[0] == 0 and c[1] == 0:
 
 def calc_perc(c):
     if c[0] == 0 and c[1] == 0:
@@ -148,14 +160,14 @@ class FSTop(object):
     def __init__(self, args):
         self.rados = None
         self.stdscr = None  # curses instance
     def __init__(self, args):
         self.rados = None
         self.stdscr = None  # curses instance
+        self.current_screen = ""
         self.client_name = args.id
         self.cluster_name = args.cluster
         self.conffile = args.conffile
         self.refresh_interval_secs = args.delay
         self.client_name = args.id
         self.cluster_name = args.cluster
         self.conffile = args.conffile
         self.refresh_interval_secs = args.delay
-        self.exit_ev = Event()
-
-    def refresh_window_size(self):
-        self.height, self.width = self.stdscr.getmaxyx()
+        self.PAD_HEIGHT = 10000  # height of the fstop_pad
+        self.PAD_WIDTH = 300  # width of the fstop_pad
+        self.exit_ev = threading.Event()
 
     def handle_signal(self, signum, _):
         self.exit_ev.set()
 
     def handle_signal(self, signum, _):
         self.exit_ev.set()
@@ -163,16 +175,19 @@ class FSTop(object):
     def init(self):
         try:
             if self.conffile:
     def init(self):
         try:
             if self.conffile:
-                r_rados = rados.Rados(rados_id=self.client_name, clustername=self.cluster_name,
+                r_rados = rados.Rados(rados_id=self.client_name,
+                                      clustername=self.cluster_name,
                                       conffile=self.conffile)
             else:
                                       conffile=self.conffile)
             else:
-                r_rados = rados.Rados(rados_id=self.client_name, clustername=self.cluster_name)
+                r_rados = rados.Rados(rados_id=self.client_name,
+                                      clustername=self.cluster_name)
             r_rados.conf_read_file()
             r_rados.connect()
             self.rados = r_rados
         except rados.Error as e:
             if e.errno == errno.ENOENT:
             r_rados.conf_read_file()
             r_rados.connect()
             self.rados = r_rados
         except rados.Error as e:
             if e.errno == errno.ENOENT:
-                raise FSTopException(f'cluster {self.cluster_name} does not exist')
+                raise FSTopException(f'cluster {self.cluster_name}'
+                                     ' does not exist')
             else:
                 raise FSTopException(f'error connecting to cluster: {e}')
         self.verify_perf_stats_support()
             else:
                 raise FSTopException(f'error connecting to cluster: {e}')
         self.verify_perf_stats_support()
@@ -188,13 +203,29 @@ class FSTop(object):
         stats_json = self.perf_stats_query()
         if not stats_json['version'] == FS_TOP_SUPPORTED_VER:
             raise FSTopException('perf stats version mismatch!')
         stats_json = self.perf_stats_query()
         if not stats_json['version'] == FS_TOP_SUPPORTED_VER:
             raise FSTopException('perf stats version mismatch!')
-        missing = [m for m in stats_json["global_counters"] if m.upper() not in MGR_STATS_COUNTERS]
+        missing = [m for m in stats_json["global_counters"]
+                   if m.upper() not in MGR_STATS_COUNTERS]
         if missing:
         if missing:
-            raise FSTopException('Cannot handle unknown metrics from \'ceph fs perf stats\': '
-                                 f'{missing}')
+            raise FSTopException('Cannot handle unknown metrics from'
+                                 f'\'ceph fs perf stats\': {missing}')
+
+    def get_fs_names(self):
+        mon_cmd = {'prefix': 'fs ls', 'format': 'json'}
+        try:
+            ret, buf, out = self.rados.mon_command(json.dumps(mon_cmd), b'')
+        except Exception as e:
+            raise FSTopException(f'Error in fs ls: {e}')
+        fs_map = json.loads(buf.decode('utf-8'))
+        global fs_list
+        fs_list.clear()
+        for filesystem in fs_map:
+            fs = filesystem['name']
+            fs_list.append(fs)
+        return fs_list
 
     def setup_curses(self, win):
         self.stdscr = win
 
     def setup_curses(self, win):
         self.stdscr = win
+        self.stdscr.keypad(True)
         curses.use_default_colors()
         curses.start_color()
         try:
         curses.use_default_colors()
         curses.start_color()
         try:
@@ -203,7 +234,258 @@ class FSTop(object):
             # If the terminal do not support the visibility
             # requested it will raise an exception
             pass
             # If the terminal do not support the visibility
             # requested it will raise an exception
             pass
-        self.run_display()
+        self.fstop_pad = curses.newpad(self.PAD_HEIGHT, self.PAD_WIDTH)
+        self.run_all_display()
+
+    def display_fs_menu(self, stdscr, selected_row_idx):
+        stdscr.clear()
+        h, w = stdscr.getmaxyx()
+        title = ['Filesystems', 'Press "q" to go back to the previous screen']
+        pos_x1 = w // 2 - len(title[0]) // 2
+        pos_x2 = w // 2 - len(title[1]) // 2
+        stdscr.addstr(1, pos_x1, title[0], curses.A_STANDOUT | curses.A_BOLD)
+        stdscr.addstr(3, pos_x2, title[1], curses.A_DIM)
+        for index, name in enumerate(fs_list):
+            x = w // 2 - len(name) // 2
+            y = h // 2 - len(fs_list) // 2 + index
+            if index == selected_row_idx:
+                stdscr.attron(curses.color_pair(1))
+                stdscr.addstr(y, x, name)
+                stdscr.attroff(curses.color_pair(1))
+            else:
+                stdscr.addstr(y, x, name)
+        stdscr.refresh()
+
+    def display_sort_menu(self, stdscr, selected_row_idx, field_menu):
+        stdscr.clear()
+        title = ['Fields', 'Press "q" to go back to the previous screen']
+        pos_x1 = 0
+        pos_x2 = 0
+        stdscr.addstr(1, pos_x1, title[0], curses.A_STANDOUT | curses.A_BOLD)
+        stdscr.addstr(3, pos_x2, title[1], curses.A_DIM)
+        for index, name in enumerate(field_menu):
+            x = 0
+            y = 5 + index
+            if index == selected_row_idx:
+                stdscr.attron(curses.color_pair(1))
+                stdscr.addstr(y, x, name)
+                stdscr.attroff(curses.color_pair(1))
+            else:
+                stdscr.addstr(y, x, name)
+        stdscr.refresh()
+
+    def display_menu(self, stdscr):
+        stdscr.clear()
+        h, w = stdscr.getmaxyx()
+        title = ['No filesystem available',
+                 'Press "q" to go back to home (all filesystem info) screen']
+        pos_x1 = w // 2 - len(title[0]) // 2
+        pos_x2 = w // 2 - len(title[1]) // 2
+        stdscr.addstr(1, pos_x1, title[0], curses.A_STANDOUT | curses.A_BOLD)
+        stdscr.addstr(3, pos_x2, title[1], curses.A_DIM)
+        stdscr.refresh()
+
+    def set_key(self, stdscr):
+        curses.curs_set(0)
+        curses.init_pair(1, curses.COLOR_MAGENTA, curses.COLOR_WHITE)
+        curr_row = 0
+        key = 0
+        endmenu = False
+        while not endmenu:
+            global fs_list
+            fs_list = self.get_fs_names()
+
+            if key == curses.KEY_UP and curr_row > 0:
+                curr_row -= 1
+            elif key == curses.KEY_DOWN and curr_row < len(fs_list) - 1:
+                curr_row += 1
+            elif (key in [curses.KEY_ENTER, 10, 13]) and fs_list:
+                self.stdscr.erase()
+                current_states['last_fs'] = fs_list[curr_row]
+                self.run_display()
+                endmenu = True
+            elif key == ord('q'):
+                self.stdscr.erase()
+                if isinstance(current_states['last_fs'], list):
+                    self.run_all_display()
+                else:
+                    self.run_display()
+                endmenu = True
+
+            try:
+                if not fs_list:
+                    self.display_menu(stdscr)
+                else:
+                    self.display_fs_menu(stdscr, curr_row)
+            except curses.error:
+                pass
+            curses.halfdelay(self.refresh_interval_secs)
+            key = stdscr.getch()
+
+    def choose_field(self, stdscr):
+        curses.curs_set(0)
+        curses.init_pair(1, curses.COLOR_BLACK, curses.COLOR_WHITE)
+        field_menu = ["chit= CAP_HIT", "dlease= DENTRY_LEASE", "ofiles= OPENED_FILES",
+                      "oicaps= PINNED_ICAPS", "oinodes= OPENED_INODES",
+                      "rtio= READ_IO_SIZES", "raio= READ_AVG_IO_SIZES",
+                      "rsp= READ_IO_SPEED", "wtio= WRITE_IO_SIZES",
+                      "waio= WRITE_AVG_IO_SIZES", "wsp= WRITE_IO_SPEED",
+                      "rlatavg= AVG_READ_LATENCY", "rlatsd= STDEV_READ_LATENCY",
+                      "wlatavg= AVG_WRITE_LATENCY", "wlatsd= STDEV_WRITE_LATENCY",
+                      "mlatavg= AVG_METADATA_LATENCY", "mlatsd= STDEV_METADATA_LATENCY",
+                      "Default"]
+        curr_row1 = 0
+        key = 0
+        endwhile = False
+        while not endwhile:
+            global current_states
+
+            if key == curses.KEY_UP and curr_row1 > 0:
+                curr_row1 -= 1
+            elif key == curses.KEY_DOWN and curr_row1 < len(field_menu) - 1:
+                curr_row1 += 1
+            elif key == curses.KEY_ENTER or key in [10, 13]:
+                self.stdscr.erase()
+                last_fs = current_states["last_fs"]
+                if curr_row1 != len(field_menu) - 1:
+                    current_states["last_field"] = (field_menu[curr_row1].split('='))[0]
+                else:
+                    current_states["last_field"] = 'chit'
+                if isinstance(last_fs, list):
+                    self.run_all_display()
+                else:
+                    self.run_display()
+                endwhile = True
+            elif key == ord('q'):
+                self.stdscr.erase()
+                if isinstance(current_states['last_fs'], list):
+                    self.run_all_display()
+                else:
+                    self.run_display()
+                endwhile = True
+
+            try:
+                if not fs_list:
+                    self.display_menu(stdscr)
+                else:
+                    self.display_sort_menu(stdscr, curr_row1, field_menu)
+            except curses.error:
+                pass
+            curses.halfdelay(self.refresh_interval_secs)
+            key = stdscr.getch()
+
+    def set_limit(self, stdscr):
+        key = ''
+        endwhile = False
+        while not endwhile:
+            stdscr.clear()
+            h, w = stdscr.getmaxyx()
+            title = 'Enter the limit you want to set (number) and press ENTER,'\
+                    ' press "d" for default, "q" to go back to previous screen '
+            pos_x1 = w // 2 - len(title) // 2
+            try:
+                stdscr.addstr(1, pos_x1, title, curses.A_STANDOUT | curses.A_BOLD)
+            except curses.error:
+                pass
+            curses.halfdelay(self.refresh_interval_secs)
+            inp = stdscr.getch()
+            if inp in [ord('d'), ord('q')] or ascii.isdigit(inp):
+                key = key + chr(inp)
+                if key == 'd':
+                    current_states["limit"] = None
+                elif key == 'q':
+                    endwhile = True
+                elif (key).isnumeric():
+                    i = 1
+                    length = 4
+                    while i <= length:
+                        pos = w // 2 - len(key) // 2
+                        try:
+                            stdscr.move(3, 0)
+                            stdscr.clrtoeol()
+                            stdscr.addstr(3, pos, key, curses.A_BOLD)
+                        except curses.error:
+                            pass
+                        if key[i - 1] == '\n':
+                            break
+                        inp = stdscr.getch()
+                        if inp == ord('q'):
+                            if current_states['limit'] is None:
+                                key = current_states["limit"]
+                            else:
+                                key = current_states['limit'] + " "
+                            break
+                        if inp == curses.KEY_RESIZE:
+                            stdscr.clear()
+                            windowsize = stdscr.getmaxyx()
+                            wd = windowsize[1] - 1
+                            pos_x1 = wd // 2 - len(title) // 2
+                            try:
+                                stdscr.addstr(1, pos_x1, title, curses.A_STANDOUT | curses.A_BOLD)
+                            except curses.error:
+                                pass
+                        if inp == curses.KEY_BACKSPACE or inp == curses.KEY_DC or inp == 127:
+                            if i > 1:
+                                key = key[:-1]
+                                i = i - 1
+                                stdscr.move(4, 0)
+                                stdscr.clrtoeol()
+                            elif i == 1:
+                                curses.wrapper(self.set_limit)
+                        elif i == length:
+                            if inp == ord('\n'):
+                                key = key + chr(inp)
+                                i = i + 1
+                            else:
+                                info = "Max length is reached, press Backspace" \
+                                    " to edit or Enter to set the limit!"
+                                pos = w // 2 - len(info) // 2
+                                try:
+                                    stdscr.addstr(4, pos, info, curses.A_BOLD)
+                                except curses.error:
+                                    pass
+                        elif ascii.isdigit(inp) or inp == ord('\n'):
+                            key = key + chr(inp)
+                            i = i + 1
+                    if key is None:
+                        current_states["limit"] = key
+                    elif int(key) != 0:
+                        current_states["limit"] = key[:-1]
+                self.stdscr.erase()
+                if isinstance(current_states['last_fs'], list):
+                    self.run_all_display()
+                else:
+                    self.run_display()
+
+    def set_option(self, opt):
+        if opt == ord('m'):
+            if fs_list:
+                curses.wrapper(self.set_key)
+            else:
+                return False
+        elif opt == ord('s'):
+            if fs_list:
+                curses.wrapper(self.choose_field)
+            else:
+                return False
+        elif opt == ord('l'):
+            if fs_list:
+                curses.wrapper(self.set_limit)
+            else:
+                return False
+        elif opt == ord('r'):
+            current_states['last_field'] = 'chit'
+            current_states["limit"] = None
+            if isinstance(current_states['last_fs'], list):
+                self.run_all_display()
+            else:
+                self.run_display()
+        elif opt == ord('q'):
+            if self.current_screen == FS_TOP_ALL_FS_APP:
+                quit()
+            else:
+                self.run_all_display()
+        return True
 
     def verify_perf_stats_support(self):
         mon_cmd = {'prefix': 'mgr module ls', 'format': 'json'}
 
     def verify_perf_stats_support(self):
         mon_cmd = {'prefix': 'mgr module ls', 'format': 'json'}
@@ -214,8 +496,8 @@ class FSTop(object):
         if ret != 0:
             raise FSTopException(f'error checking \'stats\' module: {out}')
         if 'stats' not in json.loads(buf.decode('utf-8'))['enabled_modules']:
         if ret != 0:
             raise FSTopException(f'error checking \'stats\' module: {out}')
         if 'stats' not in json.loads(buf.decode('utf-8'))['enabled_modules']:
-            raise FSTopException('\'stats\' module not enabled. Use \'ceph mgr module '
-                                 'enable stats\' to enable')
+            raise FSTopException('\'stats\' module not enabled. Use'
+                                 '\'ceph mgr module enable stats\' to enable')
 
     def perf_stats_query(self):
         mgr_cmd = {'prefix': 'fs perf stats', 'format': 'json'}
 
     def perf_stats_query(self):
         mgr_cmd = {'prefix': 'fs perf stats', 'format': 'json'}
@@ -302,10 +584,18 @@ class FSTop(object):
             # return empty string for none type
             return ''
 
             # return empty string for none type
             return ''
 
-    def refresh_top_line_and_build_coord(self):
-        if self.topl is None:
-            return
+    @staticmethod
+    def has_metric(metadata, metrics_key):
+        return metrics_key in metadata
 
 
+    @staticmethod
+    def has_metrics(metadata, metrics_keys):
+        for key in metrics_keys:
+            if not FSTop.has_metric(metadata, key):
+                return False
+        return True
+
+    def create_top_line_and_build_coord(self):
         xp = 0
         x_coord_map = {}
 
         xp = 0
         x_coord_map = {}
 
@@ -352,51 +642,31 @@ class FSTop(object):
             x_coord_map[item] = (xp, nlen)
             xp += nlen
         title = ITEMS_PAD.join(heading)
             x_coord_map[item] = (xp, nlen)
             xp += nlen
         title = ITEMS_PAD.join(heading)
-        hlen = min(self.width - 2, len(title))
-        self.topl.addnstr(0, 0, title, hlen, curses.A_STANDOUT | curses.A_BOLD)
-        self.topl.refresh()
+        self.fsstats.addstr(self.tablehead_y, 0, title, curses.A_STANDOUT | curses.A_BOLD)
         return x_coord_map
 
         return x_coord_map
 
-    @staticmethod
-    def has_metric(metadata, metrics_key):
-        return metrics_key in metadata
-
-    @staticmethod
-    def has_metrics(metadata, metrics_keys):
-        for key in metrics_keys:
-            if not FSTop.has_metric(metadata, key):
-                return False
-        return True
-
-    def refresh_client(self, client_id, metrics, counters, client_meta, x_coord_map, y_coord):
+    def create_client(self, fs_name, client_id, metrics, counters,
+                      client_meta, x_coord_map, y_coord):
         global last_time
         global last_time
-        size = 0
+        metrics_dict.setdefault(fs_name, {})
+        metrics_dict[fs_name].setdefault(client_id, {})
         cur_time = time.time()
         duration = cur_time - last_time
         last_time = cur_time
         cur_time = time.time()
         duration = cur_time - last_time
         last_time = cur_time
-        remaining_hlen = self.width - 1
         for item in MAIN_WINDOW_TOP_LINE_ITEMS_START:
             coord = x_coord_map[item]
         for item in MAIN_WINDOW_TOP_LINE_ITEMS_START:
             coord = x_coord_map[item]
-            hlen = coord[1] - len(ITEMS_PAD)
-            hlen = min(hlen, remaining_hlen)
-            if remaining_hlen < coord[1]:
-                remaining_hlen = 0
-            else:
-                remaining_hlen -= coord[1]
+            hlen = coord[1] - 1
             if item == FS_TOP_MAIN_WINDOW_COL_CLIENT_ID:
             if item == FS_TOP_MAIN_WINDOW_COL_CLIENT_ID:
-                self.mainw.addnstr(y_coord, coord[0],
-                                   wrap(client_id.split('.')[1], hlen),
-                                   hlen)
+                self.fsstats.addstr(y_coord, coord[0],
+                                    wrap(client_id.split('.')[1], hlen), curses.A_DIM)
             elif item == FS_TOP_MAIN_WINDOW_COL_MNT_ROOT:
             elif item == FS_TOP_MAIN_WINDOW_COL_MNT_ROOT:
-                if FSTop.has_metric(client_meta, CLIENT_METADATA_MOUNT_ROOT_KEY):
-                    self.mainw.addnstr(y_coord, coord[0],
-                                       wrap(client_meta[CLIENT_METADATA_MOUNT_ROOT_KEY], hlen),
-                                       hlen)
+                if FSTop.has_metric(client_meta,
+                                    CLIENT_METADATA_MOUNT_ROOT_KEY):
+                    self.fsstats.addstr(
+                        y_coord, coord[0],
+                        wrap(client_meta[CLIENT_METADATA_MOUNT_ROOT_KEY], hlen), curses.A_DIM)
                 else:
                 else:
-                    self.mainw.addnstr(y_coord, coord[0], "N/A", hlen)
-
-            if remaining_hlen == 0:
-                return
+                    self.fsstats.addstr(y_coord, coord[0], "N/A", curses.A_DIM)
 
         cidx = 0
         for item in counters:
 
         cidx = 0
         for item in counters:
@@ -404,53 +674,47 @@ class FSTop(object):
                 cidx += 1
                 continue
             coord = x_coord_map[item]
                 cidx += 1
                 continue
             coord = x_coord_map[item]
-            hlen = coord[1] - len(ITEMS_PAD)
-            hlen = min(hlen, remaining_hlen)
-            if remaining_hlen < coord[1]:
-                remaining_hlen = 0
-            else:
-                remaining_hlen -= coord[1]
             m = metrics[cidx]
             key = MGR_STATS_COUNTERS[cidx]
             typ = MAIN_WINDOW_TOP_LINE_METRICS[key]
             m = metrics[cidx]
             key = MGR_STATS_COUNTERS[cidx]
             typ = MAIN_WINDOW_TOP_LINE_METRICS[key]
-            if item.lower() in client_meta.get(CLIENT_METADATA_VALID_METRICS_KEY, []):
+            if item.lower() in client_meta.get(
+                    CLIENT_METADATA_VALID_METRICS_KEY, []):
                 if typ == MetricType.METRIC_TYPE_PERCENTAGE:
                 if typ == MetricType.METRIC_TYPE_PERCENTAGE:
-                    self.mainw.addnstr(y_coord, coord[0], f'{calc_perc(m)}', hlen)
+                    perc = calc_perc(m)
+                    metrics_dict[fs_name][client_id][self.items(item)] = perc
+                    self.fsstats.addstr(y_coord, coord[0],
+                                        f'{perc}', curses.A_DIM)
                 elif typ == MetricType.METRIC_TYPE_LATENCY:
                 elif typ == MetricType.METRIC_TYPE_LATENCY:
-                    self.mainw.addnstr(y_coord, coord[0], f'{calc_lat(m)}', hlen)
+                    lat = calc_lat(m)
+                    metrics_dict[fs_name][client_id][self.items(item)] = lat
+                    self.fsstats.addstr(y_coord, coord[0],
+                                        f'{lat}', curses.A_DIM)
                 elif typ == MetricType.METRIC_TYPE_STDEV:
                 elif typ == MetricType.METRIC_TYPE_STDEV:
-                    self.mainw.addnstr(y_coord, coord[0], f'{calc_stdev(m)}', hlen)
+                    stdev = calc_stdev(m)
+                    metrics_dict[fs_name][client_id][self.items(item)] = stdev
+                    self.fsstats.addstr(y_coord, coord[0],
+                                        f'{stdev}', curses.A_DIM)
                 elif typ == MetricType.METRIC_TYPE_SIZE:
                 elif typ == MetricType.METRIC_TYPE_SIZE:
-                    self.mainw.addnstr(y_coord, coord[0], f'{calc_size(m)}', hlen)
+                    size = calc_size(m)
+                    metrics_dict[fs_name][client_id][self.items(item)] = size
+                    self.fsstats.addstr(y_coord, coord[0],
+                                        f'{size}', curses.A_DIM)
 
                     # average io sizes
 
                     # average io sizes
-                    if remaining_hlen == 0:
-                        return
                     if key == "READ_IO_SIZES":
                         coord = x_coord_map["READ_IO_AVG"]
                     elif key == "WRITE_IO_SIZES":
                         coord = x_coord_map["WRITE_IO_AVG"]
                     if key == "READ_IO_SIZES":
                         coord = x_coord_map["READ_IO_AVG"]
                     elif key == "WRITE_IO_SIZES":
                         coord = x_coord_map["WRITE_IO_AVG"]
-                    hlen = coord[1] - len(ITEMS_PAD)
-                    hlen = min(hlen, remaining_hlen)
-                    if remaining_hlen < coord[1]:
-                        remaining_hlen = 0
-                    else:
-                        remaining_hlen -= coord[1]
-                    self.mainw.addnstr(y_coord, coord[0], f'{calc_avg_size(m)}', hlen)
+                    avg_size = calc_avg_size(m)
+                    metrics_dict[fs_name][client_id][self.avg_items(key)] = avg_size
+                    self.fsstats.addstr(y_coord, coord[0],
+                                        f'{avg_size}', curses.A_DIM)
 
                     # io speeds
 
                     # io speeds
-                    if remaining_hlen == 0:
-                        return
                     if key == "READ_IO_SIZES":
                         coord = x_coord_map["READ_IO_SPEED"]
                     elif key == "WRITE_IO_SIZES":
                         coord = x_coord_map["WRITE_IO_SPEED"]
                     if key == "READ_IO_SIZES":
                         coord = x_coord_map["READ_IO_SPEED"]
                     elif key == "WRITE_IO_SIZES":
                         coord = x_coord_map["WRITE_IO_SPEED"]
-                    hlen = coord[1] - len(ITEMS_PAD)
-                    hlen = min(hlen, remaining_hlen)
-                    if remaining_hlen < coord[1]:
-                        remaining_hlen = 0
-                    else:
-                        remaining_hlen -= coord[1]
                     size = 0
                     if key == "READ_IO_SIZES":
                         if m[1] > 0:
                     size = 0
                     if key == "READ_IO_SIZES":
                         if m[1] > 0:
@@ -464,125 +728,356 @@ class FSTop(object):
                             last_size = last_write_size.get(client_id, 0)
                             size = m[1] - last_size
                             last_write_size[client_id] = m[1]
                             last_size = last_write_size.get(client_id, 0)
                             size = m[1] - last_size
                             last_write_size[client_id] = m[1]
-                    self.mainw.addnstr(y_coord, coord[0],
-                                       f'{calc_speed(abs(size), duration)}',
-                                       hlen)
+                    speed = calc_speed(abs(size), duration)
+                    metrics_dict[fs_name][client_id][self.speed_items(key)] = speed
+                    self.fsstats.addstr(y_coord, coord[0],
+                                        f'{speed}', curses.A_DIM)
                 else:
                     # display 0th element from metric tuple
                 else:
                     # display 0th element from metric tuple
-                    self.mainw.addnstr(y_coord, coord[0], f'{m[0]}', hlen)
+                    self.fsstats.addstr(y_coord, coord[0], f'{m[0]}', curses.A_DIM)
             else:
             else:
-                self.mainw.addnstr(y_coord, coord[0], "N/A", hlen)
+                self.fsstats.addstr(y_coord, coord[0], "N/A", curses.A_DIM)
             cidx += 1
 
             cidx += 1
 
-            if remaining_hlen == 0:
-                return
-
         for item in MAIN_WINDOW_TOP_LINE_ITEMS_END:
             coord = x_coord_map[item]
         for item in MAIN_WINDOW_TOP_LINE_ITEMS_END:
             coord = x_coord_map[item]
-            hlen = coord[1] - len(ITEMS_PAD)
+            wrapLen = self.PAD_WIDTH - coord[0]
             # always place the FS_TOP_MAIN_WINDOW_COL_MNTPT_HOST_ADDR in the
             # last, it will be a very long string to display
             if item == FS_TOP_MAIN_WINDOW_COL_MNTPT_HOST_ADDR:
             # always place the FS_TOP_MAIN_WINDOW_COL_MNTPT_HOST_ADDR in the
             # last, it will be a very long string to display
             if item == FS_TOP_MAIN_WINDOW_COL_MNTPT_HOST_ADDR:
-                if FSTop.has_metrics(client_meta, [CLIENT_METADATA_MOUNT_POINT_KEY,
-                                                   CLIENT_METADATA_HOSTNAME_KEY,
-                                                   CLIENT_METADATA_IP_KEY]):
-                    self.mainw.addnstr(y_coord, coord[0],
-                                       f'{client_meta[CLIENT_METADATA_MOUNT_POINT_KEY]}@'
-                                       f'{client_meta[CLIENT_METADATA_HOSTNAME_KEY]}/'
-                                       f'{client_meta[CLIENT_METADATA_IP_KEY]}',
-                                       remaining_hlen)
+                if FSTop.has_metrics(client_meta,
+                                     [CLIENT_METADATA_MOUNT_POINT_KEY,
+                                      CLIENT_METADATA_HOSTNAME_KEY,
+                                      CLIENT_METADATA_IP_KEY]):
+                    mount_point = f'{client_meta[CLIENT_METADATA_MOUNT_POINT_KEY]}@'\
+                        f'{client_meta[CLIENT_METADATA_HOSTNAME_KEY]}/'\
+                        f'{client_meta[CLIENT_METADATA_IP_KEY]}'
+                    self.fsstats.addstr(
+                        y_coord, coord[0],
+                        wrap(mount_point, wrapLen), curses.A_DIM)
                 else:
                 else:
-                    self.mainw.addnstr(y_coord, coord[0], "N/A", remaining_hlen)
-            hlen = min(hlen, remaining_hlen)
-            if remaining_hlen < coord[1]:
-                remaining_hlen = 0
-            else:
-                remaining_hlen -= coord[1]
-            if remaining_hlen == 0:
-                return
+                    self.fsstats.addstr(y_coord, coord[0], "N/A", curses.A_DIM)
 
 
-    def refresh_clients(self, x_coord_map, stats_json):
+    def create_clients(self, x_coord_map, stats_json, fs_name):
+        global metrics_dict, current_states
         counters = [m.upper() for m in stats_json[GLOBAL_COUNTERS_KEY]]
         counters = [m.upper() for m in stats_json[GLOBAL_COUNTERS_KEY]]
-        y_coord = 0
-        for client_id, metrics in stats_json[GLOBAL_METRICS_KEY].items():
-            self.refresh_client(client_id,
-                                metrics,
-                                counters,
-                                stats_json[CLIENT_METADATA_KEY][client_id],
-                                x_coord_map,
-                                y_coord)
-            y_coord += 1
-
-    def refresh_main_window(self, x_coord_map, stats_json):
-        if self.mainw is None:
-            return
-        self.refresh_clients(x_coord_map, stats_json)
-        self.mainw.refresh()
-
-    def refresh_header(self, stats_json):
-        hlen = self.width - 2
+        self.tablehead_y += 2
+        res = stats_json[GLOBAL_METRICS_KEY].get(fs_name, {})
+        client_cnt = len(res)
+        self.fsstats.addstr(self.tablehead_y, 0, FS_TOP_NAME_TOPL_FMT.format(
+            fs_name=fs_name, client_count=client_cnt), curses.A_BOLD)
+        self.tablehead_y += 2
+        metrics_dict_client = metrics_dict.get(fs_name, {})
+        if len(metrics_dict) > len(fs_list):
+            stale_fs = set(metrics_dict) - set(fs_list)
+            for key in stale_fs:
+                del metrics_dict[key]
+        if len(metrics_dict_client) > client_cnt:
+            stale_clients = set(metrics_dict_client) - set(res)
+            for key in stale_clients:
+                del metrics_dict_client[key]
+        if client_cnt:
+            if len(metrics_dict_client) != client_cnt:
+                sort_list = sorted(list(res.keys()))
+            else:
+                sort_arg = current_states['last_field']
+                sort_list = sorted(list(res.keys()),
+                                   key=lambda x: metrics_dict[fs_name].get(x, {}).get(sort_arg, 0),
+                                   reverse=True)
+            if current_states['limit'] is not None and int(current_states['limit']) < client_cnt:
+                sort_list = sort_list[0:int(current_states['limit'])]
+            for client_id in sort_list:
+                self.create_client(
+                    fs_name, client_id, res.get(client_id, {}), counters,
+                    stats_json[CLIENT_METADATA_KEY].get(fs_name, {}).get(client_id, {}),
+                    x_coord_map, self.tablehead_y)
+                self.tablehead_y += 1
+
+    def create_header(self, stats_json, help, screen_title="", color_id=0):
+        num_clients, num_mounts, num_kclients, num_libs = 0, 0, 0, 0
         if not stats_json['version'] == FS_TOP_SUPPORTED_VER:
         if not stats_json['version'] == FS_TOP_SUPPORTED_VER:
-            self.header.addnstr(0, 0, 'perf stats version mismatch!', hlen)
+            self.header.addstr(0, 0, 'perf stats version mismatch!', curses.A_BOLD)
             return False
             return False
-        client_metadata = stats_json[CLIENT_METADATA_KEY]
-        num_clients = len(client_metadata)
-        num_mounts = len([client for client, metadata in client_metadata.items() if
-                          CLIENT_METADATA_MOUNT_POINT_KEY in metadata
-                          and metadata[CLIENT_METADATA_MOUNT_POINT_KEY] != 'N/A'])
-        num_kclients = len([client for client, metadata in client_metadata.items() if
-                            "kernel_version" in metadata])
-        num_libs = num_clients - (num_mounts + num_kclients)
+        global fs_list
+        for fs_name in fs_list:
+            client_metadata = stats_json[CLIENT_METADATA_KEY].get(fs_name, {})
+            client_cnt = len(client_metadata)
+            if client_cnt:
+                num_clients = num_clients + client_cnt
+                num_mounts = num_mounts + len(
+                    [client for client, metadata in client_metadata.items() if
+                     CLIENT_METADATA_MOUNT_POINT_KEY in metadata
+                     and metadata[CLIENT_METADATA_MOUNT_POINT_KEY] != 'N/A'])
+                num_kclients = num_kclients + len(
+                    [client for client, metadata in client_metadata.items() if
+                     "kernel_version" in metadata])
+                num_libs = num_clients - (num_mounts + num_kclients)
         now = datetime.now().ctime()
         now = datetime.now().ctime()
-        self.header.addnstr(0, 0,
-                            FS_TOP_VERSION_HEADER_FMT.format(prog_name=FS_TOP_PROG_STR, now=now),
-                            hlen, curses.A_STANDOUT | curses.A_BOLD)
-        self.header.addnstr(1, 0, FS_TOP_CLIENT_HEADER_FMT.format(num_clients=num_clients,
-                                                                  num_mounts=num_mounts,
-                                                                  num_kclients=num_kclients,
-                                                                  num_libs=num_libs), hlen)
-        self.header.refresh()
+        self.header.addstr(0, 0, FS_TOP_VERSION_HEADER_FMT.format(prog_name=FS_TOP_PROG_STR,
+                                                                  now=now), curses.A_BOLD)
+        self.header.addstr(2, 0, screen_title, curses.color_pair(color_id) | curses.A_BOLD)
+        self.header.addstr(3, 0, FS_TOP_CLIENT_HEADER_FMT.format(num_clients=num_clients,
+                                                                 num_mounts=num_mounts,
+                                                                 num_kclients=num_kclients,
+                                                                 num_libs=num_libs), curses.A_DIM)
+        self.header.addstr(4, 0, help, curses.A_DIM)
         return True
 
     def run_display(self):
         return True
 
     def run_display(self):
+        # clear the pads to have a smooth refresh
+        self.header.erase()
+        self.fsstats.erase()
+
+        self.current_screen = FS_TOP_FS_SELECTED_APP
+        screen_title = "Selected Filesystem Info"
+        help_commands = "m - select a filesystem | s - sort menu | l - limit number of clients"\
+                        " | r - reset to default | q - home (All Filesystem Info) screen"
+        curses.init_pair(3, curses.COLOR_MAGENTA, -1)
+
+        top, left = 0, 0  # where to place pad
+        vscrollOffset, hscrollOffset = 0, 0  # scroll offsets
+
+        # calculate the initial viewport height and width
+        windowsize = self.stdscr.getmaxyx()
+        self.viewportHeight, self.viewportWidth = windowsize[0] - 1, windowsize[1] - 1
+
+        # create header subpad
+        self.header_height = 7
+        self.header = self.fstop_pad.subwin(self.header_height, self.viewportWidth, 0, 0)
+
+        # create fsstats subpad
+        fsstats_begin_y = self.header_height
+        fsstats_height = self.PAD_HEIGHT - self.header_height
+        self.fsstats = self.fstop_pad.subwin(fsstats_height, self.PAD_WIDTH, fsstats_begin_y, 0)
+
+        curses.halfdelay(1)
+        cmd = self.stdscr.getch()
         while not self.exit_ev.is_set():
         while not self.exit_ev.is_set():
-            # use stdscr.clear() instead of clearing each window
-            # to avoid screen blinking.
-            self.stdscr.clear()
-            self.refresh_window_size()
-            if self.width <= 2 or self.width <= 2:
-                self.exit_ev.wait(timeout=self.refresh_interval_secs)
-                continue
+            if cmd in [ord('m'), ord('s'), ord('l'), ord('r'), ord('q')]:
+                self.set_option(cmd)
+                self.exit_ev.set()
 
 
-            # coordinate constants for windowing -- (height, width, y, x)
-            # NOTE: requires initscr() call before accessing COLS, LINES.
-            try:
-                HEADER_WINDOW_COORD = (2, self.width - 1, 0, 0)
-                self.header = curses.newwin(*HEADER_WINDOW_COORD)
-                if self.height >= 3:
-                    TOPLINE_WINDOW_COORD = (1, self.width - 1, 3, 0)
-                    self.topl = curses.newwin(*TOPLINE_WINDOW_COORD)
+            global fs_list, current_states
+            fs_list = self.get_fs_names()
+            fs = current_states["last_fs"]
+            stats_json = self.perf_stats_query()
+            vscrollEnd = 0
+            if fs not in fs_list:
+                help = "Error: The selected filesystem is not available now. " + help_commands
+                self.header.erase()  # erase previous text
+                self.create_header(stats_json, help, screen_title, 3)
+            else:
+                self.tablehead_y = 0
+                help = "COMMANDS: " + help_commands
+                self.fsstats.erase()  # erase previous text
+
+                client_metadata = stats_json[GLOBAL_METRICS_KEY].get(fs, {})
+                if current_states['limit'] is not None and \
+                   int(current_states['limit']) < len(client_metadata):
+                    num_client = int(current_states['limit'])
                 else:
                 else:
-                    self.topl = None
-                if self.height >= 5:
-                    MAIN_WINDOW_COORD = (self.height - 4, self.width - 1, 4, 0)
-                    self.mainw = curses.newwin(*MAIN_WINDOW_COORD)
+                    num_client = len(client_metadata)
+                vscrollEnd += num_client
+                if self.create_header(stats_json, help, screen_title, 3):
+                    x_coord_map = self.create_top_line_and_build_coord()
+                    self.create_clients(x_coord_map, stats_json, fs)
+
+            # scroll and refresh
+            if cmd == curses.KEY_DOWN:
+                if (vscrollEnd - vscrollOffset) > 1:
+                    vscrollOffset += 1
                 else:
                 else:
-                    self.mainw = None
-            except curses.error:
-                # this may happen when creating the sub windows the
-                # terminal window size changed, just retry it
-                continue
-
+                    vscrollOffset = vscrollEnd
+            elif cmd == curses.KEY_UP:
+                if vscrollOffset > 0:
+                    vscrollOffset -= 1
+            elif cmd == curses.KEY_NPAGE:
+                if (vscrollEnd - vscrollOffset) / 20 > 1:
+                    vscrollOffset += 20
+                else:
+                    vscrollOffset = vscrollEnd
+            elif cmd == curses.KEY_PPAGE:
+                if vscrollOffset / 20 >= 1:
+                    vscrollOffset -= 20
+                else:
+                    vscrollOffset = 0
+            elif cmd == curses.KEY_RIGHT:
+                if hscrollOffset < self.PAD_WIDTH - self.viewportWidth - 1:
+                    hscrollOffset += 1
+            elif cmd == curses.KEY_LEFT:
+                if hscrollOffset > 0:
+                    hscrollOffset -= 1
+            elif cmd == curses.KEY_HOME:
+                hscrollOffset = 0
+            elif cmd == curses.KEY_END:
+                hscrollOffset = self.PAD_WIDTH - self.viewportWidth - 1
+            elif cmd == curses.KEY_RESIZE:
+                # terminal resize event. Update the viewport dimensions
+                windowsize = self.stdscr.getmaxyx()
+                self.viewportHeight, self.viewportWidth = windowsize[0] - 1, windowsize[1] - 1
+
+            if cmd:
+                try:
+                    # refresh the viewport for the header portion
+                    if cmd not in [curses.KEY_DOWN,
+                                   curses.KEY_UP,
+                                   curses.KEY_NPAGE,
+                                   curses.KEY_PPAGE,
+                                   curses.KEY_RIGHT,
+                                   curses.KEY_LEFT]:
+                        self.fstop_pad.refresh(0, 0,
+                                               top, left,
+                                               top + self.header_height, left + self.viewportWidth)
+                    # refresh the viewport for the current table header portion in the fsstats pad
+                    if cmd not in [curses.KEY_DOWN,
+                                   curses.KEY_UP,
+                                   curses.KEY_NPAGE,
+                                   curses.KEY_PPAGE]:
+                        self.fstop_pad.refresh(fsstats_begin_y, hscrollOffset,
+                                               top + fsstats_begin_y, left,
+                                               7, left + self.viewportWidth)
+                    # refresh the viewport for the current client records portion in the fsstats pad
+                    self.fstop_pad.refresh(fsstats_begin_y + 1 + vscrollOffset, hscrollOffset,
+                                           top + fsstats_begin_y + 2, left,
+                                           top + self.viewportHeight, left + self.viewportWidth)
+                except curses.error:
+                    # This happens when the user switches to a terminal of different zoom size.
+                    # just retry it.
+                    pass
+            # End scroll and refresh
+
+            curses.halfdelay(self.refresh_interval_secs * 10)
+            cmd = self.stdscr.getch()
+
+    def run_all_display(self):
+        # clear text from the previous screen
+        if self.current_screen == FS_TOP_FS_SELECTED_APP:
+            self.header.erase()
+
+        self.current_screen = FS_TOP_ALL_FS_APP
+        screen_title = "All Filesystem Info"
+        curses.init_pair(2, curses.COLOR_CYAN, -1)
+
+        top, left = 0, 0  # where to place pad
+        vscrollOffset, hscrollOffset = 0, 0  # scroll offsets
+
+        # calculate the initial viewport height and width
+        windowsize = self.stdscr.getmaxyx()
+        self.viewportHeight, self.viewportWidth = windowsize[0] - 1, windowsize[1] - 1
+
+        # create header subpad
+        self.header_height = 7
+        self.header = self.fstop_pad.subwin(self.header_height, self.viewportWidth, 0, 0)
+
+        # create fsstats subpad
+        fsstats_begin_y = self.header_height
+        fsstats_height = self.PAD_HEIGHT - self.header_height
+        self.fsstats = self.fstop_pad.subwin(fsstats_height, self.PAD_WIDTH, fsstats_begin_y, 0)
+
+        curses.halfdelay(1)
+        cmd = self.stdscr.getch()
+        while not self.exit_ev.is_set():
+            if cmd in [ord('m'), ord('s'), ord('l'), ord('r'), ord('q')]:
+                if self.set_option(cmd):
+                    self.exit_ev.set()
+
+            # header display
+            global fs_list, current_states
+            fs_list = self.get_fs_names()
+            current_states["last_fs"] = fs_list
             stats_json = self.perf_stats_query()
             stats_json = self.perf_stats_query()
-            try:
-                if self.refresh_header(stats_json):
-                    x_coord_map = self.refresh_top_line_and_build_coord()
-                    self.refresh_main_window(x_coord_map, stats_json)
-                self.exit_ev.wait(timeout=self.refresh_interval_secs)
-            except curses.error:
-                # this may happen when addstr the terminal window
-                # size changed, just retry it
-                pass
+            vscrollEnd = 0
+            if not fs_list:
+                help = "INFO: No filesystem is available [Press 'q' to quit]"
+                self.header.erase()  # erase previous text
+                self.fsstats.erase()
+                self.create_header(stats_json, help, screen_title, 2)
+            else:
+                self.tablehead_y = 0
+                num_client = 0
+                help = "COMMANDS: m - select a filesystem | s - sort menu |"\
+                    " l - limit number of clients | r - reset to default | q - quit"
+                self.fsstats.erase()  # erase previous text
+                for index, fs in enumerate(fs_list):
+                    #  Get the vscrollEnd in advance
+                    client_metadata = stats_json[GLOBAL_METRICS_KEY].get(fs, {})
+                    if current_states['limit'] is not None and \
+                       int(current_states['limit']) < len(client_metadata):
+                        num_client = int(current_states['limit'])
+                    else:
+                        num_client = len(client_metadata)
+                    vscrollEnd += num_client
+                    if self.create_header(stats_json, help, screen_title, 2):
+                        if not index:  # do it only for the first fs
+                            x_coord_map = self.create_top_line_and_build_coord()
+                        self.create_clients(x_coord_map, stats_json, fs)
+
+            # scroll and refresh
+            if cmd == curses.KEY_DOWN:
+                if (vscrollEnd - vscrollOffset) > 1:
+                    vscrollOffset += 1
+                else:
+                    vscrollOffset = vscrollEnd
+            elif cmd == curses.KEY_UP:
+                if vscrollOffset > 0:
+                    vscrollOffset -= 1
+            elif cmd == curses.KEY_NPAGE:
+                if (vscrollEnd - vscrollOffset) / 20 > 1:
+                    vscrollOffset += 20
+                else:
+                    vscrollOffset = vscrollEnd
+            elif cmd == curses.KEY_PPAGE:
+                if vscrollOffset / 20 >= 1:
+                    vscrollOffset -= 20
+                else:
+                    vscrollOffset = 0
+            elif cmd == curses.KEY_RIGHT:
+                if hscrollOffset < self.PAD_WIDTH - self.viewportWidth - 1:
+                    hscrollOffset += 1
+            elif cmd == curses.KEY_LEFT:
+                if hscrollOffset > 0:
+                    hscrollOffset -= 1
+            elif cmd == curses.KEY_HOME:
+                hscrollOffset = 0
+            elif cmd == curses.KEY_END:
+                hscrollOffset = self.PAD_WIDTH - self.viewportWidth - 1
+            elif cmd == curses.KEY_RESIZE:
+                # terminal resize event. Update the viewport dimensions
+                windowsize = self.stdscr.getmaxyx()
+                self.viewportHeight, self.viewportWidth = windowsize[0] - 1, windowsize[1] - 1
+            if cmd:
+                try:
+                    # refresh the viewport for the header portion
+                    if cmd not in [curses.KEY_DOWN,
+                                   curses.KEY_UP,
+                                   curses.KEY_NPAGE,
+                                   curses.KEY_PPAGE,
+                                   curses.KEY_RIGHT,
+                                   curses.KEY_LEFT]:
+                        self.fstop_pad.refresh(0, 0,
+                                               top, left,
+                                               top + self.header_height, left + self.viewportWidth)
+                    # refresh the viewport for the current table header portion in the fsstats pad
+                    if cmd not in [curses.KEY_DOWN,
+                                   curses.KEY_UP,
+                                   curses.KEY_NPAGE,
+                                   curses.KEY_PPAGE]:
+                        self.fstop_pad.refresh(fsstats_begin_y, hscrollOffset,
+                                               top + fsstats_begin_y, left,
+                                               7, left + self.viewportWidth)
+                    # refresh the viewport for the current client records portion in the fsstats pad
+                    self.fstop_pad.refresh(fsstats_begin_y + 1 + vscrollOffset, hscrollOffset,
+                                           top + fsstats_begin_y + 2, left,
+                                           top + self.viewportHeight, left + self.viewportWidth)
+                except curses.error:
+                    # This happens when the user switches to a terminal of different zoom size.
+                    # just retry it.
+                    pass
+            # End scroll and refresh
+
+            curses.halfdelay(self.refresh_interval_secs * 10)
+            cmd = self.stdscr.getch()
+# End class FSTop
 
 
 if __name__ == '__main__':
 
 
 if __name__ == '__main__':
@@ -590,7 +1085,8 @@ if __name__ == '__main__':
         value = float(x)
         if value < MIN_REFRESH_INTERVAL:
             raise argparse.ArgumentTypeError(
         value = float(x)
         if value < MIN_REFRESH_INTERVAL:
             raise argparse.ArgumentTypeError(
-                f'Refresh interval should be greater than or equal to {MIN_REFRESH_INTERVAL}')
+                'Refresh interval should be greater than or equal to'
+                f' {MIN_REFRESH_INTERVAL}')
         return value
 
     parser = argparse.ArgumentParser(description='Ceph Filesystem top utility')
         return value
 
     parser = argparse.ArgumentParser(description='Ceph Filesystem top utility')
@@ -602,8 +1098,10 @@ if __name__ == '__main__':
                         help='Path to cluster configuration file')
     parser.add_argument('--selftest', dest='selftest', action='store_true',
                         help='Run in selftest mode')
                         help='Path to cluster configuration file')
     parser.add_argument('--selftest', dest='selftest', action='store_true',
                         help='Run in selftest mode')
-    parser.add_argument('-d', '--delay', nargs='?', default=DEFAULT_REFRESH_INTERVAL,
-                        type=float_greater_than, help='Interval to refresh data '
+    parser.add_argument('-d', '--delay', nargs='?',
+                        default=DEFAULT_REFRESH_INTERVAL,
+                        type=float_greater_than,
+                        help='Refresh interval in seconds '
                         f'(default: {DEFAULT_REFRESH_INTERVAL})')
 
     args = parser.parse_args()
                         f'(default: {DEFAULT_REFRESH_INTERVAL})')
 
     args = parser.parse_args()
index a0bf75d1e29778a207e48d9c0fd700dca43e629b..7ea798e6bec2bd130cc0711f8b728c2e8e97b26c 100644 (file)
@@ -81,6 +81,7 @@ public:
   }
 
   int call(std::string_view command, const cmdmap_t& cmdmap,
   }
 
   int call(std::string_view command, const cmdmap_t& cmdmap,
+           const bufferlist&,
            Formatter *f, std::ostream &errss, bufferlist &out) override {
     auto p = commands.at(std::string(command));
     return p->call(f);
            Formatter *f, std::ostream &errss, bufferlist &out) override {
     auto p = commands.at(std::string(command));
     return p->call(f);
index 064f2bd4d4f935b1dc59086b7b8f0e8b29d79a53..66a141f8578d92dea954284996b381d9ee2da054 100644 (file)
@@ -129,6 +129,7 @@ public:
   }
 
   int call(std::string_view command, const cmdmap_t& cmdmap,
   }
 
   int call(std::string_view command, const cmdmap_t& cmdmap,
+           const bufferlist&,
            Formatter *f, std::ostream &errss, bufferlist &out) override {
     auto p = commands.at(std::string(command));
     return p->call(f);
            Formatter *f, std::ostream &errss, bufferlist &out) override {
     auto p = commands.at(std::string(command));
     return p->call(f);
index a7a63d1c45ab31bd2e57502eb7f7a1df2801fa2d..acfc9a3c6f76824eb3484319e9f19af5e4bed860 100644 (file)
@@ -1289,7 +1289,7 @@ int main(int argc, const char **argv)
        tester.get_output_utilization())
       tester.set_output_statistics(true);
 
        tester.get_output_utilization())
       tester.set_output_statistics(true);
 
-    int r = tester.test();
+    int r = tester.test(cct->get());
     if (r < 0)
       return EXIT_FAILURE;
   }
     if (r < 0)
       return EXIT_FAILURE;
   }
index a47b45a8be1be527162980856862272ca8466b81..18e5e20d7ff9da50e6aff14d0255358837789eae 100644 (file)
@@ -273,6 +273,57 @@ int get_pool_image_id(const po::variables_map &vm,
   return 0;
 }
 
   return 0;
 }
 
+int get_image_or_snap_spec(const po::variables_map &vm, std::string *spec) {
+  size_t arg_index = 0;
+  std::string pool_name;
+  std::string nspace_name;
+  std::string image_name;
+  std::string snap_name;
+  int r = get_pool_image_snapshot_names(
+    vm, at::ARGUMENT_MODIFIER_NONE, &arg_index, &pool_name, &nspace_name,
+    &image_name, &snap_name, true, SNAPSHOT_PRESENCE_PERMITTED,
+    SPEC_VALIDATION_NONE);
+  if (r < 0) {
+    return r;
+  }
+
+  if (pool_name.empty()) {
+    // connect to the cluster to get the default pool
+    librados::Rados rados;
+    r = init_rados(&rados);
+    if (r < 0) {
+      return r;
+    }
+
+    normalize_pool_name(&pool_name);
+  }
+
+  spec->append(pool_name);
+  spec->append("/");
+  if (!nspace_name.empty()) {
+    spec->append(nspace_name);
+    spec->append("/");
+  }
+  spec->append(image_name);
+  if (!snap_name.empty()) {
+    spec->append("@");
+    spec->append(snap_name);
+  }
+
+  return 0;
+}
+
+void append_options_as_args(const std::vector<std::string> &options,
+                            std::vector<std::string> *args) {
+  for (auto &opts : options) {
+    std::vector<std::string> args_;
+    boost::split(args_, opts, boost::is_any_of(","));
+    for (auto &o : args_) {
+      args->push_back("--" + o);
+    }
+  }
+}
+
 int get_pool_image_snapshot_names(const po::variables_map &vm,
                                   at::ArgumentModifier mod,
                                   size_t *spec_arg_index,
 int get_pool_image_snapshot_names(const po::variables_map &vm,
                                   at::ArgumentModifier mod,
                                   size_t *spec_arg_index,
index 3ed5bfddbcb6a4e58e14233f68445ee8945f54c6..bd00765f8ed7511600f31fde492f7e5dbbe80eac 100644 (file)
@@ -104,6 +104,12 @@ std::string get_positional_argument(
 void normalize_pool_name(std::string* pool_name);
 std::string get_default_pool_name();
 
 void normalize_pool_name(std::string* pool_name);
 std::string get_default_pool_name();
 
+int get_image_or_snap_spec(const boost::program_options::variables_map &vm,
+                           std::string *spec);
+
+void append_options_as_args(const std::vector<std::string> &options,
+                            std::vector<std::string> *args);
+
 int get_pool_and_namespace_names(
     const boost::program_options::variables_map &vm, bool validate_pool_name,
     std::string* pool_name, std::string* namespace_name, size_t *arg_index);
 int get_pool_and_namespace_names(
     const boost::program_options::variables_map &vm, bool validate_pool_name,
     std::string* pool_name, std::string* namespace_name, size_t *arg_index);
index bfe60c273df79728b63de6fcd9d59cb05c2fa306..878081438377c651dee24442b17ab7ac4d433eb3 100644 (file)
@@ -181,6 +181,7 @@ void get_map_arguments(po::options_description *positional,
     ("exclusive", po::bool_switch(), "disable automatic exclusive lock transitions")
     ("quiesce", po::bool_switch(), "use quiesce hooks")
     ("quiesce-hook", po::value<std::string>(), "quiesce hook path");
     ("exclusive", po::bool_switch(), "disable automatic exclusive lock transitions")
     ("quiesce", po::bool_switch(), "use quiesce hooks")
     ("quiesce-hook", po::value<std::string>(), "quiesce hook path");
+  at::add_snap_id_option(options);
   add_device_specific_options(options);
 }
 
   add_device_specific_options(options);
 }
 
@@ -195,10 +196,12 @@ void get_unmap_arguments(po::options_description *positional,
   positional->add_options()
     ("image-or-snap-or-device-spec",
      "image, snapshot, or device specification\n"
   positional->add_options()
     ("image-or-snap-or-device-spec",
      "image, snapshot, or device specification\n"
-     "[<pool-name>/]<image-name>[@<snap-name>] or <device-path>");
+     "[<pool-name>/[<namespace>/]]<image-name>[@<snap-name>] or <device-path>");
   at::add_pool_option(options, at::ARGUMENT_MODIFIER_NONE);
   at::add_pool_option(options, at::ARGUMENT_MODIFIER_NONE);
+  at::add_namespace_option(options, at::ARGUMENT_MODIFIER_NONE);
   at::add_image_option(options, at::ARGUMENT_MODIFIER_NONE);
   at::add_snap_option(options, at::ARGUMENT_MODIFIER_NONE);
   at::add_image_option(options, at::ARGUMENT_MODIFIER_NONE);
   at::add_snap_option(options, at::ARGUMENT_MODIFIER_NONE);
+  at::add_snap_id_option(options);
   add_device_specific_options(options);
 }
 
   add_device_specific_options(options);
 }
 
@@ -221,6 +224,7 @@ void get_attach_arguments(po::options_description *positional,
     ("exclusive", po::bool_switch(), "disable automatic exclusive lock transitions")
     ("quiesce", po::bool_switch(), "use quiesce hooks")
     ("quiesce-hook", po::value<std::string>(), "quiesce hook path");
     ("exclusive", po::bool_switch(), "disable automatic exclusive lock transitions")
     ("quiesce", po::bool_switch(), "use quiesce hooks")
     ("quiesce-hook", po::value<std::string>(), "quiesce hook path");
+  at::add_snap_id_option(options);
   add_device_specific_options(options);
 }
 
   add_device_specific_options(options);
 }
 
@@ -235,10 +239,12 @@ void get_detach_arguments(po::options_description *positional,
   positional->add_options()
     ("image-or-snap-or-device-spec",
      "image, snapshot, or device specification\n"
   positional->add_options()
     ("image-or-snap-or-device-spec",
      "image, snapshot, or device specification\n"
-     "[<pool-name>/]<image-name>[@<snap-name>] or <device-path>");
+     "[<pool-name>/[<namespace>/]]<image-name>[@<snap-name>] or <device-path>");
   at::add_pool_option(options, at::ARGUMENT_MODIFIER_NONE);
   at::add_pool_option(options, at::ARGUMENT_MODIFIER_NONE);
+  at::add_namespace_option(options, at::ARGUMENT_MODIFIER_NONE);
   at::add_image_option(options, at::ARGUMENT_MODIFIER_NONE);
   at::add_snap_option(options, at::ARGUMENT_MODIFIER_NONE);
   at::add_image_option(options, at::ARGUMENT_MODIFIER_NONE);
   at::add_snap_option(options, at::ARGUMENT_MODIFIER_NONE);
+  at::add_snap_id_option(options);
   add_device_specific_options(options);
 }
 
   add_device_specific_options(options);
 }
 
index 24699b43ff8d7b7f523a4e590d1ad62196617c52..11782d70ada88997794ff60b06011b9d1449acdd 100644 (file)
@@ -51,59 +51,6 @@ static int call_ggate_cmd(const po::variables_map &vm,
 
   return 0;
 }
 
   return 0;
 }
-
-int get_image_or_snap_spec(const po::variables_map &vm, std::string *spec) {
-  size_t arg_index = 0;
-  std::string pool_name;
-  std::string nspace_name;
-  std::string image_name;
-  std::string snap_name;
-  int r = utils::get_pool_image_snapshot_names(
-    vm, at::ARGUMENT_MODIFIER_NONE, &arg_index, &pool_name, &nspace_name,
-    &image_name, &snap_name, true,
-    utils::SNAPSHOT_PRESENCE_PERMITTED, utils::SPEC_VALIDATION_NONE);
-  if (r < 0) {
-    return r;
-  }
-
-  if (pool_name.empty()) {
-    // connect to the cluster to get the default pool
-    librados::Rados rados;
-    r = utils::init_rados(&rados);
-    if (r < 0) {
-      return r;
-    }
-
-    utils::normalize_pool_name(&pool_name);
-  }
-
-  spec->append(pool_name);
-  spec->append("/");
-  if (!nspace_name.empty()) {
-    spec->append(nspace_name);
-    spec->append("/");
-  }
-  spec->append(image_name);
-  if (!snap_name.empty()) {
-    spec->append("@");
-    spec->append(snap_name);
-  }
-
-  return 0;
-}
-
-int parse_options(const std::vector<std::string> &options,
-                  std::vector<std::string> *args) {
-  for (auto &opts : options) {
-    std::vector<std::string> args_;
-    boost::split(args_, opts, boost::is_any_of(","));
-    for (auto &o : args_) {
-      args->push_back("--" + o);
-    }
-  }
-
-  return 0;
-}
 #endif
 
 int execute_list(const po::variables_map &vm,
 #endif
 
 int execute_list(const po::variables_map &vm,
@@ -138,7 +85,7 @@ int execute_map(const po::variables_map &vm,
 
   args.push_back("map");
   std::string img;
 
   args.push_back("map");
   std::string img;
-  int r = get_image_or_snap_spec(vm, &img);
+  int r = utils::get_image_or_snap_spec(vm, &img);
   if (r < 0) {
     return r;
   }
   if (r < 0) {
     return r;
   }
@@ -161,10 +108,8 @@ int execute_map(const po::variables_map &vm,
   }
 
   if (vm.count("options")) {
   }
 
   if (vm.count("options")) {
-    r = parse_options(vm["options"].as<std::vector<std::string>>(), &args);
-    if (r < 0) {
-      return r;
-    }
+    utils::append_options_as_args(vm["options"].as<std::vector<std::string>>(),
+                                  &args);
   }
 
   return call_ggate_cmd(vm, args, ceph_global_init_args);
   }
 
   return call_ggate_cmd(vm, args, ceph_global_init_args);
@@ -184,7 +129,7 @@ int execute_unmap(const po::variables_map &vm,
 
   std::string image_name;
   if (device_name.empty()) {
 
   std::string image_name;
   if (device_name.empty()) {
-    int r = get_image_or_snap_spec(vm, &image_name);
+    int r = utils::get_image_or_snap_spec(vm, &image_name);
     if (r < 0) {
       return r;
     }
     if (r < 0) {
       return r;
     }
@@ -202,10 +147,8 @@ int execute_unmap(const po::variables_map &vm,
   args.push_back(device_name.empty() ? image_name : device_name);
 
   if (vm.count("options")) {
   args.push_back(device_name.empty() ? image_name : device_name);
 
   if (vm.count("options")) {
-    int r = parse_options(vm["options"].as<std::vector<std::string>>(), &args);
-    if (r < 0) {
-      return r;
-    }
+    utils::append_options_as_args(vm["options"].as<std::vector<std::string>>(),
+                                  &args);
   }
 
   return call_ggate_cmd(vm, args, ceph_global_init_args);
   }
 
   return call_ggate_cmd(vm, args, ceph_global_init_args);
index 68345f43dd6c5228ea635928aae2002a701d489a..dd5ef3290cfd6300d660e19faaf48953dc8f0d6e 100644 (file)
@@ -60,61 +60,6 @@ static int call_nbd_cmd(const po::variables_map &vm,
   #endif
 }
 
   #endif
 }
 
-#if !defined(__FreeBSD__) && !defined(_WIN32)
-int get_image_or_snap_spec(const po::variables_map &vm, std::string *spec) {
-  size_t arg_index = 0;
-  std::string pool_name;
-  std::string nspace_name;
-  std::string image_name;
-  std::string snap_name;
-  int r = utils::get_pool_image_snapshot_names(
-    vm, at::ARGUMENT_MODIFIER_NONE, &arg_index, &pool_name, &nspace_name,
-    &image_name, &snap_name, true, utils::SNAPSHOT_PRESENCE_PERMITTED,
-    utils::SPEC_VALIDATION_NONE);
-  if (r < 0) {
-    return r;
-  }
-
-  if (pool_name.empty()) {
-    // connect to the cluster to get the default pool
-    librados::Rados rados;
-    r = utils::init_rados(&rados);
-    if (r < 0) {
-      return r;
-    }
-
-    utils::normalize_pool_name(&pool_name);
-  }
-
-  spec->append(pool_name);
-  spec->append("/");
-  if (!nspace_name.empty()) {
-    spec->append(nspace_name);
-    spec->append("/");
-  }
-  spec->append(image_name);
-  if (!snap_name.empty()) {
-    spec->append("@");
-    spec->append(snap_name);
-  }
-
-  return 0;
-}
-
-int parse_options(const std::vector<std::string> &options,
-                  std::vector<std::string> *args) {
-  for (auto &opts : options) {
-    std::vector<std::string> args_;
-    boost::split(args_, opts, boost::is_any_of(","));
-    for (auto &o : args_) {
-      args->push_back("--" + o);
-    }
-  }
-
-  return 0;
-}
-#endif
-
 int execute_list(const po::variables_map &vm,
                  const std::vector<std::string> &ceph_global_init_args) {
 #if defined(__FreeBSD__) || defined(_WIN32)
 int execute_list(const po::variables_map &vm,
                  const std::vector<std::string> &ceph_global_init_args) {
 #if defined(__FreeBSD__) || defined(_WIN32)
@@ -148,7 +93,7 @@ int execute_attach(const po::variables_map &vm,
 
   args.push_back("attach");
   std::string img;
 
   args.push_back("attach");
   std::string img;
-  int r = get_image_or_snap_spec(vm, &img);
+  int r = utils::get_image_or_snap_spec(vm, &img);
   if (r < 0) {
     return r;
   }
   if (r < 0) {
     return r;
   }
@@ -177,6 +122,11 @@ int execute_attach(const po::variables_map &vm,
     return -EINVAL;
   }
 
     return -EINVAL;
   }
 
+  if (vm.count(at::SNAPSHOT_ID)) {
+    args.push_back("--snap-id");
+    args.push_back(std::to_string(vm[at::SNAPSHOT_ID].as<uint64_t>()));
+  }
+
   if (vm["quiesce"].as<bool>()) {
     args.push_back("--quiesce");
   }
   if (vm["quiesce"].as<bool>()) {
     args.push_back("--quiesce");
   }
@@ -195,10 +145,8 @@ int execute_attach(const po::variables_map &vm,
   }
 
   if (vm.count("options")) {
   }
 
   if (vm.count("options")) {
-    r = parse_options(vm["options"].as<std::vector<std::string>>(), &args);
-    if (r < 0) {
-      return r;
-    }
+    utils::append_options_as_args(vm["options"].as<std::vector<std::string>>(),
+                                  &args);
   }
 
   return call_nbd_cmd(vm, args, ceph_global_init_args);
   }
 
   return call_nbd_cmd(vm, args, ceph_global_init_args);
@@ -216,30 +164,33 @@ int execute_detach(const po::variables_map &vm,
     device_name.clear();
   }
 
     device_name.clear();
   }
 
+  std::vector<std::string> args;
+
+  args.push_back("detach");
   std::string image_name;
   if (device_name.empty()) {
   std::string image_name;
   if (device_name.empty()) {
-    int r = get_image_or_snap_spec(vm, &image_name);
+    int r = utils::get_image_or_snap_spec(vm, &image_name);
     if (r < 0) {
       return r;
     }
     if (r < 0) {
       return r;
     }
-  }
 
 
-  if (device_name.empty() && image_name.empty()) {
-    std::cerr << "rbd: detach requires either image name or device path"
-              << std::endl;
-    return -EINVAL;
-  }
+    if (image_name.empty()) {
+      std::cerr << "rbd: detach requires either image name or device path"
+                << std::endl;
+      return -EINVAL;
+    }
 
 
-  std::vector<std::string> args;
+    if (vm.count(at::SNAPSHOT_ID)) {
+      args.push_back("--snap-id");
+      args.push_back(std::to_string(vm[at::SNAPSHOT_ID].as<uint64_t>()));
+    }
+  }
 
 
-  args.push_back("detach");
   args.push_back(device_name.empty() ? image_name : device_name);
 
   if (vm.count("options")) {
   args.push_back(device_name.empty() ? image_name : device_name);
 
   if (vm.count("options")) {
-    int r = parse_options(vm["options"].as<std::vector<std::string>>(), &args);
-    if (r < 0) {
-      return r;
-    }
+    utils::append_options_as_args(vm["options"].as<std::vector<std::string>>(),
+                                  &args);
   }
 
   return call_nbd_cmd(vm, args, ceph_global_init_args);
   }
 
   return call_nbd_cmd(vm, args, ceph_global_init_args);
@@ -256,7 +207,7 @@ int execute_map(const po::variables_map &vm,
 
   args.push_back("map");
   std::string img;
 
   args.push_back("map");
   std::string img;
-  int r = get_image_or_snap_spec(vm, &img);
+  int r = utils::get_image_or_snap_spec(vm, &img);
   if (r < 0) {
     return r;
   }
   if (r < 0) {
     return r;
   }
@@ -275,6 +226,11 @@ int execute_map(const po::variables_map &vm,
     args.push_back(vm["cookie"].as<std::string>());
   }
 
     args.push_back(vm["cookie"].as<std::string>());
   }
 
+  if (vm.count(at::SNAPSHOT_ID)) {
+    args.push_back("--snap-id");
+    args.push_back(std::to_string(vm[at::SNAPSHOT_ID].as<uint64_t>()));
+  }
+
   if (vm["read-only"].as<bool>()) {
     args.push_back("--read-only");
   }
   if (vm["read-only"].as<bool>()) {
     args.push_back("--read-only");
   }
@@ -289,10 +245,8 @@ int execute_map(const po::variables_map &vm,
   }
 
   if (vm.count("options")) {
   }
 
   if (vm.count("options")) {
-    r = parse_options(vm["options"].as<std::vector<std::string>>(), &args);
-    if (r < 0) {
-      return r;
-    }
+    utils::append_options_as_args(vm["options"].as<std::vector<std::string>>(),
+                                  &args);
   }
 
   return call_nbd_cmd(vm, args, ceph_global_init_args);
   }
 
   return call_nbd_cmd(vm, args, ceph_global_init_args);
@@ -310,30 +264,33 @@ int execute_unmap(const po::variables_map &vm,
     device_name.clear();
   }
 
     device_name.clear();
   }
 
+  std::vector<std::string> args;
+
+  args.push_back("unmap");
   std::string image_name;
   if (device_name.empty()) {
   std::string image_name;
   if (device_name.empty()) {
-    int r = get_image_or_snap_spec(vm, &image_name);
+    int r = utils::get_image_or_snap_spec(vm, &image_name);
     if (r < 0) {
       return r;
     }
     if (r < 0) {
       return r;
     }
-  }
 
 
-  if (device_name.empty() && image_name.empty()) {
-    std::cerr << "rbd: unmap requires either image name or device path"
-              << std::endl;
-    return -EINVAL;
-  }
+    if (image_name.empty()) {
+      std::cerr << "rbd: unmap requires either image name or device path"
+                << std::endl;
+      return -EINVAL;
+    }
 
 
-  std::vector<std::string> args;
+    if (vm.count(at::SNAPSHOT_ID)) {
+      args.push_back("--snap-id");
+      args.push_back(std::to_string(vm[at::SNAPSHOT_ID].as<uint64_t>()));
+    }
+  }
 
 
-  args.push_back("unmap");
   args.push_back(device_name.empty() ? image_name : device_name);
 
   if (vm.count("options")) {
   args.push_back(device_name.empty() ? image_name : device_name);
 
   if (vm.count("options")) {
-    int r = parse_options(vm["options"].as<std::vector<std::string>>(), &args);
-    if (r < 0) {
-      return r;
-    }
+    utils::append_options_as_args(vm["options"].as<std::vector<std::string>>(),
+                                  &args);
   }
 
   return call_nbd_cmd(vm, args, ceph_global_init_args);
   }
 
   return call_nbd_cmd(vm, args, ceph_global_init_args);
index ae40fe538e3ce65b298e13ac1fc0ff73e76c7b4c..85d2c7057bfab6db4ce404206eb3372c5a7bcf6d 100644 (file)
@@ -63,50 +63,6 @@ static int call_wnbd_cmd(const po::variables_map &vm,
 
   return 0;
 }
 
   return 0;
 }
-
-int get_image_or_snap_spec(const po::variables_map &vm, std::string *spec) {
-  size_t arg_index = 0;
-  std::string pool_name;
-  std::string nspace_name;
-  std::string image_name;
-  std::string snap_name;
-  int r = utils::get_pool_image_snapshot_names(
-    vm, at::ARGUMENT_MODIFIER_NONE, &arg_index, &pool_name, &nspace_name,
-    &image_name, &snap_name, true, utils::SNAPSHOT_PRESENCE_PERMITTED,
-    utils::SPEC_VALIDATION_NONE);
-  if (r < 0) {
-    return r;
-  }
-
-  if (!pool_name.empty()) {
-    spec->append(pool_name);
-    spec->append("/");
-  }
-  if (!nspace_name.empty()) {
-    spec->append(nspace_name);
-    spec->append("/");
-  }
-  spec->append(image_name);
-  if (!snap_name.empty()) {
-    spec->append("@");
-    spec->append(snap_name);
-  }
-
-  return 0;
-}
-
-int parse_options(const std::vector<std::string> &options,
-                  std::vector<std::string> *args) {
-  for (auto &opts : options) {
-    std::vector<std::string> args_;
-    boost::split(args_, opts, boost::is_any_of(","));
-    for (auto &o : args_) {
-      args->push_back("--" + o);
-    }
-  }
-
-  return 0;
-}
 #endif
 
 int execute_list(const po::variables_map &vm,
 #endif
 
 int execute_list(const po::variables_map &vm,
@@ -141,7 +97,7 @@ int execute_map(const po::variables_map &vm,
 
   args.push_back("map");
   std::string img;
 
   args.push_back("map");
   std::string img;
-  int r = get_image_or_snap_spec(vm, &img);
+  int r = utils::get_image_or_snap_spec(vm, &img);
   if (r < 0) {
     return r;
   }
   if (r < 0) {
     return r;
   }
@@ -156,10 +112,8 @@ int execute_map(const po::variables_map &vm,
   }
 
   if (vm.count("options")) {
   }
 
   if (vm.count("options")) {
-    r = parse_options(vm["options"].as<std::vector<std::string>>(), &args);
-    if (r < 0) {
-      return r;
-    }
+    utils::append_options_as_args(vm["options"].as<std::vector<std::string>>(),
+                                  &args);
   }
 
   return call_wnbd_cmd(vm, args, ceph_global_init_args);
   }
 
   return call_wnbd_cmd(vm, args, ceph_global_init_args);
@@ -172,32 +126,21 @@ int execute_unmap(const po::variables_map &vm,
   std::cerr << "rbd: wnbd is only supported on Windows" << std::endl;
   return -EOPNOTSUPP;
 #else
   std::cerr << "rbd: wnbd is only supported on Windows" << std::endl;
   return -EOPNOTSUPP;
 #else
-  std::string device_name = utils::get_positional_argument(vm, 0);
-
   std::string image_name;
   std::string image_name;
-  if (device_name.empty()) {
-    int r = get_image_or_snap_spec(vm, &image_name);
-    if (r < 0) {
-      return r;
-    }
-  }
 
 
-  if (device_name.empty() && image_name.empty()) {
-    std::cerr << "rbd: unmap requires either image name or device path"
-              << std::endl;
-    return -EINVAL;
+  int r = utils::get_image_or_snap_spec(vm, &image_name);
+  if (r < 0) {
+    return r;
   }
 
   std::vector<std::string> args;
 
   args.push_back("unmap");
   }
 
   std::vector<std::string> args;
 
   args.push_back("unmap");
-  args.push_back(device_name.empty() ? image_name : device_name);
+  args.push_back(image_name);
 
   if (vm.count("options")) {
 
   if (vm.count("options")) {
-    int r = parse_options(vm["options"].as<std::vector<std::string>>(), &args);
-    if (r < 0) {
-      return r;
-    }
+    utils::append_options_as_args(vm["options"].as<std::vector<std::string>>(),
+                                  &args);
   }
 
   return call_wnbd_cmd(vm, args, ceph_global_init_args);
   }
 
   return call_wnbd_cmd(vm, args, ceph_global_init_args);
index fcdd1baad44c3a2eabd9e31e4d531e4712c7c513..ba137e6fd71a0dddfd6d8198a88143dfb36b47c8 100644 (file)
@@ -105,6 +105,7 @@ public:
   }
 
   int call(std::string_view command, const cmdmap_t& cmdmap,
   }
 
   int call(std::string_view command, const cmdmap_t& cmdmap,
+          const bufferlist&,
           Formatter *f,
           std::ostream& errss,
           bufferlist& out) override {
           Formatter *f,
           std::ostream& errss,
           bufferlist& out) override {
index ee22b8d3475d59b9a037e23dcd0e331d1c349b23..0f909b206ddbd1b7c10f7ebc488e4396d0d3155b 100644 (file)
@@ -166,6 +166,7 @@ public:
   }
 
   int call(std::string_view command, const cmdmap_t& cmdmap,
   }
 
   int call(std::string_view command, const cmdmap_t& cmdmap,
+          const bufferlist&,
           Formatter *f,
           std::ostream& errss,
           bufferlist& out) override {
           Formatter *f,
           std::ostream& errss,
           bufferlist& out) override {
index a67afcf42dee685159475db95ca1e94541fc39eb..e87009281829c7b7693ab7ea1e8089c4c0ee7e11 100644 (file)
@@ -338,6 +338,7 @@ public:
   }
 
   int call(std::string_view command, const cmdmap_t& cmdmap,
   }
 
   int call(std::string_view command, const cmdmap_t& cmdmap,
+          const bufferlist&,
           Formatter *f,
           std::ostream& errss,
           bufferlist& out) override {
           Formatter *f,
           std::ostream& errss,
           bufferlist& out) override {
index de0d60241e3fb7085cb3bda5bb80bd6fb2d7dd0b..8a04219da06861487371000cc0dff01c31495dbe 100644 (file)
@@ -188,6 +188,7 @@ public:
   }
 
   int call(std::string_view command, const cmdmap_t& cmdmap,
   }
 
   int call(std::string_view command, const cmdmap_t& cmdmap,
+          const bufferlist&,
           Formatter *f,
           std::ostream& ss,
           bufferlist& out) override {
           Formatter *f,
           std::ostream& ss,
           bufferlist& out) override {
index 4a44a57bc223534ce51ffacb4f9c2c06b041bee0..ce803ed2203d78c762ce1ba0938dd5b70819b1b7 100644 (file)
@@ -277,9 +277,17 @@ bool Replayer<I>::get_replay_status(std::string* description,
       matching_remote_snap_it !=
         m_state_builder->remote_image_ctx->snap_info.end()) {
     root_obj["syncing_snapshot_timestamp"] = remote_snap_info->timestamp.sec();
       matching_remote_snap_it !=
         m_state_builder->remote_image_ctx->snap_info.end()) {
     root_obj["syncing_snapshot_timestamp"] = remote_snap_info->timestamp.sec();
-    root_obj["syncing_percent"] = static_cast<uint64_t>(
-        100 * m_local_mirror_snap_ns.last_copied_object_number /
-        static_cast<float>(std::max<uint64_t>(1U, m_local_object_count)));
+
+    if (m_local_object_count > 0) {
+      root_obj["syncing_percent"] =
+       100 * m_local_mirror_snap_ns.last_copied_object_number /
+       m_local_object_count;
+    } else {
+      // Set syncing_percent to 0 if m_local_object_count has
+      // not yet been set (last_copied_object_number may be > 0
+      // if the sync is being resumed).
+      root_obj["syncing_percent"] = 0;
+    }
   }
 
   m_bytes_per_second(0);
   }
 
   m_bytes_per_second(0);
@@ -290,6 +298,9 @@ bool Replayer<I>::get_replay_status(std::string* description,
     m_bytes_per_snapshot);
   root_obj["bytes_per_snapshot"] = round_to_two_places(bytes_per_snapshot);
 
     m_bytes_per_snapshot);
   root_obj["bytes_per_snapshot"] = round_to_two_places(bytes_per_snapshot);
 
+  root_obj["last_snapshot_sync_seconds"] = m_last_snapshot_sync_seconds;
+  root_obj["last_snapshot_bytes"] = m_last_snapshot_bytes;
+
   auto pending_bytes = bytes_per_snapshot * m_pending_snapshots;
   if (bytes_per_second > 0 && m_pending_snapshots > 0) {
     std::uint64_t seconds_until_synced = round_to_two_places(
   auto pending_bytes = bytes_per_snapshot * m_pending_snapshots;
   if (bytes_per_second > 0 && m_pending_snapshots > 0) {
     std::uint64_t seconds_until_synced = round_to_two_places(
@@ -1102,21 +1113,23 @@ void Replayer<I>::handle_copy_image(int r) {
 
   {
     std::unique_lock locker{m_lock};
 
   {
     std::unique_lock locker{m_lock};
+    m_last_snapshot_bytes = m_snapshot_bytes;
     m_bytes_per_snapshot(m_snapshot_bytes);
     m_bytes_per_snapshot(m_snapshot_bytes);
-    auto time = ceph_clock_now() - m_snapshot_replay_start;
+    utime_t duration = ceph_clock_now() - m_snapshot_replay_start;
+    m_last_snapshot_sync_seconds = duration.sec();
+
     if (g_snapshot_perf_counters) {
       g_snapshot_perf_counters->inc(l_rbd_mirror_snapshot_replay_bytes,
                                     m_snapshot_bytes);
       g_snapshot_perf_counters->inc(l_rbd_mirror_snapshot_replay_snapshots);
       g_snapshot_perf_counters->tinc(
     if (g_snapshot_perf_counters) {
       g_snapshot_perf_counters->inc(l_rbd_mirror_snapshot_replay_bytes,
                                     m_snapshot_bytes);
       g_snapshot_perf_counters->inc(l_rbd_mirror_snapshot_replay_snapshots);
       g_snapshot_perf_counters->tinc(
-        l_rbd_mirror_snapshot_replay_snapshots_time, time);
+        l_rbd_mirror_snapshot_replay_snapshots_time, duration);
     }
     if (m_perf_counters) {
       m_perf_counters->inc(l_rbd_mirror_snapshot_replay_bytes, m_snapshot_bytes);
       m_perf_counters->inc(l_rbd_mirror_snapshot_replay_snapshots);
     }
     if (m_perf_counters) {
       m_perf_counters->inc(l_rbd_mirror_snapshot_replay_bytes, m_snapshot_bytes);
       m_perf_counters->inc(l_rbd_mirror_snapshot_replay_snapshots);
-      m_perf_counters->tinc(l_rbd_mirror_snapshot_replay_snapshots_time, time);
+      m_perf_counters->tinc(l_rbd_mirror_snapshot_replay_snapshots_time, duration);
     }
     }
-    m_snapshot_bytes = 0;
   }
 
   apply_image_state();
   }
 
   apply_image_state();
index e3c4c20890287a471d0783fcf0c4cf45e0fb5d5e..17d45f6bc802d693f42835bd6a7a5745f02c7076 100644 (file)
@@ -238,8 +238,11 @@ private:
   DeepCopyHandler* m_deep_copy_handler = nullptr;
 
   TimeRollingMean m_bytes_per_second;
   DeepCopyHandler* m_deep_copy_handler = nullptr;
 
   TimeRollingMean m_bytes_per_second;
+  uint64_t m_last_snapshot_sync_seconds = 0;
 
   uint64_t m_snapshot_bytes = 0;
 
   uint64_t m_snapshot_bytes = 0;
+  uint64_t m_last_snapshot_bytes = 0;
+
   boost::accumulators::accumulator_set<
     uint64_t, boost::accumulators::stats<
       boost::accumulators::tag::rolling_mean>> m_bytes_per_snapshot{
   boost::accumulators::accumulator_set<
     uint64_t, boost::accumulators::stats<
       boost::accumulators::tag::rolling_mean>> m_bytes_per_snapshot{
index db964d389374f18414a9e3d75e788f8dc6bc972a..55ef9d1595d299105b799ec2070912e4e012ddd0 100644 (file)
@@ -125,6 +125,7 @@ struct Config {
   Command command = None;
   int pid = 0;
   std::string cookie;
   Command command = None;
   int pid = 0;
   std::string cookie;
+  uint64_t snapid = CEPH_NOSNAP;
 
   std::string image_spec() const {
     std::string spec = poolname + "/";
 
   std::string image_spec() const {
     std::string spec = poolname + "/";
@@ -168,6 +169,11 @@ static void usage()
             << "  --try-netlink                 Use the nbd netlink interface\n"
             << "  --show-cookie                 Show device cookie\n"
             << "  --cookie                      Specify device cookie\n"
             << "  --try-netlink                 Use the nbd netlink interface\n"
             << "  --show-cookie                 Show device cookie\n"
             << "  --cookie                      Specify device cookie\n"
+            << "  --snap-id <snap-id>           Specify snapshot by ID instead of by name\n"
+            << "\n"
+            << "Unmap and detach options:\n"
+            << "  --device <device path>        Specify nbd device path (/dev/nbd{num})\n"
+            << "  --snap-id <snap-id>           Specify snapshot by ID instead of by name\n"
             << "\n"
             << "List options:\n"
             << "  --format plain|json|xml Output format (default: plain)\n"
             << "\n"
             << "List options:\n"
             << "  --format plain|json|xml Output format (default: plain)\n"
@@ -1656,10 +1662,20 @@ static int do_map(int argc, const char *argv[], Config *cfg, bool reconnect)
     }
   }
 
     }
   }
 
-  if (!cfg->snapname.empty()) {
+  if (cfg->snapid != CEPH_NOSNAP) {
+    r = image.snap_set_by_id(cfg->snapid);
+    if (r < 0) {
+      cerr << "rbd-nbd: failed to set snap id: " << cpp_strerror(r)
+           << std::endl;
+      goto close_fd;
+    }
+  } else if (!cfg->snapname.empty()) {
     r = image.snap_set(cfg->snapname.c_str());
     r = image.snap_set(cfg->snapname.c_str());
-    if (r < 0)
+    if (r < 0) {
+      cerr << "rbd-nbd: failed to set snap name: " << cpp_strerror(r)
+           << std::endl;
       goto close_fd;
       goto close_fd;
+    }
   }
 
   if (cfg->encryption_format.has_value()) {
   }
 
   if (cfg->encryption_format.has_value()) {
@@ -1944,23 +1960,23 @@ static int do_list_mapped_devices(const std::string &format, bool pretty_format)
   Config cfg;
   NBDListIterator it;
   while (it.get(&cfg)) {
   Config cfg;
   NBDListIterator it;
   while (it.get(&cfg)) {
+    std::string snap = (cfg.snapid != CEPH_NOSNAP ?
+        "@" + std::to_string(cfg.snapid) : cfg.snapname);
     if (f) {
       f->open_object_section("device");
       f->dump_int("id", cfg.pid);
       f->dump_string("pool", cfg.poolname);
       f->dump_string("namespace", cfg.nsname);
       f->dump_string("image", cfg.imgname);
     if (f) {
       f->open_object_section("device");
       f->dump_int("id", cfg.pid);
       f->dump_string("pool", cfg.poolname);
       f->dump_string("namespace", cfg.nsname);
       f->dump_string("image", cfg.imgname);
-      f->dump_string("snap", cfg.snapname);
+      f->dump_string("snap", snap);
       f->dump_string("device", cfg.devpath);
       f->dump_string("cookie", cfg.cookie);
       f->close_section();
     } else {
       should_print = true;
       f->dump_string("device", cfg.devpath);
       f->dump_string("cookie", cfg.cookie);
       f->close_section();
     } else {
       should_print = true;
-      if (cfg.snapname.empty()) {
-        cfg.snapname = "-";
-      }
       tbl << cfg.pid << cfg.poolname << cfg.nsname << cfg.imgname
       tbl << cfg.pid << cfg.poolname << cfg.nsname << cfg.imgname
-          << cfg.snapname << cfg.devpath << cfg.cookie << TextTable::endrow;
+          << (snap.empty() ? "-" : snap) << cfg.devpath << cfg.cookie
+         << TextTable::endrow;
     }
   }
 
     }
   }
 
@@ -1981,7 +1997,8 @@ static bool find_mapped_dev_by_spec(Config *cfg, int skip_pid=-1) {
     if (c.pid != skip_pid &&
         c.poolname == cfg->poolname && c.nsname == cfg->nsname &&
         c.imgname == cfg->imgname && c.snapname == cfg->snapname &&
     if (c.pid != skip_pid &&
         c.poolname == cfg->poolname && c.nsname == cfg->nsname &&
         c.imgname == cfg->imgname && c.snapname == cfg->snapname &&
-        (cfg->devpath.empty() || c.devpath == cfg->devpath)) {
+        (cfg->devpath.empty() || c.devpath == cfg->devpath) &&
+        c.snapid == cfg->snapid) {
       *cfg = c;
       return true;
     }
       *cfg = c;
       return true;
     }
@@ -2024,6 +2041,7 @@ static int parse_args(vector<const char*>& args, std::ostream *err_msg,
   std::vector<const char*>::iterator i;
   std::ostringstream err;
   std::string arg_value;
   std::vector<const char*>::iterator i;
   std::ostringstream err;
   std::string arg_value;
+  long long snapid;
 
   for (i = args.begin(); i != args.end(); ) {
     if (ceph_argparse_flag(args, i, "-h", "--help", (char*)NULL)) {
 
   for (i = args.begin(); i != args.end(); ) {
     if (ceph_argparse_flag(args, i, "-h", "--help", (char*)NULL)) {
@@ -2100,6 +2118,17 @@ static int parse_args(vector<const char*>& args, std::ostream *err_msg,
     } else if (ceph_argparse_flag(args, i, "--show-cookie", (char *)NULL)) {
       cfg->show_cookie = true;
     } else if (ceph_argparse_witharg(args, i, &cfg->cookie, "--cookie", (char *)NULL)) {
     } else if (ceph_argparse_flag(args, i, "--show-cookie", (char *)NULL)) {
       cfg->show_cookie = true;
     } else if (ceph_argparse_witharg(args, i, &cfg->cookie, "--cookie", (char *)NULL)) {
+    } else if (ceph_argparse_witharg(args, i, &snapid, err,
+                                     "--snap-id", (char *)NULL)) {
+      if (!err.str().empty()) {
+        *err_msg << "rbd-nbd: " << err.str();
+        return -EINVAL;
+      }
+      if (snapid < 0) {
+        *err_msg << "rbd-nbd: Invalid argument for snap-id!";
+        return -EINVAL;
+      }
+      cfg->snapid = snapid;
     } else if (ceph_argparse_witharg(args, i, &arg_value,
                                      "--encryption-format", (char *)NULL)) {
       if (arg_value == "luks1") {
     } else if (ceph_argparse_witharg(args, i, &arg_value,
                                      "--encryption-format", (char *)NULL)) {
       if (arg_value == "luks1") {
@@ -2198,6 +2227,11 @@ static int parse_args(vector<const char*>& args, std::ostream *err_msg,
       break;
   }
 
       break;
   }
 
+  if (cfg->snapid != CEPH_NOSNAP && !cfg->snapname.empty()) {
+    *err_msg << "rbd-nbd: use either snapname or snapid, not both";
+    return -EINVAL;
+  }
+
   if (args.begin() != args.end()) {
     *err_msg << "rbd-nbd: unknown args: " << *args.begin();
     return -EINVAL;
   if (args.begin() != args.end()) {
     *err_msg << "rbd-nbd: unknown args: " << *args.begin();
     return -EINVAL;
index ecfa47240f2db44186e0d24538f704b5095eaa35..0d13b6297aa35da6cea222f77a6ed0ae24a2d408 100644 (file)
@@ -62,15 +62,18 @@ int WnbdHandler::wait()
   return err;
 }
 
   return err;
 }
 
-int WnbdAdminHook::call (std::string_view command, const cmdmap_t& cmdmap,
-     Formatter *f,
-     std::ostream& errss,
-     bufferlist& out) {
-    if (command == "wnbd stats") {
-      return m_handler->dump_stats(f);
-    }
-    return -ENOSYS;
+int WnbdAdminHook::call (
+  std::string_view command, const cmdmap_t& cmdmap,
+  const bufferlist&,
+  Formatter *f,
+  std::ostream& errss,
+  bufferlist& out)
+{
+  if (command == "wnbd stats") {
+    return m_handler->dump_stats(f);
   }
   }
+  return -ENOSYS;
+}
 
 int WnbdHandler::dump_stats(Formatter *f)
 {
 
 int WnbdHandler::dump_stats(Formatter *f)
 {
index 9a8217745ff5c183fdaeb07fd55c0f1198335afa..78eaa7cdf4a078f41d1f1fa382bca4c2883d0e7a 100644 (file)
@@ -56,7 +56,8 @@ public:
   }
 
   int call(std::string_view command, const cmdmap_t& cmdmap,
   }
 
   int call(std::string_view command, const cmdmap_t& cmdmap,
-     Formatter *f, std::ostream& errss, bufferlist& out) override;
+          const bufferlist&,
+          Formatter *f, std::ostream& errss, bufferlist& out) override;
 };
 
 
 };